diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000000000000000000000000000000000000..0e8b84b3af9f001f3119e6b746b69d8d50e329ae --- /dev/null +++ b/.clang-format @@ -0,0 +1,88 @@ +Language: Cpp +AccessModifierOffset: -2 +AlignAfterOpenBracket: Align +AlignConsecutiveAssignments: false +AlignConsecutiveDeclarations: false +AlignConsecutiveMacros: true +AlignEscapedNewlines: Right +AlignOperands: true +AlignTrailingComments: true +AllowAllParametersOfDeclarationOnNextLine: false +AllowShortBlocksOnASingleLine: false +AllowShortCaseLabelsOnASingleLine: false +AllowShortFunctionsOnASingleLine: All +AllowShortIfStatementsOnASingleLine: Never # "false" for clang-format version < 9, "Never" for newer versions +AllowShortLoopsOnASingleLine: false +AlwaysBreakAfterDefinitionReturnType: None +AlwaysBreakAfterReturnType: None +AlwaysBreakBeforeMultilineStrings: false +BinPackArguments: true +BinPackParameters: false +BreakBeforeBinaryOperators: None +BreakBeforeBraces: Allman +BreakBeforeInheritanceComma: false +BreakBeforeTernaryOperators: true +BreakConstructorInitializersBeforeComma: false +BreakConstructorInitializers: BeforeColon +BreakAfterJavaFieldAnnotations: false +BreakStringLiterals: true +ColumnLimit: 0 +CommentPragmas: '^ IWYU pragma:' +CompactNamespaces: false +ConstructorInitializerAllOnOneLineOrOnePerLine: false +ConstructorInitializerIndentWidth: 4 +ContinuationIndentWidth: 4 +Cpp11BracedListStyle: false # "true" would drop newline before closing curly bracket in array definitions, see lib_com/rom_com.c +DerivePointerAlignment: false +DisableFormat: false +ExperimentalAutoDetectBinPacking: false +FixNamespaceComments: true +ForEachMacros: + - foreach + - Q_FOREACH + - BOOST_FOREACH +IncludeBlocks: Preserve +IncludeCategories: + - Regex: '^"options.h' + Priority: -2 + - Regex: '^"debug.h' + Priority: -1 + - Regex: '.*' + Priority: 1 +IncludeIsMainRegex: '(Test)?$' +IndentCaseLabels: true +IndentPPDirectives: None # not supported in clang-format version < 9 +IndentWidth: 4 +IndentWrappedFunctionNames: false +JavaScriptQuotes: Leave +JavaScriptWrapImports: true +KeepEmptyLinesAtTheStartOfBlocks: true +MacroBlockBegin: '' +MacroBlockEnd: '' +MaxEmptyLinesToKeep: 2 +NamespaceIndentation: None +PenaltyBreakAssignment: 2 +PenaltyBreakBeforeFirstCallParameter: 19 +PenaltyBreakComment: 300 +PenaltyBreakFirstLessLess: 120 +PenaltyBreakString: 1000 +PenaltyExcessCharacter: 1000000 +PenaltyReturnTypeOnItsOwnLine: 60 +PointerAlignment: Right +ReflowComments: true +SortIncludes: false +SortUsingDeclarations: true +SpaceAfterCStyleCast: true +SpaceAfterTemplateKeyword: true +SpaceBeforeAssignmentOperators: true +SpaceBeforeParens: ControlStatements # should be "Never" for current code, but "ControlStatements" seems cleaner +SpaceInEmptyParentheses: false +SpacesBeforeTrailingComments: 1 +SpacesInAngles: false +SpacesInContainerLiterals: false +SpacesInCStyleCastParentheses: false +SpacesInParentheses: true +SpacesInSquareBrackets: false +Standard: Cpp11 +TabWidth: 8 +UseTab: Never diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000000000000000000000000000000000000..aa9c35e4f9786f3321942cacb1f56d7d91840e20 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,31 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ diff --git a/Makefile b/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..74c97cf3bac1cab34a80c82c16a316eb08ecd137 --- /dev/null +++ b/Makefile @@ -0,0 +1,192 @@ + +# GNU Makefile + +# Paths +SRC_LIBCOM = lib_com +SRC_LIBDEBUG = lib_debug +SRC_LIBDEC = lib_dec +SRC_LIBENC = lib_enc +SRC_LIBREND = lib_rend +SRC_LIBUTIL = lib_util +SRC_APP = apps +BUILD = build +OBJDIR = obj + +SRC_DIRS = $(sort -u $(SRC_LIBCOM) $(SRC_LIBDEBUG) $(SRC_LIBDEC) $(SRC_LIBENC) $(SRC_LIBREND) $(SRC_LIBUTIL) $(SRC_APP)) + +# Name of CLI binaries +CLI_APIDEC ?= IVAS_dec +CLI_APIENC ?= IVAS_cod +CLI_APIREND ?= IVAS_rend +LIB_LIBCOM ?= libivascom.a +LIB_LIBDEBUG ?= libivasdebug.a +LIB_LIBDEC ?= libivasdec.a +LIB_LIBENC ?= libivasenc.a +LIB_LIBREND ?= libivasrend.a +LIB_LIBUTIL ?= libivasutil.a + +# Default tool settings +CC ?= gcc +RM ?= rm -f +AR ?= ar + +# Detect system +UNAME_S := $(shell uname -s) + +# Switches for cross-platform builds (i.e. build 32 bit code on 64 bit platforms) +ifneq "$(TARGET_PLATFORM)" "" +ifeq ("$(TARGET_PLATFORM)", "$(findstring $(TARGET_PLATFORM), i386 i586 i686)") + CFLAGS += -m32 + LDFLAGS += -m32 +endif + +ifeq ("$(TARGET_PLATFORM)", "$(findstring $(TARGET_PLATFORM), x86_64)") + CFLAGS += -m64 + LDFLAGS += -m64 +endif +endif + +ifndef VERBOSE +QUIET_CC = @echo ' ' Compiling $<; +QUIET_LINK= @echo ' ' Linking $@; +QUIET_AR = @echo ' ' Archiving $@; +QUIET = @ +endif + +# C compiler flags +CFLAGS += -std=c99 -pedantic -Wcast-qual -Wall -W -Wextra -Wno-long-long \ + -Wpointer-arith -Wstrict-prototypes -Wmissing-prototypes \ + -Werror-implicit-function-declaration \ + -Wno-unused-function -Wno-implicit-fallthrough + +# libs to link +LDLIBS += -lm + +# Clang sanitizer compiler options +CCCLANG = clang +ifeq "$(CLANG)" "1" +CC = $(CCCLANG) +CFLAGS += -fsanitize=memory +LDFLAGS += -fsanitize=memory +endif +ifeq "$(CLANG)" "2" +CC = $(CCCLANG) +CFLAGS += -fsanitize=address +LDFLAGS += -fsanitize=address +endif +ifeq "$(CLANG)" "3" +CC = $(CCCLANG) +# NOTE: keep in sync with list in CMakeLists.txt +usan_checks = undefined,float-divide-by-zero,implicit-conversion,local-bounds +CFLAGS += -fsanitize=$(usan_checks) +CFLAGS += -fsanitize-recover=$(usan_checks) +LDFLAGS += -fsanitize=$(usan_checks) +LDFLAGS += -fsanitize-recover=$(usan_checks) +endif + +ifeq "$(RELEASE)" "1" +CFLAGS += -DRELEASE +OPTIM ?= 2 +endif + +ifneq "$(DEBUG)" "0" +CFLAGS += -g3 +LDFLAGS += -g3 +endif + +ifeq "$(GCOV)" "1" +CFLAGS += -fprofile-arcs -ftest-coverage +LDFLAGS += -fprofile-arcs -ftest-coverage +endif + +ifeq "$(STRIP)" "1" +CFLAGS += -fdata-sections -ffunction-sections +ifneq ($(UNAME_S),Darwin) +LDFLAGS += -Wl,-gc-sections -static +else +LDFLAGS += -Wl,-dead_strip +endif +endif + +OPTIM ?= 0 +CFLAGS += -O$(OPTIM) + +CFLAGS += $(foreach DIR,$(SRC_DIRS),-I$(DIR)) + +# Source file search paths +VPATH = $(SRC_DIRS) + +############################################################################### + +SRCS_LIBCOM = $(foreach DIR,$(SRC_LIBCOM),$(patsubst $(DIR)/%,%,$(wildcard $(DIR)/*.c))) +SRCS_LIBDEBUG = $(foreach DIR,$(SRC_LIBDEBUG),$(patsubst $(DIR)/%,%,$(wildcard $(DIR)/*.c))) +SRCS_LIBDEC = $(foreach DIR,$(SRC_LIBDEC),$(patsubst $(DIR)/%,%,$(wildcard $(DIR)/*.c))) +SRCS_LIBENC = $(foreach DIR,$(SRC_LIBENC),$(patsubst $(DIR)/%,%,$(wildcard $(DIR)/*.c))) +SRCS_LIBREND = $(foreach DIR,$(SRC_LIBREND),$(patsubst $(DIR)/%,%,$(wildcard $(DIR)/*.c))) +SRCS_LIBUTIL = $(foreach DIR,$(SRC_LIBUTIL),$(patsubst $(DIR)/%,%,$(wildcard $(DIR)/*.c))) + +OBJS_LIBCOM = $(addprefix $(OBJDIR)/,$(SRCS_LIBCOM:.c=.o)) +OBJS_LIBDEBUG = $(addprefix $(OBJDIR)/,$(SRCS_LIBDEBUG:.c=.o)) +OBJS_LIBDEC = $(addprefix $(OBJDIR)/,$(SRCS_LIBDEC:.c=.o)) +OBJS_LIBENC = $(addprefix $(OBJDIR)/,$(SRCS_LIBENC:.c=.o)) +OBJS_LIBREND = $(addprefix $(OBJDIR)/,$(SRCS_LIBREND:.c=.o)) +OBJS_LIBUTIL = $(addprefix $(OBJDIR)/,$(SRCS_LIBUTIL:.c=.o)) +OBJS_CLI_APIDEC = $(OBJDIR)/decoder.o +OBJS_CLI_APIENC = $(OBJDIR)/encoder.o +OBJS_CLI_APPREND = $(OBJDIR)/renderer.o + +DEPS = $(addprefix $(OBJDIR)/,$(SRCS_LIBCOM:.c=.P) $(SRCS_LIBDEBUG:.c=.P) $(SRCS_LIBDEC:.c=.P) \ + $(SRCS_LIBENC:.c=.P) $(SRCS_LIBUTIL:.c=.P) $(SRCS_LIBREND:.c=.P)) + +############################################################################### + +.PHONY: all clean + +all: $(CLI_APIENC) $(CLI_APIDEC) $(CLI_APIREND) + +$(OBJDIR): + $(QUIET)mkdir -p $(OBJDIR) + +$(LIB_LIBCOM): $(OBJS_LIBCOM) + $(QUIET_AR)$(AR) rcs $@ $^ + +$(LIB_LIBDEC): $(OBJS_LIBDEC) $(OBJS_LIBREND) + $(QUIET_AR)$(AR) rcs $@ $^ + +$(LIB_LIBDEBUG): $(OBJS_LIBDEBUG) + $(QUIET_AR)$(AR) rcs $@ $^ + +$(LIB_LIBENC): $(OBJS_LIBENC) + $(QUIET_AR)$(AR) rcs $@ $^ + +$(LIB_LIBREND): $(OBJS_LIBREND) + $(QUIET_AR)$(AR) rcs $@ $^ + +$(LIB_LIBUTIL): $(OBJS_LIBUTIL) + $(QUIET_AR)$(AR) rcs $@ $^ + +$(CLI_APIENC): $(OBJS_CLI_APIENC) $(LIB_LIBENC) $(LIB_LIBCOM) $(LIB_LIBUTIL) $(LIB_LIBDEBUG) + $(QUIET_LINK)$(CC) $(LDFLAGS) $(OBJS_CLI_APIENC) -L. -livasenc -livascom -livasutil -livasdebug $(LDLIBS) -o $(CLI_APIENC) + +$(CLI_APIDEC): $(OBJS_CLI_APIDEC) $(LIB_LIBDEC) $(LIB_LIBCOM) $(LIB_LIBUTIL) $(LIB_LIBDEBUG) + $(QUIET_LINK)$(CC) $(LDFLAGS) $(OBJS_CLI_APIDEC) -L. -livasdec -livascom -livasutil -livasdebug $(LDLIBS) -o $(CLI_APIDEC) + +$(CLI_APIREND): $(OBJS_CLI_APPREND) $(LIB_LIBREND) $(LIB_LIBCOM) $(LIB_LIBUTIL) $(LIB_LIBDEBUG) $(LIB_LIBDEC) + $(QUIET_LINK)$(CC) $(LDFLAGS) $(OBJS_CLI_APPREND) -L. -livasrend -livasdec -livasutil -livasdebug -livascom $(LDLIBS) -o $(CLI_APIREND) + +libs: $(LIB_LIBENC) $(LIB_LIBDEBUG) $(LIB_LIBCOM) $(LIB_LIBDEC) $(LIB_LIBREND) $(LIB_LIBUTIL) + +clean: + $(QUIET)$(RM) $(OBJS_LIBENC) $(OBJS_LIBDEC) $(DEPS) + $(QUIET)$(RM) $(DEPS:.P=.d) + $(QUIET)test ! -d $(OBJDIR) || rm -rf $(OBJDIR) + $(QUIET)$(RM) $(CLI_APIENC) $(CLI_APIDEC) $(CLI_APIREND) $(LIB_LIBENC) $(LIB_LIBDEBUG) $(LIB_LIBCOM) $(LIB_LIBDEC) $(LIB_LIBUTIL) $(LIB_LIBREND) + +$(OBJDIR)/%.o : %.c | $(OBJDIR) + $(QUIET_CC)$(CC) $(CFLAGS) -c -MD -o $@ $< + @cp $(OBJDIR)/$*.d $(OBJDIR)/$*.P; \ + sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \ + -e '/^$$/ d' -e 's/$$/ :/' < $(OBJDIR)/$*.d >> $(OBJDIR)/$*.P; \ + $(RM) $(OBJDIR)/$*.d + +-include $(DEPS) diff --git a/Workspace_msvc/Workspace_msvc.sln b/Workspace_msvc/Workspace_msvc.sln new file mode 100644 index 0000000000000000000000000000000000000000..a0783ddbf435ddeb6f09907e51620302fac68237 --- /dev/null +++ b/Workspace_msvc/Workspace_msvc.sln @@ -0,0 +1,103 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.28307.902 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lib_dec", "lib_dec.vcxproj", "{E822DDAF-0F5F-4CD0-A694-38AE69DE74D3}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lib_enc", "lib_enc.vcxproj", "{824DA4CF-06F0-45C9-929A-8792F0E19C3E}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lib_com", "lib_com.vcxproj", "{39EC200D-7795-4FF8-B214-B24EDA5526AE}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lib_rend", "lib_rend.vcxproj", "{718DE063-A18B-BB72-9150-62B892E6FFA6}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lib_util", "lib_util.vcxproj", "{2FA8F384-0775-F3B7-F8C3-85209222FC70}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lib_debug", "lib_debug.vcxproj", "{54509728-928B-44D9-A118-A6F92F08B34F}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "decoder", "decoder.vcxproj", "{E3DCBC31-7FC9-D127-E000-529F8460D5FD}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "encoder", "encoder.vcxproj", "{B3FC9DFC-7268-8660-7C0D-B60BAF02C554}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "renderer", "renderer.vcxproj", "{12B4C8A5-1E06-4E30-B443-D1F916F52B47}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{51160D4C-55C9-4C16-A792-D94507225746}" + ProjectSection(SolutionItems) = preProject + ..\.clang-format = ..\.clang-format + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {E822DDAF-0F5F-4CD0-A694-38AE69DE74D3}.Debug|Win32.ActiveCfg = Debug|Win32 + {E822DDAF-0F5F-4CD0-A694-38AE69DE74D3}.Debug|Win32.Build.0 = Debug|Win32 + {E822DDAF-0F5F-4CD0-A694-38AE69DE74D3}.Debug|x64.ActiveCfg = Debug|Win32 + {E822DDAF-0F5F-4CD0-A694-38AE69DE74D3}.Release|Win32.ActiveCfg = Release|Win32 + {E822DDAF-0F5F-4CD0-A694-38AE69DE74D3}.Release|Win32.Build.0 = Release|Win32 + {E822DDAF-0F5F-4CD0-A694-38AE69DE74D3}.Release|x64.ActiveCfg = Release|Win32 + {824DA4CF-06F0-45C9-929A-8792F0E19C3E}.Debug|Win32.ActiveCfg = Debug|Win32 + {824DA4CF-06F0-45C9-929A-8792F0E19C3E}.Debug|Win32.Build.0 = Debug|Win32 + {824DA4CF-06F0-45C9-929A-8792F0E19C3E}.Debug|x64.ActiveCfg = Debug|Win32 + {824DA4CF-06F0-45C9-929A-8792F0E19C3E}.Release|Win32.ActiveCfg = Release|Win32 + {824DA4CF-06F0-45C9-929A-8792F0E19C3E}.Release|Win32.Build.0 = Release|Win32 + {824DA4CF-06F0-45C9-929A-8792F0E19C3E}.Release|x64.ActiveCfg = Release|Win32 + {39EC200D-7795-4FF8-B214-B24EDA5526AE}.Debug|Win32.ActiveCfg = Debug|Win32 + {39EC200D-7795-4FF8-B214-B24EDA5526AE}.Debug|Win32.Build.0 = Debug|Win32 + {39EC200D-7795-4FF8-B214-B24EDA5526AE}.Debug|x64.ActiveCfg = Debug|Win32 + {39EC200D-7795-4FF8-B214-B24EDA5526AE}.Release|Win32.ActiveCfg = Release|Win32 + {39EC200D-7795-4FF8-B214-B24EDA5526AE}.Release|Win32.Build.0 = Release|Win32 + {39EC200D-7795-4FF8-B214-B24EDA5526AE}.Release|x64.ActiveCfg = Release|Win32 + {718DE063-A18B-BB72-9150-62B892E6FFA6}.Debug|Win32.ActiveCfg = Debug|Win32 + {718DE063-A18B-BB72-9150-62B892E6FFA6}.Debug|Win32.Build.0 = Debug|Win32 + {718DE063-A18B-BB72-9150-62B892E6FFA6}.Debug|x64.ActiveCfg = Debug|Win32 + {718DE063-A18B-BB72-9150-62B892E6FFA6}.Release|Win32.ActiveCfg = Release|Win32 + {718DE063-A18B-BB72-9150-62B892E6FFA6}.Release|Win32.Build.0 = Release|Win32 + {718DE063-A18B-BB72-9150-62B892E6FFA6}.Release|x64.ActiveCfg = Release|Win32 + {2FA8F384-0775-F3B7-F8C3-85209222FC70}.Debug|Win32.ActiveCfg = Debug|Win32 + {2FA8F384-0775-F3B7-F8C3-85209222FC70}.Debug|Win32.Build.0 = Debug|Win32 + {2FA8F384-0775-F3B7-F8C3-85209222FC70}.Debug|x64.ActiveCfg = Debug|Win32 + {2FA8F384-0775-F3B7-F8C3-85209222FC70}.Release|Win32.ActiveCfg = Release|Win32 + {2FA8F384-0775-F3B7-F8C3-85209222FC70}.Release|Win32.Build.0 = Release|Win32 + {2FA8F384-0775-F3B7-F8C3-85209222FC70}.Release|x64.ActiveCfg = Release|Win32 + {54509728-928B-44D9-A118-A6F92F08B34F}.Debug|Win32.ActiveCfg = Debug|Win32 + {54509728-928B-44D9-A118-A6F92F08B34F}.Debug|Win32.Build.0 = Debug|Win32 + {54509728-928B-44D9-A118-A6F92F08B34F}.Debug|x64.ActiveCfg = Debug|Win32 + {54509728-928B-44D9-A118-A6F92F08B34F}.Release|Win32.ActiveCfg = Release|Win32 + {54509728-928B-44D9-A118-A6F92F08B34F}.Release|Win32.Build.0 = Release|Win32 + {54509728-928B-44D9-A118-A6F92F08B34F}.Release|x64.ActiveCfg = Release|Win32 + {E3DCBC31-7FC9-D127-E000-529F8460D5FD}.Debug|Win32.ActiveCfg = Debug|Win32 + {E3DCBC31-7FC9-D127-E000-529F8460D5FD}.Debug|Win32.Build.0 = Debug|Win32 + {E3DCBC31-7FC9-D127-E000-529F8460D5FD}.Debug|x64.ActiveCfg = Debug|Win32 + {E3DCBC31-7FC9-D127-E000-529F8460D5FD}.Release|Win32.ActiveCfg = Release|Win32 + {E3DCBC31-7FC9-D127-E000-529F8460D5FD}.Release|Win32.Build.0 = Release|Win32 + {E3DCBC31-7FC9-D127-E000-529F8460D5FD}.Release|x64.ActiveCfg = Release|Win32 + {B3FC9DFC-7268-8660-7C0D-B60BAF02C554}.Debug|Win32.ActiveCfg = Debug|Win32 + {B3FC9DFC-7268-8660-7C0D-B60BAF02C554}.Debug|Win32.Build.0 = Debug|Win32 + {B3FC9DFC-7268-8660-7C0D-B60BAF02C554}.Debug|x64.ActiveCfg = Debug|Win32 + {B3FC9DFC-7268-8660-7C0D-B60BAF02C554}.Release|Win32.ActiveCfg = Release|Win32 + {B3FC9DFC-7268-8660-7C0D-B60BAF02C554}.Release|Win32.Build.0 = Release|Win32 + {B3FC9DFC-7268-8660-7C0D-B60BAF02C554}.Release|x64.ActiveCfg = Release|Win32 + {12B4C8A5-1E06-4E30-B443-D1F916F52B47}.Debug|Win32.ActiveCfg = Debug|Win32 + {12B4C8A5-1E06-4E30-B443-D1F916F52B47}.Debug|Win32.Build.0 = Debug|Win32 + {12B4C8A5-1E06-4E30-B443-D1F916F52B47}.Debug|x64.ActiveCfg = Debug|Win32 + {12B4C8A5-1E06-4E30-B443-D1F916F52B47}.Release|Win32.ActiveCfg = Release|Win32 + {12B4C8A5-1E06-4E30-B443-D1F916F52B47}.Release|Win32.Build.0 = Release|Win32 + {12B4C8A5-1E06-4E30-B443-D1F916F52B47}.Release|x64.ActiveCfg = Release|Win32 + {95030B82-70CD-4C6B-84D4-61096035BEA2}.Debug|Win32.ActiveCfg = Debug|Win32 + {95030B82-70CD-4C6B-84D4-61096035BEA2}.Debug|Win32.Build.0 = Debug|Win32 + {95030B82-70CD-4C6B-84D4-61096035BEA2}.Debug|x64.ActiveCfg = Debug|Win32 + {95030B82-70CD-4C6B-84D4-61096035BEA2}.Release|Win32.ActiveCfg = Release|Win32 + {95030B82-70CD-4C6B-84D4-61096035BEA2}.Release|Win32.Build.0 = Release|Win32 + {95030B82-70CD-4C6B-84D4-61096035BEA2}.Release|x64.ActiveCfg = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {74E3E3B8-3E51-4003-816B-8ED3057AAC21} + EndGlobalSection +EndGlobal diff --git a/Workspace_msvc/decoder.vcxproj b/Workspace_msvc/decoder.vcxproj new file mode 100644 index 0000000000000000000000000000000000000000..e59992847c71b085235a5232aad1afa7d710d17f --- /dev/null +++ b/Workspace_msvc/decoder.vcxproj @@ -0,0 +1,171 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + decoder + {E3DCBC31-7FC9-D127-E000-529F8460D5FD} + decoder + 10.0.17763.0 + + + + Application + v141 + false + MultiByte + + + Application + v141 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + ..\ + .\Debug_$(ProjectName)\ + false + false + IVAS_dec + + + ..\ + .\Release_$(ProjectName)\ + false + false + IVAS_dec + + + + + + + $(IntDir)$(ProjectName).tlb + + + + Disabled + ..\lib_dec;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + + $(OutDir)$(TargetName).exe + true + + true + $(IntDir)$(ProjectName).pdb + Console + false + + MachineX86 + + + + + $(IntDir)$(ProjectName).tlb + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_dec;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + Precise + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + $(OutDir)$(TargetName).exe + true + + false + $(IntDir)$(ProjectName).pdb + Console + false + + MachineX86 + libcmtd.lib + + + + + + + + {e822ddaf-0f5f-4cd0-a694-38ae69de74d3} + false + + + {2fa8f384-0775-f3b7-f8c3-85209222fc70} + false + + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/encoder.vcxproj b/Workspace_msvc/encoder.vcxproj new file mode 100644 index 0000000000000000000000000000000000000000..9578e488dcee1c036524b8520471e228f6cb409f --- /dev/null +++ b/Workspace_msvc/encoder.vcxproj @@ -0,0 +1,178 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + encoder + {B3FC9DFC-7268-8660-7C0D-B60BAF02C554} + encoder + 10.0.17763.0 + + + + Application + v141 + false + MultiByte + + + Application + v141 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + ..\ + .\Debug_$(ProjectName)\ + false + false + IVAS_cod + + + ..\ + .\Release_$(ProjectName)\ + false + false + IVAS_cod + + + + + + + $(IntDir)$(ProjectName).tlb + + + + Disabled + ..\lib_enc;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + + $(OutDir)$(TargetName).exe + true + + false + true + $(IntDir)$(ProjectName).pdb + Console + + false + + MachineX86 + + + + + + + + + + + $(IntDir)$(ProjectName).tlb + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_enc;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + Precise + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + $(OutDir)$(TargetName).exe + true + + false + $(IntDir)$(ProjectName).pdb + Console + false + + MachineX86 + + + + + + + + {824da4cf-06f0-45c9-929a-8792f0e19c3e} + false + + + {2fa8f384-0775-f3b7-f8c3-85209222fc70} + false + + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_com.vcxproj b/Workspace_msvc/lib_com.vcxproj new file mode 100644 index 0000000000000000000000000000000000000000..22407fb0268c6e5d81348fb91415f62362793e10 --- /dev/null +++ b/Workspace_msvc/lib_com.vcxproj @@ -0,0 +1,311 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {39EC200D-7795-4FF8-B214-B24EDA5526AE} + common + 10.0.17763.0 + + + + StaticLibrary + v141 + false + MultiByte + + + StaticLibrary + v141 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + .\Debug_$(ProjectName)\ + .\Debug_$(ProjectName)\ + libivascom + + + .\Release_$(ProjectName)\ + .\Release_$(ProjectName)\ + libivascom + + + + + + + Disabled + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_com.vcxproj.filters b/Workspace_msvc/lib_com.vcxproj.filters new file mode 100644 index 0000000000000000000000000000000000000000..7a8f8e013bc27c7ca256c1f5945d88fd49176f28 --- /dev/null +++ b/Workspace_msvc/lib_com.vcxproj.filters @@ -0,0 +1,557 @@ + + + + + common_ivas_c + + + common_ivas_c + + + common_ivas_c + + + common_evs_c + + + common_evs_c + + + common_evs_c + + + common_evs_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_ivas_c + + + common_ivas_c + + + common_ivas_c + + + common_evs_c + + + common_evs_c + + + common_evs_c + + + common_evs_c + + + common_ivas_c + + + common_ivas_c + + + common_ivas_c + + + common_ivas_c + + + common_ivas_c + + + common_ivas_c + + + common_ivas_c + + + common_ivas_c + + + common_ivas_c + + + common_ivas_c + + + common_ivas_c + + + common_ivas_c + + + common_ivas_c + + + common_ivas_c + + + common_ivas_c + + + common_ivas_c + + + common_ivas_c + + + common_ivas_c + + + common_ivas_c + + + common_ivas_c + + + common_ivas_c + + + common_ivas_c + + + common_ivas_c + + + common_ivas_c + + + common_ivas_c + + + common_ivas_c + + + common_ivas_c + + + common_ivas_c + + + common_ivas_c + + + common_ivas_c + + + common_ivas_c + + + + + common_h + + + common_h + + + common_h + + + common_h + + + common_h + + + common_h + + + common_h + + + common_h + + + common_h + + + common_h + + + common_h + + + common_h + + + common_h + + + common_h + + + common_h + + + common_h + + + common_h + + + common_h + + + common_h + + + common_h + + + + common_h + + + + + + {890c2f45-9385-4fce-859b-6a65469e8dc0} + + + {201ea764-9626-4dca-9cc4-5b4106f8b8b2} + + + {fbb860e2-79d0-45b1-ada1-c3a0a369ce2c} + + + {b95b7bed-a666-4a00-9332-2b528638503e} + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_debug.vcxproj b/Workspace_msvc/lib_debug.vcxproj new file mode 100644 index 0000000000000000000000000000000000000000..f54f282f05863a94d58638b16b12501e42ec4440 --- /dev/null +++ b/Workspace_msvc/lib_debug.vcxproj @@ -0,0 +1,116 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {54509728-928B-44D9-A118-A6F92F08B34F} + debug + 10.0.17763.0 + + + + StaticLibrary + v141 + MultiByte + + + StaticLibrary + v141 + MultiByte + true + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + .\Debug_$(ProjectName)\ + .\Debug_$(ProjectName)\ + libivasdebug + + + .\Release_$(ProjectName)\ + .\Release_$(ProjectName)\ + libivasdebug + + + + + + + Disabled + ..\lib_com;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + false + + EnableFastChecks + MultiThreadedDebug + false + $(IntDir)$(ProjectName).pdb + Level4 + OldStyle + Default + %(DisableSpecificWarnings) + + + $(OutDir)$(TargetName).lib + + + + + + + + MaxSpeed + AnySuitable + false + false + ..\lib_com;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + $(IntDir)$(ProjectName).pdb + Level4 + + Default + %(DisableSpecificWarnings) + + + $(OutDir)$(TargetName).lib + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_dec.vcxproj b/Workspace_msvc/lib_dec.vcxproj new file mode 100644 index 0000000000000000000000000000000000000000..10a3ac1b4b7ca56c73d22a2e7a8b79e49e17513e --- /dev/null +++ b/Workspace_msvc/lib_dec.vcxproj @@ -0,0 +1,350 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + lib_dec + {E822DDAF-0F5F-4CD0-A694-38AE69DE74D3} + evs_dec + 10.0.17763.0 + + + StaticLibrary + v141 + false + MultiByte + + + + StaticLibrary + v141 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + .\Debug_$(ProjectName)\ + .\Debug_$(ProjectName)\ + false + false + libivasdec + + + .\Release_$(ProjectName)\ + .\Release_$(ProjectName)\ + false + false + libivasdec + + + + + + + .\Debug\$(ProjectName).tlb + + + + Disabled + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + $(IntDir)$(ProjectName).tlb + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {39ec200d-7795-4ff8-b214-b24eda5526ae} + false + + + {54509728-928b-44d9-a118-a6f92f08b34f} + false + + + {718DE063-A18B-BB72-9150-62B892E6FFA6} + false + + + + + + + + + + + diff --git a/Workspace_msvc/lib_dec.vcxproj.filters b/Workspace_msvc/lib_dec.vcxproj.filters new file mode 100644 index 0000000000000000000000000000000000000000..ef14ddf0e47f22646d686d7263637b5628af85e2 --- /dev/null +++ b/Workspace_msvc/lib_dec.vcxproj.filters @@ -0,0 +1,575 @@ + + + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_evs_c + + + decoder_evs_c + + + decoder_evs_c + + + decoder_evs_c + + + decoder_evs_c + + + decoder_evs_c + + + decoder_evs_c + + + decoder_evs_c + + + decoder_evs_c + + + decoder_evs_c + + + decoder_evs_c + + + decoder_evs_c + + + decoder_evs_c + + + decoder_evs_c + + + decoder_evs_c + + + decoder_evs_c + + + decoder_evs_c + + + decoder_evs_c + + + decoder_evs_c + + + decoder_evs_c + + + decoder_evs_c + + + decoder_evs_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + + + + decoder_h + + + decoder_h + + + decoder_h + + + decoder_h + + + decoder_h + + + decoder_h + + + decoder_h + + + decoder_h + + + decoder_h + + + decoder_h + + + decoder_h + + + decoder_h + + + + + + {f63b6db2-97ec-4d8d-be9c-e798ac8bb645} + + + {0853864e-7de7-411d-975b-5045652f22c3} + + + {e29aae34-aeeb-45dd-a986-61b39890c5bb} + + + {c33b80b3-67ce-466b-91c0-4adfc9efcb5c} + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_enc.vcxproj b/Workspace_msvc/lib_enc.vcxproj new file mode 100644 index 0000000000000000000000000000000000000000..e2db02d61cba7d8946f927a8e97cbe8797bef5b8 --- /dev/null +++ b/Workspace_msvc/lib_enc.vcxproj @@ -0,0 +1,365 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + lib_enc + {824DA4CF-06F0-45C9-929A-8792F0E19C3E} + evs_enc + 10.0.17763.0 + + + + StaticLibrary + v141 + false + MultiByte + + + StaticLibrary + v141 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + .\Debug_$(ProjectName)\ + .\Debug_$(ProjectName)\ + false + false + libivasenc + + + .\Release_$(ProjectName)\ + .\Release_$(ProjectName)\ + false + false + libivasenc + + + + + + + $(IntDir)$(ProjectName).tlb + + + + Disabled + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + + + + $(IntDir)$(ProjectName).tlb + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + Precise + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {39ec200d-7795-4ff8-b214-b24eda5526ae} + false + + + {54509728-928b-44d9-a118-a6f92f08b34f} + false + + + + + + + + + + + diff --git a/Workspace_msvc/lib_enc.vcxproj.filters b/Workspace_msvc/lib_enc.vcxproj.filters new file mode 100644 index 0000000000000000000000000000000000000000..e74f441c4c7902d05da6850e2642eebf15c1208e --- /dev/null +++ b/Workspace_msvc/lib_enc.vcxproj.filters @@ -0,0 +1,629 @@ + + + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_evs_c + + + enc_evs_c + + + enc_evs_c + + + enc_evs_c + + + enc_evs_c + + + enc_evs_c + + + enc_evs_c + + + enc_evs_c + + + enc_evs_c + + + enc_evs_c + + + enc_evs_c + + + enc_evs_c + + + enc_evs_c + + + enc_evs_c + + + enc_evs_c + + + enc_evs_c + + + enc_evs_c + + + enc_evs_c + + + enc_evs_c + + + enc_evs_c + + + enc_evs_c + + + enc_evs_c + + + enc_evs_c + + + enc_evs_c + + + enc_evs_c + + + enc_evs_c + + + enc_evs_c + + + enc_evs_c + + + enc_evs_c + + + enc_evs_c + + + enc_evs_c + + + enc_evs_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_evs_c + + + enc_evs_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_all_c + + + enc_evs_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + + + enc_h + + + enc_h + + + enc_h + + + enc_h + + + + + + {b7ee0526-8b79-4554-a3ec-04e51d38475f} + + + {dabed049-70a2-48f2-9da6-3b81a3664033} + + + {5717f1cb-c593-400b-b23a-45c422fd95c8} + + + {6cccabbe-510f-43d3-90e1-8ed5ea3837d7} + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_rend.vcxproj b/Workspace_msvc/lib_rend.vcxproj new file mode 100644 index 0000000000000000000000000000000000000000..11edc931023867a961d8e3c355f6c5e4f1568c96 --- /dev/null +++ b/Workspace_msvc/lib_rend.vcxproj @@ -0,0 +1,206 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + lib_rend + {718DE063-A18B-BB72-9150-62B892E6FFA6} + evs_dec + 10.0.17763.0 + + + StaticLibrary + v141 + false + MultiByte + + + + StaticLibrary + v141 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + .\Debug_$(ProjectName)\ + .\Debug_$(ProjectName)\ + false + false + libivasrend + + + .\Release_$(ProjectName)\ + .\Release_$(ProjectName)\ + false + false + libivasrend + + + + + + + .\Debug\$(ProjectName).tlb + + + + Disabled + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + $(IntDir)$(ProjectName).tlb + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {39ec200d-7795-4ff8-b214-b24eda5526ae} + false + + + {54509728-928b-44d9-a118-a6f92f08b34f} + false + + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_rend.vcxproj.filters b/Workspace_msvc/lib_rend.vcxproj.filters new file mode 100644 index 0000000000000000000000000000000000000000..406ba2c85ee9fc8f3adfb0910136e2f379fe553b --- /dev/null +++ b/Workspace_msvc/lib_rend.vcxproj.filters @@ -0,0 +1,215 @@ + + + + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + + + + rend_h + + + rend_h + + + rend_h + + + rend_h + + + rend_h + + + rend_h + + + rend_h + + + rend_h + + + rend_h + + + rend_h + + + rend_h + + + + + {54449ece-ef29-44b5-9512-ed8f555851a8} + + + {672b0eb6-cce8-425c-8bf2-aba4b45639bb} + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_util.vcxproj b/Workspace_msvc/lib_util.vcxproj new file mode 100644 index 0000000000000000000000000000000000000000..6696ee00a8f723137553a0491a1e7842a7bfa965 --- /dev/null +++ b/Workspace_msvc/lib_util.vcxproj @@ -0,0 +1,156 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {2FA8F384-0775-F3B7-F8C3-85209222FC70} + utility + 10.0.17763.0 + + + + StaticLibrary + v141 + MultiByte + + + StaticLibrary + v141 + MultiByte + true + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + true + .\Debug_$(ProjectName)\ + .\Debug_$(ProjectName)\ + libivasutil + + + false + .\Release_$(ProjectName)\ + .\Release_$(ProjectName)\ + libivasutil + + + + Disabled + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;..\lib_util;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);ZLIB_WINAPI;%(PreprocessorDefinitions) + false + + EnableFastChecks + MultiThreadedDebug + false + $(IntDir)$(ProjectName).pdb + Level4 + OldStyle + Default + %(DisableSpecificWarnings) + + + $(OutDir)$(TargetName).lib + + + + + MaxSpeed + AnySuitable + false + false + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;..\lib_util;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);ZLIB_WINAPI;%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + $(IntDir)$(ProjectName).pdb + Level4 + + Default + %(DisableSpecificWarnings) + + + $(OutDir)$(TargetName).lib + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/renderer.vcxproj b/Workspace_msvc/renderer.vcxproj new file mode 100644 index 0000000000000000000000000000000000000000..c62874ec0afbfb789e4d8814ab3938b3e33f3410 --- /dev/null +++ b/Workspace_msvc/renderer.vcxproj @@ -0,0 +1,180 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + renderer + {12B4C8A5-1E06-4E30-B443-D1F916F52B47} + renderer + 10.0.17763.0 + + + + Application + v141 + false + MultiByte + + + Application + v141 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + ..\ + .\Debug_$(ProjectName)\ + false + false + IVAS_rend + + + ..\ + .\Release_$(ProjectName)\ + false + false + IVAS_rend + + + + $(IntDir)$(ProjectName).tlb + + + + Disabled + ..\lib_com;..\lib_debug;..\lib_util;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + + $(OutDir)$(TargetName).exe + true + + true + $(IntDir)$(ProjectName).pdb + Console + false + + MachineX86 + + + + + $(IntDir)$(ProjectName).tlb + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_com;..\lib_debug;..\lib_util;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + Precise + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + $(OutDir)$(TargetName).exe + true + + false + $(IntDir)$(ProjectName).pdb + Console + false + + MachineX86 + libcmtd.lib + + + + + + + + {54509728-928B-44D9-A118-A6F92F08B34F} + false + + + {E822DDAF-0F5F-4CD0-A694-38AE69DE74D3} + false + + + {2FA8F384-0775-F3B7-F8C3-85209222FC70} + false + + + {39ec200d-7795-4ff8-b214-b24eda5526ae} + false + + + {718DE063-A18B-BB72-9150-62B892E6FFA6} + false + + + + + + + + + + + \ No newline at end of file diff --git a/apps/decoder.c b/apps/decoder.c new file mode 100644 index 0000000000000000000000000000000000000000..afb288dc098f943b56ef65c33f5bd6713ba320db --- /dev/null +++ b/apps/decoder.c @@ -0,0 +1,2366 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include "lib_dec.h" +#include +#include "cmdl_tools.h" +#include "audio_file_writer.h" +#include "bitstream_reader.h" +#include "evs_rtp_payload.h" +#include "ism_file_writer.h" +#include "jbm_file_writer.h" +#include "hrtf_file_reader.h" +#include "ls_custom_file_reader.h" +#include "masa_file_writer.h" +#include "render_config_reader.h" +#include "rotation_file_reader.h" +#include "vector3_pair_file_reader.h" +#include "wmc_auto.h" + + +#define WMC_TOOL_SKIP + +/*------------------------------------------------------------------------------------------* + * Local constants + *------------------------------------------------------------------------------------------*/ + +#if !defined( WMOPS ) +static +#endif + int32_t frame = 0; /* Counter of frames */ + +#define MIN_NUM_BITS_ACTIVE_FRAME 56 +#define NUM_BITS_SID_IVAS_5K2 104 +#define MAX_OUTPUT_PCM_BUFFER_SIZE ( ( IVAS_MAX_OUTPUT_CHANNELS + IVAS_MAX_NUM_OBJECTS ) * IVAS_MAX_FRAME_SIZE ) + +#define ORIENT_TRK_NONE ( 0 ) +#define ORIENT_TRK_REF ( 1 ) +#define ORIENT_TRK_AVG ( 2 ) +#define ORIENT_TRK_REF_VEC ( 3 ) +#define ORIENT_TRK_REF_VEC_LEV ( 4 ) + +#define JBM_FRONTEND_FETCH_FRAMESIZE_MS 20 +#define HEADROTATION_FETCH_FRAMESIZE_MS 5 +#define DEFAULT_FETCH_FRAMESIZE_MS 20 + + +/*------------------------------------------------------------------------------------------* + * Local structure for storing cmdln arguments + *------------------------------------------------------------------------------------------*/ + +typedef struct +{ + char *inputBitstreamFilename; + char *outputWavFilename; + IVAS_DEC_MODE decMode; + int32_t output_Fs; + IVAS_AUDIO_CONFIG outputConfig; + bool quietModeEnabled; + bool delayCompensationEnabled; + bool voipMode; + bool enableHeadRotation; + char *headrotTrajFileName; + bool enableReferenceRotation; + char *refrotTrajFileName; + bool enableReferenceVectorTracking; + char *referenceVectorTrajFileName; + bool enableExternalOrientation; + char *externalOrientationTrajFileName; +#ifdef SUPPORT_JBM_TRACEFILE + char *jbmTraceFilename; +#endif + char *jbmOffsetFilename; + char *FEPatternFileName; + float FER; + bool hrtfReaderEnabled; + char *hrtfFileName; + IVAS_DEC_INPUT_FORMAT inputFormat; + bool customLsOutputEnabled; + char *customLsSetupFilename; + int16_t orientation_tracking; + int16_t Opt_non_diegetic_pan; + float non_diegetic_pan_gain; + bool renderConfigEnabled; + char *renderConfigFilename; + IVAS_DEC_COMPLEXITY_LEVEL complexityLevel; + bool tsmEnabled; + bool enable5ms; + uint16_t acousticEnvironmentId; + int16_t Opt_dpid_on; + uint16_t directivityPatternId[IVAS_MAX_NUM_OBJECTS]; + +} DecArguments; + + +/*------------------------------------------------------------------------------------------* + * Local functions prototypes + *------------------------------------------------------------------------------------------*/ + +static bool parseCmdlIVAS_dec( int16_t argc, char **argv, DecArguments *arg ); +static void usage_dec( void ); +static ivas_error decodeG192( DecArguments arg, BS_READER_HANDLE hBsReader, RotFileReader *headRotReader, RotFileReader *externalOrientationFileReader, RotFileReader *refRotReader, Vector3PairFileReader *referenceVectorReader, IVAS_DEC_HANDLE hIvasDec, int16_t *pcmBuf ); +static ivas_error decodeVoIP( DecArguments arg, BS_READER_HANDLE hBsReader, IVAS_DEC_HANDLE hIvasDec ); + +/*------------------------------------------------------------------------------------------* + * main() + * + * Main IVAS decoder function for command-line interface + *------------------------------------------------------------------------------------------*/ + +int main( + int argc, + char *argv[] ) +{ + bool mainFailed = true; /* Assume main failed until cleanup is reached without errors */ + DecArguments arg; + ivas_error error = IVAS_ERR_UNKNOWN; + + /* Any handles that require cleanup must be declared here and initialized to NULL */ + IVAS_DEC_HANDLE hIvasDec = NULL; + BS_READER_HANDLE hBsReader = NULL; + LsCustomFileReader *hLsCustomReader = NULL; + hrtfFileReader *hrtfReader = NULL; + RotFileReader *headRotReader = NULL; + RotFileReader *externalOrientationFileReader = NULL; + RotFileReader *refRotReader = NULL; + Vector3PairFileReader *referenceVectorReader = NULL; + RenderConfigReader *renderConfigReader = NULL; + int16_t *pcmBuf = NULL; + +#ifdef WMOPS + reset_wmops(); + reset_mem( USE_32BITS ); +#endif + + /*------------------------------------------------------------------------------------------* + * Parse command-line arguments + *------------------------------------------------------------------------------------------*/ + + IVAS_DEC_PrintDisclaimer(); + + if ( !parseCmdlIVAS_dec( (int16_t) argc, argv, &arg ) ) + { + /* Error printout done in parseCmdlIVAS_dec() */ + goto cleanup; + } + + /*------------------------------------------------------------------------------------------* + * Open decoder handle + *------------------------------------------------------------------------------------------*/ + + if ( ( error = IVAS_DEC_Open( &hIvasDec, arg.decMode ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Open failed: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + + /*------------------------------------------------------------------------------------------* + * Open input bitstream file + *------------------------------------------------------------------------------------------*/ + + if ( arg.inputFormat == IVAS_DEC_INPUT_FORMAT_G192 || arg.inputFormat == IVAS_DEC_INPUT_FORMAT_MIME ) + { + BS_READER_FORMAT bsReaderFormat = BS_READER_FORMAT_G192; + + if ( arg.inputFormat == IVAS_DEC_INPUT_FORMAT_MIME ) + { + bsReaderFormat = BS_READER_FORMAT_MIME; + } + + if ( BS_Reader_Open_filename( &hBsReader, arg.inputBitstreamFilename, bsReaderFormat ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nUnable to open %s\n\n", arg.inputBitstreamFilename ); + goto cleanup; + } + else + { + fprintf( stdout, "Input bitstream file: %s\n", arg.inputBitstreamFilename ); + } + } + + { + fprintf( stdout, "Output synthesis file: %s\n", arg.outputWavFilename ); + } + + /*------------------------------------------------------------------------------------------* + * Open HRTF file + *------------------------------------------------------------------------------------------*/ + + if ( arg.hrtfReaderEnabled ) + { + /* sanity check */ + if ( arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) + { + arg.hrtfReaderEnabled = false; + fprintf( stderr, "\nError: HRTF binary file cannot be used in this output configuration.\n\n" ); + goto cleanup; + } + + if ( ( error = hrtfFileReader_open( arg.hrtfFileName, &hrtfReader ) ) != IVAS_ERR_OK ) + { + arg.hrtfReaderEnabled = false; + fprintf( stderr, "\nError: Can't open HRTF binary file %s \n\n", arg.hrtfFileName ); + goto cleanup; + } + } + + /*------------------------------------------------------------------------------------------* + * Open head-rotation file + *------------------------------------------------------------------------------------------*/ + + if ( arg.enableHeadRotation ) + { + /* sanity check */ + if ( arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB + ) + { + fprintf( stderr, "\nError: Head-rotation file file cannot be used in this output configuration.\n\n" ); + goto cleanup; + } + + if ( ( error = RotationFileReader_open( arg.headrotTrajFileName, &headRotReader ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError: Can't open head-rotation file %s \n\n", arg.headrotTrajFileName ); + goto cleanup; + } + } + + /*------------------------------------------------------------------------------------------* + * Open reference rotation file + *------------------------------------------------------------------------------------------*/ + + if ( arg.enableReferenceRotation ) + { + /* sanity check */ + if ( arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) + { + fprintf( stderr, "\nError: Reference rotation file cannot be used in this output configuration.\n\n" ); + goto cleanup; + } + + /* sanity check */ + if ( arg.orientation_tracking != ORIENT_TRK_REF ) + { + fprintf( stderr, "\nError: Reference rotation file can be used in '-otr ref' mode only.\n\n" ); + goto cleanup; + } + + if ( ( error = RotationFileReader_open( arg.refrotTrajFileName, &refRotReader ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError: Can't open reference rotation file %s \n\n", arg.refrotTrajFileName ); + goto cleanup; + } + } + + /*------------------------------------------------------------------------------------------* + * Open reference vector trajectory file + *------------------------------------------------------------------------------------------*/ + + if ( arg.enableReferenceVectorTracking ) + { + /* sanity check */ + if ( arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) + { + fprintf( stderr, "\nError: Reference vector trajectory file cannot be used in this output configuration.\n\n" ); + goto cleanup; + } + + /* sanity check */ + if ( arg.orientation_tracking != ORIENT_TRK_REF_VEC && arg.orientation_tracking != ORIENT_TRK_REF_VEC_LEV ) + { + fprintf( stderr, "\nError: Reference trajectory file can be used in '-otr ref_vec' or '-otr ref_vec_lev' mode only.\n\n" ); + goto cleanup; + } + + if ( ( error = Vector3PairFileReader_open( arg.referenceVectorTrajFileName, &referenceVectorReader ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError: Can't open reference vector trajectory file %s \n\n", arg.referenceVectorTrajFileName ); + goto cleanup; + } + } + + /*------------------------------------------------------------------------------------------* + * Open external orientation file + *------------------------------------------------------------------------------------------*/ + + if ( arg.enableExternalOrientation ) + { + if ( ( error = RotationFileReader_open( arg.externalOrientationTrajFileName, &externalOrientationFileReader ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError: Can't open external orientation file %s \n\n", arg.externalOrientationTrajFileName ); + goto cleanup; + } + } + + /*------------------------------------------------------------------------------------------* + * Open custom loudspeaker layout file + *------------------------------------------------------------------------------------------*/ + + if ( arg.customLsOutputEnabled ) + { + if ( ( error = CustomLsReader_open( arg.customLsSetupFilename, &hLsCustomReader ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError: Can't open Custom loudspeaker setup file %s \n\n", arg.customLsSetupFilename ); + goto cleanup; + } + } + + /*------------------------------------------------------------------------------------------* + * Open renderer configuration reader file + *------------------------------------------------------------------------------------------*/ + + if ( arg.renderConfigEnabled ) + { + /* sanity check */ + if ( arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB + ) + { + fprintf( stderr, "\nError: Renderer configuration file cannot be used in this output configuration.\n\n" ); + goto cleanup; + } + + if ( ( error = RenderConfigReader_open( arg.renderConfigFilename, &renderConfigReader ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError: Can't open Renderer configuration file %s \n\n", arg.renderConfigFilename ); + goto cleanup; + } + } + + /*------------------------------------------------------------------------------------------* + * Configure the decoder + *------------------------------------------------------------------------------------------*/ + + if ( ( error = IVAS_DEC_Configure( hIvasDec, arg.output_Fs, arg.outputConfig, arg.tsmEnabled, arg.enable5ms, arg.customLsOutputEnabled, arg.hrtfReaderEnabled, arg.enableHeadRotation, arg.enableExternalOrientation, + arg.orientation_tracking, arg.renderConfigEnabled, arg.Opt_non_diegetic_pan, arg.non_diegetic_pan_gain, arg.Opt_dpid_on, arg.acousticEnvironmentId, arg.delayCompensationEnabled ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nConfigure failed: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + + /*------------------------------------------------------------------------------------------* + * Configure Split rendering + *------------------------------------------------------------------------------------------*/ + + + /*------------------------------------------------------------------------------------------* + * Configure VoIP mode + *------------------------------------------------------------------------------------------*/ + + if ( arg.voipMode ) + { + if ( ( error = IVAS_DEC_EnableVoIP( hIvasDec, 60, arg.inputFormat ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nCould not enable VOIP: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + } + + IVAS_DEC_PrintConfig( hIvasDec, 1, arg.voipMode ); + + /*-------------------------------------------------------------------* + * Load renderer configuration from file + *--------------------------------------------------------------------*/ + + if ( arg.renderConfigEnabled ) + { + IVAS_RENDER_CONFIG_DATA renderConfig; + + /* sanity check */ + if ( arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) + { + fprintf( stderr, "\nExternal Renderer Config is supported only for binaural output configurations. Exiting. \n\n" ); + goto cleanup; + } + + if ( ( error = IVAS_DEC_GetRenderConfig( hIvasDec, &renderConfig ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_DEC_GetRenderConfig failed: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + + + if ( RenderConfigReader_read( renderConfigReader, arg.renderConfigFilename, &renderConfig ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Failed to read renderer configuration from file %s\n\n", arg.renderConfigFilename ); + goto cleanup; + } + + if ( ( error = RenderConfigReader_getDirectivity( renderConfigReader, arg.directivityPatternId, renderConfig.directivity ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Failed to get directivity patterns for one or more of IDs: %d %d %d %d\n\n", arg.directivityPatternId[0], arg.directivityPatternId[1], arg.directivityPatternId[2], arg.directivityPatternId[3] ); + goto cleanup; + } + + if ( arg.outputConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) + { + if ( ( error = RenderConfigReader_getAcousticEnvironment( renderConfigReader, arg.acousticEnvironmentId, &renderConfig.roomAcoustics ) ) == IVAS_ERR_OK ) + { + if ( RenderConfigReader_checkValues( &renderConfig ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Invalid reverberation configuration parameters\n\n" ); + goto cleanup; + } + } + else + { + fprintf( stderr, "Failed to get acoustic environment with ID: %d\n\n", arg.acousticEnvironmentId ); + goto cleanup; + } + renderConfig.roomAcoustics.override = true; + } + + if ( ( error = IVAS_DEC_FeedRenderConfig( hIvasDec, renderConfig ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_DEC_FeedRenderConfig failed: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + } + + /*------------------------------------------------------------------------------------------* + * Load custom loudspeaker layout data + *------------------------------------------------------------------------------------------*/ + + if ( arg.customLsOutputEnabled ) + { + IVAS_CUSTOM_LS_DATA hLsCustomData; + LS_CUSTOM_FILEREADER_ERROR lsCustomError; + + if ( ( lsCustomError = CustomLsFileReading( hLsCustomReader, &hLsCustomData ) ) != LS_CUSTOM_FILEREADER_NO_ERROR ) + { + fprintf( stderr, "\nError in reading Custom loudspeaker file %s: %s\n\n", arg.customLsSetupFilename, CustomLoudspeakerLayout_getError( lsCustomError ) ); + goto cleanup; + } + + if ( ( error = IVAS_DEC_FeedCustomLsData( hIvasDec, hLsCustomData ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_DEC_FeedCustomLsData failed: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + } + + /*------------------------------------------------------------------------------------------* + * Load HRTF binary file data + *------------------------------------------------------------------------------------------*/ + + if ( arg.hrtfReaderEnabled ) + { + IVAS_DEC_HRTF_HANDLE hHrtfTD = NULL; + + if ( ( error = IVAS_DEC_GetHrtfHandle( hIvasDec, &hHrtfTD ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_DEC_GetHrtfHandle failed: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + + if ( ( error = load_HRTF_binary( hHrtfTD, hrtfReader ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in loading HRTF binary file %s \n\n", arg.hrtfFileName ); + goto cleanup; + } + + IVAS_DEC_HRTF_CREND_HANDLE hSetOfHRTF = NULL; + if ( ( error = IVAS_DEC_GetHrtfCRendHandle( hIvasDec, &hSetOfHRTF ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_DEC_GetHrtfCRendHandle failed: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + + if ( ( error = create_SetOfHRTF_from_binary( hSetOfHRTF, hrtfReader, arg.output_Fs ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in loading HRTF binary file %s for CRend \n\n", arg.hrtfFileName ); + goto cleanup; + } + + IVAS_DEC_HRTF_FASTCONV_HANDLE hHrtfFastConv = NULL; + if ( ( error = IVAS_DEC_GetHrtfFastConvHandle( hIvasDec, &hHrtfFastConv ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_DEC_GetHrtfFastConvHandle failed: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + + if ( ( error = load_fastconv_HRTF_from_binary( hHrtfFastConv, hrtfReader ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in loading HRTF binary file %s for FastConv \n\n", arg.hrtfFileName ); + goto cleanup; + } + + IVAS_DEC_HRTF_PARAMBIN_HANDLE hHrtfParambin = NULL; + if ( ( error = IVAS_DEC_GetHrtfParamBinHandle( hIvasDec, &hHrtfParambin ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_DEC_GetHrtfParamBinHandle failed: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + + if ( ( error = load_parambin_HRTF_from_binary( hHrtfParambin, hrtfReader ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in loading HRTF binary file %s for parametric binauralizer \n\n", arg.hrtfFileName ); + goto cleanup; + } + } + + /*------------------------------------------------------------------------------------------* + * Allocate output data buffer + *------------------------------------------------------------------------------------------*/ + + int16_t pcmBufSize; + if ( ( error = IVAS_DEC_GetOutputBufferSize( hIvasDec, &pcmBufSize ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nGetOutputBufferSize failed: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + + pcmBuf = malloc( pcmBufSize * sizeof( int16_t ) ); + + /*-----------------------------------------------------------------* + * Decoding + *-----------------------------------------------------------------*/ + + if ( arg.voipMode ) + { + error = decodeVoIP( arg, hBsReader, hIvasDec ); + } + else + { + error = decodeG192( arg, hBsReader, headRotReader, externalOrientationFileReader, refRotReader, referenceVectorReader, hIvasDec, pcmBuf ); + } + + if ( error == IVAS_ERR_OK || error == IVAS_ERR_END_OF_FILE ) + { + if ( arg.quietModeEnabled ) + { + fprintf( stdout, "Decoding finished\n\n" ); + } + else + { + fprintf( stdout, "\nDecoding of %d frames finished\n\n", frame ); + } + } + else + { + fprintf( stdout, "Decoding finished prematurely\n\n" ); + goto cleanup; + } + + + /*------------------------------------------------------------------------------------------* + * Close files and deallocate resources + *------------------------------------------------------------------------------------------*/ + + mainFailed = false; /* This will stay set to true if cleanup is reached via a goto due to an error */ + +cleanup: + + free( pcmBuf ); + + if ( arg.hrtfReaderEnabled ) + { + IVAS_DEC_HRTF_HANDLE hHrtfTD = NULL; + IVAS_DEC_GetHrtfHandle( hIvasDec, &hHrtfTD ); + dealloc_HRTF_binary( hHrtfTD ); + IVAS_DEC_HRTF_CREND_HANDLE hSetOfHRTF = NULL; + IVAS_DEC_GetHrtfCRendHandle( hIvasDec, &hSetOfHRTF ); + destroy_SetOfHRTF( hSetOfHRTF ); + } + + IVAS_DEC_Close( &hIvasDec ); + CustomLsReader_close( &hLsCustomReader ); + hrtfFileReader_close( &hrtfReader ); + RotationFileReader_close( &headRotReader ); + RotationFileReader_close( &externalOrientationFileReader ); + RotationFileReader_close( &refRotReader ); + Vector3PairFileReader_close( &referenceVectorReader ); + RenderConfigReader_close( &renderConfigReader ); + + if ( BS_Reader_Close( &hBsReader ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError while closing file: %s\nContinuing...\n\n", arg.inputBitstreamFilename ); + } + +#ifdef WMOPS + print_wmops(); + print_mem( NULL ); +#endif + if ( !arg.quietModeEnabled ) + { + printf( "\n" ); + } + + return mainFailed ? -1 : 0; +} + + +/*---------------------------------------------------------------------* + * cmdline2config() + * + * Translate command-line argument to output configuration + *---------------------------------------------------------------------*/ + +static IVAS_AUDIO_CONFIG cmdline2config( + char *argv ) +{ + IVAS_AUDIO_CONFIG output_config; + + char argv_to_upper[FILENAME_MAX]; + + strncpy( argv_to_upper, argv, sizeof( argv_to_upper ) - 1 ); + argv_to_upper[sizeof( argv_to_upper ) - 1] = '\0'; + to_upper( argv_to_upper ); + + if ( strcmp( argv_to_upper, "EXT" ) == 0 ) /* external renderer */ + { + output_config = IVAS_AUDIO_CONFIG_EXTERNAL; + } + else if ( strcmp( argv_to_upper, "MONO" ) == 0 ) + { + output_config = IVAS_AUDIO_CONFIG_MONO; + } + else if ( strcmp( argv_to_upper, "STEREO" ) == 0 ) + { + output_config = IVAS_AUDIO_CONFIG_STEREO; + } + else if ( strcmp( argv_to_upper, "5_1" ) == 0 ) + { + output_config = IVAS_AUDIO_CONFIG_5_1; + } + else if ( strcmp( argv_to_upper, "7_1" ) == 0 ) + { + output_config = IVAS_AUDIO_CONFIG_7_1; + } + else if ( strcmp( argv_to_upper, "5_1_2" ) == 0 ) + { + output_config = IVAS_AUDIO_CONFIG_5_1_2; + } + else if ( strcmp( argv_to_upper, "5_1_4" ) == 0 ) + { + output_config = IVAS_AUDIO_CONFIG_5_1_4; + } + else if ( strcmp( argv_to_upper, "7_1_4" ) == 0 ) + { + output_config = IVAS_AUDIO_CONFIG_7_1_4; + } + else if ( strcmp( argv_to_upper, "FOA" ) == 0 ) + { + output_config = IVAS_AUDIO_CONFIG_FOA; + } + else if ( strcmp( argv_to_upper, "HOA2" ) == 0 ) + { + output_config = IVAS_AUDIO_CONFIG_HOA2; + } + else if ( strcmp( argv_to_upper, "HOA3" ) == 0 ) + { + output_config = IVAS_AUDIO_CONFIG_HOA3; + } + else if ( strcmp( argv_to_upper, "BINAURAL" ) == 0 ) + { + output_config = IVAS_AUDIO_CONFIG_BINAURAL; + } + else if ( strcmp( argv_to_upper, "BINAURAL_ROOM_IR" ) == 0 ) + { + output_config = IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR; + } + else if ( strcmp( argv_to_upper, "BINAURAL_ROOM_REVERB" ) == 0 ) + { + output_config = IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB; + } + else + { + output_config = IVAS_AUDIO_CONFIG_LS_CUSTOM; + } + + return output_config; +} + + +/*---------------------------------------------------------------------* + * parseCmdlIVAS_dec() + * + * Decoder command-line parsing + *---------------------------------------------------------------------*/ + +static bool parseCmdlIVAS_dec( + int16_t argc, + char **argv, + DecArguments *arg ) +{ + int16_t i; + char argv_to_upper[FILENAME_MAX]; + + arg->output_Fs = 48000; + arg->outputConfig = IVAS_AUDIO_CONFIG_MONO; + arg->decMode = IVAS_DEC_MODE_IVAS; + arg->quietModeEnabled = false; + arg->delayCompensationEnabled = true; + arg->voipMode = false; + arg->complexityLevel = IVAS_DEC_COMPLEXITY_LEVEL_THREE; + + arg->enableHeadRotation = false; + arg->headrotTrajFileName = NULL; + arg->orientation_tracking = ORIENT_TRK_NONE; + arg->enableReferenceRotation = false; + arg->headrotTrajFileName = NULL; + arg->enableReferenceVectorTracking = false; + arg->referenceVectorTrajFileName = NULL; + arg->enableExternalOrientation = false; + arg->externalOrientationTrajFileName = NULL; + +#ifdef SUPPORT_JBM_TRACEFILE + arg->jbmTraceFilename = NULL; +#endif + arg->jbmOffsetFilename = NULL; + + arg->FER = 0.f; + arg->FEPatternFileName = NULL; + + arg->hrtfReaderEnabled = false; + arg->hrtfFileName = NULL; + + arg->customLsOutputEnabled = false; + arg->customLsSetupFilename = NULL; + + arg->renderConfigEnabled = false; + arg->renderConfigFilename = NULL; + arg->Opt_dpid_on = 0; + + + arg->inputFormat = IVAS_DEC_INPUT_FORMAT_G192; + arg->Opt_non_diegetic_pan = 0; + arg->non_diegetic_pan_gain = 0.f; + arg->tsmEnabled = false; + arg->enable5ms = false; + arg->acousticEnvironmentId = 65535; + for ( i = 0; i < IVAS_MAX_NUM_OBJECTS; ++i ) + { + arg->directivityPatternId[i] = 65535; + } + + /*-----------------------------------------------------------------* + * Initialization + *-----------------------------------------------------------------*/ + + if ( argc < 4 ) + { + fprintf( stderr, "Error: Not enough input parameters. Exiting!\n\n" ); + usage_dec(); + return false; + } + + /*-----------------------------------------------------------------* + * Optional input arguments + *-----------------------------------------------------------------*/ + + i = 1; + + while ( argv[i][0] == '-' ) + { + strncpy( argv_to_upper, argv[i], sizeof( argv_to_upper ) - 1 ); + argv_to_upper[sizeof( argv_to_upper ) - 1] = '\0'; + to_upper( argv_to_upper ); + + if ( strcmp( argv_to_upper, "-VOIP" ) == 0 ) + { + arg->voipMode = 1; + i++; + } + else if ( strcmp( argv_to_upper, "-VOIP_HF_ONLY=0" ) == 0 ) + { + arg->voipMode = 1; + arg->inputFormat = IVAS_DEC_INPUT_FORMAT_RTPDUMP; + i++; + } + else if ( strcmp( argv_to_upper, "-VOIP_HF_ONLY=1" ) == 0 ) + { + arg->voipMode = 1; + arg->inputFormat = IVAS_DEC_INPUT_FORMAT_RTPDUMP_HF; + i++; + } +#ifdef SUPPORT_JBM_TRACEFILE + else if ( strcmp( argv_to_upper, "-TRACEFILE" ) == 0 ) + { + i++; + if ( argc - i <= 3 || argv[i][0] == '-' ) + { + fprintf( stderr, "Error: JBM Trace file name not specified!\n\n" ); + usage_dec(); + return false; + } + + arg->jbmTraceFilename = argv[i]; + i++; + } +#endif + else if ( strcmp( argv_to_upper, "-FEC_CFG_FILE" ) == 0 ) + { + i++; + if ( argc - i <= 3 || argv[i][0] == '-' ) + { + fprintf( stderr, "Error: JBM config. file name not specified!\n\n" ); + usage_dec(); + return false; + } + + arg->jbmOffsetFilename = argv[i]; + i++; + } + else if ( strcmp( argv_to_upper, "-Q" ) == 0 ) + { + arg->quietModeEnabled = true; + i++; + } + else if ( strcmp( argv_to_upper, "-NO_DELAY_CMP" ) == 0 ) + { + arg->delayCompensationEnabled = false; + i++; + } + else if ( strcmp( argv_to_upper, "-HRTF" ) == 0 ) + { + i++; + arg->hrtfReaderEnabled = true; + if ( i < argc - 3 ) + { + arg->hrtfFileName = argv[i]; + i++; + } + } + + else if ( strcmp( argv_to_upper, "-MIME" ) == 0 ) + { + arg->inputFormat = IVAS_DEC_INPUT_FORMAT_MIME; + i++; + } + else if ( strcmp( argv_to_upper, "-T" ) == 0 ) + { + arg->enableHeadRotation = true; + i++; + + if ( argc - i <= 4 || argv[i][0] == '-' ) + { + fprintf( stderr, "Error: Head rotation file name not specified!\n\n" ); + usage_dec(); + return false; + } + + arg->headrotTrajFileName = argv[i]; + i++; + } + else if ( strcmp( argv_to_upper, "-FR5" ) == 0 ) + { + arg->enable5ms = true; + i++; + } + else if ( strcmp( argv_to_upper, "-OTR" ) == 0 ) + { + + strncpy( argv_to_upper, argv[i + 1], sizeof( argv_to_upper ) - 1 ); + argv_to_upper[sizeof( argv_to_upper ) - 1] = '\0'; + to_upper( argv_to_upper ); + + if ( strcmp( argv_to_upper, "NONE" ) == 0 ) + { + arg->orientation_tracking = ORIENT_TRK_NONE; + } + else if ( strcmp( argv_to_upper, "REF" ) == 0 ) + { + arg->orientation_tracking = ORIENT_TRK_REF; + } + else if ( strcmp( argv_to_upper, "AVG" ) == 0 ) + { + arg->orientation_tracking = ORIENT_TRK_AVG; + } + else if ( strcmp( argv_to_upper, "REF_VEC" ) == 0 ) + { + arg->orientation_tracking = ORIENT_TRK_REF_VEC; + } + else if ( strcmp( argv_to_upper, "REF_VEC_LEV" ) == 0 ) + { + arg->orientation_tracking = ORIENT_TRK_REF_VEC_LEV; + } + else + { + fprintf( stderr, "Error: Invalid orientation tracking type %s \n\n", argv[i + 1] ); + usage_dec(); + return false; + } + i += 2; + } + else if ( strcmp( argv_to_upper, "-RF" ) == 0 ) + { + arg->enableReferenceRotation = true; + i++; + + if ( argc - i <= 4 || argv[i][0] == '-' ) + { + fprintf( stderr, "Error: Reference rotation file name not specified!\n\n" ); + usage_dec(); + return false; + } + + arg->refrotTrajFileName = argv[i]; + i++; + } + else if ( strcmp( argv_to_upper, "-RVF" ) == 0 ) + { + arg->enableReferenceVectorTracking = true; + i++; + + if ( argc - i <= 4 || argv[i][0] == '-' ) + { + fprintf( stderr, "Error: reference vector trajectory file name not specified!\n\n" ); + usage_dec(); + return false; + } + + arg->referenceVectorTrajFileName = argv[i]; + i++; + } + else if ( strcmp( argv_to_upper, "-EXOF" ) == 0 ) + { + arg->enableExternalOrientation = true; + i++; + + if ( argc - i <= 4 || argv[i][0] == '-' ) + { + fprintf( stderr, "Error: External orientation file name not specified!\n\n" ); + usage_dec(); + return false; + } + + arg->externalOrientationTrajFileName = argv[i]; + i++; + } + else if ( strcmp( argv_to_upper, "-RENDER_CONFIG" ) == 0 ) + { + arg->renderConfigEnabled = true; + arg->renderConfigFilename = argv[i + 1]; + + if ( arg->renderConfigFilename[0] == '\0' ) + { + fprintf( stderr, "Error: Renderer configuration file path not specified\n\n" ); + usage_dec(); + return false; + } + i += 2; + } + else if ( strcmp( argv_to_upper, "-NON_DIEGETIC_PAN" ) == 0 ) + { + i++; + arg->Opt_non_diegetic_pan = 1; + strncpy( argv_to_upper, argv[i], sizeof( argv_to_upper ) - 1 ); + argv_to_upper[sizeof( argv_to_upper ) - 1] = '\0'; + to_upper( argv_to_upper ); + if ( ( strcmp( argv_to_upper, "CENTER" ) == 0 ) || ( strchr( argv_to_upper, 'C' ) != NULL ) ) + { + arg->non_diegetic_pan_gain = 0.f; + } + else if ( ( strcmp( argv_to_upper, "LEFT" ) == 0 ) || ( strchr( argv_to_upper, 'L' ) != NULL ) ) + { + arg->non_diegetic_pan_gain = 1.f; + } + else if ( ( strcmp( argv_to_upper, "RIGHT" ) == 0 ) || ( strchr( argv_to_upper, 'R' ) != NULL ) ) + { + arg->non_diegetic_pan_gain = -1.f; + } + else + { + arg->non_diegetic_pan_gain = (float) atof( argv_to_upper ) / 90.f; + + if ( arg->non_diegetic_pan_gain > 1.0f || arg->non_diegetic_pan_gain < -1.0f ) + { + fprintf( stderr, "Error: Incorrect value for panning gain value specified: %s\n\n", argv[i] ); + usage_dec(); + return false; + } + } + i++; + } + else if ( strcmp( argv_to_upper, "-LEVEL" ) == 0 ) + { + int16_t level; + + ++i; + level = (int16_t) atoi( argv[i++] ); + if ( level < IVAS_DEC_COMPLEXITY_LEVEL_ONE || level > IVAS_DEC_COMPLEXITY_LEVEL_THREE ) + { + fprintf( stdout, "Invalid complexity level specified.\n" ); + usage_dec(); + return false; + } + else if ( level == IVAS_DEC_COMPLEXITY_LEVEL_ONE || level == IVAS_DEC_COMPLEXITY_LEVEL_TWO ) + { + fprintf( stdout, "Complexity levels 1 and 2 will be defined after characterisation - default to level 3 (full functionality).\n" ); + } + } + else if ( strcmp( argv_to_upper, "-AEID" ) == 0 ) + { + ++i; + if ( argc - i <= 4 ) + { + fprintf( stderr, "Error: Acoustic environment ID not specified!\n\n" ); + usage_dec(); + return false; + } + + if ( !is_digits_only( argv[i] ) ) + { + fprintf( stdout, "Error: Invalid acoustic environment ID specified: %s\n\n", argv[i] ); + usage_dec(); + return false; + } + arg->acousticEnvironmentId = (int16_t) atoi( argv[i++] ); + } + else if ( strcmp( argv_to_upper, "-DPID" ) == 0 ) + { + int16_t id, tmp; + + arg->Opt_dpid_on = 1; + ++i; + tmp = 0; + while ( is_number( argv[i + tmp] ) && tmp < IVAS_MAX_NUM_OBJECTS ) + { + id = (int16_t) atoi( argv[i + tmp] ); + + if ( !is_digits_only( argv[i + tmp] ) || id < 0 ) + { + fprintf( stdout, "Error: Invalid directivity pattern ID specified: %s\n\n", argv[i + tmp] ); + usage_dec(); + return false; + } + + arg->directivityPatternId[tmp] = id; + ++tmp; + } + + if ( tmp == 0 ) + { + if ( argc - i <= 4 || argv[i][0] == '-' ) + { + fprintf( stderr, "Error: Directivity pattern ID not specified!\n\n" ); + usage_dec(); + return false; + } + + if ( !is_digits_only( argv[i + tmp] ) ) + { + fprintf( stdout, "Error: Invalid directivity pattern ID specified: %s\n\n", argv[i + tmp] ); + usage_dec(); + return false; + } + } + + i += tmp; + } + + /*-----------------------------------------------------------------* + * Option not recognized + *-----------------------------------------------------------------*/ + else + { + fprintf( stderr, "Error: Unknown option %s or wrong number of parameters!\n\n", argv[i] ); + usage_dec(); + return false; + } + + } /* end of while */ + + + /*-----------------------------------------------------------------* + * Mandatory input arguments + *-----------------------------------------------------------------*/ + + if ( i < argc - 3 ) + { + arg->outputConfig = cmdline2config( argv[i] ); + if ( arg->outputConfig == IVAS_AUDIO_CONFIG_LS_CUSTOM ) + { + arg->customLsOutputEnabled = true; + arg->customLsSetupFilename = argv[i]; + } + i++; + if ( ( arg->Opt_non_diegetic_pan ) && ( arg->outputConfig != IVAS_AUDIO_CONFIG_STEREO ) ) + { + fprintf( stderr, "Error: non-diegetic panning is supported in stereo only\n\n" ); + usage_dec(); + return false; + } + } + else + { + arg->outputConfig = IVAS_AUDIO_CONFIG_MONO; + arg->decMode = IVAS_DEC_MODE_EVS; + if ( ( arg->Opt_non_diegetic_pan ) ) + { + arg->outputConfig = IVAS_AUDIO_CONFIG_STEREO; + } + } + + /*-----------------------------------------------------------------* + * Output sampling frequency + *-----------------------------------------------------------------*/ + + if ( i < argc - 2 ) + { + arg->output_Fs = (int32_t) atoi( argv[i] ) * 1000; + i++; + } + else + { + fprintf( stderr, "Error: Sampling rate is not specified\n\n" ); + usage_dec(); + return false; + } + + /*-----------------------------------------------------------------* + * Input bitstream file + *-----------------------------------------------------------------*/ + + if ( i < argc - 1 ) + { + arg->inputBitstreamFilename = argv[i]; + i++; + } + else + { + fprintf( stderr, "Error: no input bitstream file specified\n\n" ); + usage_dec(); + return false; + } + + /*-----------------------------------------------------------------* + * Output synthesis file name + *-----------------------------------------------------------------*/ + + if ( i < argc ) + { + arg->outputWavFilename = argv[i]; + i++; + } + else + { + fprintf( stderr, "Error: no output synthesis file specified\n\n" ); + usage_dec(); + return false; + } + + if ( ( !arg->enableHeadRotation ) && ( !arg->enableExternalOrientation ) && ( !arg->tsmEnabled ) ) + { + arg->enable5ms = false; + } + + return true; +} + + +/*---------------------------------------------------------------------* + * usage_dec() + * + * Print the usage of the "ivas_dec" program + *---------------------------------------------------------------------*/ + +static void usage_dec( void ) +{ + fprintf( stdout, "Usage for EVS: IVAS_dec.exe [Options] Fs bitstream_file output_file\n" ); + fprintf( stdout, "Usage for IVAS: IVAS_dec.exe [Options] OutputConf Fs bitstream_file output_file\n\n" ); + + fprintf( stdout, "Mandatory parameters:\n" ); + fprintf( stdout, "---------------------\n" ); + fprintf( stdout, "OutputConf : Output configuration: MONO, STEREO, 5_1, 7_1, 5_1_2, 5_1_4, 7_1_4, FOA,\n" ); + fprintf( stdout, " HOA2, HOA3, BINAURAL, BINAURAL_ROOM_IR, BINAURAL_ROOM_REVERB, EXT\n" ); + fprintf( stdout, " By default, channel order and loudspeaker positions are equal to the\n" ); + fprintf( stdout, " encoder. For loudspeaker outputs, OutputConf can be a custom loudspeaker\n" ); + fprintf( stdout, " layout file. See readme.txt for details.\n" ); + fprintf( stdout, " Parameter is only used when decoding IVAS bitstream.\n" ); + fprintf( stdout, "Fs : Output sampling rate in kHz (8, 16, 32 or 48)\n" ); + fprintf( stdout, "bitstream_file : Input bitstream filename or RTP packet filename (in VOIP mode)\n" ); + fprintf( stdout, "output_file : Output audio filename \n\n" ); + + fprintf( stdout, "Options:\n" ); + fprintf( stdout, "--------\n" ); + fprintf( stdout, "-VOIP : VoIP mode: RTP in G192\n" ); + fprintf( stdout, "-VOIP_hf_only=0 : VoIP mode: EVS RTP Payload Format hf_only=0 in rtpdump\n" ); + fprintf( stdout, "-VOIP_hf_only=1 : VoIP mode: EVS RTP Payload Format hf_only=1 in rtpdump\n" ); + fprintf( stdout, " The decoder may read rtpdump files containing TS26.445 Annex A.2.2\n" ); + fprintf( stdout, " EVS RTP Payload Format. The SDP parameter hf_only is required.\n" ); + fprintf( stdout, " Reading RFC4867 AMR/AMR-WB RTP payload format is not supported.\n" ); +#ifdef SUPPORT_JBM_TRACEFILE + fprintf( stdout, "-Tracefile TF : VoIP mode: Generate trace file named TF\n" ); +#endif + fprintf( stdout, "-fr5 : option to perform rendering + head-tracking with 5ms frame size\n" ); + fprintf( stdout, "-fec_cfg_file : Optimal channel aware configuration computed by the JBM \n" ); + fprintf( stdout, " as described in Section 6.3.1 of TS26.448. The output is \n" ); + fprintf( stdout, " written into a .txt file. Each line contains the FER indicator \n" ); + fprintf( stdout, " (HI|LO) and optimal FEC offset. \n" ); + fprintf( stdout, "-no_delay_cmp : Turn off delay compensation\n" ); + fprintf( stdout, "-mime : Mime bitstream file format\n" ); + fprintf( stdout, " The decoder may read both TS26.445 Annex.2.6 and RFC4867 Mime Storage\n" ); + fprintf( stdout, " Format files, the magic word in the mime file is used to determine\n" ); + fprintf( stdout, " which of the two supported formats is in use.\n" ); + fprintf( stdout, " default bitstream file format is G.192\n" ); + fprintf( stdout, "-hrtf File : HRTF filter File used in BINAURAL output configuration\n" ); + fprintf( stdout, "-T File : Head rotation specified by external trajectory File\n" ); + fprintf( stdout, "-otr tracking_type : Head orientation tracking type: 'none', 'ref', 'avg', 'ref_vec' \n" ); + fprintf( stdout, " or 'ref_vec_lev' (only for binaural rendering)\n" ); + fprintf( stdout, "-rf File : Reference rotation specified by external trajectory File\n" ); + fprintf( stdout, " works only in combination with '-otr ref' mode \n" ); + fprintf( stdout, "-rvf File : Reference vector specified by external trajectory File\n" ); + fprintf( stdout, " works only in combination with '-otr ref_vec' and 'ref_vec_lev' modes\n" ); + fprintf( stdout, "-render_config File : Renderer configuration File\n" ); + fprintf( stdout, "-non_diegetic_pan P : panning mono non-diegetic sound to stereo with paning P, -90<= P <=90,\n" ); + fprintf( stdout, " left or l or 90->left, right or r or -90->right, center or c or 0->middle\n" ); + fprintf( stdout, "-exof File : External orientation File for external orientation trajectory\n" ); + fprintf( stdout, "-dpid ID : Directivity pattern ID(s) = [ID1, ID2, ID3, ID4]. Space-separated list of up\n" ); + fprintf( stdout, " to 4 numbers (unsigned integers) can be specified for BINAURAL and BINAURAL_ROOM_REVERB\n" ); + fprintf( stdout, " output configuration. ID1, ID2, ID3, ID4 specify the directivity pattern IDs used for\n" ); + fprintf( stdout, " ISMs 1,2,3 and 4 respectively. This options needs to be accompanied by a render_config file,\n" ); + fprintf( stdout, " otherwise a default directivity pattern is used.\n" ); + fprintf( stdout, "-aeid ID : Acoustic environment ID (number >= 0) for BINAURAL_ROOM_REVERB output configuration\n" ); + fprintf( stdout, "-level level : Complexity level, level = (1, 2, 3), will be defined after characterisation. \n" ); + fprintf( stdout, " Currently, all values default to level 3 (full functionality).\n" ); + fprintf( stdout, "-q : Quiet mode, no frame counter\n" ); + fprintf( stdout, " default is deactivated\n" ); + fprintf( stdout, "\n" ); + + return; +} + + + +/*---------------------------------------------------------------------* + * initOnFirstGoodFrame() + * + * + *---------------------------------------------------------------------*/ + +static ivas_error initOnFirstGoodFrame( + IVAS_DEC_HANDLE hIvasDec, /* i/o: */ + const DecArguments arg, /* i : */ + const int16_t numInitialBadFrames, /* i : */ + const uint16_t numOutSamples, /* i : */ + int16_t *pFullDelayNumSamples, /* o : */ + int16_t *pRemainingDelayNumSamples, /* o : */ + int32_t *delayTimeScale, /* o : */ + IVAS_DEC_BS_FORMAT *pBsFormat, /* i/o: */ + AudioFileWriter **ppAfWriter, /* o : */ + MasaFileWriter **ppMasaWriter, /* o : */ + IsmFileWriter *ismWriters[IVAS_MAX_NUM_OBJECTS], /* o : */ + int16_t *pNumOutChannels, /* o : */ + uint16_t *pNumObj /* o : */ +) +{ + ivas_error error = IVAS_ERR_UNKNOWN; + + /* Now delay, number of output channels and frame size are known */ + if ( ( error = IVAS_DEC_GetDelay( hIvasDec, pFullDelayNumSamples, delayTimeScale ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nUnable to get delay of decoder: %s\n", ivas_error_to_string( error ) ); + return error; + } + + + if ( !arg.delayCompensationEnabled ) + { + pFullDelayNumSamples[0] = 0; + } + *pRemainingDelayNumSamples = pFullDelayNumSamples[0]; + + if ( ( error = IVAS_DEC_GetNumOutputChannels( hIvasDec, pNumOutChannels ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_DEC_GetNumOutputChannels, code: %d\n", error ); + return error; + } + + int32_t pcmFrameSize; + + if ( ( error = IVAS_DEC_GetPcmFrameSize( hIvasDec, &pcmFrameSize ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_DEC_GetPcmFrameSize, error code: %d\n", error ); + return error; + } + + /* Open audio writer and write all previously skipped bad frames now that frame size is known */ + if ( ( error = AudioFileWriter_open( ppAfWriter, arg.outputWavFilename, arg.output_Fs, *pNumOutChannels ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nUnable to open output file %s\n", arg.outputWavFilename ); + return error; + } + + int16_t *zeroBuf = malloc( pcmFrameSize * sizeof( int16_t ) ); + memset( zeroBuf, 0, pcmFrameSize * sizeof( int16_t ) ); + + for ( int16_t i = 0; i < numInitialBadFrames; ++i ) + { + + if ( *pRemainingDelayNumSamples < numOutSamples ) + { + if ( ( error = AudioFileWriter_write( *ppAfWriter, zeroBuf, numOutSamples * *pNumOutChannels - ( *pRemainingDelayNumSamples * *pNumOutChannels ) ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nOutput audio file writer error\n" ); + return error; + } + *pRemainingDelayNumSamples = 0; + } + else + { + *pRemainingDelayNumSamples -= numOutSamples; + } + } + + free( zeroBuf ); + + /* Open other output files if EXT output config - now details about ISM or MASA are known */ + if ( arg.outputConfig == IVAS_AUDIO_CONFIG_EXTERNAL ) + { + if ( ( error = IVAS_DEC_GetFormat( hIvasDec, pBsFormat ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_DEC_GetFormat, code: %d\n", error ); + return error; + } + + /* If outputting ISM, get number of objects, open output files and write zero metadata for initial bad frames */ + if ( *pBsFormat == IVAS_DEC_BS_OBJ || *pBsFormat == IVAS_DEC_BS_MASA_ISM || *pBsFormat == IVAS_DEC_BS_SBA_ISM ) + { + if ( ( error = IVAS_DEC_GetNumObjects( hIvasDec, pNumObj ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_DEC_GetNumObjects: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + return error; + } + + for ( int16_t i = 0; i < *pNumObj; ++i ) + { + if ( ( error = IsmFileWriter_open( arg.outputWavFilename, i, &ismWriters[i] ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError: Error opening ISM decoded metadata file %s\n", IsmFileWriter_getFilePath( ismWriters[i] ) ); + return error; + } + } + + for ( int16_t j = 0; j < numInitialBadFrames; ++j ) + { + /* write zero metadata */ + for ( int16_t i = 0; i < *pNumObj; ++i ) + { + IVAS_ISM_METADATA IsmMetadata; + + if ( ( error = IVAS_DEC_GetObjectMetadata( hIvasDec, &IsmMetadata, 1, i ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_DEC_GetObjectMetadata: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + return error; + } + + if ( ( error = IsmFileWriter_writeFrame( IsmMetadata, ismWriters[i] ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError writing ISM metadata to file %s\n", IsmFileWriter_getFilePath( ismWriters[i] ) ); + return error; + } + } + } + } + + /* If outputting MASA, open output file and write metadata for initial bad frames */ + if ( *pBsFormat == IVAS_DEC_BS_MASA || *pBsFormat == IVAS_DEC_BS_MASA_ISM ) + { + if ( ( error = MasaFileWriter_open( arg.outputWavFilename, arg.delayCompensationEnabled, ppMasaWriter ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError: Error opening MASA decoded metadata file %s\n", MasaFileWriter_getFilePath( *ppMasaWriter ) ); + return error; + } + + if ( numInitialBadFrames > 0 ) + { + /* Duplicate good first frame metadata to fill the beginning of stream. */ + IVAS_MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta = NULL; + if ( ( error = IVAS_DEC_GetMasaMetadata( hIvasDec, &hMasaExtOutMeta, 0 ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_DEC_GetMasaMetadata: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + return error; + } + + for ( int16_t j = 0; j < numInitialBadFrames; ++j ) + { + if ( ( error = MasaFileWriter_writeFrame( *ppMasaWriter, hMasaExtOutMeta ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError writing MASA metadata to file: %s\n", MasaFileWriter_getFilePath( *ppMasaWriter ) ); + return error; + } + } + } + } + } + + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * decodeG192() + * + * Read G.192 bitstream and decode in regular decoder + *---------------------------------------------------------------------*/ + +static ivas_error decodeG192( + DecArguments arg, + BS_READER_HANDLE hBsReader, + RotFileReader *headRotReader, + RotFileReader *externalOrientationFileReader, + RotFileReader *refRotReader, + Vector3PairFileReader *referenceVectorReader, + IVAS_DEC_HANDLE hIvasDec, + int16_t *pcmBuf ) + +{ + bool decodingFailed = true; /* Assume failure until cleanup is reached without errors */ + uint16_t bit_stream[IVAS_MAX_BITS_PER_FRAME + 4 * 8]; + int16_t i, num_bits; + int16_t bfi = 0; + AudioFileWriter *afWriter = NULL; + MasaFileWriter *masaWriter = NULL; + bool decodedGoodFrame = false; + int16_t numInitialBadFrames = 0; /* Number of bad frames received until first good frame is decoded */ + int16_t nOutChannels = 0; + int16_t delayNumSamples = -1; + int16_t delayNumSamples_orig[3]; + int16_t nOutSamples = 0; + int32_t delayTimeScale = 0; + ivas_error error = IVAS_ERR_UNKNOWN; + uint16_t numObj = 0; + IVAS_DEC_BS_FORMAT bsFormat = IVAS_DEC_BS_UNKOWN; + uint16_t nSamplesAvailableNext; + bool needNewFrame; + int16_t nSamplesRendered, nSamplesRendered_loop, nSamplesToRender; + IsmFileWriter *ismWriters[IVAS_MAX_NUM_OBJECTS]; + IVAS_VECTOR3 Pos[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES] = { { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 } }; + int16_t vec_pos_update, vec_pos_len; + + for ( i = 0; i < IVAS_MAX_NUM_OBJECTS; ++i ) + { + ismWriters[i] = NULL; + } + + /* we always start with needing a new frame */ + needNewFrame = true; + + + if ( !arg.quietModeEnabled ) + { + fprintf( stdout, "\n------ Running the decoder ------\n\n" ); + fprintf( stdout, "Frames processed: " ); + } + else + { + fprintf( stdout, "\n-- Start the decoder (quiet mode) --\n\n" ); + } + + delayNumSamples_orig[0] = -1; + +#ifdef WMOPS + reset_stack(); + reset_wmops(); +#endif + nSamplesAvailableNext = 0; + + vec_pos_update = 0; + if ( arg.enableHeadRotation && arg.enable5ms ) + { + nOutSamples = (int16_t) ( arg.output_Fs / 1000 * HEADROTATION_FETCH_FRAMESIZE_MS ); + vec_pos_len = IVAS_MAX_PARAM_SPATIAL_SUBFRAMES; + } + else + { + nOutSamples = (int16_t) ( arg.output_Fs / 1000 * DEFAULT_FETCH_FRAMESIZE_MS ); + vec_pos_len = 1; + } + + /*------------------------------------------------------------------------------------------* + * Loop for every packet (frame) of bitstream data + * - Read the bitstream packet + * - Run the decoder + * - Write the synthesized signal into output file + *------------------------------------------------------------------------------------------*/ + + while ( 1 ) + { + /* Read next frame if not enough samples availble */ + + /* reference vector */ + if ( arg.enableReferenceVectorTracking && vec_pos_update == 0 ) + { + IVAS_VECTOR3 listenerPosition, referencePosition; + if ( ( error = Vector3PairFileReader_read( referenceVectorReader, &listenerPosition, &referencePosition ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError %s while reading listener and reference positions from %s\n", IVAS_DEC_GetErrorMessage( error ), Vector3PairFileReader_getFilePath( referenceVectorReader ) ); + goto cleanup; + } + + if ( ( error = IVAS_DEC_FeedRefVectorData( hIvasDec, listenerPosition, referencePosition ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_DEC_FeedRefVectorData failed: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + } + + /* Reference rotation */ + if ( arg.enableReferenceRotation && vec_pos_update == 0 ) + { + IVAS_QUATERNION quaternion; + if ( ( error = HeadRotationFileReading( refRotReader, &quaternion, NULL ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError %s while reading reference rotation from %s\n", IVAS_DEC_GetErrorMessage( error ), RotationFileReader_getFilePath( refRotReader ) ); + goto cleanup; + } + + if ( ( error = IVAS_DEC_FeedRefRotData( hIvasDec, quaternion ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_DEC_FeedRefRotData failed: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + } + + int16_t enable5ms, num_subframes; + if ( ( error = IVAS_DEC_Get5msFlag( hIvasDec, &enable5ms ) ) != IVAS_ERR_OK ) + { + return error; + } + arg.enable5ms = enable5ms; + num_subframes = ( arg.enable5ms ) ? 1 : IVAS_MAX_PARAM_SPATIAL_SUBFRAMES; + + /* Head-tracking input simulation */ + /* Head-tracking input simulation */ + if ( arg.enableHeadRotation ) + { + IVAS_QUATERNION Quaternions[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES]; + + for ( i = 0; i < num_subframes; i++ ) + { + if ( ( error = HeadRotationFileReading( headRotReader, &Quaternions[i], &Pos[i] ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError %s while reading head orientation from %s\n", IVAS_DEC_GetErrorMessage( error ), RotationFileReader_getFilePath( headRotReader ) ); + goto cleanup; + } + } + + for ( i = 0; i < num_subframes; i++ ) + { + if ( ( error = IVAS_DEC_FeedHeadTrackData( hIvasDec, Quaternions[i], Pos[i], i ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_DEC_FeedHeadTrackData failed: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + } + } + + if ( arg.enableExternalOrientation ) + { + IVAS_QUATERNION Quaternions[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES]; + int8_t enableHeadRotation[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES]; + int8_t enableExternalOrientation[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES]; + int8_t enableRotationInterpolation[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES]; + int16_t numFramesToTargetOrientation[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES]; + + for ( i = 0; i < num_subframes; i++ ) + { + if ( ( error = ExternalOrientationFileReading( externalOrientationFileReader, &Quaternions[i], &enableHeadRotation[i], &enableExternalOrientation[i], &enableRotationInterpolation[i], &numFramesToTargetOrientation[i] ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError %s while reading external orientation from %s\n", IVAS_DEC_GetErrorMessage( error ), RotationFileReader_getFilePath( externalOrientationFileReader ) ); + goto cleanup; + } + } + for ( i = 0; i < num_subframes; i++ ) + { + if ( ( error = IVAS_DEC_FeedExternalOrientationData( hIvasDec, Quaternions[i], enableHeadRotation[i], enableExternalOrientation[i], enableRotationInterpolation[i], numFramesToTargetOrientation[i], i ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_DEC_FeedExternalOrientationData failed: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + } + } + + /* decode and get samples */ + nSamplesRendered = 0; + nSamplesToRender = nOutSamples; + do + { + if ( needNewFrame ) + { + if ( ( error = BS_Reader_ReadFrame_short( hBsReader, bit_stream, &num_bits, &bfi ) ) != IVAS_ERR_OK ) + { + if ( error == IVAS_ERR_END_OF_FILE ) + { + break; + } + fprintf( stderr, "\nError: input bitstream file couldn't be read: %s \n\n", arg.inputBitstreamFilename ); + goto cleanup; + } + + /* Feed into decoder */ + if ( ( error = IVAS_DEC_FeedFrame_Serial( hIvasDec, bit_stream, num_bits, bfi ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError: could not feed frame to decoder: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + } + + if ( ( error = IVAS_DEC_GetSamples( hIvasDec, nSamplesToRender, ( pcmBuf + nOutChannels * nSamplesRendered ), &nSamplesRendered_loop, &needNewFrame ) ) != IVAS_ERR_OK ) + + { + fprintf( stderr, "\nError in IVAS_DEC_GetSamples: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + nSamplesRendered += nSamplesRendered_loop; + nSamplesToRender -= nSamplesRendered_loop; + + } while ( nSamplesRendered < nOutSamples && error == IVAS_ERR_OK ); + + if ( error == IVAS_ERR_END_OF_FILE ) + { + break; + } + + /* Continue checking for first good frame until it is found */ + if ( !decodedGoodFrame ) + { + if ( ( error = IVAS_DEC_HasDecodedFirstGoodFrame( hIvasDec, &decodedGoodFrame ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_DEC_HasDecodedFirstGoodFrame, code: %d\n", error ); + goto cleanup; + } + + /* Once good frame decoded, catch up */ + if ( decodedGoodFrame ) + { + if ( ( error = initOnFirstGoodFrame( hIvasDec, arg, numInitialBadFrames, nOutSamples, delayNumSamples_orig, &delayNumSamples, &delayTimeScale, &bsFormat, &afWriter, &masaWriter, ismWriters, &nOutChannels, &numObj ) ) != IVAS_ERR_OK ) + { + goto cleanup; + } + } + else + { + ++numInitialBadFrames; + } + } + + /* Write current frame */ + if ( decodedGoodFrame ) + { + if ( delayNumSamples < nOutSamples ) + { + if ( ( error = AudioFileWriter_write( afWriter, &pcmBuf[delayNumSamples * nOutChannels], nOutSamples * nOutChannels - ( delayNumSamples * nOutChannels ) ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nOutput audio file writer error\n" ); + goto cleanup; + } + delayNumSamples = 0; + } + else + { + delayNumSamples -= nOutSamples; + } + } + + /* Write ISm metadata to external file(s) */ + if ( decodedGoodFrame && arg.outputConfig == IVAS_AUDIO_CONFIG_EXTERNAL ) + { + if ( bsFormat == IVAS_DEC_BS_OBJ || bsFormat == IVAS_DEC_BS_MASA_ISM || bsFormat == IVAS_DEC_BS_SBA_ISM ) + { + if ( ( error = IVAS_DEC_GetNumObjects( hIvasDec, &numObj ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_DEC_GetNumObjects: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + + for ( i = 0; i < numObj; ++i ) + { + IVAS_ISM_METADATA IsmMetadata; + + if ( ( error = IVAS_DEC_GetObjectMetadata( hIvasDec, &IsmMetadata, 0, i ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_DEC_GetObjectMetadata: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + + if ( ( IsmFileWriter_writeFrame( IsmMetadata, ismWriters[i] ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError writing ISM metadata to file %s\n", IsmFileWriter_getFilePath( ismWriters[i] ) ); + goto cleanup; + } + } + } + + if ( bsFormat == IVAS_DEC_BS_MASA || bsFormat == IVAS_DEC_BS_MASA_ISM ) + { + IVAS_MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta; + if ( ( error = IVAS_DEC_GetMasaMetadata( hIvasDec, &hMasaExtOutMeta, 0 ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_DEC_GetMasaMetadata: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + + if ( ( error = MasaFileWriter_writeFrame( masaWriter, hMasaExtOutMeta ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError writing MASA metadata to file: %s\n", MasaFileWriter_getFilePath( masaWriter ) ); + goto cleanup; + } + } + } + vec_pos_update = ( vec_pos_update + 1 ) % vec_pos_len; + if ( needNewFrame ) + { + frame++; + if ( !arg.quietModeEnabled ) + { + fprintf( stdout, "%-8d\b\b\b\b\b\b\b\b", frame ); + } + } +#ifdef WMOPS + if ( vec_pos_update == 0 ) + { + update_wmops(); + update_mem(); +#ifdef MEM_COUNT_DETAILS + export_mem( "mem_analysis.csv" ); +#endif + } +#endif + } + + /*------------------------------------------------------------------------------------------* + * Flush what is still left in the VoIP Buffers.... + *------------------------------------------------------------------------------------------*/ + + while ( nSamplesAvailableNext > 0 ) + { + int16_t nSamplesFlushed; + + /* Feed into decoder */ + + /* reference vector */ + if ( arg.enableReferenceVectorTracking ) + { + IVAS_VECTOR3 listenerPosition, referencePosition; + if ( ( error = Vector3PairFileReader_read( referenceVectorReader, &listenerPosition, &referencePosition ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError %s while reading listener and reference positions from %s\n", IVAS_DEC_GetErrorMessage( error ), Vector3PairFileReader_getFilePath( referenceVectorReader ) ); + goto cleanup; + } + + if ( ( error = IVAS_DEC_FeedRefVectorData( hIvasDec, listenerPosition, referencePosition ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_DEC_FeedRefVectorData failed: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + } + + /* Reference rotation */ + if ( arg.enableReferenceRotation ) + { + IVAS_QUATERNION quaternion; + if ( ( error = HeadRotationFileReading( refRotReader, &quaternion, NULL ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError %s while reading reference rotation from %s\n", IVAS_DEC_GetErrorMessage( error ), RotationFileReader_getFilePath( refRotReader ) ); + goto cleanup; + } + + if ( ( error = IVAS_DEC_FeedRefRotData( hIvasDec, quaternion ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_DEC_FeedRefRotData failed: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + } + + /* Head-tracking input simulation */ + if ( arg.enableHeadRotation ) + { + IVAS_QUATERNION Quaternion; + if ( ( error = HeadRotationFileReading( headRotReader, &Quaternion, &Pos[0] ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError %s while reading head orientation from %s\n", IVAS_DEC_GetErrorMessage( error ), RotationFileReader_getFilePath( headRotReader ) ); + goto cleanup; + } + + if ( ( error = IVAS_DEC_FeedHeadTrackData( hIvasDec, Quaternion, Pos[0], 0 ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_DEC_FeedHeadTrackData failed: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + } + + /* decode and get samples */ + if ( ( error = IVAS_DEC_Flush( hIvasDec, nOutSamples, pcmBuf, &nSamplesFlushed ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_DEC_VoIP_Flush: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + + /* Write current frame */ + if ( ( error = AudioFileWriter_write( afWriter, pcmBuf, nSamplesFlushed * nOutChannels ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nOutput audio file writer error\n" ); + goto cleanup; + } + + /* Write ISm metadata to external file(s) */ + if ( decodedGoodFrame && arg.outputConfig == IVAS_AUDIO_CONFIG_EXTERNAL ) + { + if ( bsFormat == IVAS_DEC_BS_OBJ || bsFormat == IVAS_DEC_BS_MASA_ISM || bsFormat == IVAS_DEC_BS_SBA_ISM ) + { + if ( ( error = IVAS_DEC_GetNumObjects( hIvasDec, &numObj ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_DEC_GetNumObjects: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + + for ( i = 0; i < numObj; ++i ) + { + IVAS_ISM_METADATA IsmMetadata; + + if ( ( error = IVAS_DEC_GetObjectMetadata( hIvasDec, &IsmMetadata, 0, i ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_DEC_GetObjectMetadata: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + + if ( ( IsmFileWriter_writeFrame( IsmMetadata, ismWriters[i] ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError writing ISM metadata to file %s\n", IsmFileWriter_getFilePath( ismWriters[i] ) ); + goto cleanup; + } + } + } + + if ( bsFormat == IVAS_DEC_BS_MASA || bsFormat == IVAS_DEC_BS_MASA_ISM ) + { + IVAS_MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta; + if ( ( error = IVAS_DEC_GetMasaMetadata( hIvasDec, &hMasaExtOutMeta, 0 ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_DEC_GetMasaMetadata: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + + if ( ( error = MasaFileWriter_writeFrame( masaWriter, hMasaExtOutMeta ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError writing MASA metadata to file: %s\n", MasaFileWriter_getFilePath( masaWriter ) ); + goto cleanup; + } + } + } + + frame++; + if ( !arg.quietModeEnabled ) + { + fprintf( stdout, "%-8d\b\b\b\b\b\b\b\b", frame ); + } + } + + /*------------------------------------------------------------------------------------------* + * Printouts after decoding has finished + *------------------------------------------------------------------------------------------*/ + + if ( !arg.quietModeEnabled ) + { + printf( "\n\nDecoder+renderer delay: %4.2f ms (%3u samples at timescale %5u)\n", 1000.f * delayNumSamples_orig[1] / (float) delayTimeScale, delayNumSamples_orig[1], delayTimeScale ); + + if ( delayNumSamples_orig[2] > 0 ) + { + printf( "HRIR/BRIR delay: %4.2f ms (%3u samples at timescale %5u)\n", 1000.f * delayNumSamples_orig[2] / (float) delayTimeScale, delayNumSamples_orig[2], delayTimeScale ); + printf( "Total delay: %4.2f ms (%3u samples at timescale %5u)\n", 1000.f * ( delayNumSamples_orig[1] + delayNumSamples_orig[2] ) / (float) delayTimeScale, delayNumSamples_orig[1] + delayNumSamples_orig[2], delayTimeScale ); + } + } + + /* Print output metadata file name(s) */ + if ( arg.outputConfig == IVAS_AUDIO_CONFIG_EXTERNAL ) + { + if ( bsFormat == IVAS_DEC_BS_OBJ || bsFormat == IVAS_DEC_BS_MASA_ISM || bsFormat == IVAS_DEC_BS_SBA_ISM ) + { + for ( i = 0; i < numObj; i++ ) + { + fprintf( stdout, "\nOutput ISM metadata file: %s", IsmFileWriter_getFilePath( ismWriters[i] ) ); + } + fprintf( stdout, "\n" ); + } + + if ( bsFormat == IVAS_DEC_BS_MASA || bsFormat == IVAS_DEC_BS_MASA_ISM ) + { + fprintf( stdout, "\nOutput MASA metadata file: %s\n", MasaFileWriter_getFilePath( masaWriter ) ); + } + } + + /*------------------------------------------------------------------------------------------* + * Add zeros at the end to have equal length of synthesized signals + *------------------------------------------------------------------------------------------*/ + + memset( pcmBuf, 0, delayNumSamples_orig[0] * nOutChannels * sizeof( int16_t ) ); + if ( ( error = AudioFileWriter_write( afWriter, pcmBuf, delayNumSamples_orig[0] * nOutChannels ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError writing output file: %s\n", ivas_error_to_string( error ) ); + goto cleanup; + } + + /*------------------------------------------------------------------------------------------* + * Close files and deallocate resources + *------------------------------------------------------------------------------------------*/ + + decodingFailed = false; /* This will stay set to true if cleanup is reached via a goto due to an error */ + +cleanup: + + AudioFileWriter_close( &afWriter ); + MasaFileWriter_close( &masaWriter ); + for ( i = 0; i < IVAS_MAX_NUM_OBJECTS; i++ ) + { + IsmFileWriter_close( &ismWriters[i] ); + } + + if ( decodingFailed && error == IVAS_ERR_OK ) + { + return IVAS_ERR_UNKNOWN; + } + + return error; +} + + +#ifdef SUPPORT_JBM_TRACEFILE +static ivas_error writeJbmTraceFileFrameWrapper( const void *data, void *writer ) +{ + return JbmTraceFileWriter_writeFrame( data, writer ); +} +#endif + + +/*---------------------------------------------------------------------* + * decodeVoIP() + * + * Read G.192 or RTPDUMP bitstream and decode in VOIP + *---------------------------------------------------------------------*/ + +static ivas_error decodeVoIP( + DecArguments arg, + BS_READER_HANDLE hBsReader, + IVAS_DEC_HANDLE hIvasDec ) +{ + bool decodingFailed = true; /* Assume failure until cleanup is reached without errors */ + ivas_error error = IVAS_ERR_OK; + + uint32_t nextPacketRcvTime_ms = 0; + uint32_t systemTime_ms = 0; + uint32_t systemTimeInc_ms = (uint32_t) JBM_FRONTEND_FETCH_FRAMESIZE_MS; + int32_t nFramesFed = 0; + + uint8_t au[( IVAS_MAX_BITS_PER_FRAME + 7 ) >> 3]; + int16_t auSize; + uint16_t rtpSequenceNumber; + uint32_t rtpTimeStamp; + + bool decodedGoodFrame = false; + int16_t numInitialBadFrames = 0; /* Number of bad frames received until first good frame is decoded */ + int16_t nOutChannels = 0; + MasaFileWriter *masaWriter = NULL; + uint16_t numObj = 0; + + int16_t pcmBuf[MAX_OUTPUT_PCM_BUFFER_SIZE]; + AudioFileWriter *afWriter = NULL; +#ifdef SUPPORT_JBM_TRACEFILE + JbmTraceFileWriter *jbmTraceWriter = NULL; +#endif + JbmOffsetFileWriter *jbmOffsetWriter = NULL; + + int16_t delayNumSamples_orig[3]; /* stores: overall delay, dec+rend delay, and binauralization delay */ + int16_t delayNumSamples = -1; + int32_t delayTimeScale = -1; + int16_t i; + FILE *f_rtpstream = NULL; + EVS_RTPDUMP_DEPACKER rtpdumpDepacker; + EVS_RTPDUMP_DEPACKER_ERROR rtpdumpDepackerError = EVS_RTPDUMP_DEPACKER_NO_ERROR; + uint8_t *auPtr = NULL; + bool isAMRWB_IOmode; + uint16_t frameTypeIndex; + bool qBit; + + IVAS_DEC_BS_FORMAT bsFormat = IVAS_DEC_BS_UNKOWN; + IsmFileWriter *ismWriters[IVAS_MAX_NUM_OBJECTS]; + + for ( i = 0; i < IVAS_MAX_NUM_OBJECTS; ++i ) + { + ismWriters[i] = NULL; + } + + delayNumSamples_orig[0] = -1; + + rtpdumpDepacker.rtpdump = NULL; + switch ( arg.inputFormat ) + { + case IVAS_DEC_INPUT_FORMAT_RTPDUMP: + case IVAS_DEC_INPUT_FORMAT_RTPDUMP_HF: + f_rtpstream = fopen( arg.inputBitstreamFilename, "r" ); + + if ( f_rtpstream == NULL ) + { + fprintf( stderr, "could not open: %s\n", arg.inputBitstreamFilename ); + goto cleanup; + } + + rtpdumpDepackerError = EVS_RTPDUMP_DEPACKER_open( &rtpdumpDepacker, f_rtpstream, arg.inputFormat == IVAS_DEC_INPUT_FORMAT_RTPDUMP_HF ); + if ( rtpdumpDepackerError != EVS_RTPDUMP_DEPACKER_NO_ERROR ) + { + fprintf( stderr, "error in EVS_RTPDUMP_DEPACKER_open(): %d\n", rtpdumpDepackerError ); + goto cleanup; + } + break; + case IVAS_DEC_INPUT_FORMAT_G192: + auPtr = au; + break; + default: + fprintf( stderr, "Unsupported format of input bitstream" ); + goto cleanup; + } + + +#ifdef SUPPORT_JBM_TRACEFILE + if ( arg.jbmTraceFilename != NULL ) + { + if ( ( error = JbmTraceFileWriter_open( arg.jbmTraceFilename, &jbmTraceWriter ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Could not open: %s\n", arg.jbmTraceFilename ); + goto cleanup; + } + fprintf( stdout, "JBM trace file: %s\n", arg.jbmTraceFilename ); + } +#endif + + if ( arg.jbmOffsetFilename != NULL ) + { + if ( ( error = JbmOffsetFileWriter_open( arg.jbmOffsetFilename, &jbmOffsetWriter ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Could not open CA offset file: %s\n", arg.jbmOffsetFilename ); + goto cleanup; + } + fprintf( stdout, "JBM CA offset file: %s\n", arg.jbmOffsetFilename ); + } + + /* read first packet */ + if ( arg.inputFormat == IVAS_DEC_INPUT_FORMAT_G192 ) + { + error = BS_Reader_ReadVoipFrame_compact( hBsReader, au, &auSize, &rtpSequenceNumber, &rtpTimeStamp, &nextPacketRcvTime_ms ); + qBit = 1; /* good q_bit for INPUT_FORMAT_G192 */ + } + else + { + auPtr = au; /* might have been set to RTP packet in prev call */ + rtpdumpDepackerError = EVS_RTPDUMP_DEPACKER_readNextFrame( &rtpdumpDepacker, &rtpSequenceNumber, &rtpTimeStamp, &nextPacketRcvTime_ms, &isAMRWB_IOmode, &frameTypeIndex, &qBit, &auPtr, (uint16_t *) &auSize ); + + /* EVS RTP payload format has timescale 16000, JBM uses 1000 internally */ + rtpTimeStamp = rtpTimeStamp / 16; + } + if ( error != IVAS_ERR_OK || rtpdumpDepackerError != EVS_RTPDUMP_DEPACKER_NO_ERROR ) + { + fprintf( stderr, "failed to read first RTP packet\n" ); + goto cleanup; + } + + if ( !arg.quietModeEnabled ) + { + fprintf( stdout, "\n------ Running the decoder ------\n\n" ); + fprintf( stdout, "Frames processed: " ); + } + else + { + fprintf( stdout, "\n-- Start the decoder (quiet mode) --\n\n" ); + } + +#ifdef WMOPS + reset_stack(); + reset_wmops(); +#endif + + /*------------------------------------------------------------------------------------------* + * Main receiving/decoding loop + *------------------------------------------------------------------------------------------*/ + + + while ( 1 ) + { + int16_t nOutSamples = 0; + nOutSamples = (int16_t) ( arg.output_Fs / 1000 * JBM_FRONTEND_FETCH_FRAMESIZE_MS ); + + /* read all packets with a receive time smaller than the system time */ + while ( nextPacketRcvTime_ms <= systemTime_ms ) + { + /* feed the previous read packet into the receiver now */ + error = IVAS_DEC_VoIP_FeedFrame( hIvasDec, auPtr, auSize, rtpSequenceNumber, rtpTimeStamp, nextPacketRcvTime_ms, qBit ); + if ( error != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_DEC_VoIP_FeedFrame: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + ++nFramesFed; + + /* read the next packet */ + if ( arg.inputFormat == IVAS_DEC_INPUT_FORMAT_G192 ) + { + error = BS_Reader_ReadVoipFrame_compact( hBsReader, au, &auSize, &rtpSequenceNumber, &rtpTimeStamp, &nextPacketRcvTime_ms ); + + qBit = 1; /* good q_bit for VOIP_G192_RTP */ + } + else + { + auPtr = au; /* might have been set to RTP packet in prev call */ + rtpdumpDepackerError = EVS_RTPDUMP_DEPACKER_readNextFrame( &rtpdumpDepacker, &rtpSequenceNumber, &rtpTimeStamp, + &nextPacketRcvTime_ms, + &isAMRWB_IOmode, &frameTypeIndex, &qBit, + &auPtr, (uint16_t *) &auSize ); + /* EVS RTP payload format has timescale 16000, JBM uses 1000 internally */ + rtpTimeStamp = rtpTimeStamp / 16; + } + if ( error == IVAS_ERR_END_OF_FILE || rtpdumpDepackerError == EVS_RTPDUMP_DEPACKER_EOF ) + { + /* finished reading */ + nextPacketRcvTime_ms = (uint32_t) -1; + } + else if ( error != IVAS_ERR_OK || rtpdumpDepackerError != EVS_RTPDUMP_DEPACKER_NO_ERROR ) + { + fprintf( stderr, "\nError in BS_Reader_ReadVoipFrame_compact, error code: %d\n", error ); + goto cleanup; + } + } + + /* we are finished when all packets have been received and jitter buffer is empty */ + /* also stop when the input file contains less than two frames, because JBM cannot calculate a delay value and won't start decoding */ + /* last clause should make sure that for BE tests we end up with the same number of samples...*/ + if ( nextPacketRcvTime_ms == (uint32_t) ( -1 ) && ( IVAS_DEC_VoIP_IsEmpty( hIvasDec, nOutSamples ) || nFramesFed < 2 ) ) + { + break; + } + + + /* decode and get samples */ + +#ifdef SUPPORT_JBM_TRACEFILE + if ( ( error = IVAS_DEC_VoIP_GetSamples( hIvasDec, nOutSamples, pcmBuf, systemTime_ms, writeJbmTraceFileFrameWrapper, jbmTraceWriter ) ) != IVAS_ERR_OK ) +#else + if ( ( error = IVAS_DEC_VoIP_GetSamples( hIvasDec, nOutSamples, pcmBuf, systemTime_ms ) ) != IVAS_ERR_OK ) +#endif + { + fprintf( stderr, "\nError in IVAS_DEC_VoIP_GetSamples: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + + /* write JBM Offset file entry */ + if ( jbmOffsetWriter != NULL ) + { + int16_t optimum_offset, FEC_hi; + + if ( ( error = IVAS_DEC_VoIP_Get_CA_offset( hIvasDec, &optimum_offset, &FEC_hi ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_DEC_VoIP_Get_CA_offset: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + + if ( ( JbmOffsetFileWriter_writeFrame( FEC_hi, optimum_offset, jbmOffsetWriter ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError writing JBM Offset data to file %s\n", arg.jbmOffsetFilename ); + goto cleanup; + } + } + + /* Continue checking for first good frame until it is found */ + if ( !decodedGoodFrame ) + { + if ( ( error = IVAS_DEC_HasDecodedFirstGoodFrame( hIvasDec, &decodedGoodFrame ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error in IVAS_DEC_HasDecodedFirstGoodFrame, code: %d\n", error ); + goto cleanup; + } + + /* Once good frame decoded, catch up */ + if ( decodedGoodFrame ) + { + if ( ( error = initOnFirstGoodFrame( hIvasDec, arg, numInitialBadFrames, nOutSamples, delayNumSamples_orig, &delayNumSamples, &delayTimeScale, + &bsFormat, &afWriter, &masaWriter, ismWriters, &nOutChannels, &numObj ) ) != IVAS_ERR_OK ) + { + goto cleanup; + } + } + else + { + ++numInitialBadFrames; + } + } + + /* Write current frame */ + if ( decodedGoodFrame ) + { + if ( delayNumSamples < nOutSamples ) + { + if ( ( error = AudioFileWriter_write( afWriter, &pcmBuf[delayNumSamples * nOutChannels], nOutSamples * nOutChannels - ( delayNumSamples * nOutChannels ) ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nOutput audio file writer error\n" ); + goto cleanup; + } + delayNumSamples = 0; + } + else + { + delayNumSamples -= nOutSamples; + } + + /* Write ISM metadata to external file(s) */ + if ( decodedGoodFrame && arg.outputConfig == IVAS_AUDIO_CONFIG_EXTERNAL ) + { + if ( bsFormat == IVAS_DEC_BS_OBJ || bsFormat == IVAS_DEC_BS_MASA_ISM || bsFormat == IVAS_DEC_BS_SBA_ISM ) + { + if ( ( error = IVAS_DEC_GetNumObjects( hIvasDec, &numObj ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_DEC_GetNumObjects: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + + for ( i = 0; i < numObj; ++i ) + { + IVAS_ISM_METADATA IsmMetadata; + + if ( ( error = IVAS_DEC_GetObjectMetadata( hIvasDec, &IsmMetadata, 0, i ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_DEC_GetObjectMetadata: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + + if ( ( IsmFileWriter_writeFrame( IsmMetadata, ismWriters[i] ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError writing ISM metadata to file %s\n", IsmFileWriter_getFilePath( ismWriters[i] ) ); + goto cleanup; + } + } + } + + if ( bsFormat == IVAS_DEC_BS_MASA || bsFormat == IVAS_DEC_BS_MASA_ISM ) + { + IVAS_MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta; + if ( ( error = IVAS_DEC_GetMasaMetadata( hIvasDec, &hMasaExtOutMeta, 1 ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_DEC_GetMasaMetadata: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + + if ( ( error = MasaFileWriter_writeFrame( masaWriter, hMasaExtOutMeta ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError writing MASA metadata to file: %s\n", MasaFileWriter_getFilePath( masaWriter ) ); + goto cleanup; + } + } + } + } + + if ( !arg.quietModeEnabled ) + { + fprintf( stdout, "%-8d\b\b\b\b\b\b\b\b", frame ); + } + + frame++; + systemTime_ms += systemTimeInc_ms; + +#ifdef WMOPS + update_mem(); + update_wmops(); +#endif + } + + /*------------------------------------------------------------------------------------------* + * Add zeros at the end to have equal length of synthesized signals + *------------------------------------------------------------------------------------------*/ + + memset( pcmBuf, 0, delayNumSamples_orig[0] * nOutChannels * sizeof( int16_t ) ); + if ( ( error = AudioFileWriter_write( afWriter, pcmBuf, delayNumSamples_orig[0] * nOutChannels ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError writing output file: %s\n", ivas_error_to_string( error ) ); + goto cleanup; + } + + /*------------------------------------------------------------------------------------------* + * Printouts after decoding has finished + *------------------------------------------------------------------------------------------*/ + + if ( !arg.quietModeEnabled ) + { + printf( "\n\nDecoder+renderer delay: %4.2f ms (%3u samples at timescale %5u)\n", 1000.f * delayNumSamples_orig[1] / (float) delayTimeScale, delayNumSamples_orig[1], delayTimeScale ); + + if ( delayNumSamples_orig[2] > 0 ) + { + printf( "HRIR/BRIR delay: %4.2f ms (%3u samples at timescale %5u)\n", 1000.f * delayNumSamples_orig[2] / (float) delayTimeScale, delayNumSamples_orig[2], delayTimeScale ); + printf( "Total delay: %4.2f ms (%3u samples at timescale %5u)\n", 1000.f * ( delayNumSamples_orig[1] + delayNumSamples_orig[2] ) / (float) delayTimeScale, delayNumSamples_orig[1] + delayNumSamples_orig[2], delayTimeScale ); + } + } + + /* Print output metadata file name(s) */ + if ( arg.outputConfig == IVAS_AUDIO_CONFIG_EXTERNAL ) + { + if ( bsFormat == IVAS_DEC_BS_OBJ || bsFormat == IVAS_DEC_BS_MASA_ISM || bsFormat == IVAS_DEC_BS_SBA_ISM ) + { + for ( i = 0; i < numObj; i++ ) + { + fprintf( stdout, "\nOutput ISM metadata file: %s", IsmFileWriter_getFilePath( ismWriters[i] ) ); + } + fprintf( stdout, "\n" ); + } + + if ( bsFormat == IVAS_DEC_BS_MASA || bsFormat == IVAS_DEC_BS_MASA_ISM ) + { + fprintf( stdout, "\nOutput MASA metadata file: %s\n", MasaFileWriter_getFilePath( masaWriter ) ); + } + } + + /*------------------------------------------------------------------------------------------* + * Close files and deallocate resources + *------------------------------------------------------------------------------------------*/ + + decodingFailed = false; /* This will stay set to true if cleanup is reached via a goto due to an error */ + +cleanup: + + EVS_RTPDUMP_DEPACKER_close( &rtpdumpDepacker ); + AudioFileWriter_close( &afWriter ); + JbmOffsetFileWriter_close( &jbmOffsetWriter ); +#ifdef SUPPORT_JBM_TRACEFILE + JbmTraceFileWriter_close( &jbmTraceWriter ); +#endif + MasaFileWriter_close( &masaWriter ); + for ( i = 0; i < IVAS_MAX_NUM_OBJECTS; i++ ) + { + IsmFileWriter_close( &ismWriters[i] ); + } + + if ( decodingFailed && error == IVAS_ERR_OK ) + { + return IVAS_ERR_UNKNOWN; + } + + return error; +} + + diff --git a/apps/encoder.c b/apps/encoder.c new file mode 100644 index 0000000000000000000000000000000000000000..31c6c334b310a7a5676492ce455fe3c19b333d23 --- /dev/null +++ b/apps/encoder.c @@ -0,0 +1,1746 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include "lib_enc.h" +#include +#include "cmdl_tools.h" +#include "audio_file_reader.h" +#include "bitstream_writer.h" +#include "ism_file_reader.h" +#include "jbm_file_reader.h" +#include "masa_file_reader.h" +#include "wmc_auto.h" + + +#define WMC_TOOL_SKIP + +/*------------------------------------------------------------------------------------------* + * Local constants, enums + *------------------------------------------------------------------------------------------*/ + +#if !defined( WMOPS ) +static +#endif + int32_t frame = 0; /* Counter of frames */ + +#define DEFAULT_FIXED_SID_RATE 8 /* DTX SID rate */ + +/* Additional config info for each input format */ +typedef union _EncInputFormatConfig +{ + /* MONO details */ + bool stereoToMonoDownmix; + + + /* ISM details */ + struct EncIsmConfig + { + int16_t numObjects; + const char *metadataFiles[IVAS_MAX_NUM_OBJECTS]; + } ism; + + /* SBA details */ + struct EncSbaConfig + { + IVAS_ENC_SBA_ORDER order; + bool isPlanar; + } sba; + + /* MASA details */ + IVAS_ENC_MASA_VARIANT masaVariant; + + /* MC details */ + IVAS_ENC_MC_LAYOUT mcLayout; + + struct EncMasaIsmConfig + { + int16_t numObjects; + const char *metadataFiles[IVAS_MAX_NUM_OBJECTS]; + IVAS_ENC_MASA_VARIANT masaVariant; + } masa_ism; + + struct EncSbaIsmConfig + { + int16_t numObjects; + const char *metadataFiles[IVAS_MAX_NUM_OBJECTS]; + IVAS_ENC_SBA_ORDER order; + bool isPlanar; + } sba_ism; + +} EncInputFormatConfig; + + +/*------------------------------------------------------------------------------------------* + * Local structure for storing cmdln arguments + *------------------------------------------------------------------------------------------*/ + +typedef struct +{ + char *inputWavFilename; + char *outputBitstreamFilename; + int32_t inputFs; + IVAS_ENC_INPUT_FORMAT inputFormat; + bool is_binaural; + EncInputFormatConfig inputFormatConfig; + bool max_bwidth_user; + IVAS_ENC_BANDWIDTH maxBandwidth; + const char *bandwithProfileFile; + IVAS_ENC_DTX_CONFIG dtxConfig; + int32_t initBitrate; + const char *bitrateProfileFile; + bool quietModeEnabled; + bool delayCompensationEnabled; + const char *masaMetadataFile; + IVAS_ENC_CHANNEL_AWARE_CONFIG caConfig; + const char *ca_config_file; + bool mimeOutput; + IVAS_ENC_COMPLEXITY_LEVEL complexityLevel; + bool pca; + bool ism_extended_metadata; + +} EncArguments; + + +/*------------------------------------------------------------------------------------------* + * Local functions prototypes + *------------------------------------------------------------------------------------------*/ + +static void initArgStruct( EncArguments *arg ); +static bool parseCmdlIVAS_enc( int16_t argc, char *argv[], EncArguments *arg ); +static void usage_enc( void ); +static bool readBandwidth( FILE *file, IVAS_ENC_BANDWIDTH *bandwidth, int32_t *bandwidthFrameCounter ); +static bool readBitrate( FILE *file, int32_t *bitrate ); + + +/*------------------------------------------------------------------------------------------* + * main() + * + * Main IVAS encoder function for command-line interface + *------------------------------------------------------------------------------------------*/ + +int main( + int argc, + char *argv[] ) +{ + bool mainFailed = true; /* Assume main failed until cleanup is reached without errors */ + EncArguments arg; + int16_t i; + ivas_error error = IVAS_ERR_UNKNOWN; + + /* Any handles that require cleanup must be declared here and initialized to NULL */ + IVAS_ENC_HANDLE hIvasEnc = NULL; + BS_WRITER_HANDLE hBsWriter = NULL; + AudioFileReader *audioReader = NULL; + FILE *f_bitrateProfile = NULL; + FILE *f_bwProfile = NULL; + JbmFileReader *jbmReader = NULL; + MasaFileReader *masaReader = NULL; + IsmFileReader *ismReaders[IVAS_MAX_NUM_OBJECTS] = { NULL, NULL, NULL, NULL }; + int16_t *pcmBuf = NULL; + +#ifdef WMOPS + reset_wmops(); + reset_mem( USE_32BITS ); +#endif + + initArgStruct( &arg ); + + /*------------------------------------------------------------------------------------------* + * Parse command-line arguments + *------------------------------------------------------------------------------------------*/ + + IVAS_ENC_PrintDisclaimer(); + + if ( !parseCmdlIVAS_enc( (int16_t) argc, argv, &arg ) ) + { + /* Error printout done internally in parseCmdlIVAS_enc() */ + goto cleanup; + } + + /*------------------------------------------------------------------------------------------* + * Open and initialize IVAS encoder + *------------------------------------------------------------------------------------------*/ + + if ( ( error = IVAS_ENC_Open( &hIvasEnc ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Opening IVAS encoder failed: %s\n", IVAS_ENC_GetErrorMessage( error ) ); + goto cleanup; + } + + /*------------------------------------------------------------------------------------------* + * Open output bitstream file + *------------------------------------------------------------------------------------------*/ + + const BS_WRITER_FORMAT bsWriterFormat = arg.mimeOutput ? BS_WRITER_FORMAT_MIME : BS_WRITER_FORMAT_G192; + + if ( BS_Writer_Open_filename( &hBsWriter, arg.outputBitstreamFilename, bsWriterFormat ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nCan't open %s\n\n", arg.outputBitstreamFilename ); + goto cleanup; + } + + /*------------------------------------------------------------------------------------------* + * Print out file names + *------------------------------------------------------------------------------------------*/ + + if ( arg.inputFormat == IVAS_ENC_INPUT_ISM || arg.inputFormat == IVAS_ENC_INPUT_SBA_ISM ) + { + for ( i = 0; i < arg.inputFormatConfig.ism.numObjects; i++ ) + { + fprintf( stdout, "Object %d input metadata: %s\n", i + 1, arg.inputFormatConfig.ism.metadataFiles[i] ); + } + } + + if ( arg.masaMetadataFile != NULL ) + { + fprintf( stdout, "MASA inp. metadata file: %s\n", arg.masaMetadataFile ); + } + + fprintf( stdout, "Input audio file: %s\n", arg.inputWavFilename ); + fprintf( stdout, "Output bitstream file: %s\n\n", arg.outputBitstreamFilename ); + + /*------------------------------------------------------------------------------------------* + * Open auxiliary input files + *------------------------------------------------------------------------------------------*/ + + int32_t totalBitrate = arg.initBitrate; + + if ( arg.bitrateProfileFile ) + { + if ( ( f_bitrateProfile = fopen( arg.bitrateProfileFile, "rb" ) ) == NULL ) + { + fprintf( stderr, "Error: bitrate profile file %s could not be opened\n\n", arg.bitrateProfileFile ); + usage_enc(); + goto cleanup; + } + + if ( !readBitrate( f_bitrateProfile, &totalBitrate ) ) + { + fprintf( stderr, "Error: bitrate profile file %s could not be read\n\n", arg.bitrateProfileFile ); + goto cleanup; + } + rewind( f_bitrateProfile ); + + fprintf( stdout, "Bitrate switching file: %s\n", arg.bitrateProfileFile ); + } + + int32_t bandwidthFrameCounter = 0; + IVAS_ENC_BANDWIDTH bandwidth = arg.maxBandwidth; + + if ( arg.bandwithProfileFile ) + { + if ( ( f_bwProfile = fopen( arg.bandwithProfileFile, "rb" ) ) == NULL ) + { + fprintf( stderr, "Error: incorrect bandwidth specification or the bandwidth profile file could not be opened: %s\n\n", arg.bandwithProfileFile ); + usage_enc(); + goto cleanup; + } + fprintf( stdout, "Bandwidth switching file: %s\n", arg.bandwithProfileFile ); + + if ( !readBandwidth( f_bwProfile, &bandwidth, &bandwidthFrameCounter ) ) + { + fprintf( stderr, "Error: bandwidth switching file %s could not be read\n\n", arg.bandwithProfileFile ); + goto cleanup; + } + rewind( f_bwProfile ); + bandwidthFrameCounter = 0; + } + else + { + if ( bandwidth == IVAS_ENC_BANDWIDTH_NB && arg.inputFormat != IVAS_ENC_INPUT_MONO ) + { + fprintf( stdout, "\nNB coding not supported in IVAS. Switching to WB.\n\n" ); + } + else + { + switch ( bandwidth ) + { + case IVAS_ENC_BANDWIDTH_UNDEFINED: + break; + case IVAS_ENC_BANDWIDTH_NB: + fprintf( stdout, "Max. encoded bandwidth: NB\n" ); + break; + case IVAS_ENC_BANDWIDTH_WB: + fprintf( stdout, "Max. encoded bandwidth: WB\n" ); + break; + case IVAS_ENC_BANDWIDTH_SWB: + fprintf( stdout, "Max. encoded bandwidth: SWB\n" ); + break; + case IVAS_ENC_BANDWIDTH_FB: + fprintf( stdout, "Max. encoded bandwidth: FB\n" ); + break; + default: + fprintf( stderr, "Error: Invalid bandwidth value\n" ); + usage_enc(); + goto cleanup; + } + } + } + + /*------------------------------------------------------------------------------------------* + * Handle Channel-aware mode + *------------------------------------------------------------------------------------------*/ + + IVAS_ENC_CHANNEL_AWARE_CONFIG caConfig = arg.caConfig; + + if ( arg.ca_config_file ) + { + if ( ( jbmReader = JbmFileReader_open( arg.ca_config_file ) ) == NULL ) + { + fprintf( stderr, "\nError: Channel aware configuration file could not be opened: %s\n\n", arg.ca_config_file ); + usage_enc(); + goto cleanup; + } + + fprintf( stdout, "Channel-aware mode: ON, config file: %s \n", arg.ca_config_file ); + } + else if ( caConfig.channelAwareModeEnabled ) + { + fprintf( stdout, "Channel-aware mode: ON, FEC indicator : %s FEC offset: %d \n\n", ( caConfig.fec_indicator == IVAS_ENC_FEC_LO ) ? "LO" : "HI", caConfig.fec_offset ); + } + + if ( arg.inputFormat != IVAS_ENC_INPUT_MONO && ( caConfig.channelAwareModeEnabled || arg.ca_config_file ) ) + { + fprintf( stderr, "Channel-aware mode is not supported in IVAS.\n\n" ); + usage_enc(); + goto cleanup; + } + + /*------------------------------------------------------------------------------------------* + * Configure and initialize (allocate memory for static variables) the encoder + *------------------------------------------------------------------------------------------*/ + + switch ( arg.inputFormat ) + { + case IVAS_ENC_INPUT_MONO: + if ( ( error = IVAS_ENC_ConfigureForMono( hIvasEnc, arg.inputFs, totalBitrate, arg.max_bwidth_user, bandwidth, arg.dtxConfig, caConfig, arg.inputFormatConfig.stereoToMonoDownmix, arg.is_binaural ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_ENC_ConfigureForMono failed: %s\n\n", IVAS_ENC_GetErrorMessage( error ) ); + goto cleanup; + } + break; + case IVAS_ENC_INPUT_STEREO: + if ( ( error = IVAS_ENC_ConfigureForStereo( hIvasEnc, arg.inputFs, totalBitrate, arg.max_bwidth_user, bandwidth, arg.dtxConfig, arg.is_binaural ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_ENC_ConfigureForStereo failed: %s\n\n", IVAS_ENC_GetErrorMessage( error ) ); + goto cleanup; + } + break; + case IVAS_ENC_INPUT_ISM: + if ( ( error = IVAS_ENC_ConfigureForObjects( hIvasEnc, arg.inputFs, totalBitrate, arg.max_bwidth_user, bandwidth, arg.dtxConfig, arg.inputFormatConfig.ism.numObjects, arg.ism_extended_metadata ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_ENC_ConfigureForObjects failed: %s\n\n", IVAS_ENC_GetErrorMessage( error ) ); + goto cleanup; + } + break; + case IVAS_ENC_INPUT_SBA: + if ( ( error = IVAS_ENC_ConfigureForAmbisonics( hIvasEnc, arg.inputFs, totalBitrate, arg.max_bwidth_user, bandwidth, arg.dtxConfig, arg.inputFormatConfig.sba.order, arg.inputFormatConfig.sba.isPlanar, + arg.pca + ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_ENC_ConfigureForAmbisonics failed: %s\n\n", IVAS_ENC_GetErrorMessage( error ) ); + goto cleanup; + } + + break; + case IVAS_ENC_INPUT_MASA: + if ( ( error = IVAS_ENC_ConfigureForMasa( hIvasEnc, arg.inputFs, totalBitrate, arg.max_bwidth_user, bandwidth, arg.dtxConfig, arg.inputFormatConfig.masaVariant ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_ENC_ConfigureForMasa failed: %s\n\n", IVAS_ENC_GetErrorMessage( error ) ); + goto cleanup; + } + break; + case IVAS_ENC_INPUT_MC: + if ( ( error = IVAS_ENC_ConfigureForMultichannel( hIvasEnc, arg.inputFs, totalBitrate, arg.max_bwidth_user, bandwidth, arg.dtxConfig, arg.inputFormatConfig.mcLayout ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_ENC_ConfigureForMultichannel failed: %s\n\n", IVAS_ENC_GetErrorMessage( error ) ); + goto cleanup; + } + break; + case IVAS_ENC_INPUT_SBA_ISM: + if ( ( error = IVAS_ENC_ConfigureForSBAObjects( hIvasEnc, arg.inputFs, totalBitrate, bandwidth, arg.dtxConfig, arg.inputFormatConfig.sba_ism.numObjects, arg.inputFormatConfig.sba_ism.order, arg.inputFormatConfig.sba_ism.isPlanar, arg.pca ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_ENC_ConfigureForSBAObjects failed: %s\n\n", IVAS_ENC_GetErrorMessage( error ) ); + exit( -1 ); + } + break; + case IVAS_ENC_INPUT_MASA_ISM: + if ( ( error = IVAS_ENC_ConfigureForMASAObjects( hIvasEnc, arg.inputFs, totalBitrate, bandwidth, arg.dtxConfig, arg.inputFormatConfig.masa_ism.numObjects, arg.inputFormatConfig.masa_ism.masaVariant ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_ENC_ConfigureForMASAObjects failed: %s\n\n", IVAS_ENC_GetErrorMessage( error ) ); + exit( -1 ); + } + break; + default: + fprintf( stderr, "\nInvalid input type\n\n" ); + goto cleanup; + } + + if ( ( error = IVAS_ENC_PrintConfig( hIvasEnc, caConfig.channelAwareModeEnabled ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\n IVAS_ENC_PrintConfig failed %s\n\n", IVAS_ENC_GetErrorMessage( error ) ); + goto cleanup; + } + + /*------------------------------------------------------------------------------------------* + * Open input audio file + *------------------------------------------------------------------------------------------*/ + + if ( AudioFileReader_open( &audioReader, arg.inputWavFilename ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nCan't open %s\n\n", arg.inputWavFilename ); + goto cleanup; + } + + /* Validate input sampling rate */ + int32_t inFileSampleRate = 0; + error = AudioFileReader_getSamplingRate( audioReader, &inFileSampleRate ); + switch ( error ) + { + case IVAS_ERR_OK: + if ( inFileSampleRate != arg.inputFs ) + { + fprintf( stderr, "\nSampling rate mismatch: %d Hz requested, but %d Hz found in file %s\n\n", arg.inputFs, inFileSampleRate, arg.inputWavFilename ); + goto cleanup; + } + break; + case IVAS_ERR_SAMPLING_RATE_UNKNOWN: + /* IVAS_ERR_SAMPLING_RATE_UNKNOWN will be returned for raw PCM files. + * Nothing to check here */ + break; + default: + fprintf( stderr, "\nError: %s\n", ivas_error_to_string( error ) ); + goto cleanup; + } + + /* Validate number of channels */ + int16_t encInNumChannels = 0; + if ( ( error = IVAS_ENC_GetNumInChannels( hIvasEnc, &encInNumChannels ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError: %s\n", ivas_error_to_string( error ) ); + goto cleanup; + } + + int16_t inFileNumChannels = 0; + error = AudioFileReader_getNumChannels( audioReader, &inFileNumChannels ); + switch ( error ) + { + case IVAS_ERR_OK: + if ( inFileNumChannels != encInNumChannels ) + { + fprintf( stderr, "\nNumber of input audio channels mismatch: %d accepted by encoder, but %d found in file %s\n\n", encInNumChannels, inFileNumChannels, arg.inputWavFilename ); + goto cleanup; + } + break; + case IVAS_ERR_NUM_CHANNELS_UNKNOWN: + /* IVAS_ERR_NUM_CHANNELS_UNKNOWN will be returned for raw PCM files. + * Nothing to check here */ + break; + default: + fprintf( stderr, "\nError: %s\n", ivas_error_to_string( error ) ); + goto cleanup; + } + + /*------------------------------------------------------------------------------------------* + * Open input metadata files + *------------------------------------------------------------------------------------------*/ + + if ( arg.masaMetadataFile ) + { + if ( ( masaReader = MasaFileReader_open( arg.masaMetadataFile ) ) == NULL ) + { + fprintf( stderr, "\nError: MASA input metadata file %s could not be opened\n\n", arg.masaMetadataFile ); + usage_enc(); + goto cleanup; + } + } + + const int16_t numIsmInputs = ( arg.inputFormat == IVAS_ENC_INPUT_ISM || arg.inputFormat == IVAS_ENC_INPUT_MASA_ISM || arg.inputFormat == IVAS_ENC_INPUT_SBA_ISM ) ? arg.inputFormatConfig.ism.numObjects : 0; + + for ( i = 0; i < numIsmInputs; ++i ) + { + if ( arg.inputFormatConfig.ism.metadataFiles[i] != NULL ) + { + if ( ( ismReaders[i] = IsmFileReader_open( arg.inputFormatConfig.ism.metadataFiles[i] ) ) == NULL ) + { + fprintf( stderr, "\nError: ISM input metadata file %s could not be opened\n\n", arg.inputFormatConfig.ism.metadataFiles[i] ); + usage_enc(); + goto cleanup; + } + } + } + + + /*------------------------------------------------------------------------------------------* + * Allocate input data buffer + *------------------------------------------------------------------------------------------*/ + + int16_t pcmBufSize; + if ( ( error = IVAS_ENC_GetInputBufferSize( hIvasEnc, &pcmBufSize ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nGetInputBufferSize failed: %s\n\n", IVAS_ENC_GetErrorMessage( error ) ); + goto cleanup; + } + + pcmBuf = malloc( pcmBufSize * sizeof( int16_t ) ); + + /*------------------------------------------------------------------------------------------* + * Compensate for encoder delay (bitstream aligned with input signal) + *------------------------------------------------------------------------------------------*/ + + int16_t encDelayInSamples; + if ( ( error = IVAS_ENC_GetDelay( hIvasEnc, &encDelayInSamples ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nGetDelay failed: %s\n\n", IVAS_ENC_GetErrorMessage( error ) ); + goto cleanup; + } + + if ( arg.delayCompensationEnabled && encDelayInSamples ) + { + /* read samples and throw them away */ + int16_t numSamplesRead = 0; + if ( ( error = AudioFileReader_read( audioReader, pcmBuf, encDelayInSamples, &numSamplesRead ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError reading from file %s\n%s\n", arg.inputWavFilename, IVAS_ENC_GetErrorMessage( error ) ); + goto cleanup; + } + } + + int16_t numSamplesRead = 0; + uint16_t bitStream[IVAS_MAX_BITS_PER_FRAME]; + uint16_t numBits = 0; + + if ( !arg.quietModeEnabled ) + { + fprintf( stdout, "\n------ Running the encoder ------\n\n" ); + fprintf( stdout, "Frames processed: " ); + } + else + { + fprintf( stdout, "\n\n-- Start the encoder (quiet mode) --\n\n" ); + } + +#ifdef WMOPS + reset_stack(); + reset_wmops(); +#endif + + /*------------------------------------------------------------------------------------------* + * Loop for every frame of input data + * - Read the input data + * - Process switching files + * - Read input metadata + * - Run the encoder + * - Write the parameters into output bitstream file + *------------------------------------------------------------------------------------------*/ + + while ( 1 ) + { + /* Read the input data */ + if ( ( error = AudioFileReader_read( audioReader, pcmBuf, pcmBufSize, &numSamplesRead ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError reading from file %s\n%s\n", arg.inputWavFilename, IVAS_ENC_GetErrorMessage( error ) ); + goto cleanup; + } + + if ( numSamplesRead == 0 ) + { + /* end of input data */ + break; + } + + /* Zero-pad if not enough samples were read (expected in last frame) */ + if ( numSamplesRead < pcmBufSize ) + { + for ( i = numSamplesRead; i < pcmBufSize; ++i ) + { + pcmBuf[i] = 0; + } + } + + /* Process switching files */ + if ( f_bitrateProfile ) + { + if ( !readBitrate( f_bitrateProfile, &totalBitrate ) ) + { + fprintf( stderr, "Error: bitrate profile file %s could not be read\n\n", arg.bitrateProfileFile ); + goto cleanup; + } + + if ( ( error = IVAS_ENC_SetBitrate( hIvasEnc, totalBitrate ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_ENC_SetBitrate failed: %s\n\n", IVAS_ENC_GetErrorMessage( error ) ); + goto cleanup; + } + } + + if ( f_bwProfile ) + { + if ( !readBandwidth( f_bwProfile, &bandwidth, &bandwidthFrameCounter ) ) + { + fprintf( stderr, "Error: bandwidth switching file %s could not be read\n\n", arg.bandwithProfileFile ); + goto cleanup; + } + + if ( ( error = IVAS_ENC_SetBandwidth( hIvasEnc, bandwidth ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_ENC_SetBandwidth failed: %s\n\n", IVAS_ENC_GetErrorMessage( error ) ); + goto cleanup; + } + } + + if ( jbmReader ) + { + if ( ( error = JbmFileReader_readCAconfig( jbmReader, &caConfig ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "JbmFileReader_readCAconfig() failed: %s\n\n", IVAS_ENC_GetErrorMessage( error ) ); + goto cleanup; + } + + if ( ( error = IVAS_ENC_SetChannelAwareConfig( hIvasEnc, caConfig ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "IVAS_ENC_SetChannelAwareConfig failed: %s\n\n", IVAS_ENC_GetErrorMessage( error ) ); + goto cleanup; + } + } + + /* Read ISM input metadata */ + for ( i = 0; i < numIsmInputs; ++i ) + { + if ( ismReaders[i] == NULL ) + { + continue; + } + + IVAS_ISM_METADATA ismMetadata; + if ( ( error = IsmFileReader_readNextFrame( ismReaders[i], &ismMetadata ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError (%s) while reading ism metadata from: %s\n\n", IVAS_ENC_GetErrorMessage( error ), IsmFileReader_getFilePath( ismReaders[i] ) ); + goto cleanup; + } + + if ( ( error = IVAS_ENC_FeedObjectMetadata( hIvasEnc, i, ismMetadata ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nfeed_ISM_metadata failed: %s\n\n", IVAS_ENC_GetErrorMessage( error ) ); + goto cleanup; + } + } + + /* Read MASA input metadata */ + if ( masaReader ) + { + if ( ( error = MasaFileReader_readNextFrame( masaReader ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError (%s) while reading masa metadata from: %s\n\n", IVAS_ENC_GetErrorMessage( error ), arg.masaMetadataFile ); + goto cleanup; + } + IVAS_MASA_METADATA_HANDLE hMetadata = MasaFileReader_getMetadataHandle( masaReader ); + + if ( ( error = IVAS_ENC_FeedMasaMetadata( hIvasEnc, hMetadata ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nfeed_MASA_frame failed: %s\n\n", IVAS_ENC_GetErrorMessage( error ) ); + goto cleanup; + } + } + + /* *** Encode one frame *** */ + if ( ( error = IVAS_ENC_EncodeFrameToSerial( hIvasEnc, pcmBuf, pcmBufSize, bitStream, &numBits ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nencodeFrame failed: %s\n\n", IVAS_ENC_GetErrorMessage( error ) ); + goto cleanup; + } + + /* write bitstream */ + if ( ( error = BS_Writer_WriteFrame_short( hBsWriter, bitStream, numBits, totalBitrate ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nBS_Writer_WriteFrame_short failed, error code %d\n\n", error ); + goto cleanup; + } + + frame++; + if ( !arg.quietModeEnabled ) + { + fprintf( stdout, "%-8d\b\b\b\b\b\b\b\b", frame ); + } + +#ifdef WMOPS + update_mem(); + update_wmops(); +#endif + } + + if ( arg.quietModeEnabled ) + { + fprintf( stdout, "Encoding finished\n" ); + } + else + { + fprintf( stdout, "\n\nEncoding of %d frames finished\n", frame ); + } + + /*------------------------------------------------------------------------------------------* + * Close files and deallocate resources + *------------------------------------------------------------------------------------------*/ + + mainFailed = false; /* This will stay set to true if cleanup is reached via a goto due to an error */ + +cleanup: + + free( pcmBuf ); + + if ( ( error = BS_Writer_Close( &hBsWriter ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Can't close bitstream writer, error code %d\n", error ); + mainFailed = true; + } + + AudioFileReader_close( &audioReader ); + + if ( jbmReader ) + { + JbmFileReader_close( &jbmReader ); + } + + for ( i = 0; i < IVAS_MAX_NUM_OBJECTS; ++i ) + { + if ( ismReaders[i] != NULL ) + { + IsmFileReader_close( &ismReaders[i] ); + } + } + + if ( masaReader ) + { + MasaFileReader_close( &masaReader ); + } + + if ( f_bwProfile ) + { + fclose( f_bwProfile ); + } + + if ( f_bitrateProfile ) + { + fclose( f_bitrateProfile ); + } + + IVAS_ENC_Close( &hIvasEnc ); + +#ifdef WMOPS + print_wmops(); + print_mem( NULL ); +#endif + + return mainFailed ? -1 : 0; +} + + +/*-------------------------------------------------------------------* + * Local functions + *-------------------------------------------------------------------*/ + +#define IVAS_DEFAULT_AGC ( 0 ) + +static void initArgStruct( EncArguments *arg ) +{ + /* Set default values here */ + arg->inputWavFilename = NULL; + arg->outputBitstreamFilename = NULL; + arg->inputFs = 0; + arg->inputFormat = IVAS_ENC_INPUT_MONO; + arg->is_binaural = false; + arg->inputFormatConfig.stereoToMonoDownmix = false; + arg->max_bwidth_user = false; + arg->maxBandwidth = IVAS_ENC_BANDWIDTH_UNDEFINED; + arg->bandwithProfileFile = NULL; + arg->dtxConfig = IVAS_ENC_GetDefaultDtxConfig(); + arg->initBitrate = 0; + arg->bitrateProfileFile = NULL; + arg->quietModeEnabled = false; + arg->delayCompensationEnabled = true; + arg->masaMetadataFile = NULL; + arg->caConfig = IVAS_ENC_GetDefaultChannelAwareConfig(); + arg->ca_config_file = NULL; + arg->mimeOutput = false; + arg->ism_extended_metadata = false; + arg->complexityLevel = IVAS_ENC_COMPLEXITY_LEVEL_THREE; + + arg->pca = false; + + return; +} + + +/*---------------------------------------------------------------------* + * parseCmdlIVAS_enc() + * + * Encoder command-line parsing + *---------------------------------------------------------------------*/ + +static bool parseCmdlIVAS_enc( + int16_t argc, + char *argv[], + EncArguments *arg ) +{ + int16_t i, j; + char argv_to_upper[FILENAME_MAX]; + char stmp[FILENAME_MAX]; + int32_t tmp; + + if ( argc < 5 ) + { + fprintf( stderr, "Error: Not enough input parameters. Exiting!\n\n" ); + usage_enc(); + return false; + } + + /*-----------------------------------------------------------------* + * Optional input arguments + *-----------------------------------------------------------------*/ + + i = 1; + while ( i < argc - 4 ) + { + strncpy( argv_to_upper, argv[i], sizeof( argv_to_upper ) - 1 ); + argv_to_upper[sizeof( argv_to_upper ) - 1] = '\0'; + to_upper( argv_to_upper ); + + /*-----------------------------------------------------------------* + * Bandwidth limitation + *-----------------------------------------------------------------*/ + + if ( strcmp( argv_to_upper, "-MAX_BAND" ) == 0 ) + { + arg->max_bwidth_user = true; + + strncpy( stmp, argv[i + 1], sizeof( stmp ) - 1 ); + stmp[sizeof( stmp ) - 1] = '\0'; + to_upper( stmp ); + + if ( strcmp( stmp, "-NB" ) == 0 || strcmp( stmp, "NB" ) == 0 ) + { + arg->maxBandwidth = IVAS_ENC_BANDWIDTH_NB; + } + else if ( strcmp( stmp, "-WB" ) == 0 || strcmp( stmp, "WB" ) == 0 ) + { + arg->maxBandwidth = IVAS_ENC_BANDWIDTH_WB; + } + else if ( strcmp( stmp, "-SWB" ) == 0 || strcmp( stmp, "SWB" ) == 0 ) + { + arg->maxBandwidth = IVAS_ENC_BANDWIDTH_SWB; + } + else if ( strcmp( stmp, "-FB" ) == 0 || strcmp( stmp, "FB" ) == 0 ) + { + arg->maxBandwidth = IVAS_ENC_BANDWIDTH_FB; + } + else + { + arg->bandwithProfileFile = argv[i + 1]; + } + + i += 2; + } + + /*-----------------------------------------------------------------* + * Quiet mode + *-----------------------------------------------------------------*/ + + else if ( strcmp( argv_to_upper, "-Q" ) == 0 ) + { + i++; + arg->quietModeEnabled = true; + } + + /*-----------------------------------------------------------------* + * DTX/CNG + *-----------------------------------------------------------------*/ + + else if ( strcmp( argv_to_upper, "-DTX" ) == 0 ) + { + i++; + if ( i < argc - 4 ) + { + if ( sscanf( argv[i], "%d", &tmp ) <= 0 ) + { + tmp = DEFAULT_FIXED_SID_RATE; + } + else + { + i++; + } + } + else + { + tmp = DEFAULT_FIXED_SID_RATE; + } + + arg->dtxConfig.enabled = true; + + if ( tmp == 0 ) + { + arg->dtxConfig.variable_SID_rate = true; + arg->dtxConfig.SID_interval = 0; + } + else if ( tmp >= 3 && tmp <= 100 ) + { + arg->dtxConfig.variable_SID_rate = false; + arg->dtxConfig.SID_interval = (int16_t) tmp; + } + else + { + fprintf( stderr, "Error: Incorrect SID update interval specified: %d (supported 3-100)\n\n", tmp ); + usage_enc(); + return false; + } + } + + + /*-----------------------------------------------------------------* + * deactivate delay compensation + *-----------------------------------------------------------------*/ + + else if ( strcmp( argv_to_upper, "-NO_DELAY_CMP" ) == 0 ) + { + arg->delayCompensationEnabled = false; + i++; + } + + /*-----------------------------------------------------------------* + * Activate channel-aware mode + *-----------------------------------------------------------------*/ + + else if ( strcmp( argv_to_upper, "-RF" ) == 0 ) + { + arg->caConfig.channelAwareModeEnabled = 1; + i++; + + if ( i < argc - 4 ) + { + strncpy( stmp, argv[i], sizeof( stmp ) ); + stmp[sizeof( stmp ) - 1] = '\0'; + to_upper( stmp ); + if ( strcmp( stmp, "LO" ) == 0 ) + { + arg->caConfig.fec_indicator = IVAS_ENC_FEC_LO; + } + else if ( strcmp( stmp, "HI" ) == 0 ) + { + arg->caConfig.fec_indicator = IVAS_ENC_FEC_HI; + } + else + { + arg->ca_config_file = argv[i]; + } + i++; + + if ( ( sscanf( argv[i], "%d", &tmp ) == 1 ) && ( i < argc - 4 ) ) + { + if ( tmp == 0 ) + { + arg->caConfig.channelAwareModeEnabled = 0; + arg->caConfig.fec_offset = 0; + i++; + } + else + { + arg->caConfig.fec_offset = (int16_t) tmp; + i++; + } + } + } + else + { + arg->caConfig.fec_indicator = IVAS_ENC_FEC_HI; + } + } + + /*-----------------------------------------------------------------* + * MIME output file format + *-----------------------------------------------------------------*/ + + else if ( strcmp( argv_to_upper, "-MIME" ) == 0 ) + { + arg->mimeOutput = true; + fprintf( stdout, "Output bitstream file format: MIME\n" ); + ++i; + } + + + /*-----------------------------------------------------------------* + * Complexity Level + *-----------------------------------------------------------------*/ + + /* actual parsing of level will be implemented after characterization */ + else if ( strcmp( argv_to_upper, "-LEVEL" ) == 0 ) + { + int16_t level; + + ++i; + level = (int16_t) atoi( argv[i++] ); + if ( level < IVAS_ENC_COMPLEXITY_LEVEL_ONE || level > IVAS_ENC_COMPLEXITY_LEVEL_THREE ) + { + fprintf( stdout, "Invalid complexity level specified.\n" ); + usage_enc(); + return false; + } + else if ( level == IVAS_ENC_COMPLEXITY_LEVEL_ONE || level == IVAS_ENC_COMPLEXITY_LEVEL_TWO ) + { + fprintf( stdout, "Complexity levels 1 and 2 will be defined after characterisation - default to level 3 (full functionality).\n" ); + } + } + + /*-----------------------------------------------------------------* + * IVAS Formats + *-----------------------------------------------------------------*/ + + else if ( strcmp( argv_to_upper, "-STEREO" ) == 0 ) + { + i++; + arg->inputFormat = IVAS_ENC_INPUT_STEREO; + + } + else if ( strcmp( argv_to_upper, "-BINAURAL" ) == 0 ) + { + arg->is_binaural = true; + i++; + } + else if ( strcmp( argv_to_upper, "-ISM" ) == 0 ) + { + arg->inputFormat = IVAS_ENC_INPUT_ISM; + i++; + + if ( i < argc - 4 ) + { + if ( argv[i][0] == '+' ) + { + argv[i]++; + arg->ism_extended_metadata = true; + } + if ( !is_digits_only( argv[i] ) ) + { + fprintf( stderr, "Error: Number of ISM channels must be an integer number!\n\n" ); + usage_enc(); + return false; + } + + if ( sscanf( argv[i], "%d", &tmp ) > 0 ) + { + i++; + } + + if ( tmp <= 0 ) + { + fprintf( stderr, "Error: Too low number of ISM channels specified!\n\n" ); + usage_enc(); + return false; + } + else if ( tmp > IVAS_MAX_NUM_OBJECTS ) + { + fprintf( stderr, "Error: Too high number of ISM channels specified!\n\n" ); + usage_enc(); + return false; + } + else + { + arg->inputFormatConfig.ism.numObjects = (int16_t) tmp; + } + } + else + { + fprintf( stderr, "Error: Number of ISM channels not specified!\n\n" ); + usage_enc(); + return false; + } + + /* read input metadata files */ + for ( j = 0; j < arg->inputFormatConfig.ism.numObjects; j++ ) + { + if ( i < argc - 4 ) + { + if ( strcmp( argv[i], "NULL" ) == 0 || strcmp( argv[i], "null" ) == 0 ) + { + /* no metadata input file -> encode only audio streams */ + arg->inputFormatConfig.ism.metadataFiles[j] = NULL; + } + else + { + arg->inputFormatConfig.ism.metadataFiles[j] = argv[i]; + } + + i++; + } + else + { + fprintf( stderr, "Error: not enough metadata arguments specified!\n\n" ); + usage_enc(); + return false; + } + } + } + else if ( strcmp( argv_to_upper, "-SBA" ) == 0 ) + { + i++; + arg->inputFormat = IVAS_ENC_INPUT_SBA; + + /* SBA configuration */ + if ( i < argc - 4 && is_number( argv[i] ) && sscanf( argv[i], "%d", &tmp ) > 0 ) + { + i++; + } + else + { + tmp = -1; /* this is to avoid a compilation warning */ + fprintf( stderr, "Error: SBA order must be specified, expecting a number!\n\n" ); + usage_enc(); + return false; + } + + arg->inputFormatConfig.sba.isPlanar = ( tmp < 0 ); + + tmp = abs( tmp ); + switch ( tmp ) + { + case 1: + arg->inputFormatConfig.sba.order = IVAS_ENC_SBA_FOA; + break; + case 2: + arg->inputFormatConfig.sba.order = IVAS_ENC_SBA_HOA2; + break; + case 3: + arg->inputFormatConfig.sba.order = IVAS_ENC_SBA_HOA3; + break; + default: + fprintf( stderr, "Error: Wrong SBA order specified!\n\n" ); + usage_enc(); + return false; + } + } + else if ( strcmp( argv_to_upper, "-MASA" ) == 0 ) + { + arg->inputFormat = IVAS_ENC_INPUT_MASA; + i++; + + if ( i < argc - 4 ) + { + if ( !is_digits_only( argv[i] ) ) + { + fprintf( stderr, "Error: Number of MASA channels must be an integer number!\n\n" ); + usage_enc(); + return false; + } + + if ( sscanf( argv[i], "%d", &tmp ) > 0 ) + { + i++; + } + + switch ( tmp ) + { + case 1: + arg->inputFormatConfig.masaVariant = IVAS_ENC_MASA_1CH; + break; + case 2: + arg->inputFormatConfig.masaVariant = IVAS_ENC_MASA_2CH; + break; + default: + fprintf( stderr, "Error: MASA channels must be 1 or 2.\n\n" ); + usage_enc(); + return false; + } + } + + if ( i < argc - 4 ) + { + arg->masaMetadataFile = argv[i]; + i++; + } + else + { + fprintf( stderr, "Error: not enough MASA arguments\n\n" ); + usage_enc(); + return false; + } + } + else if ( strcmp( argv_to_upper, "-MC" ) == 0 ) + { + i++; + arg->inputFormat = IVAS_ENC_INPUT_MC; + + if ( i < argc - 4 ) + { + if ( strcmp( argv[i], "5_1" ) == 0 ) + { + arg->inputFormatConfig.mcLayout = IVAS_ENC_MC_5_1; + } + else if ( strcmp( argv[i], "7_1" ) == 0 ) + { + arg->inputFormatConfig.mcLayout = IVAS_ENC_MC_7_1; + } + else if ( strcmp( argv[i], "5_1_2" ) == 0 ) + { + arg->inputFormatConfig.mcLayout = IVAS_ENC_MC_5_1_2; + } + else if ( strcmp( argv[i], "5_1_4" ) == 0 ) + { + arg->inputFormatConfig.mcLayout = IVAS_ENC_MC_5_1_4; + } + else if ( strcmp( argv[i], "7_1_4" ) == 0 ) + { + arg->inputFormatConfig.mcLayout = IVAS_ENC_MC_7_1_4; + } + else + { + fprintf( stderr, "Error: Incorrect input configuration specified for Multi-channel\n\n" ); + usage_enc(); + return false; + } + i++; + } + else + { + fprintf( stderr, "Error: Multi-channel configuration not specified!\n\n" ); + usage_enc(); + return false; + } + } + else if ( strcmp( to_upper( argv[i] ), "-ISM_MASA" ) == 0 ) + { + arg->inputFormat = IVAS_ENC_INPUT_MASA_ISM; + i++; + + if ( i < argc - 5 ) + { + if ( sscanf( argv[i], "%d", &tmp ) > 0 ) + { + i++; + } + + if ( tmp <= 0 ) + { + fprintf( stderr, "Error: Too low number of ISM channels specified!\n\n" ); + usage_enc(); + } + else + { + if ( tmp <= IVAS_MAX_NUM_OBJECTS ) /* number of ISM channels */ + { + arg->inputFormatConfig.masa_ism.numObjects = (int16_t) tmp; + } + else + { + fprintf( stderr, "Error: Too high number of ISM channels!\n\n" ); + usage_enc(); + } + } + } + else + { + fprintf( stderr, "Error: Number of ISM channels not specified!\n\n" ); + usage_enc(); + } + if ( i < argc - 4 ) + { + if ( sscanf( argv[i], "%d", &tmp ) > 0 ) + { + i++; + } + + switch ( tmp ) + { + case 1: + arg->inputFormatConfig.masa_ism.masaVariant = IVAS_ENC_MASA_1CH; + break; + case 2: + arg->inputFormatConfig.masa_ism.masaVariant = IVAS_ENC_MASA_2CH; + break; + default: + fprintf( stderr, "Error: MASA channels must be 1 or 2.\n\n" ); + usage_enc(); + break; + } + } + + /* read input metadata files */ + for ( j = 0; j < arg->inputFormatConfig.masa_ism.numObjects; j++ ) + { + if ( i < argc - 4 ) + { + if ( strcmp( argv[i], "NULL" ) == 0 || strcmp( argv[i], "null" ) == 0 ) + { + /* no metadata input file -> encode only audio streams */ + arg->inputFormatConfig.masa_ism.metadataFiles[j] = NULL; + } + else + { + arg->inputFormatConfig.masa_ism.metadataFiles[j] = argv[i]; + } + + i++; + } + else + { + fprintf( stderr, "Error: not enough arguments\n\n" ); + usage_enc(); + } + } + + if ( i < argc - 4 ) + { + arg->masaMetadataFile = argv[i]; + i++; + } + else + { + fprintf( stderr, "Error: not enough MASA arguments\n\n" ); + usage_enc(); + } + } + else if ( strcmp( to_upper( argv[i] ), "-ISM_SBA" ) == 0 ) + { + arg->inputFormat = IVAS_ENC_INPUT_SBA_ISM; + i++; + + if ( i < argc - 5 ) + { + if ( sscanf( argv[i], "%d", &tmp ) > 0 ) + { + i++; + } + + if ( tmp <= 0 ) + { + fprintf( stderr, "Error: Too low number of ISM channels specified!\n\n" ); + usage_enc(); + } + else + { + if ( tmp <= IVAS_MAX_NUM_OBJECTS ) /* number of ISM channels */ + { + arg->inputFormatConfig.sba_ism.numObjects = (int16_t) tmp; + } + else + { + fprintf( stderr, "Error: Too high number of ISM channels!\n\n" ); + usage_enc(); + } + } + } + else + { + fprintf( stderr, "Error: Number of ISM channels not specified!\n\n" ); + usage_enc(); + } + + if ( i < argc - 4 ) + { + if ( sscanf( argv[i], "%d", &tmp ) > 0 ) + { + i++; + } + + arg->inputFormatConfig.sba_ism.isPlanar = ( tmp < 0 ); + + tmp = abs( tmp ); + switch ( tmp ) + { + case 1: + arg->inputFormatConfig.sba_ism.order = IVAS_ENC_SBA_FOA; + break; + case 2: + arg->inputFormatConfig.sba_ism.order = IVAS_ENC_SBA_HOA2; + break; + case 3: + arg->inputFormatConfig.sba_ism.order = IVAS_ENC_SBA_HOA3; + break; + default: + fprintf( stderr, "Error: Wrong SBA order specified!\n\n" ); + usage_enc(); + return false; + } + } + + /* read input metadata files */ + for ( j = 0; j < arg->inputFormatConfig.sba_ism.numObjects; j++ ) + { + if ( i < argc - 4 ) + { + if ( strcmp( argv[i], "NULL" ) == 0 || strcmp( argv[i], "null" ) == 0 ) + { + /* no metadata input file -> encode only audio streams */ + arg->inputFormatConfig.sba_ism.metadataFiles[j] = NULL; + } + else + { + arg->inputFormatConfig.sba_ism.metadataFiles[j] = argv[i]; + } + + i++; + } + else + { + fprintf( stderr, "Error: not enough arguments\n\n" ); + usage_enc(); + } + } + } + else if ( strcmp( argv_to_upper, "-STEREO_DMX_EVS" ) == 0 ) + { + arg->inputFormat = IVAS_ENC_INPUT_MONO; + arg->inputFormatConfig.stereoToMonoDownmix = true; + + i++; + } + else if ( strcmp( argv_to_upper, "-BYPASS" ) == 0 ) // TODO: should be renamed to "-pca" + { + i++; + if ( i < argc - 4 ) + { + switch ( atoi( argv[i] ) ) + { + case 1: + { + arg->pca = 0; + break; + } + case 2: + { + arg->pca = 1; + break; + } + default: + { + fprintf( stderr, "Error: SBA PCA bypass argument is out of range (%d), expected 1 or 2\n", (int32_t) atoi( argv[i] ) ); + usage_enc(); + return false; + } + } + i++; + } + else + { + fprintf( stderr, "Error: SBA unspecified PCA BYPASS value \n\n" ); + usage_enc(); + return false; + } + } + + /*-----------------------------------------------------------------* + * Option not recognized + *-----------------------------------------------------------------*/ + else + { + fprintf( stderr, "Error: option not recognized, %s\n\n", argv[i] ); + usage_enc(); + return false; + } + } /* end of while */ + + /*-----------------------------------------------------------------* + * Mandatory input arguments + *-----------------------------------------------------------------*/ + + /*-----------------------------------------------------------------* + * Bitrate + *-----------------------------------------------------------------*/ + + if ( i < argc - 2 ) + { + /* check if profile file has been entered instead of a fixed bitrate */ + if ( !is_digits_only( argv[i] ) ) + { + arg->bitrateProfileFile = argv[i]; + } + else + { + arg->initBitrate = atoi( argv[i] ); + } + + i++; + } + else + { + fprintf( stderr, "Error: no bitrate specified\n\n" ); + usage_enc(); + return false; + } + + /*-----------------------------------------------------------------* + * Input sampling frequency + *-----------------------------------------------------------------*/ + + if ( i < argc - 2 ) + { + arg->inputFs = atoi( argv[i] ) * 1000; + i++; + } + else + { + fprintf( stderr, "Error: no input sampling frequency specified\n\n" ); + usage_enc(); + return false; + } + + /* for EVS mono, restore default behavior, i.e. SWB as default maxBandwidth if not set by the user otherwise */ + if ( arg->max_bwidth_user == false ) + { + arg->maxBandwidth = IVAS_ENC_GetDefaultBandwidth( ( arg->inputFormat == IVAS_ENC_INPUT_MONO ) ? true : false ); + } + + /* Prevent maxBandwidth from being higher than inputFs/2 */ + if ( arg->inputFs == 8000 && arg->maxBandwidth > IVAS_ENC_BANDWIDTH_NB ) + { + arg->maxBandwidth = IVAS_ENC_BANDWIDTH_NB; + } + else if ( arg->inputFs == 16000 && arg->maxBandwidth > IVAS_ENC_BANDWIDTH_WB ) + { + arg->maxBandwidth = IVAS_ENC_BANDWIDTH_WB; + } + else if ( arg->inputFs == 32000 && arg->maxBandwidth > IVAS_ENC_BANDWIDTH_SWB ) + { + arg->maxBandwidth = IVAS_ENC_BANDWIDTH_SWB; + } + + /*-----------------------------------------------------------------* + * Input file + *-----------------------------------------------------------------*/ + + if ( i < argc - 1 ) + { + arg->inputWavFilename = argv[i]; + i++; + } + else + { + fprintf( stderr, "Error: no input file specified\n\n" ); + usage_enc(); + return false; + } + + /*-----------------------------------------------------------------* + * Output bitstream file + *-----------------------------------------------------------------*/ + + if ( i < argc ) + { + arg->outputBitstreamFilename = argv[i]; + i++; + } + else + { + fprintf( stderr, "Error: no output bitstream file specified\n\n" ); + usage_enc(); + return false; + } + + return true; +} + + +/*---------------------------------------------------------------------* + * usage_enc() + * + * Print the usage of the "ivas_cod" program + *---------------------------------------------------------------------*/ + +static void usage_enc( void ) +{ + fprintf( stdout, "Usage: IVAS_cod.exe [Options] R Fs input_file bitstream_file\n\n" ); + + fprintf( stdout, "Mandatory parameters:\n" ); + fprintf( stdout, "---------------------\n" ); + + fprintf( stdout, "R : Bitrate in bps, \n" ); + fprintf( stdout, " for EVS native modes R = (5900*, 7200, 8000, 9600, 13200, 16400,\n" ); + fprintf( stdout, " 24400, 32000, 48000, 64000, 96000, 128000) \n" ); + fprintf( stdout, " *VBR mode (average bitrate),\n" ); + fprintf( stdout, " for AMR-WB IO modes R = (6600, 8850, 12650, 14250, 15850, 18250,\n" ); + fprintf( stdout, " 19850, 23050, 23850) \n" ); + fprintf( stdout, " for IVAS stereo R = (13200, 16400, 24400, 32000, 48000, 64000, 80000, \n" ); + fprintf( stdout, " 96000, 128000, 160000, 192000, 256000) \n" ); + fprintf( stdout, " for IVAS ISM R = 13200 for 1 ISM, 16400 for 1 ISM and 2 ISM, \n" ); + fprintf( stdout, " (24400, 32000, 48000, 64000, 80000, 96000, 128000) \n" ); + fprintf( stdout, " for 2 ISM, 3 ISM and 4 ISM also 160000, 192000, 256000) \n" ); + fprintf( stdout, " for 3 ISM and 4 ISM also 384000 \n" ); + fprintf( stdout, " for 4 ISM also 512000 \n" ); + fprintf( stdout, " for IVAS SBA, MASA, MC, ISM-SBA, and ISM-MASA R=(13200, 16400, 24400, 32000, 48000, 64000,\n" ); + fprintf( stdout, " 80000, 96000, 128000, 160000, 192000, 256000, 384000, 512000) \n" ); + fprintf( stdout, " Alternatively, R can be a bitrate switching file which consists of R values\n" ); + fprintf( stdout, " indicating the bitrate for each frame in bps. These values are stored in\n" ); + fprintf( stdout, " binary format using 4 bytes per value\n" ); + fprintf( stdout, "Fs : Input sampling rate in kHz, Fs = (8, 16, 32 or 48) \n" ); + + fprintf( stdout, "input_file : Input audio filename \n" ); + fprintf( stdout, "bitstream_file : Output bitstream filename \n\n" ); + + fprintf( stdout, "Options:\n" ); + fprintf( stdout, "--------\n" ); + fprintf( stdout, "EVS mono is default, for IVAS choose one of the following: -stereo, -ism, -sba, -masa, -mc, -ism_sba, -ism_masa\n" ); + fprintf( stdout, "-stereo : Stereo format \n" ); + fprintf( stdout, "-ism (+)Ch Files : ISM format \n" ); + fprintf( stdout, " where Ch specifies the number of ISMs (1-4)\n" ); + fprintf( stdout, " where positive (+) indicates extended metadata (only 64 kbps and up) \n" ); + fprintf( stdout, " and Files specify input files containing metadata, one file per object\n" ); + fprintf( stdout, " (use NULL for no input metadata)\n" ); + fprintf( stdout, "-sba +/-Order : Scene Based Audio input format (Ambisonics ACN/SN3D),\n" ); + fprintf( stdout, " where Order specifies the Ambisionics order (1-3),\n" ); + fprintf( stdout, " where positive (+) means full 3D and negative (-) only 2D/planar components to be coded\n" ); + fprintf( stdout, "-masa Ch File : MASA format \n" ); + fprintf( stdout, " where Ch specifies the number of MASA input/transport channels (1 or 2): \n" ); + fprintf( stdout, " and File specifies input file containing parametric MASA metadata \n" ); + fprintf( stdout, "-ism_sba IsmCh +/-Order IsmFiles : SBA and ISM combined format\n" ); + fprintf( stdout, " where IsmCh specifies the number of ISMs (1-4)\n" ); + fprintf( stdout, " and Order specifies the SBA order (1 to 3) \n" ); + fprintf( stdout, " and IsmFiles specify input files containing ISM metadata, one file per object \n" ); + fprintf( stdout, "-ism_masa IsmCh MasaCh IsmFiles MasaFile : MASA and ISM combined format \n" ); + fprintf( stdout, " where IsmCh specifies the number of ISMs (1-4),\n" ); + fprintf( stdout, " MasaCh specifies the number of MASA input/transport channels (1-2), \n" ); + fprintf( stdout, " IsmFiles specify input files containing ISM metadata, one file per object, \n" ); + fprintf( stdout, " and MasaFile specifies input file containing parametric MASA metadata \n" ); + fprintf( stdout, "-mc InputConf : Multi-channel format\n" ); + fprintf( stdout, " where InputConf specifies the channel configuration: 5_1, 7_1, 5_1_2, 5_1_4, 7_1_4\n" ); + fprintf( stdout, " Loudspeaker positions are assumed to have azimuth and elevation as per \n" ); + fprintf( stdout, " ISO/IEC 23091-3:2018 Table 3. Channel order is as per ISO/IEC 23008-3:2015 Table 95.\n" ); + fprintf( stdout, " See readme.txt for details.\n" ); + fprintf( stdout, "-dtx D : Activate DTX mode, D = (0, 3-100) is the SID update rate\n" ); + fprintf( stdout, " where 0 = adaptive, 3-100 = fixed in number of frames,\n" ); + fprintf( stdout, " default is deactivated\n" ); + fprintf( stdout, "-dtx : Activate DTX mode with a SID update rate of 8 frames\n" ); + fprintf( stdout, " Note: DTX is supported in EVS, stereo, ISM, SBA up to 80kbps and MASA up to 128kbps \n" ); + fprintf( stdout, "-rf p o : Activate channel-aware mode for WB and SWB signal at 13.2kbps, \n" ); + fprintf( stdout, " where FEC indicator, p: LO or HI, and FEC offset, o: 2, 3, 5, or 7 in number of frames.\n" ); + fprintf( stdout, " Alternatively p and o can be replaced by a rf configuration file with each line \n" ); + fprintf( stdout, " contains the values of p and o separated by a space, \n" ); + fprintf( stdout, " default is deactivated \n" ); + fprintf( stdout, "-max_band B : Activate bandwidth limitation, B = (NB, WB, SWB or FB)\n" ); + fprintf( stdout, " alternatively, B can be a text file where each line contains \"nb_frames B\"\n" ); + fprintf( stdout, "-no_delay_cmp : Turn off delay compensation\n" ); + fprintf( stdout, "-stereo_dmx_evs : Activate stereo downmix function for EVS.\n" ); + fprintf( stdout, "-binaural : Optional indication that input is binaural audio (to be used with -stereo or -stereo_dmx_evs)\n" ); + fprintf( stdout, "-mime : Mime output bitstream file format\n" ); + fprintf( stdout, " The encoder produces TS26.445 Annex.2.6 Mime Storage Format, (not RFC4867 Mime Format).\n" ); + fprintf( stdout, " default output bitstream file format is G.192\n" ); + fprintf( stdout, "-bypass mode : SBA PCA by-pass, mode = (1, 2), 1 = PCA off, 2 = signal adaptive, default is 1\n" ); + fprintf( stdout, "-level level : Complexity level, level = (1, 2, 3), will be defined after characterisation. \n" ); + fprintf( stdout, " Currently, all values default to level 3 (full functionality).\n" ); + fprintf( stdout, "-q : Quiet mode, no frame counters\n" ); + fprintf( stdout, " default is deactivated\n" ); + fprintf( stdout, "\n" ); + + return; +} + + +/*---------------------------------------------------------------------* + * readBandwidth() + * + * + *---------------------------------------------------------------------*/ + +static bool readBandwidth( + FILE *file, + IVAS_ENC_BANDWIDTH *bandwidth, + int32_t *bandwidthFrameCounter ) +{ + int16_t res; + char stmp[4]; + + if ( *bandwidthFrameCounter == 0 ) + { + /* read next bandwidth value and number of frames from the profile file */ + while ( ( res = (int16_t) fscanf( file, "%d %3s", bandwidthFrameCounter, stmp ) ) != 2 && feof( file ) ) + { + rewind( file ); + } + + ( *bandwidthFrameCounter )--; + + to_upper( stmp ); + + if ( strcmp( stmp, "NB" ) == 0 ) + { + *bandwidth = IVAS_ENC_BANDWIDTH_NB; + } + else if ( strcmp( stmp, "WB" ) == 0 ) + { + *bandwidth = IVAS_ENC_BANDWIDTH_WB; + } + else if ( strcmp( stmp, "SWB" ) == 0 ) + { + *bandwidth = IVAS_ENC_BANDWIDTH_SWB; + } + else if ( strcmp( stmp, "FB" ) == 0 ) + { + *bandwidth = IVAS_ENC_BANDWIDTH_FB; + } + else + { + fprintf( stderr, "Error: incorrect bandwidth specified (only NB, WB, SWB and FB are supported)\n\n" ); + usage_enc(); + return false; + } + } + else + { + /* current profile still active, only decrease the counter */ + ( *bandwidthFrameCounter )--; + } + + return true; +} + + +/*---------------------------------------------------------------------* + * readBitrate() + * + * + *---------------------------------------------------------------------*/ + +static bool readBitrate( + FILE *file, + int32_t *bitrate ) +{ + for ( int32_t i = 0; i < 2; ++i ) + { + if ( fread( bitrate, sizeof( int32_t ), 1, file ) == 1 ) + { + return true; + } + + rewind( file ); + } + + fprintf( stderr, "Error: cannot read the bitrate profile file\n\n" ); + usage_enc(); + return false; +} + + diff --git a/apps/renderer.c b/apps/renderer.c new file mode 100644 index 0000000000000000000000000000000000000000..7a04cfb0bdbf67b3ac254abb2f1221482f1af16e --- /dev/null +++ b/apps/renderer.c @@ -0,0 +1,3283 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include "lib_rend.h" +#include +#include +#include +#include "audio_file_reader.h" +#include "audio_file_writer.h" +#include "cmdl_tools.h" +#include "cmdln_parser.h" +#include "hrtf_file_reader.h" +#include "ism_file_reader.h" +#include "ls_custom_file_reader.h" +#include "masa_file_reader.h" +#include "masa_file_writer.h" +#include "render_config_reader.h" +#include "rotation_file_reader.h" +#include "vector3_pair_file_reader.h" +#include "wmc_auto.h" + + +#define WMC_TOOL_SKIP + +/*------------------------------------------------------------------------------------------* + * Local constants + *------------------------------------------------------------------------------------------*/ + +#define RENDERER_MAX_CLI_ARG_LENGTH ( FILENAME_MAX ) +#define RENDERER_MAX_METADATA_LENGTH 8192 +#define RENDERER_MAX_METADATA_LINE_LENGTH 1024 + + +#define IVAS_MAX16B_FLT 32767.0f +#define IVAS_MIN16B_FLT ( -32768.0f ) + +#if !defined( WMOPS ) +static +#endif + int32_t frame = 0; + +#ifdef _WIN32 +#define SEP_FOLDER '\\' +#else +#define SEP_FOLDER '/' +#endif + +#ifndef _WIN32 +#define max( a, b ) ( ( ( a ) > ( b ) ) ? ( a ) : ( b ) ) +#define min( a, b ) ( ( ( a ) < ( b ) ) ? ( a ) : ( b ) ) +#endif + + +/*------------------------------------------------------------------------------------------* + * Local structures + *------------------------------------------------------------------------------------------*/ + +typedef struct +{ + uint32_t frameCounter; + uint16_t numObjects; + IsmFileReader *ismReaders[RENDERER_MAX_ISM_INPUTS]; + uint32_t numPositions[RENDERER_MAX_ISM_INPUTS]; + IVAS_ISM_METADATA *positions[RENDERER_MAX_ISM_INPUTS]; /* size: [RENDERER_MAX_ISM_INPUTS][numPositions[object_index]] */ + uint16_t *positionDurations[RENDERER_MAX_ISM_INPUTS]; /* size: [RENDERER_MAX_ISM_INPUTS][numPositions[object_index]] */ + uint32_t currentPositionIdxs[RENDERER_MAX_ISM_INPUTS]; /* Index of current position as listed in the metadata file */ + uint16_t durationCounters[RENDERER_MAX_ISM_INPUTS]; /* Number of frames spent at current position */ +} IsmPositionProvider; + +typedef struct +{ + float lfe_azi; + float lfe_ele; + float lfe_gain_dB; + char lfe_routing_mtx[FILENAME_MAX]; +} LfeRoutingConfig; + +typedef struct +{ + IVAS_AUDIO_CONFIG audioConfig; + int32_t inputChannelIndex; + float gain_dB; +} RendererInput; + +typedef struct +{ + IVAS_ISM_METADATA positions[RENDERER_MAX_ISM_INPUTS]; + int16_t numObjects; +} ObjectPositionBuffer; + +typedef struct +{ + RendererInput audioObjects[RENDERER_MAX_ISM_INPUTS]; + uint16_t numAudioObjects; + RendererInput multiChannelBuses[RENDERER_MAX_MC_INPUTS]; + uint16_t numMultiChannelBuses; + RendererInput ambisonicsBuses[RENDERER_MAX_SBA_INPUTS]; + uint16_t numAmbisonicsBuses; + IVAS_CUSTOM_LS_DATA inSetupCustom; + RendererInput masaBuses[RENDERER_MAX_MASA_INPUTS]; + uint16_t numMasaBuses; +} InputConfig; + +typedef struct +{ + IVAS_AUDIO_CONFIG audioConfig; + IVAS_CUSTOM_LS_DATA outSetupCustom; +} OutputConfig; + +typedef struct +{ + char executableName[RENDERER_MAX_CLI_ARG_LENGTH]; + char inputFilePath[RENDERER_MAX_CLI_ARG_LENGTH]; + char outputFilePath[RENDERER_MAX_CLI_ARG_LENGTH]; + int32_t sampleRate; + InputConfig inConfig; + OutputConfig outConfig; + char inMetadataFilePaths[RENDERER_MAX_ISM_INPUTS][RENDERER_MAX_CLI_ARG_LENGTH]; + int16_t numInMetadataFiles; + char headRotationFilePath[RENDERER_MAX_CLI_ARG_LENGTH]; + char referenceVectorFilePath[RENDERER_MAX_CLI_ARG_LENGTH]; + char referenceRotationFilePath[RENDERER_MAX_CLI_ARG_LENGTH]; + char externalOrientationFilePath[RENDERER_MAX_CLI_ARG_LENGTH]; + char customHrtfFilePath[RENDERER_MAX_CLI_ARG_LENGTH]; + char renderConfigFilePath[RENDERER_MAX_CLI_ARG_LENGTH]; + int8_t orientation_tracking; + int16_t nonDiegeticPan; + float nonDiegeticPanGain; + IVAS_REND_COMPLEXITY_LEVEL complexityLevel; + bool delayCompensationEnabled; + bool quietModeEnabled; + bool sceneDescriptionInput; + float inputGainGlobal; /* Linear gain (not in dB) */ + bool lfePanningEnabled; + float lfeConfigGain; /* Linear gain (not in dB) */ + float lfeConfigAzimuth; + float lfeConfigElevation; + bool lfeCustomRoutingEnabled; + char inLfePanningMatrixFile[RENDERER_MAX_CLI_ARG_LENGTH]; + float syncMdDelay; + bool framing_5ms; + uint16_t directivityPatternId[RENDERER_MAX_ISM_INPUTS]; + uint16_t acousticEnvironmentId; +} CmdlnArgs; + +typedef enum +{ + CmdLnOptionId_inputFile = 1, + CmdLnOptionId_inputFormat, + CmdLnOptionId_outputFile, + CmdLnOptionId_outputFormat, + CmdLnOptionId_sampleRate, + CmdLnOptionId_trajFile, + CmdLnOptionId_refRotFile, + CmdLnOptionId_customHrtfFile, + CmdLnOptionId_renderConfigFile, + CmdLnOptionId_nonDiegeticPan, + CmdLnOptionId_orientationTracking, + CmdlnOptionId_lfePosition, + CmdlnOptionId_lfeMatrix, + CmdLnOptionId_complexityLevel, + CmdLnOptionId_noDelayCmp, + CmdLnOptionId_quietModeEnabled, + CmdLnOptionId_inputMetadata, + CmdLnOptionId_listFormats, + CmdLnOptionId_inputGain, + CmdLnOptionId_referenceVectorFile, + CmdLnOptionId_exteriorOrientationFile, + CmdLnOptionId_framing5ms, + CmdLnOptionId_syncMdDelay, + CmdLnOptionId_directivityPatternId, + CmdLnOptionId_acousticEnvironmentId +} CmdLnOptionId; + +static const CmdLnParser_Option cliOptions[] = { + { + .id = CmdLnOptionId_inputFile, + .match = "input_file", + .matchShort = "i", + .description = "Path to the input file (WAV, raw PCM or scene description file)", + }, + { + .id = CmdLnOptionId_inputFormat, + .match = "input_format", + .matchShort = "if", + .description = "Audio format of input file (e.g. 5_1 or HOA3 or META, use -l for a list)", + }, + { + .id = CmdLnOptionId_inputMetadata, + .match = "input_metadata", + .matchShort = "im", + .description = "Space-separated list of path to metadata files for ISM or MASA inputs", + }, + { + .id = CmdLnOptionId_outputFile, + .match = "output_file", + .matchShort = "o", + .description = "Path to the output file", + }, + { + .id = CmdLnOptionId_outputFormat, + .match = "output_format", + .matchShort = "of", + .description = "Output format to render.\nAlternatively, can be a custom loudspeaker layout file", + }, + { + .id = CmdLnOptionId_sampleRate, + .match = "sample_rate", + .matchShort = "fs", + .description = "Input sampling rate in kHz (16, 32, 48) - required only with raw PCM inputs", + }, + { + .id = CmdLnOptionId_trajFile, + .match = "trajectory_file", + .matchShort = "tf", + .description = "Head rotation trajectory file for simulation of head tracking (only for binaural outputs)", + }, + { + .id = CmdLnOptionId_refRotFile, + .match = "reference_rotation_file", + .matchShort = "rf", + .description = "Reference rotation trajectory file for simulation of head tracking (only for binaural outputs)", + }, + { + .id = CmdLnOptionId_customHrtfFile, + .match = "custom_hrtf", + .matchShort = "hrtf", + .description = "Custom HRTF file for binaural rendering (only for binaural outputs)", + }, + { + .id = CmdLnOptionId_renderConfigFile, + .match = "render_config", + .matchShort = "rc", + .description = "Binaural renderer configuration file (only for binaural outputs)", + }, + { + .id = CmdLnOptionId_nonDiegeticPan, + .match = "non_diegetic_pan", + .matchShort = "ndp", + .description = "Panning mono non diegetic sound to stereo -90<= pan <= 90\nleft or l or 90->left, right or r or -90->right, center or c or 0 ->middle\n", + }, + { + .id = CmdLnOptionId_orientationTracking, + .match = "tracking_type", + .matchShort = "otr", + .description = "Head orientation tracking type: 'none', 'ref', 'avg' or `ref_vec` or `ref_vec_lev` (only for binaural outputs)", + }, + { + .id = CmdlnOptionId_lfePosition, + .match = "lfe_position", + .matchShort = "lp", + .description = "Output LFE position. Comma-delimited triplet of [gain, azimuth, elevation] where gain is linear (like --gain, -g) and azimuth, elevation are in degrees.\nIf specified, overrides the default behavior which attempts to map input to output LFE channel(s)", + }, + { .id = CmdlnOptionId_lfeMatrix, + .match = "lfe_matrix", + .matchShort = "lm", + .description = "LFE panning matrix. File (CSV table) containing a matrix of dimensions [ num_input_lfe x num_output_channels ] with elements specifying linear routing gain (like --gain, -g). \nIf specified, overrides the output LFE position option and the default behavior which attempts to map input to output LFE channel(s)" }, + { + .id = CmdLnOptionId_noDelayCmp, + .match = "no_delay_cmp", + .matchShort = "ndc", + .description = "[flag] Turn off delay compensation", + }, + { + .id = CmdLnOptionId_complexityLevel, + .match = "complexity_level", + .matchShort = "level", + .description = "Complexity level, level = (1, 2, 3), will be defined after characterisation.", + }, + { + .id = CmdLnOptionId_quietModeEnabled, + .match = "quiet", + .matchShort = "q", + .description = "[flag] Limit printouts to terminal", + }, + { + .id = CmdLnOptionId_inputGain, + .match = "gain", + .matchShort = "g", + .description = "Input gain (linear, not in dB) to be applied to input audio file", + }, + { + .id = CmdLnOptionId_listFormats, + .match = "list", + .matchShort = "l", + .description = "List supported audio formats", + }, + { + .id = CmdLnOptionId_referenceVectorFile, + .match = "reference_vector_file", + .matchShort = "rvf", + .description = "Reference vector trajectory file for simulation of head tracking (only for binaural outputs)", + }, + { + .id = CmdLnOptionId_exteriorOrientationFile, + .match = "exterior_orientation_file", + .matchShort = "exof", + .description = "External orientation trajectory file for simulation of external orientations", + }, + { + .id = CmdLnOptionId_framing5ms, + .match = "framing_5ms", + .matchShort = "fr5", + .description = "Render audio with 5 ms framing.", + }, + { + .id = CmdLnOptionId_syncMdDelay, + .match = "sync_md_delay", + .matchShort = "smd", + .description = "Metadata Synchronization Delay in ms, Default is 0. Quantized by 5ms subframes for TDRenderer (13ms -> 10ms -> 2subframes)", + }, + { + .id = CmdLnOptionId_directivityPatternId, + .match = "ism_directivity_pattern_id", + .matchShort = "dpid", + .description = "Directivity pattern ID(s) = [ID1, ID2, ID3, ID4]. Space-separated list of up to 4 numbers (unsigned integers) can be specified for BINAURAL and BINAURAL_ROOM_REVERB output configuration.\nID1, ID2, ID3, ID4 specify the directivity pattern IDs used for ISMs 1,2,3 and 4 respectively.\nThis options needs to be accompanied by a render_config file, otherwise a default directivity pattern is used.", + }, + { + .id = CmdLnOptionId_acousticEnvironmentId, + .match = "acoustic_environment_id", + .matchShort = "aeid", + .description = "Acoustic environment ID (number >= 0) for BINAURAL_ROOM_REVERB output configuration", + }, +}; + + +/*------------------------------------------------------------------------------------------* + * Local function prototypes + *------------------------------------------------------------------------------------------*/ + +static const int32_t numCliOptions = sizeof( cliOptions ) / sizeof( CmdLnParser_Option ); + +static IVAS_AUDIO_CONFIG ambisonicsOrderToEnum( const int16_t order ); + +static void parseSceneDescriptionFile( char *path, char *audioFilePath, InputConfig *inConfig, IsmPositionProvider *positionProvider, MasaFileReader **masaReaders, LfeRoutingConfig **lfeRoutingConfigs ); + +static ivas_error parseCustomLayoutFile( const char *filePath, IVAS_CUSTOM_LS_DATA *pLsSetupCustom ); + +static CmdlnArgs parseCmdlnArgs( const int argc, char **argv ); + +static IsmPositionProvider *IsmPositionProvider_open( void ); + +static void IsmPositionProvider_getNextFrame( IsmPositionProvider *positionProvider, ObjectPositionBuffer *objectMetadataBuffer ); + +static void IsmPositionProvider_close( IsmPositionProvider *positionProvider ); + +static LfeRoutingConfig *LfeRoutingConfig_open( void ); + +static void LfeRoutingConfig_close( LfeRoutingConfig *lfeRoutingCfg ); + +static void readFromShorthandMetadata( IsmPositionProvider *positionProvider, ObjectPositionBuffer *objectMetadataBuffer, const uint32_t objIdx ); + +void getMetadataFromFileReader( IsmFileReader *ismReader, ObjectPositionBuffer *objectMetadataBuffer, const uint32_t objIdx ); + +static void splitConfigFile( const char *mdfFilePath, char *metadataString, uint32_t *metadataStringLength, char *wavFileName, uint32_t *wavFileNameLength ); + +static char *readNextMetadataChunk( char *line, const char *delimiter ); + +static void parseUint8( const char *line, uint8_t *ret ); + +static int8_t parseUint32( const char *line, uint32_t *ret ); + +static int8_t parseInt32( const char *line, int32_t *ret ); + +static void parseObjectPosition( char *line, IVAS_ISM_METADATA *position, uint16_t *positionDuration ); + +static void parseMetadata( char *metadataString, char *inDir, InputConfig *inConfig, IsmPositionProvider *positionProvider, MasaFileReader **masaReaders, LfeRoutingConfig **lfeRoutingConfigs ); + +static ivas_error parseLfePanMtxFile( const char *lfeRoutingMatrixFilePath, IVAS_REND_LfePanMtx *lfePanMtx ); + +static void printSupportedAudioConfigs( void ); + +static IVAS_AUDIO_CONFIG parseAudioConfig( const char *configString ); + +static void convertInputBuffer( const int16_t *intBuffer, const int16_t numIntSamplesPerChannel, const int16_t numFloatSamplesPerChannel, const int16_t numChannels, float *floatBuffer ); + +static void convertOutputBuffer( const float *floatBuffer, const int16_t numSamplesPerChannel, const int16_t numChannels, int16_t *intBuffer ); + + +/*------------------------------------------------------------------------------------------* + * Local functions + *------------------------------------------------------------------------------------------*/ + +static IVAS_REND_ReadOnlyAudioBuffer getReadOnlySubBuffer( + IVAS_REND_AudioBuffer buffer, + const int16_t chBeginIdx, + const int16_t numChannels ) +{ + IVAS_REND_ReadOnlyAudioBuffer subBuffer; + + subBuffer.config = buffer.config; + subBuffer.config.numChannels = numChannels; + subBuffer.data = buffer.data + subBuffer.config.numSamplesPerChannel * chBeginIdx; + + return subBuffer; +} + + +static int16_t getTotalNumInChannels( + IVAS_REND_HANDLE hIvasRend, + IVAS_REND_InputId mcIds[RENDERER_MAX_MC_INPUTS], + IVAS_REND_InputId ismIds[RENDERER_MAX_ISM_INPUTS], + IVAS_REND_InputId sbaIds[RENDERER_MAX_SBA_INPUTS], + IVAS_REND_InputId masaIds[RENDERER_MAX_MASA_INPUTS] +) +{ + int16_t totalNumInChannels = 0; + int16_t i, numInputChannels; + ivas_error error; + + for ( i = 0; i < RENDERER_MAX_MC_INPUTS; ++i ) + { + if ( mcIds[i] == 0 ) + { + /* Skip inactive inputs */ + continue; + } + + if ( ( error = IVAS_REND_GetInputNumChannels( hIvasRend, mcIds[i], &numInputChannels ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + totalNumInChannels += numInputChannels; + } + + for ( i = 0; i < RENDERER_MAX_ISM_INPUTS; ++i ) + { + if ( ismIds[i] == 0 ) + { + /* Skip inactive inputs */ + continue; + } + + if ( ( error = IVAS_REND_GetInputNumChannels( hIvasRend, ismIds[i], &numInputChannels ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + + /* In case of MASA output, modify the numInputChannels to contain all objects. Otherwise, keep the original value. */ + if ( ( error = IVAS_REND_GetNumAllObjects( hIvasRend, &numInputChannels ) ) != IVAS_ERR_OK ) + { + return error; + } + totalNumInChannels += numInputChannels; + } + + for ( i = 0; i < RENDERER_MAX_SBA_INPUTS; ++i ) + { + if ( sbaIds[i] == 0 ) + { + /* Skip inactive inputs */ + continue; + } + + + if ( ( error = IVAS_REND_GetInputNumChannels( hIvasRend, sbaIds[i], &numInputChannels ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + totalNumInChannels += numInputChannels; + } + + for ( i = 0; i < RENDERER_MAX_MASA_INPUTS; ++i ) + { + if ( masaIds[i] == 0 ) + { + /* Skip inactive inputs */ + continue; + } + + if ( ( error = IVAS_REND_GetInputNumChannels( hIvasRend, masaIds[i], &numInputChannels ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + totalNumInChannels += numInputChannels; + } + + + return totalNumInChannels; +} + + +static void setupWithSingleFormatInput( + CmdlnArgs args, + char *audioFilePath, + IsmPositionProvider *positionProvider, + MasaFileReader **masaReaders +) +{ + /* With single-format input, inputFilePath is the path to input audio file. */ + strncpy( audioFilePath, args.inputFilePath, FILENAME_MAX - 1 ); + + /* Depending on input format, prepare metadata reading for ISM or MASA */ + if ( args.inConfig.numMasaBuses != 0 ) + { + if ( args.inConfig.numMasaBuses != args.numInMetadataFiles ) + { + fprintf( stderr, "Error: all MASA inputs must have a corresponding metadata file" ); + exit( -1 ); + } + + for ( int16_t i = 0; i < args.numInMetadataFiles; ++i ) + { + masaReaders[i] = MasaFileReader_open( args.inMetadataFilePaths[i] ); + if ( masaReaders[i] == NULL ) + { + fprintf( stderr, "Could not open MASA metadata file %s\n", args.inMetadataFilePaths[i] ); + exit( -1 ); + } + } + } + else if ( args.inConfig.numAudioObjects != 0 ) + { + positionProvider->numObjects = args.inConfig.numAudioObjects; + for ( int16_t i = 0; i < positionProvider->numObjects; ++i ) + { + /* It is allowed on CLI to have no metadata for an ISM input - skip opening if string is empty or contains "NULL" */ + char charBuf[FILENAME_MAX]; + strncpy( charBuf, args.inMetadataFilePaths[i], min( FILENAME_MAX, RENDERER_MAX_CLI_ARG_LENGTH ) - 1 ); + charBuf[min( FILENAME_MAX, RENDERER_MAX_CLI_ARG_LENGTH ) - 1] = '\0'; + to_upper( charBuf ); + if ( isEmptyString( args.inMetadataFilePaths[i] ) || strncmp( charBuf, "NULL", 4 ) == 0 ) + { + continue; + } + + positionProvider->ismReaders[i] = IsmFileReader_open( args.inMetadataFilePaths[i] ); + if ( positionProvider->ismReaders[i] == NULL ) + { + fprintf( stderr, "Could not open object metadata file %s\n", args.inMetadataFilePaths[i] ); + exit( -1 ); + } + } + } + + return; +} + + +static float dBToLin( + const float gain_dB ) +{ + return powf( 10.0f, gain_dB / 20.0f ); +} + + + + +/*------------------------------------------------------------------------------------------* + * main() + * + * Main External renderer function for command-line interface + *------------------------------------------------------------------------------------------*/ + +int main( + int argc, + char **argv ) +{ + IVAS_REND_HANDLE hIvasRend; + RotFileReader *headRotReader = NULL; + RotFileReader *externalOrientationFileReader = NULL; + RotFileReader *referenceRotReader = NULL; + Vector3PairFileReader *referenceVectorReader = NULL; + hrtfFileReader *hrtfFileReader = NULL; + IsmPositionProvider *positionProvider; + LfeRoutingConfig *lfeRoutingConfigs[RENDERER_MAX_MC_INPUTS]; + RenderConfigReader *renderConfigReader = NULL; + MasaFileReader *masaReaders[RENDERER_MAX_MASA_INPUTS]; + MasaFileWriter *masaWriter = NULL; + IVAS_MASA_METADATA_HANDLE hMasaMetadata[RENDERER_MAX_MASA_INPUTS]; + char audioFilePath[FILENAME_MAX]; + AudioFileReader *audioReader = NULL; + AudioFileWriter *audioWriter; + int32_t inBufferSize; + int32_t outBufferSize; + int16_t *inpInt16Buffer; + float *inFloatBuffer; + int16_t *outInt16Buffer; + float *outFloatBuffer; + IVAS_REND_AudioBuffer inBuffer; + IVAS_REND_AudioBuffer outBuffer; + int16_t numSamplesRead; + int16_t delayNumSamples = -1; + int16_t delayNumSamples_orig = 0; + int16_t zeroPad = 0; + int16_t zeroPadToWrite = 0; + int32_t delayTimeScale = 0; + int16_t i, numChannels; + ivas_error error = IVAS_ERR_OK; + bool splitBinNeedsNewFrame = true; + +#ifdef WMOPS + reset_wmops(); + reset_mem( USE_32BITS ); +#endif + + for ( i = 0; i < RENDERER_MAX_MASA_INPUTS; ++i ) + { + masaReaders[i] = NULL; + hMasaMetadata[i] = NULL; + } + + for ( i = 0; i < RENDERER_MAX_MC_INPUTS; ++i ) + { + lfeRoutingConfigs[i] = NULL; + } + + CmdlnArgs args = parseCmdlnArgs( argc, argv ); + + if ( args.nonDiegeticPan && !( ( args.inConfig.numAudioObjects == 0 && args.inConfig.multiChannelBuses[0].audioConfig == IVAS_AUDIO_CONFIG_MONO ) || + ( args.inConfig.numAudioObjects > 0 && args.inConfig.audioObjects[0].audioConfig == IVAS_AUDIO_CONFIG_OBA && args.inConfig.numAudioObjects == 1 ) ) ) + { + fprintf( stderr, "\ninvalid configuration - non-diegetic panning requires mono or ISM1 input\n" ); + exit( -1 ); + } + + if ( args.nonDiegeticPan && args.outConfig.audioConfig != IVAS_AUDIO_CONFIG_STEREO ) + { + fprintf( stderr, "\ninvalid configuration - non-diegetic panning requires stereo output\n" ); + exit( -1 ); + } + + positionProvider = IsmPositionProvider_open(); + + convert_backslash( args.inputFilePath ); + convert_backslash( args.outputFilePath ); + convert_backslash( args.headRotationFilePath ); + convert_backslash( args.referenceVectorFilePath ); + convert_backslash( args.referenceRotationFilePath ); + convert_backslash( args.inLfePanningMatrixFile ); + convert_backslash( args.externalOrientationFilePath ); + + if ( !isEmptyString( args.headRotationFilePath ) ) + { + if ( RotationFileReader_open( args.headRotationFilePath, &headRotReader ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error opening file: %s\n", args.headRotationFilePath ); + exit( -1 ); + } + } + + if ( !isEmptyString( args.referenceRotationFilePath ) ) + { + if ( RotationFileReader_open( args.referenceRotationFilePath, &referenceRotReader ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error opening file: %s\n", args.referenceRotationFilePath ); + exit( -1 ); + } + } + if ( !isEmptyString( args.referenceVectorFilePath ) ) + { + if ( Vector3PairFileReader_open( args.referenceVectorFilePath, &referenceVectorReader ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error opening file: %s\n", args.referenceVectorFilePath ); + exit( -1 ); + } + } + + if ( !isEmptyString( args.externalOrientationFilePath ) ) + { + if ( RotationFileReader_open( args.externalOrientationFilePath, &externalOrientationFileReader ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error opening file: %s\n", args.externalOrientationFilePath ); + exit( -1 ); + } + } + + if ( !isEmptyString( args.customHrtfFilePath ) ) + { + if ( hrtfFileReader_open( args.customHrtfFilePath, &hrtfFileReader ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error opening file: %s\n", args.customHrtfFilePath ); + exit( -1 ); + } + } + + if ( !isEmptyString( args.renderConfigFilePath ) ) + { + if ( RenderConfigReader_open( args.renderConfigFilePath, &renderConfigReader ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error opening file: %s\n", args.renderConfigFilePath ); + exit( -1 ); + } + } + + /* Initialize main input files, i.e. audio and metadata */ + if ( args.sceneDescriptionInput ) + { + /* With scene description input, inputFilePath is the path to the scene description file. Parse it. */ + parseSceneDescriptionFile( args.inputFilePath, audioFilePath, &args.inConfig, positionProvider, masaReaders, lfeRoutingConfigs ); + } + else + { + /* With single-format input, all information is given on command line. */ + setupWithSingleFormatInput( args, audioFilePath, positionProvider, masaReaders ); + } + + /* Check that there is allowed configuration for MASA format output */ + if ( args.outConfig.audioConfig == IVAS_AUDIO_CONFIG_MASA1 || args.outConfig.audioConfig == IVAS_AUDIO_CONFIG_MASA2 ) + { + if ( args.inConfig.numMasaBuses == 0 ) + { + fprintf( stderr, "\nInvalid configuration - Merging to MASA output requires MASA input and at least one another input to be present\n" ); + fprintf( stderr, "\nMASA input is missing\n" ); + exit( -1 ); + } + + if ( args.inConfig.numAudioObjects == 0 && args.inConfig.numMultiChannelBuses == 0 && args.inConfig.numAmbisonicsBuses == 0 ) + { + fprintf( stderr, "\nInvalid configuration - Merging to MASA output requires MASA input and at least one another input to be present\n" ); + fprintf( stderr, "\nNo object, multi-channel, or Ambisonic input present.\n" ); + exit( -1 ); + } + } + + if ( AudioFileReader_open( &audioReader, audioFilePath ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error opening file: %s\n", audioFilePath ); + exit( -1 ); + } + + int32_t inFileSampleRate = 0; + error = AudioFileReader_getSamplingRate( audioReader, &inFileSampleRate ); + + switch ( error ) + { + case IVAS_ERR_OK: + /* If sampling rate not given on command line, use the one from wav file */ + if ( args.sampleRate == 0 ) + { + args.sampleRate = inFileSampleRate; + } + /* else if sampling rate given on command line, compare with wav file */ + else if ( inFileSampleRate != args.sampleRate ) + { + fprintf( stderr, "Sampling rate mismatch: %d Hz requested, but %d Hz found in file %s\n", args.sampleRate, inFileSampleRate, args.inputFilePath ); + exit( -1 ); + } + break; + case IVAS_ERR_SAMPLING_RATE_UNKNOWN: /* Returned when input is raw PCM */ + if ( args.sampleRate == 0 ) + { + fprintf( stderr, "Sampling rate must be specified on command line when using raw PCM input\n" ); + exit( -1 ); + } + break; + default: + fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + + int16_t inFileNumChannels = 0; + error = AudioFileReader_getNumChannels( audioReader, &inFileNumChannels ); + if ( error != IVAS_ERR_OK && error != IVAS_ERR_NUM_CHANNELS_UNKNOWN ) + { + fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + const int16_t frameSize_smpls = (int16_t) ( ( args.framing_5ms ? 5 : 20 ) * args.sampleRate / 1000 ); + + if ( ( error = IVAS_REND_Open( &hIvasRend, args.sampleRate, args.outConfig.audioConfig, args.nonDiegeticPan, args.nonDiegeticPanGain, ( args.framing_5ms ) ? 1 : 4 ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error opening renderer handle: %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + + /* === Configure === */ + if ( ( error = IVAS_REND_InitConfig( hIvasRend, args.outConfig.audioConfig ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error in Renderer Config Init\n" ); + exit( -1 ); + } + + + if ( args.renderConfigFilePath[0] != '\0' ) + { + IVAS_RENDER_CONFIG_DATA renderConfig; + + /* sanity check */ + if ( ( args.outConfig.audioConfig != IVAS_AUDIO_CONFIG_BINAURAL ) && ( args.outConfig.audioConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) && ( args.outConfig.audioConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) + { + fprintf( stderr, "\nExternal Renderer Config is only supported for binaural output configurations. Exiting. \n" ); + exit( -1 ); + } + + + if ( ( error = IVAS_REND_GetRenderConfig( hIvasRend, &renderConfig ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_DEC_GetRenderConfig failed\n" ); + exit( -1 ); + } + + if ( RenderConfigReader_read( renderConfigReader, args.renderConfigFilePath, &renderConfig ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Failed to read renderer configuration from file %s\n", args.renderConfigFilePath ); + exit( -1 ); + } + + if ( args.outConfig.audioConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) + { + if ( ( error = RenderConfigReader_getAcousticEnvironment( renderConfigReader, args.acousticEnvironmentId, &renderConfig.roomAcoustics ) ) == IVAS_ERR_OK ) + { + if ( RenderConfigReader_checkValues( &renderConfig ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Invalid room acoustics configuration parameters\n\n" ); + exit( -1 ); + } + } + else + { + fprintf( stderr, "Failed to get acoustic environment with ID: %d\n\n", args.acousticEnvironmentId ); + exit( -1 ); + } + renderConfig.roomAcoustics.override = 1; + } + + if ( ( error = IVAS_REND_FeedRenderConfig( hIvasRend, renderConfig ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_DEC_FeedRenderConfig failed\n" ); + exit( -1 ); + } + + } + + if ( ( error = IVAS_REND_SetOrientationTrackingMode( hIvasRend, args.orientation_tracking ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error in IVAS_REND_SetOrientationTrackingMode(): %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + + /* Set up output custom layout configuration */ + if ( args.outConfig.audioConfig == IVAS_AUDIO_CONFIG_LS_CUSTOM ) + { + if ( ( error = IVAS_REND_ConfigureCustomOutputLoudspeakerLayout( hIvasRend, args.outConfig.outSetupCustom ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error in IVAS_REND_ConfigureCustomOutputLoudspeakerLayout(): %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + } + + /* Set up MASA writer for MASA output */ + if ( args.outConfig.audioConfig == IVAS_AUDIO_CONFIG_MASA1 || args.outConfig.audioConfig == IVAS_AUDIO_CONFIG_MASA2 ) + { + MasaFileWriter_open( args.outputFilePath, true, &masaWriter ); /* No delay for audio in renderer, so calling metadata writer in delayCompensated mode, i.e., no delay applied to meta */ + if ( masaWriter == NULL ) + { + fprintf( stderr, "Could not open MASA metadata file %s\n", args.outputFilePath ); + exit( -1 ); + } + } + + /* Set the total number of objects */ + if ( args.inConfig.numAudioObjects > 0 ) + { + if ( ( error = IVAS_REND_SetTotalNumberOfObjects( hIvasRend, args.inConfig.numAudioObjects ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error in IVAS_REND_SetTotalNumberOfObjects(): %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + + if ( ( error = IVAS_REND_SetIsmMetadataDelay( hIvasRend, args.syncMdDelay ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error in IVAS_REND_SetIsmMetadataDelay(): %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + } + + IVAS_REND_LfePanMtx lfePanMatrix; + + /* parse input LFE panning matrix */ + if ( args.lfeCustomRoutingEnabled && !isEmptyString( args.inLfePanningMatrixFile ) ) + { + if ( ( error = parseLfePanMtxFile( args.inLfePanningMatrixFile, &lfePanMatrix ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + } + + IVAS_REND_InputId mcIds[RENDERER_MAX_MC_INPUTS]; + IVAS_REND_InputId ismIds[RENDERER_MAX_ISM_INPUTS]; + IVAS_REND_InputId sbaIds[RENDERER_MAX_SBA_INPUTS]; + IVAS_REND_InputId masaIds[RENDERER_MAX_MASA_INPUTS]; + + for ( i = 0; i < RENDERER_MAX_MC_INPUTS; i++ ) + { + mcIds[i] = 0u; + } + for ( i = 0; i < RENDERER_MAX_ISM_INPUTS; i++ ) + { + ismIds[i] = 0u; + } + for ( i = 0; i < RENDERER_MAX_SBA_INPUTS; i++ ) + { + sbaIds[i] = 0u; + } + for ( i = 0; i < RENDERER_MAX_MASA_INPUTS; i++ ) + { + masaIds[i] = 0u; + } + + for ( i = 0; i < args.inConfig.numMultiChannelBuses; ++i ) + { + if ( ( error = IVAS_REND_AddInput( hIvasRend, args.inConfig.multiChannelBuses[i].audioConfig, &mcIds[i] ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + + if ( ( error = IVAS_REND_SetInputGain( hIvasRend, mcIds[i], args.inputGainGlobal * dBToLin( args.inConfig.multiChannelBuses[i].gain_dB ) ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + + if ( args.inConfig.multiChannelBuses[i].audioConfig == IVAS_AUDIO_CONFIG_LS_CUSTOM ) + { + if ( ( error = IVAS_REND_ConfigureCustomInputLoudspeakerLayout( hIvasRend, mcIds[i], args.inConfig.inSetupCustom ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error in IVAS_REND_ConfigureCustomInputLoudspeakerLayout(): %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + } + + /* set panning matrix for input LFE */ + if ( args.lfeCustomRoutingEnabled ) + { + if ( args.lfePanningEnabled ) + { + fprintf( stderr, "Warning: LFE position specified as well as panning matrix! Ignoring position and using gains from panning matrix\n" ); + args.lfePanningEnabled = false; + } + + if ( ( error = IVAS_REND_SetInputLfeMtx( hIvasRend, mcIds[i], (const IVAS_REND_LfePanMtx *) &lfePanMatrix ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + } + /* set panning gains for input LFE */ + else if ( args.lfePanningEnabled ) + { + if ( ( error = IVAS_REND_SetInputLfePos( hIvasRend, mcIds[i], args.lfeConfigGain, args.lfeConfigAzimuth, args.lfeConfigElevation ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + } + else + { + /* check for configuration from scene description file */ + if ( lfeRoutingConfigs[i] != NULL ) + { + /* prioritise panning matrix if configured */ + if ( !isEmptyString( lfeRoutingConfigs[i]->lfe_routing_mtx ) ) + { + if ( ( error = parseLfePanMtxFile( lfeRoutingConfigs[i]->lfe_routing_mtx, &lfePanMatrix ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + + if ( ( error = IVAS_REND_SetInputLfeMtx( hIvasRend, mcIds[i], (const IVAS_REND_LfePanMtx *) &lfePanMatrix ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + } + /* set position based gains */ + else + { + if ( ( error = IVAS_REND_SetInputLfePos( hIvasRend, mcIds[i], lfeRoutingConfigs[i]->lfe_gain_dB, lfeRoutingConfigs[i]->lfe_azi, lfeRoutingConfigs[i]->lfe_ele ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + } + } + } + } + + for ( i = 0; i < args.inConfig.numAudioObjects; ++i ) + { + if ( ( error = IVAS_REND_AddInput( hIvasRend, IVAS_AUDIO_CONFIG_OBA, &ismIds[i] ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + + if ( ( error = IVAS_REND_SetInputGain( hIvasRend, ismIds[i], args.inputGainGlobal * dBToLin( args.inConfig.audioObjects[i].gain_dB ) ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + + /* With MASA output, all objects are handled at once, so add only one input having all objects in it */ + if ( args.outConfig.audioConfig == IVAS_AUDIO_CONFIG_MASA1 || args.outConfig.audioConfig == IVAS_AUDIO_CONFIG_MASA2 ) + { + break; + } + } + + for ( i = 0; i < args.inConfig.numAmbisonicsBuses; ++i ) + { + if ( ( error = IVAS_REND_AddInput( hIvasRend, args.inConfig.ambisonicsBuses[i].audioConfig, &sbaIds[i] ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + + if ( ( error = IVAS_REND_SetInputGain( hIvasRend, sbaIds[i], args.inputGainGlobal * dBToLin( args.inConfig.ambisonicsBuses[i].gain_dB ) ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + } + + + for ( i = 0; i < args.inConfig.numMasaBuses; ++i ) + { + if ( ( error = IVAS_REND_AddInput( hIvasRend, args.inConfig.masaBuses[i].audioConfig, &masaIds[i] ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + + if ( ( error = IVAS_REND_SetInputGain( hIvasRend, masaIds[i], args.inputGainGlobal * dBToLin( args.inConfig.masaBuses[i].gain_dB ) ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + } + + const int16_t totalNumInChannels = getTotalNumInChannels( hIvasRend, mcIds, ismIds, sbaIds, masaIds ); + + if ( inFileNumChannels != 0 /* inFileNumChannels is 0 with raw PCM input */ && totalNumInChannels != inFileNumChannels ) + { + fprintf( stderr, "Number of channels in input file does not match selected configuration\n" ); + exit( -1 ); + } + + for ( i = 0; i < args.inConfig.numMasaBuses; ++i ) + { + if ( masaReaders[i] != NULL ) + { + hMasaMetadata[i] = MasaFileReader_getMetadataHandle( masaReaders[i] ); + } + } + + int16_t numOutChannels; + if ( ( error = IVAS_REND_NumOutChannels( hIvasRend, &numOutChannels ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error in IVAS_REND_NumOutChannels(): %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + + + if ( AudioFileWriter_open( &audioWriter, args.outputFilePath, args.sampleRate, numOutChannels ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Failed to open file: %s\n", args.outputFilePath ); + exit( -1 ); + } + + inBufferSize = frameSize_smpls * totalNumInChannels; + outBufferSize = frameSize_smpls * numOutChannels; + inpInt16Buffer = malloc( inBufferSize * sizeof( int16_t ) ); + + inFloatBuffer = malloc( inBufferSize * sizeof( float ) ); + outInt16Buffer = malloc( outBufferSize * sizeof( int16_t ) ); + outFloatBuffer = malloc( outBufferSize * sizeof( float ) ); + + inBuffer.config.numSamplesPerChannel = (int16_t) frameSize_smpls; + inBuffer.config.numChannels = (int16_t) totalNumInChannels; + inBuffer.data = inFloatBuffer; + + outBuffer.config.numSamplesPerChannel = (int16_t) frameSize_smpls; + outBuffer.config.numChannels = (int16_t) numOutChannels; + outBuffer.data = outFloatBuffer; + +#ifdef WMOPS + reset_stack(); + reset_wmops(); +#endif + + if ( !args.quietModeEnabled ) + { + fprintf( stdout, "\n------ Running the renderer ------\n\n" ); + fprintf( stdout, "Frames processed: " ); + } + else + { + fprintf( stdout, "\n\n-- Start the renderer (quiet mode) --\n\n" ); + } + + ObjectPositionBuffer mtdBuffer; + + while ( 1 ) + { + int16_t num_in_channels; + num_in_channels = inBuffer.config.numChannels; + const bool isCurrentFrameMultipleOf20ms = !args.framing_5ms || frame % 4 == 0; + + /* Read the input data */ + if ( ( error = AudioFileReader_read( audioReader, inpInt16Buffer, (int16_t) inBufferSize, &numSamplesRead ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError reading from file %s\n", audioFilePath ); + exit( -1 ); + } + + if ( numSamplesRead == 0 && splitBinNeedsNewFrame ) + { + /* end of input data */ + break; + } + + /* Convert from int to float and from interleaved to packed */ + convertInputBuffer( inpInt16Buffer, numSamplesRead, inBuffer.config.numSamplesPerChannel, num_in_channels, inFloatBuffer ); + + int16_t num_subframes, sf_idx; + num_subframes = ( args.framing_5ms ) ? 1 : IVAS_MAX_PARAM_SPATIAL_SUBFRAMES; + + if ( isCurrentFrameMultipleOf20ms ) + { + IsmPositionProvider_getNextFrame( positionProvider, &mtdBuffer ); + + if ( referenceVectorReader != NULL ) + { + IVAS_VECTOR3 listenerPos, refPos; + if ( ( error = Vector3PairFileReader_read( referenceVectorReader, &listenerPos, &refPos ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + if ( ( error = IVAS_REND_SetReferenceVector( hIvasRend, listenerPos, refPos ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + } + /* Read from reference rotation trajectory file if specified */ + if ( referenceRotReader != NULL ) + { + for ( sf_idx = 0; sf_idx < num_subframes; sf_idx++ ) + { + IVAS_QUATERNION quaternions[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES]; + if ( ( error = HeadRotationFileReading( referenceRotReader, &quaternions[sf_idx], NULL ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error in Head Rotation File Reading: %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + + if ( ( error = IVAS_REND_SetReferenceRotation( hIvasRend, quaternions[sf_idx] ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error setting Reference Rotation: %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + } + } + } + + /* Read from head rotation trajectory file if specified */ + if ( headRotReader != NULL ) + { + for ( sf_idx = 0; sf_idx < num_subframes; sf_idx++ ) + { + IVAS_QUATERNION headRot; + IVAS_VECTOR3 Pos; + + if ( ( error = HeadRotationFileReading( headRotReader, &headRot, &Pos ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error in Head Rotation File Reading: %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + + if ( ( error = IVAS_REND_SetHeadRotation( hIvasRend, headRot, Pos, sf_idx ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error setting Head Rotation: %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + } + } + else + { + if ( ( error = IVAS_REND_DisableHeadRotation( hIvasRend ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error disabling head rotation: %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + } + + + /* Read from external orientation file if specified */ + if ( externalOrientationFileReader != NULL ) + { + IVAS_QUATERNION quatBuffer[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES]; + int8_t enableHeadRotation[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES]; + int8_t enableExternalOrientation[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES]; + int8_t enableRotationInterpolation[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES]; + int16_t numFramesToTargetOrientation[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES]; + for ( sf_idx = 0; sf_idx < num_subframes; sf_idx++ ) + { + if ( ( error = ExternalOrientationFileReading( externalOrientationFileReader, &quatBuffer[i], &enableHeadRotation[i], &enableExternalOrientation[i], &enableRotationInterpolation[i], &numFramesToTargetOrientation[i] ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error in External Orientation File Reading: %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + } + for ( sf_idx = 0; sf_idx < num_subframes; sf_idx++ ) + { + if ( ( error = IVAS_REND_SetExternalOrientation( hIvasRend, &quatBuffer[sf_idx], enableHeadRotation[sf_idx], enableExternalOrientation[sf_idx], enableRotationInterpolation[sf_idx], numFramesToTargetOrientation[sf_idx], sf_idx ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error setting External Orientation: %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + } + } + + /* Combine external orientations and head rotation */ + + if ( ( error = IVAS_REND_CombineHeadAndExternalOrientation( hIvasRend ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error combining external and head orientations: %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + + for ( i = 0; i < args.inConfig.numMultiChannelBuses; ++i ) + { + if ( ( error = IVAS_REND_GetInputNumChannels( hIvasRend, mcIds[i], &numChannels ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + IVAS_REND_ReadOnlyAudioBuffer tmpBuffer = getReadOnlySubBuffer( inBuffer, (int16_t) args.inConfig.multiChannelBuses[i].inputChannelIndex, numChannels ); + + if ( ( error = IVAS_REND_FeedInputAudio( hIvasRend, mcIds[i], tmpBuffer ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + } + + for ( i = 0; i < args.inConfig.numAudioObjects; ++i ) + { + if ( args.outConfig.audioConfig == IVAS_AUDIO_CONFIG_MASA1 || args.outConfig.audioConfig == IVAS_AUDIO_CONFIG_MASA2 ) + { + if ( i == 0 ) + { + IVAS_REND_ReadOnlyAudioBuffer tmpBuffer = getReadOnlySubBuffer( inBuffer, (int16_t) args.inConfig.audioObjects[i].inputChannelIndex, args.inConfig.numAudioObjects ); + + if ( ( error = IVAS_REND_FeedInputAudio( hIvasRend, ismIds[i], tmpBuffer ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + } + + if ( ( error = IVAS_REND_FeedInputObjectMetadataToOMasa( hIvasRend, i, mtdBuffer.positions[i] ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + } + else + { + IVAS_REND_ReadOnlyAudioBuffer tmpBuffer = getReadOnlySubBuffer( inBuffer, (int16_t) args.inConfig.audioObjects[i].inputChannelIndex, 1 ); + + if ( ( error = IVAS_REND_FeedInputAudio( hIvasRend, ismIds[i], tmpBuffer ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + + if ( ( error = IVAS_REND_FeedInputObjectMetadata( hIvasRend, ismIds[i], mtdBuffer.positions[i] ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + } + } + + for ( i = 0; i < args.inConfig.numAmbisonicsBuses; ++i ) + { + if ( ( error = IVAS_REND_GetInputNumChannels( hIvasRend, sbaIds[i], &numChannels ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + IVAS_REND_ReadOnlyAudioBuffer tmpBuffer = getReadOnlySubBuffer( inBuffer, (int16_t) args.inConfig.ambisonicsBuses[i].inputChannelIndex, numChannels ); + + if ( ( error = IVAS_REND_FeedInputAudio( hIvasRend, sbaIds[i], tmpBuffer ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + } + + for ( i = 0; i < args.inConfig.numMasaBuses; ++i ) + { + if ( ( error = IVAS_REND_GetInputNumChannels( hIvasRend, masaIds[i], &numChannels ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + IVAS_REND_ReadOnlyAudioBuffer tmpBuffer = getReadOnlySubBuffer( inBuffer, (int16_t) args.inConfig.masaBuses[i].inputChannelIndex, numChannels ); + + if ( ( error = IVAS_REND_FeedInputAudio( hIvasRend, masaIds[i], tmpBuffer ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + + if ( masaReaders[i] != NULL ) + { + /* This will update data in hMasaMetadata[i] */ + MasaFileReader_readNextFrame( masaReaders[i] ); + + if ( ( error = IVAS_REND_FeedInputMasaMetadata( hIvasRend, masaIds[i], hMasaMetadata[i] ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + } + } + + + + if ( ( error = IVAS_REND_GetSamples( hIvasRend, outBuffer ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error in getting samples\n" ); + exit( -1 ); + } + + int16_t num_out_channels; + num_out_channels = outBuffer.config.numChannels; + + /* Convert from float to int and from packed to interleaved. + * Values in outFloatBuffer are guaranteed to be within range INT16_MIN:INT16_MAX */ + convertOutputBuffer( outFloatBuffer, outBuffer.config.numSamplesPerChannel, num_out_channels, outInt16Buffer ); + + if ( delayNumSamples == -1 ) + { + if ( args.delayCompensationEnabled ) + { + if ( IVAS_REND_GetDelay( hIvasRend, &delayNumSamples, &delayTimeScale ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nUnable to get delay of renderer!\n" ); + exit( -1 ); + } + + + delayNumSamples_orig = delayNumSamples; + } + else + { + delayNumSamples = 0; + } + zeroPad = delayNumSamples; + } + + if ( delayNumSamples * num_out_channels < outBufferSize ) + { + if ( AudioFileWriter_write( audioWriter, &outInt16Buffer[delayNumSamples * num_out_channels], outBufferSize - ( delayNumSamples * num_out_channels ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error writing audio file %s\n", args.outputFilePath ); + exit( -1 ); + } + delayNumSamples = 0; + } + else + { + delayNumSamples -= (int16_t) ( outBufferSize / num_out_channels ); + } + + /* Write MASA metadata for MASA outputs */ + if ( args.outConfig.audioConfig == IVAS_AUDIO_CONFIG_MASA1 || args.outConfig.audioConfig == IVAS_AUDIO_CONFIG_MASA2 ) + { + IVAS_REND_AudioConfigType inputType1; + IVAS_REND_AudioConfigType inputType2; + IVAS_MASA_DECODER_EXT_OUT_META_HANDLE hMetaOutput; + int16_t numInputFormats; + + inputType1 = IVAS_REND_AUDIO_CONFIG_TYPE_UNKNOWN; + inputType2 = IVAS_REND_AUDIO_CONFIG_TYPE_UNKNOWN; + hMetaOutput = NULL; + + numInputFormats = 0; + if ( args.inConfig.numAmbisonicsBuses > 0 ) + { + numInputFormats++; + inputType1 = IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS; + } + if ( args.inConfig.numMultiChannelBuses > 0 ) + { + numInputFormats++; + if ( inputType1 == IVAS_REND_AUDIO_CONFIG_TYPE_UNKNOWN ) + { + inputType1 = IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED; + } + } + if ( args.inConfig.numMasaBuses > 0 ) + { + numInputFormats++; + if ( inputType1 == IVAS_REND_AUDIO_CONFIG_TYPE_UNKNOWN ) + { + inputType1 = IVAS_REND_AUDIO_CONFIG_TYPE_MASA; + } + } + if ( args.inConfig.numAudioObjects > 0 ) + { + numInputFormats++; + if ( inputType1 == IVAS_REND_AUDIO_CONFIG_TYPE_UNKNOWN ) + { + inputType1 = IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED; + } + } + + if ( numInputFormats == 1 ) + { + if ( ( error = IVAS_REND_GetMasaMetadata( hIvasRend, &hMetaOutput, inputType1 ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error in IVAS_REND_GetMasaMetadata(): %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + } + else + { + if ( args.inConfig.numAmbisonicsBuses > 0 && args.inConfig.numMultiChannelBuses > 0 ) + { + inputType2 = IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED; + if ( ( error = IVAS_REND_MergeMasaMetadata( hIvasRend, &hMetaOutput, inputType1, inputType2 ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error in IVAS_REND_MergeMasaMetadata(): %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + } + + if ( ( args.inConfig.numAmbisonicsBuses > 0 || args.inConfig.numMultiChannelBuses > 0 ) && args.inConfig.numMasaBuses > 0 ) + { + inputType2 = IVAS_REND_AUDIO_CONFIG_TYPE_MASA; + if ( ( error = IVAS_REND_MergeMasaMetadata( hIvasRend, &hMetaOutput, inputType1, inputType2 ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error in IVAS_REND_MergeMasaMetadata(): %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + } + + if ( ( args.inConfig.numAmbisonicsBuses > 0 || args.inConfig.numMultiChannelBuses > 0 || args.inConfig.numMasaBuses > 0 ) && args.inConfig.numAudioObjects > 0 ) + { + inputType2 = IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED; + if ( ( error = IVAS_REND_MergeMasaMetadata( hIvasRend, &hMetaOutput, inputType1, inputType2 ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error in IVAS_REND_MergeMasaMetadata(): %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + } + } + + if ( ( error = MasaFileWriter_writeFrame( masaWriter, hMetaOutput ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError writing MASA metadata to file: %s\n", MasaFileWriter_getFilePath( masaWriter ) ); + } + } + + frame++; + if ( !args.quietModeEnabled ) + { + fprintf( stdout, "%-8d\b\b\b\b\b\b\b\b", frame ); + } + +#ifdef WMOPS + update_mem(); + update_wmops(); +#endif + } + + /* add zeros at the end to have equal length of synthesized signals */ + for ( zeroPadToWrite = zeroPad; zeroPadToWrite > frameSize_smpls; zeroPadToWrite -= frameSize_smpls ) + { + memset( outInt16Buffer, 0, outBufferSize * sizeof( int16_t ) ); + if ( ( error = AudioFileWriter_write( audioWriter, outInt16Buffer, outBufferSize ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nOutput audio file writer error\n" ); + exit( -1 ); + } + } + + memset( outInt16Buffer, 0, zeroPadToWrite * outBuffer.config.numChannels * sizeof( int16_t ) ); + if ( ( error = AudioFileWriter_write( audioWriter, outInt16Buffer, zeroPadToWrite * outBuffer.config.numChannels ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nOutput audio file writer error\n" ); + exit( -1 ); + } + zeroPadToWrite = 0; + + + if ( args.inConfig.numAudioObjects != 0 && ( args.outConfig.audioConfig == IVAS_AUDIO_CONFIG_BINAURAL || args.outConfig.audioConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) + { + fprintf( stdout, "\n\nMetadata delayed %d subframes\n\n", (int16_t) round( args.syncMdDelay / ( 1000 / IVAS_NUM_FRAMES_PER_SEC / IVAS_MAX_PARAM_SPATIAL_SUBFRAMES ) ) ); + } + + if ( !args.quietModeEnabled && args.delayCompensationEnabled ) + { + fprintf( stdout, "\nRenderer delay: %-5u [samples] - Timescale: %5u\n", delayNumSamples_orig, delayTimeScale ); + } + + fprintf( stdout, "\n\nRendering of %d frames finished\n\n", frame ); + + + /* === Close === */ + free( inpInt16Buffer ); + free( inFloatBuffer ); + free( outInt16Buffer ); + free( outFloatBuffer ); + for ( i = 0; i < RENDERER_MAX_MASA_INPUTS; ++i ) + { + MasaFileReader_close( &masaReaders[i] ); + } + + + for ( i = 0; i < RENDERER_MAX_MC_INPUTS; ++i ) + { + LfeRoutingConfig_close( lfeRoutingConfigs[i] ); + } + MasaFileWriter_close( &masaWriter ); + AudioFileReader_close( &audioReader ); + AudioFileWriter_close( &audioWriter ); + RotationFileReader_close( &headRotReader ); + RotationFileReader_close( &externalOrientationFileReader ); + RotationFileReader_close( &referenceRotReader ); + Vector3PairFileReader_close( &referenceVectorReader ); + hrtfFileReader_close( &hrtfFileReader ); + IVAS_REND_Close( &hIvasRend ); + IsmPositionProvider_close( positionProvider ); + RenderConfigReader_close( &renderConfigReader ); + +#ifdef WMOPS + print_wmops(); + print_mem( NULL ); +#endif + + return 0; +} + + +/*------------------------------------------------------------------------------------------* + * Local functions + *------------------------------------------------------------------------------------------*/ + +static IVAS_AUDIO_CONFIG ambisonicsOrderToEnum( + const int16_t order ) +{ + switch ( order ) + { + case 1: + return IVAS_AUDIO_CONFIG_FOA; + case 2: + return IVAS_AUDIO_CONFIG_HOA2; + case 3: + return IVAS_AUDIO_CONFIG_HOA3; + } + + return IVAS_AUDIO_CONFIG_INVALID; +} + +static const CmdLnParser_Option *findOptionById( + const int32_t id ) +{ + for ( int32_t i = 0; i < numCliOptions; ++i ) + { + if ( cliOptions[i].id == id ) + { + return &cliOptions[i]; + } + } + + return NULL; +} + +static bool parseInConfig( + const char *inFormatStr, + InputConfig *inConfig, + bool *sceneDescriptionInput ) +{ + char charBuf[FILENAME_MAX]; + + /* Initialize input config struct */ + inConfig->numAudioObjects = 0; + inConfig->numAmbisonicsBuses = 0; + inConfig->numMultiChannelBuses = 0; + inConfig->numMasaBuses = 0; + + /* First check if input is being set to scene description file - this is not covered by parseAudioConfig(). */ + strncpy( charBuf, inFormatStr, sizeof( charBuf ) - 1 ); + charBuf[sizeof( charBuf ) - 1] = '\0'; + to_upper( charBuf ); + if ( strcmp( charBuf, "META" ) == 0 ) + { + *sceneDescriptionInput = true; + /* Parsing the file will be done later. At this point the actual file path + * may not be known as command line parameters are still being parsed. */ + return true; + } + + /* Check for single-format inputs. The given string should map to a member of AUDIO_CONFIG enum. */ + IVAS_AUDIO_CONFIG audioConfig = parseAudioConfig( inFormatStr ); + switch ( audioConfig ) + { + case IVAS_AUDIO_CONFIG_MONO: + case IVAS_AUDIO_CONFIG_STEREO: + case IVAS_AUDIO_CONFIG_5_1: + case IVAS_AUDIO_CONFIG_7_1: + case IVAS_AUDIO_CONFIG_5_1_2: + case IVAS_AUDIO_CONFIG_5_1_4: + case IVAS_AUDIO_CONFIG_7_1_4: + inConfig->numMultiChannelBuses = 1; + inConfig->multiChannelBuses[0].audioConfig = audioConfig; + inConfig->multiChannelBuses[0].inputChannelIndex = 0; + inConfig->multiChannelBuses[0].gain_dB = 0.0f; + break; + case IVAS_AUDIO_CONFIG_FOA: + case IVAS_AUDIO_CONFIG_HOA2: + case IVAS_AUDIO_CONFIG_HOA3: + inConfig->numAmbisonicsBuses = 1; + inConfig->ambisonicsBuses[0].audioConfig = audioConfig; + inConfig->ambisonicsBuses[0].inputChannelIndex = 0; + inConfig->ambisonicsBuses[0].gain_dB = 0.0f; + break; + case IVAS_AUDIO_CONFIG_MASA1: + case IVAS_AUDIO_CONFIG_MASA2: + inConfig->numMasaBuses = 1; + inConfig->masaBuses[0].audioConfig = audioConfig; + inConfig->masaBuses[0].inputChannelIndex = 0; + inConfig->masaBuses[0].gain_dB = 0.0f; + break; + case IVAS_AUDIO_CONFIG_OBA: + /* If input format is objects, parse the characters after "ISM" to get number of objects */ + { + char *ptr = NULL; + inConfig->numAudioObjects = (uint16_t) strtol( inFormatStr + 3, &ptr, 10 ); + if ( ptr == NULL || *ptr != '\0' ) + { + /* Failed to parse string as a number */ + fprintf( stderr, "Cannot parse string \"%s\" as a valid input format", inFormatStr ); + return false; + } + if ( inConfig->numAudioObjects > RENDERER_MAX_ISM_INPUTS ) + { + fprintf( stderr, "Too many objects at input. Max %d supported.", RENDERER_MAX_ISM_INPUTS ); + return false; + } + for ( int16_t i = 0; i < inConfig->numAudioObjects; ++i ) + { + inConfig->audioObjects[i].audioConfig = audioConfig; + inConfig->audioObjects[i].inputChannelIndex = i; + inConfig->audioObjects[i].gain_dB = 0.0f; + } + } + break; + case IVAS_AUDIO_CONFIG_INVALID: + /* This case will be reached if parsing string to AUDIO_CONFIG enum fails. + * Try to use the given string as a path to a custom loudspeaker layout file. */ + { + ivas_error error = parseCustomLayoutFile( inFormatStr, &inConfig->inSetupCustom ); + + if ( error == IVAS_ERR_FAILED_FILE_OPEN ) + { + /* Failed to open with given string - most likely wasn't a file path */ + const CmdLnParser_Option *listOption = findOptionById( CmdLnOptionId_listFormats ); + fprintf( stderr, "Unsupported input format: %s. To list valid formats, use option --%s.\n", inFormatStr, listOption->match ); + return false; + } + if ( error != IVAS_ERR_OK ) + { + fprintf( stderr, "Error while reading custom loudspeaker layout file %s\n", inFormatStr ); + return false; + } + inConfig->numMultiChannelBuses = 1; + inConfig->multiChannelBuses[0].audioConfig = IVAS_AUDIO_CONFIG_LS_CUSTOM; + inConfig->multiChannelBuses[0].inputChannelIndex = 0; + inConfig->multiChannelBuses[0].gain_dB = 0.0f; + } + break; + default: + { + /* Default case covers formats that are defined in the AUDIO_CONFIG enum, + * but cannot be used at input, e.g. BINAURAL */ + const CmdLnParser_Option *listOption = findOptionById( CmdLnOptionId_listFormats ); + fprintf( stderr, "Unsupported input format: %s. To list valid formats, use option --%s.\n", inFormatStr, listOption->match ); + return false; + } + } + + return true; +} + +static bool parseOutConfig( + const char *outputFormatStr, + OutputConfig *outConfig ) +{ + ivas_error error; + + outConfig->audioConfig = parseAudioConfig( outputFormatStr ); + /* If the string provided is not recognized as a valid output config, + * it's expected to be a path to a custom loudspeaker layout description file. */ + if ( outConfig->audioConfig == IVAS_AUDIO_CONFIG_INVALID ) + { + outConfig->audioConfig = IVAS_AUDIO_CONFIG_LS_CUSTOM; + if ( ( error = parseCustomLayoutFile( outputFormatStr, &outConfig->outSetupCustom ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error while parsing output format option\n" ); + return false; + } + } + + return true; +} + +static bool parseDiegeticPan( + char *value, + float *nonDiegeticPan ) +{ + to_upper( value ); + + if ( ( strcmp( value, "CENTER" ) == 0 ) || ( strchr( value, 'C' ) != NULL ) ) + { + *nonDiegeticPan = 0.f; + } + else if ( ( strcmp( value, "LEFT" ) == 0 ) || ( strchr( value, 'L' ) != NULL ) ) + { + *nonDiegeticPan = 1.f; + } + else if ( ( strcmp( value, "RIGHT" ) == 0 ) || ( strchr( value, 'R' ) != NULL ) ) + { + *nonDiegeticPan = -1.f; + } + else + { + *nonDiegeticPan = (float) atof( value ) / 90.f; + + if ( *nonDiegeticPan > 1.0f || *nonDiegeticPan < -1.0f ) + { + fprintf( stderr, "Error: Incorrect value for panning option argument specified!\n\n" ); + return false; + } + } + return true; +} + +static bool parseOrientationTracking( + char *value, + int8_t *orientation_tracking ) +{ + to_upper( value ); + + if ( strcmp( value, "NONE" ) == 0 ) + { + *orientation_tracking = IVAS_HEAD_ORIENT_TRK_NONE; + } + else if ( strcmp( value, "REF" ) == 0 ) + { + *orientation_tracking = IVAS_HEAD_ORIENT_TRK_REF; + } + else if ( strcmp( value, "AVG" ) == 0 ) + { + *orientation_tracking = IVAS_HEAD_ORIENT_TRK_AVG; + } + else if ( strcmp( value, "REF_VEC" ) == 0 ) + { + *orientation_tracking = IVAS_HEAD_ORIENT_TRK_REF_VEC; + } + else if ( strcmp( value, "REF_VEC_LEV" ) == 0 ) + { + *orientation_tracking = IVAS_HEAD_ORIENT_TRK_REF_VEC_LEV; + } + else + { + fprintf( stderr, "Error: Invalid orientation tracking type %s \n\n", value ); + return false; + } + + return true; +} + +static IVAS_AUDIO_CONFIG parseAudioConfig( + const char *configString ) +{ + char charBuf[21]; + charBuf[20] = '\0'; + + strncpy( charBuf, configString, sizeof( charBuf ) - 1 ); + charBuf[sizeof( charBuf ) - 1] = '\0'; + to_upper( charBuf ); + + if ( ( strcmp( charBuf, "MONO" ) == 0 ) || ( strcmp( charBuf, "HOA0" ) == 0 ) || ( strcmp( charBuf, "SBA0" ) == 0 ) ) + { + return IVAS_AUDIO_CONFIG_MONO; + } + if ( ( strcmp( charBuf, "STEREO" ) == 0 ) || ( strcmp( charBuf, "CICP2" ) == 0 ) ) + { + return IVAS_AUDIO_CONFIG_STEREO; + } + if ( ( strcmp( charBuf, "FOA" ) == 0 ) || ( strcmp( charBuf, "SBA1" ) == 0 ) ) + { + return IVAS_AUDIO_CONFIG_FOA; + } + if ( ( strcmp( charBuf, "HOA2" ) == 0 ) || ( strcmp( charBuf, "SBA2" ) == 0 ) ) + { + return IVAS_AUDIO_CONFIG_HOA2; + } + if ( ( strcmp( charBuf, "HOA3" ) == 0 ) || ( strcmp( charBuf, "SBA3" ) == 0 ) ) + { + return IVAS_AUDIO_CONFIG_HOA3; + } + if ( ( strcmp( charBuf, "5_1" ) == 0 ) || ( strcmp( charBuf, "CICP6" ) == 0 ) ) + { + return IVAS_AUDIO_CONFIG_5_1; + } + if ( ( strcmp( charBuf, "7_1" ) == 0 ) || ( strcmp( charBuf, "CICP12" ) == 0 ) ) + { + return IVAS_AUDIO_CONFIG_7_1; + } + if ( ( strcmp( charBuf, "5_1_2" ) == 0 ) || ( strcmp( charBuf, "CICP14" ) == 0 ) ) + { + return IVAS_AUDIO_CONFIG_5_1_2; + } + if ( ( strcmp( charBuf, "5_1_4" ) == 0 ) || ( strcmp( charBuf, "CICP16" ) == 0 ) ) + { + return IVAS_AUDIO_CONFIG_5_1_4; + } + if ( ( strcmp( charBuf, "7_1_4" ) == 0 ) || ( strcmp( charBuf, "CICP19" ) == 0 ) ) + { + return IVAS_AUDIO_CONFIG_7_1_4; + } + if ( strncmp( charBuf, "ISM", 3 ) == 0 ) + { + /* Accept input config as ISM only if the 4th character is a number from 1 to 4. + * Otherwise, do nothing. Unknown audio config will be returned. */ + switch ( charBuf[3] ) + { + case '1': + case '2': + case '3': + case '4': + return IVAS_AUDIO_CONFIG_OBA; + } + } + if ( strncmp( charBuf, "MASA", 4 ) == 0 ) + { + switch ( charBuf[4] ) + { + case '1': + fprintf( stderr, "1TC MASA support is not functional and is pending on DirAC renderer refactoring.\n" ); + exit( EXIT_FAILURE ); + /*return IVAS_AUDIO_CONFIG_MASA1;*/ // ToDo: temporarily disabled to avoid compilation warnings + case '2': + return IVAS_AUDIO_CONFIG_MASA2; + default: + return IVAS_AUDIO_CONFIG_INVALID; + } + } + if ( strcmp( charBuf, "BINAURAL" ) == 0 ) + { + return IVAS_AUDIO_CONFIG_BINAURAL; + } + if ( strcmp( charBuf, "BINAURAL_ROOM_IR" ) == 0 ) + { + return IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR; + } + if ( strcmp( charBuf, "BINAURAL_ROOM_REVERB" ) == 0 ) + { + return IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB; + } + return IVAS_AUDIO_CONFIG_INVALID; +} + +static bool parseLfePositionConfig( + const char *value, + float *lfeGain, + float *lfeAzimuth, + float *lfeElevation ) +{ + uint8_t nvalues; + const char *tok; + float values[3]; + char config_string[RENDERER_MAX_METADATA_LINE_LENGTH]; + + strncpy( config_string, value, RENDERER_MAX_METADATA_LINE_LENGTH ); + nvalues = 0; + + for ( tok = strtok( config_string, "," ); tok && *tok; tok = strtok( NULL, ",\n" ) ) + { + while ( *tok == ' ' ) + { + tok++; + } + + if ( *tok == '\0' ) + { + continue; + } + values[nvalues] = (float) atof( tok ); + nvalues++; + + /* ignore any additionally specified values */ + if ( nvalues == 3 ) + { + break; + } + } + + if ( nvalues != 3 ) + { + return false; + } + + *lfeGain = values[0]; + *lfeAzimuth = values[1]; + *lfeElevation = values[2]; + return true; +} + + +static bool checkRequiredArgs( + CmdlnArgs args ) +{ + const CmdLnParser_Option *tmpOption; + + /* Check required arguments */ + bool missingRequiredArg = false; + if ( isEmptyString( args.inputFilePath ) ) + { + tmpOption = findOptionById( CmdLnOptionId_inputFile ); + fprintf( stderr, "Missing required argument: %s (%s)\n", tmpOption->match, tmpOption->matchShort ); + missingRequiredArg = true; + } + + const bool singleInputSpecified = args.inConfig.numAudioObjects != 0 || + args.inConfig.numAmbisonicsBuses != 0 || + args.inConfig.numMultiChannelBuses != 0 || + args.inConfig.numMasaBuses != 0; + + if ( !args.sceneDescriptionInput && !singleInputSpecified ) + { + /* Neither scene description input nor single-type input was specified on command line */ + tmpOption = findOptionById( CmdLnOptionId_inputFormat ); + fprintf( stderr, "Missing required argument: %s (%s)\n", tmpOption->match, tmpOption->matchShort ); + missingRequiredArg = true; + } + if ( isEmptyString( args.outputFilePath ) ) + { + tmpOption = findOptionById( CmdLnOptionId_outputFile ); + fprintf( stderr, "Missing required argument: %s (%s)\n", tmpOption->match, tmpOption->matchShort ); + missingRequiredArg = true; + } + if ( args.outConfig.audioConfig == IVAS_AUDIO_CONFIG_INVALID ) + { + tmpOption = findOptionById( CmdLnOptionId_outputFormat ); + fprintf( stderr, "Missing required argument: %s (%s)\n", tmpOption->match, tmpOption->matchShort ); + missingRequiredArg = true; + } + if ( missingRequiredArg ) + { + CmdLnParser_printUsage( args.executableName, cliOptions, numCliOptions ); + } + + return !missingRequiredArg; +} + +static CmdlnArgs defaultArgs( + const char *executableName ) +{ + CmdlnArgs args; + + strncpy( args.executableName, executableName, RENDERER_MAX_CLI_ARG_LENGTH ); + clearString( args.inputFilePath ); + clearString( args.outputFilePath ); + args.sampleRate = 0; + + args.inConfig.inSetupCustom.num_spk = 0; + args.inConfig.inSetupCustom.num_lfe = 0; + args.inConfig.numAudioObjects = 0; + args.inConfig.numAmbisonicsBuses = 0; + args.inConfig.numMultiChannelBuses = 0; + args.inConfig.numMasaBuses = 0; + + args.outConfig.audioConfig = IVAS_AUDIO_CONFIG_INVALID; + args.outConfig.outSetupCustom.num_spk = 0; + args.outConfig.outSetupCustom.num_lfe = 0; + + for ( int32_t i = 0; i < RENDERER_MAX_ISM_INPUTS; ++i ) + { + clearString( args.inMetadataFilePaths[i] ); + } + args.numInMetadataFiles = 0; + + clearString( args.headRotationFilePath ); + clearString( args.referenceVectorFilePath ); + clearString( args.referenceRotationFilePath ); + clearString( args.customHrtfFilePath ); + clearString( args.renderConfigFilePath ); + clearString( args.externalOrientationFilePath ); + + args.orientation_tracking = IVAS_HEAD_ORIENT_TRK_NONE; + args.nonDiegeticPan = 0; + args.nonDiegeticPanGain = 0.f; + + args.delayCompensationEnabled = true; + args.quietModeEnabled = false; + args.sceneDescriptionInput = false; + args.inputGainGlobal = 1.0f; + + args.lfePanningEnabled = false; + args.lfeConfigGain = 1.0f; + args.lfeConfigAzimuth = 0.f; + args.lfeConfigElevation = 0.f; + + args.lfeCustomRoutingEnabled = false; + clearString( args.inLfePanningMatrixFile ); + args.framing_5ms = false; + args.syncMdDelay = 0; + + for ( int32_t i = 0; i < RENDERER_MAX_ISM_INPUTS; ++i ) + { + args.directivityPatternId[i] = 65535; + } + + args.acousticEnvironmentId = 65535; + + return args; +} + +static void parseOption( + const int32_t optionId, + char **optionValues, + const int16_t numOptionValues, + void *pOutputStruct ) +{ + CmdlnArgs *args = pOutputStruct; + + switch ( optionId ) + { + case CmdLnOptionId_listFormats: + assert( numOptionValues == 0 ); + printSupportedAudioConfigs(); + exit( 0 ); + case CmdLnOptionId_inputFile: + assert( numOptionValues == 1 ); + strncpy( args->inputFilePath, optionValues[0], RENDERER_MAX_CLI_ARG_LENGTH - 1 ); + break; + case CmdLnOptionId_inputFormat: + assert( numOptionValues == 1 ); + if ( !parseInConfig( optionValues[0], &args->inConfig, &args->sceneDescriptionInput ) ) + { + exit( -1 ); /* Error printout handled by failing function */ + } + break; + case CmdLnOptionId_inputMetadata: + assert( numOptionValues <= RENDERER_MAX_ISM_INPUTS ); + for ( int16_t i = 0; i < numOptionValues; ++i ) + { + strncpy( args->inMetadataFilePaths[i], optionValues[i], RENDERER_MAX_CLI_ARG_LENGTH - 1 ); + } + args->numInMetadataFiles = numOptionValues; + break; + case CmdLnOptionId_outputFile: + assert( numOptionValues == 1 ); + strncpy( args->outputFilePath, optionValues[0], RENDERER_MAX_CLI_ARG_LENGTH - 1 ); + break; + case CmdLnOptionId_outputFormat: + assert( numOptionValues == 1 ); + if ( !parseOutConfig( optionValues[0], &args->outConfig ) ) + { + exit( -1 ); /* Error printout handled by failing function */ + } + break; + case CmdLnOptionId_sampleRate: + assert( numOptionValues == 1 ); + args->sampleRate = (int32_t) ( strtol( optionValues[0], NULL, 10 ) * 1000 ); + if ( args->sampleRate == 0 ) + { + fprintf( stderr, "Invalid sampling rate specified\n" ); + exit( -1 ); + } + break; + case CmdLnOptionId_trajFile: + assert( numOptionValues == 1 ); + strncpy( args->headRotationFilePath, optionValues[0], RENDERER_MAX_CLI_ARG_LENGTH - 1 ); + break; + case CmdLnOptionId_referenceVectorFile: + assert( numOptionValues == 1 ); + strncpy( args->referenceVectorFilePath, optionValues[0], RENDERER_MAX_CLI_ARG_LENGTH - 1 ); + break; + case CmdLnOptionId_refRotFile: + assert( numOptionValues == 1 ); + strncpy( args->referenceRotationFilePath, optionValues[0], RENDERER_MAX_CLI_ARG_LENGTH - 1 ); + break; + case CmdLnOptionId_exteriorOrientationFile: + assert( numOptionValues == 1 ); + strncpy( args->externalOrientationFilePath, optionValues[0], RENDERER_MAX_CLI_ARG_LENGTH - 1 ); + break; + case CmdLnOptionId_customHrtfFile: + assert( numOptionValues == 1 ); + strncpy( args->customHrtfFilePath, optionValues[0], RENDERER_MAX_CLI_ARG_LENGTH - 1 ); + break; + case CmdLnOptionId_renderConfigFile: + assert( numOptionValues == 1 ); + strncpy( args->renderConfigFilePath, optionValues[0], RENDERER_MAX_CLI_ARG_LENGTH - 1 ); + break; + case CmdLnOptionId_nonDiegeticPan: + assert( numOptionValues == 1 ); + if ( !parseDiegeticPan( optionValues[0], &args->nonDiegeticPanGain ) ) + { + fprintf( stderr, "Unknown option for diegetic panning: %s\n", optionValues[0] ); + exit( -1 ); + } + args->nonDiegeticPan = 1; + break; + case CmdLnOptionId_orientationTracking: + assert( numOptionValues == 1 ); + if ( !parseOrientationTracking( optionValues[0], &args->orientation_tracking ) ) + { + fprintf( stderr, "Unknown option for orientation tracking: %s\n", optionValues[0] ); + exit( -1 ); + } + break; + case CmdlnOptionId_lfePosition: + assert( numOptionValues == 1 ); + if ( !parseLfePositionConfig( optionValues[0], &args->lfeConfigGain, &args->lfeConfigAzimuth, &args->lfeConfigElevation ) ) + { + fprintf( stderr, "Unknown or invalid option for LFE position: %s\n", optionValues[0] ); + exit( -1 ); + } + args->lfePanningEnabled = true; + break; + break; + case CmdlnOptionId_lfeMatrix: + assert( numOptionValues == 1 ); + strncpy( args->inLfePanningMatrixFile, optionValues[0], RENDERER_MAX_CLI_ARG_LENGTH - 1 ); + args->lfeCustomRoutingEnabled = true; + break; + case CmdLnOptionId_complexityLevel: + assert( numOptionValues == 1 ); + args->complexityLevel = (int32_t) ( strtol( optionValues[0], NULL, 10 ) ); + if ( args->complexityLevel < IVAS_REND_COMPLEXITY_LEVEL_ONE || args->complexityLevel > IVAS_REND_COMPLEXITY_LEVEL_THREE ) + { + fprintf( stdout, "Invalid complexity level specified.\n" ); + exit( -1 ); + } + else if ( args->complexityLevel == IVAS_REND_COMPLEXITY_LEVEL_ONE || args->complexityLevel == IVAS_REND_COMPLEXITY_LEVEL_TWO ) + { + fprintf( stdout, "Complexity levels 1 and 2 will be defined after characterisation - default to level 3 (full functionality).\n" ); + } + break; + case CmdLnOptionId_noDelayCmp: + assert( numOptionValues == 0 ); + args->delayCompensationEnabled = false; + break; + case CmdLnOptionId_quietModeEnabled: + assert( numOptionValues == 0 ); + args->quietModeEnabled = true; + break; + case CmdLnOptionId_inputGain: + assert( numOptionValues == 1 ); + args->inputGainGlobal = strtof( optionValues[0], NULL ); + if ( args->inputGainGlobal == 0.0f ) + { + fprintf( stderr, "Invalid input gain specified\n" ); + exit( -1 ); + } + break; + case CmdLnOptionId_framing5ms: + assert( numOptionValues == 0 ); + args->framing_5ms = true; + fprintf( stderr, "Warning: this is a placeholder for 5ms framing.\n" ); + break; + case CmdLnOptionId_directivityPatternId: + assert( numOptionValues <= RENDERER_MAX_ISM_INPUTS ); + for ( int16_t i = 0; i < numOptionValues; ++i ) + { + args->directivityPatternId[i] = (int16_t) strtol( optionValues[i], NULL, 10 ); + } + break; + case CmdLnOptionId_acousticEnvironmentId: + assert( numOptionValues == 1 ); + if ( !is_digits_only( optionValues[0] ) ) + { + fprintf( stderr, "Invalid acousting environment ID specified: %s\n", optionValues[0] ); + exit( -1 ); + } + args->acousticEnvironmentId = (int16_t) strtol( optionValues[0], NULL, 10 ); + break; + case CmdLnOptionId_syncMdDelay: + assert( numOptionValues == 1 ); + /* Metadata Delay to sync with audio delay in ms */ + args->syncMdDelay = strtof( optionValues[0], NULL ); + break; + default: + assert( 0 && "This should be unreachable - all command line options should be explicitly handled." ); + break; + } + + return; +} + +static CmdlnArgs parseCmdlnArgs( + const int argc, + char **argv ) +{ + CmdlnArgs args = defaultArgs( argv[0] ); + + if ( CmdLnParser_parseArgs( argc, argv, cliOptions, numCliOptions, &args, parseOption ) != 0 ) + { + exit( -1 ); /* Error printout handled by failing function */ + } + + if ( !checkRequiredArgs( args ) ) + { + exit( -1 ); /* Error printout handled by failing function */ + } + + return args; +} + + +IsmPositionProvider *IsmPositionProvider_open( + void ) +{ + IsmPositionProvider *ipp; + uint16_t i; + + ipp = (IsmPositionProvider *) malloc( sizeof( IsmPositionProvider ) ); + ipp->frameCounter = 0; + ipp->numObjects = 0; + + for ( i = 0; i < RENDERER_MAX_ISM_INPUTS; ++i ) + { + ipp->ismReaders[i] = NULL; + ipp->positions[i] = NULL; + ipp->positionDurations[i] = NULL; + ipp->currentPositionIdxs[i] = 0; + ipp->durationCounters[i] = 0; + } + + return ipp; +} + +LfeRoutingConfig *LfeRoutingConfig_open( + void ) +{ + LfeRoutingConfig *lrc; + + lrc = (LfeRoutingConfig *) malloc( sizeof( LfeRoutingConfig ) ); + lrc->lfe_azi = 0.f; + lrc->lfe_ele = 0.f; + lrc->lfe_gain_dB = 0.f; + lrc->lfe_routing_mtx[0] = '\0'; + + return lrc; +} + +void LfeRoutingConfig_close( + LfeRoutingConfig *lfeRoutingCfg ) +{ + if ( lfeRoutingCfg != NULL ) + { + + free( lfeRoutingCfg ); + } + + return; +} + +void getMetadataFromFileReader( + IsmFileReader *ismReader, + ObjectPositionBuffer *objectMetadataBuffer, + const uint32_t objIdx ) +{ + IVAS_ISM_METADATA ismMetadata; + ivas_error error; + + if ( ( error = IsmFileReader_readNextFrame( ismReader, &ismMetadata ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError (%s) while reading ISM metadata from: %s\n\n", ivas_error_to_string( error ), IsmFileReader_getFilePath( ismReader ) ); + exit( -1 ); + } + + objectMetadataBuffer->positions[objIdx].azimuth = ismMetadata.azimuth; + objectMetadataBuffer->positions[objIdx].elevation = ismMetadata.elevation; + objectMetadataBuffer->positions[objIdx].radius = ismMetadata.radius; + objectMetadataBuffer->positions[objIdx].yaw = ismMetadata.yaw; + objectMetadataBuffer->positions[objIdx].pitch = ismMetadata.pitch; + objectMetadataBuffer->positions[objIdx].non_diegetic_flag = ismMetadata.non_diegetic_flag; + + return; +} + +void readFromShorthandMetadata( + IsmPositionProvider *positionProvider, + ObjectPositionBuffer *objectMetadataBuffer, + const uint32_t objIdx ) +{ + uint32_t preUpdatePositionIdx; + uint32_t postUpdatePositionIdx; + + preUpdatePositionIdx = positionProvider->currentPositionIdxs[objIdx]; + + if ( positionProvider->durationCounters[objIdx] == positionProvider->positionDurations[objIdx][preUpdatePositionIdx] ) + { + positionProvider->durationCounters[objIdx] = 0; + positionProvider->currentPositionIdxs[objIdx] = ( positionProvider->currentPositionIdxs[objIdx] + 1 ) % positionProvider->numPositions[objIdx]; + } + + ++positionProvider->durationCounters[objIdx]; + + postUpdatePositionIdx = positionProvider->currentPositionIdxs[objIdx]; + + objectMetadataBuffer->positions[objIdx] = positionProvider->positions[objIdx][postUpdatePositionIdx]; + + return; +} + +static void IsmPositionProvider_getNextFrame( + IsmPositionProvider *positionProvider, + ObjectPositionBuffer *objectMetadataBuffer ) +{ + uint32_t objIdx; + + objectMetadataBuffer->numObjects = positionProvider->numObjects; + + for ( objIdx = 0; objIdx < positionProvider->numObjects; ++objIdx ) + { + /* If ISM metadata reader is open, read from metadata file */ + if ( positionProvider->ismReaders[objIdx] != NULL ) + { + getMetadataFromFileReader( positionProvider->ismReaders[objIdx], objectMetadataBuffer, objIdx ); + } + /* Otherwise, if positions were provided in a scene description file, use them */ + else if ( positionProvider->positions[objIdx] != NULL ) + { + readFromShorthandMetadata( positionProvider, objectMetadataBuffer, objIdx ); + } + /* Otherwise fall back to default position */ + else + { + objectMetadataBuffer->positions[objIdx].azimuth = 0.0f; + objectMetadataBuffer->positions[objIdx].elevation = 0.0f; + objectMetadataBuffer->positions[objIdx].radius = 1.0f; + objectMetadataBuffer->positions[objIdx].yaw = 0.0f; + objectMetadataBuffer->positions[objIdx].pitch = 0.0f; + objectMetadataBuffer->positions[objIdx].non_diegetic_flag = 0; + } + + /* Wrap azimuth to lie within (-180, 180] range */ + while ( objectMetadataBuffer->positions[objIdx].azimuth < 0.0f ) + { + objectMetadataBuffer->positions[objIdx].azimuth += 360.0f; + } + while ( objectMetadataBuffer->positions[objIdx].azimuth >= 360.0f ) + { + objectMetadataBuffer->positions[objIdx].azimuth -= 360.0f; + } + + /* Clamp elevation to lie within [-90, 90] range (can't be wrapped easily) */ + objectMetadataBuffer->positions[objIdx].elevation = min( max( objectMetadataBuffer->positions[objIdx].elevation, -90 ), 90 ); + /* Wrap yaw to lie within (-180, 180] range */ + while ( objectMetadataBuffer->positions[objIdx].yaw < 0.0f ) + { + objectMetadataBuffer->positions[objIdx].yaw += 360.0f; + } + while ( objectMetadataBuffer->positions[objIdx].yaw >= 360.0f ) + { + objectMetadataBuffer->positions[objIdx].yaw -= 360.0f; + } + + /* Clamp pitch to lie within [-90, 90] range (can't be wrapped easily) */ + objectMetadataBuffer->positions[objIdx].pitch = min( max( objectMetadataBuffer->positions[objIdx].pitch, -90 ), 90 ); + } + + ++positionProvider->frameCounter; + + return; +} + +static void IsmPositionProvider_close( + IsmPositionProvider *positionProvider ) +{ + uint32_t i; + + if ( positionProvider == NULL ) + { + assert( !"Can't close IsmPositionProvider - pointer is NULL" ); + } + + for ( i = 0; i < RENDERER_MAX_ISM_INPUTS; ++i ) + { + if ( positionProvider->ismReaders[i] != NULL ) + { + IsmFileReader_close( &positionProvider->ismReaders[i] ); + } + + if ( positionProvider->positions[i] != NULL ) + { + free( positionProvider->positions[i] ); + } + + if ( positionProvider->positionDurations[i] != NULL ) + { + free( positionProvider->positionDurations[i] ); + } + } + + free( positionProvider ); + + return; +} + +static void splitConfigFile( + const char *mdfFilePath, + char *metadataString, + uint32_t *metadataStringLength, + char *wavFileName, + uint32_t *wavFileNameLength ) +{ + FILE *file; + uint32_t bufferlength; + char wavLine[FILENAME_MAX]; + uint32_t currentPositionIdxs; + uint32_t mdlength; + + memset( metadataString, 0, *metadataStringLength ); + memset( wavFileName, 0, (int16_t) *wavFileNameLength ); + + file = fopen( mdfFilePath, "rb" ); + if ( !file ) + { + fprintf( stderr, "Couldn't open metadata file %s\n", mdfFilePath ); + exit( -1 ); + } + + fseek( file, 0, SEEK_END ); + bufferlength = ftell( file ); + fseek( file, 0, SEEK_SET ); + + if ( fgets( wavLine, (int) *wavFileNameLength, file ) == NULL ) + { + fprintf( stderr, "Error reading metadata\n" ); + exit( -1 ); + } + currentPositionIdxs = ftell( file ); + if ( *wavFileNameLength < currentPositionIdxs ) + { + assert( !"Couldn't read wavFileName, string buffer too small" ); + } + if ( !sscanf( wavLine, "%s", wavFileName ) ) + { + fprintf( stderr, "Error reading metadata\n" ); + exit( -1 ); + } + *wavFileNameLength = (uint32_t) strlen( wavFileName ); + + mdlength = bufferlength - currentPositionIdxs; + /* "+1" for null termination */ + if ( *metadataStringLength + 1 < mdlength ) + { + assert( !"Couldn't read metadata string, string buffer too small" ); + } + + fread( metadataString, 1, mdlength, file ); + metadataString[mdlength] = '\0'; + *metadataStringLength = mdlength + 1; + + fclose( file ); + + return; +} + +/* r: pointer to character following last found delimiter */ +static char *readNextMetadataChunkFrom( + char *start_char, + char *line, + const char *delimiter ) +{ + char *token; + + /* start_char can be NULL - it's used to continue parsing with strtok */ + assert( line != NULL && delimiter != NULL && "unexpected NULL ptr given to readNextMetadataChunkFrom()" ); + + token = strtok( start_char, delimiter ); + + /* End of string reached */ + if ( token == NULL ) + { + /* Clear `line` from previous contents and return NULL */ + clearString( line ); + return NULL; + } + + strcpy( line, token ); + + return token + strlen( token ) + 1; +} + +/* r: pointer to character following last found delimiter */ +static char *readNextMetadataChunk( + char *line, + const char *delimiter ) +{ + return readNextMetadataChunkFrom( NULL, line, delimiter ); +} + +static void parseUint8( + const char *line, + uint8_t *ret ) +{ + char *ptr; + ptr = NULL; + + *ret = (uint8_t) strtol( line, &ptr, 10 ); + if ( ptr == NULL || *ptr != '\0' ) + { + fprintf( stderr, "Cannot parse string \"%s\" as an integer value\n", line ); + exit( -1 ); + } + + return; +} + +static int8_t parseUint32( + const char *line, + uint32_t *ret ) +{ + char *ptr; + ptr = NULL; + + *ret = strtol( line, &ptr, 10 ); + if ( ptr == NULL || *ptr != '\0' ) + { + return -1; + } + + return 0; +} + +static int8_t parseInt32( + const char *line, + int32_t *ret ) +{ + char *ptr; + ptr = NULL; + + *ret = strtol( line, &ptr, 10 ); + if ( ptr == NULL || *ptr != '\0' ) + { + return -1; + } + + return 0; +} + +static void parseOptionalInputValues( + char *line, + float *lfe_gain_dB, + float *lfe_pos_azi, + float *lfe_pos_ele, + char *lfe_pan_mtx_filename, + float *gain_dB ) +{ + char *parse_pos; + char *key; + char *value; + char *endptr; + + endptr = NULL; + + /* Set default values, in case some values are not specified */ + *gain_dB = 0.f; + if ( lfe_gain_dB != NULL ) + { + *lfe_gain_dB = 0.f; + } + if ( lfe_pos_azi != NULL ) + { + *lfe_pos_azi = 0.f; + } + if ( lfe_pos_ele != NULL ) + { + *lfe_pos_ele = 0.f; + } + if ( lfe_pan_mtx_filename != NULL ) + { + *lfe_pan_mtx_filename = '\0'; + } + + /* Save parsing position - will have to be passed to strtok to resume parsing after using strtok with non-NULL value below */ + parse_pos = readNextMetadataChunk( line, "\n" ); + + /* Look for optional metadata until end of string or next input identifier is found */ + while ( parse_pos != NULL && strcmp( line, "MC" ) != 0 && strcmp( line, "SBA" ) != 0 && strcmp( line, "ISM" ) != 0 && strcmp( line, "MASA" ) != 0 ) + { + key = strtok( line, ":" ); + value = strtok( NULL, "\n" ); + + if ( strcmp( key, "gain_dB" ) == 0 ) + { + *gain_dB = (float) strtod( value, &endptr ); + + if ( *endptr != '\0' ) + { + fprintf( stderr, "Cannot parse string \"%s\" as a float value\n", value ); + exit( -1 ); + } + } + else if ( ( strcmp( key, "lfe_gain_dB" ) == 0 ) && lfe_gain_dB != NULL ) + { + *lfe_gain_dB = (float) strtod( value, &endptr ); + + if ( *endptr != '\0' ) + { + fprintf( stderr, "Cannot parse string \"%s\" as a float value\n", value ); + exit( -1 ); + } + } + else if ( ( strcmp( key, "lfe_azi" ) == 0 ) && lfe_pos_azi != NULL ) + { + *lfe_pos_azi = (float) strtod( value, &endptr ); + + if ( *endptr != '\0' ) + { + fprintf( stderr, "Cannot parse string \"%s\" as a float value\n", value ); + exit( -1 ); + } + } + else if ( ( strcmp( key, "lfe_ele" ) == 0 ) && lfe_pos_ele != NULL ) + { + *lfe_pos_ele = (float) strtod( value, &endptr ); + + if ( *endptr != '\0' ) + { + fprintf( stderr, "Cannot parse string \"%s\" as a float value\n", value ); + exit( -1 ); + } + } + else if ( strcmp( key, "lfe_matrix" ) == 0 ) + { + strncpy( lfe_pan_mtx_filename, value, FILENAME_MAX - 1 ); + } + else + { + fprintf( stderr, "Unsupported optional key: %s\n", key ); + exit( -1 ); + } + + parse_pos = readNextMetadataChunkFrom( parse_pos, line, "\n" ); + } + + return; +} + +static void parseObjectPosition( + char *line, + IVAS_ISM_METADATA *position, + uint16_t *positionDuration ) +{ + char *endptr; + int16_t read_values; + float meta_prm[8] = { 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f }; + + + readNextMetadataChunk( line, "," ); + *positionDuration = (uint16_t) strtol( line, &endptr, 10 ); + readNextMetadataChunk( line, "\n" ); + + read_values = (int16_t) sscanf( line, "%f,%f,%f,%f,%f,%f,%f,%f", &meta_prm[0], &meta_prm[1], &meta_prm[2], &meta_prm[3], &meta_prm[4], &meta_prm[5], &meta_prm[6], &meta_prm[7] ); + + if ( read_values < 2 ) + { + fprintf( stderr, "Error reading metadata\n" ); + exit( -1 ); + } + + position->azimuth = meta_prm[0]; + position->elevation = meta_prm[1]; + position->radius = meta_prm[2]; + position->yaw = meta_prm[5]; + position->pitch = meta_prm[6]; + position->non_diegetic_flag = (int16_t) meta_prm[7]; + + return; +} + +static void parseIsm( + char *line, + char *inDir, + InputConfig *inConfig, + IsmPositionProvider *positionProvider, + const int32_t idx ) +{ + uint32_t numberOfObjectPositionsToRead; + uint32_t i; + + readNextMetadataChunk( line, "\n" ); + parseInt32( line, &inConfig->audioObjects[idx].inputChannelIndex ); + --inConfig->audioObjects[idx].inputChannelIndex; /* Convert from 1-indexing */ + + readNextMetadataChunk( line, "\n" ); + + /* Try to interpret line as number of positions to read */ + if ( parseUint32( line, &numberOfObjectPositionsToRead ) == 0 ) + { + positionProvider->numPositions[idx] = numberOfObjectPositionsToRead; + positionProvider->positions[idx] = malloc( numberOfObjectPositionsToRead * sizeof( IVAS_ISM_METADATA ) ); + positionProvider->positionDurations[idx] = malloc( numberOfObjectPositionsToRead * sizeof( uint16_t ) ); + + for ( i = 0; i < numberOfObjectPositionsToRead; ++i ) + { + parseObjectPosition( line, &positionProvider->positions[idx][i], &positionProvider->positionDurations[idx][i] ); + } + } + else /* If not a number, it is a relative path from main metadata file to a metadata file */ + { + char fullpath[FILENAME_MAX]; + fullpath[0] = '\0'; + strncat( fullpath, inDir, strlen( inDir ) ); + strncat( fullpath, line, sizeof( fullpath ) - strlen( fullpath ) - 1 ); + if ( ( positionProvider->ismReaders[idx] = IsmFileReader_open( fullpath ) ) == NULL ) + { + fprintf( stderr, "Error: ISM input metadata file %s could not be opened\n", fullpath ); + exit( -1 ); + } + } + + /* Read optional values */ + parseOptionalInputValues( line, NULL, NULL, NULL, NULL, &inConfig->audioObjects[idx].gain_dB ); + + return; +} + +static void parseSba( + char *line, + InputConfig *inConfig, + const int32_t idx ) +{ + uint8_t ambiOrder; + + readNextMetadataChunk( line, "\n" ); + parseInt32( line, &inConfig->ambisonicsBuses[idx].inputChannelIndex ); + --inConfig->ambisonicsBuses[idx].inputChannelIndex; /* Convert from 1-indexing */ + + readNextMetadataChunk( line, "\n" ); + parseUint8( line, &ambiOrder ); + inConfig->ambisonicsBuses[idx].audioConfig = ambisonicsOrderToEnum( ambiOrder ); + + /* Read optional values */ + parseOptionalInputValues( line, NULL, NULL, NULL, NULL, &inConfig->ambisonicsBuses[idx].gain_dB ); + + return; +} + +static void parseMc( + char *line, + InputConfig *inConfig, + LfeRoutingConfig **lfeRoutingConfigs, + const int32_t idx ) +{ + readNextMetadataChunk( line, "\n" ); + parseInt32( line, &inConfig->multiChannelBuses[idx].inputChannelIndex ); + --inConfig->multiChannelBuses[idx].inputChannelIndex; /* Convert from 1-indexing */ + + readNextMetadataChunk( line, "\n" ); + IVAS_AUDIO_CONFIG cfg = parseAudioConfig( line ); + /* Try to use the given string as a path to a custom loudspeaker layout file. */ + if ( cfg == IVAS_AUDIO_CONFIG_INVALID ) + { + ivas_error error = parseCustomLayoutFile( line, &inConfig->inSetupCustom ); + + if ( error != IVAS_ERR_OK ) + { + fprintf( stderr, "Error while parsing input format %s\n", line ); + exit( -1 ); + } + inConfig->numMultiChannelBuses = 1; + inConfig->multiChannelBuses[idx].audioConfig = IVAS_AUDIO_CONFIG_LS_CUSTOM; + inConfig->multiChannelBuses[idx].inputChannelIndex = 0; + inConfig->multiChannelBuses[idx].gain_dB = 0.0f; + } + else + { + inConfig->multiChannelBuses[idx].audioConfig = cfg; + } + + /* Read optional values */ + bool lfe_panningEnabled; + float lfe_gain_dB, lfe_azi, lfe_ele; + char lfe_routing_mtx[FILENAME_MAX]; + + parseOptionalInputValues( line, &lfe_gain_dB, &lfe_azi, &lfe_ele, lfe_routing_mtx, &inConfig->multiChannelBuses[idx].gain_dB ); + + lfe_panningEnabled = ( lfe_gain_dB != 0.f || lfe_azi != 0.f || lfe_ele != 0.f ) ? true : false; + + if ( lfe_panningEnabled && !isEmptyString( lfe_routing_mtx ) ) + { + fprintf( stderr, "Warning: LFE position specified as well as panning matrix! Ignoring position and using gains from panning matrix\n" ); + lfe_panningEnabled = false; + } + + if ( lfe_panningEnabled || !isEmptyString( lfe_routing_mtx ) ) + { + /* a configuration was specified, set the values */ + lfeRoutingConfigs[idx] = LfeRoutingConfig_open(); + + if ( lfe_panningEnabled ) + { + lfeRoutingConfigs[idx]->lfe_gain_dB = lfe_gain_dB; + lfeRoutingConfigs[idx]->lfe_azi = lfe_azi; + lfeRoutingConfigs[idx]->lfe_ele = lfe_ele; + } + + if ( !isEmptyString( lfe_routing_mtx ) ) + { + strncpy( lfeRoutingConfigs[idx]->lfe_routing_mtx, lfe_routing_mtx, FILENAME_MAX ); + convert_backslash( lfeRoutingConfigs[idx]->lfe_routing_mtx ); + } + } + + return; +} + +static void parseMasa( + char *line, + char *inDir, + InputConfig *inConfig, + MasaFileReader **masaReaders, + const int32_t idx ) +{ + readNextMetadataChunk( line, "\n" ); + parseInt32( line, &inConfig->masaBuses[idx].inputChannelIndex ); + --inConfig->masaBuses[idx].inputChannelIndex; /* Convert from 1-indexing */ + + readNextMetadataChunk( line, "\n" ); + + /* Allow both just the number of TCs or MASAx. parseStrToAudioCfg() only accepts MASAx, so prepend if necessary. */ + if ( strncmp( line, "MASA", 4 ) != 0 ) + { + char numTcs = *line; + snprintf( line, 6 /* write at most 6 characters: MASAx + null termination */, "MASA%c", numTcs ); + } + + inConfig->masaBuses[idx].audioConfig = parseAudioConfig( line ); + + readNextMetadataChunk( line, "\n" ); + + char fullpath[FILENAME_MAX]; + fullpath[0] = '\0'; + strncat( fullpath, inDir, strlen( inDir ) ); + strncat( fullpath, line, sizeof( fullpath ) - strlen( fullpath ) - 1 ); + + if ( ( masaReaders[idx] = MasaFileReader_open( fullpath ) ) == NULL ) + { + fprintf( stderr, "Error: MASA metadata file %s could not be opened\n", fullpath ); + exit( -1 ); + } + + /* Read optional values */ + parseOptionalInputValues( line, NULL, NULL, NULL, NULL, &inConfig->masaBuses[idx].gain_dB ); + + return; +} + +static ivas_error parseCustomLayoutFile( + const char *filePath, + IVAS_CUSTOM_LS_DATA *pLsSetupCustom ) +{ + LsCustomFileReader *hLsCustomReader = NULL; + IVAS_CUSTOM_LS_DATA hLsCustomData; + ivas_error error; + + if ( ( error = CustomLsReader_open( filePath, &hLsCustomReader ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( CustomLsFileReading( hLsCustomReader, &hLsCustomData ) != LS_CUSTOM_FILEREADER_NO_ERROR ) + { + return error; + } + + pLsSetupCustom->num_spk = hLsCustomData.num_spk; + + for ( int16_t i = 0; i < hLsCustomData.num_spk; i++ ) + { + pLsSetupCustom->azimuth[i] = hLsCustomData.azimuth[i]; + pLsSetupCustom->elevation[i] = hLsCustomData.elevation[i]; + } + + /* Loudspeaker LFE */ + pLsSetupCustom->num_lfe = hLsCustomData.num_lfe; + + for ( int16_t i = 0; i < hLsCustomData.num_lfe; i++ ) + { + pLsSetupCustom->lfe_idx[i] = hLsCustomData.lfe_idx[i]; + } + + CustomLsReader_close( &hLsCustomReader ); + + return IVAS_ERR_OK; +} + +static void parseMetadata( + char *metadataString, + char *inDir, + InputConfig *inConfig, + IsmPositionProvider *positionProvider, + MasaFileReader **masaReaders, + LfeRoutingConfig **lfeRoutingConfigs ) +{ + char line[RENDERER_MAX_METADATA_LINE_LENGTH]; + char *delimiter; + char *token; + uint8_t totalNumberOfAudioObjects; + uint8_t counterChannelAudioObjects; + uint8_t counterAmbisonicsAudioObjects; + uint8_t counterMonoAudioObjects; + uint8_t counterMasaInputs; + uint8_t num_parsed_inputs; + + delimiter = "\n"; + + token = strtok( metadataString, delimiter ); + if ( token == NULL ) + { + fprintf( stderr, "Unexpected metadata format\n" ); + exit( -1 ); + } + if ( !sscanf( token, "%s", line ) ) + { + fprintf( stderr, "Unexpected metadata format\n" ); + exit( -1 ); + } + + parseUint8( line, &totalNumberOfAudioObjects ); + if ( totalNumberOfAudioObjects <= 0 ) + { + fprintf( stderr, "Invalid metadata: number of inputs should be > 0\n" ); + exit( -1 ); + } + + num_parsed_inputs = 0; + counterChannelAudioObjects = 0; + counterAmbisonicsAudioObjects = 0; + counterMonoAudioObjects = 0; + counterMasaInputs = 0; + + readNextMetadataChunk( line, delimiter ); + + while ( num_parsed_inputs < totalNumberOfAudioObjects ) + { + /* `line` will already contain the identifier ("MC", "SBA" or "ISM") after previous iteration */ + if ( strcmp( line, "MC" ) == 0 ) + { + ++counterChannelAudioObjects; + if ( counterChannelAudioObjects > RENDERER_MAX_MC_INPUTS ) + { + fprintf( stderr, "Metadata exceeds the supported number of MC inputs\n" ); + exit( -1 ); + } + parseMc( line, inConfig, lfeRoutingConfigs, counterChannelAudioObjects - 1 ); + } + else if ( strcmp( line, "SBA" ) == 0 ) + { + ++counterAmbisonicsAudioObjects; + if ( counterAmbisonicsAudioObjects > RENDERER_MAX_SBA_INPUTS ) + { + fprintf( stderr, "Metadata exceeds the supported number of SBA inputs\n" ); + exit( -1 ); + } + parseSba( line, inConfig, counterAmbisonicsAudioObjects - 1 ); + } + else if ( strcmp( line, "ISM" ) == 0 ) + { + ++counterMonoAudioObjects; + if ( counterMonoAudioObjects > RENDERER_MAX_ISM_INPUTS ) + { + fprintf( stderr, "Metadata exceeds the supported number of ISM inputs\n" ); + exit( -1 ); + } + parseIsm( line, inDir, inConfig, positionProvider, counterMonoAudioObjects - 1 ); + } + else if ( strcmp( line, "MASA" ) == 0 ) + { + ++counterMasaInputs; + if ( counterMasaInputs > RENDERER_MAX_MASA_INPUTS ) + { + fprintf( stderr, "Metadata exceeds the supported number of MASA inputs\n" ); + exit( -1 ); + } + parseMasa( line, inDir, inConfig, masaReaders, counterMasaInputs - 1 ); + } + else if ( isEmptyString( line ) ) + { + fprintf( stderr, "Metadata string too short - expected %d inputs, found %d.\n", totalNumberOfAudioObjects, num_parsed_inputs ); + exit( -1 ); + } + else + { + fprintf( stderr, "Unexpected metadata identifier\n" ); + exit( -1 ); + } + + ++num_parsed_inputs; + } + + inConfig->numAudioObjects = counterMonoAudioObjects; + inConfig->numAmbisonicsBuses = counterAmbisonicsAudioObjects; + inConfig->numMultiChannelBuses = counterChannelAudioObjects; + inConfig->numMasaBuses = counterMasaInputs; + positionProvider->numObjects = counterMonoAudioObjects; + + /* check for trailing text */ + token = strtok( NULL, delimiter ); + if ( token != NULL && sscanf( token, "%s", line ) ) + { + fprintf( stderr, "Trailing text in metadata file\n" ); + exit( -1 ); + } + + return; +} + +static void parseSceneDescriptionFile( + char *path, + char *audioFilePath, + InputConfig *inConfig, + IsmPositionProvider *positionProvider, + MasaFileReader **masaReaders, + LfeRoutingConfig **lfeRoutingConfigs ) +{ + uint32_t inAudioFilePathLen; + char inAudioFilePath[FILENAME_MAX]; + uint32_t mtdStrLen; + char mtdStr[RENDERER_MAX_METADATA_LENGTH]; + char inDir[FILENAME_MAX]; + char *lastSlash = NULL; + + inAudioFilePathLen = FILENAME_MAX; + mtdStrLen = RENDERER_MAX_METADATA_LENGTH; + splitConfigFile( path, mtdStr, &mtdStrLen, inAudioFilePath, &inAudioFilePathLen ); + + remove_cr( mtdStr ); + convert_backslash( inAudioFilePath ); + + /* Trim config file path to get path to the dir containing it */ + lastSlash = strrchr( path, SEP_FOLDER ); + inDir[0] = '\0'; + if ( lastSlash != NULL ) + { + strncat( inDir, path, ( lastSlash - path + 1 ) ); + } + + /* Append audio file path (relative to config file location) + * to config file location path to get full absolute path */ + strcpy( audioFilePath, inDir ); + strncat( audioFilePath, inAudioFilePath, inAudioFilePathLen ); + + parseMetadata( mtdStr, inDir, inConfig, positionProvider, masaReaders, lfeRoutingConfigs ); + + return; +} + +static void printSupportedAudioConfigs( void ) +{ + uint16_t i; + const char *supportedFormats[] = { + "MONO", + "STEREO", + "5_1", + "5_1_2", + "5_1_4", + "7_1", + "7_1_4", + "Path to Custom Loudspeaker .txt file", + "FOA", + "HOA2", + "HOA3", + "ISMx (input only)", + "MASAx (input only)", + "BINAURAL (output only)", + "BINAURAL_ROOM_IR (output only)", + "BINAURAL_ROOM_REVERB (output only)", + }; + + fprintf( stdout, "Supported audio formats:\n" ); + for ( i = 0; i < sizeof( supportedFormats ) / sizeof( *supportedFormats ); i++ ) + { + fprintf( stdout, "%s\n", supportedFormats[i] ); + } + + return; +} + +static ivas_error parseLfePanMtxFile( + const char *lfeRoutingMatrixFilePath, + IVAS_REND_LfePanMtx *lfePanMtx ) +{ + int16_t i, lfe_in, ch_out; + const char *tok; + char line[200]; /* > (10 chars * IVAS_MAX_OUTPUT_CHANNELS) i.e. "-999, " */ + FILE *mtxFile; + + if ( strlen( lfeRoutingMatrixFilePath ) < 1 ) + { + return IVAS_ERR_FAILED_FILE_OPEN; + } + + mtxFile = fopen( lfeRoutingMatrixFilePath, "r" ); + + if ( !mtxFile ) + { + return IVAS_ERR_FAILED_FILE_OPEN; + } + + /* set default panning matrix to all zeros + any subsequent issue in file reading will gracefully exit the function */ + for ( lfe_in = 0; lfe_in < IVAS_MAX_INPUT_LFE_CHANNELS; lfe_in++ ) + { + for ( i = 0; i < IVAS_MAX_OUTPUT_CHANNELS; i++ ) + { + ( *lfePanMtx )[lfe_in][i] = 0.0f; + } + } + + for ( lfe_in = 0; lfe_in < IVAS_MAX_INPUT_LFE_CHANNELS; lfe_in++ ) + { + ch_out = 0; + + /* if EOF or a blank line is encountered, simply return */ + if ( ( fgets( line, 200, mtxFile ) == NULL ) && ( strcmp( line, "\n" ) == 0 ) && ( strcmp( line, "\r\n" ) == 0 ) ) + { + fclose( mtxFile ); + return IVAS_ERR_OK; + } + + for ( tok = strtok( line, "," ); tok && *tok; tok = strtok( NULL, ",\n" ) ) + { + while ( *tok == ' ' ) + { + tok++; + } + + if ( *tok == '\0' ) + { + continue; + } + if ( ch_out > IVAS_MAX_OUTPUT_CHANNELS ) + { + break; + } + else + { + ( *lfePanMtx )[lfe_in][ch_out] = (float) atof( tok ); + ch_out++; + } + } + } + + fclose( mtxFile ); + + return IVAS_ERR_OK; +} + + +/*--------------------------------------------------------------------------* + * convertInputBuffer() + * + * Convert input buffer from WAV/PCM file (int16_t, interleaved) to a format + * accepted by the renderer (float, packed) + *--------------------------------------------------------------------------*/ + +static void convertInputBuffer( + const int16_t *intBuffer, + const int16_t numIntSamplesPerChannel, + const int16_t numFloatSamplesPerChannel, + const int16_t numChannels, + float *floatBuffer +) +{ + int16_t chnl, smpl, i; + + i = 0; + + for ( smpl = 0; smpl < numFloatSamplesPerChannel; ++smpl ) + { + for ( chnl = 0; chnl < numChannels; ++chnl ) + { + if ( i < numIntSamplesPerChannel ) + { + floatBuffer[chnl * numFloatSamplesPerChannel + smpl] = (float) intBuffer[i]; + } + else + { + floatBuffer[chnl * numFloatSamplesPerChannel + smpl] = 0.f; + } + + ++i; + } + } + + return; +} + +/*--------------------------------------------------------------------------* + * convertOutputBuffer() + * + * Convert output buffer from the renderer (float, packed) to a format ready + * for writing to a WAV/PCM file (int16_t, interleaved) + *--------------------------------------------------------------------------*/ + +static void convertOutputBuffer( + const float *floatBuffer, + const int16_t numSamplesPerChannel, + const int16_t numChannels, + int16_t *intBuffer +) +{ + int16_t chnl, smpl, i; + float temp; + + i = 0; + + for ( smpl = 0; smpl < numSamplesPerChannel; ++smpl ) + { + for ( chnl = 0; chnl < numChannels; ++chnl ) + { + temp = floatBuffer[chnl * numSamplesPerChannel + smpl]; + temp = (float) floor( temp + 0.5f ); + if ( temp > IVAS_MAX16B_FLT ) + { + temp = IVAS_MAX16B_FLT; + } + else if ( temp < IVAS_MIN16B_FLT ) + { + temp = IVAS_MIN16B_FLT; + } + intBuffer[i] = (int16_t) temp; + + ++i; + } + } + + return; +} diff --git a/lib_com/ACcontextMapping.c b/lib_com/ACcontextMapping.c new file mode 100644 index 0000000000000000000000000000000000000000..13cbe8482ba51ad3f2768d9e29d66198cd01810a --- /dev/null +++ b/lib_com/ACcontextMapping.c @@ -0,0 +1,107 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * get_next_coeff_mapped() + * + * + *-------------------------------------------------------------------*/ + +/*! r: index of next coefficient */ +int16_t get_next_coeff_mapped( + int16_t ii[2], /* i/o: coefficient indexes */ + int32_t *pp, /* o : peak(1)/hole(0) indicator */ + int16_t *idx, /* o : index in unmapped domain */ + CONTEXT_HM_CONFIG *hm_cfg /* i : HM configuration */ +) +{ + uint32_t p; + + p = ( ii[1] - hm_cfg->numPeakIndices ) & ( hm_cfg->indexBuffer[ii[1]] - hm_cfg->indexBuffer[ii[0]] ); + p >>= sizeof( p ) * 8 - 1; + *pp = p; + *idx = ii[p]; + ii[p]++; + + return hm_cfg->indexBuffer[*idx]; +} + + +/*-------------------------------------------------------------------* + * get_next_coeff_unmapped() + * + * + *-------------------------------------------------------------------*/ + +/*! r: index of next coefficient */ +int16_t get_next_coeff_unmapped( + int16_t *ii, /* i/o: coefficient indexes */ + int16_t *idx /* o : index in unmapped domain */ +) +{ + *idx = *ii; + ( *ii )++; + + return *idx; +} + +/*-------------------------------------------------------------------* + * update_mixed_context() + * + * + *-------------------------------------------------------------------*/ + +int32_t update_mixed_context( + int32_t ctx, + int16_t a ) +{ + int32_t t; + + t = 1 - 13 + ( a & ~1 ) * ( ( a >> 2 ) + 1 ); + + if ( t > 0 ) + { + t = min( ( a >> 3 ), 2 ); + } + + return ( ctx & 0xf ) * 16 + t + 13; +} diff --git a/lib_com/ari.c b/lib_com/ari.c new file mode 100644 index 0000000000000000000000000000000000000000..2ee0be62310edc98d315593d6f269ca2529a6423 --- /dev/null +++ b/lib_com/ari.c @@ -0,0 +1,67 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "prot.h" +#include "basop_util.h" +#include "cnst.h" +#include "wmc_auto.h" + + +/*--------------------------------------------------------------- + Ari 14 bits common routines + -------------------------------------------------------------*/ + +/** + * \brief Integer Multiply + * + * \param[i] r + * \param[i] c + * + * \return r*c + */ +int32_t mul_sbc_14bits( + int32_t r, + int32_t c ) +{ + int32_t temp; + /*function in line*/ + temp = ( ( (int32_t) r ) * ( (int32_t) c ) ) >> stat_bitsnew; + return temp; + + /*function in line*/ +} diff --git a/lib_com/ari_hm.c b/lib_com/ari_hm.c new file mode 100644 index 0000000000000000000000000000000000000000..3995913c43f7bfefb31276a0787aa0200b20ff6b --- /dev/null +++ b/lib_com/ari_hm.c @@ -0,0 +1,305 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include "options.h" +#include "cnst.h" +#include "stl.h" +#include "basop_util.h" +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * UnmapIndex() + * + * + *-------------------------------------------------------------------*/ + +void UnmapIndex( + const int16_t PeriodicityIndex, + const int16_t Bandwidth, + const int16_t LtpPitchLag, + const int16_t SmallerLags, + int16_t *FractionalResolution, + int32_t *Lag ) +{ + if ( ( LtpPitchLag > 0 ) && ( PeriodicityIndex & kLtpHmFlag ) ) + { + int16_t LtpPitchIndex, Multiplier; + LtpPitchIndex = PeriodicityIndex >> 9; + Multiplier = PeriodicityIndex & 0xff; + assert( 0 <= LtpPitchIndex && LtpPitchIndex <= 16 ); + assert( 1 <= Multiplier && Multiplier <= ( 1 << NumRatioBits[Bandwidth][LtpPitchIndex] ) ); + *FractionalResolution = kLtpHmFractionalResolution; + *Lag = ( LtpPitchLag * (int32_t) ( 4 * Ratios[Bandwidth][LtpPitchIndex][Multiplier - 1] ) ) >> 2; + } + else + { + if ( PeriodicityIndex < 16 ) + { + *FractionalResolution = 3; + *Lag = PeriodicityIndex + GET_ADJ( 0, 6 ); + } + else if ( PeriodicityIndex < 80 ) + { + *FractionalResolution = 4; + *Lag = PeriodicityIndex + GET_ADJ( 16, 8 ); + } + else if ( PeriodicityIndex < 208 ) + { + *FractionalResolution = 3; + *Lag = PeriodicityIndex + GET_ADJ( 80, 12 ); + } + else if ( PeriodicityIndex < 224 || SmallerLags ) + { + *FractionalResolution = 1; + *Lag = PeriodicityIndex + GET_ADJ( 208, 28 ); + } + else + { + *FractionalResolution = 0; + *Lag = PeriodicityIndex + GET_ADJ( 224, 188 ); + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * ConfigureContextHm() + * + * + *-------------------------------------------------------------------*/ + +void ConfigureContextHm( + const int16_t NumCoeffs, /* (I) Number of coefficients */ + const int16_t TargetBits, /* (I) Target bit budget (excl. Done flag) */ + const int16_t PeriodicityIndex, /* (I) Pitch related index */ + const int16_t LtpPitchLag, /* (I) TCX-LTP pitch in F.D. */ + CONTEXT_HM_CONFIG *hm_cfg /* (O) Context-based harmonic model configuration */ +) +{ + int16_t Bandwidth, SmallerLags; + int32_t i, Lag; + int16_t j, FractionalResolution; + int32_t Limit; + int16_t Index; + int16_t *tmp; + + Bandwidth = 0; + if ( NumCoeffs >= 256 ) + { + Bandwidth = 1; + } + + SmallerLags = 0; + + if ( TargetBits <= kSmallerLagsTargetBitsThreshold || Bandwidth == 0 ) + { + SmallerLags = 1; + } + + UnmapIndex( PeriodicityIndex, Bandwidth, LtpPitchLag, SmallerLags, &FractionalResolution, &Lag ); + + /* Set up and fill peakIndices */ + hm_cfg->peakIndices = hm_cfg->indexBuffer; + tmp = hm_cfg->peakIndices; + Limit = ( NumCoeffs - 1 ) << FractionalResolution; + + for ( i = Lag; i < Limit; i += Lag ) + { + Index = (int16_t) ( i >> FractionalResolution ); + *tmp++ = Index - 1; + *tmp++ = Index; + *tmp++ = Index + 1; + } + hm_cfg->numPeakIndices = (int16_t) ( tmp - hm_cfg->indexBuffer ); + + /* Set up and fill holeIndices */ + hm_cfg->holeIndices = hm_cfg->indexBuffer + hm_cfg->numPeakIndices; + tmp = hm_cfg->holeIndices; + Index = 0; + + for ( j = 0; j < hm_cfg->numPeakIndices; j += 3 ) + { + for ( ; Index < hm_cfg->peakIndices[j]; ++Index ) + { + *tmp++ = Index; + } + Index += 3; /* Skip the peak */ + } + + for ( ; Index < NumCoeffs; ++Index ) + { + *tmp++ = Index; + } + hm_cfg->numHoleIndices = (int16_t) ( tmp - hm_cfg->holeIndices ); + /* Add extremal element signaling the end of the buffer */ + *tmp++ = NumCoeffs; + + return; +} + + +/*-------------------------------------------------------------------* + * CountIndexBits() + * + * + *-------------------------------------------------------------------*/ + +int16_t CountIndexBits( + const int16_t Bandwidth, + const int16_t PeriodicityIndex ) +{ + if ( PeriodicityIndex & kLtpHmFlag ) + { + int16_t LtpPitchIndex = PeriodicityIndex >> 9; + return NumRatioBits[Bandwidth][LtpPitchIndex]; + } + + return 8; +} + +#define WMC_TOOL_SKIP + +/*-------------------------------------------------------------------* + * tcx_hm_render() + * + * + *-------------------------------------------------------------------*/ + +int16_t tcx_hm_render( + const int16_t lag, /* i : pitch lag */ + const int16_t fract_res, /* i : fractional resolution of the lag */ + Word16 p[] /* o : harmonic model (Q13) */ +) +{ + int16_t k; + Word32 f0, tmp32; + Word16 height, PeakDeviation, tmp; + + /* Set up overall shape */ + + f0 = L_shl( lag, sub( 15, fract_res ) ); /* Q15 */ + + tmp32 = Mpy_32_16( f0, -26474 ); + tmp32 = L_shr_r( BASOP_Util_InvLog2( L_shl( tmp32, 7 ) ), 2 ); + tmp32 = L_sub( 603979776L, tmp32 ); + tmp32 = L_add( L_add( tmp32, tmp32 ), Mpy_32_16( tmp32, 26214 ) ); + height = round_fx( tmp32 ); /* Q13 */ + + tmp32 = Mpy_32_16( f0, -18910 ); + tmp32 = L_shr_r( BASOP_Util_InvLog2( L_shl( tmp32, 7 ) ), 2 ); + tmp32 = L_sub( 1395864371L, tmp32 ); + PeakDeviation = round_fx( tmp32 ); /* Q14 */ + + IF( sub( 13915, PeakDeviation ) > 0 ) + { + /* A bit error was encountered */ + return 1; + } + ELSE + { + tmp = div_s( 13915, PeakDeviation ); + tmp = mult_r( tmp, tmp ); /* Q15 */ + } + + /* Render the prototype peak */ + p[kTcxHmParabolaHalfWidth] = height; + + for ( k = 1; k <= kTcxHmParabolaHalfWidth; ++k ) + { + p[kTcxHmParabolaHalfWidth + k] = round_fx( Mpy_32_16( BASOP_Util_InvLog2( L_shl( L_mult0( mult0( negate( k ), k ), tmp ), 10 ) ), height ) ); + } + /* Mirror */ + for ( k = -kTcxHmParabolaHalfWidth; k < 0; ++k ) + { + p[kTcxHmParabolaHalfWidth + k] = p[kTcxHmParabolaHalfWidth - k]; + } + + return 0; +} + + +/*-------------------------------------------------------------------* + * tcx_hm_modify_envelope() + * + * + *-------------------------------------------------------------------*/ + +void tcx_hm_modify_envelope( + const Word16 gain, /* i : HM gain (Q11) */ + const int16_t lag, + const int16_t fract_res, + const Word16 p[], /* i : harmonic model (Q13) */ + Word32 env[], /* i/o: envelope (Q16) */ + const int16_t L_frame /* i : number of spectral lines */ +) +{ + int16_t k, h, x; + Word16 inv_shape[2 * kTcxHmParabolaHalfWidth + 1]; /* Q15 */ + + if ( gain == 0 ) + { + return; + } + + for ( k = 0; k < 2 * kTcxHmParabolaHalfWidth + 1; ++k ) + { + inv_shape[k] = div_s( 512, add( 512, round_fx( L_mult( gain, p[k] ) ) ) ); + } + + h = 1; + k = lag >> fract_res; + + while ( k <= L_frame + kTcxHmParabolaHalfWidth - 1 ) + { + + for ( x = max( 0, k - kTcxHmParabolaHalfWidth ); x <= min( k + kTcxHmParabolaHalfWidth, L_frame - 1 ); ++x ) + { + env[x] = Mpy_32_16( env[x], inv_shape[x - k + kTcxHmParabolaHalfWidth] ); + } + ++h; + k = ( h * lag ) >> fract_res; + } + + return; +} + +#undef WMC_TOOL_SKIP diff --git a/lib_com/arith_coder.c b/lib_com/arith_coder.c new file mode 100644 index 0000000000000000000000000000000000000000..f27617b27828a0f54d713a99eb326e85ae4863c3 --- /dev/null +++ b/lib_com/arith_coder.c @@ -0,0 +1,575 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "basop_util.h" +#include "basop_proto_func.h" +#include "wmc_auto.h" + + +#define WMC_TOOL_SKIP + +/*-------------------------------------------------------* + * expfp() + * + * Fixed point implementation of exp() + *-------------------------------------------------------*/ + +/*! r: Q15 */ +Word16 expfp( + const Word16 x, /* i : mantissa Q15-e */ + const Word16 x_e /* i : exponent Q0 */ +) +{ + Word16 xi, xf, tmp; + Word16 b0, b1, b2, b3; + Word32 y, L_tmp; + + assert( x <= 0 ); + + L_tmp = L_negate( L_shl( L_deposit_h( x ), sub( x_e, 15 ) ) ); + + /* split into integer and fractional parts */ + xi = round_fx( L_tmp ); + xf = extract_l( L_tmp ); + + BASOP_SATURATE_WARNING_OFF; + xf = negate( xf ); + BASOP_SATURATE_WARNING_ON; + + /* Fractional part */ + /* y = 65536 + + xf + + ((xf*xf) / (2*65536)) + + ((((((xf*xf) / (2*65536))*xf) / 65536)*65536/3) / 65536) + + ((((((((xf*xf) / (2*65536))*xf) / 65536)*65536/3) / 65536)*xf) / (4*65536)); */ + y = L_mac0( 65536, xf, 1 ); + tmp = shr( mult( xf, xf ), 2 ); + y = L_mac0( y, tmp, 1 ); + tmp = shr( mult( shr( mult( tmp, xf ), 1 ), 65536 / 3 ), 1 ); + y = L_mac0( y, tmp, 1 ); + tmp = shr( mult( tmp, xf ), 3 ); + y = L_mac0( y, tmp, 1 ); + + /* Integer part */ + b0 = s_and( xi, 1 ); + b1 = s_and( xi, 2 ); + b2 = s_and( xi, 4 ); + b3 = s_and( xi, 8 ); + + if ( b0 != 0 ) + y = Mpy_32_16( y, 24109 ); /* exp(-1) in -1Q16 */ + if ( b1 != 0 ) + y = Mpy_32_16( y, 17739 ); /* exp(-2) in -2Q17 */ + if ( b2 != 0 ) + y = Mpy_32_16( y, 19205 ); /* exp(-4) in -5Q20 */ + if ( b3 != 0 ) + y = Mpy_32_16( y, 22513 ); /* exp(-8) in -11Q26 */ + + /* scaling: -1*b0 - 2*b1 -5*b2 -11*b3 */ + y = L_shr( y, add( add( xi, shr( xi, 2 ) ), shr( b3, 3 ) ) ); + + /* zero for xi >= 16 */ + if ( shr( xi, 4 ) > 0 ) + { + y = L_deposit_l( 0 ); + move16(); + } + + return round_fx( L_shl( y, 15 ) ); +} + + +/*-------------------------------------------------------* + * powfp_odd2() + * + * Fixed point implementation of pow(), where base is fixed point (16/16) and exponent a small *odd* integer + *-------------------------------------------------------*/ +/* + * + * Returns: *pout1 = ( (base/65536)^(2*exp - 1) ) * 65536 + * *pout2 = ( (base/65536)^(2*exp + 1) ) * 65536 + * + * NOTE: This function must be in sync with ari_decode_14bits_pow() */ + +void powfp_odd2( + const Word16 base, /* Q15 */ + const Word16 exp, /* Q0 */ + Word16 *pout1, /* Q15 */ + Word16 *pout2 /* Q15 */ +) +{ + /* this version is in sync with ari_enc_14bits_pow() + * that is, we have to start multiplication from the largest power-of-two, in order to + * get the rounding errors to appear at the same places */ + Word16 pows[12]; /* powers of two exponents*/ + Word16 exp2; + Word16 out, out2; + Word16 k, h, maxk; + + assert( exp >= 0 ); + + out = base; + move16(); + out2 = 0x7FFF; + move16(); + IF( exp != 0 ) + { + exp2 = sub( exp, 1 ); + maxk = sub( 15, norm_s( exp ) ); + assert( maxk < 12 ); + + pows[0] = base; + move16(); + FOR( k = 0; k < maxk; k++ ) + { + pows[k + 1] = mult_r( pows[k], pows[k] ); + move16(); + } + k = sub( k, 1 ); + h = shl( 1, k ); /* highest bit of exp2 */ + out2 = base; + move16(); + out = mult_r( out, pows[k + 1] ); /* we already know that "exp" has the highest bit set to one since we calculated .. */ + /* .. the effective length of "exp" earlier on, thus we omit the branch for out2 */ + if ( s_and( exp2, h ) != 0 ) + { + out2 = mult_r( out2, pows[k + 1] ); + } + + h = shr( h, 1 ); + FOR( k = sub( k, 1 ); k >= 0; k-- ) + { + if ( s_and( exp, h ) != 0 ) + { + out = mult_r( out, pows[k + 1] ); + } + + if ( s_and( exp2, h ) != 0 ) + { + out2 = mult_r( out2, pows[k + 1] ); + } + + h = shr( h, 1 ); + } + } + + *pout1 = out2; + move16(); + *pout2 = out; + move16(); + + return; +} + + +/*------------------------------------------------------------------------ + * Function: tcx_arith_scale_envelope + * + * For optimal performance of the arithmetic coder, the envelope shape must + * be scaled such that the expected bit-consumption of a signal that + * follows the scaled shape coincides with the target bitrate. + * This function calculates a first-guess scaling and then uses the bi-section + * search to find the optimal scaling. + * + * We assume that lines follow the Laplacian distribution, whereby the expected + * bit-consumption would be log2(2*e*s[k]), where s[k] is the envelope value + * for the line in question. However, this theoretical formula assumes that + * all lines are encoded with magnitude+sign. Since the sign is unnecessary + * for 0-values, that estimate of bit-consumption is biased when s[k] is small. + * Analytical solution of the expectation for small s[k] is difficult, whereby + * we use the approximation log2(2*e*s[k] + 0.15 + 0.035 / s[k]) which is accurate + * on the range 0.08 to 1.0. + * + * NOTE: This function must be bit-exact on all platforms such that encoder + * and decoder remain synchronized. + *-------------------------------------------------------------------------*/ + +void tcx_arith_scale_envelope( + const Word16 L_spec_core, /* i : number of lines to scale Q0 */ + Word16 L_frame, /* i : number of lines Q0 */ + const Word32 env[], /* i : unscaled envelope Q16 */ + Word16 target_bits, /* i : number of available bits Q0 */ + const Word16 low_complexity, /* i : low-complexity Q0 */ + Word16 s_env[], /* o : scaled envelope Q15-e */ + Word16 *s_env_e /* o : scaled envelope exponent Q0 */ +) +{ + Word32 ienv[N_MAX_ARI]; + Word16 scale, iscale, iscale_e, a_e, b, b_e; + Word16 lob, hib, adjust; + Word16 k, iter, max_iter, lob_bits, hib_bits; + Word16 statesi, bits; + Word32 mean, a, s, L_tmp; + Word16 mean_e, tmp, tmp2; +#ifdef BASOP_NOGLOB + Flag Overflow; +#endif /* BASOP_NOGLOB */ + + + lob_bits = 0; + move16(); + hib_bits = 0; + move16(); + + /* Boosting to account for expected spectrum truncation (kMax) */ + /* target_bits = (int16_t)(target_bits * (1.2f - 0.00045f * target_bits + 0.00000025f * target_bits * target_bits)); */ + L_tmp = L_shr( Mpy_32_16( L_mult0( target_bits, target_bits ), 17180 ), 6 ); /* Q15; 17180 -> 0.00000025f (Q36) */ + L_tmp = L_sub( L_tmp, L_shr( L_mult0( target_bits, 30199 ), 11 ) ); /* Q15; 30199 -> 0.00045f (Q26) */ + L_tmp = L_add( L_tmp, 39322 ); /* Q15; 39322 -> 1.2f (Q15) */ + L_tmp = Mpy_32_16( L_tmp, target_bits ); /* Q0 */ + assert( L_tmp < 32768 ); + target_bits = extract_l( L_tmp ); + + /* Calculate inverse envelope and find initial scale guess based on mean */ + mean = L_deposit_l( 0 ); + FOR( k = 0; k < L_frame; k++ ) + { + /* ienv[k] = 1.0f / env[k]; + mean += ienv[k]; */ + + tmp = norm_l( env[k] ); + tmp2 = sub( 15, tmp ); +#ifndef BASOP_NOGLOB + tmp = Inv16( round_fx( L_shl( env[k], tmp ) ), &tmp2 ); +#else /* BASOP_NOGLOB */ + tmp = Inv16( round_fx_o( L_shl( env[k], tmp ), &Overflow ), &tmp2 ); +#endif /* BASOP_NOGLOB */ + ienv[k] = L_shl( L_deposit_h( tmp ), sub( tmp2, 15 ) ); /* Q16 */ + move32(); + mean = L_add( mean, ienv[k] ); + } + tmp = norm_s( L_frame ); + tmp2 = div_s( 8192, shl( L_frame, tmp ) ); + tmp = shl( tmp2, sub( tmp, 7 ) ); + mean = L_shr( Mpy_32_16( mean, tmp ), 6 ); /* Q16 */ + + /* Rate dependent compensation to get closer to the target on average */ + /* mean = powf(mean, (float)L_frame / target_bits * 0.357f); */ + tmp = BASOP_Util_Divide1616_Scale( L_frame, target_bits, &tmp2 ); + tmp = mult_r( tmp, FL2WORD16( 0.357f ) ); + mean = BASOP_Util_fPow( mean, 15, L_deposit_h( tmp ), tmp2, &mean_e ); + + /* Find first-guess scaling coefficient "scale" such that if "mean" is the + * mean of the envelope, then the mean bit-consumption is approximately + * + * log2(2*e*mean*scale + 0.15 + 0.035/(mean*scale)) * L_frame = target_bits + */ + /* a = 2*2.71828183f*mean*mean; */ + tmp = round_fx( mean ); + a = L_mult( mult_r( tmp, FL2WORD16_SCALE( 2.71828183f, 2 ) ), tmp ); + a_e = add( shl( mean_e, 1 ), 3 ); + + /* b = (0.15f - powf(2.0f, target_bits/(float)L_frame)) * mean; */ + tmp = BASOP_Util_Divide1616_Scale( target_bits, L_frame, &tmp2 ); + tmp = round_fx( BASOP_util_Pow2( L_deposit_h( tmp ), tmp2, &tmp2 ) ); + b_e = BASOP_Util_Add_MantExp( FL2WORD16( 0.15f ), 0, negate( tmp ), tmp2, &b ); + b = mult_r( b, round_fx( mean ) ); + b_e = add( b_e, mean_e ); + + /* scale = (-b + sqrtf(b*b - 4.0f*a*0.035f)) / (2.0f * a); */ +#ifndef BASOP_NOGLOB + tmp = round_fx( BASOP_Util_Add_Mant32Exp( L_mult( b, b ), shl( b_e, 1 ), Mpy_32_16( a, FL2WORD16( -4.0f * 0.035f ) ), a_e, &tmp2 ) ); +#else + tmp = round_fx_o( BASOP_Util_Add_Mant32Exp( L_mult( b, b ), shl( b_e, 1 ), Mpy_32_16( a, FL2WORD16( -4.0f * 0.035f ) ), a_e, &tmp2 ), &Overflow ); +#endif + + IF( tmp <= 0 ) + { + tmp = 0; + + FOR( k = 0; k < L_frame; k++ ) + { + s_env[k] = 0; + move16(); + } + } + ELSE + { + tmp = Sqrt16( tmp, &tmp2 ); + } + + tmp2 = BASOP_Util_Add_MantExp( negate( b ), b_e, tmp, tmp2, &scale ); + scale = BASOP_Util_Divide1616_Scale( scale, round_fx( a ), &tmp ); +#ifndef BASOP_NOGLOB + scale = shl( scale, sub( sub( add( tmp, tmp2 ), a_e ), 1 ) ); /* Q15 */ +#else + scale = shl_o( scale, sub( sub( add( tmp, tmp2 ), a_e ), 1 ), &Overflow ); /* Q15 */ +#endif + + /* iscale = 1.0f / scale; */ + iscale_e = 0; + move16(); + iscale = Inv16( s_max( 1, scale ), &iscale_e ); + + lob = 0; + move16(); + hib = 0; + move16(); + + max_iter = 2; + move16(); + if ( low_complexity ) + { + max_iter = 1; + move16(); + } + + FOR( iter = 0; iter < max_iter; iter++ ) + { + statesi = 0x7FFF; + move16(); + bits = 0; + move16(); + + FOR( k = 0; k < L_frame; k++ ) + { + s = Mpy_32_16( ienv[k], scale ); /* Q16 */ + + IF( L_sub( s, FL2WORD32_SCALE( 0.08f, 15 ) ) <= 0 ) + { + /* If s = 0.08, the expected bit-consumption is log2(1.0224). Below 0.08, the bit-consumption + estimate function becomes inaccurate, so use log2(1.0224) for all values below 0.08. */ + /* round(state * 1.0224 * 32768) */ + statesi = mult_r( statesi, FL2WORD16_SCALE( 1.0224, 1 ) ); + tmp = norm_s( statesi ); + statesi = shl( statesi, tmp ); + bits = add( bits, sub( 1, tmp ) ); + } + ELSE IF( L_sub( s, FL2WORD32_SCALE( 255.0, 15 ) ) <= 0 ) + { + /* a = 5.436564f * s + 0.15f + 0.035f * env[k] * iscale; */ + L_tmp = L_shl( Mpy_32_16( s, FL2WORD16_SCALE( 5.436564f, 3 ) ), 3 ); + L_tmp = L_add( L_tmp, FL2WORD32_SCALE( 0.15f, 15 ) ); + L_tmp = L_add( L_tmp, L_shl( Mpy_32_16( env[k], mult_r( FL2WORD16( 0.035f ), iscale ) ), iscale_e ) ); + + tmp = norm_l( L_tmp ); +#ifndef BASOP_NOGLOB + statesi = mult_r( statesi, round_fx( L_shl( L_tmp, tmp ) ) ); +#else /* BASOP_NOGLOB */ + statesi = mult_r( statesi, round_fx_o( L_shl( L_tmp, tmp ), &Overflow ) ); +#endif /* BASOP_NOGLOB */ + bits = add( bits, sub( 15, tmp ) ); + + tmp = norm_s( statesi ); + statesi = shl( statesi, tmp ); + bits = sub( bits, tmp ); + } + ELSE + { + /* for large envelope values, s > 255, bit consumption is approx log2(2*e*s) + * further, we use round(log2(x)) = floor(log2(x)+0.5) = floor(log2(x*sqrt(2))) */ + /* a = 5.436564f * s; */ + L_tmp = Mpy_32_16( s, FL2WORD16_SCALE( 5.436564f * 1.4142f, 3 ) ); /* Q13 */ + bits = add( bits, sub( 17, norm_l( L_tmp ) ) ); + } + } + + IF( sub( bits, target_bits ) <= 0 ) + { + /* Bits leftover => scale is too small */ + lob = scale; + move16(); + lob_bits = bits; + move16(); + + IF( hib > 0 ) /* Bisection search */ + { + adjust = div_s( sub( hib_bits, target_bits ), sub( hib_bits, lob_bits ) ); + scale = add( mult_r( sub( lob, hib ), adjust ), hib ); + } + ELSE + { + /* Initial scale adaptation */ + /* adjust = 1.05f * target_bits / (float)bits; + scale *= adjust; */ + adjust = mult_r( FL2WORD16_SCALE( 1.05f, 1 ), target_bits ); + adjust = BASOP_Util_Divide1616_Scale( adjust, bits, &tmp ); + scale = shl( mult_r( scale, adjust ), add( 1, tmp ) ); + } + } + ELSE + { + /* Ran out of bits => scale is too large */ + hib = scale; + move16(); + hib_bits = bits; + move16(); + + IF( lob > 0 ) /* Bisection search */ + { + adjust = div_s( sub( hib_bits, target_bits ), sub( hib_bits, lob_bits ) ); + scale = add( mult_r( sub( lob, hib ), adjust ), hib ); + } + ELSE + { /* Initial scale adaptation */ + test(); + IF( target_bits <= 0 || bits <= 0 ) /* safety check in case of bit errors */ + { + adjust = 0; + move16(); + + FOR( k = 0; k < L_frame; k++ ) + { + s_env[k] = 0; + move16(); + } + } + ELSE + { + adjust = div_s( mult_r( 31130 /*0.95f Q15*/, target_bits ), bits ); + } + scale = mult_r( scale, adjust ); + } + } + iscale_e = 0; + move16(); + + IF( scale == 0 ) /* safety check in case of bit errors */ + { + iscale = 0; + move16(); + + FOR( k = 0; k < L_frame; k++ ) + { + s_env[k] = 0; + move16(); + } + } + ELSE + { + iscale = Inv16( scale, &iscale_e ); + } + } + L_frame = L_spec_core; + move16(); + + tmp = getScaleFactor32( env, L_frame ); + *s_env_e = sub( add( 15, iscale_e ), tmp ); + move16(); + BASOP_SATURATE_WARNING_OFF; +#ifndef BASOP_NOGLOB + a = L_shl( 1265000, sub( 15, *s_env_e ) ); +#else /* BASOP_NOGLOB */ + a = L_shl_o( 1265000, sub( 15, *s_env_e ), &Overflow ); +#endif /* BASOP_NOGLOB */ + BASOP_SATURATE_WARNING_ON; + + FOR( k = 0; k < L_frame; k++ ) + { + L_tmp = Mpy_32_16( L_shl( env[k], tmp ), iscale ); + L_tmp = L_min( L_tmp, a ); + s_env[k] = round_fx( L_tmp ); + move16(); + } + + return; +} + + +/*------------------------------------------------------------------------ + * Function: tcx_arith_render_envelope + * + * Calculate the envelope of the spectrum based on the LPC shape. The + * envelope is used in a perceptual domain, whereby the LPC shape has to + * be multiplied by the perceptual model. + * Operations that are performed on the spectrum, which change the magnitude + * expectation of lines, such as low-frequency emphasis, are included in the + * envelope shape. + * NOTE: This function must be bit-exact on all platforms such that encoder + * and decoder remain synchronized. + *-------------------------------------------------------------------------*/ + +void tcx_arith_render_envelope( + const Word16 A_ind[], /* i : LPC coefficients of signal envelope */ + const Word16 L_frame, /* i : number of spectral lines */ + const Word16 L_spec, /* i : length of the coded spectrum */ + const Word16 preemph_fac, /* i : pre-emphasis factor */ + const Word16 gamma_w, /* i : A_ind -> weighted envelope factor */ + const Word16 gamma_uw, /* i : A_ind -> non-weighted envelope factor */ + Word32 env[] /* o : shaped signal envelope */ +) +{ + Word16 k; + Word16 tmpA[M + 2]; + Word16 signal_env[FDNS_NPTS], signal_env_e[FDNS_NPTS]; + Word16 gainlpc[FDNS_NPTS], gainlpc_e[FDNS_NPTS]; + + /* Compute perceptual LPC envelope, transform it into freq.-domain gains */ + basop_weight_a( A_ind, tmpA, gamma_w ); + basop_lpc2mdct( tmpA, M, NULL, NULL, gainlpc, gainlpc_e ); + + /* Add pre-emphasis tilt to LPC envelope, transform LPC into MDCT gains */ + basop_weight_a_inv( A_ind, signal_env, gamma_uw ); + basop_E_LPC_a_add_tilt( signal_env, tmpA, preemph_fac ); + basop_lpc2mdct( tmpA, M + 1, signal_env, signal_env_e, NULL, NULL ); + + /* Compute weighted signal envelope in perceptual domain */ + FOR( k = 0; k < FDNS_NPTS; k++ ) + { + signal_env[k] = mult_r( signal_env[k], gainlpc[k] ); + move16(); + signal_env_e[k] = add( signal_env_e[k], gainlpc_e[k] ); + move16(); + } + + /* Adaptive low frequency emphasis */ + FOR( k = 0; k < L_frame; k++ ) + { + env[k] = 0x10000; + move32(); + } + + basop_PsychAdaptLowFreqDeemph( env, gainlpc, gainlpc_e, NULL ); + + /* Scale from FDNS_NPTS to L_frame and multiply LFE gains */ + basop_mdct_noiseShaping_interp( env, L_frame, signal_env, signal_env_e ); + + FOR( k = L_frame; k < L_spec; ++k ) + { + env[k] = env[k - 1]; + move32(); + } + + return; +} + +#undef WMC_TOOL_SKIP diff --git a/lib_com/basop32.c b/lib_com/basop32.c new file mode 100644 index 0000000000000000000000000000000000000000..3e608e4a6506c626dca99b99daf1d223d7d057c7 --- /dev/null +++ b/lib_com/basop32.c @@ -0,0 +1,3153 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/* v.2.3 - 30.Nov.2009 + ============================================================================= + + U U GGG SSSS TTTTT + U U G S T + U U G GG SSSS T + U U G G S T + UUU GG SSS T + + ======================================== + ITU-T - USER'S GROUP ON SOFTWARE TOOLS + ======================================== + + ============================================================= + COPYRIGHT NOTE: This source code, and all of its derivations, + is subject to the "ITU-T General Public License". Please have + it read in the distribution disk, or in the ITU-T + Recommendation G.191 on "SOFTWARE TOOLS FOR SPEECH AND AUDIO + CODING STANDARDS". + ============================================================= + +MODULE: BASOP32, BASIC OPERATORS + +ORIGINAL BY: + Incorporated from anonymous contributions for + ETSI Standards as well as G.723.1, G.729, and G.722.1 + +DESCRIPTION: + This file contains the definition of 16- and 32-bit basic + operators to be used in the implementation of signal + processing algorithms. The basic operators try to resemble + assembly language instructions that are commonly found in + digital signal processor (DSP) CPUs, thus allowing algorithm + C-code implementations more directly mapeable to DSP assembly + code. + + ********************************************************* + NOTE: so far, this module does not have a demo program! + ********************************************************* + +FUNCTIONS: + Defined in basop32.h. Self-documentation within each function. + +HISTORY: + 26.Jan.00 v1.0 Incorporated to the STL from updated G.723.1/G.729 + basic operator library (based on basicop2.c) and + G.723.1's basop.c [L_mls(), div_l(), i_mult()] + + 05.Jul.00 v1.1 Added 32-bit shiftless accumulation basic + operators (L_msu0, L_mac0, L_mult0). Improved + documentation for i_mult(). + + 03 Nov 04 v2.0 Incorporation of new 32-bit / 40-bit / control + operators for the ITU-T Standard Tool Library as + described in Geneva, 20-30 January 2004 WP 3/16 Q10/16 + TD 11 document and subsequent discussions on the + wp3audio@yahoogroups.com email reflector. + norm_s() weight reduced from 15 to 1. + norm_l() weight reduced from 30 to 1. + L_abs() weight reduced from 2 to 1. + L_add() weight reduced from 2 to 1. + L_negate() weight reduced from 2 to 1. + L_shl() weight reduced from 2 to 1. + L_shr() weight reduced from 2 to 1. + L_sub() weight reduced from 2 to 1. + mac_r() weight reduced from 2 to 1. + msu_r() weight reduced from 2 to 1. + mult_r() weight reduced from 2 to 1. + L_deposit_h() weight reduced from 2 to 1. + L_deposit_l() weight reduced from 2 to 1. + L_mls() weight of 5. + div_l() weight of 32. + i_mult() weight of 3. + + 30 Nov 09 v2.3 round() function is now round_fx(). + saturate() is not referencable from outside application + ============================================================================= +*/ + + +/*___________________________________________________________________________ + | | + | Basic arithmetic operators. | + | | + | | + | | + | saturate() | + | add() | + | sub() | + | abs_s() | + | divide_s() | + | extract_h() | + | extract_l() | + | L_abs() | + | L_add() | + | L_deposit_h() | + | L_deposit_l() | + | L_mac() | + | L_msu() | + | L_mult() | + | L_negate() | + | L_shl() | + | L_shr() | + | L_sub() | + | mac_r() | + | msu_r() | + | mult() | + | mult_r() | + | negate() | + | norm_l() | + | norm_s() | + | round_fx() | + | shl() | + | shr() | + |___________________________________________________________________________| +*/ + + +/*___________________________________________________________________________ + | | + | Include-Files | + |___________________________________________________________________________| +*/ +#ifndef _CRT_SECURE_NO_WARNINGS +#define _CRT_SECURE_NO_WARNINGS +#endif + +#include +#include +#include "stl.h" +#ifdef BASOP_NOGLOB +#include +#endif /* BASOP_NOGLOB */ + +#define WMC_TOOL_SKIP + +#ifdef _MSC_VER +#pragma warning( disable : 4310 ) +#endif + +/*___________________________________________________________________________ + | | + | Local Functions | + |___________________________________________________________________________| +*/ +#ifdef BASOP_NOGLOB +static Word16 saturate_o( Word32 L_var1, Flag *Overflow ); +#endif /* BASOP_NOGLOB */ +static Word16 saturate( Word32 L_var1 ); + + +/*___________________________________________________________________________ + | | + | Constants and Globals | + |___________________________________________________________________________| +*/ +#ifndef BASOP_NOGLOB +Flag Overflow = 0; +Flag Carry = 0; + +#else /* BASOP_NOGLOB */ +/* +Flag BASOP_Overflow = 0; +Flag BASOP_Carry = 0; +*/ +#endif /* BASOP_NOGLOB */ + +/*___________________________________________________________________________ + | | + | Functions | + |___________________________________________________________________________| +*/ + +#define PRINT_STACK_ID_ALL "*" + + +/*___________________________________________________________________________ + | | + | Function Name : saturate | + | | + | Purpose : | + | | + | Limit the 32 bit input to the range of a 16 bit word. Must NOT be | + | referenced from outside applications. | + | | + | Inputs : | + | | + | L_var1 | + | 32 bit long signed integer (Word32) whose value falls in the | + | range : 0x8000 0000 <= L_var1 <= 0x7fff ffff. | + | | + | Outputs : | + | | + | none | + | | + | Return Value : | + | | + | var_out | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var_out <= 0x0000 7fff. | + |___________________________________________________________________________| +*/ +#ifndef BASOP_NOGLOB +static Word16 saturate( Word32 L_var1 ) +#else /* BASOP_NOGLOB */ +static Word16 saturate_o( Word32 L_var1, Flag *Overflow ) +#endif /* BASOP_NOGLOB */ +{ + Word16 var_out; + + if ( L_var1 > 0X00007fffL ) + { +#ifndef BASOP_NOGLOB + Overflow = 1; +#else /* BASOP_NOGLOB */ + *Overflow = 1; +#endif /* BASOP_NOGLOB */ + var_out = MAX_16; + } + else if ( L_var1 < (Word32) 0xffff8000L ) + { +#ifndef BASOP_NOGLOB + Overflow = 1; +#else /* BASOP_NOGLOB */ + *Overflow = 1; +#endif /* BASOP_NOGLOB */ + var_out = MIN_16; + } + else + { + var_out = extract_l( L_var1 ); + } + + BASOP_CHECK(); + + return ( var_out ); +} + +#ifdef BASOP_NOGLOB +static Word16 saturate( Word32 L_var1 ) +{ + Word16 var_out; + + if ( L_var1 > 0X00007fffL ) + { + assert( 0 ); + var_out = MAX_16; + } + else if ( L_var1 < (Word32) 0xffff8000L ) + { + assert( 0 ); + var_out = MIN_16; + } + else + { + var_out = extract_l( L_var1 ); + } + + BASOP_CHECK(); + + return ( var_out ); +} +#endif /* BASOP_NOGLOB */ + +/*___________________________________________________________________________ + | | + | Function Name : add | + | | + | Purpose : | + | | + | Performs the addition (var1+var2) with overflow control and saturation;| + | the 16 bit result is set at +32767 when overflow occurs or at -32768 | + | when underflow occurs. | + | | + | Complexity weight : 1 | + | | + | Inputs : | + | | + | var1 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | + | | + | var2 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | + | | + | Outputs : | + | | + | none | + | | + | Return Value : | + | | + | var_out | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var_out <= 0x0000 7fff. | + |___________________________________________________________________________| +*/ +#ifdef BASOP_NOGLOB +Word16 add_o( Word16 var1, Word16 var2, Flag *Overflow ) +{ + Word16 var_out; + Word32 L_sum; + + L_sum = (Word32) var1 + var2; + var_out = saturate_o( L_sum, Overflow ); + + + return ( var_out ); +} + +#endif /* BASOP_NOGLOB */ +Word16 add( Word16 var1, Word16 var2 ) +{ + Word16 var_out; + Word32 L_sum; + + L_sum = (Word32) var1 + var2; + var_out = saturate( L_sum ); + + + return ( var_out ); +} + + +/*___________________________________________________________________________ + | | + | Function Name : sub | + | | + | Purpose : | + | | + | Performs the subtraction (var1+var2) with overflow control and satu- | + | ration; the 16 bit result is set at +32767 when overflow occurs or at | + | -32768 when underflow occurs. | + | | + | Complexity weight : 1 | + | | + | Inputs : | + | | + | var1 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | + | | + | var2 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | + | | + | Outputs : | + | | + | none | + | | + | Return Value : | + | | + | var_out | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var_out <= 0x0000 7fff. | + |___________________________________________________________________________| +*/ +#ifdef BASOP_NOGLOB +Word16 sub_o( Word16 var1, Word16 var2, Flag *Overflow ) +{ + Word16 var_out; + Word32 L_diff; + + L_diff = (Word32) var1 - var2; + var_out = saturate_o( L_diff, Overflow ); + + return ( var_out ); +} + +#endif /* BASOP_NOGLOB */ +Word16 sub( Word16 var1, Word16 var2 ) +{ + Word16 var_out; + Word32 L_diff; + + L_diff = (Word32) var1 - var2; + var_out = saturate( L_diff ); + + return ( var_out ); +} + + +/*___________________________________________________________________________ + | | + | Function Name : abs_s | + | | + | Purpose : | + | | + | Absolute value of var1; abs_s(-32768) = 32767. | + | | + | Complexity weight : 1 | + | | + | Inputs : | + | | + | var1 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | + | | + | Outputs : | + | | + | none | + | | + | Return Value : | + | | + | var_out | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0x0000 0000 <= var_out <= 0x0000 7fff. | + |___________________________________________________________________________| +*/ +Word16 abs_s( Word16 var1 ) +{ + Word16 var_out; + + if ( var1 == (Word16) MIN_16 ) + { + var_out = MAX_16; + } + else + { + if ( var1 < 0 ) + { + var_out = -var1; + } + else + { + var_out = var1; + } + } + + BASOP_CHECK(); + + + return ( var_out ); +} + + +/*___________________________________________________________________________ + | | + | Function Name : shl | + | | + | Purpose : | + | | + | Arithmetically shift the 16 bit input var1 left var2 positions.Zero fill| + | the var2 LSB of the result. If var2 is negative, arithmetically shift | + | var1 right by -var2 with sign extension. Saturate the result in case of | + | underflows or overflows. | + | | + | Complexity weight : 1 | + | | + | Inputs : | + | | + | var1 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | + | | + | var2 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | + | | + | Outputs : | + | | + | none | + | | + | Return Value : | + | | + | var_out | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var_out <= 0x0000 7fff. | + |___________________________________________________________________________| +*/ +#ifndef BASOP_NOGLOB +Word16 shl( Word16 var1, Word16 var2 ) +#else /* BASOP_NOGLOB */ +Word16 shl_o( Word16 var1, Word16 var2, Flag *Overflow ) +#endif /* BASOP_NOGLOB */ +{ + Word16 var_out; + Word32 result; + + if ( var2 < 0 ) + { + if ( var2 < -16 ) + var2 = -16; + var2 = -var2; + var_out = shr( var1, var2 ); + } + else + { + result = (Word32) var1 * ( (Word32) 1 << var2 ); + + if ( ( var2 > 15 && var1 != 0 ) || ( result != (Word32) ( (Word16) result ) ) ) + { +#ifndef BASOP_NOGLOB + Overflow = 1; +#else /* BASOP_NOGLOB */ + *Overflow = 1; +#endif /* BASOP_NOGLOB */ + var_out = ( var1 > 0 ) ? MAX_16 : MIN_16; + } + else + { + var_out = extract_l( result ); + } + } + + BASOP_CHECK(); + + + return ( var_out ); +} + +#ifdef BASOP_NOGLOB +Word16 shl( Word16 var1, Word16 var2 ) +{ + Word16 var_out; + Word32 result; + + if ( var2 < 0 ) + { + if ( var2 < -16 ) + var2 = -16; + var2 = -var2; + var_out = shr( var1, var2 ); + } + else + { + result = (Word32) var1 * ( (Word32) 1 << var2 ); + + if ( ( var2 > 15 && var1 != 0 ) || ( result != (Word32) ( (Word16) result ) ) ) + { + assert( 0 ); + var_out = ( var1 > 0 ) ? MAX_16 : MIN_16; + } + else + { + var_out = extract_l( result ); + } + } + + BASOP_CHECK(); + + + return ( var_out ); +} +#endif /* BASOP_NOGLOB */ + +/*___________________________________________________________________________ + | | + | Function Name : shr | + | | + | Purpose : | + | | + | Arithmetically shift the 16 bit input var1 right var2 positions with | + | sign extension. If var2 is negative, arithmetically shift var1 left by | + | -var2 with sign extension. Saturate the result in case of underflows or | + | overflows. | + | | + | Complexity weight : 1 | + | | + | Inputs : | + | | + | var1 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | + | | + | var2 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | + | | + | Outputs : | + | | + | none | + | | + | Return Value : | + | | + | var_out | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var_out <= 0x0000 7fff. | + |___________________________________________________________________________| +*/ +Word16 shr( Word16 var1, Word16 var2 ) +{ + Word16 var_out; + + if ( var2 < 0 ) + { +#ifdef BASOP_NOGLOB + assert( 0 ); +#endif /* BASOP_NOGLOB */ + if ( var2 < -16 ) + var2 = -16; + var2 = -var2; + var_out = shl( var1, var2 ); + } + else + { + if ( var2 >= 15 ) + { + var_out = ( var1 < 0 ) ? -1 : 0; + } + else + { + if ( var1 < 0 ) + { + var_out = ~( ( ~var1 ) >> var2 ); + } + else + { + var_out = var1 >> var2; + } + } + } + + BASOP_CHECK(); + + + return ( var_out ); +} + + +/*___________________________________________________________________________ + | | + | Function Name : mult | + | | + | Purpose : | + | | + | Performs the multiplication of var1 by var2 and gives a 16 bit result | + | which is scaled i.e.: | + | mult(var1,var2) = extract_l(L_shr((var1 times var2),15)) and | + | mult(-32768,-32768) = 32767. | + | | + | Complexity weight : 1 | + | | + | Inputs : | + | | + | var1 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | + | | + | var2 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | + | | + | Outputs : | + | | + | none | + | | + | Return Value : | + | | + | var_out | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var_out <= 0x0000 7fff. | + |___________________________________________________________________________| +*/ +#ifdef BASOP_NOGLOB +Word16 mult_o( Word16 var1, Word16 var2, Flag *Overflow ) +{ + Word16 var_out; + Word32 L_product; + + L_product = (Word32) var1 * (Word32) var2; + + L_product = ( L_product & (Word32) 0xffff8000L ) >> 15; + + if ( L_product & (Word32) 0x00010000L ) + L_product = L_product | (Word32) 0xffff0000L; + + var_out = saturate_o( L_product, Overflow ); + + + return ( var_out ); +} + +#endif /* BASOP_NOGLOB */ +Word16 mult( Word16 var1, Word16 var2 ) +{ + Word16 var_out; + Word32 L_product; + + L_product = (Word32) var1 * (Word32) var2; + + L_product = ( L_product & (Word32) 0xffff8000L ) >> 15; + + if ( L_product & (Word32) 0x00010000L ) + L_product = L_product | (Word32) 0xffff0000L; + + var_out = saturate( L_product ); + + + return ( var_out ); +} + + +/*___________________________________________________________________________ + | | + | Function Name : L_mult | + | | + | Purpose : | + | | + | L_mult is the 32 bit result of the multiplication of var1 times var2 | + | with one shift left i.e.: | + | L_mult(var1,var2) = L_shl((var1 times var2),1) and | + | L_mult(-32768,-32768) = 2147483647. | + | | + | Complexity weight : 1 | + | | + | Inputs : | + | | + | var1 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | + | | + | var2 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | + | | + | Outputs : | + | | + | none | + | | + | Return Value : | + | | + | L_var_out | + | 32 bit long signed integer (Word32) whose value falls in the | + | range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | + |___________________________________________________________________________| +*/ +#ifndef BASOP_NOGLOB +Word32 L_mult( Word16 var1, Word16 var2 ) +#else /* BASOP_NOGLOB */ +Word32 L_mult_o( Word16 var1, Word16 var2, Flag *Overflow ) +#endif /* BASOP_NOGLOB */ +{ + Word32 L_var_out; + + L_var_out = (Word32) var1 * (Word32) var2; + + if ( L_var_out != (Word32) 0x40000000L ) + { + L_var_out *= 2; + } + else + { +#ifndef BASOP_NOGLOB + Overflow = 1; +#else /* BASOP_NOGLOB */ + *Overflow = 1; +#endif /* BASOP_NOGLOB */ + L_var_out = MAX_32; + } + + BASOP_CHECK(); + + return ( L_var_out ); +} + +#ifdef BASOP_NOGLOB +Word32 L_mult( Word16 var1, Word16 var2 ) +{ + Word32 L_var_out; + + L_var_out = (Word32) var1 * (Word32) var2; + + if ( L_var_out != (Word32) 0x40000000L ) + { + L_var_out *= 2; + } + else + { + assert( 0 ); + L_var_out = MAX_32; + } + + BASOP_CHECK(); + + return ( L_var_out ); +} +#endif /* BASOP_NOGLOB */ + +/*___________________________________________________________________________ + | | + | Function Name : negate | + | | + | Purpose : | + | | + | Negate var1 with saturation, saturate in the case where input is -32768:| + | negate(var1) = sub(0,var1). | + | | + | Complexity weight : 1 | + | | + | Inputs : | + | | + | var1 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | + | | + | Outputs : | + | | + | none | + | | + | Return Value : | + | | + | var_out | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var_out <= 0x0000 7fff. | + |___________________________________________________________________________| +*/ +Word16 negate( Word16 var1 ) +{ + Word16 var_out; + + var_out = ( var1 == MIN_16 ) ? MAX_16 : -var1; + + + BASOP_CHECK(); + + + return ( var_out ); +} + + +/*___________________________________________________________________________ + | | + | Function Name : extract_h | + | | + | Purpose : | + | | + | Return the 16 MSB of L_var1. | + | | + | Complexity weight : 1 | + | | + | Inputs : | + | | + | L_var1 | + | 32 bit long signed integer (Word32 ) whose value falls in the | + | range : 0x8000 0000 <= L_var1 <= 0x7fff ffff. | + | | + | Outputs : | + | | + | none | + | | + | Return Value : | + | | + | var_out | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var_out <= 0x0000 7fff. | + |___________________________________________________________________________| +*/ +Word16 extract_h( Word32 L_var1 ) +{ + Word16 var_out; + + var_out = (Word16) ( L_var1 >> 16 ); + + BASOP_CHECK(); + + + return ( var_out ); +} + + +/*___________________________________________________________________________ + | | + | Function Name : extract_l | + | | + | Purpose : | + | | + | Return the 16 LSB of L_var1. | + | | + | Complexity weight : 1 | + | | + | Inputs : | + | | + | L_var1 | + | 32 bit long signed integer (Word32 ) whose value falls in the | + | range : 0x8000 0000 <= L_var1 <= 0x7fff ffff. | + | | + | Outputs : | + | | + | none | + | | + | Return Value : | + | | + | var_out | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var_out <= 0x0000 7fff. | + |___________________________________________________________________________| +*/ +Word16 extract_l( Word32 L_var1 ) +{ + Word16 var_out; + + var_out = (Word16) L_var1; + + BASOP_CHECK(); + + + return ( var_out ); +} + + +/*___________________________________________________________________________ + | | + | Function Name : round_fx | + | | + | Purpose : | + | | + | Round the lower 16 bits of the 32 bit input number into the MS 16 bits | + | with saturation. Shift the resulting bits right by 16 and return the 16 | + | bit number: | + | round_fx(L_var1) = extract_h(L_add(L_var1,32768)) | + | | + | Complexity weight : 1 | + | | + | Inputs : | + | | + | L_var1 | + | 32 bit long signed integer (Word32 ) whose value falls in the | + | range : 0x8000 0000 <= L_var1 <= 0x7fff ffff. | + | | + | Outputs : | + | | + | none | + | | + | Return Value : | + | | + | var_out | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var_out <= 0x0000 7fff. | + |___________________________________________________________________________| +*/ +#ifdef BASOP_NOGLOB +Word16 round_fx_o( Word32 L_var1, Flag *Overflow ) +{ + Word16 var_out; + Word32 L_rounded; + + BASOP_SATURATE_WARNING_OFF + L_rounded = L_add_o( L_var1, (Word32) 0x00008000L, Overflow ); + BASOP_SATURATE_WARNING_ON + var_out = extract_h( L_rounded ); + + BASOP_CHECK(); + + return ( var_out ); +} + +#endif /* BASOP_NOGLOB */ +Word16 round_fx( Word32 L_var1 ) +{ + Word16 var_out; + Word32 L_rounded; + + BASOP_SATURATE_WARNING_OFF + L_rounded = L_add( L_var1, (Word32) 0x00008000L ); + BASOP_SATURATE_WARNING_ON + var_out = extract_h( L_rounded ); + + BASOP_CHECK(); + + return ( var_out ); +} + + +/*___________________________________________________________________________ + | | + | Function Name : L_mac | + | | + | Purpose : | + | | + | Multiply var1 by var2 and shift the result left by 1. Add the 32 bit | + | result to L_var3 with saturation, return a 32 bit result: | + | L_mac(L_var3,var1,var2) = L_add(L_var3,L_mult(var1,var2)). | + | | + | Complexity weight : 1 | + | | + | Inputs : | + | | + | L_var3 32 bit long signed integer (Word32) whose value falls in the | + | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | + | | + | var1 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | + | | + | var2 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | + | | + | Outputs : | + | | + | none | + | | + | Return Value : | + | | + | L_var_out | + | 32 bit long signed integer (Word32) whose value falls in the | + | range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | + |___________________________________________________________________________| +*/ +#ifdef BASOP_NOGLOB +Word32 L_mac_o( Word32 L_var3, Word16 var1, Word16 var2, Flag *Overflow ) +{ + Word32 L_var_out; + Word32 L_product; + + L_product = L_mult_o( var1, var2, Overflow ); + L_var_out = L_add_o( L_var3, L_product, Overflow ); + + BASOP_CHECK(); + + return ( L_var_out ); +} + +#endif /* BASOP_NOGLOB */ +Word32 L_mac( Word32 L_var3, Word16 var1, Word16 var2 ) +{ + Word32 L_var_out; + Word32 L_product; + + L_product = L_mult( var1, var2 ); + L_var_out = L_add( L_var3, L_product ); + + BASOP_CHECK(); + + return ( L_var_out ); +} + + +/*___________________________________________________________________________ + | | + | Function Name : L_msu | + | | + | Purpose : | + | | + | Multiply var1 by var2 and shift the result left by 1. Subtract the 32 | + | bit result from L_var3 with saturation, return a 32 bit result: | + | L_msu(L_var3,var1,var2) = L_sub(L_var3,L_mult(var1,var2)). | + | | + | Complexity weight : 1 | + | | + | Inputs : | + | | + | L_var3 32 bit long signed integer (Word32) whose value falls in the | + | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | + | | + | var1 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | + | | + | var2 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | + | | + | Outputs : | + | | + | none | + | | + | Return Value : | + | | + | L_var_out | + | 32 bit long signed integer (Word32) whose value falls in the | + | range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | + |___________________________________________________________________________| +*/ +#ifdef BASOP_NOGLOB +Word32 L_msu_o( Word32 L_var3, Word16 var1, Word16 var2, Flag *Overflow ) +{ + Word32 L_var_out; + Word32 L_product; + + L_product = L_mult_o( var1, var2, Overflow ); + L_var_out = L_sub_o( L_var3, L_product, Overflow ); + + BASOP_CHECK(); + + return ( L_var_out ); +} + +#endif /* BASOP_NOGLOB */ +Word32 L_msu( Word32 L_var3, Word16 var1, Word16 var2 ) +{ + Word32 L_var_out; + Word32 L_product; + + L_product = L_mult( var1, var2 ); + L_var_out = L_sub( L_var3, L_product ); + + BASOP_CHECK(); + + return ( L_var_out ); +} + + +/*___________________________________________________________________________ + | | + | Function Name : L_macNs | + | | + | Purpose : | + | | + | Multiply var1 by var2 and shift the result left by 1. Add the 32 bit | + | result to L_var3 without saturation, return a 32 bit result. Generate | + | carry and overflow values : | + | L_macNs(L_var3,var1,var2) = L_add_c(L_var3,L_mult(var1,var2)). | + | | + | Complexity weight : 1 | + | | + | Inputs : | + | | + | L_var3 32 bit long signed integer (Word32) whose value falls in the | + | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | + | | + | var1 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | + | | + | var2 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | + | | + | Outputs : | + | | + | none | + | | + | Return Value : | + | | + | L_var_out | + | 32 bit long signed integer (Word32) whose value falls in the | + | range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | + | | + | Caution : | + | | +#ifndef BASOP_NOGLOB + | In some cases the Carry flag has to be cleared or set before using | +#else + | In some cases the BASOP_Carry flag has to be cleared or set before using | +#endif + | operators which take into account its value. | + |___________________________________________________________________________| +*/ +#ifndef BASOP_NOGLOB +Word32 L_macNs( Word32 L_var3, Word16 var1, Word16 var2 ) +#else /* BASOP_NOGLOB */ +Word32 DEPR_L_macNs( Word32 L_var3, Word16 var1, Word16 var2, Flag *Carry ) +#endif /* BASOP_NOGLOB */ +{ + Word32 L_var_out; + + L_var_out = L_mult( var1, var2 ); +#ifndef BASOP_NOGLOB + L_var_out = L_add_c( L_var3, L_var_out ); +#else /* BASOP_NOGLOB */ + L_var_out = DEPR_L_add_c( L_var3, L_var_out, Carry ); +#endif /* BASOP_NOGLOB */ + + /* BASOP_CHECK(); Do not check for overflow here, function produces the carry bit instead */ + + + return ( L_var_out ); +} + + +/*___________________________________________________________________________ + | | + | Function Name : L_msuNs | + | | + | Purpose : | + | | + | Multiply var1 by var2 and shift the result left by 1. Subtract the 32 | + | bit result from L_var3 without saturation, return a 32 bit result. Ge- | + | nerate carry and overflow values : | + | L_msuNs(L_var3,var1,var2) = L_sub_c(L_var3,L_mult(var1,var2)). | + | | + | Complexity weight : 1 | + | | + | Inputs : | + | | + | L_var3 32 bit long signed integer (Word32) whose value falls in the | + | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | + | | + | var1 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | + | | + | var2 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | + | | + | Outputs : | + | | + | none | + | | + | Return Value : | + | | + | L_var_out | + | 32 bit long signed integer (Word32) whose value falls in the | + | range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | + | | + | Caution : | + | | +#ifndef BASOP_NOGLOB + | In some cases the Carry flag has to be cleared or set before using | +#else + | In some cases the BASOP_Carry flag has to be cleared or set before using | +#endif + | operators which take into account its value. | + |___________________________________________________________________________| +*/ +#ifndef BASOP_NOGLOB +Word32 L_msuNs( Word32 L_var3, Word16 var1, Word16 var2 ) +#else /* BASOP_NOGLOB */ +Word32 DEPR_L_msuNs( Word32 L_var3, Word16 var1, Word16 var2, Flag *Carry ) +#endif /* BASOP_NOGLOB */ +{ + Word32 L_var_out; + + L_var_out = L_mult( var1, var2 ); +#ifndef BASOP_NOGLOB + L_var_out = L_sub_c( L_var3, L_var_out ); +#else /* BASOP_NOGLOB */ + L_var_out = DEPR_L_sub_c( L_var3, L_var_out, Carry ); +#endif /* BASOP_NOGLOB */ + + /* BASOP_CHECK(); Do not check for overflow here, function produces the carry bit instead */ + + + return ( L_var_out ); +} + + +/*___________________________________________________________________________ + | | + | Function Name : L_add | + | | + | Purpose : | + | | + | 32 bits addition of the two 32 bits variables (L_var1+L_var2) with | + | overflow control and saturation; the result is set at +2147483647 when | + | overflow occurs or at -2147483648 when underflow occurs. | + | | + | Complexity weight : 1 | + | | + | Inputs : | + | | + | L_var1 32 bit long signed integer (Word32) whose value falls in the | + | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | + | | + | L_var2 32 bit long signed integer (Word32) whose value falls in the | + | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | + | | + | Outputs : | + | | + | none | + | | + | Return Value : | + | | + | L_var_out | + | 32 bit long signed integer (Word32) whose value falls in the | + | range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | + |___________________________________________________________________________| +*/ +#ifndef BASOP_NOGLOB +Word32 L_add( Word32 L_var1, Word32 L_var2 ) +#else /* BASOP_NOGLOB */ +Word32 L_add_o( Word32 L_var1, Word32 L_var2, Flag *Overflow ) +#endif /* BASOP_NOGLOB */ +{ + Word32 L_var_out; + + L_var_out = L_var1 + L_var2; + + if ( ( ( L_var1 ^ L_var2 ) & MIN_32 ) == 0 ) + { + if ( ( L_var_out ^ L_var1 ) & MIN_32 ) + { + L_var_out = ( L_var1 < 0 ) ? MIN_32 : MAX_32; +#ifndef BASOP_NOGLOB + Overflow = 1; +#else /* BASOP_NOGLOB */ + *Overflow = 1; +#endif /* BASOP_NOGLOB */ + } + } + + BASOP_CHECK(); + + + return ( L_var_out ); +} + +#ifdef BASOP_NOGLOB +Word32 L_add( Word32 L_var1, Word32 L_var2 ) +{ + Word32 L_var_out; + + L_var_out = L_var1 + L_var2; + + if ( ( ( L_var1 ^ L_var2 ) & MIN_32 ) == 0 ) + { + if ( ( L_var_out ^ L_var1 ) & MIN_32 ) + { + L_var_out = ( L_var1 < 0 ) ? MIN_32 : MAX_32; + assert( 0 ); + } + } + + return ( L_var_out ); +} +#endif /* BASOP_NOGLOB */ + +/*___________________________________________________________________________ + | | + | Function Name : L_sub | + | | + | Purpose : | + | | + | 32 bits subtraction of the two 32 bits variables (L_var1-L_var2) with | + | overflow control and saturation; the result is set at +2147483647 when | + | overflow occurs or at -2147483648 when underflow occurs. | + | | + | Complexity weight : 1 | + | | + | Inputs : | + | | + | L_var1 32 bit long signed integer (Word32) whose value falls in the | + | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | + | | + | L_var2 32 bit long signed integer (Word32) whose value falls in the | + | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | + | | + | Outputs : | + | | + | none | + | | + | Return Value : | + | | + | L_var_out | + | 32 bit long signed integer (Word32) whose value falls in the | + | range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | + |___________________________________________________________________________| +*/ +#ifndef BASOP_NOGLOB +Word32 L_sub( Word32 L_var1, Word32 L_var2 ) +#else /* BASOP_NOGLOB */ +Word32 L_sub_o( Word32 L_var1, Word32 L_var2, Flag *Overflow ) +#endif /* BASOP_NOGLOB */ +{ + Word32 L_var_out; + + L_var_out = L_var1 - L_var2; + + if ( ( ( L_var1 ^ L_var2 ) & MIN_32 ) != 0 ) + { + if ( ( L_var_out ^ L_var1 ) & MIN_32 ) + { + L_var_out = ( L_var1 < 0L ) ? MIN_32 : MAX_32; +#ifndef BASOP_NOGLOB + Overflow = 1; +#else /* BASOP_NOGLOB */ + *Overflow = 1; +#endif /* BASOP_NOGLOB */ + } + } + + BASOP_CHECK(); + + return ( L_var_out ); +} + +#ifdef BASOP_NOGLOB +Word32 L_sub( Word32 L_var1, Word32 L_var2 ) +{ + Word32 L_var_out; + + L_var_out = L_var1 - L_var2; + + if ( ( ( L_var1 ^ L_var2 ) & MIN_32 ) != 0 ) + { + if ( ( L_var_out ^ L_var1 ) & MIN_32 ) + { + L_var_out = ( L_var1 < 0L ) ? MIN_32 : MAX_32; + assert( 0 ); + } + } + + BASOP_CHECK(); + + return ( L_var_out ); +} +#endif /* BASOP_NOGLOB */ + +/*___________________________________________________________________________ + | | + | Function Name : L_add_c | + | | + | Purpose : | + | | + | Performs 32 bits addition of the two 32 bits variables (L_var1+L_var2+C)| +#ifndef BASOP_NOGLOB + | with carry. No saturation. Generate carry and Overflow values. The car- | +#else + | with carry. No saturation. Generate carry and BASOP_Overflow values. The car- | +#endif + | ry and overflow values are binary variables which can be tested and as- | + | signed values. | + | | + | Complexity weight : 2 | + | | + | Inputs : | + | | + | L_var1 32 bit long signed integer (Word32) whose value falls in the | + | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | + | | + | L_var2 32 bit long signed integer (Word32) whose value falls in the | + | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | + | | + | Outputs : | + | | + | none | + | | + | Return Value : | + | | + | L_var_out | + | 32 bit long signed integer (Word32) whose value falls in the | + | range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | + | | + | Caution : | + | | +#ifndef BASOP_NOGLOB + | In some cases the Carry flag has to be cleared or set before using | +#else + | In some cases the BASOP_Carry flag has to be cleared or set before using | +#endif + | operators which take into account its value. | + |___________________________________________________________________________| +*/ +#ifndef BASOP_NOGLOB +Word32 L_add_c( Word32 L_var1, Word32 L_var2 ) +#else /* BASOP_NOGLOB */ +Word32 DEPR_L_add_c( Word32 L_var1, Word32 L_var2, Flag *Carry ) +#endif /* BASOP_NOGLOB */ +{ + Word32 L_var_out; + Word32 L_test; + Flag carry_int = 0; + +#ifndef BASOP_NOGLOB + L_var_out = L_var1 + L_var2 + Carry; +#else /* BASOP_NOGLOB */ + L_var_out = L_var1 + L_var2 + *Carry; +#endif /* BASOP_NOGLOB */ + + L_test = L_var1 + L_var2; + + if ( ( L_var1 > 0 ) && ( L_var2 > 0 ) && ( L_test < 0 ) ) + { +#ifndef BASOP_NOGLOB + Overflow = 1; +#endif /* ! BASOP_NOGLOB */ + carry_int = 0; + } + else + { + if ( ( L_var1 < 0 ) && ( L_var2 < 0 ) ) + { + if ( L_test >= 0 ) + { +#ifndef BASOP_NOGLOB + Overflow = 1; +#endif /* ! BASOP_NOGLOB */ + carry_int = 1; + } + else + { +#ifndef BASOP_NOGLOB + Overflow = 0; +#endif /* ! BASOP_NOGLOB */ + carry_int = 1; + } + } + else + { + if ( ( ( L_var1 ^ L_var2 ) < 0 ) && ( L_test >= 0 ) ) + { +#ifndef BASOP_NOGLOB + Overflow = 0; +#endif /* ! BASOP_NOGLOB */ + carry_int = 1; + } + else + { +#ifndef BASOP_NOGLOB + Overflow = 0; +#endif /* ! BASOP_NOGLOB */ + carry_int = 0; + } + } + } + +#ifndef BASOP_NOGLOB + if ( Carry ) +#else /* BASOP_NOGLOB */ + if ( *Carry ) +#endif /* BASOP_NOGLOB */ + { + if ( L_test == MAX_32 ) + { +#ifndef BASOP_NOGLOB + Overflow = 1; + Carry = carry_int; +#else /* BASOP_NOGLOB */ + *Carry = carry_int; +#endif /* BASOP_NOGLOB */ + } + else + { + if ( L_test == (Word32) 0xFFFFFFFFL ) + { +#ifndef BASOP_NOGLOB + Carry = 1; +#else /* BASOP_NOGLOB */ + *Carry = 1; +#endif /* BASOP_NOGLOB */ + } + else + { +#ifndef BASOP_NOGLOB + Carry = carry_int; +#else /* BASOP_NOGLOB */ + *Carry = carry_int; +#endif /* BASOP_NOGLOB */ + } + } + } + else + { +#ifndef BASOP_NOGLOB + Carry = carry_int; +#else /* BASOP_NOGLOB */ + *Carry = carry_int; +#endif /* BASOP_NOGLOB */ + } + + /* BASOP_CHECK(); Do not check for overflow here, function produces the carry bit instead */ + + + return ( L_var_out ); +} + + +/*___________________________________________________________________________ + | | + | Function Name : L_sub_c | + | | + | Purpose : | + | | + | Performs 32 bits subtraction of the two 32 bits variables with carry | +#ifndef BASOP_NOGLOB + | (borrow) : L_var1-L_var2-C. No saturation. Generate carry and Overflow | +#else + | (borrow) : L_var1-L_var2-C. No saturation. Generate carry and BASOP_Overflow | +#endif + | values. The carry and overflow values are binary variables which can | + | be tested and assigned values. | + | | + | Complexity weight : 2 | + | | + | Inputs : | + | | + | L_var1 32 bit long signed integer (Word32) whose value falls in the | + | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | + | | + | L_var2 32 bit long signed integer (Word32) whose value falls in the | + | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | + | | + | Outputs : | + | | + | none | + | | + | Return Value : | + | | + | L_var_out | + | 32 bit long signed integer (Word32) whose value falls in the | + | range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | + | | + | Caution : | + | | +#ifndef BASOP_NOGLOB + | In some cases the Carry flag has to be cleared or set before using | +#else + | In some cases the BASOP_Carry flag has to be cleared or set before using | +#endif + | operators which take into account its value. | + |___________________________________________________________________________| +*/ +#ifndef BASOP_NOGLOB +Word32 L_sub_c( Word32 L_var1, Word32 L_var2 ) +#else /* BASOP_NOGLOB */ +Word32 DEPR_L_sub_c( Word32 L_var1, Word32 L_var2, Flag *Carry ) +#endif /* BASOP_NOGLOB */ +{ + Word32 L_var_out; + Word32 L_test; + Flag carry_int = 0; + +#ifndef BASOP_NOGLOB + if ( Carry ) +#else /* BASOP_NOGLOB */ + if ( *Carry ) +#endif /* BASOP_NOGLOB */ + { +#ifndef BASOP_NOGLOB + Carry = 0; +#else /* BASOP_NOGLOB */ + *Carry = 0; +#endif /* BASOP_NOGLOB */ + if ( L_var2 != MIN_32 ) + { +#ifndef BASOP_NOGLOB + L_var_out = L_add_c( L_var1, -L_var2 ); +#else /* BASOP_NOGLOB */ + L_var_out = DEPR_L_add_c( L_var1, -L_var2, Carry ); +#endif /* BASOP_NOGLOB */ + } + else + { + L_var_out = L_var1 - L_var2; + if ( L_var1 > 0L ) + { +#ifndef BASOP_NOGLOB + Overflow = 1; + Carry = 0; +#else /* BASOP_NOGLOB */ + *Carry = 0; +#endif /* BASOP_NOGLOB */ + } + } + } + else + { + L_var_out = L_var1 - L_var2 - (Word32) 0X00000001L; + L_test = L_var1 - L_var2; + + if ( ( L_test < 0 ) && ( L_var1 > 0 ) && ( L_var2 < 0 ) ) + { +#ifndef BASOP_NOGLOB + Overflow = 1; +#endif /* ! BASOP_NOGLOB */ + carry_int = 0; + } + else if ( ( L_test > 0 ) && ( L_var1 < 0 ) && ( L_var2 > 0 ) ) + { +#ifndef BASOP_NOGLOB + Overflow = 1; +#endif /* ! BASOP_NOGLOB */ + carry_int = 1; + } + else if ( ( L_test > 0 ) && ( ( L_var1 ^ L_var2 ) > 0 ) ) + { +#ifndef BASOP_NOGLOB + Overflow = 0; +#endif /* ! BASOP_NOGLOB */ + carry_int = 1; + } + if ( L_test == MIN_32 ) + { +#ifndef BASOP_NOGLOB + Overflow = 1; + Carry = carry_int; +#else /* BASOP_NOGLOB */ + *Carry = carry_int; +#endif /* BASOP_NOGLOB */ + } + else + { +#ifndef BASOP_NOGLOB + Carry = carry_int; +#else /* BASOP_NOGLOB */ + *Carry = carry_int; +#endif /* BASOP_NOGLOB */ + } + } + + /* BASOP_CHECK(); Do not check for overflow here, function produces the carry bit instead */ + + + return ( L_var_out ); +} + + +/*___________________________________________________________________________ + | | + | Function Name : L_negate | + | | + | Purpose : | + | | + | Negate the 32 bit variable L_var1 with saturation; saturate in the case | + | where input is -2147483648 (0x8000 0000). | + | | + | Complexity weight : 1 | + | | + | Inputs : | + | | + | L_var1 32 bit long signed integer (Word32) whose value falls in the | + | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | + | | + | Outputs : | + | | + | none | + | | + | Return Value : | + | | + | L_var_out | + | 32 bit long signed integer (Word32) whose value falls in the | + | range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | + |___________________________________________________________________________| +*/ +Word32 L_negate( Word32 L_var1 ) +{ + Word32 L_var_out; + + L_var_out = ( L_var1 == MIN_32 ) ? MAX_32 : -L_var1; + + BASOP_CHECK(); + + return ( L_var_out ); +} + + +/*___________________________________________________________________________ + | | + | Function Name : mult_r | + | | + | Purpose : | + | | + | Same as mult with rounding, i.e.: | + | mult_r(var1,var2) = extract_l(L_shr(((var1 * var2) + 16384),15)) and | + | mult_r(-32768,-32768) = 32767. | + | | + | Complexity weight : 1 | + | | + | Inputs : | + | | + | var1 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | + | | + | var2 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | + | | + | Outputs : | + | | + | none | + | | + | Return Value : | + | | + | var_out | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0x8000 <= var_out <= 0x7fff. | + |___________________________________________________________________________| +*/ +#ifdef BASOP_NOGLOB +Word16 mult_ro( Word16 var1, Word16 var2, Flag *Overflow ) +{ + Word16 var_out; + Word32 L_product_arr; + + L_product_arr = (Word32) var1 * (Word32) var2; /* product */ + L_product_arr += (Word32) 0x00004000L; /* round */ + L_product_arr &= (Word32) 0xffff8000L; + L_product_arr >>= 15; /* shift */ + + if ( L_product_arr & (Word32) 0x00010000L ) /* sign extend when necessary */ + { + L_product_arr |= (Word32) 0xffff0000L; + } + var_out = saturate_o( L_product_arr, Overflow ); + + + return ( var_out ); +} + +#endif /* BASOP_NOGLOB */ +Word16 mult_r( Word16 var1, Word16 var2 ) +{ + Word16 var_out; + Word32 L_product_arr; + + L_product_arr = (Word32) var1 * (Word32) var2; /* product */ + L_product_arr += (Word32) 0x00004000L; /* round */ + L_product_arr &= (Word32) 0xffff8000L; + L_product_arr >>= 15; /* shift */ + + if ( L_product_arr & (Word32) 0x00010000L ) /* sign extend when necessary */ + { + L_product_arr |= (Word32) 0xffff0000L; + } + var_out = saturate( L_product_arr ); + + + return ( var_out ); +} + + +/*___________________________________________________________________________ + | | + | Function Name : L_shl | + | | + | Purpose : | + | | + | Arithmetically shift the 32 bit input L_var1 left var2 positions. Zero | + | fill the var2 LSB of the result. If var2 is negative, arithmetically | + | shift L_var1 right by -var2 with sign extension. Saturate the result in | + | case of underflows or overflows. | + | | + | Complexity weight : 1 | + | | + | Inputs : | + | | + | L_var1 32 bit long signed integer (Word32) whose value falls in the | + | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | + | | + | var2 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | + | | + | Outputs : | + | | + | none | + | | + | Return Value : | + | | + | L_var_out | + | 32 bit long signed integer (Word32) whose value falls in the | + | range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | + |___________________________________________________________________________| +*/ +#ifndef BASOP_NOGLOB +Word32 L_shl( Word32 L_var1, Word16 var2 ) +#else /* BASOP_NOGLOB */ +Word32 L_shl_o( Word32 L_var1, Word16 var2, Flag *Overflow ) +#endif /* BASOP_NOGLOB */ +{ + + Word32 L_var_out = 0L; + + if ( var2 <= 0 ) + { + if ( var2 < -32 ) + var2 = -32; + var2 = -var2; + L_var_out = L_shr( L_var1, var2 ); + } + else + { + for ( ; var2 > 0; var2-- ) + { + if ( L_var1 > (Word32) 0X3fffffffL ) + { +#ifndef BASOP_NOGLOB + Overflow = 1; +#else /* BASOP_NOGLOB */ + *Overflow = 1; +#endif /* BASOP_NOGLOB */ + L_var_out = MAX_32; + break; + } + else + { + if ( L_var1 < (Word32) 0xc0000000L ) + { +#ifndef BASOP_NOGLOB + Overflow = 1; +#else /* BASOP_NOGLOB */ + *Overflow = 1; +#endif /* BASOP_NOGLOB */ + L_var_out = MIN_32; + break; + } + } + L_var1 *= 2; + L_var_out = L_var1; + } + } + + BASOP_CHECK(); + + + return ( L_var_out ); +} + +#ifdef BASOP_NOGLOB +Word32 L_shl( Word32 L_var1, Word16 var2 ) +{ + + Word32 L_var_out = 0L; + + if ( var2 <= 0 ) + { + if ( var2 < -32 ) + var2 = -32; + var2 = -var2; + L_var_out = L_shr( L_var1, var2 ); + } + else + { + for ( ; var2 > 0; var2-- ) + { + if ( L_var1 > (Word32) 0X3fffffffL ) + { + assert( 0 ); + L_var_out = MAX_32; + break; + } + else + { + if ( L_var1 < (Word32) 0xc0000000L ) + { + assert( 0 ); + L_var_out = MIN_32; + break; + } + } + L_var1 *= 2; + L_var_out = L_var1; + } + } + + BASOP_CHECK(); + + + return ( L_var_out ); +} +#endif /* BASOP_NOGLOB */ + +/*___________________________________________________________________________ + | | + | Function Name : L_shr | + | | + | Purpose : | + | | + | Arithmetically shift the 32 bit input L_var1 right var2 positions with | + | sign extension. If var2 is negative, arithmetically shift L_var1 left | + | by -var2 and zero fill the -var2 LSB of the result. Saturate the result | + | in case of underflows or overflows. | + | | + | Complexity weight : 1 | + | | + | Inputs : | + | | + | L_var1 32 bit long signed integer (Word32) whose value falls in the | + | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | + | | + | var2 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | + | | + | Outputs : | + | | + | none | + | | + | Return Value : | + | | + | L_var_out | + | 32 bit long signed integer (Word32) whose value falls in the | + | range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | + |___________________________________________________________________________| +*/ +#ifdef BASOP_NOGLOB +Word32 L_shr_o( Word32 L_var1, Word16 var2, Flag *Overflow ) +{ + Word32 L_var_out; + + if ( var2 < 0 ) + { + if ( var2 < -32 ) + var2 = -32; + var2 = -var2; + L_var_out = L_shl_o( L_var1, var2, Overflow ); + } + else + { + if ( var2 >= 31 ) + { + L_var_out = ( L_var1 < 0L ) ? -1 : 0; + } + else + { + if ( L_var1 < 0 ) + { + L_var_out = ~( ( ~L_var1 ) >> var2 ); + } + else + { + L_var_out = L_var1 >> var2; + } + } + } + + BASOP_CHECK(); + + + return ( L_var_out ); +} + +#endif /* BASOP_NOGLOB */ +Word32 L_shr( Word32 L_var1, Word16 var2 ) +{ + Word32 L_var_out; + + if ( var2 < 0 ) + { + if ( var2 < -32 ) + var2 = -32; + var2 = -var2; + L_var_out = L_shl( L_var1, var2 ); + } + else + { + if ( var2 >= 31 ) + { + L_var_out = ( L_var1 < 0L ) ? -1 : 0; + } + else + { + if ( L_var1 < 0 ) + { + L_var_out = ~( ( ~L_var1 ) >> var2 ); + } + else + { + L_var_out = L_var1 >> var2; + } + } + } + + BASOP_CHECK(); + + + return ( L_var_out ); +} + + +/*___________________________________________________________________________ + | | + | Function Name : shr_r | + | | + | Purpose : | + | | + | Same as shr(var1,var2) but with rounding. Saturate the result in case of| + | underflows or overflows : | + | - If var2 is greater than zero : | + | if (sub(shl(shr(var1,var2),1),shr(var1,sub(var2,1)))) | + | is equal to zero | + | then | + | shr_r(var1,var2) = shr(var1,var2) | + | else | + | shr_r(var1,var2) = add(shr(var1,var2),1) | + | - If var2 is less than or equal to zero : | + | shr_r(var1,var2) = shr(var1,var2). | + | | + | Complexity weight : 3 | + | | + | Inputs : | + | | + | var1 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | + | | + | var2 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | + | | + | Outputs : | + | | + | none | + | | + | Return Value : | + | | + | var_out | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var_out <= 0x0000 7fff. | + |___________________________________________________________________________| +*/ +Word16 shr_r( Word16 var1, Word16 var2 ) +{ + Word16 var_out; + + if ( var2 > 15 ) + { + var_out = 0; + } + else + { + var_out = shr( var1, var2 ); + + if ( var2 > 0 ) + { + if ( ( var1 & ( (Word16) 1 << ( var2 - 1 ) ) ) != 0 ) + { + var_out++; + } + } + } + + BASOP_CHECK(); + + return ( var_out ); +} + + +/*___________________________________________________________________________ + | | + | Function Name : mac_r | + | | + | Purpose : | + | | + | Multiply var1 by var2 and shift the result left by 1. Add the 32 bit | + | result to L_var3 with saturation. Round the LS 16 bits of the result | + | into the MS 16 bits with saturation and shift the result right by 16. | + | Return a 16 bit result. | + | mac_r(L_var3,var1,var2) = round_fx(L_mac(L_var3,var1,var2)) | + | | + | Complexity weight : 1 | + | | + | Inputs : | + | | + | L_var3 32 bit long signed integer (Word32) whose value falls in the | + | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | + | | + | var1 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | + | | + | var2 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | + | | + | Outputs : | + | | + | none | + | | + | Return Value : | + | | + | var_out | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0x0000 8000 <= L_var_out <= 0x0000 7fff. | + |___________________________________________________________________________| +*/ +#ifdef BASOP_NOGLOB +Word16 mac_ro( Word32 L_var3, Word16 var1, Word16 var2, Flag *Overflow ) +{ + Word16 var_out; + + L_var3 = L_mac_o( L_var3, var1, var2, Overflow ); + L_var3 = L_add_o( L_var3, (Word32) 0x00008000L, Overflow ); + var_out = extract_h( L_var3 ); + + BASOP_CHECK(); + + + return ( var_out ); +} + +#endif /* BASOP_NOGLOB */ +Word16 mac_r( Word32 L_var3, Word16 var1, Word16 var2 ) +{ + Word16 var_out; + + L_var3 = L_mac( L_var3, var1, var2 ); + L_var3 = L_add( L_var3, (Word32) 0x00008000L ); + var_out = extract_h( L_var3 ); + + BASOP_CHECK(); + + + return ( var_out ); +} + + +/*___________________________________________________________________________ + | | + | Function Name : msu_r | + | | + | Purpose : | + | | + | Multiply var1 by var2 and shift the result left by 1. Subtract the 32 | + | bit result from L_var3 with saturation. Round the LS 16 bits of the res-| + | ult into the MS 16 bits with saturation and shift the result right by | + | 16. Return a 16 bit result. | + | msu_r(L_var3,var1,var2) = round_fx(L_msu(L_var3,var1,var2)) | + | | + | Complexity weight : 1 | + | | + | Inputs : | + | | + | L_var3 32 bit long signed integer (Word32) whose value falls in the | + | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | + | | + | var1 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | + | | + | var2 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | + | | + | Outputs : | + | | + | none | + | | + | Return Value : | + | | + | var_out | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0x0000 8000 <= L_var_out <= 0x0000 7fff. | + |___________________________________________________________________________| +*/ +#ifdef BASOP_NOGLOB +Word16 msu_ro( Word32 L_var3, Word16 var1, Word16 var2, Flag *Overflow ) +{ + Word16 var_out; + + L_var3 = L_msu_o( L_var3, var1, var2, Overflow ); + L_var3 = L_add_o( L_var3, (Word32) 0x00008000L, Overflow ); + var_out = extract_h( L_var3 ); + + BASOP_CHECK(); + + return ( var_out ); +} + +#endif /* BASOP_NOGLOB */ +Word16 msu_r( Word32 L_var3, Word16 var1, Word16 var2 ) +{ + Word16 var_out; + + L_var3 = L_msu( L_var3, var1, var2 ); + L_var3 = L_add( L_var3, (Word32) 0x00008000L ); + var_out = extract_h( L_var3 ); + + BASOP_CHECK(); + + return ( var_out ); +} + + +/*___________________________________________________________________________ + | | + | Function Name : L_deposit_h | + | | + | Purpose : | + | | + | Deposit the 16 bit var1 into the 16 MS bits of the 32 bit output. The | + | 16 LS bits of the output are zeroed. | + | | + | Complexity weight : 1 | + | | + | Inputs : | + | | + | var1 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | + | | + | Outputs : | + | | + | none | + | | + | Return Value : | + | | + | L_var_out | + | 32 bit long signed integer (Word32) whose value falls in the | + | range : 0x8000 0000 <= var_out <= 0x7fff 0000. | + |___________________________________________________________________________| +*/ +Word32 L_deposit_h( Word16 var1 ) +{ + Word32 L_var_out; + + L_var_out = (Word32) var1 << 16; + + BASOP_CHECK(); + + + return ( L_var_out ); +} + + +/*___________________________________________________________________________ + | | + | Function Name : L_deposit_l | + | | + | Purpose : | + | | + | Deposit the 16 bit var1 into the 16 LS bits of the 32 bit output. The | + | 16 MS bits of the output are sign extended. | + | | + | Complexity weight : 1 | + | | + | Inputs : | + | | + | var1 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | + | | + | Outputs : | + | | + | none | + | | + | Return Value : | + | | + | L_var_out | + | 32 bit long signed integer (Word32) whose value falls in the | + | range : 0xFFFF 8000 <= var_out <= 0x0000 7fff. | + |___________________________________________________________________________| +*/ +Word32 L_deposit_l( Word16 var1 ) +{ + Word32 L_var_out; + + L_var_out = (Word32) var1; + + BASOP_CHECK(); + + + return ( L_var_out ); +} + + +/*___________________________________________________________________________ + | | + | Function Name : L_shr_r | + | | + | Purpose : | + | | + | Same as L_shr(L_var1,var2) but with rounding. Saturate the result in | + | case of underflows or overflows : | + | - If var2 is greater than zero : | + | if (L_sub(L_shl(L_shr(L_var1,var2),1),L_shr(L_var1,sub(var2,1))))| + | is equal to zero | + | then | + | L_shr_r(L_var1,var2) = L_shr(L_var1,var2) | + | else | + | L_shr_r(L_var1,var2) = L_add(L_shr(L_var1,var2),1) | + | - If var2 is less than or equal to zero : | + | L_shr_r(L_var1,var2) = L_shr(L_var1,var2). | + | | + | Complexity weight : 3 | + | | + | Inputs : | + | | + | L_var1 | + | 32 bit long signed integer (Word32) whose value falls in the | + | range : 0x8000 0000 <= var1 <= 0x7fff ffff. | + | | + | var2 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | + | | + | Outputs : | + | | + | none | + | | + | Return Value : | + | | + | L_var_out | + | 32 bit long signed integer (Word32) whose value falls in the | + | range : 0x8000 0000 <= var_out <= 0x7fff ffff. | + |___________________________________________________________________________| +*/ +Word32 L_shr_r( Word32 L_var1, Word16 var2 ) +{ + Word32 L_var_out; + + if ( var2 > 31 ) + { + L_var_out = 0; + } + else + { + L_var_out = L_shr( L_var1, var2 ); + + if ( var2 > 0 ) + { + if ( ( L_var1 & ( (Word32) 1 << ( var2 - 1 ) ) ) != 0 ) + { + L_var_out++; + } + } + } + + BASOP_CHECK(); + + + return ( L_var_out ); +} + + +/*___________________________________________________________________________ + | | + | Function Name : L_abs | + | | + | Purpose : | + | | + | Absolute value of L_var1; Saturate in case where the input is | + | -214783648 | + | | + | Complexity weight : 1 | + | | + | Inputs : | + | | + | L_var1 | + | 32 bit long signed integer (Word32) whose value falls in the | + | range : 0x8000 0000 <= var1 <= 0x7fff ffff. | + | | + | Outputs : | + | | + | none | + | | + | Return Value : | + | | + | L_var_out | + | 32 bit long signed integer (Word32) whose value falls in the | + | range : 0x0000 0000 <= var_out <= 0x7fff ffff. | + |___________________________________________________________________________| +*/ +Word32 L_abs( Word32 L_var1 ) +{ + Word32 L_var_out; + + if ( L_var1 == MIN_32 ) + { + L_var_out = MAX_32; + } + else + { + if ( L_var1 < 0 ) + { + L_var_out = -L_var1; + } + else + { + L_var_out = L_var1; + } + } + + BASOP_CHECK(); + + + return ( L_var_out ); +} + + +/*___________________________________________________________________________ + | | + | Function Name : L_sat | + | | + | Purpose : | + | | + | 32 bit L_var1 is set to 2147483647 if an overflow occured or to | + | -2147483648 if an underflow occured on the most recent L_add_c, | + | L_sub_c, L_macNs or L_msuNs operations. The carry and overflow values | + | are binary values which can be tested and assigned values. | + | | + | Complexity weight : 4 | + | | + | Inputs : | + | | + | L_var1 | + | 32 bit long signed integer (Word32) whose value falls in the | + | range : 0x8000 0000 <= var1 <= 0x7fff ffff. | + | | + | Outputs : | + | | + | none | + | | + | Return Value : | + | | + | L_var_out | + | 32 bit long signed integer (Word32) whose value falls in the | + | range : 0x8000 0000 <= var_out <= 0x7fff ffff. | + |___________________________________________________________________________| +*/ +#ifndef BASOP_NOGLOB +Word32 L_sat( Word32 L_var1 ) +#else /* BASOP_NOGLOB */ +Word32 DEPR_L_sat_co( Word32 L_var1, Flag Overflow, Flag Carry ) +#endif /* BASOP_NOGLOB */ +{ + Word32 L_var_out; + + L_var_out = L_var1; + + if ( Overflow ) + { + + if ( Carry ) + { + L_var_out = MIN_32; + } + else + { + L_var_out = MAX_32; + } +#ifndef BASOP_NOGLOB + + Carry = 0; + Overflow = 0; +#endif /* ! BASOP_NOGLOB */ + } + + BASOP_CHECK(); + + + return ( L_var_out ); +} + + +/*___________________________________________________________________________ + | | + | Function Name : norm_s | + | | + | Purpose : | + | | + | Produces the number of left shift needed to normalize the 16 bit varia- | + | ble var1 for positive values on the interval with minimum of 16384 and | + | maximum of 32767, and for negative values on the interval with minimum | + | of -32768 and maximum of -16384; in order to normalize the result, the | + | following operation must be done : | + | norm_var1 = shl(var1,norm_s(var1)). | + | | + | Complexity weight : 1 | + | | + | Inputs : | + | | + | var1 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | + | | + | Outputs : | + | | + | none | + | | + | Return Value : | + | | + | var_out | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0x0000 0000 <= var_out <= 0x0000 000f. | + |___________________________________________________________________________| +*/ +Word16 norm_s( Word16 var1 ) +{ + Word16 var_out; + + if ( var1 == 0 ) + { + var_out = 0; + } + else + { + if ( var1 == (Word16) 0xffff ) + { + var_out = 15; + } + else + { + if ( var1 < 0 ) + { + var1 = ~var1; + } + for ( var_out = 0; var1 < 0x4000; var_out++ ) + { + var1 <<= 1; + } + } + } + + BASOP_CHECK(); + + + return ( var_out ); +} + + +/*___________________________________________________________________________ + | | + | Function Name : div_s | + | | + | Purpose : | + | | + | Produces a result which is the fractional integer division of var1 by | + | var2; var1 and var2 must be positive and var2 must be greater or equal | + | to var1; the result is positive (leading bit equal to 0) and truncated | + | to 16 bits. | + | If var1 = var2 then div(var1,var2) = 32767. | + | | + | Complexity weight : 18 | + | | + | Inputs : | + | | + | var1 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0x0000 0000 <= var1 <= var2 and var2 != 0. | + | | + | var2 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : var1 <= var2 <= 0x0000 7fff and var2 != 0. | + | | + | Outputs : | + | | + | none | + | | + | Return Value : | + | | + | var_out | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0x0000 0000 <= var_out <= 0x0000 7fff. | + | It's a Q15 value (point between b15 and b14). | + |___________________________________________________________________________| +*/ +Word16 div_s( Word16 var1, Word16 var2 ) +{ + Word16 var_out = 0; + Word16 iteration; + Word32 L_num; + Word32 L_denom; + + if ( ( var1 > var2 ) || ( var1 < 0 ) || ( var2 < 0 ) ) + { + /* printf ("Division Error var1=%d var2=%d in ", var1, var2); printStack(); */ + char text[60]; + sprintf( text, "Division Error var1=%d var2=%d in ", var1, var2 ); + abort(); /* exit (0); */ + } + if ( var2 == 0 ) + { + /* printf ("Division by 0, Fatal error in "); printStack(); */ + abort(); /* exit (0); */ + } + if ( var1 == 0 ) + { + var_out = 0; + } + else + { + if ( var1 == var2 ) + { + var_out = MAX_16; + } + else + { + L_num = L_deposit_l( var1 ); + L_denom = L_deposit_l( var2 ); + + for ( iteration = 0; iteration < 15; iteration++ ) + { + var_out <<= 1; + L_num <<= 1; + + if ( L_num >= L_denom ) + { + L_num = L_sub( L_num, L_denom ); + var_out = add( var_out, 1 ); + } + } + } + } + + BASOP_CHECK(); + + + return ( var_out ); +} + + +/*___________________________________________________________________________ + | | + | Function Name : norm_l | + | | + | Purpose : | + | | + | Produces the number of left shifts needed to normalize the 32 bit varia-| + | ble L_var1 for positive values on the interval with minimum of | + | 1073741824 and maximum of 2147483647, and for negative values on the in-| + | terval with minimum of -2147483648 and maximum of -1073741824; in order | + | to normalize the result, the following operation must be done : | + | norm_L_var1 = L_shl(L_var1,norm_l(L_var1)). | + | | + | Complexity weight : 1 | + | | + | Inputs : | + | | + | L_var1 | + | 32 bit long signed integer (Word32) whose value falls in the | + | range : 0x8000 0000 <= var1 <= 0x7fff ffff. | + | | + | Outputs : | + | | + | none | + | | + | Return Value : | + | | + | var_out | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0x0000 0000 <= var_out <= 0x0000 001f. | + |___________________________________________________________________________| +*/ +Word16 norm_l( Word32 L_var1 ) +{ + Word16 var_out; + + if ( L_var1 == 0 ) + { + var_out = 0; + } + else + { + if ( L_var1 == (Word32) 0xffffffffL ) + { + var_out = 31; + } + else + { + if ( L_var1 < 0 ) + { + L_var1 = ~L_var1; + } + for ( var_out = 0; L_var1 < (Word32) 0x40000000L; var_out++ ) + { + L_var1 <<= 1; + } + } + } + + BASOP_CHECK(); + + + return ( var_out ); +} + +/* + ****************************************************************************** + * Additional operators extracted from the G.723.1 Library + * Adapted for WMOPS calculations + ****************************************************************************** + */ + +/*___________________________________________________________________________ + | | + | Function Name : L_mls | + | | + | Purpose : | + | | + | Multiplies a 16 bit word v by a 32 bit word Lv and returns a 32 bit | + | word (multiplying 16 by 32 bit words gives 48 bit word; the function | + | extracts the 32 MSB and shift the result to the left by 1). | + | | + | A 32 bit word can be written as | + | Lv = a + b * 2^16 | + | where a= unsigned 16 LSBs and b= signed 16 MSBs. | + | The function returns v * Lv / 2^15 which is equivalent to | + | a*v / 2^15 + b*v*2 | + | | + | Complexity weight : 5 | + | | + | Inputs : | + | | + | Lv | + | 32 bit long signed integer (Word32) whose value falls in the | + | range : 0x8000 0000 <= var1 <= 0x7fff ffff. | + | v | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0x8000 <= var1 <= 0x7fff. | + | | + | Outputs : | + | | + | none | + | | + | Return Value : | + | | + | var_out | + | 32 bit long signed integer (Word32) whose value falls in the | + | range : 0x8000 0000 <= var_out <= 0x7fff ffff. | + | | + |___________________________________________________________________________| +*/ +#ifdef BASOP_NOGLOB +Word32 L_mls_o( Word32 Lv, Word16 v, Flag *Overflow ) +{ + Word32 Temp; + + Temp = Lv & (Word32) 0x0000ffff; + Temp = Temp * (Word32) v; + Temp = L_shr( Temp, (Word16) 15 ); + Temp = L_mac_o( Temp, v, extract_h( Lv ), Overflow ); + + BASOP_CHECK(); + + return Temp; +} + +#endif /* BASOP_NOGLOB */ +Word32 L_mls( Word32 Lv, Word16 v ) +{ + Word32 Temp; + + Temp = Lv & (Word32) 0x0000ffff; + Temp = Temp * (Word32) v; + Temp = L_shr( Temp, (Word16) 15 ); + Temp = L_mac( Temp, v, extract_h( Lv ) ); + + BASOP_CHECK(); + + return Temp; +} + + +/*__________________________________________________________________________ +| | +| Function Name : div_l | +| | +| Purpose : | +| | +| Produces a result which is the fractional integer division of L_var1 by | +| var2; L_var1 and var2 must be positive and var2 << 16 must be greater or| +| equal to L_var1; the result is positive (leading bit equal to 0) and | +| truncated to 16 bits. | +| If L_var1 == var2 << 16 then div_l(L_var1,var2) = 32767. | +| | +| Complexity weight : 32 | +| | +| Inputs : | +| | +| L_var1 | +| 32 bit long signed integer (Word32) whose value falls in the | +| range : 0x0000 0000 <= var1 <= (var2 << 16) and var2 != 0. | +| L_var1 must be considered as a Q.31 value | +| | +| var2 | +| 16 bit short signed integer (Word16) whose value falls in the | +| range : var1 <= (var2<< 16) <= 0x7fff0000 and var2 != 0. | +| var2 must be considered as a Q.15 value | +| | +| Outputs : | +| | +| none | +| | +| Return Value : | +| | +| var_out | +| 16 bit short signed integer (Word16) whose value falls in the | +| range : 0x0000 0000 <= var_out <= 0x0000 7fff. | +| It's a Q15 value (point between b15 and b14). | +|___________________________________________________________________________| +*/ +Word16 div_l( Word32 L_num, Word16 den ) +{ + Word16 var_out = (Word16) 0; + Word32 L_den; + Word16 iteration; + + + if ( den == (Word16) 0 ) + { + /* printf("Division by 0 in div_l, Fatal error in "); printStack(); */ + exit( -1 ); + } + + if ( ( L_num < (Word32) 0 ) || ( den < (Word16) 0 ) ) + { + /* printf("Division Error in div_l, Fatal error in "); printStack(); */ + exit( -1 ); + } + + L_den = L_deposit_h( den ); + + if ( L_num >= L_den ) + { + + + BASOP_CHECK(); + return MAX_16; + } + else + { + L_num = L_shr( L_num, (Word16) 1 ); + L_den = L_shr( L_den, (Word16) 1 ); + for ( iteration = (Word16) 0; iteration < (Word16) 15; iteration++ ) + { + var_out = shl( var_out, (Word16) 1 ); + L_num = L_shl( L_num, (Word16) 1 ); + if ( L_num >= L_den ) + { + L_num = L_sub( L_num, L_den ); + var_out = add( var_out, (Word16) 1 ); + } + } + + + BASOP_CHECK(); + + return var_out; + } +} + + +/*__________________________________________________________________________ +| | +| Function Name : i_mult | +| | +| Purpose : | +| | +| Integer 16-bit multiplication with overflow control. | +| No overflow protection is performed if ORIGINAL_G7231 is defined. | +| | +| Complexity weight : 3 (it is performing something equivalent to | +| extract_h( L_shl( L_mult0( v1, v2), 16)) | +| | +| Inputs : | +| | +| a | +| 16 bit short signed integer (Word16). | +| | +| b | +| 16 bit short signed integer (Word16). | +| | +| Outputs : | +| | +| none | +| | +| Return Value : | +| | +| 16 bit short signed integer (Word16). No overflow checks | +| are performed if ORIGINAL_G7231 is defined. | +|___________________________________________________________________________| +*/ +#ifndef BASOP_NOGLOB +Word16 i_mult( Word16 a, Word16 b ) +#else /* BASOP_NOGLOB */ +Word16 DEPR_i_mult( Word16 a, Word16 b ) +#endif /* BASOP_NOGLOB */ +{ +#ifdef ORIGINAL_G7231 + return a * b; +#else + Word32 /*register*/ c = a * b; + return saturate( c ); +#endif +} + + +/* + ****************************************************************************** + * The following three operators are not part of the original + * G.729/G.723.1 set of basic operators and implement shiftless + * accumulation operation. + ****************************************************************************** + */ + +/*___________________________________________________________________________ + | + | Function Name : L_mult0 + | + | Purpose : + | + | L_mult0 is the 32 bit result of the multiplication of var1 times var2 + | without one left shift. + | + | Complexity weight : 1 + | + | Inputs : + | + | var1 16 bit short signed integer (Word16) whose value falls in the + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. + | + | var2 16 bit short signed integer (Word16) whose value falls in the + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. + | + | Return Value : + | + | L_var_out + | 32 bit long signed integer (Word32) whose value falls in the + | range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. + |___________________________________________________________________________ +*/ +Word32 L_mult0( Word16 var1, Word16 var2 ) +{ + Word32 L_var_out; + + L_var_out = (Word32) var1 * (Word32) var2; + + BASOP_CHECK(); + + + return ( L_var_out ); +} + + +/*___________________________________________________________________________ + | + | Function Name : L_mac0 + | + | Purpose : + | + | Multiply var1 by var2 (without left shift) and add the 32 bit result to + | L_var3 with saturation, return a 32 bit result: + | L_mac0(L_var3,var1,var2) = L_add(L_var3,(L_mult0(var1,var2)). + | + | Complexity weight : 1 + | + | Inputs : + | + | L_var3 32 bit long signed integer (Word32) whose value falls in the + | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. + | + | var1 16 bit short signed integer (Word16) whose value falls in the + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. + | + | var2 16 bit short signed integer (Word16) whose value falls in the + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. + | + | Return Value : + | + | L_var_out + | 32 bit long signed integer (Word32) whose value falls in the + | range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. + |___________________________________________________________________________ +*/ +#ifdef BASOP_NOGLOB +Word32 L_mac0_o( Word32 L_var3, Word16 var1, Word16 var2, Flag *Overflow ) +{ + Word32 L_var_out; + Word32 L_product; + + L_product = L_mult0( var1, var2 ); + L_var_out = L_add_o( L_var3, L_product, Overflow ); + + BASOP_CHECK(); + + + return ( L_var_out ); +} + +#endif /* BASOP_NOGLOB */ +Word32 L_mac0( Word32 L_var3, Word16 var1, Word16 var2 ) +{ + Word32 L_var_out; + Word32 L_product; + + L_product = L_mult0( var1, var2 ); + L_var_out = L_add( L_var3, L_product ); + + BASOP_CHECK(); + + + return ( L_var_out ); +} + + +/*___________________________________________________________________________ + | + | Function Name : L_msu0 + | + | Purpose : + | + | Multiply var1 by var2 (without left shift) and subtract the 32 bit + | result to L_var3 with saturation, return a 32 bit result: + | L_msu0(L_var3,var1,var2) = L_sub(L_var3,(L_mult0(var1,var2)). + | + | Complexity weight : 1 + | + | Inputs : + | + | L_var3 32 bit long signed integer (Word32) whose value falls in the + | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. + | + | var1 16 bit short signed integer (Word16) whose value falls in the + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. + | + | var2 16 bit short signed integer (Word16) whose value falls in the + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. + | + | Return Value : + | + | L_var_out + | 32 bit long signed integer (Word32) whose value falls in the + | range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. + |___________________________________________________________________________ +*/ +#ifdef BASOP_NOGLOB +Word32 L_msu0_o( Word32 L_var3, Word16 var1, Word16 var2, Flag *Overflow ) +{ + Word32 L_var_out; + Word32 L_product; + + L_product = L_mult0( var1, var2 ); + L_var_out = L_sub_o( L_var3, L_product, Overflow ); + + BASOP_CHECK(); + + + return ( L_var_out ); +} + +#endif /* BASOP_NOGLOB */ +Word32 L_msu0( Word32 L_var3, Word16 var1, Word16 var2 ) +{ + Word32 L_var_out; + Word32 L_product; + + L_product = L_mult0( var1, var2 ); + L_var_out = L_sub( L_var3, L_product ); + + BASOP_CHECK(); + + + return ( L_var_out ); +} + +#undef WMC_TOOL_SKIP diff --git a/lib_com/basop32.h b/lib_com/basop32.h new file mode 100644 index 0000000000000000000000000000000000000000..f1a7e1b8646ffb8d13fa33090acc23f218575732 --- /dev/null +++ b/lib_com/basop32.h @@ -0,0 +1,276 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/* + =========================================================================== + File: BASOP32.H v.2.3 - 30.Nov.2009 + =========================================================================== + + ITU-T STL BASIC OPERATORS + + GLOBAL FUNCTION PROTOTYPES + + History: + 26.Jan.00 v1.0 Incorporated to the STL from updated G.723.1/G.729 + basic operator library (based on basic_op.h) and + G.723.1's basop.h. + 05.Jul.00 v1.1 Added 32-bit shiftless mult/mac/msub operators + + 03 Nov 04 v2.0 Incorporation of new 32-bit / 40-bit / control + operators for the ITU-T Standard Tool Library as + described in Geneva, 20-30 January 2004 WP 3/16 Q10/16 + TD 11 document and subsequent discussions on the + wp3audio@yahoogroups.com email reflector. + norm_s() weight reduced from 15 to 1. + norm_l() weight reduced from 30 to 1. + L_abs() weight reduced from 2 to 1. + L_add() weight reduced from 2 to 1. + L_negate() weight reduced from 2 to 1. + L_shl() weight reduced from 2 to 1. + L_shr() weight reduced from 2 to 1. + L_sub() weight reduced from 2 to 1. + mac_r() weight reduced from 2 to 1. + msu_r() weight reduced from 2 to 1. + mult_r() weight reduced from 2 to 1. + L_deposit_h() weight reduced from 2 to 1. + L_deposit_l() weight reduced from 2 to 1. + L_mls() weight of 5. + div_l() weight of 32. + i_mult() weight of 3. + + 30 Nov 09 v2.3 round() function is now round_fx(). + saturate() is not referencable from outside application + + 13 Mar 12 Add Overflow2 flag for additional overflow checking. + ============================================================================ +*/ + + +#ifndef _BASIC_OP_H +#define _BASIC_OP_H + +#include "typedef.h" +#define BASOP_OVERFLOW2 + +/*___________________________________________________________________________ + | | + | Constants and Globals | + |___________________________________________________________________________| +*/ +#ifndef BASOP_NOGLOB +extern Flag Overflow, Overflow2; +extern Flag Carry; + +#else /* BASOP_NOGLOB */ +/* DISABLED TO AVOID GLOBAL VARIABLES */ +/* +extern Flag BASOP_Overflow, BASOP_Overflow2; +extern Flag BASOP_Carry; +*/ +#endif /* BASOP_NOGLOB */ +#define BASOP_SATURATE_WARNING_ON +#define BASOP_SATURATE_WARNING_OFF +#define BASOP_SATURATE_ERROR_ON +#define BASOP_SATURATE_ERROR_OFF +#define BASOP_CHECK() + + +#define MAX_32 (Word32) 0x7fffffffL +#define MIN_32 (Word32) 0x80000000L + +#define MAX_16 (Word16) 0x7fff +#define MIN_16 (Word16) 0x8000 + +/*___________________________________________________________________________ + | | + | Prototypes for basic arithmetic operators | + |___________________________________________________________________________| +*/ + +#ifndef BASOP_NOGLOB +Word16 add( Word16 var1, Word16 var2 ); /* Short add, 1 */ +Word16 sub( Word16 var1, Word16 var2 ); /* Short sub, 1 */ +Word16 abs_s( Word16 var1 ); /* Short abs, 1 */ +Word16 shl( Word16 var1, Word16 var2 ); /* Short shift left, 1 */ +Word16 shr( Word16 var1, Word16 var2 ); /* Short shift right, 1 */ +Word16 mult( Word16 var1, Word16 var2 ); /* Short mult, 1 */ +Word32 L_mult( Word16 var1, Word16 var2 ); /* Long mult, 1 */ +Word16 negate( Word16 var1 ); /* Short negate, 1 */ +Word16 extract_h( Word32 L_var1 ); /* Extract high, 1 */ +Word16 extract_l( Word32 L_var1 ); /* Extract low, 1 */ +Word16 round_fx( Word32 L_var1 ); /* Round, 1 */ +Word32 L_mac( Word32 L_var3, Word16 var1, Word16 var2 ); /* Mac, 1 */ +Word32 L_msu( Word32 L_var3, Word16 var1, Word16 var2 ); /* Msu, 1 */ +Word32 L_macNs( Word32 L_var3, Word16 var1, Word16 var2 ); /* Mac without + sat, 1 */ +#else /* BASOP_NOGLOB */ +Word16 add( Word16 var1, Word16 var2 ); /* Short add, 1 */ +Word16 sub( Word16 var1, Word16 var2 ); /* Short sub, 1 */ +Word16 abs_s( Word16 var1 ); /* Short abs, 1 */ +Word16 shl( Word16 var1, Word16 var2 ); /* Short shift left, 1 */ +Word16 shr( Word16 var1, Word16 var2 ); /* Short shift right, 1 */ +Word16 mult( Word16 var1, Word16 var2 ); /* Short mult, 1 */ +Word32 L_mult( Word16 var1, Word16 var2 ); /* Long mult, 1 */ +Word16 negate( Word16 var1 ); /* Short negate, 1 */ +Word16 extract_h( Word32 L_var1 ); /* Extract high, 1 */ +Word16 extract_l( Word32 L_var1 ); /* Extract low, 1 */ +Word16 round_fx( Word32 L_var1 ); /* Round, 1 */ +Word32 L_mac( Word32 L_var3, Word16 var1, Word16 var2 ); /* Mac, 1 */ +Word32 L_msu( Word32 L_var3, Word16 var1, Word16 var2 ); /* Msu, 1 */ +Word32 DEPR_L_macNs( Word32 L_var3, Word16 var1, Word16 var2, Flag *Carry ); /* Mac without + sat, 1 */ +#endif /* BASOP_NOGLOB */ + +#ifndef BASOP_NOGLOB +Word32 L_msuNs( Word32 L_var3, Word16 var1, Word16 var2 ); /* Msu without + sat, 1 */ +#else /* BASOP_NOGLOB */ +Word32 DEPR_L_msuNs( Word32 L_var3, Word16 var1, Word16 var2, Flag *Carry ); /* Msu without + sat, 1 */ +#endif /* BASOP_NOGLOB */ +#ifndef BASOP_NOGLOB +Word32 L_add( Word32 L_var1, Word32 L_var2 ); /* Long add, 1 */ +Word32 L_sub( Word32 L_var1, Word32 L_var2 ); /* Long sub, 1 */ +Word32 L_add_c( Word32 L_var1, Word32 L_var2 ); /* Long add with c, 2 */ +Word32 L_sub_c( Word32 L_var1, Word32 L_var2 ); /* Long sub with c, 2 */ +Word32 L_negate( Word32 L_var1 ); /* Long negate, 1 */ +Word16 mult_r( Word16 var1, Word16 var2 ); /* Mult with round, 1 */ +Word32 L_shl( Word32 L_var1, Word16 var2 ); /* Long shift left, 1 */ +Word32 L_shr( Word32 L_var1, Word16 var2 ); /* Long shift right, 1 */ +Word16 shr_r( Word16 var1, Word16 var2 ); /* Shift right with + round, 2 */ +#else /* BASOP_NOGLOB */ +Word32 L_add( Word32 L_var1, Word32 L_var2 ); /* Long add, 1 */ +Word32 L_sub( Word32 L_var1, Word32 L_var2 ); /* Long sub, 1 */ +Word32 DEPR_L_add_c( Word32 L_var1, Word32 L_var2, Flag *Carry ); /* Long add with c, 2 */ +Word32 DEPR_L_sub_c( Word32 L_var1, Word32 L_var2, Flag *Carry ); /* Long sub with c, 2 */ +Word32 L_negate( Word32 L_var1 ); /* Long negate, 1 */ +Word16 mult_r( Word16 var1, Word16 var2 ); /* Mult with round, 1 */ +Word32 L_shl( Word32 L_var1, Word16 var2 ); /* Long shift left, 1 */ +Word32 L_shr( Word32 L_var1, Word16 var2 ); /* Long shift right, 1 */ +Word16 shr_r( Word16 var1, Word16 var2 ); /* Shift right with + round, 2 */ +#endif /* BASOP_NOGLOB */ + +#ifndef BASOP_NOGLOB +Word16 mac_r( Word32 L_var3, Word16 var1, Word16 var2 ); /* Mac with + rounding, 1 */ +#else /* BASOP_NOGLOB */ +Word16 mac_r( Word32 L_var3, Word16 var1, Word16 var2 ); /* Mac with + rounding, 1 */ +#endif /* BASOP_NOGLOB */ +#ifndef BASOP_NOGLOB +Word16 msu_r( Word32 L_var3, Word16 var1, Word16 var2 ); /* Msu with + rounding, 1 */ +#else /* BASOP_NOGLOB */ +Word16 msu_r( Word32 L_var3, Word16 var1, Word16 var2 ); /* Msu with + rounding, 1 */ +#endif /* BASOP_NOGLOB */ +#ifndef BASOP_NOGLOB +Word32 L_deposit_h( Word16 var1 ); /* 16 bit var1 -> MSB, 1 */ +Word32 L_deposit_l( Word16 var1 ); /* 16 bit var1 -> LSB, 1 */ +#else /* BASOP_NOGLOB */ +Word32 L_deposit_h( Word16 var1 ); /* 16 bit var1 -> MSB, 1 */ +Word32 L_deposit_l( Word16 var1 ); /* 16 bit var1 -> LSB, 1 */ +#endif /* BASOP_NOGLOB */ + +#ifndef BASOP_NOGLOB +Word32 L_shr_r( Word32 L_var1, Word16 var2 ); /* Long shift right with + round, 3 */ +#else /* BASOP_NOGLOB */ +Word32 L_shr_r( Word32 L_var1, Word16 var2 ); /* Long shift right with + round, 3 */ +#endif /* BASOP_NOGLOB */ +#ifndef BASOP_NOGLOB +Word32 L_abs( Word32 L_var1 ); /* Long abs, 1 */ +Word32 L_sat( Word32 L_var1 ); /* Long saturation, 4 */ +Word16 norm_s( Word16 var1 ); /* Short norm, 1 */ +Word16 div_s( Word16 var1, Word16 var2 ); /* Short division, 18 */ +Word16 norm_l( Word32 L_var1 ); /* Long norm, 1 */ +#else /* BASOP_NOGLOB */ +Word32 L_abs( Word32 L_var1 ); /* Long abs, 1 */ +Word32 DEPR_L_sat_co( Word32 L_var1, Flag Overflow, Flag Carry ); /* Long saturation, 4 */ +Word16 norm_s( Word16 var1 ); /* Short norm, 1 */ +Word16 div_s( Word16 var1, Word16 var2 ); /* Short division, 18 */ +Word16 norm_l( Word32 L_var1 ); /* Long norm, 1 */ +#endif /* BASOP_NOGLOB */ + + +/* + * Additional G.723.1 operators + */ +#ifndef BASOP_NOGLOB +Word32 L_mls( Word32, Word16 ); /* Weight FFS; currently assigned 5 */ +Word16 div_l( Word32, Word16 ); /* Weight FFS; currently assigned 32 */ +Word16 i_mult( Word16 a, Word16 b ); /* Weight FFS; currently assigned 3 */ +#else /* BASOP_NOGLOB */ +Word32 L_mls( Word32, Word16 ); /* Weight FFS; currently assigned 5 */ +Word16 div_l( Word32, Word16 ); /* Weight FFS; currently assigned 32 */ +Word16 DEPR_i_mult( Word16 a, Word16 b ); /* Weight FFS; currently assigned 3 */ +#endif /* BASOP_NOGLOB */ + +/* + * New shiftless operators, not used in G.729/G.723.1 + */ +Word32 L_mult0( Word16 v1, Word16 v2 ); /* 32-bit Multiply w/o shift 1 */ +Word32 L_mac0( Word32 L_v3, Word16 v1, Word16 v2 ); /* 32-bit Mac w/o shift 1 */ +Word32 L_msu0( Word32 L_v3, Word16 v1, Word16 v2 ); /* 32-bit Msu w/o shift 1 */ +#ifdef BASOP_NOGLOB + +/* + * Overflowing operators + */ +Word16 add_o( Word16 var1, Word16 var2, Flag *Overflow ); +Word16 sub_o( Word16 var1, Word16 var2, Flag *Overflow ); +Word16 shl_o( Word16 var1, Word16 var2, Flag *Overflow ); +Word16 mult_o( Word16 var1, Word16 var2, Flag *Overflow ); +Word32 L_mult_o( Word16 var1, Word16 var2, Flag *Overflow ); +Word16 round_fx_o( Word32 L_var1, Flag *Overflow ); +Word32 L_mac_o( Word32 L_var3, Word16 var1, Word16 var2, Flag *Overflow ); +Word32 L_msu_o( Word32 L_var3, Word16 var1, Word16 var2, Flag *Overflow ); +Word32 L_add_o( Word32 L_var1, Word32 L_var2, Flag *Overflow ); +Word32 L_sub_o( Word32 L_var1, Word32 L_var2, Flag *Overflow ); +Word32 L_shr_o( Word32 L_var1, Word16 var2, Flag *Overflow ); +Word32 L_shl_o( Word32 L_var1, Word16 var2, Flag *Overflow ); +Word32 L_mls_o( Word32 Lv, Word16 v, Flag *Overflow ); +Word32 L_mac0_o( Word32 L_var3, Word16 var1, Word16 var2, Flag *Overflow ); +Word32 L_msu0_o( Word32 L_var3, Word16 var1, Word16 var2, Flag *Overflow ); +Word16 mult_ro( Word16 var1, Word16 var2, Flag *Overflow ); +Word16 mac_ro( Word32 L_var3, Word16 var1, Word16 var2, Flag *Overflow ); +Word16 msu_ro( Word32 L_var3, Word16 var1, Word16 var2, Flag *Overflow ); +#endif /* BASOP_NOGLOB */ + + +#endif /* ifndef _BASIC_OP_H */ + + +/* end of file */ diff --git a/lib_com/basop_com_lpc.c b/lib_com/basop_com_lpc.c new file mode 100644 index 0000000000000000000000000000000000000000..442afe554c1e02eeaa23c7b5e5370018c806ce8f --- /dev/null +++ b/lib_com/basop_com_lpc.c @@ -0,0 +1,263 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include "options.h" +#include "typedef.h" +#include "basop_proto_func.h" +#include "cnst.h" +#include "basop_util.h" +#include "stl.h" + +#define WMC_TOOL_SKIP + +#define UNROLL_CHEBYSHEV_INNER_LOOP +#define NC_MAX 8 +#define GUESS_TBL_SZ 256 + +#define Madd_32_16( accu, x, y ) L_add( accu, Mpy_32_16( x, y ) ) +#define Msub_32_16( accu, x, y ) L_sub( accu, Mpy_32_16( x, y ) ) + + +/* + * weight_a + * + * Parameters: + * a I: LP filter coefficients Q12 + * ap O: weighted LP filter coefficients Q12 + * gamma I: weighting factor Q15 + * + * Function: + * Weighting of LP filter coefficients, ap[i] = a[i] * (gamma^i). + * + * Returns: + * void + */ +void basop_weight_a( const Word16 *a, Word16 *ap, const Word16 gamma ) +{ + Word16 i, fac; + Word32 Amax; + Word16 shift; + + + fac = gamma; + Amax = L_mult( 16384, a[0] ); + FOR( i = 1; i < M; i++ ) + { + Amax = L_max( Amax, L_abs( L_mult0( fac, a[i] ) ) ); + fac = mult_r( fac, gamma ); + } + Amax = L_max( Amax, L_abs( L_mult0( fac, a[M] ) ) ); + shift = norm_l( Amax ); + fac = gamma; + ap[0] = shl( a[0], sub( shift, 1 ) ); + move16(); + FOR( i = 1; i < M; i++ ) + { + ap[i] = round_fx( L_shl( L_mult0( a[i], fac ), shift ) ); + move16(); + fac = mult_r( fac, gamma ); + } + ap[M] = round_fx( L_shl( L_mult0( a[M], fac ), shift ) ); + move16(); + + + return; +} + +/* + * weight_a_inv + * + * Parameters: + * a I: LP filter coefficients Q12 + * ap O: weighted LP filter coefficients Q12 + * inv_gamma I: inverse weighting factor Q14 + * + * Function: + * Weighting of LP filter coefficients, ap[i] = a[i] * (inv_gamma^i). + * + * Returns: + * void + */ +void basop_weight_a_inv( const Word16 *a, Word16 *ap, const Word16 inv_gamma ) +{ + Word16 i; + static const Word16 inv_gamma_tab_12k8[16] = { 17809, 19357, 21041, 22870, 24859, 27020, 29370, 31924, /* Q14 */ + 17350, 18859, 20499, 22281, 24219, 26325, 28614, 31102 }; /* Q13 */ + static const Word16 inv_gamma_tab_16k[16] = { 17430, 18542, 19726, 20985, 22324, 23749, 25265, 26878, /* Q14 */ + 14297, 15209, 16180, 17213, 18312, 19480, 20724, 22047 }; /* Q13 */ + const Word16 *inv_gamma_tab; + Word32 L_tmp; + Word32 Amax; + Word16 shift; + + + IF( inv_gamma == 16384 ) + { + FOR( i = 0; i <= M; i++ ) + { + ap[i] = a[i]; + move16(); + } + return; + } + + assert( inv_gamma == GAMMA1_INV || inv_gamma == GAMMA16k_INV ); + + inv_gamma_tab = inv_gamma_tab_12k8; + move16(); + if ( sub( inv_gamma, GAMMA16k_INV ) == 0 ) + { + inv_gamma_tab = inv_gamma_tab_16k; + move16(); + } + + Amax = L_mult( 16384, a[0] ); + FOR( i = 1; i < 9; i++ ) + { + Amax = L_max( Amax, L_abs( L_mult( a[i], inv_gamma_tab[i - 1] ) ) ); + } + FOR( i = 9; i < 17; i++ ) + { + Amax = L_max( Amax, L_abs( L_shl( L_mult( a[i], inv_gamma_tab[i - 1] ), 1 ) ) ); + } + shift = norm_l( Amax ); + ap[0] = shl( a[0], sub( shift, 1 ) ); + move16(); + FOR( i = 1; i < 9; i++ ) + { + L_tmp = L_mult( a[i], inv_gamma_tab[i - 1] ); + ap[i] = round_fx( L_shl( L_tmp, shift ) ); + move16(); + } + shift = add( shift, 1 ); + FOR( i = 9; i < 17; i++ ) + { + L_tmp = L_mult( a[i], inv_gamma_tab[i - 1] ); + ap[i] = round_fx( L_shl( L_tmp, shift ) ); + move16(); + } + + + return; +} + +/* + * basop_E_LPC_a_add_tilt + * + * Parameters: + * a I: LP filter coefficients (m+1 coeffs) + * ap O: modified LP filter coefficients (m+2 coeffs) + * gamma I: tilt factor + * + * Function: + * Modified LP filter by adding 1st order pre-premphasis, Ap(z)=A(z).(1-gamma.z^(-1)) + * + * Returns: + * void + */ +void basop_E_LPC_a_add_tilt( const Word16 *a, Word16 *ap, Word16 gamma ) +{ + Word16 i; + Word32 Amax, Atmp[M + 2]; + Word16 shift; + + + Amax = L_mult( 16384, a[0] ); + FOR( i = 1; i <= M; i++ ) + { + Atmp[i] = L_sub( L_mult( 16384, a[i] ), L_mult0( gamma, a[i - 1] ) ); + move32(); + Amax = L_max( Amax, L_abs( Atmp[i] ) ); + } + Atmp[M + 1] = L_negate( L_mult0( gamma, a[M] ) ); + move32(); + Amax = L_max( Amax, L_abs( Atmp[M + 1] ) ); + shift = norm_l( Amax ); + ap[0] = shl( a[0], sub( shift, 1 ) ); + move16(); + FOR( i = 1; i <= M; i++ ) + { + ap[i] = round_fx( L_shl( Atmp[i], shift ) ); + move16(); + } + ap[M + 1] = round_fx( L_shl( Atmp[M + 1], shift ) ); + move16(); + + return; +} + + +static Word16 xsf_to_xsp( Word16 xsf ) +{ + /* xsp = cos(xsf * 3.1415/6400); */ + return getCosWord16R2( xsf ); +} + +/* + * lsf2lsp + * + * Parameters: + * lsf I: lsf[m] normalized (range: 0 <= val <= 0.5) x2.56 + * lsp O: lsp[m] (range: -1 <= val < 1) Q15 + * + * Function: + * Transformation lsf to lsp + * + * LSF are line spectral pair in frequency domain (0 to 6400). + * LSP are line spectral pair in cosine domain (-1 to 1). + * + * Returns: + * void + */ +void basop_lsf2lsp( const Word16 lsf[], Word16 lsp[] ) +{ + Word16 i; + + + /* convert ISFs to the cosine domain */ + FOR( i = 0; i < M; i++ ) + { + *lsp++ = xsf_to_xsp( *lsf++ ); + move16(); + } + + + return; +} + +#undef WMC_TOOL_SKIP diff --git a/lib_com/basop_lsf_tools.c b/lib_com/basop_lsf_tools.c new file mode 100644 index 0000000000000000000000000000000000000000..eddce99e83929a2ae105b6117512512f20fd1880 --- /dev/null +++ b/lib_com/basop_lsf_tools.c @@ -0,0 +1,314 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include "options.h" +#include "basop_proto_func.h" +#include "control.h" +#include "basop_util.h" + +#define WMC_TOOL_SKIP + +#define NC_MAX 8 + +static Word16 E_LPC_f_lsp_pol_get( const Word16 lsp[], Word32 f[], const Word16 n, const Word16 past_Ovf, const Word16 isMODE1 ); + + +/* + * E_LPC_f_lsp_a_conversion + * + * Parameters: + * lsp I: Line spectral pairs Q15 + * a O: Predictor coefficients (order = m) Qx (The Q factor of the output to be deduced from a(0)) + * m I: order of LP filter + * + * Function: + * Convert ISPs to predictor coefficients a[] + * + * Returns: + * void + */ +void basop_E_LPC_f_lsp_a_conversion( + const Word16 *lsp, + Word16 *a, + const Word16 m ) +{ + Word16 i, j, k; + Word32 f1[NC_MAX + 1], f2[NC_MAX + 1]; + Word16 nc; + Word32 t0; + Word16 Ovf, Ovf2; + + + /*-----------------------------------------------------* + * Find the polynomials F1(z) and F2(z) * + *-----------------------------------------------------*/ + + nc = shr( m, 1 ); + + assert( m == 16 || m == 10 ); + + Ovf = 0; + move16(); + Ovf = E_LPC_f_lsp_pol_get( &lsp[0], f1, nc, Ovf, 1 ); + Ovf2 = E_LPC_f_lsp_pol_get( &lsp[1], f2, nc, Ovf, 1 ); + IF( sub( Ovf2, Ovf ) != 0 ) + { + /* to ensure similar scaling for f1 and f2 in case + an overflow would be detected only in f2, + but this case never happen on my dtb */ + E_LPC_f_lsp_pol_get( &lsp[0], f1, nc, s_max( Ovf2, Ovf ), 1 ); + } + /*-----------------------------------------------------* + * Multiply F1(z) by (1+z^-1) and F2(z) by (1-z^-1) * + *-----------------------------------------------------*/ + /*modification*/ + k = sub( nc, 1 ); + FOR( i = 0; i <= k; i++ ) + { + f1[nc - i] = L_add( f1[nc - i], f1[nc - i - 1] ); + move32(); + f2[nc - i] = L_sub( f2[nc - i], f2[nc - i - 1] ); + move32(); + } + + /*-----------------------------------------------------* + * A(z) = (F1(z)+F2(z))/2 * + * F1(z) is symmetric and F2(z) is antisymmetric * + *-----------------------------------------------------*/ + + t0 = L_deposit_l( 0 ); + FOR( i = 1; i <= nc; i++ ) + { + t0 = L_max( t0, L_abs( L_add( f1[i], f2[i] ) ) ); + t0 = L_max( t0, L_abs( L_sub( f1[i], f2[i] ) ) ); + } + k = s_min( norm_l( t0 ), 6 ); + a[0] = shl( 256, k ); + move16(); + test(); + IF( Ovf || Ovf2 ) + { + a[0] = shl( 256, sub( k, Ovf ) ); + move16(); + } + j = m; + FOR( i = 1; i <= nc; i++ ) + { + /* a[i] = 0.5*(f1[i] + f2[i]) */ + t0 = L_add( f1[i], f2[i] ); + t0 = L_shl( t0, k ); + a[i] = round_fx( t0 ); /* from Q23 to Qx and * 0.5 */ + + /* a[j] = 0.5*(f1[i] - f2[i]) */ + t0 = L_sub( f1[i], f2[i] ); + t0 = L_shl( t0, k ); + a[j] = round_fx( t0 ); /* from Q23 to Qx and * 0.5 */ + j--; + } + + return; +} + + +/*--------------------------------------------------------------------------- + * procedure reorder_lsf() + * + * To make sure that the lsfs are properly ordered and to keep a certain + * minimum distance between consecutive lsfs. + *--------------------------------------------------------------------------*/ +void basop_reorder_lsf( + Word16 *lsf, /* i/o: LSFs in the frequency domain (0..0.5) Q(x2.56)*/ + const Word16 min_dist, /* i : minimum required distance x2.56*/ + const Word16 n, /* i : LPC order */ + const Word32 Fs /* i : sampling frequency */ +) +{ + Word16 i, lsf_min, n_m_1; + Word16 lsf_max; + + lsf_min = min_dist; + move16(); + + /*-----------------------------------------------------------------------* + * Verify the LSF ordering and minimum GAP + *-----------------------------------------------------------------------*/ + + FOR( i = 0; i < n; i++ ) + { + if ( sub( lsf[i], lsf_min ) < 0 ) + { + lsf[i] = lsf_min; + move16(); + } + lsf_min = add( lsf[i], min_dist ); + } + + /*-----------------------------------------------------------------------* + * Reverify the LSF ordering and minimum GAP in the reverse order (security) + *-----------------------------------------------------------------------*/ + + lsf_max = round_fx( L_sub( L_shr( L_mult0( extract_l( L_shr( Fs, 1 ) ), 1311 ), 9 - 16 ), L_deposit_h( min_dist ) ) ); /* Q0 + Q9 , 1311 is 2.56 in Q9 */ + + n_m_1 = sub( n, 1 ); + IF( sub( lsf[n_m_1], lsf_max ) > 0 ) /* If danger of unstable filter in case of resonance in HF */ + { + FOR( i = n_m_1; i >= 0; i-- ) /* Reverify the minimum LSF gap in the reverse direction */ + { + if ( sub( lsf[i], lsf_max ) > 0 ) + { + lsf[i] = lsf_max; + move16(); + } + lsf_max = sub( lsf[i], min_dist ); + } + } + + return; +} + + +/* + * E_LPC_f_lsp_pol_get + * + * Parameters: + * lsp/isp I: Line spectral pairs (cosine domaine) Q15 + * f O: the coefficients of F1 or F2 Q23 + * n I: no of coefficients (m/2) + * == NC for F1(z); == NC-1 for F2(z) + * fact I: scaling factor + * + *-----------------------------------------------------------* + * procedure E_LPC_f_lsp_pol_get: * + * ~~~~~~~~~~~ * + * Find the polynomial F1(z) or F2(z) from the LSPs. * + * This is performed by expanding the product polynomials: * + * * + * F1(z) = product ( 1 - 2 LSF_i z^-1 + z^-2 ) * + * i=0,2,4,6,8 * + * F2(z) = product ( 1 - 2 LSF_i z^-1 + z^-2 ) * + * i=1,3,5,7,9 * + * * + * where LSP_i are the LSPs in the cosine domain. * + * * + *-----------------------------------------------------------* + * R.A.Salami October 1990 * + *-----------------------------------------------------------* + */ +static Word16 E_LPC_f_lsp_pol_get( + const Word16 lsp[], + Word32 f[], + const Word16 n, + const Word16 past_Ovf, + const Word16 isMODE1 ) +{ + /* All computation in Q23 */ + const Word16 *plsp; + Word16 i, j; + Word16 b; + Word32 b32; + Word16 Ovf = 0; + Word16 Q_out; + Word16 m2; +#ifdef BASOP_NOGLOB + Flag Overflow; +#endif /* BASOP_NOGLOB */ + + + Q_out = 31 - 23; + move16(); + Ovf = past_Ovf; + move16(); + + test(); + if ( past_Ovf && isMODE1 ) /* Currently this feature is implemented only in MODE1 */ + { + /* In some NB cases, overflow where detectected + in f1 or f2 polynomial computation when it + happen we reduce the precision of the computing + to limit the risk of saturation*/ + Q_out = add( Q_out, past_Ovf ); + } + Overflow = 0; + move16(); + plsp = lsp; + f[0] = L_shl( 1, sub( 31, Q_out ) ); + move32(); + /*b = -2.0f * *plsp;*/ + b = *plsp; + move16(); + m2 = shl( -2, sub( 15, Q_out ) ); + f[1] = L_mult( b, m2 ); + move32(); + + FOR( i = 2; i <= n; i++ ) + { + plsp += 2; + /*b = 2.0f * *plsp;*/ + move16(); + b = *plsp; + b32 = L_mult( b, m2 ); + + /*f[i] = -b*f[i-1] + 2.0f*f[i-2];*/ + move32(); + f[i] = L_shl( L_sub( f[i - 2], Mpy_32_16( f[i - 1], b ) ), 1 ); + + FOR( j = i - 1; j > 1; j-- ) + { + /*f[j] += b*f[j-1] + f[j-2];*/ + move32(); + f[j] = L_add( f[j], L_sub( f[j - 2], L_shl( Mpy_32_16( f[j - 1], b ), 1 ) ) ); + } + move32(); + f[1] = L_add( f[1], b32 ); + } + + + test(); + IF( Overflow > 0 && isMODE1 ) + { +#ifdef BASOP_NOGLOB + assert( 0 ); +#endif /* BASOP_NOGLOB */ + /* If an overflow is detected, redo the computation with 1 bit less */ + Ovf = add( Ovf, 1 ); + Ovf = E_LPC_f_lsp_pol_get( lsp, f, n, Ovf, isMODE1 ); + } + return Ovf; +} + +#undef WMC_TOOL_SKIP diff --git a/lib_com/basop_mpy.c b/lib_com/basop_mpy.c new file mode 100644 index 0000000000000000000000000000000000000000..cb6268d6279abe7ff8e6c01bf0b9de7ee948fde2 --- /dev/null +++ b/lib_com/basop_mpy.c @@ -0,0 +1,89 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include "basop_mpy.h" +#include +#include "options.h" + +#define WMC_TOOL_SKIP + +Word32 Mpy_32_16_1( Word32 x, Word16 y ) +{ + Word32 mh; + UWord16 ml; + + Mpy_32_16_ss( x, y, &mh, &ml ); + + return ( mh ); +} + +Word32 Mpy_32_16( Word32 x, Word16 y ) +{ + Word32 mh; + UWord16 ml; + + Mpy_32_16_ss( x, y, &mh, &ml ); + + return ( mh ); +} + +Word32 Mpy_32_16_r( Word32 x, Word16 y ) +{ + Word32 mh; + UWord16 ml; + + Mpy_32_16_ss( x, y, &mh, &ml ); + + if ( s_and( ml, -32768 /* 0x8000 */ ) ) + { + mh = L_add( mh, 1 ); + } + + return ( mh ); +} + + +Word32 Mpy_32_32( Word32 x, Word32 y ) +{ + Word32 mh; + UWord32 ml; + + Mpy_32_32_ss( x, y, &mh, &ml ); + + return ( mh ); +} + +#undef WMC_TOOL_SKIP diff --git a/lib_com/basop_mpy.h b/lib_com/basop_mpy.h new file mode 100644 index 0000000000000000000000000000000000000000..c35531fa6fcb5d4b1c6435b36d98ca76581f0c0b --- /dev/null +++ b/lib_com/basop_mpy.h @@ -0,0 +1,97 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#ifndef __BASOP_MPY_H +#define __BASOP_MPY_H + +#include "stl.h" +#include +#include "options.h" + +/** + * \brief 32*16 Bit fractional Multiplication using 40 bit OPS + * Performs a multiplication of a 32-bit variable x by + * a 16-bit variable y, returning a 32-bit value. + * + * \param[i] x + * \param[i] y + * + * \return x*y + */ +Word32 Mpy_32_16_1( Word32 x, Word16 y ); + + +/** + * \brief 32*16 Bit fractional Multiplication using 40 bit OPS + * Performs a multiplication of a 32-bit variable x by + * a 16-bit variable y, returning a 32-bit value. + * + * \param[i] x + * \param[i] y + * + * \return x*y + */ +Word32 Mpy_32_16( Word32 x, Word16 y ); + + +/** + * \brief 32*16 Bit fractional Multiplication using 40 bit OPS + * Performs a multiplication of a 32-bit variable x by + * a 16-bit variable y including rounding, returning a 32-bit value. + * + * \param[i] x + * \param[i] y + * + * \return x*y + */ +Word32 Mpy_32_16_r( Word32 x, Word16 y ); + + +/** + * \brief 32*32 Bit fractional Multiplication using 40 bit OPS + * + * Performs a multiplication of a 32-bit variable x by + * a 32-bit variable y, returning a 32-bit value. + * + * \param[i] x + * \param[i] y + * + * \return x*y + */ + +Word32 Mpy_32_32( Word32 x, Word32 y ); + +#endif /* __BASOP_SETTINGS_H */ diff --git a/lib_com/basop_proto_func.h b/lib_com/basop_proto_func.h new file mode 100644 index 0000000000000000000000000000000000000000..0c514475f324d6a587142fb07f75d6648a816986 --- /dev/null +++ b/lib_com/basop_proto_func.h @@ -0,0 +1,70 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#ifndef BASOP_PROTO_FUNC_H +#define BASOP_PROTO_FUNC_H + +#include +#include "options.h" +#include "stl.h" +#include "basop_util.h" + + +/* tcx_lpc_cdk.h */ +#define LSF_GAP_VAL( x ) ( Word16 )( (x) *2.0f * 1.28f ) +#define LSFM( x ) FL2WORD16_SCALE( x * 1.28, 15 - 1 ) /* 14Q1*1.28 */ + +/* cnst.h */ +#define GAMMA1_INV 17809 /* weighting factor (numerator) default:0.92 (1Q14format) */ +#define GAMMA16k_INV 17430 /* weighting factor (numerator) default:0.94 (1Q14format) */ +#define INT_FS_FX 12800 /* internal sampling frequency */ + +void basop_lsp2a_stab( const Word16 *lsp, Word16 *a ); +void basop_lsf2lsp( const Word16 lsf[], Word16 lsp[] ); +void basop_weight_a( const Word16 *a, Word16 *ap, const Word16 gamma ); +void basop_weight_a_inv( const Word16 *a, Word16 *ap, const Word16 inv_gamma ); +void basop_E_LPC_a_add_tilt( const Word16 *a, Word16 *ap, Word16 gamma ); +void basop_reorder_lsf( Word16 *lsf, const Word16 min_dist, const Word16 n, const Word32 Fs ); +void basop_E_LPC_f_lsp_a_conversion( const Word16 *lsp, Word16 *a, const Word16 m ); + +/* tcx_utils.c */ +void basop_lpc2mdct( Word16 *lpcCoeffs, Word16 lpcOrder, Word16 *mdct_gains, Word16 *mdct_gains_exp, Word16 *mdct_inv_gains, Word16 *mdct_inv_gains_exp ); + +void basop_PsychAdaptLowFreqDeemph( Word32 x[], const Word16 lpcGains[], const Word16 lpcGains_e[], Word16 lf_deemph_factors[] ); +void basop_mdct_noiseShaping_interp( Word32 x[], Word16 lg, Word16 gains[], Word16 gains_exp[] ); + + +#endif diff --git a/lib_com/basop_settings.h b/lib_com/basop_settings.h new file mode 100644 index 0000000000000000000000000000000000000000..758a99650cea4a0a7c0fc7ca59c4bab70953dbf0 --- /dev/null +++ b/lib_com/basop_settings.h @@ -0,0 +1,110 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#ifndef __BASOP_SETTINGS_H +#define __BASOP_SETTINGS_H + +#include +#include "options.h" +#include "stl.h" +#include "basop_mpy.h" + +#define WORD32_BITS 32 +#define MAXVAL_WORD32 ( (int32_t) 0x7FFFFFFF ) +#define MINVAL_WORD32 ( (int32_t) 0x80000000 ) +#define WORD32_FIX_SCALE ( (int64_t) ( 1 ) << ( WORD32_BITS - 1 ) ) + +#define WORD16_BITS 16 +#define MAXVAL_WORD16 ( ( (int32_t) 0x7FFFFFFF ) >> 16 ) +#define MINVAL_WORD16 ( ( (int32_t) 0x80000000 ) >> 16 ) +#define WORD16_FIX_SCALE ( (int64_t) ( 1 ) << ( WORD16_BITS - 1 ) ) + +#ifdef _MSC_VER +#pragma warning( disable : 4310 ) +#endif + +/*! + \def Macro converts a float < 1 to Word32 fixed point with saturation and rounding +*/ +#define FL2WORD32( val ) \ + ( Word32 )( ( ( val ) >= 0 ) ? ( ( ( (double) ( val ) * ( WORD32_FIX_SCALE ) + 0.5 ) >= (double) ( MAXVAL_WORD32 ) ) ? (int32_t) ( MAXVAL_WORD32 ) : (int32_t) ( (double) ( val ) * (double) ( WORD32_FIX_SCALE ) + 0.5 ) ) : ( ( ( (double) ( val ) * (WORD32_FIX_SCALE) -0.5 ) <= (double) ( MINVAL_WORD32 ) ) ? (int32_t) ( MINVAL_WORD32 ) : (int32_t) ( (double) ( val ) * (double) (WORD32_FIX_SCALE) -0.5 ) ) ) + +/*! + \def Macro converts a float < 1 to Word16 fixed point with saturation and rounding +*/ +#define FL2WORD16( val ) \ + ( Word16 )( ( ( val ) >= 0 ) ? ( ( ( (double) ( val ) * ( WORD16_FIX_SCALE ) + 0.5 ) >= (double) ( MAXVAL_WORD16 ) ) ? (int32_t) ( MAXVAL_WORD16 ) : (int32_t) ( (double) ( val ) * (double) ( WORD16_FIX_SCALE ) + 0.5 ) ) : ( ( ( (double) ( val ) * (WORD16_FIX_SCALE) -0.5 ) <= (double) ( MINVAL_WORD16 ) ) ? (int32_t) ( MINVAL_WORD16 ) : (int32_t) ( (double) ( val ) * (double) (WORD16_FIX_SCALE) -0.5 ) ) ) + +/*! + \def Macro converts a Word32 fixed point to Word16 fixed point <1 with saturation +*/ +#define WORD322WORD16( val ) \ + ( ( ( ( ( ( val ) >> ( WORD32_BITS - WORD16_BITS - 1 ) ) + 1 ) > ( ( (int32_t) 1 << WORD16_BITS ) - 1 ) ) && ( (int32_t) ( val ) > 0 ) ) ? (Word16) (int16_t) ( ( (int32_t) 1 << ( WORD16_BITS - 1 ) ) - 1 ) : (Word16) (int16_t) ( ( ( ( val ) >> ( WORD32_BITS - WORD16_BITS - 1 ) ) + 1 ) >> 1 ) ) + +/*! + \def Macro converts a Word32 fixed point < 1 to float shifts result left by scale +*/ +#define WORD322FL_SCALE( x, scale ) ( ( (float) ( (int32_t) ( x ) ) ) / ( (int64_t) 1 << ( WORD32_BITS - 1 - ( scale ) ) ) ) + +/*! + \def Macro converts a float < 1 to Word32 fixed point with saturation and rounding, shifts result right by scale +*/ +/* Note: Both x and scale must be constants at compile time, scale must be in range -31..31 */ +#define FL2WORD32_SCALE( x, scale ) FL2WORD32( (double) ( x ) * ( (int64_t) 1 << ( WORD32_BITS - 1 - ( scale ) ) ) / ( (int64_t) 1 << ( WORD32_BITS - 1 ) ) ) + +/*! + \def Macro converts a Word16 fixed point < 1 to float shifts result left by scale +*/ +#define WORD162FL_SCALE( x, scale ) ( ( (float) ( (int32_t) ( x ) ) ) / ( (int64_t) 1 << ( WORD16_BITS - 1 - ( scale ) ) ) ) + +/*! + \def Macro converts a float < 1 to Word16 fixed point with saturation and rounding, shifts result right by scale +*/ +/* Note: At compile time, x must be a float constant and scale must be an integer constant in range -15..15 */ +#define FL2WORD16_SCALE( x, scale ) FL2WORD16( (float) ( x ) * ( (int64_t) 1 << ( WORD16_BITS - 1 - ( scale ) ) ) / ( (int64_t) 1 << ( WORD16_BITS - 1 ) ) ) + + +/* Word16 Packed Type */ +typedef struct +{ + struct + { + Word16 re; + Word16 im; + } v; +} PWord16; + +#endif /* __BASOP_SETTINGS_H */ diff --git a/lib_com/basop_tcx_utils.c b/lib_com/basop_tcx_utils.c new file mode 100644 index 0000000000000000000000000000000000000000..f57bf10a8b60c0f490f70d60e607772dc84cf84a --- /dev/null +++ b/lib_com/basop_tcx_utils.c @@ -0,0 +1,438 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include "options.h" +#include "cnst.h" +#include "basop_proto_func.h" +#include "stl.h" +#include "prot.h" +#include "rom_com.h" + +#define WMC_TOOL_SKIP + +/* compare two positive normalized 16 bit mantissa/exponent values */ +/* return value: positive if first value greater, negative if second value greater, zero if equal */ +static Word16 compMantExp16Unorm( Word16 m1, Word16 e1, Word16 m2, Word16 e2 ) +{ + Word16 tmp; + + assert( ( m1 >= 0x4000 ) && ( m2 >= 0x4000 ) ); /* comparisons below work only for normalized mantissas */ + + tmp = sub( e1, e2 ); + if ( tmp == 0 ) + tmp = sub( m1, m2 ); + + return tmp; +} + +void basop_lpc2mdct( Word16 *lpcCoeffs, Word16 lpcOrder, Word16 *mdct_gains, Word16 *mdct_gains_exp, Word16 *mdct_inv_gains, Word16 *mdct_inv_gains_exp ) +{ + Word32 RealData[FDNS_NPTS]; + Word32 ImagData[FDNS_NPTS]; + Word16 i, j, k, step, scale, s, tmp16; + Word16 g, g_e, ig, ig_e; + Word32 tmp32; + const PWord16 *ptwiddle; + + + /* short-cut, to avoid calling of BASOP_getTables() */ + ptwiddle = SineTable512_fx; + step = 8; + + /*ODFT*/ + assert( lpcOrder < FDNS_NPTS ); + + /* pre-twiddle */ + FOR( i = 0; i <= lpcOrder; i++ ) + { + RealData[i] = L_mult( lpcCoeffs[i], ptwiddle->v.re ); + move32(); + ImagData[i] = L_negate( L_mult( lpcCoeffs[i], ptwiddle->v.im ) ); + move32(); + ptwiddle += step; + } + + /* zero padding */ + FOR( ; i < FDNS_NPTS; i++ ) + { + RealData[i] = 0; + move32(); + ImagData[i] = 0; + move32(); + } + + /* half length FFT */ + scale = add( norm_s( lpcCoeffs[0] ), 1 ); + move16(); + BASOP_cfft( RealData, ImagData, 1, &scale ); /* sizeOfFft == FDNS_NPTS == 8 */ + + + /*Get amplitude*/ + j = FDNS_NPTS - 1; + k = 0; + move16(); + + FOR( i = 0; i < FDNS_NPTS / 2; i++ ) + { + s = sub( norm_l( L_max( L_abs( RealData[i] ), L_abs( ImagData[i] ) ) ), 1 ); + + tmp16 = extract_h( L_shl( RealData[i], s ) ); + tmp32 = L_mult( tmp16, tmp16 ); + + tmp16 = extract_h( L_shl( ImagData[i], s ) ); + tmp16 = mac_r( tmp32, tmp16, tmp16 ); + + s = shl( sub( scale, s ), 1 ); + + if ( tmp16 == 0 ) + { + s = -16; + move16(); + } + if ( tmp16 == 0 ) + { + tmp16 = 1; + move16(); + } + + BASOP_Util_Sqrt_InvSqrt_MantExp( tmp16, s, &g, &g_e, &ig, &ig_e ); + + if ( mdct_gains != NULL ) + { + mdct_gains[k] = g; + move16(); + } + + if ( mdct_gains_exp != NULL ) + { + mdct_gains_exp[k] = g_e; + move16(); + } + + if ( mdct_inv_gains != NULL ) + { + mdct_inv_gains[k] = ig; + move16(); + } + + if ( mdct_inv_gains_exp != NULL ) + { + mdct_inv_gains_exp[k] = ig_e; + move16(); + } + + k = add( k, 1 ); + + + s = sub( norm_l( L_max( L_abs( RealData[j] ), L_abs( ImagData[j] ) ) ), 1 ); + + tmp16 = extract_h( L_shl( RealData[j], s ) ); + tmp32 = L_mult( tmp16, tmp16 ); + + tmp16 = extract_h( L_shl( ImagData[j], s ) ); + tmp16 = mac_r( tmp32, tmp16, tmp16 ); + + s = shl( sub( scale, s ), 1 ); + + if ( tmp16 == 0 ) + { + s = -16; + move16(); + } + if ( tmp16 == 0 ) + { + tmp16 = 1; + move16(); + } + + BASOP_Util_Sqrt_InvSqrt_MantExp( tmp16, s, &g, &g_e, &ig, &ig_e ); + + if ( mdct_gains != NULL ) + { + mdct_gains[k] = g; + move16(); + } + + if ( mdct_gains_exp != NULL ) + { + mdct_gains_exp[k] = g_e; + move16(); + } + + if ( mdct_inv_gains != NULL ) + { + mdct_inv_gains[k] = ig; + move16(); + } + + if ( mdct_inv_gains_exp != NULL ) + { + mdct_inv_gains_exp[k] = ig_e; + move16(); + } + + j = sub( j, 1 ); + k = add( k, 1 ); + } +} + + +void basop_mdct_noiseShaping_interp( Word32 x[], Word16 lg, Word16 gains[], Word16 gains_exp[] ) +{ + Word16 i, j, jp, jn, k, l; + Word16 g, pg, ng, e, tmp; + + + assert( lg % FDNS_NPTS == 0 ); + k = shr( lg, 6 ); /* FDNS_NPTS = 64 */ + + IF( gains != NULL ) + { + /* Linear interpolation */ + IF( sub( k, 4 ) == 0 ) + { + jp = 0; + move16(); + j = 0; + move16(); + jn = 1; + move16(); + + FOR( i = 0; i < lg; i += 4 ) + { + pg = gains[jp]; + move16(); + g = gains[j]; + move16(); + ng = gains[jn]; + move16(); + + /* common exponent for pg and g */ + tmp = sub( gains_exp[j], gains_exp[jp] ); + if ( tmp > 0 ) + pg = shr( pg, tmp ); + if ( tmp < 0 ) + g = shl( g, tmp ); + e = s_max( gains_exp[j], gains_exp[jp] ); + + tmp = mac_r( L_mult( pg, FL2WORD16( 0.375f ) ), g, FL2WORD16( 0.625f ) ); + x[i] = L_shl( Mpy_32_16( x[i], tmp ), e ); + move32(); + + tmp = mac_r( L_mult( pg, FL2WORD16( 0.125f ) ), g, FL2WORD16( 0.875f ) ); + x[i + 1] = L_shl( Mpy_32_16( x[i + 1], tmp ), e ); + move32(); + + /* common exponent for g and ng */ + g = gains[j]; + move16(); + tmp = sub( gains_exp[j], gains_exp[jn] ); + if ( tmp > 0 ) + ng = shr( ng, tmp ); + if ( tmp < 0 ) + g = shl( g, tmp ); + e = s_max( gains_exp[j], gains_exp[jn] ); + + tmp = mac_r( L_mult( g, FL2WORD16( 0.875f ) ), ng, FL2WORD16( 0.125f ) ); + x[i + 2] = L_shl( Mpy_32_16( x[i + 2], tmp ), e ); + move32(); + + tmp = mac_r( L_mult( g, FL2WORD16( 0.625f ) ), ng, FL2WORD16( 0.375f ) ); + x[i + 3] = L_shl( Mpy_32_16( x[i + 3], tmp ), e ); + move32(); + + jp = j; + move16(); + j = jn; + move16(); + jn = s_min( add( jn, 1 ), FDNS_NPTS - 1 ); + } + } + ELSE IF( sub( k, 5 ) == 0 ) + { + jp = 0; + move16(); + j = 0; + move16(); + jn = 1; + move16(); + + FOR( i = 0; i < lg; i += 5 ) + { + pg = gains[jp]; + move16(); + g = gains[j]; + move16(); + ng = gains[jn]; + move16(); + + /* common exponent for pg and g */ + tmp = sub( gains_exp[j], gains_exp[jp] ); + if ( tmp > 0 ) + pg = shr( pg, tmp ); + if ( tmp < 0 ) + g = shl( g, tmp ); + e = s_max( gains_exp[j], gains_exp[jp] ); + + tmp = mac_r( L_mult( pg, FL2WORD16( 0.40f ) ), g, FL2WORD16( 0.60f ) ); + x[i] = L_shl( Mpy_32_16( x[i], tmp ), e ); + move32(); + + tmp = mac_r( L_mult( pg, FL2WORD16( 0.20f ) ), g, FL2WORD16( 0.80f ) ); + x[i + 1] = L_shl( Mpy_32_16( x[i + 1], tmp ), e ); + move32(); + + + x[i + 2] = L_shl( Mpy_32_16( x[i + 2], gains[j] ), gains_exp[j] ); + move32(); + + /* common exponent for g and ng */ + g = gains[j]; + move16(); + tmp = sub( gains_exp[j], gains_exp[jn] ); + if ( tmp > 0 ) + ng = shr( ng, tmp ); + if ( tmp < 0 ) + g = shl( g, tmp ); + e = s_max( gains_exp[j], gains_exp[jn] ); + + tmp = mac_r( L_mult( g, FL2WORD16( 0.80f ) ), ng, FL2WORD16( 0.20f ) ); + x[i + 3] = L_shl( Mpy_32_16( x[i + 3], tmp ), e ); + move32(); + + tmp = mac_r( L_mult( g, FL2WORD16( 0.60f ) ), ng, FL2WORD16( 0.40f ) ); + x[i + 4] = L_shl( Mpy_32_16( x[i + 4], tmp ), e ); + move32(); + + jp = j; + move16(); + j = jn; + move16(); + jn = s_min( add( jn, 1 ), FDNS_NPTS - 1 ); + } + } + ELSE /* no interpolation */ + { + FOR( i = 0; i < FDNS_NPTS; i++ ) + { + FOR( l = 0; l < k; l++ ) + { + *x = L_shl( Mpy_32_16( *x, *gains ), *gains_exp ); + move32(); + x++; + } + + gains++; + gains_exp++; + } + } + } +} + + +void basop_PsychAdaptLowFreqDeemph( Word32 x[], const Word16 lpcGains[], const Word16 lpcGains_e[], Word16 lf_deemph_factors[] ) +{ + Word16 i; + Word16 max_val, max_e, fac, min_val, min_e, tmp, tmp_e; + Word32 L_tmp; + + + assert( lpcGains[0] >= 0x4000 ); + + max_val = lpcGains[0]; + move16(); + max_e = lpcGains_e[0]; + move16(); + min_val = lpcGains[0]; + move16(); + min_e = lpcGains_e[0]; + move16(); + + /* find minimum (min) and maximum (max) of LPC gains in low frequencies */ + FOR( i = 1; i < 9; i++ ) + { + IF( compMantExp16Unorm( lpcGains[i], lpcGains_e[i], min_val, min_e ) < 0 ) + { + min_val = lpcGains[i]; + move16(); + min_e = lpcGains_e[i]; + move16(); + } + + IF( compMantExp16Unorm( lpcGains[i], lpcGains_e[i], max_val, max_e ) > 0 ) + { + max_val = lpcGains[i]; + move16(); + max_e = lpcGains_e[i]; + move16(); + } + } + + min_e = add( min_e, 5 ); /* min *= 32.0f; */ + + test(); + IF( ( compMantExp16Unorm( max_val, max_e, min_val, min_e ) < 0 ) && ( min_val > 0 ) ) + { + /* fac = tmp = (float)pow(max / min, 0.0078125f); */ + tmp_e = min_e; + move16(); + tmp = Inv16( min_val, &tmp_e ); + L_tmp = L_shl( L_mult( tmp, max_val ), add( tmp_e, max_e ) ); /* Q31 */ + L_tmp = BASOP_Util_Log2( L_tmp ); /* Q25 */ + L_tmp = L_shr( L_tmp, 7 ); /* 0.0078125f = 1.f/(1<<7) */ + L_tmp = BASOP_Util_InvLog2( L_tmp ); /* Q31 */ + tmp = round_fx( L_tmp ); /* Q15 */ + fac = tmp; /* Q15 */ + move16(); + + /* gradual lowering of lowest 32 bins; DC is lowered by (max/tmp)^1/4 */ + FOR( i = 31; i >= 0; i-- ) + { + x[i] = Mpy_32_16( x[i], fac ); + move32(); + if ( lf_deemph_factors != NULL ) + { + lf_deemph_factors[i] = mult_r( lf_deemph_factors[i], fac ); + move16(); + } + fac = mult_r( fac, tmp ); + } + } +} + +#undef WMC_TOOL_SKIP diff --git a/lib_com/basop_util.c b/lib_com/basop_util.c new file mode 100644 index 0000000000000000000000000000000000000000..ff42b0eb4345633aea6c15f49f41d06f4c86423e --- /dev/null +++ b/lib_com/basop_util.c @@ -0,0 +1,1109 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include "options.h" +#include "basop_util.h" +#include "rom_com.h" +#include "basop_settings.h" +#include "basop_mpy.h" +#include "control.h" +#include "cnst.h" + +#define WMC_TOOL_SKIP + +extern const Word32 SqrtTable[32]; +extern const Word16 SqrtDiffTable[32]; + +extern const Word32 ISqrtTable[32]; +extern const Word16 ISqrtDiffTable[32]; + +extern const Word32 InvTable[32]; +extern const Word16 InvDiffTable[32]; + + +Word32 BASOP_Util_Log2( + Word32 x ) +{ + Word32 exp; + Word16 exp_e; + Word16 nIn; + Word16 accuSqr; + Word32 accuRes; + + assert( x >= 0 ); + + if ( x == 0 ) + { + return ( (Word32) MIN_32 ); + } + + /* normalize input, calculate integer part */ + exp_e = norm_l( x ); + x = L_shl( x, exp_e ); + exp = L_deposit_l( exp_e ); + + /* calculate (1-normalized_input) */ + nIn = extract_h( L_sub( MAX_32, x ) ); + + /* approximate ln() for fractional part (nIn *c0 + nIn^2*c1 + nIn^3*c2 + ... + nIn^8 *c7) */ + + /* iteration 1, no need for accumulation */ + accuRes = L_mult( nIn, ldCoeff[0] ); /* nIn^i * coeff[0] */ + accuSqr = mult( nIn, nIn ); /* nIn^2, nIn^3 .... */ + + /* iteration 2 */ + accuRes = L_mac( accuRes, accuSqr, ldCoeff[1] ); /* nIn^i * coeff[1] */ + accuSqr = mult( accuSqr, nIn ); /* nIn^2, nIn^3 .... */ + + /* iteration 3 */ + accuRes = L_mac( accuRes, accuSqr, ldCoeff[2] ); /* nIn^i * coeff[2] */ + accuSqr = mult( accuSqr, nIn ); /* nIn^2, nIn^3 .... */ + + /* iteration 4 */ + accuRes = L_mac( accuRes, accuSqr, ldCoeff[3] ); /* nIn^i * coeff[3] */ + accuSqr = mult( accuSqr, nIn ); /* nIn^2, nIn^3 .... */ + + /* iteration 5 */ + accuRes = L_mac( accuRes, accuSqr, ldCoeff[4] ); /* nIn^i * coeff[4] */ + accuSqr = mult( accuSqr, nIn ); /* nIn^2, nIn^3 .... */ + + /* iteration 6 */ + accuRes = L_mac( accuRes, accuSqr, ldCoeff[5] ); /* nIn^i * coeff[5] */ + accuSqr = mult( accuSqr, nIn ); /* nIn^2, nIn^3 .... */ + + /* iteration 7, no need to calculate accuSqr any more */ + accuRes = L_mac( accuRes, accuSqr, ldCoeff[6] ); /* nIn^i * coeff[6] */ + + /* ld(fractional part) = ln(fractional part)/ln(2), 1/ln(2) = (1 + 0.44269504) */ + accuRes = L_mac0( L_shr( accuRes, 1 ), extract_h( accuRes ), 14506 ); + + accuRes = L_shr( accuRes, LD_DATA_SCALE - 1 ); /* fractional part/LD_DATA_SCALE */ + exp = L_shl( exp, ( 31 - LD_DATA_SCALE ) ); /* integer part/LD_DATA_SCALE */ + accuRes = L_sub( accuRes, exp ); /* result = integer part + fractional part */ + + return ( accuRes ); +} + + +Word32 BASOP_Util_InvLog2( + Word32 x ) +{ + Word16 frac; + Word16 exp; + Word32 retVal; + UWord32 index3; + UWord32 index2; + UWord32 index1; + UWord32 lookup3f; + UWord32 lookup12; + UWord32 lookup; + + if ( x < FL2WORD32( -31.0 / 64.0 ) ) + { + return 0; + } + test(); + if ( ( L_sub( x, FL2WORD32( 31.0 / 64.0 ) ) >= 0 ) || ( x == 0 ) ) + { + return 0x7FFFFFFF; + } + + frac = extract_l( L_and( x, 0x3FF ) ); + + index3 = L_and( L_shr( x, 10 ), 0x1F ); + index2 = L_and( L_shr( x, 15 ), 0x1F ); + index1 = L_and( L_shr( x, 20 ), 0x1F ); + + exp = extract_l( L_shr( x, 25 ) ); + if ( x > 0 ) + { + exp = sub( 31, exp ); + } + if ( x < 0 ) + { + exp = negate( exp ); + } + + lookup3f = L_add( exp2x_tab_long[index3], L_shr( Mpy_32_16( 0x0016302F, frac ), 1 ) ); + lookup12 = Mpy_32_32( exp2_tab_long[index1], exp2w_tab_long[index2] ); + lookup = Mpy_32_32( lookup12, lookup3f ); + + retVal = L_shr( lookup, sub( exp, 3 ) ); + + return retVal; +} + + +Word16 BASOP_Util_Add_MantExp /*!< Exponent of result */ + ( Word16 a_m, /*!< Mantissa of 1st operand a */ + Word16 a_e, /*!< Exponent of 1st operand a */ + Word16 b_m, /*!< Mantissa of 2nd operand b */ + Word16 b_e, /*!< Exponent of 2nd operand b */ + Word16 *ptrSum_m ) /*!< Mantissa of result */ +{ + Word32 L_lm, L_hm; + Word16 shift; + + /* Compare exponents: the difference is limited to +/- 15 + The Word16 mantissa of the operand with higher exponent is moved into the low + part of a Word32 and shifted left by the exponent difference. Then, the + unshifted mantissa of the operand with the lower exponent is added to the lower + 16 bits. The addition result is normalized and the upper Word16 of the result represents + the mantissa to return. The returned exponent takes into account all shift operations + including the final 16-bit extraction. + Note: The resulting mantissa may be inaccurate in the case, where the mantissa of the operand + with higher exponent is not really left-aligned, while the mantissa of the operand with + lower exponent is so. If in such a case, the difference in exponents is more than 15, + an inaccuracy is introduced. + Example: + A: a_e = 20, a_m = 0x0001 + B: b_e = 0, b_m = 0x4000 + correct: A+B=1*2^20+1*2^14=0x0010.0000+0x0000.4000=0x0010.4000=0x4100*2^6 + previously: A+B=1*2^20+1*2^14=0x0001+0x0000=0x0001*2^20 + this version: A+B=1*2^20+1*2^14=0x0000.8000+0x0000.4000=0x6000*2^6 + */ + + shift = sub( a_e, b_e ); + if ( shift >= 0 ) + shift = s_min( 15, shift ); + + if ( shift < 0 ) + shift = s_max( -15, shift ); + a_e = s_max( a_e, b_e ); + L_hm = L_deposit_l( a_m ); /* mantissa belonging to higher exponent */ + L_lm = L_deposit_l( a_m ); /* mantissa belonging to lower exponent */ + if ( shift >= 0 ) + L_lm = L_deposit_l( b_m ); + if ( shift < 0 ) + L_hm = L_deposit_l( b_m ); + + if ( shift > 0 ) + shift = negate( shift ); + + L_hm = L_shr( L_hm, shift ); /* shift left due to negative shift parameter */ + a_e = add( a_e, shift ); + L_hm = L_add( L_hm, L_lm ); + shift = norm_l( L_hm ); + L_hm = L_shl( L_hm, shift ); + *ptrSum_m = extract_h( L_hm ); + move16(); + + a_e = sub( a_e, shift ); + if ( L_hm ) + a_e = add( a_e, 16 ); + + return ( a_e ); +} + + +/* local function for Sqrt16 */ +static Word16 Sqrt16_common( + Word16 m, + Word16 e ) +{ + Word16 index, frac; +#ifdef BASOP_NOGLOB + Flag Overflow; +#endif /* BASOP_NOGLOB */ + + assert( ( m >= 0x4000 ) || ( m == 0 ) ); + + /* get table index (upper 6 bits minus 32) */ + /* index = (m >> 9) - 32; */ + index = mac_r( -32768 - ( 32 << 16 ), m, 1 << 6 ); + + /* get fractional part for interpolation (lower 9 bits) */ + frac = s_and( m, 0x1FF ); /* Q9 */ + + /* interpolate */ + if ( m != 0 ) + { + BASOP_SATURATE_WARNING_OFF; +#ifndef BASOP_NOGLOB + m = mac_r( SqrtTable[index], SqrtDiffTable[index], frac ); +#else /* BASOP_NOGLOB */ + m = mac_ro( SqrtTable[index], SqrtDiffTable[index], frac, &Overflow ); +#endif /* BASOP_NOGLOB */ + BASOP_SATURATE_WARNING_ON; + } + + /* handle odd exponents */ + if ( s_and( e, 1 ) != 0 ) + m = mult_r( m, 0x5a82 ); + + return m; +} + + +Word16 Sqrt16( /*!< output mantissa */ + Word16 mantissa, /*!< input mantissa */ + Word16 *exponent /*!< pointer to exponent */ +) +{ + Word16 preShift, e; + + assert( mantissa >= 0 ); + + /* normalize */ + preShift = norm_s( mantissa ); + + e = sub( *exponent, preShift ); + mantissa = shl( mantissa, preShift ); + + /* calc mantissa */ + mantissa = Sqrt16_common( mantissa, e ); + + /* e = (e + 1) >> 1 */ + *exponent = mult_r( e, 1 << 14 ); + move16(); + + return mantissa; +} + +Word16 Inv16( /*!< output mantissa */ + Word16 mantissa, /*!< input mantissa */ + Word16 *exponent /*!< pointer to exponent */ +) +{ + Word16 index, frac; + Word16 preShift; + Word16 m, e; + + assert( mantissa != 0 ); + + /* absolute */ + BASOP_SATURATE_WARNING_OFF; + m = abs_s( mantissa ); + BASOP_SATURATE_WARNING_ON; + + /* normalize */ + preShift = norm_s( m ); + + e = sub( *exponent, preShift ); + m = shl( m, preShift ); + + /* get table index (upper 6 bits minus 32) */ + /* index = (m >> 9) - 32; */ + index = mac_r( -32768 - ( 32 << 16 ), m, 1 << 6 ); + + /* get fractional part for interpolation (lower 9 bits) */ + frac = shl( s_and( m, 0x1FF ), 1 ); /* Q10 */ + + /* interpolate */ + m = msu_r( InvTable[index], InvDiffTable[index], frac ); + + /* restore sign */ + if ( mantissa < 0 ) + m = negate( m ); + + /* e = 1 - e */ + *exponent = sub( 1, e ); + move16(); + + return m; +} + + +void BASOP_Util_Sqrt_InvSqrt_MantExp( + Word16 mantissa, /*!< mantissa */ + Word16 exponent, /*!< expoinent */ + Word16 *sqrt_mant, /*!< Pointer to sqrt mantissa */ + Word16 *sqrt_exp, /*!< Pointer to sqrt exponent */ + Word16 *isqrt_mant, /*!< Pointer to 1/sqrt mantissa */ + Word16 *isqrt_exp /*!< Pointer to 1/sqrt exponent */ +) +{ + Word16 index, frac; + Word16 preShift; + Word16 m, mi, e_odd; + + assert( mantissa > 0 ); + + /* normalize */ + preShift = norm_s( mantissa ); + + exponent = sub( exponent, preShift ); + mantissa = shl( mantissa, preShift ); + + /* get table index (upper 6 bits minus 32) */ + /* index = (m >> 9) - 32; */ + index = mac_r( -32768 - ( 32 << 16 ), mantissa, 1 << 6 ); + + /* get fractional part for interpolation (lower 9 bits) */ + frac = s_and( mantissa, 0x1FF ); /* Q9 */ + + /* interpolate */ + BASOP_SATURATE_WARNING_OFF; + m = mac_r( SqrtTable[index], SqrtDiffTable[index], frac ); + mi = msu_r( ISqrtTable[index], ISqrtDiffTable[index], frac ); + BASOP_SATURATE_WARNING_ON; + + /* handle even/odd exponents */ + e_odd = s_and( exponent, 1 ); + if ( e_odd != 0 ) + m = mult_r( m, 0x5a82 ); + if ( e_odd == 0 ) + mi = mult_r( mi, 0x5a82 ); + + /* e = (e + 1) >> 1 */ + *sqrt_exp = mult_r( exponent, 1 << 14 ); + move16(); + + /* e = (2 - e) >> 1 */ + *isqrt_exp = msu_r( 1L << 15, exponent, 1 << 14 ); + move16(); + + /* Write result */ + *sqrt_mant = m; + move16(); + *isqrt_mant = mi; + move16(); +} + +/********************************************************************/ +/*! + \brief Calculates the scalefactor needed to normalize input array + + The scalefactor needed to normalize the Word32 input array is returned
+ If the input array contains only '0', a scalefactor 0 is returned
+ Scaling factor is determined wrt a normalized target x: 1073741824 <= x <= 2147483647 for positive x
+ and -2147483648 <= x <= -1073741824 for negative x +*/ + +/*! r: measured headroom in range [0..31], 0 if all x[i] == 0 */ +Word16 getScaleFactor32( + const Word32 *x, /* i : array containing 32-bit data */ + const Word16 len_x ) /* i : length of the array to scan */ +{ + Word16 i, i_min, i_max; + Word32 x_min, x_max; + + x_max = L_add( 0, 0 ); + x_min = L_add( 0, 0 ); + FOR( i = 0; i < len_x; i++ ) + { + if ( x[i] >= 0 ) + x_max = L_max( x_max, x[i] ); + if ( x[i] < 0 ) + x_min = L_min( x_min, x[i] ); + } + + i_max = 0x20; + move16(); + i_min = 0x20; + move16(); + + if ( x_max != 0 ) + i_max = norm_l( x_max ); + + if ( x_min != 0 ) + i_min = norm_l( x_min ); + + i = s_and( s_min( i_max, i_min ), 0x1F ); + + return i; +} + + +Word16 BASOP_Util_Divide1616_Scale( + Word16 x, + Word16 y, + Word16 *s ) +{ + Word16 z; + Word16 sx; + Word16 sy; + Word16 sign; + + /* assert (x >= (Word16)0); */ + assert( y != (Word16) 0 ); + + sign = 0; + move16(); + + IF( x < 0 ) + { + x = negate( x ); + sign = s_xor( sign, 1 ); + } + + IF( y < 0 ) + { + y = negate( y ); + sign = s_xor( sign, 1 ); + } + + IF( x == (Word16) 0 ) + { + move16(); + *s = 0; + + return ( (Word16) 0 ); + } + + sx = norm_s( x ); + x = shl( x, sx ); + x = shr( x, 1 ); + move16(); + *s = sub( 1, sx ); + + sy = norm_s( y ); + y = shl( y, sy ); + move16(); + *s = add( *s, sy ); + + z = div_s( x, y ); + + if ( sign != 0 ) + { + z = negate( z ); + } + + return z; +} + + +void set_val_Word16( + Word16 X[], + const Word16 val, + Word16 n ) +{ + Word16 i; + + + FOR( i = 0; i < n; i++ ) + { + X[i] = val; + move16(); + } + + + return; +} + +void set_val_Word32( + Word32 X[], + const Word32 val, + Word16 n ) +{ + Word16 i; + + + FOR( i = 0; i < n; i++ ) + { + X[i] = val; + move32(); + } + + + return; +} + +Word16 mult0( + Word16 x, + Word16 y ) +{ + return extract_l( L_mult0( x, y ) ); +} + + +#define SINETAB SineTable512_fx +#define LD 9 + +/* + * Calculates coarse lookup values for sine/cosine and residual angle. + * \param x angle in radians with exponent = 2 or as radix 2 with exponent = 0. + * \param scale shall always be 2 + * \param sine pointer to where the sine lookup value is stored into + * \param cosine pointer to where the cosine lookup value is stored into + * \param flag_radix2 flag indicating radix 2 angle if non-zero. + */ +static Word16 fixp_sin_cos_residual_16( + Word16 x, + const Word16 scale, + Word16 *sine, + Word16 *cosine, + Word8 flag_radix2 ) +{ + Word16 residual; + Word16 s; + Word16 ssign; + Word16 csign; + Word16 tmp, cl = 0, sl = 0; + const Word16 shift = 15 - LD - 1 - scale; + + if ( flag_radix2 == 0 ) + { + x = mult_r( x, FL2WORD16( 1.0 / EVS_PI ) ); + } + s = shr( x, shift ); + + residual = s_and( x, ( 1 << shift ) - 1 ); + /* We assume "2+scale" is a constant */ + residual = shl( residual, 2 + scale ); + residual = mult_r( residual, FL2WORD16( EVS_PI / 4.0 ) ); + + /* Sine sign symmetry */ + ssign = s_and( s, ( 1 << LD ) << 1 ); + + /* Cosine sign symmetry */ + csign = s_and( add( s, ( 1 << LD ) ), ( 1 << LD ) << 1 ); + + /* Modulo EVS_PI */ + s = s_and( s, ( 2 << LD ) - 1 ); + + /* EVS_PI/2 symmetry */ + s = s_min( s, sub( 2 << LD, s ) ); + + { + tmp = s_min( sub( 1 << LD, s ), s ); + s = sub( tmp, s ); + + if ( !s ) + { + move16(); + sl = SINETAB[tmp].v.im; + } + if ( !s ) + { + move16(); + cl = SINETAB[tmp].v.re; + } + if ( s ) + { + move16(); + sl = SINETAB[tmp].v.re; + } + if ( s ) + { + move16(); + cl = SINETAB[tmp].v.im; + } + + if ( ssign ) + { + sl = negate( sl ); + } + if ( csign ) + { + cl = negate( cl ); + } + + move16(); + move16(); + *sine = sl; + *cosine = cl; + } + + return residual; +} + + +Word16 getCosWord16R2( + Word16 theta ) +{ + Word16 result, residual, sine, cosine; + + residual = fixp_sin_cos_residual_16( theta, 1, &sine, &cosine, 1 ); + /* This negation prevents the subsequent addition from overflow */ + /* The negation cannot overflow, sine is in range [0x0..0x7FFF] */ + BASOP_SATURATE_WARNING_OFF + sine = negate( sine ); + result = msu_r( L_mult( sine, residual ), cosine, -32768 ); + BASOP_SATURATE_WARNING_ON + + return result; +} + + +Word16 idiv1616U( + Word16 x, + Word16 y ) +{ + Word16 s; + Word16 tmp; + + /* make y > x */ + s = add( sub( norm_s( y ), norm_s( x ) ), 1 ); + s = s_max( s, 0 ); + + BASOP_SATURATE_WARNING_OFF + y = shl( y, s ); + BASOP_SATURATE_WARNING_ON + + /* divide and shift */ + tmp = div_s( x, y ); + y = shr( tmp, sub( 15, s ) ); + + return y; +} + +Word32 BASOP_util_Pow2( + const Word32 exp_m, + const Word16 exp_e, + Word16 *result_e ) +{ + static const Word16 pow2Coeff[8] = { + FL2WORD16( 0.693147180559945309417232121458177 ), /* ln(2)^1 /1! */ + FL2WORD16( 0.240226506959100712333551263163332 ), /* ln(2)^2 /2! */ + FL2WORD16( 0.0555041086648215799531422637686218 ), /* ln(2)^3 /3! */ + FL2WORD16( 0.00961812910762847716197907157365887 ), /* ln(2)^4 /4! */ + FL2WORD16( 0.00133335581464284434234122219879962 ), /* ln(2)^5 /5! */ + FL2WORD16( 1.54035303933816099544370973327423e-4 ), /* ln(2)^6 /6! */ + FL2WORD16( 1.52527338040598402800254390120096e-5 ), /* ln(2)^7 /7! */ + FL2WORD16( 1.32154867901443094884037582282884e-6 ) /* ln(2)^8 /8! */ + }; + + Word32 frac_part = 0, tmp_frac, result_m; + Word16 int_part = 0; + + IF( exp_e > 0 ) + { + /* "+ 1" compensates L_shr(,1) of the polynomial evaluation at the loop end. */ + + int_part = add( 1, extract_l( L_shr( exp_m, sub( 31, exp_e ) ) ) ); + frac_part = L_lshl( exp_m, exp_e ); + frac_part = L_and( 0x7FFFFFFF, frac_part ); + } + if ( exp_e <= 0 ) + frac_part = L_shl( exp_m, exp_e ); + if ( exp_e <= 0 ) + { + int_part = 1; + move16(); + } + + /* Best accuracy is around 0, so try to get there with the fractional part. */ + IF( ( tmp_frac = L_sub( frac_part, FL2WORD32( 0.5 ) ) ) >= 0 ) + { + int_part = add( int_part, 1 ); + frac_part = L_sub( tmp_frac, FL2WORD32( 0.5 ) ); + } + ELSE IF( ( tmp_frac = L_add( frac_part, FL2WORD32( 0.5 ) ) ) < 0 ) + { + int_part = sub( int_part, 1 ); + frac_part = L_add( tmp_frac, FL2WORD32( 0.5 ) ); + } + + /* Evaluate taylor polynomial which approximates 2^x */ + { + Word32 p; + Word16 i; + + + /* First taylor series coefficient a_0 = 1.0, scaled by 0.5 due to L_shr(,1). */ + result_m = L_add( FL2WORD32( 1.0 / 2.0 ), L_shr( Mpy_32_16( frac_part, pow2Coeff[0] ), 1 ) ); + p = Mpy_32_32( frac_part, frac_part ); + FOR( i = 1; i < 7; i++ ) + { + /* next taylor series term: a_i * x^i, x=0 */ + result_m = L_add( result_m, L_shr( Mpy_32_16( p, pow2Coeff[i] ), 1 ) ); + p = Mpy_32_32( p, frac_part ); + } + result_m = L_add( result_m, L_shr( Mpy_32_16( p, pow2Coeff[i] ), 1 ) ); + } + *result_e = int_part; + move16(); + + return result_m; +} + +/*! r: result of division x/y, not normalized */ +Word16 BASOP_Util_Divide3216_Scale( + Word32 x, /* i : numerator, signed */ + Word16 y, /* i : denominator, signed */ + Word16 *s ) /* o : scaling, 0, if x==0 */ +{ + Word16 z; + Word16 sx; + Word16 sy; + Word16 sign; + + /*assert (x > (Word32)0); + assert (y >= (Word16)0);*/ + + /* check, if numerator equals zero, return zero then */ + IF( x == (Word32) 0 ) + { + *s = 0; + move16(); + + return ( (Word16) 0 ); + } + + sign = s_xor( extract_h( x ), y ); /* just to exor the sign bits */ + BASOP_SATURATE_WARNING_OFF + x = L_abs( x ); + y = abs_s( y ); + BASOP_SATURATE_WARNING_ON + sx = sub( norm_l( x ), 1 ); + x = L_shl( x, sx ); + sy = norm_s( y ); + y = shl( y, sy ); + *s = sub( sy, sx ); + move16(); + + z = div_s( round_fx( x ), y ); + + if ( sign < 0 ) /* if sign bits differ, negate the result */ + { + z = negate( z ); + } + + return z; +} + + +static const Word16 table_pow2[32] = { + 16384, 16743, 17109, 17484, 17867, 18258, 18658, 19066, 19484, 19911, + 20347, 20792, 21247, 21713, 22188, 22674, 23170, 23678, 24196, 24726, + 25268, 25821, 26386, 26964, 27554, 28158, 28774, 29405, 30048, 30706, + 31379, 32066 +}; +/* table of table_pow2[i+1] - table_pow2[i] */ +static const Word16 table_pow2_diff_x32[32] = { + 11488, 11712, 12000, 12256, 12512, 12800, 13056, 13376, 13664, 13952, + 14240, 14560, 14912, 15200, 15552, 15872, 16256, 16576, 16960, 17344, + 17696, 18080, 18496, 18880, 19328, 19712, 20192, 20576, 21056, 21536, + 21984, 22432 +}; + +Word32 Pow2( /* o Q0 : result (range: 0<=val<=0x7fffffff) */ + Word16 exponant, /* i Q0 : Integer part. (range: 0<=val<=30) */ + Word16 fraction /* i Q15 : Fractional part. (range: 0.0<=val<1.0) */ +) +{ + Word16 exp, i, a; + Word32 L_x; + + i = mac_r( -32768, fraction, 32 ); /* Extract b10-b16 of fraction */ + a = s_and( fraction, 0x3ff ); /* Extract b0-b9 of fraction */ + + L_x = L_deposit_h( table_pow2[i] ); /* table[i] << 16 */ + L_x = L_mac( L_x, table_pow2_diff_x32[i], a ); /* L_x -= diff*a*2 */ + + exp = sub( 30, exponant ); + + L_x = L_shr_r( L_x, exp ); + + return L_x; +} + +/************************************************************************* + * + * FUNCTION: Log2_norm() + * + * PURPOSE: Computes log2(L_x, exp), where L_x is positive and + * normalized, and exp is the normalisation exponent + * If L_x is negative or zero, the result is 0. + * + * DESCRIPTION: + * The function Log2(L_x) is approximated by a table and linear + * interpolation. The following steps are used to compute Log2(L_x) + * + * 1- exponent = 30-norm_exponent + * 2- i = bit25-b31 of L_x; 32<=i<=63 (because of normalization). + * 3- a = bit10-b24 + * 4- i -=32 + * 5- fraction = table[i]<<16 - (table[i] - table[i+1]) * a * 2 + * + *************************************************************************/ + +static const Word32 L_table[32] = { + -32768L, 95322112L, 187793408L, 277577728L, + 364871680L, 449740800L, 532381696L, 612859904L, + 691306496L, 767787008L, 842432512L, 915308544L, + 986546176L, 1056210944L, 1124302848L, 1190887424L, + 1256095744L, 1319993344L, 1382580224L, 1443921920L, + 1504083968L, 1563131904L, 1621000192L, 1677885440L, + 1733722112L, 1788510208L, 1842380800L, 1895399424L, + 1947435008L, 1998618624L, 2049015808L, 2098626560L +}; + +static const Word16 table_diff[32] = { + 1455, 1411, 1370, 1332, 1295, 1261, 1228, 1197, + 1167, 1139, 1112, 1087, 1063, 1039, 1016, 995, + 975, 955, 936, 918, 901, 883, 868, 852, + 836, 822, 809, 794, 781, 769, 757, 744 +}; + +Word16 Log2_norm_lc( /* o : Fractional part of Log2. (range: 0<=val<1) */ + Word32 L_x /* i : input value (normalized) */ +) +{ + Word16 i, a; + Word16 y; + + + L_x = L_shr( L_x, 9 ); + a = extract_l( L_x ); /* Extract b10-b24 of fraction */ + a = lshr( a, 1 ); + + i = mac_r( L_x, -32 * 2 - 1, 16384 ); /* Extract b25-b31 minus 32 */ + + y = mac_r( L_table[i], table_diff[i], a ); /* table[i] << 16 - diff*a*2 */ + + + return y; +} + + +Word32 BASOP_Util_fPow( + Word32 base_m, + Word16 base_e, + Word32 exp_m, + Word16 exp_e, + Word16 *result_e ) +{ + + Word16 ans_lg2_e, base_lg2_e; + Word32 base_lg2_m, ans_lg2_m, result_m; + Word16 shift; + + test(); + IF( ( base_m == 0 ) && ( exp_m != 0 ) ) + { + *result_e = 0; + move16(); + return 0; + } + /* Calc log2 of base */ + shift = norm_l( base_m ); + base_m = L_shl( base_m, shift ); + base_e = sub( base_e, shift ); + base_lg2_m = BASOP_Util_Log2( base_m ); + + /* shift: max left shift such that neither base_e or base_lg2_m saturate. */ + shift = sub( s_min( norm_s( base_e ), WORD16_BITS - 1 - LD_DATA_SCALE ), 1 ); + /* Compensate shift into exponent of result. */ + base_lg2_e = sub( WORD16_BITS - 1, shift ); + base_lg2_m = L_add( L_shr( base_lg2_m, sub( WORD16_BITS - 1 - LD_DATA_SCALE, shift ) ), L_deposit_h( shl( base_e, shift ) ) ); + + /* Prepare exp */ + shift = norm_l( exp_m ); + exp_m = L_shl( exp_m, shift ); + exp_e = sub( exp_e, shift ); + + /* Calc base pow exp */ + ans_lg2_m = Mpy_32_32( base_lg2_m, exp_m ); + ans_lg2_e = add( exp_e, base_lg2_e ); + + /* Calc antilog */ + result_m = BASOP_util_Pow2( ans_lg2_m, ans_lg2_e, result_e ); + + return result_m; +} + +Word32 BASOP_Util_Add_Mant32Exp /* o : normalized result mantissa */ + ( Word32 a_m, /* i : Mantissa of 1st operand a */ + Word16 a_e, /* i : Exponent of 1st operand a */ + Word32 b_m, /* i : Mantissa of 2nd operand b */ + Word16 b_e, /* i : Exponent of 2nd operand b */ + Word16 *ptr_e ) /* o : exponent of result */ +{ + Word32 L_tmp; + Word16 shift; + + /* Compare exponents: the difference is limited to +/- 30 + The Word32 mantissa of the operand with lower exponent is shifted right by the exponent difference. + Then, the unshifted mantissa of the operand with the higher exponent is added. The addition result + is normalized and the result represents the mantissa to return. The returned exponent takes into + account all shift operations. + */ + + if ( !a_m ) + a_e = add( b_e, 0 ); + + if ( !b_m ) + b_e = add( a_e, 0 ); + + shift = sub( a_e, b_e ); + shift = s_max( -31, shift ); + shift = s_min( 31, shift ); + if ( shift < 0 ) + { + /* exponent of b is greater than exponent of a, shr a_m */ + a_m = L_shl( a_m, shift ); + } + if ( shift > 0 ) + { + /* exponent of a is greater than exponent of b */ + b_m = L_shr( b_m, shift ); + } + a_e = add( s_max( a_e, b_e ), 1 ); + L_tmp = L_add( L_shr( a_m, 1 ), L_shr( b_m, 1 ) ); + shift = norm_l( L_tmp ); + if ( shift ) + L_tmp = L_shl( L_tmp, shift ); + if ( L_tmp == 0 ) + a_e = add( 0, 0 ); + if ( L_tmp != 0 ) + a_e = sub( a_e, shift ); + *ptr_e = a_e; + + return ( L_tmp ); +} + +static const Word32 L_table_isqrt[48] = { + 2147418112L, 2083389440L, 2024669184L, 1970667520L, + 1920794624L, 1874460672L, 1831403520L, 1791098880L, + 1753415680L, 1717960704L, 1684602880L, 1653145600L, + 1623326720L, 1595080704L, 1568276480L, 1542782976L, + 1518469120L, 1495334912L, 1473183744L, 1451950080L, + 1431633920L, 1412169728L, 1393491968L, 1375469568L, + 1358168064L, 1341521920L, 1325465600L, 1309933568L, + 1294991360L, 1280507904L, 1266548736L, 1252982784L, + 1239875584L, 1227161600L, 1214775296L, 1202847744L, + 1191182336L, 1179910144L, 1168965632L, 1158283264L, + 1147863040L, 1137770496L, 1127940096L, 1118306304L, + 1108934656L, 1099825152L, 1090912256L, 1082261504L +}; +/* table of table_isqrt[i] - table_isqrt[i+1] */ +static const Word16 table_isqrt_diff[48] = { + 977, 896, 824, 761, 707, 657, 615, 575, + 541, 509, 480, 455, 431, 409, 389, 371, + 353, 338, 324, 310, 297, 285, 275, 264, + 254, 245, 237, 228, 221, 213, 207, 200, + 194, 189, 182, 178, 172, 167, 163, 159, + 154, 150, 147, 143, 139, 136, 132, 130 +}; + +static const Word16 shift[] = { 9, 10 }; + +Word32 Isqrt_lc1( + Word32 frac, /* i : Q31: normalized value (1.0 < frac <= 0.5) */ + Word16 *exp /* i/o: exponent (value = frac x 2^exponent) */ +) +{ + Word16 i, a; + Word32 L_tmp; + + IF( frac <= (Word32) 0 ) + { + *exp = 0; + move16(); + return 0x7fffffff; /*0x7fffffff*/ + } + + /* If exponant odd -> shift right by 10 (otherwise 9) */ + L_tmp = L_shr( frac, shift[s_and( *exp, 1 )] ); + + /* 1) -16384 to shift left and change sign */ + /* 2) 32768 to Add 1 to Exponent like it was divided by 2 */ + /* 3) We let the mac_r add another 0.5 because it imitates */ + /* the behavior of shr on negative number that should */ + /* not be rounded towards negative infinity. */ + /* It replaces: */ + /* *exp = negate(shr(sub(*exp, 1), 1)); move16(); */ + *exp = mac_r( 32768, *exp, -16384 ); + move16(); + + a = extract_l( L_tmp ); /* Extract b10-b24 */ + a = lshr( a, 1 ); + + i = mac_r( L_tmp, -16 * 2 - 1, 16384 ); /* Extract b25-b31 minus 16 */ + + L_tmp = L_msu( L_table_isqrt[i], table_isqrt_diff[i], a ); /* table[i] << 16 - diff*a*2 */ + + return L_tmp; +} + +static const Word16 sqrt_table[49] = { + 16384, 16888, 17378, 17854, 18318, 18770, 19212, + 19644, 20066, 20480, 20886, 21283, 21674, 22058, + 22435, 22806, 23170, 23530, 23884, 24232, 24576, + 24915, 25249, 25580, 25905, 26227, 26545, 26859, + 27170, 27477, 27780, 28081, 28378, 28672, 28963, + 29251, 29537, 29819, 30099, 30377, 30652, 30924, + 31194, 31462, 31727, 31991, 32252, 32511, 32767 +}; + +/*! r: output value, Q31 */ +Word32 Sqrt_l( + Word32 L_x, /* i : input value, Q31 */ + Word16 *exp /* o : right shift to be applied to result, Q1 */ +) +{ + /* + y = sqrt(x) + + x = f * 2^-e, 0.5 <= f < 1 (normalization) + + y = sqrt(f) * 2^(-e/2) + + a) e = 2k --> y = sqrt(f) * 2^-k (k = e div 2, + 0.707 <= sqrt(f) < 1) + b) e = 2k+1 --> y = sqrt(f/2) * 2^-k (k = e div 2, + 0.5 <= sqrt(f/2) < 0.707) + */ + + Word16 e, i, a, tmp; + Word32 L_y; + + if ( L_x <= 0 ) + { + *exp = 0; + move16(); + return L_deposit_l( 0 ); + } + +#if 0 /* original version creates an overflow warning */ + e = s_and(norm_l(L_x), 0xFFFE); /* get next lower EVEN norm. exp */ +#else + e = s_and( norm_l( L_x ), 0x7FFE ); /* get next lower EVEN norm. exp */ +#endif + L_x = L_shl( L_x, e ); /* L_x is normalized to [0.25..1) */ + *exp = e; + move16(); /* return 2*exponent (or Q1) */ + + L_x = L_shr( L_x, 9 ); + a = extract_l( L_x ); /* Extract b10-b24 */ + a = lshr( a, 1 ); + + i = mac_r( L_x, -16 * 2 - 1, 16384 ); /* Extract b25-b31 minus 16 */ + + L_y = L_deposit_h( sqrt_table[i] ); /* table[i] << 16 */ + tmp = sub( sqrt_table[i], sqrt_table[i + 1] ); /* table[i] - table[i+1]) */ + L_y = L_msu( L_y, tmp, a ); /* L_y -= tmp*a*2 */ + + /* L_y = L_shr (L_y, *exp); */ /* denormalization done by caller */ + + return ( L_y ); +} + +#undef WMC_TOOL_SKIP diff --git a/lib_com/basop_util.h b/lib_com/basop_util.h new file mode 100644 index 0000000000000000000000000000000000000000..c09b8ea62ca4e8321ef2227978afb9df7aac680d --- /dev/null +++ b/lib_com/basop_util.h @@ -0,0 +1,418 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#ifndef __BASOP_UTIL_H__ +#define __BASOP_UTIL_H__ + +#include +#include "options.h" +#include "basop_settings.h" +#include "typedef.h" +#include "basop32.h" +#include "basop_mpy.h" + + +#define LD_DATA_SCALE ( 6 ) + +#define LD_DATA_SHIFT_I5 ( 7 ) + +#define modDiv2( x ) sub( x, shl( shr( x, 1 ), 1 ) ) +#define modDiv8( x ) L_sub( x, L_shl( L_shr( x, 3 ), 3 ) ) + +#ifndef CHEAP_NORM_SIZE +#define CHEAP_NORM_SIZE 161 +#endif + +static __inline Word16 limitScale16( Word16 s ) +{ + /* It is assumed, that s is calculated just before, therefore we can switch upon sign */ + if ( s >= 0 ) + s = s_min( s, WORD16_BITS - 1 ); + if ( s < 0 ) + s = s_max( s, 1 - WORD16_BITS ); + return ( s ); +} + +static __inline Word16 limitScale32( Word16 s ) +{ + /* It is assumed, that s is calculated just before, therefore we can switch upon sign */ + if ( s >= 0 ) + s = s_min( s, WORD32_BITS - 1 ); + if ( s < 0 ) + s = s_max( s, 1 - WORD32_BITS ); + return ( s ); +} + + +/*!********************************************************************** + \brief Add two values given by mantissa and exponent. + + Mantissas are in 16-bit-fractional format with values between 0 and 1.
+ The base for exponents is 2. Example: \f$ a = a\_m * 2^{a\_e} \f$
+ +************************************************************************/ +Word16 BASOP_Util_Add_MantExp /*!< Exponent of result */ + ( Word16 a_m, /*!< Mantissa of 1st operand a */ + Word16 a_e, /*!< Exponent of 1st operand a */ + Word16 b_m, /*!< Mantissa of 2nd operand b */ + Word16 b_e, /*!< Exponent of 2nd operand b */ + Word16 *ptrSum_m ); /*!< Mantissa of result */ + + +/************************************************************************/ +/*! + \brief Calculate the squareroot of a number given by mantissa and exponent + + Mantissa is in 16/32-bit-fractional format with values between 0 and 1.
+ For *norm versions mantissa has to be between 0.5 and 1.
+ The base for the exponent is 2. Example: \f$ a = a\_m * 2^{a\_e} \f$
+ The exponent is addressed via pointers and will be overwritten with the result. +*/ +Word16 Sqrt16( /*!< output mantissa */ + Word16 mantissa, /*!< input mantissa */ + Word16 *exponent /*!< pointer to exponent */ +); + +/*****************************************************************************/ +/*! + \brief Calculate the inverse of a number given by mantissa and exponent + + Mantissa is in 16-bit-fractional format with values between 0 and 1.
+ The base for the exponent is 2. Example: \f$ a = a\_m * 2^{a\_e} \f$
+ The operand is addressed via pointers and will be overwritten with the result. + + The function uses a table lookup and a newton iteration. +*/ +Word16 Inv16( /*!< output mantissa */ + Word16 mantissa, /*!< input mantissa */ + Word16 *exponent /*!< pointer to exponent */ +); + +/******************************************************************************/ +/*! + \brief Calculate the squareroot and inverse of squareroot of a number given by mantissa and exponent + + Mantissa is in 16-bit-fractional format with values between 0 and 1.
+ The base for the exponent is 2. Example: \f$ a = a\_m * 2^{a\_e} \f$
+*/ +void BASOP_Util_Sqrt_InvSqrt_MantExp( Word16 mantissa, /*!< mantissa */ + Word16 exponent, /*!< expoinent */ + Word16 *sqrt_mant, /*!< Pointer to sqrt mantissa */ + Word16 *sqrt_exp, /*!< Pointer to sqrt exponent */ + Word16 *isqrt_mant, /*!< Pointer to 1/sqrt mantissa */ + Word16 *isqrt_exp /*!< Pointer to 1/sqrt exponent */ +); + + +/********************************************************************/ +/*! + \brief Calculates the scalefactor needed to normalize input array + + The scalefactor needed to normalize the Word32 input array is returned
+ If the input array contains only '0', a scalefactor 0 is returned
+ Scaling factor is determined wrt a normalized target x: 1073741824 <= x <= 2147483647 for positive x
+ and -2147483648 <= x <= -1073741824 for negative x +*/ + +/*! r: measured headroom in range [0..31], 0 if all x[i] == 0 */ +Word16 getScaleFactor32( + const Word32 *x, /* i : array containing 32-bit data */ + const Word16 len_x ); /* i : length of the array to scan */ + +/************************************************************************/ +/*! + \brief Binary logarithm with 7 iterations + + \param x + + \return log2(x)/64 + */ +/************************************************************************/ +Word32 BASOP_Util_Log2( Word32 x ); + + +/****************************************************************************/ +/*! + \brief Does fractional division of Word16 arg1 by Word16 arg2 + + + \return fractional Q15 Word16 z = arg1(Q15)/arg2(Q15) with scaling s +*/ +Word16 BASOP_Util_Divide1616_Scale( Word16 x, /* i : Numerator*/ + Word16 y, /* i : Denominator*/ + Word16 *s ); /* o : Additional scalefactor difference*/ + +/****************************************************************************/ +/*! + \brief Does fractional integer division of Word32 arg1 by Word16 arg2 + + + \return fractional Word16 integer z = arg1(32bits)/arg2(16bits), z not normalized +*/ +Word16 BASOP_Util_Divide3216_Scale( Word32 x, /*!< i : Numerator */ + Word16 y, /*!< i : Denominator*/ + Word16 *s ); /*!< o : Additional scalefactor difference*/ + + +/************************************************************************/ +/*! + * \brief Binary logarithm with 5 iterations + * + * \param[i] val + * + * \return basop_log2(val)/128 + */ +/************************************************************************/ +Word32 BASOP_Util_log2_i5( Word32 val ); + +/************************************************************************/ +/*! + \brief Binary power + + Date: 06-JULY-2012 Arthur Tritthart, IIS Fraunhofer Erlangen + + Version with 3 table lookup and 1 linear interpolations + + Algorithm: compute power of 2, argument x is in Q7.25 format + result = 2^(x/64) + We split exponent (x/64) into 5 components: + integer part: represented by b31..b25 (exp) + fractional part 1: represented by b24..b20 (lookup1) + fractional part 2: represented by b19..b15 (lookup2) + fractional part 3: represented by b14..b10 (lookup3) + fractional part 4: represented by b09..b00 (frac) + => result = (lookup1*lookup2*(lookup3+C1*frac)<<3)>>exp + + Due to the fact, that all lookup values contain a factor 0.5 + the result has to be shifted by 3 to the right also. + Table exp2_tab_long contains the log2 for 0 to 1.0 in steps + of 1/32, table exp2w_tab_long the log2 for 0 to 1/32 in steps + of 1/1024, table exp2x_tab_long the log2 for 0 to 1/1024 in + steps of 1/32768. Since the 2-logarithm of very very small + negative value is rather linear, we can use interpolation. + + Limitations: + + For x <= 0, the result is fractional positive + For x > 0, the result is integer in range 1...7FFF.FFFF + For x < -31/64, we have to clear the result + For x = 0, the result is ~1.0 (0x7FFF.FFFF) + For x >= 31/64, the result is 0x7FFF.FFFF + + \param x + + \return pow(2,(x/64)) + */ +/************************************************************************/ +Word32 BASOP_Util_InvLog2( Word32 x ); + + +/****************************************************************************/ +/*! + \brief Sets Array Word16 arg1 to value Word16 arg2 for Word16 arg3 elements +*/ +void set_val_Word16( Word16 X[], /*!< Address of array */ + const Word16 val, /*!< Value to copy into array */ + Word16 n ); /*!< Number of elements to process */ + + +/****************************************************************************/ +/*! + \brief Sets Array Word32 arg1 to value Word32 arg2 for Word16 arg3 elements +*/ +void set_val_Word32( Word32 X[], /*!< Address of array */ + const Word32 val, /*!< Value to copy into array */ + Word16 n ); /*!< Number of elements to process */ + +/****************************************************************************/ +/*! + \brief Does a multiplication of Word16 input values + + \return z16 = x16 * y16 +*/ +Word16 mult0( Word16 x, /* i : Multiplier */ + Word16 y ); /* i : Multiplicand */ + +/** + * \brief calculate cosine of angle. Tuned for ISF domain. + * \param theta Angle normalized to radix 2, theta = (angle in radians)*2.0/pi + * \return result with exponent 0. + */ +Word16 getCosWord16R2( Word16 theta ); + +/****************************************************************************/ +/*! + \brief 16/16->16 unsigned integer division + + x and y have to be positive, x has to be < 16384 + + \return 16/16->16 integer + */ + +Word16 idiv1616U( Word16 x, Word16 y ); + + +/** + * \brief return 2 ^ (exp * 2^exp_e) + * \param exp_m mantissa of the exponent to 2.0f + * \param exp_e exponent of the exponent to 2.0f + * \param result_e pointer to a INT where the exponent of the result will be stored into + * \return mantissa of the result + */ +Word32 BASOP_util_Pow2( + const Word32 exp_m, + const Word16 exp_e, + Word16 *result_e ); + + +Word32 Isqrt_lc1( + Word32 frac, /* i : Q31: normalized value (1.0 < frac <= 0.5) */ + Word16 *exp /* i/o: exponent (value = frac x 2^exponent) */ +); + +/*****************************************************************************/ +/*! + + \brief Calculates pow(2,x) + ___________________________________________________________________________ + | | + | Function Name : Pow2() | + | | + | L_x = pow(2.0, exponant.fraction) (exponent = interger part) | + | = pow(2.0, 0.fraction) << exponent | + |---------------------------------------------------------------------------| + | Algorithm: | + | | + | The function Pow2(L_x) is approximated by a table and linear | + | interpolation. | + | | + | 1- i = bit10-b15 of fraction, 0 <= i <= 31 | + | 2- a = bit0-b9 of fraction | + | 3- L_x = table[i]<<16 - (table[i] - table[i+1]) * a * 2 | + | 4- L_x = L_x >> (30-exponant) (with rounding) | + |___________________________________________________________________________| +*/ +Word32 Pow2( /* o : Q0 : result (range: 0<=val<=0x7fffffff) */ + Word16 exponant, /* i : Q0 : Integer part. (range: 0<=val<=30) */ + Word16 fraction /* i : Q15 : Fractionnal part. (range: 0.0<=val<1.0) */ +); + +/************************************************************************* + * + * FUNCTION: Log2_norm() + * + * PURPOSE: Computes log2(L_x, exp), where L_x is positive and + * normalized, and exp is the normalisation exponent + * If L_x is negative or zero, the result is 0. + * + * DESCRIPTION: + * The function Log2(L_x) is approximated by a table and linear + * interpolation. The following steps are used to compute Log2(L_x) + * + * 1- exponent = 30-norm_exponent + * 2- i = bit25-b31 of L_x; 32<=i<=63 (because of normalization). + * 3- a = bit10-b24 + * 4- i -=32 + * 5- fraction = table[i]<<16 - (table[i] - table[i+1]) * a * 2 + * + *************************************************************************/ + +Word16 Log2_norm_lc( /* o : Fractional part of Log2. (range: 0<=val<1) */ + Word32 L_x /* i : input value (normalized) */ +); + +/************************************************************************* + * + * FUNCTION: BASOP_Util_fPow() + */ +/** + * \brief BASOP_Util_fPow + * + * PURPOSE: Computes pow(base_m, base_e, exp_m, exp_e), where base_m and base_e + * specify the base, and exp_m and exp_e specify the exponent. + * The result is returned in a mantissa and exponent representation. + * + * DESCRIPTION: + * The function BASOP_Util_fPow(L_x) calculates the power function by + * calculating 2 ^ (log2(base)*exp) + * + * \param base_m mantissa of base + * \param base_e exponent of base + * \param exp_m mantissa of exponent + * \param exp_e exponent of exponent + * \param result_e pointer to exponent of result + * \return Word32 mantissa of result + * + *************************************************************************/ + +Word32 BASOP_Util_fPow( /* o : mantissa of result */ + Word32 base_m, + Word16 base_e, /* i : input value for base (mantissa and exponent) */ + Word32 exp_m, + Word16 exp_e, /* i : input value for exponent (mantissa and exponent) */ + Word16 *result_e /* o : output pointer to exponent of result */ +); + +/*!********************************************************************** + \brief Add two values given by mantissa and exponent. + + Mantissas are in 32-bit-fractional format with values between 0 and 1.
+ The base for exponents is 2. Example: \f$ a = a\_m * 2^{a\_e} \f$
+ +************************************************************************/ +Word32 BASOP_Util_Add_Mant32Exp /* o : normalized result mantissa */ + ( Word32 a_m, /* i : Mantissa of 1st operand a */ + Word16 a_e, /* i : Exponent of 1st operand a */ + Word32 b_m, /* i : Mantissa of 2nd operand b */ + Word16 b_e, /* i : Exponent of 2nd operand b */ + Word16 *ptr_e ); /* o : exponent of result */ + +/****************************************************************************/ +/*! + \brief Accumulates multiplications + + Accumulates the elementwise multiplications of Word32 Array X with Word16 Array Y + pointed to by arg1 and arg2 with specified headroom. Length of to be multiplied arrays is arg3, + headroom with has to be taken into account is specified in arg4 + + \return Word32 result of accumulated multiplications over Word32 array arg1 and Word16 array arg2 and Word16 pointer + to exponent correction factor which needs to be added to the exponent of the result vector +*/ +Word32 dotWord32_16_guards( const Word32 *X, const Word16 *Y, Word16 n, Word16 hr, Word16 *shift ); + +Word32 Sqrt_l( Word32 L_x, Word16 *exp ); + +#endif /* __BASOP_UTIL_H__ */ diff --git a/lib_com/bitalloc.c b/lib_com/bitalloc.c new file mode 100644 index 0000000000000000000000000000000000000000..351ab9e3a80b0334617b43c5960413fa35b42f4a --- /dev/null +++ b/lib_com/bitalloc.c @@ -0,0 +1,1022 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "basop_util.h" +#include "basop_proto_func.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------------- + * bitalloc() + * + * Adaptive bit allocation for 20kHz audio codec + *--------------------------------------------------------------------------*/ + +void bitalloc( + int16_t *y, /* i : reordered norm of sub-vectors */ + int16_t *idx, /* i : reordered sub-vector indices */ + int16_t sum, /* i : number of available bits */ + int16_t N, /* i : number of norms */ + int16_t K, /* i : maximum number of bits per dimension */ + int16_t *r, /* o : bit-allacation vector */ + const int16_t *sfmsize, /* i : band length */ + const int16_t hqswb_clas /* i : signal classification flag */ +) +{ + int16_t i, j, k, n, m, v, im; + int16_t diff, temp; + int16_t fac; + int16_t ii; + int16_t SFM_thr = SFM_G1G2; + + N -= 1; + + if ( hqswb_clas == HQ_HARMONIC ) + { + SFM_thr = 22; + } + + fac = 3; + K -= 2; + im = 1; + diff = sum; + n = sum >> 3; + for ( i = 0; i < n; i++ ) + { + k = 0; + temp = y[0]; + for ( m = 1; m < im; m++ ) + { + if ( temp < y[m] ) + { + temp = y[m]; + k = m; + } + } + + if ( temp < y[m] ) + { + k = m; + if ( im < N ) + { + im++; + } + } + + j = idx[k]; + if ( sum >= sfmsize[j] && r[j] < K ) + { + y[k] -= fac; + r[j]++; + if ( r[j] >= K ) + { + y[k] = MIN16B; + } + sum -= sfmsize[j]; + } + else + { + y[k] = MIN16B; + k++; + if ( k == im && im < N ) + { + im++; + } + } + + if ( sum < sfmsize[SFM_G1 - 1] || diff == sum ) /* sfmsize[SFM_G1-1] matches WID_G1, but also allows for extended BWs used in ACELP->HQ switching. */ + { + break; + } + + diff = sum; + v = N - 1; + + if ( k > v ) + { + for ( ii = 0; ii <= N; ii++ ) + { + if ( y[ii] > MIN16B ) + { + if ( ii < N ) + { + im = ii + 1; + } + + break; + } + } + } + } + + if ( sum >= sfmsize[SFM_G1] ) /* sfmsize[SFM_G1] matches WID_G2, but also allows for extended BWs used in ACELP->HQ switching. */ + { + for ( i = 0; i <= N; i++ ) + { + j = idx[i]; + if ( j >= SFM_G1 && j < SFM_thr && r[j] == 0 ) + { + r[j] = 1; + sum -= sfmsize[j]; + if ( sum < sfmsize[SFM_G1] ) + { + break; + } + } + } + } + + if ( sum >= sfmsize[SFM_G1] ) + { + for ( i = 0; i <= N; i++ ) + { + j = idx[i]; + if ( j >= SFM_G1 && j < SFM_thr && r[j] == 1 ) + { + r[j] = 2; + sum -= sfmsize[j]; + if ( sum < sfmsize[SFM_G1] ) + { + break; + } + } + } + } + + if ( sum >= sfmsize[SFM_G1 - 1] ) + { + for ( i = 0; i <= N; i++ ) + { + j = idx[i]; + if ( j < SFM_G1 && r[j] == 0 ) + { + r[j] = 1; + sum -= sfmsize[j]; + if ( sum < sfmsize[SFM_G1 - 1] ) + { + break; + } + } + } + } + + if ( sum >= sfmsize[SFM_G1 - 1] ) + { + for ( i = 0; i <= N; i++ ) + { + j = idx[i]; + if ( j < SFM_G1 && r[j] == 1 ) + { + r[j] = 2; + sum -= sfmsize[j]; + if ( sum < sfmsize[SFM_G1 - 1] ) + { + break; + } + } + } + } + + return; +} + + +#define WMC_TOOL_SKIP + +/*-------------------------------------------------------------------* + * BitAllocF() + * + * Fractional bit allocation + *-------------------------------------------------------------------*/ + +/*! r: Integer (truncated) number of allocated bits */ +int16_t BitAllocF( + int16_t *y, /* i : norm of sub-vectors */ + int32_t bit_rate, /* i : bitrate */ + int16_t B, /* i : number of available bits */ + int16_t N, /* i : number of sub-vectors */ + int16_t *R, /* o : bit-allocation indicator */ + int16_t *Rsubband, /* o : sub-band bit-allocation vector (Q3) */ + const int16_t hqswb_clas, /* i : hq swb class */ + const int16_t num_env_bands /* i : Number sub bands to be encoded for HQ_SWB_BWE */ +) +{ + Word16 fac; + Word16 i, n, Nmin, Bits, bs, low_rate = 0; + + Word16 m_fx; + Word32 t_fx, B_fx; + Word32 L_tmp1, L_tmp2; + Word16 tmp, exp1, exp2; + Word32 Rsubband_w32_fx[NB_SFM]; /* Q15 */ + Word16 B_w16_fx; +#ifdef BASOP_NOGLOB + Flag Overflow; +#endif /* BASOP_NOGLOB */ + + set_l( Rsubband_w32_fx, 0, NB_SFM ); + + fac = 3; + if ( L_sub( bit_rate, 32000 ) < 0 ) + { + bs = 2; + } + else + { + bs = 3; + } + low_rate = 1; + + Nmin = N; + if ( sub( Nmin, SFM_N ) > 0 ) + { + Nmin = SFM_N; + } + + /* Initial bits distribution */ + if ( sub( hqswb_clas, HQ_GEN_SWB ) == 0 || sub( hqswb_clas, HQ_GEN_FB ) == 0 ) + { + /* Initial bits distribution */ + L_tmp1 = 0; + m_fx = 0; + for ( i = 0; i < num_env_bands; i++ ) + { + L_tmp1 = L_mac0( L_tmp1, Nb[i], y[i] ); + } + L_tmp1 = L_msu0( L_tmp1, fac, B ); + + t_fx = 0; + n = 0; + tmp = add( band_end_HQ[num_env_bands - 1], shl( band_end_HQ[num_env_bands - 1], 1 ) ); + exp1 = norm_s( tmp ); + tmp = div_s( 16384, shl( tmp, exp1 ) ); /*15 + 14 - exp1*/ + exp2 = norm_s( tmp ); + tmp = shl( tmp, exp2 ); + exp1 = add( 29, sub( exp2, exp1 ) ); + + for ( i = 0; i < N; i++ ) + { + L_tmp2 = L_sub( L_mult0( y[i], band_end_HQ[num_env_bands - 1] ), L_tmp1 ); + Rsubband_w32_fx[i] = L_mult0( extract_l( L_tmp2 ), Nb[i] ); + move32(); /*Q0*/ + if ( Rsubband_w32_fx[i] > 0 ) + { + n = add( n, Nb[i] ); + Rsubband_w32_fx[i] = Mpy_32_16( Rsubband_w32_fx[i], tmp ); + move32(); /*exp1 - 15*/ + Rsubband_w32_fx[i] = L_shl( Rsubband_w32_fx[i], sub( 30, exp1 ) ); /*Q15*/ + + t_fx = L_add( t_fx, Rsubband_w32_fx[i] ); /*Q0*/ + } + else + { + Rsubband_w32_fx[i] = 0; + move32(); + } + } + } + else + { + /* Initial bits distribution */ + L_tmp1 = 0; + m_fx = 0; + for ( i = 0; i < N; i++ ) + { + L_tmp1 = L_mac0( L_tmp1, Nb[i], y[i] ); + } + L_tmp1 = L_msu0( L_tmp1, fac, B ); + + + t_fx = 0; + n = 0; + tmp = add( band_end_HQ[N - 1], shl( band_end_HQ[N - 1], 1 ) ); + exp1 = norm_s( tmp ); + tmp = div_s( 16384, shl( tmp, exp1 ) ); /*15 + 14 - exp1*/ + exp2 = norm_s( tmp ); + tmp = shl( tmp, exp2 ); + exp1 = add( 29, sub( exp2, exp1 ) ); + for ( i = 0; i < N; i++ ) + { + L_tmp2 = L_sub( L_mult0( y[i], band_end_HQ[N - 1] ), L_tmp1 ); + Rsubband_w32_fx[i] = L_mult0( extract_l( L_tmp2 ), Nb[i] ); + move32(); /*Q0*/ + if ( Rsubband_w32_fx[i] > 0 ) + { + n = add( n, Nb[i] ); + Rsubband_w32_fx[i] = Mpy_32_16( Rsubband_w32_fx[i], tmp ); + move32(); /*exp1 - 15*/ + Rsubband_w32_fx[i] = L_shl( Rsubband_w32_fx[i], sub( 30, exp1 ) ); /*Q15*/ + + t_fx = L_add( t_fx, Rsubband_w32_fx[i] ); /*Q0*/ + } + else + { + Rsubband_w32_fx[i] = 0; + move32(); + } + } + } + + /* Distribute the remaining bits to subbands with non-zero bits */ + B_fx = L_shl( B, 15 ); + WHILE( L_sub( L_shr( L_add( t_fx, 16384 ), 15 ), B ) != 0 ) + { + L_tmp1 = L_sub( t_fx, B_fx ); + exp1 = sub( norm_l( L_tmp1 ), 1 ); + exp2 = norm_s( n ); + tmp = div_s( extract_h( L_shl( L_tmp1, exp1 ) ), shl( n, exp2 ) ); /*15 + 15 + exp1 - 16 - exp2*/ +#ifndef BASOP_NOGLOB + m_fx = shl( tmp, sub( exp2, exp1 ) ); /*Q14*/ +#else + m_fx = shl_o( tmp, sub( exp2, exp1 ), &Overflow ); /*Q14*/ +#endif + + t_fx = 0; + n = 0; + for ( i = 0; i < N; i++ ) + { + if ( Rsubband_w32_fx[i] > 0 ) + { + Rsubband_w32_fx[i] = L_msu( Rsubband_w32_fx[i], m_fx, Nb[i] ); + move32(); + + if ( Rsubband_w32_fx[i] > 0 ) + { + n = add( n, Nb[i] ); + + t_fx = L_add( t_fx, Rsubband_w32_fx[i] ); + } + else + { + Rsubband_w32_fx[i] = 0; + move32(); + } + } + } + } + Bits = B; + + /* Impose bit-constraints to subbands with less than minimum bits*/ + t_fx = 0; + n = 0; + for ( i = 0; i < N; i++ ) + { + if ( Rsubband_w32_fx[i] > 0 ) + { + test(); + test(); + if ( ( L_sub( Rsubband_w32_fx[i], L_shl( add( bs, LNb[i] ), 15 ) ) < 0 ) && ( sub( low_rate, 1 ) == 0 ) ) + { + Rsubband_w32_fx[i] = 0; + move32(); + } + else if ( L_sub( Rsubband_w32_fx[i], L_shl( Nb[i], 15 ) ) <= 0 ) + { + B = sub( B, Nb[i] ); + Rsubband_w32_fx[i] = L_shl( Nb[i], 15 ); + move32(); + } + else + { + n = add( n, Nb[i] ); + t_fx = L_add( t_fx, Rsubband_w32_fx[i] ); + } + } + } + + /* Distribute the remaining bits to subbands with more than 1-bit per sample */ + WHILE( L_sub( L_shr( L_add( t_fx, 16384 ), 15 ), B ) != 0 ) + { + L_tmp1 = L_sub( t_fx, L_shl( B, 15 ) ); + L_tmp2 = L_abs( L_tmp1 ); + + if ( n > 0 ) + { + exp1 = sub( norm_l( L_tmp2 ), 1 ); + exp2 = norm_s( n ); + tmp = div_s( extract_h( L_shl( L_tmp2, exp1 ) ), shl( n, exp2 ) ); /*15 + 15 + exp1 - 16 - exp2*/ +#ifndef BASOP_NOGLOB + m_fx = shl( tmp, sub( exp2, exp1 ) ); /*Q14*/ +#else /* BASOP_NOGLOB */ + m_fx = shl_o( tmp, sub( exp2, exp1 ), &Overflow ); /*Q14*/ +#endif /* BASOP_NOGLOB */ + if ( L_tmp1 < 0 ) + { + m_fx = negate( m_fx ); + } + + t_fx = 0; + n = 0; + for ( i = 0; i < N; i++ ) + { + if ( L_sub( Rsubband_w32_fx[i], L_shl( Nb[i], 15 ) ) > 0 ) + { + Rsubband_w32_fx[i] = L_msu( Rsubband_w32_fx[i], m_fx, Nb[i] ); + if ( L_sub( Rsubband_w32_fx[i], L_shl( Nb[i], 15 ) ) > 0 ) + { + n = add( n, Nb[i] ); + + t_fx = L_add( t_fx, Rsubband_w32_fx[i] ); + } + else + { + B = sub( B, Nb[i] ); + + Rsubband_w32_fx[i] = L_shl( Nb[i], 15 ); + move32(); + } + } + } + } + /*In case no subband has enough bits more than 1-bit per sample, take bits off the higher subbands */ + if ( t_fx == 0 ) + { + for ( i = N - 1; i >= 0; i-- ) + { + if ( Rsubband_w32_fx[i] > 0 ) + { + B = add( B, Nb[i] ); + Rsubband_w32_fx[i] = 0; + move32(); + if ( B >= 0 ) + { + BREAK; + } + } + } + BREAK; + } + } + + /* fine redistribution of over-allocated or under-allocated bits */ + tmp = 0; + for ( i = 0; i < N; i++ ) + { + Rsubband[i] = extract_l( L_shr( Rsubband_w32_fx[i], 12 ) ); + tmp = add( tmp, Rsubband[i] ); + } + + B = Bits; + B_w16_fx = shl( B, 3 ); + if ( sub( tmp, B_w16_fx ) > 0 ) + { + tmp = sub( tmp, B_w16_fx ); + for ( i = 0; i < N; i++ ) + { + if ( sub( Rsubband[i], add( shl( Nb[i], 3 ), tmp ) ) >= 0 ) + { + Rsubband[i] = sub( Rsubband[i], tmp ); + BREAK; + } + } + } + else + { + tmp = sub( tmp, B_w16_fx ); + for ( i = 0; i < N; i++ ) + { + if ( Rsubband[i] > 0 ) + { + Rsubband[i] = sub( Rsubband[i], tmp ); + BREAK; + } + } + } + + /* Calculate total used bits and initialize R to be used for Noise Filling */ + tmp = 0; + for ( i = 0; i < N; i++ ) + { + tmp = add( tmp, Rsubband[i] ); + R[i] = shr( Rsubband[i], 3 ); + } + + return shr( tmp, 3 ); +} + +/*-------------------------------------------------------------------* + * Bit_group() + * + * bit allocation in group + *-------------------------------------------------------------------*/ +static void Bit_group_fx( + Word16 *y, /* i : norm of sub-band Q0*/ + Word16 start_band, /* i : start band indices Q0*/ + Word16 end_band, /* i : end band indices Q0*/ + Word16 Bits, /* i : number of allocation bits in group Q0*/ + Word16 thr, /* i : smallest bit number for allocation in group Q0*/ + Word32 *Rsubband_fx, /* o : bit allocation of sub-band Q21*/ + Word16 *fac_fx /* i : weight factor for norm of sub-band Q13*/ +) +{ + Word16 i, j, k, m, y_index[16], index[16], bit_band, band_num, norm_sum; + Word16 tmp, exp; + Word16 factor_fx; + Word32 R_temp_fx[16], R_sum_fx = 0, R_sum_org_fx = 0, Bits_avg_fx = 0; + Word32 L_tmp; + UWord32 lo; + + /* initialization for bit allocation in one group*/ + tmp = 6554; + move16(); /*Q15 1/5 */ + IF( sub( thr, 5 ) == 0 ) + { + tmp = 6554; + move16(); /*Q15 1/5 */ + } + IF( sub( thr, 6 ) == 0 ) + { + tmp = 5462; + move16(); /*Q15 1/6 */ + } + IF( sub( thr, 7 ) == 0 ) + { + tmp = 4682; + move16(); /*Q15 1/7 */ + } + bit_band = mult( tmp, Bits ); /*0+15-15=0, Q0 */ + band_num = sub( end_band, start_band ); + + FOR( i = 0; i < band_num; i++ ) + { + y_index[i] = y[add( i, start_band )]; + move16(); + index[i] = i; + move16(); + } + + /* Rearrange norm vector in decreasing order */ + reordvct( y_index, band_num, index ); + /* norm vector modification */ + + factor_fx = div_s( 1, band_num ); /*Q15 */ + IF( sub( thr, 5 ) > 0 ) + { + FOR( i = 0; i < band_num; i++ ) + { + L_tmp = L_mult( i, factor_fx ); /*Q16 */ + tmp = extract_h( L_shl( L_tmp, 13 ) ); /*Q13 */ + tmp = sub( fac_fx[1], tmp ); /*Q13 */ + L_tmp = L_mult( y_index[i], tmp ); /*Q14 */ + y_index[i] = extract_h( L_shl( L_tmp, 2 ) ); /*Q0 */ + } + } + ELSE + { + FOR( i = 0; i < band_num; i++ ) + { + L_tmp = L_mult( i, factor_fx ); /*Q16 */ + tmp = extract_h( L_shl( L_tmp, 13 ) ); /*Q13 */ + tmp = sub( fac_fx[0], tmp ); /*Q13 */ + L_tmp = L_mult( y_index[i], tmp ); /*Q14 */ + y_index[i] = extract_h( L_shl( L_tmp, 2 ) ); /*Q0 */ + } + } + + /* bit allocation based on modified norm */ + L_tmp = L_mult( band_num, 24576 ); /*Q16 */ + tmp = extract_h( L_shl( L_tmp, 7 ) ); /*Q7 */ + IF( sub( shl( bit_band, 7 ), tmp ) >= 0 ) + { + FOR( j = 0; j < band_num; j++ ) + { + IF( y_index[j] < 0 ) + { + y_index[j] = 0; + move16(); + } + R_temp_fx[j] = 2097152; + move16(); /*Q21 = 1 move16(); */ + } + + i = sub( band_num, 1 ); + norm_sum = 0; /*Q0 */ + FOR( k = 0; k <= i; k++ ) + { + norm_sum = add( norm_sum, y_index[k] ); + } + + FOR( j = 0; j < band_num; j++ ) + { + IF( norm_sum == 0 ) + { + FOR( k = 0; k <= i; k++ ) + { + R_temp_fx[k] = 0; + move32(); /*Q21 */ + } + } + ELSE + { + exp = norm_s( norm_sum ); + tmp = shl( norm_sum, exp ); /*Q(exp) */ + tmp = div_s( 16384, tmp ); /*Q(15+14-exp) */ + Bits_avg_fx = L_mult( tmp, Bits ); /*Q(30-exp) */ + + FOR( k = 0; k <= i; k++ ) + { + L_tmp = L_shl( L_deposit_l( y_index[k] ), 24 ); + Mpy_32_32_ss( Bits_avg_fx, L_tmp, &L_tmp, &lo ); + + R_temp_fx[k] = L_shl( L_tmp, sub( exp, 2 ) ); + move32(); /*Q21 */ + } + } + + L_tmp = L_shl( L_deposit_l( thr ), 21 ); /*Q21 */ + IF( L_sub( R_temp_fx[i], L_tmp ) < 0 ) + { + R_temp_fx[i] = 0; + move32(); + norm_sum = sub( norm_sum, y_index[i] ); + i--; + } + ELSE + { + BREAK; + } + } + } + ELSE + { + FOR( j = 0; j < bit_band; j++ ) + { + IF( y_index[j] < 0 ) + { + y_index[j] = 0; + move16(); + } + R_temp_fx[j] = 2097152; + move32(); /*Q21 = 1 */ + } + + FOR( j = bit_band; j < band_num; j++ ) + { + R_temp_fx[j] = 0; + move32(); + } + + norm_sum = 0; + FOR( k = 0; k < bit_band; k++ ) + { + norm_sum = add( norm_sum, y_index[k] ); + } + + i = bit_band; + FOR( j = 0; j < bit_band; j++ ) + { + IF( norm_sum == 0 ) + { + FOR( k = 0; k < i; k++ ) + { + R_temp_fx[k] = 0; + move32(); /*Q21 */ + } + } + ELSE + { + exp = norm_s( norm_sum ); + tmp = shl( norm_sum, exp ); /*Q(exp) */ + tmp = div_s( 16384, tmp ); /*Q(15+14-exp) */ + Bits_avg_fx = L_mult( tmp, Bits ); /*Q(30-exp) */ + FOR( k = 0; k < i; k++ ) + { + L_tmp = L_shl( L_deposit_l( y_index[k] ), 24 ); + Mpy_32_32_ss( Bits_avg_fx, L_tmp, &L_tmp, &lo ); + R_temp_fx[k] = L_shl( L_tmp, sub( exp, 2 ) ); + move32(); /*Q21 */ + } + } + R_sum_fx = 0; + L_tmp = L_shl( L_deposit_l( thr ), 21 ); /*Q21 */ + FOR( k = 0; k < i; k++ ) + { + IF( L_sub( R_temp_fx[k], L_tmp ) < 0 ) + { + FOR( m = k; m < i; m++ ) + { + norm_sum = sub( norm_sum, y_index[m] ); + R_temp_fx[m] = 0; + move32(); /*Q21 */ + } + i = k; + BREAK; + } + ELSE + { + R_sum_fx = L_add( R_sum_fx, R_temp_fx[k] ); + } + } + IF( L_sub( R_sum_fx, R_sum_org_fx ) == 0 ) + { + BREAK; + } + + R_sum_org_fx = R_sum_fx; + } + } + + /* index comeback */ + FOR( k = 0; k < band_num; k++ ) + { + j = index[k]; + move16(); + Rsubband_fx[add( j, start_band )] = R_temp_fx[k]; + move32(); + } + + return; +} + +/*-------------------------------------------------------------------* + * BitAllocWB() + * + * WB bit allocation + *-------------------------------------------------------------------*/ + +/*! r: Integer (truncated) number of allocated bits */ +int16_t BitAllocWB( + int16_t *y, /* i : norm of sub-vectors */ + int16_t B, /* i : number of available bits */ + int16_t N, /* i : number of sub-vectors */ + int16_t *R, /* o : bit-allocation indicator */ + int16_t *Rsubband /* o : sub-band bit-allocation vector (Q3) */ +) +{ + Word16 t_fx; + Word16 i, j, k, B1, B2, B3, B_saved; + Word16 Rsum_fx, Rsum_sub_fx[3]; + Word32 Ravg_sub_32_fx[3], R_diff_32_fx[2]; + Word16 factor_fx[2]; /*Q13 */ + Word16 BANDS; + Word16 tmp, exp; + Word32 L_tmp, L_tmp1; + Word32 Rsubband_buf[NB_SFM]; + UWord16 lo; + + BANDS = N; + move16(); + IF( sub( BANDS, SFM_N ) > 0 ) + { + BANDS = SFM_N; + move16(); + } + /* Init Rsubband to non-zero values for bands to be allocated bits */ + FOR( k = 0; k < BANDS; k++ ) + { + Rsubband_buf[k] = 2097152; + move32(); /*Q21 */ + } + /* Calculate the norm sum and average of sub-band */ + Rsum_sub_fx[0] = 0; + FOR( j = 0; j < SFM_G1; j++ ) + { + IF( y[j] > 0 ) + { + Rsum_sub_fx[0] = add( Rsum_sub_fx[0], y[j] ); + move16(); /*Q0 */ + } + } + Ravg_sub_32_fx[0] = L_mult( Rsum_sub_fx[0], 2048 ); + move32(); /*Q16 0+15+1, q15 1/16 =2048 */ + + Rsum_sub_fx[1] = 0; + move32(); + FOR( j = SFM_G1; j < SFM_G1G2; j++ ) + { + IF( y[j] > 0 ) + { + Rsum_sub_fx[1] = add( Rsum_sub_fx[1], y[j] ); + move16(); /*Q0 */ + } + } + Ravg_sub_32_fx[1] = L_mult( Rsum_sub_fx[1], 4096 ); /*16 0+15+1, q15 1/8 =4096 */ + + Rsum_sub_fx[2] = 0; + move16(); + FOR( j = SFM_G1G2; j < BANDS; j++ ) + { + IF( y[j] > 0 ) + { + Rsum_sub_fx[2] = add( Rsum_sub_fx[2], y[j] ); + move16(); /*Q0 */ + } + } + tmp = div_s( 1, BANDS - SFM_G1G2 ); /*Q15 */ + Ravg_sub_32_fx[2] = L_mult( Rsum_sub_fx[2], tmp ); + move32(); /*Q16 */ + + /* Bit allocation for every group */ + tmp = add( Rsum_sub_fx[0], Rsum_sub_fx[1] ); + Rsum_fx = add( tmp, Rsum_sub_fx[2] ); /*Q0 */ + + factor_fx[0] = 16384; /*Q13 move16(); */ + factor_fx[1] = 24576; /*Q13 move16(); */ + { + R_diff_32_fx[0] = L_sub( Ravg_sub_32_fx[0], Ravg_sub_32_fx[1] ); + move32(); /*Q16 */ + R_diff_32_fx[1] = L_sub( Ravg_sub_32_fx[1], Ravg_sub_32_fx[2] ); + move32(); /*Q16 */ + + IF( L_sub( R_diff_32_fx[0], 393216 ) < 0 && L_sub( R_diff_32_fx[1], 245760 ) < 0 ) + { + IF( Rsum_fx == 0 ) + { + B1 = 0; + move16(); + B2 = 0; + move16(); + B3 = 0; + move16(); + } + ELSE + { + exp = norm_s( Rsum_fx ); + tmp = shl( Rsum_fx, exp ); /*Q(exp) */ + tmp = div_s( 16384, tmp ); /*Q(15+14-exp) */ + L_tmp1 = L_mult( B, Rsum_sub_fx[0] ); /*Q1 */ + Mpy_32_16_ss( L_tmp1, tmp, &L_tmp, &lo ); + B1 = extract_h( L_shl( L_tmp, add( exp, 1 ) ) ); /*Q0 */ + IF( L_sub( L_tmp1, L_mult( B1, Rsum_fx ) ) > 0 && L_sub( L_tmp1, L_mult( add( B1, 1 ), Rsum_fx ) ) >= 0 ) + { + B1 = add( B1, 1 ); + } + L_tmp1 = L_mult( B, Rsum_sub_fx[1] ); /*Q1 */ + Mpy_32_16_ss( L_tmp1, tmp, &L_tmp, &lo ); + B2 = extract_h( L_shl( L_tmp, add( exp, 1 ) ) ); /*Q0 */ + IF( L_sub( L_tmp1, L_mult( B2, Rsum_fx ) ) > 0 && L_sub( L_tmp1, L_mult( add( B2, 1 ), Rsum_fx ) ) >= 0 ) + { + B2 = add( B2, 1 ); + } + L_tmp1 = L_mult( B, Rsum_sub_fx[2] ); /*Q1 */ + Mpy_32_16_ss( L_tmp1, tmp, &L_tmp, &lo ); + B3 = extract_h( L_shl( L_tmp, add( exp, 1 ) ) ); /*Q0 */ + IF( L_sub( L_tmp1, L_mult( B3, Rsum_fx ) ) > 0 && L_sub( L_tmp1, L_mult( add( B3, 1 ), Rsum_fx ) ) >= 0 ) + { + B3 = add( B3, 1 ); + } + } + IF( L_sub( Ravg_sub_32_fx[2], 786432 ) > 0 ) + { + B_saved = 0; + move16(); + IF( sub( B1, 288 ) > 0 ) + { + B_saved = sub( B1, 288 ); + B1 = 288; + move16(); + } + + IF( sub( B2, 256 ) > 0 ) + { + tmp = sub( B2, 256 ); + B_saved = add( B_saved, tmp ); + B2 = 256; + move16(); + } + + IF( sub( B3, 96 ) > 0 ) + { + tmp = sub( B3, 96 ); + B_saved = add( B_saved, tmp ); + B3 = 96; + move16(); + } + + IF( B_saved > 0 ) + { + IF( sub( B1, 288 ) == 0 ) + { + tmp = shr( B_saved, 1 ); + B2 = add( B2, tmp ); + tmp = sub( B, B1 ); + B3 = sub( tmp, B2 ); + } + ELSE + { + tmp = shr( B_saved, 1 ); + B1 = add( B1, tmp ); + IF( sub( B2, 256 ) == 0 ) + { + tmp = sub( B, B1 ); + B3 = sub( tmp, B2 ); + } + ELSE + { + tmp = sub( B, B1 ); + B2 = sub( tmp, B3 ); + } + } + } + } + + factor_fx[0] = 16384; + move16(); /*Q13 */ + factor_fx[1] = 12288; + move16(); /*Q13 */ + } + ELSE + { + IF( Rsum_fx == 0 ) + { + B1 = 0; + move16(); + B2 = 0; + move16(); + B3 = B; + move16(); + } + ELSE + { + exp = norm_s( Rsum_fx ); + tmp = shl( Rsum_fx, exp ); /*Q(exp) */ + tmp = div_s( 16384, tmp ); /*Q(15+14-exp) */ + L_tmp1 = L_mult( B, Rsum_sub_fx[0] ); /*Q1 */ + Mpy_32_16_ss( L_tmp1, tmp, &L_tmp, &lo ); + B1 = extract_h( L_shl( L_tmp, add( exp, 1 ) ) ); /*Q0 */ + IF( L_sub( L_tmp1, L_mult( B1, Rsum_fx ) ) > 0 && L_sub( L_tmp1, L_mult( add( B1, 1 ), Rsum_fx ) ) >= 0 ) + { + B1 = add( B1, 1 ); + } + Mpy_32_16_ss( 1975684956, shl( B, 5 ), &L_tmp1, &lo ); + Mpy_32_16_ss( L_tmp1, shl( Rsum_sub_fx[1], 7 ), &L_tmp1, &lo ); + Mpy_32_16_ss( L_tmp1, tmp, &L_tmp, &lo ); + B2 = extract_h( L_shl( L_tmp, sub( exp, 11 ) ) ); /*Q0 */ + IF( L_sub( L_tmp1, L_shl( L_mult( B2, Rsum_fx ), 12 ) ) > 0 && L_sub( L_add( L_tmp1, 2 ), L_shl( L_mult( add( B2, 1 ), Rsum_fx ), 12 ) ) >= 0 ) + { + B2 = add( B2, 1 ); + } + tmp = sub( B, B1 ); + B3 = sub( tmp, B2 ); + } + } + } + + IF( sub( Rsum_sub_fx[2], 3 ) < 0 ) + { + B2 = add( B2, B3 ); + B3 = 0; + move16(); + } + + /* Bit allocation in group */ + Bit_group_fx( y, 0, SFM_G1, B1, 5, Rsubband_buf, factor_fx ); + Bit_group_fx( y, SFM_G1, SFM_G1G2, B2, 6, Rsubband_buf, factor_fx ); + Bit_group_fx( y, SFM_G1G2, BANDS, B3, 7, Rsubband_buf, factor_fx ); + FOR( i = 0; i < BANDS; i++ ) + { + Rsubband[i] = extract_l( L_shr( Rsubband_buf[i], 18 ) ); + move16(); + } + + /* Calcuate total used bits and initialize R to be used for Noise Filling */ + L_tmp = 0; + move32(); + FOR( i = 0; i < N; i++ ) + { + L_tmp = L_add( L_tmp, Rsubband_buf[i] ); /*Q21 */ + R[i] = extract_h( L_shr( Rsubband_buf[i], 5 ) ); /*Q0 */ + } + t_fx = extract_h( L_shr( L_tmp, 5 ) ); /*Q0 */ + + return (Word16) t_fx; +} + +#undef WMC_TOOL_SKIP diff --git a/lib_com/bitallocsum.c b/lib_com/bitallocsum.c new file mode 100644 index 0000000000000000000000000000000000000000..2daf67b731199ed05e9befb17c8c15e8d7b90e55 --- /dev/null +++ b/lib_com/bitallocsum.c @@ -0,0 +1,93 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------------- + * bitallocsum() + * + * Calculate the total number of bits allocated over frame + *--------------------------------------------------------------------------*/ + +void bitallocsum( + int16_t *R, /* i : bit-allocation vector */ + const int16_t nb_sfm, /* i : number of sub-vectors */ + int16_t *sum, /* o : total number of bits allocated */ + int16_t *Rsubband, /* o : rate per subband (Q3) */ + const int16_t num_bits, /* i : number of bits */ + const int16_t length, /* i : length of spectrum */ + const int16_t *sfmsize /* i : band length */ +) +{ + int16_t i; + int16_t total, tmp; + int16_t diff; + + total = 0; + for ( i = 0; i < nb_sfm; i++ ) + { + tmp = R[i] * sfmsize[i]; + Rsubband[i] = tmp * 8; + total += tmp; + } + *sum = total; + + if ( length <= L_FRAME32k ) + { + diff = num_bits - *sum; + i = 0; + while ( diff > 0 ) + { + if ( R[i] > 0 ) + { + Rsubband[i] += 8; + diff -= 1; + *sum += 1; + } + i++; + if ( i >= nb_sfm ) + { + i = 0; + } + } + } + + return; +} diff --git a/lib_com/bits_alloc.c b/lib_com/bits_alloc.c new file mode 100644 index 0000000000000000000000000000000000000000..0d1611de6a28e895269dd9e15f16300274965527 --- /dev/null +++ b/lib_com/bits_alloc.c @@ -0,0 +1,1487 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "rom_com.h" +#include "prot.h" +#include "ivas_cnst.h" +#include "ivas_rom_com.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * Local function prototypes + *--------------------------------------------------------------------*/ + +static int16_t BITS_ALLOC_adjust_acelp_fixed_cdk( const int16_t bits_frame, int16_t *fixed_cdk_index, const int16_t nb_subfr ); + +static int16_t allocate_unused( const int32_t core_brate, const int16_t coder_type, const int16_t unused_bits, const int16_t nb_prm, const int16_t subfr, const int16_t prm_type, int16_t *prm_bit_mode ); + +typedef enum +{ + GAINSPRM = 0x0, + PITCHPRM = 0x1, + MID_LSFSPRM = 0x3, + LSFPRM = 0x4 +} PRM_TYPES; + +/*-------------------------------------------------------------------* + * BITS_ALLOC_init_config_acelp() + * + * initial configuration for Mode 2 ACELP + *--------------------------------------------------------------------*/ + +void BITS_ALLOC_init_config_acelp( + const int32_t bit_rate, + const int16_t narrowBand, + const int16_t nb_subfr, + ACELP_config *acelp_cfg /* o : configuration structure of ACELP */ +) +{ + int16_t rate_mode_index; + + if ( bit_rate <= ACELP_9k60 ) + { + rate_mode_index = 0; + } + else + { + rate_mode_index = 1; + } + + acelp_cfg->mode_index = rate_mode_index; + + /*LPC: midLpc should be swithced off?*/ + acelp_cfg->midLpc_enable = 1; + + /*ACELP ICB config*/ + if ( ( rate_mode_index == 0 ) || ( narrowBand == 1 ) ) + { + acelp_cfg->pre_emphasis = 1; + acelp_cfg->formant_enh = 1; + acelp_cfg->formant_enh_num = FORMANT_SHARPENING_G1; + acelp_cfg->formant_enh_den = FORMANT_SHARPENING_G2; + acelp_cfg->formant_tilt = 0; + acelp_cfg->voice_tilt = 0; + } + else + { + acelp_cfg->pre_emphasis = 0; + acelp_cfg->formant_enh = 1; + acelp_cfg->formant_enh_num = FORMANT_SHARPENING_G1; + acelp_cfg->formant_enh_den = FORMANT_SHARPENING_G2; + acelp_cfg->formant_tilt = 1; + acelp_cfg->voice_tilt = 1; + } + + /*Wide band @ 16kHz*/ + if ( nb_subfr == NB_SUBFR16k ) + { + acelp_cfg->pre_emphasis = 1; + acelp_cfg->formant_enh = 1; + acelp_cfg->formant_enh_num = FORMANT_SHARPENING_G1_16k; + acelp_cfg->formant_enh_den = FORMANT_SHARPENING_G2_16k; + acelp_cfg->formant_tilt = 0; + acelp_cfg->voice_tilt = 2; + } + + return; +} + +/*-------------------------------------------------------------------* + * BITS_ALLOC_config_acelp() + * + * configure all Mode 2 ACELP coder types and allocate the bits + *--------------------------------------------------------------------*/ + +int16_t BITS_ALLOC_config_acelp( + const int16_t bits_frame, /* i : remaining bit budget for the frame */ + const int16_t coder_type, /* i : acelp coder type */ + ACELP_config *acelp_cfg, /* i/o: configuration structure of ACELP */ + const int16_t narrowBand, /* i : narrowband flag */ + const int16_t nb_subfr /* i : number of subframes */ +) +{ + int16_t mode_index; + int16_t band_index; + int16_t i; + int16_t remaining_bits, bits; + + /*Sanity check*/ + + mode_index = acelp_cfg->mode_index; + band_index = ( narrowBand == 0 ); + bits = 0; + + if ( band_index == 0 ) + { + if ( coder_type == INACTIVE ) + { + acelp_cfg->formant_enh = 0; + } + else + { + acelp_cfg->formant_enh = 1; + } + } + + if ( band_index == 1 && nb_subfr == NB_SUBFR ) + { + + if ( coder_type == INACTIVE ) + { + acelp_cfg->pre_emphasis = 0; + acelp_cfg->formant_enh = 0; + acelp_cfg->formant_enh_num = FORMANT_SHARPENING_G1_16k; + acelp_cfg->formant_tilt = 1; + acelp_cfg->voice_tilt = 1; + } + else + { + acelp_cfg->pre_emphasis = 1; + acelp_cfg->formant_enh = 1; + acelp_cfg->formant_enh_num = FORMANT_SHARPENING_G1; + acelp_cfg->formant_tilt = 0; + acelp_cfg->voice_tilt = 0; + } + } + + if ( coder_type == UNVOICED ) + { + if ( ACELP_GAINS_MODE[mode_index][band_index][coder_type] == 6 ) + { + acelp_cfg->pitch_sharpening = 0; + acelp_cfg->phase_scrambling = 1; + } + else + { + acelp_cfg->pitch_sharpening = 0; + acelp_cfg->phase_scrambling = 0; + } + } + else + { + acelp_cfg->pitch_sharpening = 1; + acelp_cfg->phase_scrambling = 0; + } + + if ( coder_type > ACELP_MODE_MAX ) + { + /* keep pitch sharpening for RF_ALLPRED mode */ + acelp_cfg->pitch_sharpening = 0; + acelp_cfg->phase_scrambling = 0; + } + + /*Allocate bits and different modes*/ + acelp_cfg->bpf_mode = ACELP_BPF_MODE[mode_index][band_index][coder_type]; + bits += ACELP_BPF_BITS[acelp_cfg->bpf_mode]; + + acelp_cfg->nrg_mode = ACELP_NRG_MODE[mode_index][band_index][coder_type]; + acelp_cfg->nrg_bits = ACELP_NRG_BITS[acelp_cfg->nrg_mode]; + bits += acelp_cfg->nrg_bits; + + acelp_cfg->ltp_mode = ACELP_LTP_MODE[mode_index][band_index][coder_type]; + acelp_cfg->ltp_bits = 0; + acelp_cfg->ltf_mode = ACELP_LTF_MODE[mode_index][band_index][coder_type]; + acelp_cfg->ltf_bits = ACELP_LTF_BITS[acelp_cfg->ltf_mode]; + + if ( nb_subfr == NB_SUBFR16k && acelp_cfg->ltf_bits == 4 ) + { + acelp_cfg->ltf_bits++; + } + bits += acelp_cfg->ltf_bits; + + + for ( i = 0; i < nb_subfr; i++ ) + { + acelp_cfg->gains_mode[i] = ACELP_GAINS_MODE[mode_index][band_index][coder_type]; + + /* skip subframe 1, 3 gain encoding, and use from subframe 0, and 3, respectively */ + if ( coder_type >= ACELP_MODE_MAX && ( i == 1 || i == 3 ) ) + { + acelp_cfg->gains_mode[i] = 0; + } + + bits += ACELP_GAINS_BITS[acelp_cfg->gains_mode[i]]; + bits += ACELP_LTP_BITS_SFR[acelp_cfg->ltp_mode][i]; + acelp_cfg->ltp_bits += ACELP_LTP_BITS_SFR[acelp_cfg->ltp_mode][i]; + } + + /*Innovation*/ + if ( bits_frame < bits ) + { + printf( "\nWarning: bits per frame too low\n" ); + return -1; + } + + if ( coder_type == RF_ALLPRED ) + { + set_s( acelp_cfg->fixed_cdk_index, -1, nb_subfr ); + } + else if ( coder_type == RF_GENPRED ) + { + acelp_cfg->fixed_cdk_index[0] = 0; /* 7 bits */ + acelp_cfg->fixed_cdk_index[1] = -1; + acelp_cfg->fixed_cdk_index[2] = 0; /* 7 bits */ + acelp_cfg->fixed_cdk_index[3] = -1; + acelp_cfg->fixed_cdk_index[4] = -1; + bits += 14; + } + else if ( coder_type == RF_NOPRED ) + { + set_s( acelp_cfg->fixed_cdk_index, 0, nb_subfr ); + bits += 28; + } + else + { + bits += BITS_ALLOC_adjust_acelp_fixed_cdk( bits_frame - bits, acelp_cfg->fixed_cdk_index, nb_subfr ); + } + + remaining_bits = bits_frame - bits; + + /*Sanity check*/ + if ( remaining_bits < 0 ) + { + bits = -1; + } + + + return ( bits ); +} + +/*-------------------------------------------------------------------* + * BITS_ALLOC_adjust_acelp_fixed_cdk() + * + * + *--------------------------------------------------------------------*/ + +static int16_t BITS_ALLOC_adjust_acelp_fixed_cdk( + const int16_t bits_frame, /* i : bit budget */ + int16_t *fixed_cdk_index, + const int16_t nb_subfr ) +{ + int16_t bits_subframe2; + int16_t sfr, k, bitsused, bits_currsubframe; + + bits_subframe2 = bits_frame; + + if ( bits_subframe2 < ACELP_FIXED_CDK_BITS( 0 ) * nb_subfr ) + { + return ( bits_frame + 1 ); /* Not enough bits for lowest mode. -> trigger alarm*/ + } + + /* search cdk-index for first subframe */ + for ( k = 0; k < ACELP_FIXED_CDK_NB - 1; k++ ) + { + if ( ACELP_FIXED_CDK_BITS( k ) * nb_subfr > bits_subframe2 ) + { + k--; /* previous mode did not exceed bit-budget */ + break; + } + } + + if ( ACELP_FIXED_CDK_BITS( k ) * nb_subfr > bits_subframe2 ) + { + k--; /* previous mode did not exceed bit-budget */ + } + fixed_cdk_index[0] = k; + + bitsused = ACELP_FIXED_CDK_BITS( k ); + + for ( sfr = 1; sfr < nb_subfr; sfr++ ) + { + bits_currsubframe = ( sfr * bits_subframe2 + bits_subframe2 ) - bitsused * nb_subfr; + + /* try increasing mode while below threshold */ + while ( ( k < ACELP_FIXED_CDK_NB - 1 ) && ( ACELP_FIXED_CDK_BITS( k + 1 ) * nb_subfr <= bits_currsubframe ) ) + { + k++; + } + + /* try decreasing mode until below threshold */ + while ( ACELP_FIXED_CDK_BITS( k ) * nb_subfr > bits_currsubframe ) + { + k--; + if ( k == 0 ) + { + break; + } + } + + /* store mode */ + fixed_cdk_index[sfr] = k; + bitsused += ACELP_FIXED_CDK_BITS( k ); + } + + return bitsused; +} + + +/*-------------------------------------------------------------------* + * fcb_table() + * + * Selection of fixed innovation codebook bitbudget table + *--------------------------------------------------------------------*/ + +static int16_t fcb_table( + const int16_t n, + const int16_t L_subfr ) +{ + int16_t out; + + out = PulseConfTable[n].bits; + if ( L_subfr > L_SUBFR ) + { + out = fast_FCB_bits_2sfr[n]; + } + + return ( out ); +} + +/*-------------------------------------------------------------------* + * acelp_FCB_allocator() + * + * Routine to allocate fixed innovation codebook bit-budget + *--------------------------------------------------------------------*/ + +static ivas_error acelp_FCB_allocator( + int16_t *nBits, /* i/o: available bit-budget */ + int16_t fixed_cdk_index[], /* o : codebook index */ + int16_t nb_subfr, /* i : number of subframes */ + const int16_t L_subfr, /* i : subframe length */ + const int16_t coder_type, /* i : coder type */ + const int16_t tc_subfr, /* i : TC subframe index */ + const int16_t fix_first /* i : flag to indicate whether the first subframe bit-budget was fixed */ +) +{ + int16_t cdbk, sfr, step; + int16_t nBits_tmp; + int16_t *p_fixed_cdk_index; + ivas_error error; + int16_t max_n; + + error = IVAS_ERR_OK; + + cdbk = coder_type; /* just to avoid warning when DEBUGGING is deactivated */ + + p_fixed_cdk_index = fixed_cdk_index; + + /* TRANSITION coding: first subframe bit-budget was already fixed, glottal pulse not in the first subframe */ + if ( tc_subfr >= L_SUBFR && fix_first ) + { + int16_t i; + + for ( i = 0; i < nb_subfr; i++ ) + { + *nBits -= ACELP_FIXED_CDK_BITS( fixed_cdk_index[i] ); + } + return error; + } + + /* TRANSITION coding: first subframe bit-budget was already fixed, glottal pulse in the first subframe */ + sfr = 0; + if ( fix_first ) + { + *nBits -= ACELP_FIXED_CDK_BITS( fixed_cdk_index[0] ); + sfr = 1; + p_fixed_cdk_index++; + nb_subfr = 3; + } + + /* distribute the bit-budget equally between subframes */ + if ( L_subfr > L_SUBFR ) /* access fast_FCB_bits_2sfr */ + { + max_n = 6; + } + else + { + max_n = ACELP_FIXED_CDK_NB; + } + for ( cdbk = 0; cdbk < max_n; cdbk++ ) + { + if ( fcb_table( cdbk, L_subfr ) * nb_subfr > *nBits ) + { + break; + } + } + cdbk--; + + set_s( p_fixed_cdk_index, cdbk, nb_subfr ); + nBits_tmp = 0; + if ( cdbk >= 0 ) + { + nBits_tmp = fcb_table( cdbk, L_subfr ); + } + else + { + nBits_tmp = 0; + } + *nBits -= nBits_tmp * nb_subfr; + + /* try to increase the FCB bit-budget of the first subframe(s) */ + if ( cdbk < ACELP_FIXED_CDK_NB - 1 ) + { + step = fcb_table( cdbk + 1, L_subfr ) - nBits_tmp; + while ( *nBits >= step ) + { + ( *p_fixed_cdk_index )++; + *nBits -= step; + p_fixed_cdk_index++; + } + + /* try to increase the FCB of the first subframe in cases when the next step is lower than the current step */ + if ( fixed_cdk_index[sfr] < ACELP_FIXED_CDK_NB - 1 ) + { + step = fcb_table( fixed_cdk_index[sfr] + 1, L_subfr ) - fcb_table( fixed_cdk_index[sfr], L_subfr ); + if ( *nBits >= step && cdbk >= 0 ) + { + fixed_cdk_index[sfr]++; + *nBits -= step; + + if ( *nBits >= step && fixed_cdk_index[sfr + 1] == fixed_cdk_index[sfr] - 1 ) + { + sfr++; + fixed_cdk_index[sfr]++; + *nBits -= step; + } + } + } + } + /* TRANSITION coding: allocate highest FCBQ bit-budget to the subframe with the glottal-shape codebook */ + if ( tc_subfr >= L_SUBFR ) + { + int16_t tempr; + + SWAP( fixed_cdk_index[0], fixed_cdk_index[tc_subfr / L_SUBFR] ); + + /* TRANSITION coding: allocate second highest FCBQ bit-budget to the last subframe */ + if ( tc_subfr / L_SUBFR < nb_subfr - 1 ) + { + SWAP( fixed_cdk_index[( tc_subfr - L_SUBFR ) / L_SUBFR], fixed_cdk_index[nb_subfr - 1] ); + } + } + + /* when subframe length > L_SUBFR, number of bits instead of codebook index is signalled */ + if ( L_subfr > L_SUBFR ) + { + int16_t i, j; + for ( i = 0; i < nb_subfr; i++ ) + { + j = fixed_cdk_index[i]; + fixed_cdk_index[i] = fast_FCB_bits_2sfr[j]; + } + } + + return error; +} + + +/*-------------------------------------------------------------------* + * config_acelp1() + * + * Configure ACELP bit allocation + * - should be in range of <6700; 24350> for ACELP@12.8kHz + * - per channel bitrate minimum is 13250 kbps for ACELP@16kHz + *--------------------------------------------------------------------*/ + +ivas_error config_acelp1( + const int16_t enc_dec, /* i : encoder/decoder flag */ + const int32_t total_brate, /* i : total bitrate */ + const int32_t core_brate_inp, /* i : core bitrate */ + const int16_t core, /* i : core */ + const int16_t extl, /* i : extension layer */ + const int32_t extl_brate, /* i : extension layer bitrate */ + const int16_t L_frame, /* i : frame length at internal Fs */ + const int16_t GSC_noisy_speech, /* i : GSC on SWB noisy speech flag */ + ACELP_config *acelp_cfg, /* i : ACELP bit-allocation */ + const int16_t signaling_bits, /* i : number of signaling bits */ + const int16_t coder_type, /* i : coder type */ + const int16_t tc_subfr, /* i : TC subfr ID */ + const int16_t tc_call, /* i : TC call number (0,1,2,3,5(DEC)) */ + int16_t *nBits_es_Pred, /* o : number of bits for Es_pred Q */ + int16_t *unbits, /* o : number of unused bits */ + const int16_t element_mode, /* i : element mode */ + int16_t *uc_two_stage_flag, /* o : flag undicating two-stage UC */ + const int16_t tdm_lp_reuse_flag, /* i : LPC reuse flag (can be 1 only with secondary channel */ + const int16_t tdm_low_rate_mode, /* i : secondary channel low rate mode flag */ + const int16_t idchan, /* i : stereo channel ID */ + const int16_t active_cnt, /* i : Active frame counter */ + const int16_t tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag*/ + const int16_t tdm_LRTD_flag, /* i : LRTD stereo mode flag */ + const int16_t GSC_IVAS_mode /* i : GSC IVAS mode */ +) +{ + int16_t i, bits, nb_subfr; + int16_t flag_hardcoded, coder_type_sw, fix_first; + int32_t core_brate; + ivas_error error; + + error = IVAS_ERR_OK; + + /*-----------------------------------------------------------------* + * Set the flag indicating two-stage Unvoiced (UC) frame + *-----------------------------------------------------------------*/ + + *uc_two_stage_flag = 0; + if ( coder_type == UNVOICED ) + { + if ( total_brate >= MIN_UNVOICED_TWO_STAGE_BRATE && element_mode > EVS_MONO && ( idchan == 0 || ( ( total_brate >= 8500 || extl_brate == 0 ) && tdm_LRTD_flag == 1 ) ) ) + { + *uc_two_stage_flag = 1; + } + } + + /*-----------------------------------------------------------------* + * Set the number of subframes + *-----------------------------------------------------------------*/ + + if ( L_frame == L_FRAME ) + { + nb_subfr = NB_SUBFR; + + } + else /* L_frame == L_FRAME16k */ + { + nb_subfr = NB_SUBFR16k; + + } + + coder_type_sw = coder_type; + if ( core != ACELP_CORE ) + { + /* used in acelp_core_switch_enc() */ + nb_subfr = 1; + if ( L_frame == L_FRAME ) + { + coder_type_sw = TRANSITION; + } + } + + /*-----------------------------------------------------------------* + * Check if the core_brate is hard coded (to keep BE for mono core) or not + *-----------------------------------------------------------------*/ + + flag_hardcoded = 0; + i = 0; + + while ( i < SIZE_BRATE_INTERMED_TBL ) + { + if ( core_brate_inp == brate_intermed_tbl[i] ) + { + flag_hardcoded = 1; + break; + } + + if ( core_brate_inp < brate_intermed_tbl[i] ) + { + flag_hardcoded = 0; + break; + } + + i++; + } + + if ( element_mode == IVAS_CPE_TD && coder_type == AUDIO && + core_brate_inp <= STEREO_GSC_BIT_RATE_ALLOC && brate_intermed_tbl[i] == ACELP_9k60 ) /* Bit allocation should be mapped to 8 kb/s instead of 9.6 kb/s in this case */ + { + i--; + } + + core_brate = brate_intermed_tbl[i]; + + if ( element_mode > EVS_MONO ) + { + flag_hardcoded = 0; /* use automatic and flexible ACELP bit-budget allocation */ + } + + if ( core != ACELP_CORE && element_mode == EVS_MONO ) /* needed for mode1 core switching in EVS mono */ + { + flag_hardcoded = 1; + } + + /*-----------------------------------------------------------------* + * ACELP bit allocation + *-----------------------------------------------------------------*/ + + if ( !( coder_type == TRANSITION && tc_subfr != -1 ) || enc_dec == DEC ) + { + /* Set the bit-budget */ + bits = (int16_t) ( core_brate_inp / FRAMES_PER_SEC ); + + if ( coder_type == TRANSITION && enc_dec == DEC && tc_call == 1 ) + { + bits += *nBits_es_Pred; /* equalize for 4th signaling bit estimated at the encoder in TC_0_192 */ + } + + /* Subtract signaling bits */ + if ( enc_dec == DEC && idchan == 1 && element_mode > EVS_MONO ) + { + bits -= TDM_SIGNAL_BITS_READ_FROM_THE_END_OF_BS; + + if ( tdm_LRTD_flag == 1 ) + { + bits += STEREO_BITS_TCA; + } + + /* subtract TBE/BWE flag */ + if ( extl_brate > 0 && ( extl == WB_TBE || extl == SWB_TBE || extl == FB_TBE || extl == WB_BWE || extl == SWB_BWE || extl == FB_BWE ) ) + { + bits--; + } + } + else + { + /* Subtract signaling bits */ + bits -= signaling_bits; + } + + if ( extl_brate > 0 && ( extl == WB_TBE || extl == SWB_TBE || extl == FB_TBE || extl == WB_BWE || extl == SWB_BWE || extl == FB_BWE ) ) + { + /* extension layer signaling bit is counted in the extension layer bitbudget */ + bits++; + } + + /*-----------------------------------------------------------------* + * LSF Q bit-budget + *-----------------------------------------------------------------*/ + + if ( !tdm_lp_reuse_flag || idchan == 0 ) + { + /* LSF Q bit-budget */ + acelp_cfg->lsf_bits = LSF_bits_tbl[LSF_BIT_ALLOC_IDX( core_brate, coder_type )]; + + if ( !flag_hardcoded ) + { + if ( L_frame == L_FRAME ) + { + if ( element_mode == IVAS_SCE && tdm_low_rate_mode ) + { + acelp_cfg->lsf_bits = LSF_bits_tbl[LSF_BIT_ALLOC_IDX( core_brate, coder_type )]; + } + else if ( ( total_brate < 7200 || coder_type == INACTIVE || coder_type == AUDIO ) && idchan == 1 ) + { + /* TD stereo, secondary channel: do nothing */ + acelp_cfg->lsf_bits = LSF_bits_tbl[LSF_BIT_ALLOC_IDX( core_brate, coder_type )]; + } + else if ( element_mode > EVS_MONO && coder_type == AUDIO && brate_intermed_tbl[i] < ACELP_9k60 ) + { + /* primary channel: do nothing */ + } + else if ( element_mode > EVS_MONO && coder_type == AUDIO /*&& brate_intermed_tbl[i] >= ACELP_9k60*/ ) + { + acelp_cfg->lsf_bits = 42; + } + else if ( total_brate <= 9600 || coder_type == UNVOICED ) + { + acelp_cfg->lsf_bits = 31; + } + else if ( total_brate <= 20000 ) + { + acelp_cfg->lsf_bits = 36; + } + else + { + acelp_cfg->lsf_bits = 41; + } + } + else /* L_frame == L_FRAME16k */ + { + acelp_cfg->lsf_bits = 41; + } + } + + bits -= acelp_cfg->lsf_bits; + + /* mid-LSF Q bit-budget */ + acelp_cfg->mid_lsf_bits = mid_LSF_bits_tbl[LSF_BIT_ALLOC_IDX( core_brate, coder_type )]; + + if ( element_mode > EVS_MONO && coder_type == AUDIO /*&& brate_intermed_tbl[i] < ACELP_9k60*/ ) + { + acelp_cfg->mid_lsf_bits = 5; + /* primary channel: do nothing */ + } + + bits -= acelp_cfg->mid_lsf_bits; + } + else if ( tdm_lp_reuse_flag == 1 && idchan == 1 && active_cnt != 1 ) + { + bits -= TDM_IC_LSF_PRED_BITS; + } + + /* gain Q bit-budget - part 1 */ + if ( ( coder_type != UNVOICED && coder_type != AUDIO && coder_type != INACTIVE && !( core_brate <= ACELP_8k00 && coder_type != TRANSITION ) ) || ( coder_type == INACTIVE && total_brate > MAX_GSC_INACTIVE_BRATE ) ) + { + *nBits_es_Pred = Es_pred_bits_tbl[BIT_ALLOC_IDX( core_brate, coder_type, -1, -1 )]; + bits -= *nBits_es_Pred; + } + else if ( *uc_two_stage_flag ) + { + *nBits_es_Pred = 4; + bits -= *nBits_es_Pred; + } + } + else + { + bits = *unbits; + } + + if ( coder_type == TRANSITION && tc_call == 0 ) + { + *unbits = bits; + return error; + } + + /*-----------------------------------------------------------------* + * Low-rate mode - bits are allocated in tdm_low_rate_enc() + *-----------------------------------------------------------------*/ + + if ( element_mode == IVAS_SCE && tdm_low_rate_mode ) + { + acelp_cfg->FEC_mode = 0; + acelp_cfg->ltf_mode = FULL_BAND; + *nBits_es_Pred = 0; + *unbits = 0; + acelp_cfg->ubits = 0; + + return error; + } + + /*-----------------------------------------------------------------* + * Supplementary information for FEC + *-----------------------------------------------------------------*/ + + acelp_cfg->FEC_mode = 0; + if ( core_brate >= ACELP_11k60 && ( idchan == 0 || element_mode == EVS_MONO ) ) + { + acelp_cfg->FEC_mode = 1; + + if ( coder_type > UNVOICED && coder_type < AUDIO && coder_type != VOICED ) + { + bits -= FEC_BITS_CLS; + } + + if ( coder_type != TRANSITION ) + { + if ( total_brate >= ACELP_16k40 ) + { + acelp_cfg->FEC_mode = 2; + + if ( coder_type > UNVOICED && coder_type < AUDIO ) + { + bits -= FEC_BITS_ENR; + } + } + + if ( total_brate >= ACELP_32k ) + { + acelp_cfg->FEC_mode = 3; + + if ( coder_type > UNVOICED && coder_type < AUDIO ) + { + bits -= FEC_BITS_POS; + } + } + } + } + + /*-----------------------------------------------------------------* + * LP filtering of the adaptive excitation + *-----------------------------------------------------------------*/ + + if ( idchan > 0 && element_mode > EVS_MONO ) + { + acelp_cfg->ltf_mode = FULL_BAND; + } + else if ( coder_type == UNVOICED ) + { + acelp_cfg->ltf_mode = FULL_BAND; + } + else if ( ( coder_type == GENERIC || coder_type == TRANSITION ) && core_brate < ACELP_11k60 ) + { + acelp_cfg->ltf_mode = LOW_PASS; + } + else if ( core_brate >= ACELP_11k60 && ( coder_type != AUDIO && !( coder_type == INACTIVE && L_frame == L_FRAME ) ) ) + { + if ( coder_type == INACTIVE && L_frame == L_FRAME16k && total_brate <= MAX_GSC_INACTIVE_BRATE ) /* GSC Inactive @16kHz */ + { + acelp_cfg->ltf_mode = FULL_BAND; + } + else + { + acelp_cfg->ltf_mode = NORMAL_OPERATION; + if ( coder_type != TRANSITION ) + { + bits -= nb_subfr; + } + } + } + else + { + acelp_cfg->ltf_mode = FULL_BAND; + } + + /*-----------------------------------------------------------------* + * UC bit-budget + *-----------------------------------------------------------------*/ + + if ( ( ( coder_type == UNVOICED && !( *uc_two_stage_flag ) ) || ( coder_type == INACTIVE && core_brate <= ACELP_9k60 ) ) && ( idchan == 0 || element_mode == EVS_MONO ) ) + { + bits -= NBITS_NOISENESS; /* noiseness */ + } + if ( coder_type == UNVOICED && !( *uc_two_stage_flag ) ) + { + bits -= ( 3 * NB_SUBFR ); /* tilt factor */ + } + + /*-----------------------------------------------------------------* + * TC bit-budget + *-----------------------------------------------------------------*/ + + fix_first = 0; + if ( coder_type == TRANSITION ) + { + if ( tc_call == 2 ) + { + fix_first = 1; + } + + /* TC signaling */ + if ( L_frame == L_FRAME ) + { + if ( tc_subfr == TC_0_0 ) + { + if ( enc_dec == ENC ) + { + bits -= 1; /* TC signaling */ + } + + if ( acelp_cfg->ltf_mode == NORMAL_OPERATION ) + { + bits -= 3; /* LP filtering flag */ + } + } + else if ( tc_subfr == TC_0_64 ) + { + if ( enc_dec == ENC ) + { + bits -= 4; /* TC signaling */ + } + + if ( acelp_cfg->ltf_mode == NORMAL_OPERATION ) + { + bits -= 3; /* LP filtering flag */ + } + } + else if ( tc_subfr == TC_0_128 ) + { + if ( enc_dec == ENC ) + { + bits -= 4; /* TC signaling */ + } + + if ( acelp_cfg->ltf_mode == NORMAL_OPERATION ) + { + bits -= 2; /* LP filtering flag */ + } + } + else if ( tc_subfr == TC_0_192 ) + { + if ( enc_dec == ENC ) + { + bits -= 3; /* TC signaling */ + } + + if ( acelp_cfg->ltf_mode == NORMAL_OPERATION ) + { + bits -= 1; /* LP filtering flag */ + } + } + else if ( tc_subfr == L_SUBFR ) + { + if ( enc_dec == ENC ) + { + bits -= 3; /* TC signaling */ + } + + if ( acelp_cfg->ltf_mode == NORMAL_OPERATION ) + { + bits -= ( L_FRAME - tc_subfr - L_SUBFR ) / L_SUBFR; /* LP filtering flag */ + } + } + else + { + if ( enc_dec == ENC ) + { + bits -= 4; /* TC signaling */ + } + + if ( acelp_cfg->ltf_mode == NORMAL_OPERATION ) + { + bits -= ( L_FRAME - tc_subfr - L_SUBFR ) / L_SUBFR; /* LP filtering flag */ + } + } + } + else /* L_frame == L_FRAME16k */ + { + if ( enc_dec == ENC ) + { + if ( tc_subfr <= 2 * L_SUBFR ) + { + bits -= 2; /* TC signaling */ + } + else + { + bits -= 3; /* TC signaling */ + } + } + + bits -= ( L_FRAME16k - tc_subfr - L_SUBFR ) / L_SUBFR; /* LP filtering flag */ + } + + /* glottal-shape codebook bits */ + bits -= ( 3 + 6 + 1 + 3 ); + } + + /*-----------------------------------------------------------------* + * pitch, innovation, gains bit-budget + *-----------------------------------------------------------------*/ + + acelp_cfg->fcb_mode = 0; + + if ( element_mode == IVAS_CPE_TD && tdm_low_rate_mode == 1 && coder_type != INACTIVE && coder_type != UNVOICED ) /* GENERIC low rate mode for secondary channel */ + { + set_s( acelp_cfg->pitch_bits, 0, NB_SUBFR16k ); + set_s( acelp_cfg->gains_mode, 0, NB_SUBFR16k ); + + for ( i = 0; i < 2; i++ ) + { + acelp_cfg->pitch_bits[i] = 0; + if ( tdm_Pitch_reuse_flag == 0 ) + { + acelp_cfg->pitch_bits[i] = ACB_bits_tbl[BIT_ALLOC_IDX( ACELP_7k20, GENERIC, 2 * i * L_SUBFR, TC_SUBFR2IDX( tc_subfr ) )]; + bits -= acelp_cfg->pitch_bits[i]; + } + acelp_cfg->gains_mode[i] = gain_bits_tbl[BIT_ALLOC_IDX( ACELP_7k20, GENERIC, i * L_SUBFR, TC_SUBFR2IDX( tc_subfr ) )]; + bits -= acelp_cfg->gains_mode[i]; + } + acelp_cfg->fcb_mode = 1; + + if ( bits >= 16 ) + { + acelp_FCB_allocator( &bits, acelp_cfg->fixed_cdk_index, 2, 2 * L_SUBFR, GENERIC, -1, 0 ); + } + else + { + acelp_FCB_allocator( &bits, acelp_cfg->fixed_cdk_index, 2, 2 * L_SUBFR, GENERIC, -1, 0 ); + acelp_cfg->fixed_cdk_index[1] = -1; + } + acelp_cfg->fixed_cdk_index[2] = -1; + acelp_cfg->fixed_cdk_index[3] = -1; + } + else if ( ( coder_type != INACTIVE && nb_subfr == NB_SUBFR && coder_type != AUDIO ) || ( nb_subfr == NB_SUBFR16k && ( total_brate > MAX_GSC_INACTIVE_BRATE || coder_type != INACTIVE ) ) || core == HQ_CORE ) + { + /* pitch Q & gain Q bit-budget - part 2*/ + for ( i = 0; i < nb_subfr; i++ ) + { + if ( L_frame == L_FRAME ) + { + if ( tdm_Pitch_reuse_flag == 1 && idchan == 1 ) + { + acelp_cfg->pitch_bits[i] = 0; + } + else + { + acelp_cfg->pitch_bits[i] = ACB_bits_tbl[BIT_ALLOC_IDX( core_brate, coder_type, i * L_SUBFR, TC_SUBFR2IDX( tc_subfr ) )]; + } + acelp_cfg->gains_mode[i] = gain_bits_tbl[BIT_ALLOC_IDX( core_brate, coder_type_sw, i * L_SUBFR, TC_SUBFR2IDX( tc_subfr ) )]; + } + else /* L_frame == L_FRAME16k */ + { + if ( tdm_Pitch_reuse_flag == 1 && idchan == 1 ) + { + acelp_cfg->pitch_bits[i] = 0; + } + else + { + acelp_cfg->pitch_bits[i] = ACB_bits_16kHz_tbl[BIT_ALLOC_IDX_16KHZ( core_brate, coder_type, i * L_SUBFR, TC_SUBFR2IDX_16KHZ( tc_subfr ) )]; + } + acelp_cfg->gains_mode[i] = gain_bits_16kHz_tbl[BIT_ALLOC_IDX_16KHZ( core_brate, coder_type_sw, i * L_SUBFR, TC_SUBFR2IDX_16KHZ( tc_subfr ) )]; + } + + bits -= acelp_cfg->pitch_bits[i]; + + if ( coder_type == INACTIVE && acelp_cfg->gains_mode[i] == 6 /* VQ vs. SQ threshold @32 kbps */ ) + { + bits -= 5; + } + else + { + if ( *uc_two_stage_flag == 1 ) + { + acelp_cfg->gains_mode[i] = 7; + } + + bits -= acelp_cfg->gains_mode[i]; + } + } + + /* algebraic codebook bit-budget */ + if ( flag_hardcoded || ( core_brate_inp >= MIN_BRATE_AVQ_EXC && coder_type != INACTIVE ) || ( total_brate > MAX_GSC_INACTIVE_BRATE && coder_type == INACTIVE ) ) + { + for ( i = 0; i < nb_subfr; i++ ) + { + if ( L_frame == L_FRAME ) + { + acelp_cfg->fixed_cdk_index[i] = FCB_bits_tbl[BIT_ALLOC_IDX( core_brate, coder_type, i * L_SUBFR, TC_SUBFR2IDX( tc_subfr ) )]; + } + else /* L_frame == L_FRAME16k */ + { + acelp_cfg->fixed_cdk_index[i] = FCB_bits_16kHz_tbl[BIT_ALLOC_IDX_16KHZ( core_brate, coder_type, i * L_SUBFR, TC_SUBFR2IDX_16KHZ( tc_subfr ) )]; + } + bits -= acelp_cfg->fixed_cdk_index[i]; + } + } + else if ( !( coder_type == UNVOICED && tdm_low_rate_mode == 1 && element_mode == IVAS_CPE_TD ) ) + { + if ( coder_type == UNVOICED && !( *uc_two_stage_flag ) ) + { + i = bits / NB_SUBFR; + if ( i % 2 == 0 ) + { + i--; /* must be odd */ + } + i = min( i, 13 ); + i = max( i, 0 ); /* If i == 0-> random noise generator will be used as FCB */ + set_s( acelp_cfg->fixed_cdk_index, i, NB_SUBFR ); + bits -= ( i * NB_SUBFR ); + } + else + { + + acelp_cfg->fcb_mode = 1; + if ( element_mode == IVAS_CPE_TD ) + { + if ( bits >= ACELP_FIXED_CDK_BITS( 0 ) * ( nb_subfr ) ) /* enough bits for all fcb */ + { + acelp_FCB_allocator( &bits, acelp_cfg->fixed_cdk_index, nb_subfr, L_SUBFR, coder_type, tc_subfr, fix_first ); + } + else if ( bits >= ACELP_FIXED_CDK_BITS( 0 ) * ( nb_subfr - 1 ) ) + { + acelp_FCB_allocator( &bits, acelp_cfg->fixed_cdk_index, nb_subfr - 1, L_SUBFR, coder_type, tc_subfr, fix_first ); + acelp_cfg->fixed_cdk_index[3] = -1; + } + else if ( bits >= ACELP_FIXED_CDK_BITS( 0 ) * ( nb_subfr - 2 ) ) + { + acelp_FCB_allocator( &bits, acelp_cfg->fixed_cdk_index, nb_subfr - 2, L_SUBFR, coder_type, tc_subfr, fix_first ); + acelp_cfg->fixed_cdk_index[2] = acelp_cfg->fixed_cdk_index[1]; + acelp_cfg->fixed_cdk_index[1] = -1; + acelp_cfg->fixed_cdk_index[3] = -1; + } + else if ( bits >= ACELP_FIXED_CDK_BITS( 0 ) ) + { + acelp_FCB_allocator( &bits, acelp_cfg->fixed_cdk_index, 1, L_SUBFR, coder_type, tc_subfr, fix_first ); + acelp_cfg->fixed_cdk_index[1] = acelp_cfg->fixed_cdk_index[0]; + acelp_cfg->fixed_cdk_index[0] = -1; + acelp_cfg->fixed_cdk_index[2] = -1; + acelp_cfg->fixed_cdk_index[3] = -1; + } + else /* No FCB */ + { + acelp_cfg->fixed_cdk_index[0] = -1; + acelp_cfg->fixed_cdk_index[1] = -1; + acelp_cfg->fixed_cdk_index[2] = -1; + acelp_cfg->fixed_cdk_index[3] = -1; + } + } + else if ( element_mode != IVAS_CPE_TD && GSC_IVAS_mode > 0 && L_frame == L_FRAME16k ) + { + bits = 100; /* 9 kbps for fcb */ + acelp_FCB_allocator( &bits, acelp_cfg->fixed_cdk_index, nb_subfr, L_SUBFR, coder_type, tc_subfr, fix_first ); + } + else + { + acelp_FCB_allocator( &bits, acelp_cfg->fixed_cdk_index, nb_subfr, L_SUBFR, coder_type, tc_subfr, fix_first ); + } + } + } + + /* AVQ codebook */ + if ( ( core_brate_inp >= MIN_BRATE_AVQ_EXC && coder_type != INACTIVE ) || ( total_brate > MAX_GSC_INACTIVE_BRATE && coder_type == INACTIVE ) ) + { + for ( i = 0; i < nb_subfr; i++ ) + { + if ( flag_hardcoded ) + { + acelp_cfg->AVQ_cdk_bits[i] = AVQ_bits_16kHz_tbl[BIT_ALLOC_IDX_16KHZ( core_brate, coder_type, i * L_SUBFR, TC_SUBFR2IDX_16KHZ( tc_subfr ) )]; + { + bits -= acelp_cfg->AVQ_cdk_bits[i]; + } + } + + bits -= G_AVQ_BITS; + } + + if ( core_brate_inp >= MIN_BRATE_AVQ_EXC && core_brate_inp <= MAX_BRATE_AVQ_EXC_TD && coder_type == GENERIC ) + { + /* harm. flag ACELP AVQ */ + bits--; + } + + if ( !flag_hardcoded ) + { + int16_t bit_tmp; + + bit_tmp = bits / nb_subfr; + set_s( acelp_cfg->AVQ_cdk_bits, bit_tmp, nb_subfr ); + bits -= bit_tmp * nb_subfr; + + bit_tmp = bits % nb_subfr; + acelp_cfg->AVQ_cdk_bits[0] += bit_tmp; + bits -= bit_tmp; + } + } + } + else if ( ( coder_type == UNVOICED && tdm_low_rate_mode == 1 && element_mode == IVAS_CPE_TD ) || ( ( coder_type == INACTIVE || coder_type == AUDIO ) && nb_subfr == NB_SUBFR ) || ( coder_type == INACTIVE && total_brate <= MAX_GSC_INACTIVE_BRATE ) ) + { + int32_t Local_BR, Pitch_BR; + int16_t Pitch_CT; + + /* as defined at the beginning of [enc,dec]_pit_exc() */ + if ( GSC_IVAS_mode > 0 && ( GSC_noisy_speech || core_brate > GSC_H_RATE_STG ) ) + { + Local_BR = ACELP_8k00; + Pitch_CT = GENERIC; + Pitch_BR = ACELP_8k00; + if ( L_frame == L_FRAME16k ) + { + Local_BR = ACELP_14k80; + if ( GSC_IVAS_mode > 0 && core_brate < IVAS_24k4 ) + { + Local_BR = ACELP_9k60; + } + Pitch_BR = core_brate; + } + } + else if ( GSC_noisy_speech ) + { + Local_BR = ACELP_7k20; + Pitch_CT = GENERIC; + Pitch_BR = ACELP_7k20; + if ( L_frame == L_FRAME16k ) + { + Pitch_BR = core_brate; + } + } + else + { + Local_BR = ACELP_7k20; + Pitch_CT = AUDIO; + Pitch_BR = core_brate; + + if ( L_frame == L_FRAME16k ) + { + Local_BR = ACELP_13k20; + Pitch_CT = GENERIC; + } + } + + for ( i = 0; i < nb_subfr; i++ ) + { + if ( L_frame == L_FRAME16k ) + { + acelp_cfg->pitch_bits[i] = ACB_bits_16kHz_tbl[BIT_ALLOC_IDX_16KHZ( Pitch_BR, Pitch_CT, i * L_SUBFR, 0 )]; + acelp_cfg->fixed_cdk_index[i] = FCB_bits_tbl[BIT_ALLOC_IDX( Local_BR, LOCAL_CT, i * L_SUBFR, 0 )]; + } + else + { + acelp_cfg->pitch_bits[i] = ACB_bits_tbl[BIT_ALLOC_IDX( Pitch_BR, Pitch_CT, i * L_SUBFR, 0 )]; + acelp_cfg->fixed_cdk_index[i] = FCB_bits_tbl[BIT_ALLOC_IDX( Local_BR, LOCAL_CT, i * L_SUBFR, 0 )]; + acelp_cfg->gains_mode[i] = gain_bits_tbl[BIT_ALLOC_IDX( ACELP_7k20, LOCAL_CT, i * L_SUBFR, 0 )]; + } + } + } + + if ( coder_type == TRANSITION && ( tc_call == 1 && tc_subfr == 0 && L_frame == L_FRAME ) ) + { + return error; + } + + /*-----------------------------------------------------------------* + * unused bits handling + *-----------------------------------------------------------------*/ + + acelp_cfg->ubits = 0; /* these bits could be reused for something else */ + + if ( flag_hardcoded && core_brate != PPP_NELP_2k80 ) + { + /* unused bits */ + if ( coder_type == AUDIO || ( coder_type == INACTIVE && core_brate <= ACELP_24k40 ) ) + { + acelp_cfg->ubits = 0; + } + else if ( L_frame == L_FRAME ) + { + acelp_cfg->ubits = reserved_bits_tbl[BIT_ALLOC_IDX( core_brate, coder_type, -1, TC_SUBFR2IDX( tc_subfr ) )]; + } + else + { + acelp_cfg->ubits = 0; + } + + bits -= acelp_cfg->ubits; + } + + /* sanity check */ + if ( ( coder_type != INACTIVE && nb_subfr == NB_SUBFR && coder_type != AUDIO ) || nb_subfr == NB_SUBFR16k ) + { + if ( ( L_frame == L_FRAME16k && coder_type == INACTIVE && total_brate <= MAX_GSC_INACTIVE_BRATE ) || ( GSC_IVAS_mode > 0 && L_frame == L_FRAME16k ) ) /* GSC Inactive @16kHz */ + { + acelp_cfg->ubits = 0; + } + else if ( flag_hardcoded && core == ACELP_CORE && bits != 0 ) + { + } + else if ( bits > 0 && !( coder_type == UNVOICED && tdm_low_rate_mode == 1 && element_mode == IVAS_CPE_TD ) ) + { + if ( idchan > 0 && element_mode == IVAS_CPE_TD ) + { + if ( !tdm_lp_reuse_flag ) + { + acelp_cfg->lsf_bits += bits; /* increase LSF Q bits */ + bits = 0; + } + else + { + int16_t nb_prm = 4; + + if ( tdm_low_rate_mode == 1 ) + { + nb_prm = 2; + } + /* First add remaining bits on gains */ + bits -= allocate_unused( core_brate, coder_type, bits, nb_prm, 0, GAINSPRM, acelp_cfg->gains_mode ); + + /* Then, Increase pitch bit budget */ + if ( tdm_Pitch_reuse_flag == 0 && bits > 0 ) + { + bits -= allocate_unused( core_brate, coder_type, bits, nb_prm, 0, PITCHPRM, acelp_cfg->pitch_bits ); + } + + /* Increase mid-lsf bit budget */ + if ( tdm_lp_reuse_flag == 0 && bits > 0 ) + { + bits -= allocate_unused( core_brate, coder_type, bits, 1, 0, MID_LSFSPRM, &acelp_cfg->mid_lsf_bits ); + bits -= allocate_unused( core_brate, coder_type, bits, 1, 0, LSFPRM, &acelp_cfg->lsf_bits ); + } + } + } + + else if ( core == ACELP_CORE && coder_type >= UNVOICED && coder_type <= GENERIC && L_frame == L_FRAME ) + { + acelp_cfg->lsf_bits += bits; /* increase LSF Q bits */ + + if ( acelp_cfg->lsf_bits > 46 ) + { + acelp_cfg->ubits = acelp_cfg->lsf_bits - 46; + acelp_cfg->lsf_bits = 46; + } + else if ( acelp_cfg->lsf_bits > 42 && L_frame == L_FRAME ) + { + acelp_cfg->ubits = acelp_cfg->lsf_bits - 42; + acelp_cfg->lsf_bits = 42; + } + } + else + { + acelp_cfg->ubits = bits; + } + } + else if ( bits < 0 && !( coder_type == UNVOICED && tdm_low_rate_mode == 1 && element_mode == IVAS_CPE_TD ) ) + { + } + } + + return error; +} + +/*-------------------------------------------------------------------* + * allocate_unused() + * + * Allocate unused bits + *--------------------------------------------------------------------*/ + +static int16_t allocate_unused( + const int32_t core_brate, + const int16_t coder_type, + const int16_t unused_bits, + const int16_t nb_prm, + const int16_t subfr, + const int16_t prm_type, + int16_t *prm_bit_mode ) +{ + int16_t max_bit_per_pos = 0, bit_added = 0; + + if ( prm_type == GAINSPRM ) + { + max_bit_per_pos = 6; + if ( core_brate > ACELP_8k00 ) + { + max_bit_per_pos = 7; + } + else if ( coder_type != UNVOICED ) + { + if ( subfr >= 1 ) + { + max_bit_per_pos = 7; + } + else if ( subfr == 0 ) + { + max_bit_per_pos = 8; + } + } + else if ( coder_type == UNVOICED ) + { + max_bit_per_pos = 9; /* No real limit on UC gain bit budget of the secondary channel */ + } + } + else if ( prm_type == PITCHPRM ) + { + max_bit_per_pos = 6; + if ( subfr == 0 || subfr == 2 || nb_prm == 2 ) + { + max_bit_per_pos = 10; + } + + if ( coder_type == UNVOICED ) + { + max_bit_per_pos = 0; /* Should not allocate bits in case of unvoiced coder type */ + } + } + else if ( prm_type == MID_LSFSPRM ) + { + max_bit_per_pos = 5; + } + else if ( prm_type == LSFPRM ) + { + max_bit_per_pos = 42; + } + else + { + } + + max_bit_per_pos = min( unused_bits, max_bit_per_pos - prm_bit_mode[subfr] ); + if ( max_bit_per_pos < 0 ) + { + return 0; + } + else if ( max_bit_per_pos >= 0 && subfr == ( nb_prm - 1 ) ) + { + prm_bit_mode[subfr] += max_bit_per_pos; + } + else + { + prm_bit_mode[subfr] += max_bit_per_pos; + bit_added += allocate_unused( core_brate, coder_type, unused_bits - max_bit_per_pos, nb_prm, subfr + 1, prm_type, &prm_bit_mode[0] ); + } + + return bit_added + max_bit_per_pos; +} + + +/*-------------------------------------------------------------------* + * set_ACELP_flag() + * + * set ACELP@16kHz flag + *--------------------------------------------------------------------*/ + +/*! r: ACELP16k flag */ +int16_t set_ACELP_flag( + const int16_t element_mode, /* i : element mode */ + const int32_t element_brate, /* i : element bitrate */ + const int32_t total_brate, /* i : total bitrate per channel */ + const int16_t idchan, /* i : Channel id */ + const int16_t tdm_LRTD_flag, /* i : LRTD stereo mode flag */ + const int16_t bwidth, /* i : audio bandwidth */ + const int16_t cng_type /* i : CNG type */ +) +{ + if ( element_mode == IVAS_CPE_DFT && idchan == 0 && total_brate <= SID_2k40 && bwidth == WB && cng_type == LP_CNG ) + { + + return 1; + } + else if ( element_mode == IVAS_CPE_TD ) + { + if ( element_brate >= IVAS_24k4 && idchan == 0 && ( tdm_LRTD_flag == 0 || element_brate > IVAS_24k4 ) ) + { + return 1; + } + else + { + return 0; + } + } + else if ( element_mode == IVAS_CPE_DFT ) + { + if ( element_brate >= IVAS_24k4 ) + { + return 1; + } + else + { + return 0; + } + } + else if ( element_mode == IVAS_SCE ) + { + if ( element_brate >= SCE_CORE_16k_LOW_LIMIT ) + { + return 1; + } + else + { + return 0; + } + } + else if ( total_brate >= ACELP_16k_LOW_LIMIT ) /* EVS_MONO */ + { + return 1; + } + else + { + return 0; + } +} diff --git a/lib_com/bitstream.c b/lib_com/bitstream.c new file mode 100644 index 0000000000000000000000000000000000000000..0aeed3040c4af49e164afc853feb42f903430095 --- /dev/null +++ b/lib_com/bitstream.c @@ -0,0 +1,2731 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include "options.h" +#include "cnst.h" +#include "prot.h" +#include "stat_enc.h" +#include "stat_dec.h" +#include "rom_com.h" +#include "mime.h" +#include "ivas_prot.h" +#include "ivas_cnst.h" +#include "ivas_rom_com.h" +#include "wmc_auto.h" + + +#define STEP_MAX_NUM_INDICES 100 /* increase the maximum number of allowed indices in the list by this amount */ + + +/*-------------------------------------------------------------------* + * rate2AMRWB_IOmode() + * + * lookup AMRWB IO mode + *-------------------------------------------------------------------*/ + +static Word16 rate2AMRWB_IOmode( + Word32 brate /* i : bitrate */ +) +{ + switch ( brate ) + { + /* EVS AMR-WB IO modes */ + case SID_1k75: + return AMRWB_IO_SID; + case ACELP_6k60: + return AMRWB_IO_6600; + case ACELP_8k85: + return AMRWB_IO_8850; + case ACELP_12k65: + return AMRWB_IO_1265; + case ACELP_14k25: + return AMRWB_IO_1425; + case ACELP_15k85: + return AMRWB_IO_1585; + case ACELP_18k25: + return AMRWB_IO_1825; + case ACELP_19k85: + return AMRWB_IO_1985; + case ACELP_23k05: + return AMRWB_IO_2305; + case ACELP_23k85: + return AMRWB_IO_2385; + default: + break; + } + + return -1; +} + +/*-------------------------------------------------------------------* + * rate2EVSmode() + * + * lookup EVS mode + *-------------------------------------------------------------------*/ +Word16 rate2EVSmode( + const Word32 brate, /* i : bitrate */ + int16_t *is_amr_wb /* o : (flag) does the bitrate belong to AMR-WB? Can be NULL */ +) +{ + if ( is_amr_wb != NULL ) + { + *is_amr_wb = 0; + } + + switch ( brate ) + { + /* EVS Primary modes */ + case FRAME_NO_DATA: + return NO_DATA_RECEIVED; + case SID_2k40: + return PRIMARY_SID; + case PPP_NELP_2k80: + return PRIMARY_2800; + case ACELP_7k20: + return PRIMARY_7200; + case ACELP_8k00: + return PRIMARY_8000; + case ACELP_9k60: + return PRIMARY_9600; + case ACELP_13k20: + return PRIMARY_13200; + case ACELP_16k40: + return PRIMARY_16400; + case ACELP_24k40: + return PRIMARY_24400; + case ACELP_32k: + return PRIMARY_32000; + case ACELP_48k: + return PRIMARY_48000; + case ACELP_64k: + return PRIMARY_64000; + case HQ_96k: + return PRIMARY_96000; + case HQ_128k: + return PRIMARY_128000; + default: + break; + } + + if ( is_amr_wb != NULL ) + { + *is_amr_wb = 1; + } + + return rate2AMRWB_IOmode( brate ); +} + +/*-------------------------------------------------------------------* + * ind_list_realloc() + * + * Re-allocate the list of indices + *-------------------------------------------------------------------*/ + +ivas_error ind_list_realloc( + INDICE_HANDLE old_ind_list, /* i : pointer to the beginning of the old buffer of indices */ + const int16_t max_num_indices, /* i : new maximum number of allowed indices in the list */ + Encoder_Struct *st_ivas /* i : IVAS encoder structure */ +) +{ + int16_t i, n, ch, n_channels, ind_list_pos, is_metadata, ivas_max_num_indices; + INDICE_HANDLE new_ind_list; + BSTR_ENC_HANDLE hBstr; + + if ( st_ivas == NULL ) + { + return IVAS_ERR_OK; + } + + /* get the pointer to the beginning of the old buffer of indices (either metadata or core coders) */ + if ( old_ind_list == st_ivas->ind_list_metadata ) + { + is_metadata = 1; + ivas_max_num_indices = st_ivas->ivas_max_num_indices_metadata; + } + else + { + is_metadata = 0; + ivas_max_num_indices = st_ivas->ivas_max_num_indices; + } + + /* allocate new buffer of indices */ + if ( ( new_ind_list = (INDICE_HANDLE) malloc( max_num_indices * sizeof( Indice ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for buffer of indices!\n" ) ); + } + + /* move indices from the old list to the new list */ + for ( i = 0; i < min( max_num_indices, ivas_max_num_indices ); i++ ) + { + if ( old_ind_list[i].nb_bits > -1 ) + { + new_ind_list[i].id = old_ind_list[i].id; + new_ind_list[i].value = old_ind_list[i].value; + } + new_ind_list[i].nb_bits = old_ind_list[i].nb_bits; + } + + /* reset nb_bits of all other indices to -1 */ + for ( ; i < max_num_indices; i++ ) + { + new_ind_list[i].nb_bits = -1; + } + + /* update parameters in all SCE elements */ + for ( n = 0; n < st_ivas->nSCE; n++ ) + { + /* get the pointer to hBstr */ + if ( is_metadata ) + { + hBstr = st_ivas->hSCE[n]->hMetaData; + } + else + { + hBstr = st_ivas->hSCE[n]->hCoreCoder[0]->hBstr; + } + + if ( hBstr != NULL ) + { + /* get the current position inside the old list */ + ind_list_pos = (int16_t) ( hBstr->ind_list - old_ind_list ); + + /* set pointers in the new list */ + *( hBstr->ivas_ind_list_zero ) = new_ind_list; + hBstr->ind_list = &new_ind_list[ind_list_pos]; + + /* set the new maximum number of indices */ + *( hBstr->ivas_max_num_indices ) = max_num_indices; + } + } + + /* update parameters in all CPE elements */ + for ( n = 0; n < st_ivas->nCPE; n++ ) + { + /* get the pointer to hBstr */ + if ( is_metadata ) + { + n_channels = 1; + } + else + { + n_channels = CPE_CHANNELS; + } + + for ( ch = 0; ch < n_channels; ch++ ) + { + if ( is_metadata ) + { + hBstr = st_ivas->hCPE[n]->hMetaData; + } + else + { + hBstr = st_ivas->hCPE[n]->hCoreCoder[ch]->hBstr; + } + + if ( hBstr != NULL ) + { + /* get the current position inside the old list */ + ind_list_pos = (int16_t) ( hBstr->ind_list - old_ind_list ); + + /* set pointers in the new list */ + *( hBstr->ivas_ind_list_zero ) = new_ind_list; + hBstr->ind_list = &new_ind_list[ind_list_pos]; + + /* set the new maximum number of indices */ + *( hBstr->ivas_max_num_indices ) = max_num_indices; + } + } + } + + /* free the old list */ + free( old_ind_list ); + + return IVAS_ERR_OK; +} + + +/*-----------------------------------------------------------------------* + * get_ivas_max_num_indices() + * + * Get the maximum allowed number of indices in the encoder + *-----------------------------------------------------------------------*/ + +/*! r: maximum number of indices */ +int16_t get_ivas_max_num_indices( + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const int32_t ivas_total_brate /* i : IVAS total bitrate */ +) +{ + if ( ivas_format == STEREO_FORMAT ) + { + if ( ivas_total_brate <= IVAS_16k4 ) + { + return 300; + } + else if ( ivas_total_brate <= IVAS_24k4 ) + { + return 400; + } + else if ( ivas_total_brate <= IVAS_32k ) + { + return 450; + } + else if ( ivas_total_brate <= IVAS_48k ) + { + return 650; + } + else if ( ivas_total_brate <= IVAS_80k ) + { + return 750; + } + else if ( ivas_total_brate <= IVAS_128k ) + { + return 850; + } + else if ( ivas_total_brate <= IVAS_192k ) + { + return 950; + } + else if ( ivas_total_brate <= IVAS_256k ) + { + return 1350; + } + else + { + return 1650; + } + } + else if ( ivas_format == ISM_FORMAT || ivas_format == MONO_FORMAT ) + { + if ( ivas_total_brate <= IVAS_16k4 ) + { + return 250; + } + else if ( ivas_total_brate <= IVAS_24k4 ) + { + return 350; + } + else if ( ivas_total_brate <= IVAS_32k ) + { + return 450; + } + else if ( ivas_total_brate <= IVAS_48k ) + { + return 550; + } + else if ( ivas_total_brate <= IVAS_64k ) + { + return 620; + } + else if ( ivas_total_brate <= IVAS_80k ) + { + return 670; + } + else if ( ivas_total_brate <= IVAS_96k ) + { + return 780; + } + else if ( ivas_total_brate <= IVAS_128k ) + { + return 880; + } + else if ( ivas_total_brate <= IVAS_192k ) + { + return 950; + } + else if ( ivas_total_brate <= IVAS_256k ) + { + return 1100; + } + else if ( ivas_total_brate <= IVAS_384k ) + { + return 1300; + } + else + { + return 1650; + } + } + else if ( ivas_format == SBA_FORMAT || ivas_format == SBA_ISM_FORMAT ) + { + if ( ivas_total_brate <= IVAS_16k4 ) + { + return 250; + } + else if ( ivas_total_brate <= IVAS_24k4 ) + { + return 350; + } + else if ( ivas_total_brate <= IVAS_32k ) + { + return 400; + } + else if ( ivas_total_brate <= IVAS_48k ) + { + return 650; + } + else if ( ivas_total_brate <= IVAS_80k ) + { + return 750; + } + else if ( ivas_total_brate <= IVAS_128k ) + { + return 1020; + } + else if ( ivas_total_brate <= IVAS_160k ) + { + return 1160; + } + else if ( ivas_total_brate <= IVAS_192k ) + { + return 1220; + } + else if ( ivas_total_brate <= IVAS_256k ) + { + return 1300; + } + else if ( ivas_total_brate <= IVAS_384k ) + { + return 1720; + } + else + { + return 2000; + } + } + else if ( ivas_format == MASA_FORMAT ) + { + if ( ivas_total_brate <= IVAS_16k4 ) + { + return 300; + } + else if ( ivas_total_brate <= IVAS_32k ) + { + return 400; + } + else if ( ivas_total_brate <= IVAS_48k ) + { + return 650; + } + else if ( ivas_total_brate <= IVAS_80k ) + { + return 750; + } + else if ( ivas_total_brate <= IVAS_160k ) + { + return 850; + } + else if ( ivas_total_brate <= IVAS_192k ) + { + return 950; + } + else if ( ivas_total_brate <= IVAS_256k ) + { + return 1150; + } + else if ( ivas_total_brate <= IVAS_384k ) + { + return 1450; + } + else + { + return 1650; + } + } + else if ( ivas_format == MASA_ISM_FORMAT ) + { + if ( ivas_total_brate <= IVAS_16k4 ) + { + return 300; + } + else if ( ivas_total_brate <= IVAS_32k ) + { + return 400; + } + else if ( ivas_total_brate <= IVAS_48k ) + { + return 650; + } + else if ( ivas_total_brate <= IVAS_80k ) + { + return 750; + } + else if ( ivas_total_brate <= IVAS_160k ) + { + return 1150; + } + else if ( ivas_total_brate <= IVAS_192k ) + { + return 1250; + } + else if ( ivas_total_brate <= IVAS_256k ) + { + return 1400; + } + else if ( ivas_total_brate <= IVAS_384k ) + { + return 1650; + } + else + { + return 1850; + } + } + else if ( ivas_format == MC_FORMAT ) + { + if ( ivas_total_brate <= IVAS_16k4 ) + { + return 250; + } + else if ( ivas_total_brate <= IVAS_24k4 ) + { + return 350; + } + else if ( ivas_total_brate <= IVAS_32k ) + { + return 400; + } + else if ( ivas_total_brate <= IVAS_48k ) + { + return 650; + } + else if ( ivas_total_brate <= IVAS_64k ) + { + return 750; + } + else if ( ivas_total_brate <= IVAS_80k ) + { + return 850; + } + else if ( ivas_total_brate <= IVAS_128k ) + { + return 1150; + } + else if ( ivas_total_brate <= IVAS_160k ) + { + return 1420; + } + else if ( ivas_total_brate <= IVAS_256k ) + { + return 2120; + } + else if ( ivas_total_brate <= IVAS_384k ) + { + return 2250; + } + else + { + return 2450; + } + } + + return 2450; +} + + +/*-----------------------------------------------------------------------* + * get_BWE_max_num_indices() + * + * Get the maximum number of indices in the BWE + *-----------------------------------------------------------------------*/ + +/*! r: maximum number of indices */ +int16_t get_BWE_max_num_indices( + const int32_t extl_brate /* i : extensiona layer bitrate */ +) +{ + /* set the maximum number of indices in the BWE */ + if ( extl_brate < SWB_BWE_16k ) + { + return 30; + } + else + { + return 150; + } +} + + +/*-----------------------------------------------------------------------* + * get_ivas_max_num_indices_metadata() + * + * Set the maximum allowed number of metadata indices in the list + *-----------------------------------------------------------------------*/ + +/*! r: maximum number of indices */ +int16_t get_ivas_max_num_indices_metadata( + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const int32_t ivas_total_brate /* i : IVAS total bitrate */ +) +{ + /* set the maximum required number of metadata indices */ + if ( ivas_format == MONO_FORMAT ) + { + return 0; + } + else if ( ivas_format == STEREO_FORMAT ) + { + if ( ivas_total_brate <= IVAS_16k4 ) + { + return 60; + } + else + { + return 80; + } + } + else if ( ivas_format == ISM_FORMAT ) + { + if ( ivas_total_brate <= IVAS_16k4 ) + { + return 20; + } + else if ( ivas_total_brate <= IVAS_32k ) + { + return 65; + } + else + { + return 80; + } + } + else if ( ivas_format == SBA_FORMAT || ivas_format == SBA_ISM_FORMAT ) + { + if ( ivas_total_brate <= IVAS_16k4 ) + { + return 100; + } + else if ( ivas_total_brate <= IVAS_24k4 ) + { + return 200; + } + else if ( ivas_total_brate <= IVAS_32k ) + { + return 300; + } + else if ( ivas_total_brate <= IVAS_192k ) + { + return 500; + } + else if ( ivas_total_brate <= IVAS_256k ) + { + return 1050; + } + else if ( ivas_total_brate <= IVAS_384k ) + { + return 2000; + } + else + { + return 2500; + } + } + else if ( ivas_format == MASA_FORMAT ) + { + if ( ivas_total_brate <= IVAS_16k4 ) + { + return 80; + } + else if ( ivas_total_brate <= IVAS_32k ) + { + return 125; + } + else if ( ivas_total_brate <= IVAS_48k ) + { + return 205; + } + else if ( ivas_total_brate <= IVAS_96k ) + { + return 240; + } + else if ( ivas_total_brate <= IVAS_128k ) + { + return 305; + } + else if ( ivas_total_brate <= IVAS_160k ) + { + return 425; + } + else if ( ivas_total_brate <= IVAS_192k ) + { + return 630; + } + else if ( ivas_total_brate <= IVAS_256k ) + { + return 850; + } + else if ( ivas_total_brate <= IVAS_384k ) + { + return 1000; + } + else + { + return 1750; + } + } + else if ( ivas_format == MASA_ISM_FORMAT ) + { + if ( ivas_total_brate <= IVAS_16k4 ) + { + return 80; + } + else if ( ivas_total_brate <= IVAS_32k ) + { + return 125 + 100; + } + else if ( ivas_total_brate <= IVAS_48k ) + { + return 205 + 100; + } + else if ( ivas_total_brate <= IVAS_96k ) + { + return 240 + 150; + } + else if ( ivas_total_brate <= IVAS_128k ) + { + return 305 + 30; + } + else if ( ivas_total_brate <= IVAS_160k ) + { + return 425 + 30; + } + else if ( ivas_total_brate <= IVAS_192k ) + { + return 630 + 30; + } + else if ( ivas_total_brate <= IVAS_256k ) + { + return 850 + 30; + } + else if ( ivas_total_brate <= IVAS_384k ) + { + return 1000 + 30; + } + else + { + return 1750 + 30; + } + } + else if ( ivas_format == MC_FORMAT ) + { + if ( ivas_total_brate <= IVAS_13k2 ) + { + return 80; + } + else if ( ivas_total_brate <= IVAS_24k4 ) + { + return 100; + } + else if ( ivas_total_brate <= IVAS_64k ) + { + return 210; + } + else if ( ivas_total_brate <= IVAS_96k ) + { + return 220; + } + else + { + return 300; + } + } + + return 50; +} + +/*-------------------------------------------------------------------* + * move_indices() + * + * Move indices inside the buffer or among two buffers + *-------------------------------------------------------------------*/ + +void move_indices( + INDICE_HANDLE old_ind_list, /* i/o: old location of indices */ + INDICE_HANDLE new_ind_list, /* i/o: new location of indices */ + const int16_t nb_indices /* i : number of moved indices */ +) +{ + int16_t i; + + if ( new_ind_list < old_ind_list ) + { + for ( i = 0; i < nb_indices; i++ ) + { + new_ind_list[i].id = old_ind_list[i].id; + new_ind_list[i].value = old_ind_list[i].value; + new_ind_list[i].nb_bits = old_ind_list[i].nb_bits; + + old_ind_list[i].nb_bits = -1; + } + } + else if ( new_ind_list > old_ind_list ) + { + for ( i = nb_indices - 1; i >= 0; i-- ) + { + new_ind_list[i].id = old_ind_list[i].id; + new_ind_list[i].value = old_ind_list[i].value; + new_ind_list[i].nb_bits = old_ind_list[i].nb_bits; + + old_ind_list[i].nb_bits = -1; + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * check_ind_list_limits() + * + * Check, if the maximum number of indices has been reached -> reallocate + * Check, if we will not overwrite an existing indice -> adjust the location + *-------------------------------------------------------------------*/ + +ivas_error check_ind_list_limits( + BSTR_ENC_HANDLE hBstr /* i/o: encoder bitstream handle */ +) +{ + Indice *ivas_ind_list_zero, *ivas_ind_list_last; + ivas_error error; + + error = IVAS_ERR_OK; + ivas_ind_list_zero = *( hBstr->ivas_ind_list_zero ); + + /* check, if the maximum number of indices has been reached and re-allocate the buffer */ + /* the re-allocation can be avoided by increasing the limits in get_ivas_max_num_indices() or get_ivas_max_num_indices_metadata() */ + if ( ( &hBstr->ind_list[hBstr->nb_ind_tot] - ivas_ind_list_zero ) >= *( hBstr->ivas_max_num_indices ) ) + { + + /* reallocate the buffer of indices with increased limit */ + if ( ( error = ind_list_realloc( *hBstr->ivas_ind_list_zero, *( hBstr->ivas_max_num_indices ) + STEP_MAX_NUM_INDICES, hBstr->st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* check, if we will not overwrite an existing indice */ + if ( hBstr->ind_list[hBstr->nb_ind_tot].nb_bits > 0 ) + { + if ( hBstr->nb_ind_tot == 0 ) + { + /* move the pointer to the next available empty slot */ + ivas_ind_list_last = &ivas_ind_list_zero[*( hBstr->ivas_max_num_indices )]; + while ( hBstr->ind_list[0].nb_bits > 0 && hBstr->ind_list < ivas_ind_list_last ) + { + hBstr->ind_list++; + } + + if ( hBstr->ind_list >= ivas_ind_list_last ) + { + + /* no available empty slot -> need to re-allocate the buffer */ + if ( ( error = ind_list_realloc( *hBstr->ivas_ind_list_zero, *( hBstr->ivas_max_num_indices ) + STEP_MAX_NUM_INDICES, hBstr->st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + else + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Buffer of indices corrupted in frame %d! Attempt to overwrite indice ID = %d (value: %d, bits: %d)!\n", frame, hBstr->ind_list[hBstr->nb_ind_tot].id, hBstr->ind_list[hBstr->nb_ind_tot].value, hBstr->ind_list[hBstr->nb_ind_tot].nb_bits ); + } + } + + return error; +} + + +/*-------------------------------------------------------------------* + * push_indice() + * + * Push a new indice into the buffer + *-------------------------------------------------------------------*/ + +ivas_error push_indice( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + int16_t id, /* i : ID of the indice */ + uint16_t value, /* i : value of the quantized indice */ + int16_t nb_bits /* i : number of bits used to quantize the indice */ +) +{ + int16_t i; + int16_t j; + ivas_error error; + + error = IVAS_ERR_OK; + + + /* check the limits of the list of indices */ + if ( ( error = check_ind_list_limits( hBstr ) ) != IVAS_ERR_OK ) + { + return IVAS_ERROR( error, "Error occured in push_indice() while re-allocating the list of indices (frame %d) !\n", frame ); + } + + /* find the location in the list of indices based on ID */ + i = hBstr->nb_ind_tot; + while ( i > 0 && id < hBstr->ind_list[i - 1].id ) + { + i--; + } + + /* shift indices, if the new ID is to be written somewhere inside the list */ + if ( i < hBstr->nb_ind_tot ) + { + for ( j = hBstr->nb_ind_tot; j > i; j-- ) + { + hBstr->ind_list[j].id = hBstr->ind_list[j - 1].id; + hBstr->ind_list[j].nb_bits = hBstr->ind_list[j - 1].nb_bits; + hBstr->ind_list[j].value = hBstr->ind_list[j - 1].value; + } + } + + + /* store the new indice in the list */ + hBstr->ind_list[i].id = id; + hBstr->ind_list[i].value = value; + hBstr->ind_list[i].nb_bits = nb_bits; + + /* updates */ + hBstr->nb_ind_tot++; + hBstr->nb_bits_tot += nb_bits; + + return error; +} + +/*-------------------------------------------------------------------* + * push_next_indice() + * + * Push a new indice into the buffer at the next position + *-------------------------------------------------------------------*/ + +ivas_error push_next_indice( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + uint16_t value, /* i : value of the quantized indice */ + int16_t nb_bits /* i : number of bits used to quantize the indice */ +) +{ + int16_t prev_id; + ivas_error error; + + error = IVAS_ERR_OK; + + + /* check the limits of the list of indices */ + if ( ( error = check_ind_list_limits( hBstr ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* get the id of the previous indice -> it will be re-used */ + if ( hBstr->nb_ind_tot > 0 ) + { + prev_id = hBstr->ind_list[hBstr->nb_ind_tot - 1].id; + } + else + { + prev_id = 0; + } + + /* store the values in the list */ + hBstr->ind_list[hBstr->nb_ind_tot].id = prev_id; + hBstr->ind_list[hBstr->nb_ind_tot].value = value; + hBstr->ind_list[hBstr->nb_ind_tot].nb_bits = nb_bits; + + /* updates */ + hBstr->nb_ind_tot++; + hBstr->nb_bits_tot += nb_bits; + + return error; +} + + +/*-------------------------------------------------------------------* + * push_next_bits() + * Push a bit buffer into the buffer at the next position + *-------------------------------------------------------------------*/ + +ivas_error push_next_bits( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const uint16_t bits[], /* i : bit buffer to pack, sequence of single bits */ + const int16_t nb_bits /* i : number of bits to pack */ +) +{ + uint16_t code; + int16_t i, nb_bits_m15; + Indice *ptr; + int16_t prev_id; + ivas_error error; + + error = IVAS_ERR_OK; + + ptr = &hBstr->ind_list[hBstr->nb_ind_tot]; + + /* get the id of the previous indice -> will be re-used */ + if ( hBstr->nb_ind_tot > 0 ) + { + prev_id = hBstr->ind_list[hBstr->nb_ind_tot - 1].id; + } + else + { + prev_id = 0; + } + nb_bits_m15 = nb_bits - 15; + + for ( i = 0; i < nb_bits_m15; i += 16 ) + { + code = (uint16_t) ( ( bits[i] << 15 ) | ( ( bits[i + 1] << 14 ) | ( ( bits[i + 2] << 13 ) | ( ( bits[i + 3] << 12 ) | ( ( bits[i + 4] << 11 ) | ( ( bits[i + 5] << 10 ) | ( ( bits[i + 6] << 9 ) | ( ( bits[i + 7] << 8 ) | ( ( bits[i + 8] << 7 ) | ( ( bits[i + 9] << 6 ) | ( ( bits[i + 10] << 5 ) | ( ( bits[i + 11] << 4 ) | ( ( bits[i + 12] << 3 ) | ( ( bits[i + 13] << 2 ) | ( ( bits[i + 14] << 1 ) | bits[i + 15] ) ) ) ) ) ) ) ) ) ) ) ) ) ) ); + + /* check the limits of the list of indices */ + if ( ( error = check_ind_list_limits( hBstr ) ) != IVAS_ERR_OK ) + { + return IVAS_ERROR( error, "Error occured in push_next_bits() while re-allocating the list of indices (frame %d) !\n", frame ); + } + ptr = &hBstr->ind_list[hBstr->nb_ind_tot]; + + ptr->value = code; + ptr->nb_bits = 16; + ptr->id = prev_id; + hBstr->nb_ind_tot++; + ++ptr; + } + + for ( ; i < nb_bits; ++i ) + { + /* check the limits of the list of indices */ + if ( ( error = check_ind_list_limits( hBstr ) ) != IVAS_ERR_OK ) + { + return IVAS_ERROR( error, "Error occured in push_next_bits() while re-allocating the list of indices (frame %d) !\n", frame ); + } + ptr = &hBstr->ind_list[hBstr->nb_ind_tot]; + + ptr->value = bits[i]; + ptr->nb_bits = 1; + ptr->id = prev_id; + hBstr->nb_ind_tot++; + ++ptr; + } + + hBstr->nb_bits_tot = hBstr->nb_bits_tot + nb_bits; + + return error; +} + + +/*-------------------------------------------------------------------* + * find_indice() + * + * Find indice based on its id + *-------------------------------------------------------------------*/ + +/*! r: result: index of the indice in the list, -1 if not found */ +int16_t find_indice( + BSTR_ENC_HANDLE hBstr, /* i : encoder bitstream handle */ + const int16_t id, /* i : ID of the indice */ + uint16_t *value, /* o : value of the quantized indice */ + int16_t *nb_bits /* o : number of bits used to quantize the indice */ +) +{ + int16_t i; + + for ( i = 0; i < hBstr->nb_ind_tot; i++ ) + { + if ( hBstr->ind_list[i].id == id && hBstr->ind_list[i].nb_bits > 0 ) + { + *value = hBstr->ind_list[i].value; + *nb_bits = hBstr->ind_list[i].nb_bits; + return i; + } + } + + return -1; +} + + +/*-------------------------------------------------------------------* + * delete_indice() + * + * Delete indice based on its id (note, that nb_ind_tot and nb_bits_tot are updated) + *-------------------------------------------------------------------*/ + +/*! r: number of deleted indices */ +uint16_t delete_indice( + BSTR_ENC_HANDLE hBstr, /* i : encoder bitstream handle */ + const int16_t id /* i : ID of the indice */ +) +{ + int16_t i, j; + + j = 0; + for ( i = 0; i < hBstr->nb_ind_tot; i++ ) + { + if ( hBstr->ind_list[i].id == id ) + { + hBstr->nb_bits_tot -= hBstr->ind_list[i].nb_bits; + continue; + } + + if ( j < i ) + { + /* shift the indice left */ + hBstr->ind_list[j].id = hBstr->ind_list[i].id; + hBstr->ind_list[j].value = hBstr->ind_list[i].value; + hBstr->ind_list[j].nb_bits = hBstr->ind_list[i].nb_bits; + } + + j++; + } + + hBstr->nb_ind_tot = j; + + for ( ; j < i; j++ ) + { + /* reset the shifted indices at the end of the list */ + hBstr->ind_list[j].nb_bits = -1; + } + + return i - j; +} + + +/*-------------------------------------------------------------------* + * get_next_indice() + * + * Get the next indice from the buffer + *-------------------------------------------------------------------*/ + +/*! r: value of the indice */ +uint16_t get_next_indice( + Decoder_State *st, /* i/o: decoder state structure */ + int16_t nb_bits /* i : number of bits that were used to quantize the indice */ +) +{ + uint16_t value; + int16_t i; + int32_t nbits_total; + + assert( nb_bits <= 16 ); + + nbits_total = st->total_brate / FRAMES_PER_SEC; + /* detect corrupted bitstream */ + if ( st->next_bit_pos + nb_bits > nbits_total ) + { + st->BER_detect = 1; + return ( 0 ); + } + + value = 0; + for ( i = 0; i < nb_bits; i++ ) + { + value <<= 1; + value += st->bit_stream[st->next_bit_pos + i]; + } + + /* update the position in the bitstream */ + st->next_bit_pos += nb_bits; + + return value; +} + +/*-------------------------------------------------------------------* + * get_next_indice_1() + * + * Get the next 1-bit indice from the buffer + *-------------------------------------------------------------------*/ + +/*! r: value of the indice */ +uint16_t get_next_indice_1( + Decoder_State *st /* i/o: decoder state structure */ +) +{ + int32_t nbits_total; + nbits_total = st->total_brate / FRAMES_PER_SEC; + /* detect corrupted bitstream */ + if ( ( st->next_bit_pos + 1 > nbits_total && st->codec_mode == MODE1 ) || + ( ( st->next_bit_pos + 1 > nbits_total + ( 2 * 8 ) ) && st->codec_mode == MODE2 ) /* add two zero bytes for arithmetic coder flush */ + ) + { + st->BER_detect = 1; + return ( 0 ); + } + + return st->bit_stream[st->next_bit_pos++]; +} + +/*-------------------------------------------------------------------* + * get_next_indice_tmp() + * + * update the total number of bits and the position in the bitstream + *-------------------------------------------------------------------*/ + +void get_next_indice_tmp( + Decoder_State *st, /* o : decoder state structure */ + int16_t nb_bits /* i : number of bits that were used to quantize the indice */ +) +{ + /* update the position in the bitstream */ + st->next_bit_pos += nb_bits; + + return; +} + +/*-------------------------------------------------------------------* + * get_indice() + * + * Get indice at specific position in the buffer + *-------------------------------------------------------------------*/ + +/*! r: value of the indice */ +uint16_t get_indice( + Decoder_State *st, /* i/o: decoder state structure */ + int16_t pos, /* i : absolute position in the bitstream (update after the read) */ + int16_t nb_bits /* i : number of bits that were used to quantize the indice */ +) +{ + uint16_t value; + int16_t i; + int32_t nbits_total; + + assert( nb_bits <= 16 ); + + nbits_total = st->total_brate / FRAMES_PER_SEC; + + /* detect corrupted bitstream */ + if ( pos + nb_bits > nbits_total ) + { + st->BER_detect = 1; + return ( 0 ); + } + + value = 0; + for ( i = 0; i < nb_bits; i++ ) + { + value <<= 1; + value += st->bit_stream[pos + i]; + } + return value; +} + +/*-------------------------------------------------------------------* + * get_indice_st() + * + * Get indice at specific position in the buffer + *-------------------------------------------------------------------*/ + +/*! r: value of the indice */ +uint16_t get_indice_st( + Decoder_State *st, /* i/o: decoder state structure */ + const int32_t element_brate, /* i : element bitrate */ + const int16_t pos, /* i : absolute position in the bitstream */ + const int16_t nb_bits /* i : number of bits to quantize the indice */ +) +{ + uint16_t value; + int16_t i; + + assert( nb_bits <= 16 ); + + /* detect corrupted bitstream */ + if ( pos + nb_bits > element_brate / FRAMES_PER_SEC ) + { + st->BER_detect = 1; + return ( 0 ); + } + + value = 0; + for ( i = 0; i < nb_bits; i++ ) + { + value <<= 1; + value += st->bit_stream[pos + i]; + } + + return value; +} + +/*-------------------------------------------------------------------* + * get_indice_1() + * + * Get a 1-bit indice at specific position in the buffer + *-------------------------------------------------------------------*/ + +/*! r: value of the indice */ +uint16_t get_indice_1( + Decoder_State *st, /* i/o: decoder state structure */ + int16_t pos /* i : absolute position in the bitstream (update after the read) */ +) +{ + int32_t nbits_total; + nbits_total = st->total_brate / FRAMES_PER_SEC; + /* detect corrupted bitstream */ + if ( pos + 1 > nbits_total ) + { + st->BER_detect = 1; + return ( 0 ); + } + + return st->bit_stream[pos]; +} + +#define WMC_TOOL_SKIP + +/*-------------------------------------------------------------------* + * reset_indices_enc() + * + * Reset the buffer of encoder indices + *-------------------------------------------------------------------*/ + +void reset_indices_enc( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const int16_t max_num_indices /* i : max number of indices */ +) +{ + int16_t i; + + hBstr->nb_bits_tot = 0; + hBstr->nb_ind_tot = 0; + + for ( i = 0; i < max_num_indices; i++ ) + { + hBstr->ind_list[i].nb_bits = -1; + } + + return; +} + +/*-------------------------------------------------------------------* + * reset_indices_dec() + * + * Reset the buffer of decoder indices + *-------------------------------------------------------------------*/ + +void reset_indices_dec( + Decoder_State *st ) +{ + st->next_bit_pos = 0; + + return; +} + +/*-------------------------------------------------------------------* + * write_indices_to_stream() + * + * writing forward or backward to a serial stream + *-------------------------------------------------------------------*/ + +static int16_t write_indices_to_stream( + Indice *ind_list, + uint16_t **pt_stream, + const int16_t inc, + const int16_t num_indices ) +{ + int16_t i, k; + int16_t value, nb_bits; + uint16_t mask; + + for ( i = 0; i < num_indices; i++ ) + { + value = ind_list[i].value; + nb_bits = ind_list[i].nb_bits; + + if ( nb_bits > 0 ) + { + /* mask from MSB to LSB */ + mask = 1 << ( nb_bits - 1 ); + + /* write bit by bit */ + for ( k = 0; k < nb_bits; k++ ) + { + if ( value & mask ) + { + **pt_stream = 1; + *pt_stream += inc; + } + else + { + **pt_stream = 0; + *pt_stream += inc; + } + + mask >>= 1; + } + } + } + return 0; +} + +/*-------------------------------------------------------------------* + * write_indices_element() + * + * Bitstream writing function of one element (one SCE or one CPE) + *-------------------------------------------------------------------*/ + +static ivas_error write_indices_element( + Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ + uint16_t **pt_stream, /* i : pointer to bitstream buffer */ + const int16_t is_SCE, /* i : flag to distingusih SCE and CPE */ + const int16_t element_id /* i : id of the SCE or CPE */ +) +{ + int16_t ch; + Encoder_State **sts = NULL; + uint16_t *pt_stream_loc; + uint16_t *pt_stream_backup; + uint16_t *pt_stream_end; + int16_t nb_bits_tot_metadata; + int16_t nb_ind_tot_metadata; + + Indice *ind_list_metadata; + int16_t n, n_channels; + ivas_error error; + + error = IVAS_ERR_OK; + + ind_list_metadata = NULL; + nb_ind_tot_metadata = 0; + + if ( st_ivas->hEncoderConfig->ivas_format == MONO_FORMAT ) + { + sts = st_ivas->hSCE[0]->hCoreCoder; + nb_bits_tot_metadata = 0; + } + else + { + nb_bits_tot_metadata = 0; + if ( is_SCE && st_ivas->hSCE[element_id] != NULL ) + { + sts = st_ivas->hSCE[element_id]->hCoreCoder; + + if ( st_ivas->hSCE[element_id]->hMetaData != NULL ) + { + nb_bits_tot_metadata = st_ivas->hSCE[element_id]->hMetaData->nb_bits_tot; + ind_list_metadata = st_ivas->hSCE[element_id]->hMetaData->ind_list; + nb_ind_tot_metadata = st_ivas->hSCE[element_id]->hMetaData->nb_ind_tot; + } + } + else if ( !is_SCE && st_ivas->hCPE[element_id] != NULL ) + { + sts = st_ivas->hCPE[element_id]->hCoreCoder; + + if ( st_ivas->hCPE[element_id]->hMetaData != NULL ) + { + nb_bits_tot_metadata = st_ivas->hCPE[element_id]->hMetaData->nb_bits_tot; + ind_list_metadata = st_ivas->hCPE[element_id]->hMetaData->ind_list; + nb_ind_tot_metadata = st_ivas->hCPE[element_id]->hMetaData->nb_ind_tot; + } + } + } + + n_channels = 1; + if ( sts[0]->element_mode > IVAS_CPE_DFT ) + { + n_channels = CPE_CHANNELS; + } + + /*----------------------------------------------------------------* + * Bitstream packing (conversion of individual indices into a serial stream) + *----------------------------------------------------------------*/ + + pt_stream_loc = *pt_stream; + pt_stream_end = pt_stream_loc; + + for ( n = 0; n < n_channels; n++ ) + { + /* write the metadata buffer */ + if ( n == 0 && nb_bits_tot_metadata != 0 ) + { + pt_stream_backup = pt_stream_loc; + + for ( ch = 0; ch < n_channels; ch++ ) + { + pt_stream_loc += sts[ch]->hBstr->nb_bits_tot; + } + pt_stream_loc += nb_bits_tot_metadata - 1; + pt_stream_end = pt_stream_loc + 1; + + write_indices_to_stream( ind_list_metadata, &pt_stream_loc, -1, + nb_ind_tot_metadata ); + + /* restore previous pointer position */ + pt_stream_loc = pt_stream_backup; + } + write_indices_to_stream( sts[n]->hBstr->ind_list, &pt_stream_loc, 1, + sts[n]->hBstr->nb_ind_tot ); + + if ( pt_stream_loc > pt_stream_end ) + { + pt_stream_end = pt_stream_loc; + } + } + + /*----------------------------------------------------------------* + * Clearing of indices + * Reset index pointers + *----------------------------------------------------------------*/ + + if ( is_SCE ) /* EVS and SCE */ + { + if ( st_ivas->hSCE[element_id]->hMetaData != NULL ) + { + reset_indices_enc( st_ivas->hSCE[element_id]->hMetaData, st_ivas->hSCE[element_id]->hMetaData->nb_ind_tot ); + } + + reset_indices_enc( sts[0]->hBstr, sts[0]->hBstr->nb_ind_tot ); + } + else + { + if ( st_ivas->hCPE[element_id]->hMetaData != NULL ) + { + reset_indices_enc( st_ivas->hCPE[element_id]->hMetaData, st_ivas->hCPE[element_id]->hMetaData->nb_ind_tot ); + } + + for ( n = 0; n < n_channels; n++ ) + { + reset_indices_enc( sts[n]->hBstr, sts[n]->hBstr->nb_ind_tot ); + } + } + + /* update pointer */ + *pt_stream = pt_stream_end; + + return error; +} + +/*-------------------------------------------------------------------* + * write_indices_ivas() + * + * Write the buffer of indices to a serial bitstream buffer, + * each bit represented as a uint16_t of value 0 or 1 + *-------------------------------------------------------------------*/ + +ivas_error write_indices_ivas( + Encoder_Struct *st_ivas, /* i/o: encoder state structure */ + uint16_t *bit_stream, /* i/o: output bitstream */ + uint16_t *num_bits /* i : number of indices written to output */ +) +{ + int16_t i, n; + uint16_t *pt_stream; + ivas_error error; + + error = IVAS_ERR_OK; + + pt_stream = bit_stream; + for ( i = 0; i < MAX_BITS_PER_FRAME; ++i ) + { + bit_stream[i] = 0; + } + + + /*-----------------------------------------------------------------* + * Encode Payload + *-----------------------------------------------------------------*/ + + for ( n = 0; n < st_ivas->nSCE; n++ ) + { + write_indices_element( st_ivas, &pt_stream, 1, n ); + } + + for ( n = 0; n < st_ivas->nCPE; n++ ) + { + write_indices_element( st_ivas, &pt_stream, 0, n ); + } + + *num_bits = (uint16_t) ( pt_stream - bit_stream ); + + return error; +} + + +/*---------------------------------------------------------------------* + * convertSerialToBytestream( ) + * + * convert 16-bit short serial streams with 0x0000 and 0x0001 to a bytstream + *---------------------------------------------------------------------*/ + +void convertSerialToBytestream( + const uint16_t *const serial, /* i : input serial bitstream with values 0 and 1 */ + const uint16_t num_bits, /* i : number of bits in the input bitstream */ + uint8_t *const bytestream /* o : output compact bitstream (bytestream) */ +) +{ + uint32_t i; + uint8_t bit, bitinbyte; + + for ( i = 0; i < num_bits; ++i ) + { + bit = ( serial[i] == 0x0001 ) ? 1 : 0; + bitinbyte = bit << ( 7 - ( i & 0x7 ) ); + if ( !( i & 0x7 ) ) + { + bytestream[i >> 3] = 0; + } + bytestream[i >> 3] |= bitinbyte; + } + + return; +} + +/*---------------------------------------------------------------------* + * convertBytestreamToSerial( ) + * + * convert bytestream to 16-bit short serial streams with 0x0000 and 0x0001 + *---------------------------------------------------------------------*/ + +void convertBytestreamToSerial( + const uint8_t *const bytestream, /* i : input compact bitstream (bytestream) */ + const uint16_t num_bits, /* i : number of bits in the input bitstream */ + uint16_t *const serial /* o : output serial bitstream with values 0 and 1 */ +) +{ + uint32_t i; + + for ( i = 0; i < num_bits; ++i ) + { + serial[i] = ( bytestream[( i >> 3 )] >> ( 7 - ( i & 7 ) ) ) & 0x1; + } +} + +/*-------------------------------------------------------------------* + * decoder_selectCodec() + * + * + *-------------------------------------------------------------------*/ + +static void decoder_selectCodec( + Decoder_State *st, /* i/o: decoder state structure */ + const int32_t total_brate, /* i : total bitrate */ + const int16_t bit0 /* i : first bit */ +) +{ + /* set the AMR-WB IO flag */ + if ( rate2AMRWB_IOmode( total_brate ) != -1 ) + { + st->Opt_AMR_WB = 1; + } + else if ( total_brate != FRAME_NO_DATA ) + { + st->Opt_AMR_WB = 0; + } + + if ( st->Opt_AMR_WB ) + { + st->codec_mode = MODE1; + } + else + { + st->codec_mode = get_codec_mode( total_brate ); + + if ( st->codec_mode == -1 ) + { + switch ( total_brate ) + { + case 0: + st->codec_mode = st->last_codec_mode; + break; + case 2400: + st->codec_mode = st->last_codec_mode; + break; + case 2800: + st->codec_mode = MODE1; + break; + default: /* validate that total_brate (derived from RTP packet or a file header) is one of the defined bitrates */ + st->codec_mode = st->last_codec_mode; + st->bfi = 1; + break; + } + } + } + + if ( st->ini_frame == 0 ) + { + if ( st->codec_mode == -1 ) + { + st->codec_mode = MODE1; + } + st->last_codec_mode = st->codec_mode; + } + + /* set SID/CNG type */ + if ( total_brate == SID_2k40 ) + { + if ( bit0 == 0 ) + { + st->cng_type = LP_CNG; + + /* force MODE1 when selecting LP_CNG */ + st->codec_mode = MODE1; + } + else if ( bit0 == 1 ) + { + st->cng_type = FD_CNG; + if ( st->last_codec_mode == MODE2 && st->last_total_brate == ACELP_13k20 ) + { + st->codec_mode = MODE1; + } + } + } + + return; +} + +/*-------------------------------------------------------------------* + * dec_prm_core() + * + * + *-------------------------------------------------------------------*/ + +static void dec_prm_core( + Decoder_State *st ) +{ + int16_t n, frame_size_index = -1; + + st->core = -1; + + if ( st->total_brate == FRAME_NO_DATA ) + { + st->m_frame_type = ZERO_FRAME; + } + else if ( st->total_brate == SID_2k40 ) + { + st->m_frame_type = SID_FRAME; + } + else + { + st->m_frame_type = ACTIVE_FRAME; + for ( n = 0; n < FRAME_SIZE_NB; ++n ) + { + if ( FrameSizeConfig[n].frame_bits == st->total_brate / FRAMES_PER_SEC ) + { + frame_size_index = n; + break; + } + } + + /* Get audio bandwidth info */ + st->bwidth = get_next_indice( st, FrameSizeConfig[frame_size_index].bandwidth_bits ); + st->bwidth += FrameSizeConfig[frame_size_index].bandwidth_min; + if ( st->bwidth > FB ) + { + st->bwidth = FB; + st->BER_detect = 1; + } + + if ( st->bwidth > SWB && st->total_brate < ACELP_16k40 ) + { + st->bwidth = SWB; + st->BER_detect = 1; + } + /* Skip reserved bit */ + get_next_indice_tmp( st, FrameSizeConfig[frame_size_index].reserved_bits ); + + if ( get_next_indice_1( st ) ) /* TCX */ + { + if ( get_next_indice_1( st ) ) + { + st->core = HQ_CORE; + } + else + { + st->core = TCX_20_CORE; + } + } + else /* ACELP */ + { + st->core = ACELP_CORE; + } + } + + return; +} + +/*-----------------------------------------------------------------* + * decision_matrix_core_dec() + * + * Read core signaling bits from the bitstream + * Set st->core, and st->bwidth if signalled together with the core. + *-----------------------------------------------------------------*/ + +static void decision_matrix_core_dec( + Decoder_State *st /* i/o: decoder state structure */ +) +{ + int16_t start_idx; + int32_t ind; + int16_t nBits; + + assert( st->bfi != 1 ); + + st->core = -1; + st->bwidth = -1; + + if ( st->total_brate == FRAME_NO_DATA || st->total_brate == SID_2k40 ) + { + st->core = ACELP_CORE; + } + /* SC-VBR */ + else if ( st->total_brate == PPP_NELP_2k80 ) + { + st->core = ACELP_CORE; + return; + } + + /*---------------------------------------------------------------------* + * ACELP/HQ core selection + *---------------------------------------------------------------------*/ + + if ( st->total_brate < ACELP_24k40 ) + { + st->core = ACELP_CORE; + } + else if ( st->total_brate >= ACELP_24k40 && st->total_brate <= ACELP_64k ) + { + /* read the ACELP/HQ core selection bit */ + st->core = get_next_indice( st, 1 ) * HQ_CORE; + } + else + { + st->core = HQ_CORE; + } + + /*-----------------------------------------------------------------* + * Read ACELP signaling bits from the bitstream + *-----------------------------------------------------------------*/ + + if ( st->core == ACELP_CORE ) + { + /* find the section in the ACELP signaling table corresponding to bitrate */ + start_idx = 0; + while ( acelp_sig_tbl[start_idx] != st->total_brate ) + { + start_idx++; + } + + /* skip the bitrate */ + start_idx += 1; + + /* retrieve the number of bits */ + nBits = (int16_t) acelp_sig_tbl[start_idx++]; + + /* retrieve the signaling indice */ + ind = acelp_sig_tbl[start_idx + get_next_indice( st, nBits )]; + st->bwidth = ( ind >> 3 ) & 0x7; + + /* convert signaling indice into signaling information */ + if ( ( ind & 0x7 ) == LR_MDCT ) + { + st->core = HQ_CORE; + } + } + + /*-----------------------------------------------------------------* + * Read HQ signaling bits from the bitstream + * Set HQ core type + *-----------------------------------------------------------------*/ + + if ( st->core == HQ_CORE ) + { + /* read the HQ/TCX core switching flag */ + if ( get_next_indice( st, 1 ) ) + { + st->core = TCX_20_CORE; + } + + /* For TCX: read/set band-width (needed for different I/O sampling rate support) */ + if ( st->core == TCX_20_CORE && st->total_brate > ACELP_16k40 ) + { + ind = get_next_indice( st, 2 ); + + if ( ind == 0 ) + { + st->bwidth = NB; + } + else if ( ind == 1 ) + { + st->bwidth = WB; + } + else if ( ind == 2 ) + { + st->bwidth = SWB; + } + else + { + st->bwidth = FB; + } + } + } + + return; +} + +/*-------------------------------------------------------------------* + * mdct_switching_dec() + * + * Set up MDCT core switching if indicated in the bitstream + *-------------------------------------------------------------------*/ + +void mdct_switching_dec( + Decoder_State *st /* i/o: decoder state structure */ +) +{ + if ( !st->bfi ) + { + + if ( st->Opt_AMR_WB ) + { + return; + } + + + if ( st->total_brate == ACELP_13k20 || st->total_brate == ACELP_32k ) + { + st->mdct_sw_enable = MODE1; + } + else if ( ACELP_16k40 <= st->total_brate && st->total_brate <= ACELP_24k40 ) + { + st->mdct_sw_enable = MODE2; + } + + if ( st->codec_mode == MODE1 && st->mdct_sw_enable == MODE1 ) + { + /* Read ahead core signaling */ + int16_t next_bit_pos_save = st->next_bit_pos; + int16_t core_save = st->core; + int16_t bwidth_save = st->bwidth; + + decision_matrix_core_dec( st ); /* sets st->core */ + + if ( st->core == TCX_20_CORE ) + { + /* Trigger TCX */ + st->codec_mode = MODE2; + st->mdct_sw = MODE1; + } + else + { + /* Rewind bitstream */ + st->next_bit_pos = next_bit_pos_save; + if ( st->bfi ) + { + st->core = core_save; + st->bwidth = bwidth_save; + } + } + } + else if ( st->codec_mode == MODE2 && st->mdct_sw_enable == MODE2 ) + { + /* Read ahead core signaling */ + int16_t next_bit_pos_save = st->next_bit_pos; + int16_t core_save = st->core; + int16_t bwidth_save = st->bwidth; + + dec_prm_core( st ); /* sets st->core */ + + if ( st->core == HQ_CORE ) + { + /* Trigger HQ_CORE */ + st->codec_mode = MODE1; + st->mdct_sw = MODE2; + } + else + { + /* Rewind bitstream */ + st->next_bit_pos = next_bit_pos_save; + if ( st->bfi ) + { + st->core = core_save; + } + /* always reset bwidth, to not interfere with BER logic */ + st->bwidth = bwidth_save; + } + } + } + + return; +} + + + + + +/*-------------------------------------------------------------------* + * reset_elements() + * + * Simulate packet losses by reading FEC pattern from external file + *-------------------------------------------------------------------*/ + +Decoder_State **reset_elements( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +) +{ + int16_t k, n; + Decoder_State **sts = NULL; /* to avoid compilation warning */ + + for ( k = 0; k < st_ivas->nSCE; k++ ) + { + sts = st_ivas->hSCE[k]->hCoreCoder; + + sts[0]->bfi = 0; + sts[0]->BER_detect = 0; + sts[0]->mdct_sw_enable = 0; + sts[0]->mdct_sw = 0; + + reset_indices_dec( sts[0] ); + } + + for ( k = 0; k < st_ivas->nCPE; k++ ) + { + sts = st_ivas->hCPE[k]->hCoreCoder; + + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + sts[n]->bfi = 0; + sts[n]->BER_detect = 0; + sts[n]->mdct_sw_enable = 0; + sts[n]->mdct_sw = 0; + + reset_indices_dec( sts[n] ); + } + } + + return sts; /* return last decoder state */ +} + + +/*-------------------------------------------------------------------* + * ivas_set_bitstream_pointers() + * + * Set bitstream pointers for every SCE/CPE Core-Decoder + *-------------------------------------------------------------------*/ + +void ivas_set_bitstream_pointers( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +) +{ + int16_t k, num_bits; + Decoder_State **sts; + + num_bits = 0; + + /* set bitstream pointers for SCEs */ + for ( k = 0; k < st_ivas->nSCE; k++ ) + { + sts = st_ivas->hSCE[k]->hCoreCoder; + sts[0]->bit_stream = st_ivas->bit_stream + num_bits; + num_bits += (int16_t) ( st_ivas->hSCE[k]->element_brate / FRAMES_PER_SEC ); + } + + /* set bitstream pointers for CPEs */ + for ( k = 0; k < st_ivas->nCPE; k++ ) + { + sts = st_ivas->hCPE[k]->hCoreCoder; + sts[0]->bit_stream = st_ivas->bit_stream + num_bits; + num_bits += (int16_t) ( st_ivas->hCPE[k]->element_brate / FRAMES_PER_SEC ); + } + + return; +} + + + + +/*-------------------------------------------------------------------* + * read_indices() + * + * Read indices from an ITU-T G.192 bitstream to the buffer + * Simulate packet losses by inserting frame erasures + *-------------------------------------------------------------------*/ + +/*! r: 1 = reading OK, 0 = problem */ +ivas_error read_indices( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + uint16_t bit_stream[], /* i : bitstream buffer */ + UWord16 num_bits, /* i : number of bits in bitstream */ + int16_t *prev_ft_speech, + int16_t *CNG, + int16_t bfi /* i : bad frame indicator */ +) +{ + int16_t k; + Decoder_State **sts; + int32_t total_brate = 0; + int16_t curr_ft_good_sp, curr_ft_bad_sp; + int16_t g192_sid_first, sid_upd_bad, sid_update; + int16_t speech_bad, speech_lost; + int16_t n; + ivas_error error; + + error = IVAS_ERR_OK; + + st_ivas->BER_detect = 0; + sts = reset_elements( st_ivas ); + + st_ivas->bfi = bfi; + + /* convert the frame length to total bitrate */ + total_brate = (int32_t) ( num_bits * FRAMES_PER_SEC ); + + /* verify that a valid num bits value is present in the G.192 file */ + /* only AMRWB, EVS or IVAS bitrates or 0(NO DATA) are allowed in G.192 file frame reading */ + if ( st_ivas->ivas_format != MONO_FORMAT ) + { + k = 0; + while ( k < SIZE_IVAS_BRATE_TBL && total_brate != ivas_brate_tbl[k] ) + { + k++; + } + + if ( st_ivas->ivas_format == ISM_FORMAT && ( k < SIZE_IVAS_BRATE_TBL || total_brate <= SID_2k40 ) ) + { + st_ivas->element_mode_init = IVAS_SCE; + } + else if ( ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == MASA_FORMAT ) && ( total_brate <= SID_2k40 ) ) + { + st_ivas->element_mode_init = IVAS_SCE; + } + else if ( k == SIZE_IVAS_BRATE_TBL ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error, illegal bitrate (%d) in the G.192 frame ! Exiting ! \n", total_brate ); + } + else + { + st_ivas->element_mode_init = -1; + } + } + else /* AMRWB or EVS */ + { + st_ivas->element_mode_init = EVS_MONO; + + if ( rate2EVSmode( total_brate, NULL ) < 0 ) /* negative value means that a valid rate was not found */ + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error, illegal bitrate (%d) in the G.192 frame ! Exiting ! \n", total_brate ); + } + } + + /* G.192 RX DTX handler*/ + /* handle SID_FIRST, SID_BAD, SPEECH_LOST, NO_DATA as properly as possible for the ITU-T G.192 format */ + /* (total_brate, bfi , st_CNG) = rx_handler(received frame type, [previous frame type], past CNG state, past core) */ + curr_ft_good_sp = 0; + curr_ft_bad_sp = 0; + + if ( is_DTXrate( total_brate ) == 0 ) + { + if ( st_ivas->bfi == 0 ) + { + curr_ft_good_sp = 1; + } + else + { + curr_ft_bad_sp = 1; + } + } + + sid_update = 0; + sid_upd_bad = 0; + if ( is_SIDrate( total_brate ) == 1 ) + { + if ( st_ivas->bfi == 0 ) + { + sid_update = 1; + } + else + { + sid_upd_bad = 1; /* this frame type may happen in ETSI/3GPP CS cases, a corrupt SID frames */ + } + } + + /* all zero indices/bits iSP AMRWB SID_update results in a valid LP filter with extremely high LP-filter-gain */ + /* all zero indices/bits may be a result of CS bit errors and/or erroneously injected by gateways or by a bad dejitter handlers */ + if ( total_brate == SID_1k75 && sid_update == 1 ) + { + /* valid sid_update received, check for very risky but formally valid content */ + int16_t sum = 0; + for ( k = 0; k < num_bits; ++k ) + { + sum += ( bit_stream[k] == 1 ); /* check of 35 zeroes */ + } + if ( sum == 0 ) + { /* all zeros */ + sid_upd_bad = 1; /* initial signal as corrupt (BER likely) */ + } + } + + /* AMRWB 26.173 G.192 file reader (read_serial) does not declare/use SID_BAD ft, + it declares every bad synch marked frame initially as a lost_speech frame, + and then the RXDTX handler CNG state decides the decoding mode CNG/SPEECH. + While In the AMRWB ETSI/3GPP format eid a CRC error in a detected SID_UPDATE frames triggers SID_BAD. + + Here we inhibit use of the SID-length info, even though it is available in the G.192 file format after STL/EID-XOR . + */ + if ( sid_upd_bad ) + { + sid_upd_bad = 0; + total_brate = FRAME_NO_DATA; /* treat SID_BAD as a stolen signaling frame --> SPEECH LOST */ + } + + g192_sid_first = 0; + if ( st_ivas->ivas_format == MONO_FORMAT && sts[0]->core == AMR_WB_CORE && *prev_ft_speech && total_brate == FRAME_NO_DATA && st_ivas->bfi == 0 ) + { + g192_sid_first = 1; /* SID_FIRST detected for previous AMRWB/AMRWBIO active frames only */ + /* It is not possible to perfectly simulate rate switching conditions EVS->AMRWBIO where: + the very first SID_FIRST detection is based on a past EVS active frame + and a good length 0 "SID_FIRST"(NO_DATA) frame is sent in AMRWBIO, + due to the one frame state memory in the AMRWB legacy G.192 SID_FIRST encoding + */ + } + + speech_bad = 0; + if ( st_ivas->bfi != 0 && ( is_DTXrate( total_brate ) == 0 ) ) + { + speech_bad = 1; /* initial ft assumption, CNG_state decides what to do */ + } + + speech_lost = 0; + if ( total_brate == FRAME_NO_DATA && st_ivas->bfi != 0 ) /* unsent NO_DATA or stolen NO_DATA/signaling frame */ + { + speech_lost = 1; /* initial ft assumption, CNG_state decides what to do */ + } + + /* Do not allow decoder to enter CNG-synthesis for any instantly received GOOD+LENGTH==0 frame + as this frame was never transmitted, one can not know it is good and has a a length of zero ) */ + if ( *CNG != 0 ) + { + /* We were in CNG synthesis */ + if ( curr_ft_good_sp != 0 ) + { + /* only a good speech frame makes you leave CNG synthesis */ + *CNG = 0; + } + } + else + { + /* We were in SPEECH synthesis */ + /* only a received/detected SID frame can make the decoder enter into CNG synthsis */ + if ( g192_sid_first || sid_update || sid_upd_bad ) + { + *CNG = 1; + } + } + + /* set bfi, total_brate pair for proper decoding */ + /* handle the G.192 _simulated_ untransmitted NO_DATA frame, setting for decoder SPEECH synthesis */ + if ( *CNG == 0 && total_brate == FRAME_NO_DATA && st_ivas->bfi == 0 ) + { + st_ivas->bfi = 1; /* SPEECH PLC code will now become active as in a real system */ + /* total_brate= 0 */ + } + + /* handle bad/lost speech frame(and CS bad SID frame) in the decoders CNG synthesis settings pair (total_brate, bfi) */ + if ( ( + bfi != FRAMEMODE_FUTURE && + ( *CNG != 0 ) && ( ( speech_bad != 0 ) || ( speech_lost != 0 ) ) ) || /* SP_BAD or SPEECH_LOST) --> stay in CNG */ + ( sid_upd_bad != 0 ) ) /* SID_UPD_BAD --> start CNG */ + { + st_ivas->bfi = 0; /* bfi=0 needed to activate CNG code */ + total_brate = FRAME_NO_DATA; + } + + /* update for next frame's G.192 file format's odd SID_FIRST detection (primarily for AMRWBIO) */ + *prev_ft_speech = ( ( curr_ft_good_sp != 0 ) || ( curr_ft_bad_sp != 0 ) ); + + /* st->total brate= total_brate; updated in a good frame below */ + + for ( k = 0; k < st_ivas->nCPE; k++ ) + { + sts = st_ivas->hCPE[k]->hCoreCoder; + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + sts[n]->bfi = st_ivas->bfi; + } + } + + for ( k = 0; k < st_ivas->nSCE; k++ ) + { + sts = st_ivas->hSCE[k]->hCoreCoder; + sts[0]->bfi = st_ivas->bfi; + } + + if ( st_ivas->bfi == 0 ) + { + /* select Mode 1 or Mode 2 */ + if ( st_ivas->ivas_format == MONO_FORMAT ) /* EVS mono */ + { + decoder_selectCodec( sts[0], total_brate, bit_stream[0] ); + st_ivas->hDecoderConfig->Opt_AMR_WB = sts[0]->Opt_AMR_WB; + } + else /* IVAS */ + { + st_ivas->codec_mode = MODE1; + st_ivas->hDecoderConfig->Opt_AMR_WB = 0; + } + } + + /* GOOD frame */ + if ( st_ivas->bfi == 0 || st_ivas->bfi == FRAMEMODE_FUTURE ) + { + /* GOOD frame - convert ITU-T G.192 words to short values */ + st_ivas->hDecoderConfig->ivas_total_brate = total_brate; + } + + st_ivas->bit_stream = bit_stream; + + if ( st_ivas->ivas_format == MONO_FORMAT ) + { + ivas_set_bitstream_pointers( st_ivas ); + } + + return error; +} + +/*-------------------------------------------------------------------* + * get_rfFrameType() + * + * Extract the RF frame type + *-------------------------------------------------------------------*/ + +static void get_rfFrameType( + Decoder_State *st, /* i : decoder state structure */ + int16_t *rf_frame_type /* o : RF frame type */ +) +{ + int16_t num_bits; + num_bits = (int16_t) ( st->total_brate / FRAMES_PER_SEC ); + if ( st->rf_flag == 1 ) + { + /* the last three bits in a packet is the RF frame type */ + *rf_frame_type = get_indice( st, num_bits - 3, 3 ); + } + else + { + *rf_frame_type = 0; + } + + return; +} + +/*-------------------------------------------------------------------* + * get_rfFlag() + * + * Check if RF flag is present in the bitstream + *-------------------------------------------------------------------*/ + +static void get_rfFlag( + Decoder_State *st, /* i : decoder state structure */ + int16_t *rf_flag, /* o : check for the RF flag */ + int16_t *nBits, + int32_t *ind ) +{ + int16_t start_idx, nBits_tmp; + int32_t ind_tmp; + + /* Init */ + *rf_flag = 0; + + /* check for rf_flag in the packet and extract the rf_frame_type and rf_fec_offset */ + if ( st->total_brate == ACELP_13k20 && ( st->bfi == FRAMEMODE_NORMAL || st->bfi == FRAMEMODE_FUTURE ) ) + { + /* find the section in the ACELP signaling table corresponding to bitrate */ + start_idx = 0; + while ( acelp_sig_tbl[start_idx] != st->total_brate ) + { + start_idx++; + assert( ( start_idx < MAX_ACELP_SIG ) && "ERROR: start_idx larger than acelp_sig_tbl[].\n" ); + } + + /* skip the bitrate */ + start_idx += 1; + + /* retrieve the number of bits */ + nBits_tmp = (int16_t) acelp_sig_tbl[start_idx++]; + + /* retrieve the signaling indice */ + ind_tmp = acelp_sig_tbl[start_idx + get_indice( st, 0, nBits_tmp )]; + + /* convert signaling indice into RF flag. */ + *rf_flag = ( ind_tmp >> 7 ) & 0x1; + + if ( ind ) + { + *ind = ind_tmp; + } + + if ( nBits ) + { + *nBits = nBits_tmp; + } + } + + return; +} + +/*-------------------------------------------------------------------* + * get_rf_fec_offset() + * + * Extract the FEC offset + *-------------------------------------------------------------------*/ + +static void get_rf_fec_offset( + Decoder_State *st, /* i : decoder state structure */ + int16_t *rf_fec_offset /* o : RF FEC offset */ +) +{ + int16_t num_bits, tmp; + num_bits = (int16_t) ( st->total_brate / FRAMES_PER_SEC ); + if ( st->rf_flag == 1 ) + { + /* the two bits before the RF frame type contains the FEC offset */ + tmp = get_indice( st, num_bits - 5, 2 ); + + if ( tmp == 0 ) + { + *rf_fec_offset = 2; + } + else + { + *rf_fec_offset = 2 * tmp + 1; + } + } + else + { + *rf_fec_offset = 0; + } + + return; +} + +/*-------------------------------------------------------------------* + * get_rfTargetBits() + * + * Return the number of RF target bits + *-------------------------------------------------------------------*/ + +static void get_rfTargetBits( + int16_t rf_frame_type, /* i : RF frame type */ + int16_t *rf_target_bits /* o : Number of RF target bits */ +) +{ + /* Number of RF bits for different RF coder types */ + + switch ( rf_frame_type ) + { + case RF_NO_DATA: + *rf_target_bits = 5; + break; + case RF_TCXFD: + *rf_target_bits = 27; + break; + case RF_TCXTD1: + *rf_target_bits = 16; + break; + case RF_TCXTD2: + *rf_target_bits = 16; + break; + case RF_ALLPRED: + /* Es_pred bits 3 bits, LTF: 1, pitch: 8,5,5,5, FCB: 0, gain: 7,0,7,0, Diff GFr: 4*/ + *rf_target_bits = 63; + break; + case RF_NOPRED: + /* Es_pred bits 3 bits, LTF: 0, pitch: 0, FCB: 7,7,7,7, gain: 6,0,6,0, Diff GFr: 2*/ + *rf_target_bits = 66; + break; + case RF_GENPRED: + /* Es_pred bits 3 bits, LTF: 1, pitch: 8,0,8,0, FCB: 6,7,5,5, gain: 5,0,5,0, Diff GFr: 0*/ + *rf_target_bits = 70; + break; + case RF_NELP: + /* gain: 19, Diff GFr: 5 */ + *rf_target_bits = 45; + break; + } + + return; +} + +/*-------------------------------------------------------------------* + * berCheck() + * + * Check for bit errors in channel aware signaling. + *-------------------------------------------------------------------*/ + +static void berCheck( + Decoder_State *st /* i/o: decoder state structure */ +) +{ + /* In case of RF flag = 1, and valid RF packet with primary and partial copy */ + if ( st->bwidth == NB || st->bwidth == FB || st->coder_type >= TRANSITION ) + { + if ( st->use_partial_copy == 1 ) + { + st->use_partial_copy = 0; + } + + st->bfi = 1; + st->bwidth = st->last_bwidth; + st->BER_detect = 1; + st->coder_type = GENERIC; + } + + return; +} + +/*-------------------------------------------------------------------* + * getPartialCopyInfo() + * + * Check if the frame includes a partial copy for channel aware processing. + *-------------------------------------------------------------------*/ + +void getPartialCopyInfo( + Decoder_State *st, /* i/o: decoder state structure */ + int16_t *sharpFlag ) +{ + int16_t nBits = 0; + int32_t ind = 0; + + /* check the RF flag in the packet */ + get_rfFlag( st, &( st->rf_flag ), &nBits, &ind ); + + /* get RF frame type info */ + get_rfFrameType( st, &( st->rf_frame_type ) ); + + /* Get the FEC offset info */ + get_rf_fec_offset( st, &( st->rf_fec_offset ) ); + + /* reset number of target bits in case of rate switching */ + st->rf_target_bits = 0; + + /* Get the number of bits used for RF*/ + if ( st->rf_flag == 1 ) + { + st->coder_type = ind & 0x7; + st->bwidth = ( ind >> 3 ) & 0x7; + *sharpFlag = ( ind >> 6 ) & 0x1; + st->codec_mode = MODE2; + get_rfTargetBits( st->rf_frame_type, &( st->rf_target_bits ) ); + + if ( st->bfi == FRAMEMODE_FUTURE ) + { + st->use_partial_copy = 1; + /* now set the frame mode to normal mode */ + if ( st->rf_frame_type >= RF_TCXFD && st->rf_frame_type <= RF_TCXTD2 ) + { + st->bfi = 1; + st->core = TCX_20_CORE; + } + else + { + st->bfi = FRAMEMODE_NORMAL; + st->core = ACELP_CORE; + } + } + + /* check for bit errors */ + berCheck( st ); + + get_next_indice_tmp( st, nBits ); + } + + return; +} + +/*-------------------------------------------------------------------* + * get_NextCoderType() + * + * Extract the coder type of next frame + *-------------------------------------------------------------------*/ + +void get_NextCoderType( + uint8_t *bitstream, /* i : bitstream */ + int16_t *next_coder_type /* o : next coder type */ +) +{ + int16_t k; + int16_t start_idx; + int8_t bit_stream[ACELP_13k20 / FRAMES_PER_SEC]; + int32_t tmp; + int16_t nBits_tmp; + + + for ( k = 0; k < ACELP_13k20 / FRAMES_PER_SEC; k++ ) + { + bit_stream[k] = ( bitstream[k / 8] >> ( 7 - ( k % 8 ) ) ) & 0x1; + } + start_idx = 0; + while ( acelp_sig_tbl[start_idx] != ACELP_13k20 ) + { + start_idx++; + assert( ( start_idx < MAX_ACELP_SIG ) && "ERROR: start_idx larger than acelp_sig_tbl[].\n" ); + } + + /* skip the bitrate */ + start_idx += 1; + + tmp = 0; + nBits_tmp = (int16_t) acelp_sig_tbl[start_idx++]; + for ( k = 0; k < nBits_tmp; k++ ) + { + tmp <<= 1; + tmp += bit_stream[k]; + } + + /* retrieve the signaling indice */ + *next_coder_type = acelp_sig_tbl[start_idx + tmp] & 0x7; + + return; +} + + +/*-------------------------------------------------------------------* + * get_indice_preview() + * + * Indices preview to parse for the presence of partial copy + *-------------------------------------------------------------------*/ + +static uint16_t get_indice_preview( + uint8_t *bitstream, + const int16_t bitstreamSize, + const int16_t pos, + const int16_t nb_bits ) +{ + uint16_t value; + int16_t i; + uint16_t bitstreamShort[MAX_BITS_PER_FRAME + 16]; + uint16_t *bitstreamShortPtr; + + /* convert bitstream from compact bytes to short values */ + bitstreamShortPtr = bitstreamShort; + for ( i = 0; i < bitstreamSize; i++ ) + { + *bitstreamShortPtr++ = ( bitstream[i / 8] >> ( 7 - ( i % 8 ) ) ) & 0x1; + } + + assert( nb_bits <= 16 ); + value = 0; + for ( i = 0; i < nb_bits; i++ ) + { + value <<= 1; + value += bitstreamShort[pos + i]; + } + return value; +} + + +/*-------------------------------------------------------------------* + * evs_dec_previewFrame() + * + * Signalling index preview for JBM + *-------------------------------------------------------------------*/ + +void evs_dec_previewFrame( + uint8_t *bitstream, + int16_t bitstreamSize, + int16_t *partialCopyFrameType, + int16_t *partialCopyOffset ) +{ + int32_t total_brate; + int16_t start_idx, nBits; + int32_t ind; + int16_t rf_flag; + + rf_flag = 0; + *partialCopyFrameType = 0; + *partialCopyOffset = 0; + total_brate = bitstreamSize * FRAMES_PER_SEC; + + if ( total_brate == ACELP_13k20 ) + { + /* find the section in the ACELP signaling table corresponding to bitrate */ + start_idx = 0; + while ( acelp_sig_tbl[start_idx] != total_brate ) + { + start_idx++; + assert( ( start_idx < MAX_ACELP_SIG ) && "ERROR: start_idx larger than acelp_sig_tbl[].\n" ); + } + + /* skip the bitrate */ + start_idx += 1; + /* retrieve the number of bits */ + nBits = (int16_t) acelp_sig_tbl[start_idx++]; + + /* retrieve the signaling indice */ + ind = acelp_sig_tbl[start_idx + get_indice_preview( bitstream, bitstreamSize, 0, nBits )]; + + /* convert signaling indice into RF flag. */ + rf_flag = ( ind >> 7 ) & 0x1; + if ( rf_flag != 0 ) + { + /* read the FEC offset at which the partial copy is received */ + ind = get_indice_preview( bitstream, bitstreamSize, ( bitstreamSize - 5 ), 2 ); + if ( ind == 0 ) + { + *partialCopyOffset = 2; + } + else if ( ind == 1 ) + { + *partialCopyOffset = 3; + } + else if ( ind == 2 ) + { + *partialCopyOffset = 5; + } + else if ( ind == 3 ) + { + *partialCopyOffset = 7; + } + /* the last three bits in a packet is the RF frame type */ + *partialCopyFrameType = get_indice_preview( bitstream, bitstreamSize, bitstreamSize - 3, 3 ); + } + } + + return; +} + + +void dtx_read_padding_bits( + DEC_CORE_HANDLE st, + const int16_t num_bits ) +{ + /* TODO: temporary hack, need to decide what to do with core-coder bitrate */ + int32_t tmp; + + tmp = st->total_brate; + st->total_brate = st->total_brate + num_bits * FRAMES_PER_SEC; + get_next_indice( st, num_bits ); + st->total_brate = tmp; + + return; +} + +#undef WMC_TOOL_SKIP diff --git a/lib_com/calc_st_com.c b/lib_com/calc_st_com.c new file mode 100644 index 0000000000000000000000000000000000000000..59ceb09daf7a34f815912237997fbf61187b0d74 --- /dev/null +++ b/lib_com/calc_st_com.c @@ -0,0 +1,307 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "wmc_auto.h" + + +/*---------------------------------------------------------------------------- + * calc_rc0_h() + * + * computes 1st parcor from composed filter impulse response + *---------------------------------------------------------------------------*/ + +static void calc_rc0_h( + const float *h, /* i : impulse response of composed filter */ + float *rc0 /* o : 1st parcor */ +) +{ + float acf0, acf1; + float temp, temp2; + const float *ptrs; + int16_t i; + + /* computation of the autocorrelation function acf */ + temp = 0.0f; + for ( i = 0; i < LONG_H_ST; i++ ) + { + temp += h[i] * h[i]; + } + acf0 = temp; + + temp = 0.0f; + ptrs = h; + for ( i = 0; i < LONG_H_ST - 1; i++ ) + { + temp2 = *ptrs++; + temp += temp2 * ( *ptrs ); + } + acf1 = temp; + + /* Initialisation of the calculation */ + if ( acf0 == 0.0f ) + { + *rc0 = 0.0f; + return; + } + + /* Compute 1st parcor */ + if ( acf0 < (float) fabs( acf1 ) ) + { + *rc0 = 0.0f; + return; + } + *rc0 = -acf1 / acf0; + + return; +} + + +/*---------------------------------------------------------------------------- + * calc_st_filt() + * + * computes impulse response of A(gamma2) / A(gamma1) + * controls gain : computation of energy impulse response as + * SUMn (abs (h[n])) and computes parcor0 + *---------------------------------------------------------------------------- */ + +void calc_st_filt( + const float *apond2, /* i : coefficients of numerator */ + const float *apond1, /* i : coefficients of denominator */ + float *parcor0, /* o : 1st parcor calcul. on composed filter */ + float *sig_ltp_ptr, /* i/o: input of 1/A(gamma1) : scaled by 1/g0 */ + float *mem_zero, /* i/o: All zero memory */ + const int16_t L_subfr, /* i : the length of subframe */ + const int16_t extl /* i : extension layer info */ + +) +{ + float h[LONG_H_ST]; + float g0, temp; + int16_t i; + + /* compute i.r. of composed filter apond2 / apond1 */ + if ( extl == SWB_TBE ) + { + syn_filt( apond1, LPC_SHB_ORDER, apond2, h, LONG_H_ST, mem_zero, 0 ); + } + else + { + syn_filt( apond1, M, apond2, h, LONG_H_ST, mem_zero, 0 ); + } + + /* compute 1st parcor */ + calc_rc0_h( h, parcor0 ); + + /* compute g0 */ + g0 = 0.0f; + for ( i = 0; i < LONG_H_ST; i++ ) + { + g0 += (float) fabs( h[i] ); + } + + /* Scale signal input of 1/A(gamma1) */ + if ( g0 > 1.0f ) + { + temp = 1.0f / g0; + + for ( i = 0; i < L_subfr; i++ ) + { + sig_ltp_ptr[i] = sig_ltp_ptr[i] * temp; + } + } + + return; +} + + +/*---------------------------------------------------------------------------- + * filt_mu() + * + * tilt filtering with : (1 + mu z-1) * (1/1-|mu|) + * computes y[n] = (1/1-|mu|) (x[n]+mu*x[n-1]) + *---------------------------------------------------------------------------*/ + +void filt_mu( + const float *sig_in, /* i : signal (beginning at sample -1) */ + float *sig_out, /* o : output signal */ + const float parcor0, /* i : parcor0 (mu = parcor0 * gamma3) */ + const int16_t L_subfr, /* i : the length of subframe */ + const int16_t extl /* i : extension layer info */ +) +{ + int16_t n; + float mu, ga, temp; + const float *ptrs; + + if ( extl == SWB_TBE ) + { + if ( parcor0 > 0.0f ) + { + mu = parcor0 * GAMMA3_PLUS_WB; + } + else + { + mu = parcor0 * GAMMA3_MINUS_WB; + } + } + else + { + if ( parcor0 > 0.0f ) + { + mu = parcor0 * GAMMA3_PLUS; + } + else + { + mu = parcor0 * GAMMA3_MINUS; + } + } + + ga = (float) 1. / ( (float) 1. - (float) fabs( mu ) ); + + ptrs = sig_in; /* points on sig_in(-1) */ + + for ( n = 0; n < L_subfr; n++ ) + { + temp = mu * ( *ptrs++ ); + temp += ( *ptrs ); + sig_out[n] = ga * temp; + } + + return; +} + + +/*---------------------------------------------------------------------------- + * scale_st() + * + * control of the subframe gain + * gain[n] = AGC_FAC_FX * gain[n-1] + (1 - AGC_FAC_FX) g_in/g_out + *---------------------------------------------------------------------------*/ + +void scale_st( + const float *sig_in, /* i : postfilter input signal */ + float *sig_out, /* i/o: postfilter output signal */ + float *gain_prec, /* i/o: last value of gain for subframe */ + const int16_t L_subfr, /* i : the length of subframe */ + const int16_t extl /* i : extension layer info */ +) +{ + int16_t i; + float gain_in, gain_out; + float g0, gain; + float agc_fac1_para = 0.0f; + float agc_fac_para = 0.0f; + + if ( extl == SWB_TBE ) + { + agc_fac1_para = AGC_FAC1_WB; + agc_fac_para = AGC_FAC_WB; + } + else + { + agc_fac1_para = AGC_FAC1; + agc_fac_para = AGC_FAC; + } + + /* compute input gain */ + gain_in = 0.0f; + for ( i = 0; i < L_subfr; i++ ) + { + gain_in += (float) fabs( sig_in[i] ); + } + + if ( gain_in == 0.0f ) + { + g0 = 0.0f; + } + else + { + /* Compute output gain */ + gain_out = 0.0f; + for ( i = 0; i < L_subfr; i++ ) + { + gain_out += (float) fabs( sig_out[i] ); + } + + if ( gain_out == 0.0f ) + { + *gain_prec = 0.0f; + return; + } + + g0 = gain_in / gain_out; + g0 *= agc_fac1_para; + } + + /* compute gain(n) = AGC_FAC gain(n-1) + (1-AGC_FAC)gain_in/gain_out */ + /* sig_out(n) = gain(n) sig_out(n) */ + gain = *gain_prec; + for ( i = 0; i < L_subfr; i++ ) + { + gain *= agc_fac_para; + gain += g0; + sig_out[i] *= gain; + } + + *gain_prec = gain; + + return; +} + +void blend_subfr2( + float *sigIn1, + float *sigIn2, + float *sigOut ) +{ + float fac1 = 1.f - ( 1.f / L_SUBFR ); + float fac2 = 0.f + ( 1.f / L_SUBFR ); + float step = 1.f / ( L_SUBFR / 2 ); + int16_t i; + + for ( i = 0; i < L_SUBFR / 2; i++ ) + { + sigOut[i] = fac1 * sigIn1[i] + fac2 * sigIn2[i]; + fac1 -= step; + fac2 += step; + } + + return; +} diff --git a/lib_com/cb_shape.c b/lib_com/cb_shape.c new file mode 100644 index 0000000000000000000000000000000000000000..77f17eb236e4585282cc15725c138c325b163f3f --- /dev/null +++ b/lib_com/cb_shape.c @@ -0,0 +1,122 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * cb_shape() + * + * pre-emphasis, pitch sharpening and formant sharpening of the algebraic codebook + *-------------------------------------------------------------------*/ + +void cb_shape( + const int16_t preemphFlag, /* i : flag for pre-emphasis */ + const int16_t pitchFlag, /* i : flag for pitch sharpening */ + const int16_t scramblingFlag, /* i : flag for phase scrambling */ + const int16_t formantFlag, /* i : flag for formant sharpening */ + const int16_t formantTiltFlag, /* i : flag for formant tilt */ + const float g1, /* i : formant sharpening numerator weighting */ + const float g2, /* i : formant sharpening denominator weighting */ + const float *p_Aq, /* i : LP filter coefficients */ + float *code, /* i/o: signal to shape */ + const float tilt_code, /* i : tilt of code */ + const float pt_pitch, /* i : pointer to current subframe fractional pitch */ + const int16_t L_subfr /* i : subfframe length */ +) +{ + float buff[M + 2 * L_SUBFR], A_num[M + 1], A_den[M + 1]; + float tmp, tilt; + int16_t i, round_T0; + + /* pre-emphasize the algebraic codebook */ + if ( preemphFlag ) + { + tmp = 0.0f; + preemph( code, tilt_code, L_subfr, &tmp ); + } + + /* pitch sharpening */ + if ( pitchFlag ) + { + round_T0 = (int16_t) ( pt_pitch + 0.4f ); + for ( i = round_T0; i < L_subfr; i++ ) + { + code[i] += code[i - round_T0] * PIT_SHARP; + } + } + + /* phase scrambling filter */ + if ( scramblingFlag ) + { + buff[0] = code[0]; + for ( i = 1; i < L_subfr; i++ ) + { + buff[i] = code[i]; + code[i] = 0.7f * buff[i] + buff[i - 1] - 0.7f * code[i - 1]; + } + } + + /* formant sharpening (only on active speech) */ + if ( formantFlag || formantTiltFlag ) + { + weight_a( p_Aq, A_num, g1, M ); + weight_a( p_Aq, A_den, g2, M ); + + set_f( buff, 0, M + L_subfr ); + + /* formant tilt */ + if ( formantTiltFlag ) + { + mvr2r( A_num, buff + M, M + 1 ); + syn_filt( A_den, M, buff + M, buff + M, L_subfr, buff, 0 ); + tilt = get_gain( buff + M + 1, buff + M, L_subfr - 1, NULL ); + tmp = 0.0; + preemph( code, 0.5f * tilt_code - 0.25f * tilt, L_subfr, &tmp ); + } + else + { + mvr2r( code, buff + M, L_subfr ); + residu( A_num, M, buff + M, code, L_subfr ); + syn_filt( A_den, M, code, code, L_subfr, buff, 0 ); + } + } + + return; +} diff --git a/lib_com/cldfb.c b/lib_com/cldfb.c new file mode 100644 index 0000000000000000000000000000000000000000..716dff7a3aba197abf85610ed5c734a3ec8b9d99 --- /dev/null +++ b/lib_com/cldfb.c @@ -0,0 +1,1232 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include "options.h" +#include +#include "stat_dec.h" +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + +#if __STDC_VERSION__ >= 199901L +#if defined __ICL +#define restrict __restrict +#endif +#else +#define restrict +#endif + + +/*-------------------------------------------------------------------* + * Local prototypes + *--------------------------------------------------------------------*/ + +static void cldfb_init_proto_and_twiddles( HANDLE_CLDFB_FILTER_BANK hs ); + +static float GetEnergyCldfb( float *energyValuesSum, float *energyLookahead, float **realValues, float **imagValues, const int16_t numberBands, int16_t numberCols, TEC_ENC_HANDLE hTecEnc ); + +/*-------------------------------------------------------------------* + * cplxMult() + * + * Conduct complex multiplication + *--------------------------------------------------------------------*/ + +static void cplxMult( + float *yr, /* o : real output */ + float *yi, /* o : imag output */ + const float xr, /* i : real input 1*/ + const float xi, /* i : imag input 1*/ + const float cr, /* i : real input 1*/ + const float ci /* i : imag input 1*/ +) +{ + *yr = xr * cr - xi * ci; + *yi = xr * ci + xi * cr; + + return; +} + + +/*-------------------------------------------------------------------* + * cldfbAnalysis() + * + * Conduct multiple overlap complex low delay MDCT + *--------------------------------------------------------------------*/ + +void cldfbAnalysis( + const float *timeIn, /* i : time buffer */ + float **realBuffer, /* o : real value buffer */ + float **imagBuffer, /* o : imag value buffer */ + const int16_t samplesToProcess, /* i : samples to process */ + HANDLE_CLDFB_FILTER_BANK h_cldfb /* i : filterbank state */ +) +{ + int16_t i, k; + int16_t L2, M1, M2, M4; + int16_t no_col = h_cldfb->no_col; + + float r1, r2, rr12, ir12; + float i1, i2, ri12, ii12; + float rBuffer[2 * CLDFB_NO_CHANNELS_MAX]; + float iBuffer[2 * CLDFB_NO_CHANNELS_MAX]; + const float *rot_vctr_re; + const float *rot_vctr_im; + const float *ptr_pf; + float *timeBuffer, buffer[( CLDFB_NO_CHANNELS_MAX * CLDFB_NO_COL_MAX ) + ( 9 * CLDFB_NO_CHANNELS_MAX )]; + int16_t offset, frameSize; + + offset = h_cldfb->p_filter_length - h_cldfb->no_channels; + frameSize = h_cldfb->no_channels * h_cldfb->no_col; + + assert( h_cldfb->prototype == CLDFB_PROTOTYPE_1_25MS ); + /* prepare input buffer */ + timeBuffer = buffer; + mvr2r( h_cldfb->cldfb_state, timeBuffer, offset ); + + if ( samplesToProcess > -1 ) + { + mvr2r( timeIn, timeBuffer + offset, samplesToProcess ); + set_f( timeBuffer + offset + samplesToProcess, 0.0f, ( frameSize - samplesToProcess ) ); + } + else + { + mvr2r( timeIn, timeBuffer + offset, frameSize ); + } + + /* only process needed cols */ + if ( samplesToProcess > -1 ) + { + no_col = min( no_col, ( samplesToProcess + h_cldfb->no_channels - 1 ) / h_cldfb->no_channels ); + } + + M1 = h_cldfb->no_channels; + M2 = M1 >> 1; + M4 = M1 >> 2; + L2 = M1 << 1; + + if ( M2 & 1 ) + { + M4 += 1; + } + + rot_vctr_re = h_cldfb->rot_vec_ana_re; + rot_vctr_im = h_cldfb->rot_vec_ana_im; + + ptr_pf = h_cldfb->p_filter; + + for ( i = 0; i < no_col; i++ ) + { + for ( k = 0; k < M4; k++ ) + { + /* prototype filter */ + r1 = 0 - ptr_pf[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )] * timeBuffer[L2 - M2 - 1 - ( 2 * k ) + 0 * L2]; + r1 = r1 - ptr_pf[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] * timeBuffer[L2 - M2 - 1 - ( 2 * k ) + 1 * L2]; + r1 = r1 - ptr_pf[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] * timeBuffer[L2 - M2 - 1 - ( 2 * k ) + 2 * L2]; + r1 = r1 - ptr_pf[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )] * timeBuffer[L2 - M2 - 1 - ( 2 * k ) + 3 * L2]; + r1 = r1 - ptr_pf[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )] * timeBuffer[L2 - M2 - 1 - ( 2 * k ) + 4 * L2]; + + r2 = 0 - ptr_pf[( L2 - M2 + ( 2 * k ) + 0 * L2 )] * timeBuffer[L2 - M2 + ( 2 * k ) + 0 * L2]; + r2 = r2 - ptr_pf[( L2 - M2 + ( 2 * k ) + 1 * L2 )] * timeBuffer[L2 - M2 + ( 2 * k ) + 1 * L2]; + r2 = r2 - ptr_pf[( L2 - M2 + ( 2 * k ) + 2 * L2 )] * timeBuffer[L2 - M2 + ( 2 * k ) + 2 * L2]; + r2 = r2 - ptr_pf[( L2 - M2 + ( 2 * k ) + 3 * L2 )] * timeBuffer[L2 - M2 + ( 2 * k ) + 3 * L2]; + r2 = r2 - ptr_pf[( L2 - M2 + ( 2 * k ) + 4 * L2 )] * timeBuffer[L2 - M2 + ( 2 * k ) + 4 * L2]; + + i1 = 0 - ptr_pf[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )] * timeBuffer[L2 - 3 * M2 + ( 2 * k ) + 0 * L2]; + i1 = i1 - ptr_pf[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )] * timeBuffer[L2 - 3 * M2 + ( 2 * k ) + 1 * L2]; + i1 = i1 - ptr_pf[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )] * timeBuffer[L2 - 3 * M2 + ( 2 * k ) + 2 * L2]; + i1 = i1 - ptr_pf[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] * timeBuffer[L2 - 3 * M2 + ( 2 * k ) + 3 * L2]; + i1 = i1 - ptr_pf[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] * timeBuffer[L2 - 3 * M2 + ( 2 * k ) + 4 * L2]; + + i2 = 0 - ptr_pf[( L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2 )] * timeBuffer[L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2]; + i2 = i2 - ptr_pf[( L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2 )] * timeBuffer[L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2]; + i2 = i2 - ptr_pf[( L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2 )] * timeBuffer[L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2]; + i2 = i2 - ptr_pf[( L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2 )] * timeBuffer[L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2]; + i2 = i2 - ptr_pf[( L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2 )] * timeBuffer[L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2]; + + /* folding + pre modulation of DST IV */ + rr12 = r1 - r2; + ri12 = -i1 - i2; + cplxMult( &rBuffer[2 * k], &rBuffer[2 * k + 1], rr12, ri12, rot_vctr_re[k], rot_vctr_im[k] ); + + /* folding + pre modulation of DCT IV */ + ir12 = r1 + r2; + ii12 = i1 - i2; + cplxMult( &iBuffer[2 * k], &iBuffer[2 * k + 1], ir12, ii12, rot_vctr_re[k], rot_vctr_im[k] ); + } + + for ( k = M4; k < M2; k++ ) + { + /* prototype filter */ + r1 = 0 - ptr_pf[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )] * timeBuffer[L2 - M2 - 1 - ( 2 * k ) + 0 * L2]; + r1 = r1 - ptr_pf[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] * timeBuffer[L2 - M2 - 1 - ( 2 * k ) + 1 * L2]; + r1 = r1 - ptr_pf[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] * timeBuffer[L2 - M2 - 1 - ( 2 * k ) + 2 * L2]; + r1 = r1 - ptr_pf[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )] * timeBuffer[L2 - M2 - 1 - ( 2 * k ) + 3 * L2]; + r1 = r1 - ptr_pf[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )] * timeBuffer[L2 - M2 - 1 - ( 2 * k ) + 4 * L2]; + + r2 = 0 - ptr_pf[( L2 - 5 * M2 + ( 2 * k ) + 0 * L2 )] * timeBuffer[L2 - 5 * M2 + ( 2 * k ) + 0 * L2]; + r2 = r2 - ptr_pf[( L2 - 5 * M2 + ( 2 * k ) + 1 * L2 )] * timeBuffer[L2 - 5 * M2 + ( 2 * k ) + 1 * L2]; + r2 = r2 - ptr_pf[( L2 - 5 * M2 + ( 2 * k ) + 2 * L2 )] * timeBuffer[L2 - 5 * M2 + ( 2 * k ) + 2 * L2]; + r2 = r2 - ptr_pf[( L2 - 5 * M2 + ( 2 * k ) + 3 * L2 )] * timeBuffer[L2 - 5 * M2 + ( 2 * k ) + 3 * L2]; + r2 = r2 - ptr_pf[( L2 - 5 * M2 + ( 2 * k ) + 4 * L2 )] * timeBuffer[L2 - 5 * M2 + ( 2 * k ) + 4 * L2]; + + i1 = 0 - ptr_pf[( L2 + M2 - 1 - ( 2 * k ) + 0 * L2 )] * timeBuffer[L2 + M2 - 1 - ( 2 * k ) + 0 * L2]; + i1 = i1 - ptr_pf[( L2 + M2 - 1 - ( 2 * k ) + 1 * L2 )] * timeBuffer[L2 + M2 - 1 - ( 2 * k ) + 1 * L2]; + i1 = i1 - ptr_pf[( L2 + M2 - 1 - ( 2 * k ) + 2 * L2 )] * timeBuffer[L2 + M2 - 1 - ( 2 * k ) + 2 * L2]; + i1 = i1 - ptr_pf[( L2 + M2 - 1 - ( 2 * k ) + 3 * L2 )] * timeBuffer[L2 + M2 - 1 - ( 2 * k ) + 3 * L2]; + i1 = i1 - ptr_pf[( L2 + M2 - 1 - ( 2 * k ) + 4 * L2 )] * timeBuffer[L2 + M2 - 1 - ( 2 * k ) + 4 * L2]; + + i2 = 0 - ptr_pf[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )] * timeBuffer[L2 - 3 * M2 + ( 2 * k ) + 0 * L2]; + i2 = i2 - ptr_pf[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )] * timeBuffer[L2 - 3 * M2 + ( 2 * k ) + 1 * L2]; + i2 = i2 - ptr_pf[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )] * timeBuffer[L2 - 3 * M2 + ( 2 * k ) + 2 * L2]; + i2 = i2 - ptr_pf[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] * timeBuffer[L2 - 3 * M2 + ( 2 * k ) + 3 * L2]; + i2 = i2 - ptr_pf[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] * timeBuffer[L2 - 3 * M2 + ( 2 * k ) + 4 * L2]; + + /* folding + pre modulation of DST IV */ + rr12 = r1 + r2; + ri12 = i1 - i2; + cplxMult( &rBuffer[2 * k], &rBuffer[2 * k + 1], rr12, ri12, rot_vctr_re[k], rot_vctr_im[k] ); + + /* folding + pre modulation of DCT IV */ + ir12 = r1 - r2; + ii12 = i1 + i2; + cplxMult( &iBuffer[2 * k], &iBuffer[2 * k + 1], ir12, ii12, rot_vctr_re[k], rot_vctr_im[k] ); + } + + /* FFT of DST IV */ + fft_cldfb( rBuffer, M2 ); + + /* post modulation of DST IV */ + for ( k = 0; k < M2; k++ ) + { + cplxMult( &realBuffer[i][M1 - 1 - ( 2 * k )], &realBuffer[i][2 * k], rBuffer[2 * k], rBuffer[2 * k + 1], rot_vctr_re[k], rot_vctr_im[k] ); + } + + /* FFT of DCT IV */ + fft_cldfb( iBuffer, M2 ); + + /* post modulation of DCT IV */ + for ( k = 0; k < M2; k++ ) + { + /* do it inplace */ + cplxMult( &imagBuffer[i][2 * k], &imagBuffer[i][M1 - 1 - ( 2 * k )], iBuffer[2 * k], iBuffer[2 * k + 1], rot_vctr_re[k], rot_vctr_im[k] ); + } + + timeBuffer += L2 * 5; + timeBuffer += h_cldfb->no_channels - h_cldfb->p_filter_length; + } + + /* update memory */ + mvr2r( buffer + frameSize, h_cldfb->cldfb_state, offset ); + + return; +} + +/*-------------------------------------------------------------------* + * cldfbAnalysis_ts() + * + * + *--------------------------------------------------------------------*/ + +void cldfbAnalysis_ts( + const float *timeIn, /* i : time buffer */ + float realBuffer[CLDFB_NO_CHANNELS_MAX], /* o : real value buffer */ + float imagBuffer[CLDFB_NO_CHANNELS_MAX], /* o : imag value buffer */ + const int16_t samplesToProcess, /* i : samples to process */ + HANDLE_CLDFB_FILTER_BANK h_cldfb /* i : filterbank state */ +) +{ + int16_t i, k; + int16_t L2, M1, M2, M4; + int16_t no_col = h_cldfb->no_col; + + float r1, r2, rr12, ir12; + float i1, i2, ri12, ii12; + float rBuffer[2 * CLDFB_NO_CHANNELS_MAX]; + float iBuffer[2 * CLDFB_NO_CHANNELS_MAX]; + const float *rot_vctr_re; + const float *rot_vctr_im; + const float *rot_vctr_delay_re; + const float *rot_vctr_delay_im; + const float *ptr_pf; + float *timeBuffer, buffer[( CLDFB_NO_CHANNELS_MAX * CLDFB_NO_COL_MAX ) + ( 9 * CLDFB_NO_CHANNELS_MAX )]; + int16_t offset, frameSize; + + offset = h_cldfb->p_filter_length - h_cldfb->no_channels; + frameSize = h_cldfb->no_channels * h_cldfb->no_col; + + /* prepare input buffer */ + timeBuffer = buffer; + mvr2r( h_cldfb->cldfb_state, timeBuffer, offset ); + + if ( samplesToProcess > -1 ) + { + mvr2r( timeIn, timeBuffer + offset, samplesToProcess ); + set_f( timeBuffer + offset + samplesToProcess, 0.0f, ( frameSize - samplesToProcess ) ); + } + else + { + mvr2r( timeIn, timeBuffer + offset, frameSize ); + } + + /* only process needed cols */ + if ( samplesToProcess > -1 ) + { + no_col = min( no_col, ( samplesToProcess + h_cldfb->no_channels - 1 ) / h_cldfb->no_channels ); + assert( no_col == 1 ); + } + + M1 = h_cldfb->no_channels; + M2 = M1 >> 1; + M4 = M1 >> 2; + L2 = M1 << 1; + + if ( M2 & 1 ) + { + M4 += 1; + } + + rot_vctr_re = h_cldfb->rot_vec_ana_re; + rot_vctr_im = h_cldfb->rot_vec_ana_im; + rot_vctr_delay_re = h_cldfb->rot_vec_ana_delay_re; + rot_vctr_delay_im = h_cldfb->rot_vec_ana_delay_im; + + ptr_pf = h_cldfb->p_filter; + + for ( i = 0; i < no_col; i++ ) + { + for ( k = 0; k < M4; k++ ) + { + /* prototype filter */ + r1 = 0 - ptr_pf[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )] * timeBuffer[L2 - M2 - 1 - ( 2 * k ) + 0 * L2]; + r1 = r1 - ptr_pf[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] * timeBuffer[L2 - M2 - 1 - ( 2 * k ) + 1 * L2]; + r1 = r1 - ptr_pf[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] * timeBuffer[L2 - M2 - 1 - ( 2 * k ) + 2 * L2]; + r1 = r1 - ptr_pf[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )] * timeBuffer[L2 - M2 - 1 - ( 2 * k ) + 3 * L2]; + r1 = r1 - ptr_pf[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )] * timeBuffer[L2 - M2 - 1 - ( 2 * k ) + 4 * L2]; + + r2 = 0 - ptr_pf[( L2 - M2 + ( 2 * k ) + 0 * L2 )] * timeBuffer[L2 - M2 + ( 2 * k ) + 0 * L2]; + r2 = r2 - ptr_pf[( L2 - M2 + ( 2 * k ) + 1 * L2 )] * timeBuffer[L2 - M2 + ( 2 * k ) + 1 * L2]; + r2 = r2 - ptr_pf[( L2 - M2 + ( 2 * k ) + 2 * L2 )] * timeBuffer[L2 - M2 + ( 2 * k ) + 2 * L2]; + r2 = r2 - ptr_pf[( L2 - M2 + ( 2 * k ) + 3 * L2 )] * timeBuffer[L2 - M2 + ( 2 * k ) + 3 * L2]; + r2 = r2 - ptr_pf[( L2 - M2 + ( 2 * k ) + 4 * L2 )] * timeBuffer[L2 - M2 + ( 2 * k ) + 4 * L2]; + + i1 = 0 - ptr_pf[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )] * timeBuffer[L2 - 3 * M2 + ( 2 * k ) + 0 * L2]; + i1 = i1 - ptr_pf[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )] * timeBuffer[L2 - 3 * M2 + ( 2 * k ) + 1 * L2]; + i1 = i1 - ptr_pf[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )] * timeBuffer[L2 - 3 * M2 + ( 2 * k ) + 2 * L2]; + i1 = i1 - ptr_pf[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] * timeBuffer[L2 - 3 * M2 + ( 2 * k ) + 3 * L2]; + i1 = i1 - ptr_pf[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] * timeBuffer[L2 - 3 * M2 + ( 2 * k ) + 4 * L2]; + + i2 = 0 - ptr_pf[( L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2 )] * timeBuffer[L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2]; + i2 = i2 - ptr_pf[( L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2 )] * timeBuffer[L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2]; + i2 = i2 - ptr_pf[( L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2 )] * timeBuffer[L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2]; + i2 = i2 - ptr_pf[( L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2 )] * timeBuffer[L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2]; + i2 = i2 - ptr_pf[( L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2 )] * timeBuffer[L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2]; + + /* folding + pre modulation of DST IV */ + rr12 = r1 - r2; + ri12 = -i1 - i2; + /*cplxMult(&rBuffer[2*k],&rBuffer[2*k+1],rr12,ri12,rot_vctr_re[k],rot_vctr_im[k]);*/ + rBuffer[2 * k] = rr12 * rot_vctr_re[k] - ri12 * rot_vctr_im[k]; + rBuffer[2 * k + 1] = rr12 * rot_vctr_im[k] + ri12 * rot_vctr_re[k]; + + /* folding + pre modulation of DCT IV */ + ir12 = r1 + r2; + ii12 = i1 - i2; + /*cplxMult(&iBuffer[2*k],&iBuffer[2*k+1],ir12,ii12,rot_vctr_re[k],rot_vctr_im[k]);*/ + iBuffer[2 * k] = ir12 * rot_vctr_re[k] - ii12 * rot_vctr_im[k]; + iBuffer[2 * k + 1] = ir12 * rot_vctr_im[k] + ii12 * rot_vctr_re[k]; + } + + for ( k = M4; k < M2; k++ ) + { + /* prototype filter */ + r1 = 0 - ptr_pf[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )] * timeBuffer[L2 - M2 - 1 - ( 2 * k ) + 0 * L2]; + r1 = r1 - ptr_pf[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] * timeBuffer[L2 - M2 - 1 - ( 2 * k ) + 1 * L2]; + r1 = r1 - ptr_pf[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] * timeBuffer[L2 - M2 - 1 - ( 2 * k ) + 2 * L2]; + r1 = r1 - ptr_pf[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )] * timeBuffer[L2 - M2 - 1 - ( 2 * k ) + 3 * L2]; + r1 = r1 - ptr_pf[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )] * timeBuffer[L2 - M2 - 1 - ( 2 * k ) + 4 * L2]; + + r2 = 0 - ptr_pf[( L2 - 5 * M2 + ( 2 * k ) + 0 * L2 )] * timeBuffer[L2 - 5 * M2 + ( 2 * k ) + 0 * L2]; + r2 = r2 - ptr_pf[( L2 - 5 * M2 + ( 2 * k ) + 1 * L2 )] * timeBuffer[L2 - 5 * M2 + ( 2 * k ) + 1 * L2]; + r2 = r2 - ptr_pf[( L2 - 5 * M2 + ( 2 * k ) + 2 * L2 )] * timeBuffer[L2 - 5 * M2 + ( 2 * k ) + 2 * L2]; + r2 = r2 - ptr_pf[( L2 - 5 * M2 + ( 2 * k ) + 3 * L2 )] * timeBuffer[L2 - 5 * M2 + ( 2 * k ) + 3 * L2]; + r2 = r2 - ptr_pf[( L2 - 5 * M2 + ( 2 * k ) + 4 * L2 )] * timeBuffer[L2 - 5 * M2 + ( 2 * k ) + 4 * L2]; + + i1 = 0 - ptr_pf[( L2 + M2 - 1 - ( 2 * k ) + 0 * L2 )] * timeBuffer[L2 + M2 - 1 - ( 2 * k ) + 0 * L2]; + i1 = i1 - ptr_pf[( L2 + M2 - 1 - ( 2 * k ) + 1 * L2 )] * timeBuffer[L2 + M2 - 1 - ( 2 * k ) + 1 * L2]; + i1 = i1 - ptr_pf[( L2 + M2 - 1 - ( 2 * k ) + 2 * L2 )] * timeBuffer[L2 + M2 - 1 - ( 2 * k ) + 2 * L2]; + i1 = i1 - ptr_pf[( L2 + M2 - 1 - ( 2 * k ) + 3 * L2 )] * timeBuffer[L2 + M2 - 1 - ( 2 * k ) + 3 * L2]; + i1 = i1 - ptr_pf[( L2 + M2 - 1 - ( 2 * k ) + 4 * L2 )] * timeBuffer[L2 + M2 - 1 - ( 2 * k ) + 4 * L2]; + + i2 = 0 - ptr_pf[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )] * timeBuffer[L2 - 3 * M2 + ( 2 * k ) + 0 * L2]; + i2 = i2 - ptr_pf[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )] * timeBuffer[L2 - 3 * M2 + ( 2 * k ) + 1 * L2]; + i2 = i2 - ptr_pf[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )] * timeBuffer[L2 - 3 * M2 + ( 2 * k ) + 2 * L2]; + i2 = i2 - ptr_pf[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] * timeBuffer[L2 - 3 * M2 + ( 2 * k ) + 3 * L2]; + i2 = i2 - ptr_pf[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] * timeBuffer[L2 - 3 * M2 + ( 2 * k ) + 4 * L2]; + + /* folding + pre modulation of DST IV */ + rr12 = r1 + r2; + ri12 = i1 - i2; + /*cplxMult(&rBuffer[2*k],&rBuffer[2*k+1],rr12,ri12,rot_vctr_re[k],rot_vctr_im[k]);*/ + rBuffer[2 * k] = rr12 * rot_vctr_re[k] - ri12 * rot_vctr_im[k]; + rBuffer[2 * k + 1] = rr12 * rot_vctr_im[k] + ri12 * rot_vctr_re[k]; + + /* folding + pre modulation of DCT IV */ + ir12 = r1 - r2; + ii12 = i1 + i2; + /*cplxMult(&iBuffer[2*k],&iBuffer[2*k+1],ir12,ii12,rot_vctr_re[k],rot_vctr_im[k]);*/ + iBuffer[2 * k] = ir12 * rot_vctr_re[k] - ii12 * rot_vctr_im[k]; + iBuffer[2 * k + 1] = ir12 * rot_vctr_im[k] + ii12 * rot_vctr_re[k]; + } + + /* FFT of DST IV */ + fft_cldfb( rBuffer, M2 ); + + /* post modulation of DST IV */ + for ( k = 0; k < M2; k++ ) + { + /*cplxMult(&realBuffer[M1-1-(2*k)],&realBuffer[2*k],rBuffer[2*k],rBuffer[2*k+1],rot_vctr_re[k],rot_vctr_im[k]);*/ + realBuffer[M1 - 1 - ( 2 * k )] = rBuffer[2 * k] * rot_vctr_re[k] - rBuffer[2 * k + 1] * rot_vctr_im[k]; + realBuffer[2 * k] = rBuffer[2 * k] * rot_vctr_im[k] + rBuffer[2 * k + 1] * rot_vctr_re[k]; + } + + /* FFT of DCT IV */ + fft_cldfb( iBuffer, M2 ); + + /* post modulation of DCT IV */ + for ( k = 0; k < M2; k++ ) + { + /* do it inplace */ + /*cplxMult(&imagBuffer[2*k],&imagBuffer[M1-1-(2*k)],iBuffer[2*k],iBuffer[2*k+1],rot_vctr_re[k],rot_vctr_im[k]);*/ + imagBuffer[2 * k] = iBuffer[2 * k] * rot_vctr_re[k] - iBuffer[2 * k + 1] * rot_vctr_im[k]; + imagBuffer[M1 - 1 - ( 2 * k )] = iBuffer[2 * k] * rot_vctr_im[k] + iBuffer[2 * k + 1] * rot_vctr_re[k]; + } + + if ( h_cldfb->prototype == CLDFB_PROTOTYPE_5_00MS ) + { + /* rotation due to delay*/ + /*if(h_cldfb->da != M1)*/ + if ( rot_vctr_delay_re != NULL ) + { + for ( k = 0; k < M1; k++ ) + { + float cplx_aux; + /* delay */ + /*cplxMult(&rBuffer[k], &iBuffer[k], realBuffer[i][k], imagBuffer[i][k], cos((EVS_PI/M1)*(k+0.5)*((h_cldfb->da-M1)*0.5)), + sin((EVS_PI/M1)*(k+0.5)*((h_cldfb->da-M1)*0.5)));*/ + /*cplxMult(&rBuffer[k], &iBuffer[k], realBuffer[k], imagBuffer[k], rot_vctr_delay_re[k], rot_vctr_delay_im[k]);*/ + /*cplxMult(&realBuffer[k], &imagBuffer[k], realBuffer[k], imagBuffer[k], rot_vctr_delay_re[k], rot_vctr_delay_im[k]);*/ + /*realBuffer[k] = rBuffer[k]; + imagBuffer[k] = iBuffer[k];*/ + cplx_aux = realBuffer[k] * rot_vctr_delay_re[k] - imagBuffer[k] * rot_vctr_delay_im[k]; + imagBuffer[k] = realBuffer[k] * rot_vctr_delay_im[k] + imagBuffer[k] * rot_vctr_delay_re[k]; + realBuffer[k] = cplx_aux; + } + } + } + + timeBuffer += L2 * 5; + timeBuffer += h_cldfb->no_channels - h_cldfb->p_filter_length; + } + + /* update memory */ + if ( samplesToProcess > -1 ) + { + mvr2r( buffer + samplesToProcess, h_cldfb->cldfb_state, offset ); + } + else + { + mvr2r( buffer + frameSize, h_cldfb->cldfb_state, offset ); + } + + return; +} + +/*-------------------------------------------------------------------* + * cldfbSynthesis() + * + * Conduct inverse multple overlap cmplex low delay MDCT + *--------------------------------------------------------------------*/ + +void cldfbSynthesis( + float **realBuffer, /* i : real values */ + float **imagBuffer, /* i : imag values */ + float *timeOut, /* o : output time domain samples */ + const int16_t samplesToProcess, /* i : number of processed samples */ + HANDLE_CLDFB_FILTER_BANK h_cldfb /* i : filter bank state */ +) +{ + int16_t i; + int16_t k; + int16_t L2; + int16_t M1; + int16_t M2; + int16_t M41; + int16_t M42; + int16_t Mz; + + float rBuffer[2 * CLDFB_NO_CHANNELS_MAX]; + float iBuffer[2 * CLDFB_NO_CHANNELS_MAX]; + const float *rot_vctr_re; + const float *rot_vctr_im; + const float *rot_vctr_delay_re; + const float *rot_vctr_delay_im; + float rr12, ir12; + float ri12, ii12; + + float *synthesisBuffer, buffer[( CLDFB_NO_CHANNELS_MAX * CLDFB_NO_COL_MAX ) + ( 10 * CLDFB_NO_CHANNELS_MAX )]; + float new_samples[2 * CLDFB_NO_CHANNELS_MAX]; + + float *ptr_time_out; + const float *p_filter; + + float accu0, accu1, accu2, accu3, accu4; + int16_t no_col = h_cldfb->no_col; + + M1 = h_cldfb->no_channels; + L2 = M1 << 1; + M2 = M1 >> 1; + M41 = M2 >> 1; + M42 = M2 - M41; + Mz = M1 - h_cldfb->bandsToZero; + + /* only process needed cols */ + if ( samplesToProcess > -1 ) + { + no_col = min( no_col, ( samplesToProcess + h_cldfb->no_channels - 1 ) / h_cldfb->no_channels ); + } + + rot_vctr_re = h_cldfb->rot_vec_syn_re; + rot_vctr_im = h_cldfb->rot_vec_syn_im; + + rot_vctr_delay_re = h_cldfb->rot_vec_syn_delay_re; + rot_vctr_delay_im = h_cldfb->rot_vec_syn_delay_im; + + synthesisBuffer = buffer; + mvr2r( h_cldfb->cldfb_state, synthesisBuffer + ( M1 * no_col ), h_cldfb->p_filter_length ); + + p_filter = h_cldfb->p_filter; + ptr_time_out = timeOut; + + /*synthesisBuffer += M1 * h_cldfb->no_col;*/ + synthesisBuffer += M1 * no_col; + + for ( k = 0; k < no_col; k++ ) + { + if ( h_cldfb->prototype == CLDFB_PROTOTYPE_5_00MS ) + { + /* rotation due to delay*/ + /*if(h_cldfb->ds != M1)*/ + if ( rot_vctr_delay_re != NULL ) + { + for ( i = 0; i < M1; i++ ) + { + float cplx_aux; + /* delay */ + /*cplxMult(&rBuffer[i], &iBuffer[i], realBuffer[k][i], imagBuffer[k][i], cos((EVS_PI/M1)*(i+0.5)*(-(h_cldfb->ds-M1)*0.5)), + sin((EVS_PI/M1)*(i+0.5)*(-(h_cldfb->ds-M1)*0.5)));*/ + /*cplxMult(&rBuffer[i], &iBuffer[i], realBuffer[k][i], imagBuffer[k][i], rot_vctr_delay_re[i], rot_vctr_delay_im[i]);*/ + /*cplxMult(&realBuffer[k][i], &imagBuffer[k][i], realBuffer[k][i], imagBuffer[k][i], rot_vctr_delay_re[i], rot_vctr_delay_im[i]);*/ + cplx_aux = realBuffer[k][i] * rot_vctr_delay_re[i] - imagBuffer[k][i] * rot_vctr_delay_im[i]; + imagBuffer[k][i] = realBuffer[k][i] * rot_vctr_delay_im[i] + imagBuffer[k][i] * rot_vctr_delay_re[i]; + realBuffer[k][i] = cplx_aux; + /*realBuffer[k][i] = rBuffer[i]; + imagBuffer[k][i] = iBuffer[i];*/ + } + } + } + for ( i = Mz; i < M1; i++ ) + { + realBuffer[k][i] = 0.0f; + imagBuffer[k][i] = 0.0f; + } + + for ( i = 0; i < M2; i++ ) + { + /* pre modulation of DST IV */ + /*cplxMult(&rBuffer[2*i], &rBuffer[2*i+1], realBuffer[k][2*i], realBuffer[k][M1-1-2*i], rot_vctr_re[i], rot_vctr_im[i]);*/ + rBuffer[2 * i] = realBuffer[k][2 * i] * rot_vctr_re[i] - realBuffer[k][M1 - 1 - 2 * i] * rot_vctr_im[i]; + rBuffer[2 * i + 1] = realBuffer[k][2 * i] * rot_vctr_im[i] + realBuffer[k][M1 - 1 - 2 * i] * rot_vctr_re[i]; + + /* pre modulation of DCT IV */ + /*cplxMult(&iBuffer[2*i], &iBuffer[2*i+1],-imagBuffer[k][2*i], imagBuffer[k][M1-1-2*i], rot_vctr_re[i], rot_vctr_im[i]);*/ + iBuffer[2 * i] = ( -( imagBuffer[k][2 * i] ) ) * rot_vctr_re[i] - imagBuffer[k][M1 - 1 - 2 * i] * rot_vctr_im[i]; + iBuffer[2 * i + 1] = ( -( imagBuffer[k][2 * i] ) ) * rot_vctr_im[i] + imagBuffer[k][M1 - 1 - 2 * i] * rot_vctr_re[i]; + } + + /* FFT of DST IV */ + fft_cldfb( rBuffer, M2 ); + + /* FFT of DCT IV */ + fft_cldfb( iBuffer, M2 ); + + /* folding */ + for ( i = 0; i < M41; i++ ) + { + /* post modulation of DST IV */ + rr12 = rBuffer[M1 - 2 - 2 * i] * rot_vctr_re[M2 - 1 - i] - rBuffer[M1 - 1 - 2 * i] * rot_vctr_im[M2 - 1 - i]; + ri12 = rBuffer[M1 - 2 - 2 * i] * rot_vctr_im[M2 - 1 - i] + rBuffer[M1 - 1 - 2 * i] * rot_vctr_re[M2 - 1 - i]; + + /* post modulation of DCT IV */ + ir12 = iBuffer[M1 - 2 - 2 * i] * rot_vctr_re[M2 - 1 - i] - iBuffer[M1 - 1 - 2 * i] * rot_vctr_im[M2 - 1 - i]; + ii12 = iBuffer[M1 - 2 - 2 * i] * rot_vctr_im[M2 - 1 - i] + iBuffer[M1 - 1 - 2 * i] * rot_vctr_re[M2 - 1 - i]; + + new_samples[M1 + M2 + 1 + 2 * i] = -rr12 - ii12; + new_samples[M2 - 2 - 2 * i] = -ri12 - ir12; + + new_samples[M1 + M2 - 2 - 2 * i] = rr12 - ii12; + new_samples[M2 + 1 + 2 * i] = ir12 - ri12; + } + + for ( i = 0; i < M42; i++ ) + { + /* post modulation of DST IV */ + rr12 = rBuffer[2 * i] * rot_vctr_re[i] - rBuffer[2 * i + 1] * rot_vctr_im[i]; + ri12 = rBuffer[2 * i] * rot_vctr_im[i] + rBuffer[2 * i + 1] * rot_vctr_re[i]; + + /* post modulation of DCT IV */ + ir12 = iBuffer[2 * i] * rot_vctr_re[i] - iBuffer[2 * i + 1] * rot_vctr_im[i]; + ii12 = iBuffer[2 * i] * rot_vctr_im[i] + iBuffer[2 * i + 1] * rot_vctr_re[i]; + + new_samples[M1 + M2 + 2 * i] = ri12 + ir12; + new_samples[M2 - 1 - 2 * i] = rr12 + ii12; + + new_samples[M1 + M2 - 1 - 2 * i] = ir12 - ri12; + new_samples[M2 + 2 * i] = rr12 - ii12; + } + + /* synthesis prototype filter */ + for ( i = 0; i < L2; i++ ) + { + accu0 = synthesisBuffer[0 * L2 + i] + p_filter[( 0 * L2 + i )] * new_samples[L2 - 1 - i]; + accu1 = synthesisBuffer[1 * L2 + i] + p_filter[( 1 * L2 + i )] * new_samples[L2 - 1 - i]; + accu2 = synthesisBuffer[2 * L2 + i] + p_filter[( 2 * L2 + i )] * new_samples[L2 - 1 - i]; + accu3 = synthesisBuffer[3 * L2 + i] + p_filter[( 3 * L2 + i )] * new_samples[L2 - 1 - i]; + accu4 = synthesisBuffer[4 * L2 + i] + p_filter[( 4 * L2 + i )] * new_samples[L2 - 1 - i]; + + synthesisBuffer[0 * L2 + i] = accu0; + synthesisBuffer[1 * L2 + i] = accu1; + synthesisBuffer[2 * L2 + i] = accu2; + synthesisBuffer[3 * L2 + i] = accu3; + synthesisBuffer[4 * L2 + i] = accu4; + } + + for ( i = 0; i < M1; i++ ) + { + ptr_time_out[M1 - 1 - i] = synthesisBuffer[4 * L2 + M1 + i]; + } + + ptr_time_out += M1; + + synthesisBuffer -= M1; + + set_f( synthesisBuffer, 0, M1 ); + } + + /* update memory */ + mvr2r( buffer, h_cldfb->cldfb_state, h_cldfb->p_filter_length ); + + return; +} + +/*-------------------------------------------------------------------* + * configureClfdb() + * + * configures a CLDFB handle + *--------------------------------------------------------------------*/ + +void configureCldfb( + HANDLE_CLDFB_FILTER_BANK h_cldfb, /* i/o: filter bank handle */ + const int32_t sampling_rate /* i : sampling rate */ +) +{ + + h_cldfb->no_col = CLDFB_NO_COL_MAX; + h_cldfb->bandsToZero = 0; + h_cldfb->nab = 0; + + h_cldfb->no_channels = (int16_t) ( sampling_rate * INV_CLDFB_BANDWIDTH + 0.5f ); + h_cldfb->p_filter_length = 10 * h_cldfb->no_channels; + + cldfb_init_proto_and_twiddles( h_cldfb ); + + return; +} + +/*-------------------------------------------------------------------* + * openClfdb() + * + * open and configures a CLDFB handle + *--------------------------------------------------------------------*/ + +ivas_error openCldfb( + HANDLE_CLDFB_FILTER_BANK *h_cldfb, /* i/o: filter bank handle */ + CLDFB_TYPE type, /* i : analysis or synthesis */ + const int32_t sampling_rate, /* i : sampling rate */ + CLDFB_PROTOTYPE prototype /* i : CLDFB version (1.25ms/5ms delay) */ +) +{ + HANDLE_CLDFB_FILTER_BANK hs; + int16_t buf_len; + + if ( ( hs = (HANDLE_CLDFB_FILTER_BANK) malloc( sizeof( CLDFB_FILTER_BANK ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for CLDFB" ); + } + + hs->type = type; + hs->prototype = prototype; + + configureCldfb( hs, sampling_rate ); + hs->memory = NULL; + hs->memory_length = 0; + + if ( type == CLDFB_ANALYSIS ) + { + buf_len = hs->p_filter_length - hs->no_channels; + } + else + { + buf_len = hs->p_filter_length; + } + + if ( ( hs->cldfb_state = (float *) malloc( buf_len * sizeof( float ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for CLDFB" ); + } + + set_f( hs->cldfb_state, 0.0f, buf_len ); + + *h_cldfb = hs; + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * resampleCldfb() + * + * Change sample rate of filter bank + *--------------------------------------------------------------------*/ + +void resampleCldfb( + HANDLE_CLDFB_FILTER_BANK hs, /* i/o: filter bank handle */ + const int32_t newSamplerate ) +{ + int16_t timeOffset; + + /* keep old parameters before switching*/ + int16_t timeOffsetold = hs->p_filter_length - hs->no_channels; + + /* new settings */ + configureCldfb( hs, newSamplerate ); + timeOffset = hs->p_filter_length - hs->no_channels; + + /*low complexity-resampling only stored previous samples that are needed for next frame modulation */ + lerp( hs->cldfb_state, hs->cldfb_state, timeOffset, timeOffsetold ); + + return; +} + +/*-------------------------------------------------------------------* + * analysisCLDFBEncoder() + * + * Encoder CLDFB analysis + energy stage + *--------------------------------------------------------------------*/ + +void analysisCldfbEncoder( + Encoder_State *st, /* i/o: encoder state structure */ + const float *timeIn, + const int16_t samplesToProcess, + float realBuffer[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], + float imagBuffer[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], + float *ppBuf_Ener ) +{ + int16_t i; + float *ppBuf_Real[CLDFB_NO_COL_MAX]; + float *ppBuf_Imag[CLDFB_NO_COL_MAX]; + + for ( i = 0; i < CLDFB_NO_COL_MAX; i++ ) + { + ppBuf_Real[i] = &realBuffer[i][0]; + ppBuf_Imag[i] = &imagBuffer[i][0]; + } + + cldfbAnalysis( timeIn, ppBuf_Real, ppBuf_Imag, samplesToProcess, st->cldfbAnaEnc ); + + st->currEnergyHF = GetEnergyCldfb( ppBuf_Ener, &st->currEnergyLookAhead, ppBuf_Real, ppBuf_Imag, st->cldfbAnaEnc->no_channels, st->cldfbAnaEnc->no_col, st->hTECEnc ); + + return; +} + +/*-------------------------------------------------------------------* + * GetEnergyCldfb() + * + * Conduct energy from complex data + *--------------------------------------------------------------------*/ + +static float GetEnergyCldfb( + float *energyValuesSum, /* o : the result of the operation */ + float *energyLookahead, /* o : the result in the core look-ahead slot */ + float **realValues, /* i : the real part of the subsamples */ + float **imagValues, /* i : the imaginary part of the subsamples */ + const int16_t numberBands, /* i : number of bands */ + int16_t numberCols, /* i : number of subsamples */ + TEC_ENC_HANDLE hTecEnc /* i/o: TEC handle */ +) +{ + int16_t j, k; + float energyValues[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + int16_t numLookahead = 1; + + for ( k = 0; k < numberCols; k++ ) + { + for ( j = 0; j < numberBands; j++ ) + { + energyValues[k][j] = realValues[k][j] * realValues[k][j] + + imagValues[k][j] * imagValues[k][j]; + } + } + + if ( numberBands >= freqTable[1] && hTecEnc != NULL ) + { + float *tempEnergyValuesArry[CLDFB_NO_COL_MAX]; + + assert( numberCols == CLDFB_NO_COL_MAX ); + for ( j = 0; j < numberCols; j++ ) + { + tempEnergyValuesArry[j] = &energyValues[j][0]; + } + + calcHiEnvLoBuff( numberCols, freqTable, 1, tempEnergyValuesArry, hTecEnc->loBuffer, hTecEnc->hiTempEnv ); + } + + for ( j = 0; j < numberBands; j++ ) + { + energyValuesSum[j] = 0; + for ( k = 0; k < CLDFB_NO_COL_MAX; k++ ) + { + energyValuesSum[j] += energyValues[k][j]; + } + } + + if ( numberBands > 20 ) + { + float energyHF = *energyLookahead; /* energy above 8 kHz */ + numberCols -= numLookahead; + *energyLookahead = 6.1e-5f; /* process look-ahead region */ + + for ( j = 20; j < min( 40, numberBands ); j++ ) + { + energyHF += energyValuesSum[j]; + + for ( k = numberCols; k < CLDFB_NO_COL_MAX; k++ ) + { + energyHF -= energyValues[k][j]; + *energyLookahead += energyValues[k][j]; + } + } + + return energyHF * OUTMAX_SQ_INV; + } + + return 65535.0f; +} + + +/*-------------------------------------------------------------------* + * GetEnergyCldfb() + * + * Remove handle + *--------------------------------------------------------------------*/ + +void deleteCldfb( + HANDLE_CLDFB_FILTER_BANK *h_cldfb /* i/o: filter bank handle */ +) +{ + HANDLE_CLDFB_FILTER_BANK hs = *h_cldfb; + + if ( h_cldfb == NULL || *h_cldfb == NULL ) + { + return; + } + + if ( hs->cldfb_state ) + { + free( hs->cldfb_state ); + } + + free( hs ); + *h_cldfb = NULL; + + return; +} + + +/*-------------------------------------------------------------------* + * cldfb_init_proto_and_twiddles() + * + * Initializes rom pointer + *--------------------------------------------------------------------*/ + +static void cldfb_init_proto_and_twiddles( + HANDLE_CLDFB_FILTER_BANK hs /* i/o: filter bank handle */ +) +{ + /*find appropriate set of rotVecs*/ + switch ( hs->no_channels ) + { + case 10: + hs->rot_vec_ana_re = rot_vec_ana_re_L10; + hs->rot_vec_ana_im = rot_vec_ana_im_L10; + hs->rot_vec_syn_re = rot_vec_syn_re_L10; + hs->rot_vec_syn_im = rot_vec_syn_im_L10; + + if ( hs->prototype == CLDFB_PROTOTYPE_1_25MS ) + { + hs->p_filter = CLDFB80_10; + hs->scale = CLDFB80_10_SCALE; + hs->ds = 10; + hs->da = 10; + hs->rot_vec_ana_delay_re = NULL; + hs->rot_vec_ana_delay_im = NULL; + hs->rot_vec_syn_delay_re = NULL; + hs->rot_vec_syn_delay_im = NULL; + } + else if ( hs->prototype == CLDFB_PROTOTYPE_5_00MS ) + { + hs->p_filter = LDQMF_10; + hs->scale = LDQMF_10_SCALE; + hs->ds = 40; + hs->da = -20; + hs->rot_vec_ana_delay_re = rot_vec_delay_re_LDQMF; + hs->rot_vec_ana_delay_im = rot_vec_delay_im_LDQMF; + hs->rot_vec_syn_delay_re = rot_vec_delay_re_LDQMF; + hs->rot_vec_syn_delay_im = rot_vec_delay_im_LDQMF; + } + break; + + case 16: + hs->rot_vec_ana_re = rot_vec_ana_re_L16; + hs->rot_vec_ana_im = rot_vec_ana_im_L16; + hs->rot_vec_syn_re = rot_vec_syn_re_L16; + hs->rot_vec_syn_im = rot_vec_syn_im_L16; + if ( hs->prototype == CLDFB_PROTOTYPE_1_25MS ) + { + hs->p_filter = CLDFB80_16; + hs->scale = CLDFB80_16_SCALE; + hs->ds = 20; + hs->da = 20; + hs->rot_vec_ana_delay_re = NULL; + hs->rot_vec_ana_delay_im = NULL; + hs->rot_vec_syn_delay_re = NULL; + hs->rot_vec_syn_delay_im = NULL; + } + else if ( hs->prototype == CLDFB_PROTOTYPE_5_00MS ) + { + hs->p_filter = LDQMF_16; + hs->scale = LDQMF_16_SCALE; + hs->ds = 80; + hs->da = -40; + hs->rot_vec_ana_delay_re = rot_vec_delay_re_LDQMF; + hs->rot_vec_ana_delay_im = rot_vec_delay_im_LDQMF; + hs->rot_vec_syn_delay_re = rot_vec_delay_re_LDQMF; + hs->rot_vec_syn_delay_im = rot_vec_delay_im_LDQMF; + } + break; + + case 20: + hs->rot_vec_ana_re = rot_vec_ana_re_L20; + hs->rot_vec_ana_im = rot_vec_ana_im_L20; + hs->rot_vec_syn_re = rot_vec_syn_re_L20; + hs->rot_vec_syn_im = rot_vec_syn_im_L20; + if ( hs->prototype == CLDFB_PROTOTYPE_1_25MS ) + { + hs->p_filter = CLDFB80_20; + hs->scale = CLDFB80_20_SCALE; + hs->ds = 20; + hs->da = 20; + hs->rot_vec_ana_delay_re = NULL; + hs->rot_vec_ana_delay_im = NULL; + hs->rot_vec_syn_delay_re = NULL; + hs->rot_vec_syn_delay_im = NULL; + } + else if ( hs->prototype == CLDFB_PROTOTYPE_5_00MS ) + { + hs->p_filter = LDQMF_20; + hs->scale = LDQMF_20_SCALE; + hs->ds = 80; + hs->da = -40; + hs->rot_vec_ana_delay_re = rot_vec_delay_re_LDQMF; + hs->rot_vec_ana_delay_im = rot_vec_delay_im_LDQMF; + hs->rot_vec_syn_delay_re = rot_vec_delay_re_LDQMF; + hs->rot_vec_syn_delay_im = rot_vec_delay_im_LDQMF; + } + break; + + case 30: + hs->rot_vec_ana_re = rot_vec_ana_re_L30; + hs->rot_vec_ana_im = rot_vec_ana_im_L30; + hs->rot_vec_syn_re = rot_vec_syn_re_L30; + hs->rot_vec_syn_im = rot_vec_syn_im_L30; + if ( hs->prototype == CLDFB_PROTOTYPE_1_25MS ) + { + hs->p_filter = CLDFB80_30; + hs->scale = CLDFB80_30_SCALE; + hs->ds = 30; + hs->da = 30; + hs->rot_vec_ana_delay_re = NULL; + hs->rot_vec_ana_delay_im = NULL; + hs->rot_vec_syn_delay_re = NULL; + hs->rot_vec_syn_delay_im = NULL; + } + else if ( hs->prototype == CLDFB_PROTOTYPE_5_00MS ) + { + hs->p_filter = LDQMF_30; + hs->scale = LDQMF_30_SCALE; + hs->ds = 120; + hs->da = -60; + hs->rot_vec_ana_delay_re = rot_vec_delay_re_LDQMF; + hs->rot_vec_ana_delay_im = rot_vec_delay_im_LDQMF; + hs->rot_vec_syn_delay_re = rot_vec_delay_re_LDQMF; + hs->rot_vec_syn_delay_im = rot_vec_delay_im_LDQMF; + } + break; + + case 32: + hs->rot_vec_ana_re = rot_vec_ana_re_L32; + hs->rot_vec_ana_im = rot_vec_ana_im_L32; + hs->rot_vec_syn_re = rot_vec_syn_re_L32; + hs->rot_vec_syn_im = rot_vec_syn_im_L32; + if ( hs->prototype == CLDFB_PROTOTYPE_1_25MS ) + { + hs->p_filter = CLDFB80_32; + hs->scale = CLDFB80_32_SCALE; + hs->ds = 32; + hs->da = 32; + hs->rot_vec_ana_delay_re = NULL; + hs->rot_vec_ana_delay_im = NULL; + hs->rot_vec_syn_delay_re = NULL; + hs->rot_vec_syn_delay_im = NULL; + } + else if ( hs->prototype == CLDFB_PROTOTYPE_5_00MS ) + { + hs->p_filter = LDQMF_32; + hs->scale = LDQMF_32_SCALE; + hs->ds = 160; + hs->da = -80; + hs->rot_vec_ana_delay_re = rot_vec_delay_re_LDQMF; + hs->rot_vec_ana_delay_im = rot_vec_delay_im_LDQMF; + hs->rot_vec_syn_delay_re = rot_vec_delay_re_LDQMF; + hs->rot_vec_syn_delay_im = rot_vec_delay_im_LDQMF; + } + break; + + case 40: + hs->rot_vec_ana_re = rot_vec_ana_re_L40; + hs->rot_vec_ana_im = rot_vec_ana_im_L40; + hs->rot_vec_syn_re = rot_vec_syn_re_L40; + hs->rot_vec_syn_im = rot_vec_syn_im_L40; + if ( hs->prototype == CLDFB_PROTOTYPE_1_25MS ) + { + hs->p_filter = CLDFB80_40; + hs->scale = CLDFB80_40_SCALE; + hs->ds = 40; + hs->da = 40; + hs->rot_vec_ana_delay_re = NULL; + hs->rot_vec_ana_delay_im = NULL; + hs->rot_vec_syn_delay_re = NULL; + hs->rot_vec_syn_delay_im = NULL; + } + else if ( hs->prototype == CLDFB_PROTOTYPE_5_00MS ) + { + hs->p_filter = LDQMF_40; + hs->scale = LDQMF_40_SCALE; + hs->ds = 160; + hs->da = -80; + hs->rot_vec_ana_delay_re = rot_vec_delay_re_LDQMF; + hs->rot_vec_ana_delay_im = rot_vec_delay_im_LDQMF; + hs->rot_vec_syn_delay_re = rot_vec_delay_re_LDQMF; + hs->rot_vec_syn_delay_im = rot_vec_delay_im_LDQMF; + } + break; + + case 60: + hs->rot_vec_ana_re = rot_vec_ana_re_L60; + hs->rot_vec_ana_im = rot_vec_ana_im_L60; + hs->rot_vec_syn_re = rot_vec_syn_re_L60; + hs->rot_vec_syn_im = rot_vec_syn_im_L60; + if ( hs->prototype == CLDFB_PROTOTYPE_1_25MS ) + { + hs->p_filter = CLDFB80_60; + hs->scale = CLDFB80_60_SCALE; + hs->ds = 60; + hs->da = 60; + hs->rot_vec_ana_delay_re = NULL; + hs->rot_vec_ana_delay_im = NULL; + hs->rot_vec_syn_delay_re = NULL; + hs->rot_vec_syn_delay_im = NULL; + } + else if ( hs->prototype == CLDFB_PROTOTYPE_5_00MS ) + { + hs->p_filter = LDQMF_60; + hs->scale = LDQMF_60_SCALE; + hs->ds = 240; + hs->da = -120; + hs->rot_vec_ana_delay_re = rot_vec_delay_re_LDQMF; + hs->rot_vec_ana_delay_im = rot_vec_delay_im_LDQMF; + hs->rot_vec_syn_delay_re = rot_vec_delay_re_LDQMF; + hs->rot_vec_syn_delay_im = rot_vec_delay_im_LDQMF; + } + break; + } + + return; +} + + +/*-------------------------------------------------------------------* + * cldfb_save_memory() + * + * Save the memory of filter; to be restored with cldfb_restore_memory() + *--------------------------------------------------------------------*/ + +ivas_error cldfb_save_memory( + HANDLE_CLDFB_FILTER_BANK hs /* i/o: filter bank handle */ +) +{ + uint16_t offset = hs->p_filter_length - hs->no_channels; + + if ( hs->memory != NULL || hs->memory_length != 0 ) + { + /* memory already stored; Free memory first */ + return IVAS_ERR_OK; + } + + if ( hs->type == CLDFB_ANALYSIS ) + { + hs->memory_length = offset; + } + else + { + hs->memory_length = hs->p_filter_length; + } + + if ( ( hs->memory = (float *) malloc( hs->memory_length * sizeof( float ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for CLDFB\n" ); + } + + /* save the memory */ + mvr2r( hs->cldfb_state, hs->memory, hs->memory_length ); + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * cldfb_restore_memory() + * + * Restores the memory of filter; memory to be save by cldfb_save_memory() + *--------------------------------------------------------------------*/ + +void cldfb_restore_memory( + HANDLE_CLDFB_FILTER_BANK hs /* i/o: filter bank handle */ +) +{ + uint16_t offset = hs->p_filter_length - hs->no_channels; + uint16_t size; + + if ( hs->memory == NULL || hs->memory_length == 0 ) + { + /* memory not allocated */ + return; + } + + if ( hs->type == CLDFB_ANALYSIS ) + { + size = offset; + } + else + { + size = hs->p_filter_length; + } + + /* read the memory */ + mvr2r( hs->memory, hs->cldfb_state, hs->memory_length ); + + /* adjust sample rate if it was changed in the meanwhile */ + if ( hs->memory_length != size ) + { + lerp( hs->cldfb_state, hs->cldfb_state, size, hs->memory_length ); + } + + hs->memory_length = 0; + free( hs->memory ); + hs->memory = NULL; + + return; +} + + +/*-------------------------------------------------------------------* + * cldfb_reset_memory() + * + * Resets the memory of filter. + *--------------------------------------------------------------------*/ + +void cldfb_reset_memory( + HANDLE_CLDFB_FILTER_BANK hs /* i/o: filter bank handle */ +) +{ + uint16_t offset = hs->p_filter_length - hs->no_channels; + int16_t memory_length; + + if ( hs->type == CLDFB_ANALYSIS ) + { + memory_length = offset; + } + else + { + memory_length = hs->p_filter_length; + } + + /* save the memory */ + set_f( hs->cldfb_state, 0, memory_length ); + + return; +} diff --git a/lib_com/cng_exc.c b/lib_com/cng_exc.c new file mode 100644 index 0000000000000000000000000000000000000000..8fdc68921b1a5080204f0a7b48790f986184e945 --- /dev/null +++ b/lib_com/cng_exc.c @@ -0,0 +1,618 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*---------------------------------------------------------------------* + * Local constants + *---------------------------------------------------------------------*/ + +#define A2 0.2f +#define GAIN_VAR 0.000011f + +/*-------------------------------------------------------* + * CNG_exc() + * + * Comfort noise generation routine + *-------------------------------------------------------*/ + +void CNG_exc( + const int32_t core_brate, /* i : core bitrate */ + const int16_t L_frame, /* i : length of the frame */ + float *Enew, /* i/o: decoded SID energy */ + int16_t *seed, /* i/o: random generator seed */ + float exc[], /* o : current non-enhanced excitation */ + float exc2[], /* o : current enhanced excitation */ + float *lp_ener, /* i/o: LP filtered E */ + const int32_t last_core_brate, /* i : previous frame core bitrate */ + int16_t *first_CNG, /* i/o: first CNG frame flag for energy init. */ + int16_t *cng_ener_seed, /* i/o: random generator seed for CNG energy */ + float bwe_exc[], /* o : excitation for SWB TBE */ + const int16_t allow_cn_step, /* i : allow CN step */ + int16_t *last_allow_cn_step, /* i/o: last allow step */ + const int16_t num_ho, /* i : number of selected hangover frames */ + float q_env[], + float *lp_env, + float *old_env, + float *exc_mem, + float *exc_mem1, + int16_t *sid_bw, + int16_t *cng_ener_seed1, + float exc3[], + const int16_t Opt_AMR_WB, /* i : AMR-WB interop flag */ + const int16_t element_mode /* i : IVAS Element mode */ +) +{ + float enr; + int16_t i; + float ener_lp; + int16_t i_subfr; + int16_t pit_max; + float ftmp; + float *ptR, *ptI; + float fft_io[L_FRAME16k]; + float itmp[129]; + float env[NUM_ENV_CNG]; + float enr1; + float denv[NUM_ENV_CNG]; + + /*------------------------------------------------------------------* + * Initializations + *------------------------------------------------------------------*/ + + if ( L_frame == L_FRAME ) + { + pit_max = PIT_MAX; + } + else /* L_frame == L_FRAME16k */ + { + pit_max = PIT16k_MAX; + } + + /*---------------------------------------------------------------------* + * Initialization of CNG energy for the first CNG frame + *---------------------------------------------------------------------*/ + + if ( *first_CNG == 0 ) + { + if ( core_brate == FRAME_NO_DATA ) + { + /* needed only in decoder when the very first SID frame was erased and this frame is FRAME_NO_DATA frame */ + *Enew = dotp( exc - pit_max, exc - pit_max, pit_max ) / pit_max; + } + + if ( element_mode == EVS_MONO ) + { + *lp_ener = *Enew; + } + } + + /*---------------------------------------------------------------------* + * Update CNG energy + *---------------------------------------------------------------------*/ + + if ( last_core_brate != SID_1k75 && last_core_brate != FRAME_NO_DATA && last_core_brate != SID_2k40 ) + { + /* Partially reset CNG energy after active speech period */ + if ( allow_cn_step == 0 && *last_allow_cn_step == 0 ) + { + if ( num_ho < 3 || *Enew < 1.5f * *lp_ener ) + { + *lp_ener = 0.8f * *lp_ener + 0.2f * *Enew; + } + else + { + *lp_ener = 0.95f * *lp_ener + 0.05f * *Enew; + } + } + else + { + *lp_ener = *Enew; + *last_allow_cn_step = 0; + } + } + else + { + /* normal CNG update */ + if ( *last_allow_cn_step == 0 ) + { + *lp_ener = (float) ( A2 * *Enew + ( 1 - A2 ) * *lp_ener ); + } + else + { + if ( core_brate == SID_1k75 || core_brate == SID_2k40 ) + { + *last_allow_cn_step = 0; + } + + *lp_ener = *Enew; + } + } + + if ( allow_cn_step == 1 ) + { + *last_allow_cn_step = 1; + } + + /* If not mono, skip CNG here */ + if ( element_mode > IVAS_SCE ) + { + return; + } + + /*---------------------------------------------------------------------* + * Generate white noise vector + *---------------------------------------------------------------------*/ + + for ( i = 0; i < L_frame; i++ ) + { + exc2[i] = (float) own_random( seed ); + } + + /*------------------------------------------------------------* + * Insert random variation for excitation energy + * (random variation is scaled according to *lp_ener value) + *------------------------------------------------------------*/ + + for ( i_subfr = 0; i_subfr < L_frame; i_subfr += L_SUBFR ) + { + ener_lp = ( ( own_random( cng_ener_seed ) * ( *lp_ener ) ) * GAIN_VAR ) + ( *lp_ener ); + + if ( ener_lp < 0.0f ) + { + ener_lp = 0.01f; + } + enr = dotp( &exc2[i_subfr], &exc2[i_subfr], L_SUBFR ) + 0.01f; + + enr = (float) sqrt( ener_lp * L_SUBFR / enr ); + + for ( i = 0; i < L_SUBFR; i++ ) + { + exc2[i_subfr + i] *= enr; + } + } + + if ( Opt_AMR_WB != 1 ) + { + mvr2r( exc2, exc3, L_FRAME16k ); + + enr1 = (float) log10( *Enew * L_frame + 0.1f ) / (float) log10( 2.0f ); + + if ( core_brate == SID_2k40 ) + { + if ( *sid_bw == 0 ) + { + for ( i = 0; i < NUM_ENV_CNG; i++ ) + { + /* get quantized envelope */ + env[i] = powf( 2.0f, ( enr1 - q_env[i] ) ); + } + } + + /* initialize CNG envelope */ + if ( *first_CNG == 0 && *sid_bw == 0 ) + { + mvr2r( env, lp_env, NUM_ENV_CNG ); + } + + if ( *sid_bw == 0 ) + { + mvr2r( env, old_env, NUM_ENV_CNG ); + } + } + + for ( i = 0; i < NUM_ENV_CNG; i++ ) + { + /* get AR low-passed envelope */ + lp_env[i] = 0.9f * lp_env[i] + ( 1 - 0.9f ) * old_env[i]; + } + + /* calculate the spectrum of random excitation signal */ + mvr2r( exc2, fft_io, L_frame ); + + if ( L_frame == L_FRAME16k ) + { + modify_Fs( fft_io, L_FRAME16k, 16000, fft_io, 12800, exc_mem1, 0 ); + } + + fft_rel( fft_io, L_FFT, LOG2_L_FFT ); + ptR = &fft_io[1]; + ptI = &fft_io[L_FFT - 1]; + for ( i = 0; i < NUM_ENV_CNG; i++ ) + { + env[i] = 2.0f * ( *ptR * *ptR + *ptI * *ptI ) / L_FFT; + ptR++; + ptI--; + } + + for ( i = 0; i < NUM_ENV_CNG; i++ ) + { + denv[i] = lp_env[i] + 2 * ( *lp_ener ) - env[i]; + + if ( denv[i] < 0 ) + { + denv[i] = 0; + } + } + set_f( itmp, 0.0f, NUM_ENV_CNG ); + + set_f( fft_io, 0.0f, L_FFT ); + ptR = &fft_io[1]; + ptI = &fft_io[L_FFT - 1]; + for ( i = 0; i < NUM_ENV_CNG; i++ ) + { + *ptR = own_random( cng_ener_seed1 ); + *ptI = own_random( cng_ener_seed1 ); + + env[i] = 2.0f * ( *ptR * *ptR + *ptI * *ptI ) / L_FFT; + ptR++; + ptI--; + } + + for ( i = 0; i < NUM_ENV_CNG; i++ ) + { + itmp[i] += own_random( cng_ener_seed1 ) * denv[i] * 0.000011f + denv[i]; + + if ( itmp[i] < 0.0f ) + { + itmp[i] = 0; + } + } + + ptR = &fft_io[1]; + ptI = &fft_io[L_FFT - 1]; + for ( i = 0; i < NUM_ENV_CNG; i++ ) + { + *ptR = (float) ( *ptR * sqrt( itmp[i] / env[i] ) ); + *ptI = (float) ( *ptI * sqrt( itmp[i] / env[i] ) ); + + ptR++; + ptI--; + } + + ifft_rel( fft_io, L_FFT, LOG2_L_FFT ); + + if ( L_frame == L_FRAME16k ) + { + modify_Fs( fft_io, L_FFT, 12800, fft_io, 16000, exc_mem, 0 ); + } + + enr1 = dotp( fft_io, fft_io, L_frame ) / L_frame; + + /* add time domain randomization */ + for ( i_subfr = 0; i_subfr < L_frame; i_subfr += L_SUBFR ) + { + enr = dotp( &fft_io[i_subfr], &fft_io[i_subfr], L_SUBFR ) + 0.01f; + ener_lp = ( ( own_random( cng_ener_seed1 ) * ( enr1 ) ) * 0.000011f ) + ( enr1 ); + ener_lp *= L_SUBFR; + enr = (float) sqrt( ener_lp / enr ); + + if ( last_core_brate != SID_2k40 && last_core_brate != SID_1k75 && last_core_brate != FRAME_NO_DATA && core_brate == SID_2k40 ) + { + if ( enr > 1 ) + { + enr = 1; + } + } + + for ( i = 0; i < L_SUBFR; i++ ) + { + fft_io[i_subfr + i] *= enr; + } + } + + for ( i = 0; i < L_frame; i++ ) + { + fft_io[i] = 0.75f * fft_io[i] + exc2[i]; + } + + enr = ( dotp( fft_io, fft_io, L_frame ) / L_frame ) + 0.01f; + enr = ( *lp_ener ) / enr; + + if ( enr > 1 ) + { + enr = 1; + } + + ftmp = sqrtf( enr ); + for ( i = 0; i < L_frame; i++ ) + { + fft_io[i] *= ftmp; + } + + mvr2r( fft_io, exc2, L_frame ); + } + if ( Opt_AMR_WB != 1 ) + { + mvr2r( exc3, exc, L_frame ); + } + else + { + mvr2r( exc2, exc, L_frame ); + } + + if ( L_frame == L_FRAME ) + { + interp_code_5over2( exc2, bwe_exc, L_frame ); + } + else + { + interp_code_4over2( exc2, bwe_exc, L_frame ); + } + + return; +} + + +/*-------------------------------------------------------* + * cng_params_postupd + * + * Post-update of CNG parameters + *-------------------------------------------------------*/ + +void cng_params_postupd( + const int16_t ho_circ_ptr, /* i : pointer for CNG averaging buffers */ + int16_t *cng_buf_cnt, /* i/o: counter for CNG store buffers */ + const float *cng_exc2_buf, /* i : Excitation buffer */ + const int32_t *cng_brate_buf, /* i : bitrate buffer */ + float ho_env_circ[], /* i/o: Envelope buffer */ + const int16_t element_mode, /* i : Element mode */ + const int16_t bwidth /* i : Audio bandwidth */ +) +{ + int16_t i, j; + const float *exc2; + float fft_io[L_FFT]; + float sp[129]; + float *ptR, *ptI; + float env[NUM_ENV_CNG]; + int16_t CNG_mode; + int16_t ptr; + float att; + int32_t last_active_brate; + + ptr = ho_circ_ptr - *cng_buf_cnt + 1; + if ( ptr < 0 ) + { + ptr += HO_HIST_SIZE; + } + + for ( j = 0; j < *cng_buf_cnt; j++ ) + { + exc2 = &cng_exc2_buf[ptr * L_FFT]; + last_active_brate = cng_brate_buf[ptr]; + + /* calculate the spectrum of residual signal */ + /* calculate the spectrum of residual signal */ + mvr2r( exc2, fft_io, L_FFT ); + + fft_rel( fft_io, L_FFT, LOG2_L_FFT ); + + ptR = &fft_io[1]; + ptI = &fft_io[L_FFT - 1]; + for ( i = 0; i < NUM_ENV_CNG; i++ ) + { + sp[i] = 2.0f * ( *ptR * *ptR + *ptI * *ptI ) / L_FFT; + ptR++; + ptI--; + } + + mvr2r( sp, env, NUM_ENV_CNG ); + + if ( element_mode == IVAS_SCE || element_mode == IVAS_CPE_DFT ) + { + att = 0.0f; + apply_scale( &att, bwidth, last_active_brate, scaleTableStereo, SIZE_SCALE_TABLE_STEREO ); + att = powf( 10, att / 10.0f ); + } + else + { + CNG_mode = get_cng_mode( last_active_brate ); + att = (float) ( 1 / pow( 2, ENR_ATT[CNG_mode] ) ); + } + + for ( i = 0; i < NUM_ENV_CNG; i++ ) + { + env[i] *= att; + } + + /* update the circular buffer of old residual envelope */ + mvr2r( env, &( ho_env_circ[(ho_circ_ptr) *NUM_ENV_CNG] ), NUM_ENV_CNG ); + + ptr++; + if ( ptr == HO_HIST_SIZE ) + { + ptr = 0; + } + } + + *cng_buf_cnt = 0; + + return; +} + + +/*-------------------------------------------------------* + * cng_params_upd() + * + * update CNG parameters + *-------------------------------------------------------*/ + +void cng_params_upd( + const float lsp_new[], /* i : LSP parameters */ + const float exc2[], /* i : current enhanced excitation */ + const int16_t L_frame, /* i : frame length */ + int16_t *ho_circ_ptr, /* i/o: pointer for CNG averaging buffers */ + float ho_ener_circ[], /* o : energy buffer for CNG averaging */ + int16_t *ho_circ_size, /* i/o: size of DTX hangover history buffer for averaging */ + float ho_lsp_circ[], /* o : old LSP buffer for CNG averaging */ + const int16_t enc_dec_flag, /* i : Flag indicating encoder or decoder (ENC,DEC) */ + float ho_env_circ[], /* i/o: Envelope buffer */ + int16_t *cng_buf_cnt, /* i/o: Counter of postponed FFT-processing instances */ + float cng_exc2_buf[], /* i/o: Excitation buffer */ + int32_t cng_brate_buf[], /* i/o: last_active_brate buffer */ + const int32_t last_active_brate, /* i : Last active bitrate */ + const int16_t element_mode, /* i : element mode */ + const int16_t bwidth /* i : audio bandwidth */ +) +{ + float enr; + float fft_io[L_FRAME16k]; + float sp[129]; + float *ptR, *ptI; + float env[NUM_ENV_CNG]; + int16_t i; + int16_t CNG_mode; + float att; + + /* update the pointer to circular buffer of old LSP vectors */ + ( *ho_circ_ptr )++; + if ( *ho_circ_ptr == HO_HIST_SIZE ) + { + *ho_circ_ptr = 0; + } + + /* update the circular buffer of old LSP vectors with the new LSP vector */ + mvr2r( lsp_new, &( ho_lsp_circ[( *ho_circ_ptr ) * M] ), M ); + + /* calculate the residual signal energy */ + enr = dotp( exc2, exc2, L_frame ) / L_frame; + + /* update the circular buffer of old energies */ + ho_ener_circ[*ho_circ_ptr] = enr; + + if ( enc_dec_flag == ENC ) + { + /* Store residual signal for postponed FFT-processing*/ + ( *cng_buf_cnt )++; + if ( *cng_buf_cnt > HO_HIST_SIZE ) + { + *cng_buf_cnt = HO_HIST_SIZE; + } + mvr2r( exc2, &( cng_exc2_buf[( *ho_circ_ptr ) * L_FFT] ), L_FFT ); + cng_brate_buf[*ho_circ_ptr] = last_active_brate; + } + else + { + + /* calculate the spectrum of residual signal */ + mvr2r( exc2, fft_io, L_frame ); + + fft_rel( fft_io, L_FFT, LOG2_L_FFT ); + + ptR = &fft_io[1]; + ptI = &fft_io[L_FFT - 1]; + for ( i = 0; i < NUM_ENV_CNG; i++ ) + { + sp[i] = 2.0f * ( *ptR * *ptR + *ptI * *ptI ) / L_FFT; + ptR++; + ptI--; + } + + mvr2r( sp, env, NUM_ENV_CNG ); + + if ( element_mode == IVAS_SCE || element_mode == IVAS_CPE_DFT ) + { + att = 0.0f; + apply_scale( &att, bwidth, last_active_brate, scaleTableStereo, SIZE_SCALE_TABLE_STEREO ); + att = powf( 10, att / 10.0f ); + } + else + { + CNG_mode = get_cng_mode( last_active_brate ); + att = (float) ( 1 / pow( 2, ENR_ATT[CNG_mode] ) ); + } + + for ( i = 0; i < NUM_ENV_CNG; i++ ) + { + env[i] *= att; + } + + /* update the circular buffer of old residual envelope */ + mvr2r( env, &( ho_env_circ[( *ho_circ_ptr ) * NUM_ENV_CNG] ), NUM_ENV_CNG ); + } + + ( *ho_circ_size )++; + if ( *ho_circ_size > HO_HIST_SIZE ) + { + *ho_circ_size = HO_HIST_SIZE; + } + + return; +} + + +/*---------------------------------------------------------------------* + * get_cng_mode() + * + * + *---------------------------------------------------------------------*/ + +int16_t get_cng_mode( + const int32_t last_active_brate /* i : last active bitrate */ +) +{ + int16_t CNG_mode; + + if ( last_active_brate > ACELP_13k20 ) + { + CNG_mode = 4; + } + else if ( last_active_brate > ACELP_9k60 ) + { + CNG_mode = 3; + } + else if ( last_active_brate > ACELP_8k00 ) + { + CNG_mode = 2; + } + else if ( last_active_brate > ACELP_7k20 ) + { + CNG_mode = 1; + } + else + { + CNG_mode = 0; + } + + return ( CNG_mode ); +} diff --git a/lib_com/cnst.h b/lib_com/cnst.h new file mode 100644 index 0000000000000000000000000000000000000000..5bfffa4dd4219e13cd8c5c042b141773e2f9c645 --- /dev/null +++ b/lib_com/cnst.h @@ -0,0 +1,2233 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#ifndef CNST_H +#define CNST_H + +#include +#include "options.h" + +/* clang-format off */ + +/*----------------------------------------------------------------------------------* + * General constants + *----------------------------------------------------------------------------------*/ + +#define MODE1 1 +#define MODE2 2 + +#define EVS_PI 3.14159265358979323846264338327950288f + +#define PI2 ( 2 * EVS_PI ) +#define RANDOM_INITSEED 21845 /* Seed for random generators */ +#ifndef FLT_MIN +#define FLT_MIN ( 1.175494351e-38F ) +#endif +#ifndef FLT_MAX +#define FLT_MAX ( 3.402823466e+38F ) +#endif +#define TRUE 1 +#define FALSE 0 + +#define MAX16B 32767 +#define MIN16B ( -32768 ) +#define MAX16B_FLT 32767.0f +#define MIN16B_FLT ( -32768.0f ) +#define PCM16_TO_FLT_FAC 32768.0f +#define MDFT_NORM_SCALING ( 1.0f / PCM16_TO_FLT_FAC ) +#define MAX_FRAME_COUNTER 200 +#define MAX_BITS_PER_FRAME 10240 /* Bits per frame for max. bitrate 512kbps, == IVAS_MAX_BITS_PER_FRAME */ + +#define ENC 0 /* Index for "encoder" */ +#define DEC 1 /* Index for "decoder" */ + +#define DEC_IVAS 2 /* Index for IVAS decoder */ + + +enum{ + NB = 0, /* Indicator of 4 kHz bandwidth */ + WB = 1, /* Indicator of 8 kHz bandwidth */ + SWB = 2, /* Indicator of 14 kHz bandwidth */ + FB = 3 /* Indicator of 20 kHz bandwidth */ +}; + +/* Conversion of bandwidth string into numerical constant */ +#define CONV_BWIDTH( bw ) ( !strcmp( bw, "NB" ) ? NB : !strcmp( bw, "WB" ) ? WB : !strcmp( bw, "SWB" ) ? SWB : !strcmp( bw, "FB" ) ? FB : -1 ) + +#define L_FRAME48k 960 /* Frame size in samples at 48kHz */ +#define L_FRAME32k 640 /* Frame size in samples at 32kHz */ +#define L_FRAME25_6k 512 /* Frame size in samples at 25.6kHz */ +#define L_FRAME16k 320 /* Frame size in samples at 16kHz */ +#define L_FRAME8k 160 /* Frame size in samples at 8kHz */ +#define L_FRAME4k 80 /* Frame size in samples at 4kHz */ + +#define L_SPEC48k 800 /* HQ spectrum length at 48kHz */ +#define L_SPEC32k 640 /* HQ spectrum length at 32kHz */ +#define L_SPEC16k 320 /* HQ spectrum length at 16kHz */ +#define L_SPEC8k 160 /* HQ spectrum length at 8kHz */ +#define L_SPEC48k_EXT 1000 /* Extended HQ spectrum length at 48kHz, for ACELP->HQ switching */ +#define L_SPEC32k_EXT 800 /* Extended HQ spectrum length at 32kHz, for ACELP->HQ switching */ +#define L_SPEC16k_EXT 400 /* Extended HQ spectrum length at 16kHz, for ACELP->HQ switching */ +#define L_FRAME48k_EXT 1200 /* Extended MDCT frame size in samples at 48kHz */ + +/* Conversion of ns to samples for a given sampling frequency */ +#define NS2SA( fs, x ) ( int16_t )( ( ( ( int32_t )( fs ) / 100L ) * ( ( x ) / 100L ) ) / 100000L ) + +#define ACTIVE_FRAME 0xFF +#define SID_FRAME 0xFA +#define ZERO_FRAME 0xF0 +#define FRAME_SIZE_NB 13 + +#define RATE_MODE_MAX 2 /* Number of rate mode */ +#define BANDWIDTH_MODE_MAX 2 /* Number of different bandwidth (NB/WB-FB) */ + +#define MIN_LOG_60dB 0.000001f +#define MIN_LOG_VAL_60dB -60.0f + +#define INV_LOG_2 1.442695040888963f /* 1/log(2) */ +#define INV_SQRT_2 0.70710676908493f /* 1/sqrt(2) */ + +#define MAX_V_MULT_MAT 100 /* maximum array length for the function v_mult_mat() */ + +#define SBA_AGC_FORCE_ENABLE 1 +#define SBA_AGC_FORCE_DISABLE 0 +#define SBA_AGC_DEFAULT -1 + +/*----------------------------------------------------------------------------------* + * Layers + *----------------------------------------------------------------------------------*/ + +#define ACELP_CORE 0 /* ACELP core layer */ +#define TCX_20_CORE 1 /* TCX 20ms core layer */ +#define TCX_10_CORE 2 /* TCX 10ms core layer */ +#define HQ_CORE 3 /* HQ core layer */ +#define AMR_WB_CORE 4 /* AMR-WB IO core */ + + +#define WB_TBE 5 /* WB TBE layer (16/32/48kHz signals) */ +#define WB_BWE 6 /* WB BWE layer optimized for music (16/32/48kHz signals) */ + +#define SWB_CNG 7 /* SWB CNG layer (32/48kHz signals) */ +#define SWB_TBE 8 /* SWB TBE layer optimized for speech (32/48kHz signals) */ +#define SWB_BWE 9 /* SWB BWE layer optimized for music (32/48kHz signals) */ +#define SWB_BWE_HIGHRATE 10 /* SWB BWE layer optimized for highrate speech (32/48kHz) */ + +#define FB_TBE 11 /* FB TBE layer (48kHz signals) */ +#define FB_BWE 12 /* FB BWE layer optimized for music (48kHz) */ +#define FB_BWE_HIGHRATE 13 /* FB BWE layer optimized for highrate speech (48kHz) */ + +#define IGF_BWE 14 /* IGF layer for music (16.4 and 24.4kbps), 32kHz signals */ + +#define LP_CNG 0 /* LP-based CNG in DTX operation */ +#define FD_CNG 1 /* FD-based CNG in DTX operation */ + +/*----------------------------------------------------------------------------------* + * Bitrates + *----------------------------------------------------------------------------------*/ + +#define FRAME_NO_DATA 0 /* Frame with no data */ +#define SID_1k75 1750 /* SID at 1.75 kbps (used only in AMR-WB IO mode */ +#define SID_2k40 2400 /* SID at 2.40 kbps */ +#define PPP_NELP_2k80 2800 /* PPP and NELP at 2.80 kbps (used only for SC-VBR) */ +#define ACELP_5k90 5900 /* ACELP core layer at average bitrate of 5.90 kbps (used only in SC-VBR mode) */ +#define ACELP_5k00 5000 /* ACELP core layer at 5.00 kbps (used only in TD stereo secondary channel) */ +#define ACELP_6k15 6150 /* ACELP core layer at 6.15 kbps (used only in TD stereo secondary channel) */ +#define ACELP_6k60 6600 /* ACELP core layer at 6.60 kbps (used only in AMR-WB IO mode) */ +#define ACELP_7k20 7200 /* ACELP core layer at 7.20 kbps */ +#define ACELP_8k00 8000 /* ACELP core layer at 8 kbps */ +#define ACELP_8k85 8850 /* ACELP core layer at 8.85 kbps (used only in AMR-WB IO mode) */ +#define ACELP_9k60 9600 /* ACELP core layer at 9.60 kbps */ +#define ACELP_11k60 11600 /* ACELP core layer at 11.60 kbps (used for SWB TBE) */ +#define ACELP_12k15 12150 /* ACELP core layer at 12.15 kbps (used for WB TBE) */ +#define ACELP_12k65 12650 /* ACELP core layer at 12.65 kbps (used only in AMR-WB IO mode) */ +#define ACELP_12k85 12850 /* ACELP core layer at 12.85 kbps (used for WB BWE) */ +#define ACELP_13k20 13200 /* ACELP core layer at 13.20 kbps */ +#define ACELP_14k25 14250 /* ACELP core layer at 14.25 kbps (used only in AMR-WB IO mode) */ +#define ACELP_14k80 14800 /* ACELP core layer at 14.80 kbps (used only in core switching) */ +#define ACELP_15k85 15850 /* ACELP core layer at 15.85 kbps (used only in AMR-WB IO mode) */ +#define ACELP_16k40 16400 /* ACELP core layer at 16.40 kbps */ +#define ACELP_18k25 18250 /* ACELP core layer at 18.25 kbps (used only in AMR-WB IO mode) */ +#define ACELP_19k85 19850 /* ACELP core layer at 19.85 kbps (used only in AMR-WB IO mode) */ +#define ACELP_22k60 22600 /* ACELP core layer at 22.60 kbps (used only in core switching) */ +#define ACELP_23k05 23050 /* ACELP core layer at 23.05 kbps (used only in AMR-WB IO mode) */ +#define ACELP_23k85 23850 /* ACELP core layer at 23.85 kbps (used only in AMR-WB IO mode) */ +#define ACELP_24k40 24400 /* ACELP core layer at 24.40 kbps */ +#define ACELP_29k00 29000 /* ACELP core layer at 29.00 kbps (used for FB + SWB TBE) */ +#define ACELP_29k20 29200 /* ACELP core layer at 29.20 kbps (used for SWB TBE) */ +#define ACELP_30k20 30200 /* ACELP core layer at 30.20 kbps (used for FB + SWB BWE) */ +#define ACELP_30k40 30400 /* ACELP core layer at 30.40 kbps (used for SWB BWE) */ +#define ACELP_32k 32000 /* ACELP core layer at 32 kbps */ +#define ACELP_48k 48000 /* ACELP core layer at 48 kbps */ +#define ACELP_64k 64000 /* ACELP core layer at 64 kbps */ + +#define HQ_16k40 16400 /* HQ core at 16.4 kbps */ +#define HQ_13k20 13200 /* HQ core at 13.2 kbps */ +#define HQ_24k40 24400 /* HQ core at 24.4 kbps */ +#define HQ_32k 32000 /* HQ core at 32 kbps */ +#define HQ_48k 48000 /* HQ core at 48 kbps */ +#define HQ_64k 64000 /* HQ core at 64 kbps */ +#define HQ_96k 96000 /* HQ core at 96 kbps */ +#define HQ_128k 128000 /* HQ core at 128 kbps */ + +#define WB_TBE_0k35 350 /* WB TBE layer (used only at 9.6 kbps on top of ACELP@12k8 core for 16kHz signals) */ +#define WB_BWE_0k35 350 /* WB BWE layer (used only on top of ACELP@12k8 core for 16kHz signals) */ +#define WB_TBE_1k05 1050 /* WB TBE layer (used only on top of ACELP@12k8 core for 16kHz signals) */ +#define SWB_TBE_0k95 950 /* SWB TBE layer (used in low SWB bitrates) */ +#define SWB_TBE_1k10 1100 /* SWB TBE layer in LRTD stereo */ +#define SWB_TBE_1k75 1750 /* SWB TBE layer in LRTD stereo */ +#define SWB_TBE_1k6 1600 /* SWB TBE layer */ +#define SWB_BWE_1k6 1600 /* SWB BWE layer */ +#define FB_TBE_1k8 1800 /* SWB+FB TBE layer (used only for 48kHz signals) */ +#define FB_BWE_1k8 1800 /* SWB+FB BWE layer (used only for 48kHz signals) */ +#define SWB_TBE_2k8 2800 /* SWB TBE layer @32kbps */ +#define FB_TBE_3k0 3000 /* SWB+FB TBE layer @32kbps (used only for 48kHz signals) */ +#define SWB_BWE_16k 16000 /* SWB BWE layer for highrate SWB speech */ + +#define GSC_LRES_GAINQ_LIMIT 3000 /* Bitrate where the low resolution quantization starts for the GSC */ +#define GSC_LRES_NB_NITS 10 /* Number of bits gained by using the low resolution quantization */ + +#define SIZE_BRATE_TBL 11 +#define SIZE_BRATE_INTERMED_TBL 22 + +#define BRATE2IDX( brate ) ( brate == ACELP_5k00 ? 0 : brate == ACELP_6k15 ? 1 : brate == ACELP_7k20 ? 2 : brate == ACELP_8k00 ? 3 : brate == ACELP_9k60 ? 4 : brate == ACELP_11k60 ? 5 : brate == ACELP_12k15 ? 6 : brate == ACELP_12k85 ? 7 : brate == ACELP_13k20 ? 8 : brate == ACELP_14k80 ? 9 : brate == ACELP_16k40 ? 10 : brate == ACELP_22k60 ? 11 : brate == ACELP_24k40 ? 12 : brate == ACELP_29k00 ? 13 : brate == ACELP_29k20 ? 14 : brate == ACELP_30k20 ? 15 : brate == ACELP_30k40 ? 16 : brate == ACELP_32k ? 17 : brate == ACELP_48k ? 18 : brate == ACELP_64k ? 19 : brate == HQ_96k ? 20 : brate == HQ_128k ? 21 : -1 ) + +#define BRATE2IDX16k( brate ) ( brate == ACELP_8k00 ? 0 : brate == ACELP_14k80 || brate == ACELP_16k40 ? 1 : brate == ACELP_22k60 ? 2 : brate == ACELP_24k40 ? 3 : brate == ACELP_29k00 ? 4 : brate == ACELP_29k20 ? 5 : brate == ACELP_30k20 ? 6 : brate == ACELP_30k40 ? 7 : brate == ACELP_32k ? 8 : brate == ACELP_48k ? 9 : brate == ACELP_64k ? 10 : -1 ) + +/* Combine parameters into a single index (used to retrieve number of bits from bit allocation tables) */ +#define LSF_BIT_ALLOC_IDX( brate, ctype ) ( 6 * BRATE2IDX( brate ) + ( ctype ) ) + +#define BIT_ALLOC_IDX( brate, ctype, sfrm, tc ) \ + ( ( sfrm != -1 ? NB_SUBFR : 1 ) * \ + ( ( tc == -1 ? 4 : 10 ) * BRATE2IDX( brate ) + ( ctype == INACTIVE ? GENERIC : ctype ) - 1 + ( tc == -1 ? 0 : tc ) ) + \ + ( sfrm != -1 ? sfrm / L_SUBFR : 0 ) ) + +#define BIT_ALLOC_IDX_16KHZ( brate, ctype, sfrm, tc ) \ + ( ( sfrm > -1 ? NB_SUBFR16k : 1 ) * \ + ( ( tc == -1 ? 3 : 7 ) * BRATE2IDX16k( brate ) + ( ctype == TRANSITION ? 2 : ( ctype == GENERIC ? 1 : 0 ) ) + ( tc == -1 ? 0 : tc ) ) + \ + ( sfrm != -1 ? sfrm / L_SUBFR : 0 ) ) + +/* Combine coder_type, bandwidth, formant sharpening flag, and channel-aware flag into one indice */ +#define SIG2IND( ctype, bw, sf, ca_rf ) ( ctype | ( bw << 3 ) | ( sf << 6 ) | ( ca_rf << 7 ) ) + +#define MAX_ACELP_SIG 100 + +/*----------------------------------------------------------------------------------* + * Bitstream indices + *----------------------------------------------------------------------------------*/ + +#define MAX_PVQ_PUSH_IND 320 /* Maximum number of (fwd+reverse) calls to push_indices for the PVQ_range encoder */ + +enum +{ + IND_IVAS_FORMAT, + IND_SMODE_OMASA, + IND_SMODE, + IND_SID_TYPE, + IND_BWIDTH, + IND_CORE, + IND_PPP_NELP_MODE, + IND_ACELP_16KHZ, + IND_ACELP_SIGNALLING, + IND_SHARP_FLAG, + IND_MDCT_CORE, + IND_TCX_CORE, + IND_BWE_FLAG, + IND_HQ_SWITCHING_FLG, + IND_LAST_L_FRAME, + IND_VAD_FLAG, + IND_HQ_BWIDTH, + IND_TC_SUBFR, + IND_GSC_IVAS_SP = IND_TC_SUBFR + 4, + IND_LSF_PREDICTOR_SELECT_BIT, + IND_LSF, + IND_MID_FRAME_LSF_INDEX = IND_LSF + 17, + + IND_ISF_0_0, + IND_ISF_0_1, + IND_ISF_0_2, + IND_ISF_0_3, + IND_ISF_0_4, + IND_ISF_1_0, + IND_ISF_1_1, + IND_ISF_1_2, + IND_ISF_1_3, + IND_ISF_1_4, + IND_IC_LSF_PRED, + IND_GSC_ATTACK, + IND_GSC_SWB_SPEECH, + IND_NOISE_LEVEL, + IND_HF_NOISE, + IND_PIT_CONTR_IDX, + IND_FEC_CLAS, + IND_FEC_ENR, + IND_FEC_POS, + IND_ES_PRED, + IND_HARM_FLAG_ACELP, + + /* ------------- Loop for alg. codebook indices at 24.4 kbps (special case) -------------- */ + TAG_ALG_CDBK_4T64_24KBIT_START, + IND_ALG_CDBK_4T64_1_24KBIT = TAG_ALG_CDBK_4T64_24KBIT_START, + IND_ALG_CDBK_4T64_2_24KBIT = TAG_ALG_CDBK_4T64_24KBIT_START, + TAG_ALG_CDBK_4T64_24KBIT_END = TAG_ALG_CDBK_4T64_24KBIT_START + 40, + /* ------------------------------------------------ */ + + /* ------------- ACELP subframe loop -------------- */ + TAG_ACELP_SUBFR_LOOP_START, + IND_PITCH = TAG_ACELP_SUBFR_LOOP_START, + IND_LP_FILT_SELECT = TAG_ACELP_SUBFR_LOOP_START, + IND_ALG_CDBK_1T64 = TAG_ACELP_SUBFR_LOOP_START, + IND_ALG_CDBK_2T32 = TAG_ACELP_SUBFR_LOOP_START, + IND_ALG_CDBK_4T64 = TAG_ACELP_SUBFR_LOOP_START, + IND_ALG_CDBK_4T64_1 = TAG_ACELP_SUBFR_LOOP_START, + IND_ALG_CDBK_4T64_2 = TAG_ACELP_SUBFR_LOOP_START, + IND_ALG_CDBK_4T64_1BIT = TAG_ACELP_SUBFR_LOOP_START, + IND_GAUS_CDBK_INDEX = TAG_ACELP_SUBFR_LOOP_START, + IND_TILT_FACTOR = TAG_ACELP_SUBFR_LOOP_START, + IND_GAIN = TAG_ACELP_SUBFR_LOOP_START, + IND_GAIN_CODE = TAG_ACELP_SUBFR_LOOP_START, + IND_TC_IMP_SHAPE = TAG_ACELP_SUBFR_LOOP_START, + IND_TC_IMP_POS = TAG_ACELP_SUBFR_LOOP_START, + IND_TC_IMP_SIGN = TAG_ACELP_SUBFR_LOOP_START, + IND_TC_IMP_GAIN = TAG_ACELP_SUBFR_LOOP_START, + IND_GAIN_PIT = TAG_ACELP_SUBFR_LOOP_START, + IND_PIT_IDX = TAG_ACELP_SUBFR_LOOP_START, + IND_AVQ_GAIN = TAG_ACELP_SUBFR_LOOP_START, + IND_I = TAG_ACELP_SUBFR_LOOP_START, + IND_KV = TAG_ACELP_SUBFR_LOOP_START, + IND_NQ = TAG_ACELP_SUBFR_LOOP_START, + IND_HF_GAIN_MODIFICATION = TAG_ACELP_SUBFR_LOOP_START, + TAG_ACELP_SUBFR_LOOP_END = TAG_ACELP_SUBFR_LOOP_START + 300, + /* ------------------------------------------------ */ + + IND_MEAN_GAIN2, + IND_Y_GAIN_TMP = IND_MEAN_GAIN2 + 32, + IND_Y_GAIN_HF = IND_Y_GAIN_TMP + 32, + IND_HQ_VOICING_FLAG, + IND_HQ_SWB_CLAS, + IND_NF_IDX, + IND_LC_MODE, + IND_YNRM, + IND_HQ_SWB_EXC_SP_CLAS = IND_YNRM + 44, + IND_HQ_SWB_EXC_CLAS = IND_HQ_SWB_EXC_SP_CLAS, + IND_SWB_FENV_HQ = IND_HQ_SWB_EXC_CLAS, + IND_FB_FENV_HQ = IND_SWB_FENV_HQ + 5, + IND_DELTA_ENV_HQ = IND_FB_FENV_HQ + 5, + IND_HVQ_BWE_NL, + IND_NUM_PEAKS = IND_HVQ_BWE_NL + 2, + IND_POS_IDX, + IND_FLAGN = IND_POS_IDX + 280, + IND_PG_IDX, + IND_HVQ_PEAKS = IND_PG_IDX + 35, + IND_HVQ_NF_GAIN = IND_HVQ_PEAKS + 70, + IND_HQ2_SWB_CLAS = IND_HVQ_NF_GAIN + 2, + IND_HQ2_DENG_MODE, + IND_HQ2_DENG_8SMODE, + IND_HQ2_DENG_8SMODE_N0, + IND_HQ2_DENG_8SMODE_N1, + IND_HQ2_DENG_8SPOS, + IND_HQ2_DENG_8SDEPTH, + IND_HQ2_DENG_HMODE, + IND_HQ2_DIFF_ENERGY, + IND_HQ2_P2A_FLAGS = IND_HQ2_DIFF_ENERGY + 100, + IND_HQ2_LAST_BA_MAX_BAND = IND_HQ2_P2A_FLAGS + 60, + IND_RC_START = IND_HQ2_LAST_BA_MAX_BAND + 2, + IND_RC_END = IND_RC_START + MAX_PVQ_PUSH_IND, + IND_HVQ_PVQ_GAIN = IND_RC_END + 1, + IND_NOISINESS = IND_HVQ_PVQ_GAIN + 8, + IND_ENERGY, + IND_CNG_HO, + IND_SID_BW, + IND_CNG_ENV1, + IND_WB_FENV, + IND_WB_CLASS, + IND_IG1, + IND_IG2A, + IND_IG2B, + IND_NELP_FID, + IND_DELTALAG, + IND_POWER, + IND_AMP0, + IND_AMP1, + IND_GLOBAL_ALIGNMENT, + IND_PVQ_FINE_GAIN, + IND_UV_FLAG, + IND_SHB_SUBGAIN = IND_PVQ_FINE_GAIN + 44, + IND_SHB_FRAMEGAIN, + IND_STEREO_ICBWE_MSFLAG, + IND_SHB_ENER_SF, + IND_SHB_RES_GS, + IND_SHB_VF = IND_SHB_RES_GS + 5, + IND_SHB_LSF, + IND_SHB_MIRROR = IND_SHB_LSF + 5, + IND_SHB_GRID, + IND_SWB_CLASS, + IND_SWB_TENV, + IND_SWB_FENV = IND_SWB_TENV + 4, + IND_SHB_CNG_GAIN = IND_SWB_FENV + 4, + IND_DITHERING, + IND_FB_SLOPE, + + IND_HQ2_SPT_SHORTEN, + IND_HQ2_SUBBAND_TCQ, + IND_HQ2_SUBBAND_GAIN = IND_HQ2_SUBBAND_TCQ + 100, + IND_HQ2_DUMMY = IND_HQ2_SUBBAND_GAIN + 20, + + IND_LAGINDICES, + IND_NOISEG, + IND_AUDIO_GAIN, + IND_AUDIO_DELAY, + + /* ------------- HR SWB BWE loop -------------- */ + TAG_HR_BWE_LOOP_START = IND_AUDIO_DELAY + 4, + IND_HR_IS_TRANSIENT = TAG_HR_BWE_LOOP_START, + IND_HR_GAIN = TAG_HR_BWE_LOOP_START, + IND_HR_ENVELOPE = TAG_HR_BWE_LOOP_START, + IND_HR_HF_GAIN = TAG_HR_BWE_LOOP_START, + IND_I2 = TAG_HR_BWE_LOOP_START, + IND_KV2 = TAG_HR_BWE_LOOP_START, + IND_NQ2 = TAG_HR_BWE_LOOP_START, + TAG_HR_BWE_LOOP_END = TAG_HR_BWE_LOOP_START + 200, + /* ------------------------------------------------ */ + + IND_CORE_SWITCHING_CELP_SUBFRAME, + IND_CORE_SWITCHING_AUDIO_DELAY = IND_CORE_SWITCHING_CELP_SUBFRAME + 20, + IND_CORE_SWITCHING_AUDIO_GAIN, + + IND_STEREO_ICBWE_REF, + IND_STEREO_ICBWE_SP, + IND_STEREO_ICBWE_GS, + IND_STEREO_REFCHAN, + IND_STEREO_CORRSTATS, + IND_STEREO_GD, + IND_STEREO_LRTD_FLAG, + IND_STEREO_LPC_REUSE, + IND_STEREO_TD_ALPHA, + IND_STEREO_2ND_CODER_T, + + IND_UNUSED, +}; + +/*----------------------------------------------------------------------------------* + * Delays + *----------------------------------------------------------------------------------*/ + +#define FRAMES_PER_SEC 50 + +#define FRAME_SIZE_NS 20000000L + +#define ACELP_LOOK_NS 8750000L +#define DELAY_FIR_RESAMPL_NS 937500L +#define DELAY_CLDFB_NS 1250000L + +#define DELAY_SWB_TBE_12k8_NS 1250000L +#define DELAY_SWB_TBE_16k_NS 1125000L +#define MAX_DELAY_TBE_NS 1312500L +#define DELAY_BWE_TOTAL_NS 2312500L +#define DELAY_FD_BWE_ENC_12k8_NS ( DELAY_BWE_TOTAL_NS - ( MAX_DELAY_TBE_NS - DELAY_SWB_TBE_12k8_NS ) ) +#define DELAY_FD_BWE_ENC_16k_NS ( DELAY_BWE_TOTAL_NS - ( MAX_DELAY_TBE_NS - DELAY_SWB_TBE_16k_NS ) ) +#define DELAY_FD_BWE_ENC_NS 2250000L + +#define L_LOOK_12k8 NS2SA( INT_FS_12k8, ACELP_LOOK_NS ) /* look-ahead length at 12.8kHz */ +#define L_LOOK_16k NS2SA( INT_FS_16k, ACELP_LOOK_NS ) /* look-ahead length at 16kHz */ + +/* core switching constants @16kHz */ +#define SWITCH_GAP_LENGTH_NS 6250000L /* length of ACELP->HQ switching gap in ms */ +#define HQ_DELAY_COMP NS2SA( 8000, DELAY_CLDFB_NS ) +#define HQ_DELTA_MAX 6 /* maximum multiplication factor (==48kHz/8kHz) for core switching modules */ + +#define N_ZERO_MDCT_NS 5625000L /* number of zeros in ms for MDCT */ +#define NL_BUFF_OFFSET 12 + +#define N_WS2N_FRAMES 40 /* number of frames for attenuation during the band-width switching */ +#define N_NS2W_FRAMES 20 /* number of frames for attenuation during the band-width switching */ + +/*----------------------------------------------------------------------------------* + * Coder types (only for ACELP core when not running in AMR-WB IO mode) + *----------------------------------------------------------------------------------*/ + +#define INACTIVE 0 /* inactive */ +#define UNVOICED 1 /* unvoiced */ +#define VOICED 2 /* purely voiced */ +#define GENERIC 3 /* generic */ +#define TRANSITION 4 /* transition */ +#define AUDIO 5 /* audio (GSC) */ +#define LR_MDCT 6 /* low-rate MDCT core */ + + +/*--------------------------------------------------* + * Partial copy frame types (only for ACELP core ) + *--------------------------------------------------*/ + +#define ACELP_MODE_MAX 4 +#define RF_MODE_MAX 4 + +/* TCX partial copy frame types */ +#define RF_NO_DATA 0 +#define RF_TCXFD 1 +#define RF_TCXTD1 2 +#define RF_TCXTD2 3 + +/* ACELP partial copy frame types */ +#define RF_ALLPRED ACELP_MODE_MAX +#define RF_NOPRED ACELP_MODE_MAX + 1 +#define RF_GENPRED ACELP_MODE_MAX + 2 +#define RF_NELP ACELP_MODE_MAX + 3 + + +/*--------------------------------------------------------------* + * Frame length constants in mode 2 + *---------------------------------------------------------------*/ + +#define ACELP_TCX_TRANS_NS 1250000 /* Duration of the ACELP->TCX overlap - 1.25 ms */ +#define L_FRAME_MAX L_FRAME48k /* Max 20ms frame size @48kHz */ +#define L_FRAME_PLUS 1200 /* Max frame size (long TCX frame) */ +#define L_MDCT_OVLP_MAX NS2SA( 48000, ACELP_LOOK_NS ) /* = Max mdct overlap */ +#define N_TCX10_MAX 480 /* Max size of TCX10 MDCT spectrum */ +#define BITS_TEC 1 /* number of bits for TEC */ +#define BITS_TFA 1 /* number of bits for TTF */ +#define N_TEC_TFA_SUBFR 16 /* number of subframes of TEC/TFA */ +#define L_TEC_TFA_SUBFR16k ( L_FRAME16k / N_TEC_TFA_SUBFR ) /* TEC/TFA subframe size @ 16kHz*/ +#define MAX_TEC_SMOOTHING_DEG 6 /* max degree of smoothing for TEC */ +#define N_MAX 1200 /* Max size of MDCT spectrum = 25ms @ 48kHz */ +#define N_MAX_TCX 1000 /* Max size of TCX/IGF coded lines */ +#define IGF_START_MN 144 /* MDCT lines not used by IGF*/ +#define IGF_START_MX 800 /* max. MDCT lines used by IGF*/ +#define MAX_IGF_SFB_LEN 160 /* max width of an IGF SFB */ +#define NUM_DCT_LENGTH 24 + +#define NB_DIV 2 /* number of division (subframes) per 20ms frame */ +#define L_MDCT_HALF_OVLP_MAX L_MDCT_OVLP_MAX - 48000 / 200 /* Size of HALF overlap window slope @ 48 kHz */ +#define L_MDCT_MIN_OVLP_MAX 60 /* Size of the MDCT minimal overlap @ 48 kHz - 1.25ms */ +#define L_MDCT_TRANS_OVLP_MAX NS2SA( 48000, ACELP_TCX_TRANS_NS ) /* Size of the ACELP->MDCT transition overlap - 1.25ms */ + +#define L_NEXT_MAX_16k NS2SA( 16000, ACELP_LOOK_NS ) /* 140 */ /* maximum encoder lookahead at 16kHz */ +#define L_NEXT_MAX_32k NS2SA( 32000, ACELP_LOOK_NS ) /* 280 */ /* maximum encoder lookahead at 32kHz */ +#define L_PAST_MAX_32k 360 /* maximum encoder past samples at 32kHz */ + +#define L_MDCT_OVLP_MAX_CORE_FS L_NEXT_MAX_32k /* 280, 2/3 * L_MDCT_OVLP_MAX */ +#define L_MDCT_HALF_OVLP_MAX_CORE_FS 2 * ( L_MDCT_HALF_OVLP_MAX ) / 3 /* 2/3 * L_MDCT_HALF_OVLP_MAX */ +#define L_MDCT_MIN_OVLP_MAX_CORE_FS 2 * ( L_MDCT_MIN_OVLP_MAX ) / 3 /* 2/3 * L_MDCT_MIN_OVLP_MAX */ +#define L_ALDO_WIN1_MAX_CORE_FS 460 /* ALDO1 maximum window length for max core Fs */ +#define L_ALDO_WIN1_FB_MAX 690 /* ALDO1 maximum window length */ + +/*----------------------------------------------------------------------------------* + * ACELP core constants + *----------------------------------------------------------------------------------*/ + +#define SAFETY_NET 0 +#define MOVING_AVERAGE 1 +#define AUTO_REGRESSIVE 2 + +#define INT_FS_12k8 12800 /* internal sampling frequency */ +#define M 16 /* order of the LP filter @ 12.8kHz */ +#define L_FRAME 256 /* frame size at 12.8kHz */ +#define NB_SUBFR 4 /* number of subframes per frame */ +#define L_SUBFR ( L_FRAME / NB_SUBFR ) /* subframe size */ +#define L_INP_MEM ( L_LOOK_16k + ( ( L_LP_16k - ( NS2SA( INT_FS_16k, ACELP_LOOK_NS ) + L_SUBFR16k / 2 ) ) - 3 * L_SUBFR16k / 2 ) ) /*=240 samples length of memory of input signal, given by the Look-Ahead + the past memory (max needed for the LP window at 16 kHz) */ +#define L_INP_12k8 ( L_INP_MEM + L_FRAME ) /* length of input signal buffer @12.8kHz */ +#define L_INP ( L_INP_MEM + L_FRAME32k ) /* length of input signal buffer @32kHz */ + +#define L_EXC_MEM L_FRAME16k /* length of memory of excitation signal @16kHz */ +#define L_EXC_MEM_12k8 ( PIT_MAX + L_INTERPOL ) /* length of memory of excitation signal @12.8kHz */ +#define L_EXC_MEM_DEC ( 3 * L_FRAME16k / 2 ) /*Half-frame needed for PLC in case of TCX->ACELP*/ +#define L_EXC ( L_EXC_MEM + L_FRAME16k + 1 ) /* length of encoder excitation signal buffer @16kHz*/ +#define L_EXC_DEC ( L_EXC_MEM_DEC + L_FRAME16k + 1 + L_SUBFR ) /* length of decoder excitation signal buffer @16kHz*/ +#define L_SYN_MEM NS2SA( 48000, DELAY_CLDFB_NS ) /* synthesis memory length, 1.25ms @ 48kHz */ +#define L_SYN ( L_SYN_MEM + L_FRAME16k ) /* length of synthesis signal buffer @16kHz */ +#define L_WSP_MEM ( PIT_MAX + L_INTERPOL ) /* length of memory for weighted input signal @12.8kHz*/ +#define L_WSP ( L_WSP_MEM + L_FRAME + L_LOOK_12k8 ) /* length of weighted input signal buffer @12.8kHz*/ + +#define OLD_SYNTH_SIZE_DEC ( 2 * L_FRAME_MAX ) /* decoder past synthesis; needed for LTP, PLC and rate switching*/ +#define OLD_SYNTH_INTERNAL_DEC ( 2 * L_FRAME32k ) /* decoder past synthesis @ internal sampling rate; needed for LTP, PLC and rate switching*/ +#define OLD_SYNTH_SIZE_ENC L_FRAME32k + L_FRAME32k / 4 /* encoder synth memory */ +#define OLD_EXC_SIZE_DEC ( 3 * L_FRAME_MAX / 2 + 2 * L_FIR_FER2 ) /*old excitation needed for decoder for PLC*/ + +#define TILT_CODE 0.3f /* ACELP code preemphasis factor */ + +#define L_SUBFR16k ( L_FRAME16k / NB_SUBFR ) /* subframe size at 16kHz */ +#define L_HALFR16k ( 2 * L_SUBFR16k ) /* half-frame size at 16kHz */ + +#define L_INTERPOL2 16 /* Length of filter for interpolation */ +#define L_INTERPOL ( L_INTERPOL2 + 1 ) /* Length of filter for interpolation */ +#define TILT_FAC 0.68f /* tilt factor (denominator) */ +#define M16k 20 /* order of the LP filter @ 16kHz */ +#define PIT_SHARP 0.85f /* pitch sharpening factor */ +#define PIT_UP_SAMP 4 /* upsampling factor for 1/4 interpolation filter */ +#define PIT_L_INTERPOL2 16 +#define PIT_FIR_SIZE2 ( PIT_UP_SAMP * PIT_L_INTERPOL2 + 1 ) +#define PIT_UP_SAMP6 6 +#define PIT_L_INTERPOL6_2 17 +#define PIT_FIR_SIZE6_2 ( PIT_UP_SAMP6 * PIT_L_INTERPOL6_2 + 1 ) +#define E_MIN 0.0035f /* minimum allowable energy */ +#define STEP_DELTA 0.0625f /* quantization step for tilt compensation of gaussian cb. excitation */ +#define GAMMA_EV 0.92f /* weighting factor for core synthesis error weighting */ +#define FORMANT_SHARPENING_NOISE_THRESHOLD 21.0f /* lp_noise level above which formant sharpening is deactivated */ +#define LP_NOISE_THRESH 20.f + +#define L_FILT_UP8k 24 /* Resampling - delay of filter for 8 kHz output signals (at 12.8 kHz sampling rate) */ +#define LEN_WIN_SSS 120 +#define L_FILT 12 /* Resampling - delay of the resampling low-pass filter @12.8kHz */ +#define L_FILT16k 15 /* Resampling - delay of filter for 16 kHz input signals (at 16kHz sampling rate) */ +#define L_FILT32k 30 /* Resampling - delay of filter for 32 kHz input signals (at 32kHz sampling rate) */ +#define L_FILT48k 45 /* Resampling - delay of filter for 48 kHz input signals (at 48kHz sampling rate) */ +#define L_FILT_UP16k 12 /* Resampling - delay of filter for 16 kHz output signals (at 12.8 kHz sampling rate) */ +#define L_FILT_UP32k 12 /* Resampling - delay of filter for 32 kHz output signals (at 12.8 kHz sampling rate) */ +#define L_FILT_UP48k 12 /* Resampling - delay of filter for 48 kHz output signals (at 12.8 kHz sampling rate) */ +#define L_FILT_MAX L_FILT48k /* Resampling - maximum length of all filters - for memories */ +#define RS_INV_FAC 0x8000 /* Resampling - flag needed in rom_com and modif_fs to allow pre-scaled and non pre-scaled filters */ + +#define L_HP20_MEM 4 /* HP20 filter memory length */ + +#define CLDFB_NO_CHANNELS_MAX 60 /* CLDFB resampling - max number of CLDFB channels, == IVAS_CLDFB_NO_CHANNELS_MAX */ +#define CLDFB_NO_COL_MAX 16 /* CLDFB resampling - max number of CLDFB col., == IVAS_CLDFB_NO_COL_MAX */ +#define CLDFB_NO_COL_MAX_SWITCH 6 /* CLDFB resampling - max number of CLDFB col. for switching */ +#define CLDFB_NO_COL_MAX_SWITCH_BFI 10 /* CLDFB resampling - max number of CLDFB col. for switching, BFI */ +#define CLDFB_OVRLP_MIN_SLOTS 3 /* CLDFB resampling - minimize processing to minimum required for transition frame ACELP->TCX/HQ */ +#define INV_CLDFB_BANDWIDTH ( 1.f / 800.f ) + +#define L_FILT_2OVER3 12 +#define L_FILT_2OVER3_LP 3 + +typedef enum +{ + CLDFB_ANALYSIS, + CLDFB_SYNTHESIS +} CLDFB_TYPE; + +typedef enum +{ + CLDFB_PROTOTYPE_1_25MS, + CLDFB_PROTOTYPE_5_00MS +} CLDFB_PROTOTYPE; + +/* pre-calculated scale values for the cldfb filter prototypes + values are calculated like this: sqrt( 6400 / no_cldfb_channels * sum(filter[k]**2)) */ +#define CLDFB80_10_SCALE 88.293854f +#define CLDFB80_16_SCALE 88.299622f +#define CLDFB80_20_SCALE 88.300926f +#define CLDFB80_30_SCALE 88.234489f +#define CLDFB80_32_SCALE 88.303848f +#define CLDFB80_40_SCALE 88.304726f +#define CLDFB80_60_SCALE 88.028412f + +#define LDQMF_10_SCALE 84.567841f +#define LDQMF_16_SCALE 84.567932f +#define LDQMF_20_SCALE 84.567963f +#define LDQMF_30_SCALE 84.501907f +#define LDQMF_32_SCALE 84.568001f +#define LDQMF_40_SCALE 84.567986f +#define LDQMF_60_SCALE 84.303284f + +#define L_FFT 256 /* Spectral analysis - length of the FFT */ +#define LOG2_L_FFT 8 /* Spectral analysis - log2 of L_FFT */ + +#define BIN ( INT_FS_12k8 / L_FFT ) /* Spectral analysis - Width of one frequency bin in Hz */ +#define NB_BANDS 20 /* Spectral analysis - number of frequency bands */ +#define VOIC_BINS 74 /* Spectral analysis - max number of frequency bins considered as voiced (related to VOIC_BAND and L_FFT) */ +#define VOIC_BAND 17 /* Spectral analysis - number of critical bands considered as voiced (related to VOIC_BINS) */ +#define VOIC_BINS_8k 115 /* Spectral analysis - max number of frequency bins considered as voiced in NB (related to VOIC_BAND_8k and L_FFT) */ +#define VOIC_BAND_8k 17 /* Spectral analysis - number of critical bands considered as voiced in NB (related to VOIC_BINS_8k) */ + +#define M_ALPHA 0.9f /* Multi-harm analysis - forgetting factor of LT correlation map */ +#define M_GAMMA 0.99f /* Multi-harm analysis - forgetting factor of active speech decision predictor */ +#define THR_CORR 56 /* Multi-harm analysis - starting threshold of multi-harm. correlation */ + +#define L_LP 320 /* LP analysis - LP window size */ +#define L_LP_16k 400 /* LP analysis @16kHz - LP window size for 16kHz */ +#define L_LP_AMR_WB 384 /* LP analysis - windows size (only for AMR-WB IO mode) */ +#define GRID50_POINTS 51 /* LP analysis - half-number of points to evaluate Chebyshev polynomials used in the LP coefs. conversion */ +#define GRID40_POINTS 41 /* LP analysis - half-number of points to evaluate Chebyshev polynomials used in the LP coefs. conversion */ +#define GRID100_POINTS 100 /* LP analysis - number of points to evaluate Chebyshev polynomials */ + +#define PIT_MIN 34 /* OL pitch analysis - Minimum pitch lag */ +#define PIT_MAX 231 /* OL pitch analysis - Maximum pitch lag */ +#define PIT_MIN_EXTEND 20 /* OL pitch analysis - Minimum pitch lag of extended range */ +#define PIT_MIN_DOUBLEEXTEND 17 /* OL pitch analysis - Minimum pitch lag of double-extended range */ +#define OPL_DECIM 2 /* OL pitch analysis - decimation factor */ +#define L_INTERPOL1 4 /* OL pitch analysis - interval to compute normalized correlation */ +#define FIR_SIZE1 ( PIT_UP_SAMP * L_INTERPOL1 + 1 ) /* OL pitch analysis - total length of the 1/4 interpolation filter */ + +#define PIT_MIN_SHORTER 29 /* OL pitch analysis - minimum for wider pitch */ + +#define PIT_MIN_12k8 29 /* Minimum pitch lag with resolution 1/4 */ +#define PIT_FR2_12k8 121 /* Minimum pitch lag with resolution 1/2 */ +#define PIT_FR1_12k8 154 /* Minimum pitch lag with resolution 1 */ +#define PIT_MAX_12k8 231 /* Maximum pitch lag */ +#define PIT_FR1_8b_12k8 82 /* Minimum pitch lag with resolution 1 for low bitrate pitch delay codings*/ +#define PIT_MIN_16k 36 +#define PIT_FR2_16k 36 +#define PIT_FR1_16k 165 +#define PIT_FR1_8b_16k 165 +#define PIT_MIN_25k6 58 +#define PIT_FR2_25k6 58 +#define PIT_FR1_25k6 164 +#define PIT_MAX_25k6 463 +#define PIT_FR1_8b_25k6 164 +#define PIT_MIN_32k 72 +#define PIT_FR2_32k 72 +#define PIT_FR1_32k 75 +#define PIT_MAX_32k 577 +#define PIT_FR1_8b_32k 75 +#define PIT_MAX_MAX PIT_MAX_32k + +#define PIT_FR1_8b 92 /* Pitch encoding - Minimum pitch lag with resolution 1 */ +#define PIT_FR2_9b 128 /* Pitch encoding - Minimum pitch lag with resolution 1/2 */ +#define PIT_FR1_9b 160 /* Pitch encoding - Minimum pitch lag with resolution 1 */ +#define PIT_FR1_EXTEND_8b 64 /* Pitch encoding - Minimum pitch lag with resolution 1 of extended range */ +#define PIT_FR2_EXTEND_9b 116 /* Pitch encoding - Minimum pitch lag with resolution 1/2 of extended range */ +#define PIT_FR1_EXTEND_9b 128 /* Pitch encoding - Minimum pitch lag with resolution 1 of extended range */ +#define PIT_FR1_DOUBLEEXTEND_8b 58 /* Pitch encoding - Minimum pitch lag with resolution 1 of double-extended range */ +#define PIT_FR2_DOUBLEEXTEND_9b 112 /* Pitch encoding - Minimum pitch lag with resolution 1/2 of double-extended range */ +#define PIT_FR1_DOUBLEEXTEND_9b 124 /* Pitch encoding - Minimum pitch lag with resolution 1 of double-extended range */ + +#define LOW_PASS 0 /* LP filtering - flag for low-pass filtering of the excitation */ +#define FULL_BAND 1 /* LP filtering - flag for no low-pass filtering of the excitation */ +#define NORMAL_OPERATION 2 /* LP filtering - flag for selecting the best of the two above */ + +#define NB_TRACK_FCB_2T 2 /* Algebraic codebook - number of tracks in algebraic fixed codebook search with 2 tracks */ +#define NB_POS_FCB_2T 32 /* Algebraic codebook - number of positions in algebraic fixed codebook search with 2 tracks */ +#define NB_TRACK_FCB_4T 4 /* Algebraic codebook - number of tracks in algebraic fixed codebook search with 4 tracks */ +#define NB_POS_FCB_4T 16 /* Algebraic codebook - number of positions in algebraic fixed codebook search with 4 tracks */ +#define NB_POS_FCB_2T_128 64 /* Algebraic codebook - number of positions in algebraic fixed codebook search with 2 tracks and L_subfr = 128 */ +#define NB_POS_FCB_4T_128 32 /* Algebraic codebook - number of positions in algebraic fixed codebook search with 4 tracks and L_subfr = 128 */ +#define NB_PULSE_MAX 36 +#define MAX_IDX_LEN 9 +#define NPMAXPT ( ( NB_PULSE_MAX + NB_TRACK_FCB_4T - 1 ) / NB_TRACK_FCB_4T ) /* used in search as well */ + +#define GAIN_PRED_ORDER 4 /* Gain quantization - prediction order for gain quantizer (only for AMR-WB IO mode) */ +#define MEAN_ENER 30 /* Gain quantization - average innovation energy */ + +#define DTX_HIST_SIZE 8 /* CNG & DTX - number of last signal frames used for CNG averaging */ +#define CNG_ISF_FACT 0.9f /* CNG & DTX - CNG spectral envelope smoothing factor */ +#define STEP_AMR_WB_SID 2.625f /* CNG & DTX - CNG energy quantization step */ +#define HO_HIST_SIZE 8 /* CNG & DTX - maximal number of hangover frames used for averaging */ +#define NUM_ENV_CNG 20 +#define BUF_L_NRG 0.7f /* CNG & DTX - lower threshold factor for hangover updates */ +#define BUF_H_NRG 1.03f /* CNG & DTX - higher threshold factor for hangover updates */ +#define CNG_TYPE_HO 20 /* CNG & DTX - hangover for switching between CNG types */ + +#define BUF_DEC_RATE 25 /* CNG & DTX - buffer size decrease rate for active frames */ +#define STEP_SID 5.25f /* CNG & DTX - CNG energy quantization step */ + +#define MIN_ACT_CNG_UPD 20 /* DTX - Minimum number of consecutive active frames for CNG mode update */ +#define FIXED_SID_RATE 8 /* DTX SID rate */ + +#define TOTALNOISE_HIST_SIZE 4 + +#define UNKNOWN_NOISE 0 /* unknown noisy type */ +#define SILENCE 1 /* speech with high SNR */ +#define CLDFBVAD_NB_ID 1 +#define CLDFBVAD_WB_ID 2 +#define CLDFBVAD_SWB_ID 3 +#define CLDFBVAD_FB_ID 4 +#define SP_CENTER_NUM 4 /* number of spectral centroid */ +#define TONA_NUM 3 /* number of tonal */ +#define PRE_SNR_NUM 32 /* number of snr to calculate average SNR of all sub-bands */ +#define POWER_NUM 56 /* number of energy of several frames*/ +#define PRE_SPEC_DIF_NUM 56 /* number of energy of several frames*/ + +#define MAX_SUBBAND_NUM 12 /* max number of sub-band divided non-uniformly*/ +#define BG_ENG_NUM MAX_SUBBAND_NUM /* number of energy of sub-band divided non-uniformly*/ +#define MIN_AMP_ID 5 +#define MAX_AMP_ID 64 +#define SPEC_AMP_NUM ( MAX_AMP_ID - MIN_AMP_ID + 1 ) +#define STABLE_NUM 4 /* number of time-domain stable rate*/ +#define SFM_NUM 3 /* number of spectral flatness */ + +#define START_NG 5 /* Stationary noise UV modification */ +#define FULL_NG 10 /* Stationary noise UV modification */ +#define ISP_SMOOTHING_QUANT_A1 0.9f /* Stationary noise UV modification */ + +#define FEC_BITS_CLS 2 /* FEC - number of bits for clas information */ +#define FEC_BITS_ENR 5 /* FEC - number of bits for energy information */ +#define FEC_ENR_STEP ( 96.0f / ( 1 << FEC_BITS_ENR ) ) +#define FEC_ENR_QLIMIT ( ( 1 << FEC_BITS_ENR ) - 1 ) +#define FEC_BITS_POS 8 /* FEC - number of bits for glottal pulse position */ +#define L_SYN_MEM_CLAS_ESTIM ( 2 * PIT16k_MAX - L_FRAME16k ) /* FEC - memory of the synthesis signal for frame class estimation */ +#define L_SYN_CLAS_ESTIM ( L_SYN_MEM_CLAS_ESTIM + L_FRAME16k ) /* FEC - length of the synthesis signal buffer for frame class estimation */ + +#define FRAME_COUNT_HF_SYNTH 100 /* Threshold of frame counter in HF synthesis */ + +#define AUDIO_COUNTER_INI 200 /* Counter initialization */ +#define AUDIO_COUNTER_STEP 10 /* Counter increase on each audio frame */ +#define AUDIO_COUNTER_MAX 1000 /* Counter saturation */ + +#define BWD_TOTAL_WIDTH 320 /* BWD width */ +#define BWD_COUNT_MAX 100 /* maximum value of BWD counter */ +#define BWD_N_BINS_MAX 13 /* maximum number of BWD bins */ +#define BWS_TRAN_PERIOD 5 /* BWS - number of frames for transition period */ + +#define PREEMPH_FAC 0.68f /* preemphasis factor at 12.8kHz */ +#define PREEMPH_FAC_16k 0.72f +#define PREEMPH_FAC_SWB 0.9f /* preemphasis factor for super wide band */ +#define GAMMA1 0.92f /* weighting factor (numerator) default:0.92 */ +#define GAMMA16k 0.94f + +#define FORMANT_SHARPENING_G1 0.75f /* Formant sharpening numerator weighting at 12.8kHz */ +#define FORMANT_SHARPENING_G2 0.9f /* Formant sharpening denominator weighting at 12.8kHz */ +#define FORMANT_SHARPENING_G1_16k 0.8f /* Formant sharpening numerator weighting at 16kHz */ +#define FORMANT_SHARPENING_G2_16k 0.92f /* Formant sharpening denominator weighting at 16kHz */ + +#define FSCALE_DENOM 512 +#define ACELP_FIXED_CDK_NB 41 +#define ACELP_FIXED_CDK_BITS( n ) PulseConfTable[n].bits + +#define L_FIR 31 + +enum TRACKPOS +{ + TRACKPOS_FIXED_FIRST = 0, /* Fill tracks from left */ + TRACKPOS_FIXED_EVEN = 1, /* Even tracks */ + TRACKPOS_FIXED_FIRST_TWO = 2, /* One track of 32 */ + TRACKPOS_FIXED_TWO = 3, /* Two tracks of 32 instead of four of 16 */ + TRACKPOS_FREE_ONE = 4, /* One freely moving track with extra pulse */ + TRACKPOS_FREE_THREE = 6, /* Three freely moving tracks with single extra pulses */ + TRACKPOS_GRADIENT = 7 +}; + +enum +{ + LAGW_WEAK, /* weak lag window */ + LAGW_MEDIUM, /* medium strength lag window */ + LAGW_STRONG, /* strong lag window */ + + NUM_LAGW_STRENGTHS +}; + +#define NBITS_NOISENESS 5 /* number of bits for coding noiseness in UV frames */ + +/*----------------------------------------------------------------------------------* + * ACELP@16kHz core constants + *----------------------------------------------------------------------------------*/ + +#define NB_SUBFR16k 5 /* number of subframes per frame @16kHz */ +#define INT_FS_16k 16000 /* CELP core internal sampling frequency @16kHz */ + +#define PIT16k_MIN 42 /* Minimum pitch lag @16kHz */ +#define PIT16k_MAX 289 /* Maximum pitch lag @16kHz */ +#define PIT16k_FR2_TC0_2SUBFR 83 /* Minimum pitch lag with resolution 1/2 @16kHz for TC02, 2nd subframe */ +#define PIT16k_MIN_EXTEND 21 /* Minimum pitch lag of extended range @16kHz */ +#define PIT16k_FR2_EXTEND_9b 88 /* Minimum 9 bit pitch lag with resolution 1/2 of extended range @16kHz */ +#define PIT16k_FR1_EXTEND_9b 130 /* Minimum 9 bit pitch lag with resolution 1 of extended range @16kHz */ +#define PIT16k_FR2_EXTEND_10b 264 /* Minimum 10 bit pitch lag with resolution 1/2 of extended range @16kHz */ + +#define WIDTH_BAND 8 /* sub-band width in AVQ coding */ +#define G_AVQ_MIN 0.80f /* lower limit for gain Q in higher-rate ACELP contribution */ +#define G_AVQ_MAX 96.0f /* upper limit for gain Q in higher-rate ACELP contribution */ +#define FAC_PRE_AVQ 0.3f /* preemhasis factor in ACELP pre-quantizer */ + +#define G_AVQ_MIN_INACT 0.70f /* lower limit for gain Q in higher-rate ACELP contribution, inactive segments */ +#define G_AVQ_MAX_INACT 4.1f /* upper limit for gain Q in higher-rate ACELP contribution, inactive segments */ +#define G_AVQ_MIN_INACT_48k 0.35f /* lower limit for gain Q in higher-rate ACELP contribution, inactive segments, 48 kbps */ +#define G_AVQ_MAX_INACT_48k 2.8f /* upper limit for gain Q in higher-rate ACELP contribution, inactive segments, 48 kbps */ +#define G_AVQ_MIN_INACT_64k 0.25f /* lower limit for gain Q in higher-rate ACELP contribution, inactive segments, 64 kbps */ +#define G_AVQ_MAX_INACT_64k 1.5f /* upper limit for gain Q in higher-rate ACELP contribution, inactive segments, 64 kbps */ +#define G_AVQ_DELTA_INACT_48k ( G_AVQ_MAX_INACT_48k - G_AVQ_MIN_INACT_48k ) / ( ( 1 << G_AVQ_BITS ) - 1 ) +#define G_AVQ_DELTA_INACT_64k ( G_AVQ_MAX_INACT_64k - G_AVQ_MIN_INACT_64k ) / ( ( 1 << G_AVQ_BITS ) - 1 ) +#define G_AVQ_BITS 6 /* number of bits to quantize the AVQ gain in higher-rate ACELP contribtuion */ +#define G_AVQ_DELTA ( G_AVQ_MAX - G_AVQ_MIN ) / ( ( 1 << G_AVQ_BITS ) - 1 ) +#define G_AVQ_DELTA_INACT ( G_AVQ_MAX_INACT - G_AVQ_MIN_INACT ) / ( ( 1 << G_AVQ_BITS ) - 1 ) + +#define G_PITCH_MIN 0.00f /* SQ of gains: pitch gain lower limit */ +#define G_PITCH_MAX 1.22f /* SQ of gains: pitch gain upper limit */ +#define G_CODE_MIN 0.02f /* SQ of gains: code gain lower limit */ +#define G_CODE_MAX 5.00f /* SQ of gains: code gain upper limit */ + +#define G_PITCH_MIN_TC192 0.1f +#define G_PITCH_MAX_TC192 0.95f +#define G_CODE_MIN_TC192 0.6f +#define G_CODE_MAX_TC192 41.0f + +#define BIT_SAVING_LOW_THR 10 +#define BIT_SAVING_HIGH_THR 80 + +/*--------------------------------------------------------------* + * TCX constants + *---------------------------------------------------------------*/ + +#define NBITS_TCX_GAIN 7 + +#define NOISE_FILL_RANGES 1 +#define NBITS_NOISE_FILL_LEVEL 3 /* Number of bits used for coding noise filling level for each range */ +#define NF_GAIN_BITS ( NBITS_TCX_GAIN + NOISE_FILL_RANGES * NBITS_NOISE_FILL_LEVEL ) +#define MIN_NOISE_FILLING_HOLE 8 +#define HOLE_SIZE_FROM_LTP( gain ) ( 4 + ( int16_t )( 2.0f * gain * ( 4.0f / 0.625f ) ) ) +#define FDNS_NPTS 64 +#define AVG_TCX20_LSF_BITS 40 +#define AVG_TCX10_LSF_BITS 59 +#define LTPSIZE 3 +#define TCXLTP_DELAY_NS 250000 +#define TCXLTP_MAX_DELAY NS2SA( 48000, TCXLTP_DELAY_NS ) +#define TCXLTP_LTP_ORDER 24 +#define TCX_RES_Q_BITS_GAIN 3 + +/* Use arithmetic coder with LPC shaping also at high (i.e. TCX-only) bitrates */ +#define LPC_SHAPED_ARI_MAX_RATE_CPE ACELP_13k20 +#define LPC_SHAPED_ARI_MAX_RATE ACELP_9k60 +#define N_MAX_ARI 800 + +#define N_LTP_GAIN_MEMS 4 + +#define N_TCX_STARTLINE_NOISE_WB 11 +#define N_TCX_STARTLINE_NOISE_SWB 9 + +/*----------------------------------------------------------------------------------* + * TNS constants + *----------------------------------------------------------------------------------*/ + +#define R1_48 690 +#define R2_48 420 +#define R1_16 230 +#define R2_16 140 +#define R1_25 368 +#define R2_25 224 +#define TNS_MAX_NUM_OF_FILTERS 2 /* TNS maximum number of filters */ +#define TNS_MAX_FILTER_ORDER 8 /* TNS maximum filter order */ +#define ITF_MAX_FILTER_ORDER 16 /* ITF maximum filter order */ +#define TNS_FILTER_OFF 0 +#define TNS_FILTER_ON_ZERO 1 +#define TNS_FILTER_ON 2 +#define NPRM_TNS ( 3 + TNS_MAX_NUM_OF_FILTERS * ( 3 + TNS_MAX_FILTER_ORDER ) ) /* TNS total number of quantized parameters */ +#define NPRM_RESQ 100 /* Maximum number of parameter for residual Q in TCX */ +#define NPRM_CTX_HM 3 /* Number of Parameters for Context HM : flag+index*/ +#define NPRM_DIV ( 2 + NPRM_TNS + N_MAX / 2 + NPRM_RESQ + NPRM_CTX_HM ) /* Total number of quantized parameter in 1 division */ +#define DEC_NPRM_DIV NPRM_DIV /* Total number of quantized parameter in 1 division (decoder side) */ +#define NPRM_LPC_NEW 2 * ( 4 + 2 * NB_SPHERE ) /* LPC total number of quantized parameters */ + +#define BITBUFSIZE ( IVAS_BRATE_MAX / FRAMES_PER_SEC ) +#define IGF_BITBUFSIZE ( HQ_128k / FRAMES_PER_SEC ) + +#define TNS_COEF_RES 4 /* Bit resolution of the coefficients. */ +#define INDEX_SHIFT ( 1 << ( TNS_COEF_RES - 1 ) ) /* For shifting the index so that index 0 points to 0. */ + +/*----------------------------------------------------------------------------------* + * LSF quantization constants + *----------------------------------------------------------------------------------*/ + +#define GENERIC_MA_LIMIT ACELP_9k60 /* crossover limit, for Generic WB mode, < use SN/AR, >= use MA-predictor */ + +#define NC16k ( M16k / 2 ) +#define NO_ITER 4 /* number of iterations for tracking the root */ +#define SPC 0.0234952f +#define SPC_plus SPC * 1.001f +#define ALPHA_SQ ( ( 0.5f / PI2 ) * ( 0.5f / PI2 ) ) + +#define NC M / 2 +#define LSF_GAP 50.0f +#define LSF_BITS_CNG 29 + +#define MU_MA ( 1.0f / 3.0f ) /* original prediction factor (only for AMR-WB IO mode) */ +#define ISF_GAP 50 /* Minimum ISF separation for end-frame ISFs (only in AMR-WB IO mode) */ +#define LSF_GAP_MID 80.0f /* Minimum LSF separation for mid-frame LSFs */ +#define MODE1_LSF_GAP 70.0f /* Minimum LSF separation for end-frame ISFs */ +#define PREFERSFNET 1.05 +#define SFNETLOWLIMIT_WB 35000 /* new sampling rate dependent thresholds used in LSF codebook decision logic, WB case */ +#define SFNETLOWLIMIT_NB 38000 /* new sampling rate dependent thresholds used in LSF codebook decision logic, NB case */ +#define LSFMBEST 2 /* number of survivors from one stage to another */ +#define STREAKLEN 3 /* Allow this many predictive frames, before starting limiting */ +#define STREAKMULT 0.8f /* Exponential limiting multiplier */ + +#define LSFMBEST_MAX 16 + +#define TCXLPC_NUMSTAGES 3 +#define TCXLPC_NUMBITS 13 +#define TCXLPC_IND_NUMSTAGES 1 +#define TCXLPC_IND_NUMBITS 2 +#define TCXLPC_LSF_GAP 80.0f + +#define MAX_VQ_STAGES 4 +#define MAX_VQ_STAGES_USED 9 /* this is the maximum number of stages currently used and changing this will affect the memory allocated \ + MAX_VQ_STAGES is also used as offset for addressing some arrays, so this should NOT be changed*/ +#define MIDLSF_NBITS 5 +#define ENDLSF_NBITS 31 + +#define LEN_INDICE 15 +#define LATTICE_DIM 8 +#define NO_LEADERS 49 +#define MAX_NO_BR_LVQ 28 +#define MAX_NO_SCALES 3 +#define MAX_NO_VALS 4 +#define WB_LIMIT_LSF 6350 +#define CNG_LVQ_MODES 16 +#define MAX_NO_MODES 169 +#define START_CNG MAX_NO_MODES - CNG_LVQ_MODES +#define MAX_NO_MODES_p 237 +#define NO_CODING_MODES 6 +#define LVQ_COD_MODES 18 + +#define LIMIT_LEADER 19 +#define DELTA_LEADER 256 + +/* BC-TCVQ */ +#define N_STAGE_VQ 8 +#define N_DIM 2 +#define NUM_SUBSET 8 +#define OP_LOOP_THR_HVO 3784536.3f /* 80% : Open-loop Threshold */ +#define NUM_STATE 16 /* BC-TCQ - Number of state of the Trellis */ +#define N_STAGE 16 /* BC-TCQ - Smaple number in a frame */ + +#define SIZE_BK1 256 +#define SIZE_BK2 256 +#define SIZE_BK21 64 +#define SIZE_BK22 128 +#define SIZE_BK23 128 +#define SIZE_BK24 32 +#define SIZE_BK25 32 +#define SIZE_BK21_36b 128 +#define SIZE_BK22_36b 128 +#define SIZE_BK23_36b 64 + +/* Gain quantizer constants */ +#define NB_QUA_GAIN5B 32 /* Number of quantization level */ +#define NB_QUA_GAIN6B 64 /* Number of quantization level */ +#define NB_QUA_GAIN7B 128 /* Number of quantization level */ + +/*----------------------------------------------------------------------------------* + * TCX transient detection + *----------------------------------------------------------------------------------*/ + +#define NSUBBLOCKS 8 /* Number of subblocks per frame, one transient per a sub-block can be found */ +#define MAX_TD_DELAY 2 * NSUBBLOCKS /* Maximum allowed delay (in number of subblocks) of the transient detection, affects required memory */ +#define NSUBBLOCKS_SHIFT 3 /* Number of subblocks which are shifter betwen TD dectector and TCX-LTP */ + +#define NO_TCX 0 +#define TCX_20 1 +#define TCX_10 2 +#define TCX_5 3 + +#define TRANSITION_OVERLAP ( -2 ) +#define RECTANGULAR_OVERLAP ( -1 ) +#define FULL_OVERLAP 0 +#define NOT_SUPPORTED 1 +#define MIN_OVERLAP 2 +#define HALF_OVERLAP 3 +#define ALDO_WINDOW 4 + +#define SWITCH_OVERLAP_8k 15 /* == NS2SA(8000, SWITCH_GAP_LENGTH_NS) - NS2SA(8000, 10000000.0f - N_ZERO_MDCT_NS) */ +#define SWITCH_GAP_LENGTH_8k 50 + +/*----------------------------------------------------------------------------------* + * TCX transform kernel switching + *----------------------------------------------------------------------------------*/ + +#define MDCT_IV 0 +#define MDST_II 1 +#define MDCT_II 2 +#define MDST_IV 3 + +/*----------------------------------------------------------------------------------* + * FEC constants + *----------------------------------------------------------------------------------*/ + +#define UNVOICED_CLAS 0 /* Unvoiced, silence, noise, voiced offset */ +#define UNVOICED_TRANSITION 1 /* Transition from unvoiced to voiced components - possible onset, but too small */ +#define VOICED_TRANSITION 2 /* Transition from voiced - still voiced, but with very weak voiced characteristics */ +#define VOICED_CLAS 3 /* Voiced frame, previous frame was also voiced or ONSET */ +#define ONSET 4 /* Voiced onset sufficiently well built to follow with a voiced concealments */ +#define SIN_ONSET 5 /* Artificial harmonic+noise onset (used only in decoder) */ +#define INACTIVE_CLAS 6 /* Inactive frame (used only in decoder) */ +#define AUDIO_CLAS 7 /* Audio frame (used only in AMR-WB IO mode) */ + +#define BETA_FEC 0.75f /* FEC - weighting factor for LSF estimation in FER */ +#define STAB_FAC_LIMIT 0.25f /* FEC - limit at which safety net is forced for next frame */ + +#define MODE1_L_FIR_FER 5 /* FEC - impulse response length for low- and high-pass filters in FEC */ +#define L_FIR_FER 3 /* impulse response length for low- & high-pass filters in FER concealment */ +#define L_FIR_FER2 11 /* new filter tuning: 11*/ +#define MAX_UPD_CNT 5 /* FEC - maximum number of frames since last pitch update */ +#define ALPHA_S 0.6f /* FEC - damping factor for SIN_ONSET frames */ +#define ALPHA_V 1.0f /* FEC - damping factor for VOICED_CLAS frames */ +#define ALPHA_VT 0.4f /* FEC - damping factor for VOICED_TRANSITION frames */ +#define ALPHA_UT 0.8f /* FEC - damping factor for UNVOICED_TRANSITION frames */ +#define ALPHA_U 0.4f /* FEC - damping factor for UNVOICED_CLAS frames */ +#define ALPHA_UU 1.0f /* FEC - damping factor for UNVOICED_CLAS frames */ + +#define AGC 0.98f + +#define PLC_MIN_CNG_LEV 0.01f /* minimum background level */ +#define PLC_MIN_STAT_BUFF_SIZE 50 /* buffer size for minimum statistics */ +#define PLC_MIN_CNG_LEV 0.01f +#define G_LPC_RECOVERY_BITS 1 + +/*----------------------------------------------------------------------------------* + * Transition mode (TC) constants + *----------------------------------------------------------------------------------*/ + +/* Conversion of tc_subfr to index */ +#define TC_SUBFR2IDX( x ) ( x == 0 ? 0 : x == 1 ? 0 : x == 2 ? 1 : x == 3 ? 2 : x == 4 ? 3 : x == 64 ? 4 : x == 128 ? 5 : x == 192 ? 6 : x == 256 ? 7 : 0 ) + +#define TC_SUBFR2IDX_16KHZ( x ) ( x == 0 ? 0 : x == 64 ? 1 : x == 128 ? 2 : x == 192 ? 3 : x == 256 ? 4 : 0 ) + +#define L_IMPULSE 17 /* TC - length of one prototype impulse */ +#define L_IMPULSE2 8 /* TC - half-length of one prototype impulse == floor(L_IMPULSE/2) */ +#define NUM_IMPULSE 8 /* TC - number of prototype impulses */ +#define N_GAIN_CODE_TC 8 /* TC - number of levels for gain_code quantization for subrames without glot. impulse(s) - */ +#define N_GAIN_TC 8 /* TC - number of levels for gain_trans quantization */ + +/* TC - attention: DO NOT CHANGE the following constants - needed for correct bit-allocations */ +#define TC_0_0 1 /* TC - subframe ID for TC: first glottal impulse in the 1st subframe, second in the 1st subframe */ +#define TC_0_64 2 /* TC - subframe ID for TC: first glottal impulse in the 1st subframe, second in the 2nd subframe */ +#define TC_0_128 3 /* TC - subframe ID for TC: first glottal impulse in the 1st subframe, second in the 3rd subframe */ +#define TC_0_192 4 /* TC - subframe ID for TC: first glottal impulse in the 1st subframe, second in the 4th subframe */ + +/*----------------------------------------------------------------------------------* + * AVQ constants + *----------------------------------------------------------------------------------*/ + +/* RE8 constants */ +#define NB_LDQ3 9 +#define NB_SPHERE 32 +#define NB_LEADER 36 +#define NB_LDQ4 27 +#define FAC_LOG2 3.321928095f + +#define NSV_MAX 34 /* maximal number of sub-vectors used by the AVQ */ + +/*----------------------------------------------------------------------------------* + * Arithmetic coder + *----------------------------------------------------------------------------------*/ + +#define A_THRES_SHIFT 2 +#define A_THRES ( 1 << A_THRES_SHIFT ) +#define VAL_ESC 16 +#define NBITS_CONTEXT 8 +#define NBITS_RATEQ 2 + +#define cbitsnew 16 +#define stat_bitsnew 14 + +#define ari_q4new ( ( (int32_t) 1 << cbitsnew ) - 1 ) +#define ari_q1new ( ari_q4new / 4 + 1 ) +#define ari_q2new ( 2 * ari_q1new ) +#define ari_q3new ( 3 * ari_q1new ) + +#define kLtpHmFractionalResolution 7 +#define kLtpHmFlag ( 1 << 8 ) + +#define MAX_LENGTH L_FRAME_MAX + +/*----------------------------------------------------------------------------------* + * TCQ constants + *----------------------------------------------------------------------------------*/ + +#define MAX_PULSES 560 + +#define NORMAL_HQ_CORE 0 /* Signal use of Normal HQ core */ +#define LOW_RATE_HQ_CORE 1 /* Signal use of Low Rate MDCT core */ +#define LOW_RATE_HQ_CORE_TRAN 2 /* Signal use of Low Rate MDCT core Tran SWB */ +#define NORM_MDCT_FACTOR L_FRAME8k /* Normalize Low Rate MDCT coefficients to this frame size */ +#define BANDS_MAX ( 4 * 8 ) +#define MAX_GQLEVS 32 /* Max fine gain levels */ +#define BITS_DE_CMODE 1 +#define BITS_DE_HMODE 1 +#define BITS_DE_8SMODE 1 +#define MAXIMUM_ENERGY_LOWBRATE 255 +#define MINIMUM_ENERGY_LOWBRATE -256 +#define BITS_ABS_ENG 7 +#define ABS_ENG_OFFSET 64 +#define BITS_MAX_DEPTH 3 +#define BITS_DE_8SMODE_N0 1 +#define BITS_DE_8SMODE_N1 1 +#define BITS_DE_8SPOS 5 +#define BITS_DE_FCOMP 5 +#define BITS_DE_LSB 1 +#define DE_OFFSET0 46 +#define DE_OFFSET1 32 +#define DE_LIMIT 64 +#define LRMDCT_BE_OFFSET 15 +#define LRMDCT_BE_LIMIT 31 + +#define HQCORE_NB_MIN_RATE 7200 /* NB LR MDCT coding down to this bitrate */ +#define HQCORE_WB_MIN_RATE 13200 /* WB LR MDCT coding down to this bitrate */ +#define HQCORE_SWB_MIN_RATE 13200 /* SWB LR MDCT coding down to this bitrate */ + +#define LRMDCT_CROSSOVER_POINT 16400 /* Use LR MDCT core at this rate and below */ + +#define HTH_NORM 17 +#define LTH_NORM 13 +#define OFFSET_NORM 3 + + +/*----------------------------------------------------------------------------------* + * SWB TBE constants + *----------------------------------------------------------------------------------*/ + +#define STEPSNUM 4 /* Number of steps in a2lsp routine for SHB LPC */ +#define ALLPASSSECTIONS_STEEP 3 /* Size of all pass filters for interpolation and decimation by a factor of 2 */ +#define INTERP_3_1_MEM_LEN 13 /* Size of all pass filters for interpolation and decimation by a factor of 3:1 */ +#define INTERP_3_2_MEM_LEN 15 +#define L_SHB_LAHEAD 20 /* Size of lookahead for SHB */ +#define NUM_SHB_SUBFR 16 +#define LPC_SHB_ORDER 10 +#define LPC_WHTN_ORDER 4 /* Order of whitening filter for SHB excitation */ +#define SHB_OVERLAP_LEN ( L_FRAME16k - L_SHB_LAHEAD ) / ( NUM_SHB_SUBFR - 1 ) +#define QUANT_DIST_INIT ( 10000000000.0f ) /* Quantiser search distance initialisation */ +#define HIBND_ACB_L_FAC 5 / 2 /* SHB Interpolation Factor */ +#define NUM_HILBERTS 2 +#define HILBERT_ORDER1 5 +#define HILBERT_ORDER2 4 +#define HILBERT_MEM_SIZE ( HILBERT_ORDER1 + ( 2 * HILBERT_ORDER2 ) + ( 2 * HILBERT_ORDER2 ) ) + +#define L_SHB_TRANSITION_LENGTH ( 2 * NS2SA( 48000, DELAY_BWE_TOTAL_NS ) ) + +#define NUM_BITS_SHB_SubGain 6 +#define NUM_BITS_SHB_FrameGain 6 + +#define NUM_BITS_SHB_FrameGain_LBR_WB 4 +#define RECIP_ROOT_EIGHT 0.3535534f /* 1.0 / sqrt(8.0) - constant Gain Shape over TD BWE subframes */ + +#define LPC_SHB_ORDER_WB 6 +#define LPC_WHTN_ORDER_WB 2 /* Order of whitening filter for WB excitation */ +#define NUM_BITS_WB_LSF 8 +#define LPC_SHB_ORDER_LBR_WB 4 +#define NUM_BITS_LBR_WB_LSF 2 + +#define COMP_FIL_ORDER 19 +#define MAX_BIQ_N L_FRAME32k + +#define NUM_SHB_SUBGAINS 4 /* Number of subframe gains */ +#define NUM_BITS_SHB_SUBGAINS 5 /* Number of bits for subframe gains for SWB */ +#define NUM_BITS_SHB_FRAMEGAIN 5 /* Number of bits for framegain for SWB */ +#define NUM_BITS_SHB_FRAMEGAIN_1k75 6 /* Number of bits for framegain for SWB */ +#define NUM_BITS_SHB_ENER_SF 6 +#define NUM_BITS_SHB_RES_GS 3 +#define NUM_BITS_SHB_VF 3 +#define NUM_BITS_SHB_SUBGAINS_RF 5 /* Number of bits for subframe gains for SWB in RF */ +#define SHB_GAIN_QLOW -1.0f /* SHB gain lowest scalar quantizer value */ +#define SHB_GAIN_QDELTA 0.15f /* SHB gain scalar quantizer stepsize */ +#define SHB_GAIN_QLOW_1k75 0.0f /* SHB gain lowest scalar quantizer value */ +#define SHB_GAIN_QDELTA_1k75 0.08f /* SHB gain scalar quantizer stepsize */ +#define NUM_Q_LSF 5 /* Number of quantized LSFs */ +#define MIRROR_POINT_BITS 2 /* Number of bits used to quantize mirror point */ +#define MIRROR_POINT_Q_CB_SIZE 4 /* Size of codebook used to quantize mirror point */ +#define MAX_LSF 0.5f /* Maximum value of the LSFs */ +#define NUM_MAP_LSF 5 /* Number of mapped LSFs */ +#define NUM_LSF_GRIDS 4 /* Number of LSF grids */ +#define NUM_LSF_GRID_BITS 2 /* Number of bits used for the LSF grids */ +#define NUM_BITS_SHB_MSLVQ 20 /* Number of bits for the MSLVQ quantizer */ + +#define VF_0th_PARAM 0.34f +#define VF_1st_PARAM 0.5f +#define VF_2nd_PARAM ( VF_1st_PARAM - VF_0th_PARAM ) + +#define GAMMA0 0.65f /* Mean value of gamma1/gamma2 for formant PF */ +#define GAMMA_SHARP 0.15f /* Largest sharpening for gamma1/gamma2 (0.83/0.67)*/ +#define SWB_NOISE_MIX_FAC 0.15f /* Noise mixing adjustment factor for active PF */ +#define SWB_TILT_LOW 1.0f /* Lower threshold for PF tilt adaptation */ +#define SWB_TILT_HIGH 2.0f /* Higher threshold for PF tilt adaptation */ +#define SWB_TILT_DELTA ( 1.0f / ( SWB_TILT_HIGH - SWB_TILT_LOW ) ) /* Inclination between thresholds */ +#define GAMMA3_PLUS_WB 0.65f /* WB post-filter */ +#define GAMMA3_MINUS_WB 0.85f /* WB post-filter */ +#define AGC_FAC_WB 0.85f /* WB post-filter - gain adjustment factor */ +#define AGC_FAC1_WB ( 1.0f - AGC_FAC_WB ) /* WB post-filter - gain adjustment factor complement */ + +#define MAX_LEN_MA_FILTER 20 /* maximum length of the MA filter for SHB TD envelope calculation */ +#define TABLE_CUMSUM_MAX_N 320 /* maximum length of cumsum(i) and cumsum(i*i) tables */ + +#define NUM_BITS_FB_FRAMEGAIN_TBE 4 /* Number of bits for framegain for FB TBE */ + +/*----------------------------------------------------------------------------------* + * SWB BWE constants + *----------------------------------------------------------------------------------*/ + +#define INV_L_SUBFR16k 0.0125f +#define SWB_L_SUBFR 160 +#define FB_L_SUBFR 240 +#define SWB_FENV 14 +#define FB_GAIN_QLOW 0.0f +#define FB_GAIN_QDELTA 0.03125f +#define FB_MAX_GAIN_VAR 0.5f + + +#define NUM_BITS_FB_FRAMEGAIN 4 /* Number of bits for framegain for FB BWE */ +#define FB_BAND_BEGIN 620 /* == 15.5 kHz */ +#define FB_BAND_BEGIN_12k8 560 /* == 14 kHz */ +#define FB_BAND_END 800 /* == 20 kHz */ +#define FB_BAND_WIDTH 180 /* == 4.5 kHz */ +#define N_CAND 2 +#define N_CB11 32 /* 5bits */ +#define N_CB1ST 128 /* 7bits */ +#define N_CB2ND 64 /* 6bits */ +#define N_CB3RD 32 /* 5bits */ +#define N_CB4TH 64 /* 6bits */ +#define DIM1ST 3 +#define DIM2ND 4 +#define DIM3RD 3 +#define DIM4TH 4 +#define DIM11 ( DIM1ST + DIM2ND ) +#define DIM12 ( DIM3RD + DIM4TH ) +#define N_CAND_TR 3 +#define N_CB_TR1 128 +#define N_CB_TR2 64 +#define DIM_TR1 2 +#define DIM_TR2 2 +#define SWB_FENV_TRANS 4 +#define SWB_TENV 4 +#define NUM_SHARP 9 +#define SHARP_WIDTH 32 + +#define HARMONIC 3 +#define NORMAL 2 +#define TRANSIENT 1 +#define NOISE 0 + +/*----------------------------------------------------------------------------------* + * HR SWB BWE constants + *----------------------------------------------------------------------------------*/ + +#define NSV_OVERLAP 2 /* number of sub-bands overlaping with lower-band (0-8kHz) */ /* note that NSV_MAX >= END_FREQ_BWE_FULL/(8*50) + NSV_OVERLAP ! */ +#define N_BANDS_BWE_HR 4 /* number of frequency bands in non-transient frame */ +#define N_BANDS_TRANS_BWE_HR 2 /* number of frequency bands in transient frame */ +#define END_FREQ_BWE 14400 /* maximum frequency coded by AVQ */ +#define END_FREQ_BWE_FULL 16000 /* maximum frequency coded by HR SWB BWE */ +#define END_FREQ_BWE_FULL_FB 20000 /* maximum frequency coded by HR FB BWE */ + +#define NBITS_GLOB_GAIN_BWE_HR 5 /* number of bits of the global gain quantizer */ +#define MIN_GLOB_GAIN_BWE_HR 3 /* minimum value of the global gain quantizer */ +#define MAX_GLOB_GAIN_BWE_HR 500 /* maximum value of the global gain quantizer */ + +#define NBITS_ENVELOPE_BWE_HR1 6 /* number of bits for envelope VQ - first two subbands in non-transient frame */ +#define NBITS_ENVELOPE_BWE_HR2 5 /* number of bits for envelope VQ - second two subbands in non-transient frame */ +#define NBITS_ENVELOPE_BWE_HR_TR 4 /* number of bits for envelope VQ - two subbands in transient frame */ +#define NUM_ENVLOPE_CODE_HR1 64 /* dimension of envelope VQ - first two subbands in non-transient frame */ +#define NUM_ENVLOPE_CODE_HR2 32 /* dimension of envelope VQ - second two subbands in non-transient frame */ +#define NUM_ENVLOPE_CODE_HR_TR 16 /* dimension of envelope VQ - two subbands in transient frame */ +#define NUM_ENVLOPE_CODE_HR_TR2 8 /* dimension of envelope VQ - two subbands in transient frame */ + +#define NUM_NONTRANS_START_FREQ_COEF ( L_FRAME32k / 2 - NSV_OVERLAP * WIDTH_BAND ) /* start frequency coefficient (==7.6kHz) in non-transient frame */ +#define NUM_NONTRANS_END_FREQ_COEF ( L_FRAME32k * END_FREQ_BWE / END_FREQ_BWE_FULL ) /* end frequency coefficient (==14.4kHz) in non-transient frame */ +#define NUM_TRANS_START_FREQ_COEF ( NUM_NONTRANS_START_FREQ_COEF / NUM_TIME_SWITCHING_BLOCKS ) /* start frequency coefficient (==7.6kHz) in transient frame */ +#define NUM_TRANS_END_FREQ_COEF ( NUM_NONTRANS_END_FREQ_COEF / NUM_TIME_SWITCHING_BLOCKS ) /* end frequency coefficient (==14.4kHz) in transient frame */ +#define NUM_TRANS_END_FREQ_COEF_EFF 140 +#define WIDTH_NONTRANS_FREQ_COEF ( ( NUM_NONTRANS_END_FREQ_COEF - NUM_NONTRANS_START_FREQ_COEF ) / N_BANDS_BWE_HR ) /* number of coefficients per band in non-transient frame */ +#define WIDTH_TRANS_FREQ_COEF ( ( NUM_TRANS_END_FREQ_COEF - NUM_TRANS_START_FREQ_COEF ) / N_BANDS_TRANS_BWE_HR ) /* number of coefficients per band in transient frame */ + +#define NBITS_THRESH_BWE_HR 400 /* BWE HR number of bits threshold */ + +#define NBITS_HF_GAIN_BWE_HR 2 /* number of bits for HF (noncoded) energy estimation */ +#define BWE_HR_TRANS_EN_LIMIT1 0.1f /* HF (noncoded) energy equalization limit 1, transient frames */ +#define BWE_HR_TRANS_EN_LIMIT2 0.3f /* HF (noncoded) energy equalization limit 2, transient frames */ +#define BWE_HR_TRANS_EN_LIMIT3 0.5f /* HF (noncoded) energy equalization limit 3, transient frames */ +#define BWE_HR_NONTRANS_EN_LIMIT1 0.5f /* HF (noncoded) energy equalization limit 1, non-transient frames */ +#define BWE_HR_NONTRANS_EN_LIMIT2 1.2f /* HF (noncoded) energy equalization limit 2, non-transient frames */ +#define BWE_HR_NONTRANS_EN_LIMIT3 0.8f /* HF (noncoded) energy equalization limit 3, non-transient frames */ + +/*----------------------------------------------------------------------------------* + * FD CNG + *----------------------------------------------------------------------------------*/ + +#define SIZE_SCALE_TABLE_MONO 20 +#define SIZE_SCALE_TABLE_STEREO 27 +#define SIZE_SCALE_TABLE_CN 18 +#define SIZE_SCALE_TABLE_CN_AMRWB 3 +#define SIZE_SCALE_TABLE_TCX 13 + +#define SIZE_SIDPARTS_ENC_NOISE_EST 24 + +#define FD_CNG_maxN_37bits 24 +#define FD_CNG_maxC_37bits 8 +#define FD_CNG_stages_37bits 6 +#define FD_CNG_JOINT_stages_25bits 4 + +#define OUTMAX_INV 0.000030517578125f /* 1/2^15 */ +#define OUTMAX_SQ 1073741824.f /* 2^30 */ +#define OUTMAX_SQ_INV 0.00000000093132257461547852f /* 1/2^30 */ +#define DELTA ( 1e-20f ) + +#define CLDFB_SCALING ( 1.5f ) + +#define FFTLEN 640 +#define FFTLEN2 ( FFTLEN / 2 ) +#define CORECLDFBLEN 20 +#define TOTCLDFBLEN 40 +#define FFTCLDFBLEN ( FFTLEN2 + TOTCLDFBLEN - CORECLDFBLEN ) +#define PERIODOGLEN ( FFTLEN2 - 2 ) +#define NPART 24 +#define NPARTCLDFB 10 +#define NPART_SHAPING 62 + +#define FDCNG_VQ_MAX_LEN FD_CNG_maxN_37bits +#define FDCNG_VQ_DCT_NSEGM 4 +#define FDCNG_VQ_DCT_MINTRUNC 8 +#define FDCNG_VQ_DCT_MAXTRUNC 18 +#define FDCNG_VQ_MAX_LEN_WB 21 + +#define FDCNG_VQ_DCT_NPOST 8 + +typedef enum _DCTTYPE +{ + DCT_T2_24_XX = 0, /* truncated DCT_T2_24 */ + IDCT_T2_XX_24 = 1, + DCT_T2_21_XX = 2, /* truncated DCT_T2_21 */ + IDCT_T2_XX_21 = 3 +} DCTTYPE; + + +#define MSSUBFRLEN 12 +#define MSNUMSUBFR 6 +#define MSBUFLEN 5 +#define MSALPHACORALPHA 0.7f +#define MSALPHACORMAX 0.3f +#define MSALPHAMAX 0.96f +#define MSALPHAHATMIN 0.05f /* It is used for all bands except the first one to get a stable bass */ +#define MSQEQINVMAX ( 1.f / 5.f ) +#define MSAV 2.12f +#define MSBETAMAX 0.8f +#define MSSNREXP ( -0.02f / 0.064f ) + +#define NB_LAST_BAND_SCALE 0.8f +#define SWB_13k2_LAST_BAND_SCALE 0.8f + +#define CNG_LOG_SCALING 512.f /*2^9*/ + +#define M_MAX 32 +#define N_GAIN_MIN 4 +#define N_GAIN_MAX 17 + +#define CHEAP_NORM_SIZE 161 + +#define CNA_MAX_BRATE ACELP_13k20 + +#define CNA_INIT_NBANDS 6 + +#define GAIN_Q_OFFSET_EVS 60.f +#define GAIN_Q_OFFSET_IVAS 45.f + +/*----------------------------------------------------------------------------------* + * Bass post-filter constants + *----------------------------------------------------------------------------------*/ + +#define NBPSF_PIT_MAX ( PIT16k_MAX + 1 ) /* maximum pitch value for bass post-filter */ +#define L_TRACK_HIST 10 + +/*----------------------------------------------------------------------------------* + * NB post-filter constants + *----------------------------------------------------------------------------------*/ + +#define THRESCRIT 0.5f /* NB post-filter - threshold LT pst switch off */ +#define AGC_FAC 0.9875f /* NB post-filter - gain adjustment factor */ +#define AGC_FAC1 ( 1.0f - AGC_FAC ) /* NB post-filter - gain adjustment factor complement */ +#define LONG_H_ST 20 /* NB post-filter - impulse response length */ +#define POST_G1 0.75f /* NB post-filter - denominator weighting factor 12kbps */ +#define POST_G2 0.7f /* NB post-filter - numerator weighting factor 12kbps */ +#define GAMMA1_PST 0.7f /* denominator weighting factor */ +#define GAMMA2_PST 0.55f /* numerator weighting factor */ +#define GAMMA3_PLUS 0.2f /* NB post-filter - tilt weighting factor when k1>0 */ +#define GAMMA3_MINUS 0.9f /* NB post-filter - tilt weighting factor when k1<0 */ +#define F_UP_PST 8 /* NB post-filter - resolution for fractionnal delay */ +#define LH2_S 4 /* NB post-filter - length of INT16 interp. subfilters */ +#define LH2_L 16 /* NB post-filter - length of long interp. subfilters */ +#define MIN_GPLT ( 1.0f / 1.5f ) /* NB post-filter - LT gain minimum */ +#define LH_UP_S ( LH2_S / 2 ) +#define LH_UP_L ( LH2_L / 2 ) +#define LH2_L_P1 ( LH2_L + 1 ) +#define DECMEM_RES2 ( PIT16k_MAX + 2 + LH_UP_L ) +#define SIZ_RES2 ( DECMEM_RES2 + L_SUBFR ) +#define SIZ_Y_UP ( ( F_UP_PST - 1 ) * ( L_SUBFR + 1 ) ) +#define SIZ_TAB_HUP_L ( ( F_UP_PST - 1 ) * LH2_L ) +#define SIZ_TAB_HUP_S ( ( F_UP_PST - 1 ) * LH2_S ) +#define POST_G1_MIN 0.65f +#define POST_G2_MIN 0.55f +#define POST_G1_NOIS 0.15f +#define POST_G2_NOIS 0.10f +#define BG1 ( -0.01f ) +#define BG2 ( -0.05f ) +#define CG1 0.9f +#define CG2 1.45f +#define C_LP_NOISE ( 0.1f / 4.0f ) +#define K_LP_NOISE 15.0f +#define LP_NOISE_THR 25.0f + +/*----------------------------------------------------------------------------------* + * Stability estimation + *----------------------------------------------------------------------------------*/ + +#define NB_BFI_THR 2 /* threshold for counter of last bad frames */ +#define MAX_LT 40 +#define INV_MAX_LT ( 1.0f / MAX_LT ) + +#define TH_0_MIN 2.5f +#define TH_1_MIN 1.875f +#define TH_2_MIN 1.5625f +#define TH_3_MIN 1.3125f + +/*----------------------------------------------------------------------------------* + * Speech/music classifier constants + *----------------------------------------------------------------------------------*/ + +#define SPEECH 0 /* S/M classifier's final decision is pure speech */ +#define SPEECH_OR_MUSIC 1 /* S/M classifier's final decision is unclear, i.e. speech or music */ +#define MUSIC 2 /* S/M classifier's final decision is pure music */ + +#define N_FEATURES 12 /* number of features */ +#define N_MIXTURES 6 /* number of mixtures */ + +#define NB_MEL_BANDS 40 /* number of mel filter bands */ +#define NB_MEL_COEF 13 /* number of mel filter coefficients */ +#define N_SMC_FEATURES 15 /* number of features */ +#define N_SMC_MIXTURES 6 /* number of mixtures */ +#define N_PCA_COEF 12 /* number of PCA components */ +#define SMC_ST_MEAN_FACT 0.5 /* forgetting factor of short-term IIR mean filter */ + +#define M_LSP_SPMUS 6 /* number of LSPs used in speech/music classifier */ +#define NB_BANDS_SPMUS 15 +#define START_BAND_SPMUS 2 +#define N_OLD_BIN_E 42 /* == (L_FFT/2-2)/3 */ + +#define LOWEST_FBIN 3 /* lowest frequency bin for feature vector preparation */ +#define HIGHEST_FBIN 70 /* highest frequency bin for feature vector preparation */ +#define HANG_LEN_INIT 8 /* number of frames for hang-over (causes delay of decision) */ +#define HANG_LEN 8 +#define BUF_LEN 60 +#define L_OVR 8 + +#define ATT_NSEG 32 /* strong attack detection - number of time blocks */ + +#define TOD_NSPEC 80 /* number of spectral bins of the tonal detector */ +#define TOD_THR_MASS 0.86f /* initial value for the adaptive threshold of the tonal detector */ +#define P2A_FACT 0.9f /* long-term averaging factor for peak-to-average ratio */ +#define THR_P2A_HIGH 95.0f /* higher threshold to detect strongly peaky signals at low bitrates*/ +#define THR_P2A 80.0f /* lower threshold to detect strongly peaky signals at higher bitrates */ + +/*----------------------------------------------------------------------------------* + * LD music post-filter constants + *----------------------------------------------------------------------------------*/ + +#define TH_0_MIN2 1.875f +#define TH_1_MIN2 1.25f +#define TH_2_MIN2 0.9375f +#define TH_3_MIN2 0.625f + +#define DCT_L_POST 640 +#define OFFSET2 192 + +#define VOIC_BINS_HR 640 +#define BIN_16kdct ( 6400.0f / DCT_L_POST ) +#define NB_LIMIT_BAND 16 +#define MBANDS_GN_LD 20 /* number of bands for gain coding in the postfilter */ + +/*----------------------------------------------------------------------------------* + * AC mode (GSC) constants + *----------------------------------------------------------------------------------*/ + +#define NOISE_LEVEL_SP0 8 +#define NOISE_LEVEL_SP1a 9 +#define NOISE_LEVEL_SP1 10 +#define NOISE_LEVEL_SP2 12 +#define NOISE_LEVEL_SP3 14 + +#define MAX_DYNAMIC 82 +#define MIN_DYNAMIC 50 +#define DYNAMIC_RANGE ( MAX_DYNAMIC - MIN_DYNAMIC ) +#define MAX_GSC_NF_BITS 3 +#define GSC_NF_STEPS ( 1 << MAX_GSC_NF_BITS ) + +#define CRIT_NOIS_BAND 23 + +#define SSF 32 /* Sub-subframe length for energy estimation in UC decision */ +#define NB_SSF ( L_FRAME / SSF ) /* number of sub-subframes per frame */ + +#define MBANDS_GN16k 18 /* Number of band for gain coding in GSC */ +#define MBANDS_GN 16 /* Number of band for gain coding in GSC */ +#define MBANDS_GN_BITALLOC16k 20 /* Number of band for gain coding in GSC */ +#define BAND1k2 3 +#define DSR_NB_PULSE ( 4.5f ) +#define MAX_EQ_LF 1.0f +#define MBANDS_LOC ( MBANDS_GN - 1 ) +#define BIN_SIZE 25.0f +#define SWNB_SUBFR 1 + +#define MIN_RATE_4SBFR ACELP_16k40 +#define MIN_RATE_FCB ACELP_22k60 + +#define VAR_COR_LEN 10 + +#define CFREQ_BITRATE ACELP_11k60 + +#define LT_UV_THR 100 +#define LT_UV_THRMID 70 + +#define PIT_EXC_L_SUBFR L_FRAME16k + +#define LOCAL_CT VOICED + +/*----------------------------------------------------------------------------------* + * Core switching constants + *----------------------------------------------------------------------------------*/ + +#define SWITCH_MAX_GAP 360 /* 6.25 + 1.25 of filter mem max == NS2SA(48000, SWITCH_GAP_LENGTH_NS+DELAY_CLDFB_NS) */ + +/*----------------------------------------------------------------------------------* + * HQ core constants + *----------------------------------------------------------------------------------*/ + +#define HQ_NORMAL 0 +#define HQ_TRANSIENT 1 +#define HQ_HARMONIC 2 +#define HQ_HVQ 3 +#define HQ_GEN_SWB 4 +#define HQ_GEN_FB 5 + +#define PREECHO_SMOOTH_LEN 20 +#define INV_PREECHO_SMOOTH_LENP1 ( 1 / ( PREECHO_SMOOTH_LEN + 1.0 ) ); + +#define EPSILON 0.000000000000001f + +#define MAX_SEGMENT_LENGTH 480 +#define NUM_TIME_SWITCHING_BLOCKS 4 +#define NUM_MAP_BANDS 20 +#define NUM_MAP_BANDS_HQ_24k4 17 +#define NUM_MAP_BANDS_HQ_32k 18 +#define FREQ_LENGTH 800 + +#define STOP_BAND 800 + +#define SFM_G1 16 +#define SFM_G1G2 24 +#define SFM_N_NB 18 +#define SFM_N_WB 26 +#define SFM_N_STA_8k 27 +#define SFM_N_STA_10k 30 +#define SFM_N_ENV_STAB SFM_N_STA_8k /* Number of bands for env_stab stability measure */ +#define SFM_N_ENV_STAB_WB SFM_N_WB /* Number of bands for env_stab stability measure used in HQPLC decision for WB signals */ +#define SFM_N_HARMONIC 39 +#define SFM_N 36 + +#define L_HQ_WB_BWE 20 /* == band_end_wb[SFM_N_WB-1] - (band_start_wb[SFM_N_WB-1]+12) */ +#define N_INTL_GRP_16 2 /* Number of interleaving band groups at 16kHz sampling rate */ +#define N_INTL_GRP_32 2 /* Number of interleaving band groups at 32kHz sampling rate */ +#define N_INTL_GRP_48 3 /* Number of interleaving band groups at 48kHz sampling rate */ +#define SFM_N_SWB 39 +#define SFM_N_HARM 31 +#define SFM_N_HARM_FB 33 +#define NB_SFM 44 +#define NB_SFM_MAX 58 +#define WID_G1 8 +#define WID_G2 16 +#define WID_G3 24 +#define WID_GX 32 +#define NUMC_N 544 +#define HQ_MAX_BAND_LEN 96 /* Largest bandwidth in HQ mode (band_len_harm[32]) */ +#define HVQ_PVQ_BUF_LEN ( HVQ_PVQ_COEFS * ( MAX_PVQ_BANDS - 1 ) + HQ_MAX_BAND_LEN ) /* 24*7+96 = 216 */ + +#define QBIT_MAX2 9 + +#define FLAGN_BITS 1 +#define GAIN0_BITS 5 +#define GAINI_BITS 5 + +#define FLAGS_BITS 2 +#define FLAGS_BITS_FB 3 +#define NORM0_BITS 5 +#define NORMI_BITS 5 +#define NUMNRMIBITS_SWB_STA_8k 5 * ( SFM_N_STA_8k - 1 ) +#define NUMNRMIBITS_SWB_STA_10k 5 * ( SFM_N_STA_10k - 1 ) +#define NUMNRMIBITS_SWB_HARMONIC 185 +#define NUMNRMIBITS_SWB 190 +#define NUMNRMIBITS 215 +#define NUMNRMIBITS_WB 125 + +#define NOHUFCODE 0 +#define HUFCODE 1 +#define HUFF_THR 10 +#define NOSUPERPOSITION 40 + +#define MAXVALUEOFFIRSTGAIN 2.5f +#define MINVALUEOFFIRSTGAIN -2.5f +#define NOOFGAINBITS1 6 + +#define AUDIODELAYBITS 6 +#define DELTAOFFIRSTGAIN (float) ( MAXVALUEOFFIRSTGAIN - MINVALUEOFFIRSTGAIN ) / (float) ( ( 1 << NOOFGAINBITS1 ) - 1 ) + +#define MAX_D1M_16k ( ( L_FRAME16k >> 1 ) - NS2SA( 16000, SWITCH_GAP_LENGTH_NS ) - 16 ) +#define MAX_D1M_12k8 ( ( L_FRAME16k >> 1 ) - NS2SA( 16000, SWITCH_GAP_LENGTH_NS ) - 20 ) + +#define MAX_P_ATT 40 /* Maximum number of pulses for gain attenuation factor */ +#define NB_G 4 /* Number of band groups */ +#define MAX_GAIN_BITS 5 /* Maximum number of gain bits */ + +#define ENV_ADJ_START 6 /* Number of consecutive bands for which the attenuation is maximum */ +#define ENV_ADJ_INCL 5 /* Inclination for mapping between attenuation region width and attenuation limit */ + +#define ENV_SMOOTH_FAC 0.1f /* Smoothing factor for envelope stability measure */ +#define L_STAB_TBL 10 /* Number of elements in stability transition table */ +#define M_STAB_TBL_FX ( (Word16) 21068 ) /* Q13, 2.571756 */ +#define D_STAB_TBL_FX ( (Word16) 845 ) /* Q13 0.1013138 */ +#define HALF_D_STAB_TBL_FX ( (Word16) 422 ) /* Q13 0.1013138/2.0 */ +#define NUM_ENV_STAB_PLC_STATES 2 /* Number of states of markov model */ + +#define ENV_STAB_EST1 2.93f /* env_stab estimation coefficient 1 */ +#define ENV_STAB_EST2 (-2.20f) /* env_stab estimation coefficient 2 */ +#define ENV_STAB_EST3 0.741f /* env_stab estimation coefficient 3 */ +#define STAB_FAC_EST1 1.093f /* stab_fac HQ estimation coefficient 1 */ +#define STAB_FAC_EST2 (-5.84e-05f) /* stab_fac HQ estimation coefficient 2, including Q12 scaling */ +#define STAB_FAC_EST3 0.125f /* stab_fac HQ estimation coefficient 3 */ + +#define ATT_LIM_HANGOVER 150 /* Number of hangover frames for disabling stability dependent attenuation */ +#define DELTA_TH 5.0f /* Delta energy threshold for transient detection for envelope stability */ +#define ENERGY_TH 100.0f /* Energy threshold for transient detection */ +#define ENERGY_LT_BETA 0.93f /* Smoothing factor for long-term energy measure */ + +#define START_EXC 60 +#define L_HARMONIC_EXC 202 + +#define HQ_GENERIC_OFFSET 2 +#define HQ_GENERIC_END_FREQ 560 +#define HQ_GENERIC_END_FREQ_14P2KHZ 568 +#define HQ_GENERIC_END_FREQ_16P0KHZ 640 + +#define HQ_GENERIC_FOFFSET_24K4 80 +#define HQ_GENERIC_FOFFSET_32K 144 +#define HQ_GENERIC_SWB_NBITS 31 +#define HQ_GENERIC_SWB_NBITS2 30 +#define HQ_GENERIC_FB_NBITS 5 + +#define HQ_GENERIC_ST_FREQ 224 +#define HQ_GENERIC_LOW0 80 +#define HQ_GENERIC_HIGH0 240 +#define HQ_GENERIC_HIGH1 368 +#define HQ_GENERIC_HIGH2 496 +#define HQ_GENERIC_LEN0 128 +#define HQ_GENERIC_NVQIDX 6 + +#define HQ_GENERIC_EXC0 0 +#define HQ_GENERIC_EXC1 1 +#define HQ_GENERIC_SP_EXC 2 + +#define LF_EMP_FAC 1.2f + +#define DIM_FB 3 +#define HQ_FB_FENV SWB_FENV + DIM_FB +#define N_CB_FB 32 + +#define HVQ_THRES_BIN_24k 224 +#define HVQ_THRES_SFM_24k 22 +#define HVQ_THRES_BIN_32k 320 +#define HVQ_THRES_SFM_32k 25 +#define HVQ_MIN_PEAKS 2 +#define HVQ_MAX_PEAKS_32k 23 +#define HVQ_MAX_PEAKS_24k 17 +#define HVQ_MAX_PEAKS_24k_CLAS 20 /* Limit for HVQ mode */ +#define HVQ_MAX_PEAKS ( HVQ_MAX_PEAKS_32k + 1 + 11 ) /* Allowing HVQ at max 48 kbps */ +#define HVQ_PEAKS_BPS_DELTA ( HQ_32k - HQ_24k40 ) +#define HVQ_PEAKS_PER_DELTA ( HVQ_MAX_PEAKS_32k - HVQ_MAX_PEAKS_24k ) +#define HVQ_PEAKS_PER_DELTA_THR ( HVQ_MAX_PEAKS_32k - HVQ_MAX_PEAKS_24k_CLAS ) +#define HVQ_PEAKS_PER_DELTA_OFFS ( HVQ_MAX_PEAKS_24k * HVQ_PEAKS_BPS_DELTA - HQ_24k40 * HVQ_PEAKS_PER_DELTA ) +#define HVQ_PEAKS_PER_DELTA_THR_OFFS ( HVQ_MAX_PEAKS_24k_CLAS * HVQ_PEAKS_BPS_DELTA - HQ_24k40 * HVQ_PEAKS_PER_DELTA_THR ) +#define HVQ_NUM_SFM_24k ( SFM_N_HARMONIC - 1 - HVQ_THRES_SFM_24k ) +#define HVQ_NUM_SFM_32k ( SFM_N_HARMONIC - 1 - HVQ_THRES_SFM_32k ) +#define HVQ_E_PEAK_SMOOTH_FAC ( 0.3f ) + +#define HVQ_MAX_RATE 32000 + +#define NUMNRMIBITS_SWB_HVQ_24k 35 +#define NUMNRMIBITS_SWB_HVQ_32k 25 + +#define MAX_PVQ_BANDS 8 +#define HVQ_MAX_PVQ_WORDS ( ( HVQ_MAX_RATE / FRAMES_PER_SEC ) / 16 + MAX_PVQ_BANDS ) +#define HVQ_MAX_POS_WORDS 40 +#define HVQ_PVQ_COEFS 24 +#define HVQ_BAND_MIN_PULSES 2 +#define HVQ_BAND_MAX_BITS_24k 80 +#define HVQ_BAND_MAX_BITS_32k 95 +#define HVQ_NEW_BAND_BIT_THR 30 + +#define HVQ_NF_GROUPS 2 +#define HVQ_NF_WEIGHT1 0.9578f /* HVQ Classifier - Noise floor estimate weight 1 */ +#define HVQ_NF_WEIGHT2 0.6472f /* HVQ Classifier - Noise floor estimate weight 2 */ +#define HVQ_PE_WEIGHT1 0.42237f /* HVQ Classifier - Peak envelope estimate weight 1 */ +#define HVQ_PE_WEIGHT2 0.80285f /* HVQ Classifier - Peak envelope estimate weight 2 */ +#define HVQ_THR_POW 0.88f /* HVQ Classifier power factor for threshold calc */ +#define HVQ_SHARP_THRES 9 /* HVQ Classifier - Sharpness threshold */ + +#define HVQ_PA_FAC 0.7071f /* HVQ Classifier peak allocation factor */ +#define HVQ_PA_PEAKS_SHARP1 9 /* HVQ Classifier - Maximum number of peaks for band with high sharpness */ +#define HVQ_PA_PEAKS_SHARP2 3 /* HVQ Classifier - Maximum number of peaks for band with medium sharpness */ +#define HVQ_PA_PEAKS_SHARP3 2 /* HVQ Classifier - Maximum number of peaks for band with low sharpness */ +#define HVQ_PA_SHARP_THRES2 16.0f /* HVQ Classifier - Sharpness threshold for band with medium sharpness */ +#define HVQ_PA_SHARP_THRES3 12.0f /* HVQ Classifier - Sharpness threshold for band with low sharpness */ + +#define HVQ_BW 32 /* HVQ Classifier subband bandwidth */ +#define HVQ_NSUB_32k 10 +#define HVQ_NSUB_24k 7 /* HVQ Classifier number of subbands */ + +#define HQ_CREST_THRESHOLD 7.0f /* HQ harmonic high band classifier, crest threshold */ +#define HQ_CREST_MOD_THRESHOLD 2.128f /* HQ harmonic high band classifier, modified crest threshold */ +#define HQ_CREST_FAC_SM 0.97f /* HQ harmonic high band classifier, smoothing factor */ + +#define HVQ_BWE_NOISE_BANDS 2 /* Number of BWE noise bands */ +#define HVQ_BWE_WEIGHT1 0.95f +#define HVQ_BWE_WEIGHT2 0.2f +#define HVQ_NFPE_FACTOR 6.4f +#define HVQ_LB_NFPE_FACTOR 3.2f + +#define HVQ_VQ_DIM 5 /* HVQ peak VQ dimension */ +#define HVQ_PVQ_GAIN_BITS 5 /* Number of bits to encode PVQ gains in HVQ */ +#define HVQ_NUM_CLASS 4 /* Number of codebook classes */ +#define HVQ_CB_SIZE 256 + +#define NUM_PG_HUFFLEN 9 /* Number of Huffman codewords for peak gains */ +#define MAX_PG_HUFFLEN 12 /* Length of the longest codeword for peak gain Huffman coding */ + +#define HVQ_CP_HUFF_OFFSET 3 /* HVQ Code Pos - Delta offset */ +#define HVQ_CP_HUFF_MAX 51 /* HVQ Code Pos - Maximum delta for huffman coding */ +#define HVQ_CP_HUFF_MAX_CODE 13 /* HVQ Code Pos - Size of largest code word */ +#define HVQ_CP_HUFF_NUM_LEN 11 /* HVQ Code Pos - Number of different huffman lengths */ +#define HVQ_CP_L2_MAX 64 /* HVQ Code Pos - Layer 2 maximum size */ +#define HVQ_CP_L1_LEN 5 /* HVQ Code Pos - Layer 1 block size */ +#define HVQ_CP_MAP_LEN 8 /* HVQ Code Pos - Mapping table size */ +#define HVQ_CP_MAP_IDX_LEN 3 /* HVQ Code Pos - Mapping index size */ +#define HVQ_CP_DELTA 0 /* HVQ Code Pos - Use Delta coding */ +#define HVQ_CP_SPARSE 1 /* HVQ Code Pos - Use Sparse coding */ + +#define MAX_SPLITS 10 /* Maximum number of PVQ band splits */ +#define QUANTAQ3OFFSET 1 + +enum QuantaMode +{ + PVQ_NEAREST = 0, + PVQ_CONS +}; + +#define DS_INDEX_LINEAR_END 21 +#define PYR_OFFSET 1 +#define RCF_INIT_SHIFT 14 +#define THR_ADD_SPLIT 7 /* Threshold for using additional split */ +#define PVQ_MAX_BAND_SIZE 64 /* Maxiumum supported band size for PVQ search */ +#define MIN_BAND_SIZE 1 /* Minimum supported band size for PVQ search */ +#define RC_BITS_RESERVED 1 +#define MAX_PVQ_BITS_PER_COEFFICIENT 80 /* Maximum bits per coefficient allocated per PVQ band. Q3. */ +#define MAX_SRT_LEN NB_SFM_MAX /* Maximum length of input for srt_vec_ind() */ + +/* index_pvq constants */ +#define KMAX 512 +#define KMAX_NON_DIRECT 96 /* max K for non-direct indexing recursion rows */ +#define ODD_DIV_SIZE 48 /* ind0=1/1 ind1 =1/3 ... ind47=1/95 */ + +/* TCQ */ +#define TCQ_MAX_BAND_SIZE 120 /* Maxiumum supported band size for TCQ+USQ search */ +#define STATES 8 +#define MAX_AR_FREQ 16383 +#define AR_BITS 16 +#define STATES_LSB 4 +#define TCQ_LSB_SIZE 24 +#define TCQ_AMP 10 +#define QTCQ ( 0.2f ) + +#define AR_FIRST ( AR_TOP / 4 + 1 ) +#define AR_TOP ( ( 1 << AR_BITS ) - 1 ) +#define AR_HALF ( 2 * AR_FIRST ) +#define AR_THIRD ( 3 * AR_FIRST ) + +#define MAX_SIZEBUF_PBITSTREAM 1024 + +/*----------------------------------------------------------------------------------* + * SWB BWE for LR MDCT core + *----------------------------------------------------------------------------------*/ + +#define G1_RANGE 4 +#define G1G2_RANGE 15 +#define GRP_SB 4 /*Maximum subband groups*/ +#define THR1 4 /* Bit allocation threshold value */ +#define THR2 5 /* Bit allocation threshold value */ +#define THR3 6 /* Bit allocation threshold value */ + +#define NB_SWB_SUBBANDS 4 /* maximum number of subbands in normal2 subband coding */ +#define SWB_SB_LEN0_12KBPS 55 /* length of subband number X in lowest bitrate operation */ +#define SWB_SB_LEN1_12KBPS 68 +#define SWB_SB_LEN2_12KBPS 84 +#define SWB_SB_LEN3_12KBPS 105 +#define SWB_HIGHBAND_12KBPS ( SWB_SB_LEN0_12KBPS + SWB_SB_LEN1_12KBPS + SWB_SB_LEN2_12KBPS + SWB_SB_LEN3_12KBPS ) +#define SWB_LOWBAND_12KBPS ( HQ_GENERIC_END_FREQ_14P2KHZ - SWB_HIGHBAND_12KBPS ) +#define SWB_HIGHBAND_MAX SWB_HIGHBAND_12KBPS +#define SWB_LOWBAND_MAX SWB_LOWBAND_12KBPS + +#define SWB_SB_OFF0_12KBPS 0 /* subband offsets are based on the subband lengths */ +#define SWB_SB_OFF1_12KBPS ( SWB_SB_OFF0_12KBPS + SWB_SB_LEN0_12KBPS ) +#define SWB_SB_OFF2_12KBPS ( SWB_SB_OFF1_12KBPS + SWB_SB_LEN1_12KBPS ) +#define SWB_SB_OFF3_12KBPS ( SWB_SB_OFF2_12KBPS + SWB_SB_LEN2_12KBPS ) +#define SWB_SB_OFF4_12KBPS ( SWB_SB_OFF3_12KBPS + SWB_SB_LEN3_12KBPS ) + +/* 16.4 kbps */ +#define SWB_SB_LEN0_16KBPS 59 /* length of subband number X in lowest bitrate operation */ +#define SWB_SB_LEN1_16KBPS 74 +#define SWB_SB_LEN2_16KBPS 92 +#define SWB_SB_LEN3_16KBPS 115 +#define SWB_HIGHBAND_16KBPS ( SWB_SB_LEN0_16KBPS + SWB_SB_LEN1_16KBPS + SWB_SB_LEN2_16KBPS + SWB_SB_LEN3_16KBPS ) +#define SWB_LOWBAND_16KBPS ( HQ_GENERIC_END_FREQ_16P0KHZ - SWB_HIGHBAND_16KBPS ) + +#define SWB_SB_OFF0_16KBPS 0 /* subband offsets are based on the subband lengths */ +#define SWB_SB_OFF1_16KBPS ( SWB_SB_OFF0_16KBPS + SWB_SB_LEN0_16KBPS ) +#define SWB_SB_OFF2_16KBPS ( SWB_SB_OFF1_16KBPS + SWB_SB_LEN1_16KBPS ) +#define SWB_SB_OFF3_16KBPS ( SWB_SB_OFF2_16KBPS + SWB_SB_LEN2_16KBPS ) +#define SWB_SB_OFF4_16KBPS ( SWB_SB_OFF3_16KBPS + SWB_SB_LEN3_16KBPS ) + +/* SpectrumSmoothing */ +#define L_SB 12 /* subband length for SpectrumSmoothing */ + +/* SpectrumSmoothing for NSS */ +#define L_SB_NSS 8 +#define L_SB_NSS_HALF ( L_SB_NSS / 2 ) +#define NUM_SUBBAND_SMOOTH_MAX ( SWB_HIGHBAND_12KBPS / L_SB_NSS + 1 ) +#define MA_LEN 7 + +/* Harmonic mode */ +#define NB_SWB_SUBBANDS_HAR_SEARCH_SB 2 /* search number of subbands in harmonic subband coding */ +#define NB_SWB_SUBBANDS_HAR 4 /* maximum number of subbands in harmonic subband coding */ +#define N_NBIGGEST_PULSEARCH 18 +#define N_NBIGGEST_SEARCH_LRG_B 32 + + +/* 13.2 kbps */ +#define SWB_SB_BW_LEN0_12KBPS_HAR 56 /* Group 1 length for BWE */ +#define SWB_SB_BW_LEN1_12KBPS_HAR 100 /* Group 2 Length for BWE */ +#define SWB_SB_BW_LEN2_12KBPS_HAR SWB_SB_BW_LEN1_12KBPS_HAR +#define SWB_SB_BW_LEN3_12KBPS_HAR SWB_SB_BW_LEN0_12KBPS_HAR + +/* 16.4 kbps */ +#define SWB_SB_BW_LEN0_16KBPS_HAR 60 /* Group 1 length for BWE */ +#define SWB_SB_BW_LEN1_16KBPS_HAR 110 /* Group 2 Length for BWE */ +#define SWB_SB_BW_LEN2_16KBPS_HAR SWB_SB_BW_LEN1_16KBPS_HAR +#define SWB_SB_BW_LEN3_16KBPS_HAR SWB_SB_BW_LEN0_16KBPS_HAR + +#define SWB_SB_OFF0_SUB5_12KBPS_HAR 0 /* subband offsets are based on the subband lengths */ +#define SWB_SB_OFF1_SUB5_12KBPS_HAR ( SWB_SB_OFF0_SUB5_12KBPS_HAR + SWB_SB_BW_LEN0_12KBPS_HAR ) +#define SWB_SB_OFF2_SUB5_12KBPS_HAR ( SWB_SB_OFF1_SUB5_12KBPS_HAR + SWB_SB_BW_LEN1_12KBPS_HAR ) +#define SWB_SB_OFF3_SUB5_12KBPS_HAR ( SWB_SB_OFF2_SUB5_12KBPS_HAR + SWB_SB_BW_LEN2_12KBPS_HAR ) + +#define SWB_SB_OFF0_SUB5_16KBPS_HAR 0 /* subband offsets are based on the subband lengths */ +#define SWB_SB_OFF1_SUB5_16KBPS_HAR ( SWB_SB_OFF0_SUB5_16KBPS_HAR + SWB_SB_BW_LEN0_16KBPS_HAR ) +#define SWB_SB_OFF2_SUB5_16KBPS_HAR ( SWB_SB_OFF1_SUB5_16KBPS_HAR + SWB_SB_BW_LEN1_16KBPS_HAR ) +#define SWB_SB_OFF3_SUB5_16KBPS_HAR ( SWB_SB_OFF2_SUB5_16KBPS_HAR + SWB_SB_BW_LEN2_16KBPS_HAR ) + +#define LR_BLK_LEN 16 +#define LR_HLF_PK_BLK_LEN 8 +#define LR_LOWBAND_DIF_PK_LEN 10 +#define SWB_HAR_RAN1 80 +#define SWB_HAR_RAN2 140 +#define SWB_HAR_RAN3 200 +#define SPT_SHORTEN_SBNUM 4 + +/* LRMDCT fix precision */ +#define SWB_BWE_LR_Qs 12 +#define SWB_BWE_LR_Qbe 14 +#define SWB_BWE_LR_QRk 16 + + +/*----------------------------------------------------------------------------------* + * FEC for HQ core + *----------------------------------------------------------------------------------*/ + +#define MAX_PGF 7 +#define MAX_ROW 2 + +#define MAX_SB_NB 3 + +#define NELP_LP_ORDER 8 +#define NUM_NELP_GAINS 10 + +#define MINIMUM_RATE_TO_ENCODE_VOICING_FLAG 45000 +#define FRAC_BWE_SMOOTH 2.0f /* >= 1 */ +#define FRAMECTTOSTART_MDCT 3 + +/*----------------------------------------------------------------------------------* + * Channel aware mode (FEC) + *----------------------------------------------------------------------------------*/ + +#define FEC_OFFSET 3 +#define MAX_RF_FEC_OFFSET 9 + + +/*----------------------------------------------------------------------------------* + * HQ FEC + *----------------------------------------------------------------------------------*/ + +#define POST_HQ_DELAY_NS DELAY_BWE_TOTAL_NS /* delay of post processing after core HQ coding */ +#define PH_ECU_ALDO_OLP2_NS ( ACELP_LOOK_NS / 2 ) /* half length of ALDO WINDOW overlap */ +#define PH_ECU_LOOKAHEAD_NS ( 11 * ACELP_LOOK_NS / ( 7 * 2 ) ) /* Number of nanoseconds look-ahead ahead from the end of the past synthesized frame */ +#define PH_ECU_MEM_NS ( ( L_PROT48k / 48 - 20 ) * 1000000 - PH_ECU_LOOKAHEAD_NS ) /* Number of nanoseconds memory for Phase ECU before the old_synthFB_fx pointer */ + +#define N_LEAD_NB 70 /* (N_LEAD_MDCT*(L_FRAME8k/20)) */ +#define N_ZERO_NB 45 /* (N_ZERO_MDCT*(L_FRAME8k/20)) */ +#define N_LEAD_O_NB 90 /* (20.f-N_LEAD_MDCT)*(L_FRAME8k/20) */ +#define N_ZERO_O_NB 35 /* (10.f-N_ZERO_MDCT)*(L_FRAME8k/20) */ +#define N_Z_L_NB 115 /* (N_Z_L_MDCT*(float)(L/20)) = N_ZERO_NB + N_LEAD_NB*/ +#define N_Z_L_O_NB 205 /* (N_Z_L_O_MDCT*(float)(L/20)) = N_ZERO_NB + N_LEAD_NB + N_LEAD_O_NB */ + +#define L_PROT32k 1024 /* HQ phase ECU prototype frame length */ +#define MAX_PLOCS L_PROT48k / 4 + 1 /* maximum number of spectral peaks to be searched */ +#define QUOT_LPR_LTR 4 +#define LGW_MAX 9 /* maximum number frequency group widths */ +#define BETA_MUTE_FAC_INI 0.5f /* initial noise attenuation factor */ +#define L_TRANA32k ( L_PROT32k / QUOT_LPR_LTR ) /* transient analysis frame length */ +#define L_TRANA16k ( L_TRANA32k / 2 ) +#define L_TRANA8k ( L_TRANA32k / 4 ) +#define L_PROT_HAMM_LEN2_48k NS2SA( 48000, 6000000L ) +#define L_PROT_HAMM_LEN2_32k NS2SA( 32000, 6000000L ) +#define L_PROT_HAMM_LEN2_16k NS2SA( 16000, 6000000L ) +#define L_PROT48k L_PROT32k * 3 / 2 /* HQ phase ECU prototype frame length */ +#define L_PROT48k_2 L_PROT48k / 2 +#define L_TRANA48k ( L_PROT48k / QUOT_LPR_LTR ) /* transient analysis frame length */ +#define PH_ECU_SPEC_SIZE L_PROT48k +#define T_SIN_PI_2 ( PH_ECU_SPEC_SIZE / 4 ) +#define HQ_FEC_SIGN_SFM 16 +#define OFF_FRAMES_LIMIT 30 /* HQ phase ECU, burst length for muting to zero */ +#define PH_ECU_MUTE_START 15 /* HQ phase ECU, burst length to start steep muting */ + +#define SCALE_DOWN_3dB 0.7071f +#define MAX_TILT 0.f +#define ED_THRES 1.0f + +#define ED_THRES_12P 0.032209f +#define ED_THRES_50P 0.159063f +#define ED_THRES_90P 0.532669 +#define MAXDELAY_FEC 224 + +#define RANDOM_START 1 +#define HQ_FEC_SIGN_THRES 6 +#define HQ_FEC_SIGN_THRES_TRANS 3 +#define HQ_FEC_BAND_SIZE 4 + + +/*--------------------------------------------------------------* + * Tonal MDCT PLC + *---------------------------------------------------------------*/ + +#define MAX_NUMBER_OF_IDX 30 +#define GROUP_LENGTH 7 +#define MAX_PEAKS_FROM_PITCH 10 +#define LAST_HARMONIC_POS_TO_CHECK 128 /* 128 because we check harmonics only up to 3.2 kHz */ +#define ALLOWED_SIDE_LOBE_FLUCTUATION 3.0f /* 4.8 dB */ +#define LEVEL_ABOVE_ENVELOPE 7.59f /* 8.8 dB */ +#define UNREACHABLE_THRESHOLD 16.0f /* 12 dB Increase of LEVEL_ABOVE_ENVELOPE so that the threshold is not reached */ +#define SMALL_THRESHOLD 1.10f /* 0.41 dB Increase of LEVEL_ABOVE_ENVELOPE for the peak detection at a definitive peak in the estimated spectrum */ +#define BIG_THRESHOLD 1.5f /* 1.76 dB Increase of LEVEL_ABOVE_ENVELOPE for the peak detection at a probable peak in the estimated spectrum */ + +#define kSmallerLagsTargetBitsThreshold 150 +#define kCtxHmOlRSThr 2.6f + + +#define kTcxHmNumGainBits 2 /* Number of bits for the gain index */ +#define kTcxHmParabolaHalfWidth 4 /* Parabola half width */ +#define kLtpHmGainThr 0.46f /* Use the LTP pitch lag in the harmonic model? */ + +#define LOWRATE_TCXLPC_MAX_BR_CPE ACELP_13k20 +#define LOWRATE_TCXLPC_MAX_BR ACELP_9k60 + +/*--------------------------------------------------------------* + * Waveform-adjustment MDCT PLC + *---------------------------------------------------------------*/ + +#define DEC_STATE_LEN 10 +#define MAX_POST_LEN 3 +#define TCX_TONALITY_INIT_CNT 7 + +#define TCX_NONTONAL 0 +#define TCX_TONAL 1 + +/*---------------------------------------------------------------* + * IGF * + *---------------------------------------------------------------*/ + +#define IGF_MAX_TILES 10 +#define IGF_MAX_GRANULE_LEN 1200 +#define IGF_TRANS_FAK 2 +#define IGF_MAX_SFB 23 +#define IGF_NOF_GRIDS 3 +#define IGF_MAX_SUBFRAMES 2 +#define IGF_PAST_SFM_LEN 5 +#define IGF_MID_WHITENING_LEVEL 7 +#define IGF_MID_WHITENING_LEVEL2 9 + +#define IGF_MODE_WB 1 +#define IGF_MODE_SWB 2 +#define IGF_MODE_FB 3 + +enum +{ + IGF_BITRATE_WB_9600, + IGF_BITRATE_RF_WB_13200, + IGF_BITRATE_SWB_9600, + IGF_BITRATE_SWB_13200, + IGF_BITRATE_RF_SWB_13200, + IGF_BITRATE_SWB_16400, + IGF_BITRATE_SWB_24400, + IGF_BITRATE_SWB_32000, + IGF_BITRATE_SWB_48000, + IGF_BITRATE_SWB_64000, + IGF_BITRATE_FB_16400, + IGF_BITRATE_FB_24400, + IGF_BITRATE_FB_32000, + IGF_BITRATE_FB_48000, + IGF_BITRATE_FB_64000, + IGF_BITRATE_FB_96000, + IGF_BITRATE_FB_128000, + IGF_BITRATE_WB_13200_CPE, + IGF_BITRATE_WB_16400_CPE, + IGF_BITRATE_SWB_13200_CPE, + IGF_BITRATE_SWB_16400_CPE, + IGF_BITRATE_SWB_24400_CPE, + IGF_BITRATE_SWB_32000_CPE, + IGF_BITRATE_SWB_48000_CPE, + IGF_BITRATE_SWB_48000_CPE_TCX10, + IGF_BITRATE_SWB_64000_CPE, + IGF_BITRATE_SWB_80000_CPE, + IGF_BITRATE_SWB_96000_CPE, + IGF_BITRATE_FB_24400_CPE, + IGF_BITRATE_FB_32000_CPE, + IGF_BITRATE_FB_48000_CPE, + IGF_BITRATE_FB_48000_CPE_TCX10, + IGF_BITRATE_FB_64000_CPE, + IGF_BITRATE_FB_80000_CPE, + IGF_BITRATE_FB_96000_CPE, + IGF_BITRATE_FB_128000_CPE, + IGF_BITRATE_UNKNOWN +}; + +#define IGF_WHITENING_OFF 0 +#define IGF_WHITENING_MID 1 +#define IGF_WHITENING_STRONG 2 + +#define IGF_GRID_LB_NORM 0 +#define IGF_GRID_LB_TRAN 1 +#define IGF_GRID_LB_SHORT 2 + +/* constants for IGFSCFDecoder and IGFSCFEncoder */ +#define IGF_CTX_OFFSET 3 /* offset added to make the context values non negative, for array indexing */ +#define IGF_CTX_COUNT ( 2 * IGF_CTX_OFFSET + 1 ) /* number of contexts for the AC statistical model */ +#define IGF_MIN_ENC_SEPARATE -12 /* minimum residual value coded separately, without escape coding */ +#define IGF_MAX_ENC_SEPARATE +12 /* maximum residual value coded separately, without escape coding */ +#define IGF_SYMBOLS_IN_TABLE ( 1 + ( IGF_MAX_ENC_SEPARATE - IGF_MIN_ENC_SEPARATE + 1 ) + 1 ) /* alphabet size */ + +/*----------------------------------------------------------------------------------* + * SC-VBR + *----------------------------------------------------------------------------------*/ + +#define UVG1_CBSIZE 32 /* NELP unvoiced gain-1 codebook size */ +#define UVG2_CBSIZE 64 /* NELP unvoiced gain-2 codebook size */ + +/* PPP constants */ +#define NUM_ERB_WB 24 /* Number of ERB bands in wideband */ +#define NUM_ERB_NB 22 /* Number of ERB bands in narrowband */ + +#define CUTFREE_ABS_RANGE 6 +#define CUTFREE_REL_RANGE 0.25 + +#define VBR_ADR_MAX_TARGET 6.15f /* max target ADR for VBR. This rate is used in the closed loop rate control */ +#define PPP_LAG_THRLD 180 /* max lag allowed for PPP coding */ + +#define MAXLAG_WI ( PPP_LAG_THRLD / 2 + 12 ) /* Maximum lag used in waveform interpolation */ +#define MAX_LAG_PIT ( PPP_LAG_THRLD + 21 ) /* Max possible pitch lag after adding delta lag */ + +/*----------------------------------------------------------------------------------* + * JBM + *----------------------------------------------------------------------------------*/ + +#define MAX_JBM_SLOTS 100 /* every primary copy and partial copy stored in JBM needs one slot */ +#define MAX_AU_SIZE ( ( MAX_BITS_PER_FRAME + 7 ) / 8 ) /* max frame size in bytes */ + +/*----------------------------------------------------------------------------------* + * TEC/TFA + *----------------------------------------------------------------------------------*/ + +#define DELAY_TEMP_ENV_BUFF_TEC 9 +#define EXT_DELAY_HI_TEMP_ENV 2 + + +/*----------------------------------------------------------------------------------* + * BASOP ROM Tables + *----------------------------------------------------------------------------------*/ + +#define LD_INT_TAB_LEN 120 +#define INV_TABLE_SIZE 256 +#define SQRT_TABLE_SIZE 256 + + +/*----------------------------------------------------------------------------------* + * Decoder modes + *----------------------------------------------------------------------------------*/ + +enum +{ + PRIMARY_2800, + PRIMARY_7200, + PRIMARY_8000, + PRIMARY_9600, + PRIMARY_13200, + PRIMARY_16400, + PRIMARY_24400, + PRIMARY_32000, + PRIMARY_48000, + PRIMARY_64000, + PRIMARY_96000, + PRIMARY_128000, + PRIMARY_SID, + PRIMARY_FUT1, + SPEECH_LOST, + NO_DATA_RECEIVED +}; + +enum +{ + AMRWB_IO_6600, + AMRWB_IO_8850, + AMRWB_IO_1265, + AMRWB_IO_1425, + AMRWB_IO_1585, + AMRWB_IO_1825, + AMRWB_IO_1985, + AMRWB_IO_2305, + AMRWB_IO_2385, + AMRWB_IO_SID /*, + AMRWB_IO_FUT1, + AMRWB_IO_FUT2, + AMRWB_IO_FUT3, + AMRWB_IO_FUT4, + SPEECH_LOST, + NO_DATA_RECEIVED */ +}; + +enum +{ + G192, + MIME, + VOIP_G192_RTP, + VOIP_RTPDUMP +}; + + +/* clang-format on */ +#endif /* CNST_H */ diff --git a/lib_com/codec_tcx_common.c b/lib_com/codec_tcx_common.c new file mode 100644 index 0000000000000000000000000000000000000000..2375ef387e807bc38396b7be5eba3dbd0cba6ebe --- /dev/null +++ b/lib_com/codec_tcx_common.c @@ -0,0 +1,332 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * tcxGetNoiseFillingTilt() + * + * + *-------------------------------------------------------------------*/ + +int16_t tcxGetNoiseFillingTilt( + const float A[], + const int16_t L_frame, + const int16_t mode, + float *noiseTiltFactor ) +{ + int16_t firstLine; + + if ( mode ) + { + firstLine = L_frame / 6; + *noiseTiltFactor = 0.5625f; + } + else + { + firstLine = L_frame / 8; + *noiseTiltFactor = get_gain( A + 1, A, M, NULL ); + *noiseTiltFactor = min( 1.0f, ( *noiseTiltFactor ) + 0.09375f ); + } + + return firstLine; +} + +/*-------------------------------------------------------------------* + * tcxFormantEnhancement() + * + * + *-------------------------------------------------------------------*/ + +void tcxFormantEnhancement( + float xn_buf[], + const float *gainlpc, + float spectrum[], + const int16_t L_frame ) +{ + int16_t k, i, j, l = 0; + float fac, step; + + k = L_frame / FDNS_NPTS; + + /* Formant enhancement via square root of the LPC gains */ + xn_buf[0] = (float) sqrt( gainlpc[0] ); + xn_buf[1] = (float) sqrt( gainlpc[1] ); + fac = 1.0f / min( xn_buf[0], xn_buf[1] ); + + for ( i = 1; i < FDNS_NPTS - 1; i++ ) + { + xn_buf[i + 1] = (float) sqrt( gainlpc[i + 1] ); + + if ( ( xn_buf[i - 1] <= xn_buf[i] ) && ( xn_buf[i + 1] <= xn_buf[i] ) ) + { + step = max( xn_buf[i - 1], xn_buf[i + 1] ); + step = ( 1.0f / step - fac ) / (float) ( i - l ); + xn_buf[l] = 1.0f; + fac += step; + for ( j = l + 1; j < i; j++ ) + { + xn_buf[j] = min( 1.0f, xn_buf[j] * fac ); + fac += step; + } + l = i; + } + } + + /* i = hTcxCfg->fdns_npts - 1; Completing changes to gains */ + step = min( xn_buf[i - 1], xn_buf[i] ); + step = ( 1.0f / step - fac ) / (float) ( i - l ); + xn_buf[l] = 1.0f; + fac += step; + for ( j = l + 1; j < i; j++ ) + { + xn_buf[j] = min( 1.0f, xn_buf[j] * fac ); + fac += step; + } + xn_buf[i] = 1.0f; + + /* Application of changed gains onto decoded MDCT lines */ + for ( i = j = 0; i < L_frame; j++ ) + { + for ( l = 0; l < k; i++, l++ ) + { + spectrum[i] *= xn_buf[j]; + } + } + + return; +} + +/*-------------------------------------------------------------------* + * tcxInvertWindowGrouping() + * + * + *-------------------------------------------------------------------*/ + +void tcxInvertWindowGrouping( + TCX_CONFIG_HANDLE hTcxCfg, + float xn_buf[], + float spectrum[], + const int16_t L_frame, + const int16_t fUseTns, + const int16_t last_core, + const int16_t index, + const int16_t frame_cnt, + const int16_t bfi ) +{ + int16_t i, w, t_integer; + int16_t L_win, L_spec; + + if ( frame_cnt && !bfi && last_core != ACELP_CORE ) + { + /* fix sub-window overlap */ + hTcxCfg->tcx_last_overlap_mode = hTcxCfg->tcx_curr_overlap_mode; + } + + if ( ( ( !bfi ) && ( ( hTcxCfg->tcx_last_overlap_mode != FULL_OVERLAP ) || + ( ( hTcxCfg->tcx_curr_overlap_mode == FULL_OVERLAP ) && ( frame_cnt == 0 ) && ( index == 0 ) ) ) ) || + ( ( bfi ) && ( ( hTcxCfg->tcx_last_overlap_mode != FULL_OVERLAP ) && + !( hTcxCfg->tcx_curr_overlap_mode == FULL_OVERLAP ) ) ) ) + { + + /* ungroup sub-windows: deinterleave MDCT bins into separate windows */ + for ( t_integer = w = 0; w < 2; w++ ) + { + for ( i = w; i < L_frame; i += 2 ) + { + xn_buf[t_integer++] = spectrum[i]; + } + } + + mvr2r( xn_buf, spectrum, L_frame ); + + if ( hTcxCfg->fIsTNSAllowed && !bfi && fUseTns ) + { + L_win = L_frame >> 1; + L_spec = hTcxCfg->tnsConfig[0][0].iFilterBorders[0]; + + /* rearrange LF sub-window lines prior to TNS synthesis filtering */ + if ( L_spec < L_frame ) + { + mvr2r( spectrum + 8, spectrum + 16, L_spec / 2 - 8 ); + mvr2r( spectrum + L_frame / 2, spectrum + 8, 8 ); + mvr2r( spectrum + L_frame / 2 + 8, spectrum + L_spec / 2 + 8, L_spec / 2 - 8 ); + } + else + { + mvr2r( spectrum + 8, xn_buf, L_win ); + mvr2r( xn_buf, spectrum + 16, L_win - 8 ); + mvr2r( xn_buf + L_win - 8, spectrum + 8, 8 ); + } + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * tcx5SpectrumInterleaving() + * + * + *-------------------------------------------------------------------*/ + +void tcx5SpectrumInterleaving( + const int16_t tcx5Size, + float *spectrum ) +{ + int16_t i; + float interleaveBuf[N_TCX10_MAX]; + + set_f( interleaveBuf, 0.0f, N_TCX10_MAX ); + + /* group sub-windows: interleave bins according to their frequencies */ + for ( i = 0; i < tcx5Size; i++ ) + { + interleaveBuf[2 * i] = spectrum[i]; + interleaveBuf[2 * i + 1] = spectrum[tcx5Size + i]; + } + + mvr2r( interleaveBuf, spectrum, 2 * tcx5Size ); + + return; +} + + +/*-------------------------------------------------------------------* + * tcx5SpectrumDeinterleaving() + * + * + *-------------------------------------------------------------------*/ + +void tcx5SpectrumDeinterleaving( + const int16_t tcx5Size, + float *spectrum ) +{ + int16_t i; + float interleaveBuf[N_TCX10_MAX]; + + set_f( interleaveBuf, 0.0f, N_TCX10_MAX ); + + /* ungroup sub-windows: interleave bins according to their frequencies */ + for ( i = 0; i < tcx5Size; i++ ) + { + interleaveBuf[i] = spectrum[2 * i]; + interleaveBuf[tcx5Size + i] = spectrum[2 * i + 1]; + } + + mvr2r( interleaveBuf, spectrum, 2 * tcx5Size ); + + return; +} + + +/*-------------------------------------------------------------------* + * tcx5TnsGrouping() + * + * + *-------------------------------------------------------------------*/ + +void tcx5TnsGrouping( + const int16_t L_frame, /* i : frame length (TCX5) */ + const int16_t L_spec, /* i : coded spec length (TCX5, derived from filter borders*/ + float *spectrum ) +{ + /* rearrange LF sub-window lines prior to TNS synthesis filtering */ + if ( L_spec < L_frame ) + { + mvr2r( spectrum + 8, spectrum + 16, L_spec - 8 ); + mvr2r( spectrum + L_frame, spectrum + 8, 8 ); + mvr2r( spectrum + L_frame + 8, spectrum + L_spec + 8, L_spec - 8 ); + } + else + { + float buff[8]; /* Buffer for the rearrangement of LF TCX5 */ + mvr2r( spectrum + L_spec, buff, 8 ); + mvr2r( spectrum + 8, spectrum + 16, L_spec - 8 ); + mvr2r( buff, spectrum + 8, 8 ); + } + + return; +} + + +/*-------------------------------------------------------------------* + * tcx5TnsUngrouping() + * + * + *-------------------------------------------------------------------*/ + +void tcx5TnsUngrouping( + const int16_t L_frame, /* i : frame length (TCX5) */ + const int16_t L_spec, /* i : coded spec length (TCX5, derived from filter borders*/ + float *spectrum, + const int16_t enc_dec /* i : 0: encoder, else decoder */ +) +{ + /* undo rearrangement of LF sub-window lines prior to TNS analysis */ + if ( L_spec < L_frame ) + { + mvr2r( spectrum + L_spec + 8, spectrum + L_frame + 8, L_spec - 8 ); + mvr2r( spectrum + 8, spectrum + L_frame, 8 ); + mvr2r( spectrum + 16, spectrum + 8, L_spec - 8 ); + set_zero( spectrum + L_spec, L_frame - L_spec ); + set_zero( spectrum + L_frame + L_spec, L_frame - L_spec ); + } + else + { + float buff[8]; /* Buffer for the rearrangement of LF TCX5 */ + + mvr2r( spectrum + 8, buff, 8 ); + + if ( enc_dec == ENC ) + { + mvr2r( spectrum + 16, spectrum + 8, L_frame - 8 ); + mvr2r( buff, spectrum + L_frame, 8 ); + } + else + { + mvr2r( spectrum + 16, spectrum + 8, L_spec - 8 ); + mvr2r( buff, spectrum + L_spec, 8 ); + } + } + + return; +} diff --git a/lib_com/common_api_types.h b/lib_com/common_api_types.h new file mode 100644 index 0000000000000000000000000000000000000000..92331dc9a57e09741c5391de6415e4f4e73f72f6 --- /dev/null +++ b/lib_com/common_api_types.h @@ -0,0 +1,224 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#ifndef COMMON_API_TYPES_H +#define COMMON_API_TYPES_H + +/* options.h needed for debugging/development features + * It should be stripped for delivery along with debugging switches */ +#include "options.h" +#include +#include +#include "ivas_error.h" + +/*----------------------------------------------------------------------------------* + * Common API constants + *----------------------------------------------------------------------------------*/ + +#define IVAS_NUM_FRAMES_PER_SEC 50 +#define IVAS_MAX_FRAME_SIZE ( 48000 / IVAS_NUM_FRAMES_PER_SEC ) + +#define IVAS_MAX_BITS_PER_FRAME ( 512000 / IVAS_NUM_FRAMES_PER_SEC ) + +#define IVAS_MAX_NUM_OBJECTS 4 +#define IVAS_MAX_INPUT_CHANNELS 16 +#define IVAS_MAX_OUTPUT_CHANNELS 16 +#define IVAS_CLDFB_NO_COL_MAX 16 +#define IVAS_CLDFB_NO_CHANNELS_MAX 60 +#define IVAS_MAX_INPUT_LFE_CHANNELS 4 + +#define IVAS_MAX_PARAM_SPATIAL_SUBFRAMES 4 + +#define IVAS_ROOM_ABS_COEFF 6 + +/*----------------------------------------------------------------------------------* + * Common API enum for output audio configurations + *----------------------------------------------------------------------------------*/ + +typedef enum _IVAS_AUDIO_CONFIG +{ + IVAS_AUDIO_CONFIG_INVALID, + IVAS_AUDIO_CONFIG_MONO, /* mono output */ + IVAS_AUDIO_CONFIG_STEREO, /* stereo output */ + IVAS_AUDIO_CONFIG_5_1, /* 5.1 speakers layout CICP6 */ + IVAS_AUDIO_CONFIG_7_1, /* 7.1 speakers layout CICP12 */ + IVAS_AUDIO_CONFIG_5_1_2, /* 5.1+2 speakers layout CICP14 */ + IVAS_AUDIO_CONFIG_5_1_4, /* 5.1+4 speakers layout CICP16 */ + IVAS_AUDIO_CONFIG_7_1_4, /* 7.1+4 speakers layout CICP19 */ + IVAS_AUDIO_CONFIG_LS_CUSTOM, /* custom loudspeaker layout */ + IVAS_AUDIO_CONFIG_FOA, /* ambisonics, order 1 */ + IVAS_AUDIO_CONFIG_HOA2, /* ambisonics, order 2 */ + IVAS_AUDIO_CONFIG_HOA3, /* ambisonics, order 3 */ + IVAS_AUDIO_CONFIG_OBA, /* object based audio */ + IVAS_AUDIO_CONFIG_BINAURAL, /* binaural with HRIR */ + IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED, /* split binaural with CLDFB coded output */ + IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM, /* split binaural with PCM coded output */ + IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR, /* binaural with BRIR */ + IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB, /* binaural with HRIR + reverb */ + IVAS_AUDIO_CONFIG_ISM1, /* ISM1 */ + IVAS_AUDIO_CONFIG_ISM2, /* ISM2 */ + IVAS_AUDIO_CONFIG_ISM3, /* ISM3 */ + IVAS_AUDIO_CONFIG_ISM4, /* ISM4 */ + IVAS_AUDIO_CONFIG_MASA1, /* MASA1 */ + IVAS_AUDIO_CONFIG_MASA2, /* MASA2 */ + IVAS_AUDIO_CONFIG_EXTERNAL /* external renderer */ + +} IVAS_AUDIO_CONFIG; + + +/*----------------------------------------------------------------------------------* + * Common API structures and enums + *----------------------------------------------------------------------------------*/ + +typedef enum _IVAS_ENC_FEC_INDICATOR +{ + IVAS_ENC_FEC_LO, + IVAS_ENC_FEC_HI, + IVAS_ENC_FEC_UNDEFINED = 0xffff + +} IVAS_ENC_FEC_INDICATOR; + +typedef struct _IVAS_ENC_CHANNEL_AWARE_CONFIG +{ + int16_t channelAwareModeEnabled; + IVAS_ENC_FEC_INDICATOR fec_indicator; + int16_t fec_offset; + +} IVAS_ENC_CHANNEL_AWARE_CONFIG; + +typedef struct _IVAS_ISM_METADATA +{ + float azimuth; + float elevation; + float radius; + float spread; + float gainFactor; + float yaw; + float pitch; + int16_t non_diegetic_flag; + +} IVAS_ISM_METADATA; + +typedef struct +{ + float w, x, y, z; + +} IVAS_QUATERNION; + +typedef struct +{ + float x, y, z; + +} IVAS_VECTOR3; + +typedef enum +{ + IVAS_HEAD_ORIENT_TRK_NONE, + IVAS_HEAD_ORIENT_TRK_REF, + IVAS_HEAD_ORIENT_TRK_AVG, + IVAS_HEAD_ORIENT_TRK_REF_VEC, + IVAS_HEAD_ORIENT_TRK_REF_VEC_LEV + +} IVAS_HEAD_ORIENT_TRK_T; + +typedef struct ivas_masa_metadata_frame_struct *IVAS_MASA_METADATA_HANDLE; +typedef struct ivas_masa_decoder_ext_out_meta_struct *IVAS_MASA_DECODER_EXT_OUT_META_HANDLE; + +typedef struct TDREND_HRFILT_FiltSet_struct *IVAS_DEC_HRTF_HANDLE; +typedef struct ivas_hrtfs_crend_structure *IVAS_DEC_HRTF_CREND_HANDLE; +typedef struct ivas_hrtfs_fastconv_struct *IVAS_DEC_HRTF_FASTCONV_HANDLE; +typedef struct ivas_hrtfs_parambin_struct *IVAS_DEC_HRTF_PARAMBIN_HANDLE; +typedef struct cldfb_filter_bank_struct *IVAS_CLDFB_FILTER_BANK_HANDLE; + +typedef struct ivas_LS_setup_custom *IVAS_LSSETUP_CUSTOM_HANDLE; +typedef struct ivas_LS_setup_custom IVAS_LSSETUP_CUSTOM_STRUCT; + +typedef struct _IVAS_LS_CUSTOM_LAYOUT +{ + int16_t num_spk; + float azimuth[IVAS_MAX_OUTPUT_CHANNELS]; + float elevation[IVAS_MAX_OUTPUT_CHANNELS]; + int16_t num_lfe; + int16_t lfe_idx[IVAS_MAX_OUTPUT_CHANNELS]; + +} IVAS_CUSTOM_LS_DATA; + +typedef struct _IVAS_JBM_TRACE_DATA +{ + uint32_t systemTimestamp_ms; + uint16_t extBufferedSamples; + uint16_t lastDecodedWasActive; + int32_t output_Fs; + int16_t dataUnit_flag; + uint16_t sequenceNumber; + uint32_t timeStamp; + uint32_t rcvTime; + + int16_t partial_frame; + int16_t partialCopyOffset; + +} IVAS_JBM_TRACE_DATA; + + + +/*----------------------------------------------------------------------------------* + * Renderer API structures and enums + *----------------------------------------------------------------------------------*/ + + +typedef struct _IVAS_ROOM_ACOUSTICS_CONFIG +{ + int16_t override; + int16_t nBands; /* Number of frequency bands for which reverb properties are provided, integer, range [2..256] */ + float pFc_input[IVAS_CLDFB_NO_CHANNELS_MAX]; /* Center frequencies for which following values are provided: */ + float pAcoustic_rt60[IVAS_CLDFB_NO_CHANNELS_MAX]; /* - The room's T60 per center frequency */ + float pAcoustic_dsr[IVAS_CLDFB_NO_CHANNELS_MAX]; /* - The room's Diffuse to Source Ratio per center frequency */ + float acousticPreDelay; /* Time elapsed between input signal and late reverberation start, float, range [0.001..10] */ + float inputPreDelay; /* Offset in seconds from where DSR is computed in the RIR (0 = at source), float, range [0.001..10] */ + + /* early reflections */ + int16_t use_er; /* ER activation flag */ + int32_t lowComplexity; /* Low complexity ER flag */ + IVAS_VECTOR3 dimensions; /* Room dimensions [m] */ + float AbsCoeff[IVAS_ROOM_ABS_COEFF]; /* Absorption coeffs */ + IVAS_VECTOR3 ListenerOrigin; /* Listener origin */ + +} IVAS_ROOM_ACOUSTICS_CONFIG_DATA; + +typedef struct _IVAS_RENDER_CONFIG +{ + IVAS_ROOM_ACOUSTICS_CONFIG_DATA roomAcoustics; + float directivity[IVAS_MAX_NUM_OBJECTS * 3]; + +} IVAS_RENDER_CONFIG_DATA, *IVAS_RENDER_CONFIG_HANDLE; + +#endif /* COMMON_API_TYPES_H */ diff --git a/lib_com/control.h b/lib_com/control.h new file mode 100644 index 0000000000000000000000000000000000000000..725163728dc88ec26e8cee3d1f0b2c7c28e5721e --- /dev/null +++ b/lib_com/control.h @@ -0,0 +1,82 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#ifndef _CONTROL_H +#define _CONTROL_H + +/* BASOP -> FLC brigde: flow control instructions */ + +#include "stl.h" + +#define FOR( a ) \ + if ( incrFor(), 0 ) \ + ; \ + else \ + for ( a ) +static __inline void incrFor( void ) +{ +} + +#define WHILE( a ) \ + if ( incrFlcWhile(), 0 ) \ + ; \ + else \ + while ( a ) +static __inline void incrFlcWhile( void ) +{ +} + +#define DO do + +#define IF( a ) if ( incrIf(), a ) +static __inline void incrIf( void ) +{ +} + +#define ELSE else + +#define SWITCH( a ) switch ( incrSwitch(), a ) +static __inline void incrSwitch( void ) +{ +} + +#define CONTINUE continue + +#define BREAK break + +#define GOTO goto + +#endif /* _CONTROL_H */ diff --git a/lib_com/core_com_config.c b/lib_com/core_com_config.c new file mode 100644 index 0000000000000000000000000000000000000000..13fe05bbb161c1b6776506dfe5858e8143a3256a --- /dev/null +++ b/lib_com/core_com_config.c @@ -0,0 +1,923 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include "options.h" +#include "rom_com.h" +#include "prot.h" +#include "wmc_auto.h" +#include "ivas_prot.h" + + +/*-------------------------------------------------------------------* + * is_EVS_bitrate() + * + * check if the bitrate is EVS supported active bitrate + *-------------------------------------------------------------------*/ + +/*! r: flag indicating a valid bitrate */ +int16_t is_EVS_bitrate( + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + int16_t *Opt_AMR_WB /* i : AMR-WB IO flag */ +) +{ + int16_t j; + + j = 0; + while ( j < SIZE_BRATE_TBL && ivas_total_brate != brate_tbl[j] ) + { + j++; + } + + /* AMR-WB IO mode/EVS primary mode determination */ + if ( j >= SIZE_BRATE_TBL ) + { + switch ( ivas_total_brate ) + { + case ACELP_6k60: + case ACELP_8k85: + case ACELP_12k65: + case ACELP_14k25: + case ACELP_15k85: + case ACELP_18k25: + case ACELP_19k85: + case ACELP_23k05: + case ACELP_23k85: + break; + default: + { + return 0; + } + break; + } + + *Opt_AMR_WB = 1; + } + else + { + *Opt_AMR_WB = 0; + } + + return 1; +} + + +/*-------------------------------------------------------------------* + * get_codec_mode() + * + * Get codec_mode (MODE1 or MODE2) + *-------------------------------------------------------------------*/ + +/*! r: codec mode */ +int16_t get_codec_mode( + const int32_t total_brate /* i : total bitrate */ +) +{ + int16_t codec_mode = -1; + + switch ( total_brate ) + { + case 5900: + codec_mode = MODE1; + break; + case 7200: + codec_mode = MODE1; + break; + case 8000: + codec_mode = MODE1; + break; + case 9600: + codec_mode = MODE2; + break; + case 13200: + codec_mode = MODE1; + break; + case 16400: + codec_mode = MODE2; + break; + case 24400: + codec_mode = MODE2; + break; + case 32000: + codec_mode = MODE1; + break; + case 48000: + codec_mode = MODE2; + break; + case 64000: + codec_mode = MODE1; + break; + case 96000: + codec_mode = MODE2; + break; + case 128000: + codec_mode = MODE2; + break; + } + + return codec_mode; +} + + +/*-------------------------------------------------------------------* + * getTcxonly() + * + * + *-------------------------------------------------------------------*/ + +int16_t getTcxonly( + const int16_t element_mode, /* i : IVAS element mode */ + const int32_t total_brate, /* i : total bitrate */ + const int16_t MCT_flag, /* i : hMCT handle allocated (1) or not (0)*/ + const int16_t is_ism_format /* i : flag indicating ISM format */ +) +{ + int16_t tcxonly = 0; + + switch ( element_mode ) + { + case EVS_MONO: + if ( total_brate > ACELP_32k ) + { + tcxonly = 1; + } + break; + case IVAS_SCE: + if ( is_ism_format ) + { + if ( total_brate > MAX_ACELP_BRATE_ISM ) + { + tcxonly = 1; + } + } + else + { + if ( total_brate > MAX_ACELP_BRATE ) + { + tcxonly = 1; + } + } + break; + + case IVAS_CPE_DFT: + case IVAS_CPE_TD: + if ( total_brate > MAX_ACELP_BRATE ) + { + tcxonly = 1; + } + break; + case IVAS_CPE_MDCT: + if ( total_brate >= ( MCT_flag ? IVAS_32k : IVAS_48k ) ) + { + tcxonly = 1; + } + break; + } + + return tcxonly; +} + + +/*-------------------------------------------------------------------* + * getCtxHm() + * + * + *-------------------------------------------------------------------*/ + +int16_t getCtxHm( + const int16_t element_mode, /* i : IVAS element mode */ + const int32_t total_brate, /* i : total bitrate */ + const int16_t rf_flag /* i : flag to signal the RF mode */ +) +{ + int16_t ctx_hm = 0; + + if ( ( ( element_mode <= IVAS_SCE && total_brate > LPC_SHAPED_ARI_MAX_RATE ) || ( element_mode > IVAS_SCE && total_brate > LPC_SHAPED_ARI_MAX_RATE_CPE ) ) && !rf_flag && ( ( total_brate <= IVAS_64k && element_mode != IVAS_CPE_DFT ) || ( total_brate < 24400 && element_mode == IVAS_CPE_DFT ) ) && element_mode != IVAS_CPE_MDCT ) + { + ctx_hm = 1; + } + + return ctx_hm; +} + +/*-------------------------------------------------------------------* + * getResq() + * + * + *-------------------------------------------------------------------*/ + +int16_t getResq( + const int32_t total_brate /* i : total bitrate */ +) +{ + int16_t resq = 0; + + if ( total_brate <= IVAS_64k ) + { + resq = 1; + } + + return resq; +} + +/*-------------------------------------------------------------------* + * getTnsAllowed() + * + * + *-------------------------------------------------------------------*/ + +int16_t getTnsAllowed( + const int32_t total_brate, /* i : total bitrate */ + const int16_t igf, /* i : flag indicating IGF activity*/ + const int16_t element_mode /* i : IVAS element mode */ +) +{ + int16_t tnsAllowed = 0; + + if ( igf ) + { + if ( total_brate > HQ_16k40 || ( ( total_brate > HQ_13k20 ) && element_mode == IVAS_CPE_DFT ) ) + { + tnsAllowed = 1; + } + } + else if ( total_brate > HQ_32k ) + { + tnsAllowed = 1; + } + + return tnsAllowed; +} + +/*-------------------------------------------------------------------* + * getRestrictedMode() + * + * + *-------------------------------------------------------------------*/ + +int16_t getRestrictedMode( + const int16_t element_mode, /* i : IVAS element mode */ + const int32_t total_brate, /* i : total bitrate */ + const int16_t Opt_AMR_WB /* i : flag indicating AMR-WB IO mode */ +) +{ + int16_t restrictedMode = 3; + + if ( !Opt_AMR_WB && ( total_brate > HQ_32k && element_mode != IVAS_SCE ) ) + { + restrictedMode = 6; + } + else if ( !Opt_AMR_WB && ( total_brate > HQ_48k && element_mode == IVAS_SCE ) ) + { + restrictedMode = 6; + } + else if ( Opt_AMR_WB ) + { + restrictedMode = 1; + } + + return restrictedMode; +} + +/*-------------------------------------------------------------------* + * getMdctWindowLength() + * + * + *-------------------------------------------------------------------*/ + +int16_t getMdctWindowLength( + const int16_t fscale ) +{ + int16_t mdctWindowLength; + + mdctWindowLength = ( L_LOOK_12k8 * fscale ) / FSCALE_DENOM; + + return mdctWindowLength; +} + +/*-------------------------------------------------------------------* + * sr2fscale() + * + * + *-------------------------------------------------------------------*/ + +int16_t sr2fscale( + const int32_t sr_core /* i : internal sampling rate */ +) +{ + + return (int16_t) ( ( FSCALE_DENOM * sr_core ) / 12800 ); +} + +/*-------------------------------------------------------------------* + * getCoreSamplerateMode2() + * + * + *-------------------------------------------------------------------*/ + +int32_t getCoreSamplerateMode2( + const int16_t element_mode, /* i : IVAS element mode */ + const int32_t total_brate, /* i : total bitrate */ + const int16_t bwidth, /* i : audio bandwidth */ + const int16_t flag_ACELP16k, /* i : ACELP@16kHz flag */ + const int16_t rf_mode, /* i : flag to signal the RF mode */ + const IVAS_FORMAT is_ism_format /* i : flag indicating ISM format */ +) +{ + int32_t sr_core = 0; + + if ( bwidth == NB ) + { + sr_core = INT_FS_12k8; + } + else if ( element_mode == EVS_MONO && ( ( bwidth == WB && total_brate < ACELP_13k20 ) || ( bwidth == SWB && total_brate <= ACELP_13k20 ) || ( rf_mode == 1 ) ) ) + { + sr_core = INT_FS_12k8; + } + else if ( element_mode > EVS_MONO && flag_ACELP16k == 0 ) + { + sr_core = INT_FS_12k8; + } + else if ( bwidth == WB || ( bwidth == SWB && total_brate <= ACELP_32k ) || ( bwidth == FB && total_brate <= ACELP_32k ) ) + { + sr_core = INT_FS_16k; + } + else if ( ( bwidth == SWB || bwidth == FB ) && total_brate <= MAX_ACELP_BRATE && element_mode == IVAS_SCE && !is_ism_format ) + { + sr_core = INT_FS_16k; + } + else if ( ( bwidth == SWB || bwidth == FB ) && total_brate <= MAX_ACELP_BRATE_ISM && element_mode == IVAS_SCE && is_ism_format ) + { + sr_core = INT_FS_16k; + } + else if ( ( bwidth == SWB || bwidth == FB ) && total_brate <= MAX_ACELP_BRATE && element_mode == IVAS_SCE && is_ism_format ) + { + sr_core = 25600; + } + else if ( ( ( bwidth == SWB || bwidth == FB ) && element_mode == EVS_MONO && total_brate <= HQ_64k ) || ( element_mode > IVAS_SCE && ( ( bwidth == SWB && total_brate <= IVAS_96k ) || ( bwidth == FB && total_brate <= IVAS_96k ) ) ) ) + { + sr_core = 25600; + } + else if ( bwidth == SWB || bwidth == FB ) + { + sr_core = 32000; + } + + return sr_core; +} + +/*-------------------------------------------------------------------* + * getTcxBandwidth() + * + * + *-------------------------------------------------------------------*/ + +float getTcxBandwidth( + const int16_t bwidth /* i : audio bandwidth */ +) +{ + float tcxBandwidth = 0.5f; + + if ( bwidth == NB ) + { + tcxBandwidth = 0.3125f; + } + + return tcxBandwidth; +} + +/*-------------------------------------------------------------------* + * getIgfPresent() + * + * + *-------------------------------------------------------------------*/ + +int16_t getIgfPresent( + const int16_t element_mode, /* i : IVAS element mode */ + const int32_t total_brate, /* i : total bitrate */ + const int16_t bwidth, /* i : audio bandwidth */ + const int16_t rf_mode /* i : flag to signal the RF mode */ +) +{ + int16_t igfPresent = 0; + + + if ( bwidth == SWB ) + { + switch ( element_mode ) + { + case EVS_MONO: + case IVAS_SCE: + if ( total_brate <= HQ_64k ) + { + igfPresent = 1; + } + break; + case IVAS_CPE_DFT: + case IVAS_CPE_TD: + if ( total_brate <= HQ_48k ) + { + igfPresent = 1; + } + break; + case IVAS_CPE_MDCT: + if ( total_brate <= IVAS_96k ) + { + igfPresent = 1; + } + break; + } + } + else if ( bwidth == FB ) + { + switch ( element_mode ) + { + case EVS_MONO: + case IVAS_SCE: + if ( total_brate <= IVAS_128k ) + { + igfPresent = 1; + } + break; + case IVAS_CPE_DFT: + case IVAS_CPE_TD: + if ( total_brate <= IVAS_48k ) + { + igfPresent = 1; + } + break; + case IVAS_CPE_MDCT: + if ( total_brate <= IVAS_128k ) + { + igfPresent = 1; + } + break; + } + } + else if ( bwidth == WB ) + { + switch ( element_mode ) + { + case EVS_MONO: + case IVAS_SCE: + if ( total_brate <= ACELP_9k60 ) + { + igfPresent = 1; + } + break; + case IVAS_CPE_DFT: + case IVAS_CPE_TD: + case IVAS_CPE_MDCT: + if ( total_brate <= ACELP_13k20 ) + { + igfPresent = 1; + } + break; + } + } + + if ( ( ( bwidth == WB ) || ( bwidth == SWB ) ) && ( rf_mode == 1 ) && ( total_brate == ACELP_13k20 ) ) + { + igfPresent = 1; + } + + return igfPresent; +} + +/*-------------------------------------------------------------------* + * getCnaPresent() + * + * + *-------------------------------------------------------------------*/ + +int16_t getCnaPresent( + const int16_t element_mode, /* i : element mode */ + const int32_t element_brate, /* i : element bitrate */ + const int32_t total_brate, /* i : total bitrate */ + const int16_t bwidth /* i : audio bandwidth */ +) +{ + int16_t flag_cna = 0; + + if ( element_mode == IVAS_CPE_DFT && element_brate <= CNA_MAX_BRATE_DFT_STEREO ) + { + flag_cna = 1; + } + else + { + if ( bwidth == NB && total_brate <= ACELP_13k20 ) + { + flag_cna = 1; + } + + if ( bwidth == WB && total_brate <= ACELP_13k20 ) + { + flag_cna = 1; + } + + if ( bwidth == SWB && total_brate <= ACELP_13k20 ) + { + flag_cna = 1; + } + } + + return flag_cna; +} + +/*-------------------------------------------------------------------* + * getTcxLtp() + * + * + *-------------------------------------------------------------------*/ + +int16_t getTcxLtp( + const int32_t sr_core /* i : internal sampling rate */ +) +{ + int16_t tcxltp = 0; + + if ( sr_core <= 25600 ) + { + tcxltp = 1; + } + + return tcxltp; +} + +/*-------------------------------------------------------------------* + * initPitchLagParameters() + * + * + *-------------------------------------------------------------------*/ + +int16_t initPitchLagParameters( + const int32_t sr_core, + int16_t *pit_min, + int16_t *pit_fr1, + int16_t *pit_fr1b, + int16_t *pit_fr2, + int16_t *pit_max ) +{ + int16_t pit_res_max; + + if ( sr_core == INT_FS_12k8 ) + { + *pit_min = PIT_MIN_12k8; + *pit_max = PIT_MAX_12k8; + *pit_fr2 = PIT_FR2_12k8; + *pit_fr1 = PIT_FR1_12k8; + *pit_fr1b = PIT_FR1_8b_12k8; + pit_res_max = 4; + } + else if ( sr_core == INT_FS_16k ) + { + *pit_min = PIT_MIN_16k; + *pit_max = PIT16k_MAX; + *pit_fr2 = PIT_FR2_16k; + *pit_fr1 = PIT_FR1_16k; + *pit_fr1b = PIT_FR1_8b_16k; + pit_res_max = 6; + } + else if ( sr_core == 25600 ) + { + *pit_min = PIT_MIN_25k6; + *pit_max = PIT_MAX_25k6; + *pit_fr2 = PIT_FR2_25k6; + *pit_fr1 = PIT_FR1_25k6; + *pit_fr1b = PIT_FR1_8b_25k6; + pit_res_max = 4; + } + else /* sr_core==32000 */ + { + *pit_min = PIT_MIN_32k; + *pit_max = PIT_MAX_32k; + *pit_fr2 = PIT_FR2_32k; + *pit_fr1 = PIT_FR1_32k; + *pit_fr1b = PIT_FR1_8b_32k; + pit_res_max = 6; + } + + return pit_res_max; +} + +/*-------------------------------------------------------------------* + * getNumTcxCodedLines() + * + * + *-------------------------------------------------------------------*/ + +int16_t getNumTcxCodedLines( + const int16_t bwidth /* i : audio bandwidth */ +) +{ + int16_t tcx_coded_lines; + + switch ( bwidth ) + { + case NB: + tcx_coded_lines = 160; + break; + case WB: + tcx_coded_lines = 320; + break; + case SWB: + tcx_coded_lines = 640; + break; + case FB: + tcx_coded_lines = 960; + break; + default: + tcx_coded_lines = 0; + break; + } + + return tcx_coded_lines; +} + +/*-------------------------------------------------------------------* + * getTcxLpcShapedAri() + * + * + *-------------------------------------------------------------------*/ + +int16_t getTcxLpcShapedAri( + const int32_t total_brate, /* i : total bitrate */ + const int16_t rf_mode, /* i : flag to signal the RF mode */ + const int16_t element_mode /* i : IVAS element mode */ +) +{ + int16_t tcx_lpc_shaped_ari = 0; + + if ( ( ( element_mode <= IVAS_SCE && total_brate <= LPC_SHAPED_ARI_MAX_RATE ) || ( element_mode > IVAS_SCE && total_brate <= LPC_SHAPED_ARI_MAX_RATE_CPE ) ) || rf_mode ) + { + tcx_lpc_shaped_ari = 1; + } + + return tcx_lpc_shaped_ari; +} + + +/*-----------------------------------------------------------------------* + * init_tcx_window_cfg() + * + * Initialization of TCX windows + *-----------------------------------------------------------------------*/ + +void init_tcx_window_cfg( + TCX_CONFIG_HANDLE hTcxCfg, /* i/o: TCX Config handle */ + const int32_t sr_core, /* i : SR core */ + const int32_t input_Fs, /* i : input/output SR */ + const int16_t L_frame, /* i : L_frame at sr_core */ + const int16_t L_frameTCX, /* i : L_frame at i/o SR */ + const int16_t encoderLookahead_enc, /* i : encoder LA at sr_core */ + const int16_t encoderLookahead_FB, /* i : encoder LA at i/o SR */ + const int16_t mdctWindowLength, /* i : window length at sr_core */ + const int16_t mdctWindowLengthFB, /* i : window length at i/o SR */ + const int16_t element_mode /* i : mode of CPE/SCE */ +) +{ + /* Symmetric window = sine LD window*/ + hTcxCfg->tcx_mdct_window_delay = mdctWindowLength; + hTcxCfg->tcx_mdct_window_delayFB = mdctWindowLengthFB; + hTcxCfg->tcx_mdct_window_length = mdctWindowLength; + hTcxCfg->tcx_mdct_window_lengthFB = mdctWindowLengthFB; + + mdct_window_sine( hTcxCfg->tcx_mdct_window, sr_core, hTcxCfg->tcx_mdct_window_length, FULL_OVERLAP, element_mode ); + if ( hTcxCfg->tcx_mdct_window_length == hTcxCfg->tcx_mdct_window_lengthFB ) + { + mvr2r( hTcxCfg->tcx_mdct_window, hTcxCfg->tcx_mdct_windowFB, hTcxCfg->tcx_mdct_window_length ); + } + else + { + mdct_window_sine( hTcxCfg->tcx_mdct_windowFB, input_Fs, hTcxCfg->tcx_mdct_window_lengthFB, FULL_OVERLAP, element_mode ); + } + + /*ALDO windows for MODE2*/ + mdct_window_aldo( hTcxCfg->tcx_aldo_window_1, hTcxCfg->tcx_aldo_window_2, L_frame ); + mdct_window_aldo( hTcxCfg->tcx_aldo_window_1_FB, hTcxCfg->tcx_aldo_window_2_FB, NS2SA( input_Fs, FRAME_SIZE_NS ) ); + hTcxCfg->tcx_aldo_window_1_trunc = hTcxCfg->tcx_aldo_window_1 + NS2SA( sr_core, N_ZERO_MDCT_NS ); + hTcxCfg->tcx_aldo_window_1_FB_trunc = hTcxCfg->tcx_aldo_window_1_FB + NS2SA( input_Fs, N_ZERO_MDCT_NS ); + + /*1.25ms transition window for ACELP->TCX*/ + hTcxCfg->tcx_mdct_window_trans_length = NS2SA( sr_core, ACELP_TCX_TRANS_NS ); + mdct_window_sine( hTcxCfg->tcx_mdct_window_trans, sr_core, hTcxCfg->tcx_mdct_window_trans_length, TRANSITION_OVERLAP, element_mode ); + hTcxCfg->tcx_mdct_window_trans_lengthFB = NS2SA( input_Fs, ACELP_TCX_TRANS_NS ); + if ( hTcxCfg->tcx_mdct_window_trans_length == hTcxCfg->tcx_mdct_window_trans_lengthFB ) + { + mvr2r( hTcxCfg->tcx_mdct_window_trans, hTcxCfg->tcx_mdct_window_transFB, hTcxCfg->tcx_mdct_window_trans_length ); + } + else + { + mdct_window_sine( hTcxCfg->tcx_mdct_window_transFB, input_Fs, hTcxCfg->tcx_mdct_window_trans_lengthFB, TRANSITION_OVERLAP, element_mode ); + } + + /*Mid-OLA*/ + /*compute minimum length for "half" window: lookahead - 5ms. It must be also multiple of 2*/ + hTcxCfg->tcx_mdct_window_half_length = 2 * ( ( encoderLookahead_enc - (int16_t) ( 0.005f * sr_core + 0.5f ) ) >> 1 ); + hTcxCfg->tcx_mdct_window_half_lengthFB = 2 * ( ( encoderLookahead_FB - (int16_t) ( 0.005f * input_Fs + 0.5f ) ) >> 1 ); + assert( ( hTcxCfg->tcx_mdct_window_half_length > 16 ) && "Half window can not be large enough!" ); + + mdct_window_sine( hTcxCfg->tcx_mdct_window_half, sr_core, hTcxCfg->tcx_mdct_window_half_length, HALF_OVERLAP, element_mode ); + if ( hTcxCfg->tcx_mdct_window_half_length == hTcxCfg->tcx_mdct_window_half_lengthFB ) + { + mvr2r( hTcxCfg->tcx_mdct_window_half, hTcxCfg->tcx_mdct_window_halfFB, hTcxCfg->tcx_mdct_window_half_length ); + } + else + { + mdct_window_sine( hTcxCfg->tcx_mdct_window_halfFB, input_Fs, hTcxCfg->tcx_mdct_window_half_lengthFB, HALF_OVERLAP, element_mode ); + } + + /* minimum overlap 1.25 ms */ + hTcxCfg->tcx_mdct_window_min_length = (int16_t) ( sr_core * INV_CLDFB_BANDWIDTH ); + hTcxCfg->tcx_mdct_window_min_lengthFB = (int16_t) ( input_Fs * INV_CLDFB_BANDWIDTH ); + /* save complexity by copying the small windows if they have the same length */ + if ( hTcxCfg->tcx_mdct_window_min_length == hTcxCfg->tcx_mdct_window_trans_length ) + { + mvr2r( hTcxCfg->tcx_mdct_window_trans, hTcxCfg->tcx_mdct_window_minimum, hTcxCfg->tcx_mdct_window_min_length ); + } + else + { + mdct_window_sine( hTcxCfg->tcx_mdct_window_minimum, sr_core, hTcxCfg->tcx_mdct_window_min_length, MIN_OVERLAP, element_mode ); + } + + if ( hTcxCfg->tcx_mdct_window_min_lengthFB == hTcxCfg->tcx_mdct_window_trans_lengthFB ) + { + mvr2r( hTcxCfg->tcx_mdct_window_transFB, hTcxCfg->tcx_mdct_window_minimumFB, hTcxCfg->tcx_mdct_window_min_lengthFB ); + } + else if ( hTcxCfg->tcx_mdct_window_min_length == hTcxCfg->tcx_mdct_window_min_lengthFB ) + { + mvr2r( hTcxCfg->tcx_mdct_window_minimum, hTcxCfg->tcx_mdct_window_minimumFB, hTcxCfg->tcx_mdct_window_min_lengthFB ); + } + else + { + mdct_window_sine( hTcxCfg->tcx_mdct_window_minimumFB, input_Fs, hTcxCfg->tcx_mdct_window_min_lengthFB, MIN_OVERLAP, element_mode ); + } + + /* TCX Offset */ + hTcxCfg->tcx_offset = ( hTcxCfg->tcx_mdct_window_delay >> 1 ); + hTcxCfg->tcx_offsetFB = ( hTcxCfg->tcx_mdct_window_delayFB >> 1 ); + /*<0 rectangular transition with optimized window size = L_frame+L_frame/4*/ + hTcxCfg->lfacNext = hTcxCfg->tcx_offset - L_frame / 4; + hTcxCfg->lfacNextFB = hTcxCfg->tcx_offsetFB - L_frameTCX / 4; + + return; +} + +/*-----------------------------------------------------------------------* + * init_tcx() + * + * Initialization of TCX + *-----------------------------------------------------------------------*/ + +void init_tcx_cfg( + TCX_CONFIG_HANDLE hTcxCfg, + const int32_t total_brate, + const int32_t sr_core, + const int32_t input_Fs, + const int16_t L_frame, + const int16_t bwidth, + const int16_t L_frameTCX, + const int16_t fscale, + const int16_t encoderLookahead_enc, + const int16_t encoderLookahead_FB, + const float preemph_fac, + const int16_t tcxonly, + const int16_t rf_mode, + const int16_t igf, + const int16_t infoIGFStopFreq, + const int16_t element_mode, + const int16_t ini_frame, + const int16_t MCT_flag ) +{ + int16_t i; + int16_t mdctWindowLength; + int16_t mdctWindowLengthFB; + int16_t na_scale_bwidth; + + hTcxCfg->preemph_fac = preemph_fac; + hTcxCfg->tcx5Size = NS2SA( sr_core, FRAME_SIZE_NS / 4 ); /* Always 5 ms */ + hTcxCfg->tcx5SizeFB = NS2SA( input_Fs, FRAME_SIZE_NS / 4 ); /* Always 5 ms */ + + hTcxCfg->tcx_mdct_window_length_old = hTcxCfg->tcx_mdct_window_length; + mdctWindowLength = getMdctWindowLength( fscale ); + mdctWindowLengthFB = (int16_t) ( mdctWindowLength * input_Fs / sr_core ); + + init_tcx_window_cfg( hTcxCfg, sr_core, input_Fs, L_frame, L_frameTCX, encoderLookahead_enc, encoderLookahead_FB, mdctWindowLength, mdctWindowLengthFB, element_mode ); + + /* SQ deadzone & memory quantization*/ + hTcxCfg->sq_rounding = 0.375f; /*deadzone of 1.25->rounding=1-1.25/2 (No deadzone=0.5)*/ + + /* TCX rate loop */ + hTcxCfg->tcxRateLoopOpt = ( tcxonly ) ? 2 : 0; + hTcxCfg->tcxRateLoopOpt = ( element_mode == IVAS_CPE_MDCT ) ? 3 : hTcxCfg->tcxRateLoopOpt; + + /* TCX bandwidth */ + hTcxCfg->bandwidth = getTcxBandwidth( bwidth ); + + /* set number of coded lines */ + hTcxCfg->tcx_coded_lines = getNumTcxCodedLines( bwidth ); + + /* TNS in TCX */ + hTcxCfg->pCurrentTnsConfig = NULL; + hTcxCfg->fIsTNSAllowed = getTnsAllowed( total_brate, igf, element_mode ); + + if ( hTcxCfg->fIsTNSAllowed ) + { + InitTnsConfigs( bwidth, hTcxCfg->tcx_coded_lines, hTcxCfg->tnsConfig, infoIGFStopFreq, total_brate, element_mode, MCT_flag ); + + SetAllowTnsOnWhite( hTcxCfg->tnsConfig, element_mode == IVAS_CPE_MDCT ); + } + + if ( ini_frame == 0 ) + { + hTcxCfg->tcx_curr_overlap_mode = hTcxCfg->tcx_last_overlap_mode = ALDO_WINDOW; + hTcxCfg->last_aldo = 1; + } + + /* Context HM*/ + hTcxCfg->ctx_hm = getCtxHm( element_mode, total_brate, rf_mode ); + + /* Residual Coding*/ + hTcxCfg->resq = getResq( total_brate ); + hTcxCfg->tcxRateLoopOpt = ( hTcxCfg->resq && !tcxonly ) ? 1 : hTcxCfg->tcxRateLoopOpt; + + /*Set bandwidth scale*/ + if ( bwidth == NB ) + { + na_scale_bwidth = NB; + } + else if ( sr_core <= INT_FS_16k ) + { + na_scale_bwidth = WB; + } + else + { + na_scale_bwidth = SWB; + } + + /* Scale TCX for non-active frames to adjust loudness with ACELP*/ + hTcxCfg->na_scale = 1.f; + + if ( na_scale_bwidth < SWB && !tcxonly ) + { + for ( i = 0; i < SIZE_SCALE_TABLE_TCX; i++ ) + { + if ( ( na_scale_bwidth == scaleTcxTable[i].bwmode ) && + ( total_brate >= scaleTcxTable[i].bitrateFrom ) && + ( total_brate < scaleTcxTable[i].bitrateTo ) ) + { + if ( rf_mode ) + { + i--; + } + hTcxCfg->na_scale = scaleTcxTable[i].scale; + break; + } + } + } + + if ( tcxonly ) + { + InitPsychLPC( sr_core, L_frame, hTcxCfg ); + } + else + { + hTcxCfg->psychParamsCurrent = NULL; + } + + return; +} diff --git a/lib_com/deemph.c b/lib_com/deemph.c new file mode 100644 index 0000000000000000000000000000000000000000..26baccd04a492255c048cabe6d0dcaea5cc7e252 --- /dev/null +++ b/lib_com/deemph.c @@ -0,0 +1,71 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * deemph() + * + * Deemphasis: filtering through 1/(1-mu z^-1) + *-------------------------------------------------------------------*/ + +void deemph( + float *signal, /* i/o: signal */ + const float mu, /* i : deemphasis factor */ + const int16_t L, /* i : vector size */ + float *mem /* i/o: memory (y[-1]) */ +) +{ + int16_t i; + + signal[0] = signal[0] + mu * ( *mem ); + for ( i = 1; i < L; i++ ) + { + signal[i] = signal[i] + mu * signal[i - 1]; + } + + *mem = signal[L - 1]; + + if ( ( *mem < 1e-10 ) & ( *mem > -1e-10 ) ) + { + *mem = 0; + } + + return; +} diff --git a/lib_com/delay_comp.c b/lib_com/delay_comp.c new file mode 100644 index 0000000000000000000000000000000000000000..66c81d440c3c880a2c7cf4706a7ce51bbe5d9a74 --- /dev/null +++ b/lib_com/delay_comp.c @@ -0,0 +1,111 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "prot.h" +#include "ivas_cnst.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------------- + * get_delay() + * + * Function returns various types of delays in the codec in ns. + *--------------------------------------------------------------------------*/ + +/*! r: delay value in ns */ +int32_t get_delay( + const int16_t enc_dec, /* i : encoder/decoder flag */ + const int32_t io_fs, /* i : input/output sampling frequency */ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + HANDLE_CLDFB_FILTER_BANK hCldfb /* i : Handle of Cldfb analysis */ +) +{ + int32_t delay = 0; + + if ( enc_dec == ENC ) + { + if ( ivas_format == MONO_FORMAT ) /* EVS mono */ + { + delay = ( DELAY_FIR_RESAMPL_NS + ACELP_LOOK_NS ); + } + else /* IVAS */ + { + delay = IVAS_ENC_DELAY_NS; + + if ( ivas_format == MASA_FORMAT || ivas_format == MASA_ISM_FORMAT ) + { + delay = 0; /* All delay is compensated in the decoder with MASA */ + } + } + if ( ivas_format == SBA_FORMAT || ivas_format == SBA_ISM_FORMAT ) + { + /* compensate for DirAC/SPAR filterbank delay */ + delay += IVAS_FB_ENC_DELAY_NS; + } + } + else /* DEC */ + { + if ( ivas_format == MONO_FORMAT ) /* EVS mono */ + { + if ( io_fs == 8000 ) + { + delay = DELAY_CLDFB_NS; + } + else + { + delay = DELAY_BWE_TOTAL_NS; + } + } + else /* IVAS */ + { + delay = IVAS_DEC_DELAY_NS; + + if ( hCldfb != NULL ) + { + /* compensate for filterbank delay */ + delay += IVAS_FB_DEC_DELAY_NS; + } + + if ( ivas_format == MASA_FORMAT || ivas_format == MASA_ISM_FORMAT ) + { + delay += IVAS_ENC_DELAY_NS; /* Compensate also the encoder delay in the decoder with MASA */ + } + } + } + + return delay; +} diff --git a/lib_com/disclaimer.c b/lib_com/disclaimer.c new file mode 100644 index 0000000000000000000000000000000000000000..f8af72f54117a1a9f442daee4094c3b86e06d580 --- /dev/null +++ b/lib_com/disclaimer.c @@ -0,0 +1,56 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "prot.h" + +#define WMC_TOOL_SKIP + +int16_t print_disclaimer( FILE *fPtr ) +{ + + fprintf( fPtr, "\n==================================================================================================\n" ); + fprintf( fPtr, " IVAS Codec Baseline\n" ); + fprintf( fPtr, " \n" ); + fprintf( fPtr, " Based on EVS Codec (Floating Point) 3GPP TS26.443 Nov 04, 2021,\n" ); + fprintf( fPtr, " Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0\n" ); + fprintf( fPtr, "==================================================================================================\n\n" ); + + return 0; +} + +#undef WMC_TOOL_SKIP diff --git a/lib_com/dlpc_bfi.c b/lib_com/dlpc_bfi.c new file mode 100644 index 0000000000000000000000000000000000000000..ea701a3fed4315e755b6055a9769d3b1e5458a08 --- /dev/null +++ b/lib_com/dlpc_bfi.c @@ -0,0 +1,77 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include "options.h" +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*---------------------------------------------------------------------* + * routine: dlpc_bfi() + * + * + *---------------------------------------------------------------------*/ + +void dlpc_bfi( + const int16_t L_frame, + float *lsf_q, /* o : quantized lsfs */ + const float *lsfold, /* i : past quantized lsf */ + const int16_t last_good, /* i : last good received frame */ + const int16_t nbLostCmpt, /* i : counter of consecutive bad frames */ + float mem_MA[], /* i/o: quantizer memory for MA model */ + float *mem_AR, /* i/o: quantizer memory for AR model */ + float *stab_fac, /* i : lsf stability factor */ + float *lsf_adaptive_mean, /* i : lsf adaptive mean, updated when BFI==0 */ + const int16_t numlpc, /* i : Number of division per superframe */ + float lsf_cng[], + const int16_t plcBackgroundNoiseUpdated, + float *lsf_q_cng, /* o : quantized lsfs of background noise */ + float *old_lsf_q_cng, /* o : old quantized lsfs for background noise */ + const float lsfBase[] /* i : base for differential lsf coding */ +) +{ + lsf_dec_bfi( MODE2, &lsf_q[0], lsfold, lsf_adaptive_mean, lsfBase, mem_MA, mem_AR, *stab_fac, 0, L_frame, last_good, nbLostCmpt, plcBackgroundNoiseUpdated, lsf_q_cng, lsf_cng, old_lsf_q_cng, 0, 0, 0 ); + + if ( numlpc == 2 ) + { + /* Decode the second LPC */ + lsf_dec_bfi( MODE2, &lsf_q[M], &lsf_q[0], lsf_adaptive_mean, lsfBase, mem_MA, mem_AR, *stab_fac, 0, L_frame, last_good, nbLostCmpt + 1, plcBackgroundNoiseUpdated, lsf_q_cng, lsf_cng, old_lsf_q_cng, 0, 0, 0 ); + } + + return; +} diff --git a/lib_com/edct.c b/lib_com/edct.c new file mode 100644 index 0000000000000000000000000000000000000000..a265794f3690159fb9b78e9860613d0a6bab8ee7 --- /dev/null +++ b/lib_com/edct.c @@ -0,0 +1,417 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "wmc_auto.h" +#include /* for cosf, sinf */ + +static ivas_error get_edct_table( + const float **edct_table, + const int16_t length ) +{ + ivas_error error; + + error = IVAS_ERR_OK; + *edct_table = NULL; + + switch ( length ) + { + case 1200: + *edct_table = edct_table_600; + break; + case 960: + *edct_table = edct_table_480; + break; + case 640: + *edct_table = edct_table_320; + break; + case 320: + *edct_table = edct_table_160; + break; + case 256: + *edct_table = edct_table_128; + break; + case 240: + *edct_table = edct_table_120; + break; + case 200: + *edct_table = edct_table_100; + break; + case 160: + *edct_table = edct_table_80; + break; + case 40: + *edct_table = edct_table_20; + break; + case 800: + *edct_table = edct_table_400; + break; + case 512: + *edct_table = edct_table_256; + break; + case 480: + *edct_table = edct_table_240; + break; + case 400: + *edct_table = edct_table_200; + break; + case 128: + *edct_table = edct_table_64; + break; + case 80: + *edct_table = edct_table_40; + break; + } + + return error; +} + + +/*-----------------------------------------------------------------* + * edct() + * + * DCT-IV transform + *-----------------------------------------------------------------*/ + +void edct( + const float *x, /* i : input signal */ + float *y, /* o : output transform */ + const int16_t length, /* i : length */ + const int16_t element_mode /* i : IVAS element mode */ +) +{ + int16_t i; + float re[L_FRAME_PLUS / 2]; + float im[L_FRAME_PLUS / 2]; + const float *edct_table = 0; + float local; + + get_edct_table( &edct_table, length ); + + /* Twiddling and Pre-rotate */ + for ( i = 0; i < length / 2; i++ ) + { + re[i] = x[2 * i] * edct_table[i] + x[length - 1 - 2 * i] * edct_table[length / 2 - 1 - i]; + im[i] = x[length - 1 - 2 * i] * edct_table[i] - x[2 * i] * edct_table[length / 2 - 1 - i]; + } + + if ( element_mode == EVS_MONO ) + { + DoFFT( re, im, length / 2 ); + } + else + { + fft( re, im, length / 2, 1 ); + } + + local = ( 0.75f * EVS_PI ) / length; + + for ( i = 0; i < length / 2; i++ ) + { + float tmp; + tmp = re[i] - im[i] * local; /* 3*pi/(4*length) is a constant */ + im[i] = im[i] + re[i] * local; + re[i] = tmp; + } + + /* Post-rotate and obtain the output data */ + for ( i = 0; i < length / 2; i++ ) + { + y[2 * i] = re[i] * edct_table[i] + im[i] * edct_table[length / 2 - 1 - i]; + y[length - 1 - 2 * i] = re[i] * edct_table[length / 2 - 1 - i] - im[i] * edct_table[i]; + } + + return; +} + + +/*-------------------------------------------------------------------------* + * edst() + * + * DST-IV transform + *-------------------------------------------------------------------------*/ + +void edst( + const float *x, /* i : input signal */ + float *y, /* o : output transform */ + const int16_t length, /* i : length */ + const int16_t element_mode /* i : IVAS element mode */ +) +{ + int16_t i; + float re[L_FRAME_PLUS / 2]; + float im[L_FRAME_PLUS / 2]; + const float *edct_table = 0; + float local; + + get_edct_table( &edct_table, length ); + + /* Twiddling and Pre-rotate */ + for ( i = 0; i < length / 2; i++ ) + { + re[i] = x[length - 1 - 2 * i] * edct_table[i] + x[2 * i] * edct_table[length / 2 - 1 - i]; + im[i] = x[2 * i] * edct_table[i] - x[length - 1 - 2 * i] * edct_table[length / 2 - 1 - i]; + } + + if ( element_mode == EVS_MONO ) + { + DoFFT( re, im, length / 2 ); + } + else + { + fft( re, im, length / 2, 1 ); + } + + local = ( 0.75f * EVS_PI ) / length; + + for ( i = 0; i < length / 2; i++ ) + { + float tmp; + tmp = re[i] - im[i] * local; /* 3*pi/(4*length) is a constant */ + im[i] = im[i] + re[i] * local; + re[i] = tmp; + } + + /* Post-rotate and obtain the output data */ + for ( i = 0; i < length / 2; i++ ) + { + y[2 * i] = re[i] * edct_table[i] + im[i] * edct_table[length / 2 - 1 - i]; + y[length - 1 - 2 * i] = im[i] * edct_table[i] - re[i] * edct_table[length / 2 - 1 - i]; + } + + return; +} + +#define FAST_EDXT /* optimized FFT-based DCT/DST algorithm */ + +/*-------------------------------------------------------------------------* + * edxt() + * + * DCT/DST-II or III transform (currently also calculates DCT-IV and DST-IV) + *-------------------------------------------------------------------------*/ + +void edxt( + const float *x, /* i : input signal */ + float *y, /* o : output transform */ + const int16_t length, /* i : length */ + const uint16_t kernelType, /* i : kernel type (0 - 3) */ + const uint16_t synthesis /* i : nonzero for inverse */ +) +{ + const float pi_len = EVS_PI / length; + int16_t k, m; + +#ifdef FAST_EDXT + if ( kernelType == MDST_II || kernelType == MDCT_II ) + { + const int16_t Nm1 = length - 1; + const float xSign = 2.f * ( kernelType >> 1 ) - 1.f; + const float scale = 0.5f * pi_len; + float re[L_FRAME_PLUS]; + float im[L_FRAME_PLUS]; + + if ( !synthesis ) + { + for ( k = Nm1 >> 1; k >= 0; k-- ) /* pre-modulation of audio input */ + { + re[k] = x[2 * k]; + re[Nm1 - k] = x[2 * k + 1] * xSign; + im[k] = im[Nm1 - k] = 0.f; + } + + if ( length == 512 ) + { + DoRTFTn( re, im, 512 ); + } + else /* fft() doesn't support 512 */ + { + fft( re, im, length, 1 ); + } + + if ( kernelType >> 1 ) + { + for ( k = Nm1 >> 1; k > 0; k-- ) + { + const float wRe = cosf( scale * k ); + const float wIm = sinf( scale * k ); + + y[k] /*pt 1*/ = wRe * re[k] + wIm * im[k]; + y[length - k] = wIm * re[k] - wRe * im[k]; + } + y[length >> 1] = re[length >> 1] * sqrtf( 0.5f ); + } + else /* forw. DST-II */ + { + for ( k = Nm1 >> 1; k > 0; k-- ) + { + const float wRe = cosf( scale * k ); + const float wIm = sinf( scale * k ); + + y[Nm1 - k] = wRe * re[k] + wIm * im[k]; + y[k - 1] = wIm * re[k] - wRe * im[k]; + } + y[Nm1 >> 1] = re[length >> 1] * sqrtf( 0.5f ); + } + + y[Nm1 - Nm1 * ( kernelType >> 1 )] = re[0] * 0.5f; + } + else /* inverse II = III */ + { + if ( kernelType >> 1 ) + { + for ( k = Nm1 >> 1; k > 0; k-- ) + { + const float wRe = cosf( scale * k ) * 0.5f; + const float wIm = sinf( scale * k ) * 0.5f; + + re[k] = wRe * x[k] + wIm * x[length - k]; + im[k] = wRe * x[length - k] - wIm * x[k]; + } + re[length >> 1] = x[length >> 1] * sqrtf( 0.5f ); + } + else /* DST type III */ + { + for ( k = Nm1 >> 1; k > 0; k-- ) + { + const float wRe = cosf( scale * k ) * 0.5f; + const float wIm = sinf( scale * k ) * 0.5f; + + re[k] = wRe * x[Nm1 - k] + wIm * x[k - 1]; + im[k] = wRe * x[k - 1] - wIm * x[Nm1 - k]; + } + re[length >> 1] = x[Nm1 >> 1] * sqrtf( 0.5f ); + } + + re[0] = x[Nm1 - Nm1 * ( kernelType >> 1 )]; + im[0] = im[length >> 1] = 0.f; + for ( k = Nm1 >> 1; k > 0; k-- ) + { + re[length - k] = re[k]; + im[length - k] = -im[k]; + } + + if ( length == 512 ) + { + DoRTFTn( re, im, 512 ); + } + else /* fft() doesn't support 512 */ + { + fft( re, im, length, 1 ); + } + + for ( k = Nm1 >> 1; k >= 0; k-- ) /* post-modulation of FFT output */ + { + y[2 * k] = re[k]; + y[2 * k + 1] = re[Nm1 - k] * xSign; + } + } + } + else +#endif + if ( kernelType & 1 ) /* DST */ + { + const float offK = ( kernelType == MDST_II && synthesis ? 0.5f : 1.0f - 0.5f * ( kernelType >> 1 ) ); + const float offM = ( kernelType == MDST_II && synthesis ? 1.0f : 0.5f ); + + for ( k = 0; k < length; k++ ) + { + y[k] = 0.f; + for ( m = 0; m < length; m++ ) + { + y[k] += x[m] * sinf( pi_len * ( m + offM ) * ( k + offK ) ); + } + } + if ( offK == 1.f ) + { + y[length - 1] *= 0.5f; /* scale Nyquist sample */ + } + } + else /* kernelType 0, 2: DCT */ + { + const float offK = ( kernelType == MDCT_II && synthesis ? 0.5f : 0.5f - 0.5f * ( kernelType >> 1 ) ); + const float offM = ( kernelType == MDCT_II && synthesis ? 0.0f : 0.5f ); + + for ( k = 0; k < length; k++ ) + { + y[k] = 0.f; + for ( m = 0; m < length; m++ ) + { + y[k] += x[m] * cosf( pi_len * ( m + offM ) * ( k + offK ) ); + } + } + if ( offK == 0.f ) + { + y[0] *= 0.5f; /* scale lowest (i.e. DC) sample */ + } + } + + v_multc( y, ( kernelType == MDCT_II ? -1.f : 1.f ) * sqrtf( 2.f / length ), y, length ); + + return; +} + +/*-----------------------------------------------------------------* + * iedct_short() + * + * Inverse EDCT for short frames + *-----------------------------------------------------------------*/ + +void iedct_short( + const float *in, /* i : input vector */ + float *out, /* o : output vector */ + const int16_t segment_length, /* i : length */ + const int16_t element_mode /* i : IVAS element mode */ +) +{ + float alias[MAX_SEGMENT_LENGTH]; + int16_t i; + + edct( in, alias, segment_length / 2, element_mode ); + + for ( i = 0; i < segment_length / 4; i++ ) + { + out[i] = alias[segment_length / 4 + i]; + out[segment_length / 4 + i] = -alias[segment_length / 2 - 1 - i]; + out[segment_length / 2 + i] = -alias[segment_length / 4 - 1 - i]; + out[3 * segment_length / 4 + i] = -alias[i]; + } + + return; +} diff --git a/lib_com/enh1632.c b/lib_com/enh1632.c new file mode 100644 index 0000000000000000000000000000000000000000..1dd192faaa7d9c2d0190c781c3a18af3cdda27db --- /dev/null +++ b/lib_com/enh1632.c @@ -0,0 +1,633 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/* + =========================================================================== + File: ENH1632.C v.2.3 - 30.Nov.2009 + =========================================================================== + + ITU-T STL BASIC OPERATORS + + ENHANCED 16-BIT & 32-BIT ARITHMETIC OPERATORS + + History: + 07 Nov 04 v2.0 Incorporation of new 32-bit / 40-bit / control + operators for the ITU-T Standard Tool Library as + described in Geneva, 20-30 January 2004 WP 3/16 Q10/16 + TD 11 document and subsequent discussions on the + wp3audio@yahoogroups.com email reflector. + + ============================================================================ +*/ + + +/***************************************************************************** + * + * Enhanced 16/32 bit operators : + * s_max() + * s_min() + * L_max() + * L_min() + * shl_r() + * L_shl_r() + * L_mac0() + * L_mult0() + * L_msu0() + * s_and() + * s_or() + * s_xor() + * L_and() + * L_or() + * lshl() + * lshr() + * L_lshl() + * L_lshr() + * rotr() + * rotl() + * L_rotr() + * L_rotl() + * + *****************************************************************************/ + + +/***************************************************************************** + * + * Include-Files + * + *****************************************************************************/ + +#include +#include +#include "stl.h" + +#define WMC_TOOL_SKIP + +/***************************************************************************** + * + * Constants and Globals + * + *****************************************************************************/ + + +/***************************************************************************** + * + * Functions + * + *****************************************************************************/ + + +/***************************************************************************** + * + * Function Name : lshl + * + * Purpose : + * + * Logically shifts left var1 by var2 positions. + * - If var2 is negative, var1 is shifted to the LSBits by (-var2) + * positions with insertion of 0 at the MSBit. + * - If var2 is positive, var1 is shifted to the MSBits by (var2) + * positions. + * + * Complexity weight : 1 + * + * Inputs : + * + * var1 16 bit short signed integer (Word16) whose value falls in + * the range 0xffff 8000 <= var1 <= 0x0000 7fff. + * + * var2 16 bit short signed integer (Word16) whose value falls in + * the range 0xffff 8000 <= var2 <= 0x0000 7fff. + * + * Outputs : + * + * none + * + * Return Value: + * + * var_out 16 bit short signed integer (Word16) whose value falls in + * the range 0xffff 8000 <= var_out <= 0x0000 7fff. + * + *****************************************************************************/ +Word16 lshl( Word16 var1, Word16 var2 ) +{ + Word16 var_out = 0; + + if ( var2 < 0 ) + { + var2 = -var2; + var_out = lshr( var1, var2 ); + } + else + { + if ( var2 == 0 || var1 == 0 ) + { + var_out = var1; + } + else if ( var2 >= 16 ) + { + var_out = 0; + } + else + { + var_out = var1 << var2; + } + } + + BASOP_CHECK(); + + + return ( var_out ); +} + +/***************************************************************************** + * + * Function Name : lshr + * + * Purpose : + * + * Logically shifts right var1 by var2 positions. + * - If var2 is positive, var1 is shifted to the LSBits by (var2) + * positions with insertion of 0 at the MSBit. + * - If var2 is negative, var1 is shifted to the MSBits by (-var2) + * positions. + * + * Complexity weight : 1 + * + * Inputs : + * + * var1 16 bit short signed integer (Word16) whose value falls in + * the range 0xffff 8000 <= var1 <= 0x0000 7fff. + * + * var2 16 bit short signed integer (Word16) whose value falls in + * the range 0xffff 8000 <= var2 <= 0x0000 7fff. + * + * Outputs : + * + * none + * + * Return Value: + * + * var_out 16 bit short signed integer (Word16) whose value falls in + * the range 0xffff 8000 <= var_out <= 0x0000 7fff. + * + *****************************************************************************/ +Word16 lshr( Word16 var1, Word16 var2 ) +{ + Word16 var_out; + + if ( var2 < 0 ) + { + var2 = -var2; + var_out = lshl( var1, var2 ); + } + else + { + if ( var2 == 0 || var1 == 0 ) + { + var_out = var1; + } + else if ( var2 >= 16 ) + { + var_out = 0; + } + else + { + var_out = var1 >> 1; + var_out = var_out & 0x7fff; + var_out = var_out >> ( var2 - 1 ); + } + } + + BASOP_CHECK(); + + + return ( var_out ); +} + + +/***************************************************************************** + * + * Function Name : L_lshl + * + * Purpose : + * + * Logically shifts left L_var1 by var2 positions. + * - If var2 is negative, L_var1 is shifted to the LSBits by (-var2) + * positions with insertion of 0 at the MSBit. + * - If var2 is positive, L_var1 is shifted to the MSBits by (var2) + * positions. + * + * Complexity weight : 1 + * + * Inputs : + * + * L_var1 32 bit long signed integer (Word32) whose value falls in + * the range 0x8000 0000 <= L_var1 <= 0x7fff ffff. + * + * var2 16 bit short signed integer (Word16) whose value falls in + * the range 0xffff 8000 <= var2 <= 0x0000 7fff. + * + * Outputs : + * + * none + * + * Return Value: + * + * L_var_out 32 bit long signed integer (Word32) whose value falls in + * the range 0x8000 0000 <= L_var_out <= 0x7fff ffff. + * + *****************************************************************************/ +Word32 L_lshl( Word32 L_var1, Word16 var2 ) +{ + Word32 L_var_out = 0; + + if ( var2 < 0 ) + { + var2 = -var2; + L_var_out = L_lshr( L_var1, var2 ); + } + else + { + if ( var2 == 0 || L_var1 == 0 ) + { + L_var_out = L_var1; + } + else if ( var2 >= 32 ) + { + L_var_out = 0; + } + else + { + L_var_out = L_var1 << var2; + } + } + + BASOP_CHECK(); + + + return ( L_var_out ); +} + + +/***************************************************************************** + * + * Function Name : L_lshr + * + * Purpose : + * + * Logically shifts right L_var1 by var2 positions. + * - If var2 is positive, L_var1 is shifted to the LSBits by (var2) + * positions with insertion of 0 at the MSBit. + * - If var2 is negative, L_var1 is shifted to the MSBits by (-var2) + * positions. + * + * Complexity weight : 1 + * + * Inputs : + * + * L_var1 32 bit long signed integer (Word32) whose value falls in + * the range 0x8000 0000 <= L_var1 <= 0x7fff ffff. + * + * var2 16 bit short signed integer (Word16) whose value falls in + * the range 0xffff 8000 <= var2 <= 0x0000 7fff. + * + * Outputs : + * + * none + * + * Return Value: + * + * L_var_out 32 bit long signed integer (Word32) whose value falls in + * the range 0x8000 0000 <= L_var_out <= 0x7fff ffff. + * + *****************************************************************************/ +Word32 L_lshr( Word32 L_var1, Word16 var2 ) +{ + Word32 L_var_out; + + if ( var2 < 0 ) + { + var2 = -var2; + L_var_out = L_lshl( L_var1, var2 ); + } + else + { + if ( var2 == 0 || L_var1 == 0 ) + { + L_var_out = L_var1; + } + else if ( var2 >= 32 ) + { + L_var_out = 0; + } + else + { + L_var_out = L_var1 >> 1; + L_var_out = L_var_out & 0x7fffffff; + L_var_out = L_var_out >> ( var2 - 1 ); + } + } + + BASOP_CHECK(); + + + return ( L_var_out ); +} + + +/***************************************************************************** + * + * Function Name : shl_r + * + * Purpose : + * + * Identical to shl( var1, var2) but with rounding. Saturates the result + * in case of underflows or overflows. + * + * Complexity weight : 3 + * + * Inputs : + * + * var1 16 bit short signed integer (Word16) whose value falls in + * the range : 0xffff 8000 <= var1 <= 0x0000 7fff. + * + * var2 16 bit short signed integer (Word16) whose value falls in + * the range : 0xffff 8000 <= var2 <= 0x0000 7fff. + * + * Outputs : + * + * none + * + * Return Value : + * + * var_out 16 bit short signed integer (Word16) whose value falls in + * the range : 0xffff 8000 <= var_out <= 0x0000 7fff. + * + *****************************************************************************/ +Word16 shl_r( Word16 var1, Word16 var2 ) +{ + Word16 var_out; + + if ( var2 >= 0 ) + { + var_out = shl( var1, var2 ); + } + else + { + var2 = -var2; + var_out = shr_r( var1, var2 ); + } + + + return ( var_out ); +} + + +/***************************************************************************** + * + * Function Name : L_shl_r + * + * Purpose : + * + * Same as L_shl( var1, var2) but with rounding. Saturates the result in + * case of underflows or overflows. + * + * Complexity weight : 3 + * + * Inputs : + * + * L_var1 32 bit long signed integer (Word32) whose value falls in + * the range : 0x8000 0000 <= L_var1 <= 0x7fff ffff. + * + * var2 16 bit short signed integer (Word16) whose value falls in + * the range : 0xffff 8000 <= var2 <= 0x0000 7fff. + * + * Outputs : + * + * none + * + * Return Value : + * + * L_var_out 32 bit long signed integer (Word32) whose value falls in + * the range : 0x8000 0000 <= var_out <= 0x7fff ffff. + * + *****************************************************************************/ +Word32 L_shl_r( Word32 L_var1, Word16 var2 ) +{ + Word32 var_out; + + if ( var2 >= 0 ) + { + var_out = L_shl( L_var1, var2 ); + } + else + { + var2 = -var2; + var_out = L_shr_r( L_var1, var2 ); + } + + + return ( var_out ); +} + + +/***************************************************************************** + * + * Function Name : rotr + * + * Purpose : + * + * Performs a 16-bit logical rotation of var1 by 1 bit to the LSBits. The + * MSBit is set to var2 bit 0. The LSBit of var1 is kept in *var3 bit 0. + * + * Complexity weight : 3 + * + * Inputs : + * + * var1 16 bit short signed integer (Word16) whose value falls in + * the range : 0xffff 8000 <= var1 <= 0x0000 7fff. + * + * var2 16 bit short signed integer (Word16) whose value must be 0 + * or 1. + * + * Outputs : + * + * *var3 Points on a 16 bit short signed integer (Word16) whose + * value will be 0 or 1. + * + * Return Value : + * + * var_out 16 bit short signed integer (Word16) whose value falls in + * the range : 0xffff 8000 <= var_out <= 0x0000 7fff. + * + *****************************************************************************/ +Word16 rotr( Word16 var1, Word16 var2, Word16 *var3 ) +{ + Word16 var_out; + + *var3 = s_and( var1, 0x1 ); + var_out = s_or( lshr( var1, 1 ), lshl( var2, 15 ) ); + + + return ( var_out ); +} + + +/***************************************************************************** + * + * Function Name : rotl + * + * Purpose : + * + * Performs a 16-bit logical rotation of var1 by 1 bit to the MSBits. The + * LSBit is set to var2 bit 0. The MSBit of var1 is kept in *var3 bit 0. + * + * Complexity weight : 3 + * + * Inputs : + * + * var1 16 bit short signed integer (Word16) whose value falls in + * the range : 0xffff 8000 <= var1 <= 0x0000 7fff. + * + * var2 16 bit short signed integer (Word16) whose value must be 0 + * or 1. + * + * Outputs : + * + * *var3 Points on a 16 bit short signed integer (Word16) whose + * value will be 0 or 1. + * + * Return Value : + * + * var_out 16 bit short signed integer (Word16) whose value falls in + * the range : 0xffff 8000 <= var_out <= 0x0000 7fff. + * + *****************************************************************************/ +Word16 rotl( Word16 var1, Word16 var2, Word16 *var3 ) +{ + Word16 var_out; + + *var3 = lshr( var1, 15 ); + + var_out = s_or( lshl( var1, 1 ), s_and( var2, 0x1 ) ); + + + return ( var_out ); +} + + +/***************************************************************************** + * + * Function Name : L_rotr + * + * Purpose : + * + * Performs a 32-bit logical rotation of L_var1 by 1 bit to the LSBits. The + * MSBit is set to var2 bit 0. The LSBit of L_var1 is kept in *var3 bit 0. + * + * Complexity weight : 3 + * + * Inputs : + * + * L_var1 32 bit long signed integer (Word32) whose value falls in + * the range : 0x8000 0000 <= L_var1 <= 0x7fff ffff. + * + * var2 16 bit short signed integer (Word16) whose value must be 0 + * or 1. + * + * Outputs : + * + * *var3 Points on a 16 bit short signed integer (Word16) whose + * value will be 0 or 1. + * + * Return Value : + * + * L_var_out 32 bit long signed integer (Word32) whose value falls in + * the range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. + * + *****************************************************************************/ +Word32 L_rotr( Word32 L_var1, Word16 var2, Word16 *var3 ) +{ + Word32 L_var_out; + + *var3 = s_and( extract_l( L_var1 ), 0x1 ); + + L_var_out = L_or( L_lshr( L_var1, 1 ), L_lshl( L_deposit_l( var2 ), 31 ) ); + + + return ( L_var_out ); +} + + +/***************************************************************************** + * + * Function Name : L_rotl + * + * Purpose : + * + * Performs a 32-bit logical rotation of L_var1 by 1 bit to the MSBits. The + * LSBit is set to var2 bit 0. The MSBit of L_var1 is kept in *var3 bit 0. + * + * Complexity weight : 3 + * + * Inputs : + * + * L_var1 32 bit long signed integer (Word32) whose value falls in + * the range : 0x8000 0000 <= L_var1 <= 0x7fff ffff. + * + * var2 16 bit short signed integer (Word16) whose value must be 0 + * or 1. + * + * Outputs : + * + * *var3 Points on a 16 bit short signed integer (Word16) whose + * value will be 0 or 1. + * + * Return Value : + * + * L_var_out 32 bit long signed integer (Word32) whose value falls in + * the range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. + * + *****************************************************************************/ +Word32 L_rotl( Word32 L_var1, Word16 var2, Word16 *var3 ) +{ + Word32 L_var_out; + + *var3 = extract_l( L_lshr( L_var1, 31 ) ); + + L_var_out = L_or( L_lshl( L_var1, 1 ), L_deposit_l( s_and( var2, 0x1 ) ) ); + + + return ( L_var_out ); +} + +#undef WMC_TOOL_SKIP diff --git a/lib_com/enh1632.h b/lib_com/enh1632.h new file mode 100644 index 0000000000000000000000000000000000000000..9216ea6c201a3b63690723318b65ea19367445c2 --- /dev/null +++ b/lib_com/enh1632.h @@ -0,0 +1,508 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/* + =========================================================================== + File: ENH1632.H v.2.3 - 30.Nov.2009 + =========================================================================== + + ITU-T STL BASIC OPERATORS + + ENHANCED 16-BIT & 32-BIT ARITHMETIC OPERATORS + + History: + 07 Nov 04 v2.0 Incorporation of new 32-bit / 40-bit / control + operators for the ITU-T Standard Tool Library as + described in Geneva, 20-30 January 2004 WP 3/16 Q10/16 + TD 11 document and subsequent discussions on the + wp3audio@yahoogroups.com email reflector. + March 06 v2.1 Changed to improve portability. + Some counters incrementations were missing (s_and, + s_or, s_xor). + 30 Nov 09 v2.3 saturate() removed + + ============================================================================ +*/ + + +#ifndef _ENH1632_H +#define _ENH1632_H + + +/***************************************************************************** + * + * Constants and Globals + * + *****************************************************************************/ + + +#include "stl.h" + + +/***************************************************************************** + * + * Prototypes for enhanced 16/32 bit arithmetic operators + * + *****************************************************************************/ +Word16 shl_r( Word16 var1, Word16 var2 ); +Word32 L_shl_r( Word32 L_var1, Word16 var2 ); + + +Word16 lshl( Word16 var1, Word16 var2 ); +Word16 lshr( Word16 var1, Word16 var2 ); +Word32 L_lshl( Word32 L_var1, Word16 var2 ); +Word32 L_lshr( Word32 L_var1, Word16 var2 ); + +Word16 rotr( Word16 var1, Word16 var2, Word16 *var3 ); +Word16 rotl( Word16 var1, Word16 var2, Word16 *var3 ); +Word32 L_rotr( Word32 var1, Word16 var2, Word16 *var3 ); +Word32 L_rotl( Word32 var1, Word16 var2, Word16 *var3 ); + + +/***************************************************************************** + * + * Functions + * + *****************************************************************************/ + +/***************************************************************************** + * + * Function Name : s_max + * + * Purpose : + * + * Compares var1 and var2 and returns the maximum value. + * + * Complexity weight : 1 + * + * Inputs : + * + * var1 16 bit short signed integer (Word16) whose value falls in + * the range : 0x8000 <= var1 <= 0x7fff. + * + * var2 16 bit short signed integer (Word16) whose value falls in + * the range : 0x8000 <= var2 <= 0x7fff. + * + * Outputs : + * + * none + * + * Return Value : + * + * var_out 16 bit short signed integer (Word16) whose value falls in + * the range : 0x8000 <= L_var_out <= 0x7fff. + * + *****************************************************************************/ +static __inline Word16 s_max( Word16 var1, Word16 var2 ) +{ + Word16 var_out; + + if ( var1 >= var2 ) + var_out = var1; + else + var_out = var2; + + + return ( var_out ); +} + + +/***************************************************************************** + * + * Function Name : s_min + * + * Purpose : + * + * Compares var1 and var2 and returns the minimum value. + * + * Complexity weight : 1 + * + * Inputs : + * + * var1 16 bit short signed integer (Word16) whose value falls in + * the range : 0x8000 <= var1 <= 0x7fff. + * + * var2 16 bit short signed integer (Word16) whose value falls in + * the range : 0x8000 <= var2 <= 0x7fff. + * + * Outputs : + * + * none + * + * Return Value : + * + * var_out 16 bit short signed integer (Word16) whose value falls in + * the range : 0x8000 <= var_out <= 0x7fff. + * + *****************************************************************************/ +static __inline Word16 s_min( Word16 var1, Word16 var2 ) +{ + Word16 var_out; + + if ( var1 <= var2 ) + var_out = var1; + else + var_out = var2; + + + return ( var_out ); +} + + +/***************************************************************************** + * + * Function Name : L_max + * + * Purpose : + * + * Compares L_var1 and L_var2 and returns the maximum value. + * + * Complexity weight : 1 + * + * Inputs : + * + * L_var1 32 bit long signed integer (Word32) whose value falls in the + * range : 0x8000 0000 <= L_var1 <= 0x7fff ffff. + * + * L_var2 32 bit long signed integer (Word32) whose value falls in the + * range : 0x8000 0000 <= L_var2 <= 0x7fff ffff. + * + * Outputs : + * + * none + * + * Return Value : + * + * L_var_out 32 bit long signed integer (Word32) whose value falls in the + * range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. + * + *****************************************************************************/ +static __inline Word32 L_max( Word32 L_var1, Word32 L_var2 ) +{ + Word32 L_var_out; + + if ( L_var1 >= L_var2 ) + L_var_out = L_var1; + else + L_var_out = L_var2; + + + return ( L_var_out ); +} + + +/***************************************************************************** + * + * Function Name : L_min + * + * Purpose : + * + * Compares L_var1 and L_var2 and returns the minimum value. + * + * Complexity weight : 1 + * + * Inputs : + * + * L_var1 32 bit long signed integer (Word32) whose value falls in the + * range : 0x8000 0000 <= L_var1 <= 0x7fff ffff. + * + * L_var2 32 bit long signed integer (Word32) whose value falls in the + * range : 0x8000 0000 <= L_var2 <= 0x7fff ffff. + * + * Outputs : + * + * none + * + * Return Value : + * + * L_var_out 32 bit long signed integer (Word32) whose value falls in the + * range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. + * + *****************************************************************************/ +static __inline Word32 L_min( Word32 L_var1, Word32 L_var2 ) +{ + Word32 L_var_out; + + if ( L_var1 <= L_var2 ) + L_var_out = L_var1; + else + L_var_out = L_var2; + + + return ( L_var_out ); +} + + +/***************************************************************************** + * + * Function Name : s_and + * + * Purpose : + * + * Performs logical AND of the two 16 bit input variables. + * var_out = var1 & var2 + * + * Complexity weight : 1 + * + * Inputs : + * + * var1 16 bit short signed integer (Word16) whose value + * falls in the range 0xffff 8000 <= var1 <= 0x0000 7fff. + * + * var2 16 bit short signed integer (Word16) whose value + * falls in the range 0xffff 8000 <= var2 <= 0x0000 7fff. + * + * Outputs : + * + * none + * + * Return Value : + * + * var_out 16 bit short signed integer (Word16) whose value + * falls in the range 0xffff 8000 <= var_out <= 0x0000 7fff. + * + *****************************************************************************/ +static __inline Word16 s_and( Word16 var1, Word16 var2 ) +{ + Word16 var_out; + + var_out = var1 & var2; + + + return ( var_out ); +} + + +/***************************************************************************** + * + * Function Name : L_and + * + * Purpose : + * + * Performs logical AND of the two 32 bit input variables. + * L_var_out = L_var1 & L_var2 + * + * Complexity weight : 1 + * + * Inputs : + * + * L_var1 32 bit long signed integer (Word32) whose value + * falls in the range 0x8000 0000 <= L_var1 <= 0x7fff ffff. + * + * L_var2 32 bit long signed integer (Word32) whose value + * falls in the range 0x8000 0000 <= L_var2 <= 0x7fff ffff. + * + * Outputs : + * + * none + * + * Return Value : + * + * L_var_out 32 bit long signed integer (Word32) whose value + * falls in the range 0x8000 0000 <= L_var_out <= 0x7fff ffff. + * + *****************************************************************************/ +static __inline Word32 L_and( Word32 L_var1, Word32 L_var2 ) +{ + Word32 L_var_out; + + L_var_out = L_var1 & L_var2; + + + return ( L_var_out ); +} + + +/***************************************************************************** + * + * Function Name : s_or + * + * Purpose : + * + * Performs logical OR of the two 16 bit input variables. + * var_out = var1 | var2 + * + * Complexity weight : 1 + * + * Inputs : + * + * var1 16 bit short signed integer (Word16) whose value + * falls in the range 0xffff 8000 <= var1 <= 0x0000 7fff. + * + * var2 16 bit short signed integer (Word16) whose value + * falls in the range 0xffff 8000 <= var2 <= 0x0000 7fff. + * + * Outputs : + * + * none + * + * Return Value : + * + * var_out 16 bit short signed integer (Word16) whose value + * falls in the range 0xffff 8000 <= var_out <= 0x0000 7fff. + * + *****************************************************************************/ +static __inline Word16 s_or( Word16 var1, Word16 var2 ) +{ + Word16 var_out; + + var_out = var1 | var2; + + + return ( var_out ); +} + + +/***************************************************************************** + * + * Function Name : L_or + * + * Purpose : + * + * Performs logical OR of the two 32 bit input variables. + * L_var_out = L_var1 | L_var2 + * + * Complexity weight : 1 + * + * Inputs : + * + * L_var1 32 bit long signed integer (Word32) whose value + * falls in the range 0x8000 0000 <= L_var1 <= 0x7fff ffff. + * + * L_var2 32 bit long signed integer (Word32) whose value + * falls in the range 0x8000 0000 <= L_var2 <= 0x7fff ffff. + * + * Outputs : + * + * none + * + * Return Value : + * + * L_var_out 32 bit long signed integer (Word32) whose value + * falls in the range 0x8000 0000 <= L_var_out <= 0x7fff ffff. + * + *****************************************************************************/ +static __inline Word32 L_or( Word32 L_var1, Word32 L_var2 ) +{ + + Word32 L_var_out; + + L_var_out = L_var1 | L_var2; + + + return ( L_var_out ); +} + + +/***************************************************************************** + * + * Function Name : s_xor + * + * Purpose : + * + * Performs logical XOR of the two 16 bit input variables. + * var_out = var1 ^ var2 + * + * Complexity weight : 1 + * + * Inputs : + * + * var1 16 bit short signed integer (Word16) whose value + * falls in the range 0xffff 8000 <= var1 <= 0x0000 7fff. + * + * var2 16 bit short signed integer (Word16) whose value + * falls in the range 0xffff 8000 <= var2 <= 0x0000 7fff. + * + * Outputs : + * + * none + * + * Return Value : + * + * var_out 16 bit short signed integer (Word16) whose value + * falls in the range 0xffff 8000 <= var_out <= 0x0000 7fff. + * + *****************************************************************************/ +static __inline Word16 s_xor( Word16 var1, Word16 var2 ) +{ + Word16 var_out; + + var_out = var1 ^ var2; + + + return ( var_out ); +} + + +/***************************************************************************** + * + * Function Name : L_xor + * + * Purpose : + * + * Performs logical OR of the two 32 bit input variables. + * L_var_out = L_var1 ^ L_var2 + * + * Complexity weight : 1 + * + * Inputs : + * + * L_var1 32 bit long signed integer (Word32) whose value + * falls in the range 0x8000 0000 <= L_var1 <= 0x7fff ffff. + * + * L_var2 32 bit long signed integer (Word32) whose value + * falls in the range 0x8000 0000 <= L_var2 <= 0x7fff ffff. + * + * Outputs : + * + * none + * + * Return Value : + * + * L_var_out 32 bit long signed integer (Word32) whose value + * falls in the range 0x8000 0000 <= L_var_out <= 0x7fff ffff. + * + *****************************************************************************/ +static __inline Word32 L_xor( Word32 L_var1, Word32 L_var2 ) +{ + Word32 L_var_out; + + L_var_out = L_var1 ^ L_var2; + + + return ( L_var_out ); +} + + +#endif /*_ENH1632_H*/ + +/* end of file */ diff --git a/lib_com/enh40.c b/lib_com/enh40.c new file mode 100644 index 0000000000000000000000000000000000000000..8a48cece39bed8b7e709fedb9bd8c9b40c5354a0 --- /dev/null +++ b/lib_com/enh40.c @@ -0,0 +1,1309 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/* + =========================================================================== + File: ENH40.C v.2.3 - 30.Nov.2009 + =========================================================================== + + ITU-T STL BASIC OPERATORS + + 40-BIT ARITHMETIC OPERATORS + + History: + 07 Nov 04 v2.0 Incorporation of new 32-bit / 40-bit / control + operators for the ITU-T Standard Tool Library as + described in Geneva, 20-30 January 2004 WP 3/16 Q10/16 + TD 11 document and subsequent discussions on the + wp3audio@yahoogroups.com email reflector. + + ============================================================================ +*/ + + +/***************************************************************************** + * + * Enhanced 40 bit operators : + * + * L40_add() + * L40_sub() + * L40_abs() + * L40_negate() + * L40_max() + * L40_min() + * L40_shr() + * L40_shr_r() + * L40_shl() + * L40_shl_r() + * norm_L40() + * L40_mult() + * L40_mac() + * L40_msu() + * mac_r40() + * msu_r40() + * Mpy_32_16_ss() + * Mpy_32_32_ss() + * L40_lshl() + * L40_lshr() + * L40_round() + * L_saturate40() + * L40_set() + * Extract40_H() + * Extract40_L() + * L_Extract40() + * L40_deposit_h() + * L40_deposit_l() + * L40_deposit32() + * + *****************************************************************************/ + + +/***************************************************************************** + * + * Include-Files + * + *****************************************************************************/ + +#include +#include +#include "stl.h" +#ifdef BASOP_NOGLOB +#include +#endif /* BASOP_NOGLOB */ + +#define WMC_TOOL_SKIP + +#ifdef _MSC_VER +#pragma warning( disable : 4310 ) +#endif + +/***************************************************************************** + * + * Local Functions + * + *****************************************************************************/ + + +/***************************************************************************** + * + * Constants and Globals + * + *****************************************************************************/ + + +/***************************************************************************** + * + * Functions + * + *****************************************************************************/ + +/***************************************************************************** + * + * Function Name : L40_shl + * + * Purpose : + * + * Arithmetically shifts left L40_var1 by var2 positions. + * - If var2 is negative, L40_var1 is shifted to the LSBits by (-var2) + * positions with extension of the sign bit. + * - If var2 is positive, L40_var1 is shifted to the MSBits by (var2) + * positions. + * Calls the macro L40_UNDERFLOW_OCCURED() in case of underflow on 40-bit. + * Calls the macro L40_OVERFLOW_OCCURED() in case of overflow on 40-bit. + * + * Complexity weight : 1 + * + * Inputs : + * + * L40_var1 40 bit long signed integer (Word40) whose value falls in the + * range : MIN_40 <= L40_var1 <= MAX_40. + * + * var2 16 bit short signed integer (Word16) whose value falls in + * the range : MIN_16 <= var2 <= MAX_16. + * + * Outputs : + * + * none + * + * Return Value : + * + * L40_var_out 40 bit long signed integer (Word40) whose value falls in + * the range : MIN_40 <= L40_var_out <= MAX_40. + * + *****************************************************************************/ +#ifndef BASOP_NOGLOB +Word40 L40_shl( Word40 L40_var1, Word16 var2 ) +#else /* BASOP_NOGLOB */ +Word40 L40_shl_o( Word40 L40_var1, Word16 var2, Flag *Overflow ) +#endif /* BASOP_NOGLOB */ +{ + + Word40 L40_var_out; + Word40 L40_constant; + +#if defined( _MSC_VER ) && ( _MSC_VER <= 1200 ) + L40_constant = L40_set( 0xc000000000 ); +#else + L40_constant = L40_set( 0xc000000000LL ); +#endif + + if ( var2 < 0 ) + { + var2 = -var2; + L40_var_out = L40_shr( L40_var1, var2 ); + } + + else + { + L40_var_out = L40_var1; + + for ( ; var2 > 0; var2-- ) + { +#if defined( _MSC_VER ) && ( _MSC_VER <= 1200 ) + if ( L40_var_out > 0x003fffffffff ) +#else + if ( L40_var_out > 0x003fffffffffLL ) +#endif + { +#ifndef BASOP_NOGLOB + Overflow = 1; + exit( 1 ); + /* L40_var_out = L40_OVERFLOW_OCCURED( L40_var_out); */ +#else /* BASOP_NOGLOB */ + *Overflow = 1; + L40_var_out = MAX_40; +#endif /* BASOP_NOGLOB */ + break; + } + + else if ( L40_var_out < L40_constant ) + { +#ifndef BASOP_NOGLOB + Overflow = 1; + exit( 2 ); + /* L40_var_out = L40_UNDERFLOW_OCCURED( L40_var_out); */ +#else /* BASOP_NOGLOB */ + *Overflow = 1; + L40_var_out = MIN_40; +#endif /* BASOP_NOGLOB */ + break; + } + + else + { + L40_var_out = L40_var_out << 1; + } + } + } + + BASOP_CHECK(); + + + return ( L40_var_out ); +} + +#ifdef BASOP_NOGLOB +Word40 L40_shl( Word40 L40_var1, Word16 var2 ) +{ + + Word40 L40_var_out; + Word40 L40_constant; + +#if defined( _MSC_VER ) && ( _MSC_VER <= 1200 ) + L40_constant = L40_set( 0xc000000000 ); +#else + L40_constant = L40_set( 0xc000000000LL ); +#endif + + if ( var2 < 0 ) + { + var2 = -var2; + L40_var_out = L40_shr( L40_var1, var2 ); + } + + else + { + L40_var_out = L40_var1; + + for ( ; var2 > 0; var2-- ) + { +#if defined( _MSC_VER ) && ( _MSC_VER <= 1200 ) + if ( L40_var_out > 0x003fffffffff ) +#else + if ( L40_var_out > 0x003fffffffffLL ) +#endif + { + assert( 0 ); + L40_var_out = MAX_40; + break; + } + + else if ( L40_var_out < L40_constant ) + { + assert( 0 ); + L40_var_out = MIN_40; + break; + } + + else + { + L40_var_out = L40_var_out << 1; + } + } + } + + BASOP_CHECK(); + + + return ( L40_var_out ); +} +#endif /* BASOP_NOGLOB */ + +/***************************************************************************** + * + * Function Name : L40_shr + * + * Purpose : + * + * Arithmetically shifts right L40_var1 by var2 positions. + * - If var2 is positive, L40_var1 is shifted to the LSBits by (var2) + * positions with extension of the sign bit. + * - If var2 is negative, L40_var1 is shifted to the MSBits by (-var2) + * positions. + * Calls the macro L40_UNDERFLOW_OCCURED() in case of underflow on 40-bit. + * Calls the macro L40_OVERFLOW_OCCURED() in case of overflow on 40-bit. + * + * Complexity weight : 1 + * + * Inputs : + * + * L40_var1 40 bit long signed integer (Word40) whose value falls in the + * range : MIN_40 <= L40_var1 <= MAX_40. + * + * var2 16 bit short signed integer (Word16) whose value falls in + * the range : MIN_16 <= var2 <= MAX_16. + * + * Outputs : + * + * none + * + * Return Value : + * + * L40_var_out 40 bit long signed integer (Word40) whose value falls in + * the range : MIN_40 <= L40_var_out <= MAX_40. + * + *****************************************************************************/ +Word40 L40_shr( Word40 L40_var1, Word16 var2 ) +{ + Word40 L40_var_out; + + if ( var2 < 0 ) + { + var2 = -var2; + L40_var_out = L40_shl( L40_var1, var2 ); + } + else + { + L40_var_out = L40_var1 >> var2; + } + + + return ( L40_var_out ); +} + + +/***************************************************************************** + * + * Function Name : L40_negate + * + * Purpose : + * + * Negates L40_var1. + * Calls the macro L40_UNDERFLOW_OCCURED() in case of underflow on 40-bit. + * Calls the macro L40_OVERFLOW_OCCURED() in case of overflow on 40-bit. + * + * Complexity weight : 1 + * + * Inputs : + * + * L40_var1 40 bit long signed integer (Word40) whose value falls in the + * range : MIN_40 <= L40_var1 <= MAX_40. + * + * Outputs : + * + * none + * + * Return Value : + * + * L40_var_out 40 bit long signed integer (Word40) whose value falls in + * the range : MIN_40 <= L40_var_out <= MAX_40. + * + *****************************************************************************/ +Word40 L40_negate( Word40 L40_var1 ) +{ + Word40 L40_var_out; + + L40_var_out = L40_add( ~L40_var1, 0x01 ); + + return ( L40_var_out ); +} + + +/***************************************************************************** + * + * Function Name : L40_add + * + * Purpose : + * + * Adds L40_var1 and L40_var2 and returns the 40-bit result. + * Calls the macro L40_UNDERFLOW_OCCURED() in case of underflow on 40-bit. + * Calls the macro L40_OVERFLOW_OCCURED() in case of overflow on 40-bit. + * + * Complexity weight : 1 + * + * Inputs : + * + * L40_var1 40 bit long signed integer (Word40) whose value falls in the + * range : MIN_40 <= L40_var1 <= MAX_40. + * + * L40_var2 40 bit long signed integer (Word40) whose value falls in the + * range : MIN_40 <= L40_var2 <= MAX_40. + * + * Outputs : + * + * none + * + * Return Value : + * + * L40_var_out 40 bit long signed integer (Word40) whose value falls in + * the range : MIN_40 <= L40_var_out <= MAX_40. + * + *****************************************************************************/ +#ifdef BASOP_NOGLOB + +Word40 L40_add_o( Word40 L40_var1, Word40 L40_var2, Flag *Overflow ) +{ + Word40 L40_var_out; + + L40_var_out = L40_var1 + L40_var2; + +#if defined( _MSC_VER ) && ( _MSC_VER <= 1200 ) + if ( ( ( ( L40_var1 & 0x8000000000 ) >> 39 ) != 0 ) && ( ( ( L40_var2 & 0x8000000000 ) >> 39 ) != 0 ) && ( ( ( L40_var_out & 0x8000000000 ) >> 39 ) == 0 ) ) + { + *Overflow = 1; + L40_var_out = MIN_40; + } + else if ( ( ( ( L40_var1 & 0x8000000000 ) >> 39 ) == 0 ) && ( ( ( L40_var2 & 0x8000000000 ) >> 39 ) == 0 ) && ( ( ( L40_var_out & 0x8000000000 ) >> 39 ) != 0 ) ) + { + *Overflow = 1; + L40_var_out = MAX_40; + } +#else + if ( ( ( ( L40_var1 & 0x8000000000LL ) >> 39 ) != 0 ) && ( ( ( L40_var2 & 0x8000000000LL ) >> 39 ) != 0 ) && ( ( ( L40_var_out & 0x8000000000LL ) >> 39 ) == 0 ) ) + { + *Overflow = 1; + L40_var_out = MIN_40; + } + else if ( ( ( ( L40_var1 & 0x8000000000LL ) >> 39 ) == 0 ) && ( ( ( L40_var2 & 0x8000000000LL ) >> 39 ) == 0 ) && ( ( ( L40_var_out & 0x8000000000LL ) >> 39 ) != 0 ) ) + { + *Overflow = 1; + L40_var_out = MAX_40; + } +#endif + + BASOP_CHECK(); + + + return ( L40_var_out ); +} + +#endif /* BASOP_NOGLOB */ +Word40 L40_add( Word40 L40_var1, Word40 L40_var2 ) +{ + Word40 L40_var_out; + + L40_var_out = L40_var1 + L40_var2; + +#if defined( _MSC_VER ) && ( _MSC_VER <= 1200 ) + if ( ( ( ( L40_var1 & 0x8000000000 ) >> 39 ) != 0 ) && ( ( ( L40_var2 & 0x8000000000 ) >> 39 ) != 0 ) && ( ( ( L40_var_out & 0x8000000000 ) >> 39 ) == 0 ) ) + { +#ifndef BASOP_NOGLOB + Overflow = 1; + exit( 2 ); + /* L40_var_out = L40_UNDERFLOW_OCCURED( L40_var_out); */ +#else /* BASOP_NOGLOB */ + assert( 0 ); + L40_var_out = MIN_40; +#endif /* BASOP_NOGLOB */ + } + else if ( ( ( ( L40_var1 & 0x8000000000 ) >> 39 ) == 0 ) && ( ( ( L40_var2 & 0x8000000000 ) >> 39 ) == 0 ) && ( ( ( L40_var_out & 0x8000000000 ) >> 39 ) != 0 ) ) + { +#ifndef BASOP_NOGLOB + Overflow = 1; + exit( 1 ); + /* L40_var_out = L40_OVERFLOW_OCCURED( L40_var_out); */ +#else /* BASOP_NOGLOB */ + assert( 0 ); + L40_var_out = MAX_40; +#endif /* BASOP_NOGLOB */ + } +#else + if ( ( ( ( L40_var1 & 0x8000000000LL ) >> 39 ) != 0 ) && ( ( ( L40_var2 & 0x8000000000LL ) >> 39 ) != 0 ) && ( ( ( L40_var_out & 0x8000000000LL ) >> 39 ) == 0 ) ) + { +#ifndef BASOP_NOGLOB + Overflow = 1; + exit( 2 ); + /* L40_var_out = L40_UNDERFLOW_OCCURED( L40_var_out); */ +#else /* BASOP_NOGLOB */ + assert( 0 ); + L40_var_out = MIN_40; +#endif /* BASOP_NOGLOB */ + } + else if ( ( ( ( L40_var1 & 0x8000000000LL ) >> 39 ) == 0 ) && ( ( ( L40_var2 & 0x8000000000LL ) >> 39 ) == 0 ) && ( ( ( L40_var_out & 0x8000000000LL ) >> 39 ) != 0 ) ) + { +#ifndef BASOP_NOGLOB + Overflow = 1; + exit( 1 ); + /* L40_var_out = L40_OVERFLOW_OCCURED( L40_var_out); */ +#else /* BASOP_NOGLOB */ + assert( 0 ); + L40_var_out = MAX_40; +#endif /* BASOP_NOGLOB */ + } +#endif + + BASOP_CHECK(); + + + return ( L40_var_out ); +} + + +/***************************************************************************** + * + * Function Name : L40_sub + * + * Purpose : + * + * Subtracts L40_var2 from L40_var1. + * Calls the macro L40_UNDERFLOW_OCCURED() in case of underflow on 40-bit. + * Calls the macro L40_OVERFLOW_OCCURED() in case of overflow on 40-bit. + * + * Complexity weight : 1 + * + * Inputs : + * + * L40_var1 40 bit long signed integer (Word40) whose value falls in the + * range : MIN_40 <= L40_var1 <= MAX_40. + * + * L40_var2 40 bit long signed integer (Word40) whose value falls in the + * range : MIN_40 <= L40_var2 <= MAX_40. + * + * Outputs : + * + * none + * + * Return Value : + * + * L40_var_out 40 bit long signed integer (Word40) whose value falls in + * the range : MIN_40 <= L40_var_out <= MAX_40. + * + *****************************************************************************/ +#ifndef BASOP_NOGLOB +Word40 L40_sub( Word40 L40_var1, Word40 L40_var2 ) +#else /* BASOP_NOGLOB */ +Word40 L40_sub_o( Word40 L40_var1, Word40 L40_var2, Flag *Overflow ) +#endif /* BASOP_NOGLOB */ +{ + Word40 L40_var_out; + + L40_var_out = L40_var1 - L40_var2; + +#if defined( _MSC_VER ) && ( _MSC_VER <= 1200 ) + if ( ( ( ( L40_var1 & 0x8000000000 ) >> 39 ) != 0 ) && ( ( ( L40_var2 & 0x8000000000 ) >> 39 ) == 0 ) && ( ( ( L40_var_out & 0x8000000000 ) >> 39 ) == 0 ) ) + { +#ifndef BASOP_NOGLOB + Overflow = 1; + exit( 2 ); + /* L40_var_out = L40_UNDERFLOW_OCCURED( L40_var_out); */ +#else /* BASOP_NOGLOB */ + *Overflow = 1; + L40_var_out = MIN_40; +#endif /* BASOP_NOGLOB */ + } + else if ( ( ( ( L40_var1 & 0x8000000000 ) >> 39 ) == 0 ) && ( ( ( L40_var2 & 0x8000000000 ) >> 39 ) != 0 ) && ( ( ( L40_var_out & 0x8000000000 ) >> 39 ) != 0 ) ) + { +#ifndef BASOP_NOGLOB + Overflow = 1; + exit( 1 ); + /* L40_var_out = L40_OVERFLOW_OCCURED( L40_var_out); */ +#else /* BASOP_NOGLOB */ + *Overflow = 1; + L40_var_out = MAX_40; +#endif /* BASOP_NOGLOB */ + } +#else + if ( ( ( ( L40_var1 & 0x8000000000LL ) >> 39 ) != 0 ) && ( ( ( L40_var2 & 0x8000000000LL ) >> 39 ) == 0 ) && ( ( ( L40_var_out & 0x8000000000LL ) >> 39 ) == 0 ) ) + { +#ifndef BASOP_NOGLOB + Overflow = 1; + exit( 2 ); + /* L40_var_out = L40_UNDERFLOW_OCCURED( L40_var_out); */ +#else /* BASOP_NOGLOB */ + *Overflow = 1; + L40_var_out = MIN_40; +#endif /* BASOP_NOGLOB */ + } + else if ( ( ( ( L40_var1 & 0x8000000000LL ) >> 39 ) == 0 ) && ( ( ( L40_var2 & 0x8000000000LL ) >> 39 ) != 0 ) && ( ( ( L40_var_out & 0x8000000000LL ) >> 39 ) != 0 ) ) + { +#ifndef BASOP_NOGLOB + Overflow = 1; + exit( 1 ); + /* L40_var_out = L40_OVERFLOW_OCCURED( L40_var_out); */ +#else /* BASOP_NOGLOB */ + *Overflow = 1; + L40_var_out = MAX_40; +#endif /* BASOP_NOGLOB */ + } +#endif + + BASOP_CHECK(); + + + return ( L40_var_out ); +} + +#ifdef BASOP_NOGLOB +Word40 L40_sub( Word40 L40_var1, Word40 L40_var2 ) +{ + Word40 L40_var_out; + + L40_var_out = L40_var1 - L40_var2; + +#if defined( _MSC_VER ) && ( _MSC_VER <= 1200 ) + if ( ( ( ( L40_var1 & 0x8000000000 ) >> 39 ) != 0 ) && ( ( ( L40_var2 & 0x8000000000 ) >> 39 ) == 0 ) && ( ( ( L40_var_out & 0x8000000000 ) >> 39 ) == 0 ) ) + { + assert( 0 ); + L40_var_out = MIN_40; + } + else if ( ( ( ( L40_var1 & 0x8000000000 ) >> 39 ) == 0 ) && ( ( ( L40_var2 & 0x8000000000 ) >> 39 ) != 0 ) && ( ( ( L40_var_out & 0x8000000000 ) >> 39 ) != 0 ) ) + { + assert( 0 ); + L40_var_out = MAX_40; + } +#else + if ( ( ( ( L40_var1 & 0x8000000000LL ) >> 39 ) != 0 ) && ( ( ( L40_var2 & 0x8000000000LL ) >> 39 ) == 0 ) && ( ( ( L40_var_out & 0x8000000000LL ) >> 39 ) == 0 ) ) + { + assert( 0 ); + L40_var_out = MIN_40; + } + else if ( ( ( ( L40_var1 & 0x8000000000LL ) >> 39 ) == 0 ) && ( ( ( L40_var2 & 0x8000000000LL ) >> 39 ) != 0 ) && ( ( ( L40_var_out & 0x8000000000LL ) >> 39 ) != 0 ) ) + { + assert( 0 ); + L40_var_out = MAX_40; + } +#endif + + BASOP_CHECK(); + + + return ( L40_var_out ); +} +#endif /* BASOP_NOGLOB */ + +/***************************************************************************** + * + * Function Name : L40_abs + * + * Purpose : + * + * Returns the absolute value of L40_var1. + * Calls the macro L40_UNDERFLOW_OCCURED() in case of underflow on 40-bit. + * Calls the macro L40_OVERFLOW_OCCURED() in case of overflow on 40-bit. + * + * Complexity weight : 1 + * + * Inputs : + * + * L40_var1 40 bit long signed integer (Word40) whose value falls in the + * range : MIN_40 <= L40_var1 <= MAX_40. + * + * Outputs : + * + * none + * + * Return Value : + * + * L40_var_out 40 bit long signed integer (Word40) whose value falls in + * the range : 0x00 0000 0000 <= L40_var_out <= MAX_40. + * + *****************************************************************************/ +Word40 L40_abs( Word40 L40_var1 ) +{ + Word40 L40_var_out; + + if ( L40_var1 < 0 ) + { + L40_var_out = L40_negate( L40_var1 ); + } + else + { + L40_var_out = L40_var1; + } + + + return ( L40_var_out ); +} + + +/***************************************************************************** + * + * Function Name : L40_max + * + * Purpose : + * + * Compares L40_var1 and L40_var2 and returns the maximum value. + * + * + * Complexity weight : 1 + * + * Inputs : + * + * L40_var1 40 bit long signed integer (Word40) whose value falls in the + * range : MIN_40 <= L40_var1 <= MAX_40. + * + * L40_var2 40 bit long signed integer (Word40) whose value falls in the + * range : MIN_40 <= L40_var2 <= MAX_40. + * + * Outputs : + * + * none + * + * Return Value : + * + * L40_var_out 40 bit long signed integer (Word40) whose value falls in + * the range : MIN_40 <= L40_var_out <= MAX_40. + * + *****************************************************************************/ +Word40 L40_max( Word40 L40_var1, Word40 L40_var2 ) +{ + Word40 L40_var_out; + + if ( L40_var1 < L40_var2 ) + L40_var_out = L40_var2; + else + L40_var_out = L40_var1; + + + return ( L40_var_out ); +} + + +/***************************************************************************** + * + * Function Name : L40_min + * + * Purpose : + * + * Compares L40_var1 and L40_var2 and returns the minimum value. + * + * + * Complexity weight : 1 + * + * Inputs : + * + * L40_var1 40 bit long signed integer (Word40) whose value falls in the + * range : MIN_40 <= L40_var1 <= MAX_40. + * + * L40_var2 40 bit long signed integer (Word40) whose value falls in the + * range : MIN_40 <= L40_var2 <= MAX_40. + * + * Outputs : + * + * none + * + * Return Value : + * + * L40_var_out 40 bit long signed integer (Word40) whose value falls in + * the range : MIN_40 <= L40_var_out <= MAX_40. + * + *****************************************************************************/ +Word40 L40_min( Word40 L40_var1, Word40 L40_var2 ) +{ + Word40 L40_var_out; + + if ( L40_var1 < L40_var2 ) + L40_var_out = L40_var1; + else + L40_var_out = L40_var2; + + + return ( L40_var_out ); +} + + +/***************************************************************************** + * + * Function Name : L_saturate40 + * + * Purpose : + * + * If L40_var1 is greater than MAX_32, returns MAX_32. + * If L40_var1 is lower than MIN_32, returns MIN_32. + * If not, returns L_Extract40( L40_var1). + * + * Complexity weight : 1 + * + * Inputs : + * + * L40_var1 40 bit long signed integer (Word40) whose value falls in the + * range : MIN_40 <= L40_var1 <= MAX_40. + * + * Outputs : + * + * none + * + * Return Value : + * + * L_var_out 32 bit long signed integer (Word32) whose value falls in + * the range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. + * + *****************************************************************************/ +#ifndef BASOP_NOGLOB +Word32 L_saturate40( Word40 L40_var1 ) +#else /* BASOP_NOGLOB */ + +Word32 L_saturate40_o( Word40 L40_var1, Flag *Overflow ) +#endif /* BASOP_NOGLOB */ +{ + Word32 L_var_out; + + Word40 UNDER_L40_var2 = ( Word40 ) ~( ( ( (Word40) 1 ) << 31 ) - (Word40) 1 ); + Word40 OVER_L40_var2 = (Word40) ( ( ( (Word40) 1 ) << 31 ) - (Word40) 1 ); + + if ( L40_var1 < UNDER_L40_var2 ) + { + L40_var1 = UNDER_L40_var2; +#ifndef BASOP_NOGLOB + Overflow = 1; +#else /* BASOP_NOGLOB */ + *Overflow = 1; +#endif /* BASOP_NOGLOB */ + } + + if ( L40_var1 > OVER_L40_var2 ) + { + L40_var1 = OVER_L40_var2; +#ifndef BASOP_NOGLOB + Overflow = 1; +#else /* BASOP_NOGLOB */ + *Overflow = 1; +#endif /* BASOP_NOGLOB */ + } + + L_var_out = L_Extract40( L40_var1 ); + + BASOP_CHECK(); + + + return ( L_var_out ); +} + +#ifdef BASOP_NOGLOB +Word32 L_saturate40( Word40 L40_var1 ) +{ + Word32 L_var_out; + + Word40 UNDER_L40_var2 = ( Word40 ) ~( ( ( (Word40) 1 ) << 31 ) - (Word40) 1 ); + Word40 OVER_L40_var2 = (Word40) ( ( ( (Word40) 1 ) << 31 ) - (Word40) 1 ); + + if ( L40_var1 < UNDER_L40_var2 ) + { + L40_var1 = UNDER_L40_var2; + assert( 0 ); + } + + if ( L40_var1 > OVER_L40_var2 ) + { + L40_var1 = OVER_L40_var2; + assert( 0 ); + } + + L_var_out = L_Extract40( L40_var1 ); + + BASOP_CHECK(); + + + return ( L_var_out ); +} +#endif /* BASOP_NOGLOB */ + +/***************************************************************************** + * + * Function Name : Mpy_32_16_ss + * + * Purpose : + * + * Multiplies the 2 signed values L_var1 and var2 with saturation control + * on 48-bit. The operation is performed in fractional mode : + * - L_var1 is supposed to be in 1Q31 format. + * - var2 is supposed to be in 1Q15 format. + * - The result is produced in 1Q47 format : L_varout_h points to the + * 32 MSBits while varout_l points to the 16 LSBits. + * + * Complexity weight : 2 + * + * Inputs : + * + * L_var1 32 bit long signed integer (Word32) whose value falls in + * the range : 0x8000 0000 <= L_var1 <= 0x7fff ffff. + * + * var2 16 bit short signed integer (Word16) whose value falls in + * the range : 0xffff 8000 <= var2 <= 0x0000 7fff. + * + * Outputs : + * + * *L_varout_h 32 bit long signed integer (Word32) whose value falls in + * the range : 0x8000 0000 <= L_varout_h <= 0x7fff ffff. + * + * *varout_l 16 bit short unsigned integer (UWord16) whose value falls in + * the range : 0x0000 0000 <= varout_l <= 0x0000 ffff. + * + * Return Value : + * + * none + * + *****************************************************************************/ +void Mpy_32_16_ss( Word32 L_var1, Word16 var2, Word32 *L_varout_h, UWord16 *varout_l ) +{ + Word16 var1_h; + UWord16 uvar1_l; + Word40 L40_var1; + + if ( ( L_var1 == (Word32) 0x80000000 ) && ( var2 == (Word16) 0x8000 ) ) + { + *L_varout_h = 0x7fffffff; + *varout_l = (UWord16) 0xffff; + } + else + { + uvar1_l = extract_l( L_var1 ); + var1_h = extract_h( L_var1 ); + + /* Below line can not overflow, so we can use << instead of L40_shl. */ + L40_var1 = ( (Word40) ( (Word32) var2 * (Word32) uvar1_l ) ) << 1; + + *varout_l = Extract40_L( L40_var1 ); + + L40_var1 = L40_shr( L40_var1, 16 ); + L40_var1 = L40_mac( L40_var1, var2, var1_h ); + + *L_varout_h = L_Extract40( L40_var1 ); + } + + + return; +} + + +/***************************************************************************** + * + * Function Name : Mpy_32_32_ss + * + * Purpose : + * + * Multiplies the 2 signed values L_var1 and L_var2 with saturation control + * on 64-bit. The operation is performed in fractional mode : + * - L_var1 and L_var2 are supposed to be in 1Q31 format. + * - The result is produced in 1Q63 format : L_varout_h points to the + * 32 MSBits while L_varout_l points to the 32 LSBits. + * + * Complexity weight : 4 + * + * Inputs : + * + * L_var1 32 bit long signed integer (Word32) whose value falls in the + * range : 0x8000 0000 <= L_var1 <= 0x7fff ffff. + * + * L_var2 32 bit long signed integer (Word32) whose value falls in the + * range : 0x8000 0000 <= L_var2 <= 0x7fff ffff. + * + * Outputs : + * + * *L_varout_h 32 bit long signed integer (Word32) whose value falls in + * the range : 0x8000 0000 <= L_varout_h <= 0x7fff ffff. + * + * *L_varout_l 32 bit short unsigned integer (UWord32) whose value falls in + * the range : 0x0000 0000 <= L_varout_l <= 0xffff ffff. + * + * + * Return Value : + * + * none + * + *****************************************************************************/ +void Mpy_32_32_ss( Word32 L_var1, Word32 L_var2, Word32 *L_varout_h, UWord32 *L_varout_l ) +{ + UWord16 uvar1_l, uvar2_l; + Word16 var1_h, var2_h; + Word40 L40_var1; + + if ( ( L_var1 == (Word32) 0x80000000 ) && ( L_var2 == (Word32) 0x80000000 ) ) + { + *L_varout_h = 0x7fffffff; + *L_varout_l = (UWord32) 0xffffffff; + } + else + { + + uvar1_l = extract_l( L_var1 ); + var1_h = extract_h( L_var1 ); + uvar2_l = extract_l( L_var2 ); + var2_h = extract_h( L_var2 ); + + /* Below line can not overflow, so we can use << instead of L40_shl. */ + L40_var1 = ( (Word40) ( (UWord32) uvar2_l * (UWord32) uvar1_l ) ) << 1; + + *L_varout_l = 0x0000ffff & L_Extract40( L40_var1 ); + + L40_var1 = L40_shr( L40_var1, 16 ); + L40_var1 = L40_add( L40_var1, ( (Word40) ( (Word32) var2_h * (Word32) uvar1_l ) ) << 1 ); + L40_var1 = L40_add( L40_var1, ( (Word40) ( (Word32) var1_h * (Word32) uvar2_l ) ) << 1 ); + *L_varout_l |= ( L_Extract40( L40_var1 ) ) << 16; + + L40_var1 = L40_shr( L40_var1, 16 ); + L40_var1 = L40_mac( L40_var1, var1_h, var2_h ); + + *L_varout_h = L_Extract40( L40_var1 ); + } + + + return; +} + + +/***************************************************************************** + * + * Function Name : L40_lshl + * + * Purpose : + * + * Logically shifts left L40_var1 by var2 positions. + * - If var2 is negative, L40_var1 is shifted to the LSBits by (-var2) + * positions with insertion of 0 at the MSBit. + * - If var2 is positive, L40_var1 is shifted to the MSBits by (var2) + * positions. + * + * Complexity weight : 1 + * + * Inputs : + * + * L40_var1 40 bit long signed integer (Word40) whose value falls in the + * range : MIN_40 <= L40_var1 <= MAX_40. + * + * var2 16 bit short signed integer (Word16) whose value falls in + * the range : MIN_16 <= var2 <= MAX_16. + * + * Outputs : + * + * none + * + * Return Value : + * + * L40_var_out 40 bit long signed integer (Word40) whose value falls in + * the range : MIN_40 <= L40_var_out <= MAX_40. + * + *****************************************************************************/ +Word40 L40_lshl( Word40 L40_var1, Word16 var2 ) +{ + Word40 L40_var_out; + + if ( var2 <= 0 ) + { + var2 = -var2; + L40_var_out = L40_lshr( L40_var1, var2 ); + } + else + { + if ( var2 >= 40 ) + L40_var_out = 0x0000000000; + else + { + L40_var_out = L40_var1 << var2; + } + L40_var_out = L40_set( L40_var_out ); + } + + BASOP_CHECK(); + + + return ( L40_var_out ); +} + + +/***************************************************************************** + * + * Function Name : L40_lshr + * + * Purpose : + * + * Logically shifts right L40_var1 by var2 positions. + * - If var2 is positive, L40_var1 is shifted to the LSBits by (var2) + * positions with insertion of 0 at the MSBit. + * - If var2 is negative, L40_var1 is shifted to the MSBits by (-var2) + * positions. + * + * Complexity weight : 1 + * + * Inputs : + * + * L40_var1 40 bit long signed integer (Word40) whose value falls in the + * range : MIN_40 <= L40_var1 <= MAX_40. + * + * var2 16 bit short signed integer (Word16) whose value falls in + * the range : MIN_16 <= var2 <= MAX_16. + * + * Outputs : + * + * none + * + * Return Value : + * + * L40_var_out 40 bit long signed integer (Word40) whose value falls in + * the range : MIN_40 <= L40_var_out <= MAX_40. + * + *****************************************************************************/ +Word40 L40_lshr( Word40 L40_var1, Word16 var2 ) +{ + Word40 L40_var_out; + + if ( var2 < 0 ) + { + var2 = -var2; + L40_var_out = L40_lshl( L40_var1, var2 ); + } + else + { + if ( var2 >= 40 ) + L40_var_out = 0x0000000000; + else + { +#if defined( _MSC_VER ) && ( _MSC_VER <= 1200 ) + L40_var_out = ( L40_var1 & 0xffffffffff ) >> var2; +#else + L40_var_out = ( L40_var1 & 0xffffffffffLL ) >> var2; +#endif + } + } + + BASOP_CHECK(); + + + return ( L40_var_out ); +} + + +/***************************************************************************** + * + * Function Name : norm_L40 + * + * Purpose : + * + * Produces the number of left shifts needed to normalize in 32 bit format + * the 40 bit variable L40_var1. This returned value can be used to scale + * L_40_var1 into the following intervals : + * - [(MAX_32+1)/2 .. MAX_32 ] for positive values. + * - [ MIN_32 .. (MIN_32/2)+1 ] for negative values. + * - [ 0 .. 0 ] for null values. + * In order to normalize the result, the following operation must be done : + * normelized_L40_var1 = L40_shl( L40_var1, norm_L40( L40_var1)) + * + * Complexity weight : 1 + * + * Inputs : + * + * L40_var1 40 bit long signed integer (Word40) whose value falls in the + * range : MIN_40 <= L40_var1 <= MAX_40. + * + * Outputs : + * + * none + * + * Return Value : + * + * var_out 16 bit short signed integer (Word16) whose value falls in + * the range : -8 <= var_out <= 31. + * + *****************************************************************************/ +Word16 norm_L40( Word40 L40_var1 ) +{ + Word16 var_out; + + var_out = 0; + + if ( L40_var1 != 0 ) + { + while ( ( L40_var1 > (Word32) 0x80000000L ) && ( L40_var1 < (Word32) 0x7fffffffL ) ) + { + + L40_var1 = L40_shl( L40_var1, 1 ); + var_out++; + } + + while ( ( L40_var1 < (Word32) 0x80000000L ) || ( L40_var1 > (Word32) 0x7fffffffL ) ) + { + + L40_var1 = L40_shl( L40_var1, -1 ); + var_out--; + } + } + + + return ( var_out ); +} + + +/***************************************************************************** + * + * Function Name : L40_shr_r + * + * Purpose : + * + * Arithmetically shifts right L40_var1 by var2 positions and rounds the + * result. It is equivalent to L40_shr( L40_var1, var2) except that if the + * last bit shifted out to the LSBit is 1, then the shifted result is + * incremented by 1. + * Calls the macro L40_UNDERFLOW_OCCURED() in case of underflow on 40-bit. + * Calls the macro L40_OVERFLOW_OCCURED() in case of overflow on 40-bit. + * + * Complexity weight : 3 + * + * Inputs : + * + * L40_var1 40 bit long signed integer (Word40) whose value falls in the + * range : MIN_40 <= L40_var1 <= MAX_40. + * + * var2 16 bit short signed integer (Word16) whose value falls in + * the range : 0xffff 8000 <= var2 <= 0x0000 7fff. + * + * Outputs : + * + * none + * + * Return Value : + * + * L40_var_out 40 bit long signed integer (Word40) whose value falls in + * the range : MIN_40 <= L40_var_out <= MAX_40. + * + *****************************************************************************/ +Word40 L40_shr_r( Word40 L40_var1, Word16 var2 ) +{ + Word40 L40_var_out; + + if ( var2 > 39 ) + { + L40_var_out = 0; + } + else + { + L40_var_out = L40_shr( L40_var1, var2 ); + + if ( var2 > 0 ) + { + if ( ( L40_var1 & ( (Word40) 1 << ( var2 - 1 ) ) ) != 0 ) + { + /* below line can not generate overflows on 40-bit */ + L40_var_out++; + } + } + } + + BASOP_CHECK(); + + + return ( L40_var_out ); +} + + +/***************************************************************************** + * + * Function Name : L40_shl_r + * + * Purpose : + * + * Arithmetically shifts left L40_var1 by var2 positions and rounds the + * result. It is equivalent to L40_shl( L40_var1, var2) except if var2 is + * negative. In that case, it does the same as + * L40_shr_r( L40_var1, (-var2)). + * Calls the macro L40_UNDERFLOW_OCCURED() in case of underflow on 40-bit. + * Calls the macro L40_OVERFLOW_OCCURED() in case of overflow on 40-bit. + * + * Complexity weight : 3 + * + * Inputs : + * + * L40_var1 40 bit long signed integer (Word40) whose value falls in the + * range : MIN_40 <= L40_var1 <= MAX_40. + * + * var2 16 bit short signed integer (Word16) whose value falls in + * the range : 0xffff 8000 <= var2 <= 0x0000 7fff. + * + * Outputs : + * + * none + * + * Return Value : + * + * L40_var_out 40 bit long signed integer (Word40) whose value falls in + * the range : MIN_40 <= L40_var_out <= MAX_40. + * + *****************************************************************************/ +Word40 L40_shl_r( Word40 L40_var1, Word16 var2 ) +{ + Word40 L40_var_out; + + if ( var2 >= 0 ) + { + L40_var_out = L40_shl( L40_var1, var2 ); + } + else + { + var2 = -var2; + L40_var_out = L40_shr_r( L40_var1, var2 ); + } + + + return ( L40_var_out ); +} + + +#undef WMC_TOOL_SKIP diff --git a/lib_com/enh40.h b/lib_com/enh40.h new file mode 100644 index 0000000000000000000000000000000000000000..a55bd925e9da5ca2408aa43f18f787a3ae32be64 --- /dev/null +++ b/lib_com/enh40.h @@ -0,0 +1,349 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/* + =========================================================================== + File: ENH40.H v.2.3 - 30.Nov.2009 + =========================================================================== + + ITU-T STL BASIC OPERATORS + + 40-BIT ARITHMETIC OPERATORS + + History: + 07 Nov 04 v2.0 Incorporation of new 32-bit / 40-bit / control + operators for the ITU-T Standard Tool Library as + described in Geneva, 20-30 January 2004 WP 3/16 Q10/16 + TD 11 document and subsequent discussions on the + wp3audio@yahoogroups.com email reflector. + March 06 v2.1 Changed to improve portability. + + ============================================================================ +*/ + + +#ifndef _ENH40_H +#define _ENH40_H + + +#include "stl.h" + +#if defined( BASOP_NOGLOB ) || defined( _MSC_VER ) +#define MAX_40 ( 0x0000007fffffffff ) +#define MIN_40 ( 0xffffff8000000000 ) +#endif + + +#define L40_OVERFLOW_OCCURED( L40_var1 ) ( Overflow = 1, exit( 1 ), L40_var1 ) +#define L40_UNDERFLOW_OCCURED( L40_var1 ) ( Overflow = 1, exit( 2 ), L40_var1 ) + + +/***************************************************************************** + * + * Prototypes for enhanced 40 bit arithmetic operators + * + *****************************************************************************/ +Word40 L40_shr( Word40 L40_var1, Word16 var2 ); +Word40 L40_shr_r( Word40 L40_var1, Word16 var2 ); +Word40 L40_shl( Word40 L40_var1, Word16 var2 ); +Word40 L40_shl_r( Word40 L40_var1, Word16 var2 ); + +static __inline Word40 L40_mult( Word16 var1, Word16 var2 ); + +static __inline Word40 L40_mac( Word40 L40_var1, Word16 var1, Word16 var2 ); +static __inline Word16 mac_r40( Word40 L40_var1, Word16 var1, Word16 var2 ); + +static __inline Word40 L40_msu( Word40 L40_var1, Word16 var1, Word16 var2 ); +static __inline Word16 msu_r40( Word40 L40_var1, Word16 var1, Word16 var2 ); + + +void Mpy_32_16_ss( Word32 L_var1, Word16 var2, Word32 *L_varout_h, UWord16 *varout_l ); +void Mpy_32_32_ss( Word32 L_var1, Word32 L_var2, Word32 *L_varout_h, UWord32 *L_varout_l ); + + +Word40 L40_lshl( Word40 L40_var1, Word16 var2 ); +Word40 L40_lshr( Word40 L40_var1, Word16 var2 ); + +static __inline Word40 L40_set( Word40 L40_var1 ); +static __inline UWord16 Extract40_H( Word40 L40_var1 ); +static __inline UWord16 Extract40_L( Word40 L40_var1 ); +static __inline UWord32 L_Extract40( Word40 L40_var1 ); + +static __inline Word40 L40_deposit_h( Word16 var1 ); +static __inline Word40 L40_deposit_l( Word16 var1 ); +static __inline Word40 L40_deposit32( Word32 L_var1 ); + +static __inline Word40 L40_round( Word40 L40_var1 ); +static __inline Word16 round40( Word40 L40_var1 ); + + +Word40 L40_add( Word40 L40_var1, Word40 L40_var2 ); +Word40 L40_sub( Word40 L40_var1, Word40 L40_var2 ); +Word40 L40_abs( Word40 L40_var1 ); +Word40 L40_negate( Word40 L40_var1 ); +Word40 L40_max( Word40 L40_var1, Word40 L40_var2 ); +Word40 L40_min( Word40 L40_var1, Word40 L40_var2 ); +Word32 L_saturate40( Word40 L40_var1 ); +Word16 norm_L40( Word40 L40_var1 ); + +#ifdef BASOP_NOGLOB +/* + * Overflowing operators + */ +Word40 L40_shl_o( Word40 L40_var1, Word16 var2, Flag *Overflow ); +Word40 L40_add_o( Word40 L40_var1, Word40 L40_var2, Flag *Overflow ); +Word40 L40_sub_o( Word40 L40_var1, Word40 L40_var2, Flag *Overflow ); +Word32 L_saturate40_o( Word40 L40_var1, Flag *Overflow ); +#endif /* BASOP_NOGLOB */ + +/*#ifdef _MSC_VER*/ +static __inline Word40 L40_set( Word40 L40_var1 ) +{ + Word40 L40_var_out; + +#if defined( _MSC_VER ) && ( _MSC_VER <= 1200 ) + L40_var_out = L40_var1 & 0x000000ffffffffff; + + if ( L40_var1 & 0x8000000000 ) + L40_var_out = L40_var_out | 0xffffff0000000000; +#else + L40_var_out = L40_var1 & 0x000000ffffffffffLL; + + if ( L40_var1 & 0x8000000000LL ) + L40_var_out = L40_var_out | 0xffffff0000000000LL; +#endif + + + return ( L40_var_out ); +} +/*#endif*/ /* ifdef _MSC_VER */ + + +static __inline UWord16 Extract40_H( Word40 L40_var1 ) +{ + UWord16 var_out; + + var_out = (UWord16) ( L40_var1 >> 16 ); + + + return ( var_out ); +} + + +static __inline UWord16 Extract40_L( Word40 L40_var1 ) +{ + UWord16 var_out; + + var_out = (UWord16) ( L40_var1 ); + + + return ( var_out ); +} + + +static __inline UWord32 L_Extract40( Word40 L40_var1 ) +{ + UWord32 L_var_out; + + L_var_out = (UWord32) L40_var1; + + + return ( L_var_out ); +} + + +static __inline Word40 L40_deposit_h( Word16 var1 ) +{ + Word40 L40_var_out; + + L40_var_out = ( (Word40) var1 ) << 16; + +#if defined( _MSC_VER ) && ( _MSC_VER <= 1200 ) + if ( var1 & 0x8000 ) + { + L40_var_out = L40_set( L40_var_out | 0xff00000000 ); +#else + if ( var1 & 0x8000 ) + { + L40_var_out = L40_set( L40_var_out | 0xff00000000LL ); +#endif + } + + + return ( L40_var_out ); +} + + +static __inline Word40 L40_deposit_l( Word16 var1 ) +{ + Word40 L40_var_out; + + L40_var_out = var1; + +#if defined( _MSC_VER ) && ( _MSC_VER <= 1200 ) + if ( var1 & 0x8000 ) + { + L40_var_out = L40_set( L40_var_out | 0xffffff0000 ); +#else + if ( var1 & 0x8000 ) + { + L40_var_out = L40_set( L40_var_out | 0xffffff0000LL ); +#endif + } + + + return ( L40_var_out ); +} + + +static __inline Word40 L40_deposit32( Word32 L_var1 ) +{ + Word40 L40_var_out; + + L40_var_out = (Word40) L_var1; + +#if defined( _MSC_VER ) && ( _MSC_VER <= 1200 ) + if ( L_var1 & 0x80000000 ) + { + L40_var_out = L40_set( L40_var_out | 0xff00000000 ); +#else + if ( L_var1 & 0x80000000 ) + { + L40_var_out = L40_set( L40_var_out | 0xff00000000LL ); +#endif + } + + + return ( L40_var_out ); +} + + +static __inline Word40 L40_round( Word40 L40_var1 ) +{ + Word40 L40_var_out; + Word40 L40_constant; + +#if defined( _MSC_VER ) && ( _MSC_VER <= 1200 ) + L40_constant = L40_set( 0xffffff0000 ); +#else + L40_constant = L40_set( 0xffffff0000LL ); +#endif + + L40_var_out = L40_add( 0x8000, L40_var1 ); + L40_var_out = L40_var_out & L40_constant; + + + return ( L40_var_out ); +} + + +static __inline Word16 round40( Word40 L40_var1 ) +{ + Word16 var_out; + + var_out = extract_h( L_saturate40( L40_round( L40_var1 ) ) ); + + + return ( var_out ); +} + + +static __inline Word40 L40_mult( Word16 var1, Word16 var2 ) +{ + Word32 L_var_out; + Word40 L40_var_out; + + L_var_out = (Word32) var1 * (Word32) var2; + L40_var_out = (Word40) L_var_out; + + /* Below line can not overflow, so we can use << instead of L40_shl. */ + L40_var_out = L40_var_out << 1; + + + return ( L40_var_out ); +} + + +static __inline Word40 L40_mac( Word40 L40_var1, Word16 var2, Word16 var3 ) +{ + Word40 L40_var_out; + + L40_var_out = L40_mult( var2, var3 ); + L40_var_out = L40_add( L40_var1, L40_var_out ); + + + return ( L40_var_out ); +} + + +static __inline Word16 mac_r40( Word40 L40_var1, Word16 var2, Word16 var3 ) +{ + Word40 L40_var_out; + Word16 var_out; + + L40_var_out = L40_mac( L40_var1, var2, var3 ); + var_out = round40( L40_var_out ); + + + return ( var_out ); +} + + +static __inline Word40 L40_msu( Word40 L40_var1, Word16 var2, Word16 var3 ) +{ + Word40 L40_var_out; + + L40_var_out = L40_mult( var2, var3 ); + L40_var_out = L40_sub( L40_var1, L40_var_out ); + + + return ( L40_var_out ); +} + + +static __inline Word16 msu_r40( Word40 L40_var1, Word16 var2, Word16 var3 ) +{ + Word40 L40_var_out; + Word16 var_out; + + L40_var_out = L40_msu( L40_var1, var2, var3 ); + var_out = round40( L40_var_out ); + + + return ( var_out ); +} + + +#endif /*_ENH40_H*/ + + +/* end of file */ diff --git a/lib_com/enhancer.c b/lib_com/enhancer.c new file mode 100644 index 0000000000000000000000000000000000000000..407588bc3f090b07430bec7148d9921d9afb621c --- /dev/null +++ b/lib_com/enhancer.c @@ -0,0 +1,281 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*---------------------------------------------------------------------* + * Local function prototypes + *---------------------------------------------------------------------*/ + +static void agc2( const float *sig_in, float *sig_out, const int16_t l_trm ); + +/*---------------------------------------------------------------------* + * enhancer() + * + * Enhancement of the excitation signal before synthesis + *---------------------------------------------------------------------*/ + +void enhancer( + const int16_t codec_mode, /* i : flag indicating Codec Mode */ + const int32_t core_brate, /* i : core bitrate */ + const int16_t cbk_index, /* i : */ + const int16_t Opt_AMR_WB, /* i : flag indicating AMR-WB IO mode */ + const int16_t coder_type, /* i : coding type */ + const int16_t L_frame, /* i : frame size */ + const float voice_fac, /* i : subframe voicing estimation */ + const float stab_fac, /* i : LP filter stablility measure */ + const float norm_gain_code, /* i : normalized innovative cb. gain */ + const float gain_inov, /* i : gain of the unscaled innovation */ + float *gc_threshold, /* i/o: code threshold */ + float *code, /* i/o: innovation */ + float *pt_exc2, /* i/o: adapt. excitation/total exc. */ + const float gain_pit, /* i : Quantized pitch gain */ + float *dispMem /* i/o: Phase dispersion algorithm memory */ +) +{ + float tmp, gain_code, new_norm_gain_code, fac; + int16_t i; + float pit_sharp; + float excp[L_SUBFR]; + + pit_sharp = gain_pit; + + /*-----------------------------------------------------------------* + * Phase dispersion + * + * Enhance noise at low bitrates + *-----------------------------------------------------------------*/ + + i = 2; /* no dispersion */ + if ( Opt_AMR_WB ) + { + if ( core_brate <= ACELP_6k60 ) + { + i = 0; /* high dispersion */ + } + else if ( core_brate <= ACELP_8k85 ) + { + i = 1; /* low dispersion */ + } + } + else if ( codec_mode == MODE1 && coder_type != UNVOICED ) + { + if ( core_brate <= ACELP_7k20 ) + { + i = 0; /* high dispersion */ + } + else if ( ( coder_type == GENERIC || coder_type == TRANSITION || coder_type == AUDIO || coder_type == INACTIVE ) && core_brate <= ACELP_9k60 ) + { + i = 1; /* low dispersion */ + } + } + else if ( codec_mode == MODE2 ) + { + if ( ( ( coder_type != VOICED ) && cbk_index <= 2 ) || ( ( coder_type == UNVOICED ) && L_frame == L_FRAME && cbk_index <= 10 ) || ( ( coder_type == UNVOICED ) && L_frame == L_FRAME16k && cbk_index <= 14 ) ) + { + i = 0; /* high dispersion */ + } + else if ( ( coder_type != VOICED ) && ( cbk_index <= 7 ) ) + { + i = 1; /* low dispersion */ + } + } + else if ( codec_mode == MODE1 && coder_type == UNVOICED && cbk_index /*uc_two_stage_flag*/ ) + { + i = 0; /* high dispersion */ + } + + phase_dispersion( norm_gain_code, gain_pit, code, i, dispMem ); + + /*------------------------------------------------------------ + * Noise enhancer + * + * Enhance excitation on noise (modify code gain). If signal is noisy and LPC filter is stable, + * move code gain 1.5 dB towards its threshold. This decreases by 3 dB noise energy variation. + *-----------------------------------------------------------*/ + + if ( norm_gain_code < *gc_threshold ) + { + new_norm_gain_code = (float) ( norm_gain_code * 1.19f ); + if ( new_norm_gain_code > *gc_threshold ) + { + new_norm_gain_code = *gc_threshold; + } + } + else + { + new_norm_gain_code = (float) ( norm_gain_code / 1.19f ); + if ( new_norm_gain_code < *gc_threshold ) + { + new_norm_gain_code = *gc_threshold; + } + } + *gc_threshold = new_norm_gain_code; + + /* calculate new code gain */ + fac = stab_fac * ( 0.5f * ( 1.0f - voice_fac ) ); /* 1 = unvoiced, 0 = voiced */ + gain_code = fac * new_norm_gain_code + ( 1.0f - fac ) * norm_gain_code; + gain_code *= gain_inov; + + for ( i = 0; i < L_SUBFR; i++ ) + { + code[i] *= gain_code; + } + + /*------------------------------------------------------------* + * Pitch enhancer + * + * Enhance excitation on voiced (HP filtering of code). On voiced signal, filter code by a smooth HP + * filter to decrease the energy of code at low frequency + *------------------------------------------------------------*/ + + if ( !Opt_AMR_WB && codec_mode == MODE1 && coder_type == UNVOICED ) + { + mvr2r( code, pt_exc2, L_SUBFR ); + } + else + { + if ( Opt_AMR_WB && ( core_brate == ACELP_8k85 || core_brate == ACELP_6k60 ) ) + { + pit_sharp = gain_pit; + if ( pit_sharp > 1.0 ) + { + pit_sharp = 1.0; + } + + if ( pit_sharp > 0.5 ) + { + for ( i = 0; i < L_SUBFR; i++ ) + { + excp[i] = pt_exc2[i] * pit_sharp * 0.25f; + } + } + } + + /*----------------------------------------------------------------- + * Do a simple noncasual "sharpening": effectively an FIR + * filter with coefs [-tmp 1.0 -tmp] where tmp = 0 ... 0.25 + * This is applied to code and added to exc2 + *-----------------------------------------------------------------*/ + if ( L_frame == L_FRAME16k ) + { + tmp = (float) ( 0.150f * ( 1.0f + voice_fac ) ); /* 0.30=voiced, 0=unvoiced */ + } + else + { + tmp = (float) ( 0.125f * ( 1.0f + voice_fac ) ); /* 0.25=voiced, 0=unvoiced */ + } + pt_exc2[0] += code[0] - ( tmp * code[1] ); + for ( i = 1; i < L_SUBFR - 1; i++ ) + { + pt_exc2[i] += code[i] - ( tmp * code[i - 1] ) - ( tmp * code[i + 1] ); + } + pt_exc2[L_SUBFR - 1] += code[L_SUBFR - 1] - ( tmp * code[L_SUBFR - 2] ); + + if ( Opt_AMR_WB && ( core_brate == ACELP_8k85 || core_brate == ACELP_6k60 ) ) + { + if ( pit_sharp > 0.5f ) + { + for ( i = 0; i < L_SUBFR; i++ ) + { + excp[i] += pt_exc2[i]; + } + + agc2( pt_exc2, excp, L_SUBFR ); + mvr2r( excp, pt_exc2, L_SUBFR ); + } + } + } + + return; +} + +/*-----------------------------------------------------------------------* + * agc2() + * + * Adaptive gain control + *-----------------------------------------------------------------------*/ + +static void agc2( + const float *sig_in, /* i : postfilter input signal */ + float *sig_out, /* i/o: postfilter output signal */ + const int16_t l_trm /* i : subframe size */ +) +{ + int16_t i; + float gain_in, gain_out; + float g0, gain; + + + gain_out = 0.0f; + for ( i = 0; i < l_trm; i++ ) + { + gain_out += sig_out[i] * sig_out[i]; + } + + if ( gain_out == 0.0f ) + { + return; + } + + gain_in = 0.0f; + for ( i = 0; i < l_trm; i++ ) + { + gain_in += sig_in[i] * sig_in[i]; + } + if ( gain_in == 0.0f ) + { + g0 = 0.0f; + } + else + { + g0 = (float) sqrt( gain_in / gain_out ); + } + + gain = g0; + for ( i = 0; i < l_trm; i++ ) + { + sig_out[i] *= gain; + } + + return; +} diff --git a/lib_com/enr_1_az.c b/lib_com/enr_1_az.c new file mode 100644 index 0000000000000000000000000000000000000000..800fa185c69af3cf748388ea8ecadcbce8119942 --- /dev/null +++ b/lib_com/enr_1_az.c @@ -0,0 +1,65 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * enr_1_Az() + * + * Find Energy of the 1/A(z) impulse response + *-------------------------------------------------------------------*/ + +/*! r: impulse response energy */ +float enr_1_Az( + const float Aq[], /* i : LP filter coefs */ + const int16_t len /* i : impulse response length */ +) +{ + float enr_LP, h1[2 * L_SUBFR], mem[M]; + + + set_f( h1, 0, len ); /* Find the impulse response */ + set_f( mem, 0, M ); + h1[0] = 1.0f; + syn_filt( Aq, M, h1, h1, len, mem, 0 ); + enr_LP = dotp( h1, h1, len ) + 0.01f; /* Find the impulse response energy */ + + return enr_LP; +} diff --git a/lib_com/env_adj.c b/lib_com/env_adj.c new file mode 100644 index 0000000000000000000000000000000000000000..459c40338d4b24df07208f2c5e1e2c986ba72029 --- /dev/null +++ b/lib_com/env_adj.c @@ -0,0 +1,165 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "wmc_auto.h" + +/*--------------------------------------------------------------------------* + * env_adj() + * + * Adjust the band energies of noise-fill and low resolution bands + *--------------------------------------------------------------------------*/ + +void env_adj( + const int16_t *pulses, /* i : number of pulses per band */ + const int16_t length, /* i : length of spectrum */ + const int16_t last_sfm, /* i : index of the last band */ + float *adj, /* o : adjustment factors for the envelope */ + const float env_stab, /* i : Envelope stability parameter */ + const int16_t *sfmsize /* i : Band widths */ +) +{ + int16_t i, j, group; + int16_t npul; + int16_t att_state; + int16_t start, len; + float tmp; + float gain_adj; + int16_t idx; + + att_state = 0; + len = 0; + start = 0; + + /* Find attenuation levels */ + for ( i = 0; i <= last_sfm; i++ ) + { + group = ( sfmsize[i] >> 3 ) - 1; + npul = pulses[i]; + + if ( length == L_FRAME32k ) + { + if ( npul == 0 ) + { + /* Noise filled band */ + if ( group <= 1 ) + { + if ( i > 0 && pulses[i - 1] != 0 && pulses[i + 1] != 0 ) + { + adj[i] = 0.36f; + } + else if ( i > 0 && ( pulses[i - 1] == 0 || pulses[i + 1] == 0 ) ) + { + adj[i] = 0.54f; + } + else + { + adj[i] = 0.72f; + } + } + else if ( i < last_sfm ) + { + if ( pulses[i - 1] != 0 && pulses[i + 1] != 0 ) + { + adj[i] = 0.54f; + } + else + { + adj[i] = 0.72f; + } + } + else + { + adj[i] = 0.72f; + } + + if ( att_state == 0 ) + { + start = i; + } + + len++; + att_state = 1; + } + else + { + adj[i] = 1.0f; + if ( att_state == 1 ) /* End of attenuation region found */ + { + tmp = min( 1, max( 0, len - ENV_ADJ_START ) * ( 1.0f / ENV_ADJ_INCL ) ); + for ( j = start; j < i; j++ ) + { + adj[j] = max( tmp + ( 1 - tmp ) * adj[j], env_stab ); + } + len = 0; + att_state = 0; + } + } + } + /* length == L_FRAME16k */ + else + { + /* Calculate low accuracy band attenuation */ + gain_adj = 1.0f; + if ( npul > 0 && npul < MAX_P_ATT ) + { + idx = (int16_t) ( npul * att_step[group] + 0.5f ) - 1; + if ( idx < MAX_P_ATT ) + { + gain_adj = gain_att[idx]; + } + } + adj[i] = gain_adj; + } + } + + /* Check if the sequence ended with an attenuation region */ + if ( att_state == 1 ) + { + tmp = min( 1, max( 0, len - ENV_ADJ_START ) * ( 1.0f / ENV_ADJ_INCL ) ); + + for ( j = start; j < i; j++ ) + { + adj[j] = max( tmp + ( 1 - tmp ) * adj[j], env_stab ); + } + } + + return; +} diff --git a/lib_com/env_stab.c b/lib_com/env_stab.c new file mode 100644 index 0000000000000000000000000000000000000000..ee07218f9b14f61c9302ebe037e54fcb20c54f82 --- /dev/null +++ b/lib_com/env_stab.c @@ -0,0 +1,233 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" +#include "stl.h" + +/*--------------------------------------------------------------------------* + * Local constants + *--------------------------------------------------------------------------*/ + +#define ENV_STAB_SMO_HO 10 /* number of hangover frames when switching from music to speech state */ + + +/*--------------------------------------------------------------------------*/ +/* Function env_stability() */ +/* ~~~~~~~~~~~~~~~~~~~~~~~~~ */ +/* */ +/* Envelope stability measure */ +/*--------------------------------------------------------------------------*/ + +float env_stability( + const int16_t *ynrm, /* i : Norm vector for current frame */ + const int16_t nb_sfm, /* i : Number of sub-bands */ + int16_t *mem_norm, /* i/o: Norm vector memory from past frame */ + int16_t *mem_env_delta, /* i/o: Envelope stability memory for smoothing*/ + const int16_t core_switching_flag /* i : Core switching flag */ +) +{ + Word16 env_delta; + Word16 env_stab; + Word16 tmp, tmp_stab; + Word16 i; + + Word16 exp, exp2; + Word32 L_tmp, L_env_delta; + Word16 inv_nb_sfm; + float env_stab_f; +#ifdef BASOP_NOGLOB + Flag Overflow; +#endif /* BASOP_NOGLOB */ + + if ( core_switching_flag ) + { + for ( i = 0; i < nb_sfm; i++ ) + { + mem_norm[i] = ynrm[i]; + } +#ifdef BASOP_NOGLOB + Overflow = 0; + env_delta = shl_o( *mem_env_delta, 1, &Overflow ); +#else + env_delta = shl( *mem_env_delta, 1 ); +#endif + } + else + { + /* Calculate envelope stability parameter */ + L_env_delta = L_deposit_l( 0 ); + for ( i = 0; i < nb_sfm; i++ ) + { + tmp = sub( mem_norm[i], ynrm[i] ); + L_env_delta = L_mac0( L_env_delta, tmp, tmp ); + mem_norm[i] = ynrm[i]; + } + + inv_nb_sfm = 19418; /* Q19 */ + if ( nb_sfm == 26 ) + { + inv_nb_sfm = 20165; /* Q19 */ + } + exp = norm_l( L_env_delta ); + L_env_delta = Mult_32_16( L_shl( L_env_delta, exp ), inv_nb_sfm ); /* 0+exp+19-15 */ + + L_tmp = Sqrt_l( L_env_delta, &exp2 ); /* exp+4+31+exp2 */ + + exp = add( 35, add( exp, exp2 ) ); + if ( sub( s_and( exp, 1 ), 1 ) == 0 ) + { + L_tmp = Mult_32_16( L_tmp, 23170 ); /* 1/sqrt(2) in Q15 */ + } + exp = shr( exp, 1 ); + +#ifndef BASOP_NOGLOB + env_delta = round_fx( L_shl( L_tmp, sub( 26, exp ) ) ); /* Q10 */ + L_tmp = L_mult0( 26214, env_delta ); /* 26214 is 0.1 in Q18. Q28 */ + L_tmp = L_mac( L_tmp, 29491, *mem_env_delta ); /* 29491 is 0.9 in Q15. Q28 */ + *mem_env_delta = round_fx( L_tmp ); /* Q12 */ +#else /* BASOP_NOGLOB */ + env_delta = round_fx_o( L_shl_o( L_tmp, sub( 26, exp ), &Overflow ), &Overflow ); /* Q10 */ + L_tmp = L_mult0( 26214, env_delta ); /* 26214 is 0.1 in Q18. Q28 */ + L_tmp = L_mac_o( L_tmp, 29491, *mem_env_delta, &Overflow ); /* 29491 is 0.9 in Q15. Q28 */ + *mem_env_delta = round_fx_o( L_tmp, &Overflow ); /* Q12 */ +#endif /* BASOP_NOGLOB */ + Overflow = 0; +#ifndef BASOP_NOGLOB + env_delta = round_fx( L_shl( L_tmp, 1 ) ); /* Q13 */ +#else /* BASOP_NOGLOB */ + env_delta = round_fx_o( L_shl_o( L_tmp, 1, &Overflow ), &Overflow ); /* Q13 */ +#endif /* BASOP_NOGLOB */ + } + if ( Overflow != 0 ) /* Saturated due to the above up-shifting operation. */ + { + env_stab = stab_trans_fx[L_STAB_TBL - 1]; /* The highest quantized index. */ + env_stab_f = ( (float) env_stab ) / PCM16_TO_FLT_FAC; /* Convert env_stab(Q15) to float */ + return env_stab_f; + } + + /* If tmp_stab > (D_STAB_TBL*L_STAB_TBL + M_STAB_TBL), i.e., 0.103138*10+2.51757=3.603137, + * the quantized index is equal to 9. Hence, we only need to worry about any tmpStab < 4. + * In this case, Q13 is good enough. + */ + tmp_stab = sub( env_delta, M_STAB_TBL_FX ); /* in Q13 */ + tmp_stab = abs_s( tmp_stab ); + + /* Table lookup for smooth transitions + * First, find the quantization level, i, of tmpStab. */ +#if L_STAB_TBL > 10 +#error env_stability_fx: Use more efficient usquant() +#endif + tmp_stab = sub( tmp_stab, HALF_D_STAB_TBL_FX ); /* in Q13 */ + for ( i = 0; i < L_STAB_TBL - 1; i++ ) + { + if ( tmp_stab < 0 ) + { + break; + } + else + { + tmp_stab = sub( tmp_stab, D_STAB_TBL_FX ); /* in Q13 */ + } + } + + env_stab = stab_trans_fx[i]; + if ( sub( env_delta, M_STAB_TBL_FX ) < 0 ) + { + env_stab = sub( 0x7FFF, stab_trans_fx[i] ); + } + + env_stab_f = ( (float) env_stab ) / PCM16_TO_FLT_FAC; /* Convert env_stab(Q15) to float */ + + return env_stab_f; +} + +/*--------------------------------------------------------------------------* + * env_stab_smo_fx() + * + * + *--------------------------------------------------------------------------*/ + +/*! r: New speech/music state */ +float env_stab_smo( + float env_stab, /* i : env_stab value */ + float *env_stab_state_p, /* i/o: env_stab state probabilities */ + int16_t *ho_cnt /* i/o: hangover counter for speech state */ +) +{ + int16_t state, prev_state; + float maxval, pp[NUM_ENV_STAB_PLC_STATES], pa[NUM_ENV_STAB_PLC_STATES]; + /* get previous state */ + prev_state = maximum( env_stab_state_p, NUM_ENV_STAB_PLC_STATES, &maxval ); + + /* assume two states: speech(0), music(1) */ + /* set a posteriori likelihoods for the two states according to env_stab */ + env_stab = ( env_stab - stab_trans[L_STAB_TBL - 1] ) / ( 1 - 2 * stab_trans[L_STAB_TBL - 1] ); + pp[0] = 1.0f - env_stab; + pp[1] = env_stab; + + /* calculate a priori likelihoods */ + pa[0] = dotp( env_stab_tp[0], env_stab_state_p, NUM_ENV_STAB_PLC_STATES ); + pa[1] = dotp( env_stab_tp[1], env_stab_state_p, NUM_ENV_STAB_PLC_STATES ); + + /* multiply elementwise with a posteriori likelihoods */ + v_mult( pa, pp, env_stab_state_p, NUM_ENV_STAB_PLC_STATES ); + + /* renormalize state probabilities */ + v_multc( env_stab_state_p, 1.0f / sum_f( env_stab_state_p, NUM_ENV_STAB_PLC_STATES ), env_stab_state_p, NUM_ENV_STAB_PLC_STATES ); + + /* find maximum index as return value */ + state = maximum( env_stab_state_p, NUM_ENV_STAB_PLC_STATES, &maxval ); + + /* apply some hangover for speech */ + if ( state == 0 && prev_state == 1 ) + { + *ho_cnt = ENV_STAB_SMO_HO; + } + if ( *ho_cnt > 0 ) + { + pp[0] = 1; + pp[1] = 0; + ( *ho_cnt )--; + } + + return state; +} diff --git a/lib_com/env_stab_trans.c b/lib_com/env_stab_trans.c new file mode 100644 index 0000000000000000000000000000000000000000..1850ed48ba9f5b50302762b321bb0d85ec0d8ae1 --- /dev/null +++ b/lib_com/env_stab_trans.c @@ -0,0 +1,155 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*--------------------------------------------------------------------------* + * env_stab_transient_detect() + * + * Transient detector for envelope stability measure + *--------------------------------------------------------------------------*/ + +void env_stab_transient_detect( + const int16_t is_transient, /* i : Transient flag */ + const int16_t length, /* i : Length of spectrum (32 or 48 kHz) */ + const int16_t norm[], /* i : quantization indices for norms */ + int16_t *no_att_hangover, /* i/o: Frame counter for attenuation hangover */ + float *energy_lt, /* i/o: Long-term energy measure for transient detection */ + const int16_t HQ_mode, /* i : HQ coding mode */ + const int16_t bin_th, /* i : HVQ cross-over frequency bin */ + const float *coeff /* i : Coded spectral coefficients */ +) +{ + float d_max; + float e_frame; + int16_t blk; + int16_t i; + float E_sub[4]; + float delta_e_sub; + int16_t norm_ind; + + int16_t num_subframes = 4; + int16_t bands_per_subframe = 9; + + if ( HQ_mode == HQ_HVQ ) + { + e_frame = 0.0f; + + for ( i = 0; i < bin_th; i++ ) + { + e_frame += coeff[i] * coeff[i]; + } + + e_frame = (float) sqrt( e_frame / bin_th ); + + if ( e_frame > ENERGY_TH ) + { + *energy_lt = ENERGY_LT_BETA * ( *energy_lt ) + ( 1 - ENERGY_LT_BETA ) * e_frame; + } + + if ( *no_att_hangover > 0 ) + { + ( *no_att_hangover )--; + } + } + else + { + d_max = 0.0f; + e_frame = 0.0f; + if ( is_transient && length == L_FRAME32k ) + { + /* Measure subframe energies */ + for ( blk = 0; blk < num_subframes; blk++ ) + { + E_sub[blk] = 0.0f; + for ( i = 0; i < bands_per_subframe; i++ ) + { + norm_ind = subf_norm_groups[blk][i]; + E_sub[blk] += dicn[norm[norm_ind]]; + } + E_sub[blk] = E_sub[blk] / bands_per_subframe; + e_frame += E_sub[blk]; + } + /* Test for transient */ + if ( e_frame > ENERGY_TH * num_subframes ) + { + for ( blk = 0; blk < num_subframes - 1; blk++ ) + { + delta_e_sub = ( E_sub[blk + 1] - E_sub[blk] ) / *energy_lt; + if ( delta_e_sub > d_max ) + { + d_max = delta_e_sub; + } + } + } + } + else + { + /* Update long-term energy measure */ + e_frame = 0.0f; + + for ( i = 0; i < SFM_N_ENV_STAB; i++ ) + { + e_frame += dicn[norm[i]]; + } + + e_frame = e_frame / SFM_N_ENV_STAB; + + if ( e_frame > ENERGY_TH ) + { + *energy_lt = ENERGY_LT_BETA * ( *energy_lt ) + ( 1 - ENERGY_LT_BETA ) * e_frame; + } + } + + /* Add hang-over for conservative application of stability-dependent attenuation */ + if ( d_max > DELTA_TH ) + { + *no_att_hangover = ATT_LIM_HANGOVER; + } + else if ( *no_att_hangover > 0 ) + { + ( *no_att_hangover )--; + } + } + + return; +} diff --git a/lib_com/est_tilt.c b/lib_com/est_tilt.c new file mode 100644 index 0000000000000000000000000000000000000000..2f5b5bbac8db7fe540a45bb85f410c5b1fa7af44 --- /dev/null +++ b/lib_com/est_tilt.c @@ -0,0 +1,90 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * est_tilt() + * + * Estimate spectral tilt based on the relative E of adaptive + * and innovative excitations + *-------------------------------------------------------------------*/ + +/*! r: tilt of the code */ +float est_tilt( + const float *adpt_exc, /* i : adaptive excitation vector */ + const float gain_pit, /* i : adaptive gain */ + const float *fixe_exc, /* i : algebraic exctitation vector */ + const float gain_code, /* i : algebraic code gain */ + float *voice_fac, /* o : voicing factor */ + const int16_t L_subfr, /* i : subframe size */ + const int16_t flag_tilt /* i : flag for special tilt */ +) +{ + float ener, tmp, tilt_code; + + ener = dotp( adpt_exc, adpt_exc, L_subfr ); + ener *= gain_pit * gain_pit; /* energy of pitch excitation */ + + tmp = dotp( fixe_exc, fixe_exc, L_subfr ); + tmp *= gain_code * gain_code; /* energy of innovative code excitation */ + + /* find voice factor (1=voiced, -1=unvoiced) */ + *voice_fac = (float) ( ( ener - tmp ) / ( ener + tmp + 0.01f ) ); + + /* find tilt of code for next subframe */ + if ( flag_tilt == 0 ) + { + /*Between 0 (=unvoiced) and 0.5 (=voiced)*/ + tilt_code = (float) ( 0.25f * ( 1.0f + *voice_fac ) ); + } + else if ( flag_tilt == 1 ) + { + /*Between 0.25 (=unvoiced) and 0.5 (=voiced)*/ + tilt_code = (float) ( 0.25f + ( *voice_fac + 1.0f ) * 0.125f ); + } + else + { + /*Between 0.28 (=unvoiced) and 0.56 (=voiced)*/ + tilt_code = (float) ( 0.28f + ( *voice_fac + 1.0f ) * 0.14f ); + } + + return tilt_code; +} diff --git a/lib_com/fd_cng_com.c b/lib_com/fd_cng_com.c new file mode 100644 index 0000000000000000000000000000000000000000..a6029e1059691a66da43ba419d7d0ff503b5a899 --- /dev/null +++ b/lib_com/fd_cng_com.c @@ -0,0 +1,1223 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include "options.h" +#include +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + + +/*------------------------------------------------------------------- + * Local function prototypes + *-------------------------------------------------------------------*/ + +static void mhvals( const int16_t d, float *m ); + +static void getmidbands( int16_t *part, const int16_t npart, int16_t *midband, float *psize, float *psize_inv ); + + +/*------------------------------------------------------------------- + * createFdCngCom() + * + * Create an instance of type FD_CNG_COM + *-------------------------------------------------------------------*/ + +ivas_error createFdCngCom( + HANDLE_FD_CNG_COM *hFdCngCom /* i/o: FD_CNG structure containing all buffers and variables */ +) +{ + HANDLE_FD_CNG_COM hs; + + /* Allocate memory */ + if ( ( hs = (HANDLE_FD_CNG_COM) malloc( sizeof( FD_CNG_COM ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for FD CNG COM" ); + } + + *hFdCngCom = hs; + + return IVAS_ERR_OK; +} + + +/*------------------------------------------------------------------- + * initFdCngCom() + * + * + *-------------------------------------------------------------------*/ + +void initFdCngCom( + HANDLE_FD_CNG_COM hFdCngCom, /* i/o: FD_CNG structure containing all buffers and variables */ + const float scale ) +{ + /* Calculate FFT scaling factor */ + hFdCngCom->scalingFactor = 1 / ( scale * scale * 8.f ); + + /* Initialize the overlap-add */ + set_f( hFdCngCom->timeDomainBuffer, 0.0f, L_FRAME16k ); + set_f( hFdCngCom->olapBufferAna, 0.0f, FFTLEN ); + set_f( hFdCngCom->olapBufferSynth, 0.0f, FFTLEN ); + set_f( hFdCngCom->olapBufferSynth2, 0.0f, FFTLEN ); + + /* Initialize the comfort noise generation */ + set_f( hFdCngCom->fftBuffer, 0.0f, FFTLEN ); + set_f( hFdCngCom->cngNoiseLevel, 0.0f, FFTCLDFBLEN ); + + /* Initialize quantizer */ + set_f( hFdCngCom->sidNoiseEst, 0.0f, NPART ); + set_f( hFdCngCom->A_cng, 0.0f, M + 1 ); + hFdCngCom->A_cng[0] = 1.f; + + /* Set some counters and flags */ + hFdCngCom->inactive_frame_counter = 0; /* Either SID or zero frames */ + hFdCngCom->active_frame_counter = 0; + hFdCngCom->frame_type_previous = ACTIVE_FRAME; + hFdCngCom->flag_noisy_speech = 0; + hFdCngCom->likelihood_noisy_speech = 0.f; + hFdCngCom->numCoreBands = 0; + hFdCngCom->stopBand = 0; + hFdCngCom->startBand = 0; + hFdCngCom->stopFFTbin = 0; + hFdCngCom->frameSize = 0; + hFdCngCom->fftlen = 0; + hFdCngCom->seed = 0; + hFdCngCom->seed2 = 1; + hFdCngCom->seed3 = 2; + hFdCngCom->CngBitrate = -1; + + /* Initialize noise estimation algorithm */ + set_f( hFdCngCom->periodog, 0.0f, PERIODOGLEN ); + mhvals( MSNUMSUBFR * MSSUBFRLEN, &( hFdCngCom->msM_win ) ); + mhvals( MSSUBFRLEN, &( hFdCngCom->msM_subwin ) ); + set_f( hFdCngCom->msPeriodogSum, 0.0f, 2 ); + set_f( hFdCngCom->msPsdSum, 0.0f, 2 ); + set_f( hFdCngCom->msSlope, 0.0f, 2 ); + set_f( hFdCngCom->msQeqInvAv, 0.0f, 2 ); + hFdCngCom->msFrCnt_init_counter = 0; + hFdCngCom->msFrCnt_init_thresh = 1; + hFdCngCom->init_old = 0; + hFdCngCom->offsetflag = 0; + hFdCngCom->msFrCnt = MSSUBFRLEN; + hFdCngCom->msMinBufferPtr = 0; + set_f( hFdCngCom->msAlphaCor, 0.3f, 2 ); + + hFdCngCom->coherence = 0.5f; + + return; +} + + +/*------------------------------------------------------------------- + * deleteFdCngCom() + * + * Delete an instance of type FD_CNG_COM + *-------------------------------------------------------------------*/ + +void deleteFdCngCom( + HANDLE_FD_CNG_COM *hFdCngCom /* i/o: FD_CNG structure containing all buffers and variables */ +) +{ + HANDLE_FD_CNG_COM hsCom = *hFdCngCom; + + if ( hsCom != NULL ) + { + free( hsCom ); + *hFdCngCom = NULL; + } + + return; +} + + +/*------------------------------------------------------------------- + * initPartitions() + * + * Initialize the spectral partitioning + *-------------------------------------------------------------------*/ + +void initPartitions( + const int16_t *part_in, + const int16_t npart_in, + const int16_t startBand, + const int16_t stopBand, + int16_t *part_out, + int16_t *npart_out, + int16_t *midband, + float *psize, + float *psize_inv, + const int16_t stopBandFR ) +{ + int16_t i, j, len_out; + + if ( part_in != NULL ) + { + if ( stopBandFR > startBand ) + { + len_out = stopBandFR - startBand; /*part_out*/ + for ( i = 0; i < len_out; i++ ) + { + part_out[i] = i; + } + } + else + { + len_out = 0; + } /*npart_in,part_out*/ + for ( j = 0; j < npart_in && part_in[j] < stopBand; j++ ) + { + if ( part_in[j] >= stopBandFR && part_in[j] >= startBand ) + { + part_out[len_out++] = part_in[j] - startBand; + } + } + } + else + { + len_out = stopBand - startBand; /*part_out*/ + for ( i = 0; i < len_out; i++ ) + { + part_out[i] = i; + } + } + + *npart_out = len_out; + getmidbands( part_out, len_out, midband, psize, psize_inv ); + + return; +} + + +/*------------------------------------------------------------------- + * compress_range() + * + * Apply some dynamic range compression based on the log + *-------------------------------------------------------------------*/ + +void compress_range( + float *in, + float *out, + const int16_t len ) +{ + float *ptrIn = in; + float *ptrOut = out; + int16_t i; + + /* out = log2( 1 + in ) */ + for ( i = 0; i < len; i++ ) + { + *ptrOut = (float) log10( *ptrIn + 1.f ); + ptrIn++; + ptrOut++; + } + v_multc( out, 1.f / (float) log10( 2.f ), out, len ); + + /* Quantize to simulate a fixed-point representation 6Q9 */ + v_multc( out, CNG_LOG_SCALING, out, len ); + for ( ptrOut = out; ptrOut < out + len; ptrOut++ ) + { + *ptrOut = (float) ( (int16_t) ( *ptrOut + 0.5f ) ); + if ( *ptrOut == 0.f ) + { + *ptrOut = 1.f; + } + } + v_multc( out, 1. / CNG_LOG_SCALING, out, len ); + + return; +} + + +/*------------------------------------------------------------------- + * expand_range() + * + * Apply some dynamic range expansion to undo the compression + *-------------------------------------------------------------------*/ + +void expand_range( + float *in, + float *out, + const int16_t len ) +{ + float *ptrIn = in; + float *ptrOut = out; + int16_t i; + + /* out = (2^(in) - 1) */ + for ( i = 0; i < len; i++ ) + { + *ptrOut = (float) pow( 2.f, *ptrIn ) - 1.f; + if ( *ptrOut < 0.0003385080526823181f ) + { + *ptrOut = 0.0003385080526823181f; + } + ptrIn++; + ptrOut++; + } + + return; +} + + +/*------------------------------------------------------------------- + * minimum_statistics() + * + * Noise estimation using Minimum Statistics (MS) + *-------------------------------------------------------------------*/ + +void minimum_statistics( + const int16_t len, /* i : Vector length */ + const int16_t lenFFT, /* i : Length of the FFT part of the vectors */ + float *psize, + float *msPeriodog, /* i : Periodograms */ + float *msNoiseFloor, + float *msNoiseEst, /* o : Noise estimates */ + float *msAlpha, + float *msPsd, + float *msPsdFirstMoment, + float *msPsdSecondMoment, + float *msMinBuf, + float *msBminWin, + float *msBminSubWin, + float *msCurrentMin, + float *msCurrentMinOut, + float *msCurrentMinSubWindow, + int16_t *msLocalMinFlag, + int16_t *msNewMinFlag, + float *msPeriodogBuf, + int16_t *msPeriodogBufPtr, + HANDLE_FD_CNG_COM hFdCngCom, /* i/o: FD_CNG structure containing all buffers and variables */ + const int16_t enc_dec, /* i : encoder/decoder indicator */ + const int16_t element_mode /* i : IVAS element mode type */ +) +{ + float msM_win = hFdCngCom->msM_win; + float msM_subwin = hFdCngCom->msM_subwin; + float *msPsdSum = hFdCngCom->msPsdSum; + float *msPeriodogSum = hFdCngCom->msPeriodogSum; + float slope; + float *ptr; + float msAlphaCorAlpha = MSALPHACORALPHA; + float msAlphaCorAlpha2 = 1.f - MSALPHACORALPHA; + + int16_t i, j, k; + float scalar, scalar2, scalar3; + float snr, BminCorr, QeqInv, QeqInvAv; + float beta; + float msAlphaHatMin2; + int16_t len2 = MSNUMSUBFR * len; + int16_t current_len; + int16_t start, stop, cnt; + int16_t totsize; + const float inv_buflen = 1.f / MSBUFLEN; + + /* No minimum statistics at initialization */ + if ( hFdCngCom->msFrCnt_init_counter < hFdCngCom->msFrCnt_init_thresh ) + { + mvr2r( msPeriodog, msPsd, len ); + mvr2r( msPeriodog, msNoiseFloor, len ); + mvr2r( msPeriodog, msNoiseEst, len ); + mvr2r( msPeriodog, msPsdFirstMoment, len ); + set_f( msPsdSecondMoment, 0.0f, len ); + msPeriodogSum[0] = dotp( msPeriodog, psize, lenFFT ); + msPsdSum[0] = msPeriodogSum[0]; + if ( lenFFT < len ) + { + msPeriodogSum[1] = dotp( msPeriodog + lenFFT, psize + lenFFT, len - lenFFT ); + msPsdSum[1] = msPeriodogSum[1]; + } + + /* Increment frame counter at initialization */ + /* Some frames are sometimes zero at initialization => ignore them */ + if ( msPeriodog[0] < hFdCngCom->init_old ) + { + set_f( msCurrentMinOut, FLT_MAX, len ); + set_f( msCurrentMin, FLT_MAX, len ); + set_f( msMinBuf, FLT_MAX, len2 ); + set_f( msCurrentMinSubWindow, FLT_MAX, len ); + hFdCngCom->msFrCnt_init_counter++; + } + hFdCngCom->init_old = msPeriodog[0]; + } + else + { + + /* Consider the FFT and CLDFB bands separately + - first iteration for FFT bins, + - second one for CLDFB bands in SWB mode */ + start = 0; + stop = lenFFT; + totsize = hFdCngCom->stopFFTbin - hFdCngCom->startBand; + cnt = 0; /*msAlphaCor*/ + while ( stop > start ) + { + current_len = stop - start; + + /* Compute smoothed correction factor for PSD smoothing */ + msPeriodogSum[cnt] = dotp( msPeriodog + start, psize + start, current_len ); + scalar = msPeriodogSum[cnt] * msPeriodogSum[cnt] + DELTA; + scalar2 = msPsdSum[cnt] - msPeriodogSum[cnt]; + scalar = max( scalar / ( scalar + scalar2 * scalar2 ), MSALPHACORMAX ); + hFdCngCom->msAlphaCor[cnt] = msAlphaCorAlpha * hFdCngCom->msAlphaCor[cnt] + msAlphaCorAlpha2 * scalar; + + /* Compute SNR */ + snr = dotp( msNoiseFloor + start, psize + start, current_len ); + snr = ( msPsdSum[cnt] + DELTA ) / ( snr + DELTA ); + snr = (float) pow( snr, MSSNREXP ); + msAlphaHatMin2 = min( MSALPHAHATMIN, snr ); + scalar = MSALPHAMAX * hFdCngCom->msAlphaCor[cnt]; /*msAlpha,msPsd,msPeriodog,msNoiseFloor*/ + for ( j = start; j < stop; j++ ) + { + /* Compute optimal smoothing parameter for PSD estimation */ + scalar2 = msNoiseFloor[j] + DELTA; + scalar2 *= scalar2; + scalar3 = msPsd[j] - msNoiseFloor[j]; + msAlpha[j] = max( ( scalar * scalar2 ) / ( scalar2 + scalar3 * scalar3 ), msAlphaHatMin2 ); + + /* Compute the PSD (smoothed periodogram) in each band */ + msPsd[j] = msAlpha[j] * msPsd[j] + ( 1.f - msAlpha[j] ) * msPeriodog[j]; + } + msPsdSum[cnt] = dotp( msPsd + start, psize + start, current_len ); + QeqInvAv = 0; + scalar = ( (float) ( MSNUMSUBFR * MSSUBFRLEN ) - 1.f ) * ( 1.f - msM_win ); + scalar2 = ( (float) MSSUBFRLEN - 1.f ) * ( 1.f - msM_subwin ); /*msAlpha,msPsd,msPsdFirstMoment,msPsdSecondMoment,msNoiseFloor,msBminSubWin,msBminWin,psize*/ + for ( j = start; j < stop; j++ ) + { + /* Compute variance of PSD */ + beta = min( msAlpha[j] * msAlpha[j], MSBETAMAX ); + scalar3 = msPsd[j] - msPsdFirstMoment[j]; + msPsdFirstMoment[j] = beta * msPsdFirstMoment[j] + ( 1.f - beta ) * msPsd[j]; + msPsdSecondMoment[j] = beta * msPsdSecondMoment[j] + ( 1.f - beta ) * scalar3 * scalar3; + /* Compute inverse of amount of degrees of freedom */ + QeqInv = min( ( msPsdSecondMoment[j] + DELTA ) / ( 2.f * msNoiseFloor[j] * msNoiseFloor[j] + DELTA ), MSQEQINVMAX ); + QeqInvAv += QeqInv * psize[j]; + + /* Compute bias correction Bmin */ + msBminWin[j] = 1.f + scalar * QeqInv / ( 0.5f - msM_win * QeqInv ); + msBminSubWin[j] = 1.f + scalar2 * QeqInv / ( 0.5f - msM_subwin * QeqInv ); + } + QeqInvAv /= totsize; + hFdCngCom->msQeqInvAv[cnt] = QeqInvAv; + + /* New minimum? */ + BminCorr = 1.f + MSAV * (float) sqrt( QeqInvAv ); /*msPsd,msBminWin,msNewMinFlag,msCurrentMin,msCurrentMinSubWindow*/ + for ( j = start; j < stop; j++ ) + { + scalar = BminCorr * msPsd[j]; + scalar2 = scalar * msBminWin[j]; + if ( scalar2 < msCurrentMin[j] ) + { + msNewMinFlag[j] = 1; + msCurrentMin[j] = scalar2; + msCurrentMinSubWindow[j] = scalar * msBminSubWin[j]; + } + else + { + msNewMinFlag[j] = 0; + } + } + + /* This is used later to identify local minima */ + if ( hFdCngCom->msFrCnt >= MSSUBFRLEN ) + { + i = 0; + while ( i < 3 ) + { + if ( hFdCngCom->msQeqInvAv[cnt] < msQeqInvAv_thresh[i] ) + { + break; + } + else + { + i++; + } + } + hFdCngCom->msSlope[cnt] = msNoiseSlopeMax[i]; + } + + /* Consider the FFT and CLDFB bands separately */ + start = stop; + stop = len; + totsize = hFdCngCom->stopBand - hFdCngCom->stopFFTbin; + cnt++; + } /*while (stop > start)*/ + + /* Update minimum between sub windows */ + if ( hFdCngCom->msFrCnt > 1 && hFdCngCom->msFrCnt < MSSUBFRLEN ) + { + /*msNewMinFlag,msCurrentMinSubWindow,msCurrentMinOut*/ + for ( j = 0; j < len; j++ ) + { + if ( msNewMinFlag[j] > 0 ) + { + msLocalMinFlag[j] = 1; + } + if ( msCurrentMinSubWindow[j] < msCurrentMinOut[j] ) + { + msCurrentMinOut[j] = msCurrentMinSubWindow[j]; + } + } + /* Get the current noise floor */ + mvr2r( msCurrentMinOut, msNoiseFloor, len ); + } + + /* sub window complete */ + else + { + if ( hFdCngCom->msFrCnt >= MSSUBFRLEN ) + { + /* Collect buffers */ + mvr2r( msCurrentMinSubWindow, msMinBuf + len * hFdCngCom->msMinBufferPtr, len ); + + /* Compute minimum among all buffers */ + mvr2r( msMinBuf, msCurrentMinOut, len ); + ptr = msMinBuf + len; + for ( i = 1; i < MSNUMSUBFR; i++ ) + { + /*msCurrentMinOut*/ + for ( j = 0; j < len; j++ ) + { + if ( *ptr < msCurrentMinOut[j] ) + { + msCurrentMinOut[j] = *ptr; + } + ptr++; + } + } + + /* Take over local minima */ + slope = hFdCngCom->msSlope[0]; /*msLocalMinFlag,msNewMinFlag,msCurrentMinSubWindow,msCurrentMinOut*/ + for ( j = 0; j < len; j++ ) + { + if ( j == lenFFT ) + { + slope = hFdCngCom->msSlope[1]; + } + if ( msLocalMinFlag[j] && !msNewMinFlag[j] && + msCurrentMinSubWindow[j] < slope * msCurrentMinOut[j] && + msCurrentMinSubWindow[j] > msCurrentMinOut[j] ) + { + msCurrentMinOut[j] = msCurrentMinSubWindow[j]; + i = j; + for ( k = 0; k < MSNUMSUBFR; k++ ) + { + msMinBuf[i] = msCurrentMinOut[j]; + i += len; + } + } + } + + /* Reset */ + set_s( msLocalMinFlag, 0, len ); + set_f( msCurrentMin, FLT_MAX, len ); + + /* Get the current noise floor */ + mvr2r( msCurrentMinOut, msNoiseFloor, len ); + } + } + + /* Detect sudden offsets based on the FFT bins (core bandwidth) */ + if ( msPsdSum[0] > 50.f * msPeriodogSum[0] ) + { + if ( hFdCngCom->offsetflag > 0 ) + { + mvr2r( msPeriodog, msPsd, len ); + mvr2r( msPeriodog, msCurrentMinOut, len ); + set_f( hFdCngCom->msAlphaCor, 1.0f, cnt ); + set_f( msAlpha, 0.0f, len ); + mvr2r( msPeriodog, msPsdFirstMoment, len ); + set_f( msPsdSecondMoment, 0.0f, len ); + msPsdSum[0] = dotp( msPeriodog, psize, lenFFT ); + if ( lenFFT < len ) + { + msPsdSum[1] = dotp( msPeriodog + lenFFT, psize + lenFFT, len - lenFFT ); + } + } + hFdCngCom->offsetflag = 1; + } + else + { + hFdCngCom->offsetflag = 0; + } + + /* Increment frame counter */ + if ( hFdCngCom->msFrCnt == MSSUBFRLEN ) + { + hFdCngCom->msFrCnt = 1; + hFdCngCom->msMinBufferPtr++; + if ( hFdCngCom->msMinBufferPtr == MSNUMSUBFR ) + { + hFdCngCom->msMinBufferPtr = 0; + } + } + else + { + ( hFdCngCom->msFrCnt )++; + } + + /* Smooth noise estimate during CNG phases */ /*msNoiseEst,msNoiseFloor*/ + for ( j = 0; j < len; j++ ) + { + msNoiseEst[j] = 0.95f * msNoiseEst[j] + 0.05f * msNoiseFloor[j]; + } + } + + if ( enc_dec == DEC && element_mode == IVAS_CPE_TD ) + { + v_multc( msNoiseEst, 1.4125f, msNoiseEst, NPART_SHAPING ); + } + + /* Collect buffers */ + mvr2r( msPeriodog, msPeriodogBuf + len * ( *msPeriodogBufPtr ), len ); + + ( *msPeriodogBufPtr )++; + if ( ( *msPeriodogBufPtr ) == MSBUFLEN ) + { + ( *msPeriodogBufPtr ) = 0; + } + + /* Upper limit the noise floors with the averaged input energy */ /*msNoiseEst*/ + for ( j = 0; j < len; j++ ) + { + scalar = msPeriodogBuf[j]; + for ( i = j + len; i < MSBUFLEN * len; i += len ) + { + scalar += msPeriodogBuf[i]; + } /*division by a constant = multiplication by its (constant) inverse */ + scalar *= inv_buflen; + if ( msNoiseEst[j] > scalar ) + { + msNoiseEst[j] = scalar; + } + assert( msNoiseEst[j] >= 0 ); + } + + return; +} + + +/*------------------------------------------------------------------- + * apply_scale() + * + * Apply bitrate-dependent scale + *-------------------------------------------------------------------*/ + +void apply_scale( + float *scale, /* o : scalefactor */ + const int16_t bwidth, /* i : audio bandwidth */ + const int32_t brate, /* i : Bit rate */ + const SCALE_SETUP *scaleTable, /* i : Scale table */ + const int16_t scaleTableSize /* i : Size of scale table */ +) +{ + int16_t i; + + for ( i = 0; i < scaleTableSize; i++ ) + { + if ( ( bwidth == scaleTable[i].bwmode ) && + ( brate >= scaleTable[i].bitrateFrom ) && + ( brate < scaleTable[i].bitrateTo ) ) + { + break; + } + } + + assert( i < scaleTableSize ); + + *scale += scaleTable[i].scale; + + return; +} + + +/*------------------------------------------------------------------- + * bandcombinepow() + * + * Compute the power for each partition + *-------------------------------------------------------------------*/ + +void bandcombinepow( + const float *bandpow, /* i : Power for each band */ + const int16_t nband, /* i : Number of bands */ + int16_t *part, /* i : Partition upper boundaries (band indices starting from 0) */ + const int16_t npart, /* i : Number of partitions */ + const float *psize_inv, /* i : Inverse partition sizes */ + float *partpow /* o : Power for each partition */ +) +{ + int16_t i, p; + float temp; + + if ( nband == npart ) + { + mvr2r( bandpow, partpow, nband ); + } + else + { + /* Compute the power in each partition */ + i = 0; /*part,partpow,psize_inv*/ + for ( p = 0; p < npart; p++ ) + { + /* Arithmetic averaging of power for all bins in partition */ + temp = 0; + for ( ; i <= part[p]; i++ ) + { + temp += bandpow[i]; + } + partpow[p] = temp * psize_inv[p]; + } + } + + return; +} + + +/*------------------------------------------------------------------- + * scalebands() + * + * Scale partitions (with smoothing) + *-------------------------------------------------------------------*/ + +void scalebands( + const float *partpow, /* i : Power for each partition */ + int16_t *part, /* i : Partition upper boundaries (band indices starting from 0) */ + const int16_t npart, /* i : Number of partitions */ + int16_t *midband, /* i : Central band of each partition */ + const int16_t nFFTpart, /* i : Number of FFT partitions */ + const int16_t nband, /* i : Number of bands */ + float *bandpow, /* o : Power for each band */ + const int16_t flag_fft_en ) +{ + int16_t i, j = 0, nint, startBand, startPart, stopPart; + float val, delta = 0.f; + + /* Interpolate the bin/band-wise levels from the partition levels */ + if ( nband == npart ) + { + mvr2r( partpow, bandpow, npart ); + } + else + { + startBand = 0; + startPart = 0; + stopPart = nFFTpart; + while ( startBand < nband ) + { + if ( flag_fft_en || startPart >= nFFTpart ) + { + + /* first half partition */ + j = startPart; + val = partpow[j]; + for ( i = startBand; i <= midband[j]; i++ ) + { + bandpow[i] = val; + } + j++; + + delta = 1; + /* inner partitions */ + for ( ; j < stopPart; j++ ) + { + nint = midband[j] - midband[j - 1]; + /* log-linear interpolation */ /* Only one new LOG needs to be computed per loop iteration */ + delta = (float) exp( ( log( partpow[j] + DELTA ) - log( partpow[j - 1] + DELTA ) ) * normReciprocal[nint] ); + val = partpow[j - 1]; + for ( ; i < midband[j]; i++ ) + { + val *= delta; + bandpow[i] = val; + } + bandpow[i++] = partpow[j]; + } + if ( delta > 1.f ) + { + delta = 1.f; + } + + /* last half partition */ + val = partpow[stopPart - 1]; + for ( ; i <= part[stopPart - 1]; i++ ) + { + val *= delta; + bandpow[i] = val; + } + } + startBand = part[stopPart - 1] + 1; + startPart = stopPart; + stopPart = npart; + } + } + + return; +} + + +/*------------------------------------------------------------------- + * getmidbands() + * + * Get central band for each partition + *-------------------------------------------------------------------*/ + +static void getmidbands( + int16_t *part, /* i : Partition upper boundaries (band indices starting from 0) */ + const int16_t npart, /* i : Number of partitions */ + int16_t *midband, /* o : Central band of each partition */ + float *psize, /* o : Partition sizes */ + float *psize_inv /* o : Inverse of partition sizes */ +) +{ + int16_t j; + + /* first half partition */ + midband[0] = part[0]; + psize[0] = (float) part[0] + 1.f; + psize_inv[0] = normReciprocal[part[0] + 1]; + + /* inner partitions */ /*part,midband,psize_inv*/ + for ( j = 1; j < npart; j++ ) + { + midband[j] = ( part[j - 1] + 1 + part[j] ) >> 1; + psize[j] = (float) ( part[j] - part[j - 1] ); + psize_inv[j] = normReciprocal[part[j] - part[j - 1]]; + } + + return; +} + + +/*------------------------------------------------------------------- + * AnalysisSTFT() + * + * STFT analysis filterbank + *-------------------------------------------------------------------*/ + +void AnalysisSTFT( + const float *timeDomainInput, + float *fftBuffer, /* o : FFT bins */ + HANDLE_FD_CNG_COM hFdCngCom /* i/o: FD_CNG structure containing all buffers and variables */ +) +{ + float *olapBuffer = hFdCngCom->olapBufferAna; + const float *olapWin = hFdCngCom->olapWinAna; + + /* Shift and cascade for overlap-add */ + mvr2r( olapBuffer + hFdCngCom->frameSize, olapBuffer, hFdCngCom->fftlen - hFdCngCom->frameSize ); + mvr2r( timeDomainInput, olapBuffer + hFdCngCom->fftlen - hFdCngCom->frameSize, hFdCngCom->frameSize ); + + /* Window the signal */ + v_mult( olapBuffer, olapWin, fftBuffer, hFdCngCom->fftlen ); + + /* Perform FFT */ + RFFTN( fftBuffer, hFdCngCom->fftSineTab, hFdCngCom->fftlen, -1 ); + + return; +} + + +/*------------------------------------------------------------------- + * SynthesisSTFT() + * + * STFT synthesis filterbank + *-------------------------------------------------------------------*/ + +void SynthesisSTFT( + float *fftBuffer, /* i : FFT bins */ + float *timeDomainOutput, + float *olapBuffer, + const float *olapWin, + const int16_t tcx_transition, + HANDLE_FD_CNG_COM hFdCngCom, /* i/o: FD_CNG structure containing all buffers and variables */ + const int16_t element_mode, /* i : element mode */ + const int16_t nchan_out /* i : number of output channels */ +) +{ + int16_t i; + float buf[M + 1 + 320], tmp; + + /* Perform IFFT */ + RFFTN( fftBuffer, hFdCngCom->fftSineTab, hFdCngCom->fftlen, 1 ); + + /* Handle overlap in P/S domain for stereo */ + if ( ( element_mode == IVAS_CPE_TD || element_mode == IVAS_CPE_DFT ) && nchan_out == 2 ) + { + mvr2r( olapBuffer + 3 * hFdCngCom->frameSize / 4 - ( M + 1 ), buf, hFdCngCom->frameSize + M + 1 ); + set_f( olapBuffer, 0.0f, hFdCngCom->fftlen ); + } + else + { + mvr2r( olapBuffer + hFdCngCom->frameSize, olapBuffer, hFdCngCom->frameSize ); + set_f( olapBuffer + hFdCngCom->frameSize, 0.0f, hFdCngCom->frameSize ); /*olapBuffer, fftBuffer, olapWin*/ + } + + if ( tcx_transition ) + { + for ( i = 0; i < 5 * hFdCngCom->frameSize / 4; i++ ) + { + olapBuffer[i] = fftBuffer[i]; + } + } + else + { + for ( i = hFdCngCom->frameSize / 4; i < 3 * hFdCngCom->frameSize / 4; i++ ) + { + olapBuffer[i] += fftBuffer[i] * olapWin[i - hFdCngCom->frameSize / 4]; + } + for ( ; i < 5 * hFdCngCom->frameSize / 4; i++ ) + { + olapBuffer[i] = fftBuffer[i]; + } + } + for ( ; i < 7 * hFdCngCom->frameSize / 4; i++ ) + { + olapBuffer[i] = fftBuffer[i] * olapWin[i - 3 * hFdCngCom->frameSize / 4]; + } + + for ( ; i < hFdCngCom->fftlen; i++ ) + { + olapBuffer[i] = 0; + } + + /* Get time-domain signal */ + v_multc( olapBuffer + hFdCngCom->frameSize / 4, (float) ( hFdCngCom->fftlen / 2 ), timeDomainOutput, hFdCngCom->frameSize ); + + /* Get excitation */ + if ( ( element_mode == IVAS_CPE_TD || element_mode == IVAS_CPE_DFT ) && nchan_out == 2 ) + { + for ( i = 0; i < hFdCngCom->frameSize / 2; i++ ) + { + buf[i + ( M + 1 )] += olapBuffer[i + hFdCngCom->frameSize / 4]; + } + v_multc( buf, (float) ( hFdCngCom->fftlen / 2 ), buf, M + 1 + hFdCngCom->frameSize ); + } + else + { + v_multc( olapBuffer + hFdCngCom->frameSize / 4 - ( M + 1 ), (float) ( hFdCngCom->fftlen / 2 ), buf, M + 1 + hFdCngCom->frameSize ); + } + + tmp = buf[0]; + preemph( buf + 1, PREEMPH_FAC, M + hFdCngCom->frameSize, &tmp ); + residu( hFdCngCom->A_cng, M, buf + 1 + M, hFdCngCom->exc_cng, hFdCngCom->frameSize ); + + return; +} + + +/*------------------------------------------------------------------- + * SynthesisSTFT_dirac() + * + * STFT synthesis filterbank + *-------------------------------------------------------------------*/ + +void SynthesisSTFT_dirac( + float *fftBuffer, /* i : FFT bins */ + float *timeDomainOutput, + float *olapBuffer, + const float *olapWin, + const int16_t samples_out, + HANDLE_FD_CNG_COM hFdCngCom /* i/o: FD_CNG structure containing all buffers and variables */ +) +{ + int16_t i; + float buf[M + 1 + 320], tmp; + + /* Perform IFFT */ + RFFTN( fftBuffer, hFdCngCom->fftSineTab, hFdCngCom->fftlen, 1 ); + + /* Handle overlap in P/S domain for stereo */ + mvr2r( olapBuffer + hFdCngCom->frameSize, olapBuffer, hFdCngCom->frameSize ); + set_f( olapBuffer + hFdCngCom->frameSize, 0.0f, hFdCngCom->frameSize ); /*olapBuffer, fftBuffer, olapWin*/ + + for ( i = hFdCngCom->frameSize / 4; i < 3 * hFdCngCom->frameSize / 4; i++ ) + { + olapBuffer[i] += fftBuffer[i] * olapWin[i - hFdCngCom->frameSize / 4]; + } + for ( ; i < 5 * hFdCngCom->frameSize / 4; i++ ) + { + olapBuffer[i] = fftBuffer[i]; + } + + for ( ; i < 7 * hFdCngCom->frameSize / 4; i++ ) + { + olapBuffer[i] = fftBuffer[i]; + } + + for ( ; i < hFdCngCom->fftlen; i++ ) + { + olapBuffer[i] = 0; + } + + /* Get time-domain signal */ + v_multc( olapBuffer + hFdCngCom->frameSize / 4, (float) ( hFdCngCom->fftlen / 2 ), timeDomainOutput, samples_out ); + + /* Get excitation */ + v_multc( olapBuffer + hFdCngCom->frameSize / 4 - ( M + 1 ), (float) ( hFdCngCom->fftlen / 2 ), buf, M + 1 + hFdCngCom->frameSize ); + tmp = buf[0]; + preemph( buf + 1, PREEMPH_FAC, M + hFdCngCom->frameSize, &tmp ); + residu( hFdCngCom->A_cng, M, buf + 1 + M, hFdCngCom->exc_cng, hFdCngCom->frameSize ); + + /* update and window olapBuf if we have a output frame that is shorter than the default frame size...*/ + if ( samples_out < hFdCngCom->frameSize ) + { + mvr2r( olapBuffer + samples_out, olapBuffer + hFdCngCom->frameSize, 3 * hFdCngCom->frameSize / 4 ); + } + for ( i = 5 * hFdCngCom->frameSize / 4; i < 7 * hFdCngCom->frameSize / 4; i++ ) + { + olapBuffer[i] *= olapWin[i - 3 * hFdCngCom->frameSize / 4]; + } + + return; +} + + +/*------------------------------------------------------------------- + * mhvals() + * + * Compute some values used in the bias correction of the minimum statistics algorithm + *-------------------------------------------------------------------*/ + +static void mhvals( + const int16_t d, + float *m ) +{ + int16_t i, j; + float qi, qj, q; + int16_t len = SIZE_SCALE_TABLE_CN; + + i = 0; + for ( i = 0; i < len; i++ ) + { + if ( d <= d_array[i] ) + { + break; + } + } + if ( i == len ) + { + i = len - 1; + j = i; + } + else + { + j = i - 1; + } + if ( d == d_array[i] ) + { + *m = m_array[i]; + } + else + { + qj = (float) sqrt( (float) d_array[i - 1] ); /*interpolate using sqrt(d)*/ + qi = (float) sqrt( (float) d_array[i] ); + q = (float) sqrt( (float) d ); + *m = m_array[i] + ( qi * qj / q - qj ) * ( m_array[j] - m_array[i] ) / ( qi - qj ); + } + + return; +} + +/*------------------------------------------------------------------- + * rand_gauss() + * + * Random generator with Gaussian distribution with mean 0 and std 1 + *-------------------------------------------------------------------*/ + +float rand_gauss( + float *x, + int16_t *seed ) +{ + float temp; + + temp = (float) own_random( seed ); + temp += (float) own_random( seed ); + temp += (float) own_random( seed ); + temp *= OUTMAX_INV; + + *x = temp; + + return temp; +} + + +/*------------------------------------------------------------------- + * lpc_from_spectrum() + * + * + *-------------------------------------------------------------------*/ + +void lpc_from_spectrum( + HANDLE_FD_CNG_COM hFdCngCom, + const int16_t start, + const int16_t stop, + const float preemph_fac ) +{ + int16_t i; + float r[32], nf; + float fftBuffer[FFTLEN], *ptr, *pti; + + float *powspec = hFdCngCom->cngNoiseLevel; + int16_t fftlen = hFdCngCom->fftlen; + const float *fftSineTab = hFdCngCom->fftSineTab; + float *A = hFdCngCom->A_cng; + + /* Power Spectrum */ + ptr = fftBuffer; + pti = fftBuffer + 1; + nf = 1e-3f; + for ( i = 0; i < start; i++ ) + { + *ptr = nf; + *pti = 0.f; + ptr += 2; + pti += 2; + } + for ( ; i < stop; i++ ) + { + *ptr = max( nf, powspec[i - start] ); + *pti = 0.f; + ptr += 2; + pti += 2; + } + for ( ; i < fftlen / 2; i++ ) + { + *ptr = nf; + *pti = 0.f; + ptr += 2; + pti += 2; + } + fftBuffer[1] = nf; + + /* Pre-emphasis */ + ptr = fftBuffer; + for ( i = 0; i < fftlen / 2; i++ ) + { + *ptr *= ( 1.f + preemph_fac * preemph_fac - 2.0f * preemph_fac * (float) cos( -2.0f * EVS_PI * (float) i / (float) fftlen ) ); + + ptr += 2; + } + fftBuffer[1] *= ( 1.f + preemph_fac * preemph_fac + 2.0f * preemph_fac ); + + /* Autocorrelation */ + RFFTN( fftBuffer, fftSineTab, fftlen, 1 ); + for ( i = 0; i <= M; i++ ) + { + r[i] = fftBuffer[i] * ( fftlen / 2 ) * ( fftlen / 2 ); + } + if ( r[0] < 100.f ) + { + r[0] = 100.f; + } + + r[0] *= 1.0005f; + + /* LPC */ + lev_dur( A, r, M, NULL ); + + return; +} + + +/*------------------------------------------------------------------- + * FdCng_exc() + * + * Generate FD-CNG as LP excitation + *-------------------------------------------------------------------*/ + +void FdCng_exc( + HANDLE_FD_CNG_COM hFdCngCom, + int16_t *CNG_mode, + const int16_t L_frame, + const float *lsp_old, + const int16_t first_CNG, + float *lspCNG, + float *Aq, /* o : LPC coeffs */ + float *lsp_new, /* o : lsp */ + float *lsf_new, /* o : lsf */ + float *exc, /* o : LP excitation */ + float *exc2, /* o : LP excitation */ + float *bwe_exc /* o : LP excitation for BWE */ +) +{ + int16_t i; + *CNG_mode = -1; + + /*Get excitation */ + for ( i = 0; i < L_frame / L_SUBFR; i++ ) + { + mvr2r( hFdCngCom->A_cng, Aq + i * ( M + 1 ), M + 1 ); + } + + a2lsp_stab( Aq, lsp_new, lsp_old ); + + if ( first_CNG == 0 ) + { + mvr2r( lsp_old, lspCNG, M ); + } + + for ( i = 0; i < M; i++ ) + { + /* AR low-pass filter */ + lspCNG[i] = CNG_ISF_FACT * lspCNG[i] + ( 1 - CNG_ISF_FACT ) * lsp_new[i]; + } + + if ( L_frame == L_FRAME16k ) + { + lsp2lsf( lsp_new, lsf_new, M, INT_FS_16k ); + } + else + { + lsp2lsf( lsp_new, lsf_new, M, INT_FS_12k8 ); + } + + mvr2r( hFdCngCom->exc_cng, exc, L_frame ); + mvr2r( hFdCngCom->exc_cng, exc2, L_frame ); + + if ( bwe_exc ) + { + if ( L_frame == L_FRAME ) + { + interp_code_5over2( exc2, bwe_exc, L_frame ); + } + else + { + interp_code_4over2( exc2, bwe_exc, L_frame ); + } + } + + return; +} diff --git a/lib_com/fft.c b/lib_com/fft.c new file mode 100644 index 0000000000000000000000000000000000000000..e5607dcc3aeb35a9dae5706e4b7bd0f1b693646a --- /dev/null +++ b/lib_com/fft.c @@ -0,0 +1,6767 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + +#ifdef _MSC_VER +#pragma warning( disable : 4310 ) +#endif + +/*-----------------------------------------------------------------* + * Local constants + *-----------------------------------------------------------------*/ + +#define FFT_15PONIT_WNK1 0.55901699f /* EDCT & EMDCT constants */ +#define FFT_15PONIT_WNK2 0.95105652f /* EDCT & EMDCT constants */ +#define FFT_15PONIT_WNK3 0.58778525f /* EDCT & EMDCT constants */ +#define FFT_15PONIT_WNK4 0.86602540f /* EDCT & EMDCT constants */ +#define FFT_15PONIT_WNK5 0.25000000f /* EDCT & EMDCT constants */ + +/* FFT constants */ +#define FFT_C31 -0.8660254037f +#define FFT_C51 0.9510565195f +#define FFT_C52 -1.5388417989f +#define FFT_C53 -0.3632712597f +#define FFT_C54 0.5590169895f +#define FFT_C55 -1.2500000000f +#define FFT_C61 0.8660254036f +#define FFT_C81 0.7071067811f +#define FFT_C82 -0.7071067811f +#define FFT_C161 0.7071067811f +#define FFT_C162 -0.7071067811f +#define FFT_C163 0.9238795325f +#define FFT_C164 -0.9238795325f +#define FFT_C165 0.3826834323f +#define FFT_C166 -0.3826834323f + + +/*-----------------------------------------------------------------* + * Local function prototypes + *-----------------------------------------------------------------*/ + +static void cdftForw( int16_t n, float *a, const int16_t *ip, const float *w ); +static void bitrv2_SR( int16_t n, const int16_t *ip, float *a ); +static void cftfsub( int16_t n, float *a, const float *w ); +static void cft1st( int16_t n, float *a, const float *w ); +static void cftmdl( int16_t n, int16_t l, float *a, const float *w ); +static void fft16( float *x, float *y, const int16_t *Idx ); +static void fft5_shift1( int16_t n1, float *zRe, float *zIm, const int16_t *Idx ); +static void fft8( float *x, float *y, const int16_t *Idx ); +static void fft15_shift2( int16_t n1, float *zRe, float *zIm, const int16_t *Idx ); +static void fft15_shift8( int16_t n1, float *zRe, float *zIm, const int16_t *Idx ); +static void fft5_shift4( int16_t n1, float *zRe, float *zIm, const int16_t *Idx ); +static void fft5_32( float *zRe, float *zIm, const int16_t *Idx ); +static void fft64( float *x, float *y, const int16_t *Idx ); +static void fft32_15( float *x, float *y, const int16_t *Idx ); +static void fft32_5( float *x, float *y, const int16_t *Idx ); +static void fft8_5( float *x, float *y, const int16_t *Idx ); +static void fft5_8( int16_t n1, float *zRe, float *zIm, const int16_t *Idx ); +static void fft4_5( float *x, float *y, const int16_t *Idx ); +static void fft5_4( int16_t n1, float *zRe, float *zIm, const int16_t *Idx ); + +static float fmac( float a, float b, float c ) +{ + return ( ( ( a ) * ( b ) ) + ( c ) ); +} + +static float fnms( float a, float b, float c ) +{ + return ( ( c ) - ( ( a ) * ( b ) ) ); +} + +/*-----------------------------------------------------------------* + * fft15_shift2() + * 15-point FFT with 2-point circular shift + *-----------------------------------------------------------------*/ + +static void fft15_shift2( + int16_t n1, /* i : length of data */ + float *zRe, /* i/o: real part of input and output data */ + float *zIm, /* i/o: imaginary part of input and output data */ + const int16_t *Idx /* i : pointer of the address table */ +) +{ + int16_t in0, in8, in16, in24, in32, in1, in9, in17, in25, in33, in2, in10, in18, in26, in34; + float fi1, fi2, fi3, fi4, fi5, fi6, fi7, fi8, fi9, fi10, fi11, fi12, fi13, fi14, fi15; + float fi16, fi17, fi18, fi19, fi20, fi21, fi22, fi23, fi24, fi25, fi26, fi27, fi28, fi29, fi30; + float f2i1, f2i2, f2i3, f2i4, f2i5, f2i6, f2i7, f2i8, f2i9, f2i10, f2i11, f2i12; + float f2i13, f2i14, f2i15, f2i16, f2i17, f2i18, f2i19, f2i20, f2i21, f2i22, f2i23, f2i24; + float f3i1, f3i2, f3i3, f3i4, f3i5, f3i6, f3i7, f3i8, f3i9, f3i10, f3i11, f3i12, f3i13, f3i14, f3i15; + float f4i1, f4i2, f4i3, f4i4, f4i5, f4i6, f4i7, f4i8, f4i9; + float f4i10, f4i11, f4i12, f4i13, f4i14, f4i15, f4i16, f4i17, f4i18, f4i19, f4i20, fo1, fo2, fo3, fo4; + float fo5, fo6, fo7, fo8, fo9, fo10, fo11, fo12, fo13, fo14, fo15, fo16, fo17, fo18; + float f2o1, f2o2, f2o3, f2o4, f2o5, f2o6, f2o7, f2o8, f2o9, f2o10, f2o11, f2o12, f2o13; + float f2o14, f2o15, f3o1, f3o2, f3o3, f3o4, f3o5, f3o6, f3o7, f3o8, f3o9, f3o10, f3o11; + float f3o12, f3o13, f3o14, f3o15, f4o1, f4o2, f4o3, f4o4, f4o5, f4o6; + float f4o7, f4o8, f4o9, f4o10, f4o11, f4o12, f4o13, f4o14, f4o15, f4o16, f4o17, f4o18, f4o19; + + in0 = Idx[0]; + in8 = Idx[n1]; + in16 = Idx[n1 * 2]; + in24 = Idx[n1 * 3]; + in32 = Idx[n1 * 4]; + in1 = Idx[n1 * 5]; + in9 = Idx[n1 * 6]; + in17 = Idx[n1 * 7]; + in25 = Idx[n1 * 8]; + in33 = Idx[n1 * 9]; + in2 = Idx[n1 * 10]; + in10 = Idx[n1 * 11]; + in18 = Idx[n1 * 12]; + in26 = Idx[n1 * 13]; + in34 = Idx[n1 * 14]; + + f2i13 = zRe[in0]; + f2i14 = zIm[in0]; + f2i21 = zRe[in1]; + f2i22 = zRe[in2]; + f2i23 = zIm[in1]; + f2i24 = zIm[in2]; + + f2i15 = f2i21 + f2i22; + f2i16 = FFT_15PONIT_WNK4 * ( f2i22 - f2i21 ); + f2i17 = FFT_15PONIT_WNK4 * ( f2i23 - f2i24 ); + f2i18 = f2i23 + f2i24; + fi1 = f2i13 + f2i15; + fi2 = f2i14 + f2i18; + + f2i19 = fnms( 0.5f, f2i15, f2i13 ); + f2i20 = fnms( 0.5f, f2i18, f2i14 ); + fi3 = f2i19 - f2i17; + fi4 = f2i19 + f2i17; + fi5 = f2i16 + f2i20; + fi6 = f2i20 - f2i16; + + f3i1 = zRe[in9]; + f4i2 = zRe[in10]; + f4i3 = zRe[in8]; + f3i2 = f4i2 + f4i3; + f3i3 = fnms( 0.5f, f3i2, f3i1 ); + f3i4 = FFT_15PONIT_WNK4 * ( f4i3 - f4i2 ); + + f3i5 = zIm[in9]; + f4i4 = zIm[in10]; + f4i5 = zIm[in8]; + f3i6 = f4i4 + f4i5; + f3i7 = FFT_15PONIT_WNK4 * ( f4i4 - f4i5 ); + f3i8 = fnms( 0.5f, f3i6, f3i5 ); + + f3i9 = zRe[in33]; + f4i6 = zRe[in34]; + f4i7 = zRe[in32]; + f3i10 = f4i6 + f4i7; + f3i11 = fnms( 0.5f, f3i10, f3i9 ); + f3i12 = FFT_15PONIT_WNK4 * ( f4i7 - f4i6 ); + + f3i13 = zIm[in33]; + f4i8 = zIm[in34]; + f4i9 = zIm[in32]; + f3i14 = f4i8 + f4i9; + f3i15 = FFT_15PONIT_WNK4 * ( f4i8 - f4i9 ); + f4i1 = fnms( 0.5f, f3i14, f3i13 ); + + fi7 = f3i1 + f3i2; + fi8 = f3i9 + f3i10; + fi9 = fi7 + fi8; + fi10 = f3i3 - f3i7; + fi11 = f3i11 - f3i15; + fi12 = fi10 + fi11; + fi13 = f3i5 + f3i6; + fi14 = f3i13 + f3i14; + fi15 = fi13 + fi14; + fi16 = f3i8 - f3i4; + fi17 = f4i1 - f3i12; + fi18 = fi16 + fi17; + fi19 = f3i4 + f3i8; + fi20 = f3i12 + f4i1; + fi21 = fi19 + fi20; + fi22 = f3i3 + f3i7; + fi23 = f3i11 + f3i15; + fi24 = fi22 + fi23; + + f4i10 = zRe[in24]; + fo6 = zRe[in25]; + fo7 = zRe[in26]; + f4i11 = fo6 + fo7; + f4i12 = fnms( 0.5f, f4i11, f4i10 ); + f4i13 = FFT_15PONIT_WNK4 * ( fo7 - fo6 ); + + f4i14 = zIm[in24]; + fo8 = zIm[in25]; + fo9 = zIm[in26]; + f4i15 = fo8 + fo9; + f4i16 = FFT_15PONIT_WNK4 * ( fo8 - fo9 ); + f4i17 = fnms( 0.5f, f4i15, f4i14 ); + + f4i18 = zRe[in18]; + f2o10 = zRe[in16]; + f2o11 = zRe[in17]; + f4i19 = f2o10 + f2o11; + f4i20 = fnms( 0.5f, f4i19, f4i18 ); + fo1 = FFT_15PONIT_WNK4 * ( f2o11 - f2o10 ); + + fo2 = zIm[in18]; + f2o12 = zIm[in16]; + f2o13 = zIm[in17]; + fo3 = f2o12 + f2o13; + fo4 = FFT_15PONIT_WNK4 * ( f2o12 - f2o13 ); + fo5 = fnms( 0.5f, fo3, fo2 ); + + fi25 = f4i10 + f4i11; + fi26 = f4i18 + f4i19; + fi27 = fi25 + fi26; + fi28 = f4i12 - f4i16; + fi29 = f4i20 - fo4; + fi30 = fi28 + fi29; + f2i1 = f4i14 + f4i15; + f2i2 = fo2 + fo3; + f2i3 = f2i1 + f2i2; + f2i4 = f4i17 - f4i13; + f2i5 = fo5 - fo1; + f2i6 = f2i4 + f2i5; + f2i7 = f4i13 + f4i17; + f2i8 = fo1 + fo5; + f2i9 = f2i7 + f2i8; + f2i10 = f4i12 + f4i16; + f2i11 = f4i20 + fo4; + f2i12 = f2i10 + f2i11; + + fo10 = FFT_15PONIT_WNK1 * ( fi27 - fi9 ); + fo11 = fi27 + fi9; + fo12 = fnms( FFT_15PONIT_WNK5, fo11, fi1 ); + fo15 = fi13 - fi14; + fo16 = f2i1 - f2i2; + fo13 = fnms( FFT_15PONIT_WNK3, fo16, FFT_15PONIT_WNK2 * fo15 ); + fo14 = fmac( FFT_15PONIT_WNK2, fo16, FFT_15PONIT_WNK3 * fo15 ); + + zRe[in0] = fi1 + fo11; + fo17 = fo10 + fo12; + zRe[in18] = fo17 - fo14; + zRe[in24] = fo17 + fo14; + fo18 = fo12 - fo10; + zRe[in9] = fo18 - fo13; + zRe[in33] = fo18 + fo13; + + f2o1 = FFT_15PONIT_WNK1 * ( f2i3 - fi15 ); + f2o2 = f2i3 + fi15; + f2o3 = fnms( FFT_15PONIT_WNK5, f2o2, fi2 ); + f2o6 = fi7 - fi8; + f2o7 = fi25 - fi26; + f2o4 = fnms( FFT_15PONIT_WNK3, f2o7, FFT_15PONIT_WNK2 * f2o6 ); + f2o5 = fmac( FFT_15PONIT_WNK2, f2o7, FFT_15PONIT_WNK3 * f2o6 ); + zIm[in0] = fi2 + f2o2; + f2o8 = f2o1 + f2o3; + zIm[in24] = f2o8 - f2o5; + zIm[in18] = f2o5 + f2o8; + f2o9 = f2o3 - f2o1; + zIm[in33] = f2o9 - f2o4; + zIm[in9] = f2o4 + f2o9; + + f2o14 = FFT_15PONIT_WNK1 * ( fi30 - fi12 ); + f2o15 = fi30 + fi12; + f3o1 = fnms( FFT_15PONIT_WNK5, f2o15, fi3 ); + f3o4 = fi16 - fi17; + f3o5 = f2i4 - f2i5; + f3o2 = fnms( FFT_15PONIT_WNK3, f3o5, FFT_15PONIT_WNK2 * f3o4 ); + f3o3 = fmac( FFT_15PONIT_WNK2, f3o5, FFT_15PONIT_WNK3 * f3o4 ); + zRe[in2] = fi3 + f2o15; + f3o6 = f2o14 + f3o1; + zRe[in17] = f3o6 - f3o3; + zRe[in26] = f3o6 + f3o3; + f3o7 = f3o1 - f2o14; + zRe[in8] = f3o7 - f3o2; + zRe[in32] = f3o7 + f3o2; + + f3o8 = FFT_15PONIT_WNK1 * ( f2i6 - fi18 ); + f3o9 = f2i6 + fi18; + f3o10 = fnms( FFT_15PONIT_WNK5, f3o9, fi6 ); + f3o13 = fi10 - fi11; + f3o14 = fi28 - fi29; + f3o11 = fnms( FFT_15PONIT_WNK3, f3o14, FFT_15PONIT_WNK2 * f3o13 ); + f3o12 = fmac( FFT_15PONIT_WNK2, f3o14, FFT_15PONIT_WNK3 * f3o13 ); + zIm[in2] = fi6 + f3o9; + f3o15 = f3o8 + f3o10; + zIm[in26] = f3o15 - f3o12; + zIm[in17] = f3o12 + f3o15; + f4o1 = f3o10 - f3o8; + zIm[in8] = f3o11 + f4o1; + zIm[in32] = f4o1 - f3o11; + + f4o2 = FFT_15PONIT_WNK1 * ( f2i9 - fi21 ); + f4o3 = f2i9 + fi21; + f4o4 = fnms( FFT_15PONIT_WNK5, f4o3, fi5 ); + f4o7 = f2i10 - f2i11; + f4o8 = fi22 - fi23; + f4o5 = fmac( FFT_15PONIT_WNK2, f4o7, FFT_15PONIT_WNK3 * f4o8 ); + f4o6 = fnms( FFT_15PONIT_WNK3, f4o7, FFT_15PONIT_WNK2 * f4o8 ); + zIm[in1] = fi5 + f4o3; + f4o9 = f4o4 - f4o2; + f4o10 = f4o2 + f4o4; + + zIm[in10] = f4o6 + f4o9; + zIm[in34] = f4o9 - f4o6; + zIm[in25] = f4o10 - f4o5; + zIm[in16] = f4o5 + f4o10; + + f4o11 = FFT_15PONIT_WNK1 * ( f2i12 - fi24 ); + f4o12 = f2i12 + fi24; + f4o13 = fnms( FFT_15PONIT_WNK5, f4o12, fi4 ); + f4o16 = f2i7 - f2i8; + f4o17 = fi19 - fi20; + f4o14 = fmac( FFT_15PONIT_WNK2, f4o16, FFT_15PONIT_WNK3 * f4o17 ); + f4o15 = fnms( FFT_15PONIT_WNK3, f4o16, FFT_15PONIT_WNK2 * f4o17 ); + zRe[in1] = fi4 + f4o12; + f4o18 = f4o13 - f4o11; + f4o19 = f4o11 + f4o13; + + zRe[in10] = f4o18 - f4o15; + zRe[in34] = f4o18 + f4o15; + zRe[in16] = f4o19 - f4o14; + zRe[in25] = f4o19 + f4o14; + + return; +} + +/*-----------------------------------------------------------------* + * fft15_shift8() + * 15-point FFT with 8-point circular shift + *-----------------------------------------------------------------*/ + +static void fft15_shift8( + int16_t n1, /* i : length of data */ + float *zRe, /* i/o: real part of input and output data */ + float *zIm, /* i/o: imaginary part of input and output data */ + const int16_t *Idx /* i : pointer of the address table */ +) +{ + int16_t in0, in8, in16, in24, in32, in1, in9, in17, in25, in33, in2, in10, in18, in26, in34; + float fi1, fi2, fi3, fi4, fi5, fi6, fi7, fi8, fi9, fi10, fi11, fi12, fi13, fi14, fi15; + float fi16, fi17, fi18, fi19, fi20, fi21, fi22, fi23, fi24, fi25, fi26, fi27, fi28, fi29, fi30; + float f2i1, f2i2, f2i3, f2i4, f2i5, f2i6, f2i7, f2i8, f2i9, f2i10, f2i11, f2i12; + float f2i13, f2i14, f2i15, f3i1, f3i2, f3i3, f3i4, f3i5, f3i6, f3i7, f3i8, f3i9; + float f3i10, f3i11, f3i12, f3i13, f3i14, f3i15, f4i1, f4i2, f4i3, f4i4, f4i5, f4i6, f4i7, f4i8, f4i9; + float f4i10, f4i11, f4i12, f4i13, f4i14, f4i15, fo1, fo2, fo3, fo4, fo5, fo6; + float fo7, fo8, fo9, fo10, fo11, fo12, fo13, fo14, fo15, f2o1, f2o2, f2o3, f2o4; + float f2o5, f2o6, f2o7, f2o8, f2o9, f2o10, f2o11, f2o12, f2o13, f2o14, f2o15; + float f3o1, f3o2, f3o3, f3o4, f3o5, f3o6, f3o7, f3o8, f3o9, f3o10, f3o11, f3o12; + float f3o13, f3o14, f3o15, f4o1, f4o2, f4o3, f4o4, f4o5, f4o6, f4o7, f4o8, f4o9; + float f4o10, f4o11, f4o12, f4o13, f4o14, f4o15, f5o1, f5o2, f5o3, f5o4, f5o5, f5o6, f5o7; + float f5o8, f5o9, f5o10, f5o11, f5o12, f5o13, f5o14, f5o15, f5o16, f5o17, f5o18, f5o19, f5o21, f5o22; + + in0 = Idx[0]; + in8 = Idx[n1]; + in16 = Idx[n1 * 2]; + in24 = Idx[n1 * 3]; + in32 = Idx[n1 * 4]; + in1 = Idx[n1 * 5]; + in9 = Idx[n1 * 6]; + in17 = Idx[n1 * 7]; + in25 = Idx[n1 * 8]; + in33 = Idx[n1 * 9]; + in2 = Idx[n1 * 10]; + in10 = Idx[n1 * 11]; + in18 = Idx[n1 * 12]; + in26 = Idx[n1 * 13]; + in34 = Idx[n1 * 14]; + + f2i13 = zRe[in0]; + f2i14 = zIm[in0]; + f3i6 = zRe[in1]; + f3i7 = zRe[in2]; + f3i8 = zIm[in1]; + f3i9 = zIm[in2]; + + f2i15 = f3i6 + f3i7; + f3i1 = FFT_15PONIT_WNK4 * ( f3i7 - f3i6 ); + f3i2 = FFT_15PONIT_WNK4 * ( f3i8 - f3i9 ); + f3i3 = f3i8 + f3i9; + + fi1 = f2i13 + f2i15; + fi2 = f2i14 + f3i3; + f3i4 = fnms( 0.5f, f2i15, f2i13 ); + fi3 = f3i4 - f3i2; + fi4 = f3i4 + f3i2; + f3i5 = fnms( 0.5f, f3i3, f2i14 ); + fi5 = f3i1 + f3i5; + fi6 = f3i5 - f3i1; + + f3i10 = zRe[in9]; + f4i11 = zRe[in10]; + f4i12 = zRe[in8]; + f3i14 = zIm[in9]; + f4i13 = zIm[in10]; + f4i14 = zIm[in8]; + f4i3 = zRe[in33]; + f4i15 = zRe[in34]; + fo1 = zRe[in32]; + f4i7 = zIm[in33]; + fo2 = zIm[in34]; + fo3 = zIm[in32]; + + + f3i11 = f4i11 + f4i12; + f3i12 = fnms( 0.5f, f3i11, f3i10 ); + f3i13 = FFT_15PONIT_WNK4 * ( f4i12 - f4i11 ); + f3i15 = f4i13 + f4i14; + f4i1 = FFT_15PONIT_WNK4 * ( f4i13 - f4i14 ); + f4i2 = fnms( 0.5f, f3i15, f3i14 ); + f4i4 = f4i15 + fo1; + f4i5 = fnms( 0.5f, f4i4, f4i3 ); + f4i6 = FFT_15PONIT_WNK4 * ( fo1 - f4i15 ); + f4i8 = fo2 + fo3; + f4i9 = FFT_15PONIT_WNK4 * ( fo2 - fo3 ); + f4i10 = fnms( 0.5f, f4i8, f4i7 ); + + fi7 = f3i10 + f3i11; + fi8 = f4i3 + f4i4; + fi9 = fi7 + fi8; + fi10 = f3i12 - f4i1; + fi11 = f4i5 - f4i9; + fi12 = fi10 + fi11; + fi13 = f3i14 + f3i15; + fi14 = f4i7 + f4i8; + fi15 = fi13 + fi14; + fi16 = f4i2 - f3i13; + fi17 = f4i10 - f4i6; + fi18 = fi16 + fi17; + fi19 = f3i13 + f4i2; + fi20 = f4i6 + f4i10; + fi21 = fi19 + fi20; + fi22 = f3i12 + f4i1; + fi23 = f4i5 + f4i9; + fi24 = fi22 + fi23; + + fo4 = zRe[in24]; + f2o5 = zRe[in25]; + f2o6 = zRe[in26]; + fo8 = zIm[in24]; + f2o7 = zIm[in25]; + f2o8 = zIm[in26]; + fo12 = zRe[in18]; + f2o9 = zRe[in16]; + f2o10 = zRe[in17]; + f2o1 = zIm[in18]; + f2o11 = zIm[in16]; + f2o12 = zIm[in17]; + + + fo5 = f2o5 + f2o6; + fo6 = fnms( 0.5f, fo5, fo4 ); + fo7 = FFT_15PONIT_WNK4 * ( f2o6 - f2o5 ); + fo9 = f2o7 + f2o8; + fo10 = FFT_15PONIT_WNK4 * ( f2o7 - f2o8 ); + fo11 = fnms( 0.5f, fo9, fo8 ); + fo13 = f2o9 + f2o10; + fo14 = fnms( 0.5f, fo13, fo12 ); + fo15 = FFT_15PONIT_WNK4 * ( f2o10 - f2o9 ); + f2o2 = f2o11 + f2o12; + f2o3 = FFT_15PONIT_WNK4 * ( f2o11 - f2o12 ); + f2o4 = fnms( 0.5f, f2o2, f2o1 ); + + fi25 = fo4 + fo5; + fi26 = fo12 + fo13; + fi27 = fi25 + fi26; + fi28 = fo6 - fo10; + fi29 = fo14 - f2o3; + fi30 = fi28 + fi29; + f2i1 = fo8 + fo9; + f2i2 = f2o1 + f2o2; + f2i3 = f2i1 + f2i2; + f2i4 = fo11 - fo7; + f2i5 = f2o4 - fo15; + f2i6 = f2i4 + f2i5; + f2i7 = fo7 + fo11; + f2i8 = fo15 + f2o4; + f2i9 = f2i7 + f2i8; + f2i10 = fo6 + fo10; + f2i11 = fo14 + f2o3; + f2i12 = f2i10 + f2i11; + + f2o13 = FFT_15PONIT_WNK1 * ( fi27 - fi9 ); + f2o14 = fi27 + fi9; + f2o15 = fnms( FFT_15PONIT_WNK5, f2o14, fi1 ); + f3o3 = fi13 - fi14; + f3o4 = f2i1 - f2i2; + f3o1 = fnms( FFT_15PONIT_WNK3, f3o4, FFT_15PONIT_WNK2 * f3o3 ); + f3o2 = fmac( FFT_15PONIT_WNK2, f3o4, FFT_15PONIT_WNK3 * f3o3 ); + zRe[in0] = fi1 + f2o14; + f3o5 = f2o13 + f2o15; + zRe[in24] = f3o5 - f3o2; + zRe[in18] = f3o5 + f3o2; + f3o6 = f2o15 - f2o13; + zRe[in33] = f3o6 - f3o1; + zRe[in9] = f3o6 + f3o1; + + f3o7 = FFT_15PONIT_WNK1 * ( f2i3 - fi15 ); + f3o8 = f2i3 + fi15; + f3o9 = fnms( FFT_15PONIT_WNK5, f3o8, fi2 ); + f3o12 = fi7 - fi8; + f3o13 = fi25 - fi26; + f3o10 = fnms( FFT_15PONIT_WNK3, f3o13, FFT_15PONIT_WNK2 * f3o12 ); + f3o11 = fmac( FFT_15PONIT_WNK2, f3o13, FFT_15PONIT_WNK3 * f3o12 ); + zIm[in0] = fi2 + f3o8; + f3o14 = f3o7 + f3o9; + zIm[in18] = f3o14 - f3o11; + zIm[in24] = f3o11 + f3o14; + f3o15 = f3o9 - f3o7; + zIm[in9] = f3o15 - f3o10; + zIm[in33] = f3o10 + f3o15; + + f4o1 = FFT_15PONIT_WNK1 * ( fi30 - fi12 ); + f4o2 = fi30 + fi12; + f4o3 = fnms( FFT_15PONIT_WNK5, f4o2, fi3 ); + f4o6 = fi16 - fi17; + f4o7 = f2i4 - f2i5; + f4o4 = fnms( FFT_15PONIT_WNK3, f4o7, FFT_15PONIT_WNK2 * f4o6 ); + f4o5 = fmac( FFT_15PONIT_WNK2, f4o7, FFT_15PONIT_WNK3 * f4o6 ); + zRe[in2] = fi3 + f4o2; + f4o8 = f4o1 + f4o3; + zRe[in26] = f4o8 - f4o5; + zRe[in17] = f4o8 + f4o5; + f4o9 = f4o3 - f4o1; + zRe[in32] = f4o9 - f4o4; + zRe[in8] = f4o9 + f4o4; + + f4o10 = FFT_15PONIT_WNK1 * ( f2i6 - fi18 ); + f4o11 = f2i6 + fi18; + f4o12 = fnms( FFT_15PONIT_WNK5, f4o11, fi6 ); + f4o15 = fi10 - fi11; + f5o1 = fi28 - fi29; + f4o13 = fnms( FFT_15PONIT_WNK3, f5o1, FFT_15PONIT_WNK2 * f4o15 ); + f4o14 = fmac( FFT_15PONIT_WNK2, f5o1, FFT_15PONIT_WNK3 * f4o15 ); + zIm[in2] = fi6 + f4o11; + f5o2 = f4o10 + f4o12; + zIm[in17] = f5o2 - f4o14; + zIm[in26] = f4o14 + f5o2; + f5o3 = f4o12 - f4o10; + zIm[in32] = f4o13 + f5o3; + zIm[in8] = f5o3 - f4o13; + + f5o4 = FFT_15PONIT_WNK1 * ( f2i9 - fi21 ); + f5o5 = f2i9 + fi21; + f5o6 = fnms( FFT_15PONIT_WNK5, f5o5, fi5 ); + f5o9 = f2i10 - f2i11; + f5o10 = fi22 - fi23; + f5o7 = fmac( FFT_15PONIT_WNK2, f5o9, FFT_15PONIT_WNK3 * f5o10 ); + f5o8 = fnms( FFT_15PONIT_WNK3, f5o9, FFT_15PONIT_WNK2 * f5o10 ); + zIm[in1] = fi5 + f5o5; + f5o11 = f5o6 - f5o4; + f5o12 = f5o4 + f5o6; + zIm[in34] = f5o8 + f5o11; + zIm[in10] = f5o11 - f5o8; + + zIm[in16] = f5o12 - f5o7; + zIm[in25] = f5o7 + f5o12; + + f5o13 = FFT_15PONIT_WNK1 * ( f2i12 - fi24 ); + f5o14 = f2i12 + fi24; + f5o15 = fnms( FFT_15PONIT_WNK5, f5o14, fi4 ); + f5o18 = f2i7 - f2i8; + f5o19 = fi19 - fi20; + f5o16 = fmac( FFT_15PONIT_WNK2, f5o18, FFT_15PONIT_WNK3 * f5o19 ); + f5o17 = fnms( FFT_15PONIT_WNK3, f5o18, FFT_15PONIT_WNK2 * f5o19 ); + zRe[in1] = fi4 + f5o14; + f5o21 = f5o15 - f5o13; + f5o22 = f5o13 + f5o15; + + zRe[in34] = f5o21 - f5o17; + zRe[in10] = f5o21 + f5o17; + zRe[in25] = f5o22 - f5o16; + zRe[in16] = f5o22 + f5o16; + + return; +} + +/*-----------------------------------------------------------------* + * fft5_shift1() + * 5-point FFT with 1-point circular shift + *-----------------------------------------------------------------*/ + +static void fft5_shift1( + int16_t n1, /* i : length of data */ + float *zRe, /* i/o: real part of input and output data */ + float *zIm, /* i/o: imaginary part of input and output data */ + const int16_t *Idx /* i : pointer of the address table */ +) +{ + float fi1, fi2, fi3, fi4, fi5, fi6, fi7, fi8; + float fo1, fo2, fo3, fo4, fo5, fo6, fo7, fo8; + int16_t in1, in2, in3, in4, in5; + + in1 = Idx[0]; + in2 = Idx[n1]; + in3 = Idx[n1 * 2]; + in4 = Idx[n1 * 3]; + in5 = Idx[n1 * 4]; + + fi1 = zRe[in1]; + fi2 = zIm[in1]; + fo3 = zRe[in2]; + fo4 = zRe[in5]; + fo6 = zRe[in3]; + fo7 = zRe[in4]; + + fo5 = fo3 + fo4; + fo8 = fo6 + fo7; + fi3 = fo5 + fo8; + fi4 = fo6 - fo7; + fi5 = FFT_15PONIT_WNK1 * ( fo5 - fo8 ); + fi6 = fo3 - fo4; + + fo3 = zIm[in2]; + fo4 = zIm[in5]; + fo6 = zIm[in3]; + fo7 = zIm[in4]; + + fo5 = fo3 + fo4; + fo8 = fo6 + fo7; + fi7 = fo3 - fo4; + fi8 = fo5 + fo8; + fo1 = fo6 - fo7; + fo2 = FFT_15PONIT_WNK1 * ( fo5 - fo8 ); + + zRe[in1] = fi1 + fi3; + zIm[in1] = fi2 + fi8; + + fo3 = FFT_15PONIT_WNK2 * fi7 + FFT_15PONIT_WNK3 * fo1; + fo4 = FFT_15PONIT_WNK2 * fo1 - FFT_15PONIT_WNK3 * fi7; + fo7 = fi1 - fi3 / 4; + fo5 = fi5 + fo7; + fo6 = fo7 - fi5; + + zRe[in2] = fo5 + fo3; + zRe[in3] = fo6 - fo4; + zRe[in4] = fo6 + fo4; + zRe[in5] = fo5 - fo3; + + fo3 = FFT_15PONIT_WNK2 * fi6 + FFT_15PONIT_WNK3 * fi4; + fo4 = FFT_15PONIT_WNK2 * fi4 - FFT_15PONIT_WNK3 * fi6; + fo7 = fi2 - fi8 / 4; + fo5 = fo2 + fo7; + fo6 = fo7 - fo2; + + zIm[in2] = fo5 - fo3; + zIm[in3] = fo4 + fo6; + zIm[in4] = fo6 - fo4; + zIm[in5] = fo3 + fo5; + + return; +} + +/*-----------------------------------------------------------------* + * fft5_shift4() + * 5-point FFT with 4-point circular shift + *-----------------------------------------------------------------*/ + +static void fft5_shift4( + int16_t n1, /* i : length of data */ + float *zRe, /* i/o: real part of input and output data */ + float *zIm, /* i/o: imaginary part of input and output data */ + const int16_t *Idx /* i : pointer of the address table */ +) +{ + float fi1, fi2, fi3, fi4, fi5, fi6, fi7, fi8; + float fo1, fo2, fo3, fo4, fo5, fo6, fo7, fo8; + int16_t in1, in2, in3, in4, in5; + + in1 = Idx[0]; + in2 = Idx[n1]; + in3 = Idx[n1 * 2]; + in4 = Idx[n1 * 3]; + in5 = Idx[n1 * 4]; + + fi1 = zRe[in1]; + fi2 = zIm[in1]; + fo3 = zRe[in2]; + fo4 = zRe[in5]; + fo6 = zRe[in3]; + fo7 = zRe[in4]; + + fo5 = fo3 + fo4; + fo8 = fo6 + fo7; + fi3 = fo5 + fo8; + fi4 = fo6 - fo7; + fi5 = FFT_15PONIT_WNK1 * ( fo5 - fo8 ); + fi6 = fo3 - fo4; + + fo3 = zIm[in2]; + fo4 = zIm[in5]; + fo6 = zIm[in3]; + fo7 = zIm[in4]; + + fo5 = fo3 + fo4; + fo8 = fo6 + fo7; + fi7 = fo3 - fo4; + fi8 = fo5 + fo8; + fo1 = fo6 - fo7; + fo2 = FFT_15PONIT_WNK1 * ( fo5 - fo8 ); + + zRe[in1] = fi1 + fi3; + zIm[in1] = fi2 + fi8; + + fo3 = FFT_15PONIT_WNK2 * fi7 + FFT_15PONIT_WNK3 * fo1; + fo4 = FFT_15PONIT_WNK2 * fo1 - FFT_15PONIT_WNK3 * fi7; + fo7 = fi1 - fi3 / 4; + fo5 = fi5 + fo7; + fo6 = fo7 - fi5; + zRe[in2] = fo5 - fo3; + zRe[in4] = fo6 - fo4; + zRe[in3] = fo6 + fo4; + zRe[in5] = fo5 + fo3; + + fo3 = FFT_15PONIT_WNK2 * fi6 + FFT_15PONIT_WNK3 * fi4; + fo4 = FFT_15PONIT_WNK2 * fi4 - FFT_15PONIT_WNK3 * fi6; + fo7 = fi2 - fi8 / 4; + fo5 = fo2 + fo7; + fo6 = fo7 - fo2; + + zIm[in3] = fo6 - fo4; + zIm[in2] = fo3 + fo5; + zIm[in4] = fo4 + fo6; + zIm[in5] = fo5 - fo3; + + return; +} + +/*-----------------------------------------------------------------* + * fft5_32() + * 5-point FFT called for 32 times + *-----------------------------------------------------------------*/ + +static void fft5_32( + float *zRe, /* i/o: real part of input and output data */ + float *zIm, /* i/o: imaginary part of input and output data */ + const int16_t *Idx /* i : pointer of the address table */ +) +{ + float fi1, fi2, fi3, fi4, fi5, fi6, fi7, fi8; + float fo1, fo2, fo3, fo4, fo5, fo6, fo7, fo8; + int16_t in1, in2, in3, in4, in5; + + in1 = Idx[0]; + in2 = Idx[32]; + in3 = Idx[64]; + in4 = Idx[96]; + in5 = Idx[128]; + + fi1 = zRe[in1]; + fi2 = zIm[in1]; + fo3 = zRe[in2]; + fo4 = zRe[in5]; + fo6 = zRe[in3]; + fo7 = zRe[in4]; + + fo5 = fo3 + fo4; + fo8 = fo6 + fo7; + fi3 = fo5 + fo8; + fi4 = fo6 - fo7; + fi5 = FFT_15PONIT_WNK1 * ( fo5 - fo8 ); + fi6 = fo3 - fo4; + + fo3 = zIm[in2]; + fo4 = zIm[in5]; + fo6 = zIm[in3]; + fo7 = zIm[in4]; + + fo5 = fo3 + fo4; + fo8 = fo6 + fo7; + fi7 = fo3 - fo4; + fi8 = fo5 + fo8; + fo1 = fo6 - fo7; + fo2 = FFT_15PONIT_WNK1 * ( fo5 - fo8 ); + + zRe[in1] = fi1 + fi3; + zIm[in1] = fi2 + fi8; + + fo3 = FFT_15PONIT_WNK2 * fi7 + FFT_15PONIT_WNK3 * fo1; + fo4 = FFT_15PONIT_WNK2 * fo1 - FFT_15PONIT_WNK3 * fi7; + fo7 = fi1 - fi3 / 4; + fo5 = fi5 + fo7; + fo6 = fo7 - fi5; + + zRe[in2] = fo6 + fo4; + zRe[in3] = fo5 + fo3; + zRe[in4] = fo5 - fo3; + zRe[in5] = fo6 - fo4; + + fo3 = FFT_15PONIT_WNK2 * fi6 + FFT_15PONIT_WNK3 * fi4; + fo4 = FFT_15PONIT_WNK2 * fi4 - FFT_15PONIT_WNK3 * fi6; + fo7 = fi2 - fi8 / 4; + fo5 = fo2 + fo7; + fo6 = fo7 - fo2; + + zIm[in2] = fo6 - fo4; + zIm[in3] = fo5 - fo3; + zIm[in4] = fo3 + fo5; + zIm[in5] = fo4 + fo6; + + return; +} + +/*-----------------------------------------------------------------* + * fft64() + * 64-point FFT + *-----------------------------------------------------------------*/ + +static void fft64( + float *x, /* i/o: real part of input and output data */ + float *y, /* i/o: imaginary part of input and output data */ + const int16_t *Idx /* i : pointer of the address table */ +) +{ + int16_t i, id, jd; + float z[128]; + for ( i = 0; i < 64; i++ ) + { + id = Idx[i]; + z[2 * i] = x[id]; + z[2 * i + 1] = y[id]; + } + + cdftForw( 128, z, Ip_fft64, w_fft64 ); + + for ( i = 0; i < 64; i++ ) + { + jd = Odx_fft64[i]; + id = Idx[jd]; + x[id] = z[2 * i]; + y[id] = z[2 * i + 1]; + } + + return; +} + + +/*-----------------------------------------------------------------* + * fft32_15() + * 32-point FFT called for 15 times + *-----------------------------------------------------------------*/ + +static void fft32_15( + float *x, /* i/o: real part of input and output data */ + float *y, /* i/o: imaginary part of input and output data */ + const int16_t *Idx /* i : pointer of the address table */ +) +{ + int16_t i, id, jd; + float z[64]; + + for ( i = 0; i < 32; i++ ) + { + id = Idx[i]; + z[2 * i] = x[id]; + z[2 * i + 1] = y[id]; + } + + cdftForw( 64, z, Ip_fft32, w_fft32 ); + + for ( i = 0; i < 32; i++ ) + { + jd = Odx_fft32_15[i]; + id = Idx[jd]; + x[id] = z[2 * i]; + y[id] = z[2 * i + 1]; + } + + return; +} + +/*-----------------------------------------------------------------* + * fft32_5() + * 32-point FFT called for 5 times + *-----------------------------------------------------------------*/ + +static void fft32_5( + float *x, /* i/o: real part of input and output data */ + float *y, /* i/o: imaginary part of input and output data */ + const int16_t *Idx /* i : pointer of the address table */ +) +{ + int16_t i, id, jd; + float z[64]; + + for ( i = 0; i < 32; i++ ) + { + id = Idx[i]; + z[2 * i] = x[id]; + z[2 * i + 1] = y[id]; + } + + cdftForw( 64, z, Ip_fft32, w_fft32 ); + + for ( i = 0; i < 32; i++ ) + { + jd = Odx_fft32_5[i]; + id = Idx[jd]; + x[id] = z[2 * i]; + y[id] = z[2 * i + 1]; + } + + return; +} + +/*-----------------------------------------------------------------* + * fft16() + * 16-point FFT + *-----------------------------------------------------------------*/ + +static void fft16( + float *x, /* i/o: real part of input and output data */ + float *y, /* i/o: imaginary part of input and output data */ + const int16_t *Idx /* i : pointer of the address table */ +) +{ + int16_t i, id, jd; + float z[32]; + + for ( i = 0; i < 16; i++ ) + { + id = Idx[i]; + z[2 * i] = x[id]; + z[2 * i + 1] = y[id]; + } + + cdftForw( 32, z, Ip_fft16, w_fft16 ); + + for ( i = 0; i < 16; i++ ) + { + jd = Odx_fft16[i]; + id = Idx[jd]; + x[id] = z[2 * i]; + y[id] = z[2 * i + 1]; + } + + return; +} + +/*-----------------------------------------------------------------* + * fft8() + * 8-point FFT + *-----------------------------------------------------------------*/ + +static void fft8( + float *x, /* i/o: real part of input and output data */ + float *y, /* i/o: imaginary part of input and output data */ + const int16_t *Idx /* i : pointer of the address table */ +) +{ + int16_t i, id; + float z[16]; + + for ( i = 0; i < 8; i++ ) + { + id = Idx[i]; + z[2 * i] = x[id]; + z[2 * i + 1] = y[id]; + } + + cdftForw( 16, z, Ip_fft8, w_fft8 ); + + for ( i = 0; i < 8; i++ ) + { + id = Idx[i]; + x[id] = z[2 * i]; + y[id] = z[2 * i + 1]; + } + + return; +} + +/*-----------------------------------------------------------------* + * fft8_5() + * 8-point FFT with shift 5 + *-----------------------------------------------------------------*/ + +static void fft8_5( + float *x, /* i/o: real part of input and output data */ + float *y, /* i/o: imaginary part of input and output data */ + const int16_t *Idx /* i : pointer of the address table */ +) +{ + int16_t i, id, jd; + float z[16]; + + for ( i = 0; i < 8; i++ ) + { + id = Idx[i]; + z[2 * i] = x[id]; + z[2 * i + 1] = y[id]; + } + + cdftForw( 16, z, Ip_fft8, w_fft8 ); + + for ( i = 0; i < 8; i++ ) + { + jd = Odx_fft8_5[i]; + id = Idx[jd]; + x[id] = z[2 * i]; + y[id] = z[2 * i + 1]; + } + return; +} + +/*-----------------------------------------------------------------* + * fft5_8() + * 5-point FFT with shift 2 + *-----------------------------------------------------------------*/ + +static void fft5_8( + int16_t n1, /* i : length of data */ + float *zRe, /* i/o: real part of input and output data */ + float *zIm, /* i/o: imaginary part of input and output data */ + const int16_t *Idx /* i : pointer of the address table */ +) +{ + float fi1, fi2, fi3, fi4, fi5, fi6, fi7, fi8; + float fo1, fo2, fo3, fo4, fo5, fo6, fo7, fo8; + int16_t in1, in2, in3, in4, in5; + + in1 = Idx[0]; + in2 = Idx[n1]; + in3 = Idx[n1 * 2]; + in4 = Idx[n1 * 3]; + in5 = Idx[n1 * 4]; + + fi1 = zRe[in1]; + fi2 = zIm[in1]; + fo3 = zRe[in2]; + fo4 = zRe[in5]; + fo6 = zRe[in3]; + fo7 = zRe[in4]; + + fo5 = fo3 + fo4; + fo8 = fo6 + fo7; + fi3 = fo5 + fo8; + fi4 = fo6 - fo7; + fi5 = FFT_15PONIT_WNK1 * ( fo5 - fo8 ); + fi6 = fo3 - fo4; + + fo3 = zIm[in2]; + fo4 = zIm[in5]; + fo6 = zIm[in3]; + fo7 = zIm[in4]; + + fo5 = fo3 + fo4; + fo8 = fo6 + fo7; + fi7 = fo3 - fo4; + fi8 = fo5 + fo8; + fo1 = fo6 - fo7; + fo2 = FFT_15PONIT_WNK1 * ( fo5 - fo8 ); + + zRe[in1] = fi1 + fi3; + zIm[in1] = fi2 + fi8; + + fo3 = FFT_15PONIT_WNK2 * fi7 + FFT_15PONIT_WNK3 * fo1; + fo4 = FFT_15PONIT_WNK2 * fo1 - FFT_15PONIT_WNK3 * fi7; + fo7 = fi1 - fi3 / 4; + fo5 = fi5 + fo7; + fo6 = fo7 - fi5; + + zRe[in2] = fo6 - fo4; + zRe[in3] = fo5 - fo3; + zRe[in5] = fo6 + fo4; + zRe[in4] = fo5 + fo3; + + fo3 = FFT_15PONIT_WNK2 * fi6 + FFT_15PONIT_WNK3 * fi4; + fo4 = FFT_15PONIT_WNK2 * fi4 - FFT_15PONIT_WNK3 * fi6; + fo7 = fi2 - fi8 / 4; + fo5 = fo2 + fo7; + fo6 = fo7 - fo2; + + zIm[in2] = fo4 + fo6; + zIm[in3] = fo3 + fo5; + zIm[in4] = fo5 - fo3; + zIm[in5] = fo6 - fo4; + + return; +} + +/*-----------------------------------------------------------------* + * fft4_5() + * 8-point FFT with shift 1 + *-----------------------------------------------------------------*/ + +static void fft4_5( + float *x, /* i/o: real part of input and output data */ + float *y, /* i/o: imaginary part of input and output data */ + const int16_t *Idx /* i : pointer of the address table */ +) +{ + int16_t i, id, jd; + float z[8]; + + for ( i = 0; i < 4; i++ ) + { + id = Idx[i]; + z[2 * i] = x[id]; + z[2 * i + 1] = y[id]; + } + + cdftForw( 8, z, Ip_fft4, w_fft4 ); + + for ( i = 0; i < 4; i++ ) + { + jd = Odx_fft4_5[i]; + id = Idx[jd]; + x[id] = z[2 * i]; + y[id] = z[2 * i + 1]; + } + return; +} + +/*-----------------------------------------------------------------* + * fft5_4() + * 5-point FFT with shift 4 + *-----------------------------------------------------------------*/ + +static void fft5_4( + int16_t n1, + float *zRe, + float *zIm, + const int16_t *Idx ) +{ + float fi1, fi2, fi3, fi4, fi5, fi6, fi7, fi8; + float fo1, fo2, fo3, fo4, fo5, fo6, fo7, fo8; + int16_t in1, in2, in3, in4, in5; + + in1 = Idx[0]; + in2 = Idx[n1]; + in3 = Idx[n1 * 2]; + in4 = Idx[n1 * 3]; + in5 = Idx[n1 * 4]; + + fi1 = zRe[in1]; + fi2 = zIm[in1]; + fo3 = zRe[in2]; + fo4 = zRe[in5]; + fo6 = zRe[in3]; + fo7 = zRe[in4]; + + fo5 = fo3 + fo4; + fo8 = fo6 + fo7; + fi3 = fo5 + fo8; + fi4 = fo6 - fo7; + fi5 = FFT_15PONIT_WNK1 * ( fo5 - fo8 ); + fi6 = fo3 - fo4; + + fo3 = zIm[in2]; + fo4 = zIm[in5]; + fo6 = zIm[in3]; + fo7 = zIm[in4]; + + fo5 = fo3 + fo4; + fo8 = fo6 + fo7; + fi7 = fo3 - fo4; + fi8 = fo5 + fo8; + fo1 = fo6 - fo7; + fo2 = FFT_15PONIT_WNK1 * ( fo5 - fo8 ); + + zRe[in1] = fi1 + fi3; + zIm[in1] = fi2 + fi8; + + fo3 = FFT_15PONIT_WNK2 * fi7 + FFT_15PONIT_WNK3 * fo1; + fo4 = FFT_15PONIT_WNK2 * fo1 - FFT_15PONIT_WNK3 * fi7; + fo7 = fi1 - fi3 / 4; + fo5 = fi5 + fo7; + fo6 = fo7 - fi5; + + zRe[in2] = fo5 - fo3; + zRe[in4] = fo6 - fo4; + zRe[in3] = fo6 + fo4; + zRe[in5] = fo5 + fo3; + + fo3 = FFT_15PONIT_WNK2 * fi6 + FFT_15PONIT_WNK3 * fi4; + fo4 = FFT_15PONIT_WNK2 * fi4 - FFT_15PONIT_WNK3 * fi6; + fo7 = fi2 - fi8 / 4; + fo5 = fo2 + fo7; + fo6 = fo7 - fo2; + + zIm[in2] = fo3 + fo5; + zIm[in3] = fo6 - fo4; + zIm[in4] = fo4 + fo6; + zIm[in5] = fo5 - fo3; + + return; +} + + +/*-----------------------------------------------------------------* + * DoRTFT80() + * a low complexity 2-dimensional DFT of 80 points + *-----------------------------------------------------------------*/ + +void DoRTFT80( + float *x, /* i/o: real part of input and output data */ + float *y /* i/o: imaginary part of input and output data */ +) +{ + int16_t j; + + /* Applying 16-point FFT for 5 times based on the address table Idx_dortft80 */ + for ( j = 0; j < 5; j++ ) + { + fft16( x, y, Idx_dortft80 + 16 * j ); + } + + /* Applying 5-point FFT for 16 times based on the address table Idx_dortft80 */ + for ( j = 0; j < 16; j++ ) + { + fft5_shift1( 16, x, y, Idx_dortft80 + j ); + } + + return; +} + +/*-----------------------------------------------------------------* + * DoRTFT120() + * a low complexity 2-dimensional DFT of 120 points + *-----------------------------------------------------------------*/ + +void DoRTFT120( + float *x, /* i/o: real part of input and output data */ + float *y /* i/o: imaginary part of input and output data */ +) +{ + int16_t j; + + /* Applying 8-point FFT for 15 times based on the address table Idx_dortft120 */ + for ( j = 0; j < 15; j++ ) + { + fft8( x, y, Idx_dortft120 + 8 * j ); + } + + /* Applying 15-point FFT for 8 times based on the address table Idx_dortft120 */ + for ( j = 0; j < 8; j++ ) + { + fft15_shift2( 8, x, y, Idx_dortft120 + j ); + } + + return; +} + +/*-----------------------------------------------------------------* + * DoRTFT160() + * a low complexity 2-dimensional DFT of 160 points + *-----------------------------------------------------------------*/ + +void DoRTFT160( + float x[], /* i/o: real part of input and output data */ + float y[] /* i/o: imaginary part of input and output data */ +) +{ + int16_t j; + + /* Applying 32-point FFT for 5 times based on the address table Idx_dortft160 */ + for ( j = 0; j < 5; j++ ) + { + fft32_5( x, y, Idx_dortft160 + 32 * j ); + } + + /* Applying 5-point FFT for 32 times based on the address table Idx_dortft160 */ + for ( j = 0; j < 32; j++ ) + { + fft5_32( x, y, Idx_dortft160 + j ); + } + + return; +} + +/*-----------------------------------------------------------------* + * DoRTFT320() + * a low complexity 2-dimensional DFT of 320 points + *-----------------------------------------------------------------*/ + +void DoRTFT320( + float *x, /* i/o: real part of input and output data */ + float *y /* i/o: imaginary part of input and output data */ +) +{ + int16_t j; + + /* Applying 64-point FFT for 5 times based on the address table Idx_dortft160 */ + for ( j = 0; j < 5; j++ ) + { + fft64( x, y, Idx_dortft320 + 64 * j ); + } + + /* Applying 5-point FFT for 64 times based on the address table Idx_dortft160 */ + for ( j = 0; j < 64; j++ ) + { + fft5_shift4( 64, x, y, Idx_dortft320 + j ); + } + + return; +} + +/*-----------------------------------------------------------------* + * DoRTFT480() + * a low complexity 2-dimensional DFT of 480 points + *-----------------------------------------------------------------*/ + +void DoRTFT480( + float *x, /* i/o: real part of input and output data */ + float *y /* i/o: imaginary part of input and output data */ +) +{ + int16_t j; + + /* Applying 32-point FFT for 15 times based on the address table Idx_dortft160 */ + for ( j = 0; j < 15; j++ ) + { + fft32_15( x, y, Idx_dortft480 + 32 * j ); + } + + /* Applying 5-point FFT for 32 times based on the address table Idx_dortft160 */ + for ( j = 0; j < 32; j++ ) + { + fft15_shift8( 32, x, y, Idx_dortft480 + j ); + } + + return; +} + +/*-----------------------------------------------------------------* + * DoRTFT40() + * a low complexity 2-dimensional DFT of 40 points + *-----------------------------------------------------------------*/ + +void DoRTFT40( + float *x, /* i/o: real part of input and output data */ + float *y /* i/o: imaginary part of input and output data */ +) +{ + int16_t j; + /* Applying 8-point FFT for 5 times based on the address table Idx_dortft40 */ + for ( j = 0; j < 5; j++ ) + { + fft8_5( x, y, Idx_dortft40 + 8 * j ); + } + + /* Applying 5-point FFT for 8 times based on the address table Idx_dortft40 */ + for ( j = 0; j < 8; j++ ) + { + fft5_8( 8, x, y, Idx_dortft40 + j ); + } + + return; +} + +/*-----------------------------------------------------------------* + * DoRTFT20() + * a low complexity 2-dimensional DFT of 20 points + *-----------------------------------------------------------------*/ + +void DoRTFT20( + float *x, /* i/o: real part of input and output data */ + float *y /* i/o: imaginary part of input and output data */ +) +{ + int16_t j; + + /* Applying 4-point FFT for 5 times based on the address table Idx_dortft20 */ + for ( j = 0; j < 5; j++ ) + { + fft4_5( x, y, Idx_dortft20 + 4 * j ); + } + + /* Applying 5-point FFT for 4 times based on the address table Idx_dortft20 */ + for ( j = 0; j < 4; j++ ) + { + fft5_4( 4, x, y, Idx_dortft20 + j ); + } + + return; +} + +/*-----------------------------------------------------------------* + * DoRTFT128() + * FFT with 128 points + *-----------------------------------------------------------------*/ + +void DoRTFT128( + float *x, /* i/o: real part of input and output data */ + float *y /* i/o: imaginary part of input and output data */ +) +{ + + int16_t i; + float z[256]; + + for ( i = 0; i < 128; i++ ) + { + z[2 * i] = x[i]; + z[2 * i + 1] = y[i]; + } + + cdftForw( 256, z, Ip_fft128, w_fft128 ); + + x[0] = z[0]; + y[0] = z[1]; + for ( i = 1; i < 128; i++ ) + { + x[128 - i] = z[2 * i]; + y[128 - i] = z[2 * i + 1]; + } + + return; +} + +/*-----------------------------------------------------------------* + * cdftForw() + * Main fuction of Complex Discrete Fourier Transform + *-----------------------------------------------------------------*/ + +static void cdftForw( + int16_t n, /* i : data length of real and imag */ + float *a, /* i/o: input/output data */ + const int16_t *ip, /* i : work area for bit reversal */ + const float *w /* i : cos/sin table */ +) +{ + /* bit reversal */ + bitrv2_SR( n, ip + 2, a ); + + /* Do FFT */ + cftfsub( n, a, w ); +} + +/*-----------------------------------------------------------------* + * bitrv2_SR() + * Bit reversal + *-----------------------------------------------------------------*/ + +static void bitrv2_SR( + int16_t n, /* i : data length of real and imag */ + const int16_t *ip, /* i/o: work area for bit reversal */ + float *a /* i/o: input/output data */ +) +{ + int16_t j, j1, k, k1, m, m2; + int16_t l; + float xr, xi, yr, yi; + + if ( n == 64 ) + { + m = 4; + l = -1; + } + else if ( n == 256 ) + { + m = 8; + l = -1; + } + else if ( n == 16 ) + { + m = 2; + l = -1; + } + else + { + l = n; + m = 1; + + while ( ( m << 3 ) < l ) + { + l >>= 1; + m <<= 1; + } + l -= m * 8; + } + + m2 = 2 * m; + + if ( l == 0 ) + { + for ( k = 0; k < m; k++ ) + { + for ( j = 0; j < k; j++ ) + { + j1 = 2 * j + ip[k]; + k1 = 2 * k + ip[j]; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += m2; + k1 += 2 * m2; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += m2; + k1 -= m2; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += m2; + k1 += 2 * m2; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + } + + j1 = 2 * k + m2 + ip[k]; + k1 = j1 + m2; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + } + } + else + { + for ( k = 1; k < m; k++ ) + { + for ( j = 0; j < k; j++ ) + { + j1 = 2 * j + ip[k]; + k1 = 2 * k + ip[j]; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += m2; + k1 += m2; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + } + } + } + + return; +} + +/*-----------------------------------------------------------------* + * cftfsub() + * Complex Discrete Fourier Transform + *-----------------------------------------------------------------*/ + +static void cftfsub( + int16_t n, /* i : data length of real and imag */ + float *a, /* i/o: input/output data */ + const float *w /* i : cos/sin table */ +) +{ + int16_t j, j1, j2, j3, l; + float x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i; + + l = 2; + if ( n > 8 ) + { + cft1st( n, a, w ); + + l = 8; + while ( ( l << 2 ) < n ) + { + cftmdl( n, l, a, w ); + l <<= 2; + } + } + + if ( ( l << 2 ) == n ) + { + for ( j = 0; j < l; j += 2 ) + { + j1 = j + l; + j2 = j1 + l; + j3 = j2 + l; + x0r = a[j] + a[j1]; + x0i = a[j + 1] + a[j1 + 1]; + x1r = a[j] - a[j1]; + x1i = a[j + 1] - a[j1 + 1]; + x2r = a[j2] + a[j3]; + x2i = a[j2 + 1] + a[j3 + 1]; + x3r = a[j2] - a[j3]; + x3i = a[j2 + 1] - a[j3 + 1]; + a[j] = x0r + x2r; + a[j + 1] = x0i + x2i; + a[j2] = x0r - x2r; + a[j2 + 1] = x0i - x2i; + a[j1] = x1r - x3i; + a[j1 + 1] = x1i + x3r; + a[j3] = x1r + x3i; + a[j3 + 1] = x1i - x3r; + } + } + else + { + for ( j = 0; j < l; j += 2 ) + { + j1 = j + l; + x0r = a[j] - a[j1]; + x0i = a[j + 1] - a[j1 + 1]; + a[j] += a[j1]; + a[j + 1] += a[j1 + 1]; + a[j1] = x0r; + a[j1 + 1] = x0i; + } + } + + return; +} + +/*-----------------------------------------------------------------* + * cft1st() + * Subfunction of Complex Discrete Fourier Transform + *-----------------------------------------------------------------*/ + +static void cft1st( + int16_t n, /* i : data length of real and imag */ + float *a, /* i/o: input/output data */ + const float *w /* i : cos/sin table */ +) +{ + int16_t j, k1, k2; + float wk1r, wk1i, wk2r, wk2i, wk3r, wk3i; + float x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i; + + x0r = a[0] + a[2]; + x0i = a[1] + a[3]; + x1r = a[0] - a[2]; + x1i = a[1] - a[3]; + x2r = a[4] + a[6]; + x2i = a[5] + a[7]; + x3r = a[4] - a[6]; + x3i = a[5] - a[7]; + a[0] = x0r + x2r; + a[1] = x0i + x2i; + a[4] = x0r - x2r; + a[5] = x0i - x2i; + a[2] = x1r - x3i; + a[3] = x1i + x3r; + a[6] = x1r + x3i; + a[7] = x1i - x3r; + wk1r = w[2]; + x0r = a[8] + a[10]; + x0i = a[9] + a[11]; + x1r = a[8] - a[10]; + x1i = a[9] - a[11]; + x2r = a[12] + a[14]; + x2i = a[13] + a[15]; + x3r = a[12] - a[14]; + x3i = a[13] - a[15]; + a[8] = x0r + x2r; + a[9] = x0i + x2i; + a[12] = x2i - x0i; + a[13] = x0r - x2r; + x0r = x1r - x3i; + x0i = x1i + x3r; + a[10] = wk1r * ( x0r - x0i ); + a[11] = wk1r * ( x0r + x0i ); + x0r = x3i + x1r; + x0i = x3r - x1i; + a[14] = wk1r * ( x0i - x0r ); + a[15] = wk1r * ( x0i + x0r ); + k1 = 0; + + for ( j = 16; j < n; j += 16 ) + { + k1 += 2; + k2 = 2 * k1; + wk2r = w[k1]; + wk2i = w[k1 + 1]; + wk1r = w[k2]; + wk1i = w[k2 + 1]; + wk3r = wk1r - 2 * wk2i * wk1i; + wk3i = 2 * wk2i * wk1r - wk1i; + x0r = a[j] + a[j + 2]; + x0i = a[j + 1] + a[j + 3]; + x1r = a[j] - a[j + 2]; + x1i = a[j + 1] - a[j + 3]; + x2r = a[j + 4] + a[j + 6]; + x2i = a[j + 5] + a[j + 7]; + x3r = a[j + 4] - a[j + 6]; + x3i = a[j + 5] - a[j + 7]; + a[j] = x0r + x2r; + a[j + 1] = x0i + x2i; + x0r -= x2r; + x0i -= x2i; + a[j + 4] = wk2r * x0r - wk2i * x0i; + a[j + 5] = wk2r * x0i + wk2i * x0r; + x0r = x1r - x3i; + x0i = x1i + x3r; + a[j + 2] = wk1r * x0r - wk1i * x0i; + a[j + 3] = wk1r * x0i + wk1i * x0r; + x0r = x1r + x3i; + x0i = x1i - x3r; + a[j + 6] = wk3r * x0r - wk3i * x0i; + a[j + 7] = wk3r * x0i + wk3i * x0r; + wk1r = w[k2 + 2]; + wk1i = w[k2 + 3]; + wk3r = wk1r - 2 * wk2r * wk1i; + wk3i = 2 * wk2r * wk1r - wk1i; + x0r = a[j + 8] + a[j + 10]; + x0i = a[j + 9] + a[j + 11]; + x1r = a[j + 8] - a[j + 10]; + x1i = a[j + 9] - a[j + 11]; + x2r = a[j + 12] + a[j + 14]; + x2i = a[j + 13] + a[j + 15]; + x3r = a[j + 12] - a[j + 14]; + x3i = a[j + 13] - a[j + 15]; + a[j + 8] = x0r + x2r; + a[j + 9] = x0i + x2i; + x0r -= x2r; + x0i -= x2i; + a[j + 12] = -wk2i * x0r - wk2r * x0i; + a[j + 13] = -wk2i * x0i + wk2r * x0r; + x0r = x1r - x3i; + x0i = x1i + x3r; + a[j + 10] = wk1r * x0r - wk1i * x0i; + a[j + 11] = wk1r * x0i + wk1i * x0r; + x0r = x1r + x3i; + x0i = x1i - x3r; + a[j + 14] = wk3r * x0r - wk3i * x0i; + a[j + 15] = wk3r * x0i + wk3i * x0r; + } + + return; +} + +/*-----------------------------------------------------------------* + * cftmdl() + * Subfunction of Complex Discrete Fourier Transform + *-----------------------------------------------------------------*/ + +static void cftmdl( + int16_t n, /* i : data length of real and imag */ + int16_t l, /* i : initial shift for processing */ + float *a, /* i/o: input/output data */ + const float *w /* i : cos/sin table */ +) +{ + int16_t j, j1, j2, j3, k, k1, k2, m, m2; + float wk1r, wk1i, wk2r, wk2i, wk3r, wk3i; + float x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i; + + m = l << 2; + for ( j = 0; j < l; j += 2 ) + { + j1 = j + l; + j2 = j1 + l; + j3 = j2 + l; + x0r = a[j] + a[j1]; + x0i = a[j + 1] + a[j1 + 1]; + x1r = a[j] - a[j1]; + x1i = a[j + 1] - a[j1 + 1]; + x2r = a[j2] + a[j3]; + x2i = a[j2 + 1] + a[j3 + 1]; + x3r = a[j2] - a[j3]; + x3i = a[j2 + 1] - a[j3 + 1]; + a[j] = x0r + x2r; + a[j + 1] = x0i + x2i; + a[j2] = x0r - x2r; + a[j2 + 1] = x0i - x2i; + a[j1] = x1r - x3i; + a[j1 + 1] = x1i + x3r; + a[j3] = x1r + x3i; + a[j3 + 1] = x1i - x3r; + } + + wk1r = w[2]; + for ( j = m; j < l + m; j += 2 ) + { + j1 = j + l; + j2 = j1 + l; + j3 = j2 + l; + x0r = a[j] + a[j1]; + x0i = a[j + 1] + a[j1 + 1]; + x1r = a[j] - a[j1]; + x1i = a[j + 1] - a[j1 + 1]; + x2r = a[j2] + a[j3]; + x2i = a[j2 + 1] + a[j3 + 1]; + x3r = a[j2] - a[j3]; + x3i = a[j2 + 1] - a[j3 + 1]; + a[j] = x0r + x2r; + a[j + 1] = x0i + x2i; + a[j2] = x2i - x0i; + a[j2 + 1] = x0r - x2r; + x0r = x1r - x3i; + x0i = x1i + x3r; + a[j1] = wk1r * ( x0r - x0i ); + a[j1 + 1] = wk1r * ( x0r + x0i ); + x0r = x3i + x1r; + x0i = x3r - x1i; + a[j3] = wk1r * ( x0i - x0r ); + a[j3 + 1] = wk1r * ( x0i + x0r ); + } + + k1 = 0; + m2 = 2 * m; + for ( k = m2; k < n; k += m2 ) + { + k1 += 2; + k2 = 2 * k1; + wk2r = w[k1]; + wk2i = w[k1 + 1]; + wk1r = w[k2]; + wk1i = w[k2 + 1]; + wk3r = wk1r - 2 * wk2i * wk1i; + wk3i = 2 * wk2i * wk1r - wk1i; + for ( j = k; j < l + k; j += 2 ) + { + j1 = j + l; + j2 = j1 + l; + j3 = j2 + l; + x0r = a[j] + a[j1]; + x0i = a[j + 1] + a[j1 + 1]; + x1r = a[j] - a[j1]; + x1i = a[j + 1] - a[j1 + 1]; + x2r = a[j2] + a[j3]; + x2i = a[j2 + 1] + a[j3 + 1]; + x3r = a[j2] - a[j3]; + x3i = a[j2 + 1] - a[j3 + 1]; + a[j] = x0r + x2r; + a[j + 1] = x0i + x2i; + x0r -= x2r; + x0i -= x2i; + a[j2] = wk2r * x0r - wk2i * x0i; + a[j2 + 1] = wk2r * x0i + wk2i * x0r; + x0r = x1r - x3i; + x0i = x1i + x3r; + a[j1] = wk1r * x0r - wk1i * x0i; + a[j1 + 1] = wk1r * x0i + wk1i * x0r; + x0r = x1r + x3i; + x0i = x1i - x3r; + a[j3] = wk3r * x0r - wk3i * x0i; + a[j3 + 1] = wk3r * x0i + wk3i * x0r; + } + + wk1r = w[k2 + 2]; + wk1i = w[k2 + 3]; + wk3r = wk1r - 2 * wk2r * wk1i; + wk3i = 2 * wk2r * wk1r - wk1i; + for ( j = k + m; j < l + ( k + m ); j += 2 ) + { + j1 = j + l; + j2 = j1 + l; + j3 = j2 + l; + x0r = a[j] + a[j1]; + x0i = a[j + 1] + a[j1 + 1]; + x1r = a[j] - a[j1]; + x1i = a[j + 1] - a[j1 + 1]; + x2r = a[j2] + a[j3]; + x2i = a[j2 + 1] + a[j3 + 1]; + x3r = a[j2] - a[j3]; + x3i = a[j2 + 1] - a[j3 + 1]; + a[j] = x0r + x2r; + a[j + 1] = x0i + x2i; + x0r -= x2r; + x0i -= x2i; + a[j2] = -wk2i * x0r - wk2r * x0i; + a[j2 + 1] = -wk2i * x0i + wk2r * x0r; + x0r = x1r - x3i; + x0i = x1i + x3r; + a[j1] = wk1r * x0r - wk1i * x0i; + a[j1 + 1] = wk1r * x0i + wk1i * x0r; + x0r = x1r + x3i; + x0i = x1i - x3r; + a[j3] = wk3r * x0r - wk3i * x0i; + a[j3 + 1] = wk3r * x0i + wk3i * x0r; + } + } + + return; +} + +static void cftbsub( + int16_t n, + float *a, + const float *w /* i : cos/sin table */ +) +{ + int16_t j, j1, j2, j3, l; + float x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i; + + l = 2; + if ( n > 8 ) + { + cft1st( n, a, w ); + l = 8; + + while ( ( l << 2 ) < n ) + { + cftmdl( n, l, a, w ); + l <<= 2; + } + } + + if ( ( l << 2 ) == n ) + { + for ( j = 0; j < l; j += 2 ) + { + j1 = j + l; + j2 = j1 + l; + j3 = j2 + l; + x0r = a[j] + a[j1]; + x0i = -a[j + 1] - a[j1 + 1]; + x1r = a[j] - a[j1]; + x1i = -a[j + 1] + a[j1 + 1]; + x2r = a[j2] + a[j3]; + x2i = a[j2 + 1] + a[j3 + 1]; + x3r = a[j2] - a[j3]; + x3i = a[j2 + 1] - a[j3 + 1]; + a[j] = x0r + x2r; + a[j + 1] = x0i - x2i; + a[j2] = x0r - x2r; + a[j2 + 1] = x0i + x2i; + a[j1] = x1r - x3i; + a[j1 + 1] = x1i - x3r; + a[j3] = x1r + x3i; + a[j3 + 1] = x1i + x3r; + } + } + else + { + for ( j = 0; j < l; j += 2 ) + { + j1 = j + l; + x0r = a[j] - a[j1]; + x0i = -a[j + 1] + a[j1 + 1]; + a[j] += a[j1]; + a[j + 1] = -a[j + 1] - a[j1 + 1]; + a[j1] = x0r; + a[j1 + 1] = x0i; + } + } + + return; +} + +static void rftfsub( + int16_t n, + float *a, + int16_t nc, + const float *c ) +{ + int16_t j, k, kk, ks, m; + float wkr, wki, xr, xi, yr, yi; + + m = n >> 1; + ks = 2 * nc / m; + kk = 0; + for ( j = 2; j < m; j += 2 ) + { + k = n - j; + kk += ks; + wkr = 0.5f - c[nc - kk]; + wki = c[kk]; + xr = a[j] - a[k]; + xi = a[j + 1] + a[k + 1]; + yr = wkr * xr - wki * xi; + yi = wkr * xi + wki * xr; + a[j] -= yr; + a[j + 1] -= yi; + a[k] += yr; + a[k + 1] -= yi; + } + + return; +} + + +static void rftbsub( + int16_t n, + float *a, + int16_t nc, + const float *c ) +{ + int16_t j, k, kk, ks, m; + float wkr, wki, xr, xi, yr, yi; + + a[1] = -a[1]; + m = n >> 1; + ks = 2 * nc / m; + kk = 0; + for ( j = 2; j < m; j += 2 ) + { + k = n - j; + kk += ks; + wkr = 0.5f - c[nc - kk]; + wki = c[kk]; + xr = a[j] - a[k]; + xi = a[j + 1] + a[k + 1]; + yr = wkr * xr + wki * xi; + yi = wkr * xi - wki * xr; + a[j] -= yr; + a[j + 1] = yi - a[j + 1]; + a[k] += yr; + a[k + 1] = yi - a[k + 1]; + } + a[m + 1] = -a[m + 1]; + + return; +} + + +static void dctsub( + int16_t n, + float *a, + int16_t nc, + const float *c ) +{ + int16_t j, k, kk, ks, m; + float wkr, wki, xr; + + m = n >> 1; + ks = nc / n; + kk = 0; + for ( j = 1; j < m; j++ ) + { + k = n - j; + kk += ks; + wkr = c[kk] - c[nc - kk]; + wki = c[kk] + c[nc - kk]; + xr = wki * a[j] - wkr * a[k]; + a[j] = wkr * a[j] + wki * a[k]; + a[k] = xr; + } + a[m] *= c[0]; + + return; +} + + +/*-----------------------------------------------------------------* + * edct2() + * + * Transformation of the signal to DCT domain + * OR Inverse EDCT-II for short frames + *-----------------------------------------------------------------*/ + +void edct2( + const int16_t n, + const int16_t isgn, + float *in, + float *a, + const int16_t *ip, + const float *w ) +{ + int16_t j, nw, nc; + float xr; + + mvr2r( in, a, n ); + + nw = ip[0]; + if ( n > ( nw << 2 ) ) + { + nw = n >> 2; + } + + nc = ip[1]; + if ( n > nc ) + { + nc = n; + } + + if ( isgn < 0 ) + { + xr = a[n - 1]; + for ( j = n - 2; j >= 2; j -= 2 ) + { + a[j + 1] = a[j] - a[j - 1]; + a[j] += a[j - 1]; + } + a[1] = a[0] - xr; + a[0] += xr; + + if ( n > 4 ) + { + rftbsub( n, a, nc, w + nw ); + bitrv2_SR( n, ip + 2, a ); + cftbsub( n, a, w ); + } + else if ( n == 4 ) + { + cftfsub( n, a, w ); + } + } + + if ( isgn >= 0 ) + { + a[0] *= 0.5f; + } + + dctsub( n, a, nc, w + nw ); + + if ( isgn >= 0 ) + { + if ( n > 4 ) + { + bitrv2_SR( n, ip + 2, a ); + cftfsub( n, a, w ); + rftfsub( n, a, nc, w + nw ); + } + else if ( n == 4 ) + { + cftfsub( n, a, w ); + } + xr = a[0] - a[1]; + a[0] += a[1]; + for ( j = 2; j < n; j += 2 ) + { + a[j - 1] = a[j] - a[j + 1]; + a[j] += a[j + 1]; + } + a[n - 1] = xr; + + for ( j = 0; j < n; j++ ) + { + a[j] /= 32.0f; + } + } +} + + +void DoRTFTn( + float *x, /* i/o: real part of input and output data */ + float *y, /* i/o: imaginary part of input and output data */ + const int16_t n /* i : size of the FFT up to 1024 */ +) +{ + + int16_t i; + float z[2048]; + + for ( i = 0; i < n; i++ ) + { + z[2 * i] = x[i]; + z[2 * i + 1] = y[i]; + } + + switch ( n ) + { + case ( 16 ): + cdftForw( 2 * n, z, Ip_fft16, w_fft16 ); + break; + case ( 32 ): + cdftForw( 2 * n, z, Ip_fft32, w_fft32 ); + break; + case ( 64 ): + cdftForw( 2 * n, z, Ip_fft64, w_fft64 ); + break; + case ( 128 ): + cdftForw( 2 * n, z, Ip_fft128, w_fft128 ); + break; + case ( 256 ): + cdftForw( 2 * n, z, Ip_fft256, w_fft256 ); + break; + case ( 512 ): + cdftForw( 2 * n, z, Ip_fft512, w_fft512 ); + break; + default: + assert( 0 ); + } + + x[0] = z[0]; + y[0] = z[1]; + for ( i = 1; i < n; i++ ) + { + x[n - i] = z[2 * i]; + y[n - i] = z[2 * i + 1]; + } + + return; +} + + +void fft3( + const float X[], + float Y[], + const int16_t n ) +{ + float Z[PH_ECU_SPEC_SIZE]; + float *Z0, *Z1, *Z2; + float *z0, *z1, *z2; + const float *x; + const float *t_sin = sincos_t_rad3; + int16_t m, step, order; + int16_t i, j; + int16_t c1_ind, s1_ind, c2_ind, s2_ind; + int16_t c1_step, s1_step, c2_step, s2_step; + float *RY, *IY, *RZ0, *IZ0, *RZ1, *IZ1, *RZ2, *IZ2; + + /* Determine the order of the transform, the length of decimated */ + /* transforms m, and the step for the sine and cosine tables. */ + switch ( n ) + { + case 1536: + order = 9; + m = 512; + step = 1; + break; + case 384: + order = 7; + m = 128; + step = 4; + break; + default: + order = 9; + m = 512; + step = 1; + } + + /* Compose decimated sequences X[3i], X[3i+1],X[3i+2] */ + /* compute their FFT of length m. */ + Z0 = &Z[0]; + z0 = &Z0[0]; + Z1 = &Z0[m]; + z1 = &Z1[0]; /* Z1 = &Z[ m]; */ + Z2 = &Z1[m]; + z2 = &Z2[0]; /* Z2 = &Z[2m]; */ + x = &X[0]; + for ( i = 0; i < n / 3; i++ ) + { + *z0++ = *x++; /* Z0[i] = X[3i]; */ + *z1++ = *x++; /* Z1[i] = X[3i+1]; */ + *z2++ = *x++; /* Z2[i] = X[3i+2]; */ + } + + fft_rel( &Z0[0], m, order ); + fft_rel( &Z1[0], m, order ); + fft_rel( &Z2[0], m, order ); + + /* Butterflies of order 3. */ + /* pointer initialization */ + RY = &Y[0]; + IY = &Y[n]; + RZ0 = &Z0[0]; + IZ0 = &Z0[m]; + RZ1 = &Z1[0]; + IZ1 = &Z1[m]; + RZ2 = &Z2[0]; + IZ2 = &Z2[m]; + + c1_step = -step; + s1_step = step; + c2_step = -2 * step; + s2_step = 2 * step; + c1_ind = T_SIN_PI_2 + c1_step; + s1_ind = s1_step; + c2_ind = T_SIN_PI_2 + c2_step; + s2_ind = s2_step; + + /* special case: i = 0 */ + RY[0] = RZ0[0] + RZ1[0] + RZ2[0]; + + /* first 3/12 */ + for ( i = 1; i < 3 * m / 8; i++, c1_ind += c1_step, s1_ind += s1_step, c2_ind += c2_step, s2_ind += s2_step ) + { + RY[i] = RZ0[i] + RZ1[i] * t_sin[c1_ind] + IZ1[-i] * t_sin[s1_ind] + RZ2[i] * t_sin[c2_ind] + IZ2[-i] * t_sin[s2_ind]; + IY[-i] = IZ0[-i] - RZ1[i] * t_sin[s1_ind] + IZ1[-i] * t_sin[c1_ind] - RZ2[i] * t_sin[s2_ind] + IZ2[-i] * t_sin[c2_ind]; + } + + /* next 1/12 */ + for ( ; i < 4 * m / 8; i++, c1_ind += c1_step, s1_ind += s1_step, c2_ind -= c2_step, s2_ind -= s2_step ) + { + RY[i] = RZ0[i] + RZ1[i] * t_sin[c1_ind] + IZ1[-i] * t_sin[s1_ind] - RZ2[i] * t_sin[c2_ind] + IZ2[-i] * t_sin[s2_ind]; + IY[-i] = IZ0[-i] - RZ1[i] * t_sin[s1_ind] + IZ1[-i] * t_sin[c1_ind] - RZ2[i] * t_sin[s2_ind] - IZ2[-i] * t_sin[c2_ind]; + } + + /* special case: i = m/2 i.e. 1/3 */ + RY[i] = RZ0[i] + RZ1[i] * t_sin[c1_ind] - RZ2[i] * t_sin[c2_ind]; + IY[-i] = -RZ1[i] * t_sin[s1_ind] - RZ2[i] * t_sin[s2_ind]; + i++; + + c1_ind += c1_step, s1_ind += s1_step, c2_ind -= c2_step, s2_ind -= s2_step; + + /* next 2/12 */ + for ( j = i - 2; i < 6 * m / 8; i++, j--, c1_ind += c1_step, s1_ind += s1_step, c2_ind -= c2_step, s2_ind -= s2_step ) + { + RY[i] = RZ0[j] + RZ1[j] * t_sin[c1_ind] - IZ1[-j] * t_sin[s1_ind] - RZ2[j] * t_sin[c2_ind] - IZ2[-j] * t_sin[s2_ind]; + IY[-i] = -IZ0[-j] - RZ1[j] * t_sin[s1_ind] - IZ1[-j] * t_sin[c1_ind] - RZ2[j] * t_sin[s2_ind] + IZ2[-j] * t_sin[c2_ind]; + } + + /*--------------------------half--------------------------*/ + /* next 2/12 */ + for ( ; i < 8 * m / 8; i++, j--, c1_ind -= c1_step, s1_ind -= s1_step, c2_ind += c2_step, s2_ind += s2_step ) + { + RY[i] = RZ0[j] - RZ1[j] * t_sin[c1_ind] - IZ1[-j] * t_sin[s1_ind] - RZ2[j] * t_sin[c2_ind] + IZ2[-j] * t_sin[s2_ind]; + IY[-i] = -IZ0[-j] - RZ1[j] * t_sin[s1_ind] + IZ1[-j] * t_sin[c1_ind] + RZ2[j] * t_sin[s2_ind] + IZ2[-j] * t_sin[c2_ind]; + } + + /* special case: i = m, i.e 2/3 */ + RY[i] = RZ0[j] - RZ1[j] * t_sin[c1_ind] - RZ2[j] * t_sin[c2_ind]; + IY[-i++] = -RZ1[j] * t_sin[s1_ind] + RZ2[j] * t_sin[s2_ind]; + c1_ind -= c1_step, s1_ind -= s1_step, c2_ind += c2_step, s2_ind += s2_step; + + /* next 1/12 */ + for ( j = 1; i < 9 * m / 8; i++, j++, c1_ind -= c1_step, s1_ind -= s1_step, c2_ind += c2_step, s2_ind += s2_step ) + { + RY[i] = RZ0[j] - RZ1[j] * t_sin[c1_ind] + IZ1[-j] * t_sin[s1_ind] - RZ2[j] * t_sin[c2_ind] - IZ2[-j] * t_sin[s2_ind]; + IY[-i] = IZ0[-j] - RZ1[j] * t_sin[s1_ind] - IZ1[-j] * t_sin[c1_ind] + RZ2[j] * t_sin[s2_ind] - IZ2[-j] * t_sin[c2_ind]; + } + + /* last 3/12 */ + for ( ; i < 12 * m / 8; i++, j++, c1_ind -= c1_step, s1_ind -= s1_step, c2_ind -= c2_step, s2_ind -= s2_step ) + { + RY[i] = RZ0[j] - RZ1[j] * t_sin[c1_ind] + IZ1[-j] * t_sin[s1_ind] + RZ2[j] * t_sin[c2_ind] - IZ2[-j] * t_sin[s2_ind]; + IY[-i] = IZ0[-j] - RZ1[j] * t_sin[s1_ind] - IZ1[-j] * t_sin[c1_ind] + RZ2[j] * t_sin[s2_ind] + IZ2[-j] * t_sin[c2_ind]; + } + + /* special case: i = 3*m/2 */ + RY[i] = RZ0[j] - RZ1[j] * t_sin[c1_ind] + RZ2[j] * t_sin[c2_ind]; + + return; +} + +void ifft3( + const float Z[], + float X[], + const int16_t n ) +{ + float Y[PH_ECU_SPEC_SIZE]; + const float *t_sin = sincos_t_rad3; + int16_t m, step, step2, order; + int16_t i; + int16_t c0_ind, s0_ind, c1_ind, s1_ind, c2_ind, s2_ind; + float scale; + const float *RZ0, *IZ0, *RZ1, *IZ1, *RZ2, *IZ2; + float *RY0, *IY0, *RY1, *IY1, *RY2, *IY2, *y0, *y1, *y2; + + /* Determine the order of the transform, the length of decimated */ + /* transforms m, and the step for the sine and cosine tables. */ + switch ( n ) + { + case 1536: + order = 9; + m = 512; + step = 1; + break; + case 384: + order = 7; + m = 128; + step = 4; + break; + default: + order = 9; + m = 512; + step = 1; + } + + /* pointer initialization */ + RY0 = &Y[0]; + IY0 = &RY0[m]; + RY1 = &RY0[m]; + IY1 = &RY1[m]; + RY2 = &RY1[m]; + IY2 = &RY2[m]; + + RZ0 = &Z[0]; + RZ1 = RZ0 + m; + RZ2 = RZ0 + n / 2 - m / 2; + IZ0 = &Z[n]; + IZ1 = IZ0 - m; + IZ2 = IZ0 - n / 2 + m / 2; + + /* Inverse butterflies of order 3. */ + + /* Construction of Y0 */ + RY0[0] = RZ0[0] + RZ1[0] + RZ2[0]; + for ( i = 1; i < m / 2; i++ ) + { + RY0[i] = RZ0[i] + RZ1[i] + RZ2[-i]; + IY0[-i] = IZ0[-i] + IZ1[-i] - IZ2[i]; + } + + /* m/2 */ + RY0[i] = RZ0[i] + RZ1[i] + RZ2[-i]; + + /* Construction of Y1 */ + c0_ind = T_SIN_PI_2; + s0_ind = 0; + c1_ind = T_SIN_PI_2 * 1 / 3; + s1_ind = T_SIN_PI_2 * 2 / 3; + c2_ind = T_SIN_PI_2 * 1 / 3; + s2_ind = T_SIN_PI_2 * 2 / 3; + + RY1[0] = RZ0[0] * t_sin[c0_ind] - RZ1[0] * t_sin[c1_ind] - RZ2[0] * t_sin[c2_ind] - IZ1[0] * t_sin[s1_ind] - IZ2[0] * t_sin[s2_ind]; + + c0_ind -= step, s0_ind += step, c1_ind += step, s1_ind -= step, c2_ind -= step, s2_ind += step; + for ( i = 1; i < m / 4; i++, c0_ind -= step, s0_ind += step, c1_ind += step, s1_ind -= step, c2_ind -= step, s2_ind += step ) + { + RY1[i] = RZ0[i] * t_sin[c0_ind] - RZ1[i] * t_sin[c1_ind] - RZ2[-i] * t_sin[c2_ind] - IZ0[-i] * t_sin[s0_ind] - IZ1[-i] * t_sin[s1_ind] - IZ2[i] * t_sin[s2_ind]; + IY1[-i] = IZ0[-i] * t_sin[c0_ind] - IZ1[-i] * t_sin[c1_ind] + IZ2[i] * t_sin[c2_ind] + RZ0[i] * t_sin[s0_ind] + RZ1[i] * t_sin[s1_ind] - RZ2[-i] * t_sin[s2_ind]; + } + + for ( ; i < m / 2; i++, c0_ind -= step, s0_ind += step, c1_ind += step, s1_ind -= step, c2_ind += step, s2_ind -= step ) + { + RY1[i] = RZ0[i] * t_sin[c0_ind] - RZ1[i] * t_sin[c1_ind] + RZ2[-i] * t_sin[c2_ind] - IZ0[-i] * t_sin[s0_ind] - IZ1[-i] * t_sin[s1_ind] - IZ2[i] * t_sin[s2_ind]; + IY1[-i] = IZ0[-i] * t_sin[c0_ind] - IZ1[-i] * t_sin[c1_ind] - IZ2[i] * t_sin[c2_ind] + RZ0[i] * t_sin[s0_ind] + RZ1[i] * t_sin[s1_ind] - RZ2[-i] * t_sin[s2_ind]; + } + + /* m/2 */ + RY1[i] = RZ0[i] * t_sin[c0_ind] - RZ1[i] * t_sin[c1_ind] + RZ2[-i] * t_sin[c2_ind] - IZ0[-i] * t_sin[s0_ind] - IZ1[-i] * t_sin[s1_ind] - IZ2[i] * t_sin[s2_ind]; + + /* Construction of Y2 */ + c0_ind = T_SIN_PI_2; + s0_ind = 0; + c1_ind = T_SIN_PI_2 * 1 / 3; + s1_ind = T_SIN_PI_2 * 2 / 3; + c2_ind = T_SIN_PI_2 * 1 / 3; + s2_ind = T_SIN_PI_2 * 2 / 3; + step2 = 2 * step; + RY2[0] = RZ0[0] * t_sin[c0_ind] - RZ1[0] * t_sin[c1_ind] - RZ2[0] * t_sin[c2_ind] + IZ1[0] * t_sin[s1_ind] + IZ2[0] * t_sin[s2_ind]; + + c0_ind -= step2, s0_ind += step2, c1_ind -= step2, s1_ind += step2, c2_ind += step2, s2_ind -= step2; + for ( i = 1; i < m / 8; i++, c0_ind -= step2, s0_ind += step2, c1_ind -= step2, s1_ind += step2, c2_ind += step2, s2_ind -= step2 ) + { + RY2[i] = RZ0[i] * t_sin[c0_ind] - RZ1[i] * t_sin[c1_ind] - RZ2[-i] * t_sin[c2_ind] - IZ0[-i] * t_sin[s0_ind] + IZ1[-i] * t_sin[s1_ind] + IZ2[i] * t_sin[s2_ind]; + IY2[-i] = IZ0[-i] * t_sin[c0_ind] - IZ1[-i] * t_sin[c1_ind] + IZ2[i] * t_sin[c2_ind] + RZ0[i] * t_sin[s0_ind] - RZ1[i] * t_sin[s1_ind] + RZ2[-i] * t_sin[s2_ind]; + } + + for ( ; i < m / 4; i++, c0_ind -= step2, s0_ind += step2, c1_ind += step2, s1_ind -= step2, c2_ind += step2, s2_ind -= step2 ) + { + RY2[i] = RZ0[i] * t_sin[c0_ind] + RZ1[i] * t_sin[c1_ind] - RZ2[-i] * t_sin[c2_ind] - IZ0[-i] * t_sin[s0_ind] + IZ1[-i] * t_sin[s1_ind] + IZ2[i] * t_sin[s2_ind]; + IY2[-i] = IZ0[-i] * t_sin[c0_ind] + IZ1[-i] * t_sin[c1_ind] + IZ2[i] * t_sin[c2_ind] + RZ0[i] * t_sin[s0_ind] - RZ1[i] * t_sin[s1_ind] + RZ2[-i] * t_sin[s2_ind]; + } + + for ( ; i < 3 * m / 8; i++, c0_ind -= step2, s0_ind += step2, c1_ind += step2, s1_ind -= step2, c2_ind -= step2, s2_ind += step2 ) + { + RY2[i] = RZ0[i] * t_sin[c0_ind] + RZ1[i] * t_sin[c1_ind] - RZ2[-i] * t_sin[c2_ind] - IZ0[-i] * t_sin[s0_ind] + IZ1[-i] * t_sin[s1_ind] - IZ2[i] * t_sin[s2_ind]; + IY2[-i] = IZ0[-i] * t_sin[c0_ind] + IZ1[-i] * t_sin[c1_ind] + IZ2[i] * t_sin[c2_ind] + RZ0[i] * t_sin[s0_ind] - RZ1[i] * t_sin[s1_ind] - RZ2[-i] * t_sin[s2_ind]; + } + + for ( ; i < m / 2; i++, c0_ind += step2, s0_ind -= step2, c1_ind += step2, s1_ind -= step2, c2_ind -= step2, s2_ind += step2 ) + { + RY2[i] = -RZ0[i] * t_sin[c0_ind] + RZ1[i] * t_sin[c1_ind] - RZ2[-i] * t_sin[c2_ind] - IZ0[-i] * t_sin[s0_ind] + IZ1[-i] * t_sin[s1_ind] - IZ2[i] * t_sin[s2_ind]; + IY2[-i] = -IZ0[-i] * t_sin[c0_ind] + IZ1[-i] * t_sin[c1_ind] + IZ2[i] * t_sin[c2_ind] + RZ0[i] * t_sin[s0_ind] - RZ1[i] * t_sin[s1_ind] - RZ2[-i] * t_sin[s2_ind]; + } + + /* m/2 */ + RY2[i] = -RZ0[i] * t_sin[c0_ind] + RZ1[i] * t_sin[c1_ind] - RZ2[-i] * t_sin[c2_ind] - IZ0[-i] * t_sin[s0_ind] + IZ1[-i] * t_sin[s1_ind] - IZ2[i] * t_sin[s2_ind]; + + /* Compute the inverse FFT for all 3 blocks. */ + ifft_rel( RY0, m, order ); + ifft_rel( RY1, m, order ); + ifft_rel( RY2, m, order ); + + y0 = RY0; + y1 = RY1; + y2 = RY2; + + /* Interlacing and scaling, scale = 1/3 */ + scale = 1.0f / 3; + for ( i = 0; i < n; ) + { + X[i++] = ( *y0++ ) * scale; + X[i++] = ( *y1++ ) * scale; + X[i++] = ( *y2++ ) * scale; + } + + return; +} + + +static void rfft_post( + const float *sine_table, + float *buf, + const int16_t len ) +{ + float tmp1, tmp2, tmp3, tmp4, s, c; + int16_t i = 0; + + tmp1 = buf[0] + buf[1]; + buf[1] = buf[0] - buf[1]; + buf[0] = tmp1; + + for ( i = 1; i <= ( len + 2 ) / 4; i++ ) + { + s = sine_table[i]; /* sin(pi*i/(len/2)) */ + c = sine_table[i + len / 4]; /* cos(pi*i/(len/2)) */ + + tmp1 = buf[2 * i] - buf[len - 2 * i]; + tmp2 = buf[2 * i + 1] + buf[len - 2 * i + 1]; + tmp3 = s * tmp1 - c * tmp2; /* real part of j*W(k,N)*[T(k) - T'(N-k)] */ + tmp4 = c * tmp1 + s * tmp2; /* imag part of j*W(k,N)*[T(k) - T'(N-k)] */ + tmp1 = buf[2 * i] + buf[len - 2 * i]; + tmp2 = buf[2 * i + 1] - buf[len - 2 * i + 1]; + + buf[2 * i] = 0.5f * ( tmp1 - tmp3 ); + buf[2 * i + 1] = 0.5f * ( tmp2 - tmp4 ); + buf[len - 2 * i] = 0.5f * ( tmp1 + tmp3 ); + buf[len - 2 * i + 1] = -0.5f * ( tmp2 + tmp4 ); + } +} + +static void rfft_pre( + const float *sine_table, + float *buf, + const int16_t len ) +{ + const float scale = 1.0f / len; + float tmp1, tmp2, tmp3, tmp4, s, c; + int16_t i = 0; + + tmp1 = buf[0] + buf[1]; + buf[1] = scale * ( buf[0] - buf[1] ); + buf[0] = scale * tmp1; + + for ( i = 1; i <= ( len + 2 ) / 4; i++ ) + { + s = sine_table[i]; /* sin(pi*i/(len/2)) */ + c = sine_table[i + len / 4]; /* cos(pi*i/(len/2)) */ + + tmp1 = buf[2 * i] - buf[len - 2 * i]; + tmp2 = buf[2 * i + 1] + buf[len - 2 * i + 1]; + tmp3 = s * tmp1 + c * tmp2; /* real part of j*W(k,N)*[T(k) - T'(N-k)] */ + tmp4 = -c * tmp1 + s * tmp2; /* imag part of j*W(k,N)*[T(k) - T'(N-k)] */ + tmp1 = buf[2 * i] + buf[len - 2 * i]; + tmp2 = buf[2 * i + 1] - buf[len - 2 * i + 1]; + + buf[2 * i] = scale * ( tmp1 + tmp3 ); + buf[2 * i + 1] = -scale * ( tmp2 + tmp4 ); + buf[len - 2 * i] = scale * ( tmp1 - tmp3 ); + buf[len - 2 * i + 1] = scale * ( tmp2 - tmp4 ); + } + + return; +} + +int16_t RFFTN( + float *data, + const float *sine_table, + const int16_t len, + const int16_t sign ) +{ + assert( len <= 640 && len > 0 ); + + if ( len == 640 ) + { + float x[320], y[320]; + int16_t i; + + if ( sign != -1 ) + { + rfft_pre( sine_table, data, len ); + } + + for ( i = 0; i < 320; i++ ) + { + x[i] = data[2 * i]; + y[i] = data[2 * i + 1]; + } + DoRTFT320( x, y ); + for ( i = 0; i < 320; i++ ) + { + data[2 * i] = x[i]; + data[2 * i + 1] = y[i]; + } + + if ( sign == -1 ) + { + rfft_post( sine_table, data, len ); + } + } + else + { + if ( len == 512 ) + { + int16_t i; + const int16_t log2 = 9; + float reordered_data[512]; + + if ( sign == -1 ) + { + fft_rel( data, len, log2 ); + reordered_data[0] = data[0]; + reordered_data[1] = data[len / 2]; + for ( i = 1; i < len / 2; i++ ) + { + reordered_data[2 * i] = data[i]; + reordered_data[2 * i + 1] = data[len - i]; + } + } + else + { + reordered_data[0] = data[0]; + reordered_data[len / 2] = data[1]; + for ( i = 1; i < len / 2; i++ ) + { + reordered_data[i] = data[2 * i]; + reordered_data[len - i] = data[2 * i + 1]; + } + ifft_rel( reordered_data, len, log2 ); + } + mvr2r( reordered_data, data, len ); + } + else + { + assert( !"Not supported FFT length!" ); + } + } + + return 0; +} + +static void butterfly( + const float a, + const float b, + float *aPlusb, + float *aMinusb ) +{ + *aPlusb = a + b; + *aMinusb = a - b; + + return; +} + +static void fft2( + float *pInOut ) +{ + /* FFT MATRIX: + 1.0000 1.0000 + 1.0000 -1.0000 + */ + float re1, im1; + float re2, im2; + + re1 = pInOut[0]; + im1 = pInOut[1]; + re2 = pInOut[2]; + im2 = pInOut[3]; + pInOut[0] = re1 + re2; + pInOut[1] = im1 + im2; + + pInOut[2] = re1 - re2; + pInOut[3] = im1 - im2; + + return; +} + +static const float C31 = 0.5f; /* cos(PI/3); sin(2*PI/3) */ +static const float C32 = 0.866025403784439f; /* cos(PI/3); sin(2*PI/3) */ + +static void fft3_2( + float *pInOut ) +{ + float re1, im1; + float re2, im2; + float re3, im3; + + float tmp1, tmp2; + float tmp3, tmp4; + + re1 = pInOut[0]; + im1 = pInOut[1]; + re2 = pInOut[2]; + im2 = pInOut[3]; + re3 = pInOut[4]; + im3 = pInOut[5]; + + /* FFT MATRIX: + 1.0000 1.0000 1.0000 + C31 C32 + 1.0000 -0.5000 - 0.8660i -0.5000 + 0.8660i + 1.0000 -0.5000 + 0.8660i -0.5000 - 0.8660i + */ + tmp1 = re2 + re3; + tmp3 = im2 + im3; + tmp2 = re2 - re3; + tmp4 = im2 - im3; + pInOut[0] = re1 + tmp1; + pInOut[1] = im1 + tmp3; + pInOut[2] = re1 - C31 * tmp1 + C32 * tmp4; + pInOut[4] = re1 - C31 * tmp1 - C32 * tmp4; + + pInOut[3] = im1 - C32 * tmp2 - C31 * tmp3; + pInOut[5] = im1 + C32 * tmp2 - C31 * tmp3; +} + + +static void fft4( + float *pInOut ) +{ + float re1, im1; + float re2, im2; + float re3, im3; + float re4, im4; + + float tmp1, tmp2; + float tmp3, tmp4; + float tmp5, tmp6; + float tmp7, tmp8; + + re1 = pInOut[0]; + im1 = pInOut[1]; + re2 = pInOut[2]; + im2 = pInOut[3]; + re3 = pInOut[4]; + im3 = pInOut[5]; + re4 = pInOut[6]; + im4 = pInOut[7]; + + /* + 1.0000 1.0000 1.0000 1.0000 + 1.0000 -1.0000i -1.0000 1.0000i + 1.0000 -1.0000 1.0000 -1.0000 + 1.0000 1.0000i -1.0000 -1.0000i + */ + tmp1 = re1 + re3; + tmp3 = re2 + re4; + tmp5 = im1 + im3; + tmp7 = im2 + im4; + pInOut[0] = tmp1 + tmp3; + pInOut[4] = tmp1 - tmp3; + + pInOut[1] = tmp5 + tmp7; + pInOut[5] = tmp5 - tmp7; + tmp2 = re1 - re3; + tmp4 = re2 - re4; + tmp6 = im1 - im3; + tmp8 = im2 - im4; + pInOut[2] = tmp2 + tmp8; + pInOut[6] = tmp2 - tmp8; + + pInOut[3] = -tmp4 + tmp6; + pInOut[7] = tmp4 + tmp6; + + return; +} + +static const float C51 = 0.309016994374947f; /* cos(2*PI/5); */ +static const float C52 = 0.951056516295154f; /* sin(2*PI/5); */ +static const float C53 = 0.809016994374947f; /* cos( PI/5); */ +static const float C54 = 0.587785252292473f; /* sin( PI/5); */ + +static void fft5( + float *pInOut ) +{ + float re1, im1; + float re2, im2; + float re3, im3; + float re4, im4; + float re5, im5; + + float tmp1, tmp2; + float tmp3, tmp4; + float tmp5, tmp6; + float tmp7, tmp8; + + + re1 = pInOut[0]; + im1 = pInOut[1]; + re2 = pInOut[2]; + im2 = pInOut[3]; + re3 = pInOut[4]; + im3 = pInOut[5]; + re4 = pInOut[6]; + im4 = pInOut[7]; + re5 = pInOut[8]; + im5 = pInOut[9]; + + /* + 1.0000 1.0000 1.0000 1.0000 1.0000 + C51 C52 C53 C54 + 1.0000 0.3090 - 0.9511i -0.8090 - 0.5878i -0.8090 + 0.5878i 0.3090 + 0.9511i + 1.0000 -0.8090 - 0.5878i 0.3090 + 0.9511i 0.3090 - 0.9511i -0.8090 + 0.5878i + 1.0000 -0.8090 + 0.5878i 0.3090 - 0.9511i 0.3090 + 0.9511i -0.8090 - 0.5878i + 1.0000 0.3090 + 0.9511i -0.8090 + 0.5878i -0.8090 - 0.5878i 0.3090 - 0.9511i + */ + tmp1 = re2 + re5; + tmp2 = re2 - re5; + tmp3 = im2 + im5; + tmp4 = im2 - im5; + tmp5 = re3 + re4; + tmp6 = re3 - re4; + tmp7 = im3 + im4; + tmp8 = im3 - im4; + + + pInOut[0] = re1 + tmp1 + tmp5; + pInOut[1] = im1 + tmp3 + tmp7; + + pInOut[2] = re1 + C51 * tmp1 - C53 * tmp5 + C52 * tmp4 + C54 * tmp8; + pInOut[8] = re1 + C51 * tmp1 - C53 * tmp5 - C52 * tmp4 - C54 * tmp8; + pInOut[3] = im1 - C52 * tmp2 - C54 * tmp6 + C51 * tmp3 - C53 * tmp7; + pInOut[9] = im1 + C52 * tmp2 + C54 * tmp6 + C51 * tmp3 - C53 * tmp7; + pInOut[4] = re1 - C53 * tmp1 + C51 * tmp5 + C54 * tmp4 - C52 * tmp8; + pInOut[6] = re1 - C53 * tmp1 + C51 * tmp5 - C54 * tmp4 + C52 * tmp8; + pInOut[5] = im1 - C54 * tmp2 + C52 * tmp6 - C53 * tmp3 + C51 * tmp7; + pInOut[7] = im1 + C54 * tmp2 - C52 * tmp6 - C53 * tmp3 + C51 * tmp7; + + return; +} + +static const float C81 = 0.707106781186548f; /* cos(PI/4); */ + +static void fft8_2( + float *pInOut ) +{ + float re0, im0, re4, im4; + + float re1_7p, re1_7m; + float im1_7p, im1_7m; + float re2_6p, re2_6m; + float im2_6p, im2_6m; + float re3_5p, re3_5m; + float im3_5p, im3_5m; + + re0 = pInOut[0]; + im0 = pInOut[1]; + re4 = pInOut[8]; + im4 = pInOut[9]; + butterfly( pInOut[1 * 2], pInOut[7 * 2], &re1_7p, &re1_7m ); + butterfly( pInOut[1 * 2 + 1], pInOut[7 * 2 + 1], &im1_7p, &im1_7m ); + butterfly( pInOut[2 * 2], pInOut[6 * 2], &re2_6p, &re2_6m ); + butterfly( pInOut[2 * 2 + 1], pInOut[6 * 2 + 1], &im2_6p, &im2_6m ); + butterfly( pInOut[3 * 2], pInOut[5 * 2], &re3_5p, &re3_5m ); + butterfly( pInOut[3 * 2 + 1], pInOut[5 * 2 + 1], &im3_5p, &im3_5m ); + + /* + 0: 1 + 0i 1 + 0i 1 + 0i 1 + 0i 1 + 0i 1 + 0i 1 + 0i 1 + 0i + 1: 1 + 0i C81 - C81i 0 - 1i -C81 - C81i -1 - 0i -C81 + C81i - 0 + 1i C81 + C81i + 2: 1 + 0i 0 - 1i -1 - 0i - 0 + 1i 1 + 0i 0 - 1i - 1 - 0i - 0 + 1i + 3: 1 + 0i -C81 - C81i -0 + 1i C81 - C81i -1 - 0i C81 + C81i 0 - 1i -C81 + C81i + 4: 1 + 0i - 1 - 0i 1 + 0i - 1 - 0i 1 + 0i - 1 - 0i 1 + 0i - 1 - 0i + 5: 1 + 0i -C81 + C81i 0 - 1i C81 + C81i -1 - 0i C81 - C81i - 0 + 1i -C81 - C81i + 6: 1 + 0i - 0 + 1i -1 - 0i 0 - 1i 1 + 0i - 0 + 1i - 1 - 0i - 0 - 1i + 7: 1 + 0i C81 + C81i -0 + 1i -C81 + C81i -1 - 0i -C81 - C81i - 0 - 1i C81 - C81i + */ + pInOut[0] = re0 + re4 + re1_7p + re2_6p + re3_5p; + pInOut[1] = im0 + im4 + im1_7p + im2_6p + im3_5p; + + pInOut[2] = re0 + C81 * ( re1_7p - re3_5p ) - re4 + C81 * ( im1_7m + im3_5m ) + im2_6m; + pInOut[3] = im0 + C81 * ( im1_7p - im3_5p ) - im4 - C81 * ( re1_7m + re3_5m ) - re2_6m; + + pInOut[4] = re0 - re2_6p + re4 + im1_7m - im3_5m; + pInOut[5] = im0 - im2_6p + im4 - re1_7m + re3_5m; + + pInOut[6] = re0 + C81 * ( -re1_7p + re3_5p ) - re4 + C81 * ( im1_7m + im3_5m ) - im2_6m; + pInOut[7] = im0 + C81 * ( -im1_7p + im3_5p ) - im4 - C81 * ( re1_7m + re3_5m ) + re2_6m; + + pInOut[8] = re0 - re1_7p + re2_6p - re3_5p + re4; + pInOut[9] = im0 - im1_7p + im2_6p - im3_5p + im4; + + pInOut[10] = re0 + C81 * ( -re1_7p + re3_5p ) - re4 - C81 * ( im1_7m + im3_5m ) + im2_6m; + pInOut[11] = im0 + C81 * ( -im1_7p + im3_5p ) - im4 + C81 * ( re1_7m + re3_5m ) - re2_6m; + + pInOut[12] = re0 - re2_6p + re4 - im1_7m + im3_5m; + pInOut[13] = im0 - im2_6p + im4 + re1_7m - re3_5m; + + pInOut[14] = re0 + C81 * ( re1_7p - re3_5p ) - re4 - C81 * ( im1_7m + im3_5m ) - im2_6m; + pInOut[15] = im0 + C81 * ( im1_7p - im3_5p ) - im4 + C81 * ( re1_7m + re3_5m ) + re2_6m; + + return; +} + +static void nextFFT( + float *x, + const int16_t length ) +{ + switch ( length ) + { + case 2: + fft2( x ); + break; + case 3: + fft3_2( x ); + break; + case 4: + fft4( x ); + break; + case 5: + fft5( x ); + break; + case 8: + fft8_2( x ); + break; + default: + assert( !"length not supported" ); + break; + } + + return; +} + +static const int16_t CTFFTfactors[] = { 9, 8, 7, 5, 4, 3, 2, 0 }; + +static __inline int16_t findFactor( + const int16_t length ) +{ + int16_t i = 0; + int16_t factor = 0; + + while ( CTFFTfactors[i] != 0 ) + { + if ( 0 == ( length % CTFFTfactors[i] ) ) + { + factor = CTFFTfactors[i]; + break; + } + i++; + } + return factor; +} + +static __inline void twiddle( + float *x, + const int16_t length, + const int16_t n1, + const int16_t n2 ) +{ + int16_t i, ii; + double pi = 4. * atan( 1. ); + float sinValOrg, cosValOrg; + float sinVal = 0.f, cosVal = 1.f; + float twReal = 0.f, twImag = 1.f; + + cosValOrg = (float) cos( -2 * pi * 1. / (double) length ); + sinValOrg = (float) sin( -2 * pi * 1. / (double) length ); + for ( i = 1; i < n1; i++ ) + { + float tmp; + twReal = 1.f; + twImag = 0.f; + tmp = cosVal * cosValOrg - sinVal * sinValOrg; + sinVal = sinVal * cosValOrg + cosVal * sinValOrg; + cosVal = tmp; + for ( ii = 1; ii < n2; ii++ ) + { + float xRe, xIm, tmpReal; + /* cos(x+y) = cos(x)*cos(y) - sin(x)*sin(y); */ + /* sin(x+y) = sin(x)*cos(y) + sin(y)*cos(x); */ + tmpReal = twReal * cosVal - twImag * sinVal; + twImag = twImag * cosVal + sinVal * twReal; + twReal = tmpReal; + xRe = x[2 * ( i * n2 + ii )]; + xIm = x[2 * ( i * n2 + ii ) + 1]; + x[2 * ( i * n2 + ii )] = twReal * xRe - twImag * xIm; + x[2 * ( i * n2 + ii ) + 1] = twImag * xRe + twReal * xIm; + } + tmp = cosVal; + } + + return; +} + +static void cooleyTukeyFFT( + float *x, + const int16_t length, + float *scratch ) +{ + int16_t factor; + int16_t i, ii; + int16_t n1, n2; + int16_t cnt = 0; + float *src, *dest; + + switch ( length ) + { + case 1: + break; + case 2: + fft2( x ); + break; + case 3: + fft3_2( x ); + break; + case 4: + fft4( x ); + break; + case 5: + fft5( x ); + break; + case 8: + fft8_2( x ); + break; + default: + { + factor = findFactor( length ); + if ( factor > 0 && ( length / factor > 1 ) ) + { + n1 = factor; + n2 = length / factor; + + /* DATA Resorting for stage1 */ + dest = scratch; + for ( i = 0; i < 2 * n1; i += 2 ) + { + src = x + i; + for ( ii = 0; ii < n2; ii++ ) + { + /* *dest++ = x[2*(i+ii*n1)]; */ + /* *dest++ = x[2*(i+ii*n1)+1]; */ + *dest++ = *src; + *dest++ = *( src + 1 ); + src += 2 * n1; + } + } + src = scratch; + dest = x; + for ( i = 0; i < length; i++ ) + { + *dest++ = *src++; + *dest++ = *src++; + } + /* perform n1 ffts of length n2 */ + for ( i = 0; i < n1; i++ ) + { + cooleyTukeyFFT( x + 2 * i * n2, n2, scratch + 2 * i * n2 ); + } + /*data twiddeling */ + twiddle( x, length, n1, n2 ); + /* DATA Resorting for stage2 */ + cnt = 0; + for ( i = 0; i < n2; i++ ) + { + for ( ii = 0; ii < n1; ii++ ) + { + scratch[2 * cnt] = x[2 * ( i + ii * n2 )]; + scratch[2 * cnt + 1] = x[2 * ( i + ii * n2 ) + 1]; + cnt++; + } + } + /* perform n2 ffts of length n1 */ + for ( i = 0; i < n2; i++ ) + { + nextFFT( scratch + 2 * i * n1, n1 ); + } + cnt = 0; + for ( i = 0; i < n1; i++ ) + { + for ( ii = 0; ii < n2; ii++ ) + { + x[2 * cnt] = scratch[2 * ( i + ii * n1 )]; + x[2 * cnt + 1] = scratch[2 * ( i + ii * n1 ) + 1]; + cnt++; + } + } + } + else + { + assert( !"length not supported" ); + } + } + } + + return; +} + +static void pfaDFT( + float *x, + const int16_t length, + float *scratch1, + const int16_t numFactors, + const int16_t *factor ) +{ + int16_t i, ii; + int16_t cnt; + + if ( numFactors > 1 ) + { + float *tmp = scratch1; + int16_t n1_inv = 1, n2_inv = 1; + int16_t n2 = factor[0 /*idx*/]; + int16_t n1 = length / n2; + int16_t idx, incr; + + while ( ( ( n1_inv * n1 ) % n2 ) != 1 ) + { + n1_inv++; + } + while ( ( ( n2_inv * n2 ) % n1 ) != 1 ) + { + n2_inv++; + } + idx = 0; + incr = n1 * n1_inv; + cnt = 0; + for ( i = 0; i < n1; i++ ) + { + for ( ii = 0; ii < n2 - 1; ii++ ) + { + tmp[cnt++] = x[2 * idx]; + tmp[cnt++] = x[2 * idx + 1]; + + idx += incr; + if ( idx > length ) + { + idx -= length; + } + } + tmp[cnt++] = x[2 * idx]; + tmp[cnt++] = x[2 * idx + 1]; + idx++; + } + for ( cnt = 0; cnt < length; cnt += n2 ) + { + cooleyTukeyFFT( tmp + 2 * cnt, n2, x + 2 * cnt ); + } + for ( cnt = 0; cnt < n1; cnt++ ) + { + for ( i = 0; i < n2; i++ ) + { + x[2 * ( cnt + i * n1 )] = tmp[2 * ( cnt * n2 + i )]; + x[2 * ( cnt + i * n1 ) + 1] = tmp[2 * ( cnt * n2 + i ) + 1]; + } + } + for ( cnt = 0; cnt < length; cnt += n1 ) + { + pfaDFT( x + 2 * cnt, n1, tmp, numFactors - 1, &factor[1] ); + } + idx = 0; + cnt = 0; + for ( i = 0; i < n2; i++ ) + { + idx = i * n1; + for ( ii = 0; ii < n1; ii++ ) + { + tmp[2 * idx] = x[cnt++]; + tmp[2 * idx + 1] = x[cnt++]; + idx += n2; + if ( idx > length ) + { + idx -= length; + } + } + } + for ( cnt = 0; cnt < length; cnt++ ) + { + x[2 * cnt] = tmp[2 * cnt]; + x[2 * cnt + 1] = tmp[2 * cnt + 1]; + } + } + else + { + cooleyTukeyFFT( x, length, scratch1 ); + } + + return; +} + +static void fftf_interleave( + float *re, + float *im, + float *out, + const int16_t len ) +{ + int16_t i = 0; + + for ( i = 0; i < len; i++ ) + { + *out++ = *re++; + *out++ = *im++; + } + + return; +} + +static void fftf_deinterleave( + float *in, + float *re, + float *im, + const int16_t len ) +{ + int16_t i = 0; + + for ( i = 0; i < len; i++ ) + { + *re++ = *in++; + *im++ = *in++; + } + + return; +} + +static void DoRTFT600( + float *x, /* i/o: real part of input and output data */ + float *y /* i/o: imaginary part of input and output data */ +) +{ + float scratch[1200], cmplx[1200]; + const int16_t factors[3] = { 25, 8, 3 }; + + fftf_interleave( x, y, cmplx, 600 ); + pfaDFT( cmplx, 600, scratch, 3, factors ); + fftf_deinterleave( cmplx, x, y, 600 ); + + return; +} + +static void DoRTFT400( + float *x, /* i/o: real part of input and output data */ + float *y /* i/o: imaginary part of input and output data */ +) +{ + float scratch[800], cmplx[800]; + const int16_t factors[2] = { 25, 16 }; + + fftf_interleave( x, y, cmplx, 400 ); + pfaDFT( cmplx, 400, scratch, 2, factors ); + fftf_deinterleave( cmplx, x, y, 400 ); + + + return; +} + +static void DoRTFT240( + float *x, /* i/o: real part of input and output data */ + float *y /* i/o: imaginary part of input and output data */ +) +{ + float scratch[480], cmplx[480]; + const int16_t factors[3] = { 16, 5, 3 }; + + fftf_interleave( x, y, cmplx, 240 ); + pfaDFT( cmplx, 240, scratch, 3, factors ); + fftf_deinterleave( cmplx, x, y, 240 ); + + return; +} + +static void DoRTFT200( + float *x, /* i/o: real part of input and output data */ + float *y /* i/o: imaginary part of input and output data */ +) +{ + float scratch[400], cmplx[400]; + const int16_t factors[2] = { 25, 8 }; + + fftf_interleave( x, y, cmplx, 200 ); + pfaDFT( cmplx, 200, scratch, 2, factors ); + fftf_deinterleave( cmplx, x, y, 200 ); + + return; +} + +static void DoRTFT100( + float *x, /* i/o: real part of input and output data */ + float *y /* i/o: imaginary part of input and output data */ +) +{ + float scratch[200], cmplx[200]; + const int16_t factors[2] = { 25, 4 }; + + fftf_interleave( x, y, cmplx, 100 ); + pfaDFT( cmplx, 100, scratch, 2, factors ); + fftf_deinterleave( cmplx, x, y, 100 ); + + return; +} + + +void DoFFT( + float *re2, + float *im2, + const int16_t length ) +{ + switch ( length ) + { + case 600: + DoRTFT600( re2, im2 ); + break; + case 480: + DoRTFT480( re2, im2 ); + break; + case 400: + DoRTFT400( re2, im2 ); + break; + case 320: + DoRTFT320( re2, im2 ); + break; + case 256: + DoRTFTn( re2, im2, 256 ); + break; + case 240: + DoRTFT240( re2, im2 ); + break; + case 200: + DoRTFT200( re2, im2 ); + break; + case 160: + DoRTFT160( re2, im2 ); + break; + case 128: + DoRTFT128( re2, im2 ); + break; + case 120: + DoRTFT120( re2, im2 ); + break; + case 100: + DoRTFT100( re2, im2 ); + break; + case 80: + DoRTFT80( re2, im2 ); + break; + case 64: + DoRTFTn( re2, im2, 64 ); + break; + case 40: + DoRTFT40( re2, im2 ); + break; + case 20: + DoRTFT20( re2, im2 ); + break; + default: + assert( !"fft is not supported!" ); + } + + return; +} + +/*-----------------------------------------------------------------* + * Low-complexity implementation of FFT + *-----------------------------------------------------------------*/ + +static void fft_len5( + float *re, + float *im, + const int16_t s ) +{ + float x0, x1, x2, x3, x4; + float r1, r2, r3, r4; + float s1, s2, s3, s4; + float t; + + x0 = re[s * 0]; + x1 = re[s * 1]; + x2 = re[s * 2]; + x3 = re[s * 3]; + x4 = re[s * 4]; + + r1 = ( x1 + x4 ); + r4 = ( x1 - x4 ); + r3 = ( x2 + x3 ); + r2 = ( x2 - x3 ); + t = ( ( r1 - r3 ) * FFT_C54 ); + r1 = ( r1 + r3 ); + re[0] = ( x0 + r1 ); + + r1 = ( re[0] + ( ( r1 * FFT_C55 ) ) ); + r3 = ( r1 - t ); + r1 = ( r1 + t ); + t = ( ( r4 + r2 ) * FFT_C51 ); + + r4 = ( t + ( r4 * FFT_C52 ) ); + r2 = ( t + ( r2 * FFT_C53 ) ); + + x0 = im[s * 0]; + x1 = im[s * 1]; + x2 = im[s * 2]; + x3 = im[s * 3]; + x4 = im[s * 4]; + + s1 = ( x1 + x4 ); + s4 = ( x1 - x4 ); + s3 = ( x2 + x3 ); + s2 = ( x2 - x3 ); + t = ( ( s1 - s3 ) * FFT_C54 ); + s1 = ( s1 + s3 ); + im[0] = ( x0 + s1 ); + + s1 = ( im[0] + ( s1 * FFT_C55 ) ); + s3 = ( s1 - t ); + s1 = ( s1 + t ); + t = ( ( s4 + s2 ) * FFT_C51 ); + + s4 = ( t + ( s4 * FFT_C52 ) ); + s2 = ( t + ( s2 * FFT_C53 ) ); + + re[s * 1] = ( r1 + s2 ); + re[s * 4] = ( r1 - s2 ); + re[s * 2] = ( r3 - s4 ); + re[s * 3] = ( r3 + s4 ); + + im[s * 1] = ( s1 - r2 ); + im[s * 4] = ( s1 + r2 ); + im[s * 2] = ( s3 + r4 ); + im[s * 3] = ( s3 - r4 ); + + return; +} + +static void fft_len8( + float *re, + float *im, + const int16_t s ) +{ + float x00, x01, x02, x03, x04, x05, x06, x07; + float x08, x09, x10, x11, x12, x13, x14, x15; + float t00, t01, t02, t03, t04, t05, t06, t07; + float t08, t09, t10, t11, t12, t13, t14, t15; + float s00, s01, s02, s03, s04, s05, s06, s07; + float s08, s09, s10, s11, s12, s13, s14, s15; + + x00 = re[s * 0]; + x01 = im[s * 0]; + x02 = re[s * 1]; + x03 = im[s * 1]; + x04 = re[s * 2]; + x05 = im[s * 2]; + x06 = re[s * 3]; + x07 = im[s * 3]; + x08 = re[s * 4]; + x09 = im[s * 4]; + x10 = re[s * 5]; + x11 = im[s * 5]; + x12 = re[s * 6]; + x13 = im[s * 6]; + x14 = re[s * 7]; + x15 = im[s * 7]; + + t00 = ( x00 + x08 ); + t02 = ( x00 - x08 ); + t01 = ( x01 + x09 ); + t03 = ( x01 - x09 ); + t04 = ( x02 + x10 ); + t06 = ( x02 - x10 ); + t05 = ( x03 + x11 ); + t07 = ( x03 - x11 ); + t08 = ( x04 + x12 ); + t10 = ( x04 - x12 ); + t09 = ( x05 + x13 ); + t11 = ( x05 - x13 ); + t12 = ( x06 + x14 ); + t14 = ( x06 - x14 ); + t13 = ( x07 + x15 ); + t15 = ( x07 - x15 ); + + s00 = ( t00 + t08 ); + s04 = ( t00 - t08 ); + s01 = ( t01 + t09 ); + s05 = ( t01 - t09 ); + s08 = ( t02 - t11 ); + s10 = ( t02 + t11 ); + s09 = ( t03 + t10 ); + s11 = ( t03 - t10 ); + s02 = ( t04 + t12 ); + s07 = ( t04 - t12 ); + s03 = ( t05 + t13 ); + s06 = ( t13 - t05 ); + + t01 = ( t06 + t14 ); + t02 = ( t06 - t14 ); + t00 = ( t07 + t15 ); + t03 = ( t07 - t15 ); + + s12 = ( ( t00 + t02 ) * FFT_C81 ); + s14 = ( ( t00 - t02 ) * FFT_C81 ); + s13 = ( ( t03 - t01 ) * FFT_C81 ); + s15 = ( ( t01 + t03 ) * FFT_C82 ); + + re[s * 0] = ( s00 + s02 ); + re[s * 4] = ( s00 - s02 ); + im[s * 0] = ( s01 + s03 ); + im[s * 4] = ( s01 - s03 ); + re[s * 2] = ( s04 - s06 ); + re[s * 6] = ( s04 + s06 ); + im[s * 2] = ( s05 - s07 ); + im[s * 6] = ( s05 + s07 ); + re[s * 3] = ( s08 + s14 ); + re[s * 7] = ( s08 - s14 ); + im[s * 3] = ( s09 + s15 ); + im[s * 7] = ( s09 - s15 ); + re[s * 1] = ( s10 + s12 ); + re[s * 5] = ( s10 - s12 ); + im[s * 1] = ( s11 + s13 ); + im[s * 5] = ( s11 - s13 ); + + return; +} + +static void fft_len10( + float *re, + float *im, + const int16_t s ) +{ + float t; + float x0, x1, x2, x3, x4; + float r1, r2, r3, r4; + float s1, s2, s3, s4; + float y00, y01, y02, y03, y04, y05, y06, y07, y08, y09; + float y10, y11, y12, y13, y14, y15, y16, y17, y18, y19; + + x0 = re[s * 0]; + x1 = re[s * 2]; + x2 = re[s * 4]; + x3 = re[s * 6]; + x4 = re[s * 8]; + + r1 = ( x3 + x2 ); + r4 = ( x3 - x2 ); + r3 = ( x1 + x4 ); + r2 = ( x1 - x4 ); + t = ( ( r1 - r3 ) * FFT_C54 ); + r1 = ( r1 + r3 ); + y00 = ( x0 + r1 ); + r1 = ( y00 + ( ( r1 * FFT_C55 ) ) ); + r3 = ( r1 - t ); + r1 = ( r1 + t ); + t = ( ( ( r4 + r2 ) ) * FFT_C51 ); + r4 = ( t + ( r4 * FFT_C52 ) ); + r2 = ( t + ( r2 * FFT_C53 ) ); + + x0 = im[s * 0]; + x1 = im[s * 2]; + x2 = im[s * 4]; + x3 = im[s * 6]; + x4 = im[s * 8]; + + s1 = ( x3 + x2 ); + s4 = ( x3 - x2 ); + s3 = ( x1 + x4 ); + s2 = ( x1 - x4 ); + t = ( ( s1 - s3 ) * FFT_C54 ); + s1 = ( s1 + s3 ); + y01 = ( x0 + s1 ); + s1 = ( y01 + ( s1 * FFT_C55 ) ); + s3 = ( s1 - t ); + s1 = ( s1 + t ); + t = ( ( s4 + s2 ) * FFT_C51 ); + s4 = ( t + ( s4 * FFT_C52 ) ); + s2 = ( t + ( s2 * FFT_C53 ) ); + + y04 = ( r1 + s2 ); + y16 = ( r1 - s2 ); + y08 = ( r3 - s4 ); + y12 = ( r3 + s4 ); + + y05 = ( s1 - r2 ); + y17 = ( s1 + r2 ); + y09 = ( s3 + r4 ); + y13 = ( s3 - r4 ); + + x0 = re[s * 5]; + x1 = re[s * 1]; + x2 = re[s * 3]; + x3 = re[s * 7]; + x4 = re[s * 9]; + + r1 = ( x1 + x4 ); + r4 = ( x1 - x4 ); + r3 = ( x3 + x2 ); + r2 = ( x3 - x2 ); + t = ( ( r1 - r3 ) * FFT_C54 ); + r1 = ( r1 + r3 ); + y02 = ( x0 + r1 ); + r1 = ( y02 + ( ( r1 * FFT_C55 ) ) ); + r3 = ( r1 - t ); + r1 = ( r1 + t ); + t = ( ( ( r4 + r2 ) ) * FFT_C51 ); + r4 = ( t + ( r4 * FFT_C52 ) ); + r2 = ( t + ( r2 * FFT_C53 ) ); + + x0 = im[s * 5]; + x1 = im[s * 1]; + x2 = im[s * 3]; + x3 = im[s * 7]; + x4 = im[s * 9]; + + s1 = ( x1 + x4 ); + s4 = ( x1 - x4 ); + s3 = ( x3 + x2 ); + s2 = ( x3 - x2 ); + t = ( ( s1 - s3 ) * FFT_C54 ); + s1 = ( s1 + s3 ); + y03 = ( x0 + s1 ); + s1 = ( y03 + ( s1 * FFT_C55 ) ); + s3 = ( s1 - t ); + s1 = ( s1 + t ); + t = ( ( s4 + s2 ) * FFT_C51 ); + s4 = ( t + ( s4 * FFT_C52 ) ); + s2 = ( t + ( s2 * FFT_C53 ) ); + + y06 = ( r1 + s2 ); + y18 = ( r1 - s2 ); + y10 = ( r3 - s4 ); + y14 = ( r3 + s4 ); + + y07 = ( s1 - r2 ); + y19 = ( s1 + r2 ); + y11 = ( s3 + r4 ); + y15 = ( s3 - r4 ); + + re[s * 0] = ( y00 + y02 ); + im[s * 0] = ( y01 + y03 ); + re[s * 5] = ( y00 - y02 ); + im[s * 5] = ( y01 - y03 ); + + re[s * 2] = ( y04 + y06 ); + im[s * 2] = ( y05 + y07 ); + re[s * 7] = ( y04 - y06 ); + im[s * 7] = ( y05 - y07 ); + + re[s * 4] = ( y08 + y10 ); + im[s * 4] = ( y09 + y11 ); + re[s * 9] = ( y08 - y10 ); + im[s * 9] = ( y09 - y11 ); + + re[s * 6] = ( y12 + y14 ); + im[s * 6] = ( y13 + y15 ); + re[s * 1] = ( y12 - y14 ); + im[s * 1] = ( y13 - y15 ); + + re[s * 8] = ( y16 + y18 ); + im[s * 8] = ( y17 + y19 ); + re[s * 3] = ( y16 - y18 ); + im[s * 3] = ( y17 - y19 ); + + return; +} + +static void fft_len15( + float *re, + float *im, + const int16_t s ) +{ + float t; + float r1, r2, r3, r4; + float s1, s2, s3, s4; + float x00, x01, x02, x03, x04, x05, x06, x07, x08, x09; + float x10, x11, x12, x13, x14, x15, x16, x17, x18, x19; + float x20, x21, x22, x23, x24, x25, x26, x27, x28, x29; + float y00, y01, y02, y03, y04, y05, y06, y07, y08, y09; + float y10, y11, y12, y13, y14, y15, y16, y17, y18, y19; + float y20, y21, y22, y23, y24, y25, y26, y27, y28, y29; + + x00 = re[s * 0]; + x01 = im[s * 0]; + x02 = re[s * 3]; + x03 = im[s * 3]; + x04 = re[s * 6]; + x05 = im[s * 6]; + x06 = re[s * 9]; + x07 = im[s * 9]; + x08 = re[s * 12]; + x09 = im[s * 12]; + + x10 = re[s * 5]; + x11 = im[s * 5]; + x12 = re[s * 8]; + x13 = im[s * 8]; + x14 = re[s * 11]; + x15 = im[s * 11]; + x16 = re[s * 14]; + x17 = im[s * 14]; + x18 = re[s * 2]; + x19 = im[s * 2]; + + x20 = re[s * 10]; + x21 = im[s * 10]; + x22 = re[s * 13]; + x23 = im[s * 13]; + x24 = re[s * 1]; + x25 = im[s * 1]; + x26 = re[s * 4]; + x27 = im[s * 4]; + x28 = re[s * 7]; + x29 = im[s * 7]; + + r1 = ( x02 + x08 ); + r4 = ( x02 - x08 ); + r3 = ( x04 + x06 ); + r2 = ( x04 - x06 ); + t = ( ( r1 - r3 ) * FFT_C54 ); + r1 = ( r1 + r3 ); + y00 = ( x00 + r1 ); + r1 = ( y00 + ( ( r1 * FFT_C55 ) ) ); + r3 = ( r1 - t ); + r1 = ( r1 + t ); + t = ( ( ( r4 + r2 ) ) * FFT_C51 ); + r4 = ( t + ( r4 * FFT_C52 ) ); + r2 = ( t + ( r2 * FFT_C53 ) ); + + s1 = ( x03 + x09 ); + s4 = ( x03 - x09 ); + s3 = ( x05 + x07 ); + s2 = ( x05 - x07 ); + t = ( ( s1 - s3 ) * FFT_C54 ); + s1 = ( s1 + s3 ); + y01 = ( x01 + s1 ); + s1 = ( y01 + ( s1 * FFT_C55 ) ); + s3 = ( s1 - t ); + s1 = ( s1 + t ); + t = ( ( s4 + s2 ) * FFT_C51 ); + s4 = ( t + ( s4 * FFT_C52 ) ); + s2 = ( t + ( s2 * FFT_C53 ) ); + + y02 = ( r1 + s2 ); + y08 = ( r1 - s2 ); + y04 = ( r3 - s4 ); + y06 = ( r3 + s4 ); + + y03 = ( s1 - r2 ); + y09 = ( s1 + r2 ); + y05 = ( s3 + r4 ); + y07 = ( s3 - r4 ); + + r1 = ( x12 + x18 ); + r4 = ( x12 - x18 ); + r3 = ( x14 + x16 ); + r2 = ( x14 - x16 ); + t = ( ( r1 - r3 ) * FFT_C54 ); + r1 = ( r1 + r3 ); + y10 = ( x10 + r1 ); + r1 = ( y10 + ( ( r1 * FFT_C55 ) ) ); + r3 = ( r1 - t ); + r1 = ( r1 + t ); + t = ( ( ( r4 + r2 ) ) * FFT_C51 ); + r4 = ( t + ( r4 * FFT_C52 ) ); + r2 = ( t + ( r2 * FFT_C53 ) ); + + s1 = ( x13 + x19 ); + s4 = ( x13 - x19 ); + s3 = ( x15 + x17 ); + s2 = ( x15 - x17 ); + t = ( ( s1 - s3 ) * FFT_C54 ); + s1 = ( s1 + s3 ); + y11 = ( x11 + s1 ); + s1 = ( y11 + ( s1 * FFT_C55 ) ); + s3 = ( s1 - t ); + s1 = ( s1 + t ); + t = ( ( s4 + s2 ) * FFT_C51 ); + s4 = ( t + ( s4 * FFT_C52 ) ); + s2 = ( t + ( s2 * FFT_C53 ) ); + + y12 = ( r1 + s2 ); + y18 = ( r1 - s2 ); + y14 = ( r3 - s4 ); + y16 = ( r3 + s4 ); + + y13 = ( s1 - r2 ); + y19 = ( s1 + r2 ); + y15 = ( s3 + r4 ); + y17 = ( s3 - r4 ); + + r1 = ( x22 + x28 ); + r4 = ( x22 - x28 ); + r3 = ( x24 + x26 ); + r2 = ( x24 - x26 ); + t = ( ( r1 - r3 ) * FFT_C54 ); + r1 = ( r1 + r3 ); + y20 = ( x20 + r1 ); + r1 = ( y20 + ( ( r1 * FFT_C55 ) ) ); + r3 = ( r1 - t ); + r1 = ( r1 + t ); + t = ( ( ( r4 + r2 ) ) * FFT_C51 ); + r4 = ( t + ( r4 * FFT_C52 ) ); + r2 = ( t + ( r2 * FFT_C53 ) ); + + s1 = ( x23 + x29 ); + s4 = ( x23 - x29 ); + s3 = ( x25 + x27 ); + s2 = ( x25 - x27 ); + t = ( ( s1 - s3 ) * FFT_C54 ); + s1 = ( s1 + s3 ); + y21 = ( x21 + s1 ); + s1 = ( y21 + ( s1 * FFT_C55 ) ); + s3 = ( s1 - t ); + s1 = ( s1 + t ); + t = ( ( s4 + s2 ) * FFT_C51 ); + s4 = ( t + ( s4 * FFT_C52 ) ); + s2 = ( t + ( s2 * FFT_C53 ) ); + + y22 = ( r1 + s2 ); + y28 = ( r1 - s2 ); + y24 = ( r3 - s4 ); + y26 = ( r3 + s4 ); + + y23 = ( s1 - r2 ); + y29 = ( s1 + r2 ); + y25 = ( s3 + r4 ); + y27 = ( s3 - r4 ); + + r1 = ( y10 + y20 ); + r2 = ( ( y10 - y20 ) * FFT_C31 ); + re[s * 0] = ( y00 + r1 ); + r1 = ( y00 - r1 * 0.5f ); + + s1 = ( y11 + y21 ); + s2 = ( ( y11 - y21 ) * FFT_C31 ); + im[s * 0] = ( y01 + s1 ); + s1 = ( y01 - s1 * 0.5f ); + + re[s * 10] = ( r1 - s2 ); + re[s * 5] = ( r1 + s2 ); + im[s * 10] = ( s1 + r2 ); + im[s * 5] = ( s1 - r2 ); + + r1 = ( y12 + y22 ); + r2 = ( ( y12 - y22 ) * FFT_C31 ); + re[s * 6] = ( y02 + r1 ); + r1 = ( y02 - r1 * 0.5f ); + + s1 = ( y13 + y23 ); + s2 = ( ( y13 - y23 ) * FFT_C31 ); + im[s * 6] = ( y03 + s1 ); + s1 = ( y03 - s1 * 0.5f ); + + re[s * 1] = ( r1 - s2 ); + re[s * 11] = ( r1 + s2 ); + im[s * 1] = ( s1 + r2 ); + im[s * 11] = ( s1 - r2 ); + + r1 = ( y14 + y24 ); + r2 = ( ( y14 - y24 ) * FFT_C31 ); + re[s * 12] = ( y04 + r1 ); + r1 = ( y04 - r1 * 0.5f ); + + s1 = ( y15 + y25 ); + s2 = ( ( y15 - y25 ) * FFT_C31 ); + im[s * 12] = ( y05 + s1 ); + s1 = ( y05 - s1 * 0.5f ); + + re[s * 7] = ( r1 - s2 ); + re[s * 2] = ( r1 + s2 ); + im[s * 7] = ( s1 + r2 ); + im[s * 2] = ( s1 - r2 ); + + r1 = ( y16 + y26 ); + r2 = ( ( y16 - y26 ) * FFT_C31 ); + re[s * 3] = ( y06 + r1 ); + r1 = ( y06 - r1 * 0.5f ); + + s1 = ( y17 + y27 ); + s2 = ( ( y17 - y27 ) * FFT_C31 ); + im[s * 3] = ( y07 + s1 ); + s1 = ( y07 - s1 * 0.5f ); + + re[s * 13] = ( r1 - s2 ); + re[s * 8] = ( r1 + s2 ); + im[s * 13] = ( s1 + r2 ); + im[s * 8] = ( s1 - r2 ); + + r1 = ( y18 + y28 ); + r2 = ( ( y18 - y28 ) * FFT_C31 ); + re[s * 9] = ( y08 + r1 ); + r1 = ( y08 - r1 * 0.5f ); + + s1 = ( y19 + y29 ); + s2 = ( ( y19 - y29 ) * FFT_C31 ); + im[s * 9] = ( y09 + s1 ); + s1 = ( y09 - s1 * 0.5f ); + + re[s * 4] = ( r1 - s2 ); + re[s * 14] = ( r1 + s2 ); + im[s * 4] = ( s1 + r2 ); + im[s * 14] = ( s1 - r2 ); + + return; +} + +static void fft_len16( + float *re, + float *im, + const int16_t s ) +{ + float x0, x1, x2, x3, x4, x5, x6, x7; + float t0, t1, t2, t3, t4, t5, t6, t7; + float y00, y01, y02, y03, y04, y05, y06, y07; + float y08, y09, y10, y11, y12, y13, y14, y15; + float y16, y17, y18, y19, y20, y21, y22, y23; + float y24, y25, y26, y27, y28, y29, y30, y31; + + x0 = re[s * 0]; + x1 = im[s * 0]; + x2 = re[s * 4]; + x3 = im[s * 4]; + x4 = re[s * 8]; + x5 = im[s * 8]; + x6 = re[s * 12]; + x7 = im[s * 12]; + + t0 = ( x0 + x4 ); + t2 = ( x0 - x4 ); + t1 = ( x1 + x5 ); + t3 = ( x1 - x5 ); + t4 = ( x2 + x6 ); + t7 = ( x2 - x6 ); + t5 = ( x7 + x3 ); + t6 = ( x7 - x3 ); + + y00 = ( t0 + t4 ); + y01 = ( t1 + t5 ); + y02 = ( t2 - t6 ); + y03 = ( t3 - t7 ); + y04 = ( t0 - t4 ); + y05 = ( t1 - t5 ); + y06 = ( t2 + t6 ); + y07 = ( t3 + t7 ); + + x0 = re[s * 1]; + x1 = im[s * 1]; + x2 = re[s * 5]; + x3 = im[s * 5]; + x4 = re[s * 9]; + x5 = im[s * 9]; + x6 = re[s * 13]; + x7 = im[s * 13]; + + t0 = ( x0 + x4 ); + t2 = ( x0 - x4 ); + t1 = ( x1 + x5 ); + t3 = ( x1 - x5 ); + t4 = ( x2 + x6 ); + t7 = ( x2 - x6 ); + t5 = ( x7 + x3 ); + t6 = ( x7 - x3 ); + + y08 = ( t0 + t4 ); + y09 = ( t1 + t5 ); + y10 = ( t2 - t6 ); + y11 = ( t3 - t7 ); + y12 = ( t0 - t4 ); + y13 = ( t1 - t5 ); + y14 = ( t2 + t6 ); + y15 = ( t3 + t7 ); + + x0 = re[s * 2]; + x1 = im[s * 2]; + x2 = re[s * 6]; + x3 = im[s * 6]; + x4 = re[s * 10]; + x5 = im[s * 10]; + x6 = re[s * 14]; + x7 = im[s * 14]; + + t0 = ( x0 + x4 ); + t2 = ( x0 - x4 ); + t1 = ( x1 + x5 ); + t3 = ( x1 - x5 ); + t4 = ( x2 + x6 ); + t7 = ( x2 - x6 ); + t5 = ( x7 + x3 ); + t6 = ( x7 - x3 ); + + y16 = ( t0 + t4 ); + y17 = ( t1 + t5 ); + y18 = ( t2 - t6 ); + y19 = ( t3 - t7 ); + y20 = ( t1 - t5 ); + y21 = ( t4 - t0 ); + y22 = ( t2 + t6 ); + y23 = ( t3 + t7 ); + + x0 = re[s * 3]; + x1 = im[s * 3]; + x2 = re[s * 7]; + x3 = im[s * 7]; + x4 = re[s * 11]; + x5 = im[s * 11]; + x6 = re[s * 15]; + x7 = im[s * 15]; + + t0 = ( x0 + x4 ); + t2 = ( x0 - x4 ); + t1 = ( x1 + x5 ); + t3 = ( x1 - x5 ); + t4 = ( x2 + x6 ); + t7 = ( x2 - x6 ); + t5 = ( x7 + x3 ); + t6 = ( x7 - x3 ); + + y24 = ( t0 + t4 ); + y25 = ( t1 + t5 ); + y26 = ( t2 - t6 ); + y27 = ( t3 - t7 ); + y28 = ( t0 - t4 ); + y29 = ( t1 - t5 ); + y30 = ( t2 + t6 ); + y31 = ( t3 + t7 ); + + x0 = ( y22 * FFT_C162 ); + x1 = ( y23 * FFT_C162 ); + y22 = ( x0 - x1 ); + y23 = ( x0 + x1 ); + + x0 = ( y28 * FFT_C162 ); + x1 = ( y29 * FFT_C162 ); + y28 = ( x0 - x1 ); + y29 = ( x0 + x1 ); + + x0 = ( y12 * FFT_C161 ); + x1 = ( y13 * FFT_C161 ); + y12 = ( x0 + x1 ); + y13 = ( x1 - x0 ); + + x0 = ( y18 * FFT_C161 ); + x1 = ( y19 * FFT_C161 ); + y18 = ( x0 + x1 ); + y19 = ( x1 - x0 ); + + x0 = ( y10 * FFT_C163 ); + x1 = ( y11 * FFT_C166 ); + x2 = ( y10 * FFT_C166 ); + x3 = ( y11 * FFT_C163 ); + y10 = ( x0 - x1 ); + y11 = ( x2 + x3 ); + + x0 = ( y14 * FFT_C165 ); + x1 = ( y15 * FFT_C164 ); + x2 = ( y14 * FFT_C164 ); + x3 = ( y15 * FFT_C165 ); + y14 = ( x0 - x1 ); + y15 = ( x2 + x3 ); + + x0 = ( y26 * FFT_C165 ); + x1 = ( y27 * FFT_C164 ); + x2 = ( y26 * FFT_C164 ); + x3 = ( y27 * FFT_C165 ); + y26 = ( x0 - x1 ); + y27 = ( x2 + x3 ); + + x0 = ( y30 * FFT_C164 ); + x1 = ( y31 * FFT_C165 ); + x2 = ( y30 * FFT_C165 ); + x3 = ( y31 * FFT_C164 ); + y30 = ( x0 - x1 ); + y31 = ( x2 + x3 ); + + t0 = ( y00 + y16 ); + t2 = ( y00 - y16 ); + t1 = ( y01 + y17 ); + t3 = ( y01 - y17 ); + t4 = ( y08 + y24 ); + t7 = ( y08 - y24 ); + t5 = ( y25 + y09 ); + t6 = ( y25 - y09 ); + + re[s * 0] = ( t0 + t4 ); + im[s * 0] = ( t1 + t5 ); + re[s * 4] = ( t2 - t6 ); + im[s * 4] = ( t3 - t7 ); + re[s * 8] = ( t0 - t4 ); + im[s * 8] = ( t1 - t5 ); + re[s * 12] = ( t2 + t6 ); + im[s * 12] = ( t3 + t7 ); + + t0 = ( y02 + y18 ); + t2 = ( y02 - y18 ); + t1 = ( y03 + y19 ); + t3 = ( y03 - y19 ); + t4 = ( y10 + y26 ); + t7 = ( y10 - y26 ); + t5 = ( y27 + y11 ); + t6 = ( y27 - y11 ); + + re[s * 1] = ( t0 + t4 ); + im[s * 1] = ( t1 + t5 ); + re[s * 5] = ( t2 - t6 ); + im[s * 5] = ( t3 - t7 ); + re[s * 9] = ( t0 - t4 ); + im[s * 9] = ( t1 - t5 ); + re[s * 13] = ( t2 + t6 ); + im[s * 13] = ( t3 + t7 ); + + t0 = ( y04 + y20 ); + t2 = ( y04 - y20 ); + t1 = ( y05 + y21 ); + t3 = ( y05 - y21 ); + t4 = ( y12 + y28 ); + t7 = ( y12 - y28 ); + t5 = ( y29 + y13 ); + t6 = ( y29 - y13 ); + + re[s * 2] = ( t0 + t4 ); + im[s * 2] = ( t1 + t5 ); + re[s * 6] = ( t2 - t6 ); + im[s * 6] = ( t3 - t7 ); + re[s * 10] = ( t0 - t4 ); + im[s * 10] = ( t1 - t5 ); + re[s * 14] = ( t2 + t6 ); + im[s * 14] = ( t3 + t7 ); + + t0 = ( y06 + y22 ); + t2 = ( y06 - y22 ); + t1 = ( y07 + y23 ); + t3 = ( y07 - y23 ); + t4 = ( y14 + y30 ); + t7 = ( y14 - y30 ); + t5 = ( y31 + y15 ); + t6 = ( y31 - y15 ); + + re[s * 3] = ( t0 + t4 ); + im[s * 3] = ( t1 + t5 ); + re[s * 7] = ( t2 - t6 ); + im[s * 7] = ( t3 - t7 ); + re[s * 11] = ( t0 - t4 ); + im[s * 11] = ( t1 - t5 ); + re[s * 15] = ( t2 + t6 ); + im[s * 15] = ( t3 + t7 ); + + return; +} + +static void fft_len20( + float *re, + float *im, + const int16_t s ) +{ + float r1, r2, r3, r4; + float s1, s2, s3, s4; + float x0, x1, x2, x3, x4; + float t, t0, t1, t2, t3, t4, t5, t6, t7; + float y00, y01, y02, y03, y04, y05, y06, y07, y08, y09; + float y10, y11, y12, y13, y14, y15, y16, y17, y18, y19; + float y20, y21, y22, y23, y24, y25, y26, y27, y28, y29; + float y30, y31, y32, y33, y34, y35, y36, y37, y38, y39; + + x0 = re[s * 0]; + x1 = re[s * 16]; + x2 = re[s * 12]; + x3 = re[s * 8]; + x4 = re[s * 4]; + + r1 = ( x1 + x4 ); + r4 = ( x1 - x4 ); + r3 = ( x2 + x3 ); + r2 = ( x2 - x3 ); + t = ( ( r1 - r3 ) * FFT_C54 ); + r1 = ( r1 + r3 ); + y00 = ( x0 + r1 ); + r1 = ( y00 + ( ( r1 * FFT_C55 ) ) ); + r3 = ( r1 - t ); + r1 = ( r1 + t ); + t = ( ( ( r4 + r2 ) ) * FFT_C51 ); + r4 = ( t + ( r4 * FFT_C52 ) ); + r2 = ( t + ( r2 * FFT_C53 ) ); + + x0 = im[s * 0]; + x1 = im[s * 16]; + x2 = im[s * 12]; + x3 = im[s * 8]; + x4 = im[s * 4]; + + s1 = ( x1 + x4 ); + s4 = ( x1 - x4 ); + s3 = ( x2 + x3 ); + s2 = ( x2 - x3 ); + t = ( ( s1 - s3 ) * FFT_C54 ); + s1 = ( s1 + s3 ); + y01 = ( x0 + s1 ); + s1 = ( y01 + ( s1 * FFT_C55 ) ); + s3 = ( s1 - t ); + s1 = ( s1 + t ); + t = ( ( s4 + s2 ) * FFT_C51 ); + s4 = ( t + ( s4 * FFT_C52 ) ); + s2 = ( t + ( s2 * FFT_C53 ) ); + + y08 = ( r1 + s2 ); + y32 = ( r1 - s2 ); + y16 = ( r3 - s4 ); + y24 = ( r3 + s4 ); + + y09 = ( s1 - r2 ); + y33 = ( s1 + r2 ); + y17 = ( s3 + r4 ); + y25 = ( s3 - r4 ); + + x0 = re[s * 5]; + x1 = re[s * 1]; + x2 = re[s * 17]; + x3 = re[s * 13]; + x4 = re[s * 9]; + + r1 = ( x1 + x4 ); + r4 = ( x1 - x4 ); + r3 = ( x2 + x3 ); + r2 = ( x2 - x3 ); + t = ( ( r1 - r3 ) * FFT_C54 ); + r1 = ( r1 + r3 ); + y02 = ( x0 + r1 ); + r1 = ( y02 + ( ( r1 * FFT_C55 ) ) ); + r3 = ( r1 - t ); + r1 = ( r1 + t ); + t = ( ( ( r4 + r2 ) ) * FFT_C51 ); + r4 = ( t + ( r4 * FFT_C52 ) ); + r2 = ( t + ( r2 * FFT_C53 ) ); + + x0 = im[s * 5]; + x1 = im[s * 1]; + x2 = im[s * 17]; + x3 = im[s * 13]; + x4 = im[s * 9]; + + s1 = ( x1 + x4 ); + s4 = ( x1 - x4 ); + s3 = ( x2 + x3 ); + s2 = ( x2 - x3 ); + t = ( ( s1 - s3 ) * FFT_C54 ); + s1 = ( s1 + s3 ); + y03 = ( x0 + s1 ); + s1 = ( y03 + ( s1 * FFT_C55 ) ); + s3 = ( s1 - t ); + s1 = ( s1 + t ); + t = ( ( s4 + s2 ) * FFT_C51 ); + s4 = ( t + ( s4 * FFT_C52 ) ); + s2 = ( t + ( s2 * FFT_C53 ) ); + + y10 = ( r1 + s2 ); + y34 = ( r1 - s2 ); + y18 = ( r3 - s4 ); + y26 = ( r3 + s4 ); + + y11 = ( s1 - r2 ); + y35 = ( s1 + r2 ); + y19 = ( s3 + r4 ); + y27 = ( s3 - r4 ); + + x0 = re[s * 10]; + x1 = re[s * 6]; + x2 = re[s * 2]; + x3 = re[s * 18]; + x4 = re[s * 14]; + + r1 = ( x1 + x4 ); + r4 = ( x1 - x4 ); + r3 = ( x2 + x3 ); + r2 = ( x2 - x3 ); + t = ( ( r1 - r3 ) * FFT_C54 ); + r1 = ( r1 + r3 ); + y04 = ( x0 + r1 ); + r1 = ( y04 + ( ( r1 * FFT_C55 ) ) ); + r3 = ( r1 - t ); + r1 = ( r1 + t ); + t = ( ( ( r4 + r2 ) ) * FFT_C51 ); + r4 = ( t + ( r4 * FFT_C52 ) ); + r2 = ( t + ( r2 * FFT_C53 ) ); + + x0 = im[s * 10]; + x1 = im[s * 6]; + x2 = im[s * 2]; + x3 = im[s * 18]; + x4 = im[s * 14]; + + s1 = ( x1 + x4 ); + s4 = ( x1 - x4 ); + s3 = ( x2 + x3 ); + s2 = ( x2 - x3 ); + t = ( ( s1 - s3 ) * FFT_C54 ); + s1 = ( s1 + s3 ); + y05 = ( x0 + s1 ); + s1 = ( y05 + ( s1 * FFT_C55 ) ); + s3 = ( s1 - t ); + s1 = ( s1 + t ); + t = ( ( s4 + s2 ) * FFT_C51 ); + s4 = ( t + ( s4 * FFT_C52 ) ); + s2 = ( t + ( s2 * FFT_C53 ) ); + + y12 = ( r1 + s2 ); + y36 = ( r1 - s2 ); + y20 = ( r3 - s4 ); + y28 = ( r3 + s4 ); + + y13 = ( s1 - r2 ); + y37 = ( s1 + r2 ); + y21 = ( s3 + r4 ); + y29 = ( s3 - r4 ); + + x0 = re[s * 15]; + x1 = re[s * 11]; + x2 = re[s * 7]; + x3 = re[s * 3]; + x4 = re[s * 19]; + + r1 = ( x1 + x4 ); + r4 = ( x1 - x4 ); + r3 = ( x2 + x3 ); + r2 = ( x2 - x3 ); + t = ( ( r1 - r3 ) * FFT_C54 ); + r1 = ( r1 + r3 ); + y06 = ( x0 + r1 ); + r1 = ( y06 + ( ( r1 * FFT_C55 ) ) ); + r3 = ( r1 - t ); + r1 = ( r1 + t ); + t = ( ( ( r4 + r2 ) ) * FFT_C51 ); + r4 = ( t + ( r4 * FFT_C52 ) ); + r2 = ( t + ( r2 * FFT_C53 ) ); + + x0 = im[s * 15]; + x1 = im[s * 11]; + x2 = im[s * 7]; + x3 = im[s * 3]; + x4 = im[s * 19]; + + s1 = ( x1 + x4 ); + s4 = ( x1 - x4 ); + s3 = ( x2 + x3 ); + s2 = ( x2 - x3 ); + t = ( ( s1 - s3 ) * FFT_C54 ); + s1 = ( s1 + s3 ); + y07 = ( x0 + s1 ); + s1 = ( y07 + ( s1 * FFT_C55 ) ); + s3 = ( s1 - t ); + s1 = ( s1 + t ); + t = ( ( s4 + s2 ) * FFT_C51 ); + s4 = ( t + ( s4 * FFT_C52 ) ); + s2 = ( t + ( s2 * FFT_C53 ) ); + + y14 = ( r1 + s2 ); + y38 = ( r1 - s2 ); + y22 = ( r3 - s4 ); + y30 = ( r3 + s4 ); + + y15 = ( s1 - r2 ); + y39 = ( s1 + r2 ); + y23 = ( s3 + r4 ); + y31 = ( s3 - r4 ); + + t0 = ( y00 + y04 ); + t2 = ( y00 - y04 ); + t1 = ( y01 + y05 ); + t3 = ( y01 - y05 ); + t4 = ( y02 + y06 ); + t7 = ( y02 - y06 ); + t5 = ( y07 + y03 ); + t6 = ( y07 - y03 ); + + re[s * 0] = ( t0 + t4 ); + im[s * 0] = ( t1 + t5 ); + re[s * 5] = ( t2 - t6 ); + im[s * 5] = ( t3 - t7 ); + re[s * 10] = ( t0 - t4 ); + im[s * 10] = ( t1 - t5 ); + re[s * 15] = ( t2 + t6 ); + im[s * 15] = ( t3 + t7 ); + + t0 = ( y08 + y12 ); + t2 = ( y08 - y12 ); + t1 = ( y09 + y13 ); + t3 = ( y09 - y13 ); + t4 = ( y10 + y14 ); + t7 = ( y10 - y14 ); + t5 = ( y15 + y11 ); + t6 = ( y15 - y11 ); + + re[s * 4] = ( t0 + t4 ); + im[s * 4] = ( t1 + t5 ); + re[s * 9] = ( t2 - t6 ); + im[s * 9] = ( t3 - t7 ); + re[s * 14] = ( t0 - t4 ); + im[s * 14] = ( t1 - t5 ); + re[s * 19] = ( t2 + t6 ); + im[s * 19] = ( t3 + t7 ); + + t0 = ( y16 + y20 ); + t2 = ( y16 - y20 ); + t1 = ( y17 + y21 ); + t3 = ( y17 - y21 ); + t4 = ( y18 + y22 ); + t7 = ( y18 - y22 ); + t5 = ( y23 + y19 ); + t6 = ( y23 - y19 ); + + re[s * 8] = ( t0 + t4 ); + im[s * 8] = ( t1 + t5 ); + re[s * 13] = ( t2 - t6 ); + im[s * 13] = ( t3 - t7 ); + re[s * 18] = ( t0 - t4 ); + im[s * 18] = ( t1 - t5 ); + re[s * 3] = ( t2 + t6 ); + im[s * 3] = ( t3 + t7 ); + + t0 = ( y24 + y28 ); + t2 = ( y24 - y28 ); + t1 = ( y25 + y29 ); + t3 = ( y25 - y29 ); + t4 = ( y26 + y30 ); + t7 = ( y26 - y30 ); + t5 = ( y31 + y27 ); + t6 = ( y31 - y27 ); + + re[s * 12] = ( t0 + t4 ); + im[s * 12] = ( t1 + t5 ); + re[s * 17] = ( t2 - t6 ); + im[s * 17] = ( t3 - t7 ); + re[s * 2] = ( t0 - t4 ); + im[s * 2] = ( t1 - t5 ); + re[s * 7] = ( t2 + t6 ); + im[s * 7] = ( t3 + t7 ); + + t0 = ( y32 + y36 ); + t2 = ( y32 - y36 ); + t1 = ( y33 + y37 ); + t3 = ( y33 - y37 ); + t4 = ( y34 + y38 ); + t7 = ( y34 - y38 ); + t5 = ( y39 + y35 ); + t6 = ( y39 - y35 ); + + re[s * 16] = ( t0 + t4 ); + im[s * 16] = ( t1 + t5 ); + re[s * 1] = ( t2 - t6 ); + im[s * 1] = ( t3 - t7 ); + re[s * 6] = ( t0 - t4 ); + im[s * 6] = ( t1 - t5 ); + re[s * 11] = ( t2 + t6 ); + im[s * 11] = ( t3 + t7 ); + + return; +} + +static void fft_len30( + float *re, + float *im, + const int16_t s ) +{ + float t; + float r1, r2, r3, r4; + float s1, s2, s3, s4; + float x00, x01, x02, x03, x04, x05, x06, x07, x08, x09; + float x10, x11, x12, x13, x14, x15, x16, x17, x18, x19; + float x20, x21, x22, x23, x24, x25, x26, x27, x28, x29; + + float y00, y01, y02, y03, y04, y05, y06, y07, y08, y09; + float y10, y11, y12, y13, y14, y15, y16, y17, y18, y19; + float y20, y21, y22, y23, y24, y25, y26, y27, y28, y29; + + float z00, z01, z02, z03, z04, z05, z06, z07, z08, z09; + float z10, z11, z12, z13, z14, z15, z16, z17, z18, z19; + float z20, z21, z22, z23, z24, z25, z26, z27, z28, z29; + float z30, z31, z32, z33, z34, z35, z36, z37, z38, z39; + float z40, z41, z42, z43, z44, z45, z46, z47, z48, z49; + float z50, z51, z52, z53, z54, z55, z56, z57, z58, z59; + + float *rel, *reh, *iml, *imh; + + rel = &re[s * 0]; + reh = &re[s * 15]; + iml = &im[s * 0]; + imh = &im[s * 15]; + + x00 = re[s * 0]; + x01 = im[s * 0]; + x02 = re[s * 18]; + x03 = im[s * 18]; + x04 = re[s * 6]; + x05 = im[s * 6]; + x06 = re[s * 24]; + x07 = im[s * 24]; + x08 = re[s * 12]; + x09 = im[s * 12]; + + x10 = re[s * 20]; + x11 = im[s * 20]; + x12 = re[s * 8]; + x13 = im[s * 8]; + x14 = re[s * 26]; + x15 = im[s * 26]; + x16 = re[s * 14]; + x17 = im[s * 14]; + x18 = re[s * 2]; + x19 = im[s * 2]; + + x20 = re[s * 10]; + x21 = im[s * 10]; + x22 = re[s * 28]; + x23 = im[s * 28]; + x24 = re[s * 16]; + x25 = im[s * 16]; + x26 = re[s * 4]; + x27 = im[s * 4]; + x28 = re[s * 22]; + x29 = im[s * 22]; + + r1 = ( x02 + x08 ); + r4 = ( x02 - x08 ); + r3 = ( x04 + x06 ); + r2 = ( x04 - x06 ); + t = ( ( r1 - r3 ) * FFT_C54 ); + r1 = ( r1 + r3 ); + y00 = ( x00 + r1 ); + r1 = ( y00 + ( ( r1 * FFT_C55 ) ) ); + r3 = ( r1 - t ); + r1 = ( r1 + t ); + t = ( ( ( r4 + r2 ) ) * FFT_C51 ); + r4 = ( t + ( r4 * FFT_C52 ) ); + r2 = ( t + ( r2 * FFT_C53 ) ); + + s1 = ( x03 + x09 ); + s4 = ( x03 - x09 ); + s3 = ( x05 + x07 ); + s2 = ( x05 - x07 ); + t = ( ( s1 - s3 ) * FFT_C54 ); + s1 = ( s1 + s3 ); + y01 = ( x01 + s1 ); + s1 = ( y01 + ( s1 * FFT_C55 ) ); + s3 = ( s1 - t ); + s1 = ( s1 + t ); + t = ( ( s4 + s2 ) * FFT_C51 ); + s4 = ( t + ( s4 * FFT_C52 ) ); + s2 = ( t + ( s2 * FFT_C53 ) ); + + y02 = ( r1 + s2 ); + y08 = ( r1 - s2 ); + y04 = ( r3 - s4 ); + y06 = ( r3 + s4 ); + + y03 = ( s1 - r2 ); + y09 = ( s1 + r2 ); + y05 = ( s3 + r4 ); + y07 = ( s3 - r4 ); + + r1 = ( x12 + x18 ); + r4 = ( x12 - x18 ); + r3 = ( x14 + x16 ); + r2 = ( x14 - x16 ); + t = ( ( r1 - r3 ) * FFT_C54 ); + r1 = ( r1 + r3 ); + y10 = ( x10 + r1 ); + r1 = ( y10 + ( ( r1 * FFT_C55 ) ) ); + r3 = ( r1 - t ); + r1 = ( r1 + t ); + t = ( ( ( r4 + r2 ) ) * FFT_C51 ); + r4 = ( t + ( r4 * FFT_C52 ) ); + r2 = ( t + ( r2 * FFT_C53 ) ); + + s1 = ( x13 + x19 ); + s4 = ( x13 - x19 ); + s3 = ( x15 + x17 ); + s2 = ( x15 - x17 ); + t = ( ( s1 - s3 ) * FFT_C54 ); + s1 = ( s1 + s3 ); + y11 = ( x11 + s1 ); + s1 = ( y11 + ( s1 * FFT_C55 ) ); + s3 = ( s1 - t ); + s1 = ( s1 + t ); + t = ( ( s4 + s2 ) * FFT_C51 ); + s4 = ( t + ( s4 * FFT_C52 ) ); + s2 = ( t + ( s2 * FFT_C53 ) ); + + y12 = ( r1 + s2 ); + y18 = ( r1 - s2 ); + y14 = ( r3 - s4 ); + y16 = ( r3 + s4 ); + + y13 = ( s1 - r2 ); + y19 = ( s1 + r2 ); + y15 = ( s3 + r4 ); + y17 = ( s3 - r4 ); + + r1 = ( x22 + x28 ); + r4 = ( x22 - x28 ); + r3 = ( x24 + x26 ); + r2 = ( x24 - x26 ); + t = ( ( r1 - r3 ) * FFT_C54 ); + r1 = ( r1 + r3 ); + y20 = ( x20 + r1 ); + r1 = ( y20 + ( ( r1 * FFT_C55 ) ) ); + r3 = ( r1 - t ); + r1 = ( r1 + t ); + t = ( ( ( r4 + r2 ) ) * FFT_C51 ); + r4 = ( t + ( r4 * FFT_C52 ) ); + r2 = ( t + ( r2 * FFT_C53 ) ); + + s1 = ( x23 + x29 ); + s4 = ( x23 - x29 ); + s3 = ( x25 + x27 ); + s2 = ( x25 - x27 ); + t = ( ( s1 - s3 ) * FFT_C54 ); + s1 = ( s1 + s3 ); + y21 = ( x21 + s1 ); + s1 = ( y21 + ( s1 * FFT_C55 ) ); + s3 = ( s1 - t ); + s1 = ( s1 + t ); + t = ( ( s4 + s2 ) * FFT_C51 ); + s4 = ( t + ( s4 * FFT_C52 ) ); + s2 = ( t + ( s2 * FFT_C53 ) ); + + y22 = ( r1 + s2 ); + y28 = ( r1 - s2 ); + y24 = ( r3 - s4 ); + y26 = ( r3 + s4 ); + + y23 = ( s1 - r2 ); + y29 = ( s1 + r2 ); + y25 = ( s3 + r4 ); + y27 = ( s3 - r4 ); + + r1 = ( y10 + y20 ); + r2 = ( ( y10 - y20 ) * FFT_C31 ); + z00 = ( y00 + r1 ); + r1 = ( y00 - r1 * 0.5f ); + + s1 = ( y11 + y21 ); + s2 = ( ( y11 - y21 ) * FFT_C31 ); + z01 = ( y01 + s1 ); + s1 = ( y01 - s1 * 0.5f ); + + z20 = ( r1 - s2 ); + z10 = ( r1 + s2 ); + z21 = ( s1 + r2 ); + z11 = ( s1 - r2 ); + + r1 = ( y12 + y22 ); + r2 = ( ( y12 - y22 ) * FFT_C31 ); + z12 = ( y02 + r1 ); + r1 = ( y02 - r1 * 0.5f ); + + s1 = ( y13 + y23 ); + s2 = ( ( y13 - y23 ) * FFT_C31 ); + z13 = ( y03 + s1 ); + s1 = ( y03 - s1 * 0.5f ); + + z02 = ( r1 - s2 ); + z22 = ( r1 + s2 ); + z03 = ( s1 + r2 ); + z23 = ( s1 - r2 ); + + r1 = ( y14 + y24 ); + r2 = ( ( y14 - y24 ) * FFT_C31 ); + z24 = ( y04 + r1 ); + r1 = ( y04 - r1 * 0.5f ); + + s1 = ( y15 + y25 ); + s2 = ( ( y15 - y25 ) * FFT_C31 ); + z25 = ( y05 + s1 ); + s1 = ( y05 - s1 * 0.5f ); + + z14 = ( r1 - s2 ); + z04 = ( r1 + s2 ); + z15 = ( s1 + r2 ); + z05 = ( s1 - r2 ); + + r1 = ( y16 + y26 ); + r2 = ( ( y16 - y26 ) * FFT_C31 ); + z06 = ( y06 + r1 ); + r1 = ( y06 - r1 * 0.5f ); + + s1 = ( y17 + y27 ); + s2 = ( ( y17 - y27 ) * FFT_C31 ); + z07 = ( y07 + s1 ); + s1 = ( y07 - s1 * 0.5f ); + + z26 = ( r1 - s2 ); + z16 = ( r1 + s2 ); + z27 = ( s1 + r2 ); + z17 = ( s1 - r2 ); + + r1 = ( y18 + y28 ); + r2 = ( ( y18 - y28 ) * FFT_C31 ); + z18 = ( y08 + r1 ); + r1 = ( y08 - r1 * 0.5f ); + + s1 = ( y19 + y29 ); + s2 = ( ( y19 - y29 ) * FFT_C31 ); + z19 = ( y09 + s1 ); + s1 = ( y09 - s1 * 0.5f ); + + z08 = ( r1 - s2 ); + z28 = ( r1 + s2 ); + z09 = ( s1 + r2 ); + z29 = ( s1 - r2 ); + + x00 = re[s * 15]; + x01 = im[s * 15]; + x02 = re[s * 3]; + x03 = im[s * 3]; + x04 = re[s * 21]; + x05 = im[s * 21]; + x06 = re[s * 9]; + x07 = im[s * 9]; + x08 = re[s * 27]; + x09 = im[s * 27]; + + x10 = re[s * 5]; + x11 = im[s * 5]; + x12 = re[s * 23]; + x13 = im[s * 23]; + x14 = re[s * 11]; + x15 = im[s * 11]; + x16 = re[s * 29]; + x17 = im[s * 29]; + x18 = re[s * 17]; + x19 = im[s * 17]; + + x20 = re[s * 25]; + x21 = im[s * 25]; + x22 = re[s * 13]; + x23 = im[s * 13]; + x24 = re[s * 1]; + x25 = im[s * 1]; + x26 = re[s * 19]; + x27 = im[s * 19]; + x28 = re[s * 7]; + x29 = im[s * 7]; + + r1 = ( x02 + x08 ); + r4 = ( x02 - x08 ); + r3 = ( x04 + x06 ); + r2 = ( x04 - x06 ); + t = ( ( r1 - r3 ) * FFT_C54 ); + r1 = ( r1 + r3 ); + y00 = ( x00 + r1 ); + r1 = ( y00 + ( ( r1 * FFT_C55 ) ) ); + r3 = ( r1 - t ); + r1 = ( r1 + t ); + t = ( ( ( r4 + r2 ) ) * FFT_C51 ); + r4 = ( t + ( r4 * FFT_C52 ) ); + r2 = ( t + ( r2 * FFT_C53 ) ); + + s1 = ( x03 + x09 ); + s4 = ( x03 - x09 ); + s3 = ( x05 + x07 ); + s2 = ( x05 - x07 ); + t = ( ( s1 - s3 ) * FFT_C54 ); + s1 = ( s1 + s3 ); + y01 = ( x01 + s1 ); + s1 = ( y01 + ( s1 * FFT_C55 ) ); + s3 = ( s1 - t ); + s1 = ( s1 + t ); + t = ( ( s4 + s2 ) * FFT_C51 ); + s4 = ( t + ( s4 * FFT_C52 ) ); + s2 = ( t + ( s2 * FFT_C53 ) ); + + y02 = ( r1 + s2 ); + y08 = ( r1 - s2 ); + y04 = ( r3 - s4 ); + y06 = ( r3 + s4 ); + + y03 = ( s1 - r2 ); + y09 = ( s1 + r2 ); + y05 = ( s3 + r4 ); + y07 = ( s3 - r4 ); + + r1 = ( x12 + x18 ); + r4 = ( x12 - x18 ); + r3 = ( x14 + x16 ); + r2 = ( x14 - x16 ); + t = ( ( r1 - r3 ) * FFT_C54 ); + r1 = ( r1 + r3 ); + y10 = ( x10 + r1 ); + r1 = ( y10 + ( ( r1 * FFT_C55 ) ) ); + r3 = ( r1 - t ); + r1 = ( r1 + t ); + t = ( ( ( r4 + r2 ) ) * FFT_C51 ); + r4 = ( t + ( r4 * FFT_C52 ) ); + r2 = ( t + ( r2 * FFT_C53 ) ); + + s1 = ( x13 + x19 ); + s4 = ( x13 - x19 ); + s3 = ( x15 + x17 ); + s2 = ( x15 - x17 ); + t = ( ( s1 - s3 ) * FFT_C54 ); + s1 = ( s1 + s3 ); + y11 = ( x11 + s1 ); + s1 = ( y11 + ( s1 * FFT_C55 ) ); + s3 = ( s1 - t ); + s1 = ( s1 + t ); + t = ( ( s4 + s2 ) * FFT_C51 ); + s4 = ( t + ( s4 * FFT_C52 ) ); + s2 = ( t + ( s2 * FFT_C53 ) ); + + y12 = ( r1 + s2 ); + y18 = ( r1 - s2 ); + y14 = ( r3 - s4 ); + y16 = ( r3 + s4 ); + + y13 = ( s1 - r2 ); + y19 = ( s1 + r2 ); + y15 = ( s3 + r4 ); + y17 = ( s3 - r4 ); + + r1 = ( x22 + x28 ); + r4 = ( x22 - x28 ); + r3 = ( x24 + x26 ); + r2 = ( x24 - x26 ); + t = ( ( r1 - r3 ) * FFT_C54 ); + r1 = ( r1 + r3 ); + y20 = ( x20 + r1 ); + r1 = ( y20 + ( ( r1 * FFT_C55 ) ) ); + r3 = ( r1 - t ); + r1 = ( r1 + t ); + t = ( ( ( r4 + r2 ) ) * FFT_C51 ); + r4 = ( t + ( r4 * FFT_C52 ) ); + r2 = ( t + ( r2 * FFT_C53 ) ); + + s1 = ( x23 + x29 ); + s4 = ( x23 - x29 ); + s3 = ( x25 + x27 ); + s2 = ( x25 - x27 ); + t = ( ( s1 - s3 ) * FFT_C54 ); + s1 = ( s1 + s3 ); + y21 = ( x21 + s1 ); + s1 = ( y21 + ( s1 * FFT_C55 ) ); + s3 = ( s1 - t ); + s1 = ( s1 + t ); + t = ( ( s4 + s2 ) * FFT_C51 ); + s4 = ( t + ( s4 * FFT_C52 ) ); + s2 = ( t + ( s2 * FFT_C53 ) ); + + y22 = ( r1 + s2 ); + y28 = ( r1 - s2 ); + y24 = ( r3 - s4 ); + y26 = ( r3 + s4 ); + + y23 = ( s1 - r2 ); + y29 = ( s1 + r2 ); + y25 = ( s3 + r4 ); + y27 = ( s3 - r4 ); + + r1 = ( y10 + y20 ); + r2 = ( ( y10 - y20 ) * FFT_C31 ); + z30 = ( y00 + r1 ); + r1 = ( y00 - r1 * 0.5f ); + + s1 = ( y11 + y21 ); + s2 = ( ( y11 - y21 ) * FFT_C31 ); + z31 = ( y01 + s1 ); + s1 = ( y01 - s1 * 0.5f ); + + z50 = ( r1 - s2 ); + z40 = ( r1 + s2 ); + z51 = ( s1 + r2 ); + z41 = ( s1 - r2 ); + + r1 = ( y12 + y22 ); + r2 = ( ( y12 - y22 ) * FFT_C31 ); + z42 = ( y02 + r1 ); + r1 = ( y02 - r1 * 0.5f ); + + s1 = ( y13 + y23 ); + s2 = ( ( y13 - y23 ) * FFT_C31 ); + z43 = ( y03 + s1 ); + s1 = ( y03 - s1 * 0.5f ); + + z32 = ( r1 - s2 ); + z52 = ( r1 + s2 ); + z33 = ( s1 + r2 ); + z53 = ( s1 - r2 ); + + r1 = ( y14 + y24 ); + r2 = ( ( y14 - y24 ) * FFT_C31 ); + z54 = ( y04 + r1 ); + r1 = ( y04 - r1 * 0.5f ); + + s1 = ( y15 + y25 ); + s2 = ( ( y15 - y25 ) * FFT_C31 ); + z55 = ( y05 + s1 ); + s1 = ( y05 - s1 * 0.5f ); + + z44 = ( r1 - s2 ); + z34 = ( r1 + s2 ); + z45 = ( s1 + r2 ); + z35 = ( s1 - r2 ); + + r1 = ( y16 + y26 ); + r2 = ( ( y16 - y26 ) * FFT_C31 ); + z36 = ( y06 + r1 ); + r1 = ( y06 - r1 * 0.5f ); + + s1 = ( y17 + y27 ); + s2 = ( ( y17 - y27 ) * FFT_C31 ); + z37 = ( y07 + s1 ); + s1 = ( y07 - s1 * 0.5f ); + + z56 = ( r1 - s2 ); + z46 = ( r1 + s2 ); + z57 = ( s1 + r2 ); + z47 = ( s1 - r2 ); + + r1 = ( y18 + y28 ); + r2 = ( ( y18 - y28 ) * FFT_C31 ); + z48 = ( y08 + r1 ); + r1 = ( y08 - r1 * 0.5f ); + + s1 = ( y19 + y29 ); + s2 = ( ( y19 - y29 ) * FFT_C31 ); + z49 = ( y09 + s1 ); + s1 = ( y09 - s1 * 0.5f ); + + z38 = ( r1 - s2 ); + z58 = ( r1 + s2 ); + z39 = ( s1 + r2 ); + z59 = ( s1 - r2 ); + + r1 = z00; + r2 = z30; + r3 = z01; + r4 = z31; + *rel = ( r1 + r2 ); + *reh = ( r1 - r2 ); + *iml = ( r3 + r4 ); + *imh = ( r3 - r4 ); + rel += s, reh += s, iml += s; + imh += s; + + r1 = z16; + r2 = z46; + r3 = z17; + r4 = z47; + *reh = ( r1 + r2 ); + *rel = ( r1 - r2 ); + *imh = ( r3 + r4 ); + *iml = ( r3 - r4 ); + rel += s, reh += s, iml += s; + imh += s; + + r1 = z02; + r2 = z32; + r3 = z03; + r4 = z33; + *rel = ( r1 + r2 ); + *reh = ( r1 - r2 ); + *iml = ( r3 + r4 ); + *imh = ( r3 - r4 ); + rel += s, reh += s, iml += s; + imh += s; + + r1 = z18; + r2 = z48; + r3 = z19; + r4 = z49; + *reh = ( r1 + r2 ); + *rel = ( r1 - r2 ); + *imh = ( r3 + r4 ); + *iml = ( r3 - r4 ); + rel += s, reh += s, iml += s; + imh += s; + + r1 = z04; + r2 = z34; + r3 = z05; + r4 = z35; + *rel = ( r1 + r2 ); + *reh = ( r1 - r2 ); + *iml = ( r3 + r4 ); + *imh = ( r3 - r4 ); + rel += s, reh += s, iml += s; + imh += s; + + r1 = z20; + r2 = z50; + r3 = z21; + r4 = z51; + *reh = ( r1 + r2 ); + *rel = ( r1 - r2 ); + *imh = ( r3 + r4 ); + *iml = ( r3 - r4 ); + rel += s, reh += s, iml += s; + imh += s; + + r1 = z06; + r2 = z36; + r3 = z07; + r4 = z37; + *rel = ( r1 + r2 ); + *reh = ( r1 - r2 ); + *iml = ( r3 + r4 ); + *imh = ( r3 - r4 ); + rel += s, reh += s, iml += s; + imh += s; + + r1 = z22; + r2 = z52; + r3 = z23; + r4 = z53; + *reh = ( r1 + r2 ); + *rel = ( r1 - r2 ); + *imh = ( r3 + r4 ); + *iml = ( r3 - r4 ); + rel += s, reh += s, iml += s; + imh += s; + + r1 = z08; + r2 = z38; + r3 = z09; + r4 = z39; + *rel = ( r1 + r2 ); + *reh = ( r1 - r2 ); + *iml = ( r3 + r4 ); + *imh = ( r3 - r4 ); + rel += s, reh += s, iml += s; + imh += s; + + r1 = z24; + r2 = z54; + r3 = z25; + r4 = z55; + *reh = ( r1 + r2 ); + *rel = ( r1 - r2 ); + *imh = ( r3 + r4 ); + *iml = ( r3 - r4 ); + rel += s, reh += s, iml += s; + imh += s; + + r1 = z10; + r2 = z40; + r3 = z11; + r4 = z41; + *rel = ( r1 + r2 ); + *reh = ( r1 - r2 ); + *iml = ( r3 + r4 ); + *imh = ( r3 - r4 ); + rel += s, reh += s, iml += s; + imh += s; + + r1 = z26; + r2 = z56; + r3 = z27; + r4 = z57; + *reh = ( r1 + r2 ); + *rel = ( r1 - r2 ); + *imh = ( r3 + r4 ); + *iml = ( r3 - r4 ); + rel += s, reh += s, iml += s; + imh += s; + + r1 = z12; + r2 = z42; + r3 = z13; + r4 = z43; + *rel = ( r1 + r2 ); + *reh = ( r1 - r2 ); + *iml = ( r3 + r4 ); + *imh = ( r3 - r4 ); + rel += s, reh += s, iml += s; + imh += s; + + r1 = z28; + r2 = z58; + r3 = z29; + r4 = z59; + *reh = ( r1 + r2 ); + *rel = ( r1 - r2 ); + *imh = ( r3 + r4 ); + *iml = ( r3 - r4 ); + rel += s, reh += s, iml += s; + imh += s; + + r1 = z14; + r2 = z44; + r3 = z15; + r4 = z45; + *rel = ( r1 + r2 ); + *reh = ( r1 - r2 ); + *iml = ( r3 + r4 ); + *imh = ( r3 - r4 ); + rel += s, reh += s, iml += s; + imh += s; + + return; +} + +static void fft_len32( + float *re, + float *im, + const int16_t s ) +{ + float as, bs; + float x00, x01, x02, x03, x04, x05, x06, x07; + float x08, x09, x10, x11, x12, x13, x14, x15; + float t00, t01, t02, t03, t04, t05, t06, t07; + float t08, t09, t10, t11, t12, t13, t14, t15; + float s00, s01, s02, s03, s04, s05, s06, s07; + float s08, s09, s10, s11, s12, s13, s14, s15; + + float y00, y01, y02, y03, y04, y05, y06, y07; + float y08, y09, y10, y11, y12, y13, y14, y15; + float y16, y17, y18, y19, y20, y21, y22, y23; + float y24, y25, y26, y27, y28, y29, y30, y31; + float y32, y33, y34, y35, y36, y37, y38, y39; + float y40, y41, y42, y43, y44, y45, y46, y47; + float y48, y49, y50, y51, y52, y53, y54, y55; + float y56, y57, y58, y59, y60, y61, y62, y63; + + x00 = re[s * 0]; + x01 = im[s * 0]; + x02 = re[s * 4]; + x03 = im[s * 4]; + x04 = re[s * 8]; + x05 = im[s * 8]; + x06 = re[s * 12]; + x07 = im[s * 12]; + x08 = re[s * 16]; + x09 = im[s * 16]; + x10 = re[s * 20]; + x11 = im[s * 20]; + x12 = re[s * 24]; + x13 = im[s * 24]; + x14 = re[s * 28]; + x15 = im[s * 28]; + + t00 = ( x00 + x08 ); + t02 = ( x00 - x08 ); + t01 = ( x01 + x09 ); + t03 = ( x01 - x09 ); + t04 = ( x02 + x10 ); + t06 = ( x02 - x10 ); + t05 = ( x03 + x11 ); + t07 = ( x03 - x11 ); + t08 = ( x04 + x12 ); + t10 = ( x04 - x12 ); + t09 = ( x05 + x13 ); + t11 = ( x05 - x13 ); + t12 = ( x06 + x14 ); + t14 = ( x06 - x14 ); + t13 = ( x07 + x15 ); + t15 = ( x07 - x15 ); + + s00 = ( t00 + t08 ); + s04 = ( t00 - t08 ); + s01 = ( t01 + t09 ); + s05 = ( t01 - t09 ); + s08 = ( t02 - t11 ); + s10 = ( t02 + t11 ); + s09 = ( t03 + t10 ); + s11 = ( t03 - t10 ); + s02 = ( t04 + t12 ); + s07 = ( t04 - t12 ); + s03 = ( t05 + t13 ); + s06 = ( t13 - t05 ); + t01 = ( t06 + t14 ); + t02 = ( t06 - t14 ); + t00 = ( t07 + t15 ); + t03 = ( t07 - t15 ); + + { + s12 = ( ( t00 + t02 ) * FFT_C81 ); + s14 = ( ( t00 - t02 ) * FFT_C81 ); + s13 = ( ( t03 - t01 ) * FFT_C81 ); + s15 = ( ( t01 + t03 ) * FFT_C82 ); + }; + + y00 = ( s00 + s02 ); + y08 = ( s00 - s02 ); + y01 = ( s01 + s03 ); + y09 = ( s01 - s03 ); + y04 = ( s04 - s06 ); + y12 = ( s04 + s06 ); + y05 = ( s05 - s07 ); + y13 = ( s05 + s07 ); + y06 = ( s08 + s14 ); + y14 = ( s08 - s14 ); + y07 = ( s09 + s15 ); + y15 = ( s09 - s15 ); + y02 = ( s10 + s12 ); + y10 = ( s10 - s12 ); + y03 = ( s11 + s13 ); + y11 = ( s11 - s13 ); + + x00 = re[s * 1]; + x01 = im[s * 1]; + x02 = re[s * 5]; + x03 = im[s * 5]; + x04 = re[s * 9]; + x05 = im[s * 9]; + x06 = re[s * 13]; + x07 = im[s * 13]; + x08 = re[s * 17]; + x09 = im[s * 17]; + x10 = re[s * 21]; + x11 = im[s * 21]; + x12 = re[s * 25]; + x13 = im[s * 25]; + x14 = re[s * 29]; + x15 = im[s * 29]; + + t00 = ( x00 + x08 ); + t02 = ( x00 - x08 ); + t01 = ( x01 + x09 ); + t03 = ( x01 - x09 ); + t04 = ( x02 + x10 ); + t06 = ( x02 - x10 ); + t05 = ( x03 + x11 ); + t07 = ( x03 - x11 ); + t08 = ( x04 + x12 ); + t10 = ( x04 - x12 ); + t09 = ( x05 + x13 ); + t11 = ( x05 - x13 ); + t12 = ( x06 + x14 ); + t14 = ( x06 - x14 ); + t13 = ( x07 + x15 ); + t15 = ( x07 - x15 ); + + s00 = ( t00 + t08 ); + s04 = ( t00 - t08 ); + s01 = ( t01 + t09 ); + s05 = ( t01 - t09 ); + s08 = ( t02 - t11 ); + s10 = ( t02 + t11 ); + s09 = ( t03 + t10 ); + s11 = ( t03 - t10 ); + s02 = ( t04 + t12 ); + s07 = ( t04 - t12 ); + s03 = ( t05 + t13 ); + s06 = ( t13 - t05 ); + t01 = ( t06 + t14 ); + t02 = ( t06 - t14 ); + t00 = ( t07 + t15 ); + t03 = ( t07 - t15 ); + + { + s12 = ( ( t00 + t02 ) * FFT_C81 ); + s14 = ( ( t00 - t02 ) * FFT_C81 ); + s13 = ( ( t03 - t01 ) * FFT_C81 ); + s15 = ( ( t01 + t03 ) * FFT_C82 ); + }; + + y16 = ( s00 + s02 ); + y24 = ( s00 - s02 ); + y17 = ( s01 + s03 ); + y25 = ( s01 - s03 ); + y20 = ( s04 - s06 ); + y28 = ( s04 + s06 ); + y21 = ( s05 - s07 ); + y29 = ( s05 + s07 ); + y22 = ( s08 + s14 ); + y30 = ( s08 - s14 ); + y23 = ( s09 + s15 ); + y31 = ( s09 - s15 ); + y18 = ( s10 + s12 ); + y26 = ( s10 - s12 ); + y19 = ( s11 + s13 ); + y27 = ( s11 - s13 ); + + x00 = re[s * 2]; + x01 = im[s * 2]; + x02 = re[s * 6]; + x03 = im[s * 6]; + x04 = re[s * 10]; + x05 = im[s * 10]; + x06 = re[s * 14]; + x07 = im[s * 14]; + x08 = re[s * 18]; + x09 = im[s * 18]; + x10 = re[s * 22]; + x11 = im[s * 22]; + x12 = re[s * 26]; + x13 = im[s * 26]; + x14 = re[s * 30]; + x15 = im[s * 30]; + + t00 = ( x00 + x08 ); + t02 = ( x00 - x08 ); + t01 = ( x01 + x09 ); + t03 = ( x01 - x09 ); + t04 = ( x02 + x10 ); + t06 = ( x02 - x10 ); + t05 = ( x03 + x11 ); + t07 = ( x03 - x11 ); + t08 = ( x04 + x12 ); + t10 = ( x04 - x12 ); + t09 = ( x05 + x13 ); + t11 = ( x05 - x13 ); + t12 = ( x06 + x14 ); + t14 = ( x06 - x14 ); + t13 = ( x07 + x15 ); + t15 = ( x07 - x15 ); + + s00 = ( t00 + t08 ); + s04 = ( t00 - t08 ); + s01 = ( t01 + t09 ); + s05 = ( t01 - t09 ); + s08 = ( t02 - t11 ); + s10 = ( t02 + t11 ); + s09 = ( t03 + t10 ); + s11 = ( t03 - t10 ); + s02 = ( t04 + t12 ); + s07 = ( t04 - t12 ); + s03 = ( t05 + t13 ); + s06 = ( t13 - t05 ); + t01 = ( t06 + t14 ); + t02 = ( t06 - t14 ); + t00 = ( t07 + t15 ); + t03 = ( t07 - t15 ); + + { + s12 = ( ( t00 + t02 ) * FFT_C81 ); + s14 = ( ( t00 - t02 ) * FFT_C81 ); + s13 = ( ( t03 - t01 ) * FFT_C81 ); + s15 = ( ( t01 + t03 ) * FFT_C82 ); + }; + + y32 = ( s00 + s02 ); + y40 = ( s00 - s02 ); + y33 = ( s01 + s03 ); + y41 = ( s01 - s03 ); + y36 = ( s04 - s06 ); + y44 = ( s04 + s06 ); + y37 = ( s05 - s07 ); + y45 = ( s05 + s07 ); + y38 = ( s08 + s14 ); + y46 = ( s08 - s14 ); + y39 = ( s09 + s15 ); + y47 = ( s09 - s15 ); + y34 = ( s10 + s12 ); + y42 = ( s10 - s12 ); + y35 = ( s11 + s13 ); + y43 = ( s11 - s13 ); + + x00 = re[s * 3]; + x01 = im[s * 3]; + x02 = re[s * 7]; + x03 = im[s * 7]; + x04 = re[s * 11]; + x05 = im[s * 11]; + x06 = re[s * 15]; + x07 = im[s * 15]; + x08 = re[s * 19]; + x09 = im[s * 19]; + x10 = re[s * 23]; + x11 = im[s * 23]; + x12 = re[s * 27]; + x13 = im[s * 27]; + x14 = re[s * 31]; + x15 = im[s * 31]; + + t00 = ( x00 + x08 ); + t02 = ( x00 - x08 ); + t01 = ( x01 + x09 ); + t03 = ( x01 - x09 ); + t04 = ( x02 + x10 ); + t06 = ( x02 - x10 ); + t05 = ( x03 + x11 ); + t07 = ( x03 - x11 ); + t08 = ( x04 + x12 ); + t10 = ( x04 - x12 ); + t09 = ( x05 + x13 ); + t11 = ( x05 - x13 ); + t12 = ( x06 + x14 ); + t14 = ( x06 - x14 ); + t13 = ( x07 + x15 ); + t15 = ( x07 - x15 ); + + s00 = ( t00 + t08 ); + s04 = ( t00 - t08 ); + s01 = ( t01 + t09 ); + s05 = ( t01 - t09 ); + s08 = ( t02 - t11 ); + s10 = ( t02 + t11 ); + s09 = ( t03 + t10 ); + s11 = ( t03 - t10 ); + s02 = ( t04 + t12 ); + s07 = ( t04 - t12 ); + s03 = ( t05 + t13 ); + s06 = ( t13 - t05 ); + t01 = ( t06 + t14 ); + t02 = ( t06 - t14 ); + t00 = ( t07 + t15 ); + t03 = ( t07 - t15 ); + + { + s12 = ( ( t00 + t02 ) * FFT_C81 ); + s14 = ( ( t00 - t02 ) * FFT_C81 ); + s13 = ( ( t03 - t01 ) * FFT_C81 ); + s15 = ( ( t01 + t03 ) * FFT_C82 ); + }; + + y48 = ( s00 + s02 ); + y56 = ( s00 - s02 ); + y49 = ( s01 + s03 ); + y57 = ( s01 - s03 ); + y52 = ( s04 - s06 ); + y60 = ( s04 + s06 ); + y53 = ( s05 - s07 ); + y61 = ( s05 + s07 ); + y54 = ( s08 + s14 ); + y62 = ( s08 - s14 ); + y55 = ( s09 + s15 ); + y63 = ( s09 - s15 ); + y50 = ( s10 + s12 ); + y58 = ( s10 - s12 ); + y51 = ( s11 + s13 ); + y59 = ( s11 - s13 ); + + + { + as = y18; + bs = y19; + y18 = ( ( as * FFT_RotVector_32[2 * 0 + 0] ) - ( bs * FFT_RotVector_32[2 * 0 + 1] ) ); + y19 = ( ( as * FFT_RotVector_32[2 * 0 + 1] ) + ( bs * FFT_RotVector_32[2 * 0 + 0] ) ); + }; + { + as = y20; + bs = y21; + y20 = ( ( as * FFT_RotVector_32[2 * 1 + 0] ) - ( bs * FFT_RotVector_32[2 * 1 + 1] ) ); + y21 = ( ( as * FFT_RotVector_32[2 * 1 + 1] ) + ( bs * FFT_RotVector_32[2 * 1 + 0] ) ); + }; + { + as = y22; + bs = y23; + y22 = ( ( as * FFT_RotVector_32[2 * 2 + 0] ) - ( bs * FFT_RotVector_32[2 * 2 + 1] ) ); + y23 = ( ( as * FFT_RotVector_32[2 * 2 + 1] ) + ( bs * FFT_RotVector_32[2 * 2 + 0] ) ); + }; + { + as = y24; + bs = y25; + y24 = ( ( as * FFT_RotVector_32[2 * 3 + 0] ) - ( bs * FFT_RotVector_32[2 * 3 + 1] ) ); + y25 = ( ( as * FFT_RotVector_32[2 * 3 + 1] ) + ( bs * FFT_RotVector_32[2 * 3 + 0] ) ); + }; + { + as = y26; + bs = y27; + y26 = ( ( as * FFT_RotVector_32[2 * 4 + 0] ) - ( bs * FFT_RotVector_32[2 * 4 + 1] ) ); + y27 = ( ( as * FFT_RotVector_32[2 * 4 + 1] ) + ( bs * FFT_RotVector_32[2 * 4 + 0] ) ); + }; + { + as = y28; + bs = y29; + y28 = ( ( as * FFT_RotVector_32[2 * 5 + 0] ) - ( bs * FFT_RotVector_32[2 * 5 + 1] ) ); + y29 = ( ( as * FFT_RotVector_32[2 * 5 + 1] ) + ( bs * FFT_RotVector_32[2 * 5 + 0] ) ); + }; + { + as = y30; + bs = y31; + y30 = ( ( as * FFT_RotVector_32[2 * 6 + 0] ) - ( bs * FFT_RotVector_32[2 * 6 + 1] ) ); + y31 = ( ( as * FFT_RotVector_32[2 * 6 + 1] ) + ( bs * FFT_RotVector_32[2 * 6 + 0] ) ); + }; + { + as = y34; + bs = y35; + y34 = ( ( as * FFT_RotVector_32[2 * 7 + 0] ) - ( bs * FFT_RotVector_32[2 * 7 + 1] ) ); + y35 = ( ( as * FFT_RotVector_32[2 * 7 + 1] ) + ( bs * FFT_RotVector_32[2 * 7 + 0] ) ); + }; + { + as = y36; + bs = y37; + y36 = ( ( as * FFT_RotVector_32[2 * 8 + 0] ) - ( bs * FFT_RotVector_32[2 * 8 + 1] ) ); + y37 = ( ( as * FFT_RotVector_32[2 * 8 + 1] ) + ( bs * FFT_RotVector_32[2 * 8 + 0] ) ); + }; + { + as = y38; + bs = y39; + y38 = ( ( as * FFT_RotVector_32[2 * 9 + 0] ) - ( bs * FFT_RotVector_32[2 * 9 + 1] ) ); + y39 = ( ( as * FFT_RotVector_32[2 * 9 + 1] ) + ( bs * FFT_RotVector_32[2 * 9 + 0] ) ); + }; + { + as = y42; + bs = y43; + y42 = ( ( as * FFT_RotVector_32[2 * 10 + 0] ) - ( bs * FFT_RotVector_32[2 * 10 + 1] ) ); + y43 = ( ( as * FFT_RotVector_32[2 * 10 + 1] ) + ( bs * FFT_RotVector_32[2 * 10 + 0] ) ); + }; + { + as = y44; + bs = y45; + y44 = ( ( as * FFT_RotVector_32[2 * 11 + 0] ) - ( bs * FFT_RotVector_32[2 * 11 + 1] ) ); + y45 = ( ( as * FFT_RotVector_32[2 * 11 + 1] ) + ( bs * FFT_RotVector_32[2 * 11 + 0] ) ); + }; + { + as = y46; + bs = y47; + y46 = ( ( as * FFT_RotVector_32[2 * 12 + 0] ) - ( bs * FFT_RotVector_32[2 * 12 + 1] ) ); + y47 = ( ( as * FFT_RotVector_32[2 * 12 + 1] ) + ( bs * FFT_RotVector_32[2 * 12 + 0] ) ); + }; + { + as = y50; + bs = y51; + y50 = ( ( as * FFT_RotVector_32[2 * 13 + 0] ) - ( bs * FFT_RotVector_32[2 * 13 + 1] ) ); + y51 = ( ( as * FFT_RotVector_32[2 * 13 + 1] ) + ( bs * FFT_RotVector_32[2 * 13 + 0] ) ); + }; + { + as = y52; + bs = y53; + y52 = ( ( as * FFT_RotVector_32[2 * 14 + 0] ) - ( bs * FFT_RotVector_32[2 * 14 + 1] ) ); + y53 = ( ( as * FFT_RotVector_32[2 * 14 + 1] ) + ( bs * FFT_RotVector_32[2 * 14 + 0] ) ); + }; + { + as = y54; + bs = y55; + y54 = ( ( as * FFT_RotVector_32[2 * 15 + 0] ) - ( bs * FFT_RotVector_32[2 * 15 + 1] ) ); + y55 = ( ( as * FFT_RotVector_32[2 * 15 + 1] ) + ( bs * FFT_RotVector_32[2 * 15 + 0] ) ); + }; + { + as = y56; + bs = y57; + y56 = ( ( as * FFT_RotVector_32[2 * 16 + 0] ) - ( bs * FFT_RotVector_32[2 * 16 + 1] ) ); + y57 = ( ( as * FFT_RotVector_32[2 * 16 + 1] ) + ( bs * FFT_RotVector_32[2 * 16 + 0] ) ); + }; + { + as = y58; + bs = y59; + y58 = ( ( as * FFT_RotVector_32[2 * 17 + 0] ) - ( bs * FFT_RotVector_32[2 * 17 + 1] ) ); + y59 = ( ( as * FFT_RotVector_32[2 * 17 + 1] ) + ( bs * FFT_RotVector_32[2 * 17 + 0] ) ); + }; + { + as = y60; + bs = y61; + y60 = ( ( as * FFT_RotVector_32[2 * 18 + 0] ) - ( bs * FFT_RotVector_32[2 * 18 + 1] ) ); + y61 = ( ( as * FFT_RotVector_32[2 * 18 + 1] ) + ( bs * FFT_RotVector_32[2 * 18 + 0] ) ); + }; + { + as = y62; + bs = y63; + y62 = ( ( as * FFT_RotVector_32[2 * 19 + 0] ) - ( bs * FFT_RotVector_32[2 * 19 + 1] ) ); + y63 = ( ( as * FFT_RotVector_32[2 * 19 + 1] ) + ( bs * FFT_RotVector_32[2 * 19 + 0] ) ); + }; + + t00 = ( y00 + y32 ); + t02 = ( y00 - y32 ); + t01 = ( y01 + y33 ); + t03 = ( y01 - y33 ); + t04 = ( y16 + y48 ); + t07 = ( y16 - y48 ); + t05 = ( y49 + y17 ); + t06 = ( y49 - y17 ); + + re[s * 0] = ( t00 + t04 ); + im[s * 0] = ( t01 + t05 ); + re[s * 8] = ( t02 - t06 ); + im[s * 8] = ( t03 - t07 ); + re[s * 16] = ( t00 - t04 ); + im[s * 16] = ( t01 - t05 ); + re[s * 24] = ( t02 + t06 ); + im[s * 24] = ( t03 + t07 ); + + t00 = ( y02 + y34 ); + t02 = ( y02 - y34 ); + t01 = ( y03 + y35 ); + t03 = ( y03 - y35 ); + t04 = ( y18 + y50 ); + t07 = ( y18 - y50 ); + t05 = ( y51 + y19 ); + t06 = ( y51 - y19 ); + + re[s * 1] = ( t00 + t04 ); + im[s * 1] = ( t01 + t05 ); + re[s * 9] = ( t02 - t06 ); + im[s * 9] = ( t03 - t07 ); + re[s * 17] = ( t00 - t04 ); + im[s * 17] = ( t01 - t05 ); + re[s * 25] = ( t02 + t06 ); + im[s * 25] = ( t03 + t07 ); + + t00 = ( y04 + y36 ); + t02 = ( y04 - y36 ); + t01 = ( y05 + y37 ); + t03 = ( y05 - y37 ); + t04 = ( y20 + y52 ); + t07 = ( y20 - y52 ); + t05 = ( y53 + y21 ); + t06 = ( y53 - y21 ); + + re[s * 2] = ( t00 + t04 ); + im[s * 2] = ( t01 + t05 ); + re[s * 10] = ( t02 - t06 ); + im[s * 10] = ( t03 - t07 ); + re[s * 18] = ( t00 - t04 ); + im[s * 18] = ( t01 - t05 ); + re[s * 26] = ( t02 + t06 ); + im[s * 26] = ( t03 + t07 ); + + t00 = ( y06 + y38 ); + t02 = ( y06 - y38 ); + t01 = ( y07 + y39 ); + t03 = ( y07 - y39 ); + t04 = ( y22 + y54 ); + t07 = ( y22 - y54 ); + t05 = ( y55 + y23 ); + t06 = ( y55 - y23 ); + + re[s * 3] = ( t00 + t04 ); + im[s * 3] = ( t01 + t05 ); + re[s * 11] = ( t02 - t06 ); + im[s * 11] = ( t03 - t07 ); + re[s * 19] = ( t00 - t04 ); + im[s * 19] = ( t01 - t05 ); + re[s * 27] = ( t02 + t06 ); + im[s * 27] = ( t03 + t07 ); + + t00 = ( y08 + y41 ); + t02 = ( y08 - y41 ); + t01 = ( y09 - y40 ); + t03 = ( y09 + y40 ); + t04 = ( y24 + y56 ); + t07 = ( y24 - y56 ); + t05 = ( y57 + y25 ); + t06 = ( y57 - y25 ); + + re[s * 4] = ( t00 + t04 ); + im[s * 4] = ( t01 + t05 ); + re[s * 12] = ( t02 - t06 ); + im[s * 12] = ( t03 - t07 ); + re[s * 20] = ( t00 - t04 ); + im[s * 20] = ( t01 - t05 ); + re[s * 28] = ( t02 + t06 ); + im[s * 28] = ( t03 + t07 ); + + t00 = ( y10 + y42 ); + t02 = ( y10 - y42 ); + t01 = ( y11 + y43 ); + t03 = ( y11 - y43 ); + t04 = ( y26 + y58 ); + t07 = ( y26 - y58 ); + t05 = ( y59 + y27 ); + t06 = ( y59 - y27 ); + + re[s * 5] = ( t00 + t04 ); + im[s * 5] = ( t01 + t05 ); + re[s * 13] = ( t02 - t06 ); + im[s * 13] = ( t03 - t07 ); + re[s * 21] = ( t00 - t04 ); + im[s * 21] = ( t01 - t05 ); + re[s * 29] = ( t02 + t06 ); + im[s * 29] = ( t03 + t07 ); + + t00 = ( y12 + y44 ); + t02 = ( y12 - y44 ); + t01 = ( y13 + y45 ); + t03 = ( y13 - y45 ); + t04 = ( y28 + y60 ); + t07 = ( y28 - y60 ); + t05 = ( y61 + y29 ); + t06 = ( y61 - y29 ); + + re[s * 6] = ( t00 + t04 ); + im[s * 6] = ( t01 + t05 ); + re[s * 14] = ( t02 - t06 ); + im[s * 14] = ( t03 - t07 ); + re[s * 22] = ( t00 - t04 ); + im[s * 22] = ( t01 - t05 ); + re[s * 30] = ( t02 + t06 ); + im[s * 30] = ( t03 + t07 ); + + t00 = ( y14 + y46 ); + t02 = ( y14 - y46 ); + t01 = ( y15 + y47 ); + t03 = ( y15 - y47 ); + t04 = ( y30 + y62 ); + t07 = ( y30 - y62 ); + t05 = ( y63 + y31 ); + t06 = ( y63 - y31 ); + + re[s * 7] = ( t00 + t04 ); + im[s * 7] = ( t01 + t05 ); + re[s * 15] = ( t02 - t06 ); + im[s * 15] = ( t03 - t07 ); + re[s * 23] = ( t00 - t04 ); + im[s * 23] = ( t01 - t05 ); + re[s * 31] = ( t02 + t06 ); + im[s * 31] = ( t03 + t07 ); + + return; +} + +static void fft_lenN( + float *re, + float *im, + const float *W, + const int16_t len, + const int16_t dim1, + const int16_t dim2, + const int16_t sx, + const int16_t sc, + const int16_t Woff ) +{ + int16_t i, j; + float x[L_FRAME_MAX * 2]; + + for ( i = 0; i < dim2; i++ ) + { + for ( j = 0; j < dim1; j++ ) + { + x[2 * i * dim1 + 2 * j] = re[sx * i + sx * j * dim2]; + x[2 * i * dim1 + 2 * j + 1] = im[sx * i + sx * j * dim2]; + } + } + + switch ( dim1 ) + { + case 5: + for ( i = 0; i < dim2; i++ ) + { + fft_len5( &x[i * 2 * dim1], &x[i * 2 * dim1 + 1], 2 ); + } + break; + + case 8: + for ( i = 0; i < dim2; i++ ) + { + fft_len8( &x[i * 2 * dim1], &x[i * 2 * dim1 + 1], 2 ); + } + break; + + case 10: + for ( i = 0; i < dim2; i++ ) + { + fft_len10( &x[i * 2 * dim1], &x[i * 2 * dim1 + 1], 2 ); + } + break; + + case 15: + for ( i = 0; i < dim2; i++ ) + { + fft_len15( &x[i * 2 * dim1], &x[i * 2 * dim1 + 1], 2 ); + } + break; + + case 16: + for ( i = 0; i < dim2; i++ ) + { + fft_len16( &x[i * 2 * dim1], &x[i * 2 * dim1 + 1], 2 ); + } + break; + + case 20: + for ( i = 0; i < dim2; i++ ) + { + fft_len20( &x[i * 2 * dim1], &x[i * 2 * dim1 + 1], 2 ); + } + break; + + case 30: + for ( i = 0; i < dim2; i++ ) + { + fft_len30( &x[i * 2 * dim1], &x[i * 2 * dim1 + 1], 2 ); + } + break; + + case 32: + for ( i = 0; i < dim2; i++ ) + { + fft_len32( &x[i * 2 * dim1], &x[i * 2 * dim1 + 1], 2 ); + } + break; + } + + switch ( dim2 ) + { + + case 8: + { + float x00, x01, x02, x03, x04, x05, x06, x07, x08, x09, x10, x11, x12, x13, x14, x15; + float t00, t01, t02, t03, t04, t05, t06, t07, t08, t09, t10, t11, t12, t13, t14, t15; + float s00, s01, s02, s03, s04, s05, s06, s07, s08, s09, s10, s11, s12, s13, s14, s15; + + if ( dim1 == 30 || dim1 == 20 || dim1 == 15 || dim1 == 10 || dim1 == 5 ) + { + for ( i = 0; i < dim1; i++ ) + { + { + x00 = x[2 * i + 2 * 0 * dim1]; + x01 = x[2 * i + 2 * 0 * dim1 + 1]; + }; + if ( i == 0 ) + { + { + x02 = x[2 * i + 2 * 1 * dim1]; + x03 = x[2 * i + 2 * 1 * dim1 + 1]; + }; + { + x04 = x[2 * i + 2 * 2 * dim1]; + x05 = x[2 * i + 2 * 2 * dim1 + 1]; + }; + { + x06 = x[2 * i + 2 * 3 * dim1]; + x07 = x[2 * i + 2 * 3 * dim1 + 1]; + }; + { + x08 = x[2 * i + 2 * 4 * dim1]; + x09 = x[2 * i + 2 * 4 * dim1 + 1]; + }; + { + x10 = x[2 * i + 2 * 5 * dim1]; + x11 = x[2 * i + 2 * 5 * dim1 + 1]; + }; + { + x12 = x[2 * i + 2 * 6 * dim1]; + x13 = x[2 * i + 2 * 6 * dim1 + 1]; + }; + { + x14 = x[2 * i + 2 * 7 * dim1]; + x15 = x[2 * i + 2 * 7 * dim1 + 1]; + }; + } + else + { + { + x02 = ( x[2 * i + 2 * 1 * dim1] * W[sc * i + sc * 1 * dim1 * 2 - Woff] ) - ( x[2 * i + 2 * 1 * dim1 + 1] * W[sc * i + sc * 1 * dim1 * 2 + 1 - Woff] ); + x03 = ( x[2 * i + 2 * 1 * dim1] * W[sc * i + sc * 1 * dim1 * 2 + 1 - Woff] ) + ( x[2 * i + 2 * 1 * dim1 + 1] * W[sc * i + sc * 1 * dim1 * 2 - Woff] ); + }; + { + x04 = ( x[2 * i + 2 * 2 * dim1] * W[sc * i + sc * 2 * dim1 * 2 - Woff] ) - ( x[2 * i + 2 * 2 * dim1 + 1] * W[sc * i + sc * 2 * dim1 * 2 + 1 - Woff] ); + x05 = ( x[2 * i + 2 * 2 * dim1] * W[sc * i + sc * 2 * dim1 * 2 + 1 - Woff] ) + ( x[2 * i + 2 * 2 * dim1 + 1] * W[sc * i + sc * 2 * dim1 * 2 - Woff] ); + }; + { + x06 = ( x[2 * i + 2 * 3 * dim1] * W[sc * i + sc * 3 * dim1 * 2 - Woff] ) - ( x[2 * i + 2 * 3 * dim1 + 1] * W[sc * i + sc * 3 * dim1 * 2 + 1 - Woff] ); + x07 = ( x[2 * i + 2 * 3 * dim1] * W[sc * i + sc * 3 * dim1 * 2 + 1 - Woff] ) + ( x[2 * i + 2 * 3 * dim1 + 1] * W[sc * i + sc * 3 * dim1 * 2 - Woff] ); + }; + { + x08 = ( x[2 * i + 2 * 4 * dim1] * W[sc * i + sc * 4 * dim1 * 2 - Woff] ) - ( x[2 * i + 2 * 4 * dim1 + 1] * W[sc * i + sc * 4 * dim1 * 2 + 1 - Woff] ); + x09 = ( x[2 * i + 2 * 4 * dim1] * W[sc * i + sc * 4 * dim1 * 2 + 1 - Woff] ) + ( x[2 * i + 2 * 4 * dim1 + 1] * W[sc * i + sc * 4 * dim1 * 2 - Woff] ); + }; + { + x10 = ( x[2 * i + 2 * 5 * dim1] * W[sc * i + sc * 5 * dim1 * 2 - Woff] ) - ( x[2 * i + 2 * 5 * dim1 + 1] * W[sc * i + sc * 5 * dim1 * 2 + 1 - Woff] ); + x11 = ( x[2 * i + 2 * 5 * dim1] * W[sc * i + sc * 5 * dim1 * 2 + 1 - Woff] ) + ( x[2 * i + 2 * 5 * dim1 + 1] * W[sc * i + sc * 5 * dim1 * 2 - Woff] ); + }; + { + x12 = ( x[2 * i + 2 * 6 * dim1] * W[sc * i + sc * 6 * dim1 * 2 - Woff] ) - ( x[2 * i + 2 * 6 * dim1 + 1] * W[sc * i + sc * 6 * dim1 * 2 + 1 - Woff] ); + x13 = ( x[2 * i + 2 * 6 * dim1] * W[sc * i + sc * 6 * dim1 * 2 + 1 - Woff] ) + ( x[2 * i + 2 * 6 * dim1 + 1] * W[sc * i + sc * 6 * dim1 * 2 - Woff] ); + }; + { + x14 = ( x[2 * i + 2 * 7 * dim1] * W[sc * i + sc * 7 * dim1 * 2 - Woff] ) - ( x[2 * i + 2 * 7 * dim1 + 1] * W[sc * i + sc * 7 * dim1 * 2 + 1 - Woff] ); + x15 = ( x[2 * i + 2 * 7 * dim1] * W[sc * i + sc * 7 * dim1 * 2 + 1 - Woff] ) + ( x[2 * i + 2 * 7 * dim1 + 1] * W[sc * i + sc * 7 * dim1 * 2 - Woff] ); + }; + } + + t00 = ( x00 + x08 ); + t02 = ( x00 - x08 ); + t01 = ( x01 + x09 ); + t03 = ( x01 - x09 ); + t04 = ( x02 + x10 ); + t06 = ( x02 - x10 ); + t05 = ( x03 + x11 ); + t07 = ( x03 - x11 ); + t08 = ( x04 + x12 ); + t10 = ( x04 - x12 ); + t09 = ( x05 + x13 ); + t11 = ( x05 - x13 ); + t12 = ( x06 + x14 ); + t14 = ( x06 - x14 ); + t13 = ( x07 + x15 ); + t15 = ( x07 - x15 ); + + s00 = ( t00 + t08 ); + s04 = ( t00 - t08 ); + s01 = ( t01 + t09 ); + s05 = ( t01 - t09 ); + s08 = ( t02 - t11 ); + s10 = ( t02 + t11 ); + s09 = ( t03 + t10 ); + s11 = ( t03 - t10 ); + s02 = ( t04 + t12 ); + s07 = ( t04 - t12 ); + s03 = ( t05 + t13 ); + s06 = ( t13 - t05 ); + + t01 = ( t06 + t14 ); + t02 = ( t06 - t14 ); + t00 = ( t07 + t15 ); + t03 = ( t07 - t15 ); + + s12 = ( ( t00 + t02 ) * FFT_C81 ); + s14 = ( ( t00 - t02 ) * FFT_C81 ); + s13 = ( ( t03 - t01 ) * FFT_C81 ); + s15 = ( ( t01 + t03 ) * FFT_C82 ); + + re[sx * i + sx * 0 * dim1] = ( s00 + s02 ); + im[sx * i + sx * 0 * dim1] = ( s01 + s03 ); + re[sx * i + sx * 1 * dim1] = ( s10 + s12 ); + im[sx * i + sx * 1 * dim1] = ( s11 + s13 ); + re[sx * i + sx * 2 * dim1] = ( s04 - s06 ); + im[sx * i + sx * 2 * dim1] = ( s05 - s07 ); + re[sx * i + sx * 3 * dim1] = ( s08 + s14 ); + im[sx * i + sx * 3 * dim1] = ( s09 + s15 ); + re[sx * i + sx * 4 * dim1] = ( s00 - s02 ); + im[sx * i + sx * 4 * dim1] = ( s01 - s03 ); + re[sx * i + sx * 5 * dim1] = ( s10 - s12 ); + im[sx * i + sx * 5 * dim1] = ( s11 - s13 ); + re[sx * i + sx * 6 * dim1] = ( s04 + s06 ); + im[sx * i + sx * 6 * dim1] = ( s05 + s07 ); + re[sx * i + sx * 7 * dim1] = ( s08 - s14 ); + im[sx * i + sx * 7 * dim1] = ( s09 - s15 ); + } + } + else + { + for ( i = 0; i < dim1; i++ ) + { + { + x00 = x[2 * i + 2 * 0 * dim1]; + x01 = x[2 * i + 2 * 0 * dim1 + 1]; + }; + if ( i == 0 ) + { + { + x02 = x[2 * i + 2 * 1 * dim1]; + x03 = x[2 * i + 2 * 1 * dim1 + 1]; + }; + { + x04 = x[2 * i + 2 * 2 * dim1]; + x05 = x[2 * i + 2 * 2 * dim1 + 1]; + }; + { + x06 = x[2 * i + 2 * 3 * dim1]; + x07 = x[2 * i + 2 * 3 * dim1 + 1]; + }; + { + x08 = x[2 * i + 2 * 4 * dim1]; + x09 = x[2 * i + 2 * 4 * dim1 + 1]; + }; + { + x10 = x[2 * i + 2 * 5 * dim1]; + x11 = x[2 * i + 2 * 5 * dim1 + 1]; + }; + { + x12 = x[2 * i + 2 * 6 * dim1]; + x13 = x[2 * i + 2 * 6 * dim1 + 1]; + }; + { + x14 = x[2 * i + 2 * 7 * dim1]; + x15 = x[2 * i + 2 * 7 * dim1 + 1]; + }; + } + else + { + { + x02 = ( x[2 * i + 2 * 1 * dim1] * W[sc * i + sc * 1 * dim1 - Woff] ) - ( x[2 * i + 2 * 1 * dim1 + 1] * W[sc * i + sc * 1 * dim1 + 1 - Woff] ); + x03 = ( x[2 * i + 2 * 1 * dim1] * W[sc * i + sc * 1 * dim1 + 1 - Woff] ) + ( x[2 * i + 2 * 1 * dim1 + 1] * W[sc * i + sc * 1 * dim1 - Woff] ); + }; + { + x04 = ( x[2 * i + 2 * 2 * dim1] * W[sc * i + sc * 2 * dim1 - Woff] ) - ( x[2 * i + 2 * 2 * dim1 + 1] * W[sc * i + sc * 2 * dim1 + 1 - Woff] ); + x05 = ( x[2 * i + 2 * 2 * dim1] * W[sc * i + sc * 2 * dim1 + 1 - Woff] ) + ( x[2 * i + 2 * 2 * dim1 + 1] * W[sc * i + sc * 2 * dim1 - Woff] ); + }; + { + x06 = ( x[2 * i + 2 * 3 * dim1] * W[sc * i + sc * 3 * dim1 - Woff] ) - ( x[2 * i + 2 * 3 * dim1 + 1] * W[sc * i + sc * 3 * dim1 + 1 - Woff] ); + x07 = ( x[2 * i + 2 * 3 * dim1] * W[sc * i + sc * 3 * dim1 + 1 - Woff] ) + ( x[2 * i + 2 * 3 * dim1 + 1] * W[sc * i + sc * 3 * dim1 - Woff] ); + }; + { + x08 = ( x[2 * i + 2 * 4 * dim1] * W[sc * i + sc * 4 * dim1 - Woff] ) - ( x[2 * i + 2 * 4 * dim1 + 1] * W[sc * i + sc * 4 * dim1 + 1 - Woff] ); + x09 = ( x[2 * i + 2 * 4 * dim1] * W[sc * i + sc * 4 * dim1 + 1 - Woff] ) + ( x[2 * i + 2 * 4 * dim1 + 1] * W[sc * i + sc * 4 * dim1 - Woff] ); + }; + { + x10 = ( x[2 * i + 2 * 5 * dim1] * W[sc * i + sc * 5 * dim1 - Woff] ) - ( x[2 * i + 2 * 5 * dim1 + 1] * W[sc * i + sc * 5 * dim1 + 1 - Woff] ); + x11 = ( x[2 * i + 2 * 5 * dim1] * W[sc * i + sc * 5 * dim1 + 1 - Woff] ) + ( x[2 * i + 2 * 5 * dim1 + 1] * W[sc * i + sc * 5 * dim1 - Woff] ); + }; + { + x12 = ( x[2 * i + 2 * 6 * dim1] * W[sc * i + sc * 6 * dim1 - Woff] ) - ( x[2 * i + 2 * 6 * dim1 + 1] * W[sc * i + sc * 6 * dim1 + 1 - Woff] ); + x13 = ( x[2 * i + 2 * 6 * dim1] * W[sc * i + sc * 6 * dim1 + 1 - Woff] ) + ( x[2 * i + 2 * 6 * dim1 + 1] * W[sc * i + sc * 6 * dim1 - Woff] ); + }; + { + x14 = ( x[2 * i + 2 * 7 * dim1] * W[sc * i + sc * 7 * dim1 - Woff] ) - ( x[2 * i + 2 * 7 * dim1 + 1] * W[sc * i + sc * 7 * dim1 + 1 - Woff] ); + x15 = ( x[2 * i + 2 * 7 * dim1] * W[sc * i + sc * 7 * dim1 + 1 - Woff] ) + ( x[2 * i + 2 * 7 * dim1 + 1] * W[sc * i + sc * 7 * dim1 - Woff] ); + }; + } + + t00 = ( x00 + x08 ); + t02 = ( x00 - x08 ); + t01 = ( x01 + x09 ); + t03 = ( x01 - x09 ); + t04 = ( x02 + x10 ); + t06 = ( x02 - x10 ); + t05 = ( x03 + x11 ); + t07 = ( x03 - x11 ); + t08 = ( x04 + x12 ); + t10 = ( x04 - x12 ); + t09 = ( x05 + x13 ); + t11 = ( x05 - x13 ); + t12 = ( x06 + x14 ); + t14 = ( x06 - x14 ); + t13 = ( x07 + x15 ); + t15 = ( x07 - x15 ); + + s00 = ( t00 + t08 ); + s04 = ( t00 - t08 ); + s01 = ( t01 + t09 ); + s05 = ( t01 - t09 ); + s08 = ( t02 - t11 ); + s10 = ( t02 + t11 ); + s09 = ( t03 + t10 ); + s11 = ( t03 - t10 ); + s02 = ( t04 + t12 ); + s07 = ( t04 - t12 ); + s03 = ( t05 + t13 ); + s06 = ( t13 - t05 ); + + t01 = ( t06 + t14 ); + t02 = ( t06 - t14 ); + t00 = ( t07 + t15 ); + t03 = ( t07 - t15 ); + + s12 = ( ( t00 + t02 ) * FFT_C81 ); + s14 = ( ( t00 - t02 ) * FFT_C81 ); + s13 = ( ( t03 - t01 ) * FFT_C81 ); + s15 = ( ( t01 + t03 ) * FFT_C82 ); + + re[sx * i + sx * 0 * dim1] = ( s00 + s02 ); + im[sx * i + sx * 0 * dim1] = ( s01 + s03 ); + re[sx * i + sx * 1 * dim1] = ( s10 + s12 ); + im[sx * i + sx * 1 * dim1] = ( s11 + s13 ); + re[sx * i + sx * 2 * dim1] = ( s04 - s06 ); + im[sx * i + sx * 2 * dim1] = ( s05 - s07 ); + re[sx * i + sx * 3 * dim1] = ( s08 + s14 ); + im[sx * i + sx * 3 * dim1] = ( s09 + s15 ); + re[sx * i + sx * 4 * dim1] = ( s00 - s02 ); + im[sx * i + sx * 4 * dim1] = ( s01 - s03 ); + re[sx * i + sx * 5 * dim1] = ( s10 - s12 ); + im[sx * i + sx * 5 * dim1] = ( s11 - s13 ); + re[sx * i + sx * 6 * dim1] = ( s04 + s06 ); + im[sx * i + sx * 6 * dim1] = ( s05 + s07 ); + re[sx * i + sx * 7 * dim1] = ( s08 - s14 ); + im[sx * i + sx * 7 * dim1] = ( s09 - s15 ); + } + } + break; + } + + case 10: + { + float y[2 * 10]; + for ( j = 0; j < dim2; j++ ) + { + { + y[2 * j] = x[2 * 0 + 2 * j * dim1]; + y[2 * j + 1] = x[2 * 0 + 2 * j * dim1 + 1]; + }; + } + fft_len10( &y[0], &y[1], 2 ); + for ( j = 0; j < dim2; j++ ) + { + re[sx * 0 + sx * j * dim1] = y[2 * j]; + im[sx * 0 + sx * j * dim1] = y[2 * j + 1]; + } + + for ( i = 1; i < dim1; i++ ) + { + { + y[2 * ( 0 + 0 )] = x[2 * i + 2 * ( 0 + 0 ) * dim1]; + y[2 * ( 0 + 0 ) + 1] = x[2 * i + 2 * ( 0 + 0 ) * dim1 + 1]; + } + + for ( j = 1; j < dim2; j++ ) + { + { + y[2 * ( j + 0 )] = ( x[2 * i + 2 * ( j + 0 ) * dim1] * W[sc * i + sc * j * dim1 - Woff] ) - ( x[2 * i + 2 * ( j + 0 ) * dim1 + 1] * W[sc * i + sc * j * dim1 + 1 - Woff] ); + y[2 * ( j + 0 ) + 1] = ( x[2 * i + 2 * ( j + 0 ) * dim1] * W[sc * i + sc * j * dim1 + 1 - Woff] ) + ( x[2 * i + 2 * ( j + 0 ) * dim1 + 1] * W[sc * i + sc * j * dim1 - Woff] ); + } + } + fft_len10( &y[0], &y[1], 2 ); + for ( j = 0; j < dim2; j++ ) + { + re[sx * i + sx * j * dim1] = y[2 * j]; + im[sx * i + sx * j * dim1] = y[2 * j + 1]; + } + } + break; + } + + case 16: + { + float y[2 * 16]; + for ( j = 0; j < dim2; j++ ) + { + { + y[2 * j] = x[2 * 0 + 2 * j * dim1]; + y[2 * j + 1] = x[2 * 0 + 2 * j * dim1 + 1]; + }; + } + fft_len16( &y[0], &y[1], 2 ); + for ( j = 0; j < dim2; j++ ) + { + re[sx * 0 + sx * j * dim1] = y[2 * j]; + im[sx * 0 + sx * j * dim1] = y[2 * j + 1]; + } + + for ( i = 1; i < dim1; i++ ) + { + { + y[2 * ( 0 + 0 )] = x[2 * i + 2 * ( 0 + 0 ) * dim1]; + y[2 * ( 0 + 0 ) + 1] = x[2 * i + 2 * ( 0 + 0 ) * dim1 + 1]; + } + + for ( j = 1; j < dim2; j++ ) + { + { + y[2 * ( j + 0 )] = ( x[2 * i + 2 * ( j + 0 ) * dim1] * W[sc * i + sc * j * dim1 - Woff] ) - ( x[2 * i + 2 * ( j + 0 ) * dim1 + 1] * W[sc * i + sc * j * dim1 + 1 - Woff] ); + y[2 * ( j + 0 ) + 1] = ( x[2 * i + 2 * ( j + 0 ) * dim1] * W[sc * i + sc * j * dim1 + 1 - Woff] ) + ( x[2 * i + 2 * ( j + 0 ) * dim1 + 1] * W[sc * i + sc * j * dim1 - Woff] ); + } + } + fft_len16( &y[0], &y[1], 2 ); + for ( j = 0; j < dim2; j++ ) + { + re[sx * i + sx * j * dim1] = y[2 * j]; + im[sx * i + sx * j * dim1] = y[2 * j + 1]; + } + } + break; + } + + case 20: + { + float y[2 * 20]; + for ( j = 0; j < dim2; j++ ) + { + { + y[2 * j] = x[2 * 0 + 2 * j * dim1]; + y[2 * j + 1] = x[2 * 0 + 2 * j * dim1 + 1]; + }; + } + fft_len20( &y[0], &y[1], 2 ); + for ( j = 0; j < dim2; j++ ) + { + re[sx * 0 + sx * j * dim1] = y[2 * j]; + im[sx * 0 + sx * j * dim1] = y[2 * j + 1]; + } + + for ( i = 1; i < dim1; i++ ) + { + { + y[2 * ( 0 + 0 )] = x[2 * i + 2 * ( 0 + 0 ) * dim1]; + y[2 * ( 0 + 0 ) + 1] = x[2 * i + 2 * ( 0 + 0 ) * dim1 + 1]; + } + { + y[2 * ( 0 + 1 )] = ( x[2 * i + 2 * ( 0 + 1 ) * dim1] * W[len + sc * i + 0 * dim1 - Woff] ) - ( x[2 * i + 2 * ( 0 + 1 ) * dim1 + 1] * W[len + sc * i + 0 * dim1 + 1 - Woff] ); + y[2 * ( 0 + 1 ) + 1] = ( x[2 * i + 2 * ( 0 + 1 ) * dim1] * W[len + sc * i + 0 * dim1 + 1 - Woff] ) + ( x[2 * i + 2 * ( 0 + 1 ) * dim1 + 1] * W[len + sc * i + 0 * dim1 - Woff] ); + } + + for ( j = 2; j < dim2; j = j + 2 ) + { + { + y[2 * ( j + 0 )] = ( x[2 * i + 2 * ( j + 0 ) * dim1] * W[sc * i + j * dim1 - Woff] ) - ( x[2 * i + 2 * ( j + 0 ) * dim1 + 1] * W[sc * i + j * dim1 + 1 - Woff] ); + y[2 * ( j + 0 ) + 1] = ( x[2 * i + 2 * ( j + 0 ) * dim1] * W[sc * i + j * dim1 + 1 - Woff] ) + ( x[2 * i + 2 * ( j + 0 ) * dim1 + 1] * W[sc * i + j * dim1 - Woff] ); + } + { + y[2 * ( j + 1 )] = ( x[2 * i + 2 * ( j + 1 ) * dim1] * W[len + sc * i + j * dim1 - Woff] ) - ( x[2 * i + 2 * ( j + 1 ) * dim1 + 1] * W[len + sc * i + j * dim1 + 1 - Woff] ); + y[2 * ( j + 1 ) + 1] = ( x[2 * i + 2 * ( j + 1 ) * dim1] * W[len + sc * i + j * dim1 + 1 - Woff] ) + ( x[2 * i + 2 * ( j + 1 ) * dim1 + 1] * W[len + sc * i + j * dim1 - Woff] ); + } + } + fft_len20( &y[0], &y[1], 2 ); + for ( j = 0; j < dim2; j++ ) + { + re[sx * i + sx * j * dim1] = y[2 * j]; + im[sx * i + sx * j * dim1] = y[2 * j + 1]; + } + } + break; + } + + case 32: + { + float y[2 * 32]; + for ( j = 0; j < dim2; j++ ) + { + { + y[2 * j] = x[2 * 0 + 2 * j * dim1]; + y[2 * j + 1] = x[2 * 0 + 2 * j * dim1 + 1]; + }; + } + fft_len32( &y[0], &y[1], 2 ); + for ( j = 0; j < dim2; j++ ) + { + re[sx * 0 + sx * j * dim1] = y[2 * j]; + im[sx * 0 + sx * j * dim1] = y[2 * j + 1]; + } + + for ( i = 1; i < dim1; i++ ) + { + { + y[2 * ( 0 + 0 )] = x[2 * i + 2 * ( 0 + 0 ) * dim1]; + y[2 * ( 0 + 0 ) + 1] = x[2 * i + 2 * ( 0 + 0 ) * dim1 + 1]; + } + { + y[2 * ( 0 + 1 )] = ( x[2 * i + 2 * ( 0 + 1 ) * dim1] * W[len + sc * i + 0 * dim1 - Woff] ) - ( x[2 * i + 2 * ( 0 + 1 ) * dim1 + 1] * W[len + sc * i + 0 * dim1 + 1 - Woff] ); + y[2 * ( 0 + 1 ) + 1] = ( x[2 * i + 2 * ( 0 + 1 ) * dim1] * W[len + sc * i + 0 * dim1 + 1 - Woff] ) + ( x[2 * i + 2 * ( 0 + 1 ) * dim1 + 1] * W[len + sc * i + 0 * dim1 - Woff] ); + } + + for ( j = 2; j < dim2; j = j + 2 ) + { + { + y[2 * ( j + 0 )] = ( x[2 * i + 2 * ( j + 0 ) * dim1] * W[sc * i + j * dim1 - Woff] ) - ( x[2 * i + 2 * ( j + 0 ) * dim1 + 1] * W[sc * i + j * dim1 + 1 - Woff] ); + y[2 * ( j + 0 ) + 1] = ( x[2 * i + 2 * ( j + 0 ) * dim1] * W[sc * i + j * dim1 + 1 - Woff] ) + ( x[2 * i + 2 * ( j + 0 ) * dim1 + 1] * W[sc * i + j * dim1 - Woff] ); + } + { + y[2 * ( j + 1 )] = ( x[2 * i + 2 * ( j + 1 ) * dim1] * W[len + sc * i + j * dim1 - Woff] ) - ( x[2 * i + 2 * ( j + 1 ) * dim1 + 1] * W[len + sc * i + j * dim1 + 1 - Woff] ); + y[2 * ( j + 1 ) + 1] = ( x[2 * i + 2 * ( j + 1 ) * dim1] * W[len + sc * i + j * dim1 + 1 - Woff] ) + ( x[2 * i + 2 * ( j + 1 ) * dim1 + 1] * W[len + sc * i + j * dim1 - Woff] ); + } + } + fft_len32( &y[0], &y[1], 2 ); + for ( j = 0; j < dim2; j++ ) + { + re[sx * i + sx * j * dim1] = y[2 * j]; + im[sx * i + sx * j * dim1] = y[2 * j + 1]; + } + } + break; + } + } + + return; +} + + +/*-----------------------------------------------------------------* + * fft() + * + * Complex-value FFT + *-----------------------------------------------------------------*/ + +void fft( + float *re, /* i/o: real part */ + float *im, /* i/o: imag part */ + const int16_t length, /* i : length of fft */ + const int16_t s /* i : sign */ +) +{ + switch ( length ) + { + case 20: + fft_len20( re, im, s ); + break; + case 40: + fft_lenN( re, im, FFT_RotVector_640, 640, 5, 8, s, 8, 40 ); + break; + case 64: + fft_lenN( re, im, FFT_RotVector_256, 256, 8, 8, s, 8, 64 ); + break; + case 80: + fft_lenN( re, im, FFT_RotVector_640, 640, 10, 8, s, 4, 40 ); + break; + case 100: + fft_lenN( re, im, FFT_RotVector_400, 400, 10, 10, s, 4, 40 ); + break; + case 120: + fft_lenN( re, im, FFT_RotVector_960, 960, 15, 8, s, 4, 60 ); + break; + case 128: + fft_lenN( re, im, FFT_RotVector_256, 256, 16, 8, s, 4, 64 ); + break; + case 160: + fft_lenN( re, im, FFT_RotVector_640, 640, 20, 8, s, 2, 40 ); + break; + case 200: + fft_lenN( re, im, FFT_RotVector_400, 400, 20, 10, s, 2, 40 ); + break; + case 240: + fft_lenN( re, im, FFT_RotVector_960, 960, 30, 8, s, 2, 60 ); + break; + case 256: + fft_lenN( re, im, FFT_RotVector_256, 256, 32, 8, s, 2, 64 ); + break; + case 320: + fft_lenN( re, im, FFT_RotVector_640, 640, 20, 16, s, 2, 40 ); + break; + case 400: + fft_lenN( re, im, FFT_RotVector_400, 400, 20, 20, s, 2, 40 ); + break; + case 480: + fft_lenN( re, im, FFT_RotVector_960, 960, 30, 16, s, 2, 60 ); + break; + case 600: + fft_lenN( re, im, FFT_RotVector_600, 600, 30, 20, s, 2, 60 ); + break; + case 640: + fft_lenN( re, im, FFT_RotVector_640, 640, 20, 32, s, 2, 40 ); + break; + case 960: + fft_lenN( re, im, FFT_RotVector_960, 960, 30, 32, s, 2, 60 ); + break; + default: + assert( !"fft length is not supported!" ); + } + + return; +} + + +/*-----------------------------------------------------------------* + * rfft() + * + * Real-value FFT + *-----------------------------------------------------------------*/ + +void rfft( + float *x, /* i/o: values */ + const float *w, /* i : window */ + const int16_t length, /* i : length of fft */ + const int16_t isign /* i : sign */ +) +{ + int16_t i, sizeOfFft2, sizeOfFft4; + float tmp, t1, t2, t3, t4, s1, s2; + + sizeOfFft2 = length >> 1; + sizeOfFft4 = length >> 2; + s1 = 1.f / (float) sizeOfFft2; + s2 = -1.f / (float) sizeOfFft2; + + switch ( isign ) + { + + case -1: + + fft( x, x + 1, sizeOfFft2, 2 ); + + tmp = x[0] + x[1]; + x[1] = x[0] - x[1]; + x[0] = tmp; + + for ( i = 1; i <= sizeOfFft4; i++ ) + { + t1 = x[2 * i] - x[length - 2 * i]; + t2 = x[2 * i + 1] + x[length - 2 * i + 1]; + t3 = w[i] * t1 - w[i + sizeOfFft4] * t2; + t4 = w[i + sizeOfFft4] * t1 + w[i] * t2; + t1 = x[2 * i] + x[length - 2 * i]; + t2 = x[2 * i + 1] - x[length - 2 * i + 1]; + + x[2 * i] = ( t1 - t3 ) * 0.5f; + x[2 * i + 1] = ( t2 - t4 ) * 0.5f; + x[length - 2 * i] = ( t1 + t3 ) * 0.5f; + x[length - 2 * i + 1] = -( t2 + t4 ) * 0.5f; + } + + break; + + case +1: + + tmp = ( x[0] + x[1] ) * 0.5f; + x[1] = ( x[1] - x[0] ) * 0.5f; + x[0] = tmp; + + for ( i = 1; i <= sizeOfFft4; i++ ) + { + t1 = x[2 * i] - x[length - 2 * i]; + t2 = x[2 * i + 1] + x[length - 2 * i + 1]; + t3 = w[i] * t1 + w[i + sizeOfFft4] * t2; + t4 = -w[i + sizeOfFft4] * t1 + w[i] * t2; + t1 = x[2 * i] + x[length - 2 * i]; + t2 = x[2 * i + 1] - x[length - 2 * i + 1]; + + x[2 * i] = ( t1 - t3 ) * 0.5f; + x[2 * i + 1] = ( t4 - t2 ) * 0.5f; + x[length - 2 * i] = ( t1 + t3 ) * 0.5f; + x[length - 2 * i + 1] = ( t2 + t4 ) * 0.5f; + } + + fft( x, x + 1, sizeOfFft2, 2 ); + + for ( i = 0; i < length; i += 2 ) + { + x[i] *= s1; + x[i + 1] *= s2; + } + + break; + } + + return; +} + + +#define WMC_TOOL_SKIP + +#define SCALEFACTOR8 ( 4 ) +#define SCALEFACTOR64 ( 7 ) +#define SCALEFACTORN2 ( 3 ) + +#define SHC( x ) ( (Word16) x ) +#define FFTC( x ) WORD322WORD16( (Word32) x ) + +#define C81_FX ( FFTC( 0x5a82799a ) ) /* FL2WORD32( 7.071067811865475e-1) */ +#define C82_FX ( FFTC( 0xa57d8666 ) ) /* FL2WORD32(-7.071067811865475e-1) */ + +#define cplxMpy4_8_0( re, im, a, b, c, d ) \ + re = L_shr( L_sub( Mpy_32_16( a, c ), Mpy_32_16( b, d ) ), 1 ); \ + im = L_shr( L_add( Mpy_32_16( a, d ), Mpy_32_16( b, c ) ), 1 ); + +#define cplxMpy4_8_1( re, im, a, b ) \ + re = L_shr( a, 1 ); \ + im = L_shr( b, 1 ); + + +/** + * \brief Twiddle factors are unscaled + */ +static const Word16 RotVector_256[2 * ( 256 - 32 )] = { + SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7ff6 ), SHC( 0xfcdc ), SHC( 0x7fd9 ), SHC( 0xf9b8 ), SHC( 0x7fa7 ), SHC( 0xf695 ), + SHC( 0x7f62 ), SHC( 0xf374 ), SHC( 0x7f0a ), SHC( 0xf055 ), SHC( 0x7e9d ), SHC( 0xed38 ), SHC( 0x7e1e ), SHC( 0xea1e ), + SHC( 0x7d8a ), SHC( 0xe707 ), SHC( 0x7ce4 ), SHC( 0xe3f4 ), SHC( 0x7c2a ), SHC( 0xe0e6 ), SHC( 0x7b5d ), SHC( 0xdddc ), + SHC( 0x7a7d ), SHC( 0xdad8 ), SHC( 0x798a ), SHC( 0xd7d9 ), SHC( 0x7885 ), SHC( 0xd4e1 ), SHC( 0x776c ), SHC( 0xd1ef ), + SHC( 0x7642 ), SHC( 0xcf04 ), SHC( 0x7505 ), SHC( 0xcc21 ), SHC( 0x73b6 ), SHC( 0xc946 ), SHC( 0x7255 ), SHC( 0xc673 ), + SHC( 0x70e3 ), SHC( 0xc3a9 ), SHC( 0x6f5f ), SHC( 0xc0e9 ), SHC( 0x6dca ), SHC( 0xbe32 ), SHC( 0x6c24 ), SHC( 0xbb85 ), + SHC( 0x6a6e ), SHC( 0xb8e3 ), SHC( 0x68a7 ), SHC( 0xb64c ), SHC( 0x66d0 ), SHC( 0xb3c0 ), SHC( 0x64e9 ), SHC( 0xb140 ), + SHC( 0x62f2 ), SHC( 0xaecc ), SHC( 0x60ec ), SHC( 0xac65 ), SHC( 0x5ed7 ), SHC( 0xaa0a ), SHC( 0x5cb4 ), SHC( 0xa7bd ), + SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7fd9 ), SHC( 0xf9b8 ), SHC( 0x7f62 ), SHC( 0xf374 ), SHC( 0x7e9d ), SHC( 0xed38 ), + SHC( 0x7d8a ), SHC( 0xe707 ), SHC( 0x7c2a ), SHC( 0xe0e6 ), SHC( 0x7a7d ), SHC( 0xdad8 ), SHC( 0x7885 ), SHC( 0xd4e1 ), + SHC( 0x7642 ), SHC( 0xcf04 ), SHC( 0x73b6 ), SHC( 0xc946 ), SHC( 0x70e3 ), SHC( 0xc3a9 ), SHC( 0x6dca ), SHC( 0xbe32 ), + SHC( 0x6a6e ), SHC( 0xb8e3 ), SHC( 0x66d0 ), SHC( 0xb3c0 ), SHC( 0x62f2 ), SHC( 0xaecc ), SHC( 0x5ed7 ), SHC( 0xaa0a ), + SHC( 0x5a82 ), SHC( 0xa57e ), SHC( 0x55f6 ), SHC( 0xa129 ), SHC( 0x5134 ), SHC( 0x9d0e ), SHC( 0x4c40 ), SHC( 0x9930 ), + SHC( 0x471d ), SHC( 0x9592 ), SHC( 0x41ce ), SHC( 0x9236 ), SHC( 0x3c57 ), SHC( 0x8f1d ), SHC( 0x36ba ), SHC( 0x8c4a ), + SHC( 0x30fc ), SHC( 0x89be ), SHC( 0x2b1f ), SHC( 0x877b ), SHC( 0x2528 ), SHC( 0x8583 ), SHC( 0x1f1a ), SHC( 0x83d6 ), + SHC( 0x18f9 ), SHC( 0x8276 ), SHC( 0x12c8 ), SHC( 0x8163 ), SHC( 0x0c8c ), SHC( 0x809e ), SHC( 0x0648 ), SHC( 0x8027 ), + SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7fa7 ), SHC( 0xf695 ), SHC( 0x7e9d ), SHC( 0xed38 ), SHC( 0x7ce4 ), SHC( 0xe3f4 ), + SHC( 0x7a7d ), SHC( 0xdad8 ), SHC( 0x776c ), SHC( 0xd1ef ), SHC( 0x73b6 ), SHC( 0xc946 ), SHC( 0x6f5f ), SHC( 0xc0e9 ), + SHC( 0x6a6e ), SHC( 0xb8e3 ), SHC( 0x64e9 ), SHC( 0xb140 ), SHC( 0x5ed7 ), SHC( 0xaa0a ), SHC( 0x5843 ), SHC( 0xa34c ), + SHC( 0x5134 ), SHC( 0x9d0e ), SHC( 0x49b4 ), SHC( 0x9759 ), SHC( 0x41ce ), SHC( 0x9236 ), SHC( 0x398d ), SHC( 0x8dab ), + SHC( 0x30fc ), SHC( 0x89be ), SHC( 0x2827 ), SHC( 0x8676 ), SHC( 0x1f1a ), SHC( 0x83d6 ), SHC( 0x15e2 ), SHC( 0x81e2 ), + SHC( 0x0c8c ), SHC( 0x809e ), SHC( 0x0324 ), SHC( 0x800a ), SHC( 0xf9b8 ), SHC( 0x8027 ), SHC( 0xf055 ), SHC( 0x80f6 ), + SHC( 0xe707 ), SHC( 0x8276 ), SHC( 0xdddc ), SHC( 0x84a3 ), SHC( 0xd4e1 ), SHC( 0x877b ), SHC( 0xcc21 ), SHC( 0x8afb ), + SHC( 0xc3a9 ), SHC( 0x8f1d ), SHC( 0xbb85 ), SHC( 0x93dc ), SHC( 0xb3c0 ), SHC( 0x9930 ), SHC( 0xac65 ), SHC( 0x9f14 ), + SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7f62 ), SHC( 0xf374 ), SHC( 0x7d8a ), SHC( 0xe707 ), SHC( 0x7a7d ), SHC( 0xdad8 ), + SHC( 0x7642 ), SHC( 0xcf04 ), SHC( 0x70e3 ), SHC( 0xc3a9 ), SHC( 0x6a6e ), SHC( 0xb8e3 ), SHC( 0x62f2 ), SHC( 0xaecc ), + SHC( 0x5a82 ), SHC( 0xa57e ), SHC( 0x5134 ), SHC( 0x9d0e ), SHC( 0x471d ), SHC( 0x9592 ), SHC( 0x3c57 ), SHC( 0x8f1d ), + SHC( 0x30fc ), SHC( 0x89be ), SHC( 0x2528 ), SHC( 0x8583 ), SHC( 0x18f9 ), SHC( 0x8276 ), SHC( 0x0c8c ), SHC( 0x809e ), + SHC( 0x0000 ), SHC( 0x8000 ), SHC( 0xf374 ), SHC( 0x809e ), SHC( 0xe707 ), SHC( 0x8276 ), SHC( 0xdad8 ), SHC( 0x8583 ), + SHC( 0xcf04 ), SHC( 0x89be ), SHC( 0xc3a9 ), SHC( 0x8f1d ), SHC( 0xb8e3 ), SHC( 0x9592 ), SHC( 0xaecc ), SHC( 0x9d0e ), + SHC( 0xa57e ), SHC( 0xa57e ), SHC( 0x9d0e ), SHC( 0xaecc ), SHC( 0x9592 ), SHC( 0xb8e3 ), SHC( 0x8f1d ), SHC( 0xc3a9 ), + SHC( 0x89be ), SHC( 0xcf04 ), SHC( 0x8583 ), SHC( 0xdad8 ), SHC( 0x8276 ), SHC( 0xe707 ), SHC( 0x809e ), SHC( 0xf374 ), + SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7f0a ), SHC( 0xf055 ), SHC( 0x7c2a ), SHC( 0xe0e6 ), SHC( 0x776c ), SHC( 0xd1ef ), + SHC( 0x70e3 ), SHC( 0xc3a9 ), SHC( 0x68a7 ), SHC( 0xb64c ), SHC( 0x5ed7 ), SHC( 0xaa0a ), SHC( 0x539b ), SHC( 0x9f14 ), + SHC( 0x471d ), SHC( 0x9592 ), SHC( 0x398d ), SHC( 0x8dab ), SHC( 0x2b1f ), SHC( 0x877b ), SHC( 0x1c0c ), SHC( 0x831c ), + SHC( 0x0c8c ), SHC( 0x809e ), SHC( 0xfcdc ), SHC( 0x800a ), SHC( 0xed38 ), SHC( 0x8163 ), SHC( 0xdddc ), SHC( 0x84a3 ), + SHC( 0xcf04 ), SHC( 0x89be ), SHC( 0xc0e9 ), SHC( 0x90a1 ), SHC( 0xb3c0 ), SHC( 0x9930 ), SHC( 0xa7bd ), SHC( 0xa34c ), + SHC( 0x9d0e ), SHC( 0xaecc ), SHC( 0x93dc ), SHC( 0xbb85 ), SHC( 0x8c4a ), SHC( 0xc946 ), SHC( 0x8676 ), SHC( 0xd7d9 ), + SHC( 0x8276 ), SHC( 0xe707 ), SHC( 0x8059 ), SHC( 0xf695 ), SHC( 0x8027 ), SHC( 0x0648 ), SHC( 0x81e2 ), SHC( 0x15e2 ), + SHC( 0x8583 ), SHC( 0x2528 ), SHC( 0x8afb ), SHC( 0x33df ), SHC( 0x9236 ), SHC( 0x41ce ), SHC( 0x9b17 ), SHC( 0x4ec0 ), + SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7e9d ), SHC( 0xed38 ), SHC( 0x7a7d ), SHC( 0xdad8 ), SHC( 0x73b6 ), SHC( 0xc946 ), + SHC( 0x6a6e ), SHC( 0xb8e3 ), SHC( 0x5ed7 ), SHC( 0xaa0a ), SHC( 0x5134 ), SHC( 0x9d0e ), SHC( 0x41ce ), SHC( 0x9236 ), + SHC( 0x30fc ), SHC( 0x89be ), SHC( 0x1f1a ), SHC( 0x83d6 ), SHC( 0x0c8c ), SHC( 0x809e ), SHC( 0xf9b8 ), SHC( 0x8027 ), + SHC( 0xe707 ), SHC( 0x8276 ), SHC( 0xd4e1 ), SHC( 0x877b ), SHC( 0xc3a9 ), SHC( 0x8f1d ), SHC( 0xb3c0 ), SHC( 0x9930 ), + SHC( 0xa57e ), SHC( 0xa57e ), SHC( 0x9930 ), SHC( 0xb3c0 ), SHC( 0x8f1d ), SHC( 0xc3a9 ), SHC( 0x877b ), SHC( 0xd4e1 ), + SHC( 0x8276 ), SHC( 0xe707 ), SHC( 0x8027 ), SHC( 0xf9b8 ), SHC( 0x809e ), SHC( 0x0c8c ), SHC( 0x83d6 ), SHC( 0x1f1a ), + SHC( 0x89be ), SHC( 0x30fc ), SHC( 0x9236 ), SHC( 0x41ce ), SHC( 0x9d0e ), SHC( 0x5134 ), SHC( 0xaa0a ), SHC( 0x5ed7 ), + SHC( 0xb8e3 ), SHC( 0x6a6e ), SHC( 0xc946 ), SHC( 0x73b6 ), SHC( 0xdad8 ), SHC( 0x7a7d ), SHC( 0xed38 ), SHC( 0x7e9d ), + SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7e1e ), SHC( 0xea1e ), SHC( 0x7885 ), SHC( 0xd4e1 ), SHC( 0x6f5f ), SHC( 0xc0e9 ), + SHC( 0x62f2 ), SHC( 0xaecc ), SHC( 0x539b ), SHC( 0x9f14 ), SHC( 0x41ce ), SHC( 0x9236 ), SHC( 0x2e11 ), SHC( 0x8894 ), + SHC( 0x18f9 ), SHC( 0x8276 ), SHC( 0x0324 ), SHC( 0x800a ), SHC( 0xed38 ), SHC( 0x8163 ), SHC( 0xd7d9 ), SHC( 0x8676 ), + SHC( 0xc3a9 ), SHC( 0x8f1d ), SHC( 0xb140 ), SHC( 0x9b17 ), SHC( 0xa129 ), SHC( 0xaa0a ), SHC( 0x93dc ), SHC( 0xbb85 ), + SHC( 0x89be ), SHC( 0xcf04 ), SHC( 0x831c ), SHC( 0xe3f4 ), SHC( 0x8027 ), SHC( 0xf9b8 ), SHC( 0x80f6 ), SHC( 0x0fab ), + SHC( 0x8583 ), SHC( 0x2528 ), SHC( 0x8dab ), SHC( 0x398d ), SHC( 0x9930 ), SHC( 0x4c40 ), SHC( 0xa7bd ), SHC( 0x5cb4 ), + SHC( 0xb8e3 ), SHC( 0x6a6e ), SHC( 0xcc21 ), SHC( 0x7505 ), SHC( 0xe0e6 ), SHC( 0x7c2a ), SHC( 0xf695 ), SHC( 0x7fa7 ), + SHC( 0x0c8c ), SHC( 0x7f62 ), SHC( 0x2224 ), SHC( 0x7b5d ), SHC( 0x36ba ), SHC( 0x73b6 ), SHC( 0x49b4 ), SHC( 0x68a7 ) +}; + +/*-----------------------------------------------------------------* + * BASOP_fft8() + * + * Function performs a complex 8-point FFT + * The FFT is performed inplace. The result of the FFT + * is scaled by SCALEFACTOR8 bits. + * + * WOPS with 32x16 bit multiplications: 108 cycles + *-----------------------------------------------------------------*/ + +static void BASOP_fft8( + Word32 *re, + Word32 *im, + Word16 s ) +{ + Word32 x00, x01, x02, x03, x04, x05, x06, x07; + Word32 x08, x09, x10, x11, x12, x13, x14, x15; + Word32 t00, t01, t02, t03, t04, t05, t06, t07; + Word32 t08, t09, t10, t11, t12, t13, t14, t15; + Word32 s00, s01, s02, s03, s04, s05, s06, s07; + Word32 s08, s09, s10, s11, s12, s13, s14, s15; + + + /* Pre-additions */ + + x00 = L_shr( re[s * 0], SCALEFACTOR8 ); + x01 = L_shr( im[s * 0], SCALEFACTOR8 ); + x02 = L_shr( re[s * 1], SCALEFACTOR8 ); + x03 = L_shr( im[s * 1], SCALEFACTOR8 ); + x04 = L_shr( re[s * 2], SCALEFACTOR8 ); + x05 = L_shr( im[s * 2], SCALEFACTOR8 ); + x06 = L_shr( re[s * 3], SCALEFACTOR8 ); + x07 = L_shr( im[s * 3], SCALEFACTOR8 ); + x08 = L_shr( re[s * 4], SCALEFACTOR8 ); + x09 = L_shr( im[s * 4], SCALEFACTOR8 ); + x10 = L_shr( re[s * 5], SCALEFACTOR8 ); + x11 = L_shr( im[s * 5], SCALEFACTOR8 ); + x12 = L_shr( re[s * 6], SCALEFACTOR8 ); + x13 = L_shr( im[s * 6], SCALEFACTOR8 ); + x14 = L_shr( re[s * 7], SCALEFACTOR8 ); + x15 = L_shr( im[s * 7], SCALEFACTOR8 ); + + t00 = L_add( x00, x08 ); + t02 = L_sub( x00, x08 ); + t01 = L_add( x01, x09 ); + t03 = L_sub( x01, x09 ); + t04 = L_add( x02, x10 ); + t06 = L_sub( x02, x10 ); + t05 = L_add( x03, x11 ); + t07 = L_sub( x03, x11 ); + t08 = L_add( x04, x12 ); + t10 = L_sub( x04, x12 ); + t09 = L_add( x05, x13 ); + t11 = L_sub( x05, x13 ); + t12 = L_add( x06, x14 ); + t14 = L_sub( x06, x14 ); + t13 = L_add( x07, x15 ); + t15 = L_sub( x07, x15 ); + + /* Pre-additions and core multiplications */ + + s00 = L_add( t00, t08 ); + s04 = L_sub( t00, t08 ); + s01 = L_add( t01, t09 ); + s05 = L_sub( t01, t09 ); + s08 = L_sub( t02, t11 ); + s10 = L_add( t02, t11 ); + s09 = L_add( t03, t10 ); + s11 = L_sub( t03, t10 ); + s02 = L_add( t04, t12 ); + s07 = L_sub( t04, t12 ); + s03 = L_add( t05, t13 ); + s06 = L_sub( t13, t05 ); + + t01 = L_add( t06, t14 ); + t02 = L_sub( t06, t14 ); + t00 = L_add( t07, t15 ); + t03 = L_sub( t07, t15 ); + + s12 = Mpy_32_16( L_add( t00, t02 ), C81_FX ); + s14 = Mpy_32_16( L_sub( t00, t02 ), C81_FX ); + s13 = Mpy_32_16( L_sub( t03, t01 ), C81_FX ); + s15 = Mpy_32_16( L_add( t01, t03 ), C82_FX ); + + /* Post-additions */ + + re[s * 0] = L_add( s00, s02 ); + move32(); + re[s * 4] = L_sub( s00, s02 ); + move32(); + im[s * 0] = L_add( s01, s03 ); + move32(); + im[s * 4] = L_sub( s01, s03 ); + move32(); + re[s * 2] = L_sub( s04, s06 ); + move32(); + re[s * 6] = L_add( s04, s06 ); + move32(); + im[s * 2] = L_sub( s05, s07 ); + move32(); + im[s * 6] = L_add( s05, s07 ); + move32(); + re[s * 3] = L_add( s08, s14 ); + move32(); + re[s * 7] = L_sub( s08, s14 ); + move32(); + im[s * 3] = L_add( s09, s15 ); + move32(); + im[s * 7] = L_sub( s09, s15 ); + move32(); + re[s * 1] = L_add( s10, s12 ); + move32(); + re[s * 5] = L_sub( s10, s12 ); + move32(); + im[s * 1] = L_add( s11, s13 ); + move32(); + im[s * 5] = L_sub( s11, s13 ); + move32(); + + return; +} + + +/*-----------------------------------------------------------------* + * fftN2() + * + * Combined FFT + *-----------------------------------------------------------------*/ + +static void BASOP_fftN2( + Word32 *re, /* i/o: real part */ + Word32 *im, /* i/o: imag part */ + const Word16 *W, /* i : rotation factor */ + Word16 dim1, /* i : length of fft1 */ + Word16 dim2, /* i : length of fft2 */ + Word16 sx, /* i : stride real and imag part */ + Word16 sc, /* i : stride phase rotation coefficients */ + Word32 *x, /* tmp: 32-bit workbuffer */ + Word16 Woff /* i : offset for addressing the rotation vector table */ +) +{ + Word16 i, j; + Word32 x00, x01, x02, x03, x04, x05, x06, x07, x08, x09, x10, x11, x12, x13, x14, x15; + Word32 t00, t01, t02, t03, t04, t05, t06, t07, t08, t09, t10, t11, t12, t13, t14, t15; + Word32 s00, s01, s02, s03, s04, s05, s06, s07, s08, s09, s10, s11, s12, s13, s14, s15; + + FOR( i = 0; i < dim2; i++ ) + { + FOR( j = 0; j < dim1; j++ ) + { + x[2 * i * dim1 + 2 * j] = re[sx * i + sx * j * dim2]; + move32(); + x[2 * i * dim1 + 2 * j + 1] = im[sx * i + sx * j * dim2]; + move32(); + } + } + + /* dim1 == 8 */ + FOR( i = 0; i < dim2; i++ ) + { + BASOP_fft8( &x[i * 2 * dim1], &x[i * 2 * dim1 + 1], 2 ); + } + + /* dim2 == 8 */ + FOR( i = 0; i < dim1; i++ ) + { + cplxMpy4_8_1( x00, x01, x[2 * i + 2 * 0 * dim1], x[2 * i + 2 * 0 * dim1 + 1] ); + + IF( i == 0 ) + { + cplxMpy4_8_1( x02, x03, x[2 * i + 2 * 1 * dim1], x[2 * i + 2 * 1 * dim1 + 1] ); + cplxMpy4_8_1( x04, x05, x[2 * i + 2 * 2 * dim1], x[2 * i + 2 * 2 * dim1 + 1] ); + cplxMpy4_8_1( x06, x07, x[2 * i + 2 * 3 * dim1], x[2 * i + 2 * 3 * dim1 + 1] ); + cplxMpy4_8_1( x08, x09, x[2 * i + 2 * 4 * dim1], x[2 * i + 2 * 4 * dim1 + 1] ); + cplxMpy4_8_1( x10, x11, x[2 * i + 2 * 5 * dim1], x[2 * i + 2 * 5 * dim1 + 1] ); + cplxMpy4_8_1( x12, x13, x[2 * i + 2 * 6 * dim1], x[2 * i + 2 * 6 * dim1 + 1] ); + cplxMpy4_8_1( x14, x15, x[2 * i + 2 * 7 * dim1], x[2 * i + 2 * 7 * dim1 + 1] ); + } + ELSE + { + cplxMpy4_8_0( x02, x03, x[2 * i + 2 * 1 * dim1], x[2 * i + 2 * 1 * dim1 + 1], W[sc * i + sc * 1 * dim1 - Woff], W[sc * i + sc * 1 * dim1 + 1 - Woff] ); + cplxMpy4_8_0( x04, x05, x[2 * i + 2 * 2 * dim1], x[2 * i + 2 * 2 * dim1 + 1], W[sc * i + sc * 2 * dim1 - Woff], W[sc * i + sc * 2 * dim1 + 1 - Woff] ); + cplxMpy4_8_0( x06, x07, x[2 * i + 2 * 3 * dim1], x[2 * i + 2 * 3 * dim1 + 1], W[sc * i + sc * 3 * dim1 - Woff], W[sc * i + sc * 3 * dim1 + 1 - Woff] ); + cplxMpy4_8_0( x08, x09, x[2 * i + 2 * 4 * dim1], x[2 * i + 2 * 4 * dim1 + 1], W[sc * i + sc * 4 * dim1 - Woff], W[sc * i + sc * 4 * dim1 + 1 - Woff] ); + cplxMpy4_8_0( x10, x11, x[2 * i + 2 * 5 * dim1], x[2 * i + 2 * 5 * dim1 + 1], W[sc * i + sc * 5 * dim1 - Woff], W[sc * i + sc * 5 * dim1 + 1 - Woff] ); + cplxMpy4_8_0( x12, x13, x[2 * i + 2 * 6 * dim1], x[2 * i + 2 * 6 * dim1 + 1], W[sc * i + sc * 6 * dim1 - Woff], W[sc * i + sc * 6 * dim1 + 1 - Woff] ); + cplxMpy4_8_0( x14, x15, x[2 * i + 2 * 7 * dim1], x[2 * i + 2 * 7 * dim1 + 1], W[sc * i + sc * 7 * dim1 - Woff], W[sc * i + sc * 7 * dim1 + 1 - Woff] ); + } + t00 = L_shr( L_add( x00, x08 ), SCALEFACTORN2 - 1 ); + t02 = L_shr( L_sub( x00, x08 ), SCALEFACTORN2 - 1 ); + t01 = L_shr( L_add( x01, x09 ), SCALEFACTORN2 - 1 ); + t03 = L_shr( L_sub( x01, x09 ), SCALEFACTORN2 - 1 ); + t04 = L_shr( L_add( x02, x10 ), SCALEFACTORN2 - 1 ); + t06 = L_sub( x02, x10 ); + t05 = L_shr( L_add( x03, x11 ), SCALEFACTORN2 - 1 ); + t07 = L_sub( x03, x11 ); + t08 = L_shr( L_add( x04, x12 ), SCALEFACTORN2 - 1 ); + t10 = L_shr( L_sub( x04, x12 ), SCALEFACTORN2 - 1 ); + t09 = L_shr( L_add( x05, x13 ), SCALEFACTORN2 - 1 ); + t11 = L_shr( L_sub( x05, x13 ), SCALEFACTORN2 - 1 ); + t12 = L_shr( L_add( x06, x14 ), SCALEFACTORN2 - 1 ); + t14 = L_sub( x06, x14 ); + t13 = L_shr( L_add( x07, x15 ), SCALEFACTORN2 - 1 ); + t15 = L_sub( x07, x15 ); + + s00 = L_add( t00, t08 ); + s04 = L_sub( t00, t08 ); + s01 = L_add( t01, t09 ); + s05 = L_sub( t01, t09 ); + s08 = L_sub( t02, t11 ); + s10 = L_add( t02, t11 ); + s09 = L_add( t03, t10 ); + s11 = L_sub( t03, t10 ); + s02 = L_add( t04, t12 ); + s07 = L_sub( t04, t12 ); + s03 = L_add( t05, t13 ); + s06 = L_sub( t13, t05 ); + + t01 = L_shr( L_add( t06, t14 ), SCALEFACTORN2 - 1 ); + t02 = L_shr( L_sub( t06, t14 ), SCALEFACTORN2 - 1 ); + t00 = L_shr( L_add( t07, t15 ), SCALEFACTORN2 - 1 ); + t03 = L_shr( L_sub( t07, t15 ), SCALEFACTORN2 - 1 ); + + s12 = Mpy_32_16( L_add( t00, t02 ), C81_FX ); + s14 = Mpy_32_16( L_sub( t00, t02 ), C81_FX ); + s13 = Mpy_32_16( L_sub( t03, t01 ), C81_FX ); + s15 = Mpy_32_16( L_add( t01, t03 ), C82_FX ); + + re[sx * i + sx * 0 * dim1] = L_add( s00, s02 ); + move32(); + im[sx * i + sx * 0 * dim1] = L_add( s01, s03 ); + move32(); + re[sx * i + sx * 1 * dim1] = L_add( s10, s12 ); + move32(); + im[sx * i + sx * 1 * dim1] = L_add( s11, s13 ); + move32(); + re[sx * i + sx * 2 * dim1] = L_sub( s04, s06 ); + move32(); + im[sx * i + sx * 2 * dim1] = L_sub( s05, s07 ); + move32(); + re[sx * i + sx * 3 * dim1] = L_add( s08, s14 ); + move32(); + im[sx * i + sx * 3 * dim1] = L_add( s09, s15 ); + move32(); + re[sx * i + sx * 4 * dim1] = L_sub( s00, s02 ); + move32(); + im[sx * i + sx * 4 * dim1] = L_sub( s01, s03 ); + move32(); + re[sx * i + sx * 5 * dim1] = L_sub( s10, s12 ); + move32(); + im[sx * i + sx * 5 * dim1] = L_sub( s11, s13 ); + move32(); + re[sx * i + sx * 6 * dim1] = L_add( s04, s06 ); + move32(); + im[sx * i + sx * 6 * dim1] = L_add( s05, s07 ); + move32(); + re[sx * i + sx * 7 * dim1] = L_sub( s08, s14 ); + move32(); + im[sx * i + sx * 7 * dim1] = L_sub( s09, s15 ); + move32(); + } + + return; +} + + +/*-----------------------------------------------------------------* + * BASOP_cfft() + * + * Complex valued FFT + *-----------------------------------------------------------------*/ + +void BASOP_cfft( + Word32 *re, /* i/o: real part */ + Word32 *im, /* i/o: imag part */ + Word16 s, /* i : stride real and imag part */ + Word16 *scale /* i : scalefactor */ +) +{ + Word32 x[2 * 64]; + + /* FFT for len = FDNS_NPTS */ + BASOP_fftN2( re, im, RotVector_256, 8, 8, s, 8, x, 64 ); + s = add( *scale, SCALEFACTOR64 ); + + *scale = s; + move16(); + + return; +} + +#undef WMC_TOOL_SKIP diff --git a/lib_com/fft_cldfb.c b/lib_com/fft_cldfb.c new file mode 100644 index 0000000000000000000000000000000000000000..0ea848abdbba069cd73569df5054e417386a65fa --- /dev/null +++ b/lib_com/fft_cldfb.c @@ -0,0 +1,1223 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "prot.h" +#include "ivas_cnst.h" +#include "wmc_auto.h" + +#if __STDC_VERSION__ >= 199901L +#if defined __ICL +#define restrict __restrict +#endif +#else +#define restrict +#endif + + +static void fft8( float *vec ); +static void fft10( float *vec ); +static void fft16( float *vec ); +static void fft20( float *vec ); +static void fft30( float *vec ); +static void fft5s( float *x, const int16_t stride ); + + +#define COS_PI_DIV8 9.238795325112867e-1f +#define COS_3PI_DIV8 3.826834323650898e-1f +#define SQRT2PLUS1 2.414213562373095f +#define SQRT2MINUS1 4.142135623730952e-1f + + +/******************************************************************************* + Functionname: fft8 + ******************************************************************************* + + Description: 8-point FFT. Complex-valued input takes 52 real additions + and 4 real multiplications. + + Arguments: vec - pointer to data (interleaved real / imaginary parts) + + Return: none + +*******************************************************************************/ +static void fft8( float *restrict vec ) +{ + float temp1[16]; + float temp2[16]; + + + /* Pre-additions */ + temp1[0] = vec[0] + vec[8]; + temp1[2] = vec[0] - vec[8]; + temp1[1] = vec[1] + vec[9]; + temp1[3] = vec[1] - vec[9]; + temp1[4] = vec[2] + vec[10]; + temp1[6] = vec[2] - vec[10]; + temp1[5] = vec[3] + vec[11]; + temp1[7] = vec[3] - vec[11]; + temp1[8] = vec[4] + vec[12]; + temp1[10] = vec[4] - vec[12]; + temp1[9] = vec[5] + vec[13]; + temp1[11] = vec[5] - vec[13]; + temp1[12] = vec[6] + vec[14]; + temp1[14] = vec[6] - vec[14]; + temp1[13] = vec[7] + vec[15]; + temp1[15] = vec[7] - vec[15]; + + /* Pre-additions and core multiplications */ + temp2[0] = temp1[0] + temp1[8]; + temp2[4] = temp1[0] - temp1[8]; + temp2[1] = temp1[1] + temp1[9]; + temp2[5] = temp1[1] - temp1[9]; + temp2[8] = temp1[2] - temp1[11]; + temp2[10] = temp1[2] + temp1[11]; + temp2[9] = temp1[3] + temp1[10]; + temp2[11] = temp1[3] - temp1[10]; + temp2[2] = temp1[4] + temp1[12]; + temp2[7] = temp1[4] - temp1[12]; + temp2[3] = temp1[5] + temp1[13]; + temp2[6] = temp1[13] - temp1[5]; + + temp1[1] = temp1[6] + temp1[14]; + temp1[2] = temp1[6] - temp1[14]; + temp1[0] = temp1[7] + temp1[15]; + temp1[3] = temp1[7] - temp1[15]; + + temp2[12] = ( temp1[0] + temp1[2] ) * INV_SQRT2; + temp2[14] = ( temp1[0] - temp1[2] ) * INV_SQRT2; + temp2[13] = ( temp1[3] - temp1[1] ) * INV_SQRT2; + temp2[15] = ( temp1[1] + temp1[3] ) * -INV_SQRT2; + + /* Post-additions */ + vec[0] = temp2[0] + temp2[2]; + vec[8] = temp2[0] - temp2[2]; + vec[1] = temp2[1] + temp2[3]; + vec[9] = temp2[1] - temp2[3]; + vec[4] = temp2[4] - temp2[6]; + vec[12] = temp2[4] + temp2[6]; + vec[5] = temp2[5] - temp2[7]; + vec[13] = temp2[5] + temp2[7]; + vec[6] = temp2[8] + temp2[14]; + vec[14] = temp2[8] - temp2[14]; + vec[7] = temp2[9] + temp2[15]; + vec[15] = temp2[9] - temp2[15]; + vec[2] = temp2[10] + temp2[12]; + vec[10] = temp2[10] - temp2[12]; + vec[3] = temp2[11] + temp2[13]; + vec[11] = temp2[11] - temp2[13]; + + return; +} + + +/******************************************************************************* + Functionname: fft16 + ******************************************************************************* + + Description: 16-point FFT. Complex-valued input takes 144 real additions and + 24 real multiplications. + + Arguments: vec - pointer to data (interleaved real / imaginary parts) + + Return: none + +*******************************************************************************/ +/* fast implementation, completely unrolled and inlined */ +static void fft16( float *restrict vec ) +{ + float temp10, temp11, temp12, temp13, temp14, temp15, temp16, temp17, + temp18, temp19, temp110, temp111, temp112, temp113, temp114, temp115; + float temp20, temp21, temp22, temp23, temp24, temp25, temp26, temp27, + temp28, temp29, temp210, temp211, temp212, temp213, temp214, temp215; + float vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7, + vec8, vec9, vec10, vec11, vec12, vec13, vec14, vec15; + + + /* even */ + vec0 = vec[0] + vec[16]; + vec1 = vec[1] + vec[17]; + vec2 = vec[2] + vec[18]; + vec3 = vec[3] + vec[19]; + vec4 = vec[4] + vec[20]; + vec5 = vec[5] + vec[21]; + vec6 = vec[6] + vec[22]; + vec7 = vec[7] + vec[23]; + vec8 = vec[8] + vec[24]; + vec9 = vec[9] + vec[25]; + vec10 = vec[10] + vec[26]; + vec11 = vec[11] + vec[27]; + vec12 = vec[12] + vec[28]; + vec13 = vec[13] + vec[29]; + vec14 = vec[14] + vec[30]; + vec15 = vec[15] + vec[31]; + + /* Pre-additions */ + temp10 = vec0 + vec8; + temp12 = vec0 - vec8; + temp11 = vec1 + vec9; + temp13 = vec1 - vec9; + temp14 = vec2 + vec10; + temp16 = vec2 - vec10; + temp15 = vec3 + vec11; + temp17 = vec3 - vec11; + temp18 = vec4 + vec12; + temp110 = vec4 - vec12; + temp19 = vec5 + vec13; + temp111 = vec5 - vec13; + temp112 = vec6 + vec14; + temp114 = vec6 - vec14; + temp113 = vec7 + vec15; + temp115 = vec7 - vec15; + + /* Pre-additions and core multiplications */ + temp20 = temp10 + temp18; + temp24 = temp10 - temp18; + temp21 = temp11 + temp19; + temp25 = temp11 - temp19; + temp28 = temp12 - temp111; + temp210 = temp12 + temp111; + temp29 = temp13 + temp110; + temp211 = temp13 - temp110; + temp22 = temp14 + temp112; + temp27 = temp14 - temp112; + temp23 = temp15 + temp113; + temp26 = temp113 - temp15; + + temp11 = temp16 + temp114; + temp12 = temp16 - temp114; + temp10 = temp17 + temp115; + temp13 = temp17 - temp115; + + temp212 = ( temp10 + temp12 ) * INV_SQRT2; + temp214 = ( temp10 - temp12 ) * INV_SQRT2; + temp213 = ( temp13 - temp11 ) * INV_SQRT2; + temp215 = ( temp11 + temp13 ) * -INV_SQRT2; + + + /* odd */ + vec0 = vec[0] - vec[16]; + vec1 = vec[1] - vec[17]; + vec2 = vec[2] - vec[18]; + vec3 = vec[3] - vec[19]; + vec4 = vec[4] - vec[20]; + vec5 = vec[5] - vec[21]; + vec6 = vec[6] - vec[22]; + vec7 = vec[7] - vec[23]; + vec8 = vec[8] - vec[24]; + vec9 = vec[9] - vec[25]; + vec10 = vec[10] - vec[26]; + vec11 = vec[11] - vec[27]; + vec12 = vec[12] - vec[28]; + vec13 = vec[13] - vec[29]; + vec14 = vec[14] - vec[30]; + vec15 = vec[15] - vec[31]; + + /* Pre-additions and core multiplications */ + temp19 = ( vec2 + vec14 ) * -COS_3PI_DIV8; + temp110 = ( vec2 - vec14 ) * COS_PI_DIV8; + temp18 = ( vec3 + vec15 ) * COS_3PI_DIV8; + temp111 = ( vec3 - vec15 ) * COS_PI_DIV8; + temp15 = ( vec4 + vec12 ) * -INV_SQRT2; + temp16 = ( vec4 - vec12 ) * INV_SQRT2; + temp14 = ( vec5 + vec13 ) * INV_SQRT2; + temp17 = ( vec5 - vec13 ) * INV_SQRT2; + temp113 = ( vec6 + vec10 ) * -COS_PI_DIV8; + temp114 = ( vec6 - vec10 ) * COS_3PI_DIV8; + temp112 = ( vec7 + vec11 ) * COS_PI_DIV8; + temp115 = ( vec7 - vec11 ) * COS_3PI_DIV8; + + /* Core multiplications */ + vec2 = temp18 * SQRT2PLUS1 - temp112 * SQRT2MINUS1; + vec3 = temp19 * SQRT2PLUS1 - temp113 * SQRT2MINUS1; + vec4 = temp110 * SQRT2MINUS1 - temp114 * SQRT2PLUS1; + vec5 = temp111 * SQRT2MINUS1 - temp115 * SQRT2PLUS1; + + /* Post-additions */ + temp18 += temp112; + temp19 += temp113; + temp110 += temp114; + temp111 += temp115; + + vec6 = vec0 + temp14; + vec10 = vec0 - temp14; + vec7 = vec1 + temp15; + vec11 = vec1 - temp15; + + vec12 = temp16 - vec9; + vec14 = temp16 + vec9; + vec13 = vec8 + temp17; + vec15 = vec8 - temp17; + + temp10 = vec6 - vec14; + temp12 = vec6 + vec14; + temp11 = vec7 + vec15; + temp13 = vec7 - vec15; + temp14 = vec10 + vec12; + temp16 = vec10 - vec12; + temp15 = vec11 + vec13; + temp17 = vec11 - vec13; + + vec10 = temp18 + temp110; + temp110 = temp18 - temp110; + vec11 = temp19 + temp111; + temp111 = temp19 - temp111; + + temp112 = vec2 + vec4; + temp114 = vec2 - vec4; + temp113 = vec3 + vec5; + temp115 = vec3 - vec5; + + + /* Post-additions */ + *vec++ = temp20 + temp22; + *vec++ = temp21 + temp23; + *vec++ = temp12 + vec10; + *vec++ = temp13 + vec11; + *vec++ = temp210 + temp212; + *vec++ = temp211 + temp213; + *vec++ = temp10 + temp112; + *vec++ = temp11 + temp113; + *vec++ = temp24 - temp26; + *vec++ = temp25 - temp27; + *vec++ = temp16 + temp114; + *vec++ = temp17 + temp115; + *vec++ = temp28 + temp214; + *vec++ = temp29 + temp215; + *vec++ = temp14 + temp110; + *vec++ = temp15 + temp111; + *vec++ = temp20 - temp22; + *vec++ = temp21 - temp23; + *vec++ = temp12 - vec10; + *vec++ = temp13 - vec11; + *vec++ = temp210 - temp212; + *vec++ = temp211 - temp213; + *vec++ = temp10 - temp112; + *vec++ = temp11 - temp113; + *vec++ = temp24 + temp26; + *vec++ = temp25 + temp27; + *vec++ = temp16 - temp114; + *vec++ = temp17 - temp115; + *vec++ = temp28 - temp214; + *vec++ = temp29 - temp215; + *vec++ = temp14 - temp110; + *vec++ = temp15 - temp111; + + return; +} + + +/******************************************************************************* + Functionname: fft15 + ******************************************************************************* + + Description: 15-point FFT. Complex-valued input takes 176 real additions + and 34 real multiplications. + + Arguments: vec - pointer to data (interleaved real / imaginary parts) + + Return: none + +*******************************************************************************/ +static void fft15( float *restrict vec ) +{ + + float r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, r13, r14, r15, r16, r17; + float i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17; + float tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8, tmp9, + tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16, tmp17, tmp18, tmp19, + tmp20, tmp21, tmp22, tmp23, tmp24, tmp25, tmp26, tmp27, tmp28, tmp29; + + + /* Pre-additions real part */ + r1 = vec[2] + vec[8]; + r2 = vec[2] - vec[8]; + r3 = vec[4] + vec[16]; + r4 = vec[4] - vec[16]; + r5 = vec[6] + vec[24]; + r6 = vec[6] - vec[24]; + r7 = vec[10] + vec[20]; + r8 = vec[10] - vec[20]; + r9 = vec[12] + vec[18]; + r10 = vec[12] - vec[18]; + r11 = vec[14] + vec[26]; + r12 = vec[14] - vec[26]; + r13 = vec[22] + vec[28]; + r14 = vec[22] - vec[28]; + + tmp2 = r1 + r3; + tmp4 = r1 - r3; + tmp6 = r2 + r14; + tmp8 = r2 - r14; + tmp10 = r4 + r12; + tmp12 = r4 - r12; + tmp14 = r5 + r9; + tmp16 = r5 - r9; + tmp18 = r11 + r13; + tmp20 = r11 - r13; + + /* Pre-additions imaginary part */ + i1 = vec[3] + vec[9]; + i2 = vec[3] - vec[9]; + i3 = vec[5] + vec[17]; + i4 = vec[5] - vec[17]; + i5 = vec[7] + vec[25]; + i6 = vec[7] - vec[25]; + i7 = vec[11] + vec[21]; + i8 = vec[11] - vec[21]; + i9 = vec[13] + vec[19]; + i10 = vec[13] - vec[19]; + i11 = vec[15] + vec[27]; + i12 = vec[15] - vec[27]; + i13 = vec[23] + vec[29]; + i14 = vec[23] - vec[29]; + + tmp3 = i1 + i3; + tmp5 = i1 - i3; + tmp7 = i2 + i14; + tmp9 = i2 - i14; + tmp11 = i4 + i12; + tmp13 = i4 - i12; + tmp15 = i5 + i9; + tmp17 = i5 - i9; + tmp19 = i11 + i13; + tmp21 = i11 - i13; + + + /* Pre-additions and core multiplications */ + tmp28 = tmp4 + tmp20; + tmp29 = tmp5 + tmp21; + r4 = tmp2 + tmp18; + i4 = tmp3 + tmp19; + r3 = ( r4 + tmp14 ) * -1.25f; + i3 = ( i4 + tmp15 ) * -1.25f; + r2 = ( tmp29 - i8 ) * -8.660254037844387e-1f; + i2 = ( tmp28 - r8 ) * 8.660254037844387e-1f; + r1 = r4 + r7; + i1 = i4 + i7; + r0 = r1 + vec[0] + tmp14; + i0 = i1 + vec[1] + tmp15; + r7 = tmp4 - tmp20; + i7 = tmp5 - tmp21; + r8 = ( tmp3 - tmp19 ) * -4.841229182759272e-1f; + i8 = ( tmp2 - tmp18 ) * 4.841229182759272e-1f; + tmp0 = tmp6 + r10; + tmp1 = tmp7 + i10; + tmp2 = r6 - tmp10; + tmp3 = i6 - tmp11; + r10 = tmp7 * -2.308262652881440f; + i10 = tmp6 * 2.308262652881440f; + r11 = tmp8 * 1.332676064001459f; + i11 = tmp9 * 1.332676064001459f; + r6 = ( r7 - tmp16 ) * 5.590169943749475e-1f; + i6 = ( i7 - tmp17 ) * 5.590169943749475e-1f; + r12 = ( tmp1 + tmp3 ) * 5.877852522924733e-1f; + i12 = ( tmp0 + tmp2 ) * -5.877852522924733e-1f; + r13 = ( tmp7 - tmp11 ) * -8.816778784387098e-1f; + i13 = ( tmp6 - tmp10 ) * 8.816778784387098e-1f; + r14 = ( tmp8 + tmp12 ) * 5.090369604551274e-1f; + i14 = ( tmp9 + tmp13 ) * 5.090369604551274e-1f; + r16 = tmp11 * 5.449068960040204e-1f; + i16 = tmp10 * -5.449068960040204e-1f; + r17 = tmp12 * 3.146021430912046e-1f; + i17 = tmp13 * 3.146021430912046e-1f; + + r4 *= 1.875f; + i4 *= 1.875f; + r1 *= -1.5f; + i1 *= -1.5f; + r7 *= -8.385254915624212e-1f; + i7 *= -8.385254915624212e-1f; + r5 = tmp29 * 1.082531754730548f; + i5 = tmp28 * -1.082531754730548f; + r9 = tmp1 * 1.538841768587627f; + i9 = tmp0 * -1.538841768587627f; + r15 = tmp3 * 3.632712640026803e-1f; + i15 = tmp2 * -3.632712640026803e-1f; + + + /* Post-additions real part */ + tmp2 = r0 + r1; + tmp4 = r3 + r6; + tmp6 = r3 - r6; + tmp8 = r4 + r5; + tmp10 = r4 - r5; + tmp12 = r7 + r8; + tmp14 = r7 - r8; + tmp16 = r13 + r16; + tmp18 = r14 + r17; + tmp20 = r10 - r13; + tmp22 = r11 - r14; + tmp24 = r12 + r15; + tmp26 = r12 - r9; + + r1 = tmp2 + r2; + r2 = tmp2 - r2; + r3 = tmp4 + tmp26; + r4 = tmp4 - tmp26; + r5 = tmp6 + tmp24; + r6 = tmp6 - tmp24; + r7 = tmp16 + tmp18; + r8 = tmp16 - tmp18; + r9 = tmp20 - tmp22; + r10 = tmp20 + tmp22; + r11 = r1 + tmp8; + r12 = r2 + tmp10; + r13 = r11 - tmp12; + r14 = r12 - tmp14; + r15 = r12 + tmp14; + r16 = r11 + tmp12; + + /* Post-additions imaginary part */ + tmp3 = i0 + i1; + tmp5 = i3 + i6; + tmp7 = i3 - i6; + tmp9 = i4 + i5; + tmp11 = i4 - i5; + tmp13 = i7 + i8; + tmp15 = i7 - i8; + tmp17 = i13 + i16; + tmp19 = i14 + i17; + tmp21 = i10 - i13; + tmp23 = i11 - i14; + tmp25 = i12 + i15; + tmp27 = i12 - i9; + + i1 = tmp3 + i2; + i2 = tmp3 - i2; + i3 = tmp5 + tmp27; + i4 = tmp5 - tmp27; + i5 = tmp7 + tmp25; + i6 = tmp7 - tmp25; + i7 = tmp17 + tmp19; + i8 = tmp17 - tmp19; + i9 = tmp21 - tmp23; + i10 = tmp21 + tmp23; + i11 = i1 + tmp9; + i12 = i2 + tmp11; + i13 = i11 - tmp13; + i14 = i12 - tmp15; + i15 = i12 + tmp15; + i16 = i11 + tmp13; + + *vec++ = r0; + *vec++ = i0; + *vec++ = r13 + r5 + r7; + *vec++ = i13 + i5 + i7; + *vec++ = r15 + r3 - r9; + *vec++ = i15 + i3 - i9; + *vec++ = r0 + r4; + *vec++ = i0 + i4; + *vec++ = r13 + r6 - r7; + *vec++ = i13 + i6 - i7; + *vec++ = r2; + *vec++ = i2; + *vec++ = r0 + r5; + *vec++ = i0 + i5; + *vec++ = r16 + r3 - r10; + *vec++ = i16 + i3 - i10; + *vec++ = r15 + r4 + r9; + *vec++ = i15 + i4 + i9; + *vec++ = r0 + r6; + *vec++ = i0 + i6; + *vec++ = r1; + *vec++ = i1; + *vec++ = r14 + r5 + r8; + *vec++ = i14 + i5 + i8; + *vec++ = r0 + r3; + *vec++ = i0 + i3; + *vec++ = r16 + r4 + r10; + *vec++ = i16 + i4 + i10; + *vec++ = r14 + r6 - r8; + *vec++ = i14 + i6 - i8; + + return; +} + +/******************************************************************************* + Functionname: fft5s + ******************************************************************************* + + Description: 5-point FFT. + + Arguments: x - pointer to input data (interleaved real / imaginary parts) + stride - stride for input data + + Return: none + +*******************************************************************************/ +static const float C51 = 0.9510565162951535f; +static const float C52 = -1.5388417685876270f; +static const float C53 = -0.3632712640026803f; +static const float C54 = 0.5590169943749475f; +static const float C55 = -1.25f; + +static void fft5s( float *x, const int16_t stride ) +{ + float r1, r2, r3, r4; + float s1, s2, s3, s4; + float t; + /* real part */ + r1 = x[1 * stride] + x[4 * stride]; + r4 = x[1 * stride] - x[4 * stride]; + r3 = x[2 * stride] + x[3 * stride]; + r2 = x[2 * stride] - x[3 * stride]; + t = ( r1 - r3 ) * C54; + r1 = r1 + r3; + x[0] = x[0] + r1; + r1 = x[0] + ( r1 * C55 ); + r3 = r1 - t; + r1 = r1 + t; + t = ( r4 + r2 ) * C51; + r4 = t + ( r4 * C52 ); + r2 = t + ( r2 * C53 ); + + /* imaginary part */ + s1 = x[1 * stride + 1] + x[4 * stride + 1]; + s4 = x[1 * stride + 1] - x[4 * stride + 1]; + s3 = x[2 * stride + 1] + x[3 * stride + 1]; + s2 = x[2 * stride + 1] - x[3 * stride + 1]; + t = ( s1 - s3 ) * C54; + s1 = s1 + s3; + x[1] = x[1] + s1; + s1 = x[1] + ( s1 * C55 ); + s3 = s1 - t; + s1 = s1 + t; + t = ( s4 + s2 ) * C51; + s4 = t + ( s4 * C52 ); + s2 = t + ( s2 * C53 ); + + /* combination */ + x[1 * stride] = r1 + s2; + x[4 * stride] = r1 - s2; + x[2 * stride] = r3 - s4; + x[3 * stride] = r3 + s4; + + x[1 * stride + 1] = s1 - r2; + x[4 * stride + 1] = s1 + r2; + x[2 * stride + 1] = s3 + r4; + x[3 * stride + 1] = s3 - r4; +} + + +/** + * \brief Function performs a complex 10-point FFT + * The FFT is performed inplace. The result of the FFT + * is scaled by SCALEFACTOR10 bits. + * + * WOPS FLC version: 1093 cycles + * WOPS with 32x16 bit multiplications: 196 cycles + * + * \param [i/o] re real input / output + * \param [i/o] im imag input / output + * \param [i ] s stride real and imag input / output + * + * \return void + */ +static void fft10( float *restrict vec ) +{ + float t; + float r1, r2, r3, r4; + float s1, s2, s3, s4; + float y00, y01, y02, y03, y04, y05, y06, y07, y08, y09; + float y10, y11, y12, y13, y14, y15, y16, y17, y18, y19; + + /* 2 fft5 stages */ + + /* real part */ + r1 = vec[12] + vec[8]; + r4 = vec[12] - vec[8]; + r3 = vec[4] + vec[16]; + r2 = vec[4] - vec[16]; + t = ( r1 - r3 ) * C54; + r1 = r1 + r3; + y00 = vec[0] + r1; + r1 = y00 + ( r1 * C55 ); + r3 = r1 - t; + r1 = r1 + t; + t = ( r4 + r2 ) * C51; + r4 = t + ( r4 * C52 ); + r2 = t + ( r2 * C53 ); + + /* imaginary part */ + s1 = vec[13] + vec[9]; + s4 = vec[13] - vec[9]; + s3 = vec[5] + vec[17]; + s2 = vec[5] - vec[17]; + t = ( s1 - s3 ) * C54; + s1 = s1 + s3; + y01 = vec[1] + s1; + s1 = y01 + ( s1 * C55 ); + s3 = s1 - t; + s1 = s1 + t; + t = ( s4 + s2 ) * C51; + s4 = t + ( s4 * C52 ); + s2 = t + ( s2 * C53 ); + + /* combination */ + y04 = r1 + s2; + y16 = r1 - s2; + y08 = r3 - s4; + y12 = r3 + s4; + y05 = s1 - r2; + y17 = s1 + r2; + y09 = s3 + r4; + y13 = s3 - r4; + + /* real part */ + r1 = vec[2] + vec[18]; + r4 = vec[2] - vec[18]; + r3 = vec[14] + vec[6]; + r2 = vec[14] - vec[6]; + t = ( r1 - r3 ) * C54; + r1 = r1 + r3; + y02 = vec[10] + r1; + r1 = y02 + ( r1 * C55 ); + r3 = r1 - t; + r1 = r1 + t; + t = ( r4 + r2 ) * C51; + r4 = t + ( r4 * C52 ); + r2 = t + ( r2 * C53 ); + + /* imaginary part */ + s1 = vec[3] + vec[19]; + s4 = vec[3] - vec[19]; + s3 = vec[15] + vec[7]; + s2 = vec[15] - vec[7]; + t = ( s1 - s3 ) * C54; + s1 = s1 + s3; + y03 = vec[11] + s1; + s1 = y03 + ( s1 * C55 ); + s3 = s1 - t; + s1 = s1 + t; + t = ( s4 + s2 ) * C51; + s4 = t + ( s4 * C52 ); + s2 = t + ( s2 * C53 ); + + /* combination */ + y06 = r1 + s2; + y18 = r1 - s2; + y10 = r3 - s4; + y14 = r3 + s4; + y07 = s1 - r2; + y19 = s1 + r2; + y11 = s3 + r4; + y15 = s3 - r4; + + /* 5 fft2 stages */ + vec[0] = y00 + y02; + vec[1] = y01 + y03; + vec[2] = y12 - y14; + vec[3] = y13 - y15; + vec[4] = y04 + y06; + vec[5] = y05 + y07; + vec[6] = y16 - y18; + vec[7] = y17 - y19; + vec[8] = y08 + y10; + vec[9] = y09 + y11; + vec[10] = y00 - y02; + vec[11] = y01 - y03; + vec[12] = y12 + y14; + vec[13] = y13 + y15; + vec[14] = y04 - y06; + vec[15] = y05 - y07; + vec[16] = y16 + y18; + vec[17] = y17 + y19; + vec[18] = y08 - y10; + vec[19] = y09 - y11; + + return; +} + +/** + * \brief Function performs a complex 20-point FFT + * The FFT is performed inplace. The result of the FFT + * is scaled by SCALEFACTOR20 bits. + * + * WOPS FLC version: 1509 cycles + * WOPS with 32x16 bit multiplications: 432 cycles + * + * \param [i/o] re real input / output + * \param [i/o] im imag input / output + * \param [i ] s stride real and imag input / output + * + * \return void + */ +static void fft20( float *signal ) +{ + const int16_t s = 2; + float *re = signal, *im = signal + 1; + float r1, r2, r3, r4; + float s1, s2, s3, s4; + float x0, x1, x2, x3, x4; + float t, t0, t1, t2, t3, t4, t5, t6, t7; + float y00, y01, y02, y03, y04, y05, y06, y07, y08, y09; + float y10, y11, y12, y13, y14, y15, y16, y17, y18, y19; + float y20, y21, y22, y23, y24, y25, y26, y27, y28, y29; + float y30, y31, y32, y33, y34, y35, y36, y37, y38, y39; + + /* 1. FFT5 stage */ + + /* real part */ + x0 = re[s * 0]; + x1 = re[s * 16]; + x2 = re[s * 12]; + x3 = re[s * 8]; + x4 = re[s * 4]; + r1 = x1 + x4; + r4 = x1 - x4; + r3 = x2 + x3; + r2 = x2 - x3; + t = ( r1 - r3 ) * C54; + r1 = r1 + r3; + y00 = x0 + r1; + r1 = y00 + ( r1 * C55 ); + r3 = r1 - t; + r1 = r1 + t; + t = ( r4 + r2 ) * C51; + r4 = t + ( r4 * C52 ); + r2 = t + ( r2 * C53 ); + + /* imaginary part */ + x0 = im[s * 0]; + x1 = im[s * 16]; + x2 = im[s * 12]; + x3 = im[s * 8]; + x4 = im[s * 4]; + s1 = x1 + x4; + s4 = x1 - x4; + s3 = x2 + x3; + s2 = x2 - x3; + t = ( s1 - s3 ) * C54; + s1 = ( s1 + s3 ); + y01 = ( x0 + s1 ); + s1 = y01 + ( s1 * C55 ); + s3 = ( s1 - t ); + s1 = ( s1 + t ); + t = ( s4 + s2 ) * C51; + s4 = t + ( s4 * C52 ); + s2 = t + ( s2 * C53 ); + + /* combination */ + y08 = ( r1 + s2 ); + y32 = ( r1 - s2 ); + y16 = ( r3 - s4 ); + y24 = ( r3 + s4 ); + + y09 = ( s1 - r2 ); + y33 = ( s1 + r2 ); + y17 = ( s3 + r4 ); + y25 = ( s3 - r4 ); + + /* 2. FFT5 stage */ + + /* real part */ + x0 = re[s * 5]; + x1 = re[s * 1]; + x2 = re[s * 17]; + x3 = re[s * 13]; + x4 = re[s * 9]; + r1 = ( x1 + x4 ); + r4 = ( x1 - x4 ); + r3 = ( x2 + x3 ); + r2 = ( x2 - x3 ); + t = ( r1 - r3 ) * C54; + r1 = ( r1 + r3 ); + y02 = ( x0 + r1 ); + r1 = y02 + ( r1 * C55 ); + r3 = ( r1 - t ); + r1 = ( r1 + t ); + t = ( r4 + r2 ) * C51; + r4 = t + ( r4 * C52 ); + r2 = t + ( r2 * C53 ); + + /* imaginary part */ + x0 = im[s * 5]; + x1 = im[s * 1]; + x2 = im[s * 17]; + x3 = im[s * 13]; + x4 = im[s * 9]; + s1 = ( x1 + x4 ); + s4 = ( x1 - x4 ); + s3 = ( x2 + x3 ); + s2 = ( x2 - x3 ); + t = ( s1 - s3 ) * C54; + s1 = ( s1 + s3 ); + y03 = ( x0 + s1 ); + s1 = y03 + ( s1 * C55 ); + s3 = ( s1 - t ); + s1 = ( s1 + t ); + t = ( s4 + s2 ) * C51; + s4 = t + ( s4 * C52 ); + s2 = t + ( s2 * C53 ); + + /* combination */ + y10 = ( r1 + s2 ); + y34 = ( r1 - s2 ); + y18 = ( r3 - s4 ); + y26 = ( r3 + s4 ); + + y11 = ( s1 - r2 ); + y35 = ( s1 + r2 ); + y19 = ( s3 + r4 ); + y27 = ( s3 - r4 ); + + /* 3. FFT5 stage */ + + /* real part */ + x0 = re[s * 10]; + x1 = re[s * 6]; + x2 = re[s * 2]; + x3 = re[s * 18]; + x4 = re[s * 14]; + r1 = ( x1 + x4 ); + r4 = ( x1 - x4 ); + r3 = ( x2 + x3 ); + r2 = ( x2 - x3 ); + t = ( r1 - r3 ) * C54; + r1 = ( r1 + r3 ); + y04 = ( x0 + r1 ); + r1 = y04 + ( r1 * C55 ); + r3 = ( r1 - t ); + r1 = ( r1 + t ); + t = ( r4 + r2 ) * C51; + r4 = t + ( r4 * C52 ); + r2 = t + ( r2 * C53 ); + + /* imaginary part */ + x0 = im[s * 10]; + x1 = im[s * 6]; + x2 = im[s * 2]; + x3 = im[s * 18]; + x4 = im[s * 14]; + s1 = ( x1 + x4 ); + s4 = ( x1 - x4 ); + s3 = ( x2 + x3 ); + s2 = ( x2 - x3 ); + t = ( s1 - s3 ) * C54; + s1 = ( s1 + s3 ); + y05 = ( x0 + s1 ); + s1 = y05 + ( s1 * C55 ); + s3 = ( s1 - t ); + s1 = ( s1 + t ); + t = ( s4 + s2 ) * C51; + s4 = t + ( s4 * C52 ); + s2 = t + ( s2 * C53 ); + + /* combination */ + y12 = ( r1 + s2 ); + y36 = ( r1 - s2 ); + y20 = ( r3 - s4 ); + y28 = ( r3 + s4 ); + + y13 = ( s1 - r2 ); + y37 = ( s1 + r2 ); + y21 = ( s3 + r4 ); + y29 = ( s3 - r4 ); + + /* 4. FFT5 stage */ + + /* real part */ + x0 = re[s * 15]; + x1 = re[s * 11]; + x2 = re[s * 7]; + x3 = re[s * 3]; + x4 = re[s * 19]; + r1 = ( x1 + x4 ); + r4 = ( x1 - x4 ); + r3 = ( x2 + x3 ); + r2 = ( x2 - x3 ); + t = ( r1 - r3 ) * C54; + r1 = ( r1 + r3 ); + y06 = ( x0 + r1 ); + r1 = y06 + ( r1 * C55 ); + r3 = ( r1 - t ); + r1 = ( r1 + t ); + t = ( r4 + r2 ) * C51; + r4 = t + ( r4 * C52 ); + r2 = t + ( r2 * C53 ); + + /* imaginary part */ + x0 = im[s * 15]; + x1 = im[s * 11]; + x2 = im[s * 7]; + x3 = im[s * 3]; + x4 = im[s * 19]; + s1 = ( x1 + x4 ); + s4 = ( x1 - x4 ); + s3 = ( x2 + x3 ); + s2 = ( x2 - x3 ); + t = ( s1 - s3 ) * C54; + s1 = ( s1 + s3 ); + y07 = ( x0 + s1 ); + s1 = y07 + ( s1 * C55 ); + s3 = ( s1 - t ); + s1 = ( s1 + t ); + t = ( s4 + s2 ) * C51; + s4 = t + ( s4 * C52 ); + s2 = t + ( s2 * C53 ); + + /* combination */ + y14 = ( r1 + s2 ); + y38 = ( r1 - s2 ); + y22 = ( r3 - s4 ); + y30 = ( r3 + s4 ); + + y15 = ( s1 - r2 ); + y39 = ( s1 + r2 ); + y23 = ( s3 + r4 ); + y31 = ( s3 - r4 ); + + + /* 1. FFT4 stage */ + + /* Pre-additions */ + t0 = ( y00 + y04 ); + t2 = ( y00 - y04 ); + t1 = ( y01 + y05 ); + t3 = ( y01 - y05 ); + t4 = ( y02 + y06 ); + t7 = ( y02 - y06 ); + t5 = ( y07 + y03 ); + t6 = ( y07 - y03 ); + + /* Post-additions */ + re[s * 0] = ( t0 + t4 ); + im[s * 0] = ( t1 + t5 ); + re[s * 5] = ( t2 - t6 ); + im[s * 5] = ( t3 - t7 ); + re[s * 10] = ( t0 - t4 ); + im[s * 10] = ( t1 - t5 ); + re[s * 15] = ( t2 + t6 ); + im[s * 15] = ( t3 + t7 ); + + /* 2. FFT4 stage */ + + /* Pre-additions */ + t0 = ( y08 + y12 ); + t2 = ( y08 - y12 ); + t1 = ( y09 + y13 ); + t3 = ( y09 - y13 ); + t4 = ( y10 + y14 ); + t7 = ( y10 - y14 ); + t5 = ( y15 + y11 ); + t6 = ( y15 - y11 ); + + /* Post-additions */ + re[s * 4] = ( t0 + t4 ); + im[s * 4] = ( t1 + t5 ); + re[s * 9] = ( t2 - t6 ); + im[s * 9] = ( t3 - t7 ); + re[s * 14] = ( t0 - t4 ); + im[s * 14] = ( t1 - t5 ); + re[s * 19] = ( t2 + t6 ); + im[s * 19] = ( t3 + t7 ); + + + /* 3. FFT4 stage */ + + /* Pre-additions */ + t0 = ( y16 + y20 ); + t2 = ( y16 - y20 ); + t1 = ( y17 + y21 ); + t3 = ( y17 - y21 ); + t4 = ( y18 + y22 ); + t7 = ( y18 - y22 ); + t5 = ( y23 + y19 ); + t6 = ( y23 - y19 ); + + /* Post-additions */ + re[s * 8] = ( t0 + t4 ); + im[s * 8] = ( t1 + t5 ); + re[s * 13] = ( t2 - t6 ); + im[s * 13] = ( t3 - t7 ); + re[s * 18] = ( t0 - t4 ); + im[s * 18] = ( t1 - t5 ); + re[s * 3] = ( t2 + t6 ); + im[s * 3] = ( t3 + t7 ); + + /* 4. FFT4 stage */ + + /* Pre-additions */ + t0 = ( y24 + y28 ); + t2 = ( y24 - y28 ); + t1 = ( y25 + y29 ); + t3 = ( y25 - y29 ); + t4 = ( y26 + y30 ); + t7 = ( y26 - y30 ); + t5 = ( y31 + y27 ); + t6 = ( y31 - y27 ); + + /* Post-additions */ + re[s * 12] = ( t0 + t4 ); + im[s * 12] = ( t1 + t5 ); + re[s * 17] = ( t2 - t6 ); + im[s * 17] = ( t3 - t7 ); + re[s * 2] = ( t0 - t4 ); + im[s * 2] = ( t1 - t5 ); + re[s * 7] = ( t2 + t6 ); + im[s * 7] = ( t3 + t7 ); + + /* 5. FFT4 stage */ + + /* Pre-additions */ + t0 = ( y32 + y36 ); + t2 = ( y32 - y36 ); + t1 = ( y33 + y37 ); + t3 = ( y33 - y37 ); + t4 = ( y34 + y38 ); + t7 = ( y34 - y38 ); + t5 = ( y39 + y35 ); + t6 = ( y39 - y35 ); + + /* Post-additions */ + re[s * 16] = ( t0 + t4 ); + im[s * 16] = ( t1 + t5 ); + re[s * 1] = ( t2 - t6 ); + im[s * 1] = ( t3 - t7 ); + re[s * 6] = ( t0 - t4 ); + im[s * 6] = ( t1 - t5 ); + re[s * 11] = ( t2 + t6 ); + im[s * 11] = ( t3 + t7 ); + + return; +} + +/******************************************************************************* + Functionname: fft30 + ******************************************************************************* + + Description: 30-point FFT. + + Arguments: in - pointer to data (interleaved real / imaginary parts) + + Return: none + +*******************************************************************************/ + +static void fft30( float *restrict in ) +{ + int16_t i; + float temp[60]; + float *temp_l = temp; + float *temp_lu = temp + 2 * 8; + float *temp_h = temp + 2 * 15; + float *temp_hu = temp + 2 * 15 + 2 * 8; + float *in_l = in + 2 * 0; + float *in_h = in + 2 * 15; + for ( i = 0; i < 7; i++ ) + { + *temp_l++ = *in_l++; + *temp_l++ = *in_l++; + *temp_h++ = *in_h++; + *temp_h++ = *in_h++; + *temp_l++ = *in_h++; + *temp_l++ = *in_h++; + *temp_h++ = *in_l++; + *temp_h++ = *in_l++; + } + *temp_l++ = *in_l++; + *temp_l++ = *in_l++; + *temp_h++ = *in_h++; + *temp_h++ = *in_h++; + temp_l = temp; + temp_h = temp + 30; + fft15( temp_l ); + fft15( temp_h ); + + in_l = in + 2 * 0; + in_h = in + 2 * 15; + for ( i = 0; i < 7; i++ ) + { + *in_l++ = *temp_l + *temp_h; + *in_h++ = *temp_l++ - *temp_h++; + *in_l++ = *temp_l + *temp_h; + *in_h++ = *temp_l++ - *temp_h++; + + *in_h++ = *temp_lu + *temp_hu; + *in_l++ = *temp_lu++ - *temp_hu++; + *in_h++ = *temp_lu + *temp_hu; + *in_l++ = *temp_lu++ - *temp_hu++; + } + *in_l++ = *temp_l + *temp_h; + *in_h++ = *temp_l++ - *temp_h++; + *in_l++ = *temp_l + *temp_h; + *in_h++ = *temp_l++ - *temp_h++; + + return; +} + +/*-------------------------------------------------------------------* + * fft_cldfb() + * + * Interface functions FFT subroutines + *--------------------------------------------------------------------*/ +void fft_cldfb( + float *data, /* i/o: input/output vector */ + const int16_t size /* size of fft operation */ +) +{ + + switch ( size ) + { + case 5: + fft5s( data, 2 ); + break; + case 8: + fft8( data ); + break; + case 10: + fft10( data ); + break; + case 16: + fft16( data ); + break; + case 20: + fft20( data ); + break; + case 30: + fft30( data ); + break; + + default: + assert( 0 ); + break; + } + + return; +} diff --git a/lib_com/fft_rel.c b/lib_com/fft_rel.c new file mode 100644 index 0000000000000000000000000000000000000000..e45736be8c0144dd9f84f22a3bd83ea9b8ac169d --- /dev/null +++ b/lib_com/fft_rel.c @@ -0,0 +1,300 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*---------------------------------------------------------------------* + * Local constants + *---------------------------------------------------------------------*/ + +#define N_MAX_FFT 1024 +#define N_MAX_DIV2 ( N_MAX_FFT >> 1 ) +#define N_MAX_DIV4 ( N_MAX_DIV2 >> 1 ) + +/*---------------------------------------------------------------------* + * fft_rel() + * + * Computes the split-radix FFT in place for the real-valued + * signal x of length n. The algorithm has been ported from + * the Fortran code of [1]. + * + * The function needs sine and cosine tables t_sin and t_cos, + * and the constant N_MAX_FFT. The table entries are defined as + * sin(2*pi*i) and cos(2*pi*i) for i = 0, 1, ..., N_MAX_FFT-1. The + * implementation assumes that any entry will not be needed + * outside the tables. Therefore, N_MAX_FFT and n must be properly + * set. The function has been tested with the values n = 16, + * 32, 64, 128, 256, and N_MAX_FFT = 1280. + * + * References + * [1] H.V. Sorensen, D.L. Jones, M.T. Heideman, C.S. Burrus, + * "Real-valued fast Fourier transform algorithm," IEEE + * Trans. on Signal Processing, Vol.35, No.6, pp 849-863, + * 1987. + * + * OUTPUT + * x[0:n-1] Transform coeffients in the order re[0], re[1], + * ..., re[n/2], im[n/2-1], ..., im[1]. + *---------------------------------------------------------------------*/ + +void fft_rel( + float x[], /* i/o: input/output vector */ + const int16_t n, /* i : vector length */ + const int16_t m /* i : log2 of vector length */ +) +{ + int16_t i, j, k, n1, n2, n4; + int16_t step; + float xt, t1, t2; + float *x0, *x1, *x2; + float *xi2, *xi3, *xi4, *xi1; + const float *s, *c; + const int16_t *idx; + + /* !!!! NMAX = 256 is hardcoded here (similar optimizations should be done for NMAX > 256) !!! */ + + float *x2even, *x2odd; + float temp[512]; + + if ( n == 128 || n == 256 || n == 512 ) + { + idx = fft256_read_indexes; + + /* Combined Digit reverse counter & Length two butterflies */ + if ( n == 128 ) + { + x2 = temp; + for ( i = 0; i < 64; i++ ) + { + j = *idx++; + k = *idx++; + + *x2++ = x[j >> 1] + x[k >> 1]; + *x2++ = x[j >> 1] - x[k >> 1]; + } + } + else if ( n == 256 ) + { + x2 = temp; + for ( i = 0; i < 128; i++ ) + { + j = *idx++; + k = *idx++; + + *x2++ = x[j] + x[k]; + *x2++ = x[j] - x[k]; + } + } + else if ( n == 512 ) + { + x2even = temp; + x2odd = temp + 256; + + for ( i = 0; i < 128; i++ ) + { + j = 2 * *idx++; + k = 2 * *idx++; + + *x2even++ = x[j] + x[k]; + *x2even++ = x[j] - x[k]; + *x2odd++ = x[++j] + x[++k]; + *x2odd++ = x[j] - x[k]; + } + } + + /*-----------------------------------------------------------------* + * 1st Stage Loop has been Unrolled because n4 is '1' and that + * allows the elimination of the 'for_ (j = 1; j < n4; j++)' loop + * and the associated pointers initialization. + * Also, it allows to Put the Data from 'temp' back into 'x' due + * to the previous Combined Digit Reverse and Length two butterflies + *-----------------------------------------------------------------*/ + + /*for_ (k = 2; k < 3; k++)*/ + { + x0 = temp; + x1 = x0 + 2; + x2 = x; + + for ( i = 0; i < n; i += 4 ) + { + *x2++ = *x0++ + *x1; /* x[i] = xt + x[i+n2]; */ + *x2++ = *x0; + *x2++ = *--x0 - *x1++; /* x[i+n2] = xt - x[i+n2]; */ + *x2++ = -*x1; /* x[i+n2+n4] = -x[i+n2+n4]; */ + + x0 += 4; + x1 += 3; /* x1 has already advanced */ + } + } + } + else + { + /*-----------------------------------------------------------------* + * Digit reverse counter + *-----------------------------------------------------------------*/ + + j = 0; + x0 = &x[0]; + for ( i = 0; i < n - 1; i++ ) + { + if ( i < j ) + { + xt = x[j]; + x[j] = *x0; + *x0 = xt; + } + x0++; + k = n / 2; + while ( k <= j ) + { + j -= k; + k = k >> 1; + } + j += k; + } + + /*-----------------------------------------------------------------* + * Length two butterflies + *-----------------------------------------------------------------*/ + + x0 = &x[0]; + x1 = &x[1]; + for ( i = 0; i < n / 2; i++ ) + { + *x1 = *x0 - *x1; + *x0 = *x0 * 2 - *x1; + + x0++; + x0++; + x1++; + x1++; + } + + /*-----------------------------------------------------------------* + * 1st Stage Loop has been Unrolled because n4 is '1' and that + * allows the elimination of the 'for_ (j = 1; j < n4; j++)' loop + * and the associated pointers initialization. + *-----------------------------------------------------------------*/ + + /* for_ (k = 2; k < 3; k++) */ + { + x0 = x; + x1 = x0 + 2; + + for ( i = 0; i < n; i += 4 ) + { + *x1 = *x0 - *x1; /* x[i+n2] = xt - x[i+n2]; */ + *x0 = *x0 * 2 - *x1++; /* x[i] = xt + x[i+n2]; */ + *x1 = -*x1; /* x[i+n2+n4] = -x[i+n2+n4]; */ + + x0 += 4; + x1 += 3; /* x1 has already advanced */ + } + } + } + + /*-----------------------------------------------------------------* + * Other butterflies + * + * The implementation described in [1] has been changed by using + * table lookup for evaluating sine and cosine functions. The + * variable ind and its increment step are needed to access table + * entries. Note that this implementation assumes n4 to be so + * small that ind will never exceed the table. Thus the input + * argument n and the constant N_MAX_FFT must be set properly. + *-----------------------------------------------------------------*/ + + n4 = 1; + n2 = 2; + n1 = 4; + + step = N_MAX_DIV4; + + for ( k = 3; k <= m; k++ ) + { + step >>= 1; + n4 <<= 1; + n2 <<= 1; + n1 <<= 1; + + x0 = x; + x1 = x0 + n2; + x2 = x1 + n4; + + for ( i = 0; i < n; i += n1 ) + { + *x1 = *x0 - *x1; /* x[i+n2] = xt - x[i+n2]; */ + *x0 = *x0 * 2 - *x1; /* x[i] = xt + x[i+n2]; */ + *x2 = -*x2; /* x[i+n2+n4] = -x[i+n2+n4]; */ + + s = sincos_t_ext; + c = s + N_MAX_FFT / 4; /* 1024/4 = 256, 256/4=64 */ + xi1 = x0; + xi3 = xi1 + n2; + xi2 = xi3; + x0 += n1; + xi4 = x0; + + for ( j = 1; j < n4; j++ ) + { + xi3++; + xi1++; + xi4--; + xi2--; + c += step; + s += step; /* autoincrement by ar0 */ + + t1 = *xi3 * *c + *xi4 * *s; /* t1 = *xi3**(pt_c+ind) + *xi4**(pt_s+ind); */ + t2 = *xi3 * *s - *xi4 * *c; /* t2 = *xi3**(pt_s+ind) - *xi4**(pt_c+ind); */ + + *xi4 = *xi2 - t2; + *xi2 = *xi1 - t1; + *xi1 = *xi1 * 2 - *xi2; + *xi3 = -2 * t2 - *xi4; + } + + x1 += n1; + x2 += n1; + } + } + + return; +} diff --git a/lib_com/fill_spectrum.c b/lib_com/fill_spectrum.c new file mode 100644 index 0000000000000000000000000000000000000000..93d4cd572dccee762a71807a0d10d5d2442524e2 --- /dev/null +++ b/lib_com/fill_spectrum.c @@ -0,0 +1,266 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "wmc_auto.h" + +/*--------------------------------------------------------------------------* + * fill_spectrum() + * + * Apply spectral filling by + * - filling zero-bit bands below BWE region + * - applying BWE above transition frequency + *--------------------------------------------------------------------------*/ + +void fill_spectrum( + float *coeff, /* i/o: normalized MLT spectrum / nf spectrum */ + int16_t *R, /* i : number of pulses per band */ + const int16_t is_transient, /* i : transient flag */ + int16_t norm[], /* i : quantization indices for norms */ + const float *hq_generic_fenv, /* i : HQ GENERIC envelope */ + const int16_t hq_generic_offset, /* i : HQ GENERIC offset */ + const int16_t nf_idx, /* i : noise fill index */ + const int16_t length, /* i : Length of spectrum (32 or 48 kHz) */ + const float env_stab, /* i : Envelope stability measure [0..1] */ + int16_t *no_att_hangover, /* i/o: Frame counter for attenuation hangover */ + float *energy_lt, /* i/o: Long-term energy measure for transient detection */ + int16_t *bwe_seed, /* i/o: random seed for generating BWE input */ + const int16_t hq_generic_exc_clas, /* i : HQ generic hf excitation class */ + const int16_t core_sfm, /* i : index of the end band for core */ + int16_t HQ_mode, /* i : HQ mode */ + float noise_level[], /* i : noise levels for harmonic modes */ + int32_t core_brate, /* i : target bitrate */ + float prev_noise_level[], /* i/o: noise factor in previous frame */ + int16_t *prev_R, /* i/o: bit allocation info. in previous frame */ + float *prev_coeff_out, /* i/o: decoded spectrum in previous frame */ + const int16_t *peak_idx, /* i : HVQ peak indices */ + const int16_t Npeaks, /* i : Number of HVQ peaks */ + const int16_t *npulses, /* i : Number of assigned pulses per band */ + int16_t prev_is_transient, /* i : previous transient flag */ + float *prev_normq, /* i : previous norms */ + float *prev_env, /* i : previous noise envelopes */ + int16_t prev_bfi, /* i : previous bad frame indicator */ + const int16_t *sfmsize, /* i : Length of bands */ + const int16_t *sfm_start, /* i : Start of bands */ + const int16_t *sfm_end, /* i : End of bands */ + int16_t *prev_L_swb_norm, /* i/o: last normalize length for harmonic mode */ + int16_t prev_hq_mode, /* i : previous HQ mode */ + const int16_t num_sfm, /* i : Number of bands */ + const int16_t num_env_bands, /* i : Number of envelope bands */ + const int16_t element_mode /* i : element mode */ +) +{ + float CodeBook[L_SPEC48k_EXT]; + int16_t cb_size = 0; + int16_t last_sfm; + float CodeBook_mod[L_SPEC48k_EXT]; + float norm_adj[NB_SFM]; + int16_t high_sfm = 23; + int16_t flag_32K_env_hangover; + int16_t bin_th = 0; + int16_t peak_pos[L_HARMONIC_EXC]; + int16_t bwe_peaks[L_FRAME48k]; + float normq_v[NB_SFM]; + float coeff_fine[L_SPEC48k_EXT]; + float coeff_out[L_SPEC48k_EXT]; + + set_s( peak_pos, 0, L_HARMONIC_EXC ); + set_s( bwe_peaks, 0, L_FRAME48k ); + set_f( norm_adj, 1.0f, num_sfm ); + set_f( coeff_out, 0.0f, L_FRAME48k ); + + if ( HQ_mode == HQ_TRANSIENT ) + { + last_sfm = num_sfm - 1; + } + else if ( HQ_mode == HQ_GEN_SWB || HQ_mode == HQ_GEN_FB ) + { + last_sfm = max( core_sfm, num_env_bands - 1 ); + } + else + { + last_sfm = core_sfm; + } + + if ( HQ_mode == HQ_HARMONIC ) + { + high_sfm = ( core_brate < HQ_BWE_CROSSOVER_BRATE ) ? HVQ_THRES_SFM_24k - 1 : HVQ_THRES_SFM_32k - 1; + + if ( last_sfm < high_sfm ) + { + last_sfm = high_sfm; + } + } + else if ( HQ_mode == HQ_HVQ ) + { + bin_th = sfm_end[last_sfm]; + } + + /* Transient analysis for envelope stability measure */ + if ( length == L_FRAME32k ) + { + env_stab_transient_detect( is_transient, length, norm, no_att_hangover, energy_lt, HQ_mode, bin_th, coeff ); + } + + if ( length == L_FRAME16k || ( ( length == L_FRAME32k && HQ_mode != HQ_HARMONIC && HQ_mode != HQ_HVQ ) && *no_att_hangover == 0 ) ) + { + /* Norm adjustment function */ + env_adj( npulses, length, last_sfm, norm_adj, env_stab, sfmsize ); + } + + flag_32K_env_hangover = ( length == L_FRAME32k && ( ( env_stab < 0.5f && *no_att_hangover == 0 ) || HQ_mode == HQ_HVQ ) ); + + /*----------------------------------------------------------------* + * Build noise-fill codebook + *----------------------------------------------------------------*/ + + if ( HQ_mode != HQ_HVQ ) + { + cb_size = build_nf_codebook( flag_32K_env_hangover, coeff, sfm_start, sfmsize, sfm_end, last_sfm, R, CodeBook, CodeBook_mod ); + } + + /*----------------------------------------------------------------* + * Prepare fine structure for Harmonic and HVQ + *----------------------------------------------------------------*/ + + if ( HQ_mode == HQ_HARMONIC ) + { + harm_bwe_fine( R, last_sfm, high_sfm, num_sfm, norm, sfm_start, sfm_end, prev_L_swb_norm, coeff, coeff_out, coeff_fine ); + } + else if ( HQ_mode == HQ_HVQ ) + { + hvq_bwe_fine( last_sfm, num_sfm, sfm_end, peak_idx, Npeaks, peak_pos, prev_L_swb_norm, coeff, bwe_peaks, coeff_fine ); + } + + /*----------------------------------------------------------------* + * Apply noise-fill + *----------------------------------------------------------------*/ + + if ( HQ_mode != HQ_HVQ && cb_size > 0 ) + { + apply_noisefill_HQ( R, length, flag_32K_env_hangover, core_brate, last_sfm, CodeBook, CodeBook_mod, cb_size, sfm_start, sfm_end, sfmsize, coeff ); + } + + /*----------------------------------------------------------------* + * Normal mode BWE + *----------------------------------------------------------------*/ + + if ( HQ_mode == HQ_NORMAL ) + { + hq_fold_bwe( last_sfm, sfm_end, num_sfm, coeff ); + } + + /*----------------------------------------------------------------* + * Apply noise-fill adjustment + *----------------------------------------------------------------*/ + + if ( ( length >= L_FRAME32k || core_brate > HQ_32k || core_brate < HQ_24k40 ) && HQ_mode != HQ_HVQ ) + { + apply_nf_gain( nf_idx, last_sfm, R, sfm_start, sfm_end, coeff ); + } + + /*----------------------------------------------------------------* + * Prepare fine strucutre for HQ GENERIC + *----------------------------------------------------------------*/ + if ( HQ_mode == HQ_GEN_SWB || HQ_mode == HQ_GEN_FB ) + { + hq_generic_fine( coeff, last_sfm, sfm_start, sfm_end, bwe_seed, coeff_fine ); + } + + /*----------------------------------------------------------------* + * Apply envelope + *----------------------------------------------------------------*/ + + if ( HQ_mode != HQ_HARMONIC && HQ_mode != HQ_HVQ ) + { + apply_envelope( coeff, norm, norm_adj, num_sfm, last_sfm, HQ_mode, length, sfm_start, sfm_end, normq_v, coeff_out, coeff_fine ); + } + + /*----------------------------------------------------------------* + * Harmonic BWE, HVQ BWE and HQ SWB BWE + *----------------------------------------------------------------*/ + + if ( HQ_mode == HQ_HARMONIC ) + { + harm_bwe( coeff_fine, coeff, num_sfm, sfm_start, sfm_end, last_sfm, high_sfm, R, prev_hq_mode, norm, noise_level, prev_noise_level, bwe_seed, coeff_out, element_mode ); + } + else if ( HQ_mode == HQ_HVQ ) + { + hvq_bwe( coeff, coeff_fine, sfm_start, sfm_end, sfmsize, last_sfm, prev_hq_mode, bwe_peaks, bin_th, num_sfm, core_brate, R, norm, noise_level, prev_noise_level, bwe_seed, coeff_out ); + } + else if ( HQ_mode == HQ_GEN_SWB || HQ_mode == HQ_GEN_FB ) + { + hq_generic_bwe( HQ_mode, coeff_fine, hq_generic_fenv, coeff_out, hq_generic_offset, prev_L_swb_norm, hq_generic_exc_clas, sfm_end, num_sfm, num_env_bands, R ); + } + + /*----------------------------------------------------------------* + * HQ WB BWE refinements + *----------------------------------------------------------------*/ + + if ( length == L_FRAME16k && core_brate <= HQ_32k ) + { + hq_wb_nf_bwe( coeff, is_transient, prev_bfi, normq_v, num_sfm, sfm_start, sfm_end, sfmsize, last_sfm, R, prev_is_transient, prev_normq, prev_env, bwe_seed, prev_coeff_out, prev_R, coeff_out ); + } + + /*----------------------------------------------------------------* + * Update memories + *----------------------------------------------------------------*/ + + if ( HQ_mode != HQ_HARMONIC && HQ_mode != HQ_HVQ ) + { + prev_noise_level[0] = 0.1f; + prev_noise_level[1] = 0.1f; + } + if ( !( length == L_FRAME16k && core_brate <= HQ_32k ) ) + { + set_f( prev_env, 0, SFM_N_WB ); + set_f( prev_normq, 0, SFM_N_WB ); + } + + if ( length == L_FRAME32k && core_brate <= HQ_32k ) + { + *prev_R = R[SFM_N_WB - 1]; + mvr2r( coeff_out + L_FRAME16k - L_HQ_WB_BWE, prev_coeff_out, L_HQ_WB_BWE ); + } + + mvr2r( coeff_out, coeff, length ); + + return; +} diff --git a/lib_com/findpulse.c b/lib_com/findpulse.c new file mode 100644 index 0000000000000000000000000000000000000000..3f8321160888350bc6dc7e977d4612aa1941a8dc --- /dev/null +++ b/lib_com/findpulse.c @@ -0,0 +1,140 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "prot.h" +#include "cnst.h" +#include "wmc_auto.h" + +/*----------------------------------------------------------------------------------* + * findpulse() + * + * Find first pitch pulse in a frame + *----------------------------------------------------------------------------------*/ + +/*! r: pulse position */ +int16_t findpulse( + const int16_t L_frame, /* i : length of the frame */ + const float res[], /* i : residual signal */ + const int16_t T0, /* i : integer pitch */ + const int16_t enc_dec, /* i : flag enc/dec, 0 - enc, 1 - dec */ + int16_t *sign /* i/o: sign of the maximum */ +) +{ + const float *ptr; + float val, maxval; + int16_t i, maxi; + float resf[L_FRAME16k]; /* Low pass filtered residual */ + + if ( enc_dec == ENC ) + { + /*-----------------------------------------------------------------* + * Very simple LP filter + *-----------------------------------------------------------------*/ + + resf[0] = 0.50f * res[0] + 0.25f * res[1]; + for ( i = 1; i < L_frame - 1; i++ ) + { + resf[i] = 0.25f * res[i - 1] + 0.5f * res[i] + 0.25f * res[i + 1]; + } + resf[L_frame - 1] = 0.25f * res[L_frame - 2] + 0.50f * res[L_frame - 1]; + + /*-----------------------------------------------------------------* + * Find "biggest" pulse in the last pitch section + *-----------------------------------------------------------------*/ + + ptr = resf + L_frame - 1; + maxval = 0; + maxi = 0; + for ( i = 0; i < T0; i++ ) + { + val = (float) fabs( *ptr ); + if ( val > maxval ) + { + maxval = val; + maxi = i; + if ( *ptr >= 0 ) + { + *sign = 0; + } + else + { + *sign = 1; + } + } + ptr--; + } + } + else + { + /*-----------------------------------------------------------------* + * Find "biggest" pulse in the last pitch section according to the sign + *-----------------------------------------------------------------*/ + + ptr = res; + maxval = 0; + maxi = 0; + + if ( *sign == 0 ) + { + for ( i = 1; i <= T0; i++ ) + { + val = *ptr++; + if ( val >= maxval ) + { + maxval = val; + maxi = i; + } + } + } + else + { + for ( i = 1; i <= T0; i++ ) + { + val = *ptr++; + if ( val <= maxval ) + { + maxval = val; + maxi = i; + } + } + } + } + + return ( maxi ); +} diff --git a/lib_com/fine_gain_bits.c b/lib_com/fine_gain_bits.c new file mode 100644 index 0000000000000000000000000000000000000000..5e65b12e4f74787d30e303fdca684e9130c53b73 --- /dev/null +++ b/lib_com/fine_gain_bits.c @@ -0,0 +1,128 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "rom_com.h" +#include "prot.h" +#include +#include "wmc_auto.h" + +/*-------------------------------------------------------------------------- + * subband_gain_bits() + * + * HQ core encoder + *--------------------------------------------------------------------------*/ + +static void subband_gain_bits( + const int16_t *Rk, /* i : bit allocation per band (Q3)*/ + const int16_t N, /* i : number of bands */ + int16_t *bits, /* o : gain bits per band */ + const int16_t *sfmsize /* i : Size of bands */ +) +{ + int16_t i, b, tot; + int16_t bps; + + tot = 0; + + for ( i = 0; i < N; i++ ) + { + bps = ( Rk[i] * fg_inv_tbl_fx[sfmsize[i] >> 3] ) >> 18; + if ( ( ( sfmsize[i] * ( bps + 1 ) ) << 3 ) - Rk[i] == 0 ) + { /* correct approx. division result, to obtain exact integer division output */ + bps++; + } + bps = min( 7, bps ); + + b = fine_gain_bits[bps]; + bits[i] = b; + tot += b; + } + + if ( tot == 0 ) + { + /* If no gain bits were assigned, use one bit anyway for potential PVQ overage */ + bits[0] = 1; + } + + return; +} + +/*--------------------------------------------------------------------------* + * assign_gain_bits() + * + * Assign gain adjustment bits and update bit budget + *--------------------------------------------------------------------------*/ + +/*! r: Number of assigned gain bits */ +int16_t assign_gain_bits( + const int16_t core, /* i : HQ core */ + const int16_t BANDS, /* i : Number of bands */ + const int16_t *band_width, /* i : Sub band bandwidth */ + int16_t *Rk, /* i/o: Bit allocation/Adjusted bit alloc. (Q3) */ + int16_t *gain_bits_array, /* o : Assigned gain bits */ + int16_t *Rcalc /* o : Bit budget for shape quantizer (Q3) */ +) +{ + int16_t gain_bits_tot; + int16_t i; + + /* Allocate gain bits for every subband used, based on bitrate and bandwidth */ + if ( core == HQ_CORE ) + { + subband_gain_bits( Rk, BANDS, gain_bits_array, band_width ); + } + else + { + set_s( gain_bits_array, 0, BANDS ); + } + + /* Re-adjust bit budget for gain quantization */ + gain_bits_tot = 0; + *Rcalc = 0; + for ( i = 0; i < BANDS; i++ ) + { + if ( Rk[i] > 0 ) + { + Rk[i] -= gain_bits_array[i] * 8; + gain_bits_tot += gain_bits_array[i]; + *Rcalc += Rk[i]; + } + } + + return gain_bits_tot; +} diff --git a/lib_com/frame_ener.c b/lib_com/frame_ener.c new file mode 100644 index 0000000000000000000000000000000000000000..1592c6e9f19f9e89fb5c63365e021d6fbf660da6 --- /dev/null +++ b/lib_com/frame_ener.c @@ -0,0 +1,128 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "wmc_auto.h" + +/*----------------------------------------------------------------------------------* + * fer_energy() + * + * Estimation of pitch-synchronous (voiced sounds) or half-frame energy + *----------------------------------------------------------------------------------*/ + +void fer_energy( + const int16_t L_frame, /* i : frame length */ + const int16_t clas, /* i : frame classification */ + const float *synth, /* i : synthesized speech at Fs = 12k8 Hz */ + const float pitch, /* i : pitch period */ + float *enr, /* o : pitch-synchronous or half_frame energy */ + const int16_t offset /* i : speech pointer offset (0 or L_frame) */ +) +{ + int16_t len; + const float *pt_synth; + + if ( clas == VOICED_CLAS || clas == ONSET || clas == SIN_ONSET ) /* Voiced or Onset current frame */ + { + len = (int16_t) ( pitch + 0.5f ); /* pitch value */ + + pt_synth = synth; + if ( offset != 0 ) + { + pt_synth = synth + L_frame - len; + } + + emaximum( pt_synth, len, enr ); /* pitch synchronous E */ + } + else + { + pt_synth = synth; + if ( offset != 0 ) + { + pt_synth = synth + L_frame / 2; + } + + *enr = dotp( pt_synth, pt_synth, L_frame / 2 ); + *enr /= (float) ( L_frame / 2 ); + } + return; +} + + +/*------------------------------------------------------------------------* + * frame_energy() + * + * Compute pitch-synchronous energy at the frame end + *------------------------------------------------------------------------*/ + +float frame_energy( + const int16_t L_frame, /* i : length of the frame */ + const float *pitch, /* i : pitch values for each subframe */ + const float *speech, /* i : pointer to speech signal for E computation */ + const float lp_speech, /* i : long-term active speech energy average */ + float *frame_ener /* o : pitch-synchronous energy at frame end */ +) +{ + float enern; + const float *pt1; + int16_t len; + float dotProd; + + len = (int16_t) ( 0.5f * ( pitch[2] + pitch[3] ) + 0.5f ); + if ( len < L_SUBFR ) + { + len *= 2; + } + + pt1 = speech + L_frame - len; + + dotProd = dotp( pt1, pt1, len ); + if ( 0 == dotProd ) + { + *frame_ener = MIN_LOG_VAL_60dB; + } + else + { + *frame_ener = 10.0f * (float) log10( dotProd / (float) len ); + } + enern = *frame_ener - lp_speech; + + return enern; +} diff --git a/lib_com/get_gain.c b/lib_com/get_gain.c new file mode 100644 index 0000000000000000000000000000000000000000..94e23a1c6d69e0a6b17b1ba64484e47b1de6315f --- /dev/null +++ b/lib_com/get_gain.c @@ -0,0 +1,71 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "prot.h" +#include "wmc_auto.h" + +/*----------------------------------------------------------------------------------* + * get_gain() + * + * + *----------------------------------------------------------------------------------*/ + +/*! r: codebook gain (adaptive or fixed) */ +float get_gain( + const float x[], /* i : target signal */ + const float y[], /* i : filtered codebook excitation */ + const int16_t n, /* i : segment length */ + float *en_y /* o : energy of y (sum of y[]^2, optional) */ +) +{ + float corr = 0.0f, ener = 1e-6f; + int16_t i; + + for ( i = 0; i < n; i++ ) + { + corr += x[i] * y[i]; + ener += y[i] * y[i]; + } + + if ( en_y ) + { + *en_y = ener; + } + + return ( corr / ener ); +} diff --git a/lib_com/gs_bitallocation.c b/lib_com/gs_bitallocation.c new file mode 100644 index 0000000000000000000000000000000000000000..8bbf1d21c6baedec3c40f648b0fda3cef717ebdb --- /dev/null +++ b/lib_com/gs_bitallocation.c @@ -0,0 +1,929 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "ivas_prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * Local function prototypes + *-------------------------------------------------------------------*/ + +static float Find_bit_frac( const int16_t nb_band, const int16_t remaining_bits ); + +static void reajust_bits( float *bits_per_bands, const int16_t st_band, const int16_t end_band, const int16_t sum_bit_in, const int16_t bit_bdgt_in ); + + +/*-------------------------------------------------------------------* + * bands_and_bit_alloc() + * + * AC mode (GSC) bands and bits allocation + *-------------------------------------------------------------------*/ + +void bands_and_bit_alloc( + const int16_t cor_strong_limit, /* i : HF correlation */ + const int16_t noise_lev, /* i : dwn scaling factor */ + const int32_t core_brate, /* i : core bitrate */ + const int16_t Diff_len, /* i : Lenght of the difference signal (before pure spectral)*/ + const int16_t bits_used, /* i : Number of bit used before frequency Q */ + int16_t *bit, /* i/o: Number of bit allowed for frequency quantization */ + float *Ener_per_bd_iQ, /* i/o: Quantized energy vector */ + int16_t *max_ener_band, /* o : Sorted order */ + int16_t *bits_per_bands_s, /* i/o: Number of bit allowed per allowed subband (Q3) */ + int16_t *nb_subbands, /* o : Number of subband allowed */ + const float *exc_diff, /* i : Difference signal to quantize (encoder side only) */ + float *concat_in, /* o : Concatened PVQ's input vector (encoder side only) */ + int16_t *pvq_len, /* o : Number of bin covered with the PVQ */ + const int16_t coder_type, /* i : coding type */ + const int16_t bwidth, /* i : input signal bandwidth */ + const int16_t GSC_noisy_speech, /* i : GSC noisy speech flag */ + const int16_t L_frame, /* i : frame length */ + const int16_t element_mode, /* i : element mode */ + const int16_t GSC_IVAS_mode /* i : GSC IVAS mode */ +) +{ + int16_t bandoffset, i, j, nb_bands_max, bit_new_bands, bit_tmp, st_band, nb_bands; + float bit_fracf, etmp; + float sum_bit; + float ener_vec[MBANDS_GN_BITALLOC16k]; + int16_t nb_tot_bands; + int16_t bit_index, bit_index_mem, imax; + int16_t pos, band; + float SWB_bit_budget; + float bits_per_bands[MBANDS_GN_BITALLOC16k]; + float fzero_val, mp, mb, nb_bands_adj, bit_adj; + int16_t nb_pulse_per_band[MBANDS_GN_BITALLOC16k]; + + /* initializations */ + nb_tot_bands = 16; + set_f( bits_per_bands, 0.0f, MBANDS_GN_BITALLOC16k ); + + if ( L_frame == L_FRAME16k ) + { + nb_tot_bands = MBANDS_GN_BITALLOC16k; + } + + /* To adapt current energy band to PVQ freq band for sorting*/ + ener_vec[0] = Ener_per_bd_iQ[0] + Ener_per_bd_iQ[1]; + mvr2r( Ener_per_bd_iQ + 1, ener_vec, 15 ); + ener_vec[15] = ener_vec[14]; + + if ( L_frame == L_FRAME16k ) + { + ener_vec[16] = Ener_per_bd_iQ[16]; + ener_vec[17] = ( Ener_per_bd_iQ[16] + Ener_per_bd_iQ[17] ) * 0.5f; + ener_vec[18] = Ener_per_bd_iQ[17]; + ener_vec[19] = Ener_per_bd_iQ[17] * 0.8f; + } + + for ( i = 0; i < nb_tot_bands; i++ ) + { + ener_vec[i] = (float) ( (int16_t) ( ener_vec[i] * 4096.f + 0.5f ) ); + } + + /*------------------------------------------------------------------------ + * Determination of the number of bits available to the frequency domain + * Allocation of a maximum number of band to be encoded + *-----------------------------------------------------------------------*/ + + nb_bands_max = nb_tot_bands; + bit_new_bands = 5; + + if ( core_brate > ACELP_16k40 && L_frame == L_FRAME16k ) + { + bit_new_bands = 7; + } + + i = 0; + while ( i < SIZE_BRATE_INTERMED_TBL ) + { + if ( core_brate <= brate_intermed_tbl[i] ) + { + break; + } + + if ( brate_intermed_tbl[i] == ACELP_24k40 ) + { + break; + } + + i++; + } + + if ( element_mode > EVS_MONO && coder_type == AUDIO && + core_brate <= STEREO_GSC_BIT_RATE_ALLOC && brate_intermed_tbl[i] == ACELP_9k60 ) /* Bit allocation should be mapped to 8 kb/s instead of 9.6 kb/s in this case */ + { + i--; + } + + bit_index = BRATE2IDX( brate_intermed_tbl[i] ) * 17; + + bit_index_mem = bit_index; + + if ( ( coder_type == AUDIO || coder_type == INACTIVE ) && bwidth == NB ) + { + if ( core_brate >= ACELP_9k60 ) + { + *bit = (int16_t) ( core_brate * ( 1.0f / FRAMES_PER_SEC ) + 0.5f ) - bits_used - 25; + } + else + { + *bit = (int16_t) ( core_brate * ( 1.0f / FRAMES_PER_SEC ) + 0.5f ) - bits_used - 21; + } + + nb_tot_bands = 10; + } + else + { + *bit = (int16_t) ( core_brate * ( 1.0f / FRAMES_PER_SEC ) + 0.5f ) - bits_used - GSC_freq_bits[bit_index]; + } + + if ( L_frame == L_FRAME16k ) + { + *bit -= 8; + } + + if ( coder_type == INACTIVE && core_brate <= GSC_LRES_GAINQ_LIMIT ) /* can happen only for 2nd channel inactive */ + { + *bit += GSC_LRES_NB_NITS; + } + + if ( *bit > 0 ) + { + if ( GSC_IVAS_mode > 0 ) + { + SWB_bit_budget = *bit; + st_band = 5; + + set_f( bits_per_bands, 0, MBANDS_GN_BITALLOC16k ); + + /* 2- Decide the pourcentage of bits allocated to LF (between 50-75%) depending of the temporal contribution in GSC */ + bit_fracf = ( -0.125f * Diff_len + 76.0f ) / 100; + bit_fracf = check_bounds( bit_fracf, 0.50f, 0.75f ); + + /* Adjusment of the bitrate between LF and HF base on the content type */ + /* 1 = new GSC bit alloc + 2 = GSC bit alloc for tc frame + 3 = more music like (should not happen often given music is coded with dft) */ + + if ( GSC_IVAS_mode <= 3 ) + { + nb_bands_max -= 6; + } + + if ( GSC_IVAS_mode == 2 ) + { + bit_fracf += 0.1f; + nb_bands_max--; + } + + if ( GSC_IVAS_mode == 3 ) + { + bit_fracf -= 0.1f; + nb_bands_max += 3; + } + + /* First find how much we want to share between LF and HF, at low bitrate, a miminum of bits is needed in LF by limitating the number of bands*/ + /* Adjust the number of band based on the content type and bitrate */ + nb_bands_adj = 1.0f; + if ( GSC_IVAS_mode == 1 && core_brate < GSC_L_RATE_STG ) + { + nb_bands_adj = 0.0125f * SWB_bit_budget - 0.75f; + } + else if ( GSC_IVAS_mode != 2 && core_brate > GSC_H_RATE_STG ) + { + nb_bands_adj = 0.02f * SWB_bit_budget - 1.2f; + } + nb_bands_max = (int16_t) ( nb_bands_max * nb_bands_adj + 0.5f ); + nb_bands_max = check_bounds_s( nb_bands_max, 5, nb_tot_bands ); + + bit_fracf *= SWB_bit_budget; + + /* Estimation of the number of bit used in HF */ + /* with only the first weigthing The number of bits in max_ener_band[st_band-1] = 17% of bit_fracf */ + mb = .17f * bit_fracf; + mp = ( 2.0f * DSR_NB_PULSE ); + if ( core_brate < GSC_L_RATE_STG && GSC_IVAS_mode == 3 ) + { + mp = 1.5f * DSR_NB_PULSE; + } + else if ( core_brate < GSC_L_RATE_STG ) + { + mp = DSR_NB_PULSE; + } + + /* We want max_ener_band[st_band] <= max_ener_band[st_band-1] and max_ener_band[nb_bands_max-1] <= max_ener_band[st_band]*/ + /* We will estimate the number of bits to allocate of HF and put the remaining bits, if any, back on LF */ + /* compute the total possible number of band to be coded */ + nb_tot_bands = (int16_t) ( ( SWB_bit_budget - bit_fracf ) / ( mp + ( mb - mp ) / 2.0f ) ); + mp = min( mp, mb ); + if ( nb_tot_bands + st_band > nb_bands_max ) + { + bit_adj = ( ( mb + mp ) / 2 ) * ( nb_tot_bands + st_band - nb_bands_max ); + bit_adj = max( 0, bit_adj ); + nb_tot_bands = nb_bands_max - st_band; + bit_fracf += bit_adj; + } + nb_tot_bands += st_band; + + /* Allocate bits to LF */ + etmp = 0.23f; + for ( j = 0; j < st_band; j++ ) + { + i = j; + max_ener_band[j] = i; + ener_vec[i] = MIN16B; + bits_per_bands[j] = etmp * bit_fracf; + etmp -= 0.015f; + } + + SWB_bit_budget -= bit_fracf; + + /* Find low energy band in HF */ + set_s( nb_pulse_per_band, 2, MBANDS_GN_BITALLOC16k ); + for ( i = st_band + 2; i < nb_tot_bands - 1; i++ ) + { + if ( ener_vec[i] < ener_vec[i - 1] && ener_vec[i] < ener_vec[i + 1] ) + { + nb_pulse_per_band[i] = 1; + } + } + for ( j = st_band; j < nb_tot_bands; j++ ) + { + if ( j > 6 ) + { + i = maximum( ener_vec, nb_tot_bands, &etmp ); + } + else + { + i = j; + } + + max_ener_band[j] = i; + ener_vec[i] = MIN16B; + } + + /* Recompute the final bit distribution for HF */ + if ( nb_tot_bands > st_band ) + { + bit_fracf = DSR_NB_PULSE; + mb = ( SWB_bit_budget * 2 / ( nb_tot_bands - st_band ) ) - mp; + bit_fracf = ( mb - mp ) / ( nb_tot_bands - st_band ); + mb -= bit_fracf; + /* Do the distribution */ + for ( j = st_band; j < nb_tot_bands; j++ ) + { + if ( nb_pulse_per_band[max_ener_band[j]] > 1 ) + { + bits_per_bands[max_ener_band[j]] = mb; + } + else + { + bits_per_bands[max_ener_band[j]] = 4.5f; + } + mb -= bit_fracf; + SWB_bit_budget -= bits_per_bands[max_ener_band[j]]; + } + } + + /* Series of verification in case bit allocated != the budget */ + if ( SWB_bit_budget > 0 ) + { + i = st_band - 1; + while ( SWB_bit_budget > 0 ) + { + bits_per_bands[i]++; + SWB_bit_budget--; + i--; + if ( i == -1 ) + { + i = st_band - 1; + } + } + } + + nb_bands = nb_tot_bands; + + sum_bit = 0; + j = 0; + for ( i = 0; i < nb_bands; i++ ) + { + if ( bits_per_bands[i] > 112 ) + { + sum_bit += bits_per_bands[i] - 112; + bits_per_bands[i] = 112; + j = i + 1; + } + + /* safety check for overage bit reallocation */ + else if ( bits_per_bands[i] + sum_bit / 3 > 112 ) + { + j = i + 1; + } + } + + if ( sum_bit != 0 ) + { + sum_bit /= ( nb_bands - j ); + for ( i = j; i < nb_bands; i++ ) + { + bits_per_bands[i] += sum_bit; + } + } + } + else if ( GSC_noisy_speech ) + { + SWB_bit_budget = *bit; + nb_bands = 5; + + fzero_val = 0.0f; + if ( element_mode > EVS_MONO ) + { + fzero_val = MIN16B_FLT; + } + + if ( coder_type == UNVOICED && element_mode > EVS_MONO ) + { + nb_bands = 3; + if ( SWB_bit_budget > 20 ) + { + nb_bands = 5; + } + } + else if ( bwidth < SWB ) + { + nb_bands = 7; + } + + st_band = nb_bands; + + set_f( bits_per_bands, 0, MBANDS_GN ); + + bit_fracf = Find_bit_frac( nb_bands, (int16_t) SWB_bit_budget ); /* Supplementary bits distributed only on first bands */ + + nb_tot_bands = nb_bands_max - 6; + + if ( nb_tot_bands > 16 ) + { + nb_tot_bands = 16; + } + + for ( j = 0; j < 2; j++ ) + { + i = j; + max_ener_band[j] = i; + ener_vec[i] = fzero_val; + } + + if ( bwidth < SWB ) + { + if ( coder_type == UNVOICED && element_mode > EVS_MONO ) + { + nb_tot_bands = 5; + } + + for ( ; j < nb_bands; j++ ) + { + i = maximum( ener_vec, nb_tot_bands, &etmp ); + max_ener_band[j] = i; + ener_vec[i] = fzero_val; + } + } + else + { + for ( ; j < nb_bands; j++ ) + { + i = maximum( ener_vec, nb_tot_bands, &etmp ); + max_ener_band[j] = i; + ener_vec[i] = fzero_val; + } + } + + set_f( bits_per_bands, bit_fracf, nb_bands ); + } + else + { + bit_index++; + bit_tmp = *bit - GSC_freq_bits[bit_index]; + bit_index++; + nb_bands_max += GSC_freq_bits[bit_index]; + bit_index++; + + *pvq_len = 112; + st_band = 7; + + if ( L_frame == L_FRAME16k && core_brate > ACELP_16k40 ) + { + *pvq_len = 160; + st_band = 10; + nb_bands = *pvq_len / 16; + bit_tmp -= 35; + bit_new_bands = 5; + } + + if ( core_brate <= ACELP_9k60 ) + { + *pvq_len = 80; + st_band = 5; + if ( Diff_len == 0 ) + { + nb_bands_max += 2; + bit_tmp -= 13; + } + } + else if ( Diff_len == 0 ) + { + nb_bands_max += 2; + bit_tmp -= 17; + } + + nb_bands = *pvq_len / 16; + nb_bands_max = min( nb_bands_max, MBANDS_GN_BITALLOC16k ); + + /*------------------------------------------------------------------------ + * Adjustement of the maximum number of bands in function of the + * dynamics of the spectrum (more or less speech like) + *-----------------------------------------------------------------------*/ + + if ( coder_type == INACTIVE || noise_lev >= NOISE_LEVEL_SP3 ) + { + /* Probably classification error -> concentrate bits on LF */ + if ( L_frame == L_FRAME16k && core_brate >= ACELP_24k40 ) + { + nb_bands_max = nb_tot_bands - 2; + } + else if ( core_brate >= ACELP_16k40 ) + { + nb_bands_max = nb_bands + 2; + } + else if ( core_brate >= ACELP_8k00 ) + { + nb_bands_max = nb_bands + 1; + } + else + { + nb_bands_max = nb_bands; + } + } + else if ( noise_lev >= NOISE_LEVEL_SP2 || ( core_brate <= ACELP_13k20 && core_brate >= ACELP_9k60 && cor_strong_limit == 0 ) ) /* Very low dynamic, tend to speech, do not try to code HF at all */ + { + nb_bands_max -= 2; + } + else if ( noise_lev >= NOISE_LEVEL_SP1 ) /* Very low dynamic, tend to speech, code less HF */ + { + nb_bands_max -= 1; + } + + if ( L_frame == L_FRAME16k ) + { + if ( core_brate < ACELP_24k40 ) + { + nb_bands_max -= 4; + } + else if ( core_brate < ACELP_32k ) + { + if ( Diff_len > 0 || noise_lev >= NOISE_LEVEL_SP2 ) + { + nb_bands_max -= 2; + bit_new_bands *= 2; + } + } + else if ( core_brate >= ACELP_32k ) + { + bit_new_bands *= 2; + } + } + + if ( bwidth == NB && nb_bands_max > 10 ) + { + nb_bands_max = 10; + } + + /*------------------------------------------------------------------------ + * Find extra number of band to code according to bitrate availables + *-----------------------------------------------------------------------*/ + + while ( bit_tmp >= bit_new_bands && nb_bands <= nb_bands_max - 1 ) + { + bit_tmp -= bit_new_bands; + nb_bands++; + } + + /*------------------------------------------------------------------------ + * Fractional bits to distribute on the first x bands + *-----------------------------------------------------------------------*/ + + if ( L_frame == L_FRAME16k && core_brate > ACELP_32k ) + { + bit_fracf = 0; + } + else + { + bit_fracf = Find_bit_frac( st_band, bit_tmp ); /* Supplementary bits distributed only on first bands */ + } + + /*------------------------------------------------------------------------ + * Complete the bit allocation per frequency band + *-----------------------------------------------------------------------*/ + + imax = 5; + if ( core_brate > ACELP_9k60 ) + { + imax = 7; + } + + for ( i = 0; i < imax; i++ ) + { + bits_per_bands[i] = GSC_freq_bits[bit_index] + bit_fracf; + bit_index++; + } + + if ( L_frame == L_FRAME16k && core_brate > ACELP_16k40 ) + { + bit_index = 0; + i = imax - 1; + bits_per_bands[i] += Compl_GSC_freq_bits[bit_index]; + i++; + bit_index++; + + for ( ; i < 10; i++ ) + { + bits_per_bands[i] += Compl_GSC_freq_bits[bit_index] + bit_fracf; + bit_index++; + } + } + + if ( Diff_len == 0 ) + { + bit_index = bit_index_mem + 10; + for ( i = 0; i < 7; i++ ) + { + bits_per_bands[i] += GSC_freq_bits[bit_index]; + bit_index++; + } + } + + if ( bit_fracf < 0 ) + { + for ( j = 0; j < nb_tot_bands; j++ ) + { + bits_per_bands[j] = max( bits_per_bands[j], 0 ); + } + } + + /*-------------------------------------------------------------------------- + * Complete the bit allocation per frequency band for 16kHz high brate mode + *--------------------------------------------------------------------------*/ + + if ( L_frame == L_FRAME16k && core_brate > ACELP_32k ) + { + for ( j = st_band; j < nb_bands; j++ ) + { + bits_per_bands[j] = bit_new_bands; + } + + bit_fracf = ( 1.0f / nb_bands ) * ( bit_tmp ); + + etmp = 2.0f * bit_fracf / ( nb_bands + 1 ); + bit_fracf = etmp; + for ( j = nb_bands - 1; j >= 0; j-- ) + { + bits_per_bands[j] += etmp; + etmp += bit_fracf; + } + } + else + { + for ( j = st_band; j < nb_bands; j++ ) + { + bits_per_bands[j] = bit_new_bands; + } + } + + /*-------------------------------------------------------------------------- + * Compute a maximum band (band offset) for the search on maximal energy + * This is function of the spectral dynamic and the bitrate + *--------------------------------------------------------------------------*/ + + bandoffset = nb_tot_bands - ( nb_bands + 2 ); + + if ( noise_lev <= NOISE_LEVEL_SP1a ) + { + bandoffset--; + } + else if ( ( core_brate <= ACELP_13k20 && ( coder_type == INACTIVE || noise_lev >= NOISE_LEVEL_SP3 ) ) || ( core_brate <= ACELP_13k20 && core_brate >= ACELP_9k60 && cor_strong_limit == 0 ) ) + { + bandoffset++; + } + + if ( bandoffset < 0 ) + { + bandoffset = 0; + } + + /*-------------------------------------------------------------------------- + * Initiazed sorted vector + * For the first x bands to be included in th final sorted vector + * Sort the remaining bands in decrease energy order + *--------------------------------------------------------------------------*/ + + for ( j = 0; j < nb_tot_bands; j++ ) + { + max_ener_band[j] = -10; + } + + for ( j = 0; j < st_band; j++ ) + { + max_ener_band[j] = j; + ener_vec[j] = -10; + } + + pos = st_band; + for ( ; j < nb_bands; j++ ) + { + i = maximum( ener_vec, nb_tot_bands - bandoffset, &etmp ); + if ( i > pos ) + { + pos = i; + } + max_ener_band[j] = i; + ener_vec[i] = -10; + } + + /* re-allocate bits to the frames such that the highest band with allocated bits is higher than the threshold */ + if ( nb_tot_bands - bandoffset > nb_bands && ( pos > 7 && core_brate == ACELP_8k00 ) && bwidth == WB ) + { + band = nb_tot_bands - bandoffset - nb_bands; + for ( j = 0; j < band; j++ ) + { + i = maximum( ener_vec, nb_tot_bands - bandoffset, &etmp ); + max_ener_band[nb_bands + j] = i; + ener_vec[i] = -10; + bits_per_bands[nb_bands + j] = 5; + } + nb_bands += band; + + bit_tmp = 5 * band; + if ( band <= 2 ) + { + for ( j = st_band - 1; j < nb_bands; j++ ) + { + bits_per_bands[j] += 1; + } + bit_tmp += nb_bands - st_band + 1; + } + + i = 0; + j = 0; + while ( bit_tmp > 0 ) + { + bits_per_bands[j] -= 1; + + if ( j == st_band - 1 - i ) + { + j = 0; + } + else + { + ++j; + } + + if ( j == 0 && i < st_band - 1 ) + { + i++; + } + + bit_tmp -= 1; + } + } + + /*-------------------------------------------------------------------------- + * Bit sum verification for GSC inactive at very high rate + * The maximum number of bits per band of length 16 is 112 + * Redistribute the overage bits if needed + *--------------------------------------------------------------------------*/ + + sum_bit = 0; + j = 0; + for ( i = 0; i < nb_bands; i++ ) + { + if ( bits_per_bands[i] > 112 ) + { + sum_bit += bits_per_bands[i] - 112; + bits_per_bands[i] = 112; + j = i + 1; + } + + /* safety check for overage bit reallocation */ + else if ( bits_per_bands[i] + sum_bit / 3 > 112 ) + { + j = i + 1; + } + } + + if ( sum_bit != 0 ) + { + sum_bit /= ( nb_bands - j ); + for ( i = j; i < nb_bands; i++ ) + { + bits_per_bands[i] += sum_bit; + } + } + } + + /*-------------------------------------------------------------------------- + * second step of bit sum verification, normally sum_bit == *bit + *--------------------------------------------------------------------------*/ + + sum_bit = 0.00f; + for ( i = 0; i < nb_bands; i++ ) + { + bits_per_bands[i] = (float) floor( bits_per_bands[i] ); + sum_bit += bits_per_bands[i]; + } + + if ( GSC_IVAS_mode != 0 && sum_bit < *bit ) /* If we need to add bits, we are doing it on the LF */ + { + reajust_bits( bits_per_bands, 0, nb_bands, (int16_t) sum_bit, *bit ); + } + else + { + reajust_bits( bits_per_bands, nb_bands - 1, 0, (int16_t) sum_bit, *bit ); + } + + /*-------------------------------------------------------------------------- + * Recompute the real number/length of frequency bands to encode + *--------------------------------------------------------------------------*/ + + *nb_subbands = nb_bands; + *pvq_len = *nb_subbands * 16; + + /*-------------------------------------------------------------------------- + * Concatenate bands (encoder only) + *--------------------------------------------------------------------------*/ + + if ( exc_diff != NULL ) + { + for ( j = 0; j < nb_bands; j++ ) + { + mvr2r( exc_diff + max_ener_band[j] * 16, concat_in + j * 16, 16 ); + } + } + + set_s( bits_per_bands_s, 0, nb_tot_bands ); + + for ( j = 0; j < nb_bands; j++ ) + { + bits_per_bands_s[j] = ( (int16_t) bits_per_bands[j] ) << 3; + } + } + else /* *bit == 0 */ + { + set_s( bits_per_bands_s, 0, nb_tot_bands ); + *nb_subbands = 0; + *pvq_len = 0; + } + + return; +} + + +/*-------------------------------------------------------------------* + * reajust_bits() + * + * + *-------------------------------------------------------------------*/ + +static void reajust_bits( + float *bits_per_bands, + const int16_t st_band, + const int16_t end_band, + const int16_t sum_bit_in, + const int16_t bit_bdgt_in ) +{ + int16_t i, amount_to_add, incr; + int16_t bit_bdgt, sum_bit; + + incr = 1; + if ( end_band < st_band ) + { + incr = -1; + } + + if ( bit_bdgt_in < sum_bit_in ) + { + amount_to_add = -1; + bit_bdgt = sum_bit_in; + sum_bit = bit_bdgt_in; + } + else + { + bit_bdgt = bit_bdgt_in; + sum_bit = sum_bit_in; + amount_to_add = 1; + } + + i = st_band; + while ( bit_bdgt > sum_bit ) + { + if ( amount_to_add > 0 || ( amount_to_add < 0 && bits_per_bands[i] > 1 ) ) + { + bits_per_bands[i] += amount_to_add; + sum_bit += (int16_t) abs( amount_to_add ); + } + + i += incr; + if ( i == end_band ) + { + i = st_band; + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * Find_bit_frac() + * + * Computes the fraction of the remaining bit budget to allocate to the bands + *-------------------------------------------------------------------*/ + +static float Find_bit_frac( + const int16_t nb_band, + const int16_t remaining_bits ) +{ + float var_out; + int16_t inv_bandQ15; + int32_t L_num; + + inv_bandQ15 = 6553; + if ( nb_band == 7 ) + { + inv_bandQ15 = 4681; + } + else if ( nb_band == 3 ) + { + inv_bandQ15 = 10922; + } + else if ( nb_band == 4 ) + { + inv_bandQ15 = 8192; + } + else if ( nb_band == 5 ) + { + inv_bandQ15 = 6536; + } + else if ( nb_band == 10 ) + { + inv_bandQ15 = 3277; + } + else + { + inv_bandQ15 = (int16_t) ( ( 1.0f / nb_band ) * 32678 + 0.5f ); + } + + L_num = inv_bandQ15 * remaining_bits; + L_num *= 8; + var_out = L_num / 262144.0f; + + return ( var_out ); +} diff --git a/lib_com/gs_gains.c b/lib_com/gs_gains.c new file mode 100644 index 0000000000000000000000000000000000000000..72b1ccf357320cf7fbec5a40a0324fb0359302bc --- /dev/null +++ b/lib_com/gs_gains.c @@ -0,0 +1,692 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * Local function prototypes + *-------------------------------------------------------------------*/ + +static int16_t VDQ_vec( float *Qvec_out, const float *mean_dic, const float *dic, const int16_t index, const int16_t vec_en ); + +/*-------------------------------------------------------------------* + * Comp_and_apply_gain() + * + * Compute and apply the quantized per band gain + *-------------------------------------------------------------------*/ + +void Comp_and_apply_gain( + float exc_diffQ[], /* i/o: Quantized excitation */ + float Ener_per_bd_iQ[], /* o : Target ener per band */ + float Ener_per_bd_yQ[], /* o : Ener per band for norm vector */ + int16_t Mbands_gn, /* i : number of bands */ + const int16_t ReUseGain /* i : Reuse the gain in Ener_per_bd_yQ */ +) +{ + int16_t i, i_band; + int16_t StartBin, NB_Qbins; + float y_gain; + + /* Recreate excitation for local synthesis and decoder */ + StartBin = 0; + NB_Qbins = 0; + for ( i_band = 0; i_band < Mbands_gn; i_band++ ) + { + StartBin += NB_Qbins; + NB_Qbins = mfreq_bindiv_loc[i_band]; + if ( ReUseGain == 1 ) + { + y_gain = Ener_per_bd_yQ[i_band]; + } + else + { + y_gain = (float) pow( 10, ( Ener_per_bd_iQ[i_band] - Ener_per_bd_yQ[i_band] ) ); + Ener_per_bd_yQ[i_band] = y_gain; + } + + for ( i = StartBin; i < NB_Qbins + StartBin; i++ ) + { + exc_diffQ[i] *= y_gain; + } + } + + return; +} + + +/*------------------------------------------------------------------* + * Ener_per_band_comp() + * + * Compute the energy per band in log domain for quantization purposes + * Loops are decomposed to accomodate the PVQ quantization + *------------------------------------------------------------------*/ + +void Ener_per_band_comp( + const float exc_diff[], /* i : target signal */ + float y_gain4[], /* o : Energy per band to quantize */ + const int16_t Mband, /* i : Max band */ + const int16_t Eflag, /* i : flag of highest band */ + const int16_t L_frame /* i : frame length */ +) +{ + float etmp; + const float *pt; + int16_t i, j; + + pt = exc_diff; + for ( j = 0; j < 2; j++ ) + { + y_gain4[j] = 0; + etmp = 0.02f; + + pt = exc_diff + j * 8; + for ( i = 0; i < 8; i++ ) + { + etmp += ( *pt * *pt ); + pt++; + } + + /* normalized to 16 bins to easy the quantization */ + y_gain4[j] = (float) log10( sqrt( 2 * etmp ) ); + } + + for ( j = 1; j < Mband - 2; j++ ) + { + etmp = 0.01f; + + pt = exc_diff + j * 16; + for ( i = 0; i < 16; i++ ) + { + etmp += ( *pt * *pt ); + pt++; + } + + y_gain4[j + 1] = (float) log10( sqrt( etmp ) ); + } + + if ( Eflag == 1 ) + { + etmp = 0.01f; + + pt = exc_diff + j * 16; + for ( i = 0; i < 32; i++ ) + { + etmp += ( *pt * *pt ); + pt++; + } + + y_gain4[j + 1] = (float) log10( sqrt( etmp / 2 ) ); + } + + if ( L_frame == L_FRAME16k ) + { + etmp = 0.01f; + + for ( i = 0; i < 32; i++ ) + { + etmp += ( *pt * *pt ); + pt++; + } + + y_gain4[j + 2] = (float) log10( sqrt( etmp / 2 ) ); + + for ( i = 0; i < 32; i++ ) + { + etmp += ( *pt * *pt ); + pt++; + } + + y_gain4[j + 3] = (float) log10( sqrt( etmp / 2 ) ); + } + + return; +} + + +/*-------------------------------------------------------------------* + * GSC_gain_DQ() + * + * Form the final vector after gain quantization/Dequantization + * Common to both encoder and decoder + *-------------------------------------------------------------------*/ + +static void GSC_gain_DQ( + const int16_t element_mode, /* i : element mode */ + const int16_t enc_dec, /* i : encoder/decoder flag */ + const int16_t coder_type, /* i : Coder type */ + const int16_t Mbands_gn, /* i : Number of band */ + const int32_t core_brate, /* i : Core bitrate */ + const float mean_g, /* i : Average gain */ + const float *Gain_in, /* i : Unquantized gain vector */ + float *Gain_out /* o : Level adjusted unquantized gain vector */ +) +{ + float Gain_off; + int16_t i; + + /* Gain adjustment to fit ACELP generic inactive coding gain at low rate */ + Gain_off = 0.0f; + if ( coder_type == INACTIVE || coder_type == UNVOICED ) + { + if ( core_brate <= ACELP_5k00 && coder_type == UNVOICED ) + { + Gain_off = 9.f; + } + else if ( core_brate <= ACELP_7k20 ) + { + Gain_off = 8.f; /* 0 dB */ + } + else if ( core_brate <= ACELP_8k00 ) + { + Gain_off = 6.6f; /* ~-3.3 dB */ + } + else if ( core_brate <= ACELP_9k60 ) + { + Gain_off = 4.8f; /* ~-2.4 dB */ + } + else if ( core_brate <= ACELP_11k60 ) + { + Gain_off = 3.5f; /* ~-2.4 dB */ + } + else if ( core_brate <= ACELP_13k20 ) + { + Gain_off = 3.0f; /* ~-2.4 dB */ + } + } + + if ( coder_type != INACTIVE && coder_type != UNVOICED ) + { + for ( i = 0; i < Mbands_gn; i++ ) + { + Gain_out[i] = Gain_in[i] + mean_g; + } + } + else + { + /*mimic ACELP decay of energy for low rates*/ + if ( element_mode == EVS_MONO && enc_dec == DEC ) + { + /* This is to keep EVS mono bit-exact with the standard (there might be a small desynchronization between encoder and decoder but there is no real quality or interop. issue) */ + for ( i = 0; i < Mbands_gn; i++ ) + { + Gain_out[i] += mean_g - i * ( Gain_off / 20.f ) / ( (float) Mbands_gn ); + } + } + else + { + for ( i = 0; i < Mbands_gn; i++ ) + { + Gain_out[i] = Gain_in[i] + mean_g - ( i * ( Gain_off / 20.f ) / ( (float) Mbands_gn ) ); + } + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * gsc_gainQ() + * + * Quantization of the energy per band + *-------------------------------------------------------------------*/ + +float gsc_gainQ( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const int16_t element_mode, /* i : element mode */ + const int16_t idchan, /* i : channel ID */ + const float y_gain4[], /* i : Energy per band */ + float y_gainQ[], /* o : quantized energy per band */ + const int32_t core_brate, /* i : Core rate */ + const int16_t coder_type, /* i : coding type */ + const int16_t bwidth, /* i : input signal bandwidth */ + const int16_t L_frame, /* i : frame length */ + const int16_t tdm_LRTD_flag, /* i : LRTD stereo mode flag */ + const int32_t core_brate_inp /* i : true core bitrate */ +) +{ + float y_gain_tmp[MBANDS_GN16k], y_gain_tmp2[MBANDS_GN16k]; + int16_t i, idx_g = 0; + float mean_4g[1], ftmp1; + int16_t Mbands_gn = MBANDS_GN; + float y_gain_tmp3[MBANDS_GN]; + + if ( L_frame == L_FRAME16k ) + { + Mbands_gn = MBANDS_GN16k; + } + + mean_4g[0] = 0; + + if ( ( coder_type == AUDIO || coder_type == INACTIVE ) && bwidth == NB ) + { + ftmp1 = mean( y_gain4, 10 ) - 0.6f; + for ( i = 0; i < Mbands_gn; i++ ) + { + if ( y_gain4[i] < ftmp1 ) + { + y_gain_tmp2[i] = ftmp1; + } + else + { + y_gain_tmp2[i] = y_gain4[i]; + } + } + + /* Quantized mean gain without clipping */ + mean_4g[0] = mean( y_gain_tmp2, 10 ); + idx_g = (int16_t) vquant( mean_4g, Gain_meanNB, mean_4g, Gain_mean_dicNB, 1, 64 ); + push_indice( hBstr, IND_MEAN_GAIN2, idx_g, 6 ); + + for ( i = 0; i < Mbands_gn; i++ ) + { + y_gain_tmp[i] = y_gain_tmp2[i] - mean_4g[0]; + } + + if ( y_gain_tmp[9] < -0.3f ) + { + y_gain_tmp[9] = -0.3f; + } + + set_f( y_gain_tmp + 10, 0.0f, MBANDS_GN - 10 ); + idx_g = (int16_t) vquant( y_gain_tmp, Mean_dic_NB, y_gain_tmp, Gain_dic1_NB, 3, 64 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 6 ); + + if ( core_brate < ACELP_9k60 ) + { + idx_g = vquant( y_gain_tmp + 3, Mean_dic_NB + 3, y_gain_tmp + 3, Gain_dic2_NB, 3, 32 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 5 ); + + idx_g = vquant( y_gain_tmp + 6, Mean_dic_NB + 6, y_gain_tmp + 6, Gain_dic3_NB, 4, 16 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 4 ); + } + else + { + idx_g = vquant( y_gain_tmp + 3, Mean_dic_NB + 3, y_gain_tmp + 3, Gain_dic2_NBHR, 3, 64 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 6 ); + + idx_g = vquant( y_gain_tmp + 6, Mean_dic_NB + 6, y_gain_tmp + 6, Gain_dic3_NBHR, 4, 128 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 7 ); + } + + if ( core_brate <= ACELP_9k60 && coder_type == INACTIVE ) + { + /* Some energy is needed in high band for stat_noise_uv_enc() to be functional in inactive speech */ + y_gain_tmp[10] = mean( y_gain_tmp + 6, 3 ); + y_gain_tmp[11] = mean( y_gain_tmp + 7, 3 ); + y_gain_tmp[12] = mean( y_gain_tmp + 8, 3 ); + y_gain_tmp[13] = mean( y_gain_tmp + 9, 3 ); + y_gain_tmp[14] = mean( y_gain_tmp + 10, 3 ); + y_gain_tmp[15] = mean( y_gain_tmp + 11, 3 ); + } + else + { + set_f( y_gain_tmp + 10, 0, MBANDS_GN - 10 ); + } + } + else + { + ftmp1 = mean( y_gain4, 16 ); + for ( i = 0; i < Mbands_gn; i++ ) + { + if ( y_gain4[i] < ftmp1 - 0.6f ) + { + y_gain_tmp2[i] = ftmp1 - .6f; + } + else if ( y_gain4[i] > ftmp1 + 0.6f ) + { + y_gain_tmp2[i] = ftmp1 + 0.6f; + } + else + { + y_gain_tmp2[i] = y_gain4[i]; + } + } + + mean_4g[0] = mean( y_gain_tmp2, 16 ); + idx_g = vquant( mean_4g, mean_m, mean_4g, mean_gain_dic, 1, 64 ); + push_indice( hBstr, IND_MEAN_GAIN2, idx_g, 6 ); + + /* Subtraction of the average gain */ + for ( i = 0; i < Mbands_gn; i++ ) + { + y_gain_tmp[i] = y_gain_tmp2[i] - mean_4g[0]; + } + + if ( core_brate < ACELP_9k60 ) + { + /* prediction and quantization of the average gain */ + + /*--------------------------------------------------------------------------------------* + * Quantization of the first 8 bands + * Keep only 4 bands out of the last 8 bands + *--------------------------------------------------------------------------------------*/ + + mvr2r( y_gain_tmp, y_gain_tmp2, 8 ); + + y_gain_tmp2[8] = y_gain_tmp[8]; + y_gain_tmp2[9] = y_gain_tmp[10]; + y_gain_tmp2[10] = y_gain_tmp[12]; + y_gain_tmp2[11] = y_gain_tmp[14]; + + idx_g = 0; + idx_g = vquant( y_gain_tmp2, YGain_mean_LR, y_gain_tmp2, YGain_dic1_LR, 3, 32 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 5 ); + + if ( !( coder_type == INACTIVE && tdm_LRTD_flag == 0 && idchan == 1 ) || core_brate_inp > GSC_LRES_GAINQ_LIMIT ) + { + idx_g = vquant( y_gain_tmp2 + 3, YGain_mean_LR + 3, y_gain_tmp2 + 3, YGain_dic2_LR, 4, 32 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 5 ); + + /*----------------------------------------------------------------------* + * Vector quantization of the first 8 bands + quantization of the 4 bands out of the last 8 + * Interpolation of the last 4 bands Q to create bands 8-16 + *----------------------------------------------------------------------*/ + + idx_g = vquant( y_gain_tmp2 + 7, YGain_mean_LR + 7, y_gain_tmp2 + 7, YGain_dic3_LR, 5, 32 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 5 ); + + set_f( y_gain_tmp2 + 12, 0, MBANDS_GN - 12 ); + + /* Update to quantized vector */ + mvr2r( y_gain_tmp2, y_gain_tmp, 8 ); + + mvr2r( y_gain_tmp2 + 8, y_gain_tmp3, 4 ); + set_f( y_gain_tmp + 8, 0, 8 ); + fft_rel( y_gain_tmp2 + 8, 4, 2 ); + + mvr2r( y_gain_tmp2 + 8, y_gain_tmp + 8, 3 ); + y_gain_tmp[15] = y_gain_tmp2[11]; + ifft_rel( y_gain_tmp + 8, 8, 3 ); + + for ( i = 8; i < 16; i++ ) + { + y_gain_tmp[i] *= 1.41f; + } + + y_gain_tmp[8] = y_gain_tmp3[0]; + y_gain_tmp[10] = y_gain_tmp3[1]; + y_gain_tmp[12] = y_gain_tmp3[2]; + y_gain_tmp[14] = y_gain_tmp3[3]; + } + else + { + mvr2r( y_gain_tmp2, y_gain_tmp, 3 ); + set_f( y_gain_tmp + 3, 0.0f, MBANDS_GN16k - 3 ); + } + } + else + { + if ( L_frame == L_FRAME ) + { + idx_g = vquant( y_gain_tmp, YG_mean16, y_gain_tmp, YG_dicMR_1, 4, 64 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 6 ); + + idx_g = vquant( y_gain_tmp + 4, YG_mean16 + 4, y_gain_tmp + 4, YG_dicMR_2, 4, 32 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 5 ); + + idx_g = vquant( y_gain_tmp + 8, YG_mean16 + 8, y_gain_tmp + 8, YG_dicMR_3, 4, 32 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 5 ); + + idx_g = vquant( y_gain_tmp + 12, YG_mean16 + 12, y_gain_tmp + 12, YG_dicMR_4, 4, 16 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 4 ); + } + else + { + idx_g = vquant( y_gain_tmp, YG_mean16HR, y_gain_tmp, YG_dicHR_1, 4, 128 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 7 ); + + idx_g = vquant( y_gain_tmp + 4, YG_mean16HR + 4, y_gain_tmp + 4, YG_dicHR_2, 4, 64 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 6 ); + + idx_g = vquant( y_gain_tmp + 8, YG_mean16HR + 8, y_gain_tmp + 8, YG_dicHR_3, 4, 64 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 6 ); + + idx_g = vquant( y_gain_tmp + 12, YG_mean16HR_16kHz, y_gain_tmp + 12, YG_dicHR_4_16kHz, 4, 64 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 6 ); + + idx_g = vquant( y_gain_tmp + 16, YG_meanL2G_16kHz, y_gain_tmp + 16, YG_dicL2G_16kHz, 2, 8 ); + push_indice( hBstr, IND_Y_GAIN_HF, idx_g, 3 ); + } + } + } + + GSC_gain_DQ( element_mode, ENC, coder_type, Mbands_gn, core_brate, mean_4g[0], y_gain_tmp, y_gainQ ); + + return mean_4g[0]; +} + +/*-------------------------------------------------------------------* + * gsc_gaindec() + * + * Generic signal frequency band decoding and application + *-------------------------------------------------------------------*/ + +/*! r: average frequency gain */ +float gsc_gaindec( + Decoder_State *st, /* i/o: decoder state structure */ + float y_gainQ[], /* o : quantized gain per band */ + const int32_t core_brate, /* i : core used */ + float old_y_gain[], /* i/o: AR gain quantizer for low rate */ + const int16_t coder_type, /* i : coding type */ + const int16_t bwidth /* i : input signal bandwidth */ +) +{ + int16_t idx_g, i; + float mean_4g; + int16_t Mbands_gn = MBANDS_GN; + float y_gain_tmp3[MBANDS_GN]; + + if ( st->L_frame == L_FRAME16k ) + { + Mbands_gn = MBANDS_GN16k; + } + + if ( ( coder_type == AUDIO || coder_type == INACTIVE ) && bwidth == NB ) + { + idx_g = get_next_indice( st, 6 ); + VDQ_vec( &mean_4g, Gain_meanNB, Gain_mean_dicNB, idx_g, 1 ); + + idx_g = get_next_indice( st, 6 ); + VDQ_vec( y_gainQ, Mean_dic_NB, Gain_dic1_NB, idx_g, 3 ); + + if ( core_brate < ACELP_9k60 ) + { + idx_g = get_next_indice( st, 5 ); + VDQ_vec( y_gainQ + 3, Mean_dic_NB + 3, Gain_dic2_NB, idx_g, 3 ); + + idx_g = get_next_indice( st, 4 ); + VDQ_vec( y_gainQ + 6, Mean_dic_NB + 6, Gain_dic3_NB, idx_g, 4 ); + } + else + { + idx_g = get_next_indice( st, 6 ); + VDQ_vec( y_gainQ + 3, Mean_dic_NB + 3, Gain_dic2_NBHR, idx_g, 3 ); + + idx_g = get_next_indice( st, 7 ); + VDQ_vec( y_gainQ + 6, Mean_dic_NB + 6, Gain_dic3_NBHR, idx_g, 4 ); + } + + if ( core_brate <= ACELP_9k60 && coder_type == INACTIVE ) + { + /* Some energy is needed in high band for stat_noise_uv_enc to be functional in inactive speech */ + y_gainQ[10] = mean( y_gainQ + 6, 3 ); + y_gainQ[11] = mean( y_gainQ + 7, 3 ); + y_gainQ[12] = mean( y_gainQ + 8, 3 ); + y_gainQ[13] = mean( y_gainQ + 9, 3 ); + y_gainQ[14] = mean( y_gainQ + 10, 3 ); + y_gainQ[15] = mean( y_gainQ + 11, 3 ); + } + else + { + set_f( y_gainQ + 10, 0, MBANDS_GN - 10 ); + } + } + else + { + idx_g = get_next_indice( st, 6 ); + VDQ_vec( &mean_4g, mean_m, mean_gain_dic, idx_g, 1 ); + + if ( core_brate < ACELP_9k60 ) + { + /*--------------------------------------------------------------------------------------* + * UQ of the first 8 bands and half of the last 8 bands + *--------------------------------------------------------------------------------------*/ + + idx_g = get_next_indice( st, 5 ); + VDQ_vec( y_gainQ, YGain_mean_LR, YGain_dic1_LR, idx_g, 3 ); + + if ( !( coder_type == INACTIVE && st->tdm_LRTD_flag == 0 && st->idchan == 1 ) || st->core_brate > GSC_LRES_GAINQ_LIMIT ) + { + idx_g = get_next_indice( st, 5 ); + VDQ_vec( y_gainQ + 3, YGain_mean_LR + 3, YGain_dic2_LR, idx_g, 4 ); + + /*----------------------------------------------------------------------* + * Interpolation of the last 4 Q bands to create bands 8-16 + * And scaling + *----------------------------------------------------------------------*/ + + idx_g = get_next_indice( st, 5 ); + VDQ_vec( y_gainQ + 7, YGain_mean_LR + 7, YGain_dic3_LR, idx_g, 5 ); + + mvr2r( y_gainQ + 8, y_gain_tmp3, 4 ); + set_f( y_gainQ + 12, 0.0f, 4 ); + + fft_rel( y_gainQ + 8, 4, 2 ); + + y_gainQ[15] = y_gainQ[11]; + y_gainQ[11] = 0.0f; + + ifft_rel( y_gainQ + 8, 8, 3 ); + + for ( i = 8; i < 16; i++ ) + { + y_gainQ[i] *= 1.41f; + } + + /*----------------------------------------------------------------------* + * Copy the true Q values in the specific bands + *----------------------------------------------------------------------*/ + + y_gainQ[8] = y_gain_tmp3[0]; + y_gainQ[10] = y_gain_tmp3[1]; + y_gainQ[12] = y_gain_tmp3[2]; + y_gainQ[14] = y_gain_tmp3[3]; + } + else + { + set_f( y_gainQ + 3, 0.0f, MBANDS_GN16k - 3 ); + } + } + else + { + if ( st->L_frame == L_FRAME ) + { + idx_g = get_next_indice( st, 6 ); + VDQ_vec( y_gainQ, YG_mean16, YG_dicMR_1, idx_g, 4 ); + + idx_g = get_next_indice( st, 5 ); + VDQ_vec( y_gainQ + 4, YG_mean16 + 4, YG_dicMR_2, idx_g, 4 ); + + idx_g = get_next_indice( st, 5 ); + VDQ_vec( y_gainQ + 8, YG_mean16 + 8, YG_dicMR_3, idx_g, 4 ); + + idx_g = get_next_indice( st, 4 ); + VDQ_vec( y_gainQ + 12, YG_mean16 + 12, YG_dicMR_4, idx_g, 4 ); + } + else + { + idx_g = get_next_indice( st, 7 ); + VDQ_vec( y_gainQ, YG_mean16HR, YG_dicHR_1, idx_g, 4 ); + + idx_g = get_next_indice( st, 6 ); + VDQ_vec( y_gainQ + 4, YG_mean16HR + 4, YG_dicHR_2, idx_g, 4 ); + + idx_g = get_next_indice( st, 6 ); + VDQ_vec( y_gainQ + 8, YG_mean16HR + 8, YG_dicHR_3, idx_g, 4 ); + + idx_g = get_next_indice( st, 6 ); + VDQ_vec( y_gainQ + 12, YG_mean16HR_16kHz, YG_dicHR_4_16kHz, idx_g, 4 ); + + idx_g = get_next_indice( st, 3 ); + VDQ_vec( y_gainQ + 16, YG_meanL2G_16kHz, YG_dicL2G_16kHz, idx_g, 2 ); + } + } + } + + mvr2r( y_gainQ, old_y_gain, Mbands_gn ); + + GSC_gain_DQ( st->element_mode, DEC, coder_type, Mbands_gn, core_brate, mean_4g, y_gainQ, y_gainQ ); + + return mean_4g; +} + + +/*-------------------------------------------------------------------* + * VDQ_vec() + * + * Return the dequantized vector of index + *-------------------------------------------------------------------*/ + +static int16_t VDQ_vec( + float *Qvec_out, /* o : Quanitzed vector */ + const float *mean_dic, /* i : average codebook */ + const float *dic, /* i : codebook */ + const int16_t index, /* i : index of codebook*/ + const int16_t vec_en /* i : vector length */ +) +{ + int16_t i, j; + + j = index * vec_en; + for ( i = 0; i < vec_en; i++ ) + { + Qvec_out[i] = dic[j++]; + } + + for ( i = 0; i < vec_en; i++ ) + { + Qvec_out[i] += mean_dic[i]; + } + + return index; +} diff --git a/lib_com/gs_inact_switching.c b/lib_com/gs_inact_switching.c new file mode 100644 index 0000000000000000000000000000000000000000..04ad8a3ebbfb855848491864963473326b7bf971 --- /dev/null +++ b/lib_com/gs_inact_switching.c @@ -0,0 +1,145 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * Local constants + *-------------------------------------------------------------------*/ + +#define ALPHA0 0.5f +#define BETA0 ( 1.0f - ALPHA0 ) + +/*-------------------------------------------------------------------* + * inact_switch_ematch() + * + * Apply energy matching when swithcing to INACTIVE frame coded by the GSC technology + *-------------------------------------------------------------------*/ + +void inact_switch_ematch( + float exc2[], /* i/o: CELP/GSC excitation buffer */ + float dct_exc_tmp[], /* i : GSC excitation in DCT domain */ + float lt_ener_per_band[], /* i/o: Long term energy per band */ + const int16_t coder_type, /* i : Coder type */ + const int16_t L_frame, /* i : Frame length */ + const int32_t total_brate, /* i : Total bitrate */ + const int16_t bfi, /* i : frame lost indicator */ + const int16_t last_core, /* i : Last core used */ + const int16_t last_codec_mode, /* i : Last codec mode */ + const int16_t tdm_low_rate_mode, /* i : secondary channel low rate mode flag*/ + const int16_t element_mode /* i : element mode */ +) +{ + float Ener_per_bd[MBANDS_GN16k]; + float ftmp; + float *pt_exc; + int16_t j, i; + + + /*-------------------------------------------------------------------------- + * average energy per band + *--------------------------------------------------------------------------*/ + + if ( ( coder_type == AUDIO || ( coder_type == UNVOICED && tdm_low_rate_mode == 1 ) ) && bfi == 0 ) + { + Ener_per_band_comp( dct_exc_tmp, Ener_per_bd, MBANDS_GN, 1, L_frame ); + + /* reset long-term energy per band */ + for ( i = 0; i < MBANDS_GN; i++ ) + { + lt_ener_per_band[i] = Ener_per_bd[i]; + } + } + else if ( coder_type == VOICED || coder_type == GENERIC || coder_type == TRANSITION || last_core != ACELP_CORE || last_codec_mode != MODE1 || ( element_mode > EVS_MONO && coder_type == UNVOICED ) ) + { + /* Find spectrum and energy per band for GC and VC frames */ + edct( exc2, dct_exc_tmp, L_frame, element_mode ); + + Ener_per_band_comp( dct_exc_tmp, Ener_per_bd, MBANDS_GN, 1, L_frame ); + + /* reset long-term energy per band */ + for ( i = 0; i < MBANDS_GN; i++ ) + { + lt_ener_per_band[i] = Ener_per_bd[i]; + } + } + else if ( coder_type == INACTIVE && total_brate <= MAX_GSC_INACTIVE_BRATE ) + { + /* Find spectrum and energy per band for inactive frames */ + edct( exc2, dct_exc_tmp, L_frame, element_mode ); + + Ener_per_band_comp( dct_exc_tmp, Ener_per_bd, MBANDS_GN, 1, L_frame ); + + /* More agressive smoothing in the first 50 frames */ + pt_exc = dct_exc_tmp; + for ( i = 0; i < MBANDS_GN; i++ ) + { + /* Compute smoothing gain to apply with gain limitation */ + lt_ener_per_band[i] = ALPHA0 * lt_ener_per_band[i] + BETA0 * Ener_per_bd[i]; + + ftmp = lt_ener_per_band[i] - Ener_per_bd[i]; + ftmp = (float) pow( 10, ftmp ); + + if ( i < 2 ) + { + for ( j = 0; j < 8; j++ ) + { + *pt_exc *= ftmp; + pt_exc++; + } + } + else + { + for ( j = 0; j < 16; j++ ) + { + *pt_exc *= ftmp; + pt_exc++; + } + } + } + + /* Going back to time */ + edct( dct_exc_tmp, exc2, L_frame, element_mode ); + } + + return; +} diff --git a/lib_com/gs_noisefill.c b/lib_com/gs_noisefill.c new file mode 100644 index 0000000000000000000000000000000000000000..f452dab7a5cfb719a5d3470f75650799f219b4ba --- /dev/null +++ b/lib_com/gs_noisefill.c @@ -0,0 +1,843 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * gs_noisf() + * + * Noise fill-in function + *-------------------------------------------------------------------*/ + +static void gs_noisf( + const int16_t Start_BIN, /* i : First bin for noise fill */ + const int16_t NB_Qbins, /* i : Number of bin per band */ + const float Noise_fac, /* i : Noise level */ + const float *y_norm, /* i : Quantized pulses */ + float *exc_diffQ, /* o : Quantized pulses with noise added */ + int16_t *seed_tcx, /* i : Random generator seed */ + const int16_t coder_type /* i : coder type */ +) +{ + float ftmp; + int16_t i, k; + int16_t NB_zer = NB_Qbins / 2; + + if ( coder_type == INACTIVE ) + { + NB_zer = 2; + } + + /*----------------------------------------------* + * noise fill-in on unquantized subvector * + * injected only from 1066Hz to 6400Hz. * + *----------------------------------------------*/ + + for ( k = Start_BIN; k < NB_Qbins + Start_BIN; k += NB_zer ) + { + ftmp = 0.0; + for ( i = k; i < k + NB_zer; i++ ) + { + exc_diffQ[i] = (float) y_norm[i]; + ftmp += exc_diffQ[i] * exc_diffQ[i]; + } + + if ( ftmp < .5 ) + { + for ( i = k; i < k + NB_zer; i++ ) + { + exc_diffQ[i] += Noise_fac * ( (float) own_random( seed_tcx ) / PCM16_TO_FLT_FAC ); + } + } + else + { + /* This is added only to keep the seed in sync between different compilers */ + for ( i = k; i < k + NB_zer; i++ ) + { + own_random( seed_tcx ); + } + } + } + + return; +} + +/*-------------------------------------------------------------------* + * EstimateNoiseLevel_inner() + * + * Estimate noise level from the power spectrum + *-------------------------------------------------------------------*/ + +static void EstimateNoiseLevel_inner( + float *noisepb, /* o : Noise per band */ + const int32_t bitrate, /* i : Bitrate of the codec */ + const int16_t i_band, /* i : First band to compute the noise */ + const int16_t Mbands_gn /* i : number of bands */ +) +{ + int16_t i; + float noise_offset; + + noise_offset = 0.25f; + if ( bitrate > ACELP_24k40 ) + { + noise_offset = .2f; + } + else if ( bitrate >= ACELP_22k60 ) + { + noise_offset = .3f; + } + else if ( bitrate >= ACELP_9k60 ) + { + noise_offset = 0.35f; + } + else + { + noise_offset = .4f; + } + + set_f( noisepb + i_band, noise_offset, Mbands_gn - i_band ); + + for ( i = i_band; i < 5; i++ ) + { + if ( noisepb[i] > 0.2f ) + { + noisepb[i] = 0.2f; + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * EstimateNoiseLevel() + * + * + *-------------------------------------------------------------------*/ + +static void EstimateNoiseLevel( + float *noisepb, /* o : Noise per band */ + const int32_t bitrate, /* i : Bitrate of the codec */ + const int16_t Diff_len, /* i : number of bin before cut-off frequency */ + const int16_t Mbands_gn, /* i : number of bands */ + const int16_t coder_type, /* i : coder type */ + const int16_t noise_lev, /* i : pulses dynamic */ + const int16_t pit_band_idx, /* i : bin position of the cut-off frequency */ + const int16_t last_bin, /* i : the last bin of bit allocation */ + const int16_t bwidth, + const int16_t L_frame /* i : frame length */ +) +{ + int16_t i_band; + + i_band = 0; + + if ( Diff_len < L_frame ) + { + EstimateNoiseLevel_inner( noisepb, bitrate, i_band, Mbands_gn ); + + if ( coder_type != INACTIVE ) + { + if ( ( bitrate == ACELP_8k00 && last_bin > 8 ) && bwidth != NB ) + { + while ( Mbands_gn > i_band ) + { + noisepb[i_band] *= 2.0f; + i_band++; + } + } + else + { + while ( pit_band_idx > i_band ) + { + noisepb[i_band] /= 2.0f; + i_band++; + } + } + } + } + + if ( ( coder_type == INACTIVE || noise_lev >= NOISE_LEVEL_SP3 ) && L_frame == L_FRAME ) + { + for ( i_band = 9; i_band < Mbands_gn; i_band++ ) + { + noisepb[i_band] *= 1.15f; + } + } + else if ( L_frame == L_FRAME16k ) + { + if ( bitrate == ACELP_13k20 ) + { + set_f( noisepb, .45f, Mbands_gn ); + } + + if ( coder_type == INACTIVE ) + { + for ( ; i_band < Mbands_gn; i_band++ ) + { + noisepb[i_band] = .4f; + } + } + else if ( ( noise_lev <= NOISE_LEVEL_SP1 ) && bitrate > ACELP_16k40 ) + { + for ( ; i_band < Mbands_gn - 4; i_band++ ) + { + noisepb[i_band] *= .6f; + } + } + else if ( ( noise_lev <= NOISE_LEVEL_SP2 ) && bitrate > ACELP_16k40 ) + { + for ( ; i_band < Mbands_gn - 4; i_band++ ) + { + noisepb[i_band] *= .8f; + } + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * Apply_NoiseFill() + * + * + *-------------------------------------------------------------------*/ + +static void Apply_NoiseFill( + float *exc_diffQ, /* i/o: Noise per band */ + int16_t *seed_tcx, /* i : Seed for noise */ + const float *noisepb, /* i : Noise per band */ + const int16_t Diff_len, /* i : number of bin before cut-off frequency */ + const int16_t Mbands_gn, /* i : number of bands */ + const int16_t coder_type, /* i : coder type */ + const int16_t *freq_nsbin_per_band /* i : bin per bands tables */ +) +{ + int16_t StartBin, NB_Qbins, i_band; + StartBin = 0; + NB_Qbins = 0; + + for ( i_band = 0; i_band < Mbands_gn; i_band++ ) + { + StartBin += NB_Qbins; + NB_Qbins = freq_nsbin_per_band[i_band]; + + if ( Diff_len < L_FRAME ) + { + gs_noisf( StartBin, NB_Qbins, noisepb[i_band], exc_diffQ, exc_diffQ, seed_tcx, coder_type ); + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * freq_dnw_scaling() + * + * + *-------------------------------------------------------------------*/ + +void freq_dnw_scaling( + const int16_t cor_strong_limit, /* i : HF correlation */ + const int16_t coder_type, /* i : coder type */ + const int16_t noise_lev, /* i : Noise level */ + const int32_t core_brate, /* i : Core bitrate */ + float fy_norm[], /* i/o: Frequency quantized parameter */ + const int16_t L_frame /* i : frame length */ +) +{ + float sc_dyn; + int16_t start_sc, i; + + sc_dyn = 1.0f; + start_sc = L_frame; + + if ( core_brate <= ACELP_8k00 && coder_type == INACTIVE ) + { + sc_dyn *= .15f; + start_sc = 64; + } + else if ( coder_type == INACTIVE ) + { + sc_dyn *= .25f; + start_sc = 80; + } + else + { + sc_dyn = (float) ( NOISE_LEVEL_SP3 - noise_lev ) / 10.0f + 0.4f; + start_sc = 112 + ( NOISE_LEVEL_SP3 - noise_lev ) * 16; + + if ( noise_lev == NOISE_LEVEL_SP0 ) + { + start_sc = L_FRAME; + } + } + + if ( L_frame == L_FRAME16k && core_brate <= ACELP_24k40 ) + { + sc_dyn += 0.125f; + if ( sc_dyn > 1.0f ) + { + sc_dyn = 1.0f; + } + } + + for ( i = start_sc; i < L_frame; i++ ) + { + fy_norm[i] *= sc_dyn; + } + + if ( ( core_brate < ACELP_13k20 && cor_strong_limit == 0 ) || core_brate < ACELP_9k60 ) + { + for ( i = 160; i < L_frame; i++ ) + { + if ( fy_norm[i] > 1.0f ) + { + fy_norm[i] = 1.0f; + } + + if ( fy_norm[i] < -1.0f ) + { + fy_norm[i] = -1.0f; + } + } + } + else if ( core_brate < ACELP_22k60 ) + { + for ( i = 160; i < L_frame; i++ ) + { + if ( fy_norm[i] > 1.5f ) + { + fy_norm[i] = 1.5f; + } + + if ( fy_norm[i] < -1.5f ) + { + fy_norm[i] = -1.5f; + } + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * Decreas_freqPeak() + * + * + *-------------------------------------------------------------------*/ + +static void Decreas_freqPeak( + const float *lsf_new, /* i : ISFs at the end of the frame */ + float *exc_diffQ, /* i/o: frequency coefficients of per band */ + float thr_rat /* i : threshold of ratio between consecutive lsf_new_diff */ +) +{ + int16_t i, j, k; + int16_t last_bin = 0; + int16_t pos = 0; + float *src; + float avrg, max_val; + float lsf_new_diff[M]; + lsf_new_diff[0] = 0; /* prevent unitialized value */ + for ( j = 1; j < ( M - 1 ); j++ ) + { + lsf_new_diff[j] = lsf_new[j] - lsf_new[j - 1]; + } + + avrg = 0.0f; + /* This is to prevent a possible div by 0 in the '*(src) = (*src > 0) ?...' + loop. The value of 'max' is not important because it will be mutiplied + by 'avrg' and the result will be close to 0. The 'fabs(*src)/max' + div by 0 error will be avoided. */ + max_val = 0.001f; + for ( i = 160; i < L_FRAME; i++ ) + { + if ( fabs( exc_diffQ[i] ) > max_val ) + { + max_val = (float) fabs( exc_diffQ[i] ); + pos = i; + } + avrg += (float) fabs( exc_diffQ[i] ); + } + avrg /= 96; + last_bin = M - 1; /* When the search is false, should equate the end of the vector, not the beginning */ + for ( i = 0; i < ( M - 1 ); i++ ) + { + if ( lsf_new[i] > 4000 ) + { + last_bin = i; + break; + } + } + + for ( i = last_bin; i < 14; i++ ) + { + if ( lsf_new_diff[i] < thr_rat * lsf_new_diff[i - 1] ) + { + src = &exc_diffQ[( i - 1 ) * 16]; + for ( j = 0; j < 2; j++ ) + { + for ( k = 0; k < 16; k++ ) + { + if ( fabs( *src ) > 2.0f * avrg ) + { + *( src ) = ( *src > 0 ) ? (float) ( avrg * ( 2.0f - fabs( *src ) / max_val ) ) : (float) ( -avrg * ( 2.0f - fabs( *src ) / max_val ) ); + } + src++; + } + } + } + } + + if ( fabs( exc_diffQ[pos] ) == max_val && max_val > 4.0f * avrg ) + { + for ( i = pos - 1; i < pos + 2; i++ ) + { + exc_diffQ[pos] *= 0.5f; + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * envelop_modify() + * + * + *-------------------------------------------------------------------*/ + +static void envelop_modify( + float *exc_diffQ, /* i/o: frequency coefficients of per band */ + int16_t *seed_tcx, /* i : Seed for noise */ + int16_t last_bin, /* i : last bin of bit allocation */ + float *Ener_per_bd_iQ /* i : Quantized energy of targeted vector */ +) +{ + int16_t i, j, end_band; + float Ener, Ener1, *src; + float weight = 1.0f; + + end_band = L_FRAME; + Ener = 0.1f; + for ( i = last_bin * 16; i < end_band; i++ ) + { + Ener += exc_diffQ[i] * exc_diffQ[i]; + } + Ener = (float) sqrt( ( end_band - last_bin * 16 ) / Ener ); + + weight = 0.5f; + + src = &exc_diffQ[16 * last_bin]; + for ( i = last_bin; i < last_bin + 4; i++ ) + { + Ener1 = (float) ( 0.4f * pow( 10, Ener_per_bd_iQ[i + 1] ) ); + for ( j = 0; j < 16; j++ ) + { + *src = Ener1 * ( weight * ( *src ) * Ener + ( 1.0f - weight ) * own_random( seed_tcx ) / PCM16_TO_FLT_FAC ); + src++; + } + } + + Ener1 = (float) ( 0.4f * pow( 10, Ener_per_bd_iQ[15] ) ); + + src = &exc_diffQ[224]; + for ( j = 0; j < 32; j++ ) + { + *src = Ener1 * ( weight * ( *src ) * Ener + ( 1.0f - weight ) * own_random( seed_tcx ) / PCM16_TO_FLT_FAC ); + src++; + } + + return; +} + + +/*-------------------------------------------------------------------* + * highband_exc_dct_in() + * + * + *-------------------------------------------------------------------*/ + +void highband_exc_dct_in( + const int32_t core_brate, /* i : core bitrate */ + const int16_t *mfreq_bindiv, /* i : bin per bands tables */ + int16_t last_bin, /* i : last bin of bit allocation */ + int16_t Diff_len, /* i : number of bin before cut-off frequency */ + int16_t noise_lev, /* i : pulses dynamic */ + int16_t pit_band_idx, /* i : bin position of the cut-off frequency */ + float *exc_diffQ, /* i : frequency coefficients of per band */ + int16_t *seed_tcx, /* i : Seed for noise */ + float *Ener_per_bd_iQ, /* i : Quantized energy of targeted vector */ + int16_t nb_subfr, /* i : Number of subframe considered */ + float *exc_dct_in, /* o : dct of residual signal */ + int16_t last_coder_type, /* i : coding type of last frame */ + int16_t *bitallocation_band, /* i : bit allocation flag of each band */ + const float *lsf_new, /* i : LSFs at the end of the frame */ + float *last_exc_dct_in, /* i : dct of residual signal of last frame */ + float *last_ener, /* i : frequency energy of last frame */ + int16_t *last_bitallocation_band, /* i : bit allocation flag of each band of last frame */ + int16_t *bitallocation_exc, /* i : flag of decoded coefficients */ + const int16_t bfi, /* i : bad frame indicator */ + const int16_t coder_type, /* i : coder type */ + const int16_t bwidth, /* i : audio bandwidth */ + float *exc_wo_nf, /* o : temporal excitation (in f domain) without noisefill */ + const int16_t GSC_noisy_speech, /* i : GSC noisy speech flag */ + float *lt_ener_per_band, /* i/o: Average per band energy */ + const int16_t L_frame, /* i : frame length */ + const int16_t element_mode, /* i : IVAS element mode */ + const int16_t GSC_IVAS_mode /* i : GSC IVAS mode */ +) +{ + int16_t i, j; + int16_t MAX_Bin = 0; + int16_t last_bin_tmp; + float noisepb[MBANDS_GN16k]; + float Ener_per_bd_yQ[MBANDS_GN16k]; + float *src, *dst, *end; + float ener = 0.0f; + int16_t length_bin, bwe_flag = 0; + + for ( j = 10; j < MBANDS_GN; j++ ) + { + ener += (float) pow( 10, Ener_per_bd_iQ[j] ); + } + + if ( core_brate == ACELP_8k00 && bwidth != NB ) + { + if ( last_coder_type != AUDIO ) + { + *last_ener = ener; + } + + if ( ( last_bin > 8 || Diff_len != 0 ) && last_coder_type == AUDIO ) + { + MAX_Bin = 10; + bwe_flag = 1; + } + else + { + MAX_Bin = 15; + } + + last_bin_tmp = last_bin; + if ( last_bin < MAX_Bin ) + { + last_bin = MAX_Bin; + } + last_bin += 1; + } + else + { + if ( L_frame == L_FRAME16k ) + { + last_bin = MBANDS_GN16k; + } + else + { + last_bin = MBANDS_GN; + } + last_bin_tmp = last_bin; + } + + + if ( bfi || core_brate < 6000 || ( core_brate < 8600 && coder_type == UNVOICED ) ) + { + set_f( noisepb, 0.4f, MBANDS_GN ); + } + else if ( GSC_IVAS_mode == 3 || ( GSC_IVAS_mode > 0 && GSC_noisy_speech == 1 ) ) + { + set_f( noisepb, 0.4f, MBANDS_GN16k ); + } + else + { + EstimateNoiseLevel( noisepb, core_brate, Diff_len, last_bin, coder_type, noise_lev, pit_band_idx, last_bin_tmp, bwidth, L_frame ); + } + + if ( exc_wo_nf != NULL ) + { + mvr2r( exc_diffQ, exc_wo_nf, L_frame ); + } + + if ( GSC_IVAS_mode == 0 && GSC_noisy_speech && !bfi && element_mode <= IVAS_SCE ) + { + set_f( noisepb, 0.1f, MBANDS_GN ); + } + + if ( core_brate < 6000 && coder_type <= UNVOICED ) + { + for ( i = 0; i < L_frame; i++ ) + { + if ( exc_diffQ[i] == 0.0f ) + { + exc_diffQ[i] += 2.0f * noisepb[0] * ( (float) own_random( seed_tcx ) / PCM16_TO_FLT_FAC ); + } + } + } + else + { + Apply_NoiseFill( exc_diffQ, seed_tcx, noisepb, Diff_len, last_bin, coder_type, mfreq_bindiv ); + } + + /*--------------------------------------------------------------------------------------* + * Quantize average gain + * Subtract Q averaged gain + * VQ of remaining gain per band + *--------------------------------------------------------------------------------------*/ + + if ( core_brate == ACELP_8k00 && bwidth != NB ) + { + Ener_per_band_comp( exc_diffQ, Ener_per_bd_yQ, last_bin + 1, 0, L_frame ); + } + else + { + Ener_per_band_comp( exc_diffQ, Ener_per_bd_yQ, MBANDS_GN, 1, L_frame ); + + if ( nb_subfr < 4 && L_frame < L_FRAME16k ) + { + for ( i = L_FRAME - 16; i < L_FRAME; i++ ) + { + exc_diffQ[i] *= ( 0.067f * i - 15.0f ); + } + } + } + + /*--------------------------------------------------------------------------------------* + * Check potential energy excitation overshoot + *--------------------------------------------------------------------------------------*/ + + if ( bfi ) + { + if ( GSC_noisy_speech == 0 && coder_type > UNVOICED ) /* Here coder_type == last_coder_type because of the bfi */ + { + for ( i = 0; i < last_bin; i++ ) + { + Ener_per_bd_iQ[i] = min( Ener_per_bd_iQ[i], ( lt_ener_per_band[i] - 0.0376f ) - Ener_per_bd_yQ[i] ); + lt_ener_per_band[i] -= 0.0188f; + } + for ( ; i < MBANDS_GN; i++ ) + { + Ener_per_bd_iQ[i] = min( Ener_per_bd_iQ[i], ( lt_ener_per_band[i] - 0.0376f ) ); + lt_ener_per_band[i] -= 0.0188f; + } + } + else + { + for ( i = 0; i < last_bin; i++ ) + { + Ener_per_bd_iQ[i] = min( Ener_per_bd_iQ[i], ( lt_ener_per_band[i] + 0.3f ) - Ener_per_bd_yQ[i] ); + lt_ener_per_band[i] -= 0.0188f; + } + for ( ; i < MBANDS_GN; i++ ) + { + Ener_per_bd_iQ[i] = min( Ener_per_bd_iQ[i], ( lt_ener_per_band[i] + 0.3f ) ); + lt_ener_per_band[i] -= 0.0188f; + } + } + } + + /*--------------------------------------------------------------------------------------* + * Apply decoded gain onto the difference signal + *--------------------------------------------------------------------------------------*/ + + if ( GSC_IVAS_mode >= 1 ) + { + float scale_factLF = 0.9f; + float scale_factHF = 0.9f; + + if ( GSC_IVAS_mode == 1 && GSC_noisy_speech == 0 ) + { + scale_factHF = 0.8f; + } + else if ( GSC_IVAS_mode == 2 || GSC_noisy_speech == 1 ) + { + scale_factHF = 0.71f; + } + else if ( GSC_IVAS_mode == 3 ) + { + scale_factHF = 0.9f; + } + for ( i = 0; i < pit_band_idx * 16; i++ ) + { + exc_diffQ[i] *= scale_factLF; + } + for ( ; i < L_frame; i++ ) + { + exc_diffQ[i] *= scale_factHF; + } + } + else if ( GSC_noisy_speech ) + { + float scale_fact = 0.9f; + + if ( element_mode == IVAS_CPE_TD ) + { + if ( coder_type == INACTIVE ) + { + scale_fact = 1.0f; + } + else + { + scale_fact = 0.95f; + } + } + else if ( element_mode > IVAS_SCE ) + { + scale_fact = 0.71f; + } + + for ( i = 0; i < L_frame; i++ ) + { + exc_diffQ[i] *= scale_fact; + } + } + + if ( GSC_noisy_speech && element_mode > IVAS_SCE && core_brate < ACELP_7k20 ) + { + for ( i = 80; i < L_frame; i++ ) + { + exc_diffQ[i] *= ( +0.0024f * (float) i + 1.192f ); + } + } + + Comp_and_apply_gain( exc_diffQ, Ener_per_bd_iQ, Ener_per_bd_yQ, last_bin, 0 ); + + if ( exc_wo_nf != NULL ) + { + Comp_and_apply_gain( exc_wo_nf, Ener_per_bd_iQ, Ener_per_bd_yQ, last_bin, 1 ); + + v_add( exc_dct_in, exc_wo_nf, exc_wo_nf, L_frame ); + } + + /*--------------------------------------------------------------------------------------* + * add the correction layer to the LF bins, + * and add the quantized pulses or the noise for the higher part of the spectrum + * (non valuable temporal content already zeroed) + * DC is Zeroed + *--------------------------------------------------------------------------------------*/ + + v_add( exc_dct_in, exc_diffQ, exc_dct_in, L_frame ); + + if ( core_brate == ACELP_8k00 && bwidth != NB ) + { + if ( bwe_flag == 1 ) + { + last_bin -= 1; + src = &exc_diffQ[L_FRAME - 1]; + dst = &exc_dct_in[MAX_Bin * 16 - 1]; + end = &exc_diffQ[last_bin * 16 - 1]; + + while ( src > end ) + { + *src-- = *dst--; + } + + if ( ( bitallocation_exc[0] != 0 || bitallocation_exc[1] != 0 ) && core_brate == ACELP_8k00 ) + { + exc_diffQ[160] = 0.0f; + } + + envelop_modify( exc_diffQ, seed_tcx, last_bin, Ener_per_bd_iQ ); + + mvr2r( &exc_diffQ[last_bin * 16], &exc_dct_in[last_bin * 16], L_FRAME - last_bin * 16 ); + } + + if ( nb_subfr < 4 ) + { + for ( i = L_FRAME - 16; i < L_FRAME; i++ ) + { + exc_dct_in[i] *= ( 0.067f * i - 15.f ); + } + } + + if ( ener < 2 * ( *last_ener ) && ener > 0.5f * ( *last_ener ) ) + { + length_bin = 6; + if ( last_coder_type != AUDIO ) + { + set_s( last_bitallocation_band, 0, 6 ); + mvr2r( &exc_dct_in[( 4 + length_bin ) * 16], &last_exc_dct_in[( 4 + length_bin ) * 16], length_bin * 16 ); + } + + for ( i = 4; i < ( 4 + length_bin ); i++ ) + { + if ( !( bitallocation_band[i] == 0 && last_bitallocation_band[i - 4] == 0 ) ) + { + src = &exc_dct_in[( i + length_bin ) * 16]; + dst = &last_exc_dct_in[( i + length_bin ) * 16]; + for ( j = 0; j < 16; j++ ) + { + if ( fabs( *src ) > 3.0f * fabs( *dst ) ) + { + *src = ( *src > 0 ) ? (float) ( 0.5f * ( *src + fabs( *dst ) ) ) : (float) ( 0.5f * ( *src - fabs( *dst ) ) ); + } + else if ( fabs( *dst ) > 3.0f * fabs( *src ) ) + { + *src = ( *src > 0 ) ? (float) ( 0.7f * ( *src ) + 0.3f * fabs( *dst ) ) : (float) ( 0.7f * ( *src ) - 0.3f * fabs( *dst ) ); + } + src++; + dst++; + } + } + } + } + + if ( bwe_flag == 1 ) + { + Decreas_freqPeak( lsf_new, exc_dct_in, 0.3f ); + } + else + { + Decreas_freqPeak( lsf_new, exc_dct_in, 0.5f ); + } + } + + mvr2r( &exc_dct_in[64], &last_exc_dct_in[64], L_frame - 64 ); + mvs2s( &bitallocation_band[4], last_bitallocation_band, 6 ); + *last_ener = ener; + + return; +} diff --git a/lib_com/gs_preech.c b/lib_com/gs_preech.c new file mode 100644 index 0000000000000000000000000000000000000000..ae2bbf6f53a4fa78ec79ef8149eb010a0ebf97e5 --- /dev/null +++ b/lib_com/gs_preech.c @@ -0,0 +1,139 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * Local constants + *-------------------------------------------------------------------*/ + +#define ATT_LENGHT16k 80 +#define INV_L_FRAME16k ( 1.0f / L_FRAME16k ) +#define ATT_LENGHT 64 +#define ATT_SEG_LEN ( L_FRAME / ATT_LENGHT ) +#define INV_ATT_SEG_LEN ( 1.0f / ATT_SEG_LEN ) +#define INV_L_FRAME ( 1.0f / L_FRAME ) + + +/*-------------------------------------------------------------------* + * pre_echo_att() + * + * Attenuation of the pre-echo when encoder specifies an attack + *-------------------------------------------------------------------*/ + +void pre_echo_att( + float *Last_frame_ener, /* i/o: Energy of the last frame */ + float *exc, /* i/o: Excitation of the current frame */ + const int16_t attack_flag, /* i : attack flag (GSC or TC) */ + const int16_t last_coder_type, /* i : Last coder type */ + const int16_t L_frame /* i : frame length */ +) +{ + float etmp; + float etmp1; + float finc[ATT_LENGHT16k], ratio, inv_l_frame; + int16_t att_len; + int16_t attack_pos, i; + + if ( attack_flag > 0 && last_coder_type == AUDIO ) + { + /*-------------------------------------------------------------------------* + * Find where the onset (attack) occurs by computing the energy per section + * The inverse weighting aims to favor the first maxima in case of + * gradual onset + *-------------------------------------------------------------------------*/ + + att_len = ATT_LENGHT; + if ( L_frame == L_FRAME16k ) + { + att_len = ATT_LENGHT16k; + } + for ( i = 0; i < att_len; i++ ) + { + finc[i] = sum2_f( exc + i * ATT_SEG_LEN, ATT_SEG_LEN ) * ( (float) ( att_len - i ) / ( att_len ) ); + } + etmp = -1; + attack_pos = maximum( finc, att_len, &etmp ); + + /* Scaled the maximum energy and allowed 6 dB increase*/ + etmp *= INV_ATT_SEG_LEN; + etmp1 = etmp; + *Last_frame_ener *= 4.0f; + + /* If the maximum normalized energy > last frame energy + 6dB */ + if ( etmp > *Last_frame_ener && attack_pos > 0 ) + { + /* Find the average energy before the attack */ + etmp = sum_f( finc, attack_pos ) + 0.01f; + etmp /= ( attack_pos * ATT_SEG_LEN ); + + /* Find the correction factor and apply it before the attack */ + ratio = (float) sqrt( *Last_frame_ener / etmp ); + + + /* Pre-echo atttenuation should never increase the energy */ + ratio = min( ratio, 1.0f ); + for ( i = 0; i < attack_pos * ATT_SEG_LEN; i++ ) + { + exc[i] *= ratio; + } + } + *Last_frame_ener = etmp1; + } + else + { + /*-------------------------------------------------------* + * In normal cases, just compute the energy of the frame + *-------------------------------------------------------*/ + + etmp = sum2_f( exc, L_frame ) + 0.01f; + inv_l_frame = INV_L_FRAME; + if ( L_frame == L_FRAME16k ) + { + inv_l_frame = INV_L_FRAME16k; + } + etmp *= inv_l_frame; + *Last_frame_ener = etmp; + } + + return; +} diff --git a/lib_com/guided_plc_util.c b/lib_com/guided_plc_util.c new file mode 100644 index 0000000000000000000000000000000000000000..884c2beeb860104d820e9dedadd5d0ef742ae43b --- /dev/null +++ b/lib_com/guided_plc_util.c @@ -0,0 +1,323 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * Local function prototypes + *-------------------------------------------------------------------*/ + +static void reorder_lsfs( float *lsf, float min_dist, const int16_t n, const int32_t sr_core ); + + +/*-------------------------------------------------------------------* + * getLookAheadResSig() + * + * + *-------------------------------------------------------------------*/ + +void getLookAheadResSig( + float *speechLookAhead, + const float *A, + float *res, + const int16_t L_frame, + const int16_t L_subfr, + const int16_t m, + const int16_t numSubFrame ) +{ + const float *p_A; + int16_t i_subfr; + int16_t subfr_len[2]; + + subfr_len[0] = L_subfr; + subfr_len[1] = L_frame < L_FRAME16k ? (int16_t) ( 0.75 * L_subfr ) : L_subfr; + + p_A = A; + for ( i_subfr = 0; i_subfr < numSubFrame * L_subfr; i_subfr += L_subfr ) + { + residu( p_A, m, &speechLookAhead[i_subfr], &res[i_subfr], subfr_len[i_subfr / L_subfr] ); + p_A += ( m + 1 ); + } + + return; +} + +/*-------------------------------------------------------------------* + * updatelsfForConcealment() + * + * + *-------------------------------------------------------------------*/ + +void updatelsfForConcealment( + PLC_ENC_EVS_HANDLE decState, + float *lsf ) +{ + int16_t i; + + for ( i = 0; i < M; i++ ) + { + decState->lsf_adaptive_mean[i] = ( decState->lsfoldbfi1[i] + decState->lsfoldbfi0[i] + lsf[i] ) / 3; + decState->lsfoldbfi1[i] = decState->lsfoldbfi0[i]; + decState->lsfoldbfi0[i] = lsf[i]; + } + + return; +} + + +/*-------------------------------------------------------------------* + * getConcealedLP() + * + * + *-------------------------------------------------------------------*/ + +void getConcealedLP( + PLC_ENC_EVS_HANDLE memDecState, + float *AqCon, + const float lsfBase[], + const int32_t sr_core, + const int16_t last_good, + const int16_t L_frame ) +{ + float *lsf = memDecState->lsf_con; + float lsp[( NB_DIV + 1 ) * M]; + int16_t k; + + dlpc_bfi( L_frame, &lsf[0], memDecState->lsfold, last_good, 1 /* assumes packet loss */, memDecState->mem_MA, memDecState->mem_AR, &( memDecState->stab_fac ), memDecState->lsf_adaptive_mean, 1, NULL, 0, NULL, NULL, lsfBase ); + + mvr2r( memDecState->lspold, lsp, M ); + + for ( k = 0; k < 1; k++ ) + { + lsf2lsp( &lsf[k * M], &lsp[( k + 1 ) * M], M, sr_core ); + } + + int_lsp( L_FRAME, &lsp[0], &lsp[M], AqCon, M, interpol_frac_12k8, 0 ); + + return; +} + +/*-------------------------------------------------------------------* + * RecLpcSpecPowDiffuseLc() + * + * + *-------------------------------------------------------------------*/ + +void RecLpcSpecPowDiffuseLc( + float *lspq, + float *lsp_old, + float *lsfq, + Decoder_State *st, + const int16_t reset_q ) +{ + const float *means; + float lsf_old[M]; + int16_t i; + + means = PlcGetlsfBase( st->lpcQuantization, st->narrowBand, st->sr_core ); + + mvr2r( st->lsf_old, lsf_old, M ); + + modify_lsf( lsf_old, M, st->sr_core, reset_q ); + + lsf2lsp( lsf_old, lsp_old, M, st->sr_core ); + + if ( reset_q ) + { + for ( i = 0; i < M; i++ ) + { + lsfq[i] = st->mem_MA[i] + means[i]; + } + + v_sort( lsfq, 0, M - 1 ); + + reorder_lsfs( lsfq, LSF_GAP, M, st->sr_core ); + + lsf2lsp( lsfq, lspq, M, st->sr_core ); + } + else + { + modify_lsf( lsfq, M, st->sr_core, reset_q ); + + lsf2lsp( lsfq, lspq, M, st->sr_core ); + } + + + return; +} + + +/*-------------------------------------------------------------------* + * modify_lsf() + * + * + *-------------------------------------------------------------------*/ + +void modify_lsf( + float *lsf, + const int16_t n, + const int32_t sr_core, + const int16_t reset_q ) +{ + int16_t i, k; + float gap; + float th; + + th = 1900; + + if ( reset_q == 0 ) + { + th = 800; + } + + if ( sr_core == INT_FS_16k ) + { + th *= 1.25; + } + + + i = 1; + + while ( lsf[i] < th && i < n ) + { + i++; + } + gap = lsf[i - 1] / i; + + for ( k = 0; k < i - 1; k++ ) + { + lsf[k] = gap * ( k + 1 ); + } + + return; +} + + +/*-------------------------------------------------------------------* + * reorder_lsfs() + * + * + *-------------------------------------------------------------------*/ + +static void reorder_lsfs( + float *lsf, /* i/o: vector of lsfs in the frequency domain (0..0.5)*/ + float min_dist, /* i : minimum required distance */ + const int16_t n, /* i : LPC order */ + const int32_t sr_core ) +{ + int16_t i; + float lsf_min; + float lsf_max; + float fac; + float th1, th2; + + th1 = 1000.0f; + th2 = 1900.0f; + + if ( sr_core == INT_FS_16k ) + { + min_dist *= 1.25; + th1 *= 1.25; + th2 *= 1.25; + } + + /*-----------------------------------------------------------------* + * Verify the LSF ordering and minimum GAP + *-----------------------------------------------------------------*/ + fac = 3.0; + + lsf_min = min_dist * fac; + for ( i = 0; i < n; i++ ) + { + + if ( lsf[i] > th1 ) + { + fac = 2.0; + } + else + { + if ( lsf[i] > 1900.0 ) + { + fac = 1.0; + } + } + + if ( lsf[i] < lsf_min ) + { + lsf[i] = lsf_min; + } + + lsf_min = lsf[i] + min_dist * fac; + } + + /*------------------------------------------------------------------------------------------* + * Reverify the LSF ordering and minimum GAP in the reverse order (security) + *------------------------------------------------------------------------------------------*/ + + lsf_max = (float) ( sr_core ) / 2.0f - min_dist * fac; + + if ( lsf[n - 1] > lsf_max ) /* If danger of unstable filter in case of resonance in HF */ + { + for ( i = n - 1; i >= 0; i-- ) /* Reverify the minimum LSF gap in the reverse sens */ + { + + if ( lsf[i] <= th2 ) + { + fac = 2.0; + } + else + { + if ( lsf[i] <= th1 ) + { + fac = 3.0; + } + } + + if ( lsf[i] > lsf_max ) + { + lsf[i] = lsf_max; + } + + lsf_max = lsf[i] - min_dist * fac; + } + } + + return; +} diff --git a/lib_com/hp50.c b/lib_com/hp50.c new file mode 100644 index 0000000000000000000000000000000000000000..b9268c8f99451b230edb1a74a78fa70af12fc581 --- /dev/null +++ b/lib_com/hp50.c @@ -0,0 +1,130 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "prot.h" +#include "wmc_auto.h" + + +/* + * hp20 + * + * Function: + * 2nd order high pass filter with nominal cut off frequency at 20 Hz. + * + * Returns: + * void + */ + +void hp20( + Float32 signal[], + const Word16 lg, + Float32 mem[], + const Word32 Fs ) +{ + Word16 i; + Float32 x0, x1, x2, y0, y1, y2; + Float32 a1, a2, b1, b2; + + y1 = mem[0]; + y2 = mem[1]; + x0 = mem[2]; + x1 = mem[3]; + + if ( Fs == 8000 ) + { + /* hp filter 20Hz at 3dB for 8000KHz input sampling rate + [b,a] = butter(2, 20.0/4000.0, 'high'); + b = [0.988954248067140 -1.977908496134280 0.988954248067140] + a =[1.000000000000000 -1.977786483776764 0.978030508491796]*/ + a1 = 1.977786483776764f; + a2 = -0.978030508491796f; + b1 = -1.977908496134280f; + b2 = 0.988954248067140f; + } + else if ( Fs == 16000 ) + { + /* hp filter 20Hz at 3dB for 16000KHz sampling rate + [b,a] = butter(2, 20.0/8000.0, 'high'); + b =[ 0.994461788958195 -1.988923577916390 0.994461788958195] + a =[1.000000000000000 -1.988892905899653 0.988954249933127] */ + a1 = 1.988892905899653f; + a2 = -0.988954249933127f; + b1 = -1.988923577916390f; + b2 = 0.994461788958195f; + } + else if ( Fs == 32000 ) + { + /* hp filter 20Hz at 3dB for 32000KHz sampling rate + [b,a] = butter(2, 20.0/16000.0, 'high'); + b =[0.997227049904470 -1.994454099808940 0.997227049904470] + a =[1.000000000000000 -1.994446410541927 0.994461789075954]*/ + a1 = 1.994446410541927f; + a2 = -0.994461789075954f; + b1 = -1.994454099808940f; + b2 = 0.997227049904470f; + } + else + { + /* hp filter 20Hz at 3dB for 48000KHz sampling rate + [b,a] = butter(2, 20.0/24000.0, 'high'); + b =[ 0.998150511190452 -1.996301022380904 0.998150511190452] + a =[1.000000000000000 -1.996297601769122 0.996304442992686]*/ + a1 = 1.996297601769122f; + a2 = -0.996304442992686f; + b1 = -1.996301022380904f; + b2 = 0.998150511190452f; + } + + for ( i = 0; i < lg; i++ ) + { + x2 = x1; + x1 = x0; + x0 = signal[i]; + y0 = ( y1 * a1 ) + ( y2 * a2 ) + ( x0 * b2 ) + ( x1 * b1 ) + ( x2 * b2 ); + signal[i] = y0; + y2 = y1; + y1 = y0; + } + + mem[0] = ( ( y1 > 1e-10 ) | ( y1 < -1e-10 ) ) ? y1 : 0; + mem[1] = ( ( y2 > 1e-10 ) | ( y2 < -1e-10 ) ) ? y2 : 0; + mem[2] = ( ( x0 > 1e-10 ) | ( x0 < -1e-10 ) ) ? x0 : 0; + mem[3] = ( ( x1 > 1e-10 ) | ( x1 < -1e-10 ) ) ? x1 : 0; + + return; +} diff --git a/lib_com/hq2_bit_alloc.c b/lib_com/hq2_bit_alloc.c new file mode 100644 index 0000000000000000000000000000000000000000..d471b170e60439d6d3f2e7c1632a31479ffed207 --- /dev/null +++ b/lib_com/hq2_bit_alloc.c @@ -0,0 +1,1041 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "prot.h" +#include "rom_com.h" +#include "basop_util.h" +#include "basop_mpy.h" +#include "stl.h" +#include "wmc_auto.h" + +#define WMC_TOOL_SKIP + +/*------------------------------------------------------------------- + * Local constants + *-------------------------------------------------------------------*/ + +#define MIN_BITS_FIX 0 +#define HQ_16k40_BIT ( HQ_16k40 / FRAMES_PER_SEC ) /* 16400/50=328, FOR FIX TMP */ +#define C1_QRk ( 1 << SWB_BWE_LR_QRk ) /* 1 */ +#define Qbf 14 +#define C1_Qbf ( 1 << Qbf ) /* 1 */ +#define BITS_FACT_1p10 ( Word16 )( 1.10f * (float) pow( 2, Qbf ) + 0.5f ) +#define BITS_FACT_1p05 ( Word16 )( 1.05f * (float) pow( 2, Qbf ) + 0.5f ) +#define BITS_FACT_1p00 ( Word16 )( 1.00f * (float) pow( 2, Qbf ) + 0.5f ) +#define BITS_FACT_0p97 ( Word16 )( 0.97f * (float) pow( 2, Qbf ) + 0.5f ) +#define BITS_FACT_0p92 ( Word16 )( 0.92f * (float) pow( 2, Qbf ) + 0.5f ) + +#define L_Comp( hi, lo ) L_mac( L_deposit_h( hi ), lo, 1 ) + +/*------------------------------------------------------------------- + * div_s_ss() + * + * + *-------------------------------------------------------------------*/ + +/*! r: result of division (Word16 Q0) */ +static Word16 div_s_ss( + const Word16 n, /* i : numerator (Word16 Q0 */ + const Word16 d /* i : denominator (Word16 Q0) */ +) +{ + Word16 norm_n, norm_d; + Word16 ns, ds; + Word16 res; + Word16 tmp; + + test(); + IF( n == 0 || d == 0 ) + { + return 0; + } + + norm_n = norm_s( n ); + norm_n = sub( norm_n, 1 ); + ns = shl( n, norm_n ); + + norm_d = norm_s( d ); + ds = shl( d, norm_d ); + + tmp = div_s( ns, ds ); + res = shr( tmp, add( sub( norm_n, norm_d ), 15 ) ); + + return res; +} + + +/*-------------------------------------------------------------------* + * Bits2indvsb() + * + * Bit allocation to individual SB's in a group + *-------------------------------------------------------------------*/ +static void Bits2indvsb_fx( + const Word32 *L_be, /* i : Qbe Band Energy of sub-band */ + const Word16 start_band, /* i : Q0 start band indices */ + const Word16 end_band, /* i : Q0 end band indices */ + const Word16 Bits, /* i : Q0 Total number of bits allocated to a group */ + const Word32 L_Bits_needed, /* i : QRk smallest bit number for allocation in group */ + Word32 *L_Rsubband, /* o : QRk bit allocation of sub-band */ + Word16 *p2aflags_fx /* i/o: Q0 peaky/noise subband flag */ +) +{ + Word16 i, j, k; + Word32 L_R_temp[14]; /* QRk = QL_Rsubband; */ + Word16 Ravg_fx; + Word16 QRavg; + + const Word32 *L_y_ptr; + Word32 *L_R_ptr; + + Word16 Bits_avg_fx; + Word16 QBavg; + Word16 scale_fact_fx; + + Word16 band_num_fx; + Word16 index_fx[14]; + + Word16 y_index_fx[14]; + + Word16 be_sum_fx; /* Q0 */ + + Word16 exp_normn, exp_normd; + Word16 enr_diffcnt_fx; + Word16 th_5_fx; + Word16 Rcnt_fx; + + Word16 be_cnt_fx; + Word16 *p2aflags_fx_ptr; + + Word32 L_temp1; + Word32 L_temp2; + + band_num_fx = sub( end_band, start_band ); + L_y_ptr = L_be + start_band; + L_R_ptr = L_Rsubband + start_band; + p2aflags_fx_ptr = p2aflags_fx + start_band; + + FOR( i = 0; i < band_num_fx; i++ ) + { + y_index_fx[i] = extract_h( L_shr( L_y_ptr[i], sub( SWB_BWE_LR_Qbe, 16 ) ) ); + move16(); + index_fx[i] = i; + move16(); + } + + + /* Rearrange norm vector in decreasing order */ + reordvct( y_index_fx, band_num_fx, index_fx ); + + be_sum_fx = 0; + move16(); + be_cnt_fx = 0; + move16(); + FOR( j = 0; j < band_num_fx; j++ ) + { + test(); + IF( y_index_fx[j] <= 0 || p2aflags_fx_ptr[index_fx[j]] == 0 ) + { + y_index_fx[j] = 0; + move16(); + L_R_temp[j] = 0x0L; + move32(); + } + ELSE + { + L_R_temp[j] = C1_QRk; + move32(); /* filled not zero value */ + be_cnt_fx = add( be_cnt_fx, 1 ); + } + } + + i = sub( be_cnt_fx, 1 ); + FOR( k = 0; k <= i; k++ ) + { + test(); + if ( L_R_temp[k] > 0 ) + { + be_sum_fx = add( be_sum_fx, y_index_fx[k] ); + } + } + QBavg = 0; + move16(); + + /*Ravg = (float) be_sum/be_cnt;*/ + Ravg_fx = 0; + move16(); + QRavg = 0; + move16(); + IF( be_cnt_fx != 0x0 ) + { + exp_normn = norm_s( be_sum_fx ); + exp_normn = sub( exp_normn, 1 ); + exp_normd = norm_s( be_cnt_fx ); + Ravg_fx = div_s( shl( be_sum_fx, exp_normn ), shl( be_cnt_fx, exp_normd ) ); + + Ravg_fx = shr( Ravg_fx, 2 ); /* safe shift */ + QRavg = add( sub( exp_normn, exp_normd ), 15 - 2 ); + } + + enr_diffcnt_fx = 0; + move16(); + th_5_fx = shl( 5, QRavg ); + FOR( j = 0; j < be_cnt_fx; j++ ) + { + IF( sub( abs_s( sub( Ravg_fx, shl( y_index_fx[j], QRavg ) ) ), th_5_fx ) > 0 ) + { + enr_diffcnt_fx = add( enr_diffcnt_fx, 1 ); + } + } + + IF( enr_diffcnt_fx > 0 ) + { + scale_fact_fx = 11468; + move16(); /* 0.35f 11468.8(Q15) */ + } + ELSE + { + scale_fact_fx = 19661; + move16(); /* 0.60f 19660.8(Q15) */ + } + + /* Bits allocation to individual SB's in a group based on Band Energies */ + FOR( j = 0; j < be_cnt_fx; j++ ) + { + Rcnt_fx = add( i, 1 ); + + /* Ravg = (float) be_sum/Rcnt; */ + exp_normn = norm_s( be_sum_fx ); + exp_normn = sub( exp_normn, 1 ); + exp_normd = norm_s( Rcnt_fx ); + Ravg_fx = div_s( shl( be_sum_fx, exp_normn ), shl( Rcnt_fx, exp_normd ) ); + Ravg_fx = shr( Ravg_fx, 2 ); /* safe shift */ + QRavg = add( sub( exp_normn, exp_normd ), 15 - 2 ); + + test(); + if ( be_sum_fx <= 0 ) + { + be_sum_fx = 1; + move16(); + } + + /* Bits_avg = (float) Bits/(be_sum+EPSILON); */ + Bits_avg_fx = 0; + move16(); + QBavg = 0; + move16(); + IF( Bits != 0 ) + { + exp_normn = norm_s( Bits ); + exp_normn = sub( exp_normn, 1 ); + exp_normd = norm_s( be_sum_fx ); + Bits_avg_fx = div_s( shl( Bits, exp_normn ), shl( be_sum_fx, exp_normd ) ); + Bits_avg_fx = shr( Bits_avg_fx, 2 ); /* safe_shift */ + QBavg = add( sub( exp_normn, exp_normd ), 15 - 2 ); + } + FOR( k = 0; k <= i; k++ ) + { + IF( L_R_temp[k] > 0 ) /* Rtemp -> SWB_BWE_LR_QRk */ + { + /* Allocate more bits to SB, if SB bandenergy is higher than average energy */ + /* R_temp[k] = (float)( Bits_avg * y_index[k]+( scale_fact * (y_index[k] - Ravg))); */ + L_temp1 = L_mult( Bits_avg_fx, y_index_fx[k] ); /* QBavg+1 */ + L_temp2 = L_mult( scale_fact_fx, sub( shl( y_index_fx[k], QRavg ), Ravg_fx ) ); /* 15+QRavg+1 */ + L_R_temp[k] = L_add( L_shr( L_temp1, sub( add( QBavg, 1 ), SWB_BWE_LR_QRk ) ), L_shr( L_temp2, sub( add( QRavg, 16 ), SWB_BWE_LR_QRk ) ) ); /* SWB_BWE_LR_QRk */ + } + } + IF( L_sub( L_R_temp[i], L_Bits_needed ) < 0 ) + { + L_R_temp[i] = 0x0L; + move32(); + + p2aflags_fx_ptr[index_fx[i]] = 0; + move16(); + + /* be_sum -= y_index[i]; */ + be_sum_fx = sub( be_sum_fx, y_index_fx[i] ); + + i = sub( i, 1 ); + } + ELSE + { + BREAK; + } + } + + /* Rearrange the bit allocation to align with original */ + FOR( k = 0; k < band_num_fx; k++ ) + { + j = index_fx[k]; + move16(); + L_R_ptr[j] = L_R_temp[k]; + move32(); + } + + return; +} + +/*-------------------------------------------------------------------* + * hq2_bit_alloc_har() + * + * Bit allocation mechanism for HQ_HARMONIC mode + *-------------------------------------------------------------------*/ + +void hq2_bit_alloc_har( + float *y, /* i : band energy of sub-vectors */ + int16_t B_fx, /* i : number of available bits */ + int16_t N_fx, /* i : number of sub-vectors */ + Word32 *L_Rsubband, + int16_t p2a_bands_fx, + int32_t L_core_brate, /* i : core bitrate */ + int16_t p2a_flags_fx[], + int16_t band_width_fx[] ) +{ + Word16 i, j, k; + + Word32 L_norm_sum; /* Qbe */ + Word32 L_Ravg_sub[GRP_SB]; /* Qbe */ + Word32 L_temp_band_energy[BANDS_MAX]; /* Qbe */ + + Word16 j_fx, k_fx, Bits_grp_fx[GRP_SB]; + + Word32 L_temp_band_energydiff[BANDS_MAX]; + Word16 G1_BE_DIFF_POS_fx; /* Q0 */ + Word32 L_G1_BE_DIFF_VAL; /* Qbe Word32 */ + Word16 final_gr_fact_pos_fx, gmax_range_fx[2], temp_fx; + Word16 bits_fact_fx, bits_fact1_fx; /* Q? */ + Word16 grp_rngmax_fx[2]; + Word16 index_fx[NB_SWB_SUBBANDS_HAR], y_index_fx[NB_SWB_SUBBANDS_HAR], esthf_bits_fx, grp_bit_avg_fx, harmonic_band_fx; + Word32 L_norm_sum_avg; + Word32 L_norm_diff; /* Qbe */ + Word16 bits_allocweigh_fx; /* Q15 */ + Word16 grp_bound_fx[5]; + Word32 L_grp_thr[GRP_SB]; /* not require Word32 precission */ + Word16 lf_hf_ge_r_fx; /* Q15 */ + Word32 L_avg_enhf_en_diff; /* Qbe */ + + Word16 B_norm_fx; + + Word32 L_temp, L_temp2; + Word16 exp, frac; + + Word32 L_THR1, L_THR2, L_THR3; + + Word16 exp_norm; + Word16 norm_sum_fx; + Word16 Qns; /* Q value for norm_sum_fx */ + Word16 Inv_norm_sum_fx; /* 1/norm_sum */ + Word16 QIns; /* Q value for Inv_norm_sum_fx */ + + Word16 exp_normn, exp_normd; + Word16 div_fx; + + Word16 Inv_p2a_bands_fx; + Word16 QIpb; + + Word16 exp_shift; + + Word32 L_y[BANDS_MAX]; + +#ifdef BASOP_NOGLOB + Flag Overflow; + Overflow = 0; +#endif + + grp_rngmax_fx[0] = 0; + grp_rngmax_fx[1] = 0; + + for ( i = 0; i < N_fx; i++ ) + { + L_y[i] = (Word32) ( y[i] * (float) pow( 2.0f, SWB_BWE_LR_Qbe ) ); + } + + L_THR1 = L_shl( L_deposit_l( THR1 ), SWB_BWE_LR_QRk ); + L_THR2 = L_shl( L_deposit_l( THR2 ), SWB_BWE_LR_QRk ); + L_THR3 = L_shl( L_deposit_l( THR3 ), SWB_BWE_LR_QRk ); + + set_val_Word16( Bits_grp_fx, 0, GRP_SB ); + + /* Initialize subbands bits allocation vector based on harmonic bands */ + harmonic_band_fx = add( sub( N_fx, p2a_bands_fx ), 1 ); + /*printf("harmonic_band= %d %d\n", harmonic_band, harmonic_band_fx);*/ + FOR( k = 0; k < N_fx; k++ ) + { + L_Rsubband[k] = (Word32) ( C1_QRk ); + move32(); /* Constant Value */ + L_temp_band_energy[k] = L_y[k]; + move32(); /* SWB_BWE_LR_Qbe */ + } + final_gr_fact_pos_fx = 2; + move16(); + bits_fact_fx = C1_Qbf; + move16(); + bits_fact1_fx = C1_Qbf; + move16(); + + gmax_range_fx[0] = G1_RANGE; + move16(); + gmax_range_fx[1] = G1G2_RANGE; + move16(); + + IF( L_sub( L_core_brate, HQ_16k40 ) == 0 ) + { + gmax_range_fx[1] = add( gmax_range_fx[1], 2 ); + move16(); + } + + /* decide each group range, for grouping spectral coefficients */ + grp_rngmax_fx[1] = 16; + move16(); + grp_rngmax_fx[0] = 7; + move16(); + temp_fx = 0; + move16(); + FOR( i = 0; i < 2; i++ ) + { + j_fx = gmax_range_fx[i]; + move16(); + k_fx = 0; + move16(); + test(); + WHILE( L_sub( L_temp_band_energy[gmax_range_fx[i] - 1], L_temp_band_energy[j_fx] ) >= 0x0L && sub( j_fx, grp_rngmax_fx[i] ) < 0x0 ) + { + test(); + k_fx = add( k_fx, 1 ); + j_fx = add( j_fx, 1 ); + } + + temp_fx = k_fx; + move16(); + IF( sub( temp_fx, 1 ) > 0 ) + { + FOR( temp_fx = 2; temp_fx <= k_fx; ) + { + IF( L_sub( L_temp_band_energy[gmax_range_fx[i] + temp_fx - 1], L_temp_band_energy[gmax_range_fx[i] + temp_fx] ) < 0 ) + { + BREAK; + } + ELSE IF( L_sub( L_temp_band_energy[gmax_range_fx[i] + temp_fx - 1], L_temp_band_energy[gmax_range_fx[i] + temp_fx] ) >= 0 ) + { + temp_fx = add( temp_fx, 1 ); + IF( sub( temp_fx, k_fx ) > 0 ) + { + temp_fx = sub( temp_fx, 1 ); + BREAK; + } + } + } + + gmax_range_fx[i] = add( gmax_range_fx[i], temp_fx ); + } + ELSE + { + gmax_range_fx[i] = add( gmax_range_fx[i], temp_fx ); + } + } + + grp_bound_fx[0] = 0; + move16(); + FOR( i = 1; i < GRP_SB - 1; i++ ) + { + grp_bound_fx[i] = gmax_range_fx[i - 1]; + move16(); + } + grp_bound_fx[i] = harmonic_band_fx; + move16(); + grp_bound_fx[i + 1] = N_fx; + move16(); + + + FOR( i = 0; i < GRP_SB; i++ ) + { + L_Ravg_sub[i] = 0x0L; + move32(); + FOR( j = grp_bound_fx[i]; j < grp_bound_fx[i + 1]; j++ ) + { + IF( L_temp_band_energy[j] > 0x0L ) + { + L_Ravg_sub[i] = L_add( L_Ravg_sub[i], L_temp_band_energy[j] ); + move32(); + } + } + } + + L_temp_band_energydiff[0] = L_temp_band_energy[0]; + move32(); + FOR( j = 1; j < harmonic_band_fx; j++ ) + { + L_temp_band_energydiff[j] = L_abs( L_sub( L_temp_band_energy[j], L_temp_band_energy[j - 1] ) ); + move32(); + } + + G1_BE_DIFF_POS_fx = 0; + move16(); + L_G1_BE_DIFF_VAL = 0x0L; + move32(); + + FOR( j = 1; j < harmonic_band_fx; j++ ) + { + IF( L_sub( L_temp_band_energydiff[j], L_G1_BE_DIFF_VAL ) > 0 ) + { + G1_BE_DIFF_POS_fx = j; + move16(); + L_G1_BE_DIFF_VAL = L_temp_band_energydiff[j]; + move32(); + } + } + + test(); + test(); + IF( sub( G1_BE_DIFF_POS_fx, gmax_range_fx[0] ) < 0 && G1_BE_DIFF_POS_fx > 0 ) + { + final_gr_fact_pos_fx = 0; + move16(); + } + ELSE IF( sub( G1_BE_DIFF_POS_fx, gmax_range_fx[0] ) >= 0 && sub( G1_BE_DIFF_POS_fx, gmax_range_fx[1] ) < 0 ) + { + final_gr_fact_pos_fx = 1; + move16(); + } + ELSE + { + final_gr_fact_pos_fx = 2; + move16(); + } + + test(); + IF( final_gr_fact_pos_fx == 0 || sub( final_gr_fact_pos_fx, 1 ) == 0 ) + { + IF( L_sub( L_core_brate, HQ_16k40 ) == 0 ) + { + bits_fact_fx = BITS_FACT_1p10; + move16(); /* 1.10f; */ /* G1 */ + bits_fact1_fx = BITS_FACT_0p92; + move16(); /* 0.92f; */ /* G3 */ + } + ELSE + { + bits_fact_fx = BITS_FACT_1p05; + move16(); /* 1.05f; */ /* G1 */ + bits_fact1_fx = BITS_FACT_0p97; + move16(); /* 0.97f; */ /* G3 */ + } + } + ELSE + { + IF( L_sub( L_core_brate, HQ_16k40 ) == 0 ) + { + bits_fact_fx = BITS_FACT_0p97; + move16(); /* 0.97f; */ /* G1 */ + bits_fact1_fx = BITS_FACT_1p00; + move16(); /* 1.00f; */ /* G3 */ + } + ELSE + { + bits_fact_fx = BITS_FACT_0p92; + move16(); /* 0.92f; */ /* G1 */ + bits_fact1_fx = BITS_FACT_1p00; + move16(); /* 1.00f; */ /* G3 */ + } + } + + FOR( i = 0; i < sub( N_fx, harmonic_band_fx ); i++ ) + { + y_index_fx[i] = extract_h( L_shl( L_temp_band_energy[harmonic_band_fx + i], sub( 16, SWB_BWE_LR_Qbe ) ) ); + move16(); + index_fx[i] = add( harmonic_band_fx, i ); + move16(); + } + + reordvct( y_index_fx, sub( N_fx, harmonic_band_fx ), index_fx ); + + /* Log2 */ + L_temp = L_deposit_l( band_width_fx[index_fx[0]] ); + exp = norm_l( L_temp ); + frac = Log2_norm_lc( L_shl( L_temp, exp ) ); + exp = sub( 30, exp ); + L_temp = L_Comp( exp, frac ); + /* ceil */ + if ( L_and( 0x0000ffff, L_temp ) > 0 ) + { + L_temp = L_add( L_temp, 0x00010000 ); + } + esthf_bits_fx = extract_h( L_temp ); + + L_grp_thr[0] = L_THR1; + move32(); + L_grp_thr[1] = L_THR2; + move32(); + L_grp_thr[2] = L_THR3; + move32(); + L_grp_thr[3] = L_shl( L_deposit_l( esthf_bits_fx ), SWB_BWE_LR_QRk ); + move16(); + + L_norm_sum = 1; + move32(); + FOR( i = 0; i < 3; i++ ) + { + L_norm_sum = L_add( L_norm_sum, L_Ravg_sub[i] ); + move32(); + } + + /*reserve bits for HF coding */ + L_temp = L_add( L_norm_sum, L_Ravg_sub[GRP_SB - 1] ); + exp_normn = norm_l( L_temp ); + exp_normn = sub( exp_normn, 1 ); + exp_normd = norm_s( N_fx ); + + div_fx = div_l( L_shl( L_temp, exp_normn ), shl( N_fx, exp_normd ) ); /* (Qbe+exp_normn)-(0+exp_normd)-1) */ + L_norm_sum_avg = L_shr( L_deposit_h( div_fx ), add( sub( exp_normn, exp_normd ), 15 ) ); /* -> Qbe */ + + exp_norm = norm_l( L_norm_sum ); + norm_sum_fx = extract_h( L_shl( L_norm_sum, exp_norm ) ); /* SWB_BWE_LR_Qbe+exp_norm-16 */ + Qns = sub( add( SWB_BWE_LR_Qbe, exp_norm ), 16 ); + + Inv_norm_sum_fx = div_s( 0x4000 /* Q15 */, norm_sum_fx ); + QIns = sub( 31, exp_norm ); /* 14 - (14+exp_norm-16) + 15 */ + + grp_bit_avg_fx = div_s_ss( B_fx, GRP_SB ); /* Q0 */ + + exp_normd = norm_s( p2a_bands_fx ); + Inv_p2a_bands_fx = div_s( 0x3fff, shl( p2a_bands_fx, exp_normd ) ); /* 14-exp_normd+15 */ + QIpb = sub( 29, exp_normd ); + + L_temp = L_shl( Mpy_32_16( L_Ravg_sub[GRP_SB - 1], Inv_p2a_bands_fx ), sub( SWB_BWE_LR_Qbe, sub( QIpb, 1 ) ) ); + L_norm_diff = L_sub( L_temp, L_norm_sum_avg ); /* Qbe */ + + L_temp = Mpy_32_16( L_Ravg_sub[GRP_SB - 1], sub( GRP_SB, 1 ) ); /* Qbe+0+1 */ + L_temp = Mpy_32_16( L_temp, Inv_norm_sum_fx ); /* Qbe+1+QIpb+1 */ +#ifdef BASOP_NOGLOB + lf_hf_ge_r_fx = round_fx_o( L_shl_o( L_temp, sub( 15 + 16, sub( add( SWB_BWE_LR_Qbe, QIns ), 30 ) ), &Overflow ), &Overflow ); + Overflow = 0; /* reset BASOP Overflow */ +#else + lf_hf_ge_r_fx = round_fx( L_shl( L_temp, sub( 15 + 16, sub( add( SWB_BWE_LR_Qbe, QIns ), 30 ) ) ) ); +#endif + + exp_normn = norm_s( norm_sum_fx ); + exp_normn = sub( exp_normn, 1 ); + exp_normd = norm_s( harmonic_band_fx ); + + div_fx = div_s( shl( norm_sum_fx, exp_normn ), shl( harmonic_band_fx, exp_normd ) ); + L_avg_enhf_en_diff = L_sub( L_temp_band_energy[index_fx[0]], L_shl( L_deposit_h( div_fx ), sub( sub( SWB_BWE_LR_Qbe, ( add( Qns, sub( exp_normn, exp_normd ) ) ) ), 31 ) ) ); /* Qbe - (Qns+exp_normn-(exp_normd)+15) -16 */ + + IF( sub( lf_hf_ge_r_fx, 26214 ) > 0x0 && L_sub( L_avg_enhf_en_diff, (Word32) ( 8 << SWB_BWE_LR_Qbe ) ) > 0x0L ) /* 0.8=26214.4(Q15) 8.0f=131072(Qbe) */ + { + bits_allocweigh_fx = 6554; + move16(); /* 0.2 6553.6(Q15) */ + IF( L_norm_diff < 0x0L ) + { + bits_allocweigh_fx = 13107; + move16(); /* 0.4 13107.2(Q15) */ + } + + /*allocate bits*/ + /*Bits_grp[GRP_SB-1] = (int16_t)min((grp_bit_avg/p2a_bands + bits_allocweigh*norm_diff),10);*/ + L_temp = L_mult( grp_bit_avg_fx, Inv_p2a_bands_fx ); /* Q0+QIpb+1 */ + L_temp2 = Mpy_32_16( L_norm_diff, bits_allocweigh_fx ); /* Qbe+Q15-15 */ + + L_temp = L_shr( L_temp, add( QIpb, 1 ) ); + L_temp = L_add( L_shl( L_temp, SWB_BWE_LR_Qbe ), L_temp2 ); + + Bits_grp_fx[GRP_SB - 1] = extract_h( L_shl( L_temp, sub( 16, SWB_BWE_LR_Qbe ) ) ); + Bits_grp_fx[GRP_SB - 1] = s_min( Bits_grp_fx[GRP_SB - 1], 10 ); + + test(); + if ( sub( Bits_grp_fx[GRP_SB - 1], esthf_bits_fx ) < 0 ) + { + Bits_grp_fx[GRP_SB - 1] = 0; + move16(); + } + B_fx = sub( B_fx, Bits_grp_fx[GRP_SB - 1] ); + } + + exp_shift = sub( add( SWB_BWE_LR_Qbe, QIns ), 47 ); /* (SWB_BWE_LR_Qbe+14+1+QIns-15-16) */ + exp_norm = norm_s( B_fx ); + B_norm_fx = shl( B_fx, exp_norm ); + exp_shift = add( exp_shift, exp_norm ); + + IF( sub( final_gr_fact_pos_fx, 1 ) == 0 ) + { + L_temp = Mpy_32_16( L_Ravg_sub[1], extract_h( L_mult( bits_fact_fx, B_norm_fx ) ) ); + L_temp = Mpy_32_16( L_temp, Inv_norm_sum_fx ); + Bits_grp_fx[1] = extract_h( L_shr( L_temp, exp_shift ) ); + + L_temp = Mpy_32_16( L_Ravg_sub[2], extract_h( L_mult( bits_fact1_fx, B_norm_fx ) ) ); + L_temp = Mpy_32_16( L_temp, Inv_norm_sum_fx ); + Bits_grp_fx[2] = extract_h( L_shr( L_temp, exp_shift ) ); + + Bits_grp_fx[0] = sub( sub( B_fx, Bits_grp_fx[1] ), Bits_grp_fx[2] ); + } + ELSE + { + L_temp = Mpy_32_16( L_Ravg_sub[0], extract_h( L_mult( bits_fact_fx, B_norm_fx ) ) ); + L_temp = Mpy_32_16( L_temp, Inv_norm_sum_fx ); + Bits_grp_fx[0] = extract_h( L_shr( L_temp, exp_shift ) ); + + L_temp = Mpy_32_16( L_Ravg_sub[2], extract_h( L_mult( bits_fact1_fx, B_norm_fx ) ) ); + L_temp = Mpy_32_16( L_temp, Inv_norm_sum_fx ); + Bits_grp_fx[2] = extract_h( L_shr( L_temp, exp_shift ) ); + + Bits_grp_fx[1] = sub( sub( B_fx, Bits_grp_fx[0] ), Bits_grp_fx[2] ); + } + + IF( sub( Bits_grp_fx[2], THR2 ) < 0 ) + { + Bits_grp_fx[1] = add( Bits_grp_fx[1], Bits_grp_fx[2] ); + move16(); + Bits_grp_fx[2] = 0; + move16(); + } + + FOR( i = 0; i < GRP_SB; i++ ) + { + IF( Bits_grp_fx[i] > 0 ) + { + Bits2indvsb_fx( L_temp_band_energy, grp_bound_fx[i], grp_bound_fx[i + 1], Bits_grp_fx[i], L_grp_thr[i], L_Rsubband, p2a_flags_fx ); + } + ELSE + { + set_val_Word32( L_Rsubband + grp_bound_fx[i], 0x0L, sub( grp_bound_fx[i + 1], grp_bound_fx[i] ) ); + IF( sub( i, GRP_SB - 1 ) == 0 ) + { + set_val_Word16( p2a_flags_fx + grp_bound_fx[i], 0, sub( grp_bound_fx[i + 1], grp_bound_fx[i] ) ); + } + } + } + return; +} + +void hq2_bit_alloc( + const float band_energy[], /* i : band energy of each subband */ + const int16_t bands, /* i : total number of subbands in a frame */ + Word32 L_Rk[], /* i/o: Bit allocation/Adjusted bit alloc. */ + int16_t *bit_budget_fx, /* i/o: bit bugdet */ + int16_t *p2a_flags, /* i : HF tonal indicator */ + const Word16 weight_fx, /* i : weight (Q13) */ + const int16_t band_width[], /* i : Sub band bandwidth */ + const int16_t num_bits, /* i : available bits */ + const int16_t hqswb_clas, /* i : HQ2 class information */ + const int16_t bwidth, /* i : input bandwidth */ + const int16_t is_transient /* i : indicator HQ_TRANSIENT or not */ +) +{ + Word16 j, k; + Word16 tmp; + Word16 bit_budget_norm_fx; + + Word32 L_Rcalc, L_Ravg, L_Rcalc1; + + Word16 exp_normn, exp_normd; + + Word16 Rcnt_fx; + + Word16 div_fx; + Word16 Qdiv; + + Word32 L_tmp; + Word16 tmp_fx; + + Word32 L_maxxy; + Word16 maxdex_fx; + Word32 L_dummy; + + Word16 bit_budget_temp_fx; + + Word16 negflag; + + Word32 L_THR1, L_THR2, L_THR3; + + Word32 L_band_energy[BANDS_MAX]; + + for ( k = 0; k < bands; k++ ) + { + L_band_energy[k] = (Word32) ( band_energy[k] * (float) pow( 2.0f, SWB_BWE_LR_Qbe ) ); + } + + L_THR1 = L_shl( L_deposit_l( THR1 ), SWB_BWE_LR_QRk ); + L_THR2 = L_shl( L_deposit_l( THR2 ), SWB_BWE_LR_QRk ); + L_THR3 = L_shl( L_deposit_l( THR3 ), SWB_BWE_LR_QRk ); + + /* Init Rk to non-zero values for bands to be allocated bits */ + IF( sub( num_bits, HQ_16k40_BIT ) <= 0 ) + { + set_val_Word32( L_Rk, (Word32) ( C1_QRk ), bands ); /* 1< 0 ) + { + L_Ravg = L_add( L_Ravg, L_shl( L_band_energy[k], sub( SWB_BWE_LR_QRk, SWB_BWE_LR_Qbe ) ) ); /* SWB_BWE_LR_QRk-SWB_BWE_LR_Qbe */ + Rcnt_fx = add( Rcnt_fx, 1 ); + } + } + /* Ravg Qband_energy */ + + /*L_Ravg /= Rcnt; */ + exp_normd = norm_l( L_Ravg ); + exp_normd = sub( exp_normd, 1 ); + exp_normn = norm_s( Rcnt_fx ); + + tmp = shl( Rcnt_fx, exp_normn ); + tmp = s_max( tmp, 1 ); + IF( L_Ravg > 0 ) + { + div_fx = div_l( L_shl( L_Ravg, exp_normd ), tmp ); /* Qdiv = 14+exp_normd-(exp_normn)-1 */ + } + ELSE + { + div_fx = div_l( L_shl( L_abs( L_Ravg ), exp_normd ), tmp ); /* Qdiv = 14+exp_normd-(exp_normn)-1 */ + div_fx = negate( div_fx ); + } + + /*Qdiv = QRk+exp_normd-(exp_normn)-1; */ + Qdiv = sub( sub( add( SWB_BWE_LR_QRk, exp_normd ), exp_normn ), 1 ); + + L_Ravg = L_shr( L_deposit_l( div_fx ), sub( Qdiv, SWB_BWE_LR_QRk ) ); + + exp_normd = norm_s( *bit_budget_fx ); + exp_normd = sub( exp_normd, 1 ); + bit_budget_norm_fx = shl( *bit_budget_fx, exp_normd ); + div_fx = 0; + move16(); + + test(); + IF( bit_budget_norm_fx > 0 && sub( bit_budget_norm_fx, tmp ) < 0 ) + { + div_fx = div_s( bit_budget_norm_fx, tmp ); + } + Qdiv = add( sub( exp_normd, exp_normn ), 15 ); + + FOR( k = 0; k < bands; k++ ) + { + IF( L_Rk[k] > 0 ) + { + /*Rk[k] = ((float) *bit_budget / Rcnt + weight * (band_energy[k] - Ravg)); */ + + L_tmp = Mpy_32_16( L_sub( L_shl( L_band_energy[k], sub( SWB_BWE_LR_QRk, SWB_BWE_LR_Qbe ) ), L_Ravg ), weight_fx ); /* SWB_BWE_LR_QRk + Q13 - 15 */ + L_tmp = L_shl( L_tmp, 2 ); /* -> SWB_BWE_LR_QRk */ + + L_Rk[k] = L_add( L_shr( L_deposit_l( div_fx ), sub( Qdiv, SWB_BWE_LR_QRk ) ), L_tmp ); + } + } + + negflag = 0; + move16(); + L_Rcalc = 0; + move32(); + FOR( k = 0; k < bands; k++ ) + { + IF( L_sub( L_Rk[k], MIN_BITS_FIX ) < 0 ) + { + L_Rk[k] = 0x0L; + move32(); + negflag = 1; + move16(); + } + L_Rcalc = L_add( L_Rcalc, L_Rk[k] ); /*SWB_BWE_LR_QRk */ + } + + /* prune noiselike bands with low allocation */ + IF( sub( num_bits, HQ_16k40_BIT ) <= 0 && negflag == 0 ) + { + L_maxxy = 0; + move32(); + maxdex_fx = -1; + move16(); + L_Rcalc = 0; + move32(); + + /* find worst under-allocation */ + FOR( k = sub( bands, 1 ); k >= 0; k-- ) + { + /* dummy = ((float) min (band_width[k], max (12, band_width[k] / 4))) - Rk[k]; */ + tmp_fx = s_min( band_width[k], s_max( 12, shr( band_width[k], 2 ) ) ); + L_dummy = L_sub( L_shl( L_deposit_l( tmp_fx ), SWB_BWE_LR_QRk ), L_Rk[k] ); /*SWB_BWE_LR_QRk */ + test(); + test(); + test(); + IF( p2a_flags[k] == 0 && L_sub( L_dummy, L_maxxy ) > 0 && L_Rk[k] > 0 ) + { + maxdex_fx = k; + move16(); + L_maxxy = L_dummy; + move32(); /*SWB_BWE_LR_QRk */ + } + } + + /* prune worst allocation and recalculate total allocation */ + IF( sub( maxdex_fx, -1 ) > 0 ) + { + L_Rk[maxdex_fx] = 0; + move32(); + } + FOR( k = 0; k < bands; k++ ) + { + L_Rcalc = L_add( L_Rcalc, L_Rk[k] ); /*SWB_BWE_LR_QRk */ + } + } + test(); + IF( L_sub( L_Rcalc, L_Rcalc1 ) == 0 && sub( bwidth, SWB ) == 0 ) + { + /* Reallocate bits to individual subbands for HQ_NORMAL mode */ + /* if bits allocated to subbands areless than predefined threshold */ + IF( sub( hqswb_clas, HQ_NORMAL ) == 0 && sub( num_bits, HQ_16k40_BIT ) < 0 ) + { + L_dummy = 0x0L; + move32(); + FOR( k = 0; k < bands; k++ ) + { + test(); + test(); + test(); + test(); + test(); + IF( sub( k, 11 ) < 0 && L_sub( L_Rk[k], L_THR1 ) < 0 ) + { + L_Rk[k] = 0x0L; + move32(); + } + ELSE IF( sub( k, 11 ) >= 0 && sub( k, 16 ) < 0 && L_sub( L_Rk[k], L_THR2 ) < 0 ) + { + L_Rk[k] = 0x0L; + move32(); + } + ELSE IF( sub( k, 16 ) >= 0 && sub( k, bands ) < 0 && L_sub( L_Rk[k], L_THR3 ) < 0 ) + { + L_Rk[k] = 0x0L; + move32(); + } + + L_dummy = L_add( L_dummy, L_Rk[k] ); + } + + IF( L_sub( L_dummy, L_Rcalc ) == 0 ) + { + test(); + IF( sub( hqswb_clas, HQ_NORMAL ) == 0 && sub( num_bits, HQ_16k40_BIT ) < 0 ) + { + bit_budget_temp_fx = *bit_budget_fx; + move16(); + FOR( k = 0; k < NB_SWB_SUBBANDS; k++ ) + { + IF( p2a_flags[bands - NB_SWB_SUBBANDS + k] == 1 && L_Rk[bands - NB_SWB_SUBBANDS + k] == 0.0f ) + { + p2a_flags[bands - NB_SWB_SUBBANDS + k] = 0; + move16(); + bit_budget_temp_fx = sub( bit_budget_temp_fx, bits_lagIndices_modeNormal[k] ); + } + } + + IF( sub( bit_budget_temp_fx, *bit_budget_fx ) < 0 ) + { + *bit_budget_fx = bit_budget_temp_fx; + move16(); + /* a negative *bit_budget_fx may occur here due to Bit Errors */ + /* handled outside this function to properly set flag: st_fx->BER_detect */ + } + ELSE IF( sub( bit_budget_temp_fx, *bit_budget_fx ) == 0 ) + { + BREAK; + } + } + ELSE + { + BREAK; + } + } + } + ELSE + { + BREAK; + } + } + ELSE IF( L_sub( L_Rcalc, L_Rcalc1 ) == 0 && sub( bwidth, SWB ) != 0 ) + { + BREAK; + } + + L_Rcalc1 = L_Rcalc; + move32(); + } + return; +} + +#undef WMC_TOOL_SKIP diff --git a/lib_com/hq2_core_com.c b/lib_com/hq2_core_com.c new file mode 100644 index 0000000000000000000000000000000000000000..280d492ae6b121107e41e2ea1d2a1ee341f98543 --- /dev/null +++ b/lib_com/hq2_core_com.c @@ -0,0 +1,581 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "basop_util.h" +#include "basop_proto_func.h" +#include "wmc_auto.h" + +/*--------------------------------------------------------------------------* + * mdct_spectrum_denorm() + * + * + *--------------------------------------------------------------------------*/ + +void mdct_spectrum_denorm( + const int32_t inp_vector[], + float y2[], + const int16_t band_start[], + const int16_t band_end[], + const int16_t band_width[], + const float band_energy[], + const int16_t npulses[], + const int16_t bands, + const float ld_slope, + const float pd_thresh ) +{ + int16_t i, k; + float Eyy, gamma, pd, gain_tweak; + + for ( k = 0; k < bands; k++ ) + { + Eyy = 0; + for ( i = band_start[k]; i <= band_end[k]; i++ ) + { + Eyy += (float) inp_vector[i] * inp_vector[i]; + } + + if ( Eyy > 0.0f ) + { + /* Set gamma to be pulse gain which results in perfect quantized subband energy */ + gamma = (float) sqrt( pow( 2.0f, band_energy[k] ) / Eyy ); + + /* Adjust gamma based on pulse density (0 bit MSE gain estimator) */ + pd = (float) npulses[k] / band_width[k]; + if ( pd < pd_thresh ) + { + gain_tweak = (float) pow( 2.0f, ( ld_slope * log2_f( pd / pd_thresh ) ) ); + gamma *= gain_tweak; + } + + for ( i = band_start[k]; i <= band_end[k]; i++ ) + { + y2[i] = gamma * inp_vector[i]; + } + } + } + + return; +} +/*--------------------------------------------------------------------------* + * hq2_core_configure() + * + * + *--------------------------------------------------------------------------*/ + +void hq2_core_configure( + const int16_t frame_length, /* i : frame length */ + const int16_t num_bits, /* i : number of bits */ + const int16_t is_transient, /* i : transient flag */ + int16_t *bands, + int16_t *length, + int16_t band_width[], + int16_t band_start[], + int16_t band_end[], + Word32 *L_qint, + Word16 *eref_fx, + Word16 *bit_alloc_weight_fx, + int16_t *gqlevs, + int16_t *Ngq, + int16_t *p2a_bands, + float *p2a_th, + float *pd_thresh, + float *ld_slope, + float *ni_coef, + float *ni_pd_th, + int32_t bwe_br ) +{ + const Xcore_Config *xcore_config; + + int16_t i, k; + int16_t bands_sh; + + if ( frame_length == L_FRAME8k ) + { + if ( is_transient ) + { + if ( num_bits <= ACELP_7k20 / FRAMES_PER_SEC ) + { + xcore_config = &xcore_config_8kHz_007200bps_short; + } + else if ( num_bits <= ACELP_8k00 / FRAMES_PER_SEC ) + { + xcore_config = &xcore_config_8kHz_008000bps_short; + } + else if ( num_bits <= ACELP_13k20 / FRAMES_PER_SEC ) + { + xcore_config = &xcore_config_8kHz_013200bps_short; + } + else + { + xcore_config = &xcore_config_8kHz_016400bps_short; + } + } + else + { + if ( num_bits <= ACELP_7k20 / FRAMES_PER_SEC ) + { + xcore_config = &xcore_config_8kHz_007200bps_long; + } + else if ( num_bits <= ACELP_8k00 / FRAMES_PER_SEC ) + { + xcore_config = &xcore_config_8kHz_008000bps_long; + } + else if ( num_bits <= ACELP_13k20 / FRAMES_PER_SEC ) + { + xcore_config = &xcore_config_8kHz_013200bps_long; + } + else + { + xcore_config = &xcore_config_8kHz_016400bps_long; + } + } + } + else if ( frame_length == L_FRAME16k ) + { + if ( is_transient ) + { + if ( num_bits <= ACELP_13k20 / FRAMES_PER_SEC ) + { + xcore_config = &xcore_config_16kHz_013200bps_short; + } + else + { + xcore_config = &xcore_config_16kHz_016400bps_short; + } + } + else + { + if ( num_bits <= ACELP_13k20 / FRAMES_PER_SEC ) + { + xcore_config = &xcore_config_16kHz_013200bps_long; + } + else + { + xcore_config = &xcore_config_16kHz_016400bps_long; + } + } + } + else /* (bwidth == SWB) */ + { + if ( is_transient ) + { + if ( bwe_br == ACELP_13k20 ) + { + xcore_config = &xcore_config_32kHz_013200bps_short; + } + else + { + xcore_config = &xcore_config_32kHz_016400bps_short; + } + } + else + { + if ( bwe_br == ACELP_13k20 ) + { + xcore_config = &xcore_config_32kHz_013200bps_long; + } + else + { + xcore_config = &xcore_config_32kHz_016400bps_long; + } + } + } + + *bands = xcore_config->bands; + *length = xcore_config->bw; + *L_qint = xcore_config->L_qint; + *eref_fx = xcore_config->eref_fx; + *bit_alloc_weight_fx = xcore_config->bit_alloc_weight_fx; + *gqlevs = xcore_config->gqlevs; + *Ngq = xcore_config->Ngq; + + *p2a_bands = xcore_config->p2a_bands; + *p2a_th = xcore_config->p2a_th; + + *pd_thresh = xcore_config->pd_thresh; + *ld_slope = xcore_config->ld_slope; + *ni_coef = xcore_config->ni_coef; + *ni_pd_th = xcore_config->ni_pd_th; + + mvs2s( xcore_config->band_width, band_width, *bands ); + + /* Expand band_width[] table for short windows */ + if ( is_transient ) + { + bands_sh = *bands; + *bands = NUM_TIME_SWITCHING_BLOCKS * bands_sh; + *length *= NUM_TIME_SWITCHING_BLOCKS; + + for ( i = 1; i <= 3; i++ ) + { + for ( k = 0; k < bands_sh; k++ ) + { + band_width[i * bands_sh + k] = band_width[k]; + } + } + } + + /* Formulate band_start and band_end tables from band_width table */ + band_start[0] = 0; + band_end[0] = band_width[0] - 1; + for ( k = 1; k < *bands; k++ ) + { + band_start[k] = band_start[k - 1] + band_width[k - 1]; + band_end[k] = band_start[k] + band_width[k] - 1; + } + + return; +} + +/*--------------------------------------------------------------------------* + * reverse_transient_frame_energies() + * + * + *--------------------------------------------------------------------------*/ + +void reverse_transient_frame_energies( + float band_energy[], /* o : band energies */ + const int16_t bands /* i : number of bands */ +) +{ + int16_t k, k1, k2; + float be; + + k1 = bands / 4; + k2 = bands / 2 - 1; + for ( k = 0; k < bands / 8; k++ ) + { + be = band_energy[k1]; + band_energy[k1] = band_energy[k2]; + band_energy[k2] = be; + k1++, k2--; + } + + k1 = 3 * bands / 4; + k2 = bands - 1; + for ( k = 0; k < bands / 8; k++ ) + { + be = band_energy[k1]; + band_energy[k1] = band_energy[k2]; + band_energy[k2] = be; + k1++, k2--; + } + + return; +} + +#define WMC_TOOL_SKIP +void bit_allocation_second_fx( + Word32 *Rk, + Word32 *Rk_sort, + Word16 BANDS, + const Word16 *band_width, + Word16 *k_sort, + Word16 *k_num, + const Word16 *p2a_flags, + const Word16 p2a_bands, + const Word16 *last_bitalloc, + const Word16 input_frame ) +{ + Word16 k, k2 = 0; + Word16 ever_bits[BANDS_MAX], ever_sort[BANDS_MAX]; /*Q12 */ + Word16 class_flag = 0; + Word16 rk_temp = 32767, ever_temp = 32767; /*Q12 */ + Word16 exp; + Word16 tmp; + Word32 L_tmp; + + for ( k = 0; k < BANDS; k++ ) + { + if ( ( ( sub( k_sort[k], sub( BANDS, p2a_bands ) ) >= 0 ) && ( sub( p2a_flags[k_sort[k]], 1 ) == 0 ) ) || + ( ( sub( k_sort[k], sub( BANDS, 2 ) ) >= 0 ) && ( sub( last_bitalloc[sub( k_sort[k], sub( BANDS, 2 ) )], 1 ) == 0 ) ) ) + { + exp = norm_s( band_width[k_sort[k]] ); + tmp = shl( band_width[k_sort[k]], exp ); /*Q(exp) */ + tmp = div_s( 16384, tmp ); /*Q(15+14-exp = 29-exp) */ + L_tmp = Mult_32_16( Rk_sort[k], tmp ); /* Q(16+29-exp-15 = 30-exp) */ + tmp = sub( 18, exp ); + ever_bits[k] = extract_l( L_shr( L_tmp, tmp ) ); /*Q12 */ + if ( sub( ever_bits[k], rk_temp ) < 0 ) + { + rk_temp = ever_bits[k]; + k2 = k; + } + class_flag = 1; + } + } + if ( class_flag == 0 || sub( input_frame, L_FRAME8k ) == 0 ) + { + for ( k = 0; k < BANDS; k++ ) + { + if ( sub( k_sort[k], sub( BANDS, p2a_bands ) ) < 0 && Rk_sort[k] > 0 ) + { + exp = norm_s( band_width[k_sort[k]] ); + tmp = shl( band_width[k_sort[k]], exp ); /*Q(exp) */ + tmp = div_s( 16384, tmp ); /*Q(15+14-exp = 29-exp) */ + L_tmp = Mult_32_16( Rk_sort[k], tmp ); /* Q(16+29-exp-15 = 30-exp) */ + tmp = sub( 18, exp ); + ever_sort[k] = extract_l( L_shr( L_tmp, tmp ) ); /*Q12 */ + IF( sub( ever_sort[k], ever_temp ) < 0 ) + { + ever_temp = ever_sort[k]; + k2 = k; + } + } + } + } + + k_num[0] = k2; + if ( sub( k_sort[k2], sub( BANDS, 1 ) ) == 0 ) + { + for ( k = 0; k < BANDS; k++ ) + { + if ( sub( k_sort[k], sub( k_sort[k2], 1 ) ) == 0 ) + { + k_num[1] = k; + } + } + } + else if ( k_sort[k2] == 0 ) + { + for ( k = 0; k < BANDS; k++ ) + { + if ( sub( k_sort[k], add( k_sort[k2], 1 ) ) == 0 ) + { + k_num[1] = k; + } + } + } + else + { + if ( L_sub( Rk[sub( k_sort[k2], 1 )], Rk[add( k_sort[k2], 1 )] ) < 0 ) + { + for ( k = 0; k < BANDS; k++ ) + { + if ( sub( k_sort[k], sub( k_sort[k2], 1 ) ) == 0 ) + { + k_num[1] = k; + } + } + } + else + { + for ( k = 0; k < BANDS; k++ ) + { + if ( sub( k_sort[k], add( k_sort[k2], 1 ) ) == 0 ) + { + k_num[1] = k; + } + } + } + } + + return; +} + +#undef WMC_TOOL_SKIP + +/*--------------------------------------------------------------------------* + * spt_shorten_domain_pre() + * + * Compute shorten subband if previous frame has spectral peak. + *--------------------------------------------------------------------------*/ + +void spt_shorten_domain_pre( + const int16_t band_start[], /* i : Starting position of sub band */ + const int16_t band_end[], /* i : End position of sub band */ + const int16_t prev_SWB_peak_pos[], /* i : Spectral peak */ + const int16_t BANDS, /* i : total number of bands */ + const int32_t bwe_br, /* i : bitrate information */ + int16_t new_band_start[], /* o : Starting position of new shorten sub band */ + int16_t new_band_end[], /* o : End position of new shorten sub band */ + int16_t new_band_width[] /* o : new sub band bandwidth */ +) +{ + int16_t j, k, kpos; + + int16_t new_band_width_half; + const int16_t *p_bw_SPT_tbl; /* pointer of bw_SPT_tbl */ + + p_bw_SPT_tbl = bw_SPT_tbl[0]; + if ( bwe_br == HQ_16k40 ) + { + p_bw_SPT_tbl = bw_SPT_tbl[1]; + } + + kpos = 0; + j = 0; + for ( k = BANDS - SPT_SHORTEN_SBNUM; k < BANDS; k++ ) + { + if ( prev_SWB_peak_pos[kpos] != 0 ) + { + new_band_width[j] = p_bw_SPT_tbl[j]; + + /*shorten the bandwidth for pulse resolution*/ + new_band_width_half = new_band_width[j] / 2; + new_band_start[j] = prev_SWB_peak_pos[kpos] - new_band_width_half; + new_band_end[j] = prev_SWB_peak_pos[kpos] + new_band_width_half; + + if ( new_band_start[j] < band_start[k] ) + { + new_band_start[j] = band_start[k]; + new_band_end[j] = new_band_start[j] + ( new_band_width[j] - 1 ); + } + else if ( new_band_end[j] > band_end[k] ) + { + new_band_end[j] = band_end[k]; + new_band_start[j] = new_band_end[j] - ( new_band_width[j] - 1 ); + } + } + else + { + new_band_width[j] = p_bw_SPT_tbl[j]; + + /*shorten the bandwidth for pulse resolution*/ + new_band_width_half = new_band_width[j] / 2; + new_band_start[j] = ( band_start[k] + band_end[k] ) / 2 - new_band_width_half; + new_band_end[j] = ( band_start[k] + band_end[k] ) / 2 + new_band_width_half; + } + + kpos++; + j++; + } + + return; +} + +/*--------------------------------------------------------------------------* + * spt_shorten_domain_band_save() + * + * Store the original subband information + *--------------------------------------------------------------------------*/ + +void spt_shorten_domain_band_save( + const int16_t bands, /* i : total subband */ + const int16_t band_start[], /* i : starting position of subband */ + const int16_t band_end[], /* i : end position of subband */ + const int16_t band_width[], /* i : band width of subband */ + int16_t org_band_start[], /* o : starting position of subband */ + int16_t org_band_end[], /* o : end position of subband */ + int16_t org_band_width[] /* o : band width of subband */ +) +{ + int16_t k, kpos; + + kpos = 0; + for ( k = bands - SPT_SHORTEN_SBNUM; k < bands; k++ ) + { + org_band_start[kpos] = band_start[k]; + org_band_end[kpos] = band_end[k]; + org_band_width[kpos] = band_width[k]; + kpos++; + } + + return; +} + +/*--------------------------------------------------------------------------* + * spt_shorten_domain_band_restore() + * + * Restrore the subband information + *--------------------------------------------------------------------------*/ + +void spt_shorten_domain_band_restore( + const int16_t bands, /* i : total subband */ + int16_t band_start[], /* i/o: starting position of subband */ + int16_t band_end[], /* i/o: end position of subband */ + int16_t band_width[], /* i/o: band width of subband */ + const int16_t org_band_start[], /* o : starting position of subband */ + const int16_t org_band_end[], /* o : end position of subband */ + const int16_t org_band_width[] /* o : band width of subband */ +) +{ + int16_t k, kpos; + + kpos = 0; + for ( k = bands - SPT_SHORTEN_SBNUM; k < bands; k++ ) + { + band_start[k] = org_band_start[kpos]; + band_end[k] = org_band_end[kpos]; + band_width[k] = org_band_width[kpos]; + kpos++; + } + + return; +} + +/*--------------------------------------------------------------------------* + * spt_swb_peakpos_tmp_save + * + * Save Peak position for every higher subband + *--------------------------------------------------------------------------*/ + +void spt_swb_peakpos_tmp_save( + const float y2[], /* i : coded spectral information */ + const int16_t bands, /* i : total number of bands */ + const int16_t band_start[], /* i : starting position of subband */ + const int16_t band_end[], /* i : end position of subband */ + int16_t prev_SWB_peak_pos_tmp[] /* o : spectral peaks */ +) +{ + + int16_t i, j, k; + float peak_max; + + j = 0; + for ( k = bands - SPT_SHORTEN_SBNUM; k < bands; k++ ) + { + peak_max = 0; + prev_SWB_peak_pos_tmp[j] = 0; + for ( i = band_start[k]; i <= band_end[k]; i++ ) + { + if ( peak_max < fabs( y2[i] ) ) + { + peak_max = (float) fabs( y2[i] ); + prev_SWB_peak_pos_tmp[j] = i; + } + } + j++; + } + + return; +} diff --git a/lib_com/hq2_noise_inject.c b/lib_com/hq2_noise_inject.c new file mode 100644 index 0000000000000000000000000000000000000000..ed48dab7b908ac6e257549f5396e3a23f565996c --- /dev/null +++ b/lib_com/hq2_noise_inject.c @@ -0,0 +1,275 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "prot.h" +#include "wmc_auto.h" + +/*--------------------------------------------------------------------------* + * hq2_noise_inject() + * + * HQ2 noise injection for WB signals + *--------------------------------------------------------------------------*/ + +void hq2_noise_inject( + float y2hat[], + const int16_t band_start[], + const int16_t band_end[], + const int16_t band_width[], + float Ep[], + float Rk[], + const int16_t npulses[], + int16_t ni_seed, + const int16_t bands, + const int16_t ni_start_band, + const int16_t bw_low, + const int16_t bw_high, + const float enerL, + const float enerH, + float last_ni_gain[], + float last_env[], + int16_t *last_max_pos_pulse, + int16_t *p2a_flags, + int16_t p2a_bands, + const int16_t hqswb_clas, + const int16_t bwidth, + const int32_t bwe_br ) +{ + int16_t i, j, k, ni_end_band, satur = 0, count[BANDS_MAX], max_pos_pulse, pos; + float ni_gain[BANDS_MAX], pd[BANDS_MAX], rand, peak[BANDS_MAX], fac, env[BANDS_MAX]; + int16_t sb = bands; + + if ( ( hqswb_clas == HQ_HARMONIC || hqswb_clas == HQ_NORMAL ) && ( bwe_br == HQ_16k40 || bwe_br == HQ_13k20 ) && bwidth == SWB ) + { + sb = ( bwe_br == HQ_16k40 ) ? 19 : 17; + } + + /* calculate the envelopes/ the decoded peak coeff./number of the decoded coeff./ the last subbands of the bit-allocated/saturation of bit-allocation */ + ni_end_band = bands; + max_pos_pulse = bands; + for ( k = ni_start_band; k < ni_end_band; k++ ) + { + pd[k] = (float) Rk[k] / band_width[k]; + env[k] = (float) sqrt( Ep[k] / band_width[k] ); + + peak[k] = 0.0f; + count[k] = 0; + if ( npulses[k] != 0 ) + { + for ( i = band_start[k]; i <= band_end[k]; i++ ) + { + Ep[k] -= y2hat[i] * y2hat[i]; + if ( fabs( y2hat[i] ) > peak[k] ) + { + peak[k] = (float) fabs( y2hat[i] ); + } + + if ( y2hat[i] != 0 ) + { + count[k]++; + } + } + + max_pos_pulse = k; + Ep[k] = Ep[k] > 0 ? (float) sqrt( Ep[k] / band_width[k] ) : 0.0f; + } + else + { + Ep[k] = env[k]; + } + } + + for ( k = ni_start_band; k < ni_end_band; k++ ) + { + /* calculate the noise gain */ + satur = ( pd[k] >= 0.8f ) ? 1 : 0; + if ( satur == 0 && Ep[k] > 0 ) + { + if ( npulses[k] != 0 ) + { + if ( bwidth == SWB ) + { + if ( hqswb_clas != HQ_TRANSIENT ) + { + if ( hqswb_clas == HQ_HARMONIC ) + { + fac = ( k <= sb ) ? 6.0f * ( 1.5f - pd[k] ) * env[k] * Ep[k] / ( peak[k] * peak[k] ) : 1.5f * Ep[k] / peak[k]; + } + else + { + fac = ( k <= sb ) ? 5.0f * ( 1.5f - pd[k] ) * Ep[k] / ( peak[k] ) : 4.0f * Ep[k] / peak[k]; + } + } + else + { + fac = 1.1f; + } + } + else + { + fac = 20.0f * min( 1.0f, ( 1.5f - pd[k] ) ) * env[k] * Ep[k] / ( peak[k] * peak[k] ); + if ( k > 1 && k < ni_end_band - 1 ) + { + if ( count[k + 1] == 0 && env[k] > 0.5f * env[k + 1] && env[k] < 2.0f * env[k - 1] ) + { + fac = 1.5f * env[k + 1] / env[k]; + } + else if ( count[k - 1] == 0 && peak[k] > 2.0f * env[k] ) + { + fac = env[k - 1] / env[k]; + } + } + + if ( k >= ni_end_band - p2a_bands && bwidth == WB ) + { + if ( bw_low * enerH > bw_high * enerL && peak[k] < 2.0f * env[k] ) + { + fac *= ( 2.0f - Ep[k] / peak[k] ); + } + + if ( p2a_flags[k] == 0 && fac > 0 ) + { + fac *= min( 1.25f * env[k] / ( Ep[k] * fac ), 1.5f ); + } + } + } + } + else + { + fac = ( hqswb_clas == HQ_HARMONIC && bwidth == SWB ) ? 0.8f : 1.1f; + } + + ni_gain[k] = fac * Ep[k]; + } + else + { + ni_gain[k] = 0.0; + } + + /* smooth the noise gain between the current frame and the previous frame */ + pos = bwidth == SWB ? ni_end_band - 1 : max( max_pos_pulse, *last_max_pos_pulse ); + + if ( k <= pos ) + { + if ( k > 0 && k < ni_end_band - 1 ) + { + if ( ( env[k] > 0.5f * last_env[k] && env[k] < 2.0f * last_env[k] ) || + ( ( ( env[k] + env[k - 1] + env[k + 1] ) > 0.5f * ( last_env[k] + last_env[k - 1] + last_env[k + 1] ) ) && + ( ( env[k] + env[k - 1] + env[k + 1] ) < 2.0f * ( last_env[k] + last_env[k - 1] + last_env[k + 1] ) ) ) ) + { + if ( ni_gain[k] > last_ni_gain[k] ) + { + ni_gain[k] = 0.2f * ni_gain[k] + 0.8f * last_ni_gain[k]; + } + else + { + ni_gain[k] = 0.6f * ni_gain[k] + 0.4f * last_ni_gain[k]; + } + } + } + else if ( k == ni_end_band - 1 ) + { + if ( ( env[k] > 0.5f * last_env[k] && env[k] < 2.0f * last_env[k] ) || + ( ( env[k] + env[k - 1] ) > 0.5f * ( last_env[k] + last_env[k - 1] ) && + ( env[k] + env[k - 1] ) < 2.0f * ( last_env[k] + last_env[k - 1] ) ) ) + { + if ( ni_gain[k] > last_ni_gain[k] ) + { + ni_gain[k] = 0.2f * ni_gain[k] + 0.8f * last_ni_gain[k]; + } + else + { + ni_gain[k] = 0.6f * ni_gain[k] + 0.4f * last_ni_gain[k]; + } + } + } + } + + /* inject noise into the non-decoded coeffs */ + if ( k >= ni_end_band - p2a_bands && p2a_flags[k] == 0 && bwidth != SWB ) + { + for ( i = band_start[k]; i <= band_end[k]; i++ ) + { + if ( y2hat[i] != 0 ) + { + y2hat[i] *= 0.8f; + } + } + } + + if ( k == max_pos_pulse && k < bands - p2a_bands && satur != 1 && bwidth != SWB ) + { + j = 0; + if ( ni_gain[k] < 0.01f ) + { + fac = 0.0f; + } + else + { + fac = max( Ep[k] / ni_gain[k], 1.0f ); + } + for ( i = band_start[k]; i <= band_end[k]; i++ ) + { + if ( y2hat[i] == 0 ) + { + rand = own_random( &ni_seed ) / PCM16_TO_FLT_FAC; + y2hat[i] += ( fac - ( ( fac - 1.0f ) * j ) / band_width[k] ) * ni_gain[k] * rand; + } + + j++; + } + } + else + { + for ( i = band_start[k]; i <= band_end[k]; i++ ) + { + if ( y2hat[i] == 0 ) + { + rand = own_random( &ni_seed ) / PCM16_TO_FLT_FAC; + y2hat[i] += ni_gain[k] * rand; + } + } + } + } + + mvr2r( env, last_env, ni_end_band ); + mvr2r( ni_gain, last_ni_gain, ni_end_band ); + *last_max_pos_pulse = max_pos_pulse; + + return; +} diff --git a/lib_com/hq_bit_allocation.c b/lib_com/hq_bit_allocation.c new file mode 100644 index 0000000000000000000000000000000000000000..7556ed505a072a6abf0d2a06c10b43ba50684ca2 --- /dev/null +++ b/lib_com/hq_bit_allocation.c @@ -0,0 +1,220 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*--------------------------------------------------------------------------* + * hq_bit_allocation() + * + * Assign bits for HQ fine structure coding with PVQ + *--------------------------------------------------------------------------*/ + +void hq_bit_allocation( + const int32_t core_brate, /* i : Core bitrate */ + const int16_t length, /* i : Frame length */ + const int16_t hqswb_clas, /* i : HQ class */ + int16_t *num_bits, /* i/o: Remaining bit budget */ + const int16_t *normqlg2, /* i : Quantized norms */ + const int16_t nb_sfm, /* i : Number sub bands to be encoded */ + const int16_t *sfmsize, /* i : Sub band bandwidths */ + float *noise_level, /* o : HVQ noise level */ + int16_t *R, /* o : Bit allocation per sub band */ + int16_t *Rsubband, /* o : Fractional bit allocation (Q3) */ + int16_t *sum, /* o : Sum of allocated shape bits */ + int16_t *core_sfm, /* o : Last coded band in core */ + const int16_t num_env_bands /* i : Number sub bands to be encoded for HQ_SWB_BWE */ +) +{ + int16_t sfm_limit = nb_sfm; + int16_t i; + int16_t idx[NB_SFM]; + int16_t wnorm[NB_SFM]; + int16_t avrg_wnorm; + int16_t E_low; + int16_t E_hb_mean; + int16_t E_max; + int16_t i_max; + + + set_s( R, 0, NB_SFM ); + for ( i = 0; i < nb_sfm; i++ ) + { + idx[i] = i; + } + if ( hqswb_clas != HQ_TRANSIENT && hqswb_clas != HQ_HVQ && !( length == L_FRAME16k && core_brate <= HQ_32k ) ) + { + /* 'nf_idx' 2-bits index written later */ + *num_bits -= 2; + } + + if ( hqswb_clas == HQ_GEN_SWB || hqswb_clas == HQ_GEN_FB ) + { + if ( core_brate >= HQ_32k ) + { + *num_bits -= HQ_GENERIC_SWB_NBITS2; + } + else + { + *num_bits -= HQ_GENERIC_SWB_NBITS; + } + + if ( length == L_SPEC48k ) + { + *num_bits -= HQ_GENERIC_FB_NBITS; + } + } + + if ( ( length == L_SPEC48k ) && ( hqswb_clas != HQ_HARMONIC ) && ( hqswb_clas != HQ_HVQ ) ) + { + map_quant_weight( normqlg2, wnorm, hqswb_clas == HQ_TRANSIENT ); + } + else + { + mvs2s( normqlg2, wnorm, nb_sfm ); + } + + + if ( hqswb_clas == HQ_HARMONIC ) + { + /* classification and limit bandwidth for bit allocation */ + sfm_limit -= 2; + limit_band_noise_level_calc( wnorm, &sfm_limit, core_brate, noise_level ); + + /* Detect important band in high frequency region */ + E_low = sum_s( wnorm, SFM_G1 ); + i_max = 0; + E_max = MIN16B; + E_hb_mean = 0; + for ( i = SFM_G1; i < nb_sfm; i++ ) + { + E_hb_mean += wnorm[i]; + if ( wnorm[i] > E_max ) + { + E_max = wnorm[i]; + i_max = i; + } + } + E_hb_mean = E_hb_mean >> 4; /* Truncated division by SFM_G1 */ + if ( E_max * 15 < E_low || E_max * 0.67 < E_hb_mean || i_max < sfm_limit ) + { + i_max = 0; + } + + set_s( wnorm + sfm_limit, -20, nb_sfm - sfm_limit ); + if ( i_max > 0 ) + { + wnorm[i_max] = E_max; + } + } + + if ( hqswb_clas == HQ_HVQ ) + { + *sum = 0; + } + else if ( hqswb_clas == HQ_GEN_SWB || ( hqswb_clas == HQ_TRANSIENT && length == L_FRAME32k && core_brate <= HQ_32k ) ) + { + *sum = BitAllocF( wnorm, core_brate, *num_bits, nb_sfm, R, Rsubband, hqswb_clas, num_env_bands ); + } + else if ( length == L_FRAME16k && core_brate <= HQ_32k ) + { + if ( hqswb_clas != HQ_TRANSIENT ) + { + avrg_wnorm = wnorm[10]; + for ( i = 11; i < 18; i++ ) + { + avrg_wnorm += wnorm[i]; + } + + avrg_wnorm /= 8; + for ( i = 0; i < 4; i++ ) + { + if ( wnorm[i] < avrg_wnorm ) + { + wnorm[i] = avrg_wnorm; + } + } + + /* Estimate number of bits per band */ + *sum = BitAllocWB( wnorm, *num_bits, nb_sfm, R, Rsubband ); + } + else + { + reordvct( wnorm, nb_sfm, idx ); + bitalloc( wnorm, idx, *num_bits, nb_sfm, QBIT_MAX2, R, sfmsize, hqswb_clas ); + bitallocsum( R, nb_sfm, sum, Rsubband, *num_bits, length, sfmsize ); + } + } + else + { + reordvct( wnorm, nb_sfm, idx ); + + /* enlarge the wnorm value so that more bits can be allocated to (sfm_limit/2 ~ sfm_limit) range */ + if ( hqswb_clas == HQ_HARMONIC ) + { + for ( i = sfm_limit / 2; i < sfm_limit; i++ ) + { + wnorm[i] = wnorm[sfm_limit / 2 - 1]; + } + } + + bitalloc( wnorm, idx, *num_bits, nb_sfm, QBIT_MAX2, R, sfmsize, hqswb_clas ); + bitallocsum( R, nb_sfm, sum, Rsubband, *num_bits, length, sfmsize ); + } + + /* Find last coded core band */ + *core_sfm = nb_sfm - 1; + if ( hqswb_clas == HQ_NORMAL || hqswb_clas == HQ_HARMONIC ) + { + *core_sfm = find_last_band( R, nb_sfm ); + } + else if ( hqswb_clas == HQ_GEN_SWB || hqswb_clas == HQ_GEN_FB ) + { + *core_sfm = find_last_band( R, nb_sfm ); + if ( *core_sfm < num_env_bands ) + { + *core_sfm = num_env_bands - 1; + } + } + + *num_bits -= *sum; + + return; +} diff --git a/lib_com/hq_conf.c b/lib_com/hq_conf.c new file mode 100644 index 0000000000000000000000000000000000000000..d0f7939210c00e523e6231d7e9675e855d8a4373 --- /dev/null +++ b/lib_com/hq_conf.c @@ -0,0 +1,255 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "wmc_auto.h" + +/*--------------------------------------------------------------------------* + * hq_configure() + * + * Configuration routine for HQ mode + *--------------------------------------------------------------------------*/ + +void hq_configure( + const int16_t length, /* i : Frame length */ + const int16_t hqswb_clas, /* i : HQ SWB class */ + const int32_t core_brate, /* i : Codec bitrate */ + int16_t *num_sfm, /* o : Total number of subbands */ + int16_t *nb_sfm, /* o : Total number of coded bands */ + int16_t *start_norm, /* o : First norm to be SDE encoded */ + int16_t *num_env_bands, /* o : Number coded envelope bands */ + int16_t *numnrmibits, /* o : Number of bits in fall-back norm encoding */ + int16_t *hq_generic_offset, /* o : Freq offset for HQ GENERIC */ + int16_t *sfmsize, /* o : Subband bandwidths */ + int16_t *sfm_start, /* o : Subband start coefficients */ + int16_t *sfm_end /* o : Subband end coefficients */ +) +{ + const int16_t *p_sfmsize; + const int16_t *p_sfm_start; + const int16_t *p_sfm_end; + int16_t i, bw_ext; + + bw_ext = 0; + *start_norm = 0; + + if ( length == L_SPEC48k ) + { + if ( hqswb_clas == HQ_GEN_FB ) + { + *num_sfm = NB_SFM; + p_sfmsize = band_len_HQ; + p_sfm_start = band_start_HQ; + p_sfm_end = band_end_HQ; + + if ( core_brate >= HQ_32k ) + { + *hq_generic_offset = HQ_GENERIC_FOFFSET_32K; + /* setting start frequency of FD BWE */ + *num_env_bands = SFM_N_STA_10k; + } + else + { + *hq_generic_offset = HQ_GENERIC_FOFFSET_24K4; + *num_env_bands = SFM_N_STA_8k; + } + + *nb_sfm = *num_sfm; + } + else + { + if ( hqswb_clas == HQ_HARMONIC ) + { + *num_sfm = SFM_N_HARM_FB; + *nb_sfm = SFM_N_HARM_FB; + *num_env_bands = SFM_N_HARM_FB; + + p_sfmsize = band_len_harm; + p_sfm_start = band_start_harm; + p_sfm_end = band_end_harm; + } + else if ( hqswb_clas == HQ_HVQ ) + { + if ( core_brate < HQ_BWE_CROSSOVER_BRATE ) + { + *num_sfm = SFM_N_HARM_FB; + *nb_sfm = HVQ_THRES_SFM_24k; + *num_env_bands = *num_sfm - *nb_sfm; + *start_norm = HVQ_THRES_SFM_24k; + } + else + { + *num_sfm = SFM_N_HARM_FB; + *nb_sfm = HVQ_THRES_SFM_32k; + *num_env_bands = *num_sfm - *nb_sfm; + *start_norm = HVQ_THRES_SFM_32k; + } + + p_sfmsize = band_len_harm; + p_sfm_start = band_start_harm; + p_sfm_end = band_end_harm; + } + else + { + *num_sfm = NB_SFM; + *nb_sfm = *num_sfm; + *num_env_bands = NB_SFM; + + p_sfmsize = band_len_HQ; + p_sfm_start = band_start_HQ; + p_sfm_end = band_end_HQ; + } + } + } + else if ( length == L_SPEC32k ) + { + if ( hqswb_clas == HQ_HARMONIC ) + { + *num_sfm = SFM_N_HARM; + *nb_sfm = SFM_N_HARM; + *num_env_bands = SFM_N_HARM; + + p_sfmsize = band_len_harm; + p_sfm_start = band_start_harm; + p_sfm_end = band_end_harm; + } + else if ( hqswb_clas == HQ_HVQ ) + { + if ( core_brate < HQ_BWE_CROSSOVER_BRATE ) + { + *num_sfm = SFM_N_HARM; + *nb_sfm = HVQ_THRES_SFM_24k; + *num_env_bands = *num_sfm - *nb_sfm; + *start_norm = HVQ_THRES_SFM_24k; + } + else + { + *num_sfm = SFM_N_HARM; + *nb_sfm = HVQ_THRES_SFM_32k; + *num_env_bands = *num_sfm - *nb_sfm; + *start_norm = HVQ_THRES_SFM_32k; + } + + p_sfmsize = band_len_harm; + p_sfm_start = band_start_harm; + p_sfm_end = band_end_harm; + } + else if ( hqswb_clas == HQ_GEN_SWB ) + { + *num_sfm = SFM_N_SWB; + p_sfmsize = band_len_HQ; + p_sfm_start = band_start_HQ; + p_sfm_end = band_end_HQ; + + if ( core_brate >= HQ_32k ) + { + *hq_generic_offset = HQ_GENERIC_FOFFSET_32K; + /* setting start frequency of FD BWE */ + *num_env_bands = SFM_N_STA_10k; + } + else + { + *hq_generic_offset = HQ_GENERIC_FOFFSET_24K4; + /* setting start frequency of FD BWE */ + *num_env_bands = SFM_N_STA_8k; + } + *nb_sfm = *num_sfm; + } + else + { + /* HQ_NORMAL and HQ_TRANSIENT */ + *num_sfm = SFM_N_SWB; + *nb_sfm = *num_sfm; + *num_env_bands = SFM_N_SWB; + + p_sfmsize = band_len_HQ; + p_sfm_start = band_start_HQ; + p_sfm_end = band_end_HQ; + } + } + else if ( length == L_SPEC48k_EXT ) + { + bw_ext = 1; + p_sfmsize = band_len_HQ; + p_sfm_start = band_start_HQ; + p_sfm_end = band_end_HQ; + *num_sfm = NB_SFM; + } + else if ( length == L_SPEC16k_EXT ) + { + bw_ext = 1; + p_sfmsize = band_len_wb; + p_sfm_start = band_start_wb; + p_sfm_end = band_end_wb; + *num_sfm = SFM_N_WB; + } + else + { + *num_sfm = SFM_N_WB; + *nb_sfm = *num_sfm; + *num_env_bands = SFM_N_WB; + + p_sfmsize = band_len_wb; + p_sfm_start = band_start_wb; + p_sfm_end = band_end_wb; + } + + if ( bw_ext ) + { + for ( i = 0; i < *num_sfm; i++ ) + { + sfmsize[i] = (int16_t) ( 1.25f * p_sfmsize[i] ); + sfm_start[i] = (int16_t) ( 1.25f * p_sfm_start[i] ); + sfm_end[i] = (int16_t) ( 1.25f * p_sfm_end[i] ); + } + *nb_sfm = *num_sfm; + *num_env_bands = *num_sfm; + } + else + { + mvs2s( p_sfmsize, sfmsize, *num_sfm ); + mvs2s( p_sfm_start, sfm_start, *num_sfm ); + mvs2s( p_sfm_end, sfm_end, *num_sfm ); + } + + *numnrmibits = ( *num_env_bands - 1 ) * NORMI_BITS; + + return; +} diff --git a/lib_com/hq_tools.c b/lib_com/hq_tools.c new file mode 100644 index 0000000000000000000000000000000000000000..df59ac1721cb59ba94585ca522ff05c842e02724 --- /dev/null +++ b/lib_com/hq_tools.c @@ -0,0 +1,1824 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*--------------------------------------------------------------------------* + * Local function prototypes + *--------------------------------------------------------------------------*/ + +static void overlap_hq_bwe( const float *hq_swb_overlap_buf, float *coeff_out1, const int16_t n_swb_overlap_offset, const int16_t n_swb_overlap, const int16_t *R, const int16_t num_env_bands, const int16_t num_sfm, const int16_t *sfm_end ); + +/*--------------------------------------------------------------------------* + * hq_swb_harmonic_calc_norm_envelop() + * + * Calculate normalization envelop + *--------------------------------------------------------------------------*/ + +static void hq_swb_harmonic_calc_norm_envelop( + float *SWB_signal, /* i : input signal */ + float *envelope, /* o : output envelope */ + const int16_t L_swb_norm, /* i : length of normaliztion */ + const int16_t SWB_flength /* i : length of input signal */ +) +{ + int16_t i, lookback, env_index; + int16_t n_freq, n_lag_now, n_lag; + + lookback = L_swb_norm / 2; + env_index = 0; + for ( n_freq = 0; n_freq < lookback; n_freq++ ) + { + n_lag_now = lookback + n_freq; + + /* Apply MA filter */ + envelope[env_index] = EPSILON; + for ( n_lag = 0; n_lag < n_lag_now; n_lag++ ) + { + envelope[env_index] += (float) fabs( SWB_signal[n_lag] ); + } + env_index++; + } + + n_lag_now = L_swb_norm; + + for ( n_freq = 0; n_freq < SWB_flength - L_swb_norm; n_freq++ ) + { + /* Apply MA filter */ + envelope[env_index] = EPSILON; + for ( n_lag = 0; n_lag < n_lag_now; n_lag++ ) + { + envelope[env_index] += (float) fabs( SWB_signal[n_freq + n_lag] ); + } + env_index++; + } + + for ( n_freq = SWB_flength - L_swb_norm, i = 0; n_freq < SWB_flength - lookback; n_freq++, i++ ) + { + n_lag_now = L_swb_norm - i; + + /* Apply MA filter */ + envelope[env_index] = EPSILON; + for ( n_lag = 0; n_lag < n_lag_now; n_lag++ ) + { + envelope[env_index] += (float) fabs( SWB_signal[n_freq + n_lag] ); + } + env_index++; + } + + return; +} + +/*--------------------------------------------------------------------------* + * noise_level_calc() + * + * Calculate noise level and limited band + *--------------------------------------------------------------------------*/ + +void limit_band_noise_level_calc( + const int16_t *wnorm, /* i : reordered norm of sub-vectors */ + int16_t *limit, /* o : highest band of bit allocation */ + const int32_t core_brate, /* i : core bitrate */ + float *noise_level /* o : noise level */ +) +{ + float ener_limit, ener_sum, fact; + int16_t i; + int16_t nb_sfm; + + nb_sfm = *limit; + ener_limit = 1e-5f; + *noise_level = 0.0f; + for ( i = 0; i < 10; i++ ) + { + ener_limit += wnorm[i]; + *noise_level += (float) abs( wnorm[i + 1] - wnorm[i] ); + } + ener_sum = ener_limit; + + for ( i = 10; i < ( nb_sfm - 1 ); i++ ) + { + ener_sum += wnorm[i]; + *noise_level += (float) abs( wnorm[i + 1] - wnorm[i] ); + } + ener_sum += wnorm[nb_sfm - 1]; + + if ( core_brate < HQ_BWE_CROSSOVER_BRATE ) + { + fact = 0.885f; + } + else + { + fact = 0.942f; + } + + i = 9; + while ( ener_limit < ener_sum * fact && i + 1 < nb_sfm ) + { + ener_limit += wnorm[++i]; + } + *limit = i; + + /* calculate noise level for spectrum filling */ + *noise_level /= ener_sum; + if ( *noise_level < 0 ) + { + *noise_level = 0.25f; + } + + *noise_level = 0.25f - *noise_level; + + if ( *noise_level < 0.0f ) + { + *noise_level = 0.0f; + } + + return; +} + +/*--------------------------------------------------------------------------* + * build_nf_codebook() + * + * Build noise-fill codebook for HQ mode + *--------------------------------------------------------------------------*/ + +/*! r: Number of coefficients in nf codebook */ +int16_t build_nf_codebook( + const int16_t flag_32K_env_ho, /* i : Envelope attenuation hangover flag */ + const float *coeff, /* i : Coded spectral coefficients */ + const int16_t *sfm_start, /* i : Subband start indices */ + const int16_t *sfmsize, /* i : Subband widths */ + const int16_t *sfm_end, /* i : Subband end indices */ + const int16_t last_sfm, /* i : Last coded band */ + const int16_t *R, /* i : Per-band bit allocation */ + float *CodeBook, /* o : Noise-fill codebook */ + float *CodeBook_mod /* o : Densified noise-fill codebook */ +) +{ + int16_t sfm_base; + int16_t sfm; + int16_t E_cb_vec; + int16_t i, j; + int16_t cb_size; + + /* Build codebook */ + cb_size = 0; + for ( sfm = 0; sfm <= last_sfm; sfm++ ) + { + if ( R[sfm] != 0 ) + { + if ( flag_32K_env_ho ) + { + /* Build compressed (+/- 1) noise-fill codebook */ + sfm_base = sfm_start[sfm]; + for ( i = 0; i < sfmsize[sfm] / 8; i++ ) + { + E_cb_vec = 0; + for ( j = sfm_base + i * 8; j < sfm_base + ( i + 1 ) * 8; j++ ) + { + if ( coeff[j] > 0.0f ) + { + CodeBook_mod[cb_size] = 1.0f; + E_cb_vec++; + } + else if ( coeff[j] < 0.0f ) + { + CodeBook_mod[cb_size] = -1.0f; + E_cb_vec++; + } + else + { + CodeBook_mod[cb_size] = 0.0f; + } + cb_size++; + } + + if ( E_cb_vec < 2 ) + { + cb_size -= 8; + } + } + } + else + { + for ( j = sfm_start[sfm]; j < sfm_end[sfm]; j++ ) + { + CodeBook[cb_size] = coeff[j]; + cb_size++; + } + } + } + } + + if ( flag_32K_env_ho ) + { + for ( j = 0; j < cb_size; j++ ) + { + if ( CodeBook_mod[j] != 0.0f ) + { + /* Densify codebook */ + CodeBook[j] = sign( CodeBook_mod[j] ) * ( CodeBook_mod[j] * CodeBook_mod[j] + CodeBook_mod[cb_size - j - 1] * CodeBook_mod[cb_size - j - 1] ); + } + else + { + CodeBook[j] = CodeBook_mod[cb_size - j - 1]; + } + } + } + + return cb_size; +} + +/*--------------------------------------------------------------------------* + * find_last_band() + * + * Find the last band which has bits allocated + *--------------------------------------------------------------------------*/ + +/*! r: index of last band */ +int16_t find_last_band( + const int16_t *bitalloc, /* i : bit allocation */ + const int16_t nb_sfm /* i : number of possibly coded bands */ +) +{ + int16_t sfm, core_sfm; + + core_sfm = nb_sfm - 1; + + for ( sfm = nb_sfm - 1; sfm >= 0; sfm-- ) + { + if ( bitalloc[sfm] != 0 ) + { + core_sfm = sfm; + break; + } + } + + return core_sfm; +} + +/*--------------------------------------------------------------------------* + * apply_noisefill_HQ() + * + * Inject noise in non-coded bands + *--------------------------------------------------------------------------*/ + +void apply_noisefill_HQ( + const int16_t *R, /* i : bit allocation */ + const int16_t length, /* i : input frame length */ + const int16_t flag_32K_env_ho, /* i : envelope stability hangover flag */ + const int32_t core_brate, /* i : core bitrate */ + const int16_t last_sfm, /* i : last coded subband */ + const float *CodeBook, /* i : Noise-fill codebook */ + const float *CodeBook_mod, /* i : Densified noise-fill codebook */ + const int16_t cb_size, /* i : Codebook length */ + const int16_t *sfm_start, /* i : Subband start coefficient */ + const int16_t *sfm_end, /* i : Subband end coefficient */ + const int16_t *sfmsize, /* i : Subband band width */ + float *coeff /* i/o: coded/noisefilled spectrum */ +) +{ + int16_t sfm; + int16_t cb_pos; + float E_cb_vec; + float E_corr; + float cb_buff[64]; + int16_t i, j; + + if ( length >= L_FRAME32k || core_brate != HQ_32k ) + { + /* Read from codebook */ + cb_pos = 0; + + for ( sfm = 0; sfm <= last_sfm; sfm++ ) + { + if ( R[sfm] == 0 ) + { + if ( flag_32K_env_ho ) + { + E_cb_vec = 0.0f; + if ( sfm < 20 ) + { + for ( i = 0; i < sfmsize[sfm]; i++ ) + { + cb_buff[i] = CodeBook_mod[cb_pos]; + E_cb_vec += cb_buff[i] * cb_buff[i]; + cb_pos++; + if ( cb_pos >= cb_size ) + { + cb_pos = 0; + } + } + } + else + { + for ( i = 0; i < sfmsize[sfm]; i++ ) + { + cb_buff[i] = CodeBook[cb_pos]; + E_cb_vec += cb_buff[i] * cb_buff[i]; + cb_pos++; + if ( cb_pos >= cb_size ) + { + cb_pos = 0; + } + } + } + + E_corr = E_cb_vec / ( (float) sfmsize[sfm] ); + E_corr = 1.0f / (float) sqrt( E_corr ); + + for ( j = sfm_start[sfm]; j < sfm_end[sfm]; j++ ) + { + coeff[j] = cb_buff[j - sfm_start[sfm]] * E_corr; + } + } + else + { + for ( j = sfm_start[sfm]; j < sfm_end[sfm]; j++ ) + { + coeff[j] = CodeBook[cb_pos]; + cb_pos++; + cb_pos = ( cb_pos >= cb_size ) ? 0 : cb_pos; + } + } + } + } + } + + return; +} + + +/*--------------------------------------------------------------------------* + * harm_bwe_fine() + * + * Prepare harmonic BWE fine structure + *--------------------------------------------------------------------------*/ + +void harm_bwe_fine( + const int16_t *R, /* i : bit allocation */ + const int16_t last_sfm, /* i : last coded subband */ + const int16_t high_sfm, /* i : higher transition band to BWE */ + const int16_t num_sfm, /* i : total number of bands */ + const int16_t *norm, /* i : quantization indices for norms */ + const int16_t *sfm_start, /* i : Subband start coefficient */ + const int16_t *sfm_end, /* i : Subband end coefficient */ + int16_t *prev_L_swb_norm, /* i/o: last normalize length */ + float *coeff, /* i/o: coded/noisefilled normalized spectrum */ + float *coeff_out, /* o : coded/noisefilled spectrum */ + float *coeff_fine /* o : BWE fine structure */ +) +{ + int16_t sfm; + int16_t i; + float normq; + float SWB_signal[L_HARMONIC_EXC]; + float envelope[L_HARMONIC_EXC]; + float *src, *dst, *end; + + int16_t norm_width = 64; + + /* shape the spectrum */ + for ( sfm = 0; sfm <= last_sfm; sfm++ ) + { + if ( R[sfm] != 0 ) + { + normq = dicn[norm[sfm]]; + for ( i = sfm_start[sfm]; i < sfm_end[sfm]; i++ ) + { + coeff_out[i] = coeff[i] * normq; + } + } + else + { + for ( i = sfm_start[sfm]; i < sfm_end[sfm]; i++ ) + { + coeff_out[i] = 0.0f; + } + } + } + + /* excitation replication */ + mvr2r( coeff_out, SWB_signal, L_HARMONIC_EXC ); + calc_normal_length( HQ_CORE, coeff_out, HQ_HARMONIC, -1, &norm_width, prev_L_swb_norm ); + hq_swb_harmonic_calc_norm_envelop( SWB_signal, envelope, norm_width, L_HARMONIC_EXC ); + + /* Normalize with envelope */ + for ( i = 0; i < L_HARMONIC_EXC; i++ ) + { + SWB_signal[i] = SWB_signal[i] / envelope[i]; + } + + dst = coeff_fine + sfm_end[last_sfm]; + end = coeff_fine + sfm_end[num_sfm - 1]; + + if ( ( sfm_end[last_sfm] - sfm_end[high_sfm] ) <= L_HARMONIC_EXC - START_EXC ) + { + src = SWB_signal + START_EXC + ( sfm_end[last_sfm] - sfm_end[high_sfm] ); + } + else + { + src = SWB_signal + L_HARMONIC_EXC - 1; + } + + while ( dst < end ) + { + while ( dst < end && src < &SWB_signal[L_HARMONIC_EXC] ) + { + *dst++ = *src++; + } + src--; + + while ( dst < end && src >= &SWB_signal[START_EXC] ) + { + *dst++ = *src--; + } + src++; + } + + return; +} + +/*--------------------------------------------------------------------------* + * hvq_bwe_fine() + * + * Prepare HVQ BWE fine structure + *--------------------------------------------------------------------------*/ + +void hvq_bwe_fine( + const int16_t last_sfm, /* i : last coded subband */ + const int16_t num_sfm, /* i : total number of bands */ + const int16_t *sfm_end, /* i : Subband end coefficient */ + const int16_t *peak_idx, /* i : Peak index */ + const int16_t Npeaks, /* i : Number of peaks */ + int16_t *peak_pos, /* i/o: Peak positions */ + int16_t *prev_L_swb_norm, /* i/o: last normalize length */ + float *coeff, /* i/o: coded/noisefilled normalized spectrum */ + int16_t *bwe_peaks, /* o : Positions of peaks in BWE */ + float *coeff_fine /* o : HVQ BWE fine structure */ +) +{ + int16_t i, j; + float SWB_signal[L_HARMONIC_EXC]; + float envelope[L_HARMONIC_EXC]; + float *src, *dst, *end; + int16_t *peak_dst, *peak_src; + int16_t norm_width = 64; + + /* excitation replication */ + mvr2r( coeff, SWB_signal, L_HARMONIC_EXC ); + calc_normal_length( HQ_CORE, coeff, HQ_HVQ, -1, &norm_width, prev_L_swb_norm ); + + hq_swb_harmonic_calc_norm_envelop( SWB_signal, envelope, norm_width, L_HARMONIC_EXC ); + + /* Normalize with envelope */ + for ( i = 0; i < L_HARMONIC_EXC; i++ ) + { + SWB_signal[i] = SWB_signal[i] / envelope[i]; + } + + dst = coeff_fine; + end = coeff_fine + sfm_end[num_sfm - 1] - sfm_end[last_sfm]; + + src = SWB_signal + START_EXC; + peak_src = peak_pos + START_EXC; + + for ( i = 0; i < Npeaks; i++ ) + { + if ( peak_idx[i] < L_HARMONIC_EXC ) + { + peak_pos[peak_idx[i]] = 1; + } + } + + i = L_HARMONIC_EXC - 1; + while ( i-- > 0 ) + { + if ( peak_pos[i] == 1 ) + { + break; + } + } + + if ( i < 180 ) + { + i = 180; + } + + for ( j = L_HARMONIC_EXC - 1; j > i + 1; j-- ) + { + SWB_signal[j] = 0.0f; + } + + peak_dst = bwe_peaks + sfm_end[last_sfm]; + while ( dst < end ) + { + while ( dst < end && src < &SWB_signal[L_HARMONIC_EXC] ) + { + *dst++ = *src++; + *peak_dst++ = *peak_src++; + } + peak_src--; + src--; + + while ( dst < end && src >= &SWB_signal[START_EXC] ) + { + *dst++ = *src--; + *peak_dst++ = *peak_src--; + } + peak_src++; + src++; + } + + return; +} + +/*--------------------------------------------------------------------------* + * hq_fold_bwe() + * + * HQ mode folding BWE + *--------------------------------------------------------------------------*/ + +void hq_fold_bwe( + const int16_t last_sfm, /* i : last coded subband */ + const int16_t *sfm_end, /* i : Subband end coefficient */ + const int16_t num_sfm, /* i : Number of subbands */ + float *coeff /* i/o: coded/noisefilled normalized spectrum */ +) +{ + int16_t low_coeff; + int16_t first_coeff; + float *src, *dst, *end; + + /* Find replication range for BWE */ + low_coeff = sfm_end[last_sfm] >> 1; + src = coeff + sfm_end[last_sfm] - 1; + + first_coeff = sfm_end[last_sfm]; + dst = coeff + sfm_end[last_sfm]; + end = coeff + sfm_end[num_sfm - 1]; + + /* Generate BWE with spectral folding */ + while ( dst < end ) + { + while ( dst < end && src >= &coeff[low_coeff] ) + { + *dst++ = *src--; + } + + src++; + + while ( dst < end && src < &coeff[first_coeff] ) + { + *dst++ = *src++; + } + } + + return; +} + +/*--------------------------------------------------------------------------* + * apply_nf_gain() + * + * Apply noise fill gain + *--------------------------------------------------------------------------*/ + +void apply_nf_gain( + const int16_t nf_idx, /* i : noise fill gain index */ + const int16_t last_sfm, /* i : last coded subband */ + const int16_t *R, /* i : bit allocation */ + const int16_t *sfm_start, /* i : Subband start coefficient */ + const int16_t *sfm_end, /* i : Subband end coefficient */ + float *coeff /* i/o: coded/noisefilled normalized spectrum */ +) +{ + int16_t sfm; + int16_t j; + float nf_scale; + + nf_scale = 1.0f / ( 1 << nf_idx ); + for ( sfm = 0; sfm <= last_sfm; sfm++ ) + { + if ( R[sfm] == 0 ) + { + for ( j = sfm_start[sfm]; j < sfm_end[sfm]; j++ ) + { + /* Scale NoiseFill */ + coeff[j] = coeff[j] * nf_scale; + } + } + } + + return; +} + +/*--------------------------------------------------------------------------* + * hq_generic_fine() + * + * Prepare HQ SWB BWE fine structure + *--------------------------------------------------------------------------*/ + +void hq_generic_fine( + float *coeff, /* i : coded/noisefilled normalized spectrum */ + const int16_t last_sfm, /* i : Last coded band */ + const int16_t *sfm_start, /* i : Subband start coefficient */ + const int16_t *sfm_end, /* i : Subband end coefficient */ + int16_t *bwe_seed, /* i/o: random seed for generating BWE input */ + float *coeff_out1 /* o : HQ SWB BWE input */ +) +{ + int16_t sfm; + int16_t i; + float multi; + + multi = 1.0f; + for ( sfm = 0; sfm <= last_sfm; sfm++ ) + { + for ( i = sfm_start[sfm]; i < sfm_end[sfm]; i++ ) + { + if ( coeff[i] == 0.f ) + { + coeff_out1[i] = (float) multi * ( own_random( bwe_seed ) > 0 ? 1.0f : -1.0f ) * 0.5f; + } + else + { + coeff_out1[i] = coeff[i]; + } + } + } + + return; +} + +/*--------------------------------------------------------------------------* + * harm_bwe() + * + * HQ Harmonic BWE + *--------------------------------------------------------------------------*/ + +void harm_bwe( + const float *coeff_fine, /* i : fine structure for BWE */ + const float *coeff, /* i : coded/noisefilled normalized spectrum */ + const int16_t num_sfm, /* i : Number of subbands */ + const int16_t *sfm_start, /* i : Subband start coefficient */ + const int16_t *sfm_end, /* i : Subband end coefficient */ + const int16_t last_sfm, /* i : last coded subband */ + const int16_t high_sfm, /* i : higher transition band to BWE */ + const int16_t *R, /* i : bit allocation */ + const int16_t prev_hq_mode, /* i : previous hq mode */ + int16_t *norm, /* i/o: quantization indices for norms */ + float *noise_level, /* i/o: noise levels for harmonic modes */ + float *prev_noise_level, /* i/o: noise factor in previous frame */ + int16_t *bwe_seed, /* i/o: random seed for generating BWE input */ + float *coeff_out, /* o : coded/noisefilled spectrum */ + const int16_t element_mode /* i : element mode */ +) +{ + int16_t i, j; + int16_t sfm; + float normq; + float norm_adj; + float E_L; + + float alfa = 0.5f; + float alpha, beta; + int16_t idx; + float fac; + float *src, *dst; + + for ( sfm = 0; sfm <= last_sfm; sfm++ ) + { + if ( R[sfm] == 0 ) + { + normq = dicn[norm[sfm]]; + for ( i = sfm_start[sfm]; i < sfm_end[sfm]; i++ ) + { + coeff_out[i] = coeff[i] * normq; + } + } + } + noise_level[1] = noise_level[0]; + + /* shaping the BWE spectrum further by envelopes and noise factors */ + noise_level[0] = 0.9f * prev_noise_level[0] + 0.1f * noise_level[0]; + noise_level[1] = 0.9f * prev_noise_level[1] + 0.1f * noise_level[1]; + + if ( prev_hq_mode == HQ_NORMAL || prev_hq_mode == HQ_GEN_SWB ) + { + if ( noise_level[0] < 0.25f ) + { + noise_level[0] *= 4.0f; + } + + if ( noise_level[1] < 0.25f ) + { + noise_level[1] *= 4.0f; + } + } + + E_L = EPSILON; + for ( i = last_sfm + 1; i < num_sfm; i++ ) + { + E_L = EPSILON; + for ( j = sfm_start[i]; j < sfm_end[i]; j++ ) + { + E_L += coeff_fine[j] * coeff_fine[j]; + } + E_L = (float) sqrt( ( sfm_end[i] - sfm_start[i] ) / E_L ); + + normq = dicn[norm[i]]; + norm_adj = normq * E_L; + alfa = ( i > 27 ) ? noise_level[1] : noise_level[0]; + beta = (float) sqrt( 1.0f - alfa ); + if ( element_mode > EVS_MONO ) + { + alpha = (float) sqrt( alfa ); + } + else + { + alpha = (float) sqrt( alfa ) * 0.5f; + } + + for ( sfm = sfm_start[i]; sfm < sfm_end[i]; sfm++ ) + { + coeff_out[sfm] = ( beta * coeff_fine[sfm] * norm_adj + alpha * own_random( bwe_seed ) / PCM16_TO_FLT_FAC * normq ); + } + } + + prev_noise_level[0] = noise_level[0]; + prev_noise_level[1] = noise_level[1]; + idx = 16; + src = &coeff_out[sfm_end[high_sfm] + L_HARMONIC_EXC - START_EXC]; + dst = src - 1; + + for ( i = 0; i < idx; i++ ) + { + fac = i / ( 2.0f * idx ); + *src++ *= 0.5f + fac; + *dst-- *= 0.5f + fac; + } + if ( num_sfm == 33 ) + { + set_f( &coeff_out[800], 0, 160 ); + } + return; +} + +/*--------------------------------------------------------------------------* + * HVQ_bwe() + * + * HQ HVQ BWE + *--------------------------------------------------------------------------*/ + +void hvq_bwe( + const float *coeff, /* i : coded/noisefilled spectrum */ + const float *coeff_fine, /* i : BWE fine structure */ + const int16_t *sfm_start, /* i : Subband start coefficient */ + const int16_t *sfm_end, /* i : Subband end coefficient */ + const int16_t *sfm_len, /* i : Subband length */ + const int16_t last_sfm, /* i : last coded subband */ + const int16_t prev_hq_mode, /* i : previous hq mode */ + const int16_t *bwe_peaks, /* i : HVQ bwe peaks */ + const int16_t bin_th, /* i : HVQ transition bin */ + const int16_t num_sfm, /* i : Number of bands */ + const int32_t core_brate, /* i : Core bitrate */ + const int16_t *R, /* i : Bit allocation */ + int16_t *norm, /* i/o: quantization indices for norms */ + float *noise_level, /* i/o: noise levels for harmonic modes */ + float *prev_noise_level, /* i/o: noise factor in previous frame */ + int16_t *bwe_seed, /* i/o: random seed for generating BWE input */ + float *coeff_out /* o : coded/noisefilled spectrum */ +) +{ + int16_t i, j; + int16_t N; + float normq; + float E_L; + + int16_t bwe_noise_th = 0; + int16_t peak_band, low, high, sel_norm; + int16_t norm_ind; + float tmp_norm = 0; + int16_t idx; + float fac; + float *src, *dst; + int16_t istart, iend; + int16_t offset = sfm_end[last_sfm]; + + mvr2r( coeff, coeff_out, L_FRAME48k ); + + bwe_noise_th = bin_th + ( sfm_end[num_sfm - 1] - bin_th ) / HVQ_BWE_NOISE_BANDS; + logqnorm( &coeff_out[sfm_start[last_sfm]], &norm[last_sfm], 40, sfm_len[last_sfm], thren_HQ ); + + /* shaping the BWE spectrum further by envelopes and noise factors */ + noise_level[0] = 0.9f * prev_noise_level[0] + 0.1f * noise_level[0]; + noise_level[1] = 0.9f * prev_noise_level[1] + 0.1f * noise_level[1]; + + if ( prev_hq_mode == HQ_NORMAL || prev_hq_mode == HQ_GEN_SWB ) + { + if ( noise_level[0] < 0.25f ) + { + noise_level[0] *= 4.0f; + } + + if ( noise_level[1] < 0.25f ) + { + noise_level[1] *= 4.0f; + } + } + + norm_ind = last_sfm + 1; + + if ( core_brate < HQ_BWE_CROSSOVER_BRATE ) + { + peak_band = 0; + E_L = EPSILON; + for ( i = sfm_start[norm_ind]; i < sfm_end[norm_ind + 1]; i++ ) + { + if ( bwe_peaks[i] ) + { + peak_band = 1; + } + E_L += coeff_fine[i - offset] * coeff_fine[i - offset]; + } + E_L = (float) sqrt( ( sfm_end[norm_ind + 1] - sfm_start[norm_ind] ) / E_L ); + + normq = 0.1f * dicn[norm[norm_ind - 1]] + 0.8f * dicn[norm[norm_ind]] + 0.1f * dicn[norm[norm_ind + 1]]; + tmp_norm = 0.1f * dicn[norm[norm_ind]] + 0.8f * dicn[norm[norm_ind + 1]] + 0.1f * dicn[norm[norm_ind + 2]]; + + istart = sfm_start[norm_ind]; + iend = istart + sfm_len[norm_ind] / 2; + for ( i = istart; i < iend; i++ ) + { + coeff_out[i] = ( ( 1.0f - noise_level[i / bwe_noise_th] ) * coeff_fine[i - offset] * E_L + noise_level[i / bwe_noise_th] * own_random( bwe_seed ) / PCM16_TO_FLT_FAC ) * normq; + } + + j = 0; + N = sfm_len[norm_ind] / 2 + sfm_len[norm_ind + 1] / 2 - 1; + istart = iend; + iend = sfm_start[norm_ind + 1] + sfm_len[norm_ind + 1] / 2; + for ( i = istart; i < iend; i++ ) + { + coeff_out[i] = ( (float) ( N - j ) / N * normq + (float) j / N * tmp_norm ) * ( ( 1.0f - noise_level[i / bwe_noise_th] ) * coeff_fine[i - offset] * E_L + noise_level[i / bwe_noise_th] * own_random( bwe_seed ) / PCM16_TO_FLT_FAC ); + j++; + } + + istart = iend; + iend = sfm_end[norm_ind + 1]; + for ( i = istart; i < iend; i++ ) + { + coeff_out[i] = ( ( 1.0f - noise_level[i / bwe_noise_th] ) * coeff_fine[i - offset] * E_L + noise_level[i / bwe_noise_th] * own_random( bwe_seed ) / PCM16_TO_FLT_FAC ) * tmp_norm; + } + + norm_ind += 2; + } + + for ( ; norm_ind < num_sfm; norm_ind++ ) + { + if ( R[norm_ind] == 0 ) + { + peak_band = 0; + E_L = EPSILON; + + for ( i = sfm_start[norm_ind]; i < sfm_end[norm_ind]; i++ ) + { + if ( bwe_peaks[i] ) + { + peak_band = 1; + break; + } + } + + istart = sfm_start[norm_ind]; + iend = sfm_end[norm_ind]; + + if ( peak_band == 1 && norm_ind > last_sfm + 1 && norm_ind < num_sfm - 1 ) + { + istart -= sfm_len[norm_ind - 1] / 2; + iend += sfm_len[norm_ind + 1] / 2; + } + + for ( i = istart; i < iend; i++ ) + { + E_L += coeff_fine[i - offset] * coeff_fine[i - offset]; + } + E_L = (float) sqrt( ( iend - istart ) / E_L ); + + if ( peak_band ) + { + if ( norm_ind + 1 > num_sfm - 1 ) + { + normq = 0.15f * dicn[norm[norm_ind - 1]] + 0.85f * dicn[norm[norm_ind]]; + } + else + { + normq = 0.1f * dicn[norm[norm_ind - 1]] + 0.8f * dicn[norm[norm_ind]] + 0.1f * dicn[norm[norm_ind + 1]]; + } + } + else + { + low = norm_ind; + high = min( norm_ind + 1, num_sfm - 1 ); + sel_norm = norm[norm_ind - 1]; + for ( j = low; j <= high; j++ ) + { + if ( norm[j] > sel_norm ) + { + sel_norm = norm[j]; + } + } + normq = dicn[sel_norm]; + } + + for ( i = sfm_start[norm_ind]; i < sfm_end[norm_ind]; i++ ) + { + coeff_out[i] = ( ( 1.0f - noise_level[i / bwe_noise_th] ) * coeff_fine[i - offset] * E_L + noise_level[i / bwe_noise_th] * own_random( bwe_seed ) / PCM16_TO_FLT_FAC ) * normq; + } + } + else /* R[norm_ind] > 0 */ + { + for ( i = sfm_start[norm_ind]; i < sfm_end[norm_ind]; i++ ) + { + coeff_out[i] = coeff[i]; /* Scaling already applied */ + } + } + } + + prev_noise_level[0] = noise_level[0]; + prev_noise_level[1] = noise_level[1]; + idx = 16; + src = &coeff_out[sfm_end[last_sfm] + L_HARMONIC_EXC - START_EXC]; + dst = src - 1; + + for ( i = 0; i < idx; i++ ) + { + fac = i / ( 2.0f * idx ); + *src++ *= 0.5f + fac; + *dst-- *= 0.5f + fac; + } + + return; +} + + +/*-------------------------------------------------------------------* + * hvq_concat_bands() + * + * Compute the band limits for concatenated bands for PVQ target signal in HVQ + *--------------------------------------------------------------------------*/ + +void hvq_concat_bands( + const int16_t pvq_bands, /* i : Number of bands in concatenated PVQ target */ + const int16_t *sel_bnds, /* i : Array of selected high bands */ + const int16_t n_sel_bnds, /* i : Number of selected high bands */ + int16_t *hvq_band_start, /* o : Band start indices */ + int16_t *hvq_band_width, /* o : Band widths */ + int16_t *hvq_band_end /* o : Band end indices */ +) +{ + int16_t k; + int16_t s; + + s = 0; + + for ( k = 0; k < pvq_bands; k++ ) + { + + if ( k >= pvq_bands - n_sel_bnds ) + { + hvq_band_start[k] = hvq_band_end[k - 1]; + hvq_band_width[k] = band_len_harm[sel_bnds[s]]; + hvq_band_end[k] = hvq_band_end[k - 1] + band_len_harm[sel_bnds[s]]; + s++; + } + else + { + hvq_band_start[k] = k * HVQ_PVQ_COEFS; + hvq_band_width[k] = HVQ_PVQ_COEFS; + hvq_band_end[k] = ( k + 1 ) * HVQ_PVQ_COEFS; + } + } + + return; +} + + +/*--------------------------------------------------------------------------* + * map_hq_generic_fenv_norm() + * + * mapping high frequency envelope to high band norm + *--------------------------------------------------------------------------*/ + +void map_hq_generic_fenv_norm( + const int16_t hqswb_clas, /* i : signal classification flag */ + const float *hq_generic_fenv, /* i : HQ GENERIC envelope */ + int16_t *ynrm, /* o : high band norm indices */ + int16_t *normqlg2, /* o : high band norm values */ + const int16_t num_env_bands, /* i : Number coded envelope bands */ + const int16_t nb_sfm, /* i : Number of envelope bands */ + const int16_t hq_generic_offset /* i : Freq offset for HQ GENERIC */ +) +{ + float env_fl[17]; + int16_t i, idx; + + set_f( env_fl, 0, 17 ); + if ( hq_generic_offset == 144 ) + { + env_fl[0] = hq_generic_fenv[1]; + env_fl[1] = hq_generic_fenv[2] * 0.6640625f + hq_generic_fenv[3] * 0.3359375f; + env_fl[2] = hq_generic_fenv[3] * 0.6640625f + hq_generic_fenv[4] * 0.3359375f; + env_fl[3] = hq_generic_fenv[4] * 0.3359375f + hq_generic_fenv[5] * 0.6640625f; + env_fl[4] = hq_generic_fenv[5] * 0.3359375f + hq_generic_fenv[6] * 0.6640625f; + env_fl[5] = hq_generic_fenv[7]; + env_fl[6] = hq_generic_fenv[8] * 0.75f + hq_generic_fenv[9] * 0.25f; + env_fl[7] = hq_generic_fenv[9] * 0.75f + hq_generic_fenv[10] * 0.25f; + env_fl[8] = hq_generic_fenv[10] * 0.25f + hq_generic_fenv[11] * 0.75f; + } + else + { + env_fl[0] = hq_generic_fenv[0] * 0.3359375f + hq_generic_fenv[1] * 0.6640625f; + env_fl[1] = hq_generic_fenv[1] * 0.3359375f + hq_generic_fenv[2] * 0.6640625f; + env_fl[2] = hq_generic_fenv[3]; + env_fl[3] = hq_generic_fenv[4] * 0.6640625f + hq_generic_fenv[5] * 0.3359375f; + env_fl[4] = hq_generic_fenv[5] * 0.6640625f + hq_generic_fenv[6] * 0.3359375f; + env_fl[5] = hq_generic_fenv[6] * 0.3359375f + hq_generic_fenv[7] * 0.6640625f; + env_fl[6] = hq_generic_fenv[7] * 0.3359375f + hq_generic_fenv[8] * 0.6640625f; + env_fl[7] = hq_generic_fenv[8] * 0.3359375f + hq_generic_fenv[9] * 0.6640625f; + env_fl[8] = hq_generic_fenv[9] * 0.3359375f + hq_generic_fenv[10] * 0.6640625f; + env_fl[9] = hq_generic_fenv[10] * 0.25f + hq_generic_fenv[11] * 0.75f; + env_fl[10] = hq_generic_fenv[12]; + env_fl[11] = hq_generic_fenv[13]; + } + + if ( hqswb_clas == HQ_GEN_FB ) + { + if ( hq_generic_offset == 144 ) + { + env_fl[9] = hq_generic_fenv[12]; + env_fl[10] = hq_generic_fenv[12] * 0.25f + hq_generic_fenv[13] * 0.75f; + env_fl[11] = hq_generic_fenv[13] * 0.5f + hq_generic_fenv[14] * 0.5f; + env_fl[12] = hq_generic_fenv[14]; + env_fl[13] = hq_generic_fenv[14]; + } + else + { + env_fl[12] = hq_generic_fenv[14]; + env_fl[13] = hq_generic_fenv[14] * 0.25f + hq_generic_fenv[15] * 0.75f; + env_fl[14] = hq_generic_fenv[15] * 0.5f + hq_generic_fenv[16] * 0.5f; + env_fl[15] = hq_generic_fenv[16]; + env_fl[16] = hq_generic_fenv[16]; + } + } + + logqnorm_2( env_fl, 40, num_env_bands, nb_sfm, ynrm + num_env_bands, normqlg2 + num_env_bands, thren_HQ ); + + for ( i = num_env_bands; i < nb_sfm; ++i ) + { + idx = min( ynrm[i] + 10, 39 ); + normqlg2[i] = dicnlg2[idx]; + } + + return; +} + + +/*-------------------------------------------------------------------* + * update_rsubband() + * + * Update subband bit allocation + *--------------------------------------------------------------------------*/ + +static void update_rsubband( + const int16_t nb_sfm, /* i : Number of sub-bands */ + int16_t *Rsubband, /* o : Sub-bands bit allocation */ + int16_t b_add_bits_denv /* i/o: Bits to redistribute */ +) +{ + int16_t i; + + /* updating bit allocation */ + while ( b_add_bits_denv > 0 ) + { + i = nb_sfm - 1; + while ( b_add_bits_denv > 0 && i >= 0 ) + { + if ( Rsubband[i] > 24 ) + { + Rsubband[i] -= 8; + b_add_bits_denv--; + } + i--; + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * get_nor_delta_hf() + * + * + *--------------------------------------------------------------------------*/ + +/*! r: Number of bits consumed for the delta coding */ +int16_t get_nor_delta_hf( + Decoder_State *st, /* i/o: Decoder state */ + int16_t *ynrm, /* i/o: norm indices */ + int16_t *Rsubband, /* i/o: sub-band bit allocation */ + const int16_t num_env_bands, /* i : Number coded envelope bands */ + const int16_t nb_sfm, /* i : Number of envelope bands */ + const int16_t core_sfm ) /* i : index of the end band for core */ +{ + int16_t i; + int16_t delta, bitsforDelta, add_bits_denv; + + add_bits_denv = 0; + if ( core_sfm >= num_env_bands ) + { + bitsforDelta = get_next_indice( st, 2 ); + bitsforDelta += 2; + add_bits_denv += 2; + + for ( i = num_env_bands; i < nb_sfm; ++i ) + { + if ( Rsubband[i] != 0 ) + { + delta = get_next_indice( st, bitsforDelta ); + ynrm[i] += delta - ( 1 << ( bitsforDelta - 1 ) ); + + /* safety check in case of bit errors */ + if ( ynrm[i] < 0 || ynrm[i] > 39 ) + { + ynrm[i] = 39; + st->BER_detect = 1; + } + add_bits_denv += bitsforDelta; + } + } + + update_rsubband( nb_sfm, Rsubband, add_bits_denv ); + } + + return add_bits_denv; +} + + +/*-------------------------------------------------------------------* + * calc_nor_delta_hf() + * + * + *--------------------------------------------------------------------------*/ + +/*! r: Number of bits consumed for the delta coding */ +int16_t calc_nor_delta_hf( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const float *t_audio, /* i : transform-domain coefficients */ + int16_t *ynrm, /* i/o: norm indices */ + int16_t *Rsubband, /* i/o: sub-band bit allocation */ + const int16_t num_env_bands, /* i : Number coded envelope bands */ + const int16_t nb_sfm, /* i : Number of envelope bands */ + const int16_t *sfmsize, /* i : band length */ + const int16_t *sfm_start, /* i : Start index of bands */ + const int16_t core_sfm /* i : index of the end band for core */ +) +{ + int16_t i; + int16_t ynrm_t[44], normqlg2_t[44]; + int16_t delta, max_delta, min_delta, bitsforDelta, add_bits_denv; + + max_delta = -100; + calc_norm( t_audio, ynrm_t, normqlg2_t, 0, nb_sfm, sfmsize, sfm_start ); + add_bits_denv = 0; + for ( i = num_env_bands; i < nb_sfm; ++i ) + { + if ( Rsubband[i] != 0 ) + { + delta = ynrm_t[i] - ynrm[i]; + if ( delta > 0 ) + { + delta += 1; + } + else + { + delta = -delta; + } + if ( delta > max_delta ) + { + max_delta = delta; + } + } + } + if ( core_sfm >= num_env_bands ) + { + if ( max_delta < 16 ) + { + bitsforDelta = 2; + while ( max_delta >= 2 ) + { + bitsforDelta++; + max_delta >>= 1; + } + } + else + { + bitsforDelta = 5; + } + max_delta = ( 1 << ( bitsforDelta - 1 ) ) - 1; + min_delta = ( max_delta + 1 ) * ( -1 ); + + /* updating norm & storing delta norm */ + add_bits_denv = 2; + push_indice( hBstr, IND_DELTA_ENV_HQ, bitsforDelta - 2, 2 ); + for ( i = num_env_bands; i < nb_sfm; ++i ) + { + if ( Rsubband[i] != 0 ) + { + delta = ynrm_t[i] - ynrm[i]; + if ( delta > max_delta ) + { + delta = max_delta; + } + else if ( delta < min_delta ) + { + delta = min_delta; + } + push_indice( hBstr, IND_DELTA_ENV_HQ, delta - min_delta, bitsforDelta ); + ynrm[i] += delta; + add_bits_denv += bitsforDelta; + } + } + + /* updating bit allocation */ + update_rsubband( nb_sfm, Rsubband, add_bits_denv ); + } + + return add_bits_denv; +} + +/*-------------------------------------------------------------------* + * hq_generic_bwe() + * + * HQ GENERIC BWE + *--------------------------------------------------------------------------*/ + +void hq_generic_bwe( + const int16_t HQ_mode, /* i : HQ mode */ + float *coeff_out1, /* i/o: BWE input & temporary buffer */ + const float *hq_generic_fenv, /* i : SWB frequency envelopes */ + float *coeff_out, /* o : SWB signal in MDCT domain */ + const int16_t hq_generic_offset, /* i : frequency offset for representing hq generic*/ + int16_t *prev_L_swb_norm, /* i/o: last normalize length */ + const int16_t hq_generic_exc_clas, /* i : hq generic hf excitation class */ + const int16_t *sfm_end, /* i : End of bands */ + const int16_t num_sfm, /* i : Number of bands */ + const int16_t num_env_bands, /* i : Number of coded envelope bands */ + const int16_t *R /* i : Bit allocation */ +) +{ + int16_t n_swb_overlap_offset, n_swb_overlap; + float hq_swb_overlap_buf[640]; + + n_swb_overlap_offset = swb_bwe_subband[0] + hq_generic_offset; + + n_swb_overlap = sfm_end[num_env_bands - 1] - n_swb_overlap_offset; + mvr2r( &coeff_out[n_swb_overlap_offset], hq_swb_overlap_buf, n_swb_overlap + sfm_end[num_sfm - 1] - sfm_end[num_env_bands - 1] ); + + hq_generic_hf_decoding( HQ_mode, coeff_out1, hq_generic_fenv, coeff_out, hq_generic_offset, prev_L_swb_norm, hq_generic_exc_clas, R ); + + overlap_hq_bwe( hq_swb_overlap_buf, coeff_out, n_swb_overlap_offset, n_swb_overlap, R, num_env_bands, num_sfm, sfm_end ); + + return; +} + + +/*--------------------------------------------------------------------------* + * hq_wb_nf_bwe() + * + * HQ WB noisefill and BWE + *--------------------------------------------------------------------------*/ + +void hq_wb_nf_bwe( + const float *coeff, /* i : coded/noisefilled normalized spectrum */ + const int16_t is_transient, /* i : is transient flag */ + const int16_t prev_bfi, /* i : previous bad frame indicator */ + const float *normq_v, /* i : norms */ + const int16_t num_sfm, /* i : Number of subbands */ + const int16_t *sfm_start, /* i : Subband start coefficient */ + const int16_t *sfm_end, /* i : Subband end coefficient */ + const int16_t *sfmsize, /* i : Subband band width */ + const int16_t last_sfm, /* i : last coded subband */ + const int16_t *R, /* i : bit allocation */ + const int16_t prev_is_transient, /* i : previous transient flag */ + float *prev_normq, /* i/o: previous norms */ + float *prev_env, /* i/o: previous noise envelopes */ + int16_t *bwe_seed, /* i/o: random seed for generating BWE input */ + float *prev_coeff_out, /* i/o: decoded spectrum in previous frame */ + int16_t *prev_R, /* i/o: bit allocation info. in previous frame */ + float *coeff_out /* o : coded/noisefilled spectrum */ +) +{ + int16_t i; + int16_t sfm; + int16_t total_bit; + int16_t num; + + float bitalloc_var; + float sharp; + float mean; + float peak; + float fabs_coeff_out; + float harm_para; + float alfa = 0.5; + float env; + float step; + float min_coef; + float avrg_norm; + float prev_avrg_norm; + + if ( is_transient == 0 ) + { + if ( prev_bfi == 1 ) + { + mvr2r( normq_v, prev_normq, SFM_N_WB ); + } + + /* the variance of bit allocation */ + total_bit = 0; + bitalloc_var = 0.0f; + for ( sfm = 8; sfm <= last_sfm; sfm++ ) + { + bitalloc_var += (float) abs( R[sfm] - R[sfm - 1] ); + total_bit += R[sfm]; + } + bitalloc_var = ( last_sfm > 8 && total_bit > 0 ) ? ( bitalloc_var / total_bit ) : 0; + + /* calculate the peak-average ratio of saturable subbands */ + num = 0; + sharp = EPSILON; + for ( sfm = last_sfm; sfm >= 8; sfm-- ) + { + if ( R[sfm] >= rat[sfm] * sfmsize[sfm] ) + { + peak = 0.0f; + mean = EPSILON; + for ( i = sfm_start[sfm]; i < sfm_end[sfm]; i++ ) + { + fabs_coeff_out = (float) fabs( coeff_out[i] ); + mean += fabs_coeff_out; + if ( fabs_coeff_out > peak ) + { + peak = fabs_coeff_out; + } + } + sharp += sfmsize[sfm] * peak / mean; + num++; + } + } + + sharp = ( num != 0 ) ? 2.0f * num / sharp : 1.0f; + harm_para = sharp; + if ( last_sfm == 0 ) + { + step = 0; + } + else + { + step = 5.0f * sharp / last_sfm; + } + alfa = 2.5f; + + /* fill noise for the insaturable subbands */ + for ( sfm = 0; sfm < num_sfm; sfm++ ) + { + env = 0.0f; + if ( R[sfm] != 0 && R[sfm] < 1.5f * sfmsize[sfm] ) + { + /* calculate the energy of the undecoded coefficients */ + peak = 0.0f; + min_coef = FLT_MAX; + env = normq_v[sfm] * normq_v[sfm] * sfmsize[sfm]; + for ( i = sfm_start[sfm]; i < sfm_end[sfm]; i++ ) + { + fabs_coeff_out = (float) fabs( coeff_out[i] ); + if ( fabs_coeff_out < min_coef && coeff_out[i] != 0 ) + { + min_coef = fabs_coeff_out; + } + if ( fabs_coeff_out > peak ) + { + peak = fabs_coeff_out; + } + env -= coeff_out[i] * coeff_out[i]; + } + + if ( env > 0 ) + { + if ( sfm == 0 ) + { + avrg_norm = normq_v[0] + normq_v[1] + normq_v[2]; + prev_avrg_norm = prev_normq[0] + prev_normq[1] + prev_normq[2]; + } + else if ( sfm == 25 ) + { + avrg_norm = normq_v[23] + normq_v[24] + normq_v[25]; + prev_avrg_norm = prev_normq[23] + prev_normq[24] + prev_normq[25]; + } + else + { + avrg_norm = normq_v[sfm - 1] + normq_v[sfm] + normq_v[sfm + 1]; + prev_avrg_norm = prev_normq[sfm - 1] + prev_normq[sfm] + prev_normq[sfm + 1]; + } + + if ( bitalloc_var > 0.3f || 4.0f * normq_v[sfm] < peak ) + { + /* calculate the noise magnitude of harmonic signal */ + env = (float) ( avrg_norm * harm_para * sqrt( env / sfmsize[sfm] ) / peak ); + } + else + { + /* calculate the noise magnitude of normal signal */ + env = sharp * (float) sqrt( env / sfmsize[sfm] ); + if ( alfa * normq_v[sfm] < peak ) + { + env *= env / peak; + } + sharp += step; + } + if ( env > 0.5f * min_coef ) + { + env = 0.5f * min_coef; + } + + if ( prev_bfi == 1 ) + { + prev_env[sfm] = env; + } + /* smooth the noise magnitudes between inter-frame */ + if ( prev_avrg_norm > 0.5f * avrg_norm && prev_avrg_norm < 2.0f * avrg_norm && prev_is_transient == 0 ) + { + env = 0.5f * env + 0.5f * prev_env[sfm]; + } + + for ( i = sfm_start[sfm]; i < sfm_end[sfm]; i++ ) + { + if ( coeff[i] == 0 ) + { + coeff_out[i] = (float) ( own_random( bwe_seed ) ) / PCM16_TO_FLT_FAC; + coeff_out[i] *= env; + } + } + } + else + { + env = 0.0f; + } + } + else if ( R[sfm] == 0 ) + { + /* fill random noise for 0 bit subbands */ + for ( i = sfm_start[sfm]; i < sfm_end[sfm]; i++ ) + { + if ( coeff[i] == 0 ) + { + coeff_out[i] = (float) ( own_random( bwe_seed ) ) / PCM16_TO_FLT_FAC; + coeff_out[i] *= normq_v[sfm]; + } + } + + env = normq_v[sfm]; + } + if ( sfm == SFM_N_WB - 1 && prev_is_transient == 0 && prev_normq[sfm] > 0.5f * normq_v[sfm] && prev_normq[sfm] < 2.0f * normq_v[sfm] && bitalloc_var <= 0.3f ) + { + float *p_prev_coeff_out = prev_coeff_out; + for ( i = sfm_start[sfm] + 12; i < sfm_end[sfm]; i++ ) + { + if ( fabs( coeff_out[i] ) > 4.0f * fabs( *p_prev_coeff_out ) || + fabs( coeff_out[i] ) < 0.25f * fabs( *p_prev_coeff_out ) || + ( R[sfm] * ( *prev_R ) == 0 && R[sfm] + ( *prev_R ) != 0 ) ) + { + coeff_out[i] = ( coeff_out[i] > 0 ) ? (float) ( 0.5f * ( fabs( coeff_out[i] ) + fabs( *p_prev_coeff_out ) ) ) : (float) ( -0.5f * ( fabs( coeff_out[i] ) + fabs( *p_prev_coeff_out ) ) ); + } + p_prev_coeff_out++; + } + } + + prev_env[sfm] = env; + } + } + else + { + /* fill random noise for 0 bit subbands of transient frame */ + for ( sfm = 0; sfm < num_sfm; sfm++ ) + { + if ( R[sfm] == 0 ) + { + for ( i = sfm_start[sfm]; i < sfm_end[sfm]; i++ ) + { + coeff_out[i] = (float) ( own_random( bwe_seed ) ) / PCM16_TO_FLT_FAC; + coeff_out[i] *= normq_v[sfm]; + } + } + } + + set_f( prev_env, 0, SFM_N_WB ); + } + + mvr2r( normq_v, prev_normq, SFM_N_WB ); + mvr2r( coeff_out + L_FRAME16k - L_HQ_WB_BWE, prev_coeff_out, L_HQ_WB_BWE ); + *prev_R = R[SFM_N_WB - 1]; + + return; +} + + +/*--------------------------------------------------------------------------* + * enforce_zero_for_min_envelope() + * + * Detect minimum level of envelope and set corresponding bands to zero + *--------------------------------------------------------------------------*/ + +void enforce_zero_for_min_envelope( + const int16_t hqswb_clas, /* i : HQ coding mode */ + const int16_t *ynrm, /* i : Envelope indices */ + float *coefsq, /* i/o: Quantized spectrum/zeroed spectrum */ + int16_t nb_sfm, /* i : Number of coded sub bands */ + const int16_t *sfm_start, /* i : Sub band start indices */ + const int16_t *sfm_end /* i : Sub band end indices */ +) +{ + int16_t i, j; + + /* prevent non-zero output for all-zero input */ + if ( hqswb_clas != HQ_HVQ ) + { + if ( ynrm[0] == 31 ) + { + for ( j = sfm_start[0]; j < sfm_end[0]; j++ ) + { + coefsq[j] = 0.0f; + } + } + + for ( i = 1; i < nb_sfm; i++ ) + { + if ( ynrm[i] == 39 ) + { + for ( j = sfm_start[i]; j < sfm_end[i]; j++ ) + { + coefsq[j] = 0.0f; + } + } + } + } + + return; +} + + +/*--------------------------------------------------------------------------* + * overlap_hq_bwe() + * + * Overlapping at the boundary between HQ core and BWE + *--------------------------------------------------------------------------*/ + +static void overlap_hq_bwe( + const float *hq_swb_overlap_buf, /* i : spectrum from HQ core */ + float *coeff_out, /* i/o: spectrum from BWE, overlapped output */ + const int16_t n_swb_overlap_offset, /* i : starting offset of overlapping */ + const int16_t n_swb_overlap, /* i : length of overlapping */ + const int16_t *R, /* i : Bit allocation */ + const int16_t num_env_bands, /* i : Number of coded envelope bands */ + const int16_t num_sfm, /* i : Number of bands */ + const int16_t *sfm_end /* i : Band end indices */ +) +{ + int16_t i; + float step; + float weighting; + int16_t n_band; + + if ( R[num_env_bands - 1] != 0 ) + { + mvr2r( hq_swb_overlap_buf, &coeff_out[n_swb_overlap_offset], n_swb_overlap ); + } + else + { + /*weighting = 0.8f;*/ + step = 1.0f / (float) n_swb_overlap; + weighting = 1.0f; + for ( i = 0; i < n_swb_overlap; i++ ) + { + coeff_out[n_swb_overlap_offset + i] = hq_swb_overlap_buf[i] * weighting + coeff_out[n_swb_overlap_offset + i] * ( 1.0f - weighting ); + weighting -= step; + } + } + + + for ( n_band = num_env_bands; n_band < num_sfm; n_band++ ) + { + if ( R[n_band] != 0 ) + { + for ( i = sfm_end[n_band - 1]; i < sfm_end[n_band]; ++i ) + { + coeff_out[i] = hq_swb_overlap_buf[i - n_swb_overlap_offset]; + } + } + } + + return; +} + + +/*--------------------------------------------------------------------------* + * apply_envelope() + * + * Apply spectral envelope with envelope adjustments + *--------------------------------------------------------------------------*/ + +void apply_envelope( + const float *coeff, /* i/o: Coded/noisefilled normalized spectrum */ + const int16_t *norm, /* i : Envelope */ + const float *norm_adj, /* i : Envelope adjustment */ + const int16_t num_sfm, /* i : Total number of bands */ + const int16_t last_sfm, /* i : Last coded band */ + const int16_t HQ_mode, /* i : HQ mode */ + const int16_t length, /* i : Frame length */ + const int16_t *sfm_start, /* i : Sub band start indices */ + const int16_t *sfm_end, /* i : Sub band end indices */ + float *normq_v, /* o : Envelope with adjustment */ + float *coeff_out, /* o : coded/noisefilled spectrum */ + float *coeff_out1 /* o : noisefilled spectrum for HQ SWE BWE */ +) +{ + int16_t i; + int16_t sfm; + float normq; + int16_t len; + + len = num_sfm; + if ( HQ_mode == HQ_GEN_SWB || HQ_mode == HQ_GEN_FB ) + { + len = last_sfm + 1; + } + + if ( length == L_FRAME16k ) + { + for ( sfm = 0; sfm < num_sfm; sfm++ ) + { + normq_v[sfm] = dicn[norm[sfm]]; + normq = normq_v[sfm] * norm_adj[sfm]; + + for ( i = sfm_start[sfm]; i < sfm_end[sfm]; i++ ) + { + coeff_out[i] = coeff[i] * normq; + } + } + } + else + { + for ( sfm = 0; sfm < len; sfm++ ) + { + normq_v[sfm] = dicn[norm[sfm]]; + normq_v[sfm] *= norm_adj[sfm]; + + normq = normq_v[sfm]; + for ( i = sfm_start[sfm]; i < sfm_end[sfm]; i++ ) + { + coeff_out[i] = coeff[i] * normq; + } + } + + if ( HQ_mode == HQ_GEN_SWB || HQ_mode == HQ_GEN_FB ) + { + for ( sfm = 0; sfm <= last_sfm; sfm++ ) + { + normq = normq_v[sfm]; + for ( i = sfm_start[sfm]; i < sfm_end[sfm]; i++ ) + { + coeff_out1[i] = coeff_out1[i] * normq; + } + } + } + } + + return; +} + + +/*--------------------------------------------------------------------------* + * apply_envelope_enc() + * + * Apply spectral envelope without envelope adjustments and noisefill + *--------------------------------------------------------------------------*/ + +void apply_envelope_enc( + float *coeff, /* i/o: Normalized/scaled normalized spectrum */ + const int16_t *norm, /* i : Envelope */ + const int16_t num_sfm, /* i : Total number of bands */ + const int16_t *sfm_start, /* i : Sub band start indices */ + const int16_t *sfm_end /* i : Sub band end indices */ +) +{ + int16_t sfm; + int16_t i; + float normq; + + for ( sfm = 0; sfm < num_sfm; sfm++ ) + { + normq = dicn[norm[sfm]]; + + for ( i = sfm_start[sfm]; i < sfm_end[sfm]; i++ ) + { + coeff[i] *= normq; + } + } + + return; +} + + +/*----------------------------------------------------------------------------- + * floating_point_add() + * + * Add two floating point numbers in integer representation: x <- x + y + * Ported from BASOP code to ensure interoperability + *----------------------------------------------------------------------------*/ + +void floating_point_add( + int32_t *mx, /* i/o: mantissa of the addend Q31 */ + int16_t *ex, /* i/o: exponent of the addend Q0 */ + const int32_t my, /* i : mantissa of the adder Q31 */ + const int16_t ey /* i : exponent of the adder Q0 */ +) +{ + Word32 accX, accY; + Word16 align, expo; + + accX = *mx >> 1; + accY = my >> 1; + align = *ex - ey; + if ( align < 0 ) + { + if ( align > -32 ) /* If align < -32, (accY >> (-align) = 0 */ + { + accX = accX + ( accY >> ( -align ) ); + } + } + else + { + if ( align < 32 ) /* If align > 32, (accX >> align) = 0 */ + { + accX = accY + ( accX >> align ); + } + else + { + accX = accY; + } + *ex = ey; + } + expo = norm_l( accX ); /* aligned to BASOP */ + *mx = accX << expo; + *ex = *ex + expo - 1; + + return; +} diff --git a/lib_com/hvq_pvq_bitalloc.c b/lib_com/hvq_pvq_bitalloc.c new file mode 100644 index 0000000000000000000000000000000000000000..5ff0d3344c0f805295cb3983955190c528492bb8 --- /dev/null +++ b/lib_com/hvq_pvq_bitalloc.c @@ -0,0 +1,187 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*--------------------------------------------------------------------------*/ +/* Function hvq_pvq_bitalloc */ +/* ~~~~~~~~~~~~~~~~~~~~~~~~ */ +/* */ +/* Calculate the number of PVQ bands to code and allocate bits based on */ +/* the number of available bits. */ +/*--------------------------------------------------------------------------*/ + +/*! r: Number of low frequency bands */ +int16_t hvq_pvq_bitalloc( + int16_t num_bits, /* i/o: Number of available bits (including gain bits)*/ + const int32_t core_brate, /* i : core bitrate */ + const int16_t bwidth, /* i : Encoded bandwidth */ + const int16_t *ynrm, /* i : Envelope coefficients */ + const int32_t manE_peak, /* i : Peak energy mantissa */ + const int16_t expE_peak, /* i : Peak energy exponent */ + int16_t *Rk, /* o : bit allocation for concatenated vector */ + int16_t *R, /* i/o: Global bit allocation */ + int16_t *sel_bands, /* o : Selected bands for encoding */ + int16_t *n_sel_bands /* o : No. of selected bands for encoding */ +) +{ + int16_t num_bands, k, band_max_bits; + int16_t k_max; + int16_t k_start; + float E_max; + int32_t E_max5; + int16_t expo; + int16_t align; + int32_t acc; + float tmp; + int32_t env_mean; + int16_t reciprocal; + int16_t num_sfm; + int16_t bit_cost; + + if ( bwidth == FB ) + { + num_sfm = SFM_N_HARM_FB; + } + else + { + num_sfm = SFM_N_HARM; + } + + if ( core_brate < HQ_BWE_CROSSOVER_BRATE ) + { + band_max_bits = HVQ_BAND_MAX_BITS_24k; + k_start = HVQ_THRES_SFM_24k; + if ( bwidth == FB ) + { + reciprocal = 2731; + } + else + { + reciprocal = 3277; + } + } + else + { + band_max_bits = HVQ_BAND_MAX_BITS_32k; + k_start = HVQ_THRES_SFM_32k; + if ( bwidth == FB ) + { + reciprocal = 3641; + } + else + { + reciprocal = 4681; + } + } + + num_bands = num_bits / band_max_bits; + num_bits = num_bits - num_bands * band_max_bits; + + if ( num_bits >= HVQ_NEW_BAND_BIT_THR ) + { + num_bands++; + } + else + { + num_bits += band_max_bits; + } + + /* safety check in case of bit errors */ + if ( num_bands < 1 ) + { + return 0; + } + + *n_sel_bands = 0; + env_mean = 0; + E_max = 0; + k_max = k_start; + for ( k = k_start; k < num_sfm; k++ ) + { + tmp = dicn[ynrm[k]]; + env_mean += ynrm[k]; + if ( tmp > E_max ) + { + E_max = tmp; + k_max = k; + } + } + env_mean = 2 * ( env_mean * reciprocal ); + + if ( band_len_harm[k_max] == 96 ) + { + bit_cost = 61; + } + else + { + QuantaPerDsDirac( band_len_harm[k_max], 1, hBitsN, &bit_cost ); + } + + + expo = max( 0, ynrm[k_max] - 1 ) >> 1; + E_max5 = E_max5_tbl[ynrm[k_max]]; + align = expo - expE_peak; + align = align + ( 19 - 14 ) - ( 31 - 2 * 12 ); + if ( align < 0 ) + { + acc = E_max5 - ( manE_peak >> -align ); + } + else + { + acc = ( E_max5 >> align ) - manE_peak; + } + if ( acc > 0 && ( ( env_mean - ( ynrm[k_max] << 16 ) ) > 0x30000L ) && num_bands > 1 && ( num_bits - HVQ_PVQ_GAIN_BITS ) << 3 >= bit_cost ) + { + sel_bands[*n_sel_bands] = k_max; + ( *n_sel_bands )++; + R[k_max] = 1; /* Mark that the band has been encoded for fill_spectrum */ + } + + /* Allocate bits */ + for ( k = 0; k < num_bands - 1; k++ ) + { + Rk[k] = band_max_bits - HVQ_PVQ_GAIN_BITS; + } + Rk[num_bands - 1] = num_bits - HVQ_PVQ_GAIN_BITS; + + return num_bands; +} diff --git a/lib_com/ifft_rel.c b/lib_com/ifft_rel.c new file mode 100644 index 0000000000000000000000000000000000000000..597a5d1734f916e6aacaeac7f6098f1ff1486e71 --- /dev/null +++ b/lib_com/ifft_rel.c @@ -0,0 +1,287 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*-----------------------------------------------------------------* + * Local constants + *-----------------------------------------------------------------*/ + +#define N_MAX_FFT 1024 + +/*---------------------------------------------------------------------* + * ifft_rel() + * + * Calculate the inverse FFT of a real signal + * + * Based on the FORTRAN code from the article "Real-valued Fast Fourier Transform Algorithms" + * by Sorensen, ... in IEEE Trans. on ASSP, Vol. ASSP-35, No. June 6th 1987. + * + * Input: the io[] signal containing the spectrum in the following order : + * + * Re[0], Re[1], .. Re[n/2], Im[n/2-1], .. Im[1] + *---------------------------------------------------------------------*/ + +void ifft_rel( + float io[], /* i/o: input/output vector */ + const int16_t n, /* i : vector length */ + const int16_t m /* i : log2 of vector length */ +) +{ + int16_t i, j, k; + int16_t step; + int16_t n2, n4, n8, i0; + int16_t is, id; + float *x, *xi0, *xi1, *xi2, *xi3, *xi4, *xup1, *xdn6, *xup3, *xdn8; + float xt; + float r1; + float t1, t2, t3, t4, t5; + float cc1, cc3, ss1, ss3; + const float *s, *s3, *c, *c3; + const int16_t *idx; + float temp[512]; + float n_inv; + + n_inv = 1.0f / n; + + /*-----------------------------------------------------------------* + * IFFT + *-----------------------------------------------------------------*/ + + x = &io[-1]; + n2 = 2 * n; + for ( k = 1; k < m; k++ ) + { + is = 0; + id = n2; + n2 = n2 >> 1; + n4 = n2 >> 2; + n8 = n4 >> 1; + while ( is < n - 1 ) + { + xi1 = x + is + 1; + xi2 = xi1 + n4; + xi3 = xi2 + n4; + xi4 = xi3 + n4; + + for ( i = is; i < n; i += id ) + { + t1 = *xi1 - *xi3; + *xi1 += *xi3; + *xi2 = 2.0f * *xi2; + *xi3 = t1 - 2.0f * *xi4; + *xi4 = t1 + 2.0f * *xi4; + if ( n4 != 1 ) + { + t1 = ( *( xi2 + n8 ) - *( xi1 + n8 ) ) * INV_SQRT_2; + t2 = ( *( xi4 + n8 ) + *( xi3 + n8 ) ) * INV_SQRT_2; + + *( xi1 + n8 ) += *( xi2 + n8 ); + *( xi2 + n8 ) = *( xi4 + n8 ) - *( xi3 + n8 ); + *( xi3 + n8 ) = (float) ( 2.0f * ( -t2 - t1 ) ); + *( xi4 + n8 ) = (float) ( 2.0f * ( -t2 + t1 ) ); + } + xi1 += id; + xi2 += id; + xi3 += id; + xi4 += id; + } + is = 2 * id - n2; + id = 4 * id; + } + step = N_MAX_FFT / n2; + + s = sincos_t_ext + step; + c = s + N_MAX_FFT / 4; + s3 = sincos_t_ext + 3 * step; + c3 = s3 + N_MAX_FFT / 4; + for ( j = 2; j <= n8; j++ ) + { + cc1 = *c; + ss1 = *s; + cc3 = *c3; + ss3 = *s3; + + is = 0; + id = 2 * n2; + + c += step; + s += step; + + c3 += 3 * step; + s3 += 3 * step; + while ( is < n - 1 ) + { + xup1 = x + j + is; + xup3 = xup1 + 2 * n4; + xdn6 = xup3 - 2 * j + 2; + xdn8 = xdn6 + 2 * n4; + + for ( i = is; i < n; i += id ) + { + t1 = *xup1 - *xdn6; + *xup1 = *xup1 + *xdn6; + xup1 += n4; + xdn6 -= n4; + + t2 = *xdn6 - *xup1; + *xdn6 = *xup1 + *xdn6; + + xdn6 += n4; + t3 = *xdn8 + *xup3; + *xdn6 = *xdn8 - *xup3; + + xup3 += n4; + xdn8 -= n4; + + t4 = *xup3 + *xdn8; + *xup1 = *xup3 - *xdn8; + + t5 = t1 - t4; + t1 = t1 + t4; + t4 = t2 - t3; + t2 = t2 + t3; + *xup3 = t1 * cc3 - t2 * ss3; + xup3 -= n4; + *xup3 = t5 * cc1 + t4 * ss1; + *xdn8 = -t4 * cc1 + t5 * ss1; + + xdn8 += n4; + *xdn8 = t2 * cc3 + t1 * ss3; + + xup1 -= n4; + xup1 += id; + xup3 += id; + xdn6 += id; + xdn8 += id; + } + is = 2 * id - n2; + id = 4 * id; + } + } + } + + /*-----------------------------------------------------------------* + * Length two butterflies + *-----------------------------------------------------------------*/ + + is = 1; + id = 4; + while ( is < n ) + { + xi0 = x + is; + xi1 = xi0 + 1; + + for ( i0 = is; i0 <= n; i0 += id ) + { + r1 = *xi0; + *xi0 = r1 + *xi1; + *xi1 = r1 - *xi1; + xi0 += id; + xi1 += id; + } + is = 2 * id - 1; + id = 4 * id; + } + + /*-----------------------------------------------------------------* + * Digit reverse counter + *-----------------------------------------------------------------*/ + + idx = fft256_read_indexes; + xi0 = &temp[0] - 1; + if ( n == 128 ) + { + for ( i = 0; i < n; i++ ) + { + j = *idx++; + temp[i] = x[1 + ( j >> 1 )]; + } + } + else if ( n == 256 ) + { + for ( i = 0; i < n; i++ ) + { + j = *idx++; + temp[i] = x[1 + j]; + } + } + else if ( n == 512 ) + { + for ( i = 0; i < 256; i++ ) + { + j = *idx++; + temp[i] = x[1 + 2 * j]; + temp[i + 256] = x[2 + 2 * j]; + } + } + else + { + xi0 = x; + j = 1; + for ( i = 1; i < n; i++ ) + { + if ( i < j ) + { + xt = x[j]; + x[j] = x[i]; + x[i] = xt; + } + k = n >> 1; + while ( k < j ) + { + j = j - k; + k = k >> 1; + } + j = j + k; + } + } + + /*-----------------------------------------------------------------* + * Normalization + *-----------------------------------------------------------------*/ + + for ( i = 1; i <= n; i++ ) + { + x[i] = xi0[i] * n_inv; + } + + return; +} diff --git a/lib_com/igf_base.c b/lib_com/igf_base.c new file mode 100644 index 0000000000000000000000000000000000000000..73f7228d0d278b9bbd9eb8472649c1f4863f33e4 --- /dev/null +++ b/lib_com/igf_base.c @@ -0,0 +1,738 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include "options.h" +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*---------------------------------------------------------------------* + * IGF_ApplyTransFac() + * + * + *---------------------------------------------------------------------*/ + +/*! r: | multiplication factor */ +int16_t IGF_ApplyTransFac( + const int16_t val, /* i : Q15 | input value for multiplication, Q15 */ + const float transFac /* i : Q14 | multiplicator for variable val, Q14: 1.25f=0x5000, 1.0f=0x4000, 0.5f=0x2000 */ +) +{ + int16_t ret = val; + + if ( transFac != 1.f ) + { + ret = (int16_t) round_f( val * transFac ); + ret += ( ret & 1 ); + } + + return ret; +} + + +/*---------------------------------------------------------------------* + * IGF_MapBitRateToIndex() + * + * maps a given bitrate to the IGF_BITRATE index + *---------------------------------------------------------------------*/ + +/*! r: bitrate index */ +int16_t IGF_MapBitRateToIndex( + const int32_t brate, /* i : bitrate */ + const int16_t bwidth, /* i : audio bandwidth */ + const int16_t element_mode, /* i : element mode */ + const int16_t rf_mode /* i : flag to signal the RF mode */ +) +{ + int16_t bitRateIndex = IGF_BITRATE_UNKNOWN; + + /* Stereo/CPE modes */ + if ( element_mode > IVAS_SCE ) + { + switch ( bwidth ) + { + case IGF_MODE_WB: + if ( brate <= IVAS_13k2 && rf_mode == 1 ) + { + bitRateIndex = IGF_BITRATE_RF_WB_13200; + } + else if ( brate <= ACELP_9k60 ) + { + bitRateIndex = IGF_BITRATE_WB_13200_CPE; + } + else if ( brate <= IVAS_13k2 ) + { + bitRateIndex = IGF_BITRATE_WB_16400_CPE; + } + break; + case IGF_MODE_SWB: + /* DFT and TD Stereo bitrates */ + if ( brate <= ACELP_9k60 ) + { + bitRateIndex = IGF_BITRATE_SWB_13200_CPE; + } + else if ( brate <= IVAS_13k2 ) + { + if ( rf_mode == 1 ) + { + bitRateIndex = IGF_BITRATE_RF_SWB_13200; + } + else + { + bitRateIndex = IGF_BITRATE_SWB_16400_CPE; + } + } + else if ( brate <= IVAS_16k4 ) + { + bitRateIndex = IGF_BITRATE_SWB_24400_CPE; + } + else if ( brate <= IVAS_24k4 ) + { + bitRateIndex = IGF_BITRATE_SWB_32000_CPE; + } + else if ( brate <= IVAS_32k ) + { + bitRateIndex = IGF_BITRATE_SWB_32000; + } + /* MDCT Stereo bitrates */ + else if ( brate <= IVAS_48k ) + { + bitRateIndex = IGF_BITRATE_SWB_48000_CPE; + } + else if ( brate <= IVAS_64k ) + { + bitRateIndex = IGF_BITRATE_SWB_64000_CPE; + } + else if ( brate <= IVAS_80k ) + { + bitRateIndex = IGF_BITRATE_SWB_80000_CPE; + } + else if ( brate <= IVAS_96k ) + { + bitRateIndex = IGF_BITRATE_SWB_96000_CPE; + } + break; + case IGF_MODE_FB: + /* DFT and TD Stereo bitrates */ + if ( brate <= IVAS_16k4 ) + { + bitRateIndex = IGF_BITRATE_FB_24400_CPE; + } + else if ( brate <= IVAS_24k4 ) + { + bitRateIndex = IGF_BITRATE_FB_32000_CPE; + } + else if ( brate <= IVAS_32k ) + { + bitRateIndex = IGF_BITRATE_FB_32000; + } + /* MDCT Stereo bitrates */ + else if ( brate <= IVAS_48k ) + { + bitRateIndex = IGF_BITRATE_FB_48000_CPE; + } + else if ( brate <= IVAS_64k ) + { + bitRateIndex = IGF_BITRATE_FB_64000_CPE; + } + else if ( brate <= IVAS_80k ) + { + bitRateIndex = IGF_BITRATE_FB_80000_CPE; + } + else if ( brate <= IVAS_96k ) + { + bitRateIndex = IGF_BITRATE_FB_96000_CPE; + } + else if ( brate <= IVAS_128k ) + { + bitRateIndex = IGF_BITRATE_FB_128000_CPE; + } + break; + } + } + /* SCE modes: use tunings done for DFT stereo bitrates also for according SCE bitrates, otherwise same config as mono modes */ + else if ( element_mode == IVAS_SCE ) + { + switch ( bwidth ) + { + case IGF_MODE_WB: + if ( brate <= IVAS_13k2 && rf_mode == 1 ) + { + bitRateIndex = IGF_BITRATE_RF_WB_13200; + } + else if ( brate <= ACELP_9k60 ) /* bitrates 8000 and 9600 */ + { + bitRateIndex = IGF_BITRATE_WB_9600; + } + break; + case IGF_MODE_SWB: + if ( brate <= ACELP_9k60 ) + { + bitRateIndex = IGF_BITRATE_SWB_13200_CPE; + } + else if ( brate <= IVAS_13k2 ) + { + if ( rf_mode == 1 ) + { + bitRateIndex = IGF_BITRATE_RF_SWB_13200; + } + else + { + bitRateIndex = IGF_BITRATE_SWB_16400_CPE; + } + } + else if ( brate <= IVAS_16k4 ) + { + bitRateIndex = IGF_BITRATE_SWB_24400_CPE; + } + else if ( brate <= IVAS_24k4 ) + { + bitRateIndex = IGF_BITRATE_SWB_32000_CPE; + } + else if ( brate <= IVAS_32k ) + { + bitRateIndex = IGF_BITRATE_SWB_32000; + } + else if ( brate <= IVAS_48k ) + { + bitRateIndex = IGF_BITRATE_SWB_48000; + } + else if ( brate <= IVAS_64k ) + { + bitRateIndex = IGF_BITRATE_SWB_64000; + } + break; + case IGF_MODE_FB: + if ( brate <= IVAS_16k4 ) + { + bitRateIndex = IGF_BITRATE_FB_24400_CPE; + } + else if ( brate <= IVAS_24k4 ) + { + bitRateIndex = IGF_BITRATE_FB_32000_CPE; + } + else if ( brate <= IVAS_32k ) + { + bitRateIndex = IGF_BITRATE_FB_32000; + } + else if ( brate <= IVAS_48k ) + { + bitRateIndex = IGF_BITRATE_FB_48000; + } + else if ( brate <= IVAS_64k ) + { + bitRateIndex = IGF_BITRATE_FB_64000; + } + else if ( brate <= IVAS_96k ) + { + bitRateIndex = IGF_BITRATE_FB_96000; + } + else if ( brate <= IVAS_128k ) + { + bitRateIndex = IGF_BITRATE_FB_128000; + } + break; + } + } + /* EVS mono */ + else + { + switch ( bwidth ) + { + case IGF_MODE_WB: + if ( brate <= ACELP_13k20 && rf_mode == 1 ) + { + bitRateIndex = IGF_BITRATE_RF_WB_13200; + } + else if ( brate <= ACELP_9k60 ) /* bitrates 8000 and 9600 */ + { + bitRateIndex = IGF_BITRATE_WB_9600; + } + break; + case IGF_MODE_SWB: + if ( brate <= ACELP_9k60 ) + { + bitRateIndex = IGF_BITRATE_SWB_9600; + } + else if ( brate <= ACELP_13k20 ) + { + if ( rf_mode == 1 ) + { + bitRateIndex = IGF_BITRATE_RF_SWB_13200; + } + else + { + bitRateIndex = IGF_BITRATE_SWB_13200; + } + } + else if ( brate <= ACELP_16k40 ) + { + bitRateIndex = IGF_BITRATE_SWB_16400; + } + else if ( brate <= ACELP_24k40 ) + { + bitRateIndex = IGF_BITRATE_SWB_24400; + } + else if ( brate <= ACELP_32k ) + { + bitRateIndex = IGF_BITRATE_SWB_32000; + } + else if ( brate <= ACELP_48k ) + { + bitRateIndex = IGF_BITRATE_SWB_48000; + } + else if ( brate <= ACELP_64k ) + { + bitRateIndex = IGF_BITRATE_SWB_64000; + } + break; + case IGF_MODE_FB: + if ( brate <= ACELP_16k40 ) + { + bitRateIndex = IGF_BITRATE_FB_16400; + } + else if ( brate <= ACELP_24k40 ) + { + bitRateIndex = IGF_BITRATE_FB_24400; + } + else if ( brate <= ACELP_32k ) + { + bitRateIndex = IGF_BITRATE_FB_32000; + } + else if ( brate <= ACELP_48k ) + { + bitRateIndex = IGF_BITRATE_FB_48000; + } + else if ( brate <= ACELP_64k ) + { + bitRateIndex = IGF_BITRATE_FB_64000; + } + else if ( brate <= HQ_96k ) + { + bitRateIndex = IGF_BITRATE_FB_96000; + } + else if ( brate <= HQ_128k ) + { + bitRateIndex = IGF_BITRATE_FB_128000; + } + break; + } + } + + return bitRateIndex; +} + + +/*---------------------------------------------------------------------* + * IGF_gridSetUp() + * + * IGF grid setup + *---------------------------------------------------------------------*/ + +static void IGF_gridSetUp( + H_IGF_GRID hGrid, /* o : IGF grid handle */ + int16_t bitRateIndex, /* i : IGF bitrate index */ + const int32_t sampleRate, /* i : sample rate */ + int16_t frameLength, /* i : frame length */ + const float transFac, /* i : transFac */ + const int16_t igfMinFq /* i : IGF minimum frequency indicating lower start frequency for copy up */ +) +{ + int16_t t, k; + int16_t sfb; + int16_t swb_offset_len; + const int16_t *swb_offset; + float bandwidth; + const int16_t *igf_tile_offset; + + /* inits */ + swb_offset = NULL; + swb_offset_len = 0; + if ( transFac == 0.5f && bitRateIndex == IGF_BITRATE_SWB_48000_CPE ) + { + bitRateIndex = IGF_BITRATE_SWB_48000_CPE_TCX10; + } + else if ( transFac == 0.5f && bitRateIndex == IGF_BITRATE_FB_48000_CPE ) + { + bitRateIndex = IGF_BITRATE_FB_48000_CPE_TCX10; + } + + if ( bitRateIndex != IGF_BITRATE_UNKNOWN ) + { + swb_offset = &swb_offset_LB_new[bitRateIndex][1]; + swb_offset_len = swb_offset_LB_new[bitRateIndex][0]; + mvr2r( &igf_whitening_TH[bitRateIndex][0][0], &hGrid->whiteningThreshold[0][0], IGF_MAX_TILES * 2 ); + } + else + { + assert( 0 ); + } + + for ( sfb = 0; sfb < swb_offset_len; sfb++ ) + { + hGrid->swb_offset[sfb] = IGF_ApplyTransFac( swb_offset[sfb], transFac ); + } + for ( sfb = swb_offset_len; sfb < IGF_MAX_SFB; sfb++ ) + { + hGrid->swb_offset[sfb] = 0; + } + + hGrid->infoIsRefined = 0; + frameLength = IGF_ApplyTransFac( frameLength, transFac ); + bandwidth = (float) sampleRate / 2.0f / (float) frameLength; + hGrid->swb_offset_len = swb_offset_len; + hGrid->startSfb = 0; + hGrid->stopSfb = hGrid->swb_offset_len - 1; + hGrid->startLine = hGrid->swb_offset[hGrid->startSfb]; + hGrid->stopLine = hGrid->swb_offset[hGrid->stopSfb]; + hGrid->startFrequency = (int16_t) round_f( bandwidth * hGrid->startLine ); + hGrid->stopFrequency = (int16_t) round_f( bandwidth * hGrid->stopLine ); + hGrid->minSrcSubband = (int16_t) round_f( ( igfMinFq * ( frameLength ) ) / ( sampleRate >> 1 ) ); + hGrid->minSrcSubband += hGrid->minSrcSubband % 2; + hGrid->minSrcFrequency = (int16_t) round_f( bandwidth * hGrid->minSrcSubband ); + hGrid->infoGranuleLen = frameLength; + hGrid->sfbWrap[0] = 0; + hGrid->tile[0] = hGrid->startLine; + + igf_tile_offset = &igf_tile_offset_table[bitRateIndex][1]; + hGrid->nTiles = igf_tile_offset_table[bitRateIndex][0]; + hGrid->tile[0] = hGrid->startLine; + hGrid->sfbWrap[0] = 0; + for ( k = 0; k < hGrid->nTiles; k++ ) + { + hGrid->sfbWrap[k + 1] = igf_tile_offset[2 * k]; + hGrid->sbWrap[k] = hGrid->minSrcSubband + IGF_ApplyTransFac( igf_tile_offset[2 * k + 1], transFac ); + hGrid->tile[k + 1] = hGrid->swb_offset[igf_tile_offset[2 * k]]; + } + for ( t = hGrid->nTiles + 1; t < IGF_MAX_TILES; t++ ) + { + hGrid->tile[t] = 0; + hGrid->sbWrap[t - 1] = 0; + hGrid->sfbWrap[t] = 0; + } + + /* adapt level envelope: */ + switch ( bitRateIndex ) + { + case IGF_BITRATE_RF_WB_13200: + case IGF_BITRATE_WB_9600: + case IGF_BITRATE_WB_13200_CPE: + case IGF_BITRATE_WB_16400_CPE: + hGrid->gFactor = 0.800f; + hGrid->fFactor = 0.70f; + hGrid->lFactor = 0.60f; + break; + case IGF_BITRATE_SWB_13200: + case IGF_BITRATE_SWB_16400_CPE: + case IGF_BITRATE_FB_16400: + case IGF_BITRATE_SWB_16400: + case IGF_BITRATE_FB_24400_CPE: + case IGF_BITRATE_SWB_24400_CPE: + hGrid->gFactor = 0.930f; + hGrid->fFactor = 0.20f; + hGrid->lFactor = 0.85f; + break; + case IGF_BITRATE_FB_24400: + case IGF_BITRATE_SWB_24400: + case IGF_BITRATE_FB_32000_CPE: + case IGF_BITRATE_SWB_32000_CPE: + case IGF_BITRATE_FB_32000: + case IGF_BITRATE_SWB_32000: + case IGF_BITRATE_SWB_48000_CPE: + case IGF_BITRATE_SWB_64000_CPE: + hGrid->gFactor = 0.965f; + hGrid->fFactor = 0.20f; + hGrid->lFactor = 0.85f; + break; + case IGF_BITRATE_FB_48000: + case IGF_BITRATE_SWB_48000: + case IGF_BITRATE_FB_64000: + case IGF_BITRATE_SWB_64000: + case IGF_BITRATE_SWB_80000_CPE: + case IGF_BITRATE_SWB_96000_CPE: + hGrid->gFactor = 1.000f; + hGrid->fFactor = 0.20f; + hGrid->lFactor = 1.000f; + break; + case IGF_BITRATE_SWB_9600: + case IGF_BITRATE_SWB_13200_CPE: + case IGF_BITRATE_RF_SWB_13200: + default: + hGrid->gFactor = 1.000f; + hGrid->fFactor = 0.00f; + hGrid->lFactor = 1.000f; + } + + for ( t = hGrid->nTiles + 1; t < IGF_MAX_TILES; t++ ) + { + hGrid->tile[t] = 0; + hGrid->sbWrap[t - 1] = 0; + hGrid->sfbWrap[t] = 0; + } + + return; +} + + +/*---------------------------------------------------------------------* + * IGFCommonFuncsIGFConfiguration() + * + * changes the IGF configuration + *---------------------------------------------------------------------*/ + +/*! r: error value: 0 -> error, 1 -> ok */ +int16_t IGFCommonFuncsIGFConfiguration( + const int32_t total_brate, /* i : bitrate in bs e.g. 9600 for 9.6kbs */ + const int16_t bwidth, /* i : audio bandwidth */ + const int16_t element_mode, /* i : element mode */ + H_IGF_INFO hIGFInfo, /* o : IGF info handle */ + const int16_t rf_mode /* i : flag to signal the RF mode */ +) +{ + H_IGF_GRID hGrid; + int16_t retValue; + int32_t sampleRate; + int16_t frameLength; + int16_t igfMinFq; + int16_t maxHopsize; + + retValue = 0; /* bitrate index is unknown -> error! */ + + /* interface call for reading in settings */ + hIGFInfo->bitRateIndex = IGF_MapBitRateToIndex( total_brate, bwidth, element_mode, rf_mode ); + + if ( hIGFInfo->bitRateIndex != IGF_BITRATE_UNKNOWN ) + { + retValue = 1; /* no error */ + + /* mapping to local values */ + sampleRate = igfMode[hIGFInfo->bitRateIndex].sampleRate; + frameLength = igfMode[hIGFInfo->bitRateIndex].frameLength; + igfMinFq = igfMode[hIGFInfo->bitRateIndex].igfMinFq; + maxHopsize = igfMode[hIGFInfo->bitRateIndex].maxHopsize; + + /* basic information */ + hIGFInfo->sampleRate = sampleRate; + hIGFInfo->frameLength = frameLength; + hIGFInfo->maxHopsize = maxHopsize; + hIGFInfo->nfSeedBuf[0] = 0; + hIGFInfo->nfSeedBuf[1] = 0; + hIGFInfo->nfSeed = &hIGFInfo->nfSeedBuf[0]; + + /* set up regular IGF grid for TCX 20 (transfac = 1.f) */ + hGrid = &hIGFInfo->grid[IGF_GRID_LB_NORM]; + IGF_gridSetUp( hGrid, hIGFInfo->bitRateIndex, sampleRate, frameLength, 1.00f, igfMinFq ); + + /* set up IGF grid for CELP->TCX 20 transitions (transfac = 1.25) */ + hGrid = &hIGFInfo->grid[IGF_GRID_LB_TRAN]; + IGF_gridSetUp( hGrid, hIGFInfo->bitRateIndex, sampleRate, frameLength, 1.25f, igfMinFq ); + + /* set up IGF grid for TCX 10 (transfac = 0.5) */ + hGrid = &hIGFInfo->grid[IGF_GRID_LB_SHORT]; + IGF_gridSetUp( hGrid, hIGFInfo->bitRateIndex, sampleRate, frameLength, 0.50f, igfMinFq ); + } + + return retValue; +} + + +/*---------------------------------------------------------------------* + * IGFCommonFuncsIGFGetCFTables() + * + * selects cumulative frequency tables and offsets for the IGF SCF arithmetic coder + *---------------------------------------------------------------------*/ + +/*! r: error value: 0 -> error, 1 -> ok */ +int16_t IGFCommonFuncsIGFGetCFTables( + const int32_t total_brate, /* i : bitrate in bs e.g. 9600 for 9.6kbs */ + const int16_t bwidth, /* i : audio bandwidth */ + const int16_t element_mode, /* i : element mode */ + const int16_t rf_mode, /* i : flag to signal the RF mode */ + const uint16_t **cf_se00, /* o : CF table for t == 0 and f == 0 */ + const uint16_t **cf_se01, /* o : CF table for t == 0 and f == 1 */ + int16_t *cf_off_se01, /* o : offset for CF table above */ + const uint16_t **cf_se02, /* o : CF tables for t == 0 and f >= 2 */ + const int16_t **cf_off_se02, /* o : offsets for CF tables above */ + const uint16_t **cf_se10, /* o : CF table for t == 1 and f == 0 */ + int16_t *cf_off_se10, /* o : offset for CF table above */ + const uint16_t **cf_se11, /* o : CF tables for t == 1 and f >= 1 */ + const int16_t **cf_off_se11 /* o : offsets for CF tables above */ +) +{ + int16_t retValue; + int16_t bitRateIndex; + + retValue = 0; /* bitrate index is unknown -> error! */ + + bitRateIndex = IGF_MapBitRateToIndex( total_brate, bwidth, element_mode, rf_mode ); + + if ( bitRateIndex != IGF_BITRATE_UNKNOWN ) + { + retValue = 1; /* no error */ + + switch ( bitRateIndex ) + { + case IGF_BITRATE_WB_13200_CPE: + bitRateIndex = IGF_BITRATE_WB_9600; + break; + case IGF_BITRATE_WB_16400_CPE: + bitRateIndex = IGF_BITRATE_WB_9600; + break; + case IGF_BITRATE_SWB_13200_CPE: + bitRateIndex = IGF_BITRATE_SWB_9600; + break; + case IGF_BITRATE_SWB_16400_CPE: + bitRateIndex = IGF_BITRATE_SWB_13200; + break; + case IGF_BITRATE_SWB_24400_CPE: + bitRateIndex = IGF_BITRATE_SWB_16400; + break; + case IGF_BITRATE_FB_24400_CPE: + bitRateIndex = IGF_BITRATE_FB_16400; + break; + case IGF_BITRATE_SWB_32000_CPE: + bitRateIndex = IGF_BITRATE_SWB_24400; + break; + case IGF_BITRATE_FB_32000_CPE: + bitRateIndex = IGF_BITRATE_FB_24400; + break; + case IGF_BITRATE_FB_48000_CPE: + case IGF_BITRATE_FB_64000_CPE: + bitRateIndex = IGF_BITRATE_FB_32000; + break; + } + + switch ( bitRateIndex ) + { + case IGF_BITRATE_WB_9600: + case IGF_BITRATE_RF_WB_13200: + case IGF_BITRATE_SWB_9600: + case IGF_BITRATE_SWB_13200: + case IGF_BITRATE_RF_SWB_13200: + case IGF_BITRATE_SWB_16400: + case IGF_BITRATE_SWB_24400: + case IGF_BITRATE_SWB_32000: + case IGF_BITRATE_SWB_48000: + case IGF_BITRATE_SWB_64000: + *cf_se00 = cf_se00_tab; + *cf_se01 = cf_se01_tab[bitRateIndex]; + *cf_off_se01 = cf_off_se01_tab[bitRateIndex]; + *cf_se02 = &cf_se02_tab[bitRateIndex][0][0]; + *cf_off_se02 = &cf_off_se02_tab[bitRateIndex][0]; + *cf_se10 = &cf_se10_tab[0]; + *cf_off_se10 = cf_off_se10_tab; + *cf_se11 = &cf_se11_tab[0][0][0]; + *cf_off_se11 = &cf_off_se11_tab[0][0]; + break; + case IGF_BITRATE_FB_16400: + case IGF_BITRATE_FB_24400: + case IGF_BITRATE_FB_32000: + bitRateIndex = bitRateIndex - IGF_BITRATE_FB_16400 + IGF_BITRATE_SWB_16400; + *cf_se00 = cf_se00_tab; + *cf_se01 = cf_se01_tab[bitRateIndex]; + *cf_off_se01 = cf_off_se01_tab[bitRateIndex]; + *cf_se02 = &cf_se02_tab[bitRateIndex][0][0]; + *cf_off_se02 = &cf_off_se02_tab[bitRateIndex][0]; + *cf_se10 = &cf_se10_tab[0]; + *cf_off_se10 = cf_off_se10_tab; + *cf_se11 = &cf_se11_tab[0][0][0]; + *cf_off_se11 = &cf_off_se11_tab[0][0]; + break; + case IGF_BITRATE_FB_48000: + case IGF_BITRATE_FB_64000: + bitRateIndex = bitRateIndex - IGF_BITRATE_FB_48000 + IGF_BITRATE_SWB_48000; + *cf_se00 = cf_se00_tab; + *cf_se01 = cf_se01_tab[bitRateIndex]; + *cf_off_se01 = cf_off_se01_tab[bitRateIndex]; + *cf_se02 = &cf_se02_tab[bitRateIndex][0][0]; + *cf_off_se02 = &cf_off_se02_tab[bitRateIndex][0]; + *cf_se10 = &cf_se10_tab[0]; + *cf_off_se10 = cf_off_se10_tab; + *cf_se11 = &cf_se11_tab[0][0][0]; + *cf_off_se11 = &cf_off_se11_tab[0][0]; + break; + case IGF_BITRATE_FB_96000: + case IGF_BITRATE_FB_128000: + case IGF_BITRATE_FB_80000_CPE: + case IGF_BITRATE_FB_96000_CPE: + case IGF_BITRATE_FB_128000_CPE: + bitRateIndex = IGF_BITRATE_SWB_48000; + *cf_se00 = cf_se00_tab; + *cf_se01 = cf_se01_tab[bitRateIndex]; + *cf_off_se01 = cf_off_se01_tab[bitRateIndex]; + *cf_se02 = &cf_se02_tab[bitRateIndex][0][0]; + *cf_off_se02 = &cf_off_se02_tab[bitRateIndex][0]; + *cf_se10 = &cf_se10_tab[0]; + *cf_off_se10 = cf_off_se10_tab; + *cf_se11 = &cf_se11_tab[0][0][0]; + *cf_off_se11 = &cf_off_se11_tab[0][0]; + break; + case IGF_BITRATE_SWB_48000_CPE: + bitRateIndex = IGF_BITRATE_SWB_16400; + *cf_se00 = cf_se00_tab; + *cf_se01 = cf_se01_tab[bitRateIndex]; + *cf_off_se01 = cf_off_se01_tab[bitRateIndex]; + *cf_se02 = &cf_se02_tab[bitRateIndex][0][0]; + *cf_off_se02 = &cf_off_se02_tab[bitRateIndex][0]; + *cf_se10 = &cf_se10_tab[0]; + *cf_off_se10 = cf_off_se10_tab; + *cf_se11 = &cf_se11_tab[0][0][0]; + *cf_off_se11 = &cf_off_se11_tab[0][0]; + break; + case IGF_BITRATE_SWB_64000_CPE: + case IGF_BITRATE_SWB_80000_CPE: + case IGF_BITRATE_SWB_96000_CPE: + bitRateIndex = IGF_BITRATE_SWB_48000; /*bitRateIndex-IGF_BITRATE_SWB_56000+IGF_BITRATE_SWB_48000;*/ + *cf_se00 = cf_se00_tab; + *cf_se01 = cf_se01_tab[bitRateIndex]; + *cf_off_se01 = cf_off_se01_tab[bitRateIndex]; + *cf_se02 = &cf_se02_tab[bitRateIndex][0][0]; + *cf_off_se02 = &cf_off_se02_tab[bitRateIndex][0]; + *cf_se10 = &cf_se10_tab[0]; + *cf_off_se10 = cf_off_se10_tab; + *cf_se11 = &cf_se11_tab[0][0][0]; + *cf_off_se11 = &cf_off_se11_tab[0][0]; + break; + case IGF_BITRATE_UNKNOWN: + default: + assert( 0 ); + } + } + + return retValue; +} diff --git a/lib_com/index_pvq_opt.c b/lib_com/index_pvq_opt.c new file mode 100644 index 0000000000000000000000000000000000000000..b14fd8fa37980476b6f18e4bc68d687fdc6ded25 --- /dev/null +++ b/lib_com/index_pvq_opt.c @@ -0,0 +1,1239 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include "options.h" +#include +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * LOCAL DEFINITIONS + *-------------------------------------------------------------------*/ + +#define N_OPT 5 /* complexity setting, direct functional calculation limit */ +#define TABLE_LIM_OPT 96 /* odd divisor table recursion limit setting, due to dim 6 */ + +/* local typedefs for optimized pvq indexing, used only in this c-file to vectorize common function calls for c-code clarity */ +typedef void ( *VEC2INDFUNCM )( const int16_t *, int16_t *, uint32_t *, uint32_t * ); +typedef uint32_t ( *NFUNCM )( int16_t ); +typedef uint32_t ( *H_FUNCM )( uint32_t ); +typedef void ( *IND2VECFUNCM )( int16_t, int16_t, uint32_t, int16_t * ); +typedef void ( *NDIM_FUNCM )( int16_t, int16_t, uint32_t, int16_t * ); + +/* local constants for indexing functions c-code clarity */ +#ifndef ONE_U + +#define ZERO 0 +#define ONE 1 +#define ONE_U 1u +#define TWO 2 +#define SIGNBIT 0x80000000u + +#define MAXBIT 0x40000000L /* if Word32 */ +#define MINNEG 0xffffffffL + +#define UDIVBY3 2863311531U + + +/*-------------------------------------------------------------------* + * local_norm_l_opt + * + * rewritten version of STL norm_l for integer fixed point normalization + * in floating point c-code. + *-------------------------------------------------------------------*/ + +/*! r: shifts needed for normalization */ +static int16_t local_norm_l_opt( + int32_t l32var /* i/o: signed 32-bit input value */ +) +{ + int16_t l32res; + +#define WMC_TOOL_SKIP + + if ( l32var == (int32_t) MINNEG ) + { + return ( 32 - ONE ); + } + else + { + if ( l32var == ZERO ) + { + return ZERO; + } + else + { + if ( l32var < ZERO ) + { + l32var = ~l32var; + } + + for ( l32res = ZERO; l32var < (int32_t) MAXBIT; l32res++ ) + { + l32var <<= ONE; + } + } + } +#undef WMC_TOOL_SKIP + + return ( l32res ); +} + + +/*-------------------------------------------------------------------* + * floor_sqrt_exact() + * returns x = floor(sqrt(input)); where (x*x) <= input + *-------------------------------------------------------------------*/ + +/*! r: floor(sqrt(input)) */ +uint32_t floor_sqrt_exact( + const uint32_t input /* i : unsigned input [0.. UINT_MAX/4] */ +) +{ + double _tmp; + uint32_t x; + if ( input == ZERO ) + { + return ZERO; + } + + _tmp = (double) input; + x = (uint32_t) ( sqrt( _tmp ) ); /* floor is a part of the cast */ + + return x; +} + +/*-------------------------------------------------------------------* + * f_odd_exact_div_opt() + * + * find 1/(den1*2+1) * ( num1p*num2p - num3) , + * if the result is known a priori to be exactly a 32bit unsigned integer + *-------------------------------------------------------------------*/ + +/*! r: see Eq. */ +static uint32_t f_odd_exact_div_opt( + const int16_t num1p, /* i : see Eq. */ + const uint32_t num2p, /* i : see Eq. */ + const uint32_t num3, /* i : see Eq. */ + const int16_t den1 /* i : see Eq. */ +) +{ + uint32_t tmp; + tmp = exactdivodd[den1] * ( num1p * num2p - num3 ); + + return ( tmp ); +} + +/*---------------------------------------------------------------------------* + * f_even_exact_div_opt() + * + * returns (num1p*num2p - num3 )/ den1 + * if the result is known a priori to be exactly a 32bit unsigned integer + *--------------------------------------------------------------------------*/ + +/*! r: see Eq. */ +static uint32_t f_even_exact_div_opt( + const int16_t num1p, /* i : see Eq. */ + const uint32_t num2p, /* i : see Eq. range should be larger than num1p */ + const uint32_t num3, /* i : see Eq. */ + const int16_t den1 /* i : see Eq. */ +) +{ + uint32_t tmp1, oddfactor, UL_tmp; + int16_t den1_m1; + int16_t even_sh; + uint32_t UL_tmp_h; + uint64_t ULL_tmp; + + den1_m1 = den1 - ONE; /* remove top bit */ + even_sh = ( 31 ) - local_norm_l_opt( ( den1_m1 ) ^ den1 ); /* NB STL operation defined for signed positive 32 bit variable */ + oddfactor = exactdivodd[den1_m1 >> even_sh]; + even_sh -= ONE; + + ULL_tmp = (uint64_t) num1p * (uint64_t) num2p; /* use STL Mpy_32_32_uu functionality */ + UL_tmp_h = (uint32_t) ( ULL_tmp >> 32 ); /* high output from basicop */ + UL_tmp = (uint32_t) ( ULL_tmp ); /* low output from basicop */ + + if ( num3 > UL_tmp ) + { + UL_tmp_h = UL_tmp_h - ONE_U; + } + UL_tmp = ( UL_tmp - num3 ); /* can and should underflow */ + UL_tmp = ( UL_tmp_h << ( 32 - even_sh ) ) | ( UL_tmp >> even_sh ); /* bitwise OR */ + + /* use tabled modular multiplicative inverse for the odd part division */ + tmp1 = UL_tmp * oddfactor; + + return tmp1; +} + +/*-------------------------------------------------------------------* + * a_three() + *-------------------------------------------------------------------*/ + +/*! r: offset for dim 3 */ +static uint32_t a_three( + const uint32_t k_val /* i : nb unit pulses; k_val may be higher than 16 bit signed */ +) +{ + if ( k_val ) + { + return ( ONE_U + k_val * ( ( k_val - ONE_U ) << ONE ) ); + } + else + { + return ZERO; + } +} + +/*-------------------------------------------------------------------* + * a_four() + *-------------------------------------------------------------------*/ + +/*! r: offset for dim 4 */ +static uint32_t a_four( + const uint32_t k_val /* i : nb unit pulses */ +) +{ + if ( k_val ) + { + return UDIVBY3 * ( ( k_val << ONE ) * ( 4 + ( ( k_val << ONE ) - 3 ) * k_val ) - 3 ); + } + + return ZERO; +} + +/*-------------------------------------------------------------------* + * a_five() + *-------------------------------------------------------------------*/ + +/*! r: offset for dim 5 */ +static uint32_t a_five( + const uint32_t k_val /* i : nb unit pulses */ +) +{ + uint32_t offset; + + if ( k_val == 0 ) + { + offset = 0; + } + else if ( k_val == 1 ) + { + offset = 1; + } + else + { + offset = ( ONE_U + ( ( ( ( ( ( k_val - TWO ) * k_val + 5 ) * k_val - 4 ) * k_val ) * ( UDIVBY3 ) ) << ONE ) ); + } + return offset; +} + +/*-------------------------------------------------------------------* + * direct_msize() + *-------------------------------------------------------------------*/ +/*! r: Enumeration size */ +static uint32_t direct_msize( + const int16_t dim_in, /* i : Number of dimensions */ + const int16_t k_in ) /* i : Number of pulses */ +{ + uint32_t msize, k, ksq; + + msize = ONE_U; /* k==0 or dim==1, and base */ + if ( k_in ) + { + k = (uint32_t) k_in; + ksq = k * k; + switch ( dim_in ) + { + case ( 5 ): + /* k*k = 238*238 < 2^16 */ + msize += ( ( ( ksq * ( 5 + ksq ) ) * UDIVBY3 ) << ONE ); + break; + case ( 4 ): + msize = ( ( k * ( ksq + 2 ) ) * UDIVBY3 ) << TWO; + break; + case ( 3 ): + msize += ( ( ksq ) << ONE ); + break; + case ( 2 ): + msize = k << ONE; + break; + } + } + + return msize; +} + + +/*-------------------------------------------------------------------* + * initOffsets() + * + * update h_mem[0.. k_val_in+1] , with starting offsets for A+U recursion + *-------------------------------------------------------------------*/ + +static void initOffsets( + const int16_t dim_in, /* i : Number of dimensions */ + uint32_t *h_mem, /* o : offsets */ + const int16_t k_val_in /* i : Number of pulses */ +) +{ + int16_t k_val_curr, k_val_prev; + int16_t k_val; + h_mem[0] = ZERO; /* % A(=>0,k=0) */ + h_mem[1] = ONE_U; /* % A(*,k=1) */ + + if ( dim_in == 2 ) + { + for ( k_val = TWO; k_val <= k_val_in; k_val++ ) + { + h_mem[k_val] = (uint32_t) ( ( k_val << ONE ) - ONE ); /* A(2, 2 .. k ) */ + } + h_mem[k_val] = (uint32_t) ( k_val_in ); /* U(2,k+1) */ + } + else if ( dim_in == 3 ) + { + k_val_prev = ONE; + for ( k_val_curr = TWO; k_val_curr <= k_val_in; k_val_curr++ ) + { + h_mem[k_val_curr] = ( ONE_U + k_val_curr * ( k_val_prev << ONE ) ); + k_val_prev = k_val_curr; + } + h_mem[k_val_curr] = k_val_curr * k_val_prev; + } + else if ( dim_in == 4 ) + { + for ( k_val_curr = TWO; k_val_curr <= k_val_in; k_val_curr++ ) + { + h_mem[k_val_curr] = UDIVBY3 * ( ( k_val_curr << ONE ) * ( 4 + ( ( k_val_curr << ONE ) - 3 ) * k_val_curr ) - 3 ); + } + h_mem[k_val_curr] = ( UDIVBY3 * ( ( k_val_curr << ONE ) * ( 4 + ( ( k_val_curr << ONE ) - 3 ) * k_val_curr ) - 3 ) ) >> 1; + } + + return; +} + + +/*-------------------------------------------------------------------* + * a_fwd() + * + * create offsets for A(n,k) from lower A(n-1,k) + *-------------------------------------------------------------------*/ + +static void a_fwd( + uint32_t *a_in, /* i/o: offsets */ + const int16_t n_items /* i : items, k's */ +) +{ + uint32_t a_1; + int16_t i, i_prev; + uint32_t a_in0; /* i : start column value */ + + a_in0 = ONE_U; + i_prev = ZERO; + for ( i = ONE; i <= n_items; i++ ) /*basic A fwd row recursion */ + { + a_1 = a_in0 + a_in[i_prev] + a_in[i]; /* a_in addressed in at least two locations */ + a_in[i_prev] = a_in0; + a_in0 = a_1; + i_prev = i; /* no real need to count as it is a ptr update */ + } + a_in[i_prev] = a_in0; + + return; +} + +/*-------------------------------------------------------------------* + * a_bwd() + * + * create offsets for A(n,k) from higher A(n+1,k) + *-------------------------------------------------------------------*/ + +static void a_bwd( + uint32_t *a_in, /* i/o: offsets */ + const int16_t n_items /* i : n_items */ +) +{ + uint32_t a_1; + uint32_t a_in0; + int16_t i; + int16_t i_prev; + + a_in0 = ZERO; + i_prev = ZERO; + for ( i = ONE; i <= n_items; i++ ) /*basic A reverse row recursion */ + { + a_1 = a_in[i] - a_in0 - a_in[i_prev]; + a_in[i_prev] = a_in0; + a_in0 = a_1; + i_prev = i; + } + a_in[i_prev] = a_in0; + + return; +} + +/*-------------------------------------------------------------------* + * direct_row_A2U_rec_calc() + * + * + *-------------------------------------------------------------------*/ + +static uint32_t direct_row_A2U_rec_calc( + const int16_t dim_in, /* i : Number of dimensions */ + const int16_t k_val_in, /* i : Number of pulses */ + const uint32_t a_km2, /* i : Recursion for k-2 (see Eq below) */ + const uint32_t a_km1 /* i : Recursion for k-1 (see Eq below) */ +) +{ + + /* U(n,k) = (A(n,k-2)-1)/2 + ((2*n-1)*A(n,k-1) - A(n,k-2) )/2*(k-1) */ + /* U(n,k) = floor(A(n,k-2)/2) + (n*A(n,k-1) - floor(A(n,k-1)/2) - floor(A(n,k-2)/2) +1 )/(k-1) */ + /* U(n,k) = floor(A(n,k-2)/2) + (n*A(n,k-1) - (floor(A(n,k-1)/2) + floor(A(n,k-2)/2) +1) ) /(k-1) */ + + uint32_t km2_size, result; + int16_t divisor; + + divisor = k_val_in - ONE; + km2_size = ( a_km1 >> ONE ) + ( a_km2 >> ONE ) + ONE_U; + + if ( divisor & ONE ) + { + /* odd */ + result = ( ( a_km2 >> ONE ) + f_odd_exact_div_opt( dim_in, a_km1, km2_size, divisor >> ONE ) ); + } + else + { + /* even divisor */ + result = ( ( a_km2 >> ONE ) + f_even_exact_div_opt( dim_in, a_km1, km2_size, divisor ) ); + } + + return result; +} + +/*-------------------------------------------------------------------* + * a_u_fwd() + * + * + *-------------------------------------------------------------------*/ + +static void a_u_fwd( + uint32_t *a_u_in, /* o : auxiliary array a_u */ + const int16_t k_val_in, /* i : number of pulses */ + const int16_t mem_size_m1 /* i : length of a_u_in */ +) +{ + uint32_t u_kp1_prev; + uint32_t a_k_prev; + + /* mem_size_m1 = 1 + k_val_in */ + u_kp1_prev = a_u_in[mem_size_m1]; /* previous n U (n,k+1) value*/ + a_k_prev = a_u_in[k_val_in]; /* previous n A(n,k) value*/ + + a_fwd( &a_u_in[ONE], k_val_in ); /* a_u_in[k==ZERO] = zero if n>0 */ + + /* low dynamic last offset entry mixed recursion */ + /* used for size calculation */ + /* U(n,k+1) = 1 + U(n-1,k+1) + U(n-1,k) + U(n,k) */ + /* U(n,k+1) = 1 + U(n-1,k+1) + (A(n-1,k)-1)/2 + (A(n,k)-1)/2 */ + /* Note, A(n,k) always odd for k>0, subtracted one always shifted out */ + /* assert(a_k_prev>0, a_k-curr>0) */ + + a_u_in[mem_size_m1] = ONE_U + u_kp1_prev + ( a_k_prev >> ONE ) + ( a_u_in[k_val_in] >> ONE ); + + return; +} + +/*-------------------------------------------------------------------* + * nm_h_prep_opt() + * + * find and return N_MPVQ(n,k) and also offsets A(n, 0 to k ) and U(n,k+1). + *-------------------------------------------------------------------*/ + +/*! r: msize for dim */ +static uint32_t nm_h_prep_opt( + const int16_t dim_in, /* i : dimension */ + int16_t k_val_in, /* i : nb unit pulses */ + uint32_t *h /* o : A/U offsets array */ +) +{ + int16_t mem_size_m1, k_val; + int16_t dim_tmp, d_start; + uint32_t h_saveA, h_saveB; /* registers for alternating A(n,k-1), A(n,k-2)*/ + int16_t numDsub1; /* k_val_curr, k_val_prev*/ + + mem_size_m1 = k_val_in + ONE; + + if ( k_val_in > TABLE_LIM_OPT ) + { + if ( dim_in >= 3 ) + { + d_start = 3; + } + else + { + d_start = 2; + } + initOffsets( d_start, h, k_val_in ); + + for ( dim_tmp = d_start; dim_tmp < dim_in; dim_tmp++ ) + { + a_u_fwd( h, k_val_in, mem_size_m1 ); + } + } + else + { + h[ZERO] = ZERO; + h[ONE] = ONE_U; + numDsub1 = ( ( dim_in << ONE ) - ONE ); + h[TWO] = numDsub1; + + /* interleaved odd even calls */ + h_saveA = numDsub1; + h_saveB = ONE_U; + for ( k_val = 3; k_val < ( mem_size_m1 ); k_val++ ) + { + /* A(n,k) = A(n,k-2) + ((2*n-1)*A(n,k-1)-A(n,k-2)) /(k-1) */ + /* first odd k, even divisor */ + h_saveB += f_even_exact_div_opt( numDsub1, h_saveA, h_saveB, k_val - ONE ); + h[k_val] = h_saveB; + + k_val++; /* next even k, odd divisor */ + if ( k_val >= ( mem_size_m1 ) ) + { + break; + } + h_saveA += f_odd_exact_div_opt( numDsub1, h_saveB, h_saveA, ( k_val - ONE ) >> ONE ); + h[k_val] = h_saveA; + } + /* always do the last (k+1) recursion based on U(n,k+1) = func( A(n-2,k+1), A(n-1,k+1) ) */ + h[mem_size_m1] = direct_row_A2U_rec_calc( dim_in, mem_size_m1, h[mem_size_m1 - 2], h[k_val_in] ); + } + + /* N_MPVQ(n,k) = 1 + U(n,k+1) + U(n,k) = 1 + U(n,k+1) + (A(n,k)-1)/2; */ /* A(n,k) always odd */ + return ( ONE + h[mem_size_m1] + ( h[k_val_in] >> ONE ) ); +} + + +/*-------------------------------------------------------------------* + * find_amp_split_offset_func_mem() + * + * find first offset in range 0..k_val_in that is less than ind_in + * using a tree search with direct function calls or memory iteration + *-------------------------------------------------------------------*/ + +static int16_t find_amp_split_offset_func_mem( + const uint32_t ind_in, /* i : input index */ + const int16_t k_val_in, /* i : number of pulses */ + H_FUNCM h_func_ptr, /* i : offset function pointer */ + const uint32_t *const h_mem, /* i : offsets */ + uint32_t *tmp_offset /* o : offset found */ +) +{ + int16_t not_ready, low, high; + int16_t k_test; + + k_test = -1; /* init to eliminate compiler warning */ + low = 0; + high = k_val_in; + /* split over A(n,k)= h_mem(k), or use direct function */ + not_ready = ONE; + while ( not_ready ) + { + k_test = ( low + high ) >> ONE; /*% split range in half */ + + if ( h_mem ) + { + *tmp_offset = h_mem[k_test]; /* memory search */ + } + else + { + *tmp_offset = ( *h_func_ptr )( (uint32_t) k_test ); /* function search. NB only line difference to the memory search*/ + } + + if ( ind_in > *tmp_offset ) + { + if ( k_test < high ) + { + low = 1 + k_test; + } + else + { + not_ready = 0; + } + } + else + { + if ( *tmp_offset == ind_in ) + { + not_ready = 0; + } + else + { + high = k_test - 1; + } + } + } + + return k_test; +} + +/*-------------------------------------------------------------------* + * get_lead_sign() + * + * update index and return leading sign + *-------------------------------------------------------------------*/ + +/*! r: leading sign [-1,1] */ +static int16_t get_lead_sign( + uint32_t *ind /* i/o: Current index */ +) +{ + int16_t leading_sign; + + if ( ( *ind ) & ONE_U ) /* leading sign stored in LSB */ + { + leading_sign = -1; + } + else + { + leading_sign = 1; + } + ( *ind ) = ( *ind ) >> ONE; + + return leading_sign; +} + + +/*-------------------------------------------------------------------* + * mind2vec_one() + *-------------------------------------------------------------------*/ + +static void mind2vec_one( + const int16_t k_val_in, /* i : nb unit pulses */ + const int16_t leading_sign, /* i : leading sign */ + const uint32_t ind, /* i : index */ + int16_t *vec_out /* o : pulse train */ +) +{ + + vec_out[ind] = ( leading_sign * k_val_in ); /* NB input k_val_in can be zero */ + + return; +} + +/*-------------------------------------------------------------------* + * mind2vec_two() + *-------------------------------------------------------------------*/ + +static void mind2vec_two( + const int16_t k_val_in, /* i : nb unit pulses */ + const int16_t leading_sign, /* i : leading sign */ + const uint32_t ind_in, /* i : index */ + int16_t *vec_out /* o : pulse train */ +) +{ + uint32_t ind_tmp; + int16_t val1; + + if ( k_val_in > 0 ) /* k_val_in check */ + { + if ( ind_in == 0 ) + { + vec_out[0] = ( leading_sign * k_val_in ); + vec_out[1] = 0; + } + else if ( ind_in == ( (uint32_t) ( k_val_in << ONE ) - ONE_U ) ) + { + vec_out[0] = 0; + vec_out[1] = ( leading_sign * k_val_in ); + } + else + { + ind_tmp = ind_in - ONE_U; + val1 = (int16_t) ( ONE_U + ( ind_tmp >> ONE ) ); + vec_out[0] = leading_sign * ( k_val_in - val1 ); + + if ( ind_tmp & ONE_U ) + { + vec_out[1] = -val1; + } + else + { + vec_out[1] = val1; + } + } + } + + return; +} + +/*-------------------------------------------------------------------* + * setval_update_sign() + * + * + *-------------------------------------------------------------------*/ + +/*! r: max k */ +static int16_t setval_update_sign( + const int16_t k_delta, /* i : Delta-K */ + int16_t k_max_local, /* i/o: Maximum K */ + int16_t *leading_sign, /* o : Leading sign */ + uint32_t *ind_in, /* i/o: Index/index with leading sign excluded */ + int16_t *vec_out /* o : Output vector */ +) +{ + if ( k_delta != 0 ) + { + *vec_out = ( *leading_sign ) * k_delta; + *leading_sign = get_lead_sign( ind_in ); + k_max_local = k_max_local - k_delta; + } + + return k_max_local; +} + +/*-------------------------------------------------------------------* + * mind2vec_three() + *-------------------------------------------------------------------*/ + +static void mind2vec_three( + int16_t k_max_local, /* i : nb unit pulses */ + int16_t leading_sign, /* i : leading sign */ + uint32_t ind_in, /* i : index */ + int16_t *vec_out /* o : pulse train */ +) +{ + int16_t k_delta; + uint32_t acc_val; + + /* + use direct calculation of first amplitude + (to find amplitudes faster than using split or linear iteration) + */ + if ( ind_in == 0 ) + { + vec_out[0] = leading_sign * k_max_local; + } + else + { + acc_val = ( ( ONE_U + floor_sqrt_exact( ( ind_in << ONE ) - ONE_U ) ) >> ONE ); /* in BASOP use approximation + search for exact sqrt )*/ + + k_delta = k_max_local - (int16_t) acc_val; + ind_in -= a_three( acc_val ); /* remove amplitude offset A(n,k_acc) */ + + k_max_local = setval_update_sign( k_delta, k_max_local, &leading_sign, &ind_in, vec_out ); + + mind2vec_two( k_max_local, leading_sign, ind_in, &vec_out[1] ); + } + + return; +} + +/*-------------------------------------------------------------------* + * mind2vec_direct() + * + * general function for direct decoding using direct functions + * (no memory recursion) + *-------------------------------------------------------------------*/ + +static void mind2vec_direct( + int16_t k_max_local, /* i : nb unit pulses */ + int16_t leading_sign, /* i : leading sign */ + uint32_t ind, /* i : index */ + H_FUNCM h_func_ptr, /* i : offset function */ + NDIM_FUNCM nd_func_ptr, /* i : next dimension function */ + int16_t *vec_out /* o : pulse train */ +) +{ + int16_t k_delta, k_test = 0; + uint32_t tmp_offset; + + if ( ind == 0 ) + { + vec_out[0] = leading_sign * k_max_local; + } + else + { + k_test = find_amp_split_offset_func_mem( ind, k_max_local, h_func_ptr, NULL, &tmp_offset ); + + k_delta = k_max_local - k_test; + ind = ind - tmp_offset; /* % remove amplitude offset A(n,k_acc) */ + k_max_local = setval_update_sign( k_delta, k_max_local, &leading_sign, &ind, vec_out ); + ( *nd_func_ptr )( k_max_local, leading_sign, ind, &vec_out[1] ); + } + + return; +} + +/*-------------------------------------------------------------------* + * mind2vec_four() + *-------------------------------------------------------------------*/ + +static void mind2vec_four( + int16_t k_val_in, /* i : nb unit pulses */ + int16_t leading_sign, /* i : leading sign */ + uint32_t ind_in, /* i : index */ + int16_t *vec_out /* o : pulse train */ +) +{ + mind2vec_direct( k_val_in, leading_sign, ind_in, a_four, mind2vec_three, vec_out ); + + return; +} + +/*-------------------------------------------------------------------* + * mind2vec_five() + *-------------------------------------------------------------------*/ + +static void mind2vec_five( + int16_t k_val_in, /* i : nb unit pulses */ + int16_t leading_sign, /* i : leading sign */ + uint32_t ind_in, /* i : index */ + int16_t *vec_out /* o : pulse train */ +) +{ + mind2vec_direct( k_val_in, leading_sign, ind_in, a_five, mind2vec_four, vec_out ); + + return; +} + + +/*-------------------------------------------------------------------* + * mind2vec() + *-------------------------------------------------------------------*/ + +static void mind2vec( + int16_t dim_in, /* i : dimension */ + int16_t k_max_local, /* i : nb unit pulses */ + int16_t leading_sign, /* i : leading sign */ + uint32_t ind, /* i : index */ + int16_t *vec_out, /* o : pulse train */ + uint32_t *h_in /* i : offset vector A=1+2U */ +) +{ + int16_t pos; + int16_t k_acc, k_delta; + uint32_t tmp_offset; + + k_acc = k_max_local; + + pos = ZERO; + while ( pos < dim_in ) /* first to last position decoding */ + { + if ( ind == 0 ) + { + vec_out[pos] = leading_sign * k_max_local; + break; /* "fast" recursion exit */ + } + else + { + { + /* linear magnitude search */ + k_acc = k_max_local; + tmp_offset = h_in[k_acc]; + while ( tmp_offset > ind ) + { + k_acc = k_acc - 1; + tmp_offset = h_in[k_acc]; + } + } + k_delta = k_max_local - k_acc; /* amplitude decoding */ + } + ind = ind - tmp_offset; /* remove amplitude index offset A(n,k_acc) */ + + k_max_local = setval_update_sign( k_delta, k_max_local, &leading_sign, &ind, &vec_out[pos] ); + + /* move from A(n,kmax) to A(n-1, k_max_local), */ + a_bwd( h_in, k_max_local + 1 ); /* [0..k_max_local], no need to calculate U(n,k_max_local+1) in index decoding */ + pos = pos + 1; + } + + return; +} + + +/*-------------------------------------------------------------------* + * vec2mind_one() + *-------------------------------------------------------------------*/ + +static void vec2mind_one( + const int16_t *vec_in, /* i : PVQ abs pulse train */ + int16_t *k_val_out_ptr, /* o : number of unit pulses */ + uint32_t *next_sign_ind, /* i/o: next sign ind */ + uint32_t *ind /* o : MPVQ index */ +) +{ + *k_val_out_ptr = -1; /* just to avoid compiler warnings */ + + *ind = ZERO; + /* *k_val_out_ptr = (int16_t)abs(*vec_in); */ /* dim==1, function not called recursively */ + *next_sign_ind = (uint32_t) ( *vec_in < ZERO ); /* single sign always pushed out of MPVQ */ + return; +} + +/*-------------------------------------------------------------------* + * vec2mind_two() + *-------------------------------------------------------------------*/ + +static void vec2mind_two( + const int16_t *vec_in, /* i : PVQ pulse train */ + int16_t *k_val_out_ptr, /* o : number of unit pulses */ + uint32_t *next_sign_ind, /* i/o: next sign ind */ + uint32_t *ind /* o : MPVQ index */ +) +{ + uint32_t lead_sign_ind; + int16_t abs0, abs1, abs01; + + abs0 = (int16_t) abs( vec_in[0] ); + abs1 = (int16_t) abs( vec_in[1] ); + + abs01 = abs0 + abs1; + *k_val_out_ptr = abs01; + + if ( abs01 == 0 ) /* zeroes can happen in a recursive encoding call */ + { + *next_sign_ind = SIGNBIT; + *ind = ZERO; + } + else + { + *next_sign_ind = 0; + if ( abs1 == 0 ) + { + *ind = ZERO; + } + else if ( abs0 == 0 ) + { + *ind = (uint32_t) ( abs1 << ONE ) - ONE_U; + *next_sign_ind = 1; + } + else + { + lead_sign_ind = (uint32_t) ( vec_in[1] < 0 ); /*% sign always shifted to first pos */ + *ind = ONE_U + ( (uint32_t) ( abs1 - 1 ) << ONE ) + lead_sign_ind; + } + *next_sign_ind = (uint32_t) ( vec_in[*next_sign_ind] < 0 ); + } + + return; +} + + +/*-------------------------------------------------------------------* + * vec2mind_gen345( vec_in kval, next_dim_func, offset_func,....) + * generic call saves PROM , + *-------------------------------------------------------------------*/ + +static void vec2mind_gen345( + const int16_t *vec_in, /* i : PVQ abs pulse train */ + int16_t *k_val_out_ptr, /* o : number of unit pulses */ + uint32_t *next_sign_ind, /* i/o: next sign ind */ + uint32_t *index, /* o : MPVQ index */ + VEC2INDFUNCM vec2indfunc_ptr, /* i : */ + H_FUNCM a_func_ptr /* i : offset function */ +) +{ + int16_t tmp_val; + + tmp_val = vec_in[ZERO]; + ( *vec2indfunc_ptr )( &vec_in[ONE], k_val_out_ptr, next_sign_ind, index ); + + if ( ( ( *next_sign_ind & SIGNBIT ) == 0 && tmp_val != 0 ) != ZERO ) + { + *index = ( *index << ONE ) + *next_sign_ind; + } + + if ( tmp_val != 0 ) /* push sign */ + { + *next_sign_ind = (uint32_t) ( tmp_val < 0 ); + } + + *index += ( *a_func_ptr )( (uint32_t) *k_val_out_ptr ); + if ( tmp_val > 0 ) + { + *k_val_out_ptr += tmp_val; + } + else + { + *k_val_out_ptr -= tmp_val; + } + + return; +} + + +/*-------------------------------------------------------------------* + * vec2mind_three() + *-------------------------------------------------------------------*/ + +static void vec2mind_three( + const int16_t *vec_in, /* i : PVQ pulse train */ + int16_t *k_val_out_ptr, /* o : number of unit pulses */ + uint32_t *next_sign_ind, /* i/o: next sign ind */ + uint32_t *index /* o : MPVQ index */ +) +{ + vec2mind_gen345( vec_in, k_val_out_ptr, next_sign_ind, index, vec2mind_two, a_three ); + + return; +} + +/*-------------------------------------------------------------------* + * vec2mind_four() + *-------------------------------------------------------------------*/ + +static void vec2mind_four( + const int16_t *vec_in, /* i : PVQ pulse train */ + int16_t *k_val_out_ptr, /* o : number of unit pulses */ + uint32_t *next_sign_ind, /* i/o: next sign ind */ + uint32_t *index /* o : MPVQ index */ +) +{ + vec2mind_gen345( vec_in, k_val_out_ptr, next_sign_ind, index, vec2mind_three, a_four ); + + return; +} + +/*-------------------------------------------------------------------* + * vec2mind_five() + *-------------------------------------------------------------------*/ + +static void vec2mind_five( + const int16_t *vec_in, /* i : PVQ abs pulse train */ + int16_t *k_val_out_ptr, /* o : number of unit pulses */ + uint32_t *next_sign_ind, /* i/o: next sign ind */ + uint32_t *index /* o : MPVQ index */ +) +{ + vec2mind_gen345( vec_in, k_val_out_ptr, next_sign_ind, index, vec2mind_four, a_five ); + + return; +} + + +/*-------------------------------------------------------------------* + * vec2mind() + *-------------------------------------------------------------------*/ + +static void vec2mind( + int16_t dim_in, /* i : dim */ + int16_t k_val_in, /* i : number of unit pulses */ + const int16_t *vec_in, /* i : PVQ pulse train */ + uint32_t *next_sign_ind, /* o : pushed leading sign */ + uint32_t *index, /* o : MPVQ index */ + uint32_t *N_MPVQ_ptr, /* o : size(N_MPVQ(dim,K_val_in))*/ + uint32_t *h_mem /* o : offsets */ +) +{ + int16_t pos, mem_size_m1; + int16_t k_val_acc; + int16_t tmp_val; + + mem_size_m1 = k_val_in + ONE; + + *next_sign_ind = SIGNBIT; /* % should always be 0 or 1 out, highest bit set signals no sign found yet*/ + + pos = dim_in - 2; /* % address 2nd last sample */ + vec2mind_two( &vec_in[pos], &k_val_acc, next_sign_ind, index ); + initOffsets( 3, h_mem, k_val_in ); + + for ( pos--; pos >= 0; pos-- ) + { + /* + % Check if the leading sign 'bit' is to be added + */ + tmp_val = vec_in[pos]; + if ( ( ( *next_sign_ind & SIGNBIT ) == 0 && ( tmp_val != 0 ) ) ) + { + *index = ( *index << ONE ) + ( *next_sign_ind ); + } + + /* % push sign fwd, for encoding in the next non_zero position */ + if ( tmp_val != 0 ) + { + *next_sign_ind = (uint32_t) ( tmp_val < 0 ); + } + + /*% add indexing offset up to this reverse (r_l) accumulated amplitude point */ + *index += h_mem[k_val_acc]; /* % k_val_acc==0 ==>0 */ + + k_val_acc += (int16_t) abs( tmp_val ); /*% now increase acc k value for next N */ + + if ( pos ) + { + a_u_fwd( h_mem, k_val_in, mem_size_m1 ); + /*% update A(n,k=1:k_val_in) and U(n,k_val_in+1), NB here (k_val_in + 2 elements always has to be updated */ + } + } + + /* size is needed for the subseqent arithmetic encoding/transmission of the index. */ + /* use relation N_MPVQ(n,K) = 1 + (A(n, K)-1)/2 + U(n, 1 + K) */ + /* = N_MPVQ(n,K) = 1 + (A(n, K)>>1) + U(n, 1 + K), as A(n,K) is odd) */ + + *N_MPVQ_ptr = ONE_U + ( h_mem[k_val_acc] >> ONE ) + h_mem[mem_size_m1]; /* total size size */ + + return; +} + +/*--------------------------------------------------------------------------* + * mpvq_encode_vec() + * + * returns struct with leading sign index, MPVQ-index, dim and N_MPVQ + *-------------------------------------------------------------------------*/ + +/*! r: leading_sign_index, index, size, k_val */ +PvqEntry mpvq_encode_vec( + const int16_t *vec_in, /* i : signed pulse train */ + const int16_t dim_in, /* i : dimension */ + int16_t k_val_local /* i/o: nb unit pulses */ +) +{ + PvqEntry result; + uint32_t h_mem[1 + KMAX_NON_DIRECT + 1]; /* allocate max offset memory for dim 6 */ /* OPT: actually only 1+k_val_in+1 needed ) */ + uint32_t lead_sign_ind; + const VEC2INDFUNCM vec2mind_f[1 + N_OPT] = { NULL, vec2mind_one, vec2mind_two, vec2mind_three, vec2mind_four, vec2mind_five }; /* VEC2INDFUNCM can be a static global */ + + result.k_val = k_val_local; + result.dim = dim_in; + + /* NB, k_val_local may be changed in some sub encoding routines */ + if ( dim_in > N_OPT ) /* use the generic dimension function */ + { + vec2mind( dim_in, k_val_local, vec_in, &lead_sign_ind, &result.index, &result.size, h_mem ); + } + else /* if (dim_in<=N_OPT) */ + { + ( vec2mind_f[dim_in] )( vec_in, &k_val_local, &lead_sign_ind, &result.index ); + result.size = direct_msize( dim_in, k_val_local ); /* k_val_local not used for dim==1 */ + } + result.lead_sign_ind = (int16_t) lead_sign_ind; + + return result; +} + +/*-------------------------------------------------------------------* + * get_size_mpvq_calc_offset() + * + * uint32_t h_mem[1 + KMAX +1 ]; + * example using fixed size of offset vector input help variable + *-------------------------------------------------------------------*/ + +/*! r: size, dim, k_val */ +PvqEntry get_size_mpvq_calc_offset( + const int16_t dim_in, /* i : dimension */ + const int16_t k_val_in, /* i : nb unit pulses */ + uint32_t *h_mem /* o : offsets */ +) +{ + PvqEntry entry; + + entry.dim = dim_in; + entry.k_val = k_val_in; + entry.index = 0U; /* avoid gcc warning in struct passing */ + entry.lead_sign_ind = 0; /* avoid gcc warning in struct passing */ + if ( dim_in > N_OPT ) /* non-direct solutions, use A+U relation */ + { + entry.size = nm_h_prep_opt( entry.dim, entry.k_val, h_mem ); + } + else + { + entry.size = direct_msize( dim_in, entry.k_val ); /* ues equations, h_mem is not used */ + } + + + return entry; +} + +/*-------------------------------------------------------------------* + * mpvq_decode_vec() + *-------------------------------------------------------------------*/ + +/*! r: void */ +void mpvq_decode_vec( + const PvqEntry *entry, /* i : sign_ind, index, dim, k_val */ + uint32_t *h_mem, /* i : A/U offsets */ + int16_t *vec_out /* o : pulse train */ +) +{ + int16_t i, leading_sign; + const IND2VECFUNCM mind2vec_f[N_OPT + 1] = { NULL, mind2vec_one, mind2vec_two, mind2vec_three, mind2vec_four, mind2vec_five }; /*IND2VECFUNCM vector can be static global */ + + for ( i = 0; i < entry->dim; i++ ) + { + vec_out[i] = ZERO; /* set all of short output vector to zero */ + } + + leading_sign = 1; + if ( entry->lead_sign_ind ) + { + leading_sign = -1; + } + + if ( entry->k_val != 0 ) + { + if ( entry->dim > N_OPT ) /* N_OPT */ + { + /* generic */ + mind2vec( entry->dim, entry->k_val, leading_sign, entry->index, vec_out, h_mem ); + } + else + { + /* specialized functions */ + ( mind2vec_f[entry->dim] )( entry->k_val, leading_sign, entry->index, vec_out ); + } + } + + return; +} + +#ifdef ONE_U +#undef ZERO +#undef ONE +#undef ONE_U +#undef TWO +#undef MAXBIT +#undef MINNEG +#undef SIGNBIT +#undef UDIVBY3 +#endif + +#endif diff --git a/lib_com/int_lsp.c b/lib_com/int_lsp.c new file mode 100644 index 0000000000000000000000000000000000000000..448a97e33284950b24351e05e924532d8a143e83 --- /dev/null +++ b/lib_com/int_lsp.c @@ -0,0 +1,177 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*---------------------------------------------------------------------* + * int_lsp() + * + * Find the interpolated LSP parameters for all subframes + *---------------------------------------------------------------------*/ + +void int_lsp( + const int16_t L_frame, /* i : length of the frame */ + const float lsp_old[], /* i : LSPs from past frame */ + const float lsp_new[], /* i : LSPs from present frame */ + float *Aq, /* o : LP coefficients in both subframes */ + const int16_t m, /* i : order of LP filter */ + const float *int_coeffs, /* i : interpolation coefficients */ + const int16_t Opt_AMR_WB /* i : flag indicating AMR-WB IO mode */ +) +{ + float lsp[M], fnew, fold; + int16_t i, k; + const float *pt_int_coeffs; + + if ( L_frame == L_FRAME ) + { + pt_int_coeffs = int_coeffs; + } + else /* L_frame == L_FRAME16k */ + { + pt_int_coeffs = interpol_frac_16k; + } + + for ( k = 0; k < L_frame / L_SUBFR; k++ ) + { + fnew = pt_int_coeffs[k]; + fold = (float) ( 1.0f - fnew ); + + for ( i = 0; i < m; i++ ) + { + lsp[i] = lsp_old[i] * fold + lsp_new[i] * fnew; + } + + if ( Opt_AMR_WB ) + { + isp2a( lsp, Aq, m ); + } + else + { + lsp2a_stab( lsp, Aq, m ); + } + + Aq += ( m + 1 ); + } + + return; +} + +/*---------------------------------------------------------------------* + * int_lsp4() + * + * Interpolate LSPs find the A[z] parameters for all subframes by interpolating between + * old end-frame LSPs, current mid-frame LSPs and current end-frame LSPs + *---------------------------------------------------------------------*/ + +void int_lsp4( + const int16_t L_frame, /* i : length of the frame */ + const float lsp_old[], /* i : LSPs from past frame */ + const float lsp_mid[], /* i : LSPs from mid-frame */ + const float lsp_new[], /* i : LSPs from present frame */ + float *Aq, /* o : LP coefficients in both subframes */ + const int16_t m, /* i : order of LP filter */ + int16_t relax_prev_lsf_interp /* i : relax prev frame lsf interp after erasure */ +) +{ + float lsp[M]; + int16_t i; + int16_t j; + const float *pt_int_coeffs; + + if ( L_frame == L_FRAME ) + { + if ( relax_prev_lsf_interp == 1 ) + { + pt_int_coeffs = interpol_frac_mid_relaxprev_12k8; + } + else if ( relax_prev_lsf_interp == 2 ) + { + pt_int_coeffs = interpol_frac_mid_FEC; + } + else if ( relax_prev_lsf_interp == -1 ) + { + pt_int_coeffs = interpol_frac_mid_relaxprev_pred_12k8; + } + else if ( relax_prev_lsf_interp == -2 ) + { + pt_int_coeffs = interpol_frac2_mid; + } + else + { + pt_int_coeffs = interpol_frac_mid; + } + } + else /* L_frame == L_FRAME16k */ + { + if ( relax_prev_lsf_interp == 1 ) + { + pt_int_coeffs = interpol_frac_mid_relaxprev_16k; + } + else if ( relax_prev_lsf_interp == 2 ) + { + pt_int_coeffs = interpol_frac_mid_16k_FEC; + } + else if ( relax_prev_lsf_interp == -1 ) + { + pt_int_coeffs = interpol_frac_mid_relaxprev_pred_16k; + } + else + { + pt_int_coeffs = interpol_frac_mid_16k; + } + } + + for ( j = 0; j < L_frame / L_SUBFR; j++ ) + { + for ( i = 0; i < m; i++ ) + { + lsp[i] = lsp_old[i] * ( *pt_int_coeffs ) + lsp_mid[i] * ( *( pt_int_coeffs + 1 ) ) + lsp_new[i] * ( *( pt_int_coeffs + 2 ) ); + } + pt_int_coeffs += 3; + + lsp2a_stab( lsp, Aq, m ); + + Aq += ( m + 1 ); + } + + return; +} diff --git a/lib_com/interleave_spectrum.c b/lib_com/interleave_spectrum.c new file mode 100644 index 0000000000000000000000000000000000000000..300295355adaa5cfad5980fb1da5301738ded0d1 --- /dev/null +++ b/lib_com/interleave_spectrum.c @@ -0,0 +1,205 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*--------------------------------------------------------------------------* + * interleave_spectrum() + * + * Interleave the spectrum + *--------------------------------------------------------------------------*/ + +void interleave_spectrum( + float *coefs, /* i/o: input and output coefficients */ + const int16_t length /* i : length of spectrum */ +) +{ + int16_t i, j, k; + float *p1, *p2, *p3, *p4; + float *p_out; + float coefs_out[STOP_BAND]; + int16_t sublen; + int16_t grps; + const int16_t *bw; + const int16_t *cnt; + int16_t l_frame; + + l_frame = length; + + if ( length == L_SPEC48k ) + { + bw = intl_bw_48; + cnt = intl_cnt_48; + grps = N_INTL_GRP_48; + l_frame = L_FRAME48k; + } + else if ( length == L_SPEC32k ) + { + bw = intl_bw_32; + cnt = intl_cnt_32; + grps = N_INTL_GRP_32; + } + else /* length == L_SPEC16k */ + { + bw = intl_bw_16; + cnt = intl_cnt_16; + grps = N_INTL_GRP_16; + } + + sublen = l_frame / 4; + p1 = coefs; + p2 = coefs + sublen; + p3 = coefs + sublen * 2; + p4 = coefs + sublen * 3; + p_out = coefs_out; + + for ( i = 0; i < grps; i++ ) + { + for ( j = 0; j < cnt[i]; j++ ) + { + for ( k = 0; k < bw[i]; k++ ) + { + *p_out++ = *p1++; + } + + for ( k = 0; k < bw[i]; k++ ) + { + *p_out++ = *p2++; + } + + for ( k = 0; k < bw[i]; k++ ) + { + *p_out++ = *p3++; + } + + for ( k = 0; k < bw[i]; k++ ) + { + *p_out++ = *p4++; + } + } + } + + /* For FB the interleaved spectrum is 800 samples */ + mvr2r( coefs_out, coefs, (int16_t) ( p_out - coefs_out ) ); + + return; +} + + +/*--------------------------------------------------------------------------* + * de_interleave_spectrum() + * + * Deinterleave the spectrum + *--------------------------------------------------------------------------*/ + +void de_interleave_spectrum( + float *coefs, /* i/o: input and output coefficients */ + int16_t length /* i : length of spectrum */ +) +{ + int16_t i, j, k; + float *p1, *p2, *p3, *p4; + float *p_in; + float coefs_out[L_FRAME48k]; + int16_t sublen; + int16_t grps; + const int16_t *bw; + const int16_t *cnt; + int16_t l_frame; + + l_frame = length; + + if ( length == L_SPEC48k ) + { + bw = intl_bw_48; + cnt = intl_cnt_48; + grps = N_INTL_GRP_48; + l_frame = L_FRAME48k; + } + else if ( length == L_FRAME32k ) + { + bw = intl_bw_32; + cnt = intl_cnt_32; + grps = N_INTL_GRP_32; + } + else /* length == L_FRAME16k */ + { + bw = intl_bw_16; + cnt = intl_cnt_16; + grps = N_INTL_GRP_16; + } + + set_f( coefs_out, 0, L_FRAME48k ); + + sublen = l_frame / 4; + p1 = coefs_out; + p2 = coefs_out + sublen; + p3 = coefs_out + sublen * 2; + p4 = coefs_out + sublen * 3; + p_in = coefs; + + for ( i = 0; i < grps; i++ ) + { + for ( j = 0; j < cnt[i]; j++ ) + { + for ( k = 0; k < bw[i]; k++ ) + { + *p1++ = *p_in++; + } + for ( k = 0; k < bw[i]; k++ ) + { + *p2++ = *p_in++; + } + for ( k = 0; k < bw[i]; k++ ) + { + *p3++ = *p_in++; + } + for ( k = 0; k < bw[i]; k++ ) + { + *p4++ = *p_in++; + } + } + } + + mvr2r( coefs_out, coefs, l_frame ); + + return; +} diff --git a/lib_com/interpol.c b/lib_com/interpol.c new file mode 100644 index 0000000000000000000000000000000000000000..332f34d5444ee0069cbd4bae59f791a12d10051a --- /dev/null +++ b/lib_com/interpol.c @@ -0,0 +1,77 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * interpolation() + * + * Fractional interpolation of signal at position (frac/resol) + *-------------------------------------------------------------------*/ + +/*! r: interpolated value */ +float interpolation( + const float *x, /* i : input vector */ + const float *win, /* i : interpolation window */ + const int16_t frac, /* i : fraction */ + const int16_t up_samp, /* i : upsampling factor */ + const int16_t nb_coef /* i : nb of filter coef */ +) +{ + int16_t i; + float s; + const float *x1, *x2, *c1, *c2; + + x1 = &x[0]; + x2 = &x[1]; + c1 = &win[frac]; + c2 = &win[up_samp - frac]; + s = 0.0f; + + for ( i = 0; i < nb_coef; i++ ) + { + s += ( *x1-- ) * ( *c1 ) + ( *x2++ ) * ( *c2 ); +#define WMC_TOOL_SKIP + c1 += up_samp; + c2 += up_samp; +#undef WMC_TOOL_SKIP + } + + return s; +} diff --git a/lib_com/isf_dec_amr_wb.c b/lib_com/isf_dec_amr_wb.c new file mode 100644 index 0000000000000000000000000000000000000000..49afd071fb5ac301dc5b7e02bf8dc6f54fc98aa7 --- /dev/null +++ b/lib_com/isf_dec_amr_wb.c @@ -0,0 +1,286 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "wmc_auto.h" + +/*---------------------------------------------------------------------* + * isf_dec_amr_wb() + * + * Decoding of ISF parameters in AMR-WB IO mode + *---------------------------------------------------------------------*/ + +void isf_dec_amr_wb( + Decoder_State *st, /* i/o: State structure */ + float *Aq, /* o : quantized A(z) for 4 subframes */ + float *isf_new, /* o : de-quantized ISF vector */ + float *isp_new /* o : de-quantized ISP vector */ +) +{ + int16_t i; + int16_t indice[7]; + + set_s( indice, -1, 7 ); + + /*---------------------------------* + * ISF de-quantization of SID frames + *---------------------------------*/ + + if ( st->core_brate == SID_1k75 ) + { + indice[0] = get_next_indice( st, 6 ); + indice[1] = get_next_indice( st, 6 ); + indice[2] = get_next_indice( st, 6 ); + indice[3] = get_next_indice( st, 5 ); + indice[4] = get_next_indice( st, 5 ); + + disf_ns_28b( indice, isf_new ); + + reorder_isf( isf_new, ISF_GAP, M, INT_FS_12k8 ); + + isf2isp( isf_new, isp_new, M, INT_FS_12k8 ); + + /* return if SID frame (conversion to A(z) done in the calling function) */ + return; + } + + /*-----------------------------------------------------------------* + * ISF de-quantization of all other frames + *-----------------------------------------------------------------*/ + + if ( st->core_brate == ACELP_6k60 ) + { + indice[0] = get_next_indice( st, 8 ); + indice[1] = get_next_indice( st, 8 ); + indice[2] = get_next_indice( st, 7 ); + indice[3] = get_next_indice( st, 7 ); + indice[4] = get_next_indice( st, 6 ); + + disf_2s_36b( indice, isf_new, st->mem_AR, st->mem_MA ); + } + else + { + indice[0] = get_next_indice( st, 8 ); + indice[1] = get_next_indice( st, 8 ); + indice[2] = get_next_indice( st, 6 ); + indice[3] = get_next_indice( st, 7 ); + indice[4] = get_next_indice( st, 7 ); + indice[5] = get_next_indice( st, 5 ); + indice[6] = get_next_indice( st, 5 ); + + disf_2s_46b( indice, isf_new, st->mem_AR, st->mem_MA ); + } + + reorder_isf( isf_new, ISF_GAP, M, INT_FS_12k8 ); + + /* convert quantized ISFs to ISPs */ + isf2isp( isf_new, isp_new, M, INT_FS_12k8 ); + + /*-------------------------------------------------------------------------------------* + * FEC - update adaptive mean ISF vector + *-------------------------------------------------------------------------------------*/ + + for ( i = 0; i < M; i++ ) + { + st->lsf_adaptive_mean[i] = ( st->lsfoldbfi1[i] + st->lsfoldbfi0[i] + isf_new[i] ) / 3; + } + + /*-------------------------------------------------------------------------------------* + * ISP interpolation + * A(z) calculation + *-------------------------------------------------------------------------------------*/ + + if ( st->rate_switching_reset ) + { + /*extrapolation instead of interpolation*/ + mvr2r( isp_new, st->lsp_old, M ); + mvr2r( isf_new, st->lsf_old, M ); + } + + /* ISP interpolation and A(z) calculation */ + int_lsp( L_FRAME, st->lsp_old, isp_new, Aq, M, interpol_isp_amr_wb, 1 ); + + /*------------------------------------------------------------------* + * Check ISF stability : distance between old ISF and current ISF + *------------------------------------------------------------------*/ + + st->stab_fac = lsf_stab( isf_new, st->lsf_old, 1, st->L_frame ); + + return; +} + +/*-------------------------------------------------------------------* + * disf_ns_28b() + * + * ISF de-quantizer for SID_1k75 frames (only for AMR-WB IO mode) + *-------------------------------------------------------------------*/ + +void disf_ns_28b( int16_t *indice, /* i : quantized indices (use indice[0] = -1 in the decoder) */ + float *isf_q /* o : ISF in the frequency domain (0..6400) */ +) +{ + int16_t i; + + for ( i = 0; i < 2; i++ ) + { + isf_q[i] = dico1_ns_28b[indice[0] * 2 + i]; + } + + for ( i = 0; i < 3; i++ ) + { + isf_q[i + 2] = dico2_ns_28b[indice[1] * 3 + i]; + isf_q[i + 5] = dico3_ns_28b[indice[2] * 3 + i]; + } + + for ( i = 0; i < 4; i++ ) + { + isf_q[i + 8] = dico4_ns_28b[indice[3] * 4 + i]; + isf_q[i + 12] = dico5_ns_28b[indice[4] * 4 + i]; + } + + for ( i = 0; i < M; i++ ) + { + isf_q[i] += mean_isf_noise_amr_wb[i]; + } + + return; +} + +/*-------------------------------------------------------------------* + * disf_2s_46b() + * + * ISF de-quantizer for 46b. codebooks (only for AMR-WB IO mode) + *-------------------------------------------------------------------*/ + +void disf_2s_46b( + int16_t *indice, /* i : quantized indices (use indice[0] = -1 in the decoder) */ + float *isf_q, /* o : quantized ISFs in the cosine domain */ + float *mem_AR, /* o : quantizer memory for AR model */ + float *mem_MA /* i/o: quantizer memory for MA model */ +) +{ + int16_t i; + + for ( i = 0; i < 9; i++ ) + { + isf_q[i] = dico1_isf[indice[0] * 9 + i]; + } + + for ( i = 0; i < 7; i++ ) + { + isf_q[i + 9] = dico2_isf[indice[1] * 7 + i]; + } + + for ( i = 0; i < 3; i++ ) + { + isf_q[i] += dico21_isf_46b[indice[2] * 3 + i]; + isf_q[i + 3] += dico22_isf_46b[indice[3] * 3 + i]; + isf_q[i + 6] += dico23_isf_46b[indice[4] * 3 + i]; + isf_q[i + 9] += dico24_isf_46b[indice[5] * 3 + i]; + } + + for ( i = 0; i < 4; i++ ) + { + isf_q[i + 12] += dico25_isf_46b[indice[6] * 4 + i]; + } + + for ( i = 0; i < M; i++ ) + { + mem_AR[i] = (float) ( isf_q[i] + MU_MA * mem_MA[i] ); /* Update with quantized ISF vector for AR model */ + mem_MA[i] = isf_q[i]; /* Update with quantized prediction error for MA model */ + isf_q[i] = mem_AR[i] + mean_isf_amr_wb[i]; /* Quantized ISFs */ + } + + return; +} + + +/*-------------------------------------------------------------------* + * disf_2s_36b() + * + * ISF de-quantizer for 36b. codebooks (only for AMR-WB IO mode) + *-------------------------------------------------------------------*/ + +void disf_2s_36b( + int16_t *indice, /* i : quantized indices (use indice[0] = -1 in the decoder) */ + float *isf_q, /* o : quantized ISFs in the cosine domain */ + float *mem_AR, /* i/o: quantizer memory for AR model */ + float *mem_MA /* i/o: quantizer memory for MA model */ +) +{ + int16_t i; + const float *pt_dico1; + + pt_dico1 = dico1_isf; /* Pointer of the 1st stage, 1st plit */ + + for ( i = 0; i < 9; i++ ) + { + isf_q[i] = pt_dico1[indice[0] * 9 + i]; + } + + for ( i = 0; i < 7; i++ ) + { + isf_q[i + 9] = dico2_isf[indice[1] * 7 + i]; + } + + for ( i = 0; i < 5; i++ ) + { + isf_q[i] += dico21_isf_36b[indice[2] * 5 + i]; + } + + for ( i = 0; i < 4; i++ ) + { + isf_q[i + 5] += dico22_isf_36b[indice[3] * 4 + i]; + } + + for ( i = 0; i < 7; i++ ) + { + isf_q[i + 9] += dico23_isf_36b[indice[4] * 7 + i]; + } + + for ( i = 0; i < M; i++ ) + { + mem_AR[i] = (float) ( isf_q[i] + MU_MA * mem_MA[i] ); /* Update with quantized ISF vector for AR model */ + mem_MA[i] = isf_q[i]; /* Update with quantized prediction error for MA model */ + isf_q[i] = mem_AR[i] + mean_isf_amr_wb[i]; /* Quantized ISFs */ + } + + return; +} diff --git a/lib_com/ivas_agc_com.c b/lib_com/ivas_agc_com.c new file mode 100644 index 0000000000000000000000000000000000000000..3bb4bdea2e9547843b30b6b42c14cf0b719b165c --- /dev/null +++ b/lib_com/ivas_agc_com.c @@ -0,0 +1,112 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "cnst.h" +#include "ivas_cnst.h" +#include "ivas_prot.h" +#include +#include "wmc_auto.h" +#include "prot.h" + +/*------------------------------------------------------------------------------------------* + * Local constants + *------------------------------------------------------------------------------------------*/ + +#define SQRKMAX ( 1.5f ) +#define NBITS_DIFFG ( 2 ) +#define DBSTEP ( -6.f ) /* desired dB step value in dB*/ +#define ABS_EMIN_MAX ( 3 ) +#define MAXATTEXP ( 1 ) /* the desired maximum attenuation exponent range per frame*/ + +/*-----------------------------------------------------------------------------------------* + * Function ivas_agc_initWindowFunc() + * + * Get a window function + *-----------------------------------------------------------------------------------------*/ + +void ivas_agc_initWindowFunc( + float *pWinFunc, + const int16_t length ) +{ + int16_t i; + float N; + float a; + + N = (float) ( length - 1 ); + a = 0.5f * ( 1.f - powf( 10.f, DBSTEP / 20.f ) ); + + for ( i = 0; i < length; i++ ) + { + pWinFunc[i] = 1.f + a * ( cosf( EVS_PI * i / N ) - 1.f ); + } + + return; +} + +/*-----------------------------------------------------------------------------------------* + * Function ivas_agc_calcGainParams() + * + * Calculate gain parameters + *-----------------------------------------------------------------------------------------*/ + +void ivas_agc_calcGainParams( + uint16_t *absEmin, + uint16_t *betaE, + uint16_t *maxAttExp, + const int16_t numCoeffs ) +{ + int16_t totExp; + int16_t Bm; + int16_t nbits; + + nbits = NBITS_DIFFG; + + *absEmin = max( ABS_EMIN_MAX, (uint16_t) ceilf( logf( ceilf( SQRKMAX * numCoeffs ) ) * INV_LOG_2 ) ); + + totExp = *absEmin + AGC_EMAX + 1; + *betaE = (uint16_t) ceilf( logf( totExp ) * INV_LOG_2 ); + + Bm = (uint16_t) ceilf( logf( ( AGC_EMAX + 1 + 1 ) ) * INV_LOG_2 ); + + if ( nbits > 0 ) + { + Bm = min( AGC_BITS_PER_CH - 1, NBITS_DIFFG ); + } + + *maxAttExp = ( (uint16_t) powf( 2, Bm ) ) - 2; + *maxAttExp = min( MAXATTEXP, *maxAttExp ); + + return; +} + diff --git a/lib_com/ivas_arith.c b/lib_com/ivas_arith.c new file mode 100644 index 0000000000000000000000000000000000000000..98243b0f4addacfbc7d4efb5277ac8568c96cb37 --- /dev/null +++ b/lib_com/ivas_arith.c @@ -0,0 +1,302 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "wmc_auto.h" +#include "prot.h" +#include "ivas_prot.h" +#include "stat_dec.h" + +/*-----------------------------------------------------------------------------------------* + * Function ivas_ari_start_decoding_14bits_ext_1_lfe() + * + * Start arithemetic coding + * + * Similar to ari_start_decoding_14bits(), but do not read past frame boundary. + *-----------------------------------------------------------------------------------------*/ + +void ivas_ari_start_decoding_14bits_ext_1_lfe( + Decoder_State *st, + Tastat *s, + int16_t *extra_bits_read ) +{ + int32_t val; + + if ( st->bits_frame >= ( st->next_bit_pos + cbitsnew ) ) + { + val = get_next_indice( st, cbitsnew ); + } + else + { + int16_t rem_bits; + rem_bits = st->bits_frame - st->next_bit_pos; + val = get_next_indice( st, rem_bits ); + val = ( val << ( cbitsnew - rem_bits ) ); + *extra_bits_read = *extra_bits_read + ( cbitsnew - rem_bits ); + } + + s->low = 0; + s->high = ari_q4new; + s->value = val; + + return; +} + + +/* Helper function to determine the symbol. */ +static uint16_t ivas_ari_get_symbol( + const uint16_t *p, + uint32_t range, + uint32_t cum ) +{ + uint16_t symbol; + + symbol = 0; + + while ( ( p[symbol + 1] * range ) > cum ) + { + symbol = symbol + 1; + } + + return symbol; +} + + +/*--------------------------------------------------------------- + * Function ivas_ari_decode_14bits_bit_ext_1_lfe() + * + * + *-------------------------------------------------------------*/ + +uint16_t ivas_ari_decode_14bits_bit_ext_1_lfe( + Decoder_State *st, + Tastat *s, + const uint16_t *cum_freq, + int16_t *extra_bits_read ) +{ + uint16_t symbol; + uint32_t low, high, range, value; + uint32_t cum; + + /* read s->low,high,value sequentially */ + low = s->low; + high = s->high; + value = s->value; + + range = high - low + 1; + cum = ( ( ( (uint32_t) ( value - low + 1 ) ) << stat_bitsnew ) - ( (uint32_t) 1 ) ); + + symbol = ivas_ari_get_symbol( cum_freq, range, cum ); + + high = low + mul_sbc_14bits( range, cum_freq[symbol] ) - 1; + low += mul_sbc_14bits( range, cum_freq[symbol + 1] ); + + for ( ;; ) + { + if ( high >= ari_q2new ) + { + if ( low >= ari_q2new ) + { + value -= ari_q2new; + low -= ari_q2new; + high -= ari_q2new; + } + else + { + if ( low >= ari_q1new && high < ari_q3new ) + { + value -= ari_q1new; + low -= ari_q1new; + high -= ari_q1new; + } + else + { + break; + } + } + } + low += low; + high += high + 1; + + if ( st->next_bit_pos >= st->bits_frame ) + { + value = ( value << 1 ); + *extra_bits_read = *extra_bits_read + 1; + } + else + { + value = ( value << 1 ) | get_next_indice_1( st ); + } + } + + s->low = low; + s->high = high; + s->value = value; + + return symbol; +} + + +/*--------------------------------------------------------------- + * Function ivas_ari_done_decoding_14bits_ext_1_lfe() + * + * + *-------------------------------------------------------------*/ + +void ivas_ari_done_decoding_14bits_ext_1_lfe( + Decoder_State *st, + const int16_t extra_bits_read ) +{ + get_next_indice_tmp( st, -( cbitsnew - 2 - extra_bits_read ) ); + + return; +} + + +/*--------------------------------------------------------------- + * Function ivas_ari_done_encoding_14bits() + * + * Arith encoding of last table entry + *-------------------------------------------------------------*/ + +void ivas_ari_done_encoding_14bits( + BSTR_ENC_HANDLE hBstr, + Tastat *s ) +{ + int32_t low; + int32_t bits_to_follow; + + /* not needed, s points to s->low */ + low = s->low; + bits_to_follow = s->bits_to_follow + 1; + + if ( low < ari_q1new ) + { + push_next_indice( hBstr, 0, 1 ); /*send a zero*/ + + for ( ; bits_to_follow > 0; bits_to_follow-- ) + { + push_next_indice( hBstr, 1, 1 ); /*send a one*/ + } + } + else + { + push_next_indice( hBstr, 1, 1 ); /*send a one*/ + for ( ; bits_to_follow > 0; bits_to_follow-- ) + { + push_next_indice( hBstr, 0, 1 ); /*send a zero*/ + } + } + + /*It is done so no need to save values-> no counting*/ + /*s->low = low; + s->bits_to_follow = bits_to_follow;*/ + + return; +} + + +/*--------------------------------------------------------------- + * Function ivas_ari_encode_14bits_ext() + * + * Arith encode function for extended proba tables + *-------------------------------------------------------------*/ + +void ivas_ari_encode_14bits_ext( + BSTR_ENC_HANDLE hBstr, + Tastat *s, + int32_t symbol, + const uint16_t *cum_freq ) +{ + int32_t low, high, range; + int32_t bits_to_follow; + + /*for all operation using bit_ptr=&ptr[bp] */ + /* for reading s->high,low,bits_to_follow sequentially */ + high = s->high; + low = s->low; + range = high - low + 1; + + high = low + mul_sbc_14bits( range, cum_freq[symbol] ) - 1; + low += mul_sbc_14bits( range, cum_freq[symbol + 1] ); + + bits_to_follow = s->bits_to_follow; + + for ( ;; ) + { + if ( high < ari_q2new ) + { + push_next_indice( hBstr, 0, 1 ); /*send a zero*/ + for ( ; bits_to_follow > 0; bits_to_follow-- ) + { + push_next_indice( hBstr, 1, 1 ); /*send a one*/ + } + } + else + { + if ( low >= ari_q2new ) + { + push_next_indice( hBstr, 1, 1 ); /*send a one*/ + for ( ; bits_to_follow > 0; bits_to_follow-- ) + { + push_next_indice( hBstr, 0, 1 ); /*send a zero*/ + } + low -= ari_q2new; + high -= ari_q2new; /* Subtract offset to top. */ + } + else + { + /* Output an opposite bit */ + if ( low >= ari_q1new && high < ari_q3new ) /* Output an opposite bit */ + { + /* later if in middle half. */ + bits_to_follow += 1; + low -= ari_q1new; /* Subtract offset to middle*/ + high -= ari_q1new; + } + else + { + break; /* Otherwise exit loop. */ + } + } + } + low += low; + high += high + 1; /* Scale up code range. */ + } + + s->low = low; + s->high = high; + s->bits_to_follow = bits_to_follow; + + return; +} diff --git a/lib_com/ivas_avq_pos_reorder_com.c b/lib_com/ivas_avq_pos_reorder_com.c new file mode 100644 index 0000000000000000000000000000000000000000..015a3988f7ba326abebc023c471b032c9c0bd402 --- /dev/null +++ b/lib_com/ivas_avq_pos_reorder_com.c @@ -0,0 +1,63 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "prot.h" +#include "wmc_auto.h" + +/*-----------------------------------------------------------------* + * ordr_esti() + * + * + *-----------------------------------------------------------------*/ + +void ordr_esti( + const int16_t svLength, /* i : sub-vector index */ + int16_t *Mpos, /* i/o: dominant sub-vector position from ACV */ + int16_t svOrder[], /* i/o: AVQ sub-vector order */ + const int16_t Nsv /* i : total sub-vectors in a sub-frames */ +) +{ + int16_t i, tmp; + + tmp = svOrder[0]; + svOrder[0] = *Mpos; + *Mpos = Nsv - 1; + + for ( i = 1; i < svLength; tmp++, i++ ) + { + svOrder[i] = tmp; + } + + return; +} diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h new file mode 100644 index 0000000000000000000000000000000000000000..09241a5430f9bde72efe33ad07d301f278f3f3ce --- /dev/null +++ b/lib_com/ivas_cnst.h @@ -0,0 +1,1788 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#ifndef IVAS_CNST_H +#define IVAS_CNST_H + +#include +#include "options.h" +#include "cnst.h" + +/* clang-format off */ + +/*----------------------------------------------------------------------------------* + * mathematical constants + *----------------------------------------------------------------------------------*/ + +#define PI_OVER_2 ( EVS_PI / 2.0f ) +#define PI_OVER_180 ( EVS_PI / 180.0f ) +#define _180_OVER_PI ( 180.0f / EVS_PI ) + +#define SQRT2 1.414213562373095f +#define SQRT2_OVER_2 (SQRT2 / 2.0f) + +#define INV_SQRT2 7.071067811865475e-1f /* 1/sqrt(2) */ +#define INV_SQRT3 0.577350269189626f /* 1/sqrt(3) */ + +#define LOG_10 2.30258509299f + + +/*----------------------------------------------------------------------------------* + * IVAS formats + *----------------------------------------------------------------------------------*/ + +typedef enum +{ + UNDEFINED_FORMAT, + MONO_FORMAT, /* EVS mono processing */ + STEREO_FORMAT, /* IVAS stereo format */ + ISM_FORMAT, /* IVAS ISM (objects-coding) format */ + SBA_FORMAT, /* IVAS SBA (ambisonics) format */ + MASA_FORMAT, /* IVAS MASA format */ + MC_FORMAT, /* IVAS multi-channel format */ + MASA_ISM_FORMAT, /* IVAS combined MASA + objects format*/ + SBA_ISM_FORMAT /* IVAS combined SBA + objects format */ +} IVAS_FORMAT; + + +/*----------------------------------------------------------------------------------* + * IVAS format signaling + *----------------------------------------------------------------------------------*/ + +#define IVAS_FORMAT_SIGNALING_NBITS 2 /* number of bits for signaling the IVAS format */ +#define IVAS_FORMAT_SIGNALING_NBITS_EXTENDED ( IVAS_FORMAT_SIGNALING_NBITS + 1 ) +#define IVAS_COMBINED_FORMAT_SIGNALLING_BITS 1 + + +/*----------------------------------------------------------------------------------* + * IVAS rendering configurations + *----------------------------------------------------------------------------------*/ + +/* Rendering convention rules: + * 1) "st_ivas->renderer_type" reflects always the last rendering stage in the processing + * 2) in some configurations, more rendering stages are used + * - renderers at the last stage, like RENDERER_BINAURAL_xxx, consider uniquely "st_ivas->hOutputSetup" + * - renderers that can be followed by an additional rendering stage, e.g. RENDERER_DIRAC, consider uniquely "st_ivas->hIntSetup" + * 3) in case of a single rendering stage: "hIntSetup=hOutputSetup" + * 4) In case of no rendering stage: "hTransSetup=hIntSetup=hOutputSetup" */ + +typedef enum +{ + RENDERER_DISABLE, + RENDERER_TD_PANNING, + RENDERER_BINAURAL_FASTCONV, + RENDERER_BINAURAL_FASTCONV_ROOM, + RENDERER_BINAURAL_PARAMETRIC, + RENDERER_BINAURAL_PARAMETRIC_ROOM, + RENDERER_BINAURAL_OBJECTS_TD, + RENDERER_DIRAC, + RENDERER_MC, + RENDERER_MC_PARAMMC, + RENDERER_SBA_LINEAR_DEC, + RENDERER_SBA_LINEAR_ENC, + RENDERER_STEREO_PARAMETRIC, + RENDERER_MONO_DOWNMIX, + RENDERER_MCMASA_MONO_STEREO, + RENDERER_PARAM_ISM, + RENDERER_BINAURAL_MIXER_CONV, + RENDERER_BINAURAL_MIXER_CONV_ROOM, + RENDERER_NON_DIEGETIC_DOWNMIX, + RENDERER_OSBA_STEREO, + RENDERER_OSBA_AMBI, + RENDERER_OSBA_LS +} RENDERER_TYPE; + + +/*----------------------------------------------------------------------------------* + * IVAS general constants + *----------------------------------------------------------------------------------*/ + +#define MAX_INPUT_CHANNELS 16 /* Maximum number of input channels (HOA 3rd order), == IVAS_MAX_INPUT_CHANNELS */ +#define MAX_TRANSPORT_CHANNELS 12 /* Maximum number of transport channels */ +#define MAX_INTERN_CHANNELS 16 /* Maximum number of intern channels (HOA 3rd order) */ +#define HEAD_ROTATION_HOA_ORDER 3 /* HOA 3rd order */ +#define MAX_CICP_CHANNELS 16 /* max channels for loudspeaker layouts (16 for custom layouts)*/ +#define MAX_OUTPUT_CHANNELS 16 /* Maximum number of output channels (HOA 3rd order), == IVAS_MAX_OUTPUT_CHANNELS */ +#define MAX_OUTPUT_CHANNELS_IN_DIEGETIC_PAN 2 /* Maximum number of output channels with non diegetic panning */ + +#define BINAURAL_CHANNELS 2 /* number of channels for binaural output configuration */ +#define CPE_CHANNELS 2 /* number of CPE (stereo) channels */ +#define FOA_CHANNELS 4 /* number of FOA channels */ +#define HOA2_CHANNELS 9 +#define HOA3_CHANNELS 16 + +#define MAX_NUM_OBJECTS 4 /* max. number of audio objects, == IVAS_MAX_NUM_OBJECTS */ + +#define MAX_SCE MAX_NUM_OBJECTS /* max. number of SCEs */ +#define MAX_CPE ( MAX_TRANSPORT_CHANNELS / CPE_CHANNELS ) /* max. number of CPEs */ + +#define MAX_BITS_METADATA 2500 /* max. bit-budget of metadata */ +#define MIN_NUM_IND 10 /* minimum number of indices in the core coder */ +#define MAX_NUM_IND_LFE 100 /* maximum number of indices in the LFE encoder */ +#define MAX_NUM_IND_TEMP_LIST 10 /* maximum number of indices in the temporary list */ +#define MAX_IND_TDM_TMP 10 /* maximum number of indices in the temporary list of TD stereo spatial parameters */ + +#define IVAS_ENC_DELAY_NS ACELP_LOOK_NS +#define IVAS_DEC_DELAY_NS 3250000L /* 3.25 ms: IVAS decoder delay (without renderer delay) */ + +#define DELAY_FB_1_NS 1000000L /* 1.00 ms: filter-bank delay */ +#define DELAY_FB_4_NS 4000000L /* 4.00 ms: filter-bank delay */ + +#define IVAS_FB_ENC_DELAY_NS DELAY_FB_1_NS /* 1.00 ms: IVAS encoder filter-bank delay */ +#define IVAS_FB_DEC_DELAY_NS 5000000L /* 5.00 ms: IVAS decoder/renderer filter-bank delay */ + +#define IVAS_MAX_SBA_ORDER 3 /* Maximum supported Ambisonics order */ + +#define IVAS_NUM_SUPPORTED_FS 3 /* number of supported sampling-rates in IVAS */ + +#define CLDFB_SLOT_NS 1250000L /* 1.25ms: CLDFB slot length */ +#define MAX_JBM_SUBFRAMES_5MS 8 +#define DEFAULT_JBM_SUBFRAMES_5MS 4 +#define JBM_CLDFB_SLOTS_IN_SUBFRAME 4 +#define MAX_JBM_CLDFB_TIMESLOTS 32 +#define DEFAULT_JBM_CLDFB_TIMESLOTS 16 +#define MAX_JBM_L_FRAME48k 1920 +#define MAX_JBM_L_FRAME_NS 40000000L +#define MAX_SPAR_INTERNAL_CHANNELS IVAS_SPAR_MAX_CH +#define MAX_CLDFB_DIGEST_CHANNELS (FOA_CHANNELS + MAX_NUM_OBJECTS) + +typedef enum +{ + TC_BUFFER_MODE_NONE = 0, + TC_BUFFER_MODE_RENDERER, + TC_BUFFER_MODE_BUFFER +} TC_BUFFER_MODE; + +/*----------------------------------------------------------------------------------* + * IVAS Bitrates + *----------------------------------------------------------------------------------*/ + +#define IVAS_SID_5k2 5200 /* SID frame bitrate */ +#define IVAS_13k2 13200 +#define IVAS_16k4 16400 +#define IVAS_24k4 24400 +#define IVAS_32k 32000 +#define IVAS_48k 48000 +#define IVAS_64k 64000 +#define IVAS_80k 80000 +#define IVAS_96k 96000 +#define IVAS_128k 128000 +#define IVAS_160k 160000 +#define IVAS_192k 192000 +#define IVAS_256k 256000 +#define IVAS_384k 384000 +#define IVAS_512k 512000 + +#define IVAS_BRATE_MAX IVAS_512k + +#define SIZE_IVAS_BRATE_TBL 16 +#define IVAS_NUM_ACTIVE_BRATES (SIZE_IVAS_BRATE_TBL - 2) + +/*----------------------------------------------------------------------------------* + * IVAS modes : IVAS SCE, IVAS CPE modes (DFT, TD, MDCT stereo) + *----------------------------------------------------------------------------------*/ + +#define EVS_MONO 0 /* EVS Mono BE operating mode */ +#define IVAS_SCE 1 /* IVAS SCE */ +#define IVAS_CPE_DFT 2 /* IVAS CPE: DFT-based parametric stereo */ +#define IVAS_CPE_TD 3 /* IVAS CPE: TD stereo */ +#define IVAS_CPE_MDCT 4 /* IVAS CPE: MDCT-based stereo */ + +#define MIN_BRATE_MDCT_STEREO IVAS_48k /* min. CPE bitrate where MDCT stereo is supported in stereo format coding */ + +#define PCA_BRATE IVAS_256k /* PCA supported bitrate */ + +#define NBITS_ELEMENT_MODE 1 /* number of bits to encode the stereo element mode */ +#define NBITS_BWIDTH 2 /* number of bits to encode all audio bandwidths */ + +/* format signaling in SID frames */ +#define SID_FORMAT_NBITS 3 /* Bit 0 | Bit 1 | Bit 2 */ + /*-------|-------|------ */ +#define SID_DFT_STEREO 0x0 /* 0| 0| 0 */ +#define SID_MDCT_STEREO 0x1 /* 1| 0| 0 */ +#define SID_ISM 0x2 /* 0| 1| 0 */ +#define SID_MASA_1TC 0x3 /* 1| 1| 0 */ +#define SID_MULTICHANNEL 0x4 /* 0| 0| 1 */ +#define SID_SBA_1TC 0x5 /* 1| 0| 1 */ +#define SID_SBA_2TC 0x6 /* 0| 1| 1 */ +#define SID_MASA_2TC 0x7 /* 1| 1| 1 */ + +/*----------------------------------------------------------------------------------* + * IVAS ACELP core constants + *----------------------------------------------------------------------------------*/ + +#define MIN_UNVOICED_TWO_STAGE_BRATE 7050 /* min. per channel bitrate where two stages UNVOICED is supported */ +#define MAX_UNVOICED_BRATE ACELP_13k20 /* max. per channel bitrate where UNVOICED is supported */ +#define MAX_VOICED_BRATE ACELP_13k20 /* max. per channel bitrate where VOICED is supported */ +#define MIN_TC_BRATE 6450 /* min. per channel bitrate where TRANSITION is supported */ +#define MAX_ACELP_BRATE 48000 /* max. per channel bitrate where ACELP core is supported */ +#define MAX_ACELP_BRATE_ISM 40000 /* max. per channel bitrate where ACELP core is supported in ISM format */ + +#define ACELP_12k8_HIGH_LIMIT 24350 /* max. per channel bitrate where the ACELP@12.8kHz is supported */ +#define ACELP_16k_LOW_LIMIT 13250 /* min. per channel bitrate where the ACELP@16kHz is supported */ +#define SCE_CORE_16k_LOW_LIMIT 17000 /* min. SCE bitrate where the ACELP@16kHz is supported; must be >= (ACELP_16k_LOW_LIMIT + SWB_TBE_1k6) */ +#define MIN_BRATE_AVQ_EXC ACELP_29k00 /* min. per channel bitrate where the AVQ excitation stage is supported */ +#define MAX_BRATE_AVQ_EXC_TD 40000 /* max. per channel bitrate where the AVQ excitation stage in time domain is supported */ + +#define MAX_GSC_INACTIVE_BRATE 28000 /* max. per channel bitrate where GSC Inactive (@16kHz) is supported (max. 31950 to ensure BE with EVS mono) */ + +#define FRMT_SHP_MIN_BRATE_IVAS 18000 /* min. bitrate where formant-sharpening flag is transmitted; applies both to SCE and CPE */ + +#define CNA_MAX_BRATE_STEREO IVAS_16k4 /* max. stereo bitrate where CNA is supported */ +#define CNA_MAX_BRATE_DFT_STEREO IVAS_32k /* max. stereo bitrate where CNA is supported in DFT stereo */ + +#define MIN_BRATE_WB_BWE 7150 /* min. per channel bitrate where WB BWE info is encoded */ +#define MIN_BRATE_SWB_BWE 7800 /* min. per channel bitrate where SWB BWE info is encoded */ + +#define MIN_BRATE_GSC_NOISY_FLAG 12000 /* min. per channel bitrate where gsc_noisy_flag in SWB is supported */ +#define GSC_L_RATE_STG 15000 /* bitrate below will use low rate GSC settings */ +#define GSC_H_RATE_STG 20000 /* bitrates above will use high rate GSC settings */ + +#define MIN_BRATE_SWB_SCE ACELP_9k60 /* min. SCE bitrate where SWB is supported */ +#define MIN_BRATE_SWB_STEREO IVAS_13k2 /* min. stereo bitrate where SWB is supported */ +#define MIN_BRATE_FB_STEREO IVAS_32k /* min. SCE and stereo bitrate where FB is supported */ +#define MIN_BRATE_FB_ISM 16000 /* min. SCE bitrate where FB is supported in ISM format */ + +#define MIN_TDM_BRATE_WB_TBE_1k05 12000 /* min. per channel bitrate where WB TBE @1.05 kbps is supported (0.35kbs at lower bitrates) */ +#define MIN_BRATE_WB_TBE_1k05 9650 /* min. per channel bitrate where WB TBE @1.05 kbps is supported (0.35kbs at lower bitrates) */ +#define MIN_BRATE_SWB_TBE_1k60 13200 /* min. per channel bitrate where SWB TBE @1.60 kbps is supported (0.95 kbps at lower bitrates) */ +#define MIN_BRATE_SWB_TBE_2k80 24400 /* min. per channel bitrate where SWB TBE @2.80 kbps is supported */ +#define MIN_MIN_BRATE_LRTD_SWB_BWE 5000 + +#define STEREO_TCX_MIN_RATE 9000 /* TCX coding down to this per channel bitrate */ +#define STEREO_GSC_BIT_RATE_ALLOC 9200 +#define HQ_MDCTCLASS_CROSSOVER_BRATE 32000 /* MDCT classifier crossover bitrate between 24.4 and 32 kbps tunings*/ +#define HQ_BWE_CROSSOVER_BRATE 26000 /* HQ crossover bitrate between 24.4 and 32 kbps BWE tunings */ + + +/*----------------------------------------------------------------------------------* + * ISM Constants + *----------------------------------------------------------------------------------*/ + +#define ISM_NB_BITS_METADATA_NOMINAL ( ( SCE_CORE_16k_LOW_LIMIT - ACELP_16k_LOW_LIMIT ) / FRAMES_PER_SEC ) /* nominal number of metadata bits - used for configuration of Core-Coder modules */ + +#define ISM_METADATA_MD_FLAG_BITS 1 /* flag to distinguish between NULL metadata and low-rate ISM_NO_META class */ +#define ISM_METADATA_INACTIVE_FLAG_BITS 1 /* flag to signal whether MD are sent in low-rate inactive frame */ +#define ISM_METADATA_FLAG_BITS 2 + +#define ISM_INACTIVE_IMP 0 /* == ISM_NO_META */ +#define ISM_NO_META 0 +#define ISM_LOW_IMP 1 +#define ISM_MEDIUM_IMP 2 +#define ISM_HIGH_IMP 3 + +#define BRATE_ISM_INACTIVE 2450 /* CoreCoder bitrate in ISM no meta / inactive frames */ +#define BITS_ISM_INACTIVE ( BRATE_ISM_INACTIVE / FRAMES_PER_SEC ) +#define ADJUST_ISM_BRATE_NEG 6000 +#define ADJUST_ISM_BRATE_POS 8000 + +#define ISM_AZIMUTH_NBITS 7 +#define ISM_AZIMUTH_MIN -180.0f +#define ISM_AZIMUTH_MAX 180.0f +#define ISM_AZIMUTH_LOW_BORDER -140.0f +#define ISM_AZIMUTH_HIGH_BORDER 135.0f + +#define ISM_ELEVATION_NBITS 6 +#define ISM_ELEVATION_MIN -90.0f +#define ISM_ELEVATION_MAX 90.0f +#define ISM_ELEVATION_LOW_BORDER -70.0f +#define ISM_ELEVATION_HIGH_BORDER 65.0f +#define ISM_Q_STEP 2.5f +#define ISM_Q_STEP_BORDER 5.0f + +#define ISM_RADIUS_NBITS 6 +#define ISM_RADIUS_MIN 0.0f +#define ISM_RADIUS_DELTA 0.25f /* Max radius = (2^ISM_RADIUS_NBITS-1)*0.25 = 15.75 */ +#define ISM_EXTENDED_METADATA_BRATE IVAS_64k +#define ISM_METADATA_IS_NDP_BITS 1 +#define ISM_EXTENDED_METADATA_BITS 1 +#define ISM_METADATA_RS_MAX_FRAMES 5 /* Number of frames with opposite extended metadata flags before switching */ + +/* Parametric ISM */ +#define MAX_PARAM_ISM_NBANDS 11 +#define MAX_PARAM_ISM_NBANDS_WB 9 +#define MAX_PARAM_ISM_NBANDS_NB 7 +#define PARAM_ISM_MDFT_NO_SLOTS 4 +#define MAX_PARAM_ISM_NBLOCKS 1 +#define MAX_PARAM_ISM_WAVE 2 +#define PARAM_ISM_OBJ_IND_NBITS 2 +#define PARAM_ISM_POW_RATIO_NBITS 3 +#define PARAM_ISM_MAX_DMX 2 +#define PARAM_ISM_MAX_CHAN 16 +#define PARAM_ISM_HYS_BUF_SIZE 10 + +/* ISM DTX */ +#define ISM_DTX_COH_SCA_BITS 4 +#define ISM_DTX_AZI_BITS_HIGH 8 +#define ISM_DTX_ELE_BITS_HIGH 7 +#define ISM_Q_STEP_HIGH (ISM_Q_STEP / 2) +#define ISM_Q_STEP_BORDER_HIGH (ISM_Q_STEP_BORDER / 2) +#define ISM_DTX_AZI_BITS_LOW 6 +#define ISM_DTX_ELE_BITS_LOW 5 +#define ISM_Q_STEP_LOW (ISM_Q_STEP * 2) +#define ISM_Q_STEP_BORDER_LOW (ISM_Q_STEP_BORDER * 2) + +/* ISM modes */ +typedef enum +{ + ISM_MODE_NONE, + ISM_MODE_DISC, /* discrete ISM */ + ISM_MODE_PARAM, /* parametric ISM */ + ISM_MASA_MODE_MASA_ONE_OBJ, /* MASA ISM mode when one object is encoded separately and remainder using MASA parameters */ + ISM_MASA_MODE_PARAM_ONE_OBJ, /* MASA ISM mode when one object is encoded separately and remainder using parametric object model */ + ISM_MASA_MODE_DISC, /* MASA ISM mode when all objects are encoded separarately */ + ISM_SBA_MODE_DISC /* SBA ISM mode when all objects are encoded separarately */ +} ISM_MODE; + + +/* ISM metadata bitstream */ +enum +{ + IND_ISM_NUM_OBJECTS, + IND_ISM_EXTENDED_FLAG = IND_ISM_NUM_OBJECTS + MAX_NUM_OBJECTS, + IND_ISM_EXTENDED_NDP_FLAG, + IND_ISM_METADATA_FLAG, + IND_ISM_MD_NULL_FLAG = IND_ISM_METADATA_FLAG + MAX_NUM_OBJECTS, + IND_ISM_MD_INACTIVE_FLAG = IND_ISM_MD_NULL_FLAG + MAX_NUM_OBJECTS, + IND_ISM_NOISY_SPEECH_FLAG = IND_ISM_MD_INACTIVE_FLAG + MAX_NUM_OBJECTS, + IND_ISM_SCE_ID_DTX, + IND_ISM_DTX_COH_SCA, + + /* ------------- loop for objects -------------- */ + TAG_ISM_LOOP_START = IND_ISM_DTX_COH_SCA + MAX_NUM_OBJECTS, + IND_ISM_NDP_FLAG = TAG_ISM_LOOP_START, + IND_ISM_AZIMUTH_DIFF_FLAG = TAG_ISM_LOOP_START, + IND_ISM_AZIMUTH = TAG_ISM_LOOP_START, + IND_ISM_ELEVATION_DIFF_FLAG = TAG_ISM_LOOP_START, + IND_ISM_ELEVATION = TAG_ISM_LOOP_START, + IND_ISM_RADIUS_DIFF_FLAG = TAG_ISM_LOOP_START, + IND_ISM_RADIUS = TAG_ISM_LOOP_START, + TAG_ISM_LOOP_END = TAG_ISM_LOOP_START + /* --------- end of loop for objects ----------- */ + +}; + + +/*----------------------------------------------------------------------------------* + * DFT Stereo Constants + *----------------------------------------------------------------------------------*/ + +/* Coding configurations*/ +#define STEREO_DFT_DMX_ACTIVE 1 /* Enable true spatialization */ + +/* residual coding modes */ +#define STEREO_DFT_RES_COD_OFF 0 +#define STEREO_DFT_RES_COD_1kHz 1 /* use residual coding up to 1 kHz */ +#define STEREO_DFT_RES_COD_1_6kHz 2 /* use residual coding up to 1.6 kHz */ + +/* residual prediction modes */ +#define STEREO_DFT_RESPRED_OFF 0 +#define STEREO_DFT_RESPRED_STEFI 1 /* full-band stereo filling (above residual) */ +#define STEREO_DFT_RESPRED_ESF 2 /* enhanced stereo filling in LB, regular stereo filling in HB */ + +/* band resolution */ +#define STEREO_DFT_BAND_RES_HIGH 1 /* use higher band resolution following ERB4 scale */ +#define STEREO_DFT_BAND_RES_LOW 2 /* use lower band resolution following ERB8 scale */ + +/* Processing constants*/ +#define STEREO_DFT_OVL_NS ACELP_LOOK_NS /* 8.75ms */ +#define STEREO_DFT_ZP_NS 3125000L /* 3.125ms */ +#define STEREO_DFT_HOP_NS 10000000L /* 10ms */ +#define STEREO_DFT_N_NS ( STEREO_DFT_HOP_NS + ACELP_LOOK_NS + 2 * STEREO_DFT_ZP_NS ) + +#define STEREO_DFT_ZP_NS_ENC 5625000L /* 5.625ms */ +#define STEREO_DFT_HOP_NS_ENC FRAME_SIZE_NS /* 20ms */ +#define STEREO_DFT_N_NS_ENC ( STEREO_DFT_HOP_NS_ENC + ACELP_LOOK_NS + 2 * STEREO_DFT_ZP_NS_ENC ) + +#define STEREO_DFT_OVL_MAX NS2SA( 48000, ACELP_LOOK_NS ) +#define STEREO_DFT_HOP_MAX NS2SA( 48000, STEREO_DFT_HOP_NS ) + +#define STEREO_DFT_ZP_MAX_ENC NS2SA( 48000, STEREO_DFT_ZP_NS_ENC ) +#define STEREO_DFT_HOP_MAX_ENC NS2SA( 48000, STEREO_DFT_HOP_NS_ENC ) +#define STEREO_DFT_N_MAX_ENC NS2SA( 48000, STEREO_DFT_N_NS_ENC ) + +#define STEREO_DFT_OVL_32k NS2SA( 32000, ACELP_LOOK_NS ) + +#define STEREO_DFT_ZP_32k_ENC NS2SA( 32000, STEREO_DFT_ZP_NS_ENC ) +#define STEREO_DFT_HOP_32k_ENC NS2SA( 32000, STEREO_DFT_HOP_NS_ENC ) +#define STEREO_DFT_N_32k_ENC NS2SA( 32000, STEREO_DFT_N_NS_ENC ) + +#define STEREO_DFT_OVL_16k NS2SA( 16000, ACELP_LOOK_NS ) + +#define STEREO_DFT_ZP_16k_ENC NS2SA( 16000, STEREO_DFT_ZP_NS_ENC ) +#define STEREO_DFT_HOP_16k_ENC NS2SA( 16000, STEREO_DFT_HOP_NS_ENC ) +#define STEREO_DFT_N_16k_ENC NS2SA( 16000, STEREO_DFT_N_NS_ENC ) + +#define STEREO_DFT_OVL_12k8 NS2SA( 12800, ACELP_LOOK_NS ) + +#define STEREO_DFT_ZP_12k8_ENC NS2SA( 12800, STEREO_DFT_ZP_NS_ENC ) +#define STEREO_DFT_HOP_12k8_ENC NS2SA( 12800, STEREO_DFT_HOP_NS_ENC ) +#define STEREO_DFT_N_12k8_ENC NS2SA( 12800, STEREO_DFT_N_NS_ENC ) + +#define STEREO_DFT_OVL_8k NS2SA( 8000, ACELP_LOOK_NS ) +#define STEREO_DFT_N_8k NS2SA( 8000, STEREO_DFT_N_NS ) + +#define STEREO_DFT_ZP_8k_ENC NS2SA( 8000, STEREO_DFT_ZP_NS_ENC ) +#define STEREO_DFT_HOP_8k_ENC NS2SA( 8000, STEREO_DFT_HOP_NS_ENC ) +#define STEREO_DFT_N_8k_ENC NS2SA( 8000, STEREO_DFT_N_NS_ENC ) + +#define STEREO_DFT32MS_N_NS FRAME_SIZE_NS /* 20 ms */ +#define STEREO_DFT32MS_OVL_NS 3125000L /* 3.125ms - Overlap for the outer edges of windows on decoder */ +#define STEREO_DFT32MS_OVL2_NS 9375000L /* 9.375ms - Overlap for the inner edges of windows on decoder */ +#define STEREO_DFT32MS_WIN_CENTER_NS ( int32_t )( ( FRAME_SIZE_NS + STEREO_DFT32MS_OVL_NS ) * 0.5f ) /* 11.5625ms - mid point of the two windows wrt the left edge of overlap */ +#define STEREO_DFT32MS_ZP_NS ( int32_t )( 0.5f * ( STEREO_DFT32MS_N_NS - STEREO_DFT32MS_WIN_CENTER_NS - ( STEREO_DFT32MS_OVL2_NS * 0.5f ) ) ) /* 2 sided zp calculated such that window size is satisfied */ + +#define STEREO_DFT32MS_OVL_MAX NS2SA( 48000, STEREO_DFT32MS_OVL_NS ) +#define STEREO_DFT32MS_OVL2_MAX NS2SA( 48000, STEREO_DFT32MS_OVL2_NS ) +#define STEREO_DFT32MS_N_MAX NS2SA( 48000, STEREO_DFT32MS_N_NS ) + +#define STEREO_DFT32MS_N_32k NS2SA( 32000, STEREO_DFT32MS_N_NS ) + +#define STEREO_DFT32MS_OVL_16k NS2SA( 16000, STEREO_DFT32MS_OVL_NS ) +#define STEREO_DFT32MS_OVL2_16k NS2SA( 16000, STEREO_DFT32MS_OVL2_NS ) +#define STEREO_DFT32MS_N_16k NS2SA( 16000, STEREO_DFT32MS_N_NS ) + +#define STEREO_DFT32MS_OVL_12k8 NS2SA( 12800, STEREO_DFT32MS_OVL_NS ) +#define STEREO_DFT32MS_OVL2_12k8 NS2SA( 12800, STEREO_DFT32MS_OVL2_NS ) +#define STEREO_DFT32MS_N_12k8 NS2SA( 12800, STEREO_DFT32MS_N_NS ) + +#define STEREO_DFT32MS_OVL_8k NS2SA( 8000, STEREO_DFT32MS_OVL_NS ) +#define STEREO_DFT32MS_OVL2_8k NS2SA( 8000, STEREO_DFT32MS_OVL2_NS ) +#define STEREO_DFT32MS_N_8k NS2SA( 8000, STEREO_DFT32MS_N_NS ) + +#define STEREO_DFT32MS_STEP 3 /* STEREO_DFT32MS_OVL2_NS / STEREO_DFT32MS_OVL_NS */ +#define STEREO_DFT_TRIGO_DEC_STEP 2 +#define STEREO_DFT_TRIGO_SRATE_8k_STEP 4 +#define STEREO_DFT_TRIGO_SRATE_12k8_STEP 1 +#define STEREO_DFT_TRIGO_SRATE_16k_STEP 2 +#define STEREO_DFT_TRIGO_SRATE_32k_STEP 1 +#define STEREO_DFT_TRIGO_SRATE_48k_STEP 1 + +#define STEREO_DFT_OFFSET 1 +#define STEREO_DFT_NBDIV 2 + +#define STEREO_DFT_ITD_CNG_XFADE 100 +#define STEREO_DFT_ITD_CNG_XFADE_RESET 2 + +#define STEREO_DFT_DELAY_DEC_BWE_NS ( STEREO_DFT_OFFSET * STEREO_DFT_HOP_NS - ACELP_LOOK_NS ) /* 1.25ms/2.5ms: max delay for core decoder*/ + +#define STEREO_DFT_ENC_DFT_NB ( STEREO_DFT_OFFSET + 1 ) /*frame + lookahead*/ +#define STEREO_DFT_DEC_DFT_NB ( STEREO_DFT_NBDIV + STEREO_DFT_OFFSET ) /*frame + lookahead*/ + +#define STEREO_CNA_LR_CORR_LT_FILT 0.95f /* long-term averaging factor for L/R correlation estimation */ +#define STEREO_CNA_ILD_LT_FILT 0.9f /* long-term averaging factor for ILD estimation */ + +typedef enum +{ + DFT_STEREO_DEC_ANA_NOCORE = -1, /*-1: signal read from file (DEBUG mode)*/ + DFT_STEREO_DEC_ANA_FB, /* 0: full-band signal (e.g. HQ-CORE/TCX (M), residual (S))*/ + DFT_STEREO_DEC_ANA_FB_ADD, /* 1: full-band signal to add (e.g High-band signal of TD-BWE)*/ + DFT_STEREO_DEC_ANA_BPF, /* 2: Bass-post-filter error signal, to add and weight*/ + DFT_STEREO_DEC_ANA_LB, /* 3: low-band signal (e.g. ACELP (M), resiudal signal (S))*/ + DFT_STEREO_DEC_ANA_LB_ADD, /* 4: low-band signal to add (e.g. LB-TCX)*/ + DFT_STEREO_DEC_ANA_HB_ADD /* 5: high-band signal to add (e.g. transition to ACELP in MDCT->DFT switching) */ +} DFT_STEREO_DEC_ANA_TYPE; + +/*Stereo parameters*/ + +#define STEREO_DFT_ERB4_BANDS 14 +#define STEREO_DFT_ERB8_BANDS 8 +#define STEREO_DFT_BAND_MAX ( STEREO_DFT_ERB4_BANDS - 1 ) /*Maximum number of parameter bands*/ +#define STEREO_DFT_BUF_MAX STEREO_DFT32MS_N_MAX * STEREO_DFT_NBDIV + +#define STEREO_DFT_NRG_PAST_LEN 3 + +/*ITD*/ +#define STEREO_DFT_ITD_FS 32000 +#define STEREO_DFT_ITD_MAX 160 /*samples @ 32000*/ +#define STEREO_DFT_ITD_MAX_ANA 200 +#define STEREO_DFT_ITD_MIN max( STEREO_DFT_ITD_MAX - 256 + 1, 1 ) /*STEREO_DFT_ITD_MAX-pow(2,STEREO_DFT_ITD_NBITS-1)+1*/ +#define STEREO_DFT_ITD_NBITS 9 /* 1 bit for sign, the rest for the absolute value*/ +#define STEREO_DFT_ITD_MODE_NBITS 1 + +#define STEREO_DFT_SID_ITD_NBITS 4 /* Number of ITD bits SID frames */ +#define STEREO_DFT_SID_ITD_FAC 1 /* Quantization step reduction factor */ + +#define STEREO_DFT_FLAG_BITS 1 +#define STEREO_DFT_SIDEGAIN_NBITS 5 +#define STEREO_DFT_FEC_THRESHOLD 10 +#define STEREO_DFT_BITDIFF_LP_FAC (0.06f) /* Low-pass filter coefficient for filtering bit difference between absolute and differential coding */ +#define STEREO_DFT_BITDIFF_ABS_SELECT (0.8f) /* Constant to set tendency for selecting absolute coding mode */ +#define STEREO_DFT_BITDIFF_INIT (12.0f) /* Init value for low-pass bit difference */ + +#define STEREO_DFT_SIDE_GAIN_NBITS 5 +#define STEREO_DFT_IPD_NBITS 3 +#define STEREO_DFT_GIPD_NBITS 4 + +#define STEREO_DFT_ITD_VAD_BAND_NUM 20 + +#define STEREO_DFT_XCORR_LB_MAX 24 + +#define STEREO_DFT_IPD_BUF_LEN 5 + +#define STEREO_DFT_N_COH_PRED 4 /* Number of intra-frame predictors for coherence vector */ +#define STEREO_DFT_COH_PRED_COEFFS 15 /* Number of coefficients per predictor */ +#define STEREO_DFT_PRED_NBITS 2 /* Bits to signal predictor (log_2(4) = 2) */ +#define STEREO_DFT_N_COH_ALPHA_STEPS 5 +#define STEREO_DFT_N_COH_ALPHA_LEVELS 2 +#define STEREO_DFT_N_COH_ALPHA_BITS 1 +#define STEREO_DFT_SG_ACT_CNT_MAX 1500 +#define STEREO_DFT_COH_MAXBAND 6 +#define STEREO_DFT_SID_GIPD_NBITS 2 +#define STEREO_DFT_FD_FILT 0.9f + +#define STEREO_DFT_CNG_ITD_CNT 8 + +/*Residual prediction*/ +#define STEREO_DFT_PAST_MAX 4 +#define STEREO_DFT_RES_PRED_BAND_MAX 12 + +#define STEREO_DFT_REVERB_MODE_NBITS 1 +#define STEREO_DFT_RES_PRED_BAND_MIN 0 +#define STEREO_DFT_RES_PRED_BAND_MIN_RED 3 +#define STEREO_DFT_RES_PRED_BAND_MIN_CONST 3 + +#define STEREO_DFT_ALLPASS_BUFFERLEN 256 +#define STEREO_DFT_ALLPASS_FADELEN_12k8 32 +#define STEREO_DFT_ALLPASS_FADELEN_16k 40 +#define STEREO_DFT_CORE_HIST_MAX ( STEREO_DFT_PAST_MAX + 3 ) / 2 +#define STEREO_DFT_TD_STEFI_DELAY_NS FRAME_SIZE_NS + IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS +#define STEREO_DFT_TD_STEFI_SUBFR_DELAY 2 + +/*Residual coding*/ +#define STEREO_DFT_N_MAX_RES 800 /* Maximum of lines coded in residual coding */ +#define STEREO_DFT_RES_GLOBAL_GAIN_BITS 7 +#define STEREO_DFT_RES_GAINS_BITS 3 + +#define STEREO_DFT_RES_COD_SNR_MIN 10 +#define STEREO_DFT_RES_COD_SNR_MAX 40 +#define STEREO_DFT_L_SUBFR_8k 32 +#define STEREO_DFT_NBPSF_PIT_MAX_8k NBPSF_PIT_MAX / 2 + +/* Residual coding BPF */ +#define STEREO_DFT_BPF_ADAPT_ALPHA (0.61f) +#define STEREO_DFT_BPF_ADAPT_BETA (0.68f) + +/* Golomb-Rice encoding */ +#define NO_SYMB_GR_SIDE_G 31 +#define NO_SYMB_GR_PRED_G 8 + +#define STEREO_DFT_RES_BW_MAX 66 /*Maximum number of bin for residual signal in each frame (res_cod_band_max == 6 in 48kHz)*/ + +#define SBA_DIRAC_STEREO_NUM_BANDS 12 + +#define SBA_DIRAC_NRG_SMOOTH_LONG 10 +#define SBA_DIRAC_NRG_SMOOTH_SHORT 3 + +/* PLC for DFT Stereo residual */ +#define STEREO_DFT_RES_N_PEAKS_MAX 15 /*Maximum number of peaks within residual signal in each frame (res_cod_band_max == 6 in 48kHz)*/ + +/* MDCT to DFT Stereo switching */ +#define STEREO_MDCT2DFT_FADE_LEN_48k L_FRAME48k / 8 + +/* DFT stereo side-info bitstream*/ +enum +{ + IND_STEREO_DFT_ATTACK_PRESENT, + IND_STEREO_DFT_RES_COD, + IND_STEREO_DFT_SIDEGAIN_FLAG, + + IND_STEREO_DFT_SIDEGAINS, + IND_STEREO_DFT_ITD_MODE = IND_STEREO_DFT_SIDEGAINS + 4 * STEREO_DFT_BAND_MAX + 120, + + IND_STEREO_DFT_ITD_HUFF, + IND_STEREO_DFT_ITD_NEG, + IND_STEREO_DFT_ITD_COD, + + IND_STEREO_DFT_NO_IPD_FLAG, + IND_STEREO_DFT_GIPD, + + IND_STEREO_DFT_IPD_FLAG, + IND_STEREO_DFT_IPD_COD, + + IND_STEREO_DFT_REVERB_MODE = IND_STEREO_DFT_IPD_COD + 4 * STEREO_DFT_BAND_MAX + 2, /* max number for GR order 2 */ + + IND_STEREO_DFT_RES_PRED_FLAG, + IND_STEREO_DFT_PRED_GAIN_COD, + + IND_STEREO_DFT_NON_USED = IND_STEREO_DFT_PRED_GAIN_COD + 4 * STEREO_DFT_RES_PRED_BAND_MAX + 2, /* max number for GR order 2 */ + + /* residual coding */ + IND_STEREO_DFT_RESIDUAL_GLOBAL_GAIN, + IND_STEREO_DFT_RESIDUAL_COD, + IND_STEREO_DFT_SID_COH = IND_STEREO_DFT_RESIDUAL_COD + 56, /* max possible number of indices for residual coding */ + + STEREO_DFT_MAX_NUM_INDICES = IND_STEREO_DFT_SID_COH + 6 /* max possible number of indices for coherence encoding */ +}; + + +/*----------------------------------------------------------------------------------* + * Range coder constants + *----------------------------------------------------------------------------------*/ + +#define RANGE_UNI_BUFFER_BYTES_MAX 1024 +#define RANGE_N_CONTEXT 64 +#define RANGE_N_SYMBOLS 17 + + +/*----------------------------------------------------------------------------------* + * ECLVQ Stereo constants + *----------------------------------------------------------------------------------*/ + +#define ECSQ_VECTOR_SIZE_MAX 256 +#define ECSQ_GLOBAL_GAIN_INDEX_ALL_ZERO 127 /* indicates that all values in the vector are zero */ + +#define ECLVQ_GLOBAL_GAIN_FACTOR ( 20.0f * 127.0f / 90.0f ) +#define ECLVQ_INV_GLOBAL_GAIN_FACTOR ( 1.0f / ( 20.0f * 127.0f / 90.0f ) ) + +/* the currently defined configuration indexes are: + 0: un-optimized using uniform 4 bit parameters (reserved) + 1: optimized for 32 kbps target SNR + 2: optimized for 32 kbps target bits + 3: optimized for 48 kbps target SNR + 4: optimized for 48 kbps target bits + 5: optimized for 64 kbps target SNR + 6: optimized for 64 kbps target bits +*/ + +#define ECSQ_CONFIG_COUNT 7 /* number of different configurations, such as bitrates or profiles */ +#define ECSQ_PARAM_COUNT 16 /* number of different coding distributions, the first indicates only zero values */ +#define ECSQ_ALL_ZERO_PARAM -1 /* the integer exponent of the first parameter indicating only zero values */ +#define ECSQ_PROB_BITS 14 /* number of bits used for representing the probabilities in the actual AC */ +#define ECSQ_PROB_TOTAL ( 1 << ECSQ_PROB_BITS ) /* total count used for representing the probabilities in the actual AC */ + +#define ECSQ_TAB_VALS_SIZE 16 /* 0, 1, 2, 3, ... */ +#define ECSQ_SEGMENT_SIZE 8 +#define ECSQ_log2TB_SIZE 13 +#define ECSQ_PARAM_SEARCH_RANGE 1 +#define ECSQ_NONZERO_MAX 3 + + +/*----------------------------------------------------------------------------------* + * UNCLR & cross-talk stereo classifiers + *----------------------------------------------------------------------------------*/ + +#define XTALK_SCORE_BUF_LEN 5 + +#define SSC_MAX_NFEA 58 /* Maximum number of features for stereo scene classification */ +#define SIZE_UNCLR_ISEL_TD 10 +#define SIZE_UNCLR_ISEL_DFT 8 + +#define SIZE_XTALK_ISEL_TD 17 +#define SIZE_XTALK_ISEL_DFT 11 + +#define UNCLR_L_ETOT 3 +#define UNCLR_L_RELE 10 +#define UNCLR_RC_ORDER 20 +#define MAX_UV_CNT 100 + +#define XTALK_PHAT_LEN 200 + +enum fea_names +{ + E_d_clas, E_d_pitch, E_d_voicing, E_sum_d_LSF, E_d_lepsP_13, E_d_cor_map_sum, E_d_dE1, E_d_nchar, + E_d_non_sta, E_d_ps_sta, E_d_ps_diff, E_d_sp_div, E_clas, E_pitch, E_voicing, E_lsf_1, + E_lsf_4, E_lsf_9, E_lsf_14, E_lepsP_13, E_cor_map_sum, E_dE1, E_nchar, E_non_sta, + E_ps_sta, E_ps_diff, E_sp_div, E_corrLagStats0, E_ica_corr_value0, E_ica_instTargetGain, + E_diff_corrLM_corrRM, E_tdm_LT_es_em, E_sum_prod, E_tdm_es_em, E_m_corrL_corrR, E_d_corrL_corrR, E_corrEst0, E_corrLagMax, + E_d_corrLagMax, E_corrEstMax, E_corrEst_ncorr,E_sum_xcorr, E_es_em, E_cohSNR, E_d_prodL_prodR, E_xcorr_itd_value, + E_angle_rot, E_g_pred, E_g_side, E_gainILD, E_gainIPD, E_IPD, E_d_IPD, E_ITD, + E_gphat_d_itd2, E_gphat_itd1_flip, E_gphat_ratio_m1_m2, E_gphat_m2_m2 +}; + + +/*----------------------------------------------------------------------------------* + * ICA Stereo constants + *----------------------------------------------------------------------------------*/ + +#define L_CH_INDX 0 +#define R_CH_INDX 1 +#define CORR_INTER_FS 8000 +#define L_NCSHIFT_NS 5000000L +#define L_MEM_RECALC_NS ( L_NCSHIFT_NS * 3 ) / 2 +#define L_MEM_RECALC_TBE_NS ( L_NCSHIFT_NS + L_SAMPLES_LA_NS ) +#define L_NCSHIFTMAX NS2SA( 48000, L_NCSHIFT_NS ) +#define L_DEC_MEM_LEN_ICA L_NCSHIFTMAX + ( N_MAX_SHIFT_CHANGE + 1 ) + SINC_ORDER1 / INTERP_FACTOR1 +#define L_FRAME_DS NS2SA( CORR_INTER_FS, FRAME_SIZE_NS ) +#define L_XCORRMEM_DS NS2SA( CORR_INTER_FS, 2 * ( ACELP_LOOK_NS ) ) +#define L_NCSHIFT_DS ( int16_t )( ( ( int32_t )(CORR_INTER_FS) *L_NCSHIFTMAX ) / 48000L ) +#define L_SAMPLES_LA_NS 625000L + +#define L_MEM_RECALC_TBE_16K NS2SA( 16000, L_MEM_RECALC_TBE_NS ) +#define L_MEM_RECALC_48K NS2SA( 48000, L_MEM_RECALC_NS ) +#define L_MEM_RECALC_12K8 NS2SA( 12800, L_MEM_RECALC_NS ) +#define L_MEM_RECALC_16K NS2SA( 16000, L_MEM_RECALC_NS ) +#define N_MAX_SHIFT_CHANGE 20 + +#define L_MEM_RECALC_SCH_NS ( ACELP_LOOK_NS + DELAY_FIR_RESAMPL_NS - L_MEM_RECALC_NS ) +#define L_MEM_RECALC_48k_SCH NS2SA( 48000, L_MEM_RECALC_SCH_NS ) + +#define INTERP_FACTOR1 2 +#define SINC_ORDER1 24 +#define L_SHIFT_ADAPT_MAX 596 /* must be a multiple of 2 */ +#define L_SHIFT_ADAPT_16k 290 /* must be a multiple of 2 */ + +#define STEREO_BITS_TCA_CHAN 1 /* ref/target channel index */ +#define STEREO_BITS_TCA_CORRSTATS 5 /* target corrStats */ +#define STEREO_BITS_TCA_GD 5 /* target gain */ +#define STEREO_TCA_GDMIN -1.0f +#define STEREO_TCA_GDSTEP 0.05f +#define STEREO_BITS_TCA ( STEREO_BITS_TCA_CHAN + STEREO_BITS_TCA_CORRSTATS + STEREO_BITS_TCA_GD ) + +#define STEREO_ICBWE_MSFLAG_BITS 1 /* BWE Multi Source flag */ + +#define STEREO_ICBWE_REFBITS 1 +#define STEREO_ICBWE_SPBITS 2 +#define STEREO_ICBWE_GSBITS 4 +#define STEREO_BITS_ICBWE ( STEREO_ICBWE_SPBITS + STEREO_ICBWE_GSBITS + STEREO_ICBWE_REFBITS ) + +#define STEREO_ICBWE_SPBITS_DFT 2 +#define STEREO_ICBWE_GSBITS_DFT 7 +#define STEREO_BITS_ICBWE_DFT ( STEREO_ICBWE_SPBITS_DFT + STEREO_ICBWE_GSBITS_DFT + STEREO_ICBWE_REFBITS ) + +#define MAX_DELAYREGLEN 12 /* max regression length */ +#define INV_MAX_DELAYREGLEN 0.083333333333333f /* (1/MAX_DELAYREGLEN) */ +#define MAX_INTERPOLATE 11 +#define ADDED_MEM_DS 40 + +#define STEREO_L_TCA_OVLP_NS 5000000L /* overlap length of the ICA gain scaling */ + + +/*----------------------------------------------------------------------------------* + * TD Stereo Constants + *----------------------------------------------------------------------------------*/ + +#define TDM_NQ ( 32 - 1 ) /* number of quantization steps of mixing factor */ +#define LRTD_STEREO_LEFT_IS_PRIM ( TDM_NQ - 1 ) /* Ratio index value indicating that left channel is coded as primary channel */ +#define LRTD_STEREO_RIGHT_IS_PRIM 0 /* Ratio index value indicating that right channel is coded as primary channel */ +#define LRTD_STEREO_QUARTER_RANGE ( ( TDM_NQ + 1 ) / 4 ) /* Ratio index value */ +#define LRTD_STEREO_MID_IS_PRIM ( ( TDM_NQ - 1 ) / 2 ) /* Ratio index value */ + +#define TDM_L_NOVA_NS 5000000L /* mixing overlap length */ + +#define TDM_SECONDARY_SIGNALLING 3 /* number of bits to code the signaling for secondary channel */ +#define TDM_RATIO_BITS 5 /* number of bits to code the correlation ratio */ +#define TDM_LP_REUSE_BITS 1 /* number of bits to code LP reuse flag for secondary channel */ +#define TDM_LR_CONTENT_BITS 1 /* number of bits to code flag when the content is LR or not */ +#define TDM_SIGNAL_BITS_READ_FROM_THE_END_OF_BS ( TDM_SECONDARY_SIGNALLING + TDM_RATIO_BITS + TDM_LP_REUSE_BITS + TDM_LR_CONTENT_BITS + STEREO_BITS_TCA ) +#define TDM_IC_LSF_PRED_BITS 1 /* number of bits to code the inter channel LSF prediction mode */ + + +/*----------------------------------------------------------------------------------* + * MDCT Stereo Constants + *----------------------------------------------------------------------------------*/ + +/* MDCT stereo modes */ +#define SMDCT_MS_DECISION 0 + +#define MAX_SFB 70 /* Maximum number of stereo frequency bands = 64 + 6 for TCX after ACELP */ + +#define SMDCT_DUAL_MONO 0 /* Dual-mono MDCT Stereo */ +#define SMDCT_MS_FULL 1 /* MS MDCT Stereo */ +#define SMDCT_BW_MS 2 /* Band-wise MS MDCT Stereo */ + +#define SMDCT_MINIMUM_ARITH_BITS 17 /* Minimum bits to reserve for the arithmetic coder */ +#define SMDCT_GLOBAL_ILD_BITS 4 +#define SMDCT_ILD_RANGE ( 1 << SMDCT_GLOBAL_ILD_BITS ) /* Range of the coded ILD */ +#define SMDCT_NBBITS_SPLIT_RATIO 3 +#define SMDCT_BITRATE_RATIO_RANGE ( 1 << SMDCT_NBBITS_SPLIT_RATIO ) /* Range of the coded bitrate distribution ratio */ +#define SMDCT_EQUAL_RATIO_RANGE ( SMDCT_BITRATE_RATIO_RANGE >> 1 ) + +#define SMDCT_MAX_STEREO_BANDS_TCX20 44 +#define SMDCT_MAX_STEREO_BANDS_TCX10 33 + +#define MAX_MDCT_ITD_BRATE IVAS_64k + +#define SNS_LOW_BR_MODE -1 +#define SNS_NPTS 16 /* Number of downsampled SNS parameters */ +#define SNS_STEREO_MODE_LR 0 +#define SNS_STEREO_MODE_MS 1 +#define SNS_STEREO_MODE_OFFSET_INDICES 4 +#define SNS_MSVQ_NSTAGES_TCX20 4 +#define SNS_MSVQ_NSTAGES_TCX10 3 +#define SNS_MSVQ_NSTAGES_SIDE 2 +#define SNS_CDBKS_BITS_4_FRAC 12 +#define SNS_MEANS_BITS_4_FRAC 14 + +#define MDCT_ST_PLC_FADEOUT_MIN_NOISE_NRG 0.001f +#define MDCT_ST_PLC_FADEOUT_MAX_CONC_FRAME 2 * FRAMES_PER_SEC +#define MDCT_ST_PLC_FADEOUT_TO_ZERO_LEN 20 +#define MDCT_ST_PLC_FADEOUT_DELAY_4_LSP_FADE 3 + +typedef enum { + NOISE_GEN_MODE_UNDEF = -1, + EQUAL_CORES = 0, + TCX10_IN_0_TCX20_IN_1, + TCX20_IN_0_TCX10_IN_1, +} TONALMDCTCONC_NOISE_GEN_MODE; + +typedef enum { + ON_FIRST_LOST_FRAME, + ON_FIRST_GOOD_FRAME, +} TONALMDCTCONC_NOISE_SHAPE_WHITENING_MODE; + + +/*----------------------------------------------------------------------------------* + * MDFT FB Constants + *----------------------------------------------------------------------------------*/ + +#define MDFT_FB_BANDS_240 240 +#define CLDFB_TO_MDFT_FAC 4 +#define MDFT_NO_COL_MAX 4 + +/*----------------------------------------------------------------------------------* + * General Parametric Coding Constants + *----------------------------------------------------------------------------------*/ + +#define MAX_PARAM_SPATIAL_SUBFRAMES 4 /* Maximum number of subframes for parameteric spatial coding */ +#define L_SPATIAL_SUBFR_48k (L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES) +#define CLDFB_SLOTS_PER_SUBFRAME ( CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES ) /* Number of CLDFB slots per subframe */ + + +/*----------------------------------------------------------------------------------* + * SBA Constants + *----------------------------------------------------------------------------------*/ + +#define SBA_FOA_ORDER 1 +#define SBA_HOA2_ORDER 2 +#define SBA_HOA3_ORDER 3 + +#define SBA_PLANAR_BITS 1 +#define SBA_ORDER_BITS 2 + +#define SBA_MIN_BRATE_HOA IVAS_256k +#define SBA_NHARM_HOA3 16 +#define SBA_T_DESIGN_11_SIZE 70 +#define SBA_DTX_BITRATE_THRESHOLD IVAS_80k + +/*----------------------------------------------------------------------------------* + * DirAC Constants + *----------------------------------------------------------------------------------*/ + +#define DIRAC_MAX_ANA_CHANS 11 /* Maximum number of channels for DirAC analysis */ + +#define DIRAC_NUM_DIMS 3 /* number of directions to estimate (X,Y,Z) */ +#define DIRAC_MAX_NBANDS 12 /* Maximum number of frequency bands for the DirAC Side Parameter decoding */ +#define DIRAC_LOW_BANDRES_STEP 2 /* always combine two bands for low band resolution in the DirAC parameter coding */ +#define DIRAC_NO_COL_AVG_DIFF 32 /* Number of slots for averaging intensity vector for diffuseness computation */ +#define DIRAC_DIFFUSE_LEVELS 8 /* Size of the diffuseness alphabet (constant value) */ +#define DIRAC_DITH_SEED 29680 +#define DIRAC_MAX_BITS 512 /* Maximum number of bits for DirAC side information per frame */ +#define MAX_NUM_ENC_CLDFB_INSTANCES 8 /* Maximum Cldfb instances in DirAC encoder */ +#define DIRAC_NO_COL_AVG_DIFF_NS 40000000L +#define DIRAC_NO_FB_BANDS_MAX MDFT_FB_BANDS_240 +#define DELAY_DIRAC_ENC_CMP_NS_PARAM_ISM ( IVAS_ENC_DELAY_NS + IVAS_DEC_DELAY_NS ) /* == 12 ms */ + +#define DIRAC_HO_NUMSECTORS 2 +#define NUM_ANA_SECTORS 2 + + +/* DirAC renderer setup */ +typedef enum +{ + DIRAC_SYNTHESIS_INVALID, + DIRAC_SYNTHESIS_PSD_LS, /* PSD renderer in loudspeakers domain */ + DIRAC_SYNTHESIS_GAIN_SHD, /* Gain renderer in Spherical Harmonic Domain*/ + DIRAC_SYNTHESIS_PSD_SHD, /* PSD renderer in Spherical Harmonic Domain*/ + DIRAC_SYNTHESIS_MONO, + DIRAC_SYNTHESIS_COV_MC_LS +} DIRAC_SYNTHESIS_CONFIG; + +/* DirAC renderer panning setup */ +typedef enum +{ + DIRAC_PANNING_INVALID, + DIRAC_PANNING_HOA3, /* HOA3 */ + DIRAC_PANNING_VBAP /* VBAP */ +} DIRAC_PANNING_CONFIG; + +#define DIRAC_DIFF_NUM_AMBI_COMP 4 +#define DIRAC_HOA_RENDERING_NUM_VIRT_DECORR_LS 8 +#define DIRAC_GAIN_LIMIT 31.622776601683793f /* 30db gain limitiation */ +#define DIRAC_MAX_NUM_DECORR_FILTERS 22 +#define DIRAC_MAX_DECORR_FILTER_LEN 20 +#define DIRAC_DECORR_NUM_SPLIT_BANDS 3 +#define DIRAC_DECORR_FILTER_LEN_1 15 +#define DIRAC_DECORR_FILTER_LEN_2 6 +#define DIRAC_DECORR_FILTER_LEN_3 3 +#define DIRAC_ONSET_ALPHA 0.95f +#define DIRAC_ONSET_BETA 0.995f +#define DIRAC_ONSET_GAIN 4.0f + +#define DELAY_DIRAC_ENC_CMP_NS 9500000L /* Delay to be compensated on DirAC encoder */ +#define DELAY_DIRAC_SPAR_ENC_CMP_NS 500000L /* here we may set the 24 samples (at 48 kHz) additional delay to something else, leave as is for now*/ +#define DELAY_DIRAC_PARAM_DEC_SFR 2 /* Delay to be compensation for DirAC parameters in the decoder (subframes) */ + +#define DELAY_MASA_PARAM_DEC_SFR 2 /* Delay to be compensation for MASA parameters in the decoder (subframes) */ +#define SPH_IDX_FRONT ( MASA_NO_POINTS_EQUATOR / 2 ) /* Spherical index corresponding to front direction for setting as default value */ + +#define DIRAC_SLOT_NS 1250000L /* time duration of a time slot, 1.25ms (==DELAY_RENERER_NS/MAX_PARAM_SPATIAL_SUBFRAMES) */ +#define DIRAC_SLOT_ENC_NS 5000000L + +#define DIRAC_MONO_THRESH_SILENCE 3e4f +#define DIRAC_MONO_NORM_FACTOR 1e13f +#define DIRAC_MONO_ONE_ON_NORM_FACTOR (1.f / 1e13f) +#define DIRAC_MONO_MAX_THRESH 1e6f +#define DIRAC_MONO_MIN_THRESH 1e2f +#define DIRAC_MONO_FRAME_THRESH 15 /* 30ms */ + +typedef enum +{ + DIRAC_OPEN, /* initialize to default value */ + DIRAC_RECONFIGURE, /* HOA3 */ + DIRAC_RECONFIGURE_MODE +} DIRAC_CONFIG_FLAG; + + +/*----------------------------------------------------------------------------------* + * SPAR constants + *----------------------------------------------------------------------------------*/ + +#define SPAR_CONFIG_BW FB + +#define IVAS_SPAR_MAX_CH ((( IVAS_MAX_SBA_ORDER ) * ( IVAS_MAX_SBA_ORDER )) + 2) /* HOA2 + pHOA3*/ +#define IVAS_HBR_MAX_DECOR_CHS (2) + +#define IVAS_SPAR_MAX_FB_IN_CHAN 11 + +#define IVAS_SPAR_P_LOWERTRI ((IVAS_SPAR_MAX_CH - 1) * (IVAS_SPAR_MAX_CH - 2)) >> 1 +#define IVAS_SPAR_MAX_C_COEFF (IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS) * ( IVAS_SPAR_MAX_DMX_CHS - 1) + +#define IVAS_SPAR_HOA3_NP_CHS 8 /* number of higher order non-planar channels */ + +#define SPAR_NUM_CODING_STRAT_BITS 3 + +/* AGC constants */ +#define AGC_BITS_PER_CH 3 +#define AGC_EMAX 0 +#define AGC_SIGNALLING_BITS 1 +#define IVAS_SPAR_ARITH_OVERSHOOT_BITS 16 + +/* Common SPAR metadata constants */ +#define IVAS_ACTIVEW_DM_F_SCALE 0.5f +#define IVAS_ACTIVEW_DM_F_SCALE_DTX 0.25f +#define IVAS_ACTIVEW_DM_F_SCALE_VLBR 0.25f +#define IVAS_SPAR_FOA_DFLT_FREQ_PER_CHAN 24000 + +#define IVAS_SPAR_DYN_ACTIVEW_THRESH (0.0039f) +#define IVAS_SPAR_SIDE_CH_DYN_ACTIVEW_THRESH (32.0f) + +#define MAX_QUANT_STRATS 3 +#define MAX_CODING_STRATS 3 +#define IVAS_NUM_PROB_MODELS 4 +#define IVAS_MAX_INPUT_LEN ( IVAS_MAX_NUM_BANDS * ( IVAS_SPAR_P_LOWERTRI ) ) +#define IVAS_MAX_QUANT_LEVELS 32 +#define BRATE_SPAR_Q_STRAT IVAS_256k + +#define SPAR_SID_BITS_TAR_PER_BAND 18 + +typedef enum +{ + WYXZ = 0, + WY = 0, + WX, + WZ, + WYiX, +} ivas_spar_pmx_strings_t; + +#define NUM_MD_Q_COEFS_SET 4 + +#define IVAS_RED_BAND_FACT 2 + +typedef enum +{ + PRED_COEFF = 0, + DRCT_COEFF, + DECD_COEFF, + DECX_COEFF +} ivas_coeffs_type_t; + +#define IVAS_SPAR_BR_TABLE_LEN 20 + +/* TD decorr */ +enum +{ + IVAS_TD_DECORR_OUT_1CH = 1, + IVAS_TD_DECORR_OUT_2CH, + IVAS_TD_DECORR_OUT_3CH, + IVAS_TD_DECORR_OUT_4CH, + IVAS_TD_DECORR_OUT_5CH, + IVAS_TD_DECORR_OUT_6CH, + IVAS_TD_DECORR_OUT_7CH, + IVAS_TD_DECORR_OUT_8CH +}; + +#define IVAS_SPAR_MAX_DMX_CHS 4 +#define IVAS_MAX_DECORR_CHS IVAS_TD_DECORR_OUT_8CH +#define IVAS_MAX_DECORR_APD_SECTIONS 16 +#define IVAS_APD_2_SECT 2 +#define IVAS_APD_4_SECT 4 +#define IVAS_APD_8_SECT 8 +#define IVAS_APD_16_SECT 16 + +#define IVAS_DECORR_PARM_LOOKAHEAD_TAU 2e-3f +#define IVAS_DECORR_PARM_APD_TAU 20e-3f + +/* IVAS SBA PCA */ +#define IVAS_PCA_NB_SUBR 20 /* 80 -> 0.25 ms, 40 -> 0.5 ms... */ +#define IVAS_PCA_COV_THRES 3e-5f +#define IVAS_PCA_QUAT_EPS 1e-7f +#define IVAS_PCA_QBITS 19 +#define IVAS_PCA_N1 91 +#define IVAS_PCA_N1_EQ ( (IVAS_PCA_N1-1)/2 ) +#define IVAS_PCA_BIT_LEN ( 1 + ( IVAS_PCA_QBITS - 1 + IVAS_PCA_QBITS ) ) +#define IVAS_PCA_INTERP 4 +#define IVAS_PCA_N_SLOTS 40 +#define IVAS_PCA_LEN_INTERP_Q ( IVAS_PCA_INTERP * IVAS_PCA_N_SLOTS ) +#define IVAS_PCA_DELAY_CMP 24 +#define IVAS_PCA_LEN_INTERP_EIG_DEC ( (IVAS_PCA_N_SLOTS+IVAS_PCA_DELAY_CMP)*16) +#define IVAS_PCA_THRES_MIN_DOT 0.8f +#define IVAS_PCA_THRES_MIN_DOT2 0.0f +#define IVAS_PCA_THRES_DIST_ALT 6.0f + +typedef enum +{ + PCA_MODE_ACTIVE = 0, + PCA_MODE_INACTIVE = 1 +} ivas_pca_bypass_mode; + +enum +{ + PRED_Q_1 = 0, + PRED_Q_7, + PRED_Q_15, + PRED_Q_21, + PRED_Q_31, + PRED_Q_7_ACTIVE_W, + TOTAL_PRED_QUANT_STRATS_HUFF = 5, + PRED_Q_15_ACTIVE_W, + PRED_Q_21_ACTIVE_W, + TOTAL_PRED_QUANT_STRATS_ARITH + }; + +enum +{ + DRCT_Q_1 = 0, + DRCT_Q_7, + DRCT_Q_9, + DRCT_Q_11, + TOTAL_DRCT_QUANT_STRATS + }; + +enum +{ + DECD_Q_1 = 0, + DECD_Q_3, + DECD_Q_5, + DECD_Q_7, + DECD_Q_9, + DECD_Q_11, + TOTAL_DECD_QUANT_STRATS + }; + +/*----------------------------------------------------------------------------------* + * MASA constants + *----------------------------------------------------------------------------------*/ + +#define MAX_NO_THETA 19 +#define NO_THETA16_MAX 122 /* number of theta values for 16 bits */ +#define NO_SPHERICAL_GRIDS 11 /* number of spherical grid structures */ + +#define MASA_FREQUENCY_BANDS 24 +#define MASA_MAXIMUM_CODING_SUBBANDS 24 +#define MASA_MAXIMUM_DIRECTIONS 2 +#define MASA_MAX_TRANSPORT_CHANNELS 2 + + +#define MASA_NUM_DEFINED_SUR_SPR_COH_ENE_BINS 5 + +#define MASA_DELTA_AZI_DCT0 30 +#define MASA_DELTA_AZI_DCT 10 + +#define MASA_TRANSP_BITS 1 +#define NO_BITS_MASA_ISM_NO_OBJ 2 +#define MASA2TOTAL_THR 0.98f +#define BITS_MASA2TOTTAL_DCT0 6 +#define STEP_M2T 0.1f +#define MASA_HEADER_BITS 2 +#define MASA_SUBFRAME_BITS 1 +#define MASA_LOWBITRATE_MODE_BITS 1 +#define MASA_FACTOR_CV_COH 6 + +#define MASA_GR_ORD_EL 1 +#define MASA_GR_ORD_AZ 2 + +#define MASA_DIRECTION_MAX_BITS 11 +#define MASA_NO_INDEX 32767 +#define MASA_BITS_ER 3 +#define MASA_BITS_ER_HR 4 +#define MASA_MIN_BITS_TF 4 +#define MASA_LIMIT_2D 2 +#define MASA_NO_CV_COH 8 +#define MASA_NO_CV_COH1 5 +#define MASA_MAX_NO_CV_SUR_COH 8 +#define MASA_NO_CB_SUR_COH 7 +#define MASA_MIN_BITS_SURR_COH 12 + +#define MASA_SUM_FREQ_RANGE_BINS 25 /* Constant for MASA transport signal type detection */ +#define MASA_HI_FREQ_START_BIN 14 /* Constant for MASA transport signal type detection */ +#define MASA_STEREO_INTERPOLATION_SLOTS 16 /* The number of slots to interpolate when changing MASA transport signal type */ +#define MASA_SUM_PROTO_START_BIN 7 /* Constant for Ambisonics rendering from MASA */ + +#define QMETADATA_MAXBIT_REQ_MASA 900 /* max bit-bit/direction for avoiding requantization in MASA path */ +#define QMETADATA_MAXBIT_REQ_SBA 400 /* max bit-bit/direction for avoiding requantization in SBA path */ +#define MASA_COH_LIMIT_2IDX 96 /* limit for sum of values across components for having two joint indexes */ +#define QMETADATA_MAX_NO_DIRECTIONS 2 +#define MASA_MAX_BITS 1300 /* max. bit-budget for MASA metadata */ + +#define MASA_MAX_BITS_HR 2000 /* max. bit-budget for MASA metadata in HR mode*/ +#define HR_MASA_ER_LEVELS 16 +#define MAX_REDUCED_NBANDS 18 /* max number of subbands that is less than the default value 24 */ + +#define LIMIT_ER_ELEVATION_ENC 4 +#define LIMIT_ER_SIMPLE_ENC 6 +#define LIMIT_USE_COMMON 3 + +#define MASA_COHERENCE_TOLERANCE 0.1f +#define MASA_COHERENCE_THRESHOLD 0.1f +#define MASA_RATIO_TOLERANCE 0.1f +#define MASA_RATIO_THRESHOLD 0.1f +#define MASA_ANGLE_TOLERANCE 0.5f +#define MASA_LIMIT_NO_BANDS_SUR_COH 8 +#define MINIMUM_BIT_BUDGET_NORMAL_META 100 +#define DIFF_DFRATIO_2BIT_LIMIT_IDX_HODIRAC 4 +#define DIFF_DFRATIO_2BIT_LIMIT_IDX 3 + +#define DIFF_DFRATIO_1BIT_LIMIT_IDX 6 +#define DIFF_EC_HUFF_BAND_LIMIT 8 +#define DIFF_EC_HUFF_GR0_LIMIT 8 +#define VAR_AZI_THRESH 25 +#define MASA_LIMIT_IDX_AVG_AZI 4 + +#define MASA_NO_POINTS_EQUATOR 430 +#define MASA_NO_CIRCLES 121 +#define MASA_ASIN_OFFSET 0.0064471690266724975f +#define MASA_NTOT2_FAC 32768.00566947353f +#define MASA_ANGLE_AT_EQUATOR 0.012894427382667f +#define MASA_ANGLE_AT_EQUATOR_DEG 0.738796268264740f +#define MASA_INV_ANGLE_AT_EQUATOR_DEG 1.353553128183453f +#define MASA_STEREO_MIN_BITRATE IVAS_24k4 +#define MAXIMUM_OMASA_FREQ_BANDS 8 /* Corresponds to maximum number of coding bands at 32 kbps */ +#define OMASA_STEREO_SW_CNT_MAX 100 + +#define MASA_BIT_REDUCT_PARAM 10 +#define MASA_MAXIMUM_TWO_DIR_BANDS 24 +#define NBITS_HR_COH 4 + +#define MASA_JBM_RINGBUFFER_FRAMES 3 + +typedef enum +{ + MASA_STEREO_NOT_DEFINED, + MASA_STEREO_SPACED_MICS, + MASA_STEREO_DOWNMIX +} MASA_TRANSPORT_SIGNAL_TYPE; + +typedef enum +{ + MASA_FRAME_1SF, + MASA_FRAME_4SF +} MASA_FRAME_MODE; + + +/*----------------------------------------------------------------------------------* + * Multichannel format + *----------------------------------------------------------------------------------*/ + +#define MC_LS_SETUP_BITS 3 /* number of bits for writing the MC LS configuration */ +#define LS_SETUP_CONVERSION_NUM_MAPPINGS 35 /* number of mappings for LS setup conversion */ + +typedef enum +{ + MC_MODE_NONE, + MC_MODE_MCT, + MC_MODE_PARAMMC, + MC_MODE_MCMASA, + MC_MODE_PARAMUPMIX +} MC_MODE; + +typedef enum +{ + MC_LS_SETUP_5_1, + MC_LS_SETUP_7_1, + MC_LS_SETUP_5_1_2, + MC_LS_SETUP_5_1_4, + MC_LS_SETUP_7_1_4, + MC_LS_SETUP_INVALID +} MC_LS_SETUP; + + +/*----------------------------------------------------------------------------------* + * McMASA constants + *----------------------------------------------------------------------------------*/ + +#define MCMASA_SEPARATE_BRATE IVAS_64k /* minimum bitrate from which separated channel coding is supported */ + +#define MCMASA_MAX_ANA_CHANS 11 /* Maximum number of channels currently used in analysis of multichannel formats */ +#define MCMASA_MONOBITRATIO 0.3f +#define MCMASA_MONOBITRATIO_64k 0.25f +#define MC_MASA_THR_ELEVATION 40 + +#define MCMASA_LFE_QLOW -6.5f +#define MCMASA_LFE_DELTA 1.0f +#define MCMASA_LFE_1BIT_THRES 0.03f +#define MCMASA_LFE_ALPHA 0.67f +#define MCMASA_LFE_BETA 0.09f +#define MCMASA_LFE_THETA 1.3f +#define MCMASA_LFE_SYNTH_ALPHA 0.95f /* Smoothing coefficient for LFE synthesis */ + +#define NUM_ELEVATED_SPEAKERS 4 + +#define MCMASA_MIN_SPEAKERS_SEPARATE_CENTER 4 + +/*----------------------------------------------------------------------------------* + * MCT constants + *----------------------------------------------------------------------------------*/ + +#define LFE_CHANNEL 3 + +#define MIN_LFE_NRG 0.5f +#define MCT_MAX_CHANNELS MAX_TRANSPORT_CHANNELS +#define MCT_MAX_BLOCKS ( MCT_MAX_CHANNELS / CPE_CHANNELS ) /* max. number of channel pairs (MCT_MAX_CHANNELS/2) within MCT*/ + +#define MAX_NUM_DATA max( MCT_MAX_CHANNELS, 4 ) + +#define NBBITS_MCT_RATIO 4 +#define BITRATE_MCT_RATIO_RANGE ( 1 << NBBITS_MCT_RATIO ) /* Range of the coded bitrate distribution ratio */ + +#define MCT_NUM_BLOCK_DATA_BITS 4 + +typedef enum +{ + MCT_CHAN_MODE_REGULAR, + MCT_CHAN_MODE_IGNORE +} MCT_CHAN_MODE; + + +/*----------------------------------------------------------------------------------* + * MC Param-Upmix Mode Constants + *----------------------------------------------------------------------------------*/ + +#define MC_PARAMUPMIX_MAX_TRANSPORT_CHANS 8 +#define MC_PARAMUPMIX_MAX_INPUT_CHANS 12 +#define MC_PARAMUPMIX_MAX_BITS 1024 /* Maximum number of bits for the MC Param-Upmix metadata */ +#define MC_PARAMUPMIX_COMBINATIONS 4 /* number of sets of 2 channels combined */ +#define MC_PARAMUPMIX_NCH 2 /* number of channels to combine into 1 */ +#define MC_PARAMUPMIX_MIN_CLDFB 8 + +typedef enum _COV_SMOOTHING_TYPE +{ + COV_SMOOTH_SPAR, + COV_SMOOTH_MC +} COV_SMOOTHING_TYPE; + +typedef struct { + const int32_t *value; + const uint16_t *length; +} HUFF_TAB; + +typedef struct { + int32_t value[81]; + unsigned short length[81]; +} HUFF_ELEMENTS; + +typedef struct { + HUFF_ELEMENTS df0; + HUFF_ELEMENTS df; + HUFF_ELEMENTS dt; +} HUFF_TABLE; + +typedef enum { + ALPHA, + BETA +} PAR_TYPE; + +typedef enum { + FINE, + COARSE +} QUANT_TYPE; + +typedef struct { + int16_t nquant; + int16_t offset; + float data[35]; +} ACPL_QUANT_TABLE; + +typedef struct +{ + const int16_t (*alpha[2])[2]; + const int16_t (*beta[2])[2]; +} HUFF_NODE_TABLE; + + +/*----------------------------------------------------------------------------------* + * Parametric MC Constants + *----------------------------------------------------------------------------------*/ + +typedef enum +{ + PARAM_MC_SYNTH_DIRECT, /* synthesis to the transport format */ + PARAM_MC_SYNTH_LS_CONV_COV, /* loudspeaker format conversion in the covariance domain */ + PARAM_MC_SYNTH_LS_CONV_CLDFB, /* loudspeaker format conversion in the CLDFB domain */ + PARAM_MC_SYNTH_MONO_STEREO /* synthesis to mono or stereo */ +} PARAM_MC_SYNTHESIS_CONF; + +#define PARAM_MC_REG_SX (0.2f) /* Regularization factor for mixing matrix calculation */ +#define PARAM_MC_REG_GHAT (0.001f) /* Regularization factor for mixing matrix calculation */ +#define PARAM_MC_MAX_PARAMETER_BANDS 20 /* Maximum number of parameter bands */ +#define PARAM_MC_MAX_PARAMETER_BANDS_RES 14 /* Maximum number of parameter bands with decorrelation */ +#define PARAM_MC_MAX_NSLOTS MAX_JBM_CLDFB_TIMESLOTS /* Maximum number of CLDFB slots in a frame */ +#define PARAM_MC_MAX_NSLOTS_IN_SUBFRAME 4 /* Maximum number of CLDFB slots in a subframe */ +#define PARAM_MC_NSUBFRAMES_DEC 4 /* Number of subframes for the synthesis in the decoder */ +#define PARAM_MC_MAX_BANDS_IN_PARAMETER_BAND 30 /* Maximum number of CLDFB frequency bands within a parameter band */ +#define PARAM_MC_PARAMETER_FRAMES 2 /* Number of frames a parameter set for a parameter band is used*/ +#define PARAM_MC_ICC_ERROR_BIAS_FAC (1.15f) /* factor for favouring past ICC maps in the adaptive ICC map decision */ +#define PARAM_MC_TRANSIENT_BAND_STEP 2 /* Number of parameter bands combined in case of a transient frame*/ +#define PARAM_MC_MAX_DECORR_CLDFB_BANDS 20 /* Maximum number of CLDFB bands with decorrelation */ +#define PARAM_MC_MAX_TRANSPORT_CHANS 4 /* Number of down mix channels */ +#define PARAM_MC_MAX_ILD_REF_CHANNELS 2 /* Maximum number of reference channels for a coded ILD */ +#define PARAM_MC_NUM_CONFIGS 15 /* Number of available Parametric MC configurations */ +#define PARAM_MC_MAX_BAND_LFE 1 /* Number of parameter bands for LFE coding */ +#define PARAM_MC_SZ_ICC_MAP 11 /* Maximum number of transmitted ICCs per parameter band */ +#define PARAM_MC_SZ_ILD_MAP 12 /* Maximum number of transmitted channel energies per band*/ +#define PARAM_MC_MAX_VAL_MAP_SIZE 12 /* Maximum number of transmitted parameters per band */ +#define PARAM_MC_RANGE_CODER_TOT_SHIFT 16 /* resolution of the range coder frequency tables */ +#define PARAM_MC_SZ_ICC_QUANTIZER 8 /* Length of the ICC quantizer for Parametric MC */ +#define PARAM_MC_NUM_BITS_ICC_SCALAR_QUANT 3 /* Number of bits for ICC uniform coding */ +#define PARAM_MC_SZ_ILD_QUANTIZER_4BITS 16 /* Length of the ILD quantizer for Parametric MC */ +#define PARAM_MC_NUM_BITS_ILD_SCALAR_QUANT 4 /* Number of bits for ILD uniform coding */ +#define PARAM_MC_DEFAULT_MIN_ILD (-92.0f) /* Default relative channel level for untransmitted channel energies */ +#define PARAM_MC_MAX_BITS 1024 /* Maximum number of bits for the Parametric MC metadata */ +#define PARAM_MC_MAX_BAND_ABS_COV_ENC 10 +#define PARAM_MC_MAX_PARAM_BAND_ABS_COV_ENC 10 +#define PARAM_MC_MAX_BAND_ABS_COV_DEC 10 +#define PARAM_MC_ENER_LIMIT_INTRAFRAME (1.5f) +#define PARAM_MC_ENER_LIMIT_INTERFRAME (2.0f) +#define PARAM_MC_ENER_LIMIT_MAX_DELTA_FAC (15.0f) +#define PARAM_MC_NUM_ATTACK_ILD_THRESH (3) +#define PARAM_MC_LFE_ON_THRESH (8000.0f) +#define PARAM_MC_BAND_TO_MDCT_BAND_RATIO 16 /* Ratio of resolution of CLDFB Bands to MDCT Bands */ +#define PARAM_MC_SLOT_ENC_NS 2500000L +#define PARAM_MC_MDFT_NO_SLOTS 8 +#define PARAM_MC_CLDFB_TO_MDFT_FAC 2 + +/*----------------------------------------------------------------------------------* + * LFE Coding Constants + *----------------------------------------------------------------------------------*/ + +#define IVAS_LFE_ID_BITS 1 + +typedef enum +{ + IVAS_FILTER_STAGE_0, + IVAS_FILTER_STAGE_1, + IVAS_FILTER_MAX_STAGES /* this becomes array len while declaring the array */ +} LFE_FILTERS_STAGES; + +/* IIR filter orders */ +typedef enum +{ + IVAS_FILTER_ORDER_1 = 1, + IVAS_FILTER_ORDER_2 = 2, + IVAS_FILTER_ORDER_4 = 4, +} ivas_filter_order; + +#define IVAS_BIQUAD_FILT_LEN 3 +#define IVAS_LFE_FADE_LEN_48K 384 +#define IVAS_LFE_FADE_LEN_32K 256 +#define IVAS_LFE_FADE_LEN_16K 128 +#define IVAS_LFE_FADE_LEN_8K 64 +#define IVAS_LFE_SHIFTS_PER_DOUBLE 4 +#define IVAS_LFE_NUM_COEFFS_IN_SUBGRP 2 +#define IVAS_LFE_MAX_NUM_DCT_PASS_BINS 8 +#define IVAS_LFE_MAX_NUM_DCT_COEFFS (IVAS_LFE_MAX_NUM_DCT_PASS_BINS * IVAS_LFE_NUM_COEFFS_IN_SUBGRP) +#define IVAS_LFE_FADE_NS 8000000L /* 8.0 ms */ +#define IVAS_MAX_NUM_QUANT_STRATS 2 +#define IVAS_MAX_NUM_DCT_COEF_GROUPS 4 +#define IVAS_LFE_SHIFT_BITS 5 +#define IVAS_LFE_BITRATE_5000 5000 +#define IVAS_LFE_ABS_SUM_FLT_THR (0.000001f) +#define IVAS_ZERO_PAD_LEN_MULT_FAC (0.5f) + +/* LFE PLC */ +#define LFE_PLC_BUFLEN 240 +#define LFE_PLC_FS 1600 +#define L_FRAME_1k6 ( 20 * LFE_PLC_FS / 1000 ) +#define LFE_PLC_LENANA LFE_PLC_BUFLEN +#define LFE_PLC_FDEL 300 + + +/*----------------------------------------------------------------------------------* + * Amplitude Panning (EFAP, VBAP) constants + *----------------------------------------------------------------------------------*/ + +#define PANNING_AZI_RESOLUTION 2 +#define PANNING_ELE_RESOLUTION 5 + +#define EFAP_MAX_CHAN_NUM 5 /* Maximum number of channels that constitute a polygon, 4 or 5 */ +#define EFAP_MAX_POLY_SET 50 /* Upper bound on number of polygons; with a Speaker setup of 16.0, we obtain 44 polygons/triangles in the matlab implementation. */ + +#define EFAP_MODE_EFAP 0 /* EFAP Panning */ +#define EFAP_MODE_EFIP 1 /* EFIP Panning */ + +typedef enum +{ + EFAP_DMX_NONE, + EFAP_DMX_AMPLITUDE, + EFAP_DMX_INTENSITY +} EFAP_VTX_DMX_TYPE; + + +#define VBAP_NUM_SEARCH_SECTORS 4 + + +/*----------------------------------------------------------------------------------* + * Binaural Rendering Constants + *----------------------------------------------------------------------------------*/ + +#define BINAURAL_MAXBANDS 60 /* Max number of bands */ +#define BINAURAL_CONVBANDS 50 /* Bands upto which convolution is performed */ +#define BINAURAL_NTAPS 3 +#define BINAURAL_NTAPS_SBA BINAURAL_NTAPS + +#define BINAURAL_NTAPS_MAX 96 + +#define HRTF_SH_ORDER 3 +#define HRTF_SH_CHANNELS HOA3_CHANNELS +#define HRTF_LS_CHANNELS 15 +#define HRTF_NUM_BINS 60 +#define REVERB_PREDELAY_MAX 20 /* Max input delay for reverb module */ +#define GAIN_LFE 1.88364911f /* Gain applied to LFE during renderering */ +#define LOW_BIT_RATE_BINAURAL_EQ_BINS 17 /* Number of bins in an EQ applied at low bit rates in binauralization */ +#define LOW_BIT_RATE_BINAURAL_EQ_OFFSET 14 /* Offset of bins where the low-bit-rate EQ starts*/ + +#define BINAURAL_COHERENCE_DIFFERENCE_BINS 9 /* Number of bins for direction-dependent diffuse-field binaural coherence */ + +typedef enum +{ + BINAURAL_INPUT_AUDIO_CONFIG_INVALID, + BINAURAL_INPUT_AUDIO_CONFIG_COMBINED, /* 5_1, 5_1_2, 5_1_4, 7_1, 7_1_4 */ + BINAURAL_INPUT_AUDIO_CONFIG_HOA3, /* HOA3 */ + BINAURAL_INPUT_AUDIO_CONFIG_HOA2, /* HOA2 */ + BINAURAL_INPUT_AUDIO_CONFIG_FOA, /* FOA */ + BINAURAL_INPUT_AUDIO_CONFIG_UNDEFINED /* Not used */ + +} BINAURAL_INPUT_AUDIO_CONFIG; + +#define HEADROT_ORDER 3 +#define HEADROT_SHMAT_DIM ( ( HEADROT_ORDER + 1 ) * ( HEADROT_ORDER + 1 ) ) +#define HEADROT_SHMAT_DIM2 ( HEADROT_SHMAT_DIM * HEADROT_SHMAT_DIM ) + + + + +/*----------------------------------------------------------------------------------* + * TD Binaural Object renderer + *----------------------------------------------------------------------------------*/ + +#define MAX_NUM_TDREND_CHANNELS MAX_CICP_CHANNELS /* max. number of channels in TD renderer (objects or loudspeaker channels) */ + +#define SFX_SPAT_BIN_MAX_NO_OF_OUTPUT_SAMPLES 288 /* 288 = 6 msec @ 48 kHz. */ +#define HRTF_MODEL_N_SECTIONS 3 /* No. sections used in approximate evaluation of model */ +#define HRTF_MODEL_BSPLINE_NUM_COEFFS 4 /* No. BSpline coefficients, including zeroth order e.g. cubic -> 4 */ +#define HRTF_MODEL_BSPLINE_NUM_COEFFS_SQ 16 /* Square of HRTF_MODEL_BSPLINE_NUM_COEFFS */ +#define SFX_SPAT_BIN_MAX_FILTER_LENGTH 256 + +#define SPAT_BIN_MAX_INPUT_CHANNELS 1 /* Max number of input channels per source/object. Mono for now, but stereo objects may be considered. */ +#define MAX_ITD 50 +#define SFX_SPAT_BIN_SINC_M 5 +#define SFX_SPAT_BIN_NUM_SUBSAMPLES 64 +#define ITD_MEM_LEN (MAX_ITD + SFX_SPAT_BIN_SINC_M) +#define L_SUBFRAME5MS_48k (L_FRAME48k/4) +#define MAX_ANGULAR_STEP (0.01f) +#define MAX_ANGULAR_STEP_INV ( 1.0f / MAX_ANGULAR_STEP ) +#define MAX_INTERPOLATION_STEPS 12 + +#define LR_IAC_LENGTH_NR_FC ( RV_LENGTH_NR_FC ) + +/* ----- Enums - TD Renderer ----- */ + +typedef enum +{ + TDREND_DIST_ATTEN_MODEL_INV_DIST, + TDREND_DIST_ATTEN_MODEL_INV_DIST_CLAMPED +} TDREND_DistAttenModel_t; + +typedef enum +{ + TDREND_POSTYPE_ABSOLUTE, /* The source position is in absolute coordinates */ + TDREND_POSTYPE_NON_DIEGETIC /* The source position is non-diegetic */ +} TDREND_PosType_t; + +typedef enum +{ + TDREND_PLAYSTATUS_INITIAL, + TDREND_PLAYSTATUS_PLAYING +} TDREND_PlayStatus_t; + +typedef enum +{ + TDREND_DeallocIndex_None, + TDREND_DeallocIndex_Signal, + TDREND_DeallocIndex_Source +} TDREND_DeallocFnIndex; + +typedef enum +{ + TDREND_HRFILT_Method_BSplineModel +} TDREND_HRFILT_Method_t; + +typedef enum +{ + SFX_ON, + SFX_TRANSIENT, + SFX_OFF +} SFX_OpMode_t; + + + +/*----------------------------------------------------------------------------------* + * Reverberator constants + *----------------------------------------------------------------------------------*/ + +#define IVAS_REV_MAX_NR_BRANCHES 8 /* setup is for maximum */ +#define IVAS_REV_MAX_IIR_FILTER_LENGTH 4 /* maximum nr of taps - MUST BE EVEN! */ + +#define RV_FILTER_MAX_FFT_SIZE ( 512 ) +#define RV_FILTER_MAX_HISTORY ( 512 - 160 ) /* for longest history */ +#define RV_LENGTH_NR_FC ( RV_FILTER_MAX_FFT_SIZE / 2 ) + 1 + +#define IVAS_REVERB_DEFAULT_N_BANDS 31 + + +/*----------------------------------------------------------------------------------* + * FB mixer constants + *----------------------------------------------------------------------------------*/ + +#define IVAS_960_PT_LEN 960 +#define IVAS_640_PT_LEN 640 +#define IVAS_480_PT_LEN 480 +#define IVAS_320_PT_LEN 320 +#define IVAS_240_PT_LEN 240 +#define IVAS_160_PT_LEN 160 +#define IVAS_120_PT_LEN 120 +#define IVAS_80_PT_LEN 80 +#define IVAS_40_PT_LEN 40 + +/* FB windows ovlp */ +#define IVAS_FB_4MS_48K_SAMP 192 +#define IVAS_FB_1MS_48K_SAMP 48 +#define IVAS_FB_4MS_32K_SAMP 128 +#define IVAS_FB_1MS_32K_SAMP 32 +#define IVAS_FB_4MS_16K_SAMP 64 +#define IVAS_FB_1MS_16K_SAMP 16 + +#define IVAS_MAX_FB_MIXER_OUT_CH IVAS_SPAR_MAX_CH +#define IVAS_MAX_SPAR_FB_MIXER_IN_CH IVAS_SPAR_MAX_CH +#define IVAS_MAX_FB_MIXER_IN_CH MAX_CICP_CHANNELS + +#define MAX_NUM_BANDS_DIFF_NON48K 3 + +#define IVAS_FB_12_1MS_48K_START_OFFSET_BAND_0 ( 0 ) +#define IVAS_FB_12_1MS_48K_START_OFFSET_BAND_1 ( 0 ) +#define IVAS_FB_12_1MS_48K_START_OFFSET_BAND_2 ( 0 ) +#define IVAS_FB_12_1MS_48K_START_OFFSET_BAND_3 ( 0 ) +#define IVAS_FB_12_1MS_48K_START_OFFSET_BAND_4 ( 0 ) +#define IVAS_FB_12_1MS_48K_START_OFFSET_BAND_5 ( 9 ) +#define IVAS_FB_12_1MS_48K_START_OFFSET_BAND_6 ( 7 ) +#define IVAS_FB_12_1MS_48K_START_OFFSET_BAND_7 ( 0 ) +#define IVAS_FB_12_1MS_48K_START_OFFSET_BAND_8 ( 0 ) +#define IVAS_FB_12_1MS_48K_START_OFFSET_BAND_9 ( 49 ) +#define IVAS_FB_12_1MS_48K_START_OFFSET_BAND_10 ( 172 ) +#define IVAS_FB_12_1MS_48K_START_OFFSET_BAND_11 ( 377 ) + +#define IVAS_FB_12_1MS_48K_END_BINS_BAND_0 ( 179 ) +#define IVAS_FB_12_1MS_48K_END_BINS_BAND_1 ( 160 ) +#define IVAS_FB_12_1MS_48K_END_BINS_BAND_2 ( 215 ) +#define IVAS_FB_12_1MS_48K_END_BINS_BAND_3 ( 200 ) +#define IVAS_FB_12_1MS_48K_END_BINS_BAND_4 ( 186 ) +#define IVAS_FB_12_1MS_48K_END_BINS_BAND_5 ( 196 ) +#define IVAS_FB_12_1MS_48K_END_BINS_BAND_6 ( 230 ) +#define IVAS_FB_12_1MS_48K_END_BINS_BAND_7 ( 351 ) +#define IVAS_FB_12_1MS_48K_END_BINS_BAND_8 ( 456 ) +#define IVAS_FB_12_1MS_48K_END_BINS_BAND_9 ( 617 ) +#define IVAS_FB_12_1MS_48K_END_BINS_BAND_10 ( 892 ) +#define IVAS_FB_12_1MS_48K_END_BINS_BAND_11 ( 960 ) + +#define IVAS_FB_12_1MS_32K_START_OFFSET_BAND_0 ( 0 ) +#define IVAS_FB_12_1MS_32K_START_OFFSET_BAND_1 ( 0 ) +#define IVAS_FB_12_1MS_32K_START_OFFSET_BAND_2 ( 0 ) +#define IVAS_FB_12_1MS_32K_START_OFFSET_BAND_3 ( 0 ) +#define IVAS_FB_12_1MS_32K_START_OFFSET_BAND_4 ( 0 ) +#define IVAS_FB_12_1MS_32K_START_OFFSET_BAND_5 ( 9 ) +#define IVAS_FB_12_1MS_32K_START_OFFSET_BAND_6 ( 7 ) +#define IVAS_FB_12_1MS_32K_START_OFFSET_BAND_7 ( 0 ) +#define IVAS_FB_12_1MS_32K_START_OFFSET_BAND_8 ( 0 ) +#define IVAS_FB_12_1MS_32K_START_OFFSET_BAND_9 ( 49 ) +#define IVAS_FB_12_1MS_32K_START_OFFSET_BAND_10 ( 172 ) +#define IVAS_FB_12_1MS_32K_START_OFFSET_BAND_11 ( 377 ) + +#define IVAS_FB_12_1MS_32K_END_BINS_BAND_0 ( 179 ) +#define IVAS_FB_12_1MS_32K_END_BINS_BAND_1 ( 160 ) +#define IVAS_FB_12_1MS_32K_END_BINS_BAND_2 ( 215 ) +#define IVAS_FB_12_1MS_32K_END_BINS_BAND_3 ( 200 ) +#define IVAS_FB_12_1MS_32K_END_BINS_BAND_4 ( 186 ) +#define IVAS_FB_12_1MS_32K_END_BINS_BAND_5 ( 196 ) +#define IVAS_FB_12_1MS_32K_END_BINS_BAND_6 ( 230 ) +#define IVAS_FB_12_1MS_32K_END_BINS_BAND_7 ( 351 ) +#define IVAS_FB_12_1MS_32K_END_BINS_BAND_8 ( 456 ) +#define IVAS_FB_12_1MS_32K_END_BINS_BAND_9 ( 617 ) +#define IVAS_FB_12_1MS_32K_END_BINS_BAND_10 ( 640 ) +#define IVAS_FB_12_1MS_32K_END_BINS_BAND_11 ( 640 ) + +#define IVAS_FB_12_1MS_16K_START_OFFSET_BAND_0 ( 0 ) +#define IVAS_FB_12_1MS_16K_START_OFFSET_BAND_1 ( 0 ) +#define IVAS_FB_12_1MS_16K_START_OFFSET_BAND_2 ( 0 ) +#define IVAS_FB_12_1MS_16K_START_OFFSET_BAND_3 ( 0 ) +#define IVAS_FB_12_1MS_16K_START_OFFSET_BAND_4 ( 0 ) +#define IVAS_FB_12_1MS_16K_START_OFFSET_BAND_5 ( 9 ) +#define IVAS_FB_12_1MS_16K_START_OFFSET_BAND_6 ( 7 ) +#define IVAS_FB_12_1MS_16K_START_OFFSET_BAND_7 ( 0 ) +#define IVAS_FB_12_1MS_16K_START_OFFSET_BAND_8 ( 0 ) +#define IVAS_FB_12_1MS_16K_START_OFFSET_BAND_9 ( 49 ) +#define IVAS_FB_12_1MS_16K_START_OFFSET_BAND_10 ( 172 ) +#define IVAS_FB_12_1MS_16K_START_OFFSET_BAND_11 ( 320 ) + +#define IVAS_FB_12_1MS_16K_END_BINS_BAND_0 ( 179 ) +#define IVAS_FB_12_1MS_16K_END_BINS_BAND_1 ( 160 ) +#define IVAS_FB_12_1MS_16K_END_BINS_BAND_2 ( 215 ) +#define IVAS_FB_12_1MS_16K_END_BINS_BAND_3 ( 200 ) +#define IVAS_FB_12_1MS_16K_END_BINS_BAND_4 ( 186 ) +#define IVAS_FB_12_1MS_16K_END_BINS_BAND_5 ( 196 ) +#define IVAS_FB_12_1MS_16K_END_BINS_BAND_6 ( 230 ) +#define IVAS_FB_12_1MS_16K_END_BINS_BAND_7 ( 320 ) +#define IVAS_FB_12_1MS_16K_END_BINS_BAND_8 ( 320 ) +#define IVAS_FB_12_1MS_16K_END_BINS_BAND_9 ( 320 ) +#define IVAS_FB_12_1MS_16K_END_BINS_BAND_10 ( 320 ) +#define IVAS_FB_12_1MS_16K_END_BINS_BAND_11 ( 320 ) + +#define IVAS_FB_BANDS_12 12 +#define IVAS_FB_BANDS_20 20 +#define IVAS_MAX_NUM_BANDS IVAS_FB_BANDS_12 +#define IVAS_MAX_NUM_FB_BANDS IVAS_FB_BANDS_20 +#define IVAS_FB_12_1MS_LEN ( IVAS_FB_12_1MS_48K_END_BINS_BAND_0 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_0 ) + ( IVAS_FB_12_1MS_48K_END_BINS_BAND_1 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_1 ) + ( IVAS_FB_12_1MS_48K_END_BINS_BAND_2 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_2 ) + ( IVAS_FB_12_1MS_48K_END_BINS_BAND_3 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_3 ) + ( IVAS_FB_12_1MS_48K_END_BINS_BAND_4 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_4 ) + ( IVAS_FB_12_1MS_48K_END_BINS_BAND_5 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_5 ) + ( IVAS_FB_12_1MS_48K_END_BINS_BAND_6 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_6 ) + ( IVAS_FB_12_1MS_48K_END_BINS_BAND_7 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_7 ) + ( IVAS_FB_12_1MS_48K_END_BINS_BAND_8 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_8 ) + ( IVAS_FB_12_1MS_48K_END_BINS_BAND_9 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_9 ) + ( IVAS_FB_12_1MS_48K_END_BINS_BAND_10 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_10 ) + ( IVAS_FB_12_1MS_48K_END_BINS_BAND_11 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_11 ) +#define IVAS_16K_12BANDS_ACTIVE_BANDS 10 + +#define SPAR_DIRAC_SPLIT_START_BAND 8 +#define DIRAC_TO_SPAR_HBR_PRED_CHS (FOA_CHANNELS - 1) +#define SPAR_DTX_BANDS 2 +#define DIRAC_DTX_BANDS 2 +#define SPAR_DIRAC_DTX_BANDS ( SPAR_DTX_BANDS + DIRAC_DTX_BANDS ) +#define CLDFB_PAR_WEIGHT_START_BAND 7 + +#define QUANT_STRAT_0 0 +#define QUANT_STRAT_2 2 + + +/*----------------------------------------------------------------------------------* + * Limiter constants + *----------------------------------------------------------------------------------*/ + +#define IVAS_LIMITER_THRESHOLD 32729 /* -0.01 dBFS */ +#define IVAS_LIMITER_ATTACK_SECONDS 0.005f + + +/*----------------------------------------------------------------------------------* + * Early Reflection constants + *----------------------------------------------------------------------------------*/ + +#define ER_ABS_COEFF 6 +#define ER_MAX_SOURCES 25 +#define ER_REF_ORDER 1 +#define ER_NUM_REF 6 + +#define ER_AIR_COEFF (0.00137f) +#define ER_SOUND_SPEED (343.0f) +#define ER_MIN_WALL_DIST (0.1f) +#define ER_EUCLIDEAN_SCALE (1.29246971E-26f) + +#define ER_DEFAULT_ROOM_L (3.0f) +#define ER_DEFAULT_ROOM_W (4.0f) +#define ER_DEFAULT_ROOM_H (5.0f) +#define ER_RADIUS (1.0f) +#define ER_LIST_ORIGIN_X (0.0f) +#define ER_LIST_ORIGIN_Y (0.0f) +#define ER_LIST_HEIGHT (1.6f) + +#define ER_MIN_ROOM_DIMENSION (1.0f) +#define ER_MAX_ROOM_DIMENSION (999.0f) +#define ER_MIN_ABS_COEFF (0.0f) +#define ER_MAX_ABS_COEFF (1.0f) + + +/*----------------------------------------------------------------------------------* + * Stereo downmix EVS constants + *----------------------------------------------------------------------------------*/ + +#define STEREO_DMX_EVS_PHA_LEN_16 48 +#define STEREO_DMX_EVS_FAD_LEN_16 160 +#define STEREO_DMX_EVS_PHA_LEN_32 96 +#define STEREO_DMX_EVS_FAD_LEN_32 320 +#define STEREO_DMX_EVS_PHA_LEN_48 96 +#define STEREO_DMX_EVS_FAD_LEN_48 480 + +#define STEREO_DMX_EVS_SUBBAND_SIZE 2 +#define STEREO_DMX_EVS_NB_SUBBAND_MAX (L_FRAME48k / (2 * STEREO_DMX_EVS_SUBBAND_SIZE)) + +#define STEREO_DMX_EVS_PHA_LEN_MAX 96 /* Max of PHA_LEN */ +#define STEREO_DMX_EVS_FAD_LEN_MAX 480 /* Max of FAD_LEN */ + +#define STEREO_DMX_EVS_DATA_LEN_MAX (STEREO_DMX_EVS_PHA_LEN_MAX + L_FRAME48k) + +typedef enum +{ + STEREO_DMX_EVS_PHA_IPD, + STEREO_DMX_EVS_PHA_IPD2, + STEREO_DMX_EVS_NO_PHA + +} STEREO_DMX_EVS_PHA; + +typedef enum +{ + STEREO_DMX_EVS_PRC_POC, + STEREO_DMX_EVS_PRC_PHA, + +} STEREO_DMX_EVS_PRC; + +#endif +/* clang-format on */ +/* IVAS_CNST_H */ diff --git a/lib_com/ivas_cov_smooth.c b/lib_com/ivas_cov_smooth.c new file mode 100644 index 0000000000000000000000000000000000000000..f15b21d7900d30d0a28348d1dba62d95bc6a22b1 --- /dev/null +++ b/lib_com/ivas_cov_smooth.c @@ -0,0 +1,359 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "cnst.h" +#include "ivas_prot.h" +#include "wmc_auto.h" +#include "prot.h" + +/*-----------------------------------------------------------------------------------------* + * Local constants + *-----------------------------------------------------------------------------------------*/ + +#define BAND_SMOOTH_REST_START_IDX ( 2 ) + +/*-----------------------------------------------------------------------------------------* + * Function ivas_calculate_update_factor() + * + * To calculate the update factor + *-----------------------------------------------------------------------------------------*/ + +static float ivas_calculate_update_factor( + float *p_bin_to_band, + int16_t active_bins ) +{ + float update_factor_temp = 0.0f; + int16_t k; + + for ( k = 0; k < active_bins; k++ ) + { + update_factor_temp += p_bin_to_band[k]; + } + + return update_factor_temp; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_calculate_smoothning_factor() + * + * To calculate the Smoothning factor + *-----------------------------------------------------------------------------------------*/ + +static void ivas_calculate_smoothning_factor( + float *Smoothing_factor, + float update_factor, + const int16_t min_pool_size, + const float max_update_rate, + const COV_SMOOTHING_TYPE smooth_mode, + const int32_t ivas_total_brate, + int16_t j ) +{ + float smooth_fact; + *Smoothing_factor = update_factor / min_pool_size; + if ( smooth_mode != COV_SMOOTH_MC ) + { + if ( ivas_total_brate < IVAS_24k4 ) + { + smooth_fact = 0.5f; + } + else + { + smooth_fact = 0.75f; + } + *Smoothing_factor *= ( j + 1 ) * smooth_fact; + } + + if ( *Smoothing_factor > max_update_rate ) + { + *Smoothing_factor = max_update_rate; + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_set_up_cov_smoothing() + * + * Setup for covariance smoothing + *-----------------------------------------------------------------------------------------*/ + +static void ivas_set_up_cov_smoothing( + ivas_cov_smooth_state_t *hCovState, + ivas_filterbank_t *pFb, + const float max_update_rate, + const int16_t min_pool_size, + const COV_SMOOTHING_TYPE smooth_mode, /* i : flag multichannel vs SPAR */ + const int32_t ivas_total_brate ) +{ + int16_t j; + float update_factor; + if ( smooth_mode == COV_SMOOTH_MC ) + { + for ( j = 0; j < pFb->filterbank_num_bands; j++ ) + { + int16_t active_bins = pFb->fb_bin_to_band.pFb_active_bins_per_band[j]; + update_factor = ivas_calculate_update_factor( pFb->fb_bin_to_band.pFb_bin_to_band[j], active_bins ); + ivas_calculate_smoothning_factor( &hCovState->pSmoothing_factor[j], update_factor, min_pool_size, max_update_rate, smooth_mode, ivas_total_brate, j ); + } + } + else + { + for ( j = 0; j < pFb->filterbank_num_bands; j++ ) + { + float *p_bin_to_band = pFb->fb_bin_to_band.pp_short_stride_bin_to_band[j]; + int16_t active_bins = pFb->fb_bin_to_band.p_short_stride_num_bins_per_band[j]; + update_factor = ivas_calculate_update_factor( p_bin_to_band, active_bins ); + ivas_calculate_smoothning_factor( &hCovState->pSmoothing_factor[j], update_factor, min_pool_size, max_update_rate, smooth_mode, ivas_total_brate, j ); + } + } + + hCovState->prior_bank_idx = -1; + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_spar_covar_smooth_enc_open() + * + * Allocate and initialize SPAR Covar. smoothing handle + *------------------------------------------------------------------------*/ + +ivas_error ivas_spar_covar_smooth_enc_open( + ivas_cov_smooth_state_t **hCovState_out, /* i/o: SPAR Covar. smoothing handle */ + const ivas_cov_smooth_cfg_t *cov_smooth_cfg, /* i : SPAR config. handle */ + ivas_filterbank_t *pFb, /* i/o: FB handle */ + const int16_t nchan_inp, /* i : number of input channels */ + const COV_SMOOTHING_TYPE smooth_mode, /* i : Smooth covariance for SPAR or MC */ + const int32_t ivas_total_brate /* i : IVAS total bitrate */ +) +{ + ivas_cov_smooth_state_t *hCovState; + int16_t i, j; + + if ( ( hCovState = (ivas_cov_smooth_state_t *) malloc( sizeof( ivas_cov_smooth_state_t ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR COV encoder" ); + } + + if ( ( hCovState->pSmoothing_factor = (float *) malloc( sizeof( float ) * cov_smooth_cfg->max_bands ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR COV encoder" ); + } + + for ( i = 0; i < nchan_inp; i++ ) + { + for ( j = 0; j < nchan_inp; j++ ) + { + if ( ( hCovState->pPrior_cov_real[i][j] = (float *) malloc( sizeof( float ) * cov_smooth_cfg->max_bands ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR COV encoder" ); + } + set_zero( hCovState->pPrior_cov_real[i][j], cov_smooth_cfg->max_bands ); + } + } + + ivas_set_up_cov_smoothing( hCovState, pFb, cov_smooth_cfg->max_update_rate, cov_smooth_cfg->min_pool_size, smooth_mode, ivas_total_brate ); + + *hCovState_out = hCovState; + + return IVAS_ERR_OK; +} + + +/*------------------------------------------------------------------------- + * ivas_spar_covar_smooth_enc_close() + * + * Deallocate SPAR Covar. smoothing handle + *------------------------------------------------------------------------*/ + +void ivas_spar_covar_smooth_enc_close( + ivas_cov_smooth_state_t **hCovState_out, /* i/o: SPAR Covar. smoothing handle */ + const int16_t nchan_inp /* i : number of input channels */ +) +{ + ivas_cov_smooth_state_t *hCovState; + int16_t i, j; + + hCovState = *hCovState_out; + + if ( hCovState != NULL ) + { + free( hCovState->pSmoothing_factor ); + hCovState->pSmoothing_factor = NULL; + + for ( i = 0; i < nchan_inp; i++ ) + { + for ( j = 0; j < nchan_inp; j++ ) + { + free( hCovState->pPrior_cov_real[i][j] ); + hCovState->pPrior_cov_real[i][j] = NULL; + } + } + + free( hCovState ); + hCovState_out = NULL; + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_compute_smooth_cov() + * + * Compute smooth covariance real/imag. + *-----------------------------------------------------------------------------------------*/ + +static void ivas_compute_smooth_cov( + ivas_cov_smooth_state_t *hCovState, + ivas_filterbank_t *pFb, + float *pCov_buf[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], + float *pPrior_cov_buf[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], + const float fac, + const int16_t start_band, + const int16_t end_band, + const int16_t num_ch, + const int16_t transient_det[2] ) +{ + int16_t i, j, k; + int16_t prev_idx = hCovState->prior_bank_idx; + float factor = 0; + int16_t sm_b; + int16_t non_sm_b_idx; + sm_b = BAND_SMOOTH_REST_START_IDX; + + assert( end_band <= pFb->filterbank_num_bands ); + + if ( prev_idx == -1 || transient_det[1] == 1 ) + { + for ( i = 0; i < num_ch; i++ ) + { + for ( k = start_band; k < end_band; k++ ) + { + pCov_buf[i][i][k] += ( hCovState->pSmoothing_factor[k] * fac ); + } + } + } + else if ( transient_det[0] == 1 ) + { + non_sm_b_idx = min( sm_b, end_band ); + for ( i = 0; i < num_ch; i++ ) + { + for ( j = 0; j < num_ch; j++ ) + { + if ( i == j ) + { + factor = fac; + } + else + { + factor = 0.0f; + } + + for ( k = start_band; k < non_sm_b_idx; k++ ) + { + pCov_buf[i][j][k] = pPrior_cov_buf[i][j][k] + ( hCovState->pSmoothing_factor[k] * ( pCov_buf[i][j][k] - pPrior_cov_buf[i][j][k] + factor ) ); + } + } + } + for ( i = 0; i < num_ch; i++ ) + { + for ( k = non_sm_b_idx; k < end_band; k++ ) + { + pCov_buf[i][i][k] += ( hCovState->pSmoothing_factor[k] * fac ); + } + } + } + else if ( prev_idx == 0 ) + { + for ( i = 0; i < num_ch; i++ ) + { + for ( j = 0; j < num_ch; j++ ) + { + if ( i == j ) + { + factor = fac; + } + else + { + factor = 0.0f; + } + + for ( k = start_band; k < end_band; k++ ) + { + pCov_buf[i][j][k] = pPrior_cov_buf[i][j][k] + ( hCovState->pSmoothing_factor[k] * ( pCov_buf[i][j][k] - pPrior_cov_buf[i][j][k] + factor ) ); + } + } + } + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_cov_smooth_process() + * + * Covariance smoothing process + *-----------------------------------------------------------------------------------------*/ + +void ivas_cov_smooth_process( + ivas_cov_smooth_state_t *hCovState, /* i/o: Covariance state handle */ + float *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], + ivas_filterbank_t *pFb, /* i/o: FB handle */ + const int16_t start_band, + const int16_t end_band, + const int16_t num_ch, + const int16_t transient_det[2] ) +{ + int16_t i, j; + int16_t num_bands = end_band - start_band; + + ivas_compute_smooth_cov( hCovState, pFb, cov_real, hCovState->pPrior_cov_real, 1e-20f, start_band, end_band, num_ch, transient_det ); + + for ( i = 0; i < num_ch; i++ ) + { + for ( j = 0; j < num_ch; j++ ) + { + mvr2r( &cov_real[i][j][start_band], &hCovState->pPrior_cov_real[i][j][start_band], num_bands ); + } + } + + hCovState->prior_bank_idx = 0; + + return; +} diff --git a/lib_com/ivas_dirac_com.c b/lib_com/ivas_dirac_com.c new file mode 100644 index 0000000000000000000000000000000000000000..22b726f314c24f72afc86f61bf74fb73d28ede2c --- /dev/null +++ b/lib_com/ivas_dirac_com.c @@ -0,0 +1,1008 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include "options.h" +#include +#include "ivas_cnst.h" +#include "ivas_rom_com.h" +#include "ivas_prot.h" +#include "prot.h" +#include "cnst.h" +#include "wmc_auto.h" + + +/*-----------------------------------------------------------------------* + * Local function prototypes + *-----------------------------------------------------------------------*/ + +static uint16_t deindex_sph_idx_general( const int16_t idx_sph, const int16_t no_bits, float *theta_dec, float *phi_dec, uint16_t *p_id_phi, const MC_LS_SETUP mc_format ); + + +/*------------------------------------------------------------------------- + * ivas_get_hodirac_flag() + * + * Return flag for HO-DirAC method at high bitrates + *------------------------------------------------------------------------*/ + +/*! r: HO-DirAC flag */ +int16_t ivas_get_hodirac_flag( + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + const int16_t sba_order /* i : Ambisonic (SBA) order */ +) +{ + if ( sba_order > 1 && ivas_total_brate > IVAS_256k ) + { + return 1; + } + else + { + return 0; + } +} + + +/*------------------------------------------------------------------------- + * ivas_dirac_sba_config() + * + * DirAC Configuration function; used also in MASA decoder + *------------------------------------------------------------------------*/ + +ivas_error ivas_dirac_config( + void *st_ivas, /* i/o: IVAS encoder/decoder state structure */ + const int16_t enc_dec /* i : encoder or decoder flag */ +) +{ + IVAS_FORMAT ivas_format; + int16_t sba_order; + int16_t *element_mode; + int32_t ivas_total_brate; + DIRAC_CONFIG_DATA_HANDLE hConfig; + IVAS_QMETADATA_HANDLE hQMetaData; + int32_t Fs; + int16_t *band_grouping; + ivas_error error; + int16_t spar_dirac_split_band; + IVAS_FB_MIXER_HANDLE hFbMdft; + int16_t *dirac_to_spar_md_bands; + + error = IVAS_ERR_OK; + + if ( enc_dec == ENC ) + { + ivas_format = ( (Encoder_Struct *) st_ivas )->hEncoderConfig->ivas_format; + element_mode = &( (Encoder_Struct *) st_ivas )->hEncoderConfig->element_mode_init; + sba_order = ( (Encoder_Struct *) st_ivas )->sba_analysis_order; + ivas_total_brate = ( (Encoder_Struct *) st_ivas )->hEncoderConfig->ivas_total_brate; + Fs = ( (Encoder_Struct *) st_ivas )->hEncoderConfig->input_Fs; + band_grouping = ( (Encoder_Struct *) st_ivas )->hDirAC->band_grouping; + hConfig = ( (Encoder_Struct *) st_ivas )->hDirAC->hConfig; + hQMetaData = ( (Encoder_Struct *) st_ivas )->hQMetaData; + if ( ( (Encoder_Struct *) st_ivas )->hSpar != NULL ) + { + hFbMdft = ( (Encoder_Struct *) st_ivas )->hSpar->hFbMixer; + dirac_to_spar_md_bands = ( (Encoder_Struct *) st_ivas )->hSpar->dirac_to_spar_md_bands; + } + else + { + hFbMdft = NULL; + dirac_to_spar_md_bands = NULL; + } + } + else + { + ivas_format = ( (Decoder_Struct *) st_ivas )->ivas_format; + element_mode = &( (Decoder_Struct *) st_ivas )->element_mode_init; + sba_order = ( (Decoder_Struct *) st_ivas )->sba_analysis_order; + ivas_total_brate = ( (Decoder_Struct *) st_ivas )->hDecoderConfig->ivas_total_brate; + Fs = ( (Decoder_Struct *) st_ivas )->hDecoderConfig->output_Fs; + band_grouping = ( (Decoder_Struct *) st_ivas )->hDirAC->band_grouping; + hConfig = ( (Decoder_Struct *) st_ivas )->hDirAC->hConfig; + hQMetaData = ( (Decoder_Struct *) st_ivas )->hQMetaData; + if ( ( (Decoder_Struct *) st_ivas )->hSpar != NULL ) + { + hFbMdft = ( (Decoder_Struct *) st_ivas )->hSpar->hFbMixer; + dirac_to_spar_md_bands = ( (Decoder_Struct *) st_ivas )->hSpar->dirac_to_spar_md_bands; + } + else + { + hFbMdft = NULL; + dirac_to_spar_md_bands = NULL; + } + ( (Decoder_Struct *) st_ivas )->hDirAC->hFbMdft = hFbMdft; + } + + if ( ivas_format == SBA_FORMAT || ivas_format == SBA_ISM_FORMAT ) + { + hConfig->nbands = IVAS_MAX_NUM_BANDS; + + spar_dirac_split_band = min( IVAS_MAX_NUM_BANDS, SPAR_DIRAC_SPLIT_START_BAND ); + + if ( ivas_get_hodirac_flag( ivas_total_brate, sba_order ) ) + { + spar_dirac_split_band = 0; + } + } + else + { + hConfig->nbands = 5; + spar_dirac_split_band = 0; + } + hConfig->enc_param_start_band = 0; + hConfig->dec_param_estim = FALSE; + if ( ivas_format == SBA_FORMAT || ivas_format == SBA_ISM_FORMAT ) /* skip for MASA decoder */ + { + if ( ( error = ivas_dirac_sba_config( hQMetaData, element_mode, ivas_total_brate, sba_order, hConfig->nbands - spar_dirac_split_band ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( hQMetaData != NULL ) + { + if ( enc_dec == ENC ) + { + hConfig->nbands = hQMetaData->q_direction[0].cfg.nbands; + } + hConfig->enc_param_start_band = hQMetaData->q_direction[0].cfg.start_band + spar_dirac_split_band; + } + + hConfig->dec_param_estim = TRUE; + if ( hConfig->dec_param_estim == TRUE ) + { + hConfig->enc_param_start_band = spar_dirac_split_band; + } + + if ( ivas_get_hodirac_flag( ivas_total_brate, sba_order ) ) + { + hConfig->dec_param_estim = FALSE; + hConfig->enc_param_start_band = 0; + + set_c( (int8_t *) hQMetaData->twoDirBands, (int8_t) 1, hQMetaData->q_direction[0].cfg.nbands ); + hQMetaData->numTwoDirBands = (uint8_t) hQMetaData->q_direction[0].cfg.nbands; + } + } + + if ( ivas_format == SBA_FORMAT || ivas_format == SBA_ISM_FORMAT ) + { + ivas_dirac_config_bands( band_grouping, IVAS_MAX_NUM_BANDS, (int16_t) ( Fs * INV_CLDFB_BANDWIDTH + 0.5f ), dirac_to_spar_md_bands, hQMetaData->useLowerBandRes, hConfig->enc_param_start_band, hFbMdft ); + } + else + { + ivas_dirac_config_bands( band_grouping, hConfig->nbands, (int16_t) ( Fs * INV_CLDFB_BANDWIDTH + 0.5f ), NULL, 0, 0, hFbMdft ); + } + + return error; +} + + +/*------------------------------------------------------------------------- + * ivas_dirac_sba_config_bands() + * + * DirAC Configuration freq. band function; used also in MASA decoder + *------------------------------------------------------------------------*/ + +void ivas_dirac_config_bands( + int16_t *band_grouping, /* o : band grouping */ + const int16_t nbands, /* i : number of bands */ + const int16_t max_band, /* i : maximal band index +1 */ + int16_t *dirac_to_spar_md_bands, + const int8_t useLowerBandRes, + const int16_t enc_param_start_band, + IVAS_FB_MIXER_HANDLE hFbMdft ) +{ + int16_t i; + { + if ( nbands == 5 ) + { + mvs2s( DirAC_band_grouping_5, band_grouping, 5 + 1 ); + } + else if ( nbands == 6 ) + { + mvs2s( DirAC_band_grouping_6, band_grouping, 6 + 1 ); + } + else if ( nbands == 12 ) + { + int16_t band; + for ( band = 0; band < DIRAC_MAX_NBANDS; band++ ) + { + dirac_to_spar_md_bands[band] = band; + } + if ( hFbMdft != NULL ) + { + int16_t sb, idx1, idx2, b; + + idx1 = -1; + sb = 0; + for ( b = 0; b < max_band; b++ ) + { + idx2 = hFbMdft->pFb->fb_bin_to_band.p_cldfb_map_to_spar_band[b]; + if ( idx2 > idx1 ) + { + band_grouping[sb++] = b; + idx1 = idx2; + } + } + band_grouping[sb] = max_band; + + /* set the remaining bands to max_band to avoid problems for the DirAC parameter estimation with bw < FB */ + for ( b = sb; b <= nbands; b++ ) + { + band_grouping[b] = max_band; + } + } + else + { + mvs2s( DirAC_band_grouping_12, band_grouping, 12 + 1 ); + } + + if ( useLowerBandRes ) + { + int16_t step = DIRAC_LOW_BANDRES_STEP; + int16_t reduced_band; + for ( band = enc_param_start_band + 2, reduced_band = enc_param_start_band + 1; band <= DIRAC_MAX_NBANDS; band += step, reduced_band++ ) + { + band_grouping[reduced_band] = band_grouping[band]; + } + for ( ; reduced_band <= DIRAC_MAX_NBANDS; reduced_band++ ) + { + band_grouping[reduced_band] = max_band; + } + for ( band = enc_param_start_band + ( DIRAC_MAX_NBANDS - enc_param_start_band ) / 2 - 1, reduced_band = DIRAC_MAX_NBANDS - 1; band >= enc_param_start_band; band--, reduced_band -= step ) + { + dirac_to_spar_md_bands[reduced_band] = dirac_to_spar_md_bands[band]; + dirac_to_spar_md_bands[reduced_band - 1] = dirac_to_spar_md_bands[band]; + } + } + else + { + /* always code the last two fb bands together */ + band_grouping[DIRAC_MAX_NBANDS - 1] = max_band; + dirac_to_spar_md_bands[DIRAC_MAX_NBANDS - 1] = DIRAC_MAX_NBANDS - 2; + } + } + else + { + assert( 0 && "nbands must be 5 or 6!" ); + } + } + + /* Limit the band range to band max */ + for ( i = 0; i < nbands + 1; i++ ) + { + if ( band_grouping[i] > max_band ) + { + band_grouping[i] = max_band; + } + } + + return; +} + +/*-------------------------------------------------------------------* + * ivas_get_dirac_sba_max_md_bits() + * + * Return maximum SBA DirAC metadata bit-budget and nominal bit-budget + *-------------------------------------------------------------------*/ + +void ivas_get_dirac_sba_max_md_bits( + const int32_t sba_total_brate, + int16_t *bits_frame_nominal, + int16_t *metadata_max_bits, + int16_t *qmetadata_max_bit_req, + const int16_t nbands ) +{ + if ( sba_total_brate <= IVAS_13k2 ) + { + *bits_frame_nominal = ACELP_9k60 / FRAMES_PER_SEC; + *metadata_max_bits = 70; + } + else if ( sba_total_brate <= IVAS_16k4 ) + { + *bits_frame_nominal = ACELP_13k20 / FRAMES_PER_SEC; + *metadata_max_bits = 80; + } + else if ( sba_total_brate <= IVAS_24k4 ) + { + *bits_frame_nominal = ACELP_16k40 / FRAMES_PER_SEC; + *metadata_max_bits = 103; + } + else if ( sba_total_brate <= IVAS_32k ) + { + *bits_frame_nominal = ACELP_32k / FRAMES_PER_SEC; + *metadata_max_bits = 214; + } + else if ( sba_total_brate <= IVAS_48k ) + { + *bits_frame_nominal = IVAS_48k / FRAMES_PER_SEC; + *metadata_max_bits = 240; + } + else if ( sba_total_brate <= IVAS_64k ) + { + *bits_frame_nominal = IVAS_64k / FRAMES_PER_SEC; + *metadata_max_bits = 200; + } + else if ( sba_total_brate <= IVAS_80k ) + { + *bits_frame_nominal = IVAS_80k / FRAMES_PER_SEC; + *metadata_max_bits = 200; + } + else if ( sba_total_brate <= IVAS_96k ) + { + *bits_frame_nominal = IVAS_96k / FRAMES_PER_SEC; + *metadata_max_bits = 200; + } + else if ( sba_total_brate <= IVAS_128k ) + { + *bits_frame_nominal = IVAS_128k / FRAMES_PER_SEC; + *metadata_max_bits = 250; + } + else + { + *bits_frame_nominal = (int16_t) ( sba_total_brate / FRAMES_PER_SEC ); + *metadata_max_bits = MAX16B; /* no limit */ + } + *metadata_max_bits = (int16_t) min( (float) MAX16B, ceilf( (float) *metadata_max_bits * nbands / 5 ) ); + *qmetadata_max_bit_req = QMETADATA_MAXBIT_REQ_SBA >> 1; + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_dirac_sba_config() + * + * DirAC Configuration function for SBA + *------------------------------------------------------------------------*/ + +ivas_error ivas_dirac_sba_config( + IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ + int16_t *element_mode, /* i/o: element mode of the core coder */ + int32_t sba_total_brate, /* i : SBA total bitrate */ + const int16_t sba_order, /* i : Ambisonic (SBA) order */ + const int16_t nbands /* i : number of frequency bands */ +) +{ + int16_t nbands_coded; + int16_t hodirac_flag; + ivas_error error; + + error = IVAS_ERR_OK; + hQMetaData->is_masa_ivas_format = 0; + hodirac_flag = ivas_get_hodirac_flag( sba_total_brate, sba_order ); + + /* map the bitrate for SID frame */ + if ( sba_total_brate == IVAS_SID_5k2 ) + { + if ( *element_mode == IVAS_SCE ) + { + sba_total_brate = ACELP_24k40; + } + else + { + sba_total_brate = ACELP_48k; + } + } + + ivas_set_qmetadata_maxbit_req( hQMetaData, SBA_FORMAT ); + + if ( sba_total_brate <= IVAS_16k4 ) + { + hQMetaData->useLowerRes = 1; + } + else + { + hQMetaData->useLowerRes = 0; + } + + nbands_coded = nbands; + if ( sba_total_brate <= (int32_t) ( (float) IVAS_192k / (float) SPAR_DIRAC_SPLIT_START_BAND ) ) + { + hQMetaData->useLowerBandRes = 1; + nbands_coded = nbands / 2 + nbands % 2; + } + else + { + hQMetaData->useLowerBandRes = 0; + if ( hodirac_flag == 0 ) + { + nbands_coded = nbands - 1; /* always combine the last two bands */ + } + } + + { + int16_t no_dirs = 1; + if ( hodirac_flag ) + { + no_dirs = 2; + } + + if ( ( error = ivas_qmetadata_allocate_memory( hQMetaData, nbands_coded, no_dirs, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + ivas_get_dirac_sba_max_md_bits( sba_total_brate, &hQMetaData->bits_frame_nominal, &hQMetaData->metadata_max_bits, &hQMetaData->qmetadata_max_bit_req, hQMetaData->q_direction[0].cfg.nbands ); + + return error; +} + + +/*------------------------------------------------------------------------- + * computeDirectionVectors() + * + * + *------------------------------------------------------------------------*/ + +void computeDirectionVectors( + float *intensity_real_x, + float *intensity_real_y, + float *intensity_real_z, + const int16_t enc_param_start_band, + const int16_t num_frequency_bands, + float *direction_vector_x, + float *direction_vector_y, + float *direction_vector_z ) +{ + int16_t i; + float intensityNorm; + + for ( i = enc_param_start_band; i < enc_param_start_band + num_frequency_bands; ++i ) + { + intensityNorm = *( intensity_real_x ) * *( intensity_real_x ) + + *( intensity_real_y ) * *( intensity_real_y ) + + *( intensity_real_z ) * *( intensity_real_z ); + + if ( intensityNorm <= EPSILON ) + { + intensityNorm = 1.0f; + *( direction_vector_x++ ) = 1.0f; + *( direction_vector_y++ ) = 0.0f; + *( direction_vector_z++ ) = 0.0f; + intensity_real_x++; + intensity_real_y++; + intensity_real_z++; + } + else + { + intensityNorm = sqrtf( 1.f / intensityNorm ); + *( direction_vector_x++ ) = *( intensity_real_x++ ) * intensityNorm; + *( direction_vector_y++ ) = *( intensity_real_y++ ) * intensityNorm; + *( direction_vector_z++ ) = *( intensity_real_z++ ) * intensityNorm; + } + } + + return; +} + + +/*------------------------------------------------------------------------- + * computeDiffuseness() + * + * + *------------------------------------------------------------------------*/ + +void computeDiffuseness( + float *buffer_intensity[DIRAC_NUM_DIMS][DIRAC_NO_COL_AVG_DIFF], + const float *buffer_energy, + const int16_t num_freq_bands, + float *diffuseness ) +{ + float intensity_slow[DIRAC_NUM_DIMS * CLDFB_NO_CHANNELS_MAX]; + float intensity_slow_abs[CLDFB_NO_CHANNELS_MAX]; + float energy_slow[CLDFB_NO_CHANNELS_MAX]; + int16_t i, j, k; + float tmp = 0; + float *p_tmp; + const float *p_tmp_c; + + /* Compute Intensity slow and energy slow */ + + set_f( intensity_slow, 0.0f, DIRAC_NUM_DIMS * CLDFB_NO_CHANNELS_MAX ); + set_f( intensity_slow_abs, 0.0f, CLDFB_NO_CHANNELS_MAX ); + set_f( energy_slow, 0.0f, CLDFB_NO_CHANNELS_MAX ); + + for ( i = 0; i < DIRAC_NO_COL_AVG_DIFF; ++i ) + { + /* Energy slow */ + p_tmp_c = buffer_energy + i * num_freq_bands; + for ( k = 0; k < num_freq_bands; k++ ) + { + energy_slow[k] += *( p_tmp_c++ ); + } + + /* Intensity slow */ + for ( j = 0; j < DIRAC_NUM_DIMS; ++j ) + { + p_tmp = buffer_intensity[j][i]; + + for ( k = 0; k < num_freq_bands; k++ ) + { + intensity_slow[j * num_freq_bands + k] += *( p_tmp++ ); + } + } + } + + /* intensity_slow.^2 + intensity_slow_abs*/ + for ( j = 0; j < DIRAC_NUM_DIMS; ++j ) + { + p_tmp = intensity_slow + j * num_freq_bands; + + for ( k = 0; k < num_freq_bands; k++ ) + { + *( p_tmp ) *= ( *p_tmp ); + intensity_slow_abs[k] += *( p_tmp++ ); + } + } + + /* Compute Diffuseness */ + p_tmp = intensity_slow_abs; + for ( i = 0; i < num_freq_bands; ++i ) + { + tmp = sqrtf( *( p_tmp++ ) ) / ( energy_slow[i] + EPSILON ); + tmp = 1.0f - tmp; + diffuseness[i] = ( ( tmp < 1.0f ) ? ( ( tmp < 0.0f ) ? 0.f : tmp ) : 1.0f ); + } + + return; +} + + +/*-------------------------------------------------------------------* + * deindex_azimuth() + * + * Deindex one azimuth index + *-------------------------------------------------------------------*/ + +/*! r: azimuth value */ +float deindex_azimuth( + int16_t id_phi, /* i : index */ + const int16_t no_bits, /* i : number of bits for the spherical grid */ + const int16_t id_th, /* i : elevation index */ + const int16_t remap, /* i : remapping flag */ + const MC_LS_SETUP mc_format /* i : channel format if in MC-mode */ +) +{ + int16_t flag_delta; + float dd, delta_phi; + float phi_hat; + + if ( ( mc_format != MC_LS_SETUP_INVALID ) && ( no_bits == 2 ) ) + { + if ( id_phi % 2 == 0 ) + { + phi_hat = cb_azi_chan[id_phi / 2]; + } + else + { + phi_hat = -cb_azi_chan[( id_phi + 1 ) / 2]; + } + return phi_hat; + } + flag_delta = ( id_th % 2 == 1 ); + + if ( remap ) + { + id_phi = ivas_qmetadata_dereorder_generic( id_phi ) + ( no_phi_masa[no_bits - 1][id_th] >> 1 ); + } + + delta_phi = 360 / (float) ( no_phi_masa[no_bits - 1][id_th] ); + if ( ( flag_delta == 1 ) && ( no_phi_masa[no_bits - 1][id_th] > 2 ) && mc_format == MC_LS_SETUP_INVALID ) + { + dd = delta_phi / 2.0f; + } + else + { + dd = 0; + } + + id_phi -= ( ( no_phi_masa[no_bits - 1][id_th] ) >> 1 ); + phi_hat = id_phi * delta_phi + dd + 180 - 180; + if ( mc_format != MC_LS_SETUP_INVALID ) + { + phi_hat = companding_azimuth( phi_hat, mc_format, ( id_th * delta_theta_masa[no_bits - 3] > MC_MASA_THR_ELEVATION ), -1 ); + } + + return phi_hat; +} + + +/*---------------------------------------------------------------- + * deindex_spherical_component() + * + * decoding the spherical index for one tile + *-----------------------------------------------------------------*/ + +void deindex_spherical_component( + const uint16_t sph_idx, /* i : spherical index */ + float *az, /* o : decoded azimuth value */ + float *el, /* o : decoded elevation value */ + uint16_t *az_idx, /* o : azimuth index */ + uint16_t *el_idx, /* o : elevation index */ + const uint16_t no_bits, /* i : number of bits for the spherical grid */ + const MC_LS_SETUP mc_format /* i : channel format if in MC-mode */ +) +{ + assert( sph_idx < ( 1 << no_bits ) ); + switch ( no_bits ) + { + case 0: + *az = 0; + *el = 0; + *az_idx = 0; + *el_idx = 0; + break; + case 1: + *az_idx = sph_idx; + *az = ( *az_idx ) * ( -180.f ); + *el = 0; + *el_idx = 0; + break; + case 2: + *el = 0; + *el_idx = 0; + *az_idx = sph_idx; + *az = deindex_azimuth( *az_idx, no_bits, 0, 0, mc_format ); + break; + default: + *el_idx = deindex_sph_idx_general( sph_idx, no_bits, el, az, az_idx, mc_format ); + break; + } + + return; +} + + +/*---------------------------------------------------------------- + * calculate_hodirac_sector_parameters() + * + * + *-----------------------------------------------------------------*/ + +void calculate_hodirac_sector_parameters( + DIRAC_ENC_HANDLE hDirAC, /* i : DirAC handle */ + float RealBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], /* i : signal vector (L+1)^2 x N_bins, real part */ + float ImagBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], /* i : signal vector, imaginary part */ + const float beta, /* i : forgetting factor for average filtering */ + const int16_t *band_grouping, /* i : indices of band groups */ + const int16_t N_bands, /* i : number of bands (groups) */ + const int16_t enc_param_start_band, /* i : first band to process */ + float *azi, /* o : array of sector azimuth angles, flat */ + float *ele, /* o : array of sector elevation angles, flat */ + float *diff, /* o : array of sector diffuseness values, flat */ + float *ene /* o : array of sector energy values, flat */ +) +{ + int16_t i_sec, i_bin, i_band; + float p_real, p_imag, normI, energy, tmp_diff; + float sec_I_vec_x[NUM_ANA_SECTORS]; + float sec_I_vec_y[NUM_ANA_SECTORS]; + float sec_I_vec_z[NUM_ANA_SECTORS]; + + + for ( i_sec = 0; i_sec < NUM_ANA_SECTORS; i_sec++ ) + { + + float *p_sec_I_vec_x = &sec_I_vec_x[i_sec]; + float *p_sec_I_vec_y = &sec_I_vec_y[i_sec]; + float *p_sec_I_vec_z = &sec_I_vec_z[i_sec]; + + const float *p_c_weights = c_weights; + + float *p_ImagBuffer_0 = ImagBuffer[0]; + float *p_ImagBuffer_1 = ImagBuffer[1]; + float *p_ImagBuffer_2 = ImagBuffer[2]; + float *p_ImagBuffer_3 = ImagBuffer[3]; + float *p_ImagBuffer_4 = ImagBuffer[4]; + float *p_ImagBuffer_5 = ImagBuffer[5]; + float *p_ImagBuffer_6 = ImagBuffer[6]; + float *p_ImagBuffer_8 = ImagBuffer[8]; + + float *p_RealBuffer_0 = RealBuffer[0]; + float *p_RealBuffer_1 = RealBuffer[1]; + float *p_RealBuffer_2 = RealBuffer[2]; + float *p_RealBuffer_3 = RealBuffer[3]; + float *p_RealBuffer_4 = RealBuffer[4]; + float *p_RealBuffer_5 = RealBuffer[5]; + float *p_RealBuffer_6 = RealBuffer[6]; + float *p_RealBuffer_8 = RealBuffer[8]; + + for ( i_band = enc_param_start_band; i_band < N_bands; i_band++ ) + { + float *p_azi = &azi[i_sec * N_bands + i_band]; + float *p_ele = &ele[i_sec * N_bands + i_band]; + float *p_ene = &ene[i_sec * N_bands + i_band]; + + float *p_diff = &diff[i_sec * N_bands + i_band]; + float *p_azi_prev = &hDirAC->azi_prev[i_sec * N_bands + i_band]; + float *p_ele_prev = &hDirAC->ele_prev[i_sec * N_bands + i_band]; + + float *p_energy_smth = &hDirAC->energy_smth[i_sec][i_band]; + float *p_sec_I_vec_smth_x = &hDirAC->sec_I_vec_smth_x[i_sec][i_band]; + float *p_sec_I_vec_smth_y = &hDirAC->sec_I_vec_smth_y[i_sec][i_band]; + float *p_sec_I_vec_smth_z = &hDirAC->sec_I_vec_smth_z[i_sec][i_band]; + *p_sec_I_vec_x = 0.f; + *p_sec_I_vec_y = 0.f; + *p_sec_I_vec_z = 0.f; + energy = 0.f; + + if ( i_sec == 0 ) + { + for ( i_bin = band_grouping[i_band]; i_bin < band_grouping[i_band + 1]; i_bin++ ) + { + float w = *( p_c_weights++ ); + float sec_w_imag, sec_x_imag, sec_y_imag, sec_z_imag; + float sec_w_real, sec_x_real, sec_y_real, sec_z_real; + + sec_w_imag = 1.772454f * *( p_ImagBuffer_0 ) + 1.772454f * *( p_ImagBuffer_1 ); + sec_x_imag = 1.772454f * *( p_ImagBuffer_3++ ) + 1.023326f * *( p_ImagBuffer_4++ ); + sec_y_imag = 0.590818f * *( p_ImagBuffer_0++ ) + 1.772454f * *( p_ImagBuffer_1++ ) - 0.590817f * *( p_ImagBuffer_6++ ) - 1.023326f * *( p_ImagBuffer_8++ ); + sec_z_imag = 1.772454f * *( p_ImagBuffer_2++ ) + 1.023326f * *( p_ImagBuffer_5++ ); + + sec_w_real = 1.772454f * *( p_RealBuffer_0 ) + 1.772454f * *( p_RealBuffer_1 ); + sec_x_real = 1.772454f * *( p_RealBuffer_3++ ) + 1.023326f * *( p_RealBuffer_4++ ); + sec_y_real = 0.590818f * *( p_RealBuffer_0++ ) + 1.772454f * *( p_RealBuffer_1++ ) - 0.590817f * *( p_RealBuffer_6++ ) - 1.023326f * *( p_RealBuffer_8++ ); + sec_z_real = 1.772454f * *( p_RealBuffer_2++ ) + 1.023326f * *( p_RealBuffer_5++ ); + + p_real = sec_w_real * w; + p_imag = sec_w_imag * w; + + *p_sec_I_vec_x += p_real * sec_x_real + p_imag * sec_x_imag; + *p_sec_I_vec_y += p_real * sec_y_real + p_imag * sec_y_imag; + *p_sec_I_vec_z += p_real * sec_z_real + p_imag * sec_z_imag; + + energy += 0.5f * ( p_real * p_real + p_imag * p_imag + sec_x_real * sec_x_real + sec_x_imag * sec_x_imag + + sec_y_real * sec_y_real + sec_y_imag * sec_y_imag + + sec_z_real * sec_z_real + sec_z_imag * sec_z_imag ); + } + } + else + { + for ( i_bin = band_grouping[i_band]; i_bin < band_grouping[i_band + 1]; i_bin++ ) + { + float w = *( p_c_weights++ ); + float sec_w_imag, sec_x_imag, sec_y_imag, sec_z_imag; + float sec_w_real, sec_x_real, sec_y_real, sec_z_real; + + sec_w_imag = 1.772454f * *(p_ImagBuffer_0) -1.772454f * *( p_ImagBuffer_1 ); + sec_x_imag = 1.772454f * *( p_ImagBuffer_3++ ) - 1.023326f * *( p_ImagBuffer_4++ ); + sec_y_imag = -0.590818f * *( p_ImagBuffer_0++ ) + 1.772454f * *( p_ImagBuffer_1++ ) + 0.590817f * *( p_ImagBuffer_6++ ) + 1.023326f * *( p_ImagBuffer_8++ ); + sec_z_imag = 1.772454f * *( p_ImagBuffer_2++ ) - 1.023326f * *( p_ImagBuffer_5++ ); + + sec_w_real = 1.772454f * *(p_RealBuffer_0) -1.772454f * *( p_RealBuffer_1 ); + sec_x_real = 1.772454f * *( p_RealBuffer_3++ ) - 1.023326f * *( p_RealBuffer_4++ ); + sec_y_real = -0.590818f * *( p_RealBuffer_0++ ) + 1.772454f * *( p_RealBuffer_1++ ) + 0.590817f * *( p_RealBuffer_6++ ) + 1.023326f * *( p_RealBuffer_8++ ); + sec_z_real = 1.772454f * *( p_RealBuffer_2++ ) - 1.023326f * *( p_RealBuffer_5++ ); + + p_real = sec_w_real * w; + p_imag = sec_w_imag * w; + + *p_sec_I_vec_x += p_real * sec_x_real + p_imag * sec_x_imag; + *p_sec_I_vec_y += p_real * sec_y_real + p_imag * sec_y_imag; + *p_sec_I_vec_z += p_real * sec_z_real + p_imag * sec_z_imag; + + energy += 0.5f * ( p_real * p_real + p_imag * p_imag + sec_x_real * sec_x_real + sec_x_imag * sec_x_imag + + sec_y_real * sec_y_real + sec_y_imag * sec_y_imag + + sec_z_real * sec_z_real + sec_z_imag * sec_z_imag ); + } + } + if ( hDirAC->firstrun_sector_params ) + { + *p_sec_I_vec_smth_x = *p_sec_I_vec_x; + *p_sec_I_vec_smth_y = *p_sec_I_vec_y; + *p_sec_I_vec_smth_z = *p_sec_I_vec_z; + *p_energy_smth = energy; + } + else + { + float w = ( 1.0f - beta ); + *p_sec_I_vec_smth_x = w * *p_sec_I_vec_x + beta * *p_sec_I_vec_smth_x; + *p_sec_I_vec_smth_y = w * *p_sec_I_vec_y + beta * *p_sec_I_vec_smth_y; + *p_sec_I_vec_smth_z = w * *p_sec_I_vec_z + beta * *p_sec_I_vec_smth_z; + *p_energy_smth = w * energy + beta * *p_energy_smth; + } + + if ( energy < EPSILON ) + { + *p_azi = 0.f; + *p_ele = 0.f; + *p_ene = 0.f; + *p_diff = 1.f; + } + else + { + normI = sqrtf( *p_sec_I_vec_smth_x * *p_sec_I_vec_smth_x + + *p_sec_I_vec_smth_y * *p_sec_I_vec_smth_y + + *p_sec_I_vec_smth_z * *p_sec_I_vec_smth_z ); + *p_azi = atan2f( *p_sec_I_vec_smth_y, *p_sec_I_vec_smth_x ) * _180_OVER_PI; + *p_ele = asinf( *p_sec_I_vec_smth_z / ( normI + EPSILON ) ) * _180_OVER_PI; + *p_ene = *p_energy_smth; + *p_diff = 1.f - normI / ( *p_energy_smth + EPSILON ); + } + + tmp_diff = *p_diff; + + if ( tmp_diff < 0.0f ) + { + *p_diff = 0.f; + } + if ( tmp_diff > 0.5f ) + { + if ( hDirAC->firstrun_sector_params ) + { + *p_azi = 0.f; + *p_ele = 0.f; + } + else + { + *p_azi = 2.f * ( 1.f - tmp_diff ) * *p_azi + ( 2.f * tmp_diff - 1.f ) * *p_azi_prev; + *p_ele = 2.f * ( 1.f - tmp_diff ) * *p_ele + ( 2.f * tmp_diff - 1.f ) * *p_ele_prev; + } + } + else + { + *p_azi_prev = *p_azi; + *p_ele_prev = *p_ele; + } + } + } + + hDirAC->firstrun_sector_params = 0; + + return; +} + + +/*-----------------------------------------------------------------------* + * Local functions + *-----------------------------------------------------------------------*/ + + +/*-------------------------------------------------------------------* + * deindex_sph_idx_general() + * + * deindex the spherical index for more than 2 bits for the spherical grid + *----------------------------------------------------------------------*/ + +/*! r: decoded elevation index */ +static uint16_t deindex_sph_idx_general( + const int16_t idx_sph, /* i : spherical index */ + const int16_t no_bits, /* i : number of bits in the spherical grid*/ + float *theta_dec, /* o : decoded elevation value */ + float *phi_dec, /* o : decoded azimuth value */ + uint16_t *p_id_phi, /* o : decoded azimuth index */ + const MC_LS_SETUP mc_format /* i : channel format if in MC-mode */ +) +{ + int16_t i; + uint16_t id_th; + int16_t sign_theta; + int16_t id_phi; + int16_t cum_n[250]; + int16_t no_th; + const int16_t *n; + + id_th = 0; + id_phi = 0; + sign_theta = 1; + + no_th = no_theta_masa[no_bits - 3]; + n = no_phi_masa[no_bits - 1]; + if ( mc_format != MC_LS_SETUP_INVALID ) + { + /* indexing */ + + cum_n[0] = n[0]; + if ( idx_sph >= cum_n[0] ) + { + for ( i = 1; i < no_th; i++ ) + { + cum_n[i] = cum_n[i - 1] + n[i]; + if ( idx_sph < cum_n[i] ) + { + id_th = i; + id_phi = idx_sph - cum_n[i - 1]; + break; + } + } + } + } + else + { + /* Starting from Equator, alternating positive and negative */ + cum_n[0] = n[0]; + if ( idx_sph >= cum_n[0] ) + { + for ( i = 1; i < no_th; i++ ) + { + cum_n[2 * i - 1] = cum_n[2 * i - 2] + n[i]; + + if ( idx_sph < cum_n[2 * i - 1] ) + { + id_th = i; + sign_theta = 1; + id_phi = idx_sph - cum_n[2 * i - 2]; + break; + } + + cum_n[2 * i] = cum_n[2 * i - 1] + n[i]; + + if ( idx_sph < cum_n[2 * i] ) + { + id_th = i; + sign_theta = -1; + id_phi = idx_sph - cum_n[2 * i - 1]; + break; + } + + if ( i == ( no_th - 1 ) ) + { + id_th = i; + sign_theta = -1; + id_phi = 0; /* idx_sph - cum_n[2*i-1]; */ + break; + } + } + } + } + + if ( id_th == 0 ) + { + id_phi = idx_sph; + } + else + { + if ( ( id_th == no_th - 1 ) && ( no_bits > 4 ) ) + { + id_phi = 0; + } + } + + *theta_dec = id_th * delta_theta_masa[no_bits - 3]; + + if ( *theta_dec >= 90 ) + { + *theta_dec = 90.f * sign_theta; + *phi_dec = 0; + *p_id_phi = 0; + } + else + { + *theta_dec *= sign_theta; + + *phi_dec = deindex_azimuth( id_phi, no_bits, id_th, 0, mc_format ); + *p_id_phi = id_phi; + } + + return id_th; +} diff --git a/lib_com/ivas_entropy_coder_common.c b/lib_com/ivas_entropy_coder_common.c new file mode 100644 index 0000000000000000000000000000000000000000..7696932cb033e3cc78967ac444a04d6c61efcdc9 --- /dev/null +++ b/lib_com/ivas_entropy_coder_common.c @@ -0,0 +1,455 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "ivas_prot.h" +#include "ivas_rom_com.h" +#include "math.h" +#include "prot.h" +#include "wmc_auto.h" + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_wrap_arround) + * + * wrap around + *-----------------------------------------------------------------------------------------*/ + +void ivas_wrap_arround( + int16_t *pArr, + const int16_t min_val, + const int16_t max_val, + const int16_t length ) +{ + int16_t i; + + for ( i = 0; i < length; i++ ) + { + if ( pArr[i] < min_val ) + { + pArr[i] = max_val - min_val + pArr[i] + 1; + } + if ( pArr[i] > max_val ) + { + pArr[i] = min_val + pArr[i] - max_val - 1; + } + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_get_cum_freq_model() + * + * get cumulative frequency model + *-----------------------------------------------------------------------------------------*/ + +void ivas_get_cum_freq_model( + const int16_t *pFreq_model, + const int16_t length, + int16_t *pCum_freq_model ) +{ + int16_t i; + + pCum_freq_model[length] = 0; + + for ( i = length; i > 0; i-- ) + { + pCum_freq_model[i - 1] = pCum_freq_model[i] + pFreq_model[i]; + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_map_num_pred_r_to_idx() + * + * Map the ivas_arith_pred_r_consts and ivas_huff_pred_r_consts tables + *-----------------------------------------------------------------------------------------*/ + +int16_t ivas_map_num_pred_r_to_idx( + const int16_t num_quant_points_pred_r, + const int16_t active_w_flag ) +{ + int16_t pred_r_to_idx = -1; + if ( active_w_flag == 0 ) + { + switch ( num_quant_points_pred_r ) + { + case 1: + pred_r_to_idx = PRED_Q_1; + break; + case 7: + pred_r_to_idx = PRED_Q_7; + break; + case 15: + pred_r_to_idx = PRED_Q_15; + break; + case 21: + pred_r_to_idx = PRED_Q_21; + break; + case 31: + pred_r_to_idx = PRED_Q_31; + break; + default: + assert( !"Forbidden value for prediction quantization strategy index" ); + break; + } + } + else + { + switch ( num_quant_points_pred_r ) + { + case 7: + pred_r_to_idx = PRED_Q_7_ACTIVE_W; + break; + case 15: + pred_r_to_idx = PRED_Q_15_ACTIVE_W; + break; + case 21: + pred_r_to_idx = PRED_Q_21_ACTIVE_W; + break; + default: + assert( !"Forbidden value for prediction quantization strategy index" ); + break; + } + } + + return pred_r_to_idx; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_map_num_drct_r_to_idx() + * + * Map the ivas_arith_drct_r_consts and ivas_huff_drct_r_consts tables + *-----------------------------------------------------------------------------------------*/ + +int16_t ivas_map_num_drct_r_to_idx( + const int16_t num_quant_points_drct_r ) +{ + int16_t drct_r_to_idx = -1; + switch ( num_quant_points_drct_r ) + { + case 1: + drct_r_to_idx = DRCT_Q_1; + break; + case 7: + drct_r_to_idx = DRCT_Q_7; + break; + case 9: + drct_r_to_idx = DRCT_Q_9; + break; + case 11: + drct_r_to_idx = DRCT_Q_11; + break; + default: + assert( !"Forbidden value for DRCT quantization strategy index" ); + break; + } + return drct_r_to_idx; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_map_num_decd_r_to_idx() + * + * Map the ivas_arith_decd_r_consts and ivas_huff_decd_r_consts tables + *-----------------------------------------------------------------------------------------*/ + +int16_t ivas_map_num_decd_r_to_idx( + const int16_t num_quant_points_decd_r ) +{ + int16_t decd_r_to_idx = -1; + switch ( num_quant_points_decd_r ) + { + case 1: + decd_r_to_idx = DECD_Q_1; + break; + case 3: + decd_r_to_idx = DECD_Q_3; + break; + case 5: + decd_r_to_idx = DECD_Q_5; + break; + case 7: + decd_r_to_idx = DECD_Q_7; + break; + case 9: + decd_r_to_idx = DECD_Q_9; + break; + case 11: + decd_r_to_idx = DECD_Q_11; + break; + default: + assert( !"Forbidden value for DECD quantization strategy index" ); + break; + } + + return decd_r_to_idx; +} + + +/*---------------------------------------------------------------------------------------- - * + * Function ivas_spar_arith_com_init() + * + * arith coder init + *---------------------------------------------------------------------------------------- - */ + +static void ivas_spar_arith_com_init( + ivas_arith_t *pArith, + const ivas_freq_models_t *pFreq_models, + ivas_arith_t *pArith_diff, + const int16_t q_levels, + const int16_t enc_dec ) +{ + int16_t i, j; + float sum; + + pArith->vals = pFreq_models->vals; + pArith->range = q_levels; + pArith->num_models = pFreq_models->num_models; + pArith->dyn_model_bits = ivas_get_bits_to_encode( pArith->num_models - 1 ); + pArith->pFreq_model = pFreq_models->freq_model[0]; + + ivas_get_cum_freq_model( pArith->pFreq_model, pArith->range, pArith->cum_freq[0] ); + + for ( i = 0; i < pArith->num_models - 1; i++ ) + { + pArith->pAlt_freq_models[i] = pFreq_models->freq_model[i + 1]; + ivas_get_cum_freq_model( pArith->pAlt_freq_models[i], pArith->range, pArith->cum_freq[i + 1] ); + } + + if ( enc_dec == ENC ) + { + sum = 0; + for ( i = 1; i < pArith->range + 1; i++ ) + { + sum += pArith->pFreq_model[i]; + } + + for ( i = 1; i < pArith->range + 1; i++ ) + { + pArith->saved_dist_arr[0][i - 1] = log2f( max( 1e-10f, pArith->pFreq_model[i] ) ); + pArith->saved_dist_arr[0][i - 1] -= log2f( max( 1e-10f, sum ) ); + } + + for ( j = 0; j < pArith->num_models - 1; j++ ) + { + sum = 0; + for ( i = 1; i < pArith->range + 1; i++ ) + { + sum += pArith->pAlt_freq_models[j][i]; + } + + for ( i = 1; i < pArith->range + 1; i++ ) + { + pArith->saved_dist_arr[j + 1][i - 1] = log2f( max( 1e-10f, pArith->pAlt_freq_models[j][i] ) ); + pArith->saved_dist_arr[j + 1][i - 1] -= log2f( max( 1e-10f, sum ) ); + } + } + } + + pArith_diff->vals = pFreq_models->diff_vals; + pArith_diff->range = q_levels; + pArith_diff->num_models = pFreq_models->diff_num_models; + pArith_diff->dyn_model_bits = ivas_get_bits_to_encode( pArith_diff->num_models - 1 ); + pArith_diff->pFreq_model = pFreq_models->diff_freq_model[0]; + + ivas_get_cum_freq_model( pArith_diff->pFreq_model, pArith_diff->range, pArith_diff->cum_freq[0] ); + + for ( i = 0; i < pArith_diff->num_models - 1; i++ ) + { + pArith_diff->pAlt_freq_models[i] = pFreq_models->diff_freq_model[i + 1]; + ivas_get_cum_freq_model( pArith_diff->pAlt_freq_models[i], pArith_diff->range, pArith_diff->cum_freq[i + 1] ); + } + + if ( enc_dec == ENC ) + { + sum = 0; + for ( i = 1; i < pArith_diff->range + 1; i++ ) + { + sum += pArith_diff->pFreq_model[i]; + } + + for ( i = 1; i < pArith_diff->range + 1; i++ ) + { + pArith_diff->saved_dist_arr[0][i - 1] = log2f( max( 1e-10f, pArith_diff->pFreq_model[i] ) ); + pArith_diff->saved_dist_arr[0][i - 1] -= log2f( max( 1e-10f, sum ) ); + } + + for ( j = 0; j < pArith_diff->num_models - 1; j++ ) + { + sum = 0; + for ( i = 1; i < pArith_diff->range + 1; i++ ) + { + sum += pArith_diff->pAlt_freq_models[j][i]; + } + + for ( i = 1; i < pArith_diff->range + 1; i++ ) + { + pArith_diff->saved_dist_arr[j + 1][i - 1] = log2f( max( 1e-10f, pArith_diff->pAlt_freq_models[j][i] ) ); + pArith_diff->saved_dist_arr[j + 1][i - 1] -= log2f( max( 1e-10f, sum ) ); + } + } + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_spar_arith_coeffs_com_init() + * + * Init for Arithm. coding + *-----------------------------------------------------------------------------------------*/ + +void ivas_spar_arith_coeffs_com_init( + ivas_arith_coeffs_t *pArith_coeffs, + ivas_spar_md_com_cfg *pSpar_cfg, + const int16_t table_idx, + const int16_t enc_dec ) +{ + int16_t i, pred_r_index, drct_r_index, decd_r_index; + int16_t num_quant_points_pred_r, num_quant_points_drct_r, num_quant_points_decd_r; + + for ( i = 0; i < MAX_QUANT_STRATS; i++ ) + { + num_quant_points_pred_r = ivas_spar_br_table_consts[table_idx].q_lvls[i][0]; /* 0: pred_r */ + pred_r_index = ivas_map_num_pred_r_to_idx( num_quant_points_pred_r, ivas_spar_br_table_consts[table_idx].active_w ); + ivas_spar_arith_com_init( &pArith_coeffs->pred_arith_re[i], &ivas_arith_pred_r_consts[pred_r_index], + &pArith_coeffs->pred_arith_re_diff[i], pSpar_cfg->quant_strat[i].PR.q_levels[0], enc_dec ); + + num_quant_points_drct_r = ivas_spar_br_table_consts[table_idx].q_lvls[i][1]; /* 1: drct_r */ + drct_r_index = ivas_map_num_drct_r_to_idx( num_quant_points_drct_r ); + ivas_spar_arith_com_init( &pArith_coeffs->drct_arith_re[i], &ivas_arith_drct_r_consts[drct_r_index], + &pArith_coeffs->drct_arith_re_diff[i], pSpar_cfg->quant_strat[i].C.q_levels[0], enc_dec ); + + num_quant_points_decd_r = ivas_spar_br_table_consts[table_idx].q_lvls[i][2]; /* 2: decd_r */ + decd_r_index = ivas_map_num_decd_r_to_idx( num_quant_points_decd_r ); + ivas_spar_arith_com_init( &pArith_coeffs->decd_arith_re[i], &ivas_arith_decd_r_consts[decd_r_index], + &pArith_coeffs->decd_arith_re_diff[i], pSpar_cfg->quant_strat[i].P_r.q_levels[0], enc_dec ); + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_huffman_dec_init_min_max_len() + * + * Find min and max length in codebook and finalize initialization of ivas_huffman_cfg_t. + *-----------------------------------------------------------------------------------------*/ + +static void ivas_huffman_dec_init_min_max_len( + ivas_huffman_cfg_t *p_huff_cfg ) +{ + int16_t i, code_len; + const int16_t *codebook; + + codebook = p_huff_cfg->codebook; + + p_huff_cfg->min_len = p_huff_cfg->sym_len; + p_huff_cfg->max_len = 0; + + for ( i = 0; i < p_huff_cfg->sym_len; i++ ) + { + code_len = codebook[1]; + if ( p_huff_cfg->min_len > code_len ) + { + p_huff_cfg->min_len = code_len; + } + if ( p_huff_cfg->max_len < code_len ) + { + p_huff_cfg->max_len = code_len; + } + codebook = codebook + 3; + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_spar_huff_coeffs_com_init() + * + * Init for Huffman decoding + *-----------------------------------------------------------------------------------------*/ + +void ivas_spar_huff_coeffs_com_init( + ivas_huff_coeffs_t *pHuff_coeffs, + ivas_spar_md_com_cfg *pSpar_cfg, + const int16_t table_idx, + const int16_t enc_dec ) +{ + int16_t i, pred_r_index, drct_r_index, decd_r_index; + int16_t num_quant_points_pred_r, num_quant_points_drct_r, num_quant_points_decd_r; + ivas_huffman_cfg_t *p_huff_cfg; + + for ( i = 0; i < MAX_QUANT_STRATS; i++ ) + { + p_huff_cfg = &pHuff_coeffs->pred_huff_re[i]; + num_quant_points_pred_r = ivas_spar_br_table_consts[table_idx].q_lvls[i][0]; /* 0: pred_r */ + pred_r_index = ivas_map_num_pred_r_to_idx( num_quant_points_pred_r, 0 ); + p_huff_cfg->codebook = &ivas_huff_pred_r_consts[pred_r_index].code_book[0][0]; + if ( enc_dec == DEC ) + { + p_huff_cfg->sym_len = pSpar_cfg->quant_strat[i].PR.q_levels[0]; + ivas_huffman_dec_init_min_max_len( p_huff_cfg ); + } + + p_huff_cfg = &pHuff_coeffs->drct_huff_re[i]; + num_quant_points_drct_r = ivas_spar_br_table_consts[table_idx].q_lvls[i][1]; /* 1: drct_r */ + drct_r_index = ivas_map_num_drct_r_to_idx( num_quant_points_drct_r ); + p_huff_cfg->codebook = &ivas_huff_drct_r_consts[drct_r_index].code_book[0][0]; + if ( enc_dec == DEC ) + { + p_huff_cfg->sym_len = pSpar_cfg->quant_strat[i].C.q_levels[0]; + ivas_huffman_dec_init_min_max_len( p_huff_cfg ); + } + + p_huff_cfg = &pHuff_coeffs->decd_huff_re[i]; + num_quant_points_decd_r = ivas_spar_br_table_consts[table_idx].q_lvls[i][2]; /* 2: decd_r */ + decd_r_index = ivas_map_num_decd_r_to_idx( num_quant_points_decd_r ); + p_huff_cfg->codebook = &ivas_huff_decd_r_consts[decd_r_index].code_book[0][0]; + if ( enc_dec == DEC ) + { + p_huff_cfg->sym_len = pSpar_cfg->quant_strat[i].P_r.q_levels[0]; + ivas_huffman_dec_init_min_max_len( p_huff_cfg ); + } + } + + return; +} diff --git a/lib_com/ivas_error.h b/lib_com/ivas_error.h new file mode 100644 index 0000000000000000000000000000000000000000..fbb18cf9ff5d7fc6d67c511b0457d9972a2744d1 --- /dev/null +++ b/lib_com/ivas_error.h @@ -0,0 +1,259 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +/* options.h needed for debugging/development features + * It should be stripped for delivery along with debugging switches */ +#include "options.h" + +#ifndef IVAS_ERROR_H +#define IVAS_ERROR_H + +typedef enum +{ + /*----------------------------------------* + * no error * + *----------------------------------------*/ + IVAS_ERR_OK = 0x0000, + + /*----------------------------------------* + * API errors * + *----------------------------------------*/ + IVAS_ERR_INVALID_BANDWIDTH = 0x1000, + IVAS_ERR_INVALID_DTX_UPDATE_RATE, + IVAS_ERR_INVALID_SAMPLING_RATE, + IVAS_ERR_NOT_CONFIGURED, + IVAS_ERR_INVALID_STEREO_MODE, + IVAS_ERR_INVALID_MC_LAYOUT, + IVAS_ERR_INVALID_BITRATE, + IVAS_ERR_INVALID_MASA_CONFIG, + IVAS_ERR_TOO_MANY_INPUTS, + IVAS_ERR_MISSING_METADATA, + IVAS_ERR_RECONFIGURE_NOT_SUPPORTED, + IVAS_ERR_INVALID_FEC_CONFIG, + IVAS_ERR_INVALID_FEC_OFFSET, + IVAS_ERR_INVALID_INPUT_BUFFER_SIZE, + IVAS_ERR_INVALID_OUTPUT_BUFFER_SIZE, + IVAS_ERR_DTX_NOT_SUPPORTED, + IVAS_ERR_UNEXPECTED_NULL_POINTER, + IVAS_ERR_METADATA_NOT_EXPECTED, + IVAS_ERR_WRONG_PARAMS, + IVAS_ERR_INIT_ERROR, + IVAS_ERR_WRONG_MODE, + IVAS_ERR_INVALID_OUTPUT_FORMAT, + IVAS_ERR_HEAD_ROTATION_NOT_SUPPORTED, + IVAS_ERR_EXT_ORIENTATION_NOT_SUPPORTED, + IVAS_ERR_DIRECTIVITY_NOT_SUPPORTED, + IVAS_ERR_ACOUSTIC_ENVIRONMENT_NOT_SUPPORTED, + IVAS_ERR_INVALID_HRTF, + IVAS_ERR_INVALID_INPUT_FORMAT, + IVAS_ERR_INVALID_INDEX, + IVAS_ERR_NOT_SUPPORTED_OPTION, + IVAS_ERR_NOT_IMPLEMENTED, + IVAS_ERR_WAITING_FOR_BITSTREAM, + IVAS_ERR_ISM_FILE_READER_INVALID_METADATA_FORMAT, + IVAS_ERR_ISM_INVALID_METADATA_VALUE, + IVAS_ERR_INVALID_MASA_FORMAT_METADATA_FILE, + IVAS_ERR_IO_CONFIG_PAIR_NOT_SUPPORTED, + IVAS_ERR_TSM_NOT_ENABLED, + IVAS_ERR_FETCH_SIZE_NO_MULTIPLE_OF_5MS, + + /*----------------------------------------* + * input data errors * + *----------------------------------------*/ + IVAS_ERR_INVALID_BITSTREAM = 0x2000, + + /*----------------------------------------* + * hardware errors * + *----------------------------------------*/ + IVAS_ERR_FAILED_ALLOC = 0x3000, + + /*----------------------------------------* + * internal errors * + *----------------------------------------*/ + IVAS_ERR_INTERNAL = 0x4000, + IVAS_ERR_INTERNAL_FATAL, + + /*----------------------------------------* + * file I/O errors (lib_util only) * + *----------------------------------------*/ + IVAS_ERR_FAILED_FILE_OPEN = 0x5000, + IVAS_ERR_FAILED_FILE_WRITE, + IVAS_ERR_FAILED_FILE_READ, + IVAS_ERR_FAILED_FILE_PARSE, + IVAS_ERR_END_OF_FILE, + IVAS_ERR_BITSTREAM_WRITER_INVALID_FORMAT, + IVAS_ERR_BITSTREAM_READER_INVALID_DATA, + IVAS_ERR_BITSTREAM_READER_INVALID_FORMAT, + IVAS_ERR_NO_FILE_OPEN, + IVAS_ERR_SAMPLING_RATE_UNKNOWN, + + /*----------------------------------------* + * renderer (lib_rend only) * + *----------------------------------------*/ + IVAS_ERR_NUM_CHANNELS_UNKNOWN = 0x6000, + IVAS_ERR_INVALID_CUSTOM_LS_LAYOUT, + IVAS_ERR_INVALID_INPUT_ID, + IVAS_ERR_WRONG_NUM_CHANNELS, + IVAS_ERR_INVALID_BUFFER_SIZE, + IVAS_ERR_INVALID_RENDER_CONFIG, + IVAS_ERR_ACOUSTIC_ENVIRONMENT_MISSING, + IVAS_ERR_INVALID_ER_PARAM, + IVAS_ERR_DIRECTIVITY_PATTERN_ID_MISSING, + + /*----------------------------------------* + * unknown error * + *----------------------------------------*/ + IVAS_ERR_UNKNOWN = 0xF000, /* fallback error code */ + +} ivas_error; + + +static inline const char *ivas_error_to_string( ivas_error error_code ) +{ + /* Try to match to a specific string */ + switch ( error_code ) + { + case IVAS_ERR_OK: + return "No error"; + case IVAS_ERR_FAILED_ALLOC: + return "Failed allocation error"; + case IVAS_ERR_INTERNAL: + return "Internal error"; + case IVAS_ERR_INTERNAL_FATAL: + return "Internal fatal error"; + case IVAS_ERR_INVALID_SAMPLING_RATE: + return "Invalid sampling rate"; + case IVAS_ERR_INVALID_OUTPUT_FORMAT: + return "Invalid output format"; + case IVAS_ERR_INVALID_CUSTOM_LS_LAYOUT: + return "Invalid custom loudspeaker layout"; + case IVAS_ERR_INVALID_INPUT_ID: + return "Invalid input ID"; + case IVAS_ERR_WRONG_NUM_CHANNELS: + return "Wrong number of channels"; + case IVAS_ERR_INVALID_BUFFER_SIZE: + return "Invalid buffer size"; + case IVAS_ERR_IO_CONFIG_PAIR_NOT_SUPPORTED: + return "Unsupported input/output config pair"; + case IVAS_ERR_FAILED_FILE_OPEN: + return "File open error"; + case IVAS_ERR_FAILED_FILE_WRITE: + return "File write error"; + case IVAS_ERR_FAILED_FILE_READ: + return "File read error"; + case IVAS_ERR_FAILED_FILE_PARSE: + return "Parse error"; + case IVAS_ERR_END_OF_FILE: + return "End of file"; + case IVAS_ERR_WRONG_PARAMS: + return "Wrong function parameters"; + case IVAS_ERR_INVALID_BANDWIDTH: + return "Invalid bandwidth"; + case IVAS_ERR_INVALID_DTX_UPDATE_RATE: + return "Invalid DTX update rate"; + case IVAS_ERR_NOT_CONFIGURED: + return "Handle has not been configured"; + case IVAS_ERR_INVALID_STEREO_MODE: + return "Invalid stereo mode"; + case IVAS_ERR_INVALID_MC_LAYOUT: + return "Invalid speaker layout"; + case IVAS_ERR_INVALID_BITRATE: + return "Invalid bitrate"; + case IVAS_ERR_INVALID_MASA_CONFIG: + return "Invalid MASA config"; + case IVAS_ERR_TOO_MANY_INPUTS: + return "Too many object inputs provided"; + case IVAS_ERR_RECONFIGURE_NOT_SUPPORTED: + return "Reconfigure not supported"; + case IVAS_ERR_INVALID_FEC_OFFSET: + return "Invalid FEC offset"; + case IVAS_ERR_INVALID_INPUT_BUFFER_SIZE: + return "Invalid input buffer size"; + case IVAS_ERR_INVALID_OUTPUT_BUFFER_SIZE: + return "Invalid output buffer size"; + case IVAS_ERR_DTX_NOT_SUPPORTED: + return "DTX is not supported in this IVAS format and element mode"; + case IVAS_ERR_UNEXPECTED_NULL_POINTER: + return "Unexpected NULL pointer"; + case IVAS_ERR_METADATA_NOT_EXPECTED: + return "Metadata input not expected for current configuration"; + case IVAS_ERR_NOT_IMPLEMENTED: + return "Not implemented"; + case IVAS_ERR_ISM_FILE_READER_INVALID_METADATA_FORMAT: + return "Invalid metadata file format"; + case IVAS_ERR_ISM_INVALID_METADATA_VALUE: + return "Invalid metadata value provided"; + case IVAS_ERR_NOT_SUPPORTED_OPTION: + return "Option not supported in this set-up"; + case IVAS_ERR_INIT_ERROR: + return "Initialization error"; + case IVAS_ERR_INVALID_BITSTREAM: + return "Invalid bitstream"; + case IVAS_ERR_WRONG_MODE: + return "Wrong mode"; + case IVAS_ERR_HEAD_ROTATION_NOT_SUPPORTED: + return "Head rotation not supported"; + case IVAS_ERR_EXT_ORIENTATION_NOT_SUPPORTED: + return "External orientation not supported"; + case IVAS_ERR_DIRECTIVITY_NOT_SUPPORTED: + return "Directivity not supported"; + case IVAS_ERR_ACOUSTIC_ENVIRONMENT_NOT_SUPPORTED: + return "Acoustic environment not supported"; + case IVAS_ERR_INVALID_HRTF: + return "Unsupported HRTF filter set"; + case IVAS_ERR_INVALID_INPUT_FORMAT: + return "Invalid input format"; + case IVAS_ERR_INVALID_INDEX: + return "Invalid index"; + default: + break; + } + + /* For error categories that are likely to still have many changes to + * specific error codes, return one string per category */ + if ( ( error_code & 0xF000 ) == 0x1000 ) + { + return "API error"; + } + if ( ( error_code & 0xF000 ) == 0x2000 ) + { + return "data error"; + } + + return "Unknown error"; +} + +#endif /* IVAS_ERROR_H */ diff --git a/lib_com/ivas_error_utils.h b/lib_com/ivas_error_utils.h new file mode 100644 index 0000000000000000000000000000000000000000..204acc40e876ac6feee771e3778a615437ec4f76 --- /dev/null +++ b/lib_com/ivas_error_utils.h @@ -0,0 +1,73 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include "options.h" + +#include +#include +#include + +#include "ivas_error.h" + + +#ifndef IVAS_ERROR_UTILS_H +#define IVAS_ERROR_UTILS_H + +/* + * Usage: + * + * IVAS_ERROR( error_code, decription_fmt, ... ); + * + * where: + * - error_code is of type enum ivas_error + * - decription_fmt is a description string with printf-like formatting + * - ... are (optional) printf-like arguments to place in the description format string + * + * Examples: + * + * IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for XXX" ); + * + * IVAS_ERROR( IVAS_ERR_INTERNAL, "Unexpected value %f in frame %d", var, frame ); + * + * Note: Contrary to printf, this macro is not able to verify at build time that the + * placeholders (e.g. "%f") in the format string match the types of provided arguments. + * If unexpected values are printed or the macro causes a crash, double check that the + * format specifiers are correct. + */ +#define IVAS_ERROR( error_code, ... ) ivas_error_wrapper( error_code ) + +static inline ivas_error ivas_error_wrapper( const ivas_error error_code ) +{ + return error_code; +} + +#endif /* IVAS_ERROR_UTILS_H */ diff --git a/lib_com/ivas_fb_mixer.c b/lib_com/ivas_fb_mixer.c new file mode 100644 index 0000000000000000000000000000000000000000..f914d4e75160f1b5af8f9c44976f10b6cb471c9e --- /dev/null +++ b/lib_com/ivas_fb_mixer.c @@ -0,0 +1,1341 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_rom_com.h" +#include +#include "wmc_auto.h" + + +/*------------------------------------------------------------------------------------------* + * Static functions declarations + *------------------------------------------------------------------------------------------*/ + +static void ivas_get_active_bins( const int16_t **pActive_bins, const int16_t **pActive_bins_abs, const int16_t **pStart_offset, const int16_t **pStart_offset_ab, const int32_t sampling_rate ); +static void ivas_get_ld_fb_resp( float **ppIdeal_FRs_re, float **ppIdeal_FRs_im, float **ppNew_FRs_re, float **ppNew_FRs_im, const int16_t *pActive_bins, const int16_t *pStart_offset, const int16_t num_bands, const int16_t delay, const int32_t sampling_rate ); +static ivas_error ivas_filterbank_setup( IVAS_FB_MIXER_HANDLE hFbMixer, const int32_t sampling_rate ); +static ivas_error ivas_fb_mixer_get_window( const int16_t fade_len, const int32_t sampling_rate, const float **pWindow ); + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_get_num_bands_from_bw_idx() + * + * Get number of bands from BW index + *-----------------------------------------------------------------------------------------*/ + +/*! r: number of spectral bands */ +int16_t ivas_get_num_bands_from_bw_idx( + const int16_t bwidth /* i : audio bandwidth */ +) +{ + int16_t num_active_bands; + + assert( bwidth > 0 ); /*NB BW is not supported*/ + num_active_bands = ivas_num_active_bands[bwidth - 1]; + + return num_active_bands; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_get_num_bands() + * + * Get number of bands depending on the sampling rates + *-----------------------------------------------------------------------------------------*/ + +static int16_t ivas_get_num_bands( + const int32_t sampling_rate ) +{ + int16_t bwidth = ivas_get_bw_idx_from_sample_rate( sampling_rate ); + int16_t num_active_bands = ivas_get_num_bands_from_bw_idx( bwidth ); + + return num_active_bands; +} + + +/*---------------------------------------------------------------------* + * Function ivas_fb_set_cfg() + * + * Set default configs for FB mixer + *---------------------------------------------------------------------*/ + +ivas_error ivas_fb_set_cfg( + IVAS_FB_CFG **pFb_cfg_out, /* o : FB config. handle */ + const int16_t ivas_format, /* i : IVAS format */ + const int16_t num_in_chans, /* i : number of FB input channels */ + const int16_t num_out_chans, /* i : number of FB output channels */ + const int16_t active_w_mixing, /* i : active_w_mixing flag */ + const int32_t sampling_rate, /* i : sampling rate */ + const int16_t nchan_fb_in /* i : number of dirAC analysis channels*/ +) +{ + IVAS_FB_CFG *pFb_cfg; + + if ( ( pFb_cfg = (IVAS_FB_CFG *) malloc( sizeof( IVAS_FB_CFG ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for FB mixer config" ); + } + + pFb_cfg->num_in_chans = num_in_chans; + pFb_cfg->num_out_chans = num_out_chans; + pFb_cfg->nchan_fb_in = nchan_fb_in; + + pFb_cfg->pcm_offset = 0; /* note: in SPAR decoder, this parameter is overwritten later */ + pFb_cfg->active_w_mixing = active_w_mixing; + pFb_cfg->windowed_fr_offset = 0; + + if ( ivas_format == ISM_FORMAT ) + { + pFb_cfg->fb_latency = NS2SA( sampling_rate, DELAY_FB_4_NS ); + pFb_cfg->fade_len = NS2SA( sampling_rate, DELAY_FB_4_NS ); + pFb_cfg->prior_input_length = NS2SA( sampling_rate, DELAY_DIRAC_ENC_CMP_NS_PARAM_ISM ) + NS2SA( sampling_rate, DIRAC_SLOT_ENC_NS ); + } + else if ( ivas_format == SBA_FORMAT ) + { + pFb_cfg->fb_latency = NS2SA( sampling_rate, DELAY_FB_1_NS ); + + pFb_cfg->fade_len = NS2SA( sampling_rate, DELAY_FB_4_NS ); + pFb_cfg->prior_input_length = NS2SA( sampling_rate, FRAME_SIZE_NS ); + pFb_cfg->windowed_fr_offset = (int16_t) ( (float) ( sampling_rate / FRAMES_PER_SEC ) * 3.0f / 4.0f ) - NS2SA( sampling_rate, DELAY_DIRAC_SPAR_ENC_CMP_NS ); + } + else if ( ivas_format == MASA_FORMAT ) + { + pFb_cfg->fb_latency = NS2SA( sampling_rate, DELAY_FB_1_NS ); + pFb_cfg->fade_len = NS2SA( sampling_rate, DELAY_FB_1_NS ); + pFb_cfg->prior_input_length = NS2SA( sampling_rate, DELAY_DIRAC_ENC_CMP_NS ) + NS2SA( sampling_rate, DIRAC_SLOT_ENC_NS ); + } + else if ( ivas_format == MC_FORMAT ) + { + pFb_cfg->fb_latency = NS2SA( sampling_rate, DELAY_FB_1_NS ); + pFb_cfg->fade_len = NS2SA( sampling_rate, DELAY_FB_1_NS ); + pFb_cfg->prior_input_length = NS2SA( sampling_rate, DELAY_DIRAC_ENC_CMP_NS ) + NS2SA( sampling_rate, PARAM_MC_SLOT_ENC_NS ); + } + + *pFb_cfg_out = pFb_cfg; + + return IVAS_ERR_OK; +} + + +/*------------------------------------------------------------------------- + * ivas_FB_mixer_open() + * + * Allocate and initialize FB mixer handle + *------------------------------------------------------------------------*/ + +ivas_error ivas_FB_mixer_open( + IVAS_FB_MIXER_HANDLE *hFbMixer_out, /* i/o: FB mixer handle */ + const int32_t sampling_rate, /* i : sampling rate */ + IVAS_FB_CFG *fb_cfg, /* i : FB config. handle */ + const int16_t spar_reconfig_flag /* i : SPAR reconfiguration flag */ +) +{ + IVAS_FB_MIXER_HANDLE hFbMixer; + int16_t i, j, frame_len, num_bands; + int16_t num_chs_alloc; + ivas_error error; + + error = IVAS_ERR_OK; + + frame_len = (int16_t) ( sampling_rate / FRAMES_PER_SEC ); + + hFbMixer = *hFbMixer_out; + + if ( !spar_reconfig_flag ) + { + if ( ( hFbMixer = (IVAS_FB_MIXER_HANDLE) malloc( sizeof( IVAS_FB_MIXER_DATA ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for FB mixer encoder" ); + } + + if ( fb_cfg->num_out_chans > 0 ) + { + if ( ( hFbMixer->pFb = (ivas_filterbank_t *) malloc( sizeof( ivas_filterbank_t ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for FB mixer encoder" ); + } + } + else + { + hFbMixer->pFb = NULL; + } + } + + if ( fb_cfg->active_w_mixing == -1 ) + { + num_chs_alloc = 0; + } + else if ( fb_cfg->active_w_mixing ) + { + num_chs_alloc = max( fb_cfg->num_in_chans, fb_cfg->nchan_fb_in ); + } + else + { + num_chs_alloc = 1; /* only W channel processed for predicting YZX */ + } + + for ( i = 0; i < num_chs_alloc; i++ ) + { + if ( fb_cfg->num_out_chans == 0 ) + { + hFbMixer->ppFilterbank_inFR_re[i] = NULL; + hFbMixer->ppFilterbank_inFR_im[i] = NULL; + } + else + { + j = fb_cfg->remix_order[i]; + + if ( ( hFbMixer->ppFilterbank_inFR_re[j] = (float *) malloc( sizeof( float ) * frame_len ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for FB mixer encoder" ); + } + + if ( ( hFbMixer->ppFilterbank_inFR_im[j] = (float *) malloc( sizeof( float ) * frame_len ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for FB mixer encoder" ); + } + } + } + + if ( fb_cfg->active_w_mixing == -1 ) + { + num_chs_alloc = 0; + } + else + { + num_chs_alloc = max( fb_cfg->num_in_chans, fb_cfg->nchan_fb_in ); + } + + for ( i = 0; i < num_chs_alloc; i++ ) + { + if ( ( hFbMixer->ppFilterbank_prior_input[i] = (float *) malloc( sizeof( float ) * fb_cfg->prior_input_length ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for FB mixer encoder" ); + } + set_f( hFbMixer->ppFilterbank_prior_input[i], 0, fb_cfg->prior_input_length ); + } + + if ( ( fb_cfg->active_w_mixing != -1 ) && ( fb_cfg->num_out_chans > 0 ) ) + { + float *pTemp_mem; + if ( ( pTemp_mem = (float *) malloc( sizeof( float ) * fb_cfg->num_out_chans * max( fb_cfg->num_in_chans, fb_cfg->nchan_fb_in ) * IVAS_MAX_NUM_BANDS ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for FB mixer" ); + } + for ( i = 0; i < fb_cfg->num_out_chans; i++ ) + { + for ( j = 0; j < fb_cfg->num_in_chans; j++ ) + { + hFbMixer->prior_mixer[i][j] = pTemp_mem; + pTemp_mem += IVAS_MAX_NUM_BANDS; + set_f( hFbMixer->prior_mixer[i][j], 0, IVAS_MAX_NUM_BANDS ); + } + } + } + + if ( !spar_reconfig_flag ) + { + if ( fb_cfg->num_out_chans > 0 ) + { + const int16_t *pActive_bins_per_band, *pActive_bins_per_band_abs, *pStart_offset, *pStart_offset_abs; + + num_bands = ivas_get_num_bands( sampling_rate ); + + ivas_get_active_bins( &pActive_bins_per_band, &pActive_bins_per_band_abs, &pStart_offset, &pStart_offset_abs, sampling_rate ); + + if ( fb_cfg->active_w_mixing != -1 ) + { + for ( i = 0; i < num_bands; i++ ) + { + if ( ( hFbMixer->pFb->fb_bin_to_band.pFb_bin_to_band[i] = (float *) malloc( sizeof( float ) * pActive_bins_per_band_abs[i] ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for FB mixer encoder" ); + } + } + } + + if ( sampling_rate != 48000 ) + { + int16_t num_diff_bands, start_diff_band_non48k; + + num_diff_bands = MAX_NUM_BANDS_DIFF_NON48K; + start_diff_band_non48k = num_bands - num_diff_bands; + + hFbMixer->num_diff_bands = num_diff_bands; + + for ( j = start_diff_band_non48k; j < num_bands; j++ ) + { + if ( ( hFbMixer->pFb->fb_consts.ppFilterbank_FRs_non48k[0][j] = (float *) malloc( sizeof( float ) * pActive_bins_per_band[j] ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for FB mixer encoder" ); + } + + if ( ( hFbMixer->pFb->fb_consts.ppFilterbank_FRs_non48k[1][j] = (float *) malloc( sizeof( float ) * pActive_bins_per_band[j] ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for FB mixer encoder" ); + } + } + } + } + else + { + /* ignore all the deeper filter bank stuff for now */ + hFbMixer->num_diff_bands = 0; + } + } + + hFbMixer->fb_cfg = fb_cfg; + set_s( hFbMixer->first_frame, 1, hFbMixer->fb_cfg->num_out_chans ); + set_s( hFbMixer->first_frame + hFbMixer->fb_cfg->num_out_chans, 0, IVAS_SPAR_MAX_CH - hFbMixer->fb_cfg->num_out_chans ); + + if ( !spar_reconfig_flag ) + { + if ( ( error = ivas_filterbank_setup( hFbMixer, sampling_rate ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + *hFbMixer_out = hFbMixer; + + return error; +} + + +/*------------------------------------------------------------------------- + * ivas_FB_mixer_close() + * + * Deallocate FB mixer handle + *------------------------------------------------------------------------*/ + +void ivas_FB_mixer_close( + IVAS_FB_MIXER_HANDLE *hFbMixer_in, /* i/o: FB mixer handle */ + const int32_t sampling_rate, /* i : sampling rate in Hz */ + const int16_t spar_reconfig_flag /* i : SPAR reconfiguration flag */ +) +{ + IVAS_FB_MIXER_HANDLE hFbMixer; + IVAS_FB_CFG *fb_cfg; + int16_t i, j, num_bands; + int16_t num_chs_alloc; + + hFbMixer = *hFbMixer_in; + fb_cfg = hFbMixer->fb_cfg; + + if ( fb_cfg->active_w_mixing == -1 ) + { + num_chs_alloc = 0; + } + else if ( fb_cfg->active_w_mixing ) + { + num_chs_alloc = max( fb_cfg->num_in_chans, fb_cfg->nchan_fb_in ); + } + else + { + num_chs_alloc = 1; /* only W channel processed for predicting YZX */ + } + + if ( hFbMixer != NULL ) + { + for ( i = 0; i < num_chs_alloc; i++ ) + { + if ( fb_cfg->num_out_chans > 0 ) + { + j = fb_cfg->remix_order[i]; + + free( hFbMixer->ppFilterbank_inFR_re[j] ); + hFbMixer->ppFilterbank_inFR_re[j] = NULL; + + free( hFbMixer->ppFilterbank_inFR_im[j] ); + hFbMixer->ppFilterbank_inFR_im[j] = NULL; + } + } + + if ( fb_cfg->active_w_mixing == -1 ) + { + num_chs_alloc = 0; + } + else + { + num_chs_alloc = max( fb_cfg->num_in_chans, fb_cfg->nchan_fb_in ); + } + + for ( i = 0; i < num_chs_alloc; i++ ) + { + free( hFbMixer->ppFilterbank_prior_input[i] ); + hFbMixer->ppFilterbank_prior_input[i] = NULL; + } + + if ( ( fb_cfg->active_w_mixing != -1 ) && ( fb_cfg->num_out_chans > 0 ) ) + { + free( hFbMixer->prior_mixer[0][0] ); + hFbMixer->prior_mixer[0][0] = NULL; + } + + if ( !spar_reconfig_flag ) + { + if ( fb_cfg->num_out_chans > 0 ) + { + num_bands = hFbMixer->pFb->filterbank_num_bands; + + if ( fb_cfg->active_w_mixing != -1 ) + { + for ( i = 0; i < num_bands; i++ ) + { + free( hFbMixer->pFb->fb_bin_to_band.pFb_bin_to_band[i] ); + hFbMixer->pFb->fb_bin_to_band.pFb_bin_to_band[i] = NULL; + } + } + + if ( sampling_rate != 48000 ) + { + int16_t start_diff_band_non48k; + start_diff_band_non48k = num_bands - hFbMixer->num_diff_bands; + + for ( j = start_diff_band_non48k; j < num_bands; j++ ) + { + free( hFbMixer->pFb->fb_consts.ppFilterbank_FRs_non48k[0][j] ); + hFbMixer->pFb->fb_consts.ppFilterbank_FRs_non48k[0][j] = NULL; + + free( hFbMixer->pFb->fb_consts.ppFilterbank_FRs_non48k[1][j] ); + hFbMixer->pFb->fb_consts.ppFilterbank_FRs_non48k[1][j] = NULL; + } + } + } + if ( hFbMixer->pFb != NULL ) + { + free( hFbMixer->pFb ); + hFbMixer->pFb = NULL; + } + } + + if ( hFbMixer->fb_cfg != NULL ) + { + free( hFbMixer->fb_cfg ); + hFbMixer->fb_cfg = NULL; + } + + if ( !spar_reconfig_flag ) + { + free( hFbMixer ); + hFbMixer = NULL; + } + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_fb_mixer_pcm_ingest() + * + * PCM ingest block + *-----------------------------------------------------------------------------------------*/ + +void ivas_fb_mixer_pcm_ingest( + IVAS_FB_MIXER_HANDLE hFbMixer, /* i/o: FB mixer handle */ + float *pcm_in[], /* i : input audio channels */ + float **ppOut_pcm, /* o : output audio channels */ + const int16_t frame_len, /* i : frame length */ + const int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] ) +{ + int16_t i; + int16_t num_chs_ingest; + IVAS_FB_CFG *fb_cfg = hFbMixer->fb_cfg; + + if ( fb_cfg->active_w_mixing ) + { + num_chs_ingest = fb_cfg->num_in_chans; + } + else + { + num_chs_ingest = 1; /* forward Filterbank MDFT only on W */ + } + + for ( i = 0; i < fb_cfg->num_in_chans; i++ ) + { + mvr2r( &hFbMixer->ppFilterbank_prior_input[i][fb_cfg->prior_input_length - frame_len], ppOut_pcm[i], frame_len ); + mvr2r( pcm_in[HOA_md_ind[i]], &ppOut_pcm[i][frame_len], frame_len ); + } + + for ( i = 0; i < num_chs_ingest; i++ ) + { + ivas_mdft( ppOut_pcm[fb_cfg->remix_order[i]], hFbMixer->ppFilterbank_inFR_re[fb_cfg->remix_order[i]], hFbMixer->ppFilterbank_inFR_im[fb_cfg->remix_order[i]], frame_len << 1, frame_len ); + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_fb_mixer_update_prior_input() + * + * + *-----------------------------------------------------------------------------------------*/ + +void ivas_fb_mixer_update_prior_input( + IVAS_FB_MIXER_HANDLE hFbMixer, /* i/o: FB mixer handle */ + float *pcm_in[], /* i : input audio channels */ + const int16_t length, /* i : length of time slot */ + const int16_t nchan_fb_in /* i : number of analysis channels */ +) +{ + int16_t i; + + for ( i = 0; i < nchan_fb_in; i++ ) + { + mvr2r( &hFbMixer->ppFilterbank_prior_input[i][length], hFbMixer->ppFilterbank_prior_input[i], hFbMixer->fb_cfg->prior_input_length - length ); + mvr2r( pcm_in[i], &hFbMixer->ppFilterbank_prior_input[i][hFbMixer->fb_cfg->prior_input_length - length], length ); + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_fb_mixer_get_windowed_fr() + * + * + *-----------------------------------------------------------------------------------------*/ + +void ivas_fb_mixer_get_windowed_fr( + IVAS_FB_MIXER_HANDLE hFbMixer, /* i/o: FB mixer handle */ + float *pcm_in[], /* i : input audio channels */ + float *frame_f_real[], /* o : real freq domain values */ + float *frame_f_imag[], /* o : imag freq domain values */ + const int16_t length, /* i : number of new samples in time slot */ + const int16_t mdft_len, /* i : MDFT frame length */ + const int16_t nchan_fb_in /* i : number of analysis channels */ +) +{ + int16_t ch_idx, j, offset, rev_offset; + int16_t n_old_samples; + int16_t n_new_samples; + float fr_in_block[L_FRAME48k * 2]; + const float *win_ptr; + + n_old_samples = min( ( hFbMixer->fb_cfg->prior_input_length - hFbMixer->fb_cfg->windowed_fr_offset ), ( 2 * mdft_len ) ); + n_new_samples = max( 0, 2 * length - n_old_samples ); + offset = (int16_t) ( 2 * mdft_len - length - hFbMixer->ana_window_offset ); + rev_offset = (int16_t) ( 2 * mdft_len - hFbMixer->ana_window_offset ); + set_zero( fr_in_block, offset ); + + for ( ch_idx = 0; ch_idx < nchan_fb_in; ch_idx++ ) + { + mvr2r( &hFbMixer->ppFilterbank_prior_input[ch_idx][offset + hFbMixer->fb_cfg->windowed_fr_offset], &fr_in_block[offset], n_old_samples - offset ); + mvr2r( pcm_in[ch_idx], &fr_in_block[n_old_samples], n_new_samples ); + win_ptr = hFbMixer->pAna_window; + + for ( j = offset; j < 2 * mdft_len - length; j++ ) + { + fr_in_block[j] *= ( *( win_ptr++ ) ); + } + + for ( j = rev_offset; j < 2 * mdft_len; j++ ) + { + fr_in_block[j] *= ( *( --win_ptr ) ); + } + + ivas_mdft( fr_in_block, frame_f_real[ch_idx], frame_f_imag[ch_idx], mdft_len << 1, mdft_len ); + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_fb_mixer_cross_fading() + * + * FB Mixer cross fading + *-----------------------------------------------------------------------------------------*/ + +void ivas_fb_mixer_cross_fading( + IVAS_FB_MIXER_HANDLE hFbMixer, + float **ppOut_pcm, + float *pMdft_out_old, + float *pMdft_out_new, + const int16_t ch, + const int16_t frame_len, + const int16_t cf_offset ) +{ + int16_t k, fade_start_offset, fade_end_offset; + + if ( hFbMixer->first_frame[ch] == 0 ) + { + fade_start_offset = hFbMixer->cross_fade_start_offset; + fade_end_offset = hFbMixer->cross_fade_end_offset; + + for ( k = 0; k < fade_start_offset; k++ ) + { + ppOut_pcm[ch][k] = pMdft_out_old[k + cf_offset]; + } + + for ( k = fade_start_offset; k < fade_end_offset; k++ ) + { + ppOut_pcm[ch][k] = pMdft_out_new[k + cf_offset] * hFbMixer->pFilterbank_cross_fade[k - fade_start_offset] + pMdft_out_old[k + cf_offset] * ( 1.0f - hFbMixer->pFilterbank_cross_fade[k - fade_start_offset] ); + } + + for ( k = fade_end_offset; k < frame_len; k++ ) + { + ppOut_pcm[ch][k] = pMdft_out_new[k + cf_offset]; + } + } + else + { + hFbMixer->first_frame[ch] = 0; + + for ( k = 0; k < frame_len; k++ ) + { + ppOut_pcm[ch][k] = pMdft_out_new[k + cf_offset]; + } + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_fb_mixer_process() + * + * Filter bank process + *-----------------------------------------------------------------------------------------*/ + +void ivas_fb_mixer_process( + IVAS_FB_MIXER_HANDLE hFbMixer, /* i/o: FB mixer handle */ + float ***mixer_mat, /* i : mixer matrix */ + float **ppOut_pcm, /* o : output audio channels */ + const int16_t frame_len, /* i : frame length in samples */ + int16_t in_out_mixer_map[IVAS_MAX_FB_MIXER_OUT_CH][IVAS_MAX_SPAR_FB_MIXER_IN_CH] /* i/o: mixing mapping */ +) +{ + ivas_filterbank_t *pFb = hFbMixer->pFb; + int16_t num_bands = pFb->filterbank_num_bands; + int16_t i, j, k, ch, hist; + const float *pFilterbank_bin_to_band_re; + const float *pFilterbank_bin_to_band_im; + float *pMdft_out[2], *pOut_fr_re, *pOut_fr_im; + float Out_fr_re[L_FRAME48k], Out_fr_im[L_FRAME48k]; + float Mdft_out_0[L_FRAME48k * 2], Mdft_out_1[L_FRAME48k * 2]; + + pOut_fr_re = Out_fr_re; + pOut_fr_im = Out_fr_im; + pMdft_out[0] = Mdft_out_0; + pMdft_out[1] = Mdft_out_1; + + for ( ch = ( hFbMixer->fb_cfg->active_w_mixing == 0 ); ch < hFbMixer->fb_cfg->num_out_chans; ch++ ) + { + /* Run a loop of 2 to calculate current frame's filterbank output and prev frame's output */ + for ( hist = 0; hist < 2; hist++ ) + { + set_zero( pOut_fr_re, frame_len ); + set_zero( pOut_fr_im, frame_len ); + + for ( j = 0; j < hFbMixer->fb_cfg->num_in_chans; j++ ) + { + if ( in_out_mixer_map[ch][j] != 0 ) + { + float filterbank_mixer_bins_re[L_FRAME48k]; + float filterbank_mixer_bins_im[L_FRAME48k]; + float *pFb_inFR_re = hFbMixer->ppFilterbank_inFR_re[j]; + float *pFb_inFR_im = hFbMixer->ppFilterbank_inFR_im[j]; + + set_zero( filterbank_mixer_bins_re, frame_len ); + set_zero( filterbank_mixer_bins_im, frame_len ); + + for ( i = 0; i < num_bands; i++ ) + { + int16_t start_offset = pFb->fb_consts.pFilterbank_bins_start_offset[i]; + int16_t num_bins = pFb->fb_consts.pFilterbank_bins_per_band[i]; + + float mixer_const = hFbMixer->prior_mixer[ch][j][i]; + + pFilterbank_bin_to_band_re = pFb->fb_consts.ppFilterbank_FRs[0][i]; + pFilterbank_bin_to_band_im = pFb->fb_consts.ppFilterbank_FRs[1][i]; + + for ( k = start_offset; k < num_bins + start_offset; k++ ) + { + filterbank_mixer_bins_re[k] += *pFilterbank_bin_to_band_re++ * mixer_const; + filterbank_mixer_bins_im[k] += *pFilterbank_bin_to_band_im++ * mixer_const; + } + hFbMixer->prior_mixer[ch][j][i] = mixer_mat[ch][j][i]; + } + + for ( k = 0; k < frame_len; k++ ) + { + float temp_out_re, temp_out_im; + + IVAS_CMULT_FLOAT( filterbank_mixer_bins_re[k], filterbank_mixer_bins_im[k], pFb_inFR_re[k], + pFb_inFR_im[k], temp_out_re, temp_out_im ); + + pOut_fr_re[k] += temp_out_re; + pOut_fr_im[k] += temp_out_im; + } + } + } + + ivas_imdft( pOut_fr_re, pOut_fr_im, pMdft_out[hist], frame_len ); + } + + ivas_fb_mixer_cross_fading( hFbMixer, ppOut_pcm, pMdft_out[0], pMdft_out[1], ch, frame_len, frame_len ); + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_fb_mixer_get_in_out_mapping() + * + * + *-----------------------------------------------------------------------------------------*/ + +void ivas_fb_mixer_get_in_out_mapping( + const IVAS_FB_CFG *fb_cfg, /* i : FB config. handle */ + int16_t in_out_mixer_map[IVAS_MAX_FB_MIXER_OUT_CH][IVAS_MAX_SPAR_FB_MIXER_IN_CH] /* i/o: mixing mapping */ +) +{ + int16_t i, j; + + set_s( (int16_t *) in_out_mixer_map, 0, IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_SPAR_FB_MIXER_IN_CH ); + + if ( fb_cfg->active_w_mixing ) + { + for ( i = 0; i < fb_cfg->num_out_chans; i++ ) + { + for ( j = 0; j < fb_cfg->num_in_chans; j++ ) + { + in_out_mixer_map[i][j] = 1; + } + } + } + else + { + in_out_mixer_map[0][0] = 1; /* W depends on only W input*/ + for ( i = 1; i < fb_cfg->num_out_chans; i++ ) + { + in_out_mixer_map[i][0] = 1; + } + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_calculate_abs_fr() + * + * Function to calculate number of active bands + *-----------------------------------------------------------------------------------------*/ + +static int16_t ivas_calculate_abs_fr( + ivas_filterbank_t *pFb, + const int32_t sampling_rate, + const int16_t alloc_fb_resp ) +{ + int16_t frame_len; + float ppFilterbank_FRs_s[L_FRAME48k]; + int16_t bands = pFb->filterbank_num_bands; + int16_t i, j, num_active_bands = 0; + int16_t idx_short_stride_bin_to_band = 0; + + for ( i = 0; i < bands; i++ ) + { + const float *long_mdft_ptr_re = pFb->fb_consts.ppFilterbank_FRs[0][i]; + const float *long_mdft_ptr_im = pFb->fb_consts.ppFilterbank_FRs[1][i]; + int16_t start_offset = pFb->fb_consts.pFilterbank_bins_start_offset[i]; + int16_t num_bins = pFb->fb_consts.pFilterbank_bins_per_band[i]; + int16_t short_mdft_start_bin = -1; + float short_stride_pow_spec[MDFT_FB_BANDS_240]; + float short_stride_nrg = 0.0f; + float cldfb_nrg = 0.0f; + int16_t short_stride = pFb->fb_bin_to_band.short_stride; + const int16_t num_bins_per_short_stride_bin = ( const int16_t )( ( sampling_rate / FRAMES_PER_SEC ) / short_stride ); + const int16_t num_bins_per_cldfb_band = ( const int16_t )( ( sampling_rate / FRAMES_PER_SEC ) / pFb->fb_bin_to_band.num_cldfb_bands ); + float short_stride_max_per_spar_band = 1e-9f; + + /*loop over all stored Filter Bank Response MDFT coefficients*/ + set_f( short_stride_pow_spec, 0, MDFT_FB_BANDS_240 ); + for ( j = start_offset; j < num_bins + start_offset; j++ ) + { + float sq_abs; + + /*calculate bin energy */ + IVAS_CALCULATE_SQ_ABS( *long_mdft_ptr_re, *long_mdft_ptr_im, sq_abs ); + long_mdft_ptr_re++; + long_mdft_ptr_im++; + + /* accumulate bin energies within a short stride bin */ + short_stride_nrg += sq_abs; + if ( !( ( j + 1 ) % num_bins_per_short_stride_bin ) ) + { /* new short stride bin */ + short_stride_pow_spec[j / num_bins_per_short_stride_bin] = short_stride_nrg; /* energy rather than magnitude works better for covariance weighting*/ + short_stride_max_per_spar_band = max( short_stride_nrg, short_stride_max_per_spar_band ); /*compute highest magnitude per band*/ + short_stride_nrg = 0.0f; + } + + /* accumulate bin energies within a CLDFB band */ + cldfb_nrg += sq_abs; + if ( !( ( j + 1 ) % num_bins_per_cldfb_band ) ) + { + pFb->fb_bin_to_band.pp_cldfb_weights_per_spar_band[j / num_bins_per_cldfb_band][i] = sqrtf( cldfb_nrg ); + cldfb_nrg = 0.0f; + } + } + + /*loop over the short MDFT bins*/ + for ( j = 0; j < short_stride; j++ ) + { + /* normalize and sparsify the energies */ + short_stride_pow_spec[j] /= short_stride_max_per_spar_band; + short_stride_pow_spec[j] = max( short_stride_pow_spec[j] - 0.3f, 0.0f ) / 0.7f; + if ( short_stride_pow_spec[j] > 0.0f ) + { + assert( idx_short_stride_bin_to_band < 2 * MDFT_FB_BANDS_240 ); /* array size of p_short_stride_bin_to_band */ + if ( short_mdft_start_bin == -1 ) + { + short_mdft_start_bin = j; + pFb->fb_bin_to_band.p_short_stride_start_bin_per_band[i] = j; + pFb->fb_bin_to_band.pp_short_stride_bin_to_band[i] = &pFb->fb_bin_to_band.p_short_stride_bin_to_band[idx_short_stride_bin_to_band]; + } + pFb->fb_bin_to_band.p_short_stride_bin_to_band[idx_short_stride_bin_to_band++] = short_stride_pow_spec[j]; + pFb->fb_bin_to_band.p_short_stride_num_bins_per_band[i]++; + } + } + } + + /*loop over CLDFB bands*/ + for ( j = 0; j < pFb->fb_bin_to_band.num_cldfb_bands; j++ ) + { + float sum_over_spar_bands = 0.0f; + float max_spar_band_contribution = 0.0f; + int16_t spar_start = 0; + int16_t any_non_zero = 0; + + for ( i = 0; i < bands; i++ ) + { + sum_over_spar_bands += pFb->fb_bin_to_band.pp_cldfb_weights_per_spar_band[j][i]; + if ( pFb->fb_bin_to_band.pp_cldfb_weights_per_spar_band[j][i] > max_spar_band_contribution ) + { + max_spar_band_contribution = pFb->fb_bin_to_band.pp_cldfb_weights_per_spar_band[j][i]; + pFb->fb_bin_to_band.p_cldfb_map_to_spar_band[j] = i; + } + } + sum_over_spar_bands = max( sum_over_spar_bands, EPSILON ); + for ( i = 0; i < bands; i++ ) + { + if ( pFb->fb_bin_to_band.pp_cldfb_weights_per_spar_band[j][i] == 0.0f && !any_non_zero ) + { + spar_start++; + } + else + { + any_non_zero = 1; + } + pFb->fb_bin_to_band.pp_cldfb_weights_per_spar_band[j][i] /= sum_over_spar_bands; + } + pFb->fb_bin_to_band.p_spar_start_bands[j] = spar_start; + } + + frame_len = (int16_t) ( sampling_rate / FRAMES_PER_SEC ); + + set_f( ppFilterbank_FRs_s, 0, frame_len ); + + /*Commented logic is for calculating number of active bands, can be removed if not needed */ + for ( i = 0; i < bands; i++ ) + { + const float *pFilterbank_bin_to_band_re = pFb->fb_consts.ppFilterbank_FRs[0][i]; + const float *pFilterbank_bin_to_band_im = pFb->fb_consts.ppFilterbank_FRs[1][i]; + + int16_t start_offset = pFb->fb_consts.pFilterbank_bins_start_offset[i]; + int16_t num_bins = pFb->fb_consts.pFilterbank_bins_per_band[i]; + int16_t idx = 0; + int16_t abs_active_bins = pFb->fb_bin_to_band.pFb_active_bins_per_band[i]; + int16_t abs_start_offset = pFb->fb_bin_to_band.pFb_start_bin_per_band[i]; + + for ( j = start_offset; j < num_bins + start_offset; j++ ) + { + float temp = 0; + + IVAS_CALCULATE_ABS( *pFilterbank_bin_to_band_re, *pFilterbank_bin_to_band_im, temp ); + + pFilterbank_bin_to_band_re++; + pFilterbank_bin_to_band_im++; + + temp -= 0.3f; + + if ( temp < 0.0f ) + { + temp = 0; + } + + if ( j < ( abs_active_bins + abs_start_offset ) && j >= abs_start_offset && alloc_fb_resp != -1 ) + { + pFb->fb_bin_to_band.pFb_bin_to_band[i][idx++] = temp; + } + + ppFilterbank_FRs_s[j] += temp; + } + } + + for ( i = 0; i < frame_len; i++ ) + { + if ( ppFilterbank_FRs_s[i] < 0.1f ) + { + ppFilterbank_FRs_s[i] = 0.1f; + } + } + + if ( alloc_fb_resp != -1 ) + { + for ( j = 0; j < bands; j++ ) + { + int16_t abs_active_bins = pFb->fb_bin_to_band.pFb_active_bins_per_band[j]; + int16_t abs_start_offset = pFb->fb_bin_to_band.pFb_start_bin_per_band[j]; + + for ( i = 0; i < abs_active_bins; i++ ) + { + pFb->fb_bin_to_band.pFb_bin_to_band[j][i] /= ppFilterbank_FRs_s[i + abs_start_offset]; + /*if(pFb->fb_bin_to_band.pFb_bin_to_band[j][i] > 0.5f) + { + num_active_bands = j + 1; + break; + }*/ + } + } + } + + return num_active_bands; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_get_active_bins() + * + * + *-----------------------------------------------------------------------------------------*/ + +static void ivas_get_active_bins( + const int16_t **pActive_bins, + const int16_t **pActive_bins_abs, + const int16_t **pStart_offset, + const int16_t **pStart_offset_abs, + const int32_t sampling_rate ) +{ + int16_t sr_idx; + + if ( sampling_rate == 32000 ) + { + sr_idx = 1; + } + else if ( sampling_rate == 16000 ) + { + sr_idx = 2; + } + else + { + sr_idx = 0; + } + + *pActive_bins_abs = ivas_fb_abs_bins_per_band_12band_1ms[sr_idx]; + *pActive_bins = ivas_fb_bins_per_band_12band_1ms[sr_idx]; + *pStart_offset_abs = ivas_fb_abs_bins_start_offset_12band_1ms[sr_idx]; + *pStart_offset = ivas_fb_bins_start_offset_12band_1ms[sr_idx]; + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_filterbank_setup() + * + * Filterbank setup, initialization + *-----------------------------------------------------------------------------------------*/ + +static ivas_error ivas_filterbank_setup( + IVAS_FB_MIXER_HANDLE hFbMixer, + const int32_t sampling_rate ) +{ + int16_t i, j; + const float *pAll_fb_fr[2]; + const int16_t *pAll_bins_start_offset = NULL; + const int16_t *pAll_bins_per_band = NULL; + const int16_t *pAll_bins_start_offset_abs = NULL; + const int16_t *pAll_bins_per_band_abs = NULL; + const int16_t *pAll_bins_per_band_48k = NULL; + ivas_error error; + IVAS_FB_CFG *pCfg = hFbMixer->fb_cfg; + + error = IVAS_ERR_OK; + + if ( pCfg->num_out_chans > 0 ) + { + hFbMixer->pFb->filterbank_num_bands = ivas_get_num_bands( sampling_rate ); + + ivas_get_active_bins( &pAll_bins_per_band, &pAll_bins_per_band_abs, &pAll_bins_start_offset, &pAll_bins_start_offset_abs, sampling_rate ); + + if ( pCfg->fb_latency == NS2SA( sampling_rate, DELAY_FB_1_NS ) ) + { + pAll_fb_fr[0] = ivas_fb_fr_12band_1ms_re; + pAll_fb_fr[1] = ivas_fb_fr_12band_1ms_im; + pAll_bins_per_band_48k = ivas_fb_bins_per_band_12band_1ms[0]; + } + else + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Wrong FB in ivas_filterbank_setup()!" ); + } + } + + hFbMixer->cross_fade_end_offset = pCfg->fade_len + pCfg->pcm_offset; + hFbMixer->cross_fade_start_offset = hFbMixer->cross_fade_end_offset - pCfg->fade_len; + hFbMixer->ana_window_offset = pCfg->fb_latency + pCfg->pcm_offset; + + if ( ( error = ivas_fb_mixer_get_window( pCfg->fb_latency, sampling_rate, &( hFbMixer->pAna_window ) ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = ivas_fb_mixer_get_window( pCfg->fade_len, sampling_rate, &( hFbMixer->pFilterbank_cross_fade ) ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( pCfg->num_out_chans > 0 ) + { + ivas_filterbank_t *pFb = hFbMixer->pFb; + int16_t offset = 0; + + pFb->fb_consts.pFilterbank_bins_per_band = pAll_bins_per_band; + pFb->fb_consts.pFilterbank_bins_start_offset = pAll_bins_start_offset; + pFb->fb_bin_to_band.pFb_active_bins_per_band = pAll_bins_per_band_abs; + pFb->fb_bin_to_band.pFb_start_bin_per_band = pAll_bins_start_offset_abs; + + /* Initialization for short stride Parameter calculation and SPAR CLDFB reconstruction */ + pFb->fb_bin_to_band.num_cldfb_bands = (int16_t) ( sampling_rate * INV_CLDFB_BANDWIDTH + 0.5f ); + /*pFb->fb_bin_to_band.cldfb_stride = ( int16_t )( ( sampling_rate / FRAMES_PER_SEC ) / CLDFB_NO_COL_MAX );*/ /* equals num_cldfb_bands*/ + pFb->fb_bin_to_band.short_stride = (int16_t) ( ( sampling_rate / FRAMES_PER_SEC ) / 4 ); + set_f( pFb->fb_bin_to_band.p_short_stride_bin_to_band, 0.0f, 2 * MDFT_FB_BANDS_240 ); + set_s( pFb->fb_bin_to_band.p_cldfb_map_to_spar_band, 0, CLDFB_NO_CHANNELS_MAX ); + set_s( pFb->fb_bin_to_band.p_spar_start_bands, 0, CLDFB_NO_CHANNELS_MAX ); + + for ( j = 0; j < IVAS_MAX_NUM_FB_BANDS; j++ ) + { + pFb->fb_bin_to_band.p_short_stride_num_bins_per_band[j] = 0; /* aka num_active_bins per SPAR band */ + pFb->fb_bin_to_band.p_short_stride_start_bin_per_band[j] = 0; /* first considered bin index per SPAR band */ + pFb->fb_bin_to_band.pp_short_stride_bin_to_band[j] = NULL; + for ( i = 0; i < CLDFB_NO_CHANNELS_MAX; i++ ) + { + pFb->fb_bin_to_band.pp_cldfb_weights_per_spar_band[i][j] = 0.0f; + } + } + if ( sampling_rate == 48000 ) + { + for ( j = 0; j < pFb->filterbank_num_bands; j++ ) + { + pFb->fb_consts.ppFilterbank_FRs[0][j] = &pAll_fb_fr[0][offset]; + pFb->fb_consts.ppFilterbank_FRs[1][j] = &pAll_fb_fr[1][offset]; + offset += pFb->fb_consts.pFilterbank_bins_per_band[j]; + } + + ivas_calculate_abs_fr( pFb, sampling_rate, pCfg->active_w_mixing ); + } + else + { + float *ppFilterbank_FRs_re_temp[MAX_NUM_BANDS_DIFF_NON48K]; + float *ppFilterbank_FRs_im_temp[MAX_NUM_BANDS_DIFF_NON48K]; + int16_t active_bins_temp[MAX_NUM_BANDS_DIFF_NON48K]; + int16_t start_offset_temp[MAX_NUM_BANDS_DIFF_NON48K]; + int16_t num_diff_bands, start_diff_band_non48k; + + num_diff_bands = MAX_NUM_BANDS_DIFF_NON48K; + start_diff_band_non48k = pFb->filterbank_num_bands - num_diff_bands; + + pFb->fb_consts.pFilterbank_bins_per_band = pAll_bins_per_band; + pFb->fb_consts.pFilterbank_bins_start_offset = pAll_bins_start_offset; + + for ( j = 0; j < pFb->filterbank_num_bands; j++ ) + { + int16_t num_active_bins = pFb->fb_consts.pFilterbank_bins_per_band[j]; + + if ( j < start_diff_band_non48k ) + { + pFb->fb_consts.ppFilterbank_FRs[0][j] = &pAll_fb_fr[0][offset]; + pFb->fb_consts.ppFilterbank_FRs[1][j] = &pAll_fb_fr[1][offset]; + } + else + { + mvr2r( &pAll_fb_fr[0][offset], pFb->fb_consts.ppFilterbank_FRs_non48k[0][j], num_active_bins ); + mvr2r( &pAll_fb_fr[1][offset], pFb->fb_consts.ppFilterbank_FRs_non48k[1][j], num_active_bins ); + } + + offset += pAll_bins_per_band_48k[j]; + } + + for ( j = start_diff_band_non48k; j < pFb->filterbank_num_bands; j++ ) + { + ppFilterbank_FRs_re_temp[j - start_diff_band_non48k] = pFb->fb_consts.ppFilterbank_FRs_non48k[0][j]; + ppFilterbank_FRs_im_temp[j - start_diff_band_non48k] = pFb->fb_consts.ppFilterbank_FRs_non48k[1][j]; + active_bins_temp[j - start_diff_band_non48k] = pFb->fb_consts.pFilterbank_bins_per_band[j]; + start_offset_temp[j - start_diff_band_non48k] = pFb->fb_consts.pFilterbank_bins_start_offset[j]; + } + + ivas_get_ld_fb_resp( ppFilterbank_FRs_re_temp, ppFilterbank_FRs_im_temp, ppFilterbank_FRs_re_temp, ppFilterbank_FRs_im_temp, + active_bins_temp, start_offset_temp, num_diff_bands, pCfg->fb_latency, sampling_rate ); + + for ( j = start_diff_band_non48k; j < pFb->filterbank_num_bands; j++ ) + { + pFb->fb_consts.ppFilterbank_FRs[0][j] = (const float *) pFb->fb_consts.ppFilterbank_FRs_non48k[0][j]; + pFb->fb_consts.ppFilterbank_FRs[1][j] = (const float *) pFb->fb_consts.ppFilterbank_FRs_non48k[1][j]; + } + + ivas_calculate_abs_fr( pFb, sampling_rate, pCfg->active_w_mixing ); + } + } + + return error; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_fb_mixer_get_window() + * + * + *-----------------------------------------------------------------------------------------*/ + +static ivas_error ivas_fb_mixer_get_window( + const int16_t fade_len, /* i : window fading length in samples */ + const int32_t sampling_rate, /* i : sampling rate */ + const float **pWindow /* o : pointer to the window coefficents */ +) +{ + ivas_error error; + + error = IVAS_ERR_OK; + + if ( fade_len == NS2SA( sampling_rate, DELAY_FB_4_NS ) ) + { + switch ( sampling_rate ) + { + case 48000: + *pWindow = ivas_fb_cf_4ms_48k; + break; + case 32000: + *pWindow = ivas_fb_cf_4ms_32k; + break; + case 16000: + *pWindow = ivas_fb_cf_4ms_16k; + break; + default: + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Unsupported Sampling frequency!" ); + } + } + else if ( fade_len == NS2SA( sampling_rate, DELAY_FB_1_NS ) ) + { + switch ( sampling_rate ) + { + case 48000: + *pWindow = ivas_fb_cf_1ms_48k; + break; + case 32000: + *pWindow = ivas_fb_cf_1ms_32k; + break; + case 16000: + *pWindow = ivas_fb_cf_1ms_16k; + break; + default: + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Unsupported Sampling frequency!" ); + } + } + else + { + IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error: Incorrect FB window fade len (%f ms)\n", ( fade_len / 1000000.f ) ); + } + + return error; +} + + +static const float *ivas_get_cheby_ramp( + const int16_t delay ) +{ + const float *pCheby = NULL; + + switch ( delay ) + { + case IVAS_FB_1MS_32K_SAMP: + pCheby = ivas_fb_resp_cheby_ramp_32del; + break; + case IVAS_FB_1MS_16K_SAMP: + pCheby = ivas_fb_resp_cheby_ramp_16del; + break; + default: + assert( !"Unsupported cheby ramp length!" ); + } + + return pCheby; +} + + +/*get first half of the hanning window*/ +static void ivas_get_hanning_win( + const int16_t len, + float *pH_win ) +{ + int16_t i; + + for ( i = 0; i < len; i++ ) + { + pH_win[i] = 0.5f * ( 1.0f - cosf( ( PI2 * ( i + 1 ) ) / ( ( 2 * len ) + 1 ) ) ); + } + + return; +} + + +static void ivas_get_ld_fb_resp( + float **ppIdeal_FRs_re, + float **ppIdeal_FRs_im, + float **ppNew_FRs_re, + float **ppNew_FRs_im, + const int16_t *pActive_bins, + const int16_t *pStart_offset, + const int16_t num_bands, + const int16_t delay, + const int32_t sampling_rate ) +{ + int16_t b, s, frame_len; + const float *pCheby; + + /*common scratch buffers for computing impulse/frequency responses, + pre-ring, post-ring and circular shifted outputs to optimize stack*/ + float scratch1[L_FRAME32k * 2]; + float scratch2[L_FRAME32k * 2]; + float han_win[L_FRAME32k]; + + frame_len = (int16_t) ( sampling_rate / FRAMES_PER_SEC ); + pCheby = ivas_get_cheby_ramp( delay ); + b = 0; + s = 0; + + assert( sampling_rate == 32000 || sampling_rate == 16000 ); + + ivas_get_hanning_win( frame_len, han_win ); + for ( b = 0; b < num_bands; b++ ) + { + set_f( scratch2, 0, frame_len << 1 ); + mvr2r( ppIdeal_FRs_re[b], &scratch2[pStart_offset[b]], pActive_bins[b] ); + mvr2r( ppIdeal_FRs_im[b], &scratch2[frame_len + pStart_offset[b]], pActive_bins[b] ); + ivas_imdft( scratch2, &scratch2[frame_len], scratch1, frame_len ); + + /*apply circular shift and hanning window*/ + + for ( s = delay; s < frame_len + delay; s++ ) + { + scratch2[s - delay] = scratch1[s] * ( 1 - han_win[s - delay] ); + } + + for ( ; s < 2 * frame_len; s++ ) + { + scratch2[s - delay] = scratch1[s] * han_win[s - ( frame_len + delay )]; + } + + for ( s = 0; s < delay; s++ ) + { + scratch2[2 * frame_len - delay + s] = -1 * scratch1[s] * han_win[frame_len - delay + s]; + } + + /*apply heavy/cheby ramp window and compute pre ring*/ + + for ( s = 0; s < delay + 1; s++ ) + { + scratch1[s] = scratch2[s] * pCheby[delay - s]; + } + + for ( ; s < frame_len; s++ ) + { + scratch1[s] = 0; + } + + for ( ; s < 2 * frame_len - delay; s++ ) + { + scratch1[s] = scratch2[s]; + } + + for ( ; s < 2 * frame_len; s++ ) + { + scratch1[s] = scratch2[s] * ( 1 - pCheby[s - ( 2 * frame_len - delay )] ); + } + + /*IR - pre ring + post ring*/ + for ( s = 1; s < 2 * frame_len; s++ ) + { + scratch2[s] = scratch2[s] /*pre ring*/ - scratch1[s] /*post ring*/ - scratch1[( 2 * frame_len ) - s]; + } + + for ( s = 0; s < 2 * frame_len - delay; s++ ) + { + scratch1[s + delay] = scratch2[s]; + } + + for ( ; s < 2 * frame_len; s++ ) + { + scratch1[s - ( 2 * frame_len - delay )] = -1 * ( scratch2[s] ); + } + + /* apply final window*/ + for ( s = 0; s < delay; s++ ) + { + scratch1[s] = scratch1[s] * sinf( ( EVS_PI * ( s + 1 ) ) / ( 2 * delay ) ); + } + + for ( s = 2 * delay; s < frame_len + 1; s++ ) + { + scratch1[s] = scratch1[s] * sinf( ( EVS_PI * ( frame_len - s ) ) / ( 2 * ( frame_len + 1 - ( 2 * delay ) ) ) ); + } + + for ( ; s < 2 * frame_len; s++ ) + { + scratch1[s] = 0; + } + + /*compute frequency response*/ + ivas_mdft( scratch1, scratch2, &scratch2[frame_len], frame_len << 1, frame_len ); + + mvr2r( &scratch2[pStart_offset[b]], ppNew_FRs_re[b], pActive_bins[b] ); + mvr2r( &scratch2[frame_len + pStart_offset[b]], ppNew_FRs_im[b], pActive_bins[b] ); + } + + return; +} diff --git a/lib_com/ivas_filters.c b/lib_com/ivas_filters.c new file mode 100644 index 0000000000000000000000000000000000000000..8344fe33f71ee1eff5a0ae036f7bfc77423a2abf --- /dev/null +++ b/lib_com/ivas_filters.c @@ -0,0 +1,163 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "ivas_prot.h" +#include "ivas_cnst.h" +#include "ivas_stat_com.h" +#include "wmc_auto.h" + + +/*------------------------------------------------------------------------------------------* + * Local functions declaration + *------------------------------------------------------------------------------------------*/ + +static void ivas_iir_2_filter( ivas_filters_process_state_t *filter_state, float *pIn_Out, const int16_t length, const int16_t stage ); + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_filters_init() + * + * Initialisation call for filtering a signal + *-----------------------------------------------------------------------------------------*/ + +void ivas_filters_init( + ivas_filters_process_state_t *filter_state, /* i/o: filter state handle */ + const float *filt_coeff, /* i : filter coefficients */ + const int16_t order ) /* i : filter order */ +{ + int16_t i; + filter_state->order = order; + + if ( order == IVAS_FILTER_ORDER_2 || order == IVAS_FILTER_ORDER_1 ) + { + filter_state->filt_len = order + 1; + + for ( i = 0; i < IVAS_BIQUAD_FILT_LEN; i++ ) + { + filter_state->num[IVAS_FILTER_STAGE_0][i] = filt_coeff[i]; + filter_state->den[IVAS_FILTER_STAGE_0][i] = filt_coeff[i + IVAS_BIQUAD_FILT_LEN]; + } + + filter_state->state[0][0] = 0.0f; + filter_state->state[0][1] = 0.0f; + filter_state->state[0][2] = 0.0f; + } + else + { + filter_state->filt_len = IVAS_BIQUAD_FILT_LEN; + + for ( i = 0; i < IVAS_BIQUAD_FILT_LEN; i++ ) + { + filter_state->num[IVAS_FILTER_STAGE_0][i] = filt_coeff[i]; + filter_state->den[IVAS_FILTER_STAGE_0][i] = filt_coeff[i + IVAS_BIQUAD_FILT_LEN]; + filter_state->num[IVAS_FILTER_STAGE_1][i] = filt_coeff[i + IVAS_BIQUAD_FILT_LEN * 2]; + filter_state->den[IVAS_FILTER_STAGE_1][i] = filt_coeff[i + IVAS_BIQUAD_FILT_LEN * 3]; + } + + filter_state->state[0][0] = 0.0f; + filter_state->state[0][1] = 0.0f; + filter_state->state[0][2] = 0.0f; + filter_state->state[1][0] = 0.0f; + filter_state->state[1][1] = 0.0f; + filter_state->state[1][2] = 0.0f; + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_filter_process() + * + * Process call for selecting the type filter + *-----------------------------------------------------------------------------------------*/ + +void ivas_filter_process( + ivas_filters_process_state_t *filter_state, /* i/o: filter state handle */ + float *pIn_Out, /* i/o: signal subject to filtering */ + const int16_t length /* i : filter order */ +) +{ + + switch ( filter_state->order ) + { + case IVAS_FILTER_ORDER_1: + case IVAS_FILTER_ORDER_2: + ivas_iir_2_filter( filter_state, pIn_Out, length, IVAS_FILTER_STAGE_0 ); + break; + case IVAS_FILTER_ORDER_4: + /* biquad-1 */ + ivas_iir_2_filter( filter_state, pIn_Out, length, IVAS_FILTER_STAGE_0 ); + /* biquad-2 */ + ivas_iir_2_filter( filter_state, pIn_Out, length, IVAS_FILTER_STAGE_1 ); + break; + default: + break; + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_iir_2_filter() + * + * Process call for filtering a signal + *-----------------------------------------------------------------------------------------*/ + +static void ivas_iir_2_filter( + ivas_filters_process_state_t *filter_state, + float *pIn_Out, + const int16_t length, + const int16_t stage ) +{ + int16_t i, j; + float *pIn = pIn_Out; + float *pOut = pIn_Out; + float tmp_pIn_buf_i; + + for ( i = 0; i < length; i++ ) + { + tmp_pIn_buf_i = pIn[i]; + pOut[i] = filter_state->state[stage][0] + pIn[i] * filter_state->num[stage][0]; + + for ( j = 1; j < filter_state->filt_len; j++ ) + { + filter_state->state[stage][j - 1] = filter_state->state[stage][j] + filter_state->num[stage][j] * tmp_pIn_buf_i - + filter_state->den[stage][j] * pOut[i]; + } + } + + return; +} diff --git a/lib_com/ivas_ism_com.c b/lib_com/ivas_ism_com.c new file mode 100644 index 0000000000000000000000000000000000000000..b8e919ad52b124285f299e0270fe980f431a3f8e --- /dev/null +++ b/lib_com/ivas_ism_com.c @@ -0,0 +1,667 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "cnst.h" +#include "ivas_cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_stat_com.h" +#include "ivas_rom_com.h" +#include "wmc_auto.h" + + +/*-----------------------------------------------------------------------* + * Local constants + *-----------------------------------------------------------------------*/ + +#define BITS_ISM_INACTIVE ( BRATE_ISM_INACTIVE / FRAMES_PER_SEC ) + +#define BETA_ISM_LOW_IMP 0.6f +#define BETA_ISM_MEDIUM_IMP 0.8f + +#define MAX_BRATE_TCX_32k 48000 + + +/*-------------------------------------------------------------------* + * bitbudget_to_brate() + * + * Convert bit-budget to bitrate + *-------------------------------------------------------------------*/ + +void bitbudget_to_brate( + const int16_t x[], /* i : bitbudgets */ + int32_t y[], /* o : bitrates */ + const int16_t N /* i : number of entries to be converted */ +) +{ + int16_t i; + + for ( i = 0; i < N; i++ ) + { + y[i] = FRAMES_PER_SEC * x[i]; + } + + return; +} + + +/*-------------------------------------------------------------------* + * ivas_ism_config() + * + * Configure audio objects coding + *-------------------------------------------------------------------*/ + +ivas_error ivas_ism_config( + const int32_t ism_total_brate, /* i : ISM total bitrate */ + const int16_t nchan_transport, /* i : number of transport channels */ + const int16_t nchan_ism, /* i : number of objects */ + ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ + const int16_t ism_extended_metadata_flag, /* i : extended metadata flag */ + const int16_t null_metadata_flag[MAX_NUM_OBJECTS], /* i : NULL MD flag */ + const int16_t ism_imp[], /* i : ISM importance flags */ + int32_t element_brate[], /* o : element bitrate per object */ + int32_t total_brate[], /* o : total bitrate per object */ + int16_t nb_bits_metadata[], /* i/o: number of metadata bits */ + const int16_t combined_format_flag /* i : flag indicating combined format */ +) +{ + int16_t ch; + int16_t bits_element[MAX_NUM_OBJECTS], bits_CoreCoder[MAX_NUM_OBJECTS]; + int16_t bits_ism, bits_side; + int16_t limit_high = 0; /* just to avoid compilation warning */ + int16_t tmp; + int16_t ism_metadata_flag_global; + int16_t n_ISms; + ivas_error error; + + error = IVAS_ERR_OK; + if ( combined_format_flag ) + { + n_ISms = nchan_ism; + } + else + { + n_ISms = nchan_transport; + } + + /* initialization */ + ism_metadata_flag_global = 0; + bits_side = 0; + if ( hIsmMeta != NULL ) + { + for ( ch = 0; ch < n_ISms; ch++ ) + { + ism_metadata_flag_global |= ism_imp[ch]; + } + } + + /* decision about bitrates per channel */ + if ( combined_format_flag ) + { + /* combined format: decision about bitrates per channel - variable during the session (at one ivas_total_brate) */ + bits_ism = (int16_t) ( ism_total_brate / FRAMES_PER_SEC ); + set_s( bits_element, bits_ism / n_ISms, n_ISms ); + bits_element[n_ISms - 1] += bits_ism % n_ISms; + + /* ISM common signaling bits are counted in MASA MD bit-budget */ + } + else + { + /* ISM format: decision about bitrates per channel - constant during the session (at one ivas_total_brate) */ + bits_ism = (int16_t) ( ism_total_brate / FRAMES_PER_SEC ); + set_s( bits_element, bits_ism / n_ISms, n_ISms ); + bits_element[n_ISms - 1] += bits_ism % n_ISms; + bitbudget_to_brate( bits_element, element_brate, n_ISms ); + + /* count ISm common signaling bits */ + if ( hIsmMeta != NULL ) + { + nb_bits_metadata[0] += n_ISms * ISM_METADATA_FLAG_BITS + nchan_ism; + + if ( ism_total_brate >= ISM_EXTENDED_METADATA_BRATE ) + { + nb_bits_metadata[0] += ISM_EXTENDED_METADATA_BITS; + + if ( ism_extended_metadata_flag ) + { + nb_bits_metadata[0] += ISM_METADATA_IS_NDP_BITS; + } + } + + for ( ch = 0; ch < n_ISms; ch++ ) + { + if ( null_metadata_flag[ch] ) + { + nb_bits_metadata[0] += ISM_METADATA_MD_FLAG_BITS; + nb_bits_metadata[0] += ISM_METADATA_FLAG_BITS; + } + else + { + if ( ism_imp[ch] == ISM_NO_META ) + { + nb_bits_metadata[0] += ISM_METADATA_MD_FLAG_BITS; + nb_bits_metadata[0] += ISM_METADATA_INACTIVE_FLAG_BITS; + } + } + } + } + } + + /* split metadata bitbudget equally between channels */ + if ( nb_bits_metadata != NULL ) + { + bits_side = sum_s( nb_bits_metadata, n_ISms ); + set_s( nb_bits_metadata, bits_side / n_ISms, n_ISms ); + nb_bits_metadata[n_ISms - 1] += bits_side % n_ISms; + v_sub_s( bits_element, nb_bits_metadata, bits_CoreCoder, n_ISms ); + bitbudget_to_brate( bits_CoreCoder, total_brate, n_ISms ); + + mvs2s( nb_bits_metadata, nb_bits_metadata, n_ISms ); + } + + /* assign less CoreCoder bit-budget to inactive streams (at least one stream must be active) */ + if ( ism_metadata_flag_global ) + { + int16_t diff, n_higher, flag_higher[MAX_NUM_OBJECTS]; + + set_s( flag_higher, 1, MAX_NUM_OBJECTS ); + + diff = 0; + for ( ch = 0; ch < n_ISms; ch++ ) + { + if ( ism_imp[ch] == ISM_NO_META ) + { + diff += bits_CoreCoder[ch] - BITS_ISM_INACTIVE; + bits_CoreCoder[ch] = BITS_ISM_INACTIVE; + flag_higher[ch] = 0; + } + } + + n_higher = sum_s( flag_higher, n_ISms ); + + if ( diff > 0 && n_higher > 0 ) + { + tmp = diff / n_higher; + for ( ch = 0; ch < n_ISms; ch++ ) + { + if ( flag_higher[ch] ) + { + bits_CoreCoder[ch] += tmp; + } + } + + tmp = diff % n_higher; + ch = 0; + while ( flag_higher[ch] == 0 ) + { + ch++; + } + bits_CoreCoder[ch] += tmp; + } + + bitbudget_to_brate( bits_CoreCoder, total_brate, n_ISms ); + + diff = 0; + for ( ch = 0; ch < n_ISms; ch++ ) + { + int16_t limit; + + limit = MIN_BRATE_SWB_BWE / FRAMES_PER_SEC; + if ( element_brate[ch] < MIN_BRATE_SWB_STEREO ) /* replicate function set_bw() -> check the coded audio band-width */ + { + limit = MIN_BRATE_WB_BWE / FRAMES_PER_SEC; + } + else if ( element_brate[ch] >= SCE_CORE_16k_LOW_LIMIT ) /* replicate function set_ACELP_flag() -> it is not intended to switch the ACELP internal sampling rate within an object */ + { + /*limit = SCE_CORE_16k_LOW_LIMIT;*/ + limit = ( ACELP_16k_LOW_LIMIT + SWB_TBE_1k6 ) / FRAMES_PER_SEC; + } + + if ( ism_imp[ch] == ISM_NO_META ) + { + tmp = BITS_ISM_INACTIVE; + } + else if ( ism_imp[ch] == ISM_LOW_IMP ) + { + tmp = (int16_t) ( BETA_ISM_LOW_IMP * bits_CoreCoder[ch] ); + tmp = max( limit, tmp ); + } + else if ( ism_imp[ch] == ISM_MEDIUM_IMP ) + { + tmp = (int16_t) ( BETA_ISM_MEDIUM_IMP * bits_CoreCoder[ch] ); + tmp = max( limit, tmp ); + } + else /* ism_imp[ch] == ISM_HIGH_IMP */ + { + tmp = bits_CoreCoder[ch]; + } + + diff += bits_CoreCoder[ch] - tmp; + bits_CoreCoder[ch] = tmp; + } + + if ( diff > 0 && n_higher > 0 ) + { + tmp = diff / n_higher; + for ( ch = 0; ch < n_ISms; ch++ ) + { + if ( flag_higher[ch] ) + { + bits_CoreCoder[ch] += tmp; + } + } + + tmp = diff % n_higher; + ch = 0; + while ( flag_higher[ch] == 0 ) + { + ch++; + } + bits_CoreCoder[ch] += tmp; + } + + /* verify for the maximum bitrate @12.8kHz core */ + diff = 0; + for ( ch = 0; ch < n_ISms; ch++ ) + { + limit_high = IVAS_512k / FRAMES_PER_SEC; + if ( element_brate[ch] < SCE_CORE_16k_LOW_LIMIT ) /* replicate function set_ACELP_flag() -> it is not intended to switch the ACELP internal sampling rate within an object */ + { + limit_high = ACELP_12k8_HIGH_LIMIT / FRAMES_PER_SEC; + } + + tmp = (int16_t) min( bits_CoreCoder[ch], limit_high ); + + diff += bits_CoreCoder[ch] - tmp; + bits_CoreCoder[ch] = tmp; + } + + /* limitation to avoid too high bitrate in one active TCX channel */ + if ( element_brate[0] >= SCE_CORE_16k_LOW_LIMIT && element_brate[0] <= IVAS_32k ) + { + diff = 0; + limit_high = MAX_BRATE_TCX_32k / FRAMES_PER_SEC; + + for ( ch = 0; ch < n_ISms; ch++ ) + { + tmp = (int16_t) min( bits_CoreCoder[ch], limit_high ); + + diff += bits_CoreCoder[ch] - tmp; + bits_CoreCoder[ch] = tmp; + } + } + + if ( diff > 0 ) + { + ch = 0; + for ( ch = 0; ch < n_ISms; ch++ ) + { + if ( flag_higher[ch] == 0 ) + { + if ( diff > limit_high ) + { + diff += bits_CoreCoder[ch] - limit_high; + bits_CoreCoder[ch] = limit_high; + } + else + { + bits_CoreCoder[ch] += diff; + + if ( combined_format_flag ) + { + diff = 0; + } + break; + } + } + } + } + + if ( combined_format_flag ) + { + if ( diff > 0 ) + { + for ( ch = 0; ch < n_ISms; ch++ ) + { + if ( ism_imp[ch] <= ISM_MEDIUM_IMP ) + { + if ( diff > limit_high ) + { + diff += bits_CoreCoder[ch] - limit_high; + bits_CoreCoder[ch] = limit_high; + } + else + { + bits_CoreCoder[ch] += diff; + break; + } + } + } + } + } + + bitbudget_to_brate( bits_CoreCoder, total_brate, n_ISms ); + } + + + return error; +} + + +/*-------------------------------------------------------------------* + * ivas_ism_reset_metadata() + * + * Reset ISM metadata parameters + *-------------------------------------------------------------------*/ + +void ivas_ism_reset_metadata( + ISM_METADATA_HANDLE hIsmMeta /* i/o: ISM metadata handle */ +) +{ + hIsmMeta->azimuth = 0.0f; + hIsmMeta->elevation = 0.0f; + hIsmMeta->yaw = 0.0f; + hIsmMeta->pitch = 0.0f; + hIsmMeta->radius = 1.0f; + hIsmMeta->ism_metadata_flag = 0; + hIsmMeta->non_diegetic_flag = 0; + + return; +} + + +/*-------------------------------------------------------------------* + * ivas_ism_reset_metadata_API() + * + * Reset ISM metadata parameters + *-------------------------------------------------------------------*/ + +void ivas_ism_reset_metadata_API( + ISM_METADATA_HANDLE hIsmMeta /* i/o: ISM metadata handle */ +) +{ + ivas_ism_reset_metadata( hIsmMeta ); + + return; +} + + +/*-------------------------------------------------------------------* + * ism_quant_meta() + * + * three-level uniform scalar quantizer for ISM metadata + *-------------------------------------------------------------------*/ + +/*! r: index of the winning codeword */ +int16_t ism_quant_meta( + const float val, /* i : scalar value to quantize */ + float *valQ, /* o : quantized value */ + const float borders[], /* i : level borders */ + const float q_step, /* i : quantization step */ + const float q_step_border, /* i : quantization step at the border */ + const int16_t cbsize /* i : codebook size */ +) +{ + int16_t idx, idx_start; + float qlow, step; + + if ( val <= borders[1] ) + { + qlow = borders[0]; + idx_start = 0; + step = q_step_border; + } + else if ( val <= borders[2] ) + { + qlow = borders[1]; + idx_start = (int16_t) ( ( borders[1] - borders[0] ) / q_step_border ); + step = q_step; + } + else + { + qlow = borders[2]; + idx_start = (int16_t) ( cbsize - 1 - ( borders[3] - borders[2] ) / q_step_border ); + step = q_step_border; + } + + idx = idx_start + (int16_t) max( 0.f, min( cbsize - 1, ( ( val - qlow ) / step + 0.5f ) ) ); + *valQ = ( idx - idx_start ) * step + qlow; + + return idx; +} + + +/*-------------------------------------------------------------------* + * ism_dequant_meta() + * + * three-level uniform scalar dequantizer for ISM metadata + *-------------------------------------------------------------------*/ + +/*! r: dequantized value */ +float ism_dequant_meta( + const int16_t idx, /* i : quantizer index */ + const float borders[], /* i : level borders */ + const float q_step, /* i : quantization step */ + const float q_step_border, /* i : quantization step at the border */ + const int16_t cbsize /* i : codebook size */ +) +{ + int16_t idx_start; + float qlow, step, valQ; + + if ( idx <= ( borders[1] - borders[0] ) / q_step_border ) + { + qlow = borders[0]; + idx_start = 0; + step = q_step_border; + } + else if ( idx <= cbsize - 1 - ( borders[3] - borders[2] ) / q_step_border ) + { + qlow = borders[1]; + idx_start = (int16_t) ( ( borders[1] - borders[0] ) / q_step_border ); + step = q_step; + } + else + { + qlow = borders[2]; + idx_start = (int16_t) ( cbsize - 1 - ( borders[3] - borders[2] ) / q_step_border ); + step = q_step_border; + } + + valQ = ( idx - idx_start ) * step + qlow; + + return valQ; +} + + +/*--------------------------------------------------------------- + * ivas_param_ism_config() + * + * + * ---------------------------------------------------------------*/ + +void ivas_param_ism_config( + PARAM_ISM_CONFIG_HANDLE hParamIsm, /* i/o: IVAS Param ISM Config Structure */ + const int16_t nchan_obj /* i : number of ISM channels */ +) +{ + int16_t i; + + hParamIsm->nbands = MAX_PARAM_ISM_NBANDS; + + for ( i = 0; i < hParamIsm->nbands; i++ ) + { + hParamIsm->nblocks[i] = MAX_PARAM_ISM_NBLOCKS; + } + + /* for elevation zero compute the max azi quantization indices */ + for ( i = 0; i < nchan_obj; i++ ) + { + hParamIsm->last_az_diff[i] = 0; + hParamIsm->last_az_sgn[i] = 1; + hParamIsm->last_el_diff[i] = 0; + hParamIsm->last_el_sgn[i] = 1; + } + + hParamIsm->last_dmx_gain = 1.0f; + set_f( hParamIsm->last_cardioid_left, 1.0f, MAX_NUM_OBJECTS ); + + return; +} + + +/*--------------------------------------------------------------- + * ivas_ism_mode_select() + * + * selects the ISM mode base on bitrate and number of objects + * ---------------------------------------------------------------*/ + +/*! r : ISM format mode */ +ISM_MODE ivas_ism_mode_select( + const int16_t nchan_inp, /* i : number of input objects */ + const int32_t ivas_total_brate /* i : IVAS total bitrate */ +) +{ + ISM_MODE ism_mode = ISM_MODE_NONE; + + if ( nchan_inp > 2 && ivas_total_brate <= ACELP_32k ) + { + ism_mode = ISM_MODE_PARAM; + } + else + { + ism_mode = ISM_MODE_DISC; + } + + return ism_mode; +} + + +/*--------------------------------------------------------------- + * ivas_ism_metadata_close() + * + * Deallocate ISM metadata handles + * ---------------------------------------------------------------*/ + +void ivas_ism_metadata_close( + ISM_METADATA_HANDLE hIsmMetaData[], /* i/o: object metadata handles */ + const int16_t first_idx /* i : index of first handle to deallocate */ +) +{ + int16_t n; + +#ifdef FIX_852_FIX_HANDLE_DEREF + if ( hIsmMetaData == NULL || *hIsmMetaData == NULL ) +#else + if ( hIsmMetaData == NULL || hIsmMetaData == NULL ) +#endif + { + return; + } + + for ( n = first_idx; n < MAX_NUM_OBJECTS; n++ ) + { + if ( hIsmMetaData[n] != NULL ) + { + free( hIsmMetaData[n] ); + hIsmMetaData[n] = NULL; + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * update_last_metadata() + * + * Store last metadata values + *-------------------------------------------------------------------*/ + +void update_last_metadata( + const int16_t nchan_ism, /* i : number of objects */ + ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ + const int16_t updt_flag[] /* i : last metadata update flag */ +) +{ + int16_t ch; + + for ( ch = 0; ch < nchan_ism; ch++ ) + { + if ( updt_flag[ch] == 1 ) + { + hIsmMeta[ch]->last_azimuth = hIsmMeta[ch]->azimuth; + hIsmMeta[ch]->last_elevation = hIsmMeta[ch]->elevation; + } + } + + return; +} + + +/*----------------------------------------------------------------* + * ivas_get_ism_sid_quan_bitbudget() + * + * Set quantization bits based on the number of coded objects + *----------------------------------------------------------------*/ + +void ivas_get_ism_sid_quan_bitbudget( + const int16_t nchan_ism, /* i : number of objects */ + int16_t *nBits_azimuth, /* o : number of Q bits for azimuth */ + int16_t *nBits_elevation, /* o : number of Q bits for elevation */ + float *q_step, /* o : quantization step */ + float *q_step_border, /* o : quantization step at the border */ + int16_t *nBits_coh, /* o : number of Q bits for coherence */ + int16_t *nBits_sce_id /* o : number of Q bits for sce_id_dtx */ +) +{ + *nBits_azimuth = ISM_DTX_AZI_BITS_HIGH; + *nBits_elevation = ISM_DTX_ELE_BITS_HIGH; + *q_step = ISM_Q_STEP_HIGH; + *q_step_border = ISM_Q_STEP_BORDER_HIGH; + *nBits_coh = ISM_DTX_COH_SCA_BITS; + *nBits_sce_id = 1; + + if ( nchan_ism >= 3 ) + { + *nBits_azimuth = ISM_DTX_AZI_BITS_LOW; + *nBits_elevation = ISM_DTX_ELE_BITS_LOW; + *q_step = ISM_Q_STEP_LOW; + *q_step_border = ISM_Q_STEP_BORDER_LOW; + *nBits_sce_id = 2; + } + + return; +} diff --git a/lib_com/ivas_lfe_com.c b/lib_com/ivas_lfe_com.c new file mode 100644 index 0000000000000000000000000000000000000000..6b323a13c45df500df31f23e9a6d02091c94e96a --- /dev/null +++ b/lib_com/ivas_lfe_com.c @@ -0,0 +1,139 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "math.h" +#include "options.h" +#include "ivas_stat_com.h" +#include "prot.h" +#include "ivas_prot.h" +#include "rom_com.h" +#include "ivas_rom_com.h" +#include "cnst.h" +#include +#include "wmc_auto.h" + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_lfe_lpf_select_filt_coeff() + * + * Selects LFE filter coeff based on config. + *-----------------------------------------------------------------------------------------*/ + +void ivas_lfe_lpf_select_filt_coeff( + const int32_t sampling_rate, /* i : sampling rate */ + const int16_t order, /* i : filter order */ + const float **ppFilt_coeff /* o : filter coefficients */ +) +{ + switch ( order ) + { + case IVAS_FILTER_ORDER_2: + switch ( sampling_rate ) + { + case 16000: + *ppFilt_coeff = ivas_lpf_2_butter_16k; + break; + case 32000: + *ppFilt_coeff = ivas_lpf_2_butter_32k; + break; + case 48000: + *ppFilt_coeff = ivas_lpf_2_butter_48k; + break; + default: + break; + } + break; + case IVAS_FILTER_ORDER_4: + switch ( sampling_rate ) + { + case 16000: + *ppFilt_coeff = ivas_lpf_4_butter_16k_sos; + break; + case 32000: + *ppFilt_coeff = ivas_lpf_4_butter_32k_sos; + break; + case 48000: + *ppFilt_coeff = ivas_lpf_4_butter_48k_sos; + break; + default: + break; + } + break; + default: + assert( !"Unsupported LFE Filter order" ); + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_lfe_window_init() + * + * Initialize LFE window + *-----------------------------------------------------------------------------------------*/ + +void ivas_lfe_window_init( + LFE_WINDOW_HANDLE hLFEWindow, /* i/o: LFE window handle */ + const int32_t sampling_rate, /* i : sampling rate */ + const int16_t frame_len /* i : frame length in samples */ +) +{ + /* Set window coefficients */ + if ( sampling_rate == 48000 ) + { + hLFEWindow->pWindow_coeffs = ivas_lfe_window_coeff_48k; + } + else if ( sampling_rate == 32000 ) + { + hLFEWindow->pWindow_coeffs = ivas_lfe_window_coeff_32k; + } + else if ( sampling_rate == 16000 ) + { + hLFEWindow->pWindow_coeffs = ivas_lfe_window_coeff_16k; + } + else + { + assert( !"8kHz LFE Window not supported" ); + } + + /* 10ms stride, MDCT will be done in two iterations */ + hLFEWindow->dct_len = frame_len >> 1; + + /* 8ms of latency */ + hLFEWindow->fade_len = NS2SA( sampling_rate, IVAS_LFE_FADE_NS ); + hLFEWindow->zero_pad_len = (int16_t) ( IVAS_ZERO_PAD_LEN_MULT_FAC * ( hLFEWindow->dct_len - hLFEWindow->fade_len ) ); + hLFEWindow->full_len = hLFEWindow->zero_pad_len + hLFEWindow->fade_len + hLFEWindow->dct_len; + + return; +} diff --git a/lib_com/ivas_masa_com.c b/lib_com/ivas_masa_com.c new file mode 100644 index 0000000000000000000000000000000000000000..abb4dbd552c9c4ed956ce146329474da464e679b --- /dev/null +++ b/lib_com/ivas_masa_com.c @@ -0,0 +1,994 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include "options.h" +#include +#include "prot.h" +#include "ivas_cnst.h" +#include "ivas_prot.h" +#include "ivas_rom_com.h" +#include "ivas_stat_dec.h" +#include "wmc_auto.h" + +/*--------------------------------------------------------------- + * Local constants + *---------------------------------------------------------------*/ + +#define MASA_EXTRA_BAND_META_BITS 40 + +#define MASA_SMALL_INC_META_BITS 10 + + +/*--------------------------------------------------------------- + * Local prototypes + *---------------------------------------------------------------*/ + +static int16_t quantize_theta_masa( float x, const int16_t no_cb, float *xhat ); + +static int16_t quantize_phi_masa( float phi, const int16_t flag_delta, float *phi_hat, const int16_t n ); + + +/*--------------------------------------------------------------- + * ivas_masa_setup() + * + * Set-up MASA coding elements and bitrates + *---------------------------------------------------------------*/ + +void ivas_masa_set_elements( + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + const int16_t mc_mode, /* i : MC format mode */ + const int16_t nchan_transport, /* i : number of MASA input/transport channels */ + IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ + int16_t *element_mode, /* o : element mode */ + int16_t *nSCE, /* o : number of SCEs */ + int16_t *nCPE, /* o : number of CPEs */ + const int16_t ivas_format, /* i : IVAS format */ + const ISM_MODE ism_mode, /* i : ISM mode */ + const int32_t ism_total_brate /* i : initial ISM total bitrate */ +) +{ + if ( nchan_transport == 2 ) + { + if ( ivas_total_brate >= MCMASA_SEPARATE_BRATE && mc_mode == MC_MODE_MCMASA ) + { + *nCPE = 1; + *nSCE = 1; + + *element_mode = IVAS_SCE; /* This is needed for the initialization phase to initialize codec mode to SCE, since it is written first to the file*/ + } + else if ( ivas_format == MASA_ISM_FORMAT && ism_mode != ISM_MODE_NONE ) + { + *nCPE = 1; + + if ( *element_mode == -1 ) + { + *element_mode = IVAS_CPE_DFT; /* To have it initialized in case it was not already. */ + } + if ( ivas_total_brate > MIN_BRATE_MDCT_STEREO ) + { + *element_mode = IVAS_CPE_MDCT; + if ( ( ism_mode == ISM_MASA_MODE_DISC || ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ || ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) && ( ivas_total_brate - ism_total_brate < MIN_BRATE_MDCT_STEREO ) ) + { + *element_mode = IVAS_CPE_DFT; + } + } + } + else + { + *nCPE = 1; + *nSCE = 0; + + if ( ivas_total_brate > MIN_BRATE_MDCT_STEREO ) + { + *element_mode = IVAS_CPE_MDCT; + } + } + hQMetaData->bits_frame_nominal = (int16_t) ( ivas_total_brate / FRAMES_PER_SEC ); + if ( ivas_format == MASA_ISM_FORMAT && ( ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ || ism_mode == ISM_MASA_MODE_DISC ) ) + { + hQMetaData->bits_frame_nominal -= (int16_t) ( ism_total_brate / FRAMES_PER_SEC ); + } + } + else if ( nchan_transport == 1 ) + { + *nCPE = 0; + *nSCE = 1; + + if ( ivas_total_brate == IVAS_13k2 ) + { + hQMetaData->bits_frame_nominal = ACELP_9k60 / FRAMES_PER_SEC; + } + else if ( ivas_total_brate <= IVAS_16k4 ) + { + hQMetaData->bits_frame_nominal = ACELP_13k20 / FRAMES_PER_SEC; + } + else if ( ivas_total_brate <= IVAS_24k4 ) + { + hQMetaData->bits_frame_nominal = ACELP_16k40 / FRAMES_PER_SEC; + } + else if ( ivas_total_brate <= IVAS_32k ) + { + hQMetaData->bits_frame_nominal = ACELP_24k40 / FRAMES_PER_SEC; + } + else + { + hQMetaData->bits_frame_nominal = (int16_t) ( ivas_total_brate / FRAMES_PER_SEC ); + } + *element_mode = IVAS_SCE; + } + else + { + assert( !"MASA number of transport channels must be 1, or 2" ); + } + + return; +} + + +/*--------------------------------------------------------------- + * generate_gridEq() + * + * generate Spherical grid + *---------------------------------------------------------------*/ + +void generate_gridEq( + SPHERICAL_GRID_DATA *data /* o : data structure for grid */ +) +{ + int32_t cum_n, cum_n_prev; + float theta; + int16_t i; + int16_t *n; + + n = data->no_phi; + n[0] = MASA_NO_POINTS_EQUATOR; + + cum_n_prev = 0; + + for ( i = 1; i < MASA_NO_CIRCLES; i++ ) + { + theta = MASA_ANGLE_AT_EQUATOR * (float) ( i + 0.5f ); + if ( i == 1 ) + { + cum_n = 2 * (int32_t) ceilf( MASA_NTOT2_FAC * ( sinf( theta ) - MASA_ASIN_OFFSET ) ); + } + else + { + cum_n = 2 * (int32_t) roundf( MASA_NTOT2_FAC * ( sinf( theta ) - MASA_ASIN_OFFSET ) ); + } + n[i] = (int16_t) ( ( cum_n - cum_n_prev ) >> 1 ); + cum_n_prev = cum_n; + } + n[i] = 1; + data->no_theta = i + 1; + + return; +} + + +/*--------------------------------------------------------------- + * ivas_masa_set_coding_config() + * + * Sets MASA codec parameters based on bitrate, number of directions, + * and other metadata properties. + *---------------------------------------------------------------*/ + +void ivas_masa_set_coding_config( + MASA_CODEC_CONFIG *config, /* i/o: MASA coding config structure */ + int16_t *band_mapping, /* o : Band mapping used */ + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + const int16_t nchan_transport, /* i : number of transport channels (mono/stereo) */ + const uint8_t isMcMasa /* i : toggle for selecting mcMASA specific config */ +) +{ + int16_t i; + uint8_t nbands; + uint8_t nTwoDirBands; + const int16_t *masa_bits_table; + + /* When coming into this function, these values should be already set: + * joinedSubframes; + * useCoherence; + * numberOfDirections; + */ + + /* Setup coding parameters based on the bitrate, transport channel count, subframe metadata information, + * and number of directions in metadata. */ + nbands = 0; + nTwoDirBands = 0; + i = 0; + + /* First select correct bit budget table */ + masa_bits_table = masa_bits; + if ( isMcMasa ) + { + masa_bits_table = mcmasa_bits; + } + else if ( ivas_total_brate < IVAS_48k && nchan_transport == 2 ) + { + masa_bits_table = masa_bits_LR_stereo; + } + + while ( nbands == 0 && i < IVAS_NUM_ACTIVE_BRATES ) + { + if ( ivas_total_brate <= ivas_brate_tbl[i + SIZE_IVAS_BRATE_TBL - IVAS_NUM_ACTIVE_BRATES] ) + { + int16_t idx_bands; + if ( ivas_total_brate < IVAS_48k && nchan_transport == 2 && i > 3 ) + { + /* because it uses the bitallocation for the lower bit rates from 'masa_bits_LR_stereo' and it has 4 elements */ + i = 3; + } + idx_bands = i; + + if ( config->numberOfDirections > 1 ) + { + nTwoDirBands = config->joinedSubframes ? masa_twodir_bands_joined[i] : masa_twodir_bands[i]; + + if ( ( ivas_total_brate > IVAS_96k && !config->joinedSubframes ) || ( ivas_total_brate > IVAS_80k && config->joinedSubframes ) ) + { + idx_bands--; + } + } + + if ( config->joinedSubframes ) + { + nbands = masa_joined_nbands[idx_bands]; + } + else + { + nbands = masa_nbands[idx_bands]; + } + + config->max_metadata_bits = masa_bits_table[i]; + + if ( ivas_total_brate == IVAS_64k && config->numberOfDirections > 1 ) + { + /* At 64k, we increase metadata bit budget when there is two directions present. */ + config->max_metadata_bits += MASA_EXTRA_BAND_META_BITS; + } + + if ( ( ( ivas_total_brate == IVAS_32k && nchan_transport == 2 ) || ivas_total_brate == IVAS_48k ) && config->joinedSubframes ) + { + /* At 32k and 48k, we increase metadata bit budget when joinedSubframes. */ + config->max_metadata_bits += ( MASA_SMALL_INC_META_BITS ); + } + } + i++; + } + config->numCodingBands = nbands; + config->numTwoDirBands = nTwoDirBands; + + if ( config->joinedSubframes == TRUE ) + { + config->mergeRatiosOverSubframes = FALSE; + } + else + { + config->mergeRatiosOverSubframes = TRUE; + } + + /* Setup frequency band mapping based on the number of used coding bands */ + switch ( config->numCodingBands ) + { + case 5: + mvs2s( MASA_band_mapping_24_to_5, band_mapping, 5 + 1 ); + break; + case 8: + mvs2s( MASA_band_mapping_24_to_8, band_mapping, 8 + 1 ); + break; + case 12: + mvs2s( MASA_band_mapping_24_to_12, band_mapping, 12 + 1 ); + break; + case 18: + mvs2s( MASA_band_mapping_24_to_18, band_mapping, 18 + 1 ); + break; + case MASA_FREQUENCY_BANDS: + /* With input count of bands, no mapping is needed but for unified processing later, we store normal mapping */ + for ( i = 0; i < MASA_FREQUENCY_BANDS + 1; i++ ) + { + band_mapping[i] = i; + } + break; + default: + assert( 0 && "Error: The number of MASA coding bands is not supported" ); + } + + config->useCoherence = TRUE; + if ( ( !isMcMasa && ivas_total_brate < IVAS_48k ) || ( isMcMasa && ivas_total_brate < IVAS_16k4 ) ) + { + config->useCoherence = FALSE; + } + + return; +} + + +/*--------------------------------------------------------------- + * masa_sample_rate_band_correction() + * + * + *---------------------------------------------------------------*/ + +void masa_sample_rate_band_correction( + MASA_CODEC_CONFIG *config, /* i/o: MASA codec config */ + int16_t *band_mapping, /* i/o: Band mapping used and modified */ + IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: QMetadata structure for modification */ + const uint8_t maxBand, /* i : max band */ + uint8_t is_encoder, /* i : signals if called at encoder */ + MASA_DECODER_EXT_OUT_META_HANDLE hExtOutMeta /* i/o: MASA decoder metadata ext out buffer */ +) +{ + uint8_t band, sf; + int16_t highBand; + uint8_t numBands48k; + + numBands48k = config->numCodingBands; + + for ( band = 1; band < config->numCodingBands + 1; band++ ) + { + highBand = band_mapping[band]; + + if ( highBand >= maxBand ) + { + config->numCodingBands = band; + hQMetaData->numCodingBands = band; + + if ( is_encoder ) + { + if ( hQMetaData->q_direction->cfg.nbands > band ) + { + hQMetaData->q_direction->cfg.nbands = band; + } + if ( hQMetaData->no_directions == 2 && hQMetaData->q_direction[1].cfg.nbands > band ) + { + hQMetaData->q_direction[1].cfg.nbands = band; + } + } + + band_mapping[band] = maxBand; + + break; + } + } + + /* Set rest of the bands to zero in qmetadata. */ + for ( ; band < numBands48k; band++ ) + { + for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) + { + hQMetaData->q_direction[0].band_data[band].azimuth[sf] = 0.0f; + hQMetaData->q_direction[0].band_data[band].elevation[sf] = 0.0f; + hQMetaData->q_direction[0].band_data[band].energy_ratio[sf] = 0.0f; + + if ( hQMetaData->coherence_flag && hQMetaData->q_direction[0].coherence_band_data != NULL ) + { + hQMetaData->q_direction[0].coherence_band_data[band].spread_coherence[sf] = 0u; + } + + if ( hQMetaData->no_directions == 2 ) + { + hQMetaData->q_direction[1].band_data[band].azimuth[sf] = 0.0f; + hQMetaData->q_direction[1].band_data[band].elevation[sf] = 0.0f; + hQMetaData->q_direction[1].band_data[band].energy_ratio[sf] = 0.0f; + + if ( hQMetaData->coherence_flag && hQMetaData->q_direction[1].coherence_band_data != NULL ) + { + hQMetaData->q_direction[1].coherence_band_data[band].spread_coherence[sf] = 0u; + } + } + + if ( hQMetaData->coherence_flag && hQMetaData->surcoh_band_data != NULL ) + { + hQMetaData->surcoh_band_data[band].surround_coherence[sf] = 0u; + } + } + + if ( hQMetaData->no_directions == 2 ) + { + hQMetaData->twoDirBands[band] = 0; + } + } + + if ( hExtOutMeta != NULL ) + { + /* in decoder, zero the EXT out MASA meta buffer */ + for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) + { + for ( band = hQMetaData->numCodingBands; band < MASA_FREQUENCY_BANDS; band++ ) + { + hExtOutMeta->directionIndex[0][sf][band] = SPH_IDX_FRONT; + hExtOutMeta->directToTotalRatio[0][sf][band] = 0u; + hExtOutMeta->spreadCoherence[0][sf][band] = 0u; + + hExtOutMeta->directionIndex[1][sf][band] = SPH_IDX_FRONT; + hExtOutMeta->directToTotalRatio[1][sf][band] = 0u; + hExtOutMeta->spreadCoherence[1][sf][band] = 0u; + + hExtOutMeta->surroundCoherence[sf][band] = 0u; + hExtOutMeta->diffuseToTotalRatio[sf][band] = UINT8_MAX; + } + } + } + + return; +} + + +/*------------------------------------------------------------------------- + * index_theta_phi_16() + * + * + *------------------------------------------------------------------------*/ + +/*! r: output index for direction */ +uint16_t index_theta_phi_16( + float *p_theta, /* i/o: input elevation to be indexed */ + float *p_phi, /* i/o: input azimuth to be indexed */ + const SPHERICAL_GRID_DATA *gridData /* i : generated grid data */ +) +{ + float abs_theta; + int16_t sign_th, id_phi, id_th; + uint16_t idx_sph; + uint16_t cum_n; + float theta_hat, phi_hat; + float theta, phi; + + theta = *p_theta; + phi = *p_phi; + phi_hat = 0; + theta_hat = 0; + phi = phi + 180; + + if ( theta < 0 ) + { + abs_theta = -theta; + sign_th = -1; + } + else + { + abs_theta = theta; + sign_th = 1; + } + + id_th = quantize_theta_masa( abs_theta, gridData->no_theta, &theta_hat ); + if ( gridData->no_theta > 1 ) + { + if ( gridData->no_phi[id_th] > 1 ) + { + id_phi = quantize_phi_masa( phi, ( id_th % 2 == 1 ), &phi_hat, gridData->no_phi[id_th] ); + } + else + { + id_phi = 0; + phi_hat = 180; + } + } + else + { + id_phi = quantize_phi_masa( phi, ( id_th % 2 == 1 ), &phi_hat, gridData->no_phi[id_th] ); + } + *p_theta = sign_th * theta_hat; + *p_phi = phi_hat - 180; + + /* Starting from Equator, alternating positive and negative */ + if ( id_th == 0 ) + { + idx_sph = id_phi; + } + else + { + if ( id_th == gridData->no_theta - 1 ) + { + idx_sph = 65534 + ( sign_th < 0 ); + } + else + { + theta = MASA_ANGLE_AT_EQUATOR * (float) ( id_th + 0.5f ); + if ( id_th == 1 ) + { + cum_n = 2 * (uint16_t) ceilf( MASA_NTOT2_FAC * ( sinf( theta ) - MASA_ASIN_OFFSET ) ); + } + else + { + cum_n = 2 * (uint16_t) roundf( MASA_NTOT2_FAC * ( sinf( theta ) - MASA_ASIN_OFFSET ) ); + } + + cum_n += gridData->no_phi[0]; + + if ( sign_th > 0 ) + { + cum_n -= 2 * gridData->no_phi[id_th]; + } + else + { + cum_n -= gridData->no_phi[id_th]; + } + idx_sph = cum_n + id_phi; + } + } + + return idx_sph; +} + + +/*------------------------------------------------------------------------- + * quantize_phi_masa() + * + * + *------------------------------------------------------------------------*/ + +/*! r: output index */ +static int16_t quantize_theta_masa( + float x, /* i : theta value to be quantized */ + const int16_t no_cb, /* i : number of codewords */ + float *xhat /* o : quantized value */ +) +{ + int16_t imin; + float diff1, diff2; + + imin = (int16_t) ( x * MASA_INV_ANGLE_AT_EQUATOR_DEG + 0.5f ); + + if ( imin >= no_cb - 1 ) + { + imin = no_cb - 1; + diff1 = x - 90; + diff2 = x - MASA_ANGLE_AT_EQUATOR_DEG * ( imin - 1 ); + if ( fabsf( diff1 ) > fabsf( diff2 ) ) + { + imin--; + *xhat = imin * MASA_ANGLE_AT_EQUATOR_DEG; + } + else + { + *xhat = 90; + } + } + else + { + *xhat = imin * MASA_ANGLE_AT_EQUATOR_DEG; + } + + return imin; +} + + +/*------------------------------------------------------------------------- + * quantize_phi_masa() + * + * + *------------------------------------------------------------------------*/ + +/*! r: index azimuth */ +static int16_t quantize_phi_masa( + float phi, /* i : azimuth value */ + const int16_t flag_delta, /* i : flag indicating if the azimuth codebook is translated or not */ + float *phi_hat, /* o : quantized azimuth */ + const int16_t n /* i : azimuth codebook size */ +) +{ + int16_t id_phi; + float dd; + float delta_phi; + + delta_phi = 360.0f / (float) n; + + if ( n == 1 ) + { + *phi_hat = 0; + + return 0; + } + + if ( flag_delta == 1 ) + { + dd = delta_phi / 2.0f; + } + else + { + dd = 0; + } + + id_phi = (int16_t) ( ( phi - dd + delta_phi / 2.0f ) / (float) delta_phi ); + + if ( id_phi == n ) + { + id_phi = 0; + } + + if ( id_phi == -1 ) + { + id_phi = n - 1; + } + + *phi_hat = id_phi * delta_phi + dd; + + return id_phi; +} + + +/*------------------------------------------------------------------------- + * deindex_sph_idx() + * + * deindex the MASA metadata from the input metadata file + *------------------------------------------------------------------------*/ + +void deindex_sph_idx( + const uint16_t sphIndex, /* i : Spherical index */ + const SPHERICAL_GRID_DATA *gridData, /* i : Prepared spherical grid */ + float *theta, /* o : Elevation */ + float *phi /* o : Azimuth */ +) +{ + float ba_crt, del_crt, div_crt, a4_crt; + float estim; + int32_t base_low, base_up; + int16_t n_crt; + int16_t id_th; + int16_t sign_theta; + int16_t id_phi; + int16_t no_th = gridData->no_theta; + const int16_t *n = gridData->no_phi; + const float ba[3] = { 2.137991118026424e+02f, 1.244854404591542e+02f, 1.228408647140870e+02f }; + const float del[3] = { 7.998262115303199e+05f, 1.300883976959332e+06f, 1.424072242426373e+06f }; + const float div[3] = { -0.237662341081474f, -0.100938185496887f, -0.092050209205032f }; + const float a4[3] = { -8.415300425381099f, -19.814106922515204f, -21.727272727270197f }; + const uint16_t limit_index1 = 64964, limit_index2 = 47870; + + if ( sphIndex >= limit_index1 ) + { + ba_crt = ba[2]; + div_crt = div[2]; + a4_crt = a4[2]; + del_crt = del[2]; + } + else if ( sphIndex >= limit_index2 ) + { + ba_crt = ba[1]; + div_crt = div[1]; + a4_crt = a4[1]; + del_crt = del[1]; + } + else + { + ba_crt = ba[0]; + div_crt = div[0]; + a4_crt = a4[0]; + del_crt = del[0]; + } + estim = ba_crt + div_crt * sqrtf( del_crt + a4_crt * sphIndex ); + + if ( estim > MASA_NO_CIRCLES ) + { + estim = MASA_NO_CIRCLES; + } + + assert( estim > 0 ); + id_th = (int16_t) roundf( estim ) - 1; + if ( id_th < 0 ) + { + id_th = 0; + } + + if ( id_th == 0 ) + { + base_low = 0; + base_up = n[0]; + } + else + { + estim = MASA_ANGLE_AT_EQUATOR * (float) ( id_th - 0.5f ); + base_low = n[0]; + if ( id_th >= 2 ) + { + if ( id_th == 2 ) + { + base_low += 2 * (int16_t) ceilf( MASA_NTOT2_FAC * ( sinf( estim ) - MASA_ASIN_OFFSET ) ); + } + else + { + base_low += 2 * (int16_t) roundf( MASA_NTOT2_FAC * ( sinf( estim ) - MASA_ASIN_OFFSET ) ); + } + } + base_up = base_low + 2 * n[id_th]; + } + + sign_theta = 1; + + n_crt = n[id_th]; + if ( sphIndex < base_low ) + { + id_th--; + n_crt = n[id_th]; + if ( id_th == 0 ) + { + base_low = 0; + base_up = n_crt; + } + else + { + base_up = base_low; + base_low -= 2 * n[id_th]; + } + assert( sphIndex >= base_low ); + } + else if ( sphIndex >= base_up ) + { + id_th++; + n_crt = n[id_th]; + base_low = base_up; + base_up += 2 * n_crt; + assert( sphIndex < base_up ); + } + + id_phi = (int16_t) ( sphIndex - base_low ); + if ( sphIndex - base_low >= n_crt ) + { + id_phi -= n_crt; + sign_theta = -1; + } + + if ( id_th == 0 ) + { + *theta = 0.f; + *phi = (float) sphIndex * 360 / (float) n_crt - 180; + } + else + { + if ( id_th == no_th - 1 ) + { + id_phi = 0; + *phi = -180; + *theta = 90 * (float) sign_theta; + } + else + { + *theta = id_th * MASA_ANGLE_AT_EQUATOR_DEG * (float) sign_theta; + if ( id_th % 2 == 0 ) + { + *phi = (float) id_phi * 360 / (float) n_crt - 180; + } + else + { + *phi = ( (float) id_phi + 0.5f ) * 360 / (float) n_crt - 180; + } + } + } + + return; +} + + +/*--------------------------------------------------------------- + * valid_ratio_index() + * + * Checking validity of the index of an ISM ratio index vector, + * within the indexing function. + *---------------------------------------------------------------*/ + +/*! r: valid or not 1/0 */ +int16_t valid_ratio_index( + int16_t index, /* i : index to be checked */ + const int16_t K, /* i : L1 norm to check against */ + const int16_t len /* i : vector length */ +) +{ + int16_t out; + int16_t i, sum, elem; + int16_t base[4]; + + sum = 0; + set_s( base, 1, len ); + + + for ( i = 1; i < len; i++ ) + { + base[i] = base[i - 1] * 10; + } + sum = 0; + for ( i = len - 1; i >= 0; i-- ) + { + elem = index / base[i]; + sum += elem; + index -= elem * base[i]; + } + if ( sum <= K ) + { + out = 1; + } + else + { + out = 0; + } + + return out; +} + + +/*--------------------------------------------------------------- + * reconstruct_ism_ratios() + * + * Obtains ISM ratio values from the quantized indexes + *---------------------------------------------------------------*/ + +void reconstruct_ism_ratios( + int16_t *ratio_ism_idx, /* i : index vector */ + const int16_t nchan_ism, /* i : number of components/objects */ + const float step, /* i : quantization step */ + float *q_energy_ratio_ism /* o : reconstructed ISM values */ +) +{ + int16_t i; + float sum; + + sum = 0; + for ( i = 0; i < nchan_ism - 1; i++ ) + { + q_energy_ratio_ism[i] = ratio_ism_idx[i] * step; + sum += q_energy_ratio_ism[i]; + } + + q_energy_ratio_ism[nchan_ism - 1] = 1.0f - sum; + + if ( q_energy_ratio_ism[nchan_ism - 1] < 0 ) + { + q_energy_ratio_ism[nchan_ism - 1] = 0.0f; + } + + return; +} + + +/*--------------------------------------------------------------- + * ivas_omasa_modify_masa_energy_ratios() + * + * Updates energy ratios by taking into account the MASA content contribution + * to the total audio scene + *---------------------------------------------------------------*/ + +void ivas_omasa_modify_masa_energy_ratios( + IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ + float masa_to_total_energy_ratio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_MAXIMUM_CODING_SUBBANDS] ) +{ + int16_t i, m, d, b; + + for ( m = 0; m < MAX_PARAM_SPATIAL_SUBFRAMES; m++ ) + { + if ( hQMetaData->q_direction[0].cfg.nblocks == 1 ) + { + i = 0; + } + else + { + i = m; + } + + for ( b = 0; b < hQMetaData->q_direction[0].cfg.nbands; b++ ) + { + for ( d = 0; d < hQMetaData->no_directions; d++ ) + { + hQMetaData->q_direction[d].band_data[b].energy_ratio[m] = hQMetaData->q_direction[d].band_data[b].energy_ratio[m] * masa_to_total_energy_ratio[i][b]; + } + } + } + + return; +} + + +/*--------------------------------------------------------------- + * distribute_evenly_ism() + * + * Obtain ISM ratio indexes for even content distribution bbetween objects + *---------------------------------------------------------------*/ + +void distribute_evenly_ism( + int16_t *idx, /* o : index values */ + const int16_t K, /* i : sum of indexes */ + const int16_t nchan_ism /* i : number of objects */ +) +{ + int16_t i; + int16_t sum; + + sum = 0; + for ( i = 0; i < nchan_ism; i++ ) + { + idx[i] = (int16_t) ( K / nchan_ism ); + sum += idx[i]; + } + + assert( sum <= K ); + + i = 0; + while ( sum < K ) + { + if ( i == nchan_ism ) + { + i = 0; + } + idx[i]++; + sum++; + i++; + } + + return; +} + + +/*--------------------------------------------------------------- + * calculate_cpe_brate_MASA_ISM() + * + * Calculates bitrate for MASA_ISM mode that is not used for separated objects, + * * but for the CPE part (metadata included) + *---------------------------------------------------------------*/ + +/*! r: CPE bitrate value */ +int32_t calculate_cpe_brate_MASA_ISM( + const ISM_MODE ism_mode, /* i : ism mode */ + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + const int16_t nchan_ism /* i : number of objects */ +) +{ + int32_t cpe_brate; + int16_t k, sce_id; + + k = 0; + while ( k < SIZE_IVAS_BRATE_TBL && ivas_total_brate != ivas_brate_tbl[k] ) + { + k++; + } + + if ( ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ || ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) + { + cpe_brate = ivas_total_brate - sep_object_brate[k - 2][0]; /* take data from the first column */ + } + else if ( ism_mode == ISM_MASA_MODE_DISC ) + { + cpe_brate = ivas_total_brate; + + for ( sce_id = 0; sce_id < nchan_ism; sce_id++ ) + { + cpe_brate -= sep_object_brate[k - 2][nchan_ism - 1]; + } + } + else + { + cpe_brate = ivas_total_brate; + } + + return cpe_brate; +} diff --git a/lib_com/ivas_mc_com.c b/lib_com/ivas_mc_com.c new file mode 100644 index 0000000000000000000000000000000000000000..664dd3a703d981489eabb484850f40f49821086b --- /dev/null +++ b/lib_com/ivas_mc_com.c @@ -0,0 +1,236 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include "options.h" +#include +#include "prot.h" +#include "ivas_prot.h" +#include "wmc_auto.h" + + +/*--------------------------------------------------------------- + * ivas_mc_mode_select() + * + * selects the multichannel mode base on bitrate and LS setup + * ---------------------------------------------------------------*/ + +/*! r : MC format mode */ +MC_MODE ivas_mc_mode_select( + const MC_LS_SETUP mc_ls_setup, /* i : MC loudspeaker setup */ + const int32_t total_brate /* i : IVAS total bitrate */ +) +{ + MC_MODE mc_mode = MC_MODE_MCT; + + switch ( mc_ls_setup ) + { + case MC_LS_SETUP_5_1: + if ( total_brate < IVAS_48k ) + { + mc_mode = MC_MODE_MCMASA; + } + else if ( total_brate < IVAS_96k ) + { + mc_mode = MC_MODE_PARAMMC; + } + break; + case MC_LS_SETUP_7_1: + if ( total_brate < IVAS_48k ) + { + mc_mode = MC_MODE_MCMASA; + } + else if ( total_brate < IVAS_128k ) + { + mc_mode = MC_MODE_PARAMMC; + } + break; + case MC_LS_SETUP_5_1_2: + if ( total_brate < IVAS_48k ) + { + mc_mode = MC_MODE_MCMASA; + } + else if ( total_brate < IVAS_128k ) + { + mc_mode = MC_MODE_PARAMMC; + } + break; + case MC_LS_SETUP_5_1_4: + if ( total_brate < IVAS_96k ) + { + mc_mode = MC_MODE_MCMASA; + } + else if ( total_brate < IVAS_160k ) + { + mc_mode = MC_MODE_PARAMMC; + } + break; + case MC_LS_SETUP_7_1_4: + if ( total_brate < IVAS_128k ) + { + mc_mode = MC_MODE_MCMASA; + } + else if ( total_brate < IVAS_160k ) + { + mc_mode = MC_MODE_PARAMMC; + } + else if ( total_brate < IVAS_192k ) + { + mc_mode = MC_MODE_PARAMUPMIX; + } + break; + default: + assert( 0 && "LS Setup not supported or defined for MC mode!\n" ); + } + + return mc_mode; +} + + +/*--------------------------------------------------------------- + * ivas_mc_setup_get_num_channels() + * + * returns the number of channels (including the LFE) for a MC LS setup + * ---------------------------------------------------------------*/ + +/*! r : number of loudspeaker channels */ +int16_t ivas_mc_ls_setup_get_num_channels( + const MC_LS_SETUP mc_ls_setup /* i : multi channel loudspeaker setup */ +) +{ + int16_t nchan; + + nchan = 0; + + switch ( mc_ls_setup ) + { + case MC_LS_SETUP_5_1: + nchan = 6; + break; + case MC_LS_SETUP_7_1: + nchan = 8; + break; + case MC_LS_SETUP_5_1_2: + nchan = 8; + break; + case MC_LS_SETUP_5_1_4: + nchan = 10; + break; + case MC_LS_SETUP_7_1_4: + nchan = 12; + break; + default: + assert( 0 && "LS Setup not supported or defined for MC mode!\n" ); + } + + return nchan; +} + + +/*--------------------------------------------------------------- + * ivas_mc_map_output_config_to_mc_ls_setup() + * + * maps output configuration multi channel loudspeaker setup + * ---------------------------------------------------------------*/ + +/*! r : multi channel loudspeaker setup */ +MC_LS_SETUP ivas_mc_map_output_config_to_mc_ls_setup( + const AUDIO_CONFIG output_config /* i : output audio configuration */ +) +{ + MC_LS_SETUP mc_ls_setup; + + mc_ls_setup = MC_LS_SETUP_INVALID; + + switch ( output_config ) + { + case IVAS_AUDIO_CONFIG_5_1: + mc_ls_setup = MC_LS_SETUP_5_1; + break; + case IVAS_AUDIO_CONFIG_7_1: + mc_ls_setup = MC_LS_SETUP_7_1; + break; + case IVAS_AUDIO_CONFIG_5_1_2: + mc_ls_setup = MC_LS_SETUP_5_1_2; + break; + case IVAS_AUDIO_CONFIG_5_1_4: + mc_ls_setup = MC_LS_SETUP_5_1_4; + break; + case IVAS_AUDIO_CONFIG_7_1_4: + mc_ls_setup = MC_LS_SETUP_7_1_4; + break; + default: + assert( 0 && "Output config is not a valid MC loudspeaker setup!\n" ); + } + + return mc_ls_setup; +} + + +/*--------------------------------------------------------------- + * ivas_mc_map_ls_setup_to_output_config + * + * maps multi channel loudspeaker setup to audio configuration + * ---------------------------------------------------------------*/ + +/*! r: audio configuration*/ +AUDIO_CONFIG ivas_mc_map_ls_setup_to_output_config( + const MC_LS_SETUP mc_ls_setup /* i : multi channel loudspeaker setup*/ +) +{ + AUDIO_CONFIG audio_config; + audio_config = IVAS_AUDIO_CONFIG_INVALID; + + switch ( mc_ls_setup ) + { + case MC_LS_SETUP_5_1: + audio_config = IVAS_AUDIO_CONFIG_5_1; + break; + case MC_LS_SETUP_7_1: + audio_config = IVAS_AUDIO_CONFIG_7_1; + break; + case MC_LS_SETUP_5_1_2: + audio_config = IVAS_AUDIO_CONFIG_5_1_2; + break; + case MC_LS_SETUP_5_1_4: + audio_config = IVAS_AUDIO_CONFIG_5_1_4; + break; + case MC_LS_SETUP_7_1_4: + audio_config = IVAS_AUDIO_CONFIG_7_1_4; + break; + default: + assert( 0 && "MC loudspeaker setup is not valid!\n" ); + } + + return audio_config; +} diff --git a/lib_com/ivas_mc_param_com.c b/lib_com/ivas_mc_param_com.c new file mode 100644 index 0000000000000000000000000000000000000000..e8160527021164c336145a677fdb13f3db36cb9e --- /dev/null +++ b/lib_com/ivas_mc_param_com.c @@ -0,0 +1,517 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include +#include "options.h" +#include "ivas_cnst.h" +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_stat_com.h" +#include "ivas_rom_com.h" +#include "wmc_auto.h" + + +/*------------------------------------------------------------------------- + * Local function prototypes + *------------------------------------------------------------------------*/ + +static void ivas_param_mc_set_coding_scheme( const MC_LS_SETUP mc_ls_setup, const int32_t ivas_total_brate, HANDLE_IVAS_PARAM_MC_METADATA hMetadataPMC ); + + +/*------------------------------------------------------------------------- + * ivas_param_mc_get_configuration_index() + * + * + *------------------------------------------------------------------------*/ + +uint16_t ivas_param_mc_get_configuration_index( + const MC_LS_SETUP mc_ls_setup, /* i : MC ls setup */ + const int32_t ivas_total_brate /* i : IVAS total bitrate */ +) +{ + uint16_t cur_idx; + + for ( cur_idx = 0; cur_idx < PARAM_MC_NUM_CONFIGS; cur_idx++ ) + { + if ( ivas_param_mc_conf[cur_idx].mc_ls_setup == mc_ls_setup && ivas_param_mc_conf[cur_idx].ivas_total_brate == ivas_total_brate ) + { + return cur_idx; + } + } + return PARAM_MC_NUM_CONFIGS; +} + + +/*------------------------------------------------------------------------- + * ivas_param_mc_metadata_open() + * + * Parametric MC parameter coding state open function + *------------------------------------------------------------------------*/ + +void ivas_param_mc_metadata_open( + const MC_LS_SETUP mc_ls_setup, /* i : MC ls setup */ + const int16_t lfe_index, /* i : channel index of LFE */ + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + HANDLE_IVAS_PARAM_MC_METADATA hMetadataPMC /* o : handle for the Parametric MC parameter coding state */ +) +{ + int16_t i; + uint16_t config_index; + int16_t nchan_setup; + + nchan_setup = ivas_mc_ls_setup_get_num_channels( mc_ls_setup ); + + /* get coding band mappings */ + set_s( hMetadataPMC->coding_band_mapping, 0, PARAM_MC_MAX_PARAMETER_BANDS ); + + /* set coding scheme */ + ivas_param_mc_set_coding_scheme( mc_ls_setup, ivas_total_brate, hMetadataPMC ); + + /* get configuration index */ + config_index = ivas_param_mc_get_configuration_index( mc_ls_setup, ivas_total_brate ); + if ( config_index == PARAM_MC_NUM_CONFIGS ) + { + assert( 0 && "ParamMC configuration index not found!" ); + } + + /* Band Grouping */ + if ( hMetadataPMC->num_parameter_bands == 20 ) + { + mvs2s( param_mc_coding_band_mapping_20, hMetadataPMC->coding_band_mapping, 20 ); + } + else if ( hMetadataPMC->num_parameter_bands == 14 ) + { + mvs2s( param_mc_coding_band_mapping_14, hMetadataPMC->coding_band_mapping, 14 ); + } + else if ( hMetadataPMC->num_parameter_bands == 10 ) + { + mvs2s( param_mc_coding_band_mapping_10, hMetadataPMC->coding_band_mapping, 10 ); + } + else + { + assert( 0 && "nbands must be 20 or 14!" ); + } + + /* create map of all possible ICCs */ + ivas_param_mc_create_full_icc_mapping( nchan_setup, lfe_index, hMetadataPMC->icc_map_full, &hMetadataPMC->icc_map_size_full ); + hMetadataPMC->icc_mapping_conf = ivas_param_mc_conf[config_index].icc_mapping_conf; + hMetadataPMC->ild_mapping_conf = ivas_param_mc_conf[config_index].ild_mapping_conf; + hMetadataPMC->ild_factors = ivas_param_mc_conf[config_index].ild_factors; + + /* set default ICC maps */ + for ( i = 0; i < PARAM_MC_PARAMETER_FRAMES; i++ ) + { + ivas_param_mc_default_icc_map( hMetadataPMC->icc_mapping_conf, hMetadataPMC->icc_mapping[i] ); + } + + /* init remaining flags and indices */ + hMetadataPMC->param_frame_idx = 0; + hMetadataPMC->flag_use_adaptive_icc_map = 0; + hMetadataPMC->bAttackPresent = 0; + hMetadataPMC->attackIndex = 0; + hMetadataPMC->lfe_on = 1; + + /* set coded bwidth to FB at the beginning */ + hMetadataPMC->coded_bwidth = FB; + hMetadataPMC->last_coded_bwidth = FB; + + ivas_param_mc_set_coded_bands( hMetadataPMC ); + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_param_mc_set_coded_bands() + * + * Parametric MC: set number of actually coded parameters bands based on the + * coded band width + *------------------------------------------------------------------------*/ + +void ivas_param_mc_set_coded_bands( + HANDLE_IVAS_PARAM_MC_METADATA hMetadataPMC /* i/o: handle for the Parametric MC parameter coding state */ +) +{ + int16_t i; + + /* set number of coded bands*/ + switch ( hMetadataPMC->num_parameter_bands ) + { + case 20: + hMetadataPMC->nbands_coded = param_mc_bands_coded_20[hMetadataPMC->coded_bwidth]; + break; + case 14: + hMetadataPMC->nbands_coded = param_mc_bands_coded_14[hMetadataPMC->coded_bwidth]; + break; + case 10: + hMetadataPMC->nbands_coded = param_mc_bands_coded_10[hMetadataPMC->coded_bwidth]; + } + + /* set number of bands per parameter frame set */ + for ( i = 0; i < PARAM_MC_PARAMETER_FRAMES; i++ ) + { + hMetadataPMC->nbands_in_param_frame[i] = 0; + } + + for ( i = 0; i < hMetadataPMC->nbands_coded; i++ ) + { + hMetadataPMC->nbands_in_param_frame[hMetadataPMC->coding_band_mapping[i]]++; + } + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_param_mc_metadata_close() + * + * Parametric MC parameter coding state close function + *------------------------------------------------------------------------*/ + +void ivas_param_mc_metadata_close( + HANDLE_IVAS_PARAM_MC_METADATA hMetadataPMC /* i/o: handle for the Parametric MC parameter coding state */ +) +{ + uint16_t i; + + /* adaptive ICC mapping */ + for ( i = 0; i < 2; i++ ) + { + if ( hMetadataPMC->icc_map_full[i] ) + { + free( hMetadataPMC->icc_map_full[i] ); + hMetadataPMC->icc_map_full[i] = NULL; + } + } + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_param_mc_getNumTransportChannels() + * + * + *------------------------------------------------------------------------*/ + +/* r : number of IVAS transport channels */ +int16_t ivas_param_mc_getNumTransportChannels( + const int32_t ivas_total_bitrate, /* i : IVAS total bitrate */ + const MC_LS_SETUP mc_ls_setup /* i : MC ls setup */ +) +{ + int16_t nchan_transport; + int16_t config_index; + + config_index = ivas_param_mc_get_configuration_index( mc_ls_setup, ivas_total_bitrate ); + + nchan_transport = ivas_param_mc_conf[config_index].num_transport_chan; + + return nchan_transport; +} + + +/*------------------------------------------------------------------------- + * ivas_param_mc_create_full_icc_mapping() + * + * create the map of all possible ICCs for a certain internal setup + * indicated by the number of channels and LFE index + *------------------------------------------------------------------------*/ + +void ivas_param_mc_create_full_icc_mapping( + const int16_t n_channels, /* i : number of channels with LFE for the internal setup */ + const int16_t lfe_index, /* i : channel index of the LFE */ + int16_t *icc_map[2], /* o : map of all possible ICCs */ + int16_t *icc_map_size_full /* o : number of all possible ICCs */ +) +{ + int16_t i, k, l; + + l = 0; + + /* number of all possible ICCs is the number of non-diagonal upper elements of a + * ICC matrix for all channels not including the LFE plus one static ICC for the + * combination (LFE/center) */ + *icc_map_size_full = ( n_channels - 2 ) * ( n_channels - 1 ) / 2 + 1; + + /* allocate memory for the map */ + for ( i = 0; i < 2; i++ ) + { + icc_map[i] = (int16_t *) malloc( *icc_map_size_full * sizeof( int16_t ) ); + } + + /* create map (non-LFE ICCs) */ + for ( i = 0; i < n_channels; i++ ) + { + if ( i != lfe_index ) + { + for ( k = i + 1; k < n_channels; k++ ) + { + if ( k != lfe_index ) + { + icc_map[0][l] = i; + icc_map[1][l] = k; + l++; + } + } + } + } + + /* last one is the fixed mapping center -> LFE */ + assert( l == *icc_map_size_full - 1 ); + + icc_map[0][l] = 2; + icc_map[1][l] = lfe_index; + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_param_mc_default_icc_map() + * + * get the default ICC map for a certain internal setup + * indicated by the number of channels from the table ROM + *------------------------------------------------------------------------*/ + +void ivas_param_mc_default_icc_map( + const PARAM_MC_ICC_MAPPING *hIccMapping, /* i : ICC mapping table */ + int16_t icc_map[PARAM_MC_SZ_ICC_MAP][2] /* o : copy of map from ROM table */ +) +{ + int16_t i; + + for ( i = 0; i < hIccMapping->icc_map_size_lfe; i++ ) + { + icc_map[i][0] = hIccMapping->icc_mapping[i][0]; + icc_map[i][1] = hIccMapping->icc_mapping[i][1]; + } + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_param_mc_get_num_param_bands() + * + * + *------------------------------------------------------------------------*/ + +static int16_t ivas_param_mc_get_num_param_bands( + const MC_LS_SETUP mc_ls_setup, /* i : MC ls setup */ + const int32_t ivas_total_brate /* i : IVAS total bitrate */ +) +{ + int16_t num_parameter_bands; + + num_parameter_bands = 0; + + /* parameter bands */ + switch ( mc_ls_setup ) + { + case MC_LS_SETUP_5_1: + switch ( ivas_total_brate ) + { + case IVAS_48k: + num_parameter_bands = 10; + break; + case IVAS_64k: + case IVAS_80k: + num_parameter_bands = 14; + break; + default: + assert( 0 && "PARAM_MC: bitrate for CICP6 not supported!" ); + } + break; + + case MC_LS_SETUP_7_1: + switch ( ivas_total_brate ) + { + case IVAS_48k: + num_parameter_bands = 10; + break; + case IVAS_64k: + case IVAS_80k: + num_parameter_bands = 14; + break; + case IVAS_96k: + num_parameter_bands = 20; + break; + } + break; + case MC_LS_SETUP_5_1_2: + switch ( ivas_total_brate ) + { + case IVAS_48k: + num_parameter_bands = 10; + break; + case IVAS_64k: + case IVAS_80k: + num_parameter_bands = 14; + break; + case IVAS_96k: + num_parameter_bands = 20; + break; + } + break; + case MC_LS_SETUP_5_1_4: + switch ( ivas_total_brate ) + { + case IVAS_96k: + num_parameter_bands = 14; + break; + case IVAS_128k: + num_parameter_bands = 20; + break; + } + break; + case MC_LS_SETUP_7_1_4: + switch ( ivas_total_brate ) + { + case IVAS_128k: + num_parameter_bands = 14; + break; + case IVAS_160k: + num_parameter_bands = 20; + break; + } + break; + default: + assert( 0 && "PARAM_MC: channel configuration not supportet!" ); + } + + return num_parameter_bands; +} + + +/*------------------------------------------------------------------------- + * Local functions + *------------------------------------------------------------------------*/ + +/*------------------------------------------------------------------------- + * ivas_param_mc_set_coding_scheme() + * + * set Parametric MC parameter coding tables based on format and bitrate + *------------------------------------------------------------------------*/ + +static void ivas_param_mc_set_coding_scheme( + const MC_LS_SETUP mc_ls_setup, /* i : MC ls setup */ + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + HANDLE_IVAS_PARAM_MC_METADATA hMetadataPMC /* i/o: Parametric MC metadata handle */ +) +{ + /* quantizer and coding tables */ + switch ( mc_ls_setup ) + { + case MC_LS_SETUP_5_1: + /* ICC */ + hMetadataPMC->icc_coding.cum_freq = &ivas_param_mc_cum_freq_icc_cicp6_48_16bits[0]; + hMetadataPMC->icc_coding.sym_freq = &ivas_param_mc_sym_freq_icc_cicp6_48_16bits[0]; + hMetadataPMC->icc_coding.cum_freq_delta = &ivas_param_mc_cum_freq_icc_delta_cicp6_48_16bits[0]; + hMetadataPMC->icc_coding.sym_freq_delta = &ivas_param_mc_sym_freq_icc_delta_cicp6_48_16bits[0]; + hMetadataPMC->icc_coding.quantizer = &ivas_param_mc_quant_icc[0]; + hMetadataPMC->icc_coding.quantizer_size = PARAM_MC_SZ_ICC_QUANTIZER; + hMetadataPMC->icc_coding.uni_bits = PARAM_MC_NUM_BITS_ICC_SCALAR_QUANT; + /* ILD */ + hMetadataPMC->ild_coding.cum_freq = &ivas_param_mc_cum_freq_ild_cicp6_48_16bits[0]; + hMetadataPMC->ild_coding.sym_freq = &ivas_param_mc_sym_freq_ild_cicp6_48_16bits[0]; + hMetadataPMC->ild_coding.cum_freq_delta = &ivas_param_mc_cum_freq_ild_delta_cicp6_48_16bits[0]; + hMetadataPMC->ild_coding.sym_freq_delta = &ivas_param_mc_sym_freq_ild_delta_cicp6_48_16bits[0]; + hMetadataPMC->ild_coding.quantizer = &ivas_param_mc_quant_ild_5d1_48[0]; + hMetadataPMC->ild_coding.quantizer_size = PARAM_MC_SZ_ILD_QUANTIZER_4BITS; + hMetadataPMC->ild_coding.uni_bits = PARAM_MC_NUM_BITS_ILD_SCALAR_QUANT; + break; + case MC_LS_SETUP_7_1: + /* ICC */ + hMetadataPMC->icc_coding.cum_freq = &ivas_param_mc_cum_freq_icc_cicp12_48_16bits[0]; + hMetadataPMC->icc_coding.sym_freq = &ivas_param_mc_sym_freq_icc_cicp12_48_16bits[0]; + hMetadataPMC->icc_coding.cum_freq_delta = &ivas_param_mc_cum_freq_icc_delta_cicp12_48_16bits[0]; + hMetadataPMC->icc_coding.sym_freq_delta = &ivas_param_mc_sym_freq_icc_delta_cicp12_48_16bits[0]; + hMetadataPMC->icc_coding.quantizer = &ivas_param_mc_quant_icc[0]; + hMetadataPMC->icc_coding.quantizer_size = PARAM_MC_SZ_ICC_QUANTIZER; + hMetadataPMC->icc_coding.uni_bits = PARAM_MC_NUM_BITS_ICC_SCALAR_QUANT; + /* ILD */ + hMetadataPMC->ild_coding.cum_freq = &ivas_param_mc_cum_freq_ild_cicp12_48_16bits[0]; + hMetadataPMC->ild_coding.sym_freq = &ivas_param_mc_sym_freq_ild_cicp12_48_16bits[0]; + hMetadataPMC->ild_coding.cum_freq_delta = &ivas_param_mc_cum_freq_ild_delta_cicp12_48_16bits[0]; + hMetadataPMC->ild_coding.sym_freq_delta = &ivas_param_mc_sym_freq_ild_delta_cicp12_48_16bits[0]; + hMetadataPMC->ild_coding.quantizer = &ivas_param_mc_quant_ild_5d1_48[0]; + hMetadataPMC->ild_coding.quantizer_size = PARAM_MC_SZ_ILD_QUANTIZER_4BITS; + hMetadataPMC->ild_coding.uni_bits = PARAM_MC_NUM_BITS_ILD_SCALAR_QUANT; + break; + case MC_LS_SETUP_5_1_2: + /* ICC */ + hMetadataPMC->icc_coding.cum_freq = &ivas_param_mc_cum_freq_icc_cicp14_48_16bits[0]; + hMetadataPMC->icc_coding.sym_freq = &ivas_param_mc_sym_freq_icc_cicp14_48_16bits[0]; + hMetadataPMC->icc_coding.cum_freq_delta = &ivas_param_mc_cum_freq_icc_delta_cicp14_48_16bits[0]; + hMetadataPMC->icc_coding.sym_freq_delta = &ivas_param_mc_sym_freq_icc_delta_cicp14_48_16bits[0]; + hMetadataPMC->icc_coding.quantizer = &ivas_param_mc_quant_icc[0]; + hMetadataPMC->icc_coding.quantizer_size = PARAM_MC_SZ_ICC_QUANTIZER; + hMetadataPMC->icc_coding.uni_bits = PARAM_MC_NUM_BITS_ICC_SCALAR_QUANT; + /* ILD */ + hMetadataPMC->ild_coding.cum_freq = &ivas_param_mc_cum_freq_ild_cicp14_48_16bits[0]; + hMetadataPMC->ild_coding.sym_freq = &ivas_param_mc_sym_freq_ild_cicp14_48_16bits[0]; + hMetadataPMC->ild_coding.cum_freq_delta = &ivas_param_mc_cum_freq_ild_delta_cicp14_48_16bits[0]; + hMetadataPMC->ild_coding.sym_freq_delta = &ivas_param_mc_sym_freq_ild_delta_cicp14_48_16bits[0]; + hMetadataPMC->ild_coding.quantizer = &ivas_param_mc_quant_ild_5d1_48[0]; + hMetadataPMC->ild_coding.quantizer_size = PARAM_MC_SZ_ILD_QUANTIZER_4BITS; + hMetadataPMC->ild_coding.uni_bits = PARAM_MC_NUM_BITS_ILD_SCALAR_QUANT; + break; + case MC_LS_SETUP_5_1_4: + case MC_LS_SETUP_7_1_4: + /* ICC */ + hMetadataPMC->icc_coding.cum_freq = &ivas_param_mc_cum_freq_icc_combined_48_16bits[0]; + hMetadataPMC->icc_coding.sym_freq = &ivas_param_mc_sym_freq_icc_combined_48_16bits[0]; + hMetadataPMC->icc_coding.cum_freq_delta = &ivas_param_mc_cum_freq_icc_delta_combined_48_16bits[0]; + hMetadataPMC->icc_coding.sym_freq_delta = &ivas_param_mc_sym_freq_icc_delta_combined_48_16bits[0]; + hMetadataPMC->icc_coding.quantizer = &ivas_param_mc_quant_icc[0]; + hMetadataPMC->icc_coding.quantizer_size = PARAM_MC_SZ_ICC_QUANTIZER; + hMetadataPMC->icc_coding.uni_bits = PARAM_MC_NUM_BITS_ICC_SCALAR_QUANT; + /* ILD */ + hMetadataPMC->ild_coding.cum_freq = &ivas_param_mc_cum_freq_ild_combined_48_16bits[0]; + hMetadataPMC->ild_coding.sym_freq = &ivas_param_mc_sym_freq_ild_combined_48_16bits[0]; + hMetadataPMC->ild_coding.cum_freq_delta = &ivas_param_mc_cum_freq_ild_delta_combined_48_16bits[0]; + hMetadataPMC->ild_coding.sym_freq_delta = &ivas_param_mc_sym_freq_ild_delta_combined_48_16bits[0]; + hMetadataPMC->ild_coding.quantizer = &ivas_param_mc_quant_ild_5d1_48[0]; + hMetadataPMC->ild_coding.quantizer_size = PARAM_MC_SZ_ILD_QUANTIZER_4BITS; + hMetadataPMC->ild_coding.uni_bits = PARAM_MC_NUM_BITS_ILD_SCALAR_QUANT; + break; + default: + assert( 0 && "PARAM_MC: channel configuration not supported!" ); + } + + hMetadataPMC->num_parameter_bands = ivas_param_mc_get_num_param_bands( mc_ls_setup, ivas_total_brate ); + + return; +} diff --git a/lib_com/ivas_mcmasa_com.c b/lib_com/ivas_mcmasa_com.c new file mode 100644 index 0000000000000000000000000000000000000000..34196431960ff0c06977c3703a7cb0632965f3d8 --- /dev/null +++ b/lib_com/ivas_mcmasa_com.c @@ -0,0 +1,129 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include "ivas_cnst.h" +#include "ivas_prot.h" +#include "options.h" +#include "wmc_auto.h" + + +/*--------------------------------------------------------------------------* + * ivas_mcmasa_setNumTransportChannels() + * + * Set number of transport channels in McMASA + *--------------------------------------------------------------------------*/ + +void ivas_mcmasa_setNumTransportChannels( + int16_t *nchan_transport, /* o : Pointer to number of transport channels to be set */ + int16_t *element_mode, /* o : Pointer to element mode to be set */ + const int32_t ivas_total_brate /* i : Total bitrate of IVAS */ +) +{ + if ( ivas_total_brate >= IVAS_48k ) + { + *nchan_transport = 2; + *element_mode = IVAS_CPE_MDCT; + } + else + { + *nchan_transport = 1; + *element_mode = IVAS_SCE; + } + + return; +} + + +/*--------------------------------------------------------------------------* + * ivas_mcmasa_set_separate_channel_mode() + * + * Set separate channel parameters in McMASA based on bitrate + *--------------------------------------------------------------------------*/ + +void ivas_mcmasa_set_separate_channel_mode( + uint8_t *separateChannelEnabled, /* o : Pointer to separate channel toggle */ + int16_t *separateChannelIndex, /* o : Pointer to separate channel index */ + const int32_t ivas_total_brate /* i : Total bitrate of IVAS */ +) +{ + if ( ivas_total_brate >= MCMASA_SEPARATE_BRATE ) + { + *separateChannelEnabled = 1; + *separateChannelIndex = 2; /* Center channel */ + } + else + { + *separateChannelEnabled = 0; + *separateChannelIndex = 0; + } + + return; +} + + +/*--------------------------------------------------------------------------* + * ivas_mcmasa_split_brate() + * + * Split the total bitrate to elements in McMASA + *--------------------------------------------------------------------------*/ + +void ivas_mcmasa_split_brate( + const uint8_t separateChannelEnabled, /* i : Transport running in "separate channel" mode */ + const int32_t ivas_total_brate, /* i : IVAS total bitrate available to be split */ + const int16_t nSCE, /* i : Number of SCEs in use (0 or 1) */ + const int16_t nCPE, /* i : Number of CPEs in use (0 or 1) */ + int32_t *brate_sce, /* o : Pointer to SCE element bitrate */ + int32_t *brate_cpe /* o : Pointer to CPE element bitrate */ +) +{ + if ( separateChannelEnabled ) + { + /* 25% of total bitrate is used for SCE below 96 kb/s (separated mono channel), otherwise 30% */ + if ( ivas_total_brate < IVAS_96k ) + { + *brate_sce = (int32_t) ( MCMASA_MONOBITRATIO_64k * ivas_total_brate ); + } + else + { + *brate_sce = (int32_t) ( MCMASA_MONOBITRATIO * ivas_total_brate ); + } + + *brate_cpe = ivas_total_brate - *brate_sce; + } + else + { + *brate_sce = nSCE > 0 ? ivas_total_brate / ( nCPE + nSCE ) : 0; + *brate_cpe = nCPE > 0 ? ivas_total_brate / ( nCPE + nSCE ) : 0; + } + + return; +} diff --git a/lib_com/ivas_mct_com.c b/lib_com/ivas_mct_com.c new file mode 100644 index 0000000000000000000000000000000000000000..97c5f5dd8c982fda7ff0b57fc6507869fb957d94 --- /dev/null +++ b/lib_com/ivas_mct_com.c @@ -0,0 +1,194 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "ivas_cnst.h" +#include "ivas_prot.h" +#include "prot.h" +#include "wmc_auto.h" +#include + + +/*-------------------------------------------------------------------* + * Local constants + *-------------------------------------------------------------------*/ + +#define MIN_SAFETY_BITS_LFE 30 +#define MIN_SAFETY_BITS_MC 5 + + +/*-------------------------------------------------------------------* + * splitAvailableBitsMCT() + * + * split available TCX bits among channels + *-------------------------------------------------------------------*/ + +void splitAvailableBitsMCT( + void **sts, /* i/o: encoder/decoder state structure */ + const int16_t total_bits, /* i : total number of available bits */ + const int16_t split_ratio[MCT_MAX_CHANNELS], /* i : ratio for splitting the bits */ + const int16_t enc_dec, /* i : encoder or decoder flag */ + const int16_t nchan /* i : number of channels */ +) +{ + int16_t i, k, nSubframes, diff, bits_split, max_chn, tmp; + int16_t *bits_frame_channel; + int16_t min_chan_bits[MCT_MAX_CHANNELS], min_bits_tot, remaining_bits; + int16_t core[MCT_MAX_CHANNELS]; + MCT_CHAN_MODE mct_chan_mode[MCT_MAX_CHANNELS]; + min_bits_tot = 0; + + for ( i = 0; i < nchan; i++ ) + { + if ( enc_dec == ENC ) + { + mct_chan_mode[i] = ( (Encoder_State *) sts[i] )->mct_chan_mode; + core[i] = ( (Encoder_State *) sts[i] )->core; + } + else + { + mct_chan_mode[i] = ( (Decoder_State *) sts[i] )->mct_chan_mode; + core[i] = ( (Decoder_State *) sts[i] )->core; + } + } + + for ( i = 0; i < nchan; i++ ) + { + if ( + mct_chan_mode[i] != MCT_CHAN_MODE_IGNORE ) + { + min_chan_bits[i] = 0; + + nSubframes = ( core[i] == TCX_20_CORE ) ? 1 : NB_DIV; + + for ( k = 0; k < nSubframes; k++ ) + { + min_chan_bits[i] += SMDCT_MINIMUM_ARITH_BITS + MIN_SAFETY_BITS_MC; + } + min_bits_tot += min_chan_bits[i]; + } + } + + remaining_bits = total_bits - min_bits_tot; + + /*initial value of bits already given*/ + bits_split = 0; + + tmp = 0; + max_chn = 0; + for ( i = 0; i < nchan; i++ ) + { + if ( enc_dec == ENC ) + { + bits_frame_channel = &( (Encoder_State *) sts[i] )->bits_frame_channel; + } + else /* DEC */ + { + bits_frame_channel = &( (Decoder_State *) sts[i] )->bits_frame_channel; + } + + if ( + mct_chan_mode[i] != MCT_CHAN_MODE_IGNORE ) + { + assert( split_ratio[i] >= 1 && split_ratio[i] < BITRATE_MCT_RATIO_RANGE ); + *bits_frame_channel = split_ratio[i] * remaining_bits / BITRATE_MCT_RATIO_RANGE + min_chan_bits[i]; + bits_split += *bits_frame_channel; + + /*determine channel with most bits (energy)*/ + if ( *bits_frame_channel > tmp ) + { + tmp = *bits_frame_channel; + max_chn = i; + } + } + } + + /*if bits distributed are more than available bits, substract the proportional amount of bits from all channels*/ + if ( bits_split != total_bits ) + { + diff = bits_split - total_bits; + + /*re-count bits distributed to each channel*/ + bits_split = 0; + + for ( i = 0; i < nchan; i++ ) + { + if ( enc_dec == ENC ) + { + bits_frame_channel = &( (Encoder_State *) sts[i] )->bits_frame_channel; + } + else /* DEC */ + { + bits_frame_channel = &( (Decoder_State *) sts[i] )->bits_frame_channel; + } + + if ( + mct_chan_mode[i] != MCT_CHAN_MODE_IGNORE ) + { + *bits_frame_channel -= diff * split_ratio[i] / BITRATE_MCT_RATIO_RANGE; + *bits_frame_channel = max( min_chan_bits[i], *bits_frame_channel ); + bits_split += *bits_frame_channel; + } + } + } + + /*if there any bits left assign them to the channel with the maximum energy (or more bits)*/ + if ( total_bits != bits_split ) + { + if ( enc_dec == ENC ) + { + bits_frame_channel = &( (Encoder_State *) sts[max_chn] )->bits_frame_channel; + } + else /* DEC */ + { + bits_frame_channel = &( (Decoder_State *) sts[max_chn] )->bits_frame_channel; + } + + *bits_frame_channel += ( total_bits - bits_split ); + + /*if all channels are silent assign bits to ch 0*/ + if ( enc_dec == ENC ) + { + if ( ( (Encoder_State *) sts[max_chn] )->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) + { + assert( bits_split == 0 ); + + ( (Encoder_State *) sts[max_chn] )->mct_chan_mode = MCT_CHAN_MODE_REGULAR; + ( (Encoder_State *) sts[max_chn] )->side_bits_frame_channel = ( ( (Encoder_State *) sts[max_chn] )->core ) * ( NBITS_TCX_GAIN + NOISE_FILL_RANGES * NBITS_NOISE_FILL_LEVEL ); + *bits_frame_channel -= ( (Encoder_State *) sts[max_chn] )->side_bits_frame_channel; + } + } + } + + return; +} diff --git a/lib_com/ivas_mdct_core_com.c b/lib_com/ivas_mdct_core_com.c new file mode 100644 index 0000000000000000000000000000000000000000..afb5303a7aa82c774655b53c89546ef91656433a --- /dev/null +++ b/lib_com/ivas_mdct_core_com.c @@ -0,0 +1,81 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "ivas_cnst.h" +#include "ivas_prot.h" +#include "prot.h" +#include "wmc_auto.h" + +/*--------------------------------------------------------------------------* + * ivas_mdct_tcx10_bit_distribution() + * + * + *--------------------------------------------------------------------------*/ + +void ivas_mdct_tcx10_bit_distribution( + int16_t target_bitsTCX10[NB_DIV], /* o : target bit distribution */ + const int16_t nbits_tcx, /* i : TCX bits */ + const int16_t nTnsBitsTCX10[NB_DIV] /* i : TNS bits */ +) +{ + int16_t k; + int16_t min_required_bits = NBITS_TCX_GAIN + NOISE_FILL_RANGES * NBITS_NOISE_FILL_LEVEL + SMDCT_MINIMUM_ARITH_BITS; + + for ( k = 0; k < 2; k++ ) + { + if ( nbits_tcx & 1 ) + { + target_bitsTCX10[k] = nbits_tcx / 2 + ( k == 0 ? 1 : 0 ) - nTnsBitsTCX10[k]; + } + else + { + target_bitsTCX10[k] = nbits_tcx / 2 - nTnsBitsTCX10[k]; + } + } + + if ( target_bitsTCX10[0] < min_required_bits ) + { + /*redistribute bits*/ + target_bitsTCX10[1] -= ( min_required_bits - target_bitsTCX10[0] ); + target_bitsTCX10[0] = min_required_bits; + } + else if ( target_bitsTCX10[1] < min_required_bits ) + { + /*redistribute bits*/ + target_bitsTCX10[0] -= ( min_required_bits - target_bitsTCX10[1] ); + target_bitsTCX10[1] = min_required_bits; + } + + return; +} diff --git a/lib_com/ivas_mdct_imdct.c b/lib_com/ivas_mdct_imdct.c new file mode 100644 index 0000000000000000000000000000000000000000..656788717ed7323962a01849ddc46434abdd0cef --- /dev/null +++ b/lib_com/ivas_mdct_imdct.c @@ -0,0 +1,379 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_rom_com.h" +#include "ivas_stat_com.h" +#include "wmc_auto.h" + + +/*------------------------------------------------------------------------------------------* + * Local constants + *------------------------------------------------------------------------------------------*/ + +#define IVAS_MDCT_SCALING_GAIN_48k 1.9699011974118126e-06f +#define IVAS_MDCT_SCALING_GAIN_32k 2.9548517961177197e-06f +#define IVAS_MDCT_SCALING_GAIN_16k 5.909703592235439e-06f + +#define IVAS_IMDCT_SCALING_GAIN 2115.165304808f + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_tda() + * + * Time domain aliasing + *-----------------------------------------------------------------------------------------*/ + +void ivas_tda( + const float *pIn, /* i : time domain buffer of size 2*length */ + float *pOut, /* o : time domain buffer of size length */ + const int16_t length /* i : length of time alised signal buffer */ +) +{ + int16_t i; + int16_t len_by_2 = length >> 1; + + for ( i = 0; i < len_by_2; i++ ) + { + pOut[i] = -pIn[len_by_2 - i - 1] + pIn[len_by_2 + i]; + pOut[len_by_2 + i] = pIn[length * 2 - i - 1] + pIn[length + i]; + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_dct_windowing() + * + * Windowing block, input is passed through Fielder window + *-----------------------------------------------------------------------------------------*/ + +void ivas_dct_windowing( + const int16_t fade_len, + const int16_t full_len, + const int16_t dct_len, + const int16_t zero_pad_len, + const float *pWindow_coeffs, + const int16_t frame_len, + float *pOut_buf, + float *pBuffer_prev, + float *pTemp_lfe ) +{ + int16_t i; + int16_t rem_len = 0; + + mvr2r( pBuffer_prev, pOut_buf + zero_pad_len, fade_len ); + + mvr2r( pTemp_lfe, ( pOut_buf + fade_len + zero_pad_len ), dct_len ); + + for ( i = 0; i < zero_pad_len; i++ ) + { + pOut_buf[i] = 0.0f; + } + + mvr2r( ( pOut_buf + full_len - fade_len ), pBuffer_prev, fade_len ); + + for ( i = 0; i < fade_len; i++ ) + { + pOut_buf[zero_pad_len + i] = pOut_buf[zero_pad_len + i] * pWindow_coeffs[i]; + } + + rem_len = full_len - ( zero_pad_len * 3 + fade_len ); + + for ( i = 0; i < rem_len; i++ ) + { + pOut_buf[zero_pad_len * 3 + fade_len + i] = pOut_buf[zero_pad_len * 3 + fade_len + i] * pWindow_coeffs[fade_len - i - 1]; + } + + for ( i = 0; i < frame_len - full_len; i++ ) + { + pOut_buf[full_len + i] = 0.0f; + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_mdct() + * + * MDCT implementation + *-----------------------------------------------------------------------------------------*/ + +void ivas_mdct( + const float *pIn, + float *pOut, + const int16_t length ) +{ + const float *pTwid_re, *pTwid_im; + int16_t i, len_by_2; + float re[IVAS_480_PT_LEN], im[IVAS_480_PT_LEN]; + float ivas_mdct_scaling_gain; + + len_by_2 = length >> 1; + ivas_mdct_scaling_gain = ivas_get_mdct_scaling_gain( len_by_2 ); + + ivas_get_twid_factors( length, &pTwid_re, &pTwid_im ); + + for ( i = 0; i < len_by_2; i++ ) + { + pOut[i] = -pIn[len_by_2 - i - 1] + pIn[len_by_2 + i]; + pOut[len_by_2 + i] = pIn[length * 2 - i - 1] + pIn[length + i]; + } + + for ( i = 0; i < len_by_2; i++ ) + { + re[i] = -( pOut[2 * i] * pTwid_re[i] + pOut[length - 1 - 2 * i] * pTwid_im[i] ); + im[i] = pOut[length - 1 - 2 * i] * pTwid_re[i] - pOut[2 * i] * pTwid_im[i]; + } + + DoFFT( &re[0], &im[0], len_by_2 ); + + for ( i = 0; i < len_by_2; i++ ) + { + re[i] = re[i] * ivas_mdct_scaling_gain; + im[i] = im[i] * ivas_mdct_scaling_gain; + } + + for ( i = 0; i < len_by_2; i++ ) + { + float tmp; + tmp = re[i] * pTwid_re[i] - im[i] * pTwid_im[i]; + im[i] = im[i] * pTwid_re[i] + re[i] * pTwid_im[i]; + re[i] = tmp; + } + + for ( i = 0; i < len_by_2; i++ ) + { + pOut[length - 2 * i - 1] = re[i]; + pOut[2 * i] = im[i]; + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_ifft_cplx() + * + * Complex IFFT implementation using DoFFT + *-----------------------------------------------------------------------------------------*/ + +static void ivas_ifft_cplx( + float *re, + float *im, + const int16_t length ) +{ + int16_t i; + float ivas_imdct_one_by_powergain = IVAS_IMDCT_SCALING_GAIN; + /*re-arrange inputs to use fft as ifft */ + re[0] = re[0] * ivas_imdct_one_by_powergain; + im[0] = im[0] * ivas_imdct_one_by_powergain; + + for ( i = 1; i <= length >> 1; i++ ) + { + float tmp = re[length - i] * ivas_imdct_one_by_powergain; + re[length - i] = re[i] * ivas_imdct_one_by_powergain; + re[i] = tmp; + + tmp = im[length - i] * ivas_imdct_one_by_powergain; + im[length - i] = im[i] * ivas_imdct_one_by_powergain; + im[i] = tmp; + } + + DoFFT( re, im, (int16_t) length ); + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_itda() + * + * Inverse time domain alias implementation + *-----------------------------------------------------------------------------------------*/ + +void ivas_itda( + const float *re, /* i : time alised signal after IDCT */ + float *pOut, /* o : time domain buffer of size 2*length */ + const int16_t length /* i : length of time alised signal buffer */ +) +{ + int16_t i; + int16_t len_by_2 = length >> 1; + + for ( i = 0; i < len_by_2; i++ ) + { + pOut[i] = -re[len_by_2 - i - 1]; + pOut[len_by_2 + i] = re[i]; + pOut[length + i] = re[len_by_2 + i]; + pOut[3 * len_by_2 + i] = re[length - i - 1]; + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_imdct() + * + * IMDCT implementation + *-----------------------------------------------------------------------------------------*/ + +void ivas_imdct( + const float *pIn, + float *pOut, + const int16_t length ) +{ + const float *pTwid_re, *pTwid_im; + int16_t len_by_2 = length >> 1; + int16_t i; + float re[IVAS_480_PT_LEN]; + float im[IVAS_480_PT_LEN]; + + ivas_get_twid_factors( length, &pTwid_re, &pTwid_im ); + + for ( i = 0; i < len_by_2; i++ ) + { + re[i] = pIn[length - 2 * i - 1] * pTwid_re[i] + pIn[2 * i] * pTwid_im[i]; /*stl_arr_index*/ + im[i] = -pIn[length - 2 * i - 1] * pTwid_im[i] + pIn[2 * i] * pTwid_re[i]; /*stl_arr_index*/ + } + + ivas_ifft_cplx( &re[0], &im[0], len_by_2 ); + + for ( i = 0; i < len_by_2; i++ ) + { + float tmp; + tmp = re[i] * pTwid_re[i] + im[i] * pTwid_im[i]; + im[i] = -re[i] * pTwid_im[i] + im[i] * pTwid_re[i]; + re[i] = tmp; + } + + for ( i = ( len_by_2 - 1 ); i >= 0; i-- ) + { + re[2 * i + 1] = im[( len_by_2 - 1 ) - i]; + re[2 * i] = -re[i]; + } + + for ( i = 0; i < len_by_2; i++ ) + { + pOut[i] = -re[len_by_2 - i - 1]; + pOut[len_by_2 + i] = re[i]; + pOut[length + i] = re[len_by_2 + i]; + pOut[3 * len_by_2 + i] = re[length - i - 1]; + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_get_twid_factors() + * + * Sets/Maps the fft twiddle tables based on fft length + *-----------------------------------------------------------------------------------------*/ + +void ivas_get_twid_factors( + const int16_t length, + const float **pTwid_re, + const float **pTwid_im ) +{ + if ( length == 480 ) + { + *pTwid_re = &ivas_cos_twiddle_480[0]; + *pTwid_im = &ivas_sin_twiddle_480[0]; + } + else if ( length == 320 ) + { + *pTwid_re = &ivas_cos_twiddle_320[0]; + *pTwid_im = &ivas_sin_twiddle_320[0]; + } + else if ( length == 160 ) + { + *pTwid_re = &ivas_cos_twiddle_160[0]; + *pTwid_im = &ivas_sin_twiddle_160[0]; + } + else if ( length == 80 ) + { + *pTwid_re = &ivas_cos_twiddle_80[0]; + *pTwid_im = &ivas_sin_twiddle_80[0]; + } + else + { + assert( !"Not supported FFT length!" ); + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_get_mdct_scaling_gain() + * + * Get scaling gain for MDCT functions + *-----------------------------------------------------------------------------------------*/ + +float ivas_get_mdct_scaling_gain( + const int16_t dct_len_by_2 ) +{ + float gain = 0.0f; + + switch ( dct_len_by_2 ) + { + case L_FRAME48k >> 2: + { + gain = IVAS_MDCT_SCALING_GAIN_48k; + break; + } + case L_FRAME32k >> 2: + { + gain = IVAS_MDCT_SCALING_GAIN_32k; + break; + } + case L_FRAME16k >> 2: + { + gain = IVAS_MDCT_SCALING_GAIN_16k; + break; + } + default: + { + assert( !"Unsupported frame length!" ); + break; + } + } + + return gain; +} diff --git a/lib_com/ivas_mdft_imdft.c b/lib_com/ivas_mdft_imdft.c new file mode 100644 index 0000000000000000000000000000000000000000..73a73231690d3c2509d0a477703951f14b72b89b --- /dev/null +++ b/lib_com/ivas_mdft_imdft.c @@ -0,0 +1,310 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_rom_com.h" +#include +#include "wmc_auto.h" + + +/*-----------------------------------------------------------------------------------------* + * Local constants + *-----------------------------------------------------------------------------------------*/ + +#define IVAS_ONE_BY_960 0.001041666666666666f +#define IVAS_ONE_BY_640 0.0015625f +#define IVAS_ONE_BY_320 0.003125f +#define IVAS_ONE_BY_240 0.004166666666666667f +#define IVAS_ONE_BY_160 0.00625f +#define IVAS_ONE_BY_80 0.0125f + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_get_mdft_twid_factors() + * + * get twiddle tables for MDFT + *-----------------------------------------------------------------------------------------*/ + +static void ivas_get_mdft_twid_factors( + const int16_t length, + const float **ppTwid ) +{ + switch ( length ) + { + case L_FRAME48k: + *ppTwid = &ivas_mdft_coeff_cos_twid_960[0]; + break; + case L_FRAME32k: + *ppTwid = &ivas_mdft_coeff_cos_twid_640[0]; + + break; + case L_FRAME16k: + *ppTwid = &ivas_mdft_coeff_cos_twid_320[0]; + break; + case IVAS_240_PT_LEN: + *ppTwid = &ivas_mdft_coeff_cos_twid_240[0]; + break; + case IVAS_160_PT_LEN: + *ppTwid = &ivas_mdft_coeff_cos_twid_160[0]; + break; + case IVAS_120_PT_LEN: + *ppTwid = &ivas_mdft_coeff_cos_twid_120[0]; + break; + case IVAS_80_PT_LEN: + *ppTwid = &ivas_mdft_coeff_cos_twid_80[0]; + break; + case IVAS_40_PT_LEN: + *ppTwid = &ivas_mdft_coeff_cos_twid_40[0]; + break; + + default: + assert( !"Not supported FFT length!" ); + break; + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_get_imdft_twid_factors() + * + * get twiddle tables for IMDFT + *-----------------------------------------------------------------------------------------*/ + +static void ivas_get_imdft_twid_factors( + const int16_t length, + const float **ppTwid ) +{ + switch ( length ) + { + case L_FRAME48k: + *ppTwid = ivas_mdft_coeff_cos_twid_960; + break; + case L_FRAME32k: + *ppTwid = ivas_mdft_coeff_cos_twid_640; + break; + case L_FRAME16k: + *ppTwid = ivas_mdft_coeff_cos_twid_320; + break; + case 240: + *ppTwid = ivas_mdft_coeff_cos_twid_240; + break; + case 160: + *ppTwid = ivas_mdft_coeff_cos_twid_160; + break; + case 80: + *ppTwid = ivas_mdft_coeff_cos_twid_80; + break; + default: + assert( !"Not supported FFT length!" ); + } + + return; +} + + +static void get_one_by_length( + float *one_by_length, + const int16_t length ) +{ + if ( length == L_FRAME48k ) + { + *one_by_length = IVAS_ONE_BY_960; + } + else if ( length == L_FRAME32k ) + { + *one_by_length = IVAS_ONE_BY_640; + } + else if ( length == L_FRAME16k ) + { + *one_by_length = IVAS_ONE_BY_320; + } + else if ( length == IVAS_240_PT_LEN ) + { + *one_by_length = IVAS_ONE_BY_240; + } + else if ( length == IVAS_160_PT_LEN ) + { + *one_by_length = IVAS_ONE_BY_160; + } + else if ( length == IVAS_80_PT_LEN ) + { + *one_by_length = IVAS_ONE_BY_80; + } + else + { + assert( !"Not supported FFT length!" ); + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_ifft_cplx1() + * + * Complex IFFT implementation using fft() + *-----------------------------------------------------------------------------------------*/ + +static void ivas_ifft_cplx1( + float *re, + float *im, + const int16_t length ) +{ + int16_t i; + float one_by_length, tmp; + + get_one_by_length( &one_by_length, length ); + + /* re-arrange inputs to use fft as ifft */ + re[0] = re[0] * one_by_length; + im[0] = im[0] * one_by_length; + + for ( i = 1; i <= length >> 1; i++ ) + { + tmp = re[length - i] * one_by_length; /*stl_arr_index*/ + re[length - i] = re[i] * one_by_length; /*stl_arr_index*/ + re[i] = tmp; + + tmp = im[length - i] * one_by_length; /*stl_arr_index*/ + im[length - i] = im[i] * one_by_length; /*stl_arr_index*/ + im[i] = tmp; + } + + fft( re, im, length, 1 ); + + return; +} + + +/*-----------------------------------------------------------------------------------------* +* Function ivas_mdft() + +* MDFT implementation +*-----------------------------------------------------------------------------------------*/ + +void ivas_mdft( + const float *pIn, /* i : input time-domain signal */ + float *pOut_re, /* o : Real part of MDFT signal */ + float *pOut_im, /* o : Imag. part of MDFT signal */ + const int16_t input_length, /* i : signal length */ + const int16_t mdft_length /* i : MDFT length */ +) +{ + float re[L_FRAME48k]; + float im[L_FRAME48k]; + int16_t j, len_by_2; + const float *pTwid; + + len_by_2 = mdft_length >> 1; + + ivas_get_mdft_twid_factors( mdft_length, &pTwid ); + + if ( mdft_length == input_length ) + { + for ( j = 0; j < mdft_length; j++ ) + { + re[j] = pIn[j] * pTwid[j]; + im[j] = -pIn[j] * pTwid[mdft_length - j]; + } + } + else + { + for ( j = 0; j < mdft_length; j++ ) + { + re[j] = pIn[j] * pTwid[j] - pIn[j + mdft_length] * pTwid[mdft_length - j]; + im[j] = -pIn[j] * pTwid[mdft_length - j] - pIn[j + mdft_length] * pTwid[j]; + } + } + + fft( re, im, mdft_length, 1 ); + + for ( j = 0; j < len_by_2; j++ ) + { + pOut_re[2 * j] = re[j]; + pOut_re[2 * j + 1] = re[mdft_length - j - 1]; + + pOut_im[2 * j] = im[j]; + pOut_im[2 * j + 1] = -im[mdft_length - j - 1]; + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_imdft() + * + * iMDFT implementation + * out buffer needs to have 2*length worth memory + *-----------------------------------------------------------------------------------------*/ + +void ivas_imdft( + const float *pRe, /* i : Real part of MDFT signal */ + const float *pIm, /* i : Imag. part of MDFT signal */ + float *pOut, /* o : output time-domain signal */ + const int16_t length /* i : signal length */ +) +{ + float *re_tmp = pOut; + float *im_tmp = pOut + length; + float tmp; + int16_t j; + int16_t len_by_2 = length >> 1; + const float *pTwid; + + ivas_get_imdft_twid_factors( length, &pTwid ); + + for ( j = 0; j < len_by_2; j++ ) + { + re_tmp[j] = pRe[2 * j]; + re_tmp[j + len_by_2] = pRe[length - 2 * j - 1]; + + im_tmp[j] = pIm[2 * j]; + im_tmp[j + len_by_2] = -pIm[length - 2 * j - 1]; + } + + ivas_ifft_cplx1( re_tmp, im_tmp, length ); + + for ( j = 0; j < length; j++ ) + { + tmp = re_tmp[j] * pTwid[j] - im_tmp[j] * pTwid[length - j]; + im_tmp[j] = -( re_tmp[j] * pTwid[length - j] + im_tmp[j] * pTwid[j] ); + re_tmp[j] = tmp; + } + + return; +} diff --git a/lib_com/ivas_omasa_com.c b/lib_com/ivas_omasa_com.c new file mode 100644 index 0000000000000000000000000000000000000000..31874a7b52b295b9224516cb327b3ee778d4d607 --- /dev/null +++ b/lib_com/ivas_omasa_com.c @@ -0,0 +1,569 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include "options.h" +#include +#include "ivas_cnst.h" +#include "ivas_prot.h" +#include "prot.h" +#include "ivas_rom_com.h" +#include + +/*--------------------------------------------------------------- + * Local constants + *---------------------------------------------------------------*/ + +#define GAMMA_ISM_LOW_IMP 0.8f +#define GAMMA_ISM_MEDIUM_IMP 1.2f +#define GAMMA_ISM_HIGH_IMP 1.4f + +#define GAMMA_ISM_LOW_IMP2 0.9f +#define GAMMA_ISM_MEDIUM_IMP2 1.2f +#define GAMMA_ISM_HIGH_IMP2 1.35f + +#define GAMMA_ISM_LOW_IMP3 0.85f +#define GAMMA_ISM_MEDIUM_IMP3 1.15f +#define GAMMA_ISM_HIGH_IMP3 1.3f + +#define GAMMA_ISM_LOW_IMP4 0.8f +#define GAMMA_ISM_MEDIUM_IMP4 1.0f +#define GAMMA_ISM_HIGH_IMP4 1.2f + + +/*--------------------------------------------------------------- + * ivas_omasa_ism_mode_select() + * + * selects the ISM mode base on IVAS total bit-rate and + * the number of objects in the combined ISM MASA format mode + * ---------------------------------------------------------------*/ + +/*! r : ISM format mode */ +ISM_MODE ivas_omasa_ism_mode_select( + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + const int16_t nchan_ism /* i : number of input ISM's */ +) +{ + ISM_MODE ism_mode = ISM_MODE_NONE; + + switch ( nchan_ism ) + { + case 1: + if ( ivas_total_brate >= IVAS_24k4 ) + { + ism_mode = ISM_MASA_MODE_DISC; + } + else + { + ism_mode = ISM_MODE_NONE; + } + break; + case 2: + if ( ivas_total_brate >= IVAS_48k ) + { + ism_mode = ISM_MASA_MODE_DISC; + } + else if ( ivas_total_brate >= IVAS_32k ) + { + ism_mode = ISM_MASA_MODE_PARAM_ONE_OBJ; + } + else + { + ism_mode = ISM_MODE_NONE; + } + break; + case 3: + if ( ivas_total_brate >= IVAS_96k ) + { + ism_mode = ISM_MASA_MODE_DISC; + } + else if ( ivas_total_brate >= IVAS_64k ) + { + ism_mode = ISM_MASA_MODE_PARAM_ONE_OBJ; + } + else if ( ivas_total_brate >= IVAS_32k ) + { + ism_mode = ISM_MASA_MODE_MASA_ONE_OBJ; + } + else + { + ism_mode = ISM_MODE_NONE; + } + break; + case 4: + if ( ivas_total_brate >= IVAS_128k ) + { + ism_mode = ISM_MASA_MODE_DISC; + } + else if ( ivas_total_brate >= IVAS_64k ) + { + ism_mode = ISM_MASA_MODE_PARAM_ONE_OBJ; + } + else if ( ivas_total_brate >= IVAS_32k ) + { + ism_mode = ISM_MASA_MODE_MASA_ONE_OBJ; + } + else + { + ism_mode = ISM_MODE_NONE; + } + break; + } + + return ism_mode; +} + + +/*--------------------------------------------------------------- + * ivas_set_omasa_TC() + * + * set number of transport channels in OMASA format + * ---------------------------------------------------------------*/ + +void ivas_set_omasa_TC( + const ISM_MODE ism_mode, /* i : ISM mode */ + const int16_t nchan_ism, /* i : number of input ISMs */ + int16_t *nSCE, /* o : number of SCEs */ + int16_t *nCPE /* o : number of CPEs */ +) +{ + switch ( ism_mode ) + { + case ISM_MASA_MODE_MASA_ONE_OBJ: + case ISM_MASA_MODE_PARAM_ONE_OBJ: + *nCPE = 1; + *nSCE = 1; + break; + case ISM_MASA_MODE_DISC: + *nCPE = 1; + *nSCE = nchan_ism; + break; + case ISM_MODE_NONE: + *nCPE = 1; + *nSCE = 0; + break; + default: + break; + } + + return; +} + + +/*--------------------------------------------------------------- + * ivas_interformat_brate() + * + * Bit-budget distribution in case of combined-format coding + * ---------------------------------------------------------------*/ + +/*! r: adjusted bitrate */ +int32_t ivas_interformat_brate( + const ISM_MODE ism_mode, /* i : ISM mode */ + const int16_t nchan_ism, /* i : number of ISM channels */ + const int32_t element_brate, /* i : element bitrate */ + const int16_t ism_imp, /* i : ISM importance flag */ + const int16_t limit_flag /* i : flag to limit the bitrate increase */ +) +{ + int32_t element_brate_out; + int16_t nBits, limit_low, limit_high; + + nBits = (int16_t) ( element_brate / FRAMES_PER_SEC ); + + if ( ism_imp == ISM_INACTIVE_IMP ) + { + nBits = BITS_ISM_INACTIVE; + } + else + { + if ( ism_mode == ISM_MASA_MODE_DISC && ( ( nchan_ism == 4 && element_brate == 24000 ) || ( nchan_ism == 3 && element_brate <= 24000 ) || ( nchan_ism == 2 && element_brate <= 11000 ) ) ) /* for border case in DISC mode */ + { + if ( limit_flag == 1 && ( ( nchan_ism == 4 && element_brate == 24000 ) || ( nchan_ism == 3 && element_brate == 20000 ) || ( nchan_ism == 2 && element_brate <= 11000 ) ) ) + { + return element_brate; + } + + if ( ism_imp == ISM_LOW_IMP ) + { + nBits = (int16_t) ( nBits * GAMMA_ISM_LOW_IMP4 ); + } + else if ( ism_imp == ISM_MEDIUM_IMP ) + { + nBits = (int16_t) ( nBits * GAMMA_ISM_MEDIUM_IMP4 ); + if ( limit_flag == -1 ) + { + nBits = (int16_t) ( nBits * GAMMA_ISM_HIGH_IMP4 ); + } + } + else /* ISM_HIGH_IMP */ + { + nBits = (int16_t) ( nBits * GAMMA_ISM_HIGH_IMP4 ); + if ( limit_flag == -1 ) + { + nBits = (int16_t) ( nBits * GAMMA_ISM_HIGH_IMP4 ); + } + } + } + else if ( ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ || + ( ism_mode == ISM_MASA_MODE_DISC && element_brate == 9600 ) /* this condition corresponds to the ivas_total_brate = 24400 and 1 object */ + ) + { + if ( ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ && element_brate == IVAS_13k2 ) + { + if ( ism_imp == ISM_LOW_IMP ) + { + nBits = (int16_t) ( nBits * GAMMA_ISM_LOW_IMP3 ); + } + else if ( ism_imp == ISM_MEDIUM_IMP ) + { + nBits = (int16_t) ( nBits * GAMMA_ISM_MEDIUM_IMP3 ); + } + else /* ISM_HIGH_IMP */ + { + nBits = (int16_t) ( nBits * GAMMA_ISM_HIGH_IMP4 ); + } + } + else + { + if ( ism_imp == ISM_LOW_IMP ) + { + nBits = (int16_t) ( nBits * GAMMA_ISM_LOW_IMP3 ); + } + else if ( ism_imp == ISM_MEDIUM_IMP ) + { + nBits = (int16_t) ( nBits * GAMMA_ISM_MEDIUM_IMP3 ); + } + else /* ISM_HIGH_IMP */ + { + nBits = (int16_t) ( nBits * GAMMA_ISM_HIGH_IMP3 ); + } + } + } + else if ( ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ && element_brate == 16000 ) + { + if ( ism_imp == ISM_LOW_IMP ) + { + nBits = (int16_t) ( nBits * GAMMA_ISM_LOW_IMP ); + } + else if ( ism_imp == ISM_MEDIUM_IMP ) + { + nBits = (int16_t) ( nBits * GAMMA_ISM_MEDIUM_IMP ); + } + else /* ISM_HIGH_IMP */ + { + nBits = (int16_t) ( nBits * GAMMA_ISM_HIGH_IMP3 ); + } + } + else + { + if ( ism_imp == ISM_LOW_IMP ) + { + nBits = (int16_t) ( nBits * GAMMA_ISM_LOW_IMP ); + } + else if ( ism_imp == ISM_MEDIUM_IMP ) + { + nBits = (int16_t) ( nBits * GAMMA_ISM_MEDIUM_IMP ); + } + else /* ISM_HIGH_IMP */ + { + nBits = (int16_t) ( nBits * GAMMA_ISM_HIGH_IMP ); + } + } + } + + limit_low = MIN_BRATE_SWB_BWE / FRAMES_PER_SEC; + if ( ism_imp == ISM_INACTIVE_IMP ) + { + limit_low = BITS_ISM_INACTIVE; + } + else if ( element_brate >= SCE_CORE_16k_LOW_LIMIT ) + { + limit_low = SCE_CORE_16k_LOW_LIMIT / FRAMES_PER_SEC; + } + + limit_high = IVAS_512k / FRAMES_PER_SEC; + if ( element_brate < SCE_CORE_16k_LOW_LIMIT ) + { + limit_high = ACELP_12k8_HIGH_LIMIT / FRAMES_PER_SEC; + } + + nBits = check_bounds_s( nBits, limit_low, limit_high ); + + element_brate_out = nBits * FRAMES_PER_SEC; + + return element_brate_out; +} + + +/*--------------------------------------------------------------- + * ivas_combined_format_brate_sanity() + * + * Sanity check in combined format coding + * ---------------------------------------------------------------*/ + +void ivas_combined_format_brate_sanity( + const int32_t element_brate, /* i : element bitrate */ + const int16_t core, /* i : core */ + const int32_t total_brate, /* i : total bitrate */ + int32_t *core_brate, /* i/o: core bitrate */ + int16_t *inactive_coder_type_flag, /* o : inactive coder_type flag */ + int16_t *diff_nBits /* o : number of differential bits */ +) +{ + int16_t limit_high, nBits; + int32_t brate_diff; + + brate_diff = total_brate - *core_brate; + + /* sanity check: at lowest IVAS bit-rates and one ISM channel coded by + low-rate core-coder mode, it can happen that the CPE (MASA) bit-budget + for ACELP core-coding @12.8 kHz is too high */ + + if ( element_brate < ACELP_12k8_HIGH_LIMIT ) + { + limit_high = ACELP_12k8_HIGH_LIMIT / FRAMES_PER_SEC; + nBits = (int16_t) ( *core_brate / FRAMES_PER_SEC ); + + *diff_nBits = nBits - limit_high; + if ( *diff_nBits > 0 ) + { + if ( core == TCX_20_CORE || core == TCX_10_CORE ) + { + *diff_nBits = 0; + } + else /* ACELP core */ + { + *core_brate -= ( *diff_nBits * FRAMES_PER_SEC ); + } + } + } + + /*-----------------------------------------------------------------* + * set inactive coder_type flag in ACELP core + *-----------------------------------------------------------------*/ + + if ( core == ACELP_CORE ) + { + *inactive_coder_type_flag = 0; /* AVQ by default */ + if ( *core_brate + brate_diff <= MAX_GSC_INACTIVE_BRATE ) + { + *inactive_coder_type_flag = 1; /* GSC */ + } + } + + return; +} + + +/*--------------------------------------------------------------- + * bits_index_ism_ratio() + * + * + * ---------------------------------------------------------------*/ + +/*!r : number of bits for ISM ratio index */ +int16_t bits_index_ism_ratio( + const int16_t nchan_ism /* i : number of objects */ +) +{ + int16_t bits_index; + + bits_index = 0; + if ( nchan_ism == 2 ) + { + bits_index = 3; + } + else if ( nchan_ism == 3 ) + { + bits_index = 6; + } + else if ( nchan_ism == 4 ) + { + bits_index = 7; + } + else + { + assert( ( nchan_ism >= 2 && nchan_ism <= 4 ) && "Wrong number of objects for MASA_ISM." ); + } + + return bits_index; +} + + +/*--------------------------------------------------------------- + * calculate_nbits_meta() + * + * + * ---------------------------------------------------------------*/ + +void calculate_nbits_meta( + const int16_t nchan_ism, + float q_energy_ratio_ism[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS][MAX_NUM_OBJECTS], + float masa_to_total_energy_ratio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], + const int16_t numSf, + const int16_t numCodingBands, + int16_t *bits_ism, + const int16_t idx_sep_obj, + const int16_t ism_imp ) +{ + int16_t sf, band, obj; + float priority[MAX_NUM_OBJECTS], max_p; + + if ( nchan_ism > 1 ) + { + set_f( priority, 0.0f, nchan_ism ); + for ( sf = 0; sf < numSf; sf++ ) + { + for ( band = 0; band < numCodingBands; band++ ) + { + for ( obj = 0; obj < nchan_ism; obj++ ) + { + priority[obj] = max( priority[obj], ( q_energy_ratio_ism[sf][band][obj] * ( 1 - masa_to_total_energy_ratio[sf][band] ) ) ); + } + } + } + } + else + { + priority[0] = 1; + } + + /* decide parameters for ISM metadata quantization */ + maximum( priority, nchan_ism, &max_p ); + for ( obj = 0; obj < nchan_ism; obj++ ) + { + if ( obj == idx_sep_obj ) + { + if ( ism_imp == 3 ) + { + priority[obj] = 1; + } + else if ( ism_imp == 2 ) + { + priority[obj] = ( 1 + max_p ) * 0.5f; + } + else + { + priority[obj] = max_p; + } + } + bits_ism[obj] = bits_direction_masa[0] - (int16_t) ( ( 1 - ( (int16_t) ( priority[obj] * 1000.0f ) ) * 0.001f ) * 6 ); + } + + return; +} + + +/*--------------------------------------------------------------- + * ivas_get_stereo_panning_gains() + * + * + *---------------------------------------------------------------*/ + +void ivas_get_stereo_panning_gains( + const float aziDeg, + const float eleDeg, + float panningGains[2] ) +{ + float aziRad, eleRad; + float y, mappedX, aziRadMapped, A, A2, A3; + const float LsAngleRad = 30.0f * PI_OVER_180; + /* Convert azi and ele to an azi value of the cone of confusion */ + aziRad = aziDeg * PI_OVER_180; + eleRad = eleDeg * PI_OVER_180; + y = ( sinf( aziRad ) * cosf( eleRad ) ); + mappedX = sqrtf( max( 0.0f, 1.0f - ( y * y ) ) ); + aziRadMapped = atan2f( y, mappedX ); + + if ( aziRadMapped >= LsAngleRad ) + { /* Left side */ + panningGains[0] = 1.0f; + panningGains[1] = 0.0f; + } + else if ( aziRadMapped <= -LsAngleRad ) + { /* Right side */ + panningGains[0] = 0.0f; + panningGains[1] = 1.0f; + } + else /* Tangent panning law */ + { + A = tanf( aziRadMapped ) / tanf( LsAngleRad ); + A2 = ( A - 1.0f ) / max( 0.001f, A + 1.0f ); + A3 = 1.0f / ( A2 * A2 + 1.0f ); + panningGains[0] = sqrtf( A3 ); + panningGains[1] = sqrtf( 1.0f - A3 ); + } + + return; +} + + +/*--------------------------------------------------------------- + * calculate_brate_limit_flag() + * + * + *---------------------------------------------------------------*/ + +/*! r: limitation flag */ +int16_t calculate_brate_limit_flag( + const int16_t ism_imp[], /* i : ISM importance flags */ + const int16_t nchan_ism /* i : number of objects */ +) +{ + int16_t n; + int16_t brate_limit_flag; + int16_t nzeros; + + brate_limit_flag = 0; + nzeros = 0; + for ( n = 0; n < nchan_ism; n++ ) + { + brate_limit_flag += ism_imp[n]; + if ( ism_imp[n] == 0 ) + { + nzeros++; + } + } + + if ( brate_limit_flag >= (int16_t) ( nchan_ism * 2.5f ) ) + { + brate_limit_flag = 1; + } + else + { + if ( nzeros / (float) nchan_ism >= 0.5f ) + { + brate_limit_flag = -1; /* there is no limitation, on the contrary */ + } + } + + return brate_limit_flag; +} diff --git a/lib_com/ivas_pca_tools.c b/lib_com/ivas_pca_tools.c new file mode 100644 index 0000000000000000000000000000000000000000..a9dcffd1e69f6319c49145ad9d3282787bd0b634 --- /dev/null +++ b/lib_com/ivas_pca_tools.c @@ -0,0 +1,1118 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "ivas_prot.h" +#include "ivas_cnst.h" +#include +#include +#include "ivas_rom_com.h" +#include "wmc_auto.h" +#include "prot.h" + + +/*---------------------------------------------------------------------* + * eye_matrix() + * + *---------------------------------------------------------------------*/ + +void eye_matrix( + float *mat, + const int16_t n, + const float d ) +{ + int16_t i; + + for ( i = 0; i < n * n; i++ ) + { + mat[i] = 0.0f; + } + for ( i = 0; i < n; i++ ) + { + mat[i * n + i] = d; + } + + return; +} + + +/*---------------------------------------------------------------------* + * cov() + * + * Compute covariance of input channels + *---------------------------------------------------------------------*/ + +void cov_subfr( + float **ptr_sig, + float *r, + const int16_t n_channels, + const int16_t len ) +{ + float s; + int16_t j, k, l; + float *t, *tt; + + /* Compute diagonal r[k][k] */ + for ( k = 0; k < n_channels; k++ ) + { + t = &ptr_sig[k][0]; + s = t[0] * t[0]; + for ( j = 1; j < len; j++ ) + { + s += t[j] * t[j]; + } + r[k * n_channels + k] = s; + } + + /* Compute off-diagonal r[k][l] = r[l][k] */ + for ( k = 0; k < ( n_channels - 1 ); k++ ) + { + t = &ptr_sig[k][0]; + for ( l = k + 1; l < n_channels; l++ ) + { + tt = &ptr_sig[l][0]; + s = t[0] * tt[0]; + for ( j = 1; j < len; j++ ) + { + s += t[j] * tt[j]; + } + r[k * n_channels + l] = s; + r[l * n_channels + k] = s; + } + } + + return; +} + + +static void house_refl( + const float *px, + const int16_t sizex, + float *pu, + float *normu ) +{ + int16_t i; + + mvr2r( px, pu, sizex ); + ( *normu ) = dotp( pu, pu, sizex ); + ( *normu ) = sqrtf( *normu ); + + if ( ( *normu ) == 0.f ) + { + pu[0] = SQRT2; + } + else + { + float rcp = 1.f / ( *normu ); + + for ( i = 0; i < sizex; i++ ) + { + pu[i] *= rcp; + } + if ( pu[0] >= 0.f ) + { + pu[0] += 1; + ( *normu ) = -( *normu ); + } + else + { + pu[0] -= 1; + } + + rcp = inv_sqrt( fabsf( pu[0] ) ); + + for ( i = 0; i < sizex; i++ ) + { + pu[i] *= rcp; + } + } + + return; +} + + +static void house_qr( + const float *pA, + float *pQ, + float *pR, + const int16_t n ) +{ + int16_t n_rows = FOA_CHANNELS; + float A[FOA_CHANNELS * FOA_CHANNELS]; + float U[FOA_CHANNELS * FOA_CHANNELS]; + float pu[FOA_CHANNELS]; + float pa[FOA_CHANNELS]; + float pv[FOA_CHANNELS]; + int16_t i, j, k, c, s, r; + + mvr2r( pA, A, FOA_CHANNELS * FOA_CHANNELS ); + set_zero( U, FOA_CHANNELS * FOA_CHANNELS ); + set_zero( pR, FOA_CHANNELS * FOA_CHANNELS ); + + for ( k = 0; k < n_rows; k++ ) + { + for ( i = 0; i < n_rows; i++ ) + { + pa[i] = A[i * n + k]; + } + + house_refl( &pa[k], n_rows - k, pu, &pR[k * n_rows + k] ); + U[k * n_rows + k] = pu[0]; + for ( c = k + 1; c < n_rows; c++ ) + { + for ( i = 0; i < n_rows; i++ ) + { + pa[i] = A[i * n + c]; + } + pv[c - k - 1] = dotp( pu, &pa[k], n_rows - k ); + U[c * n_rows + k] = pu[c - k]; + } + + i = 0; + for ( s = k; s < n_rows; s++ ) + { + j = 0; + for ( r = k + 1; r < n_rows; r++ ) + { + A[s * n_rows + r] -= ( pu[i] * pv[j] ); + j++; + } + i++; + } + + for ( r = k + 1; r < n_rows; r++ ) + { + pR[k * n_rows + r] = A[k * n_rows + r]; + } + } + + eye_matrix( pQ, FOA_CHANNELS, 1.0f ); + + for ( k = FOA_CHANNELS - 1; k >= 0; k-- ) + { + for ( i = 0; i < n_rows; i++ ) + { + pu[i] = U[i * n + k]; + } + + for ( s = k; s < n_rows; s++ ) + { + for ( i = 0; i < n_rows; i++ ) + { + pa[i] = pQ[i * n + s]; + } + pv[s - k] = dotp( &pu[k], &pa[k], n_rows - k ); + } + for ( s = k; s < n_rows; s++ ) + { + for ( r = k; r < n_rows; r++ ) + { + pQ[s * n_rows + r] -= U[s * n_rows + k] * pv[r - k]; + } + } + } + + return; +} + + +/*---------------------------------------------------------------------* + * eig_qr() + * + * Compute eigenvalue decomposition by QR method + *---------------------------------------------------------------------*/ + +void eig_qr( + const float *A, + const int16_t num_iter, + float *EV, + float *Vals, + const int16_t n ) +{ + int16_t i; + int16_t breakcnd, iter_num; + float Ak[FOA_CHANNELS * FOA_CHANNELS], Qk[FOA_CHANNELS * FOA_CHANNELS], Rk[FOA_CHANNELS * FOA_CHANNELS], D[FOA_CHANNELS * FOA_CHANNELS], d; + + assert( n <= FOA_CHANNELS ); + breakcnd = 1; + iter_num = 0; + + /* check zero matrix */ + d = dotp( A, A, n * n ); + if ( d != 0. ) + { + breakcnd = 0; + } + + /* duplicate */ + mvr2r( A, Ak, n * n ); + + /* identity */ + set_zero( EV, n * n ); + for ( i = 0; i < n; i++ ) + { + EV[i * n + i] = 1.0f; + } + + set_zero( Vals, n ); + + while ( breakcnd == 0 ) + { + iter_num++; + mvr2r( Ak, D, n * n ); + + /* set diagonal */ + for ( i = 0; i < n; i++ ) + { + D[i * n + i] = Vals[i]; + } + + /* stop condition */ + d = dotp( D, D, n * n ); + d = sqrtf( d ); /* Frobenius norm */ + + if ( ( d < 1e-10f ) || ( iter_num >= num_iter ) ) + { + breakcnd = 1; + } + + house_qr( Ak, Qk, Rk, n ); + + matrix_product( Qk, n, n, 0, Rk, n, n, 0, Ak ); + matrix_product( Qk, n, n, 0, EV, n, n, 0, D ); + + mvr2r( D, EV, n * n ); + } + + /* get diagonal */ + for ( i = 0; i < n; i++ ) + { + Vals[i] = Ak[i * n + i]; + } + + return; +} + + +/*---------------------------------------------------------------------* + * exhst_4x4() + * + * Find optimal permutation of eigenvectors + *---------------------------------------------------------------------*/ + +void exhst_4x4( + float *cost_mtx, + int16_t *path, + const int16_t maximize ) +{ + int16_t i, j, k, l; + float opt_val, cost; + + if ( maximize == 0 ) + { + opt_val = 1e30f; + } + else + { + opt_val = -1e30f; + } + + for ( i = 0; i < 1; i++ ) + { + for ( j = 0; j < 4; j++ ) + { + if ( j != i ) + { + for ( k = 0; k < 4; k++ ) + { + if ( ( k != i ) && ( k != j ) ) + { + for ( l = 0; l < 4; l++ ) + { + if ( ( l != i ) && ( l != j ) && ( l != k ) ) + { + cost = cost_mtx[0 * 4 + i] + cost_mtx[1 * 4 + j] + cost_mtx[2 * 4 + k] + cost_mtx[3 * 4 + l]; + if ( ( ( maximize == 0 ) && ( opt_val > cost ) ) || ( ( maximize != 0 ) && ( opt_val < cost ) ) ) + { + opt_val = cost; + path[0] = i; + path[1] = j; + path[2] = k; + path[3] = l; + } + } + } + } + } + } + } + } + + return; +} + + +/*---------------------------------------------------------------------* + * mat2dquat() + * + * Convert 4D matrix -> double quaternion + *---------------------------------------------------------------------*/ + +void mat2dquat( + const float *a, + float *ql, + float *qr ) +{ + float AM[16], M2[16], tmp_l, tmp_r, temp, ql_max, qr_max; + int16_t i, j, k, i_ql, i_qr; + + /* compute associate matrix */ + AM[0 * 4 + 0] = ( a[0 * 4 + 0] + a[1 * 4 + 1] + a[2 * 4 + 2] + a[3 * 4 + 3] ) / 4.0f; + AM[1 * 4 + 0] = ( a[1 * 4 + 0] - a[0 * 4 + 1] + a[3 * 4 + 2] - a[2 * 4 + 3] ) / 4.0f; + AM[2 * 4 + 0] = ( a[2 * 4 + 0] - a[3 * 4 + 1] - a[0 * 4 + 2] + a[1 * 4 + 3] ) / 4.0f; + AM[3 * 4 + 0] = ( a[3 * 4 + 0] + a[2 * 4 + 1] - a[1 * 4 + 2] - a[0 * 4 + 3] ) / 4.0f; + AM[0 * 4 + 1] = ( a[1 * 4 + 0] - a[0 * 4 + 1] - a[3 * 4 + 2] + a[2 * 4 + 3] ) / 4.0f; + AM[1 * 4 + 1] = ( -a[0 * 4 + 0] - a[1 * 4 + 1] + a[2 * 4 + 2] + a[3 * 4 + 3] ) / 4.0f; + AM[2 * 4 + 1] = ( -a[3 * 4 + 0] - a[2 * 4 + 1] - a[1 * 4 + 2] - a[0 * 4 + 3] ) / 4.0f; + AM[3 * 4 + 1] = ( a[2 * 4 + 0] - a[3 * 4 + 1] + a[0 * 4 + 2] - a[1 * 4 + 3] ) / 4.0f; + AM[0 * 4 + 2] = ( a[2 * 4 + 0] + a[3 * 4 + 1] - a[0 * 4 + 2] - a[1 * 4 + 3] ) / 4.0f; + AM[1 * 4 + 2] = ( a[3 * 4 + 0] - a[2 * 4 + 1] - a[1 * 4 + 2] + a[0 * 4 + 3] ) / 4.0f; + AM[2 * 4 + 2] = ( -a[0 * 4 + 0] + a[1 * 4 + 1] - a[2 * 4 + 2] + a[3 * 4 + 3] ) / 4.0f; + AM[3 * 4 + 2] = ( -a[1 * 4 + 0] - a[0 * 4 + 1] - a[3 * 4 + 2] - a[2 * 4 + 3] ) / 4.0f; + AM[0 * 4 + 3] = ( a[3 * 4 + 0] - a[2 * 4 + 1] + a[1 * 4 + 2] - a[0 * 4 + 3] ) / 4.0f; + AM[1 * 4 + 3] = ( -a[2 * 4 + 0] - a[3 * 4 + 1] - a[0 * 4 + 2] - a[1 * 4 + 3] ) / 4.0f; + AM[2 * 4 + 3] = ( a[1 * 4 + 0] + a[0 * 4 + 1] - a[3 * 4 + 2] - a[2 * 4 + 3] ) / 4.0f; + AM[3 * 4 + 3] = ( -a[0 * 4 + 0] + a[1 * 4 + 1] + a[2 * 4 + 2] - a[3 * 4 + 3] ) / 4.0f; + + /* compute squared matrix */ + for ( i = 0; i < 16; i++ ) + { + M2[i] = AM[i] * AM[i]; + } + + /* determine (absolute) left and right terms */ + i_ql = 0; + i_qr = 0; + ql_max = -1; + qr_max = -1; + + for ( i = 0; i < 4; i++ ) + { + tmp_l = 0.f; + tmp_r = 0.f; + for ( j = 0; j < 4; j++ ) + { + /* sum over row */ + tmp_l += M2[i * 4 + j]; + /* sum over column */ + tmp_r += M2[j * 4 + i]; + } + + ql[i] = sqrtf( tmp_l ); + if ( ql[i] > ql_max ) + { + ql_max = ql[i]; + i_ql = i; + } + + qr[i] = sqrtf( tmp_r ); + if ( qr[i] > qr_max ) + { + qr_max = qr[i]; + i_qr = i; + } + } + + /* set signs */ + for ( k = 0; k < 4; k++ ) + { + if ( AM[i_ql * 4 + k] < 0 ) + { + qr[k] = -qr[k]; + } + } + + for ( k = 0; k < 4; k++ ) + { + temp = AM[k * 4 + i_qr] * ( ql[k] * qr[i_qr] ); + if ( temp < 0 ) + { + ql[k] = -ql[k]; + } + } + + return; +} + + +/*---------------------------------------------------------------------* + * dquat2mat() + * + * Convert double quaternion -> 4D matrix + *---------------------------------------------------------------------*/ + +void dquat2mat( + const float *ql, + const float *qr, + float *m ) +{ + float a, b, c, d; + float w, x, y, z; + float aw, ax, ay, az; + float bw, bx, by, bz; + float cw, cx, cy, cz; + float dw, dx, dy, dz; + + a = ql[0]; + b = ql[1]; + c = ql[2]; + d = ql[3]; + w = qr[0]; + x = qr[1]; + y = qr[2]; + z = qr[3]; + aw = a * w; + ax = a * x; + ay = a * y; + az = a * z; + bw = b * w; + bx = b * x; + by = b * y; + bz = b * z; + cw = c * w; + cx = c * x; + cy = c * y; + cz = c * z; + dw = d * w; + dx = d * x; + dy = d * y; + dz = d * z; + m[0] = aw - bx - cy - dz; + m[1] = -ax - bw + cz - dy; + m[2] = -ay - bz - cw + dx; + m[3] = -az + by - cx - dw; + m[4] = bw + ax - dy + cz; + m[5] = -bx + aw + dz + cy; + m[6] = -by + az - dw - cx; + m[7] = -bz - ay - dx + cw; + m[8] = cw + dx + ay - bz; + m[9] = -cx + dw - az - by; + m[10] = -cy + dz + aw + bx; + m[11] = -cz - dy + ax - bw; + m[12] = dw - cx + by + az; + m[13] = -dx - cw - bz + ay; + m[14] = -dy - cz + bw - ax; + m[15] = -dz + cy + bx + aw; + + return; +} + + +/*---------------------------------------------------------------------* + * quat_shortestpath() + * + * Shortest path verification (prior to quaternion interpolation) + *---------------------------------------------------------------------*/ + +void quat_shortestpath( + const float *q00, + float *q01, + const float *q10, + float *q11 ) +{ + float d0, d1; + int16_t res, i; + + d0 = dotp( q00, q01, IVAS_PCA_INTERP ); + d1 = dotp( q10, q11, IVAS_PCA_INTERP ); + + res = 0; + if ( ( d0 < 0. ) && ( d1 < 0. ) ) + { + res = 1; + } + else + { + if ( d0 < 0. ) + { + if ( ( -d0 ) > d1 ) + { + res = 1; + } + } + else + { + if ( d1 < 0. ) + { + if ( ( -d1 ) > d0 ) + { + res = 1; + } + } + } + } + + if ( res ) + { + for ( i = 0; i < IVAS_PCA_INTERP; i++ ) + { + q01[i] = -q01[i]; + q11[i] = -q11[i]; + } + } + + return; +} + + +/*---------------------------------------------------------------------* + * mat_det4() + * + * Compute determinant of 4D matrix - brute-force version + *---------------------------------------------------------------------*/ + +float mat_det4( + const float *m ) +{ + float d; + +#define a11 m[0] +#define a12 m[1] +#define a13 m[2] +#define a14 m[3] +#define a21 m[4] +#define a22 m[5] +#define a23 m[6] +#define a24 m[7] +#define a31 m[8] +#define a32 m[9] +#define a33 m[10] +#define a34 m[11] +#define a41 m[12] +#define a42 m[13] +#define a43 m[14] +#define a44 m[15] + + /* 4! = 24 terms -> complexity = 24x(4 INDIRECT + 3 MULT) + 23 ADD */ + d = a11 * a22 * a33 * a44 + a11 * a24 * a32 * a43 + a11 * a23 * a34 * a42 - a11 * a24 * a33 * a42 - a11 * a22 * a34 * a43 - + a11 * a23 * a32 * a44 - a12 * a21 * a33 * a44 - a12 * a23 * a34 * a41 - a12 * a24 * a31 * a43 + a12 * a24 * a33 * a41 + + a12 * a21 * a34 * a43 + a12 * a23 * a31 * a44 + a13 * a21 * a32 * a44 + a13 * a22 * a34 * a41 + a13 * a24 * a31 * a42 - + a13 * a24 * a32 * a41 - a13 * a21 * a34 * a42 - a13 * a22 * a31 * a44 - a14 * a21 * a32 * a43 - a14 * a22 * a33 * a41 - + a14 * a23 * a31 * a42 + a14 * a23 * a32 * a41 + a14 * a21 * a33 * a42 + a14 * a22 * a31 * a43; + + return d; +} + + +static void norm_quat( + float *q ) +{ + float norm_q; + int16_t i; + + norm_q = dotp( q, q, IVAS_PCA_INTERP ); + + norm_q = inv_sqrt( norm_q ); // TODO: possible division by 0 + + for ( i = 0; i < IVAS_PCA_INTERP; i++ ) + { + q[i] *= norm_q; + } + + return; +} + + +static void quat_nlerp_preproc( + const float *q0, + const float *q1, + const float alpha, + float *q_slerp ) +{ + int16_t i; + + for ( i = 0; i < IVAS_PCA_INTERP; i++ ) + { + q_slerp[i] = alpha * q0[i] + ( 1.0f - alpha ) * q1[i]; + } + + norm_quat( q_slerp ); + + return; +} + + +void pca_interp_preproc( + const float *prev_ql, + const float *prev_qr, + const float *ql, + const float *qr, + const int16_t len, + float *ql_interp, + float *qr_interp ) +{ + float alpha; + int16_t j; + + for ( j = 0; j < len; j++ ) + { + alpha = (float) j / (float) ( len - 1 ); // the increment can be updated by simple delta + alpha = 0.5f * ( 1.f - cosf( EVS_PI * alpha ) ); + alpha = 1 - alpha; + quat_nlerp_preproc( prev_ql, ql, alpha, &ql_interp[j * IVAS_PCA_INTERP] ); + quat_nlerp_preproc( prev_qr, qr, alpha, &qr_interp[j * IVAS_PCA_INTERP] ); + } + + return; +} + + +static float acos_clip( + float v ) +{ + float ph; + + v = check_bounds( v, -1.0f, 1.0f ); + + ph = acosf( v ); + + return ph; +} + + +static void sp2cart( + const float ph1, + const float ph2, + const float ph3, + float *q ) +{ + float s1, s2, s1s2; + + s1 = sinf( ph1 ); + s2 = sinf( ph2 ); + s1s2 = s1 * s2; + q[3] = sinf( ph3 ) * s1s2; + q[2] = cosf( ph3 ) * s1s2; + q[1] = cosf( ph2 ) * s1; + q[0] = cosf( ph1 ); + + return; +} + +static int16_t calc_n2( + const float ph1 ) +{ + int16_t n2; + + n2 = (int16_t) roundf( 90.f * sinf( ph1 ) ); + + if ( n2 % 2 == 0 ) + { + n2++; + } + + return n2; +} + + +static int16_t calc_n3( + const float ph1, + const float ph2 ) +{ + int16_t n3; + + n3 = (int16_t) roundf( 180.f * sinf( ph1 ) * sinf( ph2 ) ); + + if ( n3 == 0 ) + { + n3 = 1; + } + else + { + if ( ( n3 % 2 ) == 1 ) + { + n3++; + } + } + + return n3; +} + + +static void q_ang_2surv( + const float a, + const int16_t N, + float *a_q, + int16_t *index ) +{ + float d, v; + int16_t temp; + + if ( N == 1 ) + { + a_q[0] = 0.f; + a_q[1] = 0.f; + index[0] = 0; + index[1] = 0; + return; + } + d = EVS_PI / ( N - 1 ); + if ( a >= EVS_PI ) + { + index[0] = N - 1; + index[1] = N - 2; + } + else + { + if ( a <= 0 ) + { + index[0] = 0; + index[1] = 1; + } + else + { + v = a / d; + index[0] = (int16_t) floorf( v ); + index[1] = (int16_t) ceilf( v ); + + if ( index[0] == index[1] ) + { + /*printf("warning: identical indices\n"); */ + } + else + { + if ( ( v - index[0] ) < ( index[1] - v ) ) + { + temp = index[1]; + index[1] = index[0]; + index[0] = temp; + } + } + } + } + a_q[0] = index[0] * d; + a_q[1] = index[1] * d; + + return; +} + + +static void q_ang_circ( + const float a, + const int16_t N, + float *a_q, + int16_t *index ) +{ + float d; + if ( N == 1 ) + { + *a_q = 0.f; + *index = 0; + + return; + } + + d = PI2 / N; + + if ( a >= PI2 ) + { + *index = N; + } + else + { + if ( a <= 0.f ) + { + *index = 0; + } + else + { + *index = (int16_t) roundf( a / d ); + } + } + + if ( *index == N ) + { + *index = 0; + } + + assert( ( *index >= 0 ) && ( *index <= ( N - 1 ) ) ); + *a_q = *index * d; + + return; +} + + +static int16_t sel_q( + const float *q, + const float *q_cand, + const int16_t n ) +{ + int16_t i, i_min, j; + float d, d_min, temp; + const float *p; + + i_min = -1; + d_min = 1e30f; + p = q_cand; + + for ( i = 0; i < n; i++ ) + { + d = 0.f; + for ( j = 0; j < 4; j++ ) + { + temp = q[j] - p[j]; + d += temp * temp; + } + + if ( d < d_min ) + { + d_min = d; + i_min = i; + } + p += 4; + } + assert( i_min >= 0 ); + + return i_min; +} + + +static int16_t get_pca_offset_n2( + const int16_t index1 ) +{ + int16_t index2; + + if ( index1 <= IVAS_PCA_N1_EQ ) + { + index2 = ivas_pca_offset_n2[index1]; + } + else + { + index2 = ivas_pca_offset_n2[IVAS_PCA_N1 - 1 - index1]; + } + + return index2; +} + + +/*---------------------------------------------------------------------* + * pca_enc_s3() + * + * + *---------------------------------------------------------------------*/ + +void pca_enc_s3( + float *q, + int32_t *index ) +{ + float ph1, ph2, ph3, r, v; + float ph1_q[2], ph2_q[4], ph3_q[4]; + int16_t n1, n2[2], n3[4]; + int16_t ind1[2], ind2[4], ind3[4], index1, index2, index3; + int16_t i, j; + float q_cand[4 * 4]; + + n1 = IVAS_PCA_N1; + ph1 = acos_clip( q[0] ); + if ( fabsf( fabsf( q[0] ) - 1.0f ) < IVAS_PCA_QUAT_EPS ) + { + if ( q[0] > 0 ) + { + *ph1_q = 0.f; + index1 = 0; + } + else + { + *ph1_q = EVS_PI; + index1 = n1 - 1; + } + + sp2cart( *ph1_q, 0.f, 0.f, q ); + + *index = ivas_pca_offset_index1[index1]; + + return; + } + + q_ang_2surv( ph1, n1, ph1_q, ind1 ); + + r = sqrtf( q[1] * q[1] + q[2] * q[2] + q[3] * q[3] ); + + v = q[1] / r; + ph2 = acos_clip( v ); + + if ( fabs( fabs( v ) - 1.0f ) < IVAS_PCA_QUAT_EPS ) + { + for ( i = 0; i < 2; i++ ) + { + n2[i] = calc_n2( ph1_q[i] ); + if ( v > 0 ) + { + ph2_q[i] = 0; + ind2[i] = 0; + } + else + { + ph2_q[i] = EVS_PI; + ind2[i] = n2[i] - 1; + } + + sp2cart( ph1_q[i], ph2_q[i], 0, &q_cand[4 * i] ); + } + + j = sel_q( q, q_cand, 2 ); + + mvr2r( q_cand + 4 * j, q, 4 ); + index1 = ind1[j]; + index2 = ind2[j]; + + index2 += get_pca_offset_n2( index1 ); + + *index = ivas_pca_offset_index1[index1] + ivas_pca_offset_index2[index2]; + + return; + } + + for ( i = 0; i < 2; i++ ) + { + n2[i] = calc_n2( ph1_q[i] ); + q_ang_2surv( ph2, n2[i], ph2_q + 2 * i, ind2 + 2 * i ); + } + r = sqrtf( q[2] * q[2] + q[3] * q[3] ); + v = q[2] / r; + ph3 = acos_clip( v ); + + if ( q[3] < 0 ) + { + ph3 = PI2 - ph3; + } + + for ( i = 0; i < 4; i++ ) + { + n3[i] = calc_n3( ph1_q[i >> 1], ph2_q[i] ); + q_ang_circ( ph3, n3[i], ph3_q + i, ind3 + i ); + sp2cart( ph1_q[i >> 1], ph2_q[i], ph3_q[i], q_cand + ( 4 * i ) ); + } + + j = sel_q( q, q_cand, 4 ); + + mvr2r( q_cand + 4 * j, q, 4 ); + + index1 = ind1[j >> 1]; + index2 = ind2[j]; + index3 = ind3[j]; + index2 += get_pca_offset_n2( index1 ); + + *index = ivas_pca_offset_index1[index1] + ivas_pca_offset_index2[index2] + index3; + + return; +} + +/*---------------------------------------------------------------------* + * pca_dec_s3() + * + * + *---------------------------------------------------------------------*/ + +void pca_dec_s3( + const int32_t index, + float *q ) +{ + float ph1_q, ph2_q, ph3_q; + int32_t j; + int16_t i; + int16_t n1, n2, n3; + int16_t index1, index2, index3; + float d; + + j = index; + index1 = -1; + for ( i = 0; i < IVAS_PCA_N1; i++ ) + { + if ( j < ivas_pca_offset_index1[i + 1] ) + { + index1 = i; + break; + } + } + + assert( index1 > -1 ); + + n1 = IVAS_PCA_N1; + d = EVS_PI / ( n1 - 1 ); + ph1_q = index1 * d; + n2 = calc_n2( ph1_q ); + + j -= ivas_pca_offset_index1[index1]; + index2 = -1; + + for ( i = 0; i < n2; i++ ) + { + if ( j < ivas_pca_offset_index2[i + get_pca_offset_n2( index1 ) + 1] ) + { + index2 = i; + break; + } + } + + assert( index2 > -1 ); + + if ( n2 == 1 ) + { + ph2_q = 0; + } + else + { + d = EVS_PI / ( n2 - 1 ); + ph2_q = index2 * d; + } + + j -= ivas_pca_offset_index2[index2 + get_pca_offset_n2( index1 )]; + + index3 = (int16_t) j; + + n3 = calc_n3( ph1_q, ph2_q ); + + if ( n3 == 1 ) + { + ph3_q = 0; + } + else + { + d = PI2 / n3; + ph3_q = d * index3; + } + sp2cart( ph1_q, ph2_q, ph3_q, q ); + + return; +} diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h new file mode 100644 index 0000000000000000000000000000000000000000..7af0edb72e4e61e638b949db0e6ba68f913a9835 --- /dev/null +++ b/lib_com/ivas_prot.h @@ -0,0 +1,5996 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#ifndef IVAS_PROT_H +#define IVAS_PROT_H + +#include +#include "options.h" +#include +#include "typedef.h" +#include "stat_enc.h" +#include "stat_dec.h" +#include "stat_com.h" +#include "ivas_stat_enc.h" +#include "ivas_stat_dec.h" +#include "ivas_stat_com.h" +#include "ivas_error_utils.h" + +/* clang-format off */ + +/*----------------------------------------------------------------------------------* + * General IVAS prototypes + *----------------------------------------------------------------------------------*/ + +ivas_error ivas_enc( + Encoder_Struct *st_ivas, /* i : IVAS encoder structure */ + const int16_t *data, /* i : input signal */ + const int16_t n_samples /* i : number of input samples */ +); + +void stereo_dmx_evs_enc( + STEREO_DMX_EVS_ENC_HANDLE hStereoDmxEVS, /* i/o: Stereo downmix for EVS encoder handle */ + const int32_t input_Fs, /* i : input sampling rate */ + int16_t data[CPE_CHANNELS * L_FRAME48k], /* i/o: input signal */ + const int16_t n_samples, /* i : number of input samples */ + const bool is_binaural /* i : indication that input is binaural audio */ +); + +/*! r: number of channels to be analysed */ +int16_t getNumChanAnalysis( + Encoder_Struct *st_ivas /* i : IVAS encoder structure */ +); + +void copy_encoder_config( + Encoder_Struct *st_ivas, /* i : IVAS encoder structure */ + Encoder_State *st, /* o : encoder state structure */ + const int16_t flag_all /* i : flag 1==update all, 0=partial update */ +); + +void ivas_write_format( + Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ +); + +void ivas_write_format_sid( + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const int16_t element_mode, /* i : element bitrate */ + BSTR_ENC_HANDLE hBstr /* i/o: encoder bitstream handle */ +); + +ivas_error create_sce_enc( + Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ + const int16_t sce_id, /* i : SCE # identifier */ + const int32_t element_brate /* i : element bitrate */ +); + +ivas_error create_cpe_enc( + Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ + const int16_t cpe_id, /* i : CPE # identifier */ + const int32_t element_brate /* i : element bitrate */ +); + +ivas_error create_mct_enc( + Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ +); + +ivas_error mct_enc_reconfigure( + Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ + const uint16_t b_nchan_change /* i : flag indicating different channel count */ +); + +ivas_error ivas_sba_enc_reconfigure( + Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ +); + +void destroy_sce_enc( + SCE_ENC_HANDLE hSCE /* i/o: SCE encoder structure */ +); + +void destroy_cpe_enc( + CPE_ENC_HANDLE hCPE /* i/o: CPE encoder structure */ +); + +void ivas_mct_enc_close( + MCT_ENC_HANDLE *hMCT /* i/o: MCT encoder structure */ +); + +ivas_error ivas_corecoder_enc_reconfig( + Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ + const int16_t nSCE_old, /* i : number of SCEs in previous frame */ + const int16_t nCPE_old, /* i : number of CPEs in previous frame */ + const int16_t nchan_transport_old, /* i : number of TCs in previous frame */ + const int32_t brate_SCE, /* i : bitrate to be set for the SCEs */ + const int32_t brate_CPE, /* i : bitrate to be set for the CPEs */ + const MC_MODE last_mc_mode /* i : switching between MC modes: last mode */ +); + +ivas_error ivas_sce_enc( + Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ + const int16_t sce_id, /* i : SCE # identifier */ + const float data_f[], /* i : input signal for single channel */ + const int16_t input_frame, /* i : input frame length per channel */ + const int16_t nb_bits_metadata /* i : number of metadata bits */ +); + +ivas_error ivas_cpe_enc( + Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ + const int16_t cpe_id, /* i : CPE # identifier */ + const float data_f_ch0[], /* i : input signal for channel 0 */ + const float data_f_ch1[], /* i : input signal for channel 1 */ + const int16_t input_frame, /* i : input frame length per channel */ + const int16_t nb_bits_metadata /* i : number of metadata bits */ +); + +ivas_error ivas_mct_enc( + Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ + float *data[MCT_MAX_CHANNELS], /* i : input signal buffers */ + const int16_t input_frame, /* i : input frame length per channel */ + const int16_t nb_bits_metadata /* i : number of metadata bits */ +); + +ivas_error pre_proc_front_ivas( + SCE_ENC_HANDLE hSCE, /* i/o: SCE encoder structure */ + CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ + const int32_t element_brate, /* i : SCE/CPE element bitrate */ + const int16_t nb_bits_metadata, /* i : number of metadata bits */ + const int16_t input_frame, /* i : frame length */ + const int16_t n, /* i : channel number */ + float old_inp_12k8[], /* o : buffer of old input signal */ + float old_inp_16k[], /* o : buffer of old input signal @16kHz */ + float *ener, /* o : residual energy from Levinson-Durbin */ + float *relE, /* o : frame relative energy */ + float A[NB_SUBFR16k * ( M + 1 )], /* o : A(z) unquantized for the 4 subframes */ + float Aw[NB_SUBFR16k * ( M + 1 )], /* o : weighted A(z) unquantized for subframes */ + float epsP[M + 1], /* o : LP prediction errors */ + float lsp_new[M], /* o : LSPs at the end of the frame */ + float lsp_mid[M], /* o : LSPs in the middle of the frame */ + int16_t *vad_hover_flag, /* o : VAD hangover flag */ + int16_t *attack_flag, /* o : flag signaling attack */ + float realBuffer[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i/o: real buffer */ + float imagBuffer[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i/o: imag buffer */ + float old_wsp[], /* o : weighted input signal buffer */ + float pitch_fr[NB_SUBFR], /* o : fractional pitch values */ + float voicing_fr[NB_SUBFR], /* o : fractional pitch gains */ + int16_t *loc_harm, /* o : harmonicity flag */ + float *cor_map_sum, /* o : speech/music clasif. parameter */ + int16_t *vad_flag_dtx, /* o : HE-SAD flag with additional DTX HO */ + float enerBuffer[CLDFB_NO_CHANNELS_MAX], /* o : energy buffer */ + float fft_buff[2 * L_FFT], /* o : FFT buffer */ + const float tdm_A_PCh[M + 1], /* i : unq. LP coeff. of primary channel */ + const float tdm_lsp_new_PCh[M], /* i : unq. LSPs of primary channel */ + const float currFlatness, /* i : flatness parameter */ + const int16_t tdm_ratio_idx, /* i : Current Ratio_L index */ + float fr_bands_LR[CPE_CHANNELS][2 * NB_BANDS], /* i : energy in frequency bands */ + const float Etot_LR[CPE_CHANNELS], /* i : total energy Left & Right channel */ + float lf_E_LR[CPE_CHANNELS][2 * VOIC_BINS], /* i : per bin spectrum energy in lf, LR channels */ + const int16_t localVAD_HE_SAD_LR[CPE_CHANNELS], /* i : HE-SAD flag without hangover, LR channels */ + float band_energies_LR[2 * NB_BANDS], /* o : energy in critical bands without minimum noise floor E_MIN */ + const int16_t flag_16k_smc, /* i : flag to indicate if the OL SMC is run at 16 kHz */ + const int16_t front_vad_flag, /* i : front-VAD flag to overwrite VAD decision */ + const int16_t force_front_vad, /* i : flag to force VAD decision */ + const int16_t front_vad_dtx_flag, /* i : front-VAD DTX flag to overwrite VAD decision*/ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const int32_t ivas_total_brate /* i : IVAS total bitrate */ +); + +ivas_error pre_proc_ivas( + Encoder_State *st, /* i/o: encoder state structure */ + const int16_t last_element_mode, /* i : last element mode */ + const int32_t element_brate, /* i : element bitrate */ + const int32_t last_element_brate, /* i : last element bitrate */ + const int16_t input_frame, /* i : frame length */ + float old_inp_12k8[], /* i/o: buffer of old input signal */ + float old_inp_16k[], /* i/o: buffer of old input signal @ 16kHz */ + float **inp, /* o : ptr. to inp. signal in the current frame*/ + float *ener, /* o : residual energy from Levinson-Durbin */ + float A[NB_SUBFR16k * ( M + 1 )], /* i/o: A(z) unquantized for the 4 subframes */ + float Aw[NB_SUBFR16k * ( M + 1 )], /* i/o: weighted A(z) unquantized for subframes */ + float epsP[M + 1], /* i/o: LP prediction errors */ + float lsp_new[M], /* i/o: LSPs at the end of the frame */ + float lsp_mid[M], /* i/o: LSPs in the middle of the frame */ + float *new_inp_resamp16k, /* o : new input signal @16kHz, non pre-emphasised, used by the WB TBE/BWE */ + int16_t *Voicing_flag, /* o : voicing flag for HQ FEC */ + const float old_wsp[], /* i : weighted input signal buffer */ + const int16_t loc_harm, /* i : harmonicity flag */ + const float cor_map_sum, /* i : speech/music clasif. parameter */ + const int16_t vad_flag_dtx, /* i : HE-SAD flag with additional DTX HO */ + const float enerBuffer[CLDFB_NO_CHANNELS_MAX], /* i : energy buffer */ + const float fft_buff[2 * L_FFT], /* i : FFT buffer */ + const int16_t MCT_flag, /* i : hMCT handle allocated (1) or not (0) */ + const int16_t vad_hover_flag, /* i : VAD hangover flag */ + const int16_t flag_16k_smc /* i : flag to indicate if the OL SMC is run at 16 kHz */ +); + +ivas_error ivas_compute_core_buffers( + Encoder_State *st, /* i/o: encoder state structure */ + float **inp16k_out, /* o : ptr. to inp. signal in the current frame*/ + float *old_inp_16k, /* i/o: buffer of old input signal @ 16kHz */ + float new_inp_resamp16k[], /* o : new input signal @16kHz, non pre-emphasised, used by the WB TBE/BWE */ + const int16_t input_frame, /* i : frame length */ + const int16_t last_element_mode, /* i : last element mode */ + const int32_t sr_core, /* i : core-coder sampling rate */ + float *ener, /* o : residual energy from Levinson-Durbin */ + float A[NB_SUBFR16k * ( M + 1 )], /* i/o: A(z) unquantized for the 4 subframes */ + float Aw[NB_SUBFR16k * ( M + 1 )], /* i/o: weighted A(z) unquantized for subframes */ + float epsP[M + 1], /* i/o: LP prediction errors */ + float lsp_new[M], /* i/o: LSPs at the end of the frame */ + float lsp_mid[M] /* i/o: LSPs in the middle of the frame */ +); + +/*! r: number of clipped samples */ +uint32_t ivas_syn_output( + float *synth[], /* i/o: float synthesis signal */ + const int16_t output_frame, /* i : output frame length (one channel) */ + const int16_t n_channels, /* i : number of output channels */ + int16_t *synth_out /* o : integer 16 bits synthesis signal */ +); + +void ivas_syn_output_f( + float *synth[], /* i/o: float synthesis signal */ + const int16_t output_frame, /* i : output frame length (one channel) */ + const int16_t n_channels, /* i : number of output channels */ + float *synth_out /* o : integer 16 bits synthesis signal */ +); + +void ivas_initialize_handles_enc( + Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ +); + +ivas_error ivas_init_encoder( + Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ +); + +void destroy_core_enc( + ENC_CORE_HANDLE hCoreCoder /* i/o: core encoder structure */ +); + +void ivas_destroy_enc( + Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ +); + +ivas_error ivas_initialize_MD_bstr_enc( + BSTR_ENC_HANDLE *hBstr, /* o : encoder MD bitstream handle */ + Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ +); + +void ivas_destroy_MD_bstr_enc( + BSTR_ENC_HANDLE *hMetaData /* i/o: encoder MD bitstream handle */ +); + +ivas_error ivas_init_decoder_front( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +); + +ivas_error ivas_init_decoder( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +); + +#ifdef NONBE_FIX_839_MC_RS_CHANNEL_ALLOC +ivas_error ivas_output_buff_dec( + float *p_output_f[], /* i/o: output audio buffers */ + const int16_t nchan_out_buff_old, /* i : previous frame number of output channels*/ + const int16_t nchan_out_buff /* i : number of output channels */ +); +#endif + +ivas_error stereo_dmx_evs_init_encoder( + STEREO_DMX_EVS_ENC_HANDLE *hStereoDmxEVS, /* o : Stereo downmix for EVS encoder handle */ + const int32_t input_Fs /* i : input sampling rate */ +); + +void stereo_dmx_evs_close_encoder( + STEREO_DMX_EVS_ENC_HANDLE *hStereoDmxEVS /* i/o: Stereo downmix for EVS encoder handle */ +); + +ivas_error ivas_dec( + Decoder_Struct *st_ivas, /* i : IVAS decoder structure */ + int16_t *data /* o : output synthesis signal */ +); + +ivas_error ivas_dec_setup( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + uint16_t *nSamplesRendered, /* o : number of samples flushed from the previous frame (JBM) */ + int16_t *data /* o : output synthesis signal */ +); + +ivas_error create_sce_dec( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const int16_t cpe_id, /* i : SCE # identifier */ + const int32_t element_brate /* i : element bitrate */ +); + +ivas_error create_cpe_dec( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const int16_t cpe_id, /* i : CPE # identifier */ + const int32_t element_brate /* i : element bitrate */ +); + +ivas_error create_mct_dec( + Decoder_Struct *st_ivas /* i/o: IVAS decoder handle */ +); + +ivas_error mct_dec_reconfigure( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const uint16_t b_nchan_change /* i : flag indicating different channel count */ +); + +void destroy_sce_dec( + SCE_DEC_HANDLE hSCE /* i/o: SCE decoder structure */ +); + +void destroy_cpe_dec( + CPE_DEC_HANDLE hCPE /* i/o: CPE decoder structure */ +); + +void ivas_mct_dec_close( + MCT_DEC_HANDLE *hMCT /* i/o: MCT decoder structure */ +); + +ivas_error ivas_corecoder_dec_reconfig( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const int16_t nSCE_old, /* i : number of SCEs in previous frame */ + int16_t nCPE_old, /* i : number of CPEs in previous frame */ + const int16_t nchan_transport_old, /* i : number of TCs in previous frame */ + const int16_t sba_dirac_stereo_flag_old, /* i : signal stereo rendering using DFT upmix in previous frame */ + const int32_t brate_SCE, /* i : bitrate to be set for the SCEs */ + const int32_t brate_CPE /* i : bitrate to be set for the CPEs */ +); + +ivas_error ivas_hp20_dec_reconfig( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const int16_t nchan_hp20_old /* i : number of HP20 filters in previous frame*/ +); + +ivas_error ivas_sce_dec( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const int16_t sce_id, /* i : SCE # identifier */ + float *output[1], /* o : output synthesis signal */ + const int16_t output_frame, /* i : output frame length per channel */ + const int16_t nb_bits_metadata /* i : number of metadata bits */ +); + +ivas_error ivas_cpe_dec( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const int16_t cpe_id, /* i : CPE # identifier */ + float *output[CPE_CHANNELS], /* o : output synthesis signal */ + const int16_t output_frame, /* i : output frame length per channel */ + const int16_t nb_bits_metadata /* i : number of metadata bits */ +); + +ivas_error ivas_mct_dec( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + float *output[], /* o : output synthesis signal */ + const int16_t output_frame, /* i : output frame length per channel */ + const int16_t nb_bits_metadata /* i : number of metadata bits */ +); + +/*! r: number of channels to be synthesised */ +int16_t getNumChanSynthesis( + Decoder_Struct *st_ivas /* i : IVAS decoder structure */ +); + +void copy_decoder_config( + Decoder_Struct *st_ivas, /* i : IVAS decoder structure */ + Decoder_State *st /* o : decoder state structure */ +); + +void destroy_core_dec( + DEC_CORE_HANDLE hCoreCoder /* i/o: core decoder structure */ +); + +void ivas_destroy_dec( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +); + +void ivas_initialize_handles_dec( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +); + +ivas_error ivas_core_enc( + SCE_ENC_HANDLE hSCE, /* i/o: SCE encoder structure */ + CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ + MCT_ENC_HANDLE hMCT, /* i/o: MCT encoder structure */ + const int16_t n_CoreChannels, /* i : number of core channels to be coded */ +#ifdef FIX_854_ARRAY_SIZE_MISMATCH + float old_inp_12k8[][L_INP_12k8], /* i : buffer of old input signal */ + float old_inp_16k[][L_INP], /* i : buffer of old input signal */ + float ener[], /* i : residual energy from Levinson-Durbin */ + float A[][NB_SUBFR16k * ( M + 1 )], /* i : A(z) unquantized for the 4 subframes */ + float Aw[][NB_SUBFR16k * ( M + 1 )], /* i : weighted A(z) unquantized for subframes */ + float epsP[][M + 1], /* i : LP prediction errors */ + float lsp_new[][M], /* i : LSPs at the end of the frame */ + float lsp_mid[][M], /* i : LSPs in the middle of the frame */ + const int16_t vad_hover_flag[], /* i : VAD hanglover flag */ + int16_t attack_flag[], /* i : attack flag (GSC or TC) */ + float realBuffer[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i/o: real buffer */ + float imagBuffer[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i/o: imag buffer */ + float old_wsp[][L_WSP], /* i : weighted input signal buffer */ + const int16_t loc_harm[], /* i : harmonicity flag */ + const float cor_map_sum[], /* i : speech/music clasif. parameter */ + const int16_t vad_flag_dtx[], /* i : HE-SAD flag with additional DTX HO */ + float enerBuffer[][CLDFB_NO_CHANNELS_MAX], /* i : energy buffer */ + float fft_buff[][2 * L_FFT], /* i : FFT buffer */ +#else + float old_inp_12k8[CPE_CHANNELS][L_INP_12k8], /* i : buffer of old input signal */ + float old_inp_16k[CPE_CHANNELS][L_INP], /* i : buffer of old input signal */ + float ener[CPE_CHANNELS], /* i : residual energy from Levinson-Durbin */ + float A[CPE_CHANNELS][NB_SUBFR16k * ( M + 1 )], /* i : A(z) unquantized for the 4 subframes */ + float Aw[CPE_CHANNELS][NB_SUBFR16k * ( M + 1 )], /* i : weighted A(z) unquantized for subframes */ + float epsP[CPE_CHANNELS][M + 1], /* i : LP prediction errors */ + float lsp_new[CPE_CHANNELS][M], /* i : LSPs at the end of the frame */ + float lsp_mid[CPE_CHANNELS][M], /* i : LSPs in the middle of the frame */ + const int16_t vad_hover_flag[CPE_CHANNELS], /* i : VAD hanglover flag */ + int16_t attack_flag[CPE_CHANNELS], /* i : attack flag (GSC or TC) */ + float realBuffer[CPE_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i/o: real buffer */ + float imagBuffer[CPE_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i/o: imag buffer */ + float old_wsp[CPE_CHANNELS][L_WSP], /* i : weighted input signal buffer */ + const int16_t loc_harm[CPE_CHANNELS], /* i : harmonicity flag */ + const float cor_map_sum[CPE_CHANNELS], /* i : speech/music clasif. parameter */ + const int16_t vad_flag_dtx[CPE_CHANNELS], /* i : HE-SAD flag with additional DTX HO */ + float enerBuffer[CPE_CHANNELS][CLDFB_NO_CHANNELS_MAX], /* i : energy buffer */ + float fft_buff[CPE_CHANNELS][2 * L_FFT], /* i : FFT buffer */ +#endif + const int16_t tdm_SM_flag, /* i : channel combination scheme flag */ + const int16_t ivas_format, /* i : IVAS format */ + const int16_t flag_16k_smc /* i : flag to indicate if the OL SMC is run at 16 kHz */ +); + +ivas_error ivas_core_dec( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + SCE_DEC_HANDLE hSCE, /* i/o: SCE decoder structure */ + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + MCT_DEC_HANDLE hMCT, /* i/o: MCT decoder structure */ + const int16_t n_channels, /* i : number of channels to be decoded */ +#ifdef FIX_854_ARRAY_SIZE_MISMATCH + float *output[], /* o : output synthesis signal */ + float outputHB[][L_FRAME48k], /* o : output HB synthesis signal */ +#else + float *output[CPE_CHANNELS], /* o : output synthesis signal */ + float outputHB[CPE_CHANNELS][L_FRAME48k], /* o : output HB synthesis signal */ +#endif + float DFT[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* o : DFT buffers */ + const int16_t sba_dirac_stereo_flag /* i : signal stereo output for SBA DirAC */ +); + +void encod_gen_2sbfr( + Encoder_State *st, /* i/o: state structure */ + const float speech[], /* i : input speech */ + const float Aw[], /* i : weighted A(z) unquantized for subframes */ + const float Aq[], /* i : LP coefficients */ + const float *res, /* i : residual signal */ + float *syn, /* i/o: core synthesis */ + float *exc, /* i/o: current non-enhanced excitation */ + float *exc2, /* i/o: current enhanced excitation */ + float *pitch_buf, /* i/o: floating pitch values for each subframe */ + float *voice_factors, /* o : voicing factors */ + float *bwe_exc, /* o : excitation for SWB TBE */ + const int16_t tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag */ + const float tdm_Pri_pitch_buf[] /* i : pitch values for primary channel */ +); + +void decod_gen_2sbfr( + Decoder_State *st, /* i/o: decoder static memory */ + const int16_t sharpFlag, /* i : formant sharpening flag */ + const float *Aq, /* i : LP filter coefficient */ + float *pitch_buf, /* o : floating pitch values for each subframe */ + float *voice_factors, /* o : voicing factors */ + float *exc, /* i/o: adapt. excitation exc */ + float *exc2, /* i/o: adapt. excitation/total exc */ + float *bwe_exc, /* o : excitation for SWB TBE */ + float *gain_buf, /* o : floating pitch gain for each subframe */ + const int16_t tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag */ + const float tdm_Pri_pitch_buf[] /* i : pitch values for primary channel */ +); + +void synchro_synthesis( + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + float *output[CPE_CHANNELS], /* i/o: output synthesis signal */ + const int16_t output_frame, /* i : Number of samples */ + const int16_t sba_dirac_stereo_flag /* i : signal stereo output for SBA DirAC */ +); + +void stereo_tcx_init_enc( + Encoder_State *st /* i/o: encoder state structure */ +); + +void stereo_tcx_core_enc( + Encoder_State *st, /* i/o: encoder state structure */ + const float new_samples_12k8[], /* i : buffer of input signal @12.8 kHz */ + const float new_samples_16k[], /* i : buffer of input signal @16 kHz */ + const float Aw[], /* i : weighted A(z) unquant. for subframes */ + float lsp_new[], /* i : LSPs at the end of the frame */ + float lsp_mid[], /* i : LSPs in the middle of the frame */ + float pitch_buf[NB_SUBFR16k], /* o : floating pitch for each subframe */ + const int16_t last_element_mode, /* i : last element mode */ + const int16_t vad_hover_flag /* i : VAD hangover flag */ +); + +void stereo_tcx_core_dec( + Decoder_State *st, /* i/o: decoder state structure */ + const FRAME_MODE frameMode, /* i : Decoder frame mode */ + float *signal_out, /* o : synthesis @internal_Fs */ + float *signal_outFB, /* o : synthesis @output_Fs */ + float pitch_buf[], /* o : floating pitch for each subframe */ + const int16_t sba_dirac_stereo_flag, /* i : signal stereo output for SBA DirAC */ + STEREO_TD_DEC_DATA_HANDLE hStereoTD, /* i/o: TD stereo decoder handle */ + const int16_t last_element_mode, /* i : last element mode */ + const int16_t flag_sec_CNA, /* i : CNA flag for secondary channel */ + STEREO_CNG_DEC_HANDLE hStereoCng, /* i : Stereo CNG handle */ + const int16_t nchan_out, /* i : number of output channels */ + const IVAS_FORMAT ivas_format /* i : IVAS format */ +); + +void stereo_tcx_init_dec( + Decoder_State *st, /* i/o: decoder state structure */ + const int16_t MCT_flag, /* i : hMCT handle allocated (1) or not (0) */ + const int16_t last_element_mode /* i : element mode of previous frame */ +); + +/*! r: S/M decision (0 = speech or noise, 1 = unclear, 2 = music) */ +int16_t ivas_smc_gmm( + Encoder_State *st, /* i/o: encoder state structure */ + STEREO_CLASSIF_HANDLE hStereoClassif, /* i/o: stereo classifier structure */ + const int16_t localVAD_HE_SAD, /* i : HE-SAD flag without hangover */ + const float Etot, /* i : total frame energy */ + const float lsp_new[M], /* i : LSPs in current frame */ + const float cor_map_sum, /* i : correlation map sum (from multi-harmonic anal.) */ + const float epsP[M + 1], /* i : LP prediciton error */ + const float PS[], /* i : energy spectrum */ + const float non_sta, /* i : unbound non-stationarity */ + const float relE, /* i : relative frame energy */ + int16_t *high_lpn_flag, /* i/o: sp/mus LPN flag */ + const int16_t flag_spitch /* i : flag to indicate very short stable pitch */ +); + +void ivas_smc_mode_selection( + Encoder_State *st, /* i/o: encoder state structure */ + const int32_t element_brate, /* i : element bitrate */ + int16_t smc_dec, /* i : raw decision of the 1st stage classifier */ + const float relE, /* i : relative frame energy */ + const float Etot, /* i : total frame energy */ + int16_t *attack_flag, /* i/o: attack flag (GSC or TC) */ + const float *inp, /* i : input signal */ + const float S_map[], /* i : short-term correlation map */ + const int16_t flag_spitch /* i : flag to indicate very short stable pitch */ +); + +/*! r: S/M decision (0=speech or noise,1=unclear,2=music) */ +int16_t ivas_acelp_tcx20_switching( + Encoder_State *st, /* i/o: encoder state structure */ + const float *inp, /* i : new input signal */ + const float *wsp, /* i : input weighted signal */ + const float non_staX, /* i : unbound non-stationarity for sp/mu clas */ + const float *pitch_fr, /* i : fraction pitch values */ + const float *voicing_fr, /* i : fractional voicing values */ + const float currFlatness, /* i : flatness */ + const float lsp_mid[M], /* i : LSPs at the middle of the frame */ + const float stab_fac, /* i : LP filter stability */ + float *res_cod_SNR_M, + const int16_t flag_16k_smc /* i : flag to indicate if the OL SMC is run at 16 kHz */ +); + +void ivas_decision_matrix_enc( + Encoder_State *st, /* i/o: encoder state structure */ + const int32_t element_brate, /* i : element bitrate */ + const float fft_buff[], /* i : FFT buffer */ + const float enerBuffer[], /* i : energy buffer */ + const int16_t last_element_mode /* i : last element mode */ +); + +void ivas_signaling_enc( + Encoder_State *st, /* i/o: encoder state structure */ + const int16_t MCT_flag, /* i : hMCT handle allocated (1) or not (0) */ + const int32_t element_brate, /* i : element bitrate */ + const int16_t tdm_SM_flag, /* i : channel combination scheme flag in TD stereo */ + const int16_t tdm_Pitch_reuse_flag /* i : primary channel pitch reuse flag in TD stereo*/ +); + +void ivas_decision_matrix_dec( + Decoder_State *st, /* i/o: decoder state structure */ + int16_t *sharpFlag, /* o : formant sharpening flag */ + int16_t *core_switching_flag, /* o : ACELP->HQ switching frame flag */ + const int32_t element_brate, /* i : element bitrate */ + const int16_t nchan_out /* i : Number of output channels */ +); + +void set_bw_stereo( + CPE_ENC_HANDLE hCPE /* i/o: CPE encoder structures */ +); + +/*! r: flag indicating whether the coded BW has changed */ +int16_t set_bw_mct( + CPE_ENC_HANDLE hCPE[MCT_MAX_BLOCKS], /* i/o: CPE encoder structures */ + const int16_t nCPE /* i : number of CPEs */ +); + +void acelp_fast( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const int16_t cdk_index, /* i : codebook index */ + const float dn_orig[L_SUBFR], /* i : corr. between target and h[]. */ + const float cn[L_SUBFR], /* i : residual after long term prediction */ + const float H[L_SUBFR], /* i : impulse response of weighted synt.filter*/ + float code[L_SUBFR], /* o : algebraic (fixed) codebook excitation */ + float y[], /* o : filtered fixed codebook excitation */ + const int16_t L_subfr /* i : subframe length */ +); + +void dec_acelp_fast( + Decoder_State *st, /* i/o: decoder state structure */ + const int16_t cdk_index, /* i : codebook index */ + float code[], /* o : algebraic (fixed) codebook excitation */ + const int16_t L_subfr /* i : subframe length */ +); + +void set_transient_stereo( + CPE_ENC_HANDLE hCPE, /* i : CPE structure */ + float currFlatness[] /* i/o: current flatness */ +); + +/*! r: preliminary flag to force ACELP */ +int16_t transient_analysis( + TRAN_DET_HANDLE hTranDet, /* i : handle transient detection */ + const float cor_map_LT[], /* i : LT correlation map */ + const float multi_harm_limit /* i : multi harminic threshold */ +); + +void ivas_post_proc( + SCE_DEC_HANDLE hSCE, /* i/o: SCE decoder structure */ + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + const int16_t n, /* i : channel number */ + float synth[], /* i/o: output synthesis signal */ + float *output[CPE_CHANNELS], /* i/o: output synthesis signal */ + const int16_t output_frame, /* i : output frame length */ + const int16_t sba_dirac_stereo_flag /* i : signal stereo output for SBA DirAC */ +); + +void ivas_renderer_select( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +); + +ivas_error ivas_mc_enc_config( + Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ +); + +ivas_error ivas_mc_dec_config( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const int16_t idx, /* i : LS config. index */ + uint16_t *nSamplesRendered, /* o : samples flushed from last frame (JBM) */ + int16_t *data /* o : output synthesis signal */ +); + +/*! r: MC format mode (MCT, McMASA, ParamMC) */ +MC_MODE ivas_mc_mode_select( + const MC_LS_SETUP mc_ls_setup, /* i : loudspeaker setup (CICP) */ + const int32_t total_brate /* i : IVAS total bitrate */ +); + +/*! r: number of loudspeaker channels */ +int16_t ivas_mc_ls_setup_get_num_channels( + const MC_LS_SETUP mc_ls_setup /* i : loudspeaker setup (CICP) */ +); + +/*! r: output configuration*/ +AUDIO_CONFIG ivas_mc_map_ls_setup_to_output_config( + const MC_LS_SETUP mc_ls_setup /* i : multi channel loudspeaker setup */ +); + +/*! r: multi channel loudspeaker setup */ +MC_LS_SETUP ivas_mc_map_output_config_to_mc_ls_setup( + const AUDIO_CONFIG output_config /* i : output audio configuration */ +); + +void smooth_dft2td_transition( + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + float *output[CPE_CHANNELS], /* i/o: synthesis @external Fs */ + const int16_t output_frame /* i : output frame length */ +); + + +/*! r: flag indicating a valid bitrate */ +int16_t is_IVAS_bitrate( + const int32_t ivas_total_brate /* i : IVAS total bitrate */ +); + +int16_t is_DTXrate( + const int32_t ivas_total_brate /* i : IVAS total bitrate */ +); + +int16_t is_SIDrate( + const int32_t ivas_total_brate /* i : IVAS total bitrate */ +); + +void ivas_mdft( + const float *pIn, /* i : input time-domain signal */ + float *pOut_re, /* o : Real part of MDFT signal */ + float *pOut_im, /* o : Imag. part of MDFT signal */ + const int16_t length, /* i : signal length */ + const int16_t mdft_length /* i : MDFT length */ +); + +void ivas_imdft( + const float *pRe, /* i : Real part of MDFT signal */ + const float *pIm, /* i : Imag. part of MDFT signal */ + float *pOut, /* o : output time-domain signal */ + const int16_t length /* i : signal length */ +); + +void TonalMdctConceal_create_concealment_noise( + float concealment_noise[L_FRAME48k], + CPE_DEC_HANDLE hCPE, + const int16_t L_frameTCX, + const int16_t L_frame, + const int16_t idchan, + const int16_t subframe_idx, + const int16_t core, + const float crossfade_gain, + const TONALMDCTCONC_NOISE_GEN_MODE noise_gen_mode +); + +void TonalMdctConceal_whiten_noise_shape( + Decoder_State *st, + const int16_t L_frame, + const TONALMDCTCONC_NOISE_SHAPE_WHITENING_MODE +); + +/*! r: IGF start line */ +int16_t get_igf_startline( + Decoder_State *st, /* i : decoder state */ + const int16_t L_frame, /* i : length of the frame */ + const int16_t L_frameTCX /* i : full band frame length */ +); + +float rand_triangular_signed( + int16_t *seed ); + +void dtx_read_padding_bits( + DEC_CORE_HANDLE st, + const int16_t num_bits +); + +void ivas_apply_non_diegetic_panning( + float *output_f[], /* i/o: core-coder transport mono channel/stereo output */ + const float non_diegetic_pan_gain, /* i : non-diegetic panning gain */ + const int16_t output_frame /* i : output frame length per channel */ +); + + +/*----------------------------------------------------------------------------------* + * JBM prototypes + *----------------------------------------------------------------------------------*/ + +ivas_error ivas_jbm_dec_tc( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float *data /* o : output synthesis signals */ +); + +ivas_error ivas_jbm_dec_render( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const uint16_t nSamplesAsked, /* i : number of samples wanted */ + uint16_t *nSamplesRendered, /* o : number of samples rendered */ + uint16_t *nSamplesAvailableNext, /* o : number of samples still available in the rendering pipeline */ + int16_t *data /* o : output synthesis signal */ +); + +ivas_error ivas_jbm_dec_flush_renderer( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const int16_t tc_granularity_new, /* i : new renderer granularity */ + const RENDERER_TYPE renderer_type_old, /* i : old renderer type */ + const AUDIO_CONFIG intern_config_old, /* i : old internal config */ + const IVAS_OUTPUT_SETUP_HANDLE hIntSetupOld, /* i : old internal output setup */ + const MC_MODE mc_mode_old, /* i : old MC mode */ + const ISM_MODE ism_mode_old, /* i : old ISM mode */ + uint16_t *nSamplesRendered, /* o : number of samples flushed */ + int16_t *data /* o : output synthesis signal */ +); + +void ivas_jbm_dec_feed_tc_to_renderer( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const int16_t nSamplesForRendering, /* i : number of TC samples available for rendering */ + int16_t *nSamplesResidual, /* o : number of samples not fitting into the renderer grid and buffer for the next call*/ + float *data /* i/o: transport channels/output synthesis signal */ +); + +ivas_error ivas_jbm_dec_set_discard_samples( + Decoder_Struct *st_ivas /* i/o: main IVAS decoder structre */ +); + +void ivas_jbm_dec_get_adapted_linear_interpolator( + const int16_t default_interp_length, /* i : default length of the (full-frame) interpolator */ + const int16_t interp_length, /* i : length of the interpolator to be created */ + float *interpolator /* o : the interpolator */ +); + +void ivas_jbm_dec_get_adapted_subframes( + const int16_t nCldfbTs, /* i : number of time slots in the current frame */ + int16_t *subframe_nbslots, /* i/o: subframe grid */ + int16_t *nb_subframes /* i/o: number of subframes in the frame */ +); + +void ivas_jbm_dec_get_md_map( + const int16_t default_len, /* i : default frame length in metadata slots */ + const int16_t len, /* i : length of the modfied frames in metadata slots */ + const int16_t subframe_len, /* i : default length of a subframe */ + const int16_t offset, /* i : current read offset into the md buffer */ + const int16_t buf_len, /* i : length of the metadata buffer */ + int16_t *map /* o : metadata index map */ +); + +int16_t ivas_jbm_dec_get_num_tc_channels( + Decoder_Struct *st_ivas /* i : IVAS decoder handle */ +); + +void ivas_jbm_dec_copy_tc_no_tsm( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + float *tc[], /* i : transport channels */ + const int16_t output_frame /* i : output frame size */ +); + +void ivas_jbm_dec_get_md_map_even_spacing( + const int16_t len, /* i : length of the modfied frames in metadata slots */ + const int16_t subframe_len, /* i : default length of a subframe */ + const int16_t offset, /* i : current read offset into the md buffer */ + const int16_t buf_len, /* i : length of the metadata buffer */ + int16_t *map /* o : metadata index map */ +); + +TC_BUFFER_MODE ivas_jbm_dec_get_tc_buffer_mode( + Decoder_Struct *st_ivas /* i : IVAS decoder handle */ +); + +/*! r: render granularity */ +int16_t ivas_jbm_dec_get_render_granularity( + const RENDERER_TYPE rendererType, /* i : renderer type */ + const IVAS_FORMAT ivas_format, /* i : ivas format */ + const MC_MODE mc_mode, /* i : MC mode */ + const int32_t output_Fs /* i : sampling rate */ +); + +ivas_error ivas_jbm_dec_tc_buffer_open( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const TC_BUFFER_MODE tc_buffer_mode, /* i : buffer mode */ + const int16_t nchan_transport_jbm, /* i : number of real transport channels */ + const int16_t nchan_transport_internal, /* i : number of totally buffered channels */ + const int16_t nchan_full, /* i : number of channels to fully store */ + const int16_t n_samples_granularity /* i : granularity of the renderer/buffer */ +); + +ivas_error ivas_jbm_dec_tc_buffer_reconfigure( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const TC_BUFFER_MODE tc_buffer_mode, /* i : new buffer mode */ + const int16_t nchan_transport_jbm, /* i : new number of real transport channels */ + const int16_t nchan_transport_internal, /* i : new number of totally buffered channels */ + const int16_t nchan_full, /* i : new number of channels to fully store */ + const int16_t n_samples_granularity /* i : new granularity of the renderer/buffer */ +); + +void ivas_jbm_dec_tc_buffer_close( + DECODER_TC_BUFFER_HANDLE *phTcBuffer /* i/o: TC buffer handle */ +); + +void ivas_jbm_dec_td_renderers_adapt_subframes( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +); + +ivas_error ivas_jbm_dec_metadata_open( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +); + +void ivas_jbm_masa_sf_to_sf_map( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +); + + +/*----------------------------------------------------------------------------------* + * ISM prototypes + *----------------------------------------------------------------------------------*/ + +ivas_error ivas_ism_config( + const int32_t ism_total_brate, /* i : ISM total bitrate */ + const int16_t nchan_transport, /* i : number of transport channels */ + const int16_t nchan_ism, /* i : number of objects */ + ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ + const int16_t ism_extended_metadata_flag, /* i : extended metadata flag */ + const int16_t null_metadata_flag[MAX_NUM_OBJECTS], /* i : NULL MD flag */ + const int16_t ism_imp[], /* i : ISM importance flags */ + int32_t element_brate[], /* o : element bitrate per object */ + int32_t total_brate[], /* o : total bitrate per object */ + int16_t nb_bits_metadata[], /* i/o: number of metadata bits */ + const int16_t combined_format_flag /* i : flag indicating combined format */ +); + +void bitbudget_to_brate( + const int16_t x[], /* i : bitbudgets */ + int32_t y[], /* o : bitrates */ + const int16_t N /* i : number of entries to be converted */ +); + +void ivas_ism_reset_metadata( + ISM_METADATA_HANDLE hIsmMeta /* i/o: ISM metadata handles */ +); + +void ivas_ism_reset_metadata_API( + ISM_METADATA_HANDLE hIsmMeta /* i/o: ISM metadata handles */ +); + +/*! r: index of the winning codeword */ +int16_t ism_quant_meta( + const float val, /* i : scalar value to quantize */ + float *valQ, /* o : quantized value */ + const float borders[], /* i : level borders */ + const float q_step, /* i : quantization step */ + const float q_step_border, /* i : quantization step at the border */ + const int16_t cbsize /* i : codebook size */ +); + +/*! r: dequantized value */ +float ism_dequant_meta( + const int16_t idx, /* i : quantizer index */ + const float borders[], /* i : level borders */ + const float q_step, /* i : quantization step */ + const float q_step_border, /* i : quantization step at the border */ + const int16_t cbsize /* i : codebook size */ +); + +ivas_error ivas_set_ism_metadata( + ISM_METADATA_HANDLE hIsmMeta, /* o : ISM metadata handle */ + const float azimuth, /* i : azimuth value */ + const float elevation, /* i : elevation value */ + const float radius_meta, /* i : radius */ + const float yaw, /* i : yaw */ + const float pitch, /* i : pitch */ + const int16_t non_diegetic_flag /* i : non-diegetic object flag */ +); + +ivas_error ivas_ism_metadata_enc_create( + Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ + const int16_t n_ISms, /* i : number of objects */ + int32_t element_brate_tmp[] /* o : element bitrate per object */ +); + +ivas_error ivas_ism_metadata_dec_create( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const int16_t n_ISms, /* i : number of objects */ + int32_t element_brate_tmp[] /* o : element bitrate per object */ +); + +ivas_error ivas_ism_enc( + Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ + float *data[MAX_NUM_OBJECTS], /* i : input signal */ + const int16_t input_frame, /* i : input frame length per channel */ + int16_t *nb_bits_metadata, /* i : number of metadata bits */ + const int16_t flag_omasa_ener_brate /* i : less bitrate for objects in OMASA flag */ +); + +ivas_error ivas_ism_metadata_enc( + int32_t *ism_total_brate, /* i/o: ISM total bitrate */ + const int16_t nchan_ism, /* i : number of ISM channels */ + const int16_t nchan_transport, /* i : number of transport channels */ + ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ + SCE_ENC_HANDLE hSCE[], /* i/o: SCE encoder handles */ + BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ + int16_t nb_bits_metadata[], /* o : number of metadata bits */ + const int16_t localVAD[], /* i : VAD flag */ + const int16_t ism_mode, /* i : ISM mode */ + const PARAM_ISM_CONFIG_HANDLE hParamIsm, /* i : Param ISM Config Handle */ + const int16_t ism_extended_metadata_flag, /* i : Extended metadata flag */ + const float lp_noise_CPE, /* i : LP filtered total noise estimation */ + const int16_t flag_omasa_ener_brate, /* i : less bitrate for objects in OMASA flag */ + int16_t *omasa_stereo_sw_cnt, + const int16_t ini_frame +); + +ivas_error ivas_ism_metadata_dec( + const int32_t ism_total_brate, /* i : ISM total bitrate */ + const int16_t nchan_ism, /* i : number of ISM channels */ + int16_t *nchan_transport, /* o : number of transport channels */ + ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ + SCE_DEC_HANDLE hSCE[], /* i/o: SCE decoder handles */ + const int16_t bfi, /* i : bfi flag */ + int16_t nb_bits_metadata[], /* o : number of metadata bits */ + ISM_MODE ism_mode, /* i : ISM mode */ + ISM_DTX_DATA_DEC hISMDTX, /* i/o: ISM DTX structure */ + const PARAM_ISM_CONFIG_HANDLE hParamIsm, /* i : Param ISM Config Handle */ + int16_t *ism_extended_metadata_flag, /* i/o: Extended metadata active in renderer */ + int16_t *ism_extmeta_cnt, /* i/o: Number of change frames observed */ + DEC_CORE_HANDLE st0 /* i : core-coder handle */ +); + + +/*----------------------------------------------------------------------------------* + * Parametric ISM prototypes + *----------------------------------------------------------------------------------*/ + +/*! r: ISM format mode */ +ISM_MODE ivas_ism_mode_select( + const int16_t nchan_inp, /* i : number of input objects */ + const int32_t ivas_total_brate /* i : IVAS total bitrate */ +); + +ivas_error ivas_param_ism_enc_open( + Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ +); + +void ivas_param_ism_enc( + Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ + float *data[MAX_NUM_OBJECTS], /* i : input signal */ + const int16_t input_frame /* i : input frame length per channel */ +); + +void ivas_param_ism_enc_close( + PARAM_ISM_CONFIG_HANDLE *hParamIsm, /* i/o: ParamISM handle */ + const int32_t input_Fs /* i : input sampling_rate */ +); + +void ivas_ism_metadata_close( + ISM_METADATA_HANDLE hIsmMetaData[], /* i/o : object metadata handles */ + const int16_t first_idx /* i : index of first handle to deallocate */ +); + +void ivas_param_ism_stereo_dmx( + Encoder_Struct *st_ivas, /* i : IVAS encoder structure */ + float *data[MAX_NUM_OBJECTS], /* i/o: input signal/stereo dmx */ + const int16_t input_frame /* i : Length of input frame */ +); + +void ivas_param_ism_config( + PARAM_ISM_CONFIG_HANDLE hParamIsm, /* i/o: IVAS Param ISM Config Structure */ + const int16_t nchan_ism /* i : number of ISM channels */ +); + +ivas_error ivas_ism_enc_config( + Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ +); + +ivas_error ivas_ism_dec_config( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const ISM_MODE last_ism_mode, /* i/o: last ISM mode */ + uint16_t *nSamplesRendered, /* o : number of samples flushed on renderer change*/ + int16_t *data /* o : output synthesis signal */ +); + +ivas_error ivas_param_ism_dec_open( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +); + +void ivas_param_ism_dec_close( + PARAM_ISM_DEC_HANDLE *hParamIsmDec, /* i/o: decoder ParamISM handle */ + SPAT_PARAM_REND_COMMON_DATA_HANDLE *hSpatParamRendCom_out, /* i/o: common spatial renderer data */ + const AUDIO_CONFIG output_config /* i : output audio configuration */ +); + +void ivas_param_ism_dec( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float *output_f[] /* i/o: synthesized core-coder transport channels/DirAC output */ +); + +void ivas_ism_dec_digest_tc( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +); + +void ivas_param_ism_dec_digest_tc( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const uint16_t nCldfbSlots, /* i : number of CLFBS slots in the transport channels */ + float *transport_channels_f[] /* i : synthesized core-coder transport channels/DirAC output */ +); + +void ivas_ism_param_dec_tc_gain_ajust( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const uint16_t nSamples, /* i : number of samples to be compensate */ + const uint16_t nFadeLength, /* i : length of the crossfade in samples */ + float *transport_channels_f[] /* i : synthesized core-coder transport channels/DirAC output */ +); + +void ivas_param_ism_dec_render( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */ + uint16_t *nSamplesRendered, /* o : number of CLDFB slots rendered */ + uint16_t *nSamplesAvailable, /* o : number of CLDFB slots still to render */ + float *output_f[] /* o : rendered time signal */ +); + +void ivas_param_ism_params_to_masa_param_mapping( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +); + + +/*----------------------------------------------------------------------------------* + * ISM DTX prototypes + *----------------------------------------------------------------------------------*/ + +ivas_error ivas_ism_dtx_open( + Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ +); + +/*! r: indication of DTX frame */ +int16_t ivas_ism_dtx_enc( + ISM_DTX_HANDLE hISMDTX, /* i/o: ISM DTX handle */ + SCE_ENC_HANDLE hSCE[MAX_SCE], /* i/o: SCE encoder structure */ + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + const int16_t nchan_ism, /* i : number of objects */ + const int16_t nchan_transport, /* i : number of transport channels */ + int16_t vad_flag[MAX_NUM_OBJECTS], /* i : VAD flag */ + ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ + int16_t md_diff_flag[], /* o : metadata differential flag */ + int16_t *sid_flag /* o : indication of SID frame */ +); + +ivas_error ivas_ism_dtx_dec( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + int16_t *nb_bits_metadata /* o : number of metadata bits */ +); + +void ivas_ism_metadata_sid_enc( + ISM_DTX_HANDLE hISMDTX, /* i/o: ISM DTX handle */ + const int16_t flag_noisy_speech, /* i : noisy speech flag */ + const int16_t nchan_ism, /* i : number of objects */ + const int16_t nchan_transport, /* i : number of transport channels */ + const ISM_MODE ism_mode, /* i : ISM mode */ + ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ + const int16_t sid_flag, /* i : indication of SID frame */ + const int16_t md_diff_flag[], /* i : metadata differental flag */ + BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ + int16_t nb_bits_metadata[] /* o : number of metadata bits */ +); + +void ivas_ism_metadata_sid_dec( + SCE_DEC_HANDLE hSCE[MAX_SCE], /* i/o: SCE decoder structure */ + const int32_t ism_total_brate, /* i : ISM total bitrate */ + const int16_t bfi, /* i : bfi flag */ + const int16_t nchan_ism, /* i : number of objects */ + const int16_t nchan_transport, /* i : number of transport channels */ + const ISM_MODE ism_mode, /* i : ISM mode */ + int16_t *flag_noisy_speech, /* o : noisy speech flag */ + int16_t *sce_id_dtx, /* o : SCE DTX ID */ + ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ + int16_t nb_bits_metadata[] /* o : number of metadata bits */ +); + +void ivas_ism_get_sce_id_dtx( + ISM_DTX_HANDLE hISMDTX, /* i/o: ISM DTX handle */ + SCE_ENC_HANDLE hSCE[MAX_SCE], /* i/o: SCE encoder structure */ + const int16_t nchan_transport, /* i : number of transport channels */ + const int16_t input_frame /* i : input frame length per channel */ +); + +void ivas_param_ism_compute_noisy_speech_flag( + Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ +); + +void ivas_ism_coh_estim_dtx_enc( + ISM_DTX_HANDLE hISMDTX, /* i/o: ISM DTX handle */ + SCE_ENC_HANDLE hSCE[MAX_SCE], /* i/o: SCE encoder structure */ + const int16_t nchan_transport, /* i : number of transport channels */ + const int16_t input_frame /* i : input frame length */ +); + +void update_last_metadata( + const int16_t nchan_ism, /* i : number of objects */ + ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ + const int16_t updt_flag[] /* i : last metadata update flag */ +); + +void ivas_get_ism_sid_quan_bitbudget( + const int16_t nchan_ism, /* i : number of objects */ + int16_t *nBits_azimuth, /* o : number of Q bits for azimuth */ + int16_t *nBits_elevation, /* o : number of Q bits for elevation */ + float *q_step, /* o : quantization step */ + float *q_step_border, /* o : quantization step at the border */ + int16_t *nBits_coh, /* o : number of Q bits for coherence */ + int16_t *nBits_sce_id /* o : number of Q bits for sce_id_dtx */ +); + +void ivas_ism_dtx_limit_noise_energy_for_near_silence( + SCE_DEC_HANDLE hSCE[], /* i/o: SCE decoder structures */ + const int16_t sce_id_dtx, /* i : SCE DTX ID */ + const int16_t nchan_transport /* i : number of transport channels */ +); + +/*----------------------------------------------------------------------------------* + * DFT Stereo prototypes + *----------------------------------------------------------------------------------*/ + +ivas_error stereo_dft_enc_create( + STEREO_DFT_ENC_DATA_HANDLE *hStereoDft, /* o : encoder DFT stereo handle */ + const int32_t input_Fs, /* i : input sampling rate */ + const int16_t max_bwidth /* i : maximum encoded bandwidth */ +); + +void stereo_dft_enc_reset( + STEREO_DFT_ENC_DATA_HANDLE hStereoDft /* i/o: encoder stereo handle */ +); + +void stereo_enc_itd_init( + ITD_DATA_HANDLE hItd /* i/o: encoder ITD handle */ +); + +void stereo_dft_enc_update( + STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i/o: encoder DFT stereo handle */ + const int16_t max_bwidth /* i : maximum encoded bandwidth */ +); + +void stereo_dft_enc_destroy( + STEREO_DFT_ENC_DATA_HANDLE *hStereoDft /* i/o: encoder DFT stereo handle */ +); + +void stereo_dft_enc_analyze( + Encoder_State **sts, /* i/o: encoder state structure */ + const int16_t n_channels, /* i : number of input channels */ + const int16_t input_frame, /* i : input frame length */ + STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i/o: encoder DFT stereo handle */ + STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct, /* i/o: encoder MDCT stereo handle */ + float DFT[CPE_CHANNELS][STEREO_DFT_N_MAX_ENC], /* o : DFT buffers */ + float *input_mem[CPE_CHANNELS] /* i/o: input buffer memory */ +); + +float stereo_dft_enc_synthesize( + STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i/o: encoder DFT stereo handle */ + float *output, /* o : output synthesis */ + const int16_t chan, /* i : channel number */ + const int32_t input_Fs, /* i : input sampling rate */ + const int32_t output_sampling_rate, /* i : output sampling rate */ + const int16_t L_frame /* i : frame length at internal Fs */ +); + +void stereo_dft_enc_process( + CPE_ENC_HANDLE hCPE, /* i : CPE encoder structure */ + const int16_t vad_flag_dtx[], /* i : VAD dtx flags */ + const int16_t vad_hover_flag[], /* i : VAD hangover flags */ + const int16_t input_frame /* i : input frame length */ +); + +void stereo_dft_enc_res( + STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i/o: encoder DFT stereo handle */ + const float *input_8k, /* i : input buffer sampled at 8kHz */ + BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ + int16_t *nb_bits, /* o : number of bits written */ + const int16_t max_bits +); + +void stereo_dft_enc_write_BS( + CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ + int16_t *nb_bits /* o : number of bits written */ +); + +void stereo_dtf_cng( + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + float DFT[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* i/o: DFT buffers */ + const int16_t output_frame /* i : output frame size */ +); + +void stereo_dft_cng_side_gain( + STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i/o: DFT stereo encoder handle */ + STEREO_CNG_ENC_HANDLE hStereoCng, /* i/o: Stereo CNG data structure */ + const int32_t core_brate, /* i : core bitrate */ + const int32_t last_core_brate, /* i : last core bitrate */ + const int16_t bwidth /* i : audio band-width */ +); + +void stereo_dft_quantize_res_gains( + const float *g, + const float *r, + float *gq, + float *rq, + int16_t *ig, + int16_t *ir +); + +void stereo_dft_dequantize_itd( + int16_t *ind, + float *out, + const int32_t output_Fs +); + +void stereo_dft_enc_sid_calc_coh( + STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i/o: DFT stereo handle */ + float prev_cohBand[2*(STEREO_DFT_BAND_MAX/2)], /* i/o: Previous coherence */ + int16_t *td_active, /* i/o: TD stereo mode indicator */ + int16_t *first_SID, /* i/o: First SID indicator */ + float *cohBand /* i/o: Coherence per band */ +); + +void stereo_dft_enc_sid_coh( + BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ + float *mem_cohBand, /* i/o: Coherence memory */ + const int16_t nbands, /* i : number of DFT stereo bands */ + int16_t *nb_bits, /* i/o: number of bits written */ + float *cohBand /* i/o: Coherence per band */ +); + +void stereo_dft_dec_sid_coh( + Decoder_State *st, /* i/o: decoder state structure */ + const int16_t nbands, /* i : number of DFT stereo bands */ + float *coh, /* i/o: coherence */ + int16_t *nb_bits /* i/o: number of bits read */ +); + +ivas_error stereo_dft_dec_create( + STEREO_DFT_DEC_DATA_HANDLE *hStereoDft, /* i/o: decoder DFT stereo handle */ + const int32_t element_brate, /* i : element bitrate */ + const int32_t output_Fs, /* i : output sampling rate */ + const int16_t sba_dirac_stereo_flag, /* i : signal stereo output for SBA DirAC */ + const int16_t nchan_transport /* i : number of transport channels */ +); + +void stereo_dft_dec_reset( + STEREO_DFT_DEC_DATA_HANDLE hStereoDft /* i/o: decoder DFT stereo handle */ +); + +void stereo_dft_dec_update( + STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */ + const int16_t output_frame, /* i : output frame length */ + const int16_t sba_dirac_stereo_flag /* i : signal stereo output for SBA DirAC */ +); + +void stereo_dft_dec_destroy( + STEREO_DFT_DEC_DATA_HANDLE *hStereoDft /* i/o: decoder DFT stereo handle */ +); + +void stereo_dft_dec_analyze( + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + const float *input, /* i : input signal */ + float out_DFT[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* o : DFT buffers */ + const int16_t chan, /* i : channel number */ + const int16_t input_frame, /* i : input frame size */ + const int16_t output_frame, /* i : output frame size */ + const DFT_STEREO_DEC_ANA_TYPE ana_type, /* i : signal type to analyze */ + const int16_t k_offset, /* i : offset of DFT */ + const int16_t delay /* i : delay in samples for input signal */ +); + +void stereo_dft_dec_synthesize( + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + float DFT[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* i : DFT buffers */ + const int16_t chan, /* i : channel number */ + float output[L_FRAME48k], /* o : output synthesis signal */ + const int16_t output_frame /* i : output frame length */ +); + +void stereo_dft_dec( + STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */ + Decoder_State *st0, /* i/o: decoder state structure */ + float DFT[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* i/o: DFT buffers */ + float *input_mem, /* i/o: mem of buffer DFT analysis */ + STEREO_CNG_DEC_HANDLE hStereoCng, /* i/o: Stereo CNG data structure */ + const int16_t sba_dirac_stereo_flag, /* i : signal stereo output for SBA DirAC */ + const int16_t sba_mono_flag, /* i : signal mono output for SBA DirAC */ + ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD handle for upmixing */ + const int16_t cross_fade_start_offset, /* i : SPAR mixer delay compensation */ + const int32_t output_Fs, /* i : Fs for delay calculation */ + const int16_t nchan_transport, /* i : number of transpor channels */ + const int16_t num_md_sub_frames /* i : number of MD subframes */ +); + +void stereo_dft_res_ecu( + STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: Decoder DFT stereo handle */ + float *pDFT_RES, /* i/o: residual signal */ + float *const DFT_PRED_RES, /* i/o: residual prediction signal */ + const int16_t k, /* i : Subframe index */ + const int16_t output_frame, /* i : Output frame length */ + const int16_t prev_bfi, /* i : Previous BFI */ + const float dmx_nrg, /* i : Down-mix energy */ + int16_t *num_plocs, /* i/o: Number of peak locations */ + int16_t *plocs, /* i/o: Peak locations (bin) */ + float *plocsi, /* i/o: Peak locations (fractional) */ + float *input_mem /* o : Residual DFT buffer input mem */ +); + +void stereo_dft_res_subst_spec( + STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: Decoder DFT stereo handle */ + float *pDFT_RES, /* i/o: residual signal */ + const float *const DFT_PRED_RES, /* i : residual prediction signal */ + const int16_t time_offs, /* i : Time offset for phase adjustm. */ + const int16_t L_res, /* i : bandwidth of residual signal */ + const int16_t L_ana, /* i : Length of FFT analysis */ + const int16_t k, /* i : Subframe index */ + int16_t *num_plocs, /* i/o: Number of peak locations */ + int16_t *plocs, /* i/o: Peak locations (bin) */ + float *plocsi, /* i/o: Peak locations (fractional) */ + const int16_t analysis_flag /* i : Flag for running peak analysis */ +); + +void stereo_dft_res_ecu_burst_att( + STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: Decoder DFT stereo handle */ + float *pDFT_RES, /* i/o: residual signal /att. residual */ + const float dmx_nrg, /* i : dmx energy of current frame */ + const int16_t L_res, /* i : Bandwidth of residual */ + const int16_t L_ana /* i : Length of FFT analysis */ +); + +/*! r: total energy of downmix with maximum swb bandwidth max */ +float stereo_dft_dmx_swb_nrg( + const float *dmx_k0, /* i : first subframe spectrum */ + const float *dmx_k1, /* i : second subframe spectrum */ + const int16_t frame_length /* i : frame lanegth */ +); + +int16_t stereo_dft_sg_recovery( + STEREO_DFT_DEC_DATA_HANDLE hStereoDft /* i/o: Decoder DFT stereo handle */ +); + +void stereo_dft_dec_res( + CPE_DEC_HANDLE hCPE, /* i/o: decoder CPE handle */ + float res_buf[STEREO_DFT_BUF_MAX], /* i : residual buffer */ + float *output /* o : output frame */ +); + +/*! r: Decision to enable or disable BPF on DFT stereo residual */ +int16_t res_bpf_adapt( + STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: DFT stereo decoder handle */ + const float *bpf_error_signal_8k, /* i : BPF modification signal */ + float res_buf[STEREO_DFT_BUF_MAX] /* i : residual buffer */ +); + +void bpf_pitch_coherence( + Decoder_State *st, /* i/o: decoder state structure */ + const float pitch_buf[] /* i : pitch for each subframe [0,1,2,3] */ +); + +void stereo_dft_dec_read_BS( + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + const int32_t element_brate, /* i : element bitrate */ + int32_t *total_brate, /* o : total bitrate */ + Decoder_State *st, /* i/o: decoder state structure */ + STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */ + const int16_t bwidth, /* i : bandwidth */ + const int16_t output_frame, /* i : output frame length */ + float res_buf[STEREO_DFT_BUF_MAX], /* o : residual buffer */ + int16_t *nb_bits, /* o : number of bits read */ + float *coh, /* i/o: Coherence */ + const int16_t ivas_format /* i : ivas format */ +); + +void stereo_dft_dec_smooth_parameters( + STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */ + const int16_t prev_sid_nodata, /* i : Previous SID/No data indicator */ + const int16_t active_frame_counter, /* i : Active frame counter */ + const int32_t element_brate /* i : Element bitrate */ +); + +void stereo_dft_generate_res_pred( + STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */ + const float samp_ratio, /* i : sampling ratio */ + float *pDFT_DMX, /* i : downmix signal */ + float *DFT_PRED_RES, /* o : residual prediction signal */ + float *pPredGain, /* i : residual prediction gains */ + const int16_t k, /* i : subframe index */ + float *ap_filt_DMX, /* i : enhanced stereo filling signal */ + int16_t *stop, /* o : last FD stereo filling bin */ + const int16_t bfi /* i : BFI flag */ +); + +void stereo_dft_dec_core_switching( + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + float output[], /* i/o: synthesis @internal Fs */ + float synth[], /* i : synthesis @output Fs */ + float hb_synth[], /* i/o: hb synthesis */ + float DFT[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* o : DFT buffers */ + const int16_t output_frame, /* i : output frame length */ + const int16_t use_cldfb_for_dft, /* i : flag to use of CLDFB for DFT Stereo */ + const int16_t sba_dirac_stereo_dtx_flag /* i : DTX indicator for SBA DirAC stereo */ +); + +void init_basic_allpass( + basic_allpass_t *ap, /* i/o: basic allpass structure */ + const float *gains, /* i : allpass filter gains */ + const int16_t *delays /* i : allpass filter delays */ +); + +void filter_with_allpass( + const float *sig, /* i : allpass input signal */ + float *out, /* o : filtered output */ + const int16_t len, /* i : length of input */ + basic_allpass_t *ap /* i/o: basic allpass structure */ +); + +/*! r: used GR order */ +int16_t write_bitstream_adapt_GR( + BSTR_ENC_HANDLE hBstr, /* i/o: Encoder bitstream handle */ + const int16_t Indice, /* i : identifier for bitstream index */ + const int16_t *in, /* i : values to be written in bitstream */ + const int16_t len, /* i : values vector length */ + const int16_t GR_ord, /* i : GR order to be used */ + const int16_t sp_aud_decision /* i : speech/music 0/1 */ +); + +/*! r: used GR order */ +int16_t adapt_GR_ief( + const int16_t *in, /* i : vector to encode */ + int16_t *in_diff, /* o : encoded symbols in case of differential encoding */ + const int16_t *prev, /* i : previous frame data */ + const int16_t len, /* i : input vector length */ + const int16_t no_symb, /* i : number of symbols */ + int16_t *nbits, /* o : number of used bits */ + int16_t *in_enc, /* o : symbold actually encoded after adapt_GR */ + const int16_t *map0, /* i : mapping array */ + const int16_t no_GR_ord, /* i : number of GR order to try 2: 0,1; 3:0,1,2 */ + int16_t *nbits_diff, /* o : number bits in diff encoding */ + const int16_t side_gain_counter, /* i : number of frames since last abs coding */ + float *side_gain_bitdiff_lp, /* i/o: LP-filtered bit difference between abs/diff */ + const int16_t try_diff /* i : diff coding allowed 1/0 */ +); + +/*! r: used GR order */ +int16_t adapt_GR_rpg1_ief( + const int16_t *in, /* i : res pred gains input vector */ + int16_t *in_diff, /* o : encoded symbols in case of differential encoding */ + const int16_t *prev, /* i : previous frame data */ + const int16_t len, /* i : input vector length */ + const int16_t no_symb, /* i : number of symbols */ + int16_t *nbits, /* o : number of used bits */ + int16_t *in_enc, /* o : symbold actually encoded after adapt_GR */ + const int16_t *maps, /* i : mapping array */ + int16_t *nbits_diff, /* o : estimated no of bits for differential encoding */ + const int16_t no_GR_ord, /* i : number of GR order to try 2: 0,1; 3:0,1,2 */ + const int16_t try_diff /* i : diff coding allowed 1/0 */ +); + +/*! r: number of bits written */ +int16_t write_GR1( + BSTR_ENC_HANDLE hBstr, /* i/o: Encoder bitstream handle */ + const int16_t ind, /* i : bitstream index */ + const int16_t *in, /* i : input vector */ + const int16_t len /* i : vector length */ +); + +/*! r: number of bits written */ +int16_t write_bitstream_GR( + BSTR_ENC_HANDLE hBstr, /* i/o: Encoder bitstream handle */ + const int16_t ind, /* i : bitstream index */ + const int16_t *in, /* i : input date to be written */ + const int16_t len, /* i : input data length */ + const int16_t GR_ord /* i : GR order to be used */ +); + +/*! r: number of bits read */ +int16_t read_flag_EC_DFT( + const uint16_t *bit_stream, /* i : bitstream */ + int16_t *flag /* o : flag value */ +); + +/*! r: number of bits read */ +int16_t read_BS_GR( + const uint16_t *bit_stream, /* i : bitstream to be read */ + const int16_t nb, /* i : starting point in bitstream */ + int16_t *ind1, /* o : data array read */ + const int16_t len, /* i : number of params to be read */ + int16_t *GR_ord /* o : GR order to be used */ +); + +/*! r: number of bits read */ +int16_t read_BS_adapt_GR_rpg( + const uint16_t *bit_stream, /* i : bitstream to be read */ + const int16_t nb, /* i : starting point in bitstream */ + int16_t *ind1_pred, /* o : decoded res pred gains */ + const int16_t start, /* i : starting subband */ + const int16_t total_no, /* i : number of params to be read */ + int16_t *GR_ord /* o : GR order - read */ +); + +/*! r: value read on nbits from bitstream */ +int16_t get_value( + const uint16_t *bit_stream, /* i : bitstream */ + const int16_t nbits /* i : number of bits to be read */ +); + +/*! r: number of bits read */ +int16_t read_itd( + Decoder_State *st, /* i : decoder state */ + int16_t *pI /* o : decoded ITD value */ +); + +/*! r: number of bits read */ +int16_t read_BS_adapt_GR_sg( + const uint16_t *bit_stream, /* i : bitstream to be read */ + const int16_t nb, /* i : starting position to be read */ + int16_t *ind1, /* o : decoded side gain values */ + const int16_t len, /* i : number of params to be read */ + int16_t *GR_ord, /* o : GR order to be used */ + const int16_t *map0 /* i : mapping array for side gains */ +); + +void stereo_dft_hybrid_ITD_flag( + STEREO_DFT_CONFIG_DATA_HANDLE hConfig, /* o : DFT stereo configuration */ + const int32_t input_Fs, /* i : CPE element sampling rate */ + const int16_t hybrid_itd_max /* i : flag for hybrid ITD for very large ITDs */ +); + +void stereo_dft_enc_compute_itd( + CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ + float *DFT_L, + float *DFT_R, + const int16_t k_offset, + const int16_t input_frame, + const int16_t vad_flag_dtx[], + const int16_t vad_hover_flag[], + float *bin_nrgL, + float *bin_nrgR +); + +void stereo_dft_config( + STEREO_DFT_CONFIG_DATA_HANDLE hConfig, /* o : DFT stereo configuration */ + const int32_t brate, /* i : IVAS/CPE/nominal total bitrate */ + int16_t *bits_frame_nominal, /* o : primary channel nominal bits per frame */ + int16_t *bits_frame_nominal_2 /* o : secondary channel nominal bits per frame*/ +); + +int16_t stereo_dft_band_config( + int16_t *band_limits, /* o : DFT band limits */ + const int16_t band_res, /* i : DFT band resolution */ + const int16_t NFFT, /* i : analysis/synthesis window length */ + const int16_t enc_dec /* i : flag to indicate enc vs dec */ +); + +void stereo_td_itd( + ITD_DATA *hITD, /* i/o: ITD data structure */ + float input_mem_itd[CPE_CHANNELS][STEREO_DFT_OVL_MAX], /* o : ITD memory (only used in DFT Stereo) */ + const int16_t hybrid_itd_flag, /* i : flag for hybrid TD/FD ITD processing */ + const int16_t dft_ovl, /* i : size of DFT overlap */ + Encoder_State **sts, /* i/o: Encoder state structure */ + const int16_t input_frame, /* i : input frame length */ + float *input_mem[CPE_CHANNELS] /* i/o: input buffer memory */ +); + +void stereo_dft_dmx_out_reset( + STEREO_DFT_DMX_DATA_HANDLE hStereoDftDmx /* i/o: DFT stereo DMX decoder */ +); + +void stereo_dft_unify_dmx( + STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder stereo handle */ + Decoder_State *st0, /* i/o: decoder state structure */ + float DFT[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* i/o: DFT buffers */ + float *input_mem, /* i/o: mem of buffer DFT analysis */ + const int16_t prev_sid_nodata /* i : Previous SID/No data indicator */ +); + +void add_HB_to_mono_dmx( + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + float output[L_FRAME48k], /* i/o: output synthesis */ + float outputHB[L_FRAME48k], /* i : HB synthesis */ + const int16_t last_core, /* i : last core, primary channel */ + const int16_t output_frame /* i : frame length */ +); + +/*----------------------------------------------------------------------------------* + * Range Coder prototypes + *----------------------------------------------------------------------------------*/ + +void rc_uni_enc_init( + RangeUniEncState *rc_st_enc /* i/o: RC state handle */ +); + +void rc_uni_enc_encode_fast( + RangeUniEncState *rc_st_enc, /* i/o: RC state handle */ + const uint16_t cum_freq, /* i : Cumulative frequency up to symbol */ + const uint16_t sym_freq, /* i : Symbol frequency */ + const uint16_t tot_shift /* i : Total frequency as a power of 2 */ +); + +void rc_uni_enc_encode_symbol_fastS( + RangeUniEncState *rc_st_enc, /* i/o: Encoder state */ + const uint16_t symbol, /* i : Symbol to encode */ + const uint16_t cum_freq[], /* i : Cumulative frequency up to symbol */ + const uint16_t sym_freq[], /* i : Symbol frequency */ + const uint16_t tot_shift /* i : Total frequency as a power of 2 */ +); + +void rc_uni_enc_encode_bits( + RangeUniEncState *rc_st_enc, /* i/o: RC state handle */ + const uint16_t value, /* i : Value to encode */ + const int16_t bits /* i : Number of bits */ +); + +/*! r: Total number of bits produced */ +int16_t rc_uni_enc_virtual_finish( + RangeUniEncState *rc_st_enc /* i : RC state handle */ +); + +/*! r: Total number of bits produced */ +int16_t rc_uni_enc_finish( + RangeUniEncState *rc_st_enc /* i/o: RC state handle */ +); + +void rc_uni_dec_init( + RangeUniDecState *rc_st_dec, /* i/o: RC state handle */ + uint16_t *bit_buffer, /* i : Bit buffer */ + const int16_t max_available_bits /* i : Total maximum bits available */ +); + +/*! r: Read symbol */ +uint16_t rc_uni_dec_read_symbol_fastS( + RangeUniDecState *rc_st_dec, /* i/o: Decoder State */ + const uint16_t cum_freq_table[], /* i : Cumulative frequency up to symbol */ + const uint16_t sym_freq_table[], /* i : Symbol frequency */ + const uint16_t alphabet_size, /* i : Number of symbols in the alphabet */ + const uint16_t tot_shift /* i : Total frequency as a power of 2 */ +); + +/*! r: Read bit */ +uint16_t rc_uni_dec_read_bit( + RangeUniDecState *rc_st_dec /* i/o: RC state handle */ +); + +/*! r: Read bit */ +uint16_t rc_uni_dec_read_bit_prob_fast( + RangeUniDecState *rc_st_dec, /* i/o: RC state handle */ + const int16_t freq0, /* i : Frequency for symbol 0 */ + const uint16_t tot_shift /* i : Total frequency as a power of 2 */ +); + +/*! r: Read bits */ +uint16_t rc_uni_dec_read_bits( + RangeUniDecState *rc_st_dec, /* i/o: RC state handle */ + const int16_t bits /* i : Number of bits */ +); + +/*! r: Total number of bits consumed */ +int16_t rc_uni_dec_virtual_finish( + RangeUniDecState *rc_st_dec /* i/o: RC state handle */ +); + +/*! r: Total number of bits consumed */ +int16_t rc_uni_dec_finish( + RangeUniDecState *rc_st_dec /* i/o: RC state handle */ +); + + +/*----------------------------------------------------------------------------------* + * ECLVQ Stereo prototypes + *----------------------------------------------------------------------------------*/ + +float ECSQ_dequantize_gain( + const int16_t index +); + +void ECSQ_quantize_vector( + const float *input, + const float global_gain, + const int16_t N, + int16_t *output +); + +float ECSQ_compute_optimal_gain( + const float *input, + const int16_t N, + const int16_t *output +); + +void ECSQ_init_instance( + ECSQ_instance *ecsq_inst, + const int16_t config_index, + void *ac_handle +); + +int32_t ECSQ_encode_target_SNR( + ECSQ_instance *ecsq_inst, + const float *input, + const int16_t N, + const float target_SNR, + const int16_t max_bits, + float *output, + int16_t *global_gain_index_output +); + +void ECSQ_decode( + ECSQ_instance *ecsq_inst, + const int16_t N, + int16_t *output +); + +void ECSQ_dequantize_vector( + const int16_t *input, + const float global_gain, + const int16_t N, + float *output +); + + +/*----------------------------------------------------------------------------------* + * ICA Stereo prototypes + *----------------------------------------------------------------------------------*/ + +void stereo_tca_init_enc( + STEREO_TCA_ENC_HANDLE hStereoTCA, /* i/o: Stereo TCA encoder handle */ + const int32_t input_Fs /* i : input sampling frequency */ +); + +void stereo_tca_enc( + CPE_ENC_HANDLE hCPE, /* i : CPE encoder structure */ + const int16_t input_frame /* i : length of a frame per channel */ +); + +void stereo_tca_init_dec( + STEREO_TCA_DEC_HANDLE hStereoTCA /* i/o: Stereo TCA handle */ +); + +void stereo_tca_dec( + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + float *synth[CPE_CHANNELS], /* i/o: output synth */ + const int16_t output_frame /* i : length of a frame per channel */ +); + +void stereo_tca_scale_R_channel( + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + float *output, /* i/o: output synthesis, R channel */ + const int16_t output_frame /* i : frame length */ +); + +void adjustTargetSignal( + float *target, + const int16_t prevShift, + const int16_t currShift, + const int16_t L_shift_adapt, + const int16_t method +); + + +/*----------------------------------------------------------------------------------* + * IC-BWE Stereo prototypes + *----------------------------------------------------------------------------------*/ + +void stereo_icBWE_init_enc( + STEREO_ICBWE_ENC_HANDLE hStereoICBWE /* i/o: Stereo inter-channel BWE handle */ +); + +void spectral_balancer( + float *signal, + float *mem, + const int16_t lg, + const int16_t coeff_set +); + +void stereo_icBWE_preproc( + CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ + const int16_t input_frame, /* i : input frame length */ + float shb_speech_nonref[] /* o : SHB speech non-ref channel */ +); + +void stereo_icBWE_enc( + CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ + const float shb_speech_ref[], /* i : SHB speech ref channel */ + float shb_speech_nonref[], /* i/o: SHB speech non-ref channel */ + const float *voice_factors /* i : voicing factors */ +); + +void stereo_icBWE_init_dec( + STEREO_ICBWE_DEC_HANDLE hStereoICBWE /* i/o: Stereo inter-channel BWE handle */ +); + +void stereo_icBWE_dec( + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + float *synthRef, /* i/o: Reference channel HB synthesis at output Fs */ + float *synth, /* o : Non reference channel HB synthesis at output Fs */ + const float *fb_synth_ref, /* i : ref. high-band synthesis 16-20 kHz */ + const float *voice_factors, /* i : voicing factors */ + const int16_t output_frame /* i : frame length */ +); + +void stereo_icBWE_decproc( + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + float *output[CPE_CHANNELS], /* i/o: output symthesis */ + float outputHB[CPE_CHANNELS][L_FRAME48k], /* i : HB synthesis */ + const int16_t last_core, /* i : last core, primary channel */ + const int16_t last_bwidth, /* i : last bandwidth */ + const int16_t output_frame /* i : frame length */ +); + + +/*----------------------------------------------------------------------------------* + * Stereo classifiers prototypes + *----------------------------------------------------------------------------------*/ + +/*! r: element mode */ +int16_t select_stereo_mode( + CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const int32_t ivas_total_brate /* i : IVAS total brate */ +); + +void stereo_classifier_init( + STEREO_CLASSIF_HANDLE hStereoClassif /* i/o: stereo classifier structure */ +); + +void stereo_classifier_features( + STEREO_CLASSIF_HANDLE hStereoClassif, /* i/o: stereo classifier structure */ + const int16_t idchan, /* i : channel ID */ + const int16_t element_mode, /* i : element mode */ + const int16_t vad_flag, /* i : VAD flag */ + const float lsf_new[], /* i : LSFs at the end of the frame */ + const float epsP[], /* i : LP analysis residual energies for each iteration*/ + const int16_t pitch[], /* i : open-loop pitch values for quantiz. */ + const float voicing[], /* i : OL maximum normalized correlation */ + const float cor_map_sum, /* i : speech/music clasif. parameter */ + const float non_staX, /* i : unbound non-stationarity for sp/mu clas. */ + const float sp_div, /* i : spectral diversity feature */ + const int16_t clas /* i : signal class */ +); + +void unclr_classifier_dft( + CPE_ENC_HANDLE hCPE /* i/o: CPE encoder structure */ +); + +void unclr_classifier_td( + CPE_ENC_HANDLE hCPE /* i/o: CPE encoder structure */ +); + +void xtalk_classifier_dft( + CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ + const int16_t itd, /* i : ITD from DFT stereo - used as a feature */ + const float gcc_phat[] /* i : GPHAT cross-channel correlation function */ +); + +void xtalk_classifier_td( + CPE_ENC_HANDLE hCPE /* i/o: CPE encoder structure */ +); + + +/*----------------------------------------------------------------------------------* + * TD Stereo prototypes + *----------------------------------------------------------------------------------*/ + +void stereo_td_init_enc( + STEREO_TD_ENC_DATA_HANDLE hStereoTD, /* i/o: TD stereo encoder handle */ + const int16_t last_element_mode /* i : last element mode */ +); + +ivas_error stereo_set_tdm( + CPE_ENC_HANDLE hCPE, /* i : CPE encoder structure */ + const int16_t input_frame /* i : input frame length per channel */ +); + +void stereo_tdm_prep_dwnmx ( + CPE_ENC_HANDLE hCPE, /* i : CPE encoder structure */ + const float *input1, /* i : right channel input */ + const int16_t input_frame /* i : frame lenght */ +); + +int16_t stereo_tdm_ener_analysis( + const int16_t ivas_format, /* i : IVAS format */ + CPE_ENC_HANDLE hCPE, /* i : CPE structure */ + const int16_t input_frame, /* i : Number of samples */ + int16_t *tdm_SM_or_LRTD_Pri, /* o : channel combination scheme flag in TD stereo OR LRTD primary channel */ + int16_t *tdm_ratio_idx_SM /* o : TDM ratio index for SM mode */ +); + +void stereo_tdm_downmix( + STEREO_TD_ENC_DATA_HANDLE hStereoTD, /* i : TD stereo IVAS encoder structure */ + float *Left_in, /* i/o: Left channel -> Primary channel */ + float *Right_in, /* i/o: Right channel -> Secondary channel */ + const int16_t input_frame, /* i : Number of samples */ + const int16_t tdm_ratio_idx, /* i : TDM ratio index */ + const int16_t tdm_SM_flag, /* i : channel combination scheme flag */ + const int16_t tdm_ratio_idx_SM /* i : TDM ratio index for SM mode */ +); + +void stereo_td_init_dec( + STEREO_TD_DEC_DATA_HANDLE hStereoTD, /* i/o: TD stereo decoder handle */ + const int16_t last_element_mode /* i : last element mode */ +); + +void tdm_configure_dec( + const int16_t ivas_format, /* i : IVAS format */ + const int16_t ism_mode, /* i : ISM mode in combined format */ + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + int16_t *tdm_ratio_idx, /* o : ratio index */ + const int16_t nb_bits_metadata /* i : number of metadata bits */ +); + +void tdm_upmix_plain( + float Left[], /* o : left channel */ + float Right[], /* o : right channel */ + const float PCh_2_L[], /* i : primary channel */ + const float SCh_2_R[], /* i : secondary channel */ + const float LR_ratio, /* i : mixing ratio */ + const float inv_den_LR_ratio, /* i : inverse mixing ration */ + const int16_t start_index, /* i : start index */ + const int16_t end_index, /* i : end index */ + const int16_t plus_minus_flag /* i : plus/minus flag */ +); + +void stereo_tdm_combine( + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + float *PCh_2_L, /* i/o: Primary channel -> output as L channel */ + float *SCh_2_R, /* i/o: Seconday channel -> output as R channel */ + const int16_t output_frame, /* i : Number of samples */ + const int16_t flag_HB, /* i : flag to distinguish between core (0) and HB (1) synthesis */ + const int16_t tdm_ratio_idx /* i : TDM ratio index */ +); + +/*! r: replication decision; 1 = Use old LP */ +int16_t tdm_lp_comparison( + STEREO_TD_ENC_DATA_HANDLE hStereoTD, /* i/o: TD stereo encoder handle */ + STEREO_CLASSIF_HANDLE hStereoClassif, /* i/o: stereo classifier structure */ + Encoder_State *st, /* i/o: Encoder structure */ + const float *speech, /* i : Current speech frame */ + const float *A_Pch, /* i : primary channel LP coefficients */ + const float *A_SCh, /* i : secondary channel LP coefficients */ + const int16_t m, /* i : filter length */ + const float *isp_PCh, /* i : primary channel LSPs */ + const float *isp_SCh, /* i : secondary channel LSPs */ + const int16_t L_frame, /* i : frame length */ + const int32_t element_brate_wo_meta /* i : element bitrate without metadata */ +); + +/*! r: replication decision; 1 = Use old LP */ +void tdm_ol_pitch_comparison( + CPE_ENC_HANDLE hCPE, /* i : CPE encoder structure */ + float pitch_fr[CPE_CHANNELS][NB_SUBFR], /* i/o: fractional pitch values */ + float voicing_fr[CPE_CHANNELS][NB_SUBFR] /* i/o: fractional pitch gains */ +); + +void tdm_configure_enc( + const int16_t ivas_format, /* i : IVAS format */ + const int16_t ism_mode, /* i : ISM mode in combined format */ + CPE_ENC_HANDLE hCPE, /* i : CPE encoder structure */ + const float Etot_last[CPE_CHANNELS], /* i/o: Energy of last frame */ + const int16_t tdm_SM_or_LRTD_Pri, /* i : channel combination scheme flag in TD stereo OR LRTD primary channel */ + const int16_t tdm_ratio_idx, /* i : ratio index */ + const int16_t tdm_ratio_idx_SM, /* i : ratio index in SM mode */ + const int16_t attack_flag, /* i : Primary channel attack flag */ + const int16_t nb_bits_metadata /* i : number of metadata bits */ +); + +ivas_error signaling_enc_secondary( + Encoder_State *st, /* i/o: Encoder structure */ + const int16_t tdm_SM_flag, /* i : channel combination scheme flag */ + const int16_t tdm_Pitch_reuse_flag /* i : primary channel pitch reuse flag */ +); + +void tdm_bit_alloc( + const int16_t ivas_format, /* i : IVAS format */ + const int16_t ism_mode, /* i : ISM mode in combined format */ + const int32_t element_brate_wo_meta, /* i : element bitrate without metadata */ + const int16_t tdm_lp_reuse_flag, /* i : LPC reusage flag */ + int32_t *total_brate_pri, /* o : Allocated primary channel bitrate */ + int32_t *total_brate_sec, /* o : Allocated secondary channel bitrate */ + int16_t *tdm_low_rate_mode, /* o : secondary channel low rate mode flag */ + const int16_t coder_type, /* i : secondary channel coder type */ + const int16_t ener_ratio_idx, /* i : correlation ratio indexe */ + const int16_t tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag */ + const int16_t bwidth_pri, /* i : bandwidth of the primary channel */ + const int16_t bwidth_sec, /* i : bandwidth of the secondary channel */ + const int16_t flag_ACELP16k_pri, /* i : ACELP@16kHz core flag, primary chan. */ + const int16_t tdm_LRTD_flag, /* i : LRTD stereo mode flag */ + const int16_t coder_type0, /* i : coder type (temporary in the encoder, from bitstream in decoder) */ + const int16_t tdm_inst_ratio_idx /* i : instantaneous correlation ratio index */ +); + +void td_stereo_param_updt( + const float lsp_old_PCh[], /* i : primary channel old LSPs */ + const float lsf_old_PCh[], /* i : primary channel old LSFs */ + const float pitch_buf_PCh[], /* i : primary channel pitch buffer */ + float tdm_lspQ_PCh[], /* o : Q LSPs for primary channel */ + float tdm_lsfQ_PCh[], /* o : Q LSFs for primary channel */ + float tdm_Pri_pitch_buf[], /* o : pitch values for primary channel */ + const int16_t flag_ACELP16k, /* i : ACELP@16kHz flag */ + const int16_t tdm_use_IAWB_Ave_lpc /* i : flag to indicate the usage of mean inactive LP coefficients */ +); + +void gsc_enc( + Encoder_State *st, /* i/o: State structure */ + float res_dct_in[], /* i : dct of residual signal */ + float exc_dct_in[], /* i/o: dct of pitch-only excitation / total excitation */ + const int16_t Diff_len, /* i : Lenght of the difference signal (before pure spectral)*/ + const int16_t bits_used, /* i : Number of bit used before frequency Q */ + const int16_t nb_subfr, /* i : Number of subframe considered */ + const float *lsf_new, /* i : ISFs at the end of the frame */ + float *exc_wo_nf, /* o : excitation (in f domain) w/o noisefill */ + float *tmp_noise /* o : long-term noise energy */ +); + +void tdm_low_rate_enc( + Encoder_State *st, /* i/o: State structure */ + const float Aq[], /* i : 12k8 Lp coefficient */ + const float *res, /* i : residual signal */ + float *synth, /* i/o: core synthesis */ + float *exc, /* i/o: current non-enhanced excitation */ + float *pitch_buf, /* i/o: floating pitch values for each subframe */ + float *voice_factors, /* o : voicing factors */ + float *bwe_exc, /* o : excitation for SWB TBE */ + const int16_t attack_flag, /* i : attck flag */ + const float *lsf_new, /* i : current frame ISF vector */ + float *tmp_noise /* o : long-term noise energy */ +); + +/*! r: value of the indice */ +uint16_t get_indice_st( + Decoder_State *st, /* i/o: decoder state structure */ + const int32_t element_brate, /* i : element bitrate */ + const int16_t pos, /* i : absolute position in the bitstream */ + const int16_t nb_bits /* i : number of bits to quantize the indice */ +); + +void tdm_low_rate_dec( + Decoder_State *st, /* i/o: decoder static memory */ + float dct_epit[], /* o : GSC excitation in DCT domain */ + float *tmp_noise, /* o : long term temporary noise energy */ + float *pitch_buf, /* o : floating pitch values for each subframe */ + float *voice_factors, /* o : voicing factors */ + float *exc, /* i/o: adapt. excitation exc */ + float *exc2, /* i/o: adapt. excitation/total exc */ + float *bwe_exc, /* o : excitation for SWB TBE */ + const float *lsf_new /* i : ISFs at the end of the frame */ +); + +void tdm_SCh_LSF_intra_pred( + const int32_t element_brate, /* i : element bitrate */ + const float *tdm_lsfQ_PCh, /* i : primary channel LSFs */ + float *pred_lsf_SCh /* o : predicted secondary channel LSFs */ +); + +void tdm_SCh_lsf_reuse( + const int16_t enc_dec, /* i : encoder/decoder flag */ + const int32_t element_brate, /* i : element bitrate */ + float lsf_new[M], /* i/o: LSFs at the end of the frame */ + float lsp_new[M], /* i/o: LSPs at the end of the frame */ + const float tdm_lsfQ_PCh[M], /* i : primary channel LSFs */ + const float lsf_wgts[M], /* i : LSF weights */ + int16_t *beta_index /* i/o: quantization index */ +); + +void first_VQstages( + const float *const *cb, + const float u[], /* i : vector to be encoded (prediction and mean removed) */ + const int16_t *levels, /* i : number of levels in each stage */ + const int16_t stagesVQ, /* i : number of stages */ + const float w[], /* i : weights */ + const int16_t N, /* i : vector dimension */ + const int16_t max_inner, /* i : maximum number of swaps in inner loop */ + int16_t indices_VQstage[] +); + +UWord32 index_lvq_SHB( + const int16_t idx_lead, + const int16_t idx_scale, + const int16_t nbits, + float *lat_cv, + const int16_t mode +); + +void deindex_lvq_SHB( + UWord32 index, + float *out, + const int16_t nbits, + const int16_t mode +); + +/*----------------------------------------------------------------------------------* + * MDCT Stereo prototypes + *----------------------------------------------------------------------------------*/ + +void stereo_td_itd_mdct_stereo( + CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder handle */ + const int16_t vad_flag_dtx[], /* i : VAD dtx flags */ + const int16_t vad_hover_flag[], /* i : VAD hangover flags */ + const int16_t input_frame /* i : frame length */ +); + +void QuantizeTCXSpectrum( + Encoder_State *st, /* i : state handle */ + const int16_t frame_cnt, /* i : frame counter in the super_frame */ + const float *x_orig, /* i : shaped MDCT spectrum */ + const float *gainlpc, /* i : FDNS gains */ + const Word16 *Aqind, /* i : frame-independent quantized coefficients (M+1) */ + const int16_t tnsSize, /* i : number of tns parameters put into prm */ + const int16_t nb_bits, /* i : bit budget */ + const int16_t vad_hover_flag, /* i : VAD hangover flag */ + int16_t *pL_frameTCX, /* o : full frame length */ + int16_t *pL_frame, /* o : frame length */ + int16_t *pL_spec, /* o : length of the coded spectrum */ + int16_t *ptcx_offset, /* o : folding point offset relative to the end of the previous frame */ + int16_t *pnoiseFillingBorder, /* o : noise filling border */ + float spectrum[], /* o : quantized MDCT spectrum */ + CONTEXT_HM_CONFIG *hm_cfg, /* o : Context-based harmonic model configuration */ + int16_t *hm_active, /* o : flag indicating if the harmonic model is active */ + float lf_deemph_fact[], /* o : low frequency deemphasis factors */ + int16_t *nf_seed, /* o : noise filling random seed */ + float *ener, /* o : energy of the quantized spectrum */ + float *gain_tcx, /* o : global gain */ + int16_t prm[] /* o : tcx parameters */ +); + +void EstimateStereoTCXNoiseLevel( + Encoder_State **sts, /* i : state handle */ + float *q_spectrum[CPE_CHANNELS][NB_DIV], /* i : quantized MDCT spectrum */ + float gain_tcx[][NB_DIV], /* i : global gain */ + int16_t L_frame[][NB_DIV], /* i : frame length */ + int16_t noiseFillingBorder[][NB_DIV], /* i : noise filling border */ + int16_t hm_active[][NB_DIV], /* i : flag indicating if the harmonic model is active */ + const int16_t ignore_chan[], /* i : flag indicating whether the channel should be ignored */ + float fac_ns[][NB_DIV], /* o : noise filling level */ + int16_t param_core[][NB_DIV * NPRM_DIV], /* o : quantized noise filling level */ + const int16_t MCT_flag /* i : hMCT handle allocated (1) or not (0) */ +); + +void TNSAnalysisStereo( + Encoder_State **sts, /* i : state handle */ + float *mdst_spectrum[MCT_MAX_CHANNELS][NB_DIV], /* o : MDST spectrum */ + const int16_t bWhitenedDomain, /* i : whitened domain flag */ + int16_t tnsSize[MCT_MAX_CHANNELS][NB_DIV], /* i : number of tns parameters put into prm */ + int16_t tnsBits[MCT_MAX_CHANNELS][NB_DIV], /* i : number of tns bits in the frame */ + int16_t param_core[][NB_DIV * NPRM_DIV], /* o : quantized noise filling level */ + const int16_t mct_on /* i : flag mct block (1) or stereo (0) */ +); + +void InternalTCXDecoder( + Encoder_State *st, /* i/o: state handle */ + const int16_t frame_cnt, /* i : frame counter in the super_frame */ + const int16_t L_frameTCX, /* i : full frame length */ + const int16_t L_frame, /* i : frame length */ + const int16_t L_spec, /* i : length of the coded spectrum */ + const int16_t tcx_offset, /* i : folding point offset relative to the end of the previous frame */ + const int16_t noiseFillingBorder, /* i : noise filling border */ + const float *x_quant, /* i : quantized spectrum */ + const float ener, /* i : energy of the quantized spectrum */ + float lf_deemph_fact[], /* i/o: low frequency deemphasis factors */ + const float fac_ns, /* i : noise filling level */ + const int16_t nf_seed, /* i : noise filling random seed */ + const float *A, /* i : LPC representation of the FDNS gains */ + float *gainlpc, /* i/o: FDNS gains */ + const int16_t hm_active, /* i : flag indicating if the harmonic model is active */ + float gain_tcx, /* i/o: global gain / quantized global gain */ + float spectrum[], /* o : dequantized spectrum */ + float synth[], /* o : time domain signal */ + int16_t *gain_tcx_q /* o : quantized global gain (at low bitrates) */ +); + +void stereo_mdct_core_enc( + CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ + float new_samples[CPE_CHANNELS][L_INP], /* i : new samples */ + float old_wsp[CPE_CHANNELS][L_WSP], /* i : 12.8kHz weighted speech (for LTP */ + float pitch_buf[CPE_CHANNELS][NB_SUBFR16k] /* o : floating pitch for each subframe */ +); + +void initMdctStereoEncData( + STEREO_MDCT_ENC_DATA *hStereoMdct, /* i/o: mdct stereo parameters structure */ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const int16_t element_mode, /* i : element mode */ + const int32_t element_brate, /* i : element bitrate */ + const int16_t bwidth, /* i : bandwidth */ + const int16_t igf, /* i : flag indicating IGF activity */ + const H_IGF_GRID hIgfGrid, /* i : IGF grid setup */ + const int16_t mem_init /* i : initialize memory after malloc */ +); + +ivas_error initMdctItdHandling( + STEREO_MDCT_ENC_DATA *hStereoMdct, /* i/o: mdct stereo parameters structure */ + const int32_t input_Fs /* i : input sampling rate */ +); + +void stereo_mdct_enc_destroy( + STEREO_MDCT_ENC_DATA_HANDLE *hStereoMdct /* i/o: encoder MDCT stereo handle */ +); + +void initMdctStereoDecData( + STEREO_MDCT_DEC_DATA *hStereoMdct, /* i/o: mdct stereo parameters structure */ + const int16_t igf, /* i : flag indicating IGF activity */ + const H_IGF_GRID igfGrid, /* i : IGF grid configuration */ + const int32_t element_brate, /* i : element bitrate */ + const int16_t bwidth /* i : audio bandwidth */ +); + +void stereo_mdct_init_bands( + const int16_t L_frame, /* i : frame length */ + const int16_t tmp_tcx_mode, /* i : tcx mode (TCX10, TCX 20), -1 if transition frame */ + const int32_t element_brate, /* i : element bitrate */ + const int16_t igf, /* i : flag indicating if IGF is used */ + const H_IGF_GRID hIgfGrid, /* i : IGF grid setup */ + int16_t *sfbOffset, /* o : sfb offset table */ + int16_t *sfbCnt /* o : number of sfbs */ +); + +void stereo_mdct_init_igf_start_band( + STEREO_MDCT_BAND_PARAMETERS *stbParams, /* i/o: stereo frequency band parameters */ + const float transFac, /* i : transform factor */ + const int16_t bwidth, /* i : audio bandwidth */ + const int32_t element_brate /* i : element bitrate */ +); + +void init_tcx_enc_info( + Encoder_State *st, /* i : coder memory state */ + int16_t *L_frame, + int16_t *L_frameTCX, + int16_t *L_spec +); + +void decoder_tcx_invQ( + Decoder_State *st, /* i/o: coder memory state */ + int16_t prm[], /* i : parameters */ + float A[], /* i : coefficients NxAz[M+1] */ + Word16 Aind[], /* i : frame-independent coefficients Az[M+1] */ + const int16_t L_spec, + const int16_t L_frame, + const int16_t L_frameTCX, + float x[], + float gainlpc2[], + float xn_buf[], + int16_t *fUseTns, /* o : flag that is set if TNS data is present */ + STnsData *tnsData, + float *gain_tcx, + const int16_t **prm_sqQ, + int16_t *nf_seed, + const int16_t bfi, /* i : Bad frame indicator */ + const int16_t frame_cnt /* i : frame counter in the super frame */ +); + +void decoder_tcx_noisefilling( + Decoder_State *st, /* i/o: coder memory state */ + float concealment_noise[L_FRAME48k], + const float A[], /* i : coefficients NxAz[M+1] */ + const int16_t L_frameTCX_glob, + const int16_t L_spec, + const int16_t L_frame, + const int16_t L_frameTCX, + float x[], + float gainlpc2[], + int16_t *temp_concealment_method, + const float gain_tcx, + const int16_t *prm_sqQ, + int16_t nf_seed, + const int16_t bfi, /* i : Bad frame indicator */ + const int16_t MCT_flag, /* i : hMCT handle allocated (1) or not (0) */ + const int16_t frame_cnt /* i : frame counter in the super frame */ +); + +void decoder_tcx_noiseshaping_igf( + Decoder_State *st, /* i/o: coder memory state */ + const int16_t L_spec, + const int16_t L_frame, + const int16_t L_frameTCX, + const int16_t left_rect, + float x[], + const float gainlpc2[], + int16_t *temp_concealment_method, + const int16_t bfi /* i : Bad frame indicator */ +); + +void decoder_tcx_tns( + Decoder_State *st, /* i/o: coder memory state */ + const int16_t L_frame_glob, + const int16_t L_spec, + const int16_t L_frame, + const int16_t L_frameTCX, + float x[N_MAX], + const int16_t fUseTns, /* i : flag that is set if TNS data is present */ + STnsData *tnsData, + const int16_t bfi, /* i : Bad frame indicator */ + const int16_t frame_cnt, /* i : frame counter in the super frame */ + const int16_t whitenedDomain +); + +void decoder_tcx_imdct( + Decoder_State *st, /* i/o: coder memory state */ + const int16_t L_frame_glob, /* i : frame length */ + const int16_t L_frameTCX_glob, + const int16_t L_spec, + const int16_t tcx_offset, + const int16_t tcx_offsetFB, + const int16_t L_frame, + const int16_t L_frameTCX, + const int16_t left_rect, + float x[N_MAX], + float xn_buf[], + const uint16_t kernelType, /* i : TCX transform kernel type */ + const int16_t fUseTns, /* i : flag that is set if TNS data is present */ + float synth[], /* i/o: synth[-M..L_frame] */ + float synthFB[], + const int16_t bfi, /* i : Bad frame indicator */ + const int16_t frame_cnt, /* i : frame counter in the super frame */ + const int16_t sba_dirac_stereo_flag /* i : signal stereo output for SBA DirAC */ +); + +void init_tcx_info( + Decoder_State *st, /* i/o: coder memory state */ + const int16_t L_frame_glob, /* i : global frame length */ + const int16_t L_frameTCX_glob, /* i : FB global frame length */ + const int16_t frame_cnt, /* i : frame counter in the super_frame */ + const int16_t bfi, /* i : bad frame indicator */ + int16_t *tcx_offset, /* o : folding point offset relative to the end of the previous frame */ + int16_t *tcx_offsetFB, /* o : FB folding point offset relative to the end of the previous frame*/ + int16_t *L_frame, /* o : frame length */ + int16_t *L_frameTCX, /* o : TCX frame length */ + int16_t *left_rect, /* o : left part is rectangular */ + int16_t *L_spec /* o : spectrum length */ +); + +void decoder_tcx_IGF_mono( + Decoder_State *st, /* i/o: coder memory state */ + float x[], /* o : de-quatized coefficients */ + const int16_t L_frame, /* i : frame length */ + const int16_t left_rect, /* i : left part is rectangular */ + const int16_t bfi, /* i : bad frame indicator */ + const int16_t frame_cnt /* i : frame counter in the super_frame */ +); + +void decoder_tcx_IGF_stereo( + Decoder_State **sts, /* i/o: coder memory states */ + STEREO_MDCT_DEC_DATA_HANDLE hStereoMdct, /* i/o: MDCT stereo structure */ + int16_t ms_mask[NB_DIV][MAX_SFB], /* i : bandwise MS mask */ + float *x[CPE_CHANNELS][NB_DIV], /* o : de-quatized coefficients */ + const int16_t L_frame, /* i : frame length */ + const int16_t left_rect, /* i : left part is rectangular */ + const int16_t k, /* i : Subframe index */ + const int16_t bfi, /* i : bad frame indicator */ + const int16_t MCT_flag /* i : hMCT handle allocated (1) or not (0) */ +); + +void ms_processing( + STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct, /* i/o: MDCT encoder structure */ + Encoder_State **sts, /* i/o: Encoder state structure */ + int16_t ms_mask[NB_DIV][MAX_SFB], /* i : bandwise MS mask */ + const int16_t iSubframe, /* i : subframe number */ + float x_0[], /* i/o: spectrum 1 */ + float x_1[], /* i/o: spectrum 2 */ + int16_t maxSfb /* i : number of stereo frequency bands */ +); + +void ms_inv_mask_processing( + STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct, /* i/o: MDCT encoder structure */ + Encoder_State **sts, /* i/o: Encoder state structure */ + int16_t ms_mask[NB_DIV][MAX_SFB], /* i : bandwise MS mask */ + const int16_t iSubframe, /* i : subframe number */ + const float x_0[], /* i : spectrum 1 */ + const float x_1[], /* i : spectrum 2 */ + float x_inv_0[], /* o : inverse spectrum 1 */ + float x_inv_1[], /* o : inverse spectrum 2 */ + int16_t maxSfb /* i : number of stereo frequency bands */ +); + +void IGFDecApplyStereo( + const IGF_DEC_INSTANCE_HANDLE hIGFDecL, /* i : instance handle of IGF Decoder */ + const IGF_DEC_INSTANCE_HANDLE hIGFDecR, /* i : instance handle of IGF Decoder */ + float *spectrumL, /* i/o: L MDCT spectrum */ + float *spectrumR, /* i/o: R MDCT spectrum */ + const int16_t igfGridIdx, /* i : in case of CELP->TCX switching, use 1.25 framelength */ + const int16_t *coreMsMask, + const int16_t restrict_hopsize, + const int16_t bfi, /* i : frame loss == 1, frame good == 0 */ + const int16_t bfi_apply_damping /* i : decoder element mode */ +); + +void IGFEncStereoEncoder( + STEREO_MDCT_BAND_PARAMETERS *sfbParam, /* i/o: sfb parameters for the right channel */ + const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i : IGF handle */ + const float *mdctSpectrumL, /* i : left spectrum */ + const float *mdctSpectrumR, /* i : right spectrum */ + int16_t *msMask, /* i/o: MS mask */ + int16_t *igfStereoMode, /* o : IGF stereo mode */ + const int16_t mdct_stereo_mode, /* i : MDCT stereo mode */ + const int16_t isTCX20, /* i : flag for indicating TCX20 */ + const int16_t isTransition /* i : flag for transtition */ +); + +void IGFDecReplicateTCX10State( + IGF_DEC_INSTANCE_HANDLE hIGFDec /* i/o: instance handle of IGF Decoder */ +); + +void InitPsychLPC( + const int32_t sr_core, /* i : sampling rate of core-coder */ + const int16_t L_frame, /* i : frame length */ + const TCX_CONFIG_HANDLE hTcxCfg /* i : TCX configuration handle */ +); + +void SetCurrentPsychParams( + const int16_t core, + const int16_t last_frame_was_concealed_cng, + TCX_CONFIG_HANDLE hTcxCfg +); + +void stereo_coder_tcx( + STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct, /* i/o: MDCT encoder structure */ + Encoder_State **sts, /* i/o: encoder state structure */ + int16_t ms_mask[NB_DIV][MAX_SFB], /* i : bandwise MS mask */ + float *mdst_spectrum[CPE_CHANNELS][NB_DIV], /* i/o: MDST spectrum */ + float *inv_spectrum[CPE_CHANNELS][NB_DIV], /* i/o: inverse spectrum */ + float *inv_mdst_spectrum[CPE_CHANNELS][NB_DIV], /* i/o: inverse MDST spectrum */ + const int16_t mct_on /* i : flag mct block (1) or stereo (0) */ +); + +void stereo_decoder_tcx( + STEREO_MDCT_DEC_DATA *hStereoMdct, /* i/o: MDCT stereo decoder structure */ + int16_t ms_mask[NB_DIV][MAX_SFB], /* i : bandwise MS mask */ + float *spec_r_0[NB_DIV], /* i/o: spectrum right channel */ + float *spec_l[NB_DIV], /* i/o: spectrum left channel */ + float *spec_r[NB_DIV], /* i/o: spectrum right channel */ + const int16_t mdct_stereo_mode[], /* i : stereo mode (FB/band wise MS, dual mono */ + const int16_t core_l, /* i : core for left channel (TCX20/TCX10) */ + const int16_t core_r, /* i : core for right channel (TCX20/TCX10) */ + const int16_t igf, /* i : flag for IGF activity */ + const int16_t L_frameTCX_l, /* i : TCX frame length of left channel */ + const int16_t L_frameTCX_r, /* i : TCX frame length of right channel */ + const int16_t mct_on, /* i : flag mct block (1) or stereo (0) */ + const int16_t last_core_l, /* i : last core for left channel */ + const int16_t last_core_r, /* i : last core for right channel */ + const int16_t tmp_plc_upmix /* i : indicates temp upmix for PLC decision */ +); + +void stereo_mdct_core_dec( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + float *signal_out[CPE_CHANNELS], /* o : synthesis @internal_FS */ + float signal_outFB[CPE_CHANNELS][L_FRAME48k] /* o : synthesis @output_FS */ +); + +void splitAvailableBits( + const int16_t total_bits, /* i : total available bits for TCX coding */ + const int16_t split_ratio, /* i : split ratio */ + const int16_t isSBAStereoMode, /* i : signal core coding for SBA */ + int16_t *bits_ch0, /* o : bits for channel 0 */ + int16_t *bits_ch1 /* o : bits for channel 1 */ +); + +int16_t write_stereo_to_bitstream +( + STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct, /* i/o: Stereo MDCT encoder structure */ + Encoder_State **sts, /* i/o: Encoder state structure */ + int16_t ms_mask[NB_DIV][MAX_SFB], /* i : bandwise MS mask */ + const int16_t mct_on, /* i : flag mct block (1) or stereo (0) */ + BSTR_ENC_HANDLE hBstr /* i/o: bitstream handle */ +); + +void parse_stereo_from_bitstream( + STEREO_MDCT_DEC_DATA_HANDLE hStereoMdct, /* i/o: MDCT stereo decoder structure */ + Decoder_State **sts, /* i/o: decoder state structure */ + const int16_t mct_on, /* i : flag mct block (1) or stereo (0) */ + const int16_t isSBAStereoMode, /* i : flag core coding for SBA */ + Decoder_State *st0, /* i/o: decoder state structure for Bstr */ + int16_t ms_mask[NB_DIV][MAX_SFB] /* o : bandwise MS mask */ +); + +void FindSplitRatio( + CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ + Encoder_State **sts /* i/o: Encoder state structure */ +); + +void ComputeSpectrumNoiseMeasure( + const float *powerSpec, + const int16_t L_frame, + const int16_t startLine, + const int16_t resetMemory, + int16_t *noiseFlags, + const int16_t lowpassLine +); + +void IGFSaveSpectrumForITF( + IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i/o: instance handle of IGF Encoder */ + const int16_t igfGridIdx, /* i : IGF grid index */ + const float *pITFSpectrum /* i : MDCT spectrum */ +); + +void convert_coeffs_to_higher_res( + const float *in1, /* i : first subframe input */ + const float *in2, /* i : second subframe input */ + float *out, /* o : converted output */ + const int16_t len /* i : length of subframes */ +); + +void sns_compute_scf( + float spectrum[], + const PsychoacousticParameters *pPsychParams, + const int16_t L_frame, + float *scf +); + +void sns_interpolate_scalefactors( + float *scf_int, /* o : interpolated scalefactors for spectrum shaping */ + const float *scf, /* i : sns scalefactors as derived from the signal or read from the bitstream */ + int16_t encoder_side /* i : flag, if scalefactors have to be inverted */ +); + +void sns_shape_spectrum( + float spectrum[], /* i/o: spectrum to be shaped */ + const PsychoacousticParameters *pPsychParams, /* i : psychoacoustic parameters used to get the frequency bands */ + const float *scf_int, /* i : already interpolated SNS scalefactors */ + const int16_t L_frame /* i : frame length */ +); + +int16_t quantize_sns( + float sns_in[CPE_CHANNELS][NB_DIV][M], + float snsQ_out[CPE_CHANNELS][NB_DIV][M], + Encoder_State **sts, + int16_t *indices, + int16_t *zero_side_flag, + int16_t *sns_stereo_mode +); + +void dequantize_sns( + int16_t indices[CPE_CHANNELS][NPRM_LPC_NEW], + float snsQ_out[CPE_CHANNELS][NB_DIV][M], + Decoder_State **sts +); + +void sns_avq_cod( + const float *sns, /* i : Input sns vectors */ + const float *snsmid, /* i : Input mid-sns vectors */ + float *sns_q, /* o : Quantized LFS vectors */ + float *snsmid_q, /* o : Quantized mid-LFS vectors */ + int16_t *index, /* o : Quantization indices */ + const int16_t core, /* i : core */ + const int16_t L_frame, + const int16_t low_brate_mode /* i : flag low bit operating mode */ +); + +void sns_avq_cod_stereo( + const float *snsl, /* i : Input sns vector (left channel) */ + const float *snsr, /* i : Input sns vector (right channel) */ + const int16_t L_frame, + float *snsl_q, /* o : Quantized sns vector (left channel) */ + float *snsr_q, /* o : Quantized sns vector (right channel) */ + int16_t *indexl, /* o : Quantization indices (left channel) */ + int16_t *indexr /* o : Quantization indices (right channel) */ +); + +void sns_avq_dec( + int16_t *index, /* i : Quantization indices */ + float SNS_Q[NB_DIV][M], /* o : Quantized SNS vectors */ + const int16_t L_frame, /* i : frame length */ + const int16_t numlpc /* i : Number of sets of lpc */ +); + +void sns_avq_dec_stereo( + int16_t *indexl, /* i : Quantization indices (left channel) */ + int16_t *indexr, /* i : Quantization indices (right channe) */ + const int16_t L_frame, /* i : frame length */ + float *SNS_Ql, /* o : Quantized SNS vectors (left channel) */ + float *SNS_Qr /* o : Quantized SNS vectors (right channe) */ +); + +void convertToMS( + const int16_t L_frame, /* i : frame length */ + float x0[], /* i/o: mid/left channel coefficients */ + float x1[], /* i/o: side/right channel coefficients */ + const float norm_fac /* i : normalization factor */ +); + +void inverseMS( + const int16_t L_frame, /* i : frame length */ + float x0[], /* i/o: mid/left channel coefficients */ + float x1[], /* i/o: side/right channel coefficients */ + const float norm_fac /* i : normalization factor */ +); + +void stereoFdCngCoherence( + Encoder_State **sts, /* i/o: core encoder structures */ + const int16_t last_element_mode, /* i : last element mode */ + float fft_buff[CPE_CHANNELS][2 * L_FFT] /* i : fft buffers for L and R channels */ +); + +void FdCngEncodeMDCTStereoSID( + CPE_ENC_HANDLE hCPE /* i/o: CPE encoder state structure */ +); + +void FdCngDecodeMDCTStereoSID( + CPE_DEC_HANDLE hCPE /* i/o: CPE decoder state structure */ +); + +ivas_error initMdctStereoDtxData( + CPE_DEC_HANDLE hCPE /* i/o: CPE decoder handle */ +); + +void synchonize_channels_mdct_sid( + Decoder_State *sts[CPE_CHANNELS], /* i/o: decoder state structure */ + const int16_t n /* i : channel number */ +); + +void updateBuffersForDmxMdctStereo( + CPE_DEC_HANDLE hCPE, /* i/o: CPE handle */ + const int16_t output_frame, /* i : output frame length */ + float *output[CPE_CHANNELS], /* i/o: decoder output */ + float synth[CPE_CHANNELS][L_FRAME48k] /* i/o: decoder synthesis */ +); + +void applyDmxMdctStereo( + const CPE_DEC_HANDLE hCPE, /* i : CPE handle */ + float *output[CPE_CHANNELS], /* o : output from core decoder */ + const int16_t output_frame /* i : output frame length */ +); + + +/*----------------------------------------------------------------------------------* + * Front-VAD prototypes + *----------------------------------------------------------------------------------*/ + +ivas_error front_vad_create( + FRONT_VAD_ENC_HANDLE *hFrontVad, /* i/o: front-VAD handle */ + const ENCODER_CONFIG_HANDLE hEncoderConfig /* i : configuration structure */ +); + +void front_vad_destroy( + FRONT_VAD_ENC_HANDLE *hFrontVad /* i/o: front-VAD handle */ +); + +ivas_error front_vad( + CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure, nullable */ + Encoder_State *st, /* i/o: encoder state structure */ + const ENCODER_CONFIG_HANDLE hEncoderConfig, /* i : configuration structure */ + FRONT_VAD_ENC_HANDLE *hFrontVads, /* i/o: front-VAD handles */ + const int16_t MCT_flag, /* i : hMCT handle allocated (1) or not (0) */ + const int16_t input_frame, /* i : frame length */ + int16_t vad_flag_dtx[], /* o : HE-SAD flag with additional DTX HO */ + float fr_bands[][2 * NB_BANDS], /* i : energy in frequency bands */ + float Etot_LR[], /* o : total energy Left & Right channel */ + float lf_E[][2 * VOIC_BINS], /* i : per bin spectrum energy in lf, LR channels */ + int16_t localVAD_HE_SAD[], /* o : HE-SAD flag without hangover, LR channels */ + int16_t vad_hover_flag[], /* o : VAD hangover flag */ + float band_energies_LR[2 * NB_BANDS], /* o : energy in critical bands without minimum noise floor E_MIN */ + float *PS_out, /* o : energy spectrum */ + float *Bin_E_out /* o : log-energy spectrum of the current frame*/ +); + +ivas_error front_vad_spar( + SPAR_ENC_HANDLE hSpar, /* i/o: SPAR encoder structure */ + const float *omni_in, /* i : omnidirectional input signal */ + ENCODER_CONFIG_HANDLE hEncoderConfig, /* i : encoder configuration handle */ + const int16_t input_frame /* i : input frame length */ +); + + +/*----------------------------------------------------------------------------------* + * Stereo CNG prototypes + *----------------------------------------------------------------------------------*/ + +void stereo_enc_cng_init( + STEREO_CNG_ENC_HANDLE hStereoCng /* i/o: stereo CNG encoder structure */ +); + +void stereo_cng_upd_counters( + STEREO_CNG_ENC_HANDLE hStereoCng, /* i/o: Stereo CNG data structure */ + const int32_t element_mode, /* i : element mode */ + const int16_t nbands, /* i : Number of bands in active */ + const float sidSideGain[], /* i : SID side gains */ + const int16_t burst_ho_count, /* i : Hang-over count */ + int16_t *coh_fade_counter /* i : Coherence fade counter */ +); + +void stereo_cng_init_dec( + STEREO_CNG_DEC_HANDLE hStereoCng, /* i/o: stereo CNG decoder structure */ + const int16_t *frameSize /* i : pointer to frameSize of channel 0 to be used for channel 1 */ +); + +void stereo_cng_compute_PScorr( + float *output[CPE_CHANNELS], /* i : Output signal */ + float *c_PS_LT, /* i/o: Correlation */ + const int16_t L_frame_0, /* i : L_frame channel 0 */ + const int16_t L_frame_1 /* i : L_frame channel 1 */ +); + +void stereo_cng_dec_update( + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + const int32_t ivas_total_brate /* i : IVAS total bitrate */ +); + +void stereo_cna_update_params( + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + float *output[CPE_CHANNELS], /* i : Output signal */ + const int16_t output_frame, /* i : Output frame length */ + const int16_t tdm_ratio_idx /* i : TDM ratio index */ +); + +void dtx_enc_init( + Encoder_State *st, /* i : Encoder state handle */ + const int16_t var_SID_rate_flag, /* i : flag for variable SID update rate */ + const int16_t interval_SID /* i : interval for SID update */ +); + + +/*----------------------------------------------------------------------------------* + * Framework general prototypes + *----------------------------------------------------------------------------------*/ + +void mvr2r_inc( + const float x[], /* i : input vector */ + const int16_t x_inc, /* i : increment for vector x[] */ + float y[], /* o : output vector */ + const int16_t y_inc, /* i : increment for vector y[] */ + const int16_t n /* i : vector size */ +); + +void v_add_inc( + const float x1[], /* i : Input vector 1 */ + const int16_t x_inc, /* i : Increment for input vector 1 */ + const float x2[], /* i : Input vector 2 */ + const int16_t x2_inc, /* i : Increment for input vector 2 */ + float y[], /* o : Output vector that contains vector 1 + vector 2 */ + const int16_t y_inc, /* i : increment for vector y[] */ + const int16_t N /* i : Vector length */ +); + +void v_mult_inc( + const float x1[], /* i : Input vector 1 */ + const int16_t x1_inc, /* i : Increment for input vector 1 */ + const float x2[], /* i : Input vector 2 */ + const int16_t x2_inc, /* i : Increment for input vector 1 */ + float y[], /* o : Output vector that contains vector 1 .* vector 2 */ + const int16_t y_inc, /* i : increment for vector y[] */ + const int16_t N /* i : Vector length */ +); + +void v_addc( + const float x[], /* i : Input vector */ + const float c, /* i : Constant */ + float y[], /* o : Output vector that contains c*x */ + const int16_t N /* i : Vector length */ +); + +void v_min( + const float x1[], /* i : Input vector 1 */ + const float x2[], /* i : Input vector 2 */ + float y[], /* o : Output vector that contains vector 1 .* vector 2 */ + const int16_t N /* i : Vector length */ +); + +void v_sqrt( + const float x[], /* i : Input vector */ + float y[], /* o : Output vector that contains sqrt(x) */ + const int16_t N /* i : Vector length */ +); + +/*! r: sum abs of all vector elements */ +float sumAbs( + const float *vec, /* i : input vector */ + const int16_t lvec /* i : length of input vector */ +); + +void mvc2c( + const uint8_t x[], /* i : input vector */ + uint8_t y[], /* o : output vector */ + const int16_t n /* i : vector size */ +); + +/*! r: the dot product x'*A*A'*x */ +float dot_product_cholesky( + const float *x, /* i : vector x */ + const float *A, /* i : Cholesky matrix A */ + const int16_t N /* i : vector & matrix size */ +); + +void v_mult_mat( + float *y, /* o : the product x*A */ + const float *x, /* i : vector x */ + const float *A, /* i : matrix A */ + const int16_t N, /* i : number of rows */ + const int16_t C /* i : number of columns */ +); + +/*! r: log(sum(exp(X)) of the input array X */ +float logsumexp( + const float X[], /* i : input array X */ + const int16_t N /* i : number of elements in array X */ +); + +/*! r: mapped output value */ +float lin_interp( + const float x, /* i : the value to be mapped */ + const float x1, /* i : source range interval: low end */ + const float y1, /* i : source range interval: high end */ + const float x2, /* i : target range interval: low */ + const float y2, /* i : target range interval: high */ + const int16_t flag_sat /* i : flag to indicate whether to apply saturation */ +); + +/*! r: Adjusted value */ +float check_bounds( + const float value, /* i : Input value */ + const float low, /* i : Low limit */ + const float high /* i : High limit */ +); + +/*! r: Adjusted value */ +int16_t check_bounds_s( + const int16_t value, /* i : Input value */ + const int16_t low, /* i : Low limit */ + const int16_t high /* i : High limit */ +); + +ivas_error stereo_memory_enc( + CPE_ENC_HANDLE hCPE, /* i : CPE encoder structure */ + const int32_t input_Fs, /* i : input sampling rate */ + const int16_t max_bwidth, /* i : maximum audio bandwidth */ + float *tdm_last_ratio, /* o : TD stereo last ratio */ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const int16_t nchan_transport /* i : number transport chans */ + +); + +ivas_error stereo_memory_dec( + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + CPE_DEC_HANDLE hCPE, /* i : CPE decoder structure */ + const int16_t nb_bits_metadata, /* i : number of metadata bits */ + const int32_t output_Fs, /* i : output sampling rate */ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const MC_MODE mc_mode, /* i : MC mode */ + const int16_t nchan_transport /* i : number of transport channels */ +); + +void stereo_switching_enc( + CPE_ENC_HANDLE hCPE, /* i : CPE structure */ + float old_input_signal_pri[], /* i : old input signal of primary channel */ + const int16_t input_frame /* i : input frame length */ +); + +void stereo_switching_dec( + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + const int32_t ivas_total_brate /* i : IVAS total bitrate */ +); + +void stereo_td2dft_update( + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + const int16_t n, /* i : channel number */ + float output[], /* i/o: synthesis @internal Fs */ + float synth[], /* i/o: synthesis @output Fs */ + float hb_synth[], /* i/o: hb synthesis */ + const int16_t output_frame /* i : frame length */ +); + +void stereo_mdct2dft_update( + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + float output0[], /* i/o: synthesis @internal Fs, ch0 */ + float synth0[] /* i/o: synthesis @output Fs, ch0 */ +); + +/*! r: number of bits written */ +int16_t write_GR0( + BSTR_ENC_HANDLE hBstr, /* i/o: Encoder bitstream handle */ + const int16_t ind, /* i : bitstream index */ + const int16_t *in, /* i : data to be encoded */ + const int16_t len /* i : input data length */ +); + +/*! r: number of bits read */ +int16_t read_GR0( + const uint16_t *bit_stream, /* i : bitstream to be read */ + int16_t *ind, /* o : parameters read */ + const int16_t len /* i : number of params to be read */ +); + + +/*----------------------------------------------------------------------------------* + * MCT prototypes + *----------------------------------------------------------------------------------*/ + +void ivas_mdct_core_whitening_enc( + CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ + float new_samples[CPE_CHANNELS][L_INP], /* i : new samples */ + float old_wsp[CPE_CHANNELS][L_WSP], /* i : 12.8kHz weighted speech (for LTP */ + float pitch_buf[CPE_CHANNELS][NB_SUBFR16k], /* o : floating pitch for each subframe */ + float *mdst_spectrum_long[CPE_CHANNELS], /* o : buffer for MDST spectrum */ + int16_t tnsBits[CPE_CHANNELS][NB_DIV], /* o : buffer TNS bits */ + float *orig_spectrum_long[CPE_CHANNELS], /* o : origingal spectrum w/o whitening */ + int16_t tnsSize[CPE_CHANNELS][NB_DIV], /* o : size of TNS */ + int16_t p_param[CPE_CHANNELS][NB_DIV], /* o : pointer to parameter array */ + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const int16_t mct_on, /* i : flag mct block (1) or stereo (0) */ + const int16_t nChannels /* i : total number of coded channels */ +); + +void ivas_mct_core_enc( + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + MCT_ENC_HANDLE hMCT, /* i/o: MCT encoder structure */ + CPE_ENC_HANDLE hCPE[MCT_MAX_BLOCKS], /* i/o: CPE encoder structures */ + const int16_t nChannels, /* i : number of channels to be coded */ + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + const int16_t switch_bw, /* i : flag bandwidth switch occurance */ + const int16_t lfe_bits, /* i : bits spent for LFE */ + const int16_t sba_order /* i : Ambisonic (SBA) order */ +); + +void ivas_mdct_quant_coder( + CPE_ENC_HANDLE hCPE, /* i/o: Encoder CPE handle */ + int16_t tnsBits[CPE_CHANNELS][NB_DIV], /* i : bits needed for TNS parameters */ + int16_t tnsSize[CPE_CHANNELS][NB_DIV], /* i : size of TNS */ + int16_t p_param[CPE_CHANNELS][NB_DIV], /* i : pointer to parameter array */ + const int16_t MCT_flag /* i : hMCT handle allocated (1) or not (0) */ +); + +void apply_MCT_enc( + MCT_ENC_HANDLE hMCT, /* i/o: MCT encoder structure */ + Encoder_State **sts, /* i/o: encoder state structure */ + float *mdst_spectrum[MCT_MAX_CHANNELS][NB_DIV], /* i/o: MDST spectrum */ + float *inv_spectrum[MCT_MAX_CHANNELS][NB_DIV], /* i/o: inverse spectrum */ + float *inv_mdst_spectrum[MCT_MAX_CHANNELS][NB_DIV], /* i/o: inverse MDST spectrum */ + const int16_t nchan /* i : number of channels */ +); + +void write_mct_bitstream( + Encoder_State **sts, /* i/o: encoder state structure */ + MCT_ENC_HANDLE hMCT, /* i/o: MCT encoder structure */ + const int16_t nchan /* i : number of channels */ +); + +void splitAvailableBitsMCT( + void **sts, /* i/o: encoder/decoder state structure */ + const int16_t total_bits, /* i : total number of available bits */ + const int16_t split_ratio[MCT_MAX_CHANNELS], /* i : ratio for splitting the bits */ + const int16_t enc_dec, /* i : encoder or decoder flag */ + const int16_t nchan /* i : number of channels */ +); + +void getChannelEnergies( + Encoder_State **sts, /* i : Encoder state structure */ + float nrg[MCT_MAX_CHANNELS], /* o : energies */ + const int16_t nchan /* i : number of channels */ +); + +void mctStereoIGF_enc( + MCT_ENC_HANDLE hMCT, /* i/o: MCT encoder structure */ + Encoder_State **sts, /* i/o: encoder state structure */ + float *orig_spectrum[MCT_MAX_CHANNELS][NB_DIV], /* i : MDCT spectrum for ITF */ + float powerSpec[MCT_MAX_CHANNELS][L_FRAME48k], /* i/o: MDCT^2 + MDST^2 spectrum,or estimate */ + float *powerSpecMsInv[MCT_MAX_CHANNELS][NB_DIV], /* i : same as above but for inverse spect. */ + float *inv_spectrum[MCT_MAX_CHANNELS][NB_DIV], /* i : inverse spectrum */ + const int16_t sp_aud_decision0[MCT_MAX_CHANNELS] /* i : speech audio decision */ +); + +void ivas_mdct_dec_side_bits_frame_channel( + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + int16_t param_lpc[MCT_MAX_CHANNELS][NPRM_LPC_NEW], /* o : lpc_parameters */ + int16_t p_param[CPE_CHANNELS][NB_DIV], /* o : pointer to param buffer */ + Decoder_State *st0, /* i : pointer to bitstream handle */ + int16_t nTnsBitsTCX10[CPE_CHANNELS][NB_DIV], /* o : number of bits for TNS */ + int16_t param[CPE_CHANNELS][DEC_NPRM_DIV * NB_DIV], /* i/o: parameters buffer */ + const int16_t MCT_flag, /* i : hMCT handle allocated (1) or not (0) */ + const int16_t odd_channel_cpe /* i : flag cpe with odd nb of tc channels */ +); + +void ivas_mct_side_bits( + MCT_DEC_HANDLE hMCT, /* i/o: MCT decoder structure */ + CPE_DEC_HANDLE hCPE[MCT_MAX_BLOCKS], /* i/o: CPE decoder structure */ + const int16_t nCPE, /* i : number of CPEs */ + Decoder_State *st0, /* i : decoder handle for Bstr */ + const int16_t bfi, /* i : BFI flag */ + uint16_t *bitstream, /* o : bitstream indices */ + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + const int16_t nb_bits_metadata /* i : number of metadata bits */ +); + +void ivas_mdct_core_invQ( + CPE_DEC_HANDLE hCPE, /* i/o: CPE handle */ + int16_t nTnsBitsTCX10[CPE_CHANNELS][NB_DIV], /* i : number of TNS bits */ + int16_t p_param[CPE_CHANNELS][NB_DIV], /* i : pointer to param buffer */ + int16_t param_lpc[CPE_CHANNELS][NPRM_LPC_NEW], /* i : lpc parameters */ + int16_t param[CPE_CHANNELS][DEC_NPRM_DIV * NB_DIV], /* i : param buffer */ + int16_t fUseTns[CPE_CHANNELS][NB_DIV], /* i : flag TNS enabled */ + STnsData tnsData[CPE_CHANNELS][NB_DIV], /* i : TNS parameter */ + float *x_0[CPE_CHANNELS][NB_DIV], /* i/o: signal buffer */ + float *x[CPE_CHANNELS][NB_DIV], /* i/o: signal buffer */ + float Aq[CPE_CHANNELS][( NB_SUBFR16k + 1 ) * ( M + 1 )], /* i : LP coefficients */ + int16_t ms_mask[NB_DIV][MAX_SFB], /* i : M/S mask */ + const int16_t MCT_flag /* i : hMCT handle allocated (1) or not (0) */ +); + +void ivas_mdct_core_reconstruct( + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + float *x[][NB_DIV], /* i/o: pointers to synthesis @internal_FS */ + float signal_outFB[CPE_CHANNELS][L_FRAME_PLUS], /* o : synthesis @output_FS */ + int16_t fUseTns[CPE_CHANNELS][NB_DIV], /* i : flage TNS enabled */ + const int16_t MCT_flag /* i : hMCT handle allocated (1) or not (0) */ +); + +void ivas_mdct_core_tns_ns( + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + int16_t fUseTns[CPE_CHANNELS][NB_DIV], /* i : two entries for each channel in TCX10 */ + STnsData tnsData[CPE_CHANNELS][NB_DIV], /* o : TNS parameter */ + float *x[CPE_CHANNELS][NB_DIV], /* o : synthesis @internal_FS */ + float Aq[CPE_CHANNELS][( NB_SUBFR16k + 1 ) * ( M + 1 )], /* o : LP coefficients */ + const int16_t MCT_flag /* i : hMCT handle allocated (1) or not (0) */ +); + +void ivas_mct_core_dec( + MCT_DEC_HANDLE hMCT, /* i/o: MCT decoder structure */ + CPE_DEC_HANDLE hCPE[MCT_MAX_BLOCKS], /* i/o: CPE decoder structure */ + const int16_t nCPE, /* i : number of CPEs */ + float *signal_out[] /* o : synthesis @internal_FS */ +); + +void ivas_mct_dec_mct( + MCT_DEC_HANDLE hMCT, /* i/o: MCT decoder structure */ + Decoder_State **sts, /* i/o: decoder state structure */ + const int16_t nchan /* i : number of channels */ +); + +void apply_MCT_dec( + MCT_DEC_HANDLE hMCT, /* i/o: MCT decoder structure */ + Decoder_State **sts, /* i/o: decoder state structure */ + float *x[MCT_MAX_CHANNELS][NB_DIV] /* i/o: decoded and dequan. spect. input to MCT */ +); + +void mctStereoIGF_dec( + MCT_DEC_HANDLE hMCT, /* i/o: MCT decoder structure */ + Decoder_State **sts, /* i/o: decoder state structure */ + float *x[MCT_MAX_CHANNELS][NB_DIV], /* i/o: decoded and dequantized spectrum */ + const int16_t bfi /* i : bad frame flag */ +); + +void ivas_mdct_tcx10_bit_distribution( + int16_t target_bitsTCX10[NB_DIV], /* o : target bit distribution */ + const int16_t bits_frame_channel, /* i : bits frame channel */ + const int16_t nTnsBitsTCX10[NB_DIV] /* i : TNS bits */ +); + +void enc_prm_igf_mdct( + Encoder_State *st, /* i : Encoder state handle */ + BSTR_ENC_HANDLE hBstr /* i/o: Bitstream handle */ +); + +void mdct_read_IGF_bits( + Decoder_State *st, /* i/o: Encoder state handle */ + Decoder_State *st0 /* i : pointer to handle where bstr is read */ +); + + +/*----------------------------------------------------------------------------------* + * Q Metadata prototypes for DirAC and MASA + *----------------------------------------------------------------------------------*/ + +ivas_error ivas_qmetadata_enc_encode( + BSTR_ENC_HANDLE hMetaData, /* i/o: metadata bitstream handle */ + IVAS_QMETADATA *hQMetaData, /* i/o: q_metadata handle */ + const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ +); + +ivas_error ivas_qmetadata_enc_encode_hr_384_512( + BSTR_ENC_HANDLE hMetaData, /* i/o: metadata bitstream handle */ + IVAS_QMETADATA *hQMetaData, /* i/o: metadata handle */ + const int16_t bits_sph_idx, + const int16_t bits_sp_coh +); + +void deindex_sph_idx( + const uint16_t sphIndex, /* i : Spherical index */ + const SPHERICAL_GRID_DATA *gridData, /* i : Prepared spherical grid */ + float *theta, /* o : Elevation */ + float *phi /* o : Azimuth */ +); + +/*! r: output index for direction */ +uint16_t index_theta_phi_16( + float * p_theta, /* i/o: input elevation to be indexed */ + float * p_phi, /* i/o: input azimuth to be indexed */ + const SPHERICAL_GRID_DATA *gridData /* i : generated grid data */ +); + +void reset_metadata_spatial( + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + BSTR_ENC_HANDLE hMetaData, /* i/o: Metadata bitstream handle */ + const int32_t element_brate, /* i : element bitrate */ + int32_t *total_brate, /* o : total bitrate */ + const int32_t core_brate, /* i : core bitrate */ + const int16_t nb_bits_metadata /* i : number of meatdata bits */ +); + +/*! r: number of bits written */ +void ivas_qmetadata_enc_sid_encode( + BSTR_ENC_HANDLE hMetaData, /* i/o: metadata bitstream handle */ + IVAS_QMETADATA *q_metadata, /* i/o: metadata handle */ + const int16_t masa_sid_descriptor, /* i : description of MASA SID coding structure*/ + const int16_t ivas_format /* i : ivas format */ +); + +/*! r: number of bits read */ +int16_t ivas_qmetadata_dec_decode( + IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ + uint16_t *bitstream, /* i : bitstream */ + int16_t *index, /* i/o: bitstream position */ + const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ +); + +/*! r: number of bits read */ +int16_t ivas_qmetadata_dec_decode_hr_384_512( + IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: hQMetaData handle */ + uint16_t *bitstream, /* i : bitstream */ + int16_t *index, /* i/o: bitstream position */ + const SPHERICAL_GRID_DATA *sph_grid16, /* i : spherical grid for deindexing */ + const int16_t bits_sph_idx, + const int16_t bits_sp_coh, + const uint8_t ncoding_bands_config +); + +/*! r: number of bits read */ +int16_t ivas_qmetadata_dec_sid_decode( + IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ + uint16_t *bitstream, /* i : bitstream */ + int16_t *index, /* i/o: bitstream position */ + const int16_t nchan_transport, /* i : number of transport channels */ + int16_t *element_mode, /* o : element mode */ + const int16_t ivas_format /* i : IVAS format */ +); + +void ivas_qmetadata_to_dirac( + const IVAS_QMETADATA_HANDLE hQMetaData, /* i : frame of MASA q_metadata */ + DIRAC_DEC_HANDLE hDirAC, /* i : DirAC decoder structure */ + MASA_DECODER_HANDLE hMasa, /* i : MASA decoder structure */ + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, /* i/o: common spatial renderer data handle */ + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const int16_t hodirac_flag, /* i : flag to indicate HO-DirAC mode */ + int16_t *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ +); + +ivas_error ivas_qmetadata_open( + IVAS_QMETADATA_HANDLE *hQMetaData /* i/o: q_metadata handle */ +); + +ivas_error ivas_qmetadata_allocate_memory( + IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ + const int16_t nbands, /* i : new number of frequency bands */ + const int16_t ndirs, /* i : new number of directions */ + const int16_t coherence_flag /* i : new coherence coding status */ +); + +void ivas_qmetadata_close( + IVAS_QMETADATA_HANDLE *hQMetaData /* i/o: q_metadata handle */ +); + +void restore_metadata_buffer( + BSTR_ENC_HANDLE hMetaData, + const int16_t next_ind_start, + const int16_t bit_pos_start +); + +/*! r: codeword index */ +int16_t masa_sq( + const float in, /* i : input value */ + const float *threshold, /* i : partition */ + const int16_t cb_sz /* i : codebook size */ +); + +void ivas_qmetadata_azimuth_elevation_to_direction_vector( + const float az, /* i : azimuth */ + const float el, /* i : elevation */ + float *dv /* o : direction vector */ +); + +void ivas_qmetadata_direction_vector_to_azimuth_elevation( + const float *dv, /* i : direction vector */ + float *az, /* o : azimuth */ + float *el /* o : elevation */ +); + +ivas_error only_reduce_bits_direction( + int16_t *reduce_bits_out, + IVAS_QDIRECTION *q_direction, /* i/o: quantized direction structure */ + int16_t reduce_bits, + const int16_t coding_subbands, + const int16_t no_subframes, + int16_t *ind_order +); + +void quantize_direction_frame( + IVAS_QDIRECTION *q_direction, /* i/o: quantized direction structure */ + float azimuth_orig[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES], + float elevation_orig[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES], + const int16_t hrmasa_flag /* i : flag indicating high-rate MASA MD coding*/ +); + +/*! r: quantized spherical index */ +uint16_t quantize_direction( + const float theta, /* i : input elevation value */ + float phi, /* i : input azimuth value */ + const int16_t no_bits, /* i : number of bits */ + float *theta_q, /* o : quantized elevation */ + float *phi_q, /* o : quantized azimuth */ + uint16_t *index_theta, /* o : quantized elevation index */ + uint16_t *index_phi, /* o : quantized azimuth index */ + const MC_LS_SETUP mc_format /* i : channel format if in MC-mode */ +); + +int16_t quantize_direction2D( + float phi, /* i : input azimuth value */ + const int16_t no_cw, /* i : number of bits */ + float *phi_q, /* o : quantized azimuth value */ + uint16_t *index_phi, /* o : quantized azimuth index */ + const MC_LS_SETUP mc_format /* i : channel format if in MC-mode */ +); + +/*! r :companded azimuth value */ +float companding_azimuth( + const float azi, /* i : input azimuth value */ + const MC_LS_SETUP mc_format, /* i : input channel format */ + const int16_t theta_flag, /* i : zero/non zero elevation flag */ + const int16_t direction /* i : direction of companding (direct or inverse)*/ +); + +/*! r: index azimuth */ +int16_t quantize_phi_chan_lbr( + const float phi, /* i : azimuth value */ + float *phi_hat, /* o : quantized azimuth */ + const int16_t n /* i : azimuth codebook size */ +); + +/*! r: index azimuth */ +int16_t quantize_phi_chan_compand( + float phi, /* i : azimuth value */ + float *phi_hat, /* o : quantized azimuth */ + const int16_t n, /* i : azimuth codebook size */ + const int16_t theta_flag, /* i : flag signaling high elevation */ + const MC_LS_SETUP mc_format /* i : channel format if in MC-mode */ +); + +void quantize_direction_frame2D( + IVAS_QDIRECTION *q_direction, /* i/o: quantized direction structure */ + float azimuth_orig[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES], /* i : input azimuth values */ + float elevation_orig[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES] /* i : input elevation values */ +); + +void small_requantize_direction_frame( + IVAS_QDIRECTION *q_direction, /* i/o: quantized direction structure */ + float azimuth_orig[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES], /* i : input azimuth values */ + float elevation_orig[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES], /* i : input elevation values */ + const int16_t raw_flag[MASA_MAXIMUM_CODING_SUBBANDS], /* i : raw/EC encoding mode for each subband */ + int16_t bits_dir_bands[MASA_MAXIMUM_CODING_SUBBANDS], /* i/o: number of bits per subband */ + int16_t *diff /* i/o: number of bits to be reduced */ +); + +/*! r: index azimuth */ +int16_t quantize_phi( + float phi, /* i : azimuth value */ + const int16_t flag_delta, /* i : flag indicating if the azimuth codebook is translated or not */ + float *phi_hat, /* o : quantized azimuth */ + const int16_t n /* i : azimuth codebook size */ +); + +/*! r: decoded elevation value */ +float deindex_elevation( + uint16_t *id_th, /* i : input index */ + const int16_t no_bits, /* i : number of bits for the spherical grid */ + const MC_LS_SETUP mc_format /* i : channel format if in MC-mode */ +); + +float deindex_azimuth( + int16_t id_phi, /* i : index */ + const int16_t no_bits, /* i : number of bits for the spherical grid */ + const int16_t id_th, /* i : elevation index */ + const int16_t remap, /* i : remapping flag */ + const MC_LS_SETUP mc_format /* i : channel format if in MC-mode */ +); + +void deindex_spherical_component( + const uint16_t sph_idx, /* i : spherical index */ + float *az, /* o : decoded azimuth value */ + float *el, /* o : decoded elevation value */ + uint16_t *az_idx, /* o : azimuth index */ + uint16_t *el_idx, /* o : elevation index */ + const uint16_t no_bits, /* i : number of bits for the spherical grid */ + const MC_LS_SETUP mc_format /* i : channel format if in MC-mode */ +); + +void small_reduction_direction( + IVAS_QDIRECTION *q_direction, /* i/o: quantized direction structure */ + uint16_t bits_dir[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES], /* i : bit allocation in tF tiles */ + const int16_t raw_flag[MASA_MAXIMUM_CODING_SUBBANDS], /* i : raw/EC coding indicator for each subband*/ + int16_t *diff /* i/o: number of bits that need to be reduced */ +); + +uint16_t ivas_qmetadata_reorder_generic( + const int16_t signed_value +); + +int16_t ivas_qmetadata_dereorder_generic( + const uint16_t uns_value /* i : unsigned value to reorder */ +); + +/*! r: projected azimuth index */ +int16_t ivas_dirac_project_azimuth_index( + const int16_t az_idx, /* i : azimuth index */ + const int16_t az_alph, /* i : number of azimuth symbols */ + const int16_t az_alph_proj /* i : size of projected alphabet */ +); + +/*! r: projected elevation index */ +int16_t ivas_dirac_project_elevation_index( + const int16_t el_idx, /* i : elevation index */ + const int16_t el_alph, /* i : number of elevation symbols */ + const int16_t el_alph_proj /* i : size of projected alphabet */ +); + +/*! r: projected index in channel mode */ +int16_t ivas_chan_project_elevation_index( + const int16_t el_idx, /* i : elevation index */ + const int16_t el_alph, /* i : number of elevation symbols */ + const int16_t el_alph_proj /* i : size of projected alphabet */ +); + +void ivas_dirac_param_est_enc( + DIRAC_ENC_HANDLE hDirAC, + IVAS_QDIRECTION *q_direction, + const uint8_t useLowerRes, + float *data_f[], + float **pp_fr_real, + float **pp_fr_imag, + const int16_t input_frame, + const IVAS_FORMAT ivas_format , + const int16_t hodirac_flag, + const int16_t nchan_fb_in, + int16_t *mono_frame_count, + int16_t *dirac_mono_flag + ); + + +void ivas_sba_config( + const int32_t sba_total_brate, /* i : SBA total bitrate */ + int16_t sba_order, /* i : Ambisonic (SBA) order */ + int16_t nb_channels, /* i : Number of Ambisonic (SBA) channels */ + int16_t *nchan_transport, /* o : number of transport channels */ + const int16_t sba_planar, /* i : SBA planar flag */ + int16_t *nSCE, /* o : number of SCEs */ + int16_t *nCPE, /* o : number of CPEs */ + int16_t *element_mode /* o : element mode of the core coder */ +); + +void ivas_sba_set_cna_cng_flag( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +); + +ivas_error ivas_sba_dec_reconfigure( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + uint16_t *nSamplesFlushed, /* o : number of samples flushed */ + int16_t *data /* o : output synthesis signal */ +); + +ivas_error ivas_sba_digest_tc( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const int16_t nchan_transport, /* i : number of transport channels */ + const int16_t nCldfbSlots, /* i : number of CLDFB slots */ + const int16_t nSamplesForRendering, /* i : number of samples provided */ + float *data[] /* i : transport channel samples */ +); + +void ivas_init_dec_get_num_cldfb_instances( + Decoder_Struct *st_ivas, /* i : IVAS decoder structure */ + int16_t *numCldfbAnalyses, /* o : number of CLDFB analysis instances */ + int16_t *numCldfbSyntheses /* o : number of CLDFB synthesis instances */ +); + +ivas_error ivas_cldfb_dec_reconfig( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const int16_t nchan_transport_old, /* i : number of TCs in previous frame */ + int16_t numCldfbAnalyses_old, /* i : number of CLDFB analysis instances in previous frame */ + const int16_t numCldfbSyntheses_old /* i : number of CLDFB synthesis instances in previous frame */ +); + +/*! r: Ambisonic (SBA) order */ +int16_t ivas_sba_get_order( + const int16_t nb_channels, /* i : Number of ambisonic channels */ + const int16_t sba_planar /* i : SBA planar flag */ +); + +/*! r: Ambisonic (SBA) order used for analysis and coding */ +int16_t ivas_sba_get_analysis_order( + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + const int16_t sba_order /* i : Ambisonic (SBA) order */ +); + +/*! r: number of Ambisonic channels */ +int16_t ivas_sba_get_nchan( + const int16_t sba_order, /* i : Ambisonic (SBA) order */ + const int16_t sba_planar /* i : SBA planar flag */ +); + +/*! r: number of ambisonics metadata channels */ +int16_t ivas_sba_get_nchan_metadata( + const int16_t sba_order, /* i : Ambisonic (SBA) order */ + const int32_t ivas_total_brate /* i : IVAS total bitrate */ +); + +void ivas_sba_get_spar_hoa_ch_ind( + const int16_t num_md_chs, /* i : number of MD channels */ + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] +); + +/*! r: flag indicating to code SPAR HOA MD for all bands */ +void ivas_sba_get_spar_hoa_md_flag( + const int16_t sba_order, /* i : Ambisonic (SBA) order */ + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + int16_t *spar_hoa_md_flag, + int16_t *spar_hoa_dirac2spar_md_flag +); + +void ivas_sba_zero_vert_comp( + float *sba_data[], /* i : SBA signals */ + const int16_t sba_order, /* i : Ambisonic (SBA) order */ + const int16_t sba_planar, /* i : SBA planar flag */ + const int16_t input_frame /* i : input frame length */ +); + +void ivas_sba_getTCs( + float *sba_data[], /* i : SBA signals */ + Encoder_Struct *st_ivas, /* i/o: Encoder struct */ + const int16_t input_frame /* i : frame length */ +); + +/*! r: SBA DirAC stereo flag */ +int16_t ivas_sba_remapTCs( + float *sba_data[], /* i/o: SBA signals */ + Decoder_Struct *st_ivas, /* i/o: decoder struct */ + const int16_t output_frame /* i : frame length */ +); + +void ivas_sba_dirac_stereo_dec( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float *output[CPE_CHANNELS], /* o : output synthesis signal */ + const int16_t output_frame, /* i : output frame length per channel */ + const int16_t mcmasa /* i : McMASA flag */ +); + +void ivas_sba_dirac_stereo_config( + STEREO_DFT_CONFIG_DATA_HANDLE hConfig /* o : DFT stereo configuration */ +); + +/*! r: HO-DirAC flag */ +int16_t ivas_get_hodirac_flag( + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + const int16_t sba_order /* i : Ambisonic (SBA) order */ +); + +int16_t ivas_get_sba_dirac_stereo_flag( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +); + +void ivas_sba_dirac_stereo_smooth_parameters( + STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: encoder DFT stereo handle */ + ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD handle for upmixing */ + const int16_t cross_fade_start_offset, /* i : SPAR mixer delay compensation */ + const int32_t output_Fs, /* i : Fs for delay calculation */ + const int16_t num_md_sub_frames /* i : number of subframes in mixing matrix */ +); + +void ivas_sba2mc_cldfb( + IVAS_OUTPUT_SETUP hInSetup, /* i : Format of input layout */ + float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o: cldfb real part */ + float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o: cldfb imag part */ + const int16_t nb_channels_out, /* i : nb of output channels */ + const int16_t nb_bands, /* i : nb of CLDFB bands to process */ + const int16_t nb_timeslots, /* i : number of time slots to process */ + const float *hoa_dec_mtx /* i : HOA decoding mtx */ +); + + +/*----------------------------------------------------------------------------------* + * DirAC prototypes + *----------------------------------------------------------------------------------*/ + +ivas_error ivas_dirac_enc_open( + Encoder_Struct *st_ivas /* i/o: IVAS encoder handle */ +); + +ivas_error ivas_dirac_enc_reconfigure( + Encoder_Struct *st_ivas /* i/o: IVAS encoder handle */ +); + +void ivas_dirac_enc_close( + DIRAC_ENC_HANDLE *hDirAC, /* i/o: encoder DirAC handle */ + const int32_t input_Fs /* i : input sampling_rate */ +); + +ivas_error ivas_dirac_enc( + DIRAC_ENC_HANDLE hDirAC, /* i/o: encoder DirAC handle */ + IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ + BSTR_ENC_HANDLE hMetaData, /* i/o: Metadata bitstream handle */ + float *data_f[], /* i/o: SBA channels */ + float **ppIn_FR_real, /* o : real freq domain values */ + float **ppIn_FR_imag, /* o : imag freq domain values */ + const int16_t input_frame, /* i : input frame length */ + const int16_t dtx_vad, /* i : DTX vad flag */ + const IVAS_FORMAT ivas_format, /* i : ivas format */ + const int16_t hodirac_flag /* i : hodirac flag */ +); + +ivas_error ivas_dirac_config( + void *st_ivas, /* i/o: IVAS encoder/decoder state structure */ + const int16_t enc_dec /* i : encoder or decoder flag */ +); + +void ivas_dirac_config_bands( + int16_t *band_grouping, /* o : band grouping */ + const int16_t nbands, /* i : number of bands */ + const int16_t max_band, /* i : maximal band index +1 */ + int16_t *dirac_to_spar_md_bands, /* o : mapping of DirAC parameter band index to SPAR FB band index */ + const int8_t useLowerBandRes, /* i : flag indicating lower band resolution for DirAC */ + const int16_t enc_param_start_band, /* i : band index of first DirAC parameter band */ + IVAS_FB_MIXER_HANDLE hFbMdft +); + +void ivas_get_dirac_sba_max_md_bits( + const int32_t sba_total_brate, + int16_t *bits_frame_nominal, + int16_t *metadata_max_bits, + int16_t *qmetadata_max_bit_req, + const int16_t nbands +); + +ivas_error ivas_dirac_sba_config( + IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ + int16_t *element_mode, /* o : element mode of the core coder */ + int32_t sba_total_brate, /* i : SBA total bitrate */ + const int16_t sba_order, /* i : Ambisonic (SBA) order */ + const int16_t nbands /* i : number of frequency bands */ +); + +ivas_error ivas_dirac_dec_config( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const DIRAC_CONFIG_FLAG flag_configopen /* i/ : Flag determining if we open or reconfigure the DirAC decoder */ +); + +void ivas_dirac_dec_close( + DIRAC_DEC_HANDLE *hDirAC_out +); + +void ivas_dirac_dec_read_BS( + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + Decoder_State *st, /* i/o: decoder Core state structure */ + DIRAC_DEC_HANDLE hDirAC, /* i/o: decoder DirAC handle */ + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, /* i/o: common spatial rendering data handle */ + IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q metadata */ + int16_t *nb_bits, /* o : number of bits read */ + const int16_t last_bit_pos, /* i : last read bitstream position */ + const int16_t hodirac_flag, /* i : flag to indicate HO-DirAC mode */ + int16_t *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ +); + +void generate_masking_noise_lb_dirac( + HANDLE_FD_CNG_COM hFdCngCom, /* i/o: FD_CNG structure containing all buffers and variables */ + float *tdBuffer, /* i/o: time-domain signal, if NULL no LB-CNA */ + const int16_t nCldfbTs, /* i : number of CLDFB slots that will be rendered */ + const int16_t cna_flag /* i : CNA flag for LB and HB */ +); + +void ivas_dirac_dec_set_md_map( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const int16_t nCldfbTs /* i : number of CLDFB time slots */ +); + +void ivas_dirac_dec( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float *output_f[], /* i/o: synthesized core-coder transport channels/DirAC output */ + const int16_t nchan_transport, /* i : number of transport channels */ + const int16_t num_subframes /* i : number of subframes to render */ +); + +void ivas_dirac_dec_render( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const int16_t nchan_transport, /* i : number of transport channels */ + const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */ + uint16_t *nSamplesRendered, /* o : number of CLDFB slots rendered */ + uint16_t *nSamplesAvailable, /* o : number of CLDFB slots still to render */ + float *output_f[] /* o : rendered time signal */ +); + +void ivas_dirac_dec_render_sf( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float *output_f[], /* i/o: synthesized core-coder transport channels/DirAC output */ + const int16_t nchan_transport, /* i : number of transport channels */ + float *pppQMfFrame_ts_re[IVAS_MAX_FB_MIXER_IN_CH][CLDFB_NO_COL_MAX], + float *pppQMfFrame_ts_im[IVAS_MAX_FB_MIXER_IN_CH][CLDFB_NO_COL_MAX] +); + +ivas_error ivas_td_decorr_reconfig_dec( + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const int32_t ivas_total_brate, /* i : total IVAS bitrate */ + const int16_t nchan_transport, /* i : number of transport channels */ + const int32_t output_Fs, /* i : output sampling rate */ + ivas_td_decorr_state_t **hTdDecorr, /* i/o: TD decorrelator handle */ + uint16_t *useTdDecorr /* i/o: TD decorrelator flag */ +); + +void computeDiffuseness_mdft( + float **buffer_intensity[DIRAC_NUM_DIMS], + const float *buffer_energy, + const int16_t num_freq_bands, + const uint16_t no_col_avg_diff, + float *diffuseness +); + +void computeDirectionVectors( + float *intensity_real_x, + float *intensity_real_y, + float *intensity_real_z, + const int16_t enc_param_start_band, + const int16_t num_frequency_bands, + float *direction_vector_x, + float *direction_vector_y, + float *direction_vector_z +); + +void computeDiffuseness( + float *buffer_intensity[DIRAC_NUM_DIMS][DIRAC_NO_COL_AVG_DIFF], + const float *buffer_energy, + const int16_t num_freq_bands, + float *diffuseness +); + + +void ivas_dirac_dec_get_response( + const int16_t azimuth, + const int16_t elevation, + float *response, + const int16_t ambisonics_order +); + +void calculate_hodirac_sector_parameters( + DIRAC_ENC_HANDLE hDirAC, + float RealBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX],/* i : signal vector (L+1)^2 x N_bins, real part */ + float ImagBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX],/* i : signal vector, imaginary part */ + const float beta, /* i : forgetting factor for average filtering */ + const int16_t *band_grouping, /* i : indices of band groups */ + const int16_t N_bands, /* i : number of bands (groups) */ + const int16_t enc_param_start_band, /* i : first band to process */ + float *azi, /* o : array of sector azimuth angles, flat */ + float *ele, /* o : array of sector elevation angles, flat */ + float *diff, /* o : array of sector diffuseness values, flat */ + float *ene /* o : array of sector energy values, flat */ +); + +void ivas_mc_paramupmix_enc( + Encoder_Struct *st_ivas, /* i/o: IVAS Encoder handle */ + BSTR_ENC_HANDLE hMetaData, /* i/o: IVAS Metadata bitstream handle */ + float *data_f[], /* i/o: input/transport MC data */ + const int16_t input_frame /* i : input frame length */ +); + +ivas_error ivas_mc_paramupmix_enc_open( + Encoder_Struct *st_ivas /* i/o: IVAS encoder handle */ +); + +void ivas_mc_paramupmix_enc_close( + MC_PARAMUPMIX_ENC_HANDLE *hMCParamUpmix, /* i/o: MC Param-Upmix encoder handle */ + const int32_t input_Fs /* i : input sampling rate */ +); + +void ivas_mc_paramupmix_dec( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + float *output_f[] /* i/o: synthesized core-coder transport channels/DirAC output */ +); + +ivas_error ivas_mc_paramupmix_dec_open( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +); + +void ivas_mc_paramupmix_dec_close( + MC_PARAMUPMIX_DEC_HANDLE *hMCParamUpmix_out /* i/o: Parametric MC decoder handle */ +); + +void ivas_mc_paramupmix_dec_read_BS( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + Decoder_State *st, /* i/o: decoder state structure */ + MC_PARAMUPMIX_DEC_HANDLE hMCParamUpmix, /* i/o: decoder MC Param-Upmix handle */ + int16_t *nb_bits /* o : number of bits written */ +); + +void ivas_mc_paramupmix_dec_digest_tc( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const uint8_t nCldfbSlots, /* i : number of CLFBS slots in the transport channels */ + const int16_t nSamplesForRendering /* i : number of samples provided */ +); + +void ivas_mc_paramupmix_dec_render( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */ + uint16_t *nSamplesRendered, /* o : number of CLDFB slots rendered */ + uint16_t *nSamplesAvailable, /* o : number of CLDFB slots still to render */ + float *input_f[], /* i : core-coder transport channels */ + float *output_f[] /* i/o: synthesized core-coder transport channels */ +); + +void ivas_param_mc_metadata_open( + const MC_LS_SETUP mc_ls_setup, /* i : MC ls setup */ + const int16_t lfe_index, /* i : channel index of LFE */ + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + HANDLE_IVAS_PARAM_MC_METADATA hMetadataPMC /* o : handle for the Parametric MC parameter coding state */ +); + +void ivas_param_mc_set_coded_bands( + HANDLE_IVAS_PARAM_MC_METADATA hMetadataPMC /* i/o: handle for the Parametric MC parameter coding state */ +); + +void ivas_param_mc_metadata_close( + HANDLE_IVAS_PARAM_MC_METADATA hMetadataPMC /* i/o: handle for the Parametric MC parameter coding state */ +); + +void ivas_param_mc_create_full_icc_mapping( + const int16_t n_channels, /* i : number of channels with LFE for the internal setup */ + const int16_t lfe_index, /* i : channel index of the LFE */ + int16_t *icc_map[2], /* o : map of all possible ICCs */ + int16_t *icc_map_size_full /* o : number of all possible ICCs */ +); + +/*! r: number of IVAS transport channels */ +int16_t ivas_param_mc_getNumTransportChannels( + const int32_t ivas_total_bitrate, /* i : IVAS total bitrate */ + const MC_LS_SETUP mc_ls_setup /* i : MC ls setup */ +); + +ivas_error ivas_param_mc_enc_open( + Encoder_Struct *st_ivas /* i/o: IVAS encoder handle */ +); + +ivas_error ivas_param_mc_enc_reconfig( + Encoder_Struct *st_ivas /* i/o: IVAS encoder handle */ +); + +void ivas_param_mc_enc_close( + PARAM_MC_ENC_HANDLE *hParamMC, /* i/o: Parametric MC encoder handle */ + const int32_t input_Fs /* i : input sampling rate */ +); + +void ivas_param_mc_enc( + Encoder_Struct *st_ivas, /* i/o: IVAS Encoder handle */ + BSTR_ENC_HANDLE hMetaData, /* i/o: IVAS Metadata bitstream handle */ + float *data_f[], /* i/o: input/transport MC data */ + const int16_t input_frame /* i : input frame length */ +); + +ivas_error ivas_param_mc_dec_open( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +); + +ivas_error ivas_param_mc_dec_reconfig( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +); + +void ivas_param_mc_dec_close( + PARAM_MC_DEC_HANDLE *hParamMC /* i/o: Parametric MC decoder handle */ +); + +void ivas_param_mc_dec_read_BS( + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + Decoder_State *st, /* i/o: decoder state structure */ + PARAM_MC_DEC_HANDLE hParamMC, /* i/o: decoder ParamMC handle */ + int16_t *nb_bits /* o : number of bits written */ +); + +void ivas_param_mc_dec_digest_tc( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const uint8_t nCldfbSlots, /* i : number of CLFBS slots in the transport channels */ + float *transport_channels_f[] /* i : synthesized core-coder transport channels/DirAC output*/ +); + +void ivas_param_mc_dec_render( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */ + uint16_t *nSamplesRendered, /* o : number of CLDFB slots rendered */ + uint16_t *nSamplesAvailable, /* o : number of CLDFB slots still to render */ + float *output_f[] /* o : rendered time signal */ +); + +void ivas_param_mc_dec( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + float *output_f[] /* i/o: synthesized core-coder transport channels/DirAC output */ +); + +void ivas_param_mc_default_icc_map( + const PARAM_MC_ICC_MAPPING * hIccMapping, /* i : handle to ICC mapping configuration */ + int16_t icc_map[PARAM_MC_SZ_ICC_MAP][2] /* o : copy of map from the configuration */ +); + +/*! r: number of cldfb synthesis instances */ +int16_t param_mc_get_num_cldfb_syntheses( + Decoder_Struct *st_ivas /* i : IVAS decoder structure */ +); + +/*! r: index into the ParamMC configuration tables */ +uint16_t ivas_param_mc_get_configuration_index( + const MC_LS_SETUP mc_ls_setup, /* i : MC ls setup */ + const int32_t ivas_total_brate /* i : total bitrate */ +); + +int16_t matrix_product( + const float *X, /* i : left hand matrix */ + const int16_t rowsX, /* i : number of rows of the left hand matrix */ + const int16_t colsX, /* i : number of columns of the left hand matrix */ + const int16_t transpX, /* i : flag indicating the transposition of the left hand matrix prior to the multiplication */ + const float *Y, /* i : right hand matrix */ + const int16_t rowsY, /* i : number of rows of the right hand matrix */ + const int16_t colsY, /* i : number of columns of the right hand matrix */ + const int16_t transpY, /* i : flag indicating the transposition of the right hand matrix prior to the multiplication */ + float *Z /* o : resulting matrix after the matrix multiplication */ +); + +void mat2svdMat( + const float *mat, /* i : matrix as column ordered vector */ + float svdMat[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS], /* o : matrix as two-dimensional arry */ + const int16_t nRows, /* i : number of rows of the matrix */ + const int16_t mCols, /* i : number of columns of the matrix */ + const int16_t transpose /* i : flag indication transposition */ +); + +void svdMat2mat( + float svdMat[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS], /* i : matrix as two-dimensional arry */ + float *mat, /* o : matrix as column ordered vector */ + const int16_t nRows, /* i : number of rows of the matrix */ + const int16_t mCols /* i : number of columns of the matrix */ +); + +int16_t matrix_diag_product( + const float *X, /* i : left hand matrix */ + const int16_t rowsX, /* i : number of rows of the left hand matrix */ + const int16_t colsX, /* i : number of columns of the left hand matrix */ + const int16_t transpX, /* i : flag indicating the transposition of the left hand matrix prior to the multiplication */ + const float *Y, /* i : right hand diagonal matrix as vector containing the diagonal elements */ + const int16_t entriesY, /* i : number of entries in the diagonal */ + float *Z /* o : resulting matrix after the matrix multiplication */ +); + +int16_t diag_matrix_product( + const float *Y, /* i : left hand diagonal matrix as vector containing the diagonal elements */ + const int16_t entriesY, /* i : length of the diagonal of the left hand matrix */ + const float *X, /* i : right hand matrix */ + const int16_t rowsX, /* i : number of rows of the right hand matrix */ + const int16_t colsX, /* i : number of columns of the right hand matrix */ + const int16_t transpX, /* i : flag indicating the transposition of the right hand matrix prior to the multiplication */ + float *Z /* o : resulting matrix after the matrix multiplication */ +); + +int16_t matrix_product_diag( + const float *X, /* i : left hand matrix */ + const int16_t rowsX, /* i : number of rows of the left hand matrix */ + const int16_t colsX, /* i : number of columns of the left hand matrix */ + const int16_t transpX, /* i : flag indicating the transposition of the left hand matrix prior to the multiplication */ + const float *Y, /* i : right hand matrix */ + const int16_t rowsY, /* i : number of rows of the right hand matrix */ + const int16_t colsY, /* i : number of columns of the right hand matrix */ + const int16_t transpY, /* i : flag indicating the transposition of the right hand matrix prior to the multiplication */ + float *Z /* o : resulting matrix after the matrix multiplication */ +); + +void cmplx_matrix_square( + const float *realX, /* i : real part of the matrix */ + const float *imagX, /* i : imaginary part of the matrix */ + const int16_t mRows, /* i : number of rows of the matrix */ + const int16_t nCols, /* i : number of columns of the matrix */ + float *realZ, /* o : real part of the resulting matrix */ + float *imagZ /* o : imaginary part of the resulting matrix */ +); + +int16_t computeMixingMatrices( + const int16_t num_inputs, /* i : number of input channels */ + const int16_t num_outputs, /* i : number of output channels */ + const float *Cx, /* i : input channel covariance matrix */ + const float *Cy, /* i : target covariance matrix */ + const float *Q, /* i : prototype matrix (usually a upmix matrix) */ + const int16_t energy_compensation_flag, /* i : flag indicating that the energy compensation should be performed (i.e. no residual mixing matrix will follow) */ + const float reg_Sx, /* i : regularization factor for the input channel singular values */ + const float reg_ghat, /* i : regularization factor for the normalization matrix */ + float *mixing_matrix, /* o : resulting mixing matrix */ + float *Cr /* o : residual covariance matrix */ +); + +int16_t computeMixingMatricesResidual( + const int16_t num_outputs, /* i : number of output channels */ + const float *Cx, /* i : vector containing the diagonal diffuse prototype covariance */ + const float *Cy, /* i : matrix containing the missing cov (Cr from computeMixingMatrices()) */ + const float reg_Sx, /* i : regularization factor for the input channel singular values */ + const float reg_ghat, /* i : regularization factor for the normalization matrix */ + float *mixing_matrix /* o : resulting residual mixing matrix */ +); + +/*! r: error or success */ +int16_t svd( + float InputMatrix[][MAX_OUTPUT_CHANNELS], /* i : matrix to be decomposed (M) */ + float singularVectors_Left[][MAX_OUTPUT_CHANNELS], /* o : left singular vectors (U) */ + float singularValues[MAX_OUTPUT_CHANNELS], /* o : singular values vector (S) */ + float singularVectors_Right[][MAX_OUTPUT_CHANNELS], /* o : right singular vectors (V) */ + const int16_t nChannelsL, /* i : number of rows in the matrix to be decomposed */ + const int16_t nChannelsC /* i : number of columns in the matrix to be decomposed */ +); + +ivas_error ivas_dirac_dec_output_synthesis_cov_open( + DIRAC_OUTPUT_SYNTHESIS_PARAMS *h_dirac_output_synthesis_params, /* i/o: handle for the covariance synthesis parameters */ + DIRAC_OUTPUT_SYNTHESIS_COV_STATE *h_dirac_output_synthesis_state, /* i/o: handle for the covariance synthesis state */ + const int16_t max_band_decorr, /* i : uppermost frequency band where decorrelation is applied */ + const int16_t interp_length, /* i : length for interpolating the mixing matrices in time slots */ + const int16_t num_param_bands, /* i : number of parameter bands */ + const int16_t num_param_bands_residual, /* i : number of parameter bands with a residual mixing matrix (i.e. decorrelation */ + const int16_t nchan_in, /* i : number of input (transport) channels */ + const int16_t nchan_out, /* i : number of output channels */ + const float *proto_matrix /* i : the prototype (upmix) matrix (only used if mode == 1) */ +); + +void ivas_dirac_dec_output_synthesis_get_interpolator( + DIRAC_OUTPUT_SYNTHESIS_PARAMS *h_dirac_output_synthesis_params, /* i/o: handle for the covariance synthesis parameters */ + const uint16_t interp_length /* i : interpolator length */ +); + +void ivas_dirac_dec_output_synthesis_cov_init( + DIRAC_OUTPUT_SYNTHESIS_COV_STATE *h_dirac_output_synthesis_state, /* i/o: pointer to the state of the covariance synthesis */ + const int16_t nchan_in, /* i : number of input (tranport) channels */ + const int16_t nchan_out, /* i : number of output channels */ + const int16_t n_param_bands, /* i : number of total parameter bands */ + const int16_t n_param_bands_res /* i : number of parameter bands with a residual mixing matrix (i.e. decorrelation */ +); + +void ivas_dirac_dec_output_synthesis_cov_close( + DIRAC_OUTPUT_SYNTHESIS_PARAMS *h_dirac_output_synthesis_params, /* i : handle for the covariance synthesis parameters */ + DIRAC_OUTPUT_SYNTHESIS_COV_STATE *h_dirac_output_synthesis_state /* i/o: handle for the covariance synthesis state */ +); + +void ivas_dirac_dec_output_synthesis_cov_param_mc_collect_slot( + float *RealBuffer, /* i : input channel filter bank samples (real part) */ + float *ImagBuffer, /* i : input channel filter bank samples (imaginary part */ + float cx[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS], /* o : accumulated input covariance (real part) */ + float cx_imag[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS], /* o : accumulated input covariance (imaginary part) */ + PARAM_MC_DEC_HANDLE hParamMC, /* i : handle to Parametric MC state */ + const int16_t nchan_in /* i : number of input channels */ +); + +void ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot( + float *Cldfb_RealBuffer_in, /* i : input channel filter bank samples (real part) */ + float *Cldfb_ImagBuffer_in, /* i : input channel filter bank samples (imaginary part) */ + float Cldfb_RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : output channel filter bank samples (real part) */ + float Cldfb_ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : output channel filter bank samples (imaginary part) */ + float *mixing_matrix[], /* i : parameter band wise mixing matrices (direct part) */ + float *mixing_matrix_res[], /* i : parameter band wise mixing matrices (residual part) */ + const uint16_t slot_idx_sfr, /* i : time slot index for the current slot within the current subframe */ + const uint16_t slot_idx_tot, /* i : time slot index for the current slot within the frame */ + const int16_t nX, /* i : number of input channels */ + const int16_t nY, /* i : number of output channels */ + PARAM_MC_DEC_HANDLE hParamMC /* i : handle to the Parametric MC decoder state */ +); + +int16_t computeMixingMatricesISM( + const int16_t num_inputs, + const int16_t num_responses, + const int16_t num_outputs, + const float *responses, + const float *ener, + const float *Cx_diag, + const float *Cy_diag, + const float *Q, + const int16_t energy_compensation_flag, + const float reg_Sx, + const float reg_ghat, + float *mixing_matrix +); + +void FdCngEncodeDiracMDCTStereoSID( + CPE_ENC_HANDLE hCPE /* i/o: CPE encoder state structure */ +); + +void FdCngDecodeDiracMDCTStereoSID( + CPE_DEC_HANDLE hCPE /* i/o: CPE decoder state structure */ +); + + +/*----------------------------------------------------------------------------------* + * SPAR prototypes + *----------------------------------------------------------------------------------*/ + +ivas_error ivas_spar_enc_open( + Encoder_Struct *st_ivas, /* i/o: IVAS encoder handle */ + const int16_t spar_reconfig_flag /* i : SPAR reconfiguration flag */ +); + +void ivas_spar_enc_close( + SPAR_ENC_HANDLE *hSpar, /* i/o: SPAR encoder handle */ + const int32_t input_Fs, /* i : input sampling rate */ + const int16_t nchan_inp, /* i : number of input channels */ + const int16_t spar_reconfig_flag /* i : SPAR reconfiguration flag */ +); + +ivas_error ivas_spar_enc( + Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ + float *data_f[], /* i/o: input/transport audio channels */ + const int16_t input_frame, /* i : input frame length */ + int16_t *nb_bits_metadata, /* i : number of MD bits written */ + BSTR_ENC_HANDLE hMetaData /* o : MetaData handle */ +); + +ivas_error ivas_spar_dec_open( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const int16_t spar_reconfig_flag /* i : SPAR reconfiguration flag */ +); + +void ivas_spar_dec_close( + SPAR_DEC_HANDLE *hSpar, /* i/o: SPAR decoder handle */ + const int32_t output_Fs, /* i : output sampling rate */ + const int16_t spar_reconfig_flag /* i : SPAR reconfiguration flag */ +); + +ivas_error ivas_spar_dec( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */ + int16_t *nb_bits_read /* o : number of MD bits read */ +); + +void ivas_spar_config( + int32_t ivas_total_brate, /* i : codec total bitrate */ + const int16_t sba_order, /* i : Ambisonic (SBA) order */ + int16_t *nchan_transport, /* o : number of transport channels */ + int16_t *nSCE, /* o : number of SCEs */ + int16_t *nCPE, /* o : number of CPEs */ + int32_t *core_nominal_brate, /* o : core-coding nominal bitrate */ + const int16_t sid_format /* i : IVAS format indicator from SID frame */ +); + +ivas_error ivas_sba_upmixer_renderer( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */ + float *output[], /* i/o: transport/output audio channels */ + const int16_t output_frame /* i : output frame length */ +); + +ivas_error ivas_sba_linear_renderer( + float *output_f[], /* i/o: synthesized core-coder transport channels/DirAC output */ + const int16_t output_frame, /* i : output frame length per channel */ + const int16_t nchan_in, /* i : number of input ambisonics channels */ + const int16_t nchan_ism, /* i : number of objects */ + const AUDIO_CONFIG output_config, /* i : output audio configuration */ + const IVAS_OUTPUT_SETUP output_setup /* i : output format setup */ +); + +void ivas_sba_mix_matrix_determiner( + SPAR_DEC_HANDLE hSpar, /* i/o: SPAR decoder handle */ + float *output[], /* i/o: transport/output audio channels */ + const int16_t bfi, /* i : BFI flag */ + const int16_t nchan_remapped, /* i : num channels after remapping of TCs */ + const int16_t output_frame, /* i : output frame length */ + const int16_t num_md_sub_frames /* i : number of subframes in mixing matrix */ +); + +/* AGC */ +/*! r: AGC enable flag */ +int16_t ivas_agc_enc_get_flag( + const int16_t nchan_transport /* i : number of transport channels */ +); + +ivas_error ivas_spar_agc_enc_open( + ivas_agc_enc_state_t **hAgcEnc, /* i/o: AGC decoder handle */ + const int32_t input_Fs, /* i : input sampling rate */ + const int16_t nchan_inp /* i : number of input channels */ +); + +void ivas_spar_agc_enc_close( + ivas_agc_enc_state_t **hAgcEnc /* i/o: AGC encoder handle */ +); + +void ivas_agc_enc_process( + ivas_agc_enc_state_t *hAgcEnc, /* i/o: AGC encoder handle */ + BSTR_ENC_HANDLE hMetaData, /* i/o: MetaData handle */ + float **ppPcm_in, /* i : input audio channels */ + float **ppPcm_out, /* o : output audio channels */ + const int16_t n_channels, /* i : number of channels */ + const ENCODER_CONFIG_HANDLE hEncoderConfig /* i : configuration structure */ +); + +ivas_error ivas_spar_agc_dec_open( + ivas_agc_dec_state_t **hAgcDec, /* i/o: AGC decoder handle */ + const int32_t output_Fs /* i : output sampling rate */ +); + +void ivas_spar_agc_dec_close( + ivas_agc_dec_state_t **hAgcDec /* i/o: AGC decoder handle */ +); + +ivas_error ivas_spar_md_enc_init +( + ivas_spar_md_enc_state_t *hMdEnc, /* o : MD encoder handle */ + const ENCODER_CONFIG_HANDLE hEncoderConfig, /* i : configuration structure */ + const int16_t sba_order /* i : Ambisonic (SBA) order */ +); + +void ivas_agc_dec_process( + ivas_agc_dec_state_t *hAgcDec, /* i/o: AGC decoder handle */ + float *pcm_in[], /* i : input audio channels */ + float *pcm_out[], /* o : output audio channels */ + const int16_t n_channels, /* i : number of channels */ + const int16_t output_Fs /* i : output sampling rate */ +); + +void ivas_agc_read_bits( + ivas_agc_dec_state_t *hAgcDec, /* i/o: AGC decoder handle */ + Decoder_State *st0, /* i/o: decoder state structure - for bitstream handling*/ + const int16_t n_channels, /* i : number of channels */ + const int16_t AGC_flag /* i : AGC on/off flag */ +); + +void ivas_agc_initWindowFunc( + float *pWinFunc, + const int16_t length +); + +void ivas_agc_calcGainParams( + uint16_t *absEmin, + uint16_t *betaE, + uint16_t *maxAttExp, + const int16_t numCoeffs +); + +float ivas_get_mdct_scaling_gain( + const int16_t dct_len_by_2 +); + +void ivas_get_twid_factors( + const int16_t length, + const float **pTwid_re, + const float **pTwid_im +); + +int16_t ivas_get_bw_idx_from_sample_rate( + const int32_t sampling_rate /* i : sampling rate */ +); + +/*! r: config. table index */ +int16_t ivas_get_spar_table_idx( + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + const int16_t sba_order, /* i : IVAS SBA order */ + const int16_t bwidth, /* i : audio bandwidth */ + int16_t *bitlen, /* o : number of bits */ + int16_t *ind /* o : indice */ +); + +/*! r: number of transport channels */ +int16_t ivas_get_sba_num_TCs( + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + const int16_t sba_order /* i : IVAS SBA order */ +); + +void ivas_spar_set_bitrate_config( + ivas_spar_md_com_cfg *pSpar_md_cfg, /* i/o: SPAR MD config. handle */ + const int16_t table_idx, /* i : config. table index */ + const int16_t num_bands, /* i : number of bands */ + const int16_t dirac2spar_md_flag, + const int16_t enc_flag, + const int16_t pca_flag, + const int16_t agc_flag +); + +void ivas_spar_bitrate_dist( + int32_t core_brates_act[], /* o : bitrates per core-coder */ + const int16_t nAvailBits, /* i : number of available bits */ + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + const int16_t sba_order, /* i : Ambisonic (SBA) order */ + const int16_t bwidth /* i : audio bandwidth */ +); + +void ivas_mdct( + const float *pIn, + float *pOut, + const int16_t length +); + +void ivas_dct_windowing( + const int16_t fade_len, + const int16_t full_len, + const int16_t dct_len, + const int16_t zero_pad_len, + const float *pWindow_coeffs, + const int16_t frame_len, + float *pOut_buf, + float *pBuffer_prev, + float *pTemp_lfe +); + +void ivas_tda( + const float *pIn, + float *pOut, + const int16_t length +); + +void ivas_imdct( + const float *pIn, + float *pOut, + const int16_t length +); + +void ivas_itda( + const float *re, + float *pOut, + const int16_t length +); + +void ivas_spar_get_cldfb_gains( + SPAR_DEC_HANDLE hSpar, + HANDLE_CLDFB_FILTER_BANK cldfbAnaDec0, + HANDLE_CLDFB_FILTER_BANK cldfbSynDec0, + const DECODER_CONFIG_HANDLE hDecoderConfig +); + +/*! r: 1 if prediction residual channel */ +int16_t ivas_is_res_channel( + const int16_t ch, /* i : ch index in WYZX ordering */ + const int16_t nchan_transport /* i : number of transport channels (1-4) */ +); + +void ivas_spar_dec_agc_pca( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + float *output[], /* i/o: input/output audio channels */ + const int16_t output_frame /* i : output frame length */ +); + +void ivas_spar_dec_set_render_map( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const int16_t nCldfbTs /* i : number of CLDFB time slots */ +); + +void ivas_spar_dec_set_render_params( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const int16_t n_cldfb_slots /* i : number of cldfb slots in this frame */ +); + +void ivas_spar_dec_digest_tc( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const int16_t nchan_transport, /* i : number of transport channels */ + const int16_t nCldfbSlots, /* i : number of CLDFB slots */ + const int16_t nSamplesForRendering /* i : number of samples provided */ +); + +void ivas_sba_dec_digest_tc( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const int16_t nCldfbSlots, /* i : number of CLDFB slots */ + const int16_t nSamplesForRendering /* i : number of samples provided */ +); + +ivas_error ivas_sba_dec_render( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */ + uint16_t *nSamplesRendered, /* o : number of CLDFB slots rendered */ + uint16_t *nSamplesAvailable, /* o : number of CLDFB slots still to render */ + float *output_f[] /* o : rendered time signal */ +); + +void ivas_spar_dec_upmixer_sf( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + float *output[], /* o : output audio channels */ + const int16_t nchan_internal /* i : number of internal channels */ +); + +void ivas_spar_dec_upmixer( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + float *output[], /* i/o: input/output audio channels */ + const int16_t nchan_internal, /* i : number of internal channels */ + const int16_t output_frame /* i : output frame length */ +); + +/* MD module */ +ivas_error ivas_spar_md_enc_open( + ivas_spar_md_enc_state_t **hMdEnc, /* i/o: SPAR MD encoder handle */ + const ENCODER_CONFIG_HANDLE hEncoderConfig, /* i : configuration structure */ + const int16_t sba_order /* i : Ambisonic (SBA) order */ +); + +void ivas_spar_md_enc_close( + ivas_spar_md_enc_state_t **hMdEnc /* i/o: SPAR MD encoder handle */ +); + +ivas_error ivas_spar_md_enc_process( + ivas_spar_md_enc_state_t *hMdEnc, /* i/o: SPAR MD encoder handle */ + const ENCODER_CONFIG_HANDLE hEncoderConfig, /* i : configuration structure */ + float *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], + float *cov_dtx_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], + BSTR_ENC_HANDLE hMetaData, /* i/o: MetaData handle */ + const int16_t dtx_vad, + const int16_t nchan_inp, + const int16_t sba_order, /* i : Ambisonic (SBA) order */ + float *prior_mixer[IVAS_MAX_FB_MIXER_OUT_CH][IVAS_MAX_SPAR_FB_MIXER_IN_CH], /* i : prior mixer_matrix */ + const int16_t dyn_active_w_flag, /* i : flag to indicate dynamic active W */ + const int16_t dirac_mono_flag /* i : flag to indicate mono only mode in SBA */ +); + +void ivas_compute_spar_params( + float *pppCov_mat_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], + float dm_fv_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], + const int16_t i_ts, + float ***mixer_mat, + const int16_t start_band, + const int16_t end_band, + const int16_t dtx_vad, + const int16_t num_ch, + const int16_t bands_bw, + const int16_t active_w, + const int16_t active_w_vlbr, + ivas_spar_md_com_cfg *hSparCfg, + ivas_spar_md_t *hSparMd, + float *pWscale, + const int16_t from_dirac, + const int16_t dyn_active_w_flag +); + +void ivas_create_fullr_dmx_mat( + float pred_coeffs_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], + float dm_fv_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], + float ***mixer_mat, + const int16_t in_chans, + const int16_t start_band, + const int16_t end_band, + const int16_t active_w, + ivas_spar_md_com_cfg *hMdCfg +); + +void ivas_calc_c_p_coeffs( + ivas_spar_md_t *pSparMd, + float *pppCov_mat_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], + const int16_t i_ts, + float ***mixer_mat, + const int16_t num_ch, + const int16_t num_dmx, + const int16_t band_idx, + const int16_t dtx_vad, + const int16_t compute_p_flag, + const int16_t dyn_active_w_flag +); + +void ivas_get_spar_md_from_dirac( + float azi_dirac[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES], + float ele_dirac[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES], + float diffuseness[IVAS_MAX_NUM_BANDS], + const int16_t n_ts, + float ***mixer_mat, + ivas_spar_md_t *hSpar_md, + ivas_spar_md_com_cfg *hSpar_md_cfg, + const int16_t start_band, + const int16_t end_band, + const int16_t order, + const int16_t dtx_vad, + float Wscale_d[IVAS_MAX_NUM_BANDS], + const uint8_t useLowerRes, + const int16_t active_w_vlbr, + const int16_t dyn_active_w_flag +); + +/*! r: number of MD subframes */ +int16_t ivas_get_spar_dec_md_num_subframes( + const int16_t sba_order, /* i : Ambisonic (SBA) order */ + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + const int32_t ivas_last_active_brate /* i : IVAS last active bitrate */ +); + +ivas_error ivas_spar_md_dec_matrix_open( + ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ + const int16_t num_channels, /* i : number of internal channels */ + const int16_t num_md_sub_frames +); + +void ivas_spar_md_dec_matrix_close( + ivas_spar_md_dec_state_t *hMdDecoder, /* i/o: SPAR MD decoder handle */ + const int16_t num_channels /* i : number of internal channels */ +); + +ivas_error ivas_spar_md_dec_open( + ivas_spar_md_dec_state_t **hMdDec_out, /* i/o: SPAR MD decoder handle */ + const DECODER_CONFIG_HANDLE hDecoderConfig, /* i : configuration structure */ + const int16_t num_channels, /* i : number of internal channels */ + const int16_t sba_order, /* i : SBA order */ + const int16_t sid_format, /* i : SID format */ + const int32_t last_active_ivas_total_brate /* i : IVAS last active bitrate */ +); + +void ivas_spar_md_dec_close( + ivas_spar_md_dec_state_t **hMdDec /* i/o: SPAR MD decoder handle */ +); + +void ivas_spar_get_parameters( + SPAR_DEC_HANDLE hSpar, /* i/o: SPAR decoder handle */ + const DECODER_CONFIG_HANDLE hDecoderConfig, /* i : configuration structure */ + const int16_t ts, /* i : time slot index */ + const int16_t num_ch_out, /* i : number of channels out */ + const int16_t num_ch_in, /* i : number of channels in */ + const int16_t num_spar_bands, /* i : number of SPAR bands */ + float par_mat[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS] /* o : mixing matrix */ +); + +ivas_error ivas_spar_md_dec_init( + ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ + const DECODER_CONFIG_HANDLE hDecoderConfig, /* i : configuration structure */ + const int16_t num_channels, /* i : number of internal channels */ + const int16_t sba_order /* i : SBA order */ +); + +void ivas_spar_md_dec_process( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + Decoder_State *st0, /* i/o: decoder state structure - for bitstream handling*/ + const int16_t num_bands_out, /* i : number of output bands */ + const int16_t sba_order /* i : SBA order */ +); + +void ivas_spar_to_dirac( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ + const int16_t dtx_vad, /* i : DTX frame flag */ + const int16_t num_bands_out, /* i : number of output bands */ + const int16_t bw, /* i : band joining factor */ + const int16_t dyn_active_w_flag /* i : dynamic active W flag */ +); + +void ivas_spar_update_md_hist( + ivas_spar_md_dec_state_t *hMdDec /* i/o: SPAR MD decoder handle */ +); + +int16_t ivas_spar_chk_zero_coefs( + Decoder_Struct *st_ivas /* i/o: IVAS decoder handle */ +); + +void ivas_spar_smooth_md_dtx( + ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ + const int16_t num_bands_out, /* i : number of output bands */ + const int16_t num_md_sub_frames /* i : number of metadata subframes */ +); + +void ivas_spar_setup_md_smoothing( + ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ + const int16_t num_bands_out, /* i : number of output bands */ + const int16_t num_md_sub_frames /* i : number of metadata subframes */ +); + +void ivas_spar_dec_gen_umx_mat( + ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ + const int16_t nchan_transport, /* i : number of transport channels */ + const int16_t num_bands_out, /* i : number of output bands */ + const int16_t bfi, /* i : bad frame indicator */ + const int16_t num_md_sub_frames +); + +/* Covariance module */ +ivas_error ivas_spar_covar_enc_open( + ivas_enc_cov_handler_state_t **hCovEnc, /* i/o: SPAR Covar. encoder handle */ + ivas_filterbank_t *pFb, /* i/o: FB handle */ + const int32_t input_Fs, /* i : input sampling rate */ + const int16_t nchan_inp, /* i : number of input channels */ + const COV_SMOOTHING_TYPE smooth_mode, /* i : Smooth covariance for SPAR or MC */ + const int32_t ivas_total_brate /* i : IVAS total bitrate */ +); + +void ivas_spar_covar_enc_close( + ivas_enc_cov_handler_state_t **hCovEnc, /* i/o: SPAR Covar. encoder handle */ + const int16_t nchan_inp /* i : number of input channels */ +); + +void ivas_enc_cov_handler_process( + ivas_enc_cov_handler_state_t *hCovEnc, /* i/o: SPAR Covar. encoder handle */ + float **ppIn_FR_real, + float **ppIn_FR_imag, + float *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], + float *cov_dtx_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], + ivas_filterbank_t *pFb, /* i/o: FB handle */ + const int16_t start_band, + const int16_t end_band, + const int16_t nchan_inp, + const int16_t dtx_vad, + const int16_t transient_det[2], + const int16_t HOA_md_ind[IVAS_SPAR_MAX_CH], + int16_t *res_ind, + const int16_t *remix_order, + int16_t *dyn_active_w_flag, + const int16_t nchan_transport, + const int16_t is_sba +); + +ivas_error ivas_spar_covar_smooth_enc_open( + ivas_cov_smooth_state_t **hCovState, /* i/o: SPAR Covar. smoothing handle */ + const ivas_cov_smooth_cfg_t *cov_smooth_cfg, /* i : SPAR config. handle */ + ivas_filterbank_t *pFb, /* i/o: FB handle */ + const int16_t nchan_inp, /* i : number of input channels */ + const COV_SMOOTHING_TYPE smooth_mode, /* i : Smooth covariance for SPAR or MC */ + const int32_t ivas_total_brate /* i : IVAS total bitrate */ +); + +void ivas_spar_covar_smooth_enc_close( + ivas_cov_smooth_state_t **hCovState, /* i/o: SPAR Covar. encoder handle */ + const int16_t nchan_inp /* i : number of input channels */ +); + +void ivas_cov_smooth_process( + ivas_cov_smooth_state_t *hCovState, /* i/o: Covariance state handle */ + float *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], + ivas_filterbank_t *pFb, /* i/o: FB handle */ + const int16_t start_band, + const int16_t end_band, + const int16_t num_ch, + const int16_t transient_det[2] +); + +/* Transient detector module */ +ivas_error ivas_transient_det_open( + ivas_trans_det_state_t **hTranDet, /* i/o: Transient detector handle */ + const int32_t sampling_rate /* i : sampling rate */ +); + +void ivas_transient_det_close( + ivas_trans_det_state_t **hTranDet /* i/o: Transient detector handle */ +); + +void ivas_transient_det_process( + ivas_trans_det_state_t *hTranDet, /* i/o: SPAR TD handle */ + float *pIn_pcm, /* i : input audio channels */ + const int16_t frame_len, /* i : frame length in samples */ + int16_t transient_det[2] /* o : transient det outputs */ +); + +void ivas_td_decorr_get_ducking_gains( + ivas_trans_det_state_t *hTranDet, /* i/o: Transient detector handle */ + float *pIn_pcm, + float *pIn_duck_gains, + float *pOut_duck_gains, + const int16_t frame_len, + const int16_t tdet_flag +); + +ivas_error ivas_td_decorr_dec_open( + ivas_td_decorr_state_t **hTdDecorr, /* i/o: TD decorrelator handle */ + const int32_t output_Fs, /* i : output sampling rate */ + const int16_t nchan_internal, /* i : number of internal channels */ + const int16_t ducking_flag /* i : ducking flag */ +); + +void ivas_td_decorr_dec_close( + ivas_td_decorr_state_t **hTdDecorr /* i/o: TD decorrelator handle */ +); + +void ivas_td_decorr_process( + ivas_td_decorr_state_t *hTdDecorr, /* i/o: SPAR Covar. decoder handle */ + float *pcm_in[], /* i : input audio channels */ + float **ppOut_pcm, /* o : output audio channels */ + const int16_t output_frame /* i : output frame length */ +); + +void ivas_td_decorr_APD_iir_filter( + ivas_td_decorr_APD_filt_state_t *filter_state, + float *pIn_out, + const int16_t num_APD_sections, + const int16_t length +); + +#define IVAS_CMULT_FLOAT( in1_re, in1_im, in2_re, in2_im, out1_re, out1_im ) \ + out1_re = ( in1_re * in2_re ) - ( in1_im * in2_im ); MAC(1); MULT(1); \ + out1_im = ( in1_re * in2_im ) + ( in2_re * in1_im ); MAC(1); MULT(1); + +#define IVAS_CALCULATE_ABS( re, im, out ) \ + out = (float) sqrt( ( re * re ) + ( im * im ) ); MAC(1); MULT(1); SQRT(1); + +#define IVAS_CALCULATE_RABS( re, out ) \ + out = (float) sqrt( re * re ); MULT(1); SQRT(1); + +#define IVAS_CALCULATE_SQ_ABS( re, im, out ) \ + out = (float) ( ( re * re ) + ( im * im ) ); MAC(1); MULT(1); + +#define IVAS_RMULT_DOUBLE( in1_re, in2_re, out1_re ) \ + out1_re = ( in1_re * in2_re ); DMULT(1); \ + +#define IVAS_CALCULATE_SQ_ABS_N( re, out ) \ + out = (float) ( re * re ); MULT(1); + +#define IVAS_RMULT_FLOAT( in1_re, in2_re, out1_re ) \ + out1_re = ( in1_re * in2_re ); MULT(1); + + +/* PCA */ +void ivas_pca_enc_init( + PCA_ENC_STATE *hPCA /* i/o: PCA encoder structure */ +); + +void ivas_pca_enc( + const ENCODER_CONFIG_HANDLE hEncoderConfig, /* i : configuration structure */ + PCA_ENC_STATE *hPCA, /* i : PCA encoder structure */ + BSTR_ENC_HANDLE hMetaData, /* i/o: MetaData handle */ + float *data_f[8], /* i : input/transformed audio channels */ + const int16_t input_frame, /* i : input frame length */ + const int16_t n_channels /* i : number of channels */ +); + +void ivas_pca_read_bits( + Decoder_State *st0, /* i/o: decoder state structure - for bitstream handling*/ + PCA_DEC_STATE *hPCA /* i/o: PCA encoder structure */ +); + +void ivas_pca_dec_init( + PCA_DEC_STATE *hPCA /* i/o: PCA decoder structure */ +); + +void ivas_pca_dec( + PCA_DEC_STATE *hPCA, /* i/o: PCA decoder structure */ + const int16_t n_samples, /* i : output frame length */ + const int16_t n_channels, /* i : number of channels */ + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + const int32_t last_ivas_total_brate, /* i : last IVAS total bitrate */ + const int16_t bfi, /* i : bad frame indicator */ + float *pcm_out[] /* o : output audio channels */ +); + +/* PCA utilities */ +void eye_matrix( + float *mat, + const int16_t n, + const float d +); + +void cov_subfr( + float **ptr_sig, + float *r, + const int16_t n_channels, + const int16_t len +); + +void eig_qr( + const float *A, + const int16_t num_iter, + float *EV, float *Vals, + const int16_t n +); + +void exhst_4x4( + float *cost_mtx, + int16_t *path, + const int16_t maximize +); + +float mat_det4( + const float *m +); + +/* quaternion utilities */ +void mat2dquat( + const float *a, + float *ql, + float *qr +); + +void dquat2mat( + const float *ql, + const float *qr, + float *m +); + +void quat_shortestpath( + const float *q00, + float *q01, + const float *q10, + float *q11 +); + +void pca_interp_preproc( + const float *prev_ql, + const float *prev_qr, + const float *ql, + const float *qr, + const int16_t len, + float *ql_interp, + float *qr_interp +); + +void pca_enc_s3( + float *q, + int32_t *index +); + +void pca_dec_s3( + const int32_t index, + float *q +); + +int16_t ivas_get_bits_to_encode( + int32_t val +); + +void ivas_huffman_encode( + ivas_huffman_cfg_t *huff_cfg, + int16_t in, + int16_t *hcode, + int16_t *hlen +); + +void ivas_spar_huff_coeffs_com_init( + ivas_huff_coeffs_t *pHuff_coeffs, + ivas_spar_md_com_cfg *pSpar_cfg, + const int16_t table_idx, + const int16_t enc_dec +); + +void ivas_spar_arith_coeffs_com_init( + ivas_arith_coeffs_t *pArith_coeffs, + ivas_spar_md_com_cfg *pSpar_cfg, + const int16_t table_idx, + const int16_t enc_dec +); + +int16_t ivas_arith_encode_cmplx_cell_array( + ivas_arith_t *pArith_re, + ivas_arith_t *pArith_re_diff, + const int16_t *pDo_diff, + const int16_t nB, + int16_t *pSymbol_re, + int16_t *pSymbol_old_re, + ivas_cell_dim_t *pCell_dims, + BSTR_ENC_HANDLE hMetaData, + const int16_t any_diff , + const int16_t wc_strat_arith +); + +ivas_error ivas_huffman_decode( + ivas_huffman_cfg_t *huff_cfg, + Decoder_State *st0, + int16_t *dec_out +); + +void ivas_arith_decode_cmplx_cell_array( + ivas_arith_t *pArith_re, + ivas_arith_t *pArith_re_diff, + Decoder_State *st0, + ivas_cell_dim_t *pCell_dims, + int16_t *pDo_diff, const int16_t nB, + int16_t *pSymbol_re, + int16_t *pSymbol_re_old +); + +void ivas_ari_start_decoding_14bits_ext_1_lfe( + Decoder_State *st, + Tastat *s, + int16_t *extra_bits_read +); + +uint16_t ivas_ari_decode_14bits_bit_ext_1_lfe( + Decoder_State *st, Tastat *s, + const uint16_t *cum_freq, + int16_t *extra_bits_read +); + +void ivas_ari_done_decoding_14bits_ext_1_lfe( + Decoder_State *st, + const int16_t extra_bits_read +); + +void ivas_ari_done_encoding_14bits( + BSTR_ENC_HANDLE hBstr, Tastat *s +); + +void ivas_ari_encode_14bits_ext( + BSTR_ENC_HANDLE hBstr, + Tastat *s, + int32_t symbol, + const uint16_t *cum_freq +); + +void ivas_wrap_arround( + int16_t *pArr, + const int16_t min_val, + const int16_t max_val, + const int16_t length +); + +void ivas_get_cum_freq_model( + const int16_t *pFreq_model, + const int16_t length, + int16_t *pCum_freq_model +); + +int16_t ivas_map_num_pred_r_to_idx( + const int16_t num_quant_points_pred_r, + const int16_t active_w_flag +); + +int16_t ivas_map_num_drct_r_to_idx( + const int16_t num_quant_points_drct_r +); + +int16_t ivas_map_num_decd_r_to_idx( + const int16_t num_quant_points_decd_r +); + +/* Quantization utilities */ +void ivas_quantise_real_values( + const float *values, + const int16_t q_levels, + const float min_value, + const float max_value, + int16_t *index, + float *quant, + const int16_t dim +); + +void ivas_spar_get_uniform_quant_strat( + ivas_spar_md_com_cfg *pSpar_md_com_cfg, + const int16_t table_idx +); + +void ivas_spar_quant_dtx_init( + ivas_spar_md_t *spar_md, + float *min_max +); + +void ivas_map_prior_coeffs_quant( + ivas_spar_md_prev_t *pSpar_md_prior, + ivas_spar_md_com_cfg *pSpar_md_cfg, + const int16_t qsi, + const int16_t nB +); + +void ivas_copy_band_coeffs_idx_to_arr( + ivas_band_coeffs_ind_t *pBands_idx, + const int16_t nB, + int16_t *pSymbol_re, + ivas_cell_dim_t *pCell_dims, + const ivas_coeffs_type_t coeff_type +); + +void ivas_clear_band_coeffs( + ivas_band_coeffs_t *pband_coeffs, + const uint16_t num_bands +); + +void ivas_clear_band_coeff_idx( + ivas_band_coeffs_ind_t *pband_coeff_idx, + const uint16_t num_bands +); + + +/*----------------------------------------------------------------------------------* + * MASA prototypes + *----------------------------------------------------------------------------------*/ + +ivas_error ivas_masa_dec_open( + Decoder_Struct *st_ivas /* i/o: IVAS decoder handle */ +); + +void ivas_masa_dec_close( + MASA_DECODER_HANDLE *hMasa /* i/o: MASA metadata structure */ +); + +ivas_error ivas_masa_decode( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */ + Decoder_State *st, /* i/o: decoder state structure */ + int16_t *nb_bits_read /* o : number of bits read */ +); + +void generate_gridEq( + SPHERICAL_GRID_DATA *data /* o : data structure for grid */ +); + +ivas_error ivas_masa_enc_open( + Encoder_Struct *st_ivas /* i/o: IVAS encoder handle */ +); + +void ivas_masa_enc_close( + MASA_ENCODER_HANDLE *hMasa /* i/o: MASA metadata structure */ +); + +void ivas_masa_enc_reconfigure( + Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ +); + +ivas_error ivas_masa_dec_reconfigure( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + uint16_t *nSamplesRendered, /* o : number of samples flushed from the previous frame (JBM) */ + int16_t *data /* o : output synthesis signal */ +); + +ivas_error ivas_masa_encode( + MASA_ENCODER_HANDLE hMasa, /* i/o: MASA encoder structure */ + IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ + BSTR_ENC_HANDLE hMetaData, /* i/o: Metadata bitstream handle */ + int16_t *nb_bits_metadata, /* o : number of metadata bits written */ + const int16_t nchan_transport, /* i : number of MASA input/transport channels */ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + const int16_t Opt_DTX_ON, /* i : DTX on flag */ + const int16_t element_mode, /* i : element mode */ + const ISM_MODE ism_mode, /* i : ISM format mode */ + const int16_t nchan_ism, /* i : number of ISM channels */ + ISM_METADATA_HANDLE hIsmMetaData[MAX_NUM_OBJECTS], /* i : ISM metadata handle */ + const int16_t idx_separated_object, /* i : index of the separated object */ + OMASA_ENC_HANDLE hOMasa, /* i : OMASA encoder handle */ + const int16_t ism_imp, /* i : importance of separated object */ + const int16_t flag_omasa_ener_brate /* i : less bitrate for objects in OMASA flag */ +); + +void ivas_masa_estimate_energy( + MASA_ENCODER_HANDLE hMasa, /* i/o: MASA encoder structure */ + float *data_f[], /* i : Input audio channels */ + const int16_t input_frame, /* i : frame length */ + const int16_t nchan_transport /* i : number of MASA input/transport channels */ +); + +ivas_error ivas_masa_enc_config( + Encoder_Struct* st_ivas /* i/o: IVAS encoder structure */ +); + +void ivas_masa_set_elements( + const int32_t ivas_total_brate, /* i : codec total bitrate */ + const int16_t mc_mode, /* i : MC format mode */ + const int16_t nchan_transport, /* i : number of MASA input/transport channels */ + IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ + int16_t *element_mode, /* o : element mode */ + int16_t *nSCE, /* o : number of SCEs */ + int16_t *nCPE, /* o : number of CPEs */ + const int16_t ivas_format, /* i : IVAS format */ + const ISM_MODE ism_mode, /* i : ISM mode */ + const int32_t ism_total_brate /* i : initial ISM total bitrate */ +); + +/*! r: valid or not 1/0 */ +int16_t valid_ratio_index( + int16_t index, /* i : index to be checked */ + const int16_t K, /* i : L1 norm to check against */ + const int16_t len /* i : vector length */ +); + +void reconstruct_ism_ratios( + int16_t *ratio_ism_idx, + const int16_t nchan_ism, + const float step, + float *q_energy_ratio_ism +); + +void distribute_evenly_ism( + int16_t *idx, + const int16_t K, + const int16_t nchan_ism +); + +int16_t ivas_qmetadata_DecodeExtendedGR( + uint16_t* bitstream, + int16_t* index, + const int16_t alph_size, + const int16_t gr_param +); + +int16_t ivas_qmetadata_encode_extended_gr_length( + const uint16_t value, + const uint16_t alphabet_size, + const int16_t gr_param); + +void ivas_qmetadata_encode_extended_gr( + BSTR_ENC_HANDLE hMetaData, /* i/o: q_metadata handle */ + const uint16_t value, /* i : value to be encoded */ + const uint16_t alphabet_size, /* i : alphabet size */ + const int16_t gr_param); /* i : GR order */ + +/*! r: CPE bitrate value */ +int32_t calculate_cpe_brate_MASA_ISM( + const ISM_MODE ism_mode, /* i : ism mode */ + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + const int16_t nchan_ism /* i : number of objects */ +); + +void ivas_merge_masa_metadata( + MASA_ENCODER_HANDLE hMasa, /* i/o: MASA enc handle. source for MASA metadata and combined metadata will be here */ + OMASA_SPATIAL_META_HANDLE hOMasaMeta /* i : ISM-object metadata to be merged with the MASA metadata */ +); + +void ivas_masa_combine_directions( + MASA_ENCODER_HANDLE hMasa /* i/o: MASA encoder handle */ +); + +/*!r : number of bits for ISM ratio index */ +int16_t bits_index_ism_ratio( + const int16_t nchan_ism /* i : number of objects */ +); + +void calculate_nbits_meta( + const int16_t nchan_ism, + float q_energy_ratio_ism[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS][MAX_NUM_OBJECTS], + float masa_to_total_energy_ratio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], + const int16_t numSf, + const int16_t numCodingBands, + int16_t* bits_ism, + const int16_t idx_sep_obj, + const int16_t ism_imp +); + +/*! r: limitation flag */ +int16_t calculate_brate_limit_flag( + const int16_t ism_imp[], /* i : ISM importance flags */ + const int16_t nchan_ism /* i : number of objects */ +); + +void ivas_get_stereo_panning_gains( + const float aziDeg, + const float eleDeg, + float panningGains[2] +); + +void ivas_masa_set_coding_config( + MASA_CODEC_CONFIG* config, /* i/o: MASA coding config structure */ + int16_t* band_mapping, /* o : Band mapping used */ + const int32_t ivas_total_brate, /* i : codec total bitrate */ + const int16_t nchan_transport, /* i : number of transport channel (mono/stereo) */ + const uint8_t isMcMasa /* i : toggle for selecting McMASA specific config */ +); + +/*! r: Surround coherence significant flag */ +uint8_t ivas_masa_surrcoh_signicant( + float surroundingCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i : Surround coherence */ + float diffuse_to_total_ratio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i : Diffuse to total ratio */ + const int16_t nSubFrames, /* i : Number of sub frames */ + const int16_t nBands /* i : Number of frequency bands */ +); + +void masa_compensate_two_dir_energy_ratio_index( + const int16_t ratio_index_1, /* i : Input ratio for direction 1 */ + const int16_t ratio_index_2, /* i : Input ratio for direction 2 */ + int16_t *ratio_index_mod1, /* o : Output modified ratio for direction 1 */ + int16_t *ratio_index_mod2, /* o : Output modified ratio for direction 2 */ + const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ +); + +void ivas_set_qmetadata_maxbit_req( + IVAS_QMETADATA_HANDLE hQMetaData, /* o : qmetadata structure where the requirement value is set */ + const IVAS_FORMAT ivas_format /* i : IVAS format */ +); + +/*! r: Bits to be used for quantizing distribution ratio of direct-to-total ratios */ +int16_t ivas_get_df_ratio_bits_hodirac( + const int16_t index_diff /* i : Index of quantized diffuse-to-total ratio */ +); + +/*! r: Bits to be used for quantizing distribution ratio of direct-to-total ratios */ +int16_t ivas_get_df_ratio_bits( + const int16_t index_diff /* i : Index of quantized diffuse-to-total ratio */ +); + +void masa_sample_rate_band_correction( + MASA_CODEC_CONFIG *config, /* i/o: MASA codec config */ + int16_t *band_mapping, /* i/o: Band mapping used and modified */ + IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: QMetadata structure for modification */ + const uint8_t maxBand, /* i : max band */ + uint8_t is_encoder, /* i : signals if called at encoder */ + MASA_DECODER_EXT_OUT_META_HANDLE hExtOutMeta /* i/o: MASA decoder metadata ext out buffer */ +); + +void invdct4_transform( + float *v, /* i : input vector */ + uint8_t *invdct_v /* o : transformed vector */ +); + +void update_bits_next_block( + IVAS_QDIRECTION *q_direction, /* i/o: qdirection */ + int16_t *p_diff, /* i/o: bits to be transferred */ + const int16_t j, /* i : current subband index */ + const int16_t max_i, /* i : max number of subands */ + const int16_t max_k /* i : max number of subframe */ +); + +void ivas_masa_prerender( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + float *output[], /* i/o: synthesized core-coder transport channels */ + const int16_t output_frame, /* i : output frame length per channel */ + const int16_t nchan_remapped /* i : number of transports used in core */ +); + +void ivas_spar_param_to_masa_param_mapping( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */ + float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, real */ + float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, imag */ + const int16_t subframe /* i : Subframe to map */ +); + + +/*---------------------------------------------------------------------------------* + * Binaural FastConv Renderer Prototypes +*-----------------------------------------------------------------------------------*/ + +ivas_error ivas_binRenderer_open( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +); + +void ivas_binRenderer_close( + BINAURAL_RENDERER_HANDLE *hBinRenderer /* i/o: decoder binaural renderer handle */ +); + +void ivas_binaural_hrtf_close( + HRTFS_FASTCONV_HANDLE *hHrtfFastConv /* i/o: decoder binaural hrtf handle */ +); + +void ivas_init_binaural_hrtf( + HRTFS_FASTCONV *HrtfFastConv /* i/o: FASTCONV HRTF structure */ +); + +ivas_error ivas_allocate_binaural_hrtf( + HRTFS_FASTCONV *HrtfFastConv, /* i/o: FASTCONV HRTF structure */ + const AUDIO_CONFIG input_config, /* i : input audio configuration */ + const BINAURAL_INPUT_AUDIO_CONFIG bin_input_config, /* i : binaural input audio config */ + const RENDERER_TYPE renderer_type, /* i : renderer type */ + const int16_t allocate_init_flag /* i : Memory allocation flag */ +); + + +void ivas_binRenderer( + BINAURAL_RENDERER_HANDLE hBinRenderer, /* i/o: binaural renderer handle */ + COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i : combined head and external orientation handle */ + int16_t subframe_idx, /* i : subframe index */ + const int16_t numTimeSlots, /* i : number of time slots to process */ + float Cldfb_RealBuffer_Binaural[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : Binaural signals */ + float Cldfb_ImagBuffer_Binaural[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : Binaural signals */ + float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : LS signals */ + float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX] /* i : LS signals */ +); + +void ivas_binaural_add_LFE( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + int16_t output_frame, /* i : length of input frame */ + float *input_f[], /* i : transport channels */ + float *output_f[] /* o : synthesized core-coder transport channels/DirAC output */ +); + + +/*----------------------------------------------------------------------------------* + * renderer prototypes + *----------------------------------------------------------------------------------*/ + +ivas_error ivas_ism_renderer_open( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +); + +void ivas_ism_renderer_close( + ISM_RENDERER_HANDLE *hIsmRendererData /* i/o: ISM renderer handle */ +); + +void ivas_ism_render( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float *output_f[], /* i/o: core-coder transport channels/object output */ + const int16_t output_frame /* i : output frame length per channel */ +); + +void ivas_ism_render_sf( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float *output_f[], /* i/o: core-coder transport channels/object output */ + const int16_t n_samples_to_render /* i : output frame length per channel */ +); + +void ivas_ism_get_stereo_gains( + const float azimuth, /* i : object azimuth */ + const float elevation, /* i : object elevation */ + float *left_gain, /* o : left channel gain */ + float *right_gain /* o : right channel gain */ +); + +void ivas_mc2sba( + IVAS_OUTPUT_SETUP hIntSetup, /* i : Format of decoder output */ + float *in_buffer_td[], /* i : MC signals (on input) and the HOA3 (on output) */ + float *buffer_td[], /* o : MC signals (on input) and the HOA3 (on output) */ + const int16_t output_frame, /* i : output frame length per channel */ + const int16_t sba_order, /* i : SBA order */ + const float gain_lfe /* i : gain for LFE, 0=ignore LFE */ +); + +void ivas_param_mc_mc2sba_cldfb( + IVAS_OUTPUT_SETUP hTransSetup, /* i : transported MC Format */ + float *hoa_encoder, /* i : HOA3 encoder for the transported MC format */ + const int16_t slot_idx, /* i : current slot in the subframe */ + float Cldfb_RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o: Contains the MC signals (on input) and the HOA3 (on output) */ + float Cldfb_ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o: Contains the MC signals (on input) and the HOA3 (on output) */ + const int16_t nBands, /* i : number of synth CLDFB bands */ + const float gain_lfe /* i : gain applied to LFE */ +); + +void ivas_ism2sba( + float *buffer_td[], /* i/o: TD signal buffers */ + ISM_RENDERER_HANDLE hIsmRendererData, /* i/o: renderer data */ + const ISM_METADATA_HANDLE hIsmMetaData[], /* i : object metadata */ + const int16_t nchan_ism, /* i : number of objects */ + const int16_t output_frame, /* i : output frame length per channel */ + const int16_t sba_order /* i : SBA order */ +); + +void ivas_ism2sba_sf( + float *buffer_in[], /* i : TC buffer */ + float *buffer_out[], /* o : TD signal buffers */ + ISM_RENDERER_HANDLE hIsmRendererData, /* i/o: renderer data */ + const int16_t num_objects, /* i : number of objects */ + const int16_t n_samples_to_render, /* i : output frame length per channel */ + const int16_t offset, /* i : offset for the interpolatr */ + const int16_t sba_order /* i : Ambisonic (SBA) order */ +); + + +/*----------------------------------------------------------------------------------* + * Amplitude Panning VBAP prototypes + *----------------------------------------------------------------------------------*/ + +void panning_wrap_angles( + const float azi_deg, /* i : azimuth in degrees for panning direction (positive left) */ + const float ele_deg, /* i : elevation in degrees for panning direction (positive up) */ + float *azi_wrapped, /* o : wrapped azimuth component */ + float *ele_wrapped /* o : wrapped elevation component */ +); + +ivas_error vbap_init_data( + VBAP_HANDLE *hVBAPdata, /* i/o: handle for VBAP data structure that will be initialized */ + const float *speaker_node_azi_deg, /* i : vector of speaker node azimuths (positive left) */ + const float *speaker_node_ele_deg, /* i : vector of speaker node elevations (positive up) */ + const int16_t num_speaker_nodes, /* i : number of speaker nodes in the set */ + const IVAS_FORMAT ivas_format /* i : IVAS format */ +); + +void vbap_free_data( + VBAP_HANDLE *hVBAPdata /* i/o: VBAP handle to be freed */ +); + +void vbap_determine_gains( + const VBAP_HANDLE hVBAPdata, /* i : VBAP structure */ + float *gains, /* o : gain vector for speaker nodes for given direction */ + const int16_t azi_deg, /* i : azimuth in degrees for panning direction (positive left) */ + const int16_t ele_deg, /* i : elevation in degrees for panning direction (positive up) */ + const int16_t use_object_mode /* i : select between object mode panning and spatial mode panning */ +); + +void v_sort_ind( + float *x, /* i/o: Vector to be sorted */ + int16_t *idx, /* o : Original index positions */ + const int16_t len /* i : vector length */ +); + +/*----------------------------------------------------------------------------------* + * LS Renderer prototypes + *----------------------------------------------------------------------------------*/ + +ivas_error ivas_ls_setup_conversion_open( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +); + +void ivas_ls_setup_conversion_close( + LSSETUP_CONVERSION_HANDLE *hLsSetUpConversion /* i/o: LS converter handle */ +); + + +void ivas_ls_setup_conversion( + Decoder_Struct *st_ivas, /* i : IVAS decoder structure */ + const int16_t input_chans, /* i : number of input channels to the renderer */ + const int16_t output_frame, /* i : frame length */ + float *input[], /* i : LS input/output synthesis signal */ + float *output[] /* i/o: LS input/output synthesis signal */ +); + +void ivas_ls_setup_conversion_process_mdct( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float *output[] /* i/o: output synthesis signal */ +); + +void ivas_ls_setup_conversion_process_mdct_param_mc( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float *x[][NB_DIV] /* i/o: output synthesis signal */ +); + +void ivas_lssetupconversion_process_param_mc( + Decoder_Struct *st_ivas, /* i/o: LS setup conversion renderer handle */ + const int16_t num_timeslots, /* i : number of time slots to process */ + float Cldfb_RealBuffer_InOut[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i/o: LS signals */ + float Cldfb_ImagBuffer_InOut[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i/o: LS signals */ + int16_t channel_active[MAX_CICP_CHANNELS] /* i : bitmap indicating which output channels are active */ +); + + +/*----------------------------------------------------------------------------------* + * Custom loudspeaker setup prototypes + *----------------------------------------------------------------------------------*/ + +ivas_error ivas_ls_custom_open( + LSSETUP_CUSTOM_HANDLE *hLsSetupCustom /* o : Custom loudspeaker setup handle */ +); + +ivas_error ivas_ls_custom_output_init( + Decoder_Struct *st_ivas /* i/o: IVAS decoder handle */ +); + +void ivas_ls_custom_setup( + IVAS_OUTPUT_SETUP_HANDLE hOutSetup, /* o : IVAS output setup handle */ + const LSSETUP_CUSTOM_STRUCT *hLsSetupCustom /* i : Custom loudspeaker setup handle */ +); + + +/*----------------------------------------------------------------------------------* + * McMASA prototypes + *----------------------------------------------------------------------------------*/ + +ivas_error ivas_mcmasa_enc_open( + Encoder_Struct *st_ivas /* i/o: IVAS encoder handle */ +); + +void ivas_mcmasa_enc_close( + MCMASA_ENC_HANDLE *hMcMasa, /* i/o: encoder McMASA handle */ + const int32_t input_Fs /* i : input sampling rate */ +); + +ivas_error ivas_mcmasa_enc_reconfig( + Encoder_Struct *st_ivas /* i/o: IVAS encoder handle */ +); + +ivas_error ivas_mcmasa_dec_reconfig( + Decoder_Struct *st_ivas /* i/o: IVAS decoder handle */ +); + +void ivas_mcmasa_setNumTransportChannels( + int16_t* nchan_transport, /* o : Pointer to number of transport channels to be set */ + int16_t* element_mode, /* o : Pointer to element mode to be set */ + const int32_t ivas_total_brate /* i : Total bitrate of IVAS */ +); + +void ivas_mcmasa_set_separate_channel_mode( + uint8_t *separateChannelEnabled, /* o : Pointer to separate channel toggle */ + int16_t *separateChannelIndex, /* o : Pointer to separate channel index */ + const int32_t ivas_total_brate /* i : Total bitrate of IVAS */ +); + +void ivas_mcmasa_split_brate( + const uint8_t separateChannelEnabled, /* i : Transport running in "separate channel" mode */ + const int32_t ivas_total_brate, /* i : Total bitrate available to be split */ + const int16_t nSCE, /* i : Number of SCEs in use (0 or 1) */ + const int16_t nCPE, /* i : Number of CPEs in use (0 or 1) */ + int32_t *brate_sce, /* o : Pointer to SCE element bitrate */ + int32_t *brate_cpe /* o : Pointer to CPE element bitrate */ +); + +void ivas_mcmasa_enc( + MCMASA_ENC_HANDLE hMcMasa, /* i/o: Encoder McMASA handle */ + IVAS_QMETADATA_HANDLE hQMeta, /* o : Qmetadata handle */ + MASA_ENCODER_HANDLE hMasa, /* i/o: Encoder MASA handle */ + float *data_f[], /* i : Input frame of audio */ + const int16_t input_frame, /* i : Input frame size */ + const int16_t nchan_transport, /* i : Number of transport channels */ + const int16_t nchan_inp /* i : Number of input channels */ +); + +void ivas_mcmasa_param_est_enc( + MCMASA_ENC_HANDLE hMcMasa, /* i/o: Encoder McMASA handle */ + MASA_ENCODER_HANDLE hMasa, /* i/o: Encoder MASA handle */ + float *data_f[], /* i : Input frame of audio */ + float elevation_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* o : Estimated elevation */ + float azimuth_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* o : Estimated azimuth */ + float energyRatio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* o : Estimated direct-to-total ratio*/ + float spreadCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* o : Estimated spread coherence */ + float surroundingCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* o : Estimated surround coherence */ + const int16_t input_frame, /* i : Input frame size */ + const int16_t nchan_inp /* i : Number of input channels */ +); + +void ivas_mcmasa_dmx_modify( + const int16_t n_samples, /* i : input frame length in samples */ + float dmx[][L_FRAME48k + NS2SA( 48000, IVAS_FB_ENC_DELAY_NS )], /* i/o: downmix signal to be transformed into another format */ + const int16_t n_chnls_dmx_old, /* i : number of downmix channels in the old format */ + const int16_t n_chnls_dmx_new /* i : number of downmix channels in the target format */ +); + +void v_multc_acc( + const float x[], /* i : Input vector */ + const float c, /* i : Constant */ + float y[], /* o : Output vector that contains y + c*x */ + const int16_t N /* i : Vector length */ +); + +void lls_interp_n( + float x[], /* i/o: input/output vector */ + const int16_t N, /* i : length of the input vector */ + float *a, /* o : calculated slope */ + float *b, /* o : calculated offset */ + const int16_t upd /* i : use 1 to update x[] with the interpolated output*/ +); + +void computeReferencePower_enc( + const int16_t *band_grouping, /* i : Band grouping for estimation */ + float Cldfb_RealBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], /* i : Real part of input signal */ + float Cldfb_ImagBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], /* i : Imag part of input signal */ + float *reference_power, /* o : Estimated power */ + const int16_t enc_param_start_band, /* i : first band to process */ + const int16_t num_freq_bands, /* i : Number of frequency bands */ + const IVAS_FORMAT ivas_format, /* i : ivas_format */ + int16_t ref_power_w, /* i : use 0 if hodirac is enabled */ + const int16_t nchan_ana, /* i : number of analysis channels */ + int16_t *mono_frame_count, + int16_t *dirac_mono_flag +); + +ivas_error ivas_mono_dmx_renderer_open( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +); + + +void ivas_mono_dmx_renderer_close( + MONO_DOWNMIX_RENDERER_HANDLE *hMonoDmxRenderer /* i/ i/o: Mono downmix structure */ +); + +void ivas_mono_downmix_render_passive( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float *output_f[], /* i/o: synthesized core-coder transport channels/mono output */ + const int16_t output_frame /* i : output frame length */ +); + +void ivas_mono_stereo_downmix_mcmasa( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float *output_f[], /* i/o: synthesized core-coder transport channels/mono or stereo output */ + int16_t output_frame /* i : output frame length per channel */ +); + +void ivas_lfe_synth_with_filters( + MCMASA_LFE_SYNTH_DATA_HANDLE hMasaLfeSynth, /* i/o: LFE synthesis structure for McMASA */ + float *data_f[], /* o : output signals */ + const int16_t output_frame, /* i : output frame length per channel */ + const int16_t separateChannelIndex, /* i : separate channel index */ + const int16_t lfeChannelIndex /* i : LFE channel index */ +); + + +/*----------------------------------------------------------------------------------* + * LFE encoder low pass filter prototypes + *----------------------------------------------------------------------------------*/ + +ivas_error ivas_create_lfe_lpf_enc( + ivas_filters_process_state_t **hLfeLpf, /* o : LFE LPF handle */ + const int32_t input_Fs /* i : input sampling rate */ +); + +void ivas_lfe_lpf_enc_close( + ivas_filters_process_state_t **hLfeLpf /* i/o: LFE LPF handle */ +); + +void ivas_lfe_lpf_enc_apply( + ivas_filters_process_state_t *hLfeLpf, /* i/o: LFE LPF handle */ + float data_lfe_ch[], /* i/o: LFE signal */ + const int16_t input_frame /* i : input frame length per channel */ +); + + +/*----------------------------------------------------------------------------------* + * LFE Coding prototypes + *----------------------------------------------------------------------------------*/ + +ivas_error ivas_create_lfe_enc( + LFE_ENC_HANDLE *hLFE, /* o : IVAS LFE encoder structure */ + const int32_t input_Fs /* i : input sampling rate */ +); + +void ivas_lfe_enc_close( + LFE_ENC_HANDLE *hLFE /* i/o: LFE encoder handle */ +); + +void ivas_lfe_enc( + LFE_ENC_HANDLE hLFE, /* i/o: LFE encoder handle */ + float data_lfe_ch[], /* i : input LFE signal */ + const int16_t input_frame, /* i : input frame length per channel */ + BSTR_ENC_HANDLE hBstr /* i/o: bitstream handle */ +); + +ivas_error ivas_create_lfe_dec( + LFE_DEC_HANDLE *hLFE_out, /* o : IVAS LFE decoder structure */ + const int32_t output_Fs, /* i : output sampling rate */ + const int32_t binauralization_delay_ns /* i : additional LFE delay to sync with binaural renderer */ +); + +void ivas_lfe_dec_close( + LFE_DEC_HANDLE *hLFE /* i/o: LFE encoder handle */ +); + +void ivas_lfe_dec( + LFE_DEC_HANDLE hLFE, /* i/o: LFE decoder handle */ + Decoder_State *st0, /* i/o: decoder state structure - for bitstream handling*/ + const int16_t output_frame, /* i : output frame length per channel */ + const int16_t bfi, /* i : BFI flag */ + float output_lfe_ch[] /* o : output LFE synthesis */ +); + +void ivas_lfe_tdplc( + LFE_DEC_HANDLE hLFE, /* i/o: LFE decoder handle */ + const float *prevsynth, /* i : previous frame synthesis */ + float *ytda, /* o : output time-domain buffer */ + const int16_t output_frame /* i : output frame length */ +); + +void ivas_lfe_window_init( + LFE_WINDOW_HANDLE hLFEWindow, /* i/o: LFE window handle */ + const int32_t sampling_rate, /* i : sampling rate */ + const int16_t frame_len /* i : frame length in samples */ +); + +void ivas_lfe_lpf_select_filt_coeff( + const int32_t sampling_rate, /* i : sampling rate */ + const int16_t order, /* i : filter order */ + const float **ppFilt_coeff /* o : filter coefficients */ +); + +void ivas_filters_init( + ivas_filters_process_state_t *filter_state, /* i/o: filter state handle */ + const float *filt_coeff, /* i : filter coefficients */ + const int16_t order /* i : filter order */ +); + +void ivas_filter_process( + ivas_filters_process_state_t *filter_state, /* i/o: filter state handle */ + float *pIn_Out, /* i : signal subject to filtering */ + const int16_t length /* i : filter order */ +); + + +/*----------------------------------------------------------------------------------* + * OSBA prototypes + *----------------------------------------------------------------------------------*/ + +ivas_error ivas_osba_enc_open( + Encoder_Struct *st_ivas /* i/o: IVAS encoder handle */ +); + +void ivas_osba_enc_close( + OSBA_ENC_HANDLE *hOSba /* i/o: encoder OSBA handle */ +); + +ivas_error ivas_osba_enc_reconfig( + Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ +); + +void ivas_osba_enc( + OSBA_ENC_HANDLE hOSba, /* i/o: OSBA encoder handle */ + ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handle */ + float *data_in_f[], /* i/o: Input / transport audio signals */ + const int16_t input_frame, /* i : Input frame size */ + const int16_t nchan_ism, /* i : Number of objects for parameter analysis*/ + const ISM_MODE ism_mode, /* i : ISM mode */ + const int16_t sba_analysis_order, /* i : SBA order evaluated in SBA encoder */ + const int32_t input_Fs, /* i : input sampling rate */ + const int16_t sba_planar /* i : planar SBA flag */ +); + +ivas_error ivas_osba_data_open( + Decoder_Struct *st_ivas /* i/o: IVAS decoder handle */ +); + +ivas_error ivas_osba_dirac_td_binaural_jbm( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */ + uint16_t *nSamplesRendered, /* o : number of CLDFB slots rendered */ + uint16_t *nSamplesAvailable, /* o : number of CLDFB slots still to render */ + float *output_f[] /* o : rendered time signal */ +); + +ivas_error ivas_osba_dirac_td_binaural( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float *output[], /* o : output synthesis signal */ + const int16_t output_frame /* i : output frame length per channel */ +); + +ivas_error ivas_osba_ism_metadata_dec( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const int32_t ism_total_brate, /* i : ISM total bitrate */ + int16_t *nchan_ism, /* o : number of ISM separated channels */ + int16_t nb_bits_metadata[] /* o : number of ISM metadata bits */ +); + +ivas_error ivas_osba_render( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float *output_f[], /* i/o: core-coder transport channels/object output */ + const int16_t output_frame /* i : output frame length per channel */ +); + +void ivas_osba_data_close( + SBA_ISM_DATA_HANDLE *hSbaIsmData /* i/o: OSBA rendering handle */ +); + + +/*----------------------------------------------------------------------------------* +* OMASA prototypes +*---------------------------------------------------------------------------------*/ + +ivas_error ivas_omasa_enc_open( + Encoder_Struct *st_ivas /* i/o: IVAS encoder handle */ +); + +void ivas_omasa_enc_close( + OMASA_ENC_HANDLE *hOMasa /* i/o: encoder OMASA handle */ +); + +ivas_error ivas_omasa_enc_config( + Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ +); + +ivas_error ivas_omasa_dec_config( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + uint16_t *nSamplesRendered, /* o : number of samples flushed from the previous frame (JBM) */ + int16_t *data /* o : output synthesis signal */ +); + +void ivas_omasa_set_config( + OMASA_ENC_HANDLE hOMasa, /* i/o: OMASA encoder handle */ + MASA_ENCODER_HANDLE hMasa, /* i : MASA encoder handle */ + const int32_t input_Fs, /* i : Input sample rate */ + const ISM_MODE ism_mode /* i : ISM mode */ +); + +void ivas_omasa_enc( + OMASA_ENC_HANDLE hOMasa, /* i/o: OMASA encoder handle */ + MASA_ENCODER_HANDLE hMasa, /* i/o: MASA encoder handle */ + ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handle */ + float *data_in_f[], /* i/o: Input / transport audio signals */ + const int16_t input_frame, /* i : Input frame size */ + const int16_t nchan_transport, /* i : Number of transport channels */ + const int16_t nchan_ism, /* i : Number of objects for parameter analysis*/ + const ISM_MODE ism_mode, /* i : ISM mode */ + float *data_separated_object, /* o : Separated object audio signal */ + int16_t* idx_separated_object /* o : Index of the separated object */ +); + +void ivas_set_surplus_brate_enc( + Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ +); + +void ivas_set_surplus_brate_dec( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + int32_t *ism_total_brate /* i : ISM total bitrate */ +); + +void ivas_set_ism_importance_interformat( + const int32_t ism_total_brate, /* i/o: ISms total bitrate */ + const int16_t nchan_transport, /* i : number of transported channels */ + ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ + SCE_ENC_HANDLE hSCE[], /* i/o: SCE encoder handles */ + const float lp_noise_CPE, /* i : LP filtered total noise estimation */ + int16_t ism_imp[] /* o : ISM importance flags */ +); + +/*! r: flag for using less bitrate for objects in OMASA */ +int16_t ivas_omasa_ener_brate( + const int16_t nchan_ism, /* i : number of ISMs */ + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + float *data_f[], /* i : Input / transport audio signals */ + const int16_t input_frame /* i : Input frame size */ +); + +/*! r: adjusted bitrate */ +int32_t ivas_interformat_brate( + const ISM_MODE ism_mode, /* i : ISM mode */ + const int16_t nchan_ism, /* i : number of ISM channels */ + const int32_t element_brate, /* i : element bitrate */ + const int16_t ism_imp, /* i : ISM importance flag */ + const int16_t limit_flag /* i : flag to limit the bitrate increase */ +); + +void ivas_combined_format_brate_sanity( + const int32_t element_brate, /* i : element bitrate */ + const int16_t core, /* i : core */ + const int32_t total_brate, /* i : total bitrate */ + int32_t *core_brate, /* i/o: core bitrate */ + int16_t *inactive_coder_type_flag, /* o : inactive coder_type flag */ + int16_t *diff_nBits /* o : number of differential bits */ +); + +ISM_MODE ivas_omasa_ism_mode_select( + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + const int16_t nchan_ism /* i : number of input ISM's */ +); + +void ivas_set_omasa_TC( + const ISM_MODE ism_mode, /* i : ISM mode */ + const int16_t nchan_ism, /* i : number of input ISMs */ + int16_t *nSCE, /* o : number of SCEs */ + int16_t *nCPE /* o : number of CPEs */ +); + +void ivas_merge_masa_transports( + float data_in_f1[][L_FRAME48k], /* i : Transport audio signals 1 */ + float *data_in_f2[], /* i : Transport audio signals 2 */ + float *data_out_f[], /* o : Merged transport audio signals */ + const int16_t input_frame, /* i : Input frame size */ + const int16_t num_transport_channels /* i : Number of transport audio signals */ +); + +ivas_error ivas_omasa_data_open( + Decoder_Struct *st_ivas /* i/o: IVAS decoder handle */ +); + +void ivas_omasa_data_close( + MASA_ISM_DATA_HANDLE *hMasaIsmData /* i/o: MASA_ISM rendering handle */ +); + +ivas_error ivas_omasa_ism_metadata_dec( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const int32_t ism_total_brate, /* i : ISM total bitrate */ + int16_t *nchan_ism, /* o : number of ISM separated channels */ + int16_t *nchan_transport_ism, /* o : number of ISM TCs */ + const int16_t dirac_bs_md_write_idx, /* i : DirAC bitstream write index */ + int16_t nb_bits_metadata[] /* o : number of ISM metadata bits */ +); + +ivas_error ivas_omasa_dirac_td_binaural( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float *output[], /* o : output synthesis signal */ + const int16_t output_frame /* i : output frame length per channel */ +); + +ivas_error ivas_omasa_dirac_td_binaural_jbm( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const uint16_t nSamplesAsked, /* i : number of samples requested */ + uint16_t *nSamplesRendered, /* o : number of samples rendered */ + uint16_t *nSamplesAvailable, /* o : number of samples still to render */ + const int16_t nchan_transport, /* i : number of transport channels */ + float *output_f[] /* o : rendered time signal */ +); + +void ivas_omasa_dirac_rend( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float *output[], /* o : output synthesis signal */ + const int16_t output_frame /* i : output frame length per channel */ +); + +void ivas_omasa_rearrange_channels( + float *output[], /* o : output synthesis signal */ + const int16_t nchan_transport_ism, /* i : number of ISM TCs */ + const int16_t output_frame /* i : output frame length per channel */ +); + +void ivas_omasa_dirac_rend_jbm( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const uint16_t nSamplesAsked, /* i : number of samples requested */ + uint16_t *nSamplesRendered, /* o : number of samples rendered */ + uint16_t *nSamplesAvailable, /* o : number of samples still to render */ + const int16_t nchan_transport, /* i : number of transport channels */ + float *output_f[] /* o : rendered time signal */ +); + +void ivas_omasa_preProcessStereoTransportsForMovedObjects( + Decoder_Struct *st_ivas, + float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + const int16_t nBins, + const int16_t subframe +); + +ivas_error ivas_omasa_separate_object_renderer_open( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +); + +void ivas_omasa_separate_object_renderer_close( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +); + +void ivas_omasa_separate_object_render( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float input_f[][L_FRAME48k], /* i : separated object signal */ + float *output_f[], /* i/o: output signals */ + const int16_t output_frame /* i : output frame length per channel */ +); + +void ivas_omasa_separate_object_render_jbm( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const uint16_t nSamplesRendered, /* i : number of samples rendered */ + float *output_f[], /* o : rendered time signal */ + const int16_t subframes_rendered, /* i : number of subframes rendered */ + const int16_t slots_rendered /* i : number of CLDFB slots rendered */ +); + +void ivas_omasa_encode_masa_to_total( + float masa_to_total_ratio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], + BSTR_ENC_HANDLE hMetaData, + const int16_t low_bitrate_mode, + const int16_t nbands, + const int16_t nblocks +); + +void ivas_omasa_decode_masa_to_total( + uint16_t *bit_stream, + int16_t *index, + float masa_to_total_energy_ratio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], + const int16_t nbands, + const int16_t nblocks +); + +void ivas_omasa_modify_masa_energy_ratios( + IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ + float masa_to_total_energy_ratio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_MAXIMUM_CODING_SUBBANDS] +); + + +/*----------------------------------------------------------------------------------* + * TD Binaural Object renderer + *----------------------------------------------------------------------------------*/ + +ivas_error ivas_td_binaural_open( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +); + +ivas_error ivas_td_binaural_renderer( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float *output[], /* i/o: SCE channels / Binaural synthesis */ + const int16_t output_frame /* i : output frame length */ +); + +ivas_error ivas_td_binaural_renderer_sf( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float *output[], /* i/o: SCE channels / Binaural synthesis */ + const int16_t n_samples_granularity /* i : granularity of the renderer/buffer */ +); + +/*----------------------------------------------------------------------------------* + * Filter-bank (FB) Mixer + *----------------------------------------------------------------------------------*/ + +ivas_error ivas_fb_set_cfg( + IVAS_FB_CFG **pFb_cfg_out, /* o : FB config. handle */ + const int16_t ivas_format, /* i : IVAS format */ + const int16_t num_in_chans, /* i : number of FB input channels */ + const int16_t num_out_chans, /* i : number of FB output channels */ + const int16_t active_w_mixing, /* i : active_w_mixing flag */ + const int32_t sampling_Fs, /* i : sampling rate */ + const int16_t nachan_dirac_ana /* i : number of DirAR analysis channels */ +); + +ivas_error ivas_FB_mixer_open( + IVAS_FB_MIXER_HANDLE *hFbMixer, /* i/o: FB mixer handle */ + const int32_t sampling_rate, /* i : sampling rate */ + IVAS_FB_CFG *fb_cfg, /* i : FB config. handle */ + const int16_t spar_reconfig_flag /* i : SPAR reconfiguration flag */ +); + +void ivas_FB_mixer_close( + IVAS_FB_MIXER_HANDLE *hFbMixer, /* i/o: FB mixer handle */ + const int32_t sampling_rate, /* i : sampling rate in Hz */ + const int16_t spar_reconfig_flag /* i : SPAR reconfiguration flag */ +); + +void ivas_fb_mixer_pcm_ingest( + IVAS_FB_MIXER_HANDLE hFbMixer, /* i/o: FB mixer handle */ + float *pcm_in[], /* i : input audio channels */ + float **ppOut_pcm, /* o : output audio channels */ + const int16_t frame_length, /* i : frame length */ + const int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] +); + +void ivas_fb_mixer_update_prior_input( + IVAS_FB_MIXER_HANDLE hFbMixer, /* i/o: FB mixer handle */ + float *pcm_in[], /* i : input audio channels */ + const int16_t length, /* i : length of time slot */ + const int16_t nchan_fb_in /* i : number of analysis channels */ +); + +void ivas_fb_mixer_get_windowed_fr( + IVAS_FB_MIXER_HANDLE hFbMixer, /* i/o: FB mixer handle */ + float *pcm_in[], /* i : input audio channels */ + float *frame_f_real[], /* o : real freq domain values */ + float *frame_f_imag[], /* o : imag freq domain values */ + const int16_t length, /* i : number of new samples in time slot */ + const int16_t mdft_len, /* i : MDFT frame length */ + const int16_t nchan_fb_in /* i : number of analysis channels */ +); + +void ivas_fb_mixer_process( + IVAS_FB_MIXER_HANDLE hFbMixer, /* i/o: FB mixer handle */ + float ***mixer_mat, /* i : mixer matrix */ + float **ppOut_pcm, /* o : output audio channels */ + const int16_t frame_len, /* i : frame length in samples */ + int16_t in_out_mixer_map[IVAS_MAX_FB_MIXER_OUT_CH][IVAS_MAX_SPAR_FB_MIXER_IN_CH] /* i/o: mixing mapping */ +); + +void ivas_fb_mixer_get_in_out_mapping( + const IVAS_FB_CFG *fb_cfg, /* i : FB config. handle */ + int16_t in_out_mixer_map[IVAS_MAX_FB_MIXER_OUT_CH][IVAS_MAX_SPAR_FB_MIXER_IN_CH] /* i/o: mixing mapping */ +); + +void ivas_fb_mixer_cross_fading( + IVAS_FB_MIXER_HANDLE hFbMixer, + float **ppOut_pcm, + float *pMdft_out_old, + float *pMdft_out_new, + const int16_t ch, + const int16_t frame_len, + const int16_t cf_offset +); + +/*! r: number of spectral bands */ +int16_t ivas_get_num_bands_from_bw_idx( + const int16_t bwidth /* i : audio bandwidth */ +); + + +/* clang-format on */ + +#endif /* IVAS_PROT_H */ diff --git a/lib_com/ivas_qmetadata_com.c b/lib_com/ivas_qmetadata_com.c new file mode 100644 index 0000000000000000000000000000000000000000..57adf7c6aae2048cad144afefbaffe5e418b4cb8 --- /dev/null +++ b/lib_com/ivas_qmetadata_com.c @@ -0,0 +1,666 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include +#include "options.h" +#include "ivas_cnst.h" +#include "ivas_rom_com.h" +#include "ivas_prot.h" +#include "prot.h" +#include "cnst.h" +#include "wmc_auto.h" + +/*-----------------------------------------------------------------------* + * Local constants + *-----------------------------------------------------------------------*/ + +#define MASA_DIR_RATIO_COMP_MAX_IDX_STEPS 2 + +/*-----------------------------------------------------------------------* + * Local function prototypes + *-----------------------------------------------------------------------*/ + +static void ivas_qmetadata_free_memory( IVAS_QMETADATA_HANDLE hQMetaData ); + + +/*-----------------------------------------------------------------------* + * ivas_qmetadata_open() + * + * Allocate Q Metadata handle + *-----------------------------------------------------------------------*/ + +ivas_error ivas_qmetadata_open( + IVAS_QMETADATA_HANDLE *hQMetaData /* i/o: q_metadata handle */ +) +{ + /* allocate MetaData handle */ + if ( ( *hQMetaData = (IVAS_QMETADATA_HANDLE) malloc( sizeof( IVAS_QMETADATA ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for Q MetaData" ); + } + + ( *hQMetaData )->q_direction = NULL; + ( *hQMetaData )->surcoh_band_data = NULL; + ( *hQMetaData )->bandMap = NULL; + + return IVAS_ERR_OK; +} + + +/*-----------------------------------------------------------------------* + * ivas_qmetadata_allocate_memory() + * + * Allocates dynamic memory for qmetadata. Also reallocates automatically + * if relevant parameters have changed. To function properly, this function + * assumes that qmetadata contains parameter values for nbands, ndirs and + * coherence_flag corresponding to the currently reserved memory. This function + * then compares them to provided new values given in call and allocates or + * reallocates as necessary. The parameter values in qmetadata are updated + * accordingly. In addition, parameters inside qdirection config are + * set here to their default values out of practicality. + *-----------------------------------------------------------------------*/ + +ivas_error ivas_qmetadata_allocate_memory( + IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ + const int16_t nbands, /* i : new number of frequency bands */ + const int16_t ndirs, /* i : new number of directions */ + const int16_t coherence_flag /* i : new coherence coding status */ +) +{ + int16_t j, dir; + uint8_t do_realloc; + + + /* Check if we need to reallocate memory or do we need to do the first time allocation. */ + if ( hQMetaData->q_direction != NULL ) + { + do_realloc = nbands != hQMetaData->q_direction->cfg.nbands; + do_realloc |= ndirs != hQMetaData->no_directions; + do_realloc |= coherence_flag != hQMetaData->coherence_flag; + } + else + { + do_realloc = TRUE; + } + + if ( do_realloc ) + { + ivas_qmetadata_free_memory( hQMetaData ); + + hQMetaData->numCodingBands = (uint8_t) nbands; + hQMetaData->no_directions = ndirs; + hQMetaData->coherence_flag = coherence_flag; + + if ( ( hQMetaData->q_direction = (IVAS_QDIRECTION *) malloc( sizeof( IVAS_QDIRECTION ) * ndirs ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for Q MetaData" ); + } + + for ( dir = 0; dir < hQMetaData->no_directions; dir++ ) + { + hQMetaData->q_direction[dir].cfg.nbands = nbands; + if ( nbands == 0 ) + { + hQMetaData->q_direction[dir].band_data = NULL; + } + else + { + if ( ( hQMetaData->q_direction[dir].band_data = (IVAS_QDIRECTION_BAND_DATA *) malloc( sizeof( IVAS_QDIRECTION_BAND_DATA ) * hQMetaData->q_direction[dir].cfg.nbands ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for Q MetaData" ); + } + + for ( j = 0; j < nbands; j++ ) + { + set_zero( hQMetaData->q_direction[dir].band_data[j].elevation, MAX_PARAM_SPATIAL_SUBFRAMES ); + set_zero( hQMetaData->q_direction[dir].band_data[j].azimuth, MAX_PARAM_SPATIAL_SUBFRAMES ); + set_zero( hQMetaData->q_direction[dir].band_data[j].energy_ratio, MAX_PARAM_SPATIAL_SUBFRAMES ); + } + } + + if ( coherence_flag ) + { + hQMetaData->q_direction[dir].coherence_band_data = (IVAS_QDIRECTION_BAND_COHERENCE_DATA *) malloc( sizeof( IVAS_QDIRECTION_BAND_COHERENCE_DATA ) * hQMetaData->q_direction[dir].cfg.nbands ); + } + else + { + hQMetaData->q_direction[dir].coherence_band_data = NULL; + } + + /* These default values are set here to get them conveniently in one place */ + hQMetaData->q_direction[dir].cfg.nblocks = MAX_PARAM_SPATIAL_SUBFRAMES; + hQMetaData->q_direction[dir].cfg.search_effort = 3; + hQMetaData->q_direction[dir].cfg.start_band = 0; + hQMetaData->q_direction[dir].cfg.mc_ls_setup = MC_LS_SETUP_INVALID; + } + + if ( coherence_flag ) + { + if ( ( hQMetaData->surcoh_band_data = (IVAS_SURROUND_COHERENCE_BAND_DATA *) malloc( sizeof( IVAS_SURROUND_COHERENCE_BAND_DATA ) * hQMetaData->q_direction[0].cfg.nbands ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for Q MetaData" ); + } + } + else + { + hQMetaData->surcoh_band_data = NULL; + } + } + + + return IVAS_ERR_OK; +} + + +/*-----------------------------------------------------------------------* + * ivas_qmetadata_free_memory() + * + * free dynamic part of Q Metadata memory + *-----------------------------------------------------------------------*/ + +static void ivas_qmetadata_free_memory( + IVAS_QMETADATA_HANDLE hQMetaData /* i/o: q_metadata handle */ +) +{ + int16_t dir; + + if ( hQMetaData == NULL ) + { + return; + } + + if ( hQMetaData->q_direction != NULL ) + { + for ( dir = 0; dir < hQMetaData->no_directions; dir++ ) + { + if ( hQMetaData->q_direction[dir].band_data != NULL ) + { + free( hQMetaData->q_direction[dir].band_data ); + hQMetaData->q_direction[dir].band_data = NULL; + } + if ( hQMetaData->q_direction[dir].coherence_band_data != NULL ) + { + free( hQMetaData->q_direction[dir].coherence_band_data ); + hQMetaData->q_direction[dir].coherence_band_data = NULL; + } + } + + free( hQMetaData->q_direction ); + hQMetaData->q_direction = NULL; + } + + if ( hQMetaData->surcoh_band_data != NULL ) + { + free( hQMetaData->surcoh_band_data ); + hQMetaData->surcoh_band_data = NULL; + } + + return; +} + + +/*-----------------------------------------------------------------------* + * ivas_qmetadata_close() + * + * close Q Metadata + *-----------------------------------------------------------------------*/ + +void ivas_qmetadata_close( + IVAS_QMETADATA_HANDLE *hQMetaData /* i/o: q_metadata handle */ +) +{ + if ( hQMetaData == NULL || *hQMetaData == NULL ) + { + return; + } + + ivas_qmetadata_free_memory( *hQMetaData ); + + free( *hQMetaData ); + *hQMetaData = NULL; + + return; +} + + +/*------------------------------------------------------------------------- + * masa_sq() + * + * scalar quantization using partition + *------------------------------------------------------------------------*/ + +/*! r: codeword index */ +int16_t masa_sq( + const float in, /* i : input value */ + const float *threshold, /* i : partition */ + const int16_t cb_sz /* i : codebook size */ +) +{ + int16_t i; + + for ( i = 0; i < cb_sz; i++ ) + { + if ( in < threshold[i + 1] ) + { + return i; + } + } + + return -1; +} + + +/*------------------------------------------------------------------------- + * only_reduce_bits_direction() + * + * + *------------------------------------------------------------------------*/ + +ivas_error only_reduce_bits_direction( + int16_t *reduce_bits_out, + IVAS_QDIRECTION *q_direction, /* i/o: quantized direction structure */ + int16_t reduce_bits, + const int16_t coding_subbands, + const int16_t no_subframes, + int16_t *ind_order ) +{ + int16_t j, k, red_times, rem, n; + int16_t max_nb, delta; + int16_t *bits_dir0; + + int16_t bits_sph_idx_orig[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES]; + float penalty[MASA_MAXIMUM_CODING_SUBBANDS]; + for ( j = 0; j < coding_subbands; j++ ) + { + for ( k = 0; k < no_subframes; k++ ) + { + bits_sph_idx_orig[j][k] = q_direction->band_data[j].bits_sph_idx[k]; + } + } + n = 0; + delta = 1; + + if ( reduce_bits > 0 ) + { + red_times = reduce_bits / ( coding_subbands * no_subframes ); /* number of complete reductions by 1 bit */ + if ( red_times > 0 ) + { + for ( j = 0; j < coding_subbands; j++ ) + { + bits_dir0 = (int16_t *) q_direction->band_data[j].bits_sph_idx; + for ( k = 0; k < no_subframes; k++ ) + { + bits_dir0[k] -= red_times; + reduce_bits -= red_times; + + if ( bits_dir0[k] < MASA_MIN_BITS_TF ) + { + reduce_bits += ( MASA_MIN_BITS_TF - bits_dir0[k] ); + bits_dir0[k] = MASA_MIN_BITS_TF; + } + } + } + } + + rem = reduce_bits; /* -coding_subbands*no_subframes*red_times; */ + while ( n < rem ) + { + max_nb = 0; + for ( j = 0; j < coding_subbands; j++ ) + { + bits_dir0 = (int16_t *) q_direction->band_data[j].bits_sph_idx; + for ( k = 0; k < no_subframes; k++ ) + { + if ( ( n < rem ) && ( bits_dir0[k] > MASA_MIN_BITS_TF - delta ) ) + { + bits_dir0[k] -= 1; + n++; + } + + if ( max_nb < bits_dir0[k] ) + { + max_nb = bits_dir0[k]; + } + } + } + + if ( max_nb <= MASA_MIN_BITS_TF ) + { + delta += 1; + } + } + + reduce_bits = 0; + } + + if ( ind_order[0] == -1 ) + { + for ( j = 0; j < coding_subbands; j++ ) + { + ind_order[j] = j; + } + } + else + { + for ( j = 0; j < coding_subbands; j++ ) + { + penalty[j] = 0.0f; + for ( k = 0; k < no_subframes; k++ ) + { + if ( bits_sph_idx_orig[j][k] > 0 ) + { + penalty[j] += ( bits_sph_idx_orig[j][k] - q_direction->band_data[j].bits_sph_idx[k] ) / (float) bits_sph_idx_orig[j][k]; + } + } + penalty[j] /= no_subframes; + } + sort_desc_ind( penalty, coding_subbands, ind_order ); + } + + *reduce_bits_out = -reduce_bits; + + return IVAS_ERR_OK; +} + + +/*--------------------------------------------------------------- + * update_bits_next_block() + * + * Transfer the saved bits to the next subbands + *---------------------------------------------------------------*/ + +void update_bits_next_block( + IVAS_QDIRECTION *q_direction, /* i/o: qdirection */ + int16_t *p_diff, /* i/o: bits to be transferred */ + const int16_t j, /* i : subband to update bit alloc to*/ + const int16_t max_i, /* i : number of subbands */ + const int16_t max_k /* i : n umber of subframes */ +) +{ + int16_t diff; + int16_t k; + diff = *p_diff; + if ( diff < 0 ) + { + /* increase bits for next subbands */ + k = 0; + while ( ( diff < 0 ) && ( j < max_i ) && ( k < max_k ) ) + { + if ( q_direction->band_data[j].bits_sph_idx[k] < MASA_DIRECTION_MAX_BITS ) + { + q_direction->band_data[j].bits_sph_idx[k] += 1; + diff++; + } + k++; + } + } + else + { + k = 0; + while ( ( diff > 0 ) && ( k < max_k ) ) + { + if ( q_direction->band_data[j].bits_sph_idx[k] > 0 ) + { + q_direction->band_data[j].bits_sph_idx[k] -= 1; + diff--; + } + } + } + *p_diff = diff; + + return; +} + + +/*--------------------------------------------------------------- + * invdct4_transform() + * + * Inverse DCT transform for 4D vector + *---------------------------------------------------------------*/ + +void invdct4_transform( + float *v, /* i : input vector */ + uint8_t *invdct_v /* o : inverse transformed vector */ +) +{ + float a, b, c, d; + int16_t i; + float f_invdct_v[4]; + + a = v[0] + v[2]; + b = v[0] - v[2]; + c = 1.306562964876376f * v[1] + 0.541196100146198f * v[3]; + d = 0.541196100146198f * v[1] - 1.306562964876376f * v[3]; + f_invdct_v[0] = 128 * ( a + c ); + f_invdct_v[1] = 128 * ( b + d ); + f_invdct_v[2] = 128 * ( b - d ); + f_invdct_v[3] = 128 * ( a - c ); + + for ( i = 0; i < 4; i++ ) + { + if ( f_invdct_v[i] < 0.0 ) + { + invdct_v[i] = 0; + } + else + { + if ( f_invdct_v[i] > 255.0f ) + { + f_invdct_v[i] = 255.0f; + } + invdct_v[i] = (uint8_t) f_invdct_v[i]; + } + } + + return; +} + + +/*--------------------------------------------------------------- + * masa_compensate_two_dir_energy_ratio_index() + * + * Calculated compensated direct-to-total ratios for direction + * quantization with two directions. This allows maintaining + * direction accuracy while reusing one direction quantizers + * separately for both directions. + *--------------------------------------------------------------*/ + +void masa_compensate_two_dir_energy_ratio_index( + const int16_t ratio_index_1, /* i : Input ratio for direction 1 */ + const int16_t ratio_index_2, /* i : Input ratio for direction 2 */ + int16_t *ratio_index_mod1, /* o : Output modified ratio for direction 1 */ + int16_t *ratio_index_mod2, /* o : Output modified ratio for direction 2 */ + const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ +) +{ + float ratio1, ratio2; + float ratioSum; + + ratio1 = 1.0f - diffuseness_reconstructions[ratio_index_1]; + ratio2 = 1.0f - diffuseness_reconstructions[ratio_index_2]; + + if ( !hodirac_flag ) + { + ratioSum = ratio1 + ratio2; + if ( ratio1 >= ratio2 ) + { + ratio2 = ratio2 / ratio1 * ratioSum; + ratio1 = ratioSum; + } + else + { + ratio1 = ratio1 / ratio2 * ratioSum; + ratio2 = ratioSum; + } + } + + *ratio_index_mod1 = masa_sq( 1.0f - ratio1, diffuseness_thresholds, DIRAC_DIFFUSE_LEVELS ); + *ratio_index_mod2 = masa_sq( 1.0f - ratio2, diffuseness_thresholds, DIRAC_DIFFUSE_LEVELS ); + + /* Limit maximum accuracy increase to conserve bits */ + *ratio_index_mod1 = ( ratio_index_1 - *ratio_index_mod1 ) > MASA_DIR_RATIO_COMP_MAX_IDX_STEPS ? ratio_index_1 - MASA_DIR_RATIO_COMP_MAX_IDX_STEPS : *ratio_index_mod1; + *ratio_index_mod2 = ( ratio_index_2 - *ratio_index_mod2 ) > MASA_DIR_RATIO_COMP_MAX_IDX_STEPS ? ratio_index_2 - MASA_DIR_RATIO_COMP_MAX_IDX_STEPS : *ratio_index_mod2; + + return; +} + + +/*--------------------------------------------------------------- + * set_qmetadata_maxbit_req() + * + * Sets proper value for qmetadata_max_bit_req limit + *--------------------------------------------------------------*/ + +void ivas_set_qmetadata_maxbit_req( + IVAS_QMETADATA_HANDLE hQMetaData, /* o : qmetadata structure where the requirement value is set */ + const IVAS_FORMAT ivas_format /* i : IVAS format */ +) +{ + if ( ivas_format == SBA_FORMAT ) + { + hQMetaData->qmetadata_max_bit_req = QMETADATA_MAXBIT_REQ_SBA; + } + else /* MASA_FORMAT */ + { + hQMetaData->qmetadata_max_bit_req = QMETADATA_MAXBIT_REQ_MASA; + } + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_qmetadata_azimuth_elevation_to_direction_vector() + * + * + *------------------------------------------------------------------------*/ + +void ivas_qmetadata_azimuth_elevation_to_direction_vector( + const float az, /* i : azimuth */ + const float el, /* i : elevation */ + float *dv /* o : direction vector */ +) +{ + float radius_length; + + + dv[2] = sinf( el * PI_OVER_180 ); + radius_length = cosf( el * PI_OVER_180 ); + dv[0] = radius_length * cosf( az * PI_OVER_180 ); + dv[1] = radius_length * sinf( az * PI_OVER_180 ); + + return; +} + +/*------------------------------------------------------------------------- + * ivas_qmetadata_direction_vector_to_azimuth_elevation() + * + * azimuth between [-180, 180] + * elevation between [-90 and 90] + *------------------------------------------------------------------------*/ + +void ivas_qmetadata_direction_vector_to_azimuth_elevation( + const float *dv, /* i : direction vector */ + float *az, /* o : azimuth */ + float *el /* o : elevation */ +) +{ + /* note: dv does not need to have unit L_2 norm, because the conversion is scale invariant */ + + *el = atan2f( dv[2], sqrtf( dv[0] * dv[0] + dv[1] * dv[1] ) ) * _180_OVER_PI; + *az = atan2f( dv[1], dv[0] ) * _180_OVER_PI; + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_get_df_ratio_bits_hodirac() + * + * + *------------------------------------------------------------------------*/ + +/*! r: bits to be used for quantizing ratio of ratios */ +int16_t ivas_get_df_ratio_bits_hodirac( + const int16_t index_diff /* i : index of quantized diffuse-to-total ratio */ +) +{ + int16_t dfRatio_bits; + + if ( index_diff >= DIFF_DFRATIO_1BIT_LIMIT_IDX ) + { + dfRatio_bits = 1; + } + else if ( index_diff >= DIFF_DFRATIO_2BIT_LIMIT_IDX_HODIRAC ) + { + dfRatio_bits = 2; + } + else + { + dfRatio_bits = 3; + } + + return dfRatio_bits; +} + +/*--------------------------------------------------------------- + * ivas_get_df_ratio_bits() + * + * Gives quantization accuracy for distribution factor of + * direct-to-total ratios based on the diffuse-to-total ratio + * index + *--------------------------------------------------------------*/ + +/*! r: bits to be used for quantizing ratio of ratios */ +int16_t ivas_get_df_ratio_bits( + const int16_t index_diff /* i : index of quantized diffuse-to-total ratio */ +) +{ + int16_t dfRatio_bits; + + if ( index_diff >= DIFF_DFRATIO_1BIT_LIMIT_IDX ) + { + dfRatio_bits = 1; + } + else if ( index_diff >= DIFF_DFRATIO_2BIT_LIMIT_IDX ) + { + dfRatio_bits = 2; + } + else + { + dfRatio_bits = 3; + } + + return dfRatio_bits; +} diff --git a/lib_com/ivas_qspherical_com.c b/lib_com/ivas_qspherical_com.c new file mode 100644 index 0000000000000000000000000000000000000000..e754fb692bbd3ab149ffcf930c7931c3115e930d --- /dev/null +++ b/lib_com/ivas_qspherical_com.c @@ -0,0 +1,482 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include "options.h" +#include +#include "ivas_cnst.h" +#include "ivas_rom_com.h" +#include "ivas_prot.h" +#include "prot.h" +#include "cnst.h" +#include "wmc_auto.h" + + +/*------------------------------------------------------------------------- + * ivas_qmetadata_reorder_generic() + * + *------------------------------------------------------------------------*/ + +uint16_t ivas_qmetadata_reorder_generic( + const int16_t signed_value ) +{ + uint16_t unsigned_value; + + if ( signed_value < 0 ) + { + unsigned_value = ( ( uint16_t ) - ( signed_value + 1 ) << 1 ) + 1; + } + else + { + unsigned_value = (uint16_t) signed_value << 1; + } + + return unsigned_value; +} + + +/*------------------------------------------------------------------------- + * ivas_qmetadata_dereorder_generic() + * + * Returns the original value of the array "folded" by ReorderGeneric + *------------------------------------------------------------------------*/ + +/*! r: "Unfolded" value, positive or negative depending on the value of the input */ +int16_t ivas_qmetadata_dereorder_generic( + const uint16_t uns_value /* i : unsigned value result of ReorderGeneric */ +) +{ + if ( ( uns_value & 1 ) != 0 ) + { + return -(int16_t) ( uns_value >> 1 ) - 1; + } + else + { + return (int16_t) ( uns_value >> 1 ); + } +} + + +/*------------------------------------------------------------------------- + * ivas_dirac_project_elevation_index() + * + * + *------------------------------------------------------------------------*/ + +/*! r: projected elevation index */ +int16_t ivas_dirac_project_elevation_index( + const int16_t el_idx, /* i : elevation index */ + const int16_t el_alph, /* i : number of elevation symbols */ + const int16_t el_alph_proj /* i : size of projected alphabet */ +) +{ + int16_t el_idx_proj; + + /* evaluate floor((el_idx / (el_alph - 1)) * (el_alph_proj - 1) + 0.5) using only integer */ + el_idx_proj = ( 2 * el_idx * ( el_alph_proj - 1 ) + ( el_alph - 1 ) ) / ( 2 * ( el_alph - 1 ) ); + + return el_idx_proj; +} + + +/*------------------------------------------------------------------------- + * ivas_chan_project_elevation_index() + * + * + *------------------------------------------------------------------------*/ + +/*! r: projected index in channel mode */ +int16_t ivas_chan_project_elevation_index( + const int16_t el_idx, /* i : elevation index */ + const int16_t el_alph, /* i : number of elevation symbols */ + const int16_t el_alph_proj /* i : size of projected alphabet */ +) +{ + int16_t el_idx_proj; + + /* evaluate floor((el_idx / (el_alph - 1)) * (el_alph_proj - 1) + 0.5) using only integer */ + if ( el_idx == el_alph - 1 ) + { + el_idx_proj = el_alph_proj - 1; + } + else + { + el_idx_proj = ( 2 * el_idx * el_alph_proj + el_alph ) / ( 2 * el_alph ); + } + + return el_idx_proj; +} + + +/*------------------------------------------------------------------------- + * ivas_dirac_project_azimuth_index() + * + * + *------------------------------------------------------------------------*/ + +/*! r: projected azimuth index */ +int16_t ivas_dirac_project_azimuth_index( + const int16_t az_idx, /* i : azimuth index */ + const int16_t az_alph, /* i : number of azimuth symbols */ + const int16_t az_alph_proj /* i : size of projected alphabet */ +) +{ + int16_t az_idx_proj; + + if ( az_alph_proj == 1 ) + { + return 0; + } + + /* evaluate floor((az_idx / az_alph) * az_alph_proj + 0.5) using only integer */ + az_idx_proj = ( 2 * az_idx * az_alph_proj + az_alph ) / ( 2 * az_alph ); + + if ( az_idx_proj == az_alph_proj ) + { + az_idx_proj = 0; + } + + return az_idx_proj; +} + + +/*------------------------------------------------------------------------- + * small_reduction_direction() + * + * Compute the allocated bit reduction in spherical indexing for bit budget + * is exceeded by diff. bits + *------------------------------------------------------------------------*/ + +void small_reduction_direction( + IVAS_QDIRECTION *q_direction, /* i/o: quantized direction structure */ + uint16_t bits_dir[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES], + const int16_t raw_flag[MASA_MAXIMUM_CODING_SUBBANDS], + int16_t *diff ) +{ + int16_t i, j, k; + + for ( k = 0; ( k < 2 ) && ( *diff > 0 ); k++ ) + { + for ( i = q_direction->cfg.start_band; ( i < q_direction->cfg.nbands ) && ( *diff > 0 ); i++ ) + { + if ( raw_flag[i] == 1 ) + { + for ( j = 0; ( j < q_direction->cfg.nblocks ) && ( *diff > 0 ); j++ ) + { + if ( bits_dir[i][j] > MASA_MIN_BITS_TF ) + { + bits_dir[i][j] -= 1; + ( *diff )--; + } + } + } + } + } + + return; +} + + +/*-----------------------------------------------------------------------* + * quantize_phi() + * + * Quantize azimuth. + * Input phi expected to be an angle in degree between 0 and 360. + *-----------------------------------------------------------------------*/ + +/*! r: index azimuth */ +int16_t quantize_phi( + float phi, /* i : azimuth value */ + const int16_t flag_delta, /* i : flag indicating if the azimuth codebook is translated or not */ + float *phi_hat, /* o : quantized azimuth */ + const int16_t n /* i : azimuth codebook size */ +) +{ + int16_t id_phi; + float dd; + float delta_phi; + + + delta_phi = 360.0f / (float) n; + + if ( n == 1 ) + { + *phi_hat = 0; + + return 0; + } + + if ( ( flag_delta == 1 ) && ( n > 2 ) ) + { + dd = delta_phi / 2.0f; + } + else + { + dd = 0; + } + id_phi = (int16_t) round_f( ( ( phi - 180 - dd ) / (float) delta_phi ) ); + assert( fabsf( ( phi - 180 - dd ) / (float) delta_phi ) - abs( id_phi ) <= 0.5 ); + + if ( id_phi + ( n >> 1 ) < 0 ) + { + id_phi += 1; + } + + if ( id_phi - ( n >> 1 ) >= 0 ) + { + id_phi = -( n >> 1 ); + } + + if ( id_phi == -( ( n >> 1 ) + ( n % 2 ) ) ) + { + id_phi += ( n % 2 ); + } + else + { + if ( id_phi == ( ( n >> 1 ) + ( n % 2 ) ) ) + { + if ( n % 2 ) + { + id_phi -= 1; + } + else + { + id_phi = -id_phi; + } + } + } + + *phi_hat = id_phi * delta_phi + dd + 180; + + id_phi += ( n >> 1 ); + + return id_phi; +} + + +/*-----------------------------------------------------------------------* + * companding_azimuth() + * + * Compand azimuth based on the format + *-----------------------------------------------------------------------*/ + +/*! r: companded azimuth value */ +float companding_azimuth( + const float azi, /* i : input azimuth value */ + const MC_LS_SETUP mc_format, /* i : input channel format */ + const int16_t theta_flag, /* i : zero/non zero elevation flag */ + const int16_t direction /* i : direction of companding (direct or inverse)*/ +) +{ + const float pointsA[] = { 0.0f, 60.0f, 110.0f, 150.0f, 180.0f, 0.0f, 50.0f, 90.0f, 150.0f, 180.0f, 0.0f, 30.0f, 80.0f, 150.0f, 180.0f }; + const float pointsB[] = { 0.0f, 90.0f, 110.0f, 170.0f, 180.0f, 0.0f, 90.0f, 110.0f, 170.0f, 180.0f, 0.0f, 10.0f, 100.0f, 170.0f, 180.0f }; + const float *pA, *pB; + int16_t no_points; + float comp_azi; + int16_t i, not_done, start; + float abs_azi; + + if ( mc_format == MC_LS_SETUP_5_1 || mc_format == MC_LS_SETUP_5_1_2 || mc_format == MC_LS_SETUP_5_1_4 ) /* 5.1, 5.1+2 or 5.1+4*/ + { + start = 5; + } + else + { + start = 0; + } + + /* theta flag 1 is for non zero, larger than a threshold elevation */ + if ( ( theta_flag == 1 ) && ( ( mc_format == MC_LS_SETUP_5_1_2 ) || ( mc_format == MC_LS_SETUP_5_1_4 ) || ( mc_format == MC_LS_SETUP_7_1_4 ) ) ) /* 5.1+2, 5.1+4 or 7.1+4*/ + { + start = 10; + } + no_points = 5; + + pA = &pointsA[start]; + pB = &pointsB[start]; + + if ( direction == -1 ) /* inverse companding */ + { + pA = &pointsB[start]; + pB = &pointsA[start]; + } + else + { + if ( direction != 1 ) + { + printf( "Wrong direction in companding" ); + } + } + + not_done = 1; + abs_azi = fabsf( azi ); + + comp_azi = azi; + i = 0; + while ( not_done && ( i < no_points - 1 ) ) + { + if ( abs_azi <= pA[i + 1] ) + { + not_done = 0; + /* calculate companding */ + comp_azi = pB[i] + ( pB[i + 1] - pB[i] ) / ( pA[i + 1] - pA[i] ) * ( abs_azi - pA[i] ); + } + else + { + i++; + } + } + + if ( azi < 0 ) + { + comp_azi = -comp_azi; + } + + if ( not_done == 1 ) + { + comp_azi = azi; + } + + return comp_azi; +} + + +/*-----------------------------------------------------------------------* + * quantize_phi_chan_lbr() + * + * Quantize azimuth in low-bitrate channel mode. + * Input phi expected to be an angle in degree between 0 and 360. + *-----------------------------------------------------------------------*/ + +/*! r: index azimuth */ +int16_t quantize_phi_chan_lbr( + const float phi, /* i : azimuth value */ + float *phi_hat, /* o : quantized azimuth */ + const int16_t n /* i : azimuth codebook size */ +) +{ + int16_t id_phi; + + + if ( n <= 1 ) + { + *phi_hat = 0; + + return 0; + } + + id_phi = squant( fabsf( phi ), phi_hat, cb_azi_chan, n >> 1 ); + + if ( phi < 0 && id_phi > 0 ) + { + id_phi = 2 * id_phi - 1; + *phi_hat = -*phi_hat; + } + else + { + id_phi *= 2; + } + + return id_phi; +} + + +/*-----------------------------------------------------------------------* + * quantize_phi_chan_compand() + * + * Quantize azimuth. + * Input phi expected to be an angle in degree between 0 and 360. + *-----------------------------------------------------------------------*/ + +/*! r: index azimuth */ +int16_t quantize_phi_chan_compand( + float phi, /* i : azimuth value */ + float *phi_hat, /* o : quantized azimuth */ + const int16_t n, /* i : azimuth codebook size */ + const int16_t theta_flag, /* i : flag signaling high elevation */ + const MC_LS_SETUP mc_format /* i : channel format if in MC-mode */ +) +{ + int16_t id_phi; + float delta_phi; + + + if ( n <= 1 ) + { + *phi_hat = 0; + + return 0; + } + + phi = companding_azimuth( phi - 180, mc_format, theta_flag, 1 ); + + /* quantize companded value */ + delta_phi = 360.0f / (float) n; + id_phi = (int16_t) round_f( ( phi / (float) delta_phi ) ); + + if ( id_phi + ( n >> 1 ) < 0 ) + { + id_phi += 1; + } + if ( id_phi - ( n >> 1 ) >= 0 ) + { + id_phi = -( n >> 1 ); + } + + if ( id_phi == -( ( n >> 1 ) + ( n % 2 ) ) ) + { + id_phi += ( n % 2 ); + } + else + { + if ( id_phi == ( ( n >> 1 ) + ( n % 2 ) ) ) + { + if ( n % 2 ) + { + id_phi -= 1; + } + else + { + id_phi = -id_phi; + } + } + } + *phi_hat = id_phi * delta_phi; + + id_phi += ( n >> 1 ); + + + *phi_hat = companding_azimuth( *phi_hat, mc_format, theta_flag, -1 ) + 180; + + return id_phi; +} diff --git a/lib_com/ivas_rom_com.c b/lib_com/ivas_rom_com.c new file mode 100644 index 0000000000000000000000000000000000000000..da44adbdf95f891bce7bf177c2cd871e67b21283 --- /dev/null +++ b/lib_com/ivas_rom_com.c @@ -0,0 +1,6538 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "ivas_cnst.h" +#include "ivas_rom_com.h" +#include "wmc_auto.h" + +/* clang-format off */ + +/*----------------------------------------------------------------------------------* + * Table of IVAS bitrates + *----------------------------------------------------------------------------------*/ + +const int32_t ivas_brate_tbl[SIZE_IVAS_BRATE_TBL] = +{ + FRAME_NO_DATA, IVAS_SID_5k2, + IVAS_13k2, IVAS_16k4, IVAS_24k4, IVAS_32k, IVAS_48k, + IVAS_64k, IVAS_80k, IVAS_96k, IVAS_128k, IVAS_160k, + IVAS_192k, IVAS_256k, IVAS_384k, IVAS_512k +}; + + +/*------------------------------------------------------------------------- + * DFT Stereo ROM tables + *------------------------------------------------------------------------*/ + +/*4xERB scale: max of 14 bands*/ +const int16_t dft_band_limits_erb4[STEREO_DFT_ERB4_BANDS] = +{ + 1, 3, 5, 10, 18, 26, 41, 56, 84, 132, 214, 342, 470, 601 +}; + +/*8xERB scale: max of 8 bands*/ +const int16_t dft_band_limits_erb8[STEREO_DFT_ERB8_BANDS] = +{ + 1, 5, 18, 41, 84, 214, 470, 601 +}; + +const float dft_res_cod_alpha[STEREO_DFT_BAND_MAX] = +{ + .8f, .8f, .5f, .5f, .3f, .3f, .2f, .2f +}; + +const int16_t dft_band_ipd[3][4] = +{ + {0,8,10,13}, + {0,5,6,8}, + {0,2,3,4} +}; + +const int16_t dft_band_res_cod[3][4] = +{ + {0,8,10,11}, + {0,5,6,7}, + {0,5,6,7} +}; + +const float dft_res_gains_q[][2] = +{ + /* quantization points for joint quantization of prediction gain and residual energy */ + + /* column 1 (|ILD| = 0): */ + { 0.000000f, 0.000000f }, + { 0.000000f, 0.116982f }, + { 0.000000f, 0.226991f }, + { 0.000000f, 0.340693f }, + { 0.000000f, 0.464549f }, + { 0.000000f, 0.605079f }, + { 0.000000f, 0.776250f }, + { 0.000000f, 1.000000f }, + + /* column 2 (|ILD| = 2): */ + { 0.114623f, 0.000000f }, + { 0.116171f, 0.115424f }, + { 0.120448f, 0.223857f }, + { 0.127733f, 0.335704f }, + { 0.138966f, 0.457149f }, + { 0.155840f, 0.594270f }, + { 0.182248f, 0.760034f }, + { 0.226274f, 0.974064f }, + + /* column 3 (|ILD| = 4): */ + { 0.226274f, 0.000000f }, + { 0.229210f, 0.110915f }, + { 0.237306f, 0.214802f }, + { 0.251046f, 0.321340f }, + { 0.272098f, 0.435947f }, + { 0.303429f, 0.563535f }, + { 0.351766f, 0.714464f }, + { 0.430506f, 0.902588f }, + + /* column 4 (|ILD| = 6): */ + { 0.332279f, 0.000000f }, + { 0.336318f, 0.103909f }, + { 0.347423f, 0.200786f }, + { 0.366155f, 0.299242f }, + { 0.394585f, 0.403641f }, + { 0.436296f, 0.517359f }, + { 0.499282f, 0.647470f }, + { 0.598480f, 0.801138f }, + + /* column 5 (|ILD| = 8): */ + { 0.430506f, 0.000000f }, + { 0.435293f, 0.095060f }, + { 0.448405f, 0.183172f }, + { 0.470357f, 0.271705f }, + { 0.503282f, 0.363897f }, + { 0.550751f, 0.461614f }, + { 0.620606f, 0.568856f }, + { 0.726386f, 0.687287f }, + + /* column 6 (|ILD| = 10): */ + { 0.519494f, 0.000000f }, + { 0.524665f, 0.085097f }, + { 0.538769f, 0.163459f }, + { 0.562182f, 0.241193f }, + { 0.596843f, 0.320512f }, + { 0.645875f, 0.402058f }, + { 0.716076f, 0.487487f }, + { 0.818182f, 0.574960f }, + + /* column 7 (|ILD| = 13): */ + { 0.634158f, 0.000000f }, + { 0.639318f, 0.069554f }, + { 0.653296f, 0.132950f }, + { 0.676201f, 0.194597f }, + { 0.709442f, 0.255549f }, + { 0.755149f, 0.315316f }, + { 0.818046f, 0.373555f }, + { 0.904547f, 0.426375f }, + + /* column 8 (|ILD| = 16): */ + { 0.726386f, 0.000000f }, + { 0.731048f, 0.054862f }, + { 0.743597f, 0.104384f }, + { 0.763914f, 0.151643f }, + { 0.792863f, 0.197003f }, + { 0.831670f, 0.239542f }, + { 0.883261f, 0.278217f }, + { 0.950993f, 0.309212f }, + + /* column 9 (|ILD| = 19): */ + { 0.798235f, 0.000000f }, + { 0.802164f, 0.042077f }, + { 0.812683f, 0.079739f }, + { 0.829536f, 0.115098f }, + { 0.853180f, 0.148173f }, + { 0.884212f, 0.178009f }, + { 0.924333f, 0.203506f }, + { 0.975135f, 0.221614f }, + + /* column 10 (|ILD| = 22): */ + { 0.852825f, 0.000000f }, + { 0.855976f, 0.031585f }, + { 0.864374f, 0.059662f }, + { 0.877717f, 0.085671f }, + { 0.896203f, 0.109492f }, + { 0.920064f, 0.130302f }, + { 0.950256f, 0.147176f }, + { 0.987460f, 0.157870f }, + + /* column 11 (|ILD| = 25): */ + { 0.893520f, 0.000000f }, + { 0.895958f, 0.023331f }, + { 0.902435f, 0.043958f }, + { 0.912657f, 0.062866f }, + { 0.926684f, 0.079898f }, + { 0.944559f, 0.094403f }, + { 0.966814f, 0.105673f }, + { 0.993695f, 0.112114f }, + + /* column 12 (|ILD| = 30): */ + { 0.938693f, 0.000000f }, + { 0.940202f, 0.013738f }, + { 0.944192f, 0.025807f }, + { 0.950441f, 0.036736f }, + { 0.958923f, 0.046392f }, + { 0.969577f, 0.054375f }, + { 0.982605f, 0.060264f }, + { 0.998002f, 0.063182f }, + + /* column 13 (|ILD| = 35): */ + { 0.965056f, 0.000000f }, + { 0.965951f, 0.007932f }, + { 0.968314f, 0.014873f }, + { 0.971997f, 0.021112f }, + { 0.976963f, 0.026561f }, + { 0.983149f, 0.030984f }, + { 0.990633f, 0.034143f }, + { 0.999368f, 0.035554f }, + + /* column 14 (|ILD| = 40): */ + { 0.980198f, 0.000000f }, + { 0.980717f, 0.004528f }, + { 0.982085f, 0.008481f }, + { 0.984212f, 0.012019f }, + { 0.987068f, 0.015088f }, + { 0.990608f, 0.017552f }, + { 0.994866f, 0.019278f }, + { 0.999800f, 0.019998f }, + + /* column 15 (|ILD| = 45): */ + { 0.988816f, 0.000000f }, + { 0.989113f, 0.002568f }, + { 0.989895f, 0.004807f }, + { 0.991109f, 0.006806f }, + { 0.992735f, 0.008532f }, + { 0.994746f, 0.009911f }, + { 0.997156f, 0.010865f }, + { 0.999937f, 0.011246f }, + + /* column 16 (|ILD| = 50): */ + { 0.993695f, 0.000000f }, + { 0.993864f, 0.001451f }, + { 0.994308f, 0.002715f }, + { 0.994996f, 0.003842f }, + { 0.995917f, 0.004813f }, + { 0.997054f, 0.005586f }, + { 0.998414f, 0.006117f }, + { 0.999980f, 0.006324f } +}; + +const float dft_trigo_12k8[STEREO_DFT_N_12k8_ENC / 4 + 1] = +{ + 0.0000000f, 0.0122715f, 0.0245412f, 0.0368072f, 0.0490677f, 0.0613207f, 0.0735646f, 0.0857973f, 0.0980171f, 0.1102222f, 0.1224107f, 0.1345807f, 0.1467305f, 0.1588581f, + 0.1709619f, 0.1830399f, 0.1950903f, 0.2071114f, 0.2191012f, 0.2310581f, 0.2429802f, 0.2548657f, 0.2667128f, 0.2785197f, 0.2902847f, 0.3020059f, 0.3136817f, 0.3253103f, + 0.3368899f, 0.3484187f, 0.3598950f, 0.3713172f, 0.3826834f, 0.3939920f, 0.4052413f, 0.4164296f, 0.4275551f, 0.4386162f, 0.4496113f, 0.4605387f, 0.4713967f, 0.4821838f, + 0.4928982f, 0.5035384f, 0.5141027f, 0.5245897f, 0.5349976f, 0.5453250f, 0.5555702f, 0.5657318f, 0.5758082f, 0.5857979f, 0.5956993f, 0.6055110f, 0.6152316f, 0.6248595f, + 0.6343933f, 0.6438315f, 0.6531728f, 0.6624158f, 0.6715590f, 0.6806010f, 0.6895405f, 0.6983762f, 0.7071068f, 0.7157308f, 0.7242471f, 0.7326543f, 0.7409511f, 0.7491364f, + 0.7572088f, 0.7651673f, 0.7730105f, 0.7807372f, 0.7883464f, 0.7958369f, 0.8032075f, 0.8104572f, 0.8175848f, 0.8245893f, 0.8314696f, 0.8382247f, 0.8448536f, 0.8513552f, + 0.8577286f, 0.8639729f, 0.8700870f, 0.8760701f, 0.8819213f, 0.8876396f, 0.8932243f, 0.8986745f, 0.9039893f, 0.9091680f, 0.9142098f, 0.9191139f, 0.9238795f, 0.9285061f, + 0.9329928f, 0.9373390f, 0.9415441f, 0.9456073f, 0.9495282f, 0.9533060f, 0.9569403f, 0.9604305f, 0.9637761f, 0.9669765f, 0.9700313f, 0.9729400f, 0.9757021f, 0.9783174f, + 0.9807853f, 0.9831055f, 0.9852776f, 0.9873014f, 0.9891765f, 0.9909026f, 0.9924795f, 0.9939070f, 0.9951847f, 0.9963126f, 0.9972905f, 0.9981181f, 0.9987955f, 0.9993224f, + 0.9996988f, 0.9999247f, 1.0000000f +}; + +const float dft_trigo_32k[STEREO_DFT_N_32k_ENC / 4 + 1] = +{ + 0.0000000f, 0.0049087f, 0.0098173f, 0.0147257f, 0.0196337f, 0.0245412f, 0.0294482f, 0.0343544f, 0.0392598f, 0.0441643f, 0.0490677f, 0.0539699f, 0.0588708f, 0.0637703f, + 0.0686683f, 0.0735646f, 0.0784591f, 0.0833517f, 0.0882424f, 0.0931309f, 0.0980171f, 0.1029010f, 0.1077825f, 0.1126613f, 0.1175374f, 0.1224107f, 0.1272810f, 0.1321483f, + 0.1370123f, 0.1418731f, 0.1467305f, 0.1515843f, 0.1564345f, 0.1612809f, 0.1661234f, 0.1709619f, 0.1757963f, 0.1806264f, 0.1854522f, 0.1902736f, 0.1950903f, 0.1999024f, + 0.2047096f, 0.2095119f, 0.2143092f, 0.2191012f, 0.2238880f, 0.2286695f, 0.2334454f, 0.2382156f, 0.2429802f, 0.2477389f, 0.2524916f, 0.2572382f, 0.2619786f, 0.2667128f, + 0.2714404f, 0.2761616f, 0.2808761f, 0.2855838f, 0.2902847f, 0.2949785f, 0.2996653f, 0.3043448f, 0.3090170f, 0.3136817f, 0.3183389f, 0.3229884f, 0.3276302f, 0.3322640f, + 0.3368899f, 0.3415076f, 0.3461171f, 0.3507182f, 0.3553109f, 0.3598950f, 0.3644705f, 0.3690372f, 0.3735950f, 0.3781438f, 0.3826834f, 0.3872139f, 0.3917350f, 0.3962467f, + 0.4007488f, 0.4052413f, 0.4097240f, 0.4141969f, 0.4186597f, 0.4231125f, 0.4275551f, 0.4319874f, 0.4364092f, 0.4408206f, 0.4452213f, 0.4496113f, 0.4539905f, 0.4583587f, + 0.4627159f, 0.4670620f, 0.4713967f, 0.4757202f, 0.4800321f, 0.4843325f, 0.4886212f, 0.4928982f, 0.4971633f, 0.5014164f, 0.5056574f, 0.5098862f, 0.5141027f, 0.5183069f, + 0.5224986f, 0.5266776f, 0.5308440f, 0.5349976f, 0.5391383f, 0.5432660f, 0.5473807f, 0.5514821f, 0.5555702f, 0.5596450f, 0.5637063f, 0.5677540f, 0.5717880f, 0.5758082f, + 0.5798145f, 0.5838069f, 0.5877853f, 0.5917494f, 0.5956993f, 0.5996348f, 0.6035559f, 0.6074625f, 0.6113544f, 0.6152316f, 0.6190939f, 0.6229414f, 0.6267738f, 0.6305912f, + 0.6343933f, 0.6381801f, 0.6419516f, 0.6457076f, 0.6494480f, 0.6531728f, 0.6568819f, 0.6605751f, 0.6642524f, 0.6679137f, 0.6715590f, 0.6751880f, 0.6788007f, 0.6823972f, + 0.6859771f, 0.6895405f, 0.6930874f, 0.6966175f, 0.7001308f, 0.7036273f, 0.7071068f, 0.7105693f, 0.7140146f, 0.7174427f, 0.7208536f, 0.7242471f, 0.7276231f, 0.7309816f, + 0.7343225f, 0.7376457f, 0.7409511f, 0.7442387f, 0.7475083f, 0.7507599f, 0.7539935f, 0.7572088f, 0.7604060f, 0.7635848f, 0.7667452f, 0.7698871f, 0.7730105f, 0.7761152f, + 0.7792012f, 0.7822685f, 0.7853169f, 0.7883464f, 0.7913569f, 0.7943484f, 0.7973207f, 0.8002737f, 0.8032075f, 0.8061220f, 0.8090170f, 0.8118925f, 0.8147485f, 0.8175848f, + 0.8204014f, 0.8231983f, 0.8259753f, 0.8287325f, 0.8314696f, 0.8341867f, 0.8368838f, 0.8395606f, 0.8422172f, 0.8448536f, 0.8474695f, 0.8500651f, 0.8526402f, 0.8551947f, + 0.8577286f, 0.8602419f, 0.8627344f, 0.8652061f, 0.8676570f, 0.8700870f, 0.8724960f, 0.8748840f, 0.8772509f, 0.8795967f, 0.8819213f, 0.8842246f, 0.8865066f, 0.8887673f, + 0.8910065f, 0.8932243f, 0.8954206f, 0.8975952f, 0.8997483f, 0.9018797f, 0.9039893f, 0.9060771f, 0.9081432f, 0.9101873f, 0.9122095f, 0.9142098f, 0.9161880f, 0.9181441f, + 0.9200781f, 0.9219899f, 0.9238795f, 0.9257469f, 0.9275919f, 0.9294146f, 0.9312149f, 0.9329928f, 0.9347482f, 0.9364810f, 0.9381913f, 0.9398790f, 0.9415441f, 0.9431864f, + 0.9448060f, 0.9464029f, 0.9479770f, 0.9495282f, 0.9510565f, 0.9525619f, 0.9540444f, 0.9555039f, 0.9569403f, 0.9583537f, 0.9597440f, 0.9611112f, 0.9624552f, 0.9637761f, + 0.9650737f, 0.9663480f, 0.9675991f, 0.9688268f, 0.9700313f, 0.9712123f, 0.9723699f, 0.9735041f, 0.9746149f, 0.9757021f, 0.9767659f, 0.9778061f, 0.9788228f, 0.9798158f, + 0.9807853f, 0.9817311f, 0.9826533f, 0.9835518f, 0.9844266f, 0.9852776f, 0.9861050f, 0.9869085f, 0.9876883f, 0.9884443f, 0.9891765f, 0.9898849f, 0.9905693f, 0.9912300f, + 0.9918667f, 0.9924795f, 0.9930685f, 0.9936335f, 0.9941745f, 0.9946916f, 0.9951847f, 0.9956539f, 0.9960990f, 0.9965202f, 0.9969173f, 0.9972905f, 0.9976395f, 0.9979646f, + 0.9982656f, 0.9985426f, 0.9987955f, 0.9990243f, 0.9992290f, 0.9994097f, 0.9995663f, 0.9996988f, 0.9998072f, 0.9998916f, 0.9999518f, 0.9999880f, 1.0000000f +}; + +const float dft_trigo_48k[STEREO_DFT_N_MAX_ENC / 4 + 1] = +{ + 0.0000000f, 0.0032725f, 0.0065449f, 0.0098173f, 0.0130896f, 0.0163617f, 0.0196337f, 0.0229054f, 0.0261769f, 0.0294482f, 0.0327191f, 0.0359896f, 0.0392598f, 0.0425296f, + 0.0457989f, 0.0490677f, 0.0523360f, 0.0556037f, 0.0588708f, 0.0621373f, 0.0654031f, 0.0686683f, 0.0719327f, 0.0751963f, 0.0784591f, 0.0817211f, 0.0849822f, 0.0882424f, + 0.0915016f, 0.0947599f, 0.0980171f, 0.1012733f, 0.1045285f, 0.1077825f, 0.1110353f, 0.1142870f, 0.1175374f, 0.1207866f, 0.1240345f, 0.1272810f, 0.1305262f, 0.1337700f, + 0.1370123f, 0.1402532f, 0.1434926f, 0.1467305f, 0.1499668f, 0.1532014f, 0.1564345f, 0.1596658f, 0.1628955f, 0.1661234f, 0.1693495f, 0.1725738f, 0.1757963f, 0.1790169f, + 0.1822355f, 0.1854522f, 0.1886670f, 0.1918797f, 0.1950903f, 0.1982989f, 0.2015053f, 0.2047096f, 0.2079117f, 0.2111116f, 0.2143092f, 0.2175045f, 0.2206974f, 0.2238880f, + 0.2270763f, 0.2302620f, 0.2334454f, 0.2366262f, 0.2398045f, 0.2429802f, 0.2461533f, 0.2493238f, 0.2524916f, 0.2556567f, 0.2588190f, 0.2619786f, 0.2651354f, 0.2682894f, + 0.2714404f, 0.2745886f, 0.2777338f, 0.2808761f, 0.2840153f, 0.2871515f, 0.2902847f, 0.2934147f, 0.2965416f, 0.2996653f, 0.3027858f, 0.3059030f, 0.3090170f, 0.3121277f, + 0.3152350f, 0.3183389f, 0.3214395f, 0.3245366f, 0.3276302f, 0.3307203f, 0.3338069f, 0.3368899f, 0.3399692f, 0.3430450f, 0.3461171f, 0.3491854f, 0.3522500f, 0.3553109f, + 0.3583679f, 0.3614212f, 0.3644705f, 0.3675159f, 0.3705574f, 0.3735950f, 0.3766285f, 0.3796580f, 0.3826834f, 0.3857048f, 0.3887220f, 0.3917350f, 0.3947439f, 0.3977485f, + 0.4007488f, 0.4037449f, 0.4067366f, 0.4097240f, 0.4127070f, 0.4156856f, 0.4186597f, 0.4216294f, 0.4245945f, 0.4275551f, 0.4305111f, 0.4334625f, 0.4364092f, 0.4393513f, + 0.4422887f, 0.4452213f, 0.4481492f, 0.4510723f, 0.4539905f, 0.4569039f, 0.4598124f, 0.4627159f, 0.4656145f, 0.4685081f, 0.4713967f, 0.4742803f, 0.4771588f, 0.4800321f, + 0.4829003f, 0.4857634f, 0.4886212f, 0.4914739f, 0.4943212f, 0.4971633f, 0.5000000f, 0.5028314f, 0.5056574f, 0.5084780f, 0.5112931f, 0.5141027f, 0.5169069f, 0.5197055f, + 0.5224986f, 0.5252860f, 0.5280679f, 0.5308440f, 0.5336145f, 0.5363793f, 0.5391383f, 0.5418916f, 0.5446390f, 0.5473807f, 0.5501164f, 0.5528463f, 0.5555702f, 0.5582882f, + 0.5610003f, 0.5637063f, 0.5664062f, 0.5691001f, 0.5717880f, 0.5744697f, 0.5771452f, 0.5798145f, 0.5824777f, 0.5851346f, 0.5877853f, 0.5904296f, 0.5930676f, 0.5956993f, + 0.5983246f, 0.6009435f, 0.6035559f, 0.6061619f, 0.6087614f, 0.6113544f, 0.6139408f, 0.6165207f, 0.6190939f, 0.6216606f, 0.6242205f, 0.6267738f, 0.6293204f, 0.6318602f, + 0.6343933f, 0.6369196f, 0.6394390f, 0.6419516f, 0.6444573f, 0.6469562f, 0.6494480f, 0.6519330f, 0.6544109f, 0.6568819f, 0.6593458f, 0.6618027f, 0.6642524f, 0.6666951f, + 0.6691306f, 0.6715590f, 0.6739801f, 0.6763941f, 0.6788007f, 0.6812002f, 0.6835923f, 0.6859771f, 0.6883546f, 0.6907247f, 0.6930874f, 0.6954426f, 0.6977905f, 0.7001308f, + 0.7024637f, 0.7047890f, 0.7071068f, 0.7094170f, 0.7117196f, 0.7140146f, 0.7163019f, 0.7185816f, 0.7208536f, 0.7231179f, 0.7253744f, 0.7276231f, 0.7298641f, 0.7320972f, + 0.7343225f, 0.7365399f, 0.7387495f, 0.7409511f, 0.7431448f, 0.7453306f, 0.7475083f, 0.7496781f, 0.7518398f, 0.7539935f, 0.7561391f, 0.7582766f, 0.7604060f, 0.7625272f, + 0.7646403f, 0.7667452f, 0.7688418f, 0.7709303f, 0.7730105f, 0.7750824f, 0.7771460f, 0.7792012f, 0.7812482f, 0.7832867f, 0.7853169f, 0.7873387f, 0.7893520f, 0.7913569f, + 0.7933533f, 0.7953413f, 0.7973207f, 0.7992915f, 0.8012538f, 0.8032075f, 0.8051526f, 0.8070891f, 0.8090170f, 0.8109362f, 0.8128467f, 0.8147485f, 0.8166416f, 0.8185259f, + 0.8204014f, 0.8222682f, 0.8241262f, 0.8259753f, 0.8278156f, 0.8296471f, 0.8314696f, 0.8332833f, 0.8350880f, 0.8368838f, 0.8386706f, 0.8404484f, 0.8422172f, 0.8439770f, + 0.8457278f, 0.8474695f, 0.8492022f, 0.8509257f, 0.8526402f, 0.8543455f, 0.8560416f, 0.8577286f, 0.8594064f, 0.8610750f, 0.8627344f, 0.8643845f, 0.8660254f, 0.8676570f, + 0.8692793f, 0.8708923f, 0.8724960f, 0.8740903f, 0.8756753f, 0.8772509f, 0.8788171f, 0.8803739f, 0.8819213f, 0.8834592f, 0.8849876f, 0.8865066f, 0.8880161f, 0.8895161f, + 0.8910065f, 0.8924874f, 0.8939588f, 0.8954206f, 0.8968727f, 0.8983153f, 0.8997483f, 0.9011716f, 0.9025853f, 0.9039893f, 0.9053836f, 0.9067683f, 0.9081432f, 0.9095084f, + 0.9108638f, 0.9122095f, 0.9135455f, 0.9148716f, 0.9161880f, 0.9174945f, 0.9187912f, 0.9200781f, 0.9213551f, 0.9226223f, 0.9238795f, 0.9251269f, 0.9263644f, 0.9275919f, + 0.9288096f, 0.9300172f, 0.9312149f, 0.9324027f, 0.9335804f, 0.9347482f, 0.9359059f, 0.9370536f, 0.9381913f, 0.9393190f, 0.9404366f, 0.9415441f, 0.9426415f, 0.9437288f, + 0.9448060f, 0.9458732f, 0.9469301f, 0.9479770f, 0.9490136f, 0.9500402f, 0.9510565f, 0.9520627f, 0.9530586f, 0.9540444f, 0.9550199f, 0.9559853f, 0.9569403f, 0.9578852f, + 0.9588197f, 0.9597440f, 0.9606581f, 0.9615618f, 0.9624552f, 0.9633384f, 0.9642112f, 0.9650737f, 0.9659258f, 0.9667676f, 0.9675991f, 0.9684202f, 0.9692309f, 0.9700313f, + 0.9708212f, 0.9716008f, 0.9723699f, 0.9731287f, 0.9738770f, 0.9746149f, 0.9753423f, 0.9760593f, 0.9767659f, 0.9774620f, 0.9781476f, 0.9788228f, 0.9794874f, 0.9801416f, + 0.9807853f, 0.9814185f, 0.9820411f, 0.9826533f, 0.9832549f, 0.9838460f, 0.9844266f, 0.9849966f, 0.9855561f, 0.9861050f, 0.9866433f, 0.9871711f, 0.9876883f, 0.9881950f, + 0.9886910f, 0.9891765f, 0.9896514f, 0.9901157f, 0.9905693f, 0.9910124f, 0.9914449f, 0.9918667f, 0.9922779f, 0.9926785f, 0.9930685f, 0.9934478f, 0.9938165f, 0.9941745f, + 0.9945219f, 0.9948586f, 0.9951847f, 0.9955002f, 0.9958049f, 0.9960990f, 0.9963825f, 0.9966552f, 0.9969173f, 0.9971688f, 0.9974095f, 0.9976395f, 0.9978589f, 0.9980676f, + 0.9982656f, 0.9984529f, 0.9986295f, 0.9987955f, 0.9989507f, 0.9990952f, 0.9992290f, 0.9993522f, 0.9994646f, 0.9995663f, 0.9996573f, 0.9997376f, 0.9998072f, 0.9998661f, + 0.9999143f, 0.9999518f, 0.9999786f, 0.9999946f, 1.0000000f +}; + +/* tables for adaptive Golomb-Rice coding of DFT stereo parameters */ +const int16_t dft_code_itd[] = +{ + 0, 3, 4, 13, 8, 9, 12, 5, 10, 44, 23, 60, 45, 31, 235, 59, 28, 61, 234, 116 +}; + +const int16_t dft_len_itd[] = +{ + 2, 3, 4, 4, 4, 4, 4, 4, 4, 6, 5, 6, 6, 5, 8, 6, 5, 6, 8, 7 +}; + +const int16_t dft_maps_rpg[] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, + 2, 0, 1, 3, 4, 5, 6, 7, + 6, 2, 0, 1, 3, 4, 5, 7, + 7, 5, 2, 0, 1, 3, 4, 6, + 7, 6, 4, 3, 1, 0, 2, 5, + 7, 6, 5, 3, 2, 1, 0, 4, + 7, 6, 5, 4, 3, 2, 0, 1, + 7, 6, 5, 4, 3, 2, 0, 1, + 6, 5, 4, 3, 1, 0, 2, 7, +}; + +const int16_t dft_maps_sg[NO_SYMB_GR_SIDE_G * NO_SYMB_GR_SIDE_G] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 1, 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 15, 4, 0, 1, 2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 12, 9, 4, 1, 0, 2, 3, 5, 6, 7, 8, 10, 11, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 16, 14, 8, 4, 2, 0, 1, 3, 5, 6, 7, 9, 10, 11, 12, 13, 15, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 18, 16, 14, 10, 5, 0, 1, 2, 3, 4, 6, 7, 8, 9, 11, 12, 13, 15, 17, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 21, 19, 17, 15, 8, 4, 2, 0, 1, 3, 5, 6, 7, 9, 10, 11, 12, 13, 14, 16, 18, 20, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 21, 19, 17, 15, 12, 8, 4, 0, 1, 2, 3, 5, 6, 7, 9, 10, 11, 13, 14, 16, 18, 20, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 21, 19, 17, 15, 13, 11, 9, 3, 0, 1, 2, 4, 5, 6, 7, 8, 10, 12, 14, 16, 18, 20, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 24, 22, 20, 18, 16, 14, 12, 9, 6, 0, 1, 2, 3, 4, 5, 7, 8, 10, 11, 13, 15, 17, 19, 21, 23, 25, 26, 27, 28, 29, 30, + 25, 23, 21, 19, 17, 15, 13, 11, 9, 6, 0, 1, 2, 3, 4, 5, 7, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 27, 28, 29, 30, + 27, 25, 23, 21, 19, 17, 15, 13, 11, 8, 5, 0, 1, 2, 3, 4, 6, 7, 9, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 29, 30, + 26, 24, 22, 20, 18, 16, 14, 12, 10, 8, 6, 4, 2, 1, 0, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 28, 29, 30, + 28, 26, 24, 22, 20, 18, 16, 14, 12, 10, 8, 6, 4, 2, 0, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 30, + 29, 27, 25, 23, 21, 19, 17, 15, 13, 11, 9, 7, 5, 3, 0, 1, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, + 29, 27, 25, 23, 21, 19, 17, 15, 13, 11, 9, 7, 5, 3, 1, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, + 30, 28, 26, 24, 22, 20, 18, 16, 14, 12, 10, 8, 6, 4, 2, 1, 0, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, + 30, 29, 27, 25, 23, 21, 19, 17, 15, 13, 11, 9, 7, 5, 3, 1, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, + 30, 29, 28, 27, 25, 23, 21, 19, 17, 15, 13, 11, 9, 7, 5, 3, 0, 1, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, + 30, 29, 28, 26, 24, 22, 20, 18, 16, 14, 12, 10, 9, 7, 6, 4, 3, 2, 1, 0, 5, 8, 11, 13, 15, 17, 19, 21, 23, 25, 27, + 30, 29, 28, 27, 26, 24, 22, 20, 18, 16, 14, 12, 10, 8, 7, 5, 4, 3, 2, 1, 0, 6, 9, 11, 13, 15, 17, 19, 21, 23, 25, + 30, 29, 28, 27, 26, 25, 23, 21, 19, 17, 15, 13, 11, 10, 8, 7, 5, 4, 3, 2, 1, 0, 6, 9, 12, 14, 16, 18, 20, 22, 24, + 30, 29, 28, 27, 26, 25, 24, 23, 22, 20, 18, 16, 14, 12, 10, 8, 7, 6, 5, 4, 2, 1, 0, 3, 9, 11, 13, 15, 17, 19, 21, + 30, 29, 28, 27, 26, 25, 24, 23, 22, 20, 18, 16, 14, 13, 11, 10, 9, 7, 6, 5, 3, 2, 1, 0, 4, 8, 12, 15, 17, 19, 21, + 30, 29, 28, 27, 26, 25, 24, 23, 22, 20, 18, 16, 14, 13, 12, 11, 10, 9, 7, 6, 5, 3, 1, 0, 2, 4, 8, 15, 17, 19, 21, + 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 17, 15, 13, 12, 11, 9, 8, 7, 6, 4, 3, 2, 1, 0, 5, 10, 14, 16, 18, + 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 15, 13, 12, 11, 10, 9, 7, 6, 5, 3, 1, 0, 2, 4, 8, 14, 16, + 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 11, 10, 8, 7, 6, 5, 3, 2, 0, 1, 4, 9, 12, + 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 3, 2, 1, 0, 4, 15, + 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 0, 1, + 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 +}; + + +/*------------------------------------------------------------------------- + * Range Coder ROM tables + *------------------------------------------------------------------------*/ + +/* Create separate tables for cumulative frequency and symbol frequency */ +const uint16_t cum_freq_ari_pk_s17_LC_ext[RANGE_N_CONTEXT][1 + RANGE_N_SYMBOLS] = +{ + { 0,16,47,153,241,269,325,468,591,674,798,912,1017,1082,1183,1277,1364,16384 }, + { 0,7401,7844,7886,7899,12065,12718,12790,12805,14099,14476,14533,14549,15058,15264,15299,15310,16384 }, + { 0,4362,6345,6864,7038,9037,11049,11736,12002,12569,13301,13656,13822,14021,14334,14515,14607,16384 }, + { 0,2955,5183,5822,6013,8153,10671,11614,11943,12586,13540,14025,14232,14437,14770,14978,15080,16384 }, + { 0,3155,4981,5615,5855,7969,9953,10739,11073,11936,12837,13208,13383,13767,14203,14400,14498,16384 }, + { 0,1216,2630,3264,3558,4831,6679,7661,8157,8709,9622,10204,10542,10799,11243,11568,11777,16384 }, + { 0,1759,3641,4350,4612,6325,8678,9732,10161,10790,11790,12361,12642,12883,13295,13566,13720,16384 }, + { 0,1109,2705,3433,3732,5226,7532,8732,9263,9978,11142,11842,12188,12490,12986,13321,13520,16384 }, + { 0,11524,13046,13170,13191,14956,15708,15813,15837,16028,16162,16195,16204,16245,16282,16295,16300,16384 }, + { 0,8027,10586,10909,10974,13291,14861,15157,15232,15535,15824,15914,15943,16014,16090,16123,16136,16384 }, + { 0,834,2034,2674,2997,4087,5843,6891,7455,8030,9013,9688,10085,10376,10893,11277,11528,16384 }, + { 0,6038,9086,9451,9519,12332,14521,14913,15003,15329,15711,15848,15893,15955,16045,16091,16111,16384 }, + { 0,4732,7685,8354,8545,10717,12924,13618,13852,14291,14842,15083,15181,15314,15491,15582,15625,16384 }, + { 0,745,1783,2347,2655,3537,4963,5864,6406,6863,7664,8248,8634,8891,9351,9708,9958,16384 }, + { 0,3957,6794,7669,7998,9743,11676,12498,12869,13313,13894,14186,14332,14498,14714,14835,14906,16384 }, + { 0,2779,5388,6021,6201,8582,11352,12260,12544,13117,13981,14408,14580,14751,15039,15213,15298,16384 }, + { 0,448,1160,1625,1920,2576,3706,4518,5053,5474,6234,6835,7262,7531,8032,8446,8758,16384 }, + { 0,1,2,1555,2246,2247,2248,3489,4112,5449,6596,7302,7710,8311,8876,9266,9517,16384 }, + { 0,2496,4910,5544,5722,8049,10799,11689,11973,12583,13467,13878,14047,14234,14537,14712,14803,16384 }, + { 0,921,2222,2880,3188,4407,6321,7406,7955,8573,9616,10296,10679,10978,11502,11880,12118,16384 }, + { 0,2620,4443,5017,5233,7072,9213,10083,10441,11049,11954,12442,12676,12918,13310,13565,13705,16384 }, + { 0,11205,13084,13178,13187,15164,16010,16081,16091,16213,16303,16321,16325,16340,16355,16360,16362,16384 }, + { 0,358,916,1288,1542,2055,2937,3594,4062,4399,5017,5524,5907,6136,6573,6941,7236,16384 }, + { 0,3575,5093,5536,5735,7408,9185,9878,10188,10727,11497,11933,12165,12410,12794,13019,13166,16384 }, + { 0,1,2,640,1036,1037,1038,1670,2096,2696,3287,3732,4056,4417,4800,5106,5339,16384 }, + { 0,969,1397,1518,1578,2633,3338,3566,3675,4197,4664,4857,4957,5288,5625,5783,5874,16384 }, + { 0,10458,12104,12294,12331,14246,15264,15437,15481,15752,15971,16031,16050,16120,16186,16210,16218,16384 }, + { 0,7178,9744,10039,10093,12701,14612,14961,15042,15360,15732,15869,15917,15978,16070,16117,16139,16384 }, + { 0,1298,2418,2879,3113,4146,5509,6227,6621,7053,7755,8229,8539,8776,9186,9492,9714,16384 }, + { 0,4957,7785,8252,8357,10978,13372,13955,14114,14561,15140,15378,15464,15570,15730,15820,15860,16384 }, + { 0,4823,8164,8570,8647,11604,14169,14653,14763,15105,15554,15727,15785,15852,15960,16018,16045,16384 }, + { 0,4735,7010,7517,7660,9986,12230,12914,13131,13666,14374,14689,14814,14972,15212,15342,15404,16384 }, + { 0,3363,5881,6658,6941,8864,11113,12015,12368,12889,13643,14019,14203,14394,14665,14823,14906,16384 }, + { 0,2569,4996,5779,6068,7917,10251,11209,11602,12129,12918,13321,13520,13696,13976,14155,14259,16384 }, + { 0,209,577,848,1046,1378,1982,2465,2835,3072,3513,3893,4202,4374,4703,4994,5241,16384 }, + { 0,2074,4337,5048,5274,7319,10003,11066,11446,12105,13112,13652,13885,14100,14464,14691,14810,16384 }, + { 0,1619,3560,4288,4550,6381,8955,10102,10543,11239,12362,12982,13261,13516,13958,14234,14381,16384 }, + { 0,89,257,441,582,734,1024,1325,1568,1716,1983,2222,2430,2545,2750,2941,3109,16384 }, + { 0,2202,3563,4044,4264,5686,7344,8100,8476,9006,9835,10331,10612,10864,11304,11599,11787,16384 }, + { 0,1220,2801,3492,3784,5223,7387,8496,8998,9640,10711,11369,11711,11993,12486,12829,13035,16384 }, + { 0,12626,13813,13903,13917,15396,15906,15972,15987,16139,16230,16251,16257,16289,16315,16323,16326,16384 }, + { 0,1579,3191,3831,4099,5678,7788,8761,9206,9842,10821,11388,11681,11958,12417,12722,12902,16384 }, + { 0,597,1514,2064,2379,3237,4679,5637,6213,6733,7649,8316,8755,9052,9599,10023,10323,16384 }, + { 0,9273,11762,12080,12151,14038,15210,15446,15514,15725,15929,15995,16019,16068,16124,16148,16158,16384 }, + { 0,9238,11681,11852,11872,14306,15644,15801,15828,16013,16183,16231,16243,16266,16297,16312,16318,16384 }, + { 0,6791,9200,9531,9594,12240,14178,14552,14639,15064,15506,15643,15687,15785,15908,15960,15983,16384 }, + { 0,7175,10415,10905,11033,13038,14621,15002,15123,15367,15651,15762,15806,15864,15938,15974,15992,16384 }, + { 0,5060,7703,8132,8225,10934,13270,13778,13911,14397,14972,15173,15242,15367,15537,15619,15654,16384 }, + { 0,3721,6311,6857,6992,9557,12180,12895,13098,13671,14418,14718,14830,14984,15212,15333,15390,16384 }, + { 0,5971,9288,10044,10269,11991,13680,14228,14437,14750,15130,15293,15374,15459,15579,15642,15677,16384 }, + { 0,3047,5311,5907,6078,8339,10850,11679,11946,12580,13442,13854,14024,14220,14534,14716,14810,16384 }, + { 0,2061,4280,4993,5228,7201,9735,10735,11097,11708,12606,13082,13295,13498,13836,14043,14161,16384 }, + { 0,4738,7949,8880,9234,10781,12502,13214,13531,13897,14355,14593,14718,14835,14998,15096,15153,16384 }, + { 0,3237,5045,5632,5860,7609,9702,10608,10986,11571,12476,12978,13230,13451,13830,14074,14208,16384 }, + { 0,1833,3889,4677,5028,6422,8379,9378,9884,10350,11086,11545,11809,12003,12327,12559,12711,16384 }, + { 0,3989,6858,7352,7459,10254,12936,13571,13735,14240,14895,15153,15242,15364,15548,15646,15690,16384 }, + { 0,1463,3197,3909,4220,5626,7609,8632,9127,9657,10520,11078,11380,11607,11991,12265,12442,16384 }, + { 0,14233,15083,15108,15110,16069,16300,16314,16316,16352,16370,16373,16374,16377,16380,16381,16382,16384 }, + { 0,1,2,2610,3293,3294,3295,5097,5671,8467,10332,11119,11437,12223,12850,13185,13345,16384 }, + { 0,2010,4053,4696,4910,6879,9391,10386,10750,11393,12376,12886,13119,13348,13726,13967,14099,16384 }, + { 0,7586,10517,10758,10791,13543,15346,15577,15619,15846,16082,16150,16169,16202,16245,16265,16273,16384 }, + { 0,3059,5772,6369,6524,9041,11801,12582,12813,13361,14115,14439,14567,14714,14944,15075,15141,16384 }, + { 0,8643,10594,10813,10856,13274,14686,14920,14975,15350,15680,15771,15799,15897,16003,16042,16057,16384 }, + { 0,6720,8878,9325,9467,11564,13248,13744,13929,14384,14880,15087,15167,15311,15488,15569,15607,16384 }, +}; + +const uint16_t sym_freq_ari_pk_s17_LC_ext[RANGE_N_CONTEXT][RANGE_N_SYMBOLS] = +{ + { 16,31,106,88,28,56,143,123,83,124,114,105,65,101,94,87,15020 }, + { 7401,443,42,13,4166,653,72,15,1294,377,57,16,509,206,35,11,1074 }, + { 4362,1983,519,174,1999,2012,687,266,567,732,355,166,199,313,181,92,1777 }, + { 2955,2228,639,191,2140,2518,943,329,643,954,485,207,205,333,208,102,1304 }, + { 3155,1826,634,240,2114,1984,786,334,863,901,371,175,384,436,197,98,1886 }, + { 1216,1414,634,294,1273,1848,982,496,552,913,582,338,257,444,325,209,4607 }, + { 1759,1882,709,262,1713,2353,1054,429,629,1000,571,281,241,412,271,154,2664 }, + { 1109,1596,728,299,1494,2306,1200,531,715,1164,700,346,302,496,335,199,2864 }, + { 11524,1522,124,21,1765,752,105,24,191,134,33,9,41,37,13,5,84 }, + { 8027,2559,323,65,2317,1570,296,75,303,289,90,29,71,76,33,13,248 }, + { 834,1200,640,323,1090,1756,1048,564,575,983,675,397,291,517,384,251,4856 }, + { 6038,3048,365,68,2813,2189,392,90,326,382,137,45,62,90,46,20,273 }, + { 4732,2953,669,191,2172,2207,694,234,439,551,241,98,133,177,91,43,759 }, + { 745,1038,564,308,882,1426,901,542,457,801,584,386,257,460,357,250,6426 }, + { 3957,2837,875,329,1745,1933,822,371,444,581,292,146,166,216,121,71,1478 }, + { 2779,2609,633,180,2381,2770,908,284,573,864,427,172,171,288,174,85,1086 }, + { 448,712,465,295,656,1130,812,535,421,760,601,427,269,501,414,312,7626 }, + { 1,1,1553,691,1,1,1241,623,1337,1147,706,408,601,565,390,251,6867 }, + { 2496,2414,634,178,2327,2750,890,284,610,884,411,169,187,303,175,91,1581 }, + { 921,1301,658,308,1219,1914,1085,549,618,1043,680,383,299,524,378,238,4266 }, + { 2620,1823,574,216,1839,2141,870,358,608,905,488,234,242,392,255,140,2679 }, + { 11205,1879,94,9,1977,846,71,10,122,90,18,4,15,15,5,2,22 }, + { 358,558,372,254,513,882,657,468,337,618,507,383,229,437,368,295,9148 }, + { 3575,1518,443,199,1673,1777,693,310,539,770,436,232,245,384,225,147,3218 }, + { 1,1,638,396,1,1,632,426,600,591,445,324,361,383,306,233,11045 }, + { 969,428,121,60,1055,705,228,109,522,467,193,100,331,337,158,91,10510 }, + { 10458,1646,190,37,1915,1018,173,44,271,219,60,19,70,66,24,8,166 }, + { 7178,2566,295,54,2608,1911,349,81,318,372,137,48,61,92,47,22,245 }, + { 1298,1120,461,234,1033,1363,718,394,432,702,474,310,237,410,306,222,6670 }, + { 4957,2828,467,105,2621,2394,583,159,447,579,238,86,106,160,90,40,524 }, + { 4823,3341,406,77,2957,2565,484,110,342,449,173,58,67,108,58,27,339 }, + { 4735,2275,507,143,2326,2244,684,217,535,708,315,125,158,240,130,62,980 }, + { 3363,2518,777,283,1923,2249,902,353,521,754,376,184,191,271,158,83,1478 }, + { 2569,2427,783,289,1849,2334,958,393,527,789,403,199,176,280,179,104,2125 }, + { 209,368,271,198,332,604,483,370,237,441,380,309,172,329,291,247,11143 }, + { 2074,2263,711,226,2045,2684,1063,380,659,1007,540,233,215,364,227,119,1574 }, + { 1619,1941,728,262,1831,2574,1147,441,696,1123,620,279,255,442,276,147,2003 }, + { 89,168,184,141,152,290,301,243,148,267,239,208,115,205,191,168,13275 }, + { 2202,1361,481,220,1422,1658,756,376,530,829,496,281,252,440,295,188,4597 }, + { 1220,1581,691,292,1439,2164,1109,502,642,1071,658,342,282,493,343,206,3349 }, + { 12626,1187,90,14,1479,510,66,15,152,91,21,6,32,26,8,3,58 }, + { 1579,1612,640,268,1579,2110,973,445,636,979,567,293,277,459,305,180,3482 }, + { 597,917,550,315,858,1442,958,576,520,916,667,439,297,547,424,300,6061 }, + { 9273,2489,318,71,1887,1172,236,68,211,204,66,24,49,56,24,10,226 }, + { 9238,2443,171,20,2434,1338,157,27,185,170,48,12,23,31,15,6,66 }, + { 6791,2409,331,63,2646,1938,374,87,425,442,137,44,98,123,52,23,401 }, + { 7175,3240,490,128,2005,1583,381,121,244,284,111,44,58,74,36,18,392 }, + { 5060,2643,429,93,2709,2336,508,133,486,575,201,69,125,170,82,35,730 }, + { 3721,2590,546,135,2565,2623,715,203,573,747,300,112,154,228,121,57,994 }, + { 5971,3317,756,225,1722,1689,548,209,313,380,163,81,85,120,63,35,707 }, + { 3047,2264,596,171,2261,2511,829,267,634,862,412,170,196,314,182,94,1574 }, + { 2061,2219,713,235,1973,2534,1000,362,611,898,476,213,203,338,207,118,2223 }, + { 4738,3211,931,354,1547,1721,712,317,366,458,238,125,117,163,98,57,1231 }, + { 3237,1808,587,228,1749,2093,906,378,585,905,502,252,221,379,244,134,2176 }, + { 1833,2056,788,351,1394,1957,999,506,466,736,459,264,194,324,232,152,3673 }, + { 3989,2869,494,107,2795,2682,635,164,505,655,258,89,122,184,98,44,694 }, + { 1463,1734,712,311,1406,1983,1023,495,530,863,558,302,227,384,274,177,3942 }, + { 14233,850,25,2,959,231,14,2,36,18,3,1,3,3,1,1,2 }, + { 1,1,2608,683,1,1,1802,574,2796,1865,787,318,786,627,335,160,3039 }, + { 2010,2043,643,214,1969,2512,995,364,643,983,510,233,229,378,241,132,2285 }, + { 7586,2931,241,33,2752,1803,231,42,227,236,68,19,33,43,20,8,111 }, + { 3059,2713,597,155,2517,2760,781,231,548,754,324,128,147,230,131,66,1243 }, + { 8643,1951,219,43,2418,1412,234,55,375,330,91,28,98,106,39,15,327 }, + { 6720,2158,447,142,2097,1684,496,185,455,496,207,80,144,177,81,38,777 }, +}; + + +/*------------------------------------------------------------------------- + * ECLVQ Stereo ROM tables + *------------------------------------------------------------------------*/ + +/* table with round(ECSQ_PROB_TOTAL / index) for entropy coding, with i in {1, .., ECSQ_SEGMENT_SIZE} */ +const uint16_t ECSQ_tab_inverse[1 + ECSQ_SEGMENT_SIZE] = +{ + 0, 16384, 8192, 5461, 4096, 3277, 2731, 2341, 2048 +}; + + +/*------------------------------------------------------------------------- + * Stereo ICA analysis ROM tables + *------------------------------------------------------------------------*/ + +const float ica_sincInterp2[2*SINC_ORDER1+1] = +{ + 0.0f,-0.002323f,0.0f, 0.003486f, 0.0f,-0.005865f,0.0f, 0.009735f, 0.0f,-0.015447f,0.0f, 0.023503f, + 0.0f,-0.034727f,0.0f, 0.050649f, 0.0f,-0.074578f,0.0f, 0.115220f, 0.0f,-0.204776f,0.0f, 0.634114f, + 1.0f, 0.634114f,0.0f,-0.204776f, 0.0f, 0.115220f,0.0f,-0.074578f, 0.0f, 0.050649f,0.0f,-0.034727f, + 0.0f, 0.023503f,0.0f,-0.015447f, 0.0f, 0.009735f,0.0f,-0.005865f, 0.0f, 0.003486f,0.0f,-0.002323f, 0.0f +}; + +const float ica_sincInterp4[2*SINC_ORDER1+1] = +{ + 0.0f,-0.003285f,-0.005537f,-0.004930f, 0.0f, 0.008295f, 0.015189f, 0.013767f, 0.0f,-0.021845f,-0.038282f,-0.033239f, + 0.0f, 0.049111f, 0.083913f, 0.071628f, 0.0f,-0.105469f,-0.183615f,-0.162946f, 0.0f, 0.289597f, 0.626641f, 0.896773f, + 1.0f, 0.896773f, 0.626641f, 0.289597f, 0.0f,-0.162946f,-0.183615f,-0.105469f, 0.0f, 0.071628f, 0.083913f, 0.049111f, + 0.0f,-0.033239f,-0.038282f,-0.021845f, 0.0f, 0.013767f, 0.015189f, 0.008295f, 0.0f,-0.004930f,-0.005537f,-0.003285f, 0.0f +}; + +const float ica_sincInterp6[2*SINC_ORDER1+1] = +{ + 0.0f,-0.003484f,-0.007192f,-0.010460f,-0.011712f,-0.008798f, 0.0f, 0.014603f, 0.032045f, 0.046341f, 0.049731f, 0.035255f, + 0.0f,-0.052090f,-0.109007f,-0.151947f,-0.159196f,-0.111867f, 0.0f, 0.172831f, 0.388013f, 0.614328f, 0.814030f, 0.951171f, + 1.0f, 0.951171f, 0.814030f, 0.614328f, 0.388013f, 0.172831f, 0.0f,-0.111867f,-0.159196f,-0.151947f,-0.109007f,-0.052090f, + 0.0f, 0.035255f, 0.049731f, 0.046341f, 0.032045f, 0.014603f, 0.0f,-0.008798f,-0.011712f,-0.010460f,-0.007192f,-0.003484f, 0.0f +}; + + +/*----------------------------------------------------------------------------------* + * Stereo IC-BWE ROM tables + *----------------------------------------------------------------------------------*/ + +const float icbwe_gsMapping_tbl[16] = +{ + -2.0000000f, -1.3494960f, -0.9607952f, -0.7098941f, -0.5589364f, -0.4453763f, -0.3429649f, -0.2527705f, + -0.1690688f, -0.0987095f, -0.0700000f, -0.0500000f, -0.0200000f, 0.0000000f, 0.0400000f, 0.0800000f +}; + +const float icbwe_gsMappingDFT_tbl[128] = +{ + -5.0000000f, -4.5000000f, -4.0000000f, -3.5000000f, -3.0000000f, -2.5000000f, -1.9000000f, -1.5474502f, + -1.5002078f, -1.4469336f, -1.3902478f, -1.3770106f, -1.3094972f, -1.2608015f, -1.0926061f, -1.0843442f, + -1.0345038f, -1.0286606f, -1.0161779f, -1.0036838f, -0.9812821f, -0.9698121f, -0.9573308f, -0.9405646f, + -0.9297086f, -0.9131601f, -0.9025761f, -0.8860643f, -0.8736950f, -0.8564931f, -0.8403996f, -0.8352164f, + -0.8241847f, -0.8038731f, -0.7923367f, -0.7789138f, -0.7679189f, -0.7595301f, -0.7566783f, -0.7507762f, + -0.7428076f, -0.7386452f, -0.7339793f, -0.7300271f, -0.7243238f, -0.7188097f, -0.7090309f, -0.7047743f, + -0.7000968f, -0.6903794f, -0.6844128f, -0.6792722f, -0.6724832f, -0.6680448f, -0.6638050f, -0.6587732f, + -0.6519668f, -0.6454810f, -0.6418348f, -0.6352437f, -0.6296001f, -0.6244346f, -0.6182194f, -0.6134241f, + -0.6093079f, -0.6042419f, -0.5995789f, -0.5946505f, -0.5897729f, -0.5851547f, -0.5806601f, -0.5759744f, + -0.5720182f, -0.5669503f, -0.5630283f, -0.5573819f, -0.5511614f, -0.5438205f, -0.5364699f, -0.5282783f, + -0.5198154f, -0.5095584f, -0.4986083f, -0.4861976f, -0.4725366f, -0.4591254f, -0.4449745f, -0.4310394f, + -0.4169318f, -0.4033374f, -0.3898838f, -0.3766562f, -0.3616849f, -0.3472800f, -0.3326788f, -0.3194550f, + -0.3060711f, -0.2916924f, -0.2783983f, -0.2642500f, -0.2506378f, -0.2368909f, -0.2203000f, -0.2036115f, + -0.1869981f, -0.1709912f, -0.1561569f, -0.1420659f, -0.1263750f, -0.1107119f, -0.0953914f, -0.0805369f, + -0.0660773f, -0.0529481f, -0.0401913f, -0.0287031f, -0.0184659f, -0.0094214f, 0.0000000f, 0.0073561f, + 0.0155180f, 0.0224511f, 0.0298570f, 0.0375954f, 0.0457853f, 0.0549424f, 0.0659733f, 0.0785186f +}; + + +/*----------------------------------------------------------------------------------* + * TD Stereo ROM tables + *----------------------------------------------------------------------------------*/ + +const float tdm_ratio_tabl[TDM_NQ+1] = +{ + 0.00f, 0.00f, 0.0109f, 0.0245f, 0.0432f, 0.0670f, 0.0955f, 0.1284f, + 0.1654f, 0.2061f, 0.2500f, 0.2966f, 0.3455f, 0.3960f, 0.4477f, 0.5000f, + 0.5523f, 0.6040f, 0.6545f, 0.7034f, 0.7500f, 0.7939f, 0.8346f, 0.8716f, + 0.9045f, 0.9330f, 0.9568f, 0.9755f, 0.9891f, 1.0000f, 1.0000f, 1.0000f +}; +const float tdm_den_ratio_tabl[TDM_NQ+1] = /* 1.0f/(2*LR_ratio*LR_ratio-2*LR_ratio+1) */ +{ + 1.0000f, 1.0000f, 1.0221f, 1.0501f, 1.0902f, 1.1429f, 1.2088f, 1.2884f, + 1.3815f, 1.4864f, 1.6000f, 1.7161f, 1.8257f, 1.9171f, 1.9784f, 2.0000f, + 1.9784f, 1.9171f, 1.8257f, 1.7161f, 1.6000f, 1.4864f, 1.3815f, 1.2884f, + 1.2088f, 1.1429f, 1.0902f, 1.0501f, 1.0221f, 1.0000f, 1.0000f, 1.0000f +}; + +const int16_t tdm_bit_allc_tbl[5][6] = +{ + /* IC -- UC -- GC -- TM --AC */ + { 1650, 3500, 0, 4400, 0, 5000 }, /* IVAS_13k2 */ + { 1650, 3500, 0, 5000, 0, 5000 }, /* IVAS_16k4 */ + { 1650, 3500, 0, 6000, 0, 5000 }, /* IVAS_24k4 */ + { 1650, 6050, 0, 10000, 0, 10000 }, /* IVAS_32k */ + { 1650, 6050, 0, 13000, 0, 14000 } /* IVAS_48k */ +}; + +/* LSFs Intra-frame prediction tables */ +const float tdm_LSF_MEAN_RE_USE_OUT[M] = +{ + 301.292f, 521.300f, 870.818f, 1340.278f, 1712.099f, 2091.456f, 2488.523f, 2841.096f, 3196.565f, 3593.040f, 3958.366f, 4293.334f, 4710.319f, 5118.806f, 5546.761f, 5918.579f, +}; + +const float tdm_LSF_MEAN_RE_USE_IN[M] = +{ + 286.414f, 522.366f, 887.297f, 1347.961f, 1725.604f, 2102.356f, 2511.703f, 2853.093f, 3211.319f, 3612.072f, 3970.889f, 4327.774f, 4732.423f, 5154.984f, 5572.849f, 5964.332f, +}; + +const float tdm_LSF_MEAN_RE_USE[M] = +{ + 265.534222F, 534.776631F, 919.574509F, 1346.991675F, 1756.991835F, 2123.061862F, 2556.845807F, 2927.484493F, + 3299.107307F, 3686.249102F, 4034.473656F, 4393.818819F, 4781.683038F, 5155.954294F, 5542.569582F, 5927.377309F +}; + +const float tdm_Beta_Q1bit_re_use_13k2[2] = { 0.97F, 0.75F }; +const float tdm_Beta_Q1bit_re_use_16k4[2] = { 0.95F, 0.71F }; +const float tdm_Beta_Q1bit_re_use_24k4_32k[2] = { 0.93F, 0.73F }; +const float tdm_Beta_Q1bit_re_use_48k[2] = { 0.97F, 0.77F }; + +const float tdm_RE_USE_adaptive_beta_prd_diag_3[15 + 16 + 15] = +{ + 0.8859f, 0.2060f, + 0.0585f, 0.8245f, 0.2294f, + 0.0365f, 0.8175f, 0.1696f, + -0.0060f, 0.8483f, 0.2061f, + 0.0663f, 0.8983f, 0.1357f, + 0.0664f, 0.7951f, 0.1934f, + 0.0935f, 0.7948f, 0.1685f, + 0.1109f, 0.7960f, 0.1828f, + 0.1073f, 0.7835f, 0.1804f, + 0.1479f, 0.7362f, 0.1982f, + 0.1335f, 0.7621f, 0.1900f, + 0.1903f, 0.7369f, 0.1715f, + 0.1785f, 0.7214f, 0.1646f, + 0.1967f, 0.6891f, 0.1229f, + 0.2043f, 0.6317f, 0.0543f, + 0.1767f, 0.5396f, +}; + +const float tdm_LSF_MEAN_PRED_QNT[M] = +{ + 391.31345F, 608.50453F, 968.00585F, 1354.23965F, 1709.71084F, 2080.49872F, 2450.64009F, 2796.96588F, + 3196.19608F, 3554.17092F, 3915.02370F, 4283.81121F, 4707.59835F, 5109.79026F, 5526.44936F, 5903.42625F +}; + +const float tdm_LSF_MEAN_PRED_QNT_IN[M] = +{ + 288.540f, 535.469f, 899.738f, 1342.313f, 1730.736f, 2107.070f, 2491.455f, 2859.828f, 3239.279f, 3625.673f, 3992.540f, 4356.748f, 4752.356f, 5153.685f, 5567.107f, 5972.623f, +}; +const float tdm_LSF_MEAN_PRED_QNT_OUT[M] = +{ + 286.414f, 522.366f, 887.297f, 1347.961f, 1725.604f, 2102.356f, 2511.703f, 2853.093f, 3211.319f, 3612.072f, 3970.889f, 4327.774f, 4732.423f, 5154.984f, 5572.849f, 5964.332f, +}; + +const float tdm_PRED_QNT_fixed_beta_prd_diag_3[15 + 16 + 15] = +{ + 0.7040f, 0.1203f, + -0.1119f, 0.7340f, 0.1803f, + 0.0253f, 0.6702f, 0.1901f, + -0.1847f, 0.7892f, 0.3010f, + -0.0418f, 0.8716f, 0.1837f, + 0.0033f, 0.6915f, 0.2394f, + 0.0213f, 0.6728f, 0.2441f, + 0.0705f, 0.7549f, 0.1983f, + 0.0752f, 0.7152f, 0.2173f, + 0.0886f, 0.6163f, 0.3067f, + 0.0217f, 0.8121f, 0.2021f, + 0.1584f, 0.7311f, 0.1746f, + 0.1204f, 0.7296f, 0.1978f, + 0.1231f, 0.7502f, 0.1234f, + 0.1709f, 0.6372f, 0.1060f, + 0.1193f, 0.6574f, +}; + +const int16_t fast_FCB_bits_2sfr[] = {8, 14, 18, 20, 24, 128/*stop value*/}; + +const int16_t fast_FCB_rates_2sfr[] = {/*16*50,*/ (8+14)*50, 28*50, 32*50, 34*50, 36*50, 38*50, 40*50, 42*50, 44*50, 48*50}; + + +/*----------------------------------------------------------------------------------* + * MDCT Stereo ROM tables + *----------------------------------------------------------------------------------*/ + + /* PsychLPC */ + +const SpectrumWarping sw32000Hz[] = +{{ + { + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 6, 6, 6, 6, + 6, 8, 8, 8, 8, 8, 10, 10, 10, 10, 12, 12, 12, 12, 14, 14, + 14, 16, 18, 18, 18, 20, 22, 22, 22, 24, 26, 26, 26, 28, 30, 32 + }, + { + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, + 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10 + }, +}}; + +const SpectrumWarping sw25600Hz[] = +{{ + { + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 6, 6, 6, 6, + 6, 6, 6, 8, 8, 8, 8, 8, 8, 8, 8, 10, 12, 12, 12, 12, + 12, 12, 14, 14, 14, 14, 14, 16, 16, 18, 18, 18, 18, 18, 20, 20 + }, + { + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7 + }, +}}; + +const SpectrumWarping sw16000Hz[] = +{{ + { + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8 + }, + { + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 + }, +}}; + +const MDCTStereoBands_config mdctStereoBands_32000_640[] = +{{ + /*TCX 20*/ + { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 8, 8, 8, 8, 8, 8, 8, 12, 12, 12, + 12, 20, 20, 20, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 42, + 64, 64, 96, 160}, + {44, 41,38, 29},/*number of bands for frame lengths 960, 640, 512, 320 respectively*/ + + /*TCX 10*/ + { + 4, 4, 4, 4, 4, 8, 8, 8, 8, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 20, 32, 32, + 32, 48, 80 + }, + {33, 29, 26, 18}/*number of bands for frame lengths 480, 320, 256, 160 respectively*/ +}}; + +const float nf_tw_smoothing_coeffs[N_LTP_GAIN_MEMS] = +{ + 0.4f,0.2f,0.2f,0.2f +}; + + +/*----------------------------------------------------------------------------------* + * Stereo DTX tables + *----------------------------------------------------------------------------------*/ + +const float dft_cng_coh_pred[STEREO_DFT_N_COH_PRED][STEREO_DFT_COH_PRED_COEFFS] = +{ + { 0.601337f, -0.101048f, 1.269064f, 0.085044f, 0.279032f, 0.669925f, 0.081573f, 0.188857f, -0.172930f, 0.321477f, 0.009332f, -0.084341f, 0.362245f, -0.426671f, 0.758383f}, + { 0.855349f, 0.420736f, 0.413285f, -0.009366f, -0.399699f, 1.385802f, 0.012428f, -0.015338f, 0.156471f, 0.517438f, 0.160248f, -0.303634f, 0.477768f, -0.560747f, 1.382583f}, + { 0.202543f, 0.048819f, 0.263407f, 0.023538f, 0.092021f, 0.395655f, 0.013064f, -0.011127f, 0.035466f, 0.976055f, 0.009968f, 0.162957f, 0.383185f, -0.365493f, 2.534677f}, + { 1.393664f, -0.131401f, 0.989429f, 0.738330f, 0.683865f, 0.001677f, -0.225448f, -0.012158f, 1.084608f, -0.115464f, 0.022371f, -0.045560f, -0.336230f, 0.422742f, 0.499163f} +}; + +const int16_t dft_cng_coh_u2i[9] = { 4, 5, 3, 6, 2, 7, 1, 8, 0 }; /* Coherence unary codeword -> residual codeword conversion table */ + +const int16_t dft_cng_coh_i2u[9] = { 8, 6, 4, 2, 0, 1, 3, 5, 7 }; /* Coherence residual codeword -> unary codeword conversion table */ + +const int16_t dft_cng_coh_alpha_start[STEREO_DFT_N_COH_ALPHA_STEPS - 1] = { 15, 16, 17, 18 }; + +const float dft_cng_alpha_bits[STEREO_DFT_N_COH_ALPHA_STEPS][STEREO_DFT_N_COH_ALPHA_LEVELS] = +{ + { 0.1f, 0.6f }, + { 0.1f, 0.6f }, + { 0.1f, 0.7f }, + { 0.1f, 0.9f }, + { 0.2f, 0.9f } +}; + + +/*----------------------------------------------------------------------------------* + * DirAC ROM tables + *----------------------------------------------------------------------------------*/ + +const float diffuseness_reconstructions[DIRAC_DIFFUSE_LEVELS] = +{ + 0.0f, + 0.03955078125f, + 0.089599609375f, + 0.158935546875f, + 0.308349609375f, + 0.473876953125f, + 0.63232421875f, + 0.85009765625f +}; + +const float diffuseness_thresholds[DIRAC_DIFFUSE_LEVELS + 1] = +{ + 0.0f, + 0.01904296875f, + 0.06298828125f, + 0.119384765625f, + 0.22119140625f, + 0.399169921875f, + 0.547607421875f, + 0.734619140625f, + 2.0f /* out-of-range large value to make searching easier */ +}; + +const int16_t DirAC_band_grouping_12[12 + 1] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, 11, 17, 25, 40, 60 +}; + + +const int16_t DirAC_band_grouping_6[6 + 1] = +{ + 0, 1, 4, 8, 20, 30, 60 +}; + +const int16_t DirAC_band_grouping_5[5 + 1] = +{ + 0, 1, 3, 7, 15, 60 +}; + +const int16_t DirAC_block_grouping[MAX_PARAM_SPATIAL_SUBFRAMES + 1] = +{ + 0, 4, 8, 12, 16 +}; + +const int16_t DirAC_block_grouping_5ms_MDFT[MAX_PARAM_SPATIAL_SUBFRAMES + 1] = +{ + 0, 1, 2, 3, 4 +}; + +const float c_weights[DIRAC_NO_FB_BANDS_MAX] = { 9.962447e-02f, 9.627997e-01f, 9.926667e-01f, 9.981028e-01f, 9.996648e-01f, 1.000000e+00f, 9.997692e-01f, 9.992002e-01f, 9.983890e-01f, 9.973818e-01f, 9.962037e-01f, 9.948692e-01f, 9.933876e-01f, 9.917654e-01f, 9.900073e-01f, 9.881169e-01f, 9.860975e-01f, 9.839516e-01f, 9.816818e-01f, 9.792906e-01f, 9.767801e-01f, 9.741527e-01f, 9.714106e-01f, 9.685560e-01f, 9.655913e-01f, 9.625187e-01f, 9.593406e-01f, 9.560594e-01f, 9.526774e-01f, 9.491970e-01f, 9.456208e-01f, 9.419512e-01f, 9.381908e-01f, 9.343420e-01f, 9.304075e-01f, 9.263898e-01f, 9.222915e-01f, 9.181152e-01f, 9.138636e-01f, 9.095392e-01f, 9.051447e-01f, 9.006827e-01f, 8.961559e-01f, 8.915668e-01f, 8.869181e-01f, 8.822123e-01f, 8.774521e-01f, 8.726400e-01f, 8.677785e-01f, 8.628702e-01f, 8.579176e-01f, 8.529231e-01f, 8.478893e-01f, 8.428184e-01f, 8.377130e-01f, 8.325753e-01f, 8.274077e-01f, 8.222124e-01f, 8.169917e-01f, 8.117478e-01f, 8.064829e-01f, 8.011990e-01f, 7.958982e-01f, 7.905827e-01f, 7.852543e-01f, 7.799150e-01f, 7.745667e-01f, 7.692112e-01f, 7.638505e-01f, 7.584861e-01f, 7.531199e-01f, 7.477535e-01f, 7.423885e-01f, 7.370265e-01f, 7.316691e-01f, 7.263176e-01f, 7.209736e-01f, 7.156384e-01f, 7.103134e-01f, 7.049999e-01f, 6.996990e-01f, 6.944121e-01f, 6.891403e-01f, 6.838847e-01f, 6.786464e-01f, 6.734265e-01f, 6.682258e-01f, 6.630455e-01f, 6.578863e-01f, 6.527492e-01f, 6.476350e-01f, 6.425445e-01f, 6.374784e-01f, 6.324376e-01f, 6.274226e-01f, 6.224341e-01f, 6.174729e-01f, 6.125393e-01f, 6.076341e-01f, 6.027577e-01f, 5.979106e-01f, 5.930932e-01f, 5.883061e-01f, 5.835497e-01f, 5.788242e-01f, 5.741301e-01f, 5.694676e-01f, 5.648372e-01f, 5.602390e-01f, 5.556734e-01f, 5.511404e-01f, 5.466405e-01f, 5.421737e-01f, 5.377402e-01f, 5.333402e-01f, 5.289738e-01f, 5.246411e-01f, 5.203422e-01f, 5.160771e-01f, 5.118460e-01f, 5.076489e-01f, 5.034858e-01f, 4.993567e-01f, 4.952616e-01f, 4.912005e-01f, 4.871734e-01f, 4.831802e-01f, 4.792209e-01f, 4.752955e-01f, 4.714037e-01f, 4.675457e-01f, 4.637212e-01f, 4.599302e-01f, 4.561725e-01f, 4.524481e-01f, 4.487567e-01f, 4.450983e-01f, 4.414728e-01f, 4.378799e-01f, 4.343195e-01f, 4.307915e-01f, 4.272956e-01f, 4.238318e-01f, 4.203997e-01f, 4.169993e-01f, 4.136303e-01f, 4.102926e-01f, 4.069859e-01f, 4.037101e-01f, 4.004649e-01f, 3.972501e-01f, 3.940655e-01f, 3.909109e-01f, 3.877861e-01f, 3.846909e-01f, 3.816250e-01f, 3.785882e-01f, 3.755803e-01f, 3.726010e-01f, 3.696501e-01f, 3.667275e-01f, 3.638328e-01f, 3.609658e-01f, 3.581263e-01f, 3.553141e-01f, 3.525289e-01f, 3.497705e-01f, 3.470387e-01f, 3.443331e-01f, 3.416537e-01f, 3.390001e-01f, 3.363720e-01f, 3.337694e-01f, 3.311919e-01f, 3.286393e-01f, 3.261114e-01f, 3.236079e-01f, 3.211286e-01f, 3.186733e-01f, 3.162418e-01f, 3.138337e-01f, 3.114490e-01f, 3.090872e-01f, 3.067484e-01f, 3.044321e-01f, 3.021382e-01f, 2.998664e-01f, 2.976166e-01f, 2.953885e-01f, 2.931819e-01f, 2.909966e-01f, 2.888323e-01f, 2.866889e-01f, 2.845661e-01f, 2.824637e-01f, 2.803816e-01f, 2.783194e-01f, 2.762770e-01f, 2.742543e-01f, 2.722509e-01f, 2.702667e-01f, 2.683014e-01f, 2.663550e-01f, 2.644271e-01f, 2.625177e-01f, 2.606264e-01f, 2.587531e-01f, 2.568977e-01f, 2.550599e-01f, 2.532395e-01f, 2.514364e-01f, 2.496503e-01f, 2.478811e-01f, 2.461287e-01f, 2.443928e-01f, 2.426732e-01f, 2.409698e-01f, 2.392824e-01f, 2.376109e-01f, 2.359550e-01f, 2.343146e-01f, 2.326895e-01f, 2.310797e-01f, 2.294848e-01f, 2.279047e-01f, 2.263394e-01f, 2.247886e-01f, 2.232521e-01f, 2.217299e-01f, 2.202217e-01f, 2.187274e-01f, 2.172469e-01f, 2.157800e-01f, 2.143266e-01f, 2.128865e-01f, 2.114596e-01f, 2.100457e-01f, 2.086447e-01f, 2.072564e-01f, 2.058808e-01f }; + +/*----------------------------------------------------------------------* +* SPAR ROM tables +*-----------------------------------------------------------------------*/ + +const ivas_spar_br_table_t ivas_spar_br_table_consts[IVAS_SPAR_BR_TABLE_LEN] = +{ +/* When AGC is ON additional (AGC_BITS_PER_CH+1) bits may be taken from each core-coder channel + so minimum core-coder bitrate per channel can be min core-coder bitrates as per the table - AGC_BITS_PER_CH */ + { 13200, 0, SBA_FOA_ORDER, FB, 24000, 1, WYXZ, 1, 0, { { 10000, 8150, 13150 } }, + { { 15, 1, 5, 1 },{ 15, 1, 3, 1 },{ 7, 1, 3, 1 } }, 0, 0, 0 }, + + { 16400, 0, SBA_FOA_ORDER, FB, 24000, 1, WYXZ, 1, 0, { { 13200, 11350, 16350 } }, + { { 15, 1, 5, 1 },{ 15, 1, 3, 1 },{ 7, 1, 3, 1 } }, 0, 0, 0 }, + + { 24400, 0, SBA_FOA_ORDER, FB, 24000, 1, WYXZ, 1, 0, { { 16400, 14850, 24350 } }, + { { 15, 1, 5, 1 },{ 15, 1, 3, 1 },{ 7, 1, 3, 1 } }, 0, 0, 0 }, + + { 32000, 0, SBA_FOA_ORDER, FB, 24000, 1, WYXZ, 1, 0, { { 24000, 20450, 31950 } }, + { { 21, 1, 5, 1 },{ 15, 1, 5, 1 },{ 15, 1, 3, 1 } }, 0, 0, 0 }, + + { 48000, 0, SBA_FOA_ORDER, FB, 24000, 2, WYXZ, 0, 0, { { 24000, 21000, 31950 },{ 16000, 15000, 20400 } }, + { { 15, 7, 5, 1 },{ 15, 7, 3, 1 },{ 7, 7, 3, 1 } }, 1, 0, 0 }, + + { 64000, 0, SBA_FOA_ORDER, FB, 24000, 2, WYXZ, 0, 0, { { 38000, 34050, 56000 },{ 16000, 15600, 20400 } },{ { 21, 7, 5, 1 },{ 15, 7, 5, 1 },{ 15, 7, 3, 1 } }, 1, 1, 0 }, + + { 80000, 0, SBA_FOA_ORDER, FB, 24000, 2, WYXZ, 0, 0, { { 46000, 43000, 56000 },{ 24000, 23000, 31950 } }, + { { 21, 7, 5, 1 },{ 15, 7, 5, 1 },{ 15, 7, 3, 1 } }, 1, 0, 0 }, + + { 96000, 0, SBA_FOA_ORDER, FB, 24000, 3, WYXZ, 0, 0, { { 47000, 42600, 56000 },{ 23000, 22600, 31950 },{ 16000, 15600, 20400 } }, + { { 21, 9, 9, 1 },{ 21, 7, 5, 1 },{ 21, 7, 5, 1 } }, 1, 0, 0 }, + + { 128000, 0, SBA_FOA_ORDER, FB, 24000, 3, WYXZ, 0, 0, { { 55000, 50000, 56000 },{ 36000, 36000, 56000 },{ 27000, 27000, 31950 } }, + { { 21, 11, 9, 1 },{ 21, 9, 7, 1 },{ 21, 7, 7, 1 } }, 1, 0, 0 }, + + { 160000, 0, SBA_FOA_ORDER, FB, 24000, 3, WYXZ, 0, 0, { { 74000, 70900, 112000 },{ 41000, 40050, 56000 },{ 35000, 34050, 56000 } }, + { { 21, 11, 11, 1 },{ 21, 9, 9, 1 },{ 21, 7, 7, 1 } }, 1, 0, 0 }, + + { 192000, 0, SBA_FOA_ORDER, FB, 24000, 3, WYXZ, 0, 0, { { 90000, 87900, 112000 },{ 50000, 48050, 56000 },{ 42000, 41050, 56000 } }, + { { 21, 11, 11, 1 },{ 21, 9, 9, 1 },{ 21, 7, 7, 1 } }, 1, 0, 0 }, + + { 256000, 0, SBA_FOA_ORDER, FB, 24000, 4, WYXZ, 0, 0, { { 90000, 85000, 112000 },{ 70000, 69000, 112000 },{ 50000, 48950, 56000 },{ 36400, 35600, 56000 } }, + { { 31, 1, 1, 1 },{ 1, 1, 1, 1 },{ 1, 1, 1, 1 } }, 1, 2, 0 }, + + { 256000, 0, SBA_HOA2_ORDER, FB, 24000, 4, WYXZ, 0, 0, { { 84650, 83000, 112000 },{ 65850, 64550, 56000 },{ 47000, 46100, 48000 },{ 28200, 27650, 40000 } }, + { { 31, 11, 11, 1 },{ 1, 1, 1, 1 },{ 1, 1, 1, 1 } }, 1, 2, 0 }, + + { 256000, 0, SBA_HOA3_ORDER, FB, 24000, 4, WYXZ, 0, 0, { { 76300, 73550, 112000 },{ 59350, 57200, 56000 },{ 42400, 40850, 48000 },{ 25450, 24500, 40000 } }, + { { 31, 11, 11, 1 },{ 1, 1, 1, 1 }, { 1, 1, 1, 1 } }, 1, 2, 0 }, + + { 384000, 0, SBA_FOA_ORDER, FB, 24000, 4, WYXZ, 0, 0, { { 128000, 128000, 128000 },{ 100000, 100000, 128000 },{ 79850, 79850, 104000 },{ 66600, 66600, 104000 } }, + { { 31, 1, 1, 1 },{ 1, 1, 1, 1 },{ 1, 1, 1, 1 } }, 1, 2, 0 }, + + { 384000, 0, SBA_HOA2_ORDER, FB, 24000, 4, WYXZ, 0, 0, { { 128000, 128000, 128000 },{ 105350, 103300, 112000 },{ 75200, 73750, 96000 },{ 45100, 44250, 48000 } }, + { { 31, 11, 11, 1 },{ 1, 1, 1, 1 },{ 1, 1, 1, 1 } }, 1, 2, 0 }, + + { 384000, 0, SBA_HOA3_ORDER, FB, 24000, 4, WYXZ, 0, 0, { { 124300, 121550, 128000 },{ 96700, 94550, 112000 },{ 69050, 67500, 96000 },{ 41450, 40500, 48000 } }, + { { 31, 11, 11, 1 },{ 1, 1, 1, 1 },{ 1, 1, 1, 1 } }, 1, 2, 0 }, + + { 512000, 0, SBA_FOA_ORDER, FB, 24000, 4, WYXZ, 0, 0, { { 128000, 128000, 128000 },{ 128000, 128000, 128000 },{ 128000, 128000, 128000 }, {118450, 118450, 128000 } }, + { { 31, 1, 1, 1 },{ 1, 1, 1, 1 },{ 1, 1, 1, 1 } }, 1, 2, 0 }, + + { 512000, 0, SBA_HOA2_ORDER, FB, 24000, 4, WYXZ, 0, 0,{ { 124000, 124000, 128000 },{ 124000, 124000, 128000 },{ 125200, 118450, 128000 },{ 76300, 73000, 128000 } }, + { { 31, 11, 11, 1 },{ 1, 1, 1, 1 },{ 1, 1, 1, 1 } }, 1, 2, 0 }, + + { 512000, 0, SBA_HOA3_ORDER, FB, 24000, 4, WYXZ, 0, 0, { { 118000, 118000, 128000 },{ 118000, 118000, 128000 },{ 117200, 109250, 128000 },{ 72300, 69000, 128000 } }, + { { 31, 11, 11, 1 },{ 1, 1, 1, 1 },{ 1, 1, 1, 1 } }, 1, 2, 0 }, +}; + +const ivas_freq_models_t ivas_arith_pred_r_consts[TOTAL_PRED_QUANT_STRATS_ARITH] = +{ + /* entry for 1 quantization points */ + { + /* pred_R real */ + { + { 0,16384, }, + { 0,16384, }, + { 0,16384, }, + { 0,16384, }, + }, + /* pred_R real differential */ + { + { 0,16384, }, + { 0,16384, }, + { 0,16384, }, + { 0,16384, }, + }, + /* pred_R real : values for general and differential */ + { 0 },{ 0 }, + /* pred_R real : num dyn models for general and differential */ + 4, 4 + }, + /* entry for 7 quantization points for br_table_idx >= 2 */ + { + /* pred_R real */ + { + { 0,546,1092,2184,8740,2184,1092,546, }, + { 0,1779,2116,2516,3562,2516,2116,1779, }, + { 0,1848,2614,5229,2614,1848,1307,924, }, + { 0,924,1307,1848,2614,5229,2614,1848, }, + }, + /* pred_R real differential */ + { + { 0,125,399,1269,12798,1269,399,125, }, + { 0,744,1327,2365,7512,2365,1327,744, }, + { 0,1354,2413,7664,2413,1354,760,426, }, + { 0,426,760,1354,2413,7664,2413,1354, }, + }, + /* pred_R real : values for general and differential */ + { -3,-2,-1,0,1,2,3 },{ -3,-2,-1,0,1,2,3 }, + /* pred_R real : num dyn models for general and differential */ + 4, 4 + }, + /* entry for 15 quantization points for br_table_idx >= 2 */ + { + /* pred_R real */ + { + { 0,32,64,128,257,514,1028,2056,8226,2056,1028,514,257,128,64,32, }, + { 0,565,672,799,950,1130,1344,1598,2268,1598,1344,1130,950,799,672,565, }, + { 0,353,500,707,1000,1414,2000,4010,2000,1414,1000,707,500,353,250,176, }, + { 0,176,250,353,500,707,1000,1414,2000,4010,2000,1414,1000,707,500,353, }, + }, + /* pred_R real differential */ + { + { 0,1,3,12,39,125,397,1260,12710,1260,397,125,39,12,3,1, }, + { 0,66,119,212,378,674,1201,2140,6804,2140,1201,674,378,212,119,66, }, + { 0,119,212,379,675,1203,2144,6816,2144,1203,675,379,212,119,67,37, }, + { 0,37,67,119,212,379,675,1203,2144,6816,2144,1203,675,379,212,119, }, + }, + /* pred_R real : values for general and differential */ + { -7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7 }, + { -7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7 }, + /* pred_R real : num dyn models for general and differential */ + 4, 4 + }, + /* entry for 21 quantization points for br_table_idx >= 2 */ + { + /* pred_R real */ + { + { 0,4,8,16,32,64,128,256,512,1024,2049,8198,2049,1024,512,256,128,64,32,16,8,4, }, + { 0,292,348,414,492,585,696,828,984,1171,1392,1980,1392,1171,984,828,696,585,492,414,348,292, }, + { 0,119,168,238,336,476,673,952,1346,1904,3817,1904,1346,952,673,476,336,238,168,119,84,59, }, + { 0,59,84,119,168,238,336,476,673,952,1346,1904,3817,1904,1346,952,673,476,336,238,168,119, }, + }, + /* pred_R real differential */ + { + { 0,1,1,1,1,3,12,39,125,397,1260,12704,1260,397,125,39,12,3,1,1,1,1, }, + { 0,11,20,37,66,118,210,375,668,1191,2122,6748,2122,1191,668,375,210,118,66,37,20,11, }, + { 0,20,37,66,118,210,375,668,1191,2123,6751,2123,1191,668,375,210,118,66,37,20,11,6, }, + { 0,6,11,20,37,66,118,210,375,668,1191,2123,6751,2123,1191,668,375,210,118,66,37,20, }, + }, + /* pred_R real : values for general and differential */ + { -10,-9,-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9,10 }, + { -10,-9,-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9,10 }, + /* pred_R real : num dyn models for general and differential */ + 4, 4 + }, + /* entry for 31 quantization points */ + { + /* pred real */ + { + { 0,1,1,1,1,2,4,8,16,32,64,128,256,512,1024,2048,8188,2048,1024,512,256,128,64,32,16,8,4,2,1,1,1,1, }, + { 0,110,131,156,186,221,263,313,373,443,527,627,746,887,1055,1255,1798,1255,1055,887,746,627,527,443,373,313,263,221,186,156,131,110, }, + { 0,20,29,41,58,82,116,164,233,329,466,659,932,1318,1864,3738,1864,1318,932,659,466,329,233,164,116,82,58,41,29,20,14,10, }, + { 0,10,14,20,29,41,58,82,116,164,233,329,466,659,932,1318,1864,3738,1864,1318,932,659,466,329,233,164,116,82,58,41,29,20, } + }, + /* pred real differential */ + { + { 0,1,1,1,1,1,1,1,1,1,3,12,39,125,397,1260,12694,1260,397,125,39,12,3,1,1,1,1,1,1,1,1,1, }, + { 0,1,1,2,3,6,11,20,37,66,117,210,374,667,1189,2118,6740,2118,1189,667,374,210,117,66,37,20,11,6,3,2,1,1, }, + { 0,1,2,3,6,11,20,37,66,117,210,374,667,1189,2118,6740,2118,1189,667,374,210,117,66,37,20,11,6,3,2,1,1,1, }, + { 0,1,1,1,2,3,6,11,20,37,66,117,210,374,667,1189,2118,6740,2118,1189,667,374,210,117,66,37,20,11,6,3,2,1, } + }, + /* pred real : values for general and differential */ + { -15,-14,-13,-12,-11,-10,-9,-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 }, + { -15,-14,-13,-12,-11,-10,-9,-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 }, + /* pred real : num dyn models for general and differential */ + 4, 4 + }, + /* entry for 7 quantization points for br_table_idx < 2 */ + { + /* pred_R real */ + { + { 0,327,778,1851,10472,1851,778,327, }, + { 0,1057,1630,2514,5982,2514,1630,1057, }, + { 0,1668,2572,6122,2572,1668,1081,701, }, + { 0,701,1081,1668,2572,6122,2572,1668, }, + }, + /* pred_R real differential */ + { + { 0,125,399,1269,12798,1269,399,125, }, + { 0,744,1327,2365,7512,2365,1327,744, }, + { 0,1354,2413,7664,2413,1354,760,426, }, + { 0,426,760,1354,2413,7664,2413,1354, }, + }, + /* pred_R real : values for general and differential */ + { -3,-2,-1,0,1,2,3 },{ -3,-2,-1,0,1,2,3 }, + /* pred_R real : num dyn models for general and differential */ + 4, 4 + }, + /* entry for 15 quantization points for br_table_idx < 2 */ + { + /* pred real */ + { + { 0,9,23,56,133,318,757,1800,10192,1800,757,318,133,56,23,9, }, + { 0,156,240,371,573,883,1363,2102,5008,2102,1363,883,573,371,240,156, }, + { 0,241,372,575,886,1367,2109,5027,2109,1367,886,575,372,241,156,101, }, + { 0,101,156,241,372,575,886,1367,2109,5027,2109,1367,886,575,372,241, } + }, + /* pred real differential */ + { + { 0,1,3,12,39,125,397,1260,12710,1260,397,125,39,12,3,1, }, + { 0,66,119,212,378,674,1201,2140,6804,2140,1201,674,378,212,119,66, }, + { 0,119,212,379,675,1203,2144,6816,2144,1203,675,379,212,119,67,37, }, + { 0,37,67,119,212,379,675,1203,2144,6816,2144,1203,675,379,212,119, } + }, + /* pred real : values for general and differential */ + {-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7}, + { -7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7 }, + /* pred real : num dyn models for general and differential */ + 4, 4 + }, + /* entry for 21 quantization points for br_table_idx < 2 */ + { + /* pred_R real */ + { + { 0,1,1,4,9,23,56,133,318,756,1799,10184,1799,756,318,133,56,23,9,4,1,1, }, + { 0,41,64,98,152,234,362,558,861,1329,2049,4888,2049,1329,861,558,362,234,152,98,64,41, }, + { 0,64,98,152,235,362,559,862,1330,2051,4891,2051,1330,862,559,362,235,152,98,64,41,26, }, + { 0,26,41,64,98,152,235,362,559,862,1330,2051,4891,2051,1330,862,559,362,235,152,98,64, }, + }, + /* pred_R real differential */ + { + { 0,1,1,1,1,3,12,39,125,397,1260,12704,1260,397,125,39,12,3,1,1,1,1, }, + { 0,11,20,37,66,118,210,375,668,1191,2122,6748,2122,1191,668,375,210,118,66,37,20,11, }, + { 0,20,37,66,118,210,375,668,1191,2123,6751,2123,1191,668,375,210,118,66,37,20,11,6, }, + { 0,6,11,20,37,66,118,210,375,668,1191,2123,6751,2123,1191,668,375,210,118,66,37,20, }, + }, + /* pred_R real : values for general and differential */ + { -10,-9,-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9,10 }, + { -10,-9,-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9,10 }, + /* pred_R real : num dyn models for general and differential */ + 4, 4 + } +}; + +const ivas_freq_models_t ivas_arith_drct_r_consts[TOTAL_DRCT_QUANT_STRATS] = +{ + /* entry for 1 quantization points */ + { + /* drct real */ + { + { 0,16384, }, + { 0,16384, }, + { 0,16384, }, + { 0,16384, }, + }, + /* drct real differential */ + { + { 0,16384, }, + { 0,16384, }, + { 0,16384, }, + { 0,16384, }, + }, + /* drct real : values for general and differential */ + {0},{ 0 }, + /* drct real : num dyn models for general and differential */ + 4, 4 + }, + /* entry for 7 quantization points */ + { /* drct real */ + { + { 0,125,399,1269,12798,1269,399,125, }, + { 0,744,1327,2365,7512,2365,1327,744, }, + { 0,988,1244,1568,1976,2489,3136,4983, }, + { 0,2111,2262,2425,2788,2425,2262,2111, }, + }, + /* drct real differential */ + { + { 0,125,399,1269,12798,1269,399,125, }, + { 0,744,1327,2365,7512,2365,1327,744, }, + { 0,1354,2413,7664,2413,1354,760,426, }, + { 0,426,760,1354,2413,7664,2413,1354, }, + }, + /* drct real : values for general and differential */ + { -3,-2,-1,0,1,2,3 },{ -3,-2,-1,0,1,2,3 }, + /* drct real : num dyn models for general and differential */ + 4, 4 + }, + /* entry for 9 quantization points */ + { + /* drct real */ + { + { 0,39,125,397,1263,12736,1263,397,125,39, }, + { 0,397,708,1262,2250,7150,2250,1262,708,397, }, + { 0,573,722,909,1146,1444,1819,2292,2888,4591, }, + { 0,1587,1701,1824,1955,2250,1955,1824,1701,1587, }, + }, + /* drct real differential */ + { + { 0,39,125,397,1263,12736,1263,397,125,39, }, + { 0,397,708,1262,2250,7150,2250,1262,708,397, }, + { 0,716,1276,2274,7225,2274,1276,716,402,225, }, + { 0,225,402,716,1276,2274,7225,2274,1276,716, } + }, + /* drct real : values for general and differential */ + { -4,-3,-2,-1,0,1,2,3,4 },{ -4,-3,-2,-1,0,1,2,3,4 }, + /* drct real : num dyn models for general and differential */ + 4, 4 + }, + /* entry for 11 quantization points */ + { + /* drct real */ + { + { 0,12,39,125,397,1261,12716,1261,397,125,39,12, }, + { 0,217,387,689,1229,2190,6960,2190,1229,689,387,217, }, + { 0,343,433,546,687,866,1092,1375,1733,2184,2751,4374, }, + { 0,1254,1344,1441,1544,1655,1908,1655,1544,1441,1344,1254, }, + }, + /* drct real differential */ + { + { 0,12,39,125,397,1261,12716,1261,397,125,39,12, }, + { 0,217,387,689,1229,2190,6960,2190,1229,689,387,217, }, + { 0,389,694,1236,2203,7000,2203,1236,694,389,218,122, }, + { 0,122,218,389,694,1236,2203,7000,2203,1236,694,389, }, + }, + /* drct real : values for general and differential */ + { -5,-4,-3,-2,-1,0,1,2,3,4,5 },{ -5,-4,-3,-2,-1,0,1,2,3,4,5 }, + /* drct real : num dyn models for general and differential */ + 4, 4 + } +}; + +const ivas_freq_models_t ivas_arith_decd_r_consts[TOTAL_DECD_QUANT_STRATS] = +{ + /* entry for 1 quantization points */ + { + /* decd real */ + { + { 0,16384, }, + { 0,16384, }, + { 0,16384, }, + { 0,16384, }, + }, + /* decd real differential */ + { + { 0,16384, }, + { 0,16384, }, + { 0,16384, }, + { 0,16384, }, + }, + /* decd real : values for general and differential */ + { 0 },{ 0 }, + /* decd real : num dyn models for general and differential */ + 4, 4 + }, + /* entry for 3 quantization points */ + { + /* decd real */ + { + { 0,11917,2978,1489, }, + { 0,8840,4419,3125, }, + { 0,4567,7250,4567, }, + { 0,5203,5978,5203, }, + }, + /* decd real differential */ + { + { 0,1356,13672,1356, }, + { 0,3166,10052,3166, }, + { 0,10984,3459,1941, }, + { 0,1941,3459,10984, }, + }, + /* decd real : values for general and differential */ + { 0,1,2 },{-1,0,1}, + /* decd real : num dyn models for general and differential */ + 4, 4 + }, + /* entry for 5 quantization points */ + { + /* decd real */ + { + { 0,11157,2788,1394,697,348, }, + { 0,7186,3592,2540,1796,1270, }, + { 0,2512,3166,5028,3166,2512, }, + { 0,3048,3267,3754,3267,3048, }, + }, + /* decd real differential */ + { + { 0,406,1289,12994,1289,406, }, + { 0,1460,2601,8262,2601,1460, }, + { 0,2707,8599,2707,1519,852, }, + { 0,852,1519,2707,8599,2707, }, + }, + /* decd real : values for general and differential */ + { 0,1,2,3,4 },{ -2,-1,0,1,2 }, + /* decd real : num dyn models for general and differential */ + 4, 4 + }, + /* entry for 7 quantization points */ + { + /* decd real */ + { + { 0,10983,2744,1372,686,343,171,85, }, + { 0,6573,3285,2322,1642,1161,821,580, }, + { 0,1603,2020,2546,4046,2546,2020,1603, }, + { 0,2111,2262,2425,2788,2425,2262,2111, }, + }, + /* decd real differential */ + { + { 0,125,399,1269,12798,1269,399,125, }, + { 0,744,1327,2365,7512,2365,1327,744, }, + { 0,1354,2413,7664,2413,1354,760,426, }, + { 0,426,760,1354,2413,7664,2413,1354, } + }, + /* decd real : values for general and differential */ + { 0,1,2,3,4,5,6 },{ -3,-2,-1,0,1,2,3 }, + /* decd real : num dyn models for general and differential */ + 4, 4 + }, + /* entry for 9 quantization points */ + { /* decd real */ + { + { 0,10941,2734,1367,683,341,170,85,42,21, }, + { 0,6305,3150,2227,1575,1113,787,556,393,278, }, + { 0,1101,1388,1749,2203,3502,2203,1749,1388,1101, }, + { 0,1587,1701,1824,1955,2250,1955,1824,1701,1587, }, + }, + /* decd real differential */ + { + { 0,39,125,397,1263,12736,1263,397,125,39, }, + { 0,397,708,1262,2250,7150,2250,1262,708,397, }, + { 0,716,1276,2274,7225,2274,1276,716,402,225, }, + { 0,225,402,716,1276,2274,7225,2274,1276,716, } + }, + /* decd real : values for general and differential */ + { 0,1,2,3,4,5,6,7,8 },{ -4,-3,-2,-1,0,1,2,3,4 }, + /* decd real : num dyn models for general and differential */ + 4, 4 + }, + /* entry for 11 quantization points */ + { + /* decd real */ + { + { 0,10932,2731,1365,682,341,170,85,42,21,10,5, }, + { 0,6181,3086,2182,1543,1091,771,545,385,272,192,136, }, + { 0,790,995,1254,1580,1991,3164,1991,1580,1254,995,790, }, + { 0,1254,1344,1441,1544,1655,1908,1655,1544,1441,1344,1254, }, + }, + /* decd real differential */ + { + { 0,12,39,125,397,1261,12716,1261,397,125,39,12, }, + { 0,217,387,689,1229,2190,6960,2190,1229,689,387,217, }, + { 0,389,694,1236,2203,7000,2203,1236,694,389,218,122, }, + { 0,122,218,389,694,1236,2203,7000,2203,1236,694,389, }, + }, + /* decd real : values for general and differential */ + { 0,1,2,3,4,5,6,7,8,9,10 },{ -5,-4,-3,-2,-1,0,1,2,3,4,5 }, + /* decd real : num dyn models for general and differential */ + 4, 4 + } +}; + +const ivas_huff_models_t ivas_huff_pred_r_consts[TOTAL_PRED_QUANT_STRATS_HUFF] = +{ + /* entry for 1 quantization points for br_table_idx */ + {{{ 0 }}, {{ 0 }}}, + /* entry for 7 quantization points for br_table_idx */ + { + /* pred_R codebook */ + { { -3,3,2 },{ -2,3,3 },{ -1,3,4 },{ 0,2,0 },{ 1,3,5 },{ 2,3,6 },{ 3,3,7 }, }, + /* pred_R differential codebook */ + { { -3,3,2 },{ -2,3,3 },{ -1,3,4 },{ 0,2,0 },{ 1,3,5 },{ 2,3,6 },{ 3,3,7 }, }, + }, + /* entry for 15 quantization points for br_table_idx */ + { + /* pred_r codebook */ + { { -7,4,2 },{ -6,4,3 },{ -5, 4, 4 },{ -4, 4, 5 },{ -3,4,6 },{ -2,4,7 },{ -1,4,8 }, + { 0,3,0 },{ 1,4,9 },{ 2,4,10 },{ 3,4,11 },{ 4,4,12 },{ 5,4,13 },{ 6,4,14 },{ 7,4,15 } }, + /* pred_r differential codebook */ + { { -7,4,2 },{ -6,4,3 },{ -5, 4, 4 },{ -4, 4, 5 },{ -3,4,6 },{ -2,4,7 },{ -1,4,8 }, + { 0,3,0 },{ 1,4,9 },{ 2,4,10 },{ 3,4,11 },{ 4,4,12 },{ 5,4,13 },{ 6,4,14 },{ 7,4,15 } }, + }, + /* entry for 21 quantization points for br_table_idx=0 */ + { + /* pred_r codebook */ + { {-10,5,22},{-9,5,23},{-8,5,24},{-7,5,25},{-6,5,26}, { -5, 4, 0 },{ -4, 4, 1 },{ -3,4,2 },{ -2,4,3 },{ -1,4,4 }, + { 0,4,5 },{ 1,4,6 },{ 2,4,7 },{ 3,4,8 },{ 4,4,9 },{ 5,4,10 },{6,5,27},{7,5,28},{8,5,29},{9,5,30},{10,5,31} }, + /* pred_r differential codebook */ + { { -10,5,22 },{ -9,5,23 },{ -8,5,24 },{ -7,5,25 },{ -6,5,26 },{ -5, 4, 0 },{ -4, 4, 1 },{ -3,4,2 },{ -2,4,3 },{ -1,4,4 }, + { 0,4,5 },{ 1,4,6 },{ 2,4,7 },{ 3,4,8 },{ 4,4,9 },{ 5,4,10 },{ 6,5,27 },{ 7,5,28 },{ 8,5,29 },{ 9,5,30 },{ 10,5,31 } }, + }, + + /* entry for 31 quantization points for br_table_idx>0 */ + { + /* pred_r codebook */ + { {-15,5,2},{-14,5,3},{-13,5,4},{-12,5,5},{-11,5,6}, { -10,5,7 },{ -9,5,8 },{ -8,5,9 }, + { -7,5,10 },{ -6,5,11 },{ -5, 5, 12 },{ -4, 5, 13 },{ -3,5,14 },{ -2,5,15 },{ -1,5,16 }, + { 0,4,0 },{ 1,5,17 },{ 2,5,18 },{ 3,5,19 },{ 4,5,20 },{ 5,5,21 },{ 6,5,22 },{ 7,5,23 }, + { 8,5,24 },{ 9,5,25 },{ 10,5,26 },{11,5,27},{12,5,28},{13,5,29},{14,5,30},{15,5,31} }, + /* pred_r differential codebook */ + { { -15,5,2 },{ -14,5,3 },{ -13,5,4 },{ -12,5,5 },{ -11,5,6 },{ -10,5,7 },{ -9,5,8 },{ -8,5,9 }, + { -7,5,10 },{ -6,5,11 },{ -5, 5, 12 },{ -4, 5, 13 },{ -3,5,14 },{ -2,5,15 },{ -1,5,16 }, + { 0,4,0 },{ 1,5,17 },{ 2,5,18 },{ 3,5,19 },{ 4,5,20 },{ 5,5,21 },{ 6,5,22 },{ 7,5,23 }, + { 8,5,24 },{ 9,5,25 },{ 10,5,26 },{ 11,5,27 },{ 12,5,28 },{ 13,5,29 },{ 14,5,30 },{ 15,5,31 } }, + }, + }; + + const ivas_huff_models_t ivas_huff_drct_r_consts[TOTAL_DRCT_QUANT_STRATS] = +{ + /* entry for 1 quantization points */ + {{{ 0 }}, {{ 0 }}}, + /* entry for 7 quantization points */ + { + /* drct_r codebook */ + { { -3,3,2 },{ -2,3,3 },{ -1,3,4 },{ 0,2,0 },{ 1,3,5 },{ 2,3,6 },{ 3,3,7 } }, + /* drct_r differential codebook */ + { { -3,3,2 },{ -2,3,3 },{ -1,3,4 },{ 0,2,0 },{ 1,3,5 },{ 2,3,6 },{ 3,3,7 } }, + }, + /* entry for 9 quantization points */ + { + /* drct_r codebook */ + { { -4, 4, 14 },{ -3,3,0 },{ -2,3,1 },{ -1,3,2 },{ 0,3,3 },{ 1,3,4 },{ 2,3,5 },{ 3,3,6 },{ 4,4,15 } }, + /* drct_r differential codebook */ + { { -4, 4, 14 },{ -3,3,0 },{ -2,3,1 },{ -1,3,2 },{ 0,3,3 },{ 1,3,4 },{ 2,3,5 },{ 3,3,6 },{ 4,4,15 } }, + }, + /* entry for 11 quantization points */ + { + /* drct_r codebook */ + { { -5, 4, 10 },{ -4, 4, 11 },{ -3,4,12 },{ -2,3,0 },{ -1,3,1 },{ 0,3,2 },{ 1,3,3 },{ 2,3,4 },{ 3,4,13 },{ 4,4,14 },{ 5,4,15 } }, + /* drct_r differential codebook */ + { { -5, 4, 10 },{ -4, 4, 11 },{ -3,4,12 },{ -2,3,0 },{ -1,3,1 },{ 0,3,2 },{ 1,3,3 },{ 2,3,4 },{ 3,4,13 },{ 4,4,14 },{ 5,4,15 } }, + }, +}; + +const ivas_huff_models_t ivas_huff_decd_r_consts[TOTAL_DECD_QUANT_STRATS] = +{ + /* entry for 1 quantization points */ + {{{ 0 }}, {{ 0 }}}, + /* entry for 3 quantization points */ + { + /* decd_r codebook */ + { { 0, 2, 2 },{ 1, 1, 0 },{ 2,2,3 } }, + /* decd_r differential codebook */ + { { -1, 2, 2 },{ 0, 1, 0 },{ 1,2,3 } }, + }, + /* entry for 5 quantization points */ + { + /* decd_r codebook */ + { { 0,3,6 },{ 1,2,0 },{ 2,2,1 },{ 3,2,2 },{ 4,3,7 } }, + /* decd_r differential codebook */ + { { -2,3,6 },{ -1,2,0 },{ 0,2,1 },{ 1,2,2 },{ 2,3,7 } }, + }, + /* entry for 7 quantization points */ + { + /* decd_r */ + { { 0, 3, 2 },{ 1, 3, 3 },{ 2,3,4 },{ 3,3,0 },{ 4,3,5 },{ 5,3,6 },{ 6,3,7 } }, + /* decd_r codebook differential codebook */ + { { -3, 3, 2 },{ -2, 3, 3 },{ -1,3,4 },{ 0,3,0 },{ 1,3,5 },{ 2,3,6 },{ 3,3,7 } }, + }, + /* entry for 9 quantization points */ + { + /* decd_r codebook */ + { { 0, 4, 14 },{ 1,3,0 },{ 2,3,1 },{ 3,3,2 },{ 4,3,3 },{ 5,3,4 },{ 6,3,5 },{ 7,3,6 },{ 8,4,15 } }, + /* decd_r differential codebook */ + { { -4, 4, 14 },{ -3,3,0 },{ -2,3,1 },{ -1,3,2 },{ 0,3,3 },{ 1,3,4 },{ 2,3,5 },{ 3,3,6 },{ 4,4,15 } }, + }, + /* entry for 11 quantization points */ + { + /* decd_r codebook */ + { { 0, 4, 10 },{ 1, 4, 11 },{ 2,4,12 },{ 3,3,0 },{ 4,3,1 },{ 5,3,2 },{ 6,3,3 },{ 7,3,4 },{ 8,4,13 },{ 9,4,14 },{ 10,4,15 } }, + /* decd_r differential codebook */ + { { -5, 4, 10 },{ -4, 4, 11 },{ -3,4,12 },{ -2,3,0 },{ -1,3,1 },{ 0,3,2 },{ 1,3,3 },{ 2,3,4 },{ 3,4,13 },{ 4,4,14 },{ 5,4,15 } }, + }, +}; + +/* DTX quantization and bitstream constants */ + +const float dtx_pd_real_min_max[2] = { 0, 1.6f }; +const int16_t dtx_pd_real_q_levels[3][3] = { { 7,7,7 },{ 7,7,0 },{ 3,0,0 } }; +const int16_t dtx_pr_real_q_levels[3][3] = { { 9,9,9 },{ 9,7,9 },{ 9,5,7 } }; +const int16_t pr_pr_idx_pairs[3][3][2] = { { { 0, 0 },{ 0, 0 },{ 0, 0 } },{ { 0, 0 },{ 0, 0 },{ 0, 0 } },{ { 0, 0 },{ 1, 3 },{ 0, 0 } } }; +const int16_t pr_pd_idx_pairs[3][3][2] = { { { 1, 1 },{ 2, 2 },{ 3, 3 } },{ { 1, 1 },{ 3, 2 },{ 2, 0 } },{ { 2, 1 },{ 0, 0 },{ 0, 0 } } }; + +const int16_t remix_order_set[1][DIRAC_MAX_ANA_CHANS] = { /* WYZX --> WYXZ... */ + { 0, 1, 3, 2, 4, 5, 6, 7, 8, 9, 10 } +}; + +const int16_t HOA_keep_ind[IVAS_SPAR_MAX_FB_IN_CHAN] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 15}; +const int16_t HOA_keep_ind_spar[IVAS_SPAR_MAX_CH] = {0, 1, 2, 3, 4, 8, 9, 10, 10, 10, 10}; +const int16_t HOA_keep_ind_spar512[IVAS_SPAR_MAX_CH] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; + + +/*----------------------------------------------------------------------* +* PCA ROM tables +*-----------------------------------------------------------------------*/ + +const int32_t ivas_pca_offset_index1[IVAS_PCA_N1 + 1] = +{ + 0, 1, 9, 61, 163, 359, 685, 1125, 1747, + 2519, 3521, 4713, 6183, 7883, 9809, 12093, 14633, 17575, + 20807, 24343, 28181, 32487, 37121, 42097, 47405, 53057, 59061, + 65421, 72137, 79205, 86625, 94415, 102345, 110629, 119263, 128017, + 137097, 146515, 156043, 165637, 175551, 185515, 195535, 205837, 216183, + 226545, 236911, 247273, 257619, 267921, 277941, 287905, 297819, 307413, + 316941, 326359, 335439, 344193, 352827, 361111, 369041, 376831, 384251, + 391319, 398035, 404395, 410399, 416051, 421359, 426335, 430969, 435275, + 439113, 442649, 445881, 448823, 451363, 453647, 455573, 457273, 458743, + 459935, 460937, 461709, 462331, 462771, 463097, 463293, 463395, 463447, + 463455, 463456 +}; + +const int16_t ivas_pca_offset_index2[2692] = +{ + 0, 1, 0, 1, 7, 8, 0, 1, 7, 19, + 33, 45, 51, 52, 0, 1, 9, 23, 41, 61, + 79, 93, 101, 102, 0, 1, 7, 21, 39, 61, + 85, 111, 135, 157, 175, 189, 195, 196, 0, 1, + 7, 19, 37, 59, 85, 115, 147, 179, 211, 241, + 267, 289, 307, 319, 325, 326, 0, 1, 7, 21, + 41, 65, 95, 127, 163, 201, 239, 277, 313, 345, + 375, 399, 419, 433, 439, 440, 0, 1, 7, 19, + 37, 61, 91, 125, 163, 203, 245, 289, 333, 377, + 419, 459, 497, 531, 561, 585, 603, 615, 621, 622, + 0, 1, 7, 21, 41, 67, 97, 133, 173, 217, + 263, 311, 361, 411, 461, 509, 555, 599, 639, 675, + 705, 731, 751, 765, 771, 772, 0, 1, 7, 19, + 37, 61, 91, 127, 167, 211, 259, 309, 363, 417, + 473, 529, 585, 639, 693, 743, 791, 835, 875, 911, + 941, 965, 983, 995, 1001, 1002, 0, 1, 7, 21, + 41, 67, 99, 135, 177, 223, 273, 327, 383, 443, + 503, 565, 627, 689, 749, 809, 865, 919, 969, 1015, + 1057, 1093, 1125, 1151, 1171, 1185, 1191, 1192, 0, 1, + 7, 19, 37, 61, 91, 127, 169, 215, 265, 319, + 377, 437, 501, 567, 633, 701, 769, 837, 903, 969, + 1033, 1093, 1151, 1205, 1255, 1301, 1343, 1379, 1409, 1433, + 1451, 1463, 1469, 1470, 0, 1, 7, 21, 41, 67, + 99, 137, 179, 227, 279, 335, 395, 459, 525, 595, + 667, 739, 813, 887, 961, 1033, 1105, 1175, 1241, 1305, + 1365, 1421, 1473, 1521, 1563, 1601, 1633, 1659, 1679, 1693, + 1699, 1700, 0, 1, 9, 23, 43, 69, 101, 139, + 183, 231, 285, 343, 405, 471, 541, 613, 689, 765, + 843, 923, 1003, 1083, 1161, 1237, 1313, 1385, 1455, 1521, + 1583, 1641, 1695, 1743, 1787, 1825, 1857, 1883, 1903, 1917, + 1925, 1926, 0, 1, 7, 21, 41, 67, 99, 137, + 179, 227, 281, 339, 401, 467, 537, 611, 687, 767, + 849, 931, 1015, 1099, 1185, 1269, 1353, 1435, 1517, 1597, + 1673, 1747, 1817, 1883, 1945, 2003, 2057, 2105, 2147, 2185, + 2217, 2243, 2263, 2277, 2283, 2284, 0, 1, 7, 21, + 41, 67, 99, 137, 181, 231, 285, 345, 409, 477, + 549, 625, 705, 787, 871, 957, 1045, 1135, 1225, 1315, + 1405, 1495, 1583, 1669, 1753, 1835, 1915, 1991, 2063, 2131, + 2195, 2255, 2309, 2359, 2403, 2441, 2473, 2499, 2519, 2533, + 2539, 2540, 0, 1, 7, 19, 39, 65, 97, 135, + 177, 225, 279, 337, 401, 469, 541, 617, 697, 781, + 867, 955, 1045, 1137, 1231, 1327, 1423, 1519, 1615, 1711, + 1805, 1897, 1987, 2075, 2161, 2245, 2325, 2401, 2473, 2541, + 2605, 2663, 2717, 2765, 2807, 2845, 2877, 2903, 2923, 2935, + 2941, 2942, 0, 1, 7, 21, 41, 67, 99, 137, + 181, 229, 283, 343, 407, 477, 551, 629, 711, 797, + 885, 977, 1071, 1167, 1265, 1365, 1465, 1565, 1667, 1767, + 1867, 1967, 2065, 2161, 2255, 2347, 2435, 2521, 2603, 2681, + 2755, 2825, 2889, 2949, 3003, 3051, 3095, 3133, 3165, 3191, + 3211, 3225, 3231, 3232, 0, 1, 7, 21, 41, 67, + 99, 137, 181, 231, 287, 347, 413, 483, 559, 639, + 723, 811, 903, 997, 1093, 1193, 1295, 1399, 1503, 1609, + 1715, 1821, 1927, 2033, 2137, 2241, 2343, 2443, 2539, 2633, + 2725, 2813, 2897, 2977, 3053, 3123, 3189, 3249, 3305, 3355, + 3399, 3437, 3469, 3495, 3515, 3529, 3535, 3536, 0, 1, + 7, 21, 41, 67, 99, 137, 181, 231, 287, 349, + 415, 487, 563, 645, 731, 821, 915, 1011, 1111, 1213, + 1317, 1423, 1531, 1641, 1751, 1863, 1975, 2087, 2197, 2307, + 2415, 2521, 2625, 2727, 2827, 2923, 3017, 3107, 3193, 3275, + 3351, 3423, 3489, 3551, 3607, 3657, 3701, 3739, 3771, 3797, + 3817, 3831, 3837, 3838, 0, 1, 7, 21, 41, 67, + 99, 137, 181, 231, 285, 345, 411, 481, 557, 637, + 721, 809, 901, 997, 1097, 1199, 1305, 1413, 1523, 1635, + 1749, 1863, 1979, 2095, 2211, 2327, 2443, 2557, 2671, 2783, + 2893, 3001, 3107, 3209, 3309, 3405, 3497, 3585, 3669, 3749, + 3825, 3895, 3961, 4021, 4075, 4125, 4169, 4207, 4239, 4265, + 4285, 4299, 4305, 4306, 0, 1, 7, 21, 41, 67, + 99, 137, 181, 231, 287, 347, 413, 485, 561, 643, + 729, 819, 913, 1011, 1113, 1217, 1325, 1435, 1547, 1663, + 1779, 1897, 2017, 2137, 2257, 2377, 2497, 2617, 2737, 2855, + 2971, 3087, 3199, 3309, 3417, 3521, 3623, 3721, 3815, 3905, + 3991, 4073, 4149, 4221, 4287, 4347, 4403, 4453, 4497, 4535, + 4567, 4593, 4613, 4627, 4633, 4634, 0, 1, 7, 21, + 41, 67, 99, 137, 181, 231, 287, 349, 415, 487, + 565, 647, 733, 825, 921, 1021, 1125, 1231, 1341, 1453, + 1569, 1687, 1807, 1929, 2051, 2175, 2299, 2425, 2551, 2677, + 2801, 2925, 3047, 3169, 3289, 3407, 3523, 3635, 3745, 3851, + 3955, 4055, 4151, 4243, 4329, 4411, 4489, 4561, 4627, 4689, + 4745, 4795, 4839, 4877, 4909, 4935, 4955, 4969, 4975, 4976, + 0, 1, 7, 21, 41, 67, 99, 137, 181, 231, + 287, 349, 417, 489, 567, 649, 737, 829, 925, 1025, + 1129, 1237, 1349, 1463, 1581, 1701, 1823, 1947, 2073, 2201, + 2329, 2459, 2589, 2719, 2849, 2979, 3107, 3235, 3361, 3485, + 3607, 3727, 3845, 3959, 4071, 4179, 4283, 4383, 4479, 4571, + 4659, 4741, 4819, 4891, 4959, 5021, 5077, 5127, 5171, 5209, + 5241, 5267, 5287, 5301, 5307, 5308, 0, 1, 7, 21, + 41, 67, 99, 137, 181, 231, 287, 349, 417, 489, + 567, 651, 739, 831, 929, 1031, 1137, 1247, 1361, 1477, + 1597, 1719, 1843, 1969, 2097, 2227, 2359, 2491, 2625, 2759, + 2893, 3027, 3161, 3293, 3425, 3555, 3683, 3809, 3933, 4055, + 4175, 4291, 4405, 4515, 4621, 4723, 4821, 4913, 5001, 5085, + 5163, 5235, 5303, 5365, 5421, 5471, 5515, 5553, 5585, 5611, + 5631, 5645, 5651, 5652, 0, 1, 7, 21, 41, 67, + 99, 137, 181, 231, 287, 349, 417, 491, 569, 653, + 741, 835, 933, 1035, 1141, 1251, 1365, 1483, 1603, 1727, + 1853, 1983, 2115, 2249, 2383, 2519, 2657, 2795, 2933, 3071, + 3209, 3347, 3485, 3621, 3755, 3889, 4021, 4151, 4277, 4401, + 4521, 4639, 4753, 4863, 4969, 5071, 5169, 5263, 5351, 5435, + 5513, 5587, 5655, 5717, 5773, 5823, 5867, 5905, 5937, 5963, + 5983, 5997, 6003, 6004, 0, 1, 7, 21, 41, 67, + 99, 137, 181, 231, 287, 349, 417, 491, 569, 653, + 741, 835, 933, 1037, 1145, 1257, 1373, 1491, 1613, 1739, + 1867, 1997, 2131, 2267, 2405, 2543, 2683, 2825, 2967, 3109, + 3251, 3393, 3535, 3677, 3817, 3955, 4093, 4229, 4363, 4493, + 4621, 4747, 4869, 4987, 5103, 5215, 5323, 5427, 5525, 5619, + 5707, 5791, 5869, 5943, 6011, 6073, 6129, 6179, 6223, 6261, + 6293, 6319, 6339, 6353, 6359, 6360, 0, 1, 7, 21, + 41, 67, 99, 137, 181, 231, 287, 349, 417, 491, + 569, 653, 743, 837, 935, 1039, 1147, 1259, 1375, 1495, + 1619, 1745, 1875, 2007, 2143, 2281, 2421, 2563, 2705, 2849, + 2993, 3139, 3285, 3431, 3577, 3723, 3867, 4011, 4153, 4295, + 4435, 4573, 4709, 4841, 4971, 5097, 5221, 5341, 5457, 5569, + 5677, 5781, 5879, 5973, 6063, 6147, 6225, 6299, 6367, 6429, + 6485, 6535, 6579, 6617, 6649, 6675, 6695, 6709, 6715, 6716, + 0, 1, 7, 21, 41, 67, 99, 137, 181, 231, + 287, 349, 417, 491, 569, 653, 743, 837, 937, 1041, + 1149, 1261, 1377, 1497, 1621, 1749, 1879, 2013, 2149, 2287, + 2429, 2573, 2717, 2863, 3011, 3159, 3309, 3459, 3609, 3759, + 3909, 4057, 4205, 4351, 4495, 4639, 4781, 4919, 5055, 5189, + 5319, 5447, 5571, 5691, 5807, 5919, 6027, 6131, 6231, 6325, + 6415, 6499, 6577, 6651, 6719, 6781, 6837, 6887, 6931, 6969, + 7001, 7027, 7047, 7061, 7067, 7068, 0, 1, 7, 21, + 41, 67, 99, 137, 181, 231, 287, 349, 417, 491, + 569, 653, 743, 837, 937, 1041, 1149, 1261, 1377, 1497, + 1621, 1749, 1881, 2015, 2153, 2293, 2435, 2579, 2725, 2873, + 3023, 3175, 3327, 3479, 3633, 3787, 3941, 4093, 4245, 4397, + 4547, 4695, 4841, 4985, 5127, 5267, 5405, 5539, 5671, 5799, + 5923, 6043, 6159, 6271, 6379, 6483, 6583, 6677, 6767, 6851, + 6929, 7003, 7071, 7133, 7189, 7239, 7283, 7321, 7353, 7379, + 7399, 7413, 7419, 7420, 0, 1, 7, 21, 41, 67, + 99, 137, 181, 231, 287, 349, 417, 489, 567, 651, + 741, 835, 935, 1039, 1147, 1259, 1377, 1499, 1625, 1753, + 1885, 2021, 2159, 2301, 2445, 2591, 2739, 2889, 3041, 3195, + 3349, 3505, 3661, 3817, 3973, 4129, 4285, 4441, 4595, 4749, + 4901, 5051, 5199, 5345, 5489, 5631, 5769, 5905, 6037, 6165, + 6291, 6413, 6531, 6643, 6751, 6855, 6955, 7049, 7139, 7223, + 7301, 7373, 7441, 7503, 7559, 7609, 7653, 7691, 7723, 7749, + 7769, 7783, 7789, 7790, 0, 1, 7, 21, 41, 67, + 99, 137, 181, 231, 287, 349, 417, 491, 571, 657, + 747, 843, 945, 1051, 1161, 1277, 1397, 1521, 1649, 1781, + 1915, 2053, 2195, 2339, 2485, 2635, 2787, 2941, 3095, 3251, + 3409, 3567, 3725, 3885, 4045, 4205, 4363, 4521, 4679, 4835, + 4989, 5143, 5295, 5445, 5591, 5735, 5877, 6015, 6149, 6281, + 6409, 6533, 6653, 6769, 6879, 6985, 7087, 7183, 7273, 7359, + 7439, 7513, 7581, 7643, 7699, 7749, 7793, 7831, 7863, 7889, + 7909, 7923, 7929, 7930, 0, 1, 7, 21, 41, 67, + 99, 137, 181, 231, 287, 349, 417, 491, 571, 657, + 747, 843, 943, 1049, 1159, 1273, 1393, 1517, 1645, 1777, + 1913, 2051, 2193, 2337, 2485, 2635, 2787, 2941, 3097, 3255, + 3415, 3575, 3737, 3899, 4061, 4223, 4385, 4547, 4709, 4869, + 5029, 5187, 5343, 5497, 5649, 5799, 5947, 6091, 6233, 6371, + 6507, 6639, 6767, 6891, 7011, 7125, 7235, 7341, 7441, 7537, + 7627, 7713, 7793, 7867, 7935, 7997, 8053, 8103, 8147, 8185, + 8217, 8243, 8263, 8277, 8283, 8284, 0, 1, 7, 21, + 41, 67, 99, 137, 181, 231, 287, 349, 417, 491, + 571, 655, 745, 841, 941, 1047, 1157, 1271, 1389, 1513, + 1641, 1773, 1907, 2045, 2187, 2331, 2479, 2629, 2783, 2939, + 3097, 3257, 3417, 3579, 3743, 3907, 4071, 4235, 4399, 4563, + 4727, 4891, 5055, 5217, 5377, 5537, 5695, 5851, 6005, 6155, + 6303, 6447, 6589, 6727, 6861, 6993, 7121, 7245, 7363, 7477, + 7587, 7693, 7793, 7889, 7979, 8063, 8143, 8217, 8285, 8347, + 8403, 8453, 8497, 8535, 8567, 8593, 8613, 8627, 8633, 8634, + 0, 1, 7, 21, 41, 67, 99, 137, 181, 231, + 287, 349, 417, 491, 571, 657, 749, 845, 947, 1053, + 1165, 1281, 1401, 1527, 1657, 1791, 1929, 2069, 2213, 2361, + 2511, 2663, 2819, 2977, 3137, 3299, 3463, 3627, 3793, 3959, + 4125, 4293, 4461, 4629, 4795, 4961, 5127, 5291, 5455, 5617, + 5777, 5935, 6091, 6243, 6393, 6541, 6685, 6825, 6963, 7097, + 7227, 7353, 7473, 7589, 7701, 7807, 7909, 8005, 8097, 8183, + 8263, 8337, 8405, 8467, 8523, 8573, 8617, 8655, 8687, 8713, + 8733, 8747, 8753, 8754, 0, 1, 7, 21, 41, 67, + 99, 137, 181, 231, 287, 349, 417, 491, 571, 657, + 747, 843, 943, 1049, 1159, 1275, 1395, 1519, 1647, 1779, + 1915, 2055, 2199, 2345, 2495, 2647, 2803, 2961, 3121, 3283, + 3447, 3613, 3779, 3947, 4115, 4285, 4455, 4625, 4795, 4965, + 5133, 5301, 5467, 5633, 5797, 5959, 6119, 6277, 6433, 6585, + 6735, 6881, 7025, 7165, 7301, 7433, 7561, 7685, 7805, 7921, + 8031, 8137, 8237, 8333, 8423, 8509, 8589, 8663, 8731, 8793, + 8849, 8899, 8943, 8981, 9013, 9039, 9059, 9073, 9079, 9080, + 0, 1, 7, 19, 39, 65, 97, 135, 179, 229, + 285, 347, 415, 489, 567, 651, 741, 835, 935, 1041, + 1151, 1265, 1385, 1509, 1637, 1769, 1905, 2045, 2189, 2335, + 2485, 2637, 2793, 2951, 3111, 3273, 3437, 3603, 3771, 3939, + 4109, 4279, 4451, 4623, 4795, 4967, 5139, 5309, 5479, 5647, + 5815, 5981, 6145, 6307, 6467, 6625, 6781, 6933, 7083, 7229, + 7373, 7513, 7649, 7781, 7909, 8033, 8153, 8267, 8377, 8483, + 8583, 8677, 8767, 8851, 8929, 9003, 9071, 9133, 9189, 9239, + 9283, 9321, 9353, 9379, 9399, 9411, 9417, 9418, 0, 1, + 7, 21, 41, 67, 99, 137, 181, 231, 287, 349, + 417, 491, 571, 657, 747, 843, 945, 1051, 1163, 1279, + 1399, 1525, 1655, 1789, 1927, 2069, 2213, 2361, 2513, 2667, + 2825, 2985, 3147, 3311, 3477, 3645, 3815, 3985, 4157, 4329, + 4503, 4677, 4851, 5025, 5199, 5371, 5543, 5713, 5883, 6051, + 6217, 6381, 6543, 6703, 6861, 7015, 7167, 7315, 7459, 7601, + 7739, 7873, 8003, 8129, 8249, 8365, 8477, 8583, 8685, 8781, + 8871, 8957, 9037, 9111, 9179, 9241, 9297, 9347, 9391, 9429, + 9461, 9487, 9507, 9521, 9527, 9528, 0, 1, 7, 21, + 41, 67, 99, 137, 181, 231, 287, 349, 417, 491, + 571, 657, 749, 845, 947, 1055, 1167, 1285, 1407, 1533, + 1663, 1797, 1935, 2077, 2223, 2373, 2525, 2681, 2839, 3001, + 3165, 3331, 3499, 3669, 3839, 4011, 4185, 4359, 4533, 4709, + 4885, 5061, 5235, 5409, 5583, 5755, 5925, 6095, 6263, 6429, + 6593, 6755, 6913, 7069, 7221, 7371, 7517, 7659, 7797, 7931, + 8061, 8187, 8309, 8427, 8539, 8647, 8749, 8845, 8937, 9023, + 9103, 9177, 9245, 9307, 9363, 9413, 9457, 9495, 9527, 9553, + 9573, 9587, 9593, 9594, 0, 1, 7, 21, 41, 67, + 99, 137, 181, 231, 287, 349, 417, 491, 571, 655, + 745, 841, 941, 1047, 1157, 1273, 1393, 1517, 1647, 1781, + 1919, 2061, 2207, 2355, 2507, 2663, 2821, 2981, 3145, 3311, + 3479, 3649, 3821, 3993, 4167, 4341, 4517, 4693, 4869, 5045, + 5221, 5397, 5573, 5747, 5921, 6093, 6265, 6435, 6603, 6769, + 6933, 7093, 7251, 7407, 7559, 7707, 7853, 7995, 8133, 8267, + 8397, 8521, 8641, 8757, 8867, 8973, 9073, 9169, 9259, 9343, + 9423, 9497, 9565, 9627, 9683, 9733, 9777, 9815, 9847, 9873, + 9893, 9907, 9913, 9914, 0, 1, 7, 21, 41, 67, + 99, 137, 181, 231, 287, 349, 417, 491, 571, 657, + 747, 843, 945, 1051, 1163, 1279, 1401, 1527, 1657, 1791, + 1929, 2071, 2217, 2367, 2519, 2675, 2835, 2997, 3161, 3327, + 3495, 3665, 3837, 4011, 4185, 4361, 4537, 4715, 4893, 5071, + 5249, 5427, 5603, 5779, 5953, 6127, 6299, 6469, 6637, 6803, + 6967, 7129, 7289, 7445, 7597, 7747, 7893, 8035, 8173, 8307, + 8437, 8563, 8685, 8801, 8913, 9019, 9121, 9217, 9307, 9393, + 9473, 9547, 9615, 9677, 9733, 9783, 9827, 9865, 9897, 9923, + 9943, 9957, 9963, 9964, 0, 1, 7, 21, 41, 67, + 99, 137, 181, 231, 287, 349, 417, 491, 571, 657, + 749, 845, 947, 1055, 1167, 1285, 1407, 1533, 1663, 1799, + 1939, 2083, 2229, 2379, 2533, 2689, 2849, 3011, 3177, 3345, + 3515, 3687, 3861, 4035, 4211, 4387, 4565, 4743, 4921, 5099, + 5277, 5455, 5633, 5809, 5985, 6159, 6333, 6505, 6675, 6843, + 7009, 7171, 7331, 7487, 7641, 7791, 7937, 8081, 8221, 8357, + 8487, 8613, 8735, 8853, 8965, 9073, 9175, 9271, 9363, 9449, + 9529, 9603, 9671, 9733, 9789, 9839, 9883, 9921, 9953, 9979, + 9999, 10013, 10019, 10020, 0, 1, 7, 19, 39, 65, + 97, 135, 179, 229, 285, 347, 415, 489, 567, 651, + 741, 837, 937, 1043, 1153, 1269, 1389, 1513, 1643, 1777, + 1915, 2057, 2203, 2351, 2503, 2659, 2817, 2979, 3143, 3309, + 3477, 3647, 3819, 3993, 4169, 4345, 4523, 4701, 4881, 5061, + 5241, 5421, 5601, 5779, 5957, 6133, 6309, 6483, 6655, 6825, + 6993, 7159, 7323, 7485, 7643, 7799, 7951, 8099, 8245, 8387, + 8525, 8659, 8789, 8913, 9033, 9149, 9259, 9365, 9465, 9561, + 9651, 9735, 9813, 9887, 9955, 10017, 10073, 10123, 10167, 10205, + 10237, 10263, 10283, 10295, 10301, 10302, 0, 1, 7, 21, + 41, 67, 99, 137, 181, 231, 287, 349, 417, 491, + 571, 655, 745, 841, 941, 1047, 1159, 1275, 1395, 1521, + 1651, 1785, 1923, 2065, 2211, 2361, 2513, 2669, 2829, 2991, + 3155, 3321, 3491, 3663, 3837, 4011, 4187, 4365, 4543, 4723, + 4903, 5083, 5263, 5443, 5623, 5803, 5981, 6159, 6335, 6509, + 6683, 6855, 7025, 7191, 7355, 7517, 7677, 7833, 7985, 8135, + 8281, 8423, 8561, 8695, 8825, 8951, 9071, 9187, 9299, 9405, + 9505, 9601, 9691, 9775, 9855, 9929, 9997, 10059, 10115, 10165, + 10209, 10247, 10279, 10305, 10325, 10339, 10345, 10346, 0, 1, + 7, 21, 41, 67, 99, 137, 181, 231, 287, 349, + 417, 491, 571, 655, 745, 841, 943, 1049, 1161, 1277, + 1397, 1523, 1653, 1787, 1925, 2067, 2213, 2363, 2517, 2673, + 2833, 2995, 3159, 3327, 3497, 3669, 3843, 4019, 4195, 4373, + 4551, 4731, 4911, 5091, 5271, 5451, 5631, 5811, 5989, 6167, + 6343, 6519, 6693, 6865, 7035, 7203, 7367, 7529, 7689, 7845, + 7999, 8149, 8295, 8437, 8575, 8709, 8839, 8965, 9085, 9201, + 9313, 9419, 9521, 9617, 9707, 9791, 9871, 9945, 10013, 10075, + 10131, 10181, 10225, 10263, 10295, 10321, 10341, 10355, 10361, 10362, + 0, 1, 7, 21, 41, 67, 99, 137, 181, 231, + 287, 349, 417, 491, 571, 657, 747, 843, 945, 1051, + 1163, 1279, 1399, 1525, 1655, 1789, 1927, 2069, 2215, 2365, + 2519, 2675, 2835, 2997, 3161, 3329, 3499, 3671, 3845, 4021, + 4197, 4375, 4553, 4733, 4913, 5093, 5273, 5453, 5633, 5813, + 5991, 6169, 6345, 6521, 6695, 6867, 7037, 7205, 7369, 7531, + 7691, 7847, 8001, 8151, 8297, 8439, 8577, 8711, 8841, 8967, + 9087, 9203, 9315, 9421, 9523, 9619, 9709, 9795, 9875, 9949, + 10017, 10079, 10135, 10185, 10229, 10267, 10299, 10325, 10345, 10359, + 10365, 10366 +}; + +const int16_t ivas_pca_offset_n2[IVAS_PCA_N1] = +{ + 0, 2, 6, 14, 24, 38, 56, 76, 100, 126, 156, 188, + 224, 262, 302, 346, 392, 442, 494, 548, 604, 664, 726, 790, + 856, 924, 994, 1066, 1140, 1216, 1294, 1374, 1454, 1536, 1620, 1704, + 1790, 1878, 1966, 2054, 2144, 2234, 2324, 2416, 2508, 2600, 2692, 2784, + 2876, 2968, 3058, 3148, 3238, 3326, 3414, 3502, 3588, 3672, 3756, 3838, + 3918, 3998, 4076, 4152, 4226, 4298, 4368, 4436, 4502, 4566, 4628, 4688, + 4744, 4798, 4850, 4900, 4946, 4990, 5030, 5068, 5104, 5136, 5166, 5192, + 5216, 5236, 5254, 5268, 5278, 5286, 5290 +}; + + +/*----------------------------------------------------------------------------------* + * Parametric MC ROM tables + *----------------------------------------------------------------------------------*/ + +const int16_t param_mc_band_grouping_20[20 + 1] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 17, 20, 23, 27, 33, 40, 52, 60 +}; + +const int16_t param_mc_coding_band_mapping_20[20] = +{ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +const int16_t param_mc_bands_coded_20[4] = +{ + 10, 14, 18, 20 +}; + +const int16_t param_mc_band_grouping_14[14 + 1] = +{ + 0, 1, 2, 3, 4, 5, 6, 8, 10, 13, 16, 20, 28, 40, 60 +}; + +const int16_t param_mc_coding_band_mapping_14[14] = +{ + 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 +}; + +const int16_t param_mc_bands_coded_14[4] = +{ + 8, 11, 13, 14 +}; + +const int16_t param_mc_band_grouping_10[10 + 1] = +{ + 0, 1, 2, 3, 5, 7, 10, 14, 20, 40, 60 +}; + + +const int16_t param_mc_bands_coded_10[4] = +{ + 6, 8, 9, 10 +}; + +const int16_t param_mc_coding_band_mapping_10[10] = +{ + 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 +}; + +const int16_t Param_MC_index[MAX_CICP_CHANNELS] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 +}; + +const float ivas_param_mc_dmx_fac_CICP6_2tc[12] = +{ + 1.0f, 0.0f, INV_SQRT2, INV_SQRT2, 1.0f, 0.0f, /*Lt*/ + 0.0f, 1.0f, INV_SQRT2, INV_SQRT2, 0.0f, 1.0f /*Rt*/ +}; + +const float ivas_param_mc_dmx_fac_CICP12_2tc[16] = +{ + 1.0f, 0.0f, INV_SQRT2, INV_SQRT2, 1.0f, 0.0f, 1.0f, 0.0f, /*Lt*/ + 0.0f, 1.0f, INV_SQRT2, INV_SQRT2, 0.0f, 1.0f, 0.0f, 1.0f /*Rt*/ +}; + +const float ivas_param_mc_dmx_fac_CICP12_3tc[24] = +{ + 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, /*Lt*/ + 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, /*Rt*/ + 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f /*Ct*/ +}; + +const float ivas_param_mc_dmx_fac_CICP14_2tc[16] = +{ + 1.0f, 0.0f, INV_SQRT2, INV_SQRT2, 1.0f, 0.0f, 1.0f, 0.0f, /*Lt*/ + 0.0f, 1.0f, INV_SQRT2, INV_SQRT2, 0.0f, 1.0f, 0.0f, 1.0f /*Rt*/ +}; +const float ivas_param_mc_dmx_fac_CICP14_3tc[24] = +{ + 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, /*Lt*/ + 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, /*Rt*/ + 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, /*Ct*/ +}; + +const float ivas_param_mc_dmx_fac_CICP16_3tc[30] = +{ + 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, /*Lt*/ + 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, /*Rt*/ + 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f /*Ct*/ +}; + +const float ivas_param_mc_dmx_fac_CICP19_3tc[36] = +{ + 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, /*Lt*/ + 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, /*Rt*/ + 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f /*Ct*/ +}; + +const float ivas_param_mc_dmx_fac_CICP19_4tc[48] = +{ + 1.0f, 0.0f, INV_SQRT2, INV_SQRT2, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, /*Lht*/ + 0.0f, 1.0f, INV_SQRT2, INV_SQRT2, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, /*Rht*/ + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, /*Lut*/ + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, /*Rut*/ +}; + +/* Coefficient for Parametric MC ILD factorization */ +const float ivas_param_mc_ild_fac_CICP6_2tc[6] = +{ + 0.391608498887651f, + 0.391608498887651f, + 0.208150823035836f, + 0.323713613305539f, + 0.323713613305539f, + 0.208150823035836f, +}; + +const float ivas_param_mc_ild_fac_CICP12_2tc[8] = +{ + 0.365151211522008f, + 0.365151211522008f, + 0.208008958987949f, + 0.209863469733018f, + 0.209863469733018f, + 0.171473949468979f, + 0.171473949468979f, + 0.208008958987949f +}; + +const float ivas_param_mc_ild_fac_CICP12_3tc[8] = +{ + 0.5f, + 0.5f, + 0.29f, + 0.29f, + 0.2f, + 0.2f, + 1.0f, + 0.25f +}; + +const float ivas_param_mc_ild_fac_CICP14_2tc[8] = +{ + 0.36427054f, + 0.36427054f, + 0.18290930f, + 0.21193730f, + 0.21193730f, + 0.24564756f, + 0.24564756f, + 0.20800895f +}; + +const float ivas_param_mc_ild_fac_CICP14_3tc[8] = +{ + 0.49716263f, + 0.49716263f, + 0.25198298f, + 0.25198298f, + 0.29498283f, + 0.29498283f, + 1.0f, + 0.25f +}; + +const float ivas_param_mc_ild_fac_CICP16_3tc[10] = +{ + 0.34f, + 0.34f, + 0.22f, + 0.22f, + 0.20f, + 0.20f, + 0.18f, + 0.18f, + 1.0f, + 0.25f, +}; + +const float ivas_param_mc_ild_fac_CICP19_3tc[12] = +{ + 0.3f, + 0.3f, + 0.17f, + 0.17f, + 0.12f, + 0.12f, + 0.19f, + 0.19f, + 0.19f, + 0.19f, + 1.0f, + 0.5f +}; + +const float ivas_param_mc_ild_fac_CICP19_4tc[12] = +{ + 0.35f, + 0.35f, + 0.17f, + 0.22f, + 0.2f, + 0.2f, + 0.2f, + 0.5f, + 0.5f, + 0.5f, + 0.5f, + 0.2f, +}; + +const PARAM_MC_ILD_MAPPING ivas_param_mc_ild_mapping_CICP6_2tc = +{ + 5, + 6, + {0,1,2,4,5,3}, + {1,1,2,1,1,2}, + {{0},{1},{0,1},{0},{1},{0,1}} +}; + +const PARAM_MC_ILD_MAPPING ivas_param_mc_ild_mapping_CICP12_2tc = +{ + 7, + 8, + {0,1,2,4,5,6,7,3}, + {1,1,2,1,1,1,1,2}, + {{0},{1},{0,1},{0},{1},{0},{1},{0,1}} +}; + +const PARAM_MC_ILD_MAPPING ivas_param_mc_ild_mapping_CICP12_3tc = +{ + 6, + 8, + {0,1,4,5,6,7,2,3}, + {1,1,1,1,1,1,1,1}, + {{0},{1},{0},{1},{0},{1},{2},{2}} +}; + +const PARAM_MC_ILD_MAPPING ivas_param_mc_ild_mapping_CICP14_2tc = +{ + 7, + 8, + {0,1,2,4,5,6,7,3}, + {1,1,2,1,1,1,1,2}, + {{0},{1},{0,1},{0},{1},{0},{1},{0,1}} +}; + +const PARAM_MC_ILD_MAPPING ivas_param_mc_ild_mapping_CICP14_3tc = +{ + 6, + 8, + {0,1,4,5,6,7,2,3}, + {1,1,1,1,1,1,1,1}, + {{0},{1},{0},{1},{0},{1},{2},{2}} +}; + +const PARAM_MC_ILD_MAPPING ivas_param_mc_ild_mapping_CICP16_3tc = +{ + 8, + 10, + {0,1,4,5,6,7,8,9,2,3}, + {1,1,1,1,1,1,1,1,1,1}, + {{0},{1},{0},{1},{0},{1},{0},{1},{2},{2}} +}; + +const PARAM_MC_ILD_MAPPING ivas_param_mc_ild_mapping_CICP19_3tc = +{ + 10, + 12, + {0,1,4,5,6,7,8,9,10,11,2,3}, + {1,1,1,1,1,1,1,1,1,1,1,1}, + {{0},{1},{0},{1},{0},{1},{0},{1},{0},{1},{2},{2}} +}; + +const PARAM_MC_ILD_MAPPING ivas_param_mc_ild_mapping_CICP19_4tc = +{ + 11, + 12, + {0,1,2,4,5,6,7,8,9,10,11,3}, + {1,1,2,1,1,1,1,1,1,1,1,2}, + {{0},{1},{0,1},{0},{1},{0},{1},{2},{3},{2},{3},{0,1}} +}; + +const PARAM_MC_ICC_MAPPING ivas_param_mc_icc_mapping_CICP6_2tc = +{ + 4, + 5, + { { 0, 4 }, /* L/LS */ + { 1, 5 }, /* R/RS */ + { 0, 2 }, /* L/C */ + { 1, 2 }, /* R/C */ + { 2, 3 }} /* C/LFE */ +}; + +const PARAM_MC_ICC_MAPPING ivas_param_mc_icc_mapping_CICP12_2tc = +{ + 6, + 7, + { { 0, 4 }, /* L/LS */ + { 1, 5 }, /* R/RS */ + { 0, 2 }, /* L/C */ + { 1, 2 }, /* R/C */ + { 2, 6 }, /* C/BLS */ + { 2, 7 }, /* C/BRS */ + { 2, 3 } /* C/LFE */ + } +}; + +const PARAM_MC_ICC_MAPPING ivas_param_mc_icc_mapping_CICP12_3tc = +{ + 6, + 7, + { { 0, 4 }, /* L/LS */ + { 1, 5 }, /* R/RS */ + { 0, 2 }, /* L/C */ + { 1, 2 }, /* R/C */ + { 0, 6 }, /* L/BLS */ + { 1, 7 }, /* R/BRS */ + { 2, 3 } /* C/LFE */ + } +}; + +const PARAM_MC_ICC_MAPPING ivas_param_mc_icc_mapping_CICP14_2tc = +{ + 6, + 7, + { { 0, 4 }, /* L/LS */ + { 1, 5 }, /* R/RS */ + { 0, 2 }, /* L/C */ + { 1, 2 }, /* R/C */ + { 2, 6 }, /* C/UFL */ + { 2, 7 }, /* C/UFR */ + { 2, 3 } /* C/LFE */ + } +}; +const PARAM_MC_ICC_MAPPING ivas_param_mc_icc_mapping_CICP14_3tc = +{ + 6, + 7, + { { 0, 4 }, /* L/LS */ + { 1, 5 }, /* R/RS */ + { 0, 2 }, /* L/C */ + { 1, 2 }, /* R/C */ + { 0, 6 }, /* L/UFL */ + { 1, 7 }, /* R/UFR */ + { 2, 3 } /* C/LFE */ + } +}; + +const PARAM_MC_ICC_MAPPING ivas_param_mc_icc_mapping_CICP16_3tc = +{ + 8, + 9, + { { 0, 4 }, /* L/LS */ + { 1, 5 }, /* R/RS */ + { 0, 2 }, /* L/C */ + { 1, 2 }, /* R/C */ + { 0, 6 }, /* L/UFL */ + { 1, 7 }, /* R/UFR */ + { 4, 8 }, /* LS/UBL */ + { 5, 9 }, /* RS/UBR */ + { 2, 3 } /* C/LFE */ + } +}; + +const PARAM_MC_ICC_MAPPING ivas_param_mc_icc_mapping_CICP19_3tc = +{ + 10, + 11, + { { 0, 4 }, /* L/LS */ + { 1, 5 }, /* R/RS */ + { 0, 2 }, /* L/C */ + { 1, 2 }, /* R/C */ + { 0, 6 }, /* L/LBS */ + { 1, 7 }, /* R/RBS */ + { 0, 8 }, /* L/UFL */ + { 1, 9 }, /* R/UFR */ + { 6, 10 }, /* LBS/UBL */ + { 7, 11 }, /* RBS/UBR */ + { 2, 3 } /* C/LFE */ + } +}; + +const PARAM_MC_ICC_MAPPING ivas_param_mc_icc_mapping_CICP19_4tc = +{ + 8, + 9, + { { 0, 4 }, /* L/LS */ + { 1, 5 }, /* R/RS */ + { 0, 2 }, /* L/C */ + { 1, 2 }, /* R/C */ + { 0, 6 }, /* L/LBS */ + { 1, 7 }, /* R/RBS */ + { 8, 10 }, /*UFL/UBL */ + { 9, 11 }, /*UFR/UBR */ + { 2, 3 } /* C/LFE */ + } +}; + +const PARAM_MC_CONF ivas_param_mc_conf[PARAM_MC_NUM_CONFIGS] = +{ + /* CICP6 48000 */ + { + MC_LS_SETUP_5_1, + 6, + 2, + IVAS_48k, + &ivas_param_mc_ild_mapping_CICP6_2tc, + &ivas_param_mc_icc_mapping_CICP6_2tc, + &ivas_param_mc_dmx_fac_CICP6_2tc[0], + &ivas_param_mc_ild_fac_CICP6_2tc[0] + }, + /* CICP6 64000 */ + { + MC_LS_SETUP_5_1, + 6, + 2, + IVAS_64k, + &ivas_param_mc_ild_mapping_CICP6_2tc, + &ivas_param_mc_icc_mapping_CICP6_2tc, + &ivas_param_mc_dmx_fac_CICP6_2tc[0], + &ivas_param_mc_ild_fac_CICP6_2tc[0] + }, + /* CICP6 80000 */ + { + MC_LS_SETUP_5_1, + 6, + 2, + IVAS_80k, + &ivas_param_mc_ild_mapping_CICP6_2tc, + &ivas_param_mc_icc_mapping_CICP6_2tc, + &ivas_param_mc_dmx_fac_CICP6_2tc[0], + &ivas_param_mc_ild_fac_CICP6_2tc[0] + }, + /* CICP12 48000 */ + { + MC_LS_SETUP_7_1, + 8, + 2, + IVAS_48k, + &ivas_param_mc_ild_mapping_CICP12_2tc, + &ivas_param_mc_icc_mapping_CICP12_2tc, + &ivas_param_mc_dmx_fac_CICP12_2tc[0], + &ivas_param_mc_ild_fac_CICP12_2tc[0] + }, + /* CICP12 64000 */ + { + MC_LS_SETUP_7_1, + 8, + 2, + IVAS_64k, + &ivas_param_mc_ild_mapping_CICP12_2tc, + &ivas_param_mc_icc_mapping_CICP12_2tc, + &ivas_param_mc_dmx_fac_CICP12_2tc[0], + &ivas_param_mc_ild_fac_CICP12_2tc[0] + }, + /* CICP12 80000 */ + { + MC_LS_SETUP_7_1, + 8, + 2, + IVAS_80k, + &ivas_param_mc_ild_mapping_CICP12_2tc, + &ivas_param_mc_icc_mapping_CICP12_2tc, + &ivas_param_mc_dmx_fac_CICP12_2tc[0], + &ivas_param_mc_ild_fac_CICP12_2tc[0] + }, + /* CICP12 96000 */ + { + MC_LS_SETUP_7_1, + 8, + 3, + IVAS_96k, + &ivas_param_mc_ild_mapping_CICP12_3tc, + &ivas_param_mc_icc_mapping_CICP12_3tc, + &ivas_param_mc_dmx_fac_CICP12_3tc[0], + &ivas_param_mc_ild_fac_CICP12_3tc[0] + }, + /* CICP14 48000 */ + { + MC_LS_SETUP_5_1_2, + 8, + 2, + IVAS_48k, + &ivas_param_mc_ild_mapping_CICP14_2tc, + &ivas_param_mc_icc_mapping_CICP14_2tc, + &ivas_param_mc_dmx_fac_CICP14_2tc[0], + &ivas_param_mc_ild_fac_CICP14_2tc[0] + }, + /* CICP14 64000 */ + { + MC_LS_SETUP_5_1_2, + 8, + 2, + IVAS_64k, + &ivas_param_mc_ild_mapping_CICP14_2tc, + &ivas_param_mc_icc_mapping_CICP14_2tc, + &ivas_param_mc_dmx_fac_CICP14_2tc[0], + &ivas_param_mc_ild_fac_CICP14_2tc[0] + }, + /* CICP14 80000 */ + { + MC_LS_SETUP_5_1_2, + 8, + 2, + IVAS_80k, + &ivas_param_mc_ild_mapping_CICP14_2tc, + &ivas_param_mc_icc_mapping_CICP14_2tc, + &ivas_param_mc_dmx_fac_CICP14_2tc[0], + &ivas_param_mc_ild_fac_CICP14_2tc[0] + }, + /* CICP14 96000 */ + { + MC_LS_SETUP_5_1_2, + 8, + 3, + IVAS_96k, + &ivas_param_mc_ild_mapping_CICP14_3tc, + &ivas_param_mc_icc_mapping_CICP14_3tc, + &ivas_param_mc_dmx_fac_CICP14_3tc[0], + &ivas_param_mc_ild_fac_CICP14_3tc[0] + }, + /* CICP16 96000 */ + { + MC_LS_SETUP_5_1_4, + 10, + 3, + IVAS_96k, + &ivas_param_mc_ild_mapping_CICP16_3tc, + &ivas_param_mc_icc_mapping_CICP16_3tc, + &ivas_param_mc_dmx_fac_CICP16_3tc[0], + &ivas_param_mc_ild_fac_CICP16_3tc[0] + }, + /* CICP16 128000 */ + { + MC_LS_SETUP_5_1_4, + 10, + 3, + IVAS_128k, + &ivas_param_mc_ild_mapping_CICP16_3tc, + &ivas_param_mc_icc_mapping_CICP16_3tc, + &ivas_param_mc_dmx_fac_CICP16_3tc[0], + &ivas_param_mc_ild_fac_CICP16_3tc[0] + }, + /* CICP19 128000 */ + { + MC_LS_SETUP_7_1_4, + 12, + 3, + IVAS_128k, + &ivas_param_mc_ild_mapping_CICP19_3tc, + &ivas_param_mc_icc_mapping_CICP19_3tc, + &ivas_param_mc_dmx_fac_CICP19_3tc[0], + &ivas_param_mc_ild_fac_CICP19_3tc[0] + }, + /* CICP19 160000 */ + { + MC_LS_SETUP_7_1_4, + 12, + 4, + IVAS_160k, + &ivas_param_mc_ild_mapping_CICP19_4tc, + &ivas_param_mc_icc_mapping_CICP19_4tc, + &ivas_param_mc_dmx_fac_CICP19_4tc[0], + &ivas_param_mc_ild_fac_CICP19_4tc[0] + } +}; + +const float ivas_param_mc_quant_ild_5d1_48[PARAM_MC_SZ_ILD_QUANTIZER_4BITS] = +{ + -100.0f, -20.0f, -13.0f, -10.0f, + -8.0f, -5.5f, -3.5f, -1.5f, 0.0f, 1.5f, 3.5f, 5.5f, 8.0f, 10.0f, 13.0f, 20.0f +}; + +/* Quantizer for ICCs in Parametric MC Processing */ +const float ivas_param_mc_quant_icc[PARAM_MC_SZ_ICC_QUANTIZER] = +{ + -0.99f, -0.589f, 0.0f, 0.36764f, 0.60092f, 0.84118f, 0.937f, 1.0f +}; + +/* Alphabet for delta coding for the ICCs in Parametric MC processing */ +const uint16_t ivas_param_mc_cum_freq_icc_cicp6_48_16bits[PARAM_MC_SZ_ICC_QUANTIZER + 1] = +{ + 0, 24, 224, 20873, 42384, 51699, 57122, 60572, 65535 +}; + +const uint16_t ivas_param_mc_sym_freq_icc_cicp6_48_16bits[PARAM_MC_SZ_ICC_QUANTIZER] = +{ + 24, 200, 20649, 21511, 9315, 5423, 3450, 4963 +}; + +const uint16_t ivas_param_mc_cum_freq_icc_delta_cicp6_48_16bits[2 * PARAM_MC_SZ_ICC_QUANTIZER] = +{ + 0, 4, 9, 124, 447, 1311, 4453, 18116, 48636, 60573, 63692, 64746, 65327, 65531, 65534, 65535 +}; + +const uint16_t ivas_param_mc_sym_freq_icc_delta_cicp6_48_16bits[2 * PARAM_MC_SZ_ICC_QUANTIZER - 1] = +{ + 4, 5, 115, 323, 864, 3142, 13663, 30520, 11937, 3119, 1054, 581, 204, 3, 1 +}; + +const uint16_t ivas_param_mc_cum_freq_icc_cicp12_48_16bits[PARAM_MC_SZ_ICC_QUANTIZER + 1] = +{ + 0, 30, 848, 26611, 47846, 57358, 61679, 63237, 65535 +}; + +const uint16_t ivas_param_mc_sym_freq_icc_cicp12_48_16bits[PARAM_MC_SZ_ICC_QUANTIZER] = +{ + 30, 818, 25763, 21235, 9512, 4321, 1558, 2298 +}; + +const uint16_t ivas_param_mc_cum_freq_icc_delta_cicp12_48_16bits[2 * PARAM_MC_SZ_ICC_QUANTIZER] = +{ + 0, 2, 7, 53, 243, 979, 3994, 16732, 49642, 61343, 64331, 65158, 65438, 65532, 65534, 65535 +}; + +const uint16_t ivas_param_mc_sym_freq_icc_delta_cicp12_48_16bits[2 * PARAM_MC_SZ_ICC_QUANTIZER - 1] = +{ + 2, 5, 46, 190, 736, 3015, 12738, 32910, 11701, 2988, 827, 280, 94, 2, 1 +}; + +const uint16_t ivas_param_mc_cum_freq_icc_cicp14_48_16bits[PARAM_MC_SZ_ICC_QUANTIZER + 1] = +{ + 0, 46, 826, 27798, 49552, 58447, 62046, 63284, 65535 +}; + +const uint16_t ivas_param_mc_sym_freq_icc_cicp14_48_16bits[PARAM_MC_SZ_ICC_QUANTIZER ]={ + 46, 780, 26972, 21754, 8895, 3599, 1238, 2251 +}; + +const uint16_t ivas_param_mc_cum_freq_icc_delta_cicp14_48_16bits[2 * PARAM_MC_SZ_ICC_QUANTIZER] = +{ + 0, 3, 8, 36, 172, 763, 3436, 15845, 50168, 62005, 64676, 65298, 65481, 65533, 65534, 65535 +}; + +const uint16_t ivas_param_mc_sym_freq_icc_delta_cicp14_48_16bits[2* PARAM_MC_SZ_ICC_QUANTIZER - 1] = +{ + 3, 5, 28, 136, 591, 2673, 12409, 34323, 11837, 2671, 622, 183, 52, 1, 1 +}; + +const uint16_t ivas_param_mc_cum_freq_icc_combined_48_16bits[PARAM_MC_SZ_ICC_QUANTIZER + 1] = +{ + 0, 34, 552, 24717, 45819, 54772, 59054, 61166, 65535 +}; + +const uint16_t ivas_param_mc_sym_freq_icc_combined_48_16bits[PARAM_MC_SZ_ICC_QUANTIZER] = +{ + 34, 518, 24165, 21102, 8953, 4282, 2112, 4369 +}; + +const uint16_t ivas_param_mc_cum_freq_icc_delta_combined_48_16bits[2 * PARAM_MC_SZ_ICC_QUANTIZER] = +{ + 0, 3, 7, 74, 304, 1009, 3870, 16502, 49834, 61384, 64217, 65020, 65369, 65531, 65534, 65535 +}; + +const uint16_t ivas_param_mc_sym_freq_icc_delta_combined_48_16bits[2 * PARAM_MC_SZ_ICC_QUANTIZER - 1] = +{ + 3, 4, 67, 230, 705, 2861, 12632, 33332, 11550, 2833, 803, 349, 162, 3, 1 +}; + +const uint16_t ivas_param_mc_cum_freq_ild_cicp6_48_16bits[PARAM_MC_SZ_ILD_QUANTIZER_4BITS + 1] = +{ + 0, 1092, 5574, 8315, 10652, 13875, 19656, 27664, 36284, 47058, 56251, 62579, 65118, 65462, 65513, 65532, 65535 +}; + +const uint16_t ivas_param_mc_sym_freq_ild_cicp6_48_16bits[PARAM_MC_SZ_ILD_QUANTIZER_4BITS] = +{ + 1092, 4482, 2741, 2337, 3223, 5781, 8008, 8620, 10774, 9193, 6328, 2539, 344, 51, 19, 3 +}; + +const uint16_t ivas_param_mc_cum_freq_ild_delta_cicp6_48_16bits[2 * PARAM_MC_SZ_ILD_QUANTIZER_4BITS] = +{ + 0, 1, 2, 3, 5, 38, 146, 352, 638, 997, 1559, 2323, 3570, 5859, 10556, 21075, 44682, 55617, 60408, 62739, 63833, 64443, 64809, 65074, 65279, 65400, 65484, 65531, 65532, 65533, 65534, 65535 +}; + +const uint16_t ivas_param_mc_sym_freq_ild_delta_cicp6_48_16bits[2 * PARAM_MC_SZ_ILD_QUANTIZER_4BITS - 1] = +{ + 1, 1, 1, 2, 33, 108, 206, 286, 359, 562, 764, 1247, 2289, 4697, 10519, 23607, 10935, 4791, 2331, 1094, 610, 366, 265, 205, 121, 84, 47, 1, 1, 1, 1 +}; + +const uint16_t ivas_param_mc_cum_freq_ild_cicp12_48_16bits[PARAM_MC_SZ_ILD_QUANTIZER_4BITS + 1] = +{ + 0, 967, 6335, 9941, 12837, 16652, 22416, 29814, 38807, 48497, 57184, 62661, 64916, 65466, 65514, 65530, 65535 +}; + +const uint16_t ivas_param_mc_sym_freq_ild_cicp12_48_16bits[PARAM_MC_SZ_ILD_QUANTIZER_4BITS] = +{ + 967, 5368, 3606, 2896, 3815, 5764, 7398, 8993, 9690, 8687, 5477, 2255, 550, 48, 16, 5 +}; + +const uint16_t ivas_param_mc_cum_freq_ild_delta_cicp12_48_16bits[2 * PARAM_MC_SZ_ILD_QUANTIZER_4BITS] = +{ + 0, 1, 2, 3, 5, 18, 61, 149, 320, 592, 1083, 1793, 2974, 5257, 10133, 21274, 44342, 55891, 60895, 63174, 64244, 64793, 65100, 65287, 65406, 65477, 65517, 65531, 65532, 65533, 65534, 65535 +}; + +const uint16_t ivas_param_mc_sym_freq_ild_delta_cicp12_48_16bits[2 * PARAM_MC_SZ_ILD_QUANTIZER_4BITS - 1] = +{ + 1, 1, 1, 2, 13, 43, 88, 171, 272, 491, 710, 1181, 2283, 4876, 11141, 23068, 11549, 5004, 2279, 1070, 549, 307, 187, 119, 71, 40, 14, 1, 1, 1, 1 +}; + +const uint16_t ivas_param_mc_cum_freq_ild_cicp14_48_16bits[PARAM_MC_SZ_ILD_QUANTIZER_4BITS + 1] = +{ + 0, 229, 7068, 10910, 13856, 17467, 22629, 29174, 36906, 46558, 55579, 61802, 65222, 65505, 65527, 65534, 65535 +}; + +const uint16_t ivas_param_mc_sym_freq_ild_cicp14_48_16bits[PARAM_MC_SZ_ILD_QUANTIZER_4BITS] = +{ + 229, 6839, 3842, 2946, 3611, 5162, 6545, 7732, 9652, 9021, 6223, 3420, 283, 22, 7, 1 +}; + +const uint16_t ivas_param_mc_cum_freq_ild_delta_cicp14_48_16bits[2 * PARAM_MC_SZ_ILD_QUANTIZER_4BITS] = +{ + 0, 1, 2, 3, 4, 12, 56, 153, 278, 475, 856, 1430, 2489, 4723, 9580, 20685, 45423, 56274, 60948, 63097, 64128, 64679, 65002, 65208, 65348, 65445, 65517, 65531, 65532, 65533, 65534, 65535 +}; + +const uint16_t ivas_param_mc_sym_freq_ild_delta_cicp14_48_16bits[2 * PARAM_MC_SZ_ILD_QUANTIZER_4BITS - 1] = +{ + 1, 1, 1, 1, 8, 44, 97, 125, 197, 381, 574, 1059, 2234, 4857, 11105, 24738, 10851, 4674, 2149, 1031, 551, 323, 206, 140, 97, 72, 14, 1, 1, 1, 1 +}; + +const uint16_t ivas_param_mc_cum_freq_ild_combined_48_16bits[PARAM_MC_SZ_ILD_QUANTIZER_4BITS+1] = +{ + 0, 1453, 8326, 12221, 15164, 18764, 24177, 31297, 39520, 49154, 57135, 62460, 64821, 65468, 65514, 65530, 65535 +}; + +const uint16_t ivas_param_mc_sym_freq_ild_combined_48_16bits[PARAM_MC_SZ_ILD_QUANTIZER_4BITS] = +{ + 1453, 6873, 3895, 2943, 3600, 5413, 7120, 8223, 9634, 7981, 5325, 2361, 647, 46, 16, 5 +}; + +const uint16_t ivas_param_mc_cum_freq_ild_delta_combined_48_16bits[2 * PARAM_MC_SZ_ILD_QUANTIZER_4BITS] = +{ + 0, 1, 2, 3, 5, 29, 98, 220, 414, 699, 1186, 1876, 3049, 5304, 10013, 20612, 45247, 56109, 60818, 63022, 64081, 64647, 64977, 65198, 65348, 65443, 65502, 65530, 65532, 65533, 65534, 65535 +}; + +const uint16_t ivas_param_mc_sym_freq_ild_delta_combined_48_16bits[2 * PARAM_MC_SZ_ILD_QUANTIZER_4BITS - 1] = +{ + 1, 1, 1, 2, 24, 69, 122, 194, 285, 487, 690, 1173, 2255, 4709, 10599, 24635, 10862, 4709, 2204, 1059, 566, 330, 221, 150, 95, 59, 28, 2, 1, 1, 1 +}; + + +/*----------------------------------------------------------------------------------* + * Parametric Upmix MC ROM tables + *----------------------------------------------------------------------------------*/ + +const int16_t ivas_param_upmx_mx_qmap[2][33] = +{ + { 0, 1, 2, 3, 4, 5, 6, 7, 8, 7, 6, 5, 4, 3, 2, 1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 7, 6, 5, 4, 3, 2, 1, 0 }, + { 0, 1, 2, 3, 4, 3, 2, 1, 0, 1, 2, 3, 4, 3, 2, 1, 0 } +}; + + +/*----------------------------------------------------------------------------------* + * MASA ROM tables + *----------------------------------------------------------------------------------*/ + +const float diffuseness_reconstructions_hr[HR_MASA_ER_LEVELS] = +{ + 0.00f, + 0.0142822265625f, + 0.030029296875f, + 0.052001953125f, + 0.07708740234375f, + 0.10528564453125f, + 0.14483642578125f, + 0.19573974609375f, + 0.26568603515625f, + 0.35467529296875f, + 0.436279296875f, + 0.510498046875f, + 0.5943603515625f, + 0.6878662109375f, + 0.80096435546875f, + 0.93365478515625f +}; +const float diffuseness_thresholds_hr[HR_MASA_ER_LEVELS + 1] = +{ + 0.0f, + 0.009521484375f, + 0.01904296875f, + 0.0410156250f, + 0.06298828125f, + 0.0911865234375f, + 0.119384765625f, + 0.1702880859375f, + 0.22119140625f, + 0.3101806640625f, + 0.399169921875f, + 0.473388671875f, + 0.547607421875f, + 0.641113281250f, + 0.734619140625f, + 0.8673095703125f, + 2.0f /* out-of-range large value to make searching easier */ +}; +const int16_t bits_direction_masa[DIRAC_DIFFUSE_LEVELS] = +{ + 11, + 11, + 10, + 9, + 7, + 6, + 5, + 3 +}; + + +const float coherence_cb0_masa[DIRAC_DIFFUSE_LEVELS * 2 * MASA_NO_CV_COH] = +{ + /* this is the same */ + 0.0478f, 0.2547f, 0.5515f, 0.9865f, 1.3573f, 1.6838f, 1.9674f, 0.0f, + 0.1211f, 0.4123f, 0.6997f, 1.0154f, 1.4197f, 1.7971f, 0.0f, 0.0f, + 0.1614f, 0.5674f, 0.9708f, 1.3699f, 1.7357f, 0.0f, 0.0f, 0.0f, + 0.2349f, 0.7306f, 1.2051f, 1.6547f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.2381f, 0.7185f, 1.1758f, 1.6335f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.2400f, 0.7027f, 1.1407f, 1.6243f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.3518f, 0.9398f, 1.6454f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 1.0f, 0.0f, 0.000f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + + 0.1445f, 0.3432f, 0.5351f, 0.7524f, 1.0095f, 1.3210f, 1.7399f, 0.0f, + 0.2002f, 0.4447f, 0.6869f, 0.9593f, 1.3090f, 1.7029f, 0.0f, 0.0f, + 0.2617f, 0.5556f, 0.8645f, 1.2185f, 1.6051f, 0.0f, 0.0f, 0.0f, + 0.3318f, 0.6810f, 1.0445f, 1.4710f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.3324f, 0.6588f, 0.9980f, 1.4164f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.3378f, 0.6658f, 1.0009f, 1.4269f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.3986f, 0.8244f, 1.3526f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 1.0f, 0.0f, 0.000f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f + + /* 0.0478f, 0.2547f, 1.9674f, 0.9865f, 0.5515f, 1.6838f, 1.3573f, 0.0f, + 0.1211f, 0.4123f, 0.6997f, 1.0154f, 1.4197f, 1.7971f, 0.0f, 0.0f, + 0.5674f, 0.9708f, 0.1614f, 1.3699f, 1.7357f, 0.0f, 0.0f, 0.0f, + 0.7306f, 1.2051f, 0.2349f, 1.6547f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.7185f, 1.1758f, 0.2381f, 1.6335f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.7027f, 1.1407f, 0.2400f, 1.6243f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.9398f, 1.6454f, 0.3518f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 1.0f, 0.0f, 0.000f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + + 0.3432f, 0.1445f, 0.5351f, 0.7524f, 1.0095f, 1.3210f, 1.7399f, 0.0f, + 0.4447f, 0.2002f, 0.6869f, 0.9593f, 1.3090f, 1.7029f, 0.0f, 0.0f, + 0.5556f, 0.2617f, 0.8645f, 1.2185f, 1.6051f, 0.0f, 0.0f, 0.0f, + 0.6810f, 0.3318f, 1.0445f, 1.4710f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.6588f, 0.3324f, 0.9980f, 1.4164f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.6658f, 0.3378f, 1.0009f, 1.4269f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.3986f, 0.8244f, 1.3526f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 1.0f, 0.0f, 0.000f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f */ +}; + +const float coherence_cb1_masa[MASA_NO_CV_COH1*MASA_MAXIMUM_CODING_SUBBANDS] = +{ + -0.0019f, 0.2597f, -0.2696f, 0.6269f, -0.6295f, + -0.0055f, 0.2582f, -0.2784f, 0.6473f, -0.6538f, + -0.0029f, 0.2506f, -0.2630f, 0.6498f, -0.6540f, + -0.0004f, 0.2546f, -0.2579f, 0.6851f, -0.6743f, + 0.0017f, 0.2521f, -0.2479f, 0.7217f, -0.7157f +}; + +const int16_t len_cb_dct0_masa[DIRAC_DIFFUSE_LEVELS] = { 7, 6, 5, 4, 4, 4, 3, 2 }; + +const uint8_t sur_coherence_cb_masa[MASA_MAX_NO_CV_SUR_COH*MASA_NO_CB_SUR_COH] = +{ + 16, 99, 0, 0, 0, 0, 0, 0, + 12, 64, 167, 0, 0, 0, 0, 0, + 10, 45, 100, 218, 0, 0, 0, 0, + 8, 34, 70, 124, 235, 0, 0, 0, + 7, 27, 55, 90, 141, 242, 0, 0, + 7, 23, 45, 71, 105, 153, 247, 0, + 6, 20, 38, 60, 86, 119, 165, 249 +}; + +const int16_t idx_cb_sur_coh_masa[MASA_MAX_NO_CV_SUR_COH] = { 0, 1, 2, 3, 4, 5, 5, 6 }; + +const int16_t len_huf_masa[MASA_NO_CV_COH1] = { 4, 2, 1, 3, 4 }; + +const int16_t huff_code_av_masa[MASA_NO_CV_COH1] = { 15, 2, 0, 6, 14 }; + +const int16_t no_theta_masa[NO_SPHERICAL_GRIDS-2] = /* from 1 to 11 bits */ +{ /*1, 1,*/ 2 ,2 , 4, 5, 6, 7, 10, 14, 19 + /*0, 2, 8, 6, 7, 12, 14, 16*/ +}; + +const int16_t no_phi_masa[NO_SPHERICAL_GRIDS][MAX_NO_THETA] = /* from 1 to 11 bits*/ +{ + { 2 }, + { 4 }, + { 4, 2 }, + { 8, 4 }, /* 8, 4*/ + { 12, 7, 2, 1 }, /* 12, */ + { 14, 13, 9, 2, 1 }, + { 22, 21, 17, 11, 3, 1 }, + { 33, 32, 29, 23, 17, 9, 1 }, + { 48, 47, 45, 41, 35, 28, 20, 12, 2, 1 }, + { 60, 60, 58, 56, 54, 50, 46, 41, 36, 30, 23, 17, 10, 1 }, + { 89, 89, 88, 86, 84, 81, 77, 73, 68, 63, 57, 51, 44, 38, 30, 23, 15, 8, 1 } +}; + +const float delta_theta_masa[NO_SPHERICAL_GRIDS - 2] = +{ /*180.0f, 90.0f,*/ 45.0f, 45.0f, 36.0f, 25.5f, 20.0f, /*14.9f*/ 15.0f, 10.78f, 6.7f, 5.0f }; +/* spheres +11 (10.9951) : (4.05,5) 89 89 88 86 84 81 77 73 68 63 57 51 44 38 30 23 15 8 1 +10 (10.0000): (6, 6.7) 60 60 58 56 54 50 46 41 36 30 23 17 10 1 +9 (8.9944): (7.5, 10.78) 48 47 45 41 35 28 20 12 2 1 +8 (7.9944): (10.8, 14.9) 33 32 29 23 17 9 1 +7 (7.0000): (16.5,20) 22 21 17 11 3 1 +6 (6.0000): (25,25.5) 14 13 9 2 1 +5 (5.0000): (36,36) 10 8 2 1 +4 (4.0000): (45 45) 8 4 (no +-90) +3 (3.0000) (90,45) 4 2 (no +-90) +2 (2.0000) (90,90) 4 (no +-90) +1 () 2 +*/ + +const float azimuth_cb[8] = +{ + 0.0f, -180.0f, -90.0f, 90.0f, -45.0f, 45.0f, -135.0f, 135.0f +}; + +const int16_t MASA_band_grouping_24[24 + 1] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 25, 30, 40, 60 +}; + +const int16_t MASA_band_mapping_24_to_18[18 + 1] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 17, 20, 21, 22, 23, 24 +}; + +const int16_t MASA_band_mapping_24_to_12[12 + 1] = +{ + 0, 1, 2, 3, 4, 5, 7, 9, 12, 15, 20, 22, 24 +}; + +const int16_t MASA_band_mapping_24_to_8[8 + 1] = +{ + 0, 1, 2, 3, 5, 8, 12, 20, 24 +}; + +const int16_t MASA_band_mapping_24_to_5[5 + 1] = +{ + 0, 1, 3, 7, 15, 24 +}; + +const int16_t MASA_grouping_8_to_5[8] = +{ + 0, 1, 1, 2, 3, 3, 4, 4 +}; + +const int16_t MASA_grouping_12_to_5[12] = +{ + 0, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4 +}; + +const int16_t MASA_grouping_18_to_5[18] = +{ + 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4 +}; + +const int16_t MASA_grouping_24_to_5[24] = +{ + 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4 +}; + +/* IVAS_13k2, IVAS_16k4, IVAS_24k4, IVAS_32k, IVAS_48k, IVAS_64k, IVAS_80k, IVAS_96k, IVAS_128k, IVAS_160k, IVAS_192k, IVAS_256k, IVAS_384k, IVAS_512k */ +const int16_t masa_bits[IVAS_NUM_ACTIVE_BRATES] = +{ + 50, 60, 70, 85, 140, 180, 220, 256, 350, 432, 528, 832, 1024, MASA_MAX_BITS +}; + +const int16_t masa_bits_LR_stereo[4] = +{ + 50, 50, 60, 70 +}; + +const int16_t mcmasa_bits[IVAS_NUM_ACTIVE_BRATES] = +{ + 50, 70, 80, 120, 140, 160, 220, 256, 288, 432, 528, 832, 1024, MASA_MAX_BITS +}; + +const uint8_t masa_nbands[IVAS_NUM_ACTIVE_BRATES] = +{ + 5, 5, 5, 5, 5, 5, 5, 5, 8, 12, 18, 24, 24, 24 +}; + +const uint8_t masa_joined_nbands[IVAS_NUM_ACTIVE_BRATES] = +{ + 5, 5, 5, 8, 12, 12, 12, 18, 18, 18, 18, 24, 24, 24 +}; + +const uint8_t masa_twodir_bands[IVAS_NUM_ACTIVE_BRATES] = +{ + 0, 0, 0, 0, 0, 1, 1, 1, 3, 4, 6, 6, 9, 24 +}; + +const uint8_t masa_twodir_bands_joined[IVAS_NUM_ACTIVE_BRATES] = +{ + 0, 0, 0, 0, 0, 2, 2, 3, 4, 6, 8, 9, 12, MASA_MAXIMUM_TWO_DIR_BANDS +}; + + +/*----------------------------------------------------------------------------------* + * Multi-channel LS setups + *----------------------------------------------------------------------------------*/ + +const float ls_azimuth_CICP2[2] = { 30.0f, -30.0f }; +const float ls_elevation_CICP2[2] = { 0.0f, 0.0f }; + +const float ls_azimuth_CICP6[5] = { 30.0f, -30.0f, 0.0f, 110.0f, -110.0f }; +const float ls_elevation_CICP6[5] = { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f }; + +const float ls_azimuth_CICP12[7] = { 30.0f, -30.0f, 0.0f, 110.0f, -110.0f, 135.0f, -135.0f }; +const float ls_elevation_CICP12[7] = { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f }; + +const float ls_azimuth_CICP14[7] = { 30.0f, -30.0f, 0.0f, 110.0f, -110.0f, 30.0f, -30.0f }; +const float ls_elevation_CICP14[7] = { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 35.0f, 35.0f }; + +const float ls_azimuth_CICP16[9] = { 30.0f, -30.0f, 0.0f, 110.0f, -110.0f, 30.0f, -30.0f, 110.0f, -110.0f }; +const float ls_elevation_CICP16[9] = { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 35.0f, 35.0f, 35.0f, 35.0f }; + +const float ls_azimuth_CICP19[11] = { 30.0f, -30.0f, 0.0f, 135.0f, -135.0f, 90.0f, -90.0f, 30.0f, -30.0f, 135.0f, -135.0f }; +const float ls_elevation_CICP19[11] = { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 35.0f, 35.0f, 35.0f, 35.0f }; + +const float cb_azi_chan[] = { 0.0f, 30.0f, 110.0f, 135.0f }; + +const float McMASA_LFEGain_vectors[64] = +{ + 0.38f, 0.33f, 0.19f, 0.20f, /* 1st bit */ + -0.16f, -0.22f, -0.35f, -0.34f, + 0.50f, 0.50f, 0.50f, 0.50f, /* 2nd bit*/ + -0.80f, -0.40f, 1.02f, 0.10f, + -0.50f, -0.50f, -0.50f, -0.50f, /* 3rd bit */ + -0.56f, -0.12f, -0.78f, 1.36f, + -1.02f, 1.18f, -0.57f, 0.33f, + 0.72f, -1.13f, 0.97f, -0.62f, + -0.91f, 0.93f, 1.00f, -1.10f, /* 4th bit*/ + 1.73f, -0.23f, -0.78f, -0.84f, + 0.95f, -1.60f, -0.34f, 0.93f, + 0.87f, 0.47f, -1.90f, 0.52f, + 0.67f, 1.42f, -0.97f, -1.24f, + 0.83f, 0.58f, 0.61f, -2.04f, + -0.80f, -1.58f, 0.82f, 1.42f, + -2.14f, 0.26f, 0.84f, 1.02f +}; + +/*----------------------------------------------------------------------------------* + * OMASA ROM tables + *----------------------------------------------------------------------------------*/ + +const int32_t sep_object_brate[][MAX_NUM_OBJECTS] = +{ + {0, 0, 0, 0}, /* 13k2 */ + {0, 0, 0, 0}, /* 16k4 */ + {9600, 0, 0, 0}, /* 24k4 */ + {IVAS_13k2, 0, 0, 0}, /* 32k */ + {16000, 11000, 0, 0}, /* 48k */ + {16000, 11700, 0, 0}, /* 64k */ + {20000, 16000, 0, 0}, /* 80k */ + {IVAS_32k, 20000, 20000, 0}, /* 96k */ + {IVAS_32k, IVAS_24k4, 24000, 24000}, /* 128k */ + {IVAS_48k, IVAS_32k, IVAS_24k4, 24000}, /* 160k */ + {IVAS_64k, IVAS_48k, IVAS_32k, IVAS_24k4}, /* 192k */ + {IVAS_96k, IVAS_64k, IVAS_48k, IVAS_32k}, /* 256k */ + {IVAS_128k, IVAS_80k, IVAS_64k, IVAS_48k}, /* 384k */ + {IVAS_128k, IVAS_96k, IVAS_80k, IVAS_64k} /* 512k */ +}; + +/* column wise DCT matrices for 4 5, and 8 dim */ +const float dct4[4*4] = +{ + 0.5000f, 0.6533f, 0.5000f, 0.2706f, + 0.5000f, 0.2706f, -0.5000f, -0.6533f, + 0.5000f, -0.2706f, -0.5000f, 0.6533f, + 0.5000f, -0.6533f, 0.5000f, -0.2706f +}; + +const float dct5[5*5] = +{ + 0.4472f, 0.6015f, 0.5117f, 0.3717f, 0.1954f, + 0.4472f, 0.3717f, -0.1954f, -0.6015f, -0.5117f, + 0.4472f, 0.0000f, -0.6325f, -0.0000f, 0.6325f, + 0.4472f, -0.3717f, -0.1954f, 0.6015f, -0.5117f, + 0.4472f, -0.6015f, 0.5117f, -0.3717f, 0.1954f +}; + +const float dct8[8*8] = +{ + 0.3536f, 0.4904f, 0.4619f, 0.4157f, 0.3536f, 0.2778f, 0.1913f, 0.0975f, + 0.3536f, 0.4157f, 0.1913f, -0.0975f, -0.3536f, -0.4904f, -0.4619f, -0.2778f, + 0.3536f, 0.2778f, -0.1913f, -0.4904f, -0.3536f, 0.0975f, 0.4619f, 0.4157f, + 0.3536f, 0.0975f, -0.4619f, -0.2778f, 0.3536f, 0.4157f, -0.1913f, -0.4904f, + 0.3536f, -0.0975f, -0.4619f, 0.2778f, 0.3536f, -0.4157f, -0.1913f, 0.4904f, + 0.3536f, -0.2778f, -0.1913f, 0.4904f, -0.3536f, -0.0975f, 0.4619f, -0.4157f, + 0.3536f, -0.4157f, 0.1913f, 0.0975f, -0.3536f, 0.4904f, -0.4619f, 0.2778f, + 0.3536f, -0.4904f, 0.4619f, -0.4157f, 0.3536f, -0.2778f, 0.1913f, -0.0975f +}; + +const float dct12[12*12]= +{ + 0.2887f, 0.4048f, 0.3943f, 0.3772f, 0.3536f, 0.3239f, 0.2887f, 0.2485f, 0.2041f, 0.1562f, 0.1057f, 0.0533f, + 0.2887f, 0.3772f, 0.2887f, 0.1562f, 0.0000f, -0.1562f, -0.2887f, -0.3772f, -0.4082f, -0.3772f, -0.2887f, -0.1562f, + 0.2887f, 0.3239f, 0.1057f, -0.1562f, -0.3536f, -0.4048f, -0.2887f, -0.0533f, 0.2041f, 0.3772f, 0.3943f, 0.2485f, + 0.2887f, 0.2485f, -0.1057f, -0.3772f, -0.3536f, -0.0533f, 0.2887f, 0.4048f, 0.2041f, -0.1562f, -0.3943f, -0.3239f, + 0.2887f, 0.1562f, -0.2887f, -0.3772f, -0.0000f, 0.3772f, 0.2887f, -0.1562f, -0.4082f, -0.1562f, 0.2887f, 0.3772f, + 0.2887f, 0.0533f, -0.3943f, -0.1562f, 0.3536f, 0.2485f, -0.2887f, -0.3239f, 0.2041f, 0.3772f, -0.1057f, -0.4048f, + 0.2887f, -0.0533f, -0.3943f, 0.1562f, 0.3536f, -0.2485f, -0.2887f, 0.3239f, 0.2041f, -0.3772f, -0.1057f, 0.4048f, + 0.2887f, -0.1562f, -0.2887f, 0.3772f, 0.0000f, -0.3772f, 0.2887f, 0.1562f, -0.4082f, 0.1562f, 0.2887f, -0.3772f, + 0.2887f, -0.2485f, -0.1057f, 0.3772f, -0.3536f, 0.0533f, 0.2887f, -0.4048f, 0.2041f, 0.1562f, -0.3943f, 0.3239f, + 0.2887f, -0.3239f, 0.1057f, 0.1562f, -0.3536f, 0.4048f, -0.2887f, 0.0533f, 0.2041f, -0.3772f, 0.3943f, -0.2485f, + 0.2887f, -0.3772f, 0.2887f, -0.1562f, -0.0000f, 0.1562f, -0.2887f, 0.3772f, -0.4082f, 0.3772f, -0.2887f, 0.1562f, + 0.2887f, -0.4048f, 0.3943f, -0.3772f, 0.3536f, -0.3239f, 0.2887f, -0.2485f, 0.2041f, -0.1562f, 0.1057f, -0.0533f +}; + +/*----------------------------------------------------------------------------------* + * ISM ROM tables + *----------------------------------------------------------------------------------*/ + +const float ism_azimuth_borders[4] = +{ + ISM_AZIMUTH_MIN, ISM_AZIMUTH_LOW_BORDER, ISM_AZIMUTH_HIGH_BORDER, ISM_AZIMUTH_MAX +}; + +const float ism_elevation_borders[4] = +{ + ISM_ELEVATION_MIN, ISM_ELEVATION_LOW_BORDER, ISM_ELEVATION_HIGH_BORDER, ISM_ELEVATION_MAX +}; + + +/*----------------------------------------------------------------------------------* + * Param ISM ROM tables + *----------------------------------------------------------------------------------*/ + +const int16_t Param_ISM_band_grouping[MAX_PARAM_ISM_NBANDS + 1] = +{ + 0, 1, 2, 3, 4, 6, 8, 11, 15, 21, 31, 60 +}; + +/*----------------------------------------------------------------------------------* + * LFE coding ROM tables + *----------------------------------------------------------------------------------*/ + +const float ivas_lfe_window_coeff_48k[IVAS_LFE_FADE_LEN_48K] = +{ + 0.000111037183489911f, 0.000184173600662723f, 0.000260431056232165f, 0.000343096680773904f, + 0.000433557036912299f, 0.000532702330090964f, 0.000641245198570983f, 0.000759825620233343f, + 0.000889053268887781f, 0.00102952705612861f, 0.00118184503626756f, 0.00134660978209878f, + 0.00152443144932643f, 0.00171592958031516f, 0.00192173418063960f, 0.00214248635511166f, + 0.00237883866481051f, 0.00263145529985620f, 0.00290101212545378f, 0.00318819663720802f, + 0.00349370784884686f, 0.00381825612758351f, 0.00416256298736225f, 0.00452736084701996f, + 0.00491339275828344f, 0.00532141210711066f, 0.00575218229092557f, 0.00620647637363723f, + 0.00668507671987614f, 0.00718877460956053f, 0.00771836983367896f, 0.00827467027201698f, + 0.00885849145344304f, 0.00947065609929077f, 0.0101119936503206f, 0.0107833397777077f, + 0.0114855358784815f, 0.0122194285558262f, 0.0129858690846493f, 0.0137857128628235f, + 0.0146198188485090f, 0.0154890489839742f, 0.0163942676063398f, 0.0173363408456805f, + 0.0183161360109349f, 0.0193345209640845f, 0.0203923634830761f, 0.0214905306139788f, + 0.0226298880128789f, 0.0238112992780310f, 0.0250356252727999f, 0.0263037234399395f, + 0.0276164471077718f, 0.0289746447888419f, 0.0303791594716384f, 0.0318308279059821f, + 0.0333304798826995f, 0.0348789375082095f, 0.0364770144746630f, 0.0381255153262869f, + 0.0398252347225964f, 0.0415769566991470f, 0.0433814539265092f, 0.0452394869681573f, + 0.0471518035379721f, 0.0491191377580651f, 0.0511422094176377f, 0.0532217232335982f, + 0.0553583681136604f, 0.0575528164226564f, 0.0598057232527990f, 0.0621177256986303f, + 0.0644894421373997f, 0.0669214715156123f, 0.0694143926424920f, 0.0719687634911028f, + 0.0745851205078720f, 0.0772639779312550f, 0.0800058271202837f, 0.0828111358937321f, + 0.0856803478806326f, 0.0886138818828696f, 0.0916121312505734f, 0.0946754632710273f, + 0.0978042185717987f, 0.100998710538792f, 0.104259224749915f, 0.107586018425039f, + 0.110979319892929f, 0.114439328075791f, 0.117966211992097f, 0.121560110278315f, + 0.125221130730162f, 0.128949349863999f, 0.132744812498936f, 0.136607531360247f, + 0.140537486704635f, 0.144534625967897f, 0.148598863435505f, 0.152730079936616f, + 0.156928122561981f, 0.161192804406232f, 0.165523904334983f, 0.169921166777162f, + 0.174384301542983f, 0.178912983667934f, 0.183506853283123f, 0.188165515512334f, + 0.192888540396077f, 0.197675462842929f, 0.202525782608415f, 0.207438964301664f, + 0.212414437420042f, 0.217451596411945f, 0.222549800767893f, 0.227708375140074f, + 0.232926609490399f, 0.238203759267182f, 0.243539045610445f, 0.248931655585895f, + 0.254380742447540f, 0.259885425928913f, 0.265444792562823f, 0.271057896029545f, + 0.276723757533309f, 0.282441366206947f, 0.288209679544493f, 0.294027623861544f, + 0.299894094783121f, 0.305807957758767f, 0.311768048604592f, 0.317773174071915f, + 0.323822112442170f, 0.329913614147682f, 0.336046402417904f, 0.342219173950673f, + 0.348430599608033f, 0.354679325136114f, 0.360963971908571f, 0.367283137693016f, + 0.373635397439901f, 0.380019304093226f, 0.386433389422488f, 0.392876164875198f, + 0.399346122449318f, 0.405841735584931f, 0.412361460074412f, 0.418903734990401f, + 0.425466983630787f, 0.432049614479962f, 0.438650022185529f, 0.445266588549660f, + 0.451897683534280f, 0.458541666279211f, 0.465196886132432f, 0.471861683691556f, + 0.478534391855649f, 0.485213336886453f, 0.491896839478123f, 0.498583215834516f, + 0.505270778753096f, 0.511957838714501f, 0.518642704976797f, 0.525323686673448f, + 0.531999093914013f, 0.538667238886587f, 0.545326436960981f, 0.551975007791651f, + 0.558611276419351f, 0.565233574370526f, 0.571840240753416f, 0.578429623349869f, + 0.585000079701846f, 0.591549978191620f, 0.598077699114643f, 0.604581635744092f, + 0.611060195386091f, 0.617511800424606f, 0.623934889355033f, 0.630327917805494f, + 0.636689359544871f, 0.643017707476609f, 0.649311474617338f, 0.655569195059378f, + 0.661789424916185f, 0.667970743249834f, 0.674111752979635f, 0.680211081770987f, + 0.686267382903617f, 0.692279336118339f, 0.698245648441503f, 0.704165054986320f, + 0.710036319730275f, 0.715858236267842f, 0.721629628537765f, 0.727349351524163f, + 0.733016291930776f, 0.738629368827644f, 0.744187534269598f, 0.749689773885909f, + 0.755135107440516f, 0.760522589362248f, 0.765851309244508f, 0.771120392313900f, + 0.776328999867319f, 0.781476329677057f, 0.786561616363500f, 0.791584131735037f, + 0.796543185094819f, 0.801438123514058f, 0.806268332071584f, 0.811033234059390f, + 0.815732291153985f, 0.820365003553343f, 0.824930910079335f, 0.829429588245527f, + 0.833860654290276f, 0.838223763175109f, 0.842518608548382f, 0.846744922674278f, + 0.850902476327233f, 0.854991078651907f, 0.859010576988885f, 0.862960856666304f, + 0.866841840757651f, 0.870653489806038f, 0.874395801515260f, 0.878068810408014f, + 0.881672587451697f, 0.885207239652212f, 0.888672909616291f, 0.892069775082842f, + 0.895398048423911f, 0.898657976115850f, 0.901849838181344f, 0.904973947602979f, + 0.908030649709079f, 0.911020321532565f, 0.913943371143645f, 0.916800236957154f, + 0.919591387015427f, 0.922317318247601f, 0.924978555706293f, 0.927575651782607f, + 0.930109185400495f, 0.932579761191496f, 0.934988008650908f, 0.937334581276497f, + 0.939620155690861f, 0.941845430748583f, 0.944011126629350f, 0.946117983918227f, + 0.948166762674299f, 0.950158241488903f, 0.952093216534711f, 0.953972500606916f, + 0.955796922157805f, 0.957567324326003f, 0.959284563961681f, 0.960949510649049f, + 0.962563045727414f, 0.964126061312150f, 0.965639459316855f, 0.967104150478033f, + 0.968521053383593f, 0.969891093506458f, 0.971215202244581f, 0.972494315968637f, + 0.973729375078655f, 0.974921323070827f, 0.976071105615721f, 0.977179669649101f, + 0.978247962476515f, 0.979276930892814f, 0.980267520317711f, 0.981220673948460f, + 0.982137331930712f, 0.983018430548546f, 0.983864901434662f, 0.984677670801652f, + 0.985457658695232f, 0.986205778270287f, 0.986922935090503f, 0.987610026452330f, + 0.988267940733967f, 0.988897556770000f, 0.989499743252276f, 0.990075358157522f, + 0.990625248202194f, 0.991150248324956f, 0.991651181197124f, 0.992128856761388f, + 0.992584071799021f, 0.993017609525750f, 0.993430239216404f, 0.993822715858368f, + 0.994195779833855f, 0.994550156630899f, 0.994886556582961f, 0.995205674636936f, + 0.995508190149341f, 0.995794766710354f, 0.996066051995373f, 0.996322677643671f, + 0.996565259163689f, 0.996794395864463f, 0.997010670812624f, 0.997214650814370f, + 0.997406886421766f, 0.997587911962687f, 0.997758245593683f, 0.997918389375006f, + 0.998068829367008f, 0.998210035747091f, 0.998342462946368f, 0.998466549805146f, + 0.998582719746365f, 0.998691380966053f, 0.998792926639904f, 0.998887735145004f, + 0.998976170295797f, 0.999058581593303f, 0.999135304486653f, 0.999206660645980f, + 0.999272958245696f, 0.999334492257230f, 0.999391544750254f, 0.999444385201492f, + 0.999493270810174f, 0.999538446819229f, 0.999580146841343f, 0.999618593188994f, + 0.999653997207632f, 0.999686559611161f, 0.999716470818948f, 0.999743911293550f, + 0.999769051878447f, 0.999792054135046f, 0.999813070678259f, 0.999832245510030f, + 0.999849714350153f, 0.999865604963813f, 0.999880037485284f, 0.999893124737258f, + 0.999904972545323f, 0.999915680047131f, 0.999925339995826f, 0.999934039057369f, + 0.999941858101379f, 0.999948872485197f, 0.999955152330868f, 0.999960762794806f, + 0.999965764329904f, 0.999970212939921f, 0.999974160425965f, 0.999977654624967f, + 0.999980739640031f, 0.999983456062595f, 0.999985841186357f, 0.999987929212949f, + 0.999989751449364f, 0.999991336497160f, 0.999992710433503f, 0.999993896984110f, + 0.999994917688186f, 0.999995792055471f, 0.999996537715509f, 0.999997170559301f, + 0.999997704873475f, 0.999998153467165f, 0.999998527791754f, 0.999998838053703f, + 0.999999093320636f, 0.999999301620911f, 0.999999470036880f, 0.999999604792064f, + 0.999999711332472f, 0.999999794402277f, 0.999999858114104f, 0.999999906014144f, + 0.999999941142332f, 0.999999966087832f, 0.999999983040042f, 0.999999993835372f +}; + +const float ivas_lfe_window_coeff_32k[IVAS_LFE_FADE_LEN_32K] = +{ + 0.000135992220705702f, 0.000243900754874608f, 0.000366502488193403f, 0.000507754555407233f, + 0.000670037413867230f, 0.000855400185342017f, 0.00106582120537505f, 0.00130328810233523f, + 0.00156982797844358f, 0.00186752014891622f, 0.00219850171292337f, 0.00256496978060437f, + 0.00296918195815542f, 0.00341345582581521f, 0.00390016777110998f, 0.00443175136707306f, + 0.00501069540002978f, 0.00563954160739932f, 0.00632088216212532f, 0.00705735692705637f, + 0.00785165049501826f, 0.00870648902594829f, 0.00962463688994814f, 0.0106088931237052f, + 0.0116620877070005f, 0.0127870776657112f, 0.0139867430076699f, 0.0152639824978695f, + 0.0166217092797368f, 0.0180628463495039f, 0.0195903218910554f, 0.0212070644790028f, + 0.0229159981581294f, 0.0247200374077382f, 0.0266220819998311f, 0.0286250117604275f, + 0.0307316812437090f, 0.0329449143290351f, 0.0352674987512187f, 0.0377021805747777f, + 0.0402516586231834f, 0.0429185788744125f, 0.0457055288343670f, 0.0486150318999676f, + 0.0516495417239329f, 0.0548114365934440f, 0.0581030138350493f, 0.0615264842582949f, + 0.0650839666506623f, 0.0687774823364692f, 0.0726089498124248f, 0.0765801794725421f, + 0.0806928684350862f, 0.0849485954841849f, 0.0893488161386407f, 0.0938948578603667f, + 0.0985879154147218f, 0.103429046394834f, 0.108419166921795f, 0.113559047532359f, + 0.118849309265507f, 0.124290419958929f, 0.129882690766145f, 0.135626272904605f, + 0.141521154644746f, 0.147567158549505f, 0.153763938973404f, 0.160110979829776f, + 0.166607592634260f, 0.173252914832108f, 0.180045908416344f, 0.186985358843200f, + 0.194069874250690f, 0.201297884985540f, 0.208667643443083f, 0.216177224224055f, + 0.223824524611575f, 0.231607265370904f, 0.239522991873889f, 0.247569075549288f, + 0.255742715659461f, 0.264040941403189f, 0.272460614343670f, 0.280998431159973f, + 0.289650926719540f, 0.298414477468569f, 0.307285305136374f, 0.316259480749104f, + 0.325332928947464f, 0.334501432602363f, 0.343760637721723f, 0.353106058640944f, + 0.362533083488876f, 0.372036979920440f, 0.381612901106401f, 0.391255891970138f, + 0.400960895660650f, 0.410722760250415f, 0.420536245646151f, 0.430396030699960f, + 0.440296720507817f, 0.450232853881834f, 0.460198910982274f, 0.470189321094825f, + 0.480198470538230f, 0.490220710686965f, 0.500250366093333f, 0.510281742692964f, + 0.520309136077485f, 0.530326839817815f, 0.540329153821353f, 0.550310392706136f, + 0.560264894174896f, 0.570187027371852f, 0.580071201204973f, 0.589911872616473f, + 0.599703554784248f, 0.609440825237056f, 0.619118333866323f, 0.628730810817558f, + 0.638273074244583f, 0.647740037909930f, 0.657126718615052f, 0.666428243444252f, + 0.675639856806586f, 0.684756927260328f, 0.693774954105018f, 0.702689573726534f, + 0.711496565681117f, 0.720191858504788f, 0.728771535235148f, 0.737231838633124f, + 0.745569176092876f, 0.753780124228688f, 0.761861433128389f, 0.769810030263551f, + 0.777623024047447f, 0.785297707032555f, 0.792831558740175f, 0.800222248115570f, + 0.807467635602894f, 0.814565774835047f, 0.821514913934526f, 0.828313496422214f, + 0.834960161732055f, 0.841453745330485f, 0.847793278440476f, 0.853977987371046f, + 0.860007292454100f, 0.865880806591466f, 0.871598333416011f, 0.877159865071782f, + 0.882565579619094f, 0.887815838071573f, 0.892911181073134f, 0.897852325223955f, + 0.902640159065461f, 0.907275738735386f, 0.911760283304927f, 0.916095169810981f, + 0.920281927997422f, 0.924322234780251f, 0.928217908452363f, 0.931970902644524f, + 0.935583300059946f, 0.939057306000627f, 0.942395241704333f, 0.945599537511766f, + 0.948672725884068f, 0.951617434291347f, 0.954436377993401f, 0.957132352734204f, + 0.959708227372067f, 0.962166936467612f, 0.964511472851888f, 0.966744880197007f, + 0.968870245611698f, 0.970890692284040f, 0.972809372193449f, 0.974629458913696f, + 0.976354140528315f, 0.977986612679290f, 0.979530071769289f, 0.980987708337022f, + 0.982362700624510f, 0.983658208354169f, 0.984877366732620f, 0.986023280697072f, + 0.987099019418999f, 0.988107611078563f, 0.989052037921982f, 0.989935231612664f, + 0.990760068885503f, 0.991529367512303f, 0.992245882584772f, 0.992912303120025f, + 0.993531248991970f, 0.994105268190439f, 0.994636834408346f, 0.995128344955654f, + 0.995582118997414f, 0.996000396111680f, 0.996385335161686f, 0.996739013475302f, + 0.997063426323498f, 0.997360486688307f, 0.997632025309661f, 0.997879790999405f, + 0.998105451209848f, 0.998310592843372f, 0.998496723288846f, 0.998665271669997f, + 0.998817590290322f, 0.998954956258775f, 0.999078573280101f, 0.999189573593561f, + 0.999289020043705f, 0.999377908266854f, 0.999457168977167f, 0.999527670336312f, + 0.999590220391194f, 0.999645569564531f, 0.999694413183629f, 0.999737394033262f, + 0.999775104919193f, 0.999808091229614f, 0.999836853482484f, 0.999861849847578f, + 0.999883498632868f, 0.999902180725714f, 0.999918241980199f, 0.999931995542854f, + 0.999943724109857f, 0.999953682109695f, 0.999962097806132f, 0.999969175317172f, + 0.999975096546511f, 0.999980023024807f, 0.999984097658787f, 0.999987446387008f, + 0.999990179741692f, 0.999992394316756f, 0.999994174142692f, 0.999995591969534f, + 0.999996710459602f, 0.999997583292189f, 0.999998256182726f, 0.999998767819300f, + 0.999999150719701f, 0.999999432012418f, 0.999999634145194f, 0.999999775524907f, + 0.999999871092647f, 0.999999932837961f, 0.999999970256211f, 0.999999990753058f +}; + +const float ivas_lfe_window_coeff_16k[IVAS_LFE_FADE_LEN_16K] = +{ + 0.000192322041967661f, 0.000432042541451336f, 0.000754275578824202f, 0.00117365342860051f, + 0.00170559736282027f, 0.00236656267363075f, 0.00317404503675108f, 0.00414654286875000f, + 0.00530350017263264f, 0.00666523498873026f, 0.00825285493787745f, 0.0100881605116261f, + 0.0121935365995684f, 0.0145918327721377f, 0.0173062329286553f, 0.0203601150332032f, + 0.0237769017796244f, 0.0275799031448139f, 0.0317921519028702f, 0.0364362332793203f, + 0.0415341100227591f, 0.0471069442593880f, 0.0531749175728265f, 0.0597570508160612f, + 0.0668710252134883f, 0.0745330063478375f, 0.0827574726486089f, 0.0915570500049407f, + 0.100942354116142f, 0.110921842167215f, 0.121501675374497f, 0.132685593888120f, + 0.144474805463665f, 0.156867889225514f, 0.169860715739713f, 0.183446384495299f, + 0.197615179761091f, 0.212354545640879f, 0.227649080995091f, 0.243480554732640f, + 0.259827941804377f, 0.276667480050824f, 0.293972747873422f, 0.311714762512102f, + 0.329862098524320f, 0.348381025873702f, 0.367235666851846f, 0.386388170876560f, + 0.405798906035553f, 0.425426666078274f, 0.445228891401677f, 0.465161902430052f, + 0.485181143655975f, 0.505241436490520f, 0.525297238967270f, 0.545302910257632f, + 0.565212977885414f, 0.584982405477527f, 0.604566858855629f, 0.623922968261127f, + 0.643008584513597f, 0.661783026930517f, 0.680207320884341f, 0.698244422941288f, + 0.715859431614468f, 0.733019781871777f, 0.749695421665815f, 0.765858968898205f, + 0.781485847393429f, 0.796554400636541f, 0.811045982224021f, 0.824945022186269f, + 0.838239068562518f, 0.850918803842860f, 0.862978036135913f, 0.874413665172658f, + 0.885225623515076f, 0.895416793600184f, 0.904992901513335f, 0.913962388646463f, + 0.922336262654064f, 0.930127929368794f, 0.937353007575688f, 0.944029128765173f, + 0.950175724185808f, 0.955813801693484f, 0.960965715039994f, 0.965654928355726f, + 0.969905778654342f, 0.973743239217655f, 0.977192686702912f, 0.980279674750013f, + 0.983029716751026f, 0.985468080278805f, 0.987619595456638f, 0.989508479289711f, + 0.991158177676277f, 0.992591226478046f, 0.993829132663272f, 0.994892276151289f, + 0.995799832594078f, 0.996569716939470f, 0.997218547242656f, 0.997761627838482f, + 0.998212950666223f, 0.998585213259802f, 0.998889851686633f, 0.999137086542491f, + 0.999335979990921f, 0.999494501774465f, 0.999619602119988f, 0.999717289508270f, + 0.999792711373630f, 0.999850235936272f, 0.999893533540622f, 0.999925656069088f, + 0.999949113214013f, 0.999965944612802f, 0.999977787074566f, 0.999985936344066f, + 0.999991403054165f, 0.999994962706365f, 0.999997199686635f, 0.999998545467760f, + 0.999999311268578f, 0.999999715534135f, 0.999999906669617f, 0.999999981506116f +}; + +const float ivas_lpf_4_butter_16k_sos[IVAS_BIQUAD_FILT_LEN << 2] = +{ + 3.97464794223146e-07f, 7.94929601777927e-07f, 3.97464788468481e-07f, 1.f, + -1.90746797905194f, 0.909956295365785f, 1.f, 1.99999996645833f, + 1.00000001447843f, 1.f, -1.95913666348268f, 0.961692382252710f +}; + +const float ivas_lpf_4_butter_32k_sos[IVAS_BIQUAD_FILT_LEN << 2] = +{ + 2.56674586654460e-08f, 5.13349181918215e-08f, 2.56674582938215e-08f, 1, + -1.95329015717623f, 0.953926661219383f, 1, 1.99999996645833f, + 1.00000001447843f, 1, -1.98000953138860f, 0.980654742275836f +}; + +const float ivas_lpf_4_butter_48k_sos[IVAS_BIQUAD_FILT_LEN << 2] = +{ + 5.12617881476274e-09f, 1.02523584294987e-08f, 5.12617879059970e-09f, + 1.0, -1.96875982668433f, 0.969044914826862f, 1.f , 1.99999984394358f, + 1.00000000471366f, 1.f , -1.98677297369091f, 0.987060670205863f +}; + +const float ivas_lpf_2_butter_16k[IVAS_BIQUAD_FILT_LEN << 1] = +{ + 0.000628720643081143f, 0.00125744128616229f, 0.000628720643081143f, 1.f, -1.92783286977036f, 0.930347752342683f +}; + +const float ivas_lpf_2_butter_32k[IVAS_BIQUAD_FILT_LEN << 1] = +{ + 0.000159990787823749f, 0.000319981575647499f, 0.000159990787823749f, 1.f, -1.96390539174033f, 0.964545354891623f +}; + +const float ivas_lpf_2_butter_48k[IVAS_BIQUAD_FILT_LEN << 1] = +{ + 7.15317998432330e-05f, 0.000143063599686466f, 7.15317998432330e-05f, 1.f, -1.97593552482925f, 0.976221652028620f +}; + +const ivas_lfe_freq_models ivas_str_lfe_freq_models = +{ + { 16384, 14924, 13463, 12003, 10542, 9082, 7622, 6161, + 4701, 4336, 3970, 3605, 3240, 2875, 2510, 2145, + 1780, 1689, 1597, 1506, 1415, 1323, 1232, 1141, + 1050, 1004, 958, 913, 867, 821, 776, 730, + 685, 639, 593, 548, 502, 456, 411, 365, + 319, 297, 274, 251, 228, 205, 183, 160, + 137, 126, 114, 103, 91, 80, 68, 57, + 46, 40, 34, 29, 23, 17, 11, 6, 0 }, + + { 16384, 13463, 10542, 7622, 4701, 3970, 3240, 2510, + 1780, 1597, 1415, 1232, 1050, 958, 867, 776, + 685, 593, 502, 411, 319, 274, 228, 183, + 137, 114, 91, 68, 46, 34, 23, 11, 0 }, + + { 16384, 4701, 1780, 1050, 685, 319, 137, 46, + 0, }, + + { 16384, 3277, 0 }, + + { 16384, 13463, 10542, 7622, 4701, 3970, 3240, 2510, + 1780, 1597, 1415, 1232, 1050, 958, 867, 776, + 685, 593, 502, 411, 319, 274, 228, 183, + 137, 114, 91, 68, 46, 34, 23, 11, + 0 }, + + { 16384, 10542, 4701, 3240, 1780, 1415, 1050, 867, + 685, 502, 319, 228, 137, 91, 46, 23, + 0 }, + + { 16384, 4468, 1489, 745, 0 }, 0, +}; + +const int16_t ivas_lfe_num_ele_in_coder_models[2][4] = +{ + { 63, 31, 7, 1 },{ 31, 15, 3, 0 } +}; + +const int16_t ivas_lfe_num_dct_pass_bins_tbl[IVAS_LFE_NUM_COEFFS_IN_SUBGRP] = { 8, 6 }; + +const int16_t ivas_lfe_min_shift_tbl[IVAS_LFE_NUM_COEFFS_IN_SUBGRP] = { 1, 0 }; + +const float ivas_lfe_lpf_delay[2] = { 0.00175f, 0.0035f }; + +const double d_hamm_lfe_plc[LFE_PLC_LENANA / 2] = +{ + 0.08000000000000002, 0.08015895227847719, 0.08063569926248770, 0.08142991147368656, 0.08254104003450596, 0.08396831704748331, 0.08571075612595230, 0.08776715307573196, + 0.09013608672734141, 0.09281591991816535, 0.09580480062389246, 0.09910066323844335, 0.10270123000150438, 0.10660401257268071, 0.11080631375118072, 0.11530522933984272, + 0.12009765015221685, 0.12518026416131367, 0.13054955878853602, 0.13620182333121073, 0.14213315152704381, 0.14833944425372619, 0.15481641236182375, 0.16155957963899570, + 0.16856428590349043, 0.17582569022478273, 0.18333877426912554, 0.19109834576770490, 0.19909904210500018, 0.20733533402487142, 0.21580152945181053, 0.22449177742471671, + 0.23340007214047787, 0.24252025710456171, 0.25184602938575001, 0.26137094397207467, 0.27108841822494550, 0.28099173642839037, 0.29107405443026624, 0.30132840437223085, + 0.31174769950520753, 0.32232473908701620, 0.33305221335878232, 0.34392270859668939, 0.35492871223557998, 0.36606261806086549, 0.37731673146515798, 0.38868327476598852, + 0.40015439258093899, 0.41172215725647360, 0.42337857434671339, 0.43511558813837425, 0.44692508721804453, 0.45879891007795709, 0.47072885075638249, 0.48270666450874267, + 0.49472407350552849, 0.50677277255308162, 0.51884443483328757, 0.53093071765821398, 0.54302326823571601, 0.55511372944202464, 0.56719374559732838, 0.57925496824035816, + 0.59128906189798180, 0.60328770984582458, 0.61524261985593010, 0.62714552992749328, 0.63898821399670414, 0.65076248762175315, 0.66246021363907504, 0.67407330778691554, + 0.68559374429233988, 0.69701356141781945, 0.70832486696356345, 0.71951984372179334, 0.73059075487919101, 0.74152994936378558, 0.75232986713258543, 0.76298304439630038, + 0.77348211877754336, 0.78381983439894576, 0.79398904689767136, 0.80398272836286389, 0.81379397219261318, 0.82341599786708708, 0.83284215563452701, 0.84206593110687011, + 0.85108094976182280, 0.85988098134827329, 0.86845994419199846, 0.87681190939868969, 0.88493110495139349, 0.89281191969953333, 0.90044890723675941, 0.90783678966494241, + 0.91497046124171255, 0.92184499190902180, 0.92845563070029180, 0.93479780902379184, 0.94086714381997805, 0.94665944059061280, 0.95217069629756890, 0.95739710212931617, + 0.96233504613317988, 0.96698111571154954, 0.97133209998031445, 0.97538499198789563, 0.97913699079334116, 0.98258550340204664, 0.98572814655776630, 0.98856274838967395, + 0.99108734991333569, 0.99330020638455863, 0.99519978850517732, 0.99678478347994692, 0.99805409592381300, 0.99900684861892730, 0.99964238312089115, 0.99996026021380402 +}; + + +/*------------------------------------------------------------------------------------------* + * MDFT/iMDFT ROM tables + *------------------------------------------------------------------------------------------*/ + +const float ivas_mdft_coeff_cos_twid_960[IVAS_960_PT_LEN + 1] = +{ + 1.00000000000000f, 0.999998661349528f, 0.999994645401697f, 0.999987952167257f, + 0.999978581664129f, 0.999966533917401f, 0.999951808959328f, 0.999934406829333f, + 0.999914327574007f, 0.999891571247108f, 0.999866137909562f, 0.999838027629461f, + 0.999807240482065f, 0.999773776549800f, 0.999737635922260f, 0.999698818696204f, + 0.999657324975557f, 0.999613154871411f, 0.999566308502021f, 0.999516785992811f, + 0.999464587476366f, 0.999409713092437f, 0.999352162987941f, 0.999291937316955f, + 0.999229036240723f, 0.999163459927649f, 0.999095208553300f, 0.999024282300407f, + 0.998950681358860f, 0.998874405925711f, 0.998795456205172f, 0.998713832408616f, + 0.998629534754574f, 0.998542563468736f, 0.998452918783950f, 0.998360600940223f, + 0.998265610184716f, 0.998167946771749f, 0.998067610962796f, 0.997964603026487f, + 0.997858923238604f, 0.997750571882084f, 0.997639549247016f, 0.997525855630641f, + 0.997409491337352f, 0.997290456678690f, 0.997168751973348f, 0.997044377547164f, + 0.996917333733128f, 0.996787620871373f, 0.996655239309180f, 0.996520189400975f, + 0.996382471508325f, 0.996242085999945f, 0.996099033251687f, 0.995953313646548f, + 0.995804927574662f, 0.995653875433303f, 0.995500157626885f, 0.995343774566954f, + 0.995184726672197f, 0.995023014368432f, 0.994858638088611f, 0.994691598272820f, + 0.994521895368273f, 0.994349529829318f, 0.994174502117428f, 0.993996812701206f, + 0.993816462056378f, 0.993633450665799f, 0.993447779019444f, 0.993259447614414f, + 0.993068456954926f, 0.992874807552322f, 0.992678499925058f, 0.992479534598710f, + 0.992277912105967f, 0.992073632986633f, 0.991866697787626f, 0.991657107062973f, + 0.991444861373810f, 0.991229961288385f, 0.991012407382049f, 0.990792200237260f, + 0.990569340443577f, 0.990343828597665f, 0.990115665303286f, 0.989884851171301f, + 0.989651386819670f, 0.989415272873448f, 0.989176509964781f, 0.988935098732911f, + 0.988691039824167f, 0.988444333891970f, 0.988194981596825f, 0.987942983606322f, + 0.987688340595138f, 0.987431053245027f, 0.987171122244825f, 0.986908548290446f, + 0.986643332084879f, 0.986375474338188f, 0.986104975767509f, 0.985831837097047f, + 0.985556059058078f, 0.985277642388941f, 0.984996587835043f, 0.984712896148850f, + 0.984426568089892f, 0.984137604424753f, 0.983846005927077f, 0.983551773377562f, + 0.983254907563955f, 0.982955409281056f, 0.982653279330712f, 0.982348518521816f, + 0.982041127670304f, 0.981731107599154f, 0.981418459138384f, 0.981103183125046f, + 0.980785280403230f, 0.980464751824058f, 0.980141598245680f, 0.979815820533276f, + 0.979487419559051f, 0.979156396202234f, 0.978822751349072f, 0.978486485892835f, + 0.978147600733806f, 0.977806096779282f, 0.977461974943572f, 0.977115236147994f, + 0.976765881320872f, 0.976413911397535f, 0.976059327320311f, 0.975702130038529f, + 0.975342320508513f, 0.974979899693582f, 0.974614868564045f, 0.974247228097201f, + 0.973876979277334f, 0.973504123095711f, 0.973128660550580f, 0.972750592647168f, + 0.972369920397677f, 0.971986644821279f, 0.971600766944121f, 0.971212287799312f, + 0.970821208426928f, 0.970427529874007f, 0.970031253194544f, 0.969632379449492f, + 0.969230909706754f, 0.968826845041188f, 0.968420186534595f, 0.968010935275723f, + 0.967599092360260f, 0.967184658890834f, 0.966767635977008f, 0.966348024735277f, + 0.965925826289068f, 0.965501041768733f, 0.965073672311547f, 0.964643719061708f, + 0.964211183170329f, 0.963776065795440f, 0.963338368101980f, 0.962898091261798f, + 0.962455236453647f, 0.962009804863184f, 0.961561797682962f, 0.961111216112432f, + 0.960658061357935f, 0.960202334632705f, 0.959744037156857f, 0.959283170157394f, + 0.958819734868193f, 0.958353732530011f, 0.957885164390477f, 0.957414031704088f, + 0.956940335732209f, 0.956464077743065f, 0.955985259011744f, 0.955503880820186f, + 0.955019944457187f, 0.954533451218389f, 0.954044402406280f, 0.953552799330194f, + 0.953058643306297f, 0.952561935657595f, 0.952062677713924f, 0.951560870811948f, + 0.951056516295154f, 0.950549615513851f, 0.950040169825165f, 0.949528180593037f, + 0.949013649188214f, 0.948496576988253f, 0.947976965377510f, 0.947454815747144f, + 0.946930129495106f, 0.946402908026138f, 0.945873152751771f, 0.945340865090320f, + 0.944806046466878f, 0.944268698313317f, 0.943728822068278f, 0.943186419177173f, + 0.942641491092178f, 0.942094039272230f, 0.941544065183021f, 0.940991570296997f, + 0.940436556093355f, 0.939879024058033f, 0.939318975683713f, 0.938756412469813f, + 0.938191335922484f, 0.937623747554606f, 0.937053648885784f, 0.936481041442343f, + 0.935905926757326f, 0.935328306370488f, 0.934748181828292f, 0.934165554683908f, + 0.933580426497202f, 0.932992798834739f, 0.932402673269775f, 0.931810051382254f, + 0.931214934758804f, 0.930617324992729f, 0.930017223684012f, 0.929414632439304f, + 0.928809552871924f, 0.928201986601852f, 0.927591935255724f, 0.926979400466833f, + 0.926364383875118f, 0.925746887127164f, 0.925126911876195f, 0.924504459782072f, + 0.923879532511287f, 0.923252131736957f, 0.922622259138823f, 0.921989916403245f, + 0.921355105223193f, 0.920717827298248f, 0.920078084334595f, 0.919435878045019f, + 0.918791210148898f, 0.918144082372204f, 0.917494496447491f, 0.916842454113897f, + 0.916187957117136f, 0.915531007209492f, 0.914871606149819f, 0.914209755703531f, + 0.913545457642601f, 0.912878713745555f, 0.912209525797468f, 0.911537895589956f, + 0.910863824921176f, 0.910187315595818f, 0.909508369425101f, 0.908826988226768f, + 0.908143173825081f, 0.907456928050819f, 0.906768252741266f, 0.906077149740215f, + 0.905383620897955f, 0.904687668071273f, 0.903989293123443f, 0.903288497924226f, + 0.902585284349861f, 0.901879654283062f, 0.901171609613013f, 0.900461152235364f, + 0.899748284052222f, 0.899033006972149f, 0.898315322910159f, 0.897595233787707f, + 0.896872741532688f, 0.896147848079432f, 0.895420555368697f, 0.894690865347664f, + 0.893958779969932f, 0.893224301195515f, 0.892487430990834f, 0.891748171328711f, + 0.891006524188368f, 0.890262491555416f, 0.889516075421856f, 0.888767277786068f, + 0.888016100652807f, 0.887262546033203f, 0.886506615944746f, 0.885748312411291f, + 0.884987637463042f, 0.884224593136556f, 0.883459181474733f, 0.882691404526809f, + 0.881921264348355f, 0.881148763001268f, 0.880373902553765f, 0.879596685080383f, + 0.878817112661965f, 0.878035187385663f, 0.877250911344924f, 0.876464286639493f, + 0.875675315375400f, 0.874883999664958f, 0.874090341626759f, 0.873294343385663f, + 0.872496007072797f, 0.871695334825548f, 0.870892328787557f, 0.870086991108712f, + 0.869279323945144f, 0.868469329459222f, 0.867657009819544f, 0.866842367200935f, + 0.866025403784439f, 0.865206121757311f, 0.864384523313017f, 0.863560610651224f, + 0.862734385977792f, 0.861905851504774f, 0.861075009450407f, 0.860241862039105f, + 0.859406411501453f, 0.858568660074204f, 0.857728610000272f, 0.856886263528723f, + 0.856041622914771f, 0.855194690419775f, 0.854345468311227f, 0.853493958862751f, + 0.852640164354092f, 0.851784087071117f, 0.850925729305802f, 0.850065093356229f, + 0.849202181526579f, 0.848336996127127f, 0.847469539474235f, 0.846599813890344f, + 0.845727821703973f, 0.844853565249707f, 0.843977046868193f, 0.843098268906136f, + 0.842217233716287f, 0.841333943657443f, 0.840448401094438f, 0.839560608398136f, + 0.838670567945424f, 0.837778282119209f, 0.836883753308409f, 0.835986983907947f, + 0.835087976318743f, 0.834186732947712f, 0.833283256207754f, 0.832377548517748f, + 0.831469612302545f, 0.830559449992965f, 0.829647064025785f, 0.828732456843738f, + 0.827815630895502f, 0.826896588635696f, 0.825975332524873f, 0.825051865029513f, + 0.824126188622016f, 0.823198305780696f, 0.822268218989775f, 0.821335930739376f, + 0.820401443525514f, 0.819464759850093f, 0.818525882220897f, 0.817584813151584f, + 0.816641555161679f, 0.815696110776568f, 0.814748482527489f, 0.813798672951530f, + 0.812846684591615f, 0.811892519996505f, 0.810936181720784f, 0.809977672324859f, + 0.809016994374948f, 0.808054150443073f, 0.807089143107059f, 0.806121974950521f, + 0.805152648562858f, 0.804181166539250f, 0.803207531480645f, 0.802231745993758f, + 0.801253812691061f, 0.800273734190774f, 0.799291513116864f, 0.798307152099032f, + 0.797320653772707f, 0.796332020779044f, 0.795341255764910f, 0.794348361382882f, + 0.793353340291235f, 0.792356195153942f, 0.791356928640660f, 0.790355543426726f, + 0.789352042193150f, 0.788346427626606f, 0.787338702419428f, 0.786328869269598f, + 0.785316930880745f, 0.784302889962131f, 0.783286749228650f, 0.782268511400816f, + 0.781248179204759f, 0.780225755372213f, 0.779201242640517f, 0.778174643752598f, + 0.777145961456971f, 0.776115198507728f, 0.775082357664531f, 0.774047441692607f, + 0.773010453362737f, 0.771971395451250f, 0.770930270740018f, 0.769887082016445f, + 0.768841832073460f, 0.767794523709512f, 0.766745159728562f, 0.765693742940071f, + 0.764640276159000f, 0.763584762205796f, 0.762527203906388f, 0.761467604092177f, + 0.760405965600031f, 0.759342291272276f, 0.758276583956687f, 0.757208846506485f, + 0.756139081780323f, 0.755067292642284f, 0.753993481961869f, 0.752917652613995f, + 0.751839807478977f, 0.750759949442534f, 0.749678081395770f, 0.748594206235171f, + 0.747508326862597f, 0.746420446185274f, 0.745330567115786f, 0.744238692572067f, + 0.743144825477394f, 0.742048968760379f, 0.740951125354959f, 0.739851298200392f, + 0.738749490241246f, 0.737645704427393f, 0.736539943713999f, 0.735432211061519f, + 0.734322509435686f, 0.733210841807505f, 0.732097211153246f, 0.730981620454432f, + 0.729864072697836f, 0.728744570875469f, 0.727623117984575f, 0.726499717027620f, + 0.725374371012288f, 0.724247082951467f, 0.723117855863248f, 0.721986692770910f, + 0.720853596702919f, 0.719718570692913f, 0.718581617779698f, 0.717442741007240f, + 0.716301943424654f, 0.715159228086199f, 0.714014598051268f, 0.712868056384380f, + 0.711719606155171f, 0.710569250438390f, 0.709416992313883f, 0.708262834866593f, + 0.707106781186548f, 0.705948834368849f, 0.704788997513670f, 0.703627273726243f, + 0.702463666116852f, 0.701298177800824f, 0.700130811898524f, 0.698961571535339f, + 0.697790459841680f, 0.696617479952964f, 0.695442635009612f, 0.694265928157036f, + 0.693087362545636f, 0.691906941330786f, 0.690724667672829f, 0.689540544737067f, + 0.688354575693754f, 0.687166763718086f, 0.685977111990193f, 0.684785623695130f, + 0.683592302022871f, 0.682397150168297f, 0.681200171331188f, 0.680001368716218f, + 0.678800745532942f, 0.677598304995789f, 0.676394050324054f, 0.675187984741891f, + 0.673980111478298f, 0.672770433767117f, 0.671558954847018f, 0.670345677961497f, + 0.669130606358858f, 0.667913743292216f, 0.666695092019479f, 0.665474655803342f, + 0.664252437911282f, 0.663028441615542f, 0.661802670193130f, 0.660575126925805f, + 0.659345815100069f, 0.658114738007160f, 0.656881898943041f, 0.655647301208395f, + 0.654410948108610f, 0.653172842953777f, 0.651932989058674f, 0.650691389742765f, + 0.649448048330184f, 0.648202968149730f, 0.646956152534857f, 0.645707604823667f, + 0.644457328358897f, 0.643205326487914f, 0.641951602562703f, 0.640696159939861f, + 0.639439001980585f, 0.638180132050665f, 0.636919553520476f, 0.635657269764965f, + 0.634393284163646f, 0.633127600100588f, 0.631860220964409f, 0.630591150148264f, + 0.629320391049838f, 0.628047947071334f, 0.626773821619470f, 0.625498018105461f, + 0.624220539945018f, 0.622941390558334f, 0.621660573370077f, 0.620378091809381f, + 0.619093949309834f, 0.617808149309472f, 0.616520695250769f, 0.615231590580627f, + 0.613940838750366f, 0.612648443215719f, 0.611354407436817f, 0.610058734878182f, + 0.608761429008721f, 0.607462493301711f, 0.606161931234795f, 0.604859746289968f, + 0.603555941953571f, 0.602250521716282f, 0.600943489073102f, 0.599634847523352f, + 0.598324600570659f, 0.597012751722948f, 0.595699304492433f, 0.594384262395609f, + 0.593067628953237f, 0.591749407690343f, 0.590429602136201f, 0.589108215824328f, + 0.587785252292473f, 0.586460715082607f, 0.585134607740916f, 0.583806933817786f, + 0.582477696867802f, 0.581146900449730f, 0.579814548126514f, 0.578480643465260f, + 0.577145190037234f, 0.575808191417845f, 0.574469651186643f, 0.573129572927301f, + 0.571787960227612f, 0.570444816679478f, 0.569100145878898f, 0.567753951425961f, + 0.566406236924833f, 0.565057005983753f, 0.563706262215017f, 0.562354009234973f, + 0.561000250664010f, 0.559644990126546f, 0.558288231251022f, 0.556929977669890f, + 0.555570233019602f, 0.554209000940606f, 0.552846285077328f, 0.551482089078169f, + 0.550116416595494f, 0.548749271285616f, 0.547380656808797f, 0.546010576829228f, + 0.544639035015027f, 0.543266035038224f, 0.541891580574752f, 0.540515675304440f, + 0.539138322911000f, 0.537759527082020f, 0.536379291508950f, 0.534997619887097f, + 0.533614515915612f, 0.532229983297479f, 0.530844025739510f, 0.529456646952329f, + 0.528067850650368f, 0.526677640551852f, 0.525286020378792f, 0.523892993856974f, + 0.522498564715949f, 0.521102736689023f, 0.519705513513249f, 0.518306898929413f, + 0.516906896682028f, 0.515505510519320f, 0.514102744193222f, 0.512698601459362f, + 0.511293086077052f, 0.509886201809281f, 0.508477952422700f, 0.507068341687617f, + 0.505657373377985f, 0.504245051271389f, 0.502831379149042f, 0.501416360795769f, + 0.500000000000000f, 0.498582300553759f, 0.497163266252654f, 0.495742900895868f, + 0.494321208286145f, 0.492898192229784f, 0.491473856536628f, 0.490048205020053f, + 0.488621241496955f, 0.487192969787746f, 0.485763393716340f, 0.484332517110141f, + 0.482900343800037f, 0.481466877620387f, 0.480032122409011f, 0.478596082007181f, + 0.477158760259609f, 0.475720161014437f, 0.474280288123229f, 0.472839145440959f, + 0.471396736825998f, 0.469953066140108f, 0.468508137248432f, 0.467061954019477f, + 0.465614520325111f, 0.464165840040552f, 0.462715917044350f, 0.461264755218387f, + 0.459812358447860f, 0.458358730621271f, 0.456903875630421f, 0.455447797370393f, + 0.453990499739547f, 0.452531986639508f, 0.451072261975153f, 0.449611329654607f, + 0.448149193589223f, 0.446685857693580f, 0.445221325885468f, 0.443755602085881f, + 0.442288690219001f, 0.440820594212194f, 0.439351317995994f, 0.437880865504095f, + 0.436409240673342f, 0.434936447443717f, 0.433462489758331f, 0.431987371563412f, + 0.430511096808295f, 0.429033669445413f, 0.427555093430282f, 0.426075372721496f, + 0.424594511280713f, 0.423112513072644f, 0.421629382065045f, 0.420145122228703f, + 0.418659737537428f, 0.417173231968043f, 0.415685609500371f, 0.414196874117224f, + 0.412707029804395f, 0.411216080550645f, 0.409724030347695f, 0.408230883190212f, + 0.406736643075800f, 0.405241314004990f, 0.403744899981227f, 0.402247405010863f, + 0.400748833103141f, 0.399249188270190f, 0.397748474527011f, 0.396246695891466f, + 0.394743856384267f, 0.393239960028970f, 0.391735010851956f, 0.390229012882428f, + 0.388721970152396f, 0.387213886696666f, 0.385704766552831f, 0.384194613761262f, + 0.382683432365090f, 0.381171226410203f, 0.379657999945233f, 0.378143757021541f, + 0.376628501693211f, 0.375112238017038f, 0.373594970052516f, 0.372076701861829f, + 0.370557437509836f, 0.369037181064067f, 0.367515936594704f, 0.365993708174577f, + 0.364470499879150f, 0.362946315786509f, 0.361421159977355f, 0.359895036534988f, + 0.358367949545300f, 0.356839903096763f, 0.355310901280416f, 0.353780948189858f, + 0.352250047921234f, 0.350718204573223f, 0.349185422247033f, 0.347651705046382f, + 0.346117057077493f, 0.344581482449081f, 0.343044985272340f, 0.341507569660936f, + 0.339969239730994f, 0.338429999601086f, 0.336889853392220f, 0.335348805227832f, + 0.333806859233771f, 0.332264019538291f, 0.330720290272038f, 0.329175675568039f, + 0.327630179561693f, 0.326083806390759f, 0.324536560195342f, 0.322988445117886f, + 0.321439465303162f, 0.319889624898253f, 0.318338928052550f, 0.316787378917734f, + 0.315234981647770f, 0.313681740398892f, 0.312127659329594f, 0.310572742600619f, + 0.309016994374947f, 0.307460418817785f, 0.305903020096554f, 0.304344802380877f, + 0.302785769842575f, 0.301225926655645f, 0.299665276996257f, 0.298103825042740f, + 0.296541574975571f, 0.294978530977364f, 0.293414697232857f, 0.291850077928904f, + 0.290284677254463f, 0.288718499400580f, 0.287151548560387f, 0.285583828929082f, + 0.284015344703923f, 0.282446100084212f, 0.280876099271292f, 0.279305346468526f, + 0.277733845881292f, 0.276161601716971f, 0.274588618184932f, 0.273014899496527f, + 0.271440449865074f, 0.269865273505849f, 0.268289374636071f, 0.266712757474899f, + 0.265135426243408f, 0.263557385164591f, 0.261978638463337f, 0.260399190366428f, + 0.258819045102521f, 0.257238206902140f, 0.255656679997665f, 0.254074468623318f, + 0.252491577015158f, 0.250908009411060f, 0.249323770050712f, 0.247738863175598f, + 0.246153293028993f, 0.244567063855944f, 0.242980179903264f, 0.241392645419519f, + 0.239804464655017f, 0.238215641861795f, 0.236626181293610f, 0.235036087205927f, + 0.233445363855905f, 0.231854015502391f, 0.230262046405902f, 0.228669460828619f, + 0.227076263034373f, 0.225482457288634f, 0.223888047858498f, 0.222293039012681f, + 0.220697435021501f, 0.219101240156870f, 0.217504458692281f, 0.215907094902801f, + 0.214309153065051f, 0.212710637457203f, 0.211111552358965f, 0.209511902051569f, + 0.207911690817759f, 0.206310922941784f, 0.204709602709380f, 0.203107734407763f, + 0.201505322325617f, 0.199902370753082f, 0.198298883981741f, 0.196694866304610f, + 0.195090322016128f, 0.193485255412143f, 0.191879670789901f, 0.190273572448036f, + 0.188666964686555f, 0.187059851806832f, 0.185452238111591f, 0.183844127904898f, + 0.182235525492147f, 0.180626435180053f, 0.179016861276633f, 0.177406808091201f, + 0.175796279934354f, 0.174185281117962f, 0.172573815955152f, 0.170961888760301f, + 0.169349503849025f, 0.167736665538162f, 0.166123378145765f, 0.164509645991092f, + 0.162895473394589f, 0.161280864677881f, 0.159665824163761f, 0.158050356176180f, + 0.156434465040231f, 0.154818155082141f, 0.153201430629259f, 0.151584296010041f, + 0.149966755554045f, 0.148348813591913f, 0.146730474455362f, 0.145111742477173f, + 0.143492621991180f, 0.141873117332253f, 0.140253232836296f, 0.138632972840227f, + 0.137012341681968f, 0.135391343700438f, 0.133769983235535f, 0.132148264628130f, + 0.130526192220052f, 0.128903770354076f, 0.127281003373913f, 0.125657895624201f, + 0.124034451450485f, 0.122410675199216f, 0.120786571217731f, 0.119162143854244f, + 0.117537397457838f, 0.115912336378446f, 0.114286964966846f, 0.112661287574648f, + 0.111035308554278f, 0.109409032258971f, 0.107782463042760f, 0.106155605260457f, + 0.104528463267653f, 0.102901041420696f, 0.101273344076683f, 0.0996453755934510f, + 0.0980171403295608f, 0.0963886426442880f, 0.0947598868976111f, 0.0931308774501999f, + 0.0915016186634025f, 0.0898721148992351f, 0.0882423705203694f, 0.0866123898901223f, + 0.0849821773724418f, 0.0833517373318973f, 0.0817210741336683f, 0.0800901921435302f, + 0.0784590957278450f, 0.0768277892535488f, 0.0751962770881400f, 0.0735645635996675f, + 0.0719326531567196f, 0.0703005501284112f, 0.0686682588843738f, 0.0670357837947423f, + 0.0654031292301431f, 0.0637702995616845f, 0.0621372991609429f, 0.0605041323999515f, + 0.0588708036511890f, 0.0572373172875686f, 0.0556036776824248f, 0.0539698892095020f, + 0.0523359562429437f, 0.0507018831572809f, 0.0490676743274181f, 0.0474333341286244f, + 0.0457988669365209f, 0.0441642771270675f, 0.0425295690765532f, 0.0408947471615835f, + 0.0392598157590687f, 0.0376247792462120f, 0.0359896420004986f, 0.0343544083996823f, + 0.0327190828217762f, 0.0310836696450389f, 0.0294481732479632f, 0.0278125980092656f, + 0.0261769483078731f, 0.0245412285229125f, 0.0229054430336971f, 0.0212695962197177f, + 0.0196336924606285f, 0.0179977361362357f, 0.0163617316264867f, 0.0147256833114587f, + 0.0130895955713446f, 0.0114534727864437f, 0.00981731933714973f, 0.00818113960393724f, + 0.00654493796735196f, 0.00490871880799808f, 0.00327248650652671f, 0.00163624544362412f, + 0.00000000000000000f +}; + +const float ivas_mdft_coeff_cos_twid_640[IVAS_640_PT_LEN + 1] = +{ + 1.00000000000000f, 0.999996988037278f, 0.999987952167257f, 0.999972892444367f, + 0.999951808959328f, 0.999924701839145f, 0.999891571247108f, 0.999852417382795f, + 0.999807240482065f, 0.999756040817060f, 0.999698818696204f, 0.999635574464198f, + 0.999566308502021f, 0.999491021226926f, 0.999409713092437f, 0.999322384588350f, + 0.999229036240723f, 0.999129668611881f, 0.999024282300407f, 0.998912877941140f, + 0.998795456205172f, 0.998672017799843f, 0.998542563468736f, 0.998407093991674f, + 0.998265610184716f, 0.998118112900149f, 0.997964603026487f, 0.997805081488460f, + 0.997639549247016f, 0.997468007299307f, 0.997290456678690f, 0.997106898454717f, + 0.996917333733128f, 0.996721763655847f, 0.996520189400975f, 0.996312612182778f, + 0.996099033251687f, 0.995879453894286f, 0.995653875433303f, 0.995422299227608f, + 0.995184726672197f, 0.994941159198190f, 0.994691598272820f, 0.994436045399422f, + 0.994174502117428f, 0.993906970002356f, 0.993633450665799f, 0.993353945755417f, + 0.993068456954926f, 0.992776985984091f, 0.992479534598710f, 0.992176104590609f, + 0.991866697787626f, 0.991551316053606f, 0.991229961288385f, 0.990902635427780f, + 0.990569340443577f, 0.990230078343521f, 0.989884851171301f, 0.989533661006540f, + 0.989176509964781f, 0.988813400197476f, 0.988444333891970f, 0.988069313271492f, + 0.987688340595138f, 0.987301418157858f, 0.986908548290446f, 0.986509733359519f, + 0.986104975767509f, 0.985694277952645f, 0.985277642388941f, 0.984855071586178f, + 0.984426568089892f, 0.983992134481354f, 0.983551773377562f, 0.983105487431216f, + 0.982653279330712f, 0.982195151800116f, 0.981731107599154f, 0.981261149523195f, + 0.980785280403230f, 0.980303503105861f, 0.979815820533276f, 0.979322235623241f, + 0.978822751349072f, 0.978317370719628f, 0.977806096779282f, 0.977288932607910f, + 0.976765881320872f, 0.976236946068990f, 0.975702130038529f, 0.975161436451181f, + 0.974614868564045f, 0.974062429669605f, 0.973504123095711f, 0.972939952205560f, + 0.972369920397677f, 0.971794031105889f, 0.971212287799312f, 0.970624693982323f, + 0.970031253194544f, 0.969431969010818f, 0.968826845041188f, 0.968215884930876f, + 0.967599092360260f, 0.966976471044852f, 0.966348024735277f, 0.965713757217249f, + 0.965073672311547f, 0.964427773873996f, 0.963776065795440f, 0.963118552001719f, + 0.962455236453647f, 0.961786123146989f, 0.961111216112432f, 0.960430519415566f, + 0.959744037156857f, 0.959051773471624f, 0.958353732530011f, 0.957649918536965f, + 0.956940335732209f, 0.956224988390216f, 0.955503880820186f, 0.954777017366017f, + 0.954044402406280f, 0.953306040354194f, 0.952561935657595f, 0.951812092798916f, + 0.951056516295154f, 0.950295210697844f, 0.949528180593037f, 0.948755430601263f, + 0.947976965377510f, 0.947192789611197f, 0.946402908026138f, 0.945607325380521f, + 0.944806046466878f, 0.943999076112052f, 0.943186419177173f, 0.942368080557626f, + 0.941544065183021f, 0.940714378017165f, 0.939879024058033f, 0.939038008337734f, + 0.938191335922484f, 0.937339011912575f, 0.936481041442343f, 0.935617429680138f, + 0.934748181828292f, 0.933873303123092f, 0.932992798834739f, 0.932106674267327f, + 0.931214934758804f, 0.930317585680942f, 0.929414632439304f, 0.928506080473216f, + 0.927591935255724f, 0.926672202293573f, 0.925746887127164f, 0.924815995330528f, + 0.923879532511287f, 0.922937504310623f, 0.921989916403245f, 0.921036774497350f, + 0.920078084334595f, 0.919113851690058f, 0.918144082372204f, 0.917168782222852f, + 0.916187957117136f, 0.915201612963474f, 0.914209755703531f, 0.913212391312179f, + 0.912209525797468f, 0.911201165200584f, 0.910187315595818f, 0.909167983090522f, + 0.908143173825081f, 0.907112893972869f, 0.906077149740215f, 0.905035947366364f, + 0.903989293123443f, 0.902937193316419f, 0.901879654283062f, 0.900816682393908f, + 0.899748284052222f, 0.898674465693954f, 0.897595233787707f, 0.896510594834693f, + 0.895420555368697f, 0.894325121956035f, 0.893224301195515f, 0.892118099718401f, + 0.891006524188368f, 0.889889581301463f, 0.888767277786068f, 0.887639620402854f, + 0.886506615944746f, 0.885368271236879f, 0.884224593136556f, 0.883075588533209f, + 0.881921264348355f, 0.880761627535558f, 0.879596685080383f, 0.878426444000357f, + 0.877250911344924f, 0.876070094195407f, 0.874883999664958f, 0.873692634898524f, + 0.872496007072797f, 0.871294123396174f, 0.870086991108712f, 0.868874617482085f, + 0.867657009819544f, 0.866434175455865f, 0.865206121757311f, 0.863972856121587f, + 0.862734385977792f, 0.861490718786378f, 0.860241862039105f, 0.858987823258990f, + 0.857728610000272f, 0.856464229848356f, 0.855194690419775f, 0.853919999362139f, + 0.852640164354092f, 0.851355193105265f, 0.850065093356229f, 0.848769872878448f, + 0.847469539474235f, 0.846164100976699f, 0.844853565249707f, 0.843537940187827f, + 0.842217233716287f, 0.840891453790923f, 0.839560608398136f, 0.838224705554838f, + 0.836883753308409f, 0.835537759736646f, 0.834186732947712f, 0.832830681080094f, + 0.831469612302545f, 0.830103534814044f, 0.828732456843738f, 0.827356386650900f, + 0.825975332524873f, 0.824589302785025f, 0.823198305780696f, 0.821802349891147f, + 0.820401443525514f, 0.818995595122750f, 0.817584813151584f, 0.816169106110459f, + 0.814748482527489f, 0.813322950960406f, 0.811892519996505f, 0.810457198252595f, + 0.809016994374948f, 0.807571917039244f, 0.806121974950521f, 0.804667176843123f, + 0.803207531480645f, 0.801743047655882f, 0.800273734190774f, 0.798799599936358f, + 0.797320653772707f, 0.795836904608884f, 0.794348361382882f, 0.792855033061574f, + 0.791356928640660f, 0.789854057144609f, 0.788346427626606f, 0.786834049168500f, + 0.785316930880745f, 0.783795081902349f, 0.782268511400816f, 0.780737228572095f, + 0.779201242640517f, 0.777660562858748f, 0.776115198507728f, 0.774565158896617f, + 0.773010453362737f, 0.771451091271519f, 0.769887082016445f, 0.768318435018988f, + 0.766745159728562f, 0.765167265622459f, 0.763584762205797f, 0.761997659011457f, + 0.760405965600031f, 0.758809691559762f, 0.757208846506485f, 0.755603440083571f, + 0.753993481961870f, 0.752378981839648f, 0.750759949442534f, 0.749136394523459f, + 0.747508326862597f, 0.745875756267305f, 0.744238692572067f, 0.742597145638433f, + 0.740951125354959f, 0.739300641637149f, 0.737645704427393f, 0.735986323694910f, + 0.734322509435686f, 0.732654271672413f, 0.730981620454432f, 0.729304565857669f, + 0.727623117984575f, 0.725937286964068f, 0.724247082951467f, 0.722552516128436f, + 0.720853596702919f, 0.719150334909079f, 0.717442741007240f, 0.715730825283819f, + 0.714014598051268f, 0.712294069648014f, 0.710569250438390f, 0.708840150812579f, + 0.707106781186548f, 0.705369152001986f, 0.703627273726243f, 0.701881156852263f, + 0.700130811898524f, 0.698376249408973f, 0.696617479952964f, 0.694854514125194f, + 0.693087362545636f, 0.691316035859480f, 0.689540544737067f, 0.687760899873822f, + 0.685977111990193f, 0.684189191831585f, 0.682397150168297f, 0.680600997795453f, + 0.678800745532942f, 0.676996404225349f, 0.675187984741891f, 0.673375497976352f, + 0.671558954847018f, 0.669738366296610f, 0.667913743292216f, 0.666085096825230f, + 0.664252437911282f, 0.662415777590172f, 0.660575126925805f, 0.658730497006124f, + 0.656881898943041f, 0.655029343872374f, 0.653172842953777f, 0.651312407370671f, + 0.649448048330184f, 0.647579777063073f, 0.645707604823667f, 0.643831542889792f, + 0.641951602562703f, 0.640067795167023f, 0.638180132050665f, 0.636288624584773f, + 0.634393284163646f, 0.632494122204673f, 0.630591150148264f, 0.628684379457781f, + 0.626773821619470f, 0.624859488142386f, 0.622941390558334f, 0.621019540421789f, + 0.619093949309834f, 0.617164628822086f, 0.615231590580627f, 0.613294846229936f, + 0.611354407436817f, 0.609410285890327f, 0.607462493301711f, 0.605511041404326f, + 0.603555941953571f, 0.601597206726822f, 0.599634847523352f, 0.597668876164268f, + 0.595699304492433f, 0.593726144372402f, 0.591749407690343f, 0.589769106353971f, + 0.587785252292473f, 0.585797857456439f, 0.583806933817786f, 0.581812493369691f, + 0.579814548126514f, 0.577813110123727f, 0.575808191417845f, 0.573799804086349f, + 0.571787960227612f, 0.569772671960834f, 0.567753951425961f, 0.565731810783613f, + 0.563706262215017f, 0.561677317921925f, 0.559644990126546f, 0.557609291071472f, + 0.555570233019602f, 0.553527828254070f, 0.551482089078169f, 0.549433027815281f, + 0.547380656808797f, 0.545324988422047f, 0.543266035038224f, 0.541203809060310f, + 0.539138322911000f, 0.537069589032630f, 0.534997619887097f, 0.532922427955790f, + 0.530844025739510f, 0.528762425758396f, 0.526677640551852f, 0.524589682678469f, + 0.522498564715949f, 0.520404299261031f, 0.518306898929413f, 0.516206376355680f, + 0.514102744193222f, 0.511996015114163f, 0.509886201809281f, 0.507773316987935f, + 0.505657373377985f, 0.503538383725718f, 0.501416360795769f, 0.499291317371047f, + 0.497163266252654f, 0.495032220259813f, 0.492898192229784f, 0.490761195017794f, + 0.488621241496955f, 0.486478344558187f, 0.484332517110141f, 0.482183772079123f, + 0.480032122409011f, 0.477877581061184f, 0.475720161014437f, 0.473559875264908f, + 0.471396736825998f, 0.469230758728290f, 0.467061954019477f, 0.464890335764274f, + 0.462715917044350f, 0.460538710958240f, 0.458358730621271f, 0.456175989165483f, + 0.453990499739547f, 0.451802275508688f, 0.449611329654607f, 0.447417675375397f, + 0.445221325885468f, 0.443022294415467f, 0.440820594212194f, 0.438616238538528f, + 0.436409240673342f, 0.434199613911428f, 0.431987371563412f, 0.429772526955677f, + 0.427555093430282f, 0.425335084344881f, 0.423112513072644f, 0.420887393002174f, + 0.418659737537428f, 0.416429560097637f, 0.414196874117224f, 0.411961693045722f, + 0.409724030347695f, 0.407483899502658f, 0.405241314004990f, 0.402996287363860f, + 0.400748833103141f, 0.398498964761330f, 0.396246695891466f, 0.393992040061048f, + 0.391735010851956f, 0.389475621860365f, 0.387213886696666f, 0.384949818985382f, + 0.382683432365090f, 0.380414740488332f, 0.378143757021541f, 0.375870495644950f, + 0.373594970052516f, 0.371317193951838f, 0.369037181064066f, 0.366754945123831f, + 0.364470499879150f, 0.362183859091351f, 0.359895036534988f, 0.357604045997758f, + 0.355310901280416f, 0.353015616196696f, 0.350718204573223f, 0.348418680249435f, + 0.346117057077493f, 0.343813348922205f, 0.341507569660936f, 0.339199733183530f, + 0.336889853392220f, 0.334577944201551f, 0.332264019538291f, 0.329948093341349f, + 0.327630179561693f, 0.325310292162263f, 0.322988445117886f, 0.320664652415197f, + 0.318338928052550f, 0.316011286039934f, 0.313681740398892f, 0.311350305162432f, + 0.309016994374947f, 0.306681822092128f, 0.304344802380877f, 0.302005949319228f, + 0.299665276996257f, 0.297322799511999f, 0.294978530977364f, 0.292632485514051f, + 0.290284677254463f, 0.287935120341621f, 0.285583828929082f, 0.283230817180850f, + 0.280876099271292f, 0.278519689385053f, 0.276161601716971f, 0.273801850471989f, + 0.271440449865074f, 0.269077414121127f, 0.266712757474898f, 0.264346494170904f, + 0.261978638463337f, 0.259609204615985f, 0.257238206902140f, 0.254865659604515f, + 0.252491577015158f, 0.250115973435366f, 0.247738863175599f, 0.245360260555389f, + 0.242980179903264f, 0.240598635556650f, 0.238215641861795f, 0.235831213173673f, + 0.233445363855905f, 0.231058108280671f, 0.228669460828619f, 0.226279435888785f, + 0.223888047858498f, 0.221495311143304f, 0.219101240156870f, 0.216705849320900f, + 0.214309153065051f, 0.211911165826842f, 0.209511902051569f, 0.207111376192219f, + 0.204709602709380f, 0.202306596071156f, 0.199902370753082f, 0.197496941238030f, + 0.195090322016128f, 0.192682527584672f, 0.190273572448036f, 0.187863471117585f, + 0.185452238111591f, 0.183039887955141f, 0.180626435180053f, 0.178211894324786f, + 0.175796279934354f, 0.173379606560240f, 0.170961888760301f, 0.168543141098691f, + 0.166123378145766f, 0.163702614477995f, 0.161280864677881f, 0.158858143333862f, + 0.156434465040231f, 0.154009844397046f, 0.151584296010041f, 0.149157834490539f, + 0.146730474455362f, 0.144302230526747f, 0.141873117332253f, 0.139443149504679f, + 0.137012341681968f, 0.134580708507126f, 0.132148264628130f, 0.129715024697841f, + 0.127281003373913f, 0.124846215318711f, 0.122410675199216f, 0.119974397686941f, + 0.117537397457838f, 0.115099689192216f, 0.112661287574648f, 0.110222207293883f, + 0.107782463042759f, 0.105342069518114f, 0.102901041420696f, 0.100459393455077f, + 0.0980171403295608f, 0.0955742967560992f, 0.0931308774501999f, 0.0906868971308382f, + 0.0882423705203696f, 0.0857973123444399f, 0.0833517373318975f, 0.0809056602147037f, + 0.0784590957278450f, 0.0760120586092433f, 0.0735645635996675f, 0.0711166254426455f, + 0.0686682588843738f, 0.0662194786736304f, 0.0637702995616845f, 0.0613207363022087f, + 0.0588708036511890f, 0.0564205163668375f, 0.0539698892095020f, 0.0515189369415775f, + 0.0490676743274181f, 0.0466161161332467f, 0.0441642771270675f, 0.0417121720785753f, + 0.0392598157590687f, 0.0368072229413588f, 0.0343544083996823f, 0.0319013869096110f, + 0.0294481732479634f, 0.0269947821927155f, 0.0245412285229123f, 0.0220875270185784f, + 0.0196336924606283f, 0.0171797396307788f, 0.0147256833114584f, 0.0122715382857199f, + 0.00981731933714973f, 0.00736304124977978f, 0.00490871880799808f, 0.00245436679646048f, + 0.00000000000000000f +}; + +const float ivas_mdft_coeff_cos_twid_320[IVAS_320_PT_LEN + 1] = +{ + 1.00000000000000f, 0.999987952167257f, 0.999951808959328f, 0.999891571247108f, + 0.999807240482065f, 0.999698818696204f, 0.999566308502021f, 0.999409713092437f, + 0.999229036240723f, 0.999024282300407f, 0.998795456205172f, 0.998542563468736f, + 0.998265610184716f, 0.997964603026487f, 0.997639549247016f, 0.997290456678690f, + 0.996917333733128f, 0.996520189400975f, 0.996099033251687f, 0.995653875433303f, + 0.995184726672197f, 0.994691598272820f, 0.994174502117428f, 0.993633450665799f, + 0.993068456954926f, 0.992479534598710f, 0.991866697787626f, 0.991229961288385f, + 0.990569340443577f, 0.989884851171301f, 0.989176509964781f, 0.988444333891970f, + 0.987688340595138f, 0.986908548290446f, 0.986104975767509f, 0.985277642388941f, + 0.984426568089892f, 0.983551773377562f, 0.982653279330712f, 0.981731107599154f, + 0.980785280403230f, 0.979815820533276f, 0.978822751349072f, 0.977806096779282f, + 0.976765881320872f, 0.975702130038529f, 0.974614868564045f, 0.973504123095711f, + 0.972369920397677f, 0.971212287799312f, 0.970031253194544f, 0.968826845041188f, + 0.967599092360260f, 0.966348024735277f, 0.965073672311547f, 0.963776065795440f, + 0.962455236453647f, 0.961111216112432f, 0.959744037156857f, 0.958353732530011f, + 0.956940335732209f, 0.955503880820186f, 0.954044402406280f, 0.952561935657595f, + 0.951056516295154f, 0.949528180593037f, 0.947976965377510f, 0.946402908026138f, + 0.944806046466878f, 0.943186419177173f, 0.941544065183021f, 0.939879024058033f, + 0.938191335922484f, 0.936481041442343f, 0.934748181828292f, 0.932992798834739f, + 0.931214934758804f, 0.929414632439304f, 0.927591935255724f, 0.925746887127164f, + 0.923879532511287f, 0.921989916403245f, 0.920078084334595f, 0.918144082372204f, + 0.916187957117136f, 0.914209755703531f, 0.912209525797468f, 0.910187315595818f, + 0.908143173825081f, 0.906077149740215f, 0.903989293123443f, 0.901879654283062f, + 0.899748284052222f, 0.897595233787707f, 0.895420555368697f, 0.893224301195515f, + 0.891006524188368f, 0.888767277786068f, 0.886506615944746f, 0.884224593136556f, + 0.881921264348355f, 0.879596685080383f, 0.877250911344924f, 0.874883999664958f, + 0.872496007072797f, 0.870086991108712f, 0.867657009819544f, 0.865206121757311f, + 0.862734385977792f, 0.860241862039105f, 0.857728610000272f, 0.855194690419775f, + 0.852640164354092f, 0.850065093356229f, 0.847469539474235f, 0.844853565249707f, + 0.842217233716287f, 0.839560608398136f, 0.836883753308409f, 0.834186732947712f, + 0.831469612302545f, 0.828732456843738f, 0.825975332524873f, 0.823198305780696f, + 0.820401443525514f, 0.817584813151584f, 0.814748482527489f, 0.811892519996505f, + 0.809016994374948f, 0.806121974950521f, 0.803207531480645f, 0.800273734190774f, + 0.797320653772707f, 0.794348361382882f, 0.791356928640660f, 0.788346427626606f, + 0.785316930880745f, 0.782268511400816f, 0.779201242640517f, 0.776115198507728f, + 0.773010453362737f, 0.769887082016445f, 0.766745159728562f, 0.763584762205797f, + 0.760405965600031f, 0.757208846506485f, 0.753993481961870f, 0.750759949442534f, + 0.747508326862597f, 0.744238692572067f, 0.740951125354959f, 0.737645704427393f, + 0.734322509435686f, 0.730981620454432f, 0.727623117984575f, 0.724247082951467f, + 0.720853596702919f, 0.717442741007240f, 0.714014598051268f, 0.710569250438390f, + 0.707106781186548f, 0.703627273726243f, 0.700130811898524f, 0.696617479952964f, + 0.693087362545636f, 0.689540544737067f, 0.685977111990193f, 0.682397150168297f, + 0.678800745532942f, 0.675187984741891f, 0.671558954847018f, 0.667913743292216f, + 0.664252437911282f, 0.660575126925805f, 0.656881898943041f, 0.653172842953777f, + 0.649448048330184f, 0.645707604823667f, 0.641951602562703f, 0.638180132050665f, + 0.634393284163646f, 0.630591150148264f, 0.626773821619470f, 0.622941390558334f, + 0.619093949309834f, 0.615231590580627f, 0.611354407436817f, 0.607462493301711f, + 0.603555941953571f, 0.599634847523352f, 0.595699304492433f, 0.591749407690343f, + 0.587785252292473f, 0.583806933817786f, 0.579814548126514f, 0.575808191417845f, + 0.571787960227612f, 0.567753951425961f, 0.563706262215017f, 0.559644990126546f, + 0.555570233019602f, 0.551482089078169f, 0.547380656808797f, 0.543266035038224f, + 0.539138322911000f, 0.534997619887097f, 0.530844025739510f, 0.526677640551852f, + 0.522498564715949f, 0.518306898929413f, 0.514102744193222f, 0.509886201809281f, + 0.505657373377985f, 0.501416360795769f, 0.497163266252654f, 0.492898192229784f, + 0.488621241496955f, 0.484332517110141f, 0.480032122409011f, 0.475720161014437f, + 0.471396736825998f, 0.467061954019477f, 0.462715917044350f, 0.458358730621271f, + 0.453990499739547f, 0.449611329654607f, 0.445221325885468f, 0.440820594212194f, + 0.436409240673342f, 0.431987371563412f, 0.427555093430282f, 0.423112513072644f, + 0.418659737537428f, 0.414196874117224f, 0.409724030347695f, 0.405241314004990f, + 0.400748833103141f, 0.396246695891466f, 0.391735010851956f, 0.387213886696666f, + 0.382683432365090f, 0.378143757021541f, 0.373594970052516f, 0.369037181064066f, + 0.364470499879150f, 0.359895036534988f, 0.355310901280416f, 0.350718204573223f, + 0.346117057077493f, 0.341507569660936f, 0.336889853392220f, 0.332264019538291f, + 0.327630179561693f, 0.322988445117886f, 0.318338928052550f, 0.313681740398892f, + 0.309016994374947f, 0.304344802380877f, 0.299665276996257f, 0.294978530977364f, + 0.290284677254463f, 0.285583828929082f, 0.280876099271292f, 0.276161601716971f, + 0.271440449865074f, 0.266712757474898f, 0.261978638463337f, 0.257238206902140f, + 0.252491577015158f, 0.247738863175599f, 0.242980179903264f, 0.238215641861795f, + 0.233445363855905f, 0.228669460828619f, 0.223888047858498f, 0.219101240156870f, + 0.214309153065051f, 0.209511902051569f, 0.204709602709380f, 0.199902370753082f, + 0.195090322016128f, 0.190273572448036f, 0.185452238111591f, 0.180626435180053f, + 0.175796279934354f, 0.170961888760301f, 0.166123378145766f, 0.161280864677881f, + 0.156434465040231f, 0.151584296010041f, 0.146730474455362f, 0.141873117332253f, + 0.137012341681968f, 0.132148264628130f, 0.127281003373913f, 0.122410675199216f, + 0.117537397457838f, 0.112661287574648f, 0.107782463042759f, 0.102901041420696f, + 0.0980171403295608f, 0.0931308774501999f, 0.0882423705203696f, 0.0833517373318975f, + 0.0784590957278450f, 0.0735645635996675f, 0.0686682588843738f, 0.0637702995616845f, + 0.0588708036511890f, 0.0539698892095020f, 0.0490676743274181f, 0.0441642771270675f, + 0.0392598157590687f, 0.0343544083996823f, 0.0294481732479634f, 0.0245412285229123f, + 0.0196336924606283f, 0.0147256833114584f, 0.00981731933714973f, 0.00490871880799808f, + 0.0000000000000000f +}; + +const float ivas_mdft_coeff_cos_twid_240[IVAS_240_PT_LEN + 1] = +{ + 1.0000000000f, 0.9999785817f, 0.9999143276f, 0.9998072405f, 0.9996573250f, 0.9994645875f, + 0.9992290362f, 0.9989506814f, 0.9986295348f, 0.9982656102f, 0.9978589232f, 0.9974094913f, + 0.9969173337f, 0.9963824715f, 0.9958049276f, 0.9951847267f, 0.9945218954f, 0.9938164621f, + 0.9930684570f, 0.9922779121f, 0.9914448614f, 0.9905693404f, 0.9896513868f, 0.9886910398f, + 0.9876883406f, 0.9866433321f, 0.9855560591f, 0.9844265681f, 0.9832549076f, 0.9820411277f, + 0.9807852804f, 0.9794874196f, 0.9781476007f, 0.9767658813f, 0.9753423205f, 0.9738769793f, + 0.9723699204f, 0.9708212084f, 0.9692309097f, 0.9675990924f, 0.9659258263f, 0.9642111832f, + 0.9624552365f, 0.9606580614f, 0.9588197349f, 0.9569403357f, 0.9550199445f, 0.9530586433f, + 0.9510565163f, 0.9490136492f, 0.9469301295f, 0.9448060465f, 0.9426414911f, 0.9404365561f, + 0.9381913359f, 0.9359059268f, 0.9335804265f, 0.9312149348f, 0.9288095529f, 0.9263643839f, + 0.9238795325f, 0.9213551052f, 0.9187912101f, 0.9161879571f, 0.9135454576f, 0.9108638249f, + 0.9081431738f, 0.9053836209f, 0.9025852843f, 0.8997482841f, 0.8968727415f, 0.8939587800f, + 0.8910065242f, 0.8880161007f, 0.8849876375f, 0.8819212643f, 0.8788171127f, 0.8756753154f, + 0.8724960071f, 0.8692793239f, 0.8660254038f, 0.8627343860f, 0.8594064115f, 0.8560416229f, + 0.8526401644f, 0.8492021815f, 0.8457278217f, 0.8422172337f, 0.8386705679f, 0.8350879763f, + 0.8314696123f, 0.8278156309f, 0.8241261886f, 0.8204014435f, 0.8166415552f, 0.8128466846f, + 0.8090169944f, 0.8051526486f, 0.8012538127f, 0.7973206538f, 0.7933533403f, 0.7893520422f, + 0.7853169309f, 0.7812481792f, 0.7771459615f, 0.7730104534f, 0.7688418321f, 0.7646402762f, + 0.7604059656f, 0.7561390818f, 0.7518398075f, 0.7475083269f, 0.7431448255f, 0.7387494902f, + 0.7343225094f, 0.7298640727f, 0.7253743710f, 0.7208535967f, 0.7163019434f, 0.7117196062f, + 0.7071067812f, 0.7024636661f, 0.6977904598f, 0.6930873625f, 0.6883545757f, 0.6835923020f, + 0.6788007455f, 0.6739801115f, 0.6691306064f, 0.6642524379f, 0.6593458151f, 0.6544109481f, + 0.6494480483f, 0.6444573284f, 0.6394390020f, 0.6343932842f, 0.6293203910f, 0.6242205399f, + 0.6190939493f, 0.6139408388f, 0.6087614290f, 0.6035559420f, 0.5983246006f, 0.5930676290f, + 0.5877852523f, 0.5824776969f, 0.5771451900f, 0.5717879602f, 0.5664062369f, 0.5610002507f, + 0.5555702330f, 0.5501164166f, 0.5446390350f, 0.5391383229f, 0.5336145159f, 0.5280678507f, + 0.5224985647f, 0.5169068967f, 0.5112930861f, 0.5056573734f, 0.5000000000f, 0.4943212083f, + 0.4886212415f, 0.4829003438f, 0.4771587603f, 0.4713967368f, 0.4656145203f, 0.4598123584f, + 0.4539904997f, 0.4481491936f, 0.4422886902f, 0.4364092407f, 0.4305110968f, 0.4245945113f, + 0.4186597375f, 0.4127070298f, 0.4067366431f, 0.4007488331f, 0.3947438564f, 0.3887219702f, + 0.3826834324f, 0.3766285017f, 0.3705574375f, 0.3644704999f, 0.3583679495f, 0.3522500479f, + 0.3461170571f, 0.3399692397f, 0.3338068592f, 0.3276301796f, 0.3214394653f, 0.3152349816f, + 0.3090169944f, 0.3027857698f, 0.2965415750f, 0.2902846773f, 0.2840153447f, 0.2777338459f, + 0.2714404499f, 0.2651354262f, 0.2588190451f, 0.2524915770f, 0.2461532930f, 0.2398044647f, + 0.2334453639f, 0.2270762630f, 0.2206974350f, 0.2143091531f, 0.2079116908f, 0.2015053223f, + 0.1950903220f, 0.1886669647f, 0.1822355255f, 0.1757962799f, 0.1693495038f, 0.1628954734f, + 0.1564344650f, 0.1499667556f, 0.1434926220f, 0.1370123417f, 0.1305261922f, 0.1240344515f, + 0.1175373975f, 0.1110353086f, 0.1045284633f, 0.0980171403f, 0.0915016187f, 0.0849821774f, + 0.0784590957f, 0.0719326532f, 0.0654031292f, 0.0588708037f, 0.0523359562f, 0.0457988669f, + 0.0392598158f, 0.0327190828f, 0.0261769483f, 0.0196336925f, 0.0130895956f, 0.0065449380f, + 0.000000000f +}; +const float ivas_mdft_coeff_cos_twid_160[IVAS_160_PT_LEN + 1] = +{ + 1.0000000000f, 0.9999518090f, 0.9998072405f, 0.9995663085f, 0.9992290362f, 0.9987954562f, + 0.9982656102f, 0.9976395492f, 0.9969173337f, 0.9960990333f, 0.9951847267f, 0.9941745021f, + 0.9930684570f, 0.9918666978f, 0.9905693404f, 0.9891765100f, 0.9876883406f, 0.9861049758f, + 0.9844265681f, 0.9826532793f, 0.9807852804f, 0.9788227513f, 0.9767658813f, 0.9746148686f, + 0.9723699204f, 0.9700312532f, 0.9675990924f, 0.9650736723f, 0.9624552365f, 0.9597440372f, + 0.9569403357f, 0.9540444024f, 0.9510565163f, 0.9479769654f, 0.9448060465f, 0.9415440652f, + 0.9381913359f, 0.9347481818f, 0.9312149348f, 0.9275919353f, 0.9238795325f, 0.9200780843f, + 0.9161879571f, 0.9122095258f, 0.9081431738f, 0.9039892931f, 0.8997482841f, 0.8954205554f, + 0.8910065242f, 0.8865066159f, 0.8819212643f, 0.8772509113f, 0.8724960071f, 0.8676570098f, + 0.8627343860f, 0.8577286100f, 0.8526401644f, 0.8474695395f, 0.8422172337f, 0.8368837533f, + 0.8314696123f, 0.8259753325f, 0.8204014435f, 0.8147484825f, 0.8090169944f, 0.8032075315f, + 0.7973206538f, 0.7913569286f, 0.7853169309f, 0.7792012426f, 0.7730104534f, 0.7667451597f, + 0.7604059656f, 0.7539934820f, 0.7475083269f, 0.7409511254f, 0.7343225094f, 0.7276231180f, + 0.7208535967f, 0.7140145981f, 0.7071067812f, 0.7001308119f, 0.6930873625f, 0.6859771120f, + 0.6788007455f, 0.6715589548f, 0.6642524379f, 0.6568818989f, 0.6494480483f, 0.6419516026f, + 0.6343932842f, 0.6267738216f, 0.6190939493f, 0.6113544074f, 0.6035559420f, 0.5956993045f, + 0.5877852523f, 0.5798145481f, 0.5717879602f, 0.5637062622f, 0.5555702330f, 0.5473806568f, + 0.5391383229f, 0.5308440257f, 0.5224985647f, 0.5141027442f, 0.5056573734f, 0.4971632663f, + 0.4886212415f, 0.4800321224f, 0.4713967368f, 0.4627159170f, 0.4539904997f, 0.4452213259f, + 0.4364092407f, 0.4275550934f, 0.4186597375f, 0.4097240303f, 0.4007488331f, 0.3917350109f, + 0.3826834324f, 0.3735949701f, 0.3644704999f, 0.3553109013f, 0.3461170571f, 0.3368898534f, + 0.3276301796f, 0.3183389281f, 0.3090169944f, 0.2996652770f, 0.2902846773f, 0.2808760993f, + 0.2714404499f, 0.2619786385f, 0.2524915770f, 0.2429801799f, 0.2334453639f, 0.2238880479f, + 0.2143091531f, 0.2047096027f, 0.1950903220f, 0.1854522381f, 0.1757962799f, 0.1661233781f, + 0.1564344650f, 0.1467304745f, 0.1370123417f, 0.1272810034f, 0.1175373975f, 0.1077824630f, + 0.0980171403f, 0.0882423705f, 0.0784590957f, 0.0686682589f, 0.0588708037f, 0.0490676743f, + 0.0392598158f, 0.0294481732f, 0.0196336925f, 0.0098173193f, 0.000000000f +}; + +const float ivas_mdft_coeff_cos_twid_80[IVAS_80_PT_LEN + 1] = +{ + 1.0000000000f, 0.9998072405f, 0.9992290362f, 0.9982656102f, 0.9969173337f, 0.9951847267f, + 0.9930684570f, 0.9905693404f, 0.9876883406f, 0.9844265681f, 0.9807852804f, 0.9767658813f, + 0.9723699204f, 0.9675990924f, 0.9624552365f, 0.9569403357f, 0.9510565163f, 0.9448060465f, + 0.9381913359f, 0.9312149348f, 0.9238795325f, 0.9161879571f, 0.9081431738f, 0.8997482841f, + 0.8910065242f, 0.8819212643f, 0.8724960071f, 0.8627343860f, 0.8526401644f, 0.8422172337f, + 0.8314696123f, 0.8204014435f, 0.8090169944f, 0.7973206538f, 0.7853169309f, 0.7730104534f, + 0.7604059656f, 0.7475083269f, 0.7343225094f, 0.7208535967f, 0.7071067812f, 0.6930873625f, + 0.6788007455f, 0.6642524379f, 0.6494480483f, 0.6343932842f, 0.6190939493f, 0.6035559420f, + 0.5877852523f, 0.5717879602f, 0.5555702330f, 0.5391383229f, 0.5224985647f, 0.5056573734f, + 0.4886212415f, 0.4713967368f, 0.4539904997f, 0.4364092407f, 0.4186597375f, 0.4007488331f, + 0.3826834324f, 0.3644704999f, 0.3461170571f, 0.3276301796f, 0.3090169944f, 0.2902846773f, + 0.2714404499f, 0.2524915770f, 0.2334453639f, 0.2143091531f, 0.1950903220f, 0.1757962799f, + 0.1564344650f, 0.1370123417f, 0.1175373975f, 0.0980171403f, 0.0784590957f, 0.0588708037f, + 0.0392598158f, 0.0196336925f, 0.000000000f +}; + +const float ivas_mdft_coeff_cos_twid_40[IVAS_40_PT_LEN + 1] = +{ + 1.0000000000f, 0.9992290362f, 0.9969173337f, 0.9930684570f, 0.9876883406f, 0.9807852804f, + 0.9723699204f, 0.9624552365f, 0.9510565163f, 0.9381913359f, 0.9238795325f, 0.9081431738f, + 0.8910065242f, 0.8724960071f, 0.8526401644f, 0.8314696123f, 0.8090169944f, 0.7853169309f, + 0.7604059656f, 0.7343225094f, 0.7071067812f, 0.6788007455f, 0.6494480483f, 0.6190939493f, + 0.5877852523f, 0.5555702330f, 0.5224985647f, 0.4886212415f, 0.4539904997f, 0.4186597375f, + 0.3826834324f, 0.3461170571f, 0.3090169944f, 0.2714404499f, 0.2334453639f, 0.1950903220f, + 0.1564344650f, 0.1175373975f, 0.0784590957f, 0.0392598158f, 0.000000000f +}; + +const float ivas_sin_twiddle_480[IVAS_480_PT_LEN >> 1] = +{ + -0.000818122995607253f, -0.00736304124977957f, -0.0139076440957708f, -0.0204516511845773f, + -0.0269947821927154f, -0.0335367568342299f, -0.0400772948727007f, -0.0466161161332467f, + -0.0531529405145281f, -0.0596874880007445f, -0.0662194786736303f, -0.0727486327244454f, + -0.0792746704659607f, -0.0857973123444399f, -0.0923162789516138f, -0.0988312910366500f, + -0.105342069518114f, -0.111848335495926f, -0.118349810263305f, -0.124846215318711f, + -0.131337272377774f, -0.137822703385212f, -0.144302230526747f, -0.150775576241001f, + -0.157242463231389f, -0.163702614477995f, -0.170155753249442f, -0.176601603114742f, + -0.183039887955141f, -0.189470331975943f, -0.195892659718330f, -0.202306596071156f, + -0.208711866282735f, -0.215108195972610f, -0.221495311143304f, -0.227872938192063f, + -0.234240803922570f, -0.240598635556650f, -0.246946160745958f, -0.253283107583640f, + -0.259609204615985f, -0.265924180854051f, -0.272227765785273f, -0.278519689385053f, + -0.284799682128326f, -0.291067475001103f, -0.297322799511998f, -0.303565387703730f, + -0.309794972164597f, -0.316011286039934f, -0.322214063043544f, -0.328403037469105f, + -0.334577944201551f, -0.340738518728429f, -0.346884497151231f, -0.353015616196696f, + -0.359131613228090f, -0.365232226256457f, -0.371317193951838f, -0.377386255654469f, + -0.383439151385947f, -0.389475621860365f, -0.395495408495417f, -0.401498253423481f, + -0.407483899502658f, -0.413452090327791f, -0.419402570241451f, -0.425335084344881f, + -0.431249378508924f, -0.437145199384900f, -0.443022294415467f, -0.448880411845434f, + -0.454719300732547f, -0.460538710958240f, -0.466338393238348f, -0.472118099133784f, + -0.477877581061184f, -0.483616592303511f, -0.489334887020625f, -0.495032220259813f, + -0.500708347966279f, -0.506363026993606f, -0.511996015114162f, -0.517607071029487f, + -0.523195954380619f, -0.528762425758396f, -0.534306246713712f, -0.539827179767727f, + -0.545324988422047f, -0.550799437168844f, -0.556250291500956f, -0.561677317921925f, + -0.567080283956001f, -0.572458958158102f, -0.577813110123727f, -0.583142510498826f, + -0.588446930989624f, -0.593726144372402f, -0.598979924503229f, -0.604208046327650f, + -0.609410285890327f, -0.614586420344631f, -0.619736227962191f, -0.624859488142386f, + -0.629955981421804f, -0.635025489483634f, -0.640067795167023f, -0.645082682476378f, + -0.650069936590618f, -0.655029343872374f, -0.659960691877147f, -0.664863769362399f, + -0.669738366296610f, -0.674584273868271f, -0.679401284494831f, -0.684189191831585f, + -0.688947790780520f, -0.693676877499095f, -0.698376249408973f, -0.703045705204703f, + -0.707685044862340f, -0.712294069648014f, -0.716872582126442f, -0.721420386169390f, + -0.725937286964068f, -0.730423091021479f, -0.734877606184707f, -0.739300641637149f, + -0.743692007910687f, -0.748051516893805f, -0.752378981839648f, -0.756674217374021f, + -0.760937039503328f, -0.765167265622459f, -0.769364714522605f, -0.773529206399025f, + -0.777660562858748f, -0.781758606928213f, -0.785823163060853f, -0.789854057144609f, + -0.793851116509396f, -0.797814169934493f, -0.801743047655882f, -0.805637581373517f, + -0.809497604258536f, -0.813322950960406f, -0.817113457614006f, -0.820868961846646f, + -0.824589302785025f, -0.828274321062119f, -0.831923858824010f, -0.835537759736646f, + -0.839115868992540f, -0.842658033317402f, -0.846164100976699f, -0.849633921782164f, + -0.853067347098221f, -0.856464229848356f, -0.859824424521420f, -0.863147787177854f, + -0.866434175455865f, -0.869683448577516f, -0.872895467354761f, -0.876070094195407f, + -0.879207193109004f, -0.882306629712678f, -0.885368271236879f, -0.888391986531075f, + -0.891377646069366f, -0.894325121956035f, -0.897234287931024f, -0.900105019375345f, + -0.902937193316419f, -0.905730688433339f, -0.908485385062073f, -0.911201165200584f, + -0.913877912513892f, -0.916515512339049f, -0.919113851690058f, -0.921672819262709f, + -0.924192305439348f, -0.926672202293573f, -0.929112403594856f, -0.931512804813095f, + -0.933873303123092f, -0.936193797408954f, -0.938474188268430f, -0.940714378017165f, + -0.942914270692887f, -0.945073772059515f, -0.947192789611197f, -0.949271232576274f, + -0.951309011921168f, -0.953306040354194f, -0.955262232329299f, -0.957177504049732f, + -0.959051773471624f, -0.960884960307514f, -0.962676986029777f, -0.964427773873996f, + -0.966137248842248f, -0.967805337706313f, -0.969431969010818f, -0.971017073076290f, + -0.972560582002147f, -0.974062429669605f, -0.975522551744506f, -0.976940885680082f, + -0.978317370719628f, -0.979651947899104f, -0.980944560049668f, -0.982195151800116f, + -0.983403669579260f, -0.984570061618221f, -0.985694277952645f, -0.986776270424848f, + -0.987815992685872f, -0.988813400197476f, -0.989768450234042f, -0.990681101884405f, + -0.991551316053606f, -0.992379055464567f, -0.993164284659685f, -0.993906970002356f, + -0.994607079678411f, -0.995264583697482f, -0.995879453894286f, -0.996451663929828f, + -0.996981189292537f, -0.997468007299307f, -0.997912097096476f, -0.998313439660714f, + -0.998672017799843f, -0.998987816153568f, -0.999260821194138f, -0.999491021226926f, + -0.999678406390929f, -0.999822968659191f, -0.999924701839145f, -0.999983601572879f +}; + +const float ivas_cos_twiddle_480[IVAS_480_PT_LEN >> 1] = +{ + 0.999999665337326f, 0.999972892444367f, 0.999903284040864f, 0.999790843108610f, + 0.999635574464198f, 0.999437484758823f, 0.999196582477986f, 0.998912877941140f, + 0.998586383301244f, 0.998217112544241f, 0.997805081488460f, 0.997350307783942f, + 0.996852810911678f, 0.996312612182778f, 0.995729734737558f, 0.995104203544548f, + 0.994436045399422f, 0.993725288923851f, 0.992971964564277f, 0.992176104590609f, + 0.991337743094838f, 0.990456915989581f, 0.989533661006540f, 0.988568017694885f, + 0.987560027419562f, 0.986509733359519f, 0.985417180505858f, 0.984282415659908f, + 0.983105487431216f, 0.981886446235473f, 0.980625344292344f, 0.979322235623241f, + 0.977977176049001f, 0.976590223187499f, 0.975161436451181f, 0.973690877044515f, + 0.972178607961371f, 0.970624693982323f, 0.969029201671875f, 0.967392199375607f, + 0.965713757217249f, 0.963993947095677f, 0.962232842681832f, 0.960430519415566f, + 0.958587054502409f, 0.956702526910263f, 0.954777017366017f, 0.952810608352092f, + 0.950803384102905f, 0.948755430601263f, 0.946666835574676f, 0.944537688491606f, + 0.942368080557626f, 0.940158104711519f, 0.937907855621296f, 0.935617429680138f, + 0.933286925002268f, 0.930916441418752f, 0.928506080473216f, 0.926055945417500f, + 0.923566141207236f, 0.921036774497350f, 0.918467953637493f, 0.915859788667400f, + 0.913212391312179f, 0.910525874977521f, 0.907800354744844f, 0.905035947366364f, + 0.902232771260093f, 0.899390946504765f, 0.896510594834693f, 0.893591839634558f, + 0.890634805934118f, 0.887639620402854f, 0.884606411344546f, 0.881535308691775f, + 0.878426444000357f, 0.875279950443708f, 0.872095962807140f, 0.868874617482085f, + 0.865616052460258f, 0.862320407327736f, 0.858987823258990f, 0.855618443010829f, + 0.852212410916289f, 0.848769872878448f, 0.845290976364179f, 0.841775870397828f, + 0.838224705554838f, 0.834637633955290f, 0.831014809257393f, 0.827356386650900f, + 0.823662522850458f, 0.819933376088899f, 0.816169106110459f, 0.812369874163934f, + 0.808535842995778f, 0.804667176843123f, 0.800764041426753f, 0.796826603943998f, + 0.792855033061574f, 0.788849498908361f, 0.784810173068109f, 0.780737228572095f, + 0.776630839891703f, 0.772491182930959f, 0.768318435018988f, 0.764112774902423f, + 0.759874382737746f, 0.755603440083571f, 0.751300129892866f, 0.746964636505118f, + 0.742597145638433f, 0.738197844381584f, 0.733766921185995f, 0.729304565857669f, + 0.724810969549055f, 0.720286324750863f, 0.715730825283819f, 0.711144666290356f, + 0.706528044226263f, 0.701881156852263f, 0.697204203225545f, 0.692497383691237f, + 0.687760899873822f, 0.682994954668502f, 0.678199752232508f, 0.673375497976352f, + 0.668522398555031f, 0.663640661859171f, 0.658730497006124f, 0.653792114331011f, + 0.648825725377709f, 0.643831542889792f, 0.638809780801415f, 0.633760654228152f, + 0.628684379457781f, 0.623581173941019f, 0.618451256282204f, 0.613294846229936f, + 0.608112164667659f, 0.602903433604202f, 0.597668876164268f, 0.592408716578875f, + 0.587123180175754f, 0.581812493369691f, 0.576476883652835f, 0.571116579584947f, + 0.565731810783613f, 0.560322807914407f, 0.554889802681009f, 0.549433027815281f, + 0.543952717067296f, 0.538449105195327f, 0.532922427955790f, 0.527372922093143f, + 0.521800825329746f, 0.516206376355680f, 0.510589814818519f, 0.504951381313066f, + 0.499291317371047f, 0.493609865450762f, 0.487907268926702f, 0.482183772079123f, + 0.476439620083580f, 0.470675059000427f, 0.464890335764274f, 0.459085698173413f, + 0.453261394879198f, 0.447417675375397f, 0.441554789987504f, 0.435672989862017f, + 0.429772526955677f, 0.423853654024676f, 0.417916624613831f, 0.411961693045722f, + 0.405989114409798f, 0.399999144551449f, 0.393992040061048f, 0.387968058262959f, + 0.381927457204511f, 0.375870495644949f, 0.369797433044349f, 0.363708529552499f, + 0.357604045997758f, 0.351484243875885f, 0.345349385338836f, 0.339199733183530f, + 0.333035550840599f, 0.326857102363098f, 0.320664652415198f, 0.314458466260842f, + 0.308238809752391f, 0.302005949319228f, 0.295760151956351f, 0.289501685212929f, + 0.283230817180850f, 0.276947816483228f, 0.270652952262902f, 0.264346494170904f, + 0.258028712354909f, 0.251699877447663f, 0.245360260555389f, 0.239010133246176f, + 0.232649767538342f, 0.226279435888785f, 0.219899411181310f, 0.213509966714943f, + 0.207111376192219f, 0.200703913707458f, 0.194287853735029f, 0.187863471117585f, + 0.181431041054297f, 0.174990839089060f, 0.168543141098691f, 0.162088223281113f, + 0.155626362143520f, 0.149157834490539f, 0.142682917412363f, 0.136201888272891f, + 0.129715024697841f, 0.123222604562857f, 0.116724905981611f, 0.110222207293883f, + 0.103714787053643f, 0.0972029240171147f, 0.0906868971308382f, 0.0841669855197180f, + 0.0776434684750678f, 0.0711166254426455f, 0.0645867360106837f, 0.0580540798979125f, + 0.0515189369415777f, 0.0449815870854525f, 0.0384423103678466f, 0.0319013869096108f, + 0.0253590969021360f, 0.0188157205953513f, 0.0122715382857199f, 0.00572683030423125f +}; + +const float ivas_sin_twiddle_320[IVAS_320_PT_LEN >> 1] = +{ + -0.00122718432228885f, -0.0110444371277961f, -0.0208606254474658f, -0.0306748031766366f, + -0.0404860244044325f, -0.0502933435049309f, -0.0600958152283046f, -0.0698924947919266f, + -0.0796824379714301f, -0.0894647011917154f, -0.0992383416178931f, -0.109002417246156f, + -0.118755986994574f, -0.128498110793793f, -0.138227849677645f, -0.147944265873646f, + -0.157646422893378f, -0.167333385622756f, -0.177004220412149f, -0.186657995166372f, + -0.196293779434521f, -0.205910644499654f, -0.215507663468299f, -0.225083911359793f, + -0.234638465195433f, -0.244170404087435f, -0.253678809327687f, -0.263162764476304f, + -0.272621355449949f, -0.282053670609936f, -0.291458800850100f, -0.300835839684411f, + -0.310183883334351f, -0.319502030816016f, -0.328789384026957f, -0.338045047832741f, + -0.347268130153228f, -0.356457742048546f, -0.365612997804774f, -0.374733015019307f, + -0.383816914685905f, -0.392863821279410f, -0.401872862840135f, -0.410843171057904f, + -0.419773881355741f, -0.428664132973198f, -0.437513069049322f, -0.446319836705237f, + -0.455083587126344f, -0.463803475644138f, -0.472478661817616f, -0.481108309514277f, + -0.489691586990715f, -0.498227666972782f, -0.506715726735323f, -0.515154948181472f, + -0.523544517921500f, -0.531883627351215f, -0.540171472729893f, -0.548407255257747f, + -0.556590181152914f, -0.564719461727967f, -0.572794313465923f, -0.580813958095765f, + -0.588777622667452f, -0.596684539626417f, -0.604533946887548f, -0.612325087908634f, + -0.620057211763289f, -0.627729573213322f, -0.635341432780567f, -0.642892056818157f, + -0.650380717581231f, -0.657806693297079f, -0.665169268234704f, -0.672467732773812f, + -0.679701383473197f, -0.686869523138552f, -0.693971460889654f, -0.701006512226963f, + -0.707973999097587f, -0.714873249960641f, -0.721703599851967f, -0.728464390448225f, + -0.735154970130347f, -0.741774694046338f, -0.748322924173428f, -0.754799029379569f, + -0.761202385484262f, -0.767532375318718f, -0.773788388785342f, -0.779969822916534f, + -0.786076081932809f, -0.792106577300212f, -0.798060727787049f, -0.803937959519903f, + -0.809737706038947f, -0.815459408352540f, -0.821102514991105f, -0.826666482060278f, + -0.832150773293332f, -0.837554860102865f, -0.842878221631741f, -0.848120344803297f, + -0.853280724370791f, -0.858358862966099f, -0.863354271147654f, -0.868266467447619f, + -0.873094978418290f, -0.877839338677730f, -0.882499090954623f, -0.887073786132345f, + -0.891562983292255f, -0.895966249756185f, -0.900283161128150f, -0.904513301335247f, + -0.908656262667757f, -0.912711645818445f, -0.916679059921043f, -0.920558122587921f, + -0.924348459946945f, -0.928049706677513f, -0.931661506045761f, -0.935183509938948f, + -0.938615378899008f, -0.941956782155269f, -0.945207397656329f, -0.948366912101102f, + -0.951435020969008f, -0.954411428549330f, -0.957295847969710f, -0.960088001223801f, + -0.962787619198060f, -0.965394441697689f, -0.967908217471710f, -0.970328704237180f, + -0.972655668702548f, -0.974888886590136f, -0.977028142657754f, -0.979073230719452f, + -0.981023953665385f, -0.982880123480816f, -0.984641561264233f, -0.986308097244599f, + -0.987879570797705f, -0.989355830461661f, -0.990736733951487f, -0.992022148172831f, + -0.993211949234795f, -0.994306022461875f, -0.995304262405018f, -0.996206572851780f, + -0.997012866835602f, -0.997723066644192f, -0.998337103827013f, -0.998854919201885f, + -0.999276462860683f, -0.999601694174153f, -0.999830581795823f, -0.999963103665029f +}; + +const float ivas_cos_twiddle_320[IVAS_320_PT_LEN >> 1] = +{ + 0.999999247009036f, 0.999939008344274f, 0.999782393476671f, 0.999529417501093f, + 0.999180104799892f, 0.998734489040553f, 0.998192613172451f, 0.997554529422708f, + 0.996820299291166f, 0.995989993544452f, 0.995063692209162f, 0.994041484564148f, + 0.992923469131909f, 0.991709753669100f, 0.990400455156143f, 0.988995699785954f, + 0.987495622951779f, 0.985900369234146f, 0.984210092386929f, 0.982424955322528f, + 0.980545130096168f, 0.978570797889318f, 0.976502148992226f, 0.974339382785576f, + 0.972082707721278f, 0.969732341302371f, 0.967288510062064f, 0.964751449541896f, + 0.962121404269042f, 0.959398627732738f, 0.956583382359856f, 0.953675939489602f, + 0.950676579347373f, 0.947585591017741f, 0.944403272416596f, 0.941129930262426f, + 0.937765880046764f, 0.934311446003768f, 0.930766961078984f, 0.927132766897244f, + 0.923409213729749f, 0.919596660460302f, 0.915695474550723f, 0.911706032005430f, + 0.907628717335198f, 0.903463923520102f, 0.899212051971637f, 0.894873512494035f, + 0.890448723244758f, 0.885938110694205f, 0.881342109584601f, 0.876661162888100f, + 0.871895721764085f, 0.867046245515693f, 0.862113201545536f, 0.857097065310660f, + 0.851998320276715f, 0.846817457871361f, 0.841554977436898f, 0.836211386182145f, + 0.830787199133548f, 0.825282939085545f, 0.819699136550175f, 0.814036329705948f, + 0.808295064345975f, 0.802475893825360f, 0.796579379007870f, 0.790606088211875f, + 0.784556597155575f, 0.778431488901510f, 0.772231353800360f, 0.765956789434051f, + 0.759608400558158f, 0.753186799043613f, 0.746692603817734f, 0.740126440804576f, + 0.733488942864595f, 0.726780749733659f, 0.720002507961382f, 0.713154870848815f, + 0.706238498385475f, 0.699254057185735f, 0.692202220424575f, 0.685083667772700f, + 0.677899085331031f, 0.670649165564576f, 0.663334607235692f, 0.655956115336735f, + 0.648514401022112f, 0.641010181539737f, 0.633444180161903f, 0.625817126115569f, + 0.618129754512079f, 0.610382806276310f, 0.602577028075254f, 0.594713172246063f, + 0.586791996723527f, 0.578814264967032f, 0.570780745886967f, 0.562692213770623f, + 0.554549448207560f, 0.546353234014470f, 0.538104361159537f, 0.529803624686295f, + 0.521451824637002f, 0.513049765975530f, 0.504598258509780f, 0.496098116813633f, + 0.487550160148436f, 0.478955212384045f, 0.470314101919413f, 0.461627661602753f, + 0.452896728651262f, 0.444122144570429f, 0.435304755072932f, 0.426445409997122f, + 0.417544963225117f, 0.408604272600502f, 0.399624199845647f, 0.390605610478656f, + 0.381549373729942f, 0.372456362458452f, 0.363327453067539f, 0.354163525420491f, + 0.344965462755725f, 0.335734151601668f, 0.326470481691301f, 0.317175345876411f, + 0.307849640041535f, 0.298494263017610f, 0.289110116495347f, 0.279698104938318f, + 0.270259135495788f, 0.260794117915276f, 0.251303964454877f, 0.241789589795333f, + 0.232251910951879f, 0.222691847185850f, 0.213110319916091f, 0.203508252630144f, + 0.193886570795236f, 0.184246201769091f, 0.174588074710540f, 0.164913120489970f, + 0.155222271599607f, 0.145516462063635f, 0.135796627348180f, 0.126063704271142f, + 0.116318630911905f, 0.106562346520921f, 0.0967957914291864f, 0.0870199069576083f, + 0.0772356353262796f, 0.0674439195636641f, 0.0576457034157070f, 0.0478419312548745f, + 0.0380335479891316f, 0.0282214989708730f, 0.0184067299058048f, 0.00859018676179777f +}; + +const float ivas_sin_twiddle_160[IVAS_160_PT_LEN >> 1] = +{ + -0.00245436679646029f, -0.0220875270185783f, -0.0417121720785753f, -0.0613207363022086f, + -0.0809056602147038f, -0.100459393455076f, -0.119974397686940f, -0.139443149504679f, + -0.158858143333861f, -0.178211894324786f, -0.197496941238030f, -0.216705849320900f, + -0.235831213173673f, -0.254865659604515f, -0.273801850471989f, -0.292632485514050f, + -0.311350305162432f, -0.329948093341349f, -0.348418680249435f, -0.366754945123831f, + -0.384949818985382f, -0.402996287363860f, -0.420887393002174f, -0.438616238538528f, + -0.456175989165483f, -0.473559875264908f, -0.490761195017794f, -0.507773316987935f, + -0.524589682678469f, -0.541203809060310f, -0.557609291071472f, -0.573799804086349f, + -0.589769106353971f, -0.605511041404326f, -0.621019540421789f, -0.636288624584773f, + -0.651312407370671f, -0.666085096825230f, -0.680600997795453f, -0.694854514125194f, + -0.708840150812579f, -0.722552516128436f, -0.735986323694910f, -0.749136394523459f, + -0.761997659011457f, -0.774565158896617f, -0.786834049168500f, -0.798799599936358f, + -0.810457198252595f, -0.821802349891147f, -0.832830681080094f, -0.843537940187827f, + -0.853919999362139f, -0.863972856121587f, -0.873692634898524f, -0.883075588533209f, + -0.892118099718401f, -0.900816682393908f, -0.909167983090522f, -0.917168782222852f, + -0.924815995330528f, -0.932106674267327f, -0.939038008337734f, -0.945607325380521f, + -0.951812092798916f, -0.957649918536965f, -0.963118552001719f, -0.968215884930876f, + -0.972939952205560f, -0.977288932607910f, -0.981261149523195f, -0.984855071586178f, + -0.988069313271492f, -0.990902635427780f, -0.993353945755417f, -0.995422299227608f, + -0.997106898454717f, -0.998407093991674f, -0.999322384588350f, -0.999852417382795f +}; + +const float ivas_cos_twiddle_160[IVAS_160_PT_LEN >> 1] = +{ + 0.999996988037278f, 0.999756040817060f, 0.999129668611881f, 0.998118112900149f, + 0.996721763655847f, 0.994941159198190f, 0.992776985984091f, 0.990230078343521f, + 0.987301418157858f, 0.983992134481354f, 0.980303503105861f, 0.976236946068990f, + 0.971794031105889f, 0.966976471044852f, 0.961786123146989f, 0.956224988390216f, + 0.950295210697844f, 0.943999076112052f, 0.937339011912575f, 0.930317585680942f, + 0.922937504310623f, 0.915201612963474f, 0.907112893972869f, 0.898674465693954f, + 0.889889581301463f, 0.880761627535558f, 0.871294123396174f, 0.861490718786378f, + 0.851355193105265f, 0.840891453790923f, 0.830103534814044f, 0.818995595122750f, + 0.807571917039244f, 0.795836904608884f, 0.783795081902349f, 0.771451091271519f, + 0.758809691559762f, 0.745875756267305f, 0.732654271672413f, 0.719150334909079f, + 0.705369152001986f, 0.691316035859480f, 0.676996404225349f, 0.662415777590172f, + 0.647579777063073f, 0.632494122204673f, 0.617164628822086f, 0.601597206726822f, + 0.585797857456439f, 0.569772671960834f, 0.553527828254070f, 0.537069589032630f, + 0.520404299261031f, 0.503538383725718f, 0.486478344558187f, 0.469230758728290f, + 0.451802275508688f, 0.434199613911428f, 0.416429560097637f, 0.398498964761330f, + 0.380414740488332f, 0.362183859091351f, 0.343813348922205f, 0.325310292162263f, + 0.306681822092128f, 0.287935120341621f, 0.269077414121127f, 0.250115973435366f, + 0.231058108280671f, 0.211911165826842f, 0.192682527584672f, 0.173379606560240f, + 0.154009844397046f, 0.134580708507126f, 0.115099689192216f, 0.0955742967560992f, + 0.0760120586092433f, 0.0564205163668375f, 0.0368072229413588f, 0.0171797396307788f +}; + +const float ivas_mdft_coeff_cos_twid_120[IVAS_120_PT_LEN + 1] = +{ + 1.0000000000f, 0.9999143276f, 0.9996573250f, 0.9992290362f, 0.9986295348f, 0.9978589232f, 0.9969173337f, + 0.9958049276f, 0.9945218954f, 0.9930684570f, 0.9914448614f, 0.9896513868f, 0.9876883406f, 0.9855560591f, + 0.9832549076f, 0.9807852804f, 0.9781476007f, 0.9753423205f, 0.9723699204f, 0.9692309097f, 0.9659258263f, + 0.9624552365f, 0.9588197349f, 0.9550199445f, 0.9510565163f, 0.9469301295f, 0.9426414911f, 0.9381913359f, + 0.9335804265f, 0.9288095529f, 0.9238795325f, 0.9187912101f, 0.9135454576f, 0.9081431738f, 0.9025852843f, + 0.8968727415f, 0.8910065242f, 0.8849876375f, 0.8788171127f, 0.8724960071f, 0.8660254038f, 0.8594064115f, + 0.8526401644f, 0.8457278217f, 0.8386705679f, 0.8314696123f, 0.8241261886f, 0.8166415552f, 0.8090169944f, + 0.8012538127f, 0.7933533403f, 0.7853169309f, 0.7771459615f, 0.7688418321f, 0.7604059656f, 0.7518398075f, + 0.7431448255f, 0.7343225094f, 0.7253743710f, 0.7163019434f, 0.7071067812f, 0.6977904598f, 0.6883545757f, + 0.6788007455f, 0.6691306064f, 0.6593458151f, 0.6494480483f, 0.6394390020f, 0.6293203910f, 0.6190939493f, + 0.6087614290f, 0.5983246006f, 0.5877852523f, 0.5771451900f, 0.5664062369f, 0.5555702330f, 0.5446390350f, + 0.5336145159f, 0.5224985647f, 0.5112930861f, 0.5000000000f, 0.4886212415f, 0.4771587603f, 0.4656145203f, + 0.4539904997f, 0.4422886902f, 0.4305110968f, 0.4186597375f, 0.4067366431f, 0.3947438564f, 0.3826834324f, + 0.3705574375f, 0.3583679495f, 0.3461170571f, 0.3338068592f, 0.3214394653f, 0.3090169944f, 0.2965415750f, + 0.2840153447f, 0.2714404499f, 0.2588190451f, 0.2461532930f, 0.2334453639f, 0.2206974350f, 0.2079116908f, + 0.1950903220f, 0.1822355255f, 0.1693495038f, 0.1564344650f, 0.1434926220f, 0.1305261922f, 0.1175373975f, + 0.1045284633f, 0.0915016187f, 0.0784590957f, 0.0654031292f, 0.0523359562f, 0.0392598158f, 0.0261769483f, + 0.0130895956f, 0.0000000000f +}; + +const float ivas_sin_twiddle_80[IVAS_80_PT_LEN >> 1] = +{ + -0.00490871880799799f, -0.0441642771270674f, -0.0833517373318975f, -0.122410675199216f, + -0.161280864677880f, -0.199902370753082f, -0.238215641861795f, -0.276161601716971f, + -0.313681740398891f, -0.350718204573223f, -0.387213886696666f, -0.423112513072644f, + -0.458358730621271f, -0.492898192229784f, -0.526677640551852f, -0.559644990126546f, + -0.591749407690343f, -0.622941390558334f, -0.653172842953777f, -0.682397150168297f, + -0.710569250438390f, -0.737645704427393f, -0.763584762205797f, -0.788346427626606f, + -0.811892519996505f, -0.834186732947712f, -0.855194690419775f, -0.874883999664958f, + -0.893224301195515f, -0.910187315595818f, -0.925746887127164f, -0.939879024058033f, + -0.952561935657595f, -0.963776065795440f, -0.973504123095711f, -0.981731107599154f, + -0.988444333891970f, -0.993633450665799f, -0.997290456678690f, -0.999409713092437f +}; + +const float ivas_cos_twiddle_80[IVAS_80_PT_LEN >> 1] = +{ + 0.999987952167257f, 0.999024282300407f, 0.996520189400975f, 0.992479534598710f, + 0.986908548290446f, 0.979815820533276f, 0.971212287799312f, 0.961111216112432f, + 0.949528180593037f, 0.936481041442343f, 0.921989916403245f, 0.906077149740215f, + 0.888767277786068f, 0.870086991108712f, 0.850065093356229f, 0.828732456843738f, + 0.806121974950521f, 0.782268511400816f, 0.757208846506485f, 0.730981620454432f, + 0.703627273726243f, 0.675187984741891f, 0.645707604823667f, 0.615231590580627f, + 0.583806933817786f, 0.551482089078169f, 0.518306898929413f, 0.484332517110141f, + 0.449611329654607f, 0.414196874117224f, 0.378143757021541f, 0.341507569660936f, + 0.304344802380877f, 0.266712757474898f, 0.228669460828619f, 0.190273572448036f, + 0.151584296010041f, 0.112661287574648f, 0.0735645635996675f, 0.0343544083996823f +}; + +const int16_t dirac_gains_P_idx[16] = +{ + -1, 1, 0, 1, 4, 3, 2, 3, 4, 8, 7, 6, 5, 6, 7, 8 +}; + +const float dirac_gains_norm_term[9] = +{ + 1.000000e+00f, 7.071068e-01f, 1.000000e+00f, 4.082483e-01f, 2.041242e-01f, 1.000000e+00f, 2.886751e-01f, 9.128709e-02f, 3.726780e-02f +}; + +const float dirac_gains_Pnm[91][9] = +{ + {-1.000000e+00f,-0.000000e+00f,1.000000e+00f,-0.000000e+00f,0.000000e+00f,-1.000000e+00f,-0.000000e+00f,0.000000e+00f,-0.000000e+00f}, + {-9.998477e-01f,1.745221e-02f,9.995431e-01f,-5.234867e-02f,9.137391e-04f,-9.990864e-01f,1.046734e-01f,-4.568000e-03f,7.973384e-05f}, + {-9.993909e-01f,3.489930e-02f,9.981732e-01f,-1.046341e-01f,3.653884e-03f,-9.963478e-01f,2.090770e-01f,-1.825829e-02f,6.375900e-04f}, + {-9.986295e-01f,5.233614e-02f,9.958913e-01f,-1.567932e-01f,8.217215e-03f,-9.917910e-01f,3.129416e-01f,-4.102976e-02f,2.150287e-03f}, + {-9.975641e-01f,6.975590e-02f,9.927012e-01f,-2.087579e-01f,1.459766e-02f,-9.854290e-01f,4.159897e-01f,-7.281048e-02f,5.091363e-03f}, + {-9.961947e-01f,8.715547e-02f,9.886059e-01f,-2.604715e-01f,2.278823e-02f,-9.772766e-01f,5.179674e-01f,-1.135075e-01f,9.930593e-03f}, + {-9.945220e-01f,1.045284e-01f,9.836106e-01f,-3.118673e-01f,3.277856e-02f,-9.673560e-01f,6.186047e-01f,-1.629950e-01f,1.713145e-02f}, + {-9.925461e-01f,1.218695e-01f,9.777218e-01f,-3.628832e-01f,4.455650e-02f,-9.556924e-01f,7.176415e-01f,-2.211219e-01f,2.715038e-02f}, + {-9.902681e-01f,1.391732e-01f,9.709461e-01f,-4.134564e-01f,5.810756e-02f,-9.423163e-01f,8.148217e-01f,-2.877103e-01f,4.043508e-02f}, + {-9.876884e-01f,1.564343e-01f,9.632925e-01f,-4.635251e-01f,7.341509e-02f,-9.272624e-01f,9.098945e-01f,-3.625562e-01f,5.742321e-02f}, + {-9.848077e-01f,1.736484e-01f,9.547693e-01f,-5.130307e-01f,9.046126e-02f,-9.105685e-01f,1.002619e+00f,-4.454347e-01f,7.854224e-02f}, + {-9.816272e-01f,1.908091e-01f,9.453878e-01f,-5.619103e-01f,1.092244e-01f,-8.922793e-01f,1.092752e+00f,-5.360881e-01f,1.042050e-01f}, + {-9.781475e-01f,2.079115e-01f,9.351591e-01f,-6.101044e-01f,1.296816e-01f,-8.724410e-01f,1.180063e+00f,-6.342387e-01f,1.348115e-01f}, + {-9.743701e-01f,2.249510e-01f,9.240957e-01f,-6.575567e-01f,1.518089e-01f,-8.511051e-01f,1.264332e+00f,-7.395903e-01f,1.707479e-01f}, + {-9.702957e-01f,2.419219e-01f,9.122107e-01f,-7.042075e-01f,1.755787e-01f,-8.283265e-01f,1.345341e+00f,-8.518162e-01f,2.123816e-01f}, + {-9.659258e-01f,2.588191e-01f,8.995191e-01f,-7.500002e-01f,2.009620e-01f,-8.041639e-01f,1.422883e+00f,-9.705719e-01f,2.600640e-01f}, + {-9.612616e-01f,2.756374e-01f,8.860360e-01f,-7.948789e-01f,2.279279e-01f,-7.786796e-01f,1.496760e+00f,-1.095492e+00f,3.141272e-01f}, + {-9.563048e-01f,2.923716e-01f,8.717782e-01f,-8.387891e-01f,2.564435e-01f,-7.519395e-01f,1.566788e+00f,-1.226191e+00f,3.748840e-01f}, + {-9.510565e-01f,3.090171e-01f,8.567626e-01f,-8.816782e-01f,2.864747e-01f,-7.240118e-01f,1.632789e+00f,-1.362268e+00f,4.426280e-01f}, + {-9.455186e-01f,3.255681e-01f,8.410082e-01f,-9.234920e-01f,3.179837e-01f,-6.949692e-01f,1.694595e+00f,-1.503298e+00f,5.176268e-01f}, + {-9.396926e-01f,3.420202e-01f,8.245332e-01f,-9.641815e-01f,3.509334e-01f,-6.648846e-01f,1.752055e+00f,-1.648848e+00f,6.001316e-01f}, + {-9.335804e-01f,3.583678e-01f,8.073587e-01f,-1.003696e+00f,3.852825e-01f,-6.338369e-01f,1.805025e+00f,-1.798461e+00f,6.903643e-01f}, + {-9.271840e-01f,3.746064e-01f,7.895051e-01f,-1.041987e+00f,4.209899e-01f,-6.019047e-01f,1.853375e+00f,-1.951675e+00f,7.885275e-01f}, + {-9.205049e-01f,3.907311e-01f,7.709939e-01f,-1.079010e+00f,4.580124e-01f,-5.691693e-01f,1.896987e+00f,-2.108013e+00f,8.947984e-01f}, + {-9.135456e-01f,4.067366e-01f,7.518480e-01f,-1.114717e+00f,4.963039e-01f,-5.357154e-01f,1.935757e+00f,-2.266981e+00f,1.009325e+00f}, + {-9.063079e-01f,4.226184e-01f,7.320906e-01f,-1.149067e+00f,5.358188e-01f,-5.016273e-01f,1.969593e+00f,-2.428084e+00f,1.132234e+00f}, + {-8.987941e-01f,4.383712e-01f,7.117461e-01f,-1.182016e+00f,5.765077e-01f,-4.669925e-01f,1.998415e+00f,-2.590808e+00f,1.263622e+00f}, + {-8.910065e-01f,4.539906e-01f,6.908387e-01f,-1.213526e+00f,6.183225e-01f,-4.318987e-01f,2.022162e+00f,-2.754647e+00f,1.403563e+00f}, + {-8.829476e-01f,4.694716e-01f,6.693946e-01f,-1.243556e+00f,6.612108e-01f,-3.964354e-01f,2.040781e+00f,-2.919073e+00f,1.552099e+00f}, + {-8.746198e-01f,4.848095e-01f,6.474397e-01f,-1.272072e+00f,7.051207e-01f,-3.606927e-01f,2.054234e+00f,-3.083563e+00f,1.709246e+00f}, + {-8.660253e-01f,5.000000e-01f,6.250001e-01f,-1.299038e+00f,7.500000e-01f,-3.247595e-01f,2.062500e+00f,-3.247595e+00f,1.875000e+00f}, + {-8.571672e-01f,5.150381e-01f,6.021037e-01f,-1.324421e+00f,7.957926e-01f,-2.887278e-01f,2.065570e+00f,-3.410637e+00f,2.049318e+00f}, + {-8.480480e-01f,5.299194e-01f,5.787782e-01f,-1.348191e+00f,8.424437e-01f,-2.526874e-01f,2.063448e+00f,-3.572164e+00f,2.232136e+00f}, + {-8.386706e-01f,5.446391e-01f,5.550525e-01f,-1.370318e+00f,8.898951e-01f,-2.167299e-01f,2.056155e+00f,-3.731644e+00f,2.423358e+00f}, + {-8.290377e-01f,5.591928e-01f,5.309552e-01f,-1.390776e+00f,9.380897e-01f,-1.809446e-01f,2.043725e+00f,-3.888559e+00f,2.622865e+00f}, + {-8.191521e-01f,5.735765e-01f,5.065152e-01f,-1.409539e+00f,9.869699e-01f,-1.454202e-01f,2.026202e+00f,-4.042392e+00f,2.830513e+00f}, + {-8.090171e-01f,5.877852e-01f,4.817629e-01f,-1.426585e+00f,1.036474e+00f,-1.102460e-01f,2.003651e+00f,-4.192627e+00f,3.046121e+00f}, + {-7.986355e-01f,6.018150e-01f,4.567280e-01f,-1.441893e+00f,1.086544e+00f,-7.550830e-02f,1.976144e+00f,-4.338763e+00f,3.269493e+00f}, + {-7.880108e-01f,6.156614e-01f,4.314414e-01f,-1.455444e+00f,1.137117e+00f,-4.129366e-02f,1.943771e+00f,-4.480302e+00f,3.500396e+00f}, + {-7.771459e-01f,6.293205e-01f,4.059335e-01f,-1.467221e+00f,1.188133e+00f,-7.685401e-03f,1.906632e+00f,-4.616763e+00f,3.738582e+00f}, + {-7.660444e-01f,6.427876e-01f,3.802360e-01f,-1.477211e+00f,1.239528e+00f,2.523343e-02f,1.864843e+00f,-4.747667e+00f,3.983766e+00f}, + {-7.547096e-01f,6.560589e-01f,3.543800e-01f,-1.485402e+00f,1.291240e+00f,5.738307e-02f,1.818529e+00f,-4.872555e+00f,4.235647e+00f}, + {-7.431449e-01f,6.691306e-01f,3.283964e-01f,-1.491783e+00f,1.343207e+00f,8.868646e-02f,1.767831e+00f,-4.990988e+00f,4.493906e+00f}, + {-7.313538e-01f,6.819984e-01f,3.023174e-01f,-1.496346e+00f,1.395365e+00f,1.190676e-01f,1.712898e+00f,-5.102528e+00f,4.758184e+00f}, + {-7.193397e-01f,6.946585e-01f,2.761744e-01f,-1.499086e+00f,1.447651e+00f,1.484544e-01f,1.653893e+00f,-5.206765e+00f,5.028115e+00f}, + {-7.071068e-01f,7.071068e-01f,2.500000e-01f,-1.500000e+00f,1.500000e+00f,1.767767e-01f,1.590990e+00f,-5.303301e+00f,5.303301e+00f}, + {-6.946585e-01f,7.193397e-01f,2.238256e-01f,-1.499086e+00f,1.552349e+00f,2.039685e-01f,1.524373e+00f,-5.391762e+00f,5.583331e+00f}, + {-6.819984e-01f,7.313538e-01f,1.976825e-01f,-1.496346e+00f,1.604635e+00f,2.299670e-01f,1.454233e+00f,-5.471792e+00f,5.867779e+00f}, + {-6.691307e-01f,7.431448e-01f,1.716038e-01f,-1.491783e+00f,1.656792e+00f,2.547115e-01f,1.380777e+00f,-5.543053e+00f,6.156183e+00f}, + {-6.560589e-01f,7.547096e-01f,1.456200e-01f,-1.485402e+00f,1.708760e+00f,2.781472e-01f,1.304214e+00f,-5.605237e+00f,6.448089e+00f}, + {-6.427876e-01f,7.660444e-01f,1.197639e-01f,-1.477212e+00f,1.760472e+00f,3.002205e-01f,1.224767e+00f,-5.658049e+00f,6.743000e+00f}, + {-6.293203e-01f,7.771461e-01f,9.406608e-02f,-1.467221e+00f,1.811868e+00f,3.208840e-01f,1.142662e+00f,-5.701226e+00f,7.040430e+00f}, + {-6.156614e-01f,7.880108e-01f,6.855855e-02f,-1.455444e+00f,1.862883e+00f,3.400929e-01f,1.058135e+00f,-5.734527e+00f,7.339859e+00f}, + {-6.018151e-01f,7.986354e-01f,4.327216e-02f,-1.441893e+00f,1.913455e+00f,3.578070e-01f,9.714287e-01f,-5.757732e+00f,7.640767e+00f}, + {-5.877852e-01f,8.090171e-01f,1.823708e-02f,-1.426585e+00f,1.963526e+00f,3.739910e-01f,8.827875e-01f,-5.770657e+00f,7.942629e+00f}, + {-5.735764e-01f,8.191520e-01f,-6.515074e-03f,-1.409539e+00f,2.013030e+00f,3.886124e-01f,7.924678e-01f,-5.773133e+00f,8.244888e+00f}, + {-5.591928e-01f,8.290376e-01f,-3.095508e-02f,-1.390776e+00f,2.061910e+00f,4.016449e-01f,7.007229e-01f,-5.765026e+00f,8.547005e+00f}, + {-5.446391e-01f,8.386706e-01f,-5.505246e-02f,-1.370318e+00f,2.110105e+00f,4.130656e-01f,6.078163e-01f,-5.746228e+00f,8.848414e+00f}, + {-5.299193e-01f,8.480480e-01f,-7.877823e-02f,-1.348191e+00f,2.157557e+00f,4.228564e-01f,5.140093e-01f,-5.716654e+00f,9.148557e+00f}, + {-5.150380e-01f,8.571674e-01f,-1.021038e-01f,-1.324421e+00f,2.204208e+00f,4.310043e-01f,4.195672e-01f,-5.676254e+00f,9.446875e+00f}, + {-5.000001e-01f,8.660253e-01f,-1.249999e-01f,-1.299038e+00f,2.250000e+00f,4.375000e-01f,3.247599e-01f,-5.625000e+00f,9.742785e+00f}, + {-4.848095e-01f,8.746197e-01f,-1.474395e-01f,-1.272072e+00f,2.294879e+00f,4.423398e-01f,2.298521e-01f,-5.562896e+00f,1.003573e+01f}, + {-4.694715e-01f,8.829476e-01f,-1.693947e-01f,-1.243556e+00f,2.338789e+00f,4.455244e-01f,1.351145e-01f,-5.489975e+00f,1.032514e+01f}, + {-4.539906e-01f,8.910065e-01f,-1.908388e-01f,-1.213526e+00f,2.381678e+00f,4.470587e-01f,4.081347e-02f,-5.406296e+00f,1.061045e+01f}, + {-4.383711e-01f,8.987940e-01f,-2.117461e-01f,-1.182016e+00f,2.423492e+00f,4.469530e-01f,-5.278682e-02f,-5.311945e+00f,1.089110e+01f}, + {-4.226183e-01f,9.063078e-01f,-2.320906e-01f,-1.149067e+00f,2.464181e+00f,4.452218e-01f,-1.454199e-01f,-5.207041e+00f,1.116653e+01f}, + {-4.067367e-01f,9.135454e-01f,-2.518479e-01f,-1.114717e+00f,2.503696e+00f,4.418841e-01f,-2.368270e-01f,-5.091725e+00f,1.143620e+01f}, + {-3.907311e-01f,9.205048e-01f,-2.709937e-01f,-1.079010e+00f,2.541987e+00f,4.369636e-01f,-3.267503e-01f,-4.966168e+00f,1.169956e+01f}, + {-3.746066e-01f,9.271839e-01f,-2.895049e-01f,-1.041988e+00f,2.579010e+00f,4.304885e-01f,-4.149371e-01f,-4.830570e+00f,1.195608e+01f}, + {-3.583679e-01f,9.335804e-01f,-3.073587e-01f,-1.003696e+00f,2.614717e+00f,4.224911e-01f,-5.011396e-01f,-4.685155e+00f,1.220525e+01f}, + {-3.420201e-01f,9.396927e-01f,-3.245333e-01f,-9.641814e-01f,2.649067e+00f,4.130083e-01f,-5.851153e-01f,-4.530170e+00f,1.244654e+01f}, + {-3.255681e-01f,9.455186e-01f,-3.410081e-01f,-9.234920e-01f,2.682016e+00f,4.020810e-01f,-6.666291e-01f,-4.365895e+00f,1.267948e+01f}, + {-3.090170e-01f,9.510564e-01f,-3.567626e-01f,-8.816779e-01f,2.713525e+00f,3.897543e-01f,-7.454509e-01f,-4.192628e+00f,1.290358e+01f}, + {-2.923717e-01f,9.563047e-01f,-3.717781e-01f,-8.387894e-01f,2.743556e+00f,3.760769e-01f,-8.213612e-01f,-4.010692e+00f,1.311838e+01f}, + {-2.756374e-01f,9.612617e-01f,-3.860361e-01f,-7.948790e-01f,2.772072e+00f,3.611015e-01f,-8.941467e-01f,-3.820433e+00f,1.332343e+01f}, + {-2.588190e-01f,9.659258e-01f,-3.995190e-01f,-7.499999e-01f,2.799038e+00f,3.448846e-01f,-9.636030e-01f,-3.622222e+00f,1.351832e+01f}, + {-2.419219e-01f,9.702957e-01f,-4.122107e-01f,-7.042072e-01f,2.824421e+00f,3.274858e-01f,-1.029536e+00f,-3.416446e+00f,1.370262e+01f}, + {-2.249510e-01f,9.743701e-01f,-4.240956e-01f,-6.575566e-01f,2.848191e+00f,3.089685e-01f,-1.091760e+00f,-3.203517e+00f,1.387596e+01f}, + {-2.079118e-01f,9.781476e-01f,-4.351591e-01f,-6.101051e-01f,2.870318e+00f,2.893990e-01f,-1.150101e+00f,-2.983865e+00f,1.403797e+01f}, + {-1.908090e-01f,9.816272e-01f,-4.453879e-01f,-5.619099e-01f,2.890776e+00f,2.688461e-01f,-1.204397e+00f,-2.757931e+00f,1.418832e+01f}, + {-1.736482e-01f,9.848077e-01f,-4.547695e-01f,-5.130303e-01f,2.909539e+00f,2.473820e-01f,-1.254495e+00f,-2.526181e+00f,1.432668e+01f}, + {-1.564344e-01f,9.876883e-01f,-4.632923e-01f,-4.635254e-01f,2.926584e+00f,2.250811e-01f,-1.300254e+00f,-2.289093e+00f,1.445277e+01f}, + {-1.391731e-01f,9.902681e-01f,-4.709463e-01f,-4.134560e-01f,2.941893e+00f,2.020205e-01f,-1.341547e+00f,-2.047161e+00f,1.456631e+01f}, + {-1.218693e-01f,9.925461e-01f,-4.777218e-01f,-3.628827e-01f,2.955444e+00f,1.782789e-01f,-1.378258e+00f,-1.800889e+00f,1.466707e+01f}, + {-1.045285e-01f,9.945219e-01f,-4.836107e-01f,-3.118677e-01f,2.967221e+00f,1.539375e-01f,-1.410285e+00f,-1.550796e+00f,1.475483e+01f}, + {-8.715577e-02f,9.961947e-01f,-4.886058e-01f,-2.604724e-01f,2.977212e+00f,1.290786e-01f,-1.437538e+00f,-1.297406e+00f,1.482941e+01f}, + {-6.975648e-02f,9.975641e-01f,-4.927011e-01f,-2.087597e-01f,2.985402e+00f,1.037861e-01f,-1.459940e+00f,-1.041256e+00f,1.489065e+01f}, + {-5.233594e-02f,9.986295e-01f,-4.958915e-01f,-1.567926e-01f,2.991783e+00f,7.814553e-02f,-1.477429e+00f,-7.828888e-01f,1.493841e+01f}, + {-3.489946e-02f,9.993909e-01f,-4.981730e-01f,-1.046346e-01f,2.996346e+00f,5.224292e-02f,-1.489957e+00f,-5.228543e-01f,1.497260e+01f}, + {-1.745235e-02f,9.998478e-01f,-4.995431e-01f,-5.234908e-02f,2.999086e+00f,2.616524e-02f,-1.497488e+00f,-2.617055e-01f,1.499315e+01f}, + {-4.371139e-08f,1.000000e+00f,-5.000000e-01f,-1.311342e-07f,3.000000e+00f,6.556709e-08f,-1.500000e+00f,-6.556709e-07f,1.500000e+01f} +}; + +const float dirac_gains_trg_term[181][2] = +{ + {-1.000000e+00f,8.742278e-08f}, + {-9.998477e-01f,-1.745246e-02f}, + {-9.993908e-01f,-3.489945e-02f}, + {-9.986295e-01f,-5.233605e-02f}, + {-9.975641e-01f,-6.975647e-02f}, + {-9.961947e-01f,-8.715564e-02f}, + {-9.945219e-01f,-1.045285e-01f}, + {-9.925461e-01f,-1.218693e-01f}, + {-9.902681e-01f,-1.391732e-01f}, + {-9.876884e-01f,-1.564344e-01f}, + {-9.848077e-01f,-1.736483e-01f}, + {-9.816272e-01f,-1.908090e-01f}, + {-9.781476e-01f,-2.079116e-01f}, + {-9.743701e-01f,-2.249511e-01f}, + {-9.702957e-01f,-2.419219e-01f}, + {-9.659258e-01f,-2.588191e-01f}, + {-9.612617e-01f,-2.756374e-01f}, + {-9.563048e-01f,-2.923716e-01f}, + {-9.510565e-01f,-3.090170e-01f}, + {-9.455186e-01f,-3.255681e-01f}, + {-9.396926e-01f,-3.420202e-01f}, + {-9.335805e-01f,-3.583679e-01f}, + {-9.271839e-01f,-3.746065e-01f}, + {-9.205049e-01f,-3.907312e-01f}, + {-9.135455e-01f,-4.067366e-01f}, + {-9.063078e-01f,-4.226183e-01f}, + {-8.987941e-01f,-4.383711e-01f}, + {-8.910065e-01f,-4.539906e-01f}, + {-8.829476e-01f,-4.694716e-01f}, + {-8.746198e-01f,-4.848095e-01f}, + {-8.660254e-01f,-5.000001e-01f}, + {-8.571673e-01f,-5.150380e-01f}, + {-8.480480e-01f,-5.299193e-01f}, + {-8.386706e-01f,-5.446390e-01f}, + {-8.290377e-01f,-5.591928e-01f}, + {-8.191521e-01f,-5.735765e-01f}, + {-8.090171e-01f,-5.877852e-01f}, + {-7.986355e-01f,-6.018151e-01f}, + {-7.880108e-01f,-6.156614e-01f}, + {-7.771459e-01f,-6.293205e-01f}, + {-7.660444e-01f,-6.427876e-01f}, + {-7.547097e-01f,-6.560590e-01f}, + {-7.431448e-01f,-6.691306e-01f}, + {-7.313537e-01f,-6.819983e-01f}, + {-7.193397e-01f,-6.946585e-01f}, + {-7.071068e-01f,-7.071068e-01f}, + {-6.946585e-01f,-7.193397e-01f}, + {-6.819983e-01f,-7.313537e-01f}, + {-6.691307e-01f,-7.431448e-01f}, + {-6.560590e-01f,-7.547097e-01f}, + {-6.427876e-01f,-7.660444e-01f}, + {-6.293203e-01f,-7.771460e-01f}, + {-6.156614e-01f,-7.880108e-01f}, + {-6.018151e-01f,-7.986355e-01f}, + {-5.877852e-01f,-8.090170e-01f}, + {-5.735765e-01f,-8.191520e-01f}, + {-5.591928e-01f,-8.290376e-01f}, + {-5.446391e-01f,-8.386706e-01f}, + {-5.299193e-01f,-8.480480e-01f}, + {-5.150380e-01f,-8.571673e-01f}, + {-5.000001e-01f,-8.660254e-01f}, + {-4.848095e-01f,-8.746197e-01f}, + {-4.694716e-01f,-8.829476e-01f}, + {-4.539906e-01f,-8.910065e-01f}, + {-4.383711e-01f,-8.987941e-01f}, + {-4.226183e-01f,-9.063078e-01f}, + {-4.067367e-01f,-9.135454e-01f}, + {-3.907312e-01f,-9.205049e-01f}, + {-3.746066e-01f,-9.271839e-01f}, + {-3.583679e-01f,-9.335805e-01f}, + {-3.420201e-01f,-9.396926e-01f}, + {-3.255681e-01f,-9.455186e-01f}, + {-3.090170e-01f,-9.510565e-01f}, + {-2.923717e-01f,-9.563047e-01f}, + {-2.756374e-01f,-9.612617e-01f}, + {-2.588190e-01f,-9.659258e-01f}, + {-2.419219e-01f,-9.702957e-01f}, + {-2.249510e-01f,-9.743701e-01f}, + {-2.079117e-01f,-9.781476e-01f}, + {-1.908090e-01f,-9.816272e-01f}, + {-1.736482e-01f,-9.848077e-01f}, + {-1.564344e-01f,-9.876884e-01f}, + {-1.391731e-01f,-9.902681e-01f}, + {-1.218693e-01f,-9.925461e-01f}, + {-1.045285e-01f,-9.945219e-01f}, + {-8.715577e-02f,-9.961947e-01f}, + {-6.975648e-02f,-9.975641e-01f}, + {-5.233594e-02f,-9.986295e-01f}, + {-3.489946e-02f,-9.993908e-01f}, + {-1.745235e-02f,-9.998477e-01f}, + {-4.371139e-08f,-1.000000e+00f}, + {1.745238e-02f,-9.998477e-01f}, + {3.489950e-02f,-9.993908e-01f}, + {5.233597e-02f,-9.986295e-01f}, + {6.975651e-02f,-9.975641e-01f}, + {8.715580e-02f,-9.961947e-01f}, + {1.045284e-01f,-9.945219e-01f}, + {1.218693e-01f,-9.925461e-01f}, + {1.391731e-01f,-9.902681e-01f}, + {1.564345e-01f,-9.876884e-01f}, + {1.736482e-01f,-9.848077e-01f}, + {1.908089e-01f,-9.816272e-01f}, + {2.079117e-01f,-9.781476e-01f}, + {2.249510e-01f,-9.743701e-01f}, + {2.419219e-01f,-9.702957e-01f}, + {2.588191e-01f,-9.659258e-01f}, + {2.756374e-01f,-9.612617e-01f}, + {2.923717e-01f,-9.563048e-01f}, + {3.090170e-01f,-9.510565e-01f}, + {3.255681e-01f,-9.455186e-01f}, + {3.420202e-01f,-9.396926e-01f}, + {3.583680e-01f,-9.335804e-01f}, + {3.746066e-01f,-9.271839e-01f}, + {3.907311e-01f,-9.205049e-01f}, + {4.067366e-01f,-9.135455e-01f}, + {4.226182e-01f,-9.063078e-01f}, + {4.383712e-01f,-8.987941e-01f}, + {4.539905e-01f,-8.910065e-01f}, + {4.694716e-01f,-8.829476e-01f}, + {4.848096e-01f,-8.746197e-01f}, + {5.000000e-01f,-8.660254e-01f}, + {5.150381e-01f,-8.571673e-01f}, + {5.299193e-01f,-8.480481e-01f}, + {5.446390e-01f,-8.386706e-01f}, + {5.591929e-01f,-8.290375e-01f}, + {5.735765e-01f,-8.191521e-01f}, + {5.877852e-01f,-8.090170e-01f}, + {6.018150e-01f,-7.986355e-01f}, + {6.156615e-01f,-7.880107e-01f}, + {6.293204e-01f,-7.771460e-01f}, + {6.427876e-01f,-7.660444e-01f}, + {6.560590e-01f,-7.547095e-01f}, + {6.691306e-01f,-7.431449e-01f}, + {6.819984e-01f,-7.313537e-01f}, + {6.946584e-01f,-7.193398e-01f}, + {7.071068e-01f,-7.071068e-01f}, + {7.193398e-01f,-6.946584e-01f}, + {7.313537e-01f,-6.819983e-01f}, + {7.431448e-01f,-6.691306e-01f}, + {7.547096e-01f,-6.560590e-01f}, + {7.660444e-01f,-6.427876e-01f}, + {7.771460e-01f,-6.293204e-01f}, + {7.880108e-01f,-6.156615e-01f}, + {7.986355e-01f,-6.018150e-01f}, + {8.090170e-01f,-5.877852e-01f}, + {8.191521e-01f,-5.735765e-01f}, + {8.290376e-01f,-5.591929e-01f}, + {8.386706e-01f,-5.446391e-01f}, + {8.480481e-01f,-5.299193e-01f}, + {8.571673e-01f,-5.150381e-01f}, + {8.660254e-01f,-5.000000e-01f}, + {8.746197e-01f,-4.848096e-01f}, + {8.829476e-01f,-4.694716e-01f}, + {8.910065e-01f,-4.539905e-01f}, + {8.987941e-01f,-4.383712e-01f}, + {9.063078e-01f,-4.226183e-01f}, + {9.135454e-01f,-4.067366e-01f}, + {9.205049e-01f,-3.907311e-01f}, + {9.271839e-01f,-3.746066e-01f}, + {9.335804e-01f,-3.583679e-01f}, + {9.396926e-01f,-3.420201e-01f}, + {9.455186e-01f,-3.255681e-01f}, + {9.510565e-01f,-3.090170e-01f}, + {9.563048e-01f,-2.923717e-01f}, + {9.612617e-01f,-2.756374e-01f}, + {9.659258e-01f,-2.588190e-01f}, + {9.702957e-01f,-2.419219e-01f}, + {9.743701e-01f,-2.249510e-01f}, + {9.781476e-01f,-2.079117e-01f}, + {9.816272e-01f,-1.908090e-01f}, + {9.848077e-01f,-1.736482e-01f}, + {9.876884e-01f,-1.564345e-01f}, + {9.902681e-01f,-1.391731e-01f}, + {9.925461e-01f,-1.218693e-01f}, + {9.945219e-01f,-1.045285e-01f}, + {9.961947e-01f,-8.715574e-02f}, + {9.975641e-01f,-6.975647e-02f}, + {9.986295e-01f,-5.233596e-02f}, + {9.993908e-01f,-3.489950e-02f}, + {9.998477e-01f,-1.745241e-02f}, + {1.000000e+00f,0.000000e+00f} +}; + +/*----------------------------------------------------------------------------------* + * FB ROM tables + *----------------------------------------------------------------------------------*/ + +const float ivas_fb_cf_4ms_48k[IVAS_FB_4MS_48K_SAMP] = +{ + 0.0000167330f, 0.0001505907f, 0.0004182700f, 0.0008196995f, 0.0013547717f, 0.0020233432f, 0.0028252351f, 0.0037602327f, + 0.0048280857f, 0.0060285082f, 0.0073611788f, 0.0088257407f, 0.0104218019f, 0.0121489350f, 0.0140066776f, 0.0159945324f, + 0.0181119671f, 0.0203584149f, 0.0227332744f, 0.0252359097f, 0.0278656508f, 0.0306217938f, 0.0335036006f, 0.0365102998f, + 0.0396410864f, 0.0428951221f, 0.0462715360f, 0.0497694239f, 0.0533878494f, 0.0571258438f, 0.0609824063f, 0.0649565044f, + 0.0690470742f, 0.0732530206f, 0.0775732174f, 0.0820065080f, 0.0865517057f, 0.0912075934f, 0.0959729248f, 0.1008464240f, + 0.1058267862f, 0.1109126781f, 0.1161027381f, 0.1213955767f, 0.1267897769f, 0.1322838945f, 0.1378764585f, 0.1435659718f, + 0.1493509111f, 0.1552297276f, 0.1612008475f, 0.1672626721f, 0.1734135785f, 0.1796519200f, 0.1859760265f, 0.1923842047f, + 0.1988747391f, 0.2054458921f, 0.2120959043f, 0.2188229954f, 0.2256253644f, 0.2325011901f, 0.2394486317f, 0.2464658292f, + 0.2535509039f, 0.2607019590f, 0.2679170800f, 0.2751943352f, 0.2825317763f, 0.2899274389f, 0.2973793430f, 0.3048854936f, + 0.3124438810f, 0.3200524817f, 0.3277092588f, 0.3354121622f, 0.3431591298f, 0.3509480875f, 0.3587769500f, 0.3666436213f, + 0.3745459953f, 0.3824819564f, 0.3904493799f, 0.3984461328f, 0.4064700741f, 0.4145190556f, 0.4225909225f, 0.4306835136f, + 0.4387946624f, 0.4469221974f, 0.4550639426f, 0.4632177182f, 0.4713813414f, 0.4795526264f, 0.4877293857f, 0.4959094302f, + 0.5040905698f, 0.5122706143f, 0.5204473736f, 0.5286186586f, 0.5367822818f, 0.5449360574f, 0.5530778026f, 0.5612053376f, + 0.5693164864f, 0.5774090775f, 0.5854809444f, 0.5935299259f, 0.6015538672f, 0.6095506201f, 0.6175180436f, 0.6254540047f, + 0.6333563787f, 0.6412230500f, 0.6490519125f, 0.6568408702f, 0.6645878378f, 0.6722907412f, 0.6799475183f, 0.6875561190f, + 0.6951145064f, 0.7026206570f, 0.7100725611f, 0.7174682237f, 0.7248056648f, 0.7320829200f, 0.7392980410f, 0.7464490961f, + 0.7535341708f, 0.7605513683f, 0.7674988099f, 0.7743746356f, 0.7811770046f, 0.7879040957f, 0.7945541079f, 0.8011252609f, + 0.8076157953f, 0.8140239735f, 0.8203480800f, 0.8265864215f, 0.8327373279f, 0.8387991525f, 0.8447702724f, 0.8506490889f, + 0.8564340282f, 0.8621235415f, 0.8677161055f, 0.8732102231f, 0.8786044233f, 0.8838972619f, 0.8890873219f, 0.8941732138f, + 0.8991535760f, 0.9040270752f, 0.9087924066f, 0.9134482943f, 0.9179934920f, 0.9224267826f, 0.9267469794f, 0.9309529258f, + 0.9350434956f, 0.9390175937f, 0.9428741562f, 0.9466121506f, 0.9502305761f, 0.9537284640f, 0.9571048779f, 0.9603589136f, + 0.9634897002f, 0.9664963994f, 0.9693782062f, 0.9721343492f, 0.9747640903f, 0.9772667256f, 0.9796415851f, 0.9818880329f, + 0.9840054676f, 0.9859933224f, 0.9878510650f, 0.9895781981f, 0.9911742593f, 0.9926388212f, 0.9939714918f, 0.9951719143f, + 0.9962397673f, 0.9971747649f, 0.9979766568f, 0.9986452283f, 0.9991803005f, 0.9995817300f, 0.9998494093f, 0.9999832670f, +}; + +const float ivas_fb_cf_4ms_32k[IVAS_FB_4MS_32K_SAMP] = +{ + 0.0000376491f, 0.0003388077f, 0.0009409435f, 0.0018436939f, 0.0030465150f, 0.0045486823f, 0.0063492909f, 0.0084472563f, + 0.0108413146f, 0.0135300239f, 0.0165117645f, 0.0197847403f, 0.0233469798f, 0.0271963373f, 0.0313304940f, 0.0357469598f, + 0.0404430742f, 0.0454160085f, 0.0506627672f, 0.0561801898f, 0.0619649529f, 0.0680135719f, 0.0743224034f, 0.0808876472f, + 0.0877053486f, 0.0947714009f, 0.1020815477f, 0.1096313857f, 0.1174163672f, 0.1254318027f, 0.1336728642f, 0.1421345874f, + 0.1508118753f, 0.1596995011f, 0.1687921112f, 0.1780842286f, 0.1875702559f, 0.1972444793f, 0.2071010713f, 0.2171340946f, + 0.2273375058f, 0.2377051587f, 0.2482308081f, 0.2589081140f, 0.2697306445f, 0.2806918807f, 0.2917852200f, 0.3030039800f, + 0.3143414030f, 0.3257906599f, 0.3373448539f, 0.3489970253f, 0.3607401553f, 0.3725671702f, 0.3844709459f, 0.3964443119f, + 0.4084800560f, 0.4205709283f, 0.4327096457f, 0.4448888964f, 0.4571013438f, 0.4693396318f, 0.4815963885f, 0.4938642309f, + 0.5061357691f, 0.5184036115f, 0.5306603682f, 0.5428986562f, 0.5551111036f, 0.5672903543f, 0.5794290717f, 0.5915199440f, + 0.6035556881f, 0.6155290541f, 0.6274328298f, 0.6392598447f, 0.6510029747f, 0.6626551461f, 0.6742093401f, 0.6856585970f, + 0.6969960200f, 0.7082147800f, 0.7193081193f, 0.7302693555f, 0.7410918860f, 0.7517691919f, 0.7622948413f, 0.7726624942f, + 0.7828659054f, 0.7928989287f, 0.8027555207f, 0.8124297441f, 0.8219157714f, 0.8312078888f, 0.8403004989f, 0.8491881247f, + 0.8578654126f, 0.8663271358f, 0.8745681973f, 0.8825836328f, 0.8903686143f, 0.8979184523f, 0.9052285991f, 0.9122946514f, + 0.9191123528f, 0.9256775966f, 0.9319864281f, 0.9380350471f, 0.9438198102f, 0.9493372328f, 0.9545839915f, 0.9595569258f, + 0.9642530402f, 0.9686695060f, 0.9728036627f, 0.9766530202f, 0.9802152597f, 0.9834882355f, 0.9864699761f, 0.9891586854f, + 0.9915527437f, 0.9936507091f, 0.9954513177f, 0.9969534850f, 0.9981563061f, 0.9990590565f, 0.9996611923f, 0.9999623509f, +}; + +const float ivas_fb_cf_4ms_16k[IVAS_FB_4MS_16K_SAMP] = +{ + 0.0001505907f, 0.0013547717f, 0.0037602327f, 0.0073611788f, 0.0121489350f, 0.0181119671f, 0.0252359097f, 0.0335036006f, + 0.0428951221f, 0.0533878494f, 0.0649565044f, 0.0775732174f, 0.0912075934f, 0.1058267862f, 0.1213955767f, 0.1378764585f, + 0.1552297276f, 0.1734135785f, 0.1923842047f, 0.2120959043f, 0.2325011901f, 0.2535509039f, 0.2751943352f, 0.2973793430f, + 0.3200524817f, 0.3431591298f, 0.3666436213f, 0.3904493799f, 0.4145190556f, 0.4387946624f, 0.4632177182f, 0.4877293857f, + 0.5122706143f, 0.5367822818f, 0.5612053376f, 0.5854809444f, 0.6095506201f, 0.6333563787f, 0.6568408702f, 0.6799475183f, + 0.7026206570f, 0.7248056648f, 0.7464490961f, 0.7674988099f, 0.7879040957f, 0.8076157953f, 0.8265864215f, 0.8447702724f, + 0.8621235415f, 0.8786044233f, 0.8941732138f, 0.9087924066f, 0.9224267826f, 0.9350434956f, 0.9466121506f, 0.9571048779f, + 0.9664963994f, 0.9747640903f, 0.9818880329f, 0.9878510650f, 0.9926388212f, 0.9962397673f, 0.9986452283f, 0.9998494093f, +}; + +const float ivas_fb_fcs_12band_1ms[IVAS_FB_BANDS_12] = +{ + 0.0083333333f, 0.0250000000f, 0.0416666667f, 0.0583333333f, + 0.0750000000f, 0.0916666667f, 0.1083333333f, 0.1416666667f, + 0.2166666667f, 0.3333333333f, 0.5083333333f, 0.8083333333f +}; + +const int16_t ivas_fb_abs_bins_per_band_12band_1ms[IVAS_NUM_SUPPORTED_FS][IVAS_FB_BANDS_12] = +{ + { 24, 30, 30, 30, 30, 30, 42, 76, 124, 182, 291, 367 }, + { 24, 30, 30, 30, 30, 30, 42, 76, 124, 182, 260, 47 }, + { 24, 30, 30, 30, 30, 30, 42, 75, 122, 73, 0, 0 } +}; + +const int16_t ivas_fb_abs_bins_start_offset_12band_1ms[IVAS_NUM_SUPPORTED_FS][IVAS_FB_BANDS_12] = +{ + {0, 9, 25, 41, 57, 73, 88, 110, 158, 246, 380, 593 }, + {0, 9, 25, 41, 57, 73, 88, 110, 158, 246, 380, 593 }, + {0, 9, 25, 41, 57, 73, 88, 110, 159, 247, 0, 0 } +}; + +const int16_t ivas_fb_bins_per_band_12band_1ms[IVAS_NUM_SUPPORTED_FS][IVAS_FB_BANDS_12] = +{ + { + IVAS_FB_12_1MS_48K_END_BINS_BAND_0 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_0, + IVAS_FB_12_1MS_48K_END_BINS_BAND_1 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_1, + IVAS_FB_12_1MS_48K_END_BINS_BAND_2 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_2, + IVAS_FB_12_1MS_48K_END_BINS_BAND_3 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_3, + IVAS_FB_12_1MS_48K_END_BINS_BAND_4 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_4, + IVAS_FB_12_1MS_48K_END_BINS_BAND_5 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_5, + IVAS_FB_12_1MS_48K_END_BINS_BAND_6 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_6, + IVAS_FB_12_1MS_48K_END_BINS_BAND_7 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_7, + IVAS_FB_12_1MS_48K_END_BINS_BAND_8 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_8, + IVAS_FB_12_1MS_48K_END_BINS_BAND_9 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_9, + IVAS_FB_12_1MS_48K_END_BINS_BAND_10 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_10, + IVAS_FB_12_1MS_48K_END_BINS_BAND_11 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_11 + }, + { + IVAS_FB_12_1MS_32K_END_BINS_BAND_0 - IVAS_FB_12_1MS_32K_START_OFFSET_BAND_0, + IVAS_FB_12_1MS_32K_END_BINS_BAND_1 - IVAS_FB_12_1MS_32K_START_OFFSET_BAND_1, + IVAS_FB_12_1MS_32K_END_BINS_BAND_2 - IVAS_FB_12_1MS_32K_START_OFFSET_BAND_2, + IVAS_FB_12_1MS_32K_END_BINS_BAND_3 - IVAS_FB_12_1MS_32K_START_OFFSET_BAND_3, + IVAS_FB_12_1MS_32K_END_BINS_BAND_4 - IVAS_FB_12_1MS_32K_START_OFFSET_BAND_4, + IVAS_FB_12_1MS_32K_END_BINS_BAND_5 - IVAS_FB_12_1MS_32K_START_OFFSET_BAND_5, + IVAS_FB_12_1MS_32K_END_BINS_BAND_6 - IVAS_FB_12_1MS_32K_START_OFFSET_BAND_6, + IVAS_FB_12_1MS_32K_END_BINS_BAND_7 - IVAS_FB_12_1MS_32K_START_OFFSET_BAND_7, + IVAS_FB_12_1MS_32K_END_BINS_BAND_8 - IVAS_FB_12_1MS_32K_START_OFFSET_BAND_8, + IVAS_FB_12_1MS_32K_END_BINS_BAND_9 - IVAS_FB_12_1MS_32K_START_OFFSET_BAND_9, + IVAS_FB_12_1MS_32K_END_BINS_BAND_10 - IVAS_FB_12_1MS_32K_START_OFFSET_BAND_10, + IVAS_FB_12_1MS_32K_END_BINS_BAND_11 - IVAS_FB_12_1MS_32K_START_OFFSET_BAND_11 + }, + { + IVAS_FB_12_1MS_16K_END_BINS_BAND_0 - IVAS_FB_12_1MS_16K_START_OFFSET_BAND_0, + IVAS_FB_12_1MS_16K_END_BINS_BAND_1 - IVAS_FB_12_1MS_16K_START_OFFSET_BAND_1, + IVAS_FB_12_1MS_16K_END_BINS_BAND_2 - IVAS_FB_12_1MS_16K_START_OFFSET_BAND_2, + IVAS_FB_12_1MS_16K_END_BINS_BAND_3 - IVAS_FB_12_1MS_16K_START_OFFSET_BAND_3, + IVAS_FB_12_1MS_16K_END_BINS_BAND_4 - IVAS_FB_12_1MS_16K_START_OFFSET_BAND_4, + IVAS_FB_12_1MS_16K_END_BINS_BAND_5 - IVAS_FB_12_1MS_16K_START_OFFSET_BAND_5, + IVAS_FB_12_1MS_16K_END_BINS_BAND_6 - IVAS_FB_12_1MS_16K_START_OFFSET_BAND_6, + IVAS_FB_12_1MS_16K_END_BINS_BAND_7 - IVAS_FB_12_1MS_16K_START_OFFSET_BAND_7, + IVAS_FB_12_1MS_16K_END_BINS_BAND_8 - IVAS_FB_12_1MS_16K_START_OFFSET_BAND_8, + IVAS_FB_12_1MS_16K_END_BINS_BAND_9 - IVAS_FB_12_1MS_16K_START_OFFSET_BAND_9, + IVAS_FB_12_1MS_16K_END_BINS_BAND_10 - IVAS_FB_12_1MS_16K_START_OFFSET_BAND_10, + IVAS_FB_12_1MS_16K_END_BINS_BAND_11 - IVAS_FB_12_1MS_16K_START_OFFSET_BAND_11 + }, +}; + +const int16_t ivas_fb_bins_start_offset_12band_1ms[IVAS_NUM_SUPPORTED_FS][IVAS_FB_BANDS_12] = +{ + { + IVAS_FB_12_1MS_48K_START_OFFSET_BAND_0, IVAS_FB_12_1MS_48K_START_OFFSET_BAND_1, + IVAS_FB_12_1MS_48K_START_OFFSET_BAND_2, IVAS_FB_12_1MS_48K_START_OFFSET_BAND_3, + IVAS_FB_12_1MS_48K_START_OFFSET_BAND_4, IVAS_FB_12_1MS_48K_START_OFFSET_BAND_5, + IVAS_FB_12_1MS_48K_START_OFFSET_BAND_6, IVAS_FB_12_1MS_48K_START_OFFSET_BAND_7, + IVAS_FB_12_1MS_48K_START_OFFSET_BAND_8, IVAS_FB_12_1MS_48K_START_OFFSET_BAND_9, + IVAS_FB_12_1MS_48K_START_OFFSET_BAND_10, IVAS_FB_12_1MS_48K_START_OFFSET_BAND_11 + }, + { + IVAS_FB_12_1MS_32K_START_OFFSET_BAND_0, IVAS_FB_12_1MS_32K_START_OFFSET_BAND_1, + IVAS_FB_12_1MS_32K_START_OFFSET_BAND_2, IVAS_FB_12_1MS_32K_START_OFFSET_BAND_3, + IVAS_FB_12_1MS_32K_START_OFFSET_BAND_4, IVAS_FB_12_1MS_32K_START_OFFSET_BAND_5, + IVAS_FB_12_1MS_32K_START_OFFSET_BAND_6, IVAS_FB_12_1MS_32K_START_OFFSET_BAND_7, + IVAS_FB_12_1MS_32K_START_OFFSET_BAND_8, IVAS_FB_12_1MS_32K_START_OFFSET_BAND_9, + IVAS_FB_12_1MS_32K_START_OFFSET_BAND_10, IVAS_FB_12_1MS_32K_START_OFFSET_BAND_11 + }, + { + IVAS_FB_12_1MS_16K_START_OFFSET_BAND_0, IVAS_FB_12_1MS_16K_START_OFFSET_BAND_1, + IVAS_FB_12_1MS_16K_START_OFFSET_BAND_2, IVAS_FB_12_1MS_16K_START_OFFSET_BAND_3, + IVAS_FB_12_1MS_16K_START_OFFSET_BAND_4, IVAS_FB_12_1MS_16K_START_OFFSET_BAND_5, + IVAS_FB_12_1MS_16K_START_OFFSET_BAND_6, IVAS_FB_12_1MS_16K_START_OFFSET_BAND_7, + IVAS_FB_12_1MS_16K_START_OFFSET_BAND_8, IVAS_FB_12_1MS_16K_START_OFFSET_BAND_9, + IVAS_FB_12_1MS_16K_START_OFFSET_BAND_10, IVAS_FB_12_1MS_16K_START_OFFSET_BAND_11 + }, +}; + +const float ivas_fb_cf_1ms_48k[IVAS_FB_1MS_48K_SAMP] = +{ + 0.0002677063f, 0.0024076367f, 0.0066783340f, 0.0130615104f, 0.0215298321f, 0.0320470366f, 0.0445680875f, 0.0590393678f, + 0.0753989092f, 0.0935766577f, 0.1134947733f, 0.1350679637f, 0.1582038490f, 0.1828033579f, 0.2087611516f, 0.2359660747f, + 0.2643016316f, 0.2936464851f, 0.3238749760f, 0.3548576614f, 0.3864618685f, 0.4185522633f, 0.4509914298f, 0.4836404586f, + 0.5163595414f, 0.5490085702f, 0.5814477367f, 0.6135381315f, 0.6451423386f, 0.6761250240f, 0.7063535149f, 0.7356983684f, + 0.7640339253f, 0.7912388484f, 0.8171966421f, 0.8417961510f, 0.8649320363f, 0.8865052267f, 0.9064233423f, 0.9246010908f, + 0.9409606322f, 0.9554319125f, 0.9679529634f, 0.9784701679f, 0.9869384896f, 0.9933216660f, 0.9975923633f, 0.9997322937f, +}; + +const float ivas_fb_cf_1ms_32k[IVAS_FB_1MS_32K_SAMP] = +{ + 0.0006022719f, 0.0054117450f, 0.0149843734f, 0.0292279674f, 0.0480053534f, 0.0711356950f, 0.0983962343f, 0.1295244373f, + 0.1642205226f, 0.2021503478f, 0.2429486279f, 0.2862224533f, 0.3315550733f, 0.3785099100f, 0.4266347628f, 0.4754661628f, + 0.5245338372f, 0.5733652372f, 0.6214900900f, 0.6684449267f, 0.7137775467f, 0.7570513721f, 0.7978496522f, 0.8357794774f, + 0.8704755627f, 0.9016037657f, 0.9288643050f, 0.9519946466f, 0.9707720326f, 0.9850156266f, 0.9945882550f, 0.9993977281f, +}; + +const float ivas_fb_cf_1ms_16k[IVAS_FB_1MS_16K_SAMP] = +{ + 0.0024076367f, 0.0215298321f, 0.0590393678f, 0.1134947733f, 0.1828033579f, 0.2643016316f, 0.3548576614f, 0.4509914298f, + 0.5490085702f, 0.6451423386f, 0.7356983684f, 0.8171966421f, 0.8865052267f, 0.9409606322f, 0.9784701679f, 0.9975923633f, + }; + + +const float ivas_fb_fr_12band_1ms_re[IVAS_FB_12_1MS_LEN] = +{ + 0.9748788957f, 0.9427895242f, 0.8792742509f, 0.7856320394f, 0.6637543553f, 0.5159842697f, 0.3449612971f, 0.1523029468f, + -0.0629462677f, -0.2915070279f, -0.5097704228f, -0.6945723663f, -0.8280677163f, -0.8984664279f, -0.9013544787f, -0.8399030468f, + -0.7243177987f, -0.5703726081f, -0.3972779762f, -0.2251611328f, -0.0723653847f, 0.0469440290f, 0.1248973653f, 0.1617697860f, + 0.1709641074f, 0.1694810686f, 0.1629475939f, 0.1522105989f, 0.1386564071f, 0.1233728939f, 0.1073854103f, 0.0914740522f, + 0.0762871837f, 0.0622709857f, 0.0497418146f, 0.0388592902f, 0.0296823509f, 0.0221628349f, 0.0161914497f, 0.0115997684f, + 0.0081967931f, 0.0057721783f, 0.0041230995f, 0.0030548577f, 0.0023984605f, 0.0020073250f, 0.0017670262f, 0.0015886054f, + 0.0014126895f, 0.0012008765f, 0.0009366259f, 0.0006164015f, 0.0002494051f, -0.0001501884f, -0.0005632461f, -0.0009716328f, + -0.0013573205f, -0.0017064484f, -0.0020074979f, -0.0022538257f, -0.0024412527f, -0.0025696364f, -0.0026403325f, -0.0026573398f, + -0.0026249989f, -0.0025490667f, -0.0024348276f, -0.0022882409f, -0.0021144573f, -0.0019190182f, -0.0017066606f, -0.0014824738f, + -0.0012508539f, -0.0010165332f, -0.0007835930f, -0.0005563371f, -0.0003383404f, -0.0001331992f, 0.0000563549f, 0.0002277657f, + 0.0003794289f, 0.0005100093f, 0.0006190856f, 0.0007064556f, 0.0007726658f, 0.0008183240f, 0.0008445608f, 0.0008523932f, + 0.0008431696f, 0.0008180214f, 0.0007783263f, 0.0007252567f, 0.0006602600f, 0.0005846794f, 0.0005002207f, 0.0004085983f, + 0.0003119450f, 0.0002124378f, 0.0001126202f, 0.0000149855f, -0.0000777886f, -0.0001632865f, -0.0002391747f, -0.0003036357f, + -0.0003551891f, -0.0003930613f, -0.0004169567f, -0.0004273258f, -0.0004250606f, -0.0004116574f, -0.0003888481f, -0.0003586881f, + -0.0003231696f, -0.0002842913f, -0.0002437103f, -0.0002028533f, -0.0001626543f, -0.0001237419f, -0.0000862804f, -0.0000502315f, + -0.0000152759f, 0.0000188864f, 0.0000525857f, 0.0000859011f, 0.0001187387f, 0.0001506215f, 0.0001808384f, 0.0002083291f, + 0.0002319112f, 0.0002502468f, 0.0002621167f, 0.0002664223f, 0.0002624512f, 0.0002498541f, 0.0002288448f, 0.0002001024f, + 0.0001648717f, 0.0001247734f, 0.0000818072f, 0.0000380927f, -0.0000041840f, -0.0000430463f, -0.0000767750f, -0.0001041381f, + -0.0001243744f, -0.0001373295f, -0.0001433435f, -0.0001432806f, -0.0001383279f, -0.0001299462f, -0.0001196234f, -0.0001088038f, + -0.0000986591f, -0.0000900582f, -0.0000834123f, -0.0000787307f, -0.0000755665f, -0.0000731664f, -0.0000705050f, -0.0000664967f, + -0.0000600718f, -0.0000503921f, -0.0000369061f, -0.0000195076f, 0.0000014839f, 0.0000252601f, 0.0000506406f, 0.0000761070f, + 0.0000999980f, 0.0001206038f, 0.0001363885f, 0.0001460830f, 0.0001488707f, 0.0001444187f, 0.0001329747f, 0.0001153008f, + 0.0000926636f, 0.0000666729f, 0.0000391891f, + 0.0080195493f, 0.0152804795f, 0.0297236427f, 0.0512076944f, 0.0795504278f, 0.1146345202f, 0.1565217749f, 0.2067150266f, + 0.2696514371f, 0.3398196482f, 0.3975948769f, 0.4239235527f, 0.4051207537f, 0.3335063336f, 0.2086503840f, 0.0374772593f, + -0.1663484542f, -0.3839925014f, -0.5936160820f, -0.7729897529f, -0.9021602868f, -0.9658914408f, -0.9555491003f, -0.8702102709f, + -0.7168585697f, -0.5096278055f, -0.2682088520f, -0.0155786468f, 0.2246238492f, 0.4308147261f, 0.5858672047f, 0.6790005846f, + 0.7068091556f, 0.6734550535f, 0.5898178925f, 0.4719496963f, 0.3387034057f, 0.2092646386f, 0.1002222301f, 0.0233145798f, + -0.0225492413f, -0.0508402802f, -0.0698819559f, -0.0814769049f, -0.0871540019f, -0.0880955245f, -0.0854373943f, -0.0801296337f, + -0.0730507304f, -0.0649236398f, -0.0563762037f, -0.0478921962f, -0.0398550173f, -0.0325224860f, -0.0260651486f, -0.0205564484f, + -0.0160078488f, -0.0123673601f, -0.0095503829f, -0.0074410094f, -0.0059169243f, -0.0048497092f, -0.0041229035f, -0.0036294834f, + -0.0032833863f, -0.0030140242f, -0.0027726134f, -0.0025247022f, -0.0022531837f, -0.0019502609f, -0.0016189799f, -0.0012659033f, + -0.0009025224f, -0.0005393948f, -0.0001881199f, 0.0001429077f, 0.0004458867f, 0.0007165584f, 0.0009512703f, 0.0011491538f, + 0.0013092799f, 0.0014325460f, 0.0015192234f, 0.0015708276f, 0.0015881374f, 0.0015730908f, 0.0015271608f, 0.0014531585f, + 0.0013537657f, 0.0012330943f, 0.0010952099f, 0.0009453732f, 0.0007885040f, 0.0006301505f, 0.0004749667f, 0.0003275524f, + 0.0001910823f, 0.0000681798f, -0.0000401798f, -0.0001336577f, -0.0002133415f, -0.0002805985f, -0.0003376335f, -0.0003863124f, + -0.0004286391f, -0.0004657017f, -0.0004982282f, -0.0005257791f, -0.0005474775f, -0.0005614835f, -0.0005658893f, -0.0005584023f, + -0.0005372971f, -0.0005011582f, -0.0004497305f, -0.0003835612f, -0.0003046159f, -0.0002157155f, -0.0001208702f, -0.0000245120f, + 0.0000683937f, 0.0001532153f, 0.0002256208f, 0.0002823819f, 0.0003212462f, 0.0003415271f, 0.0003437577f, 0.0003299911f, + 0.0003032103f, 0.0002673723f, 0.0002266573f, 0.0001853871f, 0.0001472716f, 0.0001153747f, 0.0000915248f, 0.0000764751f, + 0.0000695838f, 0.0000692286f, 0.0000727574f, 0.0000771057f, 0.0000789150f, 0.0000752114f, 0.0000635256f, 0.0000424610f, + 0.0000116537f, -0.0000279010f, -0.0000741391f, -0.0001238800f, -0.0001733508f, -0.0002183440f, -0.0002548569f, -0.0002793014f, + -0.0002890885f, -0.0002827170f, -0.0002601490f, -0.0002226568f, -0.0001729141f, -0.0001145795f, -0.0000521398f, 0.0000096825f, + 0.0114335951f, 0.0118220569f, 0.0126166715f, 0.0138498428f, 0.0155597951f, 0.0177826837f, 0.0205365788f, 0.0238116184f, + 0.0275499857f, 0.0316384404f, 0.0358879435f, 0.0400334899f, 0.0437164087f, 0.0464960697f, 0.0478357348f, 0.0471294159f, + 0.0436878423f, 0.0367814109f, 0.0256142984f, 0.0093791332f, -0.0128147904f, -0.0419091622f, -0.0791441084f, -0.1267865122f, + -0.1929101618f, -0.2825839913f, -0.3844663503f, -0.4796058889f, -0.5493419153f, -0.5770955026f, -0.5509547813f, -0.4652700670f, + -0.3217444363f, -0.1294222853f, 0.0961203110f, 0.3345074656f, 0.5628461809f, 0.7584007007f, 0.9012417605f, 0.9766103137f, + 0.9766601036f, 0.9013929608f, 0.7586588937f, 0.5632193167f, 0.3350048195f, 0.0967502546f, -0.1286537645f, -0.3208359645f, + -0.4642258941f, -0.5497861643f, -0.5758205512f, -0.5479856830f, -0.4781988983f, -0.3830435617f, -0.2811824725f, -0.1915676007f, + -0.1255389320f, -0.0780249233f, -0.0409475096f, -0.0120357725f, 0.0099548733f, 0.0259692697f, 0.0369008806f, 0.0435579897f, + 0.0467369910f, 0.0471666204f, 0.0455359048f, 0.0424502401f, 0.0384477095f, 0.0339708748f, 0.0293829220f, 0.0249536436f, + 0.0208784147f, 0.0172747220f, 0.0142030489f, 0.0116695065f, 0.0096461650f, 0.0080756116f, 0.0068882718f, 0.0060058072f, + 0.0053538953f, 0.0048628684f, 0.0044756795f, 0.0041456204f, 0.0038402965f, 0.0035372856f, 0.0032255714f, 0.0029004385f, + 0.0025638810f, 0.0022199121f, 0.0018750824f, 0.0015349035f, 0.0012050131f, 0.0008888342f, 0.0005893582f, 0.0003077151f, + 0.0000451990f, -0.0001977660f, -0.0004197988f, -0.0006196394f, -0.0007948001f, -0.0009428845f, -0.0010607326f, -0.0011459111f, + -0.0011961438f, -0.0012107318f, -0.0011899721f, -0.0011362537f, -0.0010532349f, -0.0009464869f, -0.0008223739f, -0.0006883049f, + -0.0005514485f, -0.0004188116f, -0.0002960338f, -0.0001875645f, -0.0000957748f, -0.0000214335f, 0.0000367443f, 0.0000812780f, + 0.0001159924f, 0.0001449821f, 0.0001725036f, 0.0002019612f, 0.0002358809f, 0.0002751586f, 0.0003193210f, 0.0003661738f, + 0.0004124154f, 0.0004536598f, 0.0004853030f, 0.0005027457f, 0.0005022926f, 0.0004813241f, 0.0004389844f, 0.0003760837f, + 0.0002954100f, 0.0002012644f, 0.0000993832f, -0.0000038301f, -0.0001016317f, -0.0001878100f, -0.0002570235f, -0.0003055296f, + -0.0003312954f, -0.0003343869f, -0.0003167133f, -0.0002820121f, -0.0002352424f, -0.0001822598f, -0.0001290196f, -0.0000811569f, + -0.0000432400f, -0.0000185020f, -0.0000083679f, -0.0000125164f, -0.0000287954f, -0.0000536548f, -0.0000824102f, -0.0001099335f, + -0.0001310885f, -0.0001414598f, -0.0001377171f, -0.0001181463f, -0.0000827338f, -0.0000333400f, 0.0000265889f, 0.0000922209f, + 0.0001579388f, 0.0002177817f, 0.0002661695f, 0.0002983587f, 0.0003110497f, 0.0003026261f, 0.0002734474f, 0.0002257288f, + 0.0001634460f, 0.0000918569f, 0.0000170963f, -0.0000545144f, -0.0001169830f, -0.0001653182f, -0.0001959140f, -0.0002069779f, + -0.0001985967f, -0.0001727902f, -0.0001331990f, -0.0000847800f, -0.0000332059f, 0.0000156408f, 0.0000563515f, 0.0000844666f, + 0.0000970039f, 0.0000926836f, 0.0000721249f, 0.0000377027f, -0.0000066339f, -0.0000558449f, -0.0001042571f, -0.0001462224f, + -0.0001766430f, -0.0001915709f, -0.0001885647f, -0.0001670193f, -0.0001281871f, -0.0000751314f, -0.0000123776f, 0.0000544678f, + 0.0001193245f, 0.0001761818f, 0.0002197499f, 0.0002459308f, 0.0002522801f, 0.0002382003f, 0.0002050537f, + 0.0023329977f, 0.0022744367f, 0.0021570870f, 0.0019806181f, 0.0017457340f, 0.0014542507f, 0.0011108455f, 0.0007223346f, + 0.0002992379f, -0.0001466015f, -0.0006012791f, -0.0010533907f, -0.0014941798f, -0.0019241070f, -0.0023530883f, -0.0028080809f, + -0.0033317792f, -0.0039896152f, -0.0048647785f, -0.0060629391f, -0.0077015456f, -0.0099112032f, -0.0128179487f, -0.0165415563f, + -0.0211707180f, -0.0267603854f, -0.0333010728f, -0.0407193019f, -0.0488429494f, -0.0574105466f, -0.0660338484f, -0.0742229694f, + -0.0813438415f, -0.0866673269f, -0.0893099408f, -0.0883179181f, -0.0825536818f, -0.0708351065f, -0.0516356322f, -0.0231563648f, + 0.0229208886f, 0.1000615986f, 0.2093510203f, 0.3390457527f, 0.4725528568f, 0.5906840617f, 0.6745849094f, 0.7082031015f, + 0.6806592553f, 0.5877917414f, 0.4330061655f, 0.2270823403f, -0.0128552066f, -0.2652258122f, -0.5063946175f, -0.7133884257f, + -0.8665187769f, -0.9516510020f, -0.9617959599f, -0.8978644321f, -0.7684707435f, -0.5888227503f, -0.3788375243f, -0.1607017417f, + 0.0437915599f, 0.2158527937f, 0.3418541386f, 0.4148932359f, 0.4353978994f, 0.4110138144f, 0.3553491439f, 0.2873311989f, + 0.2264012967f, 0.1778272597f, 0.1368656384f, 0.1016489237f, 0.0716971046f, 0.0466686361f, 0.0262587636f, 0.0101140856f, + -0.0021717142f, -0.0110521236f, -0.0170125125f, -0.0205483075f, -0.0221473891f, -0.0222696986f, -0.0213345382f, -0.0197075856f, + -0.0176958703f, -0.0155434695f, -0.0134339314f, -0.0114932096f, -0.0097973566f, -0.0083798220f, -0.0072413978f, -0.0063587120f, + -0.0056935805f, -0.0052001373f, -0.0048316507f, -0.0045448649f, -0.0043035469f, -0.0040798367f, -0.0038548953f, -0.0036180007f, + -0.0033653668f, -0.0030981742f, -0.0028208099f, -0.0025389671f, -0.0022582881f, -0.0019832510f, -0.0017166811f, -0.0014595950f, + -0.0012115153f, -0.0009709890f, -0.0007362895f, -0.0005061076f, -0.0002801409f, -0.0000595032f, 0.0001531427f, 0.0003536750f, + 0.0005368997f, 0.0006970650f, 0.0008285636f, 0.0009265836f, 0.0009877836f, 0.0010107351f, 0.0009962610f, 0.0009474346f, + 0.0008694403f, 0.0007691024f, 0.0006543506f, 0.0005334591f, 0.0004143726f, 0.0003039581f, 0.0002074999f, 0.0001282497f, + 0.0000673202f, 0.0000236838f, -0.0000054823f, -0.0000243922f, -0.0000379908f, -0.0000513567f, -0.0000689891f, -0.0000943029f, + -0.0001291385f, -0.0001735855f, -0.0002258909f, -0.0002827035f, -0.0003393834f, -0.0003905818f, -0.0004307882f, -0.0004550220f, + -0.0004593576f, -0.0004414605f, -0.0004008453f, -0.0003390565f, -0.0002595254f, -0.0001673445f, -0.0000687564f, 0.0000293658f, + 0.0001202144f, 0.0001976297f, 0.0002567251f, 0.0002942795f, 0.0003090663f, 0.0003018805f, 0.0002754671f, 0.0002341572f, + 0.0001834501f, 0.0001293884f, 0.0000779842f, 0.0000345648f, 0.0000032926f, -0.0000132797f, -0.0000143893f, -0.0000011447f, + 0.0000236778f, 0.0000559218f, 0.0000905679f, 0.0001222509f, 0.0001458957f, 0.0001572350f, 0.0001533249f, 0.0001328377f, + 0.0000962676f, 0.0000458655f, -0.0000145297f, -0.0000799026f, -0.0001445204f, -0.0002025425f, -0.0002485698f, -0.0002782267f, + -0.0002885684f, -0.0002784187f, -0.0002484615f, -0.0002012166f, -0.0001407652f, -0.0000723891f, -0.0000020250f, 0.0000642779f, + 0.0006545440f, 0.0006092123f, 0.0005211283f, 0.0003952715f, 0.0002383557f, 0.0000584198f, -0.0001362653f, -0.0003375075f, + -0.0005383555f, -0.0007329456f, -0.0009174331f, -0.0010891536f, -0.0012472468f, -0.0013911728f, -0.0015212364f, -0.0016367530f, + -0.0017368889f, -0.0018188830f, -0.0018796284f, -0.0019142370f, -0.0019185646f, -0.0018880671f, -0.0018210801f, -0.0017174793f, + -0.0015821304f, -0.0014225231f, -0.0012516143f, -0.0010835462f, -0.0009352781f, -0.0008198418f, -0.0007467438f, -0.0007129147f, + -0.0007027599f, -0.0006778296f, -0.0005783377f, -0.0003132968f, 0.0002340159f, 0.0012135056f, 0.0027962862f, 0.0051783222f, + 0.0085600080f, 0.0131460500f, 0.0191158420f, 0.0266218006f, 0.0357510579f, 0.0465271020f, 0.0588638446f, 0.0725784015f, + 0.0873370030f, 0.1026908595f, 0.1180068601f, 0.1325484280f, 0.1453642259f, 0.1554807068f, 0.1616648578f, 0.1632688310f, + 0.1549027767f, 0.1198428714f, 0.0449861804f, -0.0696229208f, -0.2158023005f, -0.3790883171f, -0.5408894679f, -0.6808851285f, + -0.7797705919f, -0.8217682544f, -0.7968116423f, -0.7019652931f, -0.5420418321f, -0.3292210214f, -0.0818128466f, 0.1777726196f, + 0.4255266516f, 0.6385776439f, 0.7977664747f, 0.8898038418f, 0.9086949642f, 0.8563086554f, 0.7419773576f, 0.5812252250f, + 0.3937408613f, 0.2008871303f, 0.0230173731f, -0.1230428784f, -0.2260664125f, -0.2818374636f, -0.2937072611f, -0.2733437698f, + -0.2408584071f, -0.2098412063f, -0.1806909043f, -0.1526536550f, -0.1261957677f, -0.1017094943f, -0.0795968657f, -0.0600974864f, + -0.0433545981f, -0.0293681726f, -0.0180470916f, -0.0092000126f, -0.0025796754f, 0.0021127195f, 0.0051910943f, 0.0069776293f, + 0.0077756050f, 0.0078657031f, 0.0074886765f, 0.0068470105f, 0.0060965069f, 0.0053530166f, 0.0046907222f, 0.0041521192f, + 0.0037501212f, 0.0034789031f, 0.0033170573f, 0.0032371863f, 0.0032080612f, 0.0032016671f, 0.0031933530f, 0.0031660244f, + 0.0031082781f, 0.0030162723f, 0.0028905427f, 0.0027365419f, 0.0025611068f, 0.0023726939f, 0.0021783369f, 0.0019843040f, + 0.0017939931f, 0.0016092783f, 0.0014293389f, 0.0012525382f, 0.0010758415f, 0.0008968234f, 0.0007132020f, 0.0005245511f, + 0.0003315658f, 0.0001372209f, -0.0000543880f, -0.0002374465f, -0.0004059085f, -0.0005532434f, -0.0006739838f, -0.0007634986f, + -0.0008192976f, -0.0008405529f, -0.0008289575f, -0.0007878678f, -0.0007226939f, -0.0006397231f, -0.0005461962f, -0.0004490215f, + -0.0003547907f, -0.0002686412f, -0.0001944601f, -0.0001340918f, -0.0000878707f, -0.0000542351f, -0.0000305758f, -0.0000131627f, + 0.0000018427f, 0.0000183480f, 0.0000393727f, 0.0000671196f, 0.0001022671f, 0.0001443061f, 0.0001911748f, 0.0002398911f, + 0.0002864880f, 0.0003268414f, 0.0003567538f, 0.0003727940f, 0.0003723297f, 0.0003541905f, 0.0003184856f, 0.0002669707f, + 0.0002025844f, 0.0001295158f, 0.0000525132f, -0.0000232393f, -0.0000928921f, -0.0001520697f, -0.0001975396f, -0.0002271978f, + -0.0002404958f, -0.0002381708f, + -0.0001556937f, -0.0002232588f, -0.0003000471f, -0.0003807341f, -0.0004589754f, -0.0005276096f, -0.0005796476f, -0.0006085059f, + -0.0006090117f, -0.0005773878f, -0.0005120302f, -0.0004130497f, -0.0002827174f, -0.0001245430f, 0.0000565230f, 0.0002553084f, + 0.0004662156f, 0.0006844691f, 0.0009056254f, 0.0011266188f, 0.0013448100f, 0.0015587720f, 0.0017669159f, 0.0019681955f, + 0.0021605643f, 0.0023419522f, 0.0025089038f, 0.0026581873f, 0.0027858518f, 0.0028896115f, 0.0029682393f, 0.0030244845f, + 0.0030642863f, 0.0030995791f, 0.0031464520f, 0.0032269718f, 0.0033653351f, 0.0035879808f, 0.0039171130f, 0.0043689626f, + 0.0049448001f, 0.0056281538f, 0.0063744051f, 0.0071088295f, 0.0077167468f, 0.0080450691f, 0.0078953687f, 0.0070318498f, + 0.0051792603f, 0.0020396552f, -0.0027043718f, -0.0093630158f, -0.0182327050f, -0.0295599145f, -0.0435368078f, -0.0602568291f, + -0.0797235538f, -0.1017981297f, -0.1262457047f, -0.1526688648f, -0.1806793505f, -0.2098138162f, -0.2408276962f, -0.2733223455f, + -0.2937063941f, -0.2818656143f, -0.2261282142f, -0.1231384900f, 0.0228924303f, 0.2007416620f, 0.3935871743f, 0.5810779624f, + 0.7418520015f, 0.8562199711f, 0.9086554096f, 0.8898222505f, 0.7978469922f, 0.6387191949f, 0.4257228188f, 0.1780121397f, + -0.0815452149f, -0.3289431293f, -0.5417726272f, -0.7017230773f, -0.7966125143f, -0.8216246380f, -0.7796902592f, -0.6808705368f, + -0.5409377623f, -0.3791916953f, -0.2159490132f, -0.0697984743f, 0.0447973984f, 0.1196560777f, 0.1547311650f, 0.1631223252f, + 0.1615491774f, 0.1553970134f, 0.1453090286f, 0.1325143072f, 0.1179833627f, 0.1026659817f, 0.0872986185f, 0.0725159741f, + 0.0587697393f, 0.0463978659f, 0.0355880008f, 0.0264313485f, 0.0189090552f, 0.0129379217f, 0.0083680105f, 0.0050209526f, + 0.0026911244f, 0.0011756268f, 0.0002742518f, -0.0001893835f, -0.0003713645f, -0.0003945662f, -0.0003559061f, -0.0003199311f, + -0.0003286406f, -0.0003992283f, -0.0005347052f, -0.0007234444f, -0.0009489211f, -0.0011892232f, -0.0014247925f, -0.0016368658f, + -0.0018128572f, -0.0019435092f, -0.0020262245f, -0.0020613098f, -0.0020539729f, -0.0020103196f, -0.0019388124f, -0.0018466470f, + -0.0017412840f, -0.0016275801f, -0.0015096821f, -0.0013889666f, -0.0012662678f, -0.0011404183f, -0.0010105747f, -0.0008750310f, + -0.0007333545f, -0.0005851730f, -0.0004319169f, -0.0002754165f, -0.0001192014f, 0.0000330890f, 0.0001767485f, 0.0003076493f, + 0.0004214404f, 0.0005150718f, 0.0005859601f, 0.0006332532f, 0.0006568484f, 0.0006583487f, 0.0006399242f, 0.0006050121f, + 0.0005571017f, 0.0005002994f, 0.0004381601f, 0.0003742519f, 0.0003111446f, 0.0002510679f, 0.0001951108f, 0.0001440004f, + 0.0000974938f, 0.0000552356f, 0.0000162701f, -0.0000201054f, -0.0000548020f, -0.0000881717f, -0.0001205191f, -0.0001514697f, + -0.0001805617f, -0.0002067517f, -0.0002290677f, -0.0002462077f, -0.0002572013f, -0.0002610364f, -0.0002572665f, -0.0002456071f, + -0.0002264461f, -0.0002003792f, -0.0001686145f, + -0.0002097915f, -0.0002547683f, -0.0002867440f, -0.0003037080f, -0.0003049864f, -0.0002912099f, -0.0002641320f, -0.0002263469f, + -0.0001809155f, -0.0001309730f, -0.0000793326f, -0.0000281672f, 0.0000212324f, 0.0000685537f, 0.0001144458f, 0.0001603457f, + 0.0002082167f, 0.0002601799f, 0.0003181336f, 0.0003833534f, 0.0004561750f, 0.0005357423f, 0.0006199091f, 0.0007052503f, + 0.0007872414f, 0.0008605303f, 0.0009193285f, 0.0009578246f, 0.0009706279f, 0.0009531437f, 0.0009018903f, 0.0008146822f, + 0.0006907085f, 0.0005304701f, 0.0003356294f, 0.0001087751f, -0.0001468322f, -0.0004275067f, -0.0007293282f, -0.0010482464f, + -0.0013801011f, -0.0017205409f, -0.0020649160f, -0.0024081360f, -0.0027446427f, -0.0030684675f, -0.0033735725f, -0.0036543691f, + -0.0039066272f, -0.0041285253f, -0.0043220448f, -0.0044942599f, -0.0046587239f, -0.0048362859f, -0.0050555995f, -0.0053524607f, + -0.0057684191f, -0.0063476637f, -0.0071329714f, -0.0081596433f, -0.0094487437f, -0.0109984997f, -0.0127758558f, -0.0147068954f, + -0.0166688890f, -0.0184823228f, -0.0199064468f, -0.0206359860f, -0.0203032667f, -0.0184822593f, -0.0146993237f, -0.0084456516f, + 0.0008037916f, 0.0135712038f, 0.0303539710f, 0.0516053773f, 0.0777267032f, 0.1090646438f, 0.1459928995f, 0.1890045882f, + 0.2399569411f, 0.3035491657f, 0.3744326411f, 0.4330381754f, 0.4602649242f, 0.4422767198f, 0.3711532515f, 0.2461380555f, + 0.0737670473f, -0.1327449736f, -0.3550430014f, -0.5718089399f, -0.7613406410f, -0.9042683903f, -0.9859824923f, -0.9986999813f, + -0.9431316453f, -0.8322426947f, -0.6838587489f, -0.5090121248f, -0.3164353275f, -0.1160643779f, 0.0821150478f, 0.2684309672f, + 0.4341770987f, 0.5719923883f, 0.6762928566f, 0.7434950500f, 0.7721889543f, 0.7631234448f, 0.7191049971f, 0.6447409999f, + 0.5461062812f, 0.4303073808f, 0.3050115994f, 0.1779422698f, 0.0563953149f, -0.0532072816f, -0.1456894384f, -0.2173979596f, + -0.2663715333f, -0.2923808160f, -0.2968590700f, -0.2826977783f, -0.2539702782f, -0.2155328992f, -0.1726410340f, -0.1304388234f, + -0.0937203765f, -0.0651894568f, -0.0434204585f, -0.0262320261f, -0.0128620020f, -0.0027758731f, 0.0045023778f, 0.0094378307f, + 0.0124649620f, 0.0139956053f, 0.0143989384f, 0.0140037462f, 0.0130866052f, 0.0118760507f, 0.0105485285f, 0.0092355458f, + 0.0080250843f, 0.0069705449f, 0.0060949377f, 0.0053998515f, 0.0048701054f, 0.0044812646f, 0.0042032151f, 0.0040054335f, + 0.0038588251f, 0.0037386836f, 0.0036248683f, 0.0035029301f, 0.0033631517f, 0.0032005638f, 0.0030135068f, 0.0028032324f, + 0.0025725319f, 0.0023254060f, 0.0020660644f, 0.0017988746f, 0.0015277862f, 0.0012565431f, 0.0009884144f, 0.0007265302f, + 0.0004737413f, 0.0002329236f, 0.0000068230f, -0.0002017617f, -0.0003902098f, -0.0005560211f, -0.0006970975f, -0.0008117494f, + -0.0008989567f, -0.0009583547f, -0.0009904048f, -0.0009962992f, -0.0009780085f, -0.0009380932f, -0.0008796449f, -0.0008060398f, + -0.0007208281f, -0.0006274895f, -0.0005293371f, -0.0004293314f, -0.0003300469f, -0.0002335751f, -0.0001415683f, -0.0000552272f, + 0.0000245975f, 0.0000973664f, 0.0001627306f, 0.0002204858f, 0.0002704729f, 0.0003125597f, 0.0003465872f, 0.0003723927f, + 0.0003898040f, 0.0003986947f, 0.0003990072f, 0.0003908172f, 0.0003743577f, 0.0003500669f, 0.0003185900f, 0.0002807935f, + 0.0002377348f, 0.0001906413f, 0.0001408526f, 0.0000897771f, 0.0000388229f, -0.0000106507f, -0.0000573934f, -0.0001003004f, + -0.0001384514f, -0.0001711250f, -0.0001978125f, -0.0002182105f, -0.0002322144f, -0.0002398964f, -0.0002414880f, + -0.0001596129f, -0.0001562496f, -0.0001498931f, -0.0001412337f, -0.0001312006f, -0.0001208315f, -0.0001111500f, -0.0001030067f, + -0.0000969764f, -0.0000932334f, -0.0000915268f, -0.0000911372f, -0.0000909596f, -0.0000895515f, -0.0000853138f, -0.0000765980f, + -0.0000619367f, -0.0000401498f, -0.0000105563f, 0.0000269865f, 0.0000719478f, 0.0001231977f, 0.0001789736f, 0.0002370733f, + 0.0002949065f, 0.0003497691f, 0.0003989259f, 0.0004399015f, 0.0004705253f, 0.0004891741f, 0.0004947225f, 0.0004866983f, + 0.0004651169f, 0.0004305530f, 0.0003838811f, 0.0003263054f, 0.0002590637f, 0.0001834786f, 0.0001006881f, 0.0000117772f, + -0.0000824234f, -0.0001810986f, -0.0002835801f, -0.0003890188f, -0.0004964869f, -0.0006046168f, -0.0007117406f, -0.0008155628f, + -0.0009134018f, -0.0010019440f, -0.0010776210f, -0.0011364499f, -0.0011745303f, -0.0011879291f, -0.0011732401f, -0.0011274376f, + -0.0010484260f, -0.0009347877f, -0.0007862674f, -0.0006033735f, -0.0003877877f, -0.0001418301f, 0.0001311620f, 0.0004274542f, + 0.0007424943f, 0.0010715568f, 0.0014092217f, 0.0017500212f, 0.0020878151f, 0.0024164922f, 0.0027293133f, 0.0030197921f, + 0.0032811287f, 0.0035074177f, 0.0036932727f, 0.0038354464f, 0.0039326233f, 0.0039873724f, 0.0040058742f, 0.0039999004f, + 0.0039859967f, 0.0039869775f, 0.0040299079f, 0.0041465214f, 0.0043693426f, 0.0047305856f, 0.0052560067f, 0.0059622775f, + 0.0068486582f, 0.0078935236f, 0.0090446101f, 0.0102161743f, 0.0112791696f, 0.0120612232f, 0.0123383309f, 0.0118401814f, + 0.0102443788f, 0.0071893168f, 0.0022697611f, -0.0049422577f, -0.0149080197f, -0.0281014987f, -0.0450597042f, -0.0665503452f, + -0.0947658820f, -0.1311459738f, -0.1730055990f, -0.2155698254f, -0.2537148355f, -0.2822005637f, -0.2961808714f, -0.2915797030f, + -0.2654897618f, -0.2164403253f, -0.1446028708f, -0.0518524544f, 0.0582677361f, 0.1807212874f, 0.3092454104f, 0.4367256082f, + 0.5556248313f, 0.6584663388f, 0.7383128514f, 0.7892352587f, 0.8067145259f, 0.7879751516f, 0.7322001587f, 0.6406413437f, + 0.5165833320f, 0.3651995965f, 0.1932631326f, 0.0087845907f, -0.1794730708f, -0.3624711894f, -0.5314826505f, -0.6784496714f, + -0.7975387008f, -0.8869066714f, -0.9460978228f, -0.9743683484f, -0.9716887763f, -0.9388912477f, -0.8776913880f, -0.7906217616f, + -0.6809617759f, -0.5526158639f, -0.4099903122f, -0.2578384472f, -0.1011091221f, 0.0552204273f, 0.2063009082f, 0.3475689337f, + 0.4748858634f, 0.5846665399f, 0.6739816770f, 0.7406414471f, 0.7832480152f, 0.8012243690f, 0.7948108464f, 0.7650372454f, + 0.7136651972f, 0.6431094919f, 0.5563357930f, 0.4567441179f, 0.3480375726f, 0.2340859886f, 0.1187851647f, 0.0059210218f, + -0.1009603020f, -0.1986681163f, -0.2844680876f, -0.3561617036f, -0.4121449494f, -0.4514415411f, -0.4737129527f, -0.4792427680f, + -0.4688992715f, -0.4440758562f, -0.4066146191f, -0.3587143469f, -0.3028292405f, -0.2415605597f, -0.1775478604f, -0.1133622284f, + -0.0514077865f, 0.0061666480f, 0.0575405302f, 0.1012784567f, 0.1363672493f, 0.1622340919f, 0.1787438032f, 0.1861777807f, + 0.1851944065f, 0.1767749919f, 0.1621564237f, 0.1427557163f, 0.1200884424f, 0.0956867818f, 0.0710192746f, 0.0474178663f, + 0.0260137499f, 0.0076867119f, -0.0069716085f, -0.0176776741f, -0.0244598245f, -0.0276479905f, -0.0278485265f, -0.0259604376f, + -0.0231942463f, -0.0203712397f, -0.0176250103f, -0.0150030188f, -0.0125853805f, -0.0104245492f, -0.0085536471f, -0.0069822366f, + -0.0057037888f, -0.0046971305f, -0.0039324091f, -0.0033733475f, -0.0029816582f, -0.0027187689f, -0.0025487112f, -0.0024389400f, + -0.0023618935f, -0.0022949607f, -0.0022210429f, -0.0021279181f, -0.0020081783f, -0.0018582858f, -0.0016782193f, -0.0014704729f, + -0.0012396507f, -0.0009915718f, -0.0007329515f, -0.0004706874f, -0.0002116789f, 0.0000376970f, 0.0002716276f, 0.0004852251f, + 0.0006744554f, 0.0008363689f, 0.0009689456f, 0.0010712272f, 0.0011431025f, 0.0011853673f, 0.0011994712f, 0.0011875293f, + 0.0011520531f, 0.0010959403f, 0.0010222139f, 0.0009340189f, 0.0008343934f, 0.0007262955f, 0.0006124255f, 0.0004952948f, + 0.0003771045f, 0.0002598545f, 0.0001452665f, 0.0000349171f, -0.0000698172f, -0.0001676287f, -0.0002573385f, -0.0003377893f, + -0.0004079306f, -0.0004667485f, -0.0005133801f, -0.0005470765f, -0.0005673356f, -0.0005738781f, -0.0005667759f, -0.0005464152f, + -0.0005135934f, -0.0004694478f, -0.0004155042f, -0.0003535607f, -0.0002856874f, -0.0002140732f, -0.0001409939f, -0.0000686445f, + 0.0000008966f, 0.0000658187f, 0.0001245893f, 0.0001760633f, 0.0002194479f, 0.0002543579f, 0.0002807311f, 0.0002988367f, + 0.0003091550f, 0.0003123597f, 0.0003091881f, 0.0003004253f, 0.0002867930f, 0.0002689588f, 0.0002474626f, 0.0002227630f, + 0.0001952039f, 0.0001650929f, 0.0001326952f, 0.0000983261f, 0.0000623480f, 0.0000252528f, -0.0000123602f, -0.0000497334f, + -0.0000860060f, -0.0001202016f, -0.0001513162f, -0.0001783353f, -0.0002003408f, -0.0002165359f, -0.0002263463f, -0.0002294298f, + -0.0002257477f, -0.0002155386f, -0.0001993478f, -0.0001779591f, -0.0001523829f, -0.0001237555f, -0.0000933024f, -0.0000622262f, + -0.0000316695f, -0.0000026169f, 0.0000241191f, 0.0000479620f, 0.0000685482f, 0.0000857501f, 0.0000996158f, 0.0001103594f, + 0.0001182780f, 0.0001237279f, 0.0001270411f, 0.0001285109f, 0.0001283284f, 0.0001265953f, 0.0001232928f, 0.0001183261f, + 0.0001115250f, 0.0001027124f, 0.0000917214f, 0.0000784695f, 0.0000629720f, 0.0000454005f, 0.0000260736f, 0.0000054844f, + -0.0000157413f, -0.0000368512f, -0.0000570374f, -0.0000754661f, -0.0000913623f, -0.0001040431f, -0.0001129942f, + -0.0001518039f, -0.0001490944f, -0.0001437563f, -0.0001359447f, -0.0001258775f, -0.0001138183f, -0.0001000584f, -0.0000848958f, + -0.0000686184f, -0.0000514869f, -0.0000337271f, -0.0000155230f, 0.0000029786f, 0.0000216627f, 0.0000404299f, 0.0000591833f, + 0.0000778062f, 0.0000961486f, 0.0001140075f, 0.0001311212f, 0.0001471607f, 0.0001617373f, 0.0001744077f, 0.0001846979f, + 0.0001921197f, 0.0001962050f, 0.0001965285f, 0.0001927436f, 0.0001846019f, 0.0001719815f, 0.0001548948f, 0.0001335028f, + 0.0001081065f, 0.0000791461f, 0.0000471762f, 0.0000128542f, -0.0000230952f, -0.0000598950f, -0.0000967535f, -0.0001328756f, + -0.0001674945f, -0.0001998742f, -0.0002293319f, -0.0002552303f, -0.0002769922f, -0.0002940867f, -0.0003060409f, -0.0003124253f, + -0.0003128705f, -0.0003070572f, -0.0002947414f, -0.0002757524f, -0.0002500272f, -0.0002176130f, -0.0001787066f, -0.0001336551f, + -0.0000829924f, -0.0000274293f, 0.0000321218f, 0.0000945733f, 0.0001586548f, 0.0002229603f, 0.0002859566f, 0.0003460483f, + 0.0004015979f, 0.0004510007f, 0.0004927070f, 0.0005252984f, 0.0005475019f, 0.0005582587f, 0.0005567241f, 0.0005423236f, + 0.0005147357f, 0.0004739352f, 0.0004201606f, 0.0003539484f, 0.0002760880f, 0.0001876525f, 0.0000899450f, -0.0000154720f, + -0.0001268367f, -0.0002421597f, -0.0003592929f, -0.0004759036f, -0.0005895563f, -0.0006976915f, -0.0007977237f, -0.0008870259f, + -0.0009630432f, -0.0010232813f, -0.0010654313f, -0.0010873564f, -0.0010872233f, -0.0010634782f, -0.0010149807f, -0.0009409632f, + -0.0008411655f, -0.0007157758f, -0.0005655665f, -0.0003918178f, -0.0001964570f, 0.0000180385f, 0.0002485007f, 0.0004912017f, + 0.0007417257f, 0.0009951609f, 0.0012460131f, 0.0014884994f, 0.0017165405f, 0.0019242012f, 0.0021057906f, 0.0022564772f, + 0.0023724911f, 0.0024518980f, 0.0024948363f, 0.0025043647f, 0.0024865838f, 0.0024513953f, 0.0024122725f, 0.0023867094f, + 0.0023953488f, 0.0024618909f, 0.0026112876f, 0.0028689594f, 0.0032578396f, 0.0037969386f, 0.0044971599f, 0.0053595648f, + 0.0063700240f, 0.0074979980f, 0.0086900568f, 0.0098707813f, 0.0109344936f, 0.0117523261f, 0.0121588428f, 0.0119927747f, + 0.0108338004f, 0.0076669462f, 0.0015951619f, -0.0077015608f, -0.0201874668f, -0.0355062002f, -0.0530094339f, -0.0717877750f, + -0.0907221346f, -0.1085412898f, -0.1238936126f, -0.1354215686f, -0.1418421064f, -0.1420235850f, -0.1350600376f, -0.1203351392f, + -0.0975759142f, -0.0668903695f, -0.0287893898f, 0.0158109005f, 0.0656049927f, 0.1189337419f, 0.1738373906f, 0.2281255290f, + 0.2794600956f, 0.3254494085f, 0.3637483740f, 0.3921617568f, 0.4087452458f, 0.4119008001f, 0.4004612717f, 0.3737611396f, + 0.3316892920f, 0.2747217255f, 0.2039316066f, 0.1209761088f, 0.0280593378f, -0.0721274395f, -0.1764869974f, -0.2816158102f, + -0.3839191559f, -0.4797372694f, -0.5654782669f, -0.6377526073f, -0.6935042311f, -0.7301330421f, -0.7456040786f, -0.7385387273f, + -0.7082842960f, -0.6549586998f, -0.5794681743f, -0.4834966938f, -0.3694669951f, -0.2404740552f, -0.1001929952f, 0.0472356415f, + 0.1973394347f, 0.3454617961f, 0.4869187455f, 0.6171590292f, 0.7319219537f, 0.8273869572f, 0.9003096301f, 0.9481388242f, + 0.9691107389f, 0.9623160652f, 0.9277378915f, 0.8662587282f, 0.7796363134f, 0.6704507997f, 0.5420235210f, 0.3983429587f, + 0.2439770306f, 0.0835515600f, -0.0785437339f, -0.2379253926f, -0.3902709949f, -0.5314762215f, -0.6577657562f, -0.7658017175f, + -0.8527727865f, -0.9164711922f, -0.9553496178f, -0.9685606622f, -0.9559747754f, -0.9181785555f, -0.8564517514f, -0.7727251920f, + -0.6695198086f, -0.5498696134f, -0.4172301964f, -0.2753762088f, -0.1282903603f, 0.0199522336f, 0.1653013209f, 0.3038465453f, + 0.4319271716f, 0.5462330255f, 0.6438939828f, 0.7225552652f, 0.7804366545f, 0.8163739029f, 0.8298414763f, 0.8209560951f, + 0.7904613476f, 0.7396940415f, 0.6705336701f, 0.5853367342f, 0.4868582109f, 0.3781627335f, 0.2625283931f, 0.1433461974f, + 0.0240183452f, -0.0921415681f, -0.2020034062f, -0.3027076056f, -0.3917420558f, -0.4670065944f, -0.5268634348f, -0.5701722713f, + -0.5963093708f, -0.6051704118f, -0.5971574290f, -0.5731506218f, -0.5344663552f, -0.4828029698f, -0.4201764962f, -0.3488485038f, + -0.2712486558f, -0.1898944962f, -0.1073111782f, -0.0259536082f, 0.0518664854f, 0.1240464667f, 0.1887496815f, 0.2444518757f, + 0.2899758594f, 0.3245137882f, 0.3476366187f, 0.3592909899f, 0.3597839221f, 0.3497564092f, 0.3301470195f, 0.3021472383f, + 0.2671501836f, 0.2266948496f, 0.1824077493f, 0.1359442498f, 0.0889314191f, 0.0429145298f, -0.0006912934f, -0.0406425334f, + -0.0759009165f, -0.1056580541f, -0.1293508553f, -0.1466672055f, -0.1575424230f, -0.1621466320f, -0.1608642639f, -0.1542663510f, + -0.1430773876f, -0.1281377523f, -0.1103638299f, -0.0907069045f, -0.0701130981f, -0.0494852310f, -0.0296487968f, -0.0113224665f, + 0.0049049322f, 0.0185912359f, 0.0294499482f, 0.0373525686f, 0.0423229093f, 0.0445255530f, 0.0442471860f, 0.0418741009f, + 0.0378642492f, 0.0327185225f, 0.0269484800f, 0.0210472303f, 0.0154578360f, 0.0105498876f, 0.0065912187f, 0.0037323571f, + 0.0018671281f, 0.0006505029f, -0.0001484215f, -0.0006222332f, -0.0008521845f, -0.0009057969f, -0.0008424506f, -0.0007103595f, + -0.0005491202f, -0.0003884807f, -0.0002503188f, -0.0001485007f, -0.0000907440f, -0.0000790482f, -0.0001114146f, -0.0001824655f, + -0.0002849020f, -0.0004100554f, -0.0005489962f, -0.0006928821f, -0.0008336988f, -0.0009643687f, -0.0010791665f, -0.0011736223f, + -0.0012446927f, -0.0012905298f, -0.0013105005f, -0.0013048967f, -0.0012748875f, -0.0012222325f, -0.0011492257f, -0.0010584505f, + -0.0009527473f, -0.0008350241f, -0.0007082563f, -0.0005753473f, -0.0004391546f, -0.0003023856f, -0.0001676358f, -0.0000373054f, + 0.0000863632f, 0.0002013598f, 0.0003058750f, 0.0003983709f, 0.0004775550f, 0.0005424460f, 0.0005923474f, 0.0006269020f, + 0.0006460595f, 0.0006501134f, 0.0006396557f, 0.0006155940f, 0.0005790906f, 0.0005315601f, 0.0004745961f, 0.0004099540f, + 0.0003394710f, 0.0002650418f, 0.0001885408f, 0.0001117995f, 0.0000365379f, -0.0000356487f, -0.0001033434f, -0.0001653071f, + -0.0002205157f, -0.0002681453f, -0.0003075938f, -0.0003384554f, -0.0003605306f, -0.0003737941f, -0.0003783989f, -0.0003746427f, + -0.0003629698f, -0.0003439392f, -0.0003182272f, -0.0002865979f, -0.0002499066f, -0.0002090714f, -0.0001650754f, -0.0001189372f, + -0.0000717098f, -0.0000244485f, 0.0000217960f, 0.0000660121f, 0.0001072384f, 0.0001445996f, 0.0001773182f, 0.0002047476f, + 0.0002263802f, 0.0002418727f, 0.0002510450f, 0.0002538948f, 0.0002505843f, 0.0002414409f, 0.0002269326f, 0.0002076567f, + 0.0001843057f, 0.0001576490f, 0.0001284948f, 0.0000976709f, 0.0000659883f, 0.0000342273f, 0.0000031084f, -0.0000267131f, + -0.0000546656f, -0.0000802581f, -0.0001030882f, -0.0001228320f, -0.0001392462f, -0.0001521538f, -0.0001614454f, -0.0001670654f, + -0.0001690150f, -0.0001673428f, -0.0001621512f, -0.0001535906f, -0.0001418693f, -0.0001272490f, -0.0001100543f, -0.0000906661f, + -0.0000695268f, -0.0000471286f, -0.0000240107f, -0.0000007413f, 0.0000220928f, 0.0000439109f, 0.0000641527f, 0.0000823053f, + 0.0000979177f, 0.0001106244f, 0.0001201540f, 0.0001263447f, 0.0001291432f, 0.0001286087f, 0.0001249010f, 0.0001182738f, + -0.0000677642f, -0.0000523826f, -0.0000355858f, -0.0000177135f, 0.0000008632f, 0.0000197497f, 0.0000385362f, 0.0000568069f, + 0.0000741490f, 0.0000901630f, 0.0001044714f, 0.0001167282f, 0.0001266271f, 0.0001339090f, 0.0001383682f, 0.0001398580f, + 0.0001382933f, 0.0001336542f, 0.0001259858f, 0.0001153988f, 0.0001020662f, 0.0000862221f, 0.0000681561f, 0.0000482094f, + 0.0000267679f, 0.0000042570f, -0.0000188674f, -0.0000421254f, -0.0000650225f, -0.0000870579f, -0.0001077348f, -0.0001265690f, + -0.0001431007f, -0.0001569032f, -0.0001675946f, -0.0001748464f, -0.0001783945f, -0.0001780466f, -0.0001736910f, -0.0001653012f, + -0.0001529419f, -0.0001367694f, -0.0001170335f, -0.0000940728f, -0.0000683121f, -0.0000402526f, -0.0000104645f, 0.0000204271f, + 0.0000517530f, 0.0000828177f, 0.0001129118f, 0.0001413312f, 0.0001673905f, 0.0001904409f, 0.0002098828f, 0.0002251816f, + 0.0002358781f, 0.0002416012f, 0.0002420750f, 0.0002371285f, 0.0002266990f, 0.0002108387f, 0.0001897144f, 0.0001636105f, + 0.0001329251f, 0.0000981694f, 0.0000599596f, 0.0000190121f, -0.0000238695f, -0.0000678035f, -0.0001118486f, -0.0001550177f, + -0.0001963012f, -0.0002346852f, -0.0002691787f, -0.0002988340f, -0.0003227757f, -0.0003402211f, -0.0003505078f, -0.0003531107f, + -0.0003476646f, -0.0003339751f, -0.0003120340f, -0.0002820207f, -0.0002443090f, -0.0001994588f, -0.0001482132f, -0.0000914813f, + -0.0000303277f, 0.0000340527f, 0.0001003514f, 0.0001671757f, 0.0002330697f, 0.0002965468f, 0.0003561116f, 0.0004102952f, + 0.0004576768f, 0.0004969199f, 0.0005267939f, 0.0005462097f, 0.0005542410f, 0.0005501582f, 0.0005334466f, 0.0005038372f, + 0.0004613187f, 0.0004061612f, 0.0003389189f, 0.0002604423f, 0.0001718676f, 0.0000746148f, -0.0000296392f, -0.0001389767f, + -0.0002512831f, -0.0003642749f, -0.0004755563f, -0.0005826556f, -0.0006830878f, -0.0007743933f, -0.0008542007f, -0.0009202618f, + -0.0009705111f, -0.0010030942f, -0.0010164239f, -0.0010092036f, -0.0009804838f, -0.0009296846f, -0.0008566574f, -0.0007617096f, + -0.0006456731f, -0.0005099278f, -0.0003564679f, -0.0001879096f, -0.0000075330f, 0.0001807554f, 0.0003724395f, 0.0005625175f, + 0.0007456177f, 0.0009162481f, 0.0010690442f, 0.0011991672f, 0.0013026871f, 0.0013771151f, 0.0014218793f, 0.0014389208f, + 0.0014331600f, 0.0014130261f, 0.0013907522f, 0.0013826603f, 0.0014090891f, 0.0014942408f, 0.0016655626f, 0.0019530043f, + 0.0023877813f, 0.0030010282f, 0.0038221874f, 0.0048773753f, 0.0061889900f, 0.0077755997f, 0.0096751224f, 0.0119741302f, + 0.0145439912f, 0.0169456183f, 0.0187073400f, 0.0194030360f, 0.0186550704f, 0.0161628228f, 0.0117223361f, 0.0052458122f, + -0.0032269514f, -0.0135216735f, -0.0253307510f, -0.0382203402f, -0.0516449105f, -0.0649674012f, -0.0774853341f, -0.0884609329f, + -0.0971548077f, -0.1028611423f, -0.1049434729f, -0.1028690049f, -0.0962403901f, -0.0848231076f, -0.0685674901f, -0.0476239362f, + -0.0223507100f, 0.0066865637f, 0.0387237751f, 0.0728157951f, 0.1078619795f, 0.1426392416f, 0.1758415350f, 0.2061246656f, + 0.2321547755f, 0.2526589705f, 0.2664761293f, 0.2726061478f, 0.2702555997f, 0.2588781212f, 0.2382077111f, 0.2082835801f, + 0.1694652065f, 0.1224367910f, 0.0682004341f, 0.0080579540f, -0.0564185505f, -0.1234266811f, -0.1909833663f, -0.2569826708f, + -0.3192601922f, -0.3756619825f, -0.4241159008f, -0.4627029725f, -0.4897264437f, -0.5037760457f, -0.5037852577f, -0.4890793474f, + -0.4594123986f, -0.4149916704f, -0.3564881936f, -0.2850327525f, -0.2021970477f, -0.1099601299f, -0.0106608717f, 0.0930624757f, + 0.1983439454f, 0.3021708437f, 0.4014716150f, 0.4932080681f, 0.5744690342f, 0.6425626416f, 0.6951041455f, 0.7300965662f, + 0.7460013189f, 0.7417965309f, 0.7170208283f, 0.6718010612f, 0.6068626327f, 0.5235219179f, 0.4236604995f, 0.3096818407f, + 0.1844512322f, 0.0512207469f, -0.0864589501f, -0.2248372460f, -0.3600700554f, -0.4883307618f, -0.6059225628f, -0.7093885522f, + -0.7956164474f, -0.8619344004f, -0.9061952044f, -0.9268458353f, -0.9229804407f, -0.8943745512f, -0.8414997451f, -0.7655175933f, + -0.6682534406f, -0.5521499681f, -0.4202024874f, -0.2758769248f, -0.1230137793f, 0.0342802674f, 0.1917486212f, 0.3451070280f, + 0.4901663081f, 0.6229542130f, 0.7398298367f, 0.8375910214f, 0.9135663759f, 0.9656969770f, 0.9925961604f, 0.9936618731f, + 0.9690844417f, 0.9196504635f, 0.8467117373f, 0.7522210603f, 0.6386799560f, 0.5090760386f, 0.3668025779f, 0.2155702981f, + 0.0593086479f, -0.0979369079f, -0.2521117236f, -0.3992577525f, -0.5356173001f, -0.6577304376f, -0.7625247715f, -0.8473940864f, + -0.9102647317f, -0.9496471895f, -0.9646722171f, -0.9551100144f, -0.9213725472f, -0.8644985297f, -0.7861220221f, -0.6884251575f, + -0.5740767467f, -0.4461581538f, -0.3080788471f, -0.1634836803f, -0.0161547423f, 0.1300897818f, 0.2714967454f, 0.4044766502f, + 0.5256968794f, 0.6321672656f, 0.7213155657f, 0.7910510602f, 0.8398145087f, 0.8666133944f, 0.8710415117f, 0.8532826677f, + 0.8140984457f, 0.7548006627f, 0.6772093367f, 0.5835975864f, 0.4766250203f, 0.3592616720f, 0.2347045793f, 0.1062894680f, + -0.0226000741f, -0.1486233373f, -0.2685707508f, -0.3794472128f, -0.4785483597f, -0.5635277262f, -0.6324531653f, -0.6838510882f, + -0.7167375675f, -0.7306356074f, -0.7255783918f, -0.7020986046f, -0.6612044089f, -0.6043429290f, -0.5333525140f, -0.4504052564f, + -0.3579415767f, -0.2585987895f, -0.1551357820f, -0.0503559257f, 0.0529695663f, 0.1521757603f, 0.2447735547f, 0.3285128639f, + 0.4014377748f, 0.4619323450f, 0.5087559395f, 0.5410673824f, 0.5584374718f, 0.5608498058f, 0.5486901404f, 0.5227248799f, + 0.4840695396f, 0.4341483415f, 0.3746462780f, 0.3074552135f, 0.2346156774f, 0.1582561348f, 0.0805315031f, 0.0035627058f, + -0.0706210625f, -0.1401357650f, -0.2032902555f, -0.2586270896f, -0.3049554547f, -0.3413754822f, -0.3672935096f, -0.3824281003f, + -0.3868069422f, -0.3807549745f, -0.3648743722f, -0.3400172139f, -0.3072518737f, -0.2678243125f, -0.2231155831f, -0.1745969158f, + -0.1237838039f, -0.0721904757f, -0.0212861041f, 0.0275460057f, 0.0730451234f, 0.1141047432f, 0.1497983924f, 0.1793990348f, + 0.2023917050f, 0.2184792403f, 0.2275811871f, 0.2298261737f, 0.2255382274f, 0.2152176942f, 0.1995175598f, 0.1792160900f, + 0.1551867943f, 0.1283667617f, 0.0997244393f, 0.0702278948f, 0.0408145632f, 0.0123633806f, -0.0143298873f, -0.0385734628f, + -0.0597959924f, -0.0775582602f, -0.0915599770f, -0.1016416466f, -0.1077816401f, -0.1100888003f, -0.1087910023f, -0.1042202530f, + -0.0967949724f, -0.0870002132f, -0.0753665756f, -0.0624486407f, -0.0488036800f, -0.0349714234f, -0.0214555345f, -0.0087074338f, + 0.0028870743f, 0.0130179511f, 0.0214576480f, 0.0280642424f, 0.0327810674f, 0.0356329290f, 0.0367192621f, 0.0362045427f, + 0.0343065259f, 0.0312827821f, 0.0274162441f, 0.0230002982f, 0.0183241826f, 0.0136591847f, 0.0092463500f, 0.0052860575f, + 0.0019300215f, -0.0007241258f, -0.0026354098f, -0.0038192546f, -0.0043449892f, -0.0043308242f, -0.0039467893f, -0.0034183427f, + -0.0028980777f, -0.0024111931f, -0.0019661658f, -0.0015766458f, -0.0012505436f, -0.0009916652f, -0.0007991070f, -0.0006687325f, + -0.0005935987f, -0.0005651424f, -0.0005737315f, -0.0006095407f, -0.0006629742f, -0.0007252278f, -0.0007885086f, -0.0008463178f, + -0.0008934778f, -0.0009262011f, -0.0009419761f, -0.0009394996f, -0.0009184875f, -0.0008795438f, -0.0008239543f, -0.0007535478f, + -0.0006705140f, -0.0005772899f, -0.0004764213f, -0.0003704871f, -0.0002620058f, -0.0001533948f, -0.0000469126f, 0.0000553574f, + 0.0001515421f, 0.0002399825f, 0.0003192564f, 0.0003881782f, 0.0004458153f, 0.0004914859f, 0.0005247706f, 0.0005455066f, + 0.0005537921f, 0.0005499733f, 0.0005346385f, 0.0005085956f, 0.0004728546f, 0.0004285952f, 0.0003771392f, 0.0003199107f, + 0.0002584034f, 0.0001941376f, 0.0001286276f, 0.0000633423f, -0.0000003230f, -0.0000610784f, -0.0001177585f, -0.0001693439f, + -0.0002149716f, -0.0002539451f, -0.0002857364f, -0.0003099879f, -0.0003265074f, -0.0003352642f, -0.0003363800f, -0.0003301214f, + -0.0003168882f, -0.0002972036f, -0.0002717009f, -0.0002411115f, -0.0002062492f, -0.0001679960f, -0.0001272837f, -0.0000850767f, + -0.0000423512f, -0.0000000757f, 0.0000408118f, 0.0000794235f, 0.0001149437f, 0.0001466472f, 0.0001739170f, 0.0001962578f, + 0.0002133072f, 0.0002248417f, 0.0002307793f, 0.0002311773f, 0.0002262259f, 0.0002162377f, 0.0002016344f, 0.0001829302f, + 0.0001607141f, 0.0001356302f, 0.0001083590f, 0.0000795981f, 0.0000500456f, 0.0000203831f, -0.0000087366f, -0.0000367025f, + -0.0000629538f, -0.0000869878f, -0.0001083652f, -0.0001267149f, -0.0001417362f, -0.0001532019f, -0.0001609587f, -0.0001649294f, + -0.0001651125f, -0.0001615824f, -0.0001544884f, -0.0001440526f, -0.0001305669f, -0.0001143883f, -0.0000959318f, -0.0000756626f, + -0.0000540855f, -0.0000317331f, -0.0000091523f, 0.0000131100f, 0.0000345222f, 0.0000545822f, 0.0000728319f, 0.0000888696f, + 0.0001023607f, 0.0001130460f, 0.0001207471f, 0.0001253683f, 0.0001268968f, 0.0001253988f, 0.0001210137f, 0.0001139460f, + -0.0000409890f, -0.0000231831f, -0.0000044979f, 0.0000146405f, 0.0000337894f, 0.0000524983f, 0.0000703210f, 0.0000868245f, + 0.0001016007f, 0.0001142746f, 0.0001245146f, 0.0001320387f, 0.0001366230f, 0.0001381059f, 0.0001363940f, 0.0001314632f, + 0.0001233624f, 0.0001122120f, 0.0000982042f, 0.0000815988f, 0.0000627207f, 0.0000419531f, 0.0000197321f, -0.0000034635f, + -0.0000271191f, -0.0000506974f, -0.0000736478f, -0.0000954205f, -0.0001154773f, -0.0001333068f, -0.0001484351f, -0.0001604403f, + -0.0001689621f, -0.0001737145f, -0.0001744920f, -0.0001711796f, -0.0001637549f, -0.0001522934f, -0.0001369666f, -0.0001180419f, + -0.0000958757f, -0.0000709093f, -0.0000436571f, -0.0000146989f, 0.0000153358f, 0.0000457778f, 0.0000759362f, 0.0001051099f, + 0.0001326066f, 0.0001577542f, 0.0001799192f, 0.0001985179f, 0.0002130330f, 0.0002230225f, 0.0002281351f, 0.0002281154f, + 0.0002228168f, 0.0002122035f, 0.0001963592f, 0.0001754845f, 0.0001499022f, 0.0001200490f, 0.0000864751f, 0.0000498314f, + 0.0000108634f, -0.0000296076f, -0.0000706952f, -0.0001114718f, -0.0001509832f, -0.0001882759f, -0.0002224138f, -0.0002525068f, + -0.0002777271f, -0.0002973368f, -0.0003107015f, -0.0003173138f, -0.0003168019f, -0.0003089482f, -0.0002936908f, -0.0002711354f, + -0.0002415497f, -0.0002053687f, -0.0001631812f, -0.0001157294f, -0.0000638885f, -0.0000086610f, 0.0000488496f, 0.0001074488f, + 0.0001658824f, 0.0002228496f, 0.0002770388f, 0.0003271423f, 0.0003718955f, 0.0004100930f, 0.0004406281f, 0.0004625082f, + 0.0004748944f, 0.0004771120f, 0.0004686867f, 0.0004493486f, 0.0004190617f, 0.0003780176f, 0.0003266564f, 0.0002656483f, + 0.0001959041f, 0.0001185450f, 0.0000349034f, -0.0000535185f, -0.0001450543f, -0.0002379235f, -0.0003302403f, -0.0004200698f, + -0.0005054364f, -0.0005843853f, -0.0006549896f, -0.0007154171f, -0.0007639381f, -0.0007990015f, -0.0008192451f, -0.0008235853f, + -0.0008112325f, -0.0007817958f, -0.0007353001f, -0.0006723017f, -0.0005938949f, -0.0005018237f, -0.0003984545f, -0.0002868589f, + -0.0001707179f, -0.0000543437f, 0.0000575249f, 0.0001597921f, 0.0002473552f, 0.0003152810f, 0.0003593211f, 0.0003761803f, + 0.0003641895f, 0.0003236064f, 0.0002574060f, 0.0001714998f, 0.0000755882f, -0.0000168765f, -0.0000877911f, -0.0001149323f, + -0.0000708145f, 0.0000759664f, 0.0003632082f, 0.0008340171f, 0.0015932147f, 0.0027965684f, 0.0044938862f, 0.0066209827f, + 0.0090614394f, 0.0116532691f, 0.0142012098f, 0.0164868538f, 0.0182824288f, 0.0193635282f, 0.0195233202f, 0.0185852780f, + 0.0164156862f, 0.0129338578f, 0.0081207820f, 0.0020247377f, -0.0052355839f, -0.0134714261f, -0.0224272216f, -0.0317873061f, + -0.0411854169f, -0.0502171478f, -0.0584545493f, -0.0654627361f, -0.0708175739f, -0.0741240923f, -0.0750346389f, -0.0732663141f, + -0.0686167330f, -0.0609776578f, -0.0503456776f, -0.0368295907f, -0.0206538852f, -0.0021581782f, 0.0182077069f, 0.0398928946f, + 0.0622588452f, 0.0845965541f, 0.1061472474f, 0.1261258801f, 0.1437468496f, 0.1582510183f, 0.1689332690f, 0.1751695690f, + 0.1764426874f, 0.1723655442f, 0.1627013795f, 0.1473798510f, 0.1265084200f, 0.1003783769f, 0.0694651504f, 0.0344225859f, + -0.0039288047f, -0.0446195451f, -0.0865544564f, -0.1285410062f, -0.1693219800f, -0.2076116501f, -0.2421343744f, -0.2716645414f, + -0.2950666012f, -0.3113339711f, -0.3196255083f, -0.3192983638f, -0.3099360208f, -0.2913705151f, -0.2636979059f, -0.2272863207f, + -0.1827760335f, -0.1310713384f, -0.0733241526f, -0.0109096078f, 0.0546059294f, 0.1215036544f, 0.1879570196f, 0.2520811416f, + 0.3119856181f, 0.3658292498f, 0.4118751262f, 0.4485444179f, 0.4744672713f, 0.4885291873f, 0.4899114116f, 0.4781239515f, + 0.4530300662f, 0.4148612531f, 0.3642220549f, 0.3020842490f, 0.2297703310f, 0.1489264657f, 0.0614854435f, -0.0303795649f, + -0.1243093268f, -0.2178195955f, -0.3083672722f, -0.3934199265f, -0.4705267388f, -0.5373888894f, -0.5919273479f, -0.6323460927f, + -0.6571888364f, -0.6653875249f, -0.6563010343f, -0.6297427848f, -0.5859962378f, -0.5258176130f, -0.4504254723f, -0.3614772269f, + -0.2610329551f, -0.1515073286f, -0.0356107555f, 0.0837187871f, 0.2033915080f, 0.3202471384f, 0.4311396943f, 0.5330233362f, + 0.6230369707f, 0.6985851980f, 0.7574133141f, 0.7976741718f, 0.8179849388f, 0.8174720079f, 0.7958026627f, 0.7532024103f, + 0.6904573239f, 0.6089011023f, 0.5103870229f, 0.3972453408f, 0.2722271452f, 0.1384360281f, -0.0007506793f, -0.1417690856f, + -0.2809620112f, -0.4146758861f, -0.5393586304f, -0.6516558729f, -0.7485028256f, -0.8272092868f, -0.8855353494f, -0.9217556888f, + -0.9347105366f, -0.9238418625f, -0.8892136169f, -0.8315153830f, -0.7520491685f, -0.6526996069f, -0.5358882111f, -0.4045128580f, + -0.2618739995f, -0.1115895724f, 0.0424992034f, 0.1964285728f, 0.3462168980f, 0.4879703230f, 0.6179866516f, 0.7328545277f, + 0.8295452782f, 0.9054947981f, 0.9586733060f, 0.9876409196f, 0.9915876025f, 0.9703562358f, 0.9244482541f, 0.8550115930f, + 0.7638112998f, 0.6531839260f, 0.5259766298f, 0.3854793593f, 0.2353470917f, 0.0794266997f, -0.0783736011f, -0.2341094912f, + -0.3838855272f, -0.5239604170f, -0.6508401618f, -0.7613664334f, -0.8527950879f, -0.9228648741f, -0.9698533854f, -0.9926197484f, + -0.9906323266f, -0.9639812550f, -0.9133750995f, -0.8401220648f, -0.7460959702f, -0.6336880996f, -0.5057459675f, -0.3655007408f, + -0.2164850263f, -0.0624432571f, 0.0927631497f, 0.2452533396f, 0.3912248813f, 0.5270493663f, 0.6493633998f, 0.7551526079f, + 0.8418266049f, 0.9072829806f, 0.9499587608f, 0.9688680208f, 0.9636247817f, 0.9344506105f, 0.8821668237f, 0.8081715061f, + 0.7144020216f, 0.6032839905f, 0.4776681160f, 0.3407564859f, 0.1960202987f, 0.0471111158f, -0.1022320452f, -0.2482774188f, + -0.3873945568f, -0.5161453835f, -0.6313699144f, -0.7302645031f, -0.8104506434f, -0.8700326423f, -0.9076427350f, -0.9224725808f, + -0.9142903937f, -0.8834433701f, -0.8308454204f, -0.7579506175f, -0.6667131091f, -0.5595346127f, -0.4392008921f, -0.3088089180f, + -0.1716866150f, -0.0313073005f, 0.1087989808f, 0.2451349347f, 0.3743240333f, 0.4931948249f, 0.5988594260f, 0.6887842282f, + 0.7608510829f, 0.8134074688f, 0.8453044545f, 0.8559215759f, 0.8451781058f, 0.8135305285f, 0.7619564059f, 0.6919251500f, + 0.6053565671f, 0.5045683259f, 0.3922137963f, 0.2712119195f, 0.1446709795f, 0.0158082697f, -0.1121322505f, -0.2359621952f, + -0.3526287795f, -0.4592906218f, -0.5533874164f, -0.6327017647f, -0.6954116543f, -0.7401323484f, -0.7659467130f, -0.7724233338f, + -0.7596220816f, -0.7280871206f, -0.6788276697f, -0.6132871451f, -0.5333015981f, -0.4410486347f, -0.3389882280f, -0.2297970351f, + -0.1162979714f, -0.0013869076f, 0.1120416061f, 0.2211676650f, 0.3233165238f, 0.4160245192f, 0.4970987736f, 0.5646692200f, + 0.6172317171f, 0.6536812560f, 0.6733345403f, 0.6759414941f, 0.6616855531f, 0.6311728784f, 0.5854109229f, 0.5257770441f, + 0.4539781120f, 0.3720022713f, 0.2820642158f, 0.1865454701f, 0.0879312930f, -0.0112541288f, -0.1085124968f, -0.2014345624f, + -0.2877600257f, -0.3654326821f, -0.4326494615f, -0.4879021964f, -0.5300111477f, -0.5581495604f, -0.5718587503f, -0.5710534933f, + -0.5560177281f, -0.5273908494f, -0.4861450978f, -0.4335547859f, -0.3711582904f, -0.3007139250f, -0.2241509378f, -0.1435169935f, + -0.0609235618f, 0.0215093313f, 0.1017075454f, 0.1776950580f, 0.2476426746f, 0.3099120105f, 0.3630936929f, 0.4060388941f, + 0.4378835058f, 0.4580644620f, 0.4663279432f, 0.4627294004f, 0.4476255675f, 0.4216588257f, 0.3857344863f, 0.3409917280f, + 0.2887690825f, 0.2305654810f, 0.1679979813f, 0.1027573461f, 0.0365626923f, -0.0288835867f, -0.0919394404f, -0.1510642130f, + -0.2048561002f, -0.2520851099f, -0.2917207545f, -0.3229538699f, -0.3452121154f, -0.3581688961f, -0.3617456210f, -0.3561073997f, + -0.3416524423f, -0.3189955996f, -0.2889466186f, -0.2524838235f, -0.2107240303f, -0.1648895947f, -0.1162735377f, -0.0662037318f, + -0.0160071241f, 0.0330250452f, 0.0796701284f, 0.1228042256f, 0.1614288774f, 0.1946936678f, 0.2219142443f, 0.2425853919f, + 0.2563889487f, 0.2631964891f, 0.2630668532f, 0.2562387302f, 0.2431186436f, 0.2242647892f, 0.2003672939f, 0.1722255274f, + 0.1407231814f, 0.1068018529f, 0.0714339071f, 0.0355953755f, 0.0002396385f, -0.0337274180f, -0.0654701262f, -0.0942430905f, + -0.1194080954f, -0.1404475082f, -0.1569739116f, -0.1687358288f, -0.1756195042f, -0.1776468257f, -0.1749695713f, -0.1678602690f, + -0.1567000359f, -0.1419638484f, -0.1242037381f, -0.1040304695f, -0.0820942616f, -0.0590651422f, -0.0356134981f, -0.0123913771f, + 0.0099849609f, 0.0309507800f, 0.0500065129f, 0.0667289886f, 0.0807800207f, 0.0919121972f, 0.0999718200f, 0.1048990098f, + 0.1067250926f, 0.1055674412f, 0.1016220359f, 0.0951540418f, 0.0864867765f, 0.0759894469f, 0.0640640860f, 0.0511321002f, + 0.0376208624f, 0.0239507391f, 0.0105229429f, -0.0022914718f, -0.0141611639f, -0.0248023986f, -0.0339850878f, -0.0415368905f, + -0.0473453103f, -0.0513578334f, -0.0535801684f, -0.0540727489f, -0.0529456678f, -0.0503522968f, -0.0464818329f, -0.0415510875f, + -0.0357957930f, -0.0294617627f, -0.0227961726f, -0.0160392815f, -0.0094168137f, -0.0031332654f, 0.0026337157f, 0.0077376956f, + 0.0120665112f, 0.0155439285f, 0.0181299546f, 0.0198198008f, 0.0206416522f, 0.0206533153f, 0.0199379832f, 0.0185992414f, + 0.0167556135f, 0.0145347842f, 0.0120678335f, 0.0094835966f, 0.0069034859f, 0.0044368299f, 0.0021770482f, 0.0001986183f, + -0.0014448717f, -0.0027217639f, -0.0036221831f, -0.0041570536f, -0.0043559653f, -0.0042644747f, -0.0039403827f, -0.0034499387f, + -0.0028631090f, -0.0022496331f, -0.0016738218f, -0.0011929502f, -0.0008370454f, -0.0005846760f, -0.0004048972f, -0.0002842065f, + -0.0002119725f, -0.0001785258f, -0.0001746762f, -0.0001920559f, -0.0002230524f, -0.0002610877f, -0.0003005688f, -0.0003370221f, + -0.0003669912f, -0.0003880546f, -0.0003986770f, -0.0003981548f, -0.0003864480f, -0.0003640945f, -0.0003320500f, -0.0002916028f, + -0.0002442394f, -0.0001915781f, -0.0001352688f, -0.0000769517f, -0.0000181891f, 0.0000395524f, 0.0000949441f, 0.0001467973f, + 0.0001940871f, 0.0002359457f, 0.0002716760f, 0.0003007405f, 0.0003227698f, 0.0003375491f, 0.0003450236f, 0.0003452833f, + 0.0003385643f, 0.0003252319f, 0.0003057766f, 0.0002807946f, 0.0002509791f, 0.0002170975f, 0.0001799788f, 0.0001404893f, + 0.0000995183f, 0.0000579532f, 0.0000166659f, -0.0000235093f, -0.0000617873f, -0.0000974508f, -0.0001298571f, -0.0001584526f, + -0.0001827754f, -0.0002024649f, -0.0002172605f, -0.0002270070f, -0.0002316506f, -0.0002312399f, -0.0002259201f, -0.0002159308f, + -0.0002015976f, -0.0001833276f, -0.0001615981f, -0.0001369497f, -0.0001099729f, -0.0000812980f, -0.0000515797f, -0.0000214856f, + 0.0000083213f, 0.0000371946f, 0.0000645215f, 0.0000897344f, 0.0001123264f, 0.0001318594f, 0.0001479763f, 0.0001604052f, + 0.0001689663f, 0.0001735714f, 0.0001742252f, 0.0001710200f, 0.0001641324f, 0.0001538135f, 0.0001403825f, 0.0001242143f, + 0.0001057308f, 0.0000853884f, 0.0000636683f, 0.0000410646f, 0.0000180754f, -0.0000048078f, -0.0000271075f, -0.0000483697f, + -0.0000681699f, -0.0000861206f, -0.0001018770f, -0.0001151429f, -0.0001256753f, -0.0001332891f, -0.0001378602f, -0.0001393293f, + -0.0001377022f, -0.0001330520f, -0.0001255166f, -0.0001152976f, -0.0001026555f, -0.0000879046f, -0.0000714049f, -0.0000535546f, + -0.0000347786f, -0.0000155193f, 0.0000037762f, 0.0000226667f, 0.0000407288f, 0.0000575664f, 0.0000728215f, 0.0000861808f, + 0.0000582411f, 0.0000747547f, 0.0000898871f, 0.0001032552f, 0.0001145066f, 0.0001233290f, 0.0001294588f, 0.0001326885f, + 0.0001328735f, 0.0001299377f, 0.0001238768f, 0.0001147609f, 0.0001027340f, 0.0000880132f, 0.0000708843f, 0.0000516966f, + 0.0000308558f, 0.0000088150f, -0.0000139353f, -0.0000368781f, -0.0000594822f, -0.0000812142f, -0.0001015508f, -0.0001199912f, + -0.0001360692f, -0.0001493631f, -0.0001595073f, -0.0001661997f, -0.0001692106f, -0.0001683879f, -0.0001636621f, -0.0001550493f, + -0.0001426526f, -0.0001266610f, -0.0001073481f, -0.0000850672f, -0.0000602464f, -0.0000333807f, -0.0000050232f, 0.0000242254f, + 0.0000537286f, 0.0000828270f, 0.0001108523f, 0.0001371418f, 0.0001610527f, 0.0001819781f, 0.0001993603f, 0.0002127056f, + 0.0002215967f, 0.0002257043f, 0.0002247967f, 0.0002187482f, 0.0002075440f, 0.0001912841f, 0.0001701836f, 0.0001445712f, + 0.0001148842f, 0.0000816622f, 0.0000455367f, 0.0000072204f, -0.0000325082f, -0.0000728185f, -0.0001128466f, -0.0001517120f, + -0.0001885378f, -0.0002224679f, -0.0002526873f, -0.0002784386f, -0.0002990404f, -0.0003139008f, -0.0003225330f, -0.0003245650f, + -0.0003197504f, -0.0003079739f, -0.0002892583f, -0.0002637651f, -0.0002317973f, -0.0001937968f, -0.0001503441f, -0.0001021521f, + -0.0000500632f, 0.0000049600f, 0.0000618411f, 0.0001194039f, 0.0001763844f, 0.0002314533f, 0.0002832366f, 0.0003303508f, + 0.0003714378f, 0.0004052165f, 0.0004305340f, 0.0004464367f, 0.0004522372f, 0.0004476003f, 0.0004326187f, 0.0004079029f, + 0.0003746497f, 0.0003347161f, 0.0002906568f, 0.0002457555f, 0.0002040014f, 0.0001700503f, 0.0001491128f, 0.0001468223f, + 0.0001690255f, 0.0002215535f, 0.0003099526f, 0.0004392070f, 0.0006136491f, 0.0008369098f, 0.0011153908f, 0.0014626641f, + 0.0018595375f, 0.0022395932f, 0.0025311249f, 0.0026688715f, 0.0025944027f, 0.0022604100f, 0.0016336976f, 0.0006981998f, + -0.0005431676f, -0.0020672947f, -0.0038308355f, -0.0057710271f, -0.0078076165f, -0.0098456303f, -0.0117790591f, -0.0134951832f, + -0.0148794917f, -0.0158209062f, -0.0162171833f, -0.0159802046f, -0.0150409946f, -0.0133541921f, -0.0109018245f, -0.0076961552f, + -0.0037814932f, 0.0007651902f, 0.0058348824f, 0.0112884531f, 0.0169598389f, 0.0226604555f, 0.0281847079f, 0.0333164681f, + 0.0378363117f, 0.0415293031f, 0.0441930617f, 0.0456458479f, 0.0457343703f, 0.0443410397f, 0.0413903773f, 0.0368543265f, + 0.0307562218f, 0.0231732263f, 0.0142370712f, 0.0041330029f, -0.0069031215f, -0.0185895710f, -0.0306052464f, -0.0425978140f, + -0.0541932843f, -0.0650067808f, -0.0746542114f, -0.0827644992f, -0.0889920115f, -0.0930287926f, -0.0946162074f, -0.0935555973f, + -0.0897175729f, -0.0830495883f, -0.0735814928f, -0.0614287943f, -0.0467934430f, -0.0299620019f, -0.0113011569f, 0.0087494102f, + 0.0296866709f, 0.0509562355f, 0.0719663997f, 0.0921039151f, 0.1107510726f, 0.1273036411f, 0.1411891551f, 0.1518850212f, + 0.1589358970f, 0.1619698015f, 0.1607124306f, 0.1549991925f, 0.1447845216f, 0.1301481022f, 0.1112977047f, 0.0885684336f, + 0.0624182781f, 0.0334199675f, 0.0022492343f, -0.0303302958f, -0.0634852726f, -0.0963334260f, -0.1279665024f, -0.1574747445f, + -0.1839722700f, -0.2066226519f, -0.2246639837f, -0.2374326975f, -0.2443854241f, -0.2451182136f, -0.2393824923f, -0.2270972049f, + -0.2083566840f, -0.1834338958f, -0.1527788314f, -0.1170119438f, -0.0769126672f, -0.0334031935f, 0.0124721800f, 0.0595716856f, + 0.1066841340f, 0.1525596967f, 0.1959426466f, 0.2356052084f, 0.2703816159f, 0.2992014435f, 0.3211212759f, 0.3353538037f, + 0.3412934754f, 0.3385379160f, 0.3269044144f, 0.3064409015f, 0.2774309795f, 0.2403927139f, 0.1960710651f, 0.1454240053f, + 0.0896025447f, 0.0299250576f, -0.0321535327f, -0.0950769985f, -0.1572266359f, -0.2169627100f, -0.2726674612f, -0.3227885475f, + -0.3658817647f, -0.4006518763f, -0.4259904152f, -0.4410093734f, -0.4450697851f, -0.4378043259f, -0.4191331941f, -0.3892727036f, + -0.3487362065f, -0.2983271575f, -0.2391243433f, -0.1724595094f, -0.0998878249f, -0.0231518277f, 0.0558603212f, 0.1351612774f, + 0.2127145048f, 0.2864865610f, 0.3545003342f, 0.4148878376f, 0.4659411557f, 0.5061601567f, 0.5342956523f, 0.5493867774f, + 0.5507914983f, 0.5382093212f, 0.5116954608f, 0.4716659463f, 0.4188933721f, 0.3544932422f, 0.2799011075f, 0.1968409421f, + 0.1072854415f, 0.0134091535f, -0.0824644450f, -0.1779206367f, -0.2705144779f, -0.3578335937f, -0.4375611342f, -0.5075372480f, + -0.5658174366f, -0.6107262192f, -0.6409046287f, -0.6553502097f, -0.6534483577f, -0.6349940579f, -0.6002033141f, -0.5497138242f, + -0.4845747300f, -0.4062255582f, -0.3164647475f, -0.2174084443f, -0.1114405017f, -0.0011548715f, 0.1107082189f, 0.2213307209f, + 0.3278881365f, 0.4276219846f, 0.5179114992f, 0.5963426829f, 0.6607728958f, 0.7093892437f, 0.7407591825f, 0.7538719283f, + 0.7481694943f, 0.7235664280f, 0.6804576085f, 0.6197137625f, 0.5426646818f, 0.4510704345f, 0.3470811862f, 0.2331865442f, + 0.1121556241f, -0.0130307134f, -0.1392537831f, -0.2633353122f, -0.3821180118f, -0.4925464326f, -0.5917460154f, -0.6770982854f, + -0.7463102071f, -0.7974758632f, -0.8291287887f, -0.8402835311f, -0.8304652631f, -0.7997265817f, -0.7486509433f, -0.6783425346f, + -0.5904027183f, -0.4868935511f, -0.3702891985f, -0.2434164031f, -0.1093854415f, 0.0284867240f, 0.1667591937f, 0.3019536886f, + 0.4306427342f, 0.5495372068f, 0.6555710008f, 0.7459806116f, 0.8183775659f, 0.8708117817f, 0.9018241781f, 0.9104871053f, + 0.8964314857f, 0.8598598737f, 0.8015450208f, 0.7228138795f, 0.6255173800f, 0.5119866531f, 0.3849767570f, 0.2475992600f, + 0.1032453598f, -0.0444985629f, -0.1919408168f, -0.3353774466f, -0.4711860685f, -0.5959181193f, -0.7063871285f, -0.7997507598f, + -0.8735844695f, -0.9259448860f, -0.9554212155f, -0.9611733371f, -0.9429555253f, -0.9011251664f, -0.8366361515f, -0.7510170890f, + -0.6463347988f, -0.5251440036f, -0.3904244118f, -0.2455067964f, -0.0939898753f, 0.0603498686f, 0.2136531983f, 0.3620754993f, + 0.5018841040f, 0.6295530127f, 0.7418526589f, 0.8359323337f, 0.9093932351f, 0.9603501538f, 0.9874803034f, 0.9900578955f, + 0.9679736807f, 0.9217387716f, 0.8524727897f, 0.7618764115f, 0.6521892146f, 0.5261336069f, 0.3868465674f, 0.2378005415f, + 0.0827159689f, -0.0745329240f, -0.2300158926f, -0.3798465481f, -0.5202802756f, -0.6478099233f, -0.7592521853f, -0.8518447888f, + -0.9233379834f, -0.9720085218f, -0.9966758999f, -0.9967463299f, -0.9722295329f, -0.9237392201f, -0.8524778646f, -0.7602073639f, + -0.6492055631f, -0.5222103755f, -0.3823523682f, -0.2330778865f, -0.0780642593f, 0.0788705421f, 0.2338618240f, 0.3830931459f, + 0.5228902075f, 0.6498111734f, 0.7607313594f, 0.8529200672f, 0.9241077914f, 0.9725420391f, 0.9970304792f, 0.9969702721f, + 0.9723629327f, 0.9238142869f, 0.8525195846f, 0.7602340753f, 0.6492298214f, 0.5222397619f, 0.3823904496f, 0.2331250710f, + 0.0781186890f, -0.0788122482f, -0.2338038630f, -0.3830399929f, -0.5228461462f, -0.6497799862f, -0.7607160866f, -0.8529228980f, + -0.9241300035f, -0.9725840329f, -0.9970918334f, -0.9970498578f, -0.9724590238f, -0.9239246994f, -0.8526417953f, -0.7603653504f, + -0.6493673160f, -0.5223806210f, -0.3825318778f, -0.2332644031f, -0.0782534324f, 0.0786843684f, 0.2336848810f, 0.3829316749f, + 0.5227499799f, 0.6496971643f, 0.7606475046f, 0.8528691455f, 0.9240913688f, 0.9725605024f, 0.9970831041f, 0.9970553461f, + 0.9724778870f, 0.9239558554f, 0.8526839539f, 0.7604170426f, 0.6494269334f, 0.5224464521f, 0.3826021525f, 0.2333373314f, + 0.0783272488f, -0.0786113681f, -0.2336143011f, -0.3828649893f, -0.5226885022f, -0.6496420279f, -0.7605996436f, -0.8528292862f, + -0.9240600225f, -0.9725379675f, -0.9970694696f, -0.9970505028f, -0.9724815391f, -0.9239675382f, -0.8527030511f, -0.7604428078f, + -0.6494585103f, -0.5224828981f, -0.3826424594f, -0.2333804494f, -0.0783721069f, 0.0785658395f, 0.2335691502f, 0.3828212223f, + 0.5226470656f, 0.6496037895f, 0.7605653778f, 0.8527996583f, 0.9240355773f, 0.9725191181f, 0.9970564910f, 0.9970435264f, + 0.9724805522f, 0.9239723853f, 0.8527134405f, 0.7604583197f, 0.6494786105f, 0.5225069525f, 0.3826697534f, 0.2334102074f, + 0.0784035151f, -0.0785336112f, -0.2335369252f, -0.3827897961f, -0.5226171847f, -0.6495761346f, -0.7605405475f, -0.8527781579f, + -0.9240178096f, -0.9725053787f, -0.9970469656f, -0.9970382927f, -0.9724795834f, -0.9239755567f, -0.8527205369f, -0.7604690457f, + -0.6494926000f, -0.5225237804f, -0.3826889457f, -0.2334312532f, -0.0784258768f, 0.0785104868f, 0.2335135965f, 0.3827668158f, + 0.5225950899f, 0.6495554361f, 0.7605217198f, 0.8527616288f, 0.9240039504f, 0.9724944950f, 0.9970392893f, 0.9970339749f, + 0.9724786893f, 0.9239780624f, 0.8527263292f, 0.7604779239f, 0.6495042812f, 0.5225379070f, 0.3827050967f, 0.2334489562f, + 0.0784446231f, -0.0784912259f, -0.2334943534f, -0.3827481104f, -0.5225774136f, -0.6495392378f, -0.7605073937f, -0.8527495050f, + -0.9239942880f, -0.9724874781f, -0.9970350256f, -0.9970324969f, -0.9724799577f, -0.9239819717f, -0.8527327136f, -0.7604865652f, + -0.6495149161f, -0.5225502352f, -0.3827187881f, -0.2334636585f, -0.0784599687f, 0.0784756139f, 0.2334788543f, 0.3827330998f, + 0.5225632570f, 0.6495262837f, 0.7604959669f, 0.8527398987f, 0.9239867563f, 0.9724822286f, 0.9970322117f, +}; + +const float ivas_fb_fr_12band_1ms_im[IVAS_FB_12_1MS_LEN] = +{ + -0.0898684611f, -0.2670421131f, -0.4365041728f, -0.5932908852f, -0.7325431118f, -0.8497696909f, -0.9406026758f, -1.0013422309f, + -1.0229026702f, -0.9881074062f, -0.8887876846f, -0.7310424395f, -0.5284210279f, -0.2997529481f, -0.0664760115f, 0.1499611207f, + 0.3307974571f, 0.4621685196f, 0.5367125342f, 0.5543493827f, 0.5220560680f, 0.4529408018f, 0.3642519877f, 0.2760859332f, + 0.2047354522f, 0.1503391462f, 0.1061445796f, 0.0699189586f, 0.0406773254f, 0.0176462883f, 0.0000989137f, -0.0126721698f, + -0.0213825135f, -0.0267263252f, -0.0293754264f, -0.0299501298f, -0.0290147562f, -0.0270589183f, -0.0244976437f, -0.0216640086f, + -0.0188153473f, -0.0161349368f, -0.0137427038f, -0.0117024055f, -0.0100340803f, -0.0087231409f, -0.0077319011f, -0.0070077840f, + -0.0064920884f, -0.0061256992f, -0.0058543602f, -0.0056314631f, -0.0054200843f, -0.0051933287f, -0.0049340271f, -0.0046335801f, + -0.0042904244f, -0.0039083723f, -0.0034948095f, -0.0030592765f, -0.0026120102f, -0.0021631376f, -0.0017217846f, -0.0012959083f, + -0.0008918976f, -0.0005148542f, -0.0001684643f, 0.0001445255f, 0.0004223858f, 0.0006639324f, 0.0008686856f, 0.0010364896f, + 0.0011677783f, 0.0012632724f, 0.0013243012f, 0.0013525145f, 0.0013501876f, 0.0013198910f, 0.0012647346f, 0.0011879780f, + 0.0010932175f, 0.0009839640f, 0.0008638145f, 0.0007360481f, 0.0006038306f, 0.0004698724f, 0.0003366939f, 0.0002063576f, + 0.0000807864f, -0.0000384546f, -0.0001498232f, -0.0002520137f, -0.0003436527f, -0.0004235485f, -0.0004904478f, -0.0005433364f, + -0.0005812551f, -0.0006036329f, -0.0006101286f, -0.0006009525f, -0.0005766848f, -0.0005385389f, -0.0004881156f, -0.0004275804f, + -0.0003593427f, -0.0002861534f, -0.0002107341f, -0.0001358351f, -0.0000638656f, 0.0000030299f, 0.0000632842f, 0.0001157628f, + 0.0001599820f, 0.0001958747f, 0.0002239118f, 0.0002447961f, 0.0002595218f, 0.0002690444f, 0.0002743352f, 0.0002760865f, + 0.0002748168f, 0.0002706555f, 0.0002635301f, 0.0002530421f, 0.0002387283f, 0.0002200029f, 0.0001964510f, 0.0001677833f, + 0.0001341045f, 0.0000958227f, 0.0000538421f, 0.0000093907f, -0.0000358838f, -0.0000801695f, -0.0001214720f, -0.0001579178f, + -0.0001877626f, -0.0002096837f, -0.0002227536f, -0.0002266623f, -0.0002216081f, -0.0002084174f, -0.0001883368f, -0.0001630566f, + -0.0001344297f, -0.0001044404f, -0.0000749065f, -0.0000474557f, -0.0000232739f, -0.0000031484f, 0.0000126922f, 0.0000244381f, + 0.0000327553f, 0.0000385592f, 0.0000429983f, 0.0000471857f, 0.0000521670f, 0.0000586725f, 0.0000671313f, 0.0000774992f, + 0.0000893598f, 0.0001018532f, 0.0001138697f, 0.0001240625f, 0.0001311002f, 0.0001337149f, 0.0001309532f, 0.0001221967f, + 0.0001073512f, 0.0000867866f, 0.0000614274f, 0.0000325927f, 0.0000019882f, -0.0000285322f, -0.0000570333f, -0.0000817625f, + -0.0001012133f, -0.0001143489f, -0.0001206018f, + 0.0115080962f, 0.0339059662f, 0.0543805639f, 0.0716908215f, 0.0844892131f, 0.0915170903f, 0.0912773099f, 0.0825231458f, + 0.0581340647f, 0.0023722407f, -0.0920729561f, -0.2188408880f, -0.3647527624f, -0.5119701616f, -0.6406838355f, -0.7316665697f, + -0.7689724827f, -0.7420606704f, -0.6473949518f, -0.4890788171f, -0.2786409816f, -0.0338325103f, 0.2232845090f, 0.4688402469f, + 0.6798489622f, 0.8368463063f, 0.9260768759f, 0.9410292369f, 0.8830777791f, 0.7612013021f, 0.5907780504f, 0.3916368742f, + 0.1855876370f, -0.0062576017f, -0.1660331877f, -0.2812632874f, -0.3462706324f, -0.3628576835f, -0.3399405921f, -0.2936025661f, + -0.2446360780f, -0.2029515435f, -0.1662608743f, -0.1331801236f, -0.1036965299f, -0.0778301527f, -0.0556266777f, -0.0370208473f, + -0.0218709516f, -0.0099359945f, -0.0009127909f, 0.0055587915f, 0.0098621029f, 0.0123923627f, 0.0135300104f, 0.0136320444f, + 0.0130144200f, 0.0119494969f, 0.0106574266f, 0.0093099072f, 0.0080287757f, 0.0068943240f, 0.0059483248f, 0.0052043487f, + 0.0046523406f, 0.0042685237f, 0.0040192551f, 0.0038688810f, 0.0037816102f, 0.0037267014f, 0.0036781232f, 0.0036173442f, + 0.0035313060f, 0.0034136237f, 0.0032617350f, 0.0030774362f, 0.0028640174f, 0.0026268424f, 0.0023709699f, 0.0021021154f, + 0.0018248805f, 0.0015440826f, 0.0012634327f, 0.0009870117f, 0.0007181238f, 0.0004606754f, 0.0002179850f, -0.0000060719f, + -0.0002083660f, -0.0003855837f, -0.0005355681f, -0.0006564697f, -0.0007479765f, -0.0008103905f, -0.0008456256f, -0.0008561209f, + -0.0008455816f, -0.0008177548f, -0.0007769991f, -0.0007270455f, -0.0006715492f, -0.0006129898f, -0.0005533521f, -0.0004932746f, + -0.0004329280f, -0.0003714208f, -0.0003078363f, -0.0002408007f, -0.0001695470f, -0.0000934908f, -0.0000131639f, 0.0000703507f, + 0.0001547277f, 0.0002371760f, 0.0003140053f, 0.0003815783f, 0.0004360445f, 0.0004743392f, 0.0004939265f, 0.0004936813f, + 0.0004734847f, 0.0004348607f, 0.0003803348f, 0.0003137905f, 0.0002396098f, 0.0001628232f, 0.0000881507f, 0.0000200989f, + -0.0000379279f, -0.0000834126f, -0.0001153958f, -0.0001340265f, -0.0001409462f, -0.0001385916f, -0.0001303365f, -0.0001196396f, + -0.0001100798f, -0.0001045123f, -0.0001051708f, -0.0001129953f, -0.0001279408f, -0.0001485750f, -0.0001726416f, -0.0001969197f, + -0.0002179800f, -0.0002321940f, -0.0002365365f, -0.0002285757f, -0.0002071506f, -0.0001721838f, -0.0001251084f, -0.0000684218f, + -0.0000058329f, 0.0000584158f, 0.0001195994f, 0.0001732950f, 0.0002154726f, 0.0002432129f, 0.0002546651f, 0.0002495466f, + 0.0002438301f, 0.0007109472f, 0.0011162460f, 0.0013967943f, 0.0014698785f, 0.0012150300f, 0.0004822469f, -0.0009199449f, + -0.0032069948f, -0.0066234807f, -0.0114150534f, -0.0178284637f, -0.0260733522f, -0.0363216183f, -0.0486605071f, -0.0630990061f, + -0.0795130312f, -0.0976712096f, -0.1171685259f, -0.1374957541f, -0.1579441550f, -0.1777994651f, -0.1961712153f, -0.2131191727f, + -0.2256033924f, -0.2176912218f, -0.1719241079f, -0.0821949125f, 0.0489542717f, 0.2117008349f, 0.3903676656f, 0.5654257562f, + 0.7160273175f, 0.8226483779f, 0.8696490849f, 0.8473276976f, 0.7533117569f, 0.5930248684f, 0.3792476318f, 0.1307497118f, + -0.1297731860f, -0.3782729365f, -0.5920556328f, -0.7523549294f, -0.8463947331f, -0.8687564040f, -0.8218173622f, -0.7152833962f, + -0.5647972104f, -0.3898836504f, -0.2113895751f, -0.0488408019f, 0.0820902688f, 0.1715873934f, 0.2171153181f, 0.2247885078f, + 0.2120719043f, 0.1949040588f, 0.1763288922f, 0.1562894837f, 0.1356771490f, 0.1152063262f, 0.0955845402f, 0.0773202283f, + 0.0608172272f, 0.0463072409f, 0.0339148674f, 0.0236334444f, 0.0153777062f, 0.0089786185f, 0.0042273050f, 0.0008767894f, + -0.0013231927f, -0.0026245282f, -0.0032557343f, -0.0034239005f, -0.0032991260f, -0.0030209159f, -0.0026903446f, -0.0023798808f, + -0.0021307088f, -0.0019640207f, -0.0018807705f, -0.0018724257f, -0.0019209336f, -0.0020075151f, -0.0021115303f, -0.0022167724f, + -0.0023088853f, -0.0023794235f, -0.0024222081f, -0.0024359169f, -0.0024201044f, -0.0023771902f, -0.0023088214f, -0.0022179019f, + -0.0021056723f, -0.0019740384f, -0.0018233675f, -0.0016550209f, -0.0014695894f, -0.0012693378f, -0.0010565212f, -0.0008354568f, + -0.0006106656f, -0.0003884494f, -0.0001748112f, 0.0000233719f, 0.0002004956f, 0.0003512145f, 0.0004724032f, 0.0005620267f, + 0.0006206994f, 0.0006502675f, 0.0006548938f, 0.0006393557f, 0.0006097638f, 0.0005717449f, 0.0005310334f, 0.0004917912f, + 0.0004573339f, 0.0004288066f, 0.0004062166f, 0.0003875516f, 0.0003701287f, 0.0003500723f, 0.0003238297f, 0.0002877917f, + 0.0002397329f, 0.0001783203f, 0.0001042514f, 0.0000194643f, -0.0000721397f, -0.0001658244f, -0.0002556635f, -0.0003358859f, + -0.0004006984f, -0.0004456200f, -0.0004672301f, -0.0004642525f, -0.0004370215f, -0.0003881655f, -0.0003217097f, -0.0002433639f, + -0.0001593403f, -0.0000763999f, -0.0000005923f, 0.0000626983f, 0.0001098436f, 0.0001386930f, 0.0001493084f, 0.0001433260f, + 0.0001242838f, 0.0000966497f, 0.0000658480f, 0.0000371218f, 0.0000154755f, 0.0000046144f, 0.0000070450f, 0.0000233058f, + 0.0000523967f, 0.0000914031f, 0.0001362820f, 0.0001818299f, 0.0002227029f, 0.0002535449f, 0.0002700191f, 0.0002688537f, + 0.0002486530f, 0.0002096567f, 0.0001541806f, 0.0000860074f, 0.0000104494f, -0.0000665586f, -0.0001386343f, -0.0001999605f, + -0.0002454664f, -0.0002717048f, -0.0002768116f, -0.0002610555f, -0.0002264389f, -0.0001768539f, -0.0001173333f, -0.0000538987f, + 0.0000073883f, 0.0000606831f, 0.0001012735f, 0.0001257023f, 0.0001324276f, 0.0001216280f, 0.0000954836f, 0.0000576109f, + 0.0000129868f, -0.0000328906f, -0.0000742744f, -0.0001060758f, -0.0001240987f, -0.0001257785f, -0.0001101631f, -0.0000783123f, + -0.0000329127f, 0.0000217021f, 0.0000802673f, 0.0001368394f, 0.0001856737f, 0.0002215380f, 0.0002405175f, 0.0002401550f, + 0.0002199754f, 0.0001812890f, 0.0001273345f, 0.0000627166f, -0.0000067866f, -0.0000750345f, -0.0001358771f, + -0.0002517773f, -0.0007530438f, -0.0012480393f, -0.0017311495f, -0.0021966783f, -0.0026372659f, -0.0030463219f, -0.0034173391f, + -0.0037471961f, -0.0040359970f, -0.0042905892f, -0.0045239611f, -0.0047578551f, -0.0050204690f, -0.0053469980f, -0.0057745962f, + -0.0063401820f, -0.0070723578f, -0.0079867916f, -0.0090758990f, -0.0103033224f, -0.0115933185f, -0.0128269170f, -0.0138337134f, + -0.0143928060f, -0.0142296836f, -0.0130247299f, -0.0104168701f, -0.0060212390f, 0.0005608679f, 0.0097154142f, 0.0218030935f, + 0.0371260945f, 0.0559219991f, 0.0783277405f, 0.1044019092f, 0.1340918009f, 0.1673695867f, 0.2042412889f, 0.2460845096f, + 0.2951830943f, 0.3416235468f, 0.3646126368f, 0.3480671745f, 0.2830729765f, 0.1678292828f, 0.0080159731f, -0.1838899497f, + -0.3900215384f, -0.5892675140f, -0.7598185700f, -0.8818480868f, -0.9399786297f, -0.9252325823f, -0.8362335185f, -0.6794898766f, + -0.4687496028f, -0.2234686369f, 0.0333794198f, 0.2779351658f, 0.4881469775f, 0.6462666955f, 0.7407620319f, 0.7675102118f, + 0.7300140555f, 0.6387574230f, 0.5096096451f, 0.3616936194f, 0.2146955649f, 0.0863068159f, -0.0104489874f, -0.0693762132f, + -0.0979362074f, -0.1120025953f, -0.1187847101f, -0.1195709435f, -0.1158142700f, -0.1086494413f, -0.0991759892f, -0.0882830476f, + -0.0767682730f, -0.0652504848f, -0.0542380863f, -0.0440837698f, -0.0350361951f, -0.0272194074f, -0.0206775342f, -0.0153683003f, + -0.0112022098f, -0.0080423433f, -0.0057368530f, -0.0041194819f, -0.0030341283f, -0.0023328322f, -0.0018922260f, -0.0016079045f, + -0.0014038691f, -0.0012238901f, -0.0010359885f, -0.0008223621f, -0.0005812568f, -0.0003172104f, -0.0000423446f, 0.0002317528f, + 0.0004920317f, 0.0007298898f, 0.0009380570f, 0.0011144792f, 0.0012583706f, 0.0013727541f, 0.0014603320f, 0.0015255024f, + 0.0015706934f, 0.0015984889f, 0.0016087944f, 0.0016013362f, 0.0015736524f, 0.0015238602f, 0.0014491647f, 0.0013485610f, + 0.0012214393f, 0.0010698662f, 0.0008969515f, 0.0007085113f, 0.0005110819f, 0.0003130098f, 0.0001222403f, -0.0000529128f, + -0.0002059168f, -0.0003312324f, -0.0004261003f, -0.0004894620f, -0.0005232055f, -0.0005306961f, -0.0005175051f, -0.0004896578f, + -0.0004540531f, -0.0004166844f, -0.0003830510f, -0.0003566394f, -0.0003395923f, -0.0003316443f, -0.0003311733f, -0.0003346124f, + -0.0003378214f, -0.0003358194f, -0.0003242611f, -0.0002992259f, -0.0002585275f, -0.0002012956f, -0.0001289055f, -0.0000441984f, + 0.0000480368f, 0.0001421911f, 0.0002316974f, 0.0003103339f, 0.0003721995f, 0.0004129378f, 0.0004295640f, 0.0004213762f, + 0.0003894462f, 0.0003371019f, 0.0002690431f, 0.0001914421f, 0.0001108048f, 0.0000338794f, -0.0000335063f, -0.0000864746f, + -0.0001220386f, -0.0001388528f, -0.0001377697f, -0.0001212160f, -0.0000933503f, -0.0000591266f, -0.0000241894f, 0.0000061837f, + 0.0000272190f, 0.0000355810f, 0.0000293086f, 0.0000084300f, -0.0000254463f, -0.0000689080f, -0.0001174917f, -0.0001657726f, + -0.0002083169f, -0.0002398873f, -0.0002563684f, -0.0002548515f, -0.0002343135f, -0.0001953996f, -0.0001407304f, -0.0000743265f, + -0.0000015627f, 0.0000716768f, 0.0001392424f, 0.0001956345f, 0.0002362192f, 0.0002579841f, 0.0002595163f, 0.0002414285f, + -0.0000940837f, -0.0002770282f, -0.0004449239f, -0.0005888728f, -0.0007019644f, -0.0007792340f, -0.0008182743f, -0.0008186617f, + -0.0007820794f, -0.0007112881f, -0.0006099783f, -0.0004815832f, -0.0003292359f, -0.0001547948f, 0.0000407443f, 0.0002577725f, + 0.0004970701f, 0.0007599305f, 0.0010467681f, 0.0013572172f, 0.0016888066f, 0.0020376007f, 0.0023974682f, 0.0027617602f, + 0.0031234670f, 0.0034780578f, 0.0038243130f, 0.0041678751f, 0.0045219223f, 0.0049104098f, 0.0053672600f, 0.0059379719f, + 0.0066758931f, 0.0076410668f, 0.0088925844f, 0.0104843046f, 0.0124532460f, 0.0148130444f, 0.0175396030f, 0.0205645423f, + 0.0237604835f, 0.0269378529f, 0.0298327415f, 0.0321108152f, 0.0333602127f, 0.0331056565f, 0.0308069668f, 0.0258845713f, + 0.0177205355f, 0.0056930577f, -0.0108298743f, -0.0324583065f, -0.0598208742f, -0.0935922245f, -0.1346769337f, -0.1852485101f, + -0.2520452044f, -0.3349618030f, -0.4178137014f, -0.4806851731f, -0.5066093847f, -0.4828480682f, -0.4029110854f, -0.2674540766f, + -0.0845343107f, 0.1312173509f, 0.3601564597f, 0.5799075204f, 0.7679640489f, 0.9043772480f, 0.9741394604f, 0.9690106520f, + 0.8885379519f, 0.7401510478f, 0.5383256422f, 0.3028982916f, 0.0567716151f, -0.1767567296f, -0.3766491619f, -0.5265275449f, + -0.6164139497f, -0.6437430944f, -0.6133407543f, -0.5366180838f, -0.4297512054f, -0.3115454630f, -0.2005356394f, -0.1128598350f, + -0.0539105809f, -0.0139443690f, 0.0156565191f, 0.0370291041f, 0.0516278850f, 0.0605689917f, 0.0649188950f, 0.0656033918f, + 0.0635061831f, 0.0593951272f, 0.0539682831f, 0.0478045414f, 0.0413946012f, 0.0351122976f, 0.0292427409f, 0.0239693774f, + 0.0194022319f, 0.0155752485f, 0.0124736580f, 0.0100363326f, 0.0081800382f, 0.0068024870f, 0.0058015196f, 0.0050760480f, + 0.0045392915f, 0.0041164842f, 0.0037525515f, 0.0034068962f, 0.0030568884f, 0.0026909558f, 0.0023097105f, 0.0019188491f, + 0.0015296237f, 0.0011527869f, 0.0007995822f, 0.0004773732f, 0.0001916221f, -0.0000568089f, -0.0002688493f, -0.0004487434f, + -0.0006009421f, -0.0007311394f, -0.0008434559f, -0.0009415801f, -0.0010266406f, -0.0010987560f, -0.0011556747f, -0.0011947058f, + -0.0012119146f, -0.0012041634f, -0.0011684945f, -0.0011039351f, -0.0010107180f, -0.0008915962f, -0.0007507109f, -0.0005943565f, + -0.0004295220f, -0.0002642519f, -0.0001060642f, 0.0000378186f, 0.0001618981f, 0.0002620189f, 0.0003364193f, 0.0003850258f, + 0.0004100438f, 0.0004149209f, 0.0004045652f, 0.0003841255f, 0.0003590482f, 0.0003339070f, 0.0003125425f, 0.0002971555f, + 0.0002887091f, 0.0002863958f, 0.0002883494f, 0.0002914552f, 0.0002922766f, 0.0002870530f, 0.0002726535f, 0.0002465517f, + 0.0002076047f, 0.0001558242f, 0.0000928493f, 0.0000214333f, -0.0000544032f, -0.0001301223f, -0.0002007286f, -0.0002616070f, + -0.0003086144f, -0.0003388183f, -0.0003504396f, -0.0003433413f, -0.0003187137f, -0.0002792588f, -0.0002286183f, -0.0001713141f, + -0.0001120267f, -0.0000554389f, + -0.0001958521f, -0.0002037772f, -0.0001928163f, -0.0001589424f, -0.0001002894f, -0.0000163380f, 0.0000907887f, 0.0002175831f, + 0.0003582211f, 0.0005062409f, 0.0006538405f, 0.0007937851f, 0.0009186699f, 0.0010227885f, 0.0011010838f, 0.0011507705f, + 0.0011698159f, 0.0011582816f, 0.0011163741f, 0.0010456753f, 0.0009469803f, 0.0008217234f, 0.0006698794f, 0.0004918730f, + 0.0002867091f, 0.0000544686f, -0.0002054280f, -0.0004913183f, -0.0008012958f, -0.0011303304f, -0.0014731078f, -0.0018216574f, + -0.0021695528f, -0.0025102922f, -0.0028430159f, -0.0031713537f, -0.0035102261f, -0.0038841898f, -0.0043342737f, -0.0049142608f, + -0.0056961483f, -0.0067625723f, -0.0082096287f, -0.0101339707f, -0.0126325271f, -0.0157836972f, -0.0196448900f, -0.0242284914f, + -0.0294998526f, -0.0353498489f, -0.0415975524f, -0.0479616035f, -0.0540728812f, -0.0594457699f, -0.0635064362f, -0.0655612395f, + -0.0648457799f, -0.0604784184f, -0.0515339488f, -0.0369448838f, -0.0155927126f, 0.0139806398f, 0.0539164770f, 0.1128370459f, + 0.2004901808f, 0.3114870438f, 0.4296920027f, 0.5365714345f, 0.6133195725f, 0.6437584042f, 0.6164735032f, 0.5266348467f, + 0.3768028330f, 0.1769504498f, -0.0565487403f, -0.3026608074f, -0.5380905144f, -0.7399360850f, -0.8883601949f, -0.9688847331f, + -0.9740762507f, -0.9043827765f, -0.7680389511f, -0.5800469251f, -0.3603504723f, -0.1314519403f, 0.0842759659f, 0.2671900601f, + 0.4026590428f, 0.4826236485f, 0.5064248335f, 0.4805483640f, 0.4177275519f, 0.3349242893f, 0.2520497692f, 0.1852850777f, + 0.1347332064f, 0.0936551449f, 0.0598782099f, 0.0325001596f, 0.0108498369f, -0.0056970597f, -0.0177459594f, -0.0259244265f, + -0.0308505634f, -0.0331397240f, -0.0333704132f, -0.0320833599f, -0.0297560793f, -0.0268041178f, -0.0235666816f, -0.0203132117f, + -0.0172390062f, -0.0144767230f, -0.0120991121f, -0.0101332076f, -0.0085666335f, -0.0073617255f, -0.0064621794f, -0.0058047936f, + -0.0053242015f, -0.0049609363f, -0.0046632383f, -0.0043912873f, -0.0041162231f, -0.0038213107f, -0.0034990867f, -0.0031507115f, + -0.0027824416f, -0.0024044438f, -0.0020276438f, -0.0016629392f, -0.0013190459f, -0.0010025416f, -0.0007168319f, -0.0004629763f, + -0.0002395008f, -0.0000436500f, 0.0001284164f, 0.0002803877f, 0.0004156585f, 0.0005364447f, 0.0006439523f, 0.0007379710f, + 0.0008173893f, 0.0008801810f, 0.0009241189f, 0.0009469386f, 0.0009470262f, 0.0009235256f, 0.0008768074f, 0.0008083660f, + 0.0007209842f, 0.0006183917f, 0.0005051683f, 0.0003862499f, 0.0002667034f, 0.0001512287f, 0.0000439630f, -0.0000518813f, + -0.0001340642f, -0.0002014693f, -0.0002539655f, -0.0002923568f, -0.0003181036f, -0.0003331509f, -0.0003396076f, -0.0003395633f, + -0.0003348303f, -0.0003268422f, -0.0003165265f, -0.0003043290f, -0.0002902270f, -0.0002738620f, -0.0002546506f, -0.0002319638f, + -0.0002052612f, -0.0001742433f, -0.0001389381f, -0.0000997698f, -0.0000575586f, -0.0000134887f, 0.0000309765f, 0.0000742026f, + 0.0001145147f, 0.0001503321f, 0.0001802885f, + -0.0001277341f, -0.0000801832f, -0.0000218515f, 0.0000429946f, 0.0001101725f, 0.0001753791f, 0.0002352234f, 0.0002868790f, + 0.0003289280f, 0.0003607437f, 0.0003830779f, 0.0003971613f, 0.0004050891f, 0.0004087434f, 0.0004101314f, 0.0004103021f, + 0.0004098229f, 0.0004078547f, 0.0004029032f, 0.0003921299f, 0.0003724071f, 0.0003398196f, 0.0002909307f, 0.0002223256f, + 0.0001319189f, 0.0000183492f, -0.0001178379f, -0.0002750908f, -0.0004498764f, -0.0006379165f, -0.0008333771f, -0.0010303574f, + -0.0012220954f, -0.0014025519f, -0.0015654459f, -0.0017057905f, -0.0018186276f, -0.0019004727f, -0.0019477420f, -0.0019582025f, + -0.0019292104f, -0.0018593672f, -0.0017467341f, -0.0015908909f, -0.0013912094f, -0.0011493707f, -0.0008675713f, -0.0005513213f, + -0.0002071950f, 0.0001544857f, 0.0005229288f, 0.0008847642f, 0.0012288921f, 0.0015452051f, 0.0018312322f, 0.0020914322f, + 0.0023452820f, 0.0026261558f, 0.0029898311f, 0.0035112352f, 0.0042918405f, 0.0054520943f, 0.0071361390f, 0.0094977907f, + 0.0127016847f, 0.0169013256f, 0.0222371991f, 0.0288065364f, 0.0366610177f, 0.0457690119f, 0.0560179682f, 0.0671701450f, + 0.0788774558f, 0.0906296100f, 0.1017925366f, 0.1115401869f, 0.1189349031f, 0.1228106313f, 0.1219422410f, 0.1147682442f, + 0.0998698743f, 0.0698963887f, 0.0088203751f, -0.0909692208f, -0.2234220627f, -0.3756331554f, -0.5300042260f, -0.6668887743f, + -0.7671574389f, -0.8148547416f, -0.7993524069f, -0.7169019655f, -0.5713321080f, -0.3737662567f, -0.1415729584f, 0.1036716588f, + 0.3378392047f, 0.5399814296f, 0.7022792290f, 0.8235847390f, 0.9011912110f, 0.9335195531f, 0.9210148943f, 0.8662582998f, + 0.7738442006f, 0.6501373474f, 0.5028823140f, 0.3407552797f, 0.1728427401f, 0.0081212390f, -0.1450610431f, -0.2794406314f, + -0.3892283922f, -0.4703883896f, -0.5208081709f, -0.5403348331f, -0.5306924278f, -0.4952731730f, -0.4388331926f, -0.3670992988f, + -0.2863302758f, -0.2028454693f, -0.1225716070f, -0.0506164333f, 0.0090788383f, 0.0540159375f, 0.0833026194f, 0.0977385677f, + 0.0999946466f, 0.0952552716f, 0.0880995668f, 0.0797728807f, 0.0706660863f, 0.0613242080f, 0.0521689821f, 0.0435466445f, + 0.0356893133f, 0.0287479136f, 0.0227869173f, 0.0178107854f, 0.0137689980f, 0.0105778434f, 0.0081277168f, 0.0062997686f, + 0.0049716376f, 0.0040285807f, 0.0033660981f, 0.0028959547f, 0.0025456890f, 0.0022606635f, 0.0020013537f, 0.0017429261f, + 0.0014715303f, 0.0011828460f, 0.0008784722f, 0.0005645174f, 0.0002487848f, -0.0000600208f, -0.0003540749f, -0.0006264965f, + -0.0008722305f, -0.0010875779f, -0.0012705059f, -0.0014199592f, -0.0015359444f, -0.0016188954f, -0.0016697727f, -0.0016896254f, + -0.0016797991f, -0.0016416978f, -0.0015770686f, -0.0014878777f, -0.0013765796f, -0.0012459990f, -0.0010995021f, -0.0009408124f, + -0.0007740525f, -0.0006034858f, -0.0004334565f, -0.0002681040f, -0.0001112695f, 0.0000337496f, 0.0001642534f, 0.0002782887f, + 0.0003746198f, 0.0004527614f, 0.0005128644f, 0.0005556551f, 0.0005822707f, 0.0005941545f, 0.0005928931f, 0.0005801213f, + 0.0005574074f, 0.0005262036f, 0.0004878004f, 0.0004433324f, 0.0003937929f, 0.0003400774f, 0.0002830311f, 0.0002234973f, + 0.0001623637f, 0.0001005861f, 0.0000392083f, -0.0000206541f, -0.0000778269f, -0.0001311308f, -0.0001794168f, -0.0002216378f, + -0.0002568858f, -0.0002844591f, -0.0003038790f, -0.0003149350f, -0.0003176698f, -0.0003123947f, -0.0002996434f, -0.0002801639f, + -0.0002548507f, -0.0002247269f, -0.0001908697f, -0.0001543953f, -0.0001163917f, -0.0000779152f, -0.0000399357f, + 0.0000094413f, 0.0000277999f, 0.0000446903f, 0.0000593280f, 0.0000712651f, 0.0000803871f, 0.0000870097f, 0.0000917822f, + 0.0000956902f, 0.0000998716f, 0.0001055506f, 0.0001138098f, 0.0001255136f, 0.0001411003f, 0.0001605589f, 0.0001832996f, + 0.0002082298f, 0.0002337307f, 0.0002578403f, 0.0002783202f, 0.0002929118f, 0.0002994416f, 0.0002960857f, 0.0002814451f, + 0.0002547522f, 0.0002158569f, 0.0001653321f, 0.0001043455f, 0.0000346623f, -0.0000415774f, -0.0001219205f, -0.0002038633f, + -0.0002849129f, -0.0003628240f, -0.0004355962f, -0.0005016356f, -0.0005596549f, -0.0006087461f, -0.0006481918f, -0.0006774810f, + -0.0006960781f, -0.0007034418f, -0.0006988166f, -0.0006813178f, -0.0006497978f, -0.0006030351f, -0.0005396896f, -0.0004585888f, + -0.0003587409f, -0.0002396693f, -0.0001014165f, 0.0000551454f, 0.0002283928f, 0.0004157251f, 0.0006137740f, 0.0008182856f, + 0.0010244618f, 0.0012269217f, 0.0014201288f, 0.0015983649f, 0.0017561723f, 0.0018882664f, 0.0019899370f, 0.0020568553f, + 0.0020854261f, 0.0020725003f, 0.0020157272f, 0.0019132331f, 0.0017640560f, 0.0015678593f, 0.0013255131f, 0.0010388553f, + 0.0007114008f, 0.0003480516f, -0.0000442075f, -0.0004568793f, -0.0008795218f, -0.0013009102f, -0.0017091380f, -0.0020936476f, + -0.0024460089f, -0.0027628964f, -0.0030473913f, -0.0033126371f, -0.0035830824f, -0.0038981281f, -0.0043122790f, -0.0048977534f, + -0.0057421929f, -0.0069491136f, -0.0086317888f, -0.0109107455f, -0.0139027684f, -0.0177154927f, -0.0224311200f, -0.0280995831f, + -0.0347172313f, -0.0422222045f, -0.0504683384f, -0.0592304787f, -0.0681714904f, -0.0768802892f, -0.0848233610f, -0.0916208280f, + -0.0960365098f, -0.0934965965f, -0.0788165513f, -0.0493177686f, -0.0041840764f, 0.0557190363f, 0.1279300009f, 0.2085541449f, + 0.2925373176f, 0.3740109184f, 0.4467123250f, 0.5044329150f, 0.5414803943f, 0.5531103895f, 0.5359083733f, 0.4880865671f, + 0.4096810759f, 0.3026295623f, 0.1707255672f, 0.0194488912f, -0.1443186247f, -0.3126736143f, -0.4771477585f, -0.6292070969f, + -0.7607694851f, -0.8646983027f, -0.9352529748f, -0.9684532025f, -0.9623535812f, -0.9171949326f, -0.8354559290f, -0.7219447724f, + -0.5842261616f, -0.4299994224f, -0.2647671304f, -0.0936718584f, 0.0778573928f, 0.2444955397f, 0.4011508179f, 0.5431562386f, + 0.6663917866f, 0.7674190691f, 0.8435687444f, 0.8930187210f, 0.9148305827f, 0.9089668951f, 0.8762704359f, 0.8184215785f, + 0.7378630625f, 0.6377054994f, 0.5216082533f, 0.3936475943f, 0.2581703422f, 0.1196438490f, -0.0174973196f, -0.1489983380f, + -0.2709234334f, -0.3797794589f, -0.4726225629f, -0.5471418581f, -0.6017198326f, -0.6354657299f, -0.6482230521f, -0.6405498448f, + -0.6136745009f, -0.5694280123f, -0.5101568311f, -0.4386191067f, -0.3578694342f, -0.2711360702f, -0.1816960690f, -0.0927527129f, + -0.0073202620f, 0.0718799659f, 0.1425082935f, 0.2026771758f, 0.2510012829f, 0.2866256582f, 0.3092317499f, 0.3190214225f, + 0.3166807736f, 0.3033253264f, 0.2804301957f, 0.2497478163f, 0.2132181238f, 0.1728741342f, 0.1307484916f, 0.0887835046f, + 0.0487503059f, 0.0121784205f, -0.0196990379f, -0.0459852335f, -0.0661399413f, -0.0799836583f, -0.0876812985f, -0.0897120098f, + -0.0868204670f, -0.0799602374f, -0.0702221831f, -0.0587644272f, -0.0467300423f, -0.0351807009f, -0.0250131586f, -0.0169220452f, + -0.0110491061f, -0.0067999510f, -0.0036452141f, -0.0013776515f, 0.0001725658f, 0.0011515063f, 0.0016931166f, 0.0019128947f, + 0.0019119195f, 0.0017731008f, 0.0015641080f, 0.0013360166f, 0.0011263428f, 0.0009592385f, 0.0008486058f, 0.0007990396f, + 0.0008087142f, 0.0008704662f, 0.0009741845f, 0.0011076612f, 0.0012583569f, 0.0014138649f, 0.0015630668f, 0.0016962130f, + 0.0018055792f, 0.0018852562f, 0.0019314544f, 0.0019421196f, 0.0019170260f, 0.0018573192f, 0.0017655022f, 0.0016449753f, + 0.0014999823f, 0.0013351861f, 0.0011556142f, 0.0009662892f, 0.0007721962f, 0.0005779798f, 0.0003879485f, 0.0002058452f, + 0.0000348998f, -0.0001223239f, -0.0002638249f, -0.0003882481f, -0.0004947379f, -0.0005829688f, -0.0006529761f, -0.0007051597f, + -0.0007401195f, -0.0007586609f, -0.0007616586f, -0.0007500873f, -0.0007249274f, -0.0006872277f, -0.0006380521f, -0.0005785652f, + -0.0005100019f, -0.0004337551f, -0.0003513433f, -0.0002644761f, -0.0001749961f, -0.0000849056f, 0.0000037265f, 0.0000887799f, + 0.0001682047f, 0.0002400620f, 0.0003026539f, 0.0003545629f, 0.0003947614f, 0.0004226221f, 0.0004379830f, 0.0004411096f, + 0.0004327050f, 0.0004138228f, 0.0003858290f, 0.0003502817f, 0.0003088683f, 0.0002632783f, 0.0002151470f, 0.0001659510f, + 0.0001169830f, 0.0000692900f, 0.0000236931f, -0.0000192281f, -0.0000590766f, -0.0000956193f, -0.0001287082f, -0.0001582520f, + -0.0001841434f, -0.0002062459f, -0.0002243482f, -0.0002381838f, -0.0002474218f, -0.0002517193f, -0.0002507430f, -0.0002442414f, + -0.0002320758f, -0.0002142901f, -0.0001911276f, -0.0001630744f, -0.0001308436f, -0.0000953784f, -0.0000577970f, -0.0000193582f, + 0.0000186239f, 0.0000548367f, 0.0000880630f, 0.0001172340f, 0.0001415074f, 0.0001602936f, 0.0001732965f, 0.0001804997f, + 0.0001821637f, 0.0001787723f, 0.0001709948f, 0.0001596078f, 0.0001454431f, 0.0001293085f, 0.0001119454f, 0.0000939706f, + 0.0000758637f, 0.0000579434f, 0.0000403900f, 0.0000232563f, 0.0000065182f, -0.0000098944f, -0.0000260374f, -0.0000419222f, + -0.0000574677f, -0.0000724909f, -0.0000866869f, -0.0000996508f, -0.0001108899f, -0.0001198747f, -0.0001260737f, -0.0001290184f, + -0.0001283426f, -0.0001238392f, -0.0001154831f, -0.0001034619f, -0.0000881663f, -0.0000701856f, -0.0000502629f, + 0.0000100257f, 0.0000298715f, 0.0000491016f, 0.0000673457f, 0.0000842719f, 0.0000996175f, 0.0001131774f, 0.0001248226f, + 0.0001344760f, 0.0001421200f, 0.0001477626f, 0.0001514384f, 0.0001531732f, 0.0001529862f, 0.0001508606f, 0.0001467558f, + 0.0001405885f, 0.0001322589f, 0.0001216448f, 0.0001086385f, 0.0000931503f, 0.0000751504f, 0.0000546725f, 0.0000318520f, + 0.0000069213f, -0.0000197639f, -0.0000477443f, -0.0000764464f, -0.0001052188f, -0.0001333354f, -0.0001600439f, -0.0001845767f, + -0.0002062035f, -0.0002242408f, -0.0002380992f, -0.0002472837f, -0.0002514295f, -0.0002502882f, -0.0002437508f, -0.0002318205f, + -0.0002146257f, -0.0001923855f, -0.0001654183f, -0.0001341069f, -0.0000989108f, -0.0000603353f, -0.0000189514f, 0.0000246284f, + 0.0000697235f, 0.0001156056f, 0.0001614708f, 0.0002064618f, 0.0002496452f, 0.0002900437f, 0.0003266238f, 0.0003583420f, + 0.0003841453f, 0.0004030314f, 0.0004140579f, 0.0004164107f, 0.0004094151f, 0.0003926023f, 0.0003657128f, 0.0003287519f, + 0.0002819762f, 0.0002259319f, 0.0001614203f, 0.0000895170f, 0.0000115172f, -0.0000710597f, -0.0001565398f, -0.0002430985f, + -0.0003288369f, -0.0004117862f, -0.0004899853f, -0.0005614798f, -0.0006243974f, -0.0006769402f, -0.0007174577f, -0.0007444335f, + -0.0007565586f, -0.0007527147f, -0.0007320491f, -0.0006939555f, -0.0006381507f, -0.0005646499f, -0.0004738416f, -0.0003664521f, + -0.0002436140f, -0.0001068131f, 0.0000420546f, 0.0002007573f, 0.0003666837f, 0.0005369393f, 0.0007083151f, 0.0008774032f, + 0.0010405725f, 0.0011941030f, 0.0013341657f, 0.0014569762f, 0.0015587822f, 0.0016360436f, 0.0016854353f, 0.0017040651f, + 0.0016895002f, 0.0016400311f, 0.0015547178f, 0.0014336912f, 0.0012781928f, 0.0010908735f, 0.0008757648f, 0.0006385002f, + 0.0003861185f, 0.0001271046f, -0.0001290952f, -0.0003723192f, -0.0005925672f, -0.0007805994f, -0.0009292471f, -0.0010343329f, + -0.0010963449f, -0.0011215032f, -0.0011235784f, -0.0011247650f, -0.0011572825f, -0.0012635736f, -0.0014972500f, -0.0019220776f, + -0.0026119000f, -0.0036479956f, -0.0051179657f, -0.0071115979f, -0.0097197636f, -0.0130315445f, -0.0171388264f, -0.0221826026f, + -0.0285136326f, -0.0361307186f, -0.0442081981f, -0.0516559897f, -0.0573925315f, -0.0603652434f, -0.0596331395f, -0.0544264019f, + -0.0442109616f, -0.0287331963f, -0.0080564058f, 0.0174234593f, 0.0469759993f, 0.0795551974f, 0.1138332879f, 0.1482526191f, + 0.1810898747f, 0.2105329869f, 0.2347647762f, 0.2520519356f, 0.2608332916f, 0.2598051239f, 0.2479978629f, 0.2248419603f, + 0.1902182120f, 0.1444910892f, 0.0885218306f, 0.0236611727f, -0.0482797215f, -0.1250786276f, -0.2041714722f, -0.2827382419f, + -0.3578034522f, -0.4263466673f, -0.4854197016f, -0.5322651608f, -0.5644323798f, -0.5798852692f, -0.5770983111f, -0.5551358084f, + -0.5137115562f, -0.4532252989f, -0.3747746885f, -0.2801408533f, -0.1717482321f, -0.0525987506f, 0.0738169580f, 0.2036293318f, + 0.3327161135f, 0.4568415935f, 0.5718029559f, 0.6735794476f, 0.7584777874f, 0.8232695197f, 0.8653138344f, 0.8826624233f, + 0.8741407389f, 0.8394039127f, 0.7789631089f, 0.6941829200f, 0.5872472518f, 0.4610970982f, 0.3193391719f, 0.1661318331f, + 0.0060481020f, -0.1560745385f, -0.3152984295f, -0.4667504424f, -0.6057916885f, -0.7281716821f, -0.8301830623f, -0.9087761258f, + -0.9618416393f, -0.9883769508f, -0.9880544909f, -0.9610885174f, -0.9083986381f, -0.8315930415f, -0.7329302137f, -0.6152510066f, + -0.4818998000f, -0.3366264325f, -0.1834804423f, -0.0266942820f, 0.1294357761f, 0.2806718111f, 0.4229523505f, 0.5525059678f, + 0.6659544948f, 0.7604051258f, 0.8335268161f, 0.8836105772f, 0.9096104660f, 0.9111656060f, 0.8886015017f, 0.8429119395f, + 0.7757211639f, 0.6892286142f, 0.5861371807f, 0.4695681223f, 0.3429645973f, 0.2099875350f, 0.0744064202f, -0.0600110582f, + -0.1896077300f, -0.3109402608f, -0.4208745383f, -0.5166699060f, -0.5960503378f, -0.6572602031f, -0.6991036150f, -0.7209660923f, + -0.7228185799f, -0.7052037113f, -0.6692054230f, -0.6164028870f, -0.5488108092f, -0.4688079424f, -0.3790565546f, -0.2824152817f, + -0.1818484683f, -0.0803346471f, 0.0192227465f, 0.1140799262f, 0.2017298411f, 0.2799697880f, 0.3469574836f, 0.4012543426f, + 0.4418547649f, 0.4682010863f, 0.4801839581f, 0.4781287434f, 0.4627686220f, 0.4352058330f, 0.3968625180f, 0.3494232322f, + 0.2947711136f, 0.2349201359f, 0.1719456583f, 0.1079157418f, 0.0448253472f, -0.0154643795f, -0.0712800080f, -0.1211812328f, + -0.1639966775f, -0.1988491244f, -0.2251698043f, -0.2427015611f, -0.2514912990f, -0.2518722833f, -0.2444373910f, -0.2300045092f, + -0.2095756919f, -0.1842916891f, -0.1553837364f, -0.1241243795f, -0.0917792284f, -0.0595613097f, -0.0285896618f, 0.0001465056f, + 0.0258169100f, 0.0477717562f, 0.0655551910f, 0.0789104778f, 0.0877769862f, 0.0922794468f, 0.0927101873f, 0.0895053265f, + 0.0832161440f, 0.0744769454f, 0.0639709607f, 0.0523956967f, 0.0404293889f, 0.0286998006f, 0.0177569270f, 0.0080503829f, + -0.0000871632f, -0.0064505432f, -0.0109653717f, -0.0136854786f, -0.0147827090f, -0.0145338644f, -0.0132999155f, -0.0115279496f, + -0.0097143162f, -0.0081066262f, -0.0066892166f, -0.0054526910f, -0.0044043619f, -0.0035430638f, -0.0028610848f, -0.0023435648f, + -0.0019710460f, -0.0017207440f, -0.0015686177f, -0.0014906099f, -0.0014640505f, -0.0014684367f, -0.0014861739f, -0.0015028429f, + -0.0015073922f, -0.0014919944f, -0.0014518622f, -0.0013848537f, -0.0012910935f, -0.0011724856f, -0.0010322928f, -0.0008746803f, + -0.0007043572f, -0.0005262236f, -0.0003451249f, -0.0001656257f, 0.0000081168f, 0.0001724644f, 0.0003243294f, 0.0004612043f, + 0.0005811330f, 0.0006826956f, 0.0007649539f, 0.0008274212f, 0.0008700054f, 0.0008929815f, 0.0008969444f, 0.0008827894f, + 0.0008516741f, 0.0008050045f, 0.0007444000f, 0.0006716783f, 0.0005888158f, 0.0004979255f, 0.0004012090f, 0.0003009243f, + 0.0001993306f, 0.0000986487f, 0.0000010025f, -0.0000916200f, -0.0001774214f, -0.0002548259f, -0.0003225212f, -0.0003794749f, + -0.0004249577f, -0.0004585414f, -0.0004801021f, -0.0004897991f, -0.0004880609f, -0.0004755490f, -0.0004531324f, -0.0004218435f, + -0.0003828474f, -0.0003373970f, -0.0002868049f, -0.0002324032f, -0.0001755218f, -0.0001174565f, -0.0000594555f, -0.0000026960f, + 0.0000517227f, 0.0001027959f, 0.0001496166f, 0.0001913889f, 0.0002274293f, 0.0002571799f, 0.0002802094f, 0.0002962259f, + 0.0003050777f, 0.0003067640f, 0.0003014323f, 0.0002893851f, 0.0002710700f, 0.0002470789f, 0.0002181291f, 0.0001850528f, + 0.0001487686f, 0.0001102623f, 0.0000705516f, 0.0000306614f, -0.0000084134f, -0.0000457325f, -0.0000804436f, -0.0001118002f, + -0.0001391858f, -0.0001621210f, -0.0001802753f, -0.0001934613f, -0.0002016344f, -0.0002048759f, -0.0002033834f, -0.0001974478f, + -0.0001874396f, -0.0001737844f, -0.0001569508f, -0.0001374298f, -0.0001157277f, -0.0000923513f, -0.0000678073f, -0.0000425930f, + -0.0000172000f, 0.0000078915f, 0.0000322093f, 0.0000552949f, 0.0000767028f, 0.0000960105f, 0.0001128219f, 0.0001267820f, + 0.0001375845f, 0.0001449888f, 0.0001488284f, 0.0001490265f, 0.0001456006f, 0.0001386719f, 0.0001284619f, 0.0001152928f, + 0.0000995735f, 0.0000817902f, 0.0000624834f, 0.0000422315f, 0.0000216225f, 0.0000012352f, -0.0000183878f, -0.0000367552f, + 0.0001023410f, 0.0001121154f, 0.0001195973f, 0.0001245785f, 0.0001269032f, 0.0001264687f, 0.0001232335f, 0.0001172154f, + 0.0001084967f, 0.0000972190f, 0.0000835860f, 0.0000678549f, 0.0000503359f, 0.0000313814f, 0.0000113831f, -0.0000092410f, + -0.0000300509f, -0.0000505985f, -0.0000704325f, -0.0000891123f, -0.0001062126f, -0.0001213366f, -0.0001341197f, -0.0001442414f, + -0.0001514272f, -0.0001554600f, -0.0001561797f, -0.0001534931f, -0.0001473717f, -0.0001378600f, -0.0001250712f, -0.0001091929f, + -0.0000904812f, -0.0000692631f, -0.0000459277f, -0.0000209260f, 0.0000052416f, 0.0000320286f, 0.0000588582f, 0.0000851296f, + 0.0001102367f, 0.0001335760f, 0.0001545675f, 0.0001726629f, 0.0001873663f, 0.0001982416f, 0.0002049310f, 0.0002071594f, + 0.0002047497f, 0.0001976225f, 0.0001858068f, 0.0001694347f, 0.0001487471f, 0.0001240832f, 0.0000958818f, 0.0000646662f, + 0.0000310422f, -0.0000043212f, -0.0000406957f, -0.0000773156f, -0.0001133832f, -0.0001480928f, -0.0001806368f, -0.0002102303f, + -0.0002361185f, -0.0002576013f, -0.0002740408f, -0.0002848864f, -0.0002896805f, -0.0002880829f, -0.0002798740f, -0.0002649766f, + -0.0002434546f, -0.0002155298f, -0.0001815742f, -0.0001421204f, -0.0000978454f, -0.0000495727f, 0.0000017521f, 0.0000550676f, + 0.0001092294f, 0.0001630223f, 0.0002152001f, 0.0002645008f, 0.0003096899f, 0.0003495759f, 0.0003830534f, 0.0004091148f, + 0.0004268910f, 0.0004356569f, 0.0004348671f, 0.0004241540f, 0.0004033574f, 0.0003725151f, 0.0003318867f, 0.0002819362f, + 0.0002233505f, 0.0001570144f, 0.0000840236f, 0.0000056513f, -0.0000766447f, -0.0001612647f, -0.0002464668f, -0.0003304197f, + -0.0004112104f, -0.0004869065f, -0.0005555699f, -0.0006153285f, -0.0006643921f, -0.0007011284f, -0.0007240766f, -0.0007320225f, + -0.0007240025f, -0.0006993717f, -0.0006577934f, -0.0005992952f, -0.0005242405f, -0.0004333727f, -0.0003277670f, -0.0002088657f, + -0.0000784141f, 0.0000615090f, 0.0002085679f, 0.0003601400f, 0.0005134039f, 0.0006653091f, 0.0008126807f, 0.0009521955f, + 0.0010805136f, 0.0011942726f, 0.0012902629f, 0.0013654507f, 0.0014172107f, 0.0014433822f, 0.0014425598f, 0.0014141671f, + 0.0013587836f, 0.0012781916f, 0.0011756894f, 0.0010560340f, 0.0009256640f, 0.0007924355f, 0.0006656655f, 0.0005555507f, + 0.0004729584f, 0.0004284373f, 0.0004317362f, 0.0004903651f, 0.0006089185f, 0.0007872127f, 0.0010196237f, 0.0012928786f, + 0.0015857907f, 0.0018667312f, 0.0020943919f, 0.0022145657f, 0.0021631986f, 0.0018604759f, 0.0012208798f, 0.0000292075f, + -0.0021197116f, -0.0054807990f, -0.0100496540f, -0.0156837116f, -0.0221176153f, -0.0289836659f, -0.0358300499f, -0.0421477124f, + -0.0473972472f, -0.0510405877f, -0.0525715807f, -0.0515476777f, -0.0476183263f, -0.0405511583f, -0.0302526219f, -0.0167837577f, + -0.0003687048f, 0.0186033188f, 0.0395840702f, 0.0618793275f, 0.0846695731f, 0.1070368665f, 0.1279977851f, 0.1465405975f, + 0.1616659442f, 0.1724289210f, 0.1779814634f, 0.1776128485f, 0.1707870983f, 0.1571752579f, 0.1366814829f, 0.1094613028f, + 0.0759313883f, 0.0367697773f, -0.0070935349f, -0.0544959696f, -0.1040711201f, -0.1542864664f, -0.2034887901f, -0.2499561795f, + -0.2919547949f, -0.3277987591f, -0.3559109665f, -0.3748828886f, -0.3835310580f, -0.3809483068f, -0.3665476249f, -0.3400970096f, + -0.3017436398f, -0.2520263114f, -0.1918751666f, -0.1225984212f, -0.0458559702f, 0.0363795557f, 0.1218735116f, 0.2081903173f, + 0.2927633059f, 0.3729712075f, 0.4462190576f, 0.5100209195f, 0.5620818683f, 0.6003764644f, 0.6232211630f, 0.6293380722f, + 0.6179078583f, 0.5886097344f, 0.5416469980f, 0.4777568614f, 0.3982039462f, 0.3047571785f, 0.1996504916f, 0.0855281262f, + -0.0346240344f, -0.1575593206f, -0.2798609975f, -0.3980402954f, -0.5086387923f, -0.6083321215f, -0.6940317623f, -0.7629817970f, + -0.8128474994f, -0.8417929488f, -0.8485450365f, -0.8324417371f, -0.7934628536f, -0.7322420813f, -0.6500596798f, -0.5488157513f, + -0.4309846022f, -0.2995513767f, -0.1579325879f, -0.0098828159f, 0.1406098406f, 0.2894364546f, 0.4324848701f, 0.5657586229f, + 0.6854937093f, 0.7882695488f, 0.8711108731f, 0.9315772485f, 0.9678376107f, 0.9787272513f, 0.9637856763f, 0.9232737576f, + 0.8581699744f, 0.7701451849f, 0.6615174635f, 0.5351870989f, 0.3945560458f, 0.2434310351f, 0.0859296286f, -0.0736424535f, + -0.2310634168f, -0.3823114335f, -0.5235213255f, -0.6510808750f, -0.7617398230f, -0.8526941807f, -0.9216599849f, -0.9669314227f, + -0.9874241586f, -0.9827015967f, -0.9529842399f, -0.8991414091f, -0.8226659724f, -0.7256325245f, -0.6106403919f, -0.4807428752f, + -0.3393647947f, -0.1902104941f, -0.0371648883f, 0.1158098198f, 0.2647789049f, 0.4059385830f, 0.5357153558f, 0.6508586114f, + 0.7485239966f, 0.8263453865f, 0.8824935656f, 0.9157201366f, 0.9253855645f, 0.9114707230f, 0.8745717535f, 0.8158785137f, + 0.7371373367f, 0.6405992467f, 0.5289551681f, 0.4052600056f, 0.2728477634f, 0.1352400975f, -0.0039491512f, -0.1411108055f, + -0.2727359386f, -0.3955076155f, -0.5063863406f, -0.6026869640f, -0.6821450593f, -0.7429710985f, -0.7838911084f, -0.8041728778f, + -0.8036371970f, -0.7826540315f, -0.7421239451f, -0.6834454939f, -0.6084696882f, -0.5194429622f, -0.4189403872f, -0.3097911110f, + -0.1949981889f, -0.0776550965f, 0.0391387290f, 0.1523609846f, 0.2591459713f, 0.3568583179f, 0.4431590282f, 0.5160621741f, + 0.5739808402f, 0.6157612575f, 0.6407044060f, 0.6485747369f, 0.6395960249f, 0.6144347317f, 0.5741715934f, 0.5202624757f, + 0.4544898084f, 0.3789061628f, 0.2957717132f, 0.2074874749f, 0.1165262725f, 0.0253634355f, -0.0635908373f, -0.1480555764f, + -0.2259378928f, -0.2953850427f, -0.3548284161f, -0.4030183987f, -0.4390493642f, -0.4623743329f, -0.4728091652f, -0.4705264349f, + -0.4560394511f, -0.4301771396f, -0.3940507708f, -0.3490137022f, -0.2966155068f, -0.2385519527f, -0.1766124162f, -0.1126263061f, + -0.0484101006f, 0.0142835032f, 0.0738128901f, 0.1286900297f, 0.1776170652f, 0.2195161266f, 0.2535516850f, 0.2791450556f, + 0.2959808562f, 0.3040055207f, 0.3034181575f, 0.2946543119f, 0.2783633373f, 0.2553803089f, 0.2266934879f, 0.1934085139f, + 0.1567104961f, 0.1178252714f, 0.0779810094f, 0.0383713679f, 0.0001212356f, -0.0357439328f, -0.0683244197f, -0.0968674883f, + -0.1207831483f, -0.1396541129f, -0.1532399189f, -0.1614752576f, -0.1644628650f, -0.1624613596f, -0.1558686952f, -0.1452018785f, + -0.1310738418f, -0.1141682734f, -0.0952134023f, -0.0749555678f, -0.0541335559f, -0.0334544361f, -0.0135717544f, 0.0049333847f, + 0.0215677075f, 0.0359373755f, 0.0477554333f, 0.0568451598f, 0.0631392301f, 0.0666750625f, 0.0675865095f, 0.0660925397f, + 0.0624832536f, 0.0571040881f, 0.0503386382f, 0.0425910695f, 0.0342685282f, 0.0257645482f, 0.0174437200f, 0.0096285741f, + 0.0025886897f, -0.0034671163f, -0.0083958582f, -0.0121219514f, -0.0146360592f, -0.0159904888f, -0.0162924414f, -0.0156942489f, + -0.0143825819f, -0.0125652661f, -0.0104587259f, -0.0082734050f, -0.0062022974f, -0.0044063851f, -0.0030085782f, -0.0020299468f, + -0.0013564795f, -0.0008863453f, -0.0005771741f, -0.0003938621f, -0.0003061649f, -0.0002866266f, -0.0003117925f, -0.0003614869f, + -0.0004195045f, -0.0004730462f, -0.0005129312f, -0.0005329799f, -0.0005299127f, -0.0005026982f, -0.0004523006f, -0.0003810636f, + -0.0002924326f, -0.0001904381f, -0.0000794736f, 0.0000360876f, 0.0001520218f, 0.0002645035f, 0.0003701407f, 0.0004661098f, + 0.0005501197f, 0.0006204662f, 0.0006759537f, 0.0007159048f, 0.0007400667f, 0.0007486024f, 0.0007420006f, 0.0007210650f, + 0.0006868352f, 0.0006405800f, 0.0005837296f, 0.0005178714f, 0.0004446899f, 0.0003659600f, 0.0002834907f, 0.0001991139f, + 0.0001146287f, 0.0000317867f, -0.0000477626f, -0.0001224860f, -0.0001910156f, -0.0002521590f, -0.0003049377f, -0.0003485879f, + -0.0003825850f, -0.0004066332f, -0.0004206749f, -0.0004248679f, -0.0004195832f, -0.0004053722f, -0.0003829556f, -0.0003531864f, + -0.0003170337f, -0.0002755456f, -0.0002298325f, -0.0001810330f, -0.0001302996f, -0.0000787683f, -0.0000275484f, 0.0000223042f, + 0.0000697938f, 0.0001140082f, 0.0001541235f, 0.0001894239f, 0.0002193054f, 0.0002432921f, 0.0002610376f, 0.0002723377f, + 0.0002771279f, 0.0002754901f, 0.0002676451f, 0.0002539525f, 0.0002348963f, 0.0002110770f, 0.0001831908f, 0.0001520155f, + 0.0001183840f, 0.0000831661f, 0.0000472400f, 0.0000114735f, -0.0000233037f, -0.0000563155f, -0.0000868623f, -0.0001143311f, + -0.0001382112f, -0.0001580971f, -0.0001736964f, -0.0001848263f, -0.0001914138f, -0.0001934872f, -0.0001911719f, -0.0001846781f, + -0.0001742945f, -0.0001603745f, -0.0001433301f, -0.0001236179f, -0.0001017335f, -0.0000781989f, -0.0000535563f, -0.0000283571f, + -0.0000031551f, 0.0000215050f, 0.0000450945f, 0.0000671132f, 0.0000870967f, 0.0001046293f, 0.0001193514f, 0.0001309712f, + 0.0001392702f, 0.0001441122f, 0.0001454457f, 0.0001433077f, 0.0001378215f, 0.0001291946f, 0.0001177105f, 0.0001037219f, + 0.0000876371f, 0.0000699088f, 0.0000510177f, 0.0000314597f, 0.0000117289f, -0.0000076947f, -0.0000263593f, -0.0000438511f, + 0.0001150132f, 0.0001210457f, 0.0001243256f, 0.0001247272f, 0.0001221905f, 0.0001167241f, 0.0001084050f, 0.0000973782f, + 0.0000838538f, 0.0000681026f, 0.0000504506f, 0.0000312726f, 0.0000109840f, -0.0000099676f, -0.0000311119f, -0.0000519657f, + -0.0000720435f, -0.0000908672f, -0.0001079775f, -0.0001229433f, -0.0001353725f, -0.0001449210f, -0.0001513017f, -0.0001542924f, + -0.0001537428f, -0.0001495795f, -0.0001418111f, -0.0001305291f, -0.0001159099f, -0.0000982119f, -0.0000777730f, -0.0000550042f, + -0.0000303824f, -0.0000044402f, 0.0000222446f, 0.0000490630f, 0.0000753874f, 0.0001005877f, 0.0001240454f, 0.0001451693f, + 0.0001634096f, 0.0001782724f, 0.0001893315f, 0.0001962400f, 0.0001987389f, 0.0001966654f, 0.0001899567f, 0.0001786543f, + 0.0001629038f, 0.0001429540f, 0.0001191532f, 0.0000919438f, 0.0000618549f, 0.0000294929f, -0.0000044692f, -0.0000393044f, + -0.0000742456f, -0.0001085004f, -0.0001412677f, -0.0001717545f, -0.0001991934f, -0.0002228606f, -0.0002420939f, -0.0002563091f, + -0.0002650175f, -0.0002678393f, -0.0002645180f, -0.0002549296f, -0.0002390911f, -0.0002171644f, -0.0001894582f, -0.0001564244f, + -0.0001186528f, -0.0000768603f, -0.0000318787f, 0.0000153623f, 0.0000638538f, 0.0001125289f, 0.0001602850f, 0.0002060085f, + 0.0002485978f, 0.0002869886f, 0.0003201766f, 0.0003472410f, 0.0003673652f, 0.0003798567f, 0.0003841643f, 0.0003798944f, + 0.0003668225f, 0.0003449050f, 0.0003142851f, 0.0002752981f, 0.0002284708f, 0.0001745194f, 0.0001143417f, 0.0000490064f, + -0.0000202635f, -0.0000921091f, -0.0001650610f, -0.0002375657f, -0.0003080181f, -0.0003747934f, -0.0004362837f, -0.0004909328f, + -0.0005372734f, -0.0005739597f, -0.0005998016f, -0.0006137920f, -0.0006151340f, -0.0006032611f, -0.0005778563f, -0.0005388644f, + -0.0004865040f, -0.0004212729f, -0.0003439544f, -0.0002556177f, -0.0001576201f, -0.0000516007f, 0.0000605233f, 0.0001765734f, + 0.0002941267f, 0.0004105520f, 0.0005230524f, 0.0006287329f, 0.0007246810f, 0.0008080802f, 0.0008763365f, 0.0009272432f, + 0.0009591516f, 0.0009711764f, 0.0009633904f, 0.0009370386f, 0.0008947118f, 0.0008405162f, 0.0007801566f, 0.0007209907f, + 0.0006719403f, 0.0006433567f, 0.0006466802f, 0.0006940691f, 0.0007977534f, 0.0009694468f, 0.0012193921f, 0.0015557448f, + 0.0019833924f, 0.0025041582f, 0.0031158854f, 0.0038235626f, 0.0046346272f, 0.0054390989f, 0.0060159327f, 0.0061653048f, + 0.0057248818f, 0.0045689017f, 0.0026174491f, -0.0001576249f, -0.0037279496f, -0.0080071970f, -0.0128521554f, -0.0180669900f, + -0.0234101334f, -0.0286038762f, -0.0333460639f, -0.0373236148f, -0.0402271782f, -0.0417664366f, -0.0416853226f, -0.0397765655f, + -0.0358948666f, -0.0299681460f, -0.0220062759f, -0.0121068734f, -0.0004577646f, 0.0126640959f, 0.0268973823f, 0.0418047890f, + 0.0568849057f, 0.0715872627f, 0.0853301253f, 0.0975204815f, 0.1075755810f, 0.1149452916f, 0.1191344911f, 0.1197246774f, + 0.1163939799f, 0.1089347803f, 0.0972682074f, 0.0814548499f, 0.0617011436f, 0.0383610136f, 0.0119325064f, -0.0169506961f, + -0.0475328132f, -0.0789543128f, -0.1102746589f, -0.1404988789f, -0.1686072305f, -0.1935871058f, -0.2144662161f, -0.2303460115f, + -0.2404342559f, -0.2440756538f, -0.2407794617f, -0.2302430666f, -0.2123706161f, -0.1872859065f, -0.1553388989f, -0.1171054066f, + -0.0733797097f, -0.0251600584f, 0.0263727389f, 0.0798832323f, 0.1339151136f, 0.1869300341f, 0.2373504277f, 0.2836051694f, + 0.3241767553f, 0.3576486211f, 0.3827511531f, 0.3984049546f, 0.4037599595f, 0.3982290834f, 0.3815152127f, 0.3536305207f, + 0.3149072795f, 0.2659995936f, 0.2078757153f, 0.1418008973f, 0.0693110001f, -0.0078226274f, -0.0876362185f, -0.1680235605f, + -0.2467916047f, -0.3217202299f, -0.3906245377f, -0.4514179183f, -0.5021740836f, -0.5411862254f, -0.5670215229f, -0.5785692885f, + -0.5750812186f, -0.5562023763f, -0.5219918070f, -0.4729319281f, -0.4099261771f, -0.3342846951f, -0.2476981973f, -0.1522004957f, + -0.0501205046f, 0.0559751503f, 0.1633474747f, 0.2691567323f, 0.3705384397f, 0.4646816888f, 0.5489076127f, 0.6207458062f, + 0.6780064885f, 0.7188463213f, 0.7418258915f, 0.7459571192f, 0.7307390569f, 0.6961809001f, 0.6428113176f, 0.5716736392f, + 0.4843067689f, 0.3827121551f, 0.2693074809f, 0.1468681897f, 0.0184582454f, -0.1126480739f, -0.2430513537f, -0.3693168934f, + -0.4880668522f, -0.5960721328f, -0.6903415076f, -0.7682054473f, -0.8273923237f, -0.8660947411f, -0.8830241082f, -0.8774517523f, + -0.8492353530f, -0.7988297417f, -0.7272816665f, -0.6362084256f, -0.5277608621f, -0.4045714971f, -0.2696891599f, -0.1265016829f, + 0.0213512370f, 0.1700728247f, 0.3158090264f, 0.4547507613f, 0.5832357292f, 0.6978471330f, 0.7955064526f, 0.8735578646f, + 0.9298417700f, 0.9627555531f, 0.9712996189f, 0.9551076043f, 0.9144595827f, 0.8502781043f, 0.7641067542f, 0.6580721014f, + 0.5348295632f, 0.3974950823f, 0.2495638365f, 0.0948188243f, -0.0627690415f, -0.2191456458f, -0.3702816044f, -0.5122788950f, + -0.6414754270f, -0.7545417373f, -0.8485716286f, -0.9211570287f, -0.9704889399f, -0.9954247591f, -0.9954218673f, -0.9705217574f, + -0.9213839861f, -0.8492714879f, -0.7560202971f, -0.6439925425f, -0.5160173451f, -0.3753189325f, -0.2254355616f, -0.0701299883f, + 0.0867051692f, 0.2411456382f, 0.3893340590f, 0.5275770178f, 0.6524375705f, 0.7608213615f, 0.8500537691f, 0.9179464760f, + 0.9628514821f, 0.9837014823f, 0.9800353577f, 0.9520083832f, 0.9003867192f, 0.8265265439f, 0.7323382228f, 0.6202366175f, + 0.4930786891f, 0.3540901510f, 0.2067829436f, 0.0548657749f, -0.0978500833f, -0.2475472308f, -0.3904984352f, -0.5231602531f, + -0.6422616826f, -0.7448855335f, -0.8285405425f, -0.8912223677f, -0.9314620191f, -0.9483604838f, -0.9416087836f, -0.9114929628f, + -0.8588840025f, -0.7852129374f, -0.6924319284f, -0.5829623058f, -0.4596310148f, -0.3255970991f, -0.1842701886f, -0.0392230686f, + 0.1058993714f, 0.2474725071f, 0.3819832739f, 0.5061180987f, 0.6168452203f, 0.7114893652f, 0.7877968946f, 0.8439898530f, + 0.8788075843f, 0.8915349645f, 0.8820165939f, 0.8506567100f, 0.7984048958f, 0.7267280723f, 0.6375695654f, 0.5332964054f, + 0.4166362696f, 0.2906057742f, 0.1584319899f, 0.0234692546f, -0.1108865770f, -0.2412842200f, -0.3645012037f, -0.4775241203f, + -0.5776228825f, -0.6624171300f, -0.7299331734f, -0.7786500916f, -0.8075339158f, -0.8160591222f, -0.8042170147f, -0.7725108907f, + -0.7219382530f, -0.6539606307f, -0.5704619141f, -0.4736963677f, -0.3662277643f, -0.2508612725f, -0.1305699260f, -0.0084175965f, + 0.1125195105f, 0.2292308248f, 0.3388468469f, 0.4387101575f, 0.5264402212f, 0.5999904058f, 0.6576958356f, 0.6983109662f, + 0.7210360284f, 0.7255318034f, 0.7119224786f, 0.6807866622f, 0.6331369228f, 0.5703885257f, 0.4943182949f, 0.4070147863f, + 0.3108211535f, 0.2082722739f, 0.1020278156f, -0.0051969757f, -0.1107009698f, -0.2118655199f, -0.3062197747f, -0.3915012914f, + -0.4657104605f, -0.5271574266f, -0.5745004072f, -0.6067745424f, -0.6234106746f, -0.6242437161f, -0.6095105484f, -0.5798376568f, + -0.5362189802f, -0.4799846893f, -0.4127618434f, -0.3364280618f, -0.2530595200f, -0.1648746973f, -0.0741754031f, 0.0167133565f, + 0.1055030935f, 0.1899996005f, 0.2681572959f, 0.3381288062f, 0.3983085785f, 0.4473694991f, 0.4842916874f, 0.5083828586f, + 0.5192898714f, 0.5170013229f, 0.5018412808f, 0.4744544796f, 0.4357835192f, 0.3870388112f, 0.3296621862f, 0.2652852328f, + 0.1956835517f, 0.1227281969f, 0.0483356232f, -0.0255825221f, -0.0971684532f, -0.1646648843f, -0.2264580855f, -0.2811163005f, + -0.3274226190f, -0.3644015563f, -0.3913387774f, -0.4077935926f, -0.4136040520f, -0.4088846629f, -0.3940169539f, -0.3696332868f, + -0.3365944947f, -0.2959620717f, -0.2489657697f, -0.1969675619f, -0.1414230072f, -0.0838410952f, -0.0257436705f, 0.0313744817f, + 0.0860838469f, 0.1370557180f, 0.1830941784f, 0.2231637715f, 0.2564122248f, 0.2821877493f, 0.3000505886f, 0.3097786572f, + 0.3113672668f, 0.3050231025f, 0.2911527592f, 0.2703462881f, 0.2433563271f, 0.2110734944f, 0.1744988056f, 0.1347139397f, + 0.0928502123f, 0.0500571304f, 0.0074713874f, -0.0338128732f, -0.0727717585f, -0.1084765990f, -0.1401155933f, -0.1670116352f, + -0.1886359510f, -0.2046172992f, -0.2147466154f, -0.2189771152f, -0.2174199887f, -0.2103359435f, -0.1981229573f, -0.1813006959f, + -0.1604921331f, -0.1364029689f, -0.1097994880f, -0.0814855216f, -0.0522791841f, -0.0229900383f, 0.0056026879f, 0.0327702587f, + 0.0578524543f, 0.0802730249f, 0.0995522334f, 0.1153162297f, 0.1273031071f, 0.1353655831f, 0.1394703527f, 0.1396942492f, + 0.1362174419f, 0.1293139704f, 0.1193399898f, 0.1067201472f, 0.0919325573f, 0.0754928613f, 0.0579378715f, 0.0398092914f, + 0.0216379870f, 0.0039292462f, -0.0128505743f, -0.0282856818f, -0.0420204769f, -0.0537669816f, -0.0633099271f, -0.0705094521f, + -0.0753014229f, -0.0776954715f, -0.0777709009f, -0.0756706792f, -0.0715937815f, -0.0657861933f, -0.0585309019f, -0.0501372415f, + -0.0409299405f, -0.0312382391f, -0.0213854050f, -0.0116789736f, -0.0024019780f, 0.0061945814f, 0.0138978546f, 0.0205376997f, + 0.0259896162f, 0.0301760169f, 0.0330658894f, 0.0346729129f, 0.0350521841f, 0.0342957066f, 0.0325268747f, 0.0298941639f, + 0.0265643082f, 0.0227151980f, 0.0185287912f, 0.0141842567f, 0.0098516209f, 0.0056860875f, 0.0018232500f, -0.0016247097f, + -0.0045716876f, -0.0069591888f, -0.0087566559f, -0.0099606909f, -0.0105931800f, -0.0106985104f, -0.0103399437f, -0.0095954160f, + -0.0085528538f, -0.0073053349f, -0.0059461694f, -0.0045642672f, -0.0032398065f, -0.0020405892f, -0.0010189826f, -0.0002098435f, + 0.0003708603f, 0.0007263907f, 0.0008791003f, 0.0008719916f, 0.0007765784f, 0.0006548666f, 0.0005262292f, 0.0003982537f, + 0.0002793177f, 0.0001753141f, 0.0000904043f, 0.0000267020f, -0.0000151645f, -0.0000359786f, -0.0000374823f, -0.0000222110f, + 0.0000068647f, 0.0000464960f, 0.0000934169f, 0.0001444514f, 0.0001966810f, 0.0002474932f, 0.0002946695f, 0.0003363826f, + 0.0003712266f, 0.0003981800f, 0.0004166001f, 0.0004261695f, 0.0004268735f, 0.0004189444f, 0.0004028356f, 0.0003791712f, + 0.0003487233f, 0.0003123700f, 0.0002710780f, 0.0002258678f, 0.0001778001f, 0.0001279460f, 0.0000773754f, 0.0000271305f, + -0.0000217852f, -0.0000684311f, -0.0001119393f, -0.0001515353f, -0.0001865458f, -0.0002164146f, -0.0002407060f, -0.0002591149f, + -0.0002714651f, -0.0002777121f, -0.0002779362f, -0.0002723393f, -0.0002612330f, -0.0002450307f, -0.0002242325f, -0.0001994145f, + -0.0001712119f, -0.0001403075f, -0.0001074144f, -0.0000732647f, -0.0000385932f, -0.0000041262f, 0.0000294329f, 0.0000614144f, + 0.0000911952f, 0.0001182080f, 0.0001419530f, 0.0001620054f, 0.0001780247f, 0.0001897598f, 0.0001970554f, 0.0001998531f, + 0.0001981941f, 0.0001922157f, 0.0001821496f, 0.0001683132f, 0.0001511033f, 0.0001309836f, 0.0001084739f, 0.0000841346f, + 0.0000585541f, 0.0000323319f, 0.0000060653f, -0.0000196656f, -0.0000443104f, -0.0000673606f, -0.0000883586f, -0.0001069066f, + -0.0001226716f, -0.0001353906f, -0.0001448717f, -0.0001509959f, -0.0001537153f, -0.0001530521f, -0.0001490949f, -0.0001419958f, + -0.0001319651f, -0.0001192675f, -0.0001042156f, -0.0000871648f, -0.0000685059f, -0.0000486591f, -0.0000280649f, -0.0000071771f, + 0.0000135476f, 0.0000336575f, 0.0000527172f, 0.0000703161f, 0.0000860792f, 0.0000996749f, 0.0001108247f, 0.0001193085f, + 0.0001249716f, 0.0001277272f, 0.0001275584f, 0.0001245179f, 0.0001187256f, 0.0001103637f, 0.0000996709f, 0.0000869347f, + 0.0001080714f, 0.0000990683f, 0.0000875489f, 0.0000737219f, 0.0000578554f, 0.0000402709f, 0.0000213391f, 0.0000014712f, + -0.0000188884f, -0.0000392732f, -0.0000592037f, -0.0000782001f, -0.0000957929f, -0.0001115356f, -0.0001250152f, -0.0001358638f, + -0.0001437678f, -0.0001484773f, -0.0001498120f, -0.0001476681f, -0.0001420207f, -0.0001329265f, -0.0001205227f, -0.0001050259f, + -0.0000867271f, -0.0000659874f, -0.0000432293f, -0.0000189302f, 0.0000063897f, 0.0000321758f, 0.0000578526f, 0.0000828338f, + 0.0001065369f, 0.0001283935f, 0.0001478642f, 0.0001644485f, 0.0001776986f, 0.0001872284f, 0.0001927257f, 0.0001939584f, + 0.0001907842f, 0.0001831541f, 0.0001711180f, 0.0001548245f, 0.0001345226f, 0.0001105567f, 0.0000833641f, 0.0000534651f, + 0.0000214568f, -0.0000120012f, -0.0000461970f, -0.0000803840f, -0.0001137931f, -0.0001456534f, -0.0001752051f, -0.0002017210f, + -0.0002245193f, -0.0002429841f, -0.0002565765f, -0.0002648525f, -0.0002674704f, -0.0002642056f, -0.0002549531f, -0.0002397370f, + -0.0002187078f, -0.0001921470f, -0.0001604577f, -0.0001241645f, -0.0000838982f, -0.0000403913f, 0.0000055419f, 0.0000530134f, + 0.0001010845f, 0.0001487757f, 0.0001950921f, 0.0002390326f, 0.0002796173f, 0.0003158959f, 0.0003469755f, 0.0003720281f, + 0.0003903206f, 0.0004012217f, 0.0004042346f, 0.0003990046f, 0.0003853554f, 0.0003632970f, 0.0003330658f, 0.0002951288f, + 0.0002502244f, 0.0001993576f, 0.0001438330f, 0.0000852306f, 0.0000254212f, -0.0000334924f, -0.0000891888f, -0.0001392362f, + -0.0001811447f, -0.0002125359f, -0.0002312354f, -0.0002355083f, -0.0002241797f, -0.0001969318f, -0.0001544184f, -0.0000986120f, + -0.0000328538f, 0.0000377552f, 0.0001064640f, 0.0001643821f, 0.0002009417f, 0.0002030084f, 0.0001564122f, 0.0000272101f, + -0.0002474236f, -0.0007077450f, -0.0013549123f, -0.0021692285f, -0.0031123474f, -0.0041302220f, -0.0051556983f, -0.0061124129f, + -0.0069187044f, -0.0074922749f, -0.0077547251f, -0.0076363116f, -0.0070802717f, -0.0060468886f, -0.0045167944f, -0.0024936150f, + -0.0000055857f, 0.0028937610f, 0.0061260810f, 0.0095897406f, 0.0131624981f, 0.0167051532f, 0.0200661755f, 0.0230870624f, + 0.0256083449f, 0.0274759454f, 0.0285477406f, 0.0287000110f, 0.0278335968f, 0.0258794506f, 0.0228034121f, 0.0186099337f, + 0.0133446258f, 0.0070954201f, -0.0000077076f, -0.0077945612f, -0.0160580606f, -0.0245590879f, -0.0330327072f, -0.0411956451f, + -0.0487548015f, -0.0554165787f, -0.0608967236f, -0.0649304010f, -0.0672821451f, -0.0677553773f, -0.0662011304f, -0.0625256765f, + -0.0566967379f, -0.0487480334f, -0.0387819173f, -0.0269699584f, -0.0135513300f, 0.0011710168f, 0.0168363911f, 0.0330344995f, + 0.0493155343f, 0.0652019647f, 0.0802017491f, 0.0938226053f, 0.1055869534f, 0.1150470840f, 0.1218001096f, 0.1255022179f, + 0.1258817753f, 0.1227508252f, 0.1160145780f, 0.1056785154f, 0.0918528133f, 0.0747538316f, 0.0547025267f, 0.0321197033f, + 0.0075181359f, -0.0185083336f, -0.0452985039f, -0.0721400382f, -0.0982878107f, -0.1229839236f, -0.1454788614f, -0.1650532162f, + -0.1810393625f, -0.1928424604f, -0.1999601464f, -0.2020003079f, -0.1986963539f, -0.1899194667f, -0.1756873734f, -0.1561692785f, + -0.1316866814f, -0.1027099283f, -0.0698504512f, -0.0338487823f, 0.0044414588f, 0.0440732723f, 0.0840292465f, 0.1232472348f, + 0.1606481100f, 0.1951648730f, 0.2257723487f, 0.2515166502f, 0.2715435877f, 0.2851251931f, 0.2916835749f, 0.2908113564f, + 0.2822880398f, 0.2660917210f, 0.2424057072f, 0.2116197075f, 0.1743254190f, 0.1313064718f, 0.0835228630f, 0.0320901527f, + -0.0217461395f, -0.0766403699f, -0.1311801252f, -0.1839222820f, -0.2334308512f, -0.2783156266f, -0.3172706001f, -0.3491110990f, + -0.3728086001f, -0.3875222240f, -0.3926259708f, -0.3877308633f, -0.3727012727f, -0.3476648529f, -0.3130156636f, -0.2694102425f, + -0.2177565698f, -0.1591960621f, -0.0950789218f, -0.0269333587f, 0.0435706287f, 0.1146620553f, 0.1845133465f, 0.2512872136f, + 0.3131848107f, 0.3684939113f, 0.4156358207f, 0.4532097440f, 0.4800333796f, 0.4951785767f, 0.4980010130f, 0.4881629819f, + 0.4656485511f, 0.4307705397f, 0.3841689741f, 0.3268008962f, 0.2599216377f, 0.1850578889f, 0.1039731292f, 0.0186261878f, + -0.0688760906f, -0.1563309363f, -0.2414952059f, -0.3221429964f, -0.3961238341f, -0.4614199206f, -0.5162009081f, -0.5588747253f, + -0.5881330481f, -0.6029901331f, -0.6028138835f, -0.5873482068f, -0.5567259364f, -0.5114718287f, -0.4524953996f, -0.3810736314f, + -0.2988238434f, -0.2076672897f, -0.1097842922f, -0.0075619595f, 0.0964642567f, 0.1996737260f, 0.2994269495f, 0.3931333240f, + 0.4783186205f, 0.5526904067f, 0.6141996858f, 0.6610970894f, 0.6919820919f, 0.7058438677f, 0.7020926210f, 0.6805804458f, + 0.6416110407f, 0.5859378797f, 0.5147507447f, 0.4296508188f, 0.3326148490f, 0.2259491718f, 0.1122346729f, -0.0057360023f, + -0.1250274487f, -0.2426350011f, -0.3555608763f, -0.4608910229f, -0.5558706911f, -0.6379767588f, -0.7049849023f, -0.7550298238f, + -0.7866568993f, -0.7988638266f, -0.7911310876f, -0.7634403277f, -0.7162800506f, -0.6506383584f, -0.5679827902f, -0.4702276607f, + -0.3596896122f, -0.2390324220f, -0.1112023801f, 0.0206441788f, 0.1532193990f, 0.2831865095f, 0.4072444271f, 0.5222121895f, + 0.6251110517f, 0.7132421052f, 0.7842573939f, 0.8362226383f, 0.8676698916f, 0.8776386903f, 0.8657045557f, 0.8319940114f, + 0.7771856339f, 0.7024969994f, 0.6096577639f, 0.5008694615f, 0.3787529642f, 0.2462848589f, 0.1067243047f, -0.0364678261f, + -0.1797154905f, -0.3194175307f, -0.4520389446f, -0.5742010518f, -0.6827682255f, -0.7749289589f, -0.8482691444f, -0.9008356561f, + -0.9311885385f, -0.9384404163f, -0.9222820323f, -0.8829932011f, -0.8214388065f, -0.7390498855f, -0.6377901922f, -0.5201090426f, + -0.3888815657f, -0.2473378465f, -0.0989827048f, 0.0524918607f, 0.2032993783f, 0.3496543888f, 0.4878683054f, 0.6144431772f, + 0.7261609761f, 0.8201660863f, 0.8940388909f, 0.9458585157f, 0.9742531243f, 0.9784364026f, 0.9582292951f, 0.9140663528f, + 0.8469865241f, 0.7586085363f, 0.6510914981f, 0.5270816374f, 0.3896465540f, 0.2421985725f, 0.0884091910f, -0.0678832812f, + -0.2227704771f, -0.3723727403f, -0.5129372944f, -0.6409334118f, -0.7531420237f, -0.8467376100f, -0.9193601068f, -0.9691751619f, + -0.9949209725f, -0.9959407463f, -0.9721996606f, -0.9242862434f, -0.8533978301f, -0.7613110254f, -0.6503400677f, -0.5232887671f, + -0.3833452070f, -0.2339716460f, -0.0788505878f, 0.0781931324f, 0.2332895986f, 0.3826182078f, 0.5225019620f, 0.6494973950f, + 0.7604792743f, 0.8527171215f, 0.9239423238f, 0.9724036977f, 0.9969105248f, 0.9968616872f, 0.9722604412f, 0.9237142440f, + 0.8524198184f, 0.7601336589f, 0.6491288368f, 0.5221390436f, 0.3822913495f, 0.2330292358f, 0.0780278756f, -0.0788963298f, + -0.2338796641f, -0.3831062116f, -0.5229017760f, -0.6498243415f, -0.7607488022f, -0.8529439154f, -0.9241395420f, -0.9725825570f, + -0.9970800142f, -0.9970285365f, -0.9724291748f, -0.9238873987f, -0.8525981906f, -0.7603166365f, -0.6493147113f, -0.5223253486f, + -0.3824751467f, -0.2332073920f, -0.0781972729f, 0.0787386074f, 0.2337362092f, 0.3829791953f, 0.5227929031f, 0.6497348216f, + 0.7606793588f, 0.8528947992f, 0.9241105706f, 0.9725731485f, 0.9970892373f, 0.9970551505f, 0.9724716796f, 0.9239440737f, + 0.8526671417f, 0.7603958321f, 0.6494020269f, 0.5224186015f, 0.3825721394f, 0.2333059467f, 0.0782952740f, -0.0786431789f, + -0.2336452368f, -0.3828943954f, -0.5227157923f, -0.6496666924f, -0.7606212560f, -0.8528475077f, -0.9240746034f, -0.9725487476f, + -0.9970763762f, -0.9970535479f, -0.9724808145f, -0.9239632108f, -0.8526953557f, -0.7604320409f, -0.6494450222f, -0.5224670848f, + -0.3826247539f, -0.2333613129f, -0.0783520192f, 0.0785863895f, 0.2335896751f, 0.3828412460f, 0.5226661333f, 0.6496214780f, + 0.7605813048f, 0.8528134912f, 0.9240470409f, 0.9725280010f, 0.9970626504f, 0.9970468907f, 0.9724811225f, 0.9239702338f, + 0.8527087070f, 0.7604512067f, 0.6494693756f, 0.5224958998f, 0.3826572234f, 0.2333965660f, 0.0783891427f, -0.0785483312f, + -0.2335516168f, -0.3828041004f, -0.5226307686f, -0.6495886980f, -0.7605518286f, -0.8527879374f, -0.9240259128f, -0.9725116771f, + -0.9970513761f, -0.9970407770f, -0.9724801457f, -0.9239742417f, -0.8527174266f, -0.7604642572f, -0.6494862818f, -0.5225161097f, + -0.3826801252f, -0.2334215076f, -0.0784154487f, 0.0785213402f, 0.2335246089f, 0.3827777168f, 0.5226056112f, 0.6495653171f, + 0.7605307154f, 0.8527695153f, 0.9240105331f, 0.9724996141f, 0.9970428253f, 0.9970358530f, 0.9724788823f, 0.9239765920f, + 0.8527232652f, 0.7604733819f, 0.6494984183f, 0.5225309161f, 0.3826971989f, 0.2334403933f, 0.0784356488f, -0.0785003550f, + -0.2335033857f, -0.3827568073f, -0.5225855558f, -0.6495466309f, -0.7605138718f, -0.8527549335f, -0.9239985644f, -0.9724905323f, + -0.9970368187f, -0.9970330198f, -0.9724792289f, -0.9239800349f, -0.8527296357f, -0.7604824344f, -0.6495098398f, -0.5225443385f, + -0.3827122124f, -0.2334565601f, -0.0784525165f, 0.0784832397f, 0.2334864657f, 0.3827405037f, 0.5225702598f, 0.6495326959f, + 0.7605016087f, 0.8527446058f, 0.9239903860f, 0.9724846653f, 0.9970333725f, 0.9970320501f, 0.9724807380f, 0.9239839714f, + 0.8527358952f, 0.7604908594f, 0.6495202224f, 0.5225564219f, 0.3827256949f, 0.2334710996f, 0.0784677378f, +}; + + +const float ivas_fb_resp_cheby_ramp_32del[IVAS_FB_1MS_32K_SAMP + 1] = +{ + 0.010231040569020f, 0.007495943710050f, 0.010178929162785f, 0.013398453336031f, + 0.017224667421257f, 0.021716621502222f, 0.026933804139047f, 0.032948050269901f, + 0.039809603616101f, 0.047574690662976f, 0.056302264669850f, 0.066034303975194f, + 0.076798058466510f, 0.088625188565940f, 0.101547758277136f, 0.115583678333348f, + 0.130755763247409f, 0.147071750845082f, 0.164507415202116f, 0.183014970904299f, + 0.202613741800170f, 0.223272731589440f, 0.244918942156018f, 0.267509604208255f, + 0.290972907623430f, 0.315243955993690f, 0.340239023615672f, 0.365855210507665f, + 0.392018902968585f, 0.418630748275114f, 0.445572918038597f, 0.472730394874248f, + 0.500000000000000f +}; + +const float ivas_fb_resp_cheby_ramp_16del[IVAS_FB_1MS_16K_SAMP + 1] = +{ + 0.010924831305822f, 0.013910402297200f, 0.022265243822209f, 0.033383809618597f, + 0.047654785522720f, 0.065424889526712f, 0.087005871336219f, 0.112572807795153f, + 0.142228383484898f, 0.175983302431557f, 0.213688773924401f, 0.255075179343390f, + 0.299758845354607f, 0.347229042543433f, 0.396890172892483f, 0.448063390053926f, + 0.500000000000000f +}; + +const int16_t ivas_num_active_bands[FB - WB + 1] = +{ + IVAS_16K_12BANDS_ACTIVE_BANDS, IVAS_FB_BANDS_12, IVAS_FB_BANDS_12 +}; + +/*------------------------------------------------------------------------------------------* + * SNS MSVQ codebooks and means + *------------------------------------------------------------------------------------------*/ + +const int16_t ivas_sns_cdbks_tcx20_levels[SNS_MSVQ_NSTAGES_TCX20] = { 128, 64, 32, 32 }; + +const int16_t ivas_sns_cdbks_tcx20_bits[SNS_MSVQ_NSTAGES_TCX20] = { 7, 6, 5, 5 }; + +/* pre-rounded codebook vectors for singed Q4.12 represantation */ +const float ivas_sns_cdbk_tcx20_stage1[ 128 * 16 ] = +{ + -1.8305664f, -2.0878906f, -0.9638672f, 2.8059082f, 2.668213f, 1.1638184f, 1.390625f, 1.217041f, 1.3850098f, 0.44555664f, -0.47045898f, -0.5307617f, -0.810791f, -1.1647949f, -1.4560547f, -1.7612305f, + -2.5979004f, -3.3308105f, -1.8554688f, -0.3605957f, 1.6828613f, 2.5871582f, 0.98168945f, 0.22436523f, -0.13110352f, 0.16699219f, 1.5004883f, 0.3293457f, 0.33569336f, 1.1591797f, 0.1796875f, -0.8718262f, + 1.982666f, 2.2011719f, 1.1525879f, 0.8093262f, 0.86499023f, 1.1618652f, 1.2888184f, 1.3618164f, 1.0827637f, 0.83251953f, 0.12011719f, -0.7182617f, -2.1948242f, -3.0500488f, -3.3571777f, -3.53833f, + 0.15771484f, 1.1040039f, 0.39282227f, -0.6479492f, -1.0939941f, -1.0437012f, -1.2055664f, -1.1469727f, -0.998291f, -0.37768555f, 0.3486328f, 1.081543f, 1.2700195f, 1.2143555f, 0.8371582f, 0.107666016f, + 0.24438477f, -0.70751953f, -1.1660156f, -1.1777344f, -0.24536133f, 0.39624023f, 1.112793f, 1.232666f, 1.3540039f, 1.088623f, 0.9001465f, 0.9003906f, -0.030761719f, -0.83740234f, -1.2800293f, -1.7849121f, + -0.91918945f, -0.18603516f, -0.7397461f, -1.5285645f, -1.7453613f, -1.2680664f, -0.9445801f, 0.2434082f, 1.3000488f, 1.6604004f, 1.2814941f, 1.0026855f, 0.71484375f, 0.56347656f, 0.47509766f, 0.09008789f, + 2.4824219f, 1.4541016f, 0.91064453f, 0.6765137f, 0.5678711f, 0.6965332f, 0.7609863f, 0.70410156f, 0.36108398f, -0.032470703f, -0.69140625f, -1.1281738f, -1.4833984f, -1.5556641f, -1.7043457f, -2.0187988f, + 2.41333f, 1.4936523f, 0.9902344f, 0.9104004f, 0.7211914f, 0.5522461f, 0.09326172f, -0.21655273f, -0.49560547f, -0.4873047f, -0.7363281f, -0.9211426f, -1.0041504f, -0.9875488f, -1.0681152f, -1.2578125f, + -0.814209f, 1.2546387f, 1.6965332f, 1.420166f, 0.99560547f, 1.1420898f, 1.0039062f, 0.9289551f, 0.6604004f, 0.22485352f, -0.6530762f, -1.2009277f, -1.2949219f, -1.3759766f, -1.7175293f, -2.2705078f, + -1.3979492f, 0.18896484f, 0.34814453f, -0.052001953f, -0.38623047f, -0.25878906f, -0.3371582f, -0.109375f, -0.08227539f, 0.07495117f, -0.019042969f, 0.1184082f, 0.30566406f, 0.5102539f, 0.6755371f, 0.4206543f, + 1.0683594f, 1.9543457f, 2.1296387f, 2.071045f, 1.5754395f, 1.1333008f, 0.4248047f, -0.19799805f, -0.84350586f, -1.079834f, -1.3415527f, -1.3908691f, -1.3967285f, -1.3078613f, -1.3322754f, -1.4663086f, + 2.3891602f, 2.5097656f, 1.144043f, 0.36572266f, -0.16894531f, -0.23388672f, 0.26879883f, 0.7692871f, 0.54589844f, 0.5180664f, -0.26879883f, -0.92211914f, -1.2089844f, -1.4658203f, -1.9033203f, -2.338623f, + -1.3549805f, 1.3427734f, 1.5871582f, 1.9365234f, 0.58935547f, 0.4892578f, -0.17675781f, -0.19458008f, 0.11352539f, 0.01928711f, 0.30419922f, -0.23291016f, -2.1499023f, -1.2368164f, -0.20922852f, -0.8269043f, + 0.8769531f, -1.5319824f, -1.6025391f, -1.3833008f, -0.57299805f, -0.8847656f, -0.90600586f, -0.986084f, -1.1860352f, -1.3520508f, -1.2216797f, -0.49902344f, 1.5070801f, 4.0805664f, 2.208496f, 3.4538574f, + 4.114258f, 3.3249512f, 2.2033691f, 1.0500488f, 0.14770508f, -0.36547852f, -0.748291f, -0.8503418f, -1.0917969f, -1.0305176f, -1.1955566f, -1.2768555f, -1.1767578f, -1.0061035f, -0.9506836f, -1.1477051f, + 0.7878418f, 2.513916f, 1.0112305f, -0.767334f, -1.3525391f, -0.86865234f, 0.42456055f, 1.4470215f, 1.2680664f, 1.1574707f, -0.41333008f, -0.92993164f, -0.9226074f, -0.92285156f, -0.80859375f, -1.6242676f, + -2.2216797f, -1.2346191f, -0.4008789f, 0.59765625f, -0.49389648f, 1.1911621f, 0.032470703f, 1.3654785f, 0.43139648f, 1.2021484f, 1.6652832f, 0.58862305f, -0.29541016f, -0.99560547f, -1.0366211f, -0.39526367f, + -1.8601074f, -2.9248047f, 0.14648438f, 0.61157227f, 0.6274414f, -1.3579102f, 0.48095703f, -0.4399414f, 0.57006836f, 1.1831055f, -1.1950684f, 0.828125f, 1.2575684f, 1.5888672f, 0.5510254f, -0.06762695f, + 2.1816406f, 2.8918457f, 2.9243164f, 2.5839844f, 2.2548828f, 1.7543945f, 0.92626953f, 0.45751953f, -0.17285156f, -0.9650879f, -1.7875977f, -2.3608398f, -2.6245117f, -2.6313477f, -2.6652832f, -2.767334f, + 2.0964355f, 0.20458984f, -1.2553711f, -2.0012207f, -1.9951172f, -1.407959f, -1.0788574f, -0.47460938f, -0.01928711f, 0.45239258f, 0.73779297f, 0.9333496f, 1.0112305f, 1.1274414f, 0.90893555f, 0.7597656f, + -1.2897949f, 0.13867188f, 0.4831543f, 0.6274414f, 0.5175781f, 0.54541016f, 0.46826172f, 0.548584f, 0.39135742f, 0.4975586f, 0.38671875f, -0.022705078f, -0.36083984f, -0.8190918f, -1.0593262f, -1.0527344f, + 0.80029297f, 0.57250977f, 0.068359375f, -0.70996094f, -1.0571289f, -0.92041016f, -0.74121094f, -0.3017578f, 0.1850586f, 0.7922363f, 0.76171875f, 0.55859375f, 0.39135742f, 0.22363281f, -0.09790039f, -0.5253906f, + 4.5966797f, 2.5993652f, 0.8737793f, -0.9536133f, -0.07006836f, 2.6501465f, 1.3757324f, -0.8967285f, -1.6777344f, -1.2912598f, -0.5917969f, -1.3334961f, -1.4775391f, -0.6760254f, -1.0019531f, -2.1257324f, + -1.0061035f, 0.67407227f, 0.9157715f, 0.9851074f, 0.78564453f, -0.009277344f, -0.40039062f, -0.12524414f, -0.18310547f, -0.0029296875f, -0.38989258f, -0.40820312f, -0.37158203f, -0.15551758f, 0.010253906f, -0.3178711f, + -1.3325195f, 0.7138672f, 1.6359863f, 2.2177734f, 1.659668f, 1.9414062f, 1.0874023f, 1.3305664f, 1.4523926f, 1.2883301f, -0.56225586f, -2.0280762f, -2.8566895f, -2.5690918f, -2.1638184f, -1.8144531f, + 0.0925293f, 1.5366211f, 2.095459f, 1.9145508f, 1.4782715f, 0.8676758f, -0.34643555f, -0.21826172f, -1.1254883f, -1.1550293f, -0.92211914f, -0.5473633f, -0.89868164f, -0.77441406f, -0.8112793f, -1.1855469f, + 2.2070312f, 3.5219727f, 1.9643555f, 0.5649414f, -0.021728516f, 0.14941406f, 0.15991211f, 0.21850586f, -1.1708984f, -1.1306152f, -0.32299805f, -0.064453125f, -1.4772949f, -1.6064453f, -1.3984375f, -1.5932617f, + 2.5195312f, 2.3515625f, 1.3063965f, 0.20825195f, -0.609375f, -1.088623f, -1.3623047f, -1.2600098f, -1.3369141f, -1.0693359f, -0.8010254f, -0.42773438f, -0.15234375f, 0.44799805f, 0.5998535f, 0.6743164f, + 1.5209961f, 1.0463867f, 0.74560547f, 0.51342773f, 0.34448242f, 0.21533203f, -0.028320312f, -0.084228516f, 0.08618164f, 0.12475586f, -0.3557129f, -0.5698242f, -0.63012695f, -0.6933594f, -0.9638672f, -1.2717285f, + -0.5739746f, -0.20629883f, -0.9890137f, -1.8708496f, -1.9855957f, -1.6159668f, -1.6103516f, -1.3623047f, -0.9399414f, -0.067871094f, 0.9128418f, 1.7995605f, 2.1074219f, 2.2941895f, 2.331787f, 1.7766113f, + 3.6323242f, 1.9743652f, 0.3935547f, -0.6862793f, -1.1130371f, -1.0187988f, -0.8935547f, -0.5998535f, -0.4345703f, -0.2290039f, -0.26416016f, -0.21484375f, -0.13208008f, 0.009765625f, -0.16601562f, -0.2578125f, + -0.0871582f, 1.651123f, 1.8327637f, 0.54125977f, 0.23999023f, 1.421875f, 0.79663086f, 1.309082f, 0.98217773f, 1.2548828f, -1.8842773f, -1.8806152f, -1.5390625f, -1.3496094f, -1.2785645f, -2.0100098f, + -2.2109375f, -0.70288086f, 1.1103516f, 2.2207031f, 2.3356934f, 2.010498f, 1.638916f, 1.4345703f, 1.0351562f, 0.5690918f, -0.11035156f, -0.88256836f, -1.5859375f, -2.0117188f, -2.31958f, -2.5310059f, + -1.6091309f, -2.519287f, -2.4504395f, 0.26660156f, 2.321289f, 2.5898438f, 3.5390625f, -1.0505371f, -1.2543945f, -0.27734375f, 0.94873047f, 1.3859863f, 0.7109375f, -1.0185547f, -1.2666016f, -0.31689453f, + 0.94433594f, 2.465332f, 2.668457f, 1.9997559f, 1.2949219f, 1.0178223f, 0.888916f, 0.7038574f, 0.29248047f, -0.050048828f, -0.77001953f, -1.4472656f, -2.0839844f, -2.5202637f, -2.6381836f, -2.7663574f, + -0.14160156f, -0.3083496f, -0.5864258f, -1.2387695f, -1.4682617f, -1.1057129f, -0.7817383f, -0.5292969f, -0.06323242f, 0.54003906f, 0.8947754f, 1.3034668f, 1.3681641f, 1.1462402f, 0.7866211f, 0.18408203f, + 0.40478516f, -0.94018555f, -1.2241211f, -1.1057129f, -0.43066406f, -0.07324219f, 2.0061035f, 4.0029297f, 0.48828125f, 0.20117188f, 0.16235352f, -0.4182129f, -0.7751465f, -0.74072266f, -0.7463379f, -0.81152344f, + -2.7770996f, -2.1079102f, -1.5097656f, -1.515625f, -1.0080566f, -0.036621094f, 0.3708496f, 1.060791f, 1.3742676f, 1.2963867f, 0.9782715f, 1.0876465f, 0.9584961f, 0.8691406f, 0.7578125f, 0.20092773f, + 1.8244629f, 2.9589844f, 2.7573242f, 1.1542969f, 0.87109375f, 1.3430176f, 0.9003906f, 0.8564453f, 0.41308594f, -0.40551758f, -2.0913086f, -2.3833008f, -2.1589355f, -1.9533691f, -1.9741211f, -2.1125488f, + 2.1027832f, 1.2624512f, 1.0627441f, 0.8051758f, 0.22583008f, -0.12939453f, -0.3996582f, -0.54052734f, -0.74975586f, -0.7180176f, -0.7895508f, -0.7229004f, -0.6113281f, -0.2956543f, -0.21484375f, -0.28710938f, + 0.15161133f, 2.585205f, 1.7568359f, 0.9177246f, 0.37329102f, -0.16088867f, -0.4633789f, -0.21801758f, -0.09277344f, -0.021484375f, -0.22631836f, -0.42382812f, -0.66625977f, -0.8803711f, -1.0666504f, -1.5649414f, + -2.6091309f, -1.9162598f, -1.4050293f, -1.5510254f, -1.4436035f, -0.76904297f, -0.6994629f, -0.28881836f, -0.09326172f, 0.4140625f, 0.6401367f, 1.267334f, 1.7597656f, 2.1586914f, 2.4848633f, 2.0510254f, + -0.08935547f, 1.982666f, 2.4018555f, 1.3012695f, 0.122802734f, 0.8886719f, 1.3410645f, 1.0705566f, 0.115234375f, -0.2043457f, -0.97094727f, -2.4370117f, -2.147705f, -1.3283691f, -0.74731445f, -1.298584f, + 2.5476074f, 0.140625f, -0.8376465f, -1.244873f, -1.2324219f, -0.7644043f, -0.34521484f, 0.3581543f, 0.60839844f, 0.5698242f, 0.3034668f, 0.06274414f, 0.27563477f, 0.35498047f, -0.28588867f, -0.5109863f, + -0.5878906f, 1.0141602f, 1.5241699f, 1.2287598f, 0.76123047f, 0.6047363f, 0.2199707f, 0.21044922f, 0.15185547f, 0.15307617f, -0.115478516f, -0.46313477f, -0.689209f, -0.9284668f, -1.3129883f, -1.770752f, + 1.4040527f, -0.9628906f, -1.3322754f, -0.79785156f, 0.06591797f, -0.045166016f, -0.33520508f, -0.6257324f, -0.91748047f, -0.9824219f, -0.9892578f, -0.84472656f, -0.66137695f, -0.057861328f, 2.248291f, 4.8339844f, + 2.727539f, 3.736084f, 3.4023438f, 2.6699219f, 1.3686523f, 0.091308594f, -0.7897949f, -1.1069336f, -1.4260254f, -1.4335938f, -1.5388184f, -1.5930176f, -1.5603027f, -1.5078125f, -1.473877f, -1.565918f, + 1.2629395f, 2.5461426f, 1.8774414f, -0.051513672f, -1.0480957f, -0.94873047f, -0.40551758f, 0.21875f, 0.01977539f, -0.1484375f, -0.44140625f, -0.5810547f, -0.5349121f, -0.4650879f, -0.51831055f, -0.7819824f, + -2.1455078f, -0.25683594f, 1.3151855f, 1.635498f, 1.4401855f, 0.89624023f, 0.8405762f, 0.9350586f, 0.9802246f, 0.67041016f, -0.13085938f, -0.59521484f, -0.9729004f, -1.145752f, -1.4951172f, -1.9714355f, + -2.1291504f, -2.1418457f, -0.46704102f, 0.73291016f, 1.2219238f, -0.27856445f, -0.30517578f, 1.1865234f, 0.87231445f, -0.060791016f, 0.060058594f, 0.43701172f, 0.79174805f, 0.9128418f, -0.046142578f, -0.7866211f, + 3.130127f, 2.7661133f, 1.8110352f, 1.4995117f, 1.095459f, 0.8935547f, 0.8383789f, 0.5913086f, 0.21923828f, -0.1965332f, -0.982666f, -1.7121582f, -2.2011719f, -2.409912f, -2.5390625f, -2.803711f, + 1.5769043f, 0.34960938f, -0.17211914f, -0.4428711f, -0.62597656f, -0.57055664f, -0.6516113f, -0.43676758f, -0.38208008f, -0.18725586f, -0.16992188f, -0.0034179688f, 0.15356445f, 0.39404297f, 0.56396484f, 0.60424805f, + 0.12768555f, 0.2109375f, 0.16137695f, 0.063964844f, 0.13012695f, 0.39526367f, 0.5834961f, 0.62353516f, 0.50683594f, 0.37402344f, 0.060546875f, -0.13232422f, -0.37719727f, -0.6010742f, -0.8376465f, -1.2895508f, + 0.6723633f, 1.9140625f, 0.3737793f, -1.2988281f, -1.7912598f, -1.2351074f, -0.44628906f, 0.5895996f, 0.6838379f, 0.58935547f, 0.22460938f, -0.013183594f, -0.16479492f, 0.072021484f, 0.14501953f, -0.3149414f, + 4.0183105f, 2.2834473f, 1.317627f, 1.2583008f, 1.5627441f, 0.9851074f, 0.12817383f, -0.2944336f, -0.65527344f, -0.9675293f, -1.3979492f, -1.5356445f, -1.5737305f, -1.5908203f, -1.6887207f, -1.8493652f, + 0.8132324f, 0.6748047f, 0.44433594f, 0.35375977f, 0.09863281f, 0.048095703f, -0.15063477f, -0.12646484f, -0.18432617f, -0.15258789f, -0.30517578f, -0.29101562f, -0.31201172f, -0.23876953f, -0.26635742f, -0.40551758f, + 0.29345703f, 2.6530762f, 3.4177246f, 2.5812988f, 2.1159668f, 1.3947754f, 0.9523926f, 0.41479492f, -0.15844727f, -0.9025879f, -1.5444336f, -1.9780273f, -2.2106934f, -2.2788086f, -2.3234863f, -2.4267578f, + 0.75805664f, 2.5563965f, 2.8410645f, 2.2597656f, 0.3876953f, -1.067627f, -1.425293f, -0.795166f, -0.6105957f, -0.66381836f, -0.9675293f, -1.0371094f, -0.88916016f, -0.5444336f, -0.19042969f, -0.6118164f, + 1.7177734f, 3.0668945f, 3.2519531f, 2.4799805f, 0.7363281f, -0.8156738f, -0.8125f, 0.1430664f, 0.34375f, -0.27563477f, -1.4462891f, -1.4350586f, -1.4143066f, -1.6706543f, -1.8481445f, -2.0212402f, + 2.756836f, 1.090332f, 0.61572266f, 0.1928711f, -0.34521484f, -0.47509766f, -0.36767578f, -0.0637207f, 0.14233398f, 0.19580078f, -0.16015625f, -0.43286133f, -0.6472168f, -0.5493164f, -0.80737305f, -1.1452637f, + 1.0544434f, 1.0671387f, 1.1149902f, 1.1230469f, 0.78637695f, 0.64282227f, 0.4868164f, 0.3413086f, 0.13769531f, -0.13085938f, -0.64990234f, -0.89453125f, -1.074707f, -1.114502f, -1.3056641f, -1.5842285f, + -1.8156738f, -1.3222656f, -1.4528809f, -1.8908691f, -1.8740234f, -1.1118164f, -1.1750488f, -0.5734863f, 0.16308594f, 1.5822754f, 2.0114746f, 1.8625488f, 1.6049805f, 1.5942383f, 1.5368652f, 0.8605957f, + 3.2451172f, 2.7807617f, 1.2692871f, 0.5222168f, 0.119384766f, -0.06616211f, -0.15722656f, -0.10424805f, -0.27197266f, -0.45263672f, -0.83618164f, -1.1611328f, -1.333252f, -1.2722168f, -1.2016602f, -1.0800781f, + 0.17333984f, 2.4299316f, 2.3254395f, 1.3701172f, 0.47509766f, 0.72216797f, 0.072753906f, -0.037597656f, -0.41845703f, -0.8137207f, -1.5649414f, -2.4125977f, -1.3486328f, -0.53027344f, -0.10546875f, -0.33740234f, + -2.5983887f, -1.9645996f, -0.5678711f, 0.48999023f, 0.86743164f, 0.62158203f, 1.189209f, 1.3269043f, 1.182373f, 1.0024414f, 0.54785156f, 0.25634766f, -0.12133789f, -0.44140625f, -0.7026367f, -1.0881348f, + 0.071777344f, -2.279541f, -2.057373f, -0.25512695f, 2.2199707f, 2.541748f, 0.8342285f, 0.7907715f, 0.5048828f, -0.1303711f, 0.2631836f, -0.37036133f, -0.5187988f, -0.42285156f, -0.66845703f, -0.52368164f, + 1.3261719f, 3.1193848f, 2.583496f, 0.6767578f, -0.022460938f, 0.5214844f, 0.6105957f, 1.0021973f, 0.66845703f, 0.8640137f, -0.37353516f, -2.0703125f, -2.3225098f, -2.136963f, -2.057129f, -2.3894043f, + 1.4580078f, 2.0153809f, 1.0583496f, -0.12792969f, -0.6064453f, -0.7011719f, -0.96118164f, -0.8588867f, -0.7414551f, -0.18896484f, 0.1550293f, 0.46166992f, 0.3881836f, 0.16113281f, -0.37109375f, -1.140625f, + 1.6044922f, 0.8898926f, -0.053222656f, -0.26611328f, 0.084228516f, 0.5666504f, 0.9013672f, 1.1362305f, 1.1520996f, 0.74243164f, 0.5168457f, 0.11206055f, -0.8305664f, -1.7199707f, -2.109375f, -2.7270508f, + -1.3208008f, -0.083984375f, -0.24169922f, -0.95043945f, -1.2331543f, -0.564209f, -0.018798828f, 0.95654297f, 1.142334f, 1.1772461f, 0.8063965f, 0.43359375f, 0.08227539f, 0.07446289f, 0.099853516f, -0.359375f, + 2.0480957f, 2.739746f, 2.1257324f, 1.1525879f, 0.7644043f, 0.5031738f, 0.2758789f, 0.19311523f, -0.08642578f, -0.15893555f, -0.89990234f, -1.2700195f, -1.5583496f, -1.791748f, -1.9023438f, -2.135254f, + 2.2700195f, 2.2856445f, 1.5393066f, 0.77563477f, 0.23632812f, -0.017578125f, -0.23071289f, -0.19995117f, -0.26342773f, -0.17700195f, -0.5046387f, -0.6687012f, -0.8383789f, -1.057373f, -1.3330078f, -1.8166504f, + 0.66015625f, 1.6772461f, 1.604248f, 1.5366211f, 1.1013184f, 0.8173828f, 0.5605469f, 0.7155762f, 0.5270996f, 0.23291016f, -0.37719727f, -0.8352051f, -1.3342285f, -1.7580566f, -2.2695312f, -2.8588867f, + 0.21484375f, -0.44580078f, -0.85253906f, -1.0334473f, -0.95043945f, -0.592041f, -0.47558594f, -0.20092773f, -0.06323242f, 0.16040039f, 0.24414062f, 0.5144043f, 0.70947266f, 0.8796387f, 0.9663086f, 0.92529297f, + -0.047851562f, 1.6748047f, 2.0949707f, 2.3344727f, 1.7766113f, 1.7685547f, 0.35913086f, 0.47509766f, -0.055664062f, -0.08251953f, -0.76049805f, -1.8425293f, -2.8457031f, -2.4018555f, -1.144043f, -1.3034668f, + 2.0942383f, 1.1809082f, 0.54345703f, 0.18408203f, -0.44360352f, -0.5373535f, 0.12182617f, 0.7114258f, 0.8088379f, 0.7709961f, -0.12866211f, -1.1555176f, -1.4138184f, -1.0009766f, -0.83081055f, -0.90478516f, + -1.0332031f, 1.6005859f, 0.46875f, 1.6149902f, -0.23095703f, 1.0908203f, 0.068359375f, 0.5266113f, 0.18701172f, -0.12792969f, -0.22509766f, -0.4819336f, -0.5058594f, -0.390625f, -1.2128906f, -1.3486328f, + 1.7792969f, 0.7167969f, -0.40039062f, -1.1201172f, -1.5458984f, -1.5344238f, -1.5107422f, -1.3601074f, -1.2751465f, -0.93847656f, -0.40795898f, 0.49145508f, 1.2475586f, 2.0236816f, 2.0373535f, 1.7973633f, + 2.8059082f, 2.769043f, 1.6977539f, 0.44458008f, -0.41308594f, -0.6376953f, -0.80566406f, -0.81030273f, -0.93115234f, -0.66845703f, -0.7155762f, -0.6870117f, -0.6052246f, -0.46142578f, -0.41967773f, -0.56225586f, + 1.9963379f, 2.9060059f, 1.5930176f, -0.34716797f, -0.7993164f, 0.061279297f, 1.0302734f, 1.1359863f, 0.7434082f, -0.07397461f, -1.3549805f, -1.2399902f, -1.2802734f, -1.2973633f, -1.4362793f, -1.6364746f, + -2.3041992f, -0.73999023f, 0.11791992f, 0.3215332f, 0.45092773f, 0.45751953f, 0.7368164f, 0.7216797f, 0.19238281f, 0.75439453f, 0.17822266f, -0.46679688f, -0.41210938f, 0.029785156f, 0.20996094f, -0.24829102f, + -0.9016113f, -1.2150879f, -0.13208008f, 0.7023926f, 0.81225586f, -0.57055664f, -1.0405273f, -0.5344238f, 0.1706543f, 0.579834f, 0.80810547f, 0.4790039f, 0.3671875f, 0.24829102f, 0.32202148f, -0.095214844f, + 1.4807129f, 1.8234863f, 1.7661133f, 2.5449219f, 2.6020508f, 1.9316406f, 1.3154297f, 1.1328125f, 0.5263672f, -0.17895508f, -1.1706543f, -2.199707f, -2.7531738f, -2.8725586f, -2.9294434f, -3.0187988f, + 2.6689453f, 0.5949707f, -0.45043945f, -0.7963867f, -0.91625977f, -0.90722656f, -0.98413086f, -0.8354492f, -0.6953125f, -0.3955078f, -0.2849121f, 0.04296875f, 0.43066406f, 0.7241211f, 0.81591797f, 0.9880371f, + -0.15112305f, -0.33618164f, -0.3256836f, -0.111083984f, -0.048339844f, 0.08129883f, 0.068115234f, 0.17138672f, 0.20385742f, 0.2590332f, 0.123291016f, 0.11621094f, 0.03100586f, 0.06201172f, 0.06591797f, -0.2097168f, + 1.2731934f, 0.29223633f, -0.14038086f, -0.29956055f, -0.6376953f, -0.56762695f, -0.15844727f, 0.46020508f, 0.6569824f, 0.68188477f, 0.28393555f, -0.18676758f, -0.43164062f, -0.3347168f, -0.38256836f, -0.5083008f, + 4.678711f, 2.80542f, 1.126709f, -0.48461914f, -0.8273926f, 0.7895508f, 2.3266602f, 0.4375f, -1.6252441f, -1.8422852f, -1.4978027f, -0.8730469f, -1.3171387f, -1.671875f, -1.0270996f, -0.998291f, + -1.3620605f, 0.63916016f, 1.1337891f, 0.3178711f, 0.06591797f, 1.0673828f, 0.91503906f, 0.4387207f, -0.18359375f, -0.22875977f, -0.6660156f, -0.69799805f, -0.17236328f, -0.21118164f, -0.24951172f, -0.8066406f, + -0.44873047f, 1.4709473f, 2.5039062f, 2.7050781f, 1.9462891f, 0.3642578f, -0.30078125f, 0.6467285f, 0.9680176f, 0.9716797f, -1.498291f, -1.8183594f, -1.8544922f, -1.847168f, -1.605957f, -2.2028809f, + 0.47460938f, 1.574707f, 1.7148438f, 2.1083984f, 1.7241211f, 0.44189453f, -0.40551758f, -0.18847656f, 0.13232422f, -0.0031738281f, -0.79467773f, -1.1843262f, -1.2902832f, -1.2416992f, -1.3430176f, -1.7194824f, + 1.9831543f, 3.927246f, 2.9868164f, 1.2749023f, 0.265625f, 0.02734375f, 0.079833984f, 0.47070312f, -0.7956543f, -1.2663574f, -1.638916f, -1.8222656f, -1.3908691f, -1.4194336f, -1.3027344f, -1.3791504f, + 0.2097168f, 1.8005371f, 1.479248f, 0.62109375f, 0.091552734f, -0.38549805f, -0.93530273f, -0.923584f, -0.91259766f, -0.6557617f, -0.5842285f, -0.27563477f, 0.007080078f, 0.25585938f, 0.25219727f, -0.044677734f, + 0.51293945f, 1.0280762f, 0.84033203f, 0.62841797f, 0.5317383f, 0.5251465f, 0.26953125f, 0.09423828f, 0.032958984f, -0.052734375f, -0.48999023f, -0.6513672f, -0.6411133f, -0.6369629f, -0.84375f, -1.1477051f, + -1.2319336f, -0.08203125f, -0.23632812f, -0.8339844f, -1.0866699f, -0.88793945f, -1.0917969f, -0.83251953f, -0.79467773f, -0.45751953f, -0.25830078f, 0.43041992f, 1.1853027f, 1.7946777f, 2.3452148f, 2.0378418f, + 4.881592f, 2.1987305f, 0.6430664f, -0.15478516f, -0.36206055f, -0.4753418f, -0.5410156f, -0.1965332f, -0.072753906f, -0.10888672f, -0.5263672f, -0.8588867f, -0.94506836f, -0.99487305f, -1.1523438f, -1.3347168f, + -0.5546875f, 2.1118164f, 2.2026367f, 0.70703125f, -0.21142578f, 0.8679199f, 1.1367188f, 1.012207f, 0.9904785f, 1.2463379f, 0.21801758f, -1.9433594f, -2.9155273f, -2.2661133f, -0.97631836f, -1.6257324f, + -0.80908203f, 1.0163574f, 1.546875f, 2.0847168f, 1.9309082f, 1.6364746f, 1.057373f, 1.1618652f, 0.76049805f, 0.29858398f, -0.46484375f, -1.0957031f, -1.6264648f, -2.0043945f, -2.5080566f, -2.9853516f, + -0.29760742f, -1.7080078f, -1.5229492f, 1.3574219f, 4.701172f, 1.6962891f, 4.1030273f, -0.4194336f, -1.0739746f, -1.0820312f, 0.4255371f, -1.0825195f, -1.3613281f, -1.1777344f, -1.3232422f, -1.2341309f, + 1.7912598f, 1.7314453f, 1.8457031f, 2.1989746f, 1.9145508f, 1.0024414f, 0.51538086f, 0.44506836f, -0.075683594f, -0.5439453f, -1.1616211f, -1.5820312f, -1.8642578f, -1.9123535f, -2.0385742f, -2.2666016f, + -0.03100586f, -1.7485352f, -1.767334f, -1.9833984f, -1.4570312f, -0.84716797f, -0.50390625f, 0.040771484f, 0.43554688f, 0.62402344f, 0.9133301f, 1.4772949f, 1.7192383f, 1.2922363f, 0.80029297f, 1.0356445f, + -1.1809082f, -2.032959f, -2.0617676f, -1.9443359f, -1.6447754f, -0.8874512f, 3.0722656f, 2.6242676f, 2.3166504f, 3.4455566f, 1.090332f, -0.19970703f, -0.23510742f, -0.6906738f, -0.40576172f, -1.2653809f, + -2.2512207f, -1.9179688f, -2.1035156f, -2.3461914f, -2.14917f, -1.1347656f, -0.56689453f, 0.8166504f, 1.857666f, 2.114502f, 1.755127f, 1.9160156f, 1.6611328f, 1.1904297f, 0.8239746f, 0.33398438f, + 0.8227539f, 2.0544434f, 2.3171387f, 0.90234375f, 0.515625f, 1.0241699f, 0.6188965f, 0.296875f, -0.171875f, -0.6345215f, -1.2004395f, -1.1652832f, -1.1635742f, -1.2021484f, -1.3903809f, -1.6240234f, + 1.2287598f, 1.5820312f, 1.2756348f, 0.6843262f, 0.33911133f, 0.09472656f, -0.26733398f, -0.4711914f, -0.3137207f, -0.19116211f, -0.56884766f, -0.67944336f, -0.5612793f, -0.55444336f, -0.69506836f, -0.90234375f, + 1.5776367f, 2.6791992f, 2.3059082f, 1.375f, 0.7619629f, 0.08251953f, -0.6166992f, -0.8574219f, -1.0148926f, -1.0390625f, -1.0976562f, -0.8730469f, -0.7844238f, -0.7331543f, -0.7426758f, -1.0231934f, + -2.173584f, -1.3400879f, -0.8208008f, -0.95996094f, -0.6999512f, -0.010253906f, -0.19384766f, 0.25561523f, 0.3786621f, 0.72998047f, 0.4699707f, 0.4416504f, 0.49975586f, 0.9416504f, 1.4606934f, 1.0205078f, + -0.2631836f, 1.3510742f, 1.3837891f, 2.0864258f, 1.8503418f, 1.8864746f, 0.8581543f, 0.5866699f, 0.103759766f, -0.9616699f, -1.8740234f, -2.5600586f, -1.1362305f, -0.9301758f, -1.4404297f, -0.94091797f, + 2.7443848f, 0.5695801f, -0.21679688f, -0.6513672f, -0.14672852f, 0.5019531f, 0.23754883f, -0.19091797f, -0.27685547f, -0.15332031f, -0.31201172f, -0.35742188f, -0.2529297f, -0.25024414f, -0.62646484f, -0.61816406f, + 0.045898438f, 0.24243164f, 0.36865234f, 0.9145508f, 0.96777344f, 1.0041504f, 0.9550781f, 0.9213867f, 0.7089844f, 0.4296875f, -0.1328125f, -0.5522461f, -0.9333496f, -1.2285156f, -1.607666f, -2.1037598f, + 4.209961f, 1.2607422f, -0.85791016f, -1.416748f, -1.4013672f, -0.8574219f, -1.0410156f, -1.4523926f, -1.7346191f, -1.7731934f, -1.5373535f, -1.026123f, 0.8515625f, 0.21533203f, 2.2263184f, 4.3342285f, + 4.5341797f, 4.130371f, 2.7658691f, 2.1801758f, 0.90478516f, 0.5617676f, -0.1303711f, -1.1745605f, -1.5371094f, -1.5292969f, -1.6901855f, -1.7126465f, -1.7119141f, -1.7536621f, -1.8623047f, -1.9750977f, + 0.6777344f, 2.2624512f, 1.1889648f, -0.5876465f, -0.81347656f, 0.38916016f, 0.11694336f, 0.15283203f, -0.5698242f, -0.5168457f, -0.41845703f, -0.3544922f, -0.46191406f, -0.24804688f, -0.14038086f, -0.6772461f, + -1.3227539f, -0.38085938f, 0.23852539f, 0.76123047f, 1.0078125f, 1.1433105f, 0.9753418f, 0.7734375f, 0.32373047f, 0.08959961f, -0.19482422f, -0.43603516f, -0.5715332f, -0.6135254f, -0.7351074f, -1.0581055f, + -1.3225098f, -1.4675293f, -1.3000488f, -0.59375f, 0.022705078f, 0.57299805f, 0.5710449f, 0.36547852f, 0.5119629f, 0.77685547f, 0.623291f, 0.43408203f, 0.41210938f, 0.5258789f, 0.2434082f, -0.37597656f, + 2.3742676f, 3.3117676f, 3.0449219f, 2.4208984f, 1.2329102f, 0.63793945f, 0.32666016f, 0.15161133f, -0.25610352f, -1.0283203f, -1.7250977f, -1.9707031f, -2.0761719f, -2.1174316f, -2.1105957f, -2.2165527f, + 0.87109375f, 0.5085449f, 0.19018555f, -0.10913086f, -0.36328125f, -0.3725586f, -0.4946289f, -0.38671875f, -0.38183594f, -0.21801758f, -0.2331543f, -0.088378906f, 0.0234375f, 0.24194336f, 0.40649414f, 0.40600586f, + 1.0517578f, 0.5126953f, 0.23608398f, 0.31835938f, 0.3605957f, 0.39941406f, 0.38012695f, 0.50390625f, 0.54541016f, 0.37329102f, -0.24731445f, -0.5891113f, -0.6791992f, -0.7324219f, -1.0258789f, -1.407959f, + -0.66625977f, 1.7709961f, 1.2971191f, 0.15283203f, -1.0664062f, -0.7583008f, 0.16821289f, 0.5007324f, 0.35058594f, 0.14086914f, 0.5217285f, -0.13452148f, -1.2158203f, -0.34375f, 0.033447266f, -0.751709f, + 3.684082f, 3.3139648f, 2.0878906f, 1.1911621f, 0.607666f, 0.1472168f, 0.15258789f, 0.10083008f, -0.2355957f, -0.45239258f, -1.2746582f, -1.7348633f, -1.8305664f, -1.8266602f, -1.8925781f, -2.03833f, + 0.5786133f, 0.7692871f, 0.4777832f, 0.05493164f, -0.12597656f, -0.08227539f, -0.095703125f, 0.05444336f, 0.19848633f, 0.3190918f, 0.030273438f, -0.06738281f, -0.17138672f, -0.2854004f, -0.59375f, -1.0615234f, + -0.98413086f, 1.059082f, 2.3671875f, 2.3381348f, 2.529541f, 2.1052246f, 1.887207f, 1.2434082f, 0.54956055f, -0.12646484f, -0.9199219f, -1.6921387f, -2.3168945f, -2.5715332f, -2.6733398f, -2.7949219f, + 2.5153809f, 3.854248f, 2.8759766f, 1.9558105f, -0.30126953f, -1.3845215f, -1.4958496f, -1.2636719f, -1.1201172f, -0.84887695f, -1.1677246f, -0.63061523f, -0.4970703f, -0.76904297f, -0.72998047f, -0.9926758f, + 0.4025879f, 2.572998f, 3.1643066f, 2.5009766f, 1.3688965f, -0.08691406f, -0.63500977f, -0.119140625f, 0.0073242188f, -0.5070801f, -0.7023926f, -2.0339355f, -2.0788574f, -1.8864746f, -0.9301758f, -1.0368652f, + 2.1965332f, 1.2878418f, 0.50878906f, -0.119140625f, -0.49267578f, -0.6008301f, -0.75219727f, -0.56518555f, -0.5427246f, -0.4038086f, -0.43408203f, -0.28198242f, -0.13745117f, 0.06958008f, 0.14331055f, 0.1237793f, + 0.5012207f, 2.1748047f, 1.7189941f, 0.1274414f, -0.2644043f, 0.46875f, 0.37963867f, 0.7302246f, 0.23413086f, 0.41845703f, -0.7944336f, -0.8984375f, -0.6816406f, -1.0744629f, -1.190918f, -1.8496094f, + -2.3083496f, -2.19458f, -2.2111816f, -2.4804688f, -2.3293457f, -1.651123f, -1.3820801f, -0.78125f, -0.14477539f, 0.8547363f, 1.6848145f, 2.4699707f, 2.5429688f, 2.793457f, 2.9118652f, 2.2253418f, + 1.7553711f, 2.8996582f, 1.9260254f, 0.40551758f, -0.0234375f, 0.44506836f, 0.31152344f, 0.1809082f, -0.47607422f, -0.4807129f, -1.204834f, -1.3293457f, -1.2412109f, -1.0134277f, -0.89501953f, -1.2602539f, + 0.2253418f, 2.2539062f, 2.265625f, 0.57128906f, -0.7661133f, -0.6245117f, 0.21313477f, 1.2248535f, 0.8737793f, -0.12524414f, -0.9609375f, -2.416504f, -1.1223145f, -0.70532227f, -0.31469727f, -0.592041f, +}; + +const float ivas_sns_cdbk_tcx20_stage2[ 64 * 16 ] = +{ + -1.1569824f, -0.4765625f, 0.008056641f, 0.47802734f, 0.38330078f, -0.075683594f, -0.3737793f, -0.29516602f, -0.1352539f, 0.012939453f, 0.22241211f, 0.375f, 0.31689453f, 0.20874023f, 0.2541504f, 0.25439453f, + -0.40600586f, -0.22070312f, -0.04272461f, 0.15893555f, -0.25195312f, -0.6623535f, -0.27172852f, 0.28735352f, 0.35742188f, 0.20166016f, 0.052246094f, -0.3647461f, -0.4506836f, 0.1862793f, 0.66796875f, 0.7585449f, + 0.02734375f, -0.2097168f, -0.39819336f, -0.54296875f, -0.46850586f, -0.25146484f, -0.26953125f, -0.07495117f, 0.375f, 0.9343262f, 0.91625977f, 0.4267578f, 0.026123047f, -0.15576172f, -0.11425781f, -0.22021484f, + 0.011230469f, 0.37573242f, 0.8432617f, 0.7006836f, 0.5830078f, -0.49658203f, -0.84155273f, -0.46069336f, -0.16894531f, -0.006591797f, -0.075683594f, -0.2253418f, -0.2097168f, -0.12719727f, 0.006591797f, 0.092041016f, + 0.42382812f, 0.19360352f, 0.076171875f, 0.44091797f, 0.11401367f, -0.39819336f, -0.12207031f, 0.34960938f, 0.51660156f, -0.024902344f, -0.5324707f, -0.068359375f, 0.5083008f, -0.06591797f, -0.68359375f, -0.7277832f, + -0.12182617f, 0.15332031f, 0.3022461f, 0.23754883f, 0.2722168f, 0.8046875f, 0.76831055f, 0.28808594f, -0.05493164f, -0.29711914f, -0.45629883f, -0.42944336f, -0.42871094f, -0.4416504f, -0.35107422f, -0.24536133f, + -0.19873047f, -0.010253906f, -0.030517578f, -0.041748047f, 0.052490234f, 0.07446289f, 0.026123047f, -0.026611328f, 0.18579102f, 0.22485352f, 0.1965332f, 0.1538086f, 0.044677734f, -0.111328125f, -0.24853516f, -0.29052734f, + 0.7648926f, 0.47973633f, 0.31347656f, 0.1496582f, 0.23242188f, 0.16918945f, 0.05859375f, -0.12548828f, -0.18017578f, -0.19555664f, -0.17138672f, -0.19165039f, -0.23510742f, -0.3330078f, -0.37939453f, -0.3564453f, + -0.6201172f, -0.2915039f, -0.15234375f, 0.15966797f, 0.41430664f, 0.61206055f, 0.4453125f, 0.19360352f, -0.107666016f, -0.40429688f, -0.10424805f, 0.40649414f, 0.37817383f, -0.012939453f, -0.3857422f, -0.53100586f, + -0.6376953f, -0.01953125f, 0.32958984f, -0.27905273f, -0.21191406f, 0.8327637f, 0.28515625f, -0.31225586f, -0.4375f, -0.34204102f, -0.010498047f, 0.0546875f, 0.099365234f, 0.114746094f, 0.22973633f, 0.30444336f, + -0.76538086f, -0.5390625f, -0.38330078f, -0.39501953f, -0.21923828f, 0.19311523f, 0.1899414f, -0.08642578f, -0.044921875f, 0.13500977f, 0.4543457f, 0.6777344f, 0.5891113f, 0.30078125f, 0.04321289f, -0.14990234f, + 0.34838867f, -0.21826172f, 0.018066406f, 0.06689453f, 0.40063477f, 0.34570312f, -0.548584f, -0.86035156f, -0.24023438f, 0.60668945f, 0.22363281f, -0.05053711f, 0.13916016f, 0.02709961f, -0.07470703f, -0.18383789f, + 0.13842773f, 0.05444336f, 0.20629883f, -0.11450195f, -0.77563477f, -0.57543945f, 0.7011719f, 0.20117188f, -0.33984375f, 0.18481445f, 0.38232422f, -0.2097168f, -0.040771484f, 0.13476562f, 0.0769043f, -0.024658203f, + -0.24829102f, -0.47998047f, -0.7248535f, -0.64575195f, -0.2529297f, 0.43725586f, 0.6335449f, 0.6464844f, 0.53930664f, 0.33398438f, 0.13891602f, 0.30639648f, 0.3293457f, -0.07446289f, -0.3918457f, -0.54711914f, + -0.043945312f, -0.5168457f, -0.3779297f, 0.67089844f, 0.2548828f, -0.4663086f, -0.5402832f, -0.22338867f, 0.092285156f, 0.016845703f, 0.24780273f, 0.46850586f, 0.49902344f, 0.2734375f, -0.0925293f, -0.26245117f, + 0.014892578f, 0.3540039f, 0.35229492f, -0.13085938f, -0.49829102f, -0.52563477f, -0.05883789f, 0.024658203f, -0.29492188f, -0.4638672f, -0.17333984f, 0.3791504f, 0.47314453f, 0.29516602f, 0.19165039f, 0.060791016f, + -0.21264648f, -0.875f, -0.82958984f, -0.5048828f, -0.31835938f, -0.1430664f, 0.19580078f, 0.29174805f, 0.28637695f, 0.15356445f, 0.16894531f, 0.2241211f, 0.27734375f, 0.31835938f, 0.4091797f, 0.55810547f, + -1.2670898f, 0.016845703f, 0.36254883f, 0.65893555f, 0.59814453f, 0.49389648f, 0.18041992f, 0.1821289f, 0.15942383f, -0.016357422f, -0.18847656f, -0.36547852f, -0.3413086f, -0.2553711f, -0.14868164f, -0.06958008f, + 0.10644531f, 0.7878418f, 0.09643555f, -0.5786133f, -0.40966797f, 0.07055664f, 0.39819336f, 0.31030273f, 0.10986328f, 0.14013672f, 0.2680664f, 0.32861328f, 0.04296875f, -0.39648438f, -0.6052246f, -0.66967773f, + -0.49658203f, 0.26416016f, 0.657959f, 0.41137695f, 0.28881836f, 0.22338867f, 0.15527344f, -0.08325195f, -0.118652344f, 0.08544922f, 0.2841797f, 0.15258789f, -0.18554688f, -0.48388672f, -0.5810547f, -0.5734863f, + 0.22314453f, 0.37402344f, 0.2163086f, -0.5078125f, -0.95703125f, -1.1442871f, -0.35302734f, 0.68359375f, 0.67089844f, 0.31811523f, 0.12792969f, -0.15478516f, -0.0026855469f, 0.18237305f, 0.16870117f, 0.15429688f, + 0.26464844f, -0.11401367f, -0.106933594f, 0.26538086f, 0.51660156f, 0.5373535f, 0.35888672f, 0.16870117f, 0.20825195f, 0.2409668f, 0.14013672f, -0.0546875f, -0.3334961f, -0.58691406f, -0.74243164f, -0.7624512f, + 0.73779297f, -0.14477539f, -0.37646484f, -0.1003418f, 0.1027832f, 0.14160156f, 0.06738281f, -0.05444336f, -0.016357422f, -0.0234375f, -0.022216797f, -0.049316406f, -0.061035156f, -0.10864258f, -0.09057617f, -0.0017089844f, + 1.0466309f, 0.6826172f, 0.1315918f, -0.21020508f, -0.104003906f, -0.21191406f, -0.3256836f, -0.4729004f, -0.59765625f, -0.50805664f, -0.2043457f, 0.033935547f, 0.115722656f, 0.09423828f, 0.18017578f, 0.34960938f, + -0.9074707f, -0.25634766f, 0.14331055f, 0.03515625f, -0.076171875f, -0.1340332f, -0.0073242188f, 0.20922852f, 0.40063477f, 0.5883789f, 0.64868164f, 0.50024414f, 0.19238281f, -0.22338867f, -0.47998047f, -0.6333008f, + 0.40429688f, 0.021972656f, 0.059814453f, 0.5866699f, 1.2155762f, 0.35351562f, -0.17480469f, -0.0703125f, -0.09448242f, -0.24975586f, -0.39672852f, -0.3347168f, -0.3479004f, -0.38671875f, -0.36743164f, -0.21948242f, + 0.71850586f, -0.052246094f, -0.3918457f, -0.13745117f, 0.13793945f, 0.20458984f, 0.13623047f, -0.15039062f, -0.22436523f, -0.2446289f, 0.12158203f, 0.58496094f, 0.5527344f, -0.028320312f, -0.60180664f, -0.6254883f, + 0.007080078f, 0.32910156f, 0.41210938f, 0.033203125f, -0.2097168f, -0.06665039f, -0.15307617f, 0.020507812f, 0.33203125f, 0.8874512f, 0.7089844f, -0.4128418f, -0.71484375f, -0.4958496f, -0.29223633f, -0.38476562f, + -0.84765625f, 0.3466797f, 0.107910156f, -0.3659668f, -0.48583984f, -0.41552734f, -0.38232422f, -0.26953125f, 0.019042969f, 0.25219727f, 0.40039062f, 0.3984375f, 0.38427734f, 0.29785156f, 0.29589844f, 0.26391602f, + 0.47680664f, -0.0056152344f, -0.15307617f, -0.33764648f, -0.30737305f, 0.24511719f, 0.8847656f, 0.61035156f, -0.32861328f, -0.6430664f, -0.43823242f, -0.1899414f, -0.12475586f, -0.084228516f, 0.111328125f, 0.28393555f, + 1.0576172f, -0.23535156f, -0.9638672f, -0.84716797f, 0.3137207f, 1.1804199f, 0.7871094f, 0.14257812f, -0.018798828f, -0.21801758f, -0.20703125f, -0.11816406f, -0.10449219f, -0.16210938f, -0.3491211f, -0.25708008f, + -0.028564453f, -0.43652344f, -0.20336914f, 0.13623047f, 0.17822266f, 0.2175293f, -0.026367188f, -0.4050293f, -0.6472168f, -0.670166f, -0.26391602f, 0.3864746f, 0.685791f, 0.53808594f, 0.29077148f, 0.24853516f, + -0.32836914f, -0.09106445f, -0.11254883f, -0.34277344f, -0.5786133f, -0.5319824f, -0.45410156f, -0.34716797f, -0.2163086f, -0.1862793f, -0.09448242f, 0.14550781f, 0.32739258f, 0.6513672f, 1.0861816f, 1.0732422f, + 0.17163086f, 0.26391602f, 0.19165039f, 0.028320312f, -0.05517578f, 0.14355469f, 0.09057617f, 0.03125f, -0.20532227f, -0.36889648f, -0.58569336f, -0.7468262f, -0.75634766f, -0.04272461f, 0.84814453f, 0.9921875f, + 0.61376953f, -0.18969727f, -0.4868164f, -0.45410156f, -0.42089844f, -0.39868164f, -0.34399414f, -0.25610352f, -0.104003906f, 0.11791992f, 0.3408203f, 0.4416504f, 0.40942383f, 0.31689453f, 0.22802734f, 0.18603516f, + -0.5876465f, 0.19213867f, 0.30737305f, 0.46264648f, 0.37817383f, 0.08276367f, -0.36279297f, -0.51904297f, -0.53125f, -0.42382812f, -0.27075195f, -0.15063477f, -0.026611328f, 0.21655273f, 0.5439453f, 0.6879883f, + -0.5786133f, -0.046875f, 0.0390625f, -0.026123047f, 0.034423828f, -0.28442383f, -0.5217285f, 0.07299805f, 0.7167969f, 0.84106445f, -0.34570312f, -0.3466797f, 0.25512695f, 0.31958008f, 0.12207031f, -0.2512207f, + -0.19604492f, 0.11645508f, 0.17895508f, 0.2697754f, 0.4050293f, 0.2927246f, 0.09667969f, -0.12817383f, -0.14550781f, -0.1706543f, -0.16308594f, -0.13354492f, -0.11376953f, -0.14282227f, -0.12866211f, -0.037353516f, + -0.2084961f, -0.2878418f, -0.23657227f, -0.11816406f, 0.016357422f, 0.059326172f, 0.067871094f, -0.033447266f, -0.013427734f, 0.0029296875f, 0.068603516f, 0.12548828f, 0.14624023f, 0.11279297f, 0.11254883f, 0.18530273f, + -0.13549805f, 1.1516113f, 0.5197754f, -0.064453125f, -0.2409668f, -0.1274414f, -0.021484375f, -0.07104492f, -0.095458984f, -0.11987305f, -0.12573242f, -0.18701172f, -0.20874023f, -0.21459961f, -0.08081055f, 0.021484375f, + -0.33520508f, -0.6520996f, -0.2927246f, 0.8496094f, 0.6022949f, 0.35229492f, 0.1484375f, 0.06347656f, -0.13232422f, -0.390625f, -0.41137695f, -0.27294922f, -0.1694336f, -0.027832031f, 0.18310547f, 0.48510742f, + 0.22802734f, 0.8112793f, 0.25610352f, -0.5793457f, 0.18774414f, 0.74902344f, 0.122802734f, -0.38842773f, -0.57714844f, -0.842041f, -0.97314453f, -0.74975586f, 0.20605469f, 1.4348145f, 0.22973633f, -0.115722656f, + -0.103759766f, 0.055664062f, -0.29663086f, -0.3864746f, -0.36743164f, -0.38549805f, -0.22802734f, -0.19311523f, -0.11816406f, -0.11645508f, 0.2578125f, 1.0197754f, 1.0957031f, 0.7624512f, -0.19189453f, -0.8034668f, + 0.31860352f, -0.32495117f, -0.25756836f, 0.4501953f, 0.74731445f, 0.26293945f, -0.5578613f, -0.6347656f, 0.056152344f, 1.1223145f, 0.27783203f, -0.8347168f, -0.96850586f, -0.2019043f, 0.5266113f, 0.018798828f, + 0.2434082f, 0.05126953f, -0.16088867f, -0.2434082f, -0.15234375f, 0.037353516f, 0.06982422f, -0.015136719f, -0.607666f, 0.14428711f, 0.94433594f, 0.37109375f, -0.3083496f, -0.34765625f, -0.12060547f, 0.09448242f, + 0.13427734f, 0.47021484f, -0.4387207f, -0.8562012f, -0.6101074f, -0.10913086f, 0.1430664f, 0.18334961f, 0.103759766f, -0.034423828f, -0.06738281f, 0.036376953f, 0.12670898f, 0.18603516f, 0.33496094f, 0.39697266f, + 1.0314941f, -0.5073242f, 0.050048828f, 0.31860352f, -0.055908203f, -0.6105957f, -0.31860352f, -0.056396484f, 0.072753906f, 0.056884766f, -0.053466797f, -0.06933594f, -0.08666992f, -0.038330078f, 0.047851562f, 0.21875f, + 0.47192383f, 0.58447266f, 0.6154785f, -0.078125f, -0.6315918f, -0.92626953f, -0.89501953f, -0.46069336f, -0.14819336f, -0.03125f, 0.046142578f, 0.14086914f, 0.12646484f, 0.25390625f, 0.47753906f, 0.4543457f, + -1.1186523f, -0.5427246f, -0.36108398f, -0.13378906f, -0.0048828125f, 0.2939453f, 0.45581055f, 0.3972168f, 0.2421875f, -0.18725586f, -0.576416f, -0.25805664f, 0.115722656f, 0.517334f, 0.6699219f, 0.4909668f, + -0.8635254f, -0.1977539f, -0.067871094f, -0.060058594f, 0.08251953f, 0.5378418f, 0.0007324219f, -0.067871094f, -0.0053710938f, 0.513916f, 0.42993164f, -0.3544922f, -0.6711426f, -0.15454102f, 0.5522461f, 0.3256836f, + 0.62231445f, 0.44702148f, 0.3725586f, 0.15454102f, -0.13916016f, -0.40576172f, -0.49829102f, -0.3881836f, -0.13867188f, 0.2355957f, 0.5095215f, 0.3972168f, 0.0793457f, -0.22802734f, -0.44213867f, -0.5776367f, + -0.64086914f, 0.17944336f, 1.0073242f, 0.46972656f, -0.33007812f, -0.33569336f, -0.016357422f, -0.064208984f, -0.08105469f, -0.14916992f, -0.05444336f, 0.016845703f, -0.010009766f, -0.08911133f, -0.012207031f, 0.10961914f, + 0.47485352f, -0.13232422f, 0.21044922f, 0.36645508f, -0.11303711f, -0.8552246f, -0.7819824f, 0.8149414f, 1.0595703f, -0.46044922f, -0.359375f, -0.04296875f, -0.21948242f, -0.24584961f, 0.037353516f, 0.24707031f, + 0.28710938f, -0.68530273f, 0.22631836f, 0.119384766f, -0.17114258f, -0.29833984f, 0.33618164f, 0.49438477f, 0.4248047f, 0.171875f, 0.20385742f, 0.08935547f, -0.20922852f, -0.38671875f, -0.3569336f, -0.24584961f, + 0.33544922f, 0.27172852f, 0.040283203f, -0.072509766f, -0.008544922f, -0.095458984f, -0.19897461f, -0.2980957f, -0.17480469f, -0.12133789f, -0.060791016f, 0.012451172f, 0.087890625f, 0.059814453f, 0.068115234f, 0.1550293f, + 1.1574707f, 0.5593262f, -0.16137695f, -0.44140625f, -0.38305664f, -0.24731445f, -0.0056152344f, 0.10961914f, 0.21948242f, 0.22314453f, -0.0036621094f, -0.20166016f, -0.27416992f, -0.28295898f, -0.21240234f, -0.055419922f, + -0.75561523f, -0.84399414f, -0.079589844f, 0.29614258f, 0.24389648f, 0.3671875f, 0.5605469f, 0.3630371f, 0.26220703f, 0.17895508f, 0.06274414f, -0.052734375f, -0.14526367f, -0.21069336f, -0.1550293f, -0.091796875f, + 0.32055664f, 0.47436523f, 0.56640625f, 0.517334f, 0.42260742f, 0.2890625f, 0.12719727f, -0.23291016f, -0.5283203f, -0.7036133f, -0.6333008f, -0.40454102f, -0.23364258f, -0.1628418f, -0.011962891f, 0.19335938f, + -0.05493164f, 0.5136719f, 0.30395508f, 0.49072266f, 0.3581543f, -0.09301758f, -0.38183594f, -0.4338379f, -0.57299805f, -0.4794922f, -0.17651367f, 0.42651367f, 0.56103516f, 0.28149414f, -0.22875977f, -0.51416016f, + 0.2709961f, -0.26635742f, -0.44995117f, -0.079589844f, 0.21728516f, 0.43017578f, 0.4206543f, 0.47827148f, 0.58691406f, 0.27612305f, -0.26391602f, -0.65771484f, -0.67944336f, -0.3935547f, -0.11791992f, 0.2277832f, + -0.80078125f, 0.18066406f, 0.12036133f, -0.39575195f, -0.60009766f, -0.13134766f, 0.77685547f, 0.5834961f, 0.4248047f, 0.15820312f, 0.08520508f, -0.060058594f, -0.1652832f, -0.17700195f, -0.0234375f, 0.023925781f, + 0.28100586f, 0.4013672f, 0.5695801f, 0.1394043f, -0.20532227f, -0.18286133f, 0.40698242f, 0.703125f, 0.54907227f, 0.09301758f, -0.47631836f, -0.62597656f, -0.4975586f, -0.39160156f, -0.41259766f, -0.3515625f, + 0.3227539f, -1.0678711f, -1.1435547f, 0.068603516f, 0.7546387f, 0.38745117f, 0.09008789f, -0.0007324219f, -0.12792969f, 0.076416016f, 0.24853516f, 0.28735352f, 0.076660156f, -0.041748047f, -0.01977539f, 0.08911133f, + 0.6101074f, -0.22070312f, -0.5324707f, -0.119384766f, 0.10473633f, 0.16333008f, -0.15112305f, -0.34472656f, -0.39746094f, -0.43652344f, -0.23876953f, 0.0017089844f, 0.056152344f, 0.22973633f, 0.50024414f, 0.7751465f, +}; + +const float ivas_sns_cdbk_tcx20_stage3[ 32 * 16 ] = +{ + -0.12109375f, -0.32348633f, -0.25976562f, 0.21435547f, 0.4814453f, 0.14819336f, -0.22363281f, -0.31030273f, -0.13256836f, 0.10107422f, 0.33276367f, 0.32495117f, 0.16577148f, -0.079833984f, -0.16210938f, -0.15527344f, + 0.088378906f, -0.0146484375f, -0.13378906f, -0.29003906f, 0.873291f, -0.3125f, -0.19384766f, 0.19311523f, -0.09863281f, 0.052734375f, -0.13110352f, -0.021972656f, -0.07861328f, -0.01977539f, -0.07373047f, 0.1616211f, + -0.115722656f, 0.28100586f, 0.2697754f, -0.10522461f, -0.107910156f, -0.2866211f, -0.36694336f, -0.33862305f, -0.15844727f, 0.01928711f, 0.17382812f, 0.21118164f, 0.2697754f, 0.17260742f, 0.07299805f, 0.009033203f, + 0.08154297f, 0.037841797f, -0.25878906f, -0.30444336f, -0.064208984f, 0.1303711f, 0.36669922f, 0.39916992f, 0.3400879f, 0.14331055f, -0.01171875f, -0.12060547f, -0.17041016f, -0.23071289f, -0.20825195f, -0.13012695f, + -0.024902344f, -0.6298828f, 0.7861328f, -0.010986328f, -0.12695312f, -0.08618164f, 0.022705078f, 0.049316406f, 0.004638672f, -0.13647461f, -0.09863281f, 0.0f, 0.06518555f, 0.014404297f, 0.060546875f, 0.111083984f, + -0.39404297f, 0.16821289f, 0.28564453f, -0.08666992f, -0.16088867f, 0.052246094f, 0.26000977f, 0.057128906f, -0.050048828f, -0.07836914f, 0.016601562f, 0.05883789f, 0.07373047f, -0.03955078f, -0.08520508f, -0.07763672f, + 0.011962891f, -0.114990234f, -0.10229492f, -0.07080078f, 0.009765625f, -0.03125f, -0.15600586f, -0.014892578f, 0.10546875f, -0.040283203f, -0.48095703f, -0.2783203f, 0.5905762f, 0.66137695f, 0.13842773f, -0.22802734f, + 0.48706055f, 0.18286133f, -0.20678711f, -0.17651367f, -0.19750977f, -0.3178711f, -0.2524414f, 0.0087890625f, 0.2866211f, 0.25708008f, 0.18969727f, 0.11694336f, 0.049316406f, -0.05517578f, -0.17700195f, -0.19482422f, + 0.122802734f, -0.09667969f, 0.05444336f, 0.17358398f, 0.22924805f, 0.35229492f, 0.40307617f, 0.031982422f, -0.16064453f, -0.14819336f, -0.103027344f, -0.088134766f, -0.13623047f, -0.23510742f, -0.2434082f, -0.15600586f, + -0.5810547f, -0.0146484375f, -0.43432617f, -0.07397461f, 0.30444336f, 0.36035156f, 0.19213867f, 0.12890625f, 0.13061523f, 0.031982422f, -0.024902344f, -0.059326172f, -0.048583984f, -0.030517578f, 0.03149414f, 0.087646484f, + -0.1171875f, 0.016357422f, 0.15234375f, 0.38916016f, 0.2783203f, -0.007080078f, -0.07373047f, -0.2055664f, -0.30004883f, -0.35839844f, -0.23388672f, -0.033935547f, 0.08520508f, 0.10913086f, 0.125f, 0.17480469f, + -0.107666016f, 0.06274414f, -0.0048828125f, 0.12792969f, -0.023925781f, -0.2199707f, -0.084228516f, 0.34399414f, 0.22753906f, -0.39697266f, -0.32421875f, 0.48779297f, 0.43554688f, -0.15429688f, -0.22436523f, -0.14550781f, + 0.0031738281f, -0.03955078f, 0.06738281f, -0.017822266f, -0.2644043f, 0.30493164f, 0.30200195f, -0.32495117f, -0.5007324f, 0.15478516f, 0.60961914f, 0.15527344f, -0.1899414f, -0.14526367f, 0.017822266f, -0.1315918f, + 0.036621094f, -0.11669922f, -0.33691406f, -0.5373535f, -0.13598633f, 0.3046875f, 0.3215332f, -0.10620117f, -0.1640625f, -0.08569336f, 0.012451172f, 0.10839844f, 0.20117188f, 0.17553711f, 0.15258789f, 0.16967773f, + -0.4362793f, -0.47265625f, -0.16870117f, -0.111083984f, -0.1772461f, -0.1430664f, 0.015136719f, 0.12719727f, 0.13647461f, 0.12988281f, 0.19238281f, 0.22827148f, 0.23266602f, 0.17504883f, 0.14453125f, 0.12768555f, + -0.07495117f, 0.19604492f, 0.13110352f, -0.10131836f, -0.0078125f, -0.18847656f, -0.048828125f, 0.33862305f, 0.2578125f, -0.17089844f, -0.40698242f, -0.28857422f, -0.048339844f, 0.048828125f, 0.14916992f, 0.21459961f, + -0.27734375f, -0.072509766f, 0.26049805f, 0.39038086f, 0.2277832f, 0.020751953f, -0.12109375f, -0.080322266f, 0.171875f, 0.36743164f, 0.107421875f, -0.19311523f, -0.22607422f, -0.20654297f, -0.19799805f, -0.17041016f, + 0.1352539f, 0.40039062f, -0.15649414f, -0.25341797f, 0.31054688f, 0.5410156f, -0.32958984f, -0.42871094f, 0.14794922f, 0.17333984f, -0.17871094f, -0.23730469f, -0.026611328f, -0.013427734f, -0.046142578f, -0.037841797f, + -0.30395508f, 0.12841797f, 0.20825195f, -0.119628906f, -0.3317871f, -0.3190918f, -0.11206055f, 0.10205078f, 0.32470703f, 0.36254883f, 0.2626953f, 0.016113281f, -0.12890625f, -0.16479492f, -0.005126953f, 0.080566406f, + 0.34375f, 0.35888672f, 0.4765625f, 0.13623047f, -0.115722656f, -0.053222656f, 0.080566406f, -0.012207031f, -0.022216797f, -0.09863281f, -0.080566406f, -0.13574219f, -0.18383789f, -0.26123047f, -0.2578125f, -0.17504883f, + 0.01171875f, -0.015625f, 0.2680664f, -0.23461914f, -0.35717773f, 0.6381836f, -0.30664062f, 0.08129883f, -0.05493164f, 0.10058594f, -0.026855469f, -0.10180664f, -0.013671875f, -0.06347656f, 0.00048828125f, 0.07446289f, + -0.1015625f, 0.05053711f, 0.092285156f, 0.038330078f, -0.03491211f, 0.16479492f, 0.0859375f, 0.0036621094f, -0.15454102f, -0.09106445f, 0.026367188f, -0.23950195f, -0.43676758f, -0.27783203f, 0.21850586f, 0.6555176f, + -0.16064453f, 0.032958984f, 0.08325195f, 0.052978516f, -0.041748047f, 0.08959961f, 0.16552734f, 0.057373047f, -0.08154297f, 0.21362305f, 0.048583984f, -0.7026367f, -0.27685547f, 0.51000977f, 0.27197266f, -0.26245117f, + 0.62109375f, 0.00390625f, 0.08081055f, 0.16748047f, 0.08276367f, -0.11254883f, -0.20825195f, -0.3076172f, -0.24926758f, -0.15332031f, 0.0007324219f, 0.087646484f, 0.11303711f, 0.022705078f, -0.068847656f, -0.080322266f, + 0.40844727f, -0.390625f, -0.35473633f, 0.21777344f, 0.21972656f, -0.0107421875f, 0.111328125f, 0.21459961f, 0.1430664f, -0.08935547f, -0.19165039f, -0.2368164f, -0.1340332f, -0.034179688f, 0.030761719f, 0.09667969f, + -0.2199707f, 0.8208008f, -0.32104492f, 0.118896484f, -0.006591797f, -0.1328125f, 0.0078125f, -0.013183594f, -0.05493164f, -0.024414062f, 0.06542969f, -0.0014648438f, -0.055664062f, -0.06762695f, -0.07055664f, -0.044677734f, + -0.14770508f, -0.16967773f, -0.1105957f, 0.6333008f, -0.4025879f, -0.3515625f, 0.29736328f, 0.0859375f, 0.024414062f, -0.07128906f, 0.010253906f, 0.0007324219f, -0.021728516f, 0.01977539f, 0.083496094f, 0.12060547f, + -0.06738281f, 0.030517578f, 0.019042969f, 0.16308594f, 0.16796875f, 0.037109375f, 0.059326172f, 0.07397461f, 0.03540039f, 0.05517578f, 0.06982422f, 0.061523438f, 0.1940918f, 0.20605469f, -0.3178711f, -0.7878418f, + 0.1274414f, -0.040771484f, -0.21704102f, -0.025634766f, 0.012451172f, -0.033203125f, -0.15771484f, 0.052001953f, -0.19165039f, -0.26342773f, 0.032226562f, 0.7976074f, -0.4807129f, -0.21582031f, 0.36499023f, 0.2397461f, + 0.46044922f, 0.21435547f, 0.0847168f, -0.24414062f, -0.49902344f, -0.16577148f, 0.30151367f, 0.049560547f, -0.07470703f, -0.21459961f, -0.13256836f, -0.009277344f, 0.06665039f, 0.029052734f, 0.0390625f, 0.095214844f, + 0.17895508f, -0.31396484f, -0.033203125f, -0.02734375f, -0.0637207f, -0.11791992f, -0.03466797f, 0.0061035156f, 0.07324219f, 0.072753906f, 0.14916992f, 0.13671875f, 0.12524414f, 0.017333984f, -0.08178711f, -0.08618164f, + 0.13330078f, -0.15893555f, -0.22045898f, -0.032226562f, -0.07739258f, -0.25463867f, -0.32299805f, -0.2614746f, 0.039794922f, 0.18554688f, 0.1262207f, -0.04321289f, -0.010498047f, 0.13330078f, 0.31860352f, 0.44506836f, +}; + +const float ivas_sns_cdbk_tcx20_stage4[ 32 * 16 ] = +{ + -0.0056152344f, -0.03955078f, 0.071777344f, 0.26879883f, 0.44140625f, -0.08203125f, -0.20092773f, -0.009277344f, 0.05810547f, -0.06347656f, -0.07910156f, -0.05126953f, -0.07006836f, -0.068847656f, -0.07885742f, -0.09082031f, + -0.011962891f, -0.060302734f, 0.011962891f, 0.049804688f, -0.044677734f, 0.037841797f, 0.099121094f, 0.06274414f, 0.022216797f, -0.09057617f, 0.00390625f, 0.38452148f, 0.1027832f, -0.5292969f, -0.3269043f, 0.28881836f, + -0.3557129f, 0.3815918f, 0.10839844f, 0.08203125f, 0.03149414f, -0.0024414062f, -0.0036621094f, -0.02758789f, -0.03125f, -0.096191406f, -0.09326172f, -0.103515625f, -0.07006836f, 0.008056641f, 0.06616211f, 0.10644531f, + 0.038330078f, 0.022460938f, -0.22070312f, 0.529541f, -0.3540039f, 0.29907227f, -0.16235352f, -0.03955078f, 0.053222656f, -0.07348633f, -0.051513672f, 0.021484375f, 0.04638672f, 0.029541016f, -0.052001953f, -0.08618164f, + 0.075927734f, -0.19604492f, 0.046875f, -0.00048828125f, -0.052978516f, -0.03491211f, 0.19067383f, 0.08520508f, -0.16113281f, -0.29785156f, -0.22558594f, -0.07006836f, 0.053955078f, 0.1550293f, 0.19042969f, 0.2409668f, + 0.08227539f, 0.26464844f, -0.15332031f, -0.140625f, -0.0068359375f, 0.060302734f, -0.05126953f, -0.23339844f, -0.28442383f, -0.14160156f, 0.0793457f, 0.23828125f, 0.20678711f, 0.09716797f, 0.014892578f, -0.032470703f, + 0.20581055f, -0.19702148f, 0.053466797f, 0.026855469f, -0.011962891f, -0.04663086f, -0.11254883f, 0.060058594f, 0.33984375f, 0.33447266f, -0.14257812f, -0.37719727f, -0.21850586f, 0.016845703f, 0.08325195f, -0.013916016f, + 0.34375f, -0.38623047f, -0.06542969f, -0.07348633f, -0.107421875f, 0.037353516f, 0.14477539f, 0.01586914f, 0.0026855469f, 0.08959961f, 0.19433594f, 0.1027832f, -0.03149414f, -0.060058594f, -0.1003418f, -0.10668945f, + 0.12841797f, 0.01953125f, 0.16333008f, 0.22827148f, -0.16015625f, -0.42016602f, -0.19067383f, 0.08642578f, 0.08520508f, -0.022705078f, 0.011230469f, 0.013671875f, -0.0034179688f, 0.019042969f, -0.005859375f, 0.047851562f, + 0.02734375f, 0.008056641f, -0.07470703f, 0.114990234f, 0.0021972656f, -0.41796875f, 0.5605469f, -0.28735352f, 0.022949219f, -0.07739258f, -0.028808594f, 0.1928711f, 0.056152344f, 0.0053710938f, -0.048583984f, -0.055419922f, + -0.037109375f, 0.12939453f, -0.38671875f, -0.095214844f, 0.0021972656f, -0.012451172f, 0.19677734f, 0.2578125f, 0.12670898f, -0.10180664f, -0.087890625f, 0.009521484f, 0.1418457f, 0.14526367f, -0.076660156f, -0.21166992f, + 0.29711914f, 0.06616211f, -0.375f, -0.080566406f, 0.1484375f, -0.0007324219f, -0.020996094f, 0.013427734f, -0.014160156f, -0.11279297f, -0.08081055f, -0.056152344f, -0.13769531f, -0.060546875f, 0.10595703f, 0.30810547f, + -0.025146484f, 0.023925781f, -0.02758789f, -0.0009765625f, 0.08178711f, -0.13452148f, -0.022949219f, 0.6875f, -0.39794922f, -0.123046875f, 0.06738281f, 0.04345703f, -0.053955078f, -0.0146484375f, -0.045410156f, -0.05810547f, + 0.0146484375f, 0.041748047f, -0.024902344f, 0.005126953f, -0.079589844f, -0.04638672f, -0.028320312f, 0.021972656f, -0.11450195f, -0.118896484f, -0.041748047f, -0.001953125f, -0.2783203f, 0.33154297f, 0.64575195f, -0.32543945f, + -0.13989258f, -0.020019531f, 0.3137207f, -0.53271484f, 0.3154297f, 0.037353516f, -0.04272461f, -0.059326172f, -0.05444336f, -0.009765625f, -0.0073242188f, 0.015380859f, 0.0769043f, 0.08251953f, 0.01171875f, 0.013427734f, + -0.049804688f, 0.022949219f, -0.08227539f, -0.08544922f, 0.012451172f, 0.015380859f, -0.2241211f, 0.15625f, -0.19750977f, 0.5703125f, -0.3684082f, 0.072753906f, 0.4711914f, -0.35888672f, 0.14697266f, -0.10205078f, + -0.17138672f, -0.19067383f, -0.21411133f, -0.030517578f, 0.09667969f, -0.087402344f, -0.09643555f, 0.017089844f, 0.08666992f, 0.041503906f, 0.05908203f, 0.034179688f, 0.08129883f, 0.12841797f, 0.12011719f, 0.12548828f, + -0.044921875f, 0.0061035156f, 0.037841797f, 0.017089844f, 0.064453125f, 0.008300781f, -0.20532227f, -0.025146484f, 0.07397461f, 0.06225586f, -0.15991211f, -0.27612305f, 0.44873047f, 0.14111328f, -0.40893555f, 0.26049805f, + -0.14941406f, 0.17773438f, 0.022949219f, -0.125f, 0.00048828125f, 0.19018555f, 0.03857422f, -0.039794922f, 0.09448242f, 0.20214844f, 0.22436523f, 0.111572266f, -0.08081055f, -0.16992188f, -0.25146484f, -0.24633789f, + -0.09350586f, 0.028076172f, -0.04272461f, 0.05419922f, 0.01586914f, -0.16870117f, -0.30395508f, -0.17285156f, 0.0690918f, 0.30541992f, 0.23266602f, -0.09082031f, 0.1340332f, 0.3449707f, 0.036621094f, -0.3486328f, + -0.20019531f, -0.10449219f, 0.041992188f, 0.09350586f, 0.010253906f, 0.04711914f, 0.26342773f, 0.23852539f, 0.13598633f, -0.04296875f, -0.063964844f, -0.13769531f, -0.18164062f, -0.10083008f, -0.033691406f, 0.03491211f, + 0.14648438f, 0.02758789f, 0.33984375f, -0.005126953f, -0.09887695f, 0.04272461f, -0.18652344f, -0.33129883f, -0.14208984f, 0.040039062f, 0.036376953f, -0.072509766f, -0.119628906f, -0.0017089844f, 0.09448242f, 0.23046875f, + 0.23852539f, 0.26513672f, 0.034179688f, 0.04272461f, 0.05053711f, 0.03466797f, 0.12182617f, 0.03930664f, -0.018066406f, -0.095947266f, -0.107666016f, -0.16040039f, -0.17211914f, -0.12524414f, -0.09716797f, -0.05078125f, + -0.08178711f, -0.05126953f, -0.20507812f, 0.115478516f, 0.14453125f, -0.010986328f, -0.16357422f, -0.05102539f, 0.037597656f, 0.24365234f, 0.38452148f, 0.05444336f, -0.40283203f, -0.21972656f, 0.0793457f, 0.12695312f, + -0.2548828f, -0.28222656f, 0.19628906f, 0.2890625f, 0.047851562f, -0.034179688f, 0.012451172f, -0.1159668f, -0.20947266f, -0.08154297f, 0.13427734f, 0.16333008f, 0.07885742f, 0.05078125f, 0.013427734f, -0.0078125f, + -0.067871094f, 0.02368164f, -0.010986328f, -0.037109375f, -0.19140625f, 0.118896484f, -0.020019531f, -0.3955078f, 0.5673828f, -0.02758789f, -0.23950195f, 0.103759766f, -0.04736328f, 0.029785156f, 0.07495117f, 0.118896484f, + 0.095214844f, -0.0078125f, 0.36035156f, -0.075927734f, -0.20385742f, 0.0625f, 0.15332031f, 0.044921875f, 0.0041503906f, -0.13793945f, -0.1472168f, 0.015136719f, 0.17504883f, 0.1105957f, -0.14648438f, -0.30151367f, + 0.063964844f, -0.0234375f, 0.07739258f, -0.24169922f, 0.041015625f, 0.18823242f, -0.43701172f, 0.25976562f, 0.25097656f, -0.37182617f, 0.040771484f, 0.2590332f, 0.0036621094f, -0.044677734f, -0.03173828f, -0.03466797f, + 0.025390625f, 0.09301758f, 0.11328125f, -0.027832031f, -0.0087890625f, -0.0703125f, 0.028320312f, -0.052734375f, -0.1953125f, -0.32617188f, 0.67871094f, -0.07397461f, -0.15039062f, -0.0703125f, -0.02758789f, 0.064697266f, + -0.049560547f, 0.15551758f, -0.016113281f, -0.27661133f, -0.30371094f, -0.13427734f, 0.08203125f, 0.09814453f, 0.07495117f, 0.038330078f, 0.055664062f, -0.00390625f, -0.018554688f, 0.0390625f, 0.10620117f, 0.15283203f, + -0.04321289f, -0.18408203f, -0.045654297f, -0.05029297f, 0.21191406f, 0.5300293f, 0.09716797f, -0.12866211f, -0.09423828f, -0.08666992f, -0.087890625f, -0.09643555f, -0.045166016f, 0.021972656f, -0.013183594f, 0.014160156f, + -0.0017089844f, -0.014160156f, -0.048339844f, -0.037109375f, -0.0949707f, -0.005859375f, 0.48388672f, -0.17480469f, -0.19140625f, 0.5727539f, -0.18920898f, -0.26391602f, 0.0048828125f, 0.067871094f, -0.045654297f, -0.06201172f, +}; + +const float *const ivas_sns_cdbks_tcx20[SNS_MSVQ_NSTAGES_TCX20] = { ivas_sns_cdbk_tcx20_stage1, ivas_sns_cdbk_tcx20_stage2, ivas_sns_cdbk_tcx20_stage3, ivas_sns_cdbk_tcx20_stage4 }; + +const int16_t ivas_sns_cdbks_tcx10_levels[SNS_MSVQ_NSTAGES_TCX10] = { 128, 32, 8 }; + +const int16_t ivas_sns_cdbks_tcx10_bits[SNS_MSVQ_NSTAGES_TCX10] = { 7, 5, 3 }; + +const float ivas_sns_cdbk_tcx10_stage1[ 128 * 16 ] = +{ + 1.0144043f, 1.1826172f, 0.3269043f, -0.6411133f, -1.2163086f, -1.1411133f, -1.1525879f, -0.8898926f, -0.19604492f, 0.7402344f, 1.1782227f, 1.0830078f, 0.78222656f, 0.26953125f, -0.33203125f, -1.0080566f, + -0.38916016f, -0.31347656f, -1.1826172f, -2.036621f, -2.086914f, -1.8569336f, -1.637207f, -1.3156738f, -0.4182129f, 0.50634766f, 1.2770996f, 1.3771973f, 1.8566895f, 2.3503418f, 2.3015137f, 1.5678711f, + 0.43652344f, 1.8859863f, 2.8059082f, 2.2385254f, 1.5480957f, 0.14331055f, 0.07299805f, -1.1218262f, -1.1103516f, -0.7336426f, -0.4194336f, -0.89624023f, -1.0429688f, -0.79785156f, -1.204834f, -1.8046875f, + 1.5612793f, 0.9321289f, 0.58740234f, 0.46313477f, 0.21899414f, 0.0625f, -0.16918945f, -0.34423828f, -0.44726562f, -0.61035156f, -0.6398926f, -0.57177734f, -0.38500977f, -0.25927734f, -0.20898438f, -0.18945312f, + 1.0131836f, 1.9333496f, 0.8395996f, -0.4963379f, -0.66015625f, -0.38012695f, 0.056396484f, 0.31201172f, 0.810791f, 0.66674805f, -0.022705078f, -0.7980957f, -0.9230957f, -0.63134766f, -0.68530273f, -1.034668f, + -0.842041f, -0.08642578f, 0.49243164f, 0.5827637f, 1.1630859f, 1.3693848f, 0.7233887f, 0.2705078f, 0.34692383f, 0.0068359375f, -0.2319336f, -0.33032227f, -0.5895996f, -0.67626953f, -0.9953613f, -1.2033691f, + 2.0810547f, 1.8205566f, 1.1000977f, 0.47216797f, 0.08251953f, -0.48510742f, -0.67285156f, -0.55322266f, -0.4777832f, -0.546875f, -0.579834f, -0.5891113f, -0.5119629f, -0.4255371f, -0.32910156f, -0.38500977f, + 1.730957f, 1.3063965f, 0.53466797f, 0.23144531f, 0.04248047f, 0.0036621094f, 0.0949707f, 0.15942383f, 0.1977539f, 0.19946289f, 0.21899414f, 0.064697266f, -0.43408203f, -0.94750977f, -1.5297852f, -1.8735352f, + 1.6611328f, 2.8601074f, 1.7668457f, -0.12988281f, -0.27978516f, 1.199707f, 1.4865723f, 1.220459f, 0.61865234f, -1.2509766f, -1.5700684f, -1.3425293f, -1.3532715f, -1.3083496f, -1.5671387f, -2.0112305f, + 1.8820801f, 0.6086426f, -0.52319336f, -1.5842285f, -1.2685547f, -0.9067383f, -0.6323242f, -0.203125f, -0.25878906f, 0.091796875f, 0.18286133f, 1.2060547f, 1.0129395f, -0.049560547f, -0.1274414f, 0.5698242f, + 0.60498047f, 1.1367188f, 1.5297852f, 1.9936523f, 1.9726562f, 1.9311523f, 1.7668457f, 1.3752441f, 0.939209f, 0.020019531f, -0.72558594f, -1.3706055f, -2.269043f, -2.7990723f, -3.010254f, -3.0957031f, + -0.9187012f, 0.107177734f, 0.32495117f, -0.051513672f, -0.2746582f, 0.2043457f, 0.8605957f, 0.30737305f, 0.064208984f, -0.1743164f, -0.5998535f, -0.7624512f, -0.10864258f, 0.49975586f, 0.40283203f, 0.118896484f, + 1.0822754f, 0.7507324f, 0.47460938f, 0.00390625f, -0.28881836f, -0.5131836f, -0.62158203f, -0.6550293f, -0.59228516f, -0.42895508f, -0.17675781f, 0.061035156f, 0.119140625f, 0.037109375f, 0.24267578f, 0.5046387f, + -2.3117676f, -1.2453613f, -0.7062988f, -0.83813477f, -0.5036621f, 0.040039062f, 0.6281738f, 0.93115234f, 0.826416f, 0.3791504f, 0.19970703f, -0.023925781f, 0.35913086f, 0.953125f, 0.87280273f, 0.43969727f, + 3.8930664f, 4.2009277f, 3.1296387f, 2.685791f, 2.1108398f, 2.032959f, 0.046142578f, -1.3862305f, -1.6176758f, -1.9997559f, -2.130371f, -2.1767578f, -2.213623f, -2.2236328f, -2.1501465f, -2.201416f, + -1.3452148f, -0.43041992f, 0.38720703f, 1.0549316f, 1.4541016f, 1.6882324f, 1.3688965f, 0.44335938f, -0.037109375f, -0.23144531f, -0.5349121f, -0.7902832f, -0.81152344f, -0.73876953f, -0.6965332f, -0.78027344f, + 2.1210938f, 2.654541f, 2.0202637f, 1.1313477f, 0.42333984f, -0.13598633f, -0.31591797f, -0.38500977f, -0.37548828f, -0.7619629f, -0.9873047f, -1.046875f, -0.9699707f, -0.99975586f, -1.0686035f, -1.3034668f, + 2.0297852f, 0.09301758f, -1.026123f, -1.6860352f, -0.5925293f, 0.7067871f, 1.1433105f, -0.31152344f, -0.8725586f, -0.37524414f, 0.09326172f, -0.4165039f, -0.375f, -0.32592773f, 0.65185547f, 1.2634277f, + 0.49169922f, 1.6848145f, 1.8188477f, 2.048584f, 1.3818359f, 1.3059082f, 0.8100586f, 0.15429688f, -0.40161133f, -1.7539062f, -2.8208008f, -1.5043945f, -0.54663086f, -0.9963379f, -0.7890625f, -0.8833008f, + 0.60131836f, 1.9431152f, 1.1845703f, -0.50927734f, -0.51708984f, 0.7182617f, 0.6542969f, 0.06665039f, -0.48120117f, -0.9313965f, -1.0275879f, -0.9108887f, -0.48168945f, 0.055664062f, 0.17333984f, -0.5378418f, + 0.5378418f, 0.47216797f, 0.17480469f, -0.3022461f, -0.19726562f, -0.030517578f, -0.008544922f, 0.009277344f, -0.033935547f, -0.022705078f, 0.20629883f, 0.45239258f, 0.18237305f, -0.14233398f, -0.50561523f, -0.7922363f, + -2.0576172f, -2.215088f, -1.0456543f, -0.07910156f, 1.4833984f, 1.3276367f, -0.119140625f, -0.638916f, -0.06713867f, 0.8666992f, -0.25634766f, -0.041503906f, 1.1413574f, 1.0339355f, 0.5041504f, 0.16333008f, + 2.7668457f, 2.9187012f, 1.6850586f, 0.47216797f, -0.3696289f, -0.70288086f, -0.7890625f, -1.034668f, -0.8354492f, -0.69262695f, -0.6418457f, -0.70751953f, -0.6467285f, -0.49682617f, -0.49023438f, -0.43530273f, + 0.104003906f, 0.9812012f, 1.1506348f, 0.9128418f, 0.81933594f, 0.8522949f, 0.7446289f, 0.46069336f, 0.31347656f, -0.06542969f, -0.49536133f, -0.85302734f, -1.0515137f, -1.0839844f, -1.2729492f, -1.5166016f, + 0.5107422f, 1.4162598f, 2.0109863f, 2.331787f, 1.6552734f, 0.8979492f, 0.6035156f, 0.2487793f, 0.26049805f, -0.26416016f, -0.7624512f, -1.2497559f, -1.8212891f, -1.807373f, -1.8876953f, -2.1430664f, + 0.23461914f, 0.3942871f, -0.2163086f, -1.0683594f, -1.3544922f, -1.2963867f, -1.2163086f, -1.192627f, -0.8947754f, -0.36083984f, 0.29248047f, 0.6989746f, 1.1608887f, 1.6723633f, 1.8217773f, 1.324707f, + 3.0012207f, 3.3725586f, 2.8825684f, 2.7036133f, 2.4111328f, 2.5178223f, 1.418457f, 0.048583984f, -0.7297363f, -1.8293457f, -2.4519043f, -2.5717773f, -2.6826172f, -2.7434082f, -2.6733398f, -2.673584f, + 0.061035156f, 0.7324219f, 1.2775879f, 0.8625488f, 0.2524414f, 0.092285156f, -0.13500977f, -0.41674805f, -0.52075195f, -0.7026367f, -0.69262695f, -0.5744629f, -0.4494629f, -0.08886719f, 0.17211914f, 0.1303711f, + 2.1413574f, 1.7810059f, 0.7092285f, -0.37304688f, -0.6828613f, -0.54296875f, -0.5942383f, -0.9050293f, -0.97558594f, -0.8232422f, -0.6015625f, -0.57128906f, 0.021484375f, 0.59887695f, 0.5192871f, 0.29882812f, + -1.3076172f, -0.99609375f, -0.7758789f, -0.83374023f, -0.8322754f, -0.72924805f, -0.5461426f, -0.1652832f, 0.4482422f, 1.0227051f, 1.440918f, 1.338623f, 0.89331055f, 0.6164551f, 0.42700195f, -0.0009765625f, + 2.084961f, 3.2036133f, 2.5375977f, 0.7463379f, 0.24682617f, 0.7133789f, 0.46118164f, -0.16430664f, -0.31347656f, -1.1755371f, -1.5986328f, -1.6252441f, -1.3684082f, -1.1738281f, -1.1335449f, -1.440918f, + -0.22070312f, 0.74121094f, 0.9091797f, 0.25f, 0.15161133f, 0.5371094f, 0.74902344f, 1.0612793f, 1.1540527f, 0.22924805f, -0.74438477f, -1.1445312f, -1.0881348f, -0.7956543f, -0.7746582f, -1.0144043f, + 1.8095703f, 2.084961f, 0.859375f, -0.22167969f, -0.49951172f, -0.58496094f, -0.548584f, -0.35595703f, -0.23828125f, 0.018066406f, -0.119384766f, 0.16845703f, 0.03491211f, -0.8540039f, -1.0222168f, -0.53027344f, + -2.2055664f, -2.6103516f, -2.4230957f, -2.2021484f, -0.9482422f, 1.682373f, 2.345459f, 2.1347656f, 1.9140625f, 1.019043f, 0.6623535f, 0.62719727f, 0.85546875f, 0.8095703f, -0.23144531f, -1.4296875f, + 3.0585938f, 3.8530273f, 2.633789f, 0.8532715f, -0.09008789f, -0.52685547f, -0.60375977f, -0.7915039f, -0.861084f, -1.2512207f, -1.3881836f, -1.3081055f, -1.1264648f, -0.88378906f, -0.6906738f, -0.8774414f, + 0.91845703f, 1.7211914f, 0.89575195f, -0.07543945f, -0.3798828f, -0.49023438f, -0.5810547f, -0.57666016f, -0.4921875f, -0.36206055f, -0.23706055f, -0.22924805f, -0.15600586f, 0.03100586f, 0.0703125f, -0.057128906f, + 1.3344727f, 1.2441406f, 0.20483398f, -1.0561523f, -1.0715332f, -0.12084961f, 0.96728516f, 1.5930176f, 1.1330566f, 0.115722656f, -0.45532227f, -0.44140625f, -0.5053711f, -0.8222656f, -0.96972656f, -1.1499023f, + -1.8754883f, -2.5437012f, -2.1186523f, 0.6845703f, 1.7653809f, 3.8078613f, 1.5759277f, -0.59228516f, -0.22167969f, 0.5510254f, 1.770752f, 1.2670898f, -0.85180664f, -1.3605957f, -1.5881348f, -0.27026367f, + 2.5178223f, 2.0725098f, 1.2094727f, 0.30126953f, -0.29370117f, -0.095947266f, 0.45141602f, 0.4663086f, 0.22338867f, -0.5546875f, -1.3134766f, -1.3378906f, -0.842041f, -0.87231445f, -1.0029297f, -0.92944336f, + 2.199707f, 1.7602539f, 1.2255859f, 0.74243164f, 0.45288086f, 0.3161621f, 0.076660156f, -0.23266602f, -0.5065918f, -0.6386719f, -0.6906738f, -0.6977539f, -0.798584f, -0.9692383f, -1.0688477f, -1.1706543f, + 0.3564453f, 1.670166f, 2.1064453f, 0.765625f, 0.767334f, 1.4802246f, 1.4580078f, 0.8364258f, 0.5427246f, -1.2788086f, -1.7922363f, -1.552002f, -1.4414062f, -0.9494629f, -1.151123f, -1.8183594f, + 0.35375977f, -0.44604492f, -1.1108398f, -1.5837402f, -1.3947754f, -0.6669922f, -0.16113281f, 0.10571289f, 0.3190918f, 0.5788574f, 0.6821289f, 0.7907715f, 0.7709961f, 0.59375f, 0.5800781f, 0.58813477f, + 1.2800293f, 2.3510742f, 2.9519043f, 2.9152832f, 2.5854492f, 1.7675781f, 1.0688477f, 0.4387207f, -0.19555664f, -1.513916f, -2.340332f, -2.5202637f, -2.3115234f, -2.1765137f, -2.1308594f, -2.1696777f, + -1.6928711f, -0.26049805f, 0.19189453f, -0.04711914f, 0.061279297f, 0.15258789f, 0.17089844f, 0.10205078f, 0.08691406f, 0.076660156f, 0.039794922f, 0.025878906f, 0.0014648438f, 0.265625f, 0.46240234f, 0.3630371f, + 1.4794922f, 0.9511719f, 0.1184082f, -0.7175293f, -1.15625f, -0.8388672f, 0.068847656f, 0.49609375f, 0.45629883f, -0.12768555f, -0.79907227f, -0.7434082f, -0.20336914f, -0.00390625f, 0.27514648f, 0.74438477f, + -1.628418f, -0.46142578f, 0.087402344f, -0.056152344f, 0.10913086f, 0.58813477f, 0.9543457f, 1.532959f, 1.3303223f, 0.35180664f, -0.21435547f, -0.49267578f, -0.5546875f, -0.34765625f, -0.4658203f, -0.7324219f, + 2.887207f, 4.0615234f, 3.1860352f, 1.532959f, 0.4165039f, 0.19067383f, 0.57055664f, -0.7878418f, -1.2619629f, -1.8005371f, -1.6381836f, -1.4213867f, -1.5876465f, -1.5568848f, -1.2424316f, -1.548584f, + 0.1184082f, 0.16186523f, 0.17089844f, 0.52856445f, 0.48364258f, 0.23583984f, 0.091796875f, 0.4477539f, 0.56103516f, 0.3972168f, 0.27197266f, 0.17138672f, -0.1850586f, -0.74194336f, -1.204834f, -1.5085449f, + 3.7294922f, 2.5002441f, 1.5256348f, 0.701416f, 0.19116211f, 0.07861328f, 0.24267578f, 0.4243164f, 0.23217773f, -0.4404297f, -1.0891113f, -1.3295898f, -1.3798828f, -1.6437988f, -1.8586426f, -1.8840332f, + -1.0793457f, -0.54956055f, -0.53271484f, -0.8959961f, -0.7878418f, -0.50390625f, -0.45898438f, -0.45410156f, -0.14868164f, 0.07495117f, 0.30126953f, 0.5197754f, 0.8623047f, 1.3652344f, 1.3466797f, 0.9406738f, + 0.8203125f, 1.934082f, 2.6530762f, 2.293457f, 1.5932617f, 0.25708008f, 0.46289062f, 0.7038574f, 0.39990234f, -1.3444824f, -1.871582f, -1.7602539f, -1.8720703f, -1.1584473f, -1.3552246f, -1.7556152f, + 0.6022949f, 1.5651855f, 2.024414f, 1.043457f, 0.5551758f, 0.29516602f, -0.059326172f, -0.29589844f, -0.28930664f, -0.6899414f, -0.87158203f, -0.8222656f, -0.8574219f, -0.74438477f, -0.65722656f, -0.7980957f, + 0.7392578f, 1.7915039f, 1.7841797f, 1.0437012f, 0.2434082f, -0.5f, -0.76123047f, -0.9995117f, -0.77856445f, -0.61450195f, -0.4025879f, -0.36132812f, -0.16894531f, 0.123046875f, -0.3190918f, -0.8190918f, + -3.3479004f, -2.8823242f, -1.7409668f, -0.01928711f, 1.5759277f, 1.565918f, -0.14379883f, -1.1428223f, -0.46923828f, 1.5456543f, 0.080566406f, 0.15551758f, 1.5246582f, 1.2470703f, 1.1359863f, 0.9152832f, + 3.6564941f, 2.3999023f, 1.4855957f, 0.71728516f, 0.45483398f, 0.25854492f, -0.13500977f, -0.5534668f, -0.7763672f, -1.0727539f, -1.2416992f, -1.2087402f, -1.0163574f, -1.0344238f, -0.97924805f, -0.9543457f, + -0.26391602f, 0.7937012f, 1.5644531f, 1.7453613f, 1.2094727f, 1.2302246f, 1.0932617f, 1.0627441f, 1.1040039f, 0.16601562f, -1.6494141f, -2.2905273f, -1.9121094f, -1.423584f, -0.94140625f, -1.487793f, + 1.7485352f, 1.9509277f, 1.1413574f, 0.23828125f, 0.20532227f, 0.71972656f, 1.0627441f, 0.84375f, 0.6599121f, 0.11010742f, -0.41723633f, -1.0415039f, -1.4494629f, -1.7270508f, -1.9189453f, -2.126709f, + 1.7670898f, -0.14770508f, -0.9782715f, 0.0007324219f, 2.0344238f, 0.28637695f, -0.53125f, -1.2973633f, -1.4816895f, -1.2402344f, -1.1208496f, -1.1516113f, -0.68237305f, -0.05883789f, 1.3154297f, 3.286377f, + 2.586914f, 3.0708008f, 3.369629f, 2.663086f, 1.8154297f, 0.54467773f, 0.5966797f, 0.45703125f, -0.5554199f, -1.7521973f, -2.234375f, -2.2390137f, -2.147461f, -2.0239258f, -2.0800781f, -2.0722656f, + -0.17993164f, 0.5961914f, 0.1184082f, -0.6855469f, -0.8725586f, -0.7883301f, -0.72094727f, -0.5744629f, -0.20922852f, 0.171875f, 0.41430664f, 0.54711914f, 0.49438477f, 0.564209f, 0.64819336f, 0.4765625f, + 2.9692383f, 1.6333008f, 0.5463867f, -0.6401367f, -1.1271973f, -1.4199219f, -1.4353027f, -1.2783203f, -1.0517578f, -0.7229004f, -0.4267578f, -0.39233398f, 0.44873047f, 0.67211914f, 0.89453125f, 1.3300781f, + -0.7512207f, 0.11035156f, 0.47998047f, -0.0949707f, -0.30981445f, 0.028808594f, 0.04272461f, 0.25756836f, 0.88378906f, 1.1179199f, 0.33569336f, -0.30126953f, -0.36132812f, -0.29223633f, -0.4194336f, -0.7260742f, + 3.871582f, 3.6723633f, 2.5690918f, 1.3596191f, 1.0322266f, 1.0532227f, 0.7524414f, 0.15966797f, -0.42114258f, -1.3811035f, -1.967041f, -2.2060547f, -2.1699219f, -2.125f, -2.0786133f, -2.121582f, + 0.41601562f, 0.4086914f, 0.12915039f, 0.44995117f, 1.0292969f, 1.5f, 1.4731445f, 1.0021973f, 0.53149414f, -0.10473633f, -0.49121094f, -0.6335449f, -1.0283203f, -1.3818359f, -1.5666504f, -1.7338867f, + 1.0354004f, 0.7351074f, -0.04321289f, -0.86328125f, -1.1411133f, -0.89990234f, -0.3876953f, 0.2421875f, 0.7763672f, 0.7036133f, 0.4814453f, 0.25952148f, 0.16503906f, -0.0925293f, -0.35668945f, -0.6142578f, + -2.5014648f, -2.2893066f, -2.4162598f, -2.5559082f, -2.2287598f, -1.3945312f, -0.8725586f, -0.30419922f, 0.30200195f, 1.078125f, 1.8603516f, 1.8320312f, 2.2028809f, 2.7680664f, 2.5114746f, 2.0083008f, + 1.4338379f, 2.6071777f, 2.8693848f, 1.9367676f, 1.357666f, 0.54052734f, 0.0073242188f, -0.39257812f, -0.7956543f, -1.501709f, -1.6374512f, -1.4631348f, -1.3227539f, -1.2058105f, -1.0966797f, -1.3371582f, + 0.41577148f, 0.41992188f, 0.01171875f, -0.041748047f, 0.022460938f, 0.24536133f, 0.36010742f, 0.3203125f, 0.16088867f, -0.055664062f, -0.23950195f, -0.4645996f, -0.37817383f, -0.17480469f, -0.19140625f, -0.4104004f, + 0.1303711f, 1.1894531f, 0.9506836f, -0.5930176f, -1.2092285f, -0.53027344f, 0.7734375f, 0.6401367f, 0.54956055f, 0.3388672f, -0.5241699f, -0.9995117f, -0.2709961f, 0.33789062f, -0.091552734f, -0.69140625f, + -2.5305176f, -1.4348145f, -0.14941406f, 0.8322754f, 1.2192383f, 1.2817383f, 0.94140625f, 0.5319824f, 0.37402344f, 0.31469727f, 0.23120117f, 0.010498047f, -0.21533203f, -0.3239746f, -0.45751953f, -0.6254883f, + 1.7978516f, 2.154541f, 1.6486816f, 0.77490234f, 0.38378906f, 0.24902344f, -0.34985352f, -0.9355469f, -1.130127f, -1.3525391f, -1.317627f, -1.0749512f, -0.7229004f, -0.31201172f, 0.06225586f, 0.12475586f, + 0.8828125f, 0.72802734f, 0.59594727f, 0.3737793f, 0.5258789f, 0.72753906f, 0.43017578f, 0.18725586f, 0.06640625f, -0.23266602f, -0.42578125f, -0.50512695f, -0.5432129f, -0.6281738f, -0.92529297f, -1.2570801f, + 1.46875f, 2.616455f, 2.7822266f, 1.1652832f, 0.45581055f, 1.2355957f, 1.2653809f, 0.935791f, 0.5776367f, -0.87597656f, -2.5498047f, -2.6628418f, -2.2028809f, -1.3466797f, -0.9621582f, -1.9025879f, + 1.5563965f, 0.4855957f, -0.31933594f, -0.8959961f, -1.0634766f, -1.0183105f, -0.9716797f, -0.8378906f, -0.4987793f, -0.14331055f, 0.14428711f, 0.31445312f, 0.6821289f, 0.88623047f, 0.87890625f, 0.8005371f, + 1.9968262f, 2.7993164f, 2.0898438f, 0.9248047f, 0.85009766f, 1.4089355f, 1.6706543f, 1.3681641f, 1.1982422f, 0.33544922f, -0.95288086f, -2.145996f, -2.8188477f, -2.941162f, -2.8947754f, -2.8886719f, + -0.75439453f, 0.16137695f, 0.33740234f, -0.19702148f, 0.5197754f, 1.2861328f, 0.42236328f, -0.20092773f, -0.11743164f, -0.69018555f, -1.1972656f, -0.7453613f, -0.053466797f, 0.39208984f, 0.7512207f, 0.08544922f, + 2.1848145f, 1.0153809f, 0.14331055f, -0.6489258f, -0.71435547f, -0.55566406f, -0.40966797f, -0.25634766f, -0.08081055f, -0.01586914f, -0.0053710938f, -0.09667969f, -0.12231445f, -0.03466797f, -0.11303711f, -0.2902832f, + -1.2324219f, -0.42993164f, -0.30273438f, -0.8486328f, -0.9147949f, -0.7001953f, 0.03955078f, 0.7734375f, 0.99438477f, 0.46484375f, 0.13891602f, 0.11425781f, 0.41381836f, 0.7363281f, 0.6113281f, 0.14208984f, + 3.2854004f, 4.0998535f, 3.8623047f, 2.496582f, 1.4880371f, -0.044189453f, -0.55981445f, -1.1950684f, -1.519043f, -1.6992188f, -1.7475586f, -1.7741699f, -1.7507324f, -1.697998f, -1.6628418f, -1.5812988f, + -0.28393555f, 0.36254883f, 0.7150879f, 1.1523438f, 1.5422363f, 1.6831055f, 0.8269043f, -0.0107421875f, -0.48364258f, -0.6828613f, -0.78930664f, -0.6608887f, -0.6298828f, -0.8183594f, -0.8984375f, -1.0241699f, + 2.4472656f, 3.3598633f, 2.1152344f, 0.58740234f, 0.088134766f, 0.080566406f, 0.12768555f, -0.83447266f, -0.66308594f, 0.3178711f, -0.046875f, -1.7287598f, -1.8405762f, -1.4956055f, -1.1696777f, -1.3449707f, + 0.053955078f, -0.54907227f, -0.64941406f, -0.40527344f, -0.1496582f, -0.067871094f, -0.1328125f, -0.15991211f, 0.044677734f, 0.25585938f, 0.31835938f, 0.16113281f, 0.25756836f, 0.36523438f, 0.30444336f, 0.3527832f, + 0.20654297f, 1.2531738f, 1.6928711f, 2.6262207f, 2.7858887f, 2.2766113f, 1.0957031f, 0.32495117f, -0.79711914f, -1.7229004f, -2.0270996f, -1.2214355f, -1.1369629f, -2.0170898f, -1.7719727f, -1.5671387f, + 2.3149414f, 2.991455f, 1.5952148f, -0.14819336f, -0.6477051f, -0.16430664f, 0.07470703f, -0.28759766f, -0.4309082f, -0.782959f, -0.9194336f, -0.9182129f, -0.76708984f, -0.43164062f, -0.51586914f, -0.96240234f, + -0.13427734f, 0.3479004f, 0.4909668f, 0.038330078f, -0.26342773f, -0.3449707f, -0.41430664f, -0.3930664f, -0.16748047f, 0.009521484f, 0.1977539f, 0.0703125f, 0.20703125f, 0.43969727f, 0.24658203f, -0.33032227f, + -2.4680176f, -2.8671875f, -1.8813477f, 0.0925293f, 2.0136719f, 1.6013184f, 0.009277344f, -0.20214844f, 0.53344727f, 1.6809082f, 0.20605469f, 0.18408203f, 1.1643066f, 0.7697754f, -0.21728516f, -0.6196289f, + 3.2966309f, 3.043457f, 1.8188477f, 0.35595703f, -0.5317383f, -1.1340332f, -1.4089355f, -1.5368652f, -1.5805664f, -1.4577637f, -1.1005859f, -0.7077637f, 0.3149414f, 0.13671875f, 0.09887695f, 0.39257812f, + 1.1394043f, 2.0166016f, 1.6103516f, 0.43041992f, 0.8642578f, 1.6750488f, 0.87231445f, -0.23657227f, -1.2756348f, -1.3154297f, -1.0163574f, -0.611084f, -0.8654785f, -0.96191406f, -0.888916f, -1.4370117f, + 1.2382812f, 2.4553223f, 2.6896973f, 1.0947266f, 0.8881836f, 0.6599121f, 0.5114746f, 0.54296875f, 0.5046387f, -0.7314453f, -1.0595703f, -1.0734863f, -1.7263184f, -1.8920898f, -1.9853516f, -2.1169434f, + 1.7275391f, 1.0910645f, 0.24316406f, -1.076416f, -1.8234863f, -2.0952148f, -1.9289551f, -1.7150879f, -1.1884766f, -0.40429688f, 0.6279297f, 1.0185547f, 1.0893555f, 1.3093262f, 1.5356445f, 1.5893555f, + 2.8112793f, 3.1445312f, 2.5549316f, 0.8642578f, 0.45751953f, 1.5227051f, 1.6352539f, 0.92749023f, -0.56347656f, -1.8974609f, -2.1052246f, -2.085205f, -1.9211426f, -1.7441406f, -1.8710938f, -1.7302246f, + 0.46118164f, 0.93188477f, 0.859375f, 0.25732422f, -0.083496094f, -0.11010742f, -0.5197754f, -0.7607422f, -0.90966797f, -1.2976074f, -1.0537109f, -0.685791f, 0.013183594f, 0.83984375f, 1.1577148f, 0.9003906f, + 3.130371f, 1.8466797f, 0.7558594f, -0.33569336f, -0.7277832f, -0.85498047f, -0.7219238f, -0.6804199f, -0.5666504f, -0.50097656f, -0.49169922f, -0.2824707f, -0.16015625f, -0.3659668f, -0.2529297f, 0.20898438f, + -1.7817383f, -0.7636719f, -0.35620117f, -0.9194336f, -0.89990234f, -0.30371094f, 0.16333008f, 0.53393555f, 1.2219238f, 1.6164551f, 1.0964355f, 0.36914062f, 0.19091797f, 0.19116211f, -0.06689453f, -0.2919922f, + 2.9470215f, 2.9702148f, 2.4978027f, 1.8425293f, 1.1940918f, 0.48754883f, 0.040771484f, -0.4560547f, -0.71777344f, -1.255127f, -1.7084961f, -1.8168945f, -1.6584473f, -1.5026855f, -1.380127f, -1.4846191f, + -0.42797852f, 0.39672852f, 1.0322266f, 0.8232422f, 0.57055664f, 0.99194336f, 1.0778809f, 0.47460938f, 0.11987305f, -0.65625f, -1.3706055f, -1.3859863f, -0.93652344f, -0.296875f, -0.060302734f, -0.35253906f, + 3.0546875f, 1.5651855f, 0.72753906f, 0.024658203f, -0.087646484f, -0.13623047f, -0.22338867f, -0.051513672f, -0.01977539f, -0.13867188f, -0.29052734f, -0.4897461f, -0.6779785f, -0.89501953f, -1.0483398f, -1.3132324f, + -2.329834f, -1.6538086f, -1.5170898f, -1.8430176f, -1.7233887f, -0.94091797f, -0.39746094f, 0.51293945f, 1.3725586f, 1.703125f, 1.6044922f, 1.3227539f, 1.2766113f, 1.1901855f, 0.91308594f, 0.5095215f, + 2.1574707f, 3.0603027f, 2.765625f, 1.7712402f, 0.6225586f, -0.6166992f, -1.060791f, -1.5693359f, -1.4384766f, -1.7651367f, -1.7729492f, -1.0949707f, -0.46020508f, -0.0690918f, -0.05444336f, -0.47509766f, + 2.2287598f, 2.074707f, 1.065918f, 0.068603516f, -0.88061523f, -1.3867188f, -1.3818359f, -1.2768555f, -0.8725586f, -0.45751953f, -0.083984375f, -0.022460938f, 0.36108398f, 0.47192383f, 0.12597656f, -0.03466797f, + 1.2832031f, 2.3029785f, 1.6501465f, -0.19360352f, -0.94384766f, -0.11206055f, 1.2709961f, 1.0712891f, 0.9008789f, -0.6833496f, -1.9458008f, -1.3894043f, -0.7553711f, -0.17016602f, -0.6489258f, -1.637207f, + -0.5410156f, -1.4377441f, -0.87109375f, 0.72143555f, 2.3781738f, 1.8154297f, 0.05834961f, -0.24487305f, 0.27124023f, 1.1665039f, -0.2692871f, -0.24609375f, 0.4802246f, -0.34033203f, -1.2138672f, -1.7270508f, + 2.6340332f, 1.8164062f, 0.6784668f, -0.16235352f, -0.64208984f, -0.7529297f, -0.32080078f, 0.12548828f, 0.14257812f, -0.51123047f, -1.1225586f, -1.2424316f, -0.41625977f, -0.21459961f, -0.12768555f, 0.115722656f, + 1.6694336f, 1.4055176f, 1.2404785f, 1.4047852f, 1.1928711f, 0.6352539f, 0.19091797f, 0.040527344f, -0.056884766f, -0.5456543f, -0.94018555f, -1.1928711f, -1.1975098f, -1.208252f, -1.2277832f, -1.4104004f, + 0.92211914f, 2.1171875f, 1.9343262f, 0.67529297f, 0.21362305f, 0.7409668f, 0.51538086f, 0.0625f, -0.16113281f, -0.91918945f, -1.6809082f, -1.9360352f, -1.3974609f, -0.3359375f, 0.015625f, -0.7668457f, + 0.25463867f, 0.27246094f, -0.6647949f, -1.6083984f, -1.6931152f, -1.6413574f, -1.2963867f, 0.03149414f, 1.244873f, 0.9958496f, 0.88183594f, 0.7229004f, 0.6281738f, 1.152832f, 0.7297363f, -0.010498047f, + 0.27026367f, 1.5710449f, 2.415039f, 2.5617676f, 2.4665527f, 2.0825195f, 1.2067871f, 1.4360352f, 1.3601074f, -0.64990234f, -2.3432617f, -2.7763672f, -2.7404785f, -2.4682617f, -2.0534668f, -2.338623f, + -1.222168f, -0.23828125f, 0.42578125f, 0.41064453f, 0.033203125f, -0.22485352f, -0.31201172f, -0.5358887f, -0.5847168f, -0.4008789f, 0.018066406f, 0.2524414f, 0.36035156f, 0.55249023f, 0.7241211f, 0.74121094f, + 1.2573242f, 1.1115723f, 0.8808594f, 0.30810547f, -0.3330078f, -0.22290039f, 0.3894043f, 0.5810547f, 0.515625f, -0.11450195f, -0.8071289f, -0.9470215f, -0.68603516f, -0.69140625f, -0.68188477f, -0.5600586f, + -0.8679199f, -0.78100586f, -0.484375f, -0.22045898f, 0.21899414f, 0.6074219f, 0.4650879f, 0.6303711f, 0.52783203f, 0.1328125f, 0.10913086f, 0.28027344f, 0.15795898f, -0.02734375f, -0.22827148f, -0.52075195f, + 4.7766113f, 4.218994f, 2.694336f, 1.4052734f, 0.46484375f, 0.12695312f, -0.52441406f, -1.1826172f, -1.3425293f, -1.4343262f, -1.5407715f, -1.5932617f, -1.5834961f, -1.5500488f, -1.4814453f, -1.4541016f, + -1.1142578f, 0.16772461f, 1.0881348f, 0.9880371f, 0.6081543f, 0.39868164f, 0.22387695f, 0.01953125f, 0.011230469f, 0.06982422f, -0.13208008f, -0.43896484f, -0.5744629f, -0.34423828f, -0.4321289f, -0.5390625f, + 2.583496f, 2.133545f, 1.5522461f, 1.1113281f, 1.237793f, 1.3144531f, 0.93115234f, 0.35742188f, -0.20263672f, -0.76342773f, -1.1687012f, -1.4487305f, -1.6181641f, -1.8156738f, -2.0007324f, -2.203125f, + -2.0124512f, -1.4799805f, -1.4538574f, -1.4958496f, -1.1079102f, -0.4272461f, -0.17285156f, 0.080322266f, 0.3112793f, 0.5344238f, 0.6477051f, 0.64208984f, 1.0615234f, 1.8166504f, 1.7543945f, 1.3015137f, + 0.86035156f, 1.9960938f, 2.592041f, 2.7302246f, 2.2209473f, 1.1103516f, 0.720459f, -0.033691406f, -0.48901367f, -1.1772461f, -2.2160645f, -2.621338f, -2.5187988f, -1.5297852f, -0.41210938f, -1.2324219f, + -0.0390625f, 0.7182617f, 1.293457f, 1.6416016f, 1.7243652f, 0.44335938f, -0.36767578f, -0.62646484f, -0.14038086f, -0.39379883f, -1.5004883f, -1.2729492f, -0.65112305f, -0.21801758f, -0.15991211f, -0.45117188f, + 0.4506836f, 1.1796875f, 1.0358887f, 0.4663086f, 0.12597656f, -0.20898438f, -0.2524414f, -0.18115234f, -0.17993164f, -0.23266602f, -0.12768555f, -0.010009766f, -0.23925781f, -0.46972656f, -0.58251953f, -0.7739258f, + -3.7177734f, -3.4355469f, -1.828125f, 0.23046875f, 1.5246582f, 1.4841309f, 0.20214844f, -0.1538086f, 0.41015625f, 1.4714355f, 0.095214844f, 0.12524414f, 1.3300781f, 1.3466797f, 0.51538086f, 0.40014648f, + 4.776123f, 2.9377441f, 1.6135254f, 0.27954102f, -0.32666016f, -0.5793457f, -0.78466797f, -0.77001953f, -0.76538086f, -0.8562012f, -0.86694336f, -0.8532715f, -0.77905273f, -0.9621582f, -1.0119629f, -1.0510254f, + -0.8840332f, -0.5324707f, 0.2368164f, 2.0664062f, 2.5444336f, 1.9240723f, 1.4997559f, 1.230957f, 0.736084f, 0.2121582f, -0.61987305f, -0.9506836f, -1.2260742f, -1.7910156f, -2.0410156f, -2.4060059f, + 1.1203613f, 2.241455f, 1.5061035f, 0.26416016f, 0.083496094f, 0.087646484f, 0.00390625f, 0.03100586f, 0.08154297f, -0.39648438f, -0.56689453f, -0.62158203f, -0.7219238f, -0.796875f, -0.9807129f, -1.3356934f, + 0.8803711f, -0.5605469f, -0.89404297f, -1.1616211f, -0.9255371f, -1.3374023f, -1.1962891f, -1.2824707f, -1.3156738f, -1.2546387f, -1.0393066f, -0.041015625f, 1.5158691f, 1.6071777f, 2.4050293f, 4.5998535f, + 2.1367188f, 3.0183105f, 2.89917f, 2.105713f, 1.6914062f, 1.2595215f, 1.072998f, 0.5095215f, 0.26293945f, -0.62719727f, -1.6728516f, -2.331543f, -2.5375977f, -2.6152344f, -2.5966797f, -2.5751953f, + 0.45410156f, 0.56274414f, -0.091552734f, -0.82177734f, -0.8930664f, -0.40722656f, 0.024902344f, 0.008056641f, -0.09692383f, -0.19360352f, -0.25634766f, -0.25048828f, 0.14941406f, 0.73461914f, 0.7668457f, 0.31030273f, + 0.8791504f, 1.3742676f, 0.6760254f, -0.22192383f, -0.8535156f, -1.0957031f, -1.0690918f, -1.1728516f, -0.9848633f, -0.6647949f, -0.11669922f, 0.06738281f, 0.6196289f, 1.0905762f, 0.9074707f, 0.5654297f, + -0.26635742f, -0.29956055f, -0.8881836f, -1.2294922f, -0.69311523f, 0.011230469f, 0.5498047f, 0.9824219f, 1.184082f, 1.0895996f, 0.5878906f, 0.06738281f, -0.08911133f, -0.05029297f, -0.27319336f, -0.68359375f, + 3.256836f, 3.5593262f, 2.2746582f, 1.1318359f, 0.3149414f, -0.02368164f, 0.27172852f, -0.19335938f, -0.48779297f, -0.9663086f, -0.9187012f, -1.0222168f, -1.512207f, -1.6816406f, -1.8964844f, -2.1069336f, + -0.057617188f, -0.45092773f, -0.9638672f, -0.72143555f, 0.20703125f, 1.4692383f, 1.921875f, 1.6833496f, 1.3933105f, 0.6699219f, 0.17333984f, -0.43798828f, -0.9772949f, -1.1477051f, -1.3552246f, -1.4057617f, +}; + +const float ivas_sns_cdbk_tcx10_stage2[ 32 * 16 ] = +{ + 0.30615234f, 0.48828125f, -0.02709961f, -0.47680664f, -0.5300293f, -0.25463867f, -0.13305664f, -0.14941406f, -0.14819336f, 0.08666992f, 0.28833008f, 0.27514648f, 0.099365234f, -0.017578125f, 0.033203125f, 0.15893555f, + 0.40942383f, -0.044189453f, -0.088378906f, 0.38720703f, 0.5151367f, 0.42236328f, 0.34960938f, 0.2680664f, 0.037597656f, -0.19970703f, -0.31054688f, -0.32617188f, -0.38452148f, -0.38085938f, -0.38598633f, -0.2692871f, + -0.16040039f, -0.37548828f, -0.41479492f, -0.1237793f, 0.25708008f, 0.29589844f, 0.045410156f, -0.04345703f, -0.11450195f, -0.2019043f, 0.032470703f, 0.5847168f, 1.074707f, 0.3178711f, -0.43847656f, -0.73535156f, + -0.72021484f, 0.0859375f, 0.36450195f, 0.07739258f, -0.03857422f, -0.020263672f, 0.2277832f, 0.23657227f, -0.061523438f, -0.6010742f, -0.5341797f, -0.014160156f, 0.3154297f, 0.35327148f, 0.27368164f, 0.05517578f, + 0.17041016f, -0.1340332f, -0.17480469f, -0.16430664f, -0.15039062f, -0.16210938f, 0.20776367f, 0.78881836f, 0.8288574f, 0.2783203f, -0.099609375f, -0.26513672f, -0.29541016f, -0.31860352f, -0.3034668f, -0.20629883f, + 0.66967773f, 0.6286621f, 0.5107422f, 0.36791992f, 0.0949707f, -0.26904297f, -0.43603516f, -0.5292969f, -0.50219727f, -0.28881836f, -0.08081055f, 0.07861328f, -0.040771484f, -0.15014648f, -0.076416016f, 0.022705078f, + -0.14648438f, -0.46923828f, -0.43554688f, -0.11254883f, 0.021728516f, -0.06274414f, -0.10620117f, -0.23876953f, -0.34277344f, -0.21069336f, 0.010009766f, 0.26293945f, 0.36938477f, 0.4560547f, 0.5004883f, 0.5041504f, + -0.6381836f, -0.37841797f, -0.12036133f, 0.46875f, 0.6027832f, 0.40478516f, 0.3227539f, 0.2175293f, 0.029296875f, 0.009521484f, 0.091552734f, 0.014160156f, -0.19921875f, -0.27270508f, -0.3071289f, -0.24560547f, + 1.0043945f, 0.034423828f, -0.36523438f, -0.1628418f, -0.17504883f, -0.16357422f, 0.01977539f, 0.041992188f, -0.092041016f, -0.12548828f, -0.1381836f, -0.15527344f, -0.13720703f, -0.041992188f, 0.11791992f, 0.33789062f, + -0.29882812f, -0.056640625f, 0.22631836f, 0.35375977f, 0.40576172f, 0.053466797f, -0.33154297f, -0.58374023f, -0.59887695f, -0.13867188f, 0.35302734f, 0.4267578f, 0.12548828f, -0.052490234f, 0.022949219f, 0.09301758f, + -0.62060547f, -0.6557617f, -0.3918457f, -0.23461914f, -0.10498047f, -0.024169922f, 0.10473633f, 0.2746582f, 0.33642578f, 0.2866211f, 0.2980957f, 0.35498047f, 0.22167969f, 0.06298828f, 0.0036621094f, 0.087890625f, + -0.24169922f, 0.39331055f, 0.45410156f, -0.013671875f, -0.028076172f, 0.032226562f, -0.03491211f, 0.13916016f, 0.57006836f, 0.30078125f, -0.028564453f, -0.08300781f, -0.23266602f, -0.25585938f, -0.40356445f, -0.56762695f, + -0.25463867f, 0.20141602f, 0.13623047f, 0.021972656f, 0.018798828f, 0.35424805f, 0.30541992f, -0.043945312f, -0.032226562f, 0.4873047f, 0.2692871f, -0.57910156f, -0.86279297f, -0.46435547f, 0.21459961f, 0.2277832f, + 0.10083008f, -0.0048828125f, 0.15429688f, 0.58935547f, 0.58325195f, 0.15014648f, -0.1394043f, -0.30566406f, -0.39794922f, -0.42016602f, -0.4350586f, -0.49121094f, -0.24169922f, 0.07788086f, 0.3359375f, 0.4440918f, + -0.8688965f, -0.12646484f, 0.37768555f, 0.3232422f, -0.09790039f, -0.3017578f, -0.11328125f, 0.06982422f, 0.10864258f, 0.10180664f, 0.019042969f, -0.020751953f, -0.025878906f, 0.01977539f, 0.15820312f, 0.37646484f, + 0.04272461f, 0.020996094f, 0.31860352f, 0.23291016f, -0.33081055f, -0.80322266f, -0.73657227f, -0.34106445f, 0.011962891f, 0.27807617f, 0.45922852f, 0.49145508f, 0.3022461f, 0.14160156f, -0.017333984f, -0.07055664f, + -0.33544922f, 0.075683594f, -0.29907227f, -0.7363281f, -0.6525879f, -0.17797852f, 0.36279297f, 0.41870117f, 0.25170898f, 0.10473633f, 0.030273438f, -0.11254883f, 0.026855469f, 0.3503418f, 0.42382812f, 0.26904297f, + 0.3544922f, 0.67529297f, 0.38671875f, 0.009521484f, -0.040771484f, 0.08984375f, 0.2446289f, 0.16455078f, -0.17333984f, -0.4404297f, -0.46533203f, -0.40039062f, -0.28222656f, -0.1875f, -0.036865234f, 0.10205078f, + 0.4255371f, 0.16113281f, -0.11669922f, -0.16040039f, -0.14379883f, -0.2055664f, -0.0769043f, -0.055419922f, -0.19677734f, -0.44921875f, -0.3100586f, 0.10839844f, 0.5698242f, 0.5554199f, 0.11328125f, -0.21850586f, + -0.2980957f, -0.51660156f, -0.51000977f, -0.23046875f, 0.24658203f, 0.49682617f, 0.44580078f, 0.4501953f, 0.15917969f, -0.25317383f, -0.34301758f, -0.25146484f, -0.045898438f, 0.07885742f, 0.19018555f, 0.38085938f, + 0.32836914f, 0.41186523f, 0.40966797f, 0.23071289f, -0.27294922f, -0.7373047f, -0.33129883f, 0.2084961f, 0.29248047f, 0.023925781f, -0.22290039f, -0.2241211f, -0.10595703f, -0.109375f, -0.049072266f, 0.14770508f, + -0.17578125f, 0.35791016f, 0.71240234f, 0.55444336f, 0.37963867f, 0.25317383f, 0.0007324219f, -0.17456055f, -0.19921875f, -0.18261719f, -0.1381836f, -0.13476562f, -0.2697754f, -0.36523438f, -0.3803711f, -0.23730469f, + 0.18774414f, -0.33813477f, -0.40356445f, -0.16430664f, -0.35253906f, -0.5744629f, -0.40454102f, 0.03930664f, 0.28295898f, 0.24194336f, 0.11450195f, -0.011962891f, 0.15576172f, 0.29174805f, 0.39453125f, 0.5402832f, + 0.22485352f, -0.44970703f, -0.048583984f, 0.5905762f, 0.5395508f, -0.08300781f, -0.50219727f, -0.24121094f, 0.2331543f, 0.15942383f, -0.044433594f, 0.043701172f, -0.01928711f, -0.19824219f, -0.17260742f, -0.03173828f, + 0.86157227f, 0.21875f, 0.039794922f, 0.023925781f, -0.0925293f, -0.16845703f, -0.11669922f, 0.080322266f, 0.061279297f, 0.123535156f, 0.23388672f, 0.23022461f, 0.0056152344f, -0.33666992f, -0.5786133f, -0.5854492f, + 0.5175781f, 0.14453125f, -0.21850586f, -0.46777344f, 0.28515625f, 0.9855957f, 0.04296875f, -0.60424805f, -0.40625f, 0.07104492f, -0.0793457f, -0.111083984f, 0.017333984f, 0.021728516f, -0.1381836f, -0.060791016f, + 0.48950195f, -0.4885254f, -0.7644043f, -0.43164062f, -0.08203125f, 0.11401367f, 0.2331543f, 0.1472168f, 0.03540039f, 0.18945312f, 0.30737305f, 0.25976562f, 0.095458984f, -0.0234375f, -0.07739258f, -0.00390625f, + -0.111816406f, 0.22485352f, 0.00048828125f, -0.32177734f, -0.1508789f, 0.43017578f, 0.7011719f, 0.35229492f, -0.12060547f, -0.23291016f, 0.15258789f, 0.19702148f, -0.064208984f, -0.21606445f, -0.3857422f, -0.4543457f, + -0.22290039f, -0.33740234f, 0.068359375f, 0.09277344f, 0.04638672f, 0.21899414f, -0.03564453f, 0.036621094f, 0.6125488f, 0.5058594f, -0.4128418f, -0.69140625f, -0.5534668f, 0.16235352f, 0.54418945f, -0.034179688f, + -0.013916016f, 0.41259766f, 0.28393555f, -0.13085938f, -0.35058594f, -0.3713379f, -0.2619629f, -0.2854004f, -0.36401367f, -0.41210938f, -0.30444336f, -0.16552734f, 0.076416016f, 0.40722656f, 0.72143555f, 0.75878906f, + -0.78149414f, 0.05517578f, 0.09863281f, -0.35083008f, -0.29174805f, 0.1352539f, 0.10620117f, -0.3515625f, -0.27514648f, 0.15917969f, 0.34326172f, 0.2626953f, 0.39916992f, 0.42089844f, 0.20947266f, -0.1394043f, + -0.20361328f, -0.21557617f, -0.16308594f, -0.041748047f, -0.111083984f, -0.057617188f, 0.0390625f, 0.013183594f, 0.17358398f, 0.74902344f, 0.9448242f, 0.4477539f, -0.09423828f, -0.32739258f, -0.50634766f, -0.6467285f, +}; + +const float ivas_sns_cdbk_tcx10_stage3[ 8 * 16 ] = +{ + 0.15209961f, -0.12768555f, 0.09375f, -0.083496094f, -0.25390625f, 0.12524414f, 0.2993164f, -0.09863281f, -0.34814453f, -0.2434082f, -0.11254883f, -0.060058594f, 0.032470703f, 0.15527344f, 0.23413086f, 0.2355957f, + -0.16235352f, -0.111083984f, -0.3173828f, -0.25634766f, 0.13842773f, 0.29858398f, 0.10498047f, 0.11743164f, 0.26611328f, 0.05444336f, -0.1459961f, -0.19238281f, 0.041748047f, 0.2097168f, 0.07421875f, -0.12011719f, + -0.05078125f, 0.14770508f, -0.1003418f, -0.32104492f, -0.17504883f, -0.18652344f, -0.27148438f, -0.07788086f, 0.0036621094f, -0.04296875f, 0.10131836f, 0.34985352f, 0.3083496f, 0.10107422f, 0.0769043f, 0.13696289f, + -0.19140625f, -0.030273438f, 0.22509766f, 0.079589844f, -0.27148438f, -0.19604492f, 0.27929688f, 0.3503418f, 0.10424805f, 0.0061035156f, 0.06542969f, 0.11669922f, 0.036865234f, -0.1303711f, -0.22705078f, -0.21655273f, + 0.26538086f, -0.20825195f, -0.25073242f, 0.119628906f, 0.27270508f, 0.17797852f, -0.0024414062f, -0.12768555f, -0.22802734f, 0.0075683594f, 0.2133789f, 0.19482422f, 0.045898438f, -0.1184082f, -0.17797852f, -0.18383789f, + 0.2565918f, 0.24658203f, 0.1015625f, -0.029296875f, -0.14355469f, -0.13989258f, -0.20751953f, -0.19677734f, 0.17504883f, 0.41601562f, 0.13085938f, -0.20532227f, -0.16235352f, 0.040771484f, -0.037353516f, -0.24511719f, + -0.0871582f, 0.022949219f, 0.00048828125f, 0.07397461f, 0.14379883f, 0.067871094f, 0.0036621094f, 0.1171875f, 0.087402344f, 0.0012207031f, -0.075927734f, -0.11352539f, -0.31420898f, -0.38916016f, -0.022949219f, 0.484375f, + -0.1821289f, 0.060058594f, 0.24780273f, 0.41674805f, 0.2890625f, -0.1472168f, -0.20581055f, -0.083984375f, -0.060302734f, -0.19921875f, -0.17651367f, -0.08984375f, 0.011230469f, 0.13110352f, 0.080078125f, -0.09106445f, +}; + +const float *const ivas_sns_cdbks_tcx10[SNS_MSVQ_NSTAGES_TCX10] = { ivas_sns_cdbk_tcx10_stage1, ivas_sns_cdbk_tcx10_stage2, ivas_sns_cdbk_tcx10_stage3}; + +const int16_t ivas_sns_cdbks_side_tcx20_levels[SNS_MSVQ_NSTAGES_SIDE] = { 32, 32 }; +const int16_t ivas_sns_cdbks_side_tcx20_bits[SNS_MSVQ_NSTAGES_SIDE] = { 5, 5 }; +const int16_t ivas_sns_cdbks_side_tcx10_levels[SNS_MSVQ_NSTAGES_SIDE] = { 32, 8 }; +const int16_t ivas_sns_cdbks_side_tcx10_bits[SNS_MSVQ_NSTAGES_SIDE] = { 5, 3 }; + +const float ivas_sns_cdbks_side_tcx20_stage1[ 32 * 16 ] = +{ + -0.11376953f, -0.06591797f, 0.041992188f, 0.044677734f, 0.17871094f, -0.02758789f, -0.32592773f, -0.21069336f, -0.049072266f, 0.0126953125f, 0.012939453f, 0.015136719f, 0.08203125f, 0.12670898f, 0.12695312f, 0.15112305f, + -0.017089844f, 0.09326172f, 0.2355957f, 0.2241211f, 0.107421875f, 0.05029297f, 0.039794922f, -0.0073242188f, -0.048339844f, -0.0871582f, -0.08520508f, -0.12060547f, -0.111572266f, -0.10620117f, -0.08911133f, -0.078125f, + -0.26635742f, 0.27368164f, 0.4543457f, 0.1821289f, 0.6513672f, 0.18066406f, 0.14575195f, -0.008056641f, 0.2631836f, -0.045898438f, -0.52001953f, -0.1628418f, 0.038330078f, -0.31811523f, -0.4321289f, -0.43603516f, + -0.044189453f, -0.10449219f, -0.091796875f, -0.10620117f, -0.09423828f, 0.09326172f, 0.2697754f, 0.16577148f, 0.06201172f, 0.010986328f, 0.021728516f, -0.023925781f, -0.036621094f, -0.03930664f, -0.04345703f, -0.03930664f, + 0.4099121f, 0.06323242f, -0.021972656f, -0.014404297f, -0.013916016f, -0.018554688f, -0.052246094f, -0.051757812f, -0.03173828f, -0.03491211f, -0.02758789f, -0.05859375f, -0.045410156f, -0.042236328f, -0.038085938f, -0.021484375f, + 0.0024414062f, 0.030761719f, 0.020263672f, 0.013671875f, -0.009033203f, 0.012939453f, 0.009521484f, -0.030273438f, -0.048339844f, -0.022216797f, 0.011962891f, -0.017333984f, -0.011474609f, -0.0007324219f, 0.011962891f, 0.025634766f, + 0.17358398f, 0.22387695f, 0.19702148f, -0.019042969f, -0.27514648f, -0.5378418f, -0.30688477f, -0.03540039f, 0.0007324219f, -0.049560547f, 0.07519531f, 0.052246094f, 0.12670898f, 0.16308594f, 0.12133789f, 0.09033203f, + -0.32006836f, -0.29125977f, -0.24731445f, -0.17797852f, -0.140625f, -0.10595703f, -0.12670898f, -0.10864258f, -0.08618164f, -0.07421875f, 0.030517578f, 0.15917969f, 0.24975586f, 0.31518555f, 0.40893555f, 0.5151367f, + -0.49658203f, -0.033691406f, 0.083740234f, 0.04272461f, 0.03466797f, 0.053955078f, 0.03466797f, 0.02368164f, 0.037597656f, 0.03173828f, 0.028320312f, 0.00024414062f, 0.028564453f, 0.030761719f, 0.044189453f, 0.055419922f, + -0.040527344f, 0.022460938f, 0.009765625f, 0.036865234f, 0.055664062f, 0.046875f, 0.032470703f, 0.08105469f, 0.095703125f, 0.04296875f, -0.0087890625f, -0.064697266f, -0.057373047f, -0.04711914f, -0.09765625f, -0.107666016f, + 0.27148438f, 0.3696289f, 0.39672852f, 0.38427734f, 0.30151367f, 0.21655273f, 0.15551758f, 0.12133789f, -0.008056641f, -0.12792969f, -0.22973633f, -0.39111328f, -0.4465332f, -0.46826172f, -0.35986328f, -0.18530273f, + -0.3166504f, -0.2758789f, -0.22290039f, -0.1850586f, -0.15771484f, -0.1184082f, -0.04638672f, 0.032470703f, 0.10961914f, 0.16821289f, 0.20336914f, 0.1665039f, 0.20019531f, 0.19970703f, 0.14233398f, 0.1003418f, + -0.028076172f, -0.02734375f, -0.06665039f, -0.099365234f, -0.10522461f, -0.10546875f, -0.056884766f, 0.017333984f, 0.061523438f, 0.07836914f, 0.087890625f, 0.051513672f, 0.05419922f, 0.051757812f, 0.04272461f, 0.043945312f, + -0.14404297f, -0.3088379f, -0.07885742f, 0.053222656f, 0.064208984f, 0.032226562f, 0.057617188f, 0.05810547f, 0.05126953f, 0.041748047f, 0.053955078f, 0.015136719f, 0.028808594f, 0.033691406f, 0.0234375f, 0.018554688f, + 0.49609375f, 0.45263672f, 0.2915039f, 0.15649414f, 0.052246094f, 0.017578125f, -0.050048828f, -0.06640625f, -0.10839844f, -0.15063477f, -0.17138672f, -0.20532227f, -0.18432617f, -0.17553711f, -0.19213867f, -0.16235352f, + -0.0056152344f, -0.030761719f, -0.092285156f, -0.1262207f, -0.15917969f, -0.12011719f, -0.1105957f, -0.13354492f, -0.12915039f, -0.09863281f, 0.017578125f, 0.12866211f, 0.21850586f, 0.24853516f, 0.1875f, 0.20532227f, + -0.011230469f, -0.061035156f, -0.032226562f, 0.18139648f, 0.068359375f, -0.13916016f, -0.1015625f, 0.0017089844f, -0.004638672f, 0.009765625f, 0.03149414f, -0.0068359375f, 0.0043945312f, 0.023925781f, 0.017333984f, 0.018066406f, + -0.045166016f, -0.05493164f, -0.04296875f, 0.053710938f, 0.2121582f, 0.25195312f, 0.08911133f, -0.034179688f, -0.049560547f, -0.06225586f, -0.061523438f, -0.07836914f, -0.052490234f, -0.044189453f, -0.046142578f, -0.03540039f, + 0.08129883f, 0.20532227f, 0.04296875f, 0.11010742f, 0.3720703f, 0.4272461f, 0.31884766f, 0.19335938f, 0.015625f, -0.17895508f, -0.20214844f, -0.38330078f, -0.2487793f, -0.20581055f, -0.24560547f, -0.30297852f, + -0.40112305f, -0.2043457f, -0.048828125f, 0.018798828f, -0.080322266f, 0.016113281f, 0.13427734f, 0.2734375f, 0.3503418f, 0.35766602f, 0.19165039f, -0.056884766f, -0.11645508f, -0.1574707f, -0.14990234f, -0.12719727f, + 0.2763672f, 0.27905273f, 0.2241211f, 0.035888672f, -0.10253906f, -0.061523438f, -0.08544922f, -0.19848633f, -0.25634766f, -0.22729492f, -0.20019531f, -0.12548828f, -0.0026855469f, 0.08178711f, 0.14819336f, 0.21411133f, + -0.11425781f, -0.068603516f, 0.2446289f, -0.0031738281f, -0.04321289f, -0.033203125f, 0.024414062f, -0.0036621094f, -0.022460938f, 0.0017089844f, 0.018554688f, -0.014892578f, -0.010253906f, 0.0021972656f, 0.0068359375f, 0.015380859f, + 0.080322266f, 0.23852539f, 0.16894531f, 0.029052734f, -0.043701172f, -0.10571289f, -0.07788086f, -0.037109375f, -0.0063476562f, -0.025878906f, -0.036865234f, -0.06347656f, -0.04321289f, -0.03173828f, -0.032470703f, -0.012451172f, + -0.072265625f, -0.17602539f, -0.29736328f, -0.35253906f, -0.34814453f, -0.25732422f, -0.2097168f, -0.1850586f, -0.11230469f, -0.052978516f, 0.09643555f, 0.3071289f, 0.3930664f, 0.56689453f, 0.40625f, 0.2939453f, + -0.24194336f, -0.11010742f, -0.05102539f, 0.03930664f, -0.061523438f, -0.018554688f, 0.010986328f, 0.04296875f, -0.21557617f, -0.01928711f, 0.009277344f, 0.048095703f, 0.26342773f, 0.36791992f, 0.13232422f, -0.19604492f, + 0.16210938f, 0.16381836f, 0.14404297f, 0.1081543f, 0.08959961f, 0.11450195f, 0.11743164f, 0.11645508f, 0.13110352f, 0.11303711f, 0.021240234f, -0.15844727f, -0.21166992f, -0.27368164f, -0.33813477f, -0.29956055f, + -0.14624023f, 0.068603516f, 0.24731445f, 0.38916016f, 0.31860352f, 0.27416992f, 0.19165039f, 0.13793945f, 0.06958008f, -0.018798828f, -0.1159668f, -0.2849121f, -0.3581543f, -0.3803711f, -0.25952148f, -0.1328125f, + -0.64819336f, -0.5800781f, -0.15527344f, -0.07104492f, -0.08300781f, 0.009765625f, 0.10620117f, 0.10571289f, 0.13989258f, 0.12988281f, 0.1743164f, 0.18408203f, 0.09375f, 0.12524414f, 0.20678711f, 0.26220703f, + 0.07836914f, 0.16430664f, -0.014404297f, -0.20898438f, -0.08984375f, 0.04296875f, 0.06713867f, 0.0075683594f, -0.037109375f, -0.029296875f, -0.020019531f, -0.03173828f, 0.0036621094f, 0.016113281f, 0.015380859f, 0.035888672f, + -0.02368164f, -0.14282227f, -0.36645508f, -0.11279297f, 0.042236328f, 0.14086914f, 0.041503906f, 0.009277344f, 0.039794922f, 0.055419922f, 0.061523438f, 0.040771484f, 0.056152344f, 0.064208984f, 0.052490234f, 0.041503906f, + 0.23120117f, 0.21533203f, 0.16748047f, 0.15649414f, 0.1262207f, 0.10498047f, 0.08691406f, 0.020019531f, -0.03466797f, -0.12841797f, -0.18579102f, -0.29492188f, -0.2705078f, -0.17236328f, -0.06933594f, 0.04736328f, + -0.19580078f, -0.14624023f, -0.11303711f, -0.055908203f, -0.052001953f, -0.009033203f, 0.022949219f, -0.0068359375f, -0.032470703f, 0.0017089844f, 0.045410156f, 0.025146484f, 0.039794922f, 0.07543945f, 0.1574707f, 0.24267578f, +}; + +const float ivas_sns_cdbks_side_tcx20_stage2[ 32 * 16 ] = +{ + -0.013916016f, 0.0007324219f, 0.017089844f, 0.005859375f, 0.056152344f, -0.08178711f, -0.2927246f, 0.00390625f, 0.140625f, 0.03881836f, 0.010498047f, 0.038330078f, 0.042236328f, 0.020751953f, 0.005859375f, 0.0075683594f, + -0.07104492f, -0.10253906f, 0.038085938f, 0.091552734f, 0.118896484f, 0.13476562f, 0.05078125f, -0.111328125f, -0.13842773f, -0.20727539f, -0.25732422f, -0.15063477f, 0.032470703f, 0.08129883f, 0.17578125f, 0.31469727f, + 0.0715332f, 0.029052734f, 0.01953125f, 0.008056641f, 0.0234375f, 0.020751953f, 0.032226562f, 0.021972656f, 0.03466797f, 0.017822266f, -0.037841797f, -0.14038086f, -0.21679688f, -0.11035156f, 0.057617188f, 0.16845703f, + -0.1081543f, -0.02734375f, -0.08251953f, -0.08227539f, -0.07910156f, 0.049804688f, 0.10253906f, 0.23876953f, 0.25683594f, 0.03173828f, -0.15820312f, -0.14648438f, -0.008056641f, -0.00048828125f, -0.014404297f, 0.02734375f, + -0.022705078f, 0.028076172f, 0.14111328f, -0.06762695f, -0.07348633f, 0.16259766f, -0.0073242188f, -0.06567383f, -0.028564453f, -0.0107421875f, -0.023925781f, 0.0126953125f, -0.005859375f, -0.006591797f, -0.014160156f, -0.018066406f, + -0.09741211f, -0.092041016f, -0.061523438f, -0.011962891f, 0.006591797f, 0.041748047f, 0.008300781f, -0.017578125f, -0.08520508f, -0.12573242f, -0.06298828f, 0.13696289f, 0.25195312f, 0.15332031f, 0.001953125f, -0.04663086f, + -0.20239258f, 0.2705078f, 0.059326172f, 0.0041503906f, 0.022216797f, -0.009765625f, -0.026611328f, -0.02734375f, -0.032714844f, -0.016845703f, -0.025878906f, -0.0014648438f, -0.0075683594f, -0.009521484f, 0.004638672f, -0.0009765625f, + 0.064453125f, -0.26708984f, 0.122802734f, 0.025634766f, -0.0063476562f, 0.0043945312f, 0.008544922f, -0.0017089844f, 0.0061035156f, -0.007080078f, -0.018798828f, 0.011962891f, 0.008544922f, 0.010009766f, 0.020263672f, 0.018310547f, + -0.0007324219f, -0.037597656f, -0.036376953f, -0.015625f, 0.0056152344f, -0.0056152344f, -0.0029296875f, 0.032714844f, 0.047607422f, 0.019042969f, -0.010498047f, 0.017578125f, 0.0126953125f, 0.0043945312f, -0.013427734f, -0.016845703f, + 0.06933594f, 0.052978516f, 0.061035156f, 0.13378906f, 0.13427734f, 0.0053710938f, -0.099365234f, -0.18334961f, -0.21850586f, -0.083496094f, 0.020263672f, 0.05883789f, 0.013427734f, 0.011474609f, 0.01953125f, 0.0041503906f, + 0.0036621094f, -0.05053711f, -0.005126953f, 0.19091797f, -0.18798828f, -0.0546875f, 0.00048828125f, -0.021728516f, -0.001953125f, 0.0017089844f, 0.0041503906f, 0.024902344f, 0.022216797f, 0.02758789f, 0.02709961f, 0.01928711f, + 0.024658203f, -0.0041503906f, -0.026611328f, -0.0859375f, -0.06323242f, -0.068603516f, -0.07495117f, -0.050048828f, -0.061035156f, -0.0061035156f, 0.056396484f, 0.088378906f, 0.05883789f, 0.06738281f, 0.07763672f, 0.06738281f, + 0.13696289f, 0.08496094f, 0.07104492f, 0.046875f, 0.024658203f, 0.0048828125f, -0.0107421875f, -0.006591797f, 0.014160156f, -0.0073242188f, -0.041503906f, -0.02709961f, -0.041503906f, -0.060791016f, -0.09277344f, -0.095214844f, + -0.16772461f, 0.06665039f, 0.1821289f, 0.07397461f, -0.020019531f, 0.055419922f, 0.0390625f, -0.12011719f, -0.107910156f, 0.123291016f, 0.37939453f, 0.032714844f, -0.16137695f, -0.15234375f, -0.10546875f, -0.11743164f, + -0.013183594f, -0.011230469f, -0.037353516f, 0.0026855469f, -0.04638672f, -0.24438477f, 0.099853516f, 0.1105957f, 0.008544922f, 0.010253906f, 0.013183594f, 0.03857422f, 0.016601562f, 0.014892578f, 0.01928711f, 0.018066406f, + 0.044189453f, 0.07763672f, -0.03491211f, -0.18359375f, 0.15722656f, 0.061279297f, -0.029541016f, -0.018798828f, -0.023925781f, 0.0007324219f, -0.010498047f, 0.0087890625f, -0.0056152344f, -0.009277344f, -0.014892578f, -0.018798828f, + 0.13696289f, 0.011230469f, -0.033447266f, -0.017333984f, -0.07763672f, -0.122558594f, -0.076416016f, -0.017333984f, 0.14257812f, 0.21313477f, 0.14575195f, 0.032226562f, -0.083740234f, -0.12036133f, -0.076171875f, -0.057373047f, + 0.029541016f, -0.12231445f, -0.2475586f, 0.0949707f, 0.18896484f, 0.026123047f, 0.012939453f, 0.030029297f, 0.009033203f, -0.009277344f, -0.025634766f, 0.0087890625f, -0.0024414062f, -0.0017089844f, 0.0087890625f, -0.00024414062f, + -0.03857422f, -0.03881836f, -0.08886719f, -0.068847656f, 0.022216797f, 0.10229492f, 0.12841797f, 0.083984375f, 0.06567383f, 0.08178711f, 0.075927734f, 0.040039062f, -0.047851562f, -0.09448242f, -0.103515625f, -0.119140625f, + 0.009277344f, 0.046875f, 0.08178711f, 0.037597656f, 0.0063476562f, -0.038330078f, -0.01171875f, 0.28222656f, 0.027832031f, -0.25195312f, -0.12817383f, 0.01586914f, 0.011474609f, -0.014404297f, -0.044189453f, -0.030761719f, + 0.0637207f, 0.12426758f, 0.095458984f, -0.13378906f, -0.26293945f, -0.06323242f, 0.033203125f, 0.06591797f, 0.048583984f, 0.026367188f, 0.005859375f, 0.01977539f, -0.0029296875f, -0.005859375f, -0.0007324219f, -0.013183594f, + -0.016845703f, -0.052246094f, -0.057373047f, 0.008056641f, -0.01171875f, -0.068847656f, -0.0859375f, -0.016357422f, -0.012207031f, 0.046875f, 0.18164062f, 0.2692871f, 0.13476562f, -0.024414062f, -0.1274414f, -0.16723633f, + -0.021972656f, -0.053955078f, -0.022705078f, -0.00048828125f, 0.072021484f, 0.083496094f, 0.056640625f, -0.014892578f, 0.028320312f, 0.09399414f, 0.061279297f, -0.48779297f, -0.018554688f, 0.1550293f, 0.05859375f, 0.0107421875f, + 0.38476562f, -0.049316406f, -0.0793457f, -0.025146484f, -0.02319336f, -0.020751953f, 0.026855469f, -0.00048828125f, -0.052490234f, -0.033935547f, -0.04638672f, -0.0107421875f, -0.018066406f, -0.022216797f, -0.016113281f, -0.013427734f, + -0.23852539f, -0.064941406f, -0.018066406f, -0.0034179688f, 0.040283203f, 0.01928711f, 0.018310547f, 0.030761719f, 0.030029297f, 0.028564453f, 0.010253906f, 0.037109375f, 0.021484375f, 0.03491211f, 0.03515625f, 0.018798828f, + 0.03857422f, 0.028808594f, 0.025878906f, 0.04321289f, 0.03491211f, -0.021972656f, -0.03466797f, -0.01953125f, -0.02368164f, -0.095214844f, -0.13891602f, -0.032714844f, 0.013671875f, 0.05883789f, 0.064697266f, 0.057861328f, + -0.014892578f, 0.014892578f, 0.0126953125f, 0.045410156f, 0.0073242188f, 0.08300781f, 0.17797852f, 0.030761719f, -0.11743164f, -0.071777344f, -0.048095703f, -0.007080078f, -0.016113281f, -0.024414062f, -0.033203125f, -0.03881836f, + 0.0690918f, -0.049072266f, -0.23413086f, -0.3227539f, -0.15258789f, -0.028320312f, 0.05883789f, 0.055908203f, 0.08618164f, 0.08203125f, 0.052246094f, 0.0546875f, 0.022216797f, 0.07885742f, 0.13061523f, 0.095947266f, + -0.13452148f, -0.026855469f, 0.107177734f, 0.16040039f, 0.13305664f, 0.043701172f, 0.0087890625f, 0.020019531f, 0.040039062f, 0.017578125f, -0.030029297f, -0.024902344f, -0.067871094f, -0.08666992f, -0.076416016f, -0.083740234f, + -0.01953125f, -0.059814453f, -0.061279297f, 0.008056641f, 0.031982422f, 0.08203125f, -0.045166016f, -0.25561523f, -0.02758789f, 0.10522461f, 0.06274414f, 0.046875f, 0.029052734f, 0.03173828f, 0.04248047f, 0.028564453f, + -0.050048828f, 0.084472656f, 0.27172852f, 0.053222656f, -0.063964844f, -0.12988281f, -0.07299805f, -0.051757812f, -0.036621094f, -0.0014648438f, -0.0009765625f, 0.021728516f, 0.009033203f, -0.0007324219f, -0.013183594f, -0.018554688f, + 0.0847168f, 0.18920898f, -0.1796875f, -0.01586914f, -0.017822266f, -0.021728516f, 0.006591797f, -0.0075683594f, -0.019042969f, -0.0107421875f, -0.0146484375f, 0.014160156f, 0.0034179688f, -0.0056152344f, -0.0036621094f, -0.0017089844f, +}; + +const float *const ivas_sns_cdbks_side_tcx20[SNS_MSVQ_NSTAGES_SIDE] = { ivas_sns_cdbks_side_tcx20_stage1, ivas_sns_cdbks_side_tcx20_stage2 }; + +const float ivas_sns_cdbks_side_tcx10_stage1[ 32 * 16 ] = +{ + -0.23950195f, -0.203125f, -0.17822266f, -0.1315918f, -0.123291016f, -0.095947266f, -0.106933594f, -0.16552734f, -0.14941406f, -0.075683594f, 0.026367188f, 0.1015625f, 0.17041016f, 0.2770996f, 0.37890625f, 0.5148926f, + 0.12890625f, 0.20825195f, 0.22924805f, 0.2998047f, 0.24267578f, 0.14477539f, 0.07861328f, 0.024658203f, -0.076171875f, -0.18432617f, -0.26660156f, -0.33251953f, -0.2758789f, -0.13964844f, -0.030517578f, -0.05126953f, + -0.14160156f, -0.13305664f, -0.111816406f, -0.037353516f, -0.038085938f, 0.051513672f, 0.07348633f, 0.0073242188f, 0.044921875f, -0.0234375f, -0.123291016f, -0.01171875f, 0.28100586f, 0.24194336f, 0.0703125f, -0.1496582f, + 0.053466797f, 0.122802734f, 0.1394043f, 0.099853516f, 0.078125f, 0.018554688f, 0.034423828f, 0.103759766f, 0.06542969f, -0.030273438f, -0.09887695f, -0.099609375f, -0.060058594f, -0.119628906f, -0.18237305f, -0.12451172f, + -0.04345703f, -0.033447266f, -0.06665039f, -0.06518555f, -0.048828125f, -0.11645508f, -0.2055664f, -0.20263672f, -0.15576172f, -0.0009765625f, 0.103759766f, 0.21191406f, 0.24414062f, 0.14526367f, 0.09863281f, 0.13476562f, + 0.05810547f, 0.22558594f, 0.10180664f, -0.08618164f, -0.07470703f, 0.052246094f, 0.052490234f, -0.042236328f, -0.07055664f, -0.037109375f, -0.024169922f, -0.03149414f, -0.031982422f, -0.040527344f, -0.038085938f, -0.013183594f, + 0.020019531f, -0.033447266f, -0.14550781f, -0.42089844f, -0.19604492f, 0.038085938f, 0.026611328f, 0.016357422f, 0.038330078f, 0.057861328f, 0.06762695f, 0.08081055f, 0.091308594f, 0.10180664f, 0.11987305f, 0.13720703f, + 0.13671875f, 0.30566406f, 0.4716797f, 0.54785156f, 0.39819336f, 0.27075195f, 0.17602539f, 0.092041016f, -0.013183594f, -0.17163086f, -0.3166504f, -0.42138672f, -0.53271484f, -0.45898438f, -0.27416992f, -0.21044922f, + -0.38989258f, -0.37597656f, -0.3696289f, -0.2915039f, -0.26098633f, -0.19921875f, -0.15136719f, -0.09057617f, -0.040771484f, 0.13354492f, 0.30126953f, 0.3857422f, 0.40649414f, 0.31103516f, 0.30004883f, 0.3317871f, + 0.35107422f, 0.5229492f, 0.41870117f, 0.14355469f, -0.037597656f, -0.13134766f, -0.18383789f, -0.18066406f, -0.15771484f, -0.17480469f, -0.17041016f, -0.15209961f, -0.08251953f, -0.06616211f, -0.064453125f, -0.03466797f, + -0.66845703f, -0.31030273f, -0.21435547f, -0.11987305f, -0.103271484f, 0.080322266f, 0.21801758f, 0.20874023f, 0.1015625f, 0.032958984f, -0.043945312f, 0.078125f, 0.07324219f, 0.07763672f, 0.20727539f, 0.38208008f, + -0.17163086f, -0.1171875f, -0.03491211f, 0.060302734f, 0.1809082f, 0.33666992f, 0.3955078f, 0.27172852f, 0.12841797f, -0.036865234f, -0.17163086f, -0.21289062f, -0.20800781f, -0.17333984f, -0.125f, -0.12231445f, + -0.1875f, -0.3996582f, -0.017822266f, 0.10058594f, 0.057617188f, 0.028320312f, 0.05493164f, 0.04272461f, 0.041503906f, 0.046875f, 0.041748047f, 0.0546875f, 0.06201172f, 0.03149414f, 0.013427734f, 0.028564453f, + 0.34814453f, 0.234375f, -0.05493164f, -0.1821289f, -0.2878418f, -0.31176758f, -0.28100586f, -0.19824219f, -0.15673828f, -0.08251953f, 0.030273438f, 0.13647461f, 0.2211914f, 0.20776367f, 0.16455078f, 0.21240234f, + -0.057861328f, -0.10571289f, 0.08984375f, 0.30444336f, 0.18945312f, 0.14770508f, 0.09082031f, -0.020996094f, -0.053466797f, -0.044433594f, -0.07128906f, -0.08886719f, -0.079833984f, -0.0859375f, -0.09790039f, -0.1159668f, + 0.17626953f, 0.26049805f, 0.2175293f, 0.21020508f, 0.20141602f, 0.27734375f, 0.21606445f, -0.0012207031f, -0.010986328f, -0.11694336f, -0.2331543f, -0.15844727f, -0.08081055f, -0.08886719f, -0.35717773f, -0.5114746f, + -0.38134766f, -0.4855957f, -0.35986328f, -0.16137695f, -0.026123047f, 0.009033203f, -0.0126953125f, 0.040283203f, 0.095458984f, 0.15454102f, 0.16333008f, 0.19140625f, 0.21142578f, 0.203125f, 0.17993164f, 0.1784668f, + 0.05834961f, 0.06298828f, 0.041015625f, 0.031982422f, 0.07910156f, 0.06713867f, -0.028808594f, -0.05053711f, -0.024902344f, -0.17822266f, -0.3227539f, -0.1665039f, -0.0053710938f, 0.05517578f, 0.119384766f, 0.26123047f, + 0.047851562f, -0.042236328f, -0.24145508f, -0.038330078f, 0.052734375f, 0.068603516f, 0.05810547f, 0.011962891f, -0.013916016f, -0.010986328f, 0.020019531f, 0.02758789f, 0.03100586f, 0.02319336f, 0.014160156f, -0.008056641f, + -0.0036621094f, 0.0014648438f, 0.013671875f, 0.0f, 0.021240234f, 0.033447266f, 0.014892578f, 0.004638672f, 0.056884766f, 0.13427734f, 0.08691406f, -0.005126953f, -0.072753906f, -0.095214844f, -0.10961914f, -0.08105469f, + -0.15966797f, -0.110839844f, -0.13012695f, -0.071777344f, -0.064941406f, -0.056396484f, -0.046142578f, -0.012207031f, 0.048583984f, 0.036865234f, -0.00048828125f, -0.024414062f, -0.012939453f, 0.092041016f, 0.21435547f, 0.29858398f, + 0.55981445f, 0.15820312f, -0.012451172f, -0.04321289f, -0.05810547f, -0.014892578f, -0.021484375f, -0.038330078f, -0.033691406f, -0.037597656f, -0.0690918f, -0.076416016f, -0.0637207f, -0.064697266f, -0.0847168f, -0.099853516f, + -0.039794922f, -0.032714844f, -0.030273438f, -0.051513672f, -0.03564453f, -0.041015625f, -0.0390625f, 0.017822266f, 0.051513672f, 0.013916016f, -0.044677734f, -0.061035156f, -0.012207031f, 0.07299805f, 0.123291016f, 0.10888672f, + 0.45117188f, 0.46704102f, 0.38916016f, 0.23242188f, 0.16430664f, 0.1809082f, 0.20922852f, 0.033935547f, -0.13720703f, -0.2758789f, -0.39941406f, -0.3840332f, -0.31054688f, -0.28466797f, -0.28955078f, -0.04663086f, + -0.088134766f, -0.22973633f, -0.4194336f, -0.49487305f, -0.4038086f, -0.27734375f, -0.2253418f, -0.1315918f, -0.044677734f, 0.12036133f, 0.24951172f, 0.31103516f, 0.52124023f, 0.484375f, 0.32739258f, 0.30126953f, + 0.33203125f, 0.29614258f, 0.1796875f, 0.06689453f, 0.100097656f, 0.13867188f, 0.03491211f, -0.032714844f, -0.12060547f, -0.2097168f, -0.29638672f, -0.20898438f, -0.08227539f, -0.16821289f, -0.16015625f, 0.13134766f, + -0.44189453f, 0.017578125f, 0.07397461f, 0.033447266f, 0.044189453f, 0.04711914f, 0.030273438f, 0.040771484f, 0.041015625f, 0.022949219f, 0.004638672f, 0.018798828f, 0.028564453f, 0.018798828f, -0.00048828125f, 0.020751953f, + -0.36621094f, -0.23388672f, -0.08178711f, -0.015136719f, -0.049072266f, 0.07910156f, 0.23120117f, 0.28320312f, 0.38378906f, 0.29223633f, 0.099365234f, -0.0087890625f, -0.09814453f, -0.16455078f, -0.18945312f, -0.16186523f, + -0.17041016f, -0.18359375f, -0.19018555f, -0.15820312f, -0.20239258f, -0.21875f, -0.13110352f, 0.010009766f, 0.12011719f, 0.25097656f, 0.25024414f, 0.2055664f, 0.14526367f, 0.13964844f, 0.103759766f, 0.029052734f, + 0.06982422f, 0.072265625f, 0.18261719f, 0.025390625f, -0.2475586f, -0.2861328f, -0.111572266f, -0.037109375f, 0.0036621094f, 0.031982422f, 0.043945312f, 0.057373047f, 0.078125f, 0.072021484f, 0.028564453f, 0.016357422f, + 0.07836914f, 0.13549805f, 0.1743164f, 0.15478516f, 0.12573242f, -0.009521484f, -0.1508789f, -0.1965332f, -0.19604492f, -0.103027344f, -0.045898438f, -0.026123047f, 0.020263672f, 0.023925781f, 0.013183594f, 0.0014648438f, + 0.25341797f, 0.22558594f, 0.2241211f, 0.17114258f, 0.18164062f, 0.16894531f, 0.16503906f, 0.20239258f, 0.17041016f, 0.025878906f, -0.16625977f, -0.24121094f, -0.31982422f, -0.4008789f, -0.38256836f, -0.27783203f, +} +; + +const float ivas_sns_cdbks_side_tcx10_stage2[ 8 * 16 ] = +{ + -0.13989258f, -0.024658203f, 0.12670898f, 0.027832031f, 0.06689453f, 0.12817383f, 0.07495117f, -0.01977539f, -0.05834961f, -0.07543945f, -0.06542969f, -0.0546875f, -0.04345703f, -0.0063476562f, 0.034179688f, 0.029541016f, + -0.06713867f, -0.11450195f, -0.09790039f, -0.091308594f, -0.12182617f, -0.010009766f, 0.10986328f, 0.115478516f, 0.060058594f, 0.038085938f, 0.020507812f, 0.017333984f, 0.024169922f, 0.028320312f, 0.038330078f, 0.05053711f, + 0.05517578f, 0.030517578f, 0.0390625f, 0.05810547f, 0.021484375f, 0.032470703f, 0.040039062f, -0.0087890625f, -0.055908203f, -0.023925781f, 0.037109375f, 0.06347656f, 0.02709961f, -0.07373047f, -0.1274414f, -0.115234375f, + 0.11206055f, 0.2006836f, 0.045410156f, -0.10839844f, -0.1418457f, -0.08520508f, -0.032470703f, 0.033935547f, 0.044189453f, 0.006591797f, -0.012451172f, -0.018554688f, -0.013427734f, -0.010498047f, -0.0078125f, -0.012207031f, + -0.041748047f, -0.07373047f, -0.14819336f, 0.021240234f, 0.16015625f, 0.119140625f, 0.055908203f, 0.08081055f, 0.12548828f, 0.05419922f, -0.030761719f, -0.040771484f, -0.060302734f, -0.07128906f, -0.07763672f, -0.072509766f, + -0.07446289f, -0.041259766f, -0.040527344f, -0.068603516f, -0.042236328f, -0.03857422f, -0.05126953f, -0.08886719f, -0.055419922f, 0.036865234f, 0.09033203f, 0.06689453f, 0.08911133f, 0.13110352f, 0.08129883f, 0.0053710938f, + -0.052978516f, 0.033691406f, 0.16015625f, 0.171875f, 0.024658203f, -0.1328125f, -0.1394043f, -0.041992188f, 0.0068359375f, 0.020263672f, 0.008544922f, 0.0014648438f, -0.011474609f, -0.030273438f, -0.022460938f, 0.00390625f, + 0.20898438f, -0.011230469f, -0.08496094f, -0.010986328f, 0.032958984f, -0.013183594f, -0.057861328f, -0.07104492f, -0.06689453f, -0.056396484f, -0.047851562f, -0.03491211f, -0.011962891f, 0.032714844f, 0.08178711f, 0.11035156f, +}; + +const float *const ivas_sns_cdbks_side_tcx10[SNS_MSVQ_NSTAGES_SIDE] = { ivas_sns_cdbks_side_tcx10_stage1, ivas_sns_cdbks_side_tcx10_stage2 }; + +const int16_t sns_1st_cdbk[2][2][8 * 32] = +{ + { /* split 1 */ + { /* TCX 20 */ + -10900, -11064, -10637, -10471, -9051, -6381, -4688, -2438, + -2119, -5087, -6702, -8118, -7586, -6343, -4828, -3406, + 2004, -3443, -4289, -3757, -3234, -2952, -2313, -1781, + 1749, 5598, 3916, 732, -1472, -2964, -3275, -2332, + -11978, -14369, -5600, -545, 981, -929, -57, 1903, + 1745, 391, 202, 115, 256, -291, -862, -1637, + -4052, 2059, 4709, 6768, 5595, 1975, -1723, -1218, + 2093, 7263, 8679, 7576, 3701, -2438, -4389, -2686, + -7120, -6279, -5715, -5520, -4752, -3125, -1856, -438, + 8131, -2543, -6285, -6723, -5588, -4321, -3264, -2164, + -653, -1301, -660, 608, 1598, 1805, 1698, 760, + 4882, 9309, 6333, 1734, 284, 364, 560, 1015, + -7686, -5737, -3443, -1642, 245, 1531, 1827, 1769, + -1468, 3782, 144, -5130, -6883, -5165, -1497, 2072, + -12937, -8429, -2619, 2894, 5004, 4710, 4627, 3740, + 3198, 3928, 4358, 4554, 3887, 2844, 1299, 129, + -13828, -12296, -9364, -7918, -5571, -1909, 307, 2047, + -4314, -1211, -559, -1061, -1928, -2228, -2359, -1902, + -309, -3224, -3404, -1895, -743, -59, 757, 908, + 10914, 5865, 1599, -386, -1392, -2285, -2236, -2042, + -11825, -16241, -11402, -3627, 6556, 8953, 6421, 1546, + 6102, 777, -301, 536, 902, 541, 210, -429, + -3052, 3997, 5389, 1842, -344, 1556, 2667, 2428, + 11788, 10894, 7448, 5423, 2372, -677, -2385, -3839, + -45, -7602, -8923, -7179, -3273, 65, 4500, 6726, + 5895, 626, -1610, -2598, -3240, -3540, -2930, -2156, + -971, 461, 1494, 4907, 5859, 5199, 3678, 2502, + 10766, 5297, 1844, 1236, 2498, 3503, 2846, 838, + -7816, -1212, 891, 2387, 1317, 2225, 1859, 1602, + 2376, 5357, 2088, -2719, -3419, -420, 2431, 2943, + -8383, -795, 4351, 7026, 7460, 7191, 5262, 3796, + 1522, 6283, 8714, 8222, 7434, 5768, 3586, 1499, + }, + { /* TCX 10 */ + -15596, -16321, -10264, -1002, 5955, 5543, -29, -1688, + 17, -3794, -6207, -7356, -6998, -6081, -4453, -2448, + -12543, -11530, -10186, -8817, -7083, -4440, -1946, 892, + 5198, 2751, -274, -2574, -4561, -6087, -5944, -4600, + -683, -2640, -2753, -1195, -239, -217, -286, 90, + -1400, -1146, -1853, -2845, -3456, -3788, -3171, -1969, + -1835, 392, 1725, 1209, -392, -1640, -2001, -1608, + 5770, 7707, 5210, 2112, -382, -2088, -2634, -3007, + -10766, -8101, -5137, -3754, -1881, 331, 2339, 3679, + -2637, -4640, -5811, -5651, -3790, -1359, 913, 1893, + -7793, -4768, -1762, -545, -717, -837, -441, -75, + 4030, 1770, 467, 379, 10, -1330, -2398, -2290, + -9395, -6952, -2494, 2022, 4753, 5614, 4443, 2642, + -1486, 1748, 859, -2586, -3368, -638, 2761, 3269, + -2408, 306, 3633, 6567, 5950, 2474, -621, -1421, + 5478, 7986, 9498, 8165, 5477, 1244, -523, -1586, + -13564, -14673, -10597, -5504, 1575, 8248, 7662, 4025, + 4978, -682, -3586, -4305, -3703, -3001, -2227, -1278, + -8002, -6831, -5558, -4868, -4243, -3393, -2486, -1110, + 11485, 5472, 1645, -533, -1792, -2814, -3169, -2706, + 1617, 421, 232, 1382, 2162, 2017, 1318, 744, + 3677, 5212, 1990, -1514, -2894, -2441, -451, 592, + 731, 4295, 5860, 3756, 1991, 1437, 869, 127, + 12736, 11722, 7768, 4682, 1574, -744, -1989, -3131, + -3490, -4269, -3681, -1531, 1111, 3327, 4138, 3815, + 7344, 1400, -1302, -1502, -1015, 57, 1212, 1498, + -4836, -1881, 1071, 2055, 2114, 2465, 2093, 1458, + 8569, 5879, 3654, 2879, 2530, 1703, 781, -233, + -3709, -990, 2338, 6227, 7083, 7102, 5657, 3401, + 3389, 6392, 5267, 1011, 275, 3519, 5236, 4339, + 599, 3752, 6943, 9211, 8152, 5568, 3337, 1838, + 9885, 9591, 7905, 8068, 7929, 7421, 4234, 757, + } + }, + { /* split 2 */ + { /* TCX 20 */ + -178, -3476, -5982, -7081, -7548, -7440, -6859, -5798, + -3596, -3670, -1501, 770, 812, -286, -2001, -3377, + -3998, -5191, -4988, -4421, -3889, -3571, -2738, -1969, + -2981, -2687, -1501, -83, 1136, 2377, 3248, 4105, + 1842, -41, -1972, -4282, -6779, -8405, -8674, -7835, + -259, 571, 2124, 3344, 2959, 1407, -750, -2523, + -524, -1956, -2855, -3202, -3939, -4666, -4907, -4782, + -5110, -4768, -3017, -663, 4188, 9210, 16602, 21081, + 4373, 4846, -603, -6495, -7289, -5540, -4749, -5527, + -1448, -1043, -619, -105, 356, 362, 542, 857, + 1373, -752, -5334, -6244, -3001, -932, -1040, -3125, + -2403, -1397, 612, 2449, 3920, 5231, 6819, 8581, + 2183, 1211, -111, -1084, -2836, -4977, -6701, -7284, + -751, 1255, 3408, 6474, 7503, 7026, 5413, 4464, + 935, 850, 589, 353, 160, -434, -939, -931, + 268, 2284, 3884, 5423, 6680, 7996, 9244, 9472, + 1075, 113, -1289, -4457, -7512, -5930, -1799, -571, + -3689, -4254, -3755, -2995, -1581, -135, 1049, 1589, + -1166, -1752, -1790, -1897, -1927, -1831, -1359, -805, + -1494, -735, 635, 1993, 2909, 3546, 4226, 4956, + 4435, 4299, 4269, 1328, -3731, -7621, -9319, -9170, + 1358, 2227, 3873, 4469, 4692, 4057, 2601, 1608, + 813, 398, -499, -666, -1286, -2271, -3316, -4025, + -3300, -1255, 2181, 6431, 10002, 12760, 13549, 12584, + 3714, 4180, 484, -2905, -2864, -1359, -1256, -2477, + 308, 868, 1373, 1629, 1793, 1834, 1814, 1746, + 1472, 798, -282, -1935, -1818, 320, 2221, 2914, + 2281, 3240, 2988, 1400, 2383, 4072, 5667, 6675, + 2672, 2678, 2874, 2096, -226, -2301, -3861, -4534, + 4988, 7231, 7641, 7731, 7061, 6447, 5411, 3513, + 3978, 4156, 4126, 2896, 1469, 759, 368, -68, + -264, 4210, 8534, 11008, 11606, 11888, 11072, 8949, + }, + { /* TCX 10 */ + -2852, -6158, -7231, -7830, -8012, -7922, -7556, -6706, + -3911, -5340, -5053, -4741, -4805, -4484, -3727, -3037, + -966, -1461, -1694, -2427, -3081, -3037, -2547, -2230, + -3455, -3315, -2451, -836, 1383, 3196, 3720, 3379, + 3052, 281, -3351, -6866, -9051, -9586, -8983, -8236, + -748, -4465, -4314, -2251, 29, -40, -3963, -6195, + 200, 1293, 2535, 2803, 1603, -186, -1397, -1697, + -1707, -265, 2196, 5295, 5894, 4216, 3440, 3826, + -237, -2133, -2279, -3149, -4377, -5638, -6520, -6764, + -2407, -2049, -1246, -664, -521, -430, -349, -211, + 3874, 1335, -1501, -2055, -1268, -990, -1852, -2871, + -1883, -1845, -1681, -484, 384, 2035, 5839, 9597, + 275, 380, 1048, 424, -1146, -3012, -4431, -5104, + -1699, -484, 756, 1261, 1279, 1377, 1975, 2590, + 2139, 4502, 3645, 4975, 6491, 5972, 5012, 4346, + -3821, -2581, -433, 2667, 6436, 10038, 11311, 8783, + 2359, -2689, -6604, -7039, -5992, -4268, -3711, -4840, + -2776, -4251, -4539, -3672, -2494, -1055, 280, 695, + 491, 866, 822, -44, -1009, -1165, -831, -538, + -1024, 91, 786, 1295, 2433, 3910, 4975, 5403, + 3117, 2590, 2337, -667, -4580, -8147, -9400, -9523, + -103, -630, -831, 669, 3062, 3398, 549, -1690, + 2113, 3467, 4279, 5047, 5344, 3361, 127, -2313, + -1199, 1153, 2914, 3688, 4260, 5421, 7471, 8831, + 2815, 2184, 316, -3058, -5596, -5564, -4343, -3793, + 922, 126, -1414, -1731, -1007, 359, 2029, 3088, + 4889, 4619, 2537, 1114, 950, 946, 799, 419, + -4271, -3750, -3359, -484, 1448, 4106, 10487, 20479, + 3818, 4687, 4064, 2212, -172, -2287, -3535, -4041, + 884, 2456, 3394, 2925, 2182, 2323, 2583, 2507, + 4767, 8057, 8263, 6461, 5003, 4055, 2923, 1845, + 19, 3813, 6926, 8432, 10141, 10850, 9692, 8383, + } + } +}; + +const int16_t sns_1st_means_16k[2][16] = +{ + { /* TCX 20 */ + 14210, 19017, 14362, 9309, 5385, 2674, 1055, -211, -1407, -3059, -4393, -8597, -11180, -11756, -12131, -13281, + }, + { /* TCX 10*/ + 12018, 15915, 11089, 6015, 847, -705, -539, -1548, -893, -2163, -1806, -4189, -7017, -8670, -8874, -9480, + } +}; + +const int16_t sns_1st_means_25k6[2][16] = +{ + { /* TCX 20 */ + 14973, 20323, 16461, 9554, 4017, 3103, 1602, 1694, -221, -1401, -6817, -10071, -11503, -11805, -13158, -16749, + }, + { /* TCX 10 */ + 15560, 19489, 14623, 5595, 2084, 1699, 775, -1312, -2195, -6101, -9078, -9465, -7825, -6603, -7281, -9960, + } +}; + +const int16_t sns_1st_means_32k[2][16] = +{ + { /* TCX 20 */ + 15041, 20603, 16969, 10289, 4973, 4283, 3003, 3316, 1684, -259, -6614, -9535, -10363, -11834, -16625, -24930, + }, + { /* TCX 10 */ + 16510, 20660, 16025, 7224, 3921, 3868, 2623, 742, -1316, -6269, -8284, -7288, -6380, -8410, -13351, -20277, + } +}; + + +/*----------------------------------------------------------------------* + * MC ParamUpmix ROM tables + *-----------------------------------------------------------------------*/ + +const ACPL_QUANT_TABLE ivas_mc_paramupmix_alpha_quant_table[] = +{ + /* Alfa Fine */ + { + 33, /* nquant */ + 16, /* offset */ + { -2.000000e+000f, -1.809375e+000f, -1.637500e+000f, -1.484375e+000f, -1.350000e+000f, -1.234375e+000f, -1.137500e+000f, -1.059375e+000f, -1.000000e+000f, -9.406250e-001f, + -8.625000e-001f, -7.656250e-001f, -6.500000e-001f, -5.156250e-001f, -3.625000e-001f, -1.906250e-001f, +0.000000e+000f, +1.906250e-001f, +3.625000e-001f, +5.156250e-001f, + +6.500000e-001f, +7.656250e-001f, +8.625000e-001f, +9.406250e-001f, +1.000000e+000f, +1.059375e+000f, +1.137500e+000f, +1.234375e+000f, +1.350000e+000f, +1.484375e+000f, + +1.637500e+000f, +1.809375e+000f, +2.000000e+000f } /* data */ + }, + { /* Alfa Coarse */ + 17, /* nquant */ + 8, /* offset */ + { -2.000000e+000f, -1.637500e+000f, -1.350000e+000f, -1.137500e+000f, -1.000000e+000f, -8.625000e-001f, -6.500000e-001f, -3.625000e-001f, +0.000000e+000f, +3.625000e-001f, + +6.500000e-001f, +8.625000e-001f, +1.000000e+000f, +1.137500e+000f, +1.350000e+000f, +1.637500e+000f, +2.000000e+000f } /* data */ + } +}; + +const ACPL_QUANT_TABLE ivas_mc_paramupmix_beta_quant_table[2][9] = +{ + { + /* Beta Fine #1 */ + { + 9, /* nquant */ + 0, /* offset */ + { +0.000000e+000f, +2.375000e-001f, +5.500000e-001f, +9.375000e-001f, +1.400000e+000f, +1.937500e+000f, +2.550000e+000f, +3.237500e+000f, +4.000000e+000f } /* data */ + }, + { /* Beta Fine #2 */ + 9, /* nquant */ + 0, /* offset */ + { +0.000000e+000f, +2.035449e-001f, +4.713672e-001f, +8.034668e-001f, +1.199844e+000f, +1.660498e+000f, +2.185430e+000f, +2.774639e+000f, +3.428125e+000f } /* data */ + }, + { /* Beta Fine #3 */ + 9, /* nquant */ + 0, /* offset */ + { +0.000000e+000f, +1.729297e-001f, +4.004688e-001f, +6.826172e-001f, +1.019375e+000f, +1.410742e+000f, +1.856719e+000f, +2.357305e+000f, +2.912500e+000f } /* data */ + }, + { /* Beta Fine #4 */ + 9, /* nquant */ + 0, /* offset */ + { +0.000000e+000f, +1.456543e-001f, +3.373047e-001f, +5.749512e-001f, +8.585938e-001f, +1.188232e+000f, +1.563867e+000f, +1.985498e+000f, +2.453125e+000f } /* data */ + }, + { /* Beta Fine #5 */ + 9, /* nquant */ + 0, /* offset */ + { +0.000000e+000f, +1.217188e-001f, +2.818750e-001f, +4.804688e-001f, +7.175000e-001f, +9.929688e-001f, +1.306875e+000f, +1.659219e+000f, +2.050000e+000f } /* data */ + }, + { /* Beta Fine #6 */ + 9, /* nquant */ + 0, /* offset */ + { +0.000000e+000f, +1.011230e-001f, +2.341797e-001f, +3.991699e-001f, +5.960938e-001f, +8.249512e-001f, +1.085742e+000f, +1.378467e+000f, +1.703125e+000f } /* data */ + }, + { /* Beta Fine #7 */ + 9, /* nquant */ + 0, /* offset */ + { +0.000000e+000f, +8.386719e-002f, +1.942188e-001f, +3.310547e-001f, +4.943750e-001f, +6.841797e-001f, +9.004688e-001f, +1.143242e+000f, +1.412500e+000f } /* data */ + }, + { /* Beta Fine #8 */ + 9, /* nquant */ + 0, /* offset */ + { +0.000000e+000f, +6.995117e-002f, +1.619922e-001f, +2.761230e-001f, +4.123438e-001f, +5.706543e-001f, +7.510547e-001f, +9.535449e-001f, +1.178125e+000f } /* data */ + }, + { /* Beta Fine #9 */ + 9, /* nquant */ + 0, /* offset */ + { +0.000000e+000f, +5.937500e-002f, +1.375000e-001f, +2.343750e-001f, +3.500000e-001f, +4.843750e-001f, +6.375000e-001f, +8.093750e-001f, +1.000000e+000f } /* data */ + } + }, + { + /* Beta Coarse #1 */ + { + 5, /* nquant */ + 0, /* offset */ + { +0.000000e+000f, +5.500000e-001f, +1.400000e+000f, +2.550000e+000f, +4.000000e+000f } /* data */ + }, + { /* Beta Coarse #2 */ + 5, /* nquant */ + 0, /* offset */ + { +0.000000e+000f, +4.004688e-001f, +1.019375e+000f, +1.856719e+000f, +2.912500e+000f } /* data */ + }, + { /* Beta Coarse #3 */ + 5, /* nquant */ + 0, /* offset */ + { +0.000000e+000f, +2.818750e-001f, +7.175000e-001f, +1.306875e+000f, +2.050000e+000f } /* data */ + }, + { /* Beta Coarse #4 */ + 5, /* nquant */ + 0, /* offset */ + { +0.000000e+000f, +1.942188e-001f, +4.943750e-001f, +9.004688e-001f, +1.412500e+000f } /* data */ + }, + { /* Beta Coarse #5 */ + 5, /* nquant */ + 0, /* offset */ + { +0.000000e+000f, +1.375000e-001f, +3.500000e-001f, +6.375000e-001f, +1.000000e+000f } /* data */ + } + } +}; + +/* clang-format on */ diff --git a/lib_com/ivas_rom_com.h b/lib_com/ivas_rom_com.h new file mode 100644 index 0000000000000000000000000000000000000000..9823e5ea30568427aabd1d73a02ff84f1bfd815d --- /dev/null +++ b/lib_com/ivas_rom_com.h @@ -0,0 +1,458 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#ifndef IVAS_ROM_COM_H +#define IVAS_ROM_COM_H + +#include +#include "options.h" +#include "cnst.h" +#include "ivas_cnst.h" +#include "stat_com.h" +#include "ivas_stat_com.h" + + +/*----------------------------------------------------------------------------------* + * General IVAS ROM tables + *----------------------------------------------------------------------------------*/ + +extern const int32_t ivas_brate_tbl[]; + +/*------------------------------------------------------------------------- + * DFT Stereo ROM tables + *------------------------------------------------------------------------*/ + +extern const int16_t dft_band_limits_erb4[]; +extern const int16_t dft_band_limits_erb8[]; +extern const int16_t dft_band_ipd[3][4]; +extern const int16_t dft_band_res_cod[3][4]; + +extern const float dft_res_gains_q[][2]; +extern const float dft_res_cod_alpha[STEREO_DFT_BAND_MAX]; + +extern const float dft_trigo_12k8[STEREO_DFT_N_12k8_ENC / 4 + 1]; +extern const float dft_trigo_32k[STEREO_DFT_N_32k_ENC / 4 + 1]; +extern const float dft_trigo_48k[STEREO_DFT_N_MAX_ENC / 4 + 1]; + +/* Golomb-Rice encoding tables */ +extern const int16_t dft_maps_rpg[]; +extern const int16_t dft_code_itd[]; +extern const int16_t dft_len_itd[]; +extern const int16_t dft_maps_sg[NO_SYMB_GR_SIDE_G * NO_SYMB_GR_SIDE_G]; + +/*----------------------------------------------------------------------------------* + * Range Coder ROM tables + *----------------------------------------------------------------------------------*/ + +extern const uint16_t cum_freq_ari_pk_s17_LC_ext[RANGE_N_CONTEXT][1 + RANGE_N_SYMBOLS]; +extern const uint16_t sym_freq_ari_pk_s17_LC_ext[RANGE_N_CONTEXT][RANGE_N_SYMBOLS]; + +/*----------------------------------------------------------------------------------* + * ECLVQ Stereo ROM tables + *----------------------------------------------------------------------------------*/ + +extern const uint16_t ECSQ_tab_inverse[1 + ECSQ_SEGMENT_SIZE]; + +/*----------------------------------------------------------------------------------* + * Stereo ICA ROM tables + *----------------------------------------------------------------------------------*/ + +extern const float ica_sincInterp2[]; +extern const float ica_sincInterp4[]; +extern const float ica_sincInterp6[]; + +/*----------------------------------------------------------------------------------* + * Stereo IC-BWE ROM tables + *----------------------------------------------------------------------------------*/ + +extern const float icbwe_gsMapping_tbl[]; +extern const float icbwe_gsMappingDFT_tbl[]; + +/*----------------------------------------------------------------------------------* + * TD Stereo ROM tables + *----------------------------------------------------------------------------------*/ + +extern const float tdm_ratio_tabl[]; +extern const float tdm_den_ratio_tabl[]; +extern const int16_t tdm_bit_allc_tbl[5][6]; + +/* LSFs Intra-frame prediction tables */ +extern const float tdm_LSF_MEAN_RE_USE_OUT[M]; +extern const float tdm_LSF_MEAN_RE_USE_IN[M]; +extern const float tdm_LSF_MEAN_RE_USE[M]; + +extern const float tdm_Beta_Q1bit_re_use_13k2[2]; +extern const float tdm_Beta_Q1bit_re_use_16k4[2]; +extern const float tdm_Beta_Q1bit_re_use_24k4_32k[2]; +extern const float tdm_Beta_Q1bit_re_use_48k[2]; + +extern const float tdm_RE_USE_adaptive_beta_prd_diag_3[15 + 16 + 15]; + +extern const float tdm_LSF_MEAN_PRED_QNT_OUT[M]; +extern const float tdm_LSF_MEAN_PRED_QNT_IN[M]; +extern const float tdm_LSF_MEAN_PRED_QNT[M]; +extern const float tdm_PRED_QNT_fixed_beta_prd_diag_3[15 + 16 + 15]; + +extern const int16_t fast_FCB_bits_2sfr[]; +extern const int16_t fast_FCB_rates_2sfr[]; + +/*----------------------------------------------------------------------------------* + * MDCT Stereo ROM tables + *----------------------------------------------------------------------------------*/ + +extern const SpectrumWarping sw16000Hz[]; /* PsychLPC */ +extern const SpectrumWarping sw25600Hz[]; /* PsychLPC */ +extern const SpectrumWarping sw32000Hz[]; /* PsychLPC */ + +extern const MDCTStereoBands_config mdctStereoBands_32000_640[]; +extern const float nf_tw_smoothing_coeffs[N_LTP_GAIN_MEMS]; + +/*----------------------------------------------------------------------------------* + * Stereo DTX ROM tables + *----------------------------------------------------------------------------------*/ + +extern const float dft_cng_coh_pred[][STEREO_DFT_COH_PRED_COEFFS]; +extern const int16_t dft_cng_coh_u2i[9]; +extern const int16_t dft_cng_coh_i2u[9]; +extern const float dft_cng_alpha_bits[STEREO_DFT_N_COH_ALPHA_STEPS][STEREO_DFT_N_COH_ALPHA_LEVELS]; +extern const int16_t dft_cng_coh_alpha_start[STEREO_DFT_N_COH_ALPHA_STEPS - 1]; + +/*----------------------------------------------------------------------------------* + * DirAC ROM tables + *----------------------------------------------------------------------------------*/ + +extern const float diffuseness_reconstructions[DIRAC_DIFFUSE_LEVELS]; +extern const float diffuseness_thresholds[DIRAC_DIFFUSE_LEVELS + 1]; +extern const int16_t DirAC_band_grouping_12[12 + 1]; +extern const int16_t DirAC_band_grouping_6[6 + 1]; +extern const int16_t DirAC_band_grouping_5[5 + 1]; +extern const int16_t DirAC_block_grouping[MAX_PARAM_SPATIAL_SUBFRAMES + 1]; +extern const int16_t DirAC_block_grouping_5ms_MDFT[MAX_PARAM_SPATIAL_SUBFRAMES + 1]; + +extern const float c_weights[DIRAC_NO_FB_BANDS_MAX]; + +extern const float w_nm[NUM_ANA_SECTORS][9]; +extern const float x_nm[NUM_ANA_SECTORS][9]; +extern const float y_nm[NUM_ANA_SECTORS][9]; +extern const float z_nm[NUM_ANA_SECTORS][9]; + +/*------------------------------------------------------------------------------------------* + * SPAR ROM tables + *------------------------------------------------------------------------------------------*/ + +extern const ivas_freq_models_t ivas_arith_pred_r_consts[TOTAL_PRED_QUANT_STRATS_ARITH]; +extern const ivas_freq_models_t ivas_arith_drct_r_consts[TOTAL_DRCT_QUANT_STRATS]; +extern const ivas_freq_models_t ivas_arith_decd_r_consts[TOTAL_DECD_QUANT_STRATS]; +extern const ivas_huff_models_t ivas_huff_pred_r_consts[TOTAL_PRED_QUANT_STRATS_HUFF]; +extern const ivas_huff_models_t ivas_huff_drct_r_consts[TOTAL_DRCT_QUANT_STRATS]; +extern const ivas_huff_models_t ivas_huff_decd_r_consts[TOTAL_DECD_QUANT_STRATS]; +extern const ivas_spar_br_table_t ivas_spar_br_table_consts[IVAS_SPAR_BR_TABLE_LEN]; +extern const int16_t remix_order_set[1][DIRAC_MAX_ANA_CHANS]; +extern const int16_t HOA_keep_ind[IVAS_SPAR_MAX_FB_IN_CHAN]; +extern const int16_t HOA_keep_ind_spar[IVAS_SPAR_MAX_CH]; +extern const int16_t HOA_keep_ind_spar512[IVAS_SPAR_MAX_CH]; + +extern const float dtx_pd_real_min_max[2]; +extern const int16_t dtx_pd_real_q_levels[3][3]; +extern const int16_t dtx_pr_real_q_levels[3][3]; +extern const int16_t pr_pr_idx_pairs[3][3][2]; +extern const int16_t pr_pd_idx_pairs[3][3][2]; + + +/*----------------------------------------------------------------------* + * PCA ROM tables + *-----------------------------------------------------------------------*/ + +extern const int32_t ivas_pca_offset_index1[IVAS_PCA_N1 + 1]; +extern const int16_t ivas_pca_offset_index2[2692]; +extern const int16_t ivas_pca_offset_n2[IVAS_PCA_N1]; + + +/*----------------------------------------------------------------------------------* + * Parametric MC ROM tables + *----------------------------------------------------------------------------------*/ + +extern const int16_t param_mc_band_grouping_20[20 + 1]; +extern const int16_t param_mc_coding_band_mapping_20[20]; +extern const int16_t param_mc_bands_coded_20[4]; +extern const int16_t param_mc_band_grouping_14[14 + 1]; +extern const int16_t param_mc_coding_band_mapping_14[14]; +extern const int16_t param_mc_bands_coded_14[4]; +extern const int16_t param_mc_band_grouping_10[10 + 1]; +extern const int16_t param_mc_coding_band_mapping_10[10]; +extern const int16_t param_mc_bands_coded_10[4]; +extern const int16_t param_mc_start_bin_per_band_20[20]; +extern const int16_t param_mc_active_bins_per_band_20[20]; +extern const int16_t param_mc_start_bin_per_band_14[14]; +extern const int16_t param_mc_active_bins_per_band_14[14]; +extern const int16_t param_mc_start_bin_per_band_10[10]; +extern const int16_t param_mc_active_bins_per_band_10[10]; +extern const int16_t Param_MC_index[MAX_CICP_CHANNELS]; +extern const PARAM_MC_CONF ivas_param_mc_conf[PARAM_MC_NUM_CONFIGS]; +extern const float ivas_param_mc_quant_ild_5d1_48[PARAM_MC_SZ_ILD_QUANTIZER_4BITS]; +extern const float ivas_param_mc_quant_icc[PARAM_MC_SZ_ICC_QUANTIZER]; +extern const uint16_t ivas_param_mc_cum_freq_ild_cicp6_48_16bits[PARAM_MC_SZ_ILD_QUANTIZER_4BITS + 1]; +extern const uint16_t ivas_param_mc_sym_freq_ild_cicp6_48_16bits[PARAM_MC_SZ_ILD_QUANTIZER_4BITS]; +extern const uint16_t ivas_param_mc_cum_freq_ild_delta_cicp6_48_16bits[2 * PARAM_MC_SZ_ILD_QUANTIZER_4BITS]; +extern const uint16_t ivas_param_mc_sym_freq_ild_delta_cicp6_48_16bits[2 * PARAM_MC_SZ_ILD_QUANTIZER_4BITS - 1]; +extern const uint16_t ivas_param_mc_cum_freq_icc_cicp6_48_16bits[PARAM_MC_SZ_ICC_QUANTIZER + 1]; +extern const uint16_t ivas_param_mc_sym_freq_icc_cicp6_48_16bits[PARAM_MC_SZ_ICC_QUANTIZER]; +extern const uint16_t ivas_param_mc_cum_freq_icc_delta_cicp6_48_16bits[2 * PARAM_MC_SZ_ICC_QUANTIZER]; +extern const uint16_t ivas_param_mc_sym_freq_icc_delta_cicp6_48_16bits[2 * PARAM_MC_SZ_ICC_QUANTIZER - 1]; + +extern const uint16_t ivas_param_mc_cum_freq_ild_cicp12_48_16bits[PARAM_MC_SZ_ILD_QUANTIZER_4BITS + 1]; +extern const uint16_t ivas_param_mc_sym_freq_ild_cicp12_48_16bits[PARAM_MC_SZ_ILD_QUANTIZER_4BITS]; +extern const uint16_t ivas_param_mc_cum_freq_ild_delta_cicp12_48_16bits[2 * PARAM_MC_SZ_ILD_QUANTIZER_4BITS]; +extern const uint16_t ivas_param_mc_sym_freq_ild_delta_cicp12_48_16bits[2 * PARAM_MC_SZ_ILD_QUANTIZER_4BITS - 1]; +extern const uint16_t ivas_param_mc_cum_freq_icc_cicp12_48_16bits[PARAM_MC_SZ_ICC_QUANTIZER + 1]; +extern const uint16_t ivas_param_mc_sym_freq_icc_cicp12_48_16bits[PARAM_MC_SZ_ICC_QUANTIZER]; +extern const uint16_t ivas_param_mc_cum_freq_icc_delta_cicp12_48_16bits[2 * PARAM_MC_SZ_ICC_QUANTIZER]; +extern const uint16_t ivas_param_mc_sym_freq_icc_delta_cicp12_48_16bits[2 * PARAM_MC_SZ_ICC_QUANTIZER - 1]; + +extern const uint16_t ivas_param_mc_cum_freq_ild_cicp14_48_16bits[PARAM_MC_SZ_ILD_QUANTIZER_4BITS + 1]; +extern const uint16_t ivas_param_mc_sym_freq_ild_cicp14_48_16bits[PARAM_MC_SZ_ILD_QUANTIZER_4BITS]; +extern const uint16_t ivas_param_mc_cum_freq_ild_delta_cicp14_48_16bits[2 * PARAM_MC_SZ_ILD_QUANTIZER_4BITS]; +extern const uint16_t ivas_param_mc_sym_freq_ild_delta_cicp14_48_16bits[2 * PARAM_MC_SZ_ILD_QUANTIZER_4BITS - 1]; +extern const uint16_t ivas_param_mc_cum_freq_icc_cicp14_48_16bits[PARAM_MC_SZ_ICC_QUANTIZER + 1]; +extern const uint16_t ivas_param_mc_sym_freq_icc_cicp14_48_16bits[PARAM_MC_SZ_ICC_QUANTIZER]; +extern const uint16_t ivas_param_mc_cum_freq_icc_delta_cicp14_48_16bits[2 * PARAM_MC_SZ_ICC_QUANTIZER]; +extern const uint16_t ivas_param_mc_sym_freq_icc_delta_cicp14_48_16bits[2 * PARAM_MC_SZ_ICC_QUANTIZER - 1]; + +extern const uint16_t ivas_param_mc_cum_freq_ild_combined_48_16bits[PARAM_MC_SZ_ILD_QUANTIZER_4BITS + 1]; +extern const uint16_t ivas_param_mc_sym_freq_ild_combined_48_16bits[PARAM_MC_SZ_ILD_QUANTIZER_4BITS]; +extern const uint16_t ivas_param_mc_cum_freq_ild_delta_combined_48_16bits[2 * PARAM_MC_SZ_ILD_QUANTIZER_4BITS]; +extern const uint16_t ivas_param_mc_sym_freq_ild_delta_combined_48_16bits[2 * PARAM_MC_SZ_ILD_QUANTIZER_4BITS - 1]; +extern const uint16_t ivas_param_mc_cum_freq_icc_combined_48_16bits[PARAM_MC_SZ_ICC_QUANTIZER + 1]; +extern const uint16_t ivas_param_mc_sym_freq_icc_combined_48_16bits[PARAM_MC_SZ_ICC_QUANTIZER]; +extern const uint16_t ivas_param_mc_cum_freq_icc_delta_combined_48_16bits[2 * PARAM_MC_SZ_ICC_QUANTIZER]; +extern const uint16_t ivas_param_mc_sym_freq_icc_delta_combined_48_16bits[2 * PARAM_MC_SZ_ICC_QUANTIZER - 1]; + +/*----------------------------------------------------------------------------------* + * Parametric Upmix MC ROM tables + *----------------------------------------------------------------------------------*/ + +extern const int16_t ivas_param_upmx_mx_qmap[2][33]; + + +/*----------------------------------------------------------------------------------* + * MASA ROM tables + *----------------------------------------------------------------------------------*/ + +extern const int16_t bits_direction_masa[DIRAC_DIFFUSE_LEVELS]; +extern const int16_t no_theta_masa[NO_SPHERICAL_GRIDS - 2]; +extern const int16_t no_phi_masa[NO_SPHERICAL_GRIDS][MAX_NO_THETA]; + +extern const float delta_theta_masa[NO_SPHERICAL_GRIDS - 2]; + +extern const float azimuth_cb[8]; +extern const float coherence_cb0_masa[DIRAC_DIFFUSE_LEVELS * 2 * MASA_NO_CV_COH]; +extern const float coherence_cb1_masa[MASA_NO_CV_COH1 * MASA_MAXIMUM_CODING_SUBBANDS]; /* 25 */ +extern const int16_t len_cb_dct0_masa[DIRAC_DIFFUSE_LEVELS]; +extern const uint8_t sur_coherence_cb_masa[MASA_NO_CB_SUR_COH * MASA_MAX_NO_CV_SUR_COH]; +extern const int16_t idx_cb_sur_coh_masa[MASA_NO_CV_COH]; +extern const int16_t len_huf_masa[MASA_NO_CV_COH1]; +extern const int16_t huff_code_av_masa[MASA_NO_CV_COH1]; + +extern const int16_t MASA_band_grouping_24[24 + 1]; +extern const int16_t MASA_band_mapping_24_to_18[18 + 1]; +extern const int16_t MASA_band_mapping_24_to_12[12 + 1]; +extern const int16_t MASA_band_mapping_24_to_8[8 + 1]; +extern const int16_t MASA_band_mapping_24_to_5[5 + 1]; + +extern const int16_t MASA_grouping_8_to_5[8]; +extern const int16_t MASA_grouping_12_to_5[12]; +extern const int16_t MASA_grouping_18_to_5[18]; +extern const int16_t MASA_grouping_24_to_5[24]; +extern const int16_t masa_bits[14]; +extern const int16_t masa_bits_LR_stereo[4]; +extern const int16_t mcmasa_bits[]; +extern const uint8_t masa_nbands[]; +extern const uint8_t masa_joined_nbands[]; +extern const uint8_t masa_twodir_bands[]; +extern const uint8_t masa_twodir_bands_joined[]; + +extern const float diffuseness_reconstructions_hr[HR_MASA_ER_LEVELS]; +extern const float diffuseness_thresholds_hr[HR_MASA_ER_LEVELS + 1]; + +/* Multi-channel input and output setups */ +extern const float ls_azimuth_CICP2[2]; +extern const float ls_elevation_CICP2[2]; +extern const float ls_azimuth_CICP6[5]; +extern const float ls_elevation_CICP6[5]; +extern const float ls_azimuth_CICP12[7]; +extern const float ls_elevation_CICP12[7]; +extern const float ls_azimuth_CICP14[7]; +extern const float ls_elevation_CICP14[7]; +extern const float ls_azimuth_CICP16[9]; +extern const float ls_elevation_CICP16[9]; +extern const float ls_azimuth_CICP19[11]; +extern const float ls_elevation_CICP19[11]; + +extern const float cb_azi_chan[]; + +extern const float McMASA_LFEGain_vectors[64]; + +/*----------------------------------------------------------------------------------* + * MASA and ISM (OMASA) combined format ROM tables + *----------------------------------------------------------------------------------*/ + +extern const int32_t sep_object_brate[][MAX_NUM_OBJECTS]; +extern const float dct4[]; +extern const float dct5[]; +extern const float dct8[]; +extern const float dct12[]; + +/*----------------------------------------------------------------------------------* + * ISM ROM tables + *----------------------------------------------------------------------------------*/ + +extern const float ism_azimuth_borders[4]; +extern const float ism_elevation_borders[4]; + +/*----------------------------------------------------------------------------------* + * Param ISM ROM tables + *----------------------------------------------------------------------------------*/ + +extern const int16_t Param_ISM_band_grouping[MAX_PARAM_ISM_NBANDS + 1]; + +/*----------------------------------------------------------------------------------* + * LFE coding ROM tables + *----------------------------------------------------------------------------------*/ + +extern const float ivas_lpf_4_butter_16k_sos[IVAS_BIQUAD_FILT_LEN << 2]; +extern const float ivas_lpf_4_butter_32k_sos[IVAS_BIQUAD_FILT_LEN << 2]; +extern const float ivas_lpf_4_butter_48k_sos[IVAS_BIQUAD_FILT_LEN << 2]; +extern const float ivas_lpf_2_butter_16k[IVAS_BIQUAD_FILT_LEN << 1]; +extern const float ivas_lpf_2_butter_32k[IVAS_BIQUAD_FILT_LEN << 1]; +extern const float ivas_lpf_2_butter_48k[IVAS_BIQUAD_FILT_LEN << 1]; + +extern const float ivas_lfe_window_coeff_48k[IVAS_LFE_FADE_LEN_48K]; +extern const float ivas_lfe_window_coeff_32k[IVAS_LFE_FADE_LEN_32K]; +extern const float ivas_lfe_window_coeff_16k[IVAS_LFE_FADE_LEN_16K]; + +extern const int16_t ivas_lfe_num_ele_in_coder_models[2][4]; +extern const int16_t ivas_lfe_num_dct_pass_bins_tbl[IVAS_LFE_NUM_COEFFS_IN_SUBGRP]; +extern const int16_t ivas_lfe_min_shift_tbl[IVAS_LFE_NUM_COEFFS_IN_SUBGRP]; +extern const ivas_lfe_freq_models ivas_str_lfe_freq_models; +extern const float ivas_lfe_lpf_delay[2]; + +extern const double d_hamm_lfe_plc[LFE_PLC_LENANA / 2]; + +extern const float ivas_sin_twiddle_480[IVAS_480_PT_LEN >> 1]; +extern const float ivas_cos_twiddle_480[IVAS_480_PT_LEN >> 1]; +extern const float ivas_sin_twiddle_320[IVAS_320_PT_LEN >> 1]; +extern const float ivas_cos_twiddle_320[IVAS_320_PT_LEN >> 1]; +extern const float ivas_sin_twiddle_160[IVAS_160_PT_LEN >> 1]; +extern const float ivas_cos_twiddle_160[IVAS_160_PT_LEN >> 1]; +extern const float ivas_sin_twiddle_80[IVAS_80_PT_LEN >> 1]; +extern const float ivas_cos_twiddle_80[IVAS_80_PT_LEN >> 1]; + +/*------------------------------------------------------------------------------------------* + * MDFT/iMDFT ROM tables + *------------------------------------------------------------------------------------------*/ + +extern const float ivas_mdft_coeff_cos_twid_240[IVAS_240_PT_LEN + 1]; +extern const float ivas_mdft_coeff_cos_twid_160[IVAS_160_PT_LEN + 1]; +extern const float ivas_mdft_coeff_cos_twid_120[IVAS_120_PT_LEN + 1]; +extern const float ivas_mdft_coeff_cos_twid_80[IVAS_80_PT_LEN + 1]; +extern const float ivas_mdft_coeff_cos_twid_40[IVAS_40_PT_LEN + 1]; +extern const float ivas_mdft_coeff_cos_twid_960[IVAS_960_PT_LEN + 1]; +extern const float ivas_mdft_coeff_cos_twid_640[IVAS_640_PT_LEN + 1]; +extern const float ivas_mdft_coeff_cos_twid_320[IVAS_320_PT_LEN + 1]; +extern const int16_t dirac_gains_P_idx[16]; +extern const float dirac_gains_norm_term[9]; +extern const float dirac_gains_Pnm[91][9]; +extern const float dirac_gains_trg_term[181][2]; + +/*------------------------------------------------------------------------------------------* + * FB ROM tables + *------------------------------------------------------------------------------------------*/ + +extern const float ivas_fb_fcs_12band_1ms[IVAS_FB_BANDS_12]; + +extern const float ivas_fb_fr_12band_1ms_re[IVAS_FB_12_1MS_LEN]; +extern const float ivas_fb_fr_12band_1ms_im[IVAS_FB_12_1MS_LEN]; + +extern const int16_t ivas_fb_bins_per_band_12band_1ms[IVAS_NUM_SUPPORTED_FS][IVAS_FB_BANDS_12]; +extern const int16_t ivas_fb_bins_start_offset_12band_1ms[IVAS_NUM_SUPPORTED_FS][IVAS_FB_BANDS_12]; +extern const int16_t ivas_fb_abs_bins_per_band_12band_1ms[IVAS_NUM_SUPPORTED_FS][IVAS_FB_BANDS_12]; +extern const int16_t ivas_fb_abs_bins_start_offset_12band_1ms[IVAS_NUM_SUPPORTED_FS][IVAS_FB_BANDS_12]; + +extern const float ivas_fb_cf_4ms_48k[IVAS_FB_4MS_48K_SAMP]; +extern const float ivas_fb_cf_1ms_48k[IVAS_FB_1MS_48K_SAMP]; +extern const float ivas_fb_cf_4ms_32k[IVAS_FB_4MS_32K_SAMP]; +extern const float ivas_fb_cf_1ms_32k[IVAS_FB_1MS_32K_SAMP]; +extern const float ivas_fb_cf_4ms_16k[IVAS_FB_4MS_16K_SAMP]; +extern const float ivas_fb_cf_1ms_16k[IVAS_FB_1MS_16K_SAMP]; + +extern const float ivas_fb_resp_cheby_ramp_32del[IVAS_FB_1MS_32K_SAMP + 1]; +extern const float ivas_fb_resp_cheby_ramp_16del[IVAS_FB_1MS_16K_SAMP + 1]; + +extern const int16_t ivas_num_active_bands[FB - WB + 1]; + +/*------------------------------------------------------------------------------------------* + * SNS MSVQ codebooks and means + *------------------------------------------------------------------------------------------*/ + +extern const int16_t ivas_sns_cdbks_tcx20_levels[]; +extern const int16_t ivas_sns_cdbks_tcx20_bits[]; + +extern const int16_t ivas_sns_cdbks_tcx10_levels[]; +extern const int16_t ivas_sns_cdbks_tcx10_bits[]; + +extern const float *const ivas_sns_cdbks_tcx20[]; +extern const float *const ivas_sns_cdbks_tcx10[]; + +extern const int16_t ivas_sns_cdbks_side_tcx20_levels[]; +extern const int16_t ivas_sns_cdbks_side_tcx20_bits[]; +extern const int16_t ivas_sns_cdbks_side_tcx10_levels[]; +extern const int16_t ivas_sns_cdbks_side_tcx10_bits[]; + +extern const float *const ivas_sns_cdbks_side_tcx20[]; +extern const float *const ivas_sns_cdbks_side_tcx10[]; + +/* means and codebooks for the split VQ in the 2-stage SNS VQ */ +extern const int16_t sns_1st_cdbk[2][2][8 * 32]; +extern const int16_t sns_1st_means_16k[2][16]; +extern const int16_t sns_1st_means_25k6[2][16]; +extern const int16_t sns_1st_means_32k[2][16]; + + +/*----------------------------------------------------------------------* + * MC ParamUpmix ROM tables + *-----------------------------------------------------------------------*/ + +extern const ACPL_QUANT_TABLE ivas_mc_paramupmix_alpha_quant_table[]; +extern const ACPL_QUANT_TABLE ivas_mc_paramupmix_beta_quant_table[2][9]; + +/* IVAS_ROM_COM_H */ +#endif diff --git a/lib_com/ivas_sba_config.c b/lib_com/ivas_sba_config.c new file mode 100644 index 0000000000000000000000000000000000000000..fd1bb70fdce6bc28348aa623761bc08a79a86988 --- /dev/null +++ b/lib_com/ivas_sba_config.c @@ -0,0 +1,336 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include +#include "options.h" +#include "cnst.h" +#include "ivas_cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_stat_com.h" +#include "ivas_rom_com.h" +#include "wmc_auto.h" + + +/*-------------------------------------------------------------------* + * ivas_sba_config() + * + * Configure SBA coding + *-------------------------------------------------------------------*/ + +void ivas_sba_config( + const int32_t sba_total_brate, /* i : SBA total bitrate */ + int16_t sba_order, /* i : Ambisonic (SBA) order */ + int16_t nb_channels, /* i : Number of ambisonic channels */ + int16_t *nchan_transport, /* o : number of transport channels */ + const int16_t sba_planar, /* i : SBA Planar flag */ + int16_t *nSCE, /* o : number of SCEs */ + int16_t *nCPE, /* o : number of CPEs */ + int16_t *element_mode /* o : element mode of the core coder */ +) +{ + if ( ( sba_order < 0 ) && ( nb_channels < 0 ) ) + { + assert( 0 && "Either order or number of channels must be positive" ); + } + else if ( sba_order < 0 ) + { + sba_order = ivas_sba_get_order( nb_channels, sba_planar ); + } + else if ( nb_channels < 0 ) + { + nb_channels = ivas_sba_get_nchan( sba_order, sba_planar ); + } + else + { + if ( sba_planar ) + { + assert( ( ( 2 * sba_order ) + 1 == nb_channels ) && "Order and number of channels do not correspond!" ); + } + else + { + assert( ( ( sba_order + 1 ) * ( sba_order + 1 ) == nb_channels ) && "Order and number of channels do not correspond!" ); + } + } + + if ( nchan_transport != NULL ) + { + *nchan_transport = ivas_get_sba_num_TCs( sba_total_brate, sba_order ); + } + + /* Configure core coder number of elements*/ + if ( nchan_transport != NULL && nSCE != NULL && nCPE != NULL ) + { + if ( *nchan_transport == 1 ) + { + *nSCE = 1; + *nCPE = 0; + *element_mode = IVAS_SCE; + } + else + { + *nSCE = 0; + *nCPE = *nchan_transport / 2; + if ( 2 * ( *nCPE ) != *nchan_transport ) + { + ( *nCPE )++; + } + *element_mode = IVAS_CPE_MDCT; + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * ivas_sba_get_order() + * + * Get Ambisonic order from number of ambisonic channels + *-------------------------------------------------------------------*/ + +/*! r: Ambisonic (SBA) order */ +int16_t ivas_sba_get_order( + const int16_t nb_channels, /* i : Number of ambisonic channels */ + const int16_t sba_planar /* i : SBA Planar flag */ +) +{ + int16_t sba_order; + + if ( sba_planar ) + { + sba_order = ( nb_channels - 1 ) / 2; + assert( ( 2 * sba_order + 1 == nb_channels ) && "Number of channels not supported in Planar SBA!" ); + } + else + { + sba_order = (int16_t) sqrtf( (float) nb_channels ) - 1; + assert( ( ( sba_order + 1 ) * ( sba_order + 1 ) == nb_channels ) && "Number of channels not supported in SBA!" ); + } + + assert( ( sba_order <= 3 ) && "Error: SBA order must be <= 3!" ); + + return ( sba_order ); +} + + +/*-------------------------------------------------------------------* + * ivas_sba_get_analysis_order() + * + * Get Ambisonic order used for analysis and coding + *-------------------------------------------------------------------*/ + +/*! r: Ambisonic (SBA) order used for analysis and coding */ +int16_t ivas_sba_get_analysis_order( + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + const int16_t sba_order /* i : Ambisonic (SBA) order */ +) +{ + int16_t sba_analysis_order; + + sba_analysis_order = sba_order; + + if ( ivas_total_brate < SBA_MIN_BRATE_HOA ) + { + /* Hard coding the sba_analysis_order as 1 as higher not supported below SBA_MIN_BRATE_HOA bitrate */ + sba_analysis_order = SBA_FOA_ORDER; + } + + return sba_analysis_order; +} + + +/*-------------------------------------------------------------------* + * ivas_sba_get_nchan() + * + * Get number of Ambisonic channels + *-------------------------------------------------------------------*/ + +/*! r: number of Ambisonic channels */ +int16_t ivas_sba_get_nchan( + const int16_t sba_order, /* i : Ambisonic (SBA) order */ + const int16_t sba_planar /* i : SBA planar flag */ +) +{ + int16_t nb_channels; + + if ( sba_planar ) + { + nb_channels = ( 2 * sba_order ) + 1; + } + else + { + nb_channels = ( sba_order + 1 ) * ( sba_order + 1 ); + } + + return ( nb_channels ); +} + + +/*-------------------------------------------------------------------* + * ivas_sba_get_nchan_metadata() + * + * Get number of Ambisonic channels for metadata coding + *-------------------------------------------------------------------*/ + +/*! r: number of ambisonics metadata channels */ +int16_t ivas_sba_get_nchan_metadata( + const int16_t sba_order, /* i : Ambisonic (SBA) order */ + const int32_t ivas_total_brate /* i : IVAS total bitrate */ +) +{ + int16_t nb_channels; + + if ( sba_order == SBA_FOA_ORDER ) + { + nb_channels = FOA_CHANNELS; + } + else + { + if ( ivas_total_brate >= IVAS_512k ) + { + nb_channels = IVAS_SPAR_MAX_CH; + nb_channels = min( nb_channels, ( sba_order + 1 ) * ( sba_order + 1 ) ); + } + else + { + /* FOA + planar HOA */ + nb_channels = FOA_CHANNELS + 2 * ( sba_order - 1 ); + } + } + + return ( nb_channels ); +} + + +/*-------------------------------------------------------------------* + * ivas_sba_get_spar_hoa_ch_ind() + * + * + *-------------------------------------------------------------------*/ + +/*! r: flag indicating to code SPAR HOA MD for all bands */ +void ivas_sba_get_spar_hoa_ch_ind( + const int16_t num_md_chs, /* i : number of MD channels */ + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] ) +{ + int16_t ch; + const int16_t *hoa_ind; + + if ( ivas_total_brate >= IVAS_512k ) + { + hoa_ind = HOA_keep_ind_spar512; + } + else + { + hoa_ind = HOA_keep_ind_spar; + } + + for ( ch = 0; ch < num_md_chs; ch++ ) + { + HOA_md_ind[ch] = hoa_ind[ch]; + } + + return; +} + + +/*-------------------------------------------------------------------* + * ivas_sba_get_spar_hoa_md_flag() + * + * Get the flag to code SPAR HOA MD for all band + *-------------------------------------------------------------------*/ + +void ivas_sba_get_spar_hoa_md_flag( + const int16_t sba_order, /* i : Ambisonic (SBA) order */ + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + int16_t *spar_hoa_md_flag, + int16_t *spar_hoa_dirac2spar_md_flag ) +{ + if ( sba_order > 1 && ivas_total_brate >= IVAS_256k ) + { + *spar_hoa_md_flag = 1; + } + else + { + *spar_hoa_md_flag = 0; + } + + if ( sba_order > 1 && ivas_total_brate >= IVAS_512k ) + { + *spar_hoa_dirac2spar_md_flag = 0; + } + else + { + *spar_hoa_dirac2spar_md_flag = 1; + } + + return; +} + + +/*-------------------------------------------------------------------* + * ivas_sba_zero_vert_comp() + * + * Zero vertical Ambisonics components + *-------------------------------------------------------------------*/ + +void ivas_sba_zero_vert_comp( + float *sba_data[], /* i : SBA signals */ + const int16_t sba_order, /* i : SBA order */ + const int16_t sba_planar, /* i : SBA planar flag */ + const int16_t input_frame /* i : frame length */ +) +{ + int16_t i, j; + + /* Channels in the range i^2+1 to (i+1)^2 -1 are zeroed (retain only first and last channel for that order) */ + for ( i = 1; i <= sba_order; i++ ) + { + /* Keep Z if not planar */ + if ( !sba_planar && i == 1 ) + { + continue; + } + + for ( j = ( i * i + 1 ); j < ( ( i + 1 ) * ( i + 1 ) - 1 ); j++ ) + { + set_zero( sba_data[j], input_frame ); + } + } + + return; +} diff --git a/lib_com/ivas_sns_com.c b/lib_com/ivas_sns_com.c new file mode 100644 index 0000000000000000000000000000000000000000..4708b32c29434a5abde573b7ddb6e099cbcb0997 --- /dev/null +++ b/lib_com/ivas_sns_com.c @@ -0,0 +1,294 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "cnst.h" +#include "prot.h" +#include "ivas_prot.h" +#include "rom_com.h" +#include "ivas_rom_com.h" +#include +#include +#include "wmc_auto.h" + + +/*------------------------------------------------------------------- + * sns_compute_scf() + * + * + *-------------------------------------------------------------------*/ + +void sns_compute_scf( + float spectrum[], + const PsychoacousticParameters *pPsychParams, + const int16_t L_frame, + float *scf ) +{ + int16_t i, n, k; + float x[FDNS_NPTS], xs[FDNS_NPTS], sum, mean, xl4[SNS_NPTS], nf, xl[FDNS_NPTS]; + float tilt; + const uint8_t nBands = pPsychParams->nBands; + const uint8_t *bandLengths = pPsychParams->bandLengths; + int8_t bw = 0; + + + const float w_0 = 1.0f / 12.0f; + const float w_1 = 2.0f / 12.0f; + const float w_2 = 0.25f; /* 3.0f / 12.0f */ + const float w_3 = w_2; + const float w_4 = w_1; + const float w_5 = w_0; + + const float scale_log = INV_LOG_2 * 0.5f; + + assert( nBands == FDNS_NPTS ); + + set_f( x, 0.0f, FDNS_NPTS ); + + if ( bandLengths == NULL ) + { + bw = (int8_t) ( L_frame / nBands ); + /* Energy per band */ + k = 0; + for ( i = 0; i < nBands; ++i ) + { + x[i] = 0.0f; + for ( n = 0; n < bw; ++n, ++k ) + { + x[i] += spectrum[k]; + } + x[i] /= bw; + } + } + else + { + /* Energy per band */ + k = 0; + for ( i = 0; i < nBands; ++i ) + { + x[i] = 0.0f; + for ( n = 0; n < bandLengths[i]; ++n, ++k ) + { + x[i] += spectrum[k]; + } + x[i] /= bandLengths[i]; + } + } + + /* Smoothing */ + xs[0] = 0.75f * x[0] + 0.25f * x[1]; + + for ( i = 1; i < FDNS_NPTS - 1; i++ ) + { + xs[i] = 0.5f * x[i] + 0.25f * x[i - 1] + 0.25f * x[i + 1]; + } + + xs[FDNS_NPTS - 1] = 0.75f * x[FDNS_NPTS - 1] + 0.25f * x[FDNS_NPTS - 2]; + + /* Pre-emphasis */ + switch ( L_frame ) + { + case L_FRAME16k: + tilt = 19.f; + break; + case L_FRAME25_6k: + tilt = 22.f; + break; + case L_FRAME32k: + tilt = 23.5f; + break; + default: + tilt = 0.f; + assert( !"illegal frame length in sns_compute_scf" ); + } + + for ( i = 0; i < FDNS_NPTS; i++ ) + { + xs[i] = xs[i] * powf( 10.0f, (float) i * (float) tilt / ( (float) FDNS_NPTS - 1.0f ) / 10.0f ); + } + + /* Noise floor at -40dB */ + sum = sum_f( xs, FDNS_NPTS ); + mean = sum / FDNS_NPTS; + + nf = mean * powf( 10.0f, -4.0f ); + nf = max( nf, powf( 2.0f, -32.0f ) ); + + + for ( i = 0; i < FDNS_NPTS; i++ ) + { + if ( xs[i] < nf ) + { + xs[i] = nf; + } + } + + /* Log-domain */ + for ( i = 0; i < FDNS_NPTS; i++ ) + { + xl[i] = logf( xs[i] ) * scale_log; + } + + /* Downsampling */ + xl4[0] = w_0 * xl[0] + + w_1 * xl[0] + + w_2 * xl[1] + + w_3 * xl[2] + + w_4 * xl[3] + + w_5 * xl[4]; + + + for ( n = 1; n < SNS_NPTS - 1; n++ ) + { + int16_t n4 = 4 * n; + xl4[n] = w_0 * xl[n4 - 1] + + w_1 * xl[n4] + + w_2 * xl[n4 + 1] + + w_3 * xl[n4 + 2] + + w_4 * xl[n4 + 3] + + w_5 * xl[n4 + 4]; + } + + xl4[SNS_NPTS - 1] = w_0 * xl[FDNS_NPTS - 5] + + w_1 * xl[FDNS_NPTS - 4] + + w_2 * xl[FDNS_NPTS - 3] + + w_3 * xl[FDNS_NPTS - 2] + + w_4 * xl[FDNS_NPTS - 1] + + w_5 * xl[FDNS_NPTS - 1]; + + /* Remove mean and scaling */ + sum = sum_f( xl4, SNS_NPTS ); + mean = sum / SNS_NPTS; + + for ( i = 0; i < SNS_NPTS; i++ ) + { + scf[i] = 0.85f * ( xl4[i] - mean ); + } + + return; +} + +/*------------------------------------------------------------------- + * sns_interpolate_scalefactors() + * + * + *-------------------------------------------------------------------*/ + +void sns_interpolate_scalefactors( + float *scf_int, /* o : interpolated scalefactors for spectrum shaping*/ + const float *scf, /* i : sns scalefactors as derived from the signal or read from the bitstream */ + int16_t encoder_side /* i : flag, if scalefactors have to be inverted */ +) +{ + int16_t n; + + /* Interpolation */ + scf_int[0] = scf[0]; + scf_int[1] = scf[0]; + + for ( n = 0; n <= M - 2; n++ ) + { + scf_int[n * 4 + 2] = scf[n] + ( scf[n + 1] - scf[n] ) / 8.f; + scf_int[n * 4 + 3] = scf[n] + 3.f * ( scf[n + 1] - scf[n] ) / 8.f; + scf_int[n * 4 + 4] = scf[n] + 5.f * ( scf[n + 1] - scf[n] ) / 8.f; + scf_int[n * 4 + 5] = scf[n] + 7.f * ( scf[n + 1] - scf[n] ) / 8.f; + } + + scf_int[FDNS_NPTS - 2] = scf[M - 1] + ( scf[M - 1] - scf[M - 2] ) / 8.f; + scf_int[FDNS_NPTS - 1] = scf[M - 1] + 3.f * ( scf[M - 1] - scf[M - 2] ) / 8.f; + + /* Inversion at encoder-side */ + if ( encoder_side == ENC ) + { + for ( n = 0; n < FDNS_NPTS; n++ ) + { + scf_int[n] = -scf_int[n]; + } + } + + /* Linear domain */ + for ( n = 0; n < FDNS_NPTS; n++ ) + { + scf_int[n] = powf( 2.f, scf_int[n] ); + } + + return; +} + + +/*------------------------------------------------------------------- + * sns_shape_spectrum() + * + * + *-------------------------------------------------------------------*/ + +void sns_shape_spectrum( + float spectrum[], /* i/o: spectrum to be shaped */ + const PsychoacousticParameters *pPsychParams, /* i : psychoacoustic parameters used to get the frequency bands */ + const float *scf_int, /* i : already interpolated SNS scalefactors */ + const int16_t L_frame /* i : frame length */ +) +{ + int16_t i, n, k, bw; + const uint8_t nBands = pPsychParams->nBands; + const uint8_t *bandLengths = pPsychParams->bandLengths; + + if ( bandLengths == NULL ) + { + bw = L_frame / nBands; + + /* Shape spectrum */ + k = 0; + for ( i = 0; i < nBands; ++i ) + { + for ( n = 0; n < bw; ++n, ++k ) + { + spectrum[k] *= scf_int[i]; + } + } + } + else + { + /* Shape spectrum */ + k = 0; + for ( i = 0; i < nBands; ++i ) + { + for ( n = 0; n < bandLengths[i]; ++n, ++k ) + { + spectrum[k] *= scf_int[i]; + } + } + } + + return; +} diff --git a/lib_com/ivas_spar_com.c b/lib_com/ivas_spar_com.c new file mode 100644 index 0000000000000000000000000000000000000000..e80dbf42890c77812cc9c7740db25185dd94edd9 --- /dev/null +++ b/lib_com/ivas_spar_com.c @@ -0,0 +1,2080 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "math.h" +#include "options.h" +#include "ivas_stat_com.h" +#include "prot.h" +#include "ivas_prot.h" +#include "rom_com.h" +#include "ivas_rom_com.h" +#include "cnst.h" +#include +#include "wmc_auto.h" + + +/*------------------------------------------------------------------------------------------* + * Local constants + *------------------------------------------------------------------------------------------*/ + +#define IVAS_FLT_EPS ( 1e-10F ) +#define IVAS_DBL_EPS ( (double) 1e-20 ) + +#define IVAS_REMIX_MULT_FAC ( 0.5f ) + +#define IVAS_ACTIVEW_DM_F ( 1.0f ) +#define IVAS_ACTIVEW_DM_F_DTX ( 0.25f ) +#define IVAS_ACTIVEW_DM_F_VLBR ( 0.25f ) +#define IVAS_LIN_ACTIVEW_QUAD_ACTIVEW_THRESH ( 3.0f ) + +#define IVAS_P_NORM_SCALING ( 1.0f ) +#define IVAS_P_NORM_SCALING_DTX ( 0.75f ) + +#define IVAS_MAT_DIM_3 ( 3 ) +#define IVAS_MAT_DIM_2 ( 2 ) +#define IVAS_MAT_DIM_1 ( 1 ) +#define MAX_MAT_DIM ( FOA_CHANNELS - 1 ) + +/*------------------------------------------------------------------------------------------* + * Static functions declaration + *------------------------------------------------------------------------------------------*/ + + +static void ivas_get_pred_coeffs( float *pppCov_mat_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], float ppPred_coeffs_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], float ppDM_Fv_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], const int16_t in_chans, const int16_t start_band, const int16_t end_band, const int16_t active_w, const int16_t active_w_vlbr, const int16_t dtx_vad, const int16_t from_dirac, const int16_t dyn_active_w_flag, const int16_t res_ind ); + +static void ivas_reorder_array( float in_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS], const int16_t in_chans, const int16_t order[IVAS_SPAR_MAX_CH], float ***mixer_mat, const int16_t start_band, const int16_t end_band ); + +static void ivas_get_Wscaling_factor( float *pppCov_mat_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], float pred_coeffs_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], float ***mixer_mat, const int16_t start_band, const int16_t end_band, const int16_t dtx_vad, const int16_t num_ch, const int16_t *pNum_dmx, const int16_t bands_bw, const int16_t active_w, const int16_t active_w_vlbr, float *pWscale, const int16_t dyn_active_w_flag ); + +static void ivas_calc_post_pred_per_band( float *pppCov_mat_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], float ***mixer_mat, const int16_t num_ch, const int16_t band_idx, float postpred_cov_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH] ); + +static int16_t ivas_is_mat_inv( float in_re[MAX_MAT_DIM][MAX_MAT_DIM], const int16_t dim ); + +static void ivas_calc_mat_inv( float in_re[MAX_MAT_DIM][MAX_MAT_DIM], const int16_t dim, float out_re[MAX_MAT_DIM][MAX_MAT_DIM] ); + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_get_bw_idx_from_sample_rate() + * + * Get bwidth index from sample rate. + *-----------------------------------------------------------------------------------------*/ + +/*! r: audio BW index */ +int16_t ivas_get_bw_idx_from_sample_rate( + const int32_t sampling_rate /* i : sampling rate */ +) +{ + int16_t bwidth = 0; + + switch ( sampling_rate ) + { + case 16000: + bwidth = WB; + break; + case 32000: + bwidth = SWB; + break; + case 48000: + bwidth = FB; + break; + default: + assert( !"Unsupported sample rate!" ); + } + + return bwidth; +} + + +/*------------------------------------------------------------------------- + * ivas_spar_config() + * + * SPAR configuration function + *------------------------------------------------------------------------*/ + +void ivas_spar_config( + int32_t ivas_total_brate, /* i : codec total bitrate */ + const int16_t sba_order, /* i : Ambisonic (SBA) order */ + int16_t *nchan_transport, /* o : number of transport channels */ + int16_t *nSCE, /* o : number of SCEs */ + int16_t *nCPE, /* o : number of CPEs */ + int32_t *core_nominal_brate, /* o : core-coding nominal bitrate */ + const int16_t sid_format /* i : IVAS format indicator from SID frame */ +) +{ + if ( ivas_total_brate == IVAS_SID_5k2 ) + { + if ( sid_format == SID_SBA_1TC ) + { + *nchan_transport = 1; + } + else + { + *nchan_transport = 2; + } + } + else + { + *nchan_transport = ivas_get_sba_num_TCs( ivas_total_brate, sba_order ); + } + + *nCPE = ( *nchan_transport > 1 ) ? ( *nchan_transport + 1 ) >> 1 : 0; + *nSCE = max( 0, *nchan_transport - ( *nCPE << 1 ) ); + + if ( *nchan_transport == 1 ) + { + /* map SPAR SID bitrate to SPAR active bitrate */ + if ( ivas_total_brate == IVAS_SID_5k2 ) + { + ivas_total_brate = IVAS_32k; + } + assert( ivas_total_brate == IVAS_32k || ivas_total_brate == IVAS_24k4 || ivas_total_brate == IVAS_16k4 || ivas_total_brate == IVAS_13k2 ); + if ( ivas_total_brate == IVAS_32k ) + { + *core_nominal_brate = ACELP_24k40; + } + else if ( ivas_total_brate == IVAS_24k4 ) + { + *core_nominal_brate = ACELP_16k40; + } + else if ( ivas_total_brate == IVAS_16k4 ) + { + *core_nominal_brate = ACELP_13k20; + } + else if ( ivas_total_brate == IVAS_13k2 ) + { + *core_nominal_brate = ACELP_9k60; + } + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_get_spar_table_idx() + * + * Get SPAR table index + *-----------------------------------------------------------------------------------------*/ + +/*! r: config. table index */ +int16_t ivas_get_spar_table_idx( + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + const int16_t sba_order, /* i : Ambisonic (SBA) order */ + const int16_t bwidth, /* i : audio bandwidth */ + int16_t *bitlen, /* o : number of bits */ + int16_t *ind /* o : indice */ +) +{ + int16_t table_idx = 0, ind1[IVAS_SPAR_BR_TABLE_LEN]; + int16_t i, j = 0, ind2 = -1; + + for ( i = 0; i < IVAS_SPAR_BR_TABLE_LEN; i++ ) + { + ind1[j] = 0; + if ( ( ivas_spar_br_table_consts[i].ivas_total_brate == ivas_total_brate ) && + ( ivas_spar_br_table_consts[i].sba_order == sba_order ) ) + { + ind1[j++] = i; + } + } + + for ( i = 0; i < j; i++ ) + { + if ( ivas_spar_br_table_consts[ind1[i]].bwidth == bwidth ) + { + ind2 = i; + break; + } + } + assert( j > 0 ); /* to check if bitrate entry is present */ + assert( ind2 >= 0 ); /* to check if bw entry is present */ + + table_idx = ind1[ind2]; + + if ( ind != NULL ) + { + *ind = ind2; + } + + if ( bitlen != NULL ) + { + *bitlen = ivas_get_bits_to_encode( j - 1 ); + } + + return table_idx; +} + + +/*-------------------------------------------------------------------* + * ivas_get_sba_num_TCs() + * + * Return number of TCs in SBA format + *-------------------------------------------------------------------*/ + +/*! r: number of transport channels */ +int16_t ivas_get_sba_num_TCs( + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + const int16_t sba_order /* i : Ambisonic (SBA) order */ +) +{ + int16_t table_idx, nchan_transport; + + table_idx = ivas_get_spar_table_idx( ivas_total_brate, sba_order, SPAR_CONFIG_BW, NULL, NULL ); + + nchan_transport = ivas_spar_br_table_consts[table_idx].nchan_transport; + + return nchan_transport; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_get_pred_coeffs() + * + * Calculation of prediction coefficients + *-----------------------------------------------------------------------------------------*/ + +static void ivas_get_pred_coeffs( + float *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], + float ppPred_coeffs_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], + float ppDM_Fv_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], + const int16_t in_chans, + const int16_t start_band, + const int16_t end_band, + const int16_t active_w, + const int16_t active_w_vlbr, + const int16_t dtx_vad, + const int16_t from_dirac, + const int16_t dyn_active_w_flag, + const int16_t res_ind ) +{ + int16_t i, j, k, b; + float abs_value; + float w_norm_fac; + float div_factor[IVAS_MAX_NUM_BANDS]; + int16_t pred_dim = in_chans - 1; + + w_norm_fac = ( from_dirac == 1 ) ? 1.0f : 3.0f; + + if ( active_w == 0 ) + { + float pPred_temp[IVAS_MAX_NUM_BANDS]; + + set_zero( pPred_temp, IVAS_MAX_NUM_BANDS ); + for ( k = start_band; k < end_band; k++ ) + { + div_factor[k] = max( 1e-20f, cov_real[0][0][k] ); + div_factor[k] = 1 / div_factor[k]; + } + + for ( i = 0; i < pred_dim; i++ ) + { + for ( k = start_band; k < end_band; k++ ) + { + ppPred_coeffs_re[i][k] = cov_real[i + 1][0][k] * div_factor[k]; + + IVAS_CALCULATE_SQ_ABS_N( ppPred_coeffs_re[i][k], abs_value ); + + pPred_temp[k] += abs_value; + } + } + + for ( k = start_band; k < end_band; k++ ) + { + pPred_temp[k] = sqrtf( pPred_temp[k] ); + div_factor[k] = max( 1.0f, pPred_temp[k] ); + div_factor[k] = 1 / div_factor[k]; + } + + for ( i = 0; i < pred_dim; i++ ) + { + for ( k = start_band; k < end_band; k++ ) + { + ppPred_coeffs_re[i][k] = ppPred_coeffs_re[i][k] * div_factor[k]; + ppDM_Fv_re[i][k] = 0; + } + } + } + else + { + float dm_alpha[IVAS_MAX_NUM_BANDS], dm_v_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS]; + float real[IVAS_SPAR_MAX_CH - 1], dm_beta_re = 0, dm_g[IVAS_MAX_NUM_BANDS]; + float dm_f_local, dm_w, dm_y, DM_F[IVAS_MAX_NUM_BANDS]; + float num_f, den_f, passive_g; + float activew_quad_thresh, g_th_sq; + + if ( dyn_active_w_flag == 1 ) + { + activew_quad_thresh = 1.0f; + } + else + { + activew_quad_thresh = IVAS_LIN_ACTIVEW_QUAD_ACTIVEW_THRESH; + } + g_th_sq = activew_quad_thresh * activew_quad_thresh; + + set_zero( dm_alpha, IVAS_MAX_NUM_BANDS ); + + for ( i = 1; i < in_chans; i++ ) + { + for ( k = start_band; k < end_band; k++ ) + { + IVAS_CALCULATE_SQ_ABS_N( cov_real[i][0][k], abs_value ); + dm_alpha[k] += abs_value; + } + } + + for ( k = start_band; k < end_band; k++ ) + { + dm_alpha[k] = sqrtf( dm_alpha[k] ); + div_factor[k] = max( dm_alpha[k], 1e-20f ); + div_factor[k] = 1 / div_factor[k]; + } + + for ( i = 0; i < pred_dim; i++ ) + { + for ( k = start_band; k < end_band; k++ ) + { + dm_v_re[i][k] = cov_real[i + 1][0][k] * div_factor[k]; + } + } + + if ( dtx_vad == 0 ) + { + dm_f_local = IVAS_ACTIVEW_DM_F_DTX; + } + else + { + dm_f_local = ( active_w_vlbr ) ? IVAS_ACTIVEW_DM_F_VLBR : IVAS_ACTIVEW_DM_F; + } + + for ( b = start_band; b < end_band; b++ ) + { + set_zero( real, pred_dim ); + + for ( j = 0; j < pred_dim; j++ ) + { + for ( k = 1; k < in_chans; k++ ) + { + float re; + + IVAS_RMULT_FLOAT( cov_real[j + 1][k][b], dm_v_re[k - 1][b], re ); + real[j] += re; + } + } + dm_beta_re = 0; + for ( k = 0; k < pred_dim; k++ ) + { + float re; + IVAS_RMULT_FLOAT( real[k], dm_v_re[k][b], re ); + dm_beta_re += re; + } + + dm_w = cov_real[0][0][b]; + den_f = max( dm_w, 1e-20f ); + passive_g = dm_alpha[b] / den_f; + + if ( dyn_active_w_flag == 1 ) + { + dm_alpha[b] = 0.0f; + dm_w = 0.0f; + for ( i = 0; i < pred_dim; i++ ) + { + dm_v_re[i][b] = 0.0f; + } + dm_v_re[res_ind - 1][b] = 1.0f; + passive_g = activew_quad_thresh; + } + + if ( passive_g < activew_quad_thresh ) + { + /*linear activeW*/ + dm_y = 0; + + for ( k = 1; k < in_chans; k++ ) + { + dm_y += cov_real[k][k][b]; + } + den_f = max( dm_y, 1e-20f ); + den_f = max( den_f, w_norm_fac * dm_w ); + DM_F[b] = ( dm_f_local * dm_alpha[b] ) / den_f; + DM_F[b] = min( 1.0f, DM_F[b] ); + + den_f = dm_w + ( 2 * dm_alpha[b] * DM_F[b] ) + ( DM_F[b] * DM_F[b] * dm_beta_re ); + den_f = max( den_f, 1e-20f ); + + dm_g[b] = ( dm_alpha[b] + ( DM_F[b] * dm_beta_re ) ) / den_f; + } + else + { + float sqrt_val; + + /* quadratic activeW */ + + num_f = ( dm_beta_re - ( 2 * dm_alpha[b] * activew_quad_thresh ) ); + + sqrt_val = 4 * dm_alpha[b] * dm_alpha[b] * g_th_sq; + sqrt_val += dm_beta_re * dm_beta_re; + sqrt_val -= 4 * dm_beta_re * g_th_sq * dm_w; + sqrt_val = sqrtf( sqrt_val ); + num_f += sqrt_val; + + den_f = 2 * dm_beta_re * g_th_sq; + den_f = max( den_f, 1e-20f ); + dm_g[b] = activew_quad_thresh; + DM_F[b] = ( dm_g[b] * num_f ) / den_f; + } + } + + for ( i = 0; i < pred_dim; i++ ) + { + for ( b = start_band; b < end_band; b++ ) + { + ppPred_coeffs_re[i][b] = dm_v_re[i][b] * dm_g[b]; + + ppDM_Fv_re[i][b] = dm_v_re[i][b] * DM_F[b]; + } + } + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_get_Wscaling_factor() + * + * Calculation of scaling factor for post predicted W channel + *-----------------------------------------------------------------------------------------*/ + +static void ivas_get_Wscaling_factor( + float *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], + float pred_coeffs_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], + float ***mixer_mat, + const int16_t start_band, + const int16_t end_band, + const int16_t dtx_vad, + const int16_t num_ch, + const int16_t *pNum_dmx, + const int16_t bands_bw, + const int16_t active_w, + const int16_t active_w_vlbr, + float *pWscale, + const int16_t dyn_active_w_flag ) +{ + int16_t b, ch; + float dm_f_local, abs_val; + float postpred_cov_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; + + for ( ch = 0; ch < IVAS_SPAR_MAX_CH; ch++ ) + { + set_zero( postpred_cov_re[ch], IVAS_SPAR_MAX_CH ); + } + + if ( dtx_vad == 0 ) + { + dm_f_local = IVAS_ACTIVEW_DM_F_SCALE_DTX; + } + else + { + dm_f_local = ( active_w_vlbr ) ? IVAS_ACTIVEW_DM_F_SCALE_VLBR : IVAS_ACTIVEW_DM_F_SCALE; + } + + for ( b = start_band; b < end_band; b++ ) + { + pWscale[b] = 1; + + if ( ( active_w == 1 ) && ( dyn_active_w_flag == 0 ) ) + { + float Gw_sq, g_sq = 0; + + if ( num_ch != pNum_dmx[b * bands_bw] ) + { + ivas_calc_post_pred_per_band( cov_real, mixer_mat, num_ch, b, postpred_cov_re ); + } + + Gw_sq = cov_real[0][0][b] / max( postpred_cov_re[0][0], IVAS_FLT_EPS ); + + for ( ch = 0; ch < num_ch - 1; ch++ ) + { + IVAS_CALCULATE_SQ_ABS_N( pred_coeffs_re[ch][b], abs_val ); + + g_sq += abs_val; + } + + pWscale[b] = sqrtf( Gw_sq ); + pWscale[b] = pWscale[b] + sqrtf( Gw_sq + ( 4 * dm_f_local * g_sq ) ); + pWscale[b] *= 0.5f; + } + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_create_fullr_dmx_mat() + * + * Calculation of downmix matrix + *-----------------------------------------------------------------------------------------*/ + +void ivas_create_fullr_dmx_mat( + float pred_coeffs_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], + float dm_fv_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], + float ***mixer_mat, + const int16_t in_chans, + const int16_t start_band, + const int16_t end_band, + const int16_t active_w, + ivas_spar_md_com_cfg *hMdCfg ) +{ + int16_t i, j, k, b; + const int16_t *order; + float tmp_p1_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS]; + float tmp_p2_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS]; + float down_mix_mat1_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS]; + int16_t remix_unmix_order; + int16_t nbands; + nbands = end_band - start_band; + remix_unmix_order = hMdCfg->remix_unmix_order; + + order = remix_order_set[remix_unmix_order]; + + for ( i = 0; i < in_chans; i++ ) + { + for ( j = 0; j < in_chans; j++ ) + { + set_zero( &tmp_p1_re[i][j][start_band], nbands ); + set_zero( &tmp_p2_re[i][j][start_band], nbands ); + set_zero( &down_mix_mat1_re[i][j][start_band], nbands ); + } + } + + for ( j = 0; j < in_chans; j++ ) + { + for ( b = start_band; b < end_band; b++ ) + { + tmp_p2_re[j][j][b] = 1.0f; + } + } + + for ( j = 1; j < in_chans; j++ ) + { + for ( b = start_band; b < end_band; b++ ) + { + tmp_p2_re[j][0][b] = -pred_coeffs_re[j - 1][b]; + } + } + + if ( active_w == 1 ) + { + for ( j = 0; j < in_chans; j++ ) + { + for ( b = start_band; b < end_band; b++ ) + { + tmp_p1_re[j][j][b] = 1.0f; + } + } + + for ( j = 1; j < in_chans; j++ ) + { + for ( b = start_band; b < end_band; b++ ) + { + tmp_p1_re[0][j][b] = dm_fv_re[j - 1][b]; + } + } + + /* 4x4 mult */ + for ( i = 0; i < in_chans; i++ ) + { + for ( j = 0; j < in_chans; j++ ) + { + for ( k = 0; k < in_chans; k++ ) + { + for ( b = start_band; b < end_band; b++ ) + { + float tmp_re; + IVAS_RMULT_FLOAT( tmp_p2_re[i][k][b], tmp_p1_re[k][j][b], tmp_re ); + down_mix_mat1_re[i][j][b] += tmp_re; + } + } + } + } + } + else + { + for ( j = 0; j < in_chans; j++ ) + { + for ( k = 0; k < in_chans; k++ ) + { + for ( b = start_band; b < end_band; b++ ) + { + down_mix_mat1_re[j][k][b] = tmp_p2_re[j][k][b]; + } + } + } + } + + if ( remix_unmix_order != 3 ) + { + ivas_reorder_array( down_mix_mat1_re, in_chans, order, mixer_mat, start_band, end_band ); + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_reorder_array() + * + * reorders the input matrix based on order + *-----------------------------------------------------------------------------------------*/ + +static void ivas_reorder_array( + float in_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS], + const int16_t in_chans, + const int16_t order[IVAS_SPAR_MAX_CH], + float ***mixer_mat, + const int16_t start_band, + const int16_t end_band ) +{ + int16_t i, j, b, idx; + + for ( i = 0; i < in_chans; i++ ) + { + idx = order[i]; + + for ( j = 0; j < in_chans; j++ ) + { + for ( b = start_band; b < end_band; b++ ) + { + mixer_mat[i][j][b] = in_re[idx][j][b]; + } + } + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_calc_post_pred_per_band() + * + * Calculate post pred mat per band + *-----------------------------------------------------------------------------------------*/ + +static void ivas_calc_post_pred_per_band( + float *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], + float ***mixer_mat, + const int16_t num_ch, + const int16_t band_idx, + float postpred_cov_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH] ) +{ + int16_t i, j, k; + float dmx_mat_conj[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; + float temp_mat[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; + float tmp_re; + + for ( i = 0; i < num_ch; i++ ) + { + for ( j = 0; j < num_ch; j++ ) + { + dmx_mat_conj[i][j] = mixer_mat[j][i][band_idx]; + } + } + + for ( i = 0; i < num_ch; i++ ) + { + set_zero( postpred_cov_re[i], num_ch ); + } + + /* num_ch x num_ch mult */ + for ( i = 0; i < num_ch; i++ ) + { + for ( j = 0; j < num_ch; j++ ) + { + temp_mat[i][j] = 0; + for ( k = 0; k < num_ch; k++ ) + { + IVAS_RMULT_FLOAT( cov_real[i][k][band_idx], dmx_mat_conj[k][j], tmp_re ); + temp_mat[i][j] += tmp_re; + } + } + } + + /* num_ch x num_ch mult */ + for ( i = 0; i < num_ch; i++ ) + { + for ( j = i; j < num_ch; j++ ) + { + for ( k = 0; k < num_ch; k++ ) + { + IVAS_RMULT_FLOAT( mixer_mat[i][k][band_idx], temp_mat[k][j], tmp_re ); + postpred_cov_re[i][j] += tmp_re; + } + } + } + + for ( i = 0; i < num_ch; i++ ) + { + for ( j = 0; j < i; j++ ) + { + postpred_cov_re[i][j] = postpred_cov_re[j][i]; + } + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_calc_p_coeffs_per_band() + * + * Calculate P coeffs per band + *-----------------------------------------------------------------------------------------*/ + +static void ivas_calc_p_coeffs_per_band( + ivas_spar_md_t *pSparMd, + const int16_t i_ts, + float postpred_cov_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], + const int16_t num_ch, + const int16_t dtx_vad, + const int16_t num_dmx, + const int16_t band_idx ) +{ + int16_t i, j, k; + int16_t m; + float factor = 0; + float recon_uu_re[IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS][IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS]; + float trace = 0; + float p_norm_scaling = 0; + float cov_dd_re[IVAS_SPAR_MAX_CH - 1][IVAS_SPAR_MAX_CH - 1]; + float cov_uu_re[IVAS_SPAR_MAX_CH - 1][IVAS_SPAR_MAX_CH - 1]; + int16_t b_ts_idx; + + b_ts_idx = band_idx + i_ts * IVAS_MAX_NUM_BANDS; + + if ( num_dmx != num_ch ) + { + set_zero( pSparMd->band_coeffs[b_ts_idx].P_re, IVAS_SPAR_MAX_CH - 1 ); + for ( i = 0; i < IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS; i++ ) + { + set_zero( recon_uu_re[i], IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS ); + } + + for ( i = num_dmx; i < num_ch; i++ ) + { + for ( j = num_dmx; j < num_ch; j++ ) + { + cov_uu_re[i - num_dmx][j - num_dmx] = postpred_cov_re[i][j]; + } + } + + if ( dtx_vad == 1 ) + { + for ( i = 1; i < num_dmx; i++ ) + { + for ( j = 1; j < num_dmx; j++ ) + { + cov_dd_re[i - 1][j - 1] = postpred_cov_re[i][j]; + } + } + + if ( num_dmx == 2 ) + { + float re1, re2; + + IVAS_RMULT_FLOAT( pSparMd->band_coeffs[b_ts_idx].C_re[0][0], cov_dd_re[0][0], re1 ); + IVAS_RMULT_FLOAT( pSparMd->band_coeffs[b_ts_idx].C_re[1][0], cov_dd_re[0][0], re2 ); + IVAS_RMULT_FLOAT( pSparMd->band_coeffs[b_ts_idx].C_re[0][0], re1, recon_uu_re[0][0] ); + IVAS_RMULT_FLOAT( pSparMd->band_coeffs[b_ts_idx].C_re[1][0], re1, recon_uu_re[0][1] ); + IVAS_RMULT_FLOAT( pSparMd->band_coeffs[b_ts_idx].C_re[0][0], re2, recon_uu_re[1][0] ); + IVAS_RMULT_FLOAT( pSparMd->band_coeffs[b_ts_idx].C_re[1][0], re2, recon_uu_re[1][1] ); + + for ( i = 0; i < 2; i++ ) + { + for ( j = 0; j < 2; j++ ) + { + cov_uu_re[i][j] -= recon_uu_re[i][j]; + } + } + } + else if ( num_dmx == 3 ) + { + float re1[2], re2; + set_f( re1, 0, 2 ); + + for ( j = 0; j < 2; j++ ) + { + for ( k = 0; k < 2; k++ ) + { + float re; + + IVAS_RMULT_FLOAT( pSparMd->band_coeffs[b_ts_idx].C_re[0][k], cov_dd_re[k][j], re ); + re1[j] += re; + } + } + + IVAS_RMULT_FLOAT( pSparMd->band_coeffs[b_ts_idx].C_re[0][0], re1[0], re2 ); + recon_uu_re[0][0] = re2; + IVAS_RMULT_FLOAT( pSparMd->band_coeffs[b_ts_idx].C_re[0][1], re1[1], re2 ); + recon_uu_re[0][0] += re2; + + cov_uu_re[0][0] -= recon_uu_re[0][0]; + } + else if ( num_dmx == 4 ) + { + /* Step 1: Multiply C * cov_dd * C' */ + float re1[3], re; + + for ( i = 0; i < num_ch - num_dmx; i++ ) + { + set_f( re1, 0, 3 ); + for ( m = 0; m < num_dmx - 1; m++ ) + { + for ( k = 0; k < num_dmx - 1; k++ ) + { + IVAS_RMULT_FLOAT( pSparMd->band_coeffs[b_ts_idx].C_re[i][k], cov_dd_re[k][m], re ); + re1[m] += re; + } + } + for ( j = 0; j < num_ch - num_dmx; j++ ) + { + for ( m = 0; m < num_dmx - 1; m++ ) + { + IVAS_RMULT_FLOAT( pSparMd->band_coeffs[b_ts_idx].C_re[j][m], re1[m], re ); + recon_uu_re[i][j] += re; + } + } + } + + /* Step 2: cov_uu - recon_uu */ + for ( i = 0; i < num_ch - num_dmx; i++ ) + { + for ( j = 0; j < num_ch - num_dmx; j++ ) + { + cov_uu_re[i][j] -= recon_uu_re[i][j]; + } + } + } + } + + p_norm_scaling = IVAS_P_NORM_SCALING; + + if ( ( dtx_vad == 0 ) && ( num_dmx == 1 ) ) + { + p_norm_scaling = IVAS_P_NORM_SCALING_DTX; + } + + trace = 0.0f; + + for ( i = num_dmx; i < num_ch; i++ ) + { + float tmp_out; + IVAS_CALCULATE_RABS( cov_uu_re[i - num_dmx][i - num_dmx], tmp_out ); + trace += tmp_out; + } + + factor = max( 1e-20f, postpred_cov_re[0][0] ); + factor = max( factor, ( p_norm_scaling * trace ) ); + factor = 1 / factor; + + /* normalise Hermitian (except for rounding) cov_uu */ + for ( i = num_dmx; i < num_ch; i++ ) + { + for ( j = num_dmx; j < num_ch; j++ ) + { + if ( i == j ) + { + /* force diagonal to be real */ + cov_uu_re[i - num_dmx][j - num_dmx] *= factor; + } + else + { + /* set off-diag elements to zero */ + cov_uu_re[i - num_dmx][j - num_dmx] = 0; + } + } + } + + /* take sqrt of max of diags and zero */ + for ( i = num_dmx; i < num_ch; i++ ) + { + cov_uu_re[i - num_dmx][i - num_dmx] = sqrtf( max( 0.0f, cov_uu_re[i - num_dmx][i - num_dmx] ) ); + /* cov_uu_im[i - num_dmx][i - num_dmx] = 0; */ + } + + /* save into MD struct */ + for ( i = num_dmx; i < num_ch; i++ ) + { + for ( j = num_dmx; j < num_ch; j++ ) + { + if ( i == j ) + { + pSparMd->band_coeffs[b_ts_idx].P_re[j - num_dmx] = cov_uu_re[i - num_dmx][j - num_dmx]; + } + } + } + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_calc_c_coeffs_per_band() + * + * Calculate C coeffs per band + *-----------------------------------------------------------------------------------------*/ + +static void ivas_calc_c_coeffs_per_band( + ivas_spar_md_t *pSparMd, + const int16_t i_ts, + float postpred_cov_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], + const int16_t num_ch, + const int16_t num_dmx, + const int16_t band_idx, + const int16_t dtx_vad ) +{ + int16_t i, j, k; + + /* worst case for cov_ud is actually 12 x 3 */ + float cov_ud_re[IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS][IVAS_SPAR_MAX_DMX_CHS - 1]; + float cov_dd_re[FOA_CHANNELS - 1][FOA_CHANNELS - 1]; + float cov_dd_re_inv[FOA_CHANNELS - 1][FOA_CHANNELS - 1]; + float trace_cov_dd_re = 0; + float abs_trace; + float re; + int16_t b_ts_idx; + + b_ts_idx = band_idx + i_ts * IVAS_MAX_NUM_BANDS; + + if ( dtx_vad == 0 ) + { + set_zero( &pSparMd->band_coeffs[b_ts_idx].C_re[0][0], ( IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS ) * ( IVAS_SPAR_MAX_DMX_CHS - 1 ) ); + return; + } + + for ( i = num_dmx; i < num_ch; i++ ) + { + for ( j = 1; j < num_dmx; j++ ) + { + cov_ud_re[i - num_dmx][j - 1] = postpred_cov_re[i][j]; + } + } + + for ( i = 1; i < num_dmx; i++ ) + { + for ( j = 1; j < num_dmx; j++ ) + { + cov_dd_re[i - 1][j - 1] = postpred_cov_re[i][j]; + } + } + + for ( i = 0; i < num_dmx - 1; i++ ) + { + trace_cov_dd_re += cov_dd_re[i][i]; + } + trace_cov_dd_re *= 0.005f; + + IVAS_CALCULATE_RABS( trace_cov_dd_re, abs_trace ); + + if ( abs_trace < IVAS_FLT_EPS ) + { + /* protection from cases when variance of residual channels is very small */ + set_zero( &pSparMd->band_coeffs[b_ts_idx].C_re[0][0], ( IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS ) * ( IVAS_SPAR_MAX_DMX_CHS - 1 ) ); + } + else + { + for ( i = 0; i < num_dmx - 1; i++ ) + { + cov_dd_re[i][i] += trace_cov_dd_re; + } + if ( ivas_is_mat_inv( cov_dd_re, num_dmx - 1 ) && ( num_dmx < FOA_CHANNELS ) ) + { + set_zero( &pSparMd->band_coeffs[b_ts_idx].C_re[0][0], ( IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS ) * ( IVAS_SPAR_MAX_DMX_CHS - 1 ) ); + } + else + { + ivas_calc_mat_inv( cov_dd_re, num_dmx - 1, cov_dd_re_inv ); + + for ( i = 0; i < num_ch - num_dmx; i++ ) + { + for ( j = 0; j < num_dmx - 1; j++ ) + { + pSparMd->band_coeffs[b_ts_idx].C_re[i][j] = 0; + for ( k = 0; k < num_dmx - 1; k++ ) + { + IVAS_RMULT_FLOAT( cov_ud_re[i][k], cov_dd_re_inv[k][j], re ); + pSparMd->band_coeffs[b_ts_idx].C_re[i][j] += re; + } + } + } + } + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_calc_c_p_coeffs() + * + * Calculation of C and P coeffs + *-----------------------------------------------------------------------------------------*/ + +void ivas_calc_c_p_coeffs( + ivas_spar_md_t *pSparMd, + float *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], + const int16_t i_ts, + float ***mixer_mat, + const int16_t num_ch, + const int16_t num_dmx, + const int16_t band_idx, + const int16_t dtx_vad, + const int16_t compute_p_flag, + const int16_t dyn_active_w_flag ) +{ + int16_t i, j; + float postpred_cov_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; + + if ( num_dmx != num_ch ) + { + ivas_calc_post_pred_per_band( cov_real, mixer_mat, num_ch, band_idx, postpred_cov_re ); + + if ( num_dmx != 1 ) + { + ivas_calc_c_coeffs_per_band( pSparMd, i_ts, postpred_cov_re, num_ch, num_dmx, band_idx, dtx_vad ); + } + + if ( dyn_active_w_flag ) + { + for ( i = 0; i < num_ch - num_dmx; i++ ) + { + for ( j = 0; j < num_dmx - 1; j++ ) + { + pSparMd->band_coeffs[band_idx + i_ts * IVAS_MAX_NUM_BANDS].C_re[i][j] = 0.0f; + } + } + } + if ( compute_p_flag == 1 ) + { + ivas_calc_p_coeffs_per_band( pSparMd, i_ts, postpred_cov_re, num_ch, dtx_vad, num_dmx, band_idx ); + } + + if ( dyn_active_w_flag ) + { + for ( i = num_dmx; i < num_ch; i++ ) + { + pSparMd->band_coeffs[band_idx + i_ts * IVAS_MAX_NUM_BANDS].P_re[i - num_dmx] = 0; + } + } + } + + return; +} + + +static void ivas_calc_mat_det( + double in_re[MAX_MAT_DIM][MAX_MAT_DIM], + const int16_t dim, + double *det_re ) +{ + if ( dim == IVAS_MAT_DIM_3 ) + { + double re1, re2, re; + IVAS_RMULT_DOUBLE( in_re[1][1], in_re[2][2], re1 ); + IVAS_RMULT_DOUBLE( in_re[1][2], in_re[2][1], re2 ); + re = re1 - re2; + + IVAS_RMULT_DOUBLE( in_re[0][0], re, re1 ); + + *det_re = re1; + + IVAS_RMULT_DOUBLE( in_re[1][0], in_re[2][2], re1 ); + IVAS_RMULT_DOUBLE( in_re[1][2], in_re[2][0], re2 ); + re = re1 - re2; + + IVAS_RMULT_DOUBLE( in_re[0][1], re, re1 ); + + *det_re -= re1; + + IVAS_RMULT_DOUBLE( in_re[1][0], in_re[2][1], re1 ); + IVAS_RMULT_DOUBLE( in_re[1][1], in_re[2][0], re2 ); + re = re1 - re2; + + IVAS_RMULT_DOUBLE( in_re[0][2], re, re1 ); + + *det_re += re1; + } + else if ( dim == IVAS_MAT_DIM_2 ) + { + double re1, re2; + IVAS_RMULT_DOUBLE( in_re[0][0], in_re[1][1], re1 ); + IVAS_RMULT_DOUBLE( in_re[0][1], in_re[1][0], re2 ); + *det_re = re1 - re2; + } + else if ( dim == IVAS_MAT_DIM_1 ) + { + *det_re = in_re[0][0]; + } + else + { + assert( !"matrix dimention not supported!" ); + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_get_mat_cofactor() + * + * Calculate cofactor for invert matrix + *-----------------------------------------------------------------------------------------*/ + +static void ivas_get_mat_cofactor( + double in_re[MAX_MAT_DIM][MAX_MAT_DIM], + double out_re[MAX_MAT_DIM][MAX_MAT_DIM], + const int16_t row, + const int16_t col ) +{ + int16_t i, j; + int16_t r = 0, c = 0; + + for ( i = 0; i < MAX_MAT_DIM; i++ ) + { + for ( j = 0; j < MAX_MAT_DIM; j++ ) + { + if ( i != row && j != col ) + { + + out_re[r][c++] = in_re[i][j]; + } + } + if ( c == 2 ) + { + r++; + c = 0; + } + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_calc_mat_inv() + * + * Calculate Invert of a matrix + *-----------------------------------------------------------------------------------------*/ + +static void ivas_calc_mat_inv( + float in_re[MAX_MAT_DIM][MAX_MAT_DIM], + const int16_t dim, + float out_re[MAX_MAT_DIM][MAX_MAT_DIM] ) +{ + double det; + int16_t i, j; + double dbl_in_re[MAX_MAT_DIM][MAX_MAT_DIM]; + double dbl_out_re[MAX_MAT_DIM][MAX_MAT_DIM]; + + for ( i = 0; i < dim; i++ ) + { + for ( j = 0; j < dim; j++ ) + { + dbl_in_re[i][j] = in_re[i][j]; + } + } + + if ( dim == IVAS_MAT_DIM_1 ) + { + det = ( dbl_in_re[0][0] * dbl_in_re[0][0] ); + /* assert to catch cases when input is singular matrix*/ + assert( det > 0 ); + det = 1 / det; + dbl_out_re[0][0] = dbl_in_re[0][0] * det; + } + else if ( dim == IVAS_MAT_DIM_2 ) + { + double det_re; + double re; + + ivas_calc_mat_det( dbl_in_re, dim, &det_re ); + det = ( det_re * det_re ); + /* assert to catch cases when input is singular matrix*/ + assert( det > 0 ); + det = 1 / det; + + IVAS_RMULT_DOUBLE( det_re, dbl_in_re[1][1], re ); + dbl_out_re[0][0] = re * det; + + IVAS_RMULT_DOUBLE( det_re, dbl_in_re[0][1], re ); + dbl_out_re[0][1] = -re * det; + + IVAS_RMULT_DOUBLE( det_re, dbl_in_re[1][0], re ); + dbl_out_re[1][0] = -re * det; + + IVAS_RMULT_DOUBLE( det_re, dbl_in_re[0][0], re ); + dbl_out_re[1][1] = re * det; + } + else if ( dim == IVAS_MAT_DIM_3 ) + { + double fac_re[IVAS_MAT_DIM_3][IVAS_MAT_DIM_3]; + double det_re; + int16_t sign = 1; + + ivas_calc_mat_det( dbl_in_re, dim, &det_re ); + det = det_re > 0 ? 1 / max( IVAS_DBL_EPS, det_re ) : min( det_re, -IVAS_DBL_EPS ); + + for ( i = 0; i < dim; i++ ) + { + for ( j = 0; j < dim; j++ ) + { + ivas_get_mat_cofactor( dbl_in_re, fac_re, i, j ); + ivas_calc_mat_det( fac_re, IVAS_MAT_DIM_2, &dbl_out_re[j][i] ); + dbl_out_re[j][i] = dbl_out_re[j][i] * det * sign; + + if ( ( ( i + j ) & 1 ) == 0 ) + { + sign = -1; + } + else + { + sign = 1; + } + } + } + } + else + { + assert( !"matrix dimension not supported!" ); + } + + for ( i = 0; i < dim; i++ ) + { + for ( j = 0; j < dim; j++ ) + { + out_re[i][j] = (float) dbl_out_re[i][j]; + } + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_is_mat_inv() + * + * Check if matrix is invertible or not by checking if determinant is 0 or very close to 0 + *-----------------------------------------------------------------------------------------*/ + +static int16_t ivas_is_mat_inv( + float in_re[MAX_MAT_DIM][MAX_MAT_DIM], + const int16_t dim ) +{ + int16_t is_det_zero = 0; + double det, det_re; + int16_t i, j; + double dbl_in_re[MAX_MAT_DIM][MAX_MAT_DIM]; + + for ( i = 0; i < dim; i++ ) + { + for ( j = 0; j < dim; j++ ) + { + dbl_in_re[i][j] = in_re[i][j]; + } + } + + ivas_calc_mat_det( dbl_in_re, dim, &det_re ); + + det = ( det_re * det_re ); + + if ( det < IVAS_DBL_EPS ) + { + is_det_zero = 1; + } + + return is_det_zero; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_compute_spar_params() + * + * + *-----------------------------------------------------------------------------------------*/ + +void ivas_compute_spar_params( + float *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], + float dm_fv_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], + const int16_t i_ts, + float ***mixer_mat, + const int16_t start_band, + const int16_t end_band, + const int16_t dtx_vad, + const int16_t num_ch, + const int16_t bands_bw, + const int16_t active_w, + const int16_t active_w_vlbr, + ivas_spar_md_com_cfg *hSparCfg, + ivas_spar_md_t *hSparMd, + float *pWscale, + const int16_t from_dirac, + const int16_t dyn_active_w_flag ) +{ + float pred_coeffs_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS]; + int16_t b, i, ndm; + + ivas_get_pred_coeffs( cov_real, pred_coeffs_re, dm_fv_re, num_ch, start_band, end_band, active_w, active_w_vlbr, dtx_vad, from_dirac, dyn_active_w_flag, hSparMd->res_ind ); + + ivas_create_fullr_dmx_mat( pred_coeffs_re, dm_fv_re, mixer_mat, num_ch, start_band, end_band, active_w, hSparCfg ); + + ivas_get_Wscaling_factor( cov_real, pred_coeffs_re, mixer_mat, start_band, end_band, dtx_vad, num_ch, hSparCfg->num_dmx_chans_per_band, bands_bw, active_w, active_w_vlbr, pWscale, dyn_active_w_flag ); + + for ( b = start_band; b < end_band; b++ ) + { + float onebyscale = 1.0f / pWscale[b]; + for ( i = 0; i < num_ch - 1; i++ ) + { + hSparMd->band_coeffs[b + i_ts * IVAS_MAX_NUM_BANDS].pred_re[i] = pred_coeffs_re[i][b] * onebyscale; + } + + for ( i = 0; i < num_ch; i++ ) + { + mixer_mat[0][i][b] *= pWscale[b]; + } + } + + for ( b = start_band; b < end_band; b++ ) + { + ndm = hSparCfg->num_dmx_chans_per_band[b * bands_bw]; + + if ( ndm != num_ch ) + { + ivas_calc_c_p_coeffs( hSparMd, cov_real, i_ts, mixer_mat, num_ch, ndm, b, dtx_vad, 1, dyn_active_w_flag ); + + } + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_get_spar_md_from_dirac() + * + * + *-----------------------------------------------------------------------------------------*/ + +void ivas_get_spar_md_from_dirac( + float azi_dirac[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES], + float ele_dirac[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES], + float diffuseness[IVAS_MAX_NUM_BANDS], + const int16_t n_ts, + float ***mixer_mat, + ivas_spar_md_t *hSpar_md, + ivas_spar_md_com_cfg *hSpar_md_cfg, + const int16_t start_band, + const int16_t end_band, + const int16_t order, + const int16_t dtx_vad, + float Wscale_d[IVAS_MAX_NUM_BANDS], + const uint8_t useLowerRes, + const int16_t active_w_vlbr, + const int16_t dyn_active_w_flag ) +{ + int16_t num_ch, band, i, j; + int16_t block, ch; + float response_avg[MAX_OUTPUT_CHANNELS]; + float response[MAX_PARAM_SPATIAL_SUBFRAMES][MAX_OUTPUT_CHANNELS]; + float cov_real_dirac[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS]; + float *pCov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; + float dm_fv_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS]; + float Wscale[IVAS_MAX_NUM_BANDS]; + float mixer_mat_local[IVAS_MAX_FB_MIXER_OUT_CH][IVAS_MAX_SPAR_FB_MIXER_IN_CH][IVAS_MAX_NUM_BANDS]; + float **ppMixer_mat[IVAS_MAX_FB_MIXER_OUT_CH]; + float *pMixer_mat[IVAS_MAX_FB_MIXER_OUT_CH][IVAS_MAX_SPAR_FB_MIXER_IN_CH]; + float en_ratio_fac, diff_norm_order1, diff_norm_order2, diff_norm_order3; + int16_t active_w; + + int16_t ndm, foa_ch, hoa2_ch; + float P_dir_fact[IVAS_SPAR_MAX_CH - 1]; + const int16_t *remix_order; + + remix_order = remix_order_set[hSpar_md_cfg->remix_unmix_order]; + + num_ch = ivas_sba_get_nchan_metadata( order, IVAS_256k /*dummy value as order is always 1 in this function*/ ); + + hoa2_ch = ivas_sba_get_nchan_metadata( SBA_HOA2_ORDER, IVAS_256k /*dummy value as order is always 1 in this function*/ ); + + foa_ch = FOA_CHANNELS; + diff_norm_order1 = 3.0f; + diff_norm_order2 = 5.0f; + diff_norm_order3 = 7.0f; + + for ( i = 0; i < IVAS_MAX_FB_MIXER_OUT_CH; i++ ) + { + for ( j = 0; j < IVAS_MAX_SPAR_FB_MIXER_IN_CH; j++ ) + { + pMixer_mat[i][j] = mixer_mat_local[i][j]; + } + ppMixer_mat[i] = pMixer_mat[i]; + } + + if ( ( start_band >= 6 && hSpar_md_cfg->nchan_transport <= 2 && ( dtx_vad == 1 ) ) || ( useLowerRes && start_band >= 3 && hSpar_md_cfg->nchan_transport <= 2 && ( dtx_vad == 1 ) ) ) + { + float P_norm[3]; + int16_t idx; + + ndm = hSpar_md_cfg->num_dmx_chans_per_band[start_band - 1]; + P_norm[0] = 0.0f; + for ( i = 0; i < max( 0, foa_ch - ndm ); i++ ) + { + P_norm[0] += hSpar_md->band_coeffs[start_band - 1].P_re[i] * hSpar_md->band_coeffs[start_band - 1].P_re[i]; + } + P_norm[0] *= diff_norm_order1 / min( diff_norm_order1, max( 0, foa_ch - ndm ) ); + + P_norm[1] = 0.0f; + for ( ; i < max( 0, min( num_ch, hoa2_ch ) - ndm ); i++ ) + { + P_norm[1] += hSpar_md->band_coeffs[start_band - 1].P_re[i] * hSpar_md->band_coeffs[start_band - 1].P_re[i]; + } + P_norm[1] *= diff_norm_order2 / min( diff_norm_order2, max( 0, min( num_ch, hoa2_ch ) - ndm ) ); + + P_norm[2] = 0.0f; + for ( ; i < num_ch - ndm; i++ ) + { + P_norm[2] += hSpar_md->band_coeffs[start_band - 1].P_re[i] * hSpar_md->band_coeffs[start_band - 1].P_re[i]; + } + P_norm[2] *= diff_norm_order3 / min( diff_norm_order3, max( 0, num_ch - ndm ) ); + + for ( i = 0; i < max( 0, foa_ch - ndm ); i++ ) + { + idx = remix_order[i + ndm] - ndm; + P_dir_fact[idx] = hSpar_md->band_coeffs[start_band - 1].P_re[i] * hSpar_md->band_coeffs[start_band - 1].P_re[i]; + P_dir_fact[idx] = P_dir_fact[idx] / max( IVAS_FLT_EPS, P_norm[0] ); + } + for ( ; i < max( 0, min( num_ch, hoa2_ch ) - ndm ); i++ ) + { + idx = remix_order[i + ndm] - ndm; + P_dir_fact[idx] = hSpar_md->band_coeffs[start_band - 1].P_re[i] * hSpar_md->band_coeffs[start_band - 1].P_re[i]; + P_dir_fact[idx] = P_dir_fact[idx] / max( IVAS_FLT_EPS, P_norm[1] ); + } + for ( ; i < num_ch - ndm; i++ ) + { + idx = remix_order[i + ndm] - ndm; + P_dir_fact[idx] = hSpar_md->band_coeffs[start_band - 1].P_re[i] * hSpar_md->band_coeffs[start_band - 1].P_re[i]; + P_dir_fact[idx] = P_dir_fact[idx] / max( IVAS_FLT_EPS, P_norm[2] ); + } + } + + for ( int16_t i_ts = 0; i_ts < n_ts; i_ts++ ) + { + for ( band = start_band; band < end_band; band++ ) + { + ndm = hSpar_md_cfg->num_dmx_chans_per_band[band]; + + /*SPAR from DirAC*/ + set_f( response_avg, 0.0f, MAX_OUTPUT_CHANNELS ); + + if ( n_ts > 1 ) + { + ivas_dirac_dec_get_response( (int16_t) azi_dirac[band][i_ts], (int16_t) ele_dirac[band][i_ts], response_avg, order ); + } + else if ( useLowerRes ) + { + ivas_dirac_dec_get_response( (int16_t) azi_dirac[band][0], (int16_t) ele_dirac[band][0], response_avg, order ); + } + else + { + for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ ) + { + ivas_dirac_dec_get_response( (int16_t) azi_dirac[band][block], (int16_t) ele_dirac[band][block], &( response[block][0] ), order ); + } + + /* average responses in all subframes*/ + { + float norm; + int16_t num_ch_order, hoa2_ch_order; + + num_ch_order = ivas_sba_get_nchan( order, 0 ); + hoa2_ch_order = ivas_sba_get_nchan( SBA_HOA2_ORDER, 0 ); + + for ( ch = 0; ch < num_ch_order; ch++ ) + { + for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ ) + { + response_avg[ch] += response[block][ch]; + } + response_avg[ch] /= MAX_PARAM_SPATIAL_SUBFRAMES; + } + + /*normalize 1st order*/ + norm = 0.0f; + for ( ch = 1; ch < foa_ch; ch++ ) + { + norm += response_avg[ch] * response_avg[ch]; + } + norm = max( EPSILON, sqrtf( norm ) ); + for ( ch = 1; ch < foa_ch; ch++ ) + { + response_avg[ch] /= norm; + } + + /*normalize 2nd order*/ + norm = 0.0f; + for ( ch = foa_ch; ch < min( hoa2_ch_order, num_ch_order ); ch++ ) + { + norm += response_avg[ch] * response_avg[ch]; + } + norm = max( EPSILON, sqrtf( norm ) ); + for ( ch = foa_ch; ch < min( hoa2_ch_order, num_ch_order ); ch++ ) + { + response_avg[ch] /= norm; + } + + /*normalize 3rd order*/ + norm = 0.0f; + for ( ch = hoa2_ch_order; ch < num_ch_order; ch++ ) + { + norm += response_avg[ch] * response_avg[ch]; + } + norm = max( EPSILON, sqrtf( norm ) ); + for ( ch = hoa2_ch_order; ch < num_ch_order; ch++ ) + { + response_avg[ch] /= norm; + } + } + } + + for ( i = FOA_CHANNELS + 1; i < num_ch; i++ ) + { + response_avg[i] = response_avg[HOA_keep_ind[i]]; + } + + en_ratio_fac = ( 1.0f - diffuseness[band] ); + + for ( i = 0; i < num_ch; i++ ) + { + for ( j = 0; j < num_ch; j++ ) + { + if ( i == j ) + { + if ( i == 0 ) + { + cov_real_dirac[i][i][band] = 1.0f; + } + else + { + cov_real_dirac[i][j][band] = en_ratio_fac * response_avg[i] * response_avg[j]; + + if ( hSpar_md_cfg->nchan_transport <= 2 ) + { + + cov_real_dirac[i][j][band] *= en_ratio_fac; + if ( ( i >= ndm ) && ( dtx_vad == 1 ) ) + { + cov_real_dirac[i][j][band] += ( 1.0f - ( en_ratio_fac * en_ratio_fac ) ) * P_dir_fact[i - ndm]; + } + else + { + if ( i < foa_ch ) + { + cov_real_dirac[i][j][band] += ( 1.0f - ( en_ratio_fac * en_ratio_fac ) ) / diff_norm_order1; + } + else if ( i < hoa2_ch ) + { + cov_real_dirac[i][j][band] += ( 1.0f - ( en_ratio_fac * en_ratio_fac ) ) / diff_norm_order2; + } + else + { + cov_real_dirac[i][j][band] += ( 1.0f - ( en_ratio_fac * en_ratio_fac ) ) / diff_norm_order3; + } + } + } + else + { + if ( i < foa_ch ) + { + cov_real_dirac[i][j][band] += ( 1.0f - en_ratio_fac ) / diff_norm_order1; + } + else if ( i < hoa2_ch ) + { + cov_real_dirac[i][j][band] += ( 1.0f - en_ratio_fac ) / diff_norm_order2; + } + else + { + cov_real_dirac[i][j][band] += ( 1.0f - en_ratio_fac ) / diff_norm_order3; + } + } + } + } + else + { + cov_real_dirac[i][j][band] = en_ratio_fac * response_avg[i] * response_avg[j]; + } + } + } + } + + for ( i = 0; i < num_ch; i++ ) + { + for ( j = 0; j < num_ch; j++ ) + { + pCov_real[i][j] = cov_real_dirac[i][j]; + } + } + + + active_w = ( dyn_active_w_flag == 1 ) || ( hSpar_md_cfg->active_w == 1 ); + + ivas_compute_spar_params( pCov_real, dm_fv_re, i_ts, ppMixer_mat, start_band, end_band, dtx_vad, num_ch, 1, active_w, active_w_vlbr, hSpar_md_cfg, hSpar_md, Wscale, 1, dyn_active_w_flag ); + + if ( mixer_mat != NULL ) + { + for ( band = start_band; band < end_band; band++ ) + { + ndm = hSpar_md_cfg->num_dmx_chans_per_band[band]; + + for ( i = 0; i < ndm; i++ ) + { + for ( j = 0; j < num_ch; j++ ) + { + mixer_mat[i][j][band + i_ts * IVAS_MAX_NUM_BANDS] = ppMixer_mat[i][j][band]; + } + } + + for ( i = ndm; i < num_ch; i++ ) + { + for ( j = 0; j < num_ch; j++ ) + { + mixer_mat[i][j][band + i_ts * IVAS_MAX_NUM_BANDS] = 0.0f; + } + } + + if ( ( ndm == 1 ) && ( Wscale_d != NULL ) ) + { + for ( j = 0; j < num_ch; j++ ) + { + mixer_mat[0][j][band + i_ts * IVAS_MAX_NUM_BANDS] *= Wscale_d[band]; + } + } + } + } + } + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_dirac_dec_get_response() + * + * calculate reponse, 1 degree resolution + *------------------------------------------------------------------------*/ + +void ivas_dirac_dec_get_response( + const int16_t azimuth, + const int16_t elevation, + float *response, + const int16_t ambisonics_order ) +{ + int16_t index_azimuth, index_elevation; + int16_t el, e, az; + float cos_1, cos_2, sin_1, cos_az[3]; + float sin_az[3]; + float f, c; + int16_t l, m; + int16_t b, b1, b_2, b1_2, a; + + index_azimuth = ( azimuth + 180 ) % 360; + index_elevation = elevation + 90; + e = index_elevation > 90 ? -1 : 1; + el = index_elevation > 90 ? 180 - index_elevation : index_elevation; + + az = index_azimuth > 180 ? 360 - index_azimuth : index_azimuth; + f = index_azimuth > 180 ? -1.0f : 1.0f; + + cos_1 = dirac_gains_trg_term[az][0]; + cos_2 = cos_1 * cos_1; + sin_1 = f * dirac_gains_trg_term[az][1]; + cos_az[0] = cos_1; + cos_az[1] = 2.0f * cos_2 - 1.0f; + cos_az[2] = 2.0f * cos_1 * cos_az[1] - cos_az[0]; + sin_az[0] = sin_1; + sin_az[1] = sin_1 * 2.0f * cos_1; + sin_az[2] = sin_1 * ( 4.0f * cos_2 - 1.0f ); + + response[0] = 1.0f; + /* Un-optimized code - for reference */ + /* for( l = 1; l<= ambisonics_order; l++ ) */ + /* { */ + /* int16_t b, b1, a; */ + /* float c; */ + /* for( m = 0; m < l; m++ ) */ + /* { */ + /* b = l*l+m; */ + /* a = dirac_gains_P_idx[b]; */ + /* c = SQRT2 * dirac_gains_norm_term[a] * dirac_gains_Pnm[el][a]; */ + + /* if( m%2 == 1 ) */ + /* { */ + /* c = c*e; */ + /* } */ + + /* response[b] = c * sin_az[l-m-1]; */ + + /* b1 = l*l+2*l-m; */ + /* response[b1] = c * cos_az[l-m-1]; */ + + /* } */ + + /* b = l*l+l; */ + /* a = dirac_gains_P_idx[b]; */ + /* c = dirac_gains_norm_term[a] * dirac_gains_Pnm[el][a]; */ + /* if( l%2 == 1) */ + /* { */ + /* c = c*e; */ + /* } */ + + /* response[b] = c; */ + /* } */ + + for ( l = 1; l <= ambisonics_order; l++ ) + { + b_2 = l * l; + b1_2 = l * l + 2 * l; + for ( m = 0; m < l; m += 2 ) + { + b = b_2 + m; + a = dirac_gains_P_idx[b]; + c = SQRT2 * dirac_gains_norm_term[a] * dirac_gains_Pnm[el][a]; + + response[b] = c * sin_az[l - m - 1]; + + b1 = b1_2 - m; + response[b1] = c * cos_az[l - m - 1]; + } + + for ( m = 1; m < l; m += 2 ) + { + b = b_2 + m; + a = dirac_gains_P_idx[b]; + c = SQRT2 * dirac_gains_norm_term[a] * dirac_gains_Pnm[el][a]; + c = c * e; + + response[b] = c * sin_az[l - m - 1]; + + b1 = b1_2 - m; + response[b1] = c * cos_az[l - m - 1]; + } + + b = b_2 + l; + a = dirac_gains_P_idx[b]; + c = dirac_gains_norm_term[a] * dirac_gains_Pnm[el][a]; + if ( l % 2 == 1 ) + { + c = c * e; + } + + response[b] = c; + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_get_bits_to_encode + * + * Get number of bits required to encode the input value + *-----------------------------------------------------------------------------------------*/ + +int16_t ivas_get_bits_to_encode( + int32_t val ) +{ + int16_t bits_req = 0; + + assert( val >= 0 ); + + while ( val ) + { + bits_req++; + val >>= 1; + } + + return bits_req; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_spar_set_bitrate_config() + * + * Set SPAR bitrate config + *-----------------------------------------------------------------------------------------*/ + +void ivas_spar_set_bitrate_config( + ivas_spar_md_com_cfg *pSpar_md_cfg, /* i/o: SPAR MD config. handle */ + const int16_t table_idx, /* i : config. table index */ + const int16_t num_bands, /* i : number of bands */ + const int16_t dirac2spar_md_flag, + const int16_t enc_flag, + const int16_t pca_flag, + const int16_t agc_flag ) +{ + int32_t ivas_total_brate; + int16_t i, total_bits, max_bits, code, length; + int16_t sba_order; + int16_t md_coding_bits_header; + int16_t agc_bits, pca_bits, num_PR_bits_dirac_bands; + int16_t bits_PR, bits_C, bits_P; + int16_t wc_coarse_strat; + int16_t n_input, n_dmx, n_dec; + int16_t quant_strat; + int16_t bands_bw; + + pSpar_md_cfg->nchan_transport = ivas_spar_br_table_consts[table_idx].nchan_transport; + + for ( i = 0; i < pSpar_md_cfg->nchan_transport; i++ ) + { + pSpar_md_cfg->max_freq_per_chan[i] = ivas_spar_br_table_consts[table_idx].fpcs; + } + + pSpar_md_cfg->active_w = ivas_spar_br_table_consts[table_idx].active_w; + pSpar_md_cfg->agc_bits_ch_idx = ivas_spar_br_table_consts[table_idx].agc_bits_ch_idx; + ivas_spar_get_uniform_quant_strat( pSpar_md_cfg, table_idx ); + + pSpar_md_cfg->quant_strat_bits = ivas_get_bits_to_encode( MAX_QUANT_STRATS ); + + /* BLOCK: getEntropyCoderModels */ + + pSpar_md_cfg->remix_unmix_order = ivas_spar_br_table_consts[table_idx].dmx_str; + + /* bits per block*/ + total_bits = 0; + max_bits = 0; + + ivas_total_brate = ivas_spar_br_table_consts[table_idx].ivas_total_brate; + sba_order = ivas_spar_br_table_consts[table_idx].sba_order; + ivas_get_spar_table_idx( ivas_total_brate, sba_order, ivas_spar_br_table_consts[table_idx].bwidth, &length, &code ); + + for ( i = 0; i < pSpar_md_cfg->nchan_transport; i++ ) + { + total_bits += (int16_t) ( ivas_spar_br_table_consts[table_idx].core_brs[i][0] / FRAMES_PER_SEC ); + max_bits += (int16_t) ( ivas_spar_br_table_consts[table_idx].core_brs[i][1] / FRAMES_PER_SEC ); + } + + pSpar_md_cfg->tgt_bits_per_blk = (int16_t) ( ivas_total_brate / FRAMES_PER_SEC ) - IVAS_FORMAT_SIGNALING_NBITS_EXTENDED - SBA_PLANAR_BITS - SBA_ORDER_BITS - length - total_bits; + pSpar_md_cfg->max_bits_per_blk = (int16_t) ( ivas_total_brate / FRAMES_PER_SEC ) - IVAS_FORMAT_SIGNALING_NBITS_EXTENDED - SBA_PLANAR_BITS - SBA_ORDER_BITS - length - max_bits; + + md_coding_bits_header = SPAR_NUM_CODING_STRAT_BITS + pSpar_md_cfg->quant_strat_bits; + + pSpar_md_cfg->tgt_bits_per_blk -= md_coding_bits_header; + pSpar_md_cfg->max_bits_per_blk -= md_coding_bits_header; + + if ( ivas_total_brate < IVAS_24k4 ) + { + bands_bw = 2; + } + else + { + bands_bw = 1; + } + + pSpar_md_cfg->tgt_bits_per_blk = (int16_t) ceilf( ( 1.0f * pSpar_md_cfg->tgt_bits_per_blk * num_bands ) / IVAS_MAX_NUM_BANDS ); + pSpar_md_cfg->max_bits_per_blk = (int16_t) ceilf( ( 1.0f * pSpar_md_cfg->max_bits_per_blk * num_bands ) / IVAS_MAX_NUM_BANDS ); + + pSpar_md_cfg->tgt_bits_per_blk += md_coding_bits_header; + pSpar_md_cfg->max_bits_per_blk += md_coding_bits_header; + + if ( enc_flag ) + { + /*calculate the actual worst case bits*/ + if ( ivas_total_brate >= BRATE_SPAR_Q_STRAT ) + { + quant_strat = QUANT_STRAT_0; + } + else + { + quant_strat = QUANT_STRAT_2; + } + + num_PR_bits_dirac_bands = ( dirac2spar_md_flag == 1 ) ? num_bands - SPAR_DIRAC_SPLIT_START_BAND : 0; + num_PR_bits_dirac_bands /= bands_bw; + num_PR_bits_dirac_bands = max( 0, num_PR_bits_dirac_bands ); + num_PR_bits_dirac_bands *= DIRAC_TO_SPAR_HBR_PRED_CHS; + + n_input = ivas_sba_get_nchan_metadata( sba_order, ivas_total_brate ); + n_dmx = ivas_spar_br_table_consts[table_idx].nchan_transport; + n_dec = n_input - n_dmx; + bits_PR = (int16_t) ceilf( log2f( ivas_spar_br_table_consts[table_idx].q_lvls[quant_strat][0] ) ); + num_PR_bits_dirac_bands *= bits_PR; + bits_PR = bits_PR * ( n_input - 1 ); + bits_C = (int16_t) ceilf( log2f( ivas_spar_br_table_consts[table_idx].q_lvls[quant_strat][1] ) ) * ( ( n_dmx - 1 ) * n_dec ); + bits_P = (int16_t) ceilf( log2f( ivas_spar_br_table_consts[table_idx].q_lvls[quant_strat][2] ) ) * ( n_dec ); + wc_coarse_strat = bits_PR + bits_C + bits_P; + wc_coarse_strat *= num_bands; + wc_coarse_strat /= bands_bw; + wc_coarse_strat -= num_PR_bits_dirac_bands; + wc_coarse_strat += md_coding_bits_header; + + if ( pSpar_md_cfg->max_bits_per_blk < wc_coarse_strat ) + { + assert( 0 ); + } + + if ( agc_flag ) + { + if ( pSpar_md_cfg->nchan_transport == 1 ) + { + agc_bits = AGC_BITS_PER_CH; + } + else + { + agc_bits = AGC_BITS_PER_CH * pSpar_md_cfg->nchan_transport + AGC_SIGNALLING_BITS; + } + } + else + { + agc_bits = AGC_SIGNALLING_BITS; + } + + if ( ivas_total_brate == PCA_BRATE && sba_order == SBA_FOA_ORDER ) + { + pca_bits = 1; + if ( pca_flag ) + { + pca_bits += IVAS_PCA_QBITS + IVAS_PCA_QBITS - 1; + } + } + else + { + pca_bits = 0; + } + + pSpar_md_cfg->max_md_bits_spar = pSpar_md_cfg->max_bits_per_blk + agc_bits + pca_bits; + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_spar_bitrate_dist() + * + * Set SPAR bitrate distribution + *-----------------------------------------------------------------------------------------*/ + +void ivas_spar_bitrate_dist( + int32_t core_brates_act[], /* o : bitrates per core-coder */ + const int16_t nAvailBits, /* i : number of available bits */ + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + const int16_t sba_order, /* i : Ambisonic (SBA) order */ + const int16_t bwidth /* i : audio bandwidth */ +) +{ + int16_t i, nchan_transport, table_idx, bitlen; + int16_t core_bits_act[FOA_CHANNELS], core_range_bits[FOA_CHANNELS]; + int16_t sum_core_act_bits, residual_bits, overflow_bits; + + table_idx = ivas_get_spar_table_idx( ivas_total_brate, sba_order, bwidth, &bitlen, NULL ); + + nchan_transport = ivas_spar_br_table_consts[table_idx].nchan_transport; + + sum_core_act_bits = 0; + for ( i = 0; i < nchan_transport; i++ ) + { + core_bits_act[i] = (int16_t) ( ivas_spar_br_table_consts[table_idx].core_brs[i][0] / FRAMES_PER_SEC ); + + sum_core_act_bits += core_bits_act[i]; + } + + residual_bits = nAvailBits - sum_core_act_bits; + + /* First compute core-coder bits as per bitrate distribution table and MD bitrate*/ + if ( residual_bits > 0 ) + { + for ( i = 0; i < nchan_transport; i++ ) + { + core_range_bits[i] = (int16_t) ( ( ivas_spar_br_table_consts[table_idx].core_brs[i][2] - ivas_spar_br_table_consts[table_idx].core_brs[i][0] ) / FRAMES_PER_SEC ); + core_bits_act[i] += min( residual_bits, core_range_bits[i] ); + residual_bits -= core_range_bits[i]; + + if ( residual_bits <= 0 ) + { + break; + } + } + } + else + { + for ( i = 0; i < nchan_transport; i++ ) + { + core_range_bits[i] = (int16_t) ( ( ivas_spar_br_table_consts[table_idx].core_brs[i][0] - ivas_spar_br_table_consts[table_idx].core_brs[i][1] ) / FRAMES_PER_SEC ); + } + + overflow_bits = -residual_bits; + + for ( i = 0; i < nchan_transport; i++ ) + { + core_bits_act[nchan_transport - 1 - i] -= min( overflow_bits, core_range_bits[nchan_transport - 1 - i] ); + overflow_bits -= core_range_bits[nchan_transport - 1 - i]; + + if ( overflow_bits <= 0 ) + { + break; + } + } + + if ( overflow_bits > 0 ) + { + int16_t overflow_bits_ch; + overflow_bits_ch = overflow_bits / nchan_transport; + + for ( i = 0; i < nchan_transport; i++ ) + { + core_bits_act[i] -= overflow_bits_ch; + overflow_bits -= overflow_bits_ch; + } + + core_bits_act[nchan_transport - 1] -= max( 0, overflow_bits ); + } + } + + for ( i = 0; i < nchan_transport; i++ ) + { + core_brates_act[i] = core_bits_act[i] * FRAMES_PER_SEC; + } + + return; +} diff --git a/lib_com/ivas_spar_com_quant_util.c b/lib_com/ivas_spar_com_quant_util.c new file mode 100644 index 0000000000000000000000000000000000000000..c01f95d1edbbce812a426566fd3e9c6a94120ac2 --- /dev/null +++ b/lib_com/ivas_spar_com_quant_util.c @@ -0,0 +1,331 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "math.h" +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_rom_com.h" +#include +#include "wmc_auto.h" + +/*-----------------------------------------------------------------------------------------* + * Function ivas_quantise_real_values() + * + * Quantize real values + *-----------------------------------------------------------------------------------------*/ +void ivas_quantise_real_values( + const float *values, + const int16_t q_levels, + const float min_value, + const float max_value, + int16_t *index, + float *quant, + const int16_t dim ) +{ + int16_t i; + float q_step, one_by_q_step; + if ( q_levels == 1 ) + { + for ( i = 0; i < dim; i++ ) + { + quant[i] = 0; + index[i] = 0; + } + } + else if ( q_levels && max_value != min_value ) + { + q_step = ( max_value - min_value ) / ( q_levels - 1 ); + one_by_q_step = ( q_levels - 1 ) / ( max_value - min_value ); + float val; + for ( i = 0; i < dim; i++ ) + { + val = max( min_value, min( values[i], max_value ) ); + index[i] = (int16_t) round( one_by_q_step * val ); + quant[i] = index[i] * q_step; + } + } + else + { + for ( i = 0; i < dim; i++ ) + { + quant[i] = values[i]; + } + } + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_spar_get_uniform_quant_strat() + * + * Sets the quant strat values + *-----------------------------------------------------------------------------------------*/ +void ivas_spar_get_uniform_quant_strat( + ivas_spar_md_com_cfg *pSpar_md_com_cfg, + const int16_t table_idx ) +{ + int16_t i; + int16_t active_w = ivas_spar_br_table_consts[table_idx].active_w; + int16_t PQ_q_lvl, C_q_lvl, Pr_q_lvl, Pc_q_lvl; + + pSpar_md_com_cfg->num_quant_strats = MAX_QUANT_STRATS; + + for ( i = 0; i < pSpar_md_com_cfg->num_quant_strats; i++ ) + { + PQ_q_lvl = ivas_spar_br_table_consts[table_idx].q_lvls[i][0]; + C_q_lvl = ivas_spar_br_table_consts[table_idx].q_lvls[i][1]; + Pr_q_lvl = ivas_spar_br_table_consts[table_idx].q_lvls[i][2]; + Pc_q_lvl = ivas_spar_br_table_consts[table_idx].q_lvls[i][3]; + + if ( active_w ) + { + pSpar_md_com_cfg->quant_strat[i].PR.q_levels[0] = PQ_q_lvl; + pSpar_md_com_cfg->quant_strat[i].PR.q_levels[1] = PQ_q_lvl; + pSpar_md_com_cfg->quant_strat[i].PR.min = -1.2f; + pSpar_md_com_cfg->quant_strat[i].PR.max = 1.2f; + + pSpar_md_com_cfg->quant_strat[i].C.q_levels[0] = C_q_lvl; + pSpar_md_com_cfg->quant_strat[i].C.q_levels[1] = C_q_lvl; + pSpar_md_com_cfg->quant_strat[i].C.min = -0.8f; + pSpar_md_com_cfg->quant_strat[i].C.max = 0.8f; + + pSpar_md_com_cfg->quant_strat[i].P_r.q_levels[0] = Pr_q_lvl; + pSpar_md_com_cfg->quant_strat[i].P_r.q_levels[1] = Pr_q_lvl; + pSpar_md_com_cfg->quant_strat[i].P_r.min = 0; + pSpar_md_com_cfg->quant_strat[i].P_r.max = 0.8f; + + pSpar_md_com_cfg->quant_strat[i].P_c.q_levels[0] = Pc_q_lvl; + pSpar_md_com_cfg->quant_strat[i].P_c.q_levels[1] = Pc_q_lvl; + pSpar_md_com_cfg->quant_strat[i].P_c.min = -0.8f; + pSpar_md_com_cfg->quant_strat[i].P_c.max = 0.8f; + } + else + { + pSpar_md_com_cfg->quant_strat[i].PR.q_levels[0] = PQ_q_lvl; + pSpar_md_com_cfg->quant_strat[i].PR.q_levels[1] = PQ_q_lvl; + pSpar_md_com_cfg->quant_strat[i].PR.max = 1; + pSpar_md_com_cfg->quant_strat[i].PR.min = -1; + + pSpar_md_com_cfg->quant_strat[i].C.q_levels[0] = C_q_lvl; + pSpar_md_com_cfg->quant_strat[i].C.q_levels[1] = C_q_lvl; + pSpar_md_com_cfg->quant_strat[i].C.max = 2; + pSpar_md_com_cfg->quant_strat[i].C.min = -2; + + pSpar_md_com_cfg->quant_strat[i].P_r.q_levels[0] = Pr_q_lvl; + pSpar_md_com_cfg->quant_strat[i].P_r.q_levels[1] = Pr_q_lvl; + pSpar_md_com_cfg->quant_strat[i].P_r.max = 1.0f; + pSpar_md_com_cfg->quant_strat[i].P_r.min = 0; + + pSpar_md_com_cfg->quant_strat[i].P_c.q_levels[0] = Pc_q_lvl; + pSpar_md_com_cfg->quant_strat[i].P_c.q_levels[1] = Pc_q_lvl; + pSpar_md_com_cfg->quant_strat[i].P_c.max = 0.5; + pSpar_md_com_cfg->quant_strat[i].P_c.min = -0.5; + } + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_map_prior_coeffs_quant() + * + * Map prior coeffs + *-----------------------------------------------------------------------------------------*/ + +void ivas_map_prior_coeffs_quant( + ivas_spar_md_prev_t *pSpar_md_prior, + ivas_spar_md_com_cfg *pSpar_md_cfg, + const int16_t qsi, + const int16_t nB ) +{ + int16_t i, j; + + if ( qsi != pSpar_md_cfg->prev_quant_idx ) + { + ivas_quant_strat_t qs = pSpar_md_cfg->quant_strat[qsi]; + ivas_quant_strat_t prev_qs = pSpar_md_cfg->quant_strat[pSpar_md_cfg->prev_quant_idx]; + float one_by_q_lvl_PR = 1.0f / max( prev_qs.PR.q_levels[0] - 1, 1 ); + float one_by_q_lvl_C = 1.0f / max( prev_qs.C.q_levels[0] - 1, 1 ); + float one_by_q_lvl_P_r = 1.0f / max( prev_qs.P_r.q_levels[0] - 1, 1 ); + for ( i = 0; i < nB; i++ ) + { + for ( j = 0; j < IVAS_SPAR_MAX_CH - 1; j++ ) + { + pSpar_md_prior->band_coeffs_idx_mapped[i].pred_index_re[j] = (int16_t) round( ( qs.PR.q_levels[0] - 1 ) * pSpar_md_prior->band_coeffs_idx[i].pred_index_re[j] * one_by_q_lvl_PR ); + pSpar_md_prior->band_coeffs_idx_mapped[i].decd_index_re[j] = (int16_t) round( ( qs.P_r.q_levels[0] - 1 ) * pSpar_md_prior->band_coeffs_idx[i].decd_index_re[j] * one_by_q_lvl_P_r ); + } + for ( j = 0; j < IVAS_SPAR_MAX_C_COEFF; j++ ) + { + pSpar_md_prior->band_coeffs_idx_mapped[i].drct_index_re[j] = (int16_t) round( ( qs.C.q_levels[0] - 1 ) * pSpar_md_prior->band_coeffs_idx[i].drct_index_re[j] * one_by_q_lvl_C ); + } + } + } + else + { + for ( i = 0; i < nB; i++ ) + { + for ( j = 0; j < IVAS_SPAR_MAX_CH - 1; j++ ) + { + pSpar_md_prior->band_coeffs_idx_mapped[i].pred_index_re[j] = pSpar_md_prior->band_coeffs_idx[i].pred_index_re[j]; + pSpar_md_prior->band_coeffs_idx_mapped[i].decd_index_re[j] = pSpar_md_prior->band_coeffs_idx[i].decd_index_re[j]; + } + for ( j = 0; j < IVAS_SPAR_MAX_C_COEFF; j++ ) + { + pSpar_md_prior->band_coeffs_idx_mapped[i].drct_index_re[j] = pSpar_md_prior->band_coeffs_idx[i].drct_index_re[j]; + } + } + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_spar_quant_dtx_init() + * + * Init SPAR MD with minmax vals + *-----------------------------------------------------------------------------------------*/ + +void ivas_spar_quant_dtx_init( + ivas_spar_md_t *spar_md, + float *min_max ) +{ + spar_md->min_max[0] = min_max[0]; + spar_md->min_max[1] = min_max[1]; + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_copy_band_coeffs_idx_to_arr() + * + * Copy pred band coeffs to arr + *-----------------------------------------------------------------------------------------*/ + +void ivas_copy_band_coeffs_idx_to_arr( + ivas_band_coeffs_ind_t *pBands_idx, + const int16_t nB, + int16_t *pSymbol_re, + ivas_cell_dim_t *pCell_dims, + const ivas_coeffs_type_t coeff_type ) +{ + int16_t i, len; + int16_t *pPtr_idx = NULL; + + for ( i = 0; i < nB; i++ ) + { + switch ( coeff_type ) + { + case PRED_COEFF: + { + pPtr_idx = pBands_idx[i].pred_index_re; + break; + } + case DRCT_COEFF: + { + pPtr_idx = pBands_idx[i].drct_index_re; + break; + } + case DECD_COEFF: + { + pPtr_idx = pBands_idx[i].decd_index_re; + break; + } + case DECX_COEFF: + { + break; + } + } + len = pCell_dims[i].dim1 * pCell_dims[i].dim2; + if ( ( coeff_type != DECX_COEFF ) ) + { + mvs2s( pPtr_idx, pSymbol_re, len ); + pSymbol_re += len; + } + } + + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_clear_band_coeffs() + * + * clear band coeffs array in SPAR MD + *-----------------------------------------------------------------------------------------*/ + +void ivas_clear_band_coeffs( + ivas_band_coeffs_t *pband_coeffs, + const uint16_t num_bands ) +{ + uint16_t i; + + for ( i = 0; i < num_bands; i++ ) + { + set_zero( (float *) pband_coeffs[i].C_re, ( IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS ) * ( IVAS_SPAR_MAX_DMX_CHS - 1 ) ); + set_zero( (float *) pband_coeffs[i].P_re, ( IVAS_SPAR_MAX_CH - 1 ) ); + set_zero( (float *) pband_coeffs[i].C_quant_re, ( IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS ) * ( IVAS_SPAR_MAX_DMX_CHS - 1 ) ); + set_zero( (float *) pband_coeffs[i].P_quant_re, ( IVAS_SPAR_MAX_CH - 1 ) ); + set_zero( pband_coeffs[i].pred_re, ( IVAS_SPAR_MAX_CH - 1 ) ); + set_zero( pband_coeffs[i].pred_quant_re, ( IVAS_SPAR_MAX_CH - 1 ) ); + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_clear_band_coeff_idx() + * + * clear band coeffs index array in SPAR MD + *-----------------------------------------------------------------------------------------*/ + +void ivas_clear_band_coeff_idx( + ivas_band_coeffs_ind_t *pband_coeff_idx, + const uint16_t num_bands ) +{ + uint16_t i = 0; + + for ( i = 0; i < num_bands; i++ ) + { + set_s( pband_coeff_idx[i].pred_index_re, 0, ( IVAS_SPAR_MAX_CH - 1 ) ); + set_s( pband_coeff_idx[i].drct_index_re, 0, IVAS_SPAR_MAX_C_COEFF ); + set_s( pband_coeff_idx[i].decd_index_re, 0, ( IVAS_SPAR_MAX_CH - 1 ) ); + } + + return; +} diff --git a/lib_com/ivas_stat_com.h b/lib_com/ivas_stat_com.h new file mode 100644 index 0000000000000000000000000000000000000000..4768b1d90dd509f73c447ae5d3d2b2ee82ebeda2 --- /dev/null +++ b/lib_com/ivas_stat_com.h @@ -0,0 +1,815 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#ifndef IVAS_STAT_COM +#define IVAS_STAT_COM + +#include +#include "options.h" +#include "typedef.h" +#include "cnst.h" +#include "ivas_cnst.h" + + +/*----------------------------------------------------------------------------------* + * Declaration of ISM common (encoder & decoder) structure + *----------------------------------------------------------------------------------*/ + +typedef struct +{ + int16_t last_angle1_idx; /* last frame index of coded azimuth/yaw */ + int16_t angle1_diff_cnt; /* FEC counter of consecutive differentially azimuth/yaw coded frames */ + int16_t last_angle2_idx; /* last frame index of coded elevation/pitch */ + int16_t angle2_diff_cnt; /* FEC counter of consecutive differentially elevation/pitch coded frames */ + +} ISM_METADATA_ANGLE, *ISM_METADATA_ANGLE_HANDLE; + +/* ISM metadata handle (storage for one frame of read ISM metadata) */ +typedef struct +{ + int16_t ism_metadata_flag; /* flag whether metadata are coded in particular frame of particular object */ + int16_t last_ism_metadata_flag; /* last frame ism_metadata_flag */ + + float azimuth; /* azimuth value read from the input metadata file */ + float elevation; /* elevation value read from the input metadata file */ + float radius; /* radius value read from the input metadata file */ + float yaw; /* yaw value read from the input metadata file */ + float pitch; /* pitch value read from the input metadata file */ + + int16_t non_diegetic_flag; /* Non-diegetic (non-headtracked) object flag */ + + ISM_METADATA_ANGLE position_angle; /* Angle structs for azimuth and elevation */ + ISM_METADATA_ANGLE orientation_angle; /* Angle structs for yaw and pitch */ + int16_t last_radius_idx; /* last frame index of coded radius */ + int16_t radius_diff_cnt; /* FEC counter of consecutive differentially radius coded frames */ + + float last_azimuth; /* MD smoothing in DTX- last Q azimuth value */ + float last_elevation; /* MD smoothing in DTX - last Q elevation value */ + float last_true_azimuth; /* MD smoothing in DTX- last true Q azimuth value */ + float last_true_elevation; /* MD smoothing in DTX- last true Q elevation value */ + + int16_t ism_md_fec_cnt_enc; /* counter of continuous frames where MD are not transmitted */ + int16_t ism_md_inc_diff_cnt; /* counter of continuous frames where MD are transmitted in inactive segments when MD significantly changes */ + float last_true_radius; /* last true Q radius value */ + + int16_t ism_imp; /* ISM importance flag */ + int16_t ism_md_null_flag; + int16_t ism_md_lowrate_flag; + float q_azimuth_old; + float q_elevation_old; + +} ISM_METADATA_FRAME, *ISM_METADATA_HANDLE; + + +/*----------------------------------------------------------------------------------* + * Declaration of DFT Stereo common (encoder & decoder) structure + *----------------------------------------------------------------------------------*/ + +typedef struct stereo_dft_config_data_struct +{ + int16_t dmx_active; + int16_t band_res; + int16_t prm_res; /* Send prm every # DFT frames */ + int16_t res_pred_mode; /* mode : from 0 (off) to 1 (on) */ + int16_t res_cod_mode; /* mode : from 0 (off) to 3 */ + int16_t hybrid_itd_flag; + int16_t ada_wb_res_cod_mode; /* res_cod_mode for adaptive wide band residual coding */ + + int16_t force_mono_transmission; + +} STEREO_DFT_CONFIG_DATA, *STEREO_DFT_CONFIG_DATA_HANDLE; + + +/*----------------------------------------------------------------------------------* + * Declaration of MDCT stereo common (encoder & decoder) structure + *----------------------------------------------------------------------------------*/ + +typedef struct +{ + uint8_t const bandLengthsTCX20[SMDCT_MAX_STEREO_BANDS_TCX20]; /* Length of a band in number of bins. Range is 4..160 */ + const int16_t bdnCnt_TCX20[4]; /* uppermost band for FB,SWB,WB,NB */ + uint8_t const bandLengthsTCX10[SMDCT_MAX_STEREO_BANDS_TCX10]; /* Length of a band in number of bins. Range is 2..80, always divisible by 2 */ + const int16_t bndCnt_TCX10[4]; /* uppermost band for FB,SWB,WB,NB */ + +} MDCTStereoBands_config; + +/* MDCT stereo frequency band structure */ +typedef struct stereo_mdct_dec_band_parameters_struct +{ + int16_t sfbOffset[MAX_SFB + 1]; /* stereo frequency band start offsets */ + int16_t sfbCnt; /* number of stereo frequency bands */ + int16_t nBandsStereoCore; /* number of stereo frequency bands in the core */ + int16_t sfbIgfStart; /*index for first IGF band*/ + +} STEREO_MDCT_BAND_PARAMETERS; + + +/*----------------------------------------------------------------------------------* + * Declaration of ECLVQ common (encoder & decoder) structure + *----------------------------------------------------------------------------------*/ + +typedef struct +{ + int16_t config_index; + int16_t encoding_active; /* internal state specifying if actual encoding is active or only length evaluation is active */ + int32_t bit_count_estimate; /* uses 22Q10 fixed-point representation */ + void *ac_handle; + +} ECSQ_instance; + + +/*----------------------------------------------------------------------------------* + * Declaration of DirAC common (encoder & decoder) structure + *----------------------------------------------------------------------------------*/ + +typedef struct ivas_dirac_config_data_struct +{ + int16_t enc_param_start_band; + int16_t dec_param_estim; + int16_t nbands; + +} DIRAC_CONFIG_DATA, *DIRAC_CONFIG_DATA_HANDLE; + + +/*----------------------------------------------------------------------------------* + * Declaration of SPAR common structures + *----------------------------------------------------------------------------------*/ + +/* SPAR MD structures */ +typedef struct ivas_band_coeffs_t +{ + float pred_re[IVAS_SPAR_MAX_CH - 1]; + float C_re[IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS][IVAS_SPAR_MAX_DMX_CHS - 1]; + float P_re[IVAS_SPAR_MAX_CH - 1]; + float pred_quant_re[IVAS_SPAR_MAX_CH - 1]; + float C_quant_re[IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS][IVAS_SPAR_MAX_DMX_CHS - 1]; + float P_quant_re[IVAS_SPAR_MAX_CH - 1]; + +} ivas_band_coeffs_t; + +typedef struct ivas_band_coeffs_ind_t +{ + int16_t pred_index_re[IVAS_SPAR_MAX_CH - 1]; + int16_t drct_index_re[IVAS_SPAR_MAX_C_COEFF]; + int16_t decd_index_re[IVAS_SPAR_MAX_CH - 1]; + +} ivas_band_coeffs_ind_t; + +typedef struct ivas_spar_md_t +{ + ivas_band_coeffs_t *band_coeffs; + ivas_band_coeffs_ind_t band_coeffs_idx[IVAS_MAX_NUM_BANDS]; + int16_t num_bands; + float min_max[2]; + int16_t dtx_vad; + float en_ratio_slow[IVAS_MAX_NUM_BANDS]; + float ref_pow_slow[IVAS_MAX_NUM_BANDS]; + int16_t res_ind; + int16_t prior_dyn_active_w_flag; + +} ivas_spar_md_t; + +typedef struct ivas_spar_md_prev_t +{ + ivas_band_coeffs_ind_t band_coeffs_idx[IVAS_MAX_NUM_BANDS]; + ivas_band_coeffs_ind_t band_coeffs_idx_mapped[IVAS_MAX_NUM_BANDS]; + +} ivas_spar_md_prev_t; + +typedef struct ivas_quant_coeffs_t +{ + float min; + float max; + int16_t q_levels[2]; + +} ivas_quant_coeffs_t; + +typedef struct ivas_quant_strat_t +{ + ivas_quant_coeffs_t PR; + ivas_quant_coeffs_t C; + ivas_quant_coeffs_t P_r; + ivas_quant_coeffs_t P_c; + +} ivas_quant_strat_t; + +typedef struct ivas_spar_md_com_cfg +{ + int16_t max_freq_per_chan[IVAS_SPAR_MAX_CH]; + int16_t num_dmx_chans_per_band[IVAS_MAX_NUM_BANDS]; + int16_t num_decorr_per_band[IVAS_MAX_NUM_BANDS]; + int16_t active_w; + int16_t remix_unmix_order; + ivas_quant_strat_t quant_strat[MAX_QUANT_STRATS]; + int16_t quant_strat_bits; + int16_t nchan_transport; + int16_t num_quant_strats; + int16_t prior_strat; + int16_t tgt_bits_per_blk; + int16_t max_bits_per_blk; + int16_t prev_quant_idx; + int16_t agc_bits_ch_idx; + int16_t planarCP; + int16_t num_umx_chs; + int16_t max_md_bits_spar; + +} ivas_spar_md_com_cfg; + + +/* arithmetic coder structures */ +typedef struct ivas_cell_dim_t +{ + int16_t dim1; + int16_t dim2; + +} ivas_cell_dim_t; + +typedef struct ivas_freq_models_t +{ + int16_t freq_model[IVAS_NUM_PROB_MODELS][IVAS_MAX_QUANT_LEVELS]; + int16_t diff_freq_model[IVAS_NUM_PROB_MODELS][IVAS_MAX_QUANT_LEVELS]; + int16_t vals[IVAS_MAX_QUANT_LEVELS]; + int16_t diff_vals[IVAS_MAX_QUANT_LEVELS]; + int16_t num_models; + int16_t diff_num_models; + +} ivas_freq_models_t; + +typedef struct ivas_huff_models_t +{ + int16_t code_book[IVAS_MAX_QUANT_LEVELS][3]; + int16_t diff_code_book[IVAS_MAX_QUANT_LEVELS][3]; + +} ivas_huff_models_t; + + +/* Entropy coder structures */ +typedef struct ivas_huffman_cfg_t +{ + const int16_t *codebook; + int16_t min_len; + int16_t max_len; + int16_t sym_len; + +} ivas_huffman_cfg_t; + +typedef struct ivas_arith_t +{ + int16_t dyn_model_bits; + const int16_t *pFreq_model; + const int16_t *pAlt_freq_models[IVAS_NUM_PROB_MODELS]; + const int16_t *vals; + int16_t cum_freq[IVAS_NUM_PROB_MODELS][IVAS_MAX_QUANT_LEVELS]; + int16_t range; + int16_t num_models; + float saved_dist_arr[IVAS_NUM_PROB_MODELS][IVAS_MAX_QUANT_LEVELS]; + +} ivas_arith_t; + +typedef struct ivas_arith_coeffs_t +{ + ivas_arith_t pred_arith_re[MAX_QUANT_STRATS]; + ivas_arith_t drct_arith_re[MAX_QUANT_STRATS]; + ivas_arith_t decd_arith_re[MAX_QUANT_STRATS]; + ivas_arith_t pred_arith_re_diff[MAX_QUANT_STRATS]; + ivas_arith_t drct_arith_re_diff[MAX_QUANT_STRATS]; + ivas_arith_t decd_arith_re_diff[MAX_QUANT_STRATS]; + +} ivas_arith_coeffs_t; + +typedef struct ivas_huff_coeffs_t +{ + ivas_huffman_cfg_t pred_huff_re[MAX_QUANT_STRATS]; + ivas_huffman_cfg_t drct_huff_re[MAX_QUANT_STRATS]; + ivas_huffman_cfg_t decd_huff_re[MAX_QUANT_STRATS]; + +} ivas_huff_coeffs_t; + +/* AGC structures */ +typedef struct ivas_agc_chan_data_t +{ + int16_t absGainExp; + int16_t absGainExpCurr; + +} ivas_agc_chan_data_t; + +typedef struct ivas_agc_com_state_t +{ + float *winFunc; + int16_t in_delay; /* TODO: JBM check if this needs to be adjusted in the dec */ + uint16_t absEmin; + uint16_t betaE; + uint16_t maxAttExp; + uint16_t num_coeff; + +} ivas_agc_com_state_t; + +/* Covariance structures */ +typedef struct ivas_cov_smooth_state_t +{ + float *pPrior_cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; + int16_t prior_bank_idx; + float *pSmoothing_factor; + int16_t num_bins; + +} ivas_cov_smooth_state_t; + +typedef struct ivas_cov_smooth_cfg_t +{ + float max_update_rate; + int16_t min_pool_size; + int16_t max_bands; + int16_t num_bins; + +} ivas_cov_smooth_cfg_t; + + +/* SPAR bitrate constant table structure */ +typedef struct ivas_spar_br_table_t +{ + int32_t ivas_total_brate; + int16_t isPlanar; + int16_t sba_order; + int16_t bwidth; + int16_t fpcs; + int16_t nchan_transport; + ivas_spar_pmx_strings_t dmx_str; + int16_t active_w; + int16_t tmode; + int32_t core_brs[FOA_CHANNELS][3]; + int16_t q_lvls[MAX_QUANT_STRATS][NUM_MD_Q_COEFS_SET]; + int16_t td_ducking; + int16_t agc_bits_ch_idx; /* 0-3, Indicates core-coder channel index from which AGC bits have been taken from*/ + int16_t usePlanarCoeff; + +} ivas_spar_br_table_t; + + +/*----------------------------------------------------------------------------------* + * Declaration of MASA common structures + *----------------------------------------------------------------------------------*/ + +typedef struct ivas_MASA_spherical_grid_deindexing +{ + float theta_cb[NO_THETA16_MAX]; + int16_t no_theta; + int16_t no_phi[NO_THETA16_MAX]; + +} SPHERICAL_GRID_DATA; + +typedef struct ivas_masa_descriptive_meta_struct +{ + uint8_t formatDescriptor[8]; /* 8x 8 bits */ + uint8_t numberOfDirections; /* 1 bit */ + uint8_t numberOfChannels; /* 1 bit */ + uint8_t sourceFormat; /* 2 bits */ + uint8_t transportDefinition; /* 3 bits */ + uint8_t channelAngle; /* 3 bits */ + uint8_t channelDistance; /* 6 bits */ + uint8_t channelLayout; /* 3 bits, used only when sourceFormat == bit value 10 */ + +} MASA_DECRIPTIVE_META; + +typedef struct ivas_masa_directional_spatial_meta_struct +{ + float azimuth[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + float elevation[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + float energy_ratio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + float spread_coherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + uint16_t spherical_index[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + +} MASA_DIRECTIONAL_SPATIAL_META; + +typedef struct ivas_masa_common_spatial_meta_struct +{ + float diffuse_to_total_ratio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + float surround_coherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + float remainder_to_total_ratio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + +} MASA_COMMON_SPATIAL_META; + +typedef struct ivas_omasa_meta_struct +{ + uint8_t num_dirs; + MASA_DIRECTIONAL_SPATIAL_META directional_meta[MASA_MAXIMUM_DIRECTIONS]; + MASA_COMMON_SPATIAL_META common_meta; + +} OMASA_SPATIAL_META, *OMASA_SPATIAL_META_HANDLE; + +typedef struct ivas_masa_metadata_frame_struct +{ + MASA_DECRIPTIVE_META descriptive_meta; + MASA_DIRECTIONAL_SPATIAL_META directional_meta[MASA_MAXIMUM_DIRECTIONS]; + MASA_COMMON_SPATIAL_META common_meta; + +} MASA_METADATA_FRAME, *MASA_METADATA_HANDLE; + +typedef struct ivas_masa_config_struct +{ + uint16_t max_metadata_bits; + int16_t block_grouping[5]; + int16_t band_grouping[MASA_FREQUENCY_BANDS + 1]; + uint8_t numCodingBands; + uint8_t numTwoDirBands; + uint8_t numberOfDirections; + uint8_t joinedSubframes; + uint8_t useCoherence; + uint8_t coherencePresent; + uint8_t mergeRatiosOverSubframes; + IVAS_FORMAT input_ivas_format; + +} MASA_CODEC_CONFIG; + + +/*----------------------------------------------------------------------------------* + * Declaration of Qmetadata common structures + *----------------------------------------------------------------------------------*/ + +typedef struct +{ + int16_t nbands; + int16_t nblocks; + int16_t start_band; + uint8_t inactiveBands; + int16_t search_effort; + MC_LS_SETUP mc_ls_setup; + +} IVAS_METADATA_CONFIG; + +typedef struct ivas_qdirection_band_data_struct +{ + uint16_t spherical_index[MAX_PARAM_SPATIAL_SUBFRAMES]; + float azimuth[MAX_PARAM_SPATIAL_SUBFRAMES]; + float elevation[MAX_PARAM_SPATIAL_SUBFRAMES]; + int16_t elevation_m_alphabet[MAX_PARAM_SPATIAL_SUBFRAMES]; + int16_t azimuth_m_alphabet[MAX_PARAM_SPATIAL_SUBFRAMES]; + + float energy_ratio[MAX_PARAM_SPATIAL_SUBFRAMES]; + uint8_t distance[MAX_PARAM_SPATIAL_SUBFRAMES]; + + uint16_t bits_sph_idx[MAX_PARAM_SPATIAL_SUBFRAMES]; + uint16_t energy_ratio_index[MAX_PARAM_SPATIAL_SUBFRAMES]; + uint16_t energy_ratio_index_mod[MAX_PARAM_SPATIAL_SUBFRAMES]; + uint16_t azimuth_index[MAX_PARAM_SPATIAL_SUBFRAMES]; + uint16_t elevation_index[MAX_PARAM_SPATIAL_SUBFRAMES]; + float q_azimuth[MAX_PARAM_SPATIAL_SUBFRAMES]; + float q_elevation[MAX_PARAM_SPATIAL_SUBFRAMES]; + +} IVAS_QDIRECTION_BAND_DATA; + +typedef struct ivas_qdirection_band_coherence_data_struct +{ + uint8_t spread_coherence[MAX_PARAM_SPATIAL_SUBFRAMES]; + uint16_t spread_coherence_dct0_index; + uint16_t spread_coherence_dct1_index; +} IVAS_QDIRECTION_BAND_COHERENCE_DATA; + +typedef struct ivas_surround_coherence_band_data_struct +{ + uint8_t surround_coherence[MAX_PARAM_SPATIAL_SUBFRAMES]; + uint16_t sur_coherence_index; + +} IVAS_SURROUND_COHERENCE_BAND_DATA; + + +typedef struct +{ + IVAS_METADATA_CONFIG cfg; + + IVAS_QDIRECTION_BAND_DATA *band_data; + IVAS_QDIRECTION_BAND_COHERENCE_DATA *coherence_band_data; + int16_t not_in_2D; + +} IVAS_QDIRECTION; /* IVAS_QMETADATA; */ + +typedef struct ivas_masa_qmetadata_frame_struct +{ + IVAS_QDIRECTION *q_direction; + uint16_t no_directions; + int16_t bits_frame_nominal; + uint16_t coherence_flag; + uint8_t all_coherence_zero; + uint8_t twoDirBands[MASA_MAXIMUM_CODING_SUBBANDS]; + uint8_t numTwoDirBands; + int16_t qmetadata_max_bit_req; + int16_t metadata_max_bits; /* maximum allowed number of bits for metadata per frame */ + uint8_t useLowerRes; + uint8_t useLowerBandRes; + int16_t dirac_mono_flag; + IVAS_SURROUND_COHERENCE_BAND_DATA *surcoh_band_data; + + /* Additional helper values to include all data required for writing to output file */ + uint8_t numCodingBands; + int16_t *bandMap; + int16_t nchan_transport; + int16_t sba_inactive_mode; + /* Status values on metadata quality */ + int16_t ec_flag; + float dir_comp_ratio; + uint8_t is_masa_ivas_format; + +} IVAS_QMETADATA, *IVAS_QMETADATA_HANDLE; + + +/*----------------------------------------------------------------------------------* + * Declaration of Parametric MC common (encoder & decoder) structures + *----------------------------------------------------------------------------------*/ + +typedef struct ivas_param_mc_ild_mapping_struct +{ + int16_t ild_map_size_wo_lfe; + int16_t ild_map_size_lfe; + int16_t ild_index[MAX_CICP_CHANNELS]; + int16_t num_ref_channels[MAX_CICP_CHANNELS]; + int16_t ref_channel_idx[MAX_CICP_CHANNELS][PARAM_MC_MAX_ILD_REF_CHANNELS]; + +} PARAM_MC_ILD_MAPPING, *HANDLE_PARAM_MC_ILD_MAPPING; + +typedef struct ivas_param_mc_icc_mapping_struct +{ + int16_t icc_map_size_wo_lfe; + int16_t icc_map_size_lfe; + int16_t icc_mapping[PARAM_MC_SZ_ICC_MAP][2]; + +} PARAM_MC_ICC_MAPPING, *HANDLE_PARAM_MC_ICC_MAPPING; + +typedef struct ivas_param_mc_conf_struct /* structure for ROM Table */ +{ + MC_LS_SETUP mc_ls_setup; + int16_t num_input_chan; + int16_t num_transport_chan; + int32_t ivas_total_brate; + const PARAM_MC_ILD_MAPPING *ild_mapping_conf; + const PARAM_MC_ICC_MAPPING *icc_mapping_conf; + const float *dmx_fac; + const float *ild_factors; + +} PARAM_MC_CONF; + +typedef struct ivas_parametric_mc_metadata_value_coding_info_struct +{ + const uint16_t *cum_freq; + const uint16_t *sym_freq; + const uint16_t *cum_freq_delta; + const uint16_t *sym_freq_delta; + const float *quantizer; + int16_t quantizer_size; + int16_t uni_bits; + +} PARAM_MC_PARAMETER_CODING_INFO, *HANDLE_PARAM_MC_PARAMETER_CODING_INFO; + +typedef struct ivas_parametric_mc_metadata_struct +{ + const PARAM_MC_ILD_MAPPING *ild_mapping_conf; + const PARAM_MC_ICC_MAPPING *icc_mapping_conf; + int16_t icc_mapping[PARAM_MC_PARAMETER_FRAMES][PARAM_MC_SZ_ICC_MAP][2]; + int16_t *icc_map_full[2]; + int16_t icc_map_size_full; + int16_t param_frame_idx; + int16_t flag_use_adaptive_icc_map; + const float *ild_factors; + int16_t coding_band_mapping[PARAM_MC_MAX_PARAMETER_BANDS]; + int16_t nbands_in_param_frame[PARAM_MC_PARAMETER_FRAMES]; + int16_t bAttackPresent; + int16_t attackIndex; + int16_t nbands_coded; + int16_t num_parameter_bands; + int16_t coded_bwidth; + int16_t last_coded_bwidth; + int16_t lfe_on; + PARAM_MC_PARAMETER_CODING_INFO icc_coding; + PARAM_MC_PARAMETER_CODING_INFO ild_coding; + +} IVAS_PARAM_MC_METADATA, *HANDLE_IVAS_PARAM_MC_METADATA; + + +/*----------------------------------------------------------------------------------* + * Declaration of LFE common (encoder & decoder) structures + *----------------------------------------------------------------------------------*/ + +typedef struct ivas_lfe_window +{ + int16_t dct_len; + int16_t fade_len; + int16_t zero_pad_len; + int16_t full_len; + const float *pWindow_coeffs; + +} LFE_WINDOW_DATA, *LFE_WINDOW_HANDLE; + +typedef struct ivas_lfe_freq_models +{ + uint16_t entropy_coder_model_fine_sg1[65]; + uint16_t entropy_coder_model_fine_sg2[33]; + uint16_t entropy_coder_model_fine_sg3[9]; + uint16_t entropy_coder_model_fine_sg4[3]; + uint16_t entropy_coder_model_coarse_sg1[33]; + uint16_t entropy_coder_model_coarse_sg2[17]; + uint16_t entropy_coder_model_coarse_sg3[5]; + uint16_t entropy_coder_model_coarse_sg4; + +} ivas_lfe_freq_models; + +typedef struct ivas_filters_process_state_t +{ + int16_t order; + int16_t filt_len; + float num[IVAS_FILTER_MAX_STAGES][IVAS_BIQUAD_FILT_LEN]; + float den[IVAS_FILTER_MAX_STAGES][IVAS_BIQUAD_FILT_LEN]; + float state[IVAS_FILTER_MAX_STAGES][IVAS_BIQUAD_FILT_LEN]; + +} ivas_filters_process_state_t; + + +/*----------------------------------------------------------------------------------* + * Transient Detector (TD) structure + *----------------------------------------------------------------------------------*/ + +typedef struct ivas_trans_det_state_t +{ + ivas_filters_process_state_t env_hpf; + ivas_filters_process_state_t env_fast; + ivas_filters_process_state_t env_slow; + float in_duck_coeff; + float out_duck_coeff; + float in_duck_gain; + float out_duck_gain; + float duck_mult_fac; + +} ivas_trans_det_state_t; + + +/*----------------------------------------------------------------------------------* + * Time domain decorrelator + *----------------------------------------------------------------------------------*/ + +typedef struct ivas_td_decorr_APD_filt_state_t +{ + int16_t order[IVAS_MAX_DECORR_APD_SECTIONS]; + int16_t idx[IVAS_MAX_DECORR_APD_SECTIONS]; + float coeffs[IVAS_MAX_DECORR_APD_SECTIONS]; + float *state[IVAS_MAX_DECORR_APD_SECTIONS]; + +} ivas_td_decorr_APD_filt_state_t; + +typedef struct ivas_td_decorr_state_t +{ + ivas_trans_det_state_t *pTrans_det; + float *look_ahead_buf; + ivas_td_decorr_APD_filt_state_t APD_filt_state[IVAS_MAX_DECORR_CHS]; + + int16_t num_apd_outputs; + int16_t num_apd_sections; + int16_t ducking_flag; + + int16_t offset; + +} ivas_td_decorr_state_t; + + +/*----------------------------------------------------------------------------------* + * Filter Bank (FB) structures + *----------------------------------------------------------------------------------*/ + +typedef struct ivas_fb_mixer_cfg_t +{ + int16_t fb_latency; + int16_t num_in_chans; + int16_t num_out_chans; + int16_t nchan_fb_in; + int16_t pcm_offset; + int16_t fade_len; /* this sets the stride length; no delay is introduced */ + int16_t prior_input_length; + int16_t windowed_fr_offset; + int16_t active_w_mixing; + const int16_t *remix_order; + +} IVAS_FB_CFG; + +typedef struct ivas_fb_consts_t +{ + const float *ppFilterbank_FRs[2][IVAS_MAX_NUM_BANDS]; + float *ppFilterbank_FRs_non48k[2][IVAS_MAX_NUM_BANDS]; + const int16_t *pFilterbank_bins_per_band; + const int16_t *pFilterbank_bins_start_offset; + +} ivas_fb_consts_t; + +typedef struct ivas_fb_bin_to_band_data_t +{ + float *pFb_bin_to_band[IVAS_MAX_NUM_FB_BANDS]; + const int16_t *pFb_start_bin_per_band; + const int16_t *pFb_active_bins_per_band; + float pp_cldfb_weights_per_spar_band[CLDFB_NO_CHANNELS_MAX][IVAS_MAX_NUM_FB_BANDS]; /* weights for linear combination of parameters from different SPAR bands*/ + int16_t p_spar_start_bands[CLDFB_NO_CHANNELS_MAX]; /* the first SPAR band per CLFB band when the weight is > 0 */ + int16_t p_cldfb_map_to_spar_band[CLDFB_NO_CHANNELS_MAX]; /* a direct mapping from CLDFB band to SPAR band */ + int16_t p_short_stride_start_bin_per_band[IVAS_MAX_NUM_FB_BANDS]; + int16_t p_short_stride_num_bins_per_band[IVAS_MAX_NUM_FB_BANDS]; + float p_short_stride_bin_to_band[2 * MDFT_FB_BANDS_240]; + float *pp_short_stride_bin_to_band[IVAS_MAX_NUM_FB_BANDS]; + int16_t short_stride; + int16_t num_cldfb_bands; + +} ivas_fb_bin_to_band_data_t; + +typedef struct ivas_filterbank_t +{ + int16_t filterbank_num_bands; + ivas_fb_consts_t fb_consts; + ivas_fb_bin_to_band_data_t fb_bin_to_band; + +} ivas_filterbank_t; + +typedef struct ivas_fb_mixer_state_structure +{ + IVAS_FB_CFG *fb_cfg; + + int16_t num_diff_bands; + ivas_filterbank_t *pFb; + + float *ppFilterbank_inFR_re[IVAS_MAX_FB_MIXER_IN_CH]; + float *ppFilterbank_inFR_im[IVAS_MAX_FB_MIXER_IN_CH]; + float *ppFilterbank_prior_input[IVAS_MAX_FB_MIXER_IN_CH]; + float *prior_mixer[IVAS_MAX_FB_MIXER_OUT_CH][IVAS_MAX_SPAR_FB_MIXER_IN_CH]; + + /* store sin part in const table (no need to store 1s and 0s, no need to do windowing for 1's and 0's as well) */ + int16_t cross_fade_start_offset; + int16_t cross_fade_end_offset; + const float *pFilterbank_cross_fade; + int16_t ana_window_offset; + const float *pAna_window; + + int16_t prior_input_length; + int16_t windowed_fr_offset; + float cldfb_cross_fade[CLDFB_NO_COL_MAX]; + int16_t cldfb_cross_fade_start; + int16_t cldfb_cross_fade_end; + + int16_t first_frame[IVAS_SPAR_MAX_CH]; + +} IVAS_FB_MIXER_DATA, *IVAS_FB_MIXER_HANDLE; + + +/*----------------------------------------------------------------------------------* + * PARAMETRIC ISM encoder/decoder (common) structure + *----------------------------------------------------------------------------------*/ + +typedef struct ivas_param_ism_data_structure +{ + IVAS_FB_MIXER_HANDLE hFbMixer; + + int16_t nbands; + int16_t nblocks[MAX_PARAM_ISM_NBANDS]; + int16_t band_grouping[MAX_PARAM_ISM_NBANDS + 1]; + + int16_t azi_index[MAX_NUM_OBJECTS]; + int16_t ele_index[MAX_NUM_OBJECTS]; + + int16_t obj_indices[MAX_PARAM_ISM_NBANDS][MAX_PARAM_ISM_NBLOCKS][MAX_PARAM_ISM_WAVE]; + int16_t power_ratios_idx[MAX_PARAM_ISM_NBANDS][MAX_PARAM_ISM_NBLOCKS]; + + int16_t last_az_sgn[MAX_NUM_OBJECTS]; + int16_t last_az_diff[MAX_NUM_OBJECTS]; + int16_t last_el_sgn[MAX_NUM_OBJECTS]; + int16_t last_el_diff[MAX_NUM_OBJECTS]; + + int16_t flag_noisy_speech; + int16_t noisy_speech_buffer[PARAM_ISM_HYS_BUF_SIZE]; + int16_t flag_equal_energy; + + float last_dmx_gain; + float last_cardioid_left[MAX_NUM_OBJECTS]; + +} PARAM_ISM_CONFIG_DATA, *PARAM_ISM_CONFIG_HANDLE; + + +#endif /* IVAS_STAT_COM */ diff --git a/lib_com/ivas_stereo_dft_com.c b/lib_com/ivas_stereo_dft_com.c new file mode 100644 index 0000000000000000000000000000000000000000..541f90a120484b76fec7bc29abc3b6ebf704000d --- /dev/null +++ b/lib_com/ivas_stereo_dft_com.c @@ -0,0 +1,216 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include "options.h" +#include "ivas_cnst.h" +#include "ivas_rom_com.h" +#include "ivas_prot.h" +#include "prot.h" +#include "cnst.h" +#include "wmc_auto.h" + +/*------------------------------------------------------------------------- + * stereo_dft_config() + * + * DFT Stereo Configuration function + *------------------------------------------------------------------------*/ + +void stereo_dft_config( + STEREO_DFT_CONFIG_DATA_HANDLE hConfig, /* o : DFT stereo configuration */ + const int32_t brate, /* i : IVAS/CPE/nominal total bitrate */ + int16_t *bits_frame_nominal, /* o : primary channel nominal bits per frame */ + int16_t *bits_frame_nominal_2 /* o : secondary channel nominal bits per frame*/ +) +{ + if ( hConfig != NULL ) + { + hConfig->band_res = STEREO_DFT_BAND_RES_HIGH; + hConfig->prm_res = 2; + hConfig->dmx_active = STEREO_DFT_DMX_ACTIVE; + hConfig->ada_wb_res_cod_mode = 0; + } + + *bits_frame_nominal_2 = 5000 / FRAMES_PER_SEC; + + /* ITD, IPD and residual coding is not used in SID/No data */ + if ( brate == FRAME_NO_DATA ) + { + *bits_frame_nominal = FRAME_NO_DATA; + if ( hConfig != NULL ) + { + hConfig->res_pred_mode = STEREO_DFT_RESPRED_OFF; + hConfig->band_res = STEREO_DFT_BAND_RES_LOW; + hConfig->res_cod_mode = STEREO_DFT_RES_COD_OFF; + } + } + else if ( brate == IVAS_SID_5k2 ) + { + *bits_frame_nominal = SID_2k40 / FRAMES_PER_SEC; + if ( hConfig != NULL ) + { + hConfig->res_pred_mode = STEREO_DFT_RESPRED_OFF; + hConfig->band_res = STEREO_DFT_BAND_RES_LOW; + hConfig->res_cod_mode = STEREO_DFT_RES_COD_OFF; + } + } + else if ( brate <= IVAS_13k2 ) + { + *bits_frame_nominal = ACELP_9k60 / FRAMES_PER_SEC; + if ( hConfig != NULL ) + { + hConfig->res_pred_mode = STEREO_DFT_RESPRED_ESF; + hConfig->band_res = STEREO_DFT_BAND_RES_LOW; + hConfig->res_cod_mode = STEREO_DFT_RES_COD_OFF; + } + } + else if ( brate <= IVAS_16k4 ) + { + *bits_frame_nominal = ACELP_13k20 / FRAMES_PER_SEC; + if ( hConfig != NULL ) + { + hConfig->res_pred_mode = STEREO_DFT_RESPRED_ESF; + hConfig->band_res = STEREO_DFT_BAND_RES_LOW; + hConfig->res_cod_mode = STEREO_DFT_RES_COD_OFF; + } + } + else if ( brate <= IVAS_24k4 ) + { + *bits_frame_nominal = ACELP_16k40 / FRAMES_PER_SEC; + if ( hConfig != NULL ) + { + hConfig->res_pred_mode = STEREO_DFT_RESPRED_ESF; + hConfig->res_cod_mode = STEREO_DFT_RES_COD_OFF; + } + } + else if ( brate <= IVAS_32k ) + { + *bits_frame_nominal = ACELP_24k40 / FRAMES_PER_SEC; + if ( hConfig != NULL ) + { + hConfig->ada_wb_res_cod_mode = 1; + hConfig->res_pred_mode = STEREO_DFT_RESPRED_STEFI; + hConfig->res_cod_mode = STEREO_DFT_RES_COD_1kHz; + } + } + else if ( brate <= IVAS_48k ) + { + *bits_frame_nominal = ACELP_32k / FRAMES_PER_SEC; + if ( hConfig != NULL ) + { + hConfig->res_pred_mode = STEREO_DFT_RESPRED_STEFI; + hConfig->res_cod_mode = STEREO_DFT_RES_COD_1_6kHz; + } + } + else + { + assert( 0 && "Bit-rate not supported by DFT stereo." ); + } + + if ( hConfig != NULL && hConfig->force_mono_transmission ) + { + hConfig->res_pred_mode = STEREO_DFT_RESPRED_OFF; + hConfig->band_res = STEREO_DFT_BAND_RES_LOW; + hConfig->res_cod_mode = STEREO_DFT_RES_COD_OFF; + hConfig->ada_wb_res_cod_mode = 0; + } + + /*sanity check*/ + if ( hConfig != NULL ) + { + assert( hConfig->prm_res <= STEREO_DFT_NBDIV ); + /* make sure residual switching and ESF are not active at the same time */ + assert( !( hConfig->ada_wb_res_cod_mode == 1 && hConfig->res_pred_mode == STEREO_DFT_RESPRED_ESF ) ); + } + + return; +} + +/*------------------------------------------------------------------------- + * stereo_dft_band_config() + * + * Stereo DFT bands condfiguration + *------------------------------------------------------------------------*/ + +int16_t stereo_dft_band_config( + int16_t *band_limits, /* o : DFT band limits */ + const int16_t band_res, /* i : DFT band resolution */ + const int16_t NFFT, /* i : analysis/synthesis window length */ + const int16_t enc_dec /* i : flag to indicate enc vs dec */ +) +{ + int16_t nbands; + + /*sanity check*/ + assert( ( band_res == 1 || band_res == 0 || band_res == 2 ) && "stereo DFT: Parameter band resolution not supported!\n" ); + + band_limits[0] = 1; + nbands = 0; + while ( band_limits[nbands++] < NFFT / 2 ) + { + if ( band_res == 0 ) + { + assert( 0 && "stereo DFT: band config failed!\n" ); + } + else if ( band_res == 1 ) + { + if ( enc_dec == ENC ) + { + band_limits[nbands] = (int16_t) round_f( dft_band_limits_erb4[nbands] * ( (float) ( STEREO_DFT_N_NS_ENC ) / STEREO_DFT_N_NS ) ); + } + else + { + band_limits[nbands] = (int16_t) round_f( dft_band_limits_erb4[nbands] * ( (float) ( STEREO_DFT32MS_N_NS ) / STEREO_DFT_N_NS ) ); + } + + assert( ( nbands < STEREO_DFT_ERB4_BANDS ) && "stereo DFT: band config failed!\n" ); + } + else + { + if ( enc_dec == ENC ) + { + band_limits[nbands] = (int16_t) round_f( dft_band_limits_erb8[nbands] * ( (float) ( STEREO_DFT_N_NS_ENC ) / STEREO_DFT_N_NS ) ); + } + else + { + band_limits[nbands] = (int16_t) round_f( dft_band_limits_erb8[nbands] * ( (float) ( STEREO_DFT32MS_N_NS ) / STEREO_DFT_N_NS ) ); + } + + assert( ( nbands < STEREO_DFT_ERB8_BANDS ) && "stereo DFT: band config failed!\n" ); + } + } + nbands--; + band_limits[nbands] = NFFT / 2; /*Nyquist Freq*/ + + return ( nbands ); +} diff --git a/lib_com/ivas_stereo_eclvq_com.c b/lib_com/ivas_stereo_eclvq_com.c new file mode 100644 index 0000000000000000000000000000000000000000..f3b4e51fee66330bf5279ea6899df5de1a1c9653 --- /dev/null +++ b/lib_com/ivas_stereo_eclvq_com.c @@ -0,0 +1,99 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include +#include "ivas_prot.h" +#include "ivas_cnst.h" +#include +#include "prot.h" +#include "wmc_auto.h" + +/*--------------------------------------------------------------- + * ECSQ_init_instance() + * + * initialize the encoder or decoder instance ecsq_inst, using the configuration index config_index; + * ac_handle is a pointer to a structure containing the bitstream writer and the arithmetic coding state; + * the return value is the approximate number of bits written, expressed in 22Q10 fixed-point representation + * ---------------------------------------------------------------*/ + +void ECSQ_init_instance( + ECSQ_instance *ecsq_inst, + const int16_t config_index, + void *ac_handle ) +{ + ecsq_inst->config_index = config_index; + ecsq_inst->encoding_active = 1; + ecsq_inst->bit_count_estimate = 0; + ecsq_inst->ac_handle = ac_handle; + + return; +} + +/*--------------------------------------------------------------- + * ECSQ_dequantize_gain() + * + * dequantize global gain index + * ---------------------------------------------------------------*/ + +float ECSQ_dequantize_gain( + const int16_t index ) +{ + float global_gain; + + global_gain = powf( 10.0f, (float) index * ECLVQ_INV_GLOBAL_GAIN_FACTOR ); + + return global_gain; +} + +/*--------------------------------------------------------------- + * ECSQ_dequantize_vector() + * + * dequantize an integer-valued vector using optimal reconstruction points, which depend on the value of config_index + * ---------------------------------------------------------------*/ + +void ECSQ_dequantize_vector( + const int16_t *input, + const float global_gain, + const int16_t N, + float *output ) +{ + int16_t i; + + for ( i = 0; i < N; ++i ) + { + output[i] = (float) input[i] * global_gain; + } + + return; +} diff --git a/lib_com/ivas_stereo_ica_com.c b/lib_com/ivas_stereo_ica_com.c new file mode 100644 index 0000000000000000000000000000000000000000..31f9447a577376798e8977cd8c9a134819e33594 --- /dev/null +++ b/lib_com/ivas_stereo_ica_com.c @@ -0,0 +1,223 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include "options.h" +#include "cnst.h" +#include "ivas_cnst.h" +#include "prot.h" +#include "ivas_prot.h" +#include "wmc_auto.h" +#include "rom_com.h" +#include "ivas_rom_com.h" + +/*--------------------------------------------------------------- + * interpTargetChannel() + * + * Target signal correction for shift variations. + * The pointer passsed into this function is assumed to be chanR/chanL + currNCShift. + * ---------------------------------------------------------------*/ + +#define SPREAD_FACTOR1 ( 1.0f / INTERP_FACTOR1 ) + +static void interpTargetChannel( + float *target, + const int16_t prevShift, + const int16_t currShift, + const int16_t L_shift_adapt ) +{ + int16_t i, j, k, /*m,*/ d, N, signShift, lim1, lim2; + const float *win; + float *ptr1, *ptr2; + float tempBuff1[INTERP_FACTOR1 * ( L_SHIFT_ADAPT_MAX + 2 * N_MAX_SHIFT_CHANGE + 2 )], tempBuff2[L_SHIFT_ADAPT_MAX - 1]; + float x[4], y[4], tempF, tempF1; + float interp_factor2, factor; + float spread_factor2; + double tempD1, tempD2; + + d = -( currShift - prevShift ); + signShift = ( d >= 0 ) ? ( 1 ) : ( -1 ); + + if ( d == 0 ) + { + /* this can happen in DFT->TD switching */ + return; + } + + N = L_shift_adapt; + factor = ( (float) N ) / abs( d ); + interp_factor2 = factor / INTERP_FACTOR1; + spread_factor2 = 1.0f / interp_factor2; + + /* start from (target - N - d + 1) : (extra lag = step1) :to: (target - 1 - d) : (extra lag = d) */ + /* sinc interp by a factor of 2 */ + win = ica_sincInterp2 + SINC_ORDER1; + ptr1 = target; + ptr2 = tempBuff1 + ( N_MAX_SHIFT_CHANGE + 1 ) * INTERP_FACTOR1; + + for ( i = -( N_MAX_SHIFT_CHANGE + 1 ) * INTERP_FACTOR1; i < ( N + N_MAX_SHIFT_CHANGE + 1 ) * INTERP_FACTOR1; i++ ) + { + if ( i & 0x1 ) + { + ptr2[i] = 0.0f; + /* lim1 = ceil((i - SINC_ORDER1)*SPREAD_FACTOR1); */ + /* lim2 = floor((i + SINC_ORDER1)*SPREAD_FACTOR1); */ + tempF = ( i - SINC_ORDER1 ) * SPREAD_FACTOR1; + lim1 = (int16_t) ( tempF ); + if ( lim1 < tempF ) + { + lim1++; + } + + tempF = ( i + SINC_ORDER1 ) * SPREAD_FACTOR1; + lim2 = (int16_t) ( tempF ); + if ( lim2 > tempF ) + { + lim2--; + } + + for ( j = lim1; j <= lim2; j++ ) + { + ptr2[i] += win[j * INTERP_FACTOR1 - i] * ptr1[j]; + } + } + else + { + ptr2[i] = ptr1[(int16_t) ( i * SPREAD_FACTOR1 )]; + } + } + + /* cubic spline interp */ + ptr1 = ptr2; + ptr2 = tempBuff2; + + tempD1 = ( 1.0f / ( 6 * interp_factor2 * interp_factor2 * interp_factor2 ) ); + tempD2 = 3.0f * tempD1; + for ( tempF1 = d * factor - signShift, k = 0; k < N - 1; k++, tempF1 += ( factor - signShift ) ) + { + tempF = tempF1 * spread_factor2 - 1; + lim1 = (int16_t) ( tempF ); + if ( lim1 > tempF ) + { + lim1--; + } + + y[0] = ptr1[lim1]; + y[1] = ptr1[lim1 + 1]; + y[2] = ptr1[lim1 + 2]; + y[3] = ptr1[lim1 + 3]; + + x[0] = lim1 * interp_factor2; + x[1] = x[0] + interp_factor2; + x[2] = x[1] + interp_factor2; + x[3] = x[2] + interp_factor2; + + ptr2[k] = (float) ( ( y[3] * ( ( tempF1 - x[0] ) * ( tempF1 - x[1] ) * ( tempF1 - x[2] ) ) - y[0] * ( ( tempF1 - x[1] ) * ( tempF1 - x[2] ) * ( tempF1 - x[3] ) ) ) * tempD1 + ( y[1] * ( ( tempF1 - x[0] ) * ( tempF1 - x[2] ) * ( tempF1 - x[3] ) ) - y[2] * ( ( tempF1 - x[0] ) * ( tempF1 - x[1] ) * ( tempF1 - x[3] ) ) ) * tempD2 ); + } + + ptr1 = target; + mvr2r( ptr2, ptr1, N - 1 ); + + return; +} + + +/*--------------------------------------------------------------- + * Function targetCh_AlignStereoDFT() + * + * Align target channel in DFT stereo to correct for shift variations + * ---------------------------------------------------------------*/ + +static void targetCh_AlignStereoDFT( + float *target, + const int16_t prevShift, + const int16_t currShift, + const int16_t L_shift_adapt ) +{ + int16_t i; + float winSlope, alpha; + int16_t d; + + float fadeOutBuff[L_SHIFT_ADAPT_MAX]; + float fadeInBuff[L_SHIFT_ADAPT_MAX]; + + d = -( currShift - prevShift ); + + mvr2r( target + d, fadeOutBuff, L_shift_adapt ); + mvr2r( target, fadeInBuff, L_shift_adapt ); + + if ( L_shift_adapt > 0 ) + { + alpha = 0; + winSlope = 1.0f / L_shift_adapt; + for ( i = 0; i < L_shift_adapt; i++ ) + { + target[i] = alpha * fadeInBuff[i] + ( 1 - alpha ) * fadeOutBuff[i]; + alpha += winSlope; + } + } + else + { + mvr2r( fadeInBuff, target, L_shift_adapt ); + } + + return; +} + + +/*--------------------------------------------------------------- + * adjustTargetSignal() + * + * Target signal correction for shift variations. + * ---------------------------------------------------------------*/ + +void adjustTargetSignal( + float *target, + const int16_t prevShift, + const int16_t currShift, + const int16_t L_shift_adapt, + const int16_t method ) +{ + /* inter-frame shift variation and target shifting */ + + if ( method == 0 ) + { + interpTargetChannel( target, prevShift, currShift, L_shift_adapt ); + } + else + { + targetCh_AlignStereoDFT( target, prevShift, currShift, L_shift_adapt ); + } + + return; +} diff --git a/lib_com/ivas_stereo_mdct_bands_com.c b/lib_com/ivas_stereo_mdct_bands_com.c new file mode 100644 index 0000000000000000000000000000000000000000..35524a20a1a5c6c16675e86f1a869866e718a395 --- /dev/null +++ b/lib_com/ivas_stereo_mdct_bands_com.c @@ -0,0 +1,246 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include "options.h" +#include "ivas_cnst.h" +#include "ivas_rom_com.h" +#include "ivas_prot.h" +#include "rom_com.h" +#include "prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * Local union + *-------------------------------------------------------------------*/ + +#ifndef BASOP_NOGLOB +typedef union +#else /* BASOP_NOGLOB */ +typedef union +#endif /* BASOP_NOGLOB */ +{ + MDCTStereoBands_config const *steBands; + SpectrumWarping const *lpcBndsParam; +} SBPARAMS; + + +/*-------------------------------------------------------------------* + * stereo_mdct_init_bands() + * + * initialize stereo band tables for MDCT stereo + *-------------------------------------------------------------------*/ + +void stereo_mdct_init_bands( + const int16_t L_frame, /* i : frame length */ + const int16_t tmp_tcx_mode, /* i : tcx mode (TCX10, TCX 20), -1 if transition frame */ + const int32_t element_brate, /* i : element bitrate */ + const int16_t igf, /* i : flag indicating if IGF is used */ + const H_IGF_GRID hIgfGrid, /* i : IGF grid setup */ + int16_t *sfbOffset, /* o : sfb offset table */ + int16_t *sfbCnt /* o : number of sfbs */ +) +{ + SBPARAMS sfbParam; + int16_t i, cnt, specStartOffset, L_frameTCX, tcx_mode; + const uint8_t *sfbWidths; + + if ( tmp_tcx_mode > 0 ) + { + tcx_mode = tmp_tcx_mode; + L_frameTCX = ( tcx_mode == TCX_20_CORE ) ? L_frame : ( L_frame / 2 ); + } + else + { + /*transition frame*/ + L_frameTCX = L_frame + L_frame / 4; + tcx_mode = TCX_20_CORE; + } + + /* select table */ + if ( L_frame == L_FRAME48k ) + { + sfbParam.steBands = mdctStereoBands_32000_640; + + cnt = ( tcx_mode == TCX_20_CORE ? sfbParam.steBands->bdnCnt_TCX20[0] : sfbParam.steBands->bndCnt_TCX10[0] ); + + sfbWidths = ( tcx_mode == TCX_20_CORE ? sfbParam.steBands->bandLengthsTCX20 : sfbParam.steBands->bandLengthsTCX10 ); + } + else + { + if ( element_brate < IVAS_96k ) + { + sfbParam.steBands = mdctStereoBands_32000_640; + + switch ( L_frame ) + { + case L_FRAME32k: + cnt = ( tcx_mode == TCX_20_CORE ? sfbParam.steBands->bdnCnt_TCX20[1] : sfbParam.steBands->bndCnt_TCX10[1] ); + break; + case L_FRAME25_6k: + cnt = ( tcx_mode == TCX_20_CORE ? sfbParam.steBands->bdnCnt_TCX20[2] : sfbParam.steBands->bndCnt_TCX10[2] ); + break; + case L_FRAME16k: + cnt = ( tcx_mode == TCX_20_CORE ? sfbParam.steBands->bdnCnt_TCX20[3] : sfbParam.steBands->bndCnt_TCX10[3] ); + break; + default: + assert( !"Subband division not defined for this frame size" ); + return; + } + + sfbWidths = ( tcx_mode == TCX_20_CORE ? sfbParam.steBands->bandLengthsTCX20 : sfbParam.steBands->bandLengthsTCX10 ); + } + else + { + switch ( L_frame ) + { + case L_FRAME48k: + case L_FRAME32k: + sfbParam.lpcBndsParam = sw32000Hz; + break; + case L_FRAME25_6k: + sfbParam.lpcBndsParam = sw25600Hz; + break; + case L_FRAME16k: + sfbParam.lpcBndsParam = sw16000Hz; + break; + default: + assert( !"Subband division not defined for this frame size" ); + return; + } + + sfbWidths = ( tcx_mode == TCX_20_CORE ? sfbParam.lpcBndsParam->bandLengthsTCX20 : sfbParam.lpcBndsParam->bandLengthsTCX10 ); + cnt = 64; + } + } + + /* calc sfb offsets */ + specStartOffset = 0; + + for ( i = 0; i < cnt; i++ ) + { + sfbOffset[i] = min( specStartOffset, L_frameTCX ); + specStartOffset += sfbWidths[i]; + + if ( sfbOffset[i] >= L_frameTCX ) + { + break; + } + } + + *sfbCnt = i; + sfbOffset[*sfbCnt] = min( specStartOffset, L_frameTCX ); + + if ( igf ) + { + int16_t sfbOldCnt = *sfbCnt; + int16_t igfSfbStep = hIgfGrid->infoIsRefined ? 2 : 1; + int16_t k; + + /* modify sfb bands according to igf grid */ + assert( hIgfGrid != NULL ); + + /* find sfb where IGF starts */ + for ( i = 0; i <= *sfbCnt; i++ ) + { + if ( sfbOffset[i] >= hIgfGrid->startLine ) + { + /* set band border to igf start line */ + sfbOffset[i] = hIgfGrid->startLine; + *sfbCnt = i; + break; + } + } + /* change bands above the igf start line to match igf bands */ + for ( i = 1, k = igfSfbStep; i < hIgfGrid->swb_offset_len; i++, k += igfSfbStep ) + { + sfbOffset[*sfbCnt + i] = hIgfGrid->swb_offset[k]; + } + + *sfbCnt += ( hIgfGrid->swb_offset_len - 1 ); + + /* better save than sorry, overwrite anything that is left above */ + for ( i = *sfbCnt + 1; i < sfbOldCnt + 1; i++ ) + { + sfbOffset[i] = 0; + } + } + else + { + if ( sfbOffset[*sfbCnt] < L_frameTCX ) + { + int16_t nMissingBins = L_frameTCX - sfbOffset[*sfbCnt]; + if ( sfbWidths[i] / 2 < nMissingBins ) + { + ( *sfbCnt )++; + } + sfbOffset[*sfbCnt] = L_frameTCX; + } + } + return; +} + +/*-------------------------------------------------------------------* + * stereo_mdct_init_igf_start_band() + * + * initialize start band of the IGF in MDCT stereo + *-------------------------------------------------------------------*/ + +void stereo_mdct_init_igf_start_band( + STEREO_MDCT_BAND_PARAMETERS *stbParams, /* i/o: stereo frequency band parameters */ + const float transFac, /* i : transform factor */ + const int16_t bwidth, /* i : audio bandwidth */ + const int32_t element_brate /* i : element bitrate */ +) +{ + int16_t i, bitRateIndex, igfStartLine; + const int16_t *swb_offset; + + bitRateIndex = IGF_MapBitRateToIndex( element_brate, bwidth, IVAS_CPE_MDCT, 0 ); + swb_offset = &swb_offset_LB_new[bitRateIndex][1]; + igfStartLine = IGF_ApplyTransFac( swb_offset[0], transFac ); + + for ( i = 0; i < stbParams->sfbCnt; i++ ) + { + if ( igfStartLine == stbParams->sfbOffset[i] ) + { + stbParams->sfbIgfStart = i; + break; + } + } + + stbParams->nBandsStereoCore = stbParams->sfbIgfStart; + + + return; +} diff --git a/lib_com/ivas_stereo_mdct_stereo_com.c b/lib_com/ivas_stereo_mdct_stereo_com.c new file mode 100644 index 0000000000000000000000000000000000000000..c9151b72df87f1e9d08b63734f7177c668f85579 --- /dev/null +++ b/lib_com/ivas_stereo_mdct_stereo_com.c @@ -0,0 +1,65 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "ivas_cnst.h" +#include "ivas_prot.h" +#include "wmc_auto.h" +#include + +/*-------------------------------------------------------------------* + * splitAvailableBits() + * + * split available bits between channels based on the split ratio + *-------------------------------------------------------------------*/ + +void splitAvailableBits( + const int16_t total_bits, /* i : total available bits for TCX coding */ + const int16_t split_ratio, /* i : split ratio */ + const int16_t isSBAStereoMode, /* i : signal core coding for SBA */ + int16_t *bits_ch0, /* o : bits for channel 0 */ + int16_t *bits_ch1 /* o : bits for channel 1 */ +) +{ + assert( split_ratio >= 1 && split_ratio < SMDCT_BITRATE_RATIO_RANGE ); + + *bits_ch0 = split_ratio * total_bits / SMDCT_BITRATE_RATIO_RANGE; + /* for SBA mode bias the distribution towards the W channel */ + if ( split_ratio < 7 && isSBAStereoMode ) + { + *bits_ch0 += (int16_t) ( 0.2 * *bits_ch0 ); + } + *bits_ch1 = total_bits - *bits_ch0; + + return; +} diff --git a/lib_com/ivas_stereo_psychlpc_com.c b/lib_com/ivas_stereo_psychlpc_com.c new file mode 100644 index 0000000000000000000000000000000000000000..ac94d56b0224fe07d8e896dcb5197622559e663b --- /dev/null +++ b/lib_com/ivas_stereo_psychlpc_com.c @@ -0,0 +1,159 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "ivas_rom_com.h" +#include "ivas_prot.h" +#include "prot.h" +#include "ivas_prot.h" +#include "wmc_auto.h" +#include + +/*-------------------------------------------------------------------* + * SpectrumWeighting_Init() + * + * + *-------------------------------------------------------------------*/ + +static void SpectrumWeighting_Init( + SpectrumWarping const *pSpectrumWarping, + const int16_t isTCX20, + PsychoacousticParameters *pPsychParams ) +{ + if ( isTCX20 ) + { + pPsychParams->bandLengths = pSpectrumWarping->bandLengthsTCX20; + } + else + { + pPsychParams->bandLengths = pSpectrumWarping->bandLengthsTCX10; + } + + return; +} + +/*-------------------------------------------------------------------* + * PsychoacousticParameters_Init() + * + * initialize a PsychoacousticParameters structure + *-------------------------------------------------------------------*/ + +ivas_error PsychoacousticParameters_Init( + const int32_t sr_core, /* i : sampling rate of core-coder */ + const int16_t nBins, /* i : Number of bins (spectral lines) */ + const int8_t nBands, /* i : Number of spectrum subbands */ + const int16_t isTCX20, /* i : Flag indicating if the subband division is for TCX20 or TCX10 */ + const int16_t isWarped, /* i : Flag indicating if the scale is linear or warped */ + PsychoacousticParameters *pPsychParams ) +{ + + if ( pPsychParams == NULL ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "PsychParams handle is NULL" ); + } + + pPsychParams->nBins = nBins; + pPsychParams->nBands = nBands; + + if ( !isWarped ) + { + pPsychParams->bandLengths = NULL; + } + else + { + assert( pPsychParams->nBands == 64 ); + switch ( sr_core ) + { + case 16000: + SpectrumWeighting_Init( sw16000Hz, isTCX20, pPsychParams ); + break; + case 25600: + SpectrumWeighting_Init( sw25600Hz, isTCX20, pPsychParams ); + break; + case 32000: + SpectrumWeighting_Init( sw32000Hz, isTCX20, pPsychParams ); + break; + default: + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Subband division not defined for this sampling rate" ); + } + } + + return IVAS_ERR_OK; +} + +/*-------------------------------------------------------------------* + * InitPsychLPC() + * + * + *-------------------------------------------------------------------*/ + +void InitPsychLPC( + const int32_t sr_core, /* i : sampling rate of core-coder */ + const int16_t L_frame, /* i : frame length */ + const TCX_CONFIG_HANDLE hTcxCfg /* i : TCX configuration handle */ +) +{ + int16_t L_frame_ext = L_frame + L_frame / 4; + + hTcxCfg->psychParamsCurrent = NULL; + + PsychoacousticParameters_Init( sr_core, L_frame / 2, 64, 0, 1, &hTcxCfg->psychParamsTCX10 ); + PsychoacousticParameters_Init( sr_core, L_frame, 64, 1, 1, &hTcxCfg->psychParamsTCX20 ); + PsychoacousticParameters_Init( sr_core, L_frame_ext, 64, 1, 0, &hTcxCfg->psychParamsTCX20AfterACELP ); + + return; +} + +/*-------------------------------------------------------------------* + * SetCurrentPsychParams() + * + * + *-------------------------------------------------------------------*/ + +void SetCurrentPsychParams( + const int16_t core, + const int16_t last_frame_was_concealed_cng, + TCX_CONFIG_HANDLE hTcxCfg ) +{ + if ( hTcxCfg->tcx_last_overlap_mode == TRANSITION_OVERLAP && !last_frame_was_concealed_cng ) + { + assert( core == TCX_20_CORE ); + hTcxCfg->psychParamsCurrent = &hTcxCfg->psychParamsTCX20AfterACELP; + } + else + { + hTcxCfg->psychParamsCurrent = ( core == TCX_10_CORE ) ? &hTcxCfg->psychParamsTCX10 : &hTcxCfg->psychParamsTCX20; + } + + return; +} diff --git a/lib_com/ivas_stereo_td_bit_alloc.c b/lib_com/ivas_stereo_td_bit_alloc.c new file mode 100644 index 0000000000000000000000000000000000000000..41a552162002b44eedc36819896e3f6530923b46 --- /dev/null +++ b/lib_com/ivas_stereo_td_bit_alloc.c @@ -0,0 +1,734 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "cnst.h" +#include "stat_enc.h" +#include "rom_com.h" +#include "ivas_prot.h" +#include "ivas_rom_com.h" +#include "ivas_cnst.h" +#include "prot.h" +#include "wmc_auto.h" + + +/*-------------------------------------------------------------------* + * Local constants + *-------------------------------------------------------------------*/ + +#define NB_RATE_POSS 10 /* Nmbr of possible FCB bitrate for half rate mode*/ +#define MIN_SEC_ACB_RATE ( 2 * 8 * FRAMES_PER_SEC ) /* 2 subfr ACB bitrate */ +#define MIN_SEC_LPC_RATE ( ( 24 + 2 ) * FRAMES_PER_SEC ) /* LPC min rate */ + +#define MAX_SC_FCB_RATE ( 24 + 1 ) /* Maximum bit for a FCB subfr */ +#define MIN_4SUBFR_FCB_RATE 40 /* Minimum 4 subfr bitrate (4x10 bits) */ +#define MIN_GAIN_BITS 6 /* Minimum number of bits used */ + +#define TDM_UC_NORMAL_MODE_MBRATE 9000 /* Max bitrate for normal UC if LP coded */ +#define TDM_UC_NORMAL_MODE_MBRATE_LP_R 8200 /* Normal bitrate for normal UC if LP is reused */ +#define TDM_UC_NORMAL_MODE_MINBR_LP_R 7000 /* If bitrate is below 7k, add back MID_LP_BRATE */ +#define MID_LP_BRATE ( 31 + 5 ) * FRAMES_PER_SEC /* average bitrate for LP */ +#define MAX_TDM_UC_BRATE 11000 /* Maximum bitrate for tdm normal UC mode */ + +#define MIN_SIGN_RATE ( TDM_SIGNAL_BITS_READ_FROM_THE_END_OF_BS * FRAMES_PER_SEC ) /* min. 2 time 12 bits FCB, used only when LPC and/or pitch is transmitted */ +#define MIN_FCB_SECRATE2 ( 2 * 16 * FRAMES_PER_SEC ) /* min. 2 time 14 bits FCB, used only when LPC and/or pitch is transmitted */ + + +/*-------------------------------------------------------------------* + * tdm_bit_alloc() + * + * Bitbudget distribution between Primary and Secondary channel in TD stereo + *-------------------------------------------------------------------*/ + +void tdm_bit_alloc( + const int16_t ivas_format, /* i : IVAS format */ + const int16_t ism_mode, /* i : ISM mode in combined format */ + const int32_t element_brate_wo_meta, /* i : element bitrate without metadata */ + const int16_t tdm_lp_reuse_flag, /* i : LPC reusage flag */ + int32_t *total_brate_pri, /* o : Allocated primary channel bitrate */ + int32_t *total_brate_sec, /* o : Allocated secondary channel bitrate */ + int16_t *tdm_low_rate_mode, /* o : secondary channel low rate mode flag*/ + const int16_t coder_type, /* i : secondary channel coder type */ + const int16_t ener_ratio_idx, /* i : correlation ratio indexe */ + const int16_t tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag */ + const int16_t bwidth_pri, /* i : bandwidth of the primary channel */ + const int16_t bwidth_sec, /* i : bandwidth of the secondary channel */ + const int16_t flag_ACELP16k_pri, /* i : ACELP@16kHz core flag, primary chan.*/ + const int16_t tdm_LRTD_flag, /* i : LRTD stereo mode flag */ + const int16_t coder_type0, /* i : coder type (temporary in the encoder, from bitstream in decoder) */ + const int16_t tdm_inst_ratio_idx_ref /* i : instantaneous correlation ratio idx */ +) +{ + int16_t idx, four_subfr_fcb, two_subfr_fcb; + float bit_rate_diff; + int16_t BWE_brate, tmp_bits; + int16_t tdm_inst_ratio_idx = tdm_inst_ratio_idx_ref; + if ( tdm_inst_ratio_idx == TDM_NQ ) + { + tdm_inst_ratio_idx = LRTD_STEREO_MID_IS_PRIM; /* Bit rate almost split half and half*/ + } + + /* Decision on using the low rate mode or the normal mode */ + /* default is using the low rate mode for the secondary channel coding*/ + /* UC and IC are automatically coded with low rate mode */ + *tdm_low_rate_mode = 1; + + /* Allocating different bitrate to channels */ + idx = 0; + if ( element_brate_wo_meta <= IVAS_13k2 ) + { + idx = 0; + } + else if ( element_brate_wo_meta <= IVAS_16k4 ) + { + idx = 1; + } + else if ( element_brate_wo_meta <= IVAS_24k4 ) + { + idx = 2; + } + else if ( element_brate_wo_meta <= IVAS_32k ) + { + idx = 3; + } + else if ( element_brate_wo_meta <= IVAS_48k ) + { + idx = 4; + } + + if ( coder_type == UNVOICED && tdm_bit_allc_tbl[idx][coder_type] >= 4200 ) + { + *tdm_low_rate_mode = 0; + } + + /* Secondary channel based bitrate allocation */ + *total_brate_sec = tdm_bit_allc_tbl[idx][coder_type]; + + /* secondary channel bitrate allocation based on the energy scaling ratio */ + if ( ( ( ivas_format != MASA_ISM_FORMAT || ism_mode == ISM_MODE_NONE ) && ( ( coder_type != UNVOICED ) || tdm_LRTD_flag == 1 ) ) || ( ivas_format == MASA_ISM_FORMAT && ism_mode != ISM_MODE_NONE && coder_type > UNVOICED ) ) + { + bit_rate_diff = (float) ( element_brate_wo_meta - 2 * *total_brate_sec ); + + if ( tdm_LRTD_flag == 1 ) /* > element_brate > STEREO_22k or CT0 not used */ + { + /* further adjustment in function of the energy/correlation ratio */ + if ( coder_type == INACTIVE ) + { + *total_brate_sec = max( *total_brate_sec, (int16_t) ( 0.3f * ( element_brate_wo_meta - 500 ) / 100 ) * 100 ); + tmp_bits = (int16_t) ( -abs( tdm_inst_ratio_idx - 16 ) * 200 * idx ); + } + else + { + *total_brate_sec = max( *total_brate_sec, (int16_t) ( 0.5f * ( element_brate_wo_meta - 500 ) / 100 ) * 100 ); + /* tmp_bits = -abs(tdm_inst_ratio_idx-16)*200*idx; */ + tmp_bits = (int16_t) ( -abs( tdm_inst_ratio_idx - 16 ) * 100 * idx ); + } + + /* tmp_bits should be subtract from the secondary channel bitrate */ + /* If the primary channel doesn't correspond to the channel having the highest correlation to the mono- inverse the bitrate compensation */ + if ( ( ener_ratio_idx >= LRTD_STEREO_MID_IS_PRIM && tdm_inst_ratio_idx < LRTD_STEREO_MID_IS_PRIM ) || ( ener_ratio_idx < LRTD_STEREO_MID_IS_PRIM && tdm_inst_ratio_idx >= LRTD_STEREO_MID_IS_PRIM ) ) + { + tmp_bits *= -1; + } + bit_rate_diff = tmp_bits; + } + else + { + if ( ener_ratio_idx < LRTD_STEREO_MID_IS_PRIM ) + { + bit_rate_diff = ( LRTD_STEREO_MID_IS_PRIM - ener_ratio_idx ) * bit_rate_diff * 0.05f; + } + else + { + bit_rate_diff = ( ener_ratio_idx - LRTD_STEREO_MID_IS_PRIM ) * bit_rate_diff * 0.05f; + } + } + /*bit_rate_diff2 = ((int16_t)(10.f*(-0.5f*ener_ratio_LR+0.5f)*bit_rate_diff)/100)*100;*/ + *total_brate_sec += ( (int16_t) ( bit_rate_diff / 100 ) * 100 ); + *total_brate_sec = max( *total_brate_sec, tdm_bit_allc_tbl[idx][coder_type] ); + + if ( coder_type == INACTIVE && tdm_LRTD_flag == 0 ) + { + *total_brate_sec = min( *total_brate_sec, MIN_BRATE_SWB_BWE ); + } + + if ( ( ener_ratio_idx <= 1 || ener_ratio_idx >= 29 ) && coder_type >= UNVOICED ) + { + int16_t delta_brate = 0; + + if ( bwidth_pri > WB ) + { + delta_brate = 600; /* To slightly compensate for SWB BWE instead of WB BWE */ + if ( element_brate_wo_meta <= IVAS_16k4 ) + { + delta_brate = 1250; /* To compensate for SWB BWE instead of WB BWE */ + } + } + + if ( element_brate_wo_meta <= IVAS_13k2 ) + { + *total_brate_sec = max( *total_brate_sec, 5600 + delta_brate ); /* ~42-47 % of the total bitrate */ + } + else if ( element_brate_wo_meta <= IVAS_16k4 ) + { + *total_brate_sec = max( *total_brate_sec, 6500 + delta_brate ); /* ~40-43 % of the total bitrate */ + } + else if ( element_brate_wo_meta <= IVAS_24k4 ) + { + *total_brate_sec = max( *total_brate_sec, 9000 + delta_brate ); /* ~37-39 % of the total bitrate */ + } + else + { + *total_brate_sec = max( *total_brate_sec, 9600 + delta_brate ); /* ~30-32% of the total bitrate */ + } + } + else + { + *total_brate_sec = min( *total_brate_sec, (int16_t) ( 0.0045f * element_brate_wo_meta ) * 100 ); + } + + *total_brate_sec = min( *total_brate_sec, 18000 ); + } + else if ( coder_type == UNVOICED ) + { + if ( tdm_lp_reuse_flag == 0 ) + { + *total_brate_sec += ( 31 + 5 ) * FRAMES_PER_SEC; + } + } + + if ( coder_type <= UNVOICED ) + { + *total_brate_sec = min( *total_brate_sec, MAX_TDM_UC_BRATE ); + + if ( *total_brate_sec >= TDM_UC_NORMAL_MODE_MBRATE && tdm_lp_reuse_flag == 0 ) + { + *tdm_low_rate_mode = 0; + } + else if ( *total_brate_sec >= TDM_UC_NORMAL_MODE_MBRATE_LP_R ) + { + *tdm_low_rate_mode = 0; + } + else if ( ( tdm_lp_reuse_flag == 0 && *total_brate_sec < TDM_UC_NORMAL_MODE_MINBR_LP_R && coder_type == UNVOICED ) || ( tdm_lp_reuse_flag == 0 && *total_brate_sec < ( tdm_bit_allc_tbl[idx][0] + MID_LP_BRATE ) ) ) + { + *total_brate_sec += MID_LP_BRATE; + } + } + + /* verify that primary channel bitrate is higher than the minimum supported bitrate */ + if ( flag_ACELP16k_pri ) + { + BWE_brate = SWB_TBE_1k75; + if ( element_brate_wo_meta < IVAS_24k4 ) + { + BWE_brate = SWB_TBE_1k10; + } + + if ( bwidth_pri > WB && tdm_LRTD_flag == 0 ) + { + BWE_brate += ( STEREO_BITS_ICBWE + STEREO_ICBWE_MSFLAG_BITS ) * FRAMES_PER_SEC; + } + if ( bwidth_pri > SWB && tdm_LRTD_flag == 1 ) + { + BWE_brate += 300; + } + + if ( bwidth_pri == FB ) + { + BWE_brate += ( FB_TBE_1k8 - SWB_TBE_1k75 ); + } + + if ( element_brate_wo_meta - *total_brate_sec - BWE_brate < 14000 ) + { + *total_brate_sec = element_brate_wo_meta - 14000 - BWE_brate; + } + } + else + { + BWE_brate = SWB_TBE_1k75; + if ( bwidth_pri == WB ) + { + BWE_brate = WB_BWE_0k35; + if ( tdm_LRTD_flag == 0 ) + { + BWE_brate += 250; /* ICA Brate */ + } + } + else if ( tdm_LRTD_flag == 0 ) + { + BWE_brate += 350; /* ICA Brate */ + } + } + + if ( coder_type0 == TRANSITION ) + { + if ( element_brate_wo_meta > IVAS_13k2 ) + { + *total_brate_sec = min( *total_brate_sec, element_brate_wo_meta - ( ACELP_8k00 + BWE_brate ) ); + } + else + { + *total_brate_sec = min( *total_brate_sec, element_brate_wo_meta - ( ACELP_7k20 + BWE_brate ) ); + } + } + else + { + *total_brate_sec = min( *total_brate_sec, element_brate_wo_meta - ( 5900 + BWE_brate ) ); + + if ( coder_type == INACTIVE ) + { + *total_brate_sec = max( *total_brate_sec, tdm_bit_allc_tbl[0][0] ); /* sanity check to ensure the secondary channel always gets the minimal bitrate it needs */ + } + else + { + *total_brate_sec = max( *total_brate_sec, 3500 ); /* sanity check to ensure the secondary channel always gets the minimal bitrate it needs */ + } + } + + /* Secondary channel bitrate adjusment */ + /* First, adjust the bitrate depending of what is transmitted */ + /* Second, choose the number of subframe for ACELP core depending of the targetted bitratre */ + /* Finally, verify that the concordance between the number of subframe, the parameters sent and the bitrate available */ + if ( coder_type == GENERIC /* || coder_type == AUDIO*/ ) + { + /* Adjust the bitrate depending of what is transmitted */ + /* If LPC are transmitted, ensure enough bits are used */ + if ( tdm_lp_reuse_flag == 0 ) + { + /* Pitch is transmitted as well, further increase the bitrate */ + if ( tdm_Pitch_reuse_flag == 0 ) + { + *total_brate_sec = max( *total_brate_sec, MIN_FCB_SECRATE2 + MIN_SEC_ACB_RATE + MIN_SEC_LPC_RATE + MIN_SIGN_RATE ); + + if ( tdm_LRTD_flag == 1 && bwidth_sec == SWB ) + { + /* ensure that there are enough bits to code SWB TBE_1k10 as well */ + *total_brate_sec = max( *total_brate_sec, MIN_FCB_SECRATE2 + MIN_SEC_ACB_RATE + MIN_SEC_LPC_RATE + MIN_SIGN_RATE + SWB_TBE_1k10 ); + } + } + else /* only LPC is tranmitted -> if ( *total_brate_sec < MIN_SEC_BRATE+MIN_SEC_LPC_RATE ) */ + { + *total_brate_sec = max( *total_brate_sec, MIN_FCB_SECRATE2 + MIN_SEC_LPC_RATE + MIN_SIGN_RATE ); + } + } + else if ( /*tdm_lp_reuse_flag == 1*/ tdm_Pitch_reuse_flag == 0 ) + { + *total_brate_sec = max( *total_brate_sec, MIN_FCB_SECRATE2 + MIN_SEC_ACB_RATE + MIN_SIGN_RATE ); + } + + /* Choose between 2 and 4 subfr, depending of the bitrate available and prevent the gap between the 2 atlernative */ + if ( tdm_LRTD_flag == 1 ) + { + four_subfr_fcb = (int16_t) ( *total_brate_sec - ( TDM_SIGNAL_BITS_READ_FROM_THE_END_OF_BS - STEREO_BITS_TCA + 1 + 4 * MIN_GAIN_BITS ) * FRAMES_PER_SEC ); + two_subfr_fcb = (int16_t) ( *total_brate_sec - ( TDM_SIGNAL_BITS_READ_FROM_THE_END_OF_BS - STEREO_BITS_TCA + 1 + 2 * MIN_GAIN_BITS ) * FRAMES_PER_SEC ); + } + else + { + four_subfr_fcb = (int16_t) ( *total_brate_sec - ( TDM_SIGNAL_BITS_READ_FROM_THE_END_OF_BS + 1 + 4 * MIN_GAIN_BITS ) * FRAMES_PER_SEC ); + two_subfr_fcb = (int16_t) ( *total_brate_sec - ( TDM_SIGNAL_BITS_READ_FROM_THE_END_OF_BS + 1 + 2 * MIN_GAIN_BITS ) * FRAMES_PER_SEC ); + } + + if ( tdm_lp_reuse_flag == 0 ) + { + four_subfr_fcb -= MIN_SEC_LPC_RATE; + two_subfr_fcb -= MIN_SEC_LPC_RATE; + } + + if ( tdm_Pitch_reuse_flag == 0 ) + { + four_subfr_fcb -= ( MIN_SEC_ACB_RATE + 10 * FRAMES_PER_SEC ); + two_subfr_fcb -= MIN_SEC_ACB_RATE; + } + + /* Too much bits for the 2 subfr model but not enough for the the 4 subfr model -> slightly reduce the 2nd channel bitrate */ + if ( two_subfr_fcb > 2 * MAX_SC_FCB_RATE * FRAMES_PER_SEC && four_subfr_fcb < MIN_4SUBFR_FCB_RATE * FRAMES_PER_SEC ) + { + if ( tdm_LRTD_flag == 1 ) + { + *total_brate_sec = 2 * MAX_SC_FCB_RATE * FRAMES_PER_SEC + ( TDM_SIGNAL_BITS_READ_FROM_THE_END_OF_BS - STEREO_BITS_TCA + 1 + 2 * MIN_GAIN_BITS ) * FRAMES_PER_SEC; + } + else + { + *total_brate_sec = 2 * MAX_SC_FCB_RATE * FRAMES_PER_SEC + ( TDM_SIGNAL_BITS_READ_FROM_THE_END_OF_BS + 1 + 2 * MIN_GAIN_BITS ) * FRAMES_PER_SEC; + } + + if ( tdm_lp_reuse_flag == 0 ) + { + *total_brate_sec += MIN_SEC_LPC_RATE; + } + + if ( tdm_Pitch_reuse_flag == 0 ) + { + *total_brate_sec += MIN_SEC_ACB_RATE; + } + } + else if ( four_subfr_fcb >= ( 40 ) * FRAMES_PER_SEC ) /* Enough bits to have minimally 2 x 12 + 2*7 bits FCB */ + { + *tdm_low_rate_mode = 0; /* Use normal rate mode */ + } + else /* Possible slight increase of secondary channel bit budget to compensate for FCB limited flexibility */ + { + int16_t tmp_rate, i; + tmp_rate = two_subfr_fcb; + idx = NB_RATE_POSS - 2; + + for ( i = 0; i < NB_RATE_POSS; i++ ) + { + if ( tmp_rate <= fast_FCB_rates_2sfr[i] ) + { + idx = i; + break; + } + } + *total_brate_sec += ( fast_FCB_rates_2sfr[idx] - tmp_rate ); + } + /* To prevent 13.2 kb/s for primary channel as some bitstream issues arrise with it */ + if ( element_brate_wo_meta - *total_brate_sec == ACELP_13k20 ) + { + *total_brate_sec += 100; + } + } + /* prevent 2.4 kb/s and 2.8 kb/s as they are reserved bitrates for DTX and VBR */ + if ( *total_brate_sec == PPP_NELP_2k80 || *total_brate_sec == SID_2k40 ) + { + *total_brate_sec -= 100; + } + + *total_brate_pri = element_brate_wo_meta - *total_brate_sec; + + return; +} + + +/*-------------------------------------------------------------------* + * td_stereo_param_updt() + * + * copy certain TD stereo parameters from primary channel to secondary channel + *-------------------------------------------------------------------*/ + +void td_stereo_param_updt( + const float lsp_old_PCh[], /* i : primary channel old LSPs */ + const float lsf_old_PCh[], /* i : primary channel old LSFs */ + const float pitch_buf_PCh[], /* i : primary channel pitch buffer */ + float tdm_lspQ_PCh[], /* o : Q LSPs for primary channel */ + float tdm_lsfQ_PCh[], /* o : Q LSFs for primary channel */ + float tdm_Pri_pitch_buf[], /* o : pitch values for primary channel */ + const int16_t flag_ACELP16k, /* i : ACELP@16kHz flag */ + const int16_t tdm_use_IAWB_Ave_lpc /* i : flag to indicate the usage of mean inactive LP coefficients */ +) +{ + int16_t i; + + /* Copy some primary channel information into the secondary channel structure for later usage */ + if ( tdm_use_IAWB_Ave_lpc == 1 ) + { + mvr2r( IAWB_Ave, tdm_lsfQ_PCh, M ); + lsf2lsp( tdm_lsfQ_PCh, tdm_lspQ_PCh, M, INT_FS_12k8 ); + } + else if ( flag_ACELP16k == 1 ) + { + mvr2r( lsp_old_PCh, tdm_lspQ_PCh, M ); + lsp_convert_poly( tdm_lspQ_PCh, L_FRAME, 0 ); + lsp2lsf( tdm_lspQ_PCh, tdm_lsfQ_PCh, M, INT_FS_12k8 ); + } + else + { + mvr2r( lsp_old_PCh, tdm_lspQ_PCh, M ); + mvr2r( lsf_old_PCh, tdm_lsfQ_PCh, M ); + } + + /* This is only to keep the buffer up-to-date */ + if ( flag_ACELP16k == 1 ) + { + for ( i = 0; i < NB_SUBFR; i++ ) + { + tdm_Pri_pitch_buf[i] = pitch_buf_PCh[i] * 0.8f; + tdm_Pri_pitch_buf[i] = max( tdm_Pri_pitch_buf[i], PIT_MIN ); + } + } + else + { + mvr2r( pitch_buf_PCh, tdm_Pri_pitch_buf, NB_SUBFR ); + } + + return; +} + + +/*-------------------------------------------------------------------* + * tdm_SCh_LSF_intra_pred_zero_bits() + * + * + *-------------------------------------------------------------------*/ + +static void tdm_SCh_LSF_intra_pred_zero_bits( + const float *tdm_lsfQ_PCh, /* i : primary channel LSFs */ + float *pred_lsf_SCh, /* o : predicted secondary channel LSFs */ + const float *lsf_mean, /* i : secondary channel mean LSFs */ + const float beta /* i : pull to average beta factor */ +) +{ + int16_t i; + + /* pulling the LSFs closer to the average */ + for ( i = 0; i < M; i++ ) + { + pred_lsf_SCh[i] = beta * tdm_lsfQ_PCh[i] + ( 1.0f - beta ) * lsf_mean[i]; + } + + return; +} + + +/*-------------------------------------------------------------------* + * tdm_SCh_LSF_intra_pred_tri_diag_mat() + * + * + *-------------------------------------------------------------------*/ + +static void tdm_SCh_LSF_intra_pred_tri_diag_mat( + float *lsf_SCh, /* i/o: secondary channel LSFs */ + const float *lsf_mean_in, /* i : secondary channel mean LSFs (in) */ + const float *lsf_mean_out, /* i : secondary channel mean LSFs (out) */ + const float *prd_diag_3 /* i : secondary channel mean LSFs */ +) +{ + int16_t i; + float lsf_tmp[M]; + const float *prd_ptr; + float *lsf_tmp_ptr1; + float *lsf_tmp_ptr2; + float *lsf_SCh_ptr; + + prd_ptr = prd_diag_3; + + v_sub( lsf_SCh, lsf_mean_in, lsf_tmp, M ); + + lsf_tmp_ptr1 = lsf_tmp; + lsf_SCh_ptr = lsf_SCh; + + lsf_tmp_ptr2 = lsf_tmp_ptr1; + *lsf_SCh_ptr = ( *lsf_tmp_ptr1++ ) * ( *prd_ptr++ ); + ( *lsf_SCh_ptr++ ) += ( *lsf_tmp_ptr1 ) * ( *prd_ptr++ ); + + for ( i = 1; i < M - 1; i++ ) + { + lsf_tmp_ptr1 = lsf_tmp_ptr2; + *lsf_SCh_ptr = ( *lsf_tmp_ptr1++ ) * ( *prd_ptr++ ); + lsf_tmp_ptr2 = lsf_tmp_ptr1; + *lsf_SCh_ptr += ( *lsf_tmp_ptr1++ ) * ( *prd_ptr++ ); + ( *lsf_SCh_ptr++ ) += ( *lsf_tmp_ptr1 ) * ( *prd_ptr++ ); + } + + lsf_tmp_ptr1 = lsf_tmp_ptr2; + *lsf_SCh_ptr = ( *lsf_tmp_ptr1++ ) * ( *prd_ptr++ ); + *lsf_SCh_ptr += ( *lsf_tmp_ptr1 ) * ( *prd_ptr ); + + v_add( lsf_SCh, lsf_mean_out, lsf_SCh, M ); + + return; +} + + +/*-------------------------------------------------------------------* + * tdm_SCh_LSF_intra_pred() + * + * + *-------------------------------------------------------------------*/ + +void tdm_SCh_LSF_intra_pred( + const int32_t element_brate, /* i : element bitrate */ + const float *tdm_lsfQ_PCh, /* i : primary channel LSFs */ + float *pred_lsf_SCh /* o : predicted secondary channel LSFs */ +) +{ + float fixed_beta; + + if ( element_brate <= IVAS_13k2 ) + { + fixed_beta = 0.87F; + } + else if ( element_brate <= IVAS_16k4 ) + { + fixed_beta = 0.94F; + } + else if ( element_brate <= IVAS_24k4 ) + { + fixed_beta = 0.91F; + } + else if ( element_brate <= IVAS_32k ) + { + fixed_beta = 0.92F; + } + else + { + fixed_beta = 0.91F; + } + + tdm_SCh_LSF_intra_pred_zero_bits( tdm_lsfQ_PCh, pred_lsf_SCh, tdm_LSF_MEAN_PRED_QNT, fixed_beta ); + + tdm_SCh_LSF_intra_pred_tri_diag_mat( pred_lsf_SCh, tdm_LSF_MEAN_PRED_QNT_IN, tdm_LSF_MEAN_PRED_QNT_OUT, tdm_PRED_QNT_fixed_beta_prd_diag_3 ); + + return; +} + + +/*-------------------------------------------------------------------* + * tdm_SCh_LSF_intra_pred_one_bit_dec() + * + * + *-------------------------------------------------------------------*/ + +static void tdm_SCh_LSF_intra_pred_one_bit_dec( + const float *tdm_lsfQ_PCh, /* i : primary channel LSFs */ + float *pred_lsf_SCh, /* o : predicted secondary channel LSFs */ + const float *lsf_mean, /* i : secondary channel mean LSFs */ + const float *Beta_Q_x, /* i : beta quantization values */ + const int16_t beta_index /* i : the quantization bits for beta (-1 if beta fixed)*/ +) +{ + int16_t i; + float beta; + + beta = Beta_Q_x[beta_index]; + + /* pulling the LSFs closer to the avergae */ + for ( i = 0; i < M; i++ ) + { + pred_lsf_SCh[i] = beta * tdm_lsfQ_PCh[i] + ( 1.0f - beta ) * lsf_mean[i]; + } + + return; +} + + +/*-------------------------------------------------------------------* + * tdm_SCh_LSF_intra_pred_one_bit_enc() + * + * + *-------------------------------------------------------------------*/ + +static void tdm_SCh_LSF_intra_pred_one_bit_enc( + const float *lsf_SCh, /* i : secondary channel LSFs */ + const float *tdm_lsfQ_PCh, /* i : primary channel LSFs */ + float *pred_lsf_SCh, /* o : predicted secondary channel LSFs */ + const float *lsf_mean, /* i : secondary channel mean LSFs */ + const float *lsf_wgts_new, /* i : Improved wgts for LSFs */ + const float *Beta_Q_x, /* i : beta quantization values */ + int16_t *beta_index /* o : the quantization bits for beta (-1 if beta fixed) */ +) +{ + int16_t i; + float A_temp[M]; + float B_temp[M]; + float WD[2]; + + for ( i = 0; i < M; i++ ) + { + A_temp[i] = lsf_SCh[i] - lsf_mean[i]; + B_temp[i] = lsf_mean[i] - tdm_lsfQ_PCh[i]; + } + + WD[0] = 0.f; + WD[1] = 0.f; + for ( i = 0; i < M; i++ ) + { + WD[0] += lsf_wgts_new[i] * SQR( A_temp[i] ) + 2.0f * Beta_Q_x[0] * lsf_wgts_new[i] * A_temp[i] * B_temp[i] + lsf_wgts_new[i] * SQR( Beta_Q_x[0] ) * SQR( B_temp[i] ); + WD[1] += lsf_wgts_new[i] * SQR( A_temp[i] ) + 2.0f * Beta_Q_x[1] * lsf_wgts_new[i] * A_temp[i] * B_temp[i] + lsf_wgts_new[i] * SQR( Beta_Q_x[1] ) * SQR( B_temp[i] ); + } + + if ( WD[0] < WD[1] ) + { + *beta_index = 0; + } + else + { + *beta_index = 1; + } + + tdm_SCh_LSF_intra_pred_one_bit_dec( tdm_lsfQ_PCh, pred_lsf_SCh, tdm_LSF_MEAN_RE_USE, Beta_Q_x, *beta_index ); + + return; +} + + +/*-------------------------------------------------------------------* + * tdm_SCh_lsf_reuse() + * + * + *-------------------------------------------------------------------*/ + +void tdm_SCh_lsf_reuse( + const int16_t enc_dec, /* i : encoder/decoder flag */ + const int32_t element_brate, /* i : element bitrate */ + float lsf_new[M], /* i/o: LSFs at the end of the frame */ + float lsp_new[M], /* i/o: LSPs at the end of the frame */ + const float tdm_lsfQ_PCh[M], /* i : primary channel LSFs */ + const float lsf_wgts[M], /* i : LSF weights */ + int16_t *beta_index /* i/o: quantization index */ +) +{ + const float *Beta_Q1bit_re_use; + + if ( element_brate <= IVAS_13k2 ) + { + Beta_Q1bit_re_use = tdm_Beta_Q1bit_re_use_13k2; + } + else if ( element_brate <= IVAS_16k4 ) + { + Beta_Q1bit_re_use = tdm_Beta_Q1bit_re_use_16k4; + } + else if ( element_brate <= IVAS_32k ) + { + Beta_Q1bit_re_use = tdm_Beta_Q1bit_re_use_24k4_32k; + } + else + { + Beta_Q1bit_re_use = tdm_Beta_Q1bit_re_use_48k; + } + + if ( enc_dec == ENC ) + { + tdm_SCh_LSF_intra_pred_one_bit_enc( lsf_new, tdm_lsfQ_PCh, lsf_new, tdm_LSF_MEAN_RE_USE, lsf_wgts, Beta_Q1bit_re_use, beta_index ); + } + else /* DEC */ + { + tdm_SCh_LSF_intra_pred_one_bit_dec( tdm_lsfQ_PCh, lsf_new, tdm_LSF_MEAN_RE_USE, Beta_Q1bit_re_use, *beta_index ); + } + + tdm_SCh_LSF_intra_pred_tri_diag_mat( lsf_new, tdm_LSF_MEAN_RE_USE_IN, tdm_LSF_MEAN_RE_USE_OUT, tdm_RE_USE_adaptive_beta_prd_diag_3 ); + + lsf2lsp( lsf_new, lsp_new, M, INT_FS_12k8 ); + + return; +} diff --git a/lib_com/ivas_td_decorr.c b/lib_com/ivas_td_decorr.c new file mode 100644 index 0000000000000000000000000000000000000000..12c4853bcfcd2e4c74c58c8ceac0e426cda6b632 --- /dev/null +++ b/lib_com/ivas_td_decorr.c @@ -0,0 +1,501 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "prot.h" +#include "ivas_prot.h" +#include "math.h" +#include +#include "wmc_auto.h" + + +/*------------------------------------------------------------------------------------------* + * Local constants + *------------------------------------------------------------------------------------------*/ + +static const float ivas_hadamard_decorr_APD_coeff[IVAS_APD_16_SECT][IVAS_APD_16_SECT] = { + { 0.4f, 0.4f, 0.4f, 0.4f, 0.4f, 0.4f, 0.4f, 0.4f, 0.4f, 0.4f, 0.4f, 0.4f, 0.4f, 0.4f, 0.4f, 0.4f }, + { 0.4f, -0.4f, 0.4f, -0.4f, 0.4f, -0.4f, 0.4f, -0.4f, 0.4f, -0.4f, 0.4f, -0.4f, 0.4f, -0.4f, 0.4f, -0.4f }, + { 0.4f, 0.4f, -0.4f, -0.4f, 0.4f, 0.4f, -0.4f, -0.4f, 0.4f, 0.4f, -0.4f, -0.4f, 0.4f, 0.4f, -0.4f, -0.4f }, + { 0.4f, -0.4f, -0.4f, 0.4f, 0.4f, -0.4f, -0.4f, 0.4f, 0.4f, -0.4f, -0.4f, 0.4f, 0.4f, -0.4f, -0.4f, 0.4f }, + { 0.4f, 0.4f, 0.4f, 0.4f, -0.4f, -0.4f, -0.4f, -0.4f, 0.4f, 0.4f, 0.4f, 0.4f, -0.4f, -0.4f, -0.4f, -0.4f }, + { 0.4f, -0.4f, 0.4f, -0.4f, -0.4f, 0.4f, -0.4f, 0.4f, 0.4f, -0.4f, 0.4f, -0.4f, -0.4f, 0.4f, -0.4f, 0.4f }, + { 0.4f, 0.4f, -0.4f, -0.4f, -0.4f, -0.4f, 0.4f, 0.4f, 0.4f, 0.4f, -0.4f, -0.4f, -0.4f, -0.4f, 0.4f, 0.4f }, + { 0.4f, -0.4f, -0.4f, 0.4f, -0.4f, 0.4f, 0.4f, -0.4f, 0.4f, -0.4f, -0.4f, 0.4f, -0.4f, 0.4f, 0.4f, -0.4f }, + { 0.4f, 0.4f, 0.4f, 0.4f, 0.4f, 0.4f, 0.4f, 0.4f, -0.4f, -0.4f, -0.4f, -0.4f, -0.4f, -0.4f, -0.4f, -0.4f }, + { 0.4f, -0.4f, 0.4f, -0.4f, 0.4f, -0.4f, 0.4f, -0.4f, -0.4f, 0.4f, -0.4f, 0.4f, -0.4f, 0.4f, -0.4f, 0.4f }, + { 0.4f, 0.4f, -0.4f, -0.4f, 0.4f, 0.4f, -0.4f, -0.4f, -0.4f, -0.4f, 0.4f, 0.4f, -0.4f, -0.4f, 0.4f, 0.4f }, + { 0.4f, -0.4f, -0.4f, 0.4f, 0.4f, -0.4f, -0.4f, 0.4f, -0.4f, 0.4f, 0.4f, -0.4f, -0.4f, 0.4f, 0.4f, -0.4f }, + { 0.4f, 0.4f, 0.4f, 0.4f, -0.4f, -0.4f, -0.4f, -0.4f, -0.4f, -0.4f, -0.4f, -0.4f, 0.4f, 0.4f, 0.4f, 0.4f }, + { 0.4f, -0.4f, 0.4f, -0.4f, -0.4f, 0.4f, -0.4f, 0.4f, -0.4f, 0.4f, -0.4f, 0.4f, 0.4f, -0.4f, 0.4f, -0.4f }, + { 0.4f, 0.4f, -0.4f, -0.4f, -0.4f, -0.4f, 0.4f, 0.4f, -0.4f, -0.4f, 0.4f, 0.4f, 0.4f, 0.4f, -0.4f, -0.4f }, + { 0.4f, -0.4f, -0.4f, 0.4f, -0.4f, 0.4f, 0.4f, -0.4f, -0.4f, 0.4f, 0.4f, -0.4f, 0.4f, -0.4f, -0.4f, 0.4f } +}; + +/* For R = 3.^([0:obj.parm_APD_nSections-1]/4); */ +static const float ivas_three_pow_frac[IVAS_MAX_DECORR_APD_SECTIONS] = { + 1.000000000000000f, + 1.316074013710022f, + 1.732050776481628f, + 2.279507160186768f, + 3.000000000000000f, + 3.948222038857480f, + 5.196152422706630f, + 6.838521170864330f, + 9.000000000000000f, + 11.84466611657240f, + 15.58845726811990f, + 20.51556351259300f, + 27.00000000000000f, + 35.53399834971730f, + 46.76537180435970f, + 61.54669053777900f, +}; + +#define IVAS_TDET_DUCK_MULT_FAC_PARA_BIN ( 2.0f ) +#define IVAS_TDET_DUCK_MULT_FAC_PARA_BIN_LOW_BR ( 3.0f ) + +/*------------------------------------------------------------------------------------------* + * Local functions declaration + *------------------------------------------------------------------------------------------*/ + +static int16_t ivas_get_APD_filt_orders( const int16_t num_out_chans, const int32_t output_Fs, int16_t *APD_filt_orders ); + +static void ivas_td_decorr_init( ivas_td_decorr_state_t *hTdDecorr, const int16_t num_out_chans, const int16_t ducking_flag ); + + +/*------------------------------------------------------------------------- + * ivas_td_decorr_reconfig_dec() + * + * Allocate and initialize time domain decorrelator handle + *------------------------------------------------------------------------*/ + +ivas_error ivas_td_decorr_reconfig_dec( + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const int32_t ivas_total_brate, /* i : total IVAS bitrate */ + const int16_t nchan_transport, /* i : number of transport channels */ + const int32_t output_Fs, /* i : output sampling rate */ + ivas_td_decorr_state_t **hTdDecorr, /* i/o: TD decorrelator handle */ + uint16_t *useTdDecorr /* i/o: TD decorrelator flag */ +) +{ + uint16_t useTdDecorr_new; + ivas_error error; + + useTdDecorr_new = 0; + if ( ivas_format == SBA_FORMAT || ivas_format == SBA_ISM_FORMAT ) + { + if ( nchan_transport == 1 ) + { + useTdDecorr_new = 1; + } + } + else if ( ivas_format == MASA_FORMAT ) + { + if ( ( ivas_total_brate < IVAS_48k && nchan_transport == 1 ) || ivas_total_brate < MASA_STEREO_MIN_BITRATE ) + { + useTdDecorr_new = 1; + } + } + else if ( ivas_format == MC_FORMAT ) + { + if ( ivas_total_brate < IVAS_48k && nchan_transport == 1 ) + { + useTdDecorr_new = 1; + } + } + + if ( *useTdDecorr != useTdDecorr_new ) + { + *useTdDecorr = useTdDecorr_new; + + if ( *useTdDecorr ) + { + if ( ivas_total_brate >= IVAS_13k2 && ( ivas_format == SBA_FORMAT || ivas_format == SBA_ISM_FORMAT ) ) + { + if ( *hTdDecorr == NULL ) + { + if ( ( error = ivas_td_decorr_dec_open( hTdDecorr, output_Fs, 3, 1 ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( ivas_total_brate < IVAS_24k4 ) + { + ( *hTdDecorr )->pTrans_det->duck_mult_fac = IVAS_TDET_DUCK_MULT_FAC_PARA_BIN_LOW_BR; + } + else + { + ( *hTdDecorr )->pTrans_det->duck_mult_fac = IVAS_TDET_DUCK_MULT_FAC_PARA_BIN; + } + } + else + { + if ( *hTdDecorr == NULL ) + { + if ( ( error = ivas_td_decorr_dec_open( hTdDecorr, output_Fs, 3, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + ivas_td_decorr_init( *hTdDecorr, 3, 0 ); + } + } + } + else + { + ivas_td_decorr_dec_close( hTdDecorr ); + } + } + + return IVAS_ERR_OK; +} + + +/*------------------------------------------------------------------------- + * ivas_td_decorr_dec_open() + * + * Allocate and initialize time domain decorrelator handle + *------------------------------------------------------------------------*/ + +ivas_error ivas_td_decorr_dec_open( + ivas_td_decorr_state_t **hTdDecorr, /* i/o: TD decorrelator handle */ + const int32_t output_Fs, /* i : output sampling rate */ + const int16_t nchan_internal, /* i : number of internal channels */ + const int16_t ducking_flag /* i : ducking flag */ +) +{ + int16_t i, j, len; + int16_t num_out_chans; + ivas_td_decorr_state_t *hTdDecorr_loc; + ivas_error error; + + num_out_chans = nchan_internal - 1; + + error = IVAS_ERR_OK; + + if ( ( hTdDecorr_loc = (ivas_td_decorr_state_t *) malloc( sizeof( ivas_td_decorr_state_t ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR COV decoder" ); + } + + if ( ( hTdDecorr_loc->look_ahead_buf = (float *) malloc( sizeof( float ) * (int16_t) ( output_Fs * IVAS_DECORR_PARM_LOOKAHEAD_TAU ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR COV decoder" ); + } + set_f( hTdDecorr_loc->look_ahead_buf, 0, (int16_t) ( output_Fs * IVAS_DECORR_PARM_LOOKAHEAD_TAU ) ); + hTdDecorr_loc->offset = (int16_t) ( output_Fs * IVAS_DECORR_PARM_LOOKAHEAD_TAU ); + hTdDecorr_loc->num_apd_sections = ivas_get_APD_filt_orders( num_out_chans, output_Fs, hTdDecorr_loc->APD_filt_state[0].order ); + + for ( j = 0; j < num_out_chans; j++ ) + { + for ( i = 0; i < hTdDecorr_loc->num_apd_sections; i++ ) + { + len = hTdDecorr_loc->APD_filt_state[0].order[i]; + + if ( ( hTdDecorr_loc->APD_filt_state[j].state[i] = (float *) malloc( sizeof( float ) * len ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR COV decoder" ); + } + + set_f( hTdDecorr_loc->APD_filt_state[j].state[i], 0, len ); + } + } + + ivas_td_decorr_init( hTdDecorr_loc, num_out_chans, ducking_flag ); + + if ( ducking_flag ) + { + if ( ( error = ivas_transient_det_open( &hTdDecorr_loc->pTrans_det, output_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + hTdDecorr_loc->pTrans_det = NULL; + } + + *hTdDecorr = hTdDecorr_loc; + + return error; +} + + +/*------------------------------------------------------------------------- + * ivas_td_decorr_dec_close() + * + * Deallocate time domain decorrelator handle + *------------------------------------------------------------------------*/ + +void ivas_td_decorr_dec_close( + ivas_td_decorr_state_t **hTdDecorr /* i/o: TD decorrelator handle */ +) +{ + int16_t i, j; + + if ( hTdDecorr == NULL || *hTdDecorr == NULL ) + { + return; + } + + free( ( *hTdDecorr )->look_ahead_buf ); + ( *hTdDecorr )->look_ahead_buf = NULL; + + for ( j = 0; j < ( *hTdDecorr )->num_apd_outputs; j++ ) + { + for ( i = 0; i < ( *hTdDecorr )->num_apd_sections; i++ ) + { + free( ( *hTdDecorr )->APD_filt_state[j].state[i] ); + ( *hTdDecorr )->APD_filt_state[j].state[i] = NULL; + } + } + + if ( ( *hTdDecorr )->pTrans_det != NULL ) + { + ivas_transient_det_close( &( *hTdDecorr )->pTrans_det ); + } + + free( ( *hTdDecorr ) ); + ( *hTdDecorr ) = NULL; + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_get_APD_filt_orders() + * + * Calculate the orders of the APD IIR filters and return num APD sections + *-----------------------------------------------------------------------------------------*/ + +static int16_t ivas_get_APD_filt_orders( + const int16_t num_out_chans, + const int32_t output_Fs, + int16_t *APD_filt_orders ) +{ + int16_t i; + int16_t num_apd_sections = 0; + float sum_R, R[IVAS_MAX_DECORR_APD_SECTIONS]; + + switch ( num_out_chans ) + { + case IVAS_TD_DECORR_OUT_1CH: + case IVAS_TD_DECORR_OUT_2CH: + num_apd_sections = IVAS_APD_2_SECT; + break; + case IVAS_TD_DECORR_OUT_3CH: + case IVAS_TD_DECORR_OUT_4CH: + num_apd_sections = IVAS_APD_4_SECT; + break; + case IVAS_TD_DECORR_OUT_5CH: + case IVAS_TD_DECORR_OUT_6CH: + case IVAS_TD_DECORR_OUT_7CH: + case IVAS_TD_DECORR_OUT_8CH: + num_apd_sections = IVAS_APD_8_SECT; + break; + default: + assert( !"Invalid num out chans" ); + break; + } + + sum_R = 0.0f; + for ( i = 0; i < num_apd_sections; i++ ) + { + R[i] = ivas_three_pow_frac[i]; + sum_R += R[i]; + } + + for ( i = 0; i < num_apd_sections; i++ ) + { + APD_filt_orders[i] = (int16_t) ceil( output_Fs * IVAS_DECORR_PARM_APD_TAU * R[i] / sum_R ); + } + + return num_apd_sections; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_td_decorr_init() + * + * TD decorr Initialisation function + *-----------------------------------------------------------------------------------------*/ + +static void ivas_td_decorr_init( + ivas_td_decorr_state_t *hTdDecorr, + const int16_t num_out_chans, + const int16_t ducking_flag ) +{ + int16_t i, j; + + hTdDecorr->ducking_flag = ducking_flag; + hTdDecorr->num_apd_outputs = num_out_chans; + + for ( i = 0; i < hTdDecorr->num_apd_outputs; i++ ) + { + for ( j = 0; j < hTdDecorr->num_apd_sections; j++ ) + { + hTdDecorr->APD_filt_state[i].order[j] = hTdDecorr->APD_filt_state[0].order[j]; + hTdDecorr->APD_filt_state[i].coeffs[j] = ivas_hadamard_decorr_APD_coeff[i][j]; + hTdDecorr->APD_filt_state[i].idx[j] = 0; + } + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_td_decorr_APD_iir_filter() + * + * APD IIR filter + *-----------------------------------------------------------------------------------------*/ + +void ivas_td_decorr_APD_iir_filter( + ivas_td_decorr_APD_filt_state_t *filter_state, + float *pIn_out, + const int16_t num_APD_sections, + const int16_t length ) +{ + int16_t i, k; + int16_t idx; + float *pIn = pIn_out; + float *pOut = pIn_out; + float tmp_pIn_buf_i; + + for ( k = 0; k < num_APD_sections; k++ ) + { + float *pFilt_state = filter_state->state[k]; + float filt_coeff = filter_state->coeffs[k]; + int16_t order = filter_state->order[k]; + + idx = filter_state->idx[k]; + + for ( i = 0; i < length; i++ ) + { + tmp_pIn_buf_i = pIn[i]; + + pOut[i] = pFilt_state[idx] + pIn[i] * filt_coeff; + + pFilt_state[idx++] = tmp_pIn_buf_i - filt_coeff * pOut[i]; + + if ( order == idx ) + { + idx = 0; + } + } + filter_state->idx[k] = idx; + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_td_decorr_APD_sections() + * + * TD decorr all pass delay sections + *-----------------------------------------------------------------------------------------*/ + +static void ivas_td_decorr_APD_sections( + ivas_td_decorr_state_t *hTdDecorr, + float **ppOut_pcm, + const int16_t output_frame ) +{ + int16_t i; + + for ( i = 0; i < hTdDecorr->num_apd_outputs; i++ ) + { + ivas_td_decorr_APD_iir_filter( &hTdDecorr->APD_filt_state[i], ppOut_pcm[i], hTdDecorr->num_apd_sections, output_frame ); + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_td_decorr_process() + * + * TD decorr process call + *-----------------------------------------------------------------------------------------*/ + +void ivas_td_decorr_process( + ivas_td_decorr_state_t *hTdDecorr, /* i/o: SPAR Covar. decoder handle */ + float *pcm_in[], /* i : input audio channels */ + float **ppOut_pcm, /* o : output audio channels */ + const int16_t output_frame /* i : output frame length */ +) +{ + int16_t i, j; + float in_duck_gain[L_FRAME48k], out_duck_gain[L_FRAME48k]; + + /* Look-ahead delay */ + mvr2r( pcm_in[0], ppOut_pcm[0], output_frame ); + delay_signal( ppOut_pcm[0], output_frame, hTdDecorr->look_ahead_buf, hTdDecorr->offset ); + + /* In ducking gains */ + if ( hTdDecorr->ducking_flag ) + { + ivas_td_decorr_get_ducking_gains( hTdDecorr->pTrans_det, pcm_in[0], in_duck_gain, out_duck_gain, output_frame, 0 ); + + for ( j = 0; j < output_frame; j++ ) + { + ppOut_pcm[0][j] = ppOut_pcm[0][j] * in_duck_gain[j]; + } + } + + for ( i = 1; i < hTdDecorr->num_apd_outputs; i++ ) + { + mvr2r( ppOut_pcm[0], ppOut_pcm[i], output_frame ); + } + + /* All pass delay section */ + ivas_td_decorr_APD_sections( hTdDecorr, ppOut_pcm, output_frame ); + + /* Out ducking gains */ + if ( hTdDecorr->ducking_flag ) + { + for ( i = 0; i < hTdDecorr->num_apd_outputs; i++ ) + { + for ( j = 0; j < output_frame; j++ ) + { + ppOut_pcm[i][j] = ppOut_pcm[i][j] * out_duck_gain[j]; + } + } + } + + return; +} diff --git a/lib_com/ivas_tools.c b/lib_com/ivas_tools.c new file mode 100644 index 0000000000000000000000000000000000000000..4e28892da362cd8c38dfeb1569b759c366158438 --- /dev/null +++ b/lib_com/ivas_tools.c @@ -0,0 +1,1245 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include "options.h" +#include +#include "prot.h" +#include "ivas_prot.h" +#include "wmc_auto.h" +#include "ivas_rom_com.h" + +/*--------------------------------------------------------------- + * sumAbs() + * + * sum of absolute values + * ---------------------------------------------------------------*/ + +/*! r: sum abs of all vector elements */ +float sumAbs( + const float *vec, /* i : input vector */ + const int16_t lvec /* i : length of input vector */ +) +{ + int16_t i; + float tmp; + + tmp = 0.0f; + for ( i = 0; i < lvec; i++ ) + { + tmp += fabsf( vec[i] ); + } + + return tmp; +} + +/*---------------------------------------------------------------------* + * mvc2c() + * + * Transfer the contents of vector x[] to vector y[] in char format + *---------------------------------------------------------------------*/ + +void mvc2c( + const uint8_t x[], /* i : input vector */ + uint8_t y[], /* o : output vector */ + const int16_t n /* i : vector size */ +) +{ + int16_t i; + + if ( n <= 0 ) + { + /* no need to transfer vectors with size 0 */ + return; + } + + if ( y < x ) + { + for ( i = 0; i < n; i++ ) + { + y[i] = x[i]; + } + } + else + { + for ( i = n - 1; i >= 0; i-- ) + { + y[i] = x[i]; + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * ivas_syn_output() + * + * Output ivas synthesis signal with compensation for saturation + * returns number of clipped samples + *-------------------------------------------------------------------*/ + +/*! r: number of clipped samples */ +uint32_t ivas_syn_output( + float *synth[], /* i/o: float synthesis signal */ + const int16_t output_frame, /* i : output frame length (one channel) */ + const int16_t n_channels, /* i : number of output channels */ + int16_t *synth_out /* o : integer 16 bits synthesis signal */ +) +{ + int16_t i, n; + int16_t synth_loc[MAX_JBM_L_FRAME48k]; + uint32_t noClipping = 0; + + /*-----------------------------------------------------------------* + * float to integer conversion with saturation control + *-----------------------------------------------------------------*/ + + for ( n = 0; n < n_channels; n++ ) + { + noClipping += mvr2s( synth[n], synth_loc, output_frame ); + + for ( i = 0; i < output_frame; i++ ) + { + synth_out[i * n_channels + n] = synth_loc[i]; + } + } + + return noClipping; +} + + +/*-------------------------------------------------------------------* + * ivas_syn_output_f() + * + * Output ivas synthesis signal with compensation for saturation + * returns number of clipped samples + *-------------------------------------------------------------------*/ + +/*! r: number of clipped samples */ +void ivas_syn_output_f( + float *synth[], /* i/o: float synthesis signal */ + const int16_t output_frame, /* i : output frame length (one channel) */ + const int16_t n_channels, /* i : number of output channels */ + float *synth_out /* o : integer 16 bits synthesis signal */ +) +{ + int16_t i, n; + + /*-----------------------------------------------------------------* + * float to integer conversion with saturation control + *-----------------------------------------------------------------*/ + + for ( n = 0; n < n_channels; n++ ) + { + for ( i = 0; i < output_frame; i++ ) + { + synth_out[i * n_channels + n] = synth[n][i]; + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * mvr2r_inc() + * + * + *-------------------------------------------------------------------*/ + +void mvr2r_inc( + const float x[], /* i : input vector */ + const int16_t x_inc, /* i : increment for vector x[] */ + float y[], /* o : output vector */ + const int16_t y_inc, /* i : increment for vector y[] */ + const int16_t n /* i : vector size */ +) +{ + int16_t i; + int16_t ix; + int16_t iy; + + if ( n <= 0 ) + { + /* cannot transfer vectors with size 0 */ + return; + } + + if ( y < x ) + { + ix = 0; + iy = 0; + for ( i = 0; i < n; i++ ) + { + y[iy] = x[ix]; + ix += x_inc; + iy += y_inc; + } + } + else + { + ix = ( n - 1 ) * x_inc; + iy = ( n - 1 ) * y_inc; + for ( i = n - 1; i >= 0; i-- ) + { + y[iy] = x[ix]; + ix -= x_inc; + iy -= y_inc; + } + } + + return; +} + +/*-------------------------------------------------------------------* + * v_add_inc() + * + * Addition of two vectors sample by sample with explicit increments + *-------------------------------------------------------------------*/ + +void v_add_inc( + const float x1[], /* i : Input vector 1 */ + const int16_t x_inc, /* i : Increment for input vector 1 */ + const float x2[], /* i : Input vector 2 */ + const int16_t x2_inc, /* i : Increment for input vector 2 */ + float y[], /* o : Output vector that contains vector 1 + vector 2 */ + const int16_t y_inc, /* i : increment for vector y[] */ + const int16_t N /* i : Vector length */ +) +{ + int16_t i; + int16_t ix1 = 0; + int16_t ix2 = 0; + int16_t iy = 0; + + for ( i = 0; i < N; i++ ) + { + y[iy] = x1[ix1] + x2[ix2]; + ix1 += x_inc; + ix2 += x2_inc; + iy += y_inc; + } + + return; +} + + +/*-------------------------------------------------------------------* + * v_mult_inc() + * + * Multiplication of two vectors with explicit increments + *-------------------------------------------------------------------*/ + +void v_mult_inc( + const float x1[], /* i : Input vector 1 */ + const int16_t x1_inc, /* i : Increment for input vector 1 */ + const float x2[], /* i : Input vector 2 */ + const int16_t x2_inc, /* i : Increment for input vector 1 */ + float y[], /* o : Output vector that contains vector 1 .* vector 2 */ + const int16_t y_inc, /* i : increment for vector y[i] */ + const int16_t N /* i : Vector length */ +) +{ + int16_t i; + int16_t ix1 = 0; + int16_t ix2 = 0; + int16_t iy = 0; + + for ( i = 0; i < N; i++ ) + { + y[iy] = x1[ix1] * x2[ix2]; + ix1 += x1_inc; + ix2 += x2_inc; + iy += y_inc; + } + + return; +} + +/*-------------------------------------------------------------------* + * v_addc() + * + * Addition of constant to vector + *-------------------------------------------------------------------*/ + +void v_addc( + const float x[], /* i : Input vector */ + const float c, /* i : Constant */ + float y[], /* o : Output vector that contains c*x */ + const int16_t N /* i : Vector length */ +) +{ + int16_t i; + + for ( i = 0; i < N; i++ ) + { + y[i] = c + x[i]; + } + + return; +} + +/*-------------------------------------------------------------------* + * v_min() + * + * minimum of two vectors + *-------------------------------------------------------------------*/ + +void v_min( + const float x1[], /* i : Input vector 1 */ + const float x2[], /* i : Input vector 2 */ + float y[], /* o : Output vector that contains vector 1 .* vector 2 */ + const int16_t N /* i : Vector length */ +) +{ + int16_t i; + + for ( i = 0; i < N; i++ ) + { + y[i] = ( x1[i] < x2[i] ) ? x1[i] : x2[i]; + } + + return; +} + + +/*-------------------------------------------------------------------* + * v_sqrt() + * + * square root of vector + *-------------------------------------------------------------------*/ + +void v_sqrt( + const float x[], /* i : Input vector */ + float y[], /* o : Output vector that contains sqrt(x) */ + const int16_t N /* i : Vector length */ +) +{ + int16_t i; + + for ( i = 0; i < N; i++ ) + { + y[i] = sqrtf( x[i] ); + } + + return; +} + + +/*-------------------------------------------------------------------* + * v_sub_s() + * + * Subtraction of two vectors + *-------------------------------------------------------------------*/ + +void v_sub_s( + const int16_t x1[], /* i : Input vector 1 */ + const int16_t x2[], /* i : Input vector 2 */ + int16_t y[], /* o : Output vector that contains vector 1 - vector 2 */ + const int16_t N /* i : Vector length */ +) +{ + int16_t i; + + for ( i = 0; i < N; i++ ) + { + y[i] = x1[i] - x2[i]; + } + + return; +} + + +/*---------------------------------------------------------------------* + * dot_product_cholesky() + * + * Calculates dot product of type x'*A*A'*x, where x is column vector of size m, + * and A is a Cholesky decomposition of some Hermitian matrix S whose size is m*m. + * Therefore, S=A*A' where A is upper triangular matrix of size (m*m+m)/2 (zeros ommitted, column-wise) + *---------------------------------------------------------------------*/ + +/*! r: the dot product x'*A*A'*x */ +float dot_product_cholesky( + const float *x, /* i : vector x */ + const float *A, /* i : Cholesky matrix A */ + const int16_t N /* i : vector & matrix size */ +) +{ + int16_t i, j; + float suma, tmp_sum; + const float *pt_x, *pt_A; + + pt_A = A; + suma = 0; + + for ( i = 0; i < N; i++ ) + { + tmp_sum = 0; + pt_x = x; + for ( j = 0; j <= i; j++ ) + { + tmp_sum += *pt_x++ * *pt_A++; + } + + suma += tmp_sum * tmp_sum; + } + + return suma; +} + +/*---------------------------------------------------------------------* + * v_mult_mat() + * + * Multiplication of row vector x by matrix A, where x has size Nr and + * A has size Nr x Nc ans it is stored column-wise in memory. + * The resulting row vector y has size Nc + *---------------------------------------------------------------------*/ + +void v_mult_mat( + float *y, /* o : the product x*A */ + const float *x, /* i : vector x */ + const float *A, /* i : matrix A */ + const int16_t Nr, /* i : number of rows */ + const int16_t Nc /* i : number of columns */ +) +{ + int16_t i, j; + const float *pt_x, *pt_A; + float tmp_y[MAX_V_MULT_MAT]; + float *pt_y; + + pt_y = tmp_y; + pt_A = A; + for ( i = 0; i < Nc; i++ ) + { + pt_x = x; + *pt_y = 0; + for ( j = 0; j < Nr; j++ ) + { + *pt_y += ( *pt_x++ ) * ( *pt_A++ ); + } + pt_y++; + } + + mvr2r( tmp_y, y, Nc ); + + return; +} + + +/*---------------------------------------------------------------------* + * logsumexp() + * + * Compute logarithm of the sum of exponentials of input vector in a numerically stable way + *---------------------------------------------------------------------*/ + +/*! r: log(sum(exp(x)) of the input array x */ +float logsumexp( + const float x[], /* i : input array x */ + const int16_t N /* i : number of elements in array x */ +) +{ + float max_exp; + float sum; + int16_t i; + + max_exp = x[0]; + sum = 0; + for ( i = 1; i < N; i++ ) + { + if ( x[i] > max_exp ) + { + max_exp = x[i]; + } + } + + for ( i = 0; i < N; i++ ) + { + sum += expf( x[i] - max_exp ); + } + + return logf( sum ) + max_exp; +} + + +/*---------------------------------------------------------------------* + * lin_interp() + * + * Linearly maps x from source range to the target range + *---------------------------------------------------------------------*/ + +/*! r: mapped output value */ +float lin_interp( + const float x, /* i : the value to be mapped */ + const float x1, /* i : source range interval: low end */ + const float y1, /* i : source range interval: high end */ + const float x2, /* i : target range interval: low */ + const float y2, /* i : target range interval: high */ + const int16_t flag_sat /* i : flag to indicate whether to apply saturation */ +) +{ + if ( x2 - x1 == 0 ) + { + return y1; + } + else if ( flag_sat ) + { + if ( x >= max( x1, x2 ) ) + { + return x1 > x2 ? y1 : y2; + } + else if ( x <= min( x1, x2 ) ) + { + return x1 < x2 ? y1 : y2; + } + } + + return y1 + ( x - x1 ) * ( y2 - y1 ) / ( x2 - x1 ); +} + + +/*-------------------------------------------------------------------* + * check_bounds() + * + * Ensure the input value is within the given limits + *-------------------------------------------------------------------*/ + +/*! r: Adjusted value */ +float check_bounds( + const float value, /* i : Input value */ + const float low, /* i : Low limit */ + const float high /* i : High limit */ +) +{ + float value_adj; + + value_adj = min( max( value, low ), high ); + + return value_adj; +} + + +/*-------------------------------------------------------------------* + * check_bounds_s() + * + * Ensure the input value is within the given limits + *-------------------------------------------------------------------*/ + +/*! r: Adjusted value */ +int16_t check_bounds_s( + const int16_t value, /* i : Input value */ + const int16_t low, /* i : Low limit */ + const int16_t high /* i : High limit */ +) +{ + int16_t value_adj; + + value_adj = min( max( value, low ), high ); + + return value_adj; +} + + +/****************************************************************************/ +/* matrix functions */ +/* matrices are ordered column-wise in memory */ +/****************************************************************************/ + +/*---------------------------------------------------------------------* + * matrix product + * + * comput the matrix product of two matrices (Z=X*Y) + *---------------------------------------------------------------------*/ + +/*! r: success or failure */ +int16_t matrix_product( + const float *X, /* i : left hand matrix */ + const int16_t rowsX, /* i : number of rows of the left hand matrix */ + const int16_t colsX, /* i : number of columns of the left hand matrix */ + const int16_t transpX, /* i : flag indicating the transposition of the left hand matrix prior to the multiplication */ + const float *Y, /* i : right hand matrix */ + const int16_t rowsY, /* i : number of rows of the right hand matrix */ + const int16_t colsY, /* i : number of columns of the right hand matrix */ + const int16_t transpY, /* i : flag indicating the transposition of the right hand matrix prior to the multiplication */ + float *Z /* o : resulting matrix after the matrix multiplication */ +) +{ + int16_t i, j, k; + float *Zp = Z; + + /* Processing */ + if ( transpX == 1 && transpY == 0 ) /* We use X transpose */ + { + if ( rowsX != rowsY ) + { + return EXIT_FAILURE; + } + for ( j = 0; j < colsY; ++j ) + { + for ( i = 0; i < colsX; ++i ) + { + ( *Zp ) = 0.0f; + for ( k = 0; k < rowsX; ++k ) + { + ( *Zp ) += X[k + i * rowsX] * Y[k + j * rowsY]; + } + Zp++; + } + } + } + else if ( transpX == 0 && transpY == 1 ) /* We use Y transpose */ + { + if ( colsX != colsY ) + { + return EXIT_FAILURE; + } + for ( j = 0; j < rowsY; ++j ) + { + for ( i = 0; i < rowsX; ++i ) + { + ( *Zp ) = 0.0f; + for ( k = 0; k < colsX; ++k ) + { + ( *Zp ) += X[i + k * rowsX] * Y[j + k * rowsY]; + } + Zp++; + } + } + } + else if ( transpX == 1 && transpY == 1 ) /* We use both transpose */ + { + if ( rowsX != colsY ) + { + return EXIT_FAILURE; + } + for ( j = 0; j < rowsY; ++j ) + { + for ( i = 0; i < colsX; ++i ) + { + ( *Zp ) = 0.0f; + for ( k = 0; k < colsX; ++k ) + { + ( *Zp ) += X[k + i * rowsX] * Y[j + k * rowsY]; + } + + Zp++; + } + } + } + else /* Regular case */ + { + if ( colsX != rowsY ) + { + return EXIT_FAILURE; + } + + for ( j = 0; j < colsY; ++j ) + { + for ( i = 0; i < rowsX; ++i ) + { + ( *Zp ) = 0.0f; + for ( k = 0; k < colsX; ++k ) + { + ( *Zp ) += X[i + k * rowsX] * Y[k + j * rowsY]; + } + Zp++; + } + } + } + + return EXIT_SUCCESS; +} + + +/*---------------------------------------------------------------------* + * matrix_diag_product + * + * compute the product of a matrix with a diagonal of a matrix (Z=X*diag(Y)) + *---------------------------------------------------------------------*/ + +/*! r: success or failure */ +int16_t matrix_diag_product( + const float *X, /* i : left hand matrix */ + const int16_t rowsX, /* i : number of rows of the left hand matrix */ + const int16_t colsX, /* i : number of columns of the left hand matrix */ + const int16_t transpX, /* i : flag indicating the transposition of the left hand matrix prior to the multiplication */ + const float *Y, /* i : right hand diagonal matrix as vector containing the diagonal elements */ + const int16_t entriesY, /* i : number of entries in the diagonal */ + float *Z /* o : resulting matrix after the matrix multiplication */ +) +{ + int16_t i, j; + float *Zp = Z; + + /* Processing */ + if ( transpX == 1 ) /* We use X transpose */ + { + if ( rowsX != entriesY ) + { + return EXIT_FAILURE; + } + for ( j = 0; j < entriesY; ++j ) + { + for ( i = 0; i < colsX; ++i ) + { + *( Zp++ ) = X[j + i * rowsX] * Y[j]; + } + } + } + else /* Regular case */ + { + if ( colsX != entriesY ) + { + return EXIT_FAILURE; + } + + for ( j = 0; j < entriesY; ++j ) + { + for ( i = 0; i < rowsX; ++i ) + { + *( Zp++ ) = *( X++ ) * Y[j]; + } + } + } + + return EXIT_SUCCESS; +} + +/*---------------------------------------------------------------------* + * diag_matrix_product() + * + * compute the matrix product of a diagonal matrix X with a full matrix Y (Z=diag(Y)*X) + *---------------------------------------------------------------------*/ + +/*! r: success or failure */ +int16_t diag_matrix_product( + const float *Y, /* i : left hand diagonal matrix as vector containing the diagonal elements */ + const int16_t entriesY, /* i : length of the diagonal of the left hand matrix */ + const float *X, /* i : right hand matrix */ + const int16_t rowsX, /* i : number of rows of the right hand matrix */ + const int16_t colsX, /* i : number of columns of the right hand matrix */ + const int16_t transpX, /* i : flag indicating the transposition of the right hand matrix prior to the multiplication */ + float *Z /* o : resulting matrix after the matrix multiplication */ +) +{ + int16_t i, j; + float *Zp = Z; + + /* Processing */ + if ( transpX == 1 ) /* We use X transpose */ + { + if ( colsX != entriesY ) + { + return EXIT_FAILURE; + } + for ( i = 0; i < rowsX; ++i ) + { + for ( j = 0; j < entriesY; ++j ) + { + *( Zp++ ) = X[i + j * rowsX] * Y[j]; + } + } + } + else /* Regular case */ + { + if ( rowsX != entriesY ) + { + return EXIT_FAILURE; + } + for ( i = 0; i < colsX; ++i ) + { + for ( j = 0; j < entriesY; ++j ) + { + *( Zp++ ) = *( X++ ) * Y[j]; + } + } + } + + return EXIT_SUCCESS; +} + + +/*---------------------------------------------------------------------* + * matrix_product_diag() + * + * compute only the main diagonal of X*Y (Z=diag(X*Y)) + *---------------------------------------------------------------------*/ + +/*! r: success or failure */ +int16_t matrix_product_diag( + const float *X, /* i : left hand matrix */ + const int16_t rowsX, /* i : number of rows of the left hand matrix */ + const int16_t colsX, /* i : number of columns of the left hand matrix */ + const int16_t transpX, /* i : flag indicating the transposition of the left hand matrix prior to the multiplication */ + const float *Y, /* i : right hand matrix */ + const int16_t rowsY, /* i : number of rows of the right hand matrix */ + const int16_t colsY, /* i : number of columns of the right hand matrix */ + const int16_t transpY, /* i : flag indicating the transposition of the right hand matrix prior to the multiplication */ + float *Z /* o : resulting matrix after the matrix multiplication */ +) +{ + int16_t j, k; + float *Zp = Z; + + /* Processing */ + if ( transpX == 1 && transpY == 0 ) /* We use X transpose */ + { + if ( rowsX != rowsY ) + { + return EXIT_FAILURE; + } + + for ( j = 0; j < colsY; ++j ) + { + ( *Zp ) = 0.0f; + for ( k = 0; k < rowsX; ++k ) + { + ( *Zp ) += X[k + j * rowsX] * Y[k + j * rowsY]; + } + Zp++; + } + } + else if ( transpX == 0 && transpY == 1 ) /* We use Y transpose */ + { + if ( colsX != colsY ) + { + return EXIT_FAILURE; + } + for ( j = 0; j < rowsY; ++j ) + { + ( *Zp ) = 0.0f; + for ( k = 0; k < colsX; ++k ) + { + ( *Zp ) += X[j + k * rowsX] * Y[j + k * rowsY]; + } + Zp++; + } + } + else if ( transpX == 1 && transpY == 1 ) /* We use both transpose */ + { + if ( rowsX != colsY ) + { + return EXIT_FAILURE; + } + + for ( j = 0; j < rowsY; ++j ) + { + + ( *Zp ) = 0.0f; + for ( k = 0; k < colsX; ++k ) + { + ( *Zp ) += X[k + j * rowsX] * Y[j + k * rowsY]; + } + + Zp++; + } + } + else /* Regular case */ + { + if ( colsX != rowsY ) + { + return EXIT_FAILURE; + } + + for ( j = 0; j < colsY; ++j ) + { + ( *Zp ) = 0.0f; + for ( k = 0; k < colsX; ++k ) + { + ( *Zp ) += X[j + k * rowsX] * Y[k + j * rowsY]; + } + Zp++; + } + } + + return EXIT_SUCCESS; +} + + +/*---------------------------------------------------------------------* + * cmplx_matrix_square() + * + * compute the square of a complex matrix (Z=X*X) + *---------------------------------------------------------------------*/ + +/*! r: success or failure */ +void cmplx_matrix_square( + const float *realX, /* i : real part of the matrix */ + const float *imagX, /* i : imaginary part of the matrix */ + const int16_t mRows, /* i : number of rows of the matrix */ + const int16_t nCols, /* i : number of columns of the matrix */ + float *realZ, /* o : real part of the resulting matrix */ + float *imagZ /* o : imaginary part of the resulting matrix */ +) +{ + int16_t i, j, k; + float *realZp, *imagZp; + const float *p_real1, *p_real2, *p_imag1, *p_imag2; + + /* resulting matrix is hermitean, we only need to calc the upper triangle */ + /* we assume transposition needed */ + + /* column*column = column/column */ + for ( i = 0; i < nCols; i++ ) + { + for ( j = i; j < nCols; j++ ) + { + p_real1 = realX + i * mRows; + p_imag1 = imagX + i * mRows; + p_real2 = realX + j * mRows; + p_imag2 = imagX + j * mRows; + realZp = realZ + ( i + nCols * j ); + imagZp = imagZ + ( i + nCols * j ); + *( realZp ) = 0.0f; + *( imagZp ) = 0.0f; + + for ( k = 0; k < mRows; k++ ) + { + *( imagZp ) += *( p_real1 ) * ( *( p_imag2 ) ) - ( *( p_real2 ) ) * ( *( p_imag1 ) ); + *( realZp ) += *( p_real1++ ) * ( *( p_real2++ ) ) + *( p_imag1++ ) * ( *( p_imag2++ ) ); + } + } + } + + /* fill lower triangle */ + for ( i = 1; i < nCols; i++ ) + { + for ( j = 0; j < i; j++ ) + { + realZ[i + nCols * j] = realZ[j + nCols * i]; + imagZ[i + nCols * j] = imagZ[j + nCols * i]; + } + } + + return; +} + +/*-------------------------------------------------------------------* + * v_multc_acc() + * + * Multiplication of vector by constant, accumulate to the output + *-------------------------------------------------------------------*/ + +void v_multc_acc( + const float x[], /* i : Input vector */ + const float c, /* i : Constant */ + float y[], /* o : Output vector that contains y + c*x */ + const int16_t N /* i : Vector length */ +) +{ + int16_t i; + + for ( i = 0; i < N; i++ ) + { + y[i] += c * x[i]; + } + + return; +} + +/*---------------------------------------------------------------------* + * lls_interp_n() + * + * Linear least squares interpolation of an input vector + * The function calculates the slope 'a' and the offset 'b' of a LLS estimate for an input vector x such that + * y_i = a*i + b where i=1,..,N and (a,b) = min(a,b) [sum_N[(y_i - x_i)^2]] + * the interpolated vector is return as x[], if requested + *---------------------------------------------------------------------*/ + + +void lls_interp_n( + float x[], /* i/o: input/output vector */ + const int16_t N, /* i : length of the input vector */ + float *a, /* o : calculated slope */ + float *b, /* o : calculated offset */ + const int16_t upd /* i : use 1 to update x[] with the interpolated output */ +) +{ + int16_t i; + const float n_i[11] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; + const float one_by_n[11] = { 0, 1, 0.5f, 0.333f, 0.25f, 0.2f, 0.1666f, 0.14286f, 0.125f, 0.111111f, 0.1f }; + const float sum_i[12] = { 0, 0, 1, 3, 6, 10, 15, 21, 28, 36, 45, 55 }; + const float sum_ii[12] = { 0, 0, 1, 5, 14, 30, 55, 91, 140, 204, 285, 385 }; + float sum_x, sum_ix, slope, offset; + + assert( N > 0 && N <= 10 ); + + sum_x = sum_f( x, N ); + sum_ix = dotp( x, n_i, N ); + + slope = ( N * sum_ix - sum_i[N] * sum_x ) / ( N * sum_ii[N] - sum_i[N] * sum_i[N] ); + offset = ( sum_x - slope * sum_i[N] ) * one_by_n[N]; + + if ( upd ) + { + for ( i = 0; i < N; i++ ) + { + x[i] = slope * i + offset; + } + } + + if ( a != NULL ) + { + *a = slope; + } + + if ( b != NULL ) + { + *b = offset; + } + + return; +} + +/* helper function for panning_wrap_angles */ +static float wrap_azi( + const float azi_deg ) +{ + float azi = azi_deg; + + /* Wrap azimuth value */ + while ( azi > 180 ) + { + azi -= 360.0f; + } + + while ( azi <= -180 ) + { + azi += 360; + } + + return azi; +} + +/*-------------------------------------------------------------------* + * panning_wrap_angles() + * + * Wrap angles for amplitude panning to the range: + * azimuth = (-180, 180] + * elevation = [-90, 90] + * Considers direction changes from large elevation values + *-------------------------------------------------------------------*/ +void panning_wrap_angles( + const float azi_deg, /* i : azimuth in degrees for panning direction (positive left) */ + const float ele_deg, /* i : elevation in degrees for panning direction (positive up) */ + float *azi_wrapped, /* o : wrapped azimuth component */ + float *ele_wrapped /* o : wrapped elevation component */ +) +{ + float azi, ele; + + azi = azi_deg; + ele = ele_deg; + + if ( fabsf( ele ) < 90 ) + { + *ele_wrapped = ele; + *azi_wrapped = wrap_azi( azi ); + return; + } + else + { + /* Special case when elevation is a multiple of 90; azimuth is irrelevant */ + if ( ( fmodf( ele, 90 ) == 0 ) && ( fmodf( ele, 180 ) != 0 ) ) + { + *azi_wrapped = 0; + while ( ele > 90 ) + { + ele -= 360; + } + while ( ele < -90 ) + { + ele += 360; + } + *ele_wrapped = ele; + } + else + { + /* Wrap elevation and adjust azimuth accordingly */ + while ( fabsf( ele ) > 90 ) + { + /* Flip to other hemisphere */ + azi += 180; + + /* Compensate elevation accordingly */ + if ( ele > 90 ) + { + ele = 180 - ele; + } + else if ( ele < -90 ) + { + ele = -180 - ele; + } + } + *azi_wrapped = wrap_azi( azi ); + *ele_wrapped = ele; + } + + return; + } +} + +/*-------------------------------------------------------------------------* + * v_sort_ind() + * + * Sort a float array + * (modified version of v_sort() to return an index array) + *-------------------------------------------------------------------------*/ + +void v_sort_ind( + float *x, /* i/o: Vector to be sorted */ + int16_t *idx, /* o : Original index positions */ + const int16_t len /* i : vector length */ +) +{ + int16_t i, j; + float tempr; + int16_t tempi; + + for ( i = 0; i < len; i++ ) + { + idx[i] = i; + } + + for ( i = len - 2; i >= 0; i-- ) + { + tempr = x[i]; + tempi = idx[i]; + for ( j = i + 1; ( j < len ) && ( tempr > x[j] ); j++ ) + { + x[j - 1] = x[j]; + idx[j - 1] = idx[j]; + } + x[j - 1] = tempr; + idx[j - 1] = tempi; + } + + return; +} + + +/*-------------------------------------------------------------------* + * is_IVAS_bitrate() + * + * check if the bitrate is IVAS supported active bitrate + *-------------------------------------------------------------------*/ + +/*! r: flag indicating a valid bitrate */ +int16_t is_IVAS_bitrate( + const int32_t ivas_total_brate /* i : IVAS total bitrate */ +) +{ + int16_t j; + + j = SIZE_IVAS_BRATE_TBL - IVAS_NUM_ACTIVE_BRATES; /* skip NO_DATA and SID bitrates */ + while ( j < SIZE_IVAS_BRATE_TBL && ivas_total_brate != ivas_brate_tbl[j] ) + { + j++; + } + + if ( j >= SIZE_IVAS_BRATE_TBL ) + { + return 0; + } + + return 1; +} + + +/*-------------------------------------------------------------------* + * is_DTXrate() + * + * identify DTX frame bitrates + *-------------------------------------------------------------------*/ + +int16_t is_DTXrate( + const int32_t ivas_total_brate /* i : IVAS total bitrate */ +) +{ + int16_t dtx_rate_flag = 0; + + if ( is_SIDrate( ivas_total_brate ) || ( ivas_total_brate == FRAME_NO_DATA ) ) + { + dtx_rate_flag = 1; + } + + return dtx_rate_flag; +} + +/*-------------------------------------------------------------------* + * is_SIDrate() + * + * identify SID frame bitrates + *-------------------------------------------------------------------*/ + +int16_t is_SIDrate( + const int32_t ivas_total_brate /* i : IVAS total bitrate */ +) +{ + int16_t sid_rate_flag = 0; + + if ( ( ivas_total_brate == SID_1k75 ) || + ( ivas_total_brate == SID_2k40 ) || + ( ivas_total_brate == IVAS_SID_5k2 ) ) + { + sid_rate_flag = 1; + } + + return sid_rate_flag; +} + + +/*-------------------------------------------------------------------* + * rand_triangular_signed() + * + * generate a random value with a triangular pdf in [-0.5, 0.5] + *-------------------------------------------------------------------*/ + +float rand_triangular_signed( + int16_t *seed ) +{ + float rand_val; + + rand_val = own_random( seed ) * OUTMAX_INV; + if ( rand_val <= 0.0f ) + { + /* rand_val in [-1, 0] */ + return 0.5f * sqrtf( rand_val + 1.0f ) - 0.5f; + } + else + { + /* rand_val in (0, 1) */ + return 0.5f - 0.5f * sqrtf( 1.0f - rand_val ); + } +} diff --git a/lib_com/ivas_transient_det.c b/lib_com/ivas_transient_det.c new file mode 100644 index 0000000000000000000000000000000000000000..7e38f8ce6788a08cb1980984e546c4f32325ce66 --- /dev/null +++ b/lib_com/ivas_transient_det.c @@ -0,0 +1,342 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "math.h" +#include "wmc_auto.h" +#include "prot.h" +#include "ivas_cnst.h" +#include "ivas_prot.h" +#include "ivas_stat_com.h" + +/*------------------------------------------------------------------------------------------* + * Local constants + *------------------------------------------------------------------------------------------*/ + +#define IVAS_TDET_PARM_ENV_EPS ( 1e-5f ) +#define IVAS_TDET_DUCK_MULT_FAC ( 1.1f ) +#define IVAS_TDET_PARM_TRANS_THR ( 0.1f ) +#define IVAS_TDET_ONLY ( 1 ) + +/*env_hpf*/ +#define IVAS_C_HPF_48k ( 0.675231906655777f ) +#define IVAS_C_HPF_32k ( 0.554854910159853f ) +#define IVAS_C_HPF_16k ( 0.307863971328499f ) + +/*env_fast*/ +#define IVAS_C_FAST_48k ( 0.995842001845110f ) +#define IVAS_C_FAST_32k ( 0.993769490623395f ) +#define IVAS_C_FAST_16k ( 0.987577800493881f ) + +/*env_slow*/ +#define IVAS_C_SLOW_48k ( 0.999739617238810f ) +#define IVAS_C_SLOW_32k ( 0.999609451284012f ) +#define IVAS_C_SLOW_16k ( 0.999219055096324f ) + +/*induck*/ +#define IVAS_C_IN_DUCK_48k ( 0.999583420126834f ) +#define IVAS_C_IN_DUCK_32k ( 0.999375195271816f ) +#define IVAS_C_IN_DUCK_16k ( 0.998750780924581f ) + +/*outduck*/ +#define IVAS_C_OUT_DUCK_48k ( 0.999583420126834f ) +#define IVAS_C_OUT_DUCK_32k ( 0.999375195271816f ) +#define IVAS_C_OUT_DUCK_16k ( 0.998750780924581f ) + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_transient_det_init() + * + * Trans det init fucntion + *-----------------------------------------------------------------------------------------*/ + +static void ivas_transient_det_init( + ivas_trans_det_state_t *hTranDet, /* i/o: Transient detector handle */ + const int32_t sampling_rate /* i : sampling rate */ +) +{ + int16_t i; + float filt_coeff_arr[3][IVAS_BIQUAD_FILT_LEN << 1]; + + hTranDet->in_duck_gain = 1.0f; + hTranDet->out_duck_gain = 1.0f; + + for ( i = 0; i < 3; i++ ) + { + set_zero( filt_coeff_arr[i], IVAS_BIQUAD_FILT_LEN << 1 ); + } + + switch ( sampling_rate ) + { + case 48000: + /*env_hpf*/ + filt_coeff_arr[0][0] = IVAS_C_HPF_48k; + filt_coeff_arr[0][1] = -IVAS_C_HPF_48k; + filt_coeff_arr[0][3] = 1.0f; + filt_coeff_arr[0][4] = -IVAS_C_HPF_48k; + /*env_fast*/ + filt_coeff_arr[1][0] = 1.0f - IVAS_C_FAST_48k; + filt_coeff_arr[1][3] = 1.0f; + filt_coeff_arr[1][4] = -IVAS_C_FAST_48k; + /*env_slow*/ + filt_coeff_arr[2][0] = 1.0f - IVAS_C_SLOW_48k; + filt_coeff_arr[2][3] = 1.0f; + filt_coeff_arr[2][4] = -IVAS_C_SLOW_48k; + hTranDet->in_duck_coeff = IVAS_C_IN_DUCK_48k; + hTranDet->out_duck_coeff = IVAS_C_OUT_DUCK_48k; + break; + case 32000: + /*env_hpf*/ + filt_coeff_arr[0][0] = IVAS_C_HPF_32k; + filt_coeff_arr[0][1] = -IVAS_C_HPF_32k; + filt_coeff_arr[0][3] = 1.0f; + filt_coeff_arr[0][4] = -IVAS_C_HPF_32k; + /*env_fast*/ + filt_coeff_arr[1][0] = 1.0f - IVAS_C_FAST_32k; + filt_coeff_arr[1][3] = 1.0f; + filt_coeff_arr[1][4] = -IVAS_C_FAST_32k; + /*env_slow*/ + filt_coeff_arr[2][0] = 1.0f - IVAS_C_SLOW_32k; + filt_coeff_arr[2][3] = 1.0f; + filt_coeff_arr[2][4] = -IVAS_C_SLOW_32k; + hTranDet->in_duck_coeff = IVAS_C_IN_DUCK_32k; + hTranDet->out_duck_coeff = IVAS_C_OUT_DUCK_32k; + break; + case 16000: + /*env_hpf*/ + filt_coeff_arr[0][0] = IVAS_C_HPF_16k; + filt_coeff_arr[0][1] = -IVAS_C_HPF_16k; + filt_coeff_arr[0][3] = 1.0f; + filt_coeff_arr[0][4] = -IVAS_C_HPF_16k; + /*env_fast*/ + filt_coeff_arr[1][0] = 1.0f - IVAS_C_FAST_16k; + filt_coeff_arr[1][3] = 1.0f; + filt_coeff_arr[1][4] = -IVAS_C_FAST_16k; + /*env_slow*/ + filt_coeff_arr[2][0] = 1.0f - IVAS_C_SLOW_16k; + filt_coeff_arr[2][3] = 1.0f; + filt_coeff_arr[2][4] = -IVAS_C_SLOW_16k; + hTranDet->in_duck_coeff = IVAS_C_IN_DUCK_16k; + hTranDet->out_duck_coeff = IVAS_C_OUT_DUCK_16k; + break; + } + + ivas_filters_init( &hTranDet->env_hpf, (const float *) filt_coeff_arr[0], IVAS_FILTER_ORDER_1 ); + ivas_filters_init( &hTranDet->env_fast, (const float *) filt_coeff_arr[1], IVAS_FILTER_ORDER_1 ); + ivas_filters_init( &hTranDet->env_slow, (const float *) filt_coeff_arr[2], IVAS_FILTER_ORDER_1 ); + + hTranDet->duck_mult_fac = IVAS_TDET_DUCK_MULT_FAC; + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_transient_det_open() + * + * Allocate and initialize SPAR TD handle + *------------------------------------------------------------------------*/ + +ivas_error ivas_transient_det_open( + ivas_trans_det_state_t **hTranDet_in, /* i/o: Transient detector handle */ + const int32_t sampling_rate /* i : sampling rate */ +) +{ + ivas_trans_det_state_t *hTranDet; + + if ( ( hTranDet = (ivas_trans_det_state_t *) malloc( sizeof( ivas_trans_det_state_t ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR TD\n" ); + } + + ivas_transient_det_init( hTranDet, sampling_rate ); + + *hTranDet_in = hTranDet; + + return IVAS_ERR_OK; +} + + +/*------------------------------------------------------------------------- + * ivas_transient_det_close() + * + * Deallocate and initialize Transient detector handle + *------------------------------------------------------------------------*/ + +void ivas_transient_det_close( + ivas_trans_det_state_t **hTranDet /* i/o: Transient detector handle */ +) +{ + if ( hTranDet == NULL || *hTranDet == NULL ) + { + return; + } + + free( *hTranDet ); + *hTranDet = NULL; + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_transient_det_process() + * + * Transient detection process call + *-----------------------------------------------------------------------------------------*/ + +void ivas_transient_det_process( + ivas_trans_det_state_t *hTranDet, /* i/o: SPAR TD handle */ + float *pIn_pcm, /* i : input audio channels */ + const int16_t frame_len, /* i : frame length in samples */ + int16_t transient_det[2] /* o : transient det outputs */ +) +{ + float in_duck_gain[L_FRAME48k]; + int16_t num_sf, sf, sf_samp, idx; + float mem = hTranDet->in_duck_gain; + + ivas_td_decorr_get_ducking_gains( hTranDet, pIn_pcm, in_duck_gain, NULL, frame_len, IVAS_TDET_ONLY ); + + transient_det[0] = 0; + transient_det[1] = 0; + if ( mem - hTranDet->in_duck_gain > IVAS_TDET_PARM_TRANS_THR ) + { + transient_det[0] = 1; + } + + num_sf = 16; + sf_samp = frame_len / num_sf; + for ( sf = 1; sf <= num_sf; sf++ ) + { + idx = ( sf_samp * sf ) - 1; + if ( ( mem - in_duck_gain[idx] ) > ( IVAS_TDET_PARM_TRANS_THR * 1.1f ) ) + { + transient_det[1] = 1; + } + mem = in_duck_gain[idx]; + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_calc_duck_gain() + * + * Calculate ducking gain utility + *-----------------------------------------------------------------------------------------*/ + +static float ivas_calc_duck_gain( + const float duck_gain, + const float duck_coeff, + const float env_1, + const float env_2, + const float duck_mult_fac ) +{ + float duck_gain_out; + + duck_gain_out = ( duck_gain - 1 ) * duck_coeff + 1; + + if ( ( duck_mult_fac * env_1 ) < duck_gain_out * env_2 ) + { + duck_gain_out = duck_mult_fac * ( env_1 / env_2 ); + } + + return duck_gain_out; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_td_decorr_get_ducking_gains() + * + * Calculate in/out ducking gains + *-----------------------------------------------------------------------------------------*/ + +void ivas_td_decorr_get_ducking_gains( + ivas_trans_det_state_t *hTranDet, /* i/o: Transient detector handle */ + float *pIn_pcm, + float *pIn_duck_gains, + float *pOut_duck_gains, + const int16_t frame_len, + const int16_t tdet_flag ) +{ + int16_t i; + float e_fast[L_FRAME48k], e_slow[L_FRAME48k]; + float in_duck_gain = hTranDet->in_duck_gain; + float out_duck_gain = hTranDet->out_duck_gain; + float in_duck_coeff = hTranDet->in_duck_coeff; + float out_duck_coeff = hTranDet->out_duck_coeff; + float duck_mult_fac = hTranDet->duck_mult_fac; + + mvr2r( pIn_pcm, e_fast, frame_len ); + + /* env hpf */ + ivas_filter_process( &hTranDet->env_hpf, e_fast, frame_len ); + + for ( i = 0; i < frame_len; i++ ) + { + e_fast[i] = (float) fabs( e_fast[i] ) + IVAS_TDET_PARM_ENV_EPS; + e_slow[i] = e_fast[i]; + } + + /* env fast*/ + ivas_filter_process( &hTranDet->env_fast, e_fast, frame_len ); + + /* env slow */ + ivas_filter_process( &hTranDet->env_slow, e_slow, frame_len ); + + if ( tdet_flag ) + { + for ( i = 0; i < frame_len; i++ ) + { + in_duck_gain = ivas_calc_duck_gain( in_duck_gain, in_duck_coeff, e_slow[i], e_fast[i], duck_mult_fac ); + pIn_duck_gains[i] = in_duck_gain; + } + hTranDet->in_duck_gain = in_duck_gain; + } + else + { + for ( i = 0; i < frame_len; i++ ) + { + in_duck_gain = ivas_calc_duck_gain( in_duck_gain, in_duck_coeff, e_slow[i], e_fast[i], duck_mult_fac ); + pIn_duck_gains[i] = in_duck_gain; + out_duck_gain = ivas_calc_duck_gain( out_duck_gain, out_duck_coeff, e_fast[i], e_slow[i], duck_mult_fac ); + pOut_duck_gains[i] = out_duck_gain; + } + hTranDet->in_duck_gain = in_duck_gain; + hTranDet->out_duck_gain = out_duck_gain; + } + + return; +} diff --git a/lib_com/lag_wind.c b/lib_com/lag_wind.c new file mode 100644 index 0000000000000000000000000000000000000000..fdaa4a7a7c4d6560bcfde0820a9a264d67479915 --- /dev/null +++ b/lib_com/lag_wind.c @@ -0,0 +1,164 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include "options.h" +#include "prot.h" +#include "cnst.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * Local constants + *-------------------------------------------------------------------*/ + +#define kLagWinThGain1 0.6f +#define kLagWinThGain2 0.3f + + +/*-------------------------------------------------------------* + * procedure lag_wind() * + * ~~~~~~~~~ * + * lag windowing of the autocorrelations * + *-------------------------------------------------------------*/ + +void lag_wind( + float r[], /* i/o: autocorrelations */ + const int16_t m, /* i : order of LP filter */ + const int32_t sr_core, /* i : sampling rate */ + const int16_t strength /* i : LAGW_WEAK, LAGW_MEDIUM, or LAGW_STRONG */ +) +{ + int16_t i; + const float *wnd; + + assert( 0 <= strength && strength <= NUM_LAGW_STRENGTHS ); + + switch ( sr_core ) + { + case 8000: + assert( m <= 16 ); + assert( strength == LAGW_STRONG ); + wnd = lag_window_8k; + break; + case 12800: + assert( m <= 16 ); + wnd = lag_window_12k8[strength]; + break; + case 16000: + assert( m <= 16 ); + wnd = lag_window_16k[strength]; + break; + case 24000: + case 25600: + assert( m <= 16 ); + wnd = lag_window_25k6[strength]; + break; + case 32000: + assert( m <= 16 ); + wnd = lag_window_32k[strength]; + break; + case 48000: + assert( m <= 16 ); + assert( strength == LAGW_STRONG ); + wnd = lag_window_48k; + break; + default: + assert( !"Lag window not implemented for this sampling rate" ); + return; + } + + for ( i = 0; i <= m; ++i ) + { + r[i] *= wnd[i]; + } + + return; +} + +/*-------------------------------------------------------------* + * procedure adapt_lag_wind() + * + * + *-------------------------------------------------------------*/ + +void adapt_lag_wind( + float r[], /* i/o: autocorrelations */ + const int16_t m, /* i : order of LP filter */ + const int16_t Top, /* i : open loop pitch lags from curr. frame (or NULL if n/a) */ + const float Tnc, /* i : open loop pitch gains from curr. frame (NULL if n/a) */ + const int32_t sr_core /* i : core sampling rate */ +) +{ + int16_t strength; + int16_t pitch_lag; + float pitch_gain; + + pitch_lag = (int16_t) Top; + pitch_gain = (float) Tnc; + + if ( pitch_lag < 80 ) + { + if ( pitch_gain > kLagWinThGain1 ) + { + strength = LAGW_STRONG; + } + else + { + strength = LAGW_MEDIUM; + } + } + else if ( pitch_lag < 160 ) + { + if ( pitch_gain > kLagWinThGain2 ) + { + strength = LAGW_MEDIUM; + } + else + { + strength = LAGW_WEAK; + } + } + else + { + strength = LAGW_WEAK; + } + + lag_wind( r, m, sr_core, strength ); + + return; +} diff --git a/lib_com/lerp.c b/lib_com/lerp.c new file mode 100644 index 0000000000000000000000000000000000000000..60e7bf628e415ed8bef6c440aaee372eb04f9dbb --- /dev/null +++ b/lib_com/lerp.c @@ -0,0 +1,183 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "prot.h" +#include "wmc_auto.h" + + +/*-------------------------------------------------------------* + * Local function prototypes + *-------------------------------------------------------------*/ + +static void lerp_proc( const float *f, float *f_out, const int16_t bufferNewSize, const int16_t bufferOldSize ); + + +/*-------------------------------------------------------------* + * procedure lerp() * + * * + * * + *-------------------------------------------------------------*/ + +void lerp( + const float *f, + float *f_out, + const int16_t bufferNewSize, + const int16_t bufferOldSize_inp ) +{ + float maxFac; + int16_t bufferOldSize, tmpNewSize; + + maxFac = 507.0 / 128.0; + bufferOldSize = bufferOldSize_inp; + + if ( (float) bufferNewSize / bufferOldSize > maxFac ) + { + tmpNewSize = bufferOldSize * 2; + while ( bufferNewSize > bufferOldSize ) + { + if ( (float) bufferNewSize / bufferOldSize <= maxFac ) + { + tmpNewSize = bufferNewSize; + } + + lerp_proc( f, f_out, tmpNewSize, bufferOldSize ); + + f = f_out; + bufferOldSize = tmpNewSize; + tmpNewSize *= 2; + } + } + else if ( (float) bufferOldSize / bufferNewSize > maxFac ) + { + tmpNewSize = bufferOldSize / 2; + while ( bufferNewSize < bufferOldSize ) + { + if ( (float) bufferOldSize / bufferNewSize <= maxFac ) + { + tmpNewSize = bufferNewSize; + } + + lerp_proc( f, f_out, tmpNewSize, bufferOldSize ); + + f = f_out; + bufferOldSize = tmpNewSize; + tmpNewSize /= 2; + } + } + else + { + lerp_proc( f, f_out, bufferNewSize, bufferOldSize ); + } + + return; +} + +/*-------------------------------------------------------------* + * procedure lerp_proc() * + * * + * * + *-------------------------------------------------------------*/ + +static void lerp_proc( + const float *f, + float *f_out, + const int16_t bufferNewSize, + const int16_t bufferOldSize ) +{ + int16_t i, idx; + float pos, shift, diff; + float buf[2 * L_FRAME_MAX]; + Word16 tmp; + + if ( bufferNewSize == bufferOldSize ) + { + mvr2r( f, buf, bufferNewSize ); + mvr2r( buf, f_out, bufferNewSize ); + return; + } + + /* Using the basop code to avoid reading beyond end of input for bufferOldSize=320, bufferNewSize=640 */ + tmp = div_s( bufferOldSize, shl( bufferNewSize, 4 ) ); + shift = (float) ( L_shl( L_deposit_l( tmp ), 4 - 15 + 16 ) ) / 65536.0f; + pos = 0.5f * shift - 0.5f; + + if ( shift < 0.3f ) + { + pos = pos - 0.13f; + } + + /* first point of interpolation */ + if ( pos < 0 ) + { + buf[0] = f[0] + pos * ( f[1] - f[0] ); + } + else + { + idx = (int16_t) pos; + diff = pos - idx; + buf[0] = f[idx] + diff * ( f[idx + 1] - f[idx] ); + } + + pos += shift; + + for ( i = 1; i < bufferNewSize - 1; i++ ) + { + idx = (int16_t) pos; + diff = pos - idx; + + buf[i] = f[idx] + diff * ( f[idx + 1] - f[idx] ); + pos += shift; + } + + + /* last point */ + idx = (int16_t) pos; + + if ( pos > bufferOldSize - 1 ) + { + idx = bufferOldSize - 2; + } + + diff = pos - idx; + + buf[bufferNewSize - 1] = f[idx] + diff * ( f[idx + 1] - f[idx] ); + + mvr2r( buf, f_out, bufferNewSize ); + + return; +} diff --git a/lib_com/limit_t0.c b/lib_com/limit_t0.c new file mode 100644 index 0000000000000000000000000000000000000000..1176a81327346e47cc8de90872fd86a57215aecf --- /dev/null +++ b/lib_com/limit_t0.c @@ -0,0 +1,231 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------* + * Local constants + *-------------------------------------------------*/ + +#define LIMIT_PIT_REL_LOWER 2 /* delta interval to extend pitch coding in relative Q */ +#define LIMIT_PIT_REL_UPPER 0 + +/*-------------------------------------------------* + * limit_T0() + * + * Close-loop pitch lag search limitation + *-------------------------------------------------*/ + +void limit_T0( + const int16_t L_frame, /* i : length of the frame */ + const int16_t delta, /* i : Half the close-loop searched interval */ + const int16_t pit_flag, /* i : selecting absolute(0) or delta(1) pitch quantization */ + const int16_t limit_flag, /* i : flag for Q limits (0=restrained, 1=extended) */ + const int16_t T0, /* i : rough pitch estimate around which the search is done */ + const int16_t T0_frac, /* i : pitch estimate fractional part */ + int16_t *T0_min, /* o : lower pitch limit */ + int16_t *T0_max /* o : higher pitch limit */ +) +{ + int16_t delta2, T1; + int16_t pit_min, pit_max; + + if ( limit_flag == 0 ) /* restrained Q limits */ + { + /* set limits */ + if ( L_frame == L_FRAME ) + { + pit_max = PIT_MAX; + pit_min = PIT_MIN; + } + else /* L_frame == L_FRAME16k */ + { + pit_max = PIT16k_MAX; + pit_min = PIT16k_MIN; + } + + delta2 = 2 * delta - 1; + + T1 = T0; + if ( T0_frac >= 2 ) + { + T1++; + } + *T0_min = T1 - delta; + + if ( *T0_min < pit_min ) + { + *T0_min = pit_min; + } + *T0_max = *T0_min + delta2; + + if ( *T0_max > pit_max ) + { + *T0_max = pit_max; + *T0_min = *T0_max - delta2; + } + } + else /* extended Q limits */ + { + + /* set limits */ + if ( L_frame == L_FRAME ) + { + pit_max = PIT_MAX; + pit_min = PIT_MIN_EXTEND; + + if ( limit_flag == 2 ) + { + pit_min = PIT_MIN_DOUBLEEXTEND; + } + } + else /* L_frame == L_FRAME16k */ + { + pit_max = PIT16k_MAX; + pit_min = PIT16k_MIN_EXTEND; + } + + delta2 = 2 * delta - 1; + + T1 = T0; + if ( T0_frac >= 2 ) + { + T1++; + } + *T0_min = T1 - delta; + + if ( pit_flag == 0 ) + { + /* subframes with absolute search: keep Q range */ + if ( *T0_min < pit_min ) + { + *T0_min = pit_min; + } + *T0_max = *T0_min + delta2; + + if ( *T0_max > pit_max ) + { + *T0_max = pit_max; + *T0_min = *T0_max - delta2; + } + } + else + { + /* subframes with relative search: extend Q range */ + if ( *T0_min < pit_min - LIMIT_PIT_REL_LOWER ) + { + *T0_min = pit_min - LIMIT_PIT_REL_LOWER; + } + + if ( *T0_min < L_INTERPOL ) + { + *T0_min = L_INTERPOL; + } + *T0_max = *T0_min + delta2; + + if ( *T0_max > pit_max + LIMIT_PIT_REL_UPPER ) + { + *T0_max = pit_max + LIMIT_PIT_REL_UPPER; + *T0_min = *T0_max - delta2; + } + } + } + + return; +} + + +/*-------------------------------------------------* + * Routine limit_T0_voiced() + * + * Close-loop pitch lag search limitation + *-------------------------------------------------*/ + +void limit_T0_voiced( + const int16_t nbits, + const int16_t res, + const int16_t T0, /* i : rough pitch estimate around which the search is done */ + const int16_t T0_frac, /* i : pitch estimate fractional part */ + const int16_t T0_res, /* i : pitch resolution */ + int16_t *T0_min, /* o : lower pitch limit */ + int16_t *T0_min_frac, /* o : lower pitch limit */ + int16_t *T0_max, /* o : higher pitch limit */ + int16_t *T0_max_frac, /* o : higher pitch limit */ + const int16_t pit_min, /* i : Minimum pitch lag */ + const int16_t pit_max /* i : Maximum pitch lag */ +) +{ + int16_t T1, temp1, temp2; + + /* Mid-point */ + T1 = T0; + if ( ( T0_res > 1 ) && ( T0_frac >= ( T0_res >> 1 ) ) ) + { + T1++; + } + + /* Lower-bound */ + temp1 = ( T1 * res ) - ( 1 << ( nbits - 1 ) ); + temp2 = temp1 / res; + *T0_min = temp2; + *T0_min_frac = temp1 - temp2 * res; + if ( *T0_min < pit_min ) + { + *T0_min = pit_min; + *T0_min_frac = 0; + } + + /* Higher-bound */ + temp1 = ( *T0_min * res ) + *T0_min_frac + ( 1 << nbits ) - 1; + temp2 = temp1 / res; + *T0_max = temp2; + *T0_max_frac = temp1 - temp2 * res; + if ( *T0_max > pit_max ) + { + *T0_max = pit_max; + *T0_max_frac = res - 1; + temp1 = ( *T0_max * res ) + *T0_max_frac - ( 1 << nbits ) + 1; + temp2 = temp1 / res; + *T0_min = temp2; + *T0_min_frac = temp1 - temp2 * res; + } + + return; +} diff --git a/lib_com/logqnorm.c b/lib_com/logqnorm.c new file mode 100644 index 0000000000000000000000000000000000000000..04b822a14cfe39a742ab43253658b41120315c3c --- /dev/null +++ b/lib_com/logqnorm.c @@ -0,0 +1,197 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "rom_com.h" +#include "prot.h" /* Function prototypes */ +#include "wmc_auto.h" + +/*-------------------------------------------------------------------------- + * logqnorm() + * + * Log quantization for norms of sub-vectors + *--------------------------------------------------------------------------*/ + +void logqnorm( + const float *x, /* i : coefficient vector */ + int16_t *k, /* o : index */ + const int16_t L, /* i : codebook length */ + const int16_t N, /* i : sub-vector size */ + const float *thren /* i : quantization thresholds */ +) +{ + int16_t i, j, j1, j2; + float temp, power; + + + temp = 0.0; + for ( i = 0; i < N; i++ ) + { + temp += ( x[i] * x[i] ); + } + + /* sqrt will be done later */ + temp *= inv_tbl[N]; + + if ( thren[0] * thren[0] - temp <= 0 ) + { + *k = 0; + } + else if ( thren[L - 2] * thren[L - 2] - temp > 0 ) + { + *k = L - 1; + } + else + { + power = (float) sqrt( temp ); + + j1 = 0; + j2 = L - 1; + while ( ( j2 - j1 ) > 1 ) + { + j = ( j1 + j2 ) >> 1; + if ( power >= thren[j] ) + { + j2 = j; + } + else + { + j1 = j; + } + } + + *k = j2; + } + + return; +} + + +/*-------------------------------------------------------------------------- + * logqnorm_2() + * + * + *--------------------------------------------------------------------------*/ + +void logqnorm_2( + const float *env_fl, /* o : index */ + const int16_t L, /* i : codebook length */ + const int16_t n_env_band, /* i : sub-vector size */ + const int16_t nb_sfm, /* i : sub-vector size */ + int16_t *ynrm, /* o : norm indices */ + int16_t *normqlg2, /* o : quantized norm values */ + const float *thren /* i : quantization thresholds */ +) +{ + int16_t i, j, j1, j2; + float temp, power; + + for ( i = n_env_band; i < nb_sfm; i++ ) + { + temp = env_fl[i - n_env_band]; + if ( thren[0] - temp <= 0 ) + { + *ynrm = 0; + } + else if ( thren[L - 2] - temp > 0 ) + { + *ynrm = L - 1; + } + else + { + power = temp; + j1 = 0; + j2 = L - 1; + while ( ( j2 - j1 ) > 1 ) + { + j = ( j1 + j2 ) >> 1; + if ( power >= thren[j] ) + { + j2 = j; + } + else + { + j1 = j; + } + } + *ynrm = j2; + } + *normqlg2 = dicnlg2[*ynrm]; + normqlg2++; + ynrm++; + } + + return; +} + +/*-------------------------------------------------------------------------- + * calc_norm() + * + * Calculate the norms for the spectral envelope + *--------------------------------------------------------------------------*/ + +void calc_norm( + const float *x, /* i : Input vector. */ + int16_t *norm, /* o : Quantization indices for norms */ + int16_t *normlg, /* o : Quantized norms in log2 */ + const int16_t start_band, /* i : Indice of band to start coding */ + const int16_t num_bands, /* i : Number of bands */ + const int16_t *band_len, /* i : Length of bands */ + const int16_t *band_start /* i : Start of bands */ +) +{ + int16_t nrm; + int16_t band; + + set_s( norm, 0, start_band ); + + logqnorm( &x[band_start[start_band]], &nrm, 32, band_len[start_band], thren_HQ ); + norm[start_band] = nrm; + normlg[start_band] = dicnlg2[nrm]; + + for ( band = start_band + 1; band < start_band + num_bands; band++ ) + { + logqnorm( &x[band_start[band]], &nrm, 40, band_len[band], thren_HQ ); + norm[band] = nrm; + normlg[band] = dicnlg2[nrm]; + } + + return; +} diff --git a/lib_com/longarith.c b/lib_com/longarith.c new file mode 100644 index 0000000000000000000000000000000000000000..01a20c8417ea0091294f13b06829e567afcba36f --- /dev/null +++ b/lib_com/longarith.c @@ -0,0 +1,183 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include "options.h" +#include "prot.h" +#include "wmc_auto.h" + + +/*-------------------------------------------------------------------* + * longadd() + * + * long addition: a[] = a[] + b[] + * Addition of unsigned vectors a[] and b[] without saturation. + * All words of b[] are added with carry to the corresponding words in a. + * An assertion failure occurs, if lenb exceeds lena or if overflow occurs. + *--------------------------------------------------------------------*/ + +void longadd( + uint16_t a[], /* i/o: vector of the length lena */ + const uint16_t b[], /* i/o: vector of the length lenb */ + const int16_t lena, /* i/o: length of vector a[] */ + const int16_t lenb /* i/o: length of vector b[] */ +) +{ + int16_t h; + int32_t carry = 0; + + assert( lena >= lenb ); + for ( h = 0; h < lenb; h++ ) + { + carry += ( (uint32_t) a[h] ) + ( (uint32_t) b[h] ); + a[h] = (uint16_t) carry; + carry = carry >> 16; + } + + for ( ; h < lena; h++ ) + { + carry = ( (uint32_t) a[h] ) + carry; + a[h] = (uint16_t) carry; + carry = carry >> 16; + } + + assert( carry == 0 ); /* carry != 0 indicates addition overflow */ + return; +} + + +/*-------------------------------------------------------------------* + * longshiftright() + * + * long shift right: d[] = a[] >> b + * Logical shift right of unsigned vectors a[] by b bit-positions. + * Vector d[] is filled with leading zeroes, where lend exceeds lena. + * It is allowed to overlay d[] with a[]. + *--------------------------------------------------------------------*/ + +void longshiftright( + uint16_t a[], /* i : vector of the length lena */ + const int16_t b, /* i : number of bit positions to shift right */ + uint16_t d[], /* o : vector of the length lend */ + int16_t lena, /* i : length of vector a[] */ + const int16_t lend /* i : length of vector d[] */ +) +{ + int16_t intb, fracb, fracb_u, k; + + intb = b >> 4; + + a += intb; + lena -= intb; + + fracb = b & 0xF; + if ( fracb ) + { + fracb_u = 16 - fracb; + for ( k = 0; k < lena - 1; k++ ) + { + d[k] = ( ( a[k] >> fracb ) | ( a[k + 1] << fracb_u ) ) & 0xFFFF; + } + d[k] = ( a[k] >> fracb ); + k++; + } + else + { + for ( k = 0; k < lena; k++ ) + { + d[k] = a[k]; + } + } + + /* fill remaining upper bits with zero */ + for ( ; k < lend; k++ ) + { + d[k] = 0; + } + + return; +} + + +/*-------------------------------------------------------------------* + * longshiftleft() + * + * long shift left: d[] = a[] << b + * Logical shift left of unsigned vectors a[] by b bit-positions. + * It is allowed to overlay d[] with a[]. + *--------------------------------------------------------------------*/ + +void longshiftleft( + const uint16_t a[], /* i : vector of the length len */ + const int16_t b, /* i : number of bit positions to shift left */ + uint16_t d[], /* o : vector of the length len */ + const int16_t len /* i : length of vector a[] and d[] */ +) +{ + int16_t intb; /* integer part of b */ + int16_t fracb; /* shift left value for all upper words a[k] */ + int16_t fracb_l; /* shift right value for all lower words a[k-1] */ + int16_t k = len - 1; + + intb = b >> 4; + fracb = b & 0xF; + + if ( fracb ) + { + fracb_l = 16 - fracb; + for ( ; k > intb; k-- ) + { + d[k] = ( a[k - intb] << fracb ) | ( a[k - intb - 1] >> fracb_l ); + } + d[k] = ( a[k - intb] << fracb ); + k--; + } + else + { + for ( ; k >= intb; k-- ) + { + d[k] = a[k - intb]; + } + } + + for ( ; k >= 0; k-- ) + { + d[k] = 0; + } + + return; +} diff --git a/lib_com/low_rate_band_att.c b/lib_com/low_rate_band_att.c new file mode 100644 index 0000000000000000000000000000000000000000..c715e0ac570682d5d54f6b163c85491dfdb9b483 --- /dev/null +++ b/lib_com/low_rate_band_att.c @@ -0,0 +1,192 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "rom_com.h" +#include "prot.h" +#include "wmc_auto.h" + +/*--------------------------------------------------------------------------* + * fine_gain_pred() + * + * Fine gain prediction + *--------------------------------------------------------------------------*/ + +void fine_gain_pred( + const int16_t *sfm_start, /* i : Sub band start indices */ + const int16_t *sfm_end, /* i : Sub band end indices */ + const int16_t *sfm_size, /* i : Sub band bandwidths */ + const int16_t *i_sort, /* i : Energy sorting indices */ + const int16_t *K, /* i : Number of pulses per band */ + const int16_t *maxpulse, /* i : Maximum pulse per band */ + const int16_t *R, /* i : Bits per sub band (Q3) */ + const int16_t num_sfm, /* i : Number of sub bands */ + float *xq, /* i/o: Quantized vector /quantized vector with finegain adj */ + int16_t *y, /* i/o: Quantized vector */ + float *fg_pred, /* o : Predicted fine gains */ + const int16_t core /* i : Core */ +) +{ + int16_t i, band; + float gp; + float xx; + float accuracy; + int16_t k, bw; + float att; + + for ( band = 0; band < num_sfm; band++ ) + { + + k = K[i_sort[band]]; + if ( k > 0 ) + { + bw = sfm_size[i_sort[band]]; + xx = 0; + for ( i = sfm_start[i_sort[band]]; i < sfm_end[i_sort[band]]; i++ ) + { + xx += xq[i] * xq[i]; + } + + if ( xx > 0 ) + { + /* Normalize synthesis to RMS=1.0 */ + gp = (float) sqrt( bw / xx ); + + if ( core == HQ_CORE && R != NULL && R[i_sort[band]] <= 256 ) + { + accuracy = ( (float) k / (float) bw ) * maxpulse[i_sort[band]]; + att = 1.0f - 0.05f / accuracy; + att = max( 0.840896f, att ); /* Limit attenuation to norm quantizer error, 2^-0.25 */ + gp *= att; + } + + fg_pred[band] = gp; + } + else + { + fg_pred[band] = 0; + } + } + else + { + fg_pred[band] = 0; + for ( i = sfm_start[i_sort[band]]; i < sfm_end[i_sort[band]]; i++ ) + { + y[i] = 0; + xq[i] = 0; + } + } + } + return; +} + +/*--------------------------------------------------------------------------* + * get_max_pulses() + * + * Find the maximum pulse height (in unit pulses) in each band + *--------------------------------------------------------------------------*/ + +void get_max_pulses( + const int16_t *band_start, /* i : Sub band start indices */ + const int16_t *band_end, /* i : Sub band end indices */ + const int16_t *k_sort, /* i : Indices for sorting by energy */ + const int16_t *npulses, /* i : Pulses per sub band */ + const int16_t BANDS, /* i : Number of bands */ + int16_t *inp_vector, /* i/o: Encoded shape vectors */ + int16_t *maxpulse /* o : Maximum pulse height per band */ +) +{ + int16_t i, k; + int16_t npul; + int16_t maxp; + + for ( k = 0; k < BANDS; k++ ) + { + npul = npulses[k_sort[k]]; + maxp = 0; + if ( npul > 0 ) + { + for ( i = band_start[k_sort[k]]; i < band_end[k_sort[k]]; i++ ) + { + if ( abs( inp_vector[i] ) > maxp ) + { + maxp = (int16_t) abs( inp_vector[i] ); + } + } + } + maxpulse[k_sort[k]] = maxp; + } + + return; +} + +/*--------------------------------------------------------------------------* + * fine_gain_dec() + * + * Fine gain decoder. Decodes fine gain adjustments and applies correction to + * predicted fine gains + *--------------------------------------------------------------------------*/ + +void fine_gain_dec( + Decoder_State *st, /* i/o: Decoder state struct */ + const int16_t *ord, /* i : Indices for energy order */ + const int16_t num_sfm, /* i : Number of bands */ + const int16_t *gain_bits, /* i : Gain adjustment bits per sub band */ + float *fg_pred /* i/o: Predicted gains / Corrected gains */ +) +{ + int16_t band; + int16_t gbits; + int16_t idx; + float gain_dbq; + + for ( band = 0; band < num_sfm; band++ ) + { + gbits = gain_bits[ord[band]]; + if ( fg_pred[band] != 0 && gbits > 0 ) + { + idx = get_next_indice( st, gbits ); + gain_dbq = finegain[gbits - 1][idx]; + + /* Update prediced gain with quantized correction */ + fg_pred[band] *= (float) pow( 10, gain_dbq * 0.05f ); + } + } + + return; +} diff --git a/lib_com/lpc_tools.c b/lib_com/lpc_tools.c new file mode 100644 index 0000000000000000000000000000000000000000..9c936da11251af22b59e4e336479f3b21ea08ce1 --- /dev/null +++ b/lib_com/lpc_tools.c @@ -0,0 +1,333 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*-----------------------------------------------------------------* + * Local constants + *-----------------------------------------------------------------*/ + +#define MAX_LEN_LP 960 +#define SCALE1_LPC 2037.1832275390625f /* LSP to LSF conversion factor */ + + +/*---------------------------------------------------------------------* + * autocorr() + * + * Compute autocorrelations of input signal + *---------------------------------------------------------------------*/ + +void autocorr( + const float *x, /* i : input signal */ + float *r, /* o : autocorrelations vector */ + const int16_t m, /* i : order of LP filter */ + const int16_t len, /* i : window size */ + const float *wind, /* i : window */ + const int16_t rev_flag, /* i : flag to reverse window */ + const int16_t sym_flag, /* i : symmetric window flag */ + const int16_t no_thr /* i : flag to avoid thresholding */ +) +{ + float t[MAX_LEN_LP]; + float s; + int16_t i, j; + + /* Windowing of signal */ + if ( rev_flag == 1 ) + { + /* time reversed window */ + for ( i = 0; i < len; i++ ) + { + t[i] = x[i] * wind[len - i - 1]; + } + } + else if ( sym_flag == 1 ) + { + /* symmetric window of even length */ + for ( i = 0; i < len / 2; i++ ) + { + t[i] = x[i] * wind[i]; + } + + for ( ; i < len; i++ ) + { + t[i] = x[i] * wind[len - 1 - i]; + } + } + else /* assymetric window */ + { + for ( i = 0; i < len; i++ ) + { + t[i] = x[i] * wind[i]; + } + } + + /* Compute r[1] to r[m] */ + for ( i = 0; i <= m; i++ ) + { + s = t[0] * t[i]; + for ( j = 1; j < len - i; j++ ) + { + s += t[j] * t[i + j]; + } + r[i] = s; + } + + if ( r[0] < 100.0f && no_thr == 0 ) + { + r[0] = 100.0f; + } + + return; +} + +/*---------------------------------------------------------------------* + * lev_dur() + * + * Wiener-Levinson-Durbin algorithm to compute LP parameters from the autocorrelations + * of input signal + *---------------------------------------------------------------------*/ + +/*! r: energy of prediction error */ +int16_t lev_dur( + float *a, /* o : LP coefficients (a[0] = 1.0) */ + const float *r, /* i : vector of autocorrelations */ + const int16_t m, /* i : order of LP filter */ + float epsP[] /* o : prediction error energy */ +) +{ + int16_t i, j, l; + float buf[TCXLTP_LTP_ORDER]; + float *rc; /* reflection coefficients 0,...,m-1 */ + float s, at, err; + int16_t flag = 0; + + rc = &buf[0]; + rc[0] = ( -r[1] ) / r[0]; + a[0] = 1.0f; + a[1] = rc[0]; + err = r[0] + r[1] * rc[0]; + if ( epsP != NULL ) + { + epsP[0] = r[0]; + epsP[1] = err; + } + + for ( i = 2; i <= m; i++ ) + { + s = 0.0f; + for ( j = 0; j < i; j++ ) + { + s += r[i - j] * a[j]; + } + + rc[i - 1] = ( -s ) / err; + + if ( fabs( rc[i - 1] ) > 0.99945f ) + { + flag = 1; /* Test for unstable filter. If unstable keep old A(z) */ + } + + for ( j = 1; j <= i / 2; j++ ) + { + l = i - j; + at = a[j] + rc[i - 1] * a[l]; + a[l] += rc[i - 1] * a[j]; + a[j] = at; + } + + a[i] = rc[i - 1]; + + err += rc[i - 1] * s; + if ( err <= 0.0f ) + { + err = 0.01f; + } + + if ( epsP != NULL ) + { + epsP[i] = err; + } + } + + return ( flag ); +} + + +/*---------------------------------------------------------------------* + * E_LPC_int_lpc_tcx() + * + * + *---------------------------------------------------------------------*/ + +void E_LPC_int_lpc_tcx( + const float lsf_old[], /* i : LSFs from past frame */ + const float lsf_new[], /* i : LSFs from present frame */ + float a[] /* o : interpolated LP coefficients */ +) +{ + int16_t i; + float lsf[M]; + + for ( i = 0; i < M; i++ ) + { + lsf[i] = lsf_old[i] * 0.125f + lsf_new[i] * 0.875f; + } + + lsp2a_stab( lsf, a, M ); + + return; +} + +/*---------------------------------------------------------------------* + * lsp_reorder() + * + * + *---------------------------------------------------------------------*/ + +static void lsp_reorder( + float *lsp, /* i/o: lsp vector (acos() domain) */ + float min_dist, /* i : minimum required distance */ + const int16_t lpcorder /* i : LPC order */ +) +{ + int16_t i; + float lsp_min, lsp_max; + + /* Verify the LSF ordering and minimum GAP */ + lsp_min = min_dist; + + for ( i = 0; i < lpcorder; ++i ) + { + if ( lsp[i] < lsp_min ) + { + lsp[i] = lsp_min; + } + lsp_min = lsp[i] + min_dist; + } + + /* Reverify the LSF ordering and minimum GAP in the reverse order (security) */ + lsp_max = EVS_PI - min_dist; + + /* If danger of unstable filter in case of resonance in HF */ + if ( lsp[lpcorder - 1] > lsp_max ) + { + /* Reverify the minimum LSF gap in the reverse sense */ + for ( i = lpcorder - 1; i >= 0; --i ) + { + if ( lsp[i] > lsp_max ) + { + lsp[i] = lsp_max; + } + lsp_max = lsp[i] - min_dist; + } + } + + return; +} + + +/*---------------------------------------------------------------------* + * E_LPC_lsp_unweight() + * + * Approximate unweighting + *---------------------------------------------------------------------*/ + +int16_t E_LPC_lsp_unweight( + const float lsp_w[], /* i : weighted lsp */ + float lsp_uw[], /* o : unweighted lsp */ + float lsf_uw[], /* o : unweighted lsf */ + const float inv_gamma /* i : inverse weighting factor */ +) +{ + float lsp_w_orig[M], lsp_w_diff[M], mean, step; + const lsp_unw_triplet *unw_coeffs = NULL; + int16_t i; + + /* Table selection */ + if ( (float) fabs( inv_gamma - 1.0f / 0.94f ) < 0.0001f ) + { + unw_coeffs = p16_gamma0_94to1; + } + else if ( (float) fabs( inv_gamma - 1.0f / 0.92f ) < 0.0001f ) + { + unw_coeffs = p16_gamma0_92to1; + } + else + { + assert( 0 ); + } + + step = EVS_PI / (float) ( M + 1 ); + mean = step; + + /* Apply acos() and get mean removed version */ + for ( i = 0; i < M; ++i ) + { + lsp_w_orig[i] = (float) acos( lsp_w[i] ); + lsp_w_diff[i] = lsp_w_orig[i] - mean; + mean += step; + } + + /* Approximate unweighting by 3-tap FIR */ + + lsp_uw[0] = lsp_w_orig[0] + unw_coeffs[0][1] * lsp_w_diff[0] + unw_coeffs[0][2] * lsp_w_diff[1]; + for ( i = 1; i < M - 1; ++i ) + { + lsp_uw[i] = lsp_w_orig[i] + unw_coeffs[i][0] * lsp_w_diff[i - 1] + unw_coeffs[i][1] * lsp_w_diff[i] + unw_coeffs[i][2] * lsp_w_diff[i + 1]; + } + + lsp_uw[M - 1] = lsp_w_orig[M - 1] + unw_coeffs[M - 1][0] * lsp_w_diff[M - 2] + unw_coeffs[M - 1][1] * lsp_w_diff[M - 1]; + + /* Reorder */ + lsp_reorder( lsp_uw, 50.0f / SCALE1_LPC, M ); + + /* Convert to lsf, apply cos() */ + for ( i = 0; i < M; ++i ) + { + lsf_uw[i] = lsp_uw[i] * SCALE1_LPC; + lsp_uw[i] = (float) cos( lsp_uw[i] ); + } + + return 0; +} diff --git a/lib_com/lsf_dec_bfi.c b/lib_com/lsf_dec_bfi.c new file mode 100644 index 0000000000000000000000000000000000000000..70506b293c18856de3fad6c631b25648dc8fb9d5 --- /dev/null +++ b/lib_com/lsf_dec_bfi.c @@ -0,0 +1,298 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + + +#include +#include "options.h" +#include "cnst.h" +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*---------------------------------------------------------------------* + * routine: lsf_dec_bfi() + * + * Estimate the lsfs in case of FER + * Bad frame, all active speech coders + *---------------------------------------------------------------------*/ + +void lsf_dec_bfi( + const int16_t codec_mode, /* i : codec mode: MODE1 | MODE2 */ + float *lsf, /* o : estimated LSF vector */ + const float *lsfold, /* i : past quantized lsf */ + float *lsf_adaptive_mean, /* i : lsf adaptive mean, updated when BFI==0 */ + const float lsfBase[], /* i : base for differential lsf coding */ + float *mem_MA, /* i/o: quantizer memory for MA model */ + float *mem_AR, /* o : quantizer memory for AR model */ + const float stab_fac, /* i : lsf stability factor */ + const int16_t last_coder_type, /* i : last coder type */ + const int16_t L_frame, /* i : frame length */ + const int16_t last_good, /* i : last good received frame */ + const int16_t nbLostCmpt, /* i : counter of consecutive bad frames */ + const int16_t plcBackgroundNoiseUpdated, /* i : background noise already updated?*/ + float *lsf_q_cng, /* o : quantized lsfs of background noise */ + float *lsf_cng, /* i : long term target for fading to bg noise*/ + float *old_lsf_q_cng, /* i : old quantized lsfs for background noise*/ + const int16_t Last_GSC_pit_band_idx, /* i : AC mode (GSC) - Last pitch band index */ + const int16_t Opt_AMR_WB, /* i : IO flag */ + const int16_t bwidth /* i : coded bandwidth */ +) +{ + int16_t i; + float alpha, tmp; + float lsf_mean[M]; + const float *pt_meansForFading; + const float *pt_meansForMemUpdate; + float beta; + + /* init vectors */ + if ( codec_mode == MODE1 ) + { + pt_meansForMemUpdate = &lsf_mean[0]; + + if ( Opt_AMR_WB ) + { + pt_meansForFading = mean_isf_amr_wb; + } + else + { + if ( L_frame == L_FRAME ) + { + if ( bwidth == NB ) + { + pt_meansForFading = GENB_Ave; + } + else + { + pt_meansForFading = GEWB_Ave; + } + } + else + { + pt_meansForFading = GEWB2_Ave; + } + } + } + else + { + pt_meansForFading = pt_meansForMemUpdate = lsfBase; + if ( lsf_cng != NULL && plcBackgroundNoiseUpdated ) + { + pt_meansForFading = lsf_cng; + } + } + + /*----------------------------------------------------------------------* + * Initialize the alpha factor + *----------------------------------------------------------------------*/ + + if ( nbLostCmpt <= 3 ) + { + if ( last_coder_type == UNVOICED ) + { + /* clearly unvoiced */ + alpha = ALPHA_UU; + } + else if ( last_coder_type == AUDIO || last_good == INACTIVE_CLAS ) + { + if ( Last_GSC_pit_band_idx > 0 && nbLostCmpt > 1 ) + { + alpha = 0.8f; + } + else + { + alpha = 0.995f; + } + } + else if ( last_good == UNVOICED_CLAS ) + { + if ( nbLostCmpt <= 1 ) + { + /* if stable, do not flatten the spectrum in the 1st erased frame */ + alpha = stab_fac * ( 1.0f - 2.0f * ALPHA_U ) + 2.0f * ALPHA_U; /* [0.8, 1.0] */ + } + else if ( nbLostCmpt == 2 ) + { + alpha = ALPHA_U * 1.5f; /* 0.6 */ + } + else + { + /* go rapidly to CNG spectrum */ + alpha = ALPHA_U; + } + } + else if ( last_good == UNVOICED_TRANSITION ) + { + alpha = ALPHA_UT; + } + else if ( last_good == VOICED_CLAS || last_good == ONSET ) + { + /* clearly voiced - mild convergence to the CNG spectrum for the first 3 erased frames */ + alpha = ALPHA_V; + } + else if ( last_good == SIN_ONSET ) + { + alpha = ALPHA_S; + } + else + { + alpha = ALPHA_VT; + } + } + else + { + alpha = 1.f / nbLostCmpt; + } + + if ( codec_mode == MODE1 ) + { + beta = BETA_FEC; + } + else + { + if ( plcBackgroundNoiseUpdated ) + { + beta = 0.f; + } + else + { + beta = 0.25f; + } + } + + for ( i = 0; i < M; i++ ) + { + lsf_mean[i] = beta * pt_meansForFading[i] + ( 1 - beta ) * lsf_adaptive_mean[i]; + lsf[i] = alpha * lsfold[i] + ( 1.0f - alpha ) * lsf_mean[i]; /* towards the CNG spectral envelope */ + + if ( lsf_q_cng != NULL ) + { + lsf_q_cng[i] = max( alpha, 0.8f ) * old_lsf_q_cng[i] + ( 1.0f - max( alpha, 0.8f ) ) * pt_meansForFading[i]; + } + } + + /*-----------------------------------------------------------------* + * - estimate past quantized residual to be used in next frame + * - Check A(z) filter stability through lsf ordering + *-----------------------------------------------------------------*/ + + if ( Opt_AMR_WB ) + { + reorder_isf( lsf, ISF_GAP, M, INT_FS_12k8 ); + } + else + { + if ( L_frame == L_FRAME ) + { + reorder_lsf( lsf, codec_mode == MODE1 ? MODE1_LSF_GAP : LSF_GAP, M, INT_FS_12k8 ); + + if ( lsf_q_cng != NULL ) + { + reorder_lsf( lsf_q_cng, LSF_GAP, M, INT_FS_12k8 ); + } + } + else /* L_frame > L_FRAME */ + { + reorder_lsf( lsf, MODE1_LSF_GAP, M, L_frame * FRAMES_PER_SEC ); + if ( lsf_q_cng != NULL ) + { + reorder_lsf( lsf_q_cng, MODE1_LSF_GAP, M, L_frame * FRAMES_PER_SEC ); + } + } + } + /* update the AR memory to be used in the next frame */ + mvr2r( lsf, mem_AR, M ); + + for ( i = 0; i < M; i++ ) + { + tmp = lsf[i] - pt_meansForMemUpdate[i]; + mem_MA[i] = (float) ( tmp - MU_MA * mem_MA[i] ); /* Update with quantized prediction error for MA model */ + mem_MA[i] *= 0.5f; /* Attenuate the MA Q memory */ + } + + return; +} + +/*---------------------------------------------------------------------* + * routine: PlcGetlsfBase() + * + * + *---------------------------------------------------------------------*/ + +const float *PlcGetlsfBase( + const int16_t lpcQuantization, + const int16_t narrowBand, + const int32_t sr_core ) +{ + if ( lpcQuantization == 0 ) + { + /* high rates, return value is never used; the correct value changes + dynamically and is not available during PLC; therefore, the setting + is kept as before (without the define PLC_FIX_XSF_HANDLING); the + correct value would be isf[m] as returned by lpc_unquantize() + during normal decoding */ + + if ( sr_core == 32000 ) + { + return means_swb_cleanspeech_lsf32k0; + } + else if ( sr_core == 25600 ) + { + return means_swb_cleanspeech_lsf25k6; + } + else + { + return means_wb_cleanspeech_lsf16k0; + } + } + + /* lpcQuntization == 1 is left */ + + if ( sr_core == INT_FS_16k ) + { + return GEWB2_Ave; + } + + /* sr_core == 12.8k is left */ + + if ( narrowBand == 0 ) + { + return GEWB_Ave; + } + + /* narrowBand == 1 is left */ + return GENB_Ave; +} diff --git a/lib_com/lsf_msvq_ma.c b/lib_com/lsf_msvq_ma.c new file mode 100644 index 0000000000000000000000000000000000000000..940233e4c3bdc8849597dc33d3323348c9c97f87 --- /dev/null +++ b/lib_com/lsf_msvq_ma.c @@ -0,0 +1,175 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include "options.h" +#include "cnst.h" +#include "prot.h" +#include "rom_com.h" +#include "stl.h" +#include "basop_proto_func.h" +#include "wmc_auto.h" + +/*---------------------------------------------------------------------* + * midlsf_dec() + * + * + *---------------------------------------------------------------------*/ + +void midlsf_dec( + const float qlsf0[], + const float qlsf1[], + const int16_t idx, + float qlsf[], + const int16_t N, + const int16_t coder_type, + int16_t *mid_lsf_int, + const int16_t prev_bfi, + const int16_t safety_net ) +{ + const float *ratio = NULL; + int16_t j; + int16_t bad_spacing = 0; + /* Select codebook */ + if ( coder_type == UNVOICED ) + { + ratio = tbl_mid_unv_wb_5b; + } + else + { + ratio = tbl_mid_gen_wb_5b; + } + + for ( j = 0; j < N; j++ ) + { + qlsf[j] = ( 1.0f - ratio[idx * N + j] ) * qlsf0[j] + ratio[idx * N + j] * qlsf1[j]; + } + + if ( mid_lsf_int != NULL ) /*at the decoder*/ + { + /* check for incorrect LSF ordering */ + if ( *mid_lsf_int == 1 ) + { + for ( j = 1; j < N; j++ ) + { + if ( qlsf[j] < qlsf[j - 1] ) + { + bad_spacing = 1; + break; + } + } + } + /* Redo mid-LSF interpolation with 0.4 in case of LSF instability */ + if ( prev_bfi || ( *mid_lsf_int == 1 && bad_spacing ) ) + { + for ( j = 0; j < N; j++ ) + { + /* redo mid-LSF interpolation with 0.4 */ + qlsf[j] = 0.4f * qlsf0[j] + 0.6f * qlsf1[j]; + + /* ensure correct ordering of LSF indices */ + if ( j > 0 && j < N && qlsf[j] < qlsf[j - 1] + LSF_GAP_MID ) + { + qlsf[j] = qlsf[j - 1] + LSF_GAP_MID; + } + } + } + else + { + /* otherwise, use regular LSF spacing and ordering as in the encoder */ + for ( j = 0; j < N; j++ ) + { + if ( j > 0 && j < N && qlsf[j] < qlsf[j - 1] + LSF_GAP_MID ) + { + qlsf[j] = qlsf[j - 1] + LSF_GAP_MID; + } + } + } + if ( prev_bfi ) + { + /* continue redoing mid-LSF interpolation with 0.4 in order not to propagate the error */ + *mid_lsf_int = 1; + } + if ( safety_net ) + { + /* safety-net encountered -> stop redoing mid-LSF interpolation with 0.4 */ + *mid_lsf_int = 0; + } + } + else + { + /* use regular LSF spacing */ + for ( j = 0; j < N; j++ ) + { + if ( j > 0 && j < N && qlsf[j] < qlsf[j - 1] + LSF_GAP_MID ) + { + qlsf[j] = qlsf[j - 1] + LSF_GAP_MID; + } + } + } + + return; +} + + +/*---------------------------------------------------------------------* + * lsf_ind_is_active() + * + * + *---------------------------------------------------------------------*/ + +int16_t lsf_ind_is_active( + const Word16 lsf_q_ind[], + const float means[], + const int16_t narrowband, + const int16_t cdk ) +{ + Word16 lsf[2], min_distance; + + lsf[0] = add( lsf_q_ind[0], LSFM( means[0] ) ); + move16(); + lsf[1] = add( lsf_q_ind[1], LSFM( means[1] ) ); + move16(); + + min_distance = lsf[0]; + min_distance = s_min( min_distance, sub( lsf[1], lsf[0] ) ); + + assert( narrowband == 0 || narrowband == 1 ); + assert( cdk == 0 || cdk == 1 ); + + return sub( min_distance, min_distance_thr[narrowband][cdk] ) < 0; +} diff --git a/lib_com/lsf_tools.c b/lib_com/lsf_tools.c new file mode 100644 index 0000000000000000000000000000000000000000..eaa94b506fcb016c0e4b6f34e6f8e58301f0f316 --- /dev/null +++ b/lib_com/lsf_tools.c @@ -0,0 +1,2620 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "rom_com.h" +#include "basop_proto_func.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * Local function prototypes + *-------------------------------------------------------------------*/ + +static float chebps2( const float x, const float *f, const int16_t n ); +static float LPC_chebyshev( float x, float f[], const int16_t n ); +static void get_isppol( const float *isp, float f[], const int16_t n ); + +/*---------------------------------------------------------------------* + * a2isp() + * + * Compute the ISPs from the LPC coefficients a[] using Chebyshev + * polynomials. The found ISPs are in the cosine domain with values + * in the range from 1 down to -1. + * The table grid[] contains the points (in the cosine domain) at + * which the polynomials are evaluated. + * + * The ISPs are the roots of the two polynomials F1(z) and F2(z) + * defined as + * F1(z) = [A(z) + z^-M A(z^-1)] + * and F2(z) = [A(z) - z^-M A(z^-1)]/ (1-z^-2) + * + * For an even order M=2N, F1(z) has M/2 conjugate roots on the unit circle + * and F2(z) has M/2-1 conjugate roots on the unit circle in addition to two + * roots at 0 and pi. + * + * For a 16th order LP analysis (M=16), F1(z) and F2(z) can be written as + * + * F1(z) = (1 + a[16]) * PRODUCT (1 - 2 cos(w_i) z^-1 + z^-2 ) + * i=0,2,...,14 + * + * F2(z) = (1 - a[16]) * PRODUCT (1 - 2 cos(w_i) z^-1 + z^-2 ) + * i=1,3,...,13 + * + * The ISPs are frequencies w_i, i=0...M-2 plus the last predictor + * coefficient a[M]. + *---------------------------------------------------------------------*/ + +void a2isp( + const float *a, /* i : LP filter coefficients */ + float *isp, /* o : Immittance spectral pairs */ + const float *old_isp /* i : ISP vector from past frame */ +) +{ + int16_t j, i, nf, ip, order; + float xlow, ylow, xhigh, yhigh, xmid, ymid, xint; + float f1[NC + 1], f2[NC]; + float *coef; + + /*-------------------------------------------------------------* + * find the sum and diff polynomials F1(z) and F2(z) + * F1(z) = [A(z) + z^M A(z^-1)] + * F2(z) = [A(z) - z^M A(z^-1)]/(1-z^-2) + * + * for (i=0; i 1.0f ) || ( a[M] < -1.0f ) ) + { + for ( i = 0; i < M; i++ ) + { + isp[i] = old_isp[i]; + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * isp2a() + * + * Convert ISPs to predictor coefficients a[] + *-------------------------------------------------------------------*/ + +void isp2a( + const float *isp, /* i : ISP vector (in the cosine domain) */ + float *a, /* o : LP filter coefficients */ + const int16_t m /* i : order of LP analysis */ +) +{ + float f1[NC16k + 1], f2[NC16k]; + int16_t i, j; + int16_t nc; + + nc = m / 2; + + /*-----------------------------------------------------------------* + * Find the polynomials F1(z) and F2(z) * + *-----------------------------------------------------------------*/ + + get_isppol( &isp[0], f1, nc ); + get_isppol( &isp[1], f2, (int16_t) ( nc - 1 ) ); + + /*-----------------------------------------------------------------* + * Multiply F2(z) by (1 - z^-2) * + *-----------------------------------------------------------------*/ + + for ( i = nc - 1; i > 1; i-- ) + { + f2[i] -= f2[i - 2]; + } + + /*-----------------------------------------------------------------* + * Scale F1(z) by (1+isp[m-1]) and F2(z) by (1-isp[m-1]) * + *-----------------------------------------------------------------*/ + + for ( i = 0; i < nc; i++ ) + { + f1[i] *= ( 1.0f + isp[m - 1] ); + f2[i] *= ( 1.0f - isp[m - 1] ); + } + + /*-----------------------------------------------------------------* + * A(z) = (F1(z)+F2(z))/2 * + * F1(z) is symmetric and F2(z) is asymmetric * + *-----------------------------------------------------------------*/ + + a[0] = 1.0f; + for ( i = 1, j = m - 1; i < nc; i++, j-- ) + { + a[i] = (float) ( 0.5f * ( f1[i] + f2[i] ) ); + a[j] = (float) ( 0.5f * ( f1[i] - f2[i] ) ); + } + a[nc] = (float) ( 0.5f * f1[nc] * ( 1.0f + isp[m - 1] ) ); + a[m] = isp[m - 1]; + + return; +} + +/*-------------------------------------------------------------------* + * a2lsp() + * + * Convert predictor coefficients a[] to LSPs + *-------------------------------------------------------------------*/ + +int16_t a2lsp( + float *freq, /* o : LSP vector */ + const float *a_in, /* i : predictor coefficients */ + const int16_t order /* i : order of LP analysis */ +) +{ + int16_t i, iswitch, offset, STEPindex; + int16_t lspnumber, root, notlast, order_by_2; + float temp, temp2; + float q[20], prev[2]; + float frequency, LastFreq, STEP; + const float *a; + float space_min; + + a = &( a_in[1] ); + order_by_2 = order / 2; + LastFreq = 0; + + /* calculate q[z] and p[z] , they are all stored in q */ + offset = order_by_2; + q[0] = (float) ( a[0] + a[order - 1] - 1.0 ); + q[offset] = (float) ( a[0] - a[order - 1] + 1.0 ); + for ( i = 1; i < order_by_2; i++ ) + { + q[i] = a[i] + a[order - 1 - i] - q[i - 1]; + q[i + offset] = a[i] - a[order - 1 - i] + q[i - 1 + offset]; + } + + q[order_by_2 - 1] = q[order_by_2 - 1] / 2; + q[order_by_2 - 1 + offset] = q[order_by_2 - 1 + offset] / 2; + + prev[0] = 9e9f; + prev[1] = 9e9f; + lspnumber = 0; + notlast = 1; + iswitch = 0; + frequency = 0; + + while ( notlast ) + { + root = 1; + offset = iswitch * order_by_2; + STEPindex = 0; /* Start with low resolution grid */ + STEP = STEPS[STEPindex]; + while ( root ) + { + temp = (float) cos( frequency * 6.2832 ); + if ( order >= 4 ) + { + temp2 = LPC_chebyshev( temp, q + offset, order_by_2 ); + } + else + { + temp2 = temp + q[0 + offset]; + } + + if ( ( temp2 * prev[iswitch] ) <= 0.0 || frequency >= 0.5 ) + { + if ( STEPindex == STEPSNUM - 1 ) + { + if ( fabs( temp2 ) < fabs( prev[iswitch] ) ) + { + freq[lspnumber] = frequency; + } + else + { + freq[lspnumber] = frequency - STEP; + } + if ( ( prev[iswitch] ) < 0.0 ) + { + prev[iswitch] = 9e9f; + } + else + { + prev[iswitch] = -9e9f; + } + root = 0; + frequency = LastFreq; + STEPindex = 0; + } + else + { + if ( STEPindex == 0 ) + { + LastFreq = frequency; + } + frequency -= STEPS[++STEPindex]; /* Go back one grid step */ + STEP = STEPS[STEPindex]; + } + } + else + { + prev[iswitch] = temp2; + frequency += STEP; + } + } /* while(root) */ + + lspnumber++; + if ( lspnumber > order - 1 ) + { + notlast = 0; + } + iswitch = 1 - iswitch; + } /* while (notlast) */ + + /* stability check */ + space_min = 1; + for ( i = 1; i < order; i++ ) + { + space_min = ( ( freq[i] - freq[i - 1] ) < space_min ) ? ( freq[i] - freq[i - 1] ) : space_min; + } + + if ( space_min <= 0 ) + { + return 0; + } + + return 1; +} + +/*-------------------------------------------------------------------* + * lsp2a() + * + * Convert LSPs to predictor coefficients a[] + *-------------------------------------------------------------------*/ + +void lsp2a( + float *pc_in, /* i/o: predictor coefficients */ + float *freq, /* i/o: LSP coefficients */ + const int16_t order /* i : order of LP analysis */ +) +{ + float p[LPC_SHB_ORDER], q[LPC_SHB_ORDER]; + float a[LPC_SHB_ORDER], a1[LPC_SHB_ORDER], a2[LPC_SHB_ORDER]; + float b[LPC_SHB_ORDER], b1[LPC_SHB_ORDER], b2[LPC_SHB_ORDER]; + + float xx; + int16_t i, k; + int16_t lspflag; + float *pc; + int16_t order_by_2; + + lspflag = 1; + pc = &( pc_in[1] ); + + order_by_2 = order / 2; + + /* check input for ill-conditioned cases */ + if ( ( freq[0] <= 0.0 ) || ( freq[order - 1] >= 0.5 ) ) + { + lspflag = 0; + + if ( freq[0] <= 0 ) + { + freq[0] = 0.022f; + } + + if ( freq[order - 1] >= 0.5 ) + { + freq[order - 1] = 0.499f; + } + } + + if ( !lspflag ) + { + xx = ( freq[order - 1] - freq[0] ) * recip_order[order]; + for ( i = 1; i < order; i++ ) + { + freq[i] = freq[i - 1] + xx; + } + } + + for ( i = 0; i <= order_by_2; i++ ) + { + a[i] = 0.; + a1[i] = 0.; + a2[i] = 0.; + b[i] = 0.; + b1[i] = 0.; + b2[i] = 0.; + } + + for ( i = 0; i < order_by_2; i++ ) + { + p[i] = (float) cos( 6.2832 * freq[2 * i] ); + q[i] = (float) cos( 6.2832 * freq[2 * i + 1] ); + } + + a[0] = 0.25f; + b[0] = 0.25f; + + for ( i = 0; i < order_by_2; i++ ) + { + a[i + 1] = a[i] - 2 * p[i] * a1[i] + a2[i]; + b[i + 1] = b[i] - 2 * q[i] * b1[i] + b2[i]; + a2[i] = a1[i]; + a1[i] = a[i]; + b2[i] = b1[i]; + b1[i] = b[i]; + } + a[0] = 0.25f; + b[0] = -0.25f; + + for ( i = 0; i < order_by_2; i++ ) + { + a[i + 1] = a[i] - 2 * p[i] * a1[i] + a2[i]; + b[i + 1] = b[i] - 2 * q[i] * b1[i] + b2[i]; + a2[i] = a1[i]; + a1[i] = a[i]; + b2[i] = b1[i]; + b1[i] = b[i]; + } + + pc[0] = 2 * ( a[order_by_2] + b[order_by_2] ); + + for ( k = 2; k <= order; k++ ) + { + a[0] = 0.0f; + b[0] = 0.0f; + + for ( i = 0; i < order_by_2; i++ ) + { + a[i + 1] = a[i] - 2 * p[i] * a1[i] + a2[i]; + b[i + 1] = b[i] - 2 * q[i] * b1[i] + b2[i]; + a2[i] = a1[i]; + a1[i] = a[i]; + b2[i] = b1[i]; + b1[i] = b[i]; + } + pc[k - 1] = 2 * ( a[order_by_2] + b[order_by_2] ); + } + + return; +} + +/*-----------------------------------------------------------* + * get_lsppol() + * + * Find the polynomial F1(z) or F2(z) from the LSPs. + * This is performed by expanding the product polynomials: + * + * F1(z) = product ( 1 - 2 LSF_i z^-1 + z^-2 ) + * i=0,2,4,..,n-2 + * F2(z) = product ( 1 - 2 LSF_i z^-1 + z^-2 ) + * i=1,3,5,..,n-1 + * + * where LSP_i are the LSPs in the cosine domain. + *-----------------------------------------------------------*/ + +static void get_lsppol( + const float lsp[], /* i : line spectral freq. (cosine domain) */ + float f[], /* o : the coefficients of F1 or F2 */ + const int16_t n, /* i : no of coefficients (m/2) */ + int16_t flag /* i : 1 ---> F1(z); 2 ---> F2(z) */ +) +{ + float b; + const float *plsp; + int16_t i, j; + + plsp = lsp + flag - 1; + + f[0] = 1.0f; + b = -2.0f * *plsp; + f[1] = b; + + for ( i = 2; i <= n; i++ ) + { + plsp += 2; + b = -2.0f * *plsp; + f[i] = b * f[i - 1] + 2.0f * f[i - 2]; + + for ( j = i - 1; j > 1; j-- ) + { + f[j] += b * f[j - 1] + f[j - 2]; + } + + f[1] += b; + } + + return; +} + +/*---------------------------------------------------------------------* + * a2lsp_stab() + * + * Compute the LSPs from the LPC coefficients a[] using Chebyshev + * polynomials. The found LSPs are in the cosine domain with values + * in the range from 1 down to -1. + * The table grid[] contains the points (in the cosine domain) at + * which the polynomials are evaluated. + * + * The ISPs are the roots of the two polynomials F1(z) and F2(z) + * defined as + * F1(z) = [A(z) + z^-M A(z^-1)]/ (1+z^-1) + * and F2(z) = [A(z) - z^-M A(z^-1)]/ (1-z^-1) + *---------------------------------------------------------------------*/ + +void a2lsp_stab( + const float *a, /* i : LP filter coefficients */ + float *lsp, /* o : LSP vector */ + const float *old_lsp /* i : LSP vector from past frame */ +) +{ + int16_t j, i, nf, ip; + float xlow, ylow, xhigh, yhigh, xmid, ymid, xint; + float *pf1, *pf2; + const float *pa1, *pa2; + float f1[NC + 1], f2[NC + 1]; + + /*-------------------------------------------------------------* + * find the sum and diff polynomials F1(z) and F2(z) * + * F1(z) = [A(z) + z^11 A(z^-1)]/(1+z^-1) * + * F2(z) = [A(z) - z^11 A(z^-1)]/(1-z^-1) * + *-------------------------------------------------------------*/ + + pf1 = f1; /* Equivalent code using indices */ + pf2 = f2; + *pf1++ = 1.0f; /* f1[0] = 1.0; */ + *pf2++ = 1.0f; /* f2[0] = 1.0; */ + pa1 = a + 1; + pa2 = a + M; + + for ( i = 0; i <= NC - 1; i++ ) /* for (i=1, j=M; i<=NC; i++, j--) */ + { + *pf1 = *pa1 + *pa2 - *( pf1 - 1 ); /* f1[i] = a[i]+a[j]-f1[i-1]; */ + *pf2 = *pa1++ - *pa2-- + *( pf2 - 1 ); /* f2[i] = a[i]-a[j]+f2[i-1]; */ + pf1++; + pf2++; + } + + /*---------------------------------------------------------------------* + * Find the LSPs (roots of F1(z) and F2(z) ) using the * + * Chebyshev polynomial evaluation. * + * The roots of F1(z) and F2(z) are alternatively searched. * + * We start by finding the first root of F1(z) then we switch * + * to F2(z) then back to F1(z) and so on until all roots are found. * + * * + * - Evaluate Chebyshev pol. at grid points and check for sign change.* + * - If sign change track the root by subdividing the interval * + * 4 times and ckecking sign change. * + *---------------------------------------------------------------------*/ + + nf = 0; /* number of found frequencies */ + ip = 0; /* flag to first polynomial */ + + pf1 = f1; /* start with F1(z) */ + + xlow = grid100[0]; + ylow = chebps2( xlow, pf1, NC ); + + j = 0; + while ( ( nf < M ) && ( j < GRID100_POINTS ) ) + { + j++; + xhigh = xlow; + yhigh = ylow; + xlow = grid100[j]; + ylow = chebps2( xlow, pf1, NC ); + + if ( ylow * yhigh <= 0.0 ) /* if sign change new root exists */ + { + j--; + /* divide the interval of sign change by NO_ITER */ + for ( i = 0; i < NO_ITER; i++ ) + { + xmid = 0.5f * ( xlow + xhigh ); + ymid = chebps2( xmid, pf1, NC ); + if ( ylow * ymid <= 0.0 ) + { + yhigh = ymid; + xhigh = xmid; + } + else + { + ylow = ymid; + xlow = xmid; + } + } + + /* linear interpolation for evaluating the root */ + ymid = ( yhigh - ylow ); + xint = xlow; + if ( ymid != 0 && ylow != 0 ) /* whenever ylow is 0, it doesn't make sense to compute the remaining part of the equation */ + { + xint -= ylow * ( xhigh - xlow ) / ( ymid ); + } + lsp[nf] = xint; /* new root */ + nf++; + ip = 1 - ip; /* flag to other polynomial */ + pf1 = ip ? f2 : f1; /* pointer to other polynomial */ + xlow = xint; + ylow = chebps2( xlow, pf1, NC ); + } + } + + /* Check if M roots found */ + /* if not use the LSPs from previous frame */ + if ( nf < M ) + { + + for ( i = 0; i < M; i++ ) + { + lsp[i] = old_lsp[i]; + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * lsp2a_stab() + * + * Convert LSPs to predictor coefficients A[] + *-------------------------------------------------------------------*/ + +void lsp2a_stab( + const float *lsp, /* i : LSF vector (in the cosine domain) */ + float *a, /* o : LP filter coefficients */ + const int16_t m /* i : order of LP analysis */ +) +{ + float f1[NC + 1], f2[NC + 1]; + int16_t i, k, nc; + float *pf1, *pf2, *pf1_1, *pf2_1, *pa1, *pa2; + + nc = m / 2; + + /*-----------------------------------------------------* + * Find the polynomials F1(z) and F2(z) * + *-----------------------------------------------------*/ + + get_lsppol( lsp, f1, nc, 1 ); + get_lsppol( lsp, f2, nc, 2 ); + + /*-----------------------------------------------------* + * Multiply F1(z) by (1+z^-1) and F2(z) by (1-z^-1) * + *-----------------------------------------------------*/ + + pf1 = f1 + nc; + pf1_1 = pf1 - 1; + pf2 = f2 + nc; /* Version using indices */ + pf2_1 = pf2 - 1; + k = nc - 1; + for ( i = 0; i <= k; i++ ) /* for (i = NC; i > 0; i--) */ + { + *pf1-- += *pf1_1--; /* f1[i] += f1[i-1]; */ + *pf2-- -= *pf2_1--; /* f2[i] -= f2[i-1]; */ + } + + /*-----------------------------------------------------* + * A(z) = (F1(z)+F2(z))/2 * + * F1(z) is symmetric and F2(z) is antisymmetric * + *-----------------------------------------------------*/ + + pa1 = a; + *pa1++ = 1.0; /* a[0] = 1.0; */ + pa2 = a + m; + pf1 = f1 + 1; + pf2 = f2 + 1; + for ( i = 0; i <= k; i++ ) /* for (i=1, j=M; i<=NC; i++, j--) */ + { + *pa1++ = 0.5f * ( *pf1 + *pf2 ); /* a[i] = 0.5*(f1[i] + f2[i]); */ + *pa2-- = 0.5f * ( *pf1++ - *pf2++ ); /* a[j] = 0.5*(f1[i] - f2[i]); */ + } + + return; +} + +/*--------------------------------------------------------------------------- + * reorder_lsf() + * + * To make sure that the LSFs are properly ordered and to keep a certain + * minimum distance between consecutive LSFs. + *--------------------------------------------------------------------------*/ + +void reorder_lsf( + float *lsf, /* i/o: LSF vector */ + const float min_dist, /* i : minimum required distance */ + const int16_t n, /* i : LPC order */ + const int32_t Fs /* i : sampling frequency */ +) +{ + int16_t i; + float lsf_min; + float lsf_max; + + /*-----------------------------------------------------------------* + * Verify the LSF ordering and minimum GAP + *-----------------------------------------------------------------*/ + + lsf_min = min_dist; + for ( i = 0; i < n; i++ ) + { + if ( lsf[i] < lsf_min ) + { + lsf[i] = lsf_min; + } + lsf_min = lsf[i] + min_dist; + } + + /*------------------------------------------------------------------------------------------* + * Reverify the LSF ordering and minimum GAP in the reverse order (security) + *------------------------------------------------------------------------------------------*/ + + lsf_max = Fs / 2.0f - min_dist; + + if ( lsf[n - 1] > lsf_max ) /* If danger of unstable filter in case of resonance in HF */ + { + for ( i = n - 1; i >= 0; i-- ) /* Reverify the minimum LSF gap in the reverse sens */ + { + if ( lsf[i] > lsf_max ) + { + lsf[i] = lsf_max; + } + + lsf_max = lsf[i] - min_dist; + } + } + + return; +} + +/*-------------------------------------------------------------------* + * space_lsfs() + * + *-------------------------------------------------------------------*/ + +void space_lsfs( + float *lsfs, /* i/o: Line spectral frequencies */ + const int16_t order /* i : order of LP analysis */ +) +{ + float delta; + int16_t i, flag = 1; + + while ( flag == 1 ) + { + flag = 0; + for ( i = 0; i <= order; i++ ) + { + delta = (float) ( i == 0 ? lsfs[0] : ( i == order ? 0.5f - lsfs[i - 1] : ( lsfs[i] - lsfs[i - 1] ) ) ); + if ( delta < SPC ) + { + flag = 1; + delta -= SPC_plus; + if ( i == order ) + { + lsfs[i - 1] += delta; + } + else + { + if ( i == 0 ) + { + lsfs[i] -= delta; + } + else + { + delta *= 0.5f; + lsfs[i - 1] += delta; + lsfs[i] -= delta; + } + } + } + } + } + + return; +} + +/*-------------------------------------------------------------------* + * lsp_weights() + * + *-------------------------------------------------------------------*/ + +void lsp_weights( + const float *lsps, /* i : Line spectral pairs */ + float *weight, /* o : weights */ + const int16_t order /* i : order of LP analysis */ +) +{ + int16_t i; + float delta1, delta2; + + for ( i = 0; i < order; i++ ) + { + delta1 = (float) ( ( i == 0 ) ? lsps[i] : lsps[i] - lsps[i - 1] ); + delta2 = (float) ( ( i == order - 1 ) ? 0.5f - lsps[i] : lsps[i + 1] - lsps[i] ); + + weight[i] = 250 * root_a_over_b( ALPHA_SQ, delta1 * delta2 ); + } + + if ( order != LPC_SHB_ORDER_WB ) + { + weight[3] *= 1.1f; + weight[4] *= 1.1f; + } + + return; +} + + +/*-----------------------------------------------------------------------* + * isf2isp() + * + * Transformation of ISF to ISP + * + * ISP are immitance spectral pairs in cosine domain (-1 to 1). + * ISF are immitance spectral pairs in frequency domain (0 to fs/2). + *-----------------------------------------------------------------------*/ + +void isf2isp( + const float isf[], /* i : isf[m] normalized (range: 0<=val<=fs/2) */ + float isp[], /* o : isp[m] (range: -1<=val<1) */ + const int16_t m, /* i : LPC order */ + const int32_t Fs /* i : sampling frequency */ +) +{ + int16_t i; + + for ( i = 0; i < m - 1; i++ ) + { + isp[i] = (float) cos( isf[i] * EVS_PI / ( Fs / 2.f ) ); + } + isp[m - 1] = (float) cos( isf[m - 1] * EVS_PI / ( Fs / 2.f ) * 2.0 ); + + return; +} + + +/*-----------------------------------------------------------------------* + * isp2isf() + * + * Transformation of ISP to ISF + * + * ISP are immitance spectral pair in cosine domain (-1 to 1). + * ISF are immitance spectral pair in frequency domain (0 to fs/2). + *-----------------------------------------------------------------------*/ + +void isp2isf( + const float isp[], /* i : isp[m] (range: -1<=val<1) */ + float isf[], /* o : isf[m] normalized (range: 0<=val<=fs/2) */ + const int16_t m, /* i : LPC order */ + const int32_t Fs /* i : sampling frequency */ +) +{ + int16_t i; + + /* convert ISPs to frequency domain 0..6400 */ + for ( i = 0; i < m - 1; i++ ) + { + isf[i] = (float) ( acos( isp[i] ) * ( ( Fs / 2.f ) / EVS_PI ) ); + } + isf[m - 1] = (float) ( acos( isp[m - 1] ) * ( ( Fs / 2.f ) / EVS_PI ) * 0.5f ); + + return; +} + +/*-------------------------------------------------------------------* + * a2rc() + * + * Convert from LPC to reflection coeff + *-------------------------------------------------------------------*/ + +void a2rc( + const float *a, /* i : LPC coefficients */ + float *refl, /* o : Reflection co-efficients */ + const int16_t lpcorder /* i : LPC order */ +) +{ + float f[M]; + int16_t m, j, n; + float km, denom, x; + + for ( m = 0; m < lpcorder; m++ ) + { + f[m] = -a[m]; + } + + /* Initialization */ + for ( m = lpcorder - 1; m >= 0; m-- ) + { + km = f[m]; + if ( km <= -1.0 || km >= 1.0 ) + { + for ( j = 0; j < lpcorder; j++ ) + { + refl[j] = 0.f; + } + + return; + } + + refl[m] = -km; + denom = 1.0f / ( 1.0f - km * km ); + + for ( j = 0; j < m / 2; j++ ) + { + n = m - 1 - j; + x = denom * f[j] + km * denom * f[n]; + f[n] = denom * f[n] + km * denom * f[j]; + f[j] = x; + } + + if ( m & 1 ) + { + f[j] = denom * f[j] + km * denom * f[j]; + } + } + + return; +} + + +/*----------------------------------------------------------------------------------* + * vq_dec_lvq() + * + * Multi-stage VQ decoder for LSF parameters, last stage LVQ + *----------------------------------------------------------------------------------*/ + +int16_t vq_dec_lvq( + int16_t sf_flag, /* i : safety net flag */ + float x[], /* o : Decoded vector */ + int16_t indices[], /* i : Indices */ + const int16_t stages, /* i : Number of stages */ + const int16_t N, /* i : Vector dimension */ + const int16_t mode, /* i : mode_lvq, or mode_lvq_p */ + const int16_t no_bits /* i : no. bits for lattice */ +) +{ + float x_lvq[16]; + int16_t i; + int16_t ber_flag; + + /* clear vector */ + set_f( x, 0, N ); + + /*-----------------------------------------------* + * add contribution of each stage + *-----------------------------------------------*/ + + if ( sf_flag == 1 ) + { + for ( i = 0; i < stages - 1; i++ ) + { + v_add( x, &Quantizers[CB_lsf[mode] + i][indices[i] * N], x, N ); + } + + ber_flag = deindex_lvq( &indices[stages - 1], x_lvq, mode, sf_flag, no_bits ); + } + else + { + for ( i = 0; i < stages - 1; i++ ) + { + v_add( x, &Quantizers_p[CB_p_lsf[mode] + i][indices[i] * N], x, N ); + } + + ber_flag = deindex_lvq( &indices[stages - 1], x_lvq, mode, sf_flag, no_bits ); + } + + v_add( x, x_lvq, x, N ); + + return ber_flag; +} + + +/*----------------------------------------------------------------------------------* + * lsf_allocate() + * + * Calculate number of stages and levels for each stage based on the allowed bit allocation + *----------------------------------------------------------------------------------*/ + +ivas_error lsf_allocate( + const int16_t nBits, /* i : Number of bits to use for quantization */ + const int16_t framemode, /* i : LSF quantizer mode */ + const int16_t framemode_p, /* i : ISF quantizer mode predmode (mode_lvq_p) */ + int16_t *stages0, /* o : Number of stages for safety-net quantizer */ + int16_t *stages1, /* o : Number of stages for predictive quantizer */ + int16_t levels0[], /* o : Number of vectors for each stage for SFNET */ + int16_t levels1[], /* o : Number of vectors for each stage for pred */ + int16_t bits0[], /* o : Number of bits for each stage safety net */ + int16_t bits1[] /* o : Number of bits for each stage pred */ +) +{ + int16_t i; + int16_t cumleft; + int16_t bits_lvq, n_stages, nbits0; + ivas_error error; + + error = IVAS_ERR_OK; + + /*---------------------------------------------------* + * Calculate bit allocation for safety-net quantizer + *---------------------------------------------------*/ + + cumleft = BitsVQ[framemode]; + bits_lvq = nBits - cumleft; + nbits0 = CBbits[framemode]; + if ( nbits0 > -1 ) + { + if ( nbits0 > 0 ) /* */ + { + n_stages = 2; + levels0[0] = CBsizes[nbits0]; + bits0[0] = nbits0; + bits0[1] = cumleft - nbits0; + + if ( bits0[1] == 0 ) + { + n_stages--; + } + else + { + levels0[1] = CBsizes[cumleft - nbits0]; + } + } + else /* no bits for VQ stage */ + { + n_stages = 0; + } + + *stages0 = n_stages; + if ( bits_lvq > 0 ) + { + bits0[n_stages] = bits_lvq; + levels0[n_stages] = bits_lvq; /* this is number of bits, not levels */ + *stages0 = n_stages + 1; + } + } + else + { + *stages0 = 0; + } + + /*---------------------------------------------------* + * Calculate bit allocation for predictive quantizer + *---------------------------------------------------*/ + + if ( framemode_p > -1 ) + { + cumleft = BitsVQ_p[framemode_p]; + bits_lvq = nBits - cumleft; + nbits0 = CBbits_p[framemode_p]; + + if ( nbits0 > -1 ) + { + if ( nbits0 > 0 ) + { + if ( framemode_p == 7 ) + { + /* for UNVOICED_WB only */ + n_stages = 3; + for ( i = 0; i < n_stages; i++ ) + { + levels1[i] = CBsizes[nbits0]; + bits1[i] = nbits0; + } + bits1[n_stages] = bits_lvq; + levels1[n_stages] = bits_lvq; + *stages1 = n_stages + 1; + } + else + { + n_stages = 1; + levels1[0] = CBsizes[nbits0]; + bits1[0] = nbits0; + nbits0 = cumleft - nbits0; + if ( nbits0 > 0 ) + { + levels1[1] = CBsizes[nbits0]; + bits1[1] = nbits0; + n_stages = 2; + } + + levels1[n_stages] = bits_lvq; /* this is number of bits, not levels */ + bits1[n_stages] = bits_lvq; + *stages1 = n_stages + 1; + } + } + else + { + *stages1 = 1; + bits1[0] = bits_lvq; + levels1[0] = bits_lvq; + } + } + } + + return error; +} + +/*----------------------------------------------------------------------------------* + * find_pred_mode() + * + * + *----------------------------------------------------------------------------------*/ + +ivas_error find_pred_mode( + int16_t *predmode, + const int16_t coder_type, + const int16_t bwidth, + const int32_t int_fs, + int16_t *p_mode_lvq, + int16_t *p_mode_lvq_p, + const int32_t core_brate ) +{ + int16_t idx; + ivas_error error; + + error = IVAS_ERR_OK; + + idx = bwidth; + if ( idx > 1 ) + { + idx = 1; + } + + if ( int_fs == INT_FS_16k ) + { + idx = 2; + } + else + { + if ( core_brate >= GENERIC_MA_LIMIT && coder_type == GENERIC && idx == 1 ) + { + idx = 3; + } + } + + *predmode = predmode_tab[idx][coder_type]; + + if ( idx <= 2 ) + { + *p_mode_lvq = NO_CODING_MODES * idx + coder_type; + if ( *predmode > 0 ) + { + *p_mode_lvq_p = *p_mode_lvq; + } + else + { + *p_mode_lvq_p = -1; + } + } + else /* WB 12.8 with MA pred in GENERIC*/ + { + *p_mode_lvq = NO_CODING_MODES + coder_type; + if ( coder_type == GENERIC ) + { + *p_mode_lvq_p = 18; + } + else + { + if ( *predmode > 0 ) + { + *p_mode_lvq_p = *p_mode_lvq; + } + else + { + *p_mode_lvq_p = -1; + } + } + } + + + return error; +} + + +/*--------------------------------------------------------------------------- + * reorder_isf() + * + * To make sure that the ISFs are properly ordered and to keep a certain + * minimum distance between consecutive ISFs. + *--------------------------------------------------------------------------*/ + +void reorder_isf( + float *isf, /* i/o: ISF vector */ + const float min_dist, /* i : minimum required distance */ + const int16_t n, /* i : LPC order */ + const float Fs /* i : sampling frequency */ +) +{ + int16_t i; + float isf_min; + float isf_max; + + /*-----------------------------------------------------------------* + * Verify the ISF ordering and minimum GAP + *-----------------------------------------------------------------*/ + + isf_min = min_dist; + for ( i = 0; i < n - 1; i++ ) + { + if ( isf[i] < isf_min ) + { + isf[i] = isf_min; + } + + isf_min = isf[i] + min_dist; + } + + /*------------------------------------------------------------------------------------------* + * Reverify the ISF ordering and minimum GAP in the reverse order (security) + *------------------------------------------------------------------------------------------*/ + + isf_max = Fs / 2.0f - min_dist; + + if ( isf[n - 2] > isf_max ) /* If danger of unstable filter in case of resonance in HF */ + { + for ( i = n - 2; i >= 0; i-- ) /* Reverify the minimum ISF gap in the reverse sens */ + { + if ( isf[i] > isf_max ) + { + isf[i] = isf_max; + } + + isf_max = isf[i] - min_dist; + } + } + + return; +} + +/*----------------------------------------------------------------------------------* + * lsf_stab() + * + * Check LSF stability (distance between old LSFs and current LSFs) + *----------------------------------------------------------------------------------*/ + +/*! r: LP filter stability */ +float lsf_stab( + const float *lsf, /* i : LSF vector */ + const float *lsfold, /* i : old LSF vector */ + const int16_t Opt_AMR_WB, /* i : flag indicating AMR-WB IO mode*/ + const int16_t L_frame /* i : frame length */ +) +{ + int16_t i, m; + float scale, stab_fac, tmp; + + tmp = 0.0f; + if ( Opt_AMR_WB ) + { + m = M - 1; + } + else + { + m = M; + } + + for ( i = 0; i < m; i++ ) + { + tmp += ( lsf[i] - lsfold[i] ) * ( lsf[i] - lsfold[i] ); + } + + scale = (float) L_FRAME / (float) L_frame; + scale *= scale; + + stab_fac = (float) ( 1.25f - ( scale * tmp / 400000.0f ) ); + + if ( stab_fac > 1.0f ) + { + stab_fac = 1.0f; + } + + if ( stab_fac < 0.0f ) + { + stab_fac = 0.0f; + } + return stab_fac; +} + + +/*--------------------------------------------------------------------- + * get_isppol() + * + * Find the polynomial F1(z) or F2(z) from the ISPs. + * This is performed by expanding the product polynomials: + * + * F1(z) = PRODUCT ( 1 - 2 isp_i z^-1 + z^-2 ) + * i=0,2,...,14 + * F2(z) = PRODUCT ( 1 - 2 isp_i z^-1 + z^-2 ) + * i=1,3,...,13 + * + * where isp_i are the ISPs in the cosine domain. + *---------------------------------------------------------------------*/ + +static void get_isppol( + const float *isp, /* i : Immitance spectral pairs (cosine domaine) */ + float f[], /* o : the coefficients of F1 or F2 */ + const int16_t n /* i : nb. of coefficients (m/2) */ +) +{ + float b; + int16_t i, j; + + f[0] = 1.0f; + b = (float) ( -2.0f * *isp ); + f[1] = b; + for ( i = 2; i <= n; i++ ) + { + isp += 2; + b = (float) ( -2.0f * *isp ); + f[i] = (float) ( b * f[i - 1] + 2.0f * f[i - 2] ); + + for ( j = i - 1; j > 1; j-- ) + { + f[j] += b * f[j - 1] + f[j - 2]; + } + f[1] += b; + } + + return; +} + + +/*--------------------------------------------------------------------- + * chebps2() + * + * Evaluates the Chebyshev polynomial series + * + * The polynomial order is + * n = m/2 (m is the prediction order) + * The polynomial is given by + * C(x) = f(0)T_n(x) + f(1)T_n-1(x) + ... +f(n-1)T_1(x) + f(n)/2 + *---------------------------------------------------------------------*/ + +/*! r: the value of the polynomial C(x) */ +static float chebps2( + const float x, /* i : value of evaluation; x=cos(freq) */ + const float *f, /* i : coefficients of sum or diff polyn. */ + const int16_t n /* i : order of polynomial */ +) +{ + float b1, b2, b0, x2; + int16_t i; + + x2 = (float) ( 2.0f * x ); + b2 = f[0]; + + b1 = x2 * b2 + f[1]; + + for ( i = 2; i < n; i++ ) + { + b0 = x2 * b1 - b2 + f[i]; + b2 = b1; + b1 = b0; + } + + return (float) ( x * b1 - b2 + 0.5f * f[n] ); +} + + +/*--------------------------------------------------------------------- + * LPC_chebyshev() + * + * Evaluate a series expansion in Chebyshev polynomials + * + * The polynomial order is + * n = m/2 (m is the prediction order) + * The polynomial is given by + * C(x) = T_n(x) + f(1)T_n-1(x) + ... +f(n-1)T_1(x) + f(n)/2 + *---------------------------------------------------------------------*/ + +static float LPC_chebyshev( + float x, + float f[], + const int16_t n ) +{ + float b1, b2, b0, x2, val; + int16_t i; + + x2 = 2.0f * x; + b2 = 1.0f; + b1 = x2 + f[0]; + + for ( i = 2; i < n; i++ ) + { + b0 = x2 * b1 - b2 + f[i - 1]; + + /* was previously casting x2 into float to have this + equation evaluated in float to be same + same as EVRC-B only code which has 2.0 in equation + instead of a float x2. This was causing non-bit-exactness + in a very very very rare corner case. + Doesnt really matter, but just to be picky! */ + b2 = b1; + b1 = b0; + } + + val = ( x * b1 - b2 + f[i - 1] ); + + return val; +} + + +/*-------------------------------------------------------------------* + * lsp2isp() + * + * Convert LSPs to ISPs via predictor coefficients A[] + *-------------------------------------------------------------------*/ + +void lsp2isp( + const float *lsp, /* i : LSP vector */ + float *isp, /* o : ISP filter coefficients */ + float *stable_isp, /* i/o: ISP filter coefficients */ + const int16_t m /* i : order of LP analysis */ +) +{ + float a[M + 1]; + + /* LSP --> A */ + lsp2a_stab( lsp, a, m ); + + /* A --> ISP */ + a2isp( a, isp, stable_isp ); + + /* Update to latest stable ISP */ + mvr2r( isp, stable_isp, M ); +} + +/*-------------------------------------------------------------------* + * isp2lsp() + * + * Convert ISPs to LSPs via predictor coefficients A[] + *-------------------------------------------------------------------*/ + +void isp2lsp( + const float *isp, /* i : LSP vector */ + float *lsp, /* o : ISP filter coefficients */ + float *stable_lsp, /* i/o: stable LSP filter coefficients */ + const int16_t m /* i : order of LP analysis */ +) +{ + float a[M + 1]; + + /* ISP --> A */ + isp2a( isp, a, m ); + + /* A --> LSP */ + a2lsp_stab( a, lsp, stable_lsp ); + + /* Update to latest stable LSP */ + mvr2r( lsp, stable_lsp, M ); +} + + +/*-------------------------------------------------------------------* + * lsf2isf() + * + * Convert LSPs to ISPs + *-------------------------------------------------------------------*/ + +void lsf2isf( + const float *lsf, /* i : LSF vector */ + float *isf, /* o : ISF vector */ + float *stable_isp, /* i/o: stable ISP filter coefficients */ + const int16_t m, /* i : order of LP analysis */ + const int32_t Fs ) +{ + float tmp_lsp[M]; + float tmp_isp[M]; + + /* LSF --> LSP */ + lsf2lsp( lsf, tmp_lsp, m, Fs ); + + /* LSP --> ISP */ + lsp2isp( tmp_lsp, tmp_isp, stable_isp, m ); + + /* ISP --> ISF */ + isp2isf( tmp_isp, isf, m, Fs ); + + return; +} + +/*-------------------------------------------------------------------* + * isf2lsf() + * + * Convert ISFs to LSFs + *-------------------------------------------------------------------*/ + +void isf2lsf( + const float *isf, /* i : ISF vector */ + float *lsf, /* o : LSF vector */ + float *stable_lsp, /* i/o: stable LSP filter coefficients */ + const int16_t m, /* i : order of LP analysis */ + const int32_t Fs ) +{ + float tmp_isp[M]; + float tmp_lsp[M]; + + /* ISF --> ISP */ + isf2isp( isf, tmp_isp, m, Fs ); + + /* ISP --> LSP */ + isp2lsp( tmp_isp, tmp_lsp, stable_lsp, m ); + + /* LSP --> LSF */ + lsp2lsf( tmp_lsp, lsf, m, Fs ); + + return; +} + +/*-----------------------------------------------------------------------* + * lsp2lsf() + * + * Transformation of LSPs to LSFs + * + * LSP are line spectral pair in cosine domain (-1 to 1). + * LSF are line spectral frequencies (0 to fs/2). + *-----------------------------------------------------------------------*/ + +void lsp2lsf( + const float lsp[], /* i : isp[m] (range: -1<=val<1) */ + float lsf[], /* o : isf[m] normalized (range: 0<=val<=fs/2) */ + const int16_t m, /* i : LPC order */ + const int32_t Fs /* i : sampling frequency */ +) +{ + int16_t i; + + /* convert LSPs to LSFs */ + for ( i = 0; i < m; i++ ) + { + lsf[i] = (float) ( acos( lsp[i] ) * ( ( Fs / 2.f ) / EVS_PI ) ); + } + + return; +} + +/*-----------------------------------------------------------------------* + * lsf2lsp() + * + * Transformation of LSFs to LSPs + * + * LSP are line spectral pairs in cosine domain (-1 to 1). + * LSF are line spectral frequencies (0 to fs/2). + *-----------------------------------------------------------------------*/ + +void lsf2lsp( + const float lsf[], /* i : isf[m] normalized (range: 0<=val<=fs/2) */ + float lsp[], /* o : isp[m] (range: -1<=val<1) */ + const int16_t m, /* i : LPC order */ + const int32_t Fs /* i : sampling frequency */ +) +{ + int16_t i; + + /* convert LSFs to LSPs */ + for ( i = 0; i < m; i++ ) + { + lsp[i] = (float) cos( lsf[i] * EVS_PI / ( Fs / 2.f ) ); + } + + return; +} + + +/*--------------------------------------------------------------------------- + * tcvq_Dec() + * + * + *--------------------------------------------------------------------------*/ + +static void tcvq_Dec( + int16_t *ind, + float *d_out, + const int16_t safety_net ) +{ + int16_t i; + int16_t index[9]; + int16_t stage, state, branch[N_STAGE], codeword[N_STAGE]; + int16_t fins, iwd; + float pred[N_DIM]; + float D[N_STAGE_VQ][N_DIM]; + const float( *TCVQ_CB_SUB1 )[128][2], ( *TCVQ_CB_SUB2 )[64][2], ( *TCVQ_CB_SUB3 )[32][2]; + const float( *IntraCoeff )[2][2]; + + mvs2s( ind, index, 9 ); + + if ( safety_net ) + { + TCVQ_CB_SUB1 = SN_TCVQ_CB_SUB1; + TCVQ_CB_SUB2 = SN_TCVQ_CB_SUB2; + TCVQ_CB_SUB3 = SN_TCVQ_CB_SUB3; + IntraCoeff = SN_IntraCoeff; + } + else + { + TCVQ_CB_SUB1 = AR_TCVQ_CB_SUB1; + TCVQ_CB_SUB2 = AR_TCVQ_CB_SUB2; + TCVQ_CB_SUB3 = AR_TCVQ_CB_SUB3; + IntraCoeff = AR_IntraCoeff; + } + + /* Decode Final state */ + fins = index[0] & 15; + + /* Decode Branch info */ + branch[0] = index[1] >> 4; + branch[1] = index[2] >> 4; + + for ( stage = 2; stage < N_STAGE_VQ - 4; stage++ ) + { + branch[stage] = index[stage + 1] >> 3; + } + + branch[4] = fins & 0x1; + branch[5] = ( fins >> 1 ) & 0x1; + branch[6] = ( fins >> 2 ) & 0x1; + branch[7] = ( fins >> 3 ) & 0x1; + + /* Decode Codeword info */ + for ( stage = 0; stage < 2; stage++ ) + { + codeword[stage] = ( index[stage + 1] & 15 ) << 3; + } + + for ( stage = 2; stage < N_STAGE_VQ - 4; stage++ ) + { + codeword[stage] = ( index[stage + 1] & 7 ) << 3; + } + + for ( stage = N_STAGE_VQ - 4; stage < N_STAGE_VQ; stage++ ) + { + codeword[stage] = ( index[stage + 1] & 3 ) << 3; + } + + state = ( fins >> 2 ) << 2; + + /* stage #1 */ + iwd = NTRANS2[branch[0] + 2][state] + codeword[0]; + D[0][0] = TCVQ_CB_SUB1[0][iwd][0]; + D[0][1] = TCVQ_CB_SUB1[0][iwd][1]; + state = NTRANS2[branch[0]][state]; + + /* stage #2 */ + pred[0] = IntraCoeff[0][0][0] * D[0][0] + IntraCoeff[0][0][1] * D[0][1]; + pred[1] = IntraCoeff[0][1][0] * D[0][0] + IntraCoeff[0][1][1] * D[0][1]; + + iwd = NTRANS2[branch[1] + 2][state] + codeword[1]; + D[1][0] = TCVQ_CB_SUB1[1][iwd][0] + pred[0]; + D[1][1] = TCVQ_CB_SUB1[1][iwd][1] + pred[1]; + state = NTRANS2[branch[1]][state]; + + /* stage #3 - #4 */ + for ( stage = 2; stage < N_STAGE_VQ - 4; stage++ ) + { + pred[0] = IntraCoeff[stage - 1][0][0] * D[stage - 1][0] + IntraCoeff[stage - 1][0][1] * D[stage - 1][1]; + pred[1] = IntraCoeff[stage - 1][1][0] * D[stage - 1][0] + IntraCoeff[stage - 1][1][1] * D[stage - 1][1]; + + iwd = NTRANS2[branch[stage] + 2][state] + codeword[stage]; + D[stage][0] = TCVQ_CB_SUB2[stage - 2][iwd][0] + pred[0]; + D[stage][1] = TCVQ_CB_SUB2[stage - 2][iwd][1] + pred[1]; + state = NTRANS2[branch[stage]][state]; + } + + /* stage #5 - #8 */ + for ( stage = N_STAGE_VQ - 4; stage < N_STAGE_VQ; stage++ ) + { + pred[0] = IntraCoeff[stage - 1][0][0] * D[stage - 1][0] + IntraCoeff[stage - 1][0][1] * D[stage - 1][1]; + pred[1] = IntraCoeff[stage - 1][1][0] * D[stage - 1][0] + IntraCoeff[stage - 1][1][1] * D[stage - 1][1]; + + iwd = NTRANS2[branch[stage] + 2][state] + codeword[stage]; + D[stage][0] = TCVQ_CB_SUB3[stage - 4][iwd][0] + pred[0]; + D[stage][1] = TCVQ_CB_SUB3[stage - 4][iwd][1] + pred[1]; + state = NTRANS2[branch[stage]][state]; + } + + for ( stage = 0; stage < N_STAGE_VQ; stage++ ) + { + for ( i = 0; i < N_DIM; i++ ) + { + d_out[( N_DIM * stage ) + i] = D[stage][i]; + } + } + return; +} + +/*--------------------------------------------------------------------------- + * qlsf_ARSN_tcvq_Dec_16k() + * + * Predictive BC-TCQ encoder for LSF quantization + *--------------------------------------------------------------------------*/ + +int16_t qlsf_ARSN_tcvq_Dec_16k( + float *y, /* o : Quantized LSF vector */ + int16_t *indice, /* i : Indices */ + const int16_t nBits /* i : number of bits */ +) +{ + int16_t i; + float error_svq_q[M]; + int16_t safety_net; + + /* Select Mode */ + safety_net = indice[0]; + + if ( safety_net == 1 ) + { + tcvq_Dec( &indice[1], y, safety_net ); + + if ( nBits > 30 ) + { + for ( i = 0; i < 8; i++ ) + { + error_svq_q[i] = AR_SVQ_CB1[indice[10]][i]; + error_svq_q[i + 8] = AR_SVQ_CB2[indice[11]][i]; + } + + for ( i = 0; i < M; i++ ) + { + y[i] = y[i] + error_svq_q[i] * scale_ARSN[i]; + } + } + } + else + { + tcvq_Dec( &indice[1], y, safety_net ); + + if ( nBits > 30 ) + { + for ( i = 0; i < 8; i++ ) + { + error_svq_q[i] = AR_SVQ_CB1[indice[10]][i]; + error_svq_q[i + 8] = AR_SVQ_CB2[indice[11]][i]; + } + + for ( i = 0; i < M; i++ ) + { + y[i] = y[i] + error_svq_q[i]; + } + } + } + + return safety_net; +} + + +/*-------------------------------------------------------------------* + * lsf_syn_mem_backup() + * + * back-up synthesis filter memory and LSF qunatizer memories (used in SC-VBR) + *-------------------------------------------------------------------*/ + +void lsf_syn_mem_backup( + Encoder_State *st, /* i : state structure */ + float *btilt_code, /* i : tilt code */ + float *bgc_threshold, /* i : */ + float *clip_var_bck, /* o : */ + int16_t *next_force_sf_bck, /* o : */ + float *lsp_new, /* i : LSP vector to quantize */ + float *lsp_mid, /* i : mid-frame LSP vector */ + float *clip_var, /* o : pitch clipping state var */ + float *mem_AR, /* o : quantizer memory for AR model */ + float *mem_MA, /* o : quantizer memory for AR model */ + float *lsp_new_bck, /* o : LSP vector to quantize- backup */ + float *lsp_mid_bck, /* o : mid-frame LSP vector - backup */ + float *Bin_E, /* o : FFT Bin energy 128 *2 sets */ + float *Bin_E_old, /* o : FFT Bin energy 128 sets */ + float *mem_syn_bck, /* o : synthesis filter memory */ + float *mem_w0_bck, /* o : memory of the weighting filter */ + float *streaklimit, + int16_t *pstreaklen ) +{ + int16_t i; + LPD_state_HANDLE hLPDmem = st->hLPDmem; + + *clip_var = st->clip_var[0]; + + for ( i = 0; i < M; i++ ) + { + mem_AR[i] = st->mem_AR[i]; + mem_MA[i] = st->mem_MA[i]; + lsp_new_bck[i] = lsp_new[i]; + lsp_mid_bck[i] = lsp_mid[i]; + } + + *streaklimit = st->streaklimit; + *pstreaklen = st->pstreaklen; + + for ( i = 0; i < L_FFT; i++ ) + { + Bin_E[i] = st->Bin_E[i]; + } + + for ( i = 0; i < ( L_FFT / 2 ); i++ ) + { + Bin_E_old[i] = st->Bin_E_old[i]; + } + + /* back-up memories */ + for ( i = 0; i < M; i++ ) + { + mem_syn_bck[i] = hLPDmem->mem_syn[i]; + } + + *mem_w0_bck = hLPDmem->mem_w0; + + *btilt_code = hLPDmem->tilt_code; + *bgc_threshold = hLPDmem->gc_threshold; + mvr2r( st->clip_var, clip_var_bck, 6 ); + *next_force_sf_bck = st->next_force_safety_net; + + return; +} + + +/*-------------------------------------------------------------------* + * lsf_syn_mem_restore() + * + * restore synthesis filter memory and LSF quantizer memories + *-------------------------------------------------------------------*/ + +void lsf_syn_mem_restore( + Encoder_State *st, /* o : state structure */ + float btilt_code, /* i : */ + float gc_threshold, /* i : */ + float *clip_var_bck, /* i : */ + int16_t next_force_sf_bck, /* i : */ + float *lsp_new, /* o : LSP vector to quantize */ + float *lsp_mid, /* o : mid-frame LSP vector */ + float clip_var, /* i : pitch clipping state var */ + float *mem_AR, /* i : quantizer memory for AR model */ + float *mem_MA, /* i : quantizer memory for AR model */ + float *lsp_new_bck, /* i : LSP vector to quantize- backup */ + float *lsp_mid_bck, /* i : mid-frame LSP vector - backup */ + float *Bin_E, /* i : FFT Bin energy 128 *2 sets */ + float *Bin_E_old, /* i : FFT Bin energy 128 sets */ + float *mem_syn_bck, /* i : synthesis filter memory */ + float mem_w0_bck, /* i : memory of the weighting filter */ + const float streaklimit, + const int16_t pstreaklen ) +{ + int16_t i; + LPD_state_HANDLE hLPDmem = st->hLPDmem; + + /* restore lsf memories */ + st->clip_var[0] = clip_var; + + for ( i = 0; i < M; i++ ) + { + st->mem_AR[i] = mem_AR[i]; + st->mem_MA[i] = mem_MA[i]; + lsp_new[i] = lsp_new_bck[i]; + lsp_mid[i] = lsp_mid_bck[i]; + } + + st->streaklimit = streaklimit; + st->pstreaklen = pstreaklen; + + for ( i = 0; i < L_FFT; i++ ) + { + st->Bin_E[i] = Bin_E[i]; + } + + for ( i = 0; i < ( L_FFT / 2 ); i++ ) + { + st->Bin_E_old[i] = Bin_E_old[i]; + } + + /* restoring memories */ + hLPDmem->mem_w0 = mem_w0_bck; + + for ( i = 0; i < M; i++ ) + { + hLPDmem->mem_syn[i] = mem_syn_bck[i]; + } + + hLPDmem->tilt_code = btilt_code; + hLPDmem->gc_threshold = gc_threshold; + mvr2r( clip_var_bck, st->clip_var, 6 ); + st->next_force_safety_net = next_force_sf_bck; + + return; +} + + +/*--------------------------------------------------------------------------* + * lsf_update_memory() + * + * + *--------------------------------------------------------------------------*/ + +void lsf_update_memory( + const int16_t narrowband, /* i : narrowband flag */ + const float qlsf[], /* i : quantized lsf coefficients */ + float old_mem_MA[], /* i : MA memory */ + float mem_MA[] /* o : updated MA memory */ +) +{ + int16_t i; + + for ( i = 0; i < M; ++i ) + { + mem_MA[i] = qlsf[i] - lsf_means[narrowband][i] - MU_MA * old_mem_MA[i]; + } + + return; +} + +/*--------------------------------------------------------------------------* + * tcxlpc_get_cdk() + * + * + *--------------------------------------------------------------------------*/ + +/*! r: codebook index */ +int16_t tcxlpc_get_cdk( + const int16_t coder_type /* i : GC/VC indicator */ +) +{ + int16_t cdk; + + cdk = ( coder_type == VOICED ); + + return cdk; +} + + +/*--------------------------------------------------------------------------* + * dec_FDCNG_MSVQ_stage1() + * + * + *--------------------------------------------------------------------------*/ + +void dec_FDCNG_MSVQ_stage1( + int16_t j_full, /* i : index full range */ + int16_t n, /* i : dimension to generate */ + const float *invTrfMatrix, /* i : IDCT matrix for synthesis */ + const DCTTYPE idcttype, /* i : specify which IDCT */ + float *uq, /* o : synthesized stage1 vector */ + Word16 *uq_ind /* o : synthesized stage1 vector in BASOP */ +) +{ + int16_t col, segm_ind, j; + float dct_vec[FDCNG_VQ_MAX_LEN]; + float idct_vec[FDCNG_VQ_MAX_LEN]; + const Word8 *cbpW8; + const Word16 *dct_col_shift_tab; + + assert( n <= FDCNG_VQ_MAX_LEN ); + assert( n >= FDCNG_VQ_DCT_MINTRUNC ); + + segm_ind = 0; + for ( col = 1; col <= FDCNG_VQ_DCT_NSEGM; col++ ) + { + if ( j_full >= cdk1_ivas_cum_entries_per_segment[col] ) + { + segm_ind++; + } + } + + j = j_full - cdk1_ivas_cum_entries_per_segment[segm_ind]; /* j is the local segment index */ + + assert( j < cdk1_ivas_entries_per_segment[segm_ind] ); + + /* Word8 column variable Qx storage*/ + cbpW8 = cdk_37bits_ivas_stage1_W8Qx_dct_sections[segm_ind]; /* Word8 storage fixed ptr_init */ + cbpW8 += j * cdk1_ivas_cols_per_segment[segm_ind]; /* adaptive ptr init */ + dct_col_shift_tab = stage1_dct_col_syn_shift[segm_ind]; + + for ( col = 0; col < cdk1_ivas_cols_per_segment[segm_ind]; col++ ) + { + dct_vec[col] = (float) shl( (Word16) cbpW8[col], dct_col_shift_tab[col] ); + /* LOGIC( 1 ) , SHIFT( 1 ); + in BASOP: s_and(for W8->W16), shl() + */ + } + dctT2_N_apply_matrix( (const float *) dct_vec, idct_vec, cdk1_ivas_cols_per_segment[segm_ind], n, invTrfMatrix, FDCNG_VQ_DCT_MAXTRUNC, idcttype ); + + /*scale down to original fdcngvq domain and move to Q0 */ + v_multc( idct_vec, fdcng_dct_scaleF[1], idct_vec, n ); + /* fdcng_dct_scaleF[1] --> 0.0625-->scale down from search Q4 domain to Q0 , + not really relevant for BASOP loop */ + + /*add common mid fdcng vector, in fdcng bands domain */ + v_add( idct_vec, cdk1r_tr_midQ_truncQ, uq, n ); + assert( uq_ind == NULL ); + + return; +} + + +/*--------------------------------------------------------------------------* + * msvq_dec() + * + * + *--------------------------------------------------------------------------*/ + +void msvq_dec( + const float *const *cb, /* i : Codebook (indexed cb[*stages][levels][p]) */ + const int16_t dims[], /* i : Dimension of each codebook stage (NULL: full dim.) */ + const int16_t offs[], /* i : Starting dimension of each codebook stage (NULL: 0) */ + const int16_t stages, /* i : Number of stages */ + const int16_t N, /* i : Vector dimension */ + const int16_t maxN, /* i : Codebook dimension */ + const int16_t Idx[], /* i : Indices */ + const int16_t applyIDCT_flag, /* i : applyIDCT flag */ + const float *invTrfMatrix, /* i : matrix for IDCT synthesis */ + float *uq, /* o : quantized vector */ + Word16 *uq_ind /* o : quantized vector (fixed point) */ +) +{ + int16_t i, n, maxn, start; + Word16 j; + set_zero( uq, N ); + + if ( uq_ind ) + { + for ( i = 0; i < N; ++i ) + { + uq_ind[i] = 0; + move16(); + } + } + for ( i = 0; i < stages; i++ ) + { + if ( dims ) + { + n = dims[i]; + maxn = n; + } + else + { + n = N; + maxn = maxN; + } + if ( offs ) + { + start = offs[i]; + } + else + { + start = 0; + } + + if ( i == 0 && applyIDCT_flag != 0 ) + { + assert( start == 0 ); + dec_FDCNG_MSVQ_stage1( Idx[0], N, invTrfMatrix, IDCT_T2_XX_24, uq, uq_ind ); /* IDCT_T2 N=24 used for all synthesis */ + } + else + { + v_add( uq + start, cb[i] + Idx[i] * maxn, uq + start, n ); + } + +#define WMC_TOOL_SKIP + IF( uq_ind != NULL ) + { + FOR( j = 0; j < n; ++j ) + { + move16(); + uq_ind[start + j] = add( uq_ind[start + j], (Word16) ( cb[i][Idx[i] * maxn + j] * 2.0f * 1.28f ) ); + } + } +#undef WMC_TOOL_SKIP + } + + return; +} + + +/*--------------------------------------------------------------------------* + * spec2isf() + * + * + *--------------------------------------------------------------------------*/ + +static void spec2isf( + float spec_r[], /* input spectrum real part (only left half + one zero)*/ + float spec_i[], /* input spectrum imag part (only left half+right halt with zeros)*/ + const int16_t speclen, /* length of spectrum (only left half)*/ + float lsf[], + /* locations of LSFs (buffer must be sufficiently long) */ /*15Q16*/ + const float old_lsf[] /* locations of LSFs (buffer must be sufficiently long) */ /*15Q16*/ +) +{ + /*spec_r[] needs a 0 in the end!*/ + float s; + int16_t specix, lsfix, i; + + specix = lsfix = 0; + s = spec_r[specix++]; + + while ( ( specix < speclen ) && lsfix <= 15 ) + { + + /*check for next zero crossing*/ + for ( ; s * spec_r[specix] >= 0; specix++ ) + { + ; + } + + lsf[lsfix++] = ( specix - 1 + spec_r[specix - 1] / ( spec_r[specix - 1] - spec_r[specix] ) ) * ( 12800 / 256 ); + + /*check for the next zero crossing*/ + for ( ; s * spec_i[specix] >= 0; specix++ ) + { + ; + } + + lsf[lsfix++] = ( specix - 1 + spec_i[specix - 1] / ( spec_i[specix - 1] - spec_i[specix] ) ) * ( 12800 / 256 ); + + spec_r[speclen] = s; + spec_i[speclen] = s; + + s = -s; + } + + if ( lsfix < 16 ) + { + for ( i = 0; i < 16; i++ ) + { + lsf[i] = old_lsf[i]; + } + } + + return; +} + +/*--------------------------------------------------------------------------* + * a2isf() + * + * + *--------------------------------------------------------------------------*/ + +#define SCALE1_HALF 1018.59161376953f + +typedef struct +{ + float re; + float im; +} Pfloat; + +void a2isf( + float *a, + float *isf, + const float *old_isf, + const int16_t lpcOrder ) +{ + float RealFFT[128]; + float ImagFFT[128]; + float RealOut[130]; + float ImagOut[130]; + float *ptrReal; + float *ptrImag; + int16_t n, i, j; + const Pfloat *ptwiddle; + Pfloat *pwn17, pwn[128], *pwn15, tmpw15; + int16_t N = 256; + float s[4]; + float L_tmp, L_tmp1; + float lpc[19], fftTmpRe[16], fftTmpIm[16]; + Pfloat twid[128]; + float c; + + set_zero( fftTmpRe, 16 ); + set_zero( fftTmpIm, 16 ); + + /* half length FFT */ + /*c = [sum(a) ((-1).^(1:length(a)))*a];*/ + + L_tmp = 0; + for ( j = 0; j <= lpcOrder; j++ ) + { + L_tmp += a[j]; + } + + L_tmp1 = 0; + for ( j = 0; j < lpcOrder / 2; j++ ) + { + L_tmp1 -= a[2 * j]; + L_tmp1 += a[2 * j + 1]; + } + L_tmp1 -= a[2 * j]; + + /*s = [1 -2*(c(1)-c(2))/(c(1)+c(2)) 1]';*/ + s[0] = 1; + if ( ( L_tmp + L_tmp1 ) != 0 ) + { + s[1] = -2 * ( ( L_tmp - L_tmp1 ) / ( L_tmp + L_tmp1 ) ); + } + else + { + s[1] = 1; + } + s[2] = 1; + + lpc[0] = a[0] * s[0]; + L_tmp = a[1] * s[0]; + lpc[1] = L_tmp + ( a[1 - 1] * s[1] ); + + + for ( n = 2; n < 17; n++ ) + { + L_tmp = a[n] * s[0]; + L_tmp += ( a[n - 1] * s[1] ); + lpc[n] = L_tmp + ( a[n - 2] * s[2] ); + } + lpc[18] = a[16] * s[0]; + L_tmp = a[15] * s[0]; + lpc[17] = L_tmp + ( a[16] * s[1] ); + + + ptrReal = RealFFT; + ptrImag = ImagFFT; + + for ( j = 0; j < 9; j++ ) + { + fftTmpRe[j] = lpc[2 * j]; + fftTmpIm[j] = lpc[2 * j + 1]; + } + fftTmpRe[j] = lpc[2 * j]; + fftTmpIm[j] = 0; + j++; + + for ( ; j < 16; j++ ) + { + fftTmpRe[j] = 0; + fftTmpIm[j] = 0; + } + + DoRTFTn( fftTmpRe, fftTmpIm, 16 ); + + for ( j = 0; j < 16; j++ ) + { + ptrReal[j * 8] = fftTmpRe[j]; + ptrImag[j * 8] = fftTmpIm[j]; + } + + ptrReal++; + ptrImag++; + + for ( i = 1; i < 8; i++ ) + { + /*X=x(i:8:M/8) .* exp(-j*2*pi*i*(0:M/8-1)/M);*/ + ptwiddle = (const Pfloat *) w_a[i - 1]; + + fftTmpRe[0] = lpc[0]; + fftTmpIm[0] = lpc[1]; + + for ( j = 1; j < 9; j++ ) + { + fftTmpRe[j] = ( lpc[2 * j] * ptwiddle->re ) - ( lpc[2 * j + 1] * ptwiddle->im ); + fftTmpIm[j] = ( lpc[2 * j + 1] * ptwiddle->re ) + ( lpc[2 * j] * ptwiddle->im ); + ptwiddle++; + } + + fftTmpRe[j] = lpc[2 * j] * ptwiddle->re; + fftTmpIm[j] = lpc[2 * j] * ptwiddle->im; + ptwiddle++; + j++; + for ( ; j < 16; j++ ) + { + fftTmpRe[j] = 0; + fftTmpIm[j] = 0; + ptwiddle++; + } + + DoRTFTn( fftTmpRe, fftTmpIm, 16 ); + + for ( j = 0; j < 16; j++ ) + { + ptrReal[j * 8] = fftTmpRe[j]; + ptrImag[j * 8] = fftTmpIm[j]; + } + + ptrReal++; + ptrImag++; + } + + c = EVS_PI / ( 2.0f * (float) 128 ); + + for ( i = 1; i < 128; i++ ) + { + twid[i - 1].im = (float) sin( c * ( 2.0f * (float) i ) ); + twid[i - 1].re = (float) cos( c * ( 2.0f * (float) i ) ); + } + ptwiddle = twid; + + /* pre-twiddle */ + for ( i = 1; i < 128; i++ ) + { + pwn[i - 1].im = (float) sin( c * ( 18.0f * (float) i ) ); + pwn[i - 1].re = (float) cos( c * ( 18.0f * (float) i ) ); + } + + pwn17 = pwn; + pwn15 = &tmpw15; + + /*Y(1) = real(X(1)) + imag(X(1));*/ + RealOut[0] = ( RealFFT[0] + ImagFFT[0] ); + ImagOut[0] = 0; + + /*Y(N/2+1) = 0.5*(X(1) + conj(X(1))).*exp(pi*i*128*(18)/N) - i*0.5*(X(1) - conj(X(1))).*exp(pi*i*128*(16)/N);*/ + RealOut[128] = 0; + ImagOut[128] = ( RealFFT[0] + RealFFT[0] ) - ( ImagFFT[0] + ImagFFT[0] ); + + /*Y(2:N/2) = (0.5*(X(2:N/2) + conj(X(N/2:-1:2))) - i*0.5*(X(2:N/2) - conj(X(N/2:-1:2))).*exp(-pi*i*r*(2)/N)).*exp(pi*i*r*(18)/N);*/ + for ( i = 1; i < N / 2; i++ ) + { + float ReAr = ( RealFFT[i] + RealFFT[N / 2 - i] ); + float ReBr = ( RealFFT[N / 2 - i] - RealFFT[i] ); + float ImAr = ( ImagFFT[i] - ImagFFT[N / 2 - i] ); + float ImBr = -( ImagFFT[i] + ImagFFT[N / 2 - i] ); + + tmpw15.re = ( ptwiddle->re * pwn17->re ) + ( ptwiddle->im * pwn17->im ); + tmpw15.im = ( ptwiddle->re * pwn17->im ) - ( ptwiddle->im * pwn17->re ); + + /*RealOut[i] = mac_r(L_msu(L_msu(L_mult(ReAr, pwn17->re),ImAr, pwn17->im), ReBr, pwn15->v.im), ImBr, pwn15->re); move16();*/ + RealOut[i] = ( ReAr * pwn17->re ) - ( ImAr * pwn17->im ) - ( ( ReBr * pwn15->im ) + ( ImBr * pwn15->re ) ); + ImagOut[i] = ( ReAr * pwn17->im ) + ( ImAr * pwn17->re ) + ( ReBr * pwn15->re ) - ( ImBr * pwn15->im ); + + ptwiddle++; + pwn17++; + } + + spec2isf( RealOut, ImagOut, 128, isf, old_isf ); + + isf[lpcOrder - 1] = (Float32) ( acos( a[lpcOrder] ) * SCALE1_HALF ); + + return; +} + + +/*-------------------------------------------------------------------* + * dctT2_N_apply_matrix() + * + * dct/idct truncated matrix appl. for DCT basis vector lengths of N + *-------------------------------------------------------------------*/ + +void dctT2_N_apply_matrix( + const float *input, /* i : input in fdcng or DCT(fdcng) domain */ + float *output, /* o : output in DCT(fdcng) or fdcng ordomain */ + const int16_t dct_dim, /* i : dct processing dim possibly truncated */ + const int16_t fdcngvq_dim, /* i : fdcng domain length */ + const float *matrix, /* i : IDCT matrix */ + const int16_t matrix_row_dim, /* i : */ + const DCTTYPE dcttype /* i : matrix operation type */ +) +{ + int16_t i, j, dim_in, dim_out; + int16_t mat_step_col, mat_step_row, mat_step_col_flag; + const float *pt_x, *pt_A; + float tmp_y[FDCNG_VQ_MAX_LEN]; + float *pt_y; + + /* non-square DCT_N and IDCT_N matrix application, + using a stored format of an IDCT_Nx(FDCNG_VQ_DCT_MAXTRUNC) matrix */ + /* efficiently parallelized in SIMD */ + + assert( dct_dim <= FDCNG_VQ_DCT_MAXTRUNC ); + assert( fdcngvq_dim <= FDCNG_VQ_MAX_LEN ); + + if ( ( dcttype & 1 ) == 0 ) /* even entries are DCTs */ + { + /* DCT_typeII 24,21 -> XX in worst case */ + dim_in = fdcngvq_dim; + dim_out = dct_dim; + mat_step_col = matrix_row_dim; /* matrix maximum storage size dependent, width of first row in matrix */ + mat_step_row = 0; + mat_step_col_flag = 1; + assert( dcttype == DCT_T2_21_XX || dcttype == DCT_T2_24_XX ); + } + else + { + assert( ( dcttype & 1 ) != 0 ); /* idct */ + dim_in = dct_dim; + dim_out = fdcngvq_dim; + mat_step_col = 1; + mat_step_row = matrix_row_dim; + mat_step_col_flag = 0; + assert( dcttype == IDCT_T2_XX_24 ); + } + + pt_y = tmp_y; + for ( i = 0; i < dim_out; i++ ) + { + pt_x = input; + *pt_y = 0; + + /* +i(DCT) or +i*maxTrunc(IDCT) */ +#define WMC_TOOL_SKIP + pt_A = &( matrix[i * ( mat_step_row + mat_step_col_flag )] ); /* ptr indexing */ + PTR_INIT( 1 ); +#undef WMC_TOOL_SKIP + for ( j = 0; j < dim_in; j++ ) + { +#define WMC_TOOL_SKIP + *pt_y += ( *pt_x++ ) * ( *pt_A ); + pt_A += mat_step_col; /* step +maxtrunc or +1 */ /* ptr indexing*/ + MAC( 1 ); +#undef WMC_TOOL_SKIP + } + pt_y++; + } + + mvr2r( tmp_y, output, dim_out ); + + return; +} + + +/*-------------------------------------------------------------------* + * extend_dctN_input() + * + * (inputN, dctN) -> idct(N_ext) idct_N matrix application loop for + * extending, extrapolating a DCT basis vector length of N to N_ext + *-------------------------------------------------------------------*/ + +void extend_dctN_input( + const float *input, /* i : input in fdcng domain */ + const float *dct_input, /* i : input in dctN(fdcng) domain */ + const int16_t in_dim, /* i : in_dim == N */ + float *ext_sig, /* o : extended output in fdcng domain */ + const int16_t out_dim, /* i : output total dim */ + float *matrix, /* i : idct synthesis matrix N rows, n_cols columns */ + const int16_t n_cols, /* i : number of columns == DCT truncation length */ + const DCTTYPE dcttype /* i : matrix operation type */ +) +{ + int16_t i, j, i_rev; + const float( *ptr )[FDCNG_VQ_DCT_MAXTRUNC] = (void *) matrix; + + /* stored format is an IDCT_Nx(FDCNG_VQ_DCT_MAXTRUNC) matrix */ + assert( in_dim < FDCNG_VQ_MAX_LEN ); + assert( out_dim <= FDCNG_VQ_MAX_LEN ); + assert( out_dim > in_dim ); + assert( n_cols == FDCNG_VQ_DCT_MAXTRUNC ); /* for *ptr[MAX_TRUNC] adressing*/ + assert( ( dcttype & 1 ) != 0 ); /* idct tables always in use for this basis vector extension */ + + mvr2r( input, ext_sig, in_dim ); /* copy initial part, i.e. only last/tail parts are extended */ + set_f( &( ext_sig[in_dim] ), 0.0, out_dim - in_dim ); + + i_rev = in_dim; /*ptr init*/ + for ( i = in_dim; i < out_dim; i++ ) + { /* for each extension sample */ + /* i = 21 22 23; + i_rev = 20 19 18; for odd dctII reflect basis vector + */ + i_rev--; + + for ( j = 0; j < n_cols; j++ ) /* for each available DCT coeff */ + { + /* DCTcoeff * reflected basis vector */ +#define WMC_TOOL_SKIP + /* pure ptr MAC operations */ + ext_sig[i] += dct_input[j] * ptr[i_rev][j]; /* sum up scaled and extended basis vector */ + MAC( 1 ); +#undef WMC_TOOL_SKIP + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * create_IDCT_N_Matrix() + * + * inititate idct24 FDCNG_VQ_DCT_MAXTRUNCx N matrix in + * RAM from a quantized compressed ROM format + *-------------------------------------------------------------------*/ + +void create_IDCT_N_Matrix( + float *inv_matrixFloatQ, /* i/o: RAM buffer */ + const int16_t N, /* i : DCT length, number of time samples */ + const int16_t n_cols, /* i : number of dct coeffs (as DCT may be truncated) */ + const int16_t alloc_size /* i : RAM buffer size in elements */ +) +{ + int16_t c, c1, r, r_flip, W16_val; + int16_t len; + int16_t mat_cpy_size; + const Word16 *absval_ptr; + const Word8 *idx_ptr; + Word16 idx; + float( *ptr )[FDCNG_VQ_DCT_MAXTRUNC] = (void *) inv_matrixFloatQ; /* fixed number of columns pointers, to simplifies adressing in ANSIC */ + + absval_ptr = unique_idctT2_24coeffsQ16; + idx_ptr = idctT2_24_compressed_idx; + len = FDCNG_VQ_MAX_LEN; + + if ( N == FDCNG_VQ_MAX_LEN_WB ) + { + absval_ptr = unique_idctT2_21coeffsQ16; + idx_ptr = idctT2_21_compressed_idx; + len = N; + } + + assert( alloc_size >= ( n_cols * len ) ); /* enough space for the full expanded IDCT matrix */ + assert( N <= len ); + + mat_cpy_size = ( n_cols ) * ( len >> 1 ); /* NB integer division of "len" */ + + if ( ( len & 1 ) != 0 ) + { /* odd sized DCT with a non-reflected center row */ + mat_cpy_size += n_cols; + } + + for ( c = 0; c < mat_cpy_size; c++ ) + { + idx = (Word16) ( idx_ptr[c] ); + W16_val = absval_ptr[abs( idx )]; + + if ( idx < 0 ) + { + W16_val = -( W16_val ); + } + inv_matrixFloatQ[c] = ( +1.52587890625e-05f ) * ( (float) W16_val ); /* 1.0/2.^16 scaling to a float-"Q0" , a scaling that is not done in BASOP */ + } + + /* for even number of coeffs DCT24, + flip symmetry for odd, even is used to save 50% IDCT Table ROM */ + /* for an odd DCT center is not flipped e.g for DCT21 */ + + assert( n_cols == FDCNG_VQ_DCT_MAXTRUNC ); + assert( ( n_cols & 1 ) == 0 ); + + for ( c = 0; c < ( n_cols ); c += 2 ) + { + c1 = c + 1; + r_flip = len - 1; + for ( r = 0; r < ( len / 2 ); r++, r_flip-- ) + { +#define WMC_TOOL_SKIP + ptr[r_flip][c] = ptr[r][c]; /* flipped */ + ptr[r_flip][c1] = -( ptr[r][c1] ); /* flipped and sign swapped */ + MOVE( 2 ); + MULT( 1 ); /* for negate */ +#undef WMC_TOOL_SKIP + } + } + + return; +} diff --git a/lib_com/lsp_conv_poly.c b/lib_com/lsp_conv_poly.c new file mode 100644 index 0000000000000000000000000000000000000000..ee567b3e8053341d6b5e319d00b3bac6a4edc0e3 --- /dev/null +++ b/lib_com/lsp_conv_poly.c @@ -0,0 +1,661 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * Local constants + *-------------------------------------------------------------------*/ + +/* The conversion modes. */ +#define DOWNCONV 0 +#define UPCONV 1 +/* The cap of the inverse power spectrum. */ +#define MAXPOWERSPECT 1e-5f +#define N50 GRID50_POINTS +#define N40 GRID40_POINTS + + +/*-------------------------------------------------------------------* + * Local function prototypes + *-------------------------------------------------------------------*/ + +static void powerspect( const float x[], const int16_t N, float R[], float S[], float G[], const int16_t mode ); + +static void spectautocorr( const float x[], const int16_t N, const float G[], float r[] ); + +static void zeros2poly( float x[], float R[], float S[] ); + +static void polydecomp( float A[], float P[], float Q[] ); + +static void cheb2poly( float P[] ); + + +/*---------------------------------------------------------------------* + * lsp_convert_poly() + * + * Converts the LP filter estimated at 16.0 kHz sampling rate down + * 12.8 kHz frequency scale or alternatively from 12.8 kHz up to + * 16.0 kHz. The former is called down conversation and latter up + * conversion. The resulting LP filter is characterized with its + * line spectrum pairs. The original Lp filter can be either in + * its immittance, used for the AMR-WB IO mode, or line spectrum + * pair representation. + * + * The conversion is based the autocorrelation computed from the + * power spectrum of the LP filter that is truncated or extrapolated + * to the desired frequency scale. + *---------------------------------------------------------------------*/ + +int16_t lsp_convert_poly( + float w[], /* i/o: LSP or ISP parameters */ + const int16_t L_frame, /* i : flag for up or down conversion */ + const int16_t Opt_AMRWB /* i : flag for the AMR-WB IO mode */ +) +{ + float epsP[M + 1]; + float G[GRID50_POINTS], r[M + 1], A[M + 1], A_old[M + 1], R[NC + 1], S[NC + 1]; + int16_t i; + int16_t flag; + + /*---------------------------------------------------------------------* + * Because AMR-WB IO uses immittance spectrum frequency representation + * instead of line spectrum frequency representation, the input + * parameters do not give the zeros of the polynomials R(x) and S(x). + * Hence R(x) and S(x) are formed via the polynomial A(z) of the linear + * prediction filter. + *---------------------------------------------------------------------*/ + + if ( Opt_AMRWB ) + { + isp2a( w, A_old, M ); + polydecomp( A_old, R, S ); + } + + /*---------------------------------------------------------------------* + * Form the polynomials R(x) and S(x) from their zeros that are the + * line spectrum pairs of A(z). The polynomial coefficients can be + * scaled for convenience, because scaling will not affect the + * resulting LP coefficients. Scaling by 128 gives the correct offset + * to the power spectrum for n = 16. + *---------------------------------------------------------------------*/ + + else + { + zeros2poly( w, R, S ); + for ( i = 0; i <= NC; i++ ) + { + R[i] *= 128.0f; + S[i] *= 128.0f; + } + lsp2a_stab( w, A_old, M ); + } + + /*---------------------------------------------------------------------* + * Conversion from 16.0 kHz down to 12.8 kHz. The power spectrum + * needs to be computed only up to 6.4 kHz, because the upper band + * is omitted. + *---------------------------------------------------------------------*/ + + if ( L_frame == L_FRAME ) + { + powerspect( grid50, N50, R, S, G, DOWNCONV ); + spectautocorr( grid40, N40, G, r ); + } + + /*---------------------------------------------------------------------* + * Conversion from 12.8 kHz up to 16.0 kHz. + * Compute the power spectrum of the LP filter, extrapolate the + * power spectrum from 6.4 kHz to 8.0 kHz, and compute auto- + * correlation on this power spectrum. + *---------------------------------------------------------------------*/ + + else + { + powerspect( grid40, N40, R, S, G, UPCONV ); + for ( i = N40; i < N50; i++ ) + { + G[i] = G[N40 - 1]; + } + + spectautocorr( grid50, N50, G, r ); + } + + /*---------------------------------------------------------------------* + * Compute the linear prediction coefficients from the autocorrelation + * and convert to line spectrum pairs. + *---------------------------------------------------------------------*/ + + flag = lev_dur( A, r, M, epsP ); + a2lsp_stab( A, w, stable_LSP ); + + return ( flag ); +} + + +/*---------------------------------------------------------------------* + * powerspect() + * + * Computes the power spectrum G(w) = 1/|A(w)|^2 at N points on + * the real axis x = cos w by utilizing the line spectrum frequency + * decomposition + * + * A(z) = (P(z) + Q(z))/2, + * + * where assuming A(z) of an even degree n, + * + * P(z) = [A(z) + z^(n+1) A(1/z)]/(1/z + 1), + * Q(z) = [A(z) - z^(n+1) A(1/z)]/(1/z - 1). + * + * The zeros of these polynomials give the line spectrum frequencies + * of A(z). It can be shown that for an even n, + * + * |A(x)|^2 = 2 (1 + x) R(x)^2 + 2 (1 - x) S(x)^2, + * + * where x = cos w, and R(x) and S(x) are the direct polynomials + * resulting from the Chebyshev series representation of P(z) + * and Q(z). + * + * This routine assumes the grid X = 1, x[0], x[1], .., x[m-1], + * -, ..., -x[1], -x[0], -1 such that x[i] = cos((i+1)*pi/N) for + * evaluating the power spectrum. Only m = (N-1)/2 - 1 grid points + * need to be stored, because cos(0) and cos(pi/2) are trivial, + * and the points above pi/2 are obtained readily using the symmetry + * of cosine. + * + * The power spectrum can be scaled as a*G[], where a is chosen + * for convenience. This is because the scaling has no impact on + * the LP coefficients to be determined based on the power spectrum. + *---------------------------------------------------------------------*/ + +static void powerspect( + const float x[], /* i : Grid points x[0:N-1] */ + const int16_t N, /* i : Number of grid points */ + float R[], /* i : Coefficients of R(x) in R[0:NC] */ + float S[], /* i : Coefficients of S(x) in S[0:NC] */ + float G[], /* o : Power spectrum G[0:N] */ + const int16_t mode /* i : Flag for up or down conversion */ +) +{ + float re, ro, se, so; + float s0, s1, r0, r1, x0, x1, x2; + Word16 i, j; + Word16 iuni, imid; + + /* init buffer */ + for ( i = 0; i < N; i++ ) + { + G[i] = 0; + } + /*---------------------------------------------------------------------* + * Down conversion yields iuni unique grid points that do not have + * symmetric counterparts above x = cos(pi/2) = 0. + * Set the mid point of the frequency grid. + *---------------------------------------------------------------------*/ + + if ( mode == DOWNCONV ) + { + iuni = ( GRID50_POINTS - 1 ) / 5 - 1; + imid = ( GRID50_POINTS - 1 ) / 2; + } + + /*---------------------------------------------------------------------* + * Power spectrum at x = cos(pi) = -1 that is not needed in down + * conversion. Set the mid point of the frequency grid. + *---------------------------------------------------------------------*/ + + else + { + iuni = 0; + imid = ( GRID40_POINTS - 1 ) / 2; + + s0 = S[0]; + for ( j = 1; j <= NC; j++ ) + { + s0 = S[j] - s0; + } + G[N - 1] = 4.0f * s0 * s0; + } + + /*---------------------------------------------------------------------* + * Power spectrum at x = cos(0) = 1. + *---------------------------------------------------------------------*/ + + r0 = R[0]; + for ( j = 1; j <= NC; j++ ) + { + r0 += R[j]; + } + r0 = max( r0, 0.000000953674316f ); + G[0] = 4.0f * r0 * r0; + + /*---------------------------------------------------------------------* + * Power spectrum at x = cos(pi/2) = 0. + *---------------------------------------------------------------------*/ + + r0 = R[NC]; + s0 = S[NC]; + r0 = r0 * r0; + s0 = s0 * s0; + + G[imid] = 2.0f * ( r0 + s0 ); + + /*---------------------------------------------------------------------* + * Power spectrum at unique points that do not have symmetric + * counterparts at x > cos(pi/2) = 0. + *---------------------------------------------------------------------*/ + + for ( i = 1; i <= iuni; i++ ) + { + x0 = x[i - 1]; + r0 = R[0]; + s0 = S[0]; + + for ( j = 1; j <= NC; j++ ) + { + r0 = x0 * r0 + R[j]; + s0 = x0 * s0 + S[j]; + } + r0 = ( 1.0f + x0 ) * r0 * r0; + s0 = ( 1.0f - x0 ) * s0 * s0; + + G[i] = 2.0f * ( r0 + s0 ); + } + + /*---------------------------------------------------------------------* + * Power spectrum at points other than x = -1, 0, and 1 and unique + * points is computed using the anti-symmetry of the grid relative + * to the midpoint x = 0 in order to reduce looping. + *---------------------------------------------------------------------*/ + + for ( ; i < imid; i++ ) + { + x0 = x[i - 1]; + x2 = x0 * x0; + + re = R[0]; + se = S[0]; + ro = R[1]; + so = S[1]; + + for ( j = 2; j < NC; j += 2 ) + { + re = x2 * re + R[j]; + ro = x2 * ro + R[j + 1]; + se = x2 * se + S[j]; + so = x2 * so + S[j + 1]; + } + + re = x2 * re + R[j]; + ro *= x0; + se = x2 * se + S[j]; + so *= x0; + + r0 = re + ro; + s0 = se + so; + r1 = re - ro; + s1 = se - so; + + x1 = 1.0f + x0; + x2 = 1.0f - x0; + + r0 = x1 * r0 * r0; + s0 = x2 * s0 * s0; + r1 = x2 * r1 * r1; + s1 = x1 * s1 * s1; + + G[i] = 2.0f * ( r0 + s0 ); + G[N - i - 1] = 2.0f * ( r1 + s1 ); + } + + /*---------------------------------------------------------------------* + * Compute the power spectrum 1/|A(x)|^2 from |A(x)|^2 with logic + * to prevent division by small number and upper bound the spectrum. + * This upper bound is implicit in fixed point arithmetic, but is + * needed explicitly in floating point implementations to avoid numeric + * problems. + *---------------------------------------------------------------------*/ + + for ( i = 0; i < N; i++ ) + { + if ( G[i] < MAXPOWERSPECT ) + { + G[i] = MAXPOWERSPECT; + } + G[i] = 1.0f / G[i]; + } + return; +} + +/*---------------------------------------------------------------------* + * spectautocorr() + * + * Computes the autocorrelation r[j] for j = 0, 1, ..., M from + * the power spectrum P(w) by using the rectangle rule to + * approximate the integral + * + * 1 pi + * r[j] = --- I P(w) cos(j*w) dw. + * 2*pi -pi + * + * It is sufficient to evaluate the integrand only from w = 0 to + * w = pi due to the symmetry P(-w) = P(w). We can further + * employ the relation + * + * cos(j*(pi - w)) = (-1)^j cos(j*w) + * + * to use symmetries relative to w = pi/2 for w in (0, pi/2). + * + * When applying the rectangle rule, it is convenient to evaluate + * w = 0, w = pi/2, and w = pi separately. By using a frequency + * grid of N points, we can express the rectangle rule as + * + * r[j] = G[0] + 2*a*G[(N-1)/2] + b*G[N-1] + * + * M + * + 2 sum (G[i] - G[N-i-1]) cos(j*x[i]) + * i=1 + * + * where G[i] is the power spectrum at x[i] = i*pi/(N-1) and + * M = (N-1)/2 - 1 is the number of the grid points in the + * interval(0, pi/2). The number of grid points N is assumed odd. + * + * The coefficients + * + * b = (-1)^j + * a = (1 + (-1)^(j+1))(-1)^floor(j/2) + * + * follow from the properties of the cosine function. The + * computation further uses the recursion + * + * cos(j*w) = 2*cos(w)*cos((j-1)*w) - cos((j-2)*w) + * + * Note that the autocorrelation can be scaled for convenience, + * because this scaling has no impact on the LP coefficients to be + * calculated from the autocorrelation. The expression of r[j] thus + * omits the division by N. + * + * See the powerspect function on the definition of the grid. + * + * References + * J. Makhoul, "Spectral linear prediction: properties and + * applications," IEEE Trans. on Acoustics, Speech and Signal + * Processing, Vol. 23, No. 3, pp.283-296, June 1975 + *---------------------------------------------------------------------*/ + +static void spectautocorr( + const float x[], /* i : Grid points x[0:N-1] */ + const int16_t N, /* i : Number of grid points */ + const float G[], /* i : Power spectrum G[0:N-1] */ + float r[] /* o : Autocorrelation r[0:M] */ +) +{ + float c[M + 1]; /* c[j] = cos(j*w) */ + float gp, gn, c2; + Word16 i, j; + Word16 imid; + + /*---------------------------------------------------------------------* + * The midpoint of the cosine table x of N entries. Only the entries + * x[0] = cos(d), x[1] = cos(2*d), ..., x[imid-1] = cos((imid-1)*d) + * need to be stored due to trivial cos(0), cos(pi/2), cos(pi), and + * symmetry relative to pi/2. Here d = pi/(N - 1). + *---------------------------------------------------------------------*/ + + imid = ( N - 1 ) / 2; + + /*---------------------------------------------------------------------* + * Autocorrelation r[j] at zero lag j = 0 for the upper half of the + * unit circle, but excluding the points x = cos(0) and x = cos(pi). + *---------------------------------------------------------------------*/ + + r[0] = G[1]; + for ( i = 2; i < N - 1; i++ ) + { + r[0] += G[i]; + } + + /*---------------------------------------------------------------------* + * Initialize the autocorrelation r[j] at lags greater than zero + * by adding the midpoint x = cos(pi/2) = 0. + *---------------------------------------------------------------------*/ + + r[1] = 0.0f; + r[2] = -G[imid]; + + for ( j = 3; j < M; j += 2 ) + { + r[j] = 0.0f; + r[j + 1] = -r[j - 1]; + } + + /*---------------------------------------------------------------------* + * Autocorrelation r[j] at lags j = 1, 2, ..., M. The computation + * employes the relation cos(j*(pi - w)) = (-1)^j cos(j*w) and + * cos(j*w) = 2*cos(w)*cos((j-1)*w) - cos((j-2)*w) for obtaining + * the cosine c[j] = cos(j*w). + *---------------------------------------------------------------------*/ + + c[0] = 1.0f; + + for ( i = 1; i < imid; i++ ) + { + gp = G[i] + G[N - i - 1]; + gn = G[i] - G[N - i - 1]; + + c[1] = x[i - 1]; + c2 = 2.0f * c[1]; + + r[1] += gn * c[1]; + + for ( j = 2; j < M; j += 2 ) + { + c[j] = c2 * c[j - 1] - c[j - 2]; + r[j] += gp * c[j]; + c[j + 1] = c2 * c[j] - c[j - 1]; + r[j + 1] += gn * c[j + 1]; + } + + c[j] = c2 * c[j - 1] - c[j - 2]; + r[j] += gp * c[j]; + } + + /*---------------------------------------------------------------------* + * Add the endpoints x = cos(0) = 1 and x = cos(pi) = -1 as + * well as the lower half of the unit circle. + *---------------------------------------------------------------------*/ + + gp = G[0] + G[N - 1]; + gn = G[0] - G[N - 1]; + + for ( j = 0; j < M; j += 2 ) + { + r[j] = 2.0f * r[j] + gp; + r[j + 1] = 2.0f * r[j + 1] + gn; + } + r[j] = 2.0f * r[j] + gp; + + return; +} + +/*---------------------------------------------------------------------* + * zeros2poly() + * + * Computes the coefficients of the polynomials + * + * R(x) = prod (x - x[i]), + * i = 0,2,4,... + * + * S(x) = prod (x - x[i]), + * i = 1,3,5,... + * + * given their zeros x[i] for i = 0, 1, ..., n-1. The routine + * assumes n = 1 or even n greater than or equal to 4. + * + * The polynomial coefficients are returned in R[0:n/2-1] and + * S[0:n/2-1]. The leading coefficients are in R[0] and S[0]. + * + * In this implementation, n is set to a compile time constant. + *---------------------------------------------------------------------*/ + +static void zeros2poly( + float x[], /* i : Zeros of R(x) and S(x) */ + float R[], /* o : Coefficients of R(x) */ + float S[] /* o : Coefficients of S(x) */ +) +{ + float xr, xs; + Word16 i, j; + + R[0] = 1.0f; + R[1] = -*x++; + S[0] = 1.0f; + S[1] = -*x++; + + for ( i = 2; i <= NC; i++ ) + { + xr = -*x++; + xs = -*x++; + + R[i] = xr * R[i - 1]; + S[i] = xs * S[i - 1]; + + for ( j = i - 1; j > 0; j-- ) + { + R[j] += xr * R[j - 1]; + S[j] += xs * S[j - 1]; + } + } + + return; +} + +/*---------------------------------------------------------------------* + * polydecomp() + * + * Computes the coefficients of the symmetric and antisymmetric + * polynomials P(z) and Q(z) that define the line spectrum pair + * decomposition of a given polynomial A(z) of order n. For even n, + * + * P(z) = [A(z) + z^(n+1) A(1/z)]/(1/z + 1), + * Q(z) = [A(z) - z^(n+1) A(1/z)]/(1/z - 1), + * + * These polynomials are then expressed in their direct form, + * respectively, R(x) and S(x), on the real axis x = cos w using + * explicit Chebyshev polynomials of the first kind. + * + * The coefficients of the polynomials R(x) and S(x) are returned + * in R[0:n/2] and S[0:n/2] for the given linear prediction + * coefficients A[0:n/2]. Note that R(x) and S(x) are formed in + * place such that P(z) is stored in the same array than R(x), + * and Q(z) is stored in the same array than S(x). + * + * The routines assumes n = 16. + *---------------------------------------------------------------------*/ + +static void polydecomp( + float A[], /* i : linear prediction coefficients */ + float R[], /* o : coefficients of R(x) */ + float S[] /* o : coefficients of S(x) */ +) +{ + float *P = &R[0], *Q = &S[0]; + Word16 i, j; + + P[0] = A[0]; + Q[0] = A[0]; + for ( i = 1, j = M; i <= NC; i++, j-- ) + { + P[i] = A[i] + A[j] - P[i - 1]; + Q[i] = A[i] - A[j] + Q[i - 1]; + } + + cheb2poly( P ); + cheb2poly( Q ); + + return; +} + +/*---------------------------------------------------------------------* + * cheb2poly() + * + * Computes the coefficients of the explicit Chebyshev polynomial + * P(x) = P[0]*x^n + P[1]*x^(n-1) + ... + P[n] given the coefficients + * of the series + * + * C(x) = C[0]*T_n(x) + C[1]*T_n-1(x) + ... + C[n]*T_0(x), + * + * where T_n(x) is the nth Chebyshev polynomial of the first kind. + * This implementation assumes C[0] = 1. Only the value n = 8 is + * supported. + * + * The conversion from C(x) to P(x) is done in place such that the + * coefficients of C(x) are given in P[0:8] and those of P(x) are + * returned in the same array. + *---------------------------------------------------------------------*/ + +static void cheb2poly( + float P[] /* i/o: The coefficients of C(x) and P(x) */ +) +{ + float c1, c2, c3, c4, c5, c6, c7, c8; + + c1 = P[1]; + c2 = P[2]; + c3 = P[3]; + c4 = P[4]; + c5 = P[5]; + c6 = P[6]; + c7 = P[7]; + c8 = P[8]; + + P[0] = 128.0f; + P[1] = 64.0f * c1; + P[2] = 32.0f * c2 - 256.0f; + P[3] = 16.0f * c3 - 112.0f * c1; + P[4] = 160.0f - 48.0f * c2 + 8.0f * c4; + P[5] = 56.0f * c1 - 20.0f * c3 + 4.0f * c5; + P[6] = 18.0f * c2 - 32.0f - 8.0f * c4 + 2.0f * c6; + P[7] = 5.0f * c3 - 7.0f * c1 - 3.0f * c5 + c7; + P[8] = 1.0f - c2 + c4 - c6 + 0.5f * c8; + + return; +} diff --git a/lib_com/mime.h b/lib_com/mime.h new file mode 100644 index 0000000000000000000000000000000000000000..56f2fb4db96c6281ff0f0c57484480e56be8dd02 --- /dev/null +++ b/lib_com/mime.h @@ -0,0 +1,447 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ +#ifndef MIME_H +#define MIME_H + +#include +#include +#include "options.h" +#include "typedef.h" + +#define AMRWB_MAGIC_NUMBER "#!AMR-WB\n" /* defined in RFC4867 */ +#define EVS_MAGIC_NUMBER "#!EVS_MC1.0\n" /* defined in 26.445 */ + +static const Word32 AMRWB_IOmode2rate[16] = { + 6600, /* AMRWB_IO_6600 */ + 8850, /* AMRWB_IO_8850 */ + 12650, /* AMRWB_IO_1265 */ + 14250, /* AMRWB_IO_1425 */ + 15850, /* AMRWB_IO_1585 */ + 18250, /* AMRWB_IO_1825 */ + 19850, /* AMRWB_IO_1985 */ + 23050, /* AMRWB_IO_2305 */ + 23850, /* AMRWB_IO_2385 */ + 1750, /* AMRWB_IO_SID */ + -1, /* AMRWB_IO_FUT1 */ + -1, /* AMRWB_IO_FUT2 */ + -1, /* AMRWB_IO_FUT3 */ + -1, /* AMRWB_IO_FUT4 */ + 0, /* SPEECH_BAD */ + 0 /* NO_DATA */ +}; + +static const Word32 PRIMARYmode2rate[16] = { + 2800, /* PRIMARY_2800 */ + 7200, /* PRIMARY_7200 */ + 8000, /* PRIMARY_8000 */ + 9600, /* PRIMARY_9600 */ + 13200, /* PRIMARY_13200 */ + 16400, /* PRIMARY_16400 */ + 24400, /* PRIMARY_24400 */ + 32000, /* PRIMARY_32000 */ + 48000, /* PRIMARY_48000 */ + 64000, /* PRIMARY_64000 */ + 96000, /* PRIMARY_96000 */ + 128000, /* PRIMARY_128000 */ + 2400, /* PRIMARY_SID */ + -1, /* PRIMARY_FUT1 */ + 0, /* SPEECH_LOST */ + 0 /* NO_DATA */ +}; + +/* sorting tables for all AMR-WB IO modes */ + +static const Word16 sort_660[132] = { + 0, 5, 6, 7, 61, 84, 107, 130, 62, 85, + 8, 4, 37, 38, 39, 40, 58, 81, 104, 127, + 60, 83, 106, 129, 108, 131, 128, 41, 42, 80, + 126, 1, 3, 57, 103, 82, 105, 59, 2, 63, + 109, 110, 86, 19, 22, 23, 64, 87, 18, 20, + 21, 17, 13, 88, 43, 89, 65, 111, 14, 24, + 25, 26, 27, 28, 15, 16, 44, 90, 66, 112, + 9, 11, 10, 12, 67, 113, 29, 30, 31, 32, + 34, 33, 35, 36, 45, 51, 68, 74, 91, 97, + 114, 120, 46, 69, 92, 115, 52, 75, 98, 121, + 47, 70, 93, 116, 53, 76, 99, 122, 48, 71, + 94, 117, 54, 77, 100, 123, 49, 72, 95, 118, + 55, 78, 101, 124, 50, 73, 96, 119, 56, 79, + 102, 125 +}; + +static const Word16 sort_885[177] = { + 0, 4, 6, 7, 5, 3, 47, 48, 49, 112, + 113, 114, 75, 106, 140, 171, 80, 111, 145, 176, + 77, 108, 142, 173, 78, 109, 143, 174, 79, 110, + 144, 175, 76, 107, 141, 172, 50, 115, 51, 2, + 1, 81, 116, 146, 19, 21, 12, 17, 18, 20, + 16, 25, 13, 10, 14, 24, 23, 22, 26, 8, + 15, 52, 117, 31, 82, 147, 9, 33, 11, 83, + 148, 53, 118, 28, 27, 84, 149, 34, 35, 29, + 46, 32, 30, 54, 119, 37, 36, 39, 38, 40, + 85, 150, 41, 42, 43, 44, 45, 55, 60, 65, + 70, 86, 91, 96, 101, 120, 125, 130, 135, 151, + 156, 161, 166, 56, 87, 121, 152, 61, 92, 126, + 157, 66, 97, 131, 162, 71, 102, 136, 167, 57, + 88, 122, 153, 62, 93, 127, 158, 67, 98, 132, + 163, 72, 103, 137, 168, 58, 89, 123, 154, 63, + 94, 128, 159, 68, 99, 133, 164, 73, 104, 138, + 169, 59, 90, 124, 155, 64, 95, 129, 160, 69, + 100, 134, 165, 74, 105, 139, 170 +}; + +static const Word16 sort_1265[253] = { + 0, 4, 6, 93, 143, 196, 246, 7, 5, 3, + 47, 48, 49, 50, 51, 150, 151, 152, 153, 154, + 94, 144, 197, 247, 99, 149, 202, 252, 96, 146, + 199, 249, 97, 147, 200, 250, 100, 203, 98, 148, + 201, 251, 95, 145, 198, 248, 52, 2, 1, 101, + 204, 155, 19, 21, 12, 17, 18, 20, 16, 25, + 13, 10, 14, 24, 23, 22, 26, 8, 15, 53, + 156, 31, 102, 205, 9, 33, 11, 103, 206, 54, + 157, 28, 27, 104, 207, 34, 35, 29, 46, 32, + 30, 55, 158, 37, 36, 39, 38, 40, 105, 208, + 41, 42, 43, 44, 45, 56, 106, 159, 209, 57, + 66, 75, 84, 107, 116, 125, 134, 160, 169, 178, + 187, 210, 219, 228, 237, 58, 108, 161, 211, 62, + 112, 165, 215, 67, 117, 170, 220, 71, 121, 174, + 224, 76, 126, 179, 229, 80, 130, 183, 233, 85, + 135, 188, 238, 89, 139, 192, 242, 59, 109, 162, + 212, 63, 113, 166, 216, 68, 118, 171, 221, 72, + 122, 175, 225, 77, 127, 180, 230, 81, 131, 184, + 234, 86, 136, 189, 239, 90, 140, 193, 243, 60, + 110, 163, 213, 64, 114, 167, 217, 69, 119, 172, + 222, 73, 123, 176, 226, 78, 128, 181, 231, 82, + 132, 185, 235, 87, 137, 190, 240, 91, 141, 194, + 244, 61, 111, 164, 214, 65, 115, 168, 218, 70, + 120, 173, 223, 74, 124, 177, 227, 79, 129, 182, + 232, 83, 133, 186, 236, 88, 138, 191, 241, 92, + 142, 195, 245 +}; + +static const Word16 sort_1425[285] = { + 0, 4, 6, 101, 159, 220, 278, 7, 5, 3, + 47, 48, 49, 50, 51, 166, 167, 168, 169, 170, + 102, 160, 221, 279, 107, 165, 226, 284, 104, 162, + 223, 281, 105, 163, 224, 282, 108, 227, 106, 164, + 225, 283, 103, 161, 222, 280, 52, 2, 1, 109, + 228, 171, 19, 21, 12, 17, 18, 20, 16, 25, + 13, 10, 14, 24, 23, 22, 26, 8, 15, 53, + 172, 31, 110, 229, 9, 33, 11, 111, 230, 54, + 173, 28, 27, 112, 231, 34, 35, 29, 46, 32, + 30, 55, 174, 37, 36, 39, 38, 40, 113, 232, + 41, 42, 43, 44, 45, 56, 114, 175, 233, 62, + 120, 181, 239, 75, 133, 194, 252, 57, 115, 176, + 234, 63, 121, 182, 240, 70, 128, 189, 247, 76, + 134, 195, 253, 83, 141, 202, 260, 92, 150, 211, + 269, 84, 142, 203, 261, 93, 151, 212, 270, 85, + 143, 204, 262, 94, 152, 213, 271, 86, 144, 205, + 263, 95, 153, 214, 272, 64, 122, 183, 241, 77, + 135, 196, 254, 65, 123, 184, 242, 78, 136, 197, + 255, 87, 145, 206, 264, 96, 154, 215, 273, 58, + 116, 177, 235, 66, 124, 185, 243, 71, 129, 190, + 248, 79, 137, 198, 256, 88, 146, 207, 265, 97, + 155, 216, 274, 59, 117, 178, 236, 67, 125, 186, + 244, 72, 130, 191, 249, 80, 138, 199, 257, 89, + 147, 208, 266, 98, 156, 217, 275, 60, 118, 179, + 237, 68, 126, 187, 245, 73, 131, 192, 250, 81, + 139, 200, 258, 90, 148, 209, 267, 99, 157, 218, + 276, 61, 119, 180, 238, 69, 127, 188, 246, 74, + 132, 193, 251, 82, 140, 201, 259, 91, 149, 210, + 268, 100, 158, 219, 277 +}; + +static const Word16 sort_1585[317] = { + 0, 4, 6, 109, 175, 244, 310, 7, 5, 3, + 47, 48, 49, 50, 51, 182, 183, 184, 185, 186, + 110, 176, 245, 311, 115, 181, 250, 316, 112, 178, + 247, 313, 113, 179, 248, 314, 116, 251, 114, 180, + 249, 315, 111, 177, 246, 312, 52, 2, 1, 117, + 252, 187, 19, 21, 12, 17, 18, 20, 16, 25, + 13, 10, 14, 24, 23, 22, 26, 8, 15, 53, + 188, 31, 118, 253, 9, 33, 11, 119, 254, 54, + 189, 28, 27, 120, 255, 34, 35, 29, 46, 32, + 30, 55, 190, 37, 36, 39, 38, 40, 121, 256, + 41, 42, 43, 44, 45, 56, 122, 191, 257, 63, + 129, 198, 264, 76, 142, 211, 277, 89, 155, 224, + 290, 102, 168, 237, 303, 57, 123, 192, 258, 70, + 136, 205, 271, 83, 149, 218, 284, 96, 162, 231, + 297, 62, 128, 197, 263, 75, 141, 210, 276, 88, + 154, 223, 289, 101, 167, 236, 302, 58, 124, 193, + 259, 71, 137, 206, 272, 84, 150, 219, 285, 97, + 163, 232, 298, 59, 125, 194, 260, 64, 130, 199, + 265, 67, 133, 202, 268, 72, 138, 207, 273, 77, + 143, 212, 278, 80, 146, 215, 281, 85, 151, 220, + 286, 90, 156, 225, 291, 93, 159, 228, 294, 98, + 164, 233, 299, 103, 169, 238, 304, 106, 172, 241, + 307, 60, 126, 195, 261, 65, 131, 200, 266, 68, + 134, 203, 269, 73, 139, 208, 274, 78, 144, 213, + 279, 81, 147, 216, 282, 86, 152, 221, 287, 91, + 157, 226, 292, 94, 160, 229, 295, 99, 165, 234, + 300, 104, 170, 239, 305, 107, 173, 242, 308, 61, + 127, 196, 262, 66, 132, 201, 267, 69, 135, 204, + 270, 74, 140, 209, 275, 79, 145, 214, 280, 82, + 148, 217, 283, 87, 153, 222, 288, 92, 158, 227, + 293, 95, 161, 230, 296, 100, 166, 235, 301, 105, + 171, 240, 306, 108, 174, 243, 309 +}; + +static const Word16 sort_1825[365] = { + 0, 4, 6, 121, 199, 280, 358, 7, 5, 3, + 47, 48, 49, 50, 51, 206, 207, 208, 209, 210, + 122, 200, 281, 359, 127, 205, 286, 364, 124, 202, + 283, 361, 125, 203, 284, 362, 128, 287, 126, 204, + 285, 363, 123, 201, 282, 360, 52, 2, 1, 129, + 288, 211, 19, 21, 12, 17, 18, 20, 16, 25, + 13, 10, 14, 24, 23, 22, 26, 8, 15, 53, + 212, 31, 130, 289, 9, 33, 11, 131, 290, 54, + 213, 28, 27, 132, 291, 34, 35, 29, 46, 32, + 30, 55, 214, 37, 36, 39, 38, 40, 133, 292, + 41, 42, 43, 44, 45, 56, 134, 215, 293, 198, + 299, 136, 120, 138, 60, 279, 58, 62, 357, 139, + 140, 295, 156, 57, 219, 297, 63, 217, 137, 170, + 300, 222, 64, 106, 61, 78, 294, 92, 142, 141, + 135, 221, 296, 301, 343, 59, 298, 184, 329, 315, + 220, 216, 265, 251, 218, 237, 352, 223, 157, 86, + 171, 87, 164, 351, 111, 302, 65, 178, 115, 323, + 72, 192, 101, 179, 93, 73, 193, 151, 337, 309, + 143, 274, 69, 324, 165, 150, 97, 338, 110, 310, + 330, 273, 68, 107, 175, 245, 114, 79, 113, 189, + 246, 259, 174, 71, 185, 96, 344, 100, 322, 83, + 334, 316, 333, 252, 161, 348, 147, 82, 269, 232, + 260, 308, 353, 347, 163, 231, 306, 320, 188, 270, + 146, 177, 266, 350, 256, 85, 149, 116, 191, 160, + 238, 258, 336, 305, 255, 88, 224, 99, 339, 230, + 228, 227, 272, 242, 241, 319, 233, 311, 102, 74, + 180, 275, 66, 194, 152, 325, 172, 247, 244, 261, + 117, 158, 166, 354, 75, 144, 108, 312, 94, 186, + 303, 80, 234, 89, 195, 112, 340, 181, 345, 317, + 326, 276, 239, 167, 118, 313, 70, 355, 327, 253, + 190, 176, 271, 104, 98, 153, 103, 90, 76, 267, + 277, 248, 225, 262, 182, 84, 154, 235, 335, 168, + 331, 196, 341, 249, 162, 307, 148, 349, 263, 321, + 257, 243, 229, 356, 159, 119, 67, 187, 173, 145, + 240, 77, 304, 332, 314, 342, 109, 254, 81, 278, + 105, 91, 346, 318, 183, 250, 197, 328, 95, 155, + 169, 268, 226, 236, 264 +}; + +static const Word16 sort_1985[397] = { + 0, 4, 6, 129, 215, 304, 390, 7, 5, 3, + 47, 48, 49, 50, 51, 222, 223, 224, 225, 226, + 130, 216, 305, 391, 135, 221, 310, 396, 132, 218, + 307, 393, 133, 219, 308, 394, 136, 311, 134, 220, + 309, 395, 131, 217, 306, 392, 52, 2, 1, 137, + 312, 227, 19, 21, 12, 17, 18, 20, 16, 25, + 13, 10, 14, 24, 23, 22, 26, 8, 15, 53, + 228, 31, 138, 313, 9, 33, 11, 139, 314, 54, + 229, 28, 27, 140, 315, 34, 35, 29, 46, 32, + 30, 55, 230, 37, 36, 39, 38, 40, 141, 316, + 41, 42, 43, 44, 45, 56, 142, 231, 317, 63, + 73, 92, 340, 82, 324, 149, 353, 159, 334, 165, + 338, 178, 163, 254, 77, 168, 257, 153, 343, 57, + 248, 238, 79, 252, 166, 67, 80, 201, 101, 267, + 143, 164, 341, 255, 339, 187, 376, 318, 78, 328, + 362, 115, 232, 242, 253, 290, 276, 62, 58, 158, + 68, 93, 179, 319, 148, 169, 154, 72, 385, 329, + 333, 344, 102, 83, 144, 233, 323, 124, 243, 192, + 354, 237, 64, 247, 202, 209, 150, 116, 335, 268, + 239, 299, 188, 196, 298, 94, 195, 258, 123, 363, + 384, 109, 325, 371, 170, 370, 84, 110, 295, 180, + 74, 210, 191, 106, 291, 205, 367, 381, 377, 206, + 355, 122, 119, 120, 383, 160, 105, 108, 277, 380, + 294, 284, 285, 345, 208, 269, 249, 366, 386, 300, + 297, 259, 125, 369, 197, 97, 194, 286, 211, 281, + 280, 183, 372, 87, 155, 283, 59, 348, 327, 184, + 76, 111, 330, 203, 349, 69, 98, 152, 145, 189, + 66, 320, 337, 173, 358, 251, 198, 174, 263, 262, + 126, 241, 193, 88, 388, 117, 95, 387, 112, 359, + 287, 244, 103, 272, 301, 171, 162, 234, 273, 127, + 373, 181, 292, 85, 378, 302, 121, 107, 364, 346, + 356, 212, 278, 213, 65, 382, 288, 207, 113, 175, + 99, 296, 374, 368, 199, 260, 185, 336, 331, 161, + 270, 264, 250, 240, 75, 350, 151, 60, 89, 321, + 156, 274, 360, 326, 70, 282, 167, 146, 352, 81, + 91, 389, 266, 245, 177, 235, 190, 256, 204, 342, + 128, 118, 303, 104, 379, 182, 114, 375, 200, 96, + 293, 172, 214, 365, 279, 86, 289, 351, 347, 357, + 261, 186, 176, 271, 90, 100, 147, 322, 275, 361, + 71, 332, 61, 265, 157, 246, 236 +}; + +static const Word16 sort_2305[461] = { + 0, 4, 6, 145, 247, 352, 454, 7, 5, 3, + 47, 48, 49, 50, 51, 254, 255, 256, 257, 258, + 146, 248, 353, 455, 151, 253, 358, 460, 148, 250, + 355, 457, 149, 251, 356, 458, 152, 359, 150, 252, + 357, 459, 147, 249, 354, 456, 52, 2, 1, 153, + 360, 259, 19, 21, 12, 17, 18, 20, 16, 25, + 13, 10, 14, 24, 23, 22, 26, 8, 15, 53, + 260, 31, 154, 361, 9, 33, 11, 155, 362, 54, + 261, 28, 27, 156, 363, 34, 35, 29, 46, 32, + 30, 55, 262, 37, 36, 39, 38, 40, 157, 364, + 41, 42, 43, 44, 45, 56, 158, 263, 365, 181, + 192, 170, 79, 57, 399, 90, 159, 297, 377, 366, + 275, 68, 183, 388, 286, 194, 299, 92, 70, 182, + 401, 172, 59, 91, 58, 400, 368, 161, 81, 160, + 264, 171, 80, 389, 390, 378, 379, 193, 298, 69, + 266, 265, 367, 277, 288, 276, 287, 184, 60, 195, + 82, 93, 71, 369, 402, 173, 162, 444, 300, 391, + 98, 76, 278, 61, 267, 374, 135, 411, 167, 102, + 380, 200, 87, 178, 65, 94, 204, 124, 72, 342, + 189, 305, 381, 396, 433, 301, 226, 407, 289, 237, + 113, 215, 185, 128, 309, 403, 116, 320, 196, 331, + 370, 422, 174, 64, 392, 83, 425, 219, 134, 188, + 432, 112, 427, 139, 279, 163, 436, 208, 447, 218, + 236, 229, 97, 294, 385, 230, 166, 268, 177, 443, + 225, 426, 101, 272, 138, 127, 290, 117, 347, 199, + 414, 95, 140, 240, 410, 395, 209, 129, 283, 346, + 105, 241, 437, 86, 308, 448, 203, 345, 186, 107, + 220, 415, 334, 319, 106, 313, 118, 123, 73, 207, + 421, 214, 384, 373, 438, 62, 371, 341, 75, 449, + 168, 323, 164, 242, 416, 324, 304, 197, 335, 404, + 271, 63, 191, 325, 96, 169, 231, 280, 312, 187, + 406, 84, 201, 100, 67, 382, 175, 336, 202, 330, + 269, 393, 376, 383, 293, 307, 409, 179, 285, 314, + 302, 372, 398, 190, 180, 89, 99, 103, 232, 78, + 88, 77, 136, 387, 165, 198, 394, 125, 176, 428, + 74, 375, 238, 227, 66, 273, 282, 141, 306, 412, + 114, 85, 130, 348, 119, 291, 296, 386, 233, 397, + 303, 405, 284, 445, 423, 221, 210, 205, 450, 108, + 274, 434, 216, 343, 337, 142, 243, 321, 408, 451, + 310, 292, 120, 109, 281, 439, 270, 429, 332, 295, + 418, 211, 315, 222, 326, 131, 430, 244, 327, 349, + 417, 316, 143, 338, 440, 234, 110, 212, 452, 245, + 121, 419, 350, 223, 132, 441, 328, 413, 317, 339, + 126, 104, 137, 446, 344, 239, 435, 115, 333, 206, + 322, 217, 228, 424, 453, 311, 351, 111, 442, 224, + 213, 122, 431, 340, 235, 246, 133, 144, 420, 329, + 318 +}; + +static const Word16 sort_2385[477] = { + 0, 4, 6, 145, 251, 360, 466, 7, 5, 3, + 47, 48, 49, 50, 51, 262, 263, 264, 265, 266, + 146, 252, 361, 467, 151, 257, 366, 472, 148, 254, + 363, 469, 149, 255, 364, 470, 156, 371, 150, 256, + 365, 471, 147, 253, 362, 468, 52, 2, 1, 157, + 372, 267, 19, 21, 12, 17, 18, 20, 16, 25, + 13, 10, 14, 24, 23, 22, 26, 8, 15, 53, + 268, 31, 152, 153, 154, 155, 258, 259, 260, 261, + 367, 368, 369, 370, 473, 474, 475, 476, 158, 373, + 9, 33, 11, 159, 374, 54, 269, 28, 27, 160, + 375, 34, 35, 29, 46, 32, 30, 55, 270, 37, + 36, 39, 38, 40, 161, 376, 41, 42, 43, 44, + 45, 56, 162, 271, 377, 185, 196, 174, 79, 57, + 411, 90, 163, 305, 389, 378, 283, 68, 187, 400, + 294, 198, 307, 92, 70, 186, 413, 176, 59, 91, + 58, 412, 380, 165, 81, 164, 272, 175, 80, 401, + 402, 390, 391, 197, 306, 69, 274, 273, 379, 285, + 296, 284, 295, 188, 60, 199, 82, 93, 71, 381, + 414, 177, 166, 456, 308, 403, 98, 76, 286, 61, + 275, 386, 135, 423, 171, 102, 392, 204, 87, 182, + 65, 94, 208, 124, 72, 350, 193, 313, 393, 408, + 445, 309, 230, 419, 297, 241, 113, 219, 189, 128, + 317, 415, 116, 328, 200, 339, 382, 434, 178, 64, + 404, 83, 437, 223, 134, 192, 444, 112, 439, 139, + 287, 167, 448, 212, 459, 222, 240, 233, 97, 302, + 397, 234, 170, 276, 181, 455, 229, 438, 101, 280, + 138, 127, 298, 117, 355, 203, 426, 95, 140, 244, + 422, 407, 213, 129, 291, 354, 105, 245, 449, 86, + 316, 460, 207, 353, 190, 107, 224, 427, 342, 327, + 106, 321, 118, 123, 73, 211, 433, 218, 396, 385, + 450, 62, 383, 349, 75, 461, 172, 331, 168, 246, + 428, 332, 312, 201, 343, 416, 279, 63, 195, 333, + 96, 173, 235, 288, 320, 191, 418, 84, 205, 100, + 67, 394, 179, 344, 206, 338, 277, 405, 388, 395, + 301, 315, 421, 183, 293, 322, 310, 384, 410, 194, + 184, 89, 99, 103, 236, 78, 88, 77, 136, 399, + 169, 202, 406, 125, 180, 440, 74, 387, 242, 231, + 66, 281, 290, 141, 314, 424, 114, 85, 130, 356, + 119, 299, 304, 398, 237, 409, 311, 417, 292, 457, + 435, 225, 214, 209, 462, 108, 282, 446, 220, 351, + 345, 142, 247, 329, 420, 463, 318, 300, 120, 109, + 289, 451, 278, 441, 340, 303, 430, 215, 323, 226, + 334, 131, 442, 248, 335, 357, 429, 324, 143, 346, + 452, 238, 110, 216, 464, 249, 121, 431, 358, 227, + 132, 453, 336, 425, 325, 347, 126, 104, 137, 458, + 352, 243, 447, 115, 341, 210, 330, 221, 232, 436, + 465, 319, 359, 111, 454, 228, 217, 122, 443, 348, + 239, 250, 133, 144, 432, 337, 326 +}; + +static const Word16 sort_SID[35] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, + 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34 +}; + +/* pointer table for bit sorting tables */ +static const Word16 *const sort_ptr[16] = { sort_660, sort_885, sort_1265, sort_1425, sort_1585, sort_1825, sort_1985, sort_2305, + sort_2385, sort_SID, NULL, NULL, NULL, NULL, NULL, NULL }; + +/* 4 bit to 3 bit AMR-WB CMR remapping table */ +static const Word16 amrwb_3bit_cmr[16] = { + 0x00, /* AMRWB_660 */ + 0x01, /* AMRWB_885 */ + 0x02, /* AMRWB_1265 */ + 0x05, /* AMRWB_1425 */ + 0x03, /* AMRWB_1585 */ + 0x06, /* AMRWB_1825 */ + 0x06, /* AMRWB_1985 -> AMRWB_1825 */ + 0x06, /* AMRWB_2305 -> AMRWB_1825 */ + 0x04, /* AMRWB_2385 */ + 0x07, /* invalid request -> none */ + 0x07, /* invalid request -> none */ + 0x07, /* invalid request -> none */ + 0x07, /* invalid request -> none */ + 0x07, /* invalid request -> none */ + 0x07, /* invalid request -> none */ + 0x07 /* invalid request -> none */ +}; + +/* 3 bit to 4 bit AMR-WB CMR remapping table */ +static const Word16 amrwb_4bit_cmr[8] = { + 0x00, /* AMRWB_660 */ + 0x01, /* AMRWB_885 */ + 0x02, /* AMRWB_1265 */ + 0x04, /* AMRWB_1585 */ + 0x08, /* AMRWB_2385 */ + 0x03, /* AMRWB_1425 */ + 0x05, /* AMRWB_1825 */ + 0x0f /* invalid */ +}; +#endif diff --git a/lib_com/modif_fs.c b/lib_com/modif_fs.c new file mode 100644 index 0000000000000000000000000000000000000000..c0f3c56ce37faa9c270429681f8a6a0b68e2fa7b --- /dev/null +++ b/lib_com/modif_fs.c @@ -0,0 +1,898 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * modify_Fs() + * + * Function for resampling of signals + *-------------------------------------------------------------------*/ + +/*! r: length of output */ +int16_t modify_Fs( + const float sigIn[], /* i : signal to decimate */ + const int16_t lg, /* i : length of input + 0 delay signaling */ + const int32_t fin, /* i : frequency of input */ + float sigOut[], /* o : decimated signal */ + const int32_t fout, /* i : frequency of output */ + float mem[], /* i/o: filter memory */ + const int16_t nblp /* i : flag indicating if NB low-pass is applied */ +) +{ + int16_t i; + int16_t lg_out, fac_num, fac_den, filt_len, frac, mem_len; + float num_den; + int16_t datastep, fracstep; + float *sigIn_ptr; + float signal_tab[3 * L_FILT_MAX + L_FRAME48k], *signal, *signal_ana; /* 3* as 2* for memory and 1* for future prediction */ + float A[M + 1], r[M + 1], epsP[M + 1], val; + int16_t mem_len_ana; + int16_t plus_sample_in; + int16_t j; + float mu_preemph; + float mem_preemph; + const Resampling_cfg *cfg_ptr; + int16_t flag_low_order = 0; + int16_t filt_len_tmp; + + /*-------------------------------------------------------------------* + * IIR filters for resampling to/from 8 kHz + *-------------------------------------------------------------------*/ + + /*-------------------------------------------------------------------* + * Find the resampling configuration + *-------------------------------------------------------------------*/ + + if ( fin == fout ) + { + /* just copy the signal and quit */ + for ( i = 0; i < lg; i++ ) + { + sigOut[i] = sigIn[i]; + } + + return lg; + } + else + { + /* find the resampling configuration in the lookup table */ + for ( cfg_ptr = &resampling_cfg_tbl[0]; ( cfg_ptr->fin != 0 ) && !( cfg_ptr->fin == fin && cfg_ptr->fout == fout ); cfg_ptr++ ) + { + } + + + /* find config with NB 4kHz low-pass */ + if ( nblp && ( fin > 8000 ) && ( fout == 12800 ) ) + { + flag_low_order = 1; + for ( cfg_ptr++; ( cfg_ptr->fin != 0 ) && !( cfg_ptr->fin == fin && cfg_ptr->fout == fout ); cfg_ptr++ ) + { + } + } + +#define WMC_TOOL_SKIP + /* Retrieve and/or calculate the resampling parameters */ + fac_num = cfg_ptr->fac_num; + fac_den = (int16_t) ( ( cfg_ptr->fin * fac_num ) / cfg_ptr->fout ); + lg_out = ( lg * fac_num ) / fac_den; + filt_len = cfg_ptr->filt_len; + + mem_len = 2 * filt_len; + plus_sample_in = 0; /* default, regular delay */ + frac = 0; + + if ( fin == 8000 && fout == 12800 ) + { + plus_sample_in = 7; + frac = 4; + } + + signal = signal_tab + 2 * L_FILT_MAX + L_FRAME48k - mem_len - lg; + signal_ana = signal; + mem_len_ana = mem_len; +#undef WMC_TOOL_SKIP + } + + /*-------------------------------------------------------------------* + * FIR filters for resampling to/from 12.8, 16, 32, 48 kHz + *-------------------------------------------------------------------*/ + + /* append filter memory */ + for ( i = 0; i < 2 * filt_len; i++ ) + { + signal[i] = mem[i]; + } + + for ( i = 0; i < lg; i++ ) + { + signal[i + ( 2 * filt_len )] = sigIn[i]; + } + + if ( plus_sample_in > 0 ) + { + autocorr( signal_ana + mem_len_ana + lg - LEN_WIN_SSS, r, 1, LEN_WIN_SSS, wind_sss, 0, 0, 0 ); + + mu_preemph = r[1] / r[0]; + mem_preemph = signal_ana[mem_len_ana + lg - LEN_WIN_SSS - 1]; + preemph( signal_ana + mem_len_ana + lg - LEN_WIN_SSS, mu_preemph, LEN_WIN_SSS, &mem_preemph ); + + /* Autocorrelations */ + autocorr( signal_ana + mem_len_ana + lg - LEN_WIN_SSS, r, M, LEN_WIN_SSS, wind_sss, 0, 0, 0 ); + + lag_wind( r, M, fin, LAGW_STRONG ); + + /* Levinson-Durbin */ + lev_dur( A, r, M, epsP ); + + for ( i = 0; i < plus_sample_in; i++ ) + { + val = 0; + for ( j = 1; j <= M; j++ ) + { + val -= signal[i + lg + mem_len - j] * A[j]; + } + signal[i + lg + mem_len] = val; /* AZ ringing padding */ + } + + mem_preemph = signal[mem_len + lg - LEN_WIN_SSS - 1]; + deemph( signal + mem_len + lg - LEN_WIN_SSS, mu_preemph, LEN_WIN_SSS + plus_sample_in, &mem_preemph ); + } + + /* interpolation */ + datastep = fac_den / fac_num; + fracstep = fac_den - datastep * fac_num; /* equivalent to datastep = fac_den % fac_num */ + + sigIn_ptr = signal + filt_len + plus_sample_in; + + filt_len_tmp = filt_len; + if ( flag_low_order ) + { + filt_len_tmp = ( filt_len + 1 ) >> 1; + } + + for ( i = 0; i < lg_out; i++ ) + { + sigOut[i] = interpolation( sigIn_ptr, cfg_ptr->filter, frac, fac_num, filt_len_tmp ); + + frac = frac + fracstep; + if ( frac >= fac_num ) + { + frac = frac - fac_num; + sigIn_ptr++; + } + + sigIn_ptr += datastep; + } + + /* rescaling */ + if ( ( fac_num > fac_den ) == ( ( cfg_ptr->flags & RS_INV_FAC ) != 0 ) ) + { + num_den = (float) fac_num / fac_den; + + for ( i = 0; i < lg_out; i++ ) + { + sigOut[i] *= num_den; + } + } + + /* update the filter memory */ + for ( i = 0; i < 2 * filt_len; i++ ) + { + mem[i] = signal[i + lg]; + } + + return lg_out; +} + +/*-------------------------------------------------------------------* + * modify_Fs_intcub3m_sup() + * + * + *-------------------------------------------------------------------*/ + +/*! r: length of output */ +int16_t modify_Fs_intcub3m_sup( + const float sigIn[], /* i : signal to decimate with memory of 2 samples (indexes -2 & -1) */ + const int16_t lg, /* i : length of input (suppose that lg is such that lg_out is integer, ex multiple of 5 in case of 16kHz to 12.8 kHz) */ + const int32_t fin, /* i : frequency of input */ + float sigOut[], /* o : decimated signal */ + const int32_t fout, /* i : frequency of output */ + int16_t *delayout /* o : delay of output */ +) +{ + int16_t i, j, k, i1, i2, k1, k2, k3, kk, cind; + int16_t lg_out, fk1, k2d, k3d; + float cc[4][4]; + float vv; + const double( *cu )[3] = 0; + + /*-------------------------------------------------------------------* + * Find the resampling configuration + *-------------------------------------------------------------------*/ + + /* check if fin and fout are the same */ + if ( fin == fout ) + { + /* just copy the signal and quit */ + for ( i = 0; i < lg; i++ ) + { + sigOut[i] = sigIn[i]; + } + + *delayout = 0; + return lg; + } + else + { + /* length of the interpolated signal */ + lg_out = (int16_t) ( lg * fout / fin ); + + /* cc[x][3]*s*s*s + cc[x][2]*s*s + cc[x][1]*s + cc[x][0]; indexes relatives of s : -1 0 1 2 */ + /* d : cc[x][0] = s[0] */ + /* b : cc[x][2] =(s[-1]+s[1])/2-s[0] */ + /* a : cc[x][3] = (s[-1]+s[2]-s[0]-s[1]-4*cc[x][2]) / 6 */ + /* c : cc[x][1] = s[1]-s[0]-cc[x][3]-cc[x][2] */ + + /* coef inits using memory (indexes < 0) */ + /* cc[2][] : indexes -2 -1 0 1 */ + cc[2][0] = sigIn[-1] / 3; + cc[2][2] = ( sigIn[-2] + sigIn[0] ) / 2 - sigIn[-1]; + cc[2][3] = ( sigIn[-2] + sigIn[1] - sigIn[-1] - sigIn[0] - 4 * cc[2][2] ) / 6; + cc[2][1] = sigIn[0] - sigIn[-1] - cc[2][3] - cc[2][2]; + + /* cc[3][] : indexes -1 0 1 2 */ + cc[3][0] = sigIn[0] / 3; + cc[3][2] = ( sigIn[-1] + sigIn[1] ) / 2 - sigIn[0]; + cc[3][3] = ( sigIn[-1] + sigIn[2] - sigIn[0] - sigIn[1] - 4 * cc[3][2] ) / 6; + cc[3][1] = sigIn[1] - sigIn[0] - cc[3][3] - cc[3][2]; + j = 0; + + if ( fin == 12800 ) + { + if ( fout == 8000 ) + { + cind = 0; + } + else if ( fout == 16000 ) + { + cind = 1; + } + else if ( fout == 32000 ) + { + cind = 2; + } + else if ( fout == 48000 ) + { + cind = 3; + } + else + { + printf( "warning, output sampling frequency %d not implemented for input %d", fout, fin ); + return ( -1 ); + } + } + else if ( fin == 16000 ) + { + if ( fout == 12800 ) + { + cind = 4; + } + else if ( fout == 32000 ) + { + cind = 5; + } + else if ( fout == 48000 ) + { + cind = 6; + } + else + { + printf( "warning, output sampling frequency %d not implemented for input %d", fout, fin ); + return ( -1 ); + } + } + else + { + printf( "warning, input sampling frequency %d not implemented", fin ); + return ( -1 ); + } + + *delayout = ct2[cind][9]; + + if ( ct2[cind][12] == 15 ) + { + cu = cu15; + } + + if ( ct2[cind][12] == 4 ) + { + cu = cu4; + } + + fk1 = 2 * ct2[cind][12] - 2; + k2d = fk1 / 2; /* shift of index in cu with respect to the next sample (ex 1.25 -> 0.25 ) */ + k3d = fk1 - 1; /* to compurte index in cu with respect to the last sample with - sign (ex 1.25 -> -0.75 ) */ + + kk = 0; + for ( i = 0; i < lg - ct2[cind][11]; ) + { + sigOut[j++] = sigIn[i]; + for ( k = 0; k < ct2[cind][10]; k++ ) + { + cc[kk][0] = sigIn[i + 1] / 3; + cc[kk][2] = ( sigIn[i] + sigIn[i + 2] ) / 2 - sigIn[i + 1]; + cc[kk][3] = ( sigIn[i] + sigIn[i + 3] - sigIn[i + 1] - sigIn[i + 2] - 4 * cc[kk][2] ) / 6; + cc[kk][1] = sigIn[i + 2] - sigIn[i + 1] - cc[kk][3] - cc[kk][2]; + i++; + + i2 = kk - 2; + i1 = kk - 1; + if ( i1 < 0 ) + { + i1 += 4; + } + + if ( i2 < 0 ) + { + i2 += 4; + } + + for ( k1 = ct2[cind][k]; k1 < fk1; k1 += ct2[cind][8] ) + { + k2 = k1 - k2d; + k3 = k3d - k1; + vv = (float) ( cu[k1][2] * cc[i2][3] + cu[k1][1] * cc[i2][2] + cu[k1][0] * cc[i2][1] + cc[i2][0] ); + vv += (float) ( cu[k2][2] * cc[i1][3] + cu[k2][1] * cc[i1][2] + cu[k2][0] * cc[i1][1] + cc[i1][0] ); + vv += (float) ( -cu[k3][2] * cc[kk][3] + cu[k3][1] * cc[kk][2] - cu[k3][0] * cc[kk][1] + cc[kk][0] ); + sigOut[j++] = vv; + } + + kk++; + if ( kk == 4 ) + { + kk = 0; + } + } + } + + sigOut[j++] = sigIn[i]; + + for ( k = 0; k < ct2[cind][11] - 3; k++ ) + { + cc[kk][0] = sigIn[i + 1] / 3; + cc[kk][2] = ( sigIn[i] + sigIn[i + 2] ) / 2 - sigIn[i + 1]; + cc[kk][3] = ( sigIn[i] + sigIn[i + 3] - sigIn[i + 1] - sigIn[i + 2] - 4 * cc[kk][2] ) / 6; + cc[kk][1] = sigIn[i + 2] - sigIn[i + 1] - cc[kk][3] - cc[kk][2]; + i++; + + i2 = kk - 2; + i1 = kk - 1; + if ( i1 < 0 ) + { + i1 += 4; + } + + if ( i2 < 0 ) + { + i2 += 4; + } + + for ( k1 = ct2[cind][k]; k1 < fk1; k1 += ct2[cind][8] ) + { + k2 = k1 - k2d; + k3 = k3d - k1; + vv = (float) ( cu[k1][2] * cc[i2][3] + cu[k1][1] * cc[i2][2] + cu[k1][0] * cc[i2][1] + cc[i2][0] ); + vv += (float) ( cu[k2][2] * cc[i1][3] + cu[k2][1] * cc[i1][2] + cu[k2][0] * cc[i1][1] + cc[i1][0] ); + vv += (float) ( -cu[k3][2] * cc[kk][3] + cu[k3][1] * cc[kk][2] - cu[k3][0] * cc[kk][1] + cc[kk][0] ); + sigOut[j++] = vv; + } + + kk++; + + if ( kk == 4 ) + { + kk = 0; + } + } + + kk--; + if ( kk == -1 ) + { + kk = 3; + } + + if ( ct2[cind][10] == 1 ) + { + sigOut[j++] = sigIn[i]; + } + + for ( k1 = ct2[cind][k]; k1 < fk1; k1 += ct2[cind][8] ) + { + k2 = k1 - k2d; + vv = (float) ( cu[k2][2] * cc[kk][3] + cu[k2][1] * cc[kk][2] + cu[k2][0] * cc[kk][1] + cc[kk][0] ); + sigOut[j++] = vv * 3; + } + + if ( ct2[cind][10] < 3 ) + { + sigOut[j++] = sigIn[i + 1]; + } + + for ( k1 = ct2[cind][k + 1]; k1 < fk1; k1 += ct2[cind][8] ) + { + vv = (float) ( cu[k1][2] * cc[kk][3] + cu[k1][1] * cc[kk][2] + cu[k1][0] * cc[kk][1] + cc[kk][0] ); + sigOut[j++] = vv * 3; + } + + if ( ct2[cind][10] == 1 ) + { + sigOut[j++] = sigIn[i + 2]; + } + } + + return lg_out; +} + +/*-------------------------------------------------------------------* + * Interpolate_allpass_steep() + * + * Interpolation by a factor 2 + *-------------------------------------------------------------------*/ + +void Interpolate_allpass_steep( + const float *in, /* i : input array of size N */ + float *mem, /* i/o: memory */ + const int16_t N, /* i : number of input samples */ + float *out /* o : output array of size 2*N */ +) +{ + int16_t n, k; + float temp[ALLPASSSECTIONS_STEEP - 1]; + + /* upper allpass filter chain */ + for ( k = 0; k < N; k++ ) + { + temp[0] = mem[0] + AP2_STEEP[0] * in[k]; + mem[0] = in[k] - AP2_STEEP[0] * temp[0]; + + /* for better performance, unroll this loop */ + for ( n = 1; n < ALLPASSSECTIONS_STEEP - 1; n++ ) + { + temp[n] = mem[n] + AP2_STEEP[n] * temp[n - 1]; + mem[n] = temp[n - 1] - AP2_STEEP[n] * temp[n]; + } + + out[2 * k + 1] = mem[ALLPASSSECTIONS_STEEP - 1] + AP2_STEEP[ALLPASSSECTIONS_STEEP - 1] * temp[ALLPASSSECTIONS_STEEP - 2]; + mem[ALLPASSSECTIONS_STEEP - 1] = temp[ALLPASSSECTIONS_STEEP - 2] - AP2_STEEP[ALLPASSSECTIONS_STEEP - 1] * out[2 * k + 1]; + } + + /* lower allpass filter chain */ + for ( k = 0; k < N; k++ ) + { + temp[0] = mem[ALLPASSSECTIONS_STEEP] + AP1_STEEP[0] * in[k]; + mem[ALLPASSSECTIONS_STEEP] = in[k] - AP1_STEEP[0] * temp[0]; + + /* for better performance, unroll this loop */ + for ( n = 1; n < ALLPASSSECTIONS_STEEP - 1; n++ ) + { + temp[n] = mem[ALLPASSSECTIONS_STEEP + n] + AP1_STEEP[n] * temp[n - 1]; + mem[ALLPASSSECTIONS_STEEP + n] = temp[n - 1] - AP1_STEEP[n] * temp[n]; + } + + out[2 * k] = mem[2 * ALLPASSSECTIONS_STEEP - 1] + AP1_STEEP[ALLPASSSECTIONS_STEEP - 1] * temp[ALLPASSSECTIONS_STEEP - 2]; + mem[2 * ALLPASSSECTIONS_STEEP - 1] = temp[ALLPASSSECTIONS_STEEP - 2] - AP1_STEEP[ALLPASSSECTIONS_STEEP - 1] * out[2 * k]; + } + + return; +} + +/*-------------------------------------------------------------------* + * Decimate_allpass_steep() + * + * Decimation by a factor 2 + *-------------------------------------------------------------------*/ + +void Decimate_allpass_steep( + const float *in, /* i : input array of size N */ + float *mem, /* i/o: memory */ + const int16_t N, /* i : number of input samples */ + float *out /* o : output array of size N/2 */ +) +{ + int16_t n, k; + float temp[ALLPASSSECTIONS_STEEP]; + + /* upper allpass filter chain */ + for ( k = 0; k < N / 2; k++ ) + { + temp[0] = mem[0] + AP1_STEEP[0] * in[2 * k]; + mem[0] = in[2 * k] - AP1_STEEP[0] * temp[0]; + + /* for better performance, unroll this loop */ + for ( n = 1; n < ALLPASSSECTIONS_STEEP - 1; n++ ) + { + temp[n] = mem[n] + AP1_STEEP[n] * temp[n - 1]; + if ( fabs( temp[n] ) < 1e-12 ) + { + temp[n] = sign( temp[n] ) * 1e-12f; + } + mem[n] = temp[n - 1] - AP1_STEEP[n] * temp[n]; + } + + out[k] = mem[ALLPASSSECTIONS_STEEP - 1] + AP1_STEEP[ALLPASSSECTIONS_STEEP - 1] * temp[ALLPASSSECTIONS_STEEP - 2]; + mem[ALLPASSSECTIONS_STEEP - 1] = temp[ALLPASSSECTIONS_STEEP - 2] - AP1_STEEP[ALLPASSSECTIONS_STEEP - 1] * out[k]; + } + + /* lower allpass filter chain */ + temp[0] = mem[ALLPASSSECTIONS_STEEP] + AP2_STEEP[0] * mem[2 * ALLPASSSECTIONS_STEEP]; + mem[ALLPASSSECTIONS_STEEP] = mem[2 * ALLPASSSECTIONS_STEEP] - AP2_STEEP[0] * temp[0]; + + /* for better performance, unroll this loop */ + for ( n = 1; n < ALLPASSSECTIONS_STEEP - 1; n++ ) + { + temp[n] = mem[ALLPASSSECTIONS_STEEP + n] + AP2_STEEP[n] * temp[n - 1]; + if ( fabs( temp[n] ) < 1e-12 ) + { + temp[n] = sign( temp[n] ) * 1e-12f; + } + mem[ALLPASSSECTIONS_STEEP + n] = temp[n - 1] - AP2_STEEP[n] * temp[n]; + } + + temp[ALLPASSSECTIONS_STEEP - 1] = mem[2 * ALLPASSSECTIONS_STEEP - 1] + AP2_STEEP[ALLPASSSECTIONS_STEEP - 1] * + temp[ALLPASSSECTIONS_STEEP - 2]; + + mem[2 * ALLPASSSECTIONS_STEEP - 1] = temp[ALLPASSSECTIONS_STEEP - 2] - AP2_STEEP[ALLPASSSECTIONS_STEEP - 1] * + temp[ALLPASSSECTIONS_STEEP - 1]; + out[0] = (float) ( ( out[0] + temp[ALLPASSSECTIONS_STEEP - 1] ) * 0.5 ); + + for ( k = 1; k < N / 2; k++ ) + { + temp[0] = mem[ALLPASSSECTIONS_STEEP] + AP2_STEEP[0] * in[2 * k - 1]; + mem[ALLPASSSECTIONS_STEEP] = in[2 * k - 1] - AP2_STEEP[0] * temp[0]; + + /* for better performance, unroll this loop */ + for ( n = 1; n < ALLPASSSECTIONS_STEEP - 1; n++ ) + { + temp[n] = mem[ALLPASSSECTIONS_STEEP + n] + AP2_STEEP[n] * temp[n - 1]; + if ( fabs( temp[n] ) < 1e-12 ) + { + temp[n] = sign( temp[n] ) * 1e-12f; + } + mem[ALLPASSSECTIONS_STEEP + n] = temp[n - 1] - AP2_STEEP[n] * temp[n]; + } + + temp[ALLPASSSECTIONS_STEEP - 1] = mem[2 * ALLPASSSECTIONS_STEEP - 1] + AP2_STEEP[ALLPASSSECTIONS_STEEP - 1] * + temp[ALLPASSSECTIONS_STEEP - 2]; + mem[2 * ALLPASSSECTIONS_STEEP - 1] = temp[ALLPASSSECTIONS_STEEP - 2] - AP2_STEEP[ALLPASSSECTIONS_STEEP - 1] * + temp[ALLPASSSECTIONS_STEEP - 1]; + out[k] = (float) ( ( out[k] + temp[ALLPASSSECTIONS_STEEP - 1] ) * 0.5 ); + } + + /* z^(-1) */ + mem[2 * ALLPASSSECTIONS_STEEP] = in[N - 1]; + + return; +} + +/*-------------------------------------------------------------------* + * interpolate_3_over_2_allpass() + * + * Interpolate 3/2 using allpass iir polyphase filter. Delay 4 samples @48k + *-------------------------------------------------------------------*/ + +void interpolate_3_over_2_allpass( + const float *input, /* i : input signal */ + const int16_t len, /* i : number of input samples */ + float *out, /* o : output signal */ + float *mem /* i/o: memory */ +) +{ + int16_t i, loop_len; + float Vu[2], Vm[2], Vl[2]; /* Outputs of three cascaded allpass stages (upper, middle, and lower) */ + float out1_buff[L_FRAME32k * 3]; + float *out1; + float mem_temp; + const float *filt_coeff = allpass_poles_3_ov_2; + + out1 = out1_buff; + + for ( i = 0; i < len; i++ ) + { + /* Upper branch */ + Vu[0] = mem[0] + filt_coeff[0] * ( input[i] - mem[1] ); + Vu[1] = mem[1] + filt_coeff[1] * ( Vu[0] - mem[2] ); + mem[3] = mem[2] + filt_coeff[2] * ( Vu[1] - mem[3] ); + + mem[1] = Vu[0]; + mem[2] = Vu[1]; + *out1++ = mem[3]; + + /* Middle branch */ + Vm[0] = mem[0] + filt_coeff[3] * ( input[i] - mem[4] ); + Vm[1] = mem[4] + filt_coeff[4] * ( Vm[0] - mem[5] ); + mem[6] = mem[5] + filt_coeff[5] * ( Vm[1] - mem[6] ); + + mem[4] = Vm[0]; + mem[5] = Vm[1]; + *out1++ = mem[6]; + + /* Lower branch */ + Vl[0] = mem[0] + filt_coeff[6] * ( input[i] - mem[7] ); + Vl[1] = mem[7] + filt_coeff[7] * ( Vl[0] - mem[8] ); + mem[9] = mem[8] + filt_coeff[8] * ( Vl[1] - mem[9] ); + + mem[0] = input[i]; + mem[7] = Vl[0]; + mem[8] = Vl[1]; + *out1++ = mem[9]; + } + + loop_len = len * 3 / 2; + + /*decimate by 2 and LPF*/ + for ( i = 0; i < loop_len; i++ ) + { + mem_temp = out1_buff[2 * i]; + out[i] = ( ( ( 0.0473147f ) * ( mem_temp + mem[10] ) ) + ( ( -0.151521f ) * ( mem[11] + mem[14] ) ) ); + out[i] = ( out[i] + ( ( 0.614152f ) * ( mem[12] + mem[13] ) ) ); + mem[10] = mem[11]; + mem[11] = mem[12]; + mem[12] = mem[13]; + mem[13] = mem[14]; + mem[14] = mem_temp; + } + + return; +} + +/*-------------------------------------------------------------------* + * decimate_2_over_3_allpass() + * + * Decimate 2/3 using allpass iir polyphase filter. + *-------------------------------------------------------------------*/ + +void decimate_2_over_3_allpass( + const float *input, /* i : input signal */ + const int16_t len, /* i : number of input samples */ + float *out, /* o : output signal */ + float *mem, /* i/o: memory */ + float *lp_mem /* i/o: memory */ +) +{ + int16_t i, loop_len; + float Vu[2], Vm[2], Vl[2]; /* Outputs of three cascaded allpass stages (upper, middle, and lower) */ + float *out1; + float *in; + float out1_buff[L_FRAME48k * 2]; + float tmp; + const float *filt_coeff = allpass_poles_3_ov_2; + const float *lp_num = decimate_3_ov_2_lowpass_num; + const float *lp_den = decimate_3_ov_2_lowpass_den; + + /* Combine the 2nd order iir lpf with the decimation by 2 to improve the efficiency*/ + out1 = out1_buff; + + *out1++ = lp_num[0] * ( input[0] + lp_mem[0] ) - lp_den[2] * lp_mem[2]; + *out1++ = lp_num[1] * input[0] - lp_den[2] * lp_mem[1]; + + for ( i = 1; i < len; i++ ) + { + tmp = lp_num[0] * ( input[i] + input[i - 1] ) - lp_den[2] * out1[-2]; + *out1++ = tmp; + tmp = lp_num[1] * input[i] - lp_den[2] * out1[-2]; + *out1++ = tmp; + } + lp_mem[0] = input[len - 1]; + lp_mem[1] = out1[-1]; + lp_mem[2] = out1[-2]; + + /* do the all pass polyphase filter with pi/3 cutoff */ + out1 = out; + in = out1_buff; + loop_len = (int16_t) len * 2 / 3; + + for ( i = 0; i < loop_len; i++ ) + { + /* Lower branch */ + Vl[0] = mem[8] + filt_coeff[6] * ( *in - mem[9] ); + Vl[1] = mem[9] + filt_coeff[7] * ( Vl[0] - mem[10] ); + mem[11] = mem[10] + filt_coeff[8] * ( Vl[1] - mem[11] ); + + mem[8] = *in++; + mem[9] = Vl[0]; + mem[10] = Vl[1]; + *out1 = mem[11]; + + /* Middle branch */ + Vm[0] = mem[4] + filt_coeff[3] * ( *in - mem[5] ); + Vm[1] = mem[5] + filt_coeff[4] * ( Vm[0] - mem[6] ); + mem[7] = mem[6] + filt_coeff[5] * ( Vm[1] - mem[7] ); + + mem[4] = *in++; + mem[5] = Vm[0]; + mem[6] = Vm[1]; + *out1 += mem[7]; + + /* Upper branch */ + Vu[0] = mem[0] + filt_coeff[0] * ( *in - mem[1] ); + Vu[1] = mem[1] + filt_coeff[1] * ( Vu[0] - mem[2] ); + mem[3] = mem[2] + filt_coeff[2] * ( Vu[1] - mem[3] ); + + mem[0] = *in++; + mem[1] = Vu[0]; + mem[2] = Vu[1]; + *out1++ += mem[3]; + } + + return; +} + +/*-------------------------------------------------------------------* + * interpolate_3_over_1_allpass() + * + * Interpolate 3/1 using allpass iir polyphase filter. Delay 4 samples @48k + *-------------------------------------------------------------------*/ + +void interpolate_3_over_1_allpass( + const float *input, /* i : input signal */ + const int16_t len, /* i : number of input samples */ + float *out, /* o : output signal */ + float *mem /* i/o: memory */ +) +{ + int16_t i; + float Vu[2], Vm[2], Vl[2]; /* Outputs of three cascaded allpass stages (upper, middle, and lower) */ + float *out1; + float mem_temp; + const float *filt_coeff = allpass_poles_3_ov_2; + + out1 = &out[0]; + + for ( i = 0; i < len; i++ ) + { + /* Upper branch */ + Vu[0] = mem[0] + filt_coeff[0] * ( input[i] - mem[1] ); + Vu[1] = mem[1] + filt_coeff[1] * ( Vu[0] - mem[2] ); + mem[3] = mem[2] + filt_coeff[2] * ( Vu[1] - mem[3] ); + + mem[1] = Vu[0]; + mem[2] = Vu[1]; + *out1++ = mem[3]; + + /* Middle branch */ + Vm[0] = mem[0] + filt_coeff[3] * ( input[i] - mem[4] ); + Vm[1] = mem[4] + filt_coeff[4] * ( Vm[0] - mem[5] ); + mem[6] = mem[5] + filt_coeff[5] * ( Vm[1] - mem[6] ); + + mem[4] = Vm[0]; + mem[5] = Vm[1]; + *out1++ = mem[6]; + + /* Lower branch */ + Vl[0] = mem[0] + filt_coeff[6] * ( input[i] - mem[7] ); + Vl[1] = mem[7] + filt_coeff[7] * ( Vl[0] - mem[8] ); + mem[9] = mem[8] + filt_coeff[8] * ( Vl[1] - mem[9] ); + + mem[0] = input[i]; + mem[7] = Vl[0]; + mem[8] = Vl[1]; + *out1++ = mem[9]; + } + + /*LPF*/ + for ( i = 0; i < len * 3; i++ ) + { + mem_temp = out[i]; + out[i] = ( ( ( 0.572769f ) * ( mem[12] + mem[11] ) ) - ( ( 0.074005f ) * ( mem_temp + mem[10] ) ) ); + mem[10] = mem[11]; + mem[11] = mem[12]; + mem[12] = mem_temp; + } + + return; +} + + +/*-------------------------------------------------------------------* + * retro_interp4_5() + * + * + *-------------------------------------------------------------------*/ + +void retro_interp4_5( + const float *syn, + float *pst_old_syn ) +{ + float *pf5, *pf4; + int16_t c; + + /* resample st->pst_old_syn in a reverse way to preserve time-alignment */ + pf4 = (float *) &pst_old_syn[58]; + pf5 = (float *) pst_old_syn; + for ( c = 0; c < 57; c++ ) + { + *pf5++ = pf4[0]; + *pf5++ = 0.2f * pf4[0] + 0.8f * pf4[1]; + *pf5++ = 0.4f * pf4[1] + 0.6f * pf4[2]; + *pf5++ = 0.6f * pf4[2] + 0.4f * pf4[3]; + *pf5++ = 0.8f * pf4[3] + 0.2f * pf4[4]; + pf4 += 4; + } + *pf5++ = pf4[0]; + *pf5++ = 0.2f * pf4[0] + 0.8f * pf4[1]; + *pf5++ = 0.4f * pf4[1] + 0.6f * pf4[2]; + *pf5++ = 0.6f * pf4[2] + 0.4f * pf4[3]; + *pf5++ = 0.8f * pf4[3] + 0.2f * syn[0]; + /* all samples processed: NBPSF_PIT_MAX = 290 = (58*5) */ + + return; +} + + +/*-------------------------------------------------------------------* + * retro_interp5_4() + * + * + *-------------------------------------------------------------------*/ + +void retro_interp5_4( + float *pst_old_syn ) +{ + float *pf5, *pf4; + int16_t c; + + /* resample st->pst_old_syn in a reverse way to preserve time-alignment */ + pf4 = (float *) &pst_old_syn[NBPSF_PIT_MAX - 1]; + pf5 = pf4; + for ( c = 0; c < 58; c++ ) + { + *pf4-- = 0.75f * pf5[0] + 0.25f * pf5[-1]; + *pf4-- = 0.50f * pf5[-1] + 0.50f * pf5[-2]; + *pf4-- = 0.25f * pf5[-2] + 0.75f * pf5[-3]; + *pf4-- = pf5[-4]; + pf5 -= 5; + } + /* all samples processed: NBPSF_PIT_MAX = 290 = (58*5) */ + + return; +} diff --git a/lib_com/move.h b/lib_com/move.h new file mode 100644 index 0000000000000000000000000000000000000000..c7bee82cd41d3669da2a06759116db869ce61c29 --- /dev/null +++ b/lib_com/move.h @@ -0,0 +1,74 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#ifndef _MOVE_H +#define _MOVE_H + +/* BASOP -> FLC brigde: data move counting */ + +#include "stl.h" + +static __inline void move16( void ) +{ +} + +static __inline void move32( void ) +{ +} + +static __inline void test( void ) +{ +} + +static __inline void logic16( void ) +{ +} + +static __inline void logic32( void ) +{ +} + + +/*-------- legacy ----------*/ +#define data_move() move16() +#define L_data_move() move32() +#define data_move_external() move16() +#define compare_zero() test() +/*-------- end legacy ----------*/ + +#define cast16 move16 + +#endif /* _MOVE_H */ diff --git a/lib_com/mslvq_com.c b/lib_com/mslvq_com.c new file mode 100644 index 0000000000000000000000000000000000000000..48384794aa4f882d3d0eaaa861ca9de8c66cd931 --- /dev/null +++ b/lib_com/mslvq_com.c @@ -0,0 +1,847 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "wmc_auto.h" +#include "ivas_prot.h" + +/*-----------------------------------------------------------------* + * Local function prototypes + *-----------------------------------------------------------------*/ + +static void decode_comb( Word32 index, float *cv, int16_t idx_lead ); + +static void decode_sign_pc1( float *c, int16_t idx_sign, const int16_t parity ); + +static void put_value( float *cv, int16_t *p, float val, const int16_t dim, const int16_t no_new_val ); + +static void decode_leaders( Word32 index, int16_t idx_lead, float *cv ); + +static void idx2c( int16_t n, int16_t *p, const int16_t k, Word32 val ); + +static void divide_64_32( int16_t *x, UWord32 y, UWord32 *result, UWord32 *rem ); + + +/*-----------------------------------------------------------------* + * permute() + * used in CNG-LP coding + *-----------------------------------------------------------------*/ + +void permute( + float *pTmp1, /* i/o: vector whose components are to be permuted */ + const int16_t *perm /* i : permutation info (indexes that should be interchanged), max two perms */ +) +{ + int16_t p1, p2; + float tmp; + + p1 = perm[0]; + p2 = perm[1]; + tmp = pTmp1[p1]; + pTmp1[p1] = pTmp1[p2]; + pTmp1[p2] = tmp; + p1 = perm[2]; + + if ( p1 > -1 ) + { + p2 = perm[3]; + tmp = pTmp1[p1]; + pTmp1[p1] = pTmp1[p2]; + pTmp1[p2] = tmp; + } + + return; +} + +/*-----------------------------------------------------------------* + * make_offset_scale() + * + *-----------------------------------------------------------------*/ + +static void make_offset_scale( + const UWord32 tab_no_cv[], + const Word8 *no_ld, + const int16_t no_scl, + UWord32 *offset_scale ) +{ + int16_t i; + + offset_scale[0] = 1; + for ( i = 1; i <= no_scl; i++ ) + { + offset_scale[i] = offset_scale[i - 1] + tab_no_cv[(int16_t) no_ld[i - 1]]; + } + + return; +} + +/*-----------------------------------------------------------------* + * decode_indexes() + * + *-----------------------------------------------------------------*/ + +static int16_t decode_indexes( + int16_t *index, + const int16_t no_bits, + const float *p_scales, + const int16_t prediction_flag, + float *x_lvq, + const int16_t mode_glb ) +{ + UWord32 index1 = 0, index2, idx_scale; + uint16_t i; + float scale; + + int16_t len_scales = MAX_NO_SCALES * 2; + UWord32 offset_scale1[MAX_NO_SCALES + 1], offset_scale2[MAX_NO_SCALES + 1]; + + if ( no_bits <= 2 * LEN_INDICE ) /* the third short is not used */ + { + index[2] = 0; + if ( no_bits <= LEN_INDICE ) + { + index[1] = 0; + } + } + + /* safety check in case of bit errors */ + for ( i = 0; i < 3; i++ ) + { + if ( index[i] < 0 ) + { + set_f( x_lvq, 0.0f, 2 * LATTICE_DIM ); + index[i] = 0; + return 1; + } + } + + create_offset( offset_scale1, offset_scale2, mode_glb, prediction_flag ); + /* first subvector */ + if ( offset_scale2[MAX_NO_SCALES - 1] > 0 ) + { + divide_64_32( index, offset_scale2[MAX_NO_SCALES], &index1, &index2 ); + } + else + { + index1 = (UWord32) ( index[0] ); /* this is for very low bitrates, so there is no loss in truncation */ + index2 = 0; + } + + if ( index1 == 0 ) + { + for ( i = 0; i < LATTICE_DIM; i++ ) + { + x_lvq[i] = 0.0; + } + } + else + { + if ( index1 >= offset_scale1[MAX_NO_SCALES] ) + { + /* safety check in case of bit errors */ + set_f( x_lvq, 0.0f, 2 * LATTICE_DIM ); + return 1; + } + + /* find idx_scale */ + i = 1; + while ( (int16_t) i <= MAX_NO_SCALES && index1 >= offset_scale1[i] ) + { + i++; + } + + idx_scale = i - 1; + index1 -= offset_scale1[idx_scale]; + + /* find idx_leader */ + i = 1; + while ( index1 >= table_no_cv[i] ) + { + i++; + } + decode_comb( (Word32) ( index1 - table_no_cv[i - 1] ), x_lvq, i - 1 ); + scale = p_scales[mode_glb * len_scales + idx_scale]; + for ( i = 0; i < LATTICE_DIM; i++ ) + { + x_lvq[i] *= scale; + } + } + + /* second subvector */ + if ( index2 == 0 ) + { + for ( i = LATTICE_DIM; i < 2 * LATTICE_DIM; i++ ) + { + x_lvq[i] = 0.0; + } + } + else + { + + /* find the index for the scale/truncation */ + i = 1; + while ( index2 >= offset_scale2[i] ) + { + i++; + } + + idx_scale = i - 1; + index2 -= offset_scale2[idx_scale]; + /* find the index of the leader vector */ + i = 1; + while ( index2 >= table_no_cv[i] ) + { + i++; + } + decode_comb( (Word32) ( index2 - table_no_cv[i - 1] ), &x_lvq[LATTICE_DIM], i - 1 ); + + scale = p_scales[mode_glb * len_scales + MAX_NO_SCALES + idx_scale]; + for ( i = LATTICE_DIM; i < 2 * LATTICE_DIM; i++ ) + { + x_lvq[i] *= scale; + } + } + + return 0; +} + +/*-----------------------------------------------------------------* + * deindex_lvq() + * + *-----------------------------------------------------------------*/ + +int16_t deindex_lvq( + int16_t *index, /* i : index to be decoded, as an array of 3 shorts */ + float *x_lvq, /* o : decoded codevector */ + const int16_t mode, /* i : LVQ coding mode (select scales & no_lead ), or idx_cv */ + const int16_t sf_flag, /* i : safety net flag */ + const int16_t no_bits /* i : number of bits for lattice */ +) +{ + int16_t i; + const float *p_scales; + int16_t mode_glb; + int16_t ber_flag; + + if ( sf_flag == 1 ) + { + if ( mode < 6 ) /* for NB */ + { + mode_glb = offset_lvq_modes_SN[mode] + offset_in_lvq_mode_SN[mode][no_bits - min_lat_bits_SN[mode]]; + } + else + { + mode_glb = offset_lvq_modes_SN[mode] + no_bits - min_lat_bits_SN[mode]; /* there is granularity of 1 bit */ + } + p_scales = &scales[0][0]; + } + else + { + if ( ( mode < 6 ) || ( mode == 12 ) ) /* for NB */ + { + mode_glb = offset_lvq_modes_pred[mode] + offset_in_lvq_mode_pred[mode][no_bits - min_lat_bits_pred[mode]]; + } + else + { + mode_glb = offset_lvq_modes_pred[mode] + no_bits - min_lat_bits_pred[mode]; + } + p_scales = &scales_p[0][0]; + } + + /* decode the lattice index into the lattice codevectors for the two subvectors */ + ber_flag = decode_indexes( index, no_bits, p_scales, 1 - sf_flag, x_lvq, mode_glb ); + + if ( sf_flag == 1 ) + { + for ( i = 0; i < 2 * LATTICE_DIM; i++ ) + { + x_lvq[i] *= sigma_MSLVQ[mode][i]; + } + } + else + { + for ( i = 0; i < 2 * LATTICE_DIM; i++ ) + { + x_lvq[i] *= sigma_p[mode][i]; + } + } + + return ber_flag; +} + +/*------------------------------------------------------------------------------------------------------------* + * deindex_lvq_cng() + * + * Note: + * The sampling frequency for the LVQ CNG decoder frame can be determined by checking the fully decoded + * value of the highest order LSF coefficient. Thus sampling rate information, nor extra codebooks are + * not needed for deindex_lvq_cng(), since it is embedded inside the LSF codebooks. + *------------------------------------------------------------------------------------------------------------*/ + +int16_t deindex_lvq_cng( + int16_t *index, /* i : index to be decoded, as an array of 3 shorts */ + float *x_lvq, /* o : decoded codevector */ + const int16_t idx_cv, /* i : relative mode_lvq, wrt START_CNG */ + const int16_t no_bits /* i : number of bits for lattice */ +) +{ + int16_t i; + const float *p_scales; + int16_t mode_glb, mode; + int16_t ber_flag; + + mode_glb = START_CNG + idx_cv; + mode = LVQ_COD_MODES + idx_cv; + + p_scales = &scales[0][0]; + ber_flag = decode_indexes( index, no_bits, p_scales, 0, x_lvq, mode_glb ); + + for ( i = 0; i < 2 * LATTICE_DIM; i++ ) + { + x_lvq[i] *= sigma_MSLVQ[mode][i]; + } + + /* check if permutting needed */ + if ( cng_sort[idx_cv] ) + { + permute( x_lvq, perm_MSLVQ[idx_cv] ); + } + + return ber_flag; +} + + +/*-----------------------------------------------------------------* + * decode_comb() + * + * combinatorial deindexing of a codevector including the signs + * + *-----------------------------------------------------------------*/ + +static void decode_comb( + Word32 index, /* i : index to be decoded */ + float *cv, /* o : decoded codevector */ + int16_t idx_lead /* i : leader class index */ +) +{ + int16_t idx_sign; + + idx_sign = (int16_t) ( index / pi0[idx_lead] ); + index -= idx_sign * pi0[idx_lead]; + decode_leaders( index, idx_lead, cv ); + decode_sign_pc1( cv, idx_sign, pl_par[idx_lead] ); + + return; +} + +/*-----------------------------------------------------------------* + * decode_leaders() + * + * decode index of a codevector from the leader class idx_lead + *-----------------------------------------------------------------*/ + +static void decode_leaders( + Word32 index, /* i : index to be decoded */ + int16_t idx_lead, /* i : leader class index */ + float *cv /* o : decoded codevector */ +) +{ + int16_t i, no_vals_loc, no_vals_last, p[LATTICE_DIM], dim_loc, n_crt; + Word32 index1; + float val_crt; + + no_vals_loc = no_vals[idx_lead]; + val_crt = vals[idx_lead][no_vals_loc - 1]; + no_vals_last = no_vals_ind[idx_lead][no_vals_loc - 1]; + + for ( i = 0; i < no_vals_last; i++ ) + { + cv[i] = val_crt; + } + + val_crt = 1; + dim_loc = no_vals_last; + + switch ( no_vals_loc ) + { + case 1: + break; + case 2: + idx2c( LATTICE_DIM, p, no_vals_ind[idx_lead][0], index ); + put_value( cv, p, vals[idx_lead][0], no_vals_last, no_vals_ind[idx_lead][0] ); + break; + case 4: + dim_loc += no_vals_ind[idx_lead][2]; + n_crt = no_vals_ind[idx_lead][2]; + index1 = (Word32) index / C_VQ[dim_loc][n_crt]; + index -= index1 * C_VQ[dim_loc][n_crt]; + idx2c( dim_loc, p, n_crt, index ); + put_value( cv, p, vals[idx_lead][2], no_vals_last, no_vals_ind[idx_lead][2] ); + index = index1; + /* FALLTHRU */ + case 3: + dim_loc += no_vals_ind[idx_lead][1]; + n_crt = no_vals_ind[idx_lead][1]; + index1 = (Word32) index / C_VQ[dim_loc][n_crt]; + index -= index1 * C_VQ[dim_loc][n_crt]; + idx2c( dim_loc, p, n_crt, index ); + put_value( cv, p, vals[idx_lead][1], dim_loc - n_crt, n_crt ); + idx2c( LATTICE_DIM, p, no_vals_ind[idx_lead][0], index1 ); + put_value( cv, p, vals[idx_lead][0], dim_loc, no_vals_ind[idx_lead][0] ); + break; + } + + return; +} + +/*-----------------------------------------------------------------* + * put_value() + * + * inserts no_new_val values of val in the codevector cv at the positions given by the array p + *-----------------------------------------------------------------*/ + +static void put_value( + float *cv, /* i : input codevector */ + int16_t *p, /* i : array with positions */ + float val, /* i : value to be inserted */ + const int16_t dim, /* i : vector dimension */ + const int16_t no_new_val /* i : number of values to be inserted */ +) +{ + float cv_out[LATTICE_DIM]; + int16_t i, occ[LATTICE_DIM], cnt; + + for ( i = 0; i < dim + no_new_val; i++ ) + { + occ[i] = 0; + } + + for ( i = 0; i < no_new_val; i++ ) + { + cv_out[p[i]] = val; + occ[p[i]] = 1; + } + + cnt = 0; + for ( i = 0; i < dim + no_new_val; i++ ) + { + if ( occ[i] == 0 ) + { + cv_out[i] = cv[cnt++]; + } + } + + for ( i = 0; i < dim + no_new_val; i++ ) + { + cv[i] = cv_out[i]; + } + + return; +} + +/*-----------------------------------------------------------------* + * idx2c() + * + * decode index of binomial combinations, find the positions of k components out of n total components + *-----------------------------------------------------------------*/ + +static void idx2c( + int16_t n, /* i : total number of positions (components) */ + int16_t *p, /* o : array with positions of the k components */ + const int16_t k, /* i : number of components whose position is to be determined */ + Word32 val /* i : index to be decoded */ +) +{ + int16_t i, skip, pos, k1; + + skip = 0; + pos = 0; + k1 = k - 1; + while ( skip + C_VQ[n - pos - 1][k1] - 1 < val ) + { + skip += C_VQ[n - pos - 1][k1]; + pos++; + } + + p[0] = pos; + n -= pos + 1; + val -= skip; + if ( k == 1 ) + { + return; + } + + idx2c( n, p + 1, k1, val ); + + /* pos+1 */ + for ( i = 1; i < k; i++ ) + { + p[i] += pos + 1; + } + + return; +} + +/*-----------------------------------------------------------------* + * decode_sign_pc1() + * + *-----------------------------------------------------------------*/ + +static void decode_sign_pc1( + float *c, /* o : decoded codevector */ + int16_t idx_sign, /* i : sign index */ + const int16_t parity /* i : parity flag (+1/-1/0) */ +) +{ + int16_t i, len = LATTICE_DIM, cnt_neg = 1; + + if ( parity ) + { + len -= 1; + } + + for ( i = 0; i < len; i++ ) + { + if ( c[i] > 0 ) + { + if ( idx_sign % 2 ) + { + c[i] = -c[i]; + cnt_neg = -cnt_neg; + } + idx_sign >>= 1; + } + } + + if ( len < LATTICE_DIM ) + { + if ( cnt_neg != parity ) + { + c[len] = -c[len]; + } + } + + return; +} + +/*-----------------------------------------------------------------* + * extract_low() + * + * (!!!!! function for int64 !!!!) + *-----------------------------------------------------------------*/ + +static UWord32 extract_low( + UWord32 x ) +{ + return ( x & ( 0xffff ) ); +} + +/*-----------------------------------------------------------------* + * extract_high() + * + * (!!!!! function for int64 !!!!) + *-----------------------------------------------------------------*/ + +static UWord32 extract_high( + UWord32 x ) +{ + return ( x >> 16 ); +} + +/*-----------------------------------------------------------------* + * multiply32_32_64() + * + * (!!!!! function for int64 !!!!) + *-----------------------------------------------------------------*/ + +void multiply32_32_64( + UWord32 x, + UWord32 y, + UWord32 *res ) +{ + UWord32 tmp, x_tmp[2], y_tmp[2]; + UWord32 high = 0; + + x_tmp[0] = extract_low( x ); /* lowest 16 bits */ + x_tmp[1] = extract_high( x ); + y_tmp[0] = extract_low( y ); + y_tmp[1] = extract_high( y ); + tmp = x_tmp[0] * y_tmp[0]; + high = extract_high( tmp ); + res[0] = extract_low( tmp ); + tmp = x_tmp[1] * y_tmp[0] + x_tmp[0] * y_tmp[1] + high; /* x and y are not using all 32 bits */ + high = extract_high( tmp ); + res[0] += ( extract_low( tmp ) << 16 ); + tmp = x_tmp[1] * y_tmp[1] + high; + res[1] = tmp; + + return; +} + +/*-----------------------------------------------------------------* + * get_no_bits() + * + * (!!!!! function for int64 !!!!) + *-----------------------------------------------------------------*/ + +static int16_t get_no_bits( + UWord32 x ) +{ + int16_t nb = 0; + + if ( x == 0 ) + { + return 1; + } + + while ( x > 0 ) + { + x >>= 1; + nb++; + } + + return nb; +} + +/*-----------------------------------------------------------------* + * divide_64_32() + * + * (!!!!! function for int64 !!!!) + *-----------------------------------------------------------------*/ + +static void divide_64_32( + int16_t *xs, /* i : denominator as array of two int32 */ + UWord32 y, /* i : nominator on 32 bits */ + UWord32 *result, /* o : integer division result on 32 bits */ + UWord32 *rem /* o : integer division reminder on 32 bits */ +) +{ + int16_t nb_x1; + UWord32 r, q, q1, x_tmp, x[2]; + + x[0] = ( ( (UWord32) xs[2] & ( ( 1 << 2 ) - 1 ) ) << ( LEN_INDICE * 2 ) ) + ( xs[1] << LEN_INDICE ) + xs[0]; + x[1] = xs[2] >> 2; + + /* find number of bits of x[0] and x[1] */ + nb_x1 = get_no_bits( x[1] ); + + /* take the first 32 bits */ + if ( nb_x1 > 0 ) + { + x_tmp = ( x[1] << ( 32 - nb_x1 ) ) + ( x[0] >> nb_x1 ); + q = (UWord32) ( x_tmp / y + 0.5 ); + r = x_tmp - q * y; /* this is the first reminder */ + r = ( r << nb_x1 ) + ( x[0] & ( ( 1 << nb_x1 ) - 1 ) ); + + q1 = (UWord32) ( r / y + 0.5 ); + *result = ( q << nb_x1 ) + q1; + *rem = r - q1 * y; + } + else + { + x_tmp = x[0]; + q = ( (UWord32) ( x_tmp / y + 0.5 ) ); + *result = q; + *rem = x_tmp - q * y; + } + + return; +} + + +/*-----------------------------------------------------------------* + * create_offset() + * + * + *-----------------------------------------------------------------*/ + +void create_offset( + UWord32 *offset_scale1, + UWord32 *offset_scale2, + const int16_t mode, + const int16_t prediction_flag ) +{ + int16_t tmp, tmp1; + + if ( prediction_flag == 0 ) + { + /* safety_net */ + tmp = no_lead_idx[mode][0]; + if ( ( tmp <= LIMIT_LEADER ) && ( tmp < no_lead_idx[mode][1] - 2 ) ) + { + tmp += DELTA_LEADER; + } + make_offset_scale( table_no_cv, leaders_short[tmp], MAX_NO_SCALES, offset_scale1 ); + make_offset_scale( table_no_cv, leaders_short[no_lead_idx[mode][1]], MAX_NO_SCALES, offset_scale2 ); + } + else + { + tmp = no_lead_p_idx[mode][0]; + tmp1 = no_lead_p_idx[mode][1]; + if ( ( tmp <= LIMIT_LEADER ) && ( tmp < tmp1 - 2 ) ) + { + tmp += DELTA_LEADER; + } + + if ( ( tmp == LIMIT_LEADER ) && ( tmp1 == 0 ) ) + { + tmp += DELTA_LEADER; + tmp1 = DELTA_LEADER; + } + + make_offset_scale( table_no_cv, leaders_short[tmp], MAX_NO_SCALES, offset_scale1 ); + make_offset_scale( table_no_cv, leaders_short[tmp1], MAX_NO_SCALES, offset_scale2 ); + } + + return; +} + +/*-----------------------------------------------------------------* + * sort_desc_ind() + * + * sorts in descending order and computes indices in the sorted vector + *-----------------------------------------------------------------*/ +void sort_desc_ind( + float *s, /* i/o: vector to be sorted */ + const int16_t len, /* i : vector length */ + int16_t *ind /* o : array of indices */ +) +{ + int16_t i, k, sorted, a; + float t; + + for ( i = 0; i < len; i++ ) + { + ind[i] = i; + } + sorted = 0; + for ( k = len - 1; k && !sorted; k-- ) + { + sorted = 1; + for ( i = 0; i < k; i++ ) + { + if ( s[i] < s[i + 1] ) + { + sorted = 0; + t = s[i]; + s[i] = s[i + 1]; + s[i + 1] = t; + a = ind[i]; + ind[i] = ind[i + 1]; + ind[i + 1] = a; + } + } + } + + return; +} + +/*-----------------------------------------------------------------* + * deindex_lvq_SHB() + * + * + *-----------------------------------------------------------------*/ + +void deindex_lvq_SHB( + UWord32 index, + float *out, + const int16_t nbits, + const int16_t mode ) +{ + uint16_t i; + const Word8 *p_no_lead; + const float *p_scales; + float scale; + int16_t idx_scale; + UWord32 offsets[MAX_NO_SCALES + 1]; + + if ( mode == 0 ) + { + p_no_lead = &no_lead_BWE[( nbits - mslvq_SHB_min_bits[0] ) * 3]; + p_scales = &scales_BWE[( nbits - mslvq_SHB_min_bits[0] ) * 3]; + } + else + { + p_no_lead = &no_lead_BWE_3b[( nbits - mslvq_SHB_min_bits[1] ) * 3]; + p_scales = &scales_BWE_3b[( nbits - mslvq_SHB_min_bits[1] ) * 3]; + } + + + if ( index == 0 ) + { + set_zero( out, LATTICE_DIM ); + } + else + { + /* create offsets */ + offsets[0] = 0; + for ( i = 0; i < MAX_NO_SCALES; i++ ) + { + offsets[i + 1] = table_no_cv[p_no_lead[i]] + offsets[i]; + } + + /* find idx_scale */ + idx_scale = 0; + while ( (int16_t) i <= MAX_NO_SCALES && index >= offsets[idx_scale] ) + { + idx_scale++; + } + idx_scale--; + index -= offsets[idx_scale]; + + /* find idx_leader */ + i = 1; + while ( index >= table_no_cv[i] ) + { + i++; + } + i = i - 1; + + decode_comb( (Word32) ( index - table_no_cv[i] - 1 ), out, i ); + + scale = p_scales[idx_scale]; + for ( i = 0; i < LATTICE_DIM; i++ ) + { + out[i] *= scale * sigma_BWE[mode * LATTICE_DIM + i]; + } + } + + return; +} diff --git a/lib_com/nelp.c b/lib_com/nelp.c new file mode 100644 index 0000000000000000000000000000000000000000..768b92f915f96879b0a2288a93a529db235d7a8e --- /dev/null +++ b/lib_com/nelp.c @@ -0,0 +1,156 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "rom_com.h" +#include "prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * dequantize_uvg() + * + * Dequantize unvoiced gains + *--------------------------------------------------------------------*/ + +void dequantize_uvg( + int16_t iG1, /* i : gain 1 index */ + int16_t *iG2, /* i : gain 2 index */ + float *G, /* o : quantized gain */ + const int16_t bwidth /* i : audio bandwidth */ +) +{ + int16_t i, k; + const float( *UVG1CB )[2] = NULL; + const float( *UVG2CB1 )[5] = NULL; + const float( *UVG2CB2 )[5] = NULL; + + if ( bwidth == NB ) + { + UVG1CB = UVG1CB_NB; + UVG2CB1 = UVG2CB1_NB; + UVG2CB2 = UVG2CB2_NB; + } + + else if ( bwidth == WB || bwidth == SWB ) + { + UVG1CB = UVG1CB_WB; + UVG2CB1 = UVG2CB1_WB; + UVG2CB2 = UVG2CB2_WB; + } + + for ( i = 0; i < 2; i++ ) + { + for ( k = 0; k < 5; k++ ) + { + if ( i == 0 ) + { + G[i * 5 + k] = (float) pow( 10.0, UVG1CB[iG1][i] ) * UVG2CB1[iG2[i]][k]; + } + else if ( i == 1 ) + { + G[i * 5 + k] = (float) pow( 10.0, UVG1CB[iG1][i] ) * UVG2CB2[iG2[i]][k]; + } + } + } + + return; +} + +/*-------------------------------------------------------------------* + * generate_nelp_excitation() + * + * Generate excitation for NELP coding. + *--------------------------------------------------------------------*/ + +void generate_nelp_excitation( + int16_t *seed, /* i/o: random number seed */ + float *Gains, /* i : excitation gains */ + float *output, /* o : excitation output */ + float gain_fac /* i : gain factor */ +) +{ + int16_t i, len, j; + float tmp[31], tmp1[31], tmpf; + int16_t k1, k2, I[31], tmpi; + + for ( i = 0; i < 10; i++ ) + { + if ( i == 9 ) + { + len = 31; + } + else + { + len = 25; + } + + for ( j = 0; j < len; j++ ) + { + tmp[j] = ( ( *seed ) = 521 * ( *seed ) + 259 ) / PCM16_TO_FLT_FAC; + tmp1[j] = ABSVAL( tmp[j] ); + I[j] = j; + } + for ( k1 = 0; k1 < len - 1; k1++ ) + { + for ( k2 = k1 + 1; k2 < len; k2++ ) + { + if ( tmp1[k2] > tmp1[k1] ) + { + tmpi = I[k2]; + tmpf = tmp1[k2]; + tmp1[k2] = tmp1[k1]; + I[k2] = I[k1]; + tmp1[k1] = tmpf; + I[k1] = tmpi; + } + } + } + + /*using a factor of 1.37 to compensate for the ~ 2.5 ( or 2.73) dB diff between this scheme and EVS-UV */ + for ( j = 0; j < (int16_t) rint_new( len / 4.0f ); j++ ) + { + output[i * 25 + I[j]] = (float) ( Gains[i] * sqrt( 3.0f ) * tmp[I[j]] * gain_fac ); + } + for ( ; j < len; j++ ) + { + output[i * 25 + I[j]] = 0; + } + } + + return; +} diff --git a/lib_com/options.h b/lib_com/options.h new file mode 100644 index 0000000000000000000000000000000000000000..31d4cb855c31be54ffd715acd1df07b3a645b4eb --- /dev/null +++ b/lib_com/options.h @@ -0,0 +1,93 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#ifndef OPTIONS_H +#define OPTIONS_H + +/* clang-format off */ + /* ################### Start compiler switches ######################## */ + +#define SUPPORT_JBM_TRACEFILE /* support for JBM tracefile, which is needed for 3GPP objective/subjective testing, but not relevant for real-world implementations */ + +/* #################### End compiler switches ######################### */ + + +/* ################### Start DEBUGGING switches ########################### */ + +/*#define WMOPS*/ /* Activate complexity and memory counters */ +/*#define WMOPS_PER_FRAME*/ /* Output per-frame complexity (writes one float value per frame to the file "wmops_analysis") */ +/*#define WMOPS_DETAIL*/ /* Output detailed complexity printout for every function. Increases runtime overhead */ +/*#define WMOPS_WC_FRAME_ANALYSIS*/ /* Output detailed complexity analysis for the worst-case frame */ +/*#define MEM_COUNT_DETAILS*/ /* Output detailed memory analysis for the worst-case frame (writes to the file "mem_analysis.csv") */ + + +/* #################### End DEBUGGING switches ############################ */ + + +#define BASOP_NOGLOB /* Disable global symbols in BASOPs, Overflow/Carry in BASOPs disabled, additional BASOPs in case of Overflow */ + + +/* ################### Start BE switches ################################# */ +/* only BE switches wrt selection floating point code */ + +/*#define FIX_I4_OL_PITCH*/ /* fix open-loop pitch used for EVS core switching */ + +#define FIX_854_ARRAY_SIZE_MISMATCH /* VA: issue 854: correct the mismatch between definition and declaration of `ivas_core_dec() */ +#define FIX_785_REMOVE_DEAD_CODE /* VA: issue 785: remove dead code */ +#define FIX_852_FIX_HANDLE_DEREF /* VA: issue 852: Fix missing handle dereferencing of hIsmMetadaData in ivas_ism_metadata_close() */ + + +/* #################### End BE switches ################################## */ + + +/* #################### Start NON-BE switches ############################ */ +/* any switch which is non-be wrt selection floating point code */ +/* all switches in this category should start with "NONBE_" */ + +#define NONBE_FIX_838_CRASH_24_4_WB /* FhG: Issue 838: fix encoder crashes for Unified Stereo and MASA 2 TC at 24.4 kbps WB due to missing IGF (re-) allocation */ +#define NONBE_FIX_839_MC_RS_CHANNEL_ALLOC /* FhG: Issues #839: problems with reallocation of the channels on the heap in case of MC RS */ +#define BE_FIX_832_ASAN_ERROR_EFAP_OSBA /* FhG: issue #832: fix ASAN error caused by re-allocating EFAP memories in OSBA*/ +#define NONBE_FIX_819_DOUBLE_PREC_COMB_FORMATS /* VA: issue 820: Double precision arithmetic in combined formats */ +#define NONBE_FIX_849_OMASA_BFI_CRASH /* VA: issue 849: fix OMASA 2TC and FEC crashes */ + + +/* ##################### End NON-BE switches ########################### */ + +/* ################## End DEVELOPMENT switches ######################### */ + +/* clang-format on */ + +#endif diff --git a/lib_com/parameter_bitmaping.c b/lib_com/parameter_bitmaping.c new file mode 100644 index 0000000000000000000000000000000000000000..720324b1e9175388b5a39dfc87e781be7226820b --- /dev/null +++ b/lib_com/parameter_bitmaping.c @@ -0,0 +1,260 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include "options.h" +#include "stat_com.h" +#include "prot.h" +#include "wmc_auto.h" + + +/********************************/ +/* Helper functions */ +/********************************/ + +/** Put nBits long encoded value from *pStream into bitstream. Using the function EncodeValue for encoding. */ +static int16_t PutIntoBitstream( const int16_t **pStream, TEncodeValue EncodeValue, int16_t index, BSTR_ENC_HANDLE hBstr, const int16_t nBits ) +{ + const int16_t value = *( *pStream )++; + const int16_t codedValue = EncodeValue( value, index ); + + push_next_indice( hBstr, codedValue, nBits ); + + return value; +} + +/** Get nBits long value from bitstream into *pStream. */ +static int16_t GetFromBitstream( + Decoder_State *st, + TDecodeValue DecodeValue, + uint16_t index, + int16_t nFixedBits, + int16_t **pStream ) +{ + int16_t value = 0; + if ( DecodeValue != NULL ) + { + DecodeValue( st, index, &value ); + } + else + { + value = get_next_indice( st, nFixedBits ); + } + *( *pStream )++ = value; + + return value; +} + + +static int16_t FixedWidthEncoding( int16_t value, int16_t index ) +{ + (void) index; /* suppress compiler warnings */ + + return value; +} + + +/********************************/ +/* Interface functions */ +/********************************/ + +void GetParameters( + ParamsBitMap const *paramsBitMap, + const int16_t nArrayLength, + void const *pParameter, + int16_t **pStream, + int16_t *pnSize, + int16_t *pnBits ) +{ + int16_t index; + int16_t iParam, nParams; + int16_t value; + void const *pSubStruct; + + assert( ( paramsBitMap != NULL ) && ( nArrayLength > 0 ) && ( pParameter != NULL ) && ( pStream != NULL ) && ( pnSize != NULL ) && ( pnBits != NULL ) ); + + nParams = paramsBitMap->nParams; + for ( index = 0; index < nArrayLength; index++ ) + { + for ( iParam = 0; iParam < nParams; iParam++ ) + { + ParamBitMap const *const param = ¶msBitMap->params[iParam]; + +#define WMC_TOOL_SKIP + pSubStruct = param->GetParamValue( pParameter, index, &value ); +#undef WMC_TOOL_SKIP + /* If a function for encoding/decoding value is defined than it should take care of 0 */ + if ( param->fZeroAllowed || ( param->EncodeValue != NULL ) ) + { + *( *pStream )++ = value; + } + else + { + *( *pStream )++ = value - 1; + } + ++*pnSize; +#define WMC_TOOL_SKIP + *pnBits += ( param->nBits != 0 ) ? param->nBits : param->GetNumberOfBits( value, index ); +#undef WMC_TOOL_SKIP + if ( ( param->pSubParamBitMap != NULL ) && ( value > 0 ) ) + { + GetParameters( param->pSubParamBitMap, value, ( pSubStruct != NULL ) ? pSubStruct : pParameter, pStream, pnSize, pnBits ); + } + } + } + + return; +} + + +void SetParameters( + ParamsBitMap const *paramsBitMap, + const int16_t nArrayLength, + void *pParameter, + const int16_t **pStream, + int16_t *pnSize ) +{ + int16_t index; + int16_t iParam, nParams; + int16_t value; + void *pSubStruct; + + assert( ( paramsBitMap != NULL ) && ( nArrayLength > 0 ) && ( pParameter != NULL ) && ( pStream != NULL ) && ( pnSize != NULL ) ); + + nParams = paramsBitMap->nParams; + for ( index = 0; index < nArrayLength; index++ ) + { + for ( iParam = 0; iParam < nParams; iParam++ ) + { + ParamBitMap const *const param = ¶msBitMap->params[iParam]; + /* If a function for encoding/decoding value is defined than it should take care of 0 */ + + value = *( *pStream )++ + ( param->fZeroAllowed || ( param->EncodeValue != NULL ) ? 0 : 1 ); +#define WMC_TOOL_SKIP + pSubStruct = param->SetParamValue( pParameter, index, value ); +#undef WMC_TOOL_SKIP + ++*pnSize; + if ( ( param->pSubParamBitMap != NULL ) && ( value > 0 ) ) + { + SetParameters( param->pSubParamBitMap, value, ( pSubStruct != NULL ) ? pSubStruct : pParameter, pStream, pnSize ); + } + } + } + + return; +} + + +void WriteToBitstream( + ParamsBitMap const *paramsBitMap, + const int16_t nArrayLength, + const int16_t **pStream, + int16_t *pnSize, + BSTR_ENC_HANDLE hBstr, + int16_t *pnBits ) +{ + int16_t index; + int16_t iParam, nParams; + + assert( ( paramsBitMap != NULL ) && ( nArrayLength > 0 ) && ( pStream != NULL ) && ( pnSize != NULL ) && ( hBstr != NULL ) && ( pnBits != NULL ) ); + + nParams = paramsBitMap->nParams; + for ( index = 0; index < nArrayLength; index++ ) + { + for ( iParam = 0; iParam < nParams; iParam++ ) + { + const ParamBitMap *param = ¶msBitMap->params[iParam]; + int16_t nBits; + /* If a function for encoding/decoding value is defined than it should take care of 0 */ + int16_t fShiftValue; + TEncodeValue EncodeValue; + int16_t value; + +#define WMC_TOOL_SKIP + nBits = ( param->nBits != 0 ) ? param->nBits : param->GetNumberOfBits( **pStream, index ); +#undef WMC_TOOL_SKIP + fShiftValue = !param->fZeroAllowed && ( param->EncodeValue == NULL ); + EncodeValue = ( param->EncodeValue == NULL ) ? &FixedWidthEncoding : param->EncodeValue; + value = PutIntoBitstream( pStream, EncodeValue, index, hBstr, nBits ) + ( fShiftValue ? 1 : 0 ); + ++*pnSize; + *pnBits += nBits; + if ( ( param->pSubParamBitMap != NULL ) && ( value > 0 ) ) + { + WriteToBitstream( param->pSubParamBitMap, value, pStream, pnSize, hBstr, pnBits ); + } + } + } + + return; +} + + +void ReadFromBitstream( + ParamsBitMap const *paramsBitMap, + const int16_t nArrayLength, + Decoder_State *st, + int16_t **pStream, + int16_t *pnSize ) +{ + int16_t index; + int16_t iParam, nParams; + int16_t fShiftValue; + int16_t value; + + assert( ( paramsBitMap != NULL ) && ( nArrayLength > 0 ) && ( pStream != NULL ) && ( pnSize != NULL ) && ( st != NULL ) ); + + nParams = paramsBitMap->nParams; + for ( index = 0; index < nArrayLength; index++ ) + { + for ( iParam = 0; iParam < nParams; iParam++ ) + { + ParamBitMap const *param = ¶msBitMap->params[iParam]; + /* If a function for encoding/decoding value is defined than it should take care of 0 */ + + fShiftValue = !param->fZeroAllowed && ( param->EncodeValue == NULL ); + value = GetFromBitstream( st, param->DecodeValue, index, param->nBits, pStream ) + ( fShiftValue ? 1 : 0 ); + if ( ( param->pSubParamBitMap != NULL ) && ( value > 0 ) ) + { + ReadFromBitstream( param->pSubParamBitMap, value, st, pStream, pnSize ); + } + } + } + + *pnSize += nParams * nArrayLength; + + return; +} diff --git a/lib_com/phase_dispersion.c b/lib_com/phase_dispersion.c new file mode 100644 index 0000000000000000000000000000000000000000..eeecc7aaa0d8b61882138313c33ae775fb059811 --- /dev/null +++ b/lib_com/phase_dispersion.c @@ -0,0 +1,155 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*-----------------------------------------------------------------------* + * phase_dispersion() + * + * Post-processing to enhance noise at low bitrate + *-----------------------------------------------------------------------*/ + +void phase_dispersion( + const float gain_code, /* i : gain of code */ + const float gain_pit, /* i : gain of pitch */ + float code[], /* i/o: code vector */ + const int16_t mode, /* i : level, 0=hi, 1=lo, 2=off */ + float disp_mem[] /* i/o: static memory (size = 8) */ +) +{ + int16_t i, j, state; + float *prev_gain_pit, *prev_gain_code, *prev_state; + float code2[2 * L_SUBFR]; + float h_disp[L_SUBFR], *code2_real, *code2_imag, *code_real, *code_imag, *h_real, *h_imag; + + prev_state = disp_mem; + prev_gain_code = disp_mem + 1; + prev_gain_pit = disp_mem + 2; + + state = 2; + if ( gain_pit < 0.6f ) + { + state = 0; + } + else if ( gain_pit < 0.9f ) + { + state = 1; + } + + for ( i = 5; i > 0; i-- ) + { + prev_gain_pit[i] = prev_gain_pit[i - 1]; + } + prev_gain_pit[0] = gain_pit; + + if ( gain_code - 3.0f * *prev_gain_code > 0.0f ) + { + if ( state < 2 ) + { + state++; + } + } + else + { + j = 0; + for ( i = 0; i < 6; i++ ) + { + if ( prev_gain_pit[i] < 0.6f ) + { + j++; + } + } + + if ( j > 2 ) + { + state = 0; + } + + if ( ( state - (int16_t) *prev_state ) > 1 ) + { + state--; + } + } + + *prev_gain_code = gain_code; + *prev_state = (float) state; + + /*-----------------------------------------------------------------* + * Circular convolution + *-----------------------------------------------------------------*/ + + state += mode; /* level of dispersion */ + if ( state < 2 ) + { + fft_rel( code, L_SUBFR, 6 ); + + if ( state == 0 ) + { + mvr2r( low_H, h_disp, L_SUBFR ); + } + + if ( state == 1 ) + { + mvr2r( mid_H, h_disp, L_SUBFR ); + } + + code2_real = code2; + code2_imag = code2 + L_SUBFR - 1; + code_real = code; + code_imag = code + L_SUBFR - 1; + h_real = h_disp; + h_imag = h_disp + L_SUBFR - 1; + *code2_real++ = *code_real++ * *h_real++; + + for ( i = 1; i < L_SUBFR / 2; i++ ) + { + *code2_real++ = *code_real * *h_real - *code_imag * *h_imag; + *code2_imag-- = *code_real++ * *h_imag-- + *code_imag-- * *h_real++; + } + + *code2_real++ = *code_real++ * *h_real++; + ifft_rel( code2, L_SUBFR, 6 ); + + mvr2r( code2, code, L_SUBFR ); + } + + return; +} diff --git a/lib_com/ppp.c b/lib_com/ppp.c new file mode 100644 index 0000000000000000000000000000000000000000..d9e553124ec3b9b9827fde1043dd16bc23ff0e03 --- /dev/null +++ b/lib_com/ppp.c @@ -0,0 +1,113 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * Interpol_delay() + * + * Interpolation of pitch lag + *--------------------------------------------------------------------*/ + +void Interpol_delay( + float *out, /* o : pitch interpolation output */ + float *last, /* i : last frame pitch lag */ + float *current, /* i : current frame pitch lag */ + int16_t SubNum, /* i : subframe number */ + const float *frac /* i : interpolation constant */ +) +{ + out[0] = ( 1.0f - frac[SubNum] ) * *last + frac[SubNum] * *current; + out[1] = ( 1.0f - frac[SubNum + 1] ) * *last + frac[SubNum + 1] * *current; + out[2] = ( 1.0f - frac[SubNum + 2] ) * *last + frac[SubNum + 2] * *current; + + return; +} + + +/*-------------------------------------------------------------------* + * deemph_lpc() + * + * De-emphasis of LP coefficients + * convolve LPC with [1 -PREEMPH_FAC] to de-emphasise LPC + *--------------------------------------------------------------------*/ + +void deemph_lpc( + float *p_Aq_curr, /* i : LP coefficients current frame */ + float *p_Aq_old, /* i : LP coefficients previous frame */ + float *LPC_de_curr, /* o : De-emphasized LP coefficients current frame */ + float *LPC_de_old, /* o : De-emphasized LP coefficients previous frame */ + const int16_t deemph_old ) +{ + int16_t k; + float b[M + 2]; + const float a[2] = { -PREEMPH_FAC, 1.0 }; + + b[0] = 1.0; + for ( k = 0; k < M; k++ ) + { + b[k + 1] = p_Aq_curr[k]; + } + b[M + 1] = 0.0; + + for ( k = 0; k <= M; k++ ) + { + LPC_de_curr[k] = a[0] * b[k] + a[1] * b[k + 1]; + } + + if ( deemph_old == 1 ) + { + /* ignoring the 1st value which is 1.0 in this case */ + b[0] = 1.0; + for ( k = 0; k < M; k++ ) + { + b[k + 1] = p_Aq_old[k + 1]; + } + b[M + 1] = 0.0; + + for ( k = 0; k <= M; k++ ) + { + LPC_de_old[k] = a[0] * b[k] + a[1] * b[k + 1]; + } + } + + return; +} diff --git a/lib_com/pred_lt4.c b/lib_com/pred_lt4.c new file mode 100644 index 0000000000000000000000000000000000000000..51a0227eae04e88b45dac4792b0b6fd516580857 --- /dev/null +++ b/lib_com/pred_lt4.c @@ -0,0 +1,156 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * pred_lt4() + * + * Compute the result of long term prediction with fractionnal + * interpolation of resolution 1/4. + * + * On return, exc[0..L_subfr-1] contains the interpolated signal + * (adaptive codebook excitation) + *-------------------------------------------------------------------*/ + +void pred_lt4( + const float excI[], /* i : input excitation buffer */ + float excO[], /* o : output excitation buffer */ + const int16_t T0, /* i : integer pitch lag */ + int16_t frac, /* i : fraction of lag */ + const int16_t L_subfr, /* i : subframe size */ + const float *win, /* i : interpolation window */ + const int16_t nb_coef, /* i : nb of filter coef */ + const int16_t up_sample /* i : up_sample */ +) +{ + int16_t i, j; + float s; + const float *x1, *x2, *x0, *c1, *c2; + + x0 = &excI[-T0]; + frac = -frac; + + if ( frac < 0 ) + { + frac += up_sample; + x0--; + } + + for ( j = 0; j < L_subfr; j++ ) + { + x1 = x0++; + x2 = x1 + 1; + c1 = &win[frac]; + c2 = &win[up_sample - frac]; + + s = 0.0f; + for ( i = 0; i < nb_coef; i++, c1 += up_sample, c2 += up_sample ) + { + s += ( *x1-- ) * ( *c1 ) + ( *x2++ ) * ( *c2 ); + } + excO[j] = s; + } + + return; +} + +/*-------------------------------------------------------------------* + * pred_lt4_tc() + * + * adapt. search of the second impulse in the same subframe (when appears) + * On return, exc[0..L_subfr-1] contains the interpolated signal + * (adaptive codebook excitation) + *-------------------------------------------------------------------*/ + +void pred_lt4_tc( + float exc[], /* i/o: excitation buffer */ + const int16_t T0, /* i : integer pitch lag */ + int16_t frac, /* i : fraction of lag */ + const float *win, /* i : interpolation window */ + const int16_t imp_pos, /* i : glottal impulse position */ + const int16_t i_subfr /* i : subframe index */ +) +{ + int16_t i, j; + float s; + const float *x1, *x2, *x0, *c1, *c2; + float excO[L_SUBFR + 1]; + float excI[2 * L_SUBFR]; + + mvr2r( exc + i_subfr - L_SUBFR, excI, 2 * L_SUBFR ); + + if ( ( ( T0 + imp_pos - L_IMPULSE2 ) < L_SUBFR ) && ( T0 < L_SUBFR ) ) + { + set_f( excI + L_SUBFR - T0, 0, T0 ); + set_f( excO, 0, L_SUBFR + 1 ); + x0 = excI + L_SUBFR; + frac = -frac; + + if ( frac < 0 ) + { + frac += PIT_UP_SAMP; + x0--; + } + + for ( j = T0; j < L_SUBFR + 1; j++ ) + { + x1 = x0++; + x2 = x1 + 1; + c1 = &win[frac]; + c2 = &win[PIT_UP_SAMP - frac]; + + s = 0.0f; + for ( i = 0; i < L_INTERPOL2; i++, c1 += PIT_UP_SAMP, c2 += PIT_UP_SAMP ) + { + s += ( *x1-- ) * ( *c1 ) + ( *x2++ ) * ( *c2 ); + } + excO[j] = s; + } + + for ( i = T0; i < L_SUBFR; i++ ) + { + exc[i + i_subfr] += PIT_SHARP * excO[i]; + } + } + + return; +} diff --git a/lib_com/preemph.c b/lib_com/preemph.c new file mode 100644 index 0000000000000000000000000000000000000000..024ad379c2a476d069def064c7a3182f7765194f --- /dev/null +++ b/lib_com/preemph.c @@ -0,0 +1,68 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------* + * preemph() + * + * Preemphasis: filtering through 1 - mu z^-1 + *-------------------------------------------------------------*/ + +void preemph( + float *signal, /* i/o: signal */ + const float mu, /* i : preemphasis factor */ + const int16_t L, /* i : vector size */ + float *mem /* i/o: memory (x[-1]) */ +) +{ + int16_t i; + float temp; + + temp = signal[L - 1]; + for ( i = L - 1; i > 0; i-- ) + { + signal[i] = signal[i] - mu * signal[i - 1]; + } + + signal[0] = signal[0] - mu * ( *mem ); + *mem = temp; + + return; +} diff --git a/lib_com/prot.h b/lib_com/prot.h new file mode 100644 index 0000000000000000000000000000000000000000..d277cefb1c9c1400ebd59803953923f383a5627f --- /dev/null +++ b/lib_com/prot.h @@ -0,0 +1,10019 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#ifndef PROT_H +#define PROT_H + +#include +#include +#include +#include "options.h" +#include "typedef.h" +#include "stat_enc.h" +#include "stat_dec.h" +#include "stat_com.h" +#include "ivas_stat_com.h" +#include "ivas_stat_enc.h" +#include "ivas_stat_dec.h" +#include "cnst.h" +#include "stl.h" +#include "ivas_error_utils.h" + + +/*----------------------------------------------------------------------------------* + * Prototypes of global macros + *----------------------------------------------------------------------------------*/ + +#ifndef min +#define min( x, y ) ( ( x ) < ( y ) ? ( x ) : ( y ) ) +#endif + +#ifndef max +#define max( x, y ) ( ( x ) > ( y ) ? ( x ) : ( y ) ) +#endif + +#ifndef TRUNC +#define TRUNC( x ) ( (int16_t) ( ( ( x ) >= 32767. ? 32767 : ( ( x ) <= -32768. ? -32768 : ( x ) ) ) + 0.5 ) ) +#endif + +#define log_base_2( x ) ( (double) log( (double) ( x ) ) * 1.4426950408889634074f ) +#define round_f( x ) ( ( ( x ) > 0 ) ? (int32_t) ( ( x ) + 0.5f ) : ( -(int32_t) ( ( -x ) + 0.5f ) ) ) + +#ifndef ABSVAL +#define ABSVAL( a ) ( ( a ) >= 0 ? ( a ) : ( -( a ) ) ) +#endif + +#ifndef SQR +#define SQR( a ) ( ( a ) * ( a ) ) +#endif + +#ifndef SWAP +#define SWAP( a, b ) \ + { \ + tempr = ( a ); \ + ( a ) = ( b ); \ + ( b ) = tempr; \ + } +#endif + +#ifndef swap +#define swap( x, y, type ) \ + { \ + type u__p; \ + u__p = x; \ + x = y; \ + y = u__p; \ + } +#endif + +#define set_max( a, b ) \ + { \ + if ( ( b ) > *a ) \ + { \ + *a = ( b ); \ + } \ + } /* If the first argument is already the highes or lowest, nothing is done. */ +#define set_min( a, b ) \ + { \ + if ( ( b ) < *a ) \ + { \ + *a = ( b ); \ + } \ + } /* Otherwise, the 2nd arg is stored at the address of the first arg. */ + +static __inline Word16 L_Extract_lc( const Word32 L_32, Word16 *p_hi ) +{ + *p_hi = extract_h( L_32 ); + return lshr( extract_l( L_32 ), 1 ); +} + +/*----------------------------------------------------------------------------------* + * MODE1 prototypes + *----------------------------------------------------------------------------------*/ + +/*! r: inverse square root of input value */ +float inv_sqrt( + const float x /* i : input value */ +); + +/*! r: output random value */ +int16_t own_random( + int16_t *seed /* i/o: random seed */ +); + +/*! r: sign of x (+1/-1) */ +float sign( + const float x /* i : input value of x */ +); + +/*! r: logarithm2 of x */ +float log2_f( + const float x /* i : input value of x */ +); + +int16_t norm_ul( + uint32_t UL_var1 ); + +/*! r: sum of all vector elements */ +int16_t sum_s( + const int16_t *vec, /* i : input vector */ + const int16_t lvec /* i : length of input vector */ +); + +/*! r: sum of all vector elements */ +int32_t sum_l( + const int32_t *vec, /* i : input vector */ + const int16_t lvec /* i : length of input vector */ +); + +/*! r: sum of all vector elements */ +float sum_f( + const float *vec, /* i : input vector */ + const int16_t lvec /* i : length of input vector */ +); + +/*! r: sum of all squared vector elements */ +float sum2_f( + const float *vec, /* i : input vector */ + const int16_t lvec /* i : length of input vector */ +); + +void set_c( + int8_t y[], /* i/o: Vector to set */ + const int8_t a, /* i : Value to set the vector to */ + const int32_t N /* i : Length of the vector */ +); + +void set_s( + int16_t y[], /* i/o: Vector to set */ + const int16_t a, /* i : Value to set the vector to */ + const int16_t N /* i : Lenght of the vector */ +); + +void set_l( + int32_t y[], /* i/o: Vector to set */ + const int32_t a, /* i : Value to set the vector to */ + const int16_t N /* i : Length of the vector */ +); + +void set_f( + float y[], /* i/o: Vector to set */ + const float a, /* i : Value to set the vector to */ + const int16_t N /* i : Lenght of the vector */ +); + +void set_zero( + float *vec, /* o : input vector */ + const int16_t lvec /* i : length of the vector */ +); + +void mvr2r( + const float x[], /* i : input vector */ + float y[], /* o : output vector */ + const int16_t n /* i : vector size */ +); + +void mvs2s( + const int16_t x[], /* i : input vector */ + int16_t y[], /* o : output vector */ + const int16_t n /* i : vector size */ +); + +uint32_t mvr2s( + const float x[], /* i : input vector */ + int16_t y[], /* o : output vector */ + const int16_t n /* i : vector size */ +); + +void mvs2r( + const int16_t x[], /* i : input vector */ + float y[], /* o : output vector */ + const int16_t n /* i : vector size */ +); + +void mvl2l( + const int32_t x[], /* i : input vector */ + int32_t y[], /* o : output vector */ + const int16_t n /* i : vector size */ +); + +void AGC_dec( + float x[], /* i/o: input/output vector */ + float mem[], /* i/o: mem[2] should be init to [0,0] */ + const int16_t n /* i : vector size */ +); + +/*! r: index of the maximum value in the input vector */ +int16_t maximum( + const float *vec, /* i : input vector */ + const int16_t lvec, /* i : length of input vector */ + float *max_val /* o : maximum value in the input vector */ +); + +/*! r: index of the maximum value in the input vector */ +int16_t maximum_s( + const int16_t *vec, /* i : input vector */ + const int16_t lvec, /* i : length of input vector */ + int16_t *max /* o : maximum value in the input vector */ +); + +/*! r: index of the maximum value in the input vector */ +int16_t maximumAbs( + const float *vec, /* i : input vector */ + const int16_t lvec, /* i : length of input vector */ + float *max_val /* o : maximum value in the input vector */ +); + +/*! r: index of the minimum value in the input vector */ +int16_t minimum( + const float *vec, /* i : input vector */ + const int16_t lvec, /* i : length of input vector */ + float *min_val /* o : minimum value in the input vector */ +); + +/*! r: index of the minimum value in the input vector */ +int16_t minimum_s( + const int16_t *vec, /* i : Input vector */ + const int16_t lvec, /* i : Vector length */ + int16_t *min_val /* o : minimum value in the input vector */ +); + +/*! r: return index with max energy value in vector */ +int16_t emaximum( + const float *vec, /* i : input vector */ + const int16_t lvec, /* i : length of input vector */ + float *ener_max /* o : maximum energy value */ +); + +/*! r: vector mean */ +float mean( + const float *vec, /* i : input vector */ + const int16_t lvec /* i : length of input vector */ +); + +/*! r: dot product of x[] and y[] */ +float dotp( + const float x[], /* i : vector x[] */ + const float y[], /* i : vector y[] */ + const int16_t n /* i : vector length */ +); + +void conv( + const float x[], /* i : input vector */ + const float h[], /* i : impulse response (or second input vector) */ + float y[], /* o : output vetor (result of convolution) */ + const int16_t L /* i : vector size */ +); + +void fir( + const float x[], /* i : input vector */ + const float h[], /* i : impulse response of the FIR filter */ + float y[], /* o : output vector (result of filtering) */ + float mem[], /* i/o: memory of the input signal (M samples) */ + const int16_t L, /* i : input vector size */ + const int16_t K, /* i : order of the FIR filter (M+1 coefs.) */ + const int16_t upd /* i : 1 = update the memory, 0 = not */ +); + +void v_add( + const float x1[], /* i : Input vector 1 */ + const float x2[], /* i : Input vector 2 */ + float y[], /* o : Output vector that contains vector 1 + vector 2 */ + const int16_t N /* i : Vector length */ +); + +void v_sub( + const float x1[], /* i : Input vector 1 */ + const float x2[], /* i : Input vector 2 */ + float y[], /* o : Output vector that contains vector 1 - vector 2 */ + const int16_t N /* i : Vector length */ +); + +void v_mult( + const float x1[], /* i : Input vector 1 */ + const float x2[], /* i : Input vector 2 */ + float y[], /* o : Output vector that contains vector 1 .* vector 2*/ + const int16_t N /* i : Vector length */ +); + +void v_multc( + const float x[], /* i : Input vector */ + const float c, /* i : Constant */ + float y[], /* o : Output vector that contains c*x */ + const int16_t N /* i : Vector length */ +); + +void v_sub_s( + const int16_t x1[], /* i : Input vector 1 */ + const int16_t x2[], /* i : Input vector 2 */ + int16_t y[], /* o : Output vector that contains vector 1 - vector 2 */ + const int16_t N /* i : Vector length */ +); + +/*! r: index of the winning codeword */ +int16_t squant( + const float x, /* i : scalar value to quantize */ + float *xq, /* o : quantized value */ + const float cb[], /* i : codebook */ + const int16_t cbsize /* i : codebook size */ +); + +int16_t squant_int( + uint8_t x, /* i : scalar value to quantize */ + uint8_t *xq, /* o : quantized value */ + const uint8_t *cb, /* i : codebook */ + const int16_t cbsize /* i : codebook size */ +); + +/*! r: index of the winning codevector */ +int16_t vquant( + float x[], /* i : vector to quantize */ + const float x_mean[], /* i : vector mean to subtract (0 if none) */ + float xq[], /* o : quantized vector */ + const float cb[], /* i : codebook */ + const int16_t dim, /* i : dimension of codebook vectors */ + const int16_t cbsize /* i : codebook size */ +); + +/*! r: index of the winning codevector */ +int16_t w_vquant( + float x[], /* i : vector to quantize */ + const float x_mean[], /* i : vector mean to subtract (0 if none) */ + const int16_t weights[], /* i : error weights */ + float xq[], /* o : quantized vector */ + const float cb[], /* i : codebook */ + const int16_t dim, /* i : dimension of codebook vectors */ + const int16_t cbsize, /* i : codebook size */ + const int16_t reverse /* i : reverse codebook vectors */ +); + +/*! r: index of the winning codeword */ +int16_t usquant( + const float x, /* i : scalar value to quantize */ + float *xq, /* o : quantized value */ + const float qlow, /* i : lowest codebook entry (index 0) */ + const float delta, /* i : quantization step */ + const int16_t cbsize /* i : codebook size */ +); + +/*! r: dequanzited gain */ +float usdequant( + const int16_t idx, /* i : quantizer index */ + const float qlow, /* i : lowest codebook entry (index 0) */ + const float delta /* i : quantization step */ +); + +void v_sort( + float *r, /* i/o: Vector to be sorted in place */ + const int16_t lo, /* i : Low limit of sorting range */ + const int16_t up /* i : High limit of sorting range */ +); + +void sort( + uint16_t *x, /* i/o: Vector to be sorted */ + uint16_t len /* i/o: vector length */ +); + +/*! r: variance of vector */ +float var( + const float *x, /* i : input vector */ + const int16_t len /* i : length of inputvector */ +); + +/*! r: standard deviation */ +float std_dev( + const float *x, /* i : input vector */ + const int16_t len /* i : length of the input vector */ +); + +/*! r: the dot product x'*A*x */ +float dot_product_mat( + const float *x, /* i : vector x */ + const float *A, /* i : matrix A */ + const int16_t m /* i : vector length */ +); + +float root_a( + float a ); + +float root_a_over_b( + float a, + float b ); + +void polezero_filter( + const float *in, /* i : input vector */ + float *out, /* o : output vector */ + const int16_t N, /* i : input vector size */ + const float *b, /* i : numerator coefficients */ + const float *a, /* i : denominator coefficients */ + const int16_t order, /* i : filter order */ + float *mem /* i/o: filter memory */ +); + +double rint_new( + double x /* i/o: Round to the nearest integer with mid point exception */ +); + +double anint( + double x /* i/o: Round to the nearest integer */ +); + +/*! r: Output either 1 if Numeric, 0 if NaN or Inf */ +int16_t is_numeric_float( + float x /* i : Input value which is checked if numeric or not */ +); + +void delay_signal( + float x[], /* i/o: signal to be delayed */ + const int16_t len, /* i : length of the input signal */ + float mem[], /* i/o: synchronization memory */ + const int16_t delay /* i : delay in samples */ +); + +ivas_error push_indice( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + int16_t id, /* i : ID of the indice */ + uint16_t value, /* i : value of the quantized indice */ + int16_t nb_bits /* i : number of bits used to quantize the indice */ +); + +ivas_error push_next_indice( + BSTR_ENC_HANDLE hBstr, + uint16_t value, /* i : value of the quantized indice */ + int16_t nb_bits /* i : number of bits used to quantize the indice */ +); + +ivas_error push_next_bits( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const uint16_t bits[], /* i : bit buffer to pack, sequence of single bits */ + const int16_t nb_bits /* i : number of bits to pack */ +); + +/*! r: maximum number of indices */ +int16_t get_ivas_max_num_indices( + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const int32_t ivas_total_brate /* i : IVAS total bitrate */ +); + +/*! r: maximum number of indices */ +int16_t get_BWE_max_num_indices( + const int32_t extl_brate /* i : extensiona layer bitrate */ +); + +/*! r: maximum number of indices */ +int16_t get_ivas_max_num_indices_metadata( + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const int32_t ivas_total_brate /* i : IVAS total bitrate */ +); + +ivas_error ind_list_realloc( + INDICE_HANDLE old_ind_list, /* i : pointer to the beginning of the old buffer of indices */ + const int16_t max_num_indices, /* i : new maximum number of allowed indices in the list */ + Encoder_Struct *st_ivas /* i : IVAS encoder structure */ +); + +ivas_error check_ind_list_limits( + BSTR_ENC_HANDLE hBstr /* i/o: encoder bitstream handle */ +); + +void move_indices( + INDICE_HANDLE old_ind_list, /* i/o: old location of indices */ + INDICE_HANDLE new_ind_list, /* i/o: new location of indices */ + const int16_t nb_indices /* i : number of moved indices */ +); + +/*! r: index of the indice in the list, -1 if not found */ +int16_t find_indice( + BSTR_ENC_HANDLE hBstr, /* i : encoder bitstream handle */ + const int16_t id, /* i : ID of the indice */ + uint16_t *value, /* o : value of the quantized indice */ + int16_t *nb_bits /* o : number of bits used to quantize the indice */ +); + +/*! r: number of deleted indices */ +uint16_t delete_indice( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const int16_t id /* i : ID of the indice */ +); + +/*! r: value of the indice */ +uint16_t get_next_indice( + Decoder_State *st, /* i/o: decoder state structure */ + int16_t nb_bits /* i : number of bits that were used to quantize the indice */ +); + +/*! r: value of the indice */ +uint16_t get_next_indice_1( + Decoder_State *st /* i/o: decoder state structure */ +); + +void get_next_indice_tmp( + Decoder_State *st, /* o : decoder state structure */ + int16_t nb_bits /* i : number of bits that were used to quantize the indice */ +); + +/*! r: value of the indice */ +uint16_t get_indice( + Decoder_State *st, /* i/o: decoder state structure */ + int16_t pos, /* i : absolute position in the bitstream */ + int16_t nb_bits /* i : number of bits that were used to quantize the indice */ +); + +/*! r: value of the indice */ +uint16_t get_indice_1( + Decoder_State *st, /* i/o: decoder state structure */ + int16_t pos /* i : absolute position in the bitstream */ +); + +void reset_indices_enc( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const int16_t max_num_indices /* i : max number of indices */ +); + +void reset_indices_dec( + Decoder_State *st /* i/o: decoder state structure */ +); + +ivas_error write_indices_ivas( + Encoder_Struct *st_ivas, /* i/o: encoder state structure */ + uint16_t *bit_stream, /* i/o: output bitstream */ + uint16_t *num_bits /* i/o: number of bits written to output */ +); + +Word16 rate2EVSmode( + const Word32 brate, /* i : bitrate */ + int16_t *is_amr_wb /* o : (flag) does the bitrate belong to AMR-WB? Can be NULL */ +); + + +/*! r: 1 = OK, 0 = something wrong */ +ivas_error read_indices( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + uint16_t bit_stream[], /* i : bitstream buffer */ + UWord16 num_bits, /* i : number of bits in bitstream */ + int16_t *prev_ft_speech, + int16_t *CNG, + int16_t bfi /* i : bad frame indicator */ +); + + +void ivas_set_bitstream_pointers( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +); + +Decoder_State **reset_elements( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +); + + +void convertSerialToBytestream( + const uint16_t *const serial, /* i : input serial bitstream with values 0 and 1 */ + const uint16_t num_bits, /* i : number of bits in the input bitstream */ + uint8_t *const bytestream /* o : output compact bitstream (bytestream) */ +); + +void convertBytestreamToSerial( + const uint8_t *const bytestream, /* i : input compact bitstream (bytestream) */ + const uint16_t num_bits, /* i : number of bits in the input bitstream */ + uint16_t *const serial /* o : output serial bitstream with values 0 and 1 */ +); + +void mdct_switching_dec( + Decoder_State *st /* i/o: decoder state structure */ +); + +void evs_dec_previewFrame( + uint8_t *bitstream, /* i : bitstream pointer */ + int16_t bitstreamSize, /* i : bitstream size */ + int16_t *partialCopyFrameType, /* o : frame type of the partial copy */ + int16_t *partialCopyOffset /* o : offset of the partial copy relative to the primary copy */ +); + + +void getPartialCopyInfo( + Decoder_State *st, /* i : decoder state structure */ + int16_t *sharpFlag ); + +void get_NextCoderType( + uint8_t *bitstream, /* i : bitstream */ + int16_t *next_coder_type /* o : next coder type */ +); + +int16_t print_disclaimer( + FILE *fPtr ); + +void autocorr( + const float *x, /* i : input signal */ + float *r, /* o : autocorrelations vector */ + const int16_t m, /* i : order of LP filter */ + const int16_t len, /* i : window size */ + const float *wind, /* i : window */ + const int16_t rev_flag, /* i : flag to reverse window */ + const int16_t sym_flag, /* i : symmetric window flag */ + const int16_t no_thr /* i : flag to avoid thresholding */ +); + +/*! r: energy of prediction error */ +int16_t lev_dur( + float *a, /* o : LP coefficients (a[0] = 1.0) */ + const float *r, /* i : vector of autocorrelations */ + const int16_t m, /* i : order of LP filter */ + float epsP[] /* o : prediction error energy */ +); + +/*! r: delay value in ns */ +int32_t get_delay( + const int16_t enc_dec, /* i : encoder/decoder flag */ + const int32_t io_fs, /* i : input/output sampling frequency */ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + HANDLE_CLDFB_FILTER_BANK hCldfb /* i : Handle of Cldfb analysis */ +); + +void decision_matrix_enc( + Encoder_State *st, /* i/o: encoder state structure */ + int16_t *hq_core_type /* o : HQ core type */ +); + +void signaling_enc( + Encoder_State *st /* i : encoder state structure */ +); + +int16_t signaling_mode1_tcx20_enc( + Encoder_State *st, /* i/o: encoder state structure */ + const int16_t push /* i : flag to push indice */ +); + +void decision_matrix_dec( + Decoder_State *st, /* i/o: decoder state structure */ + int16_t *sharpFlag, /* o : formant sharpening flag */ + int16_t *hq_core_type, /* o : HQ core type */ + int16_t *core_switching_flag /* o : ACELP->HQ switching frame flag */ +); + +/*! r: LP filter stability */ +float lsf_stab( + const float *lsf, /* i : LSF vector */ + const float *lsfold, /* i : old LSF vector */ + const int16_t Opt_AMR_WB, /* i : flag indicating AMR-WB IO mode */ + const int16_t L_frame /* i : frame length */ +); + +void amr_wb_dec_init( + AMRWB_IO_DEC_HANDLE hAmrwb_IO /* i/o: AMR-WB IO data handle */ +); + +void hf_synth_amr_wb_init( + AMRWB_IO_DEC_HANDLE hAmrwb_IO /* i/o: AMR-WB IO data handle */ +); + +void hf_synth_amr_wb_reset( + AMRWB_IO_DEC_HANDLE hAmrwb_IO, /* i/o: AMR-WB IO data handle */ + ZERO_BWE_DEC_HANDLE hBWE_zero /* o : zero BWE decoder handle */ +); + +void hf_synth_amr_wb( + AMRWB_IO_DEC_HANDLE hAmrwb_IO, /* i/o: AMR-WB IO data handle */ + ZERO_BWE_DEC_HANDLE hBWE_zero, /* o : zero BWE decoder handle */ + const int32_t core_brate, /* i : core bitrate */ + const int16_t output_frame, /* i : output frame length */ + const float *Aq, /* i : quantized Az */ + const float *exc, /* i : excitation at 12.8 kHz */ + float *synth, /* i/o: synthesis signal at 12.8 kHz */ + int16_t *amr_io_class, /* i : signal class (determined by FEC algorithm) */ + float *synth_out, /* i/o: synthesis signal at output Fs */ + float fmerit, /* i : classify parameter from FEC */ + const int16_t *hf_gain, /* i : decoded HF gain */ + const float *voice_factors, /* i : voicing factors */ + const float pitch_buf[], /* i : pitch buffer */ + const float ng_ener_ST, /* i : Noise gate - short-term energy */ + const float *lsf_new /* i : ISF vector */ +); + +void hf_cod_init( + float *mem_hp400_enc, /* o : memory of hp 400 Hz filter */ + float *mem_hf1_enc, /* o : HF band-pass filter memory */ + float *mem_syn_hf_enc, /* o : HF synthesis memory */ + float *mem_hf2_enc, /* o : HF band-pass filter memory */ + float *gain_alpha /* o : smoothing gain for transitions between active and inactive frames */ +); + +void hf_cod( + const int32_t core_brate, /* i : core bitrate */ + const float *speech16k, /* i : original speech at 16 kHz */ + const float Aq[], /* i : quantized Aq */ + const float exc[], /* i : excitation at 12.8 kHz */ + float synth[], /* i : 12.8kHz synthesis signal */ + int16_t *seed2_enc, /* i/o: random seed for HF noise gen */ + float *mem_hp400_enc, /* i/o: memory of hp 400 Hz filter */ + float *mem_syn_hf_enc, /* i/o: HF synthesis memory */ + float *mem_hf1_enc, /* i/o: HF band-pass filter memory */ + float *mem_hf2_enc, /* i/o: HF band-pass filter memory */ + const int16_t *dtxHangoverCount, + float *gain_alpha, /* i/o: smoothing gain for transitions between active and inactive frames */ + int16_t *hf_gain /* o : HF gain to be transmitted to decoder */ +); + +void hf_synth_init( + ZERO_BWE_DEC_HANDLE hBWE_zero /* o : zero BWE decoder handle */ +); + +void hf_synth_reset( + ZERO_BWE_DEC_HANDLE hBWE_zero /* o : zero BWE decoder handle */ +); + +void hf_synth( + ZERO_BWE_DEC_HANDLE hBWE_zero, /* o : zero BWE decoder handle */ + const int32_t core_brate, /* i : core bitrate */ + const int16_t output_frame, /* i : output frame length */ + const float *Aq, /* i : quantized Az */ + const float *exc, /* i : excitation at 12.8 kHz */ + float *synth, /* i/o: 12.8kHz synthesis signal */ + float *synth16k /* i/o: 16kHz synthesis signal */ +); + +int16_t lsp_convert_poly( + float w[], /* i/o: LSP or ISP parameters */ + const int16_t L_frame, /* i : flag for up or down conversion */ + const int16_t Opt_AMRWB /* i : flag for the AMR-WB IO mode */ +); + +/*! r: pulse position */ +int16_t findpulse( + const int16_t L_frame, /* i : length of the frame */ + const float res[], /* i : residual signal */ + const int16_t T0, /* i : integer pitch */ + const int16_t enc_dec, /* i : flag enc/dec, 0 - enc, 1 - dec */ + int16_t *sign /* i/o: sign of the maximum */ +); + +void fft_rel( + float x[], /* i/o: input/output vector */ + const int16_t n, /* i : vector length */ + const int16_t m /* i : log2 of vector length */ +); + +void ifft_rel( + float io[], /* i/o: input/output vector */ + const int16_t n, /* i : vector length */ + const int16_t m /* i : log2 of vector length */ +); + +void preemph( + float *signal, /* i/o: signal */ + const float mu, /* i : preemphasis factor */ + const int16_t L, /* i : vector size */ + float *mem /* i/o: memory (x[-1]) */ +); + +void cb_shape( + const int16_t preemphFlag, /* i : flag for pre-emphasis */ + const int16_t pitchFlag, /* i : flag for pitch sharpening */ + const int16_t scramblingFlag, /* i : flag for phase scrambling */ + const int16_t formantFlag, /* i : flag for formant sharpening */ + const int16_t formantTiltFlag, /* i : flag for formant tilt */ + const float g1, /* i : formant sharpening numerator weighting */ + const float g2, /* i : formant sharpening denominator weighting */ + const float *p_Aq, /* i : LP filter coefficients */ + float *code, /* i/o: signal to shape */ + const float tilt_code, /* i : tilt of code */ + const float pt_pitch, /* i : pointer to current subframe fractional pitch*/ + const int16_t L_subfr /* i : subfframe length */ +); + +void isp2a( + const float *isp, /* i : ISP vector (in the cosine domain) */ + float *a, /* o : LP filter coefficients */ + const int16_t m /* i : order of LP analysis */ +); + +void isp2isf( + const float isp[], /* i : isp[m] (range: -1<=val<1) */ + float isf[], /* o : isf[m] normalized (range: 0<=val<=fs/2) */ + const int16_t m, /* i : LPC order */ + const int32_t Fs /* i : sampling frequency */ +); + +void isf2isp( + const float isf[], /* i : isf[m] normalized (range: 0<=val<=fs/2) */ + float isp[], /* o : isp[m] (range: -1<=val<1) */ + const int16_t m, /* i : LPC order */ + const int32_t Fs /* i : sampling frequency */ +); + +void reorder_isf( + float *isf, /* i/o: vector of isfs in the frequency domain (0..0.5)*/ + const float min_dist, /* i : minimum required distance */ + const int16_t n, /* i : LPC order */ + const float Fs /* i : sampling frequency */ +); + +void lsp2lsf( + const float lsp[], /* i : isp[m] (range: -1<=val<1) */ + float lsf[], /* o : isf[m] normalized (range: 0<=val<=fs/2) */ + const int16_t m, /* i : LPC order */ + const int32_t Fs /* i : sampling frequency */ +); + +void lsf2lsp( + const float lsf[], /* i : isf[m] normalized (range: 0<=val<=fs/2) */ + float lsp[], /* o : isp[m] (range: -1<=val<1) */ + const int16_t m, /* i : LPC order */ + const int32_t Fs /* i : sampling frequency */ +); + +void lsp2isp( + const float *lsp, /* i : LSP vector */ + float *isp, /* o : ISP filter coefficients */ + float *stable_isp, /* i/o: ISP filter coefficients */ + const int16_t m /* i : order of LP analysis */ +); + +void isp2lsp( + const float *isp, /* i : LSP vector */ + float *lsp, /* o : ISP filter coefficients */ + float *stable_lsp, /* i/o: stable LSP filter coefficients */ + const int16_t m /* i : order of LP analysis */ +); + +void reorder_lsf( + float *lsf, /* i/o: vector of lsfs in the frequency domain (0..0.5)*/ + const float min_dist, /* i : minimum required distance */ + const int16_t n, /* i : LPC order */ + const int32_t Fs /* i : sampling frequency */ +); + +void CNG_exc( + const int32_t core_brate, /* i : core bitrate */ + const int16_t L_frame, /* i : length of the frame */ + float *Enew, /* i/o: decoded SID energy */ + int16_t *seed, /* i/o: random generator seed */ + float exc[], /* o : current non-enhanced excitation */ + float exc2[], /* o : current enhanced excitation */ + float *lp_ener, /* i/o: LP filtered E */ + const int32_t last_core_brate, /* i : previous frame core bitrate */ + int16_t *first_CNG, /* i/o: first CNG frame flag for energy init. */ + int16_t *cng_ener_seed, /* i/o: random generator seed for CNG energy */ + float bwe_exc[], /* o : excitation for SWB TBE */ + const int16_t allow_cn_step, /* i : allow CN step */ + int16_t *last_allow_cn_step, /* i/o: last CN_step */ + const int16_t num_ho, /* i : number of selected hangover frames */ + float q_env[], + float *lp_env, + float *old_env, + float *exc_mem, + float *exc_mem1, + int16_t *sid_bw, + int16_t *cng_ener_seed1, + float exc3[], + const int16_t Opt_AMR_WB, /* i : AMR-WB interop flag */ + const int16_t element_mode /* i : IVAS Element mode */ +); + +void cng_params_upd( + const float lsp_new[], /* i : LSP aprameters */ + const float exc2[], /* i : current enhanced excitation */ + const int16_t L_frame, /* i : frame length */ + int16_t *ho_circ_ptr, /* i/o: pointer for CNG averaging buffers */ + float ho_ener_circ[], /* o : energy buffer for CNG averaging */ + int16_t *ho_circ_size, /* i/o: size of DTX hangover history buffer for averaging */ + float ho_lsp_circ[], /* o : old LSP buffer for CNG averaging */ + const int16_t enc_dec_flag, /* i : Flag indicating encoder or decoder (ENC,DEC) */ + float ho_env_circ[], /* i/o: Envelope buffer */ + int16_t *cng_buf_cnt, /* i/o: Counter of postponed FFT-processing instances */ + float cng_exc2_buf[], /* i/o: Excitation buffer */ + int32_t cng_brate_buf[], /* i/o: last_active_brate buffer */ + const int32_t last_active_brate, /* i : Last active bitrate */ + const int16_t element_mode, /* i : Element mode */ + const int16_t bwidth /* i : audio bandwidth */ +); + +void cng_params_postupd( + const int16_t ho_circ_ptr, /* i : pointer for CNG averaging buffers */ + int16_t *cng_buf_cnt, /* i/o: counter for CNG store buffers */ + const float *cng_exc2_buf, /* i : Excitation buffer */ + const int32_t *cng_brate_buf, /* i : bitrate buffer */ + float ho_env_circ[], /* i/o: Envelope buffer */ + const int16_t element_mode, /* i : Element mode */ + const int16_t bwidth /* i : audio bandwidth */ +); + +void calculate_hangover_attenuation_gain( + Encoder_State *st, /* i : encoder state structure */ + float *att, /* o : attenuation factor */ + const int16_t vad_hover_flag /* i : VAD hangover flag */ +); + +int16_t get_cng_mode( + const int32_t last_active_brate /* i : last active bitrate */ +); + +void disf_ns_28b( + int16_t *indice, /* i : quantized indices, use indice[0] = -1 in the decoder*/ + float *isf_q /* o : ISF in the frequency domain (0..6400) */ +); + +void limit_T0( + const int16_t L_frame, /* i : length of the frame */ + const int16_t delta, /* i : Half the close-loop searched interval */ + const int16_t pit_flag, /* i : selecting absolute(0) or delta(1) pitch quantization */ + const int16_t limit_flag, /* i : flag for limits (0=restrained, 1=extended) */ + const int16_t T0, /* i : rough pitch estimate around which the search is done */ + const int16_t T0_frac, /* i : pitch estimate fractional part */ + int16_t *T0_min, /* o : lower pitch limit */ + int16_t *T0_max /* o : higher pitch limit */ +); + +/*! r: interpolated value */ +float interpolation( + const float *x, /* i : input vector */ + const float *win, /* i : interpolation window */ + const int16_t frac, /* i : fraction */ + const int16_t up_samp, /* i : upsampling factor */ + const int16_t nb_coef /* i : nb of filter coef */ +); + +void deemph( + float *signal, /* i/o: signal */ + const float mu, /* i : deemphasis factor */ + const int16_t L, /* i : vector size */ + float *mem /* i/o: memory (y[-1]) */ +); + +/*! r: tilt of the code */ +float est_tilt( + const float *adpt_exc, /* i : adaptive excitation vector */ + const float gain_pit, /* i : adaptive gain */ + const float *fixe_exc, /* i : algebraic exctitation vector */ + const float gain_code, /* i : algebraic code gain */ + float *voice_fac, /* o : voicing factor */ + const int16_t L_subfr, /* i : subframe size */ + const int16_t flag_tilt /* i : flag for special tilt */ +); + +void weight_a( + const float *a, /* i : LP filter coefficients */ + float *ap, /* o : weighted LP filter coefficients */ + const float gamma, /* i : weighting factor */ + const int16_t m /* i : order of LP filter */ +); + +void weight_a_subfr( + const int16_t nb_subfr, /* i : number of subframes */ + const float *a, /* i : LP filter coefficients */ + float *ap, /* o : weighted LP filter coefficients */ + const float gamma, /* i : weighting factor */ + const int16_t m /* i : order of LP filter */ +); + +void syn_12k8( + const int16_t L_frame, /* i : length of the frame */ + const float *Aq, /* i : LP filter coefficients */ + const float *exc, /* i : input signal */ + float *synth, /* o : output signal */ + float *mem, /* i/o: initial filter states */ + const int16_t update_m /* i : update memory flag: 0 --> no memory update */ +); /* 1 --> update of memory */ + +void syn_filt( + const float a[], /* i : LP filter coefficients */ + const int16_t m, /* i : order of LP filter */ + const float x[], /* i : input signal */ + float y[], /* o : output signal */ + const int16_t l, /* i : size of filtering */ + float mem[], /* i/o: initial filter states */ + const int16_t update_m /* i : update memory flag: 0 --> no memory update */ +); /* 1 --> update of memory */ + +void synth_mem_updt2( + const int16_t L_frame, /* i : frame length */ + const int16_t last_L_frame, /* i : frame length */ + float old_exc[], /* i/o: excitation buffer */ + float mem_syn_r[], /* i/o: synthesis filter memory */ + float mem_syn2[], /* o : synthesis filter memory for find_target */ + float mem_syn[], /* o : synthesis filter memory for find_target */ + const int16_t dec /* i : flag for decoder indication */ +); + +void int_lsp( + const int16_t L_frame, /* i : length of the frame */ + const float lsp_old[], /* i : LSPs from past frame */ + const float lsp_new[], /* i : LSPs from present frame */ + float *Aq, /* o : LP coefficients in both subframes */ + const int16_t m, /* i : order of LP filter */ + const float *int_coeffs, /* i : interpolation coefficients */ + const int16_t Opt_AMR_WB /* i : flag indicating AMR-WB IO mode */ +); + +void int_lsp4( + const int16_t L_frame, /* i : length of the frame */ + const float lsp_old[], /* i : previous end-frame LSPs */ + const float lsp_mid[], /* i : current mid-frame LSPs */ + const float lsp_new[], /* i : current end-frame LSPs */ + float *Aq, /* o : LP coefficients in both subframes */ + const int16_t m, /* i : order of LP filter */ + int16_t relax_prev_lsf_interp /* i : relax prev frame lsf interp after erasure */ +); + +/*! r: length of output */ +int16_t modify_Fs( + const float sigIn[], /* i : signal to decimate */ + const int16_t lg, /* i : length of input */ + const int32_t fin, /* i : frequency of input */ + float sigOut[], /* o : decimated signal */ + const int32_t fout, /* i : frequency of output */ + float mem[], /* i/o: filter memory */ + const int16_t nblp /* i : flag indicating if NB low-pass is applied */ +); + +void pred_lt4( + const float excI[], /* i : input excitation buffer */ + float excO[], /* o : output excitation buffer */ + const int16_t T0, /* i : integer pitch lag */ + int16_t frac, /* i : fraction of lag */ + const int16_t L_subfr, /* i : subframe size */ + const float *win, /* i : interpolation window */ + const int16_t nb_coef, /* i : nb of filter coef */ + const int16_t up_sample /* i : up_sample */ +); + +void pred_lt4_tc( + float exc[], /* i : excitation buffer */ + const int16_t T0, /* i : integer pitch lag */ + int16_t frac, /* i : fraction of lag */ + const float *win, /* i : interpolation window */ + const int16_t imp_pos, /* i : glottal impulse position */ + const int16_t i_subfr /* i : subframe index */ +); + +void residu( + const float *a, /* i : LP filter coefficients */ + const int16_t m, /* i : order of LP filter */ + const float *x, /* i : input signal (usually speech) */ + float *y, /* o : output signal (usually residual) */ + const int16_t l /* i : size of filtering */ +); + +void calc_residu( + const float *speech, /* i : weighted speech signal */ + float *res, /* o : residual signal */ + const float *p_Aq, /* i : quantized LP filter coefficients */ + const int16_t L_frame /* i : size of frame */ +); + +/*! r: impulse response energy */ +float enr_1_Az( + const float Aq[], /* i : LP filter coefs */ + const int16_t len /* i : impulse response length */ +); + +void Es_pred_enc( + float *Es_pred, /* o : predicited scaled innovation energy */ + int16_t *Es_pred_indice, /* o : indice corresponding to above parameter */ + const int16_t L_frame, /* i : length of the frame */ + const int16_t L_subfr, /* i : length of the subframe */ + const float *res, /* i : residual signal */ + const float *voicing, /* i : normal. correlattion in three 1/2frames */ + const int16_t nb_bits, /* i : allocated number of bits */ + const int16_t no_ltp /* i : no_ltp flag */ +); + +void create_offset( + UWord32 *offset_scale1, + UWord32 *offset_scale2, + const int16_t mode, + const int16_t prediction_flag ); + +float mslvq( + float *pTmp, /* i : M-dimensional input vector */ + float *quant, /* o : quantized vector */ + float *cv_out, /* o : corresponding 8-dim lattice codevectors (without the scaling) */ + int16_t *idx_lead, /* o : leader index for each 8-dim subvector */ + int16_t *idx_scale, /* o : scale index for each subvector */ + const float *w, /* i : weights for LSF quantization */ + const int16_t mode, /* i : number indicating the coding mode */ + const int16_t mode_glb, /* i : LVQ coding mode */ + const int16_t pred_flag /* i : prediction flag (0: safety net, 1 - predictive )*/ +); + +void permute( + float *pTmp1, /* i/o: vector whose components are to be permuted */ + const int16_t *perm /* i : permutation info (indexes that should be interchanged), max two perms */ +); + +void sort_desc_ind( + float *s, + const int16_t len, + int16_t *ind ); + +float mslvq_cng( + int16_t idx_cv, /* i : index of cv from previous stage */ + float *pTmp, /* i : 16 dimensional input vector */ + float *quant, /* o : quantized vector */ + float *cv_out, /* o : corresponding 8-dim lattice codevectors (without the scaling) */ + int16_t *idx_lead, /* o : leader index for each 8-dim subvector */ + int16_t *idx_scale, /* o : scale index for each subvector */ + const float *w /* i : weights for LSF quantization */ +); + +int16_t deindex_lvq_cng( + int16_t *index, /* i : index to be decoded, as an array of 3 short */ + float *x_lvq, /* o : decoded codevector */ + const int16_t idx_cv, /* i : relative mode_lvq, wrt START_CNG */ + const int16_t no_bits /* i : number of bits for lattice */ +); + +void multiply32_32_64( + UWord32 x, /* i : operand 1 */ + UWord32 y, /* i : operand 2 */ + UWord32 *res /* o : result as array of two uint32 */ +); + +int16_t deindex_lvq( + int16_t *index, /* i : index to be decoded, as an array of 3 short */ + float *x_lvq, /* o : decoded codevector */ + const int16_t mode, /* i : LVQ coding mode (select scales & no_lead ), or idx_cv */ + const int16_t sf_flag, /* i : safety net flag */ + const int16_t no_bits /* i : number of bits for lattice */ +); + +int16_t vq_dec_lvq( + int16_t sf_flag, /* i : safety net flag */ + float x[], /* o : Decoded vector */ + int16_t indices[], /* i : Indices */ + const int16_t stages, /* i : Number of stages */ + const int16_t N, /* i : Vector dimension */ + const int16_t mode, /* i : lvq coding type */ + const int16_t no_bits /* i : no. bits for lattice */ +); + +void index_lvq( + float *quant, /* i : codevector to be indexed (2 8-dim subvectors) */ + int16_t *idx_lead, /* i : leader class index for each subvector */ + int16_t *idx_scale, /* i : scale index for each subvector */ + const int16_t mode, /* i : integer signaling the quantizer structure for the current bitrate */ + int16_t *index, /* o : encoded index (represented on 3 short each with 15 bits ) */ + const int16_t prediction_flag /* i : predictive mode or not */ +); + +int16_t qlsf_ARSN_tcvq_Dec_16k( + float *y, /* o : Quantized LSF vector */ + int16_t *indice, /* i : Indices */ + const int16_t nBits /* i : number of bits */ +); + +int16_t lsf_bctcvq_encprm( + BSTR_ENC_HANDLE hBstr, + const int16_t *param_lpc, + const int16_t *bits_param_lpc, + const int16_t no_indices ); + +int16_t lsf_bctcvq_decprm( + Decoder_State *st, + int16_t *param_lpc ); + +ivas_error lsf_allocate( + const int16_t nBits, /* i : Number of bits to use for quantization */ + const int16_t framemode, /* i : ISF quantizer mode */ + const int16_t framemode_p, /* i : ISF quantizer mode */ + int16_t *stages0, /* o : Number of stages for safety-net quantizer */ + int16_t *stages1, /* o : Number of stages for predictive quantizer */ + int16_t levels0[], /* o : Number of vectors for each stage for SFNET */ + int16_t levels1[], /* o : Number of vectors for each stage for pred */ + int16_t bits0[], /* o : Number of bits for each stage safety net */ + int16_t bits1[] /* o : Number of bits for each stage predictive */ +); + +void disf_2s_36b( + int16_t *indice, /* i : quantized indices (use indice[0] = -1 in the decoder) */ + float *isf_q, /* o : quantized ISFs in the cosine domain */ + float *mem_AR, /* i/o: quantizer memory for AR model */ + float *mem_MA /* i/o: quantizer memory for MA model */ +); + +void disf_2s_46b( + int16_t *indice, /* i : quantized indices (use indice[0] = -1 in the decoder) */ + float *isf_q, /* o : quantized ISFs in the cosine domain */ + float *mem_AR, /* o : quantizer memory for AR model */ + float *mem_MA /* i/o: quantizer memory for MA model */ +); + +void re8_k2y( + const int16_t *k, /* i : Voronoi index k[0..7] */ + const int16_t m, /* i : Voronoi modulo (m = 2^r = 1<=2) */ + int16_t *y /* o : 8-dimensional point y[0..7] in RE8 */ +); + +void re8_PPV( + const float x[], /* i : point in R^8 */ + int16_t y[] /* o : point in RE8 (8-dimensional integer vector) */ +); + +void enhancer( + const int16_t codec_mode, /* i : flag indicating Codec Mode */ + const int32_t core_brate, /* i : core bitrate */ + const int16_t cbk_index, /* i : */ + const int16_t Opt_AMR_WB, /* i : flag indicating AMR-WB IO mode */ + const int16_t coder_type, /* i : coding type */ + const int16_t L_frame, /* i : frame size */ + const float voice_fac, /* i : subframe voicing estimation */ + const float stab_fac, /* i : LP filter stablility measure */ + const float norm_gain_code, /* i : normalized innovative cb. gain */ + const float gain_inov, /* i : gain of the unscaled innovation */ + float *gc_threshold, /* i/o: code threshold */ + float *code, /* i/o: innovation */ + float *exc2, /* i/o: adapt. excitation/total exc. */ + const float gain_pit, /* i : Quantized pitch gain */ + float *dispMem /* i/o: Phase dispersion algorithm memory */ +); + +void phase_dispersion( + const float gain_code, /* i : gain of code */ + const float gain_pit, /* i : gain of pitch */ + float code[], /* i/o: code vector */ + const int16_t mode, /* i : level, 0=hi, 1=lo, 2=off */ + float disp_mem[] /* i/o: static memory (size = 8) */ +); + +void re8_vor( + int16_t y[], /* i : point in RE8 (8-dimensional integer vector) */ + int16_t *n, /* o : codebook number n=0,2,3,4,... (scalar integer) */ + int16_t k[], /* o : Voronoi index (integer vector of dimension 8) used only if n>4 */ + int16_t c[], /* o : codevector in Q0, Q2, Q3, or Q4 if n<=4, y=c */ + int16_t *ka /* o : identifier of absolute leader (needed to index c)*/ +); + +void edct( + const float *x, /* i : input signal */ + float *y, /* o : output transform */ + const int16_t length, /* i : length */ + const int16_t element_mode /* i : IVAS element mode */ +); + +void edst( + const float *x, /* i : input signal */ + float *y, /* o : output transform */ + const int16_t length, /* i : length */ + const int16_t element_mode /* i : IVAS element mode */ +); + +void edxt( + const float *x, /* i : input signal */ + float *y, /* o : output transform */ + const int16_t length, /* i : length */ + const uint16_t kernelType, /* i : kernel type (0 - 3) */ + const uint16_t synthesis /* i : nonzero for inverse */ +); + +void iedct_short( + const float *in, /* i : input vector */ + float *out, /* o : output vector */ + const int16_t segment_length, /* i : length */ + const int16_t element_mode /* i : IVAS element mode */ +); + +void DoRTFT480( + float *x, /* i/o: real part of input and output data */ + float *y /* i/o: imaginary part of input and output data */ +); + +void DoRTFT320( + float *x, /* i/o: real part of input and output data */ + float *y /* i/o: imaginary part of input and output data */ +); + +void DoRTFT160( + float *x, /* i/o: real part of input and output data */ + float *y /* i/o: imaginary part of input and output data */ +); + +void DoRTFT128( + float *x, /* i/o: real part of input and output data */ + float *y /* i/o: imaginary part of input and output data */ +); + +void DoRTFT120( + float *x, /* i/o: real part of input and output data */ + float *y /* i/o: imaginary part of input and output data */ +); + +void DoRTFT80( + float *x, /* i/o: real part of input and output data */ + float *y /* i/o: imaginary part of input and output data */ +); + +void DoRTFT20( + float *x, /* i/o: real part of input and output data */ + float *y /* i/o: imaginary part of input and output data */ +); + +void DoRTFT40( + float *x, /* i/o: real part of input and output data */ + float *y /* i/o: imaginary part of input and output data */ +); + +void DoRTFTn( + float *x, /* i/o: real part of input and output data */ + float *y, /* i/o: imaginary part of input and output data */ + const int16_t n /* i : size of the FFT n=(2^k) up to 1024 */ +); + +void BASOP_cfft( + Word32 *re, /* i/o: real part */ + Word32 *im, /* i/o: imag part */ + Word16 s, /* i : stride real and imag part */ + Word16 *scale /* i : scalefactor */ +); + +void fft( + float *re, /* i/o: real part */ + float *im, /* i/o: imag part */ + const int16_t length, /* i : length of fft */ + const int16_t s /* i : sign */ +); + +void rfft( + float *x, /* i/o: values */ + const float *w, /* i : window */ + const int16_t length, /* i : length of fft */ + const int16_t isign /* i : sign */ +); + +void sinq( + const float tmp, /* i : sinus factor cos(tmp*i+phi) */ + const float phi, /* i : sinus phase cos(tmp*i+phi) */ + const int16_t N, /* i : size of output */ + float x[] /* o : output vector */ +); + +void edct2( + const int16_t n, + const int16_t isgn, + float *in, + float *a, + const int16_t *ip, + const float *w ); + +void stat_noise_uv_mod( + const int16_t coder_type, /* i : coder type */ + float noisiness, /* i : noisiness parameter */ + const float *const lsp_old, /* i : old LSP vector at 4th sfr */ + const float *const lsp_new, /* i : LSP vector at 4th sfr */ + const float *const lsp_mid, /* i : LSP vector at 2nd sfr */ + float *Aq, /* o : A(z) quantized for the 4 subframes */ + float *exc2, /* o : excitation buffer */ + const int16_t bfi, /* i : bad frame indicator */ + float *ge_sm, /* i/o: smoothed excitation gain */ + int16_t *uv_count, /* i/o: unvoiced counter */ + int16_t *act_count, /* i/o: activation counter */ + float lspold_s[], /* i/o: old LSP */ + int16_t *noimix_seed, /* i/o: mixture seed */ + float *st_min_alpha, /* i/o: minimum alpha */ + float *exc_pe, /* i/o: memory of the preemphasis filter */ + const int32_t bitrate, /* i : core bitrate */ + const int16_t bwidth /* i : audio bandwidth */ +); + +void pre_echo_att( + float *Last_frame_ener, /* i/o: Energy of the last frame */ + float *exc, /* i/o: Excitation of the current frame */ + const int16_t attack_flag, /* i : attack flag (GSC or TC) */ + const int16_t last_coder_type, /* i : Last coder type */ + const int16_t L_frame /* i : frame length */ +); + +void limit_band_noise_level_calc( + const int16_t *wnorm, /* i : reordered norm of sub-vectors */ + int16_t *limit, /* o : highest band of bit allocation */ + const int32_t core_brate, /* i : core bitrate */ + float *noise_level /* o : noise level */ +); + +/*! r: hqswb_clas */ +int16_t peak_avrg_ratio( + const int32_t total_brate, /* i : total bitrate */ + const float *input_hi, /* i : input signal */ + const int16_t N, /* i : number of coefficients */ + int16_t *mode_count, /* i/o: HQ_HARMONIC mode count */ + int16_t *mode_count1 /* i/o: HQ_NORMAL mode count */ +); + +/*! r: Number of coefficients in nf codebook */ +int16_t build_nf_codebook( + const int16_t flag_32K_env_ho, /* i : Envelope attenuation hangover flag */ + const float *coeff, /* i : Coded spectral coefficients */ + const int16_t *sfm_start, /* i : Subband start indices */ + const int16_t *sfmsize, /* i : Subband widths */ + const int16_t *sfm_end, /* i : Subband end indices */ + const int16_t nb_sfm, /* i : Last coded band */ + const int16_t *R, /* i : Per-band bit allocation */ + float *CodeBook, /* o : Noise-fill codebook */ + float *CodeBook_mod /* o : Densified noise-fill codebook */ +); + +void apply_noisefill_HQ( + const int16_t *R, /* i : bit allocation */ + const int16_t length, /* i : input frame length */ + const int16_t flag_32K_env_ho, /* i : envelope stability hangover flag */ + const int32_t core_brate, /* i : core bitrate */ + const int16_t last_sfm, /* i : last coded subband */ + const float *CodeBook, /* i : Noise-fill codebook */ + const float *CodeBook_mod, /* i : Densified noise-fill codebook */ + const int16_t cb_size, /* i : Codebook length */ + const int16_t *sfm_start, /* i : Subband start coefficient */ + const int16_t *sfm_end, /* i : Subband end coefficient */ + const int16_t *sfmsize, /* i : Subband band width */ + float *coeff /* i/o: coded/noisefilled spectrum */ +); + +void harm_bwe_fine( + const int16_t *R, /* i : bit allocation */ + const int16_t last_sfm, /* i : last coded subband */ + const int16_t high_sfm, /* i : higher transition band to BWE */ + const int16_t num_sfm, /* i : total number of bands */ + const int16_t *norm, /* i : quantization indices for norms */ + const int16_t *sfm_start, /* i : Subband start coefficient */ + const int16_t *sfm_end, /* i : Subband end coefficient */ + int16_t *prev_L_swb_norm, /* i/o: last normalize length */ + float *coeff, /* i/o: coded/noisefilled normalized spectrum */ + float *coeff_out, /* o : coded/noisefilled spectrum */ + float *coeff_fine /* o : BWE fine structure */ +); + +void hvq_bwe_fine( + const int16_t last_sfm, /* i : last coded subband */ + const int16_t num_sfm, /* i : total number of bands */ + const int16_t *sfm_end, /* i : Subband end coefficient */ + const int16_t *peak_idx, /* i : Peak index */ + const int16_t Npeaks, /* i : Number of peaks */ + int16_t *peak_pos, /* i/o: Peak positions */ + int16_t *prev_L_swb_norm, /* i/o: last normalize length */ + float *coeff, /* i/o: coded/noisefilled normalized spectrum */ + int16_t *bwe_peaks, /* o : Positions of peaks in BWE */ + float *coeff_fine /* o : HVQ BWE fine structure */ +); + +void hq_fold_bwe( + const int16_t last_sfm, /* i : last coded subband */ + const int16_t *sfm_end, /* i : Subband end coefficient */ + const int16_t num_sfm, /* i : Number of subbands */ + float *coeff /* i/o: coded/noisefilled normalized spectrum */ +); + +void apply_nf_gain( + const int16_t nf_idx, /* i : noise fill gain index */ + const int16_t last_sfm, /* i : last coded subband */ + const int16_t *R, /* i : bit allocation */ + const int16_t *sfm_start, /* i : Subband start coefficient */ + const int16_t *sfm_end, /* i : Subband end coefficient */ + float *coeff /* i/o: coded/noisefilled normalized spectrum */ + +); + +void hq_generic_fine( + float *coeff, /* i : coded/noisefilled normalized spectrum */ + const int16_t last_sfm, /* i : Last coded band */ + const int16_t *sfm_start, /* i : Subband start coefficient */ + const int16_t *sfm_end, /* i : Subband end coefficient */ + int16_t *bwe_seed, /* i/o: random seed for generating BWE input */ + float *coeff_out1 /* o : HQ GENERIC input */ +); + +void harm_bwe( + const float *coeff_fine, /* i : fine structure for BWE */ + const float *coeff, /* i : coded/noisefilled normalized spectrum */ + const int16_t num_sfm, /* i : Number of subbands */ + const int16_t *sfm_start, /* i : Subband start coefficient */ + const int16_t *sfm_end, /* i : Subband end coefficient */ + const int16_t last_sfm, /* i : last coded subband */ + const int16_t high_sfm, /* i : higher transition band to BWE */ + const int16_t *R, /* i : bit allocation */ + const int16_t prev_hq_mode, /* i : previous hq mode */ + int16_t *norm, /* i/o: quantization indices for norms */ + float *noise_level, /* i/o: noise levels for harmonic modes */ + float *prev_noise_level, /* i/o: noise factor in previous frame */ + int16_t *bwe_seed, /* i/o: random seed for generating BWE input */ + float *coeff_out, /* o : coded/noisefilled spectrum */ + const int16_t element_mode /* i : element mode */ +); + +void hvq_bwe( + const float *coeff, /* i : coded/noisefilled spectrum */ + const float *coeff_fine, /* i : BWE fine structure */ + const int16_t *sfm_start, /* i : Subband start coefficient */ + const int16_t *sfm_end, /* i : Subband end coefficient */ + const int16_t *sfm_len, /* i : Subband length */ + const int16_t last_sfm, /* i : last coded subband */ + const int16_t prev_hq_mode, /* i : previous hq mode */ + const int16_t *bwe_peaks, /* i : HVQ bwe peaks */ + const int16_t bin_th, /* i : HVQ transition bin */ + const int16_t num_sfm, /* i : Number of bands */ + const int32_t core_brate, /* i : Core bitrate */ + const int16_t *R, /* i : Bit allocation */ + int16_t *norm, /* i/o: quantization indices for norms */ + float *noise_level, /* i/o: noise levels for harmonic modes */ + float *prev_noise_level, /* i/o: noise factor in previous frame */ + int16_t *bwe_seed, /* i/o: random seed for generating BWE input */ + float *coeff_out /* o : coded/noisefilled spectrum */ +); + +void hvq_concat_bands( + const int16_t pvq_bands, /* i : Number of bands in concatenated PVQ target */ + const int16_t *sel_bnds, /* i : Array of selected high bands */ + const int16_t n_sel_bnds, /* i : Number of selected high bands */ + int16_t *hvq_band_start, /* o : Band start indices */ + int16_t *hvq_band_width, /* o : Band widths */ + int16_t *hvq_band_end /* o : Band end indices */ +); + +void hq_generic_bwe( + const int16_t HQ_mode, /* i : HQ mode */ + float *coeff_out1, /* i/o: BWE input & temporary buffer */ + const float *hq_generic_fenv, /* i : SWB frequency envelopes */ + float *coeff_out, /* o : SWB signal in MDCT domain */ + const int16_t hq_generic_offset, /* i : frequency offset for representing hq generic*/ + int16_t *prev_L_swb_norm, /* i/o: last normalize length */ + const int16_t hq_generic_exc_clas, /* i : hq generic hf excitation class */ + const int16_t *sfm_end, /* i : End of bands */ + const int16_t num_sfm, /* i : Number of bands */ + const int16_t num_env_bands, /* i : Number of coded envelope bands */ + const int16_t *R /* i : Bit allocation */ +); + +void logqnorm_2( + const float *env_fl, /* o : index */ + const int16_t L, /* i : codebook length */ + const int16_t n_env_band, /* i : sub-vector size */ + const int16_t nb_sfm, /* i : sub-vector size */ + int16_t *ynrm, /* o : norm indices */ + int16_t *normqlg2, /* o : quantized norm values */ + const float *thren /* i : quantization thresholds */ +); + +void map_hq_generic_fenv_norm( + const int16_t hqswb_clas, /* i : signal classification flag */ + const float *hq_generic_fenv, /* i : HQ GENERIC envelope */ + int16_t *ynrm, /* o : high band norm indices */ + int16_t *normqlg2, /* o : high band norm values */ + const int16_t num_env_bands, /* i : Number coded envelope bands */ + const int16_t nb_sfm, /* i : Number of envelope bands */ + const int16_t hq_generic_offset /* i : Freq offset for HQ GENERIC */ +); + +/*! r: Number of bits consumed for the delta coding */ +int16_t calc_nor_delta_hf( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const float *t_audio, /* i : transform-domain coefficients */ + int16_t *ynrm, /* i/o: norm indices */ + int16_t *Rsubband, /* i/o: sub-band bit allocation */ + const int16_t num_env_bands, /* i : Number coded envelope bands */ + const int16_t nb_sfm, /* i : Number of envelope bands */ + const int16_t *sfmsize, /* i : band length */ + const int16_t *sfm_start, /* i : Start index of bands */ + const int16_t core_sfm /* i : index of the end band for core */ +); + +/*! r: Number of bits consumed for the delta coding */ +int16_t get_nor_delta_hf( + Decoder_State *st, /* i/o: Decoder state */ + int16_t *ynrm, /* i/o: norm indices */ + int16_t *Rsubband, /* i/o: sub-band bit allocation */ + const int16_t num_env_bands, /* i : Number coded envelope bands */ + const int16_t nb_sfm, /* i : Number of envelope bands */ + const int16_t core_sfm ); /* i : index of the end band for core */ + +void hq_wb_nf_bwe( + const float *coeff, /* i : coded/noisefilled normal. spectrum */ + const int16_t is_transient, /* i : is transient flag */ + const int16_t prev_bfi, /* i : previous bad frame indicator */ + const float *normq_v, /* i : norms */ + const int16_t num_sfm, /* i : Number of subbands */ + const int16_t *sfm_start, /* i : Subband start coefficient */ + const int16_t *sfm_end, /* i : Subband end coefficient */ + const int16_t *sfmsize, /* i : Subband band width */ + const int16_t last_sfm, /* i : last coded subband */ + const int16_t *R, /* i : bit allocation */ + const int16_t prev_is_transient, /* i : previous transient flag */ + float *prev_normq, /* i/o: previous norms */ + float *prev_env, /* i/o: previous noise envelopes */ + int16_t *bwe_seed, /* i/o: random seed for generating BWE input */ + float *prev_coeff_out, /* i/o: decoded spectrum in previous frame */ + int16_t *prev_R, /* i/o: previous frame bit allocation info. */ + float *coeff_out /* o : coded/noisefilled spectrum */ +); + +/*! r: Number of bits */ +int16_t encode_envelope_indices( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const int16_t num_sfm, /* i : Number of subbands */ + const int16_t numnrmibits, /* i : Bitrate of fall-back coding mode */ + int16_t *difidx, /* i/o: Diff indices/encoded diff indices */ + int16_t *LCmode, /* o : Coding mode */ + const int16_t flag_pack, /* i : indicator of packing or estimating bits */ + const int16_t flag_HQ2, /* i : indicator of HQ2 core */ + const int16_t is_transient /* i : transient flag */ +); + +void diff_envelope_coding( + const int16_t is_transient, /* i : transient indicator */ + const int16_t num_env_bands, /* i : number of envelope bands to code */ + const int16_t start_norm, /* i : start of envelope coding */ + int16_t *ynrm, /* i/o: quantization indices for norms */ + int16_t *normqlg2, /* i/o: quantized norms */ + int16_t *difidx /* o : differential code */ +); + +/*! r: Number of bits */ +int16_t decode_envelope_indices( + Decoder_State *st, /* i/o: decoder state structure */ + const int16_t start_norm, /* i : First SDE encoded norm */ + const int16_t num_sfm, /* i : Number of norms */ + const int16_t numnrmibits, /* i : Bitrate of fall-back coding mode */ + int16_t *ynrm, /* o : Decoded norm indices */ + const int16_t flag_HQ2, /* i : indicator of HQ2 core */ + const int16_t is_transient /* i : transient flag */ +); + +/*! r: Number of bits */ +void dequantize_norms( + Decoder_State *st, /* i/o: decoder state structure */ + const int16_t start_norm, /* i : First SDE encoded norm */ + const int16_t num_sfm, /* i : Number of norms */ + const int16_t is_transient, /* i : Transient flag */ + int16_t *ynrm, /* o : Decoded norm indices */ + int16_t *normqlg2 /* o : Log2 of decoded norms */ +); + +void hq_configure( + const int16_t length, /* i : Frame length */ + const int16_t hqswb_clas, /* i : HQ SWB class */ + const int32_t core_brate, /* i : core bitrate */ + int16_t *num_sfm, /* o : Total number of subbands */ + int16_t *nb_sfm, /* o : Total number of coded bands */ + int16_t *start_norm, /* o : First norm to be SDE encoded */ + int16_t *num_sde_norm, /* o : Number of norms for SDE encoding */ + int16_t *numnrmibits, /* o : Number of bits in fall-back norm encoding */ + int16_t *hq_generic_offset, /* o : Freq offset for HQ GENERIC */ + int16_t *sfmsize, /* o : Subband bandwidths */ + int16_t *sfm_start, /* o : Subband start coefficients */ + int16_t *sfm_end /* o : Subband end coefficients */ +); + +/*! r: Consumed bits */ +int16_t hvq_enc( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const int16_t bwidth, /* i : audio bandwidth */ + const int32_t core_brate, /* i : core bitrate */ + const int16_t hvq_bits, /* i : HVQ bit budget */ + const int16_t Npeaks, /* i : Number of peaks */ + const int16_t *ynrm, /* i : Envelope coefficients */ + int16_t *R, /* i/o: Bit allocation/updated bit allocation */ + int16_t *peaks, /* i/o: Peak pos. / Encoded peak pos. */ + float *nf_gains, /* i/o: Noise fill gains / Quant. nf gains */ + float *noise_level, /* o : Quantized noise level */ + const float *pe_gains, /* i : Peak gains */ + const float *coefs, /* i : spectrum coefficients */ + float *coefs_out /* o : encoded spectrum coefficients */ +); + +/*! r: Consumed bits */ +int16_t hq_classifier_enc( + Encoder_State *st, /* i/o: encoder state structure */ + const int16_t length, /* i : Frame length */ + const float *coefs, /* i : Spectral coefficients */ + const int16_t is_transient, /* i : Transient flag */ + int16_t *Npeaks, /* o : Number of identified peaks */ + int16_t *peaks, /* o : Peak indices */ + float *pe_gains, /* o : Peak gains */ + float *nf_gains, /* o : Noise-fill gains */ + int16_t *hqswb_clas /* o : HQ class */ +); + +/*! r: Consumed bits */ +int16_t hq_classifier_dec( + Decoder_State *st, /* i/o: decoder state structure */ + const int32_t core_brate, /* i : Core bitrate */ + const int16_t length, /* i : Frame length */ + int16_t *is_transient, /* o : Transient flag */ + int16_t *hqswb_clas /* o : HQ class */ +); + +void hq_bit_allocation( + const int32_t core_brate, /* i : Core bitrate */ + const int16_t length, /* i : Frame length */ + const int16_t hqswb_clas, /* i : HQ class */ + int16_t *num_bits, /* i/o: Remaining bit budget */ + const int16_t *normqlg2, /* i : Quantized norms */ + const int16_t nb_sfm, /* i : Number sub bands to be encoded */ + const int16_t *sfmsize, /* i : Sub band bandwidths */ + float *noise_level, /* o : HVQ noise level */ + int16_t *R, /* o : Bit allocation per sub band */ + int16_t *Rsubband, /* o : Fractional bit allocation (Q3) */ + int16_t *sum, /* o : Sum of allocated shape bits */ + int16_t *core_sfm, /* o : Last coded band in core */ + const int16_t num_env_bands /* i : Number sub bands to be encoded for HQ_SWB_BWE */ +); + +void enforce_zero_for_min_envelope( + const int16_t hqswb_clas, /* i : HQ coding class */ + const int16_t *ynrm, /* i : Envelope indices */ + float *coefsq, /* i/o: Quantized spectrum/zeroed spectrum */ + int16_t nb_sfm, /* i : Number of coded sub bands */ + const int16_t *sfm_start, /* i : Sub band start indices */ + const int16_t *sfm_end /* i : Sub band end indices */ +); + +/*! r: Number of assigned gain bits */ +int16_t assign_gain_bits( + const int16_t core, /* i : HQ core */ + const int16_t BANDS, /* i : Number of bands */ + const int16_t *band_width, /* i : Sub band bandwidth */ + int16_t *Rk, /* i/o: Bit allocation/Adjusted bit alloc. (Q3) */ + int16_t *gain_bits_array, /* o : Assigned gain bits */ + int16_t *Rcalc /* o : Bit budget for shape quantizer (Q3) */ +); + +void apply_envelope( + const float *coeff, /* i/o: Coded/noisefilled normalized spectrum */ + const int16_t *norm, /* i : Envelope */ + const float *norm_adj, /* i : Envelope adjustment */ + const int16_t num_sfm, /* i : Total number of bands */ + const int16_t last_sfm, /* i : Last coded band */ + const int16_t HQ_mode, /* i : HQ mode */ + const int16_t length, /* i : Frame length */ + const int16_t *sfm_start, /* i : Sub band start indices */ + const int16_t *sfm_end, /* i : Sub band end indices */ + float *normq_v, /* o : Envelope with adjustment */ + float *coeff_out, /* o : coded/noisefilled spectrum */ + float *coeff_out1 /* o : noisefilled spectrum for HQ SWB BWE */ +); + +void apply_envelope_enc( + float *coeff, /* i/o: Normalized/scaled normalized spectrum */ + const int16_t *norm, /* i : Envelope */ + const int16_t num_sfm, /* i : Total number of bands */ + const int16_t *sfm_start, /* i : Sub band start indices */ + const int16_t *sfm_end /* i : Sub band end indices */ +); + +/*! r: Leading_sign_index, index, size, k_val */ +PvqEntry mpvq_encode_vec( + const int16_t *vec_in, /* i : Signed pulse train */ + const int16_t dim_in, /* i : Dimension */ + int16_t k_val_local /* i/o: Num unit pulses */ +); + +/*! r: Size, dim, k_val */ +PvqEntry get_size_mpvq_calc_offset( + const int16_t dim_in, /* i : Dimension */ + const int16_t k_val_in, /* i : Num unit pulses */ + uint32_t *h_mem /* o : Offsets */ +); + +void mpvq_decode_vec( + const PvqEntry *entry, /* i : Sign_ind, index, dim, k_val */ + uint32_t *h_mem, /* i : A/U offsets */ + int16_t *vec_out /* o : Pulse train */ +); + +/*! r: Multiplication result */ +uint32_t UMult_32_32( + const uint32_t UL_var1, /* i : factor 1 */ + const uint32_t UL_var2 /* i : factor 2 */ +); + +/*! r: inverse */ +uint32_t UL_inverse( + const uint32_t UL_val, /* i : input value Q_exp */ + int16_t *exp /* i/o: input exp / result exp */ +); + +/*! r: ratio */ +Word16 ratio( + const Word32 numer, /* i : numerator */ + const Word32 denom, /* i : denominator */ + Word16 *expo /* i/o: input exp / result exp */ +); + +/*! r: Angle between 0 and EVS_PI/2 radian (Q14) */ +Word16 atan2_fx( + const Word32 y, /* i : near side (Argument must be positive) (Q15) */ + const Word32 x /* i : opposite side (Q15) */ +); + +void pvq_encode_frame( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const float *coefs_norm, /* i : normalized coefficients to encode */ + float *coefs_quant, /* o : quantized coefficients */ + float *gopt, /* o : optimal shape gains */ + int16_t *npulses, /* o : number of pulses per band */ + int16_t *pulse_vector, /* o : non-normalized pulse shapes */ + const int16_t *sfm_start, /* i : indices of first coefficients in the bands */ + const int16_t *sfm_end, /* i : indices of last coefficients in the bands */ + const int16_t *sfmsize, /* i : band sizes */ + const int16_t nb_sfm, /* i : total number of bands */ + const int16_t *R, /* i : bitallocation per band (Q3) */ + const int16_t pvq_bits, /* i : number of bits avaiable */ + const int16_t core /* i : core */ +); + +void pvq_decode_frame( + Decoder_State *st, /* i/o: Decoder state */ + float *coefs_quant, /* o : quantized coefficients */ + int16_t *npulses, /* o : number of pulses per band */ + int16_t *pulse_vector, /* o : non-normalized pulse shapes */ + const int16_t *sfm_start, /* i : indices of first coeffs in the bands */ + const int16_t *sfm_end, /* i : indices of last coeffs in the bands */ + const int16_t *sfmsize, /* i : band sizes */ + const int16_t nb_sfm, /* i : total number of bands */ + const int16_t *R, /* i : bitallocation per band (Q3) */ + const int16_t pvq_bits, /* i : number of bits avaiable */ + const int16_t core /* i : core */ +); + +void srt_vec_ind( + const int16_t *linear, /* linear input */ + int16_t *srt, /* sorted output */ + int16_t *I, /* index for sorted output */ + const int16_t length ); + +void srt_vec_ind_f( + const float *linear, /* linear input */ + float *srt, /* sorted output */ + int16_t *I, /* index for sorted output */ + const int16_t length /* length of vector */ +); + +/*! r: floor(sqrt(input)) */ +uint32_t floor_sqrt_exact( + const uint32_t input /* i : unsigned input [0.. UINT_MAX/4] */ +); + +void fine_gain_quant( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const int16_t *ord, /* i : Indices for energy order */ + const int16_t num_sfm, /* i : Number of bands */ + const int16_t *gain_bits, /* i : Gain adjustment bits per sub band */ + float *fg_pred, /* i/o: Predicted gains / Corrected gains */ + const float *gopt /* i : Optimal gains */ +); + +void apply_gain( + const int16_t *ord, /* i : Indices for energy order */ + const int16_t *band_start, /* i : Sub band start indices */ + const int16_t *band_end, /* i : Sub band end indices */ + const int16_t num_sfm, /* i : Number of bands */ + const float *gains, /* i : Band gain vector */ + float *xq /* i/o: float synthesis / gain adjusted synth */ +); + +void fine_gain_pred( + const int16_t *sfm_start, /* i : Sub band start indices */ + const int16_t *sfm_end, /* i : Sub band end indices */ + const int16_t *sfm_size, /* i : Sub band bandwidths */ + const int16_t *i_sort, /* i : Energy sorting indices */ + const int16_t *K, /* i : Number of pulses per band */ + const int16_t *maxpulse, /* i : Maximum pulse per band */ + const int16_t *R, /* i : Bits per sub band (Q3) */ + const int16_t num_sfm, /* i : Number of sub bands */ + float *xq, /* i/o: Quantized vector /quantized vector with finegain adj */ + int16_t *y, /* i/o: Quantized vector */ + float *fg_pred, /* o : Predicted fine gains */ + const int16_t core /* i : Core */ +); + +void fine_gain_dec( + Decoder_State *st, /* i/o: Decoder state struct */ + const int16_t *ord, /* i : Indices for energy order */ + const int16_t num_sfm, /* i : Number of bands */ + const int16_t *gain_bits, /* i : Gain adjustment bits per sub band */ + float *fg_pred /* i/o: Predicted gains / Corrected gains */ +); + +void get_max_pulses( + const int16_t *band_start, /* i : Sub band start indices */ + const int16_t *band_end, /* i : Sub band end indices */ + const int16_t *k_sort, /* i : Indices for sorting by energy */ + const int16_t *npulses, /* i : Pulses per sub band */ + const int16_t BANDS, /* i : Number of bands */ + int16_t *inp_vector, /* i/o: Encoded shape vectors */ + int16_t *maxpulse /* o : Maximum pulse height per band */ +); + +Word32 ar_div( + Word32 num, + Word32 denum ); + +void ar_encoder_start( + PARCODEC arInst, + TCQ_PBITSTREAM bsInst, + int16_t max_bits ); + +void ar_decoder_start( + PARCODEC arInst, + TCQ_PBITSTREAM bsInst ); + +void ar_encoder_done( + PARCODEC arInst ); + +void ar_decoder_done( + PARCODEC arInst ); + +float GetISCScale( + float *quants, + int16_t size, + Word32 bits_fx, + float *magn, + float *qscale, + Word32 *surplus_fx, + float *pulses, + int32_t *savedstates, + int16_t noTCQ, + int32_t *nzpout, + int16_t *bcount, + float *abuffer, + float *mbuffer, + float *sbuffer ); + +Word32 Mult_32_16( + Word32 a, + Word16 b ); + +Word32 Mult_32_32( + Word32 a, + Word32 b ); + +void decode_position_ari_fx( + PARCODEC pardec, + Word16 size, + Word16 npulses, + Word16 *nz, + Word32 *position ); + +void decode_magnitude_usq_fx( + ARCODEC *pardec, + Word16 size, + Word16 npulses, + Word16 nzpos, + Word32 *positions, + Word32 *out ); + +void decode_mangitude_tcq_fx( + ARCODEC *pardec, + Word16 size, + Word16 npulses, + Word16 nzpos, + Word32 *positions, + Word32 *out, + Word32 *surplus_fx ); + +void decode_signs_fx( + ARCODEC *pardec, + Word16 size, + Word32 *out ); + +void srt_vec_ind_fx( + const Word32 *linear, + Word32 *srt, + Word16 *I, + Word16 length ); + +Word16 GetScale_fx( + Word16 blen, + Word32 bits_fx /*Q16*/, + Word32 *surplus_fx /*Q16*/ +); + +void bit_allocation_second_fx( + Word32 *Rk, + Word32 *Rk_sort, + Word16 BANDS, + const Word16 *band_width, + Word16 *k_sort, + Word16 *k_num, + const Word16 *p2a_flags, + const Word16 p2a_bands, + const Word16 *last_bitalloc, + const Word16 input_frame ); + +Word32 encode_position_ari_fx( + PARCODEC parenc, + float *quants, + Word16 size, + Word32 *est_bits_frame_fx ); + +Word32 encode_magnitude_tcq_fx( + ARCODEC *parenc, + float *magn_fx, + Word16 size, + Word16 npulses, + Word16 nzpos, + Word32 *savedstates, + Word32 *est_frame_bits_fx ); + +Word32 encode_signs_fx( + ARCODEC *parenc, + float *magn, + Word16 size, + Word16 npos, + Word32 *est_frame_bits_fx ); + +Word32 encode_magnitude_usq_fx( + ARCODEC *parenc, + float *magn_fx, + Word16 size, + Word16 npulses, + Word16 nzpos, + Word32 *est_frame_bits_fx ); + +ivas_error tcq_core_LR_enc( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + int32_t inp_vector[], + const float coefs_norm[], + float coefs_quant[], + const int16_t bit_budget, /* number of bits */ + const int16_t nb_sfm, + const int16_t *sfm_start, + const int16_t *sfm_end, + const int16_t *sfmsize, + Word32 *Rk_fx, + int16_t *npulses, + int16_t *k_sort, + const int16_t *p2a_flags, + const int16_t p2a_bands, + const int16_t *last_bitalloc, + const int16_t input_frame, + const int16_t adjustFlag, + const int16_t is_transient ); + +void tcq_core_LR_dec( + Decoder_State *st, + int32_t *inp_vector, + const int16_t bit_budget, + const int16_t bands, + const int16_t *band_start, + const int16_t *band_width, + Word32 *Rk_fx, + int16_t npulses[], + int16_t *k_sort, + const int16_t *p2a_flags, + const int16_t p2a_bands, + const int16_t *last_bitalloc, + const int16_t input_frame, + const int16_t adjustFlag, + const int16_t *is_transient ); + +void InitLSBTCQ( + int16_t *bcount ); + +void TCQLSB( + int16_t bcount, + float *abuffer, + float *mbuffer, + float *sbuffer, + int16_t *dpath ); + +void RestoreTCQ( + float *magn, + int16_t size, + int16_t *bcount, + float *mbuffer ); + +void SaveTCQdata( + PARCODEC arInst, + int16_t *dpath, + int16_t bcount ); + +void LoadTCQdata( + PARCODEC arInst, + int16_t *dpath, + int16_t bcount ); + +void RestoreTCQdec( + int32_t *magn, + int16_t size, + int16_t *bcount, + float *mbuffer ); + +void TCQLSBdec( + int16_t *dpath, + float *mbuffer, + int16_t bcount ); + +void bit_allocation_second_fx( + Word32 *Rk, + Word32 *Rk_sort, + Word16 BANDS, + const Word16 *band_width, + Word16 *k_sort, + Word16 *k_num, + const Word16 *p2a_flags, + const Word16 p2a_bands, + const Word16 *last_bitalloc, + const Word16 input_frame ); + +void io_ini_enc( + const int32_t argc, /* i : command line arguments number */ + char *argv[], /* i : command line arguments */ + FILE **f_input, /* o : input signal file */ + FILE **f_stream, /* o : output bitstream file */ + FILE **f_rate, /* o : bitrate switching profile (0 if N/A) */ + FILE **f_bwidth, /* o : bandwidth switching profile (0 if N/A) */ + FILE **f_metadata, /* o : metadata files (NULL if N/A) */ + FILE **f_rf, /* o : channel aware configuration file */ + int16_t *quietMode, /* o : limit printouts */ + int16_t *noDelayCmp, /* o : turn off delay compensation */ + Encoder_Struct *st /* o : IVAS encoder structure */ +); + +void read_next_rfparam( + int16_t *rf_fec_offset, /* o : RF offset */ + int16_t *rf_fec_indicator, /* o : RF FEC indicator */ + FILE *f_rf /* i : file pointer to read parameters */ +); + +void read_next_brate( + int32_t *total_brate, /* i/o: total bitrate */ + const int32_t last_total_brate, /* i : last total bitrate */ + FILE *f_rate, /* i : bitrate switching profile (0 if N/A) */ + const int16_t element_mode, /* i : IVAS element mode */ + int32_t input_Fs, /* i : input sampling frequency */ + int16_t *Opt_AMR_WB, /* i : flag indicating AMR-WB IO mode */ + int16_t *Opt_SC_VBR, /* i/o: SC-VBR flag */ + int16_t *codec_mode /* i/o: Mode 1 or 2 */ +); + +void read_next_bwidth( + int16_t *max_bwidth, /* i/o: maximum encoded bandwidth */ + FILE *f_bwidth, /* i : bandwidth switching profile (0 if N/A) */ + int32_t *bwidth_profile_cnt, /* i/o: counter of frames for bandwidth switching profile file */ + int32_t input_Fs /* i : input sampling rate */ +); + + +ivas_error init_encoder( + Encoder_State *st, /* i/o: state structure */ + Encoder_Struct *st_ivas, /* i/o: encoder state structure */ + const int16_t idchan, /* i : channel ID */ + const int16_t var_SID_rate_flag, /* i : flag for variable SID update rate */ + const int16_t interval_SID, /* i : interval for SID update */ + const int16_t vad_only_flag, /* i : flag to indicate front-VAD structure */ + const ISM_MODE ism_mode /* i : ISM mode */ + , + const int32_t element_brate /* element bitrate */ +); + +void LPDmem_enc_init( + LPD_state_HANDLE hLPDmem /* i/o: LP memories */ +); + +void destroy_cldfb_encoder( + Encoder_State *st /* i/o: state structure */ +); +ivas_error evs_enc( + Encoder_State *st, /* i/o: state structure */ + const int16_t *data, /* i : input signal */ + float *mem_hp20_in, /* i/o: hp20 filter memory */ + const int16_t n_samples /* i : number of input samples */ +); +void amr_wb_enc( + Encoder_State *st, /* i/o: encoder state structure */ + const int16_t *data, /* i : input signal */ + float *mem_hp20_in, /* i/o: hp20 filter memory */ + const int16_t n_samples /* i : number of input samples */ +); + +void sc_vbr_enc_init( + SC_VBR_ENC_HANDLE hSC_VBR /* i/o: SC-VBR encoder handle */ +); + +void amr_wb_enc_init( + AMRWB_IO_ENC_HANDLE hAmrwb_IO /* i/o: AMR-WB IO encoder handle */ +); + +void pre_proc( + Encoder_State *st, /* i/o: encoder state structure */ + const int16_t input_frame, /* i : frame length */ + float old_inp_12k8[], /* i/o: buffer of old input signal */ + float old_inp_16k[], /* i/o: buffer of old input signal @ 16kHz */ + float **inp, /* o : ptr. to inp. signal in the current frame*/ + float fr_bands[2 * NB_BANDS], /* i : energy in frequency bands */ + float *ener, /* o : residual energy from Levinson-Durbin */ +#ifndef FIX_I4_OL_PITCH + int16_t pitch_orig[3], /* o : open-loop pitch values for quantization */ +#endif + float A[NB_SUBFR16k * ( M + 1 )], /* i/o: A(z) unquantized for the 4 subframes */ + float Aw[NB_SUBFR16k * ( M + 1 )], /* i/o: weighted A(z) unquantized for subframes */ + float epsP[M + 1], /* i/o: LP prediction errors */ + float lsp_new[M], /* i/o: LSPs at the end of the frame */ + float lsp_mid[M], /* i/o: LSPs in the middle of the frame */ + int16_t *vad_hover_flag, /* i : VAD hangover flag */ + int16_t *attack_flag, /* o : attack flag */ + float *new_inp_resamp16k, /* o : new input signal @16kHz, non pre-emphasised, used by the WB TBE/BWE */ + int16_t *Voicing_flag, /* o : voicing flag for HQ FEC */ + float realBuffer[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i/o: real buffer */ + float imagBuffer[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i/o: imag buffer */ + int16_t *hq_core_type /* o : HQ core type */ +); +#endif + +/*! r: HQ_CORE/TCX_20_CORE decision */ +int16_t mdct_classifier( + Encoder_State *st, /* i/o: Encoder state variable */ + const float *fft_buff, /* i : FFT spectrum from fft_rel */ + const float enerBuffer[], /* i : energy buffer */ + const int32_t brate /* i : current brate, IVAS: nominal bitrate, EVS: st->total_brate */ +); + +void MDCT_selector( + Encoder_State *st, /* i/o: Encoder State */ + const float sp_floor, /* i : Noise floor estimate */ + const float Etot, /* i : Total energy */ + const float cor_map_sum, /* i : sum of correlation map */ + const float enerBuffer[] /* i : energy buffer */ +); + +void MDCT_selector_reset( + TCX_ENC_HANDLE hTcxEnc /* i/o: TCX Encoder Handle */ +); + +void MDCT_classifier_reset( + TCX_ENC_HANDLE hTcxEnc /* i/o: TCX Encoder Handle */ +); + +ivas_error acelp_core_enc( + Encoder_State *st, /* i/o: encoder state structure */ + const float inp[], /* i : input signal of the current frame */ + const float ener, /* i : residual energy from Levinson-Durbin */ + float A[NB_SUBFR16k * ( M + 1 )], /* i : A(z) unquantized for the 4 subframes */ + float Aw[NB_SUBFR16k * ( M + 1 )], /* i : weighted A(z) unquant. for subframes */ + const float epsP[M + 1], /* i : LP prediction errors */ + float lsp_new[M], /* i : LSPs at the end of the frame */ + float lsp_mid[M], /* i : LSPs in the middle of the frame */ + const int16_t vad_hover_flag, /* i : VAD hangover flag */ + const int16_t attack_flag, /* i : attack flag (GSC or TC) */ + float bwe_exc_extended[], /* i/o: bandwidth extended excitation */ + float *voice_factors, /* o : voicing factors */ + float old_syn_12k8_16k[], /* o : ACELP core synthesis at 12.8kHz or 16kHz to be used by SWB BWE */ + float pitch_buf[NB_SUBFR16k], /* o : floating pitch for each subframe */ + int16_t *unbits, /* o : number of unused bits */ + STEREO_TD_ENC_DATA_HANDLE hStereoTD, /* i/o: TD stereo encoder handle */ + const float tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel */ +); + +ivas_error acelp_core_switch_dec_bfi( + Decoder_State *st /* i/o: decoder state structure */ +); + +void acelp_core_switch_enc( + Encoder_State *st, /* i/o: encoder state structure */ + const float inp12k8[], /* i : input signal @12.8 kHz */ + const float inp16k[], /* i : input signal @16 kHz */ + const float A[NB_SUBFR16k * ( M + 1 )] /* i : A(z) unquantized for the 4 subframes */ +); + +/*! r: length of output */ +int16_t modify_Fs_intcub3m_sup( + const float sigIn[], /* i : signal to decimate with memory of 2 samples (indexes -2 & -1) */ + const int16_t lg, /* i : length of input */ + const int32_t fin, /* i : frequency of input */ + float sigOut[], /* o : decimated signal */ + const int32_t fout, /* i : frequency of output */ + int16_t *delayout /* o : delay of output */ +); + +void core_switching_OLA( + const float *mem_over_hp, /* i : upsampling filter memory */ + const int16_t last_L_frame, /* i : last L_frame lengthture */ + const int32_t output_Fs, /* i : output sampling rate */ + float *synth, /* i/o: synthesized signal from HQ core */ + const float *synth_subfr_out, /* i : synthesized signal from ACELP core */ + float *synth_subfr_bwe, /* i : synthesized BWE from ACELP core */ + const int16_t output_frame, /* i : output frame length */ + const int16_t bwidth /* i : output bandwidth */ +); + +void retro_interp4_5( + const float *syn, + float *pst_old_syn ); + +void retro_interp5_4( + float *pst_old_syn ); + +void core_switching_hq_prepare_enc( + Encoder_State *st, /* i/o: encoder state structure */ + int16_t *num_bits, /* i/o: bit budget update */ + const int16_t input_frame, /* i : input frame length */ + float *wtda_audio, + const float *audio ); + +void core_switching_hq_prepare_dec( + Decoder_State *st, /* i/o: decoder state structure */ + int16_t *num_bits, /* i/o: bit budget update */ + const int16_t input_frame /* i : input frame length */ +); + +ivas_error acelp_core_switch_dec( + Decoder_State *st, /* i/o: decoder structure */ + float *synth_subfr_out, /* o : synthesized ACELP subframe */ + float *tmp_synth_bwe, /* o : synthesized ACELP subframe BWE */ + const int16_t output_frame, /* i : input frame length */ + const int16_t core_switching_flag, /* i : core switching flag */ + float *mem_synth, /* o : synthesis to overlap */ + const int16_t nchan_out /* i : number of output channels */ +); + +void space_lsfs( + float *lsfs, + const int16_t order ); + +void lsp2a( + float *pc_in, + float *freq, + const int16_t order ); + +void lsp_weights( + const float *lsps, + float *weight, + const int16_t order ); + +void a2lsp_stab( + const float *a, /* i : LP filter coefficients */ + float *lsp, /* o : Line spectral pairs */ + const float *old_lsp /* i : LSP vector from past frame */ +); + +void lsp2a_stab( + const float *lsp, /* i : LSF vector (in the cosine domain) */ + float *a, /* o : LP filter coefficients */ + const int16_t m /* i : order of LP analysis */ +); + +void isf2lsf( + const float *isf, /* i : ISF vector */ + float *lsf, /* o : LSF vector */ + float *stable_lsp, /* i/o: LSF vector */ + const int16_t m, /* i : order of LP analysis */ + const int32_t Fs ); + +void lsf2isf( + const float *lsf, /* i : LSF vector */ + float *isf, /* o : ISF vector */ + float *stable_isp, /* i/o: ISP vector */ + const int16_t m, /* i : order of LP analysis */ + const int32_t Fs ); + +int16_t a2lsp( + float *freq, /* o : LSP vector */ + const float *a, /* i : predictor coefficients */ + const int16_t order /* i : order of LP analysis */ +); + +void ResetSHBbuffer_Enc( + TD_BWE_ENC_HANDLE hBWE_TD /* i/o: TD BWE data handle */ +); + +void ResetSHBbuffer_Dec( + TD_BWE_DEC_HANDLE hBWE_TD, /* i/o: TD BWE data handle */ + const int16_t extl /* i : BWE extension layer */ +); + +void calc_st_filt( + const float *apond2, /* i : coefficients of numerator */ + const float *apond1, /* i : coefficients of denominator */ + float *parcor0, /* o : 1st parcor calcul. on composed filter */ + float *sig_ltp_ptr, /* i/o: input of 1/A(gamma1) : scaled by 1/g0 */ + float *mem_zero, /* i/o: All zero memory */ + const int16_t L_subfr, /* i : the length of subframe */ + const int16_t extl /* i : extension layer info */ +); + +void scale_st( + const float *sig_in, /* i : postfilter input signal */ + float *sig_out, /* i/o: postfilter output signal */ + float *gain_prec, /* i/o: last value of gain for subframe */ + const int16_t L_subfr, /* i : the length of subframe */ + const int16_t extl /* i : extension layer info */ +); + +void filt_mu( + const float *sig_in, /* i : signal (beginning at sample -1) */ + float *sig_out, /* o : output signal */ + const float parcor0, /* i : parcor0 (mu = parcor0 * gamma3) */ + const int16_t L_subfr, /* i : the length of subframe */ + const int16_t extl /* i : extension layer info */ +); + +void PostShortTerm( + float *sig_in, /* i : input signal (ptr. to current subframe */ + float *lpccoeff, /* i : LPC coefficients for current subframe */ + float *sig_out, /* o : postfiltered output */ + float *mem_stp, /* i/o: postfilter memory */ + float *ptr_mem_stp, /* i/o: pointer to postfilter memory */ + float *ptr_gain_prec, /* i/o: for gain adjustment */ + float *mem_zero, /* i/o: null memory to compute h_st */ + const float formant_fac /* i : Strength of post-filter [0,1] */ +); + +/*! r: Formant filter strength [0,1] */ +float swb_formant_fac( + const float lpc_shb2, /* i : 2nd HB LPC coefficient */ + float *tilt_mem /* i/o: Tilt smoothing memory */ +); + +void GenShapedSHBExcitation( + float *excSHB, /* o : synthesized shaped shb exctiation */ + const float *lpc_shb, /* i : lpc coefficients */ + float *exc16kWhtnd, /* o : whitened synthesized shb excitation */ + float *mem_csfilt, /* i/o: memory */ + float *mem_genSHBexc_filt_down_shb, /* i/o: memory */ + float *state_lpc_syn, /* i/o: memory */ + const int16_t coder_type, /* i : coding type */ + const float *bwe_exc_extended, /* i : bandwidth extended excitation */ + int16_t bwe_seed[], /* i/o: random number generator seed */ + float voice_factors[], /* i : voicing factor */ + const int16_t extl, /* i : extension layer */ + float *tbe_demph, /* i/o: de-emphasis memory */ + float *tbe_premph, /* i/o: pre-emphasis memory */ + float *lpc_shb_sf, /* i : LP coefficients */ + float *shb_ener_sf, /* i : SHB subframe energies */ + float *shb_res_gshape, /* i : SHB LP residual gain shape */ + float *shb_res, /* i : SHB residual used in encoder only */ + int16_t *vf_ind, /* i/o: Mixing factor index */ + const float formant_fac, /* i : Formant sharpening factor [0..1] */ + float fb_state_lpc_syn[], /* i/o: memory */ + float *fb_tbe_demph, /* i/o: fb de-emphasis memory */ + const int32_t total_brate, /* i : overall bitrate */ + const int16_t prev_bfi, /* i : previous frame was lost flag */ + const int16_t element_mode, /* i : element mode */ + const int16_t flag_ACELP16k, /* i : ACELP@16kHz flag */ + float *nlExc16k, /* i/o: NL exc for IC-BWE */ + float *mixExc16k, /* i/o: exc spreading for IC-BWE */ + const int32_t extl_brate, /* i : TD BWE bitrate */ + const int16_t MSFlag, /* i : Multi-source flag */ + float EnvSHBres_4k[], /* i/o: TD envelope of the SHB residual signal */ + float *prev_pow_exc16kWhtnd, /* i/o: power of the LB excitation signal in the previous frame */ + float *prev_mix_factor, /* i/o: mixing factor in the previous frame */ + float *Env_error, /* o : error in SHB residual envelope modelling*/ + float Env_error_part[] /* o : per-segment error in SHB residual envelope modelling */ +); + +void GenSHBSynth( + const float *shb_target_speech, /* i : input synthesized speech */ + float *shb_syn_speech_32k, /* o : output highband component */ + float Hilbert_Mem[], /* i/o: memory */ + float state_lsyn_filt_shb_local[], /* i/o: memory */ + const int16_t L_frame, /* i : ACELP Frame length */ + int16_t *syn_dm_phase ); + +void ScaleShapedSHB( + const int16_t length, /* i : SHB overlap length */ + float *synSHB, /* i/o: synthesized shb signal */ + float *overlap, /* i/o: buffer for overlap-add */ + const float *subgain, /* i : subframe gain */ + const float frame_gain, /* i : frame gain */ + const float *win, /* i : window */ + const float *subwin /* i : subframes window */ +); + +void Interpolate_allpass_steep( + const float *in, /* i : input array of size N */ + float *mem, /* i/o: memory */ + const int16_t N, /* i : number of input samples */ + float *out /* o : output array of size 2*N */ +); + +void Decimate_allpass_steep( + const float *in, /* i : input array of size N */ + float *mem, /* i/o: memory */ + const int16_t N, /* i : number of input samples */ + float *out /* o : output array of size N/2 */ +); + +void interpolate_3_over_2_allpass( + const float *input, /* i : input signal */ + const int16_t len, /* i : number of input samples */ + float *out, /* o : output signal */ + float *mem /* i/o: memory */ +); + +void decimate_2_over_3_allpass( + const float *input, /* i : input signal */ + const int16_t len, /* i : number of input samples */ + float *out, /* o : output signal */ + float *mem, /* i/o: memory */ + float *lp_mem ); + +void interpolate_3_over_1_allpass( + const float *input, /* i : input signal */ + const int16_t len, /* i : number of input samples */ + float *out, /* o : output signal */ + float *mem /* i/o: memory */ +); + +void InitSWBencBuffer( + TD_BWE_ENC_HANDLE hBWE_TD /* i/o: TD BWE data handle */ +); + +void InitSWBencBufferStates( + TD_BWE_ENC_HANDLE hBWE_TD, /* i/o: TD BWE data handle */ + float *shb_speech /* o : SHB target signal (6-14kHz) at 16kHz */ +); + +void swb_tbe_enc( + Encoder_State *st, /* i/o: encoder state structure */ + STEREO_ICBWE_ENC_HANDLE hStereoICBWE, /* i/o: IC-BWE state structure */ + const float *new_speech, /* i : original input signal */ + const float *bwe_exc_extended, /* i : bandwidth extended exciatation */ + const float voice_factors[], /* i : voicing factors */ + float *White_exc16k, /* o : shaped white excitation for the FB TBE */ + const float pitch_buf[] /* i : pitch for each subframe */ +); + +void swb_tbe_dec( + Decoder_State *st, /* i/o: decoder state structure */ + STEREO_ICBWE_DEC_HANDLE hStereoICBWE, /* i/o: IC-BWE state structure */ + const float *bwe_exc_extended, /* i : bandwidth extended exciatation */ + const float voice_factors[], /* i : voicing factors */ + const float old_syn_12k8_16k[], /* i : low band synthesis at 12.8kHz or 16kHz */ + float *White_exc16k, /* o : shaped white excitation for the FB TBE */ + float *synth, /* i/o: ACELP core synthesis/final synthesis */ + float *pitch_buf ); + +void flip_and_downmix_generic( + float input[], /* i : input spectrum */ + float output[], /* o : output spectrum */ + const int16_t length, /* i : length of spectra */ + float mem1_ext[HILBERT_ORDER1], /* i/o: Hilbert filter memory */ + float mem2_ext[2 * HILBERT_ORDER2], /* i/o: memory */ + float mem3_ext[2 * HILBERT_ORDER2], /* i/o: memory */ + int16_t *phase_state /* i/o: Phase state in case frequency isn't multiple of 50 Hz */ +); + +void non_linearity( + const float input[], /* i : input signal */ + float output[], /* i : output signal */ + float old_bwe_exc_extended[], /* i/o: memory bugffer */ + const int16_t length, /* i : input length */ + float *prev_scale, /* i/o: memory */ + const int16_t coder_type, /* i : Coder Type */ + const float *voice_factors, /* i : Voice Factors */ + const int16_t L_frame /* i : ACELP frame length */ +); + +void interp_code_5over2( + const float inp_code[], /* i : input vector */ + float interp_code[], /* o : output vector */ + const int16_t inp_length /* i : length of the input vector */ +); + +void interp_code_4over2( + const float inp_code[], /* i : input vector */ + float interp_code[], /* o : output vector */ + const int16_t inp_length /* i : length of the input vector */ +); + +void flip_spectrum_and_decimby4( + const float input[], /* i : input spectrum */ + float output[], /* o : output spectrum */ + const int16_t length, /* i : vector length */ + float mem1[], /* i/o: memory */ + float mem2[], /* i/o: memory */ + const int16_t ramp_flag /* i : flag to trigger slow ramp-up of output */ +); + +void GenShapedWBExcitation( + float *excSHB, /* o : synthesized shaped shb exctiation */ + const float *lpc_shb, /* i : lpc coefficients */ + float *exc4kWhtnd, /* o : whitened synthesized shb excitation */ + float *mem_csfilt, /* i/o: memory */ + float *mem_genSHBexc_filt_down1, /* i/o: memory */ + float *mem_genSHBexc_filt_down2, /* i/o: memory */ + float *mem_genSHBexc_filt_down3, /* i/o: memory */ + float *state_lpc_syn, /* i/o: memory */ + const int16_t coder_type, /* i : coding type */ + const float *bwe_exc_extended, /* i : bandwidth extended exciatation */ + int16_t bwe_seed[], /* i/o: random number generator seed */ + const float voice_factors[], /* i : voicing factor */ + const int16_t uv_flag, /* i : unvoiced flag */ + const int16_t igf_flag ); + +void GenWBSynth( + const float *input_synspeech, /* i : input synthesized speech */ + float *shb_syn_speech_16k, /* o : output highband compnent */ + float *state_lsyn_filt_shb1, /* i/o: memory */ + float *state_lsyn_filt_shb2 /* i/o: memory */ +); + +void wb_tbe_enc( + Encoder_State *st, /* i/o: encoder state structure */ + const float *hb_speech, /* i : HB target signal (6-8kHz) at 16kHz */ + const float *bwe_exc_extended, /* i : bandwidth extended exciatation */ + const float pitch_buf[], /* i : pitch for each subframe */ + const float voicing[] /* o : OL maximum normalized correlation */ +); + +void wb_tbe_dec( + Decoder_State *st, /* i/o: decoder state structure */ + const float *bwe_exc_extended, /* i : bandwidth extended exciatation */ + const float voice_factors[], /* i : voicing factors */ + float *synth /* i/o: ACELP core synthesis/final synthesis */ +); + +void tbe_write_bitstream( + Encoder_State *st /* i/o: encoder state structure */ +); + +void tbe_read_bitstream( + Decoder_State *st /* i/o: decoder state structure */ +); + +void GenTransition( + TD_BWE_DEC_HANDLE hBWE_TD, /* i/o: TD BWE data handle */ + float *outputHB, /* o : synthesized HB transitions signal */ + const int32_t output_Fs, /* i : output sampling rate */ + const int16_t element_mode, /* i : element mode */ + const int16_t L_frame, /* i : ACELP frame length */ + const int16_t rf_flag, /* i : RF flag */ + const int32_t total_brate /* i : total bitrate */ +); + +void GenTransition_WB( + TD_BWE_DEC_HANDLE hBWE_TD, /* i/o: TD BWE data handle */ + float *outputHB, /* o : synthesized HB transitions signal */ + const int32_t output_Fs /* i : output sampling rate */ +); + +void td_bwe_dec_init( + TD_BWE_DEC_HANDLE hBWE_TD, /* i/o: TD BWE data handle */ + const int16_t extl, /* i : BWE extension layer */ + const int32_t output_Fs /* i : output sampling rate */ +); + +void TBEreset_enc( + TD_BWE_ENC_HANDLE hBWE_TD, /* i/o: TD BWE data handle */ + const int16_t last_core, /* i : last core */ + const int16_t bwidth /* i : audio bandwidth */ +); + +void TBEreset_dec( + Decoder_State *st /* i/o: decoder state structure */ +); + +/*! r: TBE bit consumption per frame */ +int16_t get_tbe_bits( + const int32_t total_brate, /* i : overall bitrate */ + const int16_t bwidth, /* i : audio bandwidth */ + const int16_t rf_mode /* i : channel aware mode */ +); + +void fb_tbe_enc( + Encoder_State *st, /* i/o: encoder state structure */ + const float new_input[], /* i : input speech at 48 kHz sample rate */ + const float fb_exc[] /* i : FB excitation from the SWB part */ +); + +void fb_tbe_dec( + Decoder_State *st, /* i/o: decoder state structure */ + const float fb_exc[], /* i : FB excitation from the SWB part */ + float *hb_synth, /* i/o: high-band synthesis */ + float *fb_synth_ref, /* o : high-band synthesis 16-20 kHz */ + const int16_t output_frame /* i : output frame length */ +); + +void calc_tilt_bwe( + const float *sp, /* i : input signal */ + float *tilt, /* o : signal tilt */ + const int16_t N /* i : signal length */ +); + +void fd_bwe_enc_init( + FD_BWE_ENC_HANDLE hBWE_FD /* i/o: FD BWE data handle */ +); + +void swb_pre_proc( + Encoder_State *st, /* i/o: encoder state structure */ + float *new_swb_speech, /* o : original input signal at 32kHz */ + float *shb_speech, /* o : SHB target signal (6-14kHz) at 16kHz */ + float realBuffer[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i : real buffer */ + float imagBuffer[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i : imag buffer */ + CPE_ENC_HANDLE hCPE /* i/o: CPE encoder structure */ +); + +void wb_pre_proc( + Encoder_State *st, /* i/o: encoder state structure */ + const int16_t last_element_mode, /* i : last element mode */ + const float *new_inp_resamp16k, /* i : original input signal */ + float *hb_speech /* o : HB target signal (6-8kHz) at 16kHz */ +); + +void wb_bwe_enc( + Encoder_State *st, /* i/o: encoder state structure */ + const float *new_wb_speech /* i : original input signal at 16kHz */ +); + +void wb_bwe_dec( + Decoder_State *st, /* i/o: decoder state structure */ + const float output[], /* i : synthesis @internal Fs */ + float *synth, /* i/o: ACELP core synthesis/final synthesis */ + float *hb_synth, /* o : SHB synthesis/final synthesis */ + const int16_t use_cldfb_for_dft, /* i : flag to use of CLDFB for DFT Stereo */ + const int16_t output_frame, /* i : frame length */ + const float voice_factors[], /* i : voicing factors */ + const float pitch_buf[] /* i : pitch buffer */ +); + +void swb_bwe_enc( + Encoder_State *st, /* i/o: encoder state structure */ + const int16_t last_element_mode, /* i : last element mode */ + const float *old_input_12k8, /* i : input signal @12.8kHz for SWB BWE */ + const float *old_input_16k, /* i : input signal @16kHz for SWB BWE */ + const float *old_syn_12k8_16k, /* i : ACELP core synthesis at 12.8kHz or 16kHz*/ + const float *new_swb_speech, /* i : original input signal at 32kHz */ + const float *shb_speech /* i : SHB target signal (6-14kHz) at 16kHz */ +); + +void swb_bwe_enc_hr( + Encoder_State *st, /* i/o: encoder state structure */ + const float *new_input, /* i : input signal */ + const int16_t input_frame, /* i : frame length */ + const int16_t unbits /* i : number of core unused bits */ +); + +void fd_bwe_dec_init( + FD_BWE_DEC_HANDLE hBWE_FD /* i/o: FD BWE data handle */ +); + +void swb_bwe_dec( + Decoder_State *st, /* i/o: decoder state structure */ + const float output[], /* i : synthesis @internal Fs */ + const float *synth, /* i : ACELP core synthesis/final synthesis */ + float *hb_synth, /* o : SHB synthesis/final synthesis */ + const int16_t use_cldfb_for_dft, /* i : flag to use of CLDFB for DFT Stereo */ + const int16_t output_frame /* i : frame length */ +); + +void hr_bwe_dec_init( + HR_BWE_DEC_HANDLE hBWE_FD_HR /* i/o: HR BWE data handle */ +); + +void swb_bwe_dec_hr( + Decoder_State *st, /* i/o: decoder state structure */ + const float *syn_12k8_16k, /* i : ACELP core synthesis @16kHz */ + float *hb_synth, /* o : SHB synthesis */ + const int16_t output_frame, /* i : frame length */ + const int16_t unbits, /* i : number of core unused bits */ + const float pitch_buf[] /* i : pitch buffer */ +); + +void swb_hr_noise_fill( + const int16_t is_transient, /* i : transient flag */ + const int16_t spect_start, /* i : spectrum start point */ + const int16_t spect_end, /* i : spectrum end point */ + const float tilt_wb, /* i : tilt of wideband signal */ + const float pitch, /* i : pitch value */ + const int16_t nq[], /* i : AVQ nq index */ + int16_t Nsv, /* i : number of subband */ + int16_t *bwe_highrate_seed, /* i/o: seed of random noise */ + float *t_audio /* i/o: mdct spectrum */ +); + +/*! r: gain */ +float td_postprocess( + float hb_synth[], /* i/o: high-band synthesis */ + const int16_t input_frame, /* i : frame length */ + const int16_t last_extl /* i : last extension layer */ +); + +void calc_normal_length( + const int16_t core, /* i : core */ + const float *sp, /* i : input signal */ + const int16_t mode, /* i : input mode */ + const int16_t extl, /* i : extension layer */ + int16_t *L_swb_norm, /* o : normalize length */ + int16_t *prev_L_swb_norm /* i/o: last normalize length */ +); + +void calc_norm_envelop( + const float SWB_signal[], /* i : SWB spectrum */ + float *envelope, /* o : normalized envelope */ + const int16_t L_swb_norm, /* i : length of envelope */ + const int16_t SWB_flength, /* i : Length of input/output */ + const int16_t st_offset /* i : offset */ +); + +void time_envelop_shaping( + float werr[], /* i/o: SHB synthesis */ + float SWB_tenv[], /* i/o: frequency envelope */ + const int16_t L /* i : frame length */ +); + +void time_reduce_pre_echo( + const float *synth, /* i : ACELP core synthesis */ + float *error, /* o : SHB BWE synthesis */ + float prev_td_energy, /* o : last td energy */ + const int16_t L /* i : subframe length */ +); + +int16_t WB_BWE_gain_pred( + float *WB_fenv, /* o : WB frequency envelopes */ + const float *core_dec_freq, /* i : Frequency domain core decoded signal */ + const int16_t coder_type, /* i : coding type */ + const int16_t prev_code_type, /* i : coding type of last frame */ + const float prev_WB_fenv, /* i : envelope for last frame */ + const float voice_factors[], /* i : voicing factors */ + const float pitch_buf[], /* i : pitch buffer */ + const int32_t last_core_brate, /* i : previous frame core bitrate */ + const float last_wb_bwe_ener, /* i : previous frame wb bwe signal energy */ + const int16_t last_extl, /* i : extl. layer for last frame */ + const float tilt ); + +void WB_BWE_decoding( + const float *core_dec_freq, /* i : Frequency domain core decoded signal */ + float *WB_fenv, /* i : WB frequency envelopes */ + float *WB_signal, /* o : WB signal in MDCT domain */ + const int16_t WB_flength, /* i : Length of input/output */ + const int16_t mode, /* i : classification for WB signal */ + const int16_t last_extl, /* i : extl. layer for last frame */ + float *prev_Energy, /* i/o: energy for last frame */ + float *prev_WB_fenv, /* i/o: envelope for last frame */ + int16_t *prev_L_wb_norm, /* i/o: length for last frame wb norm */ + const int16_t extl, /* i : extension layer */ + const int16_t coder_type, /* i : coding type */ + const int32_t total_brate, /* i : core layer bitrate */ + int16_t *Seed, /* i/o: random generator seed */ + int16_t *prev_flag, /* i/o: attenu flag of last frame */ + int16_t prev_coder_type /* i : coding type of last frame */ +); + +void SWB_BWE_decoding( + const float *core_dec_freq, /* i : Frequency domain core decoded signal */ + float *SWB_fenv, /* i/o: SWB frequency envelopes */ + float *SWB_signal, /* o : SWB signal in MDCT domain */ + const int16_t SWB_flength, /* i : Length of input/output */ + const int16_t mode, /* i : classification for SWB signal */ + int16_t *frica_flag, /* o : fricative signal flag */ + float *prev_Energy, /* i/o: energy for last frame */ + float *prev_SWB_fenv, /* i/o: envelope for last frame */ + int16_t *prev_L_swb_norm, /* i/o: length for last frame wb norm */ + const float tilt_nb, /* i : tilt of synthesis wb signal */ + int16_t *Seed, /* i/o: random generator seed */ + const int16_t st_offset, /* i : offset value due to different core */ + float *prev_weight, /* i/o: excitation weight value of last frame */ + const int16_t extl, /* i : extension layer */ + const int16_t last_extl /* i : extension layer of last frame */ +); + +void CNG_reset_enc( + Encoder_State *st, /* i/o: encoder state structure */ + float *pitch_buf, /* o : floating pitch for each subframe */ + float *voice_factors, /* o : voicing factors */ + int16_t VBR_cng_reset_flag ); + +void a2isp( + const float *a, /* i : LP filter coefficients */ + float *isp, /* o : Immittance spectral pairs */ + const float *old_isp /* i : ISP vector from past frame */ +); + +void a2isf( + float *a, + float *isf, + const float *old_isf, + const int16_t lpcOrder ); + +void a2rc( + const float *a, /* i : LPC coefficients */ + float *refl, /* o : Reflection co-efficients */ + const int16_t lpcorder /* i : LPC order */ +); + +int16_t lp_filt_exc_enc( + const int16_t codec_mode, /* i : codec mode */ + const int16_t coder_type, /* i : coding type */ + const int16_t i_subfr, /* i : subframe index */ + float *exc, /* i/o: pointer to excitation signal frame */ + const float *h1, /* i : weighted filter input response */ + const float *xn, /* i : target vector */ + float *y1, /* o : zero-memory filtered adaptive excitation */ + float *xn2, /* o : target vector for innovation search */ + const int16_t L_subfr, /* i : length of vectors for gain quantization */ + const int16_t L_frame, /* i : frame size */ + float *g_corr, /* o : ACELP correlation values */ + const int16_t clip_gain, /* i : adaptive gain clipping flag */ + float *gain_pit, /* o : adaptive excitation gain */ + int16_t *lp_flag /* i/o: mode selection */ +); + +void updt_tar( + const float *x, /* i : old target (for pitch search) */ + float *x2, /* o : new target (for codebook search) */ + const float *y, /* i : filtered adaptive codebook vector */ + const float gain, /* i : adaptive codebook gain */ + const int16_t L /* i : subframe size */ +); + +void analy_sp( + const int16_t element_mode, /* i : element mode */ + CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ + const int32_t input_Fs, /* i : input sampling rate */ + float *speech, /* i : speech buffer */ + float *Bin_E, /* o : per bin log energy spectrum */ + float *Bin_E_old, /* o : per bin log energy spectrum for mid-frame */ + float *fr_bands, /* o : per band energy spectrum (2 analyses) */ + float lf_E[], /* o : per bin E for first VOIC_BINS bins (without DC) */ + float *Etot, /* o : total input energy */ + const int16_t min_band, /* i : minimum critical band */ + const int16_t max_band, /* i : maximum critical band */ + float *band_ener, /* o : energy in critical frequency bands without minimum noise floor E_MIN */ + float *PS, /* o : Per bin energy spectrum */ + float *fft_buff /* o : FFT coefficients */ +); + +void CNG_enc( + Encoder_State *st, /* i/o: State structure */ + float Aq[], /* o : LP coefficients */ + const float *speech, /* i : pointer to current frame input speech buffer */ + float enr, /* i : frame energy output from Levinson recursion */ + const float *lsp_mid, /* i : mid frame LSPs */ + float *lsp_new, /* i/o: current frame LSPs */ + float *lsf_new, /* i/o: current frame LSFs */ + int16_t *allow_cn_step, /* o : allow CN step */ + float *q_env, + int16_t *sid_bw ); + +void swb_CNG_enc( + Encoder_State *st, /* i/o: State structure */ + const float *shb_speech, /* i : SHB target signal (6-14kHz) at 16kHz */ + const float *syn_12k8_16k /* i : ACELP core synthesis at 12.8kHz or 16kHz */ +); + +void lsf_enc( + Encoder_State *st, /* i/o: state structure */ + float *lsf_new, /* o : quantized LSF vector */ + float *lsp_new, /* i/o: LSP vector to quantize/quantized */ + float *lsp_mid, /* i : mid-frame LSP vector */ + float *Aq, /* o : quantized A(z) for 4 subframes */ + const int16_t tdm_low_rate_mode, /* i : secondary channel low rate mode flag */ + const int16_t GSC_IVAS_mode, /* i : GSC IVAS mode */ + const float tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel */ +); + +void isf_enc_amr_wb( + Encoder_State *st, /* i/o: state structure */ + float *isf_new, /* o : quantized ISF vector */ + float *isp_new, /* i/o: ISP vector to quantize/quantized */ + float *Aq /* o : quantized A(z) for 4 subframes */ +); + +void find_targets( + const float *speech, /* i : pointer to the speech frame */ + const float *mem_syn, /* i : memory of the synthesis filter */ + const int16_t i_subfr, /* i : subframe index */ + float *mem_w0, /* i/o: weighting filter denominator memory */ + const float *p_Aq, /* i : interpolated quantized A(z) filter */ + const float *res, /* i : residual signal */ + const int16_t L_subfr, /* i : length of vectors for gain quantization */ + const float *Ap, /* i : unquantized A(z) filter with bandwidth expansion */ + const float tilt_fac, /* i : tilt factor */ + float *xn, /* o : Close-loop Pitch search target vector */ + float *cn, /* o : target vector in residual domain */ + float *h1 /* o : impulse response of weighted synthesis filter */ +); + +void inov_encode( + Encoder_State *st, /* i/o: encoder state structure */ + const int32_t core_brate, /* i : core bitrate */ + const int16_t Opt_AMR_WB, /* i : flag indicating AMR-WB IO mode */ + const int16_t L_frame, /* i : length of the frame */ + const int16_t last_L_frame, /* i : length of the last frame */ + const int16_t coder_type, /* i : coding type */ + const int16_t bwidth, /* i : input signal bandwidth */ + const int16_t sharpFlag, /* i : formant sharpening flag */ + const int16_t i_subfr, /* i : subframe index */ + const int16_t tc_subfr, /* i : TC subframe index */ + const float *p_Aq, /* i : LP filter coefficients */ + const float gain_pit, /* i : adaptive excitation gain */ + float *cn, /* i/o: target vector in residual domain */ + const float *exc, /* i : pointer to excitation signal frame */ + float *h1, /* i/o: weighted filter input response */ + const float tilt_code, /* i : tilt of of the excitation of previous subframe */ + const float pt_pitch, /* i : pointer to current subframe fractional pitch */ + const float *xn2, /* i : target vector for innovation search */ + float *code, /* o : algebraic excitation */ + float *y2, /* o : zero-memory filtered algebraic excitation */ + int16_t *unbits, /* o : number of unused bits for EVS_PI */ + const int16_t L_subfr /* i : subframe length */ +); + +void acelp_1t64( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const float dn[], /* i : corr. between target and h[]. */ + const float h[], /* i : impulse response of weighted synthesis filter */ + float code[], /* o : algebraic (fixed) codebook excitation */ + float y[], /* o : filtered fixed codebook excitation */ + const int16_t L_subfr /* i : subframe length */ +); + +void acelp_2t32( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const float dn[], /* i : corr. between target and h[]. */ + const float h[], /* i : impulse response of weighted synthesis filter */ + float code[], /* o : algebraic (fixed) codebook excitation */ + float y[] /* o : filtered fixed codebook excitation */ +); + +int16_t acelp_4t64( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + float dn[], /* i : corr. between target and h[]. */ + const float cn[], /* i : residual after long term prediction */ + const float H[], /* i : impulse response of weighted synthesis filter */ + float R[], /* i : autocorrelation values */ + const int16_t acelpautoc, /* i : autocorrealtion flag */ + float code[], /* o : algebraic (fixed) codebook excitation */ + float y[], /* o : filtered fixed codebook excitation */ + int16_t nbbits, /* i : number of bits per codebook */ + const int16_t cmpl_flag, /* i : coomplexity reduction flag */ + const int16_t Opt_AMR_WB /* i : flag indicating AMR-WB IO mode */ +); + +/*! r: return (2*N)+1 bits */ +int16_t quant_2p_2N1( + const int16_t pos1, /* i : position of the pulse 1 */ + const int16_t pos2, /* i : position of the pulse 2 */ + const int16_t N /* i : number of bits for position */ +); + +void corr_xh( + const float *x, /* i : target signal */ + float *y, /* o : correlation between x[] and h[] */ + const float *h, /* i : impulse response of weighted synthesis filter */ + const int16_t L_subfr /* i : length of the subframe */ +); + +void find_tilt( + const float fr_bands[], /* i : energy in frequency bands */ + const float bckr[], /* i : per band background noise energy estimate */ + float ee[2], /* o : lf/hf E ration for present frame */ + const int16_t pitch[3], /* i : open loop pitch values for 3 half-frames */ + const float voicing[3], /* i : normalized correlation for 3 half-frames */ + const float *lf_E, /* i : per bin energy for low frequencies */ + const float corr_shift, /* i : normalized correlation correction */ + const int16_t bwidth, /* i : input signal bandwidth */ + const int16_t max_band, /* i : maximum critical band */ + float hp_E[], /* o : energy in HF */ + const int16_t codec_mode, /* i : Mode 1 or 2 */ + float *bckr_tilt_lt, /* i/o: lf/hf E ratio of background noise */ + int16_t Opt_vbr_mode ); + +void init_gp_clip( + float mem[] /* o : memory of gain of pitch clipping algorithm */ +); + +int16_t gp_clip( + const int16_t element_mode, /* i : element mode */ + const int32_t core_brate, /* i : core bitrate */ + const float *voicing, /* i : normalized correlations (from OL pitch) */ + const int16_t i_subfr, /* i : subframe index */ + const int16_t coder_type, /* i : coding type */ + const float xn[], /* i : target vector */ + float mem[] /* i/o: memory of gain of pitch clipping algorithm */ +); + +void gp_clip_test_lsf( + const int16_t element_mode, /* i : element mode */ + const int32_t core_brate, /* i : core bitrate */ + const float lsf[], /* i : LSF vector */ + float mem[], /* i/o: memory of gain of pitch clipping algorithm */ + const int16_t Opt_AMR_WB /* i : flag indicating AMR-WB IO mode */ +); + +void gp_clip_test_gain_pit( + const int16_t element_mode, /* i : element mode */ + const int32_t core_brate, /* i : core bitrate */ + const float gain_pit, /* i : gain of quantized pitch */ + float mem[] /* i/o: memory of gain of pitch clipping algorithm */ +); + +void analy_lp( + const float speech[], /* i : pointer to the denoised speech frame */ + const int16_t L_frame, /* i : length of the frame */ + const int16_t L_look, /* i : look-ahead length */ + float *ener, /* o : residual signal energy */ + float A[], /* o : A(z) filter coefficients */ + float epsP[], /* o : LP analysis residual energies for each iteration */ + float lsp_new[], /* o : current frame ISPs */ + float lsp_mid[], /* o : current mid-frame ISPs */ + float lsp_old[], /* i/o: previous frame unquantized ISPs */ + const int16_t Top[2], /* i : open loop pitch lag */ + const float Tnc[2], /* i : open loop pitch gain */ + const int32_t sr_core, /* i : internal sampling rate */ + const int16_t sec_chan_low_rate /* i : TD secondary channel flag */ +); + +void analy_lp_AMR_WB( + const float speech[], /* i : pointer to the speech frame */ + float *ener, /* o : residual energy from Levinson-Durbin */ + float A[], /* o : A(z) filter coefficients */ + float epsP[], /* o : LP analysis residual energies for each iteration */ + float isp_new[], /* o : current frame ISPs */ + float isp_old[], /* i/o: previous frame unquantized ISPs */ + float isf_new[], /* o : current frame ISFs */ + const int16_t Top, /* i : open loop pitch lag */ + const float Tnc /* i : open loop pitch gain */ +); + +void noise_est_init( + NOISE_EST_HANDLE hNoiseEst /* i/o: Noise estimation handle */ +); + +void speech_music_clas_init( + SP_MUS_CLAS_HANDLE hSpMusClas /* i/o: speech/music classifier handle */ +); + +void long_enr( + Encoder_State *st, /* i/o: encoder state structure */ + const float Etot, /* i : total channel energy */ + const int16_t localVAD_HE_SAD, /* i : HE-SAD flag without hangover */ + const int16_t high_lpn_flag, /* i : sp/mus LPN flag */ + FRONT_VAD_ENC_HANDLE hFrontVad[CPE_CHANNELS], /* i/o: front-VAD handles */ + const int16_t n_chan, /* i : number of channels */ + const int16_t localVAD_HE_SAD_LR[CPE_CHANNELS], /* i : HE-SAD flag without hangover LR channels */ + const float Etot_LR[CPE_CHANNELS] /* i : total channel energy LR channels */ +); + +void noise_est_pre( + const float Etot, /* i : Energy of current frame */ + const int16_t ini_frame, /* i : Frame number (init) */ + NOISE_EST_HANDLE hNoiseEst, /* i/o: Noise estimation data handle */ + const int16_t idchan, /* i : channel ID */ + const int16_t element_mode, /* i : element mode */ + const int16_t last_element_mode /* i : last element mode */ +); + +void noise_est_down( + const float fr_bands[], /* i : per band input energy (contains 2 vectors) */ + float bckr[], /* i/o: per band background noise energy estimate */ + float tmpN[], /* o : temporary noise update */ + float enr[], /* o : averaged energy over both subframes */ + const int16_t min_band, /* i : minimum critical band */ + const int16_t max_band, /* i : maximum critical band */ + float *totalNoise, /* o : noise estimate over all critical bands */ + const float Etot, /* i : Energy of current frame */ + float *Etot_last, /* i/o: Energy of last frame */ + float *Etot_v_h2 /* i/o: Energy variaions of noise frames */ +); + +void noise_est( + Encoder_State *st, /* i/o: encoder state structure */ + const int16_t old_pitch1, /* i : previous frame OL pitch[1] */ + const float tmpN[], /* i : temporary noise update */ + const float *epsP, /* i : LP prediction error energies */ + const float Etot, /* i : total channel E */ + const float relE, /* i : relative frame energy */ + const float corr_shift, /* i : normalized correlation correction */ + const float enr[], /* i : averaged energy over both subframes */ + float fr_bands[], /* i : spectrum per critical bands of the current frame */ + float *cor_map_sum, /* o : sum of correlation map from mult-harm analysis */ + float *ncharX, /* o : noise character for sp/mus classifier */ + float *sp_div, /* o : soectral diversity feature */ + float *non_staX, /* o : non-stationarity for sp/mus classifier */ + int16_t *loc_harm, /* o : multi-harmonicity flag for UV classifier */ + const float *lf_E, /* i : per bin energy for low frequencies */ + int16_t *st_harm_cor_cnt, /* i : 1st harm correlation timer */ + const float Etot_l_lp, /* i : Smoothed low energy */ + float *sp_floor, /* o : noise floor estimate */ + float S_map[], /* o : short-term correlation map */ + STEREO_CLASSIF_HANDLE hStereoClassif, /* i/o: stereo classifier structure */ + FRONT_VAD_ENC_HANDLE hFrontVad, /* i/o: front-VAD handle */ + const int16_t ini_frame /* i : Frame number (init) */ +); + +void vad_param_updt( + Encoder_State *st, /* i/o: encoder state structure */ + const float corr_shift, /* i : correlation shift */ + const float corr_shiftR, /* i : correlation shift right channel */ + const float A[], /* i : A(z) unquantized for the 4 subframes */ + const int16_t old_pitch1, /* i : previous frame OL pitch[1] */ + FRONT_VAD_ENC_HANDLE hFrontVad[], /* i/o: front-VAD handles */ + const int16_t n_channels /* i : number of channels */ +); + +/*! r: frame multi-harmonicity (1-harmonic, 0-not) */ +int16_t multi_harm( + const float Bin_E[], /* i : log energy spectrum of the current frame */ + float old_S[], /* i/o: prev. log-energy spectrum w. subtracted floor */ + float cor_map_LT[], /* i/o: LT correlation map */ + float *multi_harm_limit, /* i/o: multi harminic threshold */ + const int32_t total_brate, /* i : total bitrate */ + const int16_t bwidth, /* i : input signal bandwidth */ + int16_t *cor_strong_limit, /* i/o: HF correlation indicator */ + float *st_mean_avr_dyn, /* i/o: long term average dynamic */ + float *st_last_sw_dyn, /* i/o: last dynamic */ + float *cor_map_sum, /* i : sum of correlation map */ + float *sp_floor, /* o : noise floor estimate */ + float S_map[] /* o : short-term correlation map */ +); + +void lp_gain_updt( + const int16_t i_subfr, /* i : subframe number */ + const float gain_pit, /* i : Decoded gain pitch */ + const float norm_gain_code, /* i : Normalised gain code */ + float *lp_gainp, /* i/o: LP-filtered pitch gain(FEC) */ + float *lp_gainc, /* i/o: LP-filtered code gain (FEC) */ + const int16_t L_frame /* i : length of the frame */ +); + +void enc_pit_exc( + Encoder_State *st, /* i/o: state structure */ + const float *speech, /* i : Input speech */ + const float Aw[], /* i : weighted A(z) unquantized for subframes */ + const float *Aq, /* i : 12k8 Lp coefficient */ + const float Es_pred, /* i : predicted scaled innov. energy */ + const float *res, /* i : residual signal */ + float *synth, /* i/o: core synthesis */ + float *exc, /* i/o: current non-enhanced excitation */ + int16_t *T0, /* i/o: close loop integer pitch */ + int16_t *T0_frac, /* i/o: close-loop pitch period - fractional part */ + float *pitch_buf, /* i/o: Fractionnal per subframe pitch */ + const int16_t nb_subfr, /* i : Number of subframe considered */ + float *gpit, /* o : pitch gain per subframe */ + const int16_t tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag */ + const float tdm_Pri_pitch_buf[] /* i : primary channel pitch buffer */ +); + +void GSC_enc_init( + GSC_ENC_HANDLE hGSCEnc /* i/o: GSC data handle */ +); + +void encod_audio( + Encoder_State *st, /* i/o: state structure */ + const float speech[], /* i : input speech */ + const float Aw[], /* i : weighted A(z) unquantized for subframes */ + const float Aq[], /* i : 12k8 Lp coefficient */ + const float *res, /* i : residual signal */ + float *synth, /* i/o: core synthesis */ + float *exc, /* i/o: current non-enhanced excitation */ + float *pitch_buf, /* i/o: floating pitch values for each subframe */ + float *voice_factors, /* o : voicing factors */ + float *bwe_exc, /* o : excitation for SWB TBE */ + const int16_t attack_flag, /* i : attack flag (GSC or TC) */ + float *lsf_new, /* i : current frame ISF vector */ + float *tmp_noise, /* o : long-term noise energy */ + const int16_t tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag */ + const float tdm_Pri_pitch_buf[] /* i : primary channel pitch buffer */ +); + +/*! r: index of the last band where pitch contribution is significant */ +int16_t Pit_exc_contribution_len( + Encoder_State *st, /* i/o: state structure */ + const float *dct_res, /* i : DCT of residual */ + float *dct_pitex, /* i/o: DCT of pitch contribution */ + float *pitch_buf, /* i/o: Pitch per subframe */ + int16_t *hangover /* i : Hangover for the time contribution switching */ +); + +int16_t stab_est( + float etot, /* i : Total energy of the current frame */ + float *lt_diff_etot, /* i/o: Long term total energy variation */ + float *mem_etot, /* i/o: Total energy memory */ + int16_t *nb_thr_3, /* i/o: Number of consecutives frames of level 3 */ + int16_t *nb_thr_1, /* i/o: Number of consecutives frames of level 1 */ + float *thresh, /* i/o: Detection thresold */ + int16_t *last_music_flag, /* i/o: Previous music detection ouptut */ + const int16_t vad_flag /* i : VAD flag */ +); + +float gsc_gainQ( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const int16_t element_mode, /* i : element mode */ + const int16_t idchan, /* i : channel ID */ + const float y_gain4[], /* i : gain per band */ + float y_gainQ[], /* o : quantized gain per band */ + const int32_t core_brate, /* i : Core rate */ + const int16_t coder_type, /* i : coding type */ + const int16_t bwidth, /* i : input signal bandwidth */ + const int16_t L_frame, /* i : frame length */ + const int16_t tdm_LRTD_flag, /* i : LRTD stereo mode flag */ + const int32_t core_brate_inp /* i : true core brate */ +); + +void Ener_per_band_comp( + const float exc_diff[], /* i : gain per band */ + float y_gain4[], /* o : gain per band to quantize */ + const int16_t Mband, /* i : Max band */ + const int16_t Eflag, /* i : flag of highest band */ + const int16_t L_frame /* i : frame length */ +); + +void Comp_and_apply_gain( + float exc_diffQ[], /* i/o: gain per band */ + float Ener_per_bd_iQ[], /* o : Quant Ener per band */ + float Ener_per_bd_yQ[], /* o : Ener per band for quantize y */ + int16_t Mbands_gn, /* i : number of bands */ + const int16_t ReUseGain /* i : Reuse the gain in Ener_per_bd_yQ */ +); + +void bands_and_bit_alloc( + const int16_t cor_strong_limit, /* i : HF correlation */ + const int16_t noise_lev, /* i : dwn scaling factor */ + const int32_t core_brate, /* i : core bitrate */ + const int16_t Diff_len, /* i : Lenght of the difference signal (before pure spectral)*/ + const int16_t bits_used, /* i : Number of bit used before frequency Q */ + int16_t *bit, /* i/o: Number of bit allowed for frequency quantization */ + float *ener_vec, /* i/o: Quantized energy vector */ + int16_t *max_ener_band, /* o : Sorted order */ + int16_t *bits_per_bands_s, /* i/o: Number of bit allowed per allowed subband (Q3) */ + int16_t *nb_subbands, /* o : Number of subband allowed */ + const float *exc_diff, /* i : Difference signal to quantize (encoder side only) */ + float *concat_in, /* o : Concatened PVQ's input vector (encoder side only) */ + int16_t *pvq_len, /* o : Number of bin covered with the PVQ */ + const int16_t coder_type, /* i : coding type */ + const int16_t bwidth, /* i : input signal bandwidth */ + const int16_t GSC_noisy_speech, /* i : GSC noisy speech flag */ + const int16_t L_frame, /* i : frame length */ + const int16_t element_mode, /* i : element mode */ + const int16_t GSC_IVAS_mode /* i : GSC IVAS mode */ +); + +/*! r: average frequency gain */ +float gsc_gaindec( + Decoder_State *st, /* i/o: decoder state structure */ + float y_gainQ[], /* o : quantized gain per band */ + const int32_t core_brate, /* i : core used */ + float old_y_gain[], /* i/o: AR gain quantizer for low rate */ + const int16_t coder_type, /* i : coding type */ + const int16_t bwidth /* i : input signal bandwidth */ +); + +void freq_dnw_scaling( + const int16_t cor_strong_limit, /* i : HF correlation */ + const int16_t coder_type, /* i : coder type */ + const int16_t noise_lev, /* i : Noise level */ + const int32_t core_brate, /* i : Core bitrate */ + float fy_norm[], /* i/o: Frequency quantized parameter */ + const int16_t L_frame /* i : frame length */ +); + +void GSC_dec_init( + GSC_DEC_HANDLE hGSCDec /* i/o: GSC data handle */ +); + +void decod_audio( + Decoder_State *st, /* i/o: decoder static memory */ + float dct_epit[], /* o : GSC excitation in DCT domain */ + const float *Aq, /* i : LP filter coefficient */ + float *tmp_noise, /* o : long term temporary noise energy */ + float *pitch_buf, /* o : floating pitch values for each subframe */ + float *voice_factors, /* o : voicing factors */ + float *exc_dct_in, /* i/o: adapt. excitation exc */ + float *exc2, /* i/o: adapt. excitation/total exc */ + float *bwe_exc, /* o : excitation for SWB TBE */ + float *lsf_new, /* i : current frame ISF vector */ + float *gain_buf, /* o : floating pitch gain for each subframe */ + const int16_t tdm_lp_reuse_flag, /* i : LPC reuse flag */ + const int16_t tdm_low_rate_mode, /* i : secondary channel low rate mode flag */ + const int16_t tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag */ + const float tdm_Pri_pitch_buf[] /* i : primary channel pitch buffer */ +); + +void gsc_dec( + Decoder_State *st, /* i/o: State structure */ + float exc_dct_in[], /* i/o: dct of pitch-only/total excitation */ + const int16_t pit_band_idx, /* i : pitch band index */ + const int16_t Diff_len, /* i : */ + const int16_t bits_used, /* i : total number of bits used */ + const int16_t nb_subfr, /* i : Number of subframe considered */ + const int16_t coder_type, /* i : coding type */ + int16_t *last_bin, /* i : last bin of bit allocation */ + const float *lsf_new, /* i : ISFs at the end of the frame */ + float *exc_wo_nf, /* o : excitation (in f domain) without noisefill*/ + float *tmp_noise /* o : long-term noise energy */ +); + +void dec_pit_exc( + Decoder_State *st, /* i/o: decoder static memory */ + const int16_t L_frame, /* i : length of the frame */ + const float *Aq, /* i : LP filter coefficient */ + const float Es_pred, /* i : predicted scaled innov. energy */ + float *pitch_buf, /* o : floating pitch values for each subframe */ + float *code, /* o : innovation */ + float *exc, /* i/o: adapt. excitation exc */ + const int16_t nb_subfr, /* i : Number of subframe considered */ + float *gain_buf, /* o : floating pitch gain for each subframe */ + const int16_t tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag */ + const float tdm_Pri_pitch_buf[] /* i : primary channel pitch buffer */ +); + +void highband_exc_dct_in( + const int32_t core_brate, /* i : core bitrate */ + const int16_t *mfreq_bindiv_loc, /* i : bin per bands tables */ + int16_t last_bin, /* i : last bin of bit allocation */ + int16_t Diff_len, /* i : number of bin before cut-off frequency */ + int16_t noise_lev, /* i : pulses dynamic */ + int16_t pit_band_idx, /* i : bin position of the cut-off frequency */ + float *exc_diffQ, /* i : frequency coefficients of per band */ + int16_t *seed_tcx, /* i : Seed for noise */ + float *Ener_per_bd_iQ, /* i : Quantized energy of targeted vector */ + int16_t nb_subfr, /* i : Number of subframe considered */ + float *exc_dct_in, /* o : dct of residual signal */ + int16_t last_coder_type, /* i : coding type of last frame */ + int16_t *bitallocation_band, /* i : bit allocation flag of each band */ + const float *lsf_new, /* i : ISFs at the end of the frame */ + float *last_exc_dct_in, /* i : dct of residual signal of last frame */ + float *last_ener, /* i : frequency energy of last frame */ + int16_t *last_bitallocation_band, /* i : bit allocation flag of each band of last frame */ + int16_t *bitallocation_exc, /* i : flag of decoded coefficients */ + const int16_t bfi, /* i : bad frame indicator */ + const int16_t coder_type, /* i : coder type */ + const int16_t bwidth, /* i : audio bandwidth */ + float *exc_wo_nf, /* o : excitation (in f domain) without noisefill */ + const int16_t GSC_noisy_speech, /* i : GSC noisy speech flag */ + float *lt_ener_per_band_fx, /* i/o: Average per band energy */ + const int16_t L_frame, /* i : frame length */ + const int16_t element_mode, /* i : IVAS element moden */ + const int16_t GSC_IVAS_mode /* i : GSC IVAS mode */ +); + +void inact_switch_ematch( + float exc2[], /* i/o: CELP/GSC excitation buffer */ + float dct_exc_tmp[], /* i : GSC excitation in DCT domain */ + float lt_ener_per_band[], /* i/o: long-term energy per band */ + const int16_t coder_type, /* i : coder type */ + const int16_t L_frame, /* i : frame length */ + const int32_t total_brate, /* i : Total bitrate */ + const int16_t bfi, /* i : frame lost indicator */ + const int16_t last_core, /* i : Last core used */ + const int16_t last_codec_mode, /* i : Last codec mode */ + const int16_t tdm_low_rate_mode, /* i : secondary channel low rate mode flag */ + const int16_t element_mode /* i : element mode */ +); + +void music_postfilt_init( + MUSIC_POSTFILT_HANDLE hMusicPF /* i/o: LD music postfilter handle */ +); + +void LD_music_post_filter( + MUSIC_POSTFILT_HANDLE hMusicPF, /* i/o: LD music postfilter handle */ + const float dtc_in[], /* i : input synthesis */ + float dtc_out[], /* o : output synthesis */ + const int32_t core_brate, /* i : core bitrate */ + const int16_t coder_type, /* i : Coder type : -1 in case of IO */ + const int16_t Last_coder_type /* i : last Coder type */ +); + +void Post_music_postP( + float dct_buffer_in[], /* i/o: excitation buffer */ + float exc_buffer_out[], /* o : DCT output buffer */ + float *exc2, /* i/o: Current excitation to be overwriten */ + const float *mem_tmp, /* i : previous frame synthesis memory */ + float *st_mem_syn2, /* i/o: current frame synthesis memory */ + const float *Aq, /* i : LPC filter coefficients */ + float *syn /* i/o: 12k8 synthesis */ +); + +void Prep_music_postP( + float exc_buffer_in[], /* i/o: excitation buffer */ + float dct_buffer_out[], /* o : DCT output buffer */ + float filt_lfE[], /* i/o: long term spectrum energy */ + const int16_t last_core, /* i : last core */ + const float *pitch_buf, /* i : current frame pitch information */ + float *LDm_enh_lp_gbin /* o : smoothed suppression gain, per bin FFT */ +); + +void speech_music_classif( + Encoder_State *st, /* i/o: encoder state structure */ + const float *new_inp, /* i : new input signal */ + const float *inp, /* i : input signal to locate attach position */ + const int16_t localVAD_HE_SAD, /* i : HE-SAD flag without hangover */ + const float lsp_new[M], /* i : LSPs in current frame */ + const float cor_map_sum, /* i : correlation map sum (from multi-harmonic anal.) */ + const float epsP[M + 1], /* i : LP prediciton error */ + const float PS[], /* i : energy spectrum */ + const float Etot, /* i : total frame energy */ + const float old_cor, /* i : max correlation from previous frame */ + int16_t *attack_flag, /* o : attack flag (GSC or TC) */ + const float non_staX, /* i : unbound non-stationarity for sp/mus classifier */ + const float relE, /* i : relative frame energy */ + int16_t *high_lpn_flag, /* o : sp/mus LPN flag */ + const int16_t flag_spitch /* i : flag to indicate very short stable pitch */ +); + +void find_wsp( + const int16_t L_frame, /* i : length of the frame */ + const int16_t L_subfr, /* i : length of subframe */ + const int16_t nb_subfr, /* i : number of subframes */ + const float *A, /* i : A(z) filter coefficients */ + float *Aw, /* o : weighted A(z) filter coefficients */ + const float *speech, /* i : pointer to the denoised speech frame */ + const float tilt_fact, /* i : tilt factor */ + float *wsp, /* o : poitnter to the weighted speech frame */ + float *mem_wsp, /* i/o: W(Z) denominator memory */ + const float gamma, /* i : weighting factor */ + const int16_t L_look /* i : look-ahead */ +); + +void pitch_ol_init( + float *old_thres, /* o : threshold for reinforcement of past pitch influence */ + int16_t *old_pitch, /* o : pitch of the 2nd half-frame of previous frame */ + int16_t *delta_pit, /* o : pitch evolution extrapolation */ + float *old_corr /* o : correlation */ +); + +void pitch_ol( + int16_t pitch[3], /* o : open loop pitch lag for each half-frame */ + float voicing[3], /* o : maximum normalized correlation for each half-frame */ + int16_t *old_pitch, /* i/o: OL pitch of the 2nd half-frame of the last frame */ + float *old_corr, /* i/o: correlation */ + float corr_shift, /* i : normalized correlation correction */ + float *old_thres, /* i/o: maximum correlation weighting with respect to past frame pitch */ + int16_t *delta_pit, /* i/o: old pitch extrapolation correction (added to old pitch) */ + float *st_old_wsp2, /* i/o: weighted speech memory */ + const float *wsp, /* i : weighted speech for current frame and look-ahead */ + float mem_decim2[3], /* i/o: wsp decimation filter memory */ + const float relE, /* i : relative frame energy */ + const int16_t L_look, /* i : look-ahead length */ + const int16_t last_class, /* i : frame classification of last frame */ + const int16_t bwidth, /* i : audio bandwidth */ + const int16_t Opt_SC_VBR /* i : SC-VBR flag */ +); + +void pitch_ol2( + const int16_t pit_min, /* i : pit_min value */ + const int16_t pitch_ol, /* i : pitch to be improved */ + float *pitch_fr, /* o : adjusted 1/4 fractional pitch */ + float *voicing_fr, /* o : adjusted 1/4 fractional voicing */ + const int16_t pos, /* i : position in frame where to calculate the improv. */ + const float *wsp, /* i : weighted speech for current frame and look-ahead */ + const int16_t delta /* i : delta for pitch search */ +); + +void StableHighPitchDetect( + int16_t *flag_spitch, /* o : flag to indicate very short stable pitch */ + int16_t pitch[], /* i/o: OL pitch buffer */ + const float voicing[], /* i : OL pitch gains */ + const float Bin_E[], /* i : per bin log energy spectrum */ + const float wsp[], /* i : weighted speech */ + const int16_t localVAD, /* i : local VAD flag */ + float *voicing_sm, /* i/o: smoothed open-loop pitch gains */ + float *voicing0_sm, /* i/o: smoothed high pitch gains */ + float *LF_EnergyRatio_sm, /* i/o: smoothed [0, 300Hz] relative peak energy */ + int16_t *predecision_flag, /* i/o: predecision flag */ + float *diff_sm, /* i/o: smoothed pitch frequency difference */ + float *energy_sm /* i/o: smoothed energy around pitch frequency */ +); + +void pitchDoubling_det( + const float *wspeech, + int16_t *pitch_ol, + float *pitch_fr, + float *voicing_fr ); + +void gain_enc_amr_wb( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const float *xn, /* i : target vector */ + const float *y1, /* i : zero-memory filtered adaptive excitation */ + const float *y2, /* i : zero-memory filtered algebraic codebook excitation */ + const float *code, /* i : algebraic excitation */ + const int32_t core_brate, /* i : core bitrate */ + float *gain_pit, /* i/o: Pitch gain / Quantized pitch gain */ + float *gain_code, /* o : Quantized codebook gain */ + float *gain_inov, /* o : innovation gain */ + float *norm_gain_code, /* o : norm. gain of the codebook excitation */ + float *coeff, /* i/o: correlations , -2,, -2 and 2 */ + const int16_t clip_gain, /* i : gain pitch clipping flag (1 = clipping) */ + float *past_qua_en /* i/o: gain quantization memory (4 words) */ +); + +void gain_enc_lbr( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const int16_t gains_mode[], /* i : gain bits */ + const int16_t coder_type, /* i : coding type */ + const int16_t i_subfr, /* i : subframe index */ + const float *xn, /* i : target vector */ + const float *y1, /* i : zero-memory filtered adaptive excitation */ + const float *y2, /* i : zero-memory filtered algebraic codebook excitation */ + const float *code, /* i : algebraic excitation */ + float *gain_pit, /* o : quantized pitch gain */ + float *gain_code, /* o : quantized codebook gain */ + float *gain_inov, /* o : gain of the innovation (used for normalization) */ + float *norm_gain_code, /* o : norm. gain of the codebook excitation */ + float *g_corr, /* i/o: correlations , -2,, -2 and 2 */ + float gains_mem[], /* i/o: pitch gain and code gain from previous subframes */ + const int16_t clip_gain, /* i : gain pitch clipping flag (1 = clipping) */ + const int16_t L_subfr /* i : subfr Lenght */ +); + +void gain_enc_mless( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const int16_t gains_mode[], /* i : gain bits */ + const int16_t element_mode, /* i : element mode */ + const int16_t L_frame, /* i : length of the frame */ + const int16_t i_subfr, /* i : subframe index */ + const int16_t tc_subfr, /* i : TC subframe index */ + const float *xn, /* i : target vector */ + const float *y1, /* i : zero-memory filtered adaptive excitation */ + const float *y2, /* i : zero-memory filtered algebraic codebook excitation */ + const float *code, /* i : algebraic excitation */ + const float Es_pred, /* i : predicted scaled innovation energy */ + float *gain_pit, /* o : quantized pitch gain */ + float *gain_code, /* o : quantized codebook gain */ + float *gain_inov, /* o : innovation gain */ + float *norm_gain_code, /* o : norm. gain of the codebook excitation */ + float *coeff, /* i/o: correlations , -2,, -2 and 2 */ + const int16_t clip_gain /* i : gain pitch clipping flag (1 = clipping) */ +); + +void gain_enc_SQ( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const int16_t gains_mode[], /* i : gain bits */ + const int16_t i_subfr, /* i : subframe index */ + const float *xn, /* i : target vector */ + const float *yy1, /* i : zero-memory filtered adaptive excitation */ + const float *y2, /* i : zero-memory filtered algebraic codebook excitation */ + const float *code, /* i : algebraic excitation */ + const float Es_pred, /* i : predicted scaled innovation energy */ + float *gain_pit, /* o : quantized pitch gain */ + float *gain_code, /* o : quantized codebook gain */ + float *gain_inov, /* o : gain of the innovation (used for normalization) */ + float *norm_gain_code, /* o : norm. gain of the codebook excitation */ + float *g_corr, /* i/o: correlations , -2,, -2 and 2 */ + const int16_t clip_gain /* i : gain pitch clipping flag (1 = clipping) */ +); + +/*! r: Return index of quantization */ +int16_t gain_enc_gaus( + float *gain, /* i/o: Code gain to quantize */ + const int16_t bits, /* i : number of bits to quantize */ + const float lowBound, /* i : lower bound of quantizer (dB) */ + const float topBound /* i : upper bound of quantizer (dB) */ +); + +void E_corr_xy2( + const float xn[], /* i : target vector */ + const float y1[], /* i : filtered excitation components 1 */ + const float y2[], /* i : filtered excitation components 2 */ + float g_corr[], /* o : correlations between x, y1, y2, y3, y4 */ + const int16_t L_subfr /* i : subframe size */ +); + +/*! r: Floating pitch for each subframe */ +float pit_encode( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const int16_t pitch_bits[], /* i : pitch bits */ + const int32_t core_brate, /* i : core bitrate */ + const int16_t Opt_AMR_WB, /* i : flag indicating AMR-WB IO mode */ + const int16_t L_frame, /* i : length of the frame */ + const int16_t coder_type, /* i : coding type */ + int16_t *limit_flag, /* i/o: restrained(0) or extended(1) Q limits */ + const int16_t i_subfr, /* i : subframe index */ + float *exc, /* i/o: pointer to excitation signal frame */ + const int16_t L_subfr, /* i : subframe length */ + const int16_t *pitch, /* i : open loop pitch estimates in current frame */ + int16_t *T0_min, /* i/o: lower limit for close-loop search */ + int16_t *T0_max, /* i/o: higher limit for close-loop search */ + int16_t *T0, /* i/o: close loop integer pitch */ + int16_t *T0_frac, /* i/o: close loop fractional part of the pitch */ + const float *h1, /* i : weighted filter input response */ + const float *xn, /* i : target vector */ + const int16_t tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag */ + const float tdm_Pri_pitch_buf[] /* i : primary channel pitch buffer */ +); + +/*! r: coding type */ +int16_t find_uv( + Encoder_State *st, /* i/o: encoder state structure */ + const float *pitch_fr, /* i : pointer to adjusted fractional pitch (4 val.) */ + const float *voicing_fr, /* i : refined correlation for each subframes */ + const float *speech, /* i : pointer to speech signal for E computation */ + const float *ee, /* i : lf/hf Energy ratio for present frame */ + float *dE1X, /* o : sudden energy increase for S/M classifier */ + const float corr_shift, /* i : normalized correlation correction in noise */ + const float relE, /* i : relative frame energy */ + const float Etot, /* i : total energy */ + const float hp_E[], /* i : energy in HF */ + int16_t *flag_spitch, /* i/o: flag to indicate very short stable pitch and high correlation */ + const int16_t last_core_orig, /* i : original last core */ + STEREO_CLASSIF_HANDLE hStereoClf /* i/o: stereo classifier structure */ +); + +/*! r: classification for current frames */ +int16_t signal_clas( + Encoder_State *st, /* i/o: encoder state structure */ + const float *speech, /* i : pointer to speech signal for E computation */ + const float *ee, /* i : lf/hf E ration for 2 half-frames */ + const float relE, /* i : frame relative E to the long term average */ + const int16_t L_look, /* i : look-ahead */ + int16_t *clas_mod /* o : class flag for NOOP detection */ +); + +void select_TC( + const int16_t codec_mode, /* i : codec mode */ + const int16_t tc_cnt, /* i : TC frame counter */ + int16_t *coder_type, /* i/o: coder type */ + const int16_t localVAD /* i : VAD without hangover */ +); + +void coder_type_modif( + Encoder_State *st, /* i/o: encoder state structure */ + const float relE /* i : frame relative E to the long term average */ +); + +void wb_vad_init( + VAD_HANDLE hVAD /* i/o: VAD data handle */ +); + +int16_t dtx_hangover_addition( + Encoder_State *st, /* i/o: encoder state structure */ + const int16_t vad_flag, /* i : VAD flag */ + const float snr, /* i : input single SNR estimate */ + const int16_t cldfb_subtraction, /* i : */ + int16_t *vad_hover_flag, /* o : VAD hangover flag */ + VAD_HANDLE hVAD, /* i/o: VAD handle for L or R channel */ + NOISE_EST_HANDLE hNoiseEst, /* i : Noise estimation handle */ + int16_t *rem_dtx_ho /* o : Expected remaining hangover frames */ +); + +int16_t wb_vad( + Encoder_State *st, /* i/o: encoder state structure */ + const float fr_bands[], /* i : per band input energy (contains 2 vectors) */ + int16_t *noisy_speech_HO, /* o : SC-VBR noisy speech HO flag */ + int16_t *clean_speech_HO, /* o : SC-VBR clean speech HO flag */ + int16_t *NB_speech_HO, /* o : SC-VBR NB speech HO flag */ + float *snr_sum_he, /* i : voicing metric from SAD */ + int16_t *localVAD_HE_SAD, /* o : HE_SAD decision without hangovers */ + int16_t *flag_noisy_speech_snr, /* o : */ + VAD_HANDLE hVAD, /* i/o: VAD handle */ + NOISE_EST_HANDLE hNoiseEst, /* i/o: Noise estimation handle */ + float lp_speech, /* i : long term active speech energy average */ + float lp_noise /* i : long term noise energy */ +); + +void bw_detect( + Encoder_State *st, /* i/o: Encoder State */ + const float signal_in[], /* i : input signal */ + float *spectrum, /* i : MDCT spectrum */ + const float *enerBuffer, /* i : energy buffer */ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const int16_t mct_on /* i : flag MCT mode */ +); + +void set_bw( + const int16_t element_mode, /* i : element mode */ + const int32_t element_brate, /* i : element bitrate */ + Encoder_State *st, /* i/o: Encoder State */ + const int16_t codec_mode /* i : codec mode */ +); + +float gaus_encode( + Encoder_State *st, /* i/o: encoder state structure */ + const int16_t i_subfr, /* i : subframe index */ + const float *h1, /* i : weighted filter input response */ + const float *xn, /* i : target vector */ + float *exc, /* o : pointer to excitation signal frame */ + float *mem_w0, /* o : weighting filter denominator memory */ + float *gp_clip_mem, /* o : memory of gain of pitch clipping algorithm */ + float *tilt_code, /* o : synthesis excitation spectrum tilt */ + float *code, /* o : algebraic excitation */ + float *gain_code, /* o : Code gain. */ + float *y2, /* o : zero-memory filtered adaptive excitation */ + float *gain_inov, /* o : innovation gain */ + float *voice_fac, /* o : voicing factor */ + float *gain_pit, /* o : adaptive excitation gain */ + float *norm_gain_code /* o : normalized innovative cb. gain */ +); + +void td_cng_enc_init( + TD_CNG_ENC_HANDLE hTdCngEnc, /* i/o: DTX/TD CNG data handle */ + const int16_t Opt_DTX_ON, /* i : flag indicating DTX operation */ + const int16_t max_bwidth /* i : maximum encoded bandwidth */ +); + +void dtx( + Encoder_State *st, /* i/o: encoder state structure */ + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + const int16_t vad, /* i : VAD flag for DTX */ + const float speech[] /* i : Pointer to the speech frame */ +); + +void dtx_hangover_control( + Encoder_State *st, /* i/o: encoder state structure */ + const float lsp_new[M] /* i : current frame LSPs */ +); + +void updt_enc( + Encoder_State *st, /* i/o: state structure */ + const float *old_exc, /* i : buffer of excitation */ + const float *pitch_buf, /* i : Floating pitch for each subframe */ + const float Es_pred, /* i : predicited scaled innovation energy */ + const float *Aq, /* i : A(z) quantized for all subframes */ + const float *lsf_new, /* i : current frame LSF vector */ + const float *lsp_new, /* i : current frame LSP vector */ + const float *old_bwe_exc /* o : buffer of excitation for SWB TBE */ +); + +void updt_enc_common( + Encoder_State *st /* i/o: encoder state structure */ +); + +void updt_IO_switch_enc( + Encoder_State *st, /* i/o: state structure */ + const int16_t input_frame /* i : input frame length */ +); + +void transition_enc( + Encoder_State *st, /* i/o: encoder state structure */ + const int16_t i_subfr, /* i : subframe index */ + int16_t *tc_subfr, /* i/o: TC subframe index */ + int16_t *Jopt_flag, /* i : joint optimization flag */ + int16_t *position, /* i/o: maximum of residual signal index */ + int16_t *T0, /* i/o: close loop integer pitch */ + int16_t *T0_frac, /* i/o: close loop fractional part of the pitch */ + int16_t *T0_min, /* i/o: lower limit for close-loop search */ + int16_t *T0_max, /* i/o: higher limit for close-loop search */ + float *exc, /* i/o: pointer to excitation signal frame */ + float *y1, /* o : zero-memory filtered adaptive excitation */ + const float *h1, /* i : weighted filter input response */ + const float *xn, /* i : target vector */ + float *xn2, /* o : target vector for innovation search */ + float *gp_cl, /* i/o: memory of gain of pitch clipping algorithm */ + float *gain_pit, /* o : adaptive excitation gain */ + float *g_corr, /* o : ACELP correlation values */ + int16_t *clip_gain, /* i/o: adaptive gain clipping flag */ + float **pt_pitch, /* o : floating pitch values */ + float *bwe_exc, /* i/o: excitation for SWB TBE */ + int16_t *unbits /* i/o: unused bits */ +); + +void tc_classif_enc( + const int16_t L_frame, /* i : length of the frame */ + int16_t *tc_subfr, /* i/o: TC subframe index */ + int16_t *position, /* i/o: maximum of residual signal index */ + const int16_t attack_flag, /* i : attack flag */ + const int16_t pitch, /* i : open loop pitch estimates for first halfframe */ + const float *res /* i : pointer to the LP residual signal frame */ +); + +void set_impulse( + const float xn[], /* i : target signal */ + const float h_orig[], /* i : impulse response of weighted synthesis filter */ + float exc[], /* o : adaptive codebook excitation */ + float y1[], /* o : filtered adaptive codebook excitation */ + int16_t *imp_shape, /* o : adaptive codebook index */ + int16_t *imp_pos, /* o : position of the glottal impulse center index */ + float *gain_trans /* o : transition gain */ +); + +void gain_enc_tc( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const int16_t gains_mode[], /* i : gain bits */ + const int16_t i_subfr, /* i : subframe index */ + const float xn[], /* i : target vector */ + const float y2[], /* i : zero-memory filtered algebraic codebook excitation */ + const float code[], /* i : algebraic excitation */ + const float Es_pred, /* i : predicted scaled innovation energy */ + float *gain_pit, /* o : pitch gain / Quantized pitch gain */ + float *gain_code, /* o : quantized codebook gain */ + float *gain_inov, /* o : innovation gain */ + float *norm_gain_code /* o : norm. gain of the codebook excitation */ +); + +/*! r: pitch gain (0..GAIN_PIT_MAX) */ +float corr_xy1( + const float xn[], /* i : target signal */ + const float y1[], /* i : filtered adaptive codebook excitation */ + float g_corr[], /* o : correlations and -2 */ + const int16_t L_subfr, /* i : subframe length */ + const int16_t norm_flag /* i : flag for constraining pitch contribution */ +); + +void norm_corr( + const float exc[], /* i : excitation buffer */ + const float xn[], /* i : target signal */ + const float h[], /* i : weighted synthesis filter impulse response */ + const int16_t t_min, /* i : minimum value of searched range */ + const int16_t t_max, /* i : maximum value of searched range */ + float corr_norm[], /* o : normalized correlation */ + const int16_t L_subfr /* i : subframe size */ +); + +/*! r: chosen integer pitch lag */ +int16_t pitch_fr4( + const float exc[], /* i : excitation buffer */ + const float xn[], /* i : target signal */ + const float h[], /* i : weighted synthesis filter impulse response */ + const int16_t t0_min, /* i : minimum value in the searched range. */ + const int16_t t0_max, /* i : maximum value in the searched range. */ + int16_t *pit_frac, /* o : chosen fraction (0, 1, 2 or 3) */ + const int16_t i_subfr, /* i : flag to first subframe */ + const int16_t limit_flag, /* i : flag for limits (0=restrained, 1=extended) */ + const int16_t t0_fr2, /* i : minimum value for resolution 1/2 */ + const int16_t t0_fr1, /* i : minimum value for resolution 1 */ + const int16_t L_frame, /* i : length of the frame */ + const int16_t L_subfr /* i : size of subframe */ +); + +void pit_Q_enc( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const int16_t Opt_AMR_WB, /* i : flag indicating AMR-WB IO mode */ + const int16_t nBits, /* i : # of Q bits */ + const int16_t delta, /* i : Half the CL searched interval */ + const int16_t pit_flag, /* i : absolute(0) or delta(1) pitch Q */ + const int16_t limit_flag, /* i : restrained(0) or extended(1) Q limits */ + const int16_t T0, /* i : integer pitch lag */ + const int16_t T0_frac, /* i : pitch fraction */ + int16_t *T0_min, /* i/o: delta search min */ + int16_t *T0_max /* o : delta search max */ +); + +void pit16k_Q_enc( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const int16_t nBits, /* i : # of Q bits */ + const int16_t limit_flag, /* i : restrained(0) or extended(1) Q limits */ + const int16_t T0, /* i : integer pitch lag */ + const int16_t T0_frac, /* i : pitch fraction */ + int16_t *T0_min, /* i/o: delta search min */ + int16_t *T0_max /* o : delta search max */ +); + +/*! r: pitch index */ +int16_t abs_pit_enc( + const int16_t fr_steps, /* i : fractional resolution step */ + const int16_t limit_flag, /* i : restrained(0) or extended(1) limits */ + const int16_t T0, /* i : integer pitch lag */ + const int16_t T0_frac /* i : pitch fraction */ +); + +/*! r: pitch index */ +int16_t delta_pit_enc( + const int16_t fr_steps, /* i : fractional resolution steps (2 or 4) */ + const int16_t T0, /* i : integer pitch lag */ + const int16_t T0_frac, /* i : pitch fraction */ + const int16_t T0_min /* i : delta search min */ +); + +/*! r: comfort noise gain factor */ +float AVQ_cod( + const float xri[], /* i : vector to quantize */ + int16_t xriq[], /* o : quantized normalized vector (assuming the bit budget is enough) */ + const int16_t nb_bits, /* i : number of allocated bits */ + const int16_t Nsv /* i : number of subvectors (lg=Nsv*8) */ +); + +void AVQ_encmux( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const int16_t extl, /* i : extension layer */ + int16_t xriq[], /* i/o: rounded subvectors [0..8*Nsv-1] followed by rounded bit allocations [8*Nsv..8*Nsv+Nsv-1] */ + int16_t *nb_bits, /* i/o: number of allocated bits */ + const int16_t Nsv, /* i : number of subvectors */ + int16_t nq[], /* o : AVQ nq index */ + int16_t avq_bit_sFlag, /* i : flag indicating AVQ bit savings */ + int16_t trgtSvPos /* i : target SV for AVQ bit savings */ +); + +void ordr_esti( + const int16_t k, /* i : sub-vector index */ + int16_t *Mpos, /* i/o: dominant sub-vector position from ACV */ + int16_t svOrder[], /* i/o: AVQ sub-vector order */ + const int16_t Nsv /* i : total sub-vectors in a sub-frames */ +); + +void re8_cod( + int16_t x[], /* i : point in RE8 (8-dimensional integer vector) */ + int16_t *n, /* i : codebook number (*n is an integer defined in {0,2,3,4,..,n_max}) */ + uint16_t *I, /* o : index of c (pointer to unsigned 16-bit word) */ + int16_t k[] /* o : index of v (8-dimensional vector of binary indices) = Voronoi index */ +); + +void pre_exc( + const int16_t Opt_AMR_WB, /* i : flag indicating AMR-WB IO mode */ + const int16_t L_frame, /* i : frame length */ + const float *speech, /* i : input speech */ + const float *p_Aq, /* i : 12k8 Lp coefficient */ + const float *p_A, /* i : unquantized A(q) filter with bandwidth expansion */ + const int16_t coder_type, /* i : coding type */ + const int16_t i_subfr, /* i : current sub frame indicator */ + float *Ap, /* o : weighted LP filter coefficients */ + const float *res, /* i : residual signal */ + float *h1, /* o : impulse response of weighted synthesis filter */ + float *xn, /* o : close-loop Pitch search target vector */ + float *cn, /* o : target vector in residual domain */ + float *mem_syn, /* i/o: memory of the synthesis filter */ + float *mem_w0, /* i/o: weighting filter denominator memory */ + const int16_t L_subfr /* i : subframe length */ +); + +void encod_unvoiced( + Encoder_State *st, /* i/o: state structure */ + const float *speech, /* i : input speech */ + const float Aw[], /* i : weighted A(z) unquantized for subframes */ + const float *Aq, /* i : LP coefficients */ + const float Es_pred, /* i : predicted scaled innov. energy */ + const int16_t uc_two_stage_flag, /* i : flag indicating two-stage UC */ + const float *res, /* i : residual signal */ + float *syn, /* o : core synthesis */ + float *tmp_noise, /* o : long-term noise energy */ + float *exc, /* i/o: current non-enhanced excitation */ + float *pitch_buf, /* o : floating pitch values for each subframe */ + float *voice_factors, /* o : voicing factors */ + float *bwe_exc /* i/o: excitation for SWB TBE */ +); + +void encod_gen_voic( + Encoder_State *st, /* i/o: state structure */ + const float speech[], /* i : input speech */ + const float Aw[], /* i : weighted A(z) unquantized for subframes */ + const float Aq[], /* i : LP coefficients */ + const float Es_pred, /* i : predicted scaled innov. energy */ + const float *res, /* i : residual signal */ + float *syn, /* o : core synthesis */ + float *exc, /* i/o: current non-enhanced excitation */ + float *exc2, /* i/o: current enhanced excitation */ + float *pitch_buf, /* o : floating pitch values for each subframe */ + float *voice_factors, /* o : voicing factors */ + float *bwe_exc, /* i/o: excitation for SWB TBE */ + int16_t *unbits, /* i/o: number of unused bits */ + const int16_t tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag */ + const float tdm_Pri_pitch_buf[] /* i : primary channel pitch buffer */ +); + +int16_t encod_tran( + Encoder_State *st, /* i/o: state structure */ + const float speech[], /* i : input speech */ + const float Aw[], /* i : weighted A(z) unquantized for subframes */ + const float Aq[], /* i : LP coefficients */ + const float Es_pred, /* i : predicted scaled innov. energy */ + const float *res, /* i : residual signal */ + float *syn, /* o : synthesis */ + float *exc, /* i/o: current non-enhanced excitation */ + float *exc2, /* i/o: current enhanced excitation */ + float *pitch_buf, /* o : floating pitch values for each subframe */ + float *voice_factors, /* o : voicing factors */ + float *bwe_exc, /* i/o: excitation for SWB TBE */ + int16_t tc_subfr, /* i/o: TC subframe classification */ + int16_t position, /* i : maximum of residual signal index */ + int16_t *unbits /* i/o: number of unused bits */ +); + +void encod_amr_wb( + Encoder_State *st, /* i/o: state structure */ + const float speech[], /* i : input speech */ + const float Aw[], /* i : weighted A(z) unquantized for subframes */ + const float Aq[], /* i : 12k8 Lp coefficient */ + const float *res, /* i : residual signal */ + float *syn, /* i/o: core synthesis */ + float *exc, /* i/o: current non-enhanced excitation */ + float *exc2, /* i/o: current enhanced excitation */ + float *pitch_buf, /* i/o: floating pitch values for each subframe */ + int16_t hf_gain[NB_SUBFR], /* o : decoded HF gain */ + const float *speech16k /* i : input speech @16kHz */ +); + +void stat_noise_uv_enc( + Encoder_State *st, /* i/o: state structure */ + const float *epsP, /* i : LP prediction errors */ + const float *isp_new, /* i : immittance spectral pairs at 4th sfr */ + const float *isp_mid, /* i : immittance spectral pairs at 2nd sfr */ + float *Aq, /* i/o: A(z) quantized for the 4 subframes */ + float *exc2, /* i/o: excitation buffer */ + const int16_t uc_two_stage_flag /* o : flag undicating two-stage UC */ +); + +void re8_compute_base_index( + const int16_t *x, /* i : Elemen of Q2, Q3 or Q4 */ + const int16_t ka, /* i : Identifier of the absolute leader related to x */ + uint16_t *I /* o : index */ +); + +void transf_cdbk_enc( + Encoder_State *st, /* i/o: encoder state structure */ + const int16_t harm_flag_acelp, /* i : harmonic flag for higher rates ACELP */ + const int16_t i_subfr, /* i : subframe index */ + float cn[], /* i/o: target vector in residual domain */ + float exc[], /* i/o: pointer to excitation signal frame */ + const float *p_Aq, /* i : 12k8 Lp coefficient */ + const float Ap[], /* i : weighted LP filter coefficients */ + const float h1[], /* i : weighted filter input response */ + float xn[], /* i/o: target vector */ + float xn2[], /* i/o: target vector for innovation search */ + float y1[], /* i/o: zero-memory filtered adaptive excitation */ + const float y2[], /* i : zero-memory filtered innovative excitation */ + const float Es_pred, /* i : predicited scaled innovation energy */ + float *gain_pit, /* i/o: adaptive excitation gain */ + const float gain_code, /* i : innovative excitation gain */ + float g_corr[], /* o : ACELP correlation values */ + const int16_t clip_gain, /* i : adaptive gain clipping flag */ + float *gain_preQ, /* o : prequantizer excitation gain */ + float code_preQ[], /* o : prequantizer excitation */ + int16_t *unbits /* i/o: number of AVQ unused bits */ +); + +/*! r: quantization index */ +int16_t gain_quant( + float *gain, /* i/o: quantized gain */ + const float min_val, /* i : value of lower limit */ + const float max_val, /* i : value of upper limit */ + const int16_t bits /* i : number of bits to quantize */ +); + +void deemph_lpc( + float *p_Aq_cuerr, /* i : LP coefficients current frame */ + float *p_Aq_old, /* i : LP coefficients previous frame */ + float *LPC_de_curr, /* o : De-emphasized LP coefficients current frame */ + float *LPC_de_old, /* o : De-emphasized LP coefficients previous frame*/ + const int16_t deemph_old ); + +void Interpol_delay( + float *out, /* o : pitch interpolation output */ + float *last, /* i : last frame pitch lag */ + float *current, /* i : current frame pitch lag */ + int16_t SubNum, /* i : subframe number */ + const float *frac /* i : interpolation constant */ +); + +void dequantize_uvg( + int16_t iG1, /* i : gain 1 index */ + int16_t *iG2, /* i : gain 2 index */ + float *G, /* o : quantized gain */ + const int16_t bwidth /* i : audio bandwidth */ +); + +void generate_nelp_excitation( + int16_t *seed, /* i/o: random number seed */ + float *Gains, /* i : excitation gains */ + float *output, /* o : excitation output */ + float gain_fac /* i : gain factor */ +); + +void nelp_encoder( + Encoder_State *st, /* i/o: encoder state */ + float *in, /* i : residual signal */ + float *exc, /* o : NELP quantized excitation signal */ + const int16_t reduce_gains ); + +void encod_nelp( + Encoder_State *st, /* i/o: state structure */ + const float *speech, /* i : input speech */ + const float Aw[], /* i : weighted A(z) unquantized for subframes */ + const float *Aq, /* i : 12k8 Lp coefficient */ + float *res, /* o : residual signal */ + float *synth, /* o : core synthesis */ + float *tmp_noise, /* o : long-term noise energy */ + float *exc, /* i/o: current non-enhanced excitation */ + float *exc2, /* i/o: current enhanced excitation */ + float *pitch_buf, /* o : floating pitch values for each subframe */ + float *voice_factors, /* o : voicing factors */ + float *bwe_exc /* o : excitation for SWB TBE */ +); + +void realft( + float *data, /* i/o: data array */ + int16_t n, /* i : length of data array */ + int16_t isign /* i : sign +1 or -1 */ +); + +ivas_error DTFS_new( + DTFS_STRUCTURE **dtfs_out ); + +void DTFS_copy( + DTFS_STRUCTURE *Xout, /* o : DTFS */ + DTFS_STRUCTURE Xinp /* i : DTFS */ +); + +void DTFS_sub( + DTFS_STRUCTURE *tmp, /* o : output DFTS */ + DTFS_STRUCTURE X1, /* i : DTFS input 1 */ + DTFS_STRUCTURE X2 /* i : DTFS input 2 */ +); + +void DTFS_to_fs( + const float *x, /* i : Time domain signal */ + const int16_t N, /* i : Length of input vector */ + DTFS_STRUCTURE *X, /* o : DTFS structure with a, b, lag */ + const int32_t sampling_rate, + const int16_t FR_flag /* i : FR flag */ +); + +void DTFS_fs_inv( + DTFS_STRUCTURE *X, /* i : DTFS */ + float *x, /* o : time domain sig */ + const int16_t N, /* i : Output length */ + float ph0 /* i : Input phase */ +); + +void DTFS_car2pol( + DTFS_STRUCTURE *X /* i/o: DTFS structure a, b, lag */ + /* input in Cartesion, output in Polar */ +); + +void DTFS_pol2car( + DTFS_STRUCTURE *X /* i/o: DTFS structure a, b, lag */ + /* input in Polar, output in Cartesian */ +); + +/*! r: Return Input RMS between f1/f2 b4 scaling */ +float DTFS_setEngyHarm( + float f1, /* i : lower band freq of input to control energy */ + float f2, /* i : upper band freq of input to control energy */ + float g1, /* i : lower band freq of output to control energy */ + float g2, /* i : upper band freq of output to control energy */ + float en2, /* i : Target Energy to set the DTFS to */ + DTFS_STRUCTURE *X /* i/o: DTFS to adjust the energy of */ +); + +void DTFS_to_erb( + DTFS_STRUCTURE X, /* i : DTFS input */ + float *out /* o : ERB output */ +); + +void DTFS_zeroPadd( + const int16_t N, /* i : Target lag */ + DTFS_STRUCTURE *X /* i/o: DTFS */ +); + +/*! r: Energy */ +float DTFS_getEngy( + DTFS_STRUCTURE X /* i : DTFS to compute energy of */ +); + +void DTFS_adjustLag( + DTFS_STRUCTURE *X_DTFS, /* i/o: DTFS to adjust lag for */ + const int16_t N /* i : Target lag */ +); + +void DTFS_poleFilter( + DTFS_STRUCTURE *X, /* i/o: DTFS to poleFilter inplace */ + const float *LPC, /* i : LPCs */ + const int16_t N /* i : LPCORDER */ +); + +void DTFS_zeroFilter( + DTFS_STRUCTURE *X, /* i/o: DTFS to zeroFilter inplace */ + const float *LPC, /* i : LPCs */ + const int16_t N /* i : LPCORDER */ +); + +float DTFS_alignment_full( + DTFS_STRUCTURE X1_DTFS, /* i : reference DTFS */ + DTFS_STRUCTURE X2_DTFS, /* i : DTFS to shift */ + const int16_t num_steps /* i : resolution */ +); + +void DTFS_phaseShift( + DTFS_STRUCTURE *X, /* i : DTFS to shift */ + float ph /* i : phase to shift */ +); + +void erb_add( + float *curr_erb, /* i/o: current ERB */ + const int16_t l, /* i : current lag */ + const float *prev_erb, /* i : previous ERB */ + const int16_t pl, /* i : previous lag */ + const int16_t *index, /* i : ERB index */ + const int16_t num_erb /* i : number of ERBs */ +); + +void erb_slot( + int16_t lag, /* i : input lag */ + int16_t *out, /* o : ERB slots */ + float *mfreq, /* i : ERB frequencies */ + int16_t num_erb /* i : number of ERBs */ +); + +void erb_diff( + const float *prev_erb, /* i : previous ERB */ + const int16_t pl, /* i : previous lag */ + const float *curr_erb, /* i : current ERB */ + const int16_t l, /* i : current lag */ + const float *curr_lsp, /* i : current LSP coefficients */ + float *out, /* o : ERB difference */ + int16_t *index, /* i : ERB index */ + const int16_t num_erb /* i : Number of ERBs */ +); + +void DTFS_erb_inv( + float *in, /* i : ERB inpt */ + int16_t *slot, /* i : ERB slots filled based on lag */ + float *mfreq, /* i : erb frequence edges */ + DTFS_STRUCTURE *X, /* o : DTFS after erb-inv */ + const int16_t num_erb /* i : Number of ERB bands */ +); + +ivas_error ppp_quarter_encoder( + int16_t *returnFlag, /* o : return value */ + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + DTFS_STRUCTURE *CURRCW_Q, /* o : Quantized (amp/phase) DTFS */ + DTFS_STRUCTURE *TARGETCW, /* o : DTFS with quant phase but unquant Amp */ + const int16_t prevCW_lag, /* i : previous lag */ + DTFS_STRUCTURE vCURRCW_NQ, /* i : Unquantized DTFS */ + const float *curr_lpc, /* i : LPCS */ + float *lastLgainE, /* i/o: last low band gain */ + float *lastHgainE, /* i/o: last high band gain */ + float *lasterbE, /* i/o: last ERB vector */ + DTFS_STRUCTURE PREV_CW_E /* i : past DTFS */ +); + +ivas_error WIsyn( + DTFS_STRUCTURE PREVCW, /* i : Prev frame DTFS */ + DTFS_STRUCTURE *CURR_CW_DTFS, /* i/o: Curr frame DTFS */ + const float *curr_lpc, /* i : LPC */ + float *ph_offset, /* i/o: Phase offset to line up at end of frame */ + float *out, /* o : Waveform Interpolated time domain signal */ + const int16_t N, /* i : Number of samples of output to generate */ + const int16_t FR_flag /* i : called for post-smoothing in FR */ +); + +void set_ppp_mode( + Encoder_State *st, /* i/o: encoder state structure */ + const int16_t noisy_speech_HO, /* i : SC-VBR noisy speech HO flag */ + const int16_t clean_speech_HO, /* i : SC-VBR clean speech HO flag */ + const int16_t NB_speech_HO, /* i : SC-VBR NB speech HO flag */ + const int16_t localVAD_he /* i : HE-SAD flag without hangover */ +); + +void lsf_syn_mem_backup( + Encoder_State *st, /* i : state structure */ + float *btilt_code, /* i : tilt code */ + float *bgc_threshold, /* i : */ + float *clip_var_bck, /* o : */ + int16_t *next_force_sf_bck, /* o : */ + float *lsp_new, /* i : LSP vector to quantize */ + float *lsp_mid, /* i : mid-frame LSP vector */ + float *clip_var, /* o : pitch clipping state var */ + float *mem_AR, /* o : quantizer memory for AR model */ + float *mem_MA, /* o : quantizer memory for AR model */ + float *lsp_new_bck, /* o : LSP vector to quantize- backup */ + float *lsp_mid_bck, /* o : mid-frame LSP vector - backup */ + float *Bin_E, /* o : FFT Bin energy 128 *2 sets */ + float *Bin_E_old, /* o : FFT Bin energy 128 sets */ + float *mem_syn_bck, /* o : synthesis filter memory */ + float *mem_w0_bck, /* o : memory of the weighting filter */ + float *streaklimit, + int16_t *pstreaklen ); + +void lsf_syn_mem_restore( + Encoder_State *st, /* o : state structure */ + float btilt_code, /* i : */ + float gc_threshold, /* i : */ + float *clip_var_bck, /* i : */ + int16_t next_force_sf_bck, /* i : */ + float *lsp_new, /* o : LSP vector to quantize */ + float *lsp_mid, /* o : mid-frame LSP vector */ + float clip_var, /* i : pitch clipping state var */ + float *mem_AR, /* i : quantizer memory for AR model */ + float *mem_MA, /* i : quantizer memory for AR model */ + float *lsp_new_bck, /* i : LSP vector to quantize- backup */ + float *lsp_mid_bck, /* i : mid-frame LSP vector - backup */ + float *Bin_E, /* i : FFT Bin energy 128 *2 sets */ + float *Bin_E_old, /* i : FFT Bin energy 128 sets */ + float *mem_syn_bck, /* i : synthesis filter memory */ + float mem_w0_bck, /* i : memory of the weighting filter */ + const float streaklimit, + const int16_t pstreaklen ); + +ivas_error ppp_voiced_encoder( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + SC_VBR_ENC_HANDLE hSC_VBR, /* i/o: SC-VBR state structure */ + const int16_t bwidth, /* i : audio bandwidth */ + const int16_t last_coder_type_raw, /* i : raw last_coder_type */ + const float old_pitch_buf[], /* i : buffer of old subframe pitch values */ + float *in, /* i : residual signal */ + float *out, /* o : Quantized residual signal */ + const int16_t delay, /* i : open loop pitch */ + float *lpc1, /* i : prev frame de-emphasized LPC */ + float *lpc2, /* i : current frame de-emphasized LPC */ + float *exc, /* i : previous frame quantized excitation */ + float *pitch /* o : floating pitch values for each subframe */ +); + +ivas_error encod_ppp( + Encoder_State *st, /* i/o: state structure */ + const float speech[], /* i : input speech */ + const float Aw[], /* i : weighted A(z) unquantized for subframes */ + const float Aq[], /* i : 12k8 Lp coefficient */ + float *res, /* i/o: residual signal */ + float *synth, /* i/o: core synthesis */ + float *exc, /* i/o: current non-enhanced excitation */ + float *exc2, /* i/o: current enhanced excitation */ + float *pitch_buf, /* i/o: floating pitch values for each subframe */ + float *voice_factors, /* o : voicing factors */ + float *bwe_exc /* o : excitation for SWB TBE */ +); + +void reset_rf_indices( + RF_ENC_HANDLE hRF, /* i/o: RF state structure */ + const int16_t L_frame, /* i : frame length */ + int16_t *rf_target_bits_write ); + +void signaling_enc_rf( + Encoder_State *st /* i/o: encoder state structure */ +); + +ivas_error acelp_core_dec( + Decoder_State *st, /* i/o: Decoder state structure */ + float output[], /* o : synthesis @internal Fs */ + float synth[], /* o : synthesis */ + float save_hb_synth[], /* o : HB synthesis */ + float bwe_exc_extended[], /* i/o: bandwidth extended excitation */ + float *voice_factors, /* o : voicing factors */ + float old_syn_12k8_16k[], /* o : intermediate ACELP synthesis at 12.8kHz or 16kHz to be used by SWB BWE */ + const int16_t sharpFlag, /* i : formant sharpening flag */ + float pitch_buf[NB_SUBFR16k], /* o : floating pitch for each subframe */ + int16_t *unbits, /* o : number of unused bits */ + int16_t *sid_bw, /* o : 0-NB/WB, 1-SWB SID */ + STEREO_TD_DEC_DATA_HANDLE hStereoTD, /* i/o: TD stereo decoder handle */ + const float tdm_lspQ_PCh[M], /* i : Q LSPs for primary channel */ + const float tdm_lsfQ_PCh[M], /* i : Q LSFs for primary channel */ + const int16_t use_cldfb_for_dft, /* i : flag to use of CLDFB for DFT Stereo */ + const int16_t last_element_mode, /* i : last element mode */ + const int32_t last_element_brate, /* i : last element bitrate */ + const int16_t flag_sec_CNA, /* i : CNA flag for secondary channel */ + const int16_t nchan_out, /* i : number of output channels */ + STEREO_CNG_DEC_HANDLE hStereoCng, /* i : stereo CNG handle */ + const int16_t read_sid_info /* i : read SID info flag */ +); + +void bass_psfilter_init( + BPF_DEC_HANDLE hBPF /* o : BPF data handle */ +); + +void bass_psfilter( + BPF_DEC_HANDLE hBPF, /* o : BPF data handle */ + const int16_t Opt_AMR_WB, /* i : AMR-WB IO flag */ + const float synth_in[], /* i : synthesis (at 16kHz) */ + const int16_t L_frame, /* i : length of the last frame */ + const float pitch_buf[], /* i : pitch for every subfr [0,1,2,3] */ + const int16_t bpf_off, /* i : do not use BPF when set to 1 */ + float v_stab, /* i : stability factor */ + float *v_stab_smooth, /* i : smoothed stability factor */ + const int16_t coder_type, /* i : coder_type */ + float bpf_noise_buf[] /* o : BPF error signal (at int_fs) */ +); + +void CNG_reset_dec( + Decoder_State *st, /* i/o: decoder state structure */ + float *pitch_buf, /* o : floating pitch for each subframe */ + float *voice_factors /* o : voicing factors */ +); + +void updt_dec( + Decoder_State *st, /* i/o: state structure */ + const float *old_exc, /* i : buffer of excitation */ + const float *pitch_buf, /* i : floating pitch values for each subframe */ + const float Es_pred, /* i : predicited scaled innovation energy */ + const float *Aq, /* i : A(z) quantized for all subframes */ + const float *lsf_new, /* i : current frame LSF vector */ + const float *lsp_new, /* i : current frame LSP vector */ + const float voice_factors[], /* i : voicing factors */ + const float *old_bwe_exc, /* i : buffer of excitation */ + const float *gain_buf /* o : floating pitch gain for each subframe */ +); + +void updt_IO_switch_dec( + const int16_t output_frame, /* i : output frame length */ + Decoder_State *st /* i/o: state structure */ +); + +void updt_dec_common( + Decoder_State *st, /* i/o: decoder state structure */ + const int16_t hq_core_type, /* i : HQ core type */ + const int16_t concealWholeFrameTmp, /* i : concealWholeFrameTmp flag */ + const float *synth /* i : decoded synthesis */ +); + +void td_cng_dec_init( + DEC_CORE_HANDLE st /* i/o: decoder state structure */ +); + +void CNG_dec( + Decoder_State *st, /* i/o: State structure */ + const int16_t last_element_mode, /* i : last element mode */ + float Aq[], /* o : LP coefficients */ + float *lsp_new, /* i/o: current frame LSPs */ + float *lsf_new, /* i/o: current frame LSFs */ + int16_t *allow_cn_step, /* o : allow cn step */ + int16_t *sid_bw, /* o : 0-NB/WB, 1-SWB SID */ + float *q_env ); + +void swb_CNG_dec( + Decoder_State *st, /* i/o: State structure */ + const float *synth, /* i : ACELP core synthesis at 32kHz */ + float *shb_synth, /* o : high-band CNG synthesis */ + const int16_t sid_bw /* i : 0-NB/WB, 1-SWB SID */ +); + +void lsf_dec( + Decoder_State *st, /* i/o: State structure */ + const int16_t tc_subfr, /* i : TC subframe index */ + float *Aq, /* o : quantized A(z) for 4 subframes */ + int16_t *LSF_Q_prediction, /* o : LSF prediction mode */ + float *lsf_new, /* o : de-quantized LSF vector */ + float *lsp_new, /* o : de-quantized LSP vector */ + float *lsp_mid, /* o : de-quantized mid-frame LSP vector */ + const int16_t tdm_low_rate_mode, /* i : secondary channel low rate mode flag */ + const float tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel */ +); + +void isf_dec_amr_wb( + Decoder_State *st, /* i/o: State structure */ + float *Aq, /* o : quantized A(z) for 4 subframes */ + float *isf_new, /* o : de-quantized ISF vector */ + float *isp_new /* o : de-quantized ISP vector */ +); + +void Es_pred_dec( + float *Es_pred, /* o : predicted scaled innovation energy */ + const int16_t enr_idx, /* i : indice */ + const int16_t nb_bits, /* i : number of bits */ + const int16_t no_ltp /* i : no LTP flag */ +); + +void gaus_dec( + Decoder_State *st, /* i/o: decoder state structure */ + const int16_t i_subfr, /* i : subframe index */ + float *code, /* o : gaussian excitation */ + float *norm_gain_code, /* o : gain of the normalized gaussian excitation */ + float *lp_gainp, /* i/o: lp filtered pitch gain(FER) */ + float *lp_gainc, /* i/o: lp filtered code gain (FER) */ + float *gain_inov, /* o : unscaled innovation gain */ + float *tilt_code, /* o : synthesis excitation spectrum tilt */ + float *voice_fac, /* o : estimated voicing factor */ + float *gain_pit, /* o : reset pitch gain */ + float *pt_pitch, /* o : reset floating pitch buffer */ + float *exc, /* o : excitation signal frame */ + float *gain_code, /* o : gain of the gaussian excitation */ + float *exc2 /* o : scaled excitation signal frame */ +); + +void gain_dec_amr_wb( + Decoder_State *st, /* i/o: decoder state structure */ + const int32_t core_brate, /* i : core bitrate */ + float *gain_pit, /* o : Quantized pitch gain */ + float *gain_code, /* o : Quantized codeebook gain */ + float *past_qua_en, /* i/o: gain quantization memory (4 words) */ + float *gain_inov, /* o : unscaled innovation gain */ + const float *code, /* i : algebraic code excitation */ + float *norm_gain_code /* o : norm. gain of the codebook excitation */ +); + +void gain_dec_lbr( + Decoder_State *st, /* i/o: decoder state structure */ + const int16_t coder_type, /* i : coding type */ + const int16_t i_subfr, /* i : subframe index */ + const float *code, /* i : algebraic excitation */ + float *gain_pit, /* o : quantized pitch gain */ + float *gain_code, /* o : quantized codebook gain */ + float *gain_inov, /* o : gain of the innovation (used for normalization) */ + float *norm_gain_code, /* o : norm. gain of the codebook excitation */ + float gains_mem[], /* i/o: pitch gain and code gain from previous subframes */ + const int16_t L_subfr /* i : subframe length */ +); + +void gain_dec_mless( + Decoder_State *st, /* i/o: decoder state structure */ + const int16_t L_frame, /* i : length of the frame */ + const int16_t coder_type, /* i : coding type */ + const int16_t i_subfr, /* i : subframe number */ + const int16_t tc_subfr, /* i : TC subframe index */ + const float *code, /* i : algebraic code excitation */ + const float Es_pred, /* i : predicted scaled innov. energy */ + float *gain_pit, /* o : Quantized pitch gain */ + float *gain_code, /* o : Quantized codeebook gain */ + float *gain_inov, /* o : unscaled innovation gain */ + float *norm_gain_code /* o : norm. gain of the codebook excitation */ +); + +void gain_dec_SQ( + Decoder_State *st, /* i/o: decoder state structure */ + const int16_t i_subfr, /* i : subframe number */ + const float *code, /* i : algebraic code excitation */ + const float Es_pred, /* i : predicted scaled innov. energy */ + float *gain_pit, /* o : Quantized pitch gain */ + float *gain_code, /* o : Quantized codeebook gain */ + float *gain_inov, /* o : unscaled innovation gain */ + float *norm_gain_code /* o : norm. gain of the codebook excitation */ +); + +/*! r: quantized codebook gain */ +float gain_dec_gaus( + const int16_t index, /* i : quantization index */ + const int16_t bits, /* i : number of bits to quantize */ + const float lowBound, /* i : lower bound of quantizer (dB) */ + const float topBound, /* i : upper bound of quantizer (dB) */ + const float gain_inov, /* i : unscaled innovation gain */ + float *norm_gain_code /* o : gain of normalized gaus. excit. */ +); + +/*! r: floating pitch value */ +float pit_decode( + Decoder_State *st, /* i/o: decoder state structure */ + const int32_t core_brate, /* i : core bitrate */ + const int16_t Opt_AMR_WB, /* i : flag indicating AMR-WB IO mode */ + const int16_t L_frame, /* i : length of the frame */ + int16_t i_subfr, /* i : subframe index */ + const int16_t coder_type, /* i : coding type */ + int16_t *limit_flag, /* i/o: restrained(0) or extended(1) Q limits */ + int16_t *T0, /* o : close loop integer pitch */ + int16_t *T0_frac, /* o : close loop fractional part of the pitch */ + int16_t *T0_min, /* i/o: delta search min for sf 2 & 4 */ + int16_t *T0_max, /* i/o: delta search max for sf 2 & 4 */ + const int16_t L_subfr, /* i : subframe length */ + const int16_t tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag */ + const float tdm_Pri_pitch_buf[] /* i : primary channel pitch buffer */ +); + +void abs_pit_dec( + const int16_t fr_steps, /* i : fractional resolution steps (0, 2, 4) */ + int16_t pitch_index, /* i : pitch index */ + const int16_t limit_flag, /* i : restrained(0) or extended(1) Q limits */ + int16_t *T0, /* o : integer pitch lag */ + int16_t *T0_frac /* o : pitch fraction */ +); + +void delta_pit_dec( + const int16_t fr_steps, /* i : fractional resolution steps (0, 2, 4) */ + const int16_t pitch_index, /* i : pitch index */ + int16_t *T0, /* o : integer pitch lag */ + int16_t *T0_frac, /* o : pitch fraction */ + const int16_t T0_min /* i : delta search min */ +); + +void pit_Q_dec( + const int16_t Opt_AMR_WB, /* i : flag indicating AMR-WB IO mode */ + const int16_t pitch_index, /* i : pitch index */ + const int16_t nBits, /* i : # of Q bits */ + const int16_t delta, /* i : Half the CL searched interval */ + const int16_t pit_flag, /* i : absolute(0) or delta(1) pitch Q */ + const int16_t limit_flag, /* i : restrained(0) or extended(1) Q limits */ + int16_t *T0, /* o : integer pitch lag */ + int16_t *T0_frac, /* o : pitch fraction */ + int16_t *T0_min, /* i/o: delta search min */ + int16_t *T0_max, /* i/o: delta search max */ + int16_t *BER_detect /* o : BER detect flag */ +); + +void pit16k_Q_dec( + const int16_t pitch_index, /* i : pitch index */ + const int16_t nBits, /* i : # of Q bits */ + const int16_t limit_flag, /* i : restrained(0) or extended(1) Q limits */ + int16_t *T0, /* o : integer pitch lag */ + int16_t *T0_frac, /* o : pitch fraction */ + int16_t *T0_min, /* i/o: delta search min */ + int16_t *T0_max, /* i/o: delta search max */ + int16_t *BER_detect /* o : BER detect flag */ +); + +void lp_filt_exc_dec( + Decoder_State *st, /* i/o: decoder state structure */ + const int16_t codec_mode, /* i : codec mode */ + const int16_t i_subfr, /* i : subframe index */ + const int16_t L_subfr, /* i : subframe size */ + const int16_t L_Frame, /* i : frame size */ + int16_t lp_flag, /* i : operation mode signaling */ + float *exc /* i/o: pointer to the excitation signal frame */ +); + +void inov_decode( + Decoder_State *st, /* i/o: decoder state structure */ + const int32_t core_brate, /* i : core bitrate */ + const int16_t Opt_AMR_WB, /* i : flag indicating AMR-WB IO mode */ + const int16_t L_frame, /* i : length of the frame */ + const int16_t sharpFlag, /* i : formant sharpening flag */ + const int16_t i_subfr, /* i : subframe index */ + const float *p_Aq, /* i : LP filter coefficients */ + const float tilt_code, /* i : tilt of of the excitation of previous subframe */ + const float pt_pitch, /* i : pointer to current subframe fractional pitch */ + float *code, /* o : algebraic excitation */ + const int16_t L_subfr /* i : subframe length */ +); + +void dec_acelp_1t64( + Decoder_State *st, /* i/o: decoder state structure */ + float code[], /* o : algebraic (fixed) codebook excitation */ + const int16_t L_subfr /* i : subframe length */ +); + +void dec_acelp_2t32( + Decoder_State *st, /* i/o: decoder state structure */ + float code[] /* o : algebraic (fixed) codebook excitation */ +); + +void dec_acelp_4t64( + Decoder_State *st, /* i/o: decoder state structure */ + int16_t nbbits, /* i : number of bits per codebook */ + float code[], /* o : algebraic (fixed) codebook excitation */ + const int16_t Opt_AMR_WB /* i : flag indicating AMR-WB IO mode */ +); + +uint32_t syn_output( + float *synth, /* i/o: float synthesis signal */ + const int16_t output_frame, /* i : output frame length */ + int16_t *synth_out /* o : integer 16 bits synthesis signal */ +); + +void FEC_exc_estim( + Decoder_State *st, /* i/o: Decoder static memory */ + const int16_t L_frame, /* i : length of the frame */ + float *old_exc, /* i/o: excitation buffer */ + float *exc2, /* o : excitation buffer (for synthesis) */ + float *exc_dct_in, /* o : GSC excitation in DCT domain */ + float *pitch_buf, /* o : Floating pitch for each subframe */ + float *tmp_tc, /* o : FEC pitch */ + float *voice_factors, /* o : voicing factors */ + float *bwe_exc, /* i/o: excitation for SWB TBE */ + float *lsf_new, /* i : ISFs at the end of the frame */ + float *tmp_noise /* o : long-term noise energy */ +); + +void FEC_lsf2lsp_interp( + Decoder_State *st, /* i/o: Decoder static memory */ + const int16_t L_frame, /* i : length of the frame */ + float *Aq, /* o : calculated A(z) for 4 subframes */ + float *lsf, /* o : estimated LSF vector */ + float *lsp /* o : estimated LSP vector */ +); + +void FEC_lsf_estim_enc( + Encoder_State *st, /* i : Encoder static memory */ + float *lsf /* o : estimated LSF vector */ +); + +float frame_energy( + const int16_t L_frame, /* i : length of the frame */ + const float *pitch, /* i : pitch values for each subframe */ + const float *speech, /* i : pointer to speech signal for E computation */ + const float lp_speech, /* i : long term active speech energy average */ + float *frame_ener /* o : pitch-synchronous energy at frame end */ +); + +void FEC_SinOnset( + float *exc, /* i/o: exc vector to modify */ + int16_t puls_pos, /* i : Last pulse position desired */ + int16_t T0, /* i : decoded first frame pitch */ + float enr_q, /* i : energy provided by the encoder */ + float *Aq, /* i : Lsp coefficient */ + const int16_t L_frame /* i : Frame length */ +); + +int16_t FEC_enhACB( + const int16_t L_frame, /* i : Frame length */ + const int16_t last_L_frame, /* i : frame length of last frame */ + float *exc_io, /* i/o: Adaptive codebook memory */ + const int16_t new_pit, /* i : decoded first frame pitch */ + const int16_t puls_pos, /* i : decoder position of the last glottal pulses decoded in the previous frame */ + const float bfi_pitch /* i : Pitch used for concealment */ +); + +void FEC_scale_syn( + const int16_t L_frame, /* i : length of the frame */ + int16_t clas, /* i/o: frame classification */ + const int16_t last_good, /* i : last good frame classification */ + float *synth, /* i/o: synthesized speech at Fs = 12k8 Hz */ + const float *pitch, /* i : pitch values for each subframe */ + float enr_old, /* i : energy at the end of prvious frame */ + float enr_q, /* i : transmitted energy for current frame */ + const int16_t coder_type, /* i : coding type */ + const int16_t LSF_Q_prediction, /* i : LSF prediction mode */ + int16_t *scaling_flag, /* i/o: flag to indicate energy control of syn */ + float *lp_ener_FEC_av, /* i/o: averaged voiced signal energy */ + float *lp_ener_FEC_max, /* i/o: averaged voiced signal energy */ + const int16_t bfi, /* i : current frame BFI */ + const int32_t total_brate, /* i : total bitrate */ + const int16_t prev_bfi, /* i : previous frame BFI */ + const int32_t last_core_brate, /* i : previous frame core bitrate */ + float *exc, /* i/o: excitation signal without enhancement */ + float *exc2, /* i/o: excitation signal with enhancement */ + const float Aq[], /* i : LP filter coefs */ + float *old_enr_LP, /* i/o: LP filter E of last good voiced frame */ + const float *mem_tmp, /* i : temp. initial synthesis filter states */ + float *mem_syn, /* o : initial synthesis filter states */ + const int16_t avoid_lpc_burst_on_recovery, /* i : if true the excitation energy is limited if LP has big gain */ + const int16_t force_scaling /* i : force scaling */ +); + +void FEC_pitch_estim( + const int16_t Opt_AMR_WB, /* i : flag indicating AMR-WB IO mode */ + const int16_t last_core, /* i : last core */ + const int16_t L_frame, /* i : length of the frame */ + const int16_t clas, /* i : current frame classification */ + const int16_t last_good, /* i : last good clas information */ + const float pitch_buf[], /* i : Floating pitch for each subframe */ + const float old_pitch_buf[], /* i : buffer of old subframe pitch values */ + float *bfi_pitch, /* i/o: update of the estimated pitch for FEC */ + int16_t *bfi_pitch_frame, /* o : frame length when pitch was updated */ + int16_t *upd_cnt, /* i/o: update counter */ + const int16_t coder_type ); + +void FEC_encode( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const ACELP_config acelp_cfg, /* i : configuration of the ACELP */ + const float *synth, /* i : pointer to synthesized speech for E computation */ + const int16_t coder_type, /* i : type of coder */ + int16_t clas, /* i : signal clas for current frame */ + const float *fpit, /* i : close loop fractional pitch buffer */ + const float *res, /* i : LP residual signal frame */ + int16_t *last_pulse_pos, /* i/o: Position of the last pulse */ + const int16_t L_frame, /* i : Frame length */ + const int32_t total_brate /* i : total codec bitrate */ +); + +int16_t FEC_pos_dec( + Decoder_State *st, /* i/o: decoder state structure */ + int16_t *last_pulse_pos, /* o : Last glottal pulse position in the lost ACB */ + float *enr_q, /* o : Decoded energy */ + const int16_t nBits_es_Pred /* i : number of bits for Es_pred Q */ +); + +void improv_amr_wb_gs( + const int16_t clas, /* i : bitrate allocated to the core */ + const int16_t coder_type, /* i : coder_type */ + const int32_t core_brate, /* i : bitrate allocated to the core */ + int16_t *seed_tcx, /* i/o: Seed used for noise generation */ + float *old_Aq, /* i/o: old LPC filter coefficient */ + float *mem_syn2, /* i/o: synthesis memory */ + const float lt_voice_fac, /* i/o: long term voice factor */ + const int16_t locattack, /* i : Flag for a detected attack */ + float *Aq, /* i/o: Decoded LP filter coefficient */ + float *exc2, /* i/o: Decoded complete excitation */ + float *mem_tmp, /* i/o: synthesis temporary memory */ + float *syn, /* i/o: Decoded synthesis to be updated */ + const float *pitch_buf, /* i : Decoded pitch buffer */ + const float Last_ener, /* i : Last energy */ + const int16_t rate_switching_reset, /* i : rate switching reset flag */ + const int16_t last_coder_type, /* i : Last coder_type */ + const int16_t VeryLowRateSTflag /* i : Enable the noise enhancement for very low rate stereo generic mode */ +); + +int16_t tc_classif( + Decoder_State *st /* i/o: decoder state structure */ +); + +void transition_dec( + Decoder_State *st, /* i/o: decoder state structure */ + const int16_t L_frame, /* i : length of the frame */ + const int16_t i_subfr, /* i : subframe index */ + const int16_t tc_subfr, /* i : TC subframe index */ + int16_t *Jopt_flag, /* i : joint optimization flag */ + float *exc, /* i/o: current frame excitation signal */ + int16_t *T0, /* o : close loop integer pitch */ + int16_t *T0_frac, /* o : close loop fractional part of the pitch */ + int16_t *T0_min, /* i/o: delta search min for sf 2 & 4 */ + int16_t *T0_max, /* i/o: delta search max for sf 2 & 4 */ + float **pt_pitch, /* o : floating pitch values */ + int16_t *position, /* i/o: first glottal impulse position in frame */ + float *bwe_exc /* i/o: excitation for SWB TBE */ +); + +void gain_dec_tc( + Decoder_State *st, /* i/o: decoder state structure */ + const int16_t i_subfr, /* i : subframe number */ + const float Es_pred, /* i : predicted scaled innov. energy */ + const float *code, /* i : algebraic code excitation */ + float *gain_pit, /* o : pitch gain */ + float *gain_code, /* o : Quantized codeebook gain */ + float *gain_inov, /* o : unscaled innovation gain */ + float *norm_gain_code /* o : norm. gain of the codebook excit. */ +); + +void stat_noise_uv_dec( + Decoder_State *st, /* i/o: decoder static memory */ + const float *lsp_new, /* i : end-frame LSP vector */ + const float *lsp_mid, /* i : mid-frame LSP vector */ + float *Aq, /* o : A(z) quantized for the 4 subframes */ + float *exc2, /* i/o: excitation buffer */ + const int16_t uc_two_stage_flag /* 1 : flag undicating two-stage UC */ +); + +void sc_vbr_dec_init( + SC_VBR_DEC_HANDLE hSC_VBR /* i/o: SC-VBR decoder handle */ +); + +void decod_nelp( + Decoder_State *st, /* i/o: decoder static memory */ + float *tmp_noise, /* o : long term temporary noise energy */ + float *pitch_buf, /* o : floating pitch values for each subframe */ + float *exc, /* o : adapt. excitation exc */ + float *exc2, /* o : adapt. excitation/total exc */ + float *voice_factors, /* o : voicing factors */ + float *bwe_exc, /* o : excitation for SWB TBE */ + const int16_t bfi, /* i : bad frame indicator */ + float *gain_buf /* o : floating pitch gain for each subframe */ +); + +void nelp_decoder( + Decoder_State *st, /* i/o: decoder static memory */ + float *exc_nelp, /* o : adapt. excitation/total exc */ + float *exc, /* o : adapt. excitation exc */ + int16_t bfi, /* i : frame error rate */ + const int16_t coder_type, /* i : coding type */ + float *gain_buf /* o : floating pitch gain for each subframe */ +); + +ivas_error decod_ppp( + Decoder_State *st, /* i/o: state structure */ + const float Aq[], /* i : 12k8 Lp coefficient */ + float *pitch_buf, /* i/o: floating pitch values for each subframe */ + float *exc, /* i/o: current non-enhanced excitation */ + float *exc2, /* i/o: current enhanced excitation */ + float *voice_factors, /* o : voicing factors */ + float *bwe_exc, /* o : excitation for SWB TBE */ + float *gain_buf, /* o : floating pitch gain for each subframe */ + const int16_t bfi /* i : BFI flag */ +); + +ivas_error ppp_quarter_decoder( + Decoder_State *st, /* i/o: decoder state structure */ + DTFS_STRUCTURE *CURRCW_Q_DTFS, /* i/o: Current CW DTFS */ + int16_t prevCW_lag, /* i : Previous lag */ + float *lastLgainD, /* i/o: Last gain lowband */ + float *lastHgainD, /* i/o: Last gain highwband */ + float *lasterbD, /* i/o: Last ERB vector */ + int16_t bfi, /* i : FER flag */ + DTFS_STRUCTURE PREV_CW_D /* i : Previous DTFS */ +); + +ivas_error ppp_voiced_decoder( + Decoder_State *st, /* i/o: state structure */ + float *out, /* o : residual signal */ + const float *lpc2, /* i : current frame LPC */ + float *exc, /* i : previous frame excitation */ + float *pitch, /* o : floating pitch values for each subframe */ + const int16_t bfi /* i : BFI flag */ +); + +void AVQ_demuxdec( + Decoder_State *st, /* i/o: decoder state structure */ + int16_t xriq[], /* o : decoded subvectors [0..8*Nsv-1] */ + int16_t *nb_bits, /* i/o: number of allocated bits */ + const int16_t Nsv, /* i : number of subvectors */ + int16_t nq[], /* i/o: AVQ nq index */ + int16_t avq_bit_sFlag, /* i : flag for AVQ bit saving solution*/ + int16_t trgtSvPos /* i : target SV for AVQ bit savings */ +); + +void re8_dec( + int16_t nq, /* i : codebook number (*n is an integer defined in {0,2,3,4,..,n_max}) */ + const uint16_t I, /* i : index of c (pointer to unsigned 16-bit word) */ + const int16_t kv[], /* i : index of v (8-dimensional vector of binary indices) = Voronoi index */ + int16_t y[] /* o : point in RE8 (8-dimensional integer vector) */ +); + +void re8_decode_base_index( + const int16_t n, /* i : codebook number (*n is an integer defined in {0,2,3,4,..,n_max}) */ + uint16_t I, /* i : index of c (pointer to unsigned 16-bit word) */ + int16_t *x /* o : point in RE8 (8-dimensional integer vector) */ +); + +void Init_post_filter( + PFSTAT_HANDLE hPFstat /* i : post-filter state memories */ +); + +void nb_post_filt( + const int16_t L_frame, /* i : frame length */ + const int16_t L_subfr, /* i : sub-frame length */ + PFSTAT_HANDLE hPFstat, /* i/o: Post filter related memories */ + float *lp_noise, /* i/o: long term noise energy */ + const float tmp_noise, /* i : noise energy */ + float *synth, /* i/o: synthesis */ + const float *Aq, /* i : LP filter coefficient */ + const float *pitch_buf, /* i : Floating pitch for each subframe */ + const int16_t coder_type, /* i : coder_type -> deactivated in AUDIO */ + const int16_t BER_detect, /* i : BER detect flag */ + const int16_t disable_hpf /* i : flag to diabled HPF */ +); + +void decod_unvoiced( + Decoder_State *st, /* i/o: decoder static memory */ + const float *Aq, /* i : LP filter coefficient */ + const float Es_pred, /* i : predicted scaled innov. energy */ + const int16_t uc_two_stage_flag, /* i : flag indicating two-stage UC */ + float *tmp_noise, /* o : long term temporary noise energy */ + float *pitch_buf, /* o : floating pitch values for each subframe */ + float *voice_factors, /* o : voicing factors */ + float *exc, /* o : adapt. excitation exc */ + float *exc2, /* o : adapt. excitation/total exc */ + float *bwe_exc, /* i/o: excitation for SWB TBE */ + float *gain_buf /* o : floating pitch gain for each subfram */ +); + +void decod_tran( + Decoder_State *st, /* i/o: decoder static memory */ + const int16_t L_frame, /* i : length of the frame */ + const int16_t tc_subfr, /* i : TC subframe index */ + const float *Aq, /* i : LP filter coefficient */ + const float Es_pred, /* i : predicted scaled innov. energy */ + float *pitch_buf, /* o : floating pitch values for each subframe */ + float *voice_factors, /* o : voicing factors */ + float *exc, /* i/o: adapt. excitation exc */ + float *exc2, /* i/o: adapt. excitation/total exc */ + float *bwe_exc, /* i/o: excitation for SWB TBE */ + int16_t *unbits, /* i/o: number of unused bits */ + const int16_t sharpFlag, /* i : formant sharpening flag */ + float *gain_buf /* o : floating pitch gain for each subframe */ +); + +ivas_error decod_gen_voic( + Decoder_State *st, /* i/o: decoder static memory */ + const int16_t L_frame, /* i : length of the frame */ + const int16_t sharpFlag, /* i : formant sharpening flag */ + const float *Aq, /* i : LP filter coefficient */ + const float Es_pred, /* i : predicted scaled innov. energy */ + const int16_t do_WI, /* i : FEC fast recovery flag */ + float *pitch_buf, /* o : floating pitch for each subframe */ + float *voice_factors, /* o : voicing factors */ + float *exc, /* i/o: adapt. excitation exc */ + float *exc2, /* i/o: adapt. excitation/total exc */ + float *bwe_exc, /* i/o: excitation for SWB TBE */ + int16_t *unbits, /* i/o: number of unused bits */ + float *gain_buf, /* o : floating pitch gain for each subframe */ + const int16_t tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag */ + const float tdm_Pri_pitch_buf[] /* i : primary channel pitch buffer */ +); + +void decod_amr_wb( + Decoder_State *st, /* i/o: decoder static memory */ + const float *Aq, /* i : LP filter coefficients */ + float *pitch_buf, /* o : floating pitch values for each subframe */ + float *exc, /* i/o: adapt. excitation exc */ + float *exc2, /* i/o: adapt. excitation/total exc */ + int16_t hf_gain[NB_SUBFR], /* o : decoded HF gain */ + float *voice_factors, /* o : voicing factors */ + float *gain_buf /* o : floating pitch gain for each subframe */ +); + +ivas_error init_decoder( + Decoder_State *st, /* o : Decoder static variables structure */ + const int16_t idchan, /* i : channel ID */ + const MC_MODE mc_mode /* i : MC mode */ +); + +void destroy_cldfb_decoder( + Decoder_State *st /* o : Decoder static variables structure */ +); + +void HQ_core_dec_init( + HQ_DEC_HANDLE hHQ_core /* i/o: HQ core data handle */ +); + +void HQ_nbfec_init( + HQ_NBFEC_HANDLE hHQ_nbfec /* i/o: HQ NB FEC data handle */ +); + +ivas_error evs_dec( + Decoder_State *st, /* i/o: Decoder state structure */ + float mem_hp20_out[L_HP20_MEM], /* i/o: HP filter memory for synthesis */ + float *output, /* o : output synthesis signal */ + FRAME_MODE frameMode /* i : Decoder frame mode */ +); + +void get_next_frame_parameters( + Decoder_State *st /* i/o: Decoder state structure */ +); + +ivas_error amr_wb_dec( + Decoder_State *st, /* i/o: decoder state structure */ + float mem_hp20_out[L_HP20_MEM], /* i/o: HP filter memory for synthesis */ + float *output /* o : synthesis output */ +); + +void transf_cdbk_dec( + Decoder_State *st, /* i/o: decoder state structure */ + const int16_t harm_flag_acelp, /* i : harmonic flag for higher rates ACELP */ + const int16_t i_subfr, /* i : subframe index */ + const float Es_pred, /* i : predicited scaled innovation energy */ + const float gain_code, /* i : innovative excitation gain */ + float *gain_preQ, /* o : prequantizer excitation gain */ + float *norm_gain_preQ, /* o : normalized prequantizer excitation gain */ + float code_preQ[], /* o : prequantizer excitation */ + int16_t *unbits /* o : number of AVQ unused bits */ +); + +/*! r: decoded gain */ +float gain_dequant( + int16_t index, /* i : quantization index */ + const float min_val, /* i : value of lower limit */ + const float max_val, /* i : value of upper limit */ + const int16_t bits /* i : number of bits to dequantize */ +); + +void HQ_core_enc_init( + HQ_ENC_HANDLE hHQ_core /* i/o: HQ core data handle */ +); + +void hq_core_enc( + Encoder_State *st, /* i/o: encoder state structure */ + const float *audio, /* i : input audio signal */ + const int16_t input_frame, /* i : frame length */ + const int16_t hq_core_type, /* i : HQ core type */ + const int16_t Voicing_flag, /* i : Voicing flag for FER method selection */ + const int16_t vad_hover_flag /* i : VAD hangover flag */ +); + +int16_t detect_transient( + Encoder_State *st, /* i/o: encoder state structure */ + const float *in, /* i : input signal */ + const int16_t L /* i : length */ +); + +void wtda( + const float *new_audio, /* i : input audio */ + float *wtda_audio, /* o : windowed audio */ + float *old_wtda, /* i/o: windowed audio from previous frame */ + const int16_t left_mode, /* i : window overlap of previous frame (0: full, 2: none, or 3: half) */ + const int16_t right_mode, /* i : window overlap of current frame (0: full, 2: none, or 3: half) */ + const int16_t L /* i : length */ +); + +void wtda_ext( + const float *new_audio, /* i : input audio */ + float *wtda_audio, /* o : windowed audio */ + const int16_t left_mode, /* i : window overlap of previous frame (0: full, 2: none, or 3: half) */ + const int16_t right_mode, /* i : window overlap of current frame (0: full, 2: none, or 3: half) */ + const int16_t L, /* i : length */ + const uint16_t kernel_type /* i : transform kernel type (0 - 3) */ +); + +void tcx_get_windows_mode1( + const int16_t left_mode, /* i : overlap mode of left window half */ + const int16_t right_mode, /* i : overlap mode of right window half */ + float *left_win, /* o : left overlap window */ + float *right_win, /* o : right overlap window */ + float *left_win_int, /* o : left overlap window */ + float *right_win_int, /* o : right overlap window */ + const int16_t L /* i : length */ +); + +void direct_transform( + const float *in32, /* i : input signal */ + float *out32, /* o : output transformation */ + const int16_t is_transient, /* i : transient flag */ + const int16_t L, /* i : length */ + const int16_t element_mode /* i : IVAS element mode */ +); + +/*! r: index of noise attenuation */ +int16_t noise_adjust( + const float *coeffs_norm, /* i : normalized coefficients */ + const int16_t *bitalloc, /* i : bit allocation */ + const int16_t *sfm_start, /* i : Start of bands */ + const int16_t *sfm_end, /* i : End of bands */ + const int16_t core_sfm /* i : index of the end band for core */ +); + +void interleave_spectrum( + float *coefs, /* i/o: input and output coefficients */ + const int16_t length /* i : length of spectrum */ +); + +void hq_hr_enc( + Encoder_State *st, /* i/o: encoder state structure */ + float *coefs, /* i/o: transform-domain coefficients */ + const int16_t length, /* i : length of spectrum */ + int16_t *num_bits, /* i/o: number of available bits */ + const int16_t is_transient, /* i : transient flag */ + const int16_t vad_hover_flag /* i : VAD hangover flag */ +); + +void logqnorm( + const float *x, /* i : coefficient vector */ + int16_t *k, /* o : index */ + const int16_t L, /* i : codebook length */ + const int16_t N, /* i : sub-vector size */ + const float *thren ); + +void huff_dec( + Decoder_State *st, /* i/o: decoder state structure */ + const int16_t N, /* i : Number of codewords to decode */ + const int16_t buffer_len, /* i : Number of bits to read */ + const int16_t num_lengths, /* i : Number of different huffman codeword lengths */ + const int16_t *thres, /* i : Threshold of first codeword of each length */ + const int16_t *offset, /* i : Offset for first codeword */ + const int16_t *huff_tab, /* i : Huffman table order by codeword lengths */ + int16_t *index /* o : Decoded index */ +); + +void calc_norm( + const float *x, /* i : Input vector. */ + int16_t *norm, /* o : Quantization indices for norms */ + int16_t *normlg, /* o : Quantized norms in log2 */ + const int16_t start_band, /* i : Indice of band to start coding */ + const int16_t num_bands, /* i : Number of bands */ + const int16_t *band_len, /* i : Length of bands */ + const int16_t *band_start /* i : Start of bands */ +); + +void reordernorm( + const int16_t *ynrm, /* i : quantization indices for norms */ + const int16_t *normqlg2, /* i : quantized norms */ + int16_t *idxbuf, /* o : reordered quantization indices */ + int16_t *normbuf, /* o : reordered quantized norms */ + const int16_t nb_sfm /* i : number of bands */ +); + +void diffcod( + const int16_t N, /* i : number of sub-vectors */ + int16_t *y, /* i/o: indices of quantized norms */ + int16_t *difidx /* o : differential code */ +); + +void diffcod_lrmdct( + const int16_t N, /* i : number of sub-vectors */ + const int16_t be_ref, /* i : band energy reference */ + int16_t *y, /* i/o: indices of quantized norms */ + int16_t *difidx, /* o : differential code */ + const int16_t is_transient /* i : transient flag */ +); + +void normalizecoefs( + float *coefs, /* i/o: MDCT coefficients */ + const int16_t *ynrm, /* i : quantization indices for norms */ + const int16_t num_bands, /* i : Number of bands */ + const int16_t *band_start, /* i : Start of bands */ + const int16_t *band_end /* i : End of bands */ +); + +void bitallocsum( + int16_t *R, /* i : bit-allocation vector */ + const int16_t nb_sfm, /* i : number of sub-vectors */ + int16_t *sum, /* o : total number of bits allocated */ + int16_t *Rsubband, /* o : rate per subband (Q3) */ + const int16_t num_bits, /* i : number of bits */ + const int16_t length, /* i : length of spectrum */ + const int16_t *sfmsize /* i : Length of bands */ +); + +void hq_generic_hf_encoding( + const float *coefs, /* i : MDCT coefficients of weighted original */ + float *hq_generic_fenv, /* i/o: energy of SWB envelope */ + const int16_t hq_generic_offset, /* i : frequency offset for extracting energy */ + Encoder_State *st, /* i/o: encoder state structure */ + int16_t *hq_generic_exc_clas, /* o : HF excitation class */ + const int16_t length /* i : Length of spectrum */ +); + +/*! r: BWE class */ +int16_t swb_bwe_gain_deq( + Decoder_State *st, /* i/o: decoder state structure */ + const int16_t core, /* i : core */ + float *SWB_tenv, /* o : time-domain BWE envelope */ + float *SWB_fenv, /* o : frequency-domain BWE envelope */ + const int16_t hr_flag, /* i : high rate flag */ + const int16_t hqswb_clas /* i : HQ BWE class */ +); + +void save_old_syn( + const int16_t L_frame, /* i : frame length */ + const float syn[], /* i : ACELP synthesis */ + float old_syn[], /* o : old synthesis buffer */ + float old_syn_12k8_16k[], /* i/o: old synthesis buffer */ + const float preemph_fac, /* i : preemphasis factor */ + float *mem_deemph /* i/o: deemphasis filter memory */ +); + +void hq_generic_hf_decoding( + const int16_t HQ_mode, /* i : HQ mode */ + float *coeff_out1, /* i/o: BWE input & temporary buffer */ + const float *hq_generic_fenv, /* i : SWB frequency envelopes */ + float *coeff_out, /* o : SWB signal in MDCT domain */ + const int16_t hq_generic_offset, /* i : frequency offset for representing hq swb bwe*/ + int16_t *prev_L_swb_norm, /* i/o: last normalize length */ + const int16_t hq_swb_bwe_exc_clas, /* i : bwe excitation class */ + const int16_t *R ); + +void hq_core_dec( + Decoder_State *st, /* i/o: decoder state structure */ + float out[], /* o : output synthesis */ + const int16_t output_frame, /* i : output frame length */ + const int16_t hq_core_type, /* i : HQ core type */ + const int16_t core_switching_flag, /* i : ACELP->HQ switching frame flag */ + float *output /* o : LB synthesis in case of ACELP-HQ switch */ +); + +void IMDCT( + float *x, + float *old_syn_overl, + float *syn_Overl_TDAC, + float *xn_buf, + const float *tcx_aldo_window_1_trunc, + const float *tcx_aldo_window_2, + const float *tcx_mdct_window_half, + const float *tcx_mdct_window_minimum, + const float *tcx_mdct_window_trans, + const int16_t tcx_mdct_window_half_length, + const int16_t tcx_mdct_window_min_length, + int16_t index, + const uint16_t kernel_type, /* i : TCX transform kernel type */ + const int16_t left_rect, + const int16_t tcx_offset, + const int16_t overlap, + const int16_t L_frame, + const int16_t L_frameTCX, + const int16_t L_spec_TCX5, + const int16_t L_frame_glob, + const int16_t frame_cnt, + const int16_t bfi, + float *old_out, + const int16_t FB_flag, + Decoder_State *st, + const int16_t fullband, + float *acelp_zir ); + +void hq_hr_dec( + Decoder_State *st, /* i/o: decoder state structure */ + float *t_audio_q, /* o : transform-domain coefficients */ + const int16_t length, /* i : frame length */ + const int16_t num_bits, /* i : number of available bits */ + int16_t *ynrm, /* o : norm quantization index vector */ + int16_t *is_transient, /* o : transient flag */ + int16_t *hqswb_clas, /* o : HQ SWB class */ + float *SWB_fenv, /* o : SWB frequency envelopes */ + const int16_t core_switching_flag /* i : Core switching flag */ + +); + +void hdecnrm_context( + Decoder_State *st, /* i/o: decoder state structure */ + const int16_t N, /* i : number of norms */ + int16_t *index, /* o : indices of quantized norms */ + int16_t *n_length /* o : decoded stream length */ +); + +void hdecnrm_tran( + Decoder_State *st, /* i/o: decoder state structure */ + const int16_t N, /* i : number of norms */ + int16_t *index /* o : indices of quantized norms */ +); + +void hdecnrm_resize( + Decoder_State *st, /* i/o: decoder state structure */ + const int16_t N, /* i : number of SFMs */ + int16_t *index /* o : norm quantization index vector */ +); + +void hdecnrm( + Decoder_State *st, /* i/o: decoder state structure */ + const int16_t N, /* i : number of norms */ + int16_t *index /* o : indices of quantized norms */ +); + +/*! r: index of last band */ +int16_t find_last_band( + const int16_t *bitalloc, /* i : bit allocation */ + const int16_t nb_sfm /* i : number of possibly coded bands */ +); + +void fill_spectrum( + float *coeff, /* i/o: normalized MLT spectrum / nf spectrum */ + int16_t *R, /* i : number of pulses per band */ + const int16_t is_transient, /* i : transient flag */ + int16_t norm[], /* i : quantization indices for norms */ + const float *hq_generic_fenv, /* i : HQ GENERIC envelope */ + const int16_t hq_generic_offset, /* i : HQ GENERIC offset */ + const int16_t nf_idx, /* i : noise fill index */ + const int16_t length, /* i : Length of spectrum (32 or 48 kHz) */ + const float env_stab, /* i : Envelope stability measure [0..1] */ + int16_t *no_att_hangover, /* i/o: Frame counter for attenuation hangover */ + float *energy_lt, /* i/o: Long-term energy measure for transient detection */ + int16_t *bwe_seed, /* i/o: random seed for generating BWE input */ + const int16_t hq_generic_exc_clas, /* i : HF excitation class */ + const int16_t core_sfm, /* i : index of the end band for core */ + int16_t HQ_mode, /* i : HQ mode */ + float noise_level[], /* i : noise level for harmonic modes */ + int32_t core_brate, /* i : target bitrate */ + float prev_noise_level[], /* i/o: noise factor in previous frame */ + int16_t *prev_R, /* i/o: bit allocation info. in previous frame */ + float *prev_coeff_out, /* i/o: decoded spectrum in previous frame */ + const int16_t *peak_idx, /* i : peak positions */ + const int16_t Npeaks, /* i : number of peaks */ + const int16_t *npulses, /* i : Number of assigned pulses per band */ + int16_t prev_is_transient, /* i : previous transient flag */ + float *prev_normq, /* i : previous norms */ + float *prev_env, /* i : previous noise envelopes */ + int16_t prev_bfi, /* i : previous bad frame indicator */ + const int16_t *sfmsize, /* i : Length of bands */ + const int16_t *sfm_start, /* i : Start of bands */ + const int16_t *sfm_end, /* i : End of bands */ + int16_t *prev_L_swb_norm, /* i/o: last normalize length for harmonic mode */ + int16_t prev_hq_mode, /* i : previous HQ mode */ + const int16_t num_sfm, /* i : Number of bands */ + const int16_t num_env_bands, /* i : Number of envelope bands */ + const int16_t element_mode /* i : element mode */ +); + +void env_stab_transient_detect( + const int16_t is_transient, /* i : Transient flag */ + const int16_t length, /* i : Length of spectrum (32 or 48 kHz) */ + const int16_t norm[], /* i : quantization indices for norms */ + int16_t *no_att_hangover, /* i/o: Frame counter for attenuation hangover */ + float *energy_lt, /* i/o: Long-term energy measure for transient detection */ + const int16_t HQ_mode, /* i : HQ coding mode */ + const int16_t bin_th, /* i : HVQ cross-over frequency bin */ + const float *coeff /* i : Coded spectral coefficients */ +); + +void de_interleave_spectrum( + float *coefs, /* i/o: input and output coefficients */ + int16_t length /* i : length of spectrum */ +); + +void inverse_transform( + const float *InMDCT, /* i : input MDCT vector */ + float *Out, /* o : output vector */ + const int16_t IsTransient, /* i : transient flag */ + const int16_t L, /* i : output frame length */ + const int16_t L_inner, /* i : length of the transform */ + const int16_t element_mode /* i : IVAS element mode */ +); + +void window_ola( + const float *ImdctOut, /* i : input */ + float *auOut, /* o : output audio */ + float *OldauOut, /* i/o: audio from previous frame */ + const int16_t L, /* i : length */ + const int16_t right_mode, + const int16_t left_mode, /* i : window overlap of current frame (0: full, 2: none, or 3: half) */ + const int16_t use_bfi_win, /* i : use BFI windowing */ + const int16_t oldHqVoicing, /* i : previous HqVoicing */ + float *oldgapsynth /* i : previous gapsynth */ +); + +void window_ola_ext( + const float *ImdstOut, /* i : input */ + float *auOut, /* o : output audio */ + float *OldauOut, /* i/o: audio from previous frame */ + const int16_t L, /* i : length */ + const int16_t right_mode, + const int16_t left_mode, /* i : window overlap of current frame (0: full, 2: none, or 3: half) */ + const uint16_t kernel_type /* i : transform kernel type */ +); + +void map_quant_weight( + const int16_t normqlg2[], /* i : quantized norms */ + int16_t wnorm[], /* o : weighted norm */ + const int16_t is_transient /* i : transient flag */ +); + +void recovernorm( + const int16_t *const idxbuf, /* i : reordered quantization indices */ + int16_t *ynrm, /* o : recovered quantization indices */ + int16_t *normqlg2, /* o : recovered quantized norms */ + const int16_t nb_sfm /* i : number of subbands */ +); + +void reordvct( + int16_t *y, /* i/o: vector to rearrange */ + const int16_t N, /* i : dimensions */ + int16_t *idx /* o : reordered vector index */ +); + +void bitalloc( + int16_t *y, /* i : reordered norm of sub-vectors */ + int16_t *idx, /* i : reordered sub-vector indices */ + int16_t sum, /* i : number of available bits */ + int16_t N, /* i : number of norms */ + int16_t K, /* i : maximum number of bits per dimension */ + int16_t *r, /* o : bit-allacation vector */ + const int16_t *sfmsize, /* i : Length of bands */ + const int16_t hqswb_clas /* i : signal classification flag */ +); + +/*! r: Integer (truncated) number of allocated bits */ +int16_t BitAllocF( + int16_t *y, /* i : norm of sub-vectors */ + int32_t bit_rate, /* i : bitrate */ + int16_t B, /* i : number of available bits */ + int16_t N, /* i : number of sub-vectors */ + int16_t *R, /* o : bit-allocation indicator */ + int16_t *Rsubband, /* o : sub-band bit-allocation vector (Q3) */ + const int16_t hqswb_clas, /* i : hq swb class */ + const int16_t num_env_bands /* i : Number sub bands to be encoded for HQ_SWB_BWE */ +); + +/*! r: Integer (truncated) number of allocated bits */ +int16_t BitAllocWB( + int16_t *y, /* i : norm of sub-vectors */ + int16_t B, /* i : number of available bits */ + int16_t N, /* i : number of sub-vectors */ + int16_t *R, /* o : bit-allocation indicator */ + int16_t *Rsubband ); /* o : sub-band bit-allocation vector (Q3) */ + +/*! r: Number of low frequency bands */ +int16_t hvq_pvq_bitalloc( + int16_t num_bits, /* i/o: Number of available bits (including gain bits) */ + const int32_t core_brate, /* i : bitrate */ + const int16_t bwidth, /* i : Encoded bandwidth */ + const int16_t *ynrm, /* i : Envelope coefficients */ + const int32_t manE_peak, /* i : Peak energy mantissa */ + const int16_t expE_peak, /* i : Peak energy exponent */ + int16_t *Rk, /* o : bit allocation for concatenated vector */ + int16_t *R, /* i/o: Global bit allocation */ + int16_t *sel_bands, /* o : Selected bands for encoding */ + int16_t *n_sel_bands /* o : No. of selected bands for encoding */ +); + +void floating_point_add( + int32_t *mx, /* i/o: mantissa of the addend Q31 */ + int16_t *ex, /* i/o: exponent of the addend Q0 */ + const int32_t my, /* i : mantissa of the adder Q31 */ + const int16_t ey /* i : exponent of the adder Q0 */ +); + +/*! r: Number of bits needed */ +int16_t rc_get_bits2( + const int16_t N, /* i : Number of bits currently used */ + const uint32_t range /* i : Range of range coder */ +); + +void rc_enc_init( + PVQ_ENC_HANDLE hPVQ, /* i/o: PVQ encoder handle */ + int16_t tot_bits /* i : Total bit budget */ +); + +void rc_encode( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + PVQ_ENC_HANDLE hPVQ, /* i/o: PVQ encoder handle */ + const uint32_t cum_freq, /* i : Cumulative frequency up to symbol */ + const uint32_t sym_freq, /* i : Symbol probability */ + const uint32_t tot /* i : Total cumulative frequency */ +); + +void rc_enc_finish( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + PVQ_ENC_HANDLE hPVQ /* i/o: PVQ encoder handle */ +); + +void rc_enc_bits( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + PVQ_ENC_HANDLE hPVQ, /* i/o: PVQ encoder handle */ + const uint32_t value, /* i : Value to encode */ + const int16_t bits /* i : Number of bits used */ +); + +void rc_enc_uniform( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + PVQ_ENC_HANDLE hPVQ, /* i/o: PVQ encoder handle */ + uint32_t value, /* i : Value to encode */ + uint32_t tot /* i : Maximum value */ +); + +void rc_dec_init( + Decoder_State *st, /* i/o: Decoder State */ + PVQ_DEC_HANDLE hPVQ, /* i/o: PVQ decoder handle */ + int16_t tot_bits /* i : Total bit budget */ +); + +/*! r: Decoded value */ +uint32_t rc_decode( + int16_t *BER_detect, /* o : Bit error detection flag */ + PVQ_DEC_HANDLE hPVQ, /* i/o: PVQ decoder handle */ + uint32_t tot /* i : Total cumulative frequency */ +); + +void rc_dec_update( + Decoder_State *st, /* i/o: Decoder State */ + PVQ_DEC_HANDLE hPVQ, /* i/o: PVQ decoder handle */ + const uint32_t cum_freq, /* i : Cumulative frequency */ + const uint32_t sym_freq /* i : Symbol frequency */ +); + +/*! r: Decoded value */ +uint32_t rc_dec_bits( + Decoder_State *st, /* i/o: Decoder State */ + PVQ_DEC_HANDLE hPVQ, /* i/o: PVQ decoder handle */ + const int16_t bits /* i : Number of bits */ +); + +/*! r: Decoded value */ +uint32_t rc_dec_uniform( + Decoder_State *st, /* i/o: Decoder State */ + PVQ_DEC_HANDLE hPVQ, /* i/o: PVQ decoder handle */ + const uint32_t tot /* i : Maximum value */ +); + +void rc_dec_finish( + Decoder_State *st, /* i/o: decoder state structure */ + PVQ_DEC_HANDLE hPVQ /* i/o: PVQ decoder handle */ +); + +/*! r: number of bits encoded */ +int16_t pvq_core_enc( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + float coefs_norm[], /* i/o: normalized coefficients to encode */ + float coefs_quant[], /* o : quantized coefficients */ + const int16_t bits_tot, /* i : total number of bits */ + const int16_t nb_sfm, /* i : number of bands */ + const int16_t *sfm_start, /* i : Subband start coefficient */ + const int16_t *sfm_end, /* i : Subband end coefficient */ + const int16_t *sfmsize, /* i : subband width */ + int16_t *R, /* i/o: Bit allocation/Adjusted bit alloc. (Q3) */ + int16_t *Rs, /* i/o: Integer bit allocation */ + int16_t *npulses, /* o : number of pulses */ + int16_t *maxpulse, /* i : maximum pulse per band */ + const int16_t core /* i : number of bands */ +); + +/*! r: number of bits decoded */ +int16_t pvq_core_dec( + Decoder_State *st, /* i/o: Decoder state */ + const int16_t *sfm_start, /* i : indices of first coeffs in the bands */ + const int16_t *sfm_end, /* i : indices of last coeffs in the bands */ + const int16_t *sfmsize, /* i : band sizes */ + float coefs_quant[], /* o : output MDCT */ + const int16_t bits_tot, /* i : bit budget */ + const int16_t nb_sfm, /* i : number of bands */ + int16_t *R, /* i/o: Bit allocation/Adjusted bit alloc.(Q3) */ + int16_t *Rs, /* i/o: Integer bit allocation */ + int16_t *npulses, /* o : number of pulses per band */ + int16_t *maxpulse, /* o : maximum pulse per band */ + const int16_t core /* i : core */ +); + +void pvq_encode( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + PVQ_ENC_HANDLE hPVQ, /* i/o: PVQ encoder handle */ + const float *x, /* i : vector to quantize */ + int16_t *y, /* o : quantized vector (non-scaled integer)*/ + float *xq, /* o : quantized vector (scaled float) */ + const int16_t pulses, /* i : number of allocated pulses */ + const int16_t N, /* i : Length of vector */ + const float gain /* i : Gain */ +); + +void pvq_decode( + Decoder_State *st, /* i/o: Decoder State */ + PVQ_DEC_HANDLE hPVQ, /* i/o: PVQ decoder handle */ + float *xq, /* o : decoded vector (scaled float) */ + int16_t *y, /* o : decoded vector (non-scaled short)*/ + const int16_t K, /* i : number of allocated pulses */ + const int16_t N, /* i : Length of vector */ + const float gain /* i : Gain */ +); + +void rangeCoderFinalizationFBits( + const int16_t Brc, /* i : Current number of decoded bits */ + const uint32_t INTrc, /* i : Range coder state */ + int16_t *FBits /* i : Fractional finalization bits */ +); + +void bandBitsAdjustment( + const int16_t Brc, /* i : Current number of read quanta in range coder */ + const uint32_t INTrc, /* i : Range coder state */ + const int16_t Bavail, /* i : Available number of quanta */ + const int16_t Nbands, /* i : Number of bands */ + const int16_t D, /* i : Remaining number of bands to encode */ + const int16_t L, /* i : Size of current band */ + const int16_t Bband, /* i : Quanta allocation for current band */ + const int16_t Breserv, /* i : Quanta reservoir */ + int16_t *Bband_adj, /* o : Actual used number of quanta */ + int16_t *Brem, /* o : Quanta remaining */ + int16_t *Breservplus /* o : Quanta pool size */ +); + +void conservativeL1Norm( + const int16_t L, /* i : Length of vector segment */ + const int16_t Qvec, /* i : Assigned number of quanta */ + const int16_t Fcons, /* i : Conservative rounding flag */ + const int16_t Qavail, /* i : Input quanta remaining */ + const int16_t Qreserv, /* i : Input quanta in reservoir */ + const int16_t Dspec, /* i : assigned diracs from bitalloc */ + int16_t *Dvec, /* o : actual number of diracs */ + int16_t *Qspare, /* o : Output quanta remaining */ + int16_t *Qreservplus, /* o : Output quanta in reservoir */ + int16_t *Dspecplus /* o : Output number of diracs */ +); + +void NearOppSplitAdjustment( + const int16_t qband, /* i : quanta for current band */ + const int16_t qzero, /* i : range coder finalization quanta */ + const int16_t Qac, /* i : range coder current quanta */ + const uint32_t INTac, /* i : range coder state */ + const int16_t qglobal, /* i : quanta input */ + const int16_t FlagCons, /* i : conservative rounding flag */ + const int16_t Np, /* i : number of parts */ + const int16_t Nhead, /* i : first part */ + const int16_t Ntail, /* i : remaining parts */ + const int16_t Nnear, /* i : length of near component */ + const int16_t Nopp, /* i : length of opposite component */ + int16_t oppRQ3, /* i : ratio */ + int16_t *qnear, /* o : quantized near */ + int16_t *qopp, /* o : quantized opposite */ + int16_t *qglobalupd /* o : quanta remaining */ +); + +/*! r: Approximate integer division for positive input */ +int32_t intLimCDivPos( + const int32_t NUM, /* i : numerator */ + const int16_t DEN /* i : denominator */ +); + +/*! r: Approximate integer division */ +int16_t shrtCDivSignedApprox( + const int16_t num, /* i : numerator */ + const int16_t den /* i : denominator */ +); + +void QuantaPerDsDirac( + const int16_t td, /* i : Length of vector segment */ + const int16_t dsDiracIndex, /* i : Quanta table index */ + const uint8_t *const *dimFrQuanta, /* i : Quanta lookup table */ + int16_t *Quanta /* i : Quanta */ +); + +void obtainEnergyQuantizerDensity( + const int16_t L_in, /* i : left vector energy */ + const int16_t R_in, /* i : right vector energy */ + int16_t *Density /* o : quantizer density */ +); + +void densityAngle2RmsProjDec( + const int16_t D, /* i : density */ + const int16_t indexphi, /* i : decoded index from AR dec */ + int16_t *oppQ15, /* o : opposite */ + int16_t *nearQ15, /* o : near */ + int16_t *oppRatioQ3 /* o : ratio */ +); + +void densityAngle2RmsProjEnc( + const int16_t D, /* i : density */ + const int16_t phiQ14uq, /* i : angle */ + int16_t *indexphi, /* o : index */ + int16_t *oppQ15, /* o : opposite */ + int16_t *nearQ15, /* o : near */ + int16_t *oppRatioQ3 /* o : ratio */ +); + +void env_adj( + const int16_t *pulses, /* i : number of pulses per band */ + const int16_t length, /* i : length of spectrum */ + const int16_t last_sfm, /* i : Index of last band */ + float *adj, /* o : Adjustment factors for the envelope */ + const float env_stab, /* i : Envelope stability parameter */ + const int16_t *sfmsize /* i : Length of bands */ +); + +float env_stability( + const int16_t *ynrm, /* i : Norm vector for current frame */ + const int16_t nb_sfm, /* i : Number of sub-bands */ + int16_t *mem_norm, /* i/o: Norm vector memory from past frame */ + int16_t *mem_env_delta, /* i/o: Envelope stability memory for smoothing*/ + const int16_t core_switching_flag /* i : Core switching flag */ +); + +/*! r: New speech/music state */ +float env_stab_smo( + float env_stab, /* i : env_stab value */ + float *env_stab_state_p, /* i/o: env_stab state probabilities */ + int16_t *ho_cnt /* i/o: hangover counter for speech state */ +); + +void core_switching_pre_enc( + Encoder_State *st, /* i/o: encoder state structure */ + const float *old_inp_12k8, /* i : old input signal @12.8kHz */ + const float *old_inp_16k, /* i : old input signal @16kHz */ + const int16_t active_cnt, /* i : Active frame counter */ + const int16_t last_element_mode /* i : last_element_mode */ +); + +void core_switching_post_enc( + Encoder_State *st, /* i/o: encoder state structure */ + const float *old_inp_12k8, /* i : old input signal @12.8kHz */ + const float *old_inp_16k, /* i : old input signal @16kHz */ + const float A[] /* i : unquant LP filter coefs. */ +); + +ivas_error core_switching_post_dec( + Decoder_State *st, /* i/o: decoder state structure */ + float *synth, /* i/o: output synthesis */ + float *output, /* i/o: LB synth/upsampled LB synth */ + float output_mem[], /* i : OLA memory from last TCX/HQ frame */ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const int16_t use_cldfb_for_dft, /* i : flag to use of CLDFB for DFT Stereo */ + const int16_t output_frame, /* i : frame length */ + const int16_t core_switching_flag, /* i : ACELP->HQ switching frame flag */ + const int16_t sba_dirac_stereo_flag, /* i : signal stereo output for SBA DirAC */ + const int16_t nchan_out, /* i : number of output channels */ + const int16_t last_element_mode /* i : element mode of previous frame */ +); + +ivas_error core_switching_pre_dec( + Decoder_State *st, /* i/o: decoder state structure */ + const int16_t output_frame, /* i : frame length */ + const int32_t last_core_brate_st0, /* i : channel 0 last core bitrate */ + const int16_t nchan_out, /* i : number of output channels */ + const int16_t last_element_mode, /* i : last_element_mode */ + const int32_t last_element_brate /* i : last element bitrate */ +); + +void bandwidth_switching_detect( + Decoder_State *st /* i/o: decoder state structure */ +); + +void bw_switching_pre_proc( + Decoder_State *st, /* i/o: decoder state structure */ + const float *old_syn_12k8_16k, /* i : ACELP core synthesis @ 12.8kHz or 16kHz */ + const int32_t last_element_brate, /* i : last element bitrate */ + const int16_t nchan_out /* i : number of output channels */ +); + +void updt_bw_switching( + Decoder_State *st, /* i/o: decoder state structure */ + const float *synth /* i : float synthesis signal */ +); + +void swb_tbe_reset( + float mem_csfilt[], + float mem_genSHBexc_filt_down_shb[], + float state_lpc_syn[], + float syn_overlap[], + float state_syn_shbexc[], + float *tbe_demph, + float *tbe_premph, + float mem_stp_swb[], + float *gain_prec_swb ); + +void swb_tbe_reset_synth( + float genSHBsynth_Hilbert_Mem[], + float genSHBsynth_state_lsyn_filt_shb_local[] ); + +void find_td_envelope( + const float inp[], + const int16_t len, + const int16_t len_h, + float mem_h[], + float out[] ); + +void fb_tbe_reset_enc( + float elliptic_bpf_2_48k_mem[][4], + float *prev_fb_energy ); + +void fb_tbe_reset_synth( + float fbbwe_hpf_mem[][4], + float *prev_fbbwe_ratio ); + +void wb_tbe_extras_reset( + float mem_genSHBexc_filt_down_wb2[], + float mem_genSHBexc_filt_down_wb3[] ); + +void wb_tbe_extras_reset_synth( + float state_lsyn_filt_shb[], + float state_lsyn_filt_dwn_shb[], + float mem_resamp_HB[] ); + +void tbe_celp_exc( + const int16_t element_mode, /* i : element mode */ + const int16_t idchan, /* i : channel ID */ + float *bwe_exc, /* i/o: BWE excitation */ + const int16_t L_frame, /* i : frame length */ + const int16_t L_subfr, /* i : subframe length */ + const int16_t i_subfr, /* i : subframe index */ + const int16_t T0, /* i : integer pitch lag */ + const int16_t T0_frac, /* i : fraction of lag */ + float *error, /* i/o: error */ + const int16_t tdm_LRTD_flag /* i : LRTD stereo mode flag */ +); + +void prep_tbe_exc( + const int16_t L_frame, /* i : length of the frame */ + const int16_t L_subfr, /* i : subframe length */ + const int16_t i_subfr, /* i : subframe index */ + const float gain_pit, /* i : Pitch gain */ + const float gain_code, /* i : algebraic codebook gain */ + const float code[], /* i : algebraic excitation */ + const float voice_fac, /* i : voicing factor */ + float *voice_factors, /* o : TBE voicing factor */ + float bwe_exc[], /* i/o: excitation for TBE */ + const float gain_preQ, /* i : prequantizer excitation gain */ + const float code_preQ[], /* i : prequantizer excitation */ + const int16_t T0, /* i : integer pitch variables */ + const int16_t coder_type, /* i : coding type */ + const int32_t core_brate, /* i : core bitrate */ + const int16_t element_mode, /* i : element mode */ + const int16_t idchan, /* i : channel ID */ + const int16_t flag_TD_BWE, /* i : flag indicating whether hTD_BWE exists */ + const int16_t tdm_LRTD_flag /* i : LRTD stereo mode flag */ +); + +void synthesise_fb_high_band( + const float excitation_in[], /* i : full band excitation */ + float output[], /* o : high band speech - 14.0 to 20 kHz */ + const float fb_exc_energy, /* i : full band excitation energy */ + const float ratio, /* i : energy ratio */ + const int16_t L_frame, /* i : ACELP frame length */ + const int16_t bfi, /* i : BFI flag */ + float *prev_fbbwe_ratio, /* o : previous frame energy for FEC */ + float bpf_memory[][4] /* i/o: memory for elliptic bpf 48k */ +); + +void elliptic_bpf_48k_generic( + const float input[], /* i : input signal */ + float output[], /* o : output signal */ + float memory[][4], /* i/o: 4 arrays for memory */ + const float full_band_bpf[][5] /* i : filter coefficients b0,b1,b2,a0,a1,a2 */ +); + +void HQ_FEC_processing( + Decoder_State *st, /* i/o: decoder state structure */ + float *t_audio_q, /* o : MDCT coeffs. (for synthesis) */ + int16_t is_transient, /* i : Old flag for transient */ + float ynrm_values[][MAX_PGF], /* i : Old average Norm values for each group of bands */ + float r_p_values[][MAX_ROW], /* i : Computed y-intercept and slope by Regression */ + int16_t num_Sb, /* i : Number of sub-band group */ + int16_t nb_sfm, /* i : Number of sub-band */ + int16_t *Num_bands_p, /* i : Number of coeffs. for each sub-band */ + int16_t output_frame, /* i : Frame size */ + const int16_t *sfm_start, /* i : Start of bands */ + const int16_t *sfm_end /* i : End of bands */ +); + +void HQ_FEC_Mem_update( + Decoder_State *st, /* i/o: decoder state structure */ + const float *t_audio_q, + float *normq, + int16_t *ynrm, + const int16_t *Num_bands_p, + const int16_t is_transient, + const int16_t hqswb_clas, + const int16_t c_switching_flag, + const int16_t nb_sfm, + const int16_t num_Sb, + float *mean_en_high, + const int16_t hq_core_type, /* i : normal or low-rate MDCT(HQ) core */ + const int16_t output_frame /* i : Frame size */ +); + +void time_domain_FEC_HQ( + Decoder_State *st, /* i : Decoder State */ + float *wtda_audio, /* i : input */ + float *out, /* o : output audio */ + const float mean_en_high, /* i : transient flag */ + const int16_t output_frame /* i : Frame size */ +); + +void save_synthesis_hq_fec( + Decoder_State *st, /* i/o: decoder state structure */ + const float *output, /* i : decoded synthesis */ + const int16_t output_frame, /* i : decoded synthesis */ + CPE_DEC_HANDLE hCPE /* i : CPE decoder structure */ +); + +void Next_good_after_burst_erasures( + const float *ImdctOut, /* i : input */ + float *auOut, /* o : output audio */ + float *OldauOut, /* i/o: audio from previous frame */ + const int16_t ol_size /* i : overlap size */ +); + +void update_average_rate( + SC_VBR_ENC_HANDLE hSC_VBR, /* i/o: SC-VBR state structure */ + const int32_t core_brate /* i : core bitrate */ +); + +void reset_preecho_dec( + HQ_DEC_HANDLE hHQ_core /* i/o: HQ decoder handle */ +); + +void preecho_sb( + const int32_t core_brate, /* i : core bitrate */ + const float wtda_audio[], /* i : imdct signal */ + float *rec_sig, /* i : reconstructed signal, output of the imdct transform */ + const int16_t framelength, /* i : frame length */ + float *memfilt_lb, /* i/o: memory */ + float *mean_prev_hb, /* i/o: memory */ + float *smoothmem, /* i/o: memory */ + float *mean_prev, /* i/o: memory */ + float *mean_prev_nc, /* i/o: memory */ + float *wmold_hb, /* i/o: memory */ + int16_t *prevflag, /* i/o: flag */ + int16_t *pastpre, /* i/o: flag */ + const int16_t bwidth /* i : audio bandwidth */ +); + +void hq2_core_configure( + const int16_t frame_length, /* i : frame length */ + const int16_t num_bits, /* i : number of bits */ + const int16_t is_transient, /* i : transient flag */ + int16_t *bands, + int16_t *length, + int16_t band_width[], + int16_t band_start[], + int16_t band_end[], + Word32 *L_qint, /* o : Q29 */ + Word16 *eref_fx, /* o : Q10 */ + Word16 *bit_alloc_weight_fx, /* o : Q13 */ + int16_t *gqlevs, + int16_t *Ngq, + int16_t *p2a_bands, + float *p2a_th, + float *pd_thresh, + float *ld_slope, + float *ni_coef, + float *ni_pd_th, + int32_t bwe_br ); + +void hq_lr_enc( + Encoder_State *st, /* i/o: encoder state structure */ + float t_audio[], /* i/o: transform-domain coefs. */ + const int16_t inner_frame, /* i : inner frame length */ + int16_t *num_bits, /* i/o: number of available bits */ + const int16_t is_transient /* i : transient flag */ +); + +void hq_lr_dec( + Decoder_State *st, /* i/o: decoder state structure */ + float yout[], /* o : transform-domain output coefs. */ + const int16_t inner_frame, /* i : inner frame length */ + int16_t num_bits, /* i : number of available bits */ + int16_t *is_transient /* o : transient flag */ +); + +void hq2_bit_alloc( + const float band_energy[], /* i : band energy of each subband */ + const int16_t bands, /* i : total number of subbands in a frame */ + Word32 L_Rk[], /* i/o: Bit allocation/Adjusted bit alloc. */ + int16_t *bit_budget, /* i/o: bit bugdet */ + int16_t *p2a_flags, /* i : HF tonal indicator */ + const Word16 weight_fx, /* i : weight (Q13) */ + const int16_t band_width[], /* i : Sub band bandwidth */ + const int16_t num_bits, /* i : available bits */ + const int16_t hqswb_clas, /* i : HQ2 class information */ + const int16_t bwidth, /* i : input bandwidth */ + const int16_t is_transient /* i : indicator HQ_TRANSIENT or not */ +); + +void hq2_noise_inject( + float y2hat[], + const int16_t band_start[], + const int16_t band_end[], + const int16_t band_width[], + float Ep[], + float Rk[], + const int16_t npulses[], + int16_t ni_seed, + const int16_t bands, + const int16_t ni_start_band, + const int16_t bw_low, + const int16_t bw_high, + const float enerL, + const float enerH, + float last_ni_gain[], + float last_env[], + int16_t *last_max_pos_pulse, + int16_t *p2a_flags, + int16_t p2a_bands, + const int16_t hqswb_clas, + const int16_t bwidth, + const int32_t bwe_br ); + +void mdct_spectrum_denorm( + const int32_t inp_vector[], + float y2[], + const int16_t band_start[], + const int16_t band_end[], + const int16_t band_width[], + const float band_energy[], + const int16_t npulses[], + const int16_t bands, + const float ld_slope, + const float pd_thresh ); + +void reverse_transient_frame_energies( + float band_energy[], /* o : band energies */ + const int16_t bands /* i : number of bands */ +); + +int16_t peak_vq_enc( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const int16_t bwidth, /* i : audio bandwidth */ + const float *coefs, /* i : Input coefficient vector */ + float *coefs_out, /* o : Quantized output vector */ + const int32_t core_brate, /* i : Core bitrate */ + const int16_t num_bits, /* i : Number of bits for HVQ */ + const int16_t vq_peaks, /* i : Number of identified peaks */ + const int16_t *ynrm, /* i : Envelope coefficients */ + int16_t *R, /* i/o: Bit allocation/updated bit allocation */ + int16_t *vq_peak_idx, /* i : Peak index vector */ + float *nf_gains /* i : Estimated noise floor gains */ +); + +void hvq_dec( + Decoder_State *st, /* i/o: decoder state structure */ + const int16_t num_bits, /* i : Number of available bits */ + const int32_t core_brate, /* i : Core bitrate */ + const int16_t *ynrm, /* i : Envelope coefficients */ + int16_t *R, /* i/o: Bit allocation/updated bit allocation */ + float *noise_level, /* o : Noise level */ + int16_t *peak_idx, /* o : Peak position vector */ + int16_t *Npeaks, /* o : Total number of peaks */ + float *coefsq_norm, /* o : Output vector */ + const int16_t core /* i : Core */ +); + +void hq_configure_bfi( + int16_t *nb_sfm, /* o : Number of sub bands */ + int16_t *num_Sb, /* o : Number of FEC sub bands ? */ + int16_t *num_bands_p, /* o : FEC sub bands */ + const int16_t **sfmsize, /* o : Subband bandwidths */ + const int16_t **sfm_start, /* o : Subband start coefficients */ + const int16_t **sfm_end /* o : Subband end coefficients */ +); + +void swb_bwe_enc_lr( + Encoder_State *st, /* i/o: encoder state structure */ + const float m_core[], /* i : core synthesis (MDCT) */ + const float m_orig[], /* i/o: scaled orig signal (MDCT) */ + float m[], /* o : output, SWB part (MDCT) */ + const int32_t total_brate, /* i : total bitrate for selecting subband pattern */ + int16_t BANDS, + int16_t *band_start, + int16_t *band_end, + float *band_energy, + int16_t *p2a_flags, + const int16_t hqswb_clas, + int16_t lowlength, + int16_t highlength, + int16_t *prev_frm_index, + const int16_t har_bands, + int16_t *prev_frm_hfe2, + int16_t *prev_stab_hfe2, + int16_t band_width[], + const float y2_ni[], + int16_t *ni_seed ); + +void swb_bwe_dec_lr( + Decoder_State *st, /* i/o: decoder state structure */ + const float m_core[], /* i : lowband synthesis */ + float m[], /* o : highband synthesis with lowband zeroed */ + const int32_t total_brate, /* i : total bitrate for selecting subband pattern */ + int16_t BANDS, + int16_t *band_start, + int16_t *band_end, + float *band_energy, + int16_t *p2a_flags, + const int16_t hqswb_clas, + int16_t lowlength, + int16_t highlength, + const int16_t har_bands, + int16_t *prev_frm_hfe2, + int16_t *prev_stab_hfe2, + int16_t band_width[], + const float y2_ni[], + int16_t *ni_seed ); + +int16_t get_usebit_npswb( + const int16_t hqswb_clas ); + +void GetPredictedSignal( + const float *predBuf, /* i : prediction buffer */ + float *outBuf, /* o : output buffer */ + const int16_t lag, /* i : prediction buffer offset */ + const int16_t fLen, /* i : length of loop (output) */ + const float gain /* i : gain to be applied */ +); + +void convert_lagIndices_pls2smp( + int16_t lagIndices_in[], + int16_t nBands_search, + int16_t lagIndices_out[], + const float sspectra[], + const int16_t sbWidth[], + const int16_t fLenLow ); + +void FindNBiggest2_simple( + const float *inBuf, /* i : input buffer (searched) */ + GainItem *g, /* o : N biggest components found */ + const int16_t nIdx, /* i : search length */ + int16_t *n, /* i : number of components searched (N biggest) */ + const int16_t N_NBIGGESTSEARCH ); + +void updat_prev_frm( + float y2[], + float t_audio[], + const int32_t bwe_br, + const int16_t length, + const int16_t inner_frame, + const int16_t bands, + const int16_t bwidth, + const int16_t is_transient, + const int16_t hqswb_clas, + int16_t *prev_hqswb_clas, + int16_t *prev_SWB_peak_pos, + int16_t prev_SWB_peak_pos_tmp[], + int16_t *prev_frm_hfe2, + int16_t *prev_stab_hfe2, + const int16_t bws_cnt ); + +void hf_parinitiz( + const int32_t total_brate, + const int16_t hqswb_clas, + int16_t lowlength, + int16_t highlength, + int16_t wBands[], + const int16_t **subband_search_offset, + const int16_t **subband_offsets, + int16_t *nBands, + int16_t *nBands_search, + int16_t *swb_lowband, + int16_t *swb_highband ); + +float spectrumsmooth_noiseton( + float spectra[], + const float spectra_ni[], + float sspectra[], + float sspectra_diff[], + float sspectra_ni[], + const int16_t fLenLow, + int16_t *ni_seed ); + +void noiseinj_hf( + float xSynth_har[], + const float th_g[], + const float band_energy[], + float *prev_En_sb, + const int16_t p2a_flags[], + const int16_t BANDS, + const int16_t band_start[], + const int16_t band_end[], + const int16_t fLenLow ); + +void noise_extr_corcod( + float spectra[], + const float spectra_ni[], + float sspectra[], + float sspectra_diff[], + float sspectra_ni[], + const int16_t fLenLow, + int16_t prev_hqswb_clas, + float *prev_ni_ratio ); + +void genhf_noise( + float noise_flr[], + float xSynth_har[], + float *predBuf, + int16_t bands, /* i : total number of subbands in a frame */ + int16_t harmonic_band, /* i : Number of LF harmonic frames */ + int16_t har_freq_est2, + int16_t pos_max_hfe2, + int16_t *pul_res, + GainItem pk_sf[], + const int16_t fLenLow, + const int16_t fLenHigh, + const int16_t sbWidth[], + const int16_t lagIndices[], + const int16_t subband_offsets[], + const int16_t subband_search_offset[] ); + +void ton_ene_est( + float xSynth_har[], + float be_tonal[], + float band_energy[], + int16_t band_start[], + int16_t band_end[], + int16_t band_width[], + const int16_t fLenLow, + const int16_t fLenHigh, + int16_t bands, + int16_t har_bands, + float ni_lvl, + GainItem pk_sf[], + int16_t *pul_res ); + +void Gettonl_scalfact( + float *outBuf, /* o : synthesized spectrum */ + const float *codbuf, /* i : core coder */ + const int16_t fLenLow, /* i : lowband length */ + const int16_t fLenHigh, /* i : highband length */ + int16_t harmonic_band, /* i : Number of LF harmonic frames */ + int16_t bands, /* i : total number of subbands in a frame */ + float *band_energy, /* i : band energy of each subband */ + int16_t *band_start, /* i : subband start indices */ + int16_t *band_end, /* i : subband end indices */ + const int16_t p2aflags[], + float be_tonal[], + GainItem *pk_sf, + int16_t *pul_res ); + +void SpectrumSmoothing( + float *inBuf, + float *outBuf, + const int16_t fLen, + const float th_cut ); + +void hq2_bit_alloc_har( + float *y, /* i : band energy of sub-vectors */ + int16_t B, /* i : number of available bits */ + int16_t N, /* i : number of sub-vectors */ + Word32 *L_Rsubband, + int16_t p2a_bands, + int32_t core_brate, /* i : core bitrate */ + int16_t p2a_flags[], + int16_t band_width[] ); + +void GetSynthesizedSpecThinOut( + const float *predBuf, + float *outBuf, + const int16_t nBands, + const int16_t *sbWidth, + const int16_t *lagIndices, + const float *lagGains, + const int16_t predBufLen ); + +void return_bits_normal2( + int16_t *bit_budget, + const int16_t p2a_flags[], + const int16_t bands, + const int16_t bits_lagIndices[] ); + +void GetlagGains( + const float *predBuf, + const float *band_energy, + const int16_t nBands, + const int16_t *sbWidth, + const int16_t *lagIndices, + const int16_t predBufLen, + float *lagGains ); + +void preset_hq2_swb( + const int16_t hqswb_clas, + const int16_t band_end[], + int16_t *har_bands, + int16_t p2a_bands, + const int16_t length, + const int16_t bands, + int16_t *lowlength, + int16_t *highlength, + float m[] ); + +void post_hq2_swb( + const float m[], + const int16_t lowlength, + const int16_t highlength, + const int16_t hqswb_clas, + const int16_t har_bands, + const int16_t bands, + const int16_t p2a_flags[], + const int16_t band_start[], + const int16_t band_end[], + float y2[], + int16_t npulses[] ); + +void har_denorm_pulcnt( + float spectra[], /* i/o: MDCT domain spectrum */ + const int16_t band_start[], /* i : Number subbands/Frame */ + const int16_t band_end[], /* i : Band Start of each SB */ + const float band_energy[], /* i : Band end of each SB */ + const int16_t band_width[], + const int16_t npulses[], + const int16_t har_bands /* i : No. of harmonic bands */ +); + +int16_t har_est( + float spectra[], + const int16_t N, + int16_t *har_freq_est1, + int16_t *har_freq_est2, + int16_t *flag_dis, + int16_t *prev_frm_hfe2, + const int16_t subband_search_offset[], + const int16_t sbWidth[], + int16_t *prev_stab_hfe2 ); + +void spt_shorten_domain_pre( + const int16_t band_start[], + const int16_t band_end[], + const int16_t prev_SWB_peak_pos[], + const int16_t BANDS, + const int32_t bwe_br, + int16_t new_band_start[], + int16_t new_band_end[], + int16_t new_band_width[] ); + +void spt_shorten_domain_band_save( + const int16_t bands, + const int16_t band_start[], + const int16_t band_end[], + const int16_t band_width[], + int16_t org_band_start[], + int16_t org_band_end[], + int16_t org_band_width[] ); + +void spt_shorten_domain_band_restore( + const int16_t bands, + int16_t band_start[], + int16_t band_end[], + int16_t band_width[], + const int16_t org_band_start[], + const int16_t org_band_end[], + const int16_t org_band_width[] ); + +void spt_swb_peakpos_tmp_save( + const float y2[], + const int16_t bands, + const int16_t band_start[], + const int16_t band_end[], + int16_t prev_SWB_peak_pos_tmp[] ); + +void hq_ecu( + const float *prevsynth, /* i : buffer of previously synthesized signal */ + float *ecu_rec, /* o : reconstructed frame in tda domain */ + int16_t *time_offs, /* i/o: Sample offset for consecutive frame losses*/ + float *X_sav, /* i/o: Stored spectrum of prototype frame */ + int16_t *num_p, /* i/o: Number of identified peaks */ + int16_t *plocs, /* i/o: Peak locations */ + float *plocsi, /* i/o: Interpolated peak locations */ + const float env_stab, /* i : Envelope stability parameter */ + int16_t *last_fec, /* i/o: Flag for usage of pitch dependent ECU */ + const int16_t ph_ecu_HqVoicing, /* i : HQ Voicing flag */ + int16_t *ph_ecu_active, /* i : Phase ECU active flag */ + float *gapsynth, /* o : Gap synthesis */ + const int16_t prev_bfi, /* i : indicating burst frame error */ + const int16_t old_is_transient[2], /* i : flags indicating previous transient frames*/ + float *mag_chg_1st, /* i/o: per band magnitude modifier for transients*/ + float Xavg[LGW_MAX], /* i/o: Frequency group average gain to fade to */ + float *beta_mute, /* o : Factor for long-term mute */ + const int16_t output_frame, /* i : frame length */ + Decoder_State *st /* i/o: decoder state structure */ +); + +void peakfinder( + const float *x0, /* i : vector from which the maxima will be found */ + const int16_t len0, /* i : length of input vector */ + int16_t *plocs, /* o : the indicies of the identified peaks in x0 */ + int16_t *cInd, /* o : number of identified peaks */ + const float sel, /* i : The amount above surrounding data for a peak to be identified */ + const int16_t endpoints /* i : Flag to include endpoints in peak search */ +); + +/*! r: interpolated maximum position */ +float imax_pos( + const float *y /* i : Input vector for peak interpolation */ +); + + +void fft3( + const float X[], /* i : input frame */ + float Y[], /* o : DFT of input frame */ + const int16_t n /* i : block length (must be radix 3) */ +); + +void ifft3( + const float X[], /* i : input frame */ + float Y[], /* o : iDFT of input frame */ + const int16_t n /* i : block length (must be radix 3) */ +); + +/*! r: updated estimate of background noise */ +void minimumStatistics( + float *noiseLevelMemory, /* i/o: internal state */ + int16_t *noiseLevelIndex, /* i/o: internal state */ + int16_t *currLevelIndex, /* i/o: internal state (circular buffer) */ + float *noiseEstimate, /* i/o: previous estimate of background noise */ + float *lastFrameLevel, /* i/o: level of the last frame */ + float currentFrameLevel, /* i : level of the current frame */ + const float minLev, /* i : minimum level */ + const int16_t buffSize /* i : buffer size */ +); + +void E_LPC_int_lpc_tcx( + const float lsf_old[], /* i : LSFs from past frame */ + const float lsf_new[], /* i : LSFs from present frame */ + float a[] /* o : interpolated LP coefficients */ +); + +int16_t E_GAIN_closed_loop_search( + float exc[], + float xn[], + float h[], + int16_t t0_min, + int16_t t0_min_frac, + int16_t t0_max, + int16_t t0_max_frac, + const int16_t t0_min_max_res, + int16_t *pit_frac, + int16_t *pit_res, + const int16_t pit_res_max, + const int16_t i_subfr, + const int16_t pit_min, + const int16_t pit_fr2, + const int16_t pit_fr1, + const int16_t L_subfr ); + +void E_ACELP_toeplitz_mul( + const float R[], + const float c[], + float d[] ); + +void acelp_pulsesign( + const float cn[], + float dn[], + float dn2[], + float sign[], + float vec[], + const float alp ); + +void E_ACELP_4t( + float dn[], + float cn[], + float H[], + float R[], + const int16_t acelpautoc, + float code[], + const int16_t cdk_index, + int16_t _index[], + const int16_t L_frame, + const int16_t last_L_frame, + const int32_t total_brate, + const int16_t i_subfr, + const int16_t cmpl_flag ); + +void E_ACELP_4tsearch( + float dn[], + const float cn[], + const float H[], + float code[], + PulseConfig *config, + int16_t ind[], + float y[] ); + +void E_ACELP_4tsearchx( + float dn[], + const float cn[], + float Rw[], + float code[], + PulseConfig *config, + int16_t ind[] ); + +int16_t E_ACELP_indexing( + float code[], + PulseConfig config, + const int16_t num_tracks, + int16_t prm[] ); + +void acelp_findcandidates( + float dn2[], + int16_t dn2_pos[], + int16_t pos_max[], + const int16_t L_subfr, + const int16_t tracks ); + +void E_ACELP_innovative_codebook( + const float *exc, /* i : pointer to the excitation frame */ + const int16_t T0, /* i : integer pitch lag */ + const int16_t T0_frac, /* i : fraction of lag */ + const int16_t T0_res, /* i : pitch resolution */ + const float pitch_gain, /* i : adaptive codebook gain */ + const float tilt_code, /* i : tilt factor */ + ACELP_config *acelp_cfg, /* i/o: configuration of the ACELP */ + const int16_t i_subfr, /* i : subframe index */ + const float *Aq, /* i : quantized LPC coefficients */ + const float *h1, /* i : impulse response of weighted synthesis filter */ + const float *xn, /* i : Close-loop Pitch search target vector */ + const float *cn, /* i : Innovative codebook search target vector */ + const float *y1, /* i : zero-memory filtered adaptive excitation */ + float *y2, /* o : zero-memory filtered algebraic excitation */ + const int16_t acelpautoc, /* i : autocorrelation mode enabled */ + int16_t **pt_indice, /* i/o: quantization indices pointer */ + float *code, /* o : innovative codebook */ + const int16_t L_frame, /* i : length of the frame */ + const int16_t last_L_frame, /* i : length of the last frame */ + const int32_t total_brate /* i : total bitrate */ +); + +int16_t E_ACELP_code43bit( + const float code[], + uint32_t *ps, + int16_t *p, + uint16_t idxs[] ); + +void fcb_pulse_track_joint( + uint16_t *idxs, + const int16_t wordcnt, + uint32_t *index_n, + const int16_t *pulse_num, + const int16_t track_num ); + +void D_ACELP_indexing( + float code[], + PulseConfig config, + const int16_t num_tracks, + int16_t prm[], + int16_t *BER_detect ); + +void D_ACELP_decode_43bit( + uint16_t idxs[], + float code[], + int16_t *pulsestrack ); + +void fcb_pulse_track_joint_decode( + uint16_t *idxs, + const int16_t wordcnt, + uint32_t *index_n, + const int16_t *pulse_num, + const int16_t track_num ); + +void lag_wind( + float r[], /* i/o: autocorrelations */ + const int16_t m, /* i : order of LP filter */ + const int32_t sr_core, /* i : sampling rate */ + const int16_t strength /* i : LAGW_WEAK, LAGW_MEDIUM, or LAGW_STRONG */ +); + +void adapt_lag_wind( + float r[], /* i/o: autocorrelations */ + const int16_t m, /* i : order of LP filter */ + const int16_t Top, /* i : open loop pitch lags from curr. frame (or NULL if n/a) */ + const float Tnc, /* i : open loop pitch gains from curr. frame (NULL if n/a) */ + const int32_t sr_core /* i : core sampling rate */ +); + +void hp20( + Float32 signal[], + const Word16 lg, + Float32 mem[], + const Word32 Fs ); + +void ham_cos_window( + float *fh, + const int16_t n1, + const int16_t n2 ); + +/*! r: noise dependent voicing correction */ +float correlation_shift( + const float totalNoise /* i : noise estimate over all critical bands */ +); + +void init_coder_ace_plus( + Encoder_State *st, /* i : Encoder state handle */ + const int32_t last_total_brate, /* i : last total bitrate */ + const int16_t MCT_flag /* i : hMCT handle allocated (1) or not (0)*/ +); + +void core_coder_reconfig( + Encoder_State *st, /* i/o: encoder state structure */ + const int32_t last_total_brate /* i : last total bitrate */ +); + +void core_coder_mode_switch( + Encoder_State *st, /* i/o: encoder state structure */ + const int32_t last_total_brate, /* i : last bitrate */ + const int16_t MCT_flag /* i : hMCT handle allocated (1) or not (0)*/ +); + +void enc_acelp_tcx_main( + Encoder_State *st, /* i/o: encoder state structure */ + const float new_samples[], /* i : new samples */ + float Aw[NB_SUBFR16k * ( M + 1 )], /* i : weighted A(z) unquant. for subframes*/ + const float lsp_new[M], /* i : LSPs at the end of the frame */ + const float lsp_mid[M], /* i : LSPs at the middle of the frame */ + float bwe_exc_extended[], /* i/o: bandwidth extended excitation */ + float *voice_factors, /* o : voicing factors */ + float pitch_buf[], /* o : floating pitch for each subframe */ + const int16_t vad_hover_flag /* i : VAD hangover flag */ +); + +void getTCXMode( + Decoder_State *st, /* i/o: decoder memory state */ + Decoder_State *st0, /* i : bitstream */ + const int16_t MCT_flag /* i : hMCT handle allocated (1) or not (0)*/ +); + +void getTCXWindowing( + const int16_t core, /* i : current frame mode */ + const int16_t last_core, /* i : last frame mode */ + const int16_t element_mode, /* i : element mode */ + TCX_CONFIG_HANDLE hTcxCfg, /* i/o: TCX configuration handle */ + Decoder_State *st0 /* i : bitstream */ +); + +void getLPCparam( + Decoder_State *st, /* i/o: decoder memory state */ + int16_t param_lpc[], /* o : LTP parameters */ + Decoder_State *st0, /* i : bitstream */ + const int16_t ch, /* i : channel */ + const int16_t sns_low_br_mode /* i : SNS low-bitrate mode */ +); + +void getTCXparam( + Decoder_State *st, /* i/o: Decoder State handle */ + Decoder_State *st0, /* i : bitstream */ + CONTEXT_HM_CONFIG hm_cfg, /* i/o: HM config */ + int16_t param[], /* o : decoded parameters */ + const int16_t bits_common, /* i : number of common bits */ + const int16_t start_bit_pos, /* i : position of the start bit */ + const int16_t *no_param_tns, /* i : number of TNS parameters per subframe */ + int16_t p_param[2], /* o : pointer to parameters for next round of bs reading*/ + int16_t nTnsBitsTCX10[2], + const int16_t pre_past_flag ); + +void pitch_pred_linear_fit( + const int16_t nbLostCmpt, /* i : bfi counter */ + const int16_t last_good, /* i : last classification type */ + float *old_pitch_buf, /* i : pitch lag buffer */ + float *old_fpitch, /* i/o: pitch used for initial ACB generation */ + float *T0_out, /* o : estimated close loop pitch */ + const int16_t pit_min, /* i : Minimum pitch lag */ + const int16_t pit_max, /* i : Maximum pitch lag */ + float *mem_pitch_gain, /* i : lag pitch gain [0] is the most recent subfr lag */ + const int16_t limitation, + const int16_t plc_use_future_lag, /* i : number of subframes to predict */ + int16_t *extrapolationFailed, /* o : flag if extrap decides not to change the pitch */ + const int16_t nb_subfr /* i : number of ACELP subframes */ +); + +void get_subframe_pitch( + const int16_t nSubframes, /* i : number of subframes */ + float pitchStart, /* i : starting pitch lag (in subframe -1) */ + float pitchEnd, /* i : ending pitch lag (in subframe nSubframes-1) */ + float *pitchBuf /* o : interpolated pitch lag per subframe */ +); + +void core_encode_openloop( + Encoder_State *st, /* i/o: encoder state structure */ + const float Aw[NB_SUBFR16k * ( M + 1 )], /* i : weighted A(z) unquant. for subframes*/ + const float lsp_new[M], /* i : LSPs at the end of the frame */ + const float lsp_mid[M], /* i : LSPs at the middle of the frame */ + float *pitch_buf, /* i/o: floating pitch values for each subfr*/ + float *voice_factors, /* o : voicing factors */ + float *ptr_bwe_exc, /* o : excitation for SWB TBE */ + const int16_t vad_hover_flag /* i : VAD hangover flag */ +); + +void core_acelp_tcx20_switching( + Encoder_State *st, /* i/o: encoder state structure */ + float non_staX, /* i : unbound non-stationarity for sp/mu clas */ + float *pitch_fr, /* i/o: fraction pitch values */ + float *voicing_fr, /* i/o: fractional voicing values */ + const float currTempFlatness, /* i : flatness */ + const float lsp_mid[M], /* i : LSPs at the middle of the frame */ + const float stab_fac /* i : LP filter stability */ +); + +void core_encode_twodiv( + Encoder_State *st, /* i/o: coder memory state */ + const float new_samples[], /* i : new samples */ + float Aw[NB_SUBFR16k * ( M + 1 )], /* i : weighted A(z) unquant. for subframes*/ + const int16_t vad_hover_flag /* i : VAD hangover flag */ +); + +void core_encode_update( + Encoder_State *st /* i/o: encoder state structure */ +); + +void core_encode_update_cng( + Encoder_State *st, /* i/o: encoder state structure */ + float *timeDomainBuffer, + float *A, + const float Aw[] /* i : weighted A(z) unquant. for subframes*/ +); + +void core_signal_analysis_high_bitrate( + const float *new_samples, + const int16_t T_op[3], /* i : open-loop pitch values for quantiz. */ + float lsp_new[], + float lsp_mid[], + Encoder_State *st, + float *mdst_spectrum[2], + int16_t pTnsSize[], + int16_t pTnsBits[], + int16_t param_core[], + int16_t *ltpBits, + float *windowed_samples, /* i/o: backup of windowed time signal */ + const int16_t L_frame, + const int16_t L_frameTCX, + const int16_t last_element_mode, + const int16_t vad_hover_flag /* i : VAD hangover flag */ +); + +/*! r: codebook gain (adaptive or fixed) */ +float get_gain( + const float x[], /* i : target signal */ + const float y[], /* i : filtered codebook excitation */ + const int16_t n, /* i : segment length */ + float *en_y /* o : energy of y (sum of y[]^2, optional) */ +); + +void encode_acelp_gains( + const float *code, + const int16_t gains_mode, + const float mean_ener_code, + const int16_t clip_gain, + ACELP_CbkCorr *g_corr, + float *gain_pit, + float *gain_code, + int16_t **pt_indice, + float *past_gcode, + float *gain_inov, + const int16_t L_subfr, + float *code2, + float *gain_code2, + const int16_t noisy_speech_flag ); + +int16_t gain_enc_gacelp_uv( + const float *code, /* i : algebraic excitation */ + const float *code2, /* i : gaussian excitation */ + const int16_t lcode, /* i : Subframe size */ + const float mean_ener, /* i : quantized mean energy of the frame */ + float *gain_pit, /* o : quantized pitch gain */ + float *gain_code, /* o : quantized codebook gain */ + float *gain_code2, /* o : quantized codebook gain */ + ACELP_CbkCorr *coeff, /* i/o: correlations , -2,, -2 and 2 */ + float *past_gcode, /* i/o: past gain of code */ + float *gain_inov, /* o : unscaled innovation gain */ + const int16_t noisy_speech_flag /* i : noisy speech flag */ +); + +int16_t Mode2_gain_enc_mless( + const float *code, /* i : algebraic excitation */ + const int16_t lcode, /* i : Subframe size */ + float *gain_pit, /* o : quantized pitch gain */ + float *gain_code, /* o : quantized codebook gain */ + ACELP_CbkCorr *coeff, /* i/o: correlations , -2,, -2 and 2 */ + const float mean_ener, /* i : mean_ener defined in open-loop (3 bits) */ + const int16_t clip_gain, /* i : gain pitch clipping flag (1 = clipping) */ + float *past_gcode, /* i/o: past gain of code */ + float *gain_inov, /* o : unscaled innovation gain */ + const int16_t coder_type /* i : type of coder */ +); + +void decode_acelp_gains( + const float *code, + const int16_t gains_mode, + const float mean_ener_code, + float *gain_pit, + float *gain_code, + int16_t **pt_indice, + float *past_gpit, + float *past_gcode, + float *gain_inov, + const int16_t L_subfr, + float *code2, + float *gain_code2 ); + +void gain_dec_gacelp_uv( + int16_t index, /* i/o: Quantization index vector */ + const float *code, /* i : algebraic code excitation */ + const float *code2, /* i : algebraic code excitation */ + const float mean_ener, /* i : mean energy */ + const int16_t lcode, /* i : Subframe size */ + float *gain_pit, /* o : Quantized pitch gain */ + float *gain_code, /* o : Quantized codebook gain */ + float *gain_code2, /* o : Quantized codebook gain */ + float *past_gpit, /* i/o: past gain of pitch */ + float *past_gcode, /* i/o: past energy of code */ + float *gain_inov /* o : unscaled innovation gain */ +); + +void Mode2_pit_encode( + const int16_t coder_type, /* i : coding model */ + const int16_t i_subfr, /* i : subframe index */ + int16_t **pt_indice, /* i/o: quantization indices pointer */ + float *exc, /* i/o: pointer to excitation signal frame */ + const int16_t *T_op, /* i : open loop pitch estimates in current frame */ + int16_t *T0_min, /* i/o: lower limit for close-loop search */ + int16_t *T0_min_frac, /* i/o: lower limit for close-loop search */ + int16_t *T0_max, /* i/o: higher limit for close-loop search */ + int16_t *T0_max_frac, /* i/o: higher limit for close-loop search */ + int16_t *T0, /* i/o: close loop integer pitch */ + int16_t *T0_frac, /* i/o: close loop fractional part of the pitch */ + int16_t *T0_res, /* i/o: close loop pitch resolution */ + float *h1, /* i : weighted filter impulse response */ + float *xn, /* i : target vector */ + const int16_t pit_min, + const int16_t pit_fr1, + const int16_t pit_fr1b, + const int16_t pit_fr2, + const int16_t pit_max, + const int16_t pit_res_max ); + +void limit_T0_voiced( + const int16_t nbits, + const int16_t res, + const int16_t T0, /* i : rough pitch estimate around which the search is done */ + const int16_t T0_frac, /* i : pitch estimate fractional part */ + const int16_t T0_res, /* i : pitch resolution */ + int16_t *T0_min, /* o : lower pitch limit */ + int16_t *T0_min_frac, /* o : lower pitch limit */ + int16_t *T0_max, /* o : higher pitch limit */ + int16_t *T0_max_frac, /* o : higher pitch limit */ + const int16_t pit_min, /* i : Minimum pitch lag */ + const int16_t pit_max /* i : Maximum pitch lag */ +); + +void Mode2_abs_pit_enc( + const int16_t T0, /* i : integer pitch lag */ + const int16_t T0_frac, /* i : pitch fraction */ + int16_t **pt_indice, /* i/o: pointer to Vector of Q indexes */ + const int16_t pit_min, + const int16_t pit_fr1, + const int16_t pit_fr2, + const int16_t pit_res_max ); + +void Mode2_delta_pit_enc( + const int16_t T0, /* i : integer pitch lag */ + const int16_t T0_frac, /* i : pitch fraction */ + const int16_t T0_res, /* i : pitch resolution */ + const int16_t T0_min, /* i : delta search min */ + const int16_t T0_min_frac, /* i : delta search min */ + int16_t **pt_indice /* o : pointer to Vector of Q indexes */ +); + +/*! r: floating pitch value */ +float Mode2_pit_decode( + const int16_t coder_type, /* i : coding model */ + const int16_t i_subfr, /* i : subframe index */ + const int16_t L_subfr, /* i : sub-frame length */ + int16_t **pt_indice, /* i/o: quantization indices pointer */ + int16_t *T0, /* o : close loop integer pitch */ + int16_t *T0_frac, /* o : close loop fractional part of the pitch */ + int16_t *T0_res, /* i/o: pitch resolution */ + int16_t *T0_min, /* i/o: lower limit for close-loop search */ + int16_t *T0_min_frac, /* i/o: lower limit for close-loop search */ + int16_t *T0_max, /* i/o: higher limit for close-loop search */ + int16_t *T0_max_frac, /* i/o: higher limit for close-loop search */ + const int16_t pit_min, + const int16_t pit_fr1, + const int16_t pit_fr1b, + const int16_t pit_fr2, + const int16_t pit_max, + const int16_t pit_res_max ); + +void Mode2_abs_pit_dec( + int16_t *T0, /* o : integer pitch lag */ + int16_t *T0_frac, /* o : pitch fraction */ + int16_t *T0_res, /* o : pitch resolution */ + int16_t **pt_indice, /* i/o: pointer to Vector of Q indexes */ + const int16_t pit_min, + const int16_t pit_fr1, + const int16_t pit_fr2, + const int16_t pit_res_max ); + +void Mode2_delta_pit_dec( + int16_t *T0, /* o : integer pitch lag */ + int16_t *T0_frac, /* o : pitch fraction */ + int16_t T0_res, /* i : pitch resolution */ + int16_t *T0_min, /* i : delta search min */ + int16_t *T0_min_frac, /* i : delta search min */ + int16_t **pt_indice /* i/o: pointer to Vector of Q indexes */ +); + +void formant_post_filt( + PFSTAT_HANDLE hPFstat, /* i/o: Post filter related memories */ + float *synth_in, /* i : 12k8 synthesis */ + const float *Aq, /* i : LP filter coefficient */ + float *synth_out, /* i/o: input signal */ + const int16_t L_frame, /* i : frame length */ + const int16_t L_subfr, /* i : sub-frame length */ + const float lp_noise, /* i : background noise energy */ + const int32_t brate, /* i : bitrate */ + const int16_t off_flag /* i : Off flag */ +); + +void qlpc_avq( + const float *lsp, /* i : Input LSF vectors */ + const float *lspmid, /* i : Input mid-LSF vectors */ + float *lsf_q, /* o : Quantized LFS vectors */ + float *lsfmid_q, /* o : Quantized mid-LFS vectors */ + int16_t *index, /* o : Quantization indices */ + int16_t *nb_indices, /* o : Number of quantization indices */ + int16_t *nbbits, /* o : Number of quantization bits */ + const int16_t core, /* i : core */ + const int32_t sr_core /* i : internal sampling rate */ +); + +int16_t encode_lpc_avq( + BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ + const int16_t numlpc, /* i : Number of sets of lpc */ + const int16_t *param_lpc, /* i : lpc parameters */ + const int16_t core, /* i : core */ + const int16_t element_mode /* i : element mode */ +); + +int16_t dlpc_avq( + int16_t *index, /* i : Quantization indices */ + float *LSF_Q, /* o : Quantized LSF vectors */ + const int16_t numlpc, /* i : Number of sets of lpc */ + const int32_t sr_core /* i : internal sampling rate */ +); + +int16_t decode_lpc_avq( + Decoder_State *st, /* i/o: decoder state structure */ + const int16_t numlpc, /* i : Number of sets of lpc */ + int16_t *param_lpc, /* o : lpc parameters */ + const int16_t ch, /* i : channel */ + const int16_t element_mode, /* i : element mode */ + const int16_t sns_low_br_mode /* i : SNS low-bitrate mode */ +); + +/*! r: codebook index */ +int16_t vlpc_1st_cod( + const float *lsf, /* i : vector to quantize */ + float *lsfq, /* i/o: i:prediction o:quantized lsf */ + const int32_t sr_core, /* i : internal sampling rate */ + float *w /* o : lsf weights */ +); + +/*! r: number of allocated bits */ +int16_t vlpc_2st_cod( + const float *lsf, /* i : normalized vector to quantize */ + float *lsfq, /* i/o: i:1st stage o:1st+2nd stage */ + int16_t *indx, /* o : index[] (4 bits per words) */ + const int16_t mode, /* i : 0=abs, >0=rel */ + const int32_t sr_core /* i : internal sampling rate */ +); + +void vlpc_2st_dec( + float *lsfq, /* i/o: i:1st stage o:1st+2nd stage */ + int16_t *indx, /* i : index[] (4 bits per words) */ + const int16_t mode, /* i : 0=abs, >0=rel */ + const int32_t sr_core /* i : internal sampling rate */ +); + +void lsf_weight_2st( + const float *lsfq, + float *w, + const int16_t mode, + const int32_t sr_core ); + +void mdct_window_sine( + float *window, + const int32_t Fs, + const int16_t n, + const int16_t window_type, + const int16_t element_mode ); + +void mdct_window_aldo( + float *window1, + float *window2, + const int16_t n ); + +void AVQ_cod_lpc( + const float nvec[], /* i : vector to quantize */ + int16_t nvecq[], /* o : quantized normalized vector (assuming the bit budget is enough) */ + int16_t *indx, /* o : index[] (4 bits per words) */ + const int16_t Nsv /* i : number of subvectors (lg=Nsv*8) */ +); + +void AVQ_dec_lpc( + const int16_t indx[], /* i : index[] (4 bits per words) */ + int16_t nvecq[], /* o : vector quantized */ + const int16_t Nsv /* i : number of subvectors (lg=Nsv*8) */ +); + +void vlpc_1st_dec( + const int16_t index, /* i : codebook index */ + float *lsfq, /* i/o: i:prediction o:quantized lsf */ + const int32_t sr_core ); + +void WindowSignal( + TCX_CONFIG_HANDLE hTcxCfg, /* i : configuration of TCX */ + int16_t offset, /* i : left folding point offset relative to the input signal pointer */ + const int16_t left_overlap_mode, /* i : overlap mode of left window half */ + const int16_t right_overlap_mode, /* i : overlap mode of right window half */ + int16_t *left_overlap_length, /* o : TCX window left overlap length */ + int16_t *right_overlap_length, /* o : TCX window right overlap length */ + const float in[], /* i : input signal */ + int16_t *L_frame, /* i/o: frame length */ + float out[], /* o : output windowed signal */ + const int16_t truncate_aldo, /* i : nonzero to truncate long ALDO slope */ + const int16_t fullband /* i : fullband flag */ +); + +void HBAutocorrelation( + TCX_CONFIG_HANDLE hTcxCfg, /* i : configuration of TCX */ + const int16_t left_mode, /* i : overlap mode of left window half */ + const int16_t right_mode, /* i : overlap mode of right window half */ + float speech[], /* i : speech */ + int16_t L_frame_glob, /* i/o: frame length */ + float *r /* o : autocorrelations vector */ +); + +void TNSAnalysis( + TCX_CONFIG_HANDLE hTcxCfg, /* i : configuration of TCX */ + const int16_t L_frame, /* i : frame length */ + int16_t L_spec, /* i : length of the spectrum */ + const int16_t transform_type, /* i : transform type for the frame/subframe - TCX20 | TCX10 | TCX 5 (meaning 2 x TCX 5) */ + const int16_t isAfterACELP, /* i : Flag indicating if the last frame was ACELP. For the second TCX subframe it should be 0 */ + float spectrum[], /* i : MDCT spectrum of the subframe */ + TRAN_DET_HANDLE hTranDet, /* i : handle transient detection */ + const float ltp_gain, /* i : ltp gain */ + STnsData *pTnsData, /* o : TNS data */ + int16_t *pfUseTns, /* o : Flag indicating if TNS is used */ + float *predictionGain /* o : TNS prediction gain */ +); + +void CalculateTnsFilt( + STnsConfig const *pTnsConfig, /* i : TNS Configuration struct */ + const float pSpectrum[], /* i : MDCT spectrum */ + STnsData *pTnsData, /* o : TNS data struct */ + float *predictionGain /* o : TNS prediction gain */ +); + +void ShapeSpectrum( + TCX_CONFIG_HANDLE hTcxCfg, /* i : configuration of TCX */ + const float A[], /* i : quantized coefficients NxAz_q[M+1] */ + float gainlpc[], /* o : MDCT gains for the previous frame */ + const int16_t L_frame_glob, /* i : frame length */ + int16_t L_spec, /* i : length of the spectrum */ + float spectrum[], /* i/o: MDCT spectrum */ + const int16_t fUseTns, /* i : Flag indicating if TNS is used */ + Encoder_State *st, /* i/o: encoder state structure */ + float *scf /* i : scale factors */ +); + +void QuantizeSpectrum( + Encoder_State *st, /* i/o: encoder state structure */ + const float A[], /* i : quantized coefficients NxAz_q[M+1] */ + const Word16 Aqind[], /* i : frame-independent quantized coeffs (M+1) */ + float gainlpc[], /* i : MDCT gains of the previous frame */ + float synth[], /* o : synthesis buffer */ + const int16_t nb_bits, /* i : bit budget */ + const int16_t tnsSize, /* i : number of tns parameters put into prm */ + int16_t prm[], /* o : tcx parameters */ + const int16_t frame_cnt, /* i : frame counter in the super_frame */ + CONTEXT_HM_CONFIG *hm_cfg, /* i : HM configuration */ + const int16_t vad_hover_flag /* i : VAD hangover flag */ +); + +/*! r: index of next coefficient */ +int16_t get_next_coeff_mapped( + int16_t ii[2], /* i/o: coefficient indexes */ + int32_t *pp, /* o : peak(1)/hole(0) indicator */ + int16_t *idx, /* o : index in unmapped domain */ + CONTEXT_HM_CONFIG *hm_cfg /* i : HM configuration */ +); + +/*! r: index of next coefficient */ +int16_t get_next_coeff_unmapped( + int16_t *ii, /* i/o: coefficient index */ + int16_t *idx /* o : index in unmapped domain */ +); + +int32_t update_mixed_context( + int32_t ctx, + int16_t a ); + +void ACcontextMapping_encode2_no_mem_s17_LC( + BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ + int16_t *x, + int16_t nt, + int16_t lastnz, + int16_t nbbits, + int16_t resQMaxBits, + CONTEXT_HM_CONFIG *hm_cfg ); + +int16_t ACcontextMapping_decode2_no_mem_s17_LC( + Decoder_State *st, /* i/o: decoder state */ + int16_t *x, /* o : decoded spectrum */ + int16_t nt, /* i : size of spectrum */ + int16_t nbbits, /* i : bit budget */ + int16_t resQMaxBits, /* i : residual coding maximum bits */ + CONTEXT_HM_CONFIG *hm_cfg /* i : context-based harmonic model configuration */ +); + +int16_t ACcontextMapping_encode2_estimate_no_mem_s17_LC( + const int16_t *x, + const int16_t nt, + int16_t *lastnz, + int16_t *nEncoded, + const int16_t target, + int16_t *stop, + CONTEXT_HM_CONFIG *hm_cfg ); + +void RCcontextMapping_encode2_no_mem_s17_LCS( + BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ + int16_t *x, + const int16_t nt, + int16_t lastnz, + const int16_t nbbits, + const int16_t resQMaxBits, + CONTEXT_HM_CONFIG *hm_cfg ); + +int16_t RCcontextMapping_decode2_no_mem_s17_LCS( + Decoder_State *st, /* i/o: decoder state */ + int16_t *x, /* o : decoded spectrum */ + const int16_t nt, /* i : size of spectrum */ + const int16_t nbbits, /* i : bit budget */ + const int16_t resQMaxBits, /* i : residual coding maximum bits */ + CONTEXT_HM_CONFIG *hm_cfg /* i : context-based harmonic model configuration */ +); + +int16_t RCcontextMapping_encode2_estimate_no_mem_s17_LCS( + int16_t *x, /* Spectral coefficients */ + const int16_t nt, /* L - size of spectrum (no. of spectral coefficients) */ + int16_t *lastnz_out, + int16_t *nEncoded, /* No. of spectral coefficients that can be coded without an overflow occuring */ + const int16_t target, /* Target bits */ + int16_t *stop, + int16_t mode, + CONTEXT_HM_CONFIG *hm_cfg /* context-based harmonic model configuration */ +); + +int16_t RCcontextMapping_encode2_estimate_bandWise_start( + int16_t *x, + const int16_t nt, + const int16_t target, + HANDLE_RC_CONTEXT_MEM hContextMem ); + +int16_t RCcontextMapping_encode2_estimate_bandWise( + int16_t *x, + const int16_t start_line, + const int16_t end_line, + HANDLE_RC_CONTEXT_MEM hContextMem ); + +void tcx_get_windows( + TCX_CONFIG_HANDLE hTcxCfg, /* i : TCX configuration */ + const int16_t left_mode, /* i : overlap mode of left window half */ + const int16_t right_mode, /* i : overlap mode of right window half */ + int16_t *left_overlap, /* o : left overlap length */ + const float **left_win, /* o : left overlap window */ + int16_t *right_overlap, /* o : right overlap length */ + const float **right_win, /* o : right overlap window */ + const int16_t fullband /* i : fullband flag */ +); + +void tcx_windowing_analysis( + const float *signal, /* i : signal vector */ + const int16_t L_frame, /* i : frame length */ + const int16_t left_overlap, /* i : left overlap length */ + const float *left_win, /* i : left overlap window */ + const int16_t right_overlap, /* i : right overlap length */ + const float *right_win, /* i : right overlap window */ + float *output /* o : windowed signal vector */ +); + +void tcx_windowing_synthesis_current_frame( + float *signal, /* i/o: signal vector */ + const float *window, /* i : TCX window vector */ + const float *window_half, /* i : TCX window vector for half-overlap window */ + const float *window_min, /* i : TCX minimum overlap window */ + const int16_t window_length, /* i : TCX window length */ + const int16_t window_half_length, /* i : TCX half window length */ + const int16_t window_min_length, /* i : TCX minimum overlap length */ + const int16_t left_rect, /* i : left part is rectangular */ + const int16_t left_mode, /* i : overlap mode of left window half */ + float *acelp_zir, /* i/o: acelp ZIR */ + const float *old_syn, /* i : old synthesis */ + const float *syn_overl, /* i : overlap synthesis */ + const float *A_zir, + const float *window_trans, /* i : window for transition from ACELP */ + int16_t acelp_zir_len, + const int16_t acelp_mem_len, + const int16_t last_core_bfi, /* i : last mode */ + const int16_t last_is_cng, + const int16_t fullbandScale ); + +void tcx_windowing_synthesis_past_frame( + float *signal, /* i/o: signal vector */ + const float *window, /* i : TCX window vector */ + const float *window_half, /* i : TCX window vector for half-overlap window */ + const float *window_min, /* i : TCX minimum overlap window */ + const int16_t window_length, /* i : TCX window length */ + const int16_t window_half_length, /* i : TCX half window length */ + const int16_t window_min_length, /* i : TCX minimum overlap length */ + const int16_t right_mode /* i : overlap mode (left_mode of current frame) */ +); + +void ProcessIGF( + Encoder_State *st, /* i : Encoder state */ + float *pMDCTSpectrum, /* i : MDCT spectrum */ + const float *pITFMDCTSpectrum, /* i : MDCT spectrum fir ITF */ + float *pPowerSpectrum, /* i : MDCT^2 + MDST^2 spectrum, or estimate */ + const int16_t isTCX20, /* i : flag indicating if the input is TCX20 or TCX10/2xTCX5 */ + const int16_t frameno, /* i : flag indicating index of current subframe */ + const int16_t sp_aud_decision0, /* i : first stage switching decision */ + const int16_t vad_hover_flag /* i : VAD hangover flag */ +); + +void ProcessStereoIGF( + STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct, + Encoder_State *sts[CPE_CHANNELS], /* i : Encoder state */ + int16_t ms_mask[2][MAX_SFB], /* i : bandwise MS mask */ + float *pITFMDCTSpectrum[CPE_CHANNELS][NB_DIV], /* i : MDCT spectrum fir ITF */ + float *pPowerSpectrum[CPE_CHANNELS], /* i/o: MDCT^2 + MDST^2 spectrum, or estimate */ + float *pPowerSpectrumMsInv[CPE_CHANNELS][NB_DIV], /* i : inverse power spectrum */ + float *inv_spectrum[CPE_CHANNELS][NB_DIV], /* i : inverse spectrum */ + const int16_t frameno, /* i : flag indicating index of current subframe*/ + const int16_t sp_aud_decision0, /* i : sp_aud_decision0 */ + const int32_t element_brate, /* i : element bitrate */ + const int16_t mct_on /* i : flag mct block (1) or stereo (0) */ +); + +void AnalyzePowerSpectrum( + Encoder_State *st, /* i/o: encoder states */ + const int16_t L_frame, /* i : frame length */ + const int16_t L_frameTCX, /* i : full band frame length */ + const int16_t left_overlap, /* i : left overlap length */ + const int16_t right_overlap, /* i : right overlap length */ + const float mdctSpectrum[], /* i : MDCT spectrum */ + const float signal[], /* i : windowed signal corresponding to mdctSpectrum */ + float powerSpec[] /* o : Power spectrum */ +); + +void lpc2mdct( + float *lpcCoeffs, + const int16_t lpcOrder, + float mdct_gains[], + const int16_t length, + const int16_t noInverse ); + +void mdct_preShaping( + float x[], + const int16_t lg, + const float gains[] ); + +void mdct_noiseShaping( + float x[], + const int16_t lg, + const float gains[], + const int16_t nBands ); + +void AdaptLowFreqEmph( + float x[], + int16_t xq[], + float invGain, + const int16_t tcx_lpc_shaped_ari, + const float lpcGains[], + const int16_t lg ); + +void PsychAdaptLowFreqEmph( + float x[], + const float lpcGains[] ); + +void PsychAdaptLowFreqDeemph( + float x[], + const float lpcGains[], + float lf_deemph_factors[] ); + +void AdaptLowFreqDeemph( + float x[], + int16_t tcx_lpc_shaped_ari, + const float lpcGains[], + const int16_t lg, + float lf_deemph_factors[] ); + +/*! r: SQ gain */ +float SQ_gain( + const float x[], /* i : vector to quantize */ + const int16_t nbitsSQ, /* i : number of bits targeted */ + const int16_t lg /* i : vector size (2048 max) */ +); + +/*! r: SQ gain */ +float SQ_gain_estimate( + const float x[], /* i : vector to quantize */ + const int16_t nbitsSQ, /* i : number of bits targeted */ + const int16_t lg /* i : vector size (2048 max) */ +); + + +void tcx_scalar_quantization( + float *x, /* i : input coefficients */ + int16_t *xq, /* o : quantized coefficients */ + const int16_t L_frame, /* i : frame length */ + const float gain, /* i : quantization gain */ + const float offset, /* i : rounding offset (deadzone) */ + int16_t *memQuantZeros, /* o : coefficients set to 0 */ + const int16_t tcxonly ); + +int16_t tcx_scalar_quantization_rateloop( + float *x, /* i : input coefficients */ + int16_t *xq, /* o : quantized coefficients */ + const int16_t L_frame, /* i : frame length */ + float *gain, /* i/o: quantization gain */ + float offset, /* i : rounding offset (deadzone) */ + int16_t *memQuantZeros, /* o : coefficients set to 0 */ + int16_t *lastnz_out, /* i/o: last nonzero coeff index */ + const int16_t target, /* i : target number of bits */ + int16_t *nEncoded, /* o : number of encoded coeff */ + int16_t *stop, /* i/o: stop param */ + const int16_t sqBits_in_noStop, /* i : number of sqBits as determined in prev. quant. stage, w/o using stop mechanism (ie might exceed target bits) */ + const int16_t sqBits_in, /* i : number of sqBits as determined in prev. quant. stage, using stop mechanism (ie always <= target bits) */ + const int16_t tcxRateLoopOpt, /* i : turns on/off rateloop optimization */ + const int16_t tcxonly, + CONTEXT_HM_CONFIG *hm_cfg, + const int16_t iter_max, + const int16_t element_mode ); + +void tcx_QuantizeGain( + const int16_t n, + float *pGain, + int16_t *pQuantizedGain ); + +void tcx_noise_factor( + const float *x_orig, /* i : unquantized mdct coefficients */ + float *sqQ, /* i/o: quantized mdct coefficients */ + const int16_t iFirstLine, /* i : first coefficient to be considered */ + const int16_t lowpassLine, /* i : last nonzero coefficients after low-pass */ + const int16_t nMinHoleSize, /* i : minimum size of hole to be checked */ + const int16_t L_frame, /* i : frame length */ + const float gain_tcx, /* i : tcx gain */ + const float tiltCompFactor, /* i : LPC tilt compensation factor */ + float *fac_ns, /* o : noise factor */ + int16_t *quantized_fac_ns, /* o : quantized noise factor */ + const int16_t element_mode /* i : IVAS element mode */ +); + +void tcx_noise_filling( + float *Q, + const int16_t noiseFillSeed, + const int16_t iFirstLine, + const int16_t lowpassLine, + const int16_t nTransWidth, + const int16_t L_frame, + const float tiltCompFactor, + float fac_ns, + uint8_t *infoTCXNoise, + const int16_t element_mode /* i : IVAS element mode */ +); + +void tcx_encoder_memory_update( + Encoder_State *st, /* i/o: encoder memory state */ + float *xn_buf, /* i/o: mdct output buffer/TD weigthed synthesis */ + const float *Ai, /* i : Unquantized (interpolated) LPC coefficients */ + const float *A /* i : Quantized LPC coefficients */ +); + +void tcx_decoder_memory_update( + Decoder_State *st, /* i/o: decoder memory state */ + const float *xn_buf, /* i : mdct output buffer */ + float *synth, /* i/o: synth */ + const float *A /* i : Quantized LPC coefficients */ +); + +/*! r: number of bits used (including "bits") */ +int16_t tcx_ari_res_Q_spec( + const float x_orig[], /* i : original spectrum */ + const int16_t signs[], /* i : signs (x_orig[.]<0) */ + float x_Q[], /* i/o: quantized spectrum */ + const int16_t L_frame, /* i : number of lines */ + const float gain, /* i : TCX gain */ + int16_t prm[], /* o : bitstream */ + int16_t target_bits, /* i : number of bits available */ + int16_t bits, /* i : number of bits used so far */ + const float deadzone, /* i : quantizer deadzone */ + const float x_fac[] /* i : spectrum post-quantization factors */ +); + +/*! r: number of bits used (including "bits") */ +int16_t tcx_ari_res_invQ_spec( + float x_Q[], /* i/o: quantized spectrum */ + const int16_t L_frame, /* i : number of lines */ + const int16_t prm[], /* i : bitstream */ + int16_t target_bits, /* i : number of bits available */ + int16_t bits, /* i : number of bits used so far */ + const float deadzone, /* i : quantizer deadzone */ + const float x_fac[] /* i : spectrum post-quantization factors */ +); + +int16_t tcx_res_Q_gain( + float sqGain, + float *gain_tcx, + int16_t *prm, + int16_t sqTargetBits ); + +int16_t tcx_res_Q_spec( + const float *x_orig, + float *x_Q, + const int16_t L_frame, + const float sqGain, + int16_t *prm, + int16_t sqTargetBits, + int16_t bits, + const float sq_round, + const float lf_deemph_factors[] ); + +int16_t tcx_res_invQ_gain( + float *gain_tcx, + const int16_t *prm, + const int16_t resQBits ); + +int16_t tcx_res_invQ_spec( + float *x, + const int16_t L_frame, + const int16_t *prm, + int16_t resQBits, + int16_t bits, + const float sq_round, + const float lf_deemph_factors[] ); + +void InitTnsConfigs( + const int16_t bwidth, + const int16_t L_frame, + STnsConfig tnsConfig[2][2], + const int16_t igfStopFreq, + const int32_t total_brate, + const int16_t element_mode, + const int16_t MCT_flag ); + +void SetAllowTnsOnWhite( + STnsConfig tnsConfig[2][2], + const int8_t allowTnsOnWhite ); + +void SetTnsConfig( + TCX_CONFIG_HANDLE hTcxCfg, + const int16_t isTCX20, + const int16_t isAfterACELP ); + +void ari_copy_states( + Tastat *source, + Tastat *dest ); + +int32_t mul_sbc_14bits( + int32_t r, + int32_t c ); + +void ari_start_encoding_14bits( + Tastat *s ); + +int16_t ari_encode_14bits_ext( + int16_t *ptr, + int16_t bp, + Tastat *s, + int32_t symbol, + const uint16_t *cum_freq ); + +int16_t ari_done_encoding_14bits( + int16_t *ptr, + int16_t bp, + Tastat *s ); + +void ari_start_decoding_14bits( + Decoder_State *st, + Tastat *s ); + +int16_t ari_start_decoding_14bits_prm( + const int16_t *ptr, + int16_t bp, + Tastat *s ); + +void ari_decode_14bits_s17_ext( + Decoder_State *st, + uint16_t *res, + Tastat *s, + const uint16_t *cum_freq ); + +void ari_decode_14bits_s27_ext( + Decoder_State *st, + uint16_t *res, + Tastat *s, + const uint16_t *cum_freq ); + +void ari_decode_14bits_bit_ext( + Decoder_State *st, + uint16_t *res, + Tastat *s ); + +/*! r: Q15 */ +Word16 expfp( + const Word16 x, /* i : mantissa Q15-e */ + const Word16 x_e /* i : exponent Q0 */ +); + +void powfp_odd2( + const Word16 base, /* Q15 */ + const Word16 exp, /* Q0 */ + Word16 *pout1, /* Q15 */ + Word16 *pout2 /* Q15 */ +); + +void tcx_arith_scale_envelope( + const Word16 L_spec_core, /* i : number of lines to scale Q0 */ + Word16 L_frame, /* i : number of lines Q0 */ + const Word32 env[], /* i : unscaled envelope Q16 */ + Word16 target_bits, /* i : number of available bits Q0 */ + const Word16 low_complexity, /* i : low-complexity flag Q0 */ + Word16 s_env[], /* o : scaled envelope Q15-e */ + Word16 *s_env_e /* o : scaled envelope exponent Q0 */ +); + +void tcx_arith_render_envelope( + const Word16 A_ind[], /* i : LPC coefficients of signal envelope */ + const Word16 L_frame, /* i : number of spectral lines */ + const Word16 L_spec, /* i : length of the coded spectrum */ + const Word16 preemph_fac, /* i : pre-emphasis factor */ + const Word16 gamma_w, /* i : A_ind -> weighted envelope factor */ + const Word16 gamma_uw, /* i : A_ind -> non-weighted envelope factor */ + Word32 env[] /* o : shaped signal envelope */ +); + +int16_t ari_encode_14bits_range( + int16_t *ptr, + int16_t bp, + int32_t bits, + Tastat *s, + uint16_t cum_freq_low, + uint16_t cum_freq_high ); + +int16_t ari_encode_14bits_sign( + int16_t *ptr, + int16_t bp, + int32_t bits, + Tastat *s, + int32_t sign ); + +int16_t ari_done_cbr_encoding_14bits( + int16_t *ptr, + int16_t bp, + int32_t bits, + Tastat *s ); + +int16_t ari_decode_14bits_pow( + const int16_t *ptr, + int16_t bp, + int16_t bits, + int16_t *res, + Tastat *s, + uint16_t base ); + +int16_t ari_decode_14bits_sign( + const int16_t *ptr, + int16_t bp, + int16_t bits, + uint16_t *res, + Tastat *s ); + +void tcx_arith_encode_envelope( + float spectrum[], /* i/o: MDCT coefficients */ + int16_t signs[], /* o : signs (spectrum[.]<0) */ + const int16_t L_frame, /* i : frame or MDCT length */ + const int16_t L_spec, /* i : length w/o BW limitation */ + Encoder_State *st, /* i/o: coder state */ + const Word16 A_ind[], /* i : quantised LPC coefficients */ + int16_t target_bits, /* i : number of available bits */ + int16_t prm[], /* o : bitstream parameters */ + const int16_t use_hm, /* i : use HM in current frame? */ + int16_t prm_hm[], /* o : HM parameter area */ + const int16_t tcxltp_pitch, /* i : TCX LTP pitch in FD, -1 if n/a*/ + int16_t *arith_bits, /* o : bits used for ari. coding */ + int16_t *signaling_bits, /* o : bits used for signaling */ + const int16_t low_complexity /* i : low-complexity flag */ +); + +void tcx_arith_decode_envelope( + Decoder_State *st, /* i/o: coder state */ + float q_spectrum[], /* o : quantised MDCT coefficients */ + const int16_t L_frame, /* i : frame or MDCT length */ + int16_t L_spec, /* i : length w/o BW limitation */ + const Word16 A_ind[], /* i : quantised LPC coefficients */ + const int16_t target_bits, /* i : number of available bits */ + const int16_t prm[], /* i : bitstream parameters */ + const int16_t use_hm, /* i : use HM in current frame? */ + const int16_t prm_hm[], /* i : HM parameter area */ + int16_t tcxltp_pitch, /* i : TCX LTP pitch in FD, -1 if n/a*/ + int16_t *arith_bits, /* o : bits used for ari. coding */ + int16_t *signaling_bits, /* o : bits used for signaling */ + const int16_t low_complexity /* i : low-complexity flag */ +); + +void UnmapIndex( + const int16_t PeriodicityIndex, + const int16_t Bandwidth, + const int16_t LtpPitchLag, + const int16_t SmallerLags, + int16_t *FractionalResolution, + int32_t *Lag ); + +/*! r: PeriodicityIndex */ +int16_t SearchPeriodicityIndex( + const float Mdct[], /* i : Coefficients, Mdct[0..NumCoeffs-1] */ + const float UnfilteredMdct[], /* i : Unfiltered coefficients, UnfilteredMdct[0..NumCoeffs-1] */ + const int16_t NumCoeffs, /* i : Number of coefficients */ + const int16_t shortTargetBits, /* i : Target bit budget (excl. Done flag) */ + const int16_t LtpPitchLag, /* i : TCX-LTP pitch */ + const float LtpGain, /* i : LTP gain */ + float *RelativeScore /* o : Energy concentration factor */ +); + +void ConfigureContextHm( + const int16_t NumCoeffs, /* i : Number of coefficients */ + const int16_t TargetBits, /* i : Target bit budget (excl. Done flag) */ + const int16_t PeriodicityIndex, /* i : Pitch related index */ + const int16_t LtpPitchLag, /* i : TCX-LTP pitch in F.D. */ + CONTEXT_HM_CONFIG *hm_cfg /* o : Context-based harmonic model configuration */ +); + +int16_t EncodeIndex( + const int16_t Bandwidth, /* o : NB, 1: (S)WB */ + int16_t PeriodicityIndex, + BSTR_ENC_HANDLE hBstr ); + +int16_t CountIndexBits( + const int16_t Bandwidth, /* o : NB, 1: (S)WB */ + const int16_t PeriodicityIndex ); + +int16_t DecodeIndex( + Decoder_State *st, + const int16_t Bandwidth, /* o : NB, 1: (S)WB */ + int16_t *PeriodicityIndex ); + +#define GET_ADJ( T, L ) GET_ADJ2( T, L, *FractionalResolution ) +#define GET_ADJ2( T, L, F ) ( ( ( L ) << ( F ) ) - ( T ) ) + +int16_t tcx_hm_render( + const int16_t lag, /* i : pitch lag */ + const int16_t fract_res, /* i : fractional resolution of the lag */ + Word16 p[] /* o : harmonic model (Q13) */ +); + +void tcx_hm_modify_envelope( + const Word16 gain, /* i : HM gain (Q11) */ + const int16_t lag, + const int16_t fract_res, + const Word16 p[], /* i : harmonic model (Q13) */ + Word32 env[], /* i/o: envelope (Q16) */ + const int16_t L_frame /* i : number of spectral lines */ +); + +void tcx_hm_analyse( + const float abs_spectrum[], /* i : absolute spectrum */ + const int16_t L_frame, /* i : number of spectral lines */ + Word32 env[], /* i/o: envelope shape (Q16) */ + const int16_t targetBits, /* i : target bit budget */ + const int16_t coder_type, /* i : GC/VC coder type */ + int16_t prm_hm[], /* o : HM parameters */ + int16_t LtpPitchLag, /* i : LTP pitch lag or -1 if none */ + const float LtpGain, /* i : LTP gain */ + int16_t *hm_bits /* o : bit consumption */ +); + +void tcx_hm_decode( + const int16_t L_frame, /* i : number of spectral lines */ + Word32 env[], /* i/o: envelope shape (Q16) */ + const int16_t targetBits, /* i : target bit budget */ + const int16_t coder_type, /* i : GC/VC coder type */ + const int16_t prm_hm[], /* i : HM parameters */ + const int16_t LtpPitchLag, /* i : LTP pitch lag or -1 if none */ + int16_t *hm_bits /* o : bit consumption */ +); + +void coder_tcx( + Encoder_State *st, /* i/o: encoder state structure */ + TCX_CONFIG_HANDLE hTcxCfg, /* i : configuration of TCX */ + const float A[], /* i : quantized coefficients NxAz_q[M+1] */ + const Word16 Aqind[], /* i : frame-independent quantized coefficients (M+1) */ + float synth[], /* o : decoded synthesis */ + const int16_t L_frame_glob, /* i : frame length */ + const int16_t L_frameTCX_glob, + const int16_t L_spec, + int16_t nb_bits, /* i : bit budget */ + float spectrum[], /* i/o: MDCT spectrum */ + int16_t prm[], /* o : tcx parameters */ + CONTEXT_HM_CONFIG *hm_cfg, + const int16_t vad_hover_flag /* i : VAD hangover flag */ +); + +void coder_tcx_post( + Encoder_State *st, /* i/o: encoder memory state */ + float *A, /* o : Quantized LPC coefficients */ + const float *Ai /* i : Unquantized (interpolated) LPC coefficients */ +); + +void decoder_tcx( + Decoder_State *st, /* i/o: coder memory state */ + int16_t prm[], /* i : parameters */ + float A[], /* i : coefficients NxAz[M+1] */ + Word16 Aind[], /* i : frame-independent coefficients Az[M+1]*/ + float synth[], /* i/o: synth[-M..lg] */ + float synthFB[], /* i/o: encoder memory state */ + const int16_t bfi, /* i : Bad frame indicator */ + const int16_t frame_cnt, /* i : frame counter in the super_frame */ + const int16_t sba_dirac_stereo_flag /* i : signal stereo output for SBA DirAC */ +); + +void decoder_tcx_post( + Decoder_State *st, /* i/o: decoder memory state */ + float *synth, + float *synthFB, + float *A, /* i : A(z) filter coefficients */ + const int16_t bfi, + const int16_t isMCT ); + +void coder_acelp( + Encoder_State *st, /* i/o: coder memory state */ + const float A[], /* i : coefficients 4xAz[M+1] */ + const float Aq[], /* i : coefficients 4xAz_q[M+1] */ + const float speech[], /* i : speech[-M..lg] */ + LPD_state *LPDmem, /* i/o: ACELP memories */ + int16_t *prm, /* o : acelp parameters */ + const float stab_fac, + const int16_t target_bits, + float *gain_pitch_buf, /* o : gain pitch values */ + float *gain_code_buf, /* o : gain code values */ + float *pitch_buf, /* o : pitch values for each subfr.*/ + float *voice_factors, /* o : voicing factors */ + float *bwe_exc /* o : excitation for SWB TBE */ +); + +void coder_acelp_rf( + const int16_t target_bits, /* i : target bits */ + const float speech[], /* i : speech[-M..lg] */ + const int16_t coder_type, /* i : coding type */ + const int16_t rf_frame_type, /* i : rf_frame_type */ + const float A[], /* i : coefficients 4xAz[M+1] */ + const float Aq[], /* i : coefficients 4xAz_q[M+1] */ + const float voicing[], /* i : open-loop LTP gain */ + const int16_t T_op[], /* i : open-loop LTP lag */ + const float stab_fac, /* i : LP stability factor */ + Encoder_State *st, /* i/o: coder memory state */ + ACELP_config *acelp_cfg, /* i/o: configuration of the ACELP */ + float *exc_rf, /* i/o: pointer to RF excitation */ + float *syn_rf /* i/o: pointer to RF synthesis */ +); + +void decoder_acelp( + Decoder_State *st, /* i/o: coder memory state */ + int16_t prm[], /* i : parameters */ + const float A[], /* i : coefficients NxAz[M+1] */ + ACELP_config acelp_cfg, /* i : ACELP config */ + float synth[], /* i/o: synthesis */ + int16_t *pT, /* o : pitch for all subframe */ + float *pgainT, /* o : pitch gain for all subfr */ + const float stab_fac, /* i : stability of isf */ + float *pitch_buffer, /* o : pitch values for each subfr.*/ + float *voice_factors, /* o : voicing factors */ + const int16_t LSF_Q_prediction, /* i : LSF prediction mode */ + float *bwe_exc /* o : excitation for SWB TBE */ +); + +void writeTCXMode( + Encoder_State *st, /* i/o: encoder state structure */ + BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ + const int16_t MCT_flag, /* i : hMCT handle allocated (1) or not (0)*/ + int16_t *nbits_start /* o : nbits start */ +); + +void writeTCXWindowing( + BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ + const int16_t overlap_mode /* i : overlap mode */ +); + +void writeLPCparam( + Encoder_State *st, /* i/o: encoder state structure */ + BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ + const int16_t param_lpc[], /* i : LPC parameters to write */ + const int16_t bits_param_lpc[], /* i : bits per LPC parameter */ + const int16_t no_param_lpc, /* i : number of LPC parameters */ + int16_t *nbits_lpc /* o : LPC bits written */ +); + +void enc_prm( + Encoder_State *st, /* i/o: encoder state structure */ + int16_t param[], /* i : parameters */ + int16_t param_lpc[], /* i : LPC parameters */ + CONTEXT_HM_CONFIG hm_cfg[], + const int16_t bits_param_lpc[], + const int16_t no_param_lpc ); + +void writeTCXparam( + Encoder_State *st, /* i/o: Encoder State handle */ + BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ + CONTEXT_HM_CONFIG hm_cfg[], /* i/o: HM config */ + int16_t param[], /* i : parameters */ + const int16_t nbits_header, + const int16_t nbits_start, + const int16_t nbits_lpc, + const int16_t *no_param_tns, /* i : number of TNS parameters per subframe */ + int16_t p_param[2], /* i/o: pointer to parameters from previous bs writing */ + const int16_t target_bitsTCX10[2], + const int16_t pre_past_flag ); + +void enc_prm_rf( + Encoder_State *st, /* i/o: encoder memory state */ + const int16_t rf_frame_type, + const int16_t fec_offset ); + +void dec_prm_hm( + Decoder_State *st, /* i/o: decoder memory state */ + int16_t *prm_hm, + const int16_t hm_size ); + +void dec_prm( + Decoder_State *st, /* i/o: decoder memory state */ + int16_t param[], /* o : decoded parameters */ + int16_t param_lpc[], /* i : LPC parameters */ + int16_t *total_nbbits, /* i/o: number of bits / decoded bits */ + int16_t *bitsRead ); + +void gauss_L2( + const float h[], /* i : weighted LP filter impulse response */ + float code[], /* o : gaussian excitation */ + float y2[], /* i : zero-memory filtered code. excitation */ + float y11[], /* o : zero-memory filtered gauss. excitation */ + float *gain, /* o : excitation gain */ + float g_corr[], /* i/o: correlation structure for gain coding */ + float tilt_code, /* i : tilt of code */ + const float *Aq, /* i : quantized LPCs */ + float formant_enh_num, /* i : formant enhancement factor */ + int16_t *seed_acelp /* i/o: random seed */ +); + +void gaus_L2_dec( + float *code, /* o : decoded gaussian codevector */ + float tilt_code, + const float *A, + float formant_enh_num, + int16_t *seed_acelp /* i/o: random seed */ +); + +/*! r: interpolated value */ +float interpolation( + const float *x, /* i : input vector */ + const float *win, /* i : interpolation window */ + const int16_t frac, /* i : fraction */ + const int16_t up_samp, /* i : upsampling factor */ + const int16_t nb_coef /* i : nb of filter coef */ +); + +void predict_signal( + const float excI[], /* i : input excitation buffer */ + float excO[], /* o : output excitation buffer */ + const int16_t T0, /* i : integer pitch lag */ + int16_t frac, /* i : fraction of lag */ + const int16_t frac_max, /* i : max fraction */ + const int16_t L_subfr /* i : subframe size */ +); + +void tcx_ltp_encode( + Encoder_State *st, + const int16_t tcxMode, + const int16_t L_frame, + const float *speech, + float *speech_ltp, + const float *wsp, + const int16_t Top[], + int16_t *ltp_param, + int16_t *ltp_bits, + float *A, + const int16_t disable_ltp, + const int16_t element_mode ); + +void tcx_ltp_post( + Decoder_State *st, + TCX_LTP_DEC_HANDLE hTcxLtpDec, + const int16_t core, + const int16_t output_frame, + const int16_t L_frame, + float sig[], + const float tcx_buf[] ); + +int16_t tcx_ltp_decode_params( + int16_t *ltp_param, + int16_t *pitch_int, + int16_t *pitch_fr, + float *gain, + const int16_t pitmin, + const int16_t pitfr1, + const int16_t pitfr2, + const int16_t pitmax, + const int16_t pitres ); + +int16_t enc_lsf_tcxlpc( + const int16_t **indices, /* i : Ptr to VQ indices */ + BSTR_ENC_HANDLE hBstr /* i/o: encoder bitstream handle */ +); + +void msvq_enc( + const float *const *cb, /* i : Codebook (indexed cb[*stages][levels][p]) */ + const int16_t dims[], /* i : Dimension of each codebook stage (NULL: full dim.) */ + const int16_t offs[], /* i : Starting dimension of each codebook stage (NULL: 0) */ + const float u[], /* i : Vector to be encoded (prediction and mean removed) */ + const int16_t *levels, /* i : Number of levels in each stage */ + const int16_t maxC, /* i : Tree search size (number of candidates kept from one stage to the next == M-best) */ + const int16_t stages, /* i : Number of stages */ + const float w[], /* i : Weights */ + const int16_t N, /* i : Vector dimension */ + const int16_t maxN, /* i : Codebook dimension */ + const int16_t applyDCT_flag, /* i : applyDCT flag */ + float *invTrfMatrix, /* i/o: expanded synthesis matrix */ + int16_t Idx[] /* o : Indices */ +); + +void msvq_dec( + const float *const *cb, /* i : Codebook (indexed cb[*stages][levels][p]) */ + const int16_t dims[], /* i : Dimension of each codebook stage (NULL: full dim.) */ + const int16_t offs[], /* i : Starting dimension of each codebook stage (NULL: 0) */ + const int16_t stages, /* i : Number of stages */ + const int16_t N, /* i : Vector dimension */ + const int16_t maxN, /* i : Codebook dimension */ + const int16_t Idx[], /* i : Indices */ + const int16_t applyIDCT_flag, /* i : applyIDCT flag */ + const float *invTrfMatrix, /* i : synthesis matrix */ + float *uq, /* o : quantized vector */ + Word16 *uq_ind /* o : quantized vector (fixed point) */ +); + + +void dec_FDCNG_MSVQ_stage1( + int16_t j_full, /* i : index full range */ + int16_t n, /* i : dimension to generate */ + const float *invTrfMatrix, /* i : IDCT matrix for synthesis */ + const DCTTYPE idcttype, /* i : specify which IDCT */ + float *uq, /* o : synthesized stage1 vector */ + Word16 *uq_ind /* o : synthesized stage1 vector in BASOP */ +); + +void create_IDCT_N_Matrix( + float *inv_matrixFloatQ, /* i/o: RAM buffer */ + const int16_t N, /* i : DCT length, number of time samples */ + const int16_t n_cols, /* i : number of dct coeffs (as DCT may be truncated) */ + const int16_t alloc_size /* i : RAM buffer size in elements */ +); + +void dctT2_N_apply_matrix( + const float *input, /* i : input in fdcng or DCT(fdcng) domain */ + float *output, /* o : output in DCT(fdcng) or fdcng ordomain */ + const int16_t dct_dim, /* i : dct processing dim possibly truncated */ + const int16_t fdcngvq_dim, /* i : fdcng domain length */ + const float *matrix, /* i : IDCT matrix */ + const int16_t matrix_row_dim, /* i : */ + const DCTTYPE dcttype /* i : matrix operation type */ +); + +void extend_dctN_input( + const float *input, /* i : input in fdcng domain */ + const float *dct_input, /* i : input in dctN(fdcng) domain */ + const int16_t in_dim, /* i : in_dim == N */ + float *ext_sig, /* o : extended output in fdcng domain */ + const int16_t out_dim, /* i : output total dim */ + float *matrix, /* i : idct synthesis matrix N rows, n_cols columns */ + const int16_t n_cols, /* i : number of columns == DCT truncation length */ + const DCTTYPE dcttype /* i : matrix operation type */ +); + +/*! r: (p_max , best candidate sofar ) */ +int16_t msvq_stage1_dct_search( + const float *u, /* i : target */ + const int16_t N, /* i : target length and IDCT synthesis length */ + const int16_t maxC_st1, /* i : number of final stage 1 candidates to provide */ + const DCTTYPE dcttype, /* e.g. DCT_T2_16_XX, DCT_T2_24_XX; */ + const int16_t max_dct_trunc, /* i : maximum of truncation lenghts */ + float *invTrfMatrix, /* i : IDCT synthesis matrix for dim N */ + const float *midQ_truncQ, /* i : midQ vector */ + const float *dct_invScaleF, /* i : global inv scale factors */ + const float *dct_scaleF, /* i : global scale factors */ + const Word16 n_segm, /* i : number of segments */ + const Word16 *cols_per_segment, /* i : remaining length per segment */ + const Word16 *trunc_dct_cols_per_segment, /* i : trunc length per segment */ + const Word16 *entries_per_segment, /* i : number of rows per segment */ + const Word16 *cum_entries_per_segment, /* i : number of cumulative entries */ + const Word8 *const W8Qx_dct_sections[], /* i : Word8(byte) segment table ptrs */ + const Word16 *col_syn_shift[], /* i : columnwise syn shift tables */ + const Word8 *segm_neighbour_fwd, /* i : circular neighbour list fwd */ + const Word8 *segm_neighbour_rev, /* i : circular neighbour list reverse */ + const Word16 npost_check, /* i : number of neigbours to check , should be even */ + float *st1_mse_ptr, /* i : dynRAM buffer for MSEs */ + int16_t *indices_st1_local, /* o : selected cand indices */ + float *st1_syn_vec_ptr, /* i/o: buffer for IDCT24 synthesis */ + float *dist1_ptr /* o : resulting stage 1 MSEs in DCT-N domain */ +); + +/*! r: (updated p_max) */ +int16_t msvq_stage1_dct_recalc_candidates_fdcng_wb( + const float *st1_syn_vec_ptr, /* i : IDCT24 synthesis vectors */ + const float *u, /* i : target signal */ + const int16_t maxC_st1, /* i : number of candidates in stage1 */ + float *dist_ptr /* i/o: updated MSE vector for stage1 */ +); + +void PulseResynchronization( + const float *src_exc, /* i : Input excitation buffer */ + float *dst_exc, /* o : output excitation buffer */ + const int16_t nFrameLength, /* i : frame length */ + const int16_t nSubframes, /* i : Number of subframes */ + const float pitchStart, /* i : Pitch at the end of the last frame */ + const float pitchEnd /* i : Pitch at the end of the current frame */ +); + +void con_acelp( + float A[], /* i : coefficients NxAz[M+1] */ + const int16_t coder_type, /* i : ACELP coder type */ + float synth[], /* i/o: synthesis */ + int16_t *pT, /* o : pitch for all subframe */ + float *pgainT, /* o : pitch gain for all subfr */ + float stab_fac, /* i : stability of isf */ + Decoder_State *st, /* i/o: coder memory state */ + float pitch_buffer[], /* i/o: floating pitch values for each subframe */ + float *voice_factors, /* o : voicing factors */ + float *bwe_exc /* o : excitation for SWB TBE */ +); + +void con_tcx( + Decoder_State *st, /* i/o: coder memory state */ + float synth[], /* i/o: synth[] */ + const float coh, /* i : coherence of stereo signal */ + int16_t *noise_seed, /* i/o: noise seed for stereo */ + const int16_t only_left, /* i : TD-PLC only in left channel */ + const float A_cng[] /* i : CNG LP filter coefficients */ +); + +/*! r: codebook index */ +int16_t tcxlpc_get_cdk( + const int16_t coder_type /* i : GC/VC indicator */ +); + +int16_t lsf_msvq_ma_encprm( + BSTR_ENC_HANDLE hBstr, + const int16_t *param_lpc, + const int16_t core, + const int16_t acelp_mode, + const int16_t acelp_midLpc, + const int16_t bits_param_lpc[], + const int16_t no_indices ); + +int16_t lsf_msvq_ma_decprm( + Decoder_State *st, + int16_t *param_lpc ); + +int16_t dec_lsf_tcxlpc( + Decoder_State *st, /* i : Decoder state */ + int16_t **indices, /* o : Ptr to VQ indices */ + const int16_t narrowband, /* i : narrowband flag */ + const int16_t cdk /* i : codebook selector */ +); + +int16_t D_lsf_tcxlpc( + const int16_t indices[], /* i : VQ indices */ + float lsf_q[], /* o : quantized lsf */ + Word16 lsp_q_ind[], /* o : quantized lsp (w/o MA prediction) */ + const int16_t narrowband, /* i : narrowband flag */ + const int16_t cdk, /* i : codebook selector */ + const float mem_MA[] /* i : MA memory */ +); + +void lsf_update_memory( + const int16_t narrowband, /* i : narrowband flag */ + const float qlsf[], /* i : quantized lsf coefficients */ + float old_mem_MA[], /* i : MA memory */ + float mem_MA[] /* o : updated MA memory */ +); + +int16_t Q_lsf_tcxlpc( + /* const */ float lsf[], /* i : original lsf */ + float lsf_q[], /* o : quantized lsf */ + Word16 lsp_q_ind[], /* o : quantized lsp (w/o MA prediction) */ + int16_t indices[], /* o : VQ indices */ + const int16_t narrowband, /* i : narrowband flag */ + const int16_t cdk, /* i : codebook selector */ + const float mem_MA[], /* i : MA memory */ + const int16_t coder_type, /* i : acelp extended mode */ + const float *Bin_Ener /* i : Spectrum energy */ +); + +int16_t E_LPC_lsp_unweight( + const float lsp_w[], /* i : weighted lsp */ + float lsp_uw[], /* o : unweighted lsp */ + float lsf_uw[], /* o : unweighted lsf */ + const float inv_gamma /* i : inverse weighting factor */ +); + +int16_t lsf_ind_is_active( + const Word16 lsf_q_ind[], + const float means[], + const int16_t narrowband, + const int16_t cdk ); + +void midlsf_enc( + const float qlsf0[], + const float qlsf1[], + const float lsf[], + int16_t *idx, + const int16_t N, + const float *Bin_Ener, + const int16_t narrowBand, + const int32_t sr_core, + const int16_t coder_type ); + +void midlsf_dec( + const float qlsf0[], + const float qlsf1[], + const int16_t idx, + float qlsf[], + const int16_t N, + const int16_t coder_type, + int16_t *mid_lsf_int, + const int16_t prev_bfi, + const int16_t safety_net ); + +void lsf_end_enc( + Encoder_State *st, + const float *lsf, + float *qlsf, + const int16_t nBits, + const int16_t coder_type_org, + const int16_t force_sf, + int16_t *lpc_param, + int16_t *no_stages, + int16_t *bits_param_lpc, + const int16_t coder_type_raw, + const float tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel */ +); + +void lsf_end_dec( + Decoder_State *st, /* i/o: decoder state structure */ + const int16_t coder_type_org, /* i : coding type */ + const int16_t bwidth, /* i : input signal bandwidth */ + const int16_t nBits, /* i : number of bits used for ISF quantization*/ + float *qlsf, /* o : quantized LSFs in the cosine domain */ + int16_t *lpc_param, /* i : LPC parameters */ + int16_t *LSF_Q_prediction, /* o : LSF prediction mode */ + int16_t *nb_indices, /* o : number of indices */ + const float tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel */ +); + +ivas_error find_pred_mode( + int16_t *predmode, + const int16_t coder_type, + const int16_t bwidth, + const int32_t int_fs, + int16_t *p_mode_lvq, + int16_t *p_mode_lvq_p, + const int32_t core_brate ); + +void lpc_quantization( + Encoder_State *st, + const float lsp[], + const float lspmid[], + float lsp_q[], + float lsf_q[], + float lspmid_q[], + const int16_t coder_type, + const int16_t acelp_midLpc, + int16_t param_lpc[], + int16_t nbits_lpc[], + int16_t *bits_param_lpc, + int16_t *no_param_lpc ); + +void lpc_unquantize( + Decoder_State *st, + float *lsf, + float *lsp, + int16_t *param_lpc, + float *lspmid, + float *lsfmid, + const int16_t coder_type, + int16_t *LSF_Q_prediction /* o : LSF prediction mode */ +); + +void dlpc_bfi( + const int16_t L_frame, + float *lsf_q, /* o : quantized lsfs */ + const float *lsfold, /* i : past quantized lsf */ + const int16_t last_good, /* i : last good received frame */ + const int16_t nbLostCmpt, /* i : counter of consecutive bad frames */ + float mem_MA[], /* i/o: quantizer memory for MA model */ + float mem_AR[], /* i/o: quantizer memory for MA model */ + float *stab_fac, /* i : lsf stability factor */ + float *lsf_adaptive_mean, /* i : lsf adaptive mean, updated when BFI==0 */ + const int16_t numlpc, /* i : Number of division per superframe */ + float lsf_cng[], + const int16_t plcBackgroundNoiseUpdated, + float *lsf_q_cng, /* o : quantized lsfs of background noise */ + float *old_lsf_q_cng, /* o : old quantized lsfs for background noise */ + const float lsfBase[] /* i : base for differential lsf coding */ +); + +void lsf_dec_bfi( + const int16_t codec_mode, /* i : codec_mode: MODE1 | MODE2 */ + float *lsf, /* o : estimated LSF vector */ + const float *lsfold, /* i : past quantized lsf */ + float *lsf_adaptive_mean, /* i : lsf adaptive mean, updated when BFI==0 */ + const float lsfBase[], /* i : base for differential lsf coding */ + float *mem_MA, /* i/o: quantizer memory for MA model */ + float *mem_AR, /* o : quantizer memory for AR model */ + const float stab_fac, /* i : lsf stability factor */ + const int16_t last_coder_type, /* i : last coder type */ + const int16_t L_frame, /* i : frame length */ + const int16_t last_good, /* i : last good received frame */ + const int16_t nbLostCmpt, /* i : counter of consecutive bad frames */ + const int16_t plcBackgroundNoiseUpdated, /* i : background noise already updated? */ + float *lsf_q_cng, /* o : quantized lsfs of background noise */ + float *lsf_cng, /* i : long term target for fading to bg noise*/ + float *old_lsf_q_cng, /* o : old quantized lsfs for background noise*/ + const int16_t Last_GSC_pit_band_idx, /* i : AC mode (GSC) - Last pitch band index */ + const int16_t Opt_AMR_WB, /* i : IO flag */ + const int16_t bwidth /* i : coded bandwidth */ +); + +const float *PlcGetlsfBase( + const int16_t pcQuantization, + const int16_t narrowBand, + const int32_t sr_core ); + +void Unified_weighting( + const float Bin_Ener_128[], /* i : FFT Bin energy 128 bins in two sets */ + const float lsf[], /* i : LSF vector */ + float w[], /* o : LP weighting filter (numerator) */ + const int16_t narrowBand, /* i : flag for Narrowband */ + const int16_t unvoiced, /* i : flag for Unvoiced frame */ + const int32_t sr_core, /* i : sampling rate of core-coder */ + const int16_t order /* i : LP order */ +); + +int16_t vad_init( + VAD_CLDFB_HANDLE hVAD_CLDFB /* i/o: CLDFB VAD state */ +); + +int16_t vad_proc( + float realValues[16][60], /* i : CLDFB real values */ + float imagValues[16][60], /* i : CLDFB imag values */ + float *sb_power, /* i/o: Energy of CLDFB data */ + const int16_t numBands, /* i : number of input bands */ + VAD_CLDFB_HANDLE hVAD_CLDFB, /* i/o: CLDFB VAD state */ + int16_t *cldfb_addition, + const int16_t vada_flag /* i : VAD flag */ +); + +void subband_FFT( + float Sr[16][60], /* i : real part */ + float Si[16][60], /* i : imag part */ + float *spec_amp /* o : spectral amplitude */ +); + +int16_t update_decision( + VAD_CLDFB_HANDLE hVAD_CLDFB, /* i/o: CLDFB VAD state */ + const float snr, /* i : frequency domain SNR */ + const float tsnr, /* i : time domain SNR */ + const float frame_energy, /* i : current frame energy */ + const float high_eng, /* i : current frame high frequency energy */ + const int16_t vad_flag, /* i : VAD flag */ + const int16_t music_backgound_f /* i : background music flag */ +); + +void frame_spec_dif_cor_rate( + float spec_amp[], /* i : spectral amplitude */ + float pre_spec_low_dif[], /* i/o: low spectrum different */ + float f_tonality_rate[] /* o : tonality rate */ +); + +void ltd_stable( + float frames_power[], /* i/o: energy of several frames */ + float ltd_stable_rate[], /* o : time-domain stable rate */ + const float frame_energy, /* i : current frame energy */ + const int16_t frameloop /* i : number of frames */ +); + +void SNR_calc( + const float frame_sb_energy[], /* i : energy of sub-band divided non-uniformly*/ + const float sb_bg_energy[], /* i : sub-band background energy */ + const float t_bg_energy, /* i : time background energy of several frames*/ + float *snr, /* o : frequency domain SNR */ + float *tsnr, /* o : time domain SNR */ + const float frame_energy, /* i : current frame energy */ + const int16_t bwidth /* i : audio bandwidth */ +); + +void background_update( + VAD_CLDFB_HANDLE hVAD_CLDFB, /* i/o: CLDFB VAD state */ + float frame_energy, /* i : current frame energy 2 */ + const int16_t update_flag, /* i : current frame update flag */ + const int16_t music_backgound_f, /* i : background music flag */ + const float snr ); + +void bg_music_decision( + VAD_CLDFB_HANDLE hVAD_CLDFB, /* i/o: CLDFB VAD state */ + int16_t *music_backgound_f, /* i : background music flag */ + const float frame_energy /* i : current frame energy 1 */ +); + +void est_energy( + float sb_power[], /* o : energy of sub-band divided uniformly */ + float frame_sb_energy[], /* o : energy of sub-band divided non-uniformly*/ + float *p_frame_energy, /* o : frame energy 1 */ + float *p_frame_energy2, /* o : frame energy 2 */ + float *p_high_energy, /* o : high frequency energy */ + const int16_t bw /* i : bandwidth */ +); + +void spec_center( + float spec_power[], /* i : energy of sub-band divided uniformly */ + float sp_center[], /* o : spectral center */ + const int16_t bw_index /* i : bandwidth */ +); + +void spec_flatness( + float spec_amp[], /* i : spectral amplitude */ + float smooth_spec_amp[], /* i : smoothed spectral amplitude */ + float sSFM[] /* o : spectral flatness rate */ +); + +int16_t comvad_decision( + VAD_CLDFB_HANDLE hVAD_CLDFB, /* i/o: CLDFB VAD state */ + const float snr, /* i : frequency domain SNR */ + const float tsnr, /* i : time domain SNR */ + const float snr_flux, /* i : average tsnr of several frames */ + const float lt_snr, /* i : long time SNR calculated by fg_energy and bg_energy*/ + const float lt_snr_org, /* i : original long time SNR */ + const float lf_snr, /* i : long time frequency domain SNR calculated by l_speech_snr and l_silence_snr*/ + const float frame_energy, /* i : current frame energy */ + const int16_t music_backgound_f, /* i : background music flag */ + int16_t *cldfb_addition, + const int16_t vada_flag /* i : VAD flag */ +); + +void calc_snr_flux( + float tsnr, /* i : time-domain SNR */ + float pre_snr[], /* i/o: time-domain SNR storage */ + float *snr_flux /* o : average tsnr */ +); + +void calc_lt_snr( + float *lt_snr_org, /* o : original long time SNR */ + float *lt_snr, /* o : long time SNR calculated by fg_energy and bg_energy*/ + const float fg_energy, /* i : foreground energy sum */ + const int16_t fg_energy_count, /* i : number of the foreground energy frame */ + const float bg_energy, /* i : background energy sum */ + const int16_t bg_energy_count, /* i : number of the background energy frame */ + const int16_t bw_index, /* i : band width index */ + const float lt_noise_sp_center0 /* i : long time noise spectral center by 0 */ +); + +void calc_lf_snr( + float *lf_snr_smooth, /* o : smoothed lf_snr */ + float *lf_snr, /* o : long time frequency domain SNR calculated by l_speech_snr and l_silence_snr*/ + const float l_speech_snr, /* i : sum of active frames snr */ + const int16_t l_speech_snr_count, /* i : number of the active frame */ + const float l_silence_snr, /* i : sum of the nonactive frames snr */ + const int16_t l_silence_snr_count, /* i : number of the nonactive frame */ + const int16_t fg_energy_count, /* i : number of the foreground energy frame */ + const int16_t bg_energy_count, /* i : number of the background energy frame */ + const int16_t bw_index /* i : band width index */ +); + +float construct_snr_thresh( + const float sp_center[], /* i : spectral center */ + const float snr_flux, /* i : snr flux */ + const float lt_snr, /* i : long time time domain snr */ + const float lf_snr, /* i : long time frequency domain snr */ + const int16_t continuous_speech_num, /* i : continuous speech number */ + const int16_t continuous_noise_num, /* i : continuous noise number */ + const int16_t fg_energy_est_start, /* i : whether if estimated energy */ + const int16_t bw_index /* i : band width index */ +); + +ivas_error createFdCngCom( + HANDLE_FD_CNG_COM *hFdCngCom /* i/o: FD_CNG structure containing all buffers and variables */ +); + +void deleteFdCngCom( + HANDLE_FD_CNG_COM *hFdCngCom /* i/o: FD_CNG structure containing all buffers and variables */ +); + +void initFdCngCom( + HANDLE_FD_CNG_COM hFdCngCom, /* i/o: FD_CNG structure containing all buffers and variables */ + const float scale ); + +void initPartitions( + const int16_t *part_in, + const int16_t npart_in, + const int16_t startBand, + const int16_t stopBand, + int16_t *part_out, + int16_t *npart_out, + int16_t *midband, + float *psize, + float *psize_inv, + const int16_t stopBandFR ); + +void minimum_statistics( + const int16_t len, /* i : Vector length */ + const int16_t lenFFT, /* i : Length of the FFT part of the vectors */ + float *psize, + float *msPeriodog, /* i : Periodograms */ + float *msNoiseFloor, + float *msNoiseEst, /* o : Noise estimates */ + float *msAlpha, + float *msPsd, + float *msPsdFirstMoment, + float *msPsdSecondMoment, + float *msMinBuf, + float *msBminWin, + float *msBminSubWin, + float *msCurrentMin, + float *msCurrentMinOut, + float *msCurrentMinSubWindow, + int16_t *msLocalMinFlag, + int16_t *msNewMinFlag, + float *msPeriodogBuf, + int16_t *msPeriodogBufPtr, + HANDLE_FD_CNG_COM hFdCngCom, /* i/o: FD_CNG structure containing all buffers and variables */ + const int16_t enc_dec, /* i : encoder/decoder indicator */ + const int16_t element_mode /* i : IVAS element mode */ +); + +void generate_comfort_noise_enc( + Encoder_State *st /* i/o: encoder state structure */ +); + +void generate_comfort_noise_dec( + float **bufferReal, /* o : Real part of input bands */ + float **bufferImag, /* o : Imaginary part of input bands */ + Decoder_State *st, /* i/o: decoder state structure */ + const int16_t nchan_out /* i : number of output channels */ +); + +void generate_comfort_noise_dec_hf( + float **bufferReal, /* o : Real part of input bands */ + float **bufferImag, /* o : Imaginary part of input bands */ + HANDLE_FD_CNG_COM hFdCngCom, /* i/o: FD_CNG structure containing all buffers and variables */ + const int16_t cng_flag /* i : CNG Flag */ +); + +void generate_masking_noise( + float *timeDomainBuffer, /* i/o: time-domain signal */ + HANDLE_FD_CNG_COM hFdCngCom, /* i/o: FD_CNG structure containing all buffers and variables */ + const int16_t length, /* i : frame size */ + const int16_t core, /* i : core */ + const int16_t return_noise, /* i : noise is returned instead of added */ + const int16_t secondary, /* i : indicator for secondary channel */ + const int16_t element_mode, /* i : element mode */ + STEREO_CNG_DEC_HANDLE hStereoCng, /* i : stereo CNG handle */ + const int16_t nchan_out /* i : number of output channels */ +); + +void generate_masking_noise_update_seed( + HANDLE_FD_CNG_COM hFdCngCom /* i/o: FD_CNG structure containing all buffers and variables */ +); + +void generate_masking_noise_mdct( + float *mdctBuffer, /* i/o: time-domain signal */ + HANDLE_FD_CNG_COM hFdCngCom /* i/o: FD_CNG structure containing all buffers and variables */ +); + +void SynthesisSTFT_dirac( + float *fftBuffer, /* i : FFT bins */ + float *timeDomainOutput, + float *olapBuffer, + const float *olapWin, + const int16_t samples_out, + HANDLE_FD_CNG_COM hFdCngCom /* i/o: FD_CNG structure containing all buffers and variables */ +); + +void generate_masking_noise_dirac( + HANDLE_FD_CNG_COM hFdCngCom, /* i/o: FD_CNG structure containing all buffers and variables */ + HANDLE_CLDFB_FILTER_BANK h_cldfb, /* i : filterbank state */ + float *tdBuffer, /* i/o: time-domain signal, if NULL no LB-CNA */ + float *Cldfb_RealBuffer, /* o : CLDFD real buffer */ + float *Cldfb_ImagBuffer, /* o : CLDFD imaginary buffer */ + const int16_t slot_index, /* i : CLDFB slot index */ + const int16_t cna_flag, /* i : CNA flag for LB and HB */ + const int16_t fd_cng_flag /* i : FD-CNG flag for HB */ +); + +void generate_stereo_masking_noise( + float *syn, /* i/o: time-domain signal */ + Decoder_State *st, /* i/o: decoder state structure */ + STEREO_TD_DEC_DATA_HANDLE hStereoTD, /* i : TD stereo structure */ + const int16_t flag_sec_CNA, /* i : CNA flag for secondary channel */ + const int16_t fadeOut, /* i : only fade out of previous state */ + STEREO_CNG_DEC_HANDLE hStereoCng, /* i : stereo CNG handle */ + const int16_t nchan_out /* i : number of output channels */ +); + +void apply_scale( + float *scale, /* i : scale factor */ + const int16_t bwidth, /* i : audio bandwidth */ + const int32_t brate, /* i : Bit rate */ + const SCALE_SETUP *scaleTable, /* i : Scale table */ + const int16_t scaleTableSize /* i : Size of scale table */ +); + +void compress_range( + float *in, + float *out, + const int16_t len ); + +void expand_range( + float *in, + float *out, + const int16_t len ); + +void bandcombinepow( + const float *bandpow, /* i : Power for each band */ + const int16_t nband, /* i : Number of bands */ + int16_t *part, /* i : Partition upper boundaries (band indices starting from 0) */ + const int16_t npart, /* i : Number of partitions */ + const float *psize_inv, /* i : Inverse partition sizes */ + float *partpow /* o : Power for each partition */ +); + +void scalebands( + const float *partpow, /* i : Power for each partition */ + int16_t *part, /* i : Partition upper boundaries (band indices starting from 0) */ + const int16_t npart, /* i : Number of partitions */ + int16_t *midband, /* i : Central band of each partition */ + const int16_t nFFTpart, /* i : Number of FFT partitions */ + const int16_t nband, /* i : Number of bands */ + float *bandpow, /* o : Power for each band */ + const int16_t flag_fft_en ); + +void AnalysisSTFT( + const float *timeDomainInput, + float *fftBuffer, /* o : FFT bins */ + HANDLE_FD_CNG_COM st /* i/o: FD_CNG structure containing all buffers and variables */ +); + +void SynthesisSTFT( + float *fftBuffer, + float *timeDomainOutput, + float *olapBuffer, + const float *olapWin, + const int16_t tcx_transition, + HANDLE_FD_CNG_COM hFdCngCom, + const int16_t element_mode, /* i : element mode */ + const int16_t nchan_out /* i : number of output channels */ +); + +float rand_gauss( + float *x, + int16_t *seed ); + +void lpc_from_spectrum( + HANDLE_FD_CNG_COM hFdCngCom, + const int16_t start, + const int16_t stop, + const float preemph_fac ); + +ivas_error createFdCngDec( + HANDLE_FD_CNG_DEC *hFdCngDec ); + +void deleteFdCngDec( + HANDLE_FD_CNG_DEC *hFdCngDec ); + +void initFdCngDec( + DEC_CORE_HANDLE st /* i/o: decoder state structure */ +); + +void configureFdCngDec( + HANDLE_FD_CNG_DEC hFdCngDec, /* i/o: Contains the variables related to the FD-based CNG process */ + const int16_t bwidth, + const int32_t total_brate, + const int16_t L_frame, + const int16_t last_L_frame, + const int16_t element_mode ); + +void ApplyFdCng( + float *timeDomainInput, + float *powerSpectrum, + float **realBuffer, /* i/o: Real part of the buffer */ + float **imagBuffer, /* i/o: Imaginary part of the buffer */ + Decoder_State *st, + const int16_t concealWholeFrame, /* i : binary flag indicating frame loss */ + const int16_t is_music ); + +void generate_comfort_noise_dec( + float **bufferReal, /* o : Real part of input bands */ + float **bufferImag, /* o : Imaginary part of input bands */ + Decoder_State *st, /* i/o: decoder state structure */ + const int16_t nchan_out /* i : number of output channels */ +); + +/*! r: CNG energy */ +float cng_energy( + const int16_t element_mode, /* i : element mode */ + const int16_t bwidth, /* i : audio bandwidh */ + const int16_t CNG_mode, /* i : mode for DTX configuration */ + const float CNG_att, /* i : attenuation factor for CNG */ + const float *inputBuffer, /* i : input signal */ + const int16_t len /* i : vector length */ +); + +void FdCng_decodeSID( + Decoder_State *st /* i/o: decoder state structure */ +); + +void FdCng_exc( + HANDLE_FD_CNG_COM hFdCngCom, + int16_t *CNG_mode, + const int16_t L_frame, + const float *lsp_old, + const int16_t first_CNG, + float *lsp_CNG, + float *Aq, /* o : LPC coeffs */ + float *lsp_new, /* o : lsp */ + float *lsf_new, /* o : lsf */ + float *exc, /* o : LP excitation */ + float *exc2, /* o : LP excitation */ + float *bwe_exc /* o : LP excitation for BWE */ +); + +void noisy_speech_detection( + HANDLE_FD_CNG_DEC hFdCngDec, /* i/o: FD_CNG structure */ + const int16_t vad, /* i : VAD flag */ + const float syn[] /* i : input time-domain frame */ +); + +ivas_error createFdCngEnc( + HANDLE_FD_CNG_ENC *hFdCngEnc /* i/o: FD_CNG structure */ +); + +void deleteFdCngEnc( + HANDLE_FD_CNG_ENC *hFdCngEnc /* i/o: FD_CNG structure */ +); + +void configureFdCngEnc( + HANDLE_FD_CNG_ENC hFdCngEnc, /* i/o: Contains the variables related to the FD-based CNG process */ + const int16_t bwidth, + const int32_t total_brate ); + +void initFdCngEnc( + HANDLE_FD_CNG_ENC hFdCngEnc, /* i/o: Contains the variables related to the FD-based CNG process */ + const int32_t input_Fs, /* i : input signal sampling frequency in Hz */ + const float scale /* i : scaling factor */ +); + +void resetFdCngEnc( + Encoder_State *st /* i/o: encoder state structure */ +); + +void perform_noise_estimation_enc( + float *band_energies, /* i : energy in critical bands without minimum noise floor E_MIN */ + float *enerBuffer, /* i : energy buffer */ + HANDLE_FD_CNG_ENC hFdCngEnc, /* i/o: CNG structure containing all buffers and variables */ + const int32_t input_Fs, /* i : input sampling rate */ + CPE_ENC_HANDLE hCPE ); + +void AdjustFirstSID( + Encoder_State *st /* i/o: encoder state structure */ +); + +void FdCng_encodeSID( + Encoder_State *st /* i/o: encoder state structure */ +); + +void GetParameters( + ParamsBitMap const *paramsBitMap, + const int16_t nParams, + void const *pParameter, + int16_t **pStream, + int16_t *pnSize, + int16_t *pnBits ); + +void SetParameters( + ParamsBitMap const *paramsBitMap, + const int16_t nParams, + void *pParameter, + const int16_t **pStream, + int16_t *pnSize ); + +void WriteToBitstream( + ParamsBitMap const *paramsBitMap, + const int16_t nParams, + const int16_t **pStream, + int16_t *pnSize, + BSTR_ENC_HANDLE hBstr, + int16_t *pnBits ); + +void ReadFromBitstream( + ParamsBitMap const *paramsBitMap, + const int16_t nArrayLength, + Decoder_State *st, + int16_t **pStream, + int16_t *pnSize ); + +void const *GetTnsFilterOrder( void const *p, const int16_t index, int16_t *pValue ); +void *SetTnsFilterOrder( void *p, const int16_t index, const int16_t value ); +void const *GetNumOfTnsFilters( void const *p, const int16_t index, int16_t *pValue ); +void *SetNumOfTnsFilters( void *p, const int16_t index, const int16_t value ); +void const *GetTnsEnabled( void const *p, const int16_t index, int16_t *pValue ); +void *SetTnsEnabled( void *p, const int16_t index, const int16_t value ); +void const *GetTnsEnabledSingleFilter( void const *p, const int16_t index, int16_t *pValue ); +void *SetTnsEnabledSingleFilter( void *p, const int16_t index, const int16_t value ); +void const *GetTnsFilterCoeff( void const *p, const int16_t index, int16_t *pValue ); +void *SetTnsFilterCoeff( void *p, const int16_t index, const int16_t value ); + +void const *GetTnsOnWhite( void const *p, const int16_t index, int16_t *pValue ); +void *SetTnsOnWhite( void *p, const int16_t index, const int16_t value ); + +int16_t GetSWBTCX10TnsFilterCoeffBits( const int16_t value, const int16_t index ); +int16_t EncodeSWBTCX10TnsFilterCoeff( const int16_t value, const int16_t index ); +int16_t DecodeSWBTCX10TnsFilterCoeff( Decoder_State *st, const int16_t index, int16_t *pValue ); +int16_t GetSWBTCX20TnsFilterCoeffBits( const int16_t value, const int16_t index ); +int16_t EncodeSWBTCX20TnsFilterCoeff( const int16_t value, const int16_t index ); +int16_t DecodeSWBTCX20TnsFilterCoeff( Decoder_State *st, const int16_t index, int16_t *pValue ); + +int16_t GetWBTCX20TnsFilterCoeffBits( const int16_t value, const int16_t index ); +int16_t EncodeWBTCX20TnsFilterCoeff( const int16_t, const int16_t index ); +int16_t DecodeWBTCX20TnsFilterCoeff( Decoder_State *st, const int16_t index, int16_t *pValue ); + +int16_t GetTnsFilterOrderBitsSWBTCX10( const int16_t value, const int16_t index ); +int16_t EncodeTnsFilterOrderSWBTCX10( const int16_t value, const int16_t index ); +int16_t DecodeTnsFilterOrderSWBTCX10( Decoder_State *st, const int16_t index, int16_t *pValue ); +int16_t GetTnsFilterOrderBitsSWBTCX20( const int16_t value, const int16_t index ); +int16_t EncodeTnsFilterOrderSWBTCX20( const int16_t value, const int16_t index ); +int16_t DecodeTnsFilterOrderSWBTCX20( Decoder_State *st, const int16_t index, int16_t *pValue ); +int16_t GetTnsFilterOrderBits( const int16_t value, const int16_t index ); +int16_t EncodeTnsFilterOrder( const int16_t value, const int16_t index ); +int16_t DecodeTnsFilterOrder( Decoder_State *st, const int16_t index, int16_t *pValue ); + +void ResetTnsData( + STnsData *pTnsData ); + +void ClearTnsFilterCoefficients( + STnsFilter *pTnsFilter ); + +void InitTnsConfiguration( + const int16_t bwidth, + const int16_t frameLength, + STnsConfig *pTnsConfig, + const int16_t igfStopFreq, + const int32_t total_brate, + const int16_t element_mode, + const int16_t MCT_flag ); + +int16_t DetectTnsFilt( + const STnsConfig *pTnsConfig, /* i : TNS Configuration struct */ + const float pSpectrum[], /* i : MDCT spectrum */ + TRAN_DET_HANDLE hTranDet, /* i : transient detection handle */ + const int16_t isTCX10, /* i : TCX10 or TCX20? */ + const float ltp_gain, /* i : LTP gain */ + STnsData *pTnsData, /* o : TNS data struct */ + float *predictionGain /* o : TNS prediction gain */ +); + +void ApplyTnsFilter( + STnsConfig const *pTnsConfig, + STnsData const *pTnsData, + float spectrum[], + const int16_t fIsAnalysis ); + +int16_t ITF_Detect( + const float pSpectrum[], + const int16_t startLine, + const int16_t stopLine, + const int16_t maxOrder, + float *A, + float *predictionGain, + int16_t *curr_order ); + +void ITF_Apply( + float spectrum[], + const int16_t startLine, + const int16_t stopLine, + const float *A, + const int16_t curr_order ); + +void EncodeTnsData( + STnsConfig const *pTnsConfig, /* i : TNS Configuration struct */ + STnsData const *pTnsData, /* i : TNS data struct (quantized param) */ + int16_t *stream, /* o : internal data stream */ + int16_t *pnSize, /* o : number of written parameters */ + int16_t *pnBits /* o : number of written bits */ +); + +int16_t DecodeTnsData( + STnsConfig const *pTnsConfig, + const int16_t *stream, + int16_t *pnSize, + STnsData *pTnsData ); + +void WriteTnsData( + const STnsConfig *pTnsConfig, /* i : TNS Configuration struct */ + const int16_t *stream, /* i : internal data stream */ + int16_t *pnSize, /* o : number of written parameters */ + BSTR_ENC_HANDLE hBstr, /* o : bitstream */ + int16_t *pnBits /* o : number of written bits */ +); + +void ReadTnsData( + STnsConfig const *pTnsConfig, + Decoder_State *st, + int16_t *pnBits, + int16_t *stream, + int16_t *pnSize ); + +void cldfbAnalysis( + const float *timeIn, /* i : time buffer */ + float **realBuffer, /* o : real value buffer */ + float **imagBuffer, /* o : imag value buffer */ + const int16_t samplesToProcess, /* i : number of input samples */ + HANDLE_CLDFB_FILTER_BANK h_cldfb /* i : filterbank state */ +); + +void cldfbAnalysis_ts( + const float *timeIn, /* i : time buffer */ + float realBuffer[CLDFB_NO_CHANNELS_MAX], /* o : real value buffer */ + float imagBuffer[CLDFB_NO_CHANNELS_MAX], /* o : imag value buffer */ + const int16_t samplesToProcess, /* i : samples to process */ + HANDLE_CLDFB_FILTER_BANK h_cldfb /* i : filterbank state */ +); + +void cldfbSynthesis( + float **realBuffer, /* i : real values */ + float **imagBuffer, /* i : imag values */ + float *timeOut, /* o : synthesized output */ + const int16_t samplesToProcess, /* i : number of samples */ + HANDLE_CLDFB_FILTER_BANK h_cldfb /* i : filter bank state */ +); + +void configureCldfb( + HANDLE_CLDFB_FILTER_BANK h_cldfb, /* i/o: filter bank handle */ + const int32_t sampling_rate /* i : sampling rate */ +); + +void analysisCldfbEncoder( + Encoder_State *st, /* i/o: encoder state structure */ + const float *timeIn, + const int16_t samplesToProcess, + float realBuffer[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], + float imagBuffer[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], + float *ppBuf_Ener ); + +ivas_error openCldfb( + HANDLE_CLDFB_FILTER_BANK *h_cldfb, /* i/o: filter bank handle */ + CLDFB_TYPE type, /* i : analysis or synthesis */ + const int32_t sampling_rate, /* i : sampling rate */ + CLDFB_PROTOTYPE prototype /* i : CLDFB version (1.25ms/5ms delay) */ +); + +void resampleCldfb( + HANDLE_CLDFB_FILTER_BANK hs, /* i/o: filter bank handle */ + const int32_t newSamplerate /* i : new samplerate to operate */ +); + +ivas_error cldfb_save_memory( + HANDLE_CLDFB_FILTER_BANK hs /* i/o: filter bank handle */ +); + +void cldfb_restore_memory( + HANDLE_CLDFB_FILTER_BANK hs /* i/o: filter bank handle */ +); + +void cldfb_reset_memory( + HANDLE_CLDFB_FILTER_BANK hs /* i/o: filter bank handle */ +); + +void deleteCldfb( + HANDLE_CLDFB_FILTER_BANK *h_cldfb /* i/o: filter bank handle */ +); + +void fft_cldfb( + float *data, /* i/o: input/output vector */ + const int16_t size /* i : size of fft operation */ +); + +void BITS_ALLOC_init_config_acelp( + const int32_t bit_rate, + const int16_t narrowBand, + const int16_t nb_subfr, + ACELP_config *acelp_cfg /* o : configuration structure of ACELP */ +); + +int16_t BITS_ALLOC_config_acelp( + const int16_t bits_frame, /* i : remaining bit budget for the frame */ + const int16_t coder_type, /* i : acelp coder type */ + ACELP_config *acelp_cfg, /* i/o: configuration structure of ACELP */ + const int16_t narrowband, /* i : narrowband flag */ + const int16_t nb_subfr /* i : number of subframes */ +); + +ivas_error config_acelp1( + const int16_t enc_dec, /* i : encoder/decoder flag */ + const int32_t total_brate, /* i : total bitrate */ + const int32_t core_brate_inp, /* i : core bitrate */ + const int16_t core, /* i : core */ + const int16_t extl, /* i : extension layer */ + const int32_t extl_brate, /* i : extension layer bitrate */ + const int16_t L_frame, /* i : frame length at internal Fs */ + const int16_t GSC_noisy_speech, /* i : GSC on SWB noisy speech flag */ + ACELP_config *acelp_cfg, /* i : ACELP bit-allocation */ + const int16_t signaling_bits, /* i : number of signaling bits */ + const int16_t coder_type, /* i : coder type */ + const int16_t tc_subfr, /* i : TC subfr ID */ + const int16_t tc_call, /* i : TC call number (0,1,2) */ + int16_t *nBits_es_Pred, /* o : number of bits for Es_pred Q */ + int16_t *unbits, /* o : number of unused bits */ + const int16_t element_mode, /* i : element mode */ + int16_t *uc_two_stage_flag, /* o : flag undicating two-stage UC */ + const int16_t tdm_lp_reuse_flag, /* i : LPC reuse flag (can be 1 only with secondary channel*/ + const int16_t tdm_low_rate_mode, /* i : secondary channel low rate mode flag*/ + const int16_t idchan, /* i : channel id */ + const int16_t active_cnt, /* i : Active frame counter */ + const int16_t tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag */ + const int16_t tdm_LRTD_flag, /* i : LRTD stereo mode flag */ + const int16_t GSC_IVAS_mode /* i : GSC IVAS mode */ +); + +/*! r: ACELP16k flag */ +int16_t set_ACELP_flag( + const int16_t element_mode, /* i : element mode */ + const int32_t element_brate, /* i : element bitrate */ + const int32_t total_brate, /* i : total bitrate per channel */ + const int16_t idchan, /* i : Channel id */ + const int16_t tdm_LRTD_flag, /* i : LRTD stereo mode flag */ + const int16_t bwidth, /* i : audio bandwidth */ + const int16_t cng_type /* i : CNG type */ +); + +void FEC_clas_estim( + const float *syn, + const float *pitch, /* i : pitch values for each subframe */ + const int16_t L_frame, /* i : length of the frame */ + const int16_t coder_type, /* i : coder type */ + const int16_t codec_mode, /* i : codec mode */ + float *mem_syn_clas_estim, /* i/o: memory of the synthesis signal for frame class estimation */ + int16_t *clas, /* i/o: frame classification */ + float *lp_speech, /* i/o: long term active speech energy average */ + const int16_t Opt_AMR_WB, /* i : flag indicating AMR-WB IO mode */ + int16_t *decision_hyst, /* i/o: hysteresis of the music/speech decision */ + int16_t *locattack, /* i/o: detection of attack (mainly to localized speech burst) */ + int16_t *UV_cnt, /* i/o: number of consecutives frames classified as UV */ + float *LT_UV_cnt, /* i/o: long term consecutives frames classified as UV */ + float *Last_ener, /* i/o: last_energy frame */ + int16_t *amr_io_class, /* i/o: classification for AMR-WB IO mode */ + float *lt_diff_etot, /* i/o: long-term total energy variation */ + float *class_para, /* o : classification para. fmerit1 */ + const float LTP_Gain, /* i : */ + const int16_t narrowBand, /* i : */ + const SIGNAL_CLASSIFIER_MODE mode, /* i : */ + const int16_t bfi, /* i : */ + const float preemph_fac, /* i : */ + const int16_t tcxonly, /* i : */ + const int32_t last_core_brate, /* i : last core bitrate */ + const int16_t FEC_mode /* i : ACELP FEC mode */ +); + +void InitTransientDetection( + const int16_t nFrameLength, + const int16_t nTCXDelay, + TRAN_DET_HANDLE hTranDet, + const int16_t ext_mem_flag ); + +void RunTransientDetection( + const float *input, /* i : input signal */ + const int16_t length, /* i : frame length */ + TRAN_DET_HANDLE hTranDet /* i/o: transient detection handle */ +); + +float GetTCXAvgTemporalFlatnessMeasure( + TRAN_DET_HANDLE hTranDet, + const int16_t nCurrentSubblocks, + const int16_t nPrevSubblocks ); + +float GetTCXMaxenergyChange( + TRAN_DET_HANDLE hTranDet, + const int16_t isTCX10, + const int16_t nCurrentSubblocks, + const int16_t nPrevSubblocks ); + +void SetTCXModeInfo( + Encoder_State *st, /* i/o: encoder state structure */ + TRAN_DET_HANDLE hTranDet, /* i/o: transient detection handle */ + int16_t *tcxModeOverlap /* o : window overlap of current frame */ +); + +void TCX_MDCT( + const float *x, + float *y, + const int16_t l, + const int16_t m, + const int16_t r, + const int16_t element_mode ); + +void TCX_MDST( + const float *x, + float *y, + const int16_t l, + const int16_t m, + const int16_t r, + const int16_t element_mode ); + +void TCX_MDCT_Inverse( + const float *x, + float *y, + const int16_t l, + const int16_t m, + const int16_t r, + const int16_t element_mode ); + +void TCX_MDST_Inverse( + const float *x, + float *y, + const int16_t l, + const int16_t m, + const int16_t r, + const int16_t element_mode ); + +void TCX_MDXT_Inverse( + const float *x, + float *y, + const int16_t l, + const int16_t m, + const int16_t r, + const uint16_t kernel_type ); + +void post_decoder( + Decoder_State *st, + float synth_buf[], + const float pit_gain[], + const int16_t pitch[], + float signal_out[], + float bpf_noise_buf[] ); + +float bass_pf_enc( + const float *orig, /* i : 12.8kHz original signal */ + const float *syn, /* i : 12.8kHz synthesis to postfilter */ + const float pitch_buf[], /* i : Pitch gain for all subframes (gainT_sf[16]) */ + const float gainT_sf[], /* i : Pitch gain for all subframes (gainT_sf[16]) */ + const int16_t l_frame, /* i : frame length (should be multiple of l_subfr)*/ + const int16_t l_subfr_in, /* i : sub-frame length (60/64) */ + float mem_bpf[], /* i/o: memory state [2*L_FILT] */ + float mem_error_bpf[], /* i/o: memory state [2*L_FILT] */ + int16_t *gain_factor_param, /* o : quantized gain factor */ + const int16_t mode, /* i : coding mode of adapt bpf */ + float *mem_deemph_err, /* i/o: Error deemphasis memory */ + float *lp_ener /* i/o: long_term error signal energy */ +); + +void cldfb_synth_set_bandsToZero( + Decoder_State *st, /* i/o: decoder state structure */ + float **rAnalysis, + float **iAnalysis, + const int16_t nTimeSlots ); + +void longadd( + uint16_t a[], /* i/o: vector of the length lena */ + const uint16_t b[], /* i/o: vector of the length lenb */ + const int16_t lena, /* i/o: length of vector a[] */ + const int16_t lenb /* i/o: length of vector b[] */ +); + +void longshiftright( + uint16_t a[], /* i : vector of the length lena */ + const int16_t b, /* i : number of bit positions to shift right */ + uint16_t d[], /* o : vector of the length lend */ + int16_t lena, /* i : length of vector a[] */ + const int16_t lend /* i : length of vector d[] */ +); + +void longshiftleft( + const uint16_t a[], /* i : vector of the length len */ + const int16_t b, /* i : number of bit positions to shift left */ + uint16_t d[], /* o : vector of the length len */ + const int16_t len /* i : length of vector a[] and d[] */ +); + +void open_decoder_LPD( + Decoder_State *st, /* i/o: decoder state structure */ + const int32_t total_brate, /* i : total bitrate */ + const int32_t last_total_brate, /* i : last total bitrate */ + const int16_t bwidth, /* i : audio bandwidth */ + const int16_t MCT_flag, /* i : hMCT handle allocated (1) or not (0) */ + const int16_t last_element_mode, /* i : last element mode */ + const int16_t is_init /* i : indicate call during initialization */ +); + +void acelp_plc_mdct_transition( + Decoder_State *st /* i/o: Decoder state */ +); + +void tcxltp_dec_init( + TCX_LTP_DEC_HANDLE hTcxLtpDec, + const int16_t ini_frame, + const int16_t last_codec_mode, + const int16_t element_mode, + const int16_t pit_max, + const int32_t sr_core ); + +void reset_tcx_overl_buf( + TCX_DEC_HANDLE hTcxDec /* i/o: TCX decoder handle */ +); + +void update_decoder_LPD_cng( + Decoder_State *st, /* i/o: decoder state structure */ + float *timeDomainBuffer, + float *A, + float *bpf_noise_buf ); + +void reconfig_decoder_LPD( + Decoder_State *st, /* i/o: decoder state structure */ + const int16_t bits_frame, /* i : bit budget */ + const int16_t bwidth, /* i : audio bandwidth */ + const int32_t total_brate, /* i : total bitrate */ + const int16_t L_frame_old /* i : frame length */ +); + +void mode_switch_decoder_LPD( + Decoder_State *st, /* i/o: decoder state structure */ + const int16_t bwidth, /* i : audio bandwidth */ + const int32_t total_brate, /* i : total bitrate */ + const int32_t last_total_brate, /* i : last frame total bitrate */ + const int16_t frame_size_index, /* i : index determining the frame size */ + const int16_t MCT_flag, /* i : hMCT handle allocated (1) or not (0)*/ + const int16_t last_element_mode /* i : last element mode */ +); + +void dec_acelp_tcx_frame( + Decoder_State *st, /* i/o: decoder state structure */ + int16_t *concealWholeFrame, /* i/o: concealment flag */ + float *output, /* o : synthesis */ + float *bpf_noise_buf, /* i/o: BPF noise buffer */ + float *pcmbufFB, /* o : synthesis @output_FS */ + float bwe_exc_extended[], /* i/o: bandwidth extended excitation */ + float *voice_factors, /* o : voicing factors */ + float pitch_buf[], /* o : floating pitch for each subframe */ + STEREO_CNG_DEC_HANDLE hStereoCng /* i : stereo CNG handle */ +); + +void decoder_LPD( + Decoder_State *st, /* i/o: decoder memory state pointer */ + float signal_out[], /* o : signal with LPD delay (7 subfrs) */ + float signal_outFB[], /* o : synthesis @output_FS */ + int16_t *total_nbbits, /* i/o: number of bits / decoded bits */ + float *bpf_noise_buf, /* i/o: BPF noise buffer */ + int16_t bfi, /* i : BFI flag */ + int16_t *bitsRead, /* o : number of read bits */ + int16_t param[], /* o : buffer of parameters */ + float *pitch_buf, /* i/o: floating pitch values for each subfr*/ + float *voice_factors, /* o : voicing factors */ + float *ptr_bwe_exc /* o : excitation for SWB TBE */ +); + +int16_t tcxGetNoiseFillingTilt( + const float A[], + const int16_t L_frame, + const int16_t mode, + float *noiseTiltFactor ); + +void tcxFormantEnhancement( + float xn_buf[], + const float *gainlpc, + float spectrum[], + const int16_t L_frame ); + +void tcxInvertWindowGrouping( + TCX_CONFIG_HANDLE hTcxCfg, + float xn_buf[], + float spectrum[], + const int16_t L_frame, + const int16_t fUseTns, + const int16_t last_core, + const int16_t index, + const int16_t frame_cnt, + const int16_t bfi ); + +void tcx5SpectrumInterleaving( + const int16_t tcx5Size, + float *spectrum ); + +void tcx5SpectrumDeinterleaving( + const int16_t tcx5Size, + float *spectrum ); + +void tcx5TnsGrouping( + const int16_t L_frame, + const int16_t L_spec, + float *spectrum ); + +void tcx5TnsUngrouping( + const int16_t L_frame, + const int16_t L_spec, + float *spectrum, + const int16_t enc_dec ); + +void lerp( + const float *f, + float *f_out, + const int16_t bufferNewSize, + const int16_t bufferOldSize ); + +void encoderSideLossSimulation( + Encoder_State *st, + PLC_ENC_EVS_HANDLE hPlc_Ext, + float *isf_q, + const float stab_fac, + const int16_t calcOnlyISF, + const int16_t L_frame ); + +void enc_prm_side_Info( + PLC_ENC_EVS_HANDLE hPlc_Ext, + Encoder_State *st ); + +void GplcTcxEncSetup( + const int16_t tcxltp_pitch_int, + PLC_ENC_EVS_HANDLE hPlc_Ext ); + +int16_t encSideSpecPowDiffuseDetector( + float *isf_ref, + float *isf_con, + const int32_t sr_core, + float *prev_isf4_mean, + const int16_t sw, + const int16_t coder_type ); + +void updateSpecPowDiffuseIdx( + const float gain_pitch_buf[], /* i : gain pitch values */ + const float gain_code_buf[], /* i : gain pitch values */ + int16_t glr_idx[2], /* o : */ + float mean_gc[2] /* o : */ +); + +void getLookAheadResSig( + float *speechLookAhead, + const float *A, + float *res, + const int16_t L_frame, + const int16_t L_subfr, + const int16_t m, + const int16_t numSubFrame ); + +void updatelsfForConcealment( + PLC_ENC_EVS_HANDLE decState, + float *lsf ); + +void getConcealedLP( + PLC_ENC_EVS_HANDLE memDecState, + float *AqCon, + const float xsfBase[], + const int32_t sr_core, + const int16_t last_good, + const int16_t L_frame ); + +void RecLpcSpecPowDiffuseLc( + float *ispq, + float *isp_old, + float *isfq, + Decoder_State *st, + const int16_t reset_q ); + +void modify_lsf( + float *lsf, + const int16_t n, + const int32_t sr_core, + const int16_t reset_q ); + +void init_PLC_enc( + PLC_ENC_EVS_HANDLE hPlcExt, + const int32_t sr_core ); + +void gPLC_encInfo( + PLC_ENC_EVS_HANDLE hPlcExt, + const int32_t total_brate, + const int16_t bwidth, + const int16_t last_clas, + const int16_t coder_type ); + +void resetTecDec( + TEC_DEC_HANDLE hTecDec ); + +void calcGainTemp_TBE( + float **pCldfbRealSrc, + float **pCldfbImagSrc, + float *loBuffer, + const int16_t startPos, /*!< Start position of the current envelope. */ + const int16_t stopPos, /*!< Stop position of the current envelope. */ + const int16_t lowSubband, /* lowSubband */ + float *pGainTemp, + const int16_t code ); + +void procTecTfa_TBE( + float *hb_synth, + float *gain, + const int16_t flat_flag, + const int16_t last_core, + const int16_t L_subfr, + const int16_t code ); + +void resetTecEnc( + TEC_ENC_HANDLE hTecEnc, + const int16_t flag ); + +void calcHiEnvLoBuff( + const int16_t noCols, + const int16_t *pFreqBandTable, /* i : freqbandTable */ + const int16_t nSfb, /* i : Number of scalefactors */ + float **pYBuf, + float *loBuf, + float *hiTempEnv ); + +void calcLoEnvCheckCorrHiLo( + const int16_t noCols, + const int16_t *pFreqBandTable, /* i : freqbandTable */ + float *loBuf, + float *loTempEnv, + float *loTempEnv_ns, + float *hiTempEnv, + int16_t *corr_flag /* o : 0 for original, 1 for TEC */ +); + +void tfaCalcEnv( + const float *shb_speech, + float *enr ); + +int16_t tfaEnc_TBE( + const float *enr, + const int16_t last_core, + const float *voicing, + const float *pitch_buf ); + +void tecEnc_TBE( + int16_t *corrFlag, + const float *voicing, + const int16_t coder_type ); + +void set_TEC_TFA_code( + const int16_t corrFlag, + int16_t *tec_flag, + int16_t *tfa_flag ); + +float Damping_fact( + const int16_t coder_type, /* i : ACELP core coder type */ + const int16_t nbLostCmpt, /* i : compt for number of consecutive lost frame */ + int16_t last_good, /* i : class of last good received frame */ + float stab_fac, /* i : LSF stability factor */ + float *lp_gainp, /* i/o: low passed pitch gain used for concealment */ + const int16_t core /* i : current core: ACELP = 0, TCX20 = 1, TCX10 = 2 */ +); + +void fer_energy( + const int16_t L_frame, /* i : frame length */ + const int16_t clas, /* i : frame classification */ + const float synth[], /* i : synthesized speech at Fs = 12k8 Hz */ + const float pitch, /* i : pitch period */ + float *enr, /* o : pitch-synchronous or half_frame energy */ + const int16_t useOffset /* i : speech pointer offset (0 or L_FRAME) */ +); + +float getLevelSynDeemph( + const float h1Init[], /* i : input value or vector to be processed */ + const float A[], /* i : LPC coefficients */ + const int16_t lenLpcExc, /* i : length of the LPC excitation buffer */ + const float preemph_fac, /* i : preemphasis factor */ + const int16_t numLoops /* i : number of loops */ +); + +void genPlcFiltBWAdap( + const int32_t sr_core, /* i : core sampling rate */ + float *lpFiltAdapt, /* o : filter coefficients for filtering codebooks in case of flc */ + const int16_t type, /* i : type of filter, either 0 : lowpass or 1 : highpass */ + const float alpha /* i : fade out factor [0 1) used decrease filter tilt */ +); + +void highPassFiltering( + const int16_t last_good, /* i : last classification type */ + const int16_t L_buffer, /* i : buffer length */ + float exc2[], /* i/o: unvoiced excitation before the high pass filtering */ + const float hp_filt[], /* i : high pass filter coefficients */ + const int16_t l_fir_fer /* i : high pass filter length */ +); + +int16_t GetPLCModeDecision( + Decoder_State *st /* i/o: decoder memory state pointer */ +); + +void addBassPostFilter( + const float *harm_timeIn, + const int16_t samplesToProcess, + float **rAnalysis, + float **iAnalysis, + HANDLE_CLDFB_FILTER_BANK cldfb ); + +ivas_error TonalMDCTConceal_Init( + TonalMDCTConcealPtr hTonalMDCTConc, + const uint16_t samplesPerBlock, + const uint16_t nSamplesCore, + const uint16_t nScaleFactors, + TCX_CONFIG_HANDLE hTcxCfg ); + +void TonalMDCTConceal_SaveFreqSignal( + TonalMDCTConcealPtr hTonalMDCTConc, + const float *mdctSpectrum, + const uint16_t numSamples, + const uint16_t nNewSamplesCore, + const float *scaleFactors, + const int16_t infoIGFStartLine ); + +void TonalMDCTConceal_UpdateState( + TonalMDCTConcealPtr hTonalMDCTConc, + const int16_t numSamples, + const float pitchLag, + const int16_t badBlock, + const int16_t tonalConcealmentActive ); + +void TonalMDCTConceal_SaveTimeSignal( + TonalMDCTConcealPtr hTonalMDCTConc, + float *timeSignal, + const int16_t numSamples ); + +void TonalMDCTConceal_Detect( + const TonalMDCTConcealPtr hTonalMDCTConc, /*IN */ + const float pitchLag, /*IN */ + int16_t *umIndices, /*OUT*/ + const PsychoacousticParameters *psychParamsCurrent /*IN*/ +); + +void TonalMDCTConceal_Apply( + TonalMDCTConcealPtr hTonalMDCTConc, /*IN */ + float *mdctSpectrum, /*OUT*/ + const PsychoacousticParameters *psychParamsCurrent /*IN*/ +); + +void TonalMDCTConceal_InsertNoise( + const TonalMDCTConcealPtr hTonalMDCTConc, /*IN */ + float *mdctSpectrum, /*OUT*/ + const int16_t tonalConcealmentActive, + int16_t *pSeed, /*IN/OUT*/ + const float tiltCompFactor, + const float crossfadeGain, + const float concealment_noise[L_FRAME48k], + const float cngLevelBackgroundTrace_bfi, + const int16_t crossOverFreq ); + +void DetectTonalComponents( + uint16_t indexOfTonalPeak[], + uint16_t lowerIndex[], + uint16_t upperIndex[], + uint16_t *pNumIndexes, + const float lastPitchLag, + const float currentPitchLag, + const float lastMDCTSpectrum[], + const float scaleFactors[], + const float secondLastPowerSpectrum[], + const uint16_t nSamples, + const uint16_t nSamplesCore, + float floorPowerSpectrum, + const PsychoacousticParameters *psychParamsCurrent ); + +void RefineTonalComponents( + uint16_t indexOfTonalPeak[], + uint16_t lowerIndex[], + uint16_t upperIndex[], + float phaseDiff[], + float phases[], + uint16_t *pNumIndexes, + const float lastPitchLag, + const float currentPitchLag, + const float lastMDCTSpectrum[], + const float scaleFactors[], + const float secondLastPowerSpectrum[], + const uint16_t nSamples, + const uint16_t nSamplesCore, + float floorPowerSpectrum, + const PsychoacousticParameters *psychParamsCurrent ); + +ivas_error PsychoacousticParameters_Init( + const int32_t sr_core, /* i : sampling rate of core-coder */ + const int16_t nBins, /* i : Number of bins (spectral lines) */ + const int8_t nBands, /* i : Number of spectrum subbands */ + const int16_t isTCX20, /* i : Flag indicating if the subband division is for TCX20 or TCX10 */ + const int16_t isWarped, /* i : Flag indicating if the scale is linear or warped */ + PsychoacousticParameters *pPsychParams ); + +void concealment_init( + const int16_t L_frameTCX, + T_PLCInfo_HANDLE hPlcInfo ); + +void concealment_decode( + const int16_t core, + float *invkoef, + T_PLCInfo_HANDLE hPlcInfo ); + +void concealment_update( + const int16_t bfi, + const int16_t core, + const int16_t harmonic, + float *invkoef, + T_PLCInfo_HANDLE hPlcInfo ); + +void concealment_update2( + const float *outx_new, + T_PLCInfo_HANDLE hPlcInfo, + const int16_t L_frameTCX ); + +void concealment_signal_tuning( + Decoder_State *st, + const int16_t bfi, + float *outx_new, + const int16_t past_core_mode ); + +void waveform_adj2( + T_PLCInfo_HANDLE hPlcInfo, + float *overlapbuf, + float *outx_new, + const int16_t delay, + const int16_t bfi_cnt, + const int16_t bfi ); + +float SFM_Cal( + const float fcoef[], + const int16_t n ); + +void set_state( + int16_t *state, + const int16_t num, + const int16_t N ); + +int16_t RFFTN( + float *afftData, + const float *trigPtr, + const int16_t len, + const int16_t isign ); + +void DoFFT( + float *re2, + float *im2, + const int16_t length ); + +/*! r: flag indicating a valid bitrate */ +int16_t is_EVS_bitrate( + const int32_t ivas_total_brate, /* i : EVS total bitrate */ + int16_t *Opt_AMR_WB /* i : AMR-WB IO flag */ +); + +/*! r: codec mode */ +int16_t get_codec_mode( + const int32_t total_brate /* i : total bitrate */ +); + +int16_t getTcxonly( + const int16_t element_mode, /* i : IVAS element mode */ + const int32_t total_brate, /* i : total bitrate */ + const int16_t MCT_flag, /* i : hMCT handle allocated (1) or not (0)*/ + const int16_t is_ism_format /* i : flag indicating ISM format */ +); + +int16_t getTnsAllowed( + const int32_t total_brate, /* i : total bitrate */ + const int16_t igf, /* i : flag indicating IGF activity*/ + const int16_t element_mode /* i : IVAS element mode */ +); + +int16_t getCtxHm( + const int16_t element_mode, /* i : IVAS element mode */ + const int32_t total_brate, /* i : total bitrate */ + const int16_t rf_flag /* i : flag to signal the RF mode */ +); + +int16_t getResq( + const int32_t total_brate /* i : total bitrate */ +); + +int16_t getRestrictedMode( + const int16_t element_mode, /* i : IVAS element mode */ + const int32_t total_brate, /* i : total bitrate */ + const int16_t Opt_AMR_WB /* i : flag indicating AMR-WB IO mode */ +); + +int16_t getMdctWindowLength( + const int16_t fscale ); + +int16_t sr2fscale( + const int32_t sr_core /* i : internal sampling rate */ +); + +int32_t getCoreSamplerateMode2( + const int16_t element_mode, /* i : IVAS element mode */ + const int32_t total_brate, /* i : total bitrate */ + const int16_t bwidth, /* i : audio bandwidth */ + const int16_t flag_ACELP16k, /* i : ACELP@16kHz flag */ + const int16_t rf_mode, /* i : flag to signal the RF mode */ + const IVAS_FORMAT is_ism_format /* i : flag indicating ISM format */ +); + +float getTcxBandwidth( + const int16_t bwidth /* i : audio bandwidth */ +); + +int16_t getIgfPresent( + const int16_t element_mode, /* i : IVAS element mode */ + const int32_t total_brate, /* i : total bitrate */ + const int16_t bwidth, /* i : audio bandwidth */ + const int16_t rf_mode /* i : flag to signal the RF mode */ +); + +int16_t getCnaPresent( + const int16_t element_mode, /* i : element mode */ + const int32_t element_brate, /* i : element bitrate */ + const int32_t total_brate, /* i : total bitrate */ + const int16_t bwidth /* i : audio bandwidth */ +); + +int16_t getTcxLtp( + const int32_t sr_core /* i : internal sampling rate */ +); + +int16_t initPitchLagParameters( + const int32_t sr_core, /* i : internal sampling rate */ + int16_t *pit_min, + int16_t *pit_fr1, + int16_t *pit_fr1b, + int16_t *pit_fr2, + int16_t *pit_max ); + +void attenuateNbSpectrum( + const int16_t L_frame, + float *spectrum ); + +void SetModeIndex( + Encoder_State *st, /* i : Encoder state */ + const int32_t last_total_brate, /* i : last total bitrate */ + const int16_t last_element_mode, /* i : last IVAS element mode */ + const int16_t MCT_flag /* i : hMCT handle allocated (1) or not (0) */ +); + +int16_t getNumTcxCodedLines( + const int16_t bwidth /* i : audio bandwidth */ +); + +int16_t getTcxLpcShapedAri( + const int32_t total_brate, /* i : total bitrate */ + const int16_t rf_mode, /* i : flag to signal the RF mode */ + const int16_t element_mode /* i : IVAS element mode */ +); + +void IGFEncApplyMono( + Encoder_State *st, /* i : Encoder state */ + const int16_t igfGridIdx, /* i : IGF grid index */ + float *pMDCTSpectrum, /* i/o: MDCT spectrum */ + float *pPowerSpectrum, /* i/o: MDCT^2 + MDST^2 spectrum, or estimate */ + const int16_t isTCX20, /* i : flag indicating if the input is TCX20 or TCX10/2xTCX5 */ + const int16_t isTNSActive, /* i : flag indicating if the TNS is active */ + const int16_t sp_aud_decision0, /* i : first stage switching decision */ + const int16_t vad_hover_flag /* i : VAD hangover flag */ +); + +void IGFEncApplyStereo( + STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct, /* i/o: MDCT stereo encoder structure */ + int16_t ms_mask[2][MAX_SFB], /* i : bandwise MS mask */ + const IGF_ENC_INSTANCE_HANDLE hIGFEnc[CPE_CHANNELS], /* i : instance handle of IGF Encoder */ + const int16_t igfGridIdx, /* i : IGF grid index */ + Encoder_State *sts[CPE_CHANNELS], /* i : Encoder state */ + float *pPowerSpectrum[CPE_CHANNELS], /* i/o: MDCT^2 + MDST^2 spectrum, or estimate */ + float *pPowerSpectrumMsInv[CPE_CHANNELS][NB_DIV], /* i/o: inverse power spectrum */ + float *inv_spectrum[CPE_CHANNELS][NB_DIV], /* i : inverse spectrum */ + const int16_t frameno, /* i : flag indicating index of current subframe */ + const int16_t sp_aud_decision0, /* i : sp_aud_decision0 */ + const int32_t element_brate, /* i : element bitrate */ + const int16_t mct_on /* i : flag mct block (1) or stereo (0) */ +); + +void IGFEncConcatenateBitstream( + const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i : instance handle of IGF Encoder */ + const int16_t bsBits, /* i : number of IGF bits written to list of indices */ + BSTR_ENC_HANDLE hBstr /* i/o: bitstream handle */ +); + +void IGFEncResetTCX10BitCounter( + const IGF_ENC_INSTANCE_HANDLE hIGFEnc /* i : instance handle of IGF Encoder */ +); + +ivas_error IGF_Reconfig( + IGF_ENC_INSTANCE_HANDLE *hIGFEnc, /* i/o: instance handle of IGF Encoder */ + const int16_t igf, /* i : IGF on/off */ + const int16_t reset, /* i : reset flag */ + const int32_t brate, /* i : bitrate for configuration */ + const int16_t bwidth, /* i : signal bandwidth */ + const int16_t element_mode, /* i : IVAS element mode */ + const int16_t rf_mode /* i : flag to signal the RF mode */ +); + +void IGFEncSetMode( + const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i : instance handle of IGF Encoder */ + const int32_t total_brate, /* i : encoder total bitrate */ + const int16_t bwidth, /* i : encoder audio bandwidth */ + const int16_t element_mode, /* i : IVAS element mode */ + const int16_t rf_mode /* i : flag to signal the RF mode */ +); + +/*! r: number of bits written per frame */ +int16_t IGFEncWriteBitstream( + const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i : instance handle of IGF Encoder */ + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + int16_t *pBitOffset, /* i : ptr to bitOffset counter */ + const int16_t igfGridIdx, /* i : igf grid index see declaration of IGF_GRID_IDX for details */ + const int16_t isIndepFlag /* i : if 1 frame is independent, 0 = frame is coded with data from previous frame */ +); + +/*! r: total number of bits written */ +int16_t IGFEncWriteConcatenatedBitstream( + const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i : instance handle of IGF Encoder */ + BSTR_ENC_HANDLE hBstr /* i/o: encoder bitstream handle */ +); + +void IGFDecApplyMono( + const IGF_DEC_INSTANCE_HANDLE hIGFDec, /* i : instance handle of IGF Decoder */ + float *spectrum, /* i/o: MDCT spectrum */ + const int16_t igfGridIdx, /* i : in case of CELP->TCX switching, use 1.25 framelength */ + const int16_t bfi, /* i : frame loss == 1, frame good == 0 */ + const int16_t element_mode /* i : IVAS element mode */ +); + +void IGFDecCopyLPCFlatSpectrum( + const IGF_DEC_INSTANCE_HANDLE hIGFDec, /* i/o: instance handle of IGF Decoder */ + const float *pSpectrumFlat, /* i : LPC flattend spectrum from TCX dec */ + const int16_t igfGridIdx /* i : IGF grid index */ +); + +void IGFDecReadData( + const IGF_DEC_INSTANCE_HANDLE hIGFDec, /* i/o: instance handle of IGF Deccoder */ + Decoder_State *st, /* i : decoder state */ + const int16_t igfGridIdx, /* i : in case of CELP->TCX switching, use 1.25 framelength */ + const int16_t isIndepFrame /* i : if 1: arith dec force reset, if 0: no reset */ +); + +/*! r: return igfAllZero flag indicating if no envelope is transmitted */ +int16_t IGFDecReadLevel( + const IGF_DEC_INSTANCE_HANDLE hIGFDec, /* i/o: instance handle of IGF Deccoder */ + Decoder_State *st, /* i : decoder state */ + const int16_t igfGridIdx, /* i : in case of CELP->TCX switching, use 1.25 framelength */ + const int16_t isIndepFrame /* i : if 1: arith dec force reset, if 0: no reset */ +); + +void IGFDecRestoreTCX10SubFrameData( + const IGF_DEC_INSTANCE_HANDLE hIGFDec, /* o : instance handle of IGF Decoder */ + const int16_t subFrameIdx /* i : index of subframe */ +); + +void init_igf_dec( + IGF_DEC_INSTANCE_HANDLE hIGFDec /* i/o: IGF decoder handle */ +); + +void IGFDecSetMode( + const IGF_DEC_INSTANCE_HANDLE hIGFDec, /* o : instance handle of IGF Decoder */ + const int32_t total_brate, /* i : bitrate */ + const int16_t bwidth, /* i : audio bandwidth */ + const int16_t element_mode, /* i : IVAS element mode */ + const int16_t defaultStartLine, /* i : default start subband index */ + const int16_t defaultStopLine, /* i : default stop subband index */ + const int16_t rf_mode /* i : flag to signal the RF mode */ +); + +void IGFDecStoreTCX10SubFrameData( + const IGF_DEC_INSTANCE_HANDLE hIGFDec, /* i/o: instance handle of IGF Decoder */ + const int16_t subFrameIdx /* i : index of subframe */ +); + +void IGFDecUpdateInfo( + const IGF_DEC_INSTANCE_HANDLE hIGFDec, /* i/o: instance handle of IGF Decoder */ + const int16_t subFrameIdx, /* i : subframe index */ + const int16_t igfGridIdx /* i : IGF grid index */ +); + +/*! r: error value: 0 -> error, 1 -> ok */ +int16_t IGFCommonFuncsIGFConfiguration( + const int32_t total_brate, /* i : bitrate in bs e.g. 9600 for 9.6kbs */ + const int16_t bwidth, /* i : audio bandwidth */ + const int16_t element_mode, /* i : IVAS element mode */ + H_IGF_INFO hIGFInfo, /* o : IGF info handle */ + const int16_t rf_mode /* i : flag to signal the RF mode */ +); + +/*! r: error value: 0 -> error, 1 -> ok */ +int16_t IGFCommonFuncsIGFGetCFTables( + const int32_t total_brate, /* i : bitrate in bs e.g. 9600 for 9.6kbs */ + const int16_t bwidth, /* i : audio bandwidth */ + const int16_t element_mode, /* i : element mode */ + const int16_t rf_mode, /* i : flag to signal the RF mode */ + const uint16_t **cf_se00, /* i : CF table for t == 0 and f == 0 */ + const uint16_t **cf_se01, /* i : CF table for t == 0 and f == 1 */ + int16_t *cf_off_se01, /* o : offset for CF table above */ + const uint16_t **cf_se02, /* i : CF tables for t == 0 and f >= 2 */ + const int16_t **cf_off_se02, /* o : offsets for CF tables above */ + const uint16_t **cf_se10, /* i : CF table for t == 1 and f == 0 */ + int16_t *cf_off_se10, /* o : offset for CF table above */ + const uint16_t **cf_se11, /* i : CF tables for t == 1 and f >= 1 */ + const int16_t **cf_off_se11 /* o : offsets for CF tables above */ +); + +/*! r: multiplication factor */ +int16_t IGF_ApplyTransFac( + const int16_t val, /* i : input value for multiplication, Q15 */ + const float transFac /* i : multiplicator for variable val, Q14: 1.25f=0x5000, 1.0f=0x4000, 0.5f=0x2000 */ +); + +/*! r: return bitrate index */ +int16_t IGF_MapBitRateToIndex( + const int32_t brate, /* i : bitrate */ + const int16_t bwidth, /* i : audio bandwidth */ + const int16_t element_mode, /* i : IVAS element mode */ + const int16_t rf_mode /* i : flag to signal the RF mode */ +); + +void IGFSCFEncoderOpen( + IGFSCFENC_INSTANCE_HANDLE hPublicData, /* i : handle to public data */ + H_IGF_INFO hIgfInfo, /* i : IGF info handle */ + const int32_t total_brate, /* i : total bitrate */ + const int16_t bwidth, /* i : audio bandwidth */ + const int16_t element_mode, /* i : IVAS element mode */ + const int16_t rf_mode /* i : flag to signal the RF mode */ +); + +void IGFSCFEncoderReset( + IGFSCFENC_INSTANCE_HANDLE hPublicData /* i : handle to public data or NULL in case there was no instance created */ +); + +int16_t IGFSCFEncoderEncode( + IGFSCFENC_INSTANCE_HANDLE hPublicData, /* i : handle to public data or NULL in case there was no instance created */ + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const int16_t bitCount, /* i : offset to the first bit in bitbuffer which should be readed by iisArithDecoderDecode function */ + int16_t *sfe, /* i : ptr to an array which contain quantized scalefactor energies */ + const int16_t igfGridIdx, /* i : igf grid index see declaration of IGF_GRID_IDX for details */ + const int16_t indepFlag /* i : if 1 frame is independent, 0 = frame is coded with data from previous frame */ +); + +void IGFSCFEncoderSaveContextState( + IGFSCFENC_INSTANCE_HANDLE hPublicData, /* i : handle to public data or NULL in case there was no instance created */ + const int16_t igfGridIdx /* i : igf grid index see declaration of IGF_GRID_IDX for details */ +); + +void IGFSCFEncoderRestoreContextState( + IGFSCFENC_INSTANCE_HANDLE hPublicData, /* i : handle to public data or NULL in case there was no instance created */ + const int16_t igfGridIdx /* i : igf grid index see declaration of IGF_GRID_IDX for details */ +); + +void IGFSCFDecoderOpen( + IGFSCFDEC_INSTANCE_HANDLE hPublicData, /* i : handle to public data */ + H_IGF_INFO hIgfInfo, /* i : IGF info handle */ + const int32_t total_brate, + const int16_t bwidth, + const int16_t element_mode, + const int16_t rf_mode ); + +void IGFSCFDecoderReset( + IGFSCFDEC_INSTANCE_HANDLE hPublicData /* i : handle to public data or NULL in case there was no instance created */ +); + +void IGFSCFDecoderDecode( + IGFSCFDEC_INSTANCE_HANDLE hPublicData, /* i : handle to public data or NULL in case there was no instance created */ + Decoder_State *st, /* i/o: pointer to decoder state */ + int16_t *sfe, /* o : ptr to an array which will contain the decoded quantized coefficients */ + const int16_t igfGridIdx, /* i : igf grid index see declaration of IGF_GRID_IDX for details */ + const int16_t indepFlag /* i : if 1 on input the decoder will be forced to reset, + if 0 on input the decoder will be forced to encode without a reset */ +); + +/*! r: offset value */ +int16_t tbe_celp_exc_offset( + const int16_t T0, /* i : Integer pitch */ + const int16_t T0_frac /* i : Fractional part of the pitch */ +); + +void blend_subfr2( + float *sigIn1, /* i : input signal for fade-out */ + float *sigIn2, /* i : input signal for fade-in */ + float *sigOut /* o : output signal */ +); + +void init_tcx_window_cfg( + TCX_CONFIG_HANDLE hTcxCfg, /* i : TCX Config handle */ + const int32_t sr_core, /* i : SR core */ + const int32_t input_Fs, /* i : input/output SR */ + const int16_t L_frame, /* i : L_frame at sr_core */ + const int16_t L_frameTCX, /* i : L_frame at i/o SR */ + const int16_t encoderLookahead_enc, /* i : encoder LA at sr_core */ + const int16_t encoderLookahead_FB, /* i : encoder LA at i/o SR */ + const int16_t mdctWindowLength, /* i : window length at sr_core */ + const int16_t mdctWindowLengthFB, /* i : window length at i/o SR */ + const int16_t element_mode /* i : mode of CPE/SCE */ +); + +void init_tcx_cfg( + TCX_CONFIG_HANDLE hTcxCfg, + const int32_t total_brate, + const int32_t sr_core, + const int32_t input_Fs, + const int16_t L_frame, + const int16_t bwidth, + const int16_t L_frameTCX, + const int16_t fscale, + const int16_t encoderLookahead_enc, + const int16_t encoderLookahead_FB, + const float preemph_fac, + const int16_t tcxonly, + const int16_t rf_mode, + const int16_t igf, + const int16_t infoIGFStopFreq, + const int16_t element_mode, + const int16_t ini_frame, + const int16_t MCT_flag /* i : hMCT handle allocated (1) or not (0) */ +); diff --git a/lib_com/pvq_com.c b/lib_com/pvq_com.c new file mode 100644 index 0000000000000000000000000000000000000000..7a13fe3f55197ed9710edcc694b2a62e24e35a7d --- /dev/null +++ b/lib_com/pvq_com.c @@ -0,0 +1,974 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "stl.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * Local definitions + *-------------------------------------------------------------------*/ + +/*! r: Approximate integer division for negative input */ +int16_t shrtCDivSignedApprox( + const int16_t num, /* i : numerator */ + const int16_t den /* i : denominator */ +) +{ + Word16 pool_part; + pool_part = extract_h( L_mult( negate( abs_s( num ) ), lim_neg_inv_tbl_fx[den] ) ); + /* neg_in always, positive out always, so that positive truncation(rounding) towards zero is used */ + if ( num < 0 ) + { + pool_part = negate( pool_part ); /* make negative, one op */ + } + + return pool_part; +} + +/*! r: Approximate integer division for positive input using lookup table */ +int32_t intLimCDivPos( + const int32_t NUM, /* i : numerator */ + const int16_t DEN /* i : denominator */ +) +{ + int32_t result; + + result = (int32_t) ( ( (uint64_t) ( NUM << 1 ) * intLimCDivInvDQ31[DEN] ) >> 32 ); + + return result; +} + +/*! r: Approximate integer division for signed input using lookup table */ +static int32_t intLimCDivSigned( + const int32_t NUM, /* i : numerator */ + const int16_t DEN /* i : denominator */ +) +{ + int32_t result; + int32_t tmp_num; + + tmp_num = max( NUM, -NUM ); + result = (int32_t) sign( (float) NUM ) * (int32_t) ( ( (uint64_t) ( tmp_num << 1 ) * intLimCDivInvDQ31[DEN] ) >> 32 ); + + return result; +} + +static void nearProjQ15( + const int16_t x, /* i : input coefficient */ + int16_t *result /* o : projection */ +) +{ + int16_t NearProjC[4] = { 14967, -25518, 3415, 32351 }; + int32_t P12, P3; + + P12 = ( (int32_t) x * (int32_t) NearProjC[0] >> 16 ) + (int32_t) NearProjC[1]; + P3 = ( (int32_t) x * P12 >> 14 ) + (int32_t) NearProjC[2]; + *result = (int16_t) ( ( (int16_t) x * P3 >> 15 ) + (int32_t) NearProjC[3] ); + + return; +} + + +void obtainEnergyQuantizerDensity( + const int16_t L_in, /* i : left vector energy */ + const int16_t R_in, /* i : right vector energy */ + int16_t *Density /* o : quantizer density */ +) +{ + int32_t Rnrg; + int16_t den; + int16_t L, R; + + L = L_in; + R = R_in; + den = ( 2 * L - 1 ); + if ( den <= 67 ) + { + Rnrg = (int32_t) ( ( (uint64_t) ( (int32_t) R << 1 ) * intLimCDivInvDQ31[den] ) >> 32 ); + } + else + { + Rnrg = ( R / den ); + } + Rnrg += 28; + + if ( ( R - 96 < 56 ) && ( R - 96 < Rnrg ) ) + { + Rnrg = R - 96; + } + else if ( 56 < Rnrg ) + { + Rnrg = 56; + } + + Rnrg = max( 0, Rnrg ); /* _f table set to 1 for low Rnrg */ + *Density = (int16_t) obtainEnergyQuantizerDensity_f[Rnrg]; + + return; +} + + +static void dsDirac2Dirac( + const int16_t dsDiracIndex, /* i : input index */ + int16_t *diracs /* o : number of diracs */ +) +{ + int16_t dsHighIndex; + + dsHighIndex = dsDiracIndex - DS_INDEX_LINEAR_END - 1; + *diracs = dsDiracIndex; + if ( dsDiracIndex > DS_INDEX_LINEAR_END ) + { + *diracs = dsHighDiracsTab[dsHighIndex]; + } + + return; +} + + +static void dsDiracPerQuanta( + const int16_t td, /* i : Length of vector segment */ + const int16_t t_quanta, /* i : Assigned number of quanta */ + const int16_t dsm, /* i : Conservative rounding flag */ + const uint8_t *const *frQuanta, /* i : Quanta lookup table */ + int16_t *DsIdx /* o : Lookup table index */ +) +{ + const uint8_t *sv; + int16_t nsv; + int16_t t_quanta_o; + int16_t dsIndex; + int16_t i; + + sv = frQuanta[td]; + nsv = sv[0]; + + t_quanta_o = t_quanta - QUANTAQ3OFFSET; + if ( t_quanta_o >= sv[nsv] ) + { + *DsIdx = nsv; + return; + } + if ( t_quanta_o <= sv[1] ) + { + *DsIdx = 1; + return; + } + dsIndex = 1 << frQuanta[0][td]; + if ( t_quanta_o > sv[nsv >> 1] ) + { + dsIndex = nsv - dsIndex; /*single op*/ + } + for ( i = frQuanta[0][td] - 1; i >= 0; i-- ) + { + dsIndex += shl( sub( shl( lshr( sub( sv[dsIndex], t_quanta_o ), 15 ), 1 ), 1 ), i ); + } + dsIndex += ( t_quanta_o > sv[dsIndex] ); + dsIndex -= ( dsIndex > 1 ); + + if ( dsm == PVQ_CONS ) + { + *DsIdx = dsIndex; + return; + } + *DsIdx = dsIndex + ( ( sv[dsIndex + 1] + sv[dsIndex] ) < ( t_quanta_o << 1 ) ); + + return; +} + + +void QuantaPerDsDirac( + const int16_t td, /* i : Length of vector segment */ + const int16_t dsDiracIndex, /* i : Quanta table index */ + const uint8_t *const *dimFrQuanta, /* i : Quanta lookup table */ + int16_t *Quanta /* i : Quanta */ +) +{ + if ( !dsDiracIndex ) + { + *Quanta = 0; + return; + } + *Quanta = ( (int16_t) dimFrQuanta[td][dsDiracIndex] ) + QUANTAQ3OFFSET; + + return; +} + + +void conservativeL1Norm( + const int16_t L, /* i : Length of vector segment */ + const int16_t Qvec, /* i : Assigned number of quanta */ + const int16_t Fcons, /* i : Conservative rounding flag */ + const int16_t Qavail, /* i : Input quanta remaining */ + const int16_t Qreserv, /* i : Input quanta in reservoir */ + const int16_t Dspec, /* i : assigned diracs from bitalloc */ + int16_t *Dvec, /* o : actual number of diracs */ + int16_t *Qspare, /* o : Output quanta remaining */ + int16_t *Qreservplus, /* o : Output quanta in reservoir */ + int16_t *Dspecplus /* o : Output number of diracs */ +) +{ + int16_t Minit, Mprime; + int16_t Qtestminus; + const uint8_t *frQuantaL; + + frQuantaL = hBitsN[L]; + + *Qreservplus = Qreserv + Qvec - QUANTAQ3OFFSET; + + dsDiracPerQuanta( L, Qvec, Fcons, hBitsN, &Minit ); + Mprime = Minit; + do + { + Qtestminus = frQuantaL[Mprime]; + *Qspare = Qavail - Qtestminus; + Mprime = Mprime - 1; + } while ( Mprime >= 0 && *Qspare < QUANTAQ3OFFSET ); + + if ( Mprime < 0 ) + { + *Qspare = Qavail + QUANTAQ3OFFSET; + } + + dsDirac2Dirac( Mprime + 1, Dvec ); + + *Dspecplus = Dspec + *Dvec; + + *Qreservplus -= frQuantaL[Minit]; + + *Qspare -= QUANTAQ3OFFSET; + + return; +} + +void bandBitsAdjustment( + const int16_t Brc, /* i : Current number of read quanta in range coder */ + const uint32_t INTrc, /* i : Range coder state */ + const int16_t Bavail, /* i : Available number of quanta */ + const int16_t Nbands, /* i : Number of bands */ + const int16_t D, /* i : Remaining number of bands to encode */ + const int16_t L, /* i : Size of current band */ + const int16_t Bband, /* i : Quanta allocation for current band */ + const int16_t Breserv, /* i : Quanta reservoir */ + int16_t *Bband_adj, /* o : Actual used number of quanta */ + int16_t *Brem, /* o : Quanta remaining */ + int16_t *Breservplus /* o : Quanta pool size */ +) +{ + int16_t Btemp; + int16_t Bff; + int16_t Dtmp, tmp_short1, tmp_short2; + + rangeCoderFinalizationFBits( Brc, INTrc, &Bff ); + + if ( D < Nbands ) + { + Dtmp = min( D, 3 ); /* avoid branch cost */ + Btemp = (int16_t) intLimCDivSigned( Breserv - Bff, Dtmp ); /* result always fits in Word16 */ + + *Breservplus = Bband + Breserv; + } + else + { + Btemp = 0; + *Breservplus = Bband + Bff; + } + + *Bband_adj = Bband; + tmp_short1 = L * 80; + if ( tmp_short1 < Bband ) + { + *Bband_adj = tmp_short1; + } + + tmp_short1 = Bavail - Bff; + tmp_short2 = *Bband_adj + Btemp; + + *Bband_adj = tmp_short2; + if ( tmp_short1 < tmp_short2 ) + { + *Bband_adj = tmp_short1; + } + if ( *Bband_adj < 0 ) + { + *Bband_adj = 0; + } + *Brem = Bavail - Bff; + + return; +} + + +/*-------------------------------------------------------------------* + * local_norm_s() + * + * + *-------------------------------------------------------------------*/ + +/*! r: n shifts needed to normalize */ +static int16_t local_norm_s( + int16_t short_var /* i/o: signed 16 bit variable / normalized value */ +) +{ + int16_t short_res; + + if ( short_var == -1 ) + { + return ( 16 - 1 ); + } + else + { + if ( short_var == 0 ) + { + return 0; + } + + else + { + if ( short_var < 0 ) + { + short_var = ~short_var; + } + + for ( short_res = 0; short_var < 0x4000; short_res++ ) + { + short_var <<= 1; + } + } + } + + return ( short_res ); +} + +/*! r: ratio Q11 */ +static int16_t Ratio_base2Q11( + const int16_t opp, /* i : opposite Q15 */ + const int16_t near /* i : near Q15 */ +) +{ + Word16 mc, nc, ms, ns, d, z; + Word16 result; + Word32 acc; + + ns = local_norm_s( opp ); /* exponent*/ + nc = local_norm_s( near ); /* exponent */ + + ms = opp << ns; /* mantissa */ + mc = near << nc; /* mantissa */ + + acc = L_mac( 538500224L, mc, -2776 ); /* a0*mc + a1, acc(Q27), a0(Q11), a1(Q27)*/ + z = mac_r( acc, ms, -2776 ); /* z in Q11, a0 in Q11 */ + d = sub( ms, mc ); /* d in Q15 */ + z = mult_r( z, d ); /* z in Q11 */ + + result = add( z, shl( sub( nc, ns ), 11 ) ); + + return result; +} + + +static void Ratio_rQ3( + int16_t opp, /* i : opposite */ + int16_t near, /* i : near */ + int16_t *result /* o : ratio */ +) +{ + int16_t tmp = 128; + + tmp += Ratio_base2Q11( opp, near ); + *result = ( tmp >> 8 ); + + return; +} + + +void densityAngle2RmsProjDec( + const int16_t D, /* i : density */ + const int16_t indexphi, /* i : decoded index from AR dec */ + int16_t *oppQ15, /* o : opposite */ + int16_t *nearQ15, /* o : near */ + int16_t *oppRatioQ3 /* o : ratio */ +) +{ + int16_t phiQ14q; + int32_t L_2xPhiQ14q; + int16_t oppTail, nearTail; + + phiQ14q = (int16_t) intLimCDivPos( labs( indexphi ) << 13, D >> 1 ); + if ( ( 0xFFFe & D ) == 0 ) /* even -> positive, odd -> 0 */ + { + phiQ14q = 1 << 13; /* one op */ + } + +#define C_TOP ( ( 1 << 14 ) - ( 1 << 6 ) ) +#define C_BOT ( 1 << 6 ) +#define C_SHRT_MAXABS ( 1L << 15 ) +#define C_SHRT_MAX_POS ( ( 1 << 15 ) - 1 ) +#define C_Q14_MAX ( 1 << 14 ) + + oppTail = phiQ14q >= C_TOP; + nearTail = phiQ14q < C_BOT; + if ( !( oppTail || nearTail ) ) + { + L_2xPhiQ14q = 2 * (int32_t) phiQ14q; + nearProjQ15( (int16_t) ( C_SHRT_MAXABS - L_2xPhiQ14q ), oppQ15 ); + nearProjQ15( phiQ14q << 1, nearQ15 ); + Ratio_rQ3( *oppQ15, *nearQ15, oppRatioQ3 ); + } + else + { + *oppRatioQ3 = ( 1 - 2 * nearTail ) * C_Q14_MAX; + *oppQ15 = oppTail * C_SHRT_MAX_POS; + *nearQ15 = nearTail * C_SHRT_MAX_POS; + } + +#undef C_TOP +#undef C_BOT +#undef C_SHRT_MAXABS +#undef C_SHRT_MAX_POS +#undef C_Q14_MAX + + return; +} + + +void densityAngle2RmsProjEnc( + const int16_t D, /* i : density */ + const int16_t phiQ14uq, /* i : angle */ + int16_t *indexphi, /* o : index */ + int16_t *oppQ15, /* o : opposite */ + int16_t *nearQ15, /* o : near */ + int16_t *oppRatioQ3 /* o : ratio */ +) +{ +#define C_MAX13 ( 1L << 13 ) + *indexphi = ( D * phiQ14uq + C_MAX13 ) >> 14; +#undef C_MAX13 + + if ( ( 0xFFFE & D ) == 0 ) + { + *indexphi = -1; /* one op */ + } + densityAngle2RmsProjDec( D, *indexphi, oppQ15, nearQ15, oppRatioQ3 ); + + return; +} + +void NearOppSplitAdjustment( + const int16_t qband, /* i : quanta for current band */ + const int16_t qzero, /* i : range coder finalization quanta */ + const int16_t Qac, /* i : range coder current quanta */ + const uint32_t INTac, /* i : range coder state */ + const int16_t qglobal, /* i : quanta input */ + const int16_t FlagCons, /* i : conservative rounding flag */ + const int16_t Np, /* i : number of parts */ + const int16_t Nhead, /* i : first part */ + const int16_t Ntail, /* i : remaining parts */ + const int16_t Nnear, /* i : length of near component */ + const int16_t Nopp, /* i : length of opposite component */ + int16_t oppRQ3, /* i : ratio */ + int16_t *qnear, /* o : quantized near */ + int16_t *qopp, /* o : quantized opposite */ + int16_t *qglobalupd /* o : quanta remaining */ +) +{ + int16_t qac, qskew, qboth, QIa, QIb; + int32_t L_QIb, qnum; + int16_t qmin, qavg, Midx; + + rangeCoderFinalizationFBits( Qac, INTac, &qac ); + qboth = qband - ( qac - qzero ); + qskew = 0; /* skew calc code */ + if ( Nhead > 1 ) + { + qavg = (int16_t) intLimCDivSigned( qboth, Np ); + dsDiracPerQuanta( Ntail, qavg, FlagCons, hBitsN, &Midx ); + QuantaPerDsDirac( Nhead, Midx, hBitsN, &qmin ); + + qskew = qavg - qmin; + qskew = max( 0, qskew ); + } /* end of skew calc code*/ + + QIa = (int16_t) intLimCDivPos( Nopp, Nnear ) + 1; /* always positive Word16 out */ + qnum = qband + qzero - qac - qskew - Nopp * (int32_t) oppRQ3; + L_QIb = 0; + if ( qnum > 0 ) + { + L_QIb = intLimCDivPos( qnum, QIa ); + } + QIb = (int16_t) min( 32767L, L_QIb ); /* saturate, L_QIb >= 0 */ + *qnear = QIb; + if ( QIb > qboth ) + { + *qnear = qboth; /*single op*/ + } + *qopp = qboth - *qnear; + *qglobalupd = qglobal - ( qac - qzero ); + + return; +} + +/*--------------------------------------------------------------------------* + * apply_gain() + * + * Apply gain + *--------------------------------------------------------------------------*/ + +void apply_gain( + const int16_t *ord, /* i : Indices for energy order */ + const int16_t *band_start, /* i : Sub band start indices */ + const int16_t *band_end, /* i : Sub band end indices */ + const int16_t num_sfm, /* i : Number of bands */ + const float *gains, /* i : Band gain vector */ + float *xq /* i/o: float synthesis / gain adjusted synth */ +) +{ + int16_t band, i; + float g; + + for ( band = 0; band < num_sfm; band++ ) + { + g = gains[ord[band]]; + + for ( i = band_start[band]; i < band_end[band]; i++ ) + { + xq[i] *= g; + } + } + + return; +} + + +/*--------------------------------------------------------------------------* + * fine_gain_quant() + * + * Fine gain quantization + *--------------------------------------------------------------------------*/ + +void fine_gain_quant( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const int16_t *ord, /* i : Indices for energy order */ + const int16_t num_sfm, /* i : Number of bands */ + const int16_t *gain_bits, /* i : Gain adjustment bits per sub band */ + float *fg_pred, /* i/o: Predicted gains / Corrected gains */ + const float *gopt /* i : Optimal gains */ +) +{ + int16_t band; + int16_t gbits; + int16_t idx; + float gain_db, gain_dbq; + float err; + + for ( band = 0; band < num_sfm; band++ ) + { + gbits = gain_bits[ord[band]]; + if ( fg_pred[band] != 0 && gbits > 0 ) + { + err = gopt[band] / fg_pred[band]; + gain_db = 20.0f * (float) log10( err ); + idx = (int16_t) squant( gain_db, &gain_dbq, finegain[gbits - 1], gain_cb_size[gbits - 1] ); + push_indice( hBstr, IND_PVQ_FINE_GAIN, idx, gbits ); + + /* Update prediced gain with quantized correction */ + fg_pred[band] *= (float) pow( 10, gain_dbq * 0.05f ); + } + } + + return; +} + +/*-------------------------------------------------------------------* + * srt_vec_ind() + * + * sort vector and save sorting indices + *-------------------------------------------------------------------*/ + +void srt_vec_ind( + const int16_t *linear, /* i : linear input */ + int16_t *srt, /* o : sorted output */ + int16_t *I, /* o : index for sorted output */ + const int16_t length /* i : length of vector */ +) +{ + float linear_f[MAX_SRT_LEN]; + float srt_f[MAX_SRT_LEN]; + + mvs2r( linear, linear_f, length ); + srt_vec_ind_f( linear_f, srt_f, I, length ); + mvr2s( srt_f, srt, length ); + + return; +} + +/*-------------------------------------------------------------------* + * srt_vec_ind_f() + * + * sort vector and save sorting indices, using float input values + *-------------------------------------------------------------------*/ + +void srt_vec_ind_f( + const float *linear, /* i : linear input */ + float *srt, /* o : sorted output */ + int16_t *I, /* o : index for sorted output */ + const int16_t length /* i : length of vector */ +) +{ + int16_t pos, npos; + int16_t idxMem; + float valMem; + + /*initialize */ + for ( pos = 0; pos < length; pos++ ) + { + I[pos] = pos; + } + + mvr2r( linear, srt, length ); + + /* now iterate */ + for ( pos = 0; pos < ( length - 1 ); pos++ ) + { + for ( npos = ( pos + 1 ); npos < length; npos++ ) + { + if ( srt[npos] < srt[pos] ) + { + idxMem = I[pos]; + I[pos] = I[npos]; + I[npos] = idxMem; + + valMem = srt[pos]; + srt[pos] = srt[npos]; + srt[npos] = valMem; + } + } + } + + return; +} + +#define WMC_TOOL_SKIP + +/*-------------------------------------------------------------------* + * UMult_32_32() + * + * + *-------------------------------------------------------------------*/ + +/*! r: Multiplication result */ +uint32_t UMult_32_32( + const uint32_t UL_var1, /* i : factor 1 */ + const uint32_t UL_var2 /* i : factor 2 */ +) +{ + uint64_t tmp; + + tmp = (uint64_t) UL_var1 * (uint64_t) UL_var2; + + return (uint32_t) ( tmp >> 32 ); +} + +/*-------------------------------------------------------------------* + * UL_div() + * + * Calculate UL_num/UL_den. UL_num assumed to be Q31, UL_den assumed + * to be Q32, then result is in Q32. + *-------------------------------------------------------------------*/ + +/*! r: Division result */ +static uint32_t UL_div( + const uint32_t UL_num, /* i : numerator */ + const uint32_t UL_den /* i : denominator */ +) +{ + uint32_t UL_e, UL_Q; + uint32_t UL_msb; + int16_t i; + + UL_e = 0xffffffff - UL_den; + UL_Q = UL_num; + + for ( i = 0; i < 5; i++ ) + { + UL_msb = UMult_32_32( UL_Q, UL_e ); + UL_Q = UL_Q + UL_msb; + UL_e = UMult_32_32( UL_e, UL_e ); + } + + return UL_Q; +} + + +/*-------------------------------------------------------------------* + * UL_inverse() + * + * Calculate inverse of UL_val. Output in Q_exp. + *-------------------------------------------------------------------*/ + +/*! r: inverse */ +uint32_t UL_inverse( + const uint32_t UL_val, /* i : input value Q_exp */ + int16_t *exp /* i/o: input exp / result exp */ +) +{ + uint32_t UL_tmp; + + *exp = norm_ul( UL_val ); /* aligned to BASOP */ + UL_tmp = UL_val << ( *exp ); /* Q32*/ + + *exp = 32 + 31 - *exp; + + return UL_div( 0x80000000, UL_tmp ); +} + +/*----------------------------------------------------------------------------- + * ratio() + * + * Divide the numerator by the denominator. + *----------------------------------------------------------------------------*/ + +/*! r: ratio */ +Word16 ratio( + const Word32 numer, /* i : numerator */ + const Word32 denom, /* i : denominator */ + Word16 *expo /* i/o: input exp / result exp */ +) +{ + Word16 expNumer, expDenom; + Word16 manNumer, manDenom; + Word16 quotient; + + expDenom = norm_l( denom ); /* exponent */ + manDenom = extract_h( L_shl( denom, expDenom ) ); /* mantissa */ + expNumer = norm_l( numer ); /* exponent */ + manNumer = extract_h( L_shl( numer, expNumer ) ); /* mantissa */ + manNumer = shr( manNumer, 1 ); /* Ensure the numerator < the denominator */ + quotient = div_s( manNumer, manDenom ); /* in Q14 */ + + *expo = sub( expNumer, expDenom ); + + return quotient; /* Q14 */ +} + +/*----------------------------------------------------------------------------- + * atan2_fx(): + * + * Approximates arctan piecewise with various 4th to 5th order least square fit + * polynomials for input in 5 segments: + * - 0.0 to 1.0 + * - 1.0 to 2.0 + * - 2.0 to 4.0 + * - 4.0 to 8.0 + * - 8.0 to infinity + *---------------------------------------------------------------------------*/ + +/*! r: Angle between 0 and EVS_PI/2 radian (Q14) */ +Word16 atan2_fx( + const Word32 y, /* i : near side (Argument must be positive) (Q15) */ + const Word32 x /* i : opposite side (Q15) */ +) +{ + Word32 acc, arg; + Word16 man, expo, reciprocal; + Word16 angle, w, z; + + IF( L_sub( x, 0 ) == 0 ) + { + return 25736; /* EVS_PI/2 in Q14 */ + } + man = ratio( y, x, &expo ); /* man in Q14 */ + expo = sub( expo, ( 15 - 14 ) ); /* Now, man is considered in Q15 */ + arg = L_shr( (Word32) man, expo ); + + IF( L_shr( arg, 3 + 15 ) != 0 ) + /*===============================* + * 8.0 <= x < infinity * + *===============================*/ + { + /* atan(x) = EVS_PI/2 - 1/x + 1/(3x^3) - 1/(5x^5) + ... + * ~ EVS_PI/2 - 1/x, for x >= 8. + */ + expo = norm_l( arg ); + man = extract_h( L_shl( arg, expo ) ); + reciprocal = div_s( 0x3fff, man ); + expo = sub( 15 + 1, expo ); + reciprocal = shr( reciprocal, expo ); /* Q14*/ + angle = sub( 25736, reciprocal ); /* Q14 (EVS_PI/2 - 1/x) */ + + /* For 8.0 <= x < 10.0, 1/(5x^5) is not completely negligible. + * For more accurate result, add very small correction term. + */ + IF( L_sub( L_shr( arg, 15 ), 10L ) < 0 ) + { + angle = add( angle, 8 ); /* Add tiny correction term. */ + } + } + ELSE IF( L_shr( arg, 2 + 15 ) != 0 ) + /*==========================* + * 4.0 <= x < 8.0 * + *==========================*/ + { + /* interval: [3.999, 8.001] + * atan(x) ~ (((a0*x + a1)*x + a2)*x + a3)*x + a4 + * = (((a0*8*y + a1)*8*y + a2)*8*y + a3)*8*y + a4 Substitute 8*y -> x + * = (((a0*8^3*y + a1*8^2)*y + a2*8)*y + a3)*8*y + a4 + * = ((( c0*y + c1)*y + c2)*y + c3)*8*y + c4, + * where y = x/8 + * and a0 = -1.28820869667651e-04, a1 = 3.88263533346295e-03, + * a2 = -4.64216306484597e-02, a3 = 2.75986060068931e-01, + * a4 = 7.49208077809799e-01. + */ + w = extract_l( L_shr( arg, 3 ) ); /* Q15 y = x/8 */ + acc = 533625337L; /* Q31 c1 = a1*8^2 */ + move32(); + z = mac_r( acc, w, -2161 ); /* Q15 c0 = a0*8^3 */ + acc = -797517542L; /* Q31 c2 = a2*8 */ + move32(); + z = mac_r( acc, w, z ); /* Q15 */ + acc = 592675551L; /* Q31 c3 = a3 */ + move32(); + z = mac_r( acc, w, z ); /* z (in:Q15, out:Q12) */ + acc = 201114012L; /* Q28 c4 = a4 */ + move32(); + acc = L_mac( acc, w, z ); /* Q28 */ + angle = extract_l( L_shr( acc, ( 28 - 14 ) ) ); /* Q14 result of atan(x), where 4 <= x < 8 */ + } + ELSE IF( L_shr( arg, 1 + 15 ) != 0 ) + /*==========================* + * 2.0 <= x < 4.0 * + *==========================*/ + { + /* interval: [1.999, 4.001] + * atan(x) ~ (((a0*x + a1)*x + a2)*x + a3)*x + a4 + * = (((a0*4*y + a1)*4*y + a2)*4*y + a3)*4*y + a4 Substitute 4*y -> x + * = (((a0*16*y + a1*4)*y + a2)*4*y + a3)*4*y + a4 + * = (((a0*32*y + a1*8)*y + a2*2)*2*y + a3)*4*y + a4 + * = ((( c0*y + c1)*y + c2)*2*y + c3)*4*y + c4, + * where y = x/4 + * and a0 = -0.00262378195660943, a1 = 0.04089687039888652, + * a2 = -0.25631148958325911, a3 = 0.81685854627399479, + * a4 = 0.21358070563097167 + * */ + w = extract_l( L_shr( arg, 2 ) ); /* Q15 y = x/4 */ + acc = 702602883L; /* Q31 c1 = a1*8 */ + move32(); + z = mac_r( acc, w, -2751 ); /* Q15 c0 = a0*32 */ + acc = -1100849465L; /* Q31 c2 = a2*2 */ + move32(); + z = mac_r( acc, w, z ); /* z (in:Q15, out:Q14) */ + acc = 877095185L; /* Q30 c3 = a3 */ + move32(); + z = mac_r( acc, w, z ); /* z (in:Q14, out:Q12) */ + acc = 57332634L; /* Q28 c4 = a4 */ + move32(); + acc = L_mac( acc, w, z ); /* Q28 */ + angle = extract_l( L_shr( acc, ( 28 - 14 ) ) ); /* Q14 result of atan(x) where 2 <= x < 4 */ + } + ELSE IF( L_shr( arg, 15 ) != 0 ) + /*==========================* + * 1.0 <= x < 2.0 * + *==========================*/ + { + /* interval: [0.999, 2.001] + * atan(x) ~ (((a0*x + 1)*x + a2)*x + a3)*x + a4 + * = (((a0*2*y + a1)*2*y + a2)*2*y + a3)*2*y + a4 Substitute 2*y -> x + * = (((a0*4*y + a1*2)*y + a2)*2*y + a3)*2*y + a4 + * = (((a0*4*y + a1*2)*y + a2)*y + a3/2)*4*y + a4 + * = ((( c0*y + c1)*y + c2)*y + c3)*4*y + c4, + * where y = x/2 + * and a0 = -0.0160706457245251, a1 = 0.1527106504065224, + * a2 = -0.6123208404800871, a3 = 1.3307896976322915, + * a4 = -0.0697089375247448 + */ + w = extract_l( L_shr( arg, 1 ) ); /* Q15 y= x/2 */ + acc = 655887249L; /* Q31 c1 = a1*2 */ + move32(); + z = mac_r( acc, w, -2106 ); /* Q15 c0 = a0*4 */ + acc = -1314948992L; /* Q31 c2 = a2 */ + move32(); + z = mac_r( acc, w, z ); + acc = 1428924557L; /* Q31 c3 = a3/2 */ + move32(); + z = mac_r( acc, w, z ); /* z (in:Q15, out:Q13) */ + acc = -37424701L; /* Q29 c4 = a4 */ + move32(); + acc = L_mac( acc, w, z ); /* Q29 */ + angle = extract_l( L_shr( acc, ( 29 - 14 ) ) ); /* Q14 result of atan(x) where 1 <= x < 2 */ + } + ELSE + /*==========================* + * 0.0 <= x < 1.0 * + *==========================*/ + { + /* interval: [-0.001, 1.001] + * atan(x) ~ ((((a0*x + a1)*x + a2)*x + a3)*x + a4)*x + a5 + * = ((((a0*2*x + a1*2)*x/2 + a2)*x + a3)*x + a4)*x + a5 + * = (((( c0*x + c1)*x/2 + c2)*x + c3)*x + c4)*x + c5 + * where + * a0 = -5.41182677118661e-02, a1 = 2.76690449232515e-01, + * a2 = -4.63358392562492e-01, a3 = 2.87188466598566e-02, + * a4 = 9.97438122814383e-01, a5 = 5.36158556179092e-05. + */ + w = extract_l( arg ); /* Q15 */ + acc = 1188376431L; /* Q31 c1 = a1*2 */ + move32(); + z = mac_r( acc, w, -3547 ); /* Q15 c0 = a0*2 */ + acc = -995054571L; /* Q31 c2 = a2 */ + move32(); + z = extract_h( L_mac0( acc, w, z ) ); /* Q15 non-fractional mode multiply */ + acc = 61673254L; /* Q31 c3 = a3 */ + move32(); + z = mac_r( acc, w, z ); + acc = 2141982059L; /* Q31 c4 = a4 */ + move32(); + z = mac_r( acc, w, z ); + acc = 115139L; /* Q31 c5 = a5 */ + move32(); + acc = L_mac( acc, w, z ); /* Q31 */ + angle = extract_l( L_shr( acc, 31 - 14 ) ); /* Q14 result of atan(x), where 0 <= x < 1 */ + } + + return angle; /* Q14 between 0 and EVS_PI/2 radian. */ +} + +#undef WMC_TOOL_SKIP diff --git a/lib_com/range_com.c b/lib_com/range_com.c new file mode 100644 index 0000000000000000000000000000000000000000..7b3ca8d5e00c0eae3177125eabf6d7d5fe9387fa --- /dev/null +++ b/lib_com/range_com.c @@ -0,0 +1,109 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * rc_get_bits2() + * + * Get number of bits needed to finalize range coder + *-------------------------------------------------------------------*/ + +/*! r: Number of bits needed */ +int16_t rc_get_bits2( + const int16_t N, /* i : Number of bits currently used */ + const uint32_t range /* i : Range of range coder */ +) +{ + int16_t tmp; + tmp = N + 2 + norm_ul( range ); /* aligned to BASOP */ + return tmp; +} + +/*-------------------------------------------------------------------* + * rangeCoderFinalizationFBits() + * + * Fractional (Q3) bits for range coder finalization + *-------------------------------------------------------------------*/ + +void rangeCoderFinalizationFBits( + const int16_t Brc, /* i : Current number of decoded bits */ + const uint32_t INTrc, /* i : Range coder state */ + int16_t *FBits /* i : Fractional finalization bits */ +) +{ + uint32_t Bq15; + uint32_t UL_tmp; + uint16_t Bq15ui16, B, E; + int16_t k; + + B = 30 - norm_ul( INTrc ); /* aligned to BASOP */ + +#define RCF_INIT_SHIFTp1 ( RCF_INIT_SHIFT + 1 ) +#define RCF_FINALIZE_LIMIT ( ( 1L << 16 ) - 1 ) + *FBits = ( Brc + 32 ) * 8; + + Bq15 = 0; + k = B - RCF_INIT_SHIFT; + if ( k >= 0 ) + { + Bq15 = INTrc >> ( k ); /* single op */ + } + + E = 2; + for ( k = 1; k < 4; k++ ) + { + Bq15ui16 = (uint16_t) ( Bq15 >> ( E & 1 ) ); + UL_tmp = (uint32_t) Bq15ui16; + Bq15 = ( UL_tmp * Bq15ui16 ) >> RCF_INIT_SHIFTp1; + E = 2 * B; + if ( Bq15 > RCF_FINALIZE_LIMIT ) + { + E++; + } + B = E; + } + *FBits -= B; +#undef RCF_INIT_SHIFTp1 +#undef RCF_FINALIZE_LIMIT + + return; +} diff --git a/lib_com/re8_ppv.c b/lib_com/re8_ppv.c new file mode 100644 index 0000000000000000000000000000000000000000..75e78ebec228235bb4448d141ac18443f2d77e70 --- /dev/null +++ b/lib_com/re8_ppv.c @@ -0,0 +1,211 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "prot.h" +#include "wmc_auto.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * Local function prototypes + *-------------------------------------------------------------------*/ + +static void nearest_neighbor_2D8( const float x[], int16_t y[] ); + +/*--------------------------------------------------------------* + * re8_PPV() + * + * Nearest neighbor search in infinite lattice RE8 + * the algorithm is based on the definition of RE8 as + * RE8 = (2D8) U (2D8+[1,1,1,1,1,1,1,1]) + * it applies the coset decoding of Sloane and Conway + * --------------------------------------------------------------*/ + +void re8_PPV( + const float x[], /* i : point in R^8 */ + int16_t y[] /* o : point in RE8 (8-dimensional integer vector) */ +) +{ + int16_t i, y0[8], y1[8]; + float e0, e1, x1[8], tmp; + + /*--------------------------------------------------------------* + * find the nearest neighbor y0 of x in 2D8 + *--------------------------------------------------------------*/ + + nearest_neighbor_2D8( x, y0 ); + + /*--------------------------------------------------------------* + * find the nearest neighbor y1 of x in 2D8+(1,...,1) (by coset decoding) + *--------------------------------------------------------------*/ + + for ( i = 0; i < 8; i++ ) + { + x1[i] = x[i] - 1.0f; + } + + nearest_neighbor_2D8( x1, y1 ); + + for ( i = 0; i < 8; i++ ) + { + y1[i] += 1; + } + + /*--------------------------------------------------------------* + * compute e0=||x-y0||^2 and e1=||x-y1||^2 + *--------------------------------------------------------------*/ + + e0 = e1 = 0.0; + for ( i = 0; i < 8; i++ ) + { + tmp = x[i] - y0[i]; + e0 += tmp * tmp; + tmp = x[i] - y1[i]; + e1 += tmp * tmp; + } + + /*--------------------------------------------------------------* + * select best candidate y0 or y1 to minimize distortion + *--------------------------------------------------------------*/ + + if ( e0 < e1 ) + { + for ( i = 0; i < 8; i++ ) + { + y[i] = y0[i]; + } + } + else + { + for ( i = 0; i < 8; i++ ) + { + y[i] = y1[i]; + } + } + + return; +} + +/*--------------------------------------------------------------* + * nearest_neighbor_2D8() + * + * Nearest neighbor search in infinite lattice 2D8 + * algorithm: nn_2D8(x) = 2*nn_D8(x/2) + * nn_D8 = decoding of Z^8 with Wagner rule + * (see Conway and Sloane's paper in IT-82) + --------------------------------------------------------------*/ + +static void nearest_neighbor_2D8( + const float x[], /* i : point in R^8 */ + int16_t y[] /* o : point in 2D8 (8-dimensional integer vector) */ +) +{ + int16_t i, j, sum; + float s, e[8], em; + + /*--------------------------------------------------------------* + * round x into 2Z^8 i.e. compute y=(y1,...,y8) such that yi = 2[xi/2] + * where [.] is the nearest integer operator + * in the mean time, compute sum = y1+...+y8 + *--------------------------------------------------------------*/ + + sum = 0; + for ( i = 0; i < 8; i++ ) + { + /* round to ..., -2, 0, 2, ... ([-1..1[ --> 0) */ + if ( x[i] < 0 ) + { + y[i] = -2 * ( ( (int16_t) ( 1.0 - x[i] ) ) >> 1 ); + } + else + { + y[i] = 2 * ( ( (int16_t) ( 1.0 + x[i] ) ) >> 1 ); + } + sum += y[i]; + } + + /*--------------------------------------------------------------* + * check if y1+...+y8 is a multiple of 4 + * if not, y is not round xj in the wrong way where j is defined by + * j = arg max_i | xi -yi| + * (this is called the Wagner rule) + *--------------------------------------------------------------*/ + + if ( sum % 4 ) + { + /* find j = arg max_i | xi -yi| */ + em = 0; + j = 0; + for ( i = 0; i < 8; i++ ) + { + /* compute ei = xi-yi */ + e[i] = x[i] - y[i]; + } + + for ( i = 0; i < 8; i++ ) + { + /* compute |ei| = | xi-yi | */ + if ( e[i] < 0 ) + { + s = -e[i]; + } + else + { + s = e[i]; + } + /* check if |ei| is maximal, if so, set j=i */ + if ( em < s ) + { + em = s; + j = i; + } + } + + /* round xj in the "wrong way" */ + if ( e[j] < 0 ) + { + y[j] -= 2; + } + else + { + y[j] += 2; + } + } + + return; +} diff --git a/lib_com/re8_util.c b/lib_com/re8_util.c new file mode 100644 index 0000000000000000000000000000000000000000..d0737c9d91dc49fcf0fa12f96b2320951c917401 --- /dev/null +++ b/lib_com/re8_util.c @@ -0,0 +1,436 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include /* for ldexp() */ +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "wmc_auto.h" + + +/*-------------------------------------------------------------------* + * Local function prototypes + *-------------------------------------------------------------------*/ + +static int16_t re8_identify_absolute_leader( const int16_t y[] ); + +static void re8_coord( const int16_t y[], int16_t k[] ); + + +/*----------------------------------------------------------------* + * re8_vor() + * + * Multi-rate RE8 indexing by Voronoi extension + *----------------------------------------------------------------*/ + +void re8_vor( + int16_t y[], /* i : point in RE8 (8-dimensional integer vector) */ + int16_t *n, /* o : codebook number n=0,2,3,4,... (scalar integer) */ + int16_t k[], /* o : Voronoi index (integer vector of dimension 8) used only if n>4 */ + int16_t c[], /* o : codevector in Q0, Q2, Q3, or Q4 if n<=4, y=c */ + int16_t *ka /* o : identifier of absolute leader (needed to index c)*/ +) +{ + int16_t v[8]; + int16_t k_mod[8], c_tmp[8]; + int16_t i, r, m, k_tmp[8], iter, ka_tmp, n_tmp, mask; + float sphere; + + /*----------------------------------------------------------------* + * verify if y is in Q0, Q2, Q3 or Q4 + * (a fast search is used here: + * the codebooks Q0, Q2, Q3 or Q4 are specified in terms of RE8 absolute leaders + * (see FORinstance Xie and Adoul's paper in ICASSP 96) + * - a unique code identifying the absolute leader related to y is computed + * in re8_identify_absolute_leader() + * this code is searched FORin a pre-defined list which specifies Q0, Q2, Q3 or Q4) + * the absolute leader is identified by ka + * - a translation table maps ka to the codebook number n) + *----------------------------------------------------------------*/ + + *ka = re8_identify_absolute_leader( y ); + + /*----------------------------------------------------------------* + * compute codebook number n of Qn (by table look-up) + * at this stage, n=0,2,3,4 or out=100 + *----------------------------------------------------------------*/ + + *n = Da_nq[*ka]; + + /*----------------------------------------------------------------* + * decompose y into : + * (if n<=4:) + * y = c where c is in Q0, Q2, Q3 or Q4 + * or + * (if n>4:) + * y = m c + v where c is in Q3 or Q4, v is a Voronoi codevector + * m=2^r (r integer >=2) + * + * in the latter case (if n>4), as a side-product, compute the (Voronoi) index k[] of v + * and replace n by n = n' + 2r where n' = 3 or 4 (c is in Qn') and r is defined above + *----------------------------------------------------------------*/ + + if ( *n <= 4 ) + { + for ( i = 0; i < 8; i++ ) + { + c[i] = y[i]; + } + } + else + { + /*------------------------------------------------------------* + * initialize r and m=2^r based on || y ||^2/8 + *------------------------------------------------------------*/ + + sphere = 0.0; + for ( i = 0; i < 8; i++ ) + { + sphere += (float) y[i] * (float) y[i]; + } + sphere *= 0.125; + r = 1; + sphere *= 0.25; /* not counted, merge 0.125*0.25 */ + while ( sphere > 11.0 ) + { + r++; + sphere *= 0.25; + } + /*------------------------------------------------------------* + * compute the coordinates of y in the RE8 basis + *------------------------------------------------------------*/ + + re8_coord( y, k_mod ); + + /*------------------------------------------------------------* + * compute m and the mask needed for modulo m (for Voronoi coding) + *------------------------------------------------------------*/ + + m = 1 << r; + mask = m - 1; /* 0x0..011...1 */ + + /*------------------------------------------------------------* + * find the minimal value of r (or equivalently of m) in 2 iterations + *------------------------------------------------------------*/ + + for ( iter = 0; iter < 2; iter++ ) + { + /*--------------------------------------------------------* + * compute v such that y is in m RE_8 +v (by Voronoi coding) + *--------------------------------------------------------*/ + + for ( i = 0; i < 8; i++ ) + { + k_tmp[i] = k_mod[i] & mask; + } + + re8_k2y( k_tmp, m, v ); + + /*--------------------------------------------------------* + * compute c = (y-v)/m + * (y is in RE8, c is also in RE8 by definition of v) + *--------------------------------------------------------*/ + + for ( i = 0; i < 8; i++ ) + { + c_tmp[i] = ( y[i] - v[i] ) / m; + /* M IS A FACTOR OF 2 */ + } + + /*--------------------------------------------------------* + * verify if c_tmp is in Q2, Q3 or Q4 + *--------------------------------------------------------*/ + + ka_tmp = re8_identify_absolute_leader( c_tmp ); + + /*--------------------------------------------------------* + * at this stage, n_tmp=2,3,4 or out = 100 -- n=0 is not possible + *--------------------------------------------------------*/ + + n_tmp = Da_nq[ka_tmp]; + + if ( n_tmp > 4 ) + { + /*--------------------------------------------------------* + * if c is not in Q2, Q3, or Q4 (i.e. n_tmp>4), use m = 2^(r+1) instead of 2^r + *--------------------------------------------------------*/ + + r++; + m = m << 1; + mask = ( ( mask << 1 ) + 1 ); /* mask = m-1; <- this is less complex */ + } + else + { + /*--------------------------------------------------------* + * c is in Q2, Q3, or Q4 -> the decomposition of y as y = m c + v is valid + * + * since Q2 is a subset of Q3, indicate n=3 instead of n=2 (this is because + * for n>4, n=n'+2r with n'=3 or 4, so n'=2 is not valid) + *--------------------------------------------------------*/ + + if ( n_tmp < 3 ) + { + n_tmp = 3; + } + + /*--------------------------------------------------------* + * save current values into ka, n, k and c + *--------------------------------------------------------*/ + + *ka = ka_tmp; + *n = n_tmp + 2 * r; + for ( i = 0; i < 8; i++ ) + { + k[i] = k_tmp[i]; + c[i] = c_tmp[i]; + } + + /*--------------------------------------------------------* + * try m = 2^(r-1) instead of 2^r to be sure that m is minimal + *--------------------------------------------------------*/ + + r--; + m = m >> 1; + mask = mask >> 1; + } + } + } + + return; +} + +/*-----------------------------------------------------------------------* + * re8_identify_absolute_leader() + * + * Identify the absolute leader related to y using a pre-defined table which + * specifies the codebooks Q0, Q2, Q3 and Q4 + -----------------------------------------------------------------------*/ + +/*! r: integer indicating if y if in Q0, Q2, Q3 or Q4 (or if y is an outlier) */ +static int16_t re8_identify_absolute_leader( + const int16_t y[] /* i : point in RE8 (8-dimensional integer vector) */ +) +{ + int16_t i, id, nb, pos, ka; + int32_t s, C[8], tmp; + + /*-----------------------------------------------------------------------* + * compute the RE8 shell number s = (y1^2+...+y8^2)/8 and C=(y1^2, ..., y8^2) + *-----------------------------------------------------------------------*/ + + s = 0; + for ( i = 0; i < 8; i++ ) + { + C[i] = y[i] * y[i]; + s += C[i]; + } + s >>= 3; + + /*-----------------------------------------------------------------------* + * compute the index 0 <= ka <= NB_LEADER+1 which identifies an absolute leader of Q0, Q2, Q3 or Q4 + * + * by default, ka=index of last element of the table (to indicate an outlier) + *-----------------------------------------------------------------------*/ + + ka = NB_LEADER + 1; + if ( s == 0 ) + { + /*-------------------------------------------------------------------* + * if s=0, y=0 i.e. y is in Q0 -> ka=index of element indicating Q0 + *-------------------------------------------------------------------*/ + + ka = NB_LEADER; + } + else + { + /*-------------------------------------------------------------------* + * the maximal value of s for y in Q0, Q2, Q3 or Q4 is NB_SPHERE + * if s> NB_SPHERE, y is an outlier (the value of ka is set correctly) + *-------------------------------------------------------------------*/ + + if ( s <= NB_SPHERE ) + { + /*---------------------------------------------------------------* + * compute the unique identifier id of the absolute leader related to y: + * s = (y1^4 + ... + y8^4)/8 + *---------------------------------------------------------------*/ + + tmp = 0; + for ( i = 0; i < 8; i++ ) + { + tmp += C[i] * C[i]; + } + id = (int16_t) ( tmp >> 3 ); + + /*---------------------------------------------------------------* + * search for id in table Da_id + * (containing all possible values of id if y is in Q2, Q3 or Q4) + * this search is focused based on the shell number s so that + * only the id's related to the shell of number s are checked + *---------------------------------------------------------------*/ + + nb = Da_nb[s - 1]; /* get the number of absolute leaders used on the shell of number s */ + pos = Da_pos[s - 1]; /* get the position of the first absolute leader of shell s in Da_id */ + for ( i = 0; i < nb; i++ ) + { + if ( id == Da_id[pos] ) + { + ka = pos; /* get ka */ + break; + } + pos++; + } + } + } + + return ( ka ); +} + +/*------------------------------------------------------------------------- + * re8_coord() + * + * COMPUTATION OF RE8 COORDINATES + -----------------------------------------------------------------------*/ + +static void re8_coord( + const int16_t *y, /* i : 8-dimensional point y[0..7] in RE8 */ + int16_t *k /* o : coordinates k[0..7] */ +) +{ + int16_t i, tmp, sum; + + /*---------------------------------------------------------------* + * compute k = y M^-1 + * M = 1/4 [ 1 ] + * [-1 2 ] + * [ | \ ] + * [-1 2 ] + * [ 5 -2 _ -2 4] + * + *---------------------------------------------------------------*/ + + k[7] = y[7]; + tmp = y[7]; + sum = 5 * y[7]; + for ( i = 6; i >= 1; i-- ) + { + /* apply factor 2/4 from M^-1 */ + k[i] = ( y[i] - tmp ) >> 1; + sum -= y[i]; + } + + /* apply factor 1/4 from M^-1 */ + k[0] = ( y[0] + sum ) >> 2; + + return; +} + + +/*------------------------------------------------------------------------- + * re8_k2y() + * + * Voronoi indexing (index decoding) k -> y + -----------------------------------------------------------------------*/ + +void re8_k2y( + const int16_t *k, /* i : Voronoi index k[0..7] */ + const int16_t m, /* i : Voronoi modulo (m = 2^r = 1<=2) */ + int16_t *y /* o : 8-dimensional point y[0..7] in RE8 */ +) +{ + int16_t i, lm, v[8], tmp, sum, *ptr1, *ptr2; + float z[8]; + + /*---------------------------------------------------------------* + * compute y = k M and z=(y-a)/m, where + * M = [4 ] + * [2 2 ] + * [| \ ] + * [2 2 ] + * [1 1 _ 1 1] + * a=(2,0,...,0) + *---------------------------------------------------------------*/ + + for ( i = 0; i < 8; i++ ) + { + y[i] = k[7]; + } + + sum = 0; + for ( i = 6; i >= 1; i-- ) + { + tmp = 2 * k[i]; + sum += tmp; + y[i] += tmp; + } + y[0] += ( 4 * k[0] + sum ); + + /* find log2(m) */ + for ( lm = 0; lm < 31; lm++ ) + { + if ( ( m >> lm ) & 0x0001 ) + { + break; + } + } + + z[0] = (float) ldexp( y[0] - 2, -lm ); + for ( i = 1; i < 8; i++ ) + { + z[i] = (float) ldexp( y[i], -lm ); + } + + /*---------------------------------------------------------------* + * find nearest neighbor v of z in infinite RE8 + *---------------------------------------------------------------*/ + + re8_PPV( z, v ); + + /*---------------------------------------------------------------* + * compute y -= m v + *---------------------------------------------------------------*/ + + ptr1 = y; + ptr2 = v; + for ( i = 0; i < 8; i++ ) + { + *ptr1++ -= m * *ptr2++; + } + + return; +} diff --git a/lib_com/realft.c b/lib_com/realft.c new file mode 100644 index 0000000000000000000000000000000000000000..10a08fbf8c93493b62288d215a1a4823558b649c --- /dev/null +++ b/lib_com/realft.c @@ -0,0 +1,198 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include "cnst.h" +#include +#include "options.h" +#include +#include "prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * four1() + * + * From "numerical recipes in C". + * Replace data by its DFT, if isign is input as 1; or replace data + * by nn times its inverse-DFT, if isign is input as -1. + * data is a complex array of length nn, input as a real + * array data[1...2nn]. nn must be an integer power of 2 + *-------------------------------------------------------------------*/ + +static void four1( + float *data, /* i/o: data array .......... */ + int16_t nn, /* i : length of data array */ + int16_t isign /* i : sign +1 or -1 */ +) +{ + int16_t n, mmax, m, j, istep, i; + float wtemp, wr, wpr, wpi, wi, theta; + float tempr, tempi; + + n = nn << 1; + j = 1; + + /* this is the bit-reversal section of the routine */ + for ( i = 1; i < n; i += 2 ) + { + if ( j > i ) + { + /* exchange the two complex numbers */ + SWAP( data[j], data[i] ); + SWAP( data[j + 1], data[i + 1] ); + } + m = n >> 1; + while ( m >= 2 && j > m ) + { + j -= m; + m >>= 1; + } + j += m; + } + mmax = 2; + /* here begins the Danielson-Lanczos section of the routine */ + /* Outer loop executed log2(nn) times */ + while ( n > mmax ) + { + istep = 2 * mmax; + /* initialization for the trigonometric recurrence */ + theta = (float) ( 6.28318530717959 / ( isign * mmax ) ); + wtemp = (float) ( sin( 0.5f * theta ) ); + wpr = -2.0f * wtemp * wtemp; + wpi = (float) sin( theta ); + wr = 1.0f; + wi = 0.0f; + /* here are the two nested loops */ + for ( m = 1; m < mmax; m += 2 ) + { + for ( i = m; i <= n; i += istep ) + { + /* this is Danielson-Lanczos formula */ + j = i + mmax; + tempr = wr * data[j] - wi * data[j + 1]; + tempi = wr * data[j + 1] + wi * data[j]; + data[j] = data[i] - tempr; + data[j + 1] = data[i + 1] - tempi; + data[i] += tempr; + data[i + 1] += tempi; + } + /* trigonometric recurrence */ + wr = ( wtemp = wr ) * wpr - wi * wpi + wr; + wi = wi * wpr + wtemp * wpi + wi; + } + mmax = istep; + } + + return; +} + +/*-------------------------------------------------------------------------* + * realft() + * + * from "numerical recipes in C". + * Calculates the Fourier Transform of a set of 2*n real-valued data points. + * Replaces this data (which is stored in the array data[1..2n]) by the + * positive frequancy half of its complex Fourier Transform. The real-valued + * first and last components of the complex transform are returned as elements + * data[1] and data[2] respectively. n must be a power of 2. This routine + * also calculates the inverse transform of a complex data array if it is the + * tranform of real data. (Results in this case must be multiplied by 1/n.) + *--------------------------------------------------------------------------*/ + +void realft( + float *data, /* i/o: data array */ + int16_t n, /* i : length of data array */ + int16_t isign /* i : sign +1 or -1 */ +) +{ + int16_t i, i1, i2, i3, i4, n2p3; + float c1 = 0.5, c2, h1r, h1i, h2r, h2i; + float wr, wi, wpr, wpi, wtemp, theta; + + theta = (float) ( EVS_PI / (float) n ); + if ( isign == 1 ) + { + /* the forward transorm here */ + c2 = -0.5; + four1( data, n, 1 ); + } + else + { + /* otherwise set up for the inverse transform */ + c2 = 0.5; + theta = -theta; + } + wtemp = (float) sin( 0.5f * theta ); + wpr = -2.0f * wtemp * wtemp; + wpi = (float) sin( theta ); + wr = 1.0f + wpr; + wi = wpi; + n2p3 = 2 * n + 3; + /* case i=1 done separately below */ + for ( i = 2; i <= n / 2; i++ ) + { + i4 = 1 + ( i3 = n2p3 - ( i2 = 1 + ( i1 = i + i - 1 ) ) ); + /* the two separate transforms are separated out of data */ + h1r = c1 * ( data[i1] + data[i3] ); + h1i = c1 * ( data[i2] - data[i4] ); + h2r = -c2 * ( data[i2] + data[i4] ); + h2i = c2 * ( data[i1] - data[i3] ); + /* here they are recombined to form the true transform + of the original real data */ + data[i1] = h1r + wr * h2r - wi * h2i; + data[i2] = h1i + wr * h2i + wi * h2r; + data[i3] = h1r - wr * h2r + wi * h2i; + data[i4] = -h1i + wr * h2i + wi * h2r; + /* the recurrence */ + wr = ( wtemp = wr ) * wpr - wi * wpi + wr; + wi = wi * wpr + wtemp * wpi + wi; + } + if ( isign == 1 ) + { + /* squeeze the first and the last data together to get them + all within the original data */ + data[1] = ( h1r = data[1] ) + data[2]; + data[2] = h1r - data[2]; + } + else + { + /* this is the inverse transform for the case isign=-1 */ + data[1] = c1 * ( ( h1r = data[1] ) + data[2] ); + data[2] = c1 * ( h1r - data[2] ); + four1( data, n, -1 ); + } + + return; +} diff --git a/lib_com/recovernorm.c b/lib_com/recovernorm.c new file mode 100644 index 0000000000000000000000000000000000000000..5b02843c033567012345324cf7db422e5d645680 --- /dev/null +++ b/lib_com/recovernorm.c @@ -0,0 +1,83 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "prot.h" +#include "cnst.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*--------------------------------------------------------------------------* + * recovernorm() + * + * Recover reordered quantization indices and norms + *--------------------------------------------------------------------------*/ + +void recovernorm( + const int16_t *const idxbuf, /* i : reordered quantization indices */ + int16_t *ynrm, /* o : recovered quantization indices */ + int16_t *normqlg2, /* o : recovered quantized norms */ + const int16_t nb_sfm /* i : number of subbands */ +) +{ + int16_t i; + const int16_t *order = NULL; + + switch ( nb_sfm ) + { + case NB_SFM: + order = norm_order_48; + break; + case SFM_N_SWB: + order = norm_order_32; + break; + case SFM_N_WB: + order = norm_order_16; + break; + default: + order = norm_order_48; + break; + } + + for ( i = 0; i < nb_sfm; i++ ) + { + ynrm[order[i]] = idxbuf[i]; + normqlg2[order[i]] = dicnlg2[idxbuf[i]]; + } + + return; +} diff --git a/lib_com/reordvct.c b/lib_com/reordvct.c new file mode 100644 index 0000000000000000000000000000000000000000..7655220d50cf486239269833e2a0452b51e89dd8 --- /dev/null +++ b/lib_com/reordvct.c @@ -0,0 +1,78 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "prot.h" +#include "wmc_auto.h" + +/*--------------------------------------------------------------------------* + * reordvct() + * + * Rearrange a vector in decreasing order + *--------------------------------------------------------------------------*/ + +void reordvct( + int16_t *y, /* i/o: vector to rearrange */ + const int16_t N, /* i : dimensions */ + int16_t *idx /* o : reordered vector index */ +) +{ + int16_t i, j, k, n, im, temp; + + n = N - 1; + for ( i = 0; i < n; i++ ) + { + im = i; + k = i + 1; + for ( j = k; j < N; j++ ) + { + if ( y[im] < y[j] ) + { + im = j; + } + } + + temp = y[i]; + y[i] = y[im]; + y[im] = temp; + j = idx[i]; + idx[i] = idx[im]; + idx[im] = j; + } + + return; +} diff --git a/lib_com/residu.c b/lib_com/residu.c new file mode 100644 index 0000000000000000000000000000000000000000..a46001c26376ca2b9dd33026a6862852ca5d8a6e --- /dev/null +++ b/lib_com/residu.c @@ -0,0 +1,99 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*--------------------------------------------------------------------* + * residu() + * + * Compute the LP residual by filtering the input speech through A(z) + *--------------------------------------------------------------------*/ + +void residu( + const float *a, /* i : LP filter coefficients */ + const int16_t m, /* i : order of LP filter */ + const float *x, /* i : input signal (usually speech) */ + float *y, /* o : output signal (usually residual) */ + const int16_t l /* i : size of filtering */ +) +{ + float s; + int16_t i, j; + + for ( i = 0; i < l; i++ ) + { + s = x[i]; + for ( j = 1; j <= m; j++ ) + { + s += a[j] * x[i - j]; + } + y[i] = s; + } + + return; +} + +/*--------------------------------------------------------------------* + * calc_residu() + * + * Compute the LP residual by filtering the input through A(z) in all subframes + *--------------------------------------------------------------------*/ + +void calc_residu( + const float *speech, /* i : weighted speech signal */ + float *res, /* o : residual signal */ + const float *p_Aq, /* i : quantized LP filter coefficients */ + const int16_t L_frame /* i : size of frame */ +) +{ + int16_t i_subfr; + + for ( i_subfr = 0; i_subfr < L_frame; i_subfr += L_SUBFR ) + { + /* calculate the residual signal */ + residu( p_Aq, M, &speech[i_subfr], &res[i_subfr], L_SUBFR ); + + /* next subframe */ + p_Aq += ( M + 1 ); + } + + return; +} diff --git a/lib_com/rom_com.c b/lib_com/rom_com.c new file mode 100644 index 0000000000000000000000000000000000000000..2282b0b3de353a99347370b6f298c79daff96732 --- /dev/null +++ b/lib_com/rom_com.c @@ -0,0 +1,22428 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "basop_util.h" +#include "wmc_auto.h" + +/* clang-format off */ + +/*----------------------------------------------------------------------------------* + * Table of bitrates + *----------------------------------------------------------------------------------*/ + +const int32_t brate_tbl[SIZE_BRATE_TBL] = +{ + ACELP_7k20, ACELP_8k00, ACELP_9k60, ACELP_13k20, ACELP_16k40, ACELP_24k40, + ACELP_32k, ACELP_48k, ACELP_64k, HQ_96k, HQ_128k +}; + +const int32_t brate_intermed_tbl[SIZE_BRATE_INTERMED_TBL] = +{ + ACELP_5k00, ACELP_6k15, ACELP_7k20, ACELP_8k00, ACELP_9k60, ACELP_11k60, ACELP_12k15, ACELP_12k85, ACELP_13k20, + ACELP_14k80, ACELP_16k40, ACELP_22k60, ACELP_24k40, ACELP_29k00, ACELP_29k20, ACELP_30k20, + ACELP_30k40, ACELP_32k, ACELP_48k, ACELP_64k, HQ_96k, HQ_128k +}; + +/*----------------------------------------------------------------------------------* + * Frame size and mode configuration tables + *----------------------------------------------------------------------------------*/ + +const FrameSizeParams FrameSizeConfig[FRAME_SIZE_NB] = +{ + /* bits, net bits, trans_bits, trans_mode, band_bits, band_mode_min, band_mode_max, reserved_bits */ + { FRAME_0, FRAME_0, 0, {0,0}, 0, 0, 0, 0}, /* 0 kbps ZERO_FRAME*/ + { FRAME_2_4, FRAME_2_4-2, 1, {1,1}, 1, NB, WB, 0}, /* 2.4kbps VBR(SID)*/ + { FRAME_7_2, FRAME_7_2-1, 0, {0,1}, 1, NB, WB, 0}, /* 7.2kbps VBR/CBR*/ + { FRAME_8, FRAME_8-1, 0, {0,1}, 1, NB, WB, 0}, /* 8 kbps VBR/CBR*/ + { FRAME_9_6, FRAME_9_6-2, 0, {0,1}, 2, NB, SWB, 0}, /* 9.6kbps CBR*/ + { FRAME_13_2, FRAME_13_2-2, 0, {0,1}, 2, NB, SWB, 0}, /* 13.2kbps CBR*/ + { FRAME_16_4, FRAME_16_4-3, 0, {0,1}, 2, NB, FB, 1}, /* 16.4kbps CBR*/ + { FRAME_24_4, FRAME_24_4-3, 0, {0,1}, 2, NB, FB, 1}, /* 24.4kbps CBR*/ + { FRAME_32, FRAME_32-3, 0, {0,1}, 2, WB, FB, 1}, /* 32 kbps CBR*/ + { FRAME_48, FRAME_48-3, 0, {0,1}, 2, WB, FB, 1}, /* 48 kbps CBR*/ + { FRAME_64, FRAME_64-3, 0, {0,1}, 2, WB, FB, 1}, /* 64 kbps CBR*/ + { FRAME_96, FRAME_96-3, 0, {0,1}, 2, WB, FB, 1}, /* 96 kbps CBR*/ + { FRAME_128, FRAME_128-3, 0, {0,1}, 2, WB, FB, 1} /*128 kbps CBR*/ +}; + + +/*----------------------------------------------------------------------------------* + * Conversion of ACELP signaling parameters (ACELP internal Fs, coder type, bandwidth, sharpening flag) to index + * (to be consulted with the decision matrix) + * + * - in order to retrieve the index, each section in this table starts with the bitrate + * - the second value in each section corresponds to the number of bits + * - the other values represent indices created by combining different parameters into a single value through the macro SIG2IND() + *----------------------------------------------------------------------------------*/ + +const int32_t acelp_sig_tbl[MAX_ACELP_SIG] = +{ + /* GENERIC UNVOICED VOICED TRANSITION AUDIO INACTIVE */ + ACELP_7k20, 4, + SIG2IND(GENERIC, NB, 1, 0), SIG2IND(UNVOICED, NB, 0, 0), SIG2IND(VOICED, NB, 1, 0), SIG2IND(TRANSITION, NB, 1, 0), SIG2IND(AUDIO, NB, 0, 0), SIG2IND(INACTIVE, NB, 0, 0), + SIG2IND(GENERIC, WB, 1, 0), SIG2IND(UNVOICED, WB, 0, 0), SIG2IND(VOICED, WB, 1, 0), SIG2IND(TRANSITION, WB, 1, 0), SIG2IND(AUDIO, WB, 0, 0), SIG2IND(INACTIVE, WB, 0, 0), + SIG2IND(GENERIC, NB, 0, 0), + SIG2IND(GENERIC, WB, 0, 0), + SIG2IND(LR_MDCT, NB, 0, 0), + + ACELP_8k00, 4, + SIG2IND(GENERIC, NB, 1, 0), SIG2IND(UNVOICED, NB, 0, 0), SIG2IND(VOICED, NB, 1, 0), SIG2IND(TRANSITION, NB, 1, 0), SIG2IND(AUDIO, NB, 0, 0), SIG2IND(INACTIVE, NB, 0, 0), + SIG2IND(GENERIC, WB, 1, 0), SIG2IND(UNVOICED, WB, 0, 0), SIG2IND(VOICED, WB, 1, 0), SIG2IND(TRANSITION, WB, 1, 0), SIG2IND(AUDIO, WB, 0, 0), SIG2IND(INACTIVE, WB, 0, 0), + SIG2IND(GENERIC, NB, 0, 0), + SIG2IND(GENERIC, WB, 0, 0), + SIG2IND(LR_MDCT, NB, 0, 0), + + ACELP_13k20, 5, + SIG2IND(GENERIC, NB, 1, 0), SIG2IND(VOICED, NB, 1, 0), SIG2IND(TRANSITION, NB, 0, 0), SIG2IND(AUDIO, NB, 0, 0), SIG2IND(INACTIVE, NB, 0, 0), + SIG2IND(GENERIC, WB, 1, 0), SIG2IND(VOICED, WB, 1, 0), SIG2IND(TRANSITION, WB, 0, 0), SIG2IND(AUDIO, WB, 0, 0), SIG2IND(INACTIVE, WB, 0, 0), + SIG2IND(GENERIC, SWB, 1, 0), SIG2IND(VOICED, SWB, 1, 0), SIG2IND(TRANSITION, SWB, 0, 0), SIG2IND(AUDIO, SWB, 0, 0), SIG2IND(INACTIVE, SWB, 0, 0), + SIG2IND(GENERIC, NB, 0, 0), SIG2IND(VOICED, NB, 0, 0), + SIG2IND(GENERIC, WB, 0, 0), SIG2IND(VOICED, WB, 0, 0), + SIG2IND(GENERIC, SWB, 0, 0), SIG2IND(VOICED, SWB, 0, 0), + SIG2IND(GENERIC, WB, 1, 1), SIG2IND(UNVOICED, WB, 0, 1), SIG2IND(VOICED, WB, 1, 1), SIG2IND(INACTIVE, WB, 0, 1), + SIG2IND(GENERIC, SWB, 1, 1), SIG2IND(UNVOICED, SWB, 0, 1), SIG2IND(VOICED, SWB, 1, 1), SIG2IND(INACTIVE, SWB, 0, 1), + SIG2IND(LR_MDCT, NB, 0, 0), + SIG2IND(LR_MDCT, WB, 0, 0), + SIG2IND(LR_MDCT, SWB, 0, 0), + + ACELP_32k, 4, + SIG2IND(GENERIC, WB, 1, 0), SIG2IND(TRANSITION, WB, 1, 0), SIG2IND(INACTIVE, WB, 0, 0), + SIG2IND(GENERIC, SWB, 1, 0), SIG2IND(TRANSITION, SWB, 1, 0), SIG2IND(INACTIVE, SWB, 0, 0), + SIG2IND(GENERIC, FB, 1, 0), SIG2IND(TRANSITION, FB, 1, 0), SIG2IND(INACTIVE, FB, 0, 0), + SIG2IND(GENERIC, WB, 0, 0), SIG2IND(TRANSITION, WB, 0, 0), + SIG2IND(GENERIC, SWB, 0, 0), SIG2IND(TRANSITION, SWB, 0, 0), + SIG2IND(GENERIC, FB, 0, 0), SIG2IND(TRANSITION, FB, 0, 0), + + ACELP_64k, 4, + SIG2IND(GENERIC, WB, 0, 0), SIG2IND(TRANSITION, WB, 0, 0), SIG2IND(INACTIVE, WB, 0, 0), + SIG2IND(GENERIC, SWB, 1, 0), SIG2IND(TRANSITION, SWB, 1, 0), SIG2IND(INACTIVE, SWB, 0, 0), + SIG2IND(GENERIC, FB, 1, 0), SIG2IND(TRANSITION, FB, 1, 0), SIG2IND(INACTIVE, FB, 0, 0), + SIG2IND(GENERIC, SWB, 0, 0), SIG2IND(TRANSITION, SWB, 0, 0), + SIG2IND(GENERIC, FB, 0, 0), SIG2IND(TRANSITION, FB, 0, 0), +}; + +/*----------------------------------------------------------------------------------* + * ACELP bit allocation tables + *----------------------------------------------------------------------------------*/ + +/* bit allocation table for end-frame LSF quantizer */ +const int16_t LSF_bits_tbl[] = +{ + /* IC UC VC GC TC AC */ + 22, 31, 24, 29, 24, 22, /* ACELP_5k00 */ + 22, 31, 24, 29, 24, 22, /* ACELP_6k15 */ + 22, 37, 31, 29, 31, 22, /* ACELP_7k20 */ + 22, 40, 36, 33, 34, 22, /* ACELP_8k00 */ + 27, 40, 34, 35, 37, 27, /* ACELP_9k60 */ + 31, 0, 37, 37, 40, 31, /* ACELP_11k60 */ + 31, 0, 39, 39, 41, 31, /* ACELP_12k15 */ + 31, 0, 38, 38, 40, 31, /* ACELP_12k85 */ + 31, 0, 38, 38, 40, 31, /* ACELP_13k20 */ + 31, 0, 37, 42, 42, 31, /* ACELP_14k80 */ + 31, 0, 43, 40, 40, 31, /* ACELP_16k40 */ + 31, 0, 42, 40, 40, 31, /* ACELP_22k60 */ + 31, 0, 46, 41, 41, 31, /* ACELP_24k40 */ + 41, 0, 0, 41, 41, 0, /* ACELP_29k00 */ + 41, 0, 0, 41, 41, 0, /* ACELP_29k20 */ + 41, 0, 0, 41, 41, 0, /* ACELP_30k20 */ + 41, 0, 0, 41, 41, 0, /* ACELP_30k40 */ + 41, 0, 0, 41, 41, 0, /* ACELP_32k */ + 41, 0, 0, 41, 41, 0, /* ACELP_48k */ + 41, 0, 0, 41, 41, 0, /* ACELP_64k */ +}; + +/* bit allocation table for mid-frame LSF quantizer */ +const int16_t mid_LSF_bits_tbl[] = +{ + /* IC UC VC GC TC AC */ + 2, 5, 1, 2, 2, 2, /* ACELP_5k00 */ + 2, 5, 1, 2, 2, 2, /* ACELP_6k15 */ + 2, 5, 4, 5, 5, 2, /* ACELP_7k20 */ + 2, 5, 4, 5, 5, 2, /* ACELP_8k00 */ + 2, 5, 4, 5, 5, 2, /* ACELP_9k60 */ + 2, 5, 4, 5, 5, 2, /* ACELP_11k60 */ + 2, 5, 5, 5, 5, 2, /* ACELP_12k15 */ + 2, 5, 5, 5, 5, 2, /* ACELP_12k85 */ + 2, 5, 5, 5, 5, 2, /* ACELP_13k20 */ + 4, 0, 5, 5, 5, 4, /* ACELP_14k80 */ + 4, 0, 5, 5, 5, 4, /* ACELP_16k40 */ + 5, 0, 5, 5, 5, 5, /* ACELP_22k60 */ + 5, 0, 5, 5, 5, 5, /* ACELP_24k40 */ + 5, 0, 0, 5, 5, 5, /* ACELP_29k00 */ + 5, 0, 0, 5, 5, 5, /* ACELP_29k20 */ + 5, 0, 0, 5, 5, 5, /* ACELP_30k20 */ + 5, 0, 0, 5, 5, 5, /* ACELP_30k40 */ + 5, 0, 0, 5, 5, 5, /* ACELP_32k */ + 5, 0, 0, 5, 5, 5, /* ACELP_48k */ + 5, 0, 0, 5, 5, 5, /* ACELP_64k */ +}; + + +/* bit allocation table for scaled innovation energy prediction */ +const int16_t Es_pred_bits_tbl[] = +{ +/* UC VC GC TC */ + 0, 0, 0, 4, /* ACELP_5k00 */ + 0, 0, 0, 4, /* ACELP_6k15 */ + 0, 0, 0, 4, /* ACELP_7k20 */ + 0, 0, 0, 4, /* ACELP_8k00 */ + 0, 5, 5, 5, /* ACELP_9k60 */ + 0, 5, 4, 4, /* ACELP_11k60 */ + 0, 5, 5, 5, /* ACELP_12k15 */ + 0, 5, 4, 5, /* ACELP_12k85 */ + 0, 5, 4, 4, /* ACELP_13k20 */ + 0, 5, 5, 5, /* ACELP_14k80 */ + 0, 5, 5, 5, /* ACELP_16k40 */ + 0, 5, 5, 5, /* ACELP_22k60 */ + 0, 5, 5, 5, /* ACELP_24k40 */ + 0, 0, 5, 5, /* ACELP_29k00 */ + 0, 0, 5, 5, /* ACELP_29k20 */ + 0, 0, 5, 5, /* ACELP_30k20 */ + 0, 0, 5, 5, /* ACELP_30k40 */ + 0, 0, 5, 5, /* ACELP_32k */ + 0, 0, 5, 5, /* ACELP_48k */ + 0, 0, 5, 5, /* ACELP_64k */ +}; + +/* bit allocation table for gain quantizer (ACELP@12.8kHz) */ +/* the 4 values allocated correspond to 4 subframes */ +const int16_t gain_bits_tbl[] = +{ +/* UC VC GC TC0_0 TC0_64 TC0_128 TC0_192 TC64 TC128 TC192 */ + 6,6,6,6, 7,6,6,6, 7,6,6,6, 5,5,5,5, 5,5,6,5, 5,3,6,6, 5,3,3,6, 3,6,6,6, 3,3,6,6, 3,3,3,10, /* ACELP_5k00 */ + 6,6,6,6, 7,6,6,6, 7,6,6,6, 5,5,5,5, 5,5,6,5, 5,3,6,6, 5,3,3,6, 3,6,6,6, 3,3,6,6, 3,3,3,10, /* ACELP_6k15 */ + 7,7,7,7, 7,6,6,6, 6,6,6,6, 5,5,5,5, 5,5,6,5, 5,3,6,6, 5,3,3,6, 3,6,6,6, 3,3,6,6, 3,3,3,10, /* ACELP_7k20 */ + 7,7,7,7, 8,7,6,6, 8,7,6,6, 5,5,5,5, 5,6,5,5, 5,3,6,6, 5,3,3,6, 3,5,5,5, 3,3,6,6, 3,3,3,14, /* ACELP_8k00 */ + 7,7,7,7, 6,6,6,6, 6,6,6,6, 6,6,6,6, 6,6,6,6, 6,3,6,6, 6,3,3,6, 3,6,6,6, 3,3,6,6, 3,3,3,10, /* ACELP_9k60 */ + 7,7,7,7, 6,6,6,6, 6,6,6,6, 6,6,6,6, 6,6,6,6, 6,3,6,6, 6,3,3,6, 3,6,6,6, 3,3,6,6, 3,3,3,13, /* ACELP_11k60 */ + 7,7,7,7, 6,6,6,6, 6,6,6,6, 6,6,6,6, 6,6,6,6, 6,3,6,6, 6,3,3,6, 3,6,6,6, 3,3,6,6, 3,3,3,14, /* ACELP_12k15 */ + 7,7,7,7, 6,6,6,6, 6,6,6,6, 6,6,6,6, 6,6,6,6, 6,3,6,6, 6,3,3,6, 3,6,6,6, 3,3,6,5, 3,3,3,14, /* ACELP_12k85 */ + 7,7,7,7, 6,6,6,6, 6,6,6,6, 6,6,6,6, 6,6,6,6, 6,3,6,6, 6,3,3,6, 3,6,6,6, 3,3,6,6, 3,3,3,15, /* ACELP_13k20 */ + 7,7,7,7, 6,6,6,6, 6,6,6,6, 6,6,6,6, 6,6,6,6, 6,3,6,6, 6,3,3,6, 3,6,6,6, 3,3,6,6, 3,3,3,15, /* ACELP_14k80 */ + 7,7,7,7, 6,6,6,6, 6,6,6,6, 6,6,6,6, 6,6,6,6, 6,3,6,6, 6,3,3,6, 3,6,6,6, 3,3,6,6, 3,3,3,15, /* ACELP_16k40 */ + 7,7,7,7, 6,6,6,6, 6,6,6,6, 6,6,6,6, 6,6,6,6, 6,3,6,6, 6,3,3,6, 3,6,6,6, 3,3,6,6, 3,3,3,14, /* ACELP_22k60 */ + 7,7,7,7, 6,6,6,6, 6,6,6,6, 6,6,6,6, 6,6,6,6, 6,3,6,6, 6,3,3,6, 3,6,6,6, 3,3,6,6, 3,3,3,15, /* ACELP_24k40 */ +}; + + +/* bit allocation table for gain gain quantizer (ACELP@16kHz) */ +/* the 5 values allocated correspond to 5 subframes */ +const int16_t gain_bits_16kHz_tbl[] = +{ + /* IC GC TC0 TC64 TC128 TC192 TC256 */ + 0,0,0,0,0, 6,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0, 0, /* ACELP_8k00 */ + 0,0,0,0,0, 6,6,6,6,6, 6,6,6,6,6, 3,6,6,6,6, 3,3,6,6,6, 3,3,3,6,6, 3,3,3,3,15, /* ACELP_14k80 */ + 6,6,6,6,6, 6,6,6,6,6, 6,6,6,6,6, 3,6,6,6,6, 3,3,6,6,6, 3,3,3,6,6, 3,3,3,3,15, /* ACELP_22k60 */ + 6,6,6,6,6, 6,6,6,6,6, 6,6,6,6,6, 3,6,6,6,6, 3,3,6,6,6, 3,3,3,6,6, 3,3,3,3,16, /* ACELP_24k40 */ + 6,6,6,6,6, 6,6,6,6,6, 6,6,6,6,6, 3,6,6,6,6, 3,3,6,6,6, 3,3,3,6,6, 3,3,3,3,14, /* ACELP_29k00 */ + 6,6,6,6,6, 6,6,6,6,6, 6,6,6,6,6, 3,6,6,6,6, 3,3,6,6,6, 3,3,3,6,6, 3,3,3,3,14, /* ACELP_29k20 */ + 6,6,6,6,6, 6,6,6,6,6, 6,6,6,6,6, 3,6,6,6,6, 3,3,6,6,6, 3,3,3,6,6, 3,3,3,3,14, /* ACELP_30k20 */ + 6,6,6,6,6, 6,6,6,6,6, 6,6,6,6,6, 3,6,6,6,6, 3,3,6,6,6, 3,3,3,6,6, 3,3,3,3,14, /* ACELP_30k40 */ + 6,6,6,6,6, 6,6,6,6,6, 6,6,6,6,6, 3,6,6,6,6, 3,3,6,6,6, 3,3,3,6,6, 3,3,3,3,14, /* ACELP_32k */ + 12,12,12,12,12, 12,12,12,12,12, 12,12,12,12,12, 6,12,12,12,12, 6,6,12,12,12, 6,6,6,12,12, 6,6,6,6,12, /* ACELP_48k */ + 12,12,12,12,12, 12,12,12,12,12, 12,12,12,12,12, 6,12,12,12,12, 6,6,12,12,12, 6,6,6,12,12, 6,6,6,6,12 /* ACELP_64k */ +}; + +/* bit allocation table for adaptive codebook (pitch) (ACELP@12.8kHz) */ +/* the 4 values correspond to 4 subframes */ +const int16_t ACB_bits_tbl[] = +{ +/* UC VC GC TC0_0 TC0_64 TC0_128 TC0_192 TC64 TC128 TC192 */ + 0,0,0,0, 9,5,5,5, 8,5, 8,5, 6,5,6,6, 0,7,6,6, 0,0,7,6, 0,0,0,7, 0,0,9,6, 0,0,5,9, 0,0,0,8, /* ACELP_5k00 */ + 0,0,0,0, 9,5,5,5, 8,5, 8,5, 6,5,6,6, 0,7,6,6, 0,0,7,6, 0,0,0,7, 0,0,9,6, 0,0,5,9, 0,0,0,8, /* ACELP_6k15 */ + 0,0,0,0, 9,5,5,5, 8,5, 8,5, 6,5,6,6, 0,7,6,6, 0,0,7,6, 0,0,0,7, 0,0,9,6, 0,0,5,9, 0,0,0,8, /* ACELP_7k20 */ + 0,0,0,0, 10,5,5,5, 9,5, 8,5, 6,5,6,6, 0,7,6,6, 0,0,7,5, 0,0,0,7, 0,0,9,6, 0,0,5,9, 0,0,0,9, /* ACELP_8k00 */ + 0,0,0,0, 10,5,5,5, 10,6, 9,6, 6,5,6,6, 0,7,6,6, 0,0,7,6, 0,0,0,7, 0,0,9,6, 0,0,5,9, 0,0,0,9, /* ACELP_9k60 */ + 0,0,0,0, 10,5,5,5, 10,6, 9,6, 6,5,6,6, 0,7,6,6, 0,0,7,6, 0,0,0,7, 0,0,9,6, 0,0,5,9, 0,0,0,9, /* ACELP_11k60 */ + 0,0,0,0, 10,5,5,5, 10,6, 9,6, 6,6,6,6, 0,7,6,6, 0,0,7,6, 0,0,0,7, 0,0,9,6, 0,0,5,9, 0,0,0,9, /* ACELP_12k15 */ + 0,0,0,0, 10,5,5,5, 10,6, 9,6, 6,5,6,6, 0,7,6,6, 0,0,7,6, 0,0,0,7, 0,0,9,6, 0,0,5,9, 0,0,0,9, /* ACELP_12k85 */ + 0,0,0,0, 10,5,5,5, 10,6, 9,6, 6,5,6,6, 0,7,6,6, 0,0,7,6, 0,0,0,7, 0,0,9,6, 0,0,5,9, 0,0,0,9, /* ACELP_13k20 */ + 0,0,0,0, 10,5,5,5, 10,6,10,6, 6,6,6,6, 0,7,6,6, 0,0,7,6, 0,0,0,7, 0,0,9,6, 0,0,5,9, 0,0,0,9, /* ACELP_14k80 */ + 0,0,0,0, 10,5,5,5, 10,6,10,6, 6,6,6,6, 0,7,6,6, 0,0,7,6, 0,0,0,7, 0,0,9,6, 0,0,5,9, 0,0,0,9, /* ACELP_16k40 */ + 0,0,0,0, 10,5,5,5, 10,6,10,6, 6,6,6,6, 0,7,6,6, 0,0,7,6, 0,0,0,7, 0,0,9,6, 0,0,5,9, 0,0,0,9, /* ACELP_22k60 */ + 0,0,0,0, 10,5,5,5, 10,6,10,6, 6,6,6,6, 0,7,6,6, 0,0,7,6, 0,0,0,7, 0,0,9,6, 0,0,5,9, 0,0,0,9, /* ACELP_24k40 */ +}; + +/* bit allocation table for adaptive codebook (pitch) (ACELP@16kHz) */ +/* the 5 values correspond to 5 subframes */ +const int16_t ACB_bits_16kHz_tbl[] = +{ + /* IC GC TC0 TC64 TC128 TC192 TC256 */ + 0,0, 0,0,0, 9,0, 0,0,0, 0,0, 0,0,0, 0,0, 0,0,0, 0,0, 0,0,0, 0,0,0, 0,0, 0,0,0,0, 0, /* ACELP_8k00 */ + 0,0, 0,0,0, 10,6,10,6,6, 6,8,10,6,6, 0,6,10,6,6, 0,0,10,6,6, 0,0,0,10,6, 0,0,0,0,10, /* ACELP_14k80 */ + 10,6,10,6,6, 10,6,10,6,6, 6,8,10,6,6, 0,6,10,6,6, 0,0,10,6,6, 0,0,0,10,6, 0,0,0,0,10, /* ACELP_22k60 */ + 10,6,10,6,6, 10,6,10,6,6, 6,8,10,6,6, 0,6,10,6,6, 0,0,10,6,6, 0,0,0,10,6, 0,0,0,0,10, /* ACELP_24k40 */ + 10,6,10,6,6, 10,6,10,6,6, 6,8,10,6,6, 0,6,10,6,6, 0,0,10,6,6, 0,0,0,10,6, 0,0,0,0,10, /* ACELP_29k00 */ + 10,6,10,6,6, 10,6,10,6,6, 6,8,10,6,6, 0,6,10,6,6, 0,0,10,6,6, 0,0,0,10,6, 0,0,0,0,10, /* ACELP_29k20 */ + 10,6,10,6,6, 10,6,10,6,6, 6,8,10,6,6, 0,6,10,6,6, 0,0,10,6,6, 0,0,0,10,6, 0,0,0,0,10, /* ACELP_30k20 */ + 10,6,10,6,6, 10,6,10,6,6, 6,8,10,6,6, 0,6,10,6,6, 0,0,10,6,6, 0,0,0,10,6, 0,0,0,0,10, /* ACELP_30k40 */ + 10,6,10,6,6, 10,6,10,6,6, 6,8,10,6,6, 0,6,10,6,6, 0,0,10,6,6, 0,0,0,10,6, 0,0,0,0,10, /* ACELP_32k */ + 10,6,10,6,6, 10,6,10,6,6, 6,8,10,6,6, 0,6,10,6,6, 0,0,10,6,6, 0,0,0,10,6, 0,0,0,0,10, /* ACELP_48k */ + 10,6,10,6,6, 10,6,10,6,6, 6,8,10,6,6, 0,6,10,6,6, 0,0,10,6,6, 0,0,0,10,6, 0,0,0,0,10 /* ACELP_64k */ +}; + +/* bit allocation table for algebraic (fixed) codebook (innovation) (ACELP@12.8kHz) */ +/* the 4 values correspond to 4 subframes */ +const int16_t FCB_bits_tbl[] = +{ +/* UC VC GC TC0_0 TC0_64 TC0_128 TC0_192 TC64 TC128 TC192 */ + 8,8,8,8, 12,12,12,20, 7, 7, 0, 7, 12, 7,12,12, 12,12, 7,12, 12,12,12,12, 12,12,20,12, 12,12,12,12, 12,12,12,12, 12,12,12,20, /* ACELP_5k00 */ + 10,10,10,10, 12,12,12,20, 12, 7,12, 7, 12, 7,12,12, 12,12, 7,12, 12,12,12,12, 12,12,20,12, 12,12,12,12, 12,12,12,12, 12,12,12,20, /* ACELP_6k15 */ + 13,13,13,13, 12,12,12,20, 12,12,12,20, 12, 7,12,12, 12,12, 7,12, 12,12,12,12, 12,12,20,12, 12,12,12,12, 12,12,12,12, 12,12,12,20, /* ACELP_7k20 */ + 13,13,13,13, 12,20,12,20, 12,20,12,20, 20,12,12,12, 20,12,12,12, 20,12,20,12, 20,12,20,20, 20,12,12,20, 20,12,20,12, 12,20,12,20, /* ACELP_8k00 */ + 13,13,13,13, 20,28,20,28, 20,20,20,28, 20,20,20,20, 20,20,20,20, 20,20,28,20, 20,28,20,28, 20,28,20,20, 20,20,20,28, 20,28,20,28, /* ACELP_9k60 */ + 0, 0, 0, 0, 28,36,28,36, 28,28,28,36, 28,28,28,28, 28,28,28,28, 28,28,36,28, 28,36,28,36, 28,36,28,28, 28,28,28,36, 28,36,28,36, /* ACELP_11k60 */ + 0, 0, 0, 0, 28,36,36,36, 28,36,28,36, 36,28,28,28, 36,28,28,28, 36,28,36,28, 36,36,28,43, 28,36,28,36, 28,36,28,36, 28,36,36,36, /* ACELP_12k15 */ + 0, 0, 0, 0, 36,36,36,43, 36,36,36,36, 36,36,28,36, 36,28,36,36, 36,36,36,36, 36,36,43,43, 36,36,36,36, 36,36,36,43, 36,36,36,43, /* ACELP_12k85 */ + 0, 0, 0, 0, 36,43,36,43, 36,36,36,43, 36,36,36,36, 36,36,36,36, 36,36,43,36, 36,43,43,43, 36,43,36,36, 43,36,43,36, 36,43,36,43, /* ACELP_13k20 */ + 0, 0, 0, 0, 43,50,43,50, 43,43,43,43, 43,43,43,43, 43,43,43,43, 43,43,50,43, 43,50,50,50, 43,43,43,50, 50,43,50,43, 43,50,43,50, /* ACELP_14k80 */ + 0, 0, 0, 0, 50,56,50,56, 50,50,50,56, 56,50,50,50, 56,50,50,50, 56,50,56,56, 56,56,56,56, 50,56,50,56, 50,56,56,56, 50,56,56,56, /* ACELP_16k40 */ + 0, 0, 0, 0, 83,83,83,87, 78,83,83,83, 83,78,83,83, 83,78,83,87, 83,87,83,87, 83,87,87,92, 87,83,87,83, 87,83,87,87, 83,87,87,87, /* ACELP_22k60 */ + 0, 0, 0, 0, 92,92,92,92, 87,92,92,92, 92,87,92,92, 92,87,92,92, 92,92,92,92, 92,92,92,92, 92,92,92,92, 92,92,92,92, 92,92,92,92, /* ACELP_24k40 */ +}; + +/* bit allocation table for algebraic (fixed) codebook (innovation) (ACELP@16kHz) */ +/* the 5 values correspond to 5 subframes */ +const int16_t FCB_bits_16kHz_tbl[] = +{ + /* IC GC TC0 TC64 TC128 TC192 TC256 */ + 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* ACELP_8k00 */ + 0, 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* ACELP_14k80 */ + 0, 0, 0, 0, 0, 62,56,56,56,62, 62,56,56,56,56, 56,56,56,56,73, 62,56,62,62,62, 56,62,62,62,73, 62,62,62,62,68, /* ACELP_22k60 */ + 0, 0, 0, 0, 0, 68,68,68,73,73, 68,68,68,68,73, 68,73,68,73,73, 73,73,73,73,73, 73,78,73,73,78, 73,78,73,73,78, /* ACELP_24k40 */ + 12,12,12,12,12, 36,28,28,36,36, 36,28,28,36,36, 36,28,28,36,36, 36,28,28,36,36, 36,28,28,36,36, 36,28,28,36,36, /* ACELP_29k00 */ + 12,12,12,12,12, 36,28,28,36,36, 36,28,28,36,36, 36,28,28,36,36, 36,28,28,36,36, 36,28,28,36,36, 36,28,28,36,36, /* ACELP_29k20 */ + 12,12,12,12,12, 36,36,36,36,36, 36,36,36,36,36, 36,36,36,36,36, 36,36,36,36,36, 36,36,36,36,36, 36,36,36,36,36, /* ACELP_30k20 */ + 12,12,12,12,12, 36,36,36,36,36, 36,36,36,36,36, 36,36,36,36,36, 36,36,36,36,36, 36,36,36,36,36, 36,36,36,36,36, /* ACELP_30k40 */ + 12,12,12,12,12, 36,36,36,36,36, 36,36,36,36,36, 36,36,36,36,36, 36,36,36,36,36, 36,36,36,36,36, 36,36,36,36,36, /* ACELP_32k */ + 12,12,12,12,12, 36,36,36,36,36, 36,36,36,36,36, 36,36,36,36,36, 36,36,36,36,36, 36,36,36,36,36, 36,36,36,36,36, /* ACELP_48k */ + 12,12,12,12,12, 36,36,36,36,36, 36,36,36,36,36, 36,36,36,36,36, 36,36,36,36,36, 36,36,36,36,36, 36,36,36,36,36 /* ACELP_64k */ +}; + +/* bit allocation table for AVQ bits in active segments (ACELP@16kHz) */ +const int16_t AVQ_bits_16kHz_tbl[] = +{ + /* IC GC TC0 TC64 TC128 TC192 TC256 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* ACELP_8k00 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* ACELP_14k80 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* ACELP_22k60 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* ACELP_24k40 */ + 78, 78, 78, 78, 78, 48, 48, 48, 48, 49, 48, 49, 49, 48, 49, 50, 50, 51, 52, 52, 50, 54, 53, 54, 54, 55, 55, 55, 55, 54, 52, 56, 56, 56, 56, /* ACELP_29k00 */ + 79, 79, 79, 79, 78, 49, 49, 49, 49, 49, 50, 49, 49, 50, 49, 52, 52, 51, 52, 52, 54, 54, 53, 54, 54, 56, 55, 55, 56, 56, 56, 56, 56, 56, 56, /* ACELP_29k20 */ + 78, 78, 78, 78, 78, 50, 50, 50, 50, 49, 51, 50, 50, 50, 50, 53, 53, 53, 52, 52, 55, 55, 55, 54, 54, 57, 57, 56, 56, 56, 57, 57, 57, 57, 56, /* ACELP_30k20 */ + 79, 79, 79, 79, 78, 51, 51, 51, 50, 50, 51, 51, 51, 51, 51, 54, 54, 53, 53, 53, 56, 56, 56, 55, 54, 58, 57, 57, 57, 57, 58, 58, 58, 57, 57, /* ACELP_30k40 */ + 86, 85, 85, 85, 85, 57, 57, 57, 57, 57, 58, 58, 57, 57, 57, 60, 60, 60, 60, 59, 62, 62, 62, 62, 61, 64, 64, 64, 63, 63, 64, 64, 64, 64, 64, /* ACELP_32k */ + 143,142,142,142,142, 116,115,115,115,115, 116,116,115,115,115, 119,119,118,118,118, 121,121,121,121,121, 124,124,123,123,123, 126,126,126,126,126, /* ACELP_48k */ + 207,206,206,206,206, 180,179,179,179,179, 180,180,179,179,179, 183,183,182,182,182, 185,185,185,185,185, 188,188,187,187,187, 190,190,190,190,190 /* ACELP_64k */ +}; + +/* bit allocation table for reserved bits (ACELP@12.8kHz) */ +const int16_t reserved_bits_tbl[] = +{ +/* UC VC GC TC0_0 TC0_64 TC0_128 TC0_192 TC64 TC128 TC192 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* ACELP_5k00 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* ACELP_6k15 */ + 1, 0, 0, 0, 0, 2, 4, 0, 3, 0, /* ACELP_7k20 */ + 14, 0, 0, 0, 0, 0, 1, 0, 0, 0, /* ACELP_8k00 */ + 46, 0, 0, 0, 1, 2, 4, 1, 4, 0, /* ACELP_9k60 */ + 0, 0, 0, 0, 1, 3, 6, 2, 6, 0, /* ACELP_11k60 */ + 0, 0, 0, 0, 2, 4, 0, 3, 7, 0, /* ACELP_12k15 */ + 0, 0, 0, 0, 1, 3, 0, 2, 0, 0, /* ACELP_12k85 */ + 0, 0, 0, 0, 1, 4, 1, 3, 0, 0, /* ACELP_13k20 */ + 0, 0, 0, 0, 2, 5, 2, 4, 1, 1, /* ACELP_14k80 */ + 0, 0, 0, 0, 2, 0, 5, 5, 3, 3, /* ACELP_16k40 */ + 0, 0, 2, 2, 0, 1, 3, 0, 0, 1, /* ACELP_22k60 */ + 0, 0, 1, 1, 3, 8, 19, 7, 11, 11, /* ACELP_24k40 */ +}; + +/* NRG mode */ +const uint8_t ACELP_NRG_MODE[RATE_MODE_MAX][BANDWIDTH_MODE_MAX][ACELP_MODE_MAX+RF_MODE_MAX] = +{ + {{0,0,1,1,0,0,0,0},{2,2,1,1,0,0,0,0}}, + {{1,1,1,1,0,0,0,0},{1,1,1,1,1,1,1,0}}, +}; + +/* NRG bits : (0/2/3 bits) */ +const uint8_t ACELP_NRG_BITS[3] = { 0, 3, 4 }; + +/* LTP MODE*/ +const uint8_t ACELP_LTP_MODE[RATE_MODE_MAX][BANDWIDTH_MODE_MAX][ACELP_MODE_MAX+RF_MODE_MAX] = +{ + {{0,0,1,2,0,0,0,0},{0,0,1,2,0,0,0,0}}, + {{4,4,3,4,0,0,0,0},{4,4,3,4,8,0,9,0}}, +}; + +/* LTP bits */ +const uint8_t ACELP_LTP_BITS_SFR[8+RF_MODE_MAX][5] = +{ + {0,0,0,0,0}, + {8,4,4,4,4}, + {8,5,8,5,5}, + {9,6,6,6,6}, + {9,6,9,6,6}, + {8,5,5,5,5}, + {8,5,8,5,5}, + {8,0,0,0,0}, + {8,5,5,5,5}, /* All-pred mode in RF, rf_frame_type = 0 */ + {8,4,4,4,0}, /* Gen-pred mode in RF, rf_frame_type = 2 */ +}; + +/* LTF modes (0 - LOW_PASS (LP filtering), 1 - FULL_BAND (no filtering), 2 - NORMAL_OPERATION (adaptive)) */ +/* Mode 2 ACELP: INACTIVE,UNVOICED,VOICED,GENERIC */ +const uint8_t ACELP_LTF_MODE[RATE_MODE_MAX][BANDWIDTH_MODE_MAX][ACELP_MODE_MAX+RF_MODE_MAX] = +{ + {{1,1,1,0,0,0,0,0},{1,1,1,0,0,0,0,0}}, + {{0,0,2,0,0,0,0,0},{0,0,2,0,1,1,1,0}}, +}; + +/* LTF bits */ +const uint8_t ACELP_LTF_BITS[4] = { 0, 0, 4, 0 }; + +/* GAINS ELEMENT */ +/* 5 modes: (EVS: 5b/subframe), (AMRWB: 7b/subframe),(AMRWB: 6b/subframe),(UC: 5b/subframe) */ +const uint8_t ACELP_GAINS_MODE[RATE_MODE_MAX][BANDWIDTH_MODE_MAX][ACELP_MODE_MAX+RF_MODE_MAX] = +{ + {{6,6,1,1,0,0,0,0},{7,7,1,1,0,0,0,0}}, + {{2,2,3,3,0,0,0,0},{2,2,3,3,3,2,1,0}}, +}; + +/* gains bits */ +const uint8_t ACELP_GAINS_BITS[10] = +{ + 0, /* skip sub-frame wise gain coding*/ + 5, + 6, + 7, + 6, + 7, + 6, /* UC */ + 7, /* GUNVOICED UV (5b ICB/2b Gaussian) */ + 4, /* GNELP UV */ + 5 /* GNELP UV */ +}; + +/* BPF modes (0 - no filtering, 1 - filtering, 2 - adaptive) */ +const uint8_t ACELP_BPF_MODE[RATE_MODE_MAX][BANDWIDTH_MODE_MAX][ACELP_MODE_MAX+RF_MODE_MAX] = +{ + {{1,1,1,1,0,0,0,0},{1,1,1,1,0,0,0,0}}, + {{1,1,2,2,0,0,0,0},{1,1,2,2,1,1,1,1}}, +}; + +/* BPF bits */ +const uint8_t ACELP_BPF_BITS[3] = { 0, 0, 2 }; + + +/*----------------------------------------------------------------------------------* + * Perceptual critical bands + *----------------------------------------------------------------------------------*/ + +const float crit_bands[] = +{ + 100.0f, 200.0f, 300.0f, 400.0f, 510.0f, 630.0f, 770.0f, 920.0f, 1080.0f, 1270.0f, 1480.0f, + 1720.0f, 2000.0f, 2320.0f, 2700.0f, 3150.0f, 3700.0f, 4400.0f, 5300.0f, 6350.0f, 7700.0f, + 9500.0f, 12000.0f, 15500.0f, 40000.0f +}; + +const float crit_bins_corr[CRIT_NOIS_BAND] = +{ + 0.9f, 0.9f, 0.85f, 0.8f, 0.775f, 0.75f, 0.725f, 0.7f, 0.675f, 0.65f, 0.625f, + 0.60f, 0.6f, 0.6f, 0.6f, 0.6f, 0.6f, 0.6f, 0.6f, 0.6f, 0.6f, 0.6f, 0.6f +}; + +const int16_t crit_bins[CRIT_NOIS_BAND] = +{ + 4, 4, 4, 4, 4, 5, 6, 6, 6, 8, 8, 10, 11, 13, 15, 18, 22, 16, 16, 20, 20, 20, 16 +}; + +const float crit_bands_loc[CRIT_NOIS_BAND] = +{ + 100.0f, 200.0f, 300.0f, 400.0f, 510.0f, 630.0f, 770.0f, 920.0f, 1080.0f, 1270.0f, 1480.0f, + 1720.0f, 2000.0f, 2320.0f, 2700.0f, 3150.0f, 3700.0f, 4100.0f, 4500.0f, 5000.0f, 5500.0f, 6000.0f, 6375.0f +}; + +const float inv_tbl[130] = +{ + 0.0f, /* unused */ + 1.0000000000f, 0.5000000000f, 0.3333333333f, 0.2500000000f, + 0.2000000000f, 0.1666666667f, 0.1428571429f, 0.1250000000f, + 0.1111111111f, 0.1000000000f, 0.0909090909f, 0.0833333333f, + 0.0769230769f, 0.0714285714f, 0.0666666667f, 0.0625000000f, + 0.0588235294f, 0.0555555556f, 0.0526315789f, 0.0500000000f, + 0.0476190476f, 0.0454545455f, 0.0434782609f, 0.0416666667f, + 0.0400000000f, 0.0384615385f, 0.0370370370f, 0.0357142857f, + 0.0344827586f, 0.0333333333f, 0.0322580645f, 0.0312500000f, + 0.0303030303f, 0.0294117647f, 0.0285714286f, 0.0277777778f, + 0.0270270270f, 0.0263157895f, 0.0256410256f, 0.0250000000f, + 0.0243902439f, 0.0238095238f, 0.0232558140f, 0.0227272727f, + 0.0222222222f, 0.0217391304f, 0.0212765957f, 0.0208333333f, + 0.0204081633f, 0.0200000000f, 0.0196078431f, 0.0192307692f, + 0.0188679245f, 0.0185185185f, 0.0181818182f, 0.0178571429f, + 0.0175438596f, 0.0172413793f, 0.0169491525f, 0.0166666667f, + 0.0163934426f, 0.0161290323f, 0.0158730159f, 0.0156250000f, + 0.0153846154f, 0.0151515152f, 0.0149253731f, 0.0147058824f, + 0.0144927536f, 0.0142857143f, 0.0140845070f, 0.0138888889f, + 0.0136986301f, 0.0135135135f, 0.0133333333f, 0.0131578947f, + 0.0129870130f, 0.0128205128f, 0.0126582278f, 0.0125000000f, + 0.0123456790f, 0.0121951220f, 0.0120481928f, 0.0119047619f, + 0.0117647059f, 0.0116279070f, 0.0114942529f, 0.0113636364f, + 0.0112359551f, 0.0111111111f, 0.0109890110f, 0.0108695652f, + 0.0107526882f, 0.0106382979f, 0.0105263158f, 0.0104166667f, + 0.0103092784f, 0.0102040816f, 0.0101010101f, 0.0100000000f, + 0.0099009901f, 0.0098039216f, 0.0097087379f, 0.0096153846f, + 0.0095238095f, 0.0094339623f, 0.0093457944f, 0.0092592593f, + 0.0091743119f, 0.0090909091f, 0.0090090090f, 0.0089285714f, + 0.0088495575f, 0.0087719298f, 0.0086956522f, 0.0086206897f, + 0.0085470085f, 0.0084745763f, 0.0084033613f, 0.0083333333f, + 0.0082644628f, 0.0081967213f, 0.0081300813f, 0.0080645161f, + 0.0080000000f, 0.0079365079f, 0.0078740157f, 0.0078125000f, + 0.0077519380f /* last val = 1/129 */ +}; + + +/*----------------------------------------------------------------------------------* + * LD music post-filter + *----------------------------------------------------------------------------------*/ + +const float mfreq_loc_LD[] = { 100.0f, 200.0f, 300.0f, 400.0f, 510.0f, 630.0f, 770.0f, 920.0f, 1080.0f, 1270.0f, 1480.0f, + 1720.0f, 2000.0f, 2320.0f, 2700.0f, 3150.0f, 3700.0f, 4400.0f, 5300.0f, (6400.0f-BIN_16kdct) + }; + +const int16_t mfreq_bindiv_LD[] = {10, 10, 10, 10, 11, 12, 14, 15, 16, 19, 21, 24, 28, 32, 38, 45, 55, 70, 90, 110}; +const float sc_qnoise[] = {0.1f,0.1f,0.1f,0.1f,0.1f,0.1f,0.09091f,0.09091f,0.09091f,0.09091f,0.09091f,0.09091f,0.09091f,0.09091f,0.09091f,0.06667f,0.06667f,0.06667f,0.06667f,0.06667f}; + +const float post_dct_wind[OFFSET2] = +{ + 1.000000f, 0.999933f, 0.999731f, 0.999395f, 0.998924f, 0.998319f, 0.997580f, 0.996707f, + 0.995700f, 0.994560f, 0.993287f, 0.991881f, 0.990343f, 0.988672f, 0.986870f, 0.984938f, + 0.982874f, 0.980681f, 0.978358f, 0.975907f, 0.973328f, 0.970621f, 0.967787f, 0.964828f, + 0.961743f, 0.958535f, 0.955202f, 0.951748f, 0.948172f, 0.944475f, 0.940658f, 0.936723f, + 0.932671f, 0.928501f, 0.924217f, 0.919819f, 0.915307f, 0.910684f, 0.905950f, 0.901107f, + 0.896156f, 0.891098f, 0.885935f, 0.880669f, 0.875300f, 0.869829f, 0.864260f, 0.858592f, + 0.852828f, 0.846968f, 0.841016f, 0.834971f, 0.828837f, 0.822614f, 0.816304f, 0.809909f, + 0.803431f, 0.796871f, 0.790231f, 0.783513f, 0.776719f, 0.769850f, 0.762908f, 0.755896f, + 0.748815f, 0.741667f, 0.734454f, 0.727178f, 0.719841f, 0.712444f, 0.704991f, 0.697482f, + 0.689920f, 0.682307f, 0.674645f, 0.666936f, 0.659182f, 0.651385f, 0.643547f, 0.635671f, + 0.627758f, 0.619811f, 0.611832f, 0.603822f, 0.595785f, 0.587721f, 0.579635f, 0.571526f, + 0.563399f, 0.555254f, 0.547095f, 0.538923f, 0.530740f, 0.522549f, 0.514353f, 0.506152f, + 0.497949f, 0.489747f, 0.481548f, 0.473354f, 0.465167f, 0.456990f, 0.448824f, 0.440671f, + 0.432535f, 0.424417f, 0.416319f, 0.408244f, 0.400193f, 0.392169f, 0.384175f, 0.376211f, + 0.368281f, 0.360386f, 0.352529f, 0.344712f, 0.336936f, 0.329204f, 0.321518f, 0.313880f, + 0.306293f, 0.298757f, 0.291276f, 0.283850f, 0.276483f, 0.269176f, 0.261931f, 0.254751f, + 0.247636f, 0.240589f, 0.233612f, 0.226707f, 0.219875f, 0.213118f, 0.206439f, 0.199839f, + 0.193320f, 0.186883f, 0.180530f, 0.174264f, 0.168085f, 0.161995f, 0.155996f, 0.150090f, + 0.144278f, 0.138562f, 0.132943f, 0.127423f, 0.122003f, 0.116685f, 0.111470f, 0.106360f, + 0.101355f, 0.096458f, 0.091669f, 0.086991f, 0.082423f, 0.077968f, 0.073626f, 0.069399f, + 0.065289f, 0.061295f, 0.057419f, 0.053662f, 0.050025f, 0.046510f, 0.043116f, 0.039846f, + 0.036699f, 0.033677f, 0.030780f, 0.028010f, 0.025367f, 0.022851f, 0.020464f, 0.018206f, + 0.016078f, 0.014080f, 0.012212f, 0.010476f, 0.008872f, 0.007400f, 0.006060f, 0.004853f, + 0.003780f, 0.002840f, 0.002034f, 0.001362f, 0.000824f, 0.000420f, 0.000151f, 0.000017f +}; + +const float MAX_SNR_SNR1_tab[MBANDS_GN_LD] = { 1.026316f, 1.026316f, 1.026316f, 1.026316f, 1.026316f, 1.026316f, 1.026316f, 1.026316f, 1.026316f, 1.026316f, 1.026316f, 1.026316f, 1.026316f, 1.026316f, 1.026316f, 1.02631627f, 1.043478f, 1.043478f, 1.043478f, 1.043478f}; +const float INV_MAX_SNR_tab[MBANDS_GN_LD] = { .026316f, .026316f, .026316f, .026316f, .026316f, .026316f, .026316f, .026316f, .026316f, .026316f, .026316f, .026316f, .026316f, .026316f, .026316f, .026316f, .043478f, .043478f, .043478f, .043478f}; + +const float wind_sss[LEN_WIN_SSS] = /* window for subsampling */ +{ + 0.080000f, 0.080183f, 0.080730f, 0.081642f, 0.082918f, 0.084557f, 0.086558f, 0.088918f, + 0.091636f, 0.094711f, 0.098139f, 0.101917f, 0.106043f, 0.110514f, 0.115326f, 0.120475f, + 0.125957f, 0.131767f, 0.137902f, 0.144356f, 0.151124f, 0.158200f, 0.165580f, 0.173257f, + 0.181225f, 0.189478f, 0.198009f, 0.206811f, 0.215878f, 0.225203f, 0.234777f, 0.244594f, + 0.254645f, 0.264922f, 0.275418f, 0.286124f, 0.297031f, 0.308132f, 0.319416f, 0.330876f, + 0.342501f, 0.354284f, 0.366213f, 0.378281f, 0.390477f, 0.402792f, 0.415215f, 0.427738f, + 0.440350f, 0.453041f, 0.465801f, 0.478620f, 0.491487f, 0.504393f, 0.517328f, 0.530280f, + 0.543240f, 0.556198f, 0.569142f, 0.582064f, 0.594952f, 0.607796f, 0.620587f, 0.633314f, + 0.645967f, 0.658535f, 0.671009f, 0.683380f, 0.695637f, 0.707770f, 0.719769f, 0.731627f, + 0.743332f, 0.754875f, 0.766248f, 0.777442f, 0.788447f, 0.799255f, 0.809857f, 0.820244f, + 0.830410f, 0.840344f, 0.850041f, 0.859491f, 0.868688f, 0.877623f, 0.886291f, 0.894684f, + 0.902795f, 0.910618f, 0.918147f, 0.925376f, 0.932299f, 0.938911f, 0.945205f, 0.951179f, + 0.956825f, 0.962141f, 0.967122f, 0.971764f, 0.976063f, 0.980016f, 0.983619f, 0.986871f, + 0.989767f, 0.992307f, 0.994488f, 0.996307f, 0.997765f, 0.998859f, 0.999589f, 0.999954f, + 1.000000f, 0.979530f, 0.918958f, 0.820763f, 0.688967f, 0.528964f, 0.347305f, 0.151428f +}; + +/*----------------------------------------------------------------------------------* + * Low-pass FIR filter for low-frequency post-filtering @ 8kHz + * fir1(240,(3900/32000),hanning(241))*5 + *----------------------------------------------------------------------------------*/ + +const float filter5_39s320_120[121] = +{ + 0.609388f, 0.594507f, 0.551181f, 0.483219f, 0.396518f, 0.298448f, 0.197086f, 0.100396f, + 0.015442f, -0.052273f, -0.099277f, -0.124358f, -0.128542f, -0.114820f, -0.087682f, -0.052507f, + -0.014899f, 0.019957f, 0.047847f, 0.065924f, 0.072906f, 0.069076f, 0.056094f, 0.036651f, + 0.014026f, -0.008391f, -0.027559f, -0.041148f, -0.047793f, -0.047188f, -0.040043f, -0.027903f, + -0.012866f, 0.002740f, 0.016701f, 0.027204f, 0.033059f, 0.033817f, 0.029768f, 0.021853f, + 0.011477f, 0.000283f, -0.010097f, -0.018267f, -0.023248f, -0.024581f, -0.022354f, -0.017150f, + -0.009927f, -0.001855f, 0.005864f, 0.012168f, 0.016275f, 0.017775f, 0.016654f, 0.013275f, + 0.008291f, 0.002530f, -0.003131f, -0.007899f, -0.011171f, -0.012604f, -0.012143f, -0.010011f, + -0.006645f, -0.002628f, 0.001417f, 0.004913f, 0.007412f, 0.008646f, 0.008551f, 0.007261f, + 0.005067f, 0.002364f, -0.000416f, -0.002869f, -0.004678f, -0.005647f, -0.005724f, -0.004986f, + -0.003623f, -0.001896f, -0.000090f, 0.001528f, 0.002746f, 0.003436f, 0.003559f, 0.003165f, + 0.002373f, 0.001348f, 0.000266f, -0.000708f, -0.001448f, -0.001877f, -0.001978f, -0.001782f, + -0.001364f, -0.000818f, -0.000247f, 0.000261f, 0.000641f, 0.000858f, 0.000909f, 0.000817f, + 0.000625f, 0.000384f, 0.000142f, -0.000062f, -0.000203f, -0.000274f, -0.000280f, -0.000239f, + -0.000172f, -0.000099f, -0.000038f, 0.000004f, 0.000024f, 0.000027f, 0.000019f, 0.000009f, + 0.000002f +}; + +/*----------------------------------------------------------------------------------* + * LP analysis windows + *----------------------------------------------------------------------------------*/ + +/* LP analysis window (length of the window is 25 ms which is 320 samples at 12.8kHz */ +const float LP_assym_window[L_LP] = +{ + 0.080000f, 0.080065f, 0.080258f, 0.080581f, 0.081033f, 0.081613f, 0.082323f, 0.083160f, + 0.084126f, 0.085220f, 0.086442f, 0.087791f, 0.089267f, 0.090869f, 0.092598f, 0.094452f, + 0.096431f, 0.098535f, 0.100762f, 0.103113f, 0.105587f, 0.108182f, 0.110899f, 0.113736f, + 0.116693f, 0.119769f, 0.122963f, 0.126274f, 0.129701f, 0.133243f, 0.136899f, 0.140668f, + 0.144550f, 0.148543f, 0.152645f, 0.156856f, 0.161175f, 0.165600f, 0.170130f, 0.174764f, + 0.179501f, 0.184339f, 0.189276f, 0.194313f, 0.199446f, 0.204674f, 0.209997f, 0.215413f, + 0.220919f, 0.226516f, 0.232200f, 0.237971f, 0.243826f, 0.249765f, 0.255785f, 0.261884f, + 0.268062f, 0.274317f, 0.280645f, 0.287047f, 0.293520f, 0.300062f, 0.306671f, 0.313345f, + 0.320084f, 0.326884f, 0.333744f, 0.340662f, 0.347635f, 0.354663f, 0.361743f, 0.368873f, + 0.376051f, 0.383274f, 0.390542f, 0.397852f, 0.405202f, 0.412590f, 0.420013f, 0.427470f, + 0.434959f, 0.442477f, 0.450022f, 0.457593f, 0.465187f, 0.472802f, 0.480436f, 0.488086f, + 0.495751f, 0.503429f, 0.511116f, 0.518812f, 0.526514f, 0.534220f, 0.541927f, 0.549634f, + 0.557337f, 0.565037f, 0.572729f, 0.580412f, 0.588083f, 0.595741f, 0.603384f, 0.611008f, + 0.618613f, 0.626195f, 0.633754f, 0.641286f, 0.648790f, 0.656263f, 0.663703f, 0.671109f, + 0.678478f, 0.685808f, 0.693097f, 0.700343f, 0.707544f, 0.714698f, 0.721803f, 0.728857f, + 0.735858f, 0.742804f, 0.749694f, 0.756524f, 0.763293f, 0.770000f, 0.776642f, 0.783218f, + 0.789725f, 0.796163f, 0.802528f, 0.808820f, 0.815036f, 0.821175f, 0.827236f, 0.833215f, + 0.839112f, 0.844925f, 0.850653f, 0.856294f, 0.861845f, 0.867306f, 0.872676f, 0.877952f, + 0.883133f, 0.888218f, 0.893205f, 0.898093f, 0.902880f, 0.907566f, 0.912148f, 0.916626f, + 0.920998f, 0.925263f, 0.929420f, 0.933468f, 0.937405f, 0.941230f, 0.944943f, 0.948543f, + 0.952027f, 0.955396f, 0.958649f, 0.961784f, 0.964800f, 0.967697f, 0.970474f, 0.973131f, + 0.975665f, 0.978078f, 0.980367f, 0.982533f, 0.984574f, 0.986491f, 0.988282f, 0.989948f, + 0.991487f, 0.992900f, 0.994185f, 0.995343f, 0.996373f, 0.997275f, 0.998048f, 0.998693f, + 0.999209f, 0.999597f, 0.999855f, 0.999984f, 0.999967f, 0.999705f, 0.999180f, 0.998393f, + 0.997344f, 0.996035f, 0.994465f, 0.992636f, 0.990548f, 0.988203f, 0.985603f, 0.982748f, + 0.979641f, 0.976282f, 0.972675f, 0.968820f, 0.964721f, 0.960380f, 0.955798f, 0.950980f, + 0.945926f, 0.940641f, 0.935128f, 0.929389f, 0.923427f, 0.917247f, 0.910852f, 0.904245f, + 0.897430f, 0.890410f, 0.883191f, 0.875777f, 0.868170f, 0.860376f, 0.852400f, 0.844245f, + 0.835916f, 0.827419f, 0.818757f, 0.809936f, 0.800962f, 0.791838f, 0.782571f, 0.773165f, + 0.763626f, 0.753960f, 0.744171f, 0.734266f, 0.724250f, 0.714129f, 0.703908f, 0.693594f, + 0.683193f, 0.672709f, 0.662150f, 0.651521f, 0.640828f, 0.630078f, 0.619277f, 0.608430f, + 0.597544f, 0.586626f, 0.575680f, 0.564715f, 0.553735f, 0.542747f, 0.531758f, 0.520774f, + 0.509800f, 0.498844f, 0.487911f, 0.477008f, 0.466141f, 0.455316f, 0.444540f, 0.433818f, + 0.423156f, 0.412561f, 0.402039f, 0.391596f, 0.381237f, 0.370969f, 0.360798f, 0.350728f, + 0.340767f, 0.330920f, 0.321191f, 0.311588f, 0.302115f, 0.292778f, 0.283582f, 0.274532f, + 0.265634f, 0.256892f, 0.248312f, 0.239898f, 0.231656f, 0.223589f, 0.215704f, 0.208003f, + 0.200492f, 0.193174f, 0.186055f, 0.179137f, 0.172426f, 0.165924f, 0.159636f, 0.153564f, + 0.147714f, 0.142087f, 0.136687f, 0.131518f, 0.126582f, 0.121881f, 0.117419f, 0.113199f, + 0.109222f, 0.105491f, 0.102007f, 0.098774f, 0.095793f, 0.093065f, 0.090592f, 0.088376f, + 0.086417f, 0.084718f, 0.083278f, 0.082099f, 0.081181f, 0.080525f, 0.080131f, 0.080000f +}; + +/* LP analysis window (length of the window is 25ms which is 400 samples at 16kHz */ +const float LP_assym_window_16k[L_LP_16k] = +{ + 0.080000f, 0.080041f, 0.080165f, 0.080371f, 0.080660f, 0.081032f, 0.081485f, 0.082021f, + 0.082639f, 0.083340f, 0.084122f, 0.084986f, 0.085932f, 0.086959f, 0.088067f, 0.089257f, + 0.090527f, 0.091879f, 0.093310f, 0.094822f, 0.096414f, 0.098085f, 0.099835f, 0.101665f, + 0.103573f, 0.105560f, 0.107624f, 0.109767f, 0.111986f, 0.114282f, 0.116655f, 0.119103f, + 0.121627f, 0.124227f, 0.126901f, 0.129649f, 0.132470f, 0.135365f, 0.138332f, 0.141372f, + 0.144483f, 0.147665f, 0.150917f, 0.154240f, 0.157631f, 0.161091f, 0.164619f, 0.168215f, + 0.171877f, 0.175605f, 0.179399f, 0.183257f, 0.187180f, 0.191166f, 0.195214f, 0.199324f, + 0.203496f, 0.207727f, 0.212019f, 0.216369f, 0.220777f, 0.225243f, 0.229765f, 0.234343f, + 0.238976f, 0.243663f, 0.248402f, 0.253195f, 0.258038f, 0.262933f, 0.267877f, 0.272870f, + 0.277911f, 0.282998f, 0.288132f, 0.293312f, 0.298535f, 0.303802f, 0.309111f, 0.314462f, + 0.319853f, 0.325283f, 0.330753f, 0.336259f, 0.341803f, 0.347382f, 0.352995f, 0.358642f, + 0.364322f, 0.370033f, 0.375774f, 0.381545f, 0.387345f, 0.393172f, 0.399025f, 0.404903f, + 0.410806f, 0.416732f, 0.422680f, 0.428649f, 0.434639f, 0.440647f, 0.446673f, 0.452715f, + 0.458774f, 0.464846f, 0.470933f, 0.477032f, 0.483142f, 0.489262f, 0.495391f, 0.501529f, + 0.507673f, 0.513823f, 0.519978f, 0.526136f, 0.532297f, 0.538459f, 0.544622f, 0.550784f, + 0.556943f, 0.563100f, 0.569253f, 0.575400f, 0.581541f, 0.587674f, 0.593799f, 0.599915f, + 0.606019f, 0.612112f, 0.618192f, 0.624258f, 0.630308f, 0.636343f, 0.642360f, 0.648358f, + 0.654338f, 0.660296f, 0.666234f, 0.672148f, 0.678039f, 0.683905f, 0.689745f, 0.695558f, + 0.701344f, 0.707100f, 0.712827f, 0.718522f, 0.724186f, 0.729816f, 0.735412f, 0.740973f, + 0.746499f, 0.751987f, 0.757437f, 0.762848f, 0.768219f, 0.773549f, 0.778837f, 0.784082f, + 0.789284f, 0.794440f, 0.799551f, 0.804616f, 0.809633f, 0.814601f, 0.819521f, 0.824390f, + 0.829208f, 0.833974f, 0.838688f, 0.843347f, 0.847953f, 0.852503f, 0.856997f, 0.861434f, + 0.865813f, 0.870134f, 0.874396f, 0.878598f, 0.882739f, 0.886818f, 0.890835f, 0.894789f, + 0.898680f, 0.902506f, 0.906267f, 0.909962f, 0.913591f, 0.917153f, 0.920647f, 0.924073f, + 0.927430f, 0.930718f, 0.933935f, 0.937082f, 0.940157f, 0.943160f, 0.946092f, 0.948950f, + 0.951735f, 0.954446f, 0.957082f, 0.959644f, 0.962130f, 0.964541f, 0.966876f, 0.969133f, + 0.971314f, 0.973418f, 0.975443f, 0.977391f, 0.979260f, 0.981050f, 0.982761f, 0.984392f, + 0.985944f, 0.987416f, 0.988807f, 0.990118f, 0.991348f, 0.992497f, 0.993565f, 0.994551f, + 0.995456f, 0.996279f, 0.997021f, 0.997680f, 0.998257f, 0.998752f, 0.999164f, 0.999494f, + 0.999742f, 0.999907f, 0.999990f, 0.999979f, 0.999811f, 0.999476f, 0.998973f, 0.998302f, + 0.997465f, 0.996460f, 0.995289f, 0.993952f, 0.992450f, 0.990782f, 0.988950f, 0.986955f, + 0.984796f, 0.982475f, 0.979993f, 0.977350f, 0.974548f, 0.971587f, 0.968469f, 0.965194f, + 0.961765f, 0.958182f, 0.954446f, 0.950559f, 0.946522f, 0.942337f, 0.938005f, 0.933528f, + 0.928908f, 0.924146f, 0.919243f, 0.914202f, 0.909025f, 0.903713f, 0.898269f, 0.892694f, + 0.886990f, 0.881160f, 0.875205f, 0.869128f, 0.862931f, 0.856617f, 0.850186f, 0.843643f, + 0.836989f, 0.830226f, 0.823358f, 0.816386f, 0.809314f, 0.802143f, 0.794877f, 0.787518f, + 0.780068f, 0.772531f, 0.764909f, 0.757206f, 0.749422f, 0.741563f, 0.733630f, 0.725626f, + 0.717555f, 0.709419f, 0.701221f, 0.692964f, 0.684652f, 0.676287f, 0.667872f, 0.659410f, + 0.650905f, 0.642360f, 0.633777f, 0.625160f, 0.616512f, 0.607835f, 0.599135f, 0.590412f, + 0.581672f, 0.572916f, 0.564148f, 0.555371f, 0.546589f, 0.537804f, 0.529020f, 0.520240f, + 0.511467f, 0.502705f, 0.493956f, 0.485224f, 0.476512f, 0.467823f, 0.459161f, 0.450528f, + 0.441927f, 0.433363f, 0.424837f, 0.416353f, 0.407915f, 0.399524f, 0.391185f, 0.382900f, + 0.374672f, 0.366505f, 0.358401f, 0.350363f, 0.342395f, 0.334498f, 0.326676f, 0.318932f, + 0.311269f, 0.303689f, 0.296196f, 0.288791f, 0.281478f, 0.274259f, 0.267137f, 0.260115f, + 0.253195f, 0.246379f, 0.239670f, 0.233071f, 0.226584f, 0.220211f, 0.213955f, 0.207818f, + 0.201802f, 0.195909f, 0.190142f, 0.184502f, 0.178992f, 0.173614f, 0.168369f, 0.163260f, + 0.158288f, 0.153456f, 0.148764f, 0.144215f, 0.139811f, 0.135552f, 0.131441f, 0.127479f, + 0.123667f, 0.120008f, 0.116501f, 0.113149f, 0.109952f, 0.106913f, 0.104031f, 0.101309f, + 0.098746f, 0.096344f, 0.094104f, 0.092027f, 0.090113f, 0.088363f, 0.086778f, 0.085358f, + 0.084104f, 0.083017f, 0.082096f, 0.081342f, 0.080755f, 0.080336f, 0.080084f, 0.080000f +}; + +/* LP analysis window for AMR-WB IO mode (length of the window is 30ms which is + * 384 samples at 12.8kHz */ +const float hamcos_window[L_LP_AMR_WB] = +{ + 0.080000f, 0.080035f, 0.080139f, 0.080313f, 0.080556f, 0.080869f, 0.081251f, 0.081703f, + 0.082224f, 0.082814f, 0.083473f, 0.084201f, 0.084998f, 0.085864f, 0.086799f, 0.087802f, + 0.088873f, 0.090013f, 0.091221f, 0.092496f, 0.093839f, 0.095250f, 0.096728f, 0.098273f, + 0.099884f, 0.101563f, 0.103307f, 0.105118f, 0.106994f, 0.108936f, 0.110943f, 0.113015f, + 0.115151f, 0.117351f, 0.119616f, 0.121944f, 0.124335f, 0.126789f, 0.129306f, 0.131884f, + 0.134525f, 0.137226f, 0.139989f, 0.142812f, 0.145695f, 0.148638f, 0.151639f, 0.154700f, + 0.157819f, 0.160995f, 0.164229f, 0.167520f, 0.170867f, 0.174270f, 0.177728f, 0.181241f, + 0.184808f, 0.188429f, 0.192103f, 0.195829f, 0.199608f, 0.203438f, 0.207319f, 0.211250f, + 0.215231f, 0.219261f, 0.223340f, 0.227466f, 0.231640f, 0.235860f, 0.240126f, 0.244438f, + 0.248794f, 0.253195f, 0.257638f, 0.262125f, 0.266653f, 0.271223f, 0.275833f, 0.280483f, + 0.285173f, 0.289901f, 0.294667f, 0.299470f, 0.304309f, 0.309184f, 0.314094f, 0.319038f, + 0.324015f, 0.329025f, 0.334067f, 0.339140f, 0.344244f, 0.349377f, 0.354538f, 0.359728f, + 0.364946f, 0.370189f, 0.375458f, 0.380753f, 0.386071f, 0.391412f, 0.396776f, 0.402162f, + 0.407568f, 0.412995f, 0.418441f, 0.423905f, 0.429386f, 0.434885f, 0.440399f, 0.445928f, + 0.451472f, 0.457029f, 0.462598f, 0.468179f, 0.473771f, 0.479373f, 0.484984f, 0.490604f, + 0.496231f, 0.501865f, 0.507504f, 0.513148f, 0.518797f, 0.524448f, 0.530102f, 0.535757f, + 0.541413f, 0.547069f, 0.552724f, 0.558377f, 0.564027f, 0.569673f, 0.575315f, 0.580952f, + 0.586582f, 0.592205f, 0.597821f, 0.603428f, 0.609025f, 0.614611f, 0.620187f, 0.625750f, + 0.631300f, 0.636837f, 0.642359f, 0.647865f, 0.653355f, 0.658828f, 0.664283f, 0.669719f, + 0.675136f, 0.680532f, 0.685907f, 0.691260f, 0.696590f, 0.701896f, 0.707178f, 0.712435f, + 0.717665f, 0.722869f, 0.728045f, 0.733192f, 0.738311f, 0.743399f, 0.748457f, 0.753483f, + 0.758477f, 0.763438f, 0.768365f, 0.773257f, 0.778115f, 0.782936f, 0.787720f, 0.792467f, + 0.797176f, 0.801846f, 0.806477f, 0.811067f, 0.815616f, 0.820124f, 0.824589f, 0.829011f, + 0.833389f, 0.837723f, 0.842012f, 0.846256f, 0.850453f, 0.854603f, 0.858706f, 0.862760f, + 0.866766f, 0.870722f, 0.874628f, 0.878484f, 0.882288f, 0.886041f, 0.889741f, 0.893389f, + 0.896983f, 0.900523f, 0.904009f, 0.907439f, 0.910814f, 0.914133f, 0.917395f, 0.920601f, + 0.923748f, 0.926838f, 0.929869f, 0.932842f, 0.935755f, 0.938608f, 0.941401f, 0.944133f, + 0.946804f, 0.949413f, 0.951961f, 0.954446f, 0.956869f, 0.959229f, 0.961525f, 0.963758f, + 0.965926f, 0.968030f, 0.970070f, 0.972044f, 0.973953f, 0.975796f, 0.977574f, 0.979285f, + 0.980930f, 0.982509f, 0.984020f, 0.985464f, 0.986841f, 0.988151f, 0.989392f, 0.990566f, + 0.991672f, 0.992709f, 0.993678f, 0.994578f, 0.995409f, 0.996172f, 0.996866f, 0.997490f, + 0.998046f, 0.998532f, 0.998949f, 0.999296f, 0.999574f, 0.999783f, 0.999922f, 0.999991f, + 1.000000f, 0.999924f, 0.999698f, 0.999320f, 0.998791f, 0.998111f, 0.997280f, 0.996298f, + 0.995166f, 0.993883f, 0.992450f, 0.990867f, 0.989134f, 0.987252f, 0.985220f, 0.983039f, + 0.980710f, 0.978233f, 0.975607f, 0.972834f, 0.969914f, 0.966848f, 0.963635f, 0.960277f, + 0.956773f, 0.953125f, 0.949332f, 0.945396f, 0.941317f, 0.937096f, 0.932733f, 0.928229f, + 0.923585f, 0.918801f, 0.913879f, 0.908818f, 0.903619f, 0.898284f, 0.892814f, 0.887208f, + 0.881468f, 0.875595f, 0.869589f, 0.863452f, 0.857185f, 0.850788f, 0.844262f, 0.837609f, + 0.830829f, 0.823923f, 0.816893f, 0.809739f, 0.802463f, 0.795066f, 0.787548f, 0.779911f, + 0.772157f, 0.764285f, 0.756298f, 0.748197f, 0.739983f, 0.731657f, 0.723220f, 0.714674f, + 0.706019f, 0.697258f, 0.688392f, 0.679421f, 0.670348f, 0.661174f, 0.651899f, 0.642526f, + 0.633056f, 0.623490f, 0.613830f, 0.604077f, 0.594233f, 0.584299f, 0.574276f, 0.564167f, + 0.553972f, 0.543694f, 0.533333f, 0.522892f, 0.512372f, 0.501774f, 0.491101f, 0.480353f, + 0.469533f, 0.458641f, 0.447680f, 0.436652f, 0.425558f, 0.414399f, 0.403177f, 0.391895f, + 0.380553f, 0.369154f, 0.357699f, 0.346190f, 0.334629f, 0.323017f, 0.311356f, 0.299648f, + 0.287895f, 0.276098f, 0.264260f, 0.252381f, 0.240465f, 0.228512f, 0.216524f, 0.204504f, + 0.192453f, 0.180373f, 0.168265f, 0.156132f, 0.143976f, 0.131797f, 0.119599f, 0.107383f, + 0.095150f, 0.082903f, 0.070644f, 0.058374f, 0.046095f, 0.033809f, 0.021518f, 0.009223f +}; + + +/* LAGW_STRONG */ +const float lag_window_8k[17] = +{ + 1.0001f, + 0.998890285694f, 0.995568526105f, 0.990056789412f, 0.982391584471f, + 0.972623458067f, 0.960816439805f, 0.947047343167f, 0.931404933402f, + 0.913988974871f, 0.894909172129f, 0.874284020465f, 0.852239582728f, + 0.828908210054f, 0.804427224606f, 0.778937582562f, 0.752582535421f +}; + +const float lag_window_12k8[NUM_LAGW_STRENGTHS][17] = +{ + /* LAGW_WEAK */ + { + 1.0001f, + 0.999951809733f, 0.999807252867f, 0.999566371195f, 0.999229234349f, + 0.998795939769f, 0.998266612656f, 0.997641405905f, 0.996920500042f, + 0.996104103128f, 0.995192450664f, 0.994185805476f, 0.993084457589f, + 0.991888724088f, 0.990598948965f, 0.989215502956f, 0.987738783362f + }, + /* LAGW_MEDIUM */ + { + 1.0001f, + 0.999807252867f, 0.999229234349f, 0.998266612656f, 0.996920500042f, + 0.995192450664f, 0.993084457589f, 0.990598948965f, 0.987738783362f, + 0.984507244288f, 0.980908033914f, 0.976945266001f, 0.972623458067f, + 0.967947522806f, 0.962922758784f, 0.957554840431f, 0.951849807369f + }, + /* LAGW_STRONG */ + { + 1.0001f, + 0.999566371183f, 0.998266612613f, 0.996104103033f, 0.993084457421f, + 0.989215493202f, 0.984507262707f, 0.978971838951f, 0.972623467445f, + 0.965478420258f, 0.957554817200f, 0.948872864246f, 0.939454317093f, + 0.929322779179f, 0.918503403664f, 0.907022833824f, 0.894909143448f + } +}; + +const float lag_window_16k[NUM_LAGW_STRENGTHS][17] = +{ + /* LAGW_WEAK */ + { + 1.0001f, + 0.999969157962f, 0.999876637555f, 0.999722455899f, 0.999506641521f, + 0.999229234349f, 0.998890285694f, 0.998489858239f, 0.998028026020f, + 0.997504874399f, 0.996920500042f, 0.996275010885f, 0.995568526105f, + 0.994801176082f, 0.993973102356f, 0.993084457589f, 0.992135405511f + }, + /* LAGW_MEDIUM */ + { + 1.0001f, + 0.999876637555f, 0.999506641521f, 0.998890285694f, 0.998028026020f, + 0.996920500042f, 0.995568526105f, 0.993973102356f, 0.992135405511f, + 0.990056789412f, 0.987738783362f, 0.985183090250f, 0.982391584471f, + 0.979366309628f, 0.976109476043f, 0.972623458067f, 0.968910791191f + }, + /* LAGW_STRONG */ + { + 1.0001f, + 0.999722455899f, 0.998890285694f, 0.997504874399f, 0.995568526105f, + 0.993084457589f, 0.990056789412f, 0.986490534533f, 0.982391584471f, + 0.977766693093f, 0.972623458067f, 0.966970300068f, 0.960816439805f, + 0.954171872966f, 0.947047343167f, 0.939454313017f, 0.931404933402f + } +}; + +const float lag_window_25k6[NUM_LAGW_STRENGTHS][17] = +{ + /* LAGW_WEAK */ + { + 1.0001f, + 0.999987952216f, 0.999951809733f, 0.999891575166f, 0.999807252867f, + 0.999698848932f, 0.999566371195f, 0.999409829230f, 0.999229234349f, + 0.999024599601f, 0.998795939769f, 0.998543271372f, 0.998266612656f, + 0.997965983599f, 0.997641405905f, 0.997292903003f, 0.996920500042f + }, + /* LAGW_MEDIUM */ + { + 1.0001f, + 0.999951809733f, 0.999807252867f, 0.999566371195f, 0.999229234349f, + 0.998795939769f, 0.998266612656f, 0.997641405905f, 0.996920500042f, + 0.996104103128f, 0.995192450664f, 0.994185805476f, 0.993084457589f, + 0.991888724088f, 0.990598948965f, 0.989215502956f, 0.987738783362f + }, + /* LAGW_STRONG */ + { + 1.0001f, + 0.999891579151f, 0.999566376209f, 0.999024569988f, 0.998266637325f, + 0.997292876244f, 0.996104121208f, 0.994700968266f, 0.993084430695f, + 0.991255581379f, 0.989215493202f, 0.986965596676f, 0.984507262707f, + 0.981842100620f, 0.978971838951f, 0.975898265839f, 0.972623467445f + } +}; + +const float lag_window_32k[NUM_LAGW_STRENGTHS][17] = +{ + /* LAGW_WEAK */ + { + 1.0001f, + 0.999992289401f, 0.999969157962f, 0.999930606752f, 0.999876637555f, + 0.999807252867f, 0.999722455899f, 0.999622250572f, 0.999506641521f, + 0.999375634094f, 0.999229234349f, 0.999067449055f, 0.998890285694f, + 0.998697752455f, 0.998489858239f, 0.998266612656f, 0.998028026020f + }, + /* LAGW_MEDIUM */ + { + 1.0001f, + 0.999969157962f, 0.999876637555f, 0.999722455899f, 0.999506641521f, + 0.999229234349f, 0.998890285694f, 0.998489858239f, 0.998028026020f, + 0.997504874399f, 0.996920500042f, 0.996275010885f, 0.995568526105f, + 0.994801176082f, 0.993973102356f, 0.993084457589f, 0.992135405511f + }, + /* LAGW_STRONG */ + { + 1.0001f, + 0.999930606752f, 0.999722455899f, 0.999375634094f, 0.998890285694f, + 0.998266612656f, 0.997504874399f, 0.996605387628f, 0.995568526105f, + 0.994394720400f, 0.993084457589f, 0.991638280913f, 0.990056789412f, + 0.988340637503f, 0.986490534533f, 0.984507244288f, 0.982391584471f + } +}; + +/* LAGW_STRONG */ +const float lag_window_48k[17] = +{ + 1.0001f, + 0.999969157962f, 0.999876637555f, 0.999722455899f, 0.999506641521f, + 0.999229234349f, 0.998890285694f, 0.998489858239f, 0.998028026020f, + 0.997504874399f, 0.996920500042f, 0.996275010885f, 0.995568526105f, + 0.994801176082f, 0.993973102356f, 0.993084457589f, 0.992135405511f +}; + + +/*----------------------------------------------------------------------------------* + * LP analysis - grid of points for evaluating Chebyshev polynomials + *----------------------------------------------------------------------------------*/ +const float grid50[(GRID50_POINTS-1)/2 - 1] = +{ + 0.9980267284f, 0.9921147013f, 0.9822872507f, 0.9685831611f, 0.9510565163f, + 0.9297764859f, 0.9048270525f, 0.8763066800f, 0.8443279255f, 0.8090169944f, + 0.7705132428f, 0.7289686274f, 0.6845471059f, 0.6374239897f, 0.5877852523f, + 0.5358267950f, 0.4817536741f, 0.4257792916f, 0.3681245527f, 0.3090169944f, + 0.2486898872f, 0.1873813146f, 0.1253332336f, 0.0627905195f +}; + +const float grid40[(GRID40_POINTS-1)/2 - 1] = +{ + 0.9969173337f, 0.9876883406f, 0.9723699204f, 0.9510565163f, 0.9238795325f, + 0.8910065242f, 0.8526401644f, 0.8090169944f, 0.7604059656f, 0.7071067812f, + 0.6494480483f, 0.5877852523f, 0.5224985647f, 0.4539904997f, 0.3826834324f, + 0.3090169944f, 0.2334453639f, 0.1564344650f, 0.0784590957f +}; + +const float grid100[GRID100_POINTS+1] = +{ + 1.0000000000f, 0.9995065331f, 0.9980267286f, 0.9955619574f, 0.9921147227f, + 0.9876883626f, 0.9822872281f, 0.9759167433f, 0.9685831666f, 0.9602936506f, + 0.9510565400f, 0.9408807755f, 0.9297764897f, 0.9177545905f, 0.9048270583f, + 0.8910065293f, 0.8763066530f, 0.8607420325f, 0.8443279266f, 0.8270805478f, + 0.8090170026f, 0.7901549935f, 0.7705132365f, 0.7501110435f, 0.7289685607f, + 0.7071067691f, 0.6845470667f, 0.6613118052f, 0.6374239326f, 0.6129069924f, + 0.5877852440f, 0.5620833635f, 0.5358267426f, 0.5090413690f, 0.4817536175f, + 0.4539904296f, 0.4257791936f, 0.3971477747f, 0.3681245446f, 0.3387379050f, + 0.3090169728f, 0.2789910734f, 0.2486898303f, 0.2181431651f, 0.1873812228f, + 0.1564343721f, 0.1253331155f, 0.0941081867f, 0.0627903789f, 0.0314107276f, + -0.0000000437f, -0.0314108171f, -0.0627905875f, -0.0941083953f, -0.1253333241f, + -0.1564345658f, -0.1873814315f, -0.2181433737f, -0.2486900240f, -0.2789911330f, + -0.3090170324f, -0.3387379944f, -0.3681246340f, -0.3971479833f, -0.4257793725f, + -0.4539906085f, -0.4817537963f, -0.5090415478f, -0.5358269215f, -0.5620835423f, + -0.5877854228f, -0.6129072309f, -0.6374241710f, -0.6613120437f, -0.6845472455f, + -0.7071067691f, -0.7289686203f, -0.7501111031f, -0.7705132961f, -0.7901550531f, + -0.8090170622f, -0.8270806074f, -0.8443279862f, -0.8607420921f, -0.8763067126f, + -0.8910065889f, -0.9048271179f, -0.9177547097f, -0.9297765493f, -0.9408808351f, + -0.9510565996f, -0.9602937698f, -0.9685832262f, -0.9759168029f, -0.9822872877f, + -0.9876883626f, -0.9921147227f, -0.9955619574f, -0.9980267286f, -0.9995065331f, + -1.0000000000f +}; + +/*----------------------------------------------------------------------------------* + * Sinus & Cosinus - table for the FFT and IFFT of 256 points, + * dimension of the table = 161 + *----------------------------------------------------------------------------------*/ + +const float sincos_t[161] = +{ + 0.0f, + 0.0245412290096282960f, 0.0490676760673522950f, 0.0735645666718482970f, 0.0980171412229537960f, 0.1224106773734092700f, + 0.1467304676771163900f, 0.1709618866443634000f, 0.1950903236865997300f, 0.2191012352705001800f, 0.2429801821708679200f, + 0.2667127549648284900f, 0.2902846634387970000f, 0.3136817514896392800f, 0.3368898630142211900f, 0.3598950505256652800f, + 0.3826834261417388900f, 0.4052413105964660600f, 0.4275550842285156300f, 0.4496113359928131100f, 0.4713967442512512200f, + 0.4928981959819793700f, 0.5141027569770813000f, 0.5349976420402526900f, 0.5555702447891235400f, 0.5758081674575805700f, + 0.5956993103027343800f, 0.6152315735816955600f, 0.6343932747840881300f, 0.6531728506088256800f, 0.6715589761734008800f, + 0.6895405650138855000f, 0.7071067690849304200f, 0.7242470979690551800f, 0.7409511208534240700f, 0.7572088241577148400f, + 0.7730104327201843300f, 0.7883464097976684600f, 0.8032075166702270500f, 0.8175848126411438000f, 0.8314695954322814900f, + 0.8448535799980163600f, 0.8577286005020141600f, 0.8700869679450988800f, 0.8819212913513183600f, 0.8932242989540100100f, + 0.9039893150329589800f, 0.9142097830772399900f, 0.9238795042037963900f, 0.9329928159713745100f, 0.9415440559387207000f, + 0.9495281577110290500f, 0.9569403529167175300f, 0.9637760519981384300f, 0.9700312614440918000f, 0.9757021069526672400f, + 0.9807852506637573200f, 0.9852776527404785200f, 0.9891765117645263700f, 0.9924795627593994100f, 0.9951847195625305200f, + 0.9972904324531555200f, 0.9987954497337341300f, 0.9996988177299499500f, 1.0000000000000000000f, 0.9996988177299499500f, + 0.9987954497337341300f, 0.9972904324531555200f, 0.9951847195625305200f, 0.9924795627593994100f, 0.9891765117645263700f, + 0.9852776527404785200f, 0.9807852506637573200f, 0.9757021069526672400f, 0.9700312614440918000f, 0.9637760519981384300f, + 0.9569403529167175300f, 0.9495281577110290500f, 0.9415440559387207000f, 0.9329928159713745100f, 0.9238795042037963900f, + 0.9142097830772399900f, 0.9039893150329589800f, 0.8932242989540100100f, 0.8819212913513183600f, 0.8700869679450988800f, + 0.8577286005020141600f, 0.8448535799980163600f, 0.8314695954322814900f, 0.8175848126411438000f, 0.8032075166702270500f, + 0.7883464097976684600f, 0.7730104327201843300f, 0.7572088241577148400f, 0.7409511208534240700f, 0.7242470979690551800f, + 0.7071067690849304200f, 0.6895405650138855000f, 0.6715589761734008800f, 0.6531728506088256800f, 0.6343932747840881300f, + 0.6152315735816955600f, 0.5956993103027343800f, 0.5758081674575805700f, 0.5555702447891235400f, 0.5349976420402526900f, + 0.5141027569770813000f, 0.4928981959819793700f, 0.4713967442512512200f, 0.4496113359928131100f, 0.4275550842285156300f, + 0.4052413105964660600f, 0.3826834261417388900f, 0.3598950505256652800f, 0.3368898630142211900f, 0.3136817514896392800f, + 0.2902846634387970000f, 0.2667127549648284900f, 0.2429801821708679200f, 0.2191012352705001800f, 0.1950903236865997300f, + 0.1709618866443634000f, 0.1467304676771163900f, 0.1224106773734092700f, 0.0980171412229537960f, 0.0735645666718482970f, + 0.0490676723420619960f, 0.0245412290096282960f, -0.00000000041020686847303978f, -0.0245412290096282960f, -0.0490676760673522950f, + -0.0735645666718482970f, -0.0980171412229537960f, -0.1224106773734092700f, -0.1467304676771163900f, -0.1709618866443634000f, + -0.1950903236865997300f, -0.2191012352705001800f, -0.2429801821708679200f, -0.2667127549648284900f, -0.2902846634387970000f, + -0.3136817514896392800f, -0.3368898630142211900f, -0.3598950505256652800f, -0.3826834261417388900f, -0.4052413105964660600f, + -0.4275550842285156300f, -0.4496113359928131100f, -0.4713967442512512200f, -0.4928981959819793700f, -0.5141027569770813000f, + -0.5349976420402526900f, -0.5555702447891235400f, -0.5758081674575805700f, -0.5956993103027343800f, -0.6152315735816955600f, + -0.6343932747840881300f, -0.6531728506088256800f, -0.6715589761734008800f, -0.6895405650138855000f, -0.7071067690849304200f +}; + +/*----------------------------------------------------------------------------------* + * Sinus & Cosinus - table for the FFT and IFFT of 1024 points, value range [0 ... sin(-5pi/4)] + * dimension of the table = 641=4*256*(5/8)+1 + *----------------------------------------------------------------------------------*/ + +/* every 4th value is identical to sincos_t above but as sincos_t is also used in SWB TBE a separate table has been defined here */ +const float sincos_t_ext[641] = +{ + 0.0f, + 0.006135884649154f, 0.012271538285720f, 0.018406729905805f, 0.024541228522912f, 0.030674803176637f, 0.036807222941359f, 0.042938256934941f, 0.049067674327418f, + 0.055195244349690f, 0.061320736302209f, 0.067443919563664f, 0.073564563599667f, 0.079682437971430f, 0.085797312344440f, 0.091908956497133f, 0.098017140329561f, + 0.104121633872055f, 0.110222207293883f, 0.116318630911905f, 0.122410675199216f, 0.128498110793793f, 0.134580708507126f, 0.140658239332849f, 0.146730474455362f, + 0.152797185258443f, 0.158858143333861f, 0.164913120489970f, 0.170961888760301f, 0.177004220412149f, 0.183039887955141f, 0.189068664149806f, 0.195090322016128f, + 0.201104634842092f, 0.207111376192219f, 0.213110319916091f, 0.219101240156870f, 0.225083911359793f, 0.231058108280671f, 0.237023605994367f, 0.242980179903264f, + 0.248927605745720f, 0.254865659604515f, 0.260794117915276f, 0.266712757474898f, 0.272621355449949f, 0.278519689385053f, 0.284407537211272f, 0.290284677254462f, + 0.296150888243624f, 0.302005949319228f, 0.307849640041535f, 0.313681740398892f, 0.319502030816016f, 0.325310292162263f, 0.331106305759876f, 0.336889853392220f, + 0.342660717311994f, 0.348418680249435f, 0.354163525420490f, 0.359895036534988f, 0.365612997804774f, 0.371317193951837f, 0.377007410216418f, 0.382683432365090f, + 0.388345046698826f, 0.393992040061048f, 0.399624199845647f, 0.405241314004990f, 0.410843171057904f, 0.416429560097637f, 0.422000270799800f, 0.427555093430282f, + 0.433093818853152f, 0.438616238538528f, 0.444122144570429f, 0.449611329654607f, 0.455083587126344f, 0.460538710958240f, 0.465976495767966f, 0.471396736825998f, + 0.476799230063322f, 0.482183772079123f, 0.487550160148436f, 0.492898192229784f, 0.498227666972782f, 0.503538383725718f, 0.508830142543107f, 0.514102744193222f, + 0.519355990165590f, 0.524589682678469f, 0.529803624686295f, 0.534997619887097f, 0.540171472729893f, 0.545324988422046f, 0.550457972936605f, 0.555570233019602f, + 0.560661576197336f, 0.565731810783613f, 0.570780745886967f, 0.575808191417845f, 0.580813958095765f, 0.585797857456439f, 0.590759701858874f, 0.595699304492433f, + 0.600616479383869f, 0.605511041404326f, 0.610382806276309f, 0.615231590580627f, 0.620057211763289f, 0.624859488142386f, 0.629638238914927f, 0.634393284163645f, + 0.639124444863776f, 0.643831542889791f, 0.648514401022112f, 0.653172842953777f, 0.657806693297079f, 0.662415777590172f, 0.666999922303637f, 0.671558954847018f, + 0.676092703575316f, 0.680600997795453f, 0.685083667772700f, 0.689540544737067f, 0.693971460889654f, 0.698376249408973f, 0.702754744457225f, 0.707106781186547f, + 0.711432195745216f, 0.715730825283819f, 0.720002507961382f, 0.724247082951467f, 0.728464390448225f, 0.732654271672413f, 0.736816568877370f, 0.740951125354959f, + 0.745057785441466f, 0.749136394523459f, 0.753186799043613f, 0.757208846506485f, 0.761202385484262f, 0.765167265622459f, 0.769103337645580f, 0.773010453362737f, + 0.776888465673232f, 0.780737228572094f, 0.784556597155575f, 0.788346427626606f, 0.792106577300212f, 0.795836904608884f, 0.799537269107905f, 0.803207531480645f, + 0.806847553543799f, 0.810457198252595f, 0.814036329705948f, 0.817584813151584f, 0.821102514991105f, 0.824589302785025f, 0.828045045257756f, 0.831469612302545f, + 0.834862874986380f, 0.838224705554838f, 0.841554977436898f, 0.844853565249707f, 0.848120344803297f, 0.851355193105265f, 0.854557988365401f, 0.857728610000272f, + 0.860866938637767f, 0.863972856121587f, 0.867046245515693f, 0.870086991108711f, 0.873094978418290f, 0.876070094195407f, 0.879012226428633f, 0.881921264348355f, + 0.884797098430938f, 0.887639620402854f, 0.890448723244758f, 0.893224301195515f, 0.895966249756185f, 0.898674465693954f, 0.901348847046022f, 0.903989293123443f, + 0.906595704514915f, 0.909167983090522f, 0.911706032005430f, 0.914209755703531f, 0.916679059921043f, 0.919113851690058f, 0.921514039342042f, 0.923879532511287f, + 0.926210242138311f, 0.928506080473216f, 0.930766961078984f, 0.932992798834739f, 0.935183509938948f, 0.937339011912575f, 0.939459223602190f, 0.941544065183021f, + 0.943593458161960f, 0.945607325380521f, 0.947585591017741f, 0.949528180593037f, 0.951435020969008f, 0.953306040354194f, 0.955141168305771f, 0.956940335732209f, + 0.958703474895872f, 0.960430519415566f, 0.962121404269042f, 0.963776065795440f, 0.965394441697689f, 0.966976471044852f, 0.968522094274417f, 0.970031253194544f, + 0.971503890986252f, 0.972939952205560f, 0.974339382785576f, 0.975702130038529f, 0.977028142657754f, 0.978317370719628f, 0.979569765685441f, 0.980785280403230f, + 0.981963869109555f, 0.983105487431216f, 0.984210092386929f, 0.985277642388941f, 0.986308097244599f, 0.987301418157858f, 0.988257567730749f, 0.989176509964781f, + 0.990058210262297f, 0.990902635427780f, 0.991709753669100f, 0.992479534598710f, 0.993211949234795f, 0.993906970002356f, 0.994564570734255f, 0.995184726672197f, + 0.995767414467660f, 0.996312612182778f, 0.996820299291166f, 0.997290456678690f, 0.997723066644192f, 0.998118112900149f, 0.998475580573295f, 0.998795456205172f, + 0.999077727752645f, 0.999322384588350f, 0.999529417501093f, 0.999698818696204f, 0.999830581795823f, 0.999924701839145f, 0.999981175282601f, 1.000000000000000f, + 0.999981175282601f, 0.999924701839145f, 0.999830581795823f, 0.999698818696204f, 0.999529417501093f, 0.999322384588350f, 0.999077727752645f, 0.998795456205172f, + 0.998475580573295f, 0.998118112900149f, 0.997723066644192f, 0.997290456678690f, 0.996820299291166f, 0.996312612182778f, 0.995767414467660f, 0.995184726672197f, + 0.994564570734255f, 0.993906970002356f, 0.993211949234795f, 0.992479534598710f, 0.991709753669100f, 0.990902635427780f, 0.990058210262297f, 0.989176509964781f, + 0.988257567730749f, 0.987301418157858f, 0.986308097244599f, 0.985277642388941f, 0.984210092386929f, 0.983105487431216f, 0.981963869109555f, 0.980785280403230f, + 0.979569765685441f, 0.978317370719628f, 0.977028142657754f, 0.975702130038529f, 0.974339382785576f, 0.972939952205560f, 0.971503890986252f, 0.970031253194544f, + 0.968522094274417f, 0.966976471044852f, 0.965394441697689f, 0.963776065795440f, 0.962121404269042f, 0.960430519415566f, 0.958703474895872f, 0.956940335732209f, + 0.955141168305771f, 0.953306040354194f, 0.951435020969008f, 0.949528180593037f, 0.947585591017741f, 0.945607325380521f, 0.943593458161960f, 0.941544065183021f, + 0.939459223602190f, 0.937339011912575f, 0.935183509938948f, 0.932992798834739f, 0.930766961078984f, 0.928506080473216f, 0.926210242138311f, 0.923879532511287f, + 0.921514039342042f, 0.919113851690058f, 0.916679059921043f, 0.914209755703531f, 0.911706032005430f, 0.909167983090522f, 0.906595704514915f, 0.903989293123443f, + 0.901348847046022f, 0.898674465693954f, 0.895966249756185f, 0.893224301195515f, 0.890448723244758f, 0.887639620402854f, 0.884797098430938f, 0.881921264348355f, + 0.879012226428634f, 0.876070094195407f, 0.873094978418290f, 0.870086991108711f, 0.867046245515693f, 0.863972856121587f, 0.860866938637767f, 0.857728610000272f, + 0.854557988365401f, 0.851355193105265f, 0.848120344803297f, 0.844853565249707f, 0.841554977436898f, 0.838224705554838f, 0.834862874986380f, 0.831469612302545f, + 0.828045045257756f, 0.824589302785025f, 0.821102514991105f, 0.817584813151584f, 0.814036329705949f, 0.810457198252595f, 0.806847553543799f, 0.803207531480645f, + 0.799537269107905f, 0.795836904608884f, 0.792106577300212f, 0.788346427626606f, 0.784556597155575f, 0.780737228572095f, 0.776888465673232f, 0.773010453362737f, + 0.769103337645580f, 0.765167265622459f, 0.761202385484262f, 0.757208846506485f, 0.753186799043613f, 0.749136394523459f, 0.745057785441466f, 0.740951125354959f, + 0.736816568877370f, 0.732654271672413f, 0.728464390448225f, 0.724247082951467f, 0.720002507961382f, 0.715730825283819f, 0.711432195745217f, 0.707106781186548f, + 0.702754744457225f, 0.698376249408973f, 0.693971460889654f, 0.689540544737067f, 0.685083667772700f, 0.680600997795453f, 0.676092703575316f, 0.671558954847019f, + 0.666999922303638f, 0.662415777590172f, 0.657806693297079f, 0.653172842953777f, 0.648514401022113f, 0.643831542889791f, 0.639124444863776f, 0.634393284163645f, + 0.629638238914927f, 0.624859488142386f, 0.620057211763289f, 0.615231590580627f, 0.610382806276310f, 0.605511041404326f, 0.600616479383869f, 0.595699304492433f, + 0.590759701858874f, 0.585797857456439f, 0.580813958095765f, 0.575808191417845f, 0.570780745886967f, 0.565731810783613f, 0.560661576197336f, 0.555570233019602f, + 0.550457972936605f, 0.545324988422046f, 0.540171472729893f, 0.534997619887097f, 0.529803624686295f, 0.524589682678469f, 0.519355990165590f, 0.514102744193222f, + 0.508830142543107f, 0.503538383725718f, 0.498227666972782f, 0.492898192229784f, 0.487550160148436f, 0.482183772079123f, 0.476799230063322f, 0.471396736825998f, + 0.465976495767966f, 0.460538710958240f, 0.455083587126344f, 0.449611329654607f, 0.444122144570429f, 0.438616238538528f, 0.433093818853152f, 0.427555093430282f, + 0.422000270799800f, 0.416429560097637f, 0.410843171057904f, 0.405241314004990f, 0.399624199845647f, 0.393992040061048f, 0.388345046698827f, 0.382683432365090f, + 0.377007410216418f, 0.371317193951838f, 0.365612997804774f, 0.359895036534988f, 0.354163525420490f, 0.348418680249435f, 0.342660717311994f, 0.336889853392220f, + 0.331106305759876f, 0.325310292162263f, 0.319502030816016f, 0.313681740398891f, 0.307849640041535f, 0.302005949319228f, 0.296150888243624f, 0.290284677254462f, + 0.284407537211272f, 0.278519689385053f, 0.272621355449949f, 0.266712757474898f, 0.260794117915276f, 0.254865659604515f, 0.248927605745720f, 0.242980179903264f, + 0.237023605994367f, 0.231058108280671f, 0.225083911359793f, 0.219101240156870f, 0.213110319916091f, 0.207111376192219f, 0.201104634842092f, 0.195090322016129f, + 0.189068664149806f, 0.183039887955141f, 0.177004220412149f, 0.170961888760301f, 0.164913120489970f, 0.158858143333861f, 0.152797185258444f, 0.146730474455362f, + 0.140658239332850f, 0.134580708507126f, 0.128498110793793f, 0.122410675199216f, 0.116318630911905f, 0.110222207293883f, 0.104121633872055f, 0.098017140329561f, + 0.091908956497133f, 0.085797312344440f, 0.079682437971430f, 0.073564563599668f, 0.067443919563664f, 0.061320736302208f, 0.055195244349690f, 0.049067674327418f, + 0.042938256934941f, 0.036807222941359f, 0.030674803176637f, 0.024541228522912f, 0.018406729905805f, 0.012271538285720f, 0.006135884649155f, 0.000000000000000f, + -0.006135884649155f, -0.012271538285720f, -0.018406729905805f, -0.024541228522912f, -0.030674803176637f, -0.036807222941359f, -0.042938256934941f, -0.049067674327418f, + -0.055195244349690f, -0.061320736302208f, -0.067443919563664f, -0.073564563599667f, -0.079682437971430f, -0.085797312344440f, -0.091908956497133f, -0.098017140329561f, + -0.104121633872054f, -0.110222207293883f, -0.116318630911904f, -0.122410675199216f, -0.128498110793793f, -0.134580708507126f, -0.140658239332849f, -0.146730474455362f, + -0.152797185258443f, -0.158858143333861f, -0.164913120489970f, -0.170961888760301f, -0.177004220412149f, -0.183039887955141f, -0.189068664149806f, -0.195090322016128f, + -0.201104634842092f, -0.207111376192219f, -0.213110319916091f, -0.219101240156870f, -0.225083911359793f, -0.231058108280671f, -0.237023605994367f, -0.242980179903264f, + -0.248927605745720f, -0.254865659604514f, -0.260794117915276f, -0.266712757474898f, -0.272621355449949f, -0.278519689385053f, -0.284407537211272f, -0.290284677254462f, + -0.296150888243624f, -0.302005949319228f, -0.307849640041535f, -0.313681740398891f, -0.319502030816016f, -0.325310292162263f, -0.331106305759876f, -0.336889853392220f, + -0.342660717311994f, -0.348418680249435f, -0.354163525420490f, -0.359895036534988f, -0.365612997804774f, -0.371317193951837f, -0.377007410216418f, -0.382683432365090f, + -0.388345046698826f, -0.393992040061048f, -0.399624199845647f, -0.405241314004990f, -0.410843171057904f, -0.416429560097637f, -0.422000270799800f, -0.427555093430282f, + -0.433093818853152f, -0.438616238538527f, -0.444122144570429f, -0.449611329654607f, -0.455083587126344f, -0.460538710958240f, -0.465976495767966f, -0.471396736825998f, + -0.476799230063322f, -0.482183772079123f, -0.487550160148436f, -0.492898192229784f, -0.498227666972782f, -0.503538383725717f, -0.508830142543107f, -0.514102744193222f, + -0.519355990165590f, -0.524589682678469f, -0.529803624686295f, -0.534997619887097f, -0.540171472729893f, -0.545324988422046f, -0.550457972936605f, -0.555570233019602f, + -0.560661576197336f, -0.565731810783613f, -0.570780745886967f, -0.575808191417845f, -0.580813958095764f, -0.585797857456439f, -0.590759701858874f, -0.595699304492433f, + -0.600616479383869f, -0.605511041404325f, -0.610382806276309f, -0.615231590580627f, -0.620057211763289f, -0.624859488142386f, -0.629638238914927f, -0.634393284163645f, + -0.639124444863776f, -0.643831542889791f, -0.648514401022112f, -0.653172842953777f, -0.657806693297079f, -0.662415777590172f, -0.666999922303637f, -0.671558954847018f, + -0.676092703575316f, -0.680600997795453f, -0.685083667772700f, -0.689540544737067f, -0.693971460889654f, -0.698376249408973f, -0.702754744457225f, -0.707106781186547f +}; + + +const float Asr_LP32[41] = +{ + 0.00000000f, 0.00074311f, 0.00168152f, 0.00177319f, -0.00000000f, -0.00345938f, -0.00653664f, -0.00604727f, + 0.00000000f, 0.00988729f, 0.01759782f, 0.01556464f, -0.00000000f, -0.02426962f, -0.04321351f, -0.03907450f, + 0.00000000f, 0.07133152f, 0.15563209f, 0.22382514f, 0.25000000f, 0.22382514f, 0.15563209f, 0.07133152f, + 0.00000000f, -0.03907450f, -0.04321351f, -0.02426962f, -0.00000000f, 0.01556464f, 0.01759782f, 0.00988729f, + 0.00000000f, -0.00604727f, -0.00653664f, -0.00345938f, -0.00000000f, 0.00177319f, 0.00168152f, 0.00074311f, + 0.00000000f +}; + + +const float Asr_LP16[21] = +{ + 0.00000000f, 0.00336304f, -0.00000000f, -0.01307328f, 0.00000000f, 0.03519564f, -0.00000000f, -0.08642702f, + 0.00000000f, 0.31126418f, 0.50000000f, 0.31126418f, 0.00000000f, -0.08642702f, -0.00000000f, 0.03519564f, + 0.00000000f, -0.01307328f, -0.00000000f, 0.00336304f, 0.00000000f +}; + + +const float Asr_LP48[61] = +{ + 0.00000000f, 0.00029287f, 0.00071673f, 0.00112101f, 0.00127506f, 0.00094416f, -0.00000000f, -0.00147233f, + -0.00311928f, -0.00435776f, -0.00452368f, -0.00310585f, 0.00000000f, 0.00430863f, 0.00872382f, 0.01173188f, + 0.01180048f, 0.00789952f, -0.00000000f, -0.01061594f, -0.02137287f, -0.02880901f, -0.02932326f, -0.02010347f, + 0.00000000f, 0.02990484f, 0.06622310f, 0.10375473f, 0.13646949f, 0.15876038f, 0.16666667f, 0.15876038f, + 0.13646949f, 0.10375473f, 0.06622310f, 0.02990484f, 0.00000000f, -0.02010347f, -0.02932326f, -0.02880901f, + -0.02137287f, -0.01061594f, -0.00000000f, 0.00789952f, 0.01180048f, 0.01173188f, 0.00872382f, 0.00430863f, + 0.00000000f, -0.00310585f, -0.00452368f, -0.00435776f, -0.00311928f, -0.00147233f, -0.00000000f, 0.00094416f, + 0.00127506f, 0.00112101f, 0.00071673f, 0.00029287f, 0.00000000f +}; + +const int16_t fft256_read_indexes[]= +{ + 0, 128, 64, 192, 32, 160, 96, 224, 16, 144, 80, 208, 48, 176, 112, 240, + 8, 136, 72, 200, 40, 168, 104, 232, 24, 152, 88, 216, 56, 184, 120, 248, + 4, 132, 68, 196, 36, 164, 100, 228, 20, 148, 84, 212, 52, 180, 116, 244, + 12, 140, 76, 204, 44, 172, 108, 236, 28, 156, 92, 220, 60, 188, 124, 252, + 2, 130, 66, 194, 34, 162, 98, 226, 18, 146, 82, 210, 50, 178, 114, 242, + 10, 138, 74, 202, 42, 170, 106, 234, 26, 154, 90, 218, 58, 186, 122, 250, + 6, 134, 70, 198, 38, 166, 102, 230, 22, 150, 86, 214, 54, 182, 118, 246, + 14, 142, 78, 206, 46, 174, 110, 238, 30, 158, 94, 222, 62, 190, 126, 254, + 1, 129, 65, 193, 33, 161, 97, 225, 17, 145, 81, 209, 49, 177, 113, 241, + 9, 137, 73, 201, 41, 169, 105, 233, 25, 153, 89, 217, 57, 185, 121, 249, + 5, 133, 69, 197, 37, 165, 101, 229, 21, 149, 85, 213, 53, 181, 117, 245, + 13, 141, 77, 205, 45, 173, 109, 237, 29, 157, 93, 221, 61, 189, 125, 253, + 3, 131, 67, 195, 35, 163, 99, 227, 19, 147, 83, 211, 51, 179, 115, 243, + 11, 139, 75, 203, 43, 171, 107, 235, 27, 155, 91, 219, 59, 187, 123, 251, + 7, 135, 71, 199, 39, 167, 103, 231, 23, 151, 87, 215, 55, 183, 119, 247, + 15, 143, 79, 207, 47, 175, 111, 239, 31, 159, 95, 223, 63, 191, 127, 255 +}; + + +/*----------------------------------------------------------------------------------* + * Sinus & Cosinus - table for the DCT-IV based 2 + *----------------------------------------------------------------------------------*/ + +const float sin_table256[] = +{ + 0.003067957f, 0.009203755f, 0.015339206f, 0.02147408f, 0.027608146f, 0.033741172f, 0.039872928f, 0.046003182f, 0.052131705f, + 0.058258265f, 0.064382631f, 0.070504573f, 0.076623861f, 0.082740265f, 0.088853553f, 0.094963495f, 0.101069863f, 0.107172425f, + 0.113270952f, 0.119365215f, 0.125454983f, 0.131540029f, 0.137620122f, 0.143695033f, 0.149764535f, 0.155828398f, 0.161886394f, + 0.167938295f, 0.173983873f, 0.180022901f, 0.186055152f, 0.192080397f, 0.198098411f, 0.204108966f, 0.210111837f, 0.216106797f, + 0.222093621f, 0.228072083f, 0.234041959f, 0.240003022f, 0.24595505f, 0.251897818f, 0.257831102f, 0.263754679f, 0.269668326f, + 0.275571819f, 0.281464938f, 0.28734746f, 0.293219163f, 0.299079826f, 0.30492923f, 0.310767153f, 0.316593376f, 0.322407679f, + 0.328209844f, 0.333999651f, 0.339776884f, 0.345541325f, 0.351292756f, 0.357030961f, 0.362755724f, 0.36846683f, 0.374164063f, + 0.379847209f, 0.385516054f, 0.391170384f, 0.396809987f, 0.402434651f, 0.408044163f, 0.413638312f, 0.419216888f, 0.424779681f, + 0.430326481f, 0.43585708f, 0.441371269f, 0.44686884f, 0.452349587f, 0.457813304f, 0.463259784f, 0.468688822f, 0.474100215f, + 0.479493758f, 0.484869248f, 0.490226483f, 0.495565262f, 0.500885383f, 0.506186645f, 0.51146885f, 0.516731799f, 0.521975293f, + 0.527199135f, 0.532403128f, 0.537587076f, 0.542750785f, 0.547894059f, 0.553016706f, 0.558118531f, 0.563199344f, 0.568258953f, + 0.573297167f, 0.578313796f, 0.583308653f, 0.588281548f, 0.593232295f, 0.598160707f, 0.603066599f, 0.607949785f, 0.612810082f, + 0.617647308f, 0.622461279f, 0.627251815f, 0.632018736f, 0.636761861f, 0.641481013f, 0.646176013f, 0.650846685f, 0.655492853f, + 0.660114342f, 0.664710978f, 0.669282588f, 0.673829f, 0.678350043f, 0.682845546f, 0.687315341f, 0.691759258f, 0.696177131f, + 0.700568794f, 0.70493408f, 0.709272826f, 0.713584869f, 0.717870045f, 0.722128194f, 0.726359155f, 0.730562769f, 0.734738878f, + 0.738887324f, 0.743007952f, 0.747100606f, 0.751165132f, 0.755201377f, 0.759209189f, 0.763188417f, 0.767138912f, 0.771060524f, + 0.774953107f, 0.778816512f, 0.782650596f, 0.786455214f, 0.790230221f, 0.793975478f, 0.797690841f, 0.801376172f, 0.805031331f, + 0.808656182f, 0.812250587f, 0.815814411f, 0.81934752f, 0.822849781f, 0.826321063f, 0.829761234f, 0.833170165f, 0.836547727f, + 0.839893794f, 0.84320824f, 0.846490939f, 0.849741768f, 0.852960605f, 0.856147328f, 0.859301818f, 0.862423956f, 0.865513624f, + 0.868570706f, 0.871595087f, 0.874586652f, 0.87754529f, 0.880470889f, 0.883363339f, 0.88622253f, 0.889048356f, 0.891840709f, + 0.894599486f, 0.897324581f, 0.900015892f, 0.902673318f, 0.905296759f, 0.907886116f, 0.910441292f, 0.91296219f, 0.915448716f, + 0.917900776f, 0.920318277f, 0.922701128f, 0.925049241f, 0.927362526f, 0.929640896f, 0.931884266f, 0.93409255f, 0.936265667f, + 0.938403534f, 0.940506071f, 0.942573198f, 0.944604837f, 0.946600913f, 0.94856135f, 0.950486074f, 0.952375013f, 0.954228095f, + 0.956045251f, 0.957826413f, 0.959571513f, 0.961280486f, 0.962953267f, 0.964589793f, 0.966190003f, 0.967753837f, 0.969281235f, + 0.970772141f, 0.972226497f, 0.97364425f, 0.975025345f, 0.976369731f, 0.977677358f, 0.978948175f, 0.980182136f, 0.981379193f, + 0.982539302f, 0.983662419f, 0.984748502f, 0.985797509f, 0.986809402f, 0.987784142f, 0.988721692f, 0.989622017f, 0.990485084f, + 0.99131086f, 0.992099313f, 0.992850414f, 0.993564136f, 0.994240449f, 0.994879331f, 0.995480755f, 0.996044701f, 0.996571146f, + 0.99706007f, 0.997511456f, 0.997925286f, 0.998301545f, 0.998640218f, 0.998941293f, 0.999204759f, 0.999430605f, 0.999618822f, + 0.999769405f, 0.999882347f, 0.999957645f, 0.999995294f +}; + + +/*----------------------------------------------------------------------------------* + * 1/4 resolution interpolation filter (-3 dB at 0.913*fs/2) + *----------------------------------------------------------------------------------*/ + +const float inter4_2[65] = +{ + 0.940000f, + 0.856390f, 0.632268f, 0.337560f, 0.059072f, + -0.131059f, -0.199393f, -0.158569f, -0.056359f, + 0.047606f, 0.106749f, 0.103705f, 0.052062f, + -0.015182f, -0.063705f, -0.073660f, -0.046497f, + -0.000983f, 0.038227f, 0.053143f, 0.040059f, + 0.009308f, -0.021674f, -0.037767f, -0.033186f, + -0.013028f, 0.010702f, 0.025901f, 0.026318f, + 0.013821f, -0.003645f, -0.016813f, -0.019855f, + -0.012766f, -0.000530f, 0.010080f, 0.014122f, + 0.010657f, 0.002594f, -0.005363f, -0.009344f, + -0.008101f, -0.003182f, 0.002330f, 0.005635f, + 0.005562f, 0.002844f, -0.000627f, -0.002993f, + -0.003362f, -0.002044f, -0.000116f, 0.001315f, + 0.001692f, 0.001151f, 0.000259f, -0.000417f, + -0.000618f, -0.000434f, -0.000133f, 0.000063f, + 0.000098f, 0.000048f, 0.000007f, 0.000000f +}; + + +/*----------------------------------------------------------------------------------* + * 1/6 resolution interpolation filter (-3 dB at 0.95*fs/2) + *----------------------------------------------------------------------------------*/ + +const float inter6_2[PIT_FIR_SIZE6_2] = +{ + 0.949986374119862F, 0.911081104469830F, 0.800115099292852F, 0.633320673120883F, 0.434558462154083F, 0.231177017786780F, + 0.049378173063717F, -0.090039611811170F, -0.174782560924477F, -0.202477516286360F, -0.180218293244902F, -0.122429229978978F, + -0.047552067127379F, 0.025733669494145F, 0.081995376731897F, 0.111581381838187F, 0.111781798292302F, 0.086499988914996F, + 0.044629684447068F, -0.002416435594242F, -0.043440027386915F, -0.069857782812169F, -0.077293683967992F, -0.066098268486336F, + -0.040782649068098F, -0.008590773415008F, 0.022397654632128F, 0.045171360007974F, 0.055274128677739F, 0.051578034020076F, + 0.036232016917169F, 0.013869500422767F, -0.009680698856947F, -0.028843394410080F, -0.039560663181280F, -0.040095747151623F, + -0.031231107680685F, -0.015866154815425F, 0.001841532922707F, 0.017553701334759F, 0.027778555138199F, 0.030612329573745F, + 0.026046143652186F, 0.015803012695681F, 0.002782973481834F, -0.009720124055079F, -0.018826488463900F, -0.022710487805852F, + -0.020936374578238F, -0.014436620433404F, -0.005169079181373F, 0.004437651243491F, 0.012100372954920F, 0.016207075406240F, + 0.016135389123271F, 0.012306629559665F, 0.005986734945567F, -0.001094950878591F, -0.007200842219958F, -0.010998212848124F, + -0.011835179448280F, -0.009826566540474F, -0.005747665080695F, -0.000780600030751F, 0.003810613287985F, 0.006990479233404F, + 0.008174249796791F, 0.007317375965949F, 0.004864690818765F, 0.001587005259212F, -0.001642504305841F, -0.004070609517416F, + -0.005230670504649F, -0.005019147682711F, -0.003673879223241F, -0.001671460853812F, 0.000420750005150F, 0.002095384947391F, + 0.003020513665060F, 0.003095468528243F, 0.002441025550729F, 0.001335514431569F, 0.000120805384516F, -0.000893340757369F, + -0.001501610712267F, -0.001636887611783F, -0.001362571776250F, -0.000832126175863F, -0.000232033375863F, 0.000273627139471F, + 0.000582092683087F, 0.000666445711949F, 0.000566088888178F, 0.000360374058147F, 0.000136306914913F, -0.000038864994777F, + -0.000132755824518F, -0.000148377158880F, -0.000112937171810F, -0.000061132514471F, -0.000019974224468F, -0.000000460344975F, + 0.000001976848453F +}; + + +/*----------------------------------------------------------------------------------* + * Low-pass FIR filter for low-frequency post-filtering @ 16kHz + * response : -6dB @ 50Hz, -3dB @ 500Hz, -6dB @ 6.4kHz) + * L_FILT=15 @ 16kHz (1+4x15=61 coef) + * L_FILT=12 @ 12.8kHz (1+5x12=61 coef) + * filter parameters: fs/2=32000, fc=6400, gain=5.0, n=61 + *----------------------------------------------------------------------------------*/ + +static const float filter_LP12_180H[] = /* Sincfilt.m: N=180*2+1, Fmin=0, Fmax=1/12, hann( N )' */ +{ + 1.00000000f, 0.98854064f, 0.95463880f, 0.89969939f, 0.82598609f, 0.73650898f, + 0.63487604f, 0.52511631f, 0.41148461f, 0.29825804f, 0.18953518f, 0.08904855f, + 0.00000000f, -0.07507283f, -0.13439242f, -0.17699551f, -0.20274380f, -0.21229157f, + -0.20701353f, -0.18889782f, -0.16041129f, -0.12434529f, -0.08365114f, -0.04127482f, + -0.00000000f, 0.03769212f, 0.06973903f, 0.09458356f, 0.11122751f, 0.11925054f, + 0.11879487f, 0.11051837f, 0.09552022f, 0.07524478f, 0.05137065f, 0.02569204f, + 0.00000000f, -0.02402919f, -0.04493222f, -0.06153821f, -0.07302535f, -0.07895262f, + -0.07926575f, -0.07427839f, -0.06463103f, -0.05123120f, -0.03517999f, -0.01768990f, + -0.00000000f, 0.01670619f, 0.03137493f, 0.04314423f, 0.05139005f, 0.05575472f, + 0.05615642f, 0.05278011f, 0.04605151f, 0.03659641f, 0.02518906f, 0.01269314f, + 0.00000000f, -0.01203202f, -0.02263294f, -0.03116789f, -0.03717261f, -0.04037571f, + -0.04070711f, -0.03829248f, -0.03343501f, -0.02658610f, -0.01830764f, -0.00922872f, + -0.00000000f, 0.00875109f, 0.01646140f, 0.02266671f, 0.02702792f, 0.02934764f, + 0.02957617f, 0.02780739f, 0.02426498f, 0.01928068f, 0.01326622f, 0.00668131f, + 0.00000000f, -0.00632223f, -0.01187840f, -0.01633509f, -0.01945125f, -0.02108964f, + -0.02122066f, -0.01991853f, -0.01735069f, -0.01376125f, -0.00945018f, -0.00474975f, + -0.00000000f, 0.00447492f, 0.00838805f, 0.01150721f, 0.01366775f, 0.01478001f, + 0.01483115f, 0.01388152f, 0.01205626f, 0.00953282f, 0.00652562f, 0.00326903f, + 0.00000000f, -0.00305850f, -0.00571204f, -0.00780638f, -0.00923565f, -0.00994662f, + -0.00993903f, -0.00926212f, -0.00800799f, -0.00630232f, -0.00429337f, -0.00214002f, + -0.00000000f, 0.00198116f, 0.00367946f, 0.00499962f, 0.00587975f, 0.00629327f, + 0.00624819f, 0.00578397f, 0.00496633f, 0.00388057f, 0.00262394f, 0.00129781f, + 0.00000000f, -0.00118189f, -0.00217597f, -0.00292996f, -0.00341330f, -0.00361747f, + -0.00355476f, -0.00325545f, -0.00276400f, -0.00213446f, -0.00142560f, -0.00069606f, + -0.00000000f, 0.00061651f, 0.00111820f, 0.00148212f, 0.00169815f, 0.00176842f, + 0.00170582f, 0.00153178f, 0.00127370f, 0.00096205f, 0.00062756f, 0.00029879f, + -0.00000000f, -0.00025029f, -0.00044009f, -0.00056414f, -0.00062342f, -0.00062426f, + -0.00057701f, -0.00049453f, -0.00039069f, -0.00027889f, -0.00017088f, -0.00007586f, + -0.00000000f, 0.00005374f, 0.00008534f, 0.00009723f, 0.00009358f, 0.00007948f, + 0.00006013f, 0.00004011f, 0.00002289f, 0.00001046f, 0.00000327f, 0.00000042f, + 0.00000000f +}; + +static const float filter_LP15_180H[] = /* Sincfilt.m: N=180*2+1, Fmin=0, Fmax=1/15, hann( N )' */ +{ + 1.00000000f, 0.99262960f, 0.97071645f, 0.93484826f, 0.88598337f, + 0.82541986f, 0.75475374f, 0.67582786f, 0.59067328f, 0.50144522f, + 0.41035570f, 0.31960540f, 0.23131699f, 0.14747211f, 0.06985439f, + 0.00000000f, -0.06084233f, -0.11174093f, -0.15209937f, -0.18166306f, + -0.20051411f, -0.20905505f, -0.20798222f, -0.19825005f, -0.18102779f, + -0.15765038f, -0.12956550f, -0.09827869f, -0.06529875f, -0.03208525f, + -0.00000000f, 0.02973580f, 0.05607741f, 0.07818439f, 0.09543959f, + 0.10745905f, 0.11409270f, 0.11541631f, 0.11171520f, 0.10346089f, + 0.09128169f, 0.07592875f, 0.05823905f, 0.03909687f, 0.01939543f, + 0.00000000f, -0.01828583f, -0.03474981f, -0.04879543f, -0.05996041f, + -0.06792872f, -0.07253607f, -0.07376881f, -0.07175666f, -0.06675991f, + -0.05915169f, -0.04939656f, -0.03802614f, -0.02561328f, -0.01274565f, + -0.00000000f, 0.01208179f, 0.02301411f, 0.03238554f, 0.03987272f, + 0.04524984f, 0.04839345f, 0.04928266f, 0.04799492f, 0.04469779f, + 0.03963720f, 0.03312292f, 0.02551190f, 0.01719053f, 0.00855630f, + 0.00000000f, -0.00811094f, -0.01544730f, -0.02173055f, -0.02674237f, + -0.03033123f, -0.03241557f, -0.03298387f, -0.03209149f, -0.02985488f, + -0.02644325f, -0.02206842f, -0.01697326f, -0.01141932f, -0.00567433f, + -0.00000000f, 0.00535923f, 0.01018613f, 0.01429886f, 0.01755714f, + 0.01986621f, 0.02117865f, 0.02149380f, 0.02085525f, 0.01934645f, + 0.01708469f, 0.01421394f, 0.01089691f, 0.00730662f, 0.00361802f, + 0.00000000f, -0.00339188f, -0.00642164f, -0.00897788f, -0.01097732f, + -0.01236693f, -0.01312444f, -0.01325748f, -0.01280137f, -0.01181573f, + -0.01038024f, -0.00858967f, -0.00654854f, -0.00436567f, -0.00214887f, + -0.00000000f, 0.00198936f, 0.00374143f, 0.00519494f, 0.00630684f, + 0.00705299f, 0.00742798f, 0.00744401f, 0.00712902f, 0.00652419f, + 0.00568101f, 0.00465798f, 0.00351733f, 0.00232168f, 0.00113102f, + 0.00000000f, -0.00102431f, -0.00190408f, -0.00261180f, -0.00313077f, + -0.00345499f, -0.00358855f, -0.00354447f, -0.00334328f, -0.00301127f, + -0.00257862f, -0.00207746f, -0.00154002f, -0.00099694f, -0.00047581f, + -0.00000000f, 0.00041214f, 0.00074776f, 0.00099963f, 0.00116592f, + 0.00124972f, 0.00125829f, 0.00120217f, 0.00109420f, 0.00094845f, + 0.00077928f, 0.00060035f, 0.00042395f, 0.00026030f, 0.00011724f, + 0.00000000f, -0.00008882f, -0.00014902f, -0.00018252f, -0.00019287f, + -0.00018476f, -0.00016347f, -0.00013434f, -0.00010230f, -0.00007148f, + -0.00004496f, -0.00002456f, -0.00001086f, -0.00000332f, -0.00000042f, + -0.00000000f +}; + +static const float filter_LP24_90H[] = { + + 0.62500000f, 0.62302684f, 0.61713239f, 0.60739135f, 0.59392688f, + 0.57690853f, 0.55654955f, 0.53310336f, 0.50685949f, 0.47813890f, + 0.44728886f, 0.41467745f, 0.38068777f, 0.34571201f, 0.31014542f, + 0.27438036f, 0.23880054f, 0.20377540f, 0.16965495f, 0.13676502f, + 0.10540301f, 0.07583422f, 0.04828883f, 0.02295955f, 0.00000000f, + -0.02047625f, -0.03839588f, -0.05372532f, -0.06646962f, -0.07667063f, + -0.08440465f, -0.08977957f, -0.09293151f, -0.09402116f, -0.09322978f, + -0.09075508f, -0.08680689f, -0.08160288f, -0.07536433f, -0.06831205f, + -0.06066245f, -0.05262401f, -0.04439397f, -0.03615555f, -0.02807546f, + -0.02030199f, -0.01296350f, -0.00616748f, -0.00000000f, 0.00547430f, + 0.01021181f, 0.01418909f, 0.01740171f, 0.01986272f, 0.02160081f, + 0.02265833f, 0.02308912f, 0.02295617f, 0.02232938f, 0.02128318f, + 0.01989437f, 0.01823991f, 0.01639502f, 0.01443144f, 0.01241584f, + 0.01040857f, 0.00846270f, 0.00662323f, 0.00492667f, 0.00340087f, + 0.00206511f, 0.00093039f, 0.00000000f, -0.00072977f, -0.00126877f, + -0.00163197f, -0.00183843f, -0.00191018f, -0.00187107f, -0.00174574f, + -0.00155856f, -0.00133271f, -0.00108939f, -0.00084707f, -0.00062106f, + -0.00042304f, -0.00026095f, -0.00013888f, -0.00005723f, -0.00001296f, + -0.00000000f, -0.00000000f, -0.00000000f, -0.00000000f, -0.00000000f, + -0.00000000f, + -0.00000000f +}; + + +static const float filter_LP3_90H[] = /* Sincfilt.m: N=90*2+1, Fmin=0, Fmax=1/3, hann( N )' */ +{ + 1.00000000f, 0.82674145f, 0.41299304f, 0.00000000f, -0.20574231f, -0.16414228f, + -0.00000000f, 0.11638725f, 0.10137190f, 0.00000000f, -0.08020564f, -0.07244401f, + -0.00000000f, 0.06039577f, 0.05561375f, 0.00000000f, -0.04776011f, -0.04448829f, + -0.00000000f, 0.03891245f, 0.03651267f, 0.00000000f, -0.03231551f, -0.03046677f, + -0.00000000f, 0.02717149f, 0.02569502f, 0.00000000f, -0.02302575f, -0.02181436f, + -0.00000000f, 0.01960070f, 0.01858630f, 0.00000000f, -0.01671751f, -0.01585488f, + -0.00000000f, 0.01425599f, 0.01351396f, -0.00000000f, -0.01213249f, -0.01148889f, + -0.00000000f, 0.01028699f, 0.00972562f, 0.00000000f, -0.00867534f, -0.00818410f, + -0.00000000f, 0.00726427f, 0.00683387f, -0.00000000f, -0.00602813f, -0.00565135f, + -0.00000000f, 0.00494677f, 0.00461782f, 0.00000000f, -0.00400399f, -0.00371817f, + -0.00000000f, 0.00318651f, 0.00293988f, -0.00000000f, -0.00248317f, -0.00227240f, + -0.00000000f, 0.00188444f, 0.00170665f, 0.00000000f, -0.00138200f, -0.00123460f, + -0.00000000f, 0.00096839f, 0.00084908f, -0.00000000f, -0.00063685f, -0.00054348f, + 0.00000000f, 0.00038113f, 0.00031171f, 0.00000000f, -0.00019534f, -0.00014798f, + -0.00000000f, 0.00007391f, 0.00004679f, -0.00000000f, -0.00001145f, -0.00000283f, + -0.00000000f +}; + +static const float filter_LP15_360H[] = /* Sincfilt.m: N=360*2+1, Fmin=0, Fmax=1/15, hann( N )' */ +{ + 1.00000000f, 0.99268640f, 0.97093867f, 0.93532989f, 0.88679510f, 0.82660196f, 0.75631099f, 0.67772690f, + 0.59284259f, 0.50377777f, 0.41271428f, 0.32183024f, 0.23323527f, 0.14890901f, 0.07064471f, 0.00000000f, + -0.06174384f, -0.11361280f, -0.15496039f, -0.18547676f, -0.20518652f, -0.21443575f, -0.21386869f, -0.20439528f, + -0.18715077f, -0.16344917f, -0.13473211f, -0.10251518f, -0.06833357f, -0.03368904f, -0.00000000f, 0.03144362f, + 0.05951924f, 0.08330302f, 0.10209294f, 0.11542293f, 0.12306791f, 0.12503981f, 0.12157498f, 0.11311391f, + 0.10027413f, 0.08381753f, 0.06461370f, 0.04360066f, 0.02174455f, 0.00000000f, -0.02072746f, -0.03961549f, + -0.05595444f, -0.06917113f, -0.07884629f, -0.08472521f, -0.08672137f, -0.08491313f, -0.07953401f, -0.07095693f, + -0.05967349f, -0.04626915f, -0.03139548f, -0.01574075f, -0.00000000f, 0.01515402f, 0.02909808f, 0.04128258f, + 0.05125197f, 0.05866038f, 0.06328236f, 0.06501815f, 0.06389360f, 0.06005485f, 0.05375815f, 0.04535547f, + 0.03527650f, 0.02400801f, 0.01207150f, 0.00000000f, -0.01168480f, -0.02249426f, -0.03199250f, -0.03981317f, + -0.04567293f, -0.04938087f, -0.05084386f, -0.05006752f, -0.04715306f, -0.04229010f, -0.03574599f, -0.02785210f, + -0.01898788f, -0.00956319f, -0.00000000f, 0.00928603f, 0.01790311f, 0.02549938f, 0.03177686f, 0.03650265f, + 0.03951708f, 0.04073850f, 0.04016462f, 0.03787037f, 0.03400261f, 0.02877179f, 0.02244121f, 0.01531429f, + 0.00772039f, 0.00000000f, -0.00751019f, -0.01449168f, -0.02065736f, -0.02576304f, -0.02961675f, -0.03208568f, + -0.03310029f, -0.03265561f, -0.03080978f, -0.02767986f, -0.02343523f, -0.01828891f, -0.01248723f, -0.00629832f, + -0.00000000f, 0.00613249f, 0.01183829f, 0.01688181f, 0.02106227f, 0.02422142f, 0.02624931f, 0.02708778f, + 0.02673160f, 0.02522739f, 0.02267018f, 0.01919813f, 0.01498536f, 0.01023356f, 0.00516248f, 0.00000000f, + -0.00502795f, -0.00970715f, -0.01384402f, -0.01727353f, -0.01986554f, -0.02152959f, -0.02221779f, -0.02192576f, + -0.02069173f, -0.01859376f, -0.01574532f, -0.01228947f, -0.00839187f, -0.00423301f, -0.00000000f, 0.00412174f, + 0.00795646f, 0.01134547f, 0.01415358f, 0.01627438f, 0.01763405f, 0.01819377f, 0.01795046f, 0.01693597f, + 0.01521482f, 0.01288044f, 0.01005046f, 0.00686086f, 0.00345963f, 0.00000000f, -0.00336638f, -0.00649597f, + -0.00925939f, -0.01154665f, -0.01327141f, -0.01437412f, -0.01482390f, -0.01461907f, -0.01378646f, -0.01237944f, + -0.01047492f, -0.00816931f, -0.00557380f, -0.00280912f, -0.00000000f, 0.00273035f, 0.00526559f, 0.00750113f, + 0.00934836f, 0.01073805f, 0.01162284f, 0.01197870f, 0.01180528f, 0.01112531f, 0.00998290f, 0.00844105f, + 0.00657831f, 0.00448494f, 0.00225863f, -0.00000000f, -0.00219185f, -0.00422367f, -0.00601190f, -0.00748609f, + -0.00859158f, -0.00929139f, -0.00956735f, -0.00942030f, -0.00886950f, -0.00795125f, -0.00671674f, -0.00522941f, + -0.00356175f, -0.00179189f, -0.00000000f, 0.00173531f, 0.00334034f, 0.00474942f, 0.00590751f, 0.00677226f, + 0.00731550f, 0.00752400f, 0.00739958f, 0.00695854f, 0.00623048f, 0.00525657f, 0.00408738f, 0.00278032f, + 0.00139692f, 0.00000000f, -0.00134916f, -0.00259345f, -0.00368229f, -0.00457361f, -0.00523547f, -0.00564706f, + -0.00579926f, -0.00569462f, -0.00534685f, -0.00477983f, -0.00402617f, -0.00312550f, -0.00212248f, -0.00106459f, + -0.00000000f, 0.00102461f, 0.00196604f, 0.00278637f, 0.00345440f, 0.00394682f, 0.00424892f, 0.00435488f, + 0.00426778f, 0.00399900f, 0.00356752f, 0.00299868f, 0.00232288f, 0.00157398f, 0.00078772f, -0.00000000f, + -0.00075466f, -0.00144465f, -0.00204251f, -0.00252601f, -0.00287889f, -0.00309135f, -0.00316023f, -0.00308882f, + -0.00288648f, -0.00256794f, -0.00215242f, -0.00166255f, -0.00112325f, -0.00056046f, -0.00000000f, 0.00053364f, + 0.00101829f, 0.00143502f, 0.00176882f, 0.00200907f, 0.00214985f, 0.00218995f, 0.00213269f, 0.00198558f, + 0.00175975f, 0.00146927f, 0.00113036f, 0.00076058f, 0.00037792f, 0.00000000f, -0.00035672f, -0.00067764f, + -0.00095057f, -0.00116614f, -0.00131812f, -0.00140347f, -0.00142235f, -0.00137791f, -0.00127596f, -0.00112458f, + -0.00093361f, -0.00071406f, -0.00047757f, -0.00023583f, -0.00000000f, 0.00021973f, 0.00041459f, 0.00057751f, + 0.00070338f, 0.00078915f, 0.00083382f, 0.00083835f, 0.00080551f, 0.00073960f, 0.00064615f, 0.00053157f, + 0.00040275f, 0.00026674f, 0.00013039f, -0.00000000f, -0.00011891f, -0.00022183f, -0.00030537f, -0.00036737f, + -0.00040691f, -0.00042423f, -0.00042061f, -0.00039828f, -0.00036014f, -0.00030964f, -0.00025049f, -0.00018648f, + -0.00012124f, -0.00005812f, -0.00000000f, 0.00005082f, 0.00009265f, 0.00012448f, 0.00014596f, 0.00015731f, + 0.00015929f, 0.00015311f, 0.00014024f, 0.00012237f, 0.00010126f, 0.00007860f, 0.00005596f, 0.00003466f, + 0.00001576f, 0.00000000f, -0.00001220f, -0.00002074f, -0.00002578f, -0.00002769f, -0.00002704f, -0.00002448f, + -0.00002068f, -0.00001629f, -0.00001190f, -0.00000794f, -0.00000472f, -0.00000238f, -0.00000092f, -0.00000021f, + -0.00000000f +}; + +static const float filter_LP30_300K[LFE_PLC_FDEL + 1] = /* 800/24000 LP filter, Kaiser(5)-windowed sinc */ +{ + 1.000674458058088f, 0.998821736068880f, 0.993276134431268f, 0.984075242985249f, + 0.971281368567695f, 0.954981023938107f, 0.935284218782909f, 0.912323559230714f, 0.886253164041403f, 0.857247407283176f, 0.825499498868107f, 0.791219915763123f, + 0.754634698015982f, 0.715983624922104f, 0.675518287696807f, 0.633500075899008f, 0.590198095568480f, 0.545887037583023f, 0.500845015109584f, 0.455351389211537f, + 0.409684601681821f, 0.364120033999184f, 0.318927910954646f, 0.274371266971919f, 0.230703992454581f, 0.188168976642057f, 0.146996362454873f, 0.107401927667902f, + 0.069585605480302f, 0.033730156165682f, 0.000000000000000f, -0.031459779907115f, -0.060524257893541f, -0.087089303849186f, -0.111072035585998f, -0.132411083666009f, + -0.151066668632262f, -0.167020492324437f, -0.180275446665744f, -0.190855144963741f, -0.198803282359248f, -0.204182833569538f, -0.207075097490179f, -0.207578599531267f, + -0.205807863756478f, -0.201892067956601f, -0.195973595714002f, -0.188206500292867f, -0.178754895816092f, -0.167791291658583f, -0.155494886295674f, -0.142049836993021f, + -0.127643521710976f, -0.112464809424174f, -0.096702354729368f, -0.080542932136516f, -0.064169824816426f, -0.047761281820773f, -0.031489056906366f, -0.015517041095534f, + -0.000000000000000f, 0.014917574260985f, 0.029102487992906f, 0.042433740493679f, 0.054803282432790f, 0.066116633644684f, 0.076293357387017f, 0.085267389568141f, + 0.092987222893292f, 0.099415947300653f, 0.104531149442952f, 0.108324675303768f, 0.110802261307711f, 0.111983040477936f, 0.111898931302253f, 0.110593917980261f, + 0.108123231629804f, 0.104552442823964f, 0.099956476503483f, 0.094418560858996f, 0.088029122199148f, 0.080884638112374f, 0.073086461390995f, 0.064739627216952f, + 0.055951656010794f, 0.046831364122825f, 0.037487694201930f, 0.028028576619426f, 0.018559832758953f, 0.009184130316920f, 0.000000000000000f, -0.008899077833673f, + -0.017425508954439f, -0.025498336799142f, -0.033043904125797f, -0.039996420202619f, -0.046298430034290f, -0.051901183227281f, -0.056764901197143f, -0.060858942512036f, + -0.064161867237223f, -0.066661402183665f, -0.068354309960014f, -0.069246165671283f, -0.069351045990393f, -0.068691136142401f, -0.067296261078182f, -0.065203347768427f, + -0.062455826114615f, -0.059102976446919f, -0.055199231956630f, -0.050803444690492f, -0.045978123915449f, -0.040788655744719f, -0.035302512901102f, -0.029588463383146f, + -0.023715786597517f, -0.017753505230727f, -0.011769640760391f, -0.005830500056152f, -0.000000000000000f, 0.005660963528005f, 0.011095096591703f, 0.016249233048055f, + 0.021074801008288f, 0.025528226370712f, 0.029571270660946f, 0.033171301203264f, 0.036301492437752f, 0.038940957983168f, 0.041074813816290f, 0.042694173686921f, + 0.043796078605817f, 0.044383362923333f, 0.044464460152907f, 0.044053152279452f, 0.043168266823078f, 0.041833326398573f, 0.040076155916957f, 0.037928452914153f, + 0.035425326761062f, 0.032604812707877f, 0.029507366842562f, 0.026175348099430f, 0.022652493439727f, 0.018983392243758f, 0.015212965806120f, 0.011385957615051f, + 0.007546439827815f, 0.003737341030740f, 0.000000000000000f, -0.003626250237053f, -0.007104464194597f, -0.010400428215978f, -0.013482964409160f, -0.016324191914051f, + -0.018899743729691f, -0.021188937879338f, -0.023174902241370f, -0.024844652917233f, -0.026189126538454f, -0.027203167427198f, -0.027885471013551f, -0.028238485372702f, + -0.028268273171834f, -0.027984336705841f, -0.027399409049342f, -0.026529214656951f, -0.025392203001958f, -0.024009259053660f, -0.022403394554390f, -0.020599424168218f, + -0.018623630634283f, -0.016503423069419f, -0.014266992528252f, -0.011942968845900f, -0.009560082661099f, -0.007146836348458f, -0.004731187380886f, -0.002340247400255f, + -0.000000000000000f, 0.002264960078453f, 0.004431663958549f, 0.006478979817575f, 0.008387796576525f, 0.010141178783251f, 0.011724491753953f, 0.013125496411291f, + 0.014334413626760f, 0.015343958236254f, 0.016149343246852f, 0.016748255086059f, 0.017140801058498f, 0.017329430466152f, 0.017318831113971f, 0.017115803160437f, + 0.016729112480503f, 0.016169325884595f, 0.015448630680760f, 0.014580641176914f, 0.013580194795931f, 0.012463140518288f, 0.011246122375360f, 0.009946360692277f, + 0.008581433723615f, 0.007169062239669f, 0.005726899507575f, 0.004272328972190f, 0.002822271778885f, 0.001393006096850f, 0.000000000000000f, -0.001342240554036f, + -0.002620307334837f, -0.003822007965487f, -0.004936465732805f, -0.005954200495861f, -0.006867190352439f, -0.007668913965032f, -0.008354373683625f, -0.008920099829252f, + -0.009364136717633f, -0.009686011203768f, -0.009886684714174f, -0.009968489901688f, -0.009935053206892f, -0.009791204738949f, -0.009542876996106f, -0.009196994031523f, + -0.008761352733137f, -0.008244497926834f, -0.007655593030480f, -0.007004287982775f, -0.006300586146230f, -0.005554711838727f, -0.004776980084286f, -0.003977670092272f, + -0.003166903876795f, -0.002354531316336f, -0.001550022829358f, -0.000762370706914f, -0.000000000000000f, 0.000729310290334f, 0.001418495126151f, 0.002061260011482f, + 0.002652125955862f, 0.003186462696409f, 0.003660510203508f, 0.004071388640949f, 0.004417097090039f, 0.004696501477237f, 0.004909312264891f, 0.005056052573469f, + 0.005138017500263f, 0.005157225483069f, 0.005116362627157f, 0.005018720969532f, 0.004868131695749f, 0.004668894351409f, 0.004425703102949f, 0.004143571100898f, + 0.003827753983767f, 0.003483673532892f, 0.003116842448631f, 0.002732791167251f, 0.002336997576645f, 0.001934820418900f, 0.001531437089816f, 0.001131786461136f, + 0.000740517261749f, 0.000361942460803f, 0.000000000000000f, -0.000341779874521f, -0.000660300526856f, -0.000952918033795f, -0.001217453508689f, -0.001452198768859f, + -0.001655915552350f, -0.001827828567631f, -0.001967612730984f, -0.002075375010094f, -0.002151631348089f, -0.002197279189590f, -0.002213566168842f, -0.002202055549447f, + -0.002164589025628f, -0.002103247506293f, -0.002020310505568f, -0.001918214757337f, -0.001799512656910f, -0.001666831110806f, -0.001522831346357f, -0.001370170197022f, + -0.001211463337747f, -0.001049250898094f, -0.000885965830111f, -0.000723905353825f, -0.000565205746663f, -0.000411820684990f, -0.000265503287080f, -0.000127791948110f, + -0.000000000000000f +}; + +const Resampling_cfg resampling_cfg_tbl[] = +{ + /* fin fout up.fact. filter coefs. filter length/2 */ + { 8000, 12800, 8, filter5_39s320_120, 15, RS_INV_FAC }, + { 12800, 8000, 5, filter5_39s320_120, L_FILT_UP8k, RS_INV_FAC }, + { 16000, 8000, 6, filter_LP12_180H, 180/6, 0 }, + { 12800, 16000, 15, filter_LP15_180H, L_FILT_UP16k, 0 }, + { 12800, 32000, 15, filter_LP15_180H, L_FILT_UP32k, 0 }, + { 12800, 48000, 15, filter_LP15_180H, L_FILT_UP48k, 0 }, + + { 16000, 12800, 12, filter_LP15_180H, L_FILT16k, 0 }, + { 16000, 32000, 12, filter_LP12_180H, L_FILT16k, 0 }, + { 16000, 48000, 12, filter_LP12_180H, L_FILT16k, 0 }, + + { 32000, 12800, 6, filter_LP15_180H, L_FILT32k, 0 }, + { 32000, 16000, 6, filter_LP12_180H, L_FILT32k, 0 }, + { 32000, 25600, 12, filter_LP15_360H, L_FILT32k, 0 }, + { 32000, 48000, 3, filter_LP3_90H, L_FILT32k, 0 }, + + { 48000, 12800, 4, filter_LP15_180H, L_FILT48k, 0 }, + { 48000, 16000, 4, filter_LP12_180H, L_FILT48k, 0 }, + { 48000, 25600, 8, filter_LP15_360H, L_FILT48k, 0 }, + { 48000, 32000, 2, filter_LP3_90H, L_FILT48k, 0 }, + + /* configs with NB 4kHz low-pass */ + { 16000, 12800, 12, filter_LP24_90H, L_FILT16k, 0 }, + { 32000, 12800, 6, filter_LP24_90H, L_FILT32k, 0 }, + { 48000, 12800, 4, filter_LP24_90H, L_FILT48k, 0 }, + + /* entry for LFE PLC */ + { 1600, 48000, 30, filter_LP30_300K, LFE_PLC_FDEL/30, 0 }, + { 0, 0, 0, 0, 0, 0 } /* trailing entry (just to calculate the length of this table) */ +}; + +/*----------------------------------------------------------------------------------* + * LSP interpolation coefficients + *----------------------------------------------------------------------------------*/ + +const float interpol_frac2[NB_SUBFR] = { + 0.5f, 0.5f, 1.0f, 1.0f +}; + +const float interpol_frac2_mid[NB_SUBFR*3] = { + 0.25f, 0.75f, 0.0f, + 0.25f, 0.75f, 0.0f, + 0.0f, 0.25f, 0.75f, + 0.0f, 0.25f, 0.75f +}; + +const float interpol_frac_12k8[NB_SUBFR] = { + 0.25f, 0.5f, 0.75f, 1.0f +}; + +const float interpol_isp_amr_wb[NB_SUBFR] = { + 0.45f, 0.8f, 0.96f, 1.0f +}; + +const float interpol_frac_16k[NB_SUBFR16k] = { + 0.2f, 0.4f, 0.6f, 0.8f, 1.0f +}; + +const float interpol_frac_mid[NB_SUBFR*3] = { + 0.5f, 0.5f, 0.0f, + 0.0f, 1.0f, 0.0f, + 0.0f, 0.5f, 0.5f, + 0.0f, 0.0f, 1.0f +}; + +const float interpol_frac_mid_16k[NB_SUBFR16k*3] = { + 0.55f, 0.45f, 0.0f, + 0.15f, 0.85f, 0.0f, + 0.0f, 0.75f, 0.25f, + 0.0f, 0.35f, 0.65f, + 0.0f, 0.0f, 1.0f +}; + +const float interpol_frac_mid_relaxprev_12k8[NB_SUBFR*3] = { + 0.0f, 0.7f, 0.3f, + 0.0f, 0.0f, 1.0f, + 0.0f, 0.0f, 1.0f, + 0.0f, 0.0f, 1.0f +}; + +const float interpol_frac_mid_FEC[NB_SUBFR*3] = { + 0.25f, 0.55f, 0.20f, + 0.00f, 0.70f, 0.30f, + 0.00f, 0.45f, 0.55f, + 0.00f, 0.00f, 1.00f +}; + +const float interpol_frac_mid_relaxprev_pred_12k8[NB_SUBFR*3] = { + 0.15f, 0.70f, 0.15f, + 0.05f, 0.65f, 0.30f, + 0.00f, 0.50f, 0.50f, + 0.00f, 0.0f, 1.00f +}; + +const float interpol_frac_mid_relaxprev_16k[NB_SUBFR16k*3] = { + 0.0f, 0.7f, 0.3f, + 0.0f, 0.0f, 1.0f, + 0.0f, 0.0f, 1.0f, + 0.0f, 0.0f, 1.0f, + 0.0f, 0.0f, 1.0f +}; + +const float interpol_frac_mid_16k_FEC[NB_SUBFR16k*3] = { + 0.4f, 0.40f, 0.2f, + 0.0f, 0.80f, 0.20f, + 0.0f, 0.65f, 0.35f, + 0.0f, 0.15f, 0.85f, + 0.0f, 0.00f, 1.00f +}; + +const float interpol_frac_mid_relaxprev_pred_16k[NB_SUBFR16k*3] = { + 0.15f, 0.70f, 0.15f, + 0.05f, 0.65f, 0.30f, + 0.00f, 0.50f, 0.50f, + 0.00f, 0.15f, 0.85f, + 0.00f, 0.0f, 1.00f +}; + +/*----------------------------------------------------------------------------------* + * Innovative codebook + *----------------------------------------------------------------------------------*/ + +/* Innovative codebook config */ +const PulseConfig PulseConfTable[] = +{ + /* Design rules: + * ---> "fixed" + "tried-pair-pos"*2 = pulses & 0xfe + * ---> tracks with pulses % 3 == 0, have always TRACKPOS_FIXED_FIRST */ + /* bits,iter,alp,pulses,fixed,tried-pair-pos,codetrack */ + { 7, 4, 2.0f, 1, 0, {8}, TRACKPOS_FREE_ONE }, /* 7 bits, 1 pulses, 4 tracks, 1000 free track */ + { 10, 4, 2.0f, 2, 0, {8}, TRACKPOS_FIXED_EVEN }, /* 10 bits, 2 pulses, 4 tracks 1010 (used only even tracks designed for NB) */ + { 12, 4, 2.0f, 2, 0, {8}, TRACKPOS_FIXED_TWO }, /* 12 bits, 2 pulses, 2 tracks 11 used all tracks ala AMR-WB 6.6 */ + { 15, 4, 2.0f, 3, 0, {8}, TRACKPOS_FIXED_FIRST }, /* 15 bits, 3 pulses, 4 tracks 1110 fixed track to first ? */ + { 17, 6, 2.0f, 3, 0, {8}, TRACKPOS_FREE_THREE }, /* 17 bits, 3 pulses, 4 tracks (used all tracks) - 1110, 1101, 1011, 0111 */ + { 20, 4, 2.0f, 4, 0, {4, 8}, TRACKPOS_FIXED_FIRST }, /* 20 bits, 4 pulses, 4 tracks 1111 */ + { 24, 4, 2.0f, 5, 0, {4, 8}, TRACKPOS_FIXED_FIRST }, /* 24 bits, 5 pulses, 4 tracks 2111 fixed track to first */ + { 26, 4, 2.0f, 5, 0, {4, 8}, TRACKPOS_FREE_ONE }, /* 26 bits, 5 pulses, 4 tracks 2111 one free track ? */ + { 28, 4, 1.5f, 6, 0, {4, 8, 8}, TRACKPOS_FIXED_FIRST }, /* 28 bits, 6 pulses, 4 tracks 2211 */ + { 30, 4, 1.5f, 6, 0, {4, 8, 8}, TRACKPOS_FIXED_TWO }, /* 30 bits, 6 pulses, 4 tracks 2211 free consecutive track positions ? */ + { 32, 4, 1.5f, 7, 0, {4, 8, 8}, TRACKPOS_FIXED_FIRST }, /* 32 bits, 6 pulses, 4 tracks 2221 fixed ?*/ + { 34, 4, 1.5f, 7, 0, {4, 8, 8}, TRACKPOS_FREE_THREE }, /* 34 bits, 6 pulses, 4 tracks 2221 free track positions ? */ + { 36, 4, 1.0f, 8, 2, {4, 8, 8}, TRACKPOS_FIXED_FIRST }, /* 36 bits, 8 pulses, 4 tracks 2222 */ + { 40, 4, 1.0f, 9, 2, {4, 8, 8}, TRACKPOS_FIXED_FIRST }, /* 40 bits, 9 pulses, 4 tracks 3222 fixed ?*/ + { 43, 4, 1.0f, 10, 2, {4, 6, 8, 8}, TRACKPOS_FIXED_FIRST }, /* 44 bits, 10 pulses, 4 tracks 3322 */ + { 46, 4, 1.0f, 10, 2, {4, 6, 8, 8}, TRACKPOS_FIXED_TWO }, /* 46 bits, 10 pulses, 4 tracks 3322 free consecutive tracks ? */ + { 47, 4, 1.0f, 11, 2, {4, 6, 8, 8}, TRACKPOS_FIXED_FIRST }, /* 47 bits, 10 pulses, 4 tracks 3332 fixed ? */ + { 49, 4, 1.0f, 11, 2, {4, 6, 8, 8}, TRACKPOS_FREE_THREE }, /* 49 bits, 10 pulses, 4 tracks 3332 free three track positions ? */ + { 50, 4, 1.0f, 12, 4, {4, 6, 8, 8}, TRACKPOS_FIXED_FIRST }, /* 50 bits, 12 pulses, 4 tracks 3333 */ + { 53, 4, 1.0f, 13, 4, {4, 6, 8, 8}, TRACKPOS_FIXED_FIRST }, /* 53 bits, 13 pulses, 4 tracks 4333 fixed ? */ + { 55, 4, 1.0f, 13, 4, {4, 6, 8, 8}, TRACKPOS_FREE_ONE }, /* 55 bits, 13 pulses, 4 tracks 4333 free one ? */ + { 56, 4, 1.0f, 14, 4, {4, 6, 6, 8, 8}, TRACKPOS_FIXED_FIRST }, /* 56 bits, 14 pulses, 4 tracks 4433 fixed ?!?! */ + { 58, 4, 1.0f, 14, 4, {4, 6, 6, 8, 8}, TRACKPOS_FIXED_TWO }, /* 58 bits, 14 pulses, 4 tracks 4433 free consecutive ? */ + { 59, 4, 1.0f, 15, 4, {4, 6, 6, 8, 8}, TRACKPOS_FIXED_FIRST }, /* 59 bits, 15 pulses, 4 tracks 4443 fixed ? */ + { 61, 4, 1.0f, 15, 4, {4, 6, 6, 8, 8}, TRACKPOS_FREE_THREE }, /* 61 bits, 15 pulses, 4 tracks 4443 free ? */ + { 62, 3, 0.8f, 16, 4, {4, 4, 6, 6, 8, 8}, TRACKPOS_FIXED_FIRST }, /* 62 bits, 16 pulses, 4 tracks 4444 */ + { 65, 3, 0.8f, 17, 4, {4, 4, 6, 6, 8, 8}, TRACKPOS_FIXED_FIRST }, /* 65 bits, 17 pulses, 4 tracks 5444 fixed ?*/ + { 68, 3, 0.75f, 18, 4, {2, 3, 4, 5, 6, 7, 8}, TRACKPOS_FIXED_FIRST }, /* 68 bits, 18 pulses, 4 tracks 5544 */ + { 70, 3, 0.75f, 19, 4, {2, 3, 4, 5, 6, 7, 8}, TRACKPOS_FIXED_FIRST }, /* 70 bits, 19 pulses, 4 tracks 5554 fixed ? */ + { 73, 3, 0.75f, 20, 4, {2, 3, 4, 5, 6, 7, 8, 8}, TRACKPOS_FIXED_FIRST }, /* 73 bits, 20 pulses, 4 tracks 5555 fixed ? */ + { 75, 3, 0.75f, 21, 4, {2, 3, 4, 5, 6, 7, 8, 8}, TRACKPOS_FIXED_FIRST }, /* 75 bits, 21 pulses, 4 tracks 6555 fixed ? */ + { 78, 3, 0.75f, 22, 4, {2, 3, 4, 5, 6, 7, 8, 8, 8}, TRACKPOS_FIXED_FIRST }, /* 78 bits, 22 pulses, 4 tracks 6655 fixed ? */ + { 80, 3, 0.75f, 23, 4, {2, 3, 4, 5, 6, 7, 8, 8, 8}, TRACKPOS_FIXED_FIRST }, /* 80 bits, 23 pulses, 4 tracks 6665 fixed ? */ + { 83, 2, 0.30f, 24, 4, {2, 3, 4, 5, 6, 7, 8, 8, 8, 8}, TRACKPOS_FIXED_FIRST}, /* 83 bits, 24 pulses, 4 tracks 6666 */ + { 85, 2, 0.30f, 25, 4, {2, 3, 4, 5, 6, 7, 8, 8, 8, 8}, TRACKPOS_FIXED_FIRST}, /* 85 bits, 25 pulses, 4 tracks 7666 */ + { 87, 2, 0.25f, 26, 4, {2, 3, 4, 5, 6, 7, 8, 8, 8, 8, 8}, TRACKPOS_FIXED_FIRST}, /* 87 bits, 26 pulses, 4 tracks 7766 */ + { 89, 2, 0.25f, 27, 4, {2, 3, 4, 5, 6, 7, 8, 8, 8, 8, 8}, TRACKPOS_FIXED_FIRST}, /* 89 bits, 27 pulses, 4 tracks 7776 */ + { 92, 2, 0.25f, 28, 4, {2, 3, 4, 5, 6, 7, 8, 8, 8, 8, 8, 8}, TRACKPOS_FIXED_FIRST}, /* 92 bits, 28 pulses, 4 tracks 7777 */ + { 94, 2, 0.25f, 29, 4, {2, 3, 4, 5, 6, 7, 8, 8, 8, 8, 8, 8}, TRACKPOS_FIXED_FIRST}, /* 94 bits, 29 pulses, 4 tracks 8777 */ + { 96, 1, 0.20f, 30, 4, {2, 3, 4, 5, 6, 7, 8, 8, 8, 8, 8, 8, 8}, TRACKPOS_FIXED_FIRST}, /* 96 bits, 30 pulses, 4 tracks 8877 */ + { 98, 1, 0.20f, 31, 4, {2, 3, 4, 5, 6, 7, 8, 8, 8, 8, 8, 8, 8}, TRACKPOS_FIXED_FIRST}, /* 98 bits, 31 pulses, 4 tracks 8887 */ +}; + + +/* Number of pulses & positions to the number of unique states that can be achieved with those pulses */ +const uint32_t pulsestostates[17][9] = +{ + { 0, 0, 0, 0, 0, 0, 0, 0, 0}, + { 2, 2, 2, 2, 2, 2, 2, 2, 2}, + { 4, 8, 12, 16, 20, 24, 28, 32, 36}, + { 6, 18, 38, 66, 102, 146, 198, 258, 326}, + { 8, 32, 88, 192, 360, 608, 952, 1408, 1992}, + { 10, 50, 170, 450, 1002, 1970, 3530, 5890, 9290}, + { 12, 72, 292, 912, 2364, 5336, 10836, 20256, 35436}, + { 14, 98, 462, 1666, 4942, 12642, 28814, 59906, 115598}, + { 16, 128, 688, 2816, 9424, 27008, 68464, 157184, 332688}, + { 18, 162, 978, 4482, 16722, 53154, 148626, 374274, 864146}, + { 20, 200, 1340, 6800, 28004, 97880, 299660, 822560, 2060980}, + { 22, 242, 1782, 9922, 44726, 170610, 568150, 1690370, 4573910}, + { 24, 288, 2312, 14016, 68664, 284000, 1022760, 3281280, 9545560}, + { 26, 338, 2938, 19266, 101946, 454610, 1761370, 6065410, 18892250}, + { 28, 392, 3668, 25872, 147084, 703640, 2919620, 10746400, 35704060}, + { 30, 450, 4510, 34050, 207006, 1057730, 4680990, 18347010, 64797470}, + { 32, 512, 5472, 44032, 285088, 1549824, 7288544, 30316544, 113461024}, +}; + +/*----------------------------------------------------------------------------------* + * Gain quantization table for memory-less gain quantizer + *----------------------------------------------------------------------------------*/ + +const float gain_qua_mless_7b[128*2] = +{ + 0.0256f, 0.0555f, + 0.0915f, 1.1847f, + 0.0968f, 0.6282f, + 0.0996f, 0.2821f, + 0.1029f, 0.4465f, + 0.1065f, 0.9677f, + 0.1332f, 0.7997f, + 0.1535f, 1.3985f, + 0.1692f, 1.6101f, + 0.1873f, 2.0886f, + 0.1960f, 1.8291f, + 0.1964f, 0.1732f, + 0.2122f, 2.4304f, + 0.2292f, 0.5306f, + 0.2359f, 1.0716f, + 0.2369f, 0.6796f, + 0.2546f, 0.3544f, + 0.2694f, 1.2247f, + 0.2697f, 0.9217f, + 0.2996f, 2.7903f, + 0.3197f, 0.7881f, + 0.3199f, 3.2249f, + 0.3492f, 0.1667f, + 0.3560f, 0.4883f, + 0.3568f, 1.3541f, + 0.3599f, 0.6346f, + 0.3684f, 1.0620f, + 0.3716f, 1.5223f, + 0.3942f, 3.6890f, + 0.4059f, 0.3064f, + 0.4076f, 0.9021f, + 0.4149f, 1.7170f, + 0.4225f, 1.9400f, + 0.4229f, 2.2074f, + 0.4487f, 1.2106f, + 0.4554f, 0.7548f, + 0.4800f, 0.4531f, + 0.4882f, 0.6140f, + 0.4966f, 1.0464f, + 0.5126f, 1.3905f, + 0.5298f, 0.8967f, + 0.5369f, 2.4926f, + 0.5521f, 1.5735f, + 0.5614f, 0.1682f, + 0.5758f, 0.7770f, + 0.5939f, 1.1468f, + 0.5942f, 0.5222f, + 0.5946f, 0.3409f, + 0.6053f, 1.7908f, + 0.6129f, 0.9937f, + 0.6136f, 1.2784f, + 0.6184f, 2.0111f, + 0.6249f, 0.6626f, + 0.6527f, 3.0463f, + 0.6602f, 0.8724f, + 0.6692f, 1.4121f, + 0.6961f, 2.2440f, + 0.7035f, 1.0724f, + 0.7069f, 0.7548f, + 0.7081f, 1.5445f, + 0.7091f, 0.5579f, + 0.7253f, 1.6832f, + 0.7296f, 1.1850f, + 0.7359f, 0.4175f, + 0.7388f, 0.9680f, + 0.7428f, 2.7283f, + 0.7591f, 1.3040f, + 0.7700f, 0.6550f, + 0.7732f, 1.8595f, + 0.7742f, 0.8500f, + 0.7924f, 0.2178f, + 0.8078f, 1.4486f, + 0.8178f, 1.0725f, + 0.8255f, 0.7421f, + 0.8256f, 0.5278f, + 0.8316f, 2.0390f, + 0.8382f, 0.9422f, + 0.8435f, 1.2053f, + 0.8567f, 1.5952f, + 0.8570f, 2.4549f, + 0.8725f, 0.8299f, + 0.8756f, 1.3365f, + 0.8769f, 0.6222f, + 0.8799f, 0.3881f, + 0.8938f, 1.7540f, + 0.9121f, 1.0122f, + 0.9210f, 0.7117f, + 0.9249f, 1.1285f, + 0.9344f, 0.9022f, + 0.9375f, 3.7762f, + 0.9376f, 1.4769f, + 0.9388f, 0.5124f, + 0.9501f, 2.2014f, + 0.9582f, 1.2478f, + 0.9646f, 0.8003f, + 0.9815f, 0.6165f, + 0.9864f, 1.9390f, + 0.9985f, 1.3694f, + 1.0041f, 1.6163f, + 1.0071f, 1.0599f, + 1.0095f, 0.9596f, + 1.0142f, 3.3774f, + 1.0150f, 0.3827f, + 1.0223f, 0.7201f, + 1.0351f, 2.9891f, + 1.0393f, 0.8629f, + 1.0461f, 1.1773f, + 1.0601f, 1.7548f, + 1.0616f, 0.5225f, + 1.0969f, 1.4899f, + 1.0977f, 2.6574f, + 1.0996f, 0.6500f, + 1.1006f, 1.3029f, + 1.1129f, 0.7923f, + 1.1151f, 0.2047f, + 1.1169f, 1.0829f, + 1.1195f, 0.9526f, + 1.1442f, 2.3570f, + 1.1613f, 2.0960f, + 1.1920f, 0.4212f, + 1.1942f, 1.8806f, + 1.2055f, 1.6309f, + 1.2081f, 1.2005f, + 1.2091f, 0.5825f, + 1.2200f, 1.3871f, + 1.2201f, 0.8762f, + 1.2210f, 0.7314f, + 1.2298f, 1.0376f +}; + +const float gain_qua_mless_6b_stereo[64*2]= +{ + 0.034851F,1.358887F, + 0.056885F,1.045898F, + 0.059387F,1.785156F, + 0.079651F,0.322754F, + 0.091736F,0.670410F, + 0.118591F,4.105957F, + 0.168701F,0.859375F, + 0.180481F,2.352051F, + 0.193115F,1.213379F, + 0.197266F,1.485840F, + 0.257324F,0.499023F, + 0.269531F,1.041504F, + 0.298096F,1.705566F, + 0.329285F,0.838379F, + 0.341858F,1.296875F, + 0.349426F,3.154785F, + 0.417908F,2.065918F, + 0.418030F,1.045898F, + 0.420532F,6.452148F, + 0.432556F,0.655273F, + 0.435486F,1.496094F, + 0.504578F,1.203613F, + 0.525024F,1.772949F, + 0.530396F,0.864258F, + 0.579895F,2.469238F, + 0.580872F,1.421875F, + 0.613464F,0.144043F, + 0.625244F,1.005371F, + 0.654480F,1.682617F, + 0.664307F,1.252930F, + 0.671692F,0.663086F, + 0.727478F,3.170410F, + 0.731018F,2.026855F, + 0.745789F,1.102051F, + 0.749878F,1.504395F, + 0.784851F,0.806641F, + 0.790100F,15.999512F, + 0.814697F,1.337402F, + 0.839355F,0.981934F, + 0.842468F,1.705566F, + 0.843018F,2.357422F, + 0.879944F,1.201172F, + 0.893188F,0.767090F, + 0.922791F,1.430176F, + 0.928589F,1.018555F, + 0.930664F,1.906250F, + 0.946655F,0.567871F, + 0.972717F,2.812500F, + 0.982788F,1.178711F, + 0.986206F,0.875977F, + 0.993530F,1.562012F, + 0.998474F,4.970215F, + 1.029236F,9.087402F, + 1.038208F,2.136230F, + 1.042114F,0.684082F, + 1.058838F,1.287598F, + 1.073242F,0.995117F, + 1.089661F,1.667969F, + 1.164978F,3.430176F, + 1.166321F,0.791504F, + 1.180969F,1.420898F, + 1.193481F,1.106445F, + 1.193481F,2.423828F, + 1.199951F,1.863281F, +}; + +const float gain_qua_mless_6b[64*2] = +{ + 0.1023f, 0.1385f, + 0.1299f, 0.3865f, + 0.1415f, 0.9587f, + 0.1433f, 0.6630f, + 0.1708f, 1.2210f, + 0.1766f, 1.5334f, + 0.2387f, 2.1457f, + 0.2917f, 0.4762f, + 0.2918f, 0.8337f, + 0.3122f, 1.8254f, + 0.3231f, 2.9468f, + 0.3520f, 0.2219f, + 0.3673f, 1.0612f, + 0.3755f, 0.6540f, + 0.3787f, 1.3191f, + 0.3805f, 3.5578f, + 0.4114f, 2.4443f, + 0.4293f, 1.5662f, + 0.4750f, 0.8475f, + 0.4886f, 0.4489f, + 0.5635f, 1.2143f, + 0.5699f, 0.6556f, + 0.5730f, 1.0155f, + 0.5963f, 2.0279f, + 0.6021f, 1.4337f, + 0.6240f, 1.7159f, + 0.6480f, 0.2310f, + 0.6577f, 0.8326f, + 0.7030f, 0.4858f, + 0.7146f, 2.7331f, + 0.7351f, 1.1471f, + 0.7489f, 0.9787f, + 0.7493f, 0.6800f, + 0.7628f, 1.3365f, + 0.7947f, 1.5351f, + 0.7994f, 2.3357f, + 0.8258f, 0.8233f, + 0.8434f, 1.7918f, + 0.8620f, 0.5667f, + 0.8850f, 2.0286f, + 0.8873f, 1.2422f, + 0.8933f, 1.0855f, + 0.8952f, 0.9457f, + 0.9113f, 0.7066f, + 0.9189f, 0.4096f, + 0.9554f, 3.1133f, + 0.9662f, 3.6596f, + 0.9685f, 1.4001f, + 0.9703f, 1.6178f, + 0.9859f, 0.8469f, + 1.0095f, 0.5734f, + 1.0299f, 1.1866f, + 1.0337f, 1.0014f, + 1.0487f, 0.7284f, + 1.0769f, 2.6107f, + 1.0801f, 0.2455f, + 1.1195f, 2.1906f, + 1.1268f, 1.8445f, + 1.1591f, 0.4730f, + 1.1666f, 1.5523f, + 1.1711f, 1.3167f, + 1.1753f, 0.8763f, + 1.1893f, 1.0872f, + 1.1911f, 0.6722f +}; + +const float gain_qua_mless_5b[32*2] = +{ + 0.1645f, 0.2137f, + 0.2102f, 0.5295f, + 0.2154f, 0.8448f, + 0.2615f, 1.5636f, + 0.2664f, 1.1856f, + 0.3012f, 2.1266f, + 0.4209f, 2.7473f, + 0.4713f, 0.6328f, + 0.4830f, 0.2861f, + 0.4938f, 0.9146f, + 0.5523f, 1.7829f, + 0.5798f, 1.1716f, + 0.6039f, 1.4473f, + 0.6068f, 3.5936f, + 0.7267f, 0.7460f, + 0.7329f, 2.1548f, + 0.7537f, 0.4738f, + 0.7586f, 0.9788f, + 0.8354f, 1.2308f, + 0.8529f, 1.7499f, + 0.8856f, 1.4611f, + 0.9253f, 0.6280f, + 0.9414f, 0.8362f, + 0.9570f, 1.0559f, + 0.9663f, 3.0746f, + 0.9765f, 2.5027f, + 1.0512f, 0.4129f, + 1.0815f, 2.0090f, + 1.1099f, 1.2670f, + 1.1250f, 1.5985f, + 1.1376f, 0.6895f, + 1.1529f, 0.9632f +}; + +const int16_t E_ROM_qua_gain5b_const[NB_QUA_GAIN5B * 2]= +{ + 1774,577, + 2090,1805, + 2103,3371, + 3908,1116, + 4834,2500, + 6030,4763, + 6838,1334, + 7490,2033, + 8585,3036, + 9845,1575, + 10437,2320, + 10649,3739, + 11298,945, + 12108,1920, + 12310,5108, + 12391,2758, + 12659,1237, + 13729,1557, + 13798,2201, + 13972,3275, + 14881,993, + 15175,1776, + 15409,16190, + 15551,2395, + 15879,4048, + 16341,1335, + 16988,2918, + 18317,7449, + 18368,2026, + 19114,1364, + 19991,4472, + 20644,2790, +}; + +const Word16 E_ROM_qua_gain6b_const[NB_QUA_GAIN6B * 2] = +{ + 0,2758, + 143,3562, + 397,2146, + 544,4306, + 952,1726, + 1236,724, + 1779,3158, + 1820,5448, + 1975,2473, + 2121,1343, + 3049,3912, + 3081,1885, + 3289,8261, + 3416,2843, + 3495,2204, + 3831,3386, + 4295,4590, + 4300,2476, + 4345,1545, + 4913,1122, + 5198,2080, + 5200,3079, + 5448,3714, + 5482,2689, + 5546,1817, + 5783,17318, + 5934,6236, + 6156,2320, + 6481,4225, + 6828,3351, + 6832,5045, + 6888,2895, + 7186,2559, + 7214,1663, + 7373,2052, + 7906,3819, + 8192,1372, + 8452,3063, + 8464,2354, + 9021,4468, + 9037,2715, + 9175,1874, + 9219,3463, + 9831,2155, + 10523,5383, + 10557,9061, + 10618,3093, + 10633,3949, + 10890,2465, + 11141,1654, + 12132,2790, + 12180,3477, + 12376,2079, + 12494,4560, + 14430,2468, + 14573,3914, + 14576,3111, + 15043,1827, + 15207,1329, + 16073,6155, + 17519,4719, + 18345,2148, + 18554,2784, + 18576,3563, +}; + +const int16_t E_ROM_qua_gain7b_const[NB_QUA_GAIN7B * 2] = +{ + 123,2777, + 369,2102, + 404,4368, + 693,3486, + 1107,719, + 1222,1679, + 1657,1293, + 1667,5547, + 1805,2425, + 2369,3075, + 2489,12063, + 2681,1901, + 2693,3984, + 3031,7547, + 3248,990, + 3466,2672, + 3674,2165, + 3718,1513, + 3844,3456, + 4120,4656, + 4748,2967, + 4821,19622, + 4855,2400, + 4912,1776, + 5245,3860, + 5312,6282, + 5500,1176, + 5713,2056, + 5872,3287, + 5960,2662, + 6170,9756, + 6364,5021, + 6545,1476, + 6788,2283, + 6796,4163, + 7038,2949, + 7216,1831, + 7274,3516, + 7707,2510, + 8123,5762, + 8361,4485, + 8376,2110, + 8594,3135, + 8611,3755, + 8634,1570, + 8636,2748, + 8683,8222, + 9274,335, + 9512,2404, + 9640,5020, + 9690,1893, + 9778,3361, + 9808,15435, + 9936,4029, + 10194,2767, + 10306,6510, + 10325,1252, + 10686,2186, + 10844,32767, + 10913,4453, + 10968,3078, + 11044,1666, + 11076,3609, + 11398,2509, + 11423,5160, + 11848,1994, + 11997,2823, + 12002,3880, + 12084,7573, + 12129,3325, + 12214,5867, + 12331,1496, + 12450,4245, + 12458,2283, + 12768,901, + 12896,4741, + 12898,1811, + 12902,2569, + 12983,2959, + 13173,3331, + 13413,2059, + 13416,3734, + 13429,10641, + 13448,1148, + 13615,5340, + 13674,1425, + 13779,2332, + 13847,4264, + 13909,2657, + 13958,6488, + 14047,3085, + 14130,1648, + 14547,1915, + 14554,3684, + 14749,2739, + 14868,5017, + 14875,2216, + 14898,3197, + 14988,1085, + 15026,4246, + 15375,7971, + 15421,1446, + 15548,2462, + 15722,5920, + 15882,3449, + 15960,1782, + 15994,2863, + 16365,3977, + 16419,4754, + 16472,2162, + 17378,3101, + 17410,2550, + 17743,1339, + 17856,5485, + 17979,1982, + 17996,3628, + 18041,7110, + 18242,4381, + 18602,22207, + 19373,12827, + 19533,2777, + 19640,1678, + 19728,2272, + 19795,8861, + 20065,3275, + 20133,4881, + 20198,3947, + 20290,6128, +}; + +/*----------------------------------------------------------------------------------* + * MA predicition coefficients for gain quantizer + *----------------------------------------------------------------------------------*/ + +const float pred_gain[GAIN_PRED_ORDER] = { 0.5f, 0.4f, 0.3f, 0.2f }; + +/*----------------------------------------------------------------------------------* + * 6-bit gain quantization table (only for AMR-WB IO mode) + *----------------------------------------------------------------------------------*/ + +const float t_qua_gain6b[64*2] = +{ + 0.095577f, 0.650507f, + 0.096232f, 1.737050f, + 0.187418f, 3.168846f, + 0.255896f, 4.962348f, + 0.274392f, 1.237365f, + 0.306340f, 2.191559f, + 0.340913f, 7.624112f, + 0.349443f, 0.694540f, + 0.393850f, 0.283414f, + 0.410411f, 3.335519f, + 0.467326f, 1.722400f, + 0.492699f, 1.024880f, + 0.502447f, 2.596945f, + 0.538748f, 4.284797f, + 0.594507f, 1.400231f, + 0.601562f, 0.715119f, + 0.615667f, 6.097708f, + 0.625075f, 2.174328f, + 0.662782f, 3.231284f, + 0.690967f, 1.751661f, + 0.696845f, 0.878992f, + 0.710639f, 1.185743f, + 0.715220f, 0.482280f, + 0.751490f, 2.486668f, + 0.764345f, 4.108078f, + 0.767472f, 12.8f, /*0.767472f, 13.875360f,*/ + 0.769099f, 1.658386f, + 0.803928f, 0.792686f, + 0.810832f, 1.183175f, + 0.818967f, 2.972155f, + 0.821480f, 6.255056f, + 0.833469f, 1.761157f, + 0.861276f, 2.207579f, + 0.863275f, 0.599961f, + 0.880429f, 0.913681f, + 0.880816f, 3.532393f, + 0.881643f, 1.383632f, + 0.892825f, 4.900598f, + 0.906974f, 8.542764f, + 0.925368f, 1.772085f, + 0.928281f, 2.841080f, + 0.933752f, 1.101603f, + 0.947124f, 2.305683f, + 0.956012f, 0.517399f, + 0.961870f, 3.892433f, + 0.972823f, 5.841643f, + 0.977796f, 1.463091f, + 0.981803f, 0.833284f, + 1.008362f, 2.077002f, + 1.011696f, 3.039251f, + 1.031157f, 1.162086f, + 1.031888f, 0.332692f, + 1.050599f, 4.104371f, + 1.074819f, 1.668828f, + 1.092217f, 2.572842f, + 1.108887f, 5.736302f, + 1.112667f, 0.769072f, + 1.135654f, 15.9999f, /*1.135654f, 28.065996f,*/ + 1.143096f, 10.587959f, + 1.168006f, 1.241697f, + 1.185414f, 3.211269f, + 1.186919f, 2.000422f, + 1.187154f, 4.421983f, + 1.243327f, 7.268204f +}; + +/*----------------------------------------------------------------------------------* + * 7-bit gain quantization table (only for AMR-WB IO mode) + *----------------------------------------------------------------------------------*/ + +const float t_qua_gain7b[128*2] = +{ + 0.012445f, 0.215546f, + 0.028326f, 0.965442f, + 0.053042f, 0.525819f, + 0.065409f, 1.495322f, + 0.078212f, 2.323725f, + 0.100504f, 0.751276f, + 0.112617f, 3.427530f, + 0.113124f, 0.309583f, + 0.121763f, 1.140685f, + 0.143515f, 7.519609f, + 0.162430f, 0.568752f, + 0.164940f, 1.904113f, + 0.165429f, 4.947562f, + 0.194985f, 0.855463f, + 0.213527f, 1.281019f, + 0.223544f, 0.414672f, + 0.243135f, 2.781766f, + 0.257180f, 1.659565f, + 0.269488f, 0.636749f, + 0.286539f, 1.003938f, + 0.328124f, 2.225436f, + 0.328761f, 0.330278f, + 0.336807f, 11.500983f, + 0.339794f, 3.805726f, + 0.344454f, 1.494626f, + 0.346165f, 0.738748f, + 0.363605f, 1.141454f, + 0.398729f, 0.517614f, + 0.415276f, 2.928666f, + 0.416282f, 0.862935f, + 0.423421f, 1.873310f, + 0.444151f, 0.202244f, + 0.445842f, 1.301113f, + 0.455671f, 5.519512f, + 0.484764f, 0.387607f, + 0.488696f, 0.967884f, + 0.488730f, 0.666771f, + 0.508189f, 1.516224f, + 0.508792f, 2.348662f, + 0.531504f, 3.883870f, + 0.548649f, 1.112861f, + 0.551182f, 0.514986f, + 0.564397f, 1.742030f, + 0.566598f, 0.796454f, + 0.589255f, 3.081743f, + 0.598816f, 1.271936f, + 0.617654f, 0.333501f, + 0.619073f, 2.040522f, + 0.625282f, 0.950244f, + 0.630798f, 0.594883f, + 0.638918f, 4.863197f, + 0.650102f, 1.464846f, + 0.668412f, 0.747138f, + 0.669490f, 2.583027f, + 0.683757f, 1.125479f, + 0.691216f, 1.739274f, + 0.718441f, 3.297789f, + 0.722608f, 0.902743f, + 0.728827f, 2.194941f, + 0.729586f, 0.633849f, + 0.730907f, 7.432957f, + 0.731017f, 0.431076f, + 0.731543f, 1.387847f, + 0.759183f, 1.045210f, + 0.768606f, 1.789648f, + 0.771245f, 4.085637f, + 0.772613f, 0.778145f, + 0.786483f, 1.283204f, + 0.792467f, 2.412891f, + 0.802393f, 0.544588f, + 0.807156f, 0.255978f, + 0.814280f, 1.544409f, + 0.817839f, 0.938798f, + 0.826959f, 2.910633f, + 0.830453f, 0.684066f, + 0.833431f, 1.171532f, + 0.841208f, 1.908628f, + 0.846440f, 5.333522f, + 0.868280f, 0.841519f, + 0.868662f, 1.435230f, + 0.871449f, 3.675784f, + 0.881317f, 2.245058f, + 0.882020f, 0.480249f, + 0.882476f, 1.105804f, + 0.902856f, 0.684850f, + 0.904419f, 1.682113f, + 0.909384f, 2.787801f, + 0.916558f, 7.500981f, + 0.918444f, 0.950341f, + 0.919721f, 1.296319f, + 0.940272f, 4.682978f, + 0.940273f, 1.991736f, + 0.950291f, 3.507281f, + 0.957455f, 1.116284f, + 0.957723f, 0.793034f, + 0.958217f, 1.497824f, + 0.962628f, 2.514156f, + 0.968507f, 0.588605f, + 0.974739f, 0.339933f, + 0.991738f, 1.750201f, + 0.997210f, 0.936131f, + 1.002422f, 1.250008f, + 1.006040f, 2.167232f, + 1.008848f, 3.129940f, + 1.014404f, 5.842819f, + 1.027798f, 4.287319f, + 1.039404f, 1.489295f, + 1.039628f, 8.947958f, + 1.043214f, 0.765733f, + 1.045089f, 2.537806f, + 1.058994f, 1.031496f, + 1.060415f, 0.478612f, + 1.072132f, 12.8f, /*1.072132f, 14.961459f,*/ + 1.074778f, 1.910049f, + 1.076570f, 15.9999f, /*1.076570f, 30.500374f,*/ + 1.107853f, 3.843067f, + 1.110673f, 1.228576f, + 1.110969f, 2.758471f, + 1.140058f, 1.603077f, + 1.155384f, 0.668935f, + 1.176229f, 6.717108f, + 1.179008f, 2.011940f, + 1.187735f, 0.963552f, + 1.199569f, 4.891432f, + 1.206311f, 3.316329f, + 1.215323f, 2.507536f, + 1.223150f, 1.387102f, + 1.296012f, 9.684225f +}; + +/*----------------------------------------------------------------------------------* + * Quantization table for scaled innovation energy prediciton + *----------------------------------------------------------------------------------*/ + +const float Es_pred_qua_5b[32] = +{ + -8.0000f, + -2.0519f, + 2.5095f, + 6.5923f, + 9.9507f, + 12.9923f, + 15.7251f, + 18.1521f, + 20.3552f, + 22.4218f, + 24.3014f, + 26.0214f, + 27.6040f, + 29.0898f, + 30.5291f, + 31.9154f, + 33.2749f, + 34.6277f, + 35.9525f, + 37.3081f, + 38.7173f, + 40.1734f, + 41.6751f, + 43.2697f, + 44.9559f, + 46.7826f, + 48.7749f, + 50.9729f, + 53.4967f, + 56.3814f, + 59.9748f, + 65.0000f +}; + + +const float Es_pred_qua_4b[16] = +{ + -8.0000f, + -0.1400f, + 7.1397f, + 12.8276f, + 17.9064f, + 22.4280f, + 26.6441f, + 30.6032f, + 34.2916f, + 37.8937f, + 41.4441f, + 45.0174f, + 48.7769f, + 52.9669f, + 58.0552f, + 65.0000f +}; + +const float Es_pred_qua_3b[8] = +{ + 5.9422f, + 15.2711f, + 23.3857f, + 30.5310f, + 37.0190f, + 43.4539f, + 50.2442f, + 58.7164f +}; + +const float Es_pred_qua_4b_no_ltp[16] = +{ + -5.f, + 0.f, + 5.f, + 10.f, + 15.f, + 20.f, + 25.f, + 30.f, + 35.f, + 40.f, + 45.f, + 50.f, + 55.f, + 60.f, + 65.f, + 70.f +}; + +/*----------------------------------------------------------------------------------* + * Gain estimation constants (for gain quantizer at 7.2 and 8.0 kbps) + *----------------------------------------------------------------------------------*/ + +const float b_1sfr[2] = +{ + 2.36736f, -0.22452f +}; + +const float b_2sfr[4] = +{ + -0.00027f, 0.01703f, 0.91879f, 0.13234f +}; + +const float b_3sfr[6] = +{ + -0.11658f, 0.02674f, 0.13513f, 0.79682f, 0.02241f, 0.17815f +}; + +const float b_4sfr[8] = +{ + -0.09296f, 0.01578f, -0.06606f, 0.20416f, 0.79254f, 0.00829f, 0.03499f, 0.15859f +}; + + +/*----------------------------------------------------------------------------------* + * Gain codebooks (for gain quantizer at 7.2 and 8.0 kbps) + *----------------------------------------------------------------------------------*/ + +const float gp_gamma_1sfr_8b[2*256] = +{ + 0.01864f, 0.29707f, + 0.02030f, 0.07182f, + 0.02151f, 1.08524f, + 0.03500f, 0.16009f, + 0.03977f, 0.02281f, + 0.04234f, 0.40424f, + 0.04933f, 0.76004f, + 0.05586f, 1.51515f, + 0.06020f, 2.12629f, + 0.06027f, 3.09183f, + 0.06439f, 0.11739f, + 0.07339f, 5.42703f, + 0.07352f, 0.03949f, + 0.08217f, 0.24883f, + 0.08739f, 0.64886f, + 0.10306f, 12.80025f, + 0.10466f, 0.50924f, + 0.11107f, 0.09482f, + 0.12457f, 1.36386f, + 0.13298f, 7.87494f, + 0.13422f, 0.19471f, + 0.13866f, 2.54472f, + 0.14144f, 0.90007f, + 0.14280f, 0.34101f, + 0.15640f, 0.05105f, + 0.15712f, 28.93375f, + 0.16220f, 4.10343f, + 0.16674f, 0.12822f, + 0.17199f, 0.01803f, + 0.17309f, 0.57791f, + 0.17880f, 1.83167f, + 0.21237f, 0.25432f, + 0.21425f, 0.42966f, + 0.22283f, 6.15919f, + 0.22382f, 1.40095f, + 0.22706f, 0.74928f, + 0.23090f, 1.03443f, + 0.23261f, 20.98373f, + 0.23699f, 10.51665f, + 0.24053f, 3.14177f, + 0.24195f, 0.09011f, + 0.25145f, 0.15676f, + 0.26865f, 0.02971f, + 0.27099f, 2.30569f, + 0.27377f, 0.33881f, + 0.28928f, 0.60729f, + 0.29592f, 0.06145f, + 0.31283f, 14.92646f, + 0.31414f, 0.21458f, + 0.31534f, 1.77427f, + 0.31962f, 0.49268f, + 0.32489f, 1.21756f, + 0.32814f, 4.91051f, + 0.34121f, 0.01364f, + 0.34148f, 8.74051f, + 0.34386f, 0.12541f, + 0.34508f, 0.89971f, + 0.35532f, 0.04229f, + 0.35970f, 0.27273f, + 0.36044f, 3.53446f, + 0.37703f, 0.71598f, + 0.38255f, 0.39178f, + 0.38772f, 2.13255f, + 0.40080f, 1.46796f, + 0.40443f, 0.09811f, + 0.41099f, 0.18558f, + 0.41248f, 0.57650f, + 0.42003f, 6.02510f, + 0.42491f, 2.66162f, + 0.44395f, 1.05504f, + 0.45244f, 0.32349f, + 0.46599f, 4.14121f, + 0.46643f, 0.07352f, + 0.46821f, 0.76710f, + 0.47180f, 0.44298f, + 0.47973f, 0.14694f, + 0.48709f, 0.22467f, + 0.48898f, 1.86483f, + 0.49391f, 7.20170f, + 0.49561f, 0.03365f, + 0.49719f, 11.52638f, + 0.51590f, 1.31314f, + 0.52029f, 3.12855f, + 0.52386f, 0.11286f, + 0.52972f, 0.53743f, + 0.54158f, 0.64936f, + 0.54442f, 0.88680f, + 0.54741f, 18.96873f, + 0.55717f, 5.01132f, + 0.55900f, 0.38267f, + 0.56108f, 2.20040f, + 0.56269f, 0.27811f, + 0.56764f, 0.01728f, + 0.56774f, 1.61683f, + 0.57428f, 0.17847f, + 0.59426f, 0.05172f, + 0.60253f, 1.12077f, + 0.61435f, 0.47966f, + 0.61837f, 2.64075f, + 0.61974f, 3.85052f, + 0.62233f, 0.77999f, + 0.62488f, 30.82914f, + 0.62591f, 8.30773f, + 0.63483f, 0.13040f, + 0.63717f, 0.08340f, + 0.64151f, 0.22596f, + 0.64277f, 14.45112f, + 0.65342f, 1.94833f, + 0.65906f, 1.41075f, + 0.66195f, 0.33327f, + 0.66208f, 0.59438f, + 0.66380f, 5.82288f, + 0.67561f, 55.08506f, + 0.67985f, 0.98953f, + 0.68848f, 0.02431f, + 0.69743f, 0.75692f, + 0.69940f, 0.41776f, + 0.71088f, 2.29372f, + 0.71473f, 9.88443f, + 0.71666f, 3.15179f, + 0.71976f, 1.57490f, + 0.72121f, 0.15977f, + 0.72569f, 0.25747f, + 0.73215f, 4.49475f, + 0.73242f, 1.17828f, + 0.73611f, 0.10706f, + 0.74660f, 0.50029f, + 0.75066f, 0.06441f, + 0.75918f, 0.66077f, + 0.76003f, 0.89356f, + 0.77072f, 6.95905f, + 0.77186f, 18.53232f, + 0.77303f, 1.82446f, + 0.78131f, 2.59582f, + 0.78137f, 0.37054f, + 0.78595f, 1.33439f, + 0.78988f, 0.20177f, + 0.79579f, 3.69204f, + 0.80621f, 12.12779f, + 0.80699f, 24.75305f, + 0.81287f, 0.04130f, + 0.81630f, 0.55362f, + 0.81694f, 0.29092f, + 0.81734f, 0.74874f, + 0.82110f, 1.06401f, + 0.82787f, 2.07876f, + 0.82981f, 5.00103f, + 0.84050f, 1.58158f, + 0.84438f, 2.89191f, + 0.84678f, 0.13416f, + 0.85616f, 0.44166f, + 0.86019f, 8.65103f, + 0.86346f, 0.01317f, + 0.86494f, 1.18927f, + 0.86577f, 0.09267f, + 0.86811f, 5.95882f, + 0.87117f, 0.84740f, + 0.87406f, 0.61269f, + 0.87981f, 0.23437f, + 0.88151f, 2.44548f, + 0.88504f, 0.33708f, + 0.88847f, 1.82180f, + 0.89206f, 3.31226f, + 0.89352f, 16.07224f, + 0.89868f, 0.17353f, + 0.90558f, 1.37396f, + 0.90956f, 4.04629f, + 0.91046f, 0.71437f, + 0.91555f, 0.95141f, + 0.91607f, 0.05802f, + 0.92133f, 0.50076f, + 0.92397f, 2.18529f, + 0.92943f, 6.99163f, + 0.93816f, 2.70762f, + 0.93915f, 10.79124f, + 0.93979f, 35.02379f, + 0.94373f, 0.29109f, + 0.94428f, 1.54440f, + 0.94915f, 1.11190f, + 0.94935f, 4.81827f, + 0.94963f, 0.39335f, + 0.95314f, 0.02810f, + 0.95605f, 0.62253f, + 0.96422f, 0.78364f, + 0.96502f, 1.90168f, + 0.96887f, 0.08041f, + 0.97223f, 3.22145f, + 0.97319f, 0.15476f, + 0.97937f, 0.21603f, + 0.99027f, 1.26402f, + 0.99060f, 2.42092f, + 0.99469f, 8.02656f, + 0.99661f, 20.50587f, + 0.99674f, 0.54301f, + 0.99823f, 5.86597f, + 0.99991f, 0.88884f, + 1.00124f, 0.33090f, + 1.00312f, 4.24275f, + 1.00328f, 1.65980f, + 1.02202f, 13.84765f, + 1.02395f, 0.69092f, + 1.02548f, 2.07584f, + 1.02556f, 0.12171f, + 1.02613f, 0.43643f, + 1.03316f, 1.03433f, + 1.03462f, 1.40902f, + 1.03999f, 2.82553f, + 1.05031f, 3.58878f, + 1.05184f, 0.26298f, + 1.06027f, 9.06668f, + 1.07241f, 0.79358f, + 1.07471f, 0.52241f, + 1.08008f, 1.76977f, + 1.08043f, 4.93935f, + 1.08062f, 45.38949f, + 1.08090f, 2.36074f, + 1.08304f, 1.15533f, + 1.08642f, 0.18015f, + 1.08996f, 0.06905f, + 1.09008f, 6.56321f, + 1.09044f, 0.01828f, + 1.09727f, 0.36021f, + 1.10075f, 0.62638f, + 1.11422f, 1.47205f, + 1.11535f, 0.93762f, + 1.11816f, 0.03576f, + 1.12340f, 0.10836f, + 1.13413f, 25.42389f, + 1.13994f, 2.96173f, + 1.14294f, 3.90159f, + 1.15382f, 0.04975f, + 1.15439f, 11.91982f, + 1.16090f, 16.73218f, + 1.16103f, 2.17967f, + 1.16117f, 0.68099f, + 1.16863f, 0.46714f, + 1.17332f, 1.18022f, + 1.17498f, 0.31199f, + 1.17616f, 9.51265f, + 1.18152f, 7.40048f, + 1.18372f, 0.24663f, + 1.18372f, 0.20126f, + 1.18610f, 0.14046f, + 1.18676f, 0.08978f, + 1.18699f, 5.55043f, + 1.18951f, 0.84044f, + 1.19478f, 1.59238f, + 1.19799f, 2.55164f, + 1.19820f, 1.89784f, + 1.19857f, 0.39387f, + 1.19888f, 0.56489f, + 1.19998f, 1.02889f, + 1.20345f, 3.31468f, + 1.20431f, 4.41910f, + 1.20567f, 1.32040f, + 1.21177f, 0.74548f +}; + +const float gp_gamma_1sfr_7b[2*128] = +{ + 0.02136f, 0.16576f, + 0.02610f, 0.04700f, + 0.02673f, 1.32916f, + 0.03917f, 0.38038f, + 0.06539f, 3.93015f, + 0.06590f, 0.78428f, + 0.07007f, 2.41347f, + 0.07073f, 0.12201f, + 0.08692f, 0.02273f, + 0.10144f, 0.26162f, + 0.12117f, 0.58428f, + 0.12817f, 0.06582f, + 0.13200f, 6.18738f, + 0.13542f, 1.05113f, + 0.14605f, 12.85127f, + 0.15252f, 1.88832f, + 0.17593f, 0.43086f, + 0.18150f, 24.88791f, + 0.19845f, 0.19059f, + 0.20102f, 0.09975f, + 0.21887f, 3.04712f, + 0.22650f, 0.80244f, + 0.22710f, 1.36678f, + 0.23569f, 0.04128f, + 0.24090f, 0.33017f, + 0.24423f, 4.39312f, + 0.25622f, 9.04696f, + 0.26686f, 0.01465f, + 0.30474f, 0.13696f, + 0.30653f, 0.51721f, + 0.33982f, 2.33214f, + 0.34572f, 0.96726f, + 0.34776f, 0.22391f, + 0.35921f, 1.66824f, + 0.37321f, 5.83958f, + 0.38246f, 0.29909f, + 0.38918f, 0.07567f, + 0.39258f, 0.03099f, + 0.40290f, 0.67440f, + 0.43384f, 3.82188f, + 0.44136f, 1.28810f, + 0.45720f, 0.39518f, + 0.46915f, 0.18114f, + 0.49155f, 7.58133f, + 0.49486f, 18.79692f, + 0.49964f, 2.78200f, + 0.50311f, 0.11426f, + 0.50988f, 1.82600f, + 0.51013f, 12.50225f, + 0.51163f, 0.85831f, + 0.53672f, 0.55661f, + 0.54568f, 0.24221f, + 0.58854f, 0.04842f, + 0.58856f, 1.13464f, + 0.59022f, 5.29180f, + 0.61432f, 0.31344f, + 0.62368f, 0.01799f, + 0.62503f, 3.37535f, + 0.62557f, 0.15698f, + 0.63586f, 2.17291f, + 0.64066f, 0.72903f, + 0.65002f, 0.46018f, + 0.67718f, 0.08632f, + 0.67719f, 1.47658f, + 0.68875f, 9.72347f, + 0.68911f, 32.65981f, + 0.72111f, 4.49107f, + 0.72523f, 0.94174f, + 0.73603f, 0.22351f, + 0.75271f, 16.69924f, + 0.75455f, 2.72292f, + 0.75633f, 0.36255f, + 0.76400f, 0.65651f, + 0.76595f, 6.66691f, + 0.77475f, 1.86222f, + 0.79933f, 1.19851f, + 0.80473f, 0.13963f, + 0.80852f, 0.51193f, + 0.82270f, 3.73825f, + 0.84176f, 0.02816f, + 0.84259f, 0.05841f, + 0.85838f, 0.27004f, + 0.86563f, 0.82004f, + 0.86743f, 2.29536f, + 0.88363f, 1.49460f, + 0.89140f, 5.36064f, + 0.89183f, 12.35149f, + 0.89905f, 8.20030f, + 0.90532f, 0.58773f, + 0.90588f, 0.39700f, + 0.91006f, 24.98023f, + 0.92596f, 0.19474f, + 0.92719f, 3.17426f, + 0.93316f, 1.03857f, + 0.94022f, 0.10069f, + 0.94912f, 1.92355f, + 0.98244f, 0.69665f, + 0.98723f, 4.12701f, + 0.99391f, 0.45338f, + 0.99688f, 1.30750f, + 0.99874f, 44.92089f, + 1.00074f, 0.30398f, + 1.00361f, 2.48072f, + 1.00432f, 6.80059f, + 1.00968f, 0.01556f, + 1.01623f, 10.59523f, + 1.03016f, 0.88271f, + 1.03693f, 0.16444f, + 1.03908f, 18.89908f, + 1.04942f, 1.71141f, + 1.08216f, 0.03947f, + 1.08519f, 2.81718f, + 1.09035f, 0.07394f, + 1.09092f, 0.49594f, + 1.09429f, 1.02772f, + 1.09931f, 4.69322f, + 1.14445f, 13.97163f, + 1.14663f, 0.22834f, + 1.14869f, 8.63215f, + 1.15982f, 0.12298f, + 1.16574f, 0.78265f, + 1.16644f, 0.35763f, + 1.17170f, 1.51544f, + 1.17199f, 5.76835f, + 1.17405f, 2.05383f, + 1.17523f, 0.58874f, + 1.18128f, 3.43730f, + 1.18605f, 1.15776f +}; + +const float gp_gamma_1sfr_6b[2*64] = +{ + 0.02662f, 0.35620f, + 0.02886f, 0.12384f, + 0.05872f, 0.03097f, + 0.06053f, 1.26461f, + 0.07678f, 3.09046f, + 0.08829f, 0.68582f, + 0.10444f, 0.24412f, + 0.11040f, 0.08899f, + 0.15678f, 8.15025f, + 0.15909f, 1.86873f, + 0.17247f, 0.48977f, + 0.17727f, 24.37615f, + 0.19825f, 0.05111f, + 0.21935f, 4.40219f, + 0.22361f, 0.15212f, + 0.22674f, 0.94328f, + 0.25832f, 0.01602f, + 0.28570f, 0.36784f, + 0.30922f, 12.93476f, + 0.31936f, 2.48635f, + 0.38038f, 1.35732f, + 0.38051f, 0.09521f, + 0.38075f, 0.21973f, + 0.38524f, 0.62092f, + 0.42799f, 0.03238f, + 0.44723f, 6.21713f, + 0.48877f, 3.39646f, + 0.53050f, 0.87060f, + 0.53522f, 0.31847f, + 0.54464f, 1.99023f, + 0.55504f, 0.15767f, + 0.63219f, 0.55908f, + 0.64035f, 0.05438f, + 0.64773f, 19.11642f, + 0.65402f, 1.48427f, + 0.67413f, 9.41877f, + 0.69087f, 4.69262f, + 0.71312f, 0.10928f, + 0.75159f, 0.21181f, + 0.76049f, 1.08676f, + 0.76781f, 0.01802f, + 0.77612f, 0.41533f, + 0.78253f, 2.60862f, + 0.86685f, 0.73032f, + 0.87435f, 33.14677f, + 0.89187f, 1.63714f, + 0.89264f, 6.41601f, + 0.89525f, 12.17085f, + 0.91060f, 0.07523f, + 0.92352f, 0.26853f, + 0.94457f, 3.60819f, + 0.97995f, 0.49732f, + 0.99345f, 0.96508f, + 0.99428f, 0.12950f, + 1.01209f, 2.04687f, + 1.02897f, 0.03326f, + 1.05102f, 17.03703f, + 1.06462f, 8.38911f, + 1.10284f, 4.88112f, + 1.11160f, 0.34356f, + 1.12908f, 0.17681f, + 1.13018f, 2.82130f, + 1.13048f, 0.64939f, + 1.13502f, 1.29540f +}; + + +const float gp_gamma_2sfr_7b[2*128] = +{ + 0.00607f, 2.39054f, + 0.00954f, 0.47393f, + 0.01025f, 1.13156f, + 0.01770f, 0.69243f, + 0.02670f, 0.86143f, + 0.02900f, 0.36511f, + 0.04481f, 1.44093f, + 0.05677f, 0.18129f, + 0.06916f, 0.29914f, + 0.06931f, 0.58281f, + 0.09094f, 0.99160f, + 0.11875f, 0.78403f, + 0.12072f, 32.79239f, + 0.12805f, 0.43746f, + 0.12919f, 1.87968f, + 0.14693f, 0.23271f, + 0.16393f, 0.66184f, + 0.17876f, 1.08413f, + 0.20774f, 0.52913f, + 0.21146f, 0.33304f, + 0.21176f, 0.82451f, + 0.22667f, 1.29470f, + 0.27074f, 0.96525f, + 0.27431f, 0.64919f, + 0.27900f, 0.42916f, + 0.27972f, 4.26235f, + 0.30501f, 1.65535f, + 0.32627f, 0.74124f, + 0.33076f, 0.21006f, + 0.33996f, 1.13073f, + 0.35145f, 0.51891f, + 0.35860f, 0.86393f, + 0.36177f, 0.33235f, + 0.37868f, 6.51886f, + 0.39024f, 12.56903f, + 0.39765f, 0.63998f, + 0.40513f, 1.42570f, + 0.40817f, 2.87488f, + 0.43002f, 2.06198f, + 0.43340f, 0.97173f, + 0.43475f, 0.40939f, + 0.43718f, 18.88363f, + 0.44833f, 0.75361f, + 0.46375f, 0.54756f, + 0.47932f, 1.22520f, + 0.51646f, 0.86275f, + 0.52785f, 0.64565f, + 0.53846f, 0.46049f, + 0.54240f, 1.07549f, + 0.54644f, 1.76965f, + 0.56866f, 0.26470f, + 0.58517f, 0.75438f, + 0.58905f, 1.35033f, + 0.59790f, 0.55874f, + 0.60132f, 0.95549f, + 0.61063f, 2.37370f, + 0.61285f, 0.37493f, + 0.64837f, 1.12469f, + 0.65662f, 0.64355f, + 0.66163f, 0.82985f, + 0.66799f, 1.54600f, + 0.67368f, 0.50148f, + 0.68300f, 3.65165f, + 0.70443f, 0.97799f, + 0.71587f, 1.25327f, + 0.72464f, 0.71612f, + 0.73632f, 0.31795f, + 0.75268f, 0.42125f, + 0.75309f, 2.14775f, + 0.75309f, 0.57562f, + 0.76160f, 0.86706f, + 0.76665f, 1.10985f, + 0.77299f, 1.64991f, + 0.80915f, 0.77262f, + 0.81281f, 1.32136f, + 0.81854f, 0.99876f, + 0.83675f, 0.63186f, + 0.83681f, 3.02209f, + 0.83687f, 0.48040f, + 0.85777f, 1.93471f, + 0.86131f, 0.87229f, + 0.86952f, 1.13226f, + 0.87613f, 1.46053f, + 0.87855f, 0.34269f, + 0.88214f, 0.19384f, + 0.89134f, 0.70978f, + 0.90866f, 0.95984f, + 0.92004f, 0.54981f, + 0.92222f, 1.24490f, + 0.93028f, 2.52260f, + 0.93695f, 0.80671f, + 0.94177f, 1.64620f, + 0.95825f, 1.05636f, + 0.96289f, 0.39904f, + 0.97439f, 0.65464f, + 0.97607f, 1.34420f, + 0.98128f, 0.88402f, + 0.99580f, 9.01834f, + 1.00135f, 2.01532f, + 1.01010f, 1.16279f, + 1.01723f, 0.74974f, + 1.02846f, 1.51554f, + 1.02849f, 0.94135f, + 1.03245f, 0.49354f, + 1.05191f, 0.60369f, + 1.05632f, 4.15579f, + 1.06623f, 1.06736f, + 1.07827f, 1.25591f, + 1.08027f, 0.82287f, + 1.08960f, 1.72193f, + 1.09072f, 0.28420f, + 1.10754f, 2.43024f, + 1.12653f, 0.95428f, + 1.12778f, 0.67641f, + 1.13450f, 1.41156f, + 1.14902f, 0.40686f, + 1.16032f, 3.38038f, + 1.16226f, 1.14385f, + 1.17713f, 0.54895f, + 1.18580f, 1.84337f, + 1.18686f, 0.74693f, + 1.19352f, 0.86699f, + 1.20171f, 1.54779f, + 1.20572f, 2.16971f, + 1.20617f, 1.02977f, + 1.20662f, 2.74485f, + 1.20688f, 1.28237f, + 1.20728f, 5.22483f +}; + + +const float gp_gamma_2sfr_6b[2*64] = +{ + 0.01130f, 0.59705f, + 0.02652f, 1.01430f, + 0.02794f, 0.28351f, + 0.06102f, 0.41178f, + 0.07430f, 0.77026f, + 0.07572f, 1.46777f, + 0.10914f, 0.18121f, + 0.12363f, 2.40953f, + 0.13197f, 0.51810f, + 0.14628f, 0.30909f, + 0.15972f, 0.92110f, + 0.20291f, 0.66321f, + 0.20694f, 1.21691f, + 0.23404f, 0.40495f, + 0.27484f, 33.61382f, + 0.28250f, 0.79452f, + 0.30145f, 1.75124f, + 0.31141f, 0.53656f, + 0.32351f, 0.23494f, + 0.33936f, 0.99733f, + 0.38508f, 3.72779f, + 0.40108f, 0.65367f, + 0.41319f, 0.40008f, + 0.42662f, 1.25364f, + 0.43246f, 9.93625f, + 0.45774f, 0.83578f, + 0.51009f, 1.61477f, + 0.51585f, 0.50984f, + 0.55413f, 1.04889f, + 0.56694f, 0.69123f, + 0.60142f, 2.29733f, + 0.60208f, 0.32174f, + 0.63695f, 16.75804f, + 0.64385f, 0.85349f, + 0.64786f, 1.32201f, + 0.67202f, 0.55054f, + 0.72879f, 1.03555f, + 0.74357f, 0.71744f, + 0.76140f, 1.79730f, + 0.78523f, 0.43896f, + 0.81538f, 1.20775f, + 0.81979f, 0.86215f, + 0.82523f, 3.16953f, + 0.86528f, 0.66633f, + 0.87274f, 0.25452f, + 0.88210f, 1.51311f, + 0.90326f, 0.99246f, + 0.93081f, 0.53871f, + 0.95916f, 2.20734f, + 0.96174f, 1.28996f, + 0.96917f, 0.82441f, + 0.99824f, 6.35842f, + 1.00335f, 0.36563f, + 1.02237f, 1.09680f, + 1.03188f, 0.64719f, + 1.04846f, 1.61469f, + 1.09185f, 0.91916f, + 1.11199f, 4.24727f, + 1.14659f, 0.48521f, + 1.15873f, 2.64461f, + 1.16374f, 1.37282f, + 1.17310f, 0.74954f, + 1.18098f, 1.86320f, + 1.18544f, 1.08087f +}; + +const float gp_gamma_3sfr_6b[2*64] = +{ + 0.01192f, 0.29245f, + 0.04985f, 0.56198f, + 0.07032f, 1.20261f, + 0.08337f, 0.36774f, + 0.08405f, 0.80061f, + 0.09313f, 1.76147f, + 0.09580f, 0.19048f, + 0.13781f, 0.46427f, + 0.15191f, 1.01263f, + 0.17911f, 0.66093f, + 0.19176f, 0.31423f, + 0.21095f, 3.33105f, + 0.24351f, 0.84426f, + 0.25383f, 1.38475f, + 0.25558f, 0.52730f, + 0.26697f, 2.41458f, + 0.32244f, 1.02709f, + 0.33147f, 0.25578f, + 0.33614f, 0.69549f, + 0.35169f, 0.41222f, + 0.41458f, 1.21107f, + 0.41759f, 0.87121f, + 0.42537f, 0.59296f, + 0.46820f, 1.57552f, + 0.51038f, 0.47823f, + 0.51562f, 1.03574f, + 0.52553f, 0.74288f, + 0.56848f, 2.12515f, + 0.59985f, 0.33289f, + 0.60551f, 13.69166f, + 0.61194f, 0.89674f, + 0.62213f, 0.60927f, + 0.62628f, 1.28489f, + 0.70519f, 0.76916f, + 0.71649f, 1.72293f, + 0.71964f, 1.05889f, + 0.73148f, 8.45570f, + 0.73217f, 0.48093f, + 0.77896f, 26.25153f, + 0.78396f, 2.95227f, + 0.80147f, 0.90896f, + 0.80167f, 0.66149f, + 0.80656f, 1.44516f, + 0.86294f, 1.18805f, + 0.88649f, 0.81413f, + 0.90213f, 2.01099f, + 0.90474f, 0.55259f, + 0.91649f, 0.33485f, + 0.93167f, 1.03017f, + 0.96578f, 5.28431f, + 0.97308f, 1.36442f, + 0.97409f, 0.70362f, + 0.99790f, 0.92401f, + 1.05048f, 1.12005f, + 1.05996f, 1.76024f, + 1.06915f, 0.46437f, + 1.08636f, 0.80929f, + 1.10286f, 2.76431f, + 1.13708f, 3.74909f, + 1.15280f, 1.23892f, + 1.16077f, 0.62175f, + 1.17824f, 0.96656f, + 1.18408f, 2.17545f, + 1.18487f, 1.49786f +}; + +const float gp_gamma_4sfr_6b[2*64] = +{ + 0.00934f, 0.27565f, + 0.01721f, 0.97811f, + 0.02433f, 0.46654f, + 0.04781f, 0.72086f, + 0.06776f, 1.45241f, + 0.08727f, 0.35723f, + 0.08791f, 3.41441f, + 0.09299f, 2.13125f, + 0.09778f, 0.57872f, + 0.11158f, 0.19319f, + 0.12208f, 0.85691f, + 0.16346f, 0.44503f, + 0.17183f, 1.17256f, + 0.18821f, 0.67810f, + 0.23565f, 0.93068f, + 0.25353f, 0.31870f, + 0.25723f, 0.55721f, + 0.27028f, 1.43169f, + 0.30369f, 0.74972f, + 0.33457f, 1.10643f, + 0.33886f, 0.45699f, + 0.37588f, 1.81394f, + 0.39890f, 0.91791f, + 0.40041f, 0.63732f, + 0.44484f, 0.33746f, + 0.45345f, 1.29581f, + 0.45454f, 20.73460f, + 0.48041f, 0.79572f, + 0.51620f, 0.51876f, + 0.52239f, 1.07372f, + 0.52970f, 2.77458f, + 0.57723f, 0.69551f, + 0.58187f, 1.53270f, + 0.60145f, 0.92017f, + 0.64601f, 11.29119f, + 0.65868f, 7.45030f, + 0.66000f, 0.40154f, + 0.66097f, 0.58966f, + 0.67054f, 1.18310f, + 0.69460f, 0.84554f, + 0.69993f, 2.09527f, + 0.76202f, 0.69518f, + 0.77672f, 1.01521f, + 0.78020f, 1.40843f, + 0.82725f, 0.50517f, + 0.84005f, 0.27186f, + 0.84739f, 0.84066f, + 0.85816f, 5.06160f, + 0.87075f, 1.17031f, + 0.87474f, 1.80610f, + 0.91532f, 0.65903f, + 0.93722f, 0.94775f, + 0.94762f, 1.39061f, + 1.00344f, 1.14608f, + 1.00732f, 0.77084f, + 1.01480f, 0.39878f, + 1.05149f, 2.51385f, + 1.07194f, 1.57173f, + 1.07599f, 1.01017f, + 1.10831f, 3.54277f, + 1.11815f, 0.59230f, + 1.17359f, 0.85449f, + 1.17572f, 1.24171f, + 1.18513f, 1.93190f +}; + +const float gp_gamma_3sfr_7b[2 * 128] = +{ + 0.00865f, 0.40471f, + 0.01641f, 1.63341f, + 0.02167f, 0.75295f, + 0.02874f, 0.24338f, + 0.05766f, 0.51846f, + 0.07340f, 0.98428f, + 0.07987f, 1.25111f, + 0.08451f, 0.29394f, + 0.08540f, 0.14777f, + 0.09367f, 0.63210f, + 0.11201f, 2.44561f, + 0.11427f, 0.42379f, + 0.14021f, 0.86607f, + 0.15229f, 0.23996f, + 0.16463f, 0.70037f, + 0.17395f, 0.35419f, + 0.17828f, 0.53648f, + 0.17931f, 1.07884f, + 0.20466f, 5.82498f, + 0.22376f, 0.77086f, + 0.22945f, 3.42933f, + 0.23138f, 1.90019f, + 0.23426f, 0.44019f, + 0.23982f, 1.48207f, + 0.24251f, 0.28006f, + 0.24876f, 0.61321f, + 0.26424f, 0.92069f, + 0.28620f, 1.22079f, + 0.30140f, 0.34959f, + 0.30965f, 0.52114f, + 0.31841f, 0.74182f, + 0.33689f, 1.01697f, + 0.37165f, 0.62766f, + 0.37534f, 0.43189f, + 0.38132f, 0.84476f, + 0.38172f, 2.11601f, + 0.40019f, 0.25729f, + 0.41206f, 1.43166f, + 0.41344f, 1.14675f, + 0.43580f, 33.98968f, + 0.44295f, 0.71632f, + 0.44526f, 0.52655f, + 0.44646f, 0.94462f, + 0.49572f, 0.39871f, + 0.50137f, 2.96082f, + 0.50856f, 1.05144f, + 0.51187f, 1.64612f, + 0.51781f, 0.61412f, + 0.51784f, 1.29055f, + 0.51900f, 0.77229f, + 0.55414f, 0.88953f, + 0.58248f, 0.48809f, + 0.59127f, 2.06340f, + 0.59354f, 22.44840f, + 0.59373f, 0.65712f, + 0.60194f, 1.17932f, + 0.61898f, 0.30882f, + 0.62738f, 0.97385f, + 0.63155f, 0.76911f, + 0.63357f, 1.46808f, + 0.66527f, 0.56098f, + 0.68601f, 1.10258f, + 0.69445f, 0.41165f, + 0.69513f, 0.85397f, + 0.70384f, 1.80971f, + 0.70591f, 0.66275f, + 0.70766f, 1.33644f, + 0.71019f, 14.11858f, + 0.74321f, 0.99520f, + 0.74713f, 2.41354f, + 0.76097f, 0.74551f, + 0.77096f, 0.49634f, + 0.77874f, 1.58071f, + 0.78600f, 0.89484f, + 0.78622f, 1.21172f, + 0.80325f, 0.61147f, + 0.80832f, 3.30644f, + 0.82039f, 1.04192f, + 0.83131f, 0.82205f, + 0.84566f, 1.40404f, + 0.84809f, 1.95044f, + 0.85738f, 0.69316f, + 0.86370f, 0.38944f, + 0.86491f, 1.14593f, + 0.87637f, 0.93203f, + 0.90150f, 0.54781f, + 0.90194f, 0.28107f, + 0.90396f, 0.77651f, + 0.91344f, 1.67514f, + 0.91460f, 1.27995f, + 0.92238f, 1.02473f, + 0.94031f, 0.64483f, + 0.94823f, 0.86409f, + 0.95213f, 2.18820f, + 0.95429f, 9.66209f, + 0.96577f, 1.13735f, + 0.96995f, 1.43937f, + 0.98642f, 0.73183f, + 0.98976f, 0.44851f, + 0.99279f, 0.96412f, + 1.01364f, 1.24786f, + 1.01384f, 4.90447f, + 1.03181f, 1.56947f, + 1.03190f, 0.84672f, + 1.03222f, 0.60701f, + 1.03298f, 2.76511f, + 1.04745f, 1.06143f, + 1.07766f, 1.85857f, + 1.07997f, 1.32889f, + 1.08258f, 0.73253f, + 1.09754f, 0.93681f, + 1.11974f, 0.56220f, + 1.12138f, 1.14494f, + 1.12727f, 7.08531f, + 1.13826f, 0.35750f, + 1.15349f, 3.91202f, + 1.15512f, 0.78878f, + 1.15719f, 1.39107f, + 1.17458f, 1.67543f, + 1.17838f, 0.47999f, + 1.18700f, 2.35013f, + 1.18745f, 0.65409f, + 1.18763f, 1.02774f, + 1.19631f, 0.88967f, + 1.20234f, 1.21708f, + 1.20388f, 3.09276f, + 1.20777f, 1.95577f, + 1.22262f, 1.46383f, +}; + +const float gp_gamma_4sfr_7b[2 * 128] = +{ + 0.00614f, 0.34082f, + 0.01391f, 1.05762f, + 0.02443f, 0.52528f, + 0.04487f, 0.81638f, + 0.04874f, 0.21725f, + 0.06993f, 1.56640f, + 0.07629f, 0.67352f, + 0.07879f, 2.22313f, + 0.08098f, 0.43740f, + 0.09023f, 3.33077f, + 0.09505f, 0.95967f, + 0.11885f, 0.57584f, + 0.12134f, 1.24892f, + 0.14301f, 0.75409f, + 0.14566f, 0.41623f, + 0.15510f, 0.25942f, + 0.17725f, 5.62734f, + 0.19522f, 0.88867f, + 0.19554f, 1.43765f, + 0.19650f, 0.53939f, + 0.21138f, 1.07147f, + 0.22636f, 0.66964f, + 0.22834f, 0.34542f, + 0.27047f, 0.44208f, + 0.27343f, 1.81016f, + 0.27564f, 0.77386f, + 0.27753f, 1.21557f, + 0.29907f, 0.56678f, + 0.30585f, 0.98300f, + 0.34187f, 1.45000f, + 0.34276f, 0.33704f, + 0.34717f, 0.83633f, + 0.36470f, 0.65856f, + 0.37820f, 11.45604f, + 0.38412f, 0.49390f, + 0.38418f, 1.13346f, + 0.38485f, 2.05689f, + 0.41457f, 0.93744f, + 0.42426f, 0.76410f, + 0.43646f, 0.41444f, + 0.44541f, 1.31106f, + 0.45622f, 0.61947f, + 0.47346f, 1.04294f, + 0.48320f, 1.67147f, + 0.50019f, 2.83094f, + 0.50036f, 0.85433f, + 0.50221f, 0.50957f, + 0.51480f, 0.30050f, + 0.51835f, 1.21580f, + 0.52200f, 0.69921f, + 0.56910f, 0.96246f, + 0.57210f, 1.45228f, + 0.57318f, 0.42340f, + 0.57432f, 0.57850f, + 0.59272f, 27.62970f, + 0.59273f, 0.79098f, + 0.59350f, 1.16826f, + 0.61815f, 2.22627f, + 0.62550f, 17.18756f, + 0.63421f, 0.67201f, + 0.64271f, 1.72413f, + 0.64340f, 1.05779f, + 0.64445f, 0.50287f, + 0.65749f, 0.86135f, + 0.67595f, 1.29639f, + 0.69966f, 0.59417f, + 0.70254f, 0.38318f, + 0.70504f, 4.35573f, + 0.70641f, 0.97924f, + 0.70865f, 0.76389f, + 0.74185f, 1.53170f, + 0.74492f, 1.12407f, + 0.75096f, 0.25992f, + 0.75760f, 0.66983f, + 0.76031f, 0.16414f, + 0.76100f, 0.86861f, + 0.77722f, 0.48258f, + 0.79164f, 1.24884f, + 0.79787f, 2.75496f, + 0.80213f, 1.92062f, + 0.80316f, 0.97431f, + 0.81517f, 0.75442f, + 0.82155f, 0.58120f, + 0.84462f, 1.38613f, + 0.84535f, 1.07504f, + 0.85024f, 0.83797f, + 0.88172f, 0.66936f, + 0.88187f, 0.33166f, + 0.88569f, 0.91259f, + 0.88687f, 1.67317f, + 0.89706f, 1.21637f, + 0.90149f, 8.92420f, + 0.90534f, 0.44771f, + 0.92077f, 0.99975f, + 0.92235f, 0.75611f, + 0.94772f, 1.12123f, + 0.94920f, 2.19992f, + 0.95049f, 1.49214f, + 0.95591f, 0.56753f, + 0.95686f, 0.86312f, + 0.97999f, 1.26652f, + 0.98876f, 0.99169f, + 0.99623f, 0.72017f, + 1.02046f, 1.14467f, + 1.02732f, 1.82793f, + 1.02752f, 0.87845f, + 1.03568f, 1.37180f, + 1.04905f, 0.61431f, + 1.06354f, 1.05062f, + 1.07911f, 0.77211f, + 1.08693f, 0.40802f, + 1.08979f, 1.54546f, + 1.10192f, 3.63558f, + 1.10610f, 0.92030f, + 1.11530f, 1.23483f, + 1.12457f, 6.79334f, + 1.13708f, 2.42086f, + 1.15646f, 0.27866f, + 1.15650f, 5.03152f, + 1.16276f, 0.51614f, + 1.16381f, 0.68259f, + 1.16652f, 0.98092f, + 1.17818f, 2.98864f, + 1.19029f, 1.63347f, + 1.19374f, 0.82502f, + 1.19452f, 1.35079f, + 1.20038f, 1.97983f, + 1.20145f, 1.11183f, +}; + + +/*----------------------------------------------------------------------------------* + * Transition coding - gain quantization table + *----------------------------------------------------------------------------------*/ + +const float tbl_gain_code_tc[N_GAIN_CODE_TC] = +{ + 0.36201f, + 0.72382f, + 0.96727f, + 1.1856f, + 1.4119f, + 1.679f, + 2.0743f, + 3.3301f +}; + +/*-----------------------------------------------------------------* + * Transition coding - gain quantization table for g_trans + *-----------------------------------------------------------------*/ + +const float tbl_gain_trans_tc[N_GAIN_TC] = +{ + 35.8449f, + 86.7884f, + 150.0926f, + 233.3001f, + 346.0286f, + 511.5196f, + 819.6746f, + 1500.0f +}; + +/*-----------------------------------------------------------------* + * Transition coding - table of prototype glottal impulses + *-----------------------------------------------------------------*/ + +const float glottal_cdbk[L_IMPULSE*NUM_IMPULSE] = +{ + /* impulse 0 */ + -0.0873f, -0.2063f, -0.3544f, -0.2126f, -0.1581f, -0.5208f, + -0.5973f, 0.2106f, 1.0000f, 0.7095f, -0.0767f, -0.2388f, + 0.0709f, 0.1143f, -0.0099f, 0.1015f, 0.1852f, + /* impulse 1 */ + -0.2646f, -0.1655f, -0.0493f, -0.3314f, -0.5455f, -0.2641f, + -0.2661f, -0.9837f, -1.1157f, 0.1420f, 1.2626f, 0.8151f, + -0.2146f, -0.3466f, 0.0460f, 0.0398f, -0.0598f, + /* impulse 2 */ + 0.0440f, 0.0685f, 0.5108f, 0.3092f, -0.4060f, -0.3111f, + 0.2513f, -0.2578f, -1.1648f, -0.7488f, 0.1596f, 0.0151f, + -0.4176f, -0.1788f, 0.0580f, -0.1082f, -0.1541f, + /* impulse 3 */ + -0.1579f, -0.0873f, -0.0224f, -0.1885f, -0.2000f, -0.0267f, + -0.4276f, -1.1485f, -0.9711f, -0.1718f, -0.0348f, -0.3044f, + 0.0372f, 0.5686f, 0.4015f, 0.0141f, 0.1816f, + /* impulse 4 */ + 0.1022f, 0.3080f, 0.2984f, 0.3270f, 0.7278f, 0.8466f, + -0.1128f, -1.2094f, -0.9235f, 0.0785f, 0.1648f, -0.3146f, + -0.2563f, -0.0338f, -0.1887f, -0.2782f, -0.1077f, + /* impulse 5 */ + -0.0510f, -0.1082f, -0.0058f, -0.0603f, -0.2891f, -0.2515f, + -0.1505f, -0.6434f, -1.2732f, -0.8490f, 0.4029f, 0.9251f, + 0.3172f, -0.2032f, -0.0563f, 0.0897f, -0.0221f, + /* impulse 6 */ + -0.0570f, -0.2277f, -0.1776f, -0.0155f, -0.2296f, -0.4609f, + 0.1004f, 1.0174f, 1.0000f, 0.1053f, -0.3371f, -0.0458f, + 0.0924f, -0.0681f, -0.0348f, 0.0797f, 0.0183f, + /* impulse 7 */ + 0.1327f, 0.0575f, -0.0754f, 0.0862f, 0.1887f, -0.1959f, + -0.3975f, 0.2925f, 0.9839f, 0.6334f, -0.0121f, -0.0045f, + 0.1349f, -0.0815f, -0.1751f, -0.0072f, -0.0099f +}; + +/*----------------------------------------------------------------------------------* + * AMR-WB IO WB BWE - deemphasis + *----------------------------------------------------------------------------------*/ + +const float deem_tab[56] = +{ + 0.630730419421360f, 0.629416164964296f, 0.628129905227103f, 0.626871385453679f, 0.625640357452226f, 0.624436579475560f, 0.623259816105156f, + 0.622109838138814f, 0.620986422481867f, 0.619889352041818f, 0.618818415626335f, 0.617773407844493f, 0.616754129011203f, 0.615760385054730f, + 0.614791987427225f, 0.613848753018209f, 0.612930504070914f, 0.612037068101433f, 0.611168277820597f, 0.610323971058526f, 0.609503990691786f, + 0.608708184573088f, 0.607936405463484f, 0.607188510967000f, 0.606464363467645f, 0.605763830068759f, 0.605086782534647f, 0.604433097234441f, + 0.603802655088168f, 0.603195341514964f, 0.602611046383395f, 0.602049663963857f, 0.601511092883003f, 0.600995236080178f, 0.600502000765808f, + 0.600031298381734f, 0.599583044563439f, 0.599157159104159f, 0.598753565920828f, 0.598372193021851f, 0.598012972476677f, 0.597675840387130f, + 0.597360736860508f, 0.597067605984399f, 0.596796395803217f, 0.596547058296428f, 0.596319549358454f, 0.596113828780239f, 0.595929860232466f, + 0.595767611250409f, 0.595627053220407f, 0.595508161367956f, 0.595410914747406f, 0.595335296233253f, 0.595281292513031f, 0.595248894081778f +}; + +const float filt_hp[56] = +{ + 0.001610570549503f, 0.004682981184545f, 0.008349027644995f, 0.012654118680910f, 0.017642537255539f, 0.023357023549788f, + 0.029838357405517f, 0.037124944278684f, 0.045252408764306f, 0.054253199698241f, 0.064156210737117f, 0.074986420169406f, + 0.086764553520305f, 0.099506772283889f, 0.113224391851657f, 0.127923631411203f, 0.143605398266754f, 0.160265108689438f, + 0.177892547044310f, 0.196471764568281f, 0.215981018793259f, 0.236392754226835f, 0.257673624523579f, 0.279784556007892f, + 0.302680852048711f, 0.326312337440982f, 0.350623541622164f, 0.375553919247241f, 0.401038106365070f, 0.427006210184762f, + 0.453384130194306f, 0.480093908196193f, 0.507054104656542f, 0.534180198625471f, 0.561385008376586f, 0.588579129831778f, + 0.615671389782721f, 0.642569310891142f, 0.669179585444241f, 0.695408554857669f, 0.721162691954086f, 0.746349083098340f, + 0.770875907338563f, 0.794652909783784f, 0.817591866540936f, 0.839607038635485f, 0.860615612448599f, 0.880538124318166f, + 0.899298867069991f, 0.916826276367851f, 0.933053294896263f, 0.947917712517199f, 0.961362480671352f, 0.973335999426038f, + 0.983792375705577f, 0.992691651376520f +}; + +/* table of values exp(-j*w*i) */ +const float exp_tab_q[34] = +{ + 1.000000000000000f, -0.980785280403230f, 0.923879532511287f, -0.831469612302544f, + 0.707106781186547f, -0.555570233019602f, 0.382683432365086f, -0.195090322016125f, + -0.000000000000003f, 0.195090322016130f, -0.382683432365091f, 0.555570233019606f, + -0.707106781186553f, 0.831469612302547f, -0.923879532511289f, 0.980785280403231f, + -1.000000000000000f, 0.000000000000000f, -0.195090322016129f, 0.382683432365090f, + -0.555570233019604f, 0.707106781186549f, -0.831469612302546f, 0.923879532511288f, + -0.980785280403231f, 1.000000000000000f, -0.980785280403230f, 0.923879532511286f, + -0.831469612302543f, 0.707106781186542f, -0.555570233019599f, 0.382683432365084f, + -0.195090322016126f, -0.000000000000005f +}; + +const float exp_tab_p[34] = +{ + 1.000000000000000f, -0.707106781186548f, -0.000000000000000f, 0.707106781186548f, + -1.000000000000000f, 0.707106781186547f, 0.000000000000000f, -0.707106781186547f, + 1.000000000000000f, -0.707106781186546f, -0.000000000000003f, 0.707106781186548f, + -1.000000000000000f, 0.707106781186546f, -0.000000000000000f, -0.707106781186548f, + 1.000000000000000f, 0.000000000000000f, -0.707106781186548f, 1.000000000000000f, + -0.707106781186547f, -0.000000000000000f, 0.707106781186549f, -1.000000000000000f, + 0.707106781186548f, 0.000000000000000f, -0.707106781186549f, 1.000000000000000f, + -0.707106781186548f, 0.000000000000000f, 0.707106781186549f, -1.000000000000000f, + 0.707106781186547f, 0.000000000000000f +}; + +/* gains for 23k85 mode */ +const float HP_gain[16] = +{ + /* values in Q15: 3624, 4673, 5597, 6479, 7425, 8378, 9324, 10264, 11210, 12206, 13391, 14844, 16770, 19655, 24289, 32728 */ + 0.110595703125000f, 0.142608642578125f, 0.170806884765625f, 0.197723388671875f, + 0.226593017578125f, 0.255676269531250f, 0.284545898437500f, 0.313232421875000f, + 0.342102050781250f, 0.372497558593750f, 0.408660888671875f, 0.453002929687500f, + 0.511779785156250f, 0.599822998046875f, 0.741241455078125f, 0.998779296875000f +}; + +/* band-pass 6-8kHz filter */ +const float fir_6k_8k[31]= +{ + 0.001331237773450f, -0.004734562657574f, 0.009865692979275f, -0.014704482109862f, + 0.017170883692091f, -0.018004559024736f, 0.022168155759205f, -0.036012990296002f, + 0.060614595353634f, -0.086000479894051f, 0.092413785317631f, -0.060769441864153f, + -0.012918738234409f, 0.109335430548556f, -0.191677822804549f, 0.224071909378974f, + -0.191677822804549f, 0.109335430548556f, -0.012918738234409f, -0.060769441864153f, + 0.092413785317631f, -0.086000479894051f, 0.060614595353634f, -0.036012990296002f, + 0.022168155759205f, -0.018004559024736f, 0.017170883692091f, -0.014704482109862f, + 0.009865692979275f, -0.004734562657574f, 0.001331237773450f +}; + + +/*----------------------------------------------------------------------------------* + * 2nd order high-pass filter with cut-off frequency at 400 Hz. + * Designed with Chebyshev of 2nd type + * Optimized for fixed-point to get the following frequency response: + * + * frequency: 0Hz 100Hz 200Hz 300Hz 400Hz 630Hz 1.5kHz 3kHz + * dB loss: -infdB -30dB -20dB -10dB -3dB +6dB +1dB 0dB + * + * Algorithm: + * + * y[i] = b[0]*x[i] + b[1]*x[i-1] + b[2]*x[i-2] + * + a[1]*y[i-1] + a[2]*y[i-2]; + * + * short b[3] = {3660, -7320, 3660}; in Q12 + * short a[3] = {4096, 7320, -3540}; in Q12 + *----------------------------------------------------------------------------------*/ + +const float b_hp400[3] = { 0.893554687f, -1.787109375f, 0.893554687f }; +const float a_hp400[3] = { 1.000000000f, 1.787109375f, -0.864257812f }; + +/*----------------------------------------------------------------------------------* + * 15th-order band-pass 6kHz to 7kHz FIR filter. + * + * frequency: 4kHz 5kHz 5.5kHz 6kHz 6.5kHz 7kHz 7.5kHz 8kHz + * dB loss: -60dB -45dB -13dB -3dB 0dB -3dB -13dB -45dB + * + * gain = 4.0 + *----------------------------------------------------------------------------------*/ + +const float fir_6k_7k[31] = +{ + -0.001005f, 0.001428f, 0.000965f, -0.000863f, -0.011296f, + 0.034231f, -0.043397f, -0.000000f, 0.115906f, -0.271028f, + 0.376868f, -0.335243f, 0.108276f, 0.237003f, -0.549363f, + 0.675000f, -0.549363f, 0.237003f, 0.108276f, -0.335243f, + 0.376868f, -0.271028f, 0.115906f, -0.000000f, -0.043397f, + 0.034231f, -0.011296f, -0.000863f, 0.000965f, 0.001428f, + -0.001005f +}; + +/*----------------------------------------------------------------------------------* + * Enhacer - 2.0 - 6.4 kHz impulse response with phase dispersion in freq. domain + *----------------------------------------------------------------------------------*/ + +const float low_H[L_SUBFR] = +{ + 1.000300f, 0.999812f, 1.000125f, 0.999868f, 0.999879f, 0.999935f, 0.999838f, 0.999992f, 1.000076f, 0.626554f, 0.619763f, 0.603882f, 0.857647f, 0.997470f, -0.032403f, + 0.806652f, 0.999300f, 0.946634f, 0.574139f, 0.973425f, 0.288464f, 0.890704f, 0.635021f, 0.597882f, -0.997076f, -0.110774f, -0.648392f, 0.771888f, 0.888411f, -0.774123f, + 0.695109f, 0.498998f, 0.999900f, -0.866525f, 0.719081f, 0.633481f, 0.458722f, 0.636210f, -0.761251f, 0.993932f, -0.073228f, -0.801816f, 0.772627f, -0.454461f, 0.957250f, + -0.229682f, -0.818972f, -0.322274f, 0.031800f, -0.591141f, -0.999439f, -0.074385f, 0.514882f, -0.797032f, -0.784999f, -0.779712f, -0.000028f, 0.000164f, 0.000029f, -0.000135f, + -0.000047f, -0.000033f, -0.000080f, 0.000099f +}; + +/*----------------------------------------------------------------------------------* + * Enhancer - 3.2 - 6.4 kHz impulse response with phase dispersion in freq. domain + *----------------------------------------------------------------------------------*/ + +const float mid_H[L_SUBFR] = +{ + 0.999900f, 0.999848f, 1.000003f, 1.000048f, 1.000107f, 1.000242f, 1.000165f, 0.999909f, 1.000212f, 0.999933f, 1.000099f, 1.000100f, 1.000113f, 1.000018f, 0.999901f, 1.000267f, + 0.906200f, 0.587715f, 0.808629f, 0.884216f, 0.671089f, 0.039238f, 0.843369f, 0.841006f, 0.394788f, 0.528863f, 0.710110f, 0.596973f, -0.893309f, -0.059908f, 0.716925f, -0.044067f, + 1.000100f, -0.998848f, -0.697170f, 0.998190f, 0.449397f, 0.802480f, -0.704198f, -0.848591f, -0.918649f, -0.540881f, 0.537822f, -0.999200f, -0.741318f, 0.467580f, -0.588204f, + -0.808928f, -0.422500f, 0.000219f, -0.000261f, -0.000086f, -0.000313f, 0.000080f, 0.000406f, 0.000351f, -0.000449f, -0.000065f, 0.000214f, -0.000254f, 0.000002f, -0.000090f, + -0.000198f, 0.000193f +}; + +/*-------------------------------------------------------------------* + * Low-pass FIR filter for low-freq post-filtering + * response : 0dB @ 50Hz, -6dB @ 500Hz, -45dB @ 1kHz) + * filter parameters: fs/2=8000, fc=500, gain=1.0, n=16 + *-------------------------------------------------------------------*/ + +const float tab_hup_l[SIZ_TAB_HUP_L] = +{ + -0.001246f, 0.002200f, -0.004791f, 0.009621f, -0.017685f, 0.031212f, -0.057225f, 0.135470f, 0.973955f, -0.103495f, 0.048663f, -0.027090f, 0.015280f, -0.008160f, + 0.003961f, -0.001827f, -0.002388f, 0.004479f, -0.009715f, 0.019261f, -0.035118f, 0.061945f, -0.115187f, 0.294161f, 0.898322f, -0.170283f, 0.083211f, -0.046645f, + 0.026210f, -0.013854f, 0.006641f, -0.003099f, -0.003277f, 0.006456f, -0.013906f, 0.027229f, -0.049283f, 0.086990f, -0.164590f, 0.464041f, 0.780309f, -0.199879f, + 0.100795f, -0.056792f, 0.031761f, -0.016606f, 0.007866f, -0.003740f, -0.003770f, 0.007714f, -0.016462f, 0.031849f, -0.057272f, 0.101294f, -0.195755f, 0.630993f, + 0.630993f, -0.195755f, 0.101294f, -0.057272f, 0.031849f, -0.016462f, 0.007714f, -0.003770f, -0.003740f, 0.007866f, -0.016606f, 0.031761f, -0.056792f, 0.100795f, + -0.199879f, 0.780309f, 0.464041f, -0.164590f, 0.086990f, -0.049283f, 0.027229f, -0.013906f, 0.006456f, -0.003277f, -0.003099f, 0.006641f, -0.013854f, 0.026210f, + -0.046645f, 0.083211f, -0.170283f, 0.898322f, 0.294161f, -0.115187f, 0.061945f, -0.035118f, 0.019261f, -0.009715f, 0.004479f, -0.002388f, -0.001827f, 0.003961f, + -0.008160f, 0.015280f, -0.027090f, 0.048663f, -0.103495f, 0.973955f, 0.135470f, -0.057225f, 0.031212f, -0.017685f, 0.009621f, -0.004791f, 0.002200f, -0.001246f +}; + +const float tab_hup_s[SIZ_TAB_HUP_S] = +{ + -0.005772f, 0.087669f, 0.965882f, -0.048753f, -0.014793f, 0.214886f, 0.868791f, -0.065537f, -0.028507f, 0.374334f, 0.723418f, -0.060834f, -0.045567f, 0.550847f, + 0.550847f, -0.045567f, -0.060834f, 0.723418f, 0.374334f, -0.028507f, -0.065537f, 0.868791f, 0.214886f, -0.014793f, -0.048753f, 0.965882f, 0.087669f, -0.005772f +}; + +/*-------------------------------------------------------------------* + * Bass post-filter + *-------------------------------------------------------------------*/ + +const float filt_lp[1+L_FILT] = +{ + 0.088250f, 0.086410f, 0.081074f, 0.072768f, 0.062294f, 0.050623f, 0.038774f, 0.027692f, + 0.018130f, 0.010578f, 0.005221f, 0.001946f, 0.000385f +}; + +const float filt_lp_16kHz[1+L_FILT16k] = +{ + 0.071410f, 0.070433f, 0.067568f, 0.062999f, 0.057020f, 0.050005f, + 0.042378f, 0.034577f, 0.027022f, 0.020078f, 0.014031f, 0.009070f, + 0.005276f, 0.002625f, 0.000999f, 0.000205f +}; + +/*-------------------------------------------------------------------* + * Pulse indexing tables for ACELP innovation coding + *-------------------------------------------------------------------*/ + +const int32_t PI_select_table[23][8] = +{ + {1, 0, 0, 0, 0, 0, 0, 0}, + {1, 1, 0, 0, 0, 0, 0, 0}, + {1, 2, 1, 0, 0, 0, 0, 0}, + {1, 3, 3, 1, 0, 0, 0, 0}, + {1, 4, 6, 4, 1, 0, 0, 0}, + {1, 5, 10, 10, 5, 1, 0, 0}, + {1, 6, 15, 20, 15, 6, 1, 0}, + {1, 7, 21, 35, 35, 21, 7, 1}, + {1, 8, 28, 56, 70, 56, 28, 8}, + {1, 9, 36, 84, 126, 126, 84, 36}, + {1, 10, 45, 120, 210, 252, 210, 120}, + {1, 11, 55, 165, 330, 462, 462, 330}, + {1, 12, 66, 220, 495, 792, 924, 792}, + {1, 13, 78, 286, 715, 1287, 1716, 1716}, + {1, 14, 91, 364, 1001, 2002, 3003, 3432}, + {1, 15, 105, 455, 1365, 3003, 5005, 6435}, + {1, 16, 120, 560, 1820, 4368, 8008, 11440}, + {1, 17, 136, 680, 2380, 6188, 12376, 19448}, + {1, 18, 153, 816, 3060, 8568, 18564, 31824}, + {1, 19, 171, 969, 3876, 11628, 27132, 50388}, + {1, 20, 190, 1140, 4845, 15504, 38760, 77520}, + {1, 21, 210, 1330, 5985, 20349, 54264, 116280}, + {1, 22, 231, 1540, 7315, 26334, 74613, 1705444} +}; + +const int32_t PI_offset[8][8] = +{ + /* for 0p(0). */ + {0x00000,0x00000,0x00000,0x00000,0x00000,0x00000,0x00000,0x00000}, + /* for 1p(1). */ + {0x00000,0x00000,0x00000,0x00000,0x00000,0x00000,0x00000,0x00000}, + /* for 2p(2,1). */ + {0x00000,0x00000,0x00000,0x00000,0x00000,0x00000,0x00000,0x00000}, + /* for 3p(3,2,1). */ + {0x00000,0x00000,0x01180,0x01540,0x00000,0x00000,0x00000,0x00000}, + /* for 4p(4,3,2,1). */ + {0x00000,0x00000,0x071C0,0x0A640,0x0ABE0,0x00000,0x00000,0x00000}, + /* for 5p(5,4,3,2,1). */ + {0x00000,0x00000,0x22200,0x3E900,0x45200,0x45980,0x00000,0x00000}, + /* for 6p(6,5,4,3,2,1). */ + {0x00000,0x00000,0x07d200,0x127c00,0x16ed80,0x179c80,0x17a5e0,0x00000}, + /* for 7p(7,6,5,4,3,2,1). */ + {0x00000,0x00000,0x165800,0x454400,0x654200,0x6E2500,0x6F2B80,0x6F36C0} +}; + +const int16_t PI_factor[7] = {0,0,120,560,1820,4368,8008}; + +/* ACELP pulse coding */ +const uint16_t low_len[10] = { 0, 0, 8, 5, 7,11,13,15,16,16 }; +const uint16_t low_mask[10] = { 0, 0, 255,31,127,2047,8191,32767,65535,65535 }; +const uint16_t indx_fact[10] = { 0, 0,2,172,345,140,190,223,463,1732 }; +const int16_t index_len[3] = { 0, 5, 9 }; +const int16_t index_mask_ACELP[3] = { 0, 31, 511 }; + + +/*------------------------------------------------------------------------------* + * EDCT tables + *------------------------------------------------------------------------------*/ + +const float edct_table_80[80] = +{ + 0.33433591f, 0.33420702f, 0.33394929f, 0.33356281f, 0.33304773f, 0.33240426f, 0.33163264f, 0.33073317f, + 0.32970620f, 0.32855212f, 0.32727137f, 0.32586446f, 0.32433192f, 0.32267434f, 0.32089236f, 0.31898668f, + 0.31695802f, 0.31480717f, 0.31253495f, 0.31014224f, 0.30762997f, 0.30499910f, 0.30225065f, 0.29938568f, + 0.29640528f, 0.29331062f, 0.29010288f, 0.28678330f, 0.28335316f, 0.27981378f, 0.27616653f, 0.27241281f, + 0.26855407f, 0.26459179f, 0.26052751f, 0.25636280f, 0.25209925f, 0.24773851f, 0.24328226f, 0.23873223f, + 0.23409016f, 0.22935784f, 0.22453710f, 0.21962979f, 0.21463782f, 0.20956310f, 0.20440759f, 0.19917327f, + 0.19386217f, 0.18847633f, 0.18301783f, 0.17748878f, 0.17189129f, 0.16622755f, 0.16049971f, 0.15471000f, + 0.14886065f, 0.14295391f, 0.13699206f, 0.13097739f, 0.12491224f, 0.11879892f, 0.11263981f, 0.10643727f, + 0.10019369f, 0.09391149f, 0.08759309f, 0.08124092f, 0.07485742f, 0.06844507f, 0.06200633f, 0.05554369f, + 0.04905963f, 0.04255666f, 0.03603728f, 0.02950402f, 0.02295937f, 0.01640588f, 0.00984606f, 0.00328244f +}; + +const float edct_table_120[120] = +{ + 0.30212379f, 0.30207202f, 0.30196850f, 0.30181323f, 0.30160625f, 0.30134759f, 0.30103730f, 0.30067542f, + 0.30026203f, 0.29979718f, 0.29928097f, 0.29871348f, 0.29809481f, 0.29742505f, 0.29670434f, 0.29593279f, + 0.29511053f, 0.29423770f, 0.29331446f, 0.29234097f, 0.29131738f, 0.29024387f, 0.28912063f, 0.28794786f, + 0.28672574f, 0.28545450f, 0.28413434f, 0.28276550f, 0.28134821f, 0.27988271f, 0.27836926f, 0.27680811f, + 0.27519952f, 0.27354379f, 0.27184118f, 0.27009200f, 0.26829654f, 0.26645510f, 0.26456801f, 0.26263559f, + 0.26065816f, 0.25863608f, 0.25656968f, 0.25445931f, 0.25230535f, 0.25010815f, 0.24786810f, 0.24558558f, + 0.24326098f, 0.24089470f, 0.23848714f, 0.23603872f, 0.23354985f, 0.23102097f, 0.22845250f, 0.22584489f, + 0.22319858f, 0.22051402f, 0.21779168f, 0.21503203f, 0.21223553f, 0.20940267f, 0.20653392f, 0.20362979f, + 0.20069076f, 0.19771735f, 0.19471006f, 0.19166941f, 0.18859591f, 0.18549011f, 0.18235251f, 0.17918368f, + 0.17598414f, 0.17275445f, 0.16949515f, 0.16620682f, 0.16289000f, 0.15954528f, 0.15617322f, 0.15277439f, + 0.14934940f, 0.14589881f, 0.14242322f, 0.13892323f, 0.13539943f, 0.13185244f, 0.12828285f, 0.12469128f, + 0.12107835f, 0.11744467f, 0.11379087f, 0.11011757f, 0.10642540f, 0.10271499f, 0.09898699f, 0.09524203f, + 0.09148074f, 0.08770378f, 0.08391180f, 0.08010544f, 0.07628535f, 0.07245219f, 0.06860661f, 0.06474928f, + 0.06088086f, 0.05700200f, 0.05311338f, 0.04921565f, 0.04530949f, 0.04139557f, 0.03747456f, 0.03354713f, + 0.02961394f, 0.02567569f, 0.02173303f, 0.01778665f, 0.01383722f, 0.00988542f, 0.00593193f, 0.00197742f +}; + +const float edct_table_320[320] = +{ + 0.23643389f, 0.23642819f, 0.23641680f, 0.23639971f, 0.23637692f, 0.23634844f, 0.23631426f, 0.23627439f, + 0.23622882f, 0.23617757f, 0.23612062f, 0.23605798f, 0.23598966f, 0.23591565f, 0.23583595f, 0.23575057f, + 0.23565951f, 0.23556278f, 0.23546036f, 0.23535227f, 0.23523852f, 0.23511909f, 0.23499400f, 0.23486324f, + 0.23472683f, 0.23458476f, 0.23443704f, 0.23428367f, 0.23412465f, 0.23396000f, 0.23378970f, 0.23361377f, + 0.23343222f, 0.23324504f, 0.23305223f, 0.23285382f, 0.23264979f, 0.23244015f, 0.23222492f, 0.23200409f, + 0.23177767f, 0.23154566f, 0.23130808f, 0.23106492f, 0.23081619f, 0.23056191f, 0.23030206f, 0.23003667f, + 0.22976573f, 0.22948926f, 0.22920726f, 0.22891974f, 0.22862670f, 0.22832815f, 0.22802410f, 0.22771455f, + 0.22739952f, 0.22707901f, 0.22675302f, 0.22642158f, 0.22608467f, 0.22574232f, 0.22539453f, 0.22504131f, + 0.22468267f, 0.22431861f, 0.22394915f, 0.22357429f, 0.22319405f, 0.22280842f, 0.22241743f, 0.22202108f, + 0.22161938f, 0.22121233f, 0.22079996f, 0.22038227f, 0.21995927f, 0.21953096f, 0.21909737f, 0.21865850f, + 0.21821436f, 0.21776496f, 0.21731032f, 0.21685044f, 0.21638533f, 0.21591501f, 0.21543948f, 0.21495877f, + 0.21447288f, 0.21398181f, 0.21348560f, 0.21298423f, 0.21247774f, 0.21196612f, 0.21144940f, 0.21092759f, + 0.21040069f, 0.20986872f, 0.20933169f, 0.20878962f, 0.20824252f, 0.20769041f, 0.20713328f, 0.20657117f, + 0.20600408f, 0.20543202f, 0.20485502f, 0.20427308f, 0.20368621f, 0.20309444f, 0.20249778f, 0.20189623f, + 0.20128983f, 0.20067857f, 0.20006247f, 0.19944156f, 0.19881584f, 0.19818532f, 0.19755004f, 0.19690999f, + 0.19626520f, 0.19561568f, 0.19496144f, 0.19430251f, 0.19363890f, 0.19297062f, 0.19229769f, 0.19162012f, + 0.19093794f, 0.19025116f, 0.18955980f, 0.18886386f, 0.18816338f, 0.18745836f, 0.18674883f, 0.18603479f, + 0.18531628f, 0.18459330f, 0.18386586f, 0.18313400f, 0.18239773f, 0.18165706f, 0.18091202f, 0.18016261f, + 0.17940887f, 0.17865080f, 0.17788842f, 0.17712176f, 0.17635084f, 0.17557566f, 0.17479625f, 0.17401263f, + 0.17322482f, 0.17243283f, 0.17163669f, 0.17083642f, 0.17003202f, 0.16922353f, 0.16841096f, 0.16759434f, + 0.16677367f, 0.16594899f, 0.16512031f, 0.16428765f, 0.16345103f, 0.16261047f, 0.16176600f, 0.16091763f, + 0.16006537f, 0.15920927f, 0.15834932f, 0.15748556f, 0.15661801f, 0.15574668f, 0.15487160f, 0.15399279f, + 0.15311027f, 0.15222405f, 0.15133417f, 0.15044065f, 0.14954350f, 0.14864274f, 0.14773840f, 0.14683051f, + 0.14591907f, 0.14500412f, 0.14408568f, 0.14316376f, 0.14223840f, 0.14130960f, 0.14037740f, 0.13944182f, + 0.13850288f, 0.13756060f, 0.13661501f, 0.13566613f, 0.13471397f, 0.13375858f, 0.13279995f, 0.13183813f, + 0.13087313f, 0.12990498f, 0.12893370f, 0.12795931f, 0.12698183f, 0.12600130f, 0.12501773f, 0.12403115f, + 0.12304158f, 0.12204905f, 0.12105357f, 0.12005518f, 0.11905390f, 0.11804974f, 0.11704275f, 0.11603293f, + 0.11502031f, 0.11400493f, 0.11298680f, 0.11196594f, 0.11094239f, 0.10991616f, 0.10888729f, 0.10785579f, + 0.10682169f, 0.10578502f, 0.10474580f, 0.10370406f, 0.10265981f, 0.10161310f, 0.10056393f, 0.09951234f, + 0.09845836f, 0.09740200f, 0.09634329f, 0.09528227f, 0.09421894f, 0.09315335f, 0.09208551f, 0.09101546f, + 0.08994321f, 0.08886879f, 0.08779223f, 0.08671356f, 0.08563280f, 0.08454997f, 0.08346511f, 0.08237823f, + 0.08128937f, 0.08019855f, 0.07910580f, 0.07801115f, 0.07691461f, 0.07581622f, 0.07471600f, 0.07361399f, + 0.07251019f, 0.07140466f, 0.07029740f, 0.06918844f, 0.06807783f, 0.06696557f, 0.06585169f, 0.06473623f, + 0.06361921f, 0.06250066f, 0.06138060f, 0.06025906f, 0.05913607f, 0.05801166f, 0.05688584f, 0.05575866f, + 0.05463013f, 0.05350029f, 0.05236916f, 0.05123676f, 0.05010313f, 0.04896830f, 0.04783228f, 0.04669511f, + 0.04555682f, 0.04441742f, 0.04327696f, 0.04213546f, 0.04099294f, 0.03984943f, 0.03870496f, 0.03755956f, + 0.03641326f, 0.03526607f, 0.03411804f, 0.03296919f, 0.03181954f, 0.03066912f, 0.02951797f, 0.02836610f, + 0.02721355f, 0.02606034f, 0.02490651f, 0.02375208f, 0.02259707f, 0.02144152f, 0.02028545f, 0.01912890f, + 0.01797188f, 0.01681443f, 0.01565658f, 0.01449834f, 0.01333976f, 0.01218086f, 0.01102166f, 0.00986220f, + 0.00870250f, 0.00754259f, 0.00638250f, 0.00522226f, 0.00406188f, 0.00290142f, 0.00174088f, 0.00058030f +}; + +const float edct_table_480[480] = +{ + 0.21364290f, 0.21364061f, 0.21363603f, 0.21362917f, 0.21362002f, 0.21360858f, 0.21359485f, 0.21357884f, + 0.21356053f, 0.21353995f, 0.21351707f, 0.21349191f, 0.21346446f, 0.21343473f, 0.21340271f, 0.21336840f, + 0.21333181f, 0.21329294f, 0.21325178f, 0.21320833f, 0.21316261f, 0.21311460f, 0.21306431f, 0.21301173f, + 0.21295688f, 0.21289974f, 0.21284033f, 0.21277863f, 0.21271466f, 0.21264841f, 0.21257988f, 0.21250908f, + 0.21243600f, 0.21236064f, 0.21228301f, 0.21220311f, 0.21212093f, 0.21203649f, 0.21194977f, 0.21186078f, + 0.21176952f, 0.21167600f, 0.21158021f, 0.21148215f, 0.21138183f, 0.21127924f, 0.21117439f, 0.21106728f, + 0.21095791f, 0.21084628f, 0.21073239f, 0.21061625f, 0.21049785f, 0.21037720f, 0.21025429f, 0.21012913f, + 0.21000172f, 0.20987206f, 0.20974016f, 0.20960601f, 0.20946961f, 0.20933097f, 0.20919009f, 0.20904697f, + 0.20890161f, 0.20875401f, 0.20860417f, 0.20845211f, 0.20829781f, 0.20814128f, 0.20798252f, 0.20782153f, + 0.20765832f, 0.20749288f, 0.20732522f, 0.20715535f, 0.20698325f, 0.20680894f, 0.20663241f, 0.20645367f, + 0.20627271f, 0.20608955f, 0.20590418f, 0.20571661f, 0.20552684f, 0.20533486f, 0.20514068f, 0.20494431f, + 0.20474574f, 0.20454498f, 0.20434203f, 0.20413689f, 0.20392956f, 0.20372005f, 0.20350836f, 0.20329449f, + 0.20307844f, 0.20286022f, 0.20263983f, 0.20241726f, 0.20219253f, 0.20196563f, 0.20173657f, 0.20150535f, + 0.20127197f, 0.20103643f, 0.20079874f, 0.20055891f, 0.20031692f, 0.20007279f, 0.19982652f, 0.19957810f, + 0.19932755f, 0.19907486f, 0.19882005f, 0.19856310f, 0.19830403f, 0.19804283f, 0.19777951f, 0.19751407f, + 0.19724652f, 0.19697686f, 0.19670509f, 0.19643121f, 0.19615522f, 0.19587714f, 0.19559696f, 0.19531468f, + 0.19503031f, 0.19474386f, 0.19445531f, 0.19416469f, 0.19387199f, 0.19357720f, 0.19328035f, 0.19298143f, + 0.19268044f, 0.19237739f, 0.19207227f, 0.19176510f, 0.19145588f, 0.19114460f, 0.19083128f, 0.19051592f, + 0.19019851f, 0.18987907f, 0.18955759f, 0.18923409f, 0.18890856f, 0.18858100f, 0.18825143f, 0.18791983f, + 0.18758623f, 0.18725062f, 0.18691300f, 0.18657338f, 0.18623176f, 0.18588815f, 0.18554255f, 0.18519496f, + 0.18484539f, 0.18449384f, 0.18414031f, 0.18378481f, 0.18342734f, 0.18306791f, 0.18270651f, 0.18234316f, + 0.18197786f, 0.18161061f, 0.18124141f, 0.18087028f, 0.18049720f, 0.18012220f, 0.17974526f, 0.17936640f, + 0.17898562f, 0.17860292f, 0.17821831f, 0.17783179f, 0.17744336f, 0.17705304f, 0.17666082f, 0.17626671f, + 0.17587071f, 0.17547282f, 0.17507306f, 0.17467142f, 0.17426791f, 0.17386254f, 0.17345530f, 0.17304621f, + 0.17263526f, 0.17222246f, 0.17180782f, 0.17139134f, 0.17097303f, 0.17055288f, 0.17013091f, 0.16970711f, + 0.16928150f, 0.16885407f, 0.16842484f, 0.16799380f, 0.16756096f, 0.16712633f, 0.16668991f, 0.16625171f, + 0.16581172f, 0.16536996f, 0.16492642f, 0.16448113f, 0.16403406f, 0.16358525f, 0.16313468f, 0.16268236f, + 0.16222830f, 0.16177251f, 0.16131498f, 0.16085572f, 0.16039474f, 0.15993205f, 0.15946764f, 0.15900152f, + 0.15853370f, 0.15806419f, 0.15759298f, 0.15712008f, 0.15664550f, 0.15616924f, 0.15569131f, 0.15521171f, + 0.15473045f, 0.15424753f, 0.15376297f, 0.15327675f, 0.15278889f, 0.15229940f, 0.15180828f, 0.15131553f, + 0.15082115f, 0.15032517f, 0.14982757f, 0.14932837f, 0.14882757f, 0.14832518f, 0.14782120f, 0.14731564f, + 0.14680849f, 0.14629978f, 0.14578950f, 0.14527766f, 0.14476426f, 0.14424931f, 0.14373282f, 0.14321478f, + 0.14269522f, 0.14217412f, 0.14165151f, 0.14112737f, 0.14060173f, 0.14007458f, 0.13954592f, 0.13901578f, + 0.13848414f, 0.13795103f, 0.13741643f, 0.13688037f, 0.13634283f, 0.13580384f, 0.13526339f, 0.13472150f, + 0.13417816f, 0.13363339f, 0.13308718f, 0.13253955f, 0.13199050f, 0.13144003f, 0.13088816f, 0.13033489f, + 0.12978022f, 0.12922416f, 0.12866672f, 0.12810790f, 0.12754770f, 0.12698614f, 0.12642323f, 0.12585895f, + 0.12529333f, 0.12472637f, 0.12415807f, 0.12358845f, 0.12301749f, 0.12244523f, 0.12187165f, 0.12129676f, + 0.12072058f, 0.12014310f, 0.11956434f, 0.11898429f, 0.11840297f, 0.11782039f, 0.11723654f, 0.11665144f, + 0.11606508f, 0.11547749f, 0.11488866f, 0.11429859f, 0.11370731f, 0.11311480f, 0.11252109f, 0.11192617f, + 0.11133005f, 0.11073273f, 0.11013424f, 0.10953456f, 0.10893371f, 0.10833169f, 0.10772852f, 0.10712419f, + 0.10651871f, 0.10591209f, 0.10530434f, 0.10469546f, 0.10408546f, 0.10347434f, 0.10286212f, 0.10224879f, + 0.10163437f, 0.10101886f, 0.10040227f, 0.09978460f, 0.09916587f, 0.09854607f, 0.09792522f, 0.09730332f, + 0.09668037f, 0.09605639f, 0.09543139f, 0.09480536f, 0.09417831f, 0.09355026f, 0.09292121f, 0.09229116f, + 0.09166012f, 0.09102810f, 0.09039510f, 0.08976114f, 0.08912622f, 0.08849034f, 0.08785351f, 0.08721574f, + 0.08657704f, 0.08593742f, 0.08529687f, 0.08465540f, 0.08401304f, 0.08336977f, 0.08272561f, 0.08208056f, + 0.08143463f, 0.08078784f, 0.08014017f, 0.07949165f, 0.07884228f, 0.07819206f, 0.07754101f, 0.07688912f, + 0.07623641f, 0.07558289f, 0.07492855f, 0.07427342f, 0.07361748f, 0.07296076f, 0.07230326f, 0.07164499f, + 0.07098594f, 0.07032614f, 0.06966558f, 0.06900428f, 0.06834224f, 0.06767946f, 0.06701596f, 0.06635175f, + 0.06568682f, 0.06502119f, 0.06435487f, 0.06368785f, 0.06302015f, 0.06235178f, 0.06168274f, 0.06101304f, + 0.06034268f, 0.05967168f, 0.05900004f, 0.05832777f, 0.05765488f, 0.05698136f, 0.05630724f, 0.05563251f, + 0.05495719f, 0.05428128f, 0.05360479f, 0.05292772f, 0.05225009f, 0.05157189f, 0.05089315f, 0.05021386f, + 0.04953403f, 0.04885367f, 0.04817279f, 0.04749139f, 0.04680949f, 0.04612708f, 0.04544418f, 0.04476079f, + 0.04407692f, 0.04339258f, 0.04270778f, 0.04202252f, 0.04133681f, 0.04065065f, 0.03996406f, 0.03927704f, + 0.03858961f, 0.03790175f, 0.03721350f, 0.03652484f, 0.03583579f, 0.03514636f, 0.03445656f, 0.03376638f, + 0.03307584f, 0.03238495f, 0.03169371f, 0.03100213f, 0.03031022f, 0.02961799f, 0.02892544f, 0.02823258f, + 0.02753941f, 0.02684595f, 0.02615221f, 0.02545818f, 0.02476388f, 0.02406932f, 0.02337449f, 0.02267942f, + 0.02198411f, 0.02128856f, 0.02059278f, 0.01989678f, 0.01920056f, 0.01850415f, 0.01780753f, 0.01711072f, + 0.01641373f, 0.01571657f, 0.01501923f, 0.01432174f, 0.01362409f, 0.01292630f, 0.01222836f, 0.01153030f, + 0.01083211f, 0.01013381f, 0.00943540f, 0.00873688f, 0.00803828f, 0.00733959f, 0.00664081f, 0.00594197f, + 0.00524307f, 0.00454410f, 0.00384509f, 0.00314604f, 0.00244696f, 0.00174784f, 0.00104871f, 0.00034957f +}; + +const float edct_table_128[128] = +{ + 0.29728989f, 0.29724512f, 0.29715558f, 0.29702130f, 0.29684228f, 0.29661856f, 0.29635017f, 0.29603715f, + 0.29567955f, 0.29527743f, 0.29483083f, 0.29433983f, 0.29380451f, 0.29322494f, 0.29260121f, 0.29193342f, + 0.29122167f, 0.29046605f, 0.28966670f, 0.28882372f, 0.28793724f, 0.28700741f, 0.28603435f, 0.28501821f, + 0.28395915f, 0.28285733f, 0.28171292f, 0.28052607f, 0.27929698f, 0.27802583f, 0.27671281f, 0.27535812f, + 0.27396196f, 0.27252454f, 0.27104609f, 0.26952681f, 0.26796694f, 0.26636672f, 0.26472638f, 0.26304618f, + 0.26132636f, 0.25956719f, 0.25776893f, 0.25593185f, 0.25405623f, 0.25214235f, 0.25019049f, 0.24820096f, + 0.24617405f, 0.24411007f, 0.24200932f, 0.23987213f, 0.23769882f, 0.23548971f, 0.23324513f, 0.23096543f, + 0.22865095f, 0.22630203f, 0.22391903f, 0.22150231f, 0.21905224f, 0.21656917f, 0.21405349f, 0.21150558f, + 0.20892581f, 0.20631458f, 0.20367228f, 0.20099931f, 0.19829606f, 0.19556296f, 0.19280040f, 0.19000881f, + 0.18718860f, 0.18434021f, 0.18146405f, 0.17856057f, 0.17563019f, 0.17267337f, 0.16969054f, 0.16668215f, + 0.16364867f, 0.16059054f, 0.15750822f, 0.15440219f, 0.15127290f, 0.14812083f, 0.14494646f, 0.14175026f, + 0.13853271f, 0.13529429f, 0.13203551f, 0.12875684f, 0.12545877f, 0.12214182f, 0.11880647f, 0.11545323f, + 0.11208260f, 0.10869509f, 0.10529122f, 0.10187148f, 0.09843641f, 0.09498651f, 0.09152231f, 0.08804432f, + 0.08455308f, 0.08104910f, 0.07753291f, 0.07400505f, 0.07046605f, 0.06691643f, 0.06335674f, 0.05978750f, + 0.05620926f, 0.05262256f, 0.04902793f, 0.04542591f, 0.04181706f, 0.03820191f, 0.03458100f, 0.03095489f, + 0.02732412f, 0.02368923f, 0.02005077f, 0.01640930f, 0.01276535f, 0.00911948f, 0.00547224f, 0.00182417f +}; + +const float edct_table_160[160] = +{ + 0.28116346f, 0.28113637f, 0.28108217f, 0.28100088f, 0.28089251f, 0.28075707f, 0.28059457f, 0.28040502f, + 0.28018844f, 0.27994487f, 0.27967431f, 0.27937679f, 0.27905235f, 0.27870101f, 0.27832281f, 0.27791778f, + 0.27748597f, 0.27702741f, 0.27654216f, 0.27603024f, 0.27549173f, 0.27492666f, 0.27433510f, 0.27371709f, + 0.27307270f, 0.27240199f, 0.27170503f, 0.27098188f, 0.27023261f, 0.26945730f, 0.26865602f, 0.26782884f, + 0.26697585f, 0.26609713f, 0.26519276f, 0.26426283f, 0.26330743f, 0.26232665f, 0.26132059f, 0.26028934f, + 0.25923300f, 0.25815168f, 0.25704548f, 0.25591450f, 0.25475886f, 0.25357866f, 0.25237403f, 0.25114506f, + 0.24989190f, 0.24861465f, 0.24731343f, 0.24598838f, 0.24463962f, 0.24326728f, 0.24187150f, 0.24045240f, + 0.23901013f, 0.23754482f, 0.23605661f, 0.23454566f, 0.23301210f, 0.23145608f, 0.22987775f, 0.22827726f, + 0.22665478f, 0.22501045f, 0.22334443f, 0.22165688f, 0.21994797f, 0.21821787f, 0.21646673f, 0.21469472f, + 0.21290203f, 0.21108881f, 0.20925525f, 0.20740152f, 0.20552780f, 0.20363427f, 0.20172112f, 0.19978852f, + 0.19783667f, 0.19586574f, 0.19387594f, 0.19186746f, 0.18984048f, 0.18779520f, 0.18573183f, 0.18365055f, + 0.18155157f, 0.17943510f, 0.17730133f, 0.17515047f, 0.17298273f, 0.17079832f, 0.16859744f, 0.16638032f, + 0.16414716f, 0.16189818f, 0.15963359f, 0.15735362f, 0.15505848f, 0.15274840f, 0.15042360f, 0.14808429f, + 0.14573072f, 0.14336310f, 0.14098166f, 0.13858663f, 0.13617825f, 0.13375674f, 0.13132234f, 0.12887528f, + 0.12641580f, 0.12394414f, 0.12146053f, 0.11896521f, 0.11645843f, 0.11394042f, 0.11141144f, 0.10887171f, + 0.10632149f, 0.10376102f, 0.10119055f, 0.09861033f, 0.09602061f, 0.09342163f, 0.09081364f, 0.08819691f, + 0.08557167f, 0.08293818f, 0.08029671f, 0.07764749f, 0.07499079f, 0.07232686f, 0.06965596f, 0.06697834f, + 0.06429427f, 0.06160401f, 0.05890780f, 0.05620592f, 0.05349862f, 0.05078617f, 0.04806882f, 0.04534683f, + 0.04262048f, 0.03989002f, 0.03715571f, 0.03441782f, 0.03167662f, 0.02893236f, 0.02618532f, 0.02343575f, + 0.02068392f, 0.01793009f, 0.01517454f, 0.01241753f, 0.00965932f, 0.00690018f, 0.00414037f, 0.00138017f +}; + +const float edct_table_40[40] = +{ + 0.39747255f, 0.39685967f, 0.39563487f, 0.39380003f, 0.39135797f, 0.38831247f, 0.38466823f, 0.38043085f, + 0.37560687f, 0.37020373f, 0.36422977f, 0.35769419f, 0.35060707f, 0.34297935f, 0.33482277f, 0.32614992f, + 0.31697417f, 0.30730967f, 0.29717132f, 0.28657476f, 0.27553631f, 0.26407301f, 0.25220253f, 0.23994317f, + 0.22731383f, 0.21433400f, 0.20102367f, 0.18740339f, 0.17349414f, 0.15931737f, 0.14489495f, 0.13024911f, + 0.11540244f, 0.10037782f, 0.08519843f, 0.06988767f, 0.05446914f, 0.03896663f, 0.02340404f, 0.00780536f +}; + +const float edct_table_20[20] = +{ + 0.47209725f, 0.46918661f, 0.46338329f, 0.45472305f, 0.44325929f, 0.42906269f, 0.41222077f, 0.39283738f, + 0.37103202f, 0.34693912f, 0.32070722f, 0.29249806f, 0.26248555f, 0.23085473f, 0.19780061f, 0.16352698f, + 0.12824516f, 0.09217267f, 0.05553190f, 0.01854875f +}; + + +const float edct_table_64[64] = +{ + 0.35349683f, 0.35328389f, 0.35285816f, 0.35221987f, 0.35136942f, 0.35030732f, 0.34903420f, 0.34755084f, + 0.34585813f, 0.34395709f, 0.34184886f, 0.33953471f, 0.33701604f, 0.33429436f, 0.33137132f, 0.32824867f, + 0.32492830f, 0.32141220f, 0.31770249f, 0.31380142f, 0.30971132f, 0.30543466f, 0.30097402f, 0.29633209f, + 0.29151165f, 0.28651562f, 0.28134701f, 0.27600892f, 0.27050457f, 0.26483728f, 0.25901046f, 0.25302763f, + 0.24689238f, 0.24060841f, 0.23417951f, 0.22760955f, 0.22090248f, 0.21406235f, 0.20709328f, 0.19999946f, + 0.19278517f, 0.18545475f, 0.17801263f, 0.17046327f, 0.16281123f, 0.15506112f, 0.14721761f, 0.13928542f, + 0.13126933f, 0.12317417f, 0.11500482f, 0.10676618f, 0.09846324f, 0.09010099f, 0.08168446f, 0.07321873f, + 0.06470889f, 0.05616008f, 0.04757744f, 0.03896613f, 0.03033136f, 0.02167832f, 0.01301222f, 0.00433828f +}; + +const float edct_table_100[100] = +{ + 0.31620704f, 0.31612902f, 0.31597300f, 0.31573902f, 0.31542714f, 0.31503742f, 0.31456998f, 0.31402492f, + 0.31340238f, 0.31270252f, 0.31192550f, 0.31107151f, 0.31014078f, 0.30913352f, 0.30804998f, 0.30689044f, + 0.30565518f, 0.30434451f, 0.30295874f, 0.30149822f, 0.29996331f, 0.29835439f, 0.29667186f, 0.29491612f, + 0.29308762f, 0.29118680f, 0.28921414f, 0.28717012f, 0.28505525f, 0.28287004f, 0.28061503f, 0.27829079f, + 0.27589789f, 0.27343691f, 0.27090847f, 0.26831318f, 0.26565169f, 0.26292465f, 0.26013275f, 0.25727665f, + 0.25435708f, 0.25137475f, 0.24833040f, 0.24522478f, 0.24205865f, 0.23883279f, 0.23554801f, 0.23220511f, + 0.22880491f, 0.22534827f, 0.22183602f, 0.21826903f, 0.21464819f, 0.21097439f, 0.20724854f, 0.20347155f, + 0.19964436f, 0.19576790f, 0.19184315f, 0.18787106f, 0.18385261f, 0.17978880f, 0.17568064f, 0.17152912f, + 0.16733529f, 0.16310016f, 0.15882480f, 0.15451024f, 0.15015756f, 0.14576784f, 0.14134215f, 0.13688158f, + 0.13238724f, 0.12786023f, 0.12330168f, 0.11871271f, 0.11409444f, 0.10944803f, 0.10477460f, 0.10007533f, + 0.09535137f, 0.09060388f, 0.08583403f, 0.08104300f, 0.07623198f, 0.07140215f, 0.06655470f, 0.06169084f, + 0.05681175f, 0.05191864f, 0.04701272f, 0.04209520f, 0.03716730f, 0.03223022f, 0.02728520f, 0.02233344f, + 0.01737617f, 0.01241461f, 0.00744999f, 0.00248354f +}; + + +const float edct_table_200[200] = +{ + 0.26591044f, 0.26589403f, 0.26586123f, 0.26581203f, 0.26574643f, 0.26566443f, 0.26556605f, 0.26545129f, + 0.26532015f, 0.26517265f, 0.26500879f, 0.26482859f, 0.26463205f, 0.26441918f, 0.26419000f, 0.26394453f, + 0.26368278f, 0.26340476f, 0.26311049f, 0.26279999f, 0.26247328f, 0.26213038f, 0.26177132f, 0.26139610f, + 0.26100476f, 0.26059732f, 0.26017381f, 0.25973424f, 0.25927866f, 0.25880708f, 0.25831954f, 0.25781606f, + 0.25729668f, 0.25676143f, 0.25621034f, 0.25564344f, 0.25506078f, 0.25446238f, 0.25384829f, 0.25321854f, + 0.25257317f, 0.25191222f, 0.25123573f, 0.25054374f, 0.24983629f, 0.24911344f, 0.24837522f, 0.24762168f, + 0.24685286f, 0.24606882f, 0.24526960f, 0.24445525f, 0.24362582f, 0.24278136f, 0.24192193f, 0.24104757f, + 0.24015834f, 0.23925430f, 0.23833551f, 0.23740201f, 0.23645386f, 0.23549113f, 0.23451388f, 0.23352215f, + 0.23251603f, 0.23149556f, 0.23046081f, 0.22941185f, 0.22834873f, 0.22727153f, 0.22618031f, 0.22507514f, + 0.22395608f, 0.22282321f, 0.22167659f, 0.22051630f, 0.21934241f, 0.21815499f, 0.21695411f, 0.21573985f, + 0.21451228f, 0.21327148f, 0.21201752f, 0.21075048f, 0.20947045f, 0.20817749f, 0.20687169f, 0.20555313f, + 0.20422189f, 0.20287806f, 0.20152171f, 0.20015293f, 0.19877180f, 0.19737841f, 0.19597285f, 0.19455519f, + 0.19312554f, 0.19168397f, 0.19023058f, 0.18876546f, 0.18728869f, 0.18580037f, 0.18430058f, 0.18278943f, + 0.18126701f, 0.17973340f, 0.17818870f, 0.17663302f, 0.17506644f, 0.17348906f, 0.17190097f, 0.17030229f, + 0.16869310f, 0.16707350f, 0.16544360f, 0.16380349f, 0.16215328f, 0.16049306f, 0.15882295f, 0.15714304f, + 0.15545343f, 0.15375424f, 0.15204556f, 0.15032750f, 0.14860017f, 0.14686367f, 0.14511812f, 0.14336361f, + 0.14160026f, 0.13982818f, 0.13804747f, 0.13625824f, 0.13446061f, 0.13265468f, 0.13084058f, 0.12901840f, + 0.12718826f, 0.12535028f, 0.12350456f, 0.12165123f, 0.11979039f, 0.11792217f, 0.11604667f, 0.11416401f, + 0.11227431f, 0.11037768f, 0.10847425f, 0.10656412f, 0.10464742f, 0.10272426f, 0.10079477f, 0.09885906f, + 0.09691726f, 0.09496947f, 0.09301583f, 0.09105645f, 0.08909145f, 0.08712096f, 0.08514509f, 0.08316397f, + 0.08117772f, 0.07918646f, 0.07719032f, 0.07518942f, 0.07318388f, 0.07117382f, 0.06915937f, 0.06714066f, + 0.06511781f, 0.06309094f, 0.06106018f, 0.05902565f, 0.05698748f, 0.05494580f, 0.05290072f, 0.05085238f, + 0.04880091f, 0.04674643f, 0.04468906f, 0.04262893f, 0.04056618f, 0.03850092f, 0.03643329f, 0.03436341f, + 0.03229142f, 0.03021743f, 0.02814157f, 0.02606398f, 0.02398478f, 0.02190411f, 0.01982208f, 0.01773883f, + 0.01565448f, 0.01356917f, 0.01148302f, 0.00939617f, 0.00730873f, 0.00522084f, 0.00313264f, 0.00104423f +}; + +const float edct_table_240[240] = +{ + 0.25406349f, 0.25405260f, 0.25403084f, 0.25399819f, 0.25395466f, 0.25390025f, 0.25383497f, 0.25375881f, + 0.25367179f, 0.25357389f, 0.25346514f, 0.25334553f, 0.25321506f, 0.25307375f, 0.25292160f, 0.25275861f, + 0.25258479f, 0.25240016f, 0.25220471f, 0.25199846f, 0.25178142f, 0.25155358f, 0.25131498f, 0.25106561f, + 0.25080548f, 0.25053461f, 0.25025301f, 0.24996068f, 0.24965766f, 0.24934393f, 0.24901953f, 0.24868445f, + 0.24833873f, 0.24798236f, 0.24761538f, 0.24723778f, 0.24684960f, 0.24645084f, 0.24604153f, 0.24562167f, + 0.24519129f, 0.24475042f, 0.24429905f, 0.24383722f, 0.24336495f, 0.24288225f, 0.24238915f, 0.24188566f, + 0.24137181f, 0.24084762f, 0.24031312f, 0.23976832f, 0.23921325f, 0.23864793f, 0.23807239f, 0.23748665f, + 0.23689074f, 0.23628468f, 0.23566850f, 0.23504223f, 0.23440588f, 0.23375950f, 0.23310310f, 0.23243671f, + 0.23176037f, 0.23107410f, 0.23037794f, 0.22967190f, 0.22895603f, 0.22823035f, 0.22749489f, 0.22674968f, + 0.22599477f, 0.22523017f, 0.22445592f, 0.22367206f, 0.22287862f, 0.22207563f, 0.22126313f, 0.22044115f, + 0.21960972f, 0.21876889f, 0.21791869f, 0.21705915f, 0.21619032f, 0.21531222f, 0.21442490f, 0.21352839f, + 0.21262274f, 0.21170798f, 0.21078415f, 0.20985130f, 0.20890945f, 0.20795865f, 0.20699895f, 0.20603038f, + 0.20505298f, 0.20406680f, 0.20307188f, 0.20206825f, 0.20105598f, 0.20003509f, 0.19900563f, 0.19796764f, + 0.19692118f, 0.19586628f, 0.19480299f, 0.19373136f, 0.19265142f, 0.19156324f, 0.19046685f, 0.18936230f, + 0.18824963f, 0.18712891f, 0.18600017f, 0.18486346f, 0.18371883f, 0.18256633f, 0.18140601f, 0.18023792f, + 0.17906211f, 0.17787863f, 0.17668753f, 0.17548886f, 0.17428267f, 0.17306902f, 0.17184795f, 0.17061952f, + 0.16938379f, 0.16814079f, 0.16689060f, 0.16563326f, 0.16436882f, 0.16309734f, 0.16181887f, 0.16053347f, + 0.15924120f, 0.15794210f, 0.15663624f, 0.15532366f, 0.15400444f, 0.15267862f, 0.15134625f, 0.15000741f, + 0.14866213f, 0.14731049f, 0.14595254f, 0.14458834f, 0.14321795f, 0.14184141f, 0.14045881f, 0.13907018f, + 0.13767560f, 0.13627512f, 0.13486881f, 0.13345671f, 0.13203890f, 0.13061544f, 0.12918637f, 0.12775178f, + 0.12631171f, 0.12486623f, 0.12341540f, 0.12195929f, 0.12049795f, 0.11903145f, 0.11755985f, 0.11608321f, + 0.11460161f, 0.11311509f, 0.11162373f, 0.11012758f, 0.10862672f, 0.10712120f, 0.10561110f, 0.10409647f, + 0.10257739f, 0.10105391f, 0.09952610f, 0.09799402f, 0.09645775f, 0.09491735f, 0.09337288f, 0.09182441f, + 0.09027201f, 0.08871574f, 0.08715567f, 0.08559187f, 0.08402440f, 0.08245333f, 0.08087873f, 0.07930067f, + 0.07771920f, 0.07613441f, 0.07454636f, 0.07295511f, 0.07136074f, 0.06976332f, 0.06816290f, 0.06655956f, + 0.06495338f, 0.06334441f, 0.06173272f, 0.06011839f, 0.05850149f, 0.05688208f, 0.05526024f, 0.05363602f, + 0.05200951f, 0.05038078f, 0.04874988f, 0.04711689f, 0.04548189f, 0.04384494f, 0.04220611f, 0.04056547f, + 0.03892310f, 0.03727906f, 0.03563342f, 0.03398625f, 0.03233763f, 0.03068762f, 0.02903630f, 0.02738373f, + 0.02573000f, 0.02407516f, 0.02241928f, 0.02076245f, 0.01910473f, 0.01744619f, 0.01578690f, 0.01412694f, + 0.01246637f, 0.01080527f, 0.00914370f, 0.00748175f, 0.00581947f, 0.00415694f, 0.00249424f, 0.00083142f +}; + +const float edct_table_256[256] = +{ + 0.24999750f, 0.24998809f, 0.24996926f, 0.24994103f, 0.24990338f, 0.24985633f, 0.24979987f, 0.24973400f, + 0.24965873f, 0.24957406f, 0.24948000f, 0.24937654f, 0.24926370f, 0.24914147f, 0.24900986f, 0.24886887f, + 0.24871852f, 0.24855880f, 0.24838972f, 0.24821129f, 0.24802352f, 0.24782640f, 0.24761996f, 0.24740419f, + 0.24717911f, 0.24694473f, 0.24670104f, 0.24644807f, 0.24618582f, 0.24591430f, 0.24563353f, 0.24534350f, + 0.24504424f, 0.24473575f, 0.24441805f, 0.24409114f, 0.24375505f, 0.24340977f, 0.24305534f, 0.24269175f, + 0.24231903f, 0.24193718f, 0.24154622f, 0.24114617f, 0.24073704f, 0.24031885f, 0.23989161f, 0.23945534f, + 0.23901005f, 0.23855576f, 0.23809249f, 0.23762026f, 0.23713908f, 0.23664898f, 0.23614996f, 0.23564205f, + 0.23512527f, 0.23459964f, 0.23406518f, 0.23352190f, 0.23296983f, 0.23240899f, 0.23183940f, 0.23126109f, + 0.23067406f, 0.23007835f, 0.22947398f, 0.22886097f, 0.22823934f, 0.22760912f, 0.22697033f, 0.22632299f, + 0.22566713f, 0.22500278f, 0.22432996f, 0.22364869f, 0.22295900f, 0.22226091f, 0.22155446f, 0.22083967f, + 0.22011656f, 0.21938516f, 0.21864551f, 0.21789762f, 0.21714153f, 0.21637726f, 0.21560485f, 0.21482432f, + 0.21403570f, 0.21323902f, 0.21243432f, 0.21162161f, 0.21080094f, 0.20997234f, 0.20913582f, 0.20829144f, + 0.20743921f, 0.20657917f, 0.20571136f, 0.20483580f, 0.20395252f, 0.20306157f, 0.20216298f, 0.20125677f, + 0.20034298f, 0.19942165f, 0.19849282f, 0.19755651f, 0.19661276f, 0.19566161f, 0.19470310f, 0.19373725f, + 0.19276411f, 0.19178371f, 0.19079609f, 0.18980129f, 0.18879934f, 0.18779029f, 0.18677416f, 0.18575100f, + 0.18472085f, 0.18368375f, 0.18263973f, 0.18158883f, 0.18053109f, 0.17946656f, 0.17839527f, 0.17731727f, + 0.17623259f, 0.17514127f, 0.17404336f, 0.17293890f, 0.17182793f, 0.17071048f, 0.16958661f, 0.16845636f, + 0.16731976f, 0.16617686f, 0.16502771f, 0.16387235f, 0.16271081f, 0.16154315f, 0.16036940f, 0.15918962f, + 0.15800385f, 0.15681212f, 0.15561450f, 0.15441101f, 0.15320171f, 0.15198664f, 0.15076585f, 0.14953939f, + 0.14830729f, 0.14706961f, 0.14582639f, 0.14457768f, 0.14332353f, 0.14206399f, 0.14079909f, 0.13952889f, + 0.13825344f, 0.13697279f, 0.13568698f, 0.13439606f, 0.13310008f, 0.13179909f, 0.13049313f, 0.12918227f, + 0.12786654f, 0.12654599f, 0.12522068f, 0.12389066f, 0.12255597f, 0.12121667f, 0.11987280f, 0.11852443f, + 0.11717159f, 0.11581433f, 0.11445272f, 0.11308680f, 0.11171662f, 0.11034223f, 0.10896369f, 0.10758105f, + 0.10619436f, 0.10480367f, 0.10340903f, 0.10201050f, 0.10060813f, 0.09920197f, 0.09779208f, 0.09637850f, + 0.09496130f, 0.09354052f, 0.09211622f, 0.09068845f, 0.08925727f, 0.08782272f, 0.08638487f, 0.08494377f, + 0.08349947f, 0.08205203f, 0.08060149f, 0.07914792f, 0.07769138f, 0.07623190f, 0.07476956f, 0.07330440f, + 0.07183648f, 0.07036586f, 0.06889259f, 0.06741672f, 0.06593832f, 0.06445743f, 0.06297412f, 0.06148844f, + 0.06000044f, 0.05851018f, 0.05701772f, 0.05552311f, 0.05402641f, 0.05252768f, 0.05102697f, 0.04952434f, + 0.04801985f, 0.04651354f, 0.04500549f, 0.04349574f, 0.04198435f, 0.04047138f, 0.03895689f, 0.03744094f, + 0.03592357f, 0.03440485f, 0.03288483f, 0.03136358f, 0.02984115f, 0.02831759f, 0.02679296f, 0.02526733f, + 0.02374075f, 0.02221327f, 0.02068496f, 0.01915586f, 0.01762605f, 0.01609557f, 0.01456449f, 0.01303286f, + 0.01150073f, 0.00996818f, 0.00843525f, 0.00690200f, 0.00536849f, 0.00383478f, 0.00230093f, 0.00076699f +}; + +const float edct_table_400[400] = +{ + 0.22360588f, 0.22360243f, 0.22359554f, 0.22358519f, 0.22357140f, 0.22355416f, 0.22353347f, 0.22350934f, + 0.22348175f, 0.22345073f, 0.22341625f, 0.22337833f, 0.22333697f, 0.22329216f, 0.22324391f, 0.22319221f, + 0.22313708f, 0.22307850f, 0.22301648f, 0.22295103f, 0.22288213f, 0.22280980f, 0.22273403f, 0.22265483f, + 0.22257219f, 0.22248612f, 0.22239662f, 0.22230369f, 0.22220734f, 0.22210755f, 0.22200434f, 0.22189771f, + 0.22178765f, 0.22167418f, 0.22155728f, 0.22143697f, 0.22131325f, 0.22118611f, 0.22105556f, 0.22092160f, + 0.22078424f, 0.22064347f, 0.22049930f, 0.22035172f, 0.22020075f, 0.22004639f, 0.21988863f, 0.21972748f, + 0.21956294f, 0.21939501f, 0.21922370f, 0.21904901f, 0.21887095f, 0.21868950f, 0.21850469f, 0.21831650f, + 0.21812495f, 0.21793004f, 0.21773176f, 0.21753013f, 0.21732514f, 0.21711680f, 0.21690511f, 0.21669008f, + 0.21647170f, 0.21624999f, 0.21602494f, 0.21579656f, 0.21556486f, 0.21532983f, 0.21509147f, 0.21484981f, + 0.21460482f, 0.21435653f, 0.21410494f, 0.21385004f, 0.21359184f, 0.21333035f, 0.21306557f, 0.21279750f, + 0.21252616f, 0.21225153f, 0.21197363f, 0.21169247f, 0.21140803f, 0.21112034f, 0.21082939f, 0.21053520f, + 0.21023775f, 0.20993706f, 0.20963314f, 0.20932598f, 0.20901559f, 0.20870198f, 0.20838516f, 0.20806511f, + 0.20774186f, 0.20741541f, 0.20708576f, 0.20675291f, 0.20641688f, 0.20607766f, 0.20573527f, 0.20538970f, + 0.20504096f, 0.20468907f, 0.20433401f, 0.20397581f, 0.20361446f, 0.20324997f, 0.20288234f, 0.20251159f, + 0.20213771f, 0.20176072f, 0.20138061f, 0.20099740f, 0.20061109f, 0.20022169f, 0.19982920f, 0.19943362f, + 0.19903497f, 0.19863326f, 0.19822847f, 0.19782064f, 0.19740975f, 0.19699581f, 0.19657884f, 0.19615884f, + 0.19573581f, 0.19530977f, 0.19488071f, 0.19444865f, 0.19401358f, 0.19357553f, 0.19313449f, 0.19269047f, + 0.19224348f, 0.19179353f, 0.19134062f, 0.19088476f, 0.19042595f, 0.18996421f, 0.18949954f, 0.18903194f, + 0.18856143f, 0.18808802f, 0.18761170f, 0.18713249f, 0.18665039f, 0.18616542f, 0.18567757f, 0.18518686f, + 0.18469330f, 0.18419688f, 0.18369763f, 0.18319554f, 0.18269063f, 0.18218290f, 0.18167236f, 0.18115902f, + 0.18064289f, 0.18012397f, 0.17960227f, 0.17907781f, 0.17855058f, 0.17802060f, 0.17748787f, 0.17695240f, + 0.17641421f, 0.17587330f, 0.17532967f, 0.17478334f, 0.17423432f, 0.17368260f, 0.17312821f, 0.17257115f, + 0.17201143f, 0.17144906f, 0.17088404f, 0.17031639f, 0.16974611f, 0.16917321f, 0.16859770f, 0.16801960f, + 0.16743890f, 0.16685562f, 0.16626977f, 0.16568135f, 0.16509038f, 0.16449686f, 0.16390080f, 0.16330222f, + 0.16270112f, 0.16209751f, 0.16149140f, 0.16088280f, 0.16027172f, 0.15965817f, 0.15904216f, 0.15842369f, + 0.15780278f, 0.15717944f, 0.15655367f, 0.15592549f, 0.15529490f, 0.15466192f, 0.15402655f, 0.15338881f, + 0.15274870f, 0.15210624f, 0.15146143f, 0.15081429f, 0.15016482f, 0.14951304f, 0.14885894f, 0.14820256f, + 0.14754389f, 0.14688294f, 0.14621973f, 0.14555426f, 0.14488655f, 0.14421660f, 0.14354443f, 0.14287005f, + 0.14219346f, 0.14151468f, 0.14083372f, 0.14015058f, 0.13946529f, 0.13877784f, 0.13808825f, 0.13739654f, + 0.13670270f, 0.13600676f, 0.13530872f, 0.13460859f, 0.13390639f, 0.13320212f, 0.13249580f, 0.13178744f, + 0.13107704f, 0.13036462f, 0.12965019f, 0.12893376f, 0.12821535f, 0.12749495f, 0.12677259f, 0.12604828f, + 0.12532202f, 0.12459383f, 0.12386371f, 0.12313169f, 0.12239777f, 0.12166196f, 0.12092427f, 0.12018472f, + 0.11944332f, 0.11870007f, 0.11795500f, 0.11720810f, 0.11645940f, 0.11570890f, 0.11495662f, 0.11420256f, + 0.11344675f, 0.11268918f, 0.11192987f, 0.11116884f, 0.11040610f, 0.10964165f, 0.10887551f, 0.10810770f, + 0.10733821f, 0.10656707f, 0.10579429f, 0.10501988f, 0.10424384f, 0.10346620f, 0.10268696f, 0.10190614f, + 0.10112375f, 0.10033980f, 0.09955430f, 0.09876726f, 0.09797871f, 0.09718864f, 0.09639707f, 0.09560402f, + 0.09480949f, 0.09401350f, 0.09321606f, 0.09241718f, 0.09161688f, 0.09081516f, 0.09001205f, 0.08920754f, + 0.08840166f, 0.08759442f, 0.08678583f, 0.08597589f, 0.08516464f, 0.08435207f, 0.08353819f, 0.08272303f, + 0.08190660f, 0.08108890f, 0.08026995f, 0.07944976f, 0.07862835f, 0.07780572f, 0.07698190f, 0.07615688f, + 0.07533070f, 0.07450335f, 0.07367485f, 0.07284522f, 0.07201446f, 0.07118259f, 0.07034963f, 0.06951558f, + 0.06868046f, 0.06784427f, 0.06700705f, 0.06616879f, 0.06532951f, 0.06448922f, 0.06364793f, 0.06280567f, + 0.06196244f, 0.06111825f, 0.06027312f, 0.05942705f, 0.05858008f, 0.05773220f, 0.05688343f, 0.05603378f, + 0.05518327f, 0.05433190f, 0.05347970f, 0.05262667f, 0.05177284f, 0.05091820f, 0.05006278f, 0.04920659f, + 0.04834964f, 0.04749194f, 0.04663351f, 0.04577436f, 0.04491450f, 0.04405396f, 0.04319273f, 0.04233084f, + 0.04146829f, 0.04060511f, 0.03974129f, 0.03887687f, 0.03801185f, 0.03714624f, 0.03628005f, 0.03541331f, + 0.03454602f, 0.03367820f, 0.03280986f, 0.03194101f, 0.03107167f, 0.03020186f, 0.02933157f, 0.02846084f, + 0.02758966f, 0.02671806f, 0.02584605f, 0.02497364f, 0.02410084f, 0.02322767f, 0.02235414f, 0.02148027f, + 0.02060607f, 0.01973155f, 0.01885673f, 0.01798161f, 0.01710622f, 0.01623056f, 0.01535466f, 0.01447851f, + 0.01360215f, 0.01272557f, 0.01184880f, 0.01097184f, 0.01009472f, 0.00921744f, 0.00834001f, 0.00746246f, + 0.00658480f, 0.00570703f, 0.00482917f, 0.00395124f, 0.00307325f, 0.00219521f, 0.00131714f, 0.00043905f +}; + +const float edct_table_600[600] = +{ + 0.20205118f, 0.20204980f, 0.20204703f, 0.20204287f, 0.20203734f, 0.20203041f, 0.20202210f, 0.20201241f, + 0.20200133f, 0.20198887f, 0.20197502f, 0.20195979f, 0.20194318f, 0.20192518f, 0.20190579f, 0.20188503f, + 0.20186288f, 0.20183934f, 0.20181442f, 0.20178812f, 0.20176044f, 0.20173137f, 0.20170092f, 0.20166909f, + 0.20163587f, 0.20160128f, 0.20156530f, 0.20152794f, 0.20148920f, 0.20144908f, 0.20140758f, 0.20136469f, + 0.20132043f, 0.20127479f, 0.20122777f, 0.20117936f, 0.20112958f, 0.20107842f, 0.20102589f, 0.20097197f, + 0.20091668f, 0.20086001f, 0.20080196f, 0.20074254f, 0.20068174f, 0.20061957f, 0.20055602f, 0.20049110f, + 0.20042480f, 0.20035713f, 0.20028809f, 0.20021767f, 0.20014588f, 0.20007272f, 0.19999819f, 0.19992228f, + 0.19984501f, 0.19976637f, 0.19968635f, 0.19960497f, 0.19952222f, 0.19943811f, 0.19935262f, 0.19926577f, + 0.19917756f, 0.19908798f, 0.19899703f, 0.19890472f, 0.19881105f, 0.19871602f, 0.19861962f, 0.19852186f, + 0.19842274f, 0.19832226f, 0.19822043f, 0.19811723f, 0.19801267f, 0.19790676f, 0.19779949f, 0.19769087f, + 0.19758089f, 0.19746956f, 0.19735687f, 0.19724283f, 0.19712744f, 0.19701070f, 0.19689261f, 0.19677317f, + 0.19665237f, 0.19653024f, 0.19640675f, 0.19628192f, 0.19615574f, 0.19602822f, 0.19589936f, 0.19576915f, + 0.19563760f, 0.19550471f, 0.19537048f, 0.19523491f, 0.19509800f, 0.19495976f, 0.19482018f, 0.19467926f, + 0.19453701f, 0.19439343f, 0.19424851f, 0.19410226f, 0.19395469f, 0.19380578f, 0.19365554f, 0.19350398f, + 0.19335109f, 0.19319688f, 0.19304134f, 0.19288448f, 0.19272630f, 0.19256679f, 0.19240597f, 0.19224383f, + 0.19208036f, 0.19191559f, 0.19174950f, 0.19158209f, 0.19141337f, 0.19124334f, 0.19107200f, 0.19089934f, + 0.19072538f, 0.19055012f, 0.19037354f, 0.19019566f, 0.19001648f, 0.18983600f, 0.18965421f, 0.18947113f, + 0.18928674f, 0.18910106f, 0.18891409f, 0.18872581f, 0.18853625f, 0.18834539f, 0.18815324f, 0.18795980f, + 0.18776508f, 0.18756906f, 0.18737176f, 0.18717318f, 0.18697331f, 0.18677217f, 0.18656974f, 0.18636603f, + 0.18616105f, 0.18595479f, 0.18574726f, 0.18553845f, 0.18532837f, 0.18511702f, 0.18490440f, 0.18469052f, + 0.18447537f, 0.18425895f, 0.18404127f, 0.18382233f, 0.18360213f, 0.18338067f, 0.18315796f, 0.18293399f, + 0.18270877f, 0.18248229f, 0.18225456f, 0.18202559f, 0.18179536f, 0.18156389f, 0.18133118f, 0.18109722f, + 0.18086202f, 0.18062558f, 0.18038791f, 0.18014900f, 0.17990885f, 0.17966747f, 0.17942486f, 0.17918102f, + 0.17893595f, 0.17868965f, 0.17844213f, 0.17819339f, 0.17794342f, 0.17769224f, 0.17743984f, 0.17718622f, + 0.17693139f, 0.17667534f, 0.17641808f, 0.17615962f, 0.17589995f, 0.17563907f, 0.17537698f, 0.17511370f, + 0.17484922f, 0.17458353f, 0.17431665f, 0.17404858f, 0.17377931f, 0.17350885f, 0.17323721f, 0.17296437f, + 0.17269035f, 0.17241515f, 0.17213876f, 0.17186120f, 0.17158245f, 0.17130253f, 0.17102144f, 0.17073917f, + 0.17045574f, 0.17017113f, 0.16988536f, 0.16959843f, 0.16931033f, 0.16902107f, 0.16873066f, 0.16843909f, + 0.16814636f, 0.16785248f, 0.16755745f, 0.16726127f, 0.16696395f, 0.16666548f, 0.16636587f, 0.16606511f, + 0.16576322f, 0.16546020f, 0.16515604f, 0.16485075f, 0.16454433f, 0.16423678f, 0.16392810f, 0.16361830f, + 0.16330738f, 0.16299534f, 0.16268219f, 0.16236791f, 0.16205253f, 0.16173603f, 0.16141843f, 0.16109972f, + 0.16077991f, 0.16045899f, 0.16013697f, 0.15981386f, 0.15948965f, 0.15916435f, 0.15883796f, 0.15851047f, + 0.15818191f, 0.15785225f, 0.15752152f, 0.15718971f, 0.15685682f, 0.15652285f, 0.15618781f, 0.15585170f, + 0.15551452f, 0.15517628f, 0.15483697f, 0.15449661f, 0.15415518f, 0.15381269f, 0.15346916f, 0.15312457f, + 0.15277893f, 0.15243224f, 0.15208451f, 0.15173574f, 0.15138592f, 0.15103507f, 0.15068319f, 0.15033027f, + 0.14997632f, 0.14962134f, 0.14926534f, 0.14890831f, 0.14855026f, 0.14819120f, 0.14783112f, 0.14747003f, + 0.14710792f, 0.14674481f, 0.14638069f, 0.14601557f, 0.14564945f, 0.14528233f, 0.14491421f, 0.14454510f, + 0.14417500f, 0.14380391f, 0.14343184f, 0.14305878f, 0.14268474f, 0.14230973f, 0.14193374f, 0.14155677f, + 0.14117884f, 0.14079994f, 0.14042007f, 0.14003924f, 0.13965745f, 0.13927471f, 0.13889101f, 0.13850635f, + 0.13812075f, 0.13773420f, 0.13734671f, 0.13695828f, 0.13656890f, 0.13617860f, 0.13578735f, 0.13539518f, + 0.13500208f, 0.13460805f, 0.13421311f, 0.13381724f, 0.13342045f, 0.13302275f, 0.13262414f, 0.13222462f, + 0.13182419f, 0.13142286f, 0.13102063f, 0.13061750f, 0.13021348f, 0.12980856f, 0.12940275f, 0.12899606f, + 0.12858848f, 0.12818002f, 0.12777069f, 0.12736047f, 0.12694939f, 0.12653743f, 0.12612461f, 0.12571092f, + 0.12529637f, 0.12488096f, 0.12446470f, 0.12404758f, 0.12362961f, 0.12321080f, 0.12279114f, 0.12237064f, + 0.12194930f, 0.12152712f, 0.12110411f, 0.12068027f, 0.12025561f, 0.11983012f, 0.11940381f, 0.11897668f, + 0.11854873f, 0.11811998f, 0.11769041f, 0.11726004f, 0.11682886f, 0.11639688f, 0.11596410f, 0.11553053f, + 0.11509617f, 0.11466102f, 0.11422508f, 0.11378836f, 0.11335086f, 0.11291258f, 0.11247353f, 0.11203371f, + 0.11159312f, 0.11115177f, 0.11070965f, 0.11026678f, 0.10982315f, 0.10937876f, 0.10893363f, 0.10848775f, + 0.10804113f, 0.10759376f, 0.10714566f, 0.10669683f, 0.10624726f, 0.10579696f, 0.10534594f, 0.10489420f, + 0.10444174f, 0.10398856f, 0.10353467f, 0.10308007f, 0.10262477f, 0.10216876f, 0.10171205f, 0.10125464f, + 0.10079654f, 0.10033775f, 0.09987827f, 0.09941811f, 0.09895726f, 0.09849574f, 0.09803354f, 0.09757067f, + 0.09710713f, 0.09664293f, 0.09617806f, 0.09571253f, 0.09524635f, 0.09477952f, 0.09431203f, 0.09384390f, + 0.09337513f, 0.09290571f, 0.09243566f, 0.09196498f, 0.09149366f, 0.09102172f, 0.09054915f, 0.09007597f, + 0.08960216f, 0.08912774f, 0.08865272f, 0.08817708f, 0.08770084f, 0.08722400f, 0.08674656f, 0.08626852f, + 0.08578990f, 0.08531068f, 0.08483089f, 0.08435051f, 0.08386955f, 0.08338802f, 0.08290591f, 0.08242324f, + 0.08194000f, 0.08145620f, 0.08097185f, 0.08048693f, 0.08000147f, 0.07951546f, 0.07902890f, 0.07854180f, + 0.07805416f, 0.07756599f, 0.07707729f, 0.07658806f, 0.07609830f, 0.07560802f, 0.07511722f, 0.07462591f, + 0.07413409f, 0.07364176f, 0.07314892f, 0.07265559f, 0.07216175f, 0.07166742f, 0.07117260f, 0.07067729f, + 0.07018150f, 0.06968522f, 0.06918847f, 0.06869125f, 0.06819355f, 0.06769539f, 0.06719676f, 0.06669767f, + 0.06619812f, 0.06569812f, 0.06519767f, 0.06469678f, 0.06419544f, 0.06369366f, 0.06319144f, 0.06268879f, + 0.06218571f, 0.06168220f, 0.06117828f, 0.06067393f, 0.06016916f, 0.05966399f, 0.05915840f, 0.05865241f, + 0.05814602f, 0.05763923f, 0.05713204f, 0.05662447f, 0.05611650f, 0.05560815f, 0.05509942f, 0.05459031f, + 0.05408083f, 0.05357097f, 0.05306075f, 0.05255017f, 0.05203922f, 0.05152792f, 0.05101627f, 0.05050426f, + 0.04999191f, 0.04947922f, 0.04896619f, 0.04845282f, 0.04793912f, 0.04742509f, 0.04691074f, 0.04639606f, + 0.04588107f, 0.04536576f, 0.04485014f, 0.04433422f, 0.04381799f, 0.04330146f, 0.04278463f, 0.04226751f, + 0.04175010f, 0.04123240f, 0.04071442f, 0.04019617f, 0.03967763f, 0.03915883f, 0.03863975f, 0.03812042f, + 0.03760082f, 0.03708096f, 0.03656085f, 0.03604049f, 0.03551988f, 0.03499902f, 0.03447793f, 0.03395660f, + 0.03343504f, 0.03291325f, 0.03239124f, 0.03186900f, 0.03134654f, 0.03082387f, 0.03030099f, 0.02977790f, + 0.02925460f, 0.02873111f, 0.02820741f, 0.02768353f, 0.02715945f, 0.02663519f, 0.02611075f, 0.02558613f, + 0.02506133f, 0.02453636f, 0.02401122f, 0.02348592f, 0.02296046f, 0.02243483f, 0.02190906f, 0.02138314f, + 0.02085706f, 0.02033085f, 0.01980450f, 0.01927801f, 0.01875139f, 0.01822464f, 0.01769776f, 0.01717076f, + 0.01664365f, 0.01611642f, 0.01558908f, 0.01506164f, 0.01453409f, 0.01400644f, 0.01347870f, 0.01295086f, + 0.01242294f, 0.01189493f, 0.01136683f, 0.01083866f, 0.01031042f, 0.00978211f, 0.00925372f, 0.00872528f, + 0.00819677f, 0.00766821f, 0.00713960f, 0.00661094f, 0.00608223f, 0.00555348f, 0.00502469f, 0.00449587f, + 0.00396701f, 0.00343813f, 0.00290923f, 0.00238031f, 0.00185137f, 0.00132241f, 0.00079345f, 0.00026448f +}; + +/*----------------------------------------------------------------------------------* + * Mean ISF vector for active signal (only for AMR-WB IO mode) + *----------------------------------------------------------------------------------*/ + +const float mean_isf_amr_wb[M] = +{ + 288.411774f, + 518.149414f, + 912.352051f, + 1397.743652f, + 1795.418823f, + 2211.536133f, + 2621.461182f, + 3019.680176f, + 3417.989746f, + 3809.700928f, + 4181.547363f, + 4581.064941f, + 5012.819824f, + 5457.521484f, + 5876.145020f, + 1576.906494f +}; + +/*----------------------------------------------------------------------------------* + * Mean ISF vector for SID frames (only in AMR-WB IO mode) + *----------------------------------------------------------------------------------*/ + +const float mean_isf_noise_amr_wb[M] = +{ + 186.625259f, + 429.613403f, + 864.525085f, + 1276.010254f, + 1648.228394f, + 2039.998535f, + 2420.943115f, + 2828.022461f, + 3214.584961f, + 3575.200195f, + 3944.685303f, + 4338.971191f, + 4743.657227f, + 5149.993164f, + 5533.081055f, + 1485.457031f +}; + +/*----------------------------------------------------------------------------------* + * Initial LSF memory + *----------------------------------------------------------------------------------*/ + +const float lsf_init[16] = +{ + 375.0, 750.0, 1125.0, 1500.0, 1875.0, 2250.0, 2625.0, 3000.0, + 3375.0, 3750.0, 4125.0, 4500.0, 4875.0, 5250.0, 5625.0, 6000.0 +}; + + +/*----------------------------------------------------------------------------------* + * Gaussian codebook + *----------------------------------------------------------------------------------*/ + +const float gaus_dico[190] = +{ + -0.0973f, -0.0306f, 0.1278f, -0.1138f, 0.0744f, -0.1606f, + -0.1976f, 0.0115f, -0.0344f, -0.0417f, -0.1424f, -0.0633f, + 0.0723f, 0.3257f, -0.0697f, -0.0978f, -0.1168f, -0.1021f, + 0.0342f, -0.1319f, 0.0431f, -0.2658f, 0.0317f, -0.0712f, + 0.0348f, 0.1200f, -0.0758f, -0.2104f, -0.0781f, 0.0947f, + 0.1333f, 0.0204f, -0.2934f, 0.0262f, 0.0264f, 0.0830f, + 0.0584f, -0.0318f, 0.2271f, 0.0835f, 0.0374f, -0.0645f, + -0.1864f, -0.0277f, 0.0945f, -0.1306f, 0.0202f, -0.2090f, + -0.0881f, -0.1029f, 0.0292f, 0.0966f, -0.0896f, 0.1563f, + 0.1994f, 0.0543f, -0.2482f, -0.0201f, -0.0294f, 0.2172f, + 0.0830f, -0.0938f, 0.0115f, 0.0827f, -0.1233f, -0.1051f, + 0.0394f, 0.2390f, 0.2172f, -0.0653f, 0.0253f, 0.1241f, + -0.0366f, -0.0473f, 0.1080f, 0.0470f, 0.1009f, -0.0059f, + 0.0964f, -0.0105f, -0.0531f, 0.0169f, -0.0972f, 0.0408f, + 0.0283f, -0.2285f, -0.0232f, 0.3580f, -0.1063f, 0.1125f, + 0.2105f, -0.0331f, -0.0230f, 0.3200f, -0.0905f, 0.0166f, + 0.0328f, -0.0722f, -0.0380f, -0.1377f, -0.0118f, -0.1189f, + 0.1580f, 0.0769f, 0.1252f, -0.0247f, -0.1672f, -0.0777f, + -0.0841f, -0.1573f, -0.0160f, 0.2078f, 0.1011f, -0.0070f, + 0.1242f, 0.1011f, 0.1225f, 0.0973f, 0.1361f, 0.1584f, + -0.0729f, 0.1831f, 0.1332f, -0.1846f, -0.0029f, -0.0890f, + 0.1447f, -0.1727f, 0.0963f, -0.0321f, -0.0916f, -0.0151f, + -0.2232f, -0.0624f, -0.1036f, 0.0157f, 0.1134f, -0.2782f, + 0.0684f, 0.0222f, -0.0202f, -0.0704f, -0.1342f, 0.0950f, + 0.0128f, -0.2999f, 0.0015f, -0.1051f, 0.0180f, 0.0500f, + -0.1166f, -0.0361f, -0.1446f, 0.0688f, -0.0179f, 0.2959f, + 0.0102f, 0.1416f, -0.0815f, 0.1181f, -0.1867f, 0.1082f, + 0.1585f, 0.0661f, -0.1805f, 0.0915f, 0.1497f, -0.1124f, + -0.0508f, 0.0573f, -0.0294f, -0.0119f, -0.0759f, 0.1477f, + 0.2136f, 0.1271f, 0.0492f, -0.1235f, -0.1337f, -0.2657f, + -0.0106f, -0.0540f, 0.1642f, -0.0598f, -0.0065f, 0.1146f, + 0.0863f, 0.0129f, 0.1816f, 0.0672f +}; + +const float gaus_dico_swb[256] = +{ + 0.02164473f, 0.35885197f, -0.16274954f, -0.08241354f, 0.07313631f, -0.00054929f, -0.13080014f, 0.07226136f, + -0.13965981f, -0.04834007f, -0.02745908f, -0.02867859f, 0.11216793f, 0.16604294f, -0.00134274f, 0.06818508f, + -0.17387933f, 0.09406016f, -0.08150196f, 0.05083200f, -0.01952806f, -0.10203217f, -0.03067050f, -0.05153965f, + 0.06250680f, 0.00859049f, -0.12008808f, -0.11361376f, 0.17176038f, 0.01174004f, -0.02275130f, -0.09895785f, + -0.10167463f, -0.22059087f, -0.05334539f, -0.00629700f, -0.16706355f, 0.07795000f, 0.08731710f, 0.09669208f, + 0.15378080f, 0.01794813f, -0.01549965f, -0.24923822f, 0.19985947f, -0.10477958f, 0.06674605f, -0.11186616f, + -0.17927034f, 0.08443811f, 0.25542912f, 0.03167623f, 0.19633667f, 0.19163096f, 0.01907267f, 0.12298489f, + -0.03147158f, 0.05562247f, 0.30200079f, -0.04257871f, 0.08275045f, -0.03386311f, -0.02265750f, 0.18742503f, + -0.13598505f, -0.32004824f, -0.00438390f, -0.15576170f, 0.06006401f, -0.00952147f, 0.18848655f, 0.06630960f, + 0.07121546f, -0.00733249f, 0.08277771f, 0.22764891f, 0.06772452f, -0.09509693f, -0.00172236f, 0.08452052f, + 0.17020901f, -0.03737585f, 0.02349647f, 0.10855560f, 0.06854416f, 0.07084806f, 0.09390105f, 0.00124924f, + 0.03026483f, -0.15169589f, 0.01347072f, -0.15377805f, 0.14992996f, 0.11630810f, 0.03483583f, -0.03914850f, + -0.20075595f, 0.12728901f, -0.04495851f, -0.11576717f, -0.15281813f, 0.06055827f, -0.03471978f, -0.03617816f, + 0.17230885f, 0.03094525f, -0.15618153f, 0.21792564f, 0.08106838f, -0.22098514f, -0.10796417f, 0.07131225f, + 0.22092983f, -0.01539366f, -0.02876964f, -0.30910203f, 0.02143815f, -0.11630868f, -0.00922897f, 0.07431208f, + 0.15533504f, 0.11425125f, 0.07125455f, -0.11914105f, -0.04275274f, -0.05072749f, -0.22143129f, 0.19787727f, + -0.20946717f, -0.16564523f, 0.05962536f, -0.22325630f, -0.04333350f, -0.04707248f, 0.16608582f, 0.00948954f, + 0.11283893f, -0.04097161f, -0.09076904f, 0.26722300f, 0.00987607f, -0.05807892f, 0.07872546f, 0.08040629f, + 0.12927419f, -0.05647410f, 0.09603068f, -0.02356448f, -0.02160797f, -0.11687102f, 0.07936122f, -0.05764586f, + -0.10510305f, -0.02326054f, 0.12021790f, 0.09782617f, -0.22600858f, -0.02555378f, -0.03561033f, -0.01337216f, + 0.11311363f, -0.03096960f, -0.22801498f, 0.05643769f, 0.13053033f, 0.04452197f, -0.09299882f, -0.11475921f, + 0.02257649f, -0.21770498f, -0.11454470f, -0.09435777f, 0.00638951f, -0.36990553f, 0.04266735f, 0.06915011f, + 0.07644624f, -0.24336053f, -0.03421960f, -0.10622191f, -0.17223521f, 0.04054553f, 0.13831380f, 0.02925055f, + 0.16207848f, -0.12994884f, -0.09751288f, -0.05397306f, -0.09323815f, 0.13425350f, -0.00046960f, 0.31072289f, + 0.13740718f, 0.05835414f, -0.04803475f, 0.15423043f, -0.09652353f, 0.14896898f, -0.16368309f, 0.05875925f, + -0.03678078f, -0.19627908f, 0.07034992f, -0.27213186f, -0.04338680f, 0.01567988f, -0.09158870f, 0.11987700f, + 0.07083926f, 0.01099900f, -0.01084446f, 0.04508050f, -0.10655984f, -0.13945042f, 0.05837287f, 0.08458713f, + -0.04212087f, -0.15749574f, 0.11632511f, 0.07976698f, 0.06725866f, -0.09567240f, 0.03796997f, -0.09355708f, + -0.13569611f, -0.19498724f, 0.14951572f, -0.16023041f, 0.04185898f, 0.06099325f, 0.03425207f, 0.16211477f, + 0.03998571f, -0.03629408f, -0.10099959f, 0.19540504f, 0.11653102f, 0.23601755f, 0.04943547f, -0.26040605f, + 0.02153429f, 0.22880882f, -0.13646534f, 0.03881640f, -0.02896636f, 0.09774253f, -0.13509314f, -0.08713179f, + 0.13485038f, 0.06968338f, 0.19561967f, 0.07884958f, -0.10365590f, -0.10321335f, -0.09081125f, -0.00147976f +}; + +/*----------------------------------------------------------------------------------* + * CLDFB tables + *----------------------------------------------------------------------------------*/ + +const int16_t freqTable[2] = {20, 40}; + +/* SNR: 109.44, PHASE: 3.500000000000000 */ +const float CLDFB80_10[100] = +{ + 0.0000033382f, -0.0000023292f, -0.0000006582f, 0.0000001464f, -0.0000010899f, -0.0000009664f, + -0.0000000104f, -0.0000018105f, -0.0000012856f, 0.0000017112f, 0.0000137155f, -0.0000084710f, + -0.0000015748f, -0.0000002482f, 0.0000036294f, -0.0000043816f, 0.0000003906f, 0.0000043318f, + 0.0000049126f, -0.0000061826f, -0.0002270069f, -0.0000675402f, -0.0000158982f, 0.0000138120f, + -0.0000220086f, -0.0000356560f, 0.0000171849f, -0.0000194504f, -0.0000058158f, -0.0002621811f, + -0.0009969691f, -0.0001427984f, -0.0000188085f, -0.0000040399f, -0.0001954359f, 0.0001806872f, + 0.0000232574f, -0.0000047551f, -0.0000321009f, 0.0010723262f, -0.0020160153f, -0.0007751652f, + 0.0003508478f, 0.0015707671f, 0.0017180828f, 0.0015807568f, 0.0021944824f, 0.0028288425f, + 0.0030257006f, 0.0016570983f, -0.0014279413f, -0.0015962377f, 0.0007765516f, 0.0025625922f, + 0.0022554877f, 0.0002647332f, -0.0032977409f, -0.0065113932f, -0.0095444393f, -0.0136373114f, + 0.0186561662f, 0.0242546518f, 0.0320538418f, 0.0427742450f, 0.0565841171f, 0.0732940277f, + 0.0914110197f, 0.1082620545f, 0.1209072165f, 0.1269811579f, 0.1253574855f, 0.1136768387f, + 0.0887587689f, 0.0497640968f, -0.0031398279f, -0.0698373206f, -0.1494875982f, -0.2406007759f, + -0.3411996303f, -0.4484628681f, 0.5579472269f, 0.6655527761f, 0.7669493517f, 0.8575328375f, + 0.9329386030f, 0.9892971917f, 1.0250167399f, 1.0397966587f, 1.0375221638f, 1.0163053398f, + 0.9610874400f, 0.8748972145f, 0.7783924293f, 0.6777346686f, 0.5724389618f, 0.4648620471f, + 0.3560337451f, 0.2485564060f, 0.1386438276f, 0.0416433203f, +}; + +/* SNR: 292.49, PHASE: 2.000000000000000 */ +const float CLDFB80_16[160] = +{ + 0.0000005510f, -0.0000007674f, -0.0000002340f, 0.0000000964f, 0.0000000593f, -0.0000000017f, + -0.0000000178f, 0.0000021953f, 0.0000030004f, -0.0000000167f, -0.0000000019f, 0.0000000702f, + 0.0000000344f, -0.0000000765f, -0.0000005553f, 0.0000007526f, 0.0000020881f, -0.0000028263f, + -0.0000007033f, 0.0000002370f, 0.0000001175f, -0.0000004048f, 0.0000000996f, -0.0000180207f, + 0.0000246292f, -0.0000000934f, 0.0000004489f, -0.0000001390f, -0.0000000845f, 0.0000002300f, + 0.0000020452f, -0.0000028520f, -0.0003204839f, -0.0001476489f, -0.0000626217f, -0.0000446346f, + -0.0000202236f, 0.0000151160f, 0.0000057995f, 0.0000450017f, 0.0000433006f, 0.0000050745f, + 0.0000167005f, -0.0000314631f, -0.0000244547f, -0.0000125422f, -0.0000911863f, -0.0004371781f, + -0.0012267106f, -0.0005247118f, -0.0001857576f, -0.0001103593f, -0.0000402931f, 0.0000108771f, + -0.0000576360f, 0.0000602621f, -0.0002317927f, 0.0000520316f, 0.0000035090f, 0.0000625950f, + 0.0000603417f, 0.0000368907f, 0.0003220307f, 0.0016733998f, -0.0021551784f, -0.0015444660f, + -0.0007592329f, -0.0001077355f, 0.0007091208f, 0.0015054295f, 0.0017984668f, 0.0011461500f, + 0.0015946160f, 0.0018157551f, 0.0022526599f, 0.0027665136f, 0.0029611644f, 0.0030474884f, + 0.0025509350f, 0.0012885692f, -0.0011048694f, -0.0019476595f, -0.0014849578f, -0.0000191307f, + 0.0014542427f, 0.0025014060f, 0.0026282341f, 0.0020896060f, 0.0009380930f, -0.0012303806f, + -0.0035150110f, -0.0055687066f, -0.0074233361f, -0.0093371234f, -0.0117127490f, -0.0145175090f, + 0.0177813213f, 0.0209221310f, 0.0246700384f, 0.0293186424f, 0.0350939424f, 0.0420166741f, + 0.0501689083f, 0.0594973479f, 0.0699793095f, 0.0811978302f, 0.0925316969f, 0.1033039355f, + 0.1127998301f, 0.1202885467f, 0.1252446307f, 0.1272143872f, 0.1262547749f, 0.1217276780f, + 0.1125292370f, 0.0980647299f, 0.0780704213f, 0.0526074650f, 0.0217182187f, -0.0146037409f, + -0.0563029259f, -0.1031675028f, -0.1548654211f, -0.2110103318f, -0.2711216615f, -0.3346791161f, + -0.4009613796f, -0.4689983890f, 0.5374920358f, 0.6054498150f, 0.6721266919f, 0.7362374318f, + 0.7966023599f, 0.8522654625f, 0.9021245679f, 0.9450253190f, 0.9802630812f, 1.0075496836f, + 1.0265340754f, 1.0372359728f, 1.0407524022f, 1.0381397893f, 1.0284102813f, 1.0099196627f, + 0.9753688495f, 0.9254582964f, 0.8690385973f, 0.8090082031f, 0.7474414548f, 0.6841760105f, + 0.6189218236f, 0.5524001591f, 0.4851748506f, 0.4172433895f, 0.3492691242f, 0.2821066655f, + 0.2146356085f, 0.1455327617f, 0.0796914490f, 0.0278251946f, +}; + +/* SNR: 89.77, PHASE: 1.500000000000000 */ +const float CLDFB80_20[200] = +{ + 0.0000016461f, -0.0000046862f, -0.0000000815f, -0.0000001822f, 0.0000000240f, 0.0000001892f, + -0.0000002365f, -0.0000007031f, -0.0000000079f, 0.0000048656f, 0.0000070490f, 0.0000000032f, + 0.0000001499f, -0.0000000944f, 0.0000004307f, -0.0000000787f, -0.0000001070f, 0.0000015376f, + -0.0000025088f, 0.0000044280f, 0.0000046060f, -0.0000207092f, -0.0000004877f, -0.0000006126f, + 0.0000000605f, 0.0000004365f, -0.0000003741f, -0.0000009508f, 0.0000006700f, -0.0000087189f, + 0.0000114297f, -0.0000007710f, -0.0000002908f, 0.0000001583f, -0.0000010138f, 0.0000001875f, + 0.0000003789f, -0.0000065731f, 0.0000112115f, -0.0000036253f, -0.0003045828f, -0.0002068946f, + -0.0000330428f, -0.0000658559f, -0.0000416668f, -0.0000207558f, -0.0000046097f, 0.0000096778f, + -0.0000064960f, 0.0000515938f, 0.0000257367f, -0.0000068671f, 0.0000029284f, -0.0000209369f, + -0.0000191720f, -0.0000235869f, -0.0000286778f, 0.0000594843f, -0.0001104448f, -0.0004947290f, + -0.0011759540f, -0.0006581582f, -0.0001310136f, -0.0001782524f, -0.0001002354f, -0.0000465158f, + -0.0000188237f, 0.0000285072f, -0.0001359344f, 0.0002814194f, -0.0004814411f, 0.0001302339f, + -0.0000257394f, 0.0000578339f, 0.0000485628f, 0.0000543116f, 0.0000763443f, -0.0001495108f, + 0.0003492618f, 0.0018283780f, -0.0019931487f, -0.0018716309f, -0.0008617653f, -0.0006080124f, + -0.0000337803f, 0.0006187704f, 0.0012478726f, 0.0016757046f, 0.0018115391f, 0.0007745483f, + 0.0016550121f, 0.0017032298f, 0.0019356593f, 0.0024080283f, 0.0027878510f, 0.0029379588f, + 0.0030637651f, 0.0028257202f, 0.0021943273f, 0.0010679683f, -0.0009250455f, -0.0017798333f, + -0.0018826540f, -0.0011010583f, 0.0001463485f, 0.0013293069f, 0.0022974838f, 0.0027746423f, + 0.0025078917f, 0.0020425098f, 0.0011954954f, -0.0005741594f, -0.0024120809f, -0.0041653667f, + -0.0057623702f, -0.0072425386f, -0.0087363677f, -0.0104237699f, -0.0125156239f, -0.0148077168f, + 0.0174398402f, 0.0199230411f, 0.0226649147f, 0.0259599813f, 0.0298434758f, 0.0344649815f, + 0.0398139569f, 0.0459314689f, 0.0528498740f, 0.0604788669f, 0.0688814001f, 0.0777923399f, + 0.0868947517f, 0.0958553537f, 0.1043243835f, 0.1119302041f, 0.1182880738f, 0.1231125873f, + 0.1261745561f, 0.1272284850f, 0.1264656300f, 0.1235525506f, 0.1177556666f, 0.1087635447f, + 0.0963144136f, 0.0803171444f, 0.0608146076f, 0.0378425383f, 0.0113896330f, -0.0185270856f, + -0.0518892622f, -0.0885871716f, -0.1284318249f, -0.1712634880f, -0.2168508609f, -0.2649463144f, + -0.3152867427f, -0.3675395959f, -0.4212350657f, -0.4758650706f, 0.5306725282f, 0.5851445237f, + 0.6390281696f, 0.6916889535f, 0.7424591009f, 0.7907617163f, 0.8361206884f, 0.8779983070f, + 0.9157691951f, 0.9489012228f, 0.9770929872f, 1.0002174168f, 1.0180999340f, 1.0305853696f, + 1.0378851378f, 1.0406826783f, 1.0395784114f, 1.0343061945f, 1.0237762412f, 1.0076524569f, + 0.9800034826f, 0.9411740407f, 0.8979145998f, 0.8512639848f, 0.8029102780f, 0.7536620391f, + 0.7033730373f, 0.6517679660f, 0.5990562278f, 0.5457078369f, 0.4919297136f, 0.4376796414f, + 0.3831842053f, 0.3290362900f, 0.2754121565f, 0.2214602867f, 0.1663238479f, 0.1115465981f, + 0.0622889538f, 0.0233593568f, +}; + +/* SNR: 89.29, PHASE: 0.833333333333333 */ +const float CLDFB80_30[300] = +{ + -0.0000002772f, 0.0000033382f, 0.0000018078f, -0.0000007965f, -0.0000023292f, -0.0000000163f, + 0.0000001004f, -0.0000006582f, 0.0000000287f, 0.0000000140f, 0.0000001464f, 0.0000002826f, + 0.0000000427f, -0.0000010899f, 0.0000048488f, 0.0000070973f, -0.0000009664f, 0.0000000360f, + 0.0000004432f, -0.0000000104f, -0.0000000269f, -0.0000000107f, -0.0000018105f, 0.0000000543f, + -0.0000000029f, -0.0000012856f, -0.0000006144f, 0.0000009806f, 0.0000017112f, -0.0000026992f, + -0.0000120997f, 0.0000137155f, 0.0000075545f, -0.0000032372f, -0.0000084710f, -0.0000000206f, + 0.0000002472f, -0.0000015748f, 0.0000000428f, -0.0000000299f, -0.0000002482f, 0.0000005522f, + 0.0000001959f, 0.0000036294f, 0.0000084418f, -0.0000120850f, -0.0000043816f, -0.0000001651f, + -0.0000010266f, 0.0000003906f, 0.0000001476f, 0.0000000560f, 0.0000043318f, -0.0000001327f, + -0.0000000099f, 0.0000049126f, 0.0000025641f, -0.0000041212f, -0.0000061826f, 0.0000182899f, + -0.0003177625f, -0.0002270069f, -0.0001470513f, -0.0000710867f, -0.0000675402f, -0.0000612052f, + -0.0000458905f, -0.0000158982f, -0.0000198609f, -0.0000044865f, 0.0000138120f, 0.0000259521f, + -0.0000014174f, -0.0000220086f, 0.0000046746f, -0.0000478217f, -0.0000356560f, -0.0000008176f, + 0.0000554471f, 0.0000171849f, -0.0000104782f, -0.0000342931f, -0.0000194504f, -0.0000247231f, + -0.0000266321f, -0.0000058158f, -0.0000154718f, -0.0000860619f, -0.0002621811f, -0.0006329730f, + -0.0010151313f, -0.0009969691f, -0.0006401095f, -0.0002347208f, -0.0001427984f, -0.0001657818f, + -0.0001142242f, -0.0000188085f, -0.0000385187f, -0.0000275046f, -0.0000040399f, 0.0000495378f, + -0.0001045437f, -0.0001954359f, 0.0005754000f, -0.0007487377f, 0.0001806872f, 0.0000995589f, + -0.0000996504f, 0.0000232574f, 0.0000603268f, 0.0000660807f, -0.0000047551f, 0.0000619265f, + 0.0000723872f, -0.0000321009f, 0.0000223561f, 0.0003720504f, 0.0010723262f, 0.0019477029f, + -0.0018122293f, -0.0020160153f, -0.0017426363f, -0.0010556444f, -0.0007751652f, -0.0005221317f, + -0.0001347624f, 0.0003508478f, 0.0007386346f, 0.0011721899f, 0.0015707671f, 0.0017166805f, + 0.0018089705f, 0.0017180828f, 0.0002671723f, 0.0016677326f, 0.0015807568f, 0.0017534327f, + 0.0019075685f, 0.0021944824f, 0.0024875266f, 0.0027574445f, 0.0028288425f, 0.0029688585f, + 0.0030573770f, 0.0030257006f, 0.0027683197f, 0.0023855538f, 0.0016570983f, 0.0007261425f, + -0.0006240877f, -0.0014279413f, -0.0018848796f, -0.0019263976f, -0.0015962377f, -0.0009120500f, + -0.0000736785f, 0.0007765516f, 0.0014961634f, 0.0021524541f, 0.0025625922f, 0.0027460441f, + 0.0025688449f, 0.0022554877f, 0.0019970512f, 0.0015552223f, 0.0002647332f, -0.0008620885f, + -0.0020865380f, -0.0032977409f, -0.0044403210f, -0.0055039505f, -0.0065113932f, -0.0074839181f, + -0.0084786965f, -0.0095444393f, -0.0107566368f, -0.0121559845f, -0.0136373114f, -0.0152125941f, + 0.0169692165f, 0.0186561662f, 0.0203704498f, 0.0221787331f, 0.0242546518f, 0.0265582983f, + 0.0291465321f, 0.0320538418f, 0.0353059968f, 0.0388699993f, 0.0427742450f, 0.0470319574f, + 0.0516455579f, 0.0565841171f, 0.0617960053f, 0.0674208876f, 0.0732940277f, 0.0793036968f, + 0.0853757711f, 0.0914110197f, 0.0973085175f, 0.1029609938f, 0.1082620545f, 0.1130850459f, + 0.1173295323f, 0.1209072165f, 0.1237469292f, 0.1257934619f, 0.1269811579f, 0.1271703366f, + 0.1266559114f, 0.1253574855f, 0.1227915199f, 0.1189360593f, 0.1136768387f, 0.1069333476f, + 0.0986359173f, 0.0887587689f, 0.0773092890f, 0.0643073307f, 0.0497640968f, 0.0336765771f, + 0.0160401582f, -0.0031398279f, -0.0238366387f, -0.0460799881f, -0.0698373206f, -0.0950128018f, + -0.1215783841f, -0.1494875982f, -0.1786760784f, -0.2090721736f, -0.2406007759f, -0.2731879051f, + -0.3067537961f, -0.3411996303f, -0.3764015708f, -0.4122065782f, -0.4484628681f, -0.4850451997f, + 0.5215924710f, 0.5579472269f, 0.5941804962f, 0.6301135607f, 0.6655527761f, 0.7002994797f, + 0.7341550905f, 0.7669493517f, 0.7985389090f, 0.8287866009f, 0.8575328375f, 0.8845952462f, + 0.9097846281f, 0.9329386030f, 0.9539491421f, 0.9727435862f, 0.9892971917f, 1.0035676672f, + 1.0154927835f, 1.0250167399f, 1.0321480823f, 1.0370035227f, 1.0397966587f, 1.0407627030f, + 1.0400314908f, 1.0375221638f, 1.0329480648f, 1.0259438203f, 1.0163053398f, 1.0048344063f, + 0.9863956401f, 0.9610874400f, 0.9342743262f, 0.9054084925f, 0.8748972145f, 0.8432873810f, + 0.8110381808f, 0.7783924293f, 0.7453640666f, 0.7118431392f, 0.6777346686f, 0.6430470493f, + 0.6078972260f, 0.5724389618f, 0.5367746506f, 0.5009238704f, 0.4648620471f, 0.4286003322f, + 0.3922588980f, 0.3560337451f, 0.3200733025f, 0.2843378434f, 0.2485564060f, 0.2123552623f, + 0.1755742394f, 0.1386438276f, 0.1027751331f, 0.0698223020f, 0.0416433203f, 0.0171881989f, +}; + +/* SNR: 85.69, PHASE: 0.750000000000000 */ +const float CLDFB80_32[320] = +{ + -0.0000010182f, 0.0000018812f, -0.0000013969f, 0.0000000702f, -0.0000030351f, -0.0000001862f, + 0.0000000017f, 0.0000000804f, -0.0000002859f, -0.0000000058f, -0.0000003463f, -0.0000003782f, + 0.0000006385f, 0.0000000365f, -0.0000015696f, 0.0000043896f, 0.0000063462f, -0.0000013860f, + 0.0000000439f, 0.0000007243f, -0.0000000373f, -0.0000001214f, 0.0000000228f, -0.0000008123f, + 0.0000002096f, -0.0000000043f, -0.0000001079f, -0.0000005174f, -0.0000001146f, -0.0000006991f, + 0.0000012420f, -0.0000054157f, -0.0000164806f, 0.0000076445f, -0.0000065087f, 0.0000002224f, + -0.0000110942f, -0.0000006228f, 0.0000000012f, 0.0000001914f, -0.0000006876f, 0.0000000004f, + -0.0000005395f, -0.0000007555f, 0.0000015057f, 0.0000005303f, 0.0000035648f, 0.0000094151f, + -0.0000133505f, -0.0000042847f, -0.0000005848f, -0.0000018021f, 0.0000001676f, 0.0000001730f, + -0.0000000645f, 0.0000019429f, -0.0000005012f, 0.0000000132f, 0.0000003799f, 0.0000014190f, + 0.0000005446f, 0.0000033533f, -0.0000041925f, 0.0000243728f, -0.0003249116f, -0.0002555667f, + -0.0001781466f, -0.0000946691f, -0.0000512440f, -0.0000668181f, -0.0000538663f, -0.0000367589f, + -0.0000153566f, -0.0000159763f, -0.0000043008f, 0.0000014360f, 0.0000256407f, -0.0000045056f, + -0.0000224244f, -0.0000056258f, -0.0000573469f, -0.0000427838f, -0.0000040513f, 0.0000493530f, + -0.0000199927f, -0.0000284530f, -0.0000443529f, -0.0000157197f, -0.0000152059f, -0.0000265666f, + -0.0000286606f, 0.0000426372f, -0.0000445737f, -0.0000968212f, -0.0002992176f, -0.0006564777f, + -0.0009923400f, -0.0010465131f, -0.0006586000f, -0.0003460162f, -0.0000803812f, -0.0001828317f, + -0.0001374910f, -0.0000892170f, -0.0000247429f, -0.0000281266f, -0.0000112548f, -0.0000220216f, + 0.0000281030f, -0.0001241423f, -0.0001739019f, 0.0006003709f, -0.0007665771f, 0.0001545192f, + 0.0001183979f, -0.0000725009f, 0.0000709099f, 0.0000556600f, 0.0000787870f, 0.0000127551f, + 0.0000418355f, 0.0000676110f, 0.0000771386f, -0.0001678521f, 0.0001526165f, 0.0003591734f, + 0.0011851563f, 0.0019531880f, -0.0018073091f, -0.0020646655f, -0.0018286838f, -0.0012220764f, + -0.0007555665f, -0.0006377868f, -0.0003093176f, 0.0000756312f, 0.0005274300f, 0.0009274213f, + 0.0012803192f, 0.0016235299f, 0.0017557598f, 0.0018111856f, 0.0016683303f, 0.0002150325f, + 0.0016540635f, 0.0015774318f, 0.0017217761f, 0.0018831036f, 0.0020842542f, 0.0023790930f, + 0.0026699692f, 0.0028034973f, 0.0028981065f, 0.0030135931f, 0.0030635897f, 0.0029615904f, + 0.0027120429f, 0.0022714745f, 0.0016059652f, 0.0006835412f, -0.0005828829f, -0.0013844400f, + -0.0018243580f, -0.0019502151f, -0.0017356111f, -0.0011689841f, -0.0004229350f, 0.0003965073f, + 0.0011294169f, 0.0017707072f, 0.0023448371f, 0.0026728102f, 0.0027087051f, 0.0025324105f, + 0.0022209939f, 0.0019939538f, 0.0015995394f, 0.0003709522f, -0.0006814813f, -0.0018062812f, + -0.0029774326f, -0.0040602444f, -0.0050788762f, -0.0060470476f, -0.0069716019f, -0.0078811278f, + -0.0088339160f, -0.0098593061f, -0.0110571431f, -0.0123801308f, -0.0137829951f, -0.0152658987f, + 0.0169119551f, 0.0185130319f, 0.0200914127f, 0.0217670701f, 0.0236411334f, 0.0257401339f, + 0.0280588687f, 0.0306516429f, 0.0335396415f, 0.0367140220f, 0.0401734073f, 0.0439328404f, + 0.0480118471f, 0.0523958086f, 0.0570643279f, 0.0619617615f, 0.0672386055f, 0.0727386082f, + 0.0783586322f, 0.0840454562f, 0.0897239254f, 0.0953063133f, 0.1006989894f, 0.1058297221f, + 0.1105886458f, 0.1148828316f, 0.1186363019f, 0.1217873693f, 0.1242652074f, 0.1260376844f, + 0.1270428159f, 0.1271553981f, 0.1266717254f, 0.1255342565f, 0.1232765470f, 0.1198938969f, + 0.1153006197f, 0.1094250684f, 0.1021978763f, 0.0935850985f, 0.0835853025f, 0.0722146942f, + 0.0594803881f, 0.0453959671f, 0.0299515180f, 0.0131448092f, -0.0050174243f, -0.0245067664f, + -0.0453599939f, -0.0675506175f, -0.0909864895f, -0.1156500318f, -0.1415054519f, -0.1685034579f, + -0.1965824123f, -0.2256851924f, -0.2557490596f, -0.2867109877f, -0.3185003509f, -0.3510308710f, + -0.3841878257f, -0.4178462189f, -0.4518783777f, -0.4861948985f, 0.5204589154f, 0.5545392477f, + 0.5885349528f, 0.6222881265f, 0.6556472882f, 0.6884462258f, 0.7205203255f, 0.7517187214f, + 0.7819150729f, 0.8109973423f, 0.8388462493f, 0.8653227793f, 0.8902717587f, 0.9135401037f, + 0.9350004724f, 0.9545704608f, 0.9721900670f, 0.9878415249f, 1.0014908046f, 1.0130877123f, + 1.0225821802f, 1.0299620942f, 1.0352930981f, 1.0387279035f, 1.0404656862f, 1.0406699226f, + 1.0393792732f, 1.0364602207f, 1.0316371259f, 1.0246094465f, 1.0152749279f, 1.0045111461f, + 0.9872243762f, 0.9634951727f, 0.9386029698f, 0.9118835665f, 0.8836131513f, 0.8542438147f, + 0.8241955864f, 0.7937396816f, 0.7629631733f, 0.7318123869f, 0.7001870615f, 0.6680338585f, + 0.6353919868f, 0.6023736401f, 0.5691034053f, 0.5356571527f, 0.5020472026f, 0.4682522004f, + 0.4342757821f, 0.4002060880f, 0.3661991567f, 0.3324016480f, 0.2988415427f, 0.2653598332f, + 0.2316572400f, 0.1974745970f, 0.1628547074f, 0.1283770554f, 0.0952404323f, 0.0650740936f, + 0.0392771501f, 0.0163785856f, +}; + +/* SNR: 81.55, PHASE: 0.500000000000000 */ +const float CLDFB80_40[400] = +{ + -0.0000041528f, -0.0000003900f, -0.0000033779f, 0.0000013260f, -0.0000003143f, -0.0000019348f, + 0.0000002820f, 0.0000000171f, 0.0000000756f, 0.0000001478f, -0.0000006625f, 0.0000000082f, + 0.0000000114f, -0.0000002690f, -0.0000007281f, 0.0000005577f, -0.0000000239f, 0.0000002429f, + -0.0000004091f, 0.0000026069f, 0.0000034995f, -0.0000001726f, 0.0000002145f, -0.0000000401f, + 0.0000006351f, -0.0000000199f, -0.0000000701f, -0.0000000269f, -0.0000000511f, -0.0000018158f, + 0.0000003875f, 0.0000000519f, 0.0000000148f, 0.0000002168f, 0.0000008257f, -0.0000004464f, + 0.0000006336f, -0.0000025316f, -0.0000005295f, -0.0000153180f, -0.0000308298f, -0.0000015398f, + -0.0000152958f, 0.0000058438f, -0.0000013050f, -0.0000070187f, 0.0000011695f, 0.0000000763f, + 0.0000001881f, 0.0000003524f, -0.0000015865f, -0.0000000049f, -0.0000000249f, -0.0000006192f, + -0.0000011121f, 0.0000012060f, -0.0000000166f, 0.0000001099f, -0.0000106587f, 0.0000106129f, + -0.0000148286f, 0.0000149412f, 0.0000001626f, 0.0000000725f, -0.0000015409f, 0.0000000950f, + 0.0000003484f, 0.0000001231f, 0.0000001497f, 0.0000043429f, -0.0000009269f, -0.0000001280f, + -0.0000000626f, -0.0000009033f, -0.0000040910f, 0.0000019169f, -0.0000028704f, 0.0000109325f, + -0.0000009252f, 0.0000489011f, -0.0003468893f, -0.0003166165f, -0.0002216732f, -0.0001440458f, + -0.0000849613f, -0.0000369773f, -0.0000635098f, -0.0000591070f, -0.0000486803f, -0.0000341989f, + -0.0000120811f, -0.0000190275f, -0.0000064494f, 0.0000069162f, -0.0000021987f, 0.0000272330f, + 0.0000008567f, -0.0000105879f, 0.0000129785f, -0.0000391934f, -0.0000840231f, 0.0000041534f, + -0.0000069437f, 0.0000002747f, 0.0000564106f, -0.0000335888f, -0.0000091603f, -0.0000220067f, + -0.0000377648f, -0.0000212702f, -0.0000107779f, -0.0000254405f, -0.0000262093f, -0.0000203017f, + 0.0000691479f, -0.0000348713f, -0.0000882526f, -0.0001632241f, -0.0003897623f, -0.0007277920f, + -0.0009273781f, -0.0011866370f, -0.0007657374f, -0.0005999553f, -0.0002985749f, -0.0000739204f, + -0.0001965512f, -0.0001587267f, -0.0001222374f, -0.0000844484f, -0.0000080229f, -0.0000361957f, + -0.0000240334f, 0.0000097698f, -0.0000196647f, 0.0000408240f, -0.0000873313f, -0.0001974888f, + -0.0000745679f, 0.0006405856f, -0.0007833142f, -0.0000263740f, 0.0001825899f, 0.0000836328f, + -0.0000919747f, 0.0000758216f, 0.0000210116f, 0.0000664122f, 0.0000716628f, -0.0000011497f, + 0.0000361513f, 0.0000644816f, 0.0000707314f, 0.0000692091f, -0.0002055217f, 0.0001007125f, + 0.0003613597f, 0.0005722141f, 0.0014928248f, 0.0019595151f, -0.0018123181f, -0.0021841686f, + -0.0019313868f, -0.0016661118f, -0.0011520847f, -0.0007460794f, -0.0007200000f, -0.0004759622f, + -0.0001911740f, 0.0001177745f, 0.0005112609f, 0.0007956582f, 0.0011317990f, 0.0014125904f, + 0.0016338868f, 0.0017396047f, 0.0018056445f, 0.0018052119f, 0.0014209425f, 0.0000970427f, + 0.0015804238f, 0.0015713347f, 0.0016260006f, 0.0017792934f, 0.0018939546f, 0.0020439435f, + 0.0023023017f, 0.0025264800f, 0.0027361034f, 0.0028056985f, 0.0028830887f, 0.0029840440f, + 0.0030499023f, 0.0030582362f, 0.0029323543f, 0.0027372045f, 0.0024602608f, 0.0018918251f, + 0.0014430869f, 0.0005567848f, -0.0004563602f, -0.0012376069f, -0.0015957612f, -0.0019181670f, + -0.0019416943f, -0.0017732047f, -0.0013639015f, -0.0008131398f, -0.0001818974f, 0.0004785653f, + 0.0010577894f, 0.0015807496f, 0.0020750864f, 0.0024484891f, 0.0027097859f, 0.0027252487f, + 0.0025942388f, 0.0023933812f, 0.0021363139f, 0.0019878937f, 0.0017252901f, 0.0007007239f, + -0.0001528669f, -0.0010081819f, -0.0019255759f, -0.0028704299f, -0.0037352063f, -0.0045760650f, + -0.0053741521f, -0.0061399643f, -0.0068807053f, -0.0076055948f, -0.0083505693f, -0.0091327970f, + -0.0099660466f, -0.0109276265f, -0.0119779770f, -0.0130668832f, -0.0142243967f, -0.0154284789f, + 0.0167425678f, 0.0180870259f, 0.0192629868f, 0.0205914974f, 0.0219419942f, 0.0234393525f, + 0.0250925019f, 0.0268648248f, 0.0288064481f, 0.0309261411f, 0.0332359672f, 0.0357337882f, + 0.0384058373f, 0.0412703873f, 0.0443254146f, 0.0475898752f, 0.0510512395f, 0.0546934731f, + 0.0585192825f, 0.0624617968f, 0.0666925081f, 0.0710800609f, 0.0755330962f, 0.0800607977f, + 0.0846155968f, 0.0891603964f, 0.0936468776f, 0.0980290565f, 0.1022710303f, 0.1063242147f, + 0.1101321383f, 0.1136484689f, 0.1168337639f, 0.1196454804f, 0.1220672782f, 0.1240474957f, + 0.1255837620f, 0.1266445580f, 0.1271706795f, 0.1271032514f, 0.1267122859f, 0.1259990302f, + 0.1245431141f, 0.1223810246f, 0.1194917271f, 0.1158164730f, 0.1113281486f, 0.1059821849f, + 0.0997598463f, 0.0926475473f, 0.0846476380f, 0.0757687538f, 0.0660180747f, 0.0553969977f, + 0.0439122033f, 0.0315571111f, 0.0183294511f, 0.0042339687f, -0.0107303776f, -0.0265261206f, + -0.0432087461f, -0.0607651851f, -0.0791119955f, -0.0982585186f, -0.1181828257f, -0.1388675094f, + -0.1602878821f, -0.1824109255f, -0.2052090118f, -0.2286494873f, -0.2527009969f, -0.2773319455f, + -0.3025075323f, -0.3281859857f, -0.3543210024f, -0.3808473827f, -0.4077028160f, -0.4348259057f, + -0.4621422068f, -0.4896449982f, 0.5170583948f, 0.5443118380f, 0.5715622296f, 0.5986919021f, + 0.6256446209f, 0.6523342207f, 0.6786749944f, 0.7045840109f, 0.7299779641f, 0.7547853740f, + 0.7789437691f, 0.8023962911f, 0.8250842263f, 0.8469401272f, 0.8678891784f, 0.8878500705f, + 0.9067442457f, 0.9245026353f, 0.9410725379f, 0.9564213901f, 0.9705164338f, 0.9833542233f, + 0.9949193206f, 1.0051881116f, 1.0141325299f, 1.0217280805f, 1.0279678321f, 1.0328759990f, + 1.0365142018f, 1.0389749476f, 1.0403626832f, 1.0407638661f, 1.0402158247f, 1.0386859218f, + 1.0360693875f, 1.0322135556f, 1.0269616972f, 1.0202228069f, 1.0121135675f, 1.0035354422f, + 0.9897053659f, 0.9706651118f, 0.9512828704f, 0.9307719520f, 0.9091186544f, 0.8864979484f, + 0.8631436896f, 0.8392834698f, 0.8150938957f, 0.7906763160f, 0.7660562253f, 0.7412033356f, + 0.7160643565f, 0.6905965223f, 0.6647900873f, 0.6386753533f, 0.6123109042f, 0.5857635917f, + 0.5590863635f, 0.5323035448f, 0.5054159767f, 0.4784116395f, 0.4512831657f, 0.4240582163f, + 0.3967995814f, 0.3695924504f, 0.3425141525f, 0.3155972383f, 0.2888001961f, 0.2620044852f, + 0.2350467488f, 0.2077866806f, 0.1801971236f, 0.1524510915f, 0.1249766396f, 0.0984509433f, + 0.0737154373f, 0.0515800648f, 0.0323408448f, 0.0138765961f, +}; + + +/* SNR: 85.15, PHASE: 0.166666666666667 */ +const float CLDFB80_60[600] = +{ + -0.0000108386f, 0.0000016461f, -0.0000001140f, 0.0000015161f, -0.0000046862f, -0.0000001825f, + 0.0000001498f, -0.0000000815f, -0.0000033014f, 0.0000001274f, -0.0000001822f, 0.0000000191f, + 0.0000000335f, 0.0000000240f, 0.0000001226f, -0.0000010507f, 0.0000001892f, 0.0000000108f, + -0.0000000274f, -0.0000002365f, -0.0000000901f, -0.0000002666f, -0.0000007031f, 0.0000006413f, + -0.0000000514f, -0.0000000079f, 0.0000002000f, -0.0000014744f, 0.0000048656f, -0.0000001578f, + -0.0000005544f, 0.0000070490f, -0.0000012678f, 0.0000001774f, 0.0000000032f, -0.0000000624f, + 0.0000007343f, 0.0000001499f, -0.0000000401f, -0.0000000182f, -0.0000000944f, -0.0000000302f, + -0.0000000091f, 0.0000004307f, -0.0000028538f, 0.0000002990f, -0.0000000787f, 0.0000000221f, + 0.0000000116f, -0.0000001070f, 0.0000001406f, -0.0000009019f, 0.0000015376f, -0.0000000209f, + -0.0000002404f, -0.0000025088f, -0.0000000262f, 0.0000000630f, 0.0000044280f, -0.0000305498f, + -0.0000482857f, 0.0000046060f, -0.0000005548f, 0.0000056679f, -0.0000207092f, -0.0000003611f, + 0.0000005381f, -0.0000004877f, -0.0000120827f, 0.0000006267f, -0.0000006126f, 0.0000000608f, + 0.0000000850f, 0.0000000605f, 0.0000002921f, -0.0000025140f, 0.0000004365f, 0.0000000116f, + -0.0000000639f, -0.0000003741f, -0.0000004826f, -0.0000006420f, -0.0000009508f, 0.0000015544f, + -0.0000000218f, 0.0000006700f, 0.0000004181f, -0.0000021629f, -0.0000087189f, 0.0000088821f, + -0.0000126345f, 0.0000114297f, 0.0000034734f, -0.0000001464f, -0.0000007710f, 0.0000000568f, + -0.0000018420f, -0.0000002908f, 0.0000001921f, 0.0000004300f, 0.0000001583f, 0.0000000782f, + 0.0000000378f, -0.0000010138f, 0.0000068268f, -0.0000007152f, 0.0000001875f, -0.0000000557f, + -0.0000000384f, 0.0000003789f, -0.0000006147f, 0.0000030092f, -0.0000065731f, 0.0000001500f, + 0.0000007177f, 0.0000112115f, 0.0000001848f, -0.0000012026f, -0.0000036253f, 0.0000992289f, + -0.0003607599f, -0.0003045828f, -0.0002977550f, -0.0001992588f, -0.0002068946f, -0.0001476180f, + -0.0000980857f, -0.0000330428f, -0.0000555832f, -0.0000621497f, -0.0000658559f, -0.0000573785f, + -0.0000513819f, -0.0000416668f, -0.0000295334f, -0.0000092197f, -0.0000207558f, -0.0000179295f, + -0.0000092361f, -0.0000046097f, 0.0000131986f, 0.0000028970f, 0.0000096778f, 0.0000247417f, + 0.0000038052f, -0.0000064960f, -0.0000124163f, -0.0000092122f, 0.0000515938f, -0.0000831154f, + -0.0001125238f, 0.0000257367f, -0.0000286390f, -0.0000087198f, -0.0000068671f, 0.0000026174f, + 0.0000461536f, 0.0000029284f, -0.0000148640f, 0.0000099199f, -0.0000209369f, -0.0000366334f, + -0.0000401223f, -0.0000191720f, -0.0000276997f, -0.0000075415f, -0.0000235869f, -0.0000261427f, + -0.0000261960f, -0.0000286778f, -0.0000147880f, 0.0000339128f, 0.0000594843f, -0.0000475296f, + -0.0000916631f, -0.0001104448f, -0.0001832659f, -0.0003546036f, -0.0004947290f, -0.0008075304f, + -0.0008607843f, -0.0011759540f, -0.0011280060f, -0.0008472242f, -0.0006581582f, -0.0005496107f, + -0.0003610854f, -0.0001310136f, -0.0000843705f, -0.0001929211f, -0.0001782524f, -0.0001519136f, + -0.0001298443f, -0.0001002354f, -0.0000721302f, 0.0000080280f, -0.0000465158f, -0.0000338343f, + -0.0000199728f, -0.0000188237f, 0.0000123819f, -0.0000217824f, 0.0000285072f, 0.0000230642f, + -0.0000681343f, -0.0001359344f, -0.0002126650f, -0.0001268185f, 0.0002814194f, 0.0005796200f, + -0.0006917457f, -0.0004814411f, 0.0000740708f, 0.0001943933f, 0.0001302339f, 0.0000640566f, + -0.0000644259f, -0.0000257394f, 0.0000673956f, 0.0000057778f, 0.0000578339f, 0.0000733133f, + 0.0000756517f, 0.0000485628f, -0.0000143756f, 0.0000258732f, 0.0000543116f, 0.0000662824f, + 0.0000694890f, 0.0000763443f, 0.0000515654f, -0.0001531987f, -0.0001495108f, 0.0001684928f, + 0.0003371435f, 0.0003492618f, 0.0007408282f, 0.0013614773f, 0.0018283780f, 0.0019512654f, + -0.0018468584f, -0.0019931487f, -0.0021435886f, -0.0019354719f, -0.0018716309f, -0.0015855347f, + -0.0012449413f, -0.0008617653f, -0.0007595430f, -0.0007484226f, -0.0006080124f, -0.0004298524f, + -0.0002469285f, -0.0000337803f, 0.0001833366f, 0.0004827171f, 0.0006187704f, 0.0008525160f, + 0.0010861242f, 0.0012478726f, 0.0014766763f, 0.0016195479f, 0.0016757046f, 0.0017606977f, + 0.0018011194f, 0.0018115391f, 0.0017918594f, 0.0015514538f, 0.0007745483f, 0.0000722375f, + 0.0013858425f, 0.0016550121f, 0.0015724609f, 0.0016037139f, 0.0017032298f, 0.0018041572f, + 0.0018793499f, 0.0019356593f, 0.0020977586f, 0.0022698159f, 0.0024080283f, 0.0025652021f, + 0.0027100014f, 0.0027878510f, 0.0028094267f, 0.0028631331f, 0.0029379588f, 0.0029982766f, + 0.0030408094f, 0.0030637651f, 0.0030520617f, 0.0029707674f, 0.0028257202f, 0.0027032586f, + 0.0025230449f, 0.0021943273f, 0.0018058213f, 0.0015201289f, 0.0010679683f, 0.0003894925f, + -0.0002840705f, -0.0009250455f, -0.0013074121f, -0.0015395618f, -0.0017798333f, -0.0019401547f, + -0.0019524700f, -0.0018826540f, -0.0017220928f, -0.0014455464f, -0.0011010583f, -0.0007116751f, + -0.0002892919f, 0.0001463485f, 0.0005842019f, 0.0009616845f, 0.0013293069f, 0.0016655901f, + 0.0019957600f, 0.0022974838f, 0.0024834913f, 0.0026599403f, 0.0027746423f, 0.0027031419f, + 0.0026172855f, 0.0025078917f, 0.0023497345f, 0.0021702568f, 0.0020425098f, 0.0019860915f, + 0.0018636567f, 0.0011954954f, 0.0005514571f, -0.0000141897f, -0.0005741594f, -0.0011558780f, + -0.0017668142f, -0.0024120809f, -0.0030128714f, -0.0035882532f, -0.0041653667f, -0.0047110318f, + -0.0052436287f, -0.0057623702f, -0.0062633358f, -0.0067586961f, -0.0072425386f, -0.0077278117f, + -0.0082234072f, -0.0087363677f, -0.0092686369f, -0.0098240661f, -0.0104237699f, -0.0111004947f, + -0.0118009488f, -0.0125156239f, -0.0132546394f, -0.0140277665f, -0.0148077168f, -0.0156486149f, + 0.0165211147f, 0.0174398402f, 0.0182775949f, 0.0190534138f, 0.0199230411f, 0.0208118290f, + 0.0217092634f, 0.0226649147f, 0.0237088141f, 0.0248100351f, 0.0259599813f, 0.0271764016f, + 0.0284714021f, 0.0298434758f, 0.0312965027f, 0.0328356927f, 0.0344649815f, 0.0361664394f, + 0.0379470806f, 0.0398139569f, 0.0417666458f, 0.0438027210f, 0.0459314689f, 0.0481532079f, + 0.0504618496f, 0.0528498740f, 0.0553180491f, 0.0578703090f, 0.0604788669f, 0.0631374695f, + 0.0659669298f, 0.0688814001f, 0.0718159332f, 0.0747835495f, 0.0777923399f, 0.0808186627f, + 0.0838554308f, 0.0868947517f, 0.0899116089f, 0.0929041126f, 0.0958553537f, 0.0987459119f, + 0.1015756668f, 0.1043243835f, 0.1069774737f, 0.1095164928f, 0.1119302041f, 0.1142027056f, + 0.1163273532f, 0.1182880738f, 0.1200768686f, 0.1216925159f, 0.1231125873f, 0.1243362384f, + 0.1253610086f, 0.1261745561f, 0.1267721689f, 0.1271241769f, 0.1272284850f, 0.1270239254f, + 0.1267589302f, 0.1264656300f, 0.1258046109f, 0.1248336057f, 0.1235525506f, 0.1219504858f, + 0.1200252469f, 0.1177556666f, 0.1151258716f, 0.1121348547f, 0.1087635447f, 0.1050067776f, + 0.1008590143f, 0.0963144136f, 0.0913759079f, 0.0860427416f, 0.0803171444f, 0.0742040884f, + 0.0677045255f, 0.0608146076f, 0.0535432746f, 0.0458874964f, 0.0378425383f, 0.0294132744f, + 0.0205946670f, 0.0113896330f, 0.0018004463f, -0.0081766098f, -0.0185270856f, -0.0292402963f, + -0.0403618604f, -0.0518892622f, -0.0637672152f, -0.0759976007f, -0.0885871716f, -0.1015258403f, + -0.1148084399f, -0.1284318249f, -0.1423873123f, -0.1566679827f, -0.1712634880f, -0.1861645588f, + -0.2013636452f, -0.2168508609f, -0.2326166940f, -0.2486510515f, -0.2649463144f, -0.2814911369f, + -0.2982752192f, -0.3152867427f, -0.3325116487f, -0.3499355632f, -0.3675395959f, -0.3853024154f, + -0.4032065616f, -0.4212350657f, -0.4393672268f, -0.4575772736f, -0.4758650706f, -0.4942431738f, + 0.5125205124f, 0.5306725282f, 0.5488577283f, 0.5670276108f, 0.5851445237f, 0.6031984616f, + 0.6211684103f, 0.6390281696f, 0.6567504157f, 0.6743123793f, 0.6916889535f, 0.7088542063f, + 0.7257845309f, 0.7424591009f, 0.7588584440f, 0.7749648928f, 0.7907617163f, 0.8062324551f, + 0.8213587554f, 0.8361206884f, 0.8504967301f, 0.8644639148f, 0.8779983070f, 0.8910752510f, + 0.9036722755f, 0.9157691951f, 0.9273480313f, 0.9383949141f, 0.9489012228f, 0.9588586337f, + 0.9682545154f, 0.9770929872f, 0.9853708240f, 0.9930809758f, 1.0002174168f, 1.0067717565f, + 1.0127347711f, 1.0180999340f, 1.0228621525f, 1.0270212624f, 1.0305853696f, 1.0335685634f, + 1.0359921286f, 1.0378851378f, 1.0392782898f, 1.0402014380f, 1.0406826783f, 1.0407387739f, + 1.0403729933f, 1.0395784114f, 1.0383296408f, 1.0365863031f, 1.0343061945f, 1.0314399587f, + 1.0279374991f, 1.0237762412f, 1.0189593836f, 1.0135316260f, 1.0076524569f, 1.0021150619f, + 0.9928949328f, 0.9800034826f, 0.9674886109f, 0.9545877700f, 0.9411740407f, 0.9272370892f, + 0.9128016387f, 0.8979145998f, 0.8826491402f, 0.8670774704f, 0.8512639848f, 0.8352705212f, + 0.8191434022f, 0.8029102780f, 0.7865870046f, 0.7701746598f, 0.7536620391f, 0.7370346195f, + 0.7202763550f, 0.7033730373f, 0.6863185156f, 0.6691140098f, 0.6517679660f, 0.6342966925f, + 0.6167195326f, 0.5990562278f, 0.5813252524f, 0.5635402746f, 0.5457078369f, 0.5278295335f, + 0.5099048467f, 0.4919297136f, 0.4738984035f, 0.4558126317f, 0.4376796414f, 0.4195151253f, + 0.4013417258f, 0.3831842053f, 0.3650685616f, 0.3470163688f, 0.3290362900f, 0.3111247009f, + 0.2932627295f, 0.2754121565f, 0.2575267491f, 0.2395585877f, 0.2214602867f, 0.2032086383f, + 0.1848152793f, 0.1663238479f, 0.1478361334f, 0.1295133662f, 0.1115465981f, 0.0941771468f, + 0.0776828916f, 0.0622889538f, 0.0481725935f, 0.0353986404f, 0.0233593568f, 0.0103354077f, +}; + +/* 5ms delay prototype */ +const float LDQMF_10[] = { + 0.0001273845f, 0.0000635118f, -0.0000660217f, -0.0002113081f, -0.0003281537f, + -0.0003912222f, -0.0004068033f, -0.0004140125f, -0.0004718648f, -0.0006266075f, + -0.0009127590f, -0.0012739376f, -0.0016274325f, -0.0019008842f, -0.0020226149f, + -0.0019408775f, -0.0016361899f, -0.0011222441f, -0.0004377523f, 0.0003647603f, + -0.0012594409f, -0.0021522972f, -0.0030035379f, -0.0037893278f, -0.0044942242f, + -0.0051073083f, -0.0056195767f, -0.0060277097f, -0.0063409884f, -0.0065891631f, + -0.0068226936f, -0.0071118907f, -0.0075195418f, -0.0080805793f, -0.0087772291f, + -0.0095174490f, -0.0101190321f, -0.0103132902f, -0.0097556449f, -0.0080578737f, + 0.0048244377f, -0.0003165600f, -0.0076599251f, -0.0173909795f, -0.0295472052f, + -0.0439858213f, -0.0603589974f, -0.0780881494f, -0.0963465944f, -0.1140660420f, + -0.1299571097f, -0.1425518692f, -0.1502614617f, -0.1514699608f, -0.1446436346f, + -0.1284375042f, -0.1017979383f, -0.0640543476f, -0.0149940467f, 0.0450862162f, + -0.1153608263f, -0.1944719404f, -0.2805878818f, -0.3714071214f, -0.4642693698f, + -0.5562577248f, -0.6443206668f, -0.7254143953f, -0.7966600657f, -0.8555190563f, + -0.8997997642f, -0.9279605746f, -0.9392472506f, -0.9334323406f, -0.9110113978f, + -0.8731529117f, -0.8216037750f, -0.7585863471f, -0.6866725683f, -0.6086452603f, + 0.5273383856f, 0.4454931915f, 0.3659263849f, 0.2909410596f, 0.2225102335f, + 0.1621384323f, 0.1107588187f, 0.0686842650f, 0.0356131159f, 0.0106525151f, + -0.0063419202f, -0.0162735451f, -0.0215873942f, -0.0231836922f, -0.0218834467f, + -0.0185378529f, -0.0140356207f, -0.0092558619f, -0.0049960618f, -0.0018630750f +}; + +const float LDQMF_16[] = { + 0.0001265111f, 0.0001109249f, 0.0000568343f, -0.0000216999f, -0.0001121275f, + -0.0002026297f, -0.0002828319f, -0.0003443913f, -0.0003836917f, -0.0004022507f, + -0.0004069506f, -0.0004091908f, -0.0004238644f, -0.0004657293f, -0.0005455829f, + -0.0006671423f, -0.0008481053f, -0.0010676773f, -0.0012969378f, -0.0015220091f, + -0.0017250745f, -0.0018875538f, -0.0019920163f, -0.0020238718f, -0.0019730844f, + -0.0018349015f, -0.0016098975f, -0.0013033486f, -0.0009243955f, -0.0004846041f, + 0.0000030436f, 0.0005237655f, -0.0010895540f, -0.0016529929f, -0.0022070303f, + -0.0027436065f, -0.0032569722f, -0.0037424688f, -0.0041965689f, -0.0046164915f, + -0.0049998290f, -0.0053441799f, -0.0056481226f, -0.0059111635f, -0.0061348351f, + -0.0063237241f, -0.0064858343f, -0.0066322954f, -0.0067769806f, -0.0069382410f, + -0.0071333470f, -0.0073765265f, -0.0076779663f, -0.0080410065f, -0.0084597301f, + -0.0089169554f, -0.0093825553f, -0.0098114274f, -0.0101463618f, -0.0103159947f, + -0.0102374777f, -0.0098197237f, -0.0089666471f, -0.0075801839f, 0.0055659222f, + 0.0028292525f, -0.0007084093f, -0.0051146746f, -0.0104394183f, -0.0167112947f, + -0.0239351243f, -0.0320881605f, -0.0411179215f, -0.0509394705f, -0.0614346750f, + -0.0724472553f, -0.0837826133f, -0.0952089876f, -0.1064579859f, -0.1172273904f, + -0.1271827519f, -0.1359646022f, -0.1431937218f, -0.1484752893f, -0.1514120996f, + -0.1516146213f, -0.1487106383f, -0.1423557848f, -0.1322438419f, -0.1181157678f, + -0.0997688919f, -0.0770645440f, -0.0499351621f, -0.0183888972f, 0.0174860694f, + 0.0575199649f, -0.1014656499f, -0.1489799321f, -0.1996707469f, -0.2530553043f, + -0.3085824847f, -0.3656420112f, -0.4235731661f, -0.4816747010f, -0.5392161012f, + -0.5954495668f, -0.6496242881f, -0.7010003328f, -0.7488642931f, -0.7925460339f, + -0.8314355612f, -0.8650042415f, -0.8927068710f, -0.9141520858f, -0.9291663766f, + -0.9375609756f, -0.9392580390f, -0.9342910051f, -0.9228035808f, -0.9050434232f, + -0.8813542128f, -0.8521632552f, -0.8179759979f, -0.7793614268f, -0.7369411588f, + -0.6913757920f, -0.6433517337f, -0.5935677886f, 0.5427325368f, 0.4914081097f, + 0.4404284060f, 0.3904018402f, 0.3419007659f, 0.2954539955f, 0.2515334785f, + 0.2105401903f, 0.1727928966f, 0.1385205537f, 0.1078566760f, 0.0808390900f, + 0.0574123114f, 0.0374300666f, 0.0206582583f, 0.0067475829f, -0.0038830251f, + -0.0113212354f, -0.0167305935f, -0.0203650482f, -0.0224466976f, -0.0231772382f, + -0.0227553174f, -0.0213854741f, -0.0192801002f, -0.0166575927f, -0.0137361875f, + -0.0107288063f, -0.0078344941f, -0.0052339621f, -0.0030720702f, -0.0014194851f +}; + +const float LDQMF_20[] = { + 0.0001230230f, 0.0001211219f, 0.0000876540f, 0.0000352143f, -0.0000303788f, + -0.0001028838f, -0.0001760167f, -0.0002446725f, -0.0003034996f, -0.0003493345f, + -0.0003807641f, -0.0003985357f, -0.0004056677f, -0.0004072535f, -0.0004098394f, + -0.0004214063f, -0.0004495422f, -0.0005003878f, -0.0005777747f, -0.0006813223f, + -0.0008268412f, -0.0010004630f, -0.0011817788f, -0.0013656860f, -0.0015435946f, + -0.0017062968f, -0.0018441341f, -0.0019480695f, -0.0020097434f, -0.0020226294f, + -0.0019820682f, -0.0018855907f, -0.0017330211f, -0.0015261442f, -0.0012685407f, + -0.0009652392f, -0.0006221444f, -0.0002458634f, 0.0001564174f, 0.0005769439f, + -0.0010328424f, -0.0014848098f, -0.0019316213f, -0.0023701149f, -0.0027960713f, + -0.0032068293f, -0.0035999804f, -0.0039736414f, -0.0043262239f, -0.0046565188f, + -0.0049632201f, -0.0052450863f, -0.0055012843f, -0.0057313135f, -0.0059352517f, + -0.0061141332f, -0.0062703062f, -0.0064075105f, -0.0065308069f, -0.0066466411f, + -0.0067621553f, -0.0068870094f, -0.0070305937f, -0.0072006541f, -0.0074039386f, + -0.0076450342f, -0.0079257628f, -0.0082442267f, -0.0085938899f, -0.0089637861f, + -0.0093367994f, -0.0096898535f, -0.0099947909f, -0.0102182031f, -0.0103207529f, + -0.0102590285f, -0.0099863587f, -0.0094537362f, -0.0086111929f, -0.0074084769f, + 0.0057985946f, 0.0037309236f, 0.0011651339f, -0.0019364181f, -0.0056051607f, + -0.0098646237f, -0.0147295250f, -0.0202049762f, -0.0262852497f, -0.0329528190f, + -0.0401776619f, -0.0479161367f, -0.0561118126f, -0.0646922663f, -0.0735698044f, + -0.0826408863f, -0.0917868018f, -0.1008738130f, -0.1097536832f, -0.1182654947f, + -0.1262341589f, -0.1334753036f, -0.1397978216f, -0.1450008005f, -0.1488809884f, + -0.1512351334f, -0.1518635303f, -0.1505732536f, -0.1471813470f, -0.1415183097f, + -0.1334318966f, -0.1227891371f, -0.1094799563f, -0.0934195668f, -0.0745511875f, + -0.0528475679f, -0.0283128861f, -0.0009837818f, 0.0290693250f, 0.0617432520f, + -0.0969054326f, -0.1343720406f, -0.1739567965f, -0.2154271752f, -0.2585212290f, + -0.3029502928f, -0.3484017253f, -0.3945416212f, -0.4410185516f, -0.4874662757f, + -0.5335084200f, -0.5787616372f, -0.6228409410f, -0.6653640866f, -0.7059561610f, + -0.7442554235f, -0.7799182534f, -0.8126249313f, -0.8420860767f, -0.8680517077f, + -0.8902196884f, -0.9083824754f, -0.9224776030f, -0.9323854446f, -0.9380323887f, + -0.9393896461f, -0.9364743829f, -0.9293491840f, -0.9181203246f, -0.9029349089f, + -0.8839784265f, -0.8614694476f, -0.8356599212f, -0.8068289757f, -0.7752800584f, + -0.7413358092f, -0.7053351402f, -0.6676273942f, -0.6285686493f, -0.5885198116f, + 0.5478612781f, 0.5067980289f, 0.4658361673f, 0.4252935350f, 0.3854739666f, + 0.3466667533f, 0.3091430366f, 0.2731511295f, 0.2389119864f, 0.2066148520f, + 0.1764142811f, 0.1484276950f, 0.1227331311f, 0.0993694067f, 0.0783365741f, + 0.0595967993f, 0.0430756323f, 0.0286619961f, 0.0162059069f, 0.0054926532f, + -0.0030201224f, -0.0093160523f, -0.0142635731f, -0.0179969221f, -0.0206398536f, + -0.0223025978f, -0.0230882075f, -0.0230979007f, -0.0224345829f, -0.0212045144f, + -0.0195175279f, -0.0174855441f, -0.0152208358f, -0.0128338682f, -0.0104311826f, + -0.0081134979f, -0.0059733889f, -0.0040914025f, -0.0025271603f, -0.0012705614f +}; + +const float LDQMF_30[] = { + 0.0001132221f, 0.0001273845f, 0.0001170250f, 0.0000947188f, 0.0000635118f, + 0.0000250289f, -0.0000188243f, -0.0000660217f, -0.0001152096f, -0.0001640412f, + -0.0002113081f, -0.0002552809f, -0.0002945333f, -0.0003281537f, -0.0003555670f, + -0.0003765307f, -0.0003912222f, -0.0004003684f, -0.0004050101f, -0.0004068033f, + -0.0004073895f, -0.0004090022f, -0.0004140125f, -0.0004247443f, -0.0004433907f, + -0.0004718648f, -0.0005113805f, -0.0005630197f, -0.0006266075f, -0.0007011125f, + -0.0007991094f, -0.0009127590f, -0.0010302142f, -0.0011511127f, -0.0012739376f, + -0.0013960009f, -0.0015147630f, -0.0016274325f, -0.0017312448f, -0.0018232886f, + -0.0019008842f, -0.0019614976f, -0.0020026900f, -0.0020226149f, -0.0020196829f, + -0.0019926974f, -0.0019408775f, -0.0018640372f, -0.0017622994f, -0.0016361899f, + -0.0014866102f, -0.0013147899f, -0.0011222441f, -0.0009106447f, -0.0006817955f, + -0.0004377523f, -0.0001804045f, 0.0000879158f, 0.0003647603f, 0.0006472586f, + -0.0009574946f, -0.0012594409f, -0.0015596492f, -0.0018575254f, -0.0021522972f, + -0.0024420463f, -0.0027260673f, -0.0030035379f, -0.0032736242f, -0.0035357473f, + -0.0037893278f, -0.0040339152f, -0.0042689815f, -0.0044942242f, -0.0047093285f, + -0.0049138218f, -0.0051073083f, -0.0052895811f, -0.0054603852f, -0.0056195767f, + -0.0057671070f, -0.0059030461f, -0.0060277097f, -0.0061416570f, -0.0062457137f, + -0.0063409884f, -0.0064288811f, -0.0065109758f, -0.0065891631f, -0.0066657839f, + -0.0067426423f, -0.0068226936f, -0.0069094361f, -0.0070050140f, -0.0071118907f, + -0.0072320686f, -0.0073675187f, -0.0075195418f, -0.0076890816f, -0.0078762611f, + -0.0080805793f, -0.0083005941f, -0.0085338661f, -0.0087772291f, -0.0090263058f, + -0.0092753358f, -0.0095174490f, -0.0097448118f, -0.0099486159f, -0.0101190321f, + -0.0102448259f, -0.0103138546f, -0.0103132902f, -0.0102295466f, -0.0100485412f, + -0.0097556449f, -0.0093362173f, -0.0087752696f, -0.0080578737f, -0.0071694241f, + 0.0060977875f, 0.0048244377f, 0.0033389633f, 0.0016289989f, -0.0003165600f, + -0.0025077621f, -0.0049532265f, -0.0076599251f, -0.0106331240f, -0.0138763143f, + -0.0173909795f, -0.0211766809f, -0.0252304692f, -0.0295472052f, -0.0341192745f, + -0.0389365107f, -0.0439858213f, -0.0492520891f, -0.0547169745f, -0.0603589974f, + -0.0661538467f, -0.0720737800f, -0.0780881494f, -0.0841634125f, -0.0902627930f, + -0.0963465944f, -0.1023724005f, -0.1082947850f, -0.1140660420f, -0.1196364164f, + -0.1249518171f, -0.1299571097f, -0.1345982403f, -0.1388163716f, -0.1425518692f, + -0.1457448602f, -0.1483348161f, -0.1502614617f, -0.1514650136f, -0.1518869400f, + -0.1514699608f, -0.1501586437f, -0.1478999555f, -0.1446436346f, -0.1403426975f, + -0.1349538267f, -0.1284375042f, -0.1207587793f, -0.1118873134f, -0.1017979383f, + -0.0904709548f, -0.0778924823f, -0.0640543476f, -0.0489545316f, -0.0325974710f, + -0.0149940467f, 0.0038382637f, 0.0238753036f, 0.0450862162f, 0.0674346089f, + -0.0908823684f, -0.1153608263f, -0.1408283263f, -0.1672216803f, -0.1944719404f, + -0.2225042433f, -0.2512380779f, -0.2805878818f, -0.3104633093f, -0.3407693803f, + -0.3714071214f, -0.4022741020f, -0.4332643747f, -0.4642693698f, -0.4951784015f, + -0.5258791447f, -0.5562577248f, -0.5862001181f, -0.6155921817f, -0.6443206668f, + -0.6722734571f, -0.6993405223f, -0.7254143953f, -0.7503913045f, -0.7741714120f, + -0.7966600657f, -0.8177679181f, -0.8374124765f, -0.8555190563f, -0.8720235229f, + -0.8868073225f, -0.8997997642f, -0.9110177755f, -0.9204165936f, -0.9279605746f, + -0.9336239100f, -0.9373888969f, -0.9392472506f, -0.9391993284f, -0.9372548461f, + -0.9334323406f, -0.9277592301f, -0.9202710390f, -0.9110113978f, -0.9000319242f, + -0.8873908520f, -0.8731529117f, -0.8573898673f, -0.8401791453f, -0.8216037750f, + -0.8017510772f, -0.7807134390f, -0.7585863471f, -0.7354692221f, -0.7114632726f, + -0.6866725683f, -0.6612017751f, -0.6351572275f, -0.6086452603f, -0.5817720890f, + 0.5547027588f, 0.5273383856f, 0.4999553561f, 0.4726423621f, 0.4454931915f, + 0.4185986817f, 0.3920478821f, 0.3659263849f, 0.3403166533f, 0.3152970076f, + 0.2909410596f, 0.2673173845f, 0.2444883287f, 0.2225102335f, 0.2014321834f, + 0.1812966615f, 0.1621384323f, 0.1439844817f, 0.1268542111f, 0.1107588187f, + 0.0957026929f, 0.0816812664f, 0.0686842650f, 0.0566918403f, 0.0456795096f, + 0.0356131159f, 0.0264542010f, 0.0181538444f, 0.0106525151f, 0.0038657826f, + -0.0018247393f, -0.0063419202f, -0.0102294916f, -0.0135271698f, -0.0162735451f, + -0.0185101982f, -0.0202700198f, -0.0215873942f, -0.0224917270f, -0.0230140593f, + -0.0231836922f, -0.0230311844f, -0.0225872938f, -0.0218834467f, -0.0209521335f, + -0.0198257342f, -0.0185378529f, -0.0171212200f, -0.0156097068f, -0.0140356207f, + -0.0124316914f, -0.0108282696f, -0.0092558619f, -0.0077421702f, -0.0063143214f, + -0.0049960618f, -0.0038076851f, -0.0027630797f, -0.0018630750f, -0.0010562690f +}; + +const float LDQMF_32[] = { + 0.0001114764f, 0.0001277322f, 0.0001196933f, 0.0001003250f, 0.0000730156f, + 0.0000389626f, -0.0000004113f, -0.0000435304f, -0.0000890315f, -0.0001352291f, + -0.0001804941f, -0.0002240739f, -0.0002643097f, -0.0003001800f, -0.0003310027f, + -0.0003563178f, -0.0003759742f, -0.0003900956f, -0.0003992571f, -0.0004043059f, + -0.0004065038f, -0.0004072087f, -0.0004080582f, -0.0004110776f, -0.0004182056f, + -0.0004312390f, -0.0004520137f, -0.0004817972f, -0.0005216259f, -0.0005721557f, + -0.0006331798f, -0.0007036886f, -0.0007957022f, -0.0009019459f, -0.0010115934f, + -0.0011244126f, -0.0012394030f, -0.0013542691f, -0.0014670856f, -0.0015755219f, + -0.0016774036f, -0.0017702234f, -0.0018517138f, -0.0019197501f, -0.0019722404f, + -0.0020072563f, -0.0020233381f, -0.0020192105f, -0.0019939172f, -0.0019467958f, + -0.0018776910f, -0.0017866619f, -0.0016740696f, -0.0015406047f, -0.0013871717f, + -0.0012149811f, -0.0010253293f, -0.0008196524f, -0.0005995433f, -0.0003666130f, + -0.0001225593f, 0.0001306669f, 0.0003910401f, 0.0006561352f, -0.0009480129f, + -0.0012312274f, -0.0015128938f, -0.0017925701f, -0.0020698721f, -0.0023430535f, + -0.0026114415f, -0.0028743364f, -0.0031310993f, -0.0033810970f, -0.0036239279f, + -0.0038590427f, -0.0040861652f, -0.0043048300f, -0.0045148288f, -0.0047158841f, + -0.0049075997f, -0.0050896429f, -0.0052618566f, -0.0054239952f, -0.0055759880f, + -0.0057177031f, -0.0058492054f, -0.0059706448f, -0.0060824142f, -0.0061850520f, + -0.0062793852f, -0.0063663856f, -0.0064472742f, -0.0065233973f, -0.0065963734f, + -0.0066681784f, -0.0067402194f, -0.0068149343f, -0.0068953573f, -0.0069832220f, + -0.0070805764f, -0.0071891183f, -0.0073105576f, -0.0074461517f, -0.0075968099f, + -0.0077630100f, -0.0079445979f, -0.0081409542f, -0.0083505949f, -0.0085713090f, + -0.0088004116f, -0.0090341223f, -0.0092676217f, -0.0094952518f, -0.0097106276f, + -0.0099064959f, -0.0100751268f, -0.0102073448f, -0.0102934698f, -0.0103230691f, + -0.0102852238f, -0.0101685468f, -0.0099611804f, -0.0096511031f, -0.0092261136f, + -0.0086738830f, -0.0079820622f, -0.0071387375f, 0.0061342926f, 0.0049526179f, + 0.0035855719f, 0.0020228061f, 0.0002550660f, -0.0017262386f, -0.0039286232f, + -0.0063582431f, -0.0090201823f, -0.0119179590f, -0.0150538534f, -0.0184284002f, + -0.0220406763f, -0.0258877873f, -0.0299651287f, -0.0342661664f, -0.0387823842f, + -0.0435030013f, -0.0484156460f, -0.0535055920f, -0.0587556586f, -0.0641462877f, + -0.0696556121f, -0.0752592385f, -0.0809305608f, -0.0866405517f, -0.0923579335f, + -0.0980491117f, -0.1036783829f, -0.1092077494f, -0.1145975813f, -0.1198066771f, + -0.1247901469f, -0.1295024157f, -0.1338994503f, -0.1379327923f, -0.1415534765f, + -0.1447122544f, -0.1473592520f, -0.1494447440f, -0.1509192586f, -0.1517339647f, + -0.1518410593f, -0.1511938870f, -0.1497472823f, -0.1474581808f, -0.1442855000f, + -0.1401909739f, -0.1351390928f, -0.1290972829f, -0.1220364720f, -0.1139311492f, + -0.1047598422f, -0.0945051536f, -0.0831540972f, -0.0706980526f, -0.0571332164f, + -0.0424606539f, -0.0266861133f, -0.0098207183f, 0.0081194015f, 0.0271129999f, + 0.0471336693f, 0.0681508929f, -0.0901340321f, -0.1130230203f, -0.1367862970f, + -0.1613724083f, -0.1867254972f, -0.2127848268f, -0.2394856811f, -0.2667590678f, + -0.2945322692f, -0.3227286935f, -0.3512688875f, -0.3800697625f, -0.4090464115f, + -0.4381107390f, -0.4671728909f, -0.4961415529f, -0.5249239802f, -0.5534265041f, + -0.5815549493f, -0.6092154384f, -0.6363143325f, -0.6627591252f, -0.6884583235f, + -0.7133225799f, -0.7372650504f, -0.7602017522f, -0.7820522189f, -0.8027398586f, + -0.8221930265f, -0.8403448462f, -0.8571352363f, -0.8725125194f, -0.8863729239f, + -0.8986561894f, -0.9093839526f, -0.9185180068f, -0.9260279536f, -0.9318904877f, + -0.9360890388f, -0.9386137724f, -0.9394617677f, -0.9386372566f, -0.9361515045f, + -0.9320224524f, -0.9262748957f, -0.9189397693f, -0.9100542665f, -0.8996617198f, + -0.8878104091f, -0.8745536804f, -0.8599503040f, -0.8440635800f, -0.8269610405f, + -0.8087138534f, -0.7893968821f, -0.7690878510f, -0.7478674054f, -0.7258179784f, + -0.7030247450f, -0.6795731187f, -0.6555500627f, -0.6310426593f, -0.6061393619f, + -0.5809279680f, 0.5555571318f, 0.5299059153f, 0.5042316318f, 0.4786062539f, + 0.4531070888f, 0.4278093874f, 0.4027872086f, 0.3781120181f, 0.3538532257f, + 0.3300769329f, 0.3068462014f, 0.2842200696f, 0.2622535527f, 0.2409968227f, + 0.2204952389f, 0.2007884830f, 0.1819112599f, 0.1638922095f, 0.1467540115f, + 0.1305132508f, 0.1151807010f, 0.1007611454f, 0.0872532800f, 0.0746501535f, + 0.0629388988f, 0.0521017052f, 0.0421142913f, 0.0329478458f, 0.0245663263f, + 0.0169306416f, 0.0099878404f, 0.0036667606f, -0.0016705567f, -0.0059447517f, + -0.0096629029f, -0.0128545053f, -0.0155541990f, -0.0177966245f, -0.0196102057f, + -0.0210233144f, -0.0220607370f, -0.0227484647f, -0.0231104363f, -0.0231721289f, + -0.0229578372f, -0.0224937275f, -0.0218052734f, -0.0209197178f, -0.0198635645f, + -0.0186645426f, -0.0173496436f, -0.0159468446f, -0.0144828279f, -0.0129845534f, + -0.0114774173f, -0.0099871978f, -0.0085373754f, -0.0071508014f, -0.0058474829f, + -0.0046474598f, -0.0035660865f, -0.0026146793f, -0.0017866376f, -0.0010276214f +}; + + +const float LDQMF_40[] = { + 0.0001054310f, 0.0001278277f, 0.0001251928f, 0.0001146889f, 0.0000979851f, + 0.0000760574f, 0.0000498818f, 0.0000198387f, -0.0000131029f, -0.0000479618f, + -0.0000844192f, -0.0001213740f, -0.0001580337f, -0.0001938389f, -0.0002282606f, + -0.0002604699f, -0.0002899167f, -0.0003162437f, -0.0003392129f, -0.0003585335f, + -0.0003742669f, -0.0003864095f, -0.0003952379f, -0.0004011750f, -0.0004046241f, + -0.0004063755f, -0.0004070677f, -0.0004074774f, -0.0004086622f, -0.0004115711f, + -0.0004172591f, -0.0004265972f, -0.0004405513f, -0.0004599697f, -0.0004853081f, + -0.0005171628f, -0.0005559114f, -0.0006013246f, -0.0006533514f, -0.0007115960f, + -0.0007855657f, -0.0008695939f, -0.0009563145f, -0.0010451660f, -0.0011358386f, + -0.0012278836f, -0.0013199070f, -0.0014110771f, -0.0015001969f, -0.0015860386f, + -0.0016675856f, -0.0017434494f, -0.0018125287f, -0.0018736399f, -0.0019257307f, + -0.0019677528f, -0.0019986648f, -0.0020177464f, -0.0020242827f, -0.0020176519f, + -0.0019974308f, -0.0019632282f, -0.0019149955f, -0.0018526751f, -0.0017763647f, + -0.0016862786f, -0.0015827856f, -0.0014663173f, -0.0013374290f, -0.0011967755f, + -0.0010450395f, -0.0008829425f, -0.0007112789f, -0.0005309665f, -0.0003426777f, + -0.0001474131f, 0.0000538647f, 0.0002601457f, 0.0004704242f, 0.0006831217f, + -0.0009193350f, -0.0011463511f, -0.0013722219f, -0.0015970126f, -0.0018204211f, + -0.0020423096f, -0.0022615823f, -0.0024778829f, -0.0026909125f, -0.0029003047f, + -0.0031057200f, -0.0033068350f, -0.0035034318f, -0.0036952950f, -0.0038821250f, + -0.0040638284f, -0.0042401305f, -0.0044109244f, -0.0045761010f, -0.0047354894f, + -0.0048888689f, -0.0050360523f, -0.0051769917f, -0.0053115566f, -0.0054396591f, + -0.0055612531f, -0.0056762602f, -0.0057847309f, -0.0058866790f, -0.0059822481f, + -0.0060716602f, -0.0061551840f, -0.0062332042f, -0.0063061914f, -0.0063747251f, + -0.0064394251f, -0.0065009692f, -0.0065601622f, -0.0066179447f, -0.0066753621f, + -0.0067329677f, -0.0067919991f, -0.0068543297f, -0.0069208522f, -0.0069924956f, + -0.0070703635f, -0.0071552829f, -0.0072481371f, -0.0073496993f, -0.0074605206f, + -0.0075810468f, -0.0077115200f, -0.0078519098f, -0.0080020009f, -0.0081613464f, + -0.0083290907f, -0.0085040880f, -0.0086850226f, -0.0088702254f, -0.0090575712f, + -0.0092444401f, -0.0094279535f, -0.0096049141f, -0.0097717466f, -0.0099247349f, + -0.0100597525f, -0.0101720523f, -0.0102568185f, -0.0103087639f, -0.0103225084f, + -0.0102923671f, -0.0102125369f, -0.0100769754f, -0.0098794578f, -0.0096139675f, + -0.0092741428f, -0.0088536264f, -0.0083462056f, -0.0077455463f, -0.0070456262f, + 0.0062426012f, 0.0053260727f, 0.0042929468f, 0.0031377305f, 0.0018554037f, + 0.0004413279f, -0.0011089550f, -0.0027993873f, -0.0046333913f, -0.0066139149f, + -0.0087434240f, -0.0110237021f, -0.0134560717f, -0.0160411559f, -0.0187789686f, + -0.0216688234f, -0.0247092377f, -0.0278980359f, -0.0312322956f, -0.0347082689f, + -0.0383213721f, -0.0420661084f, -0.0459361374f, -0.0499247424f, -0.0540237017f, + -0.0582240038f, -0.0625155717f, -0.0668876022f, -0.0713279545f, -0.0758237690f, + -0.0803611800f, -0.0849252865f, -0.0895003974f, -0.0940696299f, -0.0986154303f, + -0.1031193137f, -0.1075617522f, -0.1119226590f, -0.1161812171f, -0.1203159690f, + -0.1243033260f, -0.1281196773f, -0.1317433566f, -0.1351498365f, -0.1383142620f, + -0.1412113756f, -0.1438160986f, -0.1461028159f, -0.1480461359f, -0.1496205181f, + -0.1508007050f, -0.1515616924f, -0.1518789232f, -0.1517281830f, -0.1510859281f, + -0.1499291658f, -0.1482358277f, -0.1459847391f, -0.1431556493f, -0.1397294253f, + -0.1356883198f, -0.1310155839f, -0.1256958842f, -0.1197156236f, -0.1130623519f, + -0.1057254449f, -0.0976961926f, -0.0889673084f, -0.0795335919f, -0.0693915039f, + -0.0585396253f, -0.0469785258f, -0.0347105376f, -0.0217403900f, -0.0080747427f, + 0.0062775812f, 0.0213057883f, 0.0369967707f, 0.0533357821f, 0.0703063011f, + -0.0878949612f, -0.1060620621f, -0.1247984543f, -0.1440782398f, -0.1638741642f, + -0.1841574013f, -0.2048965842f, -0.2260592878f, -0.2476108670f, -0.2695151269f, + -0.2917346060f, -0.3142299950f, -0.3369609118f, -0.3598856330f, -0.3829609752f, + -0.4061433673f, -0.4293875396f, -0.4526477456f, -0.4758775234f, -0.4990297258f, + -0.5220568180f, -0.5449107289f, -0.5675433278f, -0.5899065137f, -0.6119521260f, + -0.6336323619f, -0.6548998952f, -0.6757075191f, -0.6960092783f, -0.7157597542f, + -0.7349147201f, -0.7534312606f, -0.7712675929f, -0.7883839607f, -0.8047417998f, + -0.8203051686f, -0.8350396156f, -0.8489138484f, -0.8618991971f, -0.8739694357f, + -0.8850591183f, -0.8951326609f, -0.9042174816f, -0.9122928381f, -0.9193425775f, + -0.9253507257f, -0.9303058386f, -0.9341986179f, -0.9370224476f, -0.9387740493f, + -0.9394523501f, -0.9390596747f, -0.9376010895f, -0.9350843430f, -0.9315201044f, + -0.9269216657f, -0.9213048816f, -0.9146882296f, -0.9070926309f, -0.8985413909f, + -0.8890597224f, -0.8786749244f, -0.8674164414f, -0.8553160429f, -0.8424068689f, + -0.8287240267f, -0.8143038750f, -0.7991842628f, -0.7834047079f, -0.7670054436f, + -0.7500280738f, -0.7325149179f, -0.7145089507f, -0.6960543990f, -0.6771950722f, + -0.6579754949f, -0.6384407282f, -0.6186353564f, -0.5986043811f, -0.5783956647f, + 0.5581169724f, 0.5376043320f, 0.5170669556f, 0.4965355098f, 0.4760493934f, + 0.4556491673f, 0.4353731573f, 0.4152592719f, 0.3953450024f, 0.3756662905f, + 0.3562584817f, 0.3371553421f, 0.3183895946f, 0.2999922633f, 0.2819928825f, + 0.2644190788f, 0.2472964972f, 0.2306490242f, 0.2144980878f, 0.1988629252f, + 0.1837607920f, 0.1692063361f, 0.1552118808f, 0.1417868733f, 0.1289390326f, + 0.1166729480f, 0.1049910933f, 0.0938936323f, 0.0833776593f, 0.0734392256f, + 0.0640704259f, 0.0552623831f, 0.0470035598f, 0.0392793566f, 0.0320752300f, + 0.0253704041f, 0.0191462450f, 0.0133753549f, 0.0080275321f, 0.0030762297f, + -0.0012000328f, -0.0047226716f, -0.0078742635f, -0.0106727527f, -0.0131460698f, + -0.0153053077f, -0.0171699896f, -0.0187555570f, -0.0200747978f, -0.0211435594f, + -0.0219731592f, -0.0225773286f, -0.0229687411f, -0.0231592804f, -0.0231627058f, + -0.0229909588f, -0.0226575918f, -0.0221759379f, -0.0215590782f, -0.0208213329f, + -0.0199760906f, -0.0190375410f, -0.0180198960f, -0.0169368219f, -0.0158027392f, + -0.0146312509f, -0.0134359635f, -0.0122305267f, -0.0110275447f, -0.0098399809f, + -0.0086799636f, -0.0075585782f, -0.0064875027f, -0.0054761618f, -0.0045336313f, + -0.0036688452f, -0.0028846052f, -0.0021852630f, -0.0015646699f, -0.0009385595f +}; + + +const float LDQMF_60[] = { + 0.0000953076f, 0.0001230230f, 0.0001279964f, 0.0001260533f, 0.0001211219f, + 0.0001122123f, 0.0001010860f, 0.0000876540f, 0.0000719883f, 0.0000545472f, + 0.0000352143f, 0.0000145686f, -0.0000074264f, -0.0000303788f, -0.0000539205f, + -0.0000782743f, -0.0001028838f, -0.0001275374f, -0.0001520015f, -0.0001760167f, + -0.0001997108f, -0.0002226708f, -0.0002446725f, -0.0002655797f, -0.0002852145f, + -0.0003034996f, -0.0003203036f, -0.0003356283f, -0.0003493345f, -0.0003614030f, + -0.0003719004f, -0.0003807641f, -0.0003881051f, -0.0003939842f, -0.0003985357f, + -0.0004019095f, -0.0004041938f, -0.0004056677f, -0.0004065430f, -0.0004069925f, + -0.0004072535f, -0.0004075877f, -0.0004083676f, -0.0004098394f, -0.0004122990f, + -0.0004160839f, -0.0004214063f, -0.0004285777f, -0.0004378651f, -0.0004495422f, + -0.0004637682f, -0.0004806494f, -0.0005003878f, -0.0005231378f, -0.0005489803f, + -0.0005777747f, -0.0006095612f, -0.0006443121f, -0.0006813223f, -0.0007226231f, + -0.0007722576f, -0.0008268412f, -0.0008839625f, -0.0009417336f, -0.0010004630f, + -0.0010601623f, -0.0011206097f, -0.0011817788f, -0.0012432419f, -0.0013045983f, + -0.0013656860f, -0.0014260965f, -0.0014855355f, -0.0015435946f, -0.0015999591f, + -0.0016543545f, -0.0017062968f, -0.0017554691f, -0.0018015467f, -0.0018441341f, + -0.0018829798f, -0.0019177221f, -0.0019480695f, -0.0019736972f, -0.0019943134f, + -0.0020097434f, -0.0020197174f, -0.0020240925f, -0.0020226294f, -0.0020152442f, + -0.0020017736f, -0.0019820682f, -0.0019561697f, -0.0019240153f, -0.0018855907f, + -0.0018409232f, -0.0017900462f, -0.0017330211f, -0.0016699535f, -0.0016009507f, + -0.0015261442f, -0.0014456788f, -0.0013597424f, -0.0012685407f, -0.0011722331f, + -0.0010710671f, -0.0009652392f, -0.0008549765f, -0.0007405236f, -0.0006221444f, + -0.0005001140f, -0.0003745670f, -0.0002458634f, -0.0001142541f, 0.0000199491f, + 0.0001564174f, 0.0002949402f, 0.0004350246f, 0.0005769439f, 0.0007203126f, + -0.0008803223f, -0.0010328424f, -0.0011841310f, -0.0013346316f, -0.0014848098f, + -0.0016343417f, -0.0017832819f, -0.0019316213f, -0.0020790498f, -0.0022252349f, + -0.0023701149f, -0.0025136294f, -0.0026556554f, -0.0027960713f, -0.0029348312f, + -0.0030717771f, -0.0032068293f, -0.0033399195f, -0.0034709862f, -0.0035999804f, + -0.0037267797f, -0.0038513308f, -0.0039736414f, -0.0040935921f, -0.0042111278f, + -0.0043262239f, -0.0044388464f, -0.0045489701f, -0.0046565188f, -0.0047614835f, + -0.0048637423f, -0.0049632201f, -0.0050599808f, -0.0051539382f, -0.0052450863f, + -0.0053333500f, -0.0054187514f, -0.0055012843f, -0.0055808770f, -0.0056575472f, + -0.0057313135f, -0.0058021732f, -0.0058701355f, -0.0059352517f, -0.0059975707f, + -0.0060571772f, -0.0061141332f, -0.0061685541f, -0.0062205540f, -0.0062703062f, + -0.0063179093f, -0.0063635921f, -0.0064075105f, -0.0064498796f, -0.0064908965f, + -0.0065308069f, -0.0065698619f, -0.0066083665f, -0.0066466411f, -0.0066849431f, + -0.0067233290f, -0.0067621553f, -0.0068021296f, -0.0068436749f, -0.0068870094f, + -0.0069324085f, -0.0069801519f, -0.0070305937f, -0.0070840055f, -0.0071406048f, + -0.0072006541f, -0.0072644479f, -0.0073321410f, -0.0074039386f, -0.0074799177f, + -0.0075602704f, -0.0076450342f, -0.0077342330f, -0.0078278277f, -0.0079257628f, + -0.0080279401f, -0.0081341872f, -0.0082442267f, -0.0083577875f, -0.0084744738f, + -0.0085938899f, -0.0087156557f, -0.0088391500f, -0.0089637861f, -0.0090888245f, + -0.0092134504f, -0.0093367994f, -0.0094579896f, -0.0095760096f, -0.0096898535f, + -0.0097982995f, -0.0099003557f, -0.0099947909f, -0.0100801717f, -0.0101551116f, + -0.0102182031f, -0.0102678994f, -0.0103026126f, -0.0103207529f, -0.0103206923f, + -0.0103006857f, -0.0102590285f, -0.0101939747f, -0.0101036867f, -0.0099863587f, + -0.0098401112f, -0.0096632261f, -0.0094537362f, -0.0092098210f, -0.0089295702f, + -0.0086111929f, -0.0082527259f, -0.0078523541f, -0.0074084769f, -0.0069190590f, + 0.0063841688f, 0.0057985946f, 0.0051621343f, 0.0044734711f, 0.0037309236f, + 0.0029329660f, 0.0020781513f, 0.0011651339f, 0.0001925042f, -0.0008409545f, + -0.0019364181f, -0.0030950012f, -0.0043176264f, -0.0056051607f, -0.0069584334f, + -0.0083780792f, -0.0098646237f, -0.0114185056f, -0.0130400723f, -0.0147295250f, + -0.0164868534f, -0.0183120724f, -0.0202049762f, -0.0221651513f, -0.0241921283f, + -0.0262852497f, -0.0284437388f, -0.0306666382f, -0.0329528190f, -0.0353010744f, + -0.0377098918f, -0.0401776619f, -0.0427025780f, -0.0452826768f, -0.0479161367f, + -0.0506004691f, -0.0533332452f, -0.0561118126f, -0.0589331910f, -0.0617944039f, + -0.0646922663f, -0.0676232576f, -0.0705836788f, -0.0735698044f, -0.0765774846f, + -0.0796026587f, -0.0826408863f, -0.0856874809f, -0.0887378305f, -0.0917868018f, + -0.0948293805f, -0.0978601947f, -0.1008738130f, -0.1038645208f, -0.1068264544f, + -0.1097536832f, -0.1126400903f, -0.1154794544f, -0.1182654947f, -0.1209914312f, + -0.1236500666f, -0.1262341589f, -0.1287376434f, -0.1311538219f, -0.1334753036f, + -0.1356947273f, -0.1378047168f, -0.1397978216f, -0.1416664869f, -0.1434033662f, + -0.1450008005f, -0.1464512348f, -0.1477471888f, -0.1488809884f, -0.1498452872f, + -0.1506324410f, -0.1512351334f, -0.1516460329f, -0.1518578976f, -0.1518635303f, + -0.1516559124f, -0.1512281001f, -0.1505732536f, -0.1496847868f, -0.1485562176f, + -0.1471813470f, -0.1455538720f, -0.1436681300f, -0.1415183097f, -0.1390990764f, + -0.1364052594f, -0.1334318966f, -0.1301742792f, -0.1266280264f, -0.1227891371f, + -0.1186537445f, -0.1142183766f, -0.1094799563f, -0.1044355705f, -0.0990828425f, + -0.0934195668f, -0.0874440819f, -0.0811550021f, -0.0745511875f, -0.0676321834f, + -0.0603975877f, -0.0528475679f, -0.0449828543f, -0.0368040986f, -0.0283128861f, + -0.0195108838f, -0.0104003223f, -0.0009837818f, 0.0087356847f, 0.0187546927f, + 0.0290693250f, 0.0396753438f, 0.0505682528f, 0.0617432520f, 0.0731955394f, + -0.0849232078f, -0.0969054326f, -0.1091460735f, -0.1216373071f, -0.1343720406f, + -0.1473424733f, -0.1605402082f, -0.1739567965f, -0.1875831038f, -0.2014097124f, + -0.2154271752f, -0.2296251506f, -0.2439934313f, -0.2585212290f, -0.2731975317f, + -0.2880111337f, -0.3029502928f, -0.3180032372f, -0.3331578076f, -0.3484017253f, + -0.3637222052f, -0.3791064322f, -0.3945416212f, -0.4100143015f, -0.4255111217f, + -0.4410185516f, -0.4565227628f, -0.4720100164f, -0.4874662757f, -0.5028775334f, + -0.5182296634f, -0.5335084200f, -0.5486994982f, -0.5637886524f, -0.5787616372f, + -0.5936041474f, -0.6083019376f, -0.6228409410f, -0.6372069120f, -0.6513859630f, + -0.6653640866f, -0.6791275144f, -0.6926627755f, -0.7059561610f, -0.7189947963f, + -0.7317654490f, -0.7442554235f, -0.7564523220f, -0.7683438063f, -0.7799182534f, + -0.7911639810f, -0.8020697832f, -0.8126249313f, -0.8228194118f, -0.8326428533f, + -0.8420860767f, -0.8511404991f, -0.8597975969f, -0.8680517077f, -0.8758881092f, + -0.8832823634f, -0.8902196884f, -0.8967157602f, -0.9027729034f, -0.9083824754f, + -0.9135394692f, -0.9182395935f, -0.9224776030f, -0.9262499809f, -0.9295535684f, + -0.9323854446f, -0.9347436428f, -0.9366261959f, -0.9380323887f, -0.9389615655f, + -0.9394137263f, -0.9393896461f, -0.9388904572f, -0.9379178882f, -0.9364743829f, + -0.9345626831f, -0.9321863055f, -0.9293491840f, -0.9260557890f, -0.9223110080f, + -0.9181203246f, -0.9134896994f, -0.9084255695f, -0.9029349089f, -0.8970250487f, + -0.8907034993f, -0.8839784265f, -0.8768582940f, -0.8693521619f, -0.8614694476f, + -0.8532197475f, -0.8446131349f, -0.8356599212f, -0.8263708353f, -0.8167568445f, + -0.8068289757f, -0.7965991497f, -0.7860788107f, -0.7752800584f, -0.7642148733f, + -0.7528960109f, -0.7413358092f, -0.7295469642f, -0.7175422311f, -0.7053351402f, + -0.6929380894f, -0.6803644896f, -0.6676273942f, -0.6547405124f, -0.6417166591f, + -0.6285686493f, -0.6153115034f, -0.6019562483f, -0.5885198116f, -0.5750215650f, + 0.5615197420f, 0.5478612781f, 0.5341838002f, 0.5204906464f, 0.5067980289f, + 0.4931168854f, 0.4794588387f, 0.4658361673f, 0.4522601366f, 0.4387422502f, + 0.4252935350f, 0.4119254053f, 0.3986486793f, 0.3854739666f, 0.3724119067f, + 0.3594728410f, 0.3466667533f, 0.3340034485f, 0.3214924335f, 0.3091430366f, + 0.2969639599f, 0.2849639654f, 0.2731511295f, 0.2615332901f, 0.2501178682f, + 0.2389119864f, 0.2279221565f, 0.2171545923f, 0.2066148520f, 0.1963084787f, + 0.1862401515f, 0.1764142811f, 0.1668347418f, 0.1575049609f, 0.1484276950f, + 0.1396053135f, 0.1310400218f, 0.1227331311f, 0.1146853194f, 0.1068974212f, + 0.0993694067f, 0.0921007246f, 0.0850901082f, 0.0783365741f, 0.0718384907f, + 0.0655927584f, 0.0595967993f, 0.0538481586f, 0.0483424664f, 0.0430756323f, + 0.0380428955f, 0.0332404599f, 0.0286619961f, 0.0242999699f, 0.0201510899f, + 0.0162059069f, 0.0124559226f, 0.0088928537f, 0.0054926532f, 0.0023052765f, + -0.0005515143f, -0.0030201224f, -0.0052712574f, -0.0073737046f, -0.0093160523f, + -0.0111072771f, -0.0127562135f, -0.0142635731f, -0.0156361461f, -0.0168790054f, + -0.0179969221f, -0.0189934950f, -0.0198726747f, -0.0206398536f, -0.0212980714f, + -0.0218509119f, -0.0223025978f, -0.0226570386f, -0.0229178313f, -0.0230882075f, + -0.0231725387f, -0.0231746566f, -0.0230979007f, -0.0229462404f, -0.0227237809f, + -0.0224345829f, -0.0220820960f, -0.0216706358f, -0.0212045144f, -0.0206875466f, + -0.0201238506f, -0.0195175279f, -0.0188730918f, -0.0181944817f, -0.0174855441f, + -0.0167510118f, -0.0159947462f, -0.0152208358f, -0.0144332750f, -0.0136361914f, + -0.0128338682f, -0.0120294262f, -0.0112272501f, -0.0104311826f, -0.0096443929f, + -0.0088709844f, -0.0081134979f, -0.0073764324f, -0.0066623385f, -0.0059733889f, + -0.0053142183f, -0.0046856776f, -0.0040914025f, -0.0035321070f, -0.0030089030f, + -0.0025271603f, -0.0020749648f, -0.0016621647f, -0.0012705614f, -0.0008115423f +}; + +const float rot_vec_delay_re_LDQMF[60] = +{ +-0.7071067812f,0.7071067812f,0.7071067812f,-0.7071067812f,-0.7071067812f, +0.7071067812f,0.7071067812f,-0.7071067812f,-0.7071067812f,0.7071067812f, +0.7071067812f,-0.7071067812f,-0.7071067812f,0.7071067812f,0.7071067812f, +-0.7071067812f,-0.7071067812f,0.7071067812f,0.7071067812f,-0.7071067812f, +-0.7071067812f,0.7071067812f,0.7071067812f,-0.7071067812f,-0.7071067812f, +0.7071067812f,0.7071067812f,-0.7071067812f,-0.7071067812f,0.7071067812f, +0.7071067812f,-0.7071067812f,-0.7071067812f,0.7071067812f,0.7071067812f, +-0.7071067812f,-0.7071067812f,0.7071067812f,0.7071067812f,-0.7071067812f, +-0.7071067812f,0.7071067812f,0.7071067812f,-0.7071067812f,-0.7071067812f, +0.7071067812f,0.7071067812f,-0.7071067812f,-0.7071067812f,0.7071067812f, +0.7071067812f,-0.7071067812f,-0.7071067812f,0.7071067812f,0.7071067812f, +-0.7071067812f,-0.7071067812f,0.7071067812f,0.7071067812f,-0.7071067812f +}; + +const float rot_vec_delay_im_LDQMF[60] = +{ +-0.7071067812f,-0.7071067812f,0.7071067812f,0.7071067812f,-0.7071067812f, +-0.7071067812f,0.7071067812f,0.7071067812f,-0.7071067812f,-0.7071067812f, +0.7071067812f,0.7071067812f,-0.7071067812f,-0.7071067812f,0.7071067812f, +0.7071067812f,-0.7071067812f,-0.7071067812f,0.7071067812f,0.7071067812f, +-0.7071067812f,-0.7071067812f,0.7071067812f,0.7071067812f,-0.7071067812f, +-0.7071067812f,0.7071067812f,0.7071067812f,-0.7071067812f,-0.7071067812f, +0.7071067812f,0.7071067812f,-0.7071067812f,-0.7071067812f,0.7071067812f, +0.7071067812f,-0.7071067812f,-0.7071067812f,0.7071067812f,0.7071067812f, +-0.7071067812f,-0.7071067812f,0.7071067812f,0.7071067812f,-0.7071067812f, +-0.7071067812f,0.7071067812f,0.7071067812f,-0.7071067812f,-0.7071067812f, +0.7071067812f,0.7071067812f,-0.7071067812f,-0.7071067812f,0.7071067812f, +0.7071067812f,-0.7071067812f,-0.7071067812f,0.7071067812f,0.7071067812f +}; + +const float rot_vec_ana_re_L10[5] = +{ + 2.8262465099f,2.6536058227f,2.2212117088f,1.5713899168f,0.7677495312f, +}; + +const float rot_vec_ana_im_L10[5] = +{ + -0.1110435278f,-0.9789668726f,-1.7510621190f,-2.3517512048f,-2.7222344971f, +}; + +const float rot_vec_ana_re_L16[8] = +{ + 2.2353945156f,2.1817362886f,2.0442351594f,1.8281752196f,1.5418595313f,1.1962910459f, + 0.8047497665f,0.3822824048f, +}; + +const float rot_vec_ana_im_L16[8] = +{ + -0.0548758552f,-0.4899252669f,-0.9061471254f,-1.2875462580f,-1.6194657100f,-1.8891500029f, + -2.0862353207f,-2.2031477851f, +}; + +const float rot_vec_ana_re_L20[10] = +{ + 1.9996144810f,1.9688531362f,1.8896120929f,1.7638425287f,1.5946413075f,1.3861747251f, + 1.1435759205f,0.8728184813f,0.5805693545f,0.2740246834f, +}; + +const float rot_vec_ana_im_L20[10] = +{ + -0.0392673849f,-0.3515925599f,-0.6552603591f,-0.9427934737f,-1.2071118839f,-1.4417071934f, + -1.6408028871f,-1.7994965681f,-1.9138806715f,-1.9811386809f, +}; + +const float rot_vec_ana_re_L30[15] = +{ + 1.6328532594f,1.6216739995f,1.5927273399f,1.5463304262f,1.4829915928f,1.4034047932f, + 1.3084419970f,1.1991436365f,1.0767072074f,0.9424741487f,0.7979151461f,0.6446140182f, + 0.4842503641f,0.3185811618f,0.1494215176f, +}; + +const float rot_vec_ana_im_L30[15] = +{ + -0.0213752201f,-0.1919377663f,-0.3603974022f,-0.5249084488f,-0.6836684885f,-0.8349381133f, + -0.9770599813f,-1.1084769757f,-1.2277492644f,-1.3335700753f,-1.4247800133f,-1.5003797633f, + -1.5595410387f,-1.6016156561f,-1.6261426373f, +}; + +const float rot_vec_ana_re_L32[16] = +{ + 1.5810197732f,1.5715049038f,1.5468555830f,1.5073091974f,1.4532466002f,1.3851884438f, + 1.3037901655f,1.2098356752f,1.1042298059f,0.9879896000f,0.8622345142f,0.7281756387f, + 0.5871040336f,0.4403782958f,0.2894114743f,0.1356574621f, +}; + +const float rot_vec_ana_im_L32[16] = +{ + -0.0194030057f,-0.1742766119f,-0.3274718390f,-0.4775133334f,-0.6229561133f,-0.7623994853f, + -0.8945005334f,-1.0179870525f,-1.1316697997f,-1.2344539482f,-1.3253496303f,-1.4034814709f, + -1.4680970178f,-1.5185739878f,-1.5544262602f,-1.5753085580f, +}; + +const float rot_vec_ana_re_L40[20] = +{ + 1.4141454099f,1.4086967623f,1.3945630307f,1.3718313542f,1.3406418813f,1.3011869053f, + 1.2537096794f,1.1985029164f,1.1359069844f,1.0663078081f,0.9901344896f,0.9078566627f, + 0.8199815976f,0.7270510733f,0.6296380373f,0.5283430735f,0.4237906989f,0.3166255137f, + 0.2075082270f,0.0971115830f, +}; + +const float rot_vec_ana_im_L40[20] = +{ + -0.0138837862f,-0.1247935572f,-0.2349339344f,-0.3436258658f,-0.4501992295f,-0.5539969652f, + -0.6543791254f,-0.7507268207f,-0.8424460355f,-0.9289712904f,-1.0097691283f,-1.0843414038f, + -1.1522283539f,-1.2130114331f,-1.2663158934f,-1.3118130952f,-1.3492225330f,-1.3783135652f, + -1.3989068360f,-1.4108753809f, +}; + +const float rot_vec_ana_re_L60[30] = +{ + 1.1546758066f,1.1526978375f,1.1475604038f,1.1392775867f,1.1278720890f,1.1133751723f, + 1.0958265716f,1.0752743865f,1.0517749490f,1.0253926695f,0.9961998600f,0.9642765358f, + 0.9297101968f,0.8925955867f,0.8530344341f,0.8111351735f,0.7670126477f,0.7207877935f, + 0.6725873102f,0.6225433117f,0.5707929653f,0.5174781151f,0.4627448933f,0.4067433200f, + 0.3496268915f,0.2915521599f,0.2326783042f,0.1731666934f,0.1131804447f,0.0528839763f, +}; + +const float rot_vec_ana_im_L60[30] = +{ + -0.0075574434f,-0.0679781487f,-0.1282125306f,-0.1880954908f,-0.2474628944f,-0.3061520194f, + -0.3640020030f,-0.4208542824f,-0.4765530295f,-0.5309455779f,-0.5838828413f,-0.6352197224f, + -0.6848155104f,-0.7325342668f,-0.7782451976f,-0.8218230124f,-0.8631482675f,-0.9021076931f, + -0.9385945043f,-0.9725086932f,-1.0037573034f,-1.0322546845f,-1.0579227273f,-1.0806910775f, + -1.1004973285f,-1.1172871929f,-1.1310146507f,-1.1416420760f,-1.1491403397f,-1.1534888896f, +}; + + + +const float rot_vec_syn_re_L10[5] = +{ + 0.1117172025f,0.1048929802f,0.0878011021f,0.0621146404f,0.0303479649f, +}; + +const float rot_vec_syn_im_L10[5] = +{ + -0.0043893808f,-0.0386970634f,-0.0692168078f,-0.0929611287f,-0.1076057667f, +}; + +const float rot_vec_syn_re_L16[8] = +{ + 0.1117697258f,0.1090868144f,0.1022117580f,0.0914087610f,0.0770929766f,0.0598145523f, + 0.0402374883f,0.0191141202f, +}; + +const float rot_vec_syn_im_L16[8] = +{ + -0.0027437928f,-0.0244962633f,-0.0453073563f,-0.0643773129f,-0.0809732855f,-0.0944575001f, + -0.1043117660f,-0.1101573893f, +}; + +const float rot_vec_syn_re_L20[10] = +{ + 0.1117818477f,0.1100622363f,0.1056325273f,0.0986017949f,0.0891431591f,0.0774895228f, + 0.0639278374f,0.0487920364f,0.0324548136f,0.0153184455f, +}; + +const float rot_vec_syn_im_L20[10] = +{ + -0.0021951135f,-0.0196546216f,-0.0366301676f,-0.0527037574f,-0.0674796057f,-0.0805938822f, + -0.0917236698f,-0.1005949163f,-0.1069891821f,-0.1107490191f, +}; + +const float rot_vec_syn_re_L30[15] = +{ + 0.1117938204f,0.1110284288f,0.1090465865f,0.1058700070f,0.1015334935f,0.0960845578f, + 0.0895828996f,0.0820997524f,0.0737171032f,0.0645267939f,0.0546295156f,0.0441337048f, + 0.0331543560f,0.0218117611f,0.0102301920f, +}; + +const float rot_vec_syn_im_L30[15] = +{ + -0.0014634613f,-0.0131410805f,-0.0246747234f,-0.0359380248f,-0.0468075816f,-0.0571643048f, + -0.0668947240f,-0.0758922305f,-0.0840582459f,-0.0913033015f,-0.0975480191f,-0.1027239802f, + -0.1067744758f,-0.1096551279f,-0.1113343755f, +}; + +const float rot_vec_syn_re_L32[16] = +{ + 0.1117949803f,0.1111221774f,0.1093792072f,0.1065828555f,0.1027600526f,0.0979476142f, + 0.0921918867f,0.0855483010f,0.0780808384f,0.0698614146f,0.0609691872f,0.0514897932f, + 0.0415145243f,0.0311394479f,0.0204644816f,0.0095924311f, +}; + +const float rot_vec_syn_im_L32[16] = +{ + -0.0013719997f,-0.0123232174f,-0.0231557558f,-0.0337652916f,-0.0440496492f,-0.0539097846f, + -0.0632507393f,-0.0719825548f,-0.0800211389f,-0.0872890758f,-0.0937163711f,-0.0992411265f, + -0.1038101357f,-0.1073793965f,-0.1099145349f,-0.1113911364f, +}; + +const float rot_vec_syn_re_L40[20] = +{ + 0.1117980110f,0.1113672575f,0.1102498879f,0.1084527911f,0.1059870468f,0.1028678571f, + 0.0991144528f,0.0947499750f,0.0898013320f,0.0842990340f,0.0782770044f,0.0717723711f, + 0.0648252372f,0.0574784342f,0.0497772575f,0.0417691875f,0.0335035965f,0.0250314447f, + 0.0164049658f,0.0076773447f, +}; + +const float rot_vec_syn_im_L40[20] = +{ + -0.0010976097f,-0.0098657969f,-0.0185731583f,-0.0271660100f,-0.0355913742f,-0.0437973057f, + -0.0517332122f,-0.0593501664f,-0.0666012069f,-0.0734416290f,-0.0798292589f,-0.0857247149f, + -0.0910916496f,-0.0958969739f,-0.1001110615f,-0.1037079311f,-0.1066654069f,-0.1089652549f, + -0.1105932959f,-0.1115394925f, +}; + +const float rot_vec_syn_re_L60[30] = +{ + 0.1118010042f,0.1116094882f,0.1111120583f,0.1103100780f,0.1092057454f,0.1078020875f, + 0.1061029516f,0.1041129948f,0.1018376715f,0.0992832183f,0.0964566367f,0.0933656741f, + 0.0900188027f,0.0864251961f,0.0825947039f,0.0785378255f,0.0742656803f,0.0697899780f, + 0.0651229863f,0.0602774970f,0.0552667912f,0.0501046030f,0.0448050816f,0.0393827526f, + 0.0338524782f,0.0282294165f,0.0225289799f,0.0167667930f,0.0109586494f,0.0051204690f, +}; + +const float rot_vec_syn_im_L60[30] = +{ + -0.0007317463f,-0.0065819559f,-0.0124141249f,-0.0182122676f,-0.0239604917f,-0.0296430418f, + -0.0352443424f,-0.0407490407f,-0.0461420487f,-0.0514085845f,-0.0565342130f,-0.0615048852f, + -0.0663069767f,-0.0709273254f,-0.0753532672f,-0.0795726710f,-0.0835739716f,-0.0873462018f, + -0.0908790221f,-0.0941627493f,-0.0971883830f,-0.0999476301f,-0.1024329276f,-0.1046374636f, + -0.1065551956f,-0.1081808673f,-0.1095100227f,-0.1105390187f,-0.1112650350f,-0.1116860815f, +}; + + +const float bpf_weights_16[CLDFB_NO_COL_MAX] = +{ + 1.000040f, 0.702561f, 0.208838f, 0.001553f, 0.001777f, 0.001370f, 0.000926f, 0.000554f, + 0.000270f, 0.000080f, 0.000030f, 0.000082f, 0.000081f, 0.000052f, 0.000017f, 0.000016f +}; + +/*-------------------------------------------------------------------* + * LP CNG excitation details code book + *-------------------------------------------------------------------*/ + +const float CNG_details_codebook[64][NUM_ENV_CNG]= +{ + { + 6.924306f,8.544082f,9.583108f,8.550549f,7.972679f,7.363361f,8.439027f,7.487016f, + 9.149983f,8.352748f,8.823824f,9.544188f,8.314853f,7.809112f,7.218567f,8.612295f, + 7.780142f,7.232745f,6.965988f,7.568601f + }, + { + 9.374340f,7.795641f,7.379285f,8.396346f,9.895033f,10.221931f,10.015446f,10.087706f, + 10.536375f,10.581183f,10.733459f,10.821303f,10.822197f,10.777159f,10.746262f,10.936824f, + 10.820635f,10.881506f,9.992537f,8.925898f + }, + { + 8.260058f,8.387338f,7.832300f,9.092162f,8.387571f,7.401807f,7.888559f,7.678440f, + 8.136854f,8.515383f,8.772667f,9.228788f,8.836490f,9.518608f,8.908790f,9.499302f, + 9.932305f,10.237994f,10.133189f,8.193151f + }, + { + 10.124639f,10.788106f,10.767182f,10.692019f,10.830482f,9.359397f,10.431694f,11.161179f, + 10.356518f,10.541230f,8.185465f,8.116880f,11.338371f,10.284152f,10.511218f,10.880645f, + 10.220743f,11.179196f,11.066867f,10.445066f + }, + { + 9.726912f,9.842380f,10.314793f,10.252558f,10.717097f,10.746290f,9.953682f,10.412869f, + 9.836176f,8.674436f,7.351096f,7.309156f,7.246638f,6.955070f,7.846981f,9.111964f, + 9.612611f,8.519944f,9.454450f,9.249232f + }, + { + 10.298511f,10.439103f,10.451839f,9.763371f,10.337607f,10.939195f,10.938910f,10.824776f, + 10.976114f,10.974276f,10.754051f,10.581675f,10.222703f,9.126027f,8.198234f,7.695039f, + 6.968823f,7.457246f,9.904172f,9.612813f + }, + { + 9.908430f,10.124971f,10.253873f,8.625096f,8.128853f,8.701863f,10.346726f,10.291558f, + 8.935132f,9.638033f,10.793781f,10.670537f,10.681151f,10.410478f,10.512748f,10.861156f, + 10.653567f,10.911621f,10.629312f,9.736268f + }, + { + 11.810060f,11.612185f,11.468822f,11.083865f,11.406177f,11.832067f,11.661546f,11.277926f, + 7.555347f,8.622866f,12.176802f,10.751250f,10.721958f,9.523929f,9.626828f,11.701570f, + 11.848139f,10.849975f,11.640839f,11.392167f + }, + { + 8.572747f,8.869074f,8.680323f,9.760900f,10.671435f,9.673125f,9.516179f,10.428748f, + 10.353197f,10.692994f,11.081258f,10.146167f,10.790188f,10.432859f,9.273769f,7.979839f, + 8.209611f,9.644866f,8.476103f,10.683167f + }, + { + 8.595222f,7.301031f,8.322734f,11.874195f,11.543133f,10.814659f,12.073861f,11.818481f, + 11.602201f,12.035087f,11.952577f,12.363761f,12.167592f,12.254158f,12.108662f,12.373547f, + 11.860260f,9.014181f,10.036099f,8.638621f + }, + { + 10.275646f,10.526311f,10.252750f,10.178793f,10.466885f,9.088381f,9.273152f,8.119694f, + 7.295121f,7.350810f,8.158489f,9.209213f,9.370357f,9.310070f,9.168746f,9.856857f, + 10.187559f,10.613888f,10.080095f,10.451872f + }, + { + 12.318529f,11.945473f,12.303066f,12.451133f,12.272326f,12.478561f,12.303981f,12.279855f, + 12.189694f,10.818603f,10.013278f,8.600300f,7.832378f,8.014066f,11.346451f,11.673646f, + 10.466306f,10.728513f,11.475281f,12.085626f + }, + { + 10.014422f,10.218554f,10.442979f,10.508470f,10.393559f,10.661362f,10.757983f,10.689740f, + 10.897243f,10.382886f,10.379339f,9.271018f,8.495484f,7.720114f,7.161139f,8.396199f, + 9.721141f,10.159747f,9.918998f,9.919149f + }, + { + 11.034192f,11.766760f,11.903868f,11.195253f,11.683506f,11.900399f,12.318353f,12.368064f, + 12.271189f,12.306809f,12.485785f,12.136335f,12.220796f,11.960956f,11.879458f,11.099092f, + 11.004694f,7.854421f,8.103326f,11.485018f + }, + { + 11.692872f,12.115354f,12.250820f,9.919422f,11.204221f,7.870928f,8.415102f,9.997985f, + 11.942008f,12.149603f,10.633919f,11.269428f,12.354749f,12.288899f,12.291698f,12.195188f, + 12.179792f,12.030136f,12.092098f,12.207270f + }, + { + 11.755179f,8.064263f,9.749080f,12.185180f,11.136729f,11.763196f,8.889953f,8.555951f, + 12.034410f,12.245128f,11.697193f,11.559429f,10.780444f,11.789196f,12.130393f,11.689948f, + 11.623942f,11.399507f,11.981954f,10.904933f + }, + { + 7.074471f,7.358261f,8.067513f,8.080610f,8.765159f,10.199254f,10.289200f,9.618623f, + 9.822992f,9.500810f,10.655619f,10.906424f,10.611357f,10.641397f,10.077725f,9.173571f, + 9.274541f,8.160206f,7.797956f,7.321218f + }, + { + 9.641497f,8.341463f,7.913689f,9.615902f,12.212582f,12.373892f,11.788377f,12.044415f, + 11.569188f,12.302634f,12.361569f,12.119579f,12.223657f,12.303328f,12.384604f,12.306796f, + 12.109153f,12.154896f,10.165297f,11.492375f + }, + { + 10.334753f,9.264669f,7.656600f,7.729103f,7.665664f,7.728192f,8.657525f,10.255910f, + 10.287778f,9.540968f,9.808374f,10.307826f,10.623036f,10.579712f,10.909159f,10.597071f, + 10.508566f,10.917792f,10.740663f,10.609496f + }, + { + 12.464439f,12.387059f,12.281745f,12.415715f,12.481938f,12.064619f,12.051270f,10.871007f, + 9.753584f,8.710700f,7.918756f,8.510613f,11.316961f,11.829647f,11.667075f,12.037048f, + 12.184728f,12.269155f,12.388278f,12.256269f + }, + { + 10.985455f,10.863164f,10.984641f,11.150430f,10.892216f,10.949295f,10.885633f,9.861358f, + 9.347205f,7.782274f,7.420996f,7.042737f,7.859407f,9.545682f,10.120652f,10.378402f, + 10.381286f,10.677829f,10.603589f,10.744861f + }, + { + 11.619549f,10.501878f,10.291579f,11.911536f,12.263100f,11.638079f,11.827111f,11.886570f, + 11.885740f,11.982909f,11.279054f,11.820845f,11.897547f,11.508306f,10.922131f,7.355962f, + 9.090330f,12.035433f,11.309077f,11.814055f + }, + { + 12.109969f,11.648486f,8.360036f,10.628968f,8.450899f,8.016151f,10.885192f,11.289871f, + 11.616718f,11.618735f,12.016033f,11.572757f,11.580486f,11.526383f,12.019007f,12.063487f, + 12.178980f,11.612581f,11.149741f,11.315678f + }, + { + 11.982289f,12.039945f,10.895576f,11.808078f,11.972691f,11.752888f,11.100145f,7.459962f, + 9.401170f,12.240148f,11.661579f,11.968470f,10.817088f,11.060538f,12.236608f,12.217974f, + 11.888335f,12.158744f,12.290771f,12.263520f + }, + { + 7.551557f,9.193432f,10.939713f,10.390559f,10.388751f,10.007786f,10.151727f,11.200849f, + 10.927567f,11.044189f,10.805322f,10.912845f,10.931647f,10.806228f,10.434938f,10.151430f, + 9.517872f,9.532900f,8.436217f,7.561033f + }, + { + 7.914798f,9.662442f,12.315506f,11.969525f,11.779161f,10.819254f,11.074059f,12.259423f, + 12.310757f,12.028122f,12.393316f,12.259255f,12.478424f,12.251179f,11.982938f,12.119265f, + 12.321500f,11.854281f,11.885189f,7.733390f + }, + { + 11.074573f,11.119295f,11.026623f,10.587306f,10.326489f,9.440902f,7.861374f,7.502906f, + 10.206084f,10.379787f,10.375632f,9.986627f,9.698876f,10.544230f,10.857472f,10.772952f, + 11.004036f,10.641294f,11.111090f,11.084974f + }, + { + 12.312282f,11.569094f,12.027453f,11.997540f,12.050622f,12.124397f,11.441438f,11.697535f, + 11.553439f,11.941341f,11.153276f,7.695126f,8.494260f,12.226931f,11.163250f,11.056936f, + 11.197067f,8.736544f,11.552220f,11.995921f + }, + { + 11.841222f,12.040383f,12.323356f,12.164479f,12.146215f,12.485503f,12.354469f,12.261094f, + 12.176959f,12.164176f,11.750998f,10.552405f,11.221596f,7.971972f,7.827245f,9.382548f, + 11.354092f,11.724841f,11.744237f,11.836000f + }, + { + 11.863342f,11.946292f,10.565049f,10.276701f,12.088562f,11.987997f,11.516201f,11.701505f, + 12.013391f,12.254663f,12.160517f,11.530292f,11.789889f,12.011831f,12.307916f,11.817711f, + 7.388736f,8.277118f,12.146955f,11.330376f + }, + { + 10.445749f,10.383992f,11.260086f,10.207924f,7.801878f,12.093586f,12.186577f,12.208809f, + 11.981275f,8.760727f,10.776209f,11.675901f,11.273578f,12.169944f,11.829489f,11.361869f, + 11.931891f,11.640718f,12.033961f,11.504183f + }, + { + 11.418176f,11.996329f,11.634505f,12.108740f,12.232028f,12.223016f,11.168437f,11.585357f, + 12.287769f,10.519855f,11.961341f,12.135221f,11.941004f,11.400546f,12.083041f,12.021441f, + 12.087834f,12.196712f,12.153121f,11.933741f + }, + { + 8.696248f,7.886807f,8.518339f,9.431623f,10.314435f,10.492967f,9.433606f,9.312992f, + 9.056099f,9.558634f,9.174564f,8.692657f,8.529263f,9.327991f,8.283659f,7.715106f, + 6.828506f,7.494133f,8.531253f,8.664100f + }, + { + 8.749990f,9.185427f,7.974370f,7.730459f,9.471635f,11.246136f,11.225875f,11.585999f, + 11.810496f,11.799830f,11.983171f,12.095557f,12.123705f,12.150494f,12.057273f,12.058468f, + 12.128398f,12.119547f,11.788305f,9.252466f + }, + { + 10.620537f,10.064924f,9.681692f,9.556549f,8.067345f,7.460412f,7.355683f,7.793144f, + 7.842898f,9.346528f,10.380497f,9.183150f,10.255505f,10.654870f,10.772358f,10.480097f, + 10.444176f,10.506150f,10.650716f,10.807790f + }, + { + 11.832230f,12.163531f,12.210456f,12.488221f,12.106194f,11.716965f,12.486103f,11.839725f, + 12.333147f,12.101274f,7.643279f,9.040410f,12.480962f,11.550027f,12.089822f,11.299880f, + 10.714154f,12.309387f,12.290308f,12.153176f + }, + { + 11.011459f,10.708299f,10.217109f,10.618895f,10.503453f,10.618390f,10.261137f,9.054105f, + 8.967848f,9.665904f,9.986521f,8.089101f,7.524849f,8.521540f,10.395278f,9.179631f, + 8.431019f,9.362102f,9.471244f,10.168259f + }, + { + 11.385670f,11.988930f,11.979943f,12.082343f,12.240467f,12.163774f,12.389517f,12.076717f, + 12.254186f,12.165658f,11.824725f,11.992508f,10.716744f,10.217215f,10.610125f,8.819359f, + 7.553169f,8.576138f,7.663194f,8.161689f + }, + { + 11.335433f,10.824145f,11.164507f,9.187079f,8.159495f,9.823243f,11.259155f,10.102992f, + 10.894949f,10.692467f,9.597807f,11.322961f,11.068228f,10.523948f,11.179681f,11.389847f, + 11.204894f,11.328845f,10.761085f,11.533332f + }, + { + 12.452473f,12.226961f,12.414132f,12.453005f,12.224496f,11.829764f,9.932276f,9.747059f, + 7.944996f,8.074952f,10.982581f,11.711254f,11.656355f,11.826878f,12.063810f,12.048336f, + 12.100821f,12.339723f,12.171370f,12.491159f + }, + { + 8.693851f,9.237082f,10.193584f,10.816728f,11.382530f,11.124274f,10.905251f,10.747824f, + 11.006325f,11.224193f,11.377479f,11.195903f,11.132830f,10.824033f,11.188758f,8.716391f, + 7.654446f,8.441257f,9.691014f,10.598401f + }, + { + 8.319717f,9.639095f,12.133827f,12.102556f,11.919735f,12.334815f,11.993119f,12.259864f, + 12.158967f,12.356464f,12.374672f,12.379640f,12.396713f,12.146963f,12.203291f,11.311678f, + 8.605060f,10.391322f,8.431939f,7.948593f + }, + { + 11.088415f,10.884553f,11.032227f,11.202397f,10.523194f,10.606202f,9.688022f,9.082882f, + 8.526981f,7.401042f,8.779226f,10.680804f,10.619134f,10.539470f,10.309608f,10.253415f, + 10.965061f,10.624226f,10.946682f,11.063556f + }, + { + 12.049884f,12.395158f,12.315166f,12.298508f,12.409452f,12.353070f,12.369121f,12.232027f, + 12.363715f,12.371237f,11.460312f,12.028971f,8.312684f,8.200596f,10.810326f,11.885057f, + 12.140730f,11.769361f,11.470847f,11.374696f + }, + { + 11.318600f,10.855831f,10.592196f,10.190356f,10.852498f,11.480312f,10.896217f,11.130247f, + 11.148643f,11.272378f,10.871895f,11.095495f,8.893303f,9.083083f,8.899607f,8.150163f, + 10.035096f,11.004933f,11.685496f,11.349737f + }, + { + 12.437282f,11.779876f,12.273005f,12.224300f,11.436580f,12.714269f,12.546281f,12.410135f, + 12.488817f,12.347595f,12.661417f,12.587544f,12.405058f,12.452996f,11.808998f,11.644467f, + 11.697278f,7.908151f,11.580981f,12.178329f + }, + { + 12.383582f,11.978909f,12.263449f,12.181010f,11.308676f,10.129762f,7.630591f,11.672964f, + 12.255041f,12.043112f,12.393015f,11.554902f,11.858689f,12.585340f,12.405621f,12.438987f, + 12.422440f,12.429326f,12.518377f,12.596020f + }, + { + 12.294228f,7.930717f,10.000073f,12.115003f,11.276157f,12.374399f,12.087711f,11.020492f, + 12.205840f,12.519583f,12.094537f,12.497026f,12.274739f,12.595242f,12.627252f,12.238583f, + 12.414072f,12.458577f,12.250254f,12.212063f + }, + { + 10.220644f,10.133038f,9.384470f,9.330061f,9.287414f,10.419335f,10.086744f,10.347366f, + 9.606766f,9.729086f,10.175982f,10.490002f,10.450778f,10.530566f,10.662402f,10.198713f, + 9.756838f,7.568992f,7.395587f,10.386068f + }, + { + 12.338935f,11.958341f,7.484207f,8.228665f,11.650372f,11.382147f,12.027068f,11.762714f, + 11.266207f,12.095256f,12.402075f,12.538692f,12.335326f,12.212730f,12.551470f,12.419568f, + 11.941353f,12.565509f,12.164819f,12.121121f + }, + { + 11.530771f,10.926392f,10.037753f,7.947472f,8.046108f,7.827244f,7.274969f,9.599776f, + 10.971369f,9.563985f,10.664629f,11.255960f,10.737041f,11.198854f,11.004945f,11.547729f, + 11.150601f,11.446258f,11.272099f,11.224279f + }, + { + 12.154252f,12.426224f,12.362570f,12.276526f,11.848105f,12.233492f,12.238678f,11.606319f, + 11.630966f,8.226843f,8.663989f,12.324718f,11.910058f,11.977910f,11.282999f,11.276901f, + 12.135061f,12.316558f,12.126414f,12.222776f + }, + { + 10.840468f,10.882261f,10.935246f,10.880699f,11.083740f,11.099067f,10.870871f,10.768135f, + 10.532293f,10.338410f,9.085450f,8.402101f,7.755022f,9.959888f,10.061506f,10.644034f, + 10.614702f,10.481884f,10.760615f,11.004514f + }, + { + 12.122748f,12.306721f,11.587852f,12.430750f,12.175253f,11.815797f,12.308073f,12.320755f, + 12.218995f,12.463879f,12.424328f,12.559034f,12.042230f,11.765315f,8.922847f,9.539627f, + 7.874360f,8.521064f,9.272277f,12.165272f + }, + { + 12.485865f,11.205798f,11.664264f,10.653128f,7.610178f,8.947474f,11.966330f,12.100983f, + 12.107791f,11.909583f,11.112039f,12.535769f,12.489249f,12.444782f,12.346417f,12.296227f, + 12.534035f,12.334972f,12.077379f,12.275601f + }, + { + 12.425206f,12.450086f,12.341137f,12.568719f,12.320243f,12.361140f,12.099853f,11.035367f, + 8.319082f,12.032015f,12.280725f,11.606254f,12.321961f,11.066000f,11.799191f,12.266534f, + 12.556672f,12.545979f,12.602019f,12.030170f + }, + { + 8.871724f,11.287228f,11.532060f,10.621922f,11.143099f,10.988887f,10.820709f,11.695601f, + 10.989671f,11.008445f,11.567303f,11.250048f,11.122625f,9.865336f,9.707122f,11.365924f, + 11.399251f,11.287416f,8.975295f,9.569743f + }, + { + 9.780970f,11.908114f,11.473997f,12.024678f,11.860840f,11.723680f,12.367899f,12.108915f, + 12.340000f,12.381660f,12.315555f,12.282724f,12.359691f,11.991398f,12.220946f,12.155458f, + 12.413619f,11.642963f,7.867479f,8.503173f + }, + { + 12.100057f,12.246774f,12.168076f,11.771790f,10.224229f,8.752139f,8.276130f,8.317601f, + 8.677964f,10.925248f,11.599258f,10.861567f,11.187905f,11.979478f,12.035626f,12.058556f, + 12.150581f,12.192816f,12.171208f,12.225122f + }, + { + 12.205771f,12.205347f,12.351176f,12.237871f,12.382323f,12.461397f,12.301606f,12.369697f, + 11.959662f,11.558475f,10.953750f,8.388442f,8.819866f,12.077829f,11.983337f,11.818386f, + 12.286803f,12.458479f,12.329653f,12.507854f + }, + { + 11.530513f,11.199886f,12.487312f,12.406390f,12.054689f,12.255518f,12.097314f,12.346512f, + 12.310920f,11.682766f,12.332119f,12.015944f,11.992967f,11.917038f,7.877818f,9.167294f, + 12.226696f,11.735081f,12.256387f,11.444395f + }, + { + 12.132508f,12.328980f,11.918468f,12.068428f,12.493188f,12.275755f,12.524507f,12.294735f, + 12.582710f,12.488275f,12.132201f,12.076183f,12.373331f,11.888222f,11.716764f,10.961454f, + 8.318602f,11.632863f,12.609443f,11.484080f + }, + { + 11.948422f,12.164044f,11.930634f,7.560744f,9.486037f,12.354504f,11.826571f,11.874330f, + 10.939306f,10.727631f,12.333044f,12.133337f,12.172671f,12.228312f,12.004416f,12.354714f, + 12.154241f,11.830939f,12.245022f,12.033812f + }, + { + 12.494522f,12.883386f,12.105121f,12.216132f,12.821167f,10.613010f,12.572326f,12.881424f, + 11.754890f,12.876678f,12.439420f,12.258423f,12.945374f,12.765532f,12.874741f,12.539070f, + 12.711823f,12.611643f,11.904738f,12.176199f + } +}; + + +/*-------------------------------------------------------------------* + * FD CNG + *-------------------------------------------------------------------*/ + +const int16_t d_array[SIZE_SCALE_TABLE_CN] = { 1, 2, 5, 8, 10, 15, 20, 30, 40, 60, 80, 120, 140, 160, 180, 220, 260, 300 }; +const float m_array[SIZE_SCALE_TABLE_CN] = { 0.000f, 0.260f, 0.480f, 0.580f, 0.610f, 0.668f, 0.705f, 0.762f, 0.800f, 0.841f, 0.865f, 0.890f, 0.900f, 0.910f, 0.920f, 0.930f, 0.935f, 0.940f }; + +const float msQeqInvAv_thresh[3] = { 0.01f, 0.03f, 0.05f }; +const float msNoiseSlopeMax[4] = { 2.f, 1.6f, 1.3f, 1.1f }; + +const SCALE_SETUP scaleTableStereo[SIZE_SCALE_TABLE_STEREO] = +{ + { 1, 0, 8000, -5.5f }, + { 1, 8000, 9600, -5.0f }, + { 1, 9600, 13200, -4.0f }, + { 1, 13200, 16400, -3.0f }, + { 1, 16400, 24400, -1.6f }, + { 1, 24400, 32000, -0.2f }, + { 1, 32000,512001, 0.0f }, + + { 2, 0, 8000, -0.9f }, + { 2, 8000, 9600, -0.65f}, + { 2, 9600, 13200, -2.0f }, + { 2, 13200, 16400, -3.0f }, + { 2, 16400, 24400, -0.8f }, + { 2, 24400, 32000, -0.25f}, + { 2, 32000,512001, 0.0f } +}; + +const SCALE_SETUP scaleTableMono[SIZE_SCALE_TABLE_MONO] = +{ + { 0, 0, 8000, -5.5f }, + { 0, 8000, 9600, -5.0f }, + { 0, 9600, 13200, -4.0f }, + { 0, 13200, 16400, -3.0f }, + { 0, 16400, 24400, -1.5f }, + { 0, 24400,128001, -0.5f }, + + { 1, 0, 8000, -5.5f }, + { 1, 8000, 9600, -5.0f }, + { 1, 9600, 13200, -1.55f}, + { 1, 13200, 16400, -3.0f }, + { 1, 16400, 24400, -0.6f }, + { 1, 24400, 32000, -0.2f }, + { 1, 32000,128001, 0.0f }, + + { 2, 0, 8000, -0.9f }, + { 2, 8000, 9600, -0.65f}, + { 2, 9600, 13200, -2.0f }, + { 2, 13200, 16400, -3.0f }, + { 2, 16400, 24400, -0.8f }, + { 2, 24400, 32000, -0.25f}, + { 2, 32000,128001, 0.0f } +}; + +const SCALE_SETUP scaleTable_cn_only[SIZE_SCALE_TABLE_CN] = +{ + { 0, 0, 8000, -3.5f }, + { 0, 8000, 9600, -3.0f }, + { 0, 9600, 13200, -2.5f }, + { 0, 13200, 16400, -2.0f }, + { 0, 16400,128001, 0.0f }, + + { 1, 0, 8000, -3.0f }, + { 1, 8000, 9600, -2.5f }, + { 1, 9600, 13200, -1.5f }, + { 1, 13200, 16400, -2.5f }, + { 1, 16400, 24400, -0.5f }, + { 1, 24400,128001, 0.0f }, + + { 2, 0, 8000, -2.5f }, + { 2, 8000, 9600, -2.5f }, + { 2, 9600, 13200, -2.0f }, + { 2, 13200, 16400, -1.0f }, + + { 2, 16400, 24400, -0.5f }, + { 2, 24400, 32000, 0.0f }, + { 2, 32000,128001, 0.0f } +}; + +const SCALE_SETUP scaleTable_cn_dirac[15] = +{ + { 0, 0, 13200, -3.0f }, + { 0, 13200, 16400, -2.5f }, + { 0, 16400, 24400, -2.0f }, + { 0, 24400, 32000, -1.5f }, + { 0, 32000,512001, 0.0f }, + + { 1, 0, 13200, -3.0f }, + { 1, 13200, 16400, -2.5f }, + { 1, 16400, 24400, -2.0f }, + { 1, 24400, 32000, -1.5f }, + { 1, 32000,512001, 0.0f }, + + { 2, 0, 13200, -3.0f }, + { 2, 13200, 16400, -2.5f }, + { 2, 16400, 24400, -2.0f }, + { 2, 24400, 32000, -1.5f }, + { 2, 32000,512001, 0.0f } +}; +const float scaleTable_cn_only_amrwbio[SIZE_SCALE_TABLE_CN_AMRWB][2] = +{ + { ACELP_6k60, -4.0f }, + { ACELP_8k85, -3.0f }, + { ACELP_12k65, -2.0f } +}; + + +const int16_t sidparts_encoder_noise_est[SIZE_SIDPARTS_ENC_NOISE_EST] = { 4, 8, 12, 16, 20, 24, 30, 36, 42, 50, 58, 68, 80, 92, 108, 126, 148, 176, 212, 255, 259, 264, 269, 279 }; + +const int16_t sidPartitions_nb[] = { 4, 8, 12, 16, 20, 24, 30, 36, 42, 50, 58, 68, 80, 92, 108, 126, 159 }; +const int16_t sidPartitions_wb1[] = { 4, 8, 12, 16, 20, 24, 30, 36, 42, 50, 58, 68, 80, 92, 108, 126, 148, 176, 212, 255 }; +const int16_t sidPartitions_wb2[] = { 4, 8, 12, 16, 20, 24, 30, 36, 42, 50, 58, 68, 80, 92, 108, 126, 148, 176, 212, 255, 259 }; +const int16_t sidPartitions_wb3[] = { 4, 8, 12, 16, 20, 24, 30, 36, 42, 50, 58, 68, 80, 92, 108, 126, 148, 176, 212, 255, 319 }; +const int16_t sidPartitions_swb1[] = { 4, 8, 12, 16, 20, 24, 30, 36, 42, 50, 58, 68, 80, 92, 108, 126, 148, 176, 212, 255, 259, 264, 269, 274 }; +const int16_t sidPartitions_swb2[] = { 4, 8, 12, 16, 20, 24, 30, 36, 42, 50, 58, 68, 80, 92, 108, 126, 148, 176, 212, 255, 319, 324, 329, 339 }; + +const int16_t shapingPartitions_nb[] = { 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 25, 28, 31, 34, 37, 40, 43, 47, 51, 55, 59, 64, 69, 74, 80, 86, 93, 100, 108, 117, 126, 136, 159 }; +const int16_t shapingPartitions_wb1[] = { 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 25, 28, 31, 34, 37, 40, 43, 47, 51, 55, 59, 64, 69, 74, 80, 86, 93, 100, 108, 117, 126, 135, 148, 162, 176, 192, 212, 232, 255 }; +const int16_t shapingPartitions_wb2[] = { 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 25, 28, 31, 34, 37, 40, 43, 47, 51, 55, 59, 64, 69, 74, 80, 86, 93, 100, 108, 117, 126, 135, 148, 162, 176, 192, 212, 232, 255 }; +const int16_t shapingPartitions_wb3[] = { 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 25, 28, 31, 34, 37, 40, 43, 47, 51, 55, 59, 64, 69, 74, 80, 86, 93, 100, 108, 117, 126, 136, 148, 176, 212, 256, 308, 319 }; +const int16_t shapingPartitions_swb1[] = { 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 25, 28, 31, 34, 37, 40, 43, 47, 51, 55, 59, 64, 69, 74, 80, 86, 93, 100, 108, 117, 126, 135, 148, 162, 176, 192, 212, 232, 255 }; +const int16_t shapingPartitions_swb2[] = { 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 25, 28, 31, 34, 37, 40, 43, 47, 51, 55, 59, 64, 69, 74, 80, 86, 93, 100, 108, 117, 126, 136, 148, 176, 212, 256, 308, 319 }; + +const FD_CNG_SETUP FdCngSetup_nb = { 512, 160, sizeof(sidPartitions_nb)/sizeof(int16_t), sidPartitions_nb, sizeof(shapingPartitions_nb)/sizeof(int16_t), shapingPartitions_nb }; +const FD_CNG_SETUP FdCngSetup_wb1 = { 512, 256, sizeof(sidPartitions_wb1)/sizeof(int16_t), sidPartitions_wb1, sizeof(shapingPartitions_wb1)/sizeof(int16_t), shapingPartitions_wb1 }; +const FD_CNG_SETUP FdCngSetup_wb2 = { 512, 256, sizeof(sidPartitions_wb2)/sizeof(int16_t), sidPartitions_wb2, sizeof(shapingPartitions_wb2)/sizeof(int16_t), shapingPartitions_wb2 }; +const FD_CNG_SETUP FdCngSetup_wb3 = { 640, 320, sizeof(sidPartitions_wb3)/sizeof(int16_t), sidPartitions_wb3, sizeof(shapingPartitions_wb3)/sizeof(int16_t), shapingPartitions_wb3 }; +const FD_CNG_SETUP FdCngSetup_swb1 = { 512, 256, sizeof(sidPartitions_swb1)/sizeof(int16_t), sidPartitions_swb1, sizeof(shapingPartitions_swb1)/sizeof(int16_t), shapingPartitions_swb1 }; +const FD_CNG_SETUP FdCngSetup_swb2 = { 640, 320, sizeof(sidPartitions_swb2)/sizeof(int16_t), sidPartitions_swb2, sizeof(shapingPartitions_swb2)/sizeof(int16_t), shapingPartitions_swb2 }; + + +const int16_t levels_37bits[FD_CNG_stages_37bits] = { 128, 64, 64, 64, 64, 64 }; +const int16_t bits_37bits[FD_CNG_stages_37bits] = { 7, 6, 6, 6, 6, 6 }; + +/* IDCT_MATRIX_ROM: 18*24 Word16 = 432 Word16 */ +/* or compressed IDCT_MATRIX_ROM: 18*24 Word8 + 25 = 230 Word16 + WMOPS (INDIRECT(432) and STORE(432) ) */ + +/* Stage1 Word8 tables 16x8+ 17*10+ 17*16 + 78*18 = = 1974 Word8 -> 987 Word16 */ + +/* ROM storeSizeW8 = W8reduction (3072- (987+230) )/3072 = 1207/3072 --> 39.3 % */ +/* ROM with DCTII-24 in PROM = W8reduction (3072- (987) )/3072 = /3072 --> 31.8 % */ + +/* additional minor Table ROM ( dct_mid points 18 Word16, dct_col_upshifts 52, scaleFactors 2*2 = ~= 74 Word16s */ + + +const Word16 cdk1_ivas_entries_per_segment[FDCNG_VQ_DCT_NSEGM] = { 16, 17, 17, 78 }; +const Word16 cdk1_ivas_cum_entries_per_segment[FDCNG_VQ_DCT_NSEGM + 1] = { 0, 16 ,33, 50, 128 }; +const Word16 /* DCT trunc_len */ cdk1_ivas_cols_per_segment[FDCNG_VQ_DCT_NSEGM] = { FDCNG_VQ_DCT_MINTRUNC, 10, 16, FDCNG_VQ_DCT_MAXTRUNC }; /* 8, 10, 16, 18 */ +const Word16 /* segment inner DCT trunc_len */ cdk1_ivas_trunc_dct_cols_per_segment[FDCNG_VQ_DCT_NSEGM] = { FDCNG_VQ_DCT_MAXTRUNC - FDCNG_VQ_DCT_MINTRUNC, FDCNG_VQ_DCT_MAXTRUNC - 10 , FDCNG_VQ_DCT_MAXTRUNC - 16 , 0 }; + +/* to get back to FDCNG VQ domain for segment S use : idct as follows */ +/* cdk1r_vec[col, row] = cdk1r_tr_midQ_truncQ(col 1:24 ) + invScaleFQ * idctMat( cdk1_ivas_dct_sS_W8[1:col]<fftlen/2+1; j++) hs->fftSineTab[j] = (float)sin(2.0*EVS_PI*j/hs->fftlen); */ + + +const float fftSineTab640[321] = +{ + 0.0000000000000000000000000f, 0.0098173199221491814000000f, 0.0196336936205625530000000f, 0.0294481739401817320000000f, 0.0392598174512386320000000f, 0.0490676760673522950000000f, 0.0588708035647869110000000f, 0.0686682611703872680000000f, 0.0784590989351272580000000f, 0.0882423743605613710000000f, + 0.0980171412229537960000000f, 0.1077824681997299200000000f, 0.1175374016165733300000000f, 0.1272810101509094200000000f, 0.1370123475790023800000000f, 0.1467304825782775900000000f, 0.1564344763755798300000000f, 0.1661233752965927100000000f, 0.1757962852716445900000000f, 0.1854522377252578700000000f, + 0.1950903236865997300000000f, 0.2047096043825149500000000f, 0.2143091559410095200000000f, 0.2238880544900894200000000f, 0.2334453761577606200000000f, 0.2429801821708679200000000f, 0.2524915933609008800000000f, 0.2619786560535430900000000f, 0.2714404463768005400000000f, 0.2808761000633239700000000f, + 0.2902846932411193800000000f, 0.2996652722358703600000000f, 0.3090170025825500500000000f, 0.3183389306068420400000000f, 0.3276301920413970900000000f, 0.3368898630142211900000000f, 0.3461170792579650900000000f, 0.3553109169006347700000000f, 0.3644705116748809800000000f, 0.3735949695110321000000000f, + 0.3826834559440612800000000f, 0.3917350172996521000000000f, 0.4007488489151001000000000f, 0.4097240269184112500000000f, 0.4186597466468811000000000f, 0.4275551140308380100000000f, 0.4364092648029327400000000f, 0.4452213346958160400000000f, 0.4539905190467834500000000f, 0.4627159237861633300000000f, + 0.4713967442512512200000000f, 0.4800321459770202600000000f, 0.4886212646961212200000000f, 0.4971632659435272200000000f, 0.5056573748588562000000000f, 0.5141027569770813000000000f, 0.5224985480308532700000000f, 0.5308440327644348100000000f, 0.5391383171081543000000000f, 0.5473806858062744100000000f, + 0.5555702447891235400000000f, 0.5637062788009643600000000f, 0.5717879533767700200000000f, 0.5798145532608032200000000f, 0.5877852439880371100000000f, 0.5956993103027343800000000f, 0.6035559773445129400000000f, 0.6113544106483459500000000f, 0.6190939545631408700000000f, 0.6267738342285156300000000f, + 0.6343932747840881300000000f, 0.6419516205787658700000000f, 0.6494480371475219700000000f, 0.6568819284439086900000000f, 0.6642524600028991700000000f, 0.6715589761734008800000000f, 0.6788007616996765100000000f, 0.6859771013259887700000000f, 0.6930873990058898900000000f, 0.7001308202743530300000000f, + 0.7071067690849304200000000f, 0.7140145897865295400000000f, 0.7208536267280578600000000f, 0.7276231050491333000000000f, 0.7343225479125976600000000f, 0.7409511208534240700000000f, 0.7475083470344543500000000f, 0.7539935111999511700000000f, 0.7604059576988220200000000f, 0.7667451500892639200000000f, + 0.7730104923248291000000000f, 0.7792012691497802700000000f, 0.7853169441223144500000000f, 0.7913569211959838900000000f, 0.7973206639289856000000000f, 0.8032075762748718300000000f, 0.8090170025825500500000000f, 0.8147485256195068400000000f, 0.8204014301300048800000000f, 0.8259753584861755400000000f, + 0.8314696550369262700000000f, 0.8368837833404541000000000f, 0.8422172665596008300000000f, 0.8474695682525634800000000f, 0.8526401519775390600000000f, 0.8577286005020141600000000f, 0.8627343773841857900000000f, 0.8676570057868957500000000f, 0.8724960088729858400000000f, 0.8772509098052978500000000f, + 0.8819212913513183600000000f, 0.8865066170692443800000000f, 0.8910065293312072800000000f, 0.8954205513000488300000000f, 0.8997483253479003900000000f, 0.9039893150329589800000000f, 0.9081431627273559600000000f, 0.9122095108032226600000000f, 0.9161879420280456500000000f, 0.9200780987739563000000000f, + 0.9238795638084411600000000f, 0.9275919198989868200000000f, 0.9312149286270141600000000f, 0.9347481727600097700000000f, 0.9381913542747497600000000f, 0.9415440559387207000000000f, 0.9448060393333435100000000f, 0.9479769468307495100000000f, 0.9510565400123596200000000f, 0.9540444016456604000000000f, + 0.9569403529167175300000000f, 0.9597440361976623500000000f, 0.9624552726745605500000000f, 0.9650737047195434600000000f, 0.9675990939140319800000000f, 0.9700312614440918000000000f, 0.9723699092864990200000000f, 0.9746148586273193400000000f, 0.9767658710479736300000000f, 0.9788227677345275900000000f, + 0.9807853102684021000000000f, 0.9826532602310180700000000f, 0.9844265580177307100000000f, 0.9861049652099609400000000f, 0.9876883625984191900000000f, 0.9891765117645263700000000f, 0.9905693531036377000000000f, 0.9918667078018188500000000f, 0.9930684566497802700000000f, 0.9941744804382324200000000f, + 0.9951847195625305200000000f, 0.9960990548133850100000000f, 0.9969173073768615700000000f, 0.9976395368576049800000000f, 0.9982656240463256800000000f, 0.9987954497337341300000000f, 0.9992290139198303200000000f, 0.9995663166046142600000000f, 0.9998072385787963900000000f, 0.9999517798423767100000000f, + 1.0000000000000000000000000f, 0.9999517798423767100000000f, 0.9998072385787963900000000f, 0.9995663166046142600000000f, 0.9992290139198303200000000f, 0.9987954497337341300000000f, 0.9982656240463256800000000f, 0.9976395368576049800000000f, 0.9969173073768615700000000f, 0.9960990548133850100000000f, + 0.9951847195625305200000000f, 0.9941744804382324200000000f, 0.9930684566497802700000000f, 0.9918667078018188500000000f, 0.9905693531036377000000000f, 0.9891765117645263700000000f, 0.9876883625984191900000000f, 0.9861049652099609400000000f, 0.9844265580177307100000000f, 0.9826532602310180700000000f, + 0.9807852506637573200000000f, 0.9788227677345275900000000f, 0.9767658710479736300000000f, 0.9746148586273193400000000f, 0.9723699092864990200000000f, 0.9700312614440918000000000f, 0.9675990939140319800000000f, 0.9650736451148986800000000f, 0.9624552130699157700000000f, 0.9597440361976623500000000f, + 0.9569402933120727500000000f, 0.9540444016456604000000000f, 0.9510564804077148400000000f, 0.9479769468307495100000000f, 0.9448060393333435100000000f, 0.9415440559387207000000000f, 0.9381912946701049800000000f, 0.9347481727600097700000000f, 0.9312149286270141600000000f, 0.9275919198989868200000000f, + 0.9238795042037963900000000f, 0.9200780391693115200000000f, 0.9161879420280456500000000f, 0.9122095108032226600000000f, 0.9081431627273559600000000f, 0.9039892554283142100000000f, 0.8997482657432556200000000f, 0.8954205513000488300000000f, 0.8910064697265625000000000f, 0.8865066170692443800000000f, + 0.8819212317466735800000000f, 0.8772509098052978500000000f, 0.8724959492683410600000000f, 0.8676570057868957500000000f, 0.8627343773841857900000000f, 0.8577286005020141600000000f, 0.8526401519775390600000000f, 0.8474695086479187000000000f, 0.8422172069549560500000000f, 0.8368837237358093300000000f, + 0.8314695954322814900000000f, 0.8259752988815307600000000f, 0.8204014301300048800000000f, 0.8147484660148620600000000f, 0.8090169429779052700000000f, 0.8032075166702270500000000f, 0.7973206043243408200000000f, 0.7913568615913391100000000f, 0.7853168845176696800000000f, 0.7792012095451355000000000f, + 0.7730104327201843300000000f, 0.7667450904846191400000000f, 0.7604058980941772500000000f, 0.7539934515953064000000000f, 0.7475082874298095700000000f, 0.7409510612487793000000000f, 0.7343224883079528800000000f, 0.7276230454444885300000000f, 0.7208535671234130900000000f, 0.7140145301818847700000000f, + 0.7071067094802856400000000f, 0.7001307606697082500000000f, 0.6930873394012451200000000f, 0.6859770417213439900000000f, 0.6788007020950317400000000f, 0.6715589165687561000000000f, 0.6642524003982543900000000f, 0.6568818688392639200000000f, 0.6494479775428772000000000f, 0.6419515609741210900000000f, + 0.6343932151794433600000000f, 0.6267737746238708500000000f, 0.6190938949584960900000000f, 0.6113543510437011700000000f, 0.6035558581352233900000000f, 0.5956992506980896000000000f, 0.5877851843833923300000000f, 0.5798144936561584500000000f, 0.5717878937721252400000000f, 0.5637062191963195800000000f, + 0.5555701851844787600000000f, 0.5473806262016296400000000f, 0.5391382575035095200000000f, 0.5308439731597900400000000f, 0.5224984884262085000000000f, 0.5141026973724365200000000f, 0.5056573152542114300000000f, 0.4971632063388824500000000f, 0.4886211752891540500000000f, 0.4800320565700531000000000f, + 0.4713966846466064500000000f, 0.4627158641815185500000000f, 0.4539904296398162800000000f, 0.4452212452888488800000000f, 0.4364091753959655800000000f, 0.4275550246238708500000000f, 0.4186596572399139400000000f, 0.4097239673137664800000000f, 0.4007487595081329300000000f, 0.3917349278926849400000000f, + 0.3826833665370941200000000f, 0.3735949099063873300000000f, 0.3644704222679138200000000f, 0.3553108274936676000000000f, 0.3461169898509979200000000f, 0.3368897736072540300000000f, 0.3276301026344299300000000f, 0.3183388411998748800000000f, 0.3090169131755828900000000f, 0.2996652126312255900000000f, + 0.2902846038341522200000000f, 0.2808760106563568100000000f, 0.2714403867721557600000000f, 0.2619785666465759300000000f, 0.2524915039539337200000000f, 0.2429801076650619500000000f, 0.2334452867507934600000000f, 0.2238879650831222500000000f, 0.2143090665340423600000000f, 0.2047095298767089800000000f, + 0.1950902342796325700000000f, 0.1854521632194519000000000f, 0.1757961958646774300000000f, 0.1661233007907867400000000f, 0.1564343869686126700000000f, 0.1467303931713104200000000f, 0.1370122581720352200000000f, 0.1272809207439422600000000f, 0.1175373122096061700000000f, 0.1077823787927627600000000f, + 0.0980170592665672300000000f, 0.0882422849535942080000000f, 0.0784590095281600950000000f, 0.0686681717634201050000000f, 0.0588707178831100460000000f, 0.0490675866603851320000000f, 0.0392597280442714690000000f, 0.0294480863958597180000000f, 0.0196336060762405400000000f, 0.0098172323778271675000000f, + -0.0000000874227765734758580f +}; + +/* Analysis windows for overlap-add */ +/* ener = 0.f; + for (j=0; jfftlen; j++) + { + hs->olapWinAna[j] = (float)sin(EVS_PI*((float)j+0.5f)/(float)(hs->fftlen)); + ener += hs->olapWinAna[j]*hs->olapWinAna[j]; + } + ener = (float)sqrt( ener / (float)hs->fftlen ); + for (j=0; jfftlen; j++) + { + hs->olapWinAna[j] /= ener; + } */ +const float olapWinAna512[512] = +{ + 0.0043387459591031075000000f, 0.0130160758271813390000000f, 0.0216929148882627490000000f, 0.0303689353168010710000000f, 0.0390438176691532140000000f, 0.0477172248065471650000000f, 0.0563888400793075560000000f, 0.0650583282113075260000000f, 0.0737253651022911070000000f, 0.0823896303772926330000000f, + 0.0910507962107658390000000f, 0.0997085273265838620000000f, 0.1083625108003616300000000f, 0.1170124113559722900000000f, 0.1256579011678695700000000f, 0.1342986673116684000000000f, 0.1429343819618225100000000f, 0.1515647023916244500000000f, 0.1601893156766891500000000f, 0.1688079088926315300000000f, + 0.1774201542139053300000000f, 0.1860256940126419100000000f, 0.1946242451667785600000000f, 0.2032154798507690400000000f, 0.2117990404367446900000000f, 0.2203746438026428200000000f, 0.2289419323205947900000000f, 0.2375006377696991000000000f, 0.2460503578186035200000000f, 0.2545908391475677500000000f, + 0.2631217241287231400000000f, 0.2716427147388458300000000f, 0.2801534831523895300000000f, 0.2886536717414856000000000f, 0.2971430122852325400000000f, 0.3056211769580841100000000f, 0.3140878379344940200000000f, 0.3225426375865936300000000f, 0.3309853076934814500000000f, 0.3394155502319335900000000f, + 0.3478329777717590300000000f, 0.3562373220920562700000000f, 0.3646282255649566700000000f, 0.3730054795742034900000000f, 0.3813686370849609400000000f, 0.3897174298763275100000000f, 0.3980515301227569600000000f, 0.4063706994056701700000000f, 0.4146745502948761000000000f, 0.4229627549648284900000000f, + 0.4312350451946258500000000f, 0.4394911527633667000000000f, 0.4477306604385376000000000f, 0.4559533298015594500000000f, 0.4641588330268859900000000f, 0.4723468720912933300000000f, 0.4805171191692352300000000f, 0.4886692464351654100000000f, 0.4968029856681823700000000f, 0.5049180388450622600000000f, + 0.5130140781402587900000000f, 0.5210908055305481000000000f, 0.5291479229927063000000000f, 0.5371851325035095200000000f, 0.5452020764350891100000000f, 0.5531984567642211900000000f, 0.5611740946769714400000000f, 0.5691285729408264200000000f, 0.5770615935325622600000000f, 0.5849729180335998500000000f, + 0.5928622484207153300000000f, 0.6007292270660400400000000f, 0.6085735559463501000000000f, 0.6163949966430664100000000f, 0.6241932511329650900000000f, 0.6319679617881774900000000f, 0.6397189497947692900000000f, 0.6474457979202270500000000f, 0.6551482677459716800000000f, 0.6628261208534240700000000f, + 0.6704789996147155800000000f, 0.6781066060066223100000000f, 0.6857087016105651900000000f, 0.6932849884033203100000000f, 0.7008351087570190400000000f, 0.7083588838577270500000000f, 0.7158560752868652300000000f, 0.7233262658119201700000000f, 0.7307691574096679700000000f, 0.7381845116615295400000000f, + 0.7455722093582153300000000f, 0.7529317140579223600000000f, 0.7602629661560058600000000f, 0.7675655484199523900000000f, 0.7748392224311828600000000f, 0.7820837497711181600000000f, 0.7892987728118896500000000f, 0.7964841723442077600000000f, 0.8036395311355590800000000f, 0.8107646703720092800000000f, + 0.8178592920303344700000000f, 0.8249230980873107900000000f, 0.8319557905197143600000000f, 0.8389572501182556200000000f, 0.8459270596504211400000000f, 0.8528650403022766100000000f, 0.8597708344459533700000000f, 0.8666443228721618700000000f, 0.8734852671623230000000000f, 0.8802932500839233400000000f, + 0.8870680332183837900000000f, 0.8938094973564147900000000f, 0.9005173444747924800000000f, 0.9071912169456481900000000f, 0.9138309359550476100000000f, 0.9204362630844116200000000f, 0.9270069003105163600000000f, 0.9335426688194274900000000f, 0.9400433301925659200000000f, 0.9465085864067077600000000f, + 0.9529381394386291500000000f, 0.9593318104743957500000000f, 0.9656894207000732400000000f, 0.9720106720924377400000000f, 0.9782953858375549300000000f, 0.9845431447029113800000000f, 0.9907538890838623000000000f, 0.9969274401664733900000000f, 1.0030633211135864000000000f, 1.0091614723205566000000000f, + 1.0152215957641602000000000f, 1.0212435722351074000000000f, 1.0272270441055298000000000f, 1.0331718921661377000000000f, 1.0390777587890625000000000f, 1.0449445247650146000000000f, 1.0507719516754150000000000f, 1.0565599203109741000000000f, 1.0623079538345337000000000f, 1.0680160522460937000000000f, + 1.0736839771270752000000000f, 1.0793114900588989000000000f, 1.0848982334136963000000000f, 1.0904443264007568000000000f, 1.0959492921829224000000000f, 1.1014128923416138000000000f, 1.1068351268768311000000000f, 1.1122156381607056000000000f, 1.1175543069839478000000000f, 1.1228508949279785000000000f, + 1.1281052827835083000000000f, 1.1333171129226685000000000f, 1.1384862661361694000000000f, 1.1436126232147217000000000f, 1.1486958265304565000000000f, 1.1537358760833740000000000f, 1.1587324142456055000000000f, 1.1636853218078613000000000f, 1.1685944795608521000000000f, 1.1734596490859985000000000f, + 1.1782805919647217000000000f, 1.1830571889877319000000000f, 1.1877892017364502000000000f, 1.1924765110015869000000000f, 1.1971189975738525000000000f, 1.2017163038253784000000000f, 1.2062685489654541000000000f, 1.2107752561569214000000000f, 1.2152363061904907000000000f, 1.2196516990661621000000000f, + 1.2240210771560669000000000f, 1.2283445596694946000000000f, 1.2326216697692871000000000f, 1.2368522882461548000000000f, 1.2410365343093872000000000f, 1.2451739311218262000000000f, 1.2492644786834717000000000f, 1.2533079385757446000000000f, 1.2573043107986450000000000f, 1.2612532377243042000000000f, + 1.2651547193527222000000000f, 1.2690086364746094000000000f, 1.2728147506713867000000000f, 1.2765728235244751000000000f, 1.2802829742431641000000000f, 1.2839449644088745000000000f, 1.2875584363937378000000000f, 1.2911235094070435000000000f, 1.2946400642395020000000000f, 1.2981077432632446000000000f, + 1.3015266656875610000000000f, 1.3048964738845825000000000f, 1.3082171678543091000000000f, 1.3114887475967407000000000f, 1.3147107362747192000000000f, 1.3178833723068237000000000f, 1.3210064172744751000000000f, 1.3240796327590942000000000f, 1.3271030187606812000000000f, 1.3300764560699463000000000f, + 1.3329998254776001000000000f, 1.3358730077743530000000000f, 1.3386958837509155000000000f, 1.3414683341979980000000000f, 1.3441903591156006000000000f, 1.3468616008758545000000000f, 1.3494822978973389000000000f, 1.3520522117614746000000000f, 1.3545711040496826000000000f, 1.3570390939712524000000000f, + 1.3594559431076050000000000f, 1.3618216514587402000000000f, 1.3641359806060791000000000f, 1.3663990497589111000000000f, 1.3686106204986572000000000f, 1.3707706928253174000000000f, 1.3728791475296021000000000f, 1.3749359846115112000000000f, 1.3769409656524658000000000f, 1.3788940906524658000000000f, + 1.3807953596115112000000000f, 1.3826445341110229000000000f, 1.3844418525695801000000000f, 1.3861869573593140000000000f, 1.3878798484802246000000000f, 1.3895204067230225000000000f, 1.3911087512969971000000000f, 1.3926446437835693000000000f, 1.3941282033920288000000000f, 1.3955593109130859000000000f, + 1.3969377279281616000000000f, 1.3982635736465454000000000f, 1.3995368480682373000000000f, 1.4007574319839478000000000f, 1.4019253253936768000000000f, 1.4030404090881348000000000f, 1.4041025638580322000000000f, 1.4051119089126587000000000f, 1.4060683250427246000000000f, 1.4069718122482300000000000f, + 1.4078224897384644000000000f, 1.4086199998855591000000000f, 1.4093644618988037000000000f, 1.4100558757781982000000000f, 1.4106942415237427000000000f, 1.4112794399261475000000000f, 1.4118115901947021000000000f, 1.4122905731201172000000000f, 1.4127163887023926000000000f, 1.4130889177322388000000000f, + 1.4134082794189453000000000f, 1.4136744737625122000000000f, 1.4138875007629395000000000f, 1.4140472412109375000000000f, 1.4141536951065063000000000f, 1.4142069816589355000000000f, 1.4142069816589355000000000f, 1.4141536951065063000000000f, 1.4140472412109375000000000f, 1.4138875007629395000000000f, + 1.4136744737625122000000000f, 1.4134082794189453000000000f, 1.4130889177322388000000000f, 1.4127163887023926000000000f, 1.4122905731201172000000000f, 1.4118115901947021000000000f, 1.4112794399261475000000000f, 1.4106942415237427000000000f, 1.4100558757781982000000000f, 1.4093644618988037000000000f, + 1.4086199998855591000000000f, 1.4078224897384644000000000f, 1.4069718122482300000000000f, 1.4060683250427246000000000f, 1.4051119089126587000000000f, 1.4041025638580322000000000f, 1.4030402898788452000000000f, 1.4019252061843872000000000f, 1.4007574319839478000000000f, 1.3995368480682373000000000f, + 1.3982635736465454000000000f, 1.3969377279281616000000000f, 1.3955591917037964000000000f, 1.3941282033920288000000000f, 1.3926446437835693000000000f, 1.3911087512969971000000000f, 1.3895204067230225000000000f, 1.3878798484802246000000000f, 1.3861868381500244000000000f, 1.3844418525695801000000000f, + 1.3826445341110229000000000f, 1.3807953596115112000000000f, 1.3788940906524658000000000f, 1.3769409656524658000000000f, 1.3749359846115112000000000f, 1.3728791475296021000000000f, 1.3707706928253174000000000f, 1.3686106204986572000000000f, 1.3663990497589111000000000f, 1.3641359806060791000000000f, + 1.3618216514587402000000000f, 1.3594559431076050000000000f, 1.3570389747619629000000000f, 1.3545711040496826000000000f, 1.3520520925521851000000000f, 1.3494822978973389000000000f, 1.3468616008758545000000000f, 1.3441903591156006000000000f, 1.3414683341979980000000000f, 1.3386958837509155000000000f, + 1.3358730077743530000000000f, 1.3329998254776001000000000f, 1.3300764560699463000000000f, 1.3271030187606812000000000f, 1.3240796327590942000000000f, 1.3210062980651855000000000f, 1.3178833723068237000000000f, 1.3147107362747192000000000f, 1.3114886283874512000000000f, 1.3082171678543091000000000f, + 1.3048964738845825000000000f, 1.3015265464782715000000000f, 1.2981077432632446000000000f, 1.2946399450302124000000000f, 1.2911235094070435000000000f, 1.2875584363937378000000000f, 1.2839448451995850000000000f, 1.2802829742431641000000000f, 1.2765728235244751000000000f, 1.2728147506713867000000000f, + 1.2690086364746094000000000f, 1.2651547193527222000000000f, 1.2612532377243042000000000f, 1.2573041915893555000000000f, 1.2533078193664551000000000f, 1.2492643594741821000000000f, 1.2451738119125366000000000f, 1.2410364151000977000000000f, 1.2368522882461548000000000f, 1.2326216697692871000000000f, + 1.2283444404602051000000000f, 1.2240210771560669000000000f, 1.2196515798568726000000000f, 1.2152363061904907000000000f, 1.2107751369476318000000000f, 1.2062684297561646000000000f, 1.2017163038253784000000000f, 1.1971189975738525000000000f, 1.1924765110015869000000000f, 1.1877892017364502000000000f, + 1.1830570697784424000000000f, 1.1782804727554321000000000f, 1.1734595298767090000000000f, 1.1685943603515625000000000f, 1.1636853218078613000000000f, 1.1587324142456055000000000f, 1.1537357568740845000000000f, 1.1486958265304565000000000f, 1.1436125040054321000000000f, 1.1384861469268799000000000f, + 1.1333171129226685000000000f, 1.1281051635742187000000000f, 1.1228507757186890000000000f, 1.1175541877746582000000000f, 1.1122155189514160000000000f, 1.1068350076675415000000000f, 1.1014127731323242000000000f, 1.0959491729736328000000000f, 1.0904442071914673000000000f, 1.0848982334136963000000000f, + 1.0793113708496094000000000f, 1.0736838579177856000000000f, 1.0680160522460937000000000f, 1.0623078346252441000000000f, 1.0565598011016846000000000f, 1.0507718324661255000000000f, 1.0449445247650146000000000f, 1.0390776395797729000000000f, 1.0331717729568481000000000f, 1.0272269248962402000000000f, + 1.0212434530258179000000000f, 1.0152214765548706000000000f, 1.0091613531112671000000000f, 1.0030632019042969000000000f, 0.9969273209571838400000000f, 0.9907538294792175300000000f, 0.9845430850982666000000000f, 0.9782953262329101600000000f, 0.9720106124877929700000000f, 0.9656893610954284700000000f, + 0.9593317508697509800000000f, 0.9529380798339843800000000f, 0.9465084671974182100000000f, 0.9400432705879211400000000f, 0.9335426092147827100000000f, 0.9270067811012268100000000f, 0.9204362034797668500000000f, 0.9138308763504028300000000f, 0.9071910977363586400000000f, 0.9005171656608581500000000f, + 0.8938094377517700200000000f, 0.8870679140090942400000000f, 0.8802930712699890100000000f, 0.8734850883483886700000000f, 0.8666442632675170900000000f, 0.8597707748413085900000000f, 0.8528649210929870600000000f, 0.8459268808364868200000000f, 0.8389570713043212900000000f, 0.8319557309150695800000000f, + 0.8249229192733764600000000f, 0.8178591728210449200000000f, 0.8107645511627197300000000f, 0.8036394119262695300000000f, 0.7964840531349182100000000f, 0.7892987132072448700000000f, 0.7820836901664733900000000f, 0.7748391628265380900000000f, 0.7675654292106628400000000f, 0.7602628469467163100000000f, + 0.7529316544532775900000000f, 0.7455720901489257800000000f, 0.7381844520568847700000000f, 0.7307690382003784200000000f, 0.7233260869979858400000000f, 0.7158559560775756800000000f, 0.7083588242530822800000000f, 0.7008350491523742700000000f, 0.6932848691940307600000000f, 0.6857085824012756300000000f, + 0.6781064867973327600000000f, 0.6704788804054260300000000f, 0.6628260016441345200000000f, 0.6551482081413269000000000f, 0.6474456787109375000000000f, 0.6397188305854797400000000f, 0.6319679021835327100000000f, 0.6241931319236755400000000f, 0.6163948774337768600000000f, 0.6085734367370605500000000f, + 0.6007291078567504900000000f, 0.5928621292114257800000000f, 0.5849727988243103000000000f, 0.5770615339279174800000000f, 0.5691284537315368700000000f, 0.5611739754676818800000000f, 0.5531983971595764200000000f, 0.5452019572257995600000000f, 0.5371850132942199700000000f, 0.5291478037834167500000000f, + 0.5210906863212585400000000f, 0.5130139589309692400000000f, 0.5049179196357727100000000f, 0.4968028664588928200000000f, 0.4886691272258758500000000f, 0.4805169999599456800000000f, 0.4723467230796814000000000f, 0.4641586840152740500000000f, 0.4559532105922699000000000f, 0.4477305412292480500000000f, + 0.4394910335540771500000000f, 0.4312349855899810800000000f, 0.4229626357555389400000000f, 0.4146744310855865500000000f, 0.4063705503940582300000000f, 0.3980514407157897900000000f, 0.3897172808647155800000000f, 0.3813685178756713900000000f, 0.3730053603649139400000000f, 0.3646281659603118900000000f, + 0.3562372326850891100000000f, 0.3478328585624694800000000f, 0.3394154310226440400000000f, 0.3309852182865142800000000f, 0.3225425183773040800000000f, 0.3140876889228820800000000f, 0.3056210577487945600000000f, 0.2971428930759429900000000f, 0.2886535525321960400000000f, 0.2801533639430999800000000f, + 0.2716425955295562700000000f, 0.2631216049194335900000000f, 0.2545907199382782000000000f, 0.2460502535104751600000000f, 0.2375005036592483500000000f, 0.2289418131113052400000000f, 0.2203745096921920800000000f, 0.2117989212274551400000000f, 0.2032153606414794900000000f, 0.1946241259574890100000000f, + 0.1860255748033523600000000f, 0.1774200350046157800000000f, 0.1688077896833419800000000f, 0.1601892113685607900000000f, 0.1515645831823349000000000f, 0.1429342478513717700000000f, 0.1342985481023788500000000f, 0.1256577819585800200000000f, 0.1170122846961021400000000f, 0.1083623841404914900000000f, + 0.0997084006667137150000000f, 0.0910506695508956910000000f, 0.0823895111680030820000000f, 0.0737252458930015560000000f, 0.0650582015514373780000000f, 0.0563887134194374080000000f, 0.0477171018719673160000000f, 0.0390436910092830660000000f, 0.0303688123822212220000000f, 0.0216927900910377500000000f, + 0.0130159519612789150000000f, 0.0043386225588619709000000f +}; + +const float olapWinAna640[640] = +{ + 0.0034709984902292490000000f, 0.0104129118844866750000000f, 0.0173545740544795990000000f, 0.0242958199232816700000000f, 0.0312364790588617320000000f, 0.0381763875484466550000000f, 0.0451153740286827090000000f, 0.0520532727241516110000000f, 0.0589899159967899320000000f, 0.0659251436591148380000000f, + 0.0728587806224823000000000f, 0.0797906517982482910000000f, 0.0867206156253814700000000f, 0.0936484783887863160000000f, 0.1005740910768508900000000f, 0.1074972823262214700000000f, 0.1144178733229637100000000f, 0.1213357225060463000000000f, 0.1282506436109542800000000f, 0.1351624578237533600000000f, + 0.1420710384845733600000000f, 0.1489761769771575900000000f, 0.1558777391910553000000000f, 0.1627755314111709600000000f, 0.1696694195270538300000000f, 0.1765592098236084000000000f, 0.1834447383880615200000000f, 0.1903258562088012700000000f, 0.1972023993730545000000000f, 0.2040741592645645100000000f, + 0.2109410166740417500000000f, 0.2178028076887130700000000f, 0.2246593385934829700000000f, 0.2315104454755783100000000f, 0.2383559793233871500000000f, 0.2451957911252975500000000f, 0.2520296573638916000000000f, 0.2588574886322021500000000f, 0.2656790614128112800000000f, 0.2724942266941070600000000f, + 0.2793028354644775400000000f, 0.2861047089099884000000000f, 0.2928997278213501000000000f, 0.2996876239776611300000000f, 0.3064683377742767300000000f, 0.3132416605949401900000000f, 0.3200074136257171600000000f, 0.3267655074596405000000000f, 0.3335156738758087200000000f, 0.3402578532695770300000000f, + 0.3469918072223663300000000f, 0.3537174165248870800000000f, 0.3604344725608825700000000f, 0.3671428561210632300000000f, 0.3738423883914947500000000f, 0.3805329203605651900000000f, 0.3872142732143402100000000f, 0.3938862979412078900000000f, 0.4005488157272338900000000f, 0.4072017371654510500000000f, + 0.4138447940349578900000000f, 0.4204779267311096200000000f, 0.4271008670330047600000000f, 0.4337135851383209200000000f, 0.4403158128261566200000000f, 0.4469074010848999000000000f, 0.4534882903099060100000000f, 0.4600581824779510500000000f, 0.4666170477867126500000000f, 0.4731646478176116900000000f, + 0.4797008633613586400000000f, 0.4862254858016967800000000f, 0.4927383959293365500000000f, 0.4992394745349884000000000f, 0.5057284832000732400000000f, 0.5122053027153015100000000f, 0.5186697840690612800000000f, 0.5251218080520629900000000f, 0.5315611362457275400000000f, 0.5379876494407653800000000f, + 0.5444012284278869600000000f, 0.5508016943931579600000000f, 0.5571888685226440400000000f, 0.5635626316070556600000000f, 0.5699228048324585000000000f, 0.5762692093849182100000000f, 0.5826017856597900400000000f, 0.5889202952384948700000000f, 0.5952246189117431600000000f, 0.6015146374702453600000000f, + 0.6077901124954223600000000f, 0.6140509843826293900000000f, 0.6202970147132873500000000f, 0.6265281438827514600000000f, 0.6327440738677978500000000f, 0.6389448642730712900000000f, 0.6451302766799926800000000f, 0.6513000726699829100000000f, 0.6574541926383972200000000f, 0.6635924577713012700000000f, + 0.6697147488594055200000000f, 0.6758209466934204100000000f, 0.6819108128547668500000000f, 0.6879842281341552700000000f, 0.6940411329269409200000000f, 0.7000812292098999000000000f, 0.7061045169830322300000000f, 0.7121107578277587900000000f, 0.7180998921394348100000000f, 0.7240716814994812000000000f, + 0.7300260066986084000000000f, 0.7359628081321716300000000f, 0.7418818473815918000000000f, 0.7477830052375793500000000f, 0.7536661028861999500000000f, 0.7595310807228088400000000f, 0.7653777003288269000000000f, 0.7712059617042541500000000f, 0.7770156264305114700000000f, 0.7828065156936645500000000f, + 0.7885786294937133800000000f, 0.7943316698074340800000000f, 0.8000655770301818800000000f, 0.8057801723480224600000000f, 0.8114753961563110400000000f, 0.8171511292457580600000000f, 0.8228070735931396500000000f, 0.8284432291984558100000000f, 0.8340594172477722200000000f, 0.8396555185317993200000000f, + 0.8452314138412475600000000f, 0.8507869243621826200000000f, 0.8563219308853149400000000f, 0.8618362545967102100000000f, 0.8673298358917236300000000f, 0.8728026151657104500000000f, 0.8782541751861572300000000f, 0.8836847543716430700000000f, 0.8890939354896545400000000f, 0.8944817185401916500000000f, + 0.8998479843139648400000000f, 0.9051925539970397900000000f, 0.9105152487754821800000000f, 0.9158160686492919900000000f, 0.9210947751998901400000000f, 0.9263513088226318400000000f, 0.9315855503082275400000000f, 0.9367973208427429200000000f, 0.9419865608215332000000000f, 0.9471529722213745100000000f, + 0.9522966742515564000000000f, 0.9574174284934997600000000f, 0.9625151157379150400000000f, 0.9675895571708679200000000f, 0.9726406931877136200000000f, 0.9776684641838073700000000f, 0.9826726913452148400000000f, 0.9876530766487121600000000f, 0.9926097989082336400000000f, 0.9975425601005554200000000f, + 1.0024513006210327000000000f, 1.0073359012603760000000000f, 1.0121961832046509000000000f, 1.0170321464538574000000000f, 1.0218435525894165000000000f, 1.0266302824020386000000000f, 1.0313923358917236000000000f, 1.0361295938491821000000000f, 1.0408418178558350000000000f, 1.0455290079116821000000000f, + 1.0501909255981445000000000f, 1.0548275709152222000000000f, 1.0594388246536255000000000f, 1.0640245676040649000000000f, 1.0685845613479614000000000f, 1.0731189250946045000000000f, 1.0776274204254150000000000f, 1.0821099281311035000000000f, 1.0865663290023804000000000f, 1.0909965038299561000000000f, + 1.0954004526138306000000000f, 1.0997780561447144000000000f, 1.1041290760040283000000000f, 1.1084536314010620000000000f, 1.1127513647079468000000000f, 1.1170222759246826000000000f, 1.1212662458419800000000000f, 1.1254832744598389000000000f, 1.1296732425689697000000000f, 1.1338359117507935000000000f, + 1.1379711627960205000000000f, 1.1420791149139404000000000f, 1.1461595296859741000000000f, 1.1502122879028320000000000f, 1.1542373895645142000000000f, 1.1582345962524414000000000f, 1.1622040271759033000000000f, 1.1661453247070312000000000f, 1.1700586080551147000000000f, 1.1739436388015747000000000f, + 1.1778002977371216000000000f, 1.1816288232803345000000000f, 1.1854286193847656000000000f, 1.1892000436782837000000000f, 1.1929427385330200000000000f, 1.1966567039489746000000000f, 1.2003418207168579000000000f, 1.2039979696273804000000000f, 1.2076252698898315000000000f, 1.2112232446670532000000000f, + 1.2147921323776245000000000f, 1.2183318138122559000000000f, 1.2218420505523682000000000f, 1.2253229618072510000000000f, 1.2287741899490356000000000f, 1.2321958541870117000000000f, 1.2355878353118896000000000f, 1.2389501333236694000000000f, 1.2422825098037720000000000f, 1.2455849647521973000000000f, + 1.2488573789596558000000000f, 1.2520997524261475000000000f, 1.2553119659423828000000000f, 1.2584939002990723000000000f, 1.2616454362869263000000000f, 1.2647666931152344000000000f, 1.2678573131561279000000000f, 1.2709175348281860000000000f, 1.2739471197128296000000000f, 1.2769459486007690000000000f, + 1.2799140214920044000000000f, 1.2828512191772461000000000f, 1.2857576608657837000000000f, 1.2886329889297485000000000f, 1.2914773225784302000000000f, 1.2942904233932495000000000f, 1.2970724105834961000000000f, 1.2998231649398804000000000f, 1.3025425672531128000000000f, 1.3052306175231934000000000f, + 1.3078873157501221000000000f, 1.3105123043060303000000000f, 1.3131058216094971000000000f, 1.3156676292419434000000000f, 1.3181978464126587000000000f, 1.3206962347030640000000000f, 1.3231627941131592000000000f, 1.3255974054336548000000000f, 1.3280001878738403000000000f, 1.3303710222244263000000000f, + 1.3327096700668335000000000f, 1.3350162506103516000000000f, 1.3372906446456909000000000f, 1.3395328521728516000000000f, 1.3417427539825439000000000f, 1.3439202308654785000000000f, 1.3460655212402344000000000f, 1.3481782674789429000000000f, 1.3502584695816040000000000f, 1.3523062467575073000000000f, + 1.3543214797973633000000000f, 1.3563039302825928000000000f, 1.3582537174224854000000000f, 1.3601709604263306000000000f, 1.3620551824569702000000000f, 1.3639067411422729000000000f, 1.3657253980636597000000000f, 1.3675111532211304000000000f, 1.3692638874053955000000000f, 1.3709838390350342000000000f, + 1.3726705312728882000000000f, 1.3743242025375366000000000f, 1.3759448528289795000000000f, 1.3775322437286377000000000f, 1.3790863752365112000000000f, 1.3806074857711792000000000f, 1.3820952177047729000000000f, 1.3835495710372925000000000f, 1.3849706649780273000000000f, 1.3863584995269775000000000f, + 1.3877127170562744000000000f, 1.3890335559844971000000000f, 1.3903210163116455000000000f, 1.3915749788284302000000000f, 1.3927953243255615000000000f, 1.3939821720123291000000000f, 1.3951354026794434000000000f, 1.3962548971176147000000000f, 1.3973408937454224000000000f, 1.3983932733535767000000000f, + 1.3994117975234985000000000f, 1.4003967046737671000000000f, 1.4013478755950928000000000f, 1.4022653102874756000000000f, 1.4031487703323364000000000f, 1.4039986133575439000000000f, 1.4048146009445190000000000f, 1.4055966138839722000000000f, 1.4063447713851929000000000f, 1.4070591926574707000000000f, + 1.4077396392822266000000000f, 1.4083861112594604000000000f, 1.4089987277984619000000000f, 1.4095773696899414000000000f, 1.4101220369338989000000000f, 1.4106327295303345000000000f, 1.4111093282699585000000000f, 1.4115520715713501000000000f, 1.4119608402252197000000000f, 1.4123353958129883000000000f, + 1.4126759767532349000000000f, 1.4129825830459595000000000f, 1.4132552146911621000000000f, 1.4134936332702637000000000f, 1.4136980772018433000000000f, 1.4138684272766113000000000f, 1.4140048027038574000000000f, 1.4141069650650024000000000f, 1.4141751527786255000000000f, 1.4142091274261475000000000f, + 1.4142091274261475000000000f, 1.4141751527786255000000000f, 1.4141069650650024000000000f, 1.4140048027038574000000000f, 1.4138684272766113000000000f, 1.4136980772018433000000000f, 1.4134936332702637000000000f, 1.4132550954818726000000000f, 1.4129825830459595000000000f, 1.4126759767532349000000000f, + 1.4123353958129883000000000f, 1.4119607210159302000000000f, 1.4115520715713501000000000f, 1.4111093282699585000000000f, 1.4106327295303345000000000f, 1.4101220369338989000000000f, 1.4095773696899414000000000f, 1.4089987277984619000000000f, 1.4083861112594604000000000f, 1.4077396392822266000000000f, + 1.4070591926574707000000000f, 1.4063447713851929000000000f, 1.4055966138839722000000000f, 1.4048146009445190000000000f, 1.4039986133575439000000000f, 1.4031487703323364000000000f, 1.4022653102874756000000000f, 1.4013477563858032000000000f, 1.4003967046737671000000000f, 1.3994117975234985000000000f, + 1.3983932733535767000000000f, 1.3973408937454224000000000f, 1.3962548971176147000000000f, 1.3951354026794434000000000f, 1.3939821720123291000000000f, 1.3927953243255615000000000f, 1.3915748596191406000000000f, 1.3903210163116455000000000f, 1.3890335559844971000000000f, 1.3877127170562744000000000f, + 1.3863583803176880000000000f, 1.3849706649780273000000000f, 1.3835495710372925000000000f, 1.3820950984954834000000000f, 1.3806074857711792000000000f, 1.3790863752365112000000000f, 1.3775322437286377000000000f, 1.3759448528289795000000000f, 1.3743242025375366000000000f, 1.3726705312728882000000000f, + 1.3709837198257446000000000f, 1.3692638874053955000000000f, 1.3675111532211304000000000f, 1.3657253980636597000000000f, 1.3639067411422729000000000f, 1.3620551824569702000000000f, 1.3601708412170410000000000f, 1.3582537174224854000000000f, 1.3563039302825928000000000f, 1.3543213605880737000000000f, + 1.3523062467575073000000000f, 1.3502584695816040000000000f, 1.3481782674789429000000000f, 1.3460655212402344000000000f, 1.3439202308654785000000000f, 1.3417427539825439000000000f, 1.3395328521728516000000000f, 1.3372905254364014000000000f, 1.3350161314010620000000000f, 1.3327096700668335000000000f, + 1.3303709030151367000000000f, 1.3280001878738403000000000f, 1.3255974054336548000000000f, 1.3231626749038696000000000f, 1.3206962347030640000000000f, 1.3181978464126587000000000f, 1.3156676292419434000000000f, 1.3131058216094971000000000f, 1.3105123043060303000000000f, 1.3078871965408325000000000f, + 1.3052306175231934000000000f, 1.3025425672531128000000000f, 1.2998231649398804000000000f, 1.2970724105834961000000000f, 1.2942904233932495000000000f, 1.2914772033691406000000000f, 1.2886328697204590000000000f, 1.2857575416564941000000000f, 1.2828512191772461000000000f, 1.2799140214920044000000000f, + 1.2769459486007690000000000f, 1.2739471197128296000000000f, 1.2709175348281860000000000f, 1.2678573131561279000000000f, 1.2647665739059448000000000f, 1.2616454362869263000000000f, 1.2584937810897827000000000f, 1.2553118467330933000000000f, 1.2520996332168579000000000f, 1.2488572597503662000000000f, + 1.2455849647521973000000000f, 1.2422825098037720000000000f, 1.2389501333236694000000000f, 1.2355878353118896000000000f, 1.2321958541870117000000000f, 1.2287741899490356000000000f, 1.2253228425979614000000000f, 1.2218420505523682000000000f, 1.2183316946029663000000000f, 1.2147921323776245000000000f, + 1.2112232446670532000000000f, 1.2076251506805420000000000f, 1.2039978504180908000000000f, 1.2003417015075684000000000f, 1.1966565847396851000000000f, 1.1929427385330200000000000f, 1.1891999244689941000000000f, 1.1854286193847656000000000f, 1.1816287040710449000000000f, 1.1778002977371216000000000f, + 1.1739435195922852000000000f, 1.1700584888458252000000000f, 1.1661452054977417000000000f, 1.1622039079666138000000000f, 1.1582344770431519000000000f, 1.1542372703552246000000000f, 1.1502121686935425000000000f, 1.1461594104766846000000000f, 1.1420789957046509000000000f, 1.1379710435867310000000000f, + 1.1338357925415039000000000f, 1.1296731233596802000000000f, 1.1254831552505493000000000f, 1.1212662458419800000000000f, 1.1170221567153931000000000f, 1.1127512454986572000000000f, 1.1084535121917725000000000f, 1.1041289567947388000000000f, 1.0997780561447144000000000f, 1.0954004526138306000000000f, + 1.0909965038299561000000000f, 1.0865662097930908000000000f, 1.0821098089218140000000000f, 1.0776273012161255000000000f, 1.0731188058853149000000000f, 1.0685844421386719000000000f, 1.0640244483947754000000000f, 1.0594387054443359000000000f, 1.0548274517059326000000000f, 1.0501908063888550000000000f, + 1.0455288887023926000000000f, 1.0408416986465454000000000f, 1.0361294746398926000000000f, 1.0313922166824341000000000f, 1.0266302824020386000000000f, 1.0218434333801270000000000f, 1.0170320272445679000000000f, 1.0121960639953613000000000f, 1.0073357820510864000000000f, 1.0024513006210327000000000f, + 0.9975425004959106400000000f, 0.9926097393035888700000000f, 0.9876530170440673800000000f, 0.9826725125312805200000000f, 0.9776684045791626000000000f, 0.9726406335830688500000000f, 0.9675894975662231400000000f, 0.9625149965286254900000000f, 0.9574173688888549800000000f, 0.9522966146469116200000000f, + 0.9471529126167297400000000f, 0.9419864416122436500000000f, 0.9367972612380981400000000f, 0.9315854907035827600000000f, 0.9263512492179870600000000f, 0.9210947155952453600000000f, 0.9158159494400024400000000f, 0.9105151891708374000000000f, 0.9051924347877502400000000f, 0.8998478651046752900000000f, + 0.8944816589355468800000000f, 0.8890938758850097700000000f, 0.8836846351623535200000000f, 0.8782541155815124500000000f, 0.8728024363517761200000000f, 0.8673297166824340800000000f, 0.8618361353874206500000000f, 0.8563218116760253900000000f, 0.8507867455482482900000000f, 0.8452312946319580100000000f, + 0.8396554589271545400000000f, 0.8340593576431274400000000f, 0.8284431099891662600000000f, 0.8228070139884948700000000f, 0.8171509504318237300000000f, 0.8114752769470214800000000f, 0.8057801127433776900000000f, 0.8000654578208923300000000f, 0.7943315505981445300000000f, 0.7885785102844238300000000f, + 0.7828064560890197800000000f, 0.7770155668258667000000000f, 0.7712058424949646000000000f, 0.7653776407241821300000000f, 0.7595309019088745100000000f, 0.7536660432815551800000000f, 0.7477828264236450200000000f, 0.7418816685676574700000000f, 0.7359626293182373000000000f, 0.7300259470939636200000000f, + 0.7240716218948364300000000f, 0.7180998325347900400000000f, 0.7121106386184692400000000f, 0.7061043977737426800000000f, 0.7000811696052551300000000f, 0.6940410137176513700000000f, 0.6879841089248657200000000f, 0.6819106936454772900000000f, 0.6758208274841308600000000f, 0.6697146296501159700000000f, + 0.6635923385620117200000000f, 0.6574540734291076700000000f, 0.6512999534606933600000000f, 0.6451301574707031300000000f, 0.6389448046684265100000000f, 0.6327440142631530800000000f, 0.6265279650688171400000000f, 0.6202968955039978000000000f, 0.6140508651733398400000000f, 0.6077899932861328100000000f, + 0.6015145182609558100000000f, 0.5952244997024536100000000f, 0.5889201760292053200000000f, 0.5826016664505004900000000f, 0.5762690901756286600000000f, 0.5699226856231689500000000f, 0.5635625123977661100000000f, 0.5571887493133544900000000f, 0.5508015751838684100000000f, 0.5444011092185974100000000f, + 0.5379875302314758300000000f, 0.5315610170364379900000000f, 0.5251216888427734400000000f, 0.5186696648597717300000000f, 0.5122051835060119600000000f, 0.5057283639907836900000000f, 0.4992393255233764600000000f, 0.4927382767200470000000000f, 0.4862253665924072300000000f, 0.4797007441520690900000000f, + 0.4731644988059997600000000f, 0.4666169285774231000000000f, 0.4600581228733062700000000f, 0.4534881711006164600000000f, 0.4469073116779327400000000f, 0.4403156936168670700000000f, 0.4337134659290313700000000f, 0.4271008074283599900000000f, 0.4204778075218200700000000f, 0.4138446748256683300000000f, + 0.4072016179561615000000000f, 0.4005487561225891100000000f, 0.3938861787319183300000000f, 0.3872141540050506600000000f, 0.3805327713489532500000000f, 0.3738422691822052000000000f, 0.3671427369117736800000000f, 0.3604343533515930200000000f, 0.3537172675132751500000000f, 0.3469916582107543900000000f, + 0.3402577340602874800000000f, 0.3335155844688415500000000f, 0.3267653882503509500000000f, 0.3200073242187500000000000f, 0.3132415413856506300000000f, 0.3064682185649871800000000f, 0.2996875047683715800000000f, 0.2928995788097381600000000f, 0.2861045897006988500000000f, 0.2793027162551879900000000f, + 0.2724941074848175000000000f, 0.2656789422035217300000000f, 0.2588573694229126000000000f, 0.2520295381546020500000000f, 0.2451956570148468000000000f, 0.2383558601140976000000000f, 0.2315103262662887600000000f, 0.2246592044830322300000000f, 0.2178026735782623300000000f, 0.2109408974647522000000000f, + 0.2040740400552749600000000f, 0.1972022652626037600000000f, 0.1903257369995117200000000f, 0.1834446042776107800000000f, 0.1765590757131576500000000f, 0.1696692854166030900000000f, 0.1627754122018814100000000f, 0.1558776050806045500000000f, 0.1489760577678680400000000f, 0.1420709043741226200000000f, + 0.1351623386144638100000000f, 0.1282505095005035400000000f, 0.1213355958461761500000000f, 0.1144177615642547600000000f, 0.1074971556663513200000000f, 0.1005739644169807400000000f, 0.0936483591794967650000000f, 0.0867204889655113220000000f, 0.0797905325889587400000000f, 0.0728586539626121520000000f, + 0.0659250169992446900000000f, 0.0589897930622100830000000f, 0.0520531460642814640000000f, 0.0451152473688125610000000f, 0.0381762608885765080000000f, 0.0312363542616367340000000f, 0.0242956969887018200000000f, 0.0173544511198997500000000f, 0.0104127889499068260000000f, 0.0034708750899881124000000f +}; + +/* Synthesis windows for overlap-add */ +/* for (j=0; jfftlen; j++) hs->olapWinSyn[j] = (float)sin(EVS_PI*((float)j+0.5f)/(float)(hs->fftlen); */ +const float olapWinSyn256[256] = +{ + 0.0061358846f, + 0.0184067299f, + 0.0306748032f, + 0.0429382569f, + 0.0551952443f, + 0.0674439196f, + 0.0796824380f, + 0.0919089565f, + 0.1041216339f, + 0.1163186309f, + 0.1284981108f, + 0.1406582393f, + 0.1527971853f, + 0.1649131205f, + 0.1770042204f, + 0.1890686641f, + 0.2011046348f, + 0.2131103199f, + 0.2250839114f, + 0.2370236060f, + 0.2489276057f, + 0.2607941179f, + 0.2726213554f, + 0.2844075372f, + 0.2961508882f, + 0.3078496400f, + 0.3195020308f, + 0.3311063058f, + 0.3426607173f, + 0.3541635254f, + 0.3656129978f, + 0.3770074102f, + 0.3883450467f, + 0.3996241998f, + 0.4108431711f, + 0.4220002708f, + 0.4330938189f, + 0.4441221446f, + 0.4550835871f, + 0.4659764958f, + 0.4767992301f, + 0.4875501601f, + 0.4982276670f, + 0.5088301425f, + 0.5193559902f, + 0.5298036247f, + 0.5401714727f, + 0.5504579729f, + 0.5606615762f, + 0.5707807459f, + 0.5808139581f, + 0.5907597019f, + 0.6006164794f, + 0.6103828063f, + 0.6200572118f, + 0.6296382389f, + 0.6391244449f, + 0.6485144010f, + 0.6578066933f, + 0.6669999223f, + 0.6760927036f, + 0.6850836678f, + 0.6939714609f, + 0.7027547445f, + 0.7114321957f, + 0.7200025080f, + 0.7284643904f, + 0.7368165689f, + 0.7450577854f, + 0.7531867990f, + 0.7612023855f, + 0.7691033376f, + 0.7768884657f, + 0.7845565972f, + 0.7921065773f, + 0.7995372691f, + 0.8068475535f, + 0.8140363297f, + 0.8211025150f, + 0.8280450453f, + 0.8348628750f, + 0.8415549774f, + 0.8481203448f, + 0.8545579884f, + 0.8608669386f, + 0.8670462455f, + 0.8730949784f, + 0.8790122264f, + 0.8847970984f, + 0.8904487232f, + 0.8959662498f, + 0.9013488470f, + 0.9065957045f, + 0.9117060320f, + 0.9166790599f, + 0.9215140393f, + 0.9262102421f, + 0.9307669611f, + 0.9351835099f, + 0.9394592236f, + 0.9435934582f, + 0.9475855910f, + 0.9514350210f, + 0.9551411683f, + 0.9587034749f, + 0.9621214043f, + 0.9653944417f, + 0.9685220943f, + 0.9715038910f, + 0.9743393828f, + 0.9770281427f, + 0.9795697657f, + 0.9819638691f, + 0.9842100924f, + 0.9863080972f, + 0.9882575677f, + 0.9900582103f, + 0.9917097537f, + 0.9932119492f, + 0.9945645707f, + 0.9957674145f, + 0.9968202993f, + 0.9977230666f, + 0.9984755806f, + 0.9990777278f, + 0.9995294175f, + 0.9998305818f, + 0.9999811753f, + 0.9999811753f, + 0.9998305818f, + 0.9995294175f, + 0.9990777278f, + 0.9984755806f, + 0.9977230666f, + 0.9968202993f, + 0.9957674145f, + 0.9945645707f, + 0.9932119492f, + 0.9917097537f, + 0.9900582103f, + 0.9882575677f, + 0.9863080972f, + 0.9842100924f, + 0.9819638691f, + 0.9795697657f, + 0.9770281427f, + 0.9743393828f, + 0.9715038910f, + 0.9685220943f, + 0.9653944417f, + 0.9621214043f, + 0.9587034749f, + 0.9551411683f, + 0.9514350210f, + 0.9475855910f, + 0.9435934582f, + 0.9394592236f, + 0.9351835099f, + 0.9307669611f, + 0.9262102421f, + 0.9215140393f, + 0.9166790599f, + 0.9117060320f, + 0.9065957045f, + 0.9013488470f, + 0.8959662498f, + 0.8904487232f, + 0.8847970984f, + 0.8790122264f, + 0.8730949784f, + 0.8670462455f, + 0.8608669386f, + 0.8545579884f, + 0.8481203448f, + 0.8415549774f, + 0.8348628750f, + 0.8280450453f, + 0.8211025150f, + 0.8140363297f, + 0.8068475535f, + 0.7995372691f, + 0.7921065773f, + 0.7845565972f, + 0.7768884657f, + 0.7691033376f, + 0.7612023855f, + 0.7531867990f, + 0.7450577854f, + 0.7368165689f, + 0.7284643904f, + 0.7200025080f, + 0.7114321957f, + 0.7027547445f, + 0.6939714609f, + 0.6850836678f, + 0.6760927036f, + 0.6669999223f, + 0.6578066933f, + 0.6485144010f, + 0.6391244449f, + 0.6296382389f, + 0.6200572118f, + 0.6103828063f, + 0.6006164794f, + 0.5907597019f, + 0.5808139581f, + 0.5707807459f, + 0.5606615762f, + 0.5504579729f, + 0.5401714727f, + 0.5298036247f, + 0.5193559902f, + 0.5088301425f, + 0.4982276670f, + 0.4875501601f, + 0.4767992301f, + 0.4659764958f, + 0.4550835871f, + 0.4441221446f, + 0.4330938189f, + 0.4220002708f, + 0.4108431711f, + 0.3996241998f, + 0.3883450467f, + 0.3770074102f, + 0.3656129978f, + 0.3541635254f, + 0.3426607173f, + 0.3311063058f, + 0.3195020308f, + 0.3078496400f, + 0.2961508882f, + 0.2844075372f, + 0.2726213554f, + 0.2607941179f, + 0.2489276057f, + 0.2370236060f, + 0.2250839114f, + 0.2131103199f, + 0.2011046348f, + 0.1890686641f, + 0.1770042204f, + 0.1649131205f, + 0.1527971853f, + 0.1406582393f, + 0.1284981108f, + 0.1163186309f, + 0.1041216339f, + 0.0919089565f, + 0.0796824380f, + 0.0674439196f, + 0.0551952443f, + 0.0429382569f, + 0.0306748032f, + 0.0184067299f, + 0.0061358846f +}; +const float olapWinSyn320[320] = +{ + 0.0049087191000580788000000f, 0.0147256832569837570000000f, 0.0245412290096282960000000f, 0.0343544110655784610000000f, 0.0441642776131629940000000f, 0.0539698898792266850000000f, 0.0637703016400337220000000f, 0.0735645666718482970000000f, 0.0833517387509346010000000f, 0.0931308791041374210000000f, + 0.1029010415077209500000000f, 0.1126612871885299700000000f, 0.1224106773734092700000000f, 0.1321482658386230500000000f, 0.1418731212615966800000000f, 0.1515842974185943600000000f, 0.1612808704376220700000000f, 0.1709618866443634000000000f, 0.1806264370679855300000000f, 0.1902735829353332500000000f, + 0.1999023705720901500000000f, 0.2095119059085845900000000f, 0.2191012501716613800000000f, 0.2286694645881652800000000f, 0.2382156550884246800000000f, 0.2477388679981231700000000f, 0.2572382092475891100000000f, 0.2667127549648284900000000f, 0.2761616110801696800000000f, 0.2855838239192962600000000f, + 0.2949785292148590100000000f, 0.3043448030948638900000000f, 0.3136817514896392800000000f, 0.3229884505271911600000000f, 0.3322640359401702900000000f, 0.3415075838565826400000000f, 0.3507182002067565900000000f, 0.3598950505256652800000000f, 0.3690371811389923100000000f, 0.3781437575817108200000000f, + 0.3872138857841491700000000f, 0.3962467014789581300000000f, 0.4052413105964660600000000f, 0.4141968786716461200000000f, 0.4231125116348266600000000f, 0.4319873750209808300000000f, 0.4408206045627594000000000f, 0.4496113359928131100000000f, 0.4583587348461151100000000f, 0.4670619666576385500000000f, + 0.4757201671600341800000000f, 0.4843325316905975300000000f, 0.4928981959819793700000000f, 0.5014163851737976100000000f, 0.5098862051963806200000000f, 0.5183069109916687000000000f, 0.5266776680946350100000000f, 0.5349976420402526900000000f, 0.5432660579681396500000000f, 0.5514820814132690400000000f, + 0.5596449971199035600000000f, 0.5677539706230163600000000f, 0.5758082270622253400000000f, 0.5838069319725036600000000f, 0.5917494297027587900000000f, 0.5996348857879638700000000f, 0.6074625253677368200000000f, 0.6152316331863403300000000f, 0.6229414343833923300000000f, 0.6305911540985107400000000f, + 0.6381801366806030300000000f, 0.6457076072692871100000000f, 0.6531728506088256800000000f, 0.6605751514434814500000000f, 0.6679137349128723100000000f, 0.6751880049705505400000000f, 0.6823971867561340300000000f, 0.6895405650138855000000000f, 0.6966174840927124000000000f, 0.7036272883415222200000000f, + 0.7105692625045776400000000f, 0.7174427509307861300000000f, 0.7242470979690551800000000f, 0.7309816479682922400000000f, 0.7376457452774047900000000f, 0.7442387342453002900000000f, 0.7507599592208862300000000f, 0.7572088837623596200000000f, 0.7635847926139831500000000f, 0.7698870897293090800000000f, + 0.7761152386665344200000000f, 0.7822685241699218800000000f, 0.7883464694023132300000000f, 0.7943483591079711900000000f, 0.8002737760543823200000000f, 0.8061220049858093300000000f, 0.8118925094604492200000000f, 0.8175848126411438000000000f, 0.8231983184814453100000000f, 0.8287324905395507800000000f, + 0.8341867327690124500000000f, 0.8395606279373168900000000f, 0.8448535799980163600000000f, 0.8500651121139526400000000f, 0.8551946878433227500000000f, 0.8602418899536132800000000f, 0.8652061223983764600000000f, 0.8700870275497436500000000f, 0.8748840093612670900000000f, 0.8795967102050781300000000f, + 0.8842245936393737800000000f, 0.8887673020362854000000000f, 0.8932242989540100100000000f, 0.8975952267646789600000000f, 0.9018796682357788100000000f, 0.9060771465301513700000000f, 0.9101873040199279800000000f, 0.9142097830772399900000000f, 0.9181441068649292000000000f, 0.9219899177551269500000000f, + 0.9257469177246093800000000f, 0.9294146299362182600000000f, 0.9329928159713745100000000f, 0.9364810585975647000000000f, 0.9398790597915649400000000f, 0.9431864023208618200000000f, 0.9464029073715210000000000f, 0.9495282173156738300000000f, 0.9525619745254516600000000f, 0.9555038809776306200000000f, + 0.9583537578582763700000000f, 0.9611112475395202600000000f, 0.9637760519981384300000000f, 0.9663480520248413100000000f, 0.9688268303871154800000000f, 0.9712122678756713900000000f, 0.9735041260719299300000000f, 0.9757021665573120100000000f, 0.9778060913085937500000000f, 0.9798158407211303700000000f, + 0.9817311167716980000000000f, 0.9835518002510070800000000f, 0.9852776527404785200000000f, 0.9869085550308227500000000f, 0.9884443283081054700000000f, 0.9898848533630371100000000f, 0.9912299513816833500000000f, 0.9924795627593994100000000f, 0.9936334490776062000000000f, 0.9946916103363037100000000f, + 0.9956538677215576200000000f, 0.9965202212333679200000000f, 0.9972904324531555200000000f, 0.9979646205902099600000000f, 0.9985425472259521500000000f, 0.9990242719650268600000000f, 0.9994097352027893100000000f, 0.9996988177299499500000000f, 0.9998915791511535600000000f, 0.9999879598617553700000000f, + 0.9999879598617553700000000f, 0.9998915791511535600000000f, 0.9996988177299499500000000f, 0.9994097352027893100000000f, 0.9990242719650268600000000f, 0.9985425472259521500000000f, 0.9979646205902099600000000f, 0.9972904324531555200000000f, 0.9965201616287231400000000f, 0.9956538677215576200000000f, + 0.9946916103363037100000000f, 0.9936334490776062000000000f, 0.9924795031547546400000000f, 0.9912299513816833500000000f, 0.9898848533630371100000000f, 0.9884443283081054700000000f, 0.9869085550308227500000000f, 0.9852776527404785200000000f, 0.9835517406463623000000000f, 0.9817311167716980000000000f, + 0.9798157811164856000000000f, 0.9778060913085937500000000f, 0.9757021069526672400000000f, 0.9735041260719299300000000f, 0.9712122678756713900000000f, 0.9688268303871154800000000f, 0.9663479924201965300000000f, 0.9637760519981384300000000f, 0.9611111879348754900000000f, 0.9583536982536315900000000f, + 0.9555038809776306200000000f, 0.9525619149208068800000000f, 0.9495281577110290500000000f, 0.9464029073715210000000000f, 0.9431864023208618200000000f, 0.9398790001869201700000000f, 0.9364809989929199200000000f, 0.9329927563667297400000000f, 0.9294146299362182600000000f, 0.9257468581199646000000000f, + 0.9219899177551269500000000f, 0.9181440472602844200000000f, 0.9142097234725952100000000f, 0.9101873040199279800000000f, 0.9060771465301513700000000f, 0.9018796086311340300000000f, 0.8975952267646789600000000f, 0.8932242989540100100000000f, 0.8887672424316406300000000f, 0.8842245936393737800000000f, + 0.8795966506004333500000000f, 0.8748839497566223100000000f, 0.8700869679450988800000000f, 0.8652060627937316900000000f, 0.8602418303489685100000000f, 0.8551946878433227500000000f, 0.8500650525093078600000000f, 0.8448535203933715800000000f, 0.8395605683326721200000000f, 0.8341866731643676800000000f, + 0.8287324309349060100000000f, 0.8231982588768005400000000f, 0.8175847530364990200000000f, 0.8118925094604492200000000f, 0.8061219453811645500000000f, 0.8002737164497375500000000f, 0.7943482995033264200000000f, 0.7883464097976684600000000f, 0.7822684645652771000000000f, 0.7761151790618896500000000f, + 0.7698870301246643100000000f, 0.7635847330093383800000000f, 0.7572088241577148400000000f, 0.7507598996162414600000000f, 0.7442386746406555200000000f, 0.7376456856727600100000000f, 0.7309815883636474600000000f, 0.7242470383644104000000000f, 0.7174426913261413600000000f, 0.7105692028999328600000000f, + 0.7036272287368774400000000f, 0.6966174244880676300000000f, 0.6895405054092407200000000f, 0.6823971271514892600000000f, 0.6751879453659057600000000f, 0.6679136753082275400000000f, 0.6605750918388366700000000f, 0.6531727910041809100000000f, 0.6457075476646423300000000f, 0.6381800770759582500000000f, + 0.6305910944938659700000000f, 0.6229413151741027800000000f, 0.6152315139770507800000000f, 0.6074624657630920400000000f, 0.5996347665786743200000000f, 0.5917493700981140100000000f, 0.5838068723678588900000000f, 0.5758081078529357900000000f, 0.5677539110183715800000000f, 0.5596449375152587900000000f, + 0.5514820218086242700000000f, 0.5432659983634948700000000f, 0.5349975824356079100000000f, 0.5266776084899902300000000f, 0.5183068513870239300000000f, 0.5098861455917358400000000f, 0.5014163255691528300000000f, 0.4928981363773345900000000f, 0.4843324422836303700000000f, 0.4757201075553894000000000f, + 0.4670618772506713900000000f, 0.4583586752414703400000000f, 0.4496112763881683300000000f, 0.4408205151557922400000000f, 0.4319873154163360600000000f, 0.4231124520301818800000000f, 0.4141968190670013400000000f, 0.4052412509918212900000000f, 0.3962466120719909700000000f, 0.3872138261795043900000000f, + 0.3781436979770660400000000f, 0.3690371215343475300000000f, 0.3598949611186981200000000f, 0.3507181406021118200000000f, 0.3415074944496154800000000f, 0.3322639465332031300000000f, 0.3229883611202240000000000f, 0.3136816620826721200000000f, 0.3043447136878967300000000f, 0.2949784696102142300000000f, + 0.2855837643146514900000000f, 0.2761615216732025100000000f, 0.2667126953601837200000000f, 0.2572381198406219500000000f, 0.2477387785911560100000000f, 0.2382155656814575200000000f, 0.2286693751811981200000000f, 0.2191011607646942100000000f, 0.2095118165016174300000000f, 0.1999022960662841800000000f, + 0.1902734935283660900000000f, 0.1806263476610183700000000f, 0.1709618121385574300000000f, 0.1612807810306549100000000f, 0.1515842080116272000000000f, 0.1418730318546295200000000f, 0.1321481764316558800000000f, 0.1224105954170227100000000f, 0.1126612052321434000000000f, 0.1029009595513343800000000f, + 0.0931307896971702580000000f, 0.0833516493439674380000000f, 0.0735644772648811340000000f, 0.0637702122330665590000000f, 0.0539698041975498200000000f, 0.0441641919314861300000000f, 0.0343543216586112980000000f, 0.0245411414653062820000000f, 0.0147255966439843180000000f, 0.0049086315557360649000000f +}; + + +/*-------------------------------------------------------------------* + * AMR-WB ISF codebook - common 1st stage for 46bit and 36bit codebooks, + * 2 splits + * + * codebook vector dimension number of vectors + * ~~~~~~~~ ~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~ + * 1_1 9 256 + * 1_2 7 256 + *-------------------------------------------------------------------*/ + +/*-------------------------------------------------------------------* + * 1nd stage, 1st split: ISF0 to ISF8 + *-------------------------------------------------------------------*/ + +const float dico1_isf[] = +{ + 226.1477f, 422.2338f, 404.4563f, 152.3442f, 1.2553f, -102.5648f, -77.5073f, -32.1403f, 14.9134f, + 6.9890f, -26.5711f, -4.8001f, 122.2654f, 297.4533f, 158.0168f, 97.1963f, 43.4786f, -29.4927f, + 289.1461f, 493.4574f, 504.5048f, 393.1421f, 389.3840f, 397.8990f, 397.4072f, 381.0959f, 360.5083f, + -35.6482f, 323.0566f, 370.2882f, 252.9499f, 239.6172f, 209.0563f, 203.9713f, 191.4865f, 164.6219f, + 16.1026f, -17.1264f, -109.6817f, -184.2085f, 254.5133f, 208.7087f, 75.3774f, 52.8718f, -35.2364f, + 15.8336f, -47.0775f, -139.1713f, -23.5561f, 259.0049f, 120.0214f, 23.8825f, -18.5948f, -134.3813f, + 217.4017f, 369.5988f, 409.6801f, 338.5433f, 330.4056f, 386.7012f, 434.5276f, 492.7760f, 484.6164f, + -46.1429f, -79.6218f, 128.1106f, 199.9543f, 339.7710f, 309.8338f, 238.4430f, 156.8895f, 72.7742f, + 61.1308f, 114.6106f, 28.7939f, -131.9070f, -185.5015f, -350.3943f, -232.0556f, -62.9803f, -194.0513f, + 88.2757f, 51.2294f, -53.9555f, 120.0698f, 65.9863f, -105.8813f, -64.0929f, -151.0651f, -243.7652f, + 24.1201f, -12.6302f, -23.7808f, -98.2577f, -211.1396f, -323.5447f, -401.0499f, -204.4768f, -258.4671f, + 39.7202f, -23.9607f, 55.2442f, 43.6804f, -105.4100f, -97.8749f, -211.3002f, 9.7097f, -58.7138f, + 2.1766f, -51.7480f, -138.9340f, -268.1601f, -37.5098f, -125.8675f, -203.7929f, -12.2603f, -127.2472f, + -14.0622f, -81.7822f, -203.4806f, -89.5766f, 119.8931f, -51.7010f, -2.1055f, -38.5536f, -149.8808f, + 23.6196f, -19.7370f, -92.7527f, -260.9933f, -380.1402f, -158.8319f, -276.5396f, -29.3644f, -67.0346f, + 10.0869f, -54.0238f, -104.0772f, 43.4993f, -118.0066f, 16.7674f, -108.4172f, -138.9907f, -140.3299f, + 222.5364f, 321.1411f, 193.8368f, -60.0340f, -121.7460f, -35.9078f, 53.6514f, 109.0639f, 145.0366f, + -57.1173f, 143.6362f, 159.6491f, 26.6189f, 2.3305f, 30.0608f, 65.3329f, 78.8683f, 63.4622f, + 247.1436f, 350.7171f, 389.0685f, 295.2953f, 258.6614f, 266.7955f, 305.9202f, 355.1905f, 389.1698f, + -40.0882f, 114.6876f, 237.0104f, 161.9769f, 188.5636f, 180.3751f, 187.4189f, 168.3521f, 159.5175f, + -46.7654f, -132.1011f, -238.9261f, -204.8685f, 228.1911f, 129.1599f, 36.0960f, 169.1651f, 107.7902f, + -69.5087f, -114.5055f, -60.0494f, -15.9078f, 105.1520f, 39.1060f, -3.6140f, 83.1345f, 62.4498f, + 324.4036f, 287.6214f, 108.7328f, 320.4871f, 489.7306f, 267.9902f, 278.2168f, 405.7287f, 184.7344f, + -85.2571f, -118.8197f, 180.9905f, 177.4239f, 154.8864f, 106.5995f, 78.7528f, 111.5907f, 106.4840f, + -90.5891f, 2.5823f, 2.5231f, -151.4854f, -184.4761f, -166.9757f, -147.6148f, -65.2055f, -39.1239f, + -114.9974f, -71.3698f, 52.3087f, -18.1814f, 39.4264f, -34.2483f, -32.8691f, -45.8165f, -1.2029f, + 22.1063f, 6.7469f, -79.0146f, -247.7831f, -386.2835f, -437.2287f, -208.2931f, 68.6375f, -14.1447f, + 46.7840f, -11.0692f, 9.1612f, 43.4278f, -124.5574f, 124.1172f, -8.5368f, -30.1898f, 103.7909f, + -105.9007f, -181.3862f, -169.7189f, -257.0920f, -250.0032f, -150.2815f, -150.4918f, -38.5650f, -26.7658f, + -77.3138f, -101.1008f, -103.9903f, -17.1337f, -15.2577f, -54.2134f, -53.5373f, 66.9219f, 25.6872f, + 3.6265f, -56.7222f, -147.2143f, -330.5455f, -390.5518f, -43.3139f, -126.9112f, 133.5488f, 52.7399f, + -31.5816f, -111.6706f, -148.4743f, 75.1588f, -22.0969f, 119.9764f, 29.6891f, -9.5309f, -54.7378f, + 264.5383f, 274.1302f, 96.5690f, 21.7008f, 97.2691f, 55.1255f, -40.9705f, -92.2272f, -38.6482f, + 13.8969f, -15.1538f, -27.1357f, 135.8413f, 77.4989f, -36.1739f, 125.8114f, 35.5744f, -28.2436f, + 196.2991f, 345.8166f, 588.9347f, 510.5197f, 500.8432f, 457.6244f, 436.9384f, 472.1788f, 414.4815f, + 162.4519f, 280.7038f, 386.4482f, 479.3623f, 390.8287f, 411.1292f, 372.5701f, 289.3485f, 407.8594f, + -49.5343f, -147.0080f, -256.8338f, 54.1618f, 243.5530f, 87.1110f, 195.7264f, 119.5070f, 85.9479f, + -43.9641f, -150.1866f, -310.9041f, 196.7455f, 171.2780f, 33.0834f, 83.3645f, -32.4579f, -75.7126f, + 228.4330f, 442.3277f, 481.6548f, 426.3000f, 487.1132f, 559.8019f, 590.4699f, 565.5949f, 513.3911f, + -68.0544f, -164.7799f, 2.8141f, 451.2739f, 425.3554f, 461.7245f, 391.6532f, 369.1004f, 314.9413f, + 3.2743f, -49.3561f, -123.9568f, -40.1754f, -137.2377f, -271.6588f, -38.4305f, -104.5226f, -209.8071f, + 12.8092f, -40.2922f, -113.2953f, 65.4057f, -15.2443f, -159.0118f, 17.0998f, -81.3044f, -146.3446f, + 40.4305f, -8.9102f, -24.9719f, -113.7701f, -248.7160f, -332.5068f, -423.4328f, -23.8073f, -43.9266f, + -29.4866f, -119.6504f, -169.5775f, 85.2585f, -57.7724f, -138.3062f, -265.4940f, -52.0935f, -84.4635f, + -47.3285f, -147.4516f, -280.5169f, -38.0164f, -50.7237f, -141.1316f, -60.9737f, -147.8608f, -233.9212f, + -22.0146f, -99.1479f, -228.8716f, 91.6618f, 61.1343f, -83.5247f, 4.2834f, -101.7035f, -58.0283f, + -48.6094f, -104.2664f, -155.2664f, -226.4858f, -231.7223f, -205.7180f, -314.6280f, -150.3995f, 135.1819f, + -75.2552f, -171.9896f, -276.5969f, -137.0060f, -55.2086f, -99.5797f, -195.1097f, -57.2647f, -72.3255f, + 174.9245f, 258.0028f, 192.8297f, 81.3562f, 198.8450f, 180.2081f, 132.0824f, 113.5126f, 58.1412f, + -87.2559f, 34.2946f, 130.7081f, 62.1078f, 82.7816f, 74.4854f, 111.6818f, 120.3099f, 80.1334f, + -11.9671f, 183.3834f, 313.7754f, 257.2813f, 241.7612f, 256.9710f, 329.4492f, 385.5374f, 434.7875f, + -66.8195f, -94.6890f, 200.6887f, 141.3063f, 115.2635f, 204.7280f, 215.7973f, 270.9673f, 228.4647f, + -24.9070f, -120.1441f, -175.1481f, -8.0896f, 110.9215f, 307.0280f, 174.2457f, 112.7169f, 35.9639f, + -85.1717f, -152.2496f, -2.5803f, 66.0904f, 80.5138f, 128.8919f, 137.5303f, 159.4245f, 139.7766f, + -14.1396f, 274.4125f, 374.6268f, 335.3957f, 336.4666f, 435.5791f, 495.5083f, 529.9642f, 509.9389f, + -51.7794f, -133.3125f, -25.4473f, 264.8054f, 162.9175f, 171.9332f, 189.6735f, 202.1561f, 304.5228f, + 12.7820f, -17.2653f, -74.5083f, -134.5510f, -180.1133f, -294.9349f, -78.6120f, 84.8225f, -12.0772f, + -137.7282f, -213.7303f, -17.3509f, 48.2225f, -23.9524f, -26.4293f, -30.7054f, 11.1575f, 23.4229f, + 28.3886f, -22.3550f, -158.4269f, -299.3692f, -485.7126f, -469.8884f, 93.8213f, 156.3351f, 64.4156f, + -28.7029f, -110.1881f, -234.8032f, -83.3735f, -66.7772f, -146.3531f, 129.8178f, 13.7979f, -40.1959f, + -11.2220f, -81.0542f, -215.8795f, -186.0052f, -249.1487f, -354.7951f, 67.0249f, -8.7287f, -52.7080f, + -75.1895f, -93.5102f, -63.8842f, -40.2971f, -43.3423f, -18.3122f, 59.9384f, 48.9469f, 42.9198f, + -0.3036f, -79.3921f, -222.4614f, -402.4193f, -556.4007f, -208.9512f, 60.4822f, 0.2592f, 57.2596f, + -130.2469f, -254.9911f, -337.7263f, -76.9102f, -61.5888f, -8.3782f, -17.2822f, 37.1637f, 42.0772f, + 151.9460f, 229.6417f, 191.5279f, 12.9809f, -92.7110f, -204.7091f, -245.2630f, -53.2589f, -101.3680f, + 15.8084f, -69.0148f, -180.2926f, 176.9411f, 336.6405f, 148.3504f, 51.2260f, -50.6708f, -158.2893f, + 328.7315f, 655.2856f, 719.0299f, 605.1412f, 575.6907f, 490.5742f, 422.8277f, 353.4364f, 289.8675f, + 144.5240f, 474.8398f, 690.7612f, 638.0545f, 473.3627f, 248.6244f, 8.4810f, -128.9032f, 27.8837f, + -29.8052f, -109.6768f, -289.4402f, -289.9344f, 350.9098f, 241.8981f, 108.0220f, 27.7568f, -86.8368f, + -12.5998f, -103.5273f, -217.2510f, -9.8401f, 388.4400f, 266.5437f, 118.9818f, 49.1643f, -64.3603f, + 28.5445f, 288.4229f, 348.8730f, 378.0052f, 387.8595f, 690.6161f, 887.8799f, 718.7092f, 543.2699f, + -27.0127f, -136.3472f, -228.6534f, 91.4073f, 452.4637f, 352.8853f, 244.5759f, 199.3164f, 97.9452f, + -0.2574f, -38.8124f, -106.0784f, -81.9691f, -235.3859f, -136.9961f, -210.8024f, -316.9619f, -149.7671f, + -6.3268f, -89.9384f, -197.0412f, 160.1820f, 58.3899f, -80.1867f, -134.0614f, -254.4108f, -249.4793f, + 40.1439f, -3.4822f, -88.7857f, -80.2522f, -219.3521f, -305.1500f, -421.5967f, -471.9935f, -60.7522f, + 55.8529f, 24.5260f, -52.9174f, -26.1113f, -123.8744f, -235.0002f, -306.0707f, -450.7246f, -249.8812f, + -56.2297f, -152.7118f, -263.1169f, -243.0294f, -78.2260f, -99.3225f, -257.7953f, -369.9445f, -154.2971f, + -15.4570f, -97.8124f, -244.1879f, 10.4628f, 212.1971f, 36.6411f, -51.0200f, -150.9477f, -262.8206f, + -47.9169f, -145.0780f, -295.8412f, -176.3119f, -220.4176f, -239.8767f, -162.2583f, -277.5646f, -13.5098f, + -45.4312f, -120.7871f, -231.7391f, -104.6837f, 93.3399f, -13.0435f, -131.8873f, -253.9684f, -52.8010f, + 36.7261f, 97.8902f, 216.2452f, 22.2667f, -121.9688f, -165.2371f, -60.1795f, -22.1111f, 91.7368f, + -104.8126f, -27.6777f, 148.6412f, 44.3956f, -17.0786f, -34.0943f, 48.6552f, 67.5896f, 52.1341f, + 590.8627f, 669.3461f, 483.5975f, 208.4471f, 107.7190f, 123.1392f, 179.9797f, 179.2124f, 198.5541f, + -51.3512f, -7.3050f, 448.6575f, 261.8456f, 189.7417f, 139.0593f, 120.8041f, 144.0752f, 115.5179f, + -87.2434f, -195.6786f, -351.1762f, -282.1990f, -27.3961f, 2.1866f, 51.0065f, 120.9792f, 154.0704f, + -38.7878f, -118.5436f, -201.9035f, 97.1421f, 24.9785f, -20.8748f, 52.5830f, -4.3230f, 177.0334f, + -57.4864f, -155.8205f, -285.0674f, -156.5139f, 319.0307f, 288.4199f, 313.3522f, 292.7644f, 224.7193f, + -60.1766f, -170.1086f, -288.5482f, 312.6666f, 231.6275f, 142.7810f, 206.6260f, 124.0985f, 127.5073f, + -87.3474f, 17.7221f, -15.2086f, -151.2513f, -201.3116f, -202.2629f, -237.4979f, -150.1082f, -125.3288f, + -123.1549f, -147.2588f, 55.9560f, -39.6018f, -44.1818f, -147.1130f, -69.1241f, -56.1722f, -4.4924f, + 45.5201f, 15.5222f, -93.3382f, -254.1893f, -410.5618f, -226.8515f, -287.7839f, -386.6172f, -128.1340f, + 10.1233f, -19.6005f, -61.5127f, -8.8349f, -177.1218f, -110.5849f, -207.5041f, -213.2586f, 74.8075f, + -98.2741f, -195.7624f, -290.1091f, -230.1600f, -244.7515f, -194.7701f, -128.1076f, -46.1729f, -28.2903f, + -126.3800f, -193.1177f, -95.3231f, -119.6219f, -56.1586f, -69.0881f, -102.1922f, -52.5595f, -30.4027f, + -13.9604f, -91.5188f, -202.7529f, -375.3352f, -503.8488f, -122.5019f, -187.2047f, -144.9473f, -17.6464f, + -37.1158f, -113.9219f, -208.9531f, -3.1283f, -117.0010f, 43.6858f, -64.0984f, -108.2942f, 77.5131f, + -38.6401f, -49.9736f, 343.9084f, 326.3879f, 226.1680f, 136.9212f, 9.0736f, -37.1756f, -84.7974f, + -10.5004f, -100.6890f, 48.4106f, 394.7867f, 233.0419f, 165.9509f, 56.3291f, 2.7924f, -28.5845f, + 164.3221f, 505.0226f, 640.4844f, 633.9930f, 680.5828f, 631.7908f, 585.4574f, 501.5025f, 393.1295f, + -37.0300f, 293.6539f, 656.3401f, 612.9729f, 632.0821f, 560.9024f, 468.8401f, 382.9867f, 278.2211f, + -26.9959f, -117.0381f, -266.9459f, -169.9414f, 442.3678f, 351.1593f, 196.7216f, 129.6217f, 42.5401f, + -28.9160f, -126.1295f, -248.8180f, 219.9974f, 419.6462f, 237.5276f, 144.8018f, 41.0794f, -19.0438f, + -30.6524f, 324.5342f, 466.4269f, 433.6403f, 538.3355f, 578.5025f, 582.9940f, 533.2873f, 475.3817f, + -101.0867f, -47.3945f, 562.3863f, 521.2437f, 635.9947f, 581.9960f, 561.7294f, 477.7560f, 364.4759f, + -32.1078f, -119.5424f, -239.6324f, -86.9073f, -147.6602f, -263.4799f, -212.9377f, -261.9229f, -330.2635f, + 20.8260f, -48.5704f, -135.4246f, 164.8506f, 20.4817f, -48.8885f, -105.4348f, -206.6621f, 3.6375f, + 30.9311f, -34.7599f, -124.8998f, -258.7565f, -390.0532f, -468.4556f, -485.3543f, -264.1984f, -115.9895f, + -26.5921f, -106.6166f, -238.7686f, 53.4977f, -56.8913f, -155.1848f, -245.0791f, -329.9394f, -85.9503f, + -43.8040f, -135.2615f, -311.2635f, -322.8195f, 91.5184f, -51.5741f, -73.3097f, -108.7735f, -204.0501f, + -61.9589f, -158.0212f, -286.8211f, -163.7011f, 114.5577f, 29.0545f, -65.0919f, -65.1646f, 71.9506f, + -59.8760f, -170.6047f, -325.2270f, -421.8182f, -131.3054f, -184.2594f, -219.1312f, -132.9352f, -98.8301f, + -65.8626f, -165.1987f, -320.2537f, -353.1492f, -51.0331f, -7.3456f, -135.3074f, -235.8573f, 12.1485f, + 12.8460f, -11.9241f, 121.7405f, 24.2470f, -57.8971f, 19.1365f, -23.0243f, 220.3897f, 189.9156f, + -119.6102f, -129.9914f, 75.9549f, -17.3359f, 26.2798f, 28.0181f, 57.3185f, 79.8925f, 95.0199f, + -81.0524f, -19.0879f, 531.3251f, 384.0082f, 378.6000f, 387.1200f, 396.1896f, 433.4382f, 379.9696f, + -82.3204f, -67.1148f, 345.0646f, 244.9884f, 277.8043f, 263.1406f, 275.4622f, 311.7924f, 291.4141f, + -34.2889f, -127.1388f, -298.1820f, -380.4511f, 268.4245f, 354.6007f, 200.7670f, 149.3555f, 67.1469f, + -114.0830f, -239.0252f, -314.3921f, 24.6004f, 51.2722f, 105.4223f, 101.1157f, 137.3569f, 135.9245f, + -91.7432f, -32.7591f, 373.1560f, 319.3955f, 437.4347f, 503.4907f, 608.7997f, 578.2119f, 502.0230f, + -70.3367f, -179.9099f, -239.7652f, 256.5794f, 269.9891f, 291.1810f, 333.6932f, 305.8695f, 278.4421f, + -38.0671f, -120.8247f, -186.4547f, -239.7784f, -303.6527f, -286.7954f, -300.0361f, -205.3057f, -184.5087f, + -134.2125f, -185.9339f, -13.8119f, -65.8529f, 19.0133f, -30.1823f, -58.4970f, -93.5678f, -55.1841f, + -20.3990f, -104.7817f, -249.4716f, -358.9899f, -499.3363f, -434.6861f, -133.7299f, -130.1813f, -59.0671f, + -26.7201f, -94.4739f, -228.6340f, -28.5857f, -81.7289f, -186.7961f, -62.0135f, -167.5409f, 51.9732f, + -76.8652f, -194.8085f, -392.5224f, -495.1741f, -106.3757f, -87.6781f, -40.9442f, -25.9922f, 6.6919f, + -141.6526f, -241.2805f, -161.8672f, -45.4915f, -24.1067f, 7.6906f, 3.7741f, 45.2149f, 42.3436f, + -76.2028f, -185.3649f, -353.8127f, -492.3104f, -348.1328f, -172.4144f, -108.0814f, -55.5374f, -10.8210f, + -88.1331f, -202.9139f, -371.2243f, -273.3005f, -107.5773f, -103.9134f, -45.1607f, -40.9613f, 31.8985f, + 157.9412f, 199.7964f, 203.2689f, 127.6304f, 6.7547f, -75.7475f, -130.0489f, -209.2208f, -228.8015f, + -44.6527f, -50.6749f, 107.6295f, 92.4422f, 79.8121f, 133.5672f, 52.5620f, -6.2270f, -43.2877f, + 261.9115f, 472.0228f, 456.3473f, 335.7553f, 289.8814f, 234.7976f, 206.1187f, 157.4174f, 120.7698f, + 155.2229f, 242.6315f, 377.1642f, 293.6065f, 226.0318f, 155.2748f, 156.4116f, 128.6701f, 98.5061f, + 74.5256f, 70.1303f, -53.6869f, -182.3488f, 106.1648f, 41.5585f, -37.0232f, 6.5336f, -75.1722f, + -31.2252f, -113.3890f, -244.5892f, 75.8334f, 233.5228f, 76.5742f, 8.2886f, -109.6154f, 29.9907f, + 199.0678f, 337.3158f, 432.8418f, 315.2969f, 366.8018f, 352.4917f, 361.4405f, 280.1715f, 187.7336f, + 53.4911f, 143.3279f, 208.4704f, 298.2910f, 261.7387f, 149.2119f, 115.7060f, 59.9002f, 32.6898f, + 118.3519f, 194.3090f, 56.3174f, -33.3258f, -48.8783f, -210.5418f, -188.4141f, -181.0565f, -298.4099f, + 91.1937f, 135.5274f, 26.3852f, -57.5649f, 66.0117f, -82.2194f, -94.6889f, -88.3680f, -188.1230f, + 119.8292f, 164.8051f, 60.2985f, -68.4990f, -150.8028f, -282.2156f, -282.8785f, -353.0452f, -396.4856f, + 120.5806f, 120.4464f, 62.5068f, -23.5466f, -183.4260f, -164.0083f, -233.7240f, -309.0768f, -85.4341f, + 26.4925f, 47.3529f, -53.5415f, -218.9011f, -56.8672f, -174.1118f, -201.0902f, -193.1382f, -284.6390f, + 50.9597f, 20.8274f, -88.6445f, 17.8450f, 185.2710f, 12.4814f, -62.7698f, -74.9989f, -191.3486f, + 83.3881f, 63.9878f, -27.8680f, -181.7226f, -342.0545f, -62.8876f, -178.1327f, -229.1320f, -18.6240f, + 85.1419f, 45.8095f, 15.3667f, 69.0366f, -75.9137f, -34.4539f, -88.4330f, -163.4411f, 19.3370f, + 81.8880f, 213.5459f, 222.3313f, 109.1533f, 47.1884f, -17.2578f, -19.4486f, 3.7457f, -32.8905f, + 22.8266f, 54.6145f, 70.9314f, -2.0301f, 104.3592f, 45.7102f, 41.3375f, 82.5320f, 77.2795f, + 210.7176f, 326.3462f, 356.6618f, 280.9097f, 240.9705f, 212.4392f, 230.9905f, 220.8317f, 250.9306f, + 59.6089f, 218.2601f, 340.5622f, 179.8372f, 86.7106f, 42.1021f, 73.5578f, 70.2340f, 71.3620f, + 61.9071f, 46.6476f, 111.0709f, -59.8230f, -105.9862f, 89.4424f, 34.0065f, 42.7793f, -22.3657f, + -71.5290f, 31.9224f, 46.2106f, 8.2769f, 5.2717f, 15.6736f, 45.9446f, 74.5921f, 72.2933f, + 63.1228f, 347.0971f, 255.3817f, 42.2624f, -13.4026f, 95.4917f, 190.7911f, 219.1920f, 207.8866f, + 63.7817f, 21.7322f, 237.9311f, 133.1283f, 19.5484f, 128.6760f, 26.4302f, 103.7761f, 85.3130f, + 39.2312f, 80.2880f, 7.1932f, -118.9054f, -41.8213f, -170.3956f, -190.1681f, -25.3174f, -119.5246f, + -33.4058f, 60.1838f, 52.1765f, -11.5418f, -17.6690f, -28.5228f, -40.5342f, -31.3702f, -37.5340f, + 95.6257f, 128.8044f, 3.7503f, -171.8902f, -331.7014f, -422.7089f, 30.8156f, 15.6229f, -103.6316f, + 76.5623f, 145.2620f, 106.4321f, -70.8798f, -192.7731f, -152.0614f, 107.2952f, 31.2426f, -23.0299f, + 0.9016f, -4.6471f, -96.0447f, -197.1141f, -39.1036f, -170.4243f, 8.3031f, -73.0702f, -168.4342f, + -86.2673f, -18.7660f, 13.9540f, -105.8362f, -72.7468f, -57.3178f, -42.7630f, 10.3291f, 27.6536f, + 83.1109f, 54.8163f, 28.1776f, -137.0164f, -242.1605f, -32.9744f, -141.6118f, 26.8712f, 17.8517f, + 35.5325f, 65.1065f, -1.1122f, -37.2264f, -38.7638f, -41.0658f, -18.6295f, 44.3877f, 57.2718f, + 101.1713f, 97.2361f, 67.3819f, 236.9884f, 158.4350f, 20.2720f, 23.0851f, -73.7010f, -124.8067f, + 44.9800f, -33.1049f, -21.2276f, 224.2546f, 49.9567f, 88.2466f, -23.1899f, -98.6740f, 50.9732f, + -24.3959f, 403.6523f, 511.0127f, 404.3978f, 440.2577f, 428.9172f, 401.8223f, 375.5111f, 321.4924f, + 15.1345f, 142.1195f, 295.8327f, 367.1741f, 284.5674f, 257.7681f, 257.3533f, 227.7437f, 300.6506f, + -44.9562f, -131.9449f, -296.8129f, -184.1626f, 153.8183f, 14.5297f, 172.3343f, 69.5618f, 2.2208f, + -22.2475f, -119.2772f, -205.2499f, 310.9423f, 177.0844f, 73.5587f, -1.5010f, -44.3403f, 96.9000f, + 27.7742f, 173.5793f, 311.4776f, 285.5815f, 427.9854f, 452.0145f, 477.2097f, 401.7775f, 316.6574f, + 52.6696f, 140.2801f, 215.3995f, 166.1714f, 292.6204f, 318.2898f, 341.5682f, 274.8850f, 196.1860f, + 51.5561f, 96.4057f, -0.0610f, -80.6567f, -175.2689f, -292.8310f, -100.7723f, -200.9591f, -247.1591f, + 96.6859f, 97.0977f, 35.4401f, 47.1563f, -76.2811f, -194.8284f, -34.9894f, -110.1535f, -169.8929f, + 30.4654f, 7.6447f, -108.2569f, -243.2014f, -383.8708f, -478.0505f, -162.0353f, -178.7682f, -249.4727f, + 135.4580f, 198.9998f, 81.4247f, -69.9475f, -181.4226f, -284.4768f, -29.8270f, -92.7044f, -189.7940f, + -40.1188f, -133.9427f, -295.2091f, -278.5829f, -103.4496f, -237.8449f, -74.7856f, -155.3338f, -248.5054f, + -47.4470f, -149.6037f, -292.4242f, 221.6694f, 98.4280f, -14.0849f, -138.2963f, -163.0445f, -19.4243f, + 79.5896f, 39.1792f, -58.2936f, -253.9809f, -422.3516f, -18.3412f, -2.7302f, -102.9275f, 43.5500f, + -17.9005f, -70.1182f, -104.1536f, -126.4881f, -219.3935f, -153.8877f, -270.2488f, 155.3837f, 114.2388f, + 188.3484f, 261.8459f, 266.6991f, 243.5570f, 172.7795f, 64.3333f, 45.3547f, 14.1479f, -58.3812f, + 42.3610f, 96.6123f, 113.8369f, 96.5219f, 138.7232f, 47.5273f, 42.4855f, 87.4416f, 115.5724f, + -5.4013f, 368.9961f, 386.7844f, 312.8328f, 294.8554f, 318.4847f, 330.7657f, 356.5357f, 348.3268f, + 113.9440f, 136.1339f, 283.1776f, 188.4109f, 151.5282f, 128.5029f, 167.5631f, 242.2409f, 260.3565f, + -13.3113f, 76.9204f, 83.0527f, -49.6054f, 32.9182f, 193.1624f, 242.1413f, 224.6298f, 146.4784f, + 49.3300f, 80.8438f, 67.2940f, 65.3665f, 141.4567f, 78.9471f, 115.6802f, 154.3108f, 177.7814f, + -2.1684f, 97.5184f, 210.7061f, 182.4635f, 248.3353f, 312.9833f, 448.6478f, 502.5403f, 436.6044f, + 10.4934f, 93.6577f, 144.0456f, 109.2677f, 171.7553f, 160.5641f, 247.6292f, 348.4738f, 372.3836f, + 62.0393f, 66.4595f, -22.8432f, -154.2429f, -311.1715f, -269.7167f, 30.1724f, -82.4276f, -130.4250f, + -1.8658f, -10.8456f, -5.2486f, -28.7596f, -130.9176f, -235.6978f, 116.9998f, 34.2436f, -79.9885f, + 32.1393f, -12.8439f, -142.0784f, -272.6861f, -469.8031f, -450.3773f, 42.8701f, -56.9028f, -113.0164f, + 44.2438f, 0.5177f, -95.0709f, -229.7896f, -388.2228f, -193.8794f, 161.5550f, 62.3152f, 16.3412f, + -21.7573f, -96.5696f, -171.8374f, -270.5201f, -389.2275f, -187.1907f, 4.2880f, -69.4009f, -139.6222f, + -59.1336f, -137.9044f, -127.8821f, -82.4177f, -132.8951f, 55.2591f, 25.2046f, 165.8443f, 176.7896f, + 13.1713f, -65.9463f, -177.8707f, -363.8923f, -474.4700f, 53.7845f, 194.7626f, 99.8684f, 126.7437f, + 26.4565f, 54.2781f, -5.8084f, -213.5320f, -186.7453f, 6.5259f, 119.4530f, 196.2039f, 188.0246f, + -12.3442f, -52.3945f, 174.0135f, 50.5399f, -55.6784f, -95.2558f, -196.2955f, -198.2056f, -234.0973f, + 23.6446f, -54.5462f, -134.7219f, 193.6175f, 178.7128f, -0.9450f, 7.7510f, -88.8611f, -200.7396f, + 154.0881f, 689.2718f, 650.6971f, 522.8596f, 436.5025f, 314.9000f, 250.7824f, 187.1628f, 148.5410f, + 83.9959f, 202.8234f, 359.2843f, 411.3538f, 425.6817f, 308.8017f, 206.3666f, 113.2320f, 60.3929f, + -21.1689f, -91.1694f, -252.6742f, -235.0333f, 249.5398f, 114.6655f, -0.7796f, -65.2547f, -172.8182f, + -30.5567f, -123.2070f, -309.0227f, -44.0884f, 320.4634f, 157.6161f, 61.6828f, -45.3025f, -139.1032f, + 206.4974f, 723.0883f, 782.3015f, 479.5419f, 242.9557f, -15.8222f, -162.4184f, 134.4517f, 319.9661f, + -41.0232f, -148.1419f, -92.0839f, 478.0700f, 348.8458f, 292.6417f, 221.8808f, 139.1332f, 83.7320f, + -6.8324f, -77.6477f, -56.3444f, 19.3478f, -110.6184f, -96.5414f, -225.9007f, -330.6617f, -424.5623f, + 26.9337f, -4.4548f, -148.8763f, -80.3516f, 81.8311f, -110.8947f, -150.9911f, -162.4880f, -279.5481f, + 15.4135f, -1.8583f, -56.8319f, -146.1688f, -266.5346f, -355.1809f, -419.6793f, -456.7536f, -416.2208f, + 112.1756f, 88.2059f, 26.0259f, -86.2333f, -258.4741f, -66.9660f, -164.5662f, -250.9281f, -276.0475f, + -51.5026f, -135.9180f, -210.3467f, -175.0943f, -7.7200f, -1.5529f, -138.1960f, -292.0197f, -364.5311f, + 1.6098f, -29.3697f, -112.8375f, -233.4716f, 123.6812f, 20.4676f, -81.0632f, -116.0258f, -218.5294f, + -34.1878f, -103.0825f, -139.6876f, -229.9859f, -246.3806f, -96.8411f, -204.4168f, -321.0166f, -418.4522f, + 27.1891f, -2.9717f, 21.2254f, -122.5167f, -201.1399f, 36.0115f, -56.9192f, -106.8464f, -192.5580f, + 77.7097f, 24.2840f, 152.6398f, 61.5673f, -54.9359f, 27.7810f, -85.7347f, -79.4392f, -81.0366f, + 59.2315f, 15.7636f, 128.6461f, 63.2966f, -11.4618f, 18.7670f, -58.2229f, 42.0642f, 49.7434f, + 247.9855f, 413.3163f, 345.0402f, 192.3750f, 145.4847f, 121.6956f, 123.6805f, 107.2007f, 94.2462f, + 104.2558f, 282.0381f, 490.4723f, 344.7097f, 244.1310f, 96.7224f, 2.9896f, -31.7180f, -23.3323f, + -22.5118f, -53.8832f, -113.5013f, -234.2837f, -4.7630f, -0.8369f, -15.3972f, 57.4113f, 45.6486f, + -41.6155f, -134.7804f, -200.2841f, 179.2444f, 29.8214f, 36.0840f, -106.4028f, 151.5328f, 102.1621f, + 141.5078f, 201.5805f, 79.4698f, -159.8402f, -279.6548f, -324.4731f, -129.3751f, 72.2403f, 81.4769f, + -45.8403f, -152.7728f, -116.5580f, 262.2678f, 114.2470f, 210.0651f, 100.2266f, 64.9777f, -14.6634f, + -39.9272f, -124.8000f, -75.7294f, -110.6360f, -223.7299f, -102.2257f, -226.1053f, -85.4944f, -173.4764f, + -91.6640f, 30.6543f, 4.1065f, -65.4408f, -39.3890f, -89.5364f, -102.5911f, -125.5036f, -48.1974f, + 27.2660f, 19.3735f, -66.4810f, -233.9350f, -388.9383f, -229.7098f, -102.6715f, -201.6806f, -177.6036f, + 153.9685f, 141.8902f, 89.4281f, -53.1892f, -209.9941f, 8.0810f, -71.3509f, -135.8233f, -78.6157f, + -48.4004f, -143.6756f, -250.1705f, -343.5184f, -330.9693f, -81.7413f, -159.8642f, -192.9882f, -201.0525f, + -49.7401f, -133.3727f, -211.5154f, -166.0789f, -199.3352f, -4.0380f, -98.3591f, -184.6634f, -113.6087f, + 32.7128f, -26.7812f, -78.3951f, -264.0457f, -339.2219f, 40.1904f, -121.6728f, -51.6241f, -125.0696f, + 1.8568f, -67.7562f, -73.4413f, -115.9242f, -245.2522f, 77.1352f, -22.1839f, 2.7514f, -4.3203f, + 19.0296f, -62.4543f, 21.8088f, 217.8850f, 43.1886f, 12.7766f, -121.5772f, -171.9543f, -180.7850f, + -0.3986f, -96.1580f, -120.0616f, 336.5914f, 176.9306f, 54.3062f, -66.4501f, -138.8101f, -90.7495f, + 109.0295f, 377.1798f, 641.5853f, 577.4881f, 571.3625f, 438.8002f, 310.6432f, 204.9863f, 132.6160f, + -76.9013f, -15.0371f, 664.7503f, 520.0686f, 489.1051f, 371.2256f, 270.3431f, 196.9454f, 166.5973f, + -42.2498f, -134.3667f, -336.4376f, -457.6409f, 173.4562f, 138.1508f, 34.3921f, -18.1609f, -85.9677f, + -20.8727f, -125.4622f, -192.7956f, 434.5861f, 290.6413f, 142.0824f, 77.1623f, -13.2305f, -29.4274f, + 178.7104f, 373.0402f, 459.7581f, 474.3989f, 557.5211f, 569.2194f, 525.4768f, 358.3187f, 210.4229f, + -26.8194f, 77.7574f, 350.3222f, 445.4183f, 524.4524f, 462.1511f, 381.7293f, 289.9692f, 204.0649f, + 47.7632f, 17.1803f, -105.1057f, 10.4223f, -60.5128f, -219.3625f, -119.8198f, -230.6158f, -301.9153f, + 60.2078f, 16.2198f, -62.5382f, 98.4891f, -50.3729f, -119.2299f, -183.9794f, -286.1903f, -145.0719f, + 52.5866f, 72.1675f, -32.1273f, -162.5446f, -282.0867f, -356.6873f, -196.9938f, -290.2792f, -343.8752f, + 58.1756f, 83.5942f, -32.7989f, -128.5429f, -265.7008f, -326.2490f, -166.5130f, -258.2744f, -31.7978f, + -49.8436f, -148.3240f, -287.2763f, -389.7832f, -131.7967f, 6.5863f, -71.1640f, -182.3324f, -272.4139f, + -32.6407f, -113.2022f, -199.3120f, -231.3794f, 5.2103f, 172.0263f, 60.2526f, -14.7182f, -108.9096f, + 27.2077f, -23.7367f, -95.9858f, -283.8613f, -409.0134f, -31.3871f, -148.6489f, -208.9727f, -274.8275f, + 69.4333f, -0.7143f, -57.0494f, -261.8966f, -366.3107f, 188.4734f, 53.9671f, 24.5447f, 25.3948f, + -4.4283f, 5.6792f, 301.6043f, 172.8969f, 55.6507f, -7.7604f, -81.7609f, -49.2316f, -63.0654f, + -12.4033f, -97.3530f, 37.2340f, 215.5548f, 48.4286f, 11.6666f, -133.9813f, 32.1272f, -33.6059f, + 57.9103f, 293.2768f, 591.9909f, 431.5314f, 338.6320f, 236.6151f, 185.2476f, 175.1540f, 156.0322f, + -63.6185f, -100.3640f, 351.1546f, 428.5004f, 353.7403f, 293.3142f, 196.1020f, 152.1965f, 114.6518f, + -20.0721f, -100.8514f, -174.7278f, -314.6773f, -143.5646f, 298.1905f, 181.1825f, 142.0341f, 71.3729f, + -64.7951f, -146.2021f, -143.2170f, 33.9854f, 13.8056f, 156.0337f, 163.4005f, 334.1913f, 325.3497f, + -79.9064f, -121.2133f, 229.6626f, 303.8755f, 306.8218f, 415.8466f, 436.8824f, 486.2830f, 451.8081f, + -67.6130f, -122.0631f, 41.7635f, 134.7727f, 156.2778f, 308.4236f, 340.0357f, 434.5742f, 391.1108f, + -2.6037f, -46.9405f, -151.3320f, -160.0405f, -239.8193f, -368.3138f, -88.0921f, -150.1500f, -191.7920f, + -79.3309f, -112.6262f, -20.0215f, -129.1640f, -35.3227f, -69.4806f, -159.3188f, -223.7142f, -132.1779f, + 21.9835f, -11.3374f, -106.7910f, -244.8813f, -406.4640f, -311.7320f, -96.4711f, -182.5312f, 57.8956f, + 25.8713f, -0.7151f, -79.9440f, -80.0111f, -224.4878f, -136.2209f, -22.1062f, -137.4635f, -22.6838f, + -17.4638f, -88.0421f, -183.7897f, -361.0791f, -194.1127f, 29.9571f, -12.3110f, 17.3506f, -52.9132f, + -108.1431f, -191.9295f, -193.9598f, -196.0948f, -165.6809f, -79.0258f, -53.5949f, 30.1916f, 37.3619f, + 10.0420f, -70.0023f, -183.1197f, -393.7681f, -492.0758f, 102.2096f, -13.6587f, -51.6821f, -101.1752f, + -25.8195f, -90.5090f, -174.4579f, -208.3670f, -308.3139f, -74.5783f, -38.9631f, -104.3672f, 142.1591f +}; + +/*-------------------------------------------------------------------* + * 1nd stage, 2nd split: ISF9 to ISF15 + *-------------------------------------------------------------------*/ + +const float dico2_isf[] = +{ + 530.1115f, 512.7983f, 443.8771f, 306.1447f, 171.2327f, 70.8250f, 56.8183f, + 248.5479f, 252.9719f, 260.5429f, 221.7305f, 172.6754f, 84.8419f, 141.5120f, + 166.9014f, 171.9745f, 263.4265f, 204.8570f, 129.5061f, 45.8705f, -162.9417f, + 47.0761f, 115.3926f, 182.9788f, 181.5048f, 89.7111f, 17.3276f, -86.2999f, + -57.3148f, -93.7950f, 58.2071f, 31.0844f, 152.3217f, 108.6931f, 41.3677f, + -163.1767f, -217.0378f, 215.5667f, 199.7393f, 91.8320f, 56.3535f, -37.1534f, + 16.9371f, 75.2105f, 106.8429f, 58.4518f, 26.0167f, 13.3113f, -106.5544f, + -16.6336f, -49.0904f, 66.7054f, 162.6404f, 110.2851f, 24.4686f, -138.4124f, + -145.3240f, -33.7683f, -134.5548f, -42.3167f, -36.8413f, -70.9451f, -34.7360f, + -234.5519f, -328.1575f, -78.2304f, 181.4482f, 100.8272f, -4.3886f, -98.7986f, + -18.7314f, 128.6640f, 38.0685f, -113.4033f, -211.9919f, -310.5748f, -138.0866f, + -222.6271f, -45.5429f, 72.9616f, 3.9276f, -52.1214f, -162.3586f, -29.6134f, + -241.3416f, -50.3196f, -96.3331f, -145.0456f, 17.4087f, -29.8105f, 108.3555f, + -399.1142f, -421.4348f, 49.0965f, 185.0085f, 99.2830f, 49.7543f, 20.2726f, + -109.7596f, 29.7695f, -65.3607f, -141.1745f, -110.3974f, -215.1475f, -110.3518f, + -46.4209f, -20.4624f, -0.5266f, 52.1919f, -12.3074f, -79.8395f, -162.1720f, + 415.6808f, 323.0418f, 248.6461f, 267.3440f, 181.1869f, 81.5855f, 4.8347f, + 188.1995f, 162.5893f, 175.4467f, 144.9775f, 131.0177f, 114.8023f, 75.6850f, + 280.8494f, 225.0358f, 142.4128f, 52.8503f, 44.0619f, 35.6548f, -77.7252f, + 116.2722f, 68.6422f, 192.5792f, 142.9262f, 75.7274f, 63.5846f, 13.9314f, + -13.4854f, -92.0420f, -101.3018f, -13.9503f, -1.5377f, 38.4848f, 59.2146f, + -38.0921f, -119.6284f, -10.4956f, 88.8682f, 35.1836f, 43.2013f, -33.7051f, + 35.4547f, 5.0305f, -82.4376f, -100.9264f, -41.5222f, 33.5725f, -24.8381f, + 28.3963f, -13.4840f, -22.4480f, -11.9734f, 63.1961f, 13.8177f, -75.0030f, + -42.4115f, -130.9516f, -245.5204f, -25.9129f, -23.6896f, -49.8110f, 125.7094f, + -193.2334f, -261.3991f, -284.3770f, 75.4337f, 11.9830f, -86.1044f, 47.5069f, + 126.4967f, 37.0484f, -34.7501f, -35.5687f, -159.6523f, -277.2735f, -60.1203f, + -0.1156f, -91.4527f, 35.7808f, 12.8593f, -134.0804f, -237.8749f, -85.9030f, + -134.0644f, -159.5199f, -185.8239f, -255.9559f, -59.8235f, 31.9001f, 86.5795f, + -191.3466f, -290.9137f, -99.7657f, 18.9475f, -18.6283f, 52.5484f, -49.6458f, + 46.4725f, -26.2220f, -128.3100f, -152.1911f, -106.3316f, -212.7650f, -21.8051f, + -22.1899f, -50.6587f, -4.0987f, -2.7160f, -63.9780f, -18.1671f, -8.5809f, + 384.5044f, 415.7100f, 375.3419f, 221.7875f, 82.0605f, -10.5889f, 6.1831f, + 316.8826f, 269.9225f, 294.6225f, 200.5877f, 87.3740f, -13.6950f, 64.9923f, + 258.7122f, 274.8100f, 241.2115f, 150.6316f, 22.2879f, -82.2525f, -100.3677f, + 199.2028f, 140.2225f, 163.4630f, 153.3341f, 35.3954f, -56.3718f, -6.8714f, + -75.2059f, -12.0741f, -10.5019f, 87.1330f, 34.8811f, -55.7089f, 9.3485f, + -43.9131f, -38.3306f, 184.0508f, 124.7862f, 72.2168f, 1.2740f, 68.2432f, + 98.5331f, 56.9808f, -18.2386f, 106.3234f, 18.7400f, -82.2337f, -91.2981f, + 56.8543f, 26.8486f, 79.2505f, 142.2529f, 26.5547f, -20.1961f, 20.0251f, + -101.2805f, -186.8430f, -272.0712f, -136.2303f, -296.2366f, -195.7741f, 24.4320f, + -195.6167f, -300.4726f, -112.7403f, 30.7313f, -121.6459f, -194.0080f, -41.2612f, + 98.2285f, 20.7275f, -91.7240f, -183.2970f, -349.5879f, -345.3007f, 56.7721f, + -162.4512f, -215.0840f, 54.6896f, -51.9437f, -204.1752f, -302.6133f, 17.1211f, + -127.3559f, -165.3954f, -278.6780f, -194.2370f, -33.4488f, -168.4021f, 38.6555f, + -295.7049f, -301.6402f, -62.3113f, -29.8345f, -17.8150f, -12.4093f, 147.9211f, + 33.3799f, -13.6109f, -78.2303f, -156.7363f, -259.0581f, -406.3858f, -96.3685f, + -70.3287f, -128.8603f, -35.8870f, -146.8926f, 10.7114f, -71.6699f, -42.8127f, + 499.4422f, 424.3595f, 305.0398f, 196.0019f, 126.5760f, 63.9795f, 61.1516f, + 266.3734f, 181.9720f, 175.4860f, 108.0995f, 56.9864f, 10.7695f, 159.6035f, + 247.9333f, 184.5145f, 152.3734f, 41.9318f, -90.6959f, -210.2689f, -54.1531f, + 76.7519f, 154.5846f, 129.7565f, 83.0209f, 81.7690f, -11.2691f, -31.6182f, + 58.5084f, -37.0541f, -121.7467f, 29.7202f, -30.0062f, -124.9186f, -19.6730f, + 18.1514f, 3.4725f, 18.4977f, 68.3406f, 54.2768f, 11.6546f, 150.1885f, + 85.0507f, 80.6332f, -9.5051f, -97.5608f, -37.4477f, -107.8952f, -71.4574f, + 10.1458f, 46.5077f, 14.7448f, 5.4868f, -1.5563f, -51.9743f, -20.1740f, + -186.2883f, -239.8358f, -385.3964f, -279.2732f, -246.3584f, -317.5150f, 77.9409f, + -290.8109f, -394.1977f, -416.1625f, -291.0747f, -246.4900f, -66.6275f, 7.0910f, + -53.3572f, -98.2187f, -188.6130f, -239.5862f, -382.9682f, -469.8791f, 4.8130f, + -236.2064f, -299.8000f, -219.3447f, -267.9179f, -424.8446f, -200.9900f, 22.5746f, + -78.8698f, -167.2648f, -305.5687f, -418.8565f, -37.5231f, -91.3323f, -69.9264f, + -187.4632f, -276.9708f, -417.8298f, -350.3085f, -51.2638f, -35.7869f, 125.5794f, + -56.7695f, -75.4877f, -200.1077f, -284.6027f, -223.5758f, -298.6907f, -81.9158f, + -129.2158f, -228.6000f, -204.9319f, -246.4877f, -109.8989f, -81.0975f, -118.3144f, + 455.1133f, 431.3343f, 366.9250f, 323.3162f, 279.7654f, 166.3696f, 60.4075f, + 2.2427f, -42.4551f, 320.2264f, 303.9626f, 161.9218f, 44.0682f, -10.4932f, + 148.9215f, 132.3074f, 122.6564f, 103.3307f, 47.4590f, -3.4202f, -185.0445f, + -145.6115f, 18.4827f, 228.0817f, 172.5267f, 38.5907f, -90.1562f, -43.9888f, + -193.6085f, -14.9922f, -111.3547f, 102.4688f, 119.0297f, 66.3613f, 1.6199f, + -229.1052f, -217.2523f, 26.9406f, 25.7113f, 183.7947f, 138.0997f, 4.9246f, + -54.0735f, 27.3595f, -6.9751f, 41.3897f, 26.0272f, 65.3047f, -117.9287f, + -173.6861f, -55.0424f, 72.3582f, 74.4772f, 59.1275f, 32.2629f, -52.0966f, + -100.2805f, -203.3997f, -281.1161f, -77.1917f, 52.4149f, -18.1558f, -70.9170f, + -319.7560f, -456.2388f, -303.5891f, 199.8376f, 140.0785f, 37.0556f, -44.1020f, + 53.3338f, -0.8373f, -29.0162f, -53.8806f, -156.4895f, -44.6551f, -144.9031f, + -94.4005f, -181.9505f, 79.8505f, 87.0198f, -12.1349f, -82.6727f, -75.0313f, + -207.6459f, -248.8868f, -181.9412f, -267.7931f, 100.0395f, 108.0778f, -54.3928f, + -445.8355f, -486.1193f, -148.8008f, -29.2654f, -20.9138f, 5.3055f, 34.4656f, + -121.3450f, 45.0588f, -55.9190f, -194.9437f, -134.0013f, 48.6244f, -162.3284f, + -240.5215f, -57.3889f, -52.6141f, 16.9554f, -1.6593f, 47.0915f, -144.2315f, + 326.1222f, 306.0203f, 250.4581f, 152.3629f, 138.5136f, 136.6061f, 24.8198f, + 27.9826f, 75.7094f, 172.8544f, 182.3980f, 170.1943f, 85.7041f, 145.3514f, + 181.4035f, 144.2242f, 74.8556f, 1.4272f, -61.0836f, -28.1913f, -88.2541f, + 22.2453f, 80.4679f, 118.3400f, 80.0672f, 73.2458f, 39.5447f, 103.6288f, + -15.5237f, -80.2624f, -190.5397f, -72.0487f, 107.7333f, 24.8407f, -9.9839f, + -84.5773f, -169.2563f, -115.8907f, 53.5535f, 128.0731f, 120.4292f, -112.8952f, + 147.5641f, 31.5040f, -120.2366f, -181.4932f, 22.0867f, -14.3306f, 88.8276f, + -38.8943f, 9.5208f, -14.2124f, -59.1263f, 77.8884f, 3.1099f, 55.9227f, + -166.2941f, -272.4271f, -413.5079f, -51.9034f, 151.3775f, 62.8211f, 125.4737f, + -251.4761f, -399.5025f, -496.4470f, 15.1387f, 25.6129f, -47.9447f, 27.2588f, + 145.3730f, 69.2023f, -67.5157f, -217.2383f, -216.1160f, -118.5795f, -73.6690f, + -45.7917f, -144.0127f, -166.1374f, -47.5218f, -180.4311f, -59.2610f, -28.7005f, + -253.6976f, -332.1650f, -464.5507f, -299.7163f, 194.1511f, 140.7432f, 86.8261f, + -311.8663f, -444.9106f, -568.2597f, -74.2214f, 168.0938f, 91.5796f, 69.8801f, + 16.2576f, -36.8680f, -158.1385f, -270.2551f, 14.7501f, -79.0270f, -96.1519f, + -66.0490f, -143.0125f, -113.3699f, -34.3890f, -25.0086f, 12.5482f, -114.0537f, + 394.4650f, 360.5732f, 366.5918f, 277.4828f, 181.5850f, 89.9984f, 133.6822f, + 84.7064f, 117.2216f, 411.7273f, 263.7720f, 26.7575f, -178.8131f, -69.9364f, + 30.5200f, 177.1075f, 123.5531f, 7.2231f, -92.4543f, -193.6012f, -94.9796f, + 65.2717f, 8.1559f, 165.7135f, 84.0440f, -35.7379f, -118.5377f, -66.5232f, + -113.0977f, -31.5885f, -27.3286f, -26.0692f, 15.5114f, 21.2791f, -23.2414f, + -138.0497f, -166.9724f, -35.1916f, 20.7464f, 36.6236f, 3.5627f, 20.9882f, + -11.0900f, 124.4114f, 110.4337f, 5.6888f, -93.7853f, -22.5026f, 30.8623f, + -29.4226f, -47.2009f, 89.3512f, 13.6996f, 22.5131f, 2.3075f, -51.7825f, + -137.2009f, -200.8273f, -290.6017f, -325.7113f, -275.5810f, -53.4554f, 64.1025f, + -438.9569f, -542.2731f, -412.1423f, -89.9884f, -28.4069f, 15.6647f, 13.8672f, + -63.4932f, -90.8672f, -207.9037f, -306.7191f, -456.9608f, -272.1003f, 37.6908f, + -307.9492f, -374.7438f, -96.2506f, -168.0490f, -243.8695f, -64.5296f, -3.1349f, + -334.4494f, -210.9558f, -246.0072f, -354.2072f, -131.6393f, -27.1645f, 29.5091f, + -366.0860f, -407.0811f, -257.3381f, -286.1801f, -81.4441f, 77.6511f, -10.1480f, + -204.4162f, 30.5330f, -38.3922f, -195.6373f, -339.5407f, -347.7475f, -31.6897f, + -243.6551f, -274.7409f, -17.3959f, -136.0264f, -9.8248f, 34.1080f, -72.7180f, + 392.4115f, 321.3055f, 213.3703f, 97.3249f, 35.2497f, -8.7278f, 80.8223f, + 116.4944f, 155.2541f, 148.9464f, 124.6089f, 78.0606f, 24.1574f, 118.5191f, + 184.6981f, 148.0850f, 51.9562f, -96.3499f, -247.0329f, -172.3801f, 29.4305f, + 110.9024f, 81.4259f, 152.8654f, 45.1114f, -9.8257f, 17.3401f, 36.9414f, + -27.9329f, 30.8783f, -37.1648f, -24.5270f, -50.2764f, -114.4973f, 79.3175f, + -64.1897f, -136.2614f, 44.8825f, 47.6375f, 26.8591f, -0.2729f, 147.6527f, + 135.7539f, 66.4931f, 38.8074f, 22.5599f, -70.1020f, -117.9085f, 73.4314f, + -74.1601f, -0.9165f, 58.6634f, 8.8413f, -20.0486f, -4.3857f, 84.5215f, + -240.3710f, -336.9822f, -425.7879f, -557.5921f, -313.4519f, -18.6503f, -2.2911f, + -375.5428f, -498.5622f, -604.7405f, -284.0899f, -22.5439f, 21.7506f, 87.1215f, + -48.5853f, -99.7448f, -219.1610f, -385.9877f, -498.9206f, -58.0072f, -32.0391f, + -187.4733f, -257.8106f, -348.0662f, -465.0402f, -523.0202f, -126.9367f, 7.9922f, + -242.4066f, -358.0976f, -506.2984f, -527.3067f, 103.2345f, 112.8789f, 19.5721f, + -329.7812f, -399.2909f, -525.3788f, -519.3241f, -114.6023f, 18.0531f, 108.4014f, + -101.3959f, -182.8774f, -323.7689f, -459.4139f, -208.2967f, -218.5872f, -30.6618f, + -83.9128f, -188.9391f, -321.0572f, -481.5454f, -309.1473f, 5.7541f, -53.7133f, + 508.3954f, 514.6412f, 492.8828f, 409.4624f, 279.6907f, 139.5316f, -25.0946f, + 225.7716f, 321.9763f, 361.4909f, 313.2012f, 246.2739f, 141.2217f, 40.0333f, + 183.5499f, 361.1524f, 299.5782f, 200.8792f, 127.5401f, 74.2915f, -43.7510f, + 87.8314f, 192.1731f, 193.5542f, 170.6556f, 233.6155f, 150.0142f, -17.3959f, + 16.6972f, 31.8549f, -16.4255f, 68.2118f, 202.5792f, 133.4167f, -24.8757f, + -118.5934f, -60.2884f, 62.2425f, 224.9154f, 157.3277f, 86.2001f, 127.8335f, + 83.3985f, 95.4353f, 47.7289f, -24.4079f, 122.0239f, 35.9347f, -62.3200f, + 85.0292f, 81.2156f, 121.2625f, 104.6399f, 119.6594f, 126.2998f, -77.7217f, + -111.4887f, -105.1822f, -30.9685f, -48.2729f, -55.9544f, -59.5831f, 92.3539f, + -80.0937f, -149.8609f, -166.3557f, 134.5224f, 22.8807f, -72.2311f, -71.7019f, + -106.2400f, 96.5443f, 49.1033f, -82.1511f, -202.4001f, -182.6395f, 30.4307f, + -38.6498f, -47.0332f, 196.2347f, 62.6390f, -109.4412f, -217.5327f, 118.6330f, + -165.3289f, -6.5073f, -110.5468f, -172.9718f, 83.9014f, 82.6244f, -54.8262f, + -220.1304f, -267.2490f, -88.9432f, 199.2986f, 140.8517f, 50.8656f, 126.1685f, + -167.2625f, 130.8662f, 38.2409f, -25.2887f, 14.1618f, -84.0247f, -96.2550f, + -141.5362f, 19.9235f, 142.0336f, -6.1892f, -91.4426f, 58.7228f, -64.2743f, + 356.9441f, 345.0619f, 293.3749f, 255.2251f, 264.2440f, 181.1552f, -59.9296f, + 246.4391f, 212.9810f, 208.9891f, 281.1677f, 232.7401f, 140.5526f, -31.7890f, + 305.7318f, 278.3117f, 199.8758f, 171.6015f, 133.0515f, 98.0317f, -152.6052f, + 194.0116f, 162.7764f, 97.4355f, 145.3808f, 115.4215f, 67.7161f, -75.3193f, + 50.0116f, -43.0169f, -150.4608f, 36.4008f, 15.3428f, 67.7103f, -90.2827f, + 84.1801f, -22.9641f, -98.8488f, 180.4238f, 151.9562f, 59.9903f, 26.9906f, + 177.5510f, 105.3890f, -1.4605f, -131.7380f, -19.1906f, 90.9329f, -125.9315f, + 119.9137f, 55.8859f, 20.5790f, 85.2794f, 50.1218f, 92.1433f, -60.8729f, + -14.4439f, -72.6866f, -93.8542f, -160.4042f, -42.8567f, 3.3977f, 156.0409f, + -54.5578f, -142.4629f, -245.2400f, 100.6745f, 148.4848f, 83.6861f, 108.3569f, + 51.3106f, 177.4475f, 69.0944f, -111.1996f, -202.9647f, 42.3005f, -83.6978f, + 30.1802f, -55.2034f, 78.5647f, -47.9833f, -191.5273f, -51.2293f, 23.2575f, + -5.5372f, -75.8171f, -203.4011f, -289.5156f, 106.7613f, 141.4280f, -13.0810f, + -141.4010f, -221.2458f, -112.2780f, -89.1527f, 63.0527f, 92.4026f, 123.8935f, + -105.1256f, 76.2826f, -29.3279f, -146.3319f, -79.8275f, 4.2937f, 30.2187f, + -50.0448f, -103.1965f, -61.1121f, -87.1858f, -185.4814f, 103.5567f, 10.4906f, + 483.7709f, 447.9613f, 357.9065f, 269.2391f, 168.5860f, 81.9800f, -109.5565f, + 312.3829f, 259.3732f, 343.4722f, 283.4192f, 160.6555f, 62.4472f, -64.0786f, + 177.4189f, 268.0235f, 209.2622f, 107.3129f, 57.2866f, 17.7874f, 43.3733f, + 118.3413f, 189.8245f, 200.1482f, 138.5254f, 93.9936f, 70.6362f, -26.8448f, + 30.9857f, 35.8345f, 11.3604f, 57.5567f, 90.9626f, 20.1319f, 6.8180f, + -66.7255f, 112.7395f, 51.2972f, 171.5931f, 105.7922f, 1.0289f, -4.0888f, + 161.4374f, 94.0077f, 56.1444f, 67.9007f, 60.5061f, -0.5993f, 5.5333f, + 22.6145f, 84.7579f, 96.3842f, 85.7332f, 58.1820f, 68.5529f, -7.0445f, + 89.2476f, -2.9310f, -93.5695f, -80.5243f, -200.4216f, -74.7223f, 78.7932f, + -37.6075f, -106.1347f, -177.1898f, 12.7187f, -117.0868f, -224.7555f, 18.0710f, + -3.9184f, -42.1867f, -96.2393f, -135.5441f, -300.7351f, -209.1140f, 3.3638f, + -127.2731f, -168.0130f, -23.6514f, -125.4722f, -275.0623f, -116.8249f, 78.4081f, + -0.3268f, -109.2929f, -235.6517f, -163.5220f, -72.4472f, 7.1522f, -14.1950f, + -201.5567f, -203.8994f, -147.8831f, -113.7655f, -70.6486f, -37.9403f, 10.4648f, + -61.9333f, -122.2785f, -205.0957f, -87.3765f, -199.0248f, -324.4658f, -76.9686f, + -114.1747f, -179.4460f, -22.8678f, -120.9749f, -219.5858f, -55.7430f, -137.0347f, + 416.5525f, 356.2247f, 246.4192f, 151.7590f, 80.9813f, 33.7425f, -87.5668f, + 232.7198f, 199.8298f, 232.8017f, 197.1352f, 122.7492f, 47.7377f, -18.8607f, + 307.4450f, 336.4361f, 172.1882f, -36.4639f, -118.2980f, 12.7783f, -74.1220f, + 100.4413f, 183.0223f, 131.6807f, 19.7279f, 5.8399f, 116.3680f, -36.1637f, + 115.0603f, 28.3727f, -46.6535f, 9.9458f, 14.2165f, 8.8947f, 42.1125f, + -11.0346f, -1.0867f, -12.6705f, 44.5022f, 8.2729f, 72.2938f, 41.9570f, + 188.4713f, 119.1476f, 5.8222f, -109.1441f, -124.7922f, 20.2470f, 37.4241f, + 88.4120f, 18.1026f, 44.8535f, 28.1015f, -53.1688f, 52.0384f, -48.7039f, + 7.0136f, -80.7959f, -218.2056f, -230.6367f, -196.4241f, -188.3921f, 125.5651f, + -223.0832f, -308.3413f, -371.4560f, -67.3406f, -172.4539f, -210.1611f, 44.0330f, + 70.5425f, 5.5613f, -121.1026f, -250.2220f, -391.0280f, -78.8702f, 62.0359f, + -53.2080f, -153.5175f, -168.9519f, -200.2387f, -356.0113f, -56.1841f, -8.4833f, + 28.1989f, -103.3445f, -275.6373f, -372.5401f, -62.2850f, 20.7805f, 129.8285f, + -131.8626f, -230.9837f, -332.7086f, -149.5865f, -154.3909f, 21.7068f, 17.3275f, + 16.7300f, -61.8863f, -181.1369f, -350.5149f, -246.6439f, -61.1861f, -114.9767f, + -62.9283f, -50.0990f, -128.3168f, -223.8037f, -188.6130f, -48.9473f, 4.2910f, + 397.1338f, 354.0856f, 410.7048f, 392.6840f, 265.0492f, 133.1239f, -39.9595f, + 140.3398f, 130.2926f, 612.1718f, 513.2461f, 282.4946f, 41.1820f, 3.7939f, + -25.5253f, 283.5953f, 206.7656f, 117.4847f, 85.9801f, 16.9447f, -106.7023f, + -199.2065f, 170.3263f, 280.7031f, 221.1866f, 139.8684f, 69.7774f, 44.7026f, + -218.6125f, 116.3745f, 51.8822f, -46.6960f, 133.6225f, 87.8249f, 5.3826f, + -351.2338f, -39.4894f, 84.6148f, 241.0717f, 156.3851f, 57.0277f, -22.5485f, + -16.1558f, 137.3482f, 31.9090f, -76.7114f, 15.3505f, 47.2591f, -65.0792f, + -82.6497f, 23.1536f, 174.7281f, 111.0391f, 165.1666f, 97.6276f, -66.0758f, + -144.8786f, -188.8722f, -232.9240f, 11.8115f, -15.8240f, 97.1230f, 8.4134f, + -145.3324f, -253.9705f, -310.2223f, 186.1852f, 173.7029f, 84.4147f, -31.0347f, + -137.6416f, 107.5353f, 6.4667f, -172.8744f, -362.7197f, 36.0251f, 7.3423f, + -273.1752f, -271.7551f, 168.5304f, 103.1478f, -19.2394f, -121.0773f, 71.0605f, + -382.1200f, -84.7432f, -167.9304f, -156.0550f, 39.5436f, 102.1275f, 28.0496f, + -362.7133f, -347.0801f, -139.5875f, -5.2563f, 181.0231f, 147.5667f, 92.1709f, + -322.5983f, 22.0118f, 11.8984f, -116.7982f, -140.8088f, -50.1710f, -20.0495f, + -342.8153f, -116.9352f, -43.2698f, 29.1059f, 25.4655f, 14.1526f, 1.1041f, + 319.3257f, 143.9371f, -9.8398f, 138.1817f, 272.2951f, 230.7682f, -67.6844f, + 120.5561f, 82.8050f, 86.9118f, 293.3890f, 188.8921f, 54.7609f, -21.7199f, + 231.6328f, 148.0905f, 27.2085f, -3.2337f, 100.6721f, 70.2593f, 42.8315f, + 64.4154f, -17.9857f, 99.5439f, 116.0344f, 85.7395f, 106.6537f, 41.0177f, + 62.6236f, -27.4056f, -139.7237f, -70.5707f, 148.2318f, 128.9077f, 124.7000f, + -92.9236f, -144.0688f, -77.1586f, 288.9071f, 226.4347f, 124.6281f, -55.6669f, + 78.3503f, 42.4807f, -79.0042f, -178.3122f, 128.1446f, 107.8855f, -55.1806f, + 79.1238f, 66.4433f, 43.2504f, 16.2992f, 80.8281f, 140.7251f, 73.5809f, + -134.6119f, -155.8599f, -200.3194f, -90.9865f, 253.7969f, 164.9683f, 31.5576f, + -248.1197f, -375.5200f, -476.6351f, 180.7157f, 210.6575f, 79.8609f, 81.7351f, + 78.7261f, -9.7665f, -75.8617f, -194.4922f, -307.4282f, 75.4347f, -56.0501f, + -175.4331f, -210.0029f, 75.9892f, -41.3638f, -129.4197f, 26.7040f, 24.1293f, + -89.1388f, -186.3199f, -327.9780f, -225.0781f, 123.8019f, 49.8056f, 110.5614f, + -262.0009f, -365.9398f, -315.0958f, -44.6833f, 152.6366f, 130.9091f, -24.3555f, + 96.1914f, 0.9431f, -122.7709f, -265.0437f, -118.4077f, 70.4388f, -34.3324f, + -41.7155f, -106.2450f, 35.3080f, -77.1729f, -11.0485f, 113.3317f, -43.5801f, + 345.8234f, 448.9382f, 398.8093f, 278.1467f, 193.7783f, 109.9307f, -32.5084f, + 105.2215f, 192.0218f, 307.4095f, 251.2213f, 135.6460f, 27.1659f, 48.2501f, + 131.1255f, 248.6208f, 194.8135f, 35.9742f, -89.6413f, -70.1114f, 74.4933f, + 10.3277f, 157.1341f, 220.2146f, 132.8669f, 58.2022f, -4.2414f, 52.5998f, + -171.9997f, 219.1700f, 183.7592f, 79.7388f, -28.2743f, -72.7875f, 54.8047f, + -281.0813f, 5.4272f, 138.6439f, 89.6476f, 26.7423f, -52.0621f, 181.8158f, + 42.9908f, 121.1063f, 40.1449f, 4.6961f, 41.3091f, 11.3680f, 61.7374f, + -69.6739f, 44.0933f, 62.9511f, 55.3414f, 47.1718f, 45.0520f, 10.5398f, + -254.2462f, -161.6377f, -252.0311f, -59.3082f, -64.1228f, -5.1355f, -167.6060f, + -249.7012f, -368.7658f, -266.1853f, -40.5172f, -31.5949f, 20.3852f, -73.7292f, + -259.0964f, -63.9727f, -123.4555f, -266.6797f, -372.6790f, -79.9634f, -32.2913f, + -237.8991f, -261.1591f, -67.3100f, -201.9258f, -271.1355f, 110.5556f, -31.4253f, + -252.1870f, -59.5241f, -149.7008f, -264.8359f, -95.9333f, -15.7623f, -55.9292f, + -291.6127f, -310.8436f, -291.0997f, -152.3425f, -38.1903f, 16.9302f, 107.5521f, + -234.1635f, -77.8775f, -155.4929f, -169.1375f, -170.1633f, -210.0618f, 12.2871f, + -432.5516f, -222.0327f, -146.7204f, -103.4423f, -49.3643f, -8.0516f, 0.3778f, + 330.7150f, 223.7578f, 120.2566f, 152.9689f, 119.1688f, 39.3462f, 21.3169f, + 106.4649f, 114.2936f, 78.3297f, 104.4772f, 135.1724f, 78.5670f, 48.1339f, + 284.0033f, 187.5895f, 88.2418f, 0.6583f, -25.3445f, -53.7671f, 63.9802f, + 106.5275f, 81.1295f, 67.7705f, 114.2483f, 4.6206f, 98.6728f, 68.0557f, + 132.7267f, 80.9311f, 70.2013f, 34.2614f, 45.4356f, 17.9487f, 185.5185f, + -179.6926f, -64.9953f, -11.8397f, 5.1401f, 42.9932f, 67.5337f, 154.7699f, + 53.6060f, 34.2805f, 16.7478f, -53.4059f, -36.7348f, 13.1978f, 110.7422f, + 37.6082f, -5.5267f, 88.1530f, 15.7336f, 24.4194f, 27.1976f, 50.6641f, + -182.5485f, -287.0959f, -395.1311f, -458.4781f, -119.8993f, 119.0388f, -26.2634f, + -239.2084f, -359.3420f, -447.6111f, -221.6196f, -3.2312f, 35.8538f, -9.6860f, + -70.9599f, -105.8073f, -192.0091f, -294.5047f, -334.6240f, 111.9638f, -29.3527f, + -193.0902f, -307.5872f, -268.9553f, -266.8591f, -276.8985f, 53.4395f, -127.3159f, + -112.3830f, -214.7503f, -352.5892f, -431.6330f, 130.6462f, 125.3650f, -24.3701f, + -138.4310f, -254.9568f, -325.5955f, -173.9416f, 0.3136f, 147.4202f, -59.5469f, + -63.4081f, -119.3462f, -237.6156f, -366.1194f, -116.1935f, 96.5096f, -74.8714f, + -91.5009f, -186.5192f, -95.3213f, -190.6698f, -103.7853f, 133.5730f, -129.6124f +}; + +/*-------------------------------------------------------------------* + * AMR-WB ISF codebook - 46bits, 2 stages, 1st stage common with the + * 36bit codebook,5 splits in the 2nd stage + * + * codebook vector dimension number of vectors + * ~~~~~~~~ ~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~ + * 2_1 3 64 + * 2_2 3 128 + * 2_3 3 128 + * 2_4 3 32 + * 2_5 4 32 + *-------------------------------------------------------------------*/ + +/*-------------------------------------------------------------------* + * 2nd stage, 1st split: ISF0 to ISF2 + *-------------------------------------------------------------------*/ + +const float dico21_isf_46b[] = +{ + 128.4688f, 159.8148f, 97.2755f, + -12.9836f, 197.1542f, 62.3669f, + -11.1370f, -5.4038f, 227.1786f, + -102.5247f, 49.5302f, 138.2452f, + 56.6014f, 92.4597f, 68.2462f, + -59.4614f, 95.8021f, 47.7671f, + 10.6214f, 16.4206f, 132.7432f, + -33.0052f, -36.4880f, 121.6274f, + 111.3621f, 86.8573f, -60.9301f, + 18.4019f, -16.9460f, -196.8595f, + 91.2159f, 47.1568f, 150.3417f, + 40.7444f, -123.8314f, 17.6656f, + 68.7560f, 76.0870f, 3.0834f, + 40.5189f, -22.9558f, -36.8239f, + 68.9463f, 20.8592f, 75.1641f, + -13.4297f, -49.7472f, 59.4394f, + 222.6512f, 108.2263f, -13.1594f, + -26.2678f, -128.5232f, -249.6796f, + -61.3770f, -106.3253f, 180.3803f, + -69.2195f, -180.5594f, 77.3840f, + 125.7118f, 69.8739f, 44.7696f, + -150.6344f, 66.9866f, 7.4132f, + 7.5039f, -4.7150f, 76.2746f, + -46.9159f, -98.2953f, 78.4325f, + 118.5603f, 14.1695f, -131.2373f, + -50.1565f, -86.1739f, -148.3825f, + 66.6965f, -72.1903f, 115.4583f, + -94.5599f, -121.9918f, 8.8523f, + 77.1679f, 15.2443f, 6.1163f, + -1.0987f, -69.2605f, -43.3316f, + 43.3928f, -36.3404f, 29.4998f, + -36.0829f, -87.1134f, 1.6094f, + 69.0548f, 158.6352f, -17.3680f, + -65.7580f, 148.4039f, -58.1224f, + -1.4207f, 106.6547f, 129.4115f, + -163.9787f, 200.5753f, 108.3887f, + 8.0981f, 96.4962f, 18.4523f, + -22.7513f, 51.0308f, -0.8203f, + -1.3389f, 52.2067f, 70.5057f, + -56.5316f, 15.5148f, 68.5082f, + 73.6822f, 28.9345f, -56.5083f, + -10.5212f, -17.6820f, -126.8611f, + 144.6737f, -44.4661f, -8.2446f, + -32.2712f, -161.9950f, -67.5138f, + 29.9266f, 37.2667f, -20.0451f, + -15.7787f, -11.7016f, -26.2432f, + 27.7648f, 34.4647f, 33.4065f, + -13.8614f, -38.4420f, 5.6107f, + 27.0098f, 76.8588f, -130.2875f, + -76.5280f, 30.9527f, -90.1727f, + -135.8326f, -53.3710f, 85.3346f, + -137.4852f, -34.8750f, -33.3215f, + 18.2807f, 78.3958f, -50.7970f, + -64.5101f, 14.5083f, -5.6925f, + -16.6084f, 1.0141f, 33.5889f, + -63.0082f, -42.0433f, 31.0393f, + 32.2577f, 8.3123f, -92.4112f, + -31.6346f, -58.2893f, -92.9305f, + 58.7086f, -72.6659f, -98.0877f, + -72.8089f, -97.1838f, -63.2264f, + -7.5866f, 25.6299f, -54.3822f, + -10.3321f, -19.4552f, -70.7729f, + 9.4725f, 4.3403f, 0.0721f, + -50.7563f, -41.0679f, -38.2745f +}; + +/*-------------------------------------------------------------------* + * 2nd stage, 2nd split: ISF3 to ISF5 + *-------------------------------------------------------------------*/ + +const float dico22_isf_46b[] = +{ + -49.5271f, 121.1295f, 16.4769f, + -94.4022f, 76.8061f, 2.1280f, + -58.8683f, 32.7926f, -6.6703f, + -83.7461f, 49.5749f, -58.1205f, + -96.5332f, -51.1816f, 62.2310f, + -104.6874f, -104.4218f, -36.9709f, + -84.8023f, 0.4441f, -31.0082f, + -105.8907f, -31.0867f, -72.0962f, + -17.4561f, 170.2726f, 62.0341f, + 64.3231f, 77.6492f, 152.6545f, + -13.0558f, 31.6496f, 73.1381f, + -25.9540f, -16.3235f, 138.6579f, + -116.2904f, -22.1347f, 133.9606f, + -42.0923f, -209.9028f, 88.4509f, + -56.0897f, -9.1734f, 75.5450f, + 68.7883f, -157.0452f, 33.8343f, + 20.5838f, 115.6837f, 9.8136f, + -32.8948f, 98.7358f, -40.4656f, + -22.8099f, 41.1383f, -49.3496f, + -66.1700f, 67.9190f, -122.8227f, + -18.8196f, 17.0630f, -114.9884f, + -64.0458f, -162.7084f, -94.5118f, + -54.2084f, 1.0923f, -75.9526f, + -60.5415f, -80.9324f, -82.4130f, + 46.5760f, 125.8621f, 83.1458f, + 129.9934f, 19.7027f, 148.2803f, + 92.6546f, 96.4434f, -0.8040f, + 181.9977f, -6.0791f, 78.6212f, + 93.0392f, -99.5781f, -41.6073f, + 26.0437f, -172.0070f, -58.1634f, + 47.8475f, -34.2895f, -54.2498f, + 34.4187f, -96.6345f, -28.5027f, + -15.8270f, 90.1190f, 65.2787f, + -24.1274f, 60.7006f, 6.3059f, + -25.2307f, 6.3412f, 30.0794f, + -26.6845f, -0.7965f, -24.5917f, + -59.0614f, -117.3599f, 62.4002f, + -7.0821f, -130.0555f, 20.9710f, + -21.7086f, -36.6794f, 1.9468f, + 0.6440f, -74.2564f, 5.5161f, + 35.9276f, 57.9971f, 81.4502f, + 42.2272f, 3.3575f, 106.2218f, + 42.1565f, 13.6719f, 43.0135f, + 55.6116f, -33.1310f, 56.8126f, + 18.4410f, -61.4055f, 109.0841f, + 1.0223f, -125.1248f, 96.1657f, + 16.9404f, -28.1707f, 26.5748f, + 33.5245f, -84.6827f, 52.6704f, + 14.2066f, 54.8716f, 30.7506f, + 21.9479f, 68.4119f, -19.0589f, + 10.1034f, 17.7161f, 1.1122f, + 28.3594f, 21.5207f, -39.3190f, + 42.6619f, -71.6784f, -94.4716f, + -1.6345f, -110.6804f, -94.5938f, + 18.7091f, -26.5385f, -18.5676f, + -2.2267f, -59.7051f, -47.6606f, + 63.0633f, 76.6895f, 37.6845f, + 90.5993f, 31.2041f, 74.2520f, + 64.4418f, 37.7231f, 4.2748f, + 100.9151f, -12.1708f, 27.5607f, + 104.1606f, -30.0584f, -35.7097f, + 121.5339f, -81.6812f, 34.1503f, + 59.3840f, -5.5457f, -8.5514f, + 58.5319f, -58.3782f, 3.4649f, + -126.3823f, 217.4185f, 72.9956f, + -149.8116f, 119.9919f, 17.7920f, + -98.1555f, 10.6050f, 30.1117f, + -142.4950f, 30.1718f, -20.4500f, + -188.3500f, -32.7229f, 62.5055f, + -165.4842f, -201.2336f, -25.1871f, + -114.8346f, -46.6803f, -1.4401f, + -185.9166f, -45.3806f, -42.6756f, + -37.7442f, 124.2892f, 142.7720f, + 41.5423f, 244.7676f, 173.7613f, + -74.1037f, 46.8818f, 112.0588f, + -57.0922f, 25.5056f, 241.9654f, + -166.9268f, 94.6864f, 141.8443f, + -141.0368f, -145.0649f, 168.9254f, + -135.5530f, 39.8468f, 65.4743f, + -245.6494f, 76.1803f, -5.6309f, + -25.5608f, 185.7902f, -18.2246f, + -116.1471f, 125.0659f, -65.5997f, + -21.6448f, 139.2267f, -103.0516f, + -152.7089f, 32.1737f, -111.7466f, + -19.9673f, -12.1771f, -217.1499f, + -69.4452f, -156.0378f, -228.9529f, + -79.9513f, -19.3186f, -140.5787f, + -134.0792f, -92.8863f, -131.5222f, + 85.7696f, 178.6823f, 22.5404f, + 219.0179f, 182.4547f, 100.9819f, + 132.7898f, 105.4102f, -65.5694f, + 175.6583f, 30.2382f, -109.3055f, + 23.2833f, 65.0492f, -161.3234f, + 51.9178f, -98.2708f, -192.0347f, + 84.2797f, 61.1831f, -113.4513f, + 110.0580f, 0.1775f, -193.4730f, + -88.3674f, 114.5595f, 71.3481f, + -61.4713f, 52.7833f, 47.8295f, + -61.8477f, -23.0151f, 15.1016f, + -52.0862f, -46.0690f, -37.7005f, + -129.6202f, -120.6827f, 44.2216f, + -62.4412f, -165.8667f, -2.2683f, + -58.1508f, -82.2449f, 9.3842f, + -31.2569f, -108.3441f, -35.0348f, + -4.4143f, 48.6610f, 132.2242f, + 50.8942f, -27.6676f, 181.6500f, + 2.0066f, -17.6839f, 71.9731f, + 92.7139f, -37.1637f, 98.9732f, + -54.3785f, -76.9789f, 115.8870f, + -7.4354f, -117.3479f, 199.5254f, + -24.6757f, -59.5165f, 54.3134f, + 97.6902f, -113.0194f, 131.1002f, + 48.4163f, 132.4722f, -58.7820f, + 13.3327f, 68.6117f, -81.0715f, + 66.7414f, 64.6961f, -45.2427f, + 36.7779f, 14.7160f, -89.5910f, + 29.2181f, -25.5238f, -132.3077f, + -30.5052f, -80.0320f, -150.5560f, + 0.1157f, -11.7322f, -63.8467f, + -21.6912f, -43.0765f, -94.6223f, + 125.3290f, 95.1208f, 75.9759f, + 197.4010f, 92.9319f, -0.5012f, + 123.8246f, 45.4969f, 25.5317f, + 120.7415f, 34.4155f, -28.8961f, + 176.6600f, -20.0903f, -19.4091f, + 130.6288f, -84.9368f, -113.4633f, + 82.2281f, 16.0388f, -59.4614f, + 93.1589f, -21.5846f, -101.7248f +}; + +/*-------------------------------------------------------------------* + * 2nd stage, 3rd split: ISF6 to ISF8 + *-------------------------------------------------------------------*/ + +const float dico23_isf_46b[] = +{ + -3.8995f, 58.9472f, 140.2168f, + 53.1422f, 116.3810f, 87.0383f, + 99.7094f, -40.4441f, 113.1331f, + 165.1496f, 2.2135f, 71.5223f, + -105.3934f, -104.9144f, -38.2897f, + -20.3247f, -32.1811f, 5.1214f, + -32.0250f, -106.9634f, -37.7452f, + 35.0256f, -95.9288f, -28.2073f, + -116.9343f, -27.2704f, 164.5334f, + -34.2352f, 142.6884f, 167.9453f, + 72.9835f, -124.0776f, 148.8355f, + 148.2748f, 14.5359f, 190.7047f, + -145.5305f, -123.4847f, 30.8224f, + -120.2600f, -39.3306f, 2.0939f, + -52.9049f, -176.3645f, 3.0609f, + 27.9487f, -164.3167f, -60.3281f, + 70.4088f, 66.5042f, -47.2043f, + 24.2507f, 69.1997f, -15.5014f, + 127.5028f, 31.2976f, -40.8233f, + 96.9136f, 102.7271f, -1.9768f, + -65.7818f, -70.8663f, -86.5155f, + -0.6444f, -8.8675f, -61.8361f, + -5.3369f, -58.3089f, -47.3390f, + 46.4765f, -35.6284f, -57.4718f, + 46.3328f, 129.6813f, -59.6592f, + 18.9988f, 118.4842f, 13.3515f, + 172.5430f, -21.3132f, -26.8827f, + 84.7525f, 177.2668f, 22.5077f, + -140.2432f, -73.0634f, -146.3583f, + -16.3786f, 19.6063f, -107.1305f, + -3.0698f, -104.1769f, -97.1330f, + 33.2378f, -33.4660f, -134.9635f, + -29.8971f, -15.7433f, 134.7990f, + 34.9346f, 52.2504f, 85.7197f, + 60.8752f, -31.2562f, 62.5970f, + 42.3279f, 15.7348f, 45.3299f, + -61.8761f, -80.5864f, 11.3831f, + 1.9118f, -12.4255f, 68.2023f, + -25.4049f, -61.6688f, 57.1412f, + 21.3127f, -30.3874f, 28.3554f, + -44.5637f, -86.8534f, 137.9897f, + -18.2977f, 31.6219f, 82.2796f, + 19.0573f, -58.8750f, 104.6892f, + 41.1433f, 1.5028f, 117.9977f, + -102.7489f, -51.4207f, 71.3300f, + -59.0984f, -10.9389f, 78.5554f, + -69.1486f, -120.0273f, 65.0256f, + 39.6252f, -86.2109f, 50.9690f, + 29.0714f, 22.6919f, -38.4256f, + 12.6360f, 17.2986f, 5.2183f, + 75.9445f, 11.6720f, -55.4942f, + 66.2898f, 37.5939f, 3.0594f, + -53.0062f, -46.4272f, -35.4140f, + -25.4219f, 2.9542f, -21.2949f, + 1.3392f, -73.4502f, 4.6640f, + 17.5926f, -24.6153f, -19.1614f, + 58.2567f, -8.0154f, -7.3521f, + 9.4616f, 56.2212f, 37.1474f, + 99.2497f, -8.5999f, 23.5678f, + 62.8908f, 76.5199f, 37.4883f, + -61.5740f, -23.6494f, 18.8743f, + -27.4404f, 12.7151f, 31.8660f, + -8.8214f, -125.3200f, 22.5806f, + 60.3707f, -57.3931f, 1.9729f, + -142.0781f, 128.1134f, 29.9265f, + -8.1434f, 177.0072f, 67.7176f, + -42.2467f, 31.9985f, 246.1330f, + 143.5303f, 102.5801f, 81.3050f, + -117.3709f, -24.3191f, -68.7836f, + -80.1727f, 55.9021f, -61.6700f, + -65.9167f, -159.9841f, -103.0851f, + 100.4774f, -105.1623f, -39.0393f, + -248.4434f, 113.0562f, -0.9632f, + -114.2012f, 244.7349f, 67.3892f, + -149.2039f, -141.9386f, 151.3480f, + 96.8171f, 204.6967f, 174.6282f, + -203.4799f, -43.3805f, -41.7327f, + -154.4080f, 46.2418f, -107.0591f, + -133.7993f, -265.7036f, -48.9596f, + -67.3323f, -174.6485f, -259.0245f, + 29.4362f, 57.7183f, -143.2330f, + -30.9358f, 102.7735f, -36.8946f, + 97.2809f, 57.7730f, -111.7326f, + 148.5371f, 105.7429f, -63.3760f, + -55.6062f, -1.6898f, -72.6741f, + -22.0825f, 43.4697f, -48.9841f, + -13.6583f, -42.0695f, -99.1267f, + 39.0227f, 11.1441f, -94.4170f, + -31.1674f, 118.4450f, -103.1298f, + -30.5761f, 181.1050f, -22.4168f, + 96.8625f, -8.6867f, -192.7743f, + 258.0970f, 258.6485f, 17.2359f, + -75.4867f, -15.7399f, -128.9883f, + -69.4209f, 56.4875f, -131.4587f, + -35.1219f, -77.9249f, -156.1559f, + -15.4754f, -8.8922f, -194.7119f, + -74.8584f, 44.6175f, 122.9601f, + -15.9046f, 95.4389f, 74.2532f, + 34.5640f, -37.7631f, 189.4453f, + 93.9878f, 31.0970f, 82.8675f, + -96.2834f, 15.6201f, 33.9921f, + -60.9930f, 57.5930f, 52.2667f, + -0.7661f, -130.2809f, 93.4385f, + 120.2708f, -79.2677f, 42.9508f, + -179.2200f, 97.8633f, 164.7641f, + -85.0375f, 121.2092f, 89.0752f, + -33.4305f, -135.1092f, 255.3923f, + 71.7349f, 68.5372f, 165.8218f, + -187.7999f, -24.7305f, 65.9037f, + -136.4161f, 45.6197f, 73.4184f, + -48.8887f, -218.9293f, 120.9648f, + 61.8728f, -162.4253f, 36.5784f, + 17.9416f, 66.9736f, -75.1315f, + -24.6266f, 61.4069f, 5.3953f, + 100.0199f, -13.7281f, -105.7749f, + 125.9485f, 48.0431f, 20.6117f, + -83.4273f, 1.6803f, -29.7397f, + -60.9733f, 33.6154f, -6.9071f, + 49.9381f, -77.0001f, -90.5842f, + 103.7070f, -35.1051f, -38.3706f, + -120.2797f, 129.5670f, -56.7507f, + -51.1815f, 120.2600f, 22.5398f, + 198.7324f, 23.1592f, -132.3752f, + 219.6951f, 76.6881f, -5.4836f, + -147.6706f, 39.1117f, -18.2240f, + -91.4913f, 78.8627f, 0.3161f, + 40.5908f, -105.4075f, -192.5737f, + 124.6250f, -81.8382f, -127.0619f +}; + +/*-------------------------------------------------------------------* + * 2nd stage, 4th split: ISF9 to ISF11 + *-------------------------------------------------------------------*/ + +const float dico24_isf_46b[] = +{ + -30.8071f, -34.8458f, -1.7377f, + -66.7509f, 30.0385f, -82.3340f, + 62.4748f, -75.5700f, 38.3392f, + 47.0287f, -40.0671f, 126.1063f, + 12.5178f, -8.7146f, -50.3954f, + 27.9620f, 30.3537f, -104.7235f, + 71.0260f, -29.6231f, -25.7014f, + 120.7753f, 38.6709f, -56.4990f, + -89.5313f, -61.4613f, -32.9542f, + -149.7260f, 38.4143f, -27.8365f, + -35.1587f, -137.6189f, 4.6136f, + -110.8198f, -69.6633f, 69.4652f, + -25.4794f, -48.9702f, -64.6927f, + -34.0250f, -68.5378f, -137.1167f, + 16.3769f, -77.3935f, -18.8382f, + 60.1539f, -54.6626f, -95.0395f, + -29.9828f, 6.8644f, 42.3138f, + -15.0985f, 138.6659f, 35.6532f, + 34.1357f, 3.3162f, 60.3957f, + -1.5046f, 61.8542f, 93.5327f, + 49.8233f, 37.2486f, -21.0923f, + 2.6462f, 96.2433f, -48.4645f, + 100.8559f, 5.8835f, 34.9436f, + 80.3813f, 84.4933f, 38.3143f, + -78.4639f, 3.3495f, 7.0416f, + -121.9442f, 90.8917f, 79.7252f, + -15.2997f, -67.8455f, 60.6317f, + -56.1035f, -3.5687f, 110.7510f, + -22.2741f, 27.4204f, -26.9833f, + -61.1362f, 73.0974f, 7.1390f, + 21.0362f, -11.6205f, 9.0680f, + 9.3252f, 52.8599f, 21.3451f +}; + +/*-------------------------------------------------------------------* + * 2nd stage, 1st split: ISF12 to ISF15 + *-------------------------------------------------------------------*/ + +const float dico25_isf_46b[] = +{ + 65.8574f, 55.5896f, -46.5520f, 44.9019f, + 80.4838f, -7.7875f, 36.7110f, 88.1867f, + -41.5522f, 122.0924f, -8.3769f, 6.2406f, + -24.0605f, 63.0705f, 27.8308f, 99.4548f, + -34.8725f, 39.6270f, -72.1743f, 48.7995f, + 28.2859f, -11.6999f, -78.4246f, 134.1911f, + -100.6717f, 12.7337f, -3.2716f, 31.4897f, + -40.5514f, -60.1846f, 28.1000f, 115.5554f, + 56.1050f, -26.6471f, -104.7202f, -9.7237f, + 31.5196f, -30.3722f, -34.0636f, 41.4375f, + 8.5013f, 60.4295f, -72.4835f, -46.4772f, + -18.1378f, -10.8741f, 10.5206f, 35.6699f, + -44.7247f, -14.6405f, -68.4296f, -12.8925f, + -36.6233f, -86.8592f, -73.8785f, 47.7951f, + -51.6319f, -46.3776f, -74.4907f, -105.4981f, + -67.2817f, -67.7186f, 6.9193f, -16.9668f, + 108.8168f, 52.7624f, -16.3049f, -50.0846f, + 72.9801f, -33.7268f, 89.4150f, -54.0673f, + 62.1588f, 93.8928f, 54.7414f, 17.8328f, + 26.7626f, 9.6218f, 88.5287f, 29.9594f, + 8.1440f, 44.9198f, 5.0806f, 2.9996f, + 26.4759f, -96.7328f, 49.0444f, 31.6496f, + -58.6349f, 53.6024f, 80.8924f, -3.3883f, + -60.0341f, -51.9482f, 112.9073f, 26.0056f, + 55.9483f, -14.6255f, -33.5049f, -127.3506f, + 70.1847f, -12.4499f, 7.3368f, -8.8635f, + 10.1728f, 65.7077f, 45.2101f, -90.9790f, + -12.5750f, -10.0652f, 45.9762f, -30.2995f, + 1.2805f, -3.2898f, -17.5766f, -44.9828f, + 22.1316f, -84.0894f, -21.1065f, -32.5923f, + -81.6581f, 43.6873f, -8.6894f, -65.0775f, + -35.4129f, -58.9663f, 65.8078f, -102.2045f +}; + +/*-------------------------------------------------------------------* + * AMR-WB ISF codebook - 36bits, 2 stages, 1st stage common with the + * 46bit codebook,3 splits in the 2nd stage + * + * codebook vector dimension number of vectors + * ~~~~~~~~ ~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~ + * 2_1 5 128 + * 2_2 4 128 + * 2_3 7 64 + *-------------------------------------------------------------------*/ + +/*-------------------------------------------------------------------* + * 2nd stage, 1st split: ISF0 to ISF4 + *-------------------------------------------------------------------*/ + +const float dico21_isf_36b[] = +{ + -20.3147f, -37.6762f, 82.8575f, 122.9161f, -28.4468f, + 31.9756f, -79.5400f, 141.6557f, 53.2923f, -77.0688f, + -49.3360f, -129.1711f, 71.5448f, 85.1944f, 55.7117f, + -19.1147f, -16.1797f, 217.6729f, 89.8943f, 28.1868f, + 0.9668f, -28.5091f, 63.7145f, 147.3305f, 86.3104f, + 52.0605f, 43.3415f, 108.6263f, 83.9071f, -42.8628f, + -39.7734f, -7.6796f, 110.7755f, 44.0677f, 106.4663f, + 32.7239f, 124.4301f, 113.4192f, 7.2217f, 33.0503f, + -9.5746f, -1.9619f, 48.6607f, 51.4268f, -79.8193f, + -14.9729f, -2.0174f, 111.5604f, -3.5774f, -139.2041f, + -54.5000f, -100.1092f, 35.8796f, 45.5500f, -73.7805f, + -56.2694f, 74.4424f, 122.2707f, 20.1155f, -38.3887f, + 65.2094f, -3.9808f, 17.2638f, 96.6362f, 14.0115f, + 148.8982f, 77.1199f, 93.1280f, 28.7596f, 2.2577f, + 14.8324f, -159.4414f, 11.4260f, -1.0211f, -33.2422f, + 35.9112f, 103.8106f, 61.4044f, -9.7034f, -78.2548f, + 62.7658f, -47.4034f, 27.3267f, 32.6865f, -54.7569f, + -6.2693f, -33.7779f, 43.5591f, -36.6678f, -73.8111f, + -104.9376f, -105.4944f, 137.0911f, 41.7979f, -9.4558f, + -26.6750f, -26.3288f, 192.3279f, -40.3915f, -60.3539f, + -20.5168f, -51.3274f, 24.2191f, 47.5655f, 3.7810f, + 52.7448f, 32.7149f, 110.3630f, -21.5464f, -46.7397f, + -4.6471f, -85.4498f, 129.3530f, -31.6973f, 65.0658f, + 85.9795f, -53.2356f, 57.2992f, -67.2997f, -16.4516f, + 54.7607f, -37.1454f, -42.4738f, -34.5633f, -75.7294f, + 0.0517f, -0.6519f, -1.3703f, -12.9917f, -148.9960f, + -25.8564f, -84.6818f, 59.5151f, -72.5006f, -156.8837f, + 95.5045f, 42.2665f, 60.9475f, -54.5273f, -154.2295f, + 44.2810f, -53.2856f, -76.4082f, 42.9736f, -9.5286f, + 83.7851f, 46.2184f, 4.1979f, -25.1575f, -51.0520f, + -43.1590f, -111.8518f, -2.3420f, -129.5042f, 6.3083f, + 36.5568f, 37.9981f, 30.8304f, -113.4959f, -79.9345f, + -1.8493f, -15.3605f, -7.7093f, 98.5986f, -37.6177f, + 29.8557f, 67.8956f, 39.3578f, 63.5122f, 23.6349f, + -27.0502f, -93.1902f, -21.6230f, 155.8476f, 2.5165f, + -44.7515f, 124.6855f, 64.1401f, 107.4525f, 76.4296f, + -5.6913f, 14.2025f, -18.3757f, 129.1303f, 47.2448f, + 88.4045f, 81.8179f, 106.0131f, 126.8375f, 71.9790f, + 5.1288f, -31.2676f, -85.3474f, 183.8293f, 137.8851f, + 112.3553f, 147.7620f, 6.3634f, -19.8307f, 97.9225f, + 68.1479f, 45.1480f, 20.4456f, 58.0360f, -109.0384f, + 91.7441f, 107.7617f, 15.1212f, 47.0576f, -18.7769f, + 0.0359f, -42.2360f, -42.2471f, 94.1364f, -132.5071f, + -36.3673f, 208.5491f, 17.4150f, 13.0281f, -33.9693f, + 75.8679f, 58.1435f, -27.7181f, 158.0312f, -17.2012f, + 159.6027f, 144.6236f, 31.6370f, -72.6323f, -59.9622f, + 9.6094f, -39.8213f, -175.1189f, 48.5059f, -67.6102f, + 8.4503f, 159.5329f, -43.0075f, -121.1605f, -83.4178f, + -10.0988f, 8.8687f, -32.4219f, 44.4166f, 5.5756f, + -42.8299f, 63.9306f, 20.2856f, 86.9213f, -32.1874f, + 14.3835f, -9.6605f, -102.7732f, 119.7146f, -5.8143f, + -181.8677f, 162.2914f, 114.1354f, 64.3820f, -7.2207f, + 11.2529f, -7.2901f, -66.7670f, 60.6365f, 71.2140f, + 69.9911f, 56.0744f, -10.7183f, 90.0489f, 100.9538f, + -40.2531f, -96.6451f, -154.5512f, 92.9078f, 43.9867f, + 146.6528f, -60.2643f, -42.7063f, -1.4891f, 60.9280f, + 38.2143f, 33.0628f, -113.9071f, -1.8860f, -48.5082f, + 45.4740f, 54.2829f, -45.4768f, -38.2865f, -114.7585f, + -5.4061f, -32.4176f, -108.6457f, -45.8426f, -147.6796f, + 41.4813f, 12.9066f, -41.5456f, -134.2382f, -189.2112f, + 46.4330f, 6.8074f, -160.9846f, 53.8969f, 64.9889f, + 149.8519f, 39.6080f, -79.5860f, 34.3934f, -61.0983f, + -47.2568f, -110.8652f, -117.2089f, -0.3717f, -64.7306f, + 109.4393f, 12.8368f, -59.4424f, -122.1797f, -31.4694f, + -14.4126f, 8.5189f, 89.4622f, 59.7035f, 14.3509f, + -23.3690f, -32.3486f, 92.0827f, -3.3169f, -16.0022f, + -66.1460f, -89.0215f, 49.1022f, -7.9295f, 141.6034f, + -91.8393f, 6.6528f, 142.3305f, -60.9383f, 61.1140f, + -9.9035f, -11.7998f, 27.9396f, 56.3528f, 60.7524f, + 59.7717f, -10.3224f, 100.1088f, 37.9471f, 56.4210f, + -8.0706f, -14.3273f, 18.7969f, -25.3479f, 97.6871f, + 24.5711f, 30.0075f, 106.4596f, -49.8085f, 48.5911f, + -50.4430f, -10.2232f, 15.4334f, 3.6211f, -45.0851f, + -2.3100f, 32.1923f, 14.7250f, -35.3260f, -71.2667f, + -131.2863f, -5.1029f, 11.0382f, 61.7451f, 35.4884f, + -11.6345f, 94.0117f, 53.4418f, -66.3264f, -6.6649f, + 57.0155f, 5.4850f, -4.4053f, 12.7554f, 23.6955f, + 74.8564f, 77.0331f, 21.2315f, -32.6182f, 33.2036f, + 9.1670f, -78.1914f, -30.2862f, -11.1652f, 54.5347f, + 47.7388f, 92.4139f, 41.3020f, -133.3741f, 53.0528f, + -22.2909f, -55.2830f, -33.2798f, -6.2896f, -28.8257f, + -23.1116f, -35.0033f, -3.2927f, -72.9685f, -7.7727f, + -82.3073f, -104.1028f, 84.5118f, -69.8221f, -43.1637f, + -19.5349f, -2.7976f, 85.8117f, -104.2825f, -27.2739f, + -22.1902f, -16.4648f, -6.6730f, -5.7920f, 27.7237f, + 12.5658f, 8.3566f, 24.7755f, -53.6096f, 12.7618f, + -53.5741f, -68.1802f, 40.6279f, -26.4454f, 38.0614f, + -26.1757f, -16.7503f, 52.0974f, -117.6298f, 86.4284f, + -45.3502f, -78.0491f, -31.6007f, -35.9389f, -106.1265f, + -24.8954f, -15.9989f, -21.2401f, -95.2454f, -86.1251f, + -112.2460f, -94.4001f, -19.4652f, -33.9923f, -34.6433f, + -95.7000f, 92.3440f, 39.8654f, -64.8912f, -115.0483f, + 25.8969f, 9.4794f, -63.2644f, -27.6289f, 36.9308f, + 25.6901f, 52.9741f, -35.3425f, -86.0458f, -14.2567f, + -38.4101f, -62.7105f, -86.5748f, -73.4519f, 11.4446f, + -7.0262f, 6.9787f, -7.4983f, -161.9427f, 3.4520f, + 19.1677f, 23.8207f, 38.9733f, 15.3764f, -21.7743f, + -43.1688f, 31.9400f, 52.7685f, -11.9674f, 20.1452f, + -35.0128f, -59.7929f, -36.1783f, 73.7702f, 71.2205f, + -83.5945f, 115.1128f, 46.5742f, -28.7420f, 110.8292f, + 0.6347f, 53.5489f, 14.3686f, 18.4025f, 71.1819f, + 35.9728f, 45.7217f, 71.9726f, -20.7319f, 145.8423f, + -8.1019f, -5.6290f, -13.8278f, 53.1928f, 152.8343f, + 57.0881f, 50.3240f, -64.1728f, -11.0774f, 129.9089f, + 36.0925f, 31.0887f, -32.6698f, 39.1693f, -52.3060f, + -3.1405f, 84.8560f, -12.4226f, 1.0655f, -18.3673f, + -58.9719f, 98.0129f, -83.8334f, 55.3139f, 35.7679f, + -87.3652f, 121.2513f, -67.0447f, -107.5562f, 38.2622f, + 62.0513f, 60.4638f, -69.1208f, 43.6854f, 20.7579f, + 79.9694f, 10.7071f, 3.2196f, -93.6621f, 75.1450f, + 66.1122f, 46.9324f, -124.5950f, -78.3322f, 41.3915f, + 4.3229f, 13.8757f, -33.6575f, -92.7601f, 177.5551f, + -42.5067f, -60.2164f, -63.5331f, 67.8862f, -21.5990f, + -14.9811f, 12.6046f, -39.5598f, -30.2755f, -22.9980f, + -80.2668f, -125.5028f, -37.7023f, 27.0213f, 31.0364f, + -121.0989f, 17.0095f, 6.9604f, -72.1639f, 13.2205f, + -45.0105f, -7.6587f, -57.9626f, -15.4159f, 79.2983f, + -11.3128f, 60.2083f, -11.6157f, -61.5281f, 64.7932f, + -17.6502f, -51.3289f, -123.9766f, -9.4275f, 141.7024f, + -64.4806f, -80.0931f, -43.9064f, -86.7513f, 103.4672f, + -12.6910f, -17.1597f, -58.5736f, 21.2452f, -75.2569f, + -2.3195f, -14.7279f, -99.6098f, -65.8753f, -44.8940f, + -103.7556f, 33.9613f, -73.7263f, -13.9038f, -66.1526f, + -23.2670f, -33.9743f, -103.9167f, -170.2949f, -66.2644f, + -26.4354f, -31.7233f, -108.7190f, 9.2282f, 14.7962f, + -9.0340f, -7.5327f, -60.7032f, -100.1385f, 55.1481f, + -23.7530f, -88.2969f, -220.5980f, -68.4569f, 27.6805f, + 3.3643f, -11.1758f, -92.5898f, -201.1381f, 102.8789f +}; + +/*-------------------------------------------------------------------* + * 2nd stage, 2nd split: ISF5 to ISF8 + *-------------------------------------------------------------------*/ + +const float dico22_isf_36b[] = +{ + -116.4826f, -2.3267f, 37.0276f, 11.9585f, + -83.2536f, -34.0855f, -47.5833f, 101.8900f, + 1.6666f, -19.3089f, 81.2133f, 5.5915f, + -50.2199f, -43.0204f, 11.8773f, 45.9389f, + -83.6736f, 100.7533f, 42.9626f, -91.7069f, + -15.8879f, -6.8432f, -49.2481f, 46.8567f, + 40.2748f, 25.3026f, 49.6150f, -14.6042f, + 49.1020f, -13.9172f, -9.5624f, 9.9442f, + -53.7549f, -26.0755f, -108.5515f, -72.7670f, + -64.1594f, -75.7696f, -78.4742f, 30.5700f, + -82.2540f, -34.1100f, -20.0480f, -86.1655f, + -68.0474f, -31.0203f, -36.5615f, -15.3976f, + 8.8102f, -2.3252f, -61.3614f, -93.8460f, + 8.4465f, -43.1451f, -59.6402f, -26.4485f, + 57.8873f, -1.8283f, -0.9150f, -58.1355f, + -0.3760f, -52.6396f, -15.1757f, -69.7872f, + 26.6552f, 140.6710f, -45.5320f, -5.9904f, + 53.5205f, 18.1777f, -108.7393f, 57.1700f, + 53.1281f, 101.4898f, 52.8254f, 25.2450f, + 23.9310f, 45.2712f, -17.5932f, 37.8318f, + 90.1549f, 147.8806f, 33.8829f, -46.8215f, + 132.2255f, 69.0079f, -106.1068f, 1.3402f, + 103.9284f, 60.8167f, 10.9874f, -26.8688f, + 101.6619f, 32.7808f, -33.2101f, 33.7802f, + -103.9522f, 60.0893f, -100.1459f, -71.1324f, + -6.7456f, -25.3835f, -118.9063f, -2.2439f, + -15.7859f, 68.4583f, -59.0835f, -70.2552f, + -10.4160f, 10.4323f, -34.1781f, -24.5999f, + 47.1747f, 44.4596f, -64.8288f, -183.2536f, + 62.0332f, -25.7788f, -126.3596f, -90.0926f, + 83.7341f, 59.4975f, -55.2472f, -82.6595f, + 53.3482f, 14.1273f, -71.7379f, -20.0471f, + -110.1113f, -92.4130f, 15.5809f, 3.7302f, + -18.8013f, -91.7902f, -14.6105f, 98.1369f, + -21.2096f, -126.2513f, 53.1438f, 11.3308f, + -34.3197f, -67.9178f, 83.0592f, 77.2733f, + -152.4262f, 38.6895f, -24.6967f, -146.6594f, + 41.7355f, -66.1454f, -64.2312f, 165.7005f, + 27.0772f, -43.2220f, 54.9943f, -65.1872f, + 28.8899f, -50.2606f, 25.5035f, 56.2652f, + -137.7163f, -80.7691f, -80.0014f, -42.7037f, + -62.3651f, -150.7820f, -138.8149f, 38.1900f, + -68.7802f, -192.5785f, -7.8749f, -55.9578f, + -98.5983f, -168.6083f, -0.7398f, 84.2329f, + -35.1656f, -67.9774f, -65.6374f, -160.6224f, + 4.9446f, -110.8514f, -89.3759f, -62.4133f, + -34.1288f, -108.8451f, 13.3702f, -98.1466f, + -29.4614f, -102.8405f, -22.8325f, -16.4528f, + 163.9105f, 20.5337f, -82.4577f, -139.6505f, + 149.8660f, -13.6016f, -146.1693f, 154.5116f, + 26.6673f, -89.2330f, 126.1283f, -0.6475f, + 65.0738f, -119.9143f, 75.1351f, 75.9130f, + 179.3039f, 128.5647f, -1.9070f, -129.8349f, + 146.4228f, 30.7058f, -2.7357f, 122.1955f, + 110.1199f, -48.4108f, 78.0568f, -35.8715f, + 105.8916f, -63.1848f, -27.3019f, 70.1234f, + -61.4940f, -116.2433f, -200.7709f, -120.8167f, + 22.5673f, -63.6047f, -213.1464f, 7.0661f, + 48.3577f, -141.9964f, 65.3628f, -93.1012f, + 32.5991f, -160.4748f, -45.5903f, 37.6377f, + 54.6730f, -43.7561f, -151.6335f, -243.7797f, + 101.1397f, -52.0073f, -123.8756f, 16.0909f, + 63.7439f, -50.8957f, -25.0308f, -130.5887f, + 88.2969f, -64.3814f, -48.5324f, -43.0123f, + -181.9705f, -24.0096f, 2.3863f, 89.5185f, + -59.5915f, 80.1714f, -56.6992f, 94.5562f, + -62.1659f, 18.9433f, 76.0160f, 57.8553f, + -22.4665f, 10.7743f, 12.0918f, 108.9830f, + -118.1671f, 72.3971f, 109.1443f, -1.3839f, + -23.8459f, 76.9232f, 22.9444f, 33.4435f, + -44.5975f, 47.9554f, 65.6020f, -20.3018f, + 13.6440f, 14.2271f, 38.9794f, 49.0774f, + -159.0490f, 40.0263f, -30.2347f, -15.6526f, + -132.0447f, -0.4802f, -133.5965f, 61.0673f, + -69.7882f, 40.8409f, -13.3128f, -38.0654f, + -72.3667f, 32.7089f, -13.7936f, 42.2054f, + -51.7645f, 41.9187f, -35.3954f, -139.3463f, + -70.4106f, 21.2248f, -89.5260f, 9.2659f, + -17.3511f, 18.5094f, 18.3073f, -71.0465f, + -25.6477f, 4.9120f, 17.7504f, 1.3904f, + -132.5788f, 97.9003f, 25.0501f, 88.4524f, + -16.3421f, 39.3618f, -136.5657f, 107.5423f, + -38.7664f, 155.3425f, 55.5880f, 47.1198f, + 43.2628f, 4.6910f, -39.9914f, 101.5498f, + 0.0830f, 197.2389f, 101.6377f, -36.9070f, + 62.8279f, 111.5018f, -37.6259f, 87.5036f, + -1.4618f, 80.2742f, 122.5196f, 12.8147f, + 65.1409f, 54.2334f, 34.3093f, 79.7332f, + -91.6271f, 123.5048f, -23.6092f, -9.5877f, + -3.2208f, -58.6010f, -121.8443f, 78.4266f, + -14.0112f, 114.0430f, 23.9902f, -40.4777f, + -15.4729f, 68.1635f, -63.4068f, 16.5519f, + -8.1780f, 157.1093f, -11.2800f, -137.0649f, + 8.0606f, 59.4657f, -140.5838f, -36.3320f, + 22.2676f, 74.5499f, 82.8755f, -76.6792f, + 29.5054f, 61.7793f, -8.0867f, -27.0956f, + -128.1797f, -72.1649f, 129.2723f, 46.4323f, + -20.7709f, 111.3353f, 22.0263f, 131.4695f, + -41.9162f, -9.2182f, 158.1064f, 11.2798f, + -7.1545f, 53.6140f, 106.2812f, 108.0610f, + -99.5471f, 8.6443f, 67.7713f, -74.7187f, + 115.0857f, 125.6656f, 126.8208f, 118.1528f, + 8.3489f, -10.6246f, 129.8214f, -69.4937f, + 46.4587f, 5.2711f, 105.7244f, 50.4485f, + -177.6754f, -70.1548f, 45.4547f, -74.5236f, + -88.7724f, 24.0424f, -57.8465f, 204.7888f, + -68.8890f, -112.1224f, 110.3182f, -61.1447f, + -94.7905f, 5.0186f, 77.6790f, 167.9779f, + -23.0125f, -19.1513f, 44.8958f, -142.4394f, + 28.0225f, -67.2659f, -53.6584f, 36.2990f, + -54.0239f, -49.3550f, 55.1522f, -32.8946f, + 2.0792f, -48.4861f, 14.9542f, -7.9957f, + -100.8337f, 121.3744f, 234.8044f, 83.3187f, + 36.5393f, 50.8425f, -23.7400f, 196.1698f, + -0.3059f, -61.1762f, 189.5078f, 122.4017f, + 57.0232f, -28.8934f, 61.7134f, 134.6930f, + 107.9555f, 52.8736f, 109.5032f, -22.1311f, + 191.2912f, 98.4213f, 38.7853f, 16.9729f, + 104.1509f, -28.9315f, 167.6925f, 40.9011f, + 108.7356f, -8.7976f, 46.5837f, 36.6080f, + -211.7768f, 190.5028f, 100.4753f, -45.0833f, + -32.7791f, -95.3684f, -171.2339f, 186.7766f, + -44.0395f, -212.9286f, 151.2602f, 39.5958f, + -37.2152f, -119.5092f, 43.4460f, 194.5965f, + 37.2023f, 64.8673f, 8.5289f, -117.5366f, + 163.8890f, -5.9760f, -22.5312f, -30.3817f, + 105.4272f, 11.3735f, 47.6228f, -110.1422f, + 62.3479f, -93.6059f, 19.4353f, -14.9112f +}; + +/*-------------------------------------------------------------------* + * 2nd stage, 3rd split: ISF9 to ISF15 + *-------------------------------------------------------------------*/ + +const float dico23_isf_36b[] = +{ + 31.6601f, -7.0021f, 26.7324f, -10.6919f, -47.7440f, -109.3316f, -1.6793f, + 17.6152f, -69.1639f, 81.7745f, -11.6557f, -53.0002f, -28.8501f, 51.3155f, + -17.3392f, 39.6296f, -29.4208f, -34.2716f, -18.7475f, -53.4279f, -21.0682f, + -95.6211f, -11.0108f, 24.5639f, -6.9345f, -43.8606f, -40.3930f, 22.5841f, + -30.9469f, -2.2484f, 85.8968f, -25.2118f, 44.4649f, -13.7549f, -19.6283f, + 42.5807f, -25.3893f, 55.9790f, -44.6039f, 50.3451f, 29.5180f, 49.0040f, + 64.7422f, 35.0105f, -24.0120f, -94.6131f, 72.4785f, -29.0560f, -16.8213f, + -17.7762f, -36.1097f, 19.1423f, -88.8131f, 9.4121f, -60.6212f, 15.2182f, + 26.1194f, 33.0214f, 38.6243f, -16.4898f, 20.5108f, -71.7754f, -109.7775f, + 55.6133f, -47.5797f, 0.0746f, 8.1716f, -55.6639f, -5.8260f, -6.7666f, + 86.9148f, 36.0665f, -8.0422f, -18.6522f, -31.9936f, -5.4779f, -65.2340f, + 20.0656f, -14.5303f, -94.7449f, -11.7982f, -35.2031f, 6.9138f, -22.0461f, + 20.9060f, 41.0458f, 29.0299f, 33.4933f, 27.0675f, 5.1646f, -39.4529f, + 76.7175f, 28.2216f, -34.8562f, 16.7304f, 25.2291f, 7.4912f, 15.3906f, + 47.1053f, 13.3625f, 50.9902f, -31.9588f, 9.8596f, 83.1329f, -61.0081f, + 39.4355f, -39.6936f, -53.1235f, -8.1282f, 22.3882f, 83.7131f, 8.6440f, + 13.9302f, -48.4179f, 80.1925f, 79.6573f, 22.8321f, -61.0888f, -32.5848f, + 32.2601f, -45.5857f, 53.4300f, 53.4773f, 33.0895f, 45.4420f, 17.2865f, + -36.0406f, -57.6566f, -26.6841f, 4.2674f, -39.8452f, -76.9236f, -85.9930f, + -29.8696f, -72.1261f, -22.6802f, 51.6689f, -10.3407f, -71.6716f, 33.3209f, + -2.6190f, -11.9459f, -0.7138f, 9.1651f, 80.0695f, -58.7987f, 3.7833f, + -10.6521f, -14.2910f, -1.7854f, -6.9002f, 114.1547f, 51.0851f, 0.4936f, + 45.5988f, -65.6262f, 3.5076f, -36.3037f, 31.3412f, -22.8916f, -48.6823f, + -71.1623f, -95.4642f, 38.3287f, -9.4939f, 52.9002f, -8.4421f, 36.7283f, + 86.2675f, 37.9505f, 41.2317f, 16.4269f, 16.7260f, -62.6682f, 32.6168f, + 9.9181f, -25.0994f, -8.3770f, 2.2985f, 5.3157f, -6.0428f, 60.1555f, + 49.0247f, 6.0545f, -54.7919f, 58.6261f, -3.9732f, -80.9565f, -44.3777f, + 30.6734f, -24.5101f, -82.4513f, -27.4901f, -10.8146f, -84.7650f, 64.6334f, + 18.0553f, 14.7350f, -8.7675f, 109.6707f, 51.4393f, -24.1075f, 42.7732f, + 43.6601f, 21.1278f, -43.7223f, -36.3814f, 81.3688f, 10.3561f, 115.5857f, + 44.7304f, 4.0203f, -57.4008f, 16.1462f, 84.4927f, 16.5958f, -107.7931f, + 19.3887f, -44.8683f, -99.3061f, 65.1051f, 45.6203f, -0.6984f, 23.6828f, + 6.4828f, 56.2769f, 13.3073f, -28.0424f, -72.7066f, -58.5212f, 106.1769f, + -11.1674f, -25.7849f, -34.9574f, -36.9812f, -58.1843f, 50.2182f, 98.0044f, + 47.6759f, 0.1786f, -19.4605f, -91.2611f, -35.5267f, 13.8815f, 10.2127f, + -41.1350f, -39.8329f, -34.1829f, -47.4437f, -91.9939f, -2.6788f, -4.2821f, + -79.6033f, 42.6213f, 2.0653f, -74.4526f, 41.0602f, -5.7905f, 63.6539f, + -31.4071f, 12.4383f, -9.2647f, -81.5461f, 16.0430f, 114.6936f, 27.3863f, + -41.2719f, -36.6253f, -79.4997f, -46.2467f, 46.8034f, -19.4146f, -14.6126f, + -31.9554f, -93.9975f, 17.8233f, -51.0152f, -11.4389f, 58.4455f, -21.6241f, + 12.9670f, 60.7166f, 46.9564f, -34.6928f, -3.1553f, 2.7762f, 24.2978f, + 83.1108f, 31.8670f, 23.6533f, 6.8663f, -63.0785f, 56.1031f, 59.2073f, + 11.6877f, 51.3190f, 25.3083f, -33.9761f, -99.5482f, -6.6294f, -41.7488f, + -3.1041f, 33.3329f, -24.8851f, 20.0947f, -63.3399f, 87.2565f, -20.6208f, + -52.2549f, 102.0059f, 26.9280f, -22.0208f, 85.2782f, 28.3108f, -43.2782f, + 0.8584f, 60.5987f, -44.2357f, -33.9700f, 19.1247f, 33.1631f, -10.8275f, + -63.5371f, 16.2471f, -0.2828f, -76.6458f, 2.8322f, 15.2373f, -95.8412f, + 5.5912f, -53.4989f, -30.8518f, 4.1365f, -62.3116f, 79.0018f, -114.5611f, + -36.8596f, 12.7812f, 81.1609f, 39.2434f, 21.9162f, -17.2064f, 127.1804f, + -30.4279f, -15.8549f, 90.5057f, 4.9324f, -55.6202f, 88.7264f, 31.2457f, + -6.4338f, -33.9992f, 78.4675f, 12.7460f, -51.8920f, 5.7002f, -71.3454f, + -22.6305f, -75.0886f, -18.4430f, 71.6854f, -49.9613f, 51.9112f, 38.5919f, + -80.1990f, 4.2373f, -60.6613f, 30.4453f, 20.4006f, 28.0162f, 55.1546f, + -96.2887f, 10.3433f, 38.5883f, 59.1444f, 23.2247f, 45.0000f, -24.9305f, + -30.9055f, -18.2692f, -6.1201f, -5.6460f, 2.1550f, 18.2502f, -16.8166f, + -28.0966f, -69.3654f, -10.5762f, 63.4193f, 43.8444f, 16.6643f, -67.9380f, + -68.3269f, 93.1501f, 72.8030f, 27.6125f, -21.1484f, -73.4926f, -29.7929f, + -88.0045f, 91.0304f, 15.1885f, -15.1144f, -61.6391f, 47.5526f, 17.2017f, + -10.0973f, 16.8435f, 32.7608f, 50.6231f, -36.3173f, -19.8196f, 8.7833f, + 1.1920f, 35.7643f, -58.4480f, 53.1925f, -71.1458f, -22.3426f, 37.8118f, + -51.2779f, 69.9477f, -30.3236f, 31.2621f, 35.5419f, -64.6025f, 35.1224f, + -0.6572f, 57.9364f, 5.6749f, 50.6782f, 25.3456f, 68.4492f, 45.6955f, + -53.8176f, 44.6419f, -53.4407f, 51.5645f, 1.3456f, -4.0462f, -72.5604f, + 54.6610f, -1.6150f, -14.3009f, 99.1775f, -24.2467f, 36.0557f, -42.7052f +}; + +/*-------------------------------------------------------------------* + * AMR-WB ISF codebook for SID - 28bits, 1 stage, 5 splits + * + * codebook vector dimension number of vectors + * ~~~~~~~~ ~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~ + * 1 2 64 + * 2 3 64 + * 3 3 64 + * 4 4 32 + * 5 4 32 + *-------------------------------------------------------------------*/ + +/*-------------------------------------------------------------------* + * 1st stage, 1st split: ISF0 to ISF1 + *-------------------------------------------------------------------*/ + +const float dico1_ns_28b[64*2] = +{ + -105.0619f, -262.8448f, + -86.6322f, -209.7320f, + -91.1931f, -168.0481f, + -53.8753f, -176.1473f, + -82.7923f, -129.2635f, + -75.0845f, -93.9859f, + -33.9476f, -90.3333f, + -74.4463f, -50.0451f, + -27.3422f, -41.3458f, + -64.0658f, -2.5361f, + 28.8179f, -70.0786f, + 10.5059f, -12.8463f, + -39.9581f, 28.7359f, + -63.4034f, 44.7503f, + -36.8732f, 67.0368f, + -2.3563f, 50.6058f, + -55.9412f, 91.2822f, + 5.5577f, 85.1171f, + -25.2586f, 105.6009f, + 34.3216f, 71.1726f, + -48.3043f, 133.1605f, + -17.0366f, 148.8321f, + 14.8305f, 130.6908f, + 45.5592f, 106.8464f, + -43.7865f, 177.4889f, + 28.9675f, 168.2081f, + -1.7812f, 190.4731f, + 68.4806f, 149.8876f, + -32.5396f, 218.9960f, + 47.8438f, 206.6539f, + 8.1960f, 234.8430f, + 89.3668f, 188.0221f, + 90.4035f, 118.3064f, + 88.4263f, 237.5410f, + 117.3136f, 145.4498f, + 82.0645f, 73.1093f, + 119.3943f, 103.4796f, + 128.2321f, 184.8528f, + 149.1563f, 129.2199f, + 144.9058f, 51.5776f, + 54.4305f, 22.6608f, + 142.5451f, 8.2812f, + 97.4966f, -31.8767f, + 173.0963f, 84.9898f, + 188.5170f, 42.9719f, + 166.5772f, 162.2136f, + 226.1740f, 86.5496f, + 202.2992f, 129.9512f, + 223.9365f, 175.1483f, + 177.6235f, 206.6174f, + 267.4435f, 128.4469f, + 129.8694f, 226.5438f, + 232.5047f, 231.7147f, + 182.8960f, 252.1132f, + 297.7026f, 201.9668f, + 127.2108f, 277.0716f, + 189.5906f, 309.6084f, + 50.8926f, 267.2207f, + 262.1367f, 287.8791f, + 138.4480f, 342.2196f, + 34.3804f, 314.8025f, + -25.4771f, 275.9066f, + -13.5804f, 397.0122f, + 103.9035f, 438.8237f +}; + +/*-------------------------------------------------------------------* + * 1st stage, 2ndt split: ISF2 to ISF4 + *-------------------------------------------------------------------*/ + +const float dico2_ns_28b[64*3] = +{ + -322.0252f, -345.3659f, -370.7835f, + -314.5226f, -178.1928f, -163.4712f, + -172.6074f, -171.2812f, -211.3224f, + -84.6538f, -225.6710f, -309.6982f, + -65.7865f, -173.3148f, -227.1618f, + -112.2154f, -192.0593f, -106.9376f, + -215.4487f, -115.9810f, -117.3159f, + -63.6069f, -129.9179f, -139.6890f, + -144.6460f, -90.4563f, -90.4457f, + -68.4568f, -140.0307f, -62.0772f, + -148.8729f, -8.2807f, -139.6018f, + -71.8488f, -61.9658f, -63.2677f, + -20.5518f, -74.4279f, -109.2530f, + 7.0237f, -104.2936f, -83.9866f, + -53.7369f, 23.9918f, -110.5212f, + 27.5927f, -37.1603f, -114.8537f, + 5.1437f, -60.8316f, -213.2375f, + -0.0302f, -32.5161f, -30.9893f, + 17.0532f, 37.8947f, -123.4512f, + 69.4656f, -20.4364f, -83.2673f, + 86.8486f, -101.9140f, -164.6497f, + 92.7595f, -46.0582f, -17.0665f, + 55.0807f, 56.5797f, -51.6089f, + 141.9268f, 31.5952f, -111.9348f, + 83.1350f, 25.3995f, 13.2634f, + -41.6305f, 36.7624f, -1.8806f, + 35.5619f, -11.1360f, 49.0468f, + -138.6944f, 20.1165f, -16.0470f, + -85.7227f, -29.5173f, 56.5419f, + -24.5306f, 39.2035f, 95.3233f, + -280.8913f, 17.3520f, 10.4723f, + -223.4287f, -48.5814f, 60.3781f, + -165.0790f, 52.0898f, 122.9863f, + -358.1462f, 27.5800f, 87.6394f, + -104.6460f, 124.2969f, 51.2676f, + -36.4609f, -74.1586f, 163.9110f, + -38.0255f, 47.6372f, 191.7725f, + -30.7896f, 123.7246f, 138.8302f, + 50.7064f, 39.0454f, 126.9589f, + 33.4334f, -114.5499f, 82.0810f, + 52.0289f, 100.6551f, 62.9260f, + 68.9398f, -28.6776f, 181.7511f, + 76.3353f, 117.0400f, 150.0834f, + 135.9951f, 8.5581f, 86.5077f, + 146.9219f, 71.3024f, 159.6375f, + 147.3144f, 111.7858f, 78.8838f, + 94.6612f, 83.2958f, 257.4856f, + 100.5727f, 220.5308f, 96.9196f, + 134.4751f, 159.3021f, -29.6067f, + 158.3509f, 171.9108f, 198.9399f, + 238.9283f, 150.3837f, 148.0492f, + 209.2346f, 237.2747f, 84.4977f, + -21.9723f, 227.3437f, 75.1847f, + 39.1823f, 202.0239f, 221.5619f, + -142.6753f, 174.8218f, 173.9311f, + 284.1931f, 135.5243f, 4.0420f, + 197.3545f, 139.2970f, 296.6173f, + 248.5921f, 227.1523f, 257.1579f, + 130.8344f, 201.7665f, 332.6679f, + 147.8451f, 316.0691f, 223.3704f, + -76.1983f, 342.8470f, 323.9619f, + 206.5931f, 276.1481f, 385.6192f, + 358.4664f, 283.4258f, 153.2502f, + 488.2212f, 389.4155f, 415.1465f +}; + +/*-------------------------------------------------------------------* + * 1st stage, 3rd split: ISF5 to ISF7 + *-------------------------------------------------------------------*/ + +const float dico3_ns_28b[64*3] = +{ + -314.4522f, -327.3454f, -302.2017f, + -203.9117f, -244.9068f, -323.6309f, + -186.2536f, -189.6962f, -235.4297f, + -115.3995f, -187.7246f, -247.4612f, + -142.8871f, -150.1942f, -153.3509f, + -72.7072f, -161.6552f, -154.8560f, + -92.6058f, -153.8863f, -41.3953f, + -98.5994f, -78.7129f, -107.5332f, + -23.9335f, -69.1898f, -172.7805f, + -32.7960f, -77.3107f, -77.6193f, + -69.7610f, -48.7327f, -12.2728f, + -28.2008f, -18.3660f, -63.7045f, + -116.3960f, -85.9584f, 84.0164f, + -24.9241f, -65.7832f, 98.1712f, + -51.8131f, 60.9599f, -23.0835f, + -11.5386f, -0.7831f, 49.5084f, + 20.9367f, 25.8838f, -24.0191f, + -91.0503f, 8.0161f, 98.1430f, + 81.8089f, -19.4694f, 12.5661f, + 12.6976f, 75.6776f, 53.0320f, + -45.8943f, -7.2062f, 185.7293f, + 78.8625f, 17.9396f, 120.6767f, + 99.9111f, 72.2135f, 20.5674f, + 13.7143f, 77.9979f, 152.4088f, + 78.0738f, 102.8484f, 94.6295f, + -84.5040f, 118.1050f, 114.7064f, + 50.0596f, 139.6647f, -0.1577f, + 7.5966f, 168.3675f, 112.1363f, + 87.3316f, 174.4695f, 109.2434f, + 143.4298f, 64.6162f, 83.1959f, + 155.2307f, 122.7478f, 124.7551f, + 149.4719f, 147.9446f, 29.2261f, + 108.3426f, 127.0695f, 180.3353f, + 153.8867f, 197.0929f, 130.5922f, + 98.1956f, 38.2729f, -83.1688f, + 175.9048f, 59.9165f, 174.8273f, + 220.7233f, 88.4354f, 29.6527f, + 183.5505f, 149.7702f, 195.9197f, + 248.2375f, 152.2900f, 108.7161f, + 92.6034f, 52.6123f, 242.1773f, + 133.7155f, 156.6441f, 253.6524f, + 129.4868f, 215.2826f, 202.4702f, + 50.8526f, 163.2149f, 231.3041f, + 207.4225f, 119.3517f, 287.7008f, + 284.9414f, 152.0429f, 226.6699f, + 194.1092f, 217.5607f, 272.9373f, + 115.7381f, 149.7147f, 341.2299f, + 110.4872f, 243.8135f, 296.4818f, + 49.2583f, 242.9759f, 185.7527f, + 218.4281f, 232.2570f, 184.3956f, + 149.3219f, 300.8763f, 240.4531f, + 280.7402f, 239.3506f, 291.1599f, + 210.7589f, 249.5308f, 362.4219f, + 201.8519f, 322.7530f, 312.7221f, + 267.0336f, 316.7373f, 236.0985f, + 293.8933f, 307.2101f, 334.8007f, + 364.5740f, 258.0872f, 136.8430f, + 271.0491f, 175.6599f, 414.3537f, + 219.3663f, 355.8581f, 410.6574f, + 321.8781f, 317.4617f, 431.4073f, + 295.9753f, 408.9221f, 344.4007f, + 445.2552f, 358.3636f, 347.1212f, + 405.7584f, 486.9081f, 556.9660f, + 579.1823f, 650.5953f, 732.6415f +}; + +/*-------------------------------------------------------------------* + * 1st stage, 4th split: ISF8 to ISF11 + *-------------------------------------------------------------------*/ + +const float dico4_ns_28b[32*4] = +{ + -303.1361f, -333.7803f, -347.8725f, -359.4826f, + -215.7523f, -238.3714f, -259.0660f, -289.4405f, + -125.2913f, -144.5697f, -186.1030f, -220.5702f, + 107.0201f, -62.5400f, -178.2959f, 78.3558f, + 103.6377f, 26.1626f, -62.5396f, -119.5691f, + -2.9518f, -82.1288f, 30.9020f, 106.1641f, + 63.5315f, 92.0127f, 120.0751f, 120.2205f, + 225.8191f, 123.6829f, 24.8449f, 116.4136f, + -3.5121f, 76.7992f, 133.5771f, 242.3746f, + 133.9970f, 90.5385f, 122.6116f, 242.8362f, + 67.7067f, 58.1366f, 214.2467f, 205.7587f, + 139.2159f, 144.6370f, 188.0780f, 146.8699f, + 52.7259f, 173.3530f, 190.5093f, 217.0651f, + 152.5843f, 183.9790f, 190.4016f, 255.0127f, + 89.0815f, 165.5783f, 224.8295f, 325.9805f, + 164.7109f, 145.4724f, 282.2096f, 266.3416f, + 115.0926f, 262.9259f, 270.8098f, 248.1893f, + 210.4561f, 232.8534f, 230.5395f, 175.4710f, + 185.5563f, 241.3006f, 257.2568f, 319.6433f, + 287.0131f, 201.7823f, 191.6938f, 262.7153f, + 234.9706f, 135.0743f, 100.3842f, 342.4814f, + 244.1460f, 248.1535f, 331.5106f, 281.3059f, + 283.8415f, 319.6996f, 272.8347f, 232.3501f, + 255.2254f, 187.9562f, 269.5668f, 445.0594f, + 318.1439f, 297.7580f, 274.9042f, 354.5264f, + 198.0688f, 291.9682f, 350.7645f, 365.4872f, + 331.2469f, 333.9341f, 361.1275f, 306.5865f, + 252.3140f, 405.2271f, 344.4444f, 310.3618f, + 301.5996f, 329.9839f, 399.8752f, 449.5998f, + 442.5639f, 384.1796f, 319.3500f, 359.8945f, + 367.3365f, 417.2813f, 488.9795f, 508.7549f, + 620.4818f, 690.0919f, 671.0975f, 590.9387f +}; + +/*-------------------------------------------------------------------* + * 1st stage, 5th split: ISF12 to ISF15 + *-------------------------------------------------------------------*/ + +const float dico5_ns_28b[32*4] = +{ + -316.2941f, -343.3920f, -368.9643f, -99.0392f, + 97.0450f, 71.7080f, 262.1754f, 50.0767f, + 112.4468f, 274.7287f, 358.7211f, 38.6232f, + 257.1795f, 217.8952f, 258.6022f, 85.4104f, + 215.6079f, 228.7031f, 355.6118f, 81.4276f, + 218.4167f, 314.1638f, 296.3636f, 46.5526f, + 236.5851f, 302.2603f, 359.7074f, -54.3647f, + 305.5962f, 297.4161f, 292.2765f, 81.3061f, + 295.4005f, 276.4861f, 384.1555f, 21.9038f, + 212.3865f, 337.6641f, 394.4713f, 59.4888f, + 287.8841f, 272.8244f, 385.4754f, 116.6899f, + 301.1416f, 360.9641f, 343.2708f, 40.2882f, + 209.5407f, 306.5670f, 375.3650f, 158.1632f, + 260.4655f, 357.6203f, 312.8495f, 128.1323f, + 288.3843f, 275.2455f, 301.9735f, 171.2988f, + 321.4736f, 340.3829f, 387.3967f, 138.5811f, + 250.1021f, 392.3276f, 410.9932f, 144.0109f, + 282.6727f, 320.9480f, 370.8150f, 233.3823f, + 161.9622f, 255.8086f, 284.8333f, 188.2323f, + 393.9827f, 349.8717f, 309.8297f, 141.6719f, + 354.6675f, 313.7792f, 268.4562f, -9.8681f, + 396.7580f, 327.4283f, 395.0635f, 73.8789f, + 369.8889f, 434.5653f, 367.9579f, 86.8706f, + 356.9169f, 409.7761f, 383.1727f, 205.7493f, + 373.4236f, 385.5478f, 394.8253f, -47.0644f, + 305.1456f, 409.5952f, 437.7072f, 36.1164f, + 460.1152f, 411.4012f, 345.2657f, 18.4203f, + 438.6750f, 413.5906f, 461.8582f, 46.2207f, + 364.6111f, 379.8415f, 498.6693f, 139.3899f, + 433.1401f, 358.6805f, 429.9292f, 196.6537f, + 405.9484f, 502.2995f, 476.5874f, 123.6977f, + 527.5430f, 471.6736f, 394.4862f, 127.2615f +}; + + +const float * const lsf_means[2] = { means_wb_31bits_ma_lsf, means_nb_31bits_ma_lsf }; + +const lsp_unw_triplet p16_gamma0_92to1[16] = +{ + { 0.00000f, 1.19764f, -0.59173f }, + { -0.91173f, 1.79182f, -0.80921f }, + { -0.51779f, 1.44703f, -0.81871f }, + { -0.44862f, 1.36777f, -0.75103f }, + { -0.45150f, 1.30719f, -0.74220f }, + { -0.43157f, 1.21326f, -0.68538f }, + { -0.43606f, 1.21317f, -0.69131f }, + { -0.39200f, 1.04941f, -0.58674f }, + { -0.45208f, 1.10009f, -0.59175f }, + { -0.42553f, 0.99725f, -0.49992f }, + { -0.50168f, 1.07575f, -0.51401f }, + { -0.49800f, 1.06563f, -0.50592f }, + { -0.53101f, 1.16372f, -0.58033f }, + { -0.48744f, 1.07596f, -0.52531f }, + { -0.51899f, 1.04998f, -0.49495f }, + { -0.47730f, 0.90959f, 0.00000f } +}; + +const lsp_unw_triplet p16_gamma0_94to1[16] = +{ + { 0.00000f, 0.78925f, -0.38537f }, + { -0.57154f, 1.19486f, -0.54136f }, + { -0.33642f, 0.99096f, -0.56792f }, + { -0.29856f, 0.93785f, -0.51255f }, + { -0.29716f, 0.89303f, -0.50509f }, + { -0.28264f, 0.81530f, -0.46020f }, + { -0.27926f, 0.80997f, -0.46378f }, + { -0.25334f, 0.69596f, -0.38969f }, + { -0.29656f, 0.72916f, -0.38888f }, + { -0.27488f, 0.65949f, -0.32999f }, + { -0.32630f, 0.70913f, -0.33659f }, + { -0.33069f, 0.70668f, -0.33105f }, + { -0.35437f, 0.77582f, -0.38003f }, + { -0.31771f, 0.70752f, -0.34216f }, + { -0.35066f, 0.70177f, -0.31664f }, + { -0.33404f, 0.62528f, 0.00000f } +}; + +const float dico_lsf_abs_8b[256*M] = +{ + 377.3749f, 688.0079f, 1147.3799f, 1461.0438f, 1786.7794f, 2143.6711f, 2522.1946f, 2889.7402f, 3263.6023f, 3628.4624f, 4005.4351f, 4379.4170f, 4783.9556f, 5157.1753f, 5555.1797f, 5926.6816f, + 601.5123f, 1066.8242f, 1384.3585f, 1652.9448f, 1978.3910f, 2311.2676f, 2674.0537f, 3010.3896f, 3360.0623f, 3725.9336f, 4093.3335f, 4470.6431f, 4859.1006f, 5210.4717f, 5598.3716f, 5954.4204f, + 552.5036f, 859.7047f, 1355.2023f, 1624.9041f, 1887.5609f, 2173.1638f, 2540.7429f, 2926.8169f, 3323.2173f, 3680.7197f, 4008.3447f, 4330.8442f, 4692.8228f, 5033.9697f, 5443.3467f, 5875.4497f, + 459.4534f, 793.3189f, 1293.7278f, 1617.3970f, 1920.0642f, 2192.2153f, 2487.5627f, 2772.1514f, 3111.3823f, 3461.2671f, 3867.0176f, 4279.8550f, 4741.0664f, 5141.0181f, 5552.8237f, 5933.6934f, + 327.9834f, 430.4954f, 723.9031f, 1528.6172f, 1763.1125f, 2013.7936f, 2334.2153f, 2569.0334f, 3017.9436f, 3308.0610f, 3591.7820f, 3865.5430f, 4693.5786f, 5286.7646f, 5647.7036f, 5987.2305f, + 455.0753f, 606.0817f, 963.7564f, 1374.9937f, 1536.4897f, 1914.7618f, 2376.9631f, 2580.8184f, 2989.1501f, 3258.8386f, 3485.1460f, 3741.1270f, 4297.4912f, 5207.3779f, 5672.3818f, 5980.5322f, + 434.9507f, 558.8508f, 890.7061f, 1355.7625f, 1552.6155f, 1895.7960f, 2222.5579f, 2502.6079f, 2841.8738f, 3137.5264f, 3367.7336f, 3860.7769f, 4795.2554f, 5090.9370f, 5421.8218f, 5874.4287f, + 281.0164f, 404.5417f, 729.2898f, 997.1851f, 1699.8862f, 1961.3673f, 2255.7202f, 2540.9187f, 2804.4553f, 3057.1843f, 3750.2288f, 4340.9893f, 4716.8647f, 5002.7471f, 5477.2998f, 5965.7402f, + 372.2410f, 505.3570f, 762.3755f, 997.3586f, 1174.4255f, 1986.1741f, 2368.1367f, 2624.1733f, 3194.6084f, 3403.2793f, 3877.7622f, 4425.7676f, 4824.7837f, 5158.1606f, 5532.7466f, 5893.5483f, + 367.3766f, 501.1806f, 824.5358f, 1090.6857f, 1271.9792f, 1527.7137f, 2381.4382f, 2694.4634f, 2964.5359f, 3639.4832f, 3946.4038f, 4254.3916f, 4645.8076f, 5033.5396f, 5373.8735f, 5878.4385f, + 229.4505f, 352.5671f, 701.0831f, 1226.4518f, 1678.3601f, 1895.7949f, 2140.0664f, 2526.5515f, 3080.3391f, 3297.8284f, 3845.3987f, 4427.9785f, 4704.4551f, 4997.4155f, 5434.0698f, 5918.4785f, + 336.3082f, 516.7915f, 881.9847f, 1272.5824f, 1505.1870f, 1880.7520f, 2274.9458f, 2611.0083f, 3126.5256f, 3655.5332f, 4183.3877f, 4668.2993f, 5004.0029f, 5305.3491f, 5650.4985f, 5943.7383f, + 296.0867f, 469.6519f, 956.5997f, 1224.1262f, 1443.0049f, 1727.6880f, 2216.1677f, 2689.3677f, 3060.4456f, 3520.9438f, 3916.6050f, 4343.7954f, 4763.8906f, 5156.0132f, 5553.8115f, 5936.9634f, + 407.1503f, 577.5120f, 839.7361f, 1455.3907f, 1665.2137f, 1935.0054f, 2398.0537f, 2652.2605f, 3111.1831f, 3505.5962f, 3766.7554f, 4204.8730f, 4699.1631f, 4970.8652f, 5295.5962f, 5695.6919f, + 281.0083f, 361.8386f, 950.9102f, 1464.1158f, 1634.7019f, 1965.4950f, 2211.1406f, 2662.1055f, 2846.0122f, 3585.8884f, 4048.7148f, 4358.9150f, 4683.8755f, 5046.0908f, 5400.0859f, 5956.1040f, + 279.1811f, 393.9142f, 876.8306f, 1502.2417f, 1673.0590f, 2288.7161f, 2545.3674f, 3028.9507f, 3517.5840f, 3824.4246f, 4144.8486f, 4481.8140f, 4821.2769f, 5162.3975f, 5542.8560f, 5928.5854f, + 379.7892f, 500.9199f, 725.0223f, 998.7143f, 1179.6127f, 1771.9886f, 2775.4812f, 3136.8457f, 3378.6143f, 3674.0188f, 3946.3604f, 4184.4824f, 4521.5454f, 4934.8940f, 5315.5029f, 5759.7544f, + 317.4339f, 442.2628f, 778.7388f, 1167.8633f, 1356.1576f, 1578.5603f, 1840.1584f, 2870.7527f, 3236.1504f, 3502.7249f, 3876.3696f, 4100.5244f, 4650.2632f, 5235.1890f, 5665.2285f, 5999.0649f, + 350.2696f, 492.2163f, 763.0640f, 1264.7550f, 1515.0244f, 1755.7783f, 2489.3274f, 2898.6252f, 3143.1018f, 3643.0640f, 4035.0657f, 4255.0889f, 4641.7231f, 5138.5107f, 5557.1318f, 5920.2402f, + 301.3833f, 464.9852f, 762.3419f, 1012.2126f, 1803.5172f, 2192.4214f, 2651.6287f, 3013.6697f, 3251.3591f, 3539.4675f, 3946.3433f, 4469.3560f, 4890.7446f, 5200.4878f, 5509.6753f, 5910.2397f, + 253.1752f, 356.8990f, 630.3325f, 1163.1683f, 1528.6230f, 2023.4438f, 2488.6001f, 2745.5627f, 2933.7024f, 3237.4414f, 3976.9258f, 4415.2534f, 4789.9131f, 5194.3423f, 5714.6445f, 6032.4160f, + 265.1815f, 364.7549f, 590.0148f, 805.2595f, 1564.7582f, 2150.6536f, 2365.6501f, 2598.7876f, 2861.5334f, 3514.1265f, 4005.6328f, 4609.3091f, 4955.4478f, 5238.4116f, 5519.5884f, 5890.7925f, + 209.3544f, 313.1497f, 503.2642f, 949.4504f, 1729.7280f, 1912.6814f, 2117.5051f, 2498.6272f, 3284.6587f, 3810.8555f, 4105.0195f, 4349.5151f, 4770.3682f, 5210.2910f, 5585.1533f, 5970.3638f, + 302.3150f, 415.6502f, 684.1018f, 922.3598f, 1489.4418f, 2235.6252f, 2449.9773f, 2800.6938f, 3061.3721f, 3526.1001f, 3905.8174f, 4170.7891f, 4446.4209f, 4907.9937f, 5470.7158f, 5914.7261f, + 264.9068f, 366.4342f, 582.8182f, 790.8568f, 1619.4548f, 2034.0782f, 2337.6724f, 2632.1714f, 2933.2356f, 3430.1858f, 3815.0198f, 4276.3931f, 4748.3149f, 5164.0098f, 5553.3320f, 5974.9092f, + 249.6359f, 361.9234f, 581.9844f, 841.1097f, 1657.5543f, 2184.4114f, 2525.9739f, 2820.0503f, 3120.7190f, 3623.7678f, 4050.5435f, 4434.5742f, 4802.6782f, 5171.8438f, 5575.0068f, 5963.7402f, + 290.1085f, 404.2538f, 664.1223f, 878.2748f, 1237.1085f, 2237.4707f, 2497.5647f, 2957.7786f, 3289.3928f, 3626.5276f, 4190.9243f, 4594.6450f, 4981.7456f, 5283.5513f, 5617.1538f, 5938.3760f, + 182.7846f, 270.3831f, 490.2131f, 1070.2524f, 1674.5724f, 2092.4905f, 2524.1472f, 2929.3523f, 3334.8005f, 3712.0061f, 4101.2896f, 4475.7324f, 4866.1919f, 5231.7559f, 5606.4077f, 5960.9644f, + 286.7701f, 386.1487f, 577.4210f, 764.3087f, 1151.2404f, 2014.4502f, 2399.8547f, 2879.0371f, 3160.2502f, 3450.6274f, 3869.8240f, 4368.3618f, 4816.7861f, 5187.6450f, 5564.7231f, 5962.0386f, + 179.9538f, 266.0682f, 647.9122f, 1380.2810f, 1776.1240f, 2208.4592f, 2590.6843f, 2993.6758f, 3368.2034f, 3753.2156f, 4125.2124f, 4508.6050f, 4878.9932f, 5249.3291f, 5612.5049f, 5965.2134f, + 309.2416f, 434.7111f, 724.6614f, 936.5360f, 1264.9886f, 2272.1338f, 2548.4519f, 2904.0798f, 3313.4990f, 3579.7854f, 3914.5811f, 4297.5938f, 4756.9072f, 5163.2017f, 5592.2822f, 5943.7222f, + 256.9009f, 393.7155f, 769.3966f, 1200.9640f, 1774.4797f, 2307.9629f, 2794.6799f, 3165.9431f, 3507.7952f, 3840.5791f, 4142.8877f, 4453.5078f, 4790.6973f, 5142.6123f, 5530.5977f, 5923.2188f, + 394.1425f, 602.0079f, 934.5173f, 1352.9718f, 1813.9639f, 2172.5435f, 2603.7295f, 2963.9590f, 3335.2344f, 3732.0515f, 4120.0151f, 4487.9668f, 4877.6294f, 5238.9336f, 5596.1479f, 5939.6489f, + 373.0307f, 665.4328f, 1227.4684f, 1524.6017f, 1947.3784f, 2361.6384f, 2778.1921f, 3134.5396f, 3462.3992f, 3752.4592f, 4069.0352f, 4404.2720f, 4782.2241f, 5145.0581f, 5541.9980f, 5932.9136f, + 449.9942f, 814.1862f, 1344.2784f, 1682.7061f, 2086.3599f, 2486.9709f, 2916.1177f, 3265.9099f, 3616.3977f, 3919.6345f, 4218.5342f, 4519.2207f, 4857.5220f, 5193.5269f, 5573.7339f, 5934.5400f, + 531.4455f, 965.7403f, 1458.5353f, 1773.3784f, 2236.0146f, 2650.9109f, 3099.2871f, 3467.1567f, 3809.7056f, 4094.6472f, 4378.5811f, 4660.2471f, 4962.5078f, 5270.9863f, 5629.4160f, 5973.6450f, + 565.5986f, 1091.1300f, 1561.4944f, 1983.5482f, 2492.8821f, 2897.5085f, 3233.5361f, 3539.8831f, 3838.6494f, 4093.4460f, 4372.1924f, 4678.2251f, 4999.2646f, 5325.0371f, 5672.8887f, 5998.9990f, + 581.0623f, 976.0275f, 1447.0302f, 1779.9243f, 2148.2158f, 2543.8347f, 2979.5061f, 3373.6099f, 3796.8259f, 4164.8242f, 4510.5493f, 4853.5527f, 5175.6318f, 5465.3647f, 5763.2334f, 6050.6582f, + 429.4613f, 802.5781f, 1229.0529f, 1512.6678f, 1835.8625f, 2216.9915f, 2625.3999f, 2995.9927f, 3379.5146f, 3764.7837f, 4156.1382f, 4532.4570f, 4906.4678f, 5262.8960f, 5626.6519f, 5970.6504f, + 224.5468f, 328.6938f, 615.8844f, 1207.4470f, 1520.9565f, 1865.9806f, 2182.4731f, 2431.4897f, 3239.3486f, 3490.9065f, 3775.7139f, 4291.4312f, 4740.0815f, 5192.0786f, 5532.9302f, 5928.7236f, + 312.1133f, 424.3103f, 716.4448f, 921.9969f, 1244.5491f, 2017.9143f, 2248.4170f, 2840.0688f, 3138.9390f, 3399.7288f, 3723.3479f, 3999.6824f, 4582.2339f, 5148.5166f, 5631.8989f, 6000.7192f, + 373.5378f, 506.7356f, 789.6149f, 942.6201f, 1695.8035f, 2021.6426f, 2323.3867f, 2649.5979f, 2853.1729f, 3169.5815f, 3524.9375f, 3848.6399f, 4261.7319f, 4978.9668f, 5505.4004f, 5924.7939f, + 503.2296f, 724.8124f, 940.3833f, 1220.5646f, 1439.8641f, 1726.9827f, 2215.5464f, 2476.0925f, 2846.8127f, 3232.0950f, 3638.5989f, 3986.3333f, 4371.3052f, 5022.0664f, 5657.4897f, 6040.3452f, + 398.3355f, 530.8898f, 835.5377f, 1058.3699f, 1327.2036f, 1814.9178f, 2114.2439f, 2515.8892f, 2754.9077f, 3094.8794f, 3598.7061f, 3981.2385f, 4605.9160f, 5110.8364f, 5550.1899f, 5953.9600f, + 327.7583f, 454.8903f, 825.9029f, 1025.4349f, 1321.1567f, 1551.4836f, 1978.2037f, 2838.9021f, 3111.9041f, 3417.3940f, 3841.0564f, 4696.0547f, 5126.1641f, 5409.5347f, 5711.7163f, 5968.3394f, + 327.1260f, 431.3983f, 721.9533f, 871.1266f, 1507.7616f, 1847.8716f, 2144.9641f, 2491.1108f, 2702.0847f, 3483.1516f, 3917.5173f, 4254.1260f, 4704.4863f, 4981.6284f, 5450.1035f, 5937.7861f, + 443.5867f, 610.7686f, 818.9614f, 999.3525f, 1181.9182f, 1884.4948f, 2243.3950f, 2522.8867f, 2993.8594f, 3196.6631f, 3835.5020f, 4233.2568f, 4506.8604f, 4985.0249f, 5544.1382f, 5980.0083f, + 395.7788f, 582.9504f, 822.1151f, 1013.0453f, 1224.6812f, 1988.4263f, 2452.4744f, 2686.4263f, 2952.8831f, 3135.0867f, 3562.5471f, 4006.6929f, 4401.7471f, 5038.5654f, 5567.4189f, 5986.0850f, + 264.3071f, 372.0398f, 616.4940f, 842.1705f, 1350.0250f, 1822.1957f, 2165.8896f, 2662.2937f, 3055.4390f, 3502.6787f, 3923.4236f, 4352.6587f, 4772.5068f, 5158.1309f, 5573.9385f, 5972.6895f, + 218.7390f, 325.2024f, 635.0441f, 1103.4701f, 1636.4287f, 2070.2615f, 2274.2910f, 2453.2002f, 3069.4382f, 3615.7065f, 3980.0811f, 4484.8662f, 4848.6416f, 5093.7163f, 5522.6973f, 5907.4048f, + 260.0797f, 461.2137f, 1049.2261f, 1334.1865f, 1628.6233f, 2014.9823f, 2413.4802f, 2844.4973f, 3232.3040f, 3661.0122f, 4069.8274f, 4466.5210f, 4857.6553f, 5234.4463f, 5608.4517f, 5954.7920f, + 301.7969f, 406.3861f, 706.7324f, 1387.1207f, 1581.4719f, 2004.7585f, 2291.9421f, 2548.9978f, 3076.8755f, 3343.1306f, 3623.1770f, 4279.7432f, 4777.6563f, 5084.3960f, 5473.4536f, 5872.0615f, + 344.0269f, 472.3550f, 776.6819f, 1455.1270f, 1611.6870f, 2012.4386f, 2417.4033f, 2621.8564f, 3318.9663f, 3709.0132f, 3944.1958f, 4299.0293f, 4776.4038f, 5184.1089f, 5545.5454f, 5913.9531f, + 332.1463f, 433.0623f, 992.1605f, 1254.8217f, 1498.4819f, 1824.6357f, 2118.3374f, 2444.6484f, 2684.8369f, 2930.4683f, 3557.4851f, 4292.9014f, 4786.7251f, 5138.2168f, 5616.2739f, 5996.8369f, + 281.7202f, 372.7708f, 1074.7051f, 1443.0428f, 1687.6460f, 1980.7075f, 2275.4241f, 2632.2017f, 2848.1765f, 3118.7881f, 3628.5857f, 4522.9585f, 4876.2163f, 5177.2739f, 5600.6675f, 5960.9634f, + 412.0151f, 535.6881f, 768.8618f, 1462.2601f, 1789.1055f, 1947.8196f, 2224.6890f, 2447.9089f, 2834.6140f, 3472.6721f, 3729.8525f, 4008.2893f, 4525.7271f, 4822.9194f, 5204.6611f, 5895.0942f, + 263.8760f, 379.7789f, 825.0498f, 1113.1218f, 1465.8749f, 1846.7463f, 2146.0496f, 2487.2766f, 2845.8447f, 3388.4800f, 3883.8447f, 4440.7603f, 4867.0815f, 5214.7280f, 5535.8149f, 5906.9932f, + 409.8116f, 583.7237f, 859.1983f, 1172.0491f, 1377.6473f, 1984.8322f, 2361.7292f, 2688.9368f, 3238.6563f, 3542.6716f, 3944.3005f, 4441.0840f, 4881.1211f, 5224.6045f, 5604.3711f, 5909.3657f, + 318.0743f, 438.8244f, 852.9153f, 1061.4503f, 1290.7609f, 1552.5408f, 2053.1118f, 2373.2883f, 2926.1560f, 3452.9551f, 4098.6626f, 4585.2773f, 4967.0898f, 5271.2720f, 5644.6709f, 5961.9585f, + 370.3631f, 496.5860f, 932.6390f, 1213.4189f, 1452.6641f, 1803.1532f, 2092.2354f, 2607.5247f, 2883.8086f, 3112.1086f, 3687.5657f, 4525.1274f, 4846.9404f, 5130.0537f, 5416.4141f, 5804.5122f, + 247.8941f, 343.9862f, 751.6780f, 1526.2566f, 1712.5012f, 2038.0667f, 2324.0371f, 2727.9749f, 3005.8975f, 3378.9817f, 3858.2002f, 4339.2017f, 4716.4580f, 5125.0918f, 5564.3589f, 5969.7163f, + 297.6552f, 401.7544f, 891.9346f, 1380.2275f, 1540.3125f, 1782.6058f, 2009.2045f, 2614.2092f, 2899.5396f, 3379.9722f, 3804.1169f, 4284.8540f, 4696.3335f, 5118.4551f, 5525.9839f, 5934.2686f, + 226.1444f, 333.4511f, 682.9995f, 1307.4166f, 1554.1943f, 1849.3679f, 2116.3438f, 2756.3567f, 3204.3018f, 3540.4106f, 4002.1895f, 4402.7734f, 4796.4395f, 5192.6812f, 5600.6841f, 5960.1855f, + 196.3791f, 299.9716f, 572.3173f, 1201.8826f, 1804.7235f, 2012.0171f, 2264.7415f, 2790.3406f, 3272.6926f, 3668.4863f, 4063.0435f, 4442.4419f, 4810.5957f, 5156.0923f, 5512.8501f, 5900.7441f, + 280.1911f, 391.5190f, 705.9903f, 1435.5063f, 1588.2345f, 2116.5032f, 2357.1875f, 2670.7461f, 3299.0071f, 3507.9336f, 4044.3057f, 4591.9023f, 4981.4575f, 5281.1270f, 5654.7158f, 5949.9263f, + 262.5740f, 370.5089f, 654.7243f, 1278.9299f, 1847.3096f, 2087.3394f, 2553.8892f, 2887.8269f, 3254.0747f, 3810.6626f, 4258.4390f, 4528.8022f, 4872.9741f, 5206.0483f, 5565.2876f, 5918.5596f, + 193.6133f, 356.3127f, 1076.8109f, 1485.8608f, 1887.7994f, 2273.1333f, 2676.7832f, 3052.3513f, 3419.1294f, 3792.5024f, 4161.7036f, 4532.6431f, 4898.5176f, 5262.0498f, 5622.8901f, 5976.4863f, + 302.7377f, 409.7598f, 899.1851f, 1176.6501f, 1531.3615f, 1933.6494f, 2229.9561f, 2819.8936f, 3031.6248f, 3807.0129f, 4118.7495f, 4412.7339f, 4704.6758f, 5012.0190f, 5351.4160f, 5892.3232f, + 421.1889f, 587.3521f, 835.9208f, 1248.0127f, 1475.8882f, 1779.3772f, 2330.6294f, 2606.6780f, 3026.0417f, 3513.8035f, 3754.6023f, 4081.0518f, 4536.3438f, 4815.9336f, 5117.6392f, 5802.9902f, + 378.0719f, 722.0884f, 1327.5808f, 1665.8940f, 1954.7782f, 2238.9473f, 2608.8538f, 2958.7910f, 3341.5112f, 3721.2021f, 4095.8457f, 4457.6865f, 4843.8672f, 5212.5142f, 5589.5122f, 5945.3730f, + 468.4631f, 962.3222f, 1541.0238f, 1919.1746f, 2347.4365f, 2650.7366f, 2927.5945f, 3166.4202f, 3451.0664f, 3757.8477f, 4109.2383f, 4467.9443f, 4858.6045f, 5211.8428f, 5593.3311f, 5951.0137f, + 422.2508f, 845.8956f, 1495.2552f, 1811.3933f, 2128.1157f, 2371.2532f, 2656.0715f, 2942.9011f, 3294.5308f, 3652.0935f, 4031.2534f, 4399.2222f, 4801.9497f, 5163.3721f, 5559.4517f, 5934.4063f, + 423.1028f, 661.7286f, 991.1974f, 1204.3813f, 1472.8564f, 2003.0298f, 2443.5833f, 2789.2795f, 3354.1692f, 3722.7822f, 4032.7351f, 4320.9727f, 4621.8140f, 4963.7310f, 5429.8203f, 5900.1465f, + 361.2513f, 485.9720f, 828.4865f, 1340.9952f, 1497.8477f, 2072.8511f, 2437.9839f, 2674.9912f, 3259.3357f, 3539.0474f, 3789.1389f, 4087.5015f, 4404.8867f, 4771.0947f, 5500.2227f, 6015.7041f, + 301.8146f, 392.9569f, 685.1938f, 1783.6246f, 2034.8542f, 2257.1614f, 2519.8713f, 2782.6279f, 3152.1135f, 3400.8662f, 3614.3801f, 3906.7375f, 4233.1968f, 4712.3682f, 5596.0396f, 5998.5742f, + 242.0591f, 371.0809f, 729.0743f, 1190.6813f, 1851.5691f, 2132.6724f, 2334.7773f, 2522.3608f, 3091.8643f, 3621.4614f, 3854.5227f, 4174.7017f, 4490.7510f, 4780.1230f, 5157.6147f, 5865.4756f, + 431.2477f, 562.1808f, 888.5207f, 1034.2062f, 1443.2480f, 2109.8850f, 2337.1443f, 2829.1870f, 3070.1301f, 3252.6370f, 3510.3967f, 4366.2236f, 4843.2139f, 5133.0537f, 5549.8911f, 5850.3252f, + 420.2594f, 668.9339f, 911.1281f, 1218.0372f, 1806.5541f, 2050.8423f, 2394.5708f, 2761.3542f, 3021.1716f, 3414.0020f, 3970.9626f, 4342.2900f, 4691.6074f, 5062.5386f, 5452.6655f, 5792.8384f, + 257.3011f, 370.8905f, 604.8825f, 1096.4209f, 1711.8464f, 1934.4335f, 2319.4717f, 2769.0144f, 3019.0200f, 3354.3726f, 4119.8809f, 4354.8589f, 4557.7979f, 4893.5776f, 5450.3042f, 5910.4136f, + 241.4264f, 347.9253f, 622.2432f, 1248.8121f, 1559.7318f, 1848.8098f, 2315.5635f, 2571.5894f, 2879.5754f, 3624.1069f, 3968.0334f, 4238.9727f, 4713.4746f, 5156.6792f, 5568.5596f, 5975.8716f, + 478.7131f, 629.4184f, 918.1857f, 1342.7815f, 1535.1541f, 1803.0487f, 2483.7764f, 2724.4321f, 2998.1257f, 3634.9932f, 3915.9443f, 4119.2837f, 4327.0283f, 4980.3516f, 5532.6880f, 5964.3052f, + 265.7818f, 373.8575f, 723.3755f, 1186.0619f, 1509.2827f, 2064.2075f, 2298.1992f, 2566.4395f, 2785.7659f, 3423.1396f, 3883.9011f, 4136.8940f, 4463.0386f, 5010.6592f, 5539.0337f, 5931.4414f, + 221.4221f, 347.7610f, 707.4465f, 1187.0800f, 1575.9095f, 1824.3983f, 1979.3307f, 2299.3174f, 2967.6799f, 3472.3381f, 3955.8469f, 4292.6079f, 4794.8745f, 5127.5181f, 5652.6729f, 5953.0132f, + 397.2769f, 510.2605f, 746.8268f, 1588.0735f, 1991.5200f, 2150.6843f, 2439.0486f, 2712.2754f, 2972.5825f, 3501.2673f, 3917.5459f, 4143.6069f, 4443.4414f, 4829.1929f, 5490.0376f, 6028.3794f, + 280.5184f, 370.6464f, 640.7120f, 1721.3899f, 1948.9806f, 2149.9592f, 2400.4678f, 2674.0542f, 3146.3154f, 3419.8850f, 3813.9553f, 4417.4497f, 4818.3652f, 5139.6323f, 5465.0669f, 5879.7183f, + 325.2418f, 431.2627f, 1008.7708f, 1271.9235f, 1527.4150f, 2066.6370f, 2242.3311f, 2883.4065f, 3180.6614f, 3352.5015f, 3756.9688f, 4386.6904f, 4857.6621f, 5189.2212f, 5514.7573f, 5856.8086f, + 451.8427f, 582.4401f, 925.8821f, 1363.4249f, 1503.2460f, 1961.5940f, 2265.6001f, 2574.4414f, 3123.0769f, 3345.1587f, 3634.3022f, 4266.0137f, 4880.8052f, 5223.5776f, 5567.8901f, 5880.3770f, + 411.0873f, 553.3847f, 809.2106f, 1023.4841f, 1189.0618f, 1786.0770f, 2121.8489f, 2454.6458f, 2947.4700f, 3220.3210f, 3828.0911f, 4218.0229f, 4831.2383f, 5322.1445f, 5727.3906f, 6033.3887f, + 310.5608f, 442.2204f, 742.7755f, 1097.5740f, 1340.9608f, 1854.4385f, 2261.6399f, 2634.8315f, 3297.8879f, 3638.6956f, 3925.8770f, 4232.9146f, 4559.9287f, 4893.5830f, 5403.0981f, 5917.7056f, + 377.5583f, 488.4103f, 945.2491f, 1234.1572f, 1416.0774f, 1666.5979f, 1932.9910f, 2746.2000f, 2997.4753f, 3216.6152f, 3559.3999f, 3843.8130f, 4359.6626f, 5014.2920f, 5560.6162f, 5992.7212f, + 285.2173f, 389.6116f, 825.5790f, 1238.8229f, 1459.6588f, 1860.8855f, 2178.6296f, 2519.1597f, 2828.0032f, 3278.8101f, 3560.8286f, 4142.0552f, 4691.0698f, 5117.7778f, 5558.7944f, 5954.6680f, + 465.7002f, 631.7491f, 914.5521f, 1340.0057f, 1562.5760f, 1844.1741f, 2186.1208f, 2483.7080f, 2901.9417f, 3190.3162f, 3474.7651f, 3873.4065f, 4240.1973f, 4761.1255f, 5428.2832f, 5958.5273f, + 340.5456f, 449.2341f, 793.7005f, 1387.7467f, 1555.8701f, 1938.7877f, 2201.6155f, 2579.5762f, 2914.9724f, 3149.8584f, 3699.3984f, 3985.6790f, 4331.7534f, 4999.4805f, 5514.6924f, 5969.4897f, + 395.8350f, 564.1188f, 774.8214f, 1276.3201f, 1721.8716f, 1864.0143f, 2267.5696f, 2790.2031f, 3003.9434f, 3377.6140f, 3917.7395f, 4167.3867f, 4465.2529f, 4936.1138f, 5464.0479f, 5905.0444f, + 324.1844f, 443.0006f, 728.8958f, 1398.6589f, 1584.1820f, 1923.8724f, 2348.0903f, 2561.5554f, 3154.5991f, 3449.1746f, 3771.7927f, 4182.1899f, 4937.0791f, 5361.6509f, 5727.7656f, 6002.7505f, + 267.1790f, 373.7663f, 703.5949f, 1173.7009f, 1390.2002f, 1905.7941f, 2177.4961f, 2703.2627f, 3022.9121f, 3308.9612f, 3798.5823f, 4187.1533f, 4703.2163f, 5136.0918f, 5571.1655f, 5966.6577f, + 272.9294f, 399.3804f, 797.7335f, 1180.1516f, 1426.4850f, 2097.2839f, 2355.4727f, 2793.8774f, 3137.1907f, 3458.7727f, 3893.6628f, 4245.8047f, 4652.3794f, 5106.5293f, 5568.1885f, 5948.3169f, + 324.5529f, 431.7663f, 759.6147f, 1494.8739f, 1668.8168f, 2110.5635f, 2427.4104f, 2672.9270f, 3170.5266f, 3448.2080f, 3717.1240f, 4034.2280f, 4375.3647f, 5041.1372f, 5666.9517f, 6014.7217f, + 306.4759f, 404.5361f, 795.7795f, 1675.9967f, 1835.0950f, 2160.6624f, 2430.8855f, 2734.2646f, 3270.1426f, 3586.1355f, 3821.9670f, 4102.0078f, 4372.9404f, 4918.9146f, 5412.0376f, 5868.5225f, + 421.3803f, 607.7995f, 813.0241f, 1286.8525f, 1827.2451f, 2026.8683f, 2333.9453f, 2730.9817f, 2988.4067f, 3303.8513f, 3759.1897f, 4057.5264f, 4441.5493f, 4890.0078f, 5212.0469f, 5672.2188f, + 423.8560f, 599.5201f, 829.0651f, 1082.6381f, 1245.9272f, 1623.7075f, 2453.0420f, 2855.6631f, 3171.3855f, 3475.5881f, 3715.4219f, 3972.1326f, 4419.1597f, 4894.0283f, 5363.8691f, 5919.2681f, + 441.2789f, 634.8879f, 921.6287f, 1189.0240f, 1368.7466f, 2012.1312f, 2383.7656f, 2638.5222f, 2975.0288f, 3163.6150f, 3433.9958f, 3838.9917f, 4186.6426f, 4856.8477f, 5559.1196f, 5977.2290f, + 349.2039f, 466.2342f, 724.2582f, 904.4043f, 1190.4492f, 1981.7565f, 2226.5554f, 2592.5098f, 2865.5525f, 3195.8196f, 3735.6345f, 4267.1660f, 4810.9893f, 5207.5093f, 5605.1445f, 5952.0361f, + 497.7713f, 719.9073f, 925.0815f, 1146.3021f, 1326.7095f, 1574.5039f, 2306.7678f, 2714.8022f, 2967.5190f, 3400.1121f, 3732.0544f, 3981.7878f, 4553.4819f, 5090.0869f, 5426.2085f, 5833.5220f, + 471.7526f, 648.3213f, 902.1542f, 1245.7086f, 1423.3403f, 1701.1757f, 2125.8530f, 2407.0481f, 2969.5583f, 3294.1296f, 3712.8398f, 4140.7930f, 4808.4668f, 5322.3896f, 5662.1255f, 5950.6211f, + 345.3843f, 485.9887f, 841.2579f, 1035.9401f, 1244.8905f, 1488.1833f, 2340.4253f, 2607.0859f, 2845.4153f, 3223.1768f, 3557.0696f, 4119.7944f, 4666.8896f, 5145.8589f, 5565.7534f, 5976.6875f, + 332.4270f, 427.5984f, 829.9191f, 1138.0469f, 1339.4468f, 1589.0535f, 1926.0630f, 2432.9331f, 2699.7964f, 3311.4355f, 3716.1003f, 4270.4990f, 4760.3647f, 5208.3950f, 5619.2080f, 5971.2715f, + 249.0114f, 381.2982f, 925.7067f, 1520.3356f, 1842.8396f, 2368.2908f, 2783.4033f, 3272.5757f, 3673.7402f, 4046.3950f, 4370.4966f, 4688.0269f, 5002.6772f, 5316.3594f, 5650.2192f, 5977.6587f, + 263.3275f, 451.6255f, 1252.2307f, 1503.0652f, 1786.7695f, 2082.7554f, 2451.1829f, 2804.7590f, 3116.7583f, 3493.8892f, 3884.6575f, 4349.6724f, 4770.0156f, 5143.1636f, 5542.5913f, 5931.5522f, + 252.9447f, 341.5762f, 632.7664f, 1766.8096f, 2084.1511f, 2272.7332f, 2531.1006f, 2765.2080f, 3134.5417f, 3380.6223f, 3640.8015f, 3932.7854f, 4532.1172f, 5245.2070f, 5597.0776f, 5973.6831f, + 234.9979f, 324.6731f, 1239.8643f, 1663.1921f, 1858.7769f, 2171.1614f, 2403.8818f, 2680.6433f, 2836.4985f, 3192.6577f, 3864.8811f, 4385.8066f, 4845.9766f, 5150.2412f, 5631.1519f, 6011.7773f, + 284.5302f, 410.1263f, 985.4119f, 1298.3987f, 1789.4304f, 1996.9287f, 2450.8525f, 2831.6011f, 2994.2073f, 3214.1306f, 3525.0498f, 3819.9141f, 4672.7544f, 5424.3545f, 5691.0732f, 5980.3096f, + 244.2704f, 415.5891f, 1038.3009f, 1317.5186f, 1686.4528f, 2081.3147f, 2476.9873f, 2959.5393f, 3214.9561f, 3569.1431f, 3934.4736f, 4308.7114f, 4728.3687f, 5105.7964f, 5488.1938f, 5908.9443f, + 335.8417f, 468.3464f, 1003.6253f, 1275.0145f, 1534.2854f, 1985.3167f, 2348.3411f, 2743.3169f, 2956.0967f, 3408.5063f, 3866.8574f, 4287.0034f, 4556.7222f, 4922.7832f, 5259.7480f, 5800.2876f, + 388.2726f, 518.0591f, 832.5999f, 1325.0247f, 1528.8624f, 1808.1732f, 2151.0820f, 2486.1331f, 2815.4980f, 3158.5391f, 3635.3606f, 3960.5383f, 4671.7686f, 5371.8140f, 5777.8940f, 6056.4722f, + 506.5153f, 673.0771f, 900.0349f, 1154.2124f, 1378.2689f, 1786.9409f, 2081.9631f, 2398.6965f, 2859.7441f, 3075.4841f, 3546.6563f, 4322.6694f, 4732.0049f, 4992.5542f, 5267.5859f, 5807.1812f, + 487.2466f, 653.6116f, 968.5656f, 1389.2708f, 1601.5822f, 1910.9694f, 2282.4038f, 2608.7063f, 3032.6233f, 3361.9692f, 3629.8552f, 3908.8335f, 4318.4009f, 4646.5781f, 5043.5962f, 5792.7393f, + 432.8733f, 591.7551f, 899.2619f, 1490.1176f, 1789.8751f, 2060.3750f, 2434.8779f, 2840.3374f, 3122.1292f, 3472.8079f, 3830.8870f, 4097.2622f, 4353.5464f, 4650.2075f, 4981.5752f, 5482.9565f, + 378.4767f, 508.5656f, 802.8280f, 947.2892f, 1532.0898f, 2038.8177f, 2349.1965f, 2650.2039f, 2863.8018f, 3591.6697f, 3918.9211f, 4256.6255f, 4604.8467f, 4899.0996f, 5237.6084f, 5791.5029f, + 407.0908f, 546.0364f, 866.1215f, 1098.6927f, 1347.2009f, 1657.1525f, 1965.5845f, 2717.7190f, 3033.4961f, 3509.9031f, 3873.4150f, 4131.4438f, 4389.5693f, 4774.2295f, 5450.1768f, 5977.5151f, + 429.3459f, 568.8134f, 903.5659f, 1099.2942f, 1379.4979f, 2207.5940f, 2479.9919f, 2780.9072f, 3206.3960f, 3425.4084f, 3682.5911f, 3950.1941f, 4324.0840f, 4689.4922f, 5068.2534f, 5787.2852f, + 371.9443f, 524.7249f, 890.0464f, 1670.7485f, 1958.5308f, 2182.7007f, 2558.5007f, 2835.4937f, 3192.0740f, 3634.4817f, 3950.0942f, 4259.6953f, 4628.0049f, 4999.1616f, 5364.9893f, 5801.6855f, + 323.1922f, 451.0327f, 787.1655f, 1011.6555f, 1323.8138f, 2177.6636f, 2401.1392f, 2826.8796f, 3432.8999f, 3653.1851f, 3883.9897f, 4082.7559f, 4361.6753f, 4635.1475f, 5084.7544f, 5823.3062f, + 377.0061f, 524.2181f, 743.6288f, 1378.9187f, 1857.6434f, 2056.4695f, 2453.7949f, 2902.1995f, 3127.2651f, 3463.3523f, 3980.1316f, 4241.2578f, 4528.5859f, 4881.4521f, 5239.3145f, 5580.5986f, + 308.7965f, 403.7058f, 705.9506f, 1823.8571f, 2126.9387f, 2369.2810f, 2647.2048f, 2855.8276f, 3209.7708f, 3498.2310f, 3747.6047f, 3972.8647f, 4254.3325f, 4574.4292f, 5087.3965f, 5890.4219f, + 274.7571f, 383.7251f, 573.6029f, 1142.8372f, 2151.7173f, 2558.8972f, 2751.9468f, 2987.4412f, 3234.3350f, 3526.0127f, 3922.9927f, 4189.0249f, 4483.3774f, 4877.1860f, 5396.7798f, 5921.8125f, + 248.5916f, 423.6264f, 1260.9626f, 1696.0492f, 1972.9108f, 2298.5972f, 2592.9307f, 2947.2292f, 3266.2227f, 3614.3572f, 3980.3892f, 4359.4067f, 4770.2842f, 5158.9058f, 5554.6597f, 5936.9043f, + 320.5471f, 429.6766f, 657.1440f, 1390.1080f, 2194.6426f, 2507.6086f, 2712.3662f, 2980.3408f, 3216.1682f, 3544.8467f, 3956.9790f, 4227.5308f, 4463.7563f, 4745.7124f, 5088.6650f, 5525.8516f, + 245.5478f, 520.3131f, 1177.0693f, 1454.0125f, 1770.2620f, 2160.8779f, 2551.2700f, 2950.2324f, 3326.8621f, 3710.4624f, 4104.3936f, 4481.9971f, 4865.9736f, 5230.6396f, 5608.5649f, 5965.6162f, + 514.5864f, 956.9897f, 1287.9597f, 1520.3473f, 1802.0631f, 2116.4980f, 2509.8552f, 2865.9822f, 3238.7510f, 3611.3108f, 4016.4353f, 4431.8457f, 4860.3442f, 5231.4814f, 5614.6016f, 5963.9976f, + 537.0523f, 932.2803f, 1380.2690f, 1709.4702f, 2079.9902f, 2446.4014f, 2859.4204f, 3229.6975f, 3623.4031f, 4012.5327f, 4373.7568f, 4724.3359f, 5078.2686f, 5397.6040f, 5721.9639f, 6028.1167f, + 452.5153f, 798.2777f, 1099.3080f, 1317.0807f, 1652.6885f, 2059.7708f, 2471.0164f, 2808.5396f, 3146.5076f, 3494.0779f, 3870.6912f, 4310.8281f, 4777.5024f, 5181.2617f, 5574.4912f, 5934.3813f, + 340.3716f, 430.5102f, 872.3513f, 1636.3792f, 1772.8615f, 2074.0161f, 2295.1008f, 2693.0037f, 3177.7710f, 3391.7559f, 3670.8718f, 4224.3926f, 4896.3877f, 5199.9883f, 5580.4512f, 5911.7671f, + 317.8269f, 414.8185f, 881.1970f, 1658.4944f, 1852.0098f, 2136.0415f, 2380.8228f, 2668.9141f, 3046.8027f, 3299.0051f, 3523.0593f, 3758.9412f, 4116.9063f, 5061.2124f, 5624.1777f, 5989.4761f, + 374.0671f, 488.0840f, 734.0546f, 1415.9261f, 1648.7783f, 1852.8462f, 2099.1895f, 2347.5562f, 2954.8359f, 3269.6714f, 3536.7920f, 4116.1743f, 4481.4355f, 4913.8838f, 5467.2817f, 5909.8779f, + 340.4291f, 448.5775f, 1041.4979f, 1426.0011f, 1637.8165f, 1968.6743f, 2210.7976f, 2647.5144f, 2913.8650f, 3131.7698f, 3429.8755f, 3722.6763f, 4104.6479f, 4969.0093f, 5574.2231f, 5978.2070f, + 254.2538f, 412.7710f, 947.8206f, 1209.3683f, 1690.4813f, 2040.7881f, 2401.4314f, 2728.0066f, 3016.2290f, 3530.3865f, 3964.6563f, 4393.6934f, 4804.2168f, 5187.9302f, 5586.4399f, 5954.8950f, + 241.0244f, 347.0750f, 835.2348f, 1601.9089f, 1786.4336f, 2134.3950f, 2396.0139f, 2848.9712f, 3239.9138f, 3623.8250f, 4029.5088f, 4400.3936f, 4797.3564f, 5195.7310f, 5596.6689f, 5965.9878f, + 309.3683f, 453.6776f, 812.9343f, 1125.9915f, 1423.5935f, 2149.2227f, 2514.9277f, 3031.3599f, 3463.7219f, 3790.7839f, 4064.0039f, 4297.9839f, 4653.4551f, 5189.7061f, 5721.2954f, 6033.0752f, + 469.4284f, 730.1902f, 973.0643f, 1170.5016f, 1572.2559f, 2084.2769f, 2567.8604f, 2963.4592f, 3286.9617f, 3580.3228f, 3882.8706f, 4335.5483f, 4859.7197f, 5258.2827f, 5627.9785f, 5957.8623f, + 454.6165f, 795.2360f, 1078.7705f, 1294.9473f, 1761.6650f, 2235.2788f, 2695.8455f, 3095.7695f, 3473.4897f, 3833.0889f, 4185.7290f, 4528.9863f, 4893.0039f, 5240.7627f, 5608.8594f, 5951.0718f, + 563.4587f, 875.8987f, 1139.0026f, 1378.2317f, 1855.7401f, 2279.7683f, 2651.3079f, 2968.4397f, 3279.4453f, 3607.2500f, 3975.5796f, 4358.3574f, 4768.7969f, 5135.3706f, 5525.3501f, 5904.2617f, + 461.7852f, 855.0644f, 1367.4387f, 1702.5593f, 2141.0093f, 2500.9055f, 2853.8596f, 3123.9744f, 3406.0178f, 3694.0481f, 4028.9985f, 4373.1113f, 4768.2891f, 5137.6895f, 5541.3721f, 5921.4507f, + 438.6031f, 753.0179f, 1269.3203f, 1630.4396f, 2027.2959f, 2350.9695f, 2672.1396f, 2957.1809f, 3250.1545f, 3546.5315f, 3894.0161f, 4249.9346f, 4666.2266f, 5061.2524f, 5490.7749f, 5904.6362f, + 543.3182f, 828.4835f, 1239.1818f, 1471.1134f, 1737.8622f, 2037.2484f, 2434.5112f, 2801.3242f, 3162.3250f, 3508.1255f, 3849.0903f, 4165.7588f, 4588.3809f, 5020.0952f, 5475.2813f, 5904.6377f, + 519.5982f, 837.6639f, 1171.2003f, 1363.0320f, 1617.4617f, 1976.1787f, 2472.0303f, 2901.3264f, 3340.7300f, 3736.0830f, 4103.3843f, 4444.8657f, 4800.9482f, 5145.6011f, 5544.2002f, 5933.0981f, + 433.3774f, 582.7663f, 899.6142f, 1150.7437f, 1321.1309f, 1947.8643f, 2557.8604f, 2733.1497f, 3240.4907f, 3634.7915f, 3855.9856f, 4058.0281f, 4364.2568f, 5096.5225f, 5659.0952f, 6013.8145f, + 424.9731f, 604.3164f, 868.1793f, 1207.7882f, 1414.2374f, 1713.2893f, 2520.2900f, 2960.8887f, 3210.8542f, 3584.5403f, 3914.5796f, 4149.8550f, 4505.7705f, 4886.9575f, 5214.5361f, 5597.8389f, + 347.0334f, 494.2440f, 753.7191f, 1451.0435f, 1700.7461f, 1925.4844f, 2605.7988f, 2870.4744f, 3173.7312f, 3758.7219f, 4112.1929f, 4400.3882f, 4866.1016f, 5165.8799f, 5433.0371f, 5781.1509f, + 318.4942f, 464.3939f, 783.5214f, 1491.0234f, 1708.4984f, 2280.2876f, 2533.3354f, 2885.1736f, 3443.7451f, 3669.8506f, 4000.6792f, 4269.6626f, 4571.2739f, 4827.2158f, 5277.3813f, 5850.4736f, + 386.8698f, 519.0056f, 725.0029f, 981.5649f, 1156.1665f, 1500.4691f, 2421.7993f, 2962.4722f, 3175.0166f, 3548.4756f, 3860.7961f, 4146.4150f, 4658.9897f, 5088.3999f, 5531.8945f, 5951.4624f, + 315.9294f, 738.5538f, 1171.9581f, 1553.7167f, 1949.9159f, 2319.6641f, 2707.5493f, 3069.2996f, 3444.6157f, 3811.2139f, 4177.5469f, 4545.6943f, 4905.0444f, 5271.3926f, 5622.6831f, 5974.4141f, + 216.5136f, 598.1122f, 1059.3214f, 1466.4785f, 1880.1747f, 2263.6533f, 2658.3081f, 3030.4099f, 3413.6802f, 3780.1853f, 4157.1455f, 4519.1919f, 4893.5439f, 5244.3530f, 5603.1064f, 5926.8379f, + 375.4021f, 487.0890f, 844.4013f, 1574.3596f, 1794.5249f, 2106.2878f, 2418.5217f, 2657.8938f, 3116.6096f, 3457.8625f, 3691.0596f, 3930.1062f, 4259.5928f, 4592.4370f, 5020.5078f, 5840.3989f, + 474.3148f, 724.2144f, 974.0716f, 1283.4182f, 1521.2632f, 1746.4248f, 2333.0957f, 2874.2966f, 3111.9636f, 3440.0410f, 3752.9678f, 3975.7139f, 4294.7056f, 4821.9893f, 5201.5562f, 5658.8301f, + 400.0291f, 564.9626f, 808.2393f, 1083.2745f, 1300.4403f, 2080.7405f, 2588.6882f, 2858.4629f, 3206.4502f, 3429.8623f, 3746.9080f, 4341.4868f, 4713.2803f, 4986.4258f, 5336.7339f, 5710.1123f, + 354.4416f, 480.1495f, 834.1089f, 1037.7775f, 1350.0652f, 1791.1736f, 2193.0159f, 2504.6775f, 2776.0623f, 3153.0994f, 4108.1357f, 4597.4082f, 4861.9688f, 5092.8613f, 5473.2295f, 5932.0332f, + 237.3935f, 346.9133f, 675.5335f, 1481.0535f, 1716.8414f, 1884.7153f, 2099.3057f, 2725.5403f, 3022.8506f, 3276.2922f, 3639.1001f, 4185.3926f, 4941.6597f, 5292.0093f, 5682.0391f, 5981.0215f, + 367.4981f, 469.7130f, 820.7811f, 1219.7736f, 1368.4479f, 1624.6671f, 1804.2581f, 2607.8589f, 2891.3174f, 3212.2432f, 3760.7290f, 4015.6111f, 4618.0068f, 5129.3213f, 5652.1582f, 6042.1113f, + 312.6796f, 415.8322f, 674.1500f, 853.7709f, 1808.7385f, 2232.5310f, 2497.8157f, 2834.2991f, 3039.7012f, 3301.4050f, 3659.2969f, 4455.9453f, 4841.4912f, 5111.6167f, 5502.2534f, 5924.6357f, + 341.9309f, 471.7513f, 758.1926f, 979.7221f, 1287.4463f, 1737.0303f, 2160.7915f, 2664.5562f, 2961.8315f, 3461.7439f, 3732.6611f, 4109.0928f, 4568.9111f, 5037.4331f, 5511.3169f, 5966.1304f, + 351.3721f, 462.1897f, 765.1075f, 946.3102f, 1322.8093f, 2292.2400f, 2503.6494f, 2819.7234f, 3079.2803f, 3297.6252f, 3571.4668f, 3872.0823f, 4337.6426f, 5079.1504f, 5562.8110f, 5942.7153f, + 435.4323f, 614.4746f, 892.8980f, 1215.9469f, 1395.9762f, 1814.3936f, 2155.9590f, 2465.0427f, 3201.6211f, 3490.9224f, 3853.2620f, 4410.1855f, 4786.0625f, 5095.0181f, 5394.4805f, 5715.3364f, + 294.6053f, 417.1553f, 1046.2922f, 1443.0247f, 1636.7180f, 1956.4248f, 2189.9697f, 2869.8071f, 3129.9385f, 3462.5681f, 3895.2805f, 4213.4541f, 4541.8950f, 5009.1958f, 5472.7642f, 5983.0063f, + 322.1185f, 446.8733f, 689.4188f, 1338.2788f, 1643.1023f, 1903.8652f, 2494.2722f, 2804.6968f, 3103.8682f, 3640.1233f, 3965.9861f, 4172.5596f, 4404.7388f, 4670.7544f, 5240.3682f, 5893.4600f, + 209.7024f, 336.5508f, 729.0126f, 1217.3285f, 1699.0111f, 1891.2837f, 2146.8486f, 2830.0850f, 3108.6204f, 3446.0396f, 3754.1230f, 3945.1038f, 4474.5806f, 5191.6987f, 5613.3076f, 5970.2695f, + 346.6580f, 470.5094f, 663.3455f, 1266.9061f, 2020.5759f, 2270.5173f, 2527.3550f, 2826.9104f, 3078.3403f, 3401.2625f, 3804.3770f, 4100.3091f, 4407.7876f, 4732.2319f, 5150.2749f, 5808.2559f, + 283.7796f, 391.4603f, 1165.6863f, 1456.1125f, 1692.9001f, 2008.4825f, 2322.7837f, 2784.0608f, 2998.5811f, 3268.5164f, 3548.9373f, 4167.1289f, 4643.9878f, 5099.2881f, 5473.0781f, 5929.8242f, + 301.0849f, 383.1578f, 692.0848f, 1648.9374f, 1873.0947f, 2109.6113f, 2345.0110f, 2613.1121f, 2922.0193f, 3170.0020f, 3405.0774f, 3881.9875f, 4778.3154f, 5092.5205f, 5445.7100f, 5920.7896f, + 509.1023f, 750.8580f, 963.8820f, 1295.3452f, 1634.8796f, 1818.7975f, 2151.1250f, 2590.3354f, 2867.5596f, 3238.7666f, 3747.2834f, 4053.8911f, 4457.8164f, 4928.0151f, 5295.3521f, 5789.0571f, + 421.8951f, 547.9814f, 967.4185f, 1153.8607f, 1461.4230f, 1813.0994f, 2155.2703f, 2570.9712f, 2777.6597f, 3048.9863f, 3432.0986f, 3729.3877f, 4395.7461f, 5028.7402f, 5486.4946f, 5951.5024f, + 340.6758f, 445.7014f, 931.8882f, 1253.4775f, 1521.9260f, 1969.5759f, 2267.5332f, 2735.0112f, 2948.7678f, 3236.5166f, 3529.5505f, 3882.3674f, 4699.5781f, 5089.6641f, 5377.7842f, 5880.7778f, + 284.1882f, 408.6918f, 786.3123f, 1670.3220f, 2042.9493f, 2265.2275f, 2691.2012f, 3035.8762f, 3334.1719f, 3863.1194f, 4276.8916f, 4571.0420f, 4996.4404f, 5336.5205f, 5647.9556f, 5944.5996f, + 300.0066f, 616.4817f, 1238.7324f, 1614.8296f, 1997.6188f, 2367.4343f, 2784.5605f, 3168.8354f, 3569.8250f, 3965.6011f, 4336.3804f, 4689.5874f, 5044.2012f, 5365.7456f, 5697.5654f, 6010.6572f, + 242.9420f, 476.8371f, 1250.6661f, 1671.6031f, 2159.6443f, 2637.7417f, 3049.8589f, 3371.6045f, 3674.8706f, 3951.1006f, 4230.6416f, 4543.2827f, 4887.4478f, 5220.5581f, 5595.2686f, 5962.1313f, + 242.6795f, 331.1335f, 635.2861f, 1801.5236f, 2084.1472f, 2264.4692f, 2506.2891f, 2799.4441f, 3236.7134f, 3489.6038f, 3859.3291f, 4424.8008f, 4964.6348f, 5298.6533f, 5640.2031f, 5988.0552f, + 254.0538f, 336.2447f, 1216.6261f, 1717.7201f, 1886.0708f, 2176.6338f, 2405.8547f, 2762.3037f, 2934.8816f, 3167.0657f, 3385.5457f, 3804.4346f, 4848.8198f, 5286.0352f, 5630.5391f, 6086.4492f, + 295.2298f, 426.2079f, 630.7856f, 1155.5609f, 1827.6831f, 2120.5283f, 2462.4373f, 2759.6152f, 2990.9526f, 3253.4216f, 3910.9834f, 4204.2754f, 4462.7944f, 4909.7529f, 5579.9653f, 5985.8579f, + 298.9633f, 410.3875f, 810.1115f, 1346.1040f, 1499.2391f, 2210.3948f, 2467.9424f, 2792.7122f, 3284.0874f, 3493.0740f, 3784.1899f, 4319.6396f, 4860.6548f, 5213.8540f, 5609.8672f, 5949.6890f, + 437.9900f, 575.3093f, 866.0077f, 1104.2080f, 1307.4966f, 1959.9323f, 2293.9365f, 2604.6704f, 2966.6514f, 3228.0056f, 3548.8499f, 4096.4424f, 4769.5420f, 5086.5449f, 5416.5317f, 5853.6909f, + 412.4955f, 569.1867f, 864.0179f, 1117.6798f, 1348.6332f, 1976.5171f, 2334.3960f, 2640.3381f, 3006.5347f, 3327.5784f, 3695.8564f, 4042.1753f, 4362.7837f, 4687.4751f, 5389.8662f, 5966.5825f, + 406.8686f, 542.0319f, 867.3541f, 1436.3810f, 1678.6399f, 2000.1501f, 2358.1204f, 2651.3806f, 3042.1216f, 3339.2766f, 3617.9963f, 3933.3860f, 4249.0278f, 4591.8530f, 5502.0400f, 6020.7910f, + 375.4336f, 519.7731f, 764.5574f, 1215.1381f, 1482.9417f, 1696.8020f, 1957.0332f, 2169.1169f, 2973.4634f, 3687.7449f, 3966.8525f, 4258.8042f, 4680.6567f, 4947.0225f, 5230.9824f, 5843.2466f, + 443.2378f, 574.0562f, 813.3345f, 1282.7894f, 1538.0752f, 1727.8997f, 2007.8584f, 2194.5601f, 2755.8220f, 3460.9243f, 3654.1399f, 4030.5530f, 4572.4727f, 4904.7847f, 5400.6147f, 5934.2656f, + 423.6246f, 540.1947f, 862.8629f, 1386.7659f, 1577.2052f, 1811.0304f, 2046.7363f, 2309.0366f, 3129.1145f, 3533.0020f, 3738.4211f, 4021.1111f, 4357.3677f, 4634.8740f, 5307.2920f, 5944.9155f, + 287.7661f, 401.5490f, 725.6079f, 950.8911f, 1186.5465f, 1490.1750f, 2114.7920f, 2562.4019f, 3028.3977f, 3519.6277f, 3940.5737f, 4339.3086f, 4765.8188f, 5172.3428f, 5582.8022f, 5971.0273f, + 382.6039f, 537.7234f, 836.8093f, 1371.3546f, 1578.9803f, 1869.8213f, 2292.5596f, 2540.8601f, 3032.9834f, 3402.5059f, 3737.0569f, 4053.9937f, 4446.6240f, 5251.8457f, 5710.7935f, 6022.2925f, + 313.2195f, 415.0511f, 690.6860f, 1561.4832f, 1815.6521f, 2059.9187f, 2345.5095f, 2614.8701f, 3006.9604f, 3291.9744f, 3590.4119f, 3996.1516f, 4365.4995f, 4853.4956f, 5465.1572f, 5954.5718f, + 361.7959f, 448.4001f, 921.3198f, 1343.1167f, 1488.6287f, 1736.7700f, 1950.8906f, 2536.0193f, 2768.7393f, 3062.4473f, 3484.6570f, 3888.5618f, 4618.4038f, 5092.6641f, 5523.3657f, 5966.6772f, + 249.5541f, 366.6601f, 684.6592f, 1203.0931f, 1642.2089f, 1961.8837f, 2227.3289f, 2421.1348f, 2660.5676f, 3229.5410f, 3822.5837f, 4232.7266f, 4782.5181f, 5127.2612f, 5570.2676f, 5978.9858f, + 287.4206f, 421.3210f, 704.0352f, 1279.8597f, 1562.7307f, 2115.4241f, 2492.4517f, 2780.9470f, 3317.3616f, 3606.1492f, 4026.6375f, 4337.9014f, 4699.6895f, 4997.2573f, 5431.1787f, 5903.8628f, + 487.9554f, 740.9349f, 1021.9616f, 1327.3262f, 1620.8544f, 1890.7717f, 2269.1218f, 2584.4868f, 2911.2896f, 3424.9221f, 3855.1670f, 4205.9272f, 4707.2466f, 5147.1846f, 5601.1152f, 5953.4673f, + 400.8269f, 513.4500f, 786.8242f, 1269.3298f, 1441.4178f, 1696.9789f, 1911.0537f, 2223.0684f, 2847.1619f, 3113.3845f, 3670.6318f, 4146.2900f, 4555.9204f, 5083.8579f, 5574.8120f, 5987.6030f, + 379.0329f, 487.7222f, 914.8179f, 1130.9854f, 1430.1394f, 1830.0769f, 2088.8796f, 2613.6855f, 2803.1633f, 3457.1777f, 4032.6118f, 4306.7344f, 4662.6899f, 4959.6348f, 5245.5234f, 5787.3940f, + 340.6941f, 451.0338f, 656.2767f, 911.5805f, 1124.9330f, 1733.8730f, 2518.7861f, 2768.6851f, 3211.3733f, 3717.7583f, 3929.6772f, 4176.2993f, 4522.4517f, 5011.5547f, 5575.8784f, 6006.7222f, + 341.5027f, 441.6417f, 807.2695f, 1060.2080f, 1251.2837f, 1478.9895f, 1750.0796f, 2594.8977f, 2924.5027f, 3401.4751f, 3852.0557f, 4292.4683f, 4718.2930f, 5159.4775f, 5562.4067f, 5972.5571f, + 313.8985f, 421.5380f, 667.2407f, 873.6023f, 1110.1119f, 2060.7332f, 2381.0916f, 2746.2288f, 3080.5649f, 3399.9905f, 3897.5884f, 4434.9990f, 5048.1343f, 5390.8149f, 5744.3931f, 6007.9326f, + 252.1832f, 354.2392f, 673.5427f, 1339.1161f, 1554.8853f, 2014.9351f, 2300.4138f, 2829.6182f, 3213.1714f, 3409.5105f, 3604.3242f, 3927.8020f, 4622.3218f, 5103.4565f, 5559.5024f, 5971.5986f, + 385.2648f, 513.7607f, 760.7678f, 983.5819f, 1175.7727f, 2134.7810f, 2592.9614f, 2822.0161f, 3232.2524f, 3445.3516f, 3750.7583f, 4094.6714f, 4401.5830f, 4753.4204f, 5549.2319f, 6034.7148f, + 220.6833f, 314.5706f, 622.2172f, 1350.8225f, 1785.5879f, 2077.5837f, 2504.2158f, 3057.6992f, 3436.0974f, 3695.2976f, 3953.4272f, 4267.8701f, 4660.6865f, 5073.6831f, 5501.9478f, 5929.9780f, + 207.8814f, 310.4071f, 646.2098f, 1270.5835f, 1542.7271f, 2079.3804f, 2440.0339f, 2843.4690f, 3272.4854f, 3657.9851f, 4061.2014f, 4444.9780f, 4841.6060f, 5224.5947f, 5620.9141f, 5972.7261f, + 326.1488f, 456.7737f, 740.3350f, 961.4597f, 1262.7579f, 2190.7178f, 2483.5300f, 2872.4180f, 3328.4910f, 3811.0334f, 4153.1602f, 4441.8271f, 4801.1802f, 5065.2988f, 5381.6309f, 5693.2886f, + 206.2046f, 328.0855f, 618.9507f, 980.9994f, 1695.9775f, 1982.3051f, 2275.5444f, 2806.0271f, 3269.5178f, 3491.2456f, 3722.1775f, 4145.9121f, 4843.1167f, 5266.8677f, 5656.8794f, 5992.1201f, + 308.1086f, 407.7706f, 806.7985f, 1045.7629f, 1401.8912f, 2108.3472f, 2331.7849f, 2952.5391f, 3174.1865f, 3374.0686f, 3645.4260f, 4292.7183f, 4939.2969f, 5250.4829f, 5607.2358f, 5932.8657f, + 267.5990f, 378.7492f, 642.2629f, 871.7917f, 1691.7523f, 2087.5117f, 2423.1462f, 2686.1487f, 3021.7893f, 3724.0247f, 4035.5454f, 4369.5903f, 4680.1167f, 4991.4175f, 5323.6875f, 5811.7471f, + 312.3856f, 437.4281f, 714.5340f, 899.5771f, 1632.7545f, 1938.5369f, 2295.5544f, 2625.6189f, 2900.5576f, 3295.4934f, 3557.1260f, 3960.1123f, 4731.6079f, 5141.8447f, 5502.7793f, 5954.0049f, + 332.2842f, 449.0976f, 875.9957f, 1206.1912f, 1422.6793f, 2097.5745f, 2354.2483f, 2715.8494f, 3093.4697f, 3344.5132f, 3623.4814f, 3889.3655f, 4256.2002f, 4994.5742f, 5593.8428f, 5985.9575f, + 286.9586f, 434.7701f, 781.3996f, 1248.3495f, 1835.5530f, 2137.1155f, 2573.7449f, 2869.9299f, 3126.0564f, 3459.1448f, 3769.4475f, 4138.3076f, 4688.0298f, 5084.9028f, 5436.8086f, 5894.2520f, + 327.0000f, 429.0804f, 663.7327f, 849.7463f, 1174.9340f, 2383.3875f, 2695.9597f, 2941.2026f, 3214.4724f, 3433.6287f, 3778.9312f, 4134.8096f, 4504.8022f, 5066.7559f, 5599.2290f, 5985.7334f, + 244.4052f, 499.2254f, 1294.8232f, 1689.3677f, 2123.5024f, 2572.4958f, 3042.9067f, 3446.8752f, 3836.3740f, 4175.6729f, 4485.3213f, 4792.3755f, 5094.9077f, 5386.1816f, 5699.6411f, 6008.2114f, + 561.9757f, 1020.3204f, 1494.1995f, 1841.8171f, 2297.0906f, 2772.6184f, 3204.8804f, 3565.8628f, 3935.4106f, 4253.4141f, 4559.7021f, 4849.9653f, 5140.2852f, 5428.6934f, 5731.2251f, 6023.5078f, + 581.6182f, 1053.5670f, 1478.5878f, 1784.4789f, 2125.1157f, 2454.5889f, 2809.0256f, 3141.7256f, 3490.7529f, 3848.5923f, 4201.7271f, 4568.7720f, 4945.9619f, 5288.6289f, 5647.7642f, 5981.9341f, + 258.9683f, 364.0963f, 722.5463f, 1763.2114f, 1969.3870f, 2265.5239f, 2532.1821f, 2883.3557f, 3388.1838f, 3725.3120f, 4080.9338f, 4390.3818f, 4716.3599f, 5068.4941f, 5452.2778f, 5847.1401f, + 271.5428f, 401.4228f, 695.5894f, 857.3072f, 1776.5358f, 2008.5603f, 2554.4143f, 2844.4021f, 3018.6877f, 3226.1279f, 3482.3398f, 3810.6858f, 4549.3071f, 5266.2764f, 5614.6157f, 5945.6904f, + 330.3132f, 444.6271f, 669.0279f, 874.5479f, 1102.9247f, 2052.1780f, 2436.2378f, 2711.1165f, 3037.7537f, 3298.2036f, 3898.6858f, 4241.5415f, 4606.7637f, 5086.6919f, 5569.7397f, 5988.6797f, + 232.3014f, 344.5512f, 578.5155f, 1213.9569f, 1880.9729f, 2105.6685f, 2335.4148f, 2550.3965f, 3147.6501f, 3491.9253f, 3791.5613f, 4159.6694f, 4642.2441f, 5103.3340f, 5605.4106f, 5989.7969f, + 346.3687f, 444.8047f, 714.3775f, 889.1195f, 1211.8463f, 2168.7598f, 2430.2490f, 2760.6326f, 3012.4961f, 3268.8750f, 3565.1558f, 4172.5791f, 4781.5391f, 5127.6704f, 5512.6323f, 5911.3779f, + 398.0477f, 553.8537f, 845.8521f, 1119.3066f, 1309.7244f, 1928.3351f, 2351.2095f, 2649.8230f, 3050.6750f, 3297.0566f, 3592.7275f, 3916.1785f, 4723.3325f, 5318.1221f, 5703.9697f, 5996.7651f, + 371.4409f, 471.0789f, 896.4924f, 1197.7544f, 1400.8007f, 1611.1555f, 1867.3550f, 2818.4475f, 3002.5906f, 3250.1440f, 3546.5891f, 4265.0371f, 4890.3369f, 5274.4722f, 5659.3560f, 5946.9644f, + 330.9331f, 448.7211f, 808.3973f, 978.2021f, 1652.6361f, 1969.0725f, 2357.0146f, 2680.4792f, 2859.9165f, 3078.9578f, 3423.6895f, 4233.3169f, 4856.7813f, 5086.5723f, 5393.9961f, 5938.6035f, + 323.9659f, 433.8731f, 1045.5168f, 1369.1907f, 1561.9178f, 1984.2457f, 2224.0959f, 2747.3657f, 2995.0359f, 3242.9248f, 3501.0344f, 4022.2388f, 4847.4985f, 5210.9922f, 5658.1357f, 6005.0718f, + 354.6574f, 501.6520f, 852.5305f, 1020.8707f, 1540.5925f, 1998.5675f, 2253.1487f, 2845.3960f, 3056.5273f, 3305.0466f, 3954.2900f, 4591.7471f, 4915.2856f, 5221.9082f, 5544.7285f, 5879.9150f, + 363.1311f, 474.7310f, 907.5490f, 1106.8586f, 1367.2662f, 1646.6934f, 2031.3650f, 2326.4382f, 2568.6519f, 3030.1091f, 3905.6482f, 4265.9111f, 4716.1831f, 5017.0454f, 5469.8149f, 5958.6182f, + 379.9262f, 524.4459f, 845.4813f, 1275.4414f, 1458.2488f, 1772.5863f, 2067.7981f, 2526.8850f, 3066.4063f, 3307.8713f, 3807.2900f, 4199.1509f, 4452.4653f, 4854.7471f, 5464.8833f, 5947.7842f, + 371.8218f, 483.9148f, 778.2747f, 1208.0812f, 1366.3983f, 1623.4895f, 1798.8777f, 2224.6445f, 3103.7175f, 3386.0408f, 3782.8284f, 4307.4727f, 4698.8994f, 5118.1255f, 5505.1919f, 5921.1724f, + 217.9059f, 323.3224f, 639.7305f, 1026.5331f, 1312.9242f, 1885.6948f, 2361.8403f, 2805.5396f, 3213.2600f, 3631.5017f, 4033.4087f, 4426.3423f, 4821.3203f, 5208.3833f, 5590.5205f, 5956.1538f, + 211.9971f, 311.2018f, 504.6345f, 858.3289f, 1574.7019f, 1934.9866f, 2381.4163f, 2786.2043f, 3238.9326f, 3611.0518f, 4005.2578f, 4401.0615f, 4802.1479f, 5192.5493f, 5587.1479f, 5965.5977f, + 219.3884f, 319.3835f, 604.0102f, 1114.8630f, 1481.3870f, 2036.0469f, 2303.4883f, 2616.1384f, 3253.6335f, 3556.5107f, 3946.6567f, 4520.3555f, 5091.0479f, 5416.3037f, 5748.5737f, 5946.5757f, + 350.3716f, 515.4462f, 756.5206f, 1061.4270f, 1251.9570f, 1723.2751f, 2687.6689f, 3036.2019f, 3273.9678f, 3744.2939f, 4098.6284f, 4391.4160f, 4917.6777f, 5244.2852f, 5551.4976f, 5880.1572f, + 311.6069f, 458.7317f, 795.9418f, 969.5021f, 1511.2507f, 1952.5673f, 2273.6116f, 2795.8657f, 3049.7053f, 3578.0598f, 3911.1873f, 4327.2598f, 4735.3105f, 5122.3423f, 5479.7817f, 5858.1504f, + 267.8399f, 390.6757f, 886.2357f, 1179.5110f, 1466.6409f, 2088.7725f, 2328.1262f, 2993.5786f, 3283.5256f, 3593.2822f, 4095.7588f, 4500.4009f, 4887.5132f, 5219.0859f, 5553.4224f, 5915.6831f, + 279.2209f, 413.3200f, 648.4438f, 1282.1798f, 1793.2556f, 1952.1060f, 2484.9436f, 2857.3630f, 3077.2114f, 3548.2585f, 4045.4526f, 4309.5947f, 4760.2900f, 5208.1948f, 5620.9717f, 5968.3237f, + 306.2321f, 424.7843f, 618.7867f, 1288.7572f, 2110.7849f, 2346.5396f, 2582.5366f, 2833.5730f, 3074.3774f, 3464.7886f, 3984.6379f, 4262.0337f, 4601.5132f, 4999.6992f, 5498.8926f, 5920.4814f, + 259.2613f, 353.6931f, 762.5328f, 1906.2162f, 2088.1213f, 2317.9741f, 2546.5935f, 2880.3687f, 3332.0002f, 3636.9216f, 3946.4287f, 4226.0356f, 4502.1084f, 5007.0601f, 5496.4824f, 5924.8877f, + 244.3871f, 357.0287f, 1114.7865f, 1651.1329f, 1850.2976f, 2200.5942f, 2484.7026f, 2872.6968f, 3092.8455f, 3373.5869f, 3707.5891f, 4180.1289f, 4603.5298f, 5132.2671f, 5554.7617f, 5973.5220f, + 700.5439f, 1363.5277f, 1745.2494f, 2081.9539f, 2379.8628f, 2623.6003f, 2883.6484f, 3133.9824f, 3457.7092f, 3819.0100f, 4191.0537f, 4547.0400f, 4912.5127f, 5241.3423f, 5594.9395f, 5930.6099f, + 268.7704f, 370.8200f, 609.4679f, 1558.5339f, 1961.6279f, 2155.8916f, 2419.4485f, 2655.5103f, 3152.6685f, 3426.9221f, 3716.8181f, 4107.1616f, 4965.5698f, 5384.2026f, 5706.7183f, 6015.6196f, + 305.7638f, 395.9599f, 1103.0944f, 1383.6494f, 1612.9742f, 1915.2496f, 2189.8008f, 2555.3608f, 2720.8220f, 3038.2434f, 3927.1301f, 4263.0518f, 4685.7217f, 4984.1377f, 5272.6162f, 5984.5376f, + 294.0385f, 426.7762f, 814.5162f, 1056.9037f, 1715.3539f, 2005.3177f, 2316.4392f, 2647.4297f, 2893.8242f, 3196.7476f, 3720.0044f, 4186.9790f, 4840.4512f, 5290.1250f, 5684.2139f, 5967.5859f, + 359.5141f, 517.6051f, 807.4898f, 1143.5930f, 1328.1393f, 1814.7098f, 2309.8894f, 2618.8655f, 3160.5962f, 3445.0479f, 3883.2664f, 4235.5200f, 4718.7324f, 5367.3608f, 5765.9331f, 6034.9233f, + 241.5752f, 375.5109f, 818.8776f, 1298.7773f, 1656.9050f, 2169.8962f, 2565.1440f, 3015.9919f, 3437.9463f, 3863.8203f, 4254.4023f, 4637.0952f, 5027.8252f, 5358.3784f, 5685.5000f, 5980.4063f, + 322.5406f, 454.9644f, 963.3659f, 1513.8885f, 1704.5070f, 2235.6599f, 2523.6467f, 2995.0757f, 3287.8682f, 3552.8811f, 3872.4360f, 4201.2227f, 4571.9087f, 5066.6792f, 5562.1206f, 5935.7900f, + 412.5748f, 615.8419f, 1126.9519f, 1455.5172f, 1653.3076f, 1965.2689f, 2240.6904f, 2672.5129f, 3127.3301f, 3477.8540f, 3983.6145f, 4458.6558f, 4896.7998f, 5237.9814f, 5609.1597f, 5939.6416f, + 342.1361f, 470.6100f, 958.3576f, 1195.0166f, 1426.4667f, 1684.2009f, 2194.0950f, 2545.9453f, 2946.1851f, 3415.2820f, 3657.4158f, 4408.6763f, 5097.2251f, 5404.2202f, 5719.9829f, 5977.7959f, + 297.8767f, 386.6347f, 1095.8346f, 1454.3085f, 1651.6417f, 1927.9633f, 2198.4927f, 2583.1694f, 2757.0144f, 3009.6497f, 3310.9514f, 3956.9753f, 4677.3208f, 5122.2222f, 5539.0688f, 5993.0542f, + 334.7170f, 450.1582f, 747.3162f, 1560.2024f, 1808.2147f, 2006.5011f, 2415.2419f, 2680.1956f, 3016.5549f, 3651.1340f, 3975.3625f, 4209.6563f, 4531.0396f, 5121.7212f, 5585.2202f, 5962.3667f, + 256.4101f, 495.5723f, 1341.4860f, 1805.1255f, 2201.8318f, 2514.7769f, 2820.4092f, 3102.3867f, 3414.3872f, 3754.7742f, 4108.2378f, 4465.9258f, 4857.4355f, 5216.2144f, 5592.3076f, 5951.9995f, + 530.7974f, 1017.4255f, 1463.9575f, 1858.6631f, 2360.1265f, 2770.3811f, 3106.0894f, 3379.1919f, 3647.7175f, 3895.9026f, 4188.8652f, 4522.8984f, 4893.7954f, 5241.4312f, 5623.8994f, 5975.3608f, + 597.1553f, 1198.0758f, 1722.7361f, 2128.6658f, 2519.1504f, 2825.5122f, 3086.1943f, 3330.0283f, 3608.2961f, 3906.9929f, 4241.8105f, 4603.1694f, 4972.8159f, 5308.1670f, 5651.1968f, 5976.6704f, + 699.1581f, 1293.3193f, 1637.3395f, 1912.7987f, 2163.3445f, 2425.7944f, 2704.0396f, 3006.5984f, 3358.2126f, 3746.1548f, 4125.0762f, 4489.7485f, 4854.0088f, 5188.5146f, 5558.2056f, 5913.3164f, + 489.0107f, 921.4806f, 1329.8511f, 1644.8383f, 2013.6794f, 2365.2683f, 2746.1553f, 3085.6912f, 3457.0234f, 3825.2183f, 4203.4224f, 4575.9331f, 4950.6606f, 5298.7559f, 5659.8618f, 5997.0015f, + 230.3653f, 389.8415f, 938.1970f, 1294.3594f, 1768.8275f, 2189.1001f, 2597.3755f, 2985.8518f, 3323.6023f, 3705.8533f, 4065.5361f, 4446.4224f, 4818.4502f, 5185.9634f, 5583.2168f, 5954.2573f, + 283.9404f, 400.2146f, 630.6198f, 1491.5646f, 2295.1375f, 2496.3457f, 2726.5803f, 2971.1951f, 3207.2317f, 3634.5439f, 4178.0376f, 4423.5537f, 4836.2109f, 5172.1821f, 5464.0454f, 5777.5801f, + 242.6232f, 351.1541f, 807.9852f, 1621.9950f, 2043.8676f, 2532.5122f, 2860.5505f, 3200.3403f, 3499.8274f, 3760.3772f, 4068.9617f, 4410.7339f, 4778.8413f, 5153.0142f, 5553.1997f, 5932.5996f, + 227.3320f, 323.2667f, 752.3189f, 1572.3750f, 1930.6083f, 2355.0117f, 2717.6223f, 2968.3215f, 3233.4026f, 3551.9622f, 3918.5608f, 4346.0190f, 4778.6880f, 5159.6172f, 5568.5566f, 5980.8086f, + 307.9120f, 439.7297f, 660.0276f, 1243.3854f, 1532.3577f, 1796.3936f, 2437.3232f, 2691.4072f, 3030.3025f, 3524.1379f, 3771.7576f, 4083.2375f, 4601.1567f, 4963.4697f, 5434.8530f, 5942.8315f +}; + +const float lsf_cdk_nb_gc_stg1[] = +{ + -50.2820f, -20.3699f, -85.9016f, -168.2552f, -219.7203f, -228.3721f, -209.7385f, -115.7139f, -70.1936f, 2.9143f, 53.7331f, 204.0881f, 324.2565f, 283.0311f, 194.2415f, 55.6127f, + -7.7024f, 55.3216f, 40.0302f, -2.6173f, -31.0254f, -49.9638f, -89.5104f, -79.9710f, -100.2947f, -84.2426f, -89.8130f, -44.4505f, 8.1330f, 123.3018f, 115.2609f, 17.5947f, + -29.7454f, 23.9522f, -6.6145f, -47.3088f, -83.6021f, -109.3905f, -118.2556f, -70.7910f, -71.2423f, -49.5609f, -49.3213f, 0.8054f, 70.8270f, 167.7499f, 132.1748f, 26.7946f, + -46.7868f, 21.9789f, 17.0331f, 1.6574f, -5.3416f, -1.5485f, -24.7294f, -2.2697f, -36.0918f, -31.9601f, -52.9409f, -18.2356f, -16.6137f, 52.8291f, 99.2958f, 9.2780f, + -48.8451f, -8.8573f, -49.2111f, -93.0997f, -116.0209f, -119.2193f, -130.6934f, -90.0435f, -85.8524f, -49.9080f, -30.8948f, 57.8291f, 207.6663f, 238.5938f, 162.1688f, 42.1291f, + 6.0599f, 96.6534f, 89.7254f, 64.7391f, 47.1759f, 39.3332f, 3.8599f, 12.1104f, -25.8483f, -30.7162f, -54.9950f, -24.3625f, -65.0093f, -91.8893f, 41.2788f, -9.3500f, + -74.6215f, -34.1444f, -45.1607f, -35.7601f, 20.1298f, 61.8053f, 45.9485f, 61.3004f, 23.1269f, 17.0184f, -14.6351f, 11.5369f, 40.6714f, 134.6762f, 127.4157f, 23.2286f, + -53.8382f, -7.1967f, 51.3428f, 149.2781f, 132.0314f, 106.9591f, 40.3082f, 28.7839f, -20.0071f, -32.1960f, -69.3754f, -44.7267f, -19.1058f, 81.8775f, 103.3263f, 11.7826f, + -83.4690f, -58.9994f, -100.6923f, -109.7423f, -77.3123f, -51.0569f, -49.0334f, -11.2254f, -13.7028f, 11.7115f, 17.4433f, 113.4333f, 269.5462f, 270.9727f, 181.4436f, 50.9590f, + 19.0904f, 106.4309f, 78.2419f, 22.1934f, -28.2661f, -71.6118f, -97.8980f, -57.5252f, -73.2944f, -59.0236f, -70.7380f, -30.7879f, -16.6118f, 71.0734f, 102.1686f, 10.6722f, + -44.5958f, 9.5910f, -9.9670f, -35.4491f, -36.7779f, -38.2726f, -71.5033f, -56.3692f, -75.3217f, -60.2630f, -64.3206f, -15.0396f, 51.1008f, 156.1136f, 128.1305f, 24.1397f, + -26.8342f, 50.7102f, 47.9495f, 34.1131f, 33.1750f, 40.6004f, 1.8381f, 6.9380f, -34.5476f, -37.5681f, -63.3813f, -32.2824f, -50.5980f, -25.5098f, 69.6276f, -1.2117f, + 6.7027f, 67.8112f, 38.0872f, -23.7302f, -79.0851f, -119.7724f, -146.1929f, -104.8024f, -107.0018f, -86.5365f, -75.9935f, -16.8613f, 84.1440f, 178.1427f, 133.5219f, 27.8811f, + 46.6789f, 157.1987f, 135.6186f, 86.3393f, 50.7338f, 16.6195f, -30.7043f, -23.0751f, -58.4989f, -58.2831f, -83.9640f, -51.4746f, -40.3803f, 39.6990f, 89.0926f, 5.3683f, + -66.8068f, -25.7930f, -49.4702f, -55.7445f, -47.4219f, -47.2327f, -55.9657f, -21.6380f, -32.0155f, -16.3766f, -23.1897f, 25.9724f, 108.6076f, 192.8678f, 143.8874f, 32.5168f, + -29.4610f, 51.1883f, 125.8174f, 178.0158f, 192.4019f, 200.6733f, 150.3214f, 139.0109f, 70.5642f, 49.0546f, 5.2967f, 10.7600f, -32.3233f, -56.1770f, 38.7244f, -6.3720f, + -90.7935f, -86.8579f, -165.1847f, -206.9982f, -177.3116f, -110.7218f, -60.4555f, 28.9968f, 59.3721f, 111.7430f, 148.9078f, 297.0840f, 382.8354f, 319.0586f, 217.5980f, 66.9906f, + -8.8907f, 51.2038f, 20.6150f, -25.0275f, -6.4919f, 28.5998f, -19.2903f, -28.0775f, -67.6854f, -70.6924f, -91.1332f, -51.9799f, 4.7191f, 121.9776f, 114.5332f, 16.9555f, + -29.5779f, 38.1348f, 16.9460f, -13.1717f, -43.7665f, -58.5053f, -66.8853f, -23.5223f, -47.7123f, -38.4358f, -52.6004f, -12.1781f, -9.5310f, 62.0772f, 102.4962f, 10.5329f, + -51.3839f, 10.1170f, 8.8413f, 7.1799f, 27.0856f, 57.8446f, 40.2151f, 55.8005f, 14.1522f, 8.5107f, -25.3037f, -4.1035f, -34.2602f, -19.2221f, 74.9812f, 1.2982f, + -9.0629f, 39.9632f, -4.2048f, -68.4062f, -125.5652f, -168.4946f, -200.3423f, -148.8132f, -131.2517f, -83.3627f, -43.4004f, 70.8276f, 231.0238f, 241.4682f, 165.0121f, 42.8259f, + 23.0736f, 143.9185f, 165.8485f, 141.1318f, 126.9031f, 113.7775f, 58.7625f, 48.6260f, 0.7530f, -14.8817f, -51.1437f, -31.9407f, -63.3610f, -68.5826f, 42.2195f, -8.3010f, + -64.7372f, -30.3666f, -13.8118f, 64.0613f, 130.9271f, 167.6980f, 130.2968f, 120.2481f, 53.8473f, 30.9594f, -13.2901f, -0.2919f, -12.6298f, 33.0601f, 89.8137f, 7.9164f, + -27.4071f, 46.5739f, 73.0324f, 90.7500f, 97.4257f, 110.0360f, 75.8612f, 77.2110f, 30.1418f, 14.8390f, -22.5191f, -7.5352f, -58.3772f, -104.3289f, 27.0985f, -11.5599f, + -48.6199f, -8.4983f, -71.8930f, -149.9820f, -149.4210f, -44.3473f, 3.8456f, 37.8226f, 11.8655f, 4.7745f, -23.8053f, 15.0402f, 99.2230f, 190.4169f, 143.6005f, 32.2851f, + 15.9306f, 86.2159f, 75.9614f, 40.8587f, 13.8614f, -5.1135f, -53.5447f, -49.2651f, -83.1781f, -77.3701f, -94.7805f, -58.1423f, -37.1552f, 59.5436f, 95.8876f, 7.8334f, + -71.4812f, -18.0191f, -10.6353f, -10.9646f, -4.7830f, 7.0689f, -8.9645f, 17.0751f, -8.9055f, -4.5033f, -26.7167f, 6.5207f, 41.1034f, 136.7648f, 126.6881f, 22.6529f, + -13.3071f, 67.8215f, 50.5701f, 22.0055f, -0.1895f, -16.2081f, -44.2669f, -15.2243f, -42.5961f, -37.7900f, -54.1335f, -14.8001f, -44.7622f, -39.3502f, 68.9017f, -1.9700f, + 54.4719f, 135.4882f, 107.6822f, 37.1723f, -15.7729f, -58.2111f, -117.6718f, -111.5628f, -125.9742f, -95.3344f, -71.1785f, 20.4405f, 178.9972f, 225.0608f, 154.3984f, 37.7039f, + 199.1418f, 301.5473f, 242.3446f, 156.1444f, 129.3343f, 112.5769f, 60.9076f, 24.7294f, -36.1788f, -44.7856f, -49.6138f, 35.8621f, 132.4271f, 180.8326f, 145.9355f, 30.7412f, + -95.8307f, -73.4794f, -76.3260f, -32.8480f, 25.0377f, 53.0367f, 47.9260f, 71.8612f, 48.9617f, 48.0805f, 31.5298f, 92.4644f, 215.5727f, 252.6642f, 172.3081f, 47.3738f, + -2.1387f, 144.6784f, 257.4241f, 293.7984f, 302.9054f, 301.4404f, 234.6555f, 199.2878f, 117.8049f, 82.4572f, 28.1316f, 27.9394f, -20.8952f, -53.5108f, 47.9862f, -3.2292f +}; + +const float lsf_cdk_nb_gc_stg2[] = +{ + -11.7897f, -34.0201f, -78.3915f, -67.4130f, 11.6646f, 27.0897f, + -25.4365f, -16.9519f, 1.3623f, -14.4721f, -40.8934f, -28.8082f, + -17.5541f, -24.8863f, -42.0546f, -57.4396f, -48.2462f, -17.3640f, + -23.4838f, -18.0105f, -23.4463f, -23.8641f, 20.1374f, 22.8944f, + -27.9673f, -51.2149f, -32.0136f, 58.4191f, 66.0445f, 33.8922f, + -28.8229f, -24.7667f, 12.6486f, 32.0241f, 14.4964f, 5.0635f, + 11.7718f, 12.7508f, -18.2755f, -64.0918f, -88.2808f, -46.2724f, + 11.7478f, -4.0560f, -28.8370f, -15.2873f, -17.0688f, -21.2716f, + 21.1704f, 4.6685f, -15.1944f, 19.2773f, 48.9464f, 24.7768f, + -31.9223f, -48.4027f, -40.5826f, -2.3521f, -7.7634f, -9.3639f, + 49.8116f, 38.9864f, -9.6274f, -43.4792f, -14.3368f, 6.7127f, + -17.8859f, 16.5261f, 17.9780f, -18.2431f, -4.9259f, 4.9691f, + 34.1057f, 28.5456f, 37.3357f, 25.9730f, -12.0323f, -14.3174f, + -35.7203f, -11.7712f, 71.0202f, 87.9962f, 53.5089f, 22.0342f, + -29.0835f, 7.8202f, 61.7147f, 30.4243f, -7.0096f, -12.3327f, + 121.0591f, 124.7827f, 86.3632f, 52.5283f, 25.7588f, 2.2977f +}; + +const float lsf_cdk_nb_gc_stg3[] = +{ + -20.1057f, -62.1359f, -90.9211f, -83.2088f, -41.8080f, 4.3801f, 64.9293f, 55.2259f, 18.8953f, 8.4560f, + -12.4851f, -29.8479f, -46.3014f, -59.0597f, -57.9280f, -55.5646f, -16.2912f, 29.7501f, 6.4438f, 1.9289f, + -42.4234f, -57.2848f, -42.1410f, -25.0914f, -20.5850f, -22.9466f, -28.6753f, -9.5206f, -2.8536f, -2.4606f, + 2.9437f, -3.2337f, -19.4418f, -30.8279f, -40.2200f, -54.7107f, -69.2608f, -36.5696f, -14.6763f, -7.4390f, + 56.9685f, 42.9405f, 2.6357f, -28.9316f, -41.7842f, -41.1244f, 7.2469f, 37.7725f, 9.4299f, 3.8716f, + -13.4056f, -11.0915f, -7.8932f, -4.4242f, -3.6432f, -6.2205f, -52.2374f, -101.3244f, -31.8836f, -12.9959f, + -49.5845f, -68.9839f, -40.9861f, -4.8425f, 25.7585f, 49.5206f, 52.3506f, 42.0803f, 18.1566f, 7.3750f, + 7.9175f, 30.0116f, 39.2961f, 39.8519f, 33.8428f, 18.7027f, -42.1156f, -114.4817f, -41.9139f, -14.3475f, + -10.3140f, -13.1813f, -8.6771f, -12.5086f, -7.9996f, 8.1476f, 62.8062f, 70.2916f, 23.1315f, 10.3555f, + 7.8827f, -9.7751f, -27.3751f, -19.0843f, -3.1083f, 5.0911f, -8.9477f, -1.9864f, -0.0476f, -1.0431f, + -25.6990f, -1.3466f, 13.9307f, -1.5450f, -21.5161f, -36.5054f, -27.3657f, 9.1052f, 0.5716f, -0.5675f, + 26.0226f, 39.0806f, 25.3016f, 10.6567f, -7.6451f, -27.7012f, -57.9450f, -49.0041f, -17.4613f, -8.2350f, + 24.7306f, 40.5991f, 39.1729f, 32.6364f, 20.0500f, 9.7588f, 17.8440f, 32.3000f, 10.7014f, 4.0975f, + -31.9825f, -23.6145f, 19.2348f, 43.8139f, 32.4545f, 14.8018f, -12.9031f, -14.2377f, -3.4099f, -2.2026f, + 17.4813f, 29.7370f, 40.6045f, 56.0407f, 77.3266f, 109.6360f, 126.9981f, 90.0105f, 41.2847f, 18.3934f, + 62.0530f, 98.1263f, 103.5605f, 86.5243f, 56.8051f, 24.7345f, -16.4333f, -39.4116f, -16.3685f, -5.1868f +}; + +const float lsf_cdk_nb_vc_stg1[] = +{ + -47.8739f, -33.3324f, -111.7403f, -187.1021f, -217.8067f, -211.2333f, -197.1951f, -112.5993f, -54.4085f, 25.6601f, 103.3922f, 273.8963f, 384.4787f, 321.9756f, 214.8825f, 64.7502f, + 5.7213f, 62.0822f, 4.1813f, -75.3379f, -130.0791f, -169.8000f, -137.2333f, -8.1913f, 9.1551f, 12.5919f, -10.2666f, 24.1670f, 78.8903f, 170.0603f, 136.5900f, 28.5131f, + -61.2759f, -38.8420f, -92.0781f, -106.8447f, -84.5683f, -75.2343f, -90.1177f, -57.8575f, -57.3309f, -23.0973f, -6.5859f, 96.8941f, 263.0488f, 266.3097f, 177.9874f, 48.9404f, + -4.6756f, 65.2555f, 47.7555f, 30.0066f, 28.7910f, 33.2401f, 1.0363f, 13.6479f, -20.0856f, -24.5283f, -44.3793f, -10.0354f, -56.2017f, -77.3347f, 55.5984f, -6.2838f, + -40.8653f, -14.8363f, -92.0112f, -175.7323f, -221.1710f, -161.1121f, -52.8429f, 37.5645f, 41.2468f, 45.5229f, 26.4500f, 86.3998f, 219.2824f, 253.3986f, 172.4165f, 46.3912f, + -35.6673f, 17.5904f, -11.9410f, -25.7858f, -8.8584f, 21.6273f, 0.1729f, 6.5783f, -34.6991f, -36.4150f, -56.0023f, -21.0789f, -19.8846f, 54.1067f, 99.1987f, 9.4728f, + -14.2776f, 27.3931f, -14.6997f, -66.6010f, -99.6813f, -122.6578f, -150.2305f, -113.9728f, -109.1274f, -78.9555f, -60.2257f, 27.8011f, 190.2385f, 229.8084f, 157.2525f, 39.3867f, + 7.6929f, 67.9322f, 38.8456f, -21.1201f, -59.7777f, -99.3488f, -141.1098f, -110.2669f, -114.7237f, -91.8703f, -77.7551f, -15.8694f, 90.5305f, 184.5058f, 136.0935f, 29.0311f, + -81.2402f, -78.5803f, -151.4014f, -172.9501f, -128.6324f, -73.2223f, -54.4444f, -10.0382f, 0.8191f, 49.8313f, 85.4796f, 237.9407f, 375.9963f, 320.3293f, 212.6340f, 64.0690f, + -7.5501f, 56.9796f, 22.4374f, -12.3837f, -25.5942f, -46.4205f, -67.6393f, -25.5805f, -48.1321f, -39.6622f, -53.1014f, -11.2472f, -23.2435f, 35.6549f, 94.7977f, 6.9705f, + -35.2312f, 5.7296f, -40.3538f, -74.0301f, -73.9051f, -78.4101f, -69.6657f, -23.5663f, -38.8351f, -23.3996f, -29.2527f, 14.7714f, 60.7441f, 159.3770f, 132.0680f, 26.1624f, + 63.7916f, 158.4710f, 108.6537f, 49.2831f, 12.4814f, -34.2755f, -68.0055f, -38.2006f, -61.2743f, -54.7496f, -73.2102f, -37.3536f, -2.8530f, 99.6502f, 109.4658f, 14.7136f, + -46.8550f, -17.8951f, -73.5817f, -109.9269f, -59.6995f, 13.9228f, 17.3227f, 37.6147f, 5.2378f, 2.5800f, -15.0369f, 23.6412f, 86.2658f, 178.2385f, 140.5764f, 30.3354f, + -64.0179f, -34.7786f, -33.8634f, 32.5490f, 41.5821f, 30.0052f, 2.8933f, 7.9098f, -23.6020f, -21.4437f, -40.3389f, -5.3147f, 46.4389f, 149.8765f, 129.5062f, 24.3633f, + 53.2208f, 88.2962f, 18.1083f, -68.6983f, -163.9225f, -257.5996f, -286.3273f, -136.1982f, -54.0297f, 17.4621f, 96.5930f, 257.5079f, 374.4247f, 316.8143f, 211.5481f, 63.1783f, + 174.9770f, 220.4714f, 114.9514f, 39.1980f, 15.6628f, -57.4971f, -151.3537f, -151.4255f, -122.5434f, -39.5915f, 43.3476f, 204.8011f, 347.0733f, 300.8141f, 202.2481f, 58.3570f, + -24.8002f, 5.5647f, -51.1305f, -108.2679f, -143.4691f, -168.1934f, -183.0667f, -123.7768f, -105.2566f, -53.2548f, -15.6183f, 132.2483f, 301.9698f, 276.6960f, 185.6425f, 51.4215f, + 63.0767f, 97.9030f, 23.3427f, -27.8271f, -7.6827f, 11.5110f, -9.1648f, -16.5310f, -60.2418f, -68.6020f, -79.4697f, -9.9630f, 143.1208f, 212.2018f, 148.4344f, 34.8853f, + -52.8577f, -17.0901f, -38.4446f, -44.4913f, -48.3650f, -49.3479f, -79.7237f, -66.0328f, -77.9226f, -56.8956f, -48.1326f, 19.1059f, 138.4749f, 210.3387f, 148.5705f, 35.3026f, + 16.4209f, 102.4966f, 100.9513f, 64.0511f, 50.2873f, 36.1014f, -21.6103f, -26.7705f, -65.0290f, -62.8056f, -83.1056f, -46.5621f, -51.3341f, 1.7945f, 78.1135f, 1.0912f, + -75.6609f, -71.8274f, -139.7561f, -117.4244f, -22.4806f, 39.5285f, 53.1389f, 65.2518f, 36.9996f, 37.9781f, 25.3240f, 92.8186f, 227.9041f, 260.3466f, 176.7927f, 48.2170f, + -18.6440f, 33.8824f, 28.5803f, 10.9212f, 5.0722f, 4.4072f, -39.6675f, -38.3990f, -75.6662f, -72.1438f, -87.2765f, -46.7029f, -6.7231f, 107.6602f, 110.8838f, 15.3706f, + 21.3981f, 74.2394f, 19.3760f, -47.0944f, -99.2094f, -138.5254f, -193.3578f, -171.5091f, -176.8980f, -112.0385f, -43.8164f, 79.0272f, 251.8247f, 251.6656f, 170.8083f, 44.5524f, + 67.4133f, 149.9282f, 118.6238f, 30.5943f, -33.2344f, -70.7200f, -120.6338f, -105.4183f, -118.8368f, -86.5003f, -64.0278f, 50.0950f, 231.7671f, 247.4923f, 167.0543f, 43.3706f, + -40.9878f, -39.3167f, -163.9672f, -281.7721f, -267.4339f, -138.3948f, -88.8411f, 0.7440f, 65.0724f, 165.9769f, 269.7260f, 427.8145f, 485.5638f, 388.7820f, 254.5937f, 84.1430f, + 12.9002f, 76.9394f, 62.5283f, 13.6656f, -10.4341f, -35.7194f, -84.1773f, -75.4588f, -98.8663f, -85.0203f, -91.0417f, -43.6094f, 6.1868f, 120.0995f, 114.3634f, 17.2779f, + -21.4884f, 29.4970f, 1.0910f, -37.4928f, -55.1841f, -66.8253f, -92.8491f, -74.1643f, -90.3904f, -72.3158f, -69.6267f, -16.2943f, 51.2075f, 158.6230f, 128.0881f, 24.5940f, + 140.4902f, 213.5873f, 167.7455f, 102.0038f, 85.7659f, 59.5426f, 9.2403f, -0.7622f, -35.6690f, -35.9801f, -58.6565f, -15.1000f, 23.5135f, 101.5155f, 111.5278f, 16.5967f, + -62.8100f, -47.2312f, -97.3130f, -60.9976f, 82.6761f, 193.9902f, 154.0588f, 118.2896f, 43.6828f, 13.9735f, -22.6650f, 0.5943f, 26.8732f, 111.3673f, 120.5305f, 20.1022f, + -44.4747f, -10.4204f, 32.1805f, 131.3261f, 157.9129f, 155.8841f, 90.2107f, 70.7406f, 9.4064f, -4.0535f, -42.4163f, -26.0150f, -39.1314f, 20.5559f, 82.2390f, 4.9553f, + 88.4086f, 134.4090f, 60.3778f, -13.5659f, -72.1912f, -160.4579f, -261.2583f, -247.6886f, -121.4628f, -13.9737f, 35.4003f, 197.3431f, 335.8232f, 294.0672f, 197.4029f, 56.5130f, + 267.3715f, 336.4754f, 224.6896f, 104.9689f, 104.5109f, 94.7971f, -20.0482f, -88.9197f, -142.8754f, -60.7279f, 30.3207f, 189.5033f, 335.5709f, 295.5561f, 200.0838f, 57.2552f +}; + +const float lsf_cdk_nb_vc_stg2[] = +{ + -9.6827f, -17.9738f, -44.2587f, -53.7409f, 10.1005f, 32.4057f, + -29.5803f, -35.3673f, -50.3175f, -49.1053f, -47.5762f, -37.2894f, + -10.3138f, -3.1171f, 2.9317f, -20.2045f, -78.9643f, -84.6932f, + 13.6252f, 8.7360f, -21.5126f, -20.8022f, -14.8279f, -30.9676f, + -28.1089f, -48.1602f, -64.6161f, -0.2872f, 108.6371f, 93.6271f, + -38.2393f, 1.9703f, 14.1451f, -7.5949f, 39.2872f, 33.7052f, + -38.5209f, -10.1299f, 61.9126f, 45.3993f, -7.5115f, -17.0167f, + 26.2164f, 20.2119f, 40.4075f, 45.2381f, -2.3925f, -17.4109f, + -19.1953f, -10.5024f, 12.6622f, -19.8408f, -40.6066f, 1.8757f, + -32.7274f, -41.0545f, -26.1793f, 15.7486f, 1.2783f, -17.0256f, + 3.5921f, 2.2211f, -27.0254f, -81.1776f, -88.9427f, -11.1151f, + 48.7753f, 42.6625f, 3.8241f, -21.1582f, 27.5770f, 36.8815f, + 6.8266f, -6.1852f, -19.6226f, 28.9512f, 50.9852f, 15.2853f, + -33.3786f, -38.1386f, 24.6782f, 95.1954f, 64.2442f, 33.4105f, + 49.0652f, 49.8207f, 29.3688f, -11.7891f, -57.3484f, -44.4722f, + 91.6464f, 85.0063f, 63.6020f, 55.1679f, 36.0606f, 12.7997f +}; + +const float lsf_cdk_nb_vc_stg3[] = +{ + -16.5483f, -67.8691f, -113.3476f, -92.9768f, -18.1549f, 21.7013f, 31.7869f, 25.1431f, 9.0112f, 3.4920f, + -7.8375f, -22.7162f, -45.0895f, -61.3419f, -64.4643f, -67.3643f, -44.8953f, -6.2556f, -7.9342f, -3.9490f, + -63.5255f, -72.6896f, -45.5471f, -30.5803f, -26.8317f, -24.4668f, -15.1301f, 4.8754f, -0.5588f, -0.8157f, + -2.2381f, 13.4403f, 16.0097f, 1.0526f, -24.8448f, -61.3997f, -91.3894f, -39.4637f, -19.2183f, -9.1265f, + -16.0140f, -32.7087f, -45.2478f, -59.4365f, -60.1819f, -31.6687f, 70.4575f, 64.2544f, 19.1841f, 9.3201f, + -8.2141f, 2.4761f, 7.4360f, 11.7049f, 14.0396f, 16.9693f, -53.7166f, -119.3159f, -33.5007f, -15.4114f, + -64.5115f, -52.5888f, 30.5453f, 56.2986f, 31.6535f, 9.3509f, 4.3678f, 13.3055f, 5.1440f, 2.0290f, + 22.3180f, 44.1101f, 48.7477f, 40.2739f, 14.9495f, -7.3707f, -10.3082f, 6.3741f, 1.0122f, 0.2673f, + -42.3440f, -58.8447f, -42.2171f, -8.0384f, 34.3873f, 59.7095f, 50.7660f, 38.7146f, 16.7582f, 7.2512f, + -0.1088f, -28.5624f, -30.3477f, -2.8206f, -1.3093f, -12.9286f, -21.2371f, -1.4331f, -2.6014f, -1.5170f, + -41.2001f, 4.7383f, 13.3788f, -12.5767f, -22.3489f, -14.4064f, 10.9753f, 22.2182f, 6.2625f, 2.5488f, + 63.9302f, 51.1717f, 10.5411f, -23.3105f, -47.9860f, -59.1260f, -29.9675f, 0.0559f, -4.8774f, -2.3217f, + 37.1022f, 14.8587f, -19.5761f, -23.3122f, 2.3273f, 32.9204f, 53.1779f, 43.4994f, 16.5403f, 7.5156f, + 48.8143f, 82.6708f, 85.7133f, 77.5688f, 56.9332f, 24.0950f, -63.9412f, -138.5729f, -45.8026f, -17.6440f, + -4.0024f, 18.2212f, 40.5425f, 57.9095f, 69.5262f, 79.8498f, 71.0971f, 51.3637f, 24.2751f, 10.9558f, + 94.3797f, 104.2925f, 88.4585f, 69.5855f, 42.3052f, 34.1349f, 37.9570f, 35.2368f, 16.3058f, 7.4056f +}; + +const float lsf_cdk_wb_gc_stg1[] = +{ + -21.1721f, -6.9787f, -78.7739f, -158.7331f, -205.5198f, -259.2706f, -287.6161f, -271.9965f, -264.8213f, -231.0206f, -194.9294f, -147.7609f, -117.1413f, -85.8077f, -63.7689f, -31.4680f, + -66.9546f, -30.5144f, -36.8376f, -53.0491f, -36.1642f, -48.5647f, -62.2295f, -55.2760f, -57.6386f, -55.8977f, -55.9952f, -40.6957f, -43.2573f, -33.7185f, -37.3113f, -27.4703f, + -18.0276f, 24.5300f, -3.1374f, -40.7788f, -39.2887f, -55.1486f, -87.4694f, -97.8466f, -113.0920f, -112.2454f, -110.4983f, -92.0446f, -80.8734f, -57.2883f, -52.4648f, -39.3426f, + -14.5043f, 41.4594f, 30.8683f, 19.7189f, 29.0785f, 7.4155f, -21.7427f, -23.9321f, -38.3113f, -41.2907f, -40.8309f, -25.7969f, -29.7702f, -20.8620f, -29.2581f, -26.0135f, + -39.7173f, -14.6068f, -62.7880f, -111.0359f, -122.7799f, -150.6084f, -167.3332f, -164.6087f, -165.9175f, -146.9592f, -135.1085f, -110.8433f, -97.6828f, -72.7079f, -64.6184f, -45.5537f, + -42.5539f, 26.5080f, 31.4593f, 1.2393f, 1.6319f, 6.6465f, 16.6621f, 35.3616f, 33.5966f, 53.0816f, 65.9800f, 78.6870f, 64.5119f, 50.4778f, 20.7076f, 7.5572f, + -2.4650f, 88.7057f, 93.4778f, 47.6900f, 47.2210f, 51.8796f, 27.4629f, 23.3020f, 8.4560f, 12.2382f, 12.4948f, 25.9549f, 18.2040f, 17.5385f, -2.2674f, -6.8910f, + -25.2995f, 40.1554f, 131.5320f, 193.8438f, 224.6298f, 213.8258f, 187.1185f, 169.5623f, 131.4438f, 108.3838f, 93.4648f, 94.1147f, 68.7427f, 48.9293f, 15.1647f, 1.4396f, + -63.4604f, -63.8774f, -152.1996f, -247.2777f, -281.1492f, -288.1032f, -252.3883f, -181.6764f, -141.4441f, -90.3039f, -56.5279f, -23.8054f, -11.9068f, -1.3377f, -7.5474f, -0.6953f, + -77.4333f, -60.8457f, -86.6258f, -86.4012f, -29.1547f, 7.2174f, 40.0438f, 63.6826f, 53.0035f, 51.5329f, 55.6684f, 68.8552f, 50.7040f, 34.0814f, 7.7594f, -2.1278f, + 30.9564f, 87.5489f, 69.5663f, 23.2907f, 13.9146f, -0.9477f, -37.0125f, -58.8950f, -99.1749f, -117.9716f, -127.4967f, -107.3465f, -91.7610f, -62.6527f, -50.4613f, -32.9533f, + -64.2954f, -37.5670f, -21.0138f, 41.6351f, 121.9423f, 170.7496f, 195.4955f, 225.2859f, 224.2241f, 223.8838f, 222.3937f, 225.7590f, 188.7341f, 143.2967f, 83.3796f, 41.8113f, + 10.6654f, 55.4135f, 18.0177f, -53.2381f, -88.7693f, -114.5825f, -122.2372f, -110.6857f, -120.7652f, -124.3872f, -136.2432f, -135.4537f, -132.9560f, -104.3421f, -82.6202f, -57.8286f, + -56.8219f, -2.2176f, 4.5106f, 4.9045f, 63.5084f, 94.3949f, 92.6963f, 98.2198f, 78.5731f, 65.0247f, 60.8502f, 70.0685f, 53.4160f, 34.2990f, 2.3436f, -13.6945f, + 62.5259f, 160.0315f, 153.0699f, 116.3367f, 94.9113f, 59.6879f, 36.7834f, 42.8554f, 34.9832f, 32.1663f, 34.2612f, 46.5764f, 32.6032f, 22.8721f, -2.2313f, -9.0276f, + -17.8885f, 81.5994f, 153.8725f, 203.3483f, 260.8972f, 308.2464f, 337.7084f, 369.5280f, 355.1932f, 340.5538f, 332.7582f, 318.9620f, 261.2268f, 196.0706f, 116.6797f, 63.9204f, + 20.6478f, 57.4084f, 3.7268f, -83.6103f, -145.3750f, -207.9262f, -235.3695f, -209.9292f, -200.7669f, -173.1530f, -148.7498f, -120.9027f, -110.3875f, -91.3718f, -83.8093f, -58.7850f, + -39.9125f, 14.8531f, -3.7779f, -42.3801f, -47.0086f, -54.0654f, -37.4186f, -7.7530f, -2.3503f, 11.8227f, 22.9690f, 37.9258f, 31.1117f, 26.1390f, 3.9131f, -4.7425f, + 13.2679f, 79.8638f, 51.3108f, -15.0032f, -39.4744f, -78.1680f, -87.2337f, -58.9813f, -51.8486f, -39.6199f, -34.6732f, -22.2829f, -24.1548f, -18.6608f, -25.3619f, -24.4411f, + -31.4295f, 11.0108f, 63.6155f, 150.7589f, 166.6739f, 132.7679f, 86.6371f, 71.7386f, 36.6906f, 13.2914f, -2.6491f, 5.5439f, -13.1750f, -13.8798f, -27.3878f, -22.3777f, + -24.3473f, 16.7839f, -21.6102f, -77.9093f, -107.7952f, -144.9666f, -139.6022f, -95.3828f, -79.5686f, -54.4138f, -40.2750f, -17.7668f, -12.9124f, -7.1218f, -21.3606f, -21.7144f, + -3.0221f, 85.8766f, 60.9027f, 16.5821f, 7.9817f, -16.4117f, -11.2119f, 17.4948f, 20.8488f, 33.8053f, 43.5158f, 54.6661f, 45.1287f, 38.3086f, 11.1080f, 2.6446f, + 6.4417f, 122.4950f, 125.6148f, 93.2892f, 108.5553f, 111.2156f, 105.3841f, 113.7573f, 102.0970f, 107.1194f, 105.9578f, 110.0393f, 89.3394f, 67.9986f, 28.3953f, 10.5845f, + 5.3008f, 132.8202f, 246.6148f, 259.5175f, 279.9749f, 270.1955f, 242.3427f, 226.1996f, 198.6216f, 175.1598f, 153.5215f, 148.0765f, 116.8644f, 82.8352f, 39.2114f, 16.4926f, + -77.2826f, -81.0630f, -142.8123f, -175.7374f, -154.6778f, -134.7003f, -107.5754f, -71.3200f, -53.8328f, -25.9739f, -7.0973f, 14.6180f, 12.4415f, 12.6191f, -3.8318f, -4.2210f, + -73.5975f, -49.6810f, -33.1272f, 10.8925f, 60.1080f, 61.8344f, 45.3548f, 45.5924f, 22.6090f, 11.2679f, 6.9455f, 18.9899f, -3.4566f, -13.0973f, -24.6136f, -17.3529f, + 93.3489f, 170.7564f, 135.3343f, 56.2893f, 22.2173f, -20.1927f, -41.3723f, -39.2133f, -50.1699f, -54.9363f, -60.2521f, -47.5990f, -54.0679f, -44.0381f, -47.1772f, -37.0088f, + -27.3811f, 60.8027f, 88.5729f, 82.6088f, 118.1956f, 140.5540f, 153.1990f, 173.3699f, 166.1148f, 168.4157f, 165.4583f, 168.4201f, 141.6623f, 111.7883f, 61.8626f, 28.6598f, + 61.0331f, 119.7275f, 83.9777f, -1.2269f, -56.5834f, -121.3104f, -176.1751f, -202.5282f, -219.9765f, -194.9138f, -167.0230f, -130.8084f, -105.0937f, -81.6082f, -73.9476f, -53.6392f, + -27.5935f, 45.9596f, 43.4074f, 35.4528f, 51.8229f, 58.2166f, 66.0162f, 87.5896f, 84.5125f, 96.2322f, 104.1692f, 116.0263f, 98.4793f, 78.3333f, 38.3067f, 15.3865f, + 174.0302f, 282.5094f, 259.6900f, 204.4108f, 189.3996f, 158.0569f, 123.9944f, 123.1922f, 118.3560f, 110.6961f, 101.0661f, 96.5273f, 78.1838f, 52.7614f, 22.4974f, 2.3781f, + 59.8885f, 245.4498f, 371.2458f, 409.7723f, 455.9382f, 450.3678f, 424.1982f, 412.1477f, 364.9408f, 325.9947f, 285.4946f, 257.5709f, 202.0349f, 150.8332f, 79.0164f, 39.6259f +}; + +const float lsf_cdk_wb_gc_stg2[] = +{ + -30.3104f, -56.7575f, -84.1487f, -72.1960f, -22.8352f, 3.3243f, + -46.3791f, -58.1840f, -25.7428f, -7.3327f, -15.5902f, -11.0671f, + -25.6715f, -22.2643f, -12.1418f, -44.6014f, -57.5933f, -25.0539f, + 20.6377f, 3.9627f, -56.7740f, -110.5344f, -99.0040f, -23.5388f, + -33.0807f, -65.7310f, -43.7344f, 59.6097f, 60.3127f, 29.3885f, + 12.2596f, 64.5636f, 86.5834f, 56.7668f, 33.1992f, 8.0321f, + -27.2580f, -0.3414f, 60.0624f, 27.3071f, -13.3937f, -18.6842f, + 24.2406f, 11.7818f, 14.7099f, 38.2644f, 1.7464f, -12.1068f, + 7.3676f, -14.0551f, -58.7823f, -43.8456f, 44.8481f, 49.4476f, + -27.1385f, -20.1290f, 3.2930f, 11.7314f, 24.8512f, 17.5045f, + 6.8143f, -14.7678f, -42.8682f, -16.1166f, -13.7942f, -20.4421f, + 1.4928f, 29.4512f, 13.1269f, -26.8534f, -7.1498f, 6.9288f, + 12.0685f, 25.8088f, 13.8913f, 37.8771f, 77.3020f, 41.3878f, + -31.3089f, -16.5767f, 72.2701f, 101.6937f, 66.1076f, 29.3520f, + 33.0047f, 43.3667f, 18.6451f, -26.2905f, -83.9726f, -67.8400f, + 103.2615f, 89.8720f, 41.6101f, 14.5203f, 4.9658f, -6.6327f +}; + +const float lsf_cdk_wb_gc_stg3[] = +{ + -41.3186f, -87.9369f, -117.0141f, -113.4593f, -76.4138f, -35.5126f, -13.8432f, -7.5581f, -3.0880f, 2.3802f, + -19.0684f, -32.7726f, -38.9479f, -44.5597f, -48.0524f, -54.3931f, -59.1547f, -53.0509f, -42.1806f, -24.7633f, + 27.3501f, -3.4361f, -42.3300f, -83.6244f, -126.2025f, -139.2743f, -121.0968f, -84.5803f, -46.8967f, -18.1514f, + -0.8794f, 7.8351f, 13.7504f, 10.5629f, -2.3365f, -27.6351f, -53.8406f, -67.9140f, -63.0094f, -41.9336f, + 9.4961f, -11.0357f, -24.5415f, -6.6821f, 20.3012f, 24.1832f, 9.4935f, -5.4294f, -16.9057f, -12.2235f, + -53.4765f, -68.3201f, -39.2295f, -10.3152f, -3.0430f, -6.2765f, -10.5345f, -10.9752f, -8.2812f, -5.0682f, + 52.0481f, 94.0614f, 84.0495f, 48.7509f, 4.2751f, -40.3696f, -69.1195f, -63.3772f, -42.9216f, -24.6160f, + 10.0049f, 13.7676f, 17.2697f, 29.3297f, 46.7856f, 60.3615f, 66.0947f, 59.6799f, 45.2938f, 27.9216f, + 3.2564f, -15.2692f, -47.6037f, -66.2845f, -62.6754f, -33.3695f, 8.7487f, 22.9938f, 23.4655f, 15.0233f, + -23.6148f, 4.1981f, 21.0969f, 4.2267f, -12.9805f, -17.4187f, -2.7787f, 14.0826f, 22.1174f, 12.4585f, + 44.7733f, 31.5401f, -0.1129f, -26.8177f, -43.6473f, -45.9941f, -38.3653f, -26.4489f, -17.8081f, -11.4307f, + -21.6468f, 9.0710f, 56.6256f, 68.0223f, 58.5665f, 37.6095f, 13.9228f, -1.0286f, -7.3812f, -7.6752f, + 45.1285f, 52.2192f, 35.8172f, 24.0812f, 18.9679f, 16.9917f, 14.5014f, 8.4539f, -0.8742f, -3.9224f, + -36.6106f, -54.0904f, -50.6995f, -17.6751f, 24.5062f, 61.1192f, 77.2085f, 68.1297f, 51.1173f, 30.6627f, + 45.4659f, 77.8448f, 86.8785f, 84.8886f, 78.1169f, 70.7257f, 58.9888f, 47.0442f, 34.4050f, 19.2233f, + -40.9082f, -17.6764f, 44.9914f, 99.5556f, 123.8320f, 129.2527f, 119.7749f, 99.9787f, 72.9475f, 42.1147f +}; + +const float lsf_cdk_wb_vc_stg1[] = +{ + -28.5460f, -28.7607f, -132.3446f, -253.0434f, -312.8796f, -342.8824f, -300.5386f, -244.2990f, -209.7251f, -159.5373f, -112.6287f, -67.3791f, -48.8219f, -29.0922f, -22.2704f, -4.3572f, + -46.5981f, -22.9649f, -50.9384f, -55.9409f, -47.4823f, -67.2740f, -93.7612f, -98.1688f, -103.5437f, -102.1144f, -101.9471f, -86.9149f, -76.1870f, -53.2461f, -51.2004f, -39.3148f, + 12.7666f, 41.7683f, -13.1290f, -96.2977f, -149.3018f, -210.6122f, -234.0799f, -215.3711f, -220.5745f, -210.7746f, -191.5374f, -156.6170f, -137.7840f, -109.8098f, -92.2552f, -56.2013f, + -45.2993f, -13.6438f, -31.2795f, 0.5585f, 26.1751f, 13.9611f, 18.6252f, 28.1510f, 20.3802f, 26.9694f, 32.9577f, 42.5006f, 29.2892f, 25.1029f, 1.3317f, -5.8774f, + -65.7100f, -62.1535f, -124.6012f, -161.3454f, -151.1323f, -164.9561f, -165.1614f, -150.4622f, -139.8421f, -109.2422f, -83.0457f, -55.1891f, -45.0696f, -29.5104f, -29.5390f, -21.1071f, + -75.2456f, -87.4543f, -164.3682f, -176.4217f, -83.4371f, -28.9912f, -6.9410f, 7.5825f, -2.7413f, 1.1408f, 4.1258f, 6.3013f, -0.6780f, -0.2756f, -18.0540f, -14.7263f, + 109.2056f, 132.5509f, 37.4910f, -93.8923f, -199.5966f, -323.5385f, -370.8597f, -259.1066f, -144.1366f, -52.9207f, -7.3753f, 8.7209f, 4.6669f, 18.2182f, 35.3204f, 18.9218f, + 34.9292f, 54.1737f, -19.4212f, -84.9971f, -62.3420f, -22.1402f, -18.0859f, -54.5195f, -107.3912f, -147.4533f, -198.2396f, -216.4862f, -199.3848f, -152.0050f, -94.9586f, -38.9081f, + -43.7524f, -65.5612f, -209.2403f, -339.0183f, -315.2712f, -219.0569f, -129.2175f, -68.7060f, -44.3255f, -17.2217f, 5.9129f, 29.8303f, 18.2167f, 13.0068f, -3.9593f, 4.1232f, + -20.9014f, 30.0658f, 17.8576f, -24.7442f, -27.5837f, -29.5508f, -45.9995f, -42.7483f, -54.9773f, -59.2762f, -57.4101f, -42.5711f, -43.9485f, -38.1621f, -41.1044f, -32.5227f, + -0.5370f, 38.0716f, 14.4030f, -41.8046f, -67.6856f, -96.6404f, -122.3561f, -123.7498f, -138.9439f, -138.4913f, -136.8318f, -124.9522f, -118.9503f, -96.3028f, -81.0357f, -58.1597f, + -19.4244f, 61.2237f, 71.3972f, 25.6367f, 35.9458f, 21.4457f, -1.7383f, 3.2413f, -12.2673f, -20.9311f, -19.4463f, -5.0683f, -9.0711f, -11.3618f, -25.0494f, -19.2853f, + -30.0686f, 7.6179f, -29.1133f, -90.4660f, -97.3464f, -101.9661f, -79.7809f, -41.4927f, -30.2058f, -14.9387f, -1.3463f, 14.7957f, 5.7342f, -1.8387f, -13.7457f, -15.5035f, + -60.0474f, -62.2162f, -94.9658f, -16.5692f, 137.3642f, 195.2581f, 171.5869f, 140.1564f, 102.9256f, 81.4529f, 62.9621f, 57.0500f, 25.7595f, 5.7185f, -17.0122f, -18.2020f, + 186.4318f, 224.6768f, 114.4757f, -1.7200f, -54.2938f, -162.2942f, -260.9445f, -305.8334f, -275.9291f, -196.7974f, -106.2413f, -38.2122f, -9.9698f, -0.0348f, -3.2806f, -1.0904f, + 131.8525f, 182.9257f, 129.5468f, 39.5803f, -1.4035f, -45.6323f, -49.7229f, -34.2829f, -46.2254f, -45.3785f, -41.8506f, -32.6587f, -52.7586f, -51.1091f, -48.4846f, -48.8108f, + -7.2430f, 5.5232f, -74.0471f, -159.3008f, -202.7316f, -252.2241f, -289.9449f, -278.4816f, -262.2343f, -234.1872f, -194.1267f, -147.2734f, -119.3163f, -94.6419f, -70.6759f, -32.5601f, + -22.3081f, -6.0222f, -71.4069f, -57.5585f, 87.3579f, 111.3674f, 19.2319f, -62.1519f, -140.4286f, -175.0389f, -160.2987f, -104.7539f, -80.1002f, -50.0734f, -23.5490f, 1.6408f, + 23.3797f, 81.2481f, 31.3892f, -52.3576f, -81.9250f, -125.5061f, -125.9686f, -77.3511f, -70.4429f, -55.1778f, -44.3888f, -25.9966f, -26.5913f, -23.2118f, -31.8502f, -31.7050f, + -27.1231f, 37.7616f, 25.1095f, 15.1436f, 46.6224f, 72.7080f, 91.0447f, 118.4813f, 115.1246f, 132.4240f, 135.0095f, 145.7460f, 121.1771f, 93.8520f, 46.9298f, 19.6713f, + -19.2617f, 10.4880f, -44.5537f, -114.3566f, -130.3973f, -156.7718f, -173.2891f, -165.3661f, -167.0274f, -147.1746f, -129.2874f, -104.7640f, -95.4641f, -77.5872f, -69.6100f, -49.0499f, + -3.7184f, 35.4165f, -28.7033f, -86.2246f, -61.2082f, -15.9498f, 31.1702f, 56.3138f, 49.9412f, 77.3057f, 94.0143f, 94.3239f, 78.8126f, 62.9187f, 30.4449f, 9.8069f, + 55.4567f, 100.2570f, 28.4890f, -59.9100f, -114.0757f, -166.5609f, -236.0665f, -274.6304f, -256.7512f, -58.8984f, 6.9854f, 2.1456f, 44.3655f, 27.4061f, -65.0542f, -69.1642f, + 95.5202f, 139.3445f, 117.4449f, 81.4589f, 34.9276f, -44.4909f, -90.4718f, -127.2388f, -175.4005f, -220.3445f, -288.6741f, -303.4144f, -260.5738f, -126.2845f, -58.1968f, -29.1673f, + 3.0556f, 18.3576f, -71.4110f, -183.6864f, -237.4567f, -273.2383f, -199.6331f, -69.6698f, -37.7715f, -22.6972f, -8.8733f, 16.1036f, 11.3358f, -3.2045f, -17.9569f, -20.6306f, + 39.1896f, 96.2913f, 80.5943f, 18.4912f, -3.4620f, -34.5205f, -64.0148f, -77.2972f, -99.9022f, -107.3139f, -104.8068f, -92.0120f, -86.4257f, -73.8585f, -70.7371f, -53.2077f, + 81.1530f, 122.0539f, 53.2063f, -53.6774f, -106.3376f, -163.4776f, -180.9786f, -175.0377f, -183.3532f, -183.5190f, -169.4248f, -137.3097f, -123.3554f, -101.5521f, -94.1512f, -61.8612f, + 47.0309f, 137.9525f, 111.1768f, 67.6681f, 63.8415f, 52.4017f, 35.8194f, 35.6828f, 19.7444f, 10.1125f, 6.1064f, 10.9675f, 5.0407f, -0.1812f, -16.8272f, -19.3810f, + 42.6721f, 92.5038f, 31.4316f, -5.1224f, -6.0796f, -41.9120f, -30.0922f, 1.7396f, 15.4681f, 21.9765f, 36.6015f, 47.1275f, 37.4374f, 28.9853f, 9.1342f, 2.7556f, + -25.6593f, 22.2684f, 98.1230f, 166.4577f, 187.4970f, 165.0274f, 123.8612f, 113.1471f, 79.0653f, 48.7839f, 25.8742f, 32.9158f, 10.3013f, 1.0495f, -15.4120f, -15.0391f, + 304.7019f, 354.4388f, 217.4228f, 65.5482f, 65.3717f, 25.9965f, -93.4052f, -188.0092f, -255.0247f, -224.5901f, -158.7919f, -116.2751f, -72.5203f, -57.4171f, -28.9851f, -1.9506f, + 179.5714f, 241.9845f, 193.4582f, 112.7762f, 108.6980f, 80.4323f, 56.9618f, 58.6676f, 36.2938f, 12.8297f, 4.7285f, 10.9217f, 12.0551f, 12.0937f, 1.6504f, -14.7259f +}; + +const float lsf_cdk_wb_vc_stg2[] = +{ + -4.8704f, -25.4945f, -63.8565f, -65.1017f, -4.5396f, 12.9750f, + -51.6246f, -71.2351f, -70.8930f, -49.5365f, -41.5492f, -21.1764f, + -4.1941f, -21.5321f, -43.7546f, -75.1360f, -101.6917f, -51.6149f, + 39.1412f, 15.8593f, -34.7315f, -30.9497f, 5.4101f, -22.1983f, + -27.3812f, -44.2900f, -51.8477f, 17.0318f, 63.3214f, 33.3719f, + -42.1936f, -38.7776f, 26.9794f, 58.3819f, 22.3255f, 7.3631f, + -17.3453f, 32.8013f, 16.4392f, -4.8961f, 34.6309f, 3.7975f, + 20.9889f, 11.0332f, 21.2790f, 43.6082f, 11.3288f, -4.0437f, + -30.7619f, -28.1362f, -7.6918f, -26.0495f, -20.5254f, 20.4943f, + -5.8695f, -15.0159f, -12.0884f, 4.0124f, -37.3326f, -57.6803f, + 31.1085f, 51.7290f, 46.8635f, -11.1193f, -84.1480f, -75.2940f, + 31.7638f, 33.3860f, -2.0831f, -68.1944f, -69.2055f, 16.6054f, + 26.8476f, 11.7277f, -21.2873f, -16.1653f, 77.7471f, 74.9747f, + -11.9492f, -11.8103f, 39.7377f, 110.8560f, 91.1983f, 51.6182f, + -16.9337f, 34.0576f, 97.5442f, 55.3237f, 6.0911f, -14.5976f, + 63.2733f, 65.6975f, 59.3910f, 57.9345f, 46.9389f, 25.4049f +}; + +const float lsf_cdk_wb_vc_stg3[] = +{ + -32.9020f, -78.5896f, -107.4534f, -95.7731f, -74.7222f, -53.0220f, -21.3706f, -6.3135f, 4.4667f, 8.3786f, + -55.7273f, -51.1982f, -23.4921f, -31.8303f, -40.9730f, -44.0985f, -32.5056f, -19.4304f, -11.2363f, -6.8031f, + -1.3625f, -17.5965f, -40.9966f, -56.5415f, -66.9172f, -82.2625f, -98.8410f, -92.9959f, -64.2789f, -34.2565f, + -0.1831f, 28.9371f, 27.3975f, 6.7646f, -26.2844f, -55.3561f, -55.5887f, -25.6472f, 4.2175f, 6.7426f, + -0.1042f, -22.5234f, -18.6769f, 9.5775f, 20.8908f, 1.7399f, -25.4612f, -48.9497f, -58.9339f, -45.8070f, + -59.3842f, -92.5268f, -67.7156f, -8.1650f, 22.6518f, 30.8838f, 30.1565f, 24.4312f, 17.5083f, 9.4537f, + 61.2263f, 100.3160f, 74.2819f, 32.8490f, -21.2300f, -80.0984f, -138.8597f, -144.8649f, -102.7813f, -51.4501f, + 20.9615f, 14.5464f, 12.7374f, 42.2801f, 62.5685f, 59.3555f, 43.2439f, 37.0487f, 22.3288f, 14.0209f, + 6.4664f, -20.5406f, -67.1147f, -81.1455f, -18.3522f, 38.5675f, 31.4978f, 9.2431f, -5.5141f, -0.9299f, + -14.7299f, -8.8186f, -2.0488f, -3.6924f, -11.6375f, -3.0631f, 38.0648f, 50.4570f, 46.9399f, 28.7229f, + 34.6418f, 11.8422f, -31.9716f, -72.1947f, -102.4017f, -89.6780f, -33.2158f, 7.5030f, 18.7080f, 14.6731f, + -62.1236f, -44.3324f, 53.6090f, 72.1405f, 58.0429f, 57.2172f, 43.2329f, 33.7172f, 19.9635f, 6.9351f, + 73.8739f, 68.1656f, 32.4182f, 5.6585f, -7.7073f, 3.9480f, 12.5407f, 12.3801f, -2.4527f, -5.8024f, + -21.3075f, -24.8496f, -17.5965f, 2.9303f, 59.0699f, 104.4524f, 127.5622f, 113.8932f, 89.2660f, 52.1358f, + 4.2469f, 56.7592f, 88.2184f, 81.0948f, 49.2982f, 15.3523f, -8.4240f, -22.2333f, -30.5271f, -24.1128f, + 46.4076f, 80.4091f, 88.4039f, 96.0474f, 97.7032f, 96.0620f, 87.9680f, 71.7615f, 52.3257f, 28.0991f +}; + +const float * const lsf_codebook[2][2][TCXLPC_NUMSTAGES] = +{ + { + { lsf_cdk_wb_gc_stg1, lsf_cdk_wb_gc_stg2, lsf_cdk_wb_gc_stg3 }, + { lsf_cdk_wb_vc_stg1, lsf_cdk_wb_vc_stg2, lsf_cdk_wb_vc_stg3 } + }, + { + { lsf_cdk_nb_gc_stg1, lsf_cdk_nb_gc_stg2, lsf_cdk_nb_gc_stg3 }, + { lsf_cdk_nb_vc_stg1, lsf_cdk_nb_vc_stg2, lsf_cdk_nb_vc_stg3 } + } +}; + +const int16_t lsf_numbits[TCXLPC_NUMSTAGES] = { 5, 4, 4 }; + +const int16_t lsf_dims[TCXLPC_NUMSTAGES] = { 16, 6, 10 }; +const int16_t lsf_offs[TCXLPC_NUMSTAGES] = { 0, 0, 6 }; + +const float lsf_ind_cdk_nb_gc_stg4[] = +{ + -33.5099f, -17.2439f, + 1.9585f, 6.4210f, + -21.9240f, 24.8014f, + 23.6604f, 49.3421f +}; + +const float lsf_ind_cdk_nb_vc_stg4[] = +{ + -33.5292f, -23.3982f, + 15.6149f, 34.3889f, + -9.2455f, 6.1721f, + 60.7325f, 78.8354f +}; + +const float lsf_ind_cdk_wb_gc_stg4[] = +{ + -31.4516f, -19.9820f, + 9.1071f, 6.9160f, + -17.3554f, 28.1193f, + 31.7476f, 59.9379f +}; + +const float lsf_ind_cdk_wb_vc_stg4[] = +{ + -25.6665f, -20.7100f, + 17.1565f, 9.9963f, + -13.7601f, 37.4813f, + 55.4374f, 66.3001f +}; + +const float * const lsf_ind_codebook[2][2][TCXLPC_IND_NUMSTAGES] = +{ + { { lsf_ind_cdk_wb_gc_stg4 }, { lsf_ind_cdk_wb_vc_stg4 } }, + { { lsf_ind_cdk_nb_gc_stg4 }, { lsf_ind_cdk_nb_vc_stg4 } } +}; + +const int16_t lsf_ind_numbits[TCXLPC_IND_NUMSTAGES] = { 2 }; + +const int16_t lsf_ind_dims[TCXLPC_IND_NUMSTAGES] = { 2 }; +const int16_t lsf_ind_offs[TCXLPC_IND_NUMSTAGES] = { 0 }; + +const Word16 min_distance_thr[2][2] = /* 14Q1*1.28 */ +{ + /* GC, VC */ + /* WB */ { 580, 580 }, + /* NB */ {1000, 580 } +}; + +const float lsf_q_diff_cb_8b_rf[256*16] = +{ + -49.142456f, 13.490689f, -21.704788f, 63.851589f, 17.341200f, 49.889275f, 4.535705f, -49.377617f, 12.881550f, 3.317029f, -45.874687f, -91.048477f, -159.075317f, -244.532806f, -208.950378f, -60.136238f, + -71.911499f, -50.432014f, -131.216339f, -25.763540f, -90.432335f, -140.176178f, -31.643175f, -46.414715f, -23.065298f, -42.936611f, -38.403904f, 15.094532f, -0.061476f, -28.153961f, -21.246065f, 10.218022f, + -134.834076f, -120.343132f, 98.120338f, 51.493057f, -18.822592f, 5.707322f, -93.194328f, 48.820892f, 38.169155f, 22.535019f, 17.952980f, -59.919395f, -154.178802f, -66.216209f, -30.895947f, -30.548832f, + -41.079960f, -11.862259f, -32.120766f, -35.889202f, -28.737438f, 26.212168f, -37.682671f, -117.789268f, -206.368179f, -150.378693f, -26.382723f, -33.924740f, 14.733324f, -7.089695f, 8.373900f, 41.311722f, + -44.370823f, -21.727020f, -164.064880f, 39.315842f, 14.170435f, 2.276680f, -43.158184f, -105.471977f, 46.076225f, -35.652943f, -72.096603f, -88.481071f, -121.452873f, -86.098267f, -92.925804f, -58.238682f, + -62.593822f, -14.669445f, -39.062012f, -12.045748f, -53.345932f, -70.633652f, -100.257874f, -63.507019f, 57.782543f, 62.015087f, 67.188080f, 65.260689f, -49.929119f, -162.794342f, -204.251465f, -104.609535f, + -66.932289f, -18.313484f, -68.981606f, -25.012476f, -94.210236f, 1.026957f, -67.785004f, -35.943043f, -53.149406f, -87.719955f, -112.206566f, -113.875397f, 111.780113f, 102.159576f, 1.001174f, -50.978374f, + -101.098640f, -70.354515f, -151.534393f, -91.954025f, 3.666550f, 78.893501f, 42.150974f, -57.122208f, -56.242603f, -97.829124f, -66.723511f, 11.967057f, 16.204992f, -23.608727f, -19.899971f, 28.121500f, + 10.450438f, 45.892262f, -54.131168f, -16.160269f, -64.032661f, -176.495041f, -5.962820f, -72.027107f, -150.201141f, -32.517159f, 61.674686f, 44.256657f, 46.283817f, -5.180211f, -141.241837f, -167.211639f, + -173.577682f, -92.975533f, -112.498154f, -101.956200f, -66.556870f, -79.061409f, -139.621201f, -1.422741f, -10.495166f, 71.210350f, 49.869511f, -2.298943f, -35.104397f, 24.463161f, -11.476251f, -46.980118f, + -37.676750f, 24.794701f, -40.237633f, 33.943848f, -51.101398f, 166.382629f, 110.829704f, 23.702038f, 23.627102f, -6.121801f, 0.773019f, -142.445435f, -263.982605f, -14.189220f, -131.928268f, -155.050293f, + -30.214348f, -9.421390f, -102.936676f, 83.361900f, -24.453602f, -180.015442f, 92.876984f, -79.562981f, -9.609303f, -34.706200f, -120.354073f, -29.731850f, -81.171555f, 36.295174f, 61.845047f, 47.662693f, + -110.844032f, 83.765533f, -123.206459f, -51.540508f, -51.287010f, -48.821514f, -29.502964f, -6.343169f, 23.775656f, -0.353102f, -23.523582f, -94.919563f, -133.085464f, -118.824188f, -53.901115f, -52.530910f, + -55.833942f, -37.825222f, 21.633268f, -2.833855f, -172.300034f, 74.660912f, -62.712250f, -77.443947f, 114.319824f, 49.023743f, 36.734745f, 53.222221f, -31.211931f, -15.118987f, -37.109795f, -50.964909f, + -2.209181f, 103.944717f, 186.623413f, -64.544991f, -32.391006f, -40.504578f, -24.400692f, 23.758614f, -28.194080f, -40.393677f, -41.950493f, -90.601120f, -169.530365f, -181.697540f, -67.184174f, -66.990860f, + -24.511374f, 34.831326f, 36.412617f, 49.172550f, -16.029377f, -109.529999f, 4.142260f, -20.617449f, -56.997406f, 30.342079f, -83.989975f, 1.144082f, 161.687592f, 61.147705f, -86.482475f, -92.777733f, + -88.158249f, -53.647205f, -131.604202f, 18.409283f, -8.442244f, -74.841873f, -30.877779f, 73.223831f, 26.580759f, -20.676722f, -31.395731f, -93.706764f, -88.946129f, -60.194122f, -118.809082f, -83.768547f, + -27.869957f, -5.078736f, -133.762909f, -274.870483f, 25.990072f, 21.509178f, 36.674843f, -3.828471f, -37.908432f, 2.206993f, -2.133470f, 15.392393f, -76.964806f, -123.400665f, -55.604580f, 13.984759f, + -39.818924f, -24.414286f, -78.231728f, 114.239975f, 68.886200f, 49.643444f, 61.244785f, 24.158489f, -11.322248f, -82.068733f, -152.400940f, -144.792816f, -89.084679f, -107.811325f, -15.021494f, 27.688988f, + -26.188799f, 13.887177f, -74.969177f, 125.939407f, 54.065468f, -29.856068f, 6.488181f, -63.185188f, -96.026291f, -188.663879f, -165.438187f, 203.997070f, 43.201817f, 21.809793f, -74.018494f, -76.644218f, + 14.730933f, 52.225765f, -133.046051f, 73.062096f, -12.101256f, -61.917290f, -85.989738f, -25.391121f, 61.084568f, -56.463966f, 192.920975f, 44.298870f, -151.724915f, 91.825546f, 4.643712f, -14.348310f, + -83.082611f, -43.735950f, -57.932819f, -63.816303f, -127.738678f, -96.165390f, 27.380922f, 106.262009f, 117.074669f, 97.982422f, 63.797035f, 48.936672f, -12.647917f, -65.618805f, -84.200691f, -93.463432f, + -79.058868f, -82.570656f, -23.950100f, -42.977753f, 35.295464f, -60.833336f, -54.265438f, -1.680498f, -73.608223f, -41.047230f, -32.325935f, -36.250416f, -2.680869f, 24.178974f, 12.027203f, 4.833654f, + -70.078651f, -40.907417f, -113.092224f, 27.616556f, -46.329929f, 104.583298f, 82.129387f, 0.280690f, -27.957493f, -79.316704f, 111.977844f, 50.056763f, -19.403173f, 25.433884f, 70.602043f, 28.069981f, + -1.787399f, 19.136635f, -48.166355f, 5.009412f, -62.536564f, 75.527115f, -47.088139f, -11.585875f, -65.448433f, -92.899475f, 107.363365f, -32.311649f, -203.382462f, -152.693619f, -50.552776f, 31.944372f, + 8.727448f, 163.701584f, -151.617279f, -120.834221f, -140.449585f, -168.542450f, -161.597626f, -134.148041f, -44.436928f, 23.024485f, 88.100662f, 153.087036f, 171.657425f, 142.269592f, 72.176025f, 34.152279f, + 24.626226f, 141.228775f, 68.035118f, 32.383106f, 29.076723f, -23.316879f, -11.166278f, 28.757330f, -105.244186f, -168.721451f, 15.529101f, -45.646198f, -99.508888f, 12.179071f, 41.687931f, -6.929618f, + -32.293335f, -15.942890f, 0.017796f, 227.668884f, 35.207336f, -33.792694f, 82.114479f, 15.197913f, -26.902617f, 65.209732f, 1.587932f, -56.761986f, -22.348925f, -26.869337f, 19.428514f, 27.321255f, + -102.949432f, -25.011555f, -147.959137f, -87.200294f, 47.153675f, 18.530943f, -0.166834f, 19.560911f, 89.191528f, 52.157402f, 2.918095f, -61.719532f, -94.293381f, -51.465199f, -1.655222f, -17.656567f, + -38.911335f, 6.948825f, -39.729725f, -51.301937f, -53.620224f, -108.789536f, 155.468872f, 63.620651f, 35.850296f, 70.581047f, 42.754013f, 127.703674f, 66.715858f, -130.426041f, -146.462341f, 74.622078f, + -1.029140f, 54.317455f, 8.387774f, 41.543407f, -10.573199f, 24.244738f, 30.842634f, -26.604139f, -33.421272f, -9.906475f, -31.059523f, 10.844967f, 30.019199f, -202.162201f, -258.204132f, 91.369331f, + -153.889771f, 115.453377f, 72.695793f, -18.096334f, 20.942005f, -35.160381f, -38.443104f, -34.397667f, -48.781742f, -1.410000f, 62.099541f, 79.766754f, 142.615189f, 135.960159f, 96.626495f, 58.906452f, + -79.472115f, -49.353893f, -49.954609f, -155.367615f, -116.776726f, 15.010523f, 18.099497f, -55.247025f, 16.403715f, 87.059982f, -23.132126f, -173.747818f, -144.933502f, -28.767344f, -32.596806f, -0.380802f, + -15.925756f, -5.412324f, -105.707176f, -130.356949f, -98.465538f, -47.166088f, -87.599068f, 42.630928f, -62.413151f, -107.954193f, 158.527435f, 98.763542f, -3.586527f, -6.147307f, -13.222188f, -23.993233f, + -24.975382f, 56.402035f, 52.029133f, -3.636582f, -18.978687f, -30.510057f, -20.777334f, 0.297320f, -75.612679f, -166.890121f, -182.792877f, -17.244802f, 17.907167f, -95.983925f, -107.016418f, 6.600997f, + 13.935800f, 124.014893f, -78.200630f, -86.667000f, 27.445192f, -62.815701f, -53.436100f, -106.422089f, -98.502609f, -122.057808f, -94.039665f, 79.832077f, 85.983383f, 86.996208f, 71.870331f, 101.132660f, + -51.503838f, -34.840988f, -93.907707f, 54.647934f, 85.969376f, -35.794395f, -36.596844f, -102.254219f, -196.495346f, 34.254475f, -15.691520f, -81.330208f, -7.808877f, -105.690956f, -96.873695f, 28.378246f, + 79.900681f, 76.900246f, 101.535088f, 103.327919f, 76.696190f, 36.222244f, -87.911812f, -186.179047f, 47.998817f, 180.776077f, 27.586971f, 68.147926f, 8.632617f, -127.173943f, -218.839523f, -269.181305f, + -51.884178f, -23.658228f, -7.389097f, 51.481766f, -16.066425f, -70.871017f, -193.338547f, 194.566742f, 115.566246f, -35.451885f, -78.933662f, 8.663171f, 16.445974f, -68.275475f, -91.542229f, 1.517690f, + -39.556801f, 39.785755f, -76.877228f, -215.618423f, 126.814384f, 37.883842f, 26.489124f, -32.631229f, -79.764656f, -5.413741f, -44.822353f, -38.384186f, 145.878082f, 205.717392f, 96.100632f, 80.714775f, + -36.383427f, 1.122570f, 179.888214f, -48.044216f, -121.014236f, -85.808846f, -125.241035f, -79.817886f, -0.247583f, 50.953720f, 13.693697f, -5.582759f, -50.636333f, -46.192039f, -66.636848f, -36.257576f, + -122.950089f, -101.489883f, -260.444885f, -20.923767f, -57.475227f, 15.233345f, -42.816353f, -43.372814f, 58.668098f, 2.198759f, -2.974080f, 16.032595f, 93.305153f, 50.504028f, -14.432660f, -50.193291f, + -16.826427f, 8.873464f, -87.595573f, 23.091625f, -3.794562f, 38.739624f, 159.341888f, 57.302864f, 10.663289f, -44.891232f, -143.189377f, -141.278580f, 34.162834f, 67.916397f, -11.724302f, 82.864563f, + 8.689659f, 79.660339f, -106.648331f, -40.056900f, -61.659725f, -89.878143f, 30.882858f, -96.414940f, -87.919632f, 71.567696f, -13.048811f, -99.413971f, 158.306488f, 148.612640f, 101.164139f, 44.707798f, + 51.876743f, 173.028961f, -7.548154f, 42.151535f, -0.306372f, -63.804768f, -65.823441f, -61.424610f, -3.614527f, -0.266337f, -28.529921f, -42.772068f, -92.503525f, -24.051035f, -29.639515f, -52.302032f, + -21.027899f, 32.422092f, -19.221569f, -81.996292f, 170.400146f, 147.834946f, 78.837563f, 54.455120f, -4.170513f, -14.816674f, 66.761642f, 29.512554f, 1.267826f, -7.617690f, -74.421074f, -86.431335f, + -19.333296f, 100.725983f, 62.089886f, 80.720032f, -11.293929f, -156.758041f, 130.283081f, 64.092621f, 10.666490f, 23.035032f, 9.748004f, -82.614822f, -134.818069f, -117.491508f, -98.273796f, 27.608231f, + 3.230417f, 41.808163f, 13.598584f, 214.913864f, 110.737106f, 36.832939f, -14.412317f, -27.091141f, -72.668190f, 5.492285f, 219.188553f, 157.024200f, 139.305466f, 42.584637f, -89.405518f, -147.115540f, + 5.685055f, 57.183292f, -12.697913f, 68.282562f, -33.609550f, -33.049332f, 87.031670f, -39.772167f, -127.605225f, -30.905075f, -129.695374f, -167.423813f, 14.979711f, -80.101776f, -175.781570f, -120.638008f, + -26.057411f, -22.450294f, -86.065346f, -174.294159f, -236.409439f, 106.705414f, 94.844818f, -24.300186f, -47.618366f, -4.900061f, -8.250068f, 26.776390f, 23.026890f, -0.663881f, -8.460385f, 52.523418f, + -239.938965f, -188.228012f, -72.794617f, -24.974373f, 64.134842f, 47.954140f, 37.109238f, 56.990929f, 19.013355f, 2.195176f, -39.343456f, -65.541855f, -48.117985f, 33.679371f, 1.032876f, -8.904166f, + 1.318133f, 23.793682f, -11.594374f, 208.226288f, 86.628777f, -41.451736f, -85.691925f, -59.617199f, -144.367111f, -168.655807f, 108.856461f, 32.739384f, -66.105087f, -32.850475f, 68.247009f, 136.522278f, + 46.231567f, 61.993446f, -37.963066f, 71.883453f, 4.955863f, 90.692329f, -55.423782f, -173.421982f, 91.392097f, 4.265558f, -86.143791f, 11.978693f, -147.210098f, -173.357559f, 47.334595f, 132.379639f, + -8.091352f, 36.792015f, 42.705544f, 0.830618f, -22.491022f, -42.331161f, -6.163970f, 83.671753f, -37.618378f, -48.777485f, 136.386185f, 88.433350f, 121.425102f, 78.104286f, -118.565308f, -236.474899f, + -34.999004f, 35.648041f, 104.321472f, -80.549561f, 88.479385f, 4.159388f, -68.049988f, -110.190895f, -59.762150f, -34.927917f, -42.892593f, -50.185341f, -31.525537f, 28.561077f, 30.799391f, 32.589943f, + -19.395960f, 10.917861f, -33.211983f, 59.916050f, 17.923265f, 69.628220f, -59.527351f, -0.360134f, 20.055620f, -76.225594f, 59.490189f, 219.202728f, 44.065163f, -105.835022f, 149.316025f, 103.121368f, + -26.811831f, 4.917114f, -50.918606f, -51.282066f, -44.665630f, -34.671989f, 54.816383f, -53.930695f, -122.650787f, 9.736618f, -86.848312f, -33.875164f, 28.787636f, -128.559616f, -13.832273f, 240.435959f, + -127.768944f, -120.395676f, -224.640091f, -106.371384f, -110.915848f, -119.944382f, -64.704178f, -86.686111f, 57.449604f, 91.349197f, 96.250694f, 156.740128f, 176.836166f, 127.207031f, 51.964844f, 14.125758f, + -47.998665f, 17.796474f, 29.304367f, 75.164230f, 58.860054f, 113.970734f, 70.417877f, 23.055088f, -25.342611f, -99.771896f, 5.999279f, 51.847668f, -60.419800f, -163.240036f, -99.791527f, -66.431305f, + -0.302659f, 17.211594f, -98.700340f, 53.635334f, -28.992607f, -89.555244f, 112.895592f, -32.920498f, -109.022964f, 150.316772f, 124.435059f, 47.075050f, 111.757408f, 77.910065f, -34.123623f, 33.374477f, + -8.188879f, 23.113052f, -14.419042f, 58.259747f, -4.053533f, 3.542868f, 101.208923f, 41.556973f, 65.754631f, 15.887958f, -6.614230f, -95.157341f, -213.709061f, 82.959053f, 10.967265f, 42.520882f, + -12.848677f, 33.983711f, 26.826427f, 55.942802f, 17.707258f, 59.918518f, 15.309278f, 207.269272f, 99.491982f, 42.829330f, 116.586906f, 97.039436f, -36.674652f, -119.304512f, 74.699173f, 64.565712f, + -127.629143f, 210.633652f, 90.269417f, -15.052937f, 10.047224f, -44.578220f, -32.594685f, -24.894297f, -32.681622f, 36.690662f, 60.424084f, 6.454986f, 7.198017f, 25.681587f, -4.052445f, -25.874166f, + -13.218253f, 25.233515f, -43.822559f, 14.608809f, 50.092663f, 29.797066f, 122.838074f, 60.946331f, -15.227234f, 70.429047f, 49.234367f, 22.393675f, 241.398132f, 68.944763f, -19.084089f, 15.646838f, + -61.749660f, 22.046791f, -33.557991f, -16.016773f, -39.896496f, -65.069405f, -73.831696f, -54.138386f, -41.472534f, -59.811478f, -96.109680f, -119.990692f, -91.886162f, -31.355206f, -9.082160f, -39.052567f, + -27.257662f, 71.028709f, -136.328506f, -98.025055f, -21.314344f, -16.991056f, -34.343781f, -70.373230f, -55.339901f, -30.724577f, -8.068395f, -12.537150f, 6.994465f, -2.531820f, -19.959831f, -32.511631f, + -189.575684f, -170.668686f, 159.468323f, 69.316818f, 9.541554f, -35.932343f, -76.965225f, -73.569916f, -80.277435f, -52.695671f, 36.840542f, 4.612717f, -5.781191f, 68.836777f, 46.053165f, 5.477945f, + 23.076845f, 56.007298f, 58.995125f, 73.648643f, -23.558571f, 31.706146f, 6.650000f, -81.954597f, -43.828186f, -91.444901f, -136.752670f, 3.109934f, -61.638336f, 161.845291f, 158.234512f, 75.812927f, + -29.586615f, 8.254013f, -12.131930f, 42.161793f, -20.277391f, -118.423508f, -194.639008f, -196.011337f, 38.792351f, 37.828663f, -2.185939f, 11.298992f, -6.172924f, -4.559058f, -65.562843f, -27.597832f, + -47.978813f, 22.640007f, -58.066402f, 58.001053f, -47.134541f, 8.486321f, -6.111372f, -31.006121f, 51.575218f, 5.865514f, 17.294910f, -41.168453f, 73.907234f, 13.599236f, -307.273499f, -197.696899f, + -44.109650f, 49.449520f, 84.357780f, -161.258835f, -95.109154f, -44.129417f, -5.148076f, -26.549320f, -4.192320f, -31.172485f, -35.216717f, 42.882584f, 4.978696f, 0.798938f, 44.287029f, 7.057617f, + -44.323925f, -3.754397f, -20.289011f, 35.057964f, 30.896481f, 47.822914f, 57.432564f, -18.862158f, -58.972874f, -40.730820f, -53.210159f, 151.582123f, 189.086823f, -47.681084f, -160.354431f, 18.183973f, + -24.190926f, -8.054521f, -60.337772f, 17.447094f, 52.011765f, 64.135529f, -12.559262f, -64.698524f, -145.641434f, -49.002659f, 27.998568f, 54.442074f, 31.638771f, -105.428864f, -187.366058f, -170.395126f, + -52.519932f, -45.655670f, -54.255409f, 18.195887f, -47.736511f, -25.311331f, -74.233253f, -139.686768f, -7.455135f, 30.180883f, 16.468306f, 73.234703f, 89.610466f, 86.974052f, 38.241241f, -12.159492f, + 27.982965f, 58.867645f, 9.410244f, -37.832794f, -107.431290f, 148.510559f, 114.846024f, 37.929848f, -49.612717f, -97.690834f, -11.054573f, -58.132690f, -120.672997f, -0.656331f, 67.064285f, -17.834682f, + -38.582962f, 4.200229f, -16.068153f, 16.516636f, -13.899181f, 5.986161f, -2.004643f, 12.832077f, -44.597519f, -86.681267f, -38.071716f, -52.322094f, 61.482838f, 23.035675f, 222.921036f, 209.259064f, + -53.377850f, 219.871765f, 18.681116f, -49.476475f, -66.432587f, -11.111042f, 8.136900f, 38.469578f, 83.534767f, 23.165945f, -66.981857f, -119.944641f, -90.701843f, -5.017766f, 13.544878f, 7.416979f, + -26.158424f, 21.733870f, 8.429042f, -7.359868f, -81.261559f, -0.384979f, 107.991409f, -33.468559f, 163.344254f, 171.295059f, 21.148136f, -44.234226f, -50.298836f, -2.045869f, -46.947075f, -69.817322f, + 54.305538f, 77.911476f, 98.722816f, -46.229565f, -143.810577f, -1.355024f, 61.036888f, -13.015687f, -3.865948f, 88.857635f, 7.053370f, 11.180832f, -46.409653f, -90.435066f, -105.360260f, -147.441849f, + 75.489372f, 105.739868f, 60.188259f, 33.809502f, -21.277689f, -21.943260f, -50.937679f, -75.105469f, 43.895504f, -42.176373f, -73.326416f, 343.493774f, 168.802673f, 63.476738f, 36.762135f, 96.509972f, + -43.959518f, -13.900088f, -83.791946f, -2.585726f, -89.923798f, -318.138428f, 56.854568f, 72.487968f, -32.397919f, 28.099873f, -17.146538f, -96.395309f, 0.466646f, -28.547890f, -71.721748f, -40.413429f, + -91.491898f, -100.288185f, -158.042801f, -94.347038f, 41.776943f, 56.555912f, 18.842609f, 21.550163f, -8.122741f, 83.330833f, 83.349388f, 56.535236f, 6.853065f, -16.367655f, 6.860499f, 12.135324f, + -122.978020f, 41.508400f, -57.019398f, 119.866692f, 169.921616f, 82.577713f, 6.609851f, 29.209021f, -35.676617f, -95.016159f, -42.960949f, -61.483852f, -28.365889f, 44.539429f, 11.786313f, -39.760418f, + -35.204288f, -3.827494f, 1.364895f, 53.625450f, 67.540977f, 12.539343f, -62.200562f, -131.499298f, -190.222824f, 97.861145f, 145.009247f, 116.742218f, 39.964626f, 5.113988f, -49.972206f, -22.433067f, + -21.844286f, -3.302132f, -103.041687f, 72.974442f, 0.991044f, 31.884541f, -68.314651f, 15.106439f, 38.181488f, -142.549530f, -177.428543f, 26.987268f, -65.951744f, -49.118980f, 100.179466f, 67.782463f, + -68.886017f, -50.878456f, -101.627640f, 94.751526f, 63.353767f, -35.431698f, 88.086647f, 85.405006f, 1.274280f, -8.066319f, 108.974724f, 81.340332f, 19.295490f, -5.680541f, -76.852966f, -93.998848f, + 0.026969f, 0.110805f, -0.074311f, 0.076925f, 0.017105f, 0.036573f, -0.118072f, 0.068798f, 0.056649f, 0.036456f, 0.063553f, 0.071463f, 0.000525f, -0.019787f, -0.046544f, 0.021337f, + -17.799213f, 17.198961f, -23.454958f, -48.785267f, 32.178555f, 142.656906f, 87.394043f, -46.504601f, -91.326263f, -128.089188f, 168.745255f, 12.046860f, -75.234085f, 321.776276f, 84.140045f, 147.402191f, + -7.771455f, 13.708800f, -83.826019f, -18.597784f, -45.941696f, -97.131195f, 73.443825f, 13.631736f, -35.554703f, 154.701080f, 86.402138f, 6.515917f, -68.449318f, -152.233841f, -30.240294f, -16.017389f, + -55.553074f, -10.045274f, -82.091660f, -104.274841f, -102.906937f, -76.238228f, -59.226723f, -42.700069f, 16.344666f, 35.539070f, 49.328686f, 56.921478f, 131.003021f, 165.738358f, 186.387207f, 144.321213f, + 24.576750f, 51.924622f, 2.034293f, 189.503342f, 148.765106f, 101.905212f, 63.054604f, -22.561197f, -112.342194f, 8.821053f, 33.745621f, -43.875877f, -58.067898f, -146.850281f, -17.419054f, 72.366890f, + -30.276649f, -31.782654f, -80.339973f, 100.106911f, 93.313034f, 4.726528f, -48.094799f, -115.030556f, -191.082672f, 102.985733f, 88.130089f, 19.376783f, 42.609215f, 50.674198f, 152.159012f, 114.587776f, + -137.391373f, 14.609784f, -65.256355f, 1.609928f, 37.473400f, 26.934027f, 24.673132f, 119.508095f, 88.831779f, 43.605965f, 27.401138f, -7.082619f, -78.587341f, -76.090195f, -60.487331f, -49.042698f, + -3.795852f, 48.615219f, -32.316784f, 47.219639f, -71.672012f, -177.180862f, 227.674683f, 121.423073f, 55.595085f, 89.844704f, 18.789379f, 72.883820f, -30.959936f, -1.702511f, 69.411217f, 21.385332f, + -31.896704f, 58.013481f, 15.825336f, 21.007841f, 73.693138f, 2.008733f, 47.849987f, 22.561638f, -56.861252f, -96.624382f, 116.512817f, 122.175636f, 14.970264f, -131.112076f, -137.480362f, 145.503159f, + 3.666602f, 60.865307f, 190.182358f, 42.435371f, -21.053213f, -17.096897f, -76.084404f, -13.743227f, 117.478218f, 140.799774f, 154.908340f, 88.790558f, 92.327370f, 121.949478f, 69.189064f, 33.268280f, + -24.028364f, -0.568868f, -10.598723f, 23.224901f, -10.145369f, 23.696190f, -80.020584f, 133.288193f, 78.874382f, -28.811146f, -74.702332f, -142.888794f, -177.398254f, -126.189499f, -64.583435f, -4.795106f, + -42.301235f, 1.254746f, -92.263153f, -67.414131f, -68.581459f, -105.596657f, -95.386429f, -140.669708f, -167.874496f, -26.571861f, 58.823044f, 95.171120f, 164.426514f, 117.247391f, 67.970955f, 67.381973f, + 12.281957f, 57.241734f, 145.007370f, 102.782562f, 6.108451f, 23.661549f, -109.679001f, 79.513168f, 54.415848f, -107.359993f, -127.692383f, -2.818198f, -116.707993f, 22.176086f, -1.896818f, 13.089568f, + 42.066715f, 109.299110f, 22.366495f, -16.778564f, 21.774530f, -4.182106f, -18.286386f, -52.603218f, -118.524780f, -89.037674f, 118.551682f, 115.277679f, 89.577263f, 130.519241f, 158.623138f, 169.276016f, + -127.461502f, -97.991295f, -154.912262f, 156.017349f, 83.816185f, -40.645927f, -30.617186f, -97.806175f, -64.010101f, 50.553226f, 32.767338f, -3.065530f, 46.381119f, 52.668839f, 32.740833f, -18.864176f, + -35.447090f, 10.117445f, -29.844646f, 121.351227f, 83.683456f, 57.303402f, 15.328587f, 44.133987f, 67.000153f, 104.188065f, 10.872536f, -10.320432f, 63.163109f, -83.689003f, -200.906555f, -56.971607f, + -73.476898f, -50.613533f, 157.811996f, -36.126892f, -3.998129f, -33.125019f, -40.811184f, 75.547150f, -26.170004f, 16.685923f, 89.786247f, -2.189539f, -13.579331f, 56.560184f, 54.771152f, 26.603344f, + -50.784908f, -37.853783f, -22.237158f, -10.529336f, -75.668167f, 170.388672f, 64.201385f, 9.919388f, -25.087654f, -97.517700f, -38.260277f, 51.479713f, 98.044075f, 224.824921f, 125.035980f, 68.006523f, + -13.163634f, 49.532330f, 22.343836f, 23.637941f, -71.608704f, -200.313492f, 22.972029f, -65.936508f, -139.879044f, 109.168282f, 73.714027f, 8.318653f, -33.382645f, -57.808838f, -26.988724f, 70.492950f, + -57.241489f, -35.265514f, -140.595444f, 85.484810f, 13.172671f, -44.652134f, -64.718590f, 80.219849f, 113.279419f, 8.199357f, 46.910881f, 1.842971f, 6.611537f, 108.265114f, 84.200981f, -15.673004f, + -54.020992f, -40.065796f, 68.741219f, 89.963760f, -22.845310f, 156.119400f, 40.349724f, 13.827300f, 99.219742f, -10.468677f, -69.469467f, -91.899101f, -28.343006f, -18.399660f, -48.014648f, 18.084986f, + 39.514809f, 117.259254f, 84.999840f, 3.152317f, -89.788651f, -15.256340f, 128.664642f, 16.396799f, -2.824860f, -2.224188f, -108.113235f, -104.294632f, 285.672485f, 258.659821f, 131.015823f, 46.896381f, + 35.400707f, 199.269470f, -50.829807f, -59.871765f, -112.504417f, -87.914078f, -74.663177f, -14.457950f, 3.730728f, 8.424652f, 34.759491f, 5.061568f, 49.715153f, 29.911200f, -4.833649f, -7.921039f, + 79.273865f, 68.455246f, 143.235184f, 29.923138f, -61.068966f, 27.401043f, -93.697815f, 39.637844f, 278.054901f, 207.706467f, 114.287697f, 191.970261f, 28.365456f, -67.643982f, -126.002037f, -324.593506f, + -38.810867f, 77.219002f, 226.800339f, 84.473801f, -40.547543f, -21.564167f, 131.517456f, 93.058868f, 25.796638f, 24.364828f, -21.709984f, 0.377355f, -100.328873f, -63.233959f, 39.949356f, -20.796144f, + -49.434875f, 13.246425f, 235.871155f, 150.979660f, 94.417747f, 49.695023f, 9.298592f, 42.695667f, 12.962906f, 29.078457f, 141.417770f, 131.790558f, 139.121719f, 102.666374f, 34.500813f, -11.908920f, + -2.108662f, 13.590509f, -38.806015f, -50.421722f, -148.383850f, -9.163120f, 221.518173f, 91.873947f, -57.944500f, 7.884820f, -23.169016f, -6.481791f, 39.176830f, -30.829500f, -216.452530f, -132.310471f, + -60.222321f, -37.813641f, -144.648758f, -74.471680f, -53.668755f, -36.867607f, 163.549622f, 118.314560f, 9.347286f, -64.045303f, 54.008766f, 6.278257f, -3.053545f, 65.511765f, 31.613440f, 28.923603f, + -68.111702f, -58.754192f, -20.550688f, -9.141284f, 178.296661f, 46.222195f, 85.088615f, 25.129522f, 3.565898f, 73.297729f, 22.594685f, -30.790440f, -60.898556f, -59.714981f, -25.799683f, -26.515989f, + 79.872566f, 27.157415f, -193.357193f, 172.950409f, 131.502487f, -2.173946f, -11.273206f, 11.559188f, -135.590240f, -117.606354f, 162.157654f, 74.852615f, 84.181198f, 42.567123f, 72.688606f, 30.169746f, + -22.176310f, 8.126409f, -98.820702f, 162.383163f, 130.916565f, 39.752148f, -32.870506f, -173.600403f, 116.578125f, 45.067692f, -27.598148f, 8.555970f, -3.395607f, -42.335846f, -20.110458f, -40.589352f, + 31.181765f, 77.636864f, 60.341606f, 90.832474f, -9.832494f, -111.538925f, 111.043030f, 140.765152f, 80.575752f, 24.432682f, 81.943199f, 20.720406f, 1.215079f, 4.115319f, -68.575241f, -91.525787f, + -84.731537f, -0.527349f, 25.745188f, 36.190254f, -62.206528f, -86.327141f, -27.536991f, -15.557912f, 32.424694f, 13.717608f, 11.215924f, 22.781013f, 9.574938f, 61.158257f, 61.121010f, 32.403088f, + -18.375742f, 10.047339f, -50.339001f, -6.936292f, 12.167328f, 150.529266f, 222.465683f, 183.672455f, 58.230515f, 30.788654f, -22.198248f, 57.085861f, 28.043667f, -36.177765f, 171.042053f, 134.737167f, + 0.297151f, 95.241844f, 51.197784f, 41.369175f, 33.568478f, 7.960698f, 55.897408f, 15.283177f, 29.098846f, 91.276161f, 20.340677f, -60.202499f, -171.769867f, -193.836426f, 13.407167f, 121.289520f, + -77.249527f, -31.146763f, -86.916313f, 13.008453f, -21.325594f, -35.007175f, -0.394985f, 39.783211f, 158.601135f, 162.017731f, 166.716888f, 164.855255f, 145.650070f, 87.215416f, 13.765621f, -16.071383f, + -11.922022f, 69.904465f, 145.530533f, 137.786896f, 42.237782f, 75.689651f, 121.502434f, 26.309196f, 0.019661f, -62.185799f, -152.175339f, 86.949432f, 41.679405f, 18.519968f, 34.415928f, 25.165304f, + -9.927750f, 11.307752f, -64.252609f, 131.465469f, 47.641304f, 22.456234f, 36.158360f, -40.804043f, -91.170403f, 86.573074f, -47.294422f, 15.884171f, 222.589951f, 158.826157f, 154.847031f, 224.892197f, + 34.394650f, 50.068573f, -4.612890f, 39.353638f, -13.351929f, 82.855324f, -34.119553f, -198.830780f, 169.354126f, 20.893297f, 2.412445f, -82.652008f, -123.564072f, 148.278564f, 67.057632f, 86.445847f, + 8.496761f, 55.847862f, 9.401371f, -12.230957f, -48.765945f, 339.392365f, 127.588539f, -17.772644f, 73.892937f, -37.477283f, 39.123516f, 58.133339f, -42.253559f, -161.082916f, 77.454605f, 125.429886f, + 43.473793f, 173.585449f, 85.007156f, 42.041813f, -61.597820f, 51.345463f, 44.502201f, -8.306359f, -2.903240f, -41.573891f, 114.340172f, 93.989349f, -18.752844f, 33.966118f, 85.911499f, -5.925835f, + 69.373337f, 94.525620f, 55.872551f, -12.796402f, -57.766541f, 205.378647f, 150.999893f, -34.033718f, 46.349552f, 51.589359f, -9.740956f, 165.190857f, 245.511856f, 140.620789f, 33.383125f, -80.622025f, + -24.897663f, 9.583753f, 62.261280f, -111.380074f, -93.574211f, 37.958935f, 11.259578f, -85.749733f, -185.118637f, 15.325944f, -47.716419f, -70.300369f, -64.094902f, -120.984238f, -115.879242f, -5.316128f, + -43.105038f, -38.260498f, -69.155273f, -106.188942f, -215.693817f, -116.750755f, -22.012207f, -17.229620f, 2.833113f, 47.987717f, 6.774336f, -11.583231f, 16.325312f, 30.872992f, 21.988634f, 21.333845f, + -40.281574f, -19.919075f, 83.175934f, 145.520676f, 74.963409f, -17.649036f, -97.185730f, -32.826363f, -53.159214f, -13.556940f, -30.614326f, -68.210266f, -70.881149f, -25.398729f, -57.834473f, -78.295006f, + -54.354683f, -53.242130f, -151.652374f, 75.184731f, -12.681744f, -62.721302f, 39.976120f, -84.622726f, -164.732422f, -81.025864f, -59.992664f, 18.575914f, 59.433632f, 91.230606f, 74.121452f, 15.667545f, + -56.008598f, -36.547680f, -74.135963f, 60.449661f, -43.171642f, 20.404333f, -94.677895f, -134.441208f, -21.513660f, -79.943031f, -11.399878f, -26.450451f, -51.884460f, 13.872990f, -10.700389f, 13.693831f, + -54.557514f, 14.214915f, -109.558357f, -39.927799f, -80.414780f, -21.436823f, -29.838932f, -133.094101f, 41.575626f, 119.561104f, 108.865402f, 113.994164f, 70.534935f, -74.075966f, -153.541779f, 13.645255f, + -19.660948f, 72.645828f, 57.090542f, 10.197439f, -82.249893f, -86.073334f, -65.963997f, 26.606983f, 62.380840f, -79.725609f, -67.844391f, -100.735214f, 103.173157f, 41.282562f, -14.417590f, 97.527374f, + -15.501063f, 10.106770f, 19.181379f, -48.813862f, -54.115250f, 235.424240f, 13.094974f, -96.655479f, -53.639637f, 13.621657f, 1.518511f, 44.934509f, 57.590019f, -41.299301f, -105.937149f, 5.567881f, + -26.978188f, 39.920815f, 39.867668f, -30.284748f, -137.471680f, -12.073587f, -11.821868f, -56.056862f, -109.460243f, -95.643143f, 71.884705f, 3.678432f, -69.469994f, 46.625034f, 21.143269f, -12.124670f, + -235.238770f, -189.902191f, -98.019753f, 1.308181f, 6.093620f, -51.336655f, -74.336411f, -58.007866f, -34.142288f, -23.622774f, 21.920612f, 54.356789f, 118.404907f, 98.866112f, 78.824142f, 48.048695f, + 38.583252f, 140.003342f, 104.366905f, 59.575905f, 16.539742f, 143.487717f, 46.418877f, 67.189468f, -16.257248f, -14.486803f, -37.126595f, -97.505363f, -80.173981f, -94.221985f, -115.390350f, -118.126472f, + 14.582953f, 70.503632f, -14.045506f, -19.149410f, -112.971611f, -166.393768f, 175.770172f, 72.728432f, -123.819260f, -84.734123f, -79.798332f, 15.522896f, 9.189954f, 45.245491f, 67.264786f, 21.392374f, + -30.288527f, 176.278839f, -42.118710f, -113.833649f, 18.178839f, -98.263985f, -5.378097f, -36.394852f, 56.751965f, 34.232403f, -15.896103f, -21.939495f, -36.014275f, -97.239891f, -44.097141f, -21.397247f, + -57.630421f, -14.344311f, -48.722851f, 4.000876f, -85.091949f, 134.974442f, 96.790924f, 44.602585f, 116.120537f, 108.384445f, 134.965012f, 62.810093f, -51.505104f, -66.570000f, 0.324640f, -61.159451f, + 46.961773f, 91.328773f, 255.896439f, 266.543579f, 55.914829f, 1.617108f, 3.187201f, -8.799063f, 27.105843f, 96.940453f, -6.333913f, -40.912540f, -123.896332f, -219.183456f, -147.103104f, -82.445755f, + 4.730723f, 14.597744f, -4.770158f, 50.178673f, -46.408352f, 46.296600f, 159.859604f, 44.269157f, 25.871405f, 18.163599f, -69.356171f, 99.161255f, 145.530502f, 110.339287f, -78.356651f, -249.688126f, + -4.995772f, 7.796484f, -231.294037f, 72.029633f, 33.000286f, -63.268135f, 113.155357f, -3.829946f, -48.667412f, 20.674379f, -19.940260f, -66.963058f, -30.490475f, 1.557967f, -21.697649f, -25.190910f, + -68.609848f, -42.050915f, -81.286026f, -171.873383f, 5.826807f, -37.863060f, 65.958603f, 64.783348f, 16.320978f, 7.862601f, -63.484844f, -35.056782f, 36.112469f, 25.719179f, -27.790937f, -49.815948f, + -52.712395f, 5.407033f, -50.664661f, -57.217823f, 93.290443f, 86.227432f, 47.213612f, 8.067347f, -70.909805f, -102.342758f, -81.671745f, -96.333832f, -76.863091f, -17.267122f, 0.470240f, 11.259017f, + 45.857506f, 61.279209f, -16.262930f, 65.889984f, 39.496490f, 31.019928f, 10.330289f, -12.880993f, -158.328720f, -214.299026f, 136.159515f, 34.651714f, 58.886429f, 52.877373f, 18.637857f, -97.587326f, + -83.695442f, -46.231495f, -126.655914f, 84.273537f, 24.091738f, -77.565994f, -121.072006f, -65.358688f, 13.704159f, 17.912792f, 129.792953f, 45.167286f, -76.637970f, -90.235817f, 29.498278f, 22.527498f, + -38.629421f, -13.281903f, 19.966961f, 21.830301f, -71.014816f, -56.646057f, -183.160706f, 153.295105f, 121.722061f, 122.379555f, 191.160324f, 94.983765f, -38.069660f, -13.902174f, -28.430313f, -3.660168f, + -61.012142f, -16.898062f, -122.156700f, 40.265934f, -4.676280f, 89.712509f, 77.850525f, -22.210423f, 54.780842f, -9.432448f, -77.245964f, 33.276836f, 8.500788f, 24.147732f, -37.488598f, -50.028263f, + -13.981007f, -3.172497f, 12.233177f, -3.165506f, -42.713432f, 159.373047f, 120.601517f, 61.609337f, -95.282997f, 154.044556f, 146.461670f, 105.883102f, 35.354893f, -32.637356f, 13.527010f, 52.834805f, + -59.811607f, 31.116199f, -44.788532f, -25.192825f, 11.671334f, -60.872108f, 94.383209f, 44.916836f, -91.212807f, -106.707802f, -36.229931f, -17.900185f, -138.207123f, -165.818100f, 56.715836f, 45.974777f, + -7.959111f, 85.271294f, 17.490253f, -50.336193f, -56.605679f, -100.320343f, -152.276581f, -135.327911f, 88.408737f, 129.427505f, 125.965462f, 98.592941f, 27.923223f, 7.087426f, 27.595392f, 42.971786f, + -25.500626f, 121.667168f, 83.573936f, 3.791471f, -23.845556f, 49.105648f, 81.526443f, 160.776093f, 22.598379f, -98.819115f, -47.420437f, -16.478176f, 46.472534f, -122.984657f, 0.608375f, 57.243511f, + -12.015658f, -0.135543f, -139.000534f, 151.549393f, 71.025963f, -20.232512f, 95.418777f, -70.840523f, 52.608326f, 22.649012f, -56.357464f, 137.754135f, 50.294880f, -87.514961f, 20.277452f, 193.218811f, + -111.404922f, -69.059303f, -107.005531f, 53.955250f, 56.233429f, 68.297432f, 9.512801f, -94.675659f, 125.887329f, 141.677551f, 37.625774f, -55.039444f, -107.942078f, -106.586906f, -103.690109f, -31.521854f, + -7.459867f, 80.387726f, -22.849117f, -7.418187f, -31.289583f, -58.895996f, 121.585495f, 71.303520f, 69.327995f, 33.343830f, -42.588058f, 246.521713f, 44.359360f, -30.136723f, 45.514824f, 33.970772f, + 13.146280f, 37.437431f, 11.781944f, 221.298462f, 64.525116f, -28.227280f, -2.765812f, -60.692303f, -105.971016f, 145.109314f, 29.132435f, -9.364019f, 92.389153f, -40.417786f, -167.946228f, 91.506371f, + 20.380590f, 124.691406f, -34.959442f, -32.687466f, -68.501457f, -12.932295f, 8.627584f, -95.438469f, 34.264408f, 157.920456f, 94.634033f, 154.451233f, 203.167297f, 140.269073f, 62.590698f, -14.471005f, + -23.798073f, 20.029366f, -28.207727f, -42.335686f, -94.120468f, -119.036964f, -160.177826f, 13.003415f, -10.760310f, -23.243717f, 23.871334f, -25.554195f, -70.506531f, -62.087463f, 52.588543f, 91.934219f, + -45.170189f, -10.087015f, -66.042885f, -262.296326f, 71.659988f, 42.020767f, -0.749665f, 30.568419f, -84.345169f, -88.957222f, 62.976131f, 17.781088f, 35.814819f, 41.151264f, 100.832329f, 51.108604f, + -55.090458f, 141.549744f, 45.250282f, 126.572884f, 51.766277f, -4.223619f, -20.867323f, -46.912258f, 12.903956f, -24.562819f, -59.262470f, -34.927166f, -24.950871f, 4.246840f, 14.226479f, -12.156185f, + -18.676003f, 56.782200f, 24.631006f, 31.817165f, -57.425724f, -164.249939f, -100.221893f, -51.068310f, -151.775375f, -103.694389f, 51.353741f, -14.789831f, 103.796227f, 121.169785f, 67.449203f, 45.746460f, + -9.249492f, -0.717516f, -95.589256f, -58.979927f, 183.596542f, 82.821739f, -44.961880f, -113.124100f, -73.027855f, 24.111319f, -9.787043f, -20.309830f, -9.503817f, -25.950542f, -63.329922f, -49.288395f, + -39.281731f, -8.520073f, 12.045630f, 113.941223f, 56.889790f, 11.705962f, -25.992363f, -25.818201f, 41.962906f, 136.173462f, 158.992706f, 71.041000f, -94.766388f, -115.894958f, -100.844521f, -76.998589f, + -8.995197f, 14.692396f, 10.648182f, 46.508247f, -46.040749f, -30.752420f, -101.055634f, 157.707993f, 120.625099f, -34.914780f, -60.452560f, -125.891411f, -64.873436f, 115.602501f, 134.647278f, 88.401085f, + -16.291512f, 25.577784f, -57.797333f, -93.257050f, 204.563004f, 23.844887f, 18.521849f, -48.872440f, -34.910671f, 52.242157f, 90.209885f, 155.241089f, 122.966759f, 97.500565f, 51.306534f, 61.434639f, + 5.888782f, 91.756126f, 55.121063f, 59.742477f, -13.308426f, -24.613007f, -59.364792f, -131.265594f, -87.939194f, -56.433189f, -38.294590f, 21.820187f, 22.980511f, -26.082766f, -9.050174f, -5.993128f, + -109.033333f, -70.663361f, -105.171837f, -29.390360f, 23.201317f, -1.143196f, -0.591588f, -62.349960f, 177.791931f, 64.124794f, 18.023848f, 85.805557f, 57.960117f, -10.079674f, -10.009348f, -11.720422f, + -1.513953f, 39.937832f, 25.296638f, 52.355652f, 31.179762f, 169.450806f, 131.414230f, 42.987076f, 48.422070f, -2.570796f, -102.850693f, -184.716797f, 126.997742f, 120.658882f, 70.227798f, 51.911579f, + 14.841161f, 42.875328f, -31.856815f, -61.852024f, -95.273911f, -33.013256f, 70.492905f, -26.551783f, -11.850163f, 50.677963f, -74.369408f, 121.694061f, 184.952850f, 83.381836f, 119.151489f, 86.071533f, + -76.190552f, 217.282104f, -47.804283f, 21.103445f, 63.081154f, 35.664818f, 9.597631f, -78.337799f, 33.574825f, 9.579362f, 11.619099f, -66.239075f, -93.457573f, -67.129135f, -28.104412f, -48.758240f, + -32.987583f, 55.155075f, -19.071968f, 25.848909f, 147.531418f, 161.891159f, 100.338860f, 122.278191f, 117.346077f, 121.715561f, 59.932480f, -5.041065f, -11.882968f, 25.816359f, 5.152595f, -6.028398f, + -50.602802f, 47.969971f, 109.523300f, -18.894117f, 104.845932f, 3.333271f, 81.642517f, 48.507870f, 18.322062f, 13.163134f, -27.716911f, -78.545464f, -60.946442f, -21.241007f, -43.533047f, -54.892029f, + 23.136389f, 29.755871f, 115.663109f, 366.295105f, 92.912613f, -56.490879f, -23.877293f, -67.456276f, -41.077976f, 176.197632f, 112.048927f, 87.809334f, 124.036644f, 73.674416f, 55.857883f, -59.281975f, + 36.171646f, 81.249886f, 0.990727f, 62.659752f, -6.243932f, -32.411499f, 103.505295f, -8.062663f, -11.415750f, -33.329777f, -157.624710f, 108.892738f, -52.815735f, -116.408310f, -114.794746f, -108.042885f, + -53.235435f, -53.853008f, -22.214457f, -62.809551f, -184.508316f, 55.657627f, 60.393047f, 8.903349f, 119.629532f, 99.485672f, 93.179787f, 12.529486f, -36.033150f, 91.600227f, 120.306450f, 101.186569f, + -266.389862f, -40.268497f, 58.560471f, -15.688929f, 15.476221f, 40.140427f, 70.106178f, 33.398193f, -55.307781f, -54.812614f, 9.501314f, -32.842312f, 1.404359f, 72.411819f, 48.677658f, 19.896832f, + -30.625458f, -22.088581f, 23.690083f, 147.814285f, 106.761505f, 32.618851f, -56.217175f, -56.086750f, -39.910542f, -27.860449f, 41.870930f, 33.237003f, 14.673645f, 133.780670f, 65.161377f, 29.900471f, + 52.106541f, 97.515167f, -46.684582f, 28.368923f, 50.509525f, -14.864295f, 9.164424f, -87.343681f, -53.357895f, -14.466661f, -124.789276f, 139.007889f, 57.820137f, -198.630005f, 89.412651f, 73.174347f, + -11.813260f, 28.477610f, 43.814209f, 53.005009f, -31.552076f, 12.509279f, -45.665352f, 0.665018f, 89.380127f, 35.962025f, 56.310169f, 231.104538f, 77.507759f, -6.636252f, -114.024948f, -103.220619f, + 3.209964f, 92.323235f, 134.360977f, 72.508331f, -71.873093f, -24.684990f, -70.873833f, -80.898567f, 36.660206f, 107.964767f, 56.888454f, -41.093380f, -94.986824f, 5.479705f, 85.588272f, 86.314072f, + 2.358892f, 19.563696f, -40.146599f, 106.779350f, 84.014519f, 66.932846f, 7.030437f, -25.116844f, 113.391785f, 69.206184f, -40.131550f, 153.922714f, 143.482407f, 34.324108f, 313.322266f, 143.053925f, + -22.836403f, 14.444014f, -49.938580f, -50.887901f, -139.897385f, 96.043907f, 97.666435f, -49.784187f, 51.330086f, 49.973110f, 36.349068f, 19.132963f, -131.961868f, -176.490204f, 84.266121f, 168.514481f, + -37.196350f, -31.474470f, -145.770355f, 73.739777f, -13.749185f, -36.067165f, -73.649986f, 69.205238f, 57.424969f, -29.286839f, 50.821659f, 151.341400f, 196.208405f, 145.900299f, 73.740807f, 59.942463f, + -48.483910f, 109.854485f, 175.905731f, 107.550728f, 182.661041f, 127.042297f, 56.932144f, -4.789718f, -40.474155f, -4.276073f, 15.682971f, -20.523733f, -2.600147f, 47.862274f, 10.863128f, -28.360899f, + -38.357815f, 12.670331f, -18.138870f, 42.676201f, 92.674187f, 36.742359f, 52.514660f, -5.668614f, -115.172440f, 43.835323f, 63.331287f, 56.027485f, 115.062248f, 3.782463f, -26.444477f, 273.927704f, + -70.262749f, -8.360212f, 4.471777f, 3.338549f, 59.435081f, 178.305817f, 71.276756f, -18.074911f, 8.591813f, 75.633720f, 25.886395f, -77.867401f, -98.552505f, 23.158539f, 89.771393f, 55.317135f, + -43.166435f, -20.516071f, -21.639067f, 58.366417f, -37.861000f, 87.507889f, 228.670868f, 168.987442f, 151.971222f, 95.947609f, 62.651642f, 55.564648f, -1.630664f, -52.394417f, -111.610962f, 110.578148f, + -3.820340f, 128.265320f, 241.518845f, 81.778282f, 29.058863f, -34.290600f, -72.192398f, -76.477760f, -66.605965f, -11.854634f, 31.504972f, 41.623680f, 49.260410f, 46.350578f, 25.015730f, 0.466101f, + -74.436829f, -21.117008f, 50.415005f, 41.561440f, 24.320005f, 3.089626f, 84.041313f, 176.202164f, 134.057922f, 109.030365f, 39.151558f, 51.717243f, 205.704620f, 150.353210f, 111.243019f, 26.017376f, + -0.922336f, 8.721625f, 49.901936f, 20.303036f, -45.592381f, -38.354324f, 58.650257f, -53.023918f, -56.784760f, -43.466248f, -124.796875f, -123.479370f, -110.273987f, -34.595661f, -16.564945f, 34.111702f, + -30.525043f, -2.907169f, -178.401764f, -44.677608f, -17.348223f, -31.677353f, -14.556618f, -31.867868f, 20.035357f, 2.716418f, -2.513957f, -41.058819f, -52.201744f, 41.795589f, 65.134628f, 38.667267f, + -92.711220f, -81.188332f, 165.320053f, 146.599762f, 22.146481f, -21.278519f, -40.179806f, -68.613281f, 115.899551f, 67.407913f, 2.306747f, 0.489086f, -1.279717f, 7.199631f, -40.551086f, -8.905237f, + -56.852066f, -32.516693f, -15.849322f, 68.052765f, 92.856277f, 97.140533f, 38.923428f, -64.162766f, -101.875473f, -63.277794f, -78.587120f, -32.074039f, 106.572845f, 95.851845f, 38.376095f, 15.852232f, + -53.858379f, -20.356443f, -84.059586f, -105.614822f, -51.119640f, -2.018013f, -77.954140f, -175.482086f, 79.777809f, 19.744781f, -53.635326f, -51.991280f, -49.052460f, -20.029406f, 16.108711f, 24.346910f, + 65.308319f, 24.882250f, -53.676472f, 35.191555f, -75.052139f, -100.669830f, 139.646332f, 26.502867f, -87.489288f, 144.371918f, 85.639999f, -5.127411f, 49.956379f, -68.622177f, -194.561584f, -257.525238f, + -72.071564f, 88.947922f, 181.188904f, -141.172180f, 21.858112f, 21.690336f, 80.976372f, 74.222694f, 14.965449f, 4.836141f, -13.533607f, 12.946756f, 80.034424f, 18.799646f, -1.797944f, -11.852658f, + -55.483604f, -28.792759f, -51.127789f, -27.386141f, -3.054134f, 270.684784f, 127.849197f, -7.843138f, -46.675968f, -2.273780f, -41.244320f, 107.264915f, 109.052605f, -57.428146f, -94.478180f, 201.012741f, + 58.417904f, 129.794479f, 88.032875f, -43.482414f, 1.503281f, 18.233082f, -4.274224f, -9.935395f, -90.743645f, -138.744934f, 13.047572f, 99.424622f, 79.562485f, -10.939718f, -128.585876f, -119.279457f, + -106.237129f, -91.740143f, 68.612770f, 19.771488f, -23.333853f, 6.881060f, -114.409279f, 37.293667f, 27.547070f, -21.962831f, 62.975277f, 126.174873f, 137.661591f, 88.351982f, 21.489727f, 36.082073f, + 49.864040f, 101.988388f, 41.740952f, -2.001927f, -83.519859f, 222.208069f, 203.213120f, 27.999317f, -8.565958f, -46.465588f, -117.948517f, -54.232327f, 28.665607f, -23.274929f, -55.554726f, -66.254654f, + -52.622940f, -27.317537f, -61.638550f, 130.447021f, 38.187801f, -83.578110f, 91.015823f, 65.975807f, -29.551769f, -55.780457f, -169.249374f, 136.943573f, 43.613983f, 85.860855f, 145.805145f, 83.847832f, + 15.936594f, 90.094734f, -129.895950f, 8.163410f, -8.877759f, -0.308240f, -33.896103f, 62.208805f, 103.766220f, 66.179008f, 27.826544f, -68.158470f, -111.605835f, -60.367783f, -34.454868f, -50.271614f, + -51.554886f, -21.024059f, -18.746723f, 92.973503f, -20.544609f, -4.456210f, 41.285404f, -2.806954f, 202.912384f, 180.625198f, 93.686058f, 105.542542f, -40.283619f, -22.137281f, 28.882605f, 86.878098f, + 166.593475f, 204.373047f, 175.392639f, 6.547530f, -67.728508f, -1.995924f, 104.944130f, 25.587944f, -76.602921f, 2.406351f, -37.560753f, -66.060905f, 82.223129f, -5.690928f, -80.786980f, -192.349823f, + 5.629341f, 24.807444f, 33.959263f, 139.666183f, 67.254204f, 113.142754f, 5.735409f, -36.896606f, 102.640205f, 13.071086f, -75.008644f, 135.153275f, 112.622955f, 93.684708f, 55.722095f, 17.380138f, + -78.392647f, 67.183548f, 41.397549f, 47.879723f, -95.470726f, -223.305008f, 34.429707f, 203.257339f, 81.951591f, 24.905951f, -102.131676f, -172.571976f, 80.404175f, -3.289175f, -63.539902f, -178.667999f, + -8.287517f, 28.750130f, 2.918398f, -190.230972f, 30.998074f, -24.621058f, 57.173183f, 67.070824f, -30.796249f, 125.394531f, 129.483154f, 69.056030f, 61.479782f, 5.587425f, -26.427807f, -42.299709f, + -53.579803f, 3.932101f, 19.298172f, 60.866375f, 203.507217f, 92.185112f, 4.952492f, 26.875463f, 58.186695f, 23.599648f, -55.879227f, -95.170883f, -128.408905f, -56.559254f, -13.179881f, -6.339478f, + 32.887764f, 110.878929f, 47.881824f, 61.743668f, 32.366764f, -43.335995f, 132.176224f, 23.456560f, -170.514435f, 21.666937f, -6.332648f, 200.979141f, 36.371750f, 69.918137f, 54.659019f, -24.744967f, + -48.200562f, -14.369913f, -109.873573f, 132.716415f, 33.534492f, 21.027716f, 29.168337f, -6.307217f, 29.464451f, -16.280748f, -5.903169f, -33.134434f, -163.021179f, -114.629570f, 242.579056f, 153.244400f, + -245.076645f, -119.108864f, 30.076363f, 46.303539f, 62.514118f, -1.635351f, 60.051456f, 85.906593f, 63.114086f, 96.103294f, 94.438263f, 60.414326f, 27.037113f, 46.420849f, 23.188837f, -4.991467f, + 48.128830f, 147.061111f, -19.109028f, -62.073257f, 73.974655f, 35.121407f, 48.858604f, 17.476908f, -27.161577f, -26.075205f, -23.080959f, -22.997204f, 22.060139f, 18.945644f, 12.078902f, 26.152502f, + -11.399143f, 35.660534f, 7.735845f, 28.895029f, 11.763469f, 67.383682f, 32.067547f, 172.807663f, 41.212330f, -64.892891f, 202.612274f, 66.128975f, 24.998840f, 129.758621f, 97.607491f, 64.079475f, + 16.849846f, -8.063315f, -96.246849f, -42.776253f, -61.709106f, 8.576951f, 41.636856f, 4.893633f, -184.455124f, 90.305283f, 214.893326f, 77.557159f, -52.231232f, -59.771557f, 115.499374f, 10.271899f, + -52.432972f, -10.506747f, 32.671928f, 30.160530f, -30.343365f, -108.296562f, -124.741348f, -114.153496f, 22.689064f, 53.387943f, 152.464798f, 195.884613f, 223.508789f, 180.783310f, 88.327431f, 24.891722f, + 44.069721f, 128.580154f, 87.081917f, 97.057877f, 80.764305f, 71.377975f, 76.201828f, 19.052254f, -86.244247f, -55.772846f, -78.071259f, 59.358582f, -18.004076f, -97.394165f, 203.970825f, 128.282730f, + -29.760933f, -17.373451f, -26.997627f, 298.461884f, 135.359589f, -5.173777f, 50.398880f, 16.654043f, -28.228046f, 127.954193f, 88.721756f, 31.046473f, 72.834770f, 51.219566f, 124.174194f, 179.024460f, + -71.473610f, -8.079115f, -80.057495f, 73.607849f, -11.565989f, 6.495467f, 75.740349f, 69.178413f, 172.751343f, 50.800892f, -29.929661f, -55.132294f, -39.521492f, -34.578106f, 29.018955f, 18.790855f, + 4.944071f, 58.298073f, 72.167747f, -20.213915f, -49.029274f, -5.245622f, 135.798645f, 114.233170f, 48.812248f, 154.565750f, 91.869995f, 9.594048f, 29.263868f, 29.942837f, 60.248390f, 56.068134f, + 20.676535f, 129.442535f, 114.557922f, 65.585472f, 9.776167f, 76.209824f, 142.460770f, 65.045479f, 31.220121f, 68.550804f, 85.770195f, 65.380852f, 33.190002f, -80.774033f, -170.538605f, 61.262844f, + -23.503824f, 198.854172f, 14.658221f, 54.346264f, 29.317448f, -15.893962f, 6.081978f, 50.519886f, 129.337723f, 125.421761f, 131.127838f, 197.853912f, 207.257065f, 154.032959f, 90.113098f, 66.989784f, + -62.626553f, 0.772200f, -28.967108f, -85.223953f, -146.385803f, 82.958099f, -24.949381f, 93.786552f, 94.234512f, -39.738564f, -74.894165f, -36.566628f, -39.978264f, 3.580493f, -15.366054f, -32.318130f, + -54.913471f, 12.737958f, -117.342049f, -59.757664f, -14.541400f, -24.570677f, -20.895752f, -18.573147f, -31.541250f, 3.822062f, 63.816460f, 68.993881f, 96.323494f, 113.108215f, 60.914867f, 38.452541f, + -74.699921f, -33.957706f, 274.636505f, 42.985191f, -13.963601f, 35.379383f, 27.960144f, -9.738332f, 15.494253f, -5.034236f, -48.640007f, -28.968740f, -24.268768f, 34.582504f, 11.429268f, 13.275120f, + 32.094368f, 53.997974f, 58.552933f, 60.038021f, 15.307313f, -14.686091f, -79.145950f, -92.266304f, 6.606106f, -31.398434f, 1.153621f, 61.459366f, 211.102783f, 199.088348f, 139.181458f, 90.360237f, + 13.961225f, 107.374969f, -42.851105f, 111.353691f, 85.895554f, -10.314037f, -36.885490f, -48.654755f, -86.748146f, -13.811635f, -28.521486f, -133.376526f, 66.836365f, 63.232780f, 50.980137f, 33.082199f, + 0.719331f, 59.833492f, 52.997120f, 109.368217f, 78.191238f, 181.871460f, 110.776367f, 41.572018f, 32.371555f, 59.911247f, 100.121117f, 147.708542f, 67.625221f, -90.737854f, -184.544220f, -95.008667f, + 17.476965f, 51.444233f, 130.136398f, 86.703789f, -21.260557f, -68.970932f, -246.970169f, 111.624298f, 106.618408f, -70.539291f, -17.852840f, 74.588875f, 22.676432f, 82.200706f, 75.469940f, 86.911079f, + -21.763515f, 88.468819f, 69.462051f, 28.234957f, 137.905060f, 97.628418f, 100.231453f, 71.048729f, -26.023251f, 18.455929f, 100.078911f, 91.618004f, 129.572266f, 162.295929f, 117.883362f, 73.251602f, + 20.503130f, 123.177406f, 98.707054f, -61.945675f, -133.366302f, -42.585499f, 17.451960f, -85.110466f, -109.559792f, 57.105164f, 49.939404f, 71.494247f, 106.595436f, -5.332850f, -10.096909f, 95.286079f, + -98.944687f, -70.735931f, -91.238235f, 77.213318f, 43.834396f, 103.931374f, 14.455284f, -18.546854f, 60.298130f, 69.783432f, 81.150307f, 75.219597f, 117.014557f, 133.318222f, 45.655605f, 44.907104f, + -17.773401f, 16.685305f, 35.210880f, 58.453514f, -39.141315f, 154.492096f, 160.108368f, 54.245167f, 143.091782f, 18.370985f, -46.498653f, 30.260704f, -32.253002f, 114.865051f, 94.643227f, 42.126125f, + 8.305405f, 73.466248f, 71.895737f, 7.841229f, -21.096027f, -83.805069f, 142.372986f, 32.864574f, -67.817047f, 0.273488f, -20.763456f, -39.558540f, 45.929173f, 245.427109f, 63.606354f, -33.662392f, + -9.818366f, 215.528351f, -34.979908f, -46.600666f, -52.985126f, -36.442551f, -23.177917f, 89.040405f, 115.907364f, 85.734955f, 85.459145f, 53.537971f, 38.606289f, 35.117779f, -9.532898f, -46.531116f, + 70.627678f, 109.927406f, 130.617371f, 127.965912f, 68.237038f, 175.485825f, 141.335297f, 101.838699f, 85.440056f, 100.211769f, -9.782224f, -34.040447f, -36.362839f, -103.141747f, -183.433182f, -281.405945f, + 13.631050f, 103.082298f, 153.487061f, 95.539291f, 80.014320f, 47.319462f, -47.897068f, 144.786728f, 150.994034f, 33.507248f, 38.446999f, -11.836577f, -52.710697f, -5.434279f, -6.585646f, -43.525864f, + -46.841568f, -36.090340f, 91.028366f, 223.865204f, 162.487579f, 161.622040f, 92.281693f, 72.600441f, 62.700375f, 116.998756f, 104.000122f, 56.268940f, 3.313947f, 39.044933f, 12.683829f, -66.421524f, + -53.988426f, -4.046704f, -43.765293f, -58.490433f, -61.409744f, 68.780487f, 180.177185f, 130.743820f, 59.566154f, 41.610359f, -29.455439f, -47.845570f, -53.330845f, -194.252975f, -99.193802f, -28.624321f, + -40.226192f, 19.173496f, -102.776230f, -115.559639f, -2.041245f, 17.804632f, 54.120743f, 35.981876f, 107.003677f, 67.225113f, 6.590813f, 31.162287f, 75.625832f, 94.116089f, 68.273361f, 19.100948f, + -81.027779f, -47.543785f, -81.577866f, 147.072006f, 140.771072f, 98.894592f, 98.462875f, 120.500710f, 69.188560f, -27.267778f, -26.730125f, 19.004963f, 28.982193f, 18.988167f, 15.679336f, 0.912693f, + 60.063290f, 68.444176f, -38.306652f, 274.795166f, 81.706596f, 1.653586f, 59.518078f, 81.843979f, 45.452694f, -98.132660f, 99.485909f, 72.635452f, 59.011009f, 43.986206f, 68.393044f, 153.643753f, + -54.196396f, 105.024605f, -46.588734f, 29.173431f, 46.003738f, 53.556526f, -1.795008f, -94.732422f, 74.060417f, 37.018723f, 57.519180f, 40.312252f, 4.980567f, 1.190214f, 65.139198f, 16.854973f, + 83.697479f, 124.012848f, 136.707169f, 105.191093f, 50.574764f, 7.427887f, 165.615936f, 120.431198f, 35.935490f, 146.632690f, 107.372086f, 101.817780f, 178.695389f, 32.956997f, -43.566265f, -170.662201f, + -45.706387f, 22.193432f, 48.583588f, 7.809529f, 108.639076f, 20.145479f, -8.151466f, 16.626425f, 45.076824f, 100.699867f, 56.172535f, 31.245377f, 41.698193f, 43.700226f, 33.969212f, 13.647820f, + 30.930534f, 96.241432f, 20.796177f, 20.642069f, -30.030577f, 105.024353f, 182.286652f, 51.891121f, -23.670610f, 19.259420f, -25.995207f, 144.711807f, 151.061661f, 39.095882f, 216.597061f, 151.033951f, + 55.972961f, 165.229263f, 42.423416f, -9.421596f, 9.304959f, -24.490530f, 65.337448f, 0.772096f, 34.500309f, 28.041000f, 164.460770f, 148.005341f, -44.788933f, -131.866653f, 118.602074f, 174.952545f, + -36.805115f, 2.389628f, -160.064590f, -74.493019f, -34.030777f, -37.621536f, 21.365028f, 11.060207f, 72.113487f, 151.263977f, 203.227783f, 232.426346f, 240.348846f, 198.561386f, 130.545105f, 79.279305f, + -5.590322f, 28.170464f, 31.049704f, 123.245987f, 143.256638f, 251.395782f, 35.744690f, -42.437420f, -26.080673f, 16.841845f, 18.203182f, 83.183998f, 68.937943f, -68.034676f, 4.653465f, 101.861214f, + 75.410370f, 146.164398f, 101.675415f, 188.854752f, 65.271072f, -0.098294f, 44.761238f, -45.286770f, -80.445572f, 95.316223f, -28.573139f, 1.249410f, 194.675003f, 77.615021f, 9.229208f, 122.592499f, + -53.932175f, 216.979111f, -2.220833f, 63.310429f, 91.275101f, 57.843071f, 70.857147f, 42.466930f, 77.749489f, 57.652969f, 21.516739f, -1.124474f, -30.274309f, -13.056955f, 15.011532f, -30.375456f, + 67.425507f, 84.229256f, 101.499359f, 28.049738f, -35.614960f, 320.076202f, 252.214386f, 152.618103f, 138.893570f, 99.840240f, 27.951473f, 49.207226f, 65.402916f, 7.603233f, -14.404366f, -35.147362f, + -19.139826f, 222.586807f, 160.578033f, 15.308187f, 37.928532f, 2.810670f, 89.260468f, 73.903893f, -14.074634f, 9.220748f, 52.358765f, 29.237804f, 68.572754f, 74.369972f, 135.163269f, 53.634529f, + 27.498774f, 55.932766f, 90.594849f, 106.451241f, 66.339134f, 276.491119f, 112.921783f, 68.186401f, 34.717724f, 217.367447f, 183.300674f, 171.332642f, 233.111526f, 113.635857f, -94.105415f, 101.164040f +}; + +/*----------------------------------------------------------------------------------* + * LSF quantization - Scaling factors + *----------------------------------------------------------------------------------*/ + +/* stable ISP vector */ +const float stable_ISP[M] = +{ + 0.9808f, 0.9239f, 0.8315f, 0.7071f, 0.5556f, 0.3827f, 0.1951f, 0.0f, -0.195f, -0.3826f, -0.5555f, -0.7071f, -0.8314f, -0.9238f, -0.9808f, 0.045f +}; + +/* stable ISF vector */ +const float stable_ISF[M] = +{ + 399.846527f, 799.890991f, 1199.888550f, 1600.019531f, 1999.927002f, 2399.963379f, 2799.979736f, 3200.0f, 3599.812256f, 3999.815918f, 4399.827637f, 4799.980469f, 5199.744629f, 5599.576660f, 6000.153320f, 1554.147827f +}; + +/* stable LSP vector (corresponds to GEWB_Ave[]) */ +const float stable_LSP[M] = +{ + 0.9899f, 0.9667f, 0.8998f, 0.7837f, 0.6581f, 0.5009f, 0.3307f, 0.1643f, -0.0224f, -0.1955f, -0.3658f, -0.5200f, -0.6730f, -0.8040f, -0.9057f,-0.9700f +}; + + +/*----------------------------------------------------------------------------------* + * LSF quantization - Mean LSF vectors + *----------------------------------------------------------------------------------*/ +/* These are not used anywhere */ +/* A 16-by-1 matrix */ +const float means_wb_cleanspeech_lsf16k0[16] = {355.08f, 696.48f, 1260.55f, 1735.55f, 2220.70f, 2676.17f, 3123.44f, 3560.94f, 3989.45f, 4399.61f, 4869.14f, 5372.66f, 5894.53f, 6364.45f, 6883.20f, 7302.73f}; +/* A 16-by-1 matrix */ +const float means_swb_cleanspeech_lsf25k6[16] = {614.44f, 1437.24f, 2259.37f, 2994.68f, 3732.57f, 4420.10f, 5187.93f, 5985.97f, 6790.66f, 7523.16f, 8283.87f, 9010.86f, 9757.03f, 10458.90f, 11209.84f, 11888.64f}; +/* A 16-by-1 matrix */ +const float means_swb_cleanspeech_lsf32k0[16] = {739.65f, 1811.71f, 2794.79f, 3708.53f, 4594.87f, 5528.75f, 6583.99f, 7512.05f, 8455.51f, 9352.67f, 10266.73f, 11133.74f, 12067.91f, 12958.21f, 13940.67f, 14794.15f}; + +/* An 16-by-1 matrix */ +const float SVWB2_Ave[16] = +{ + 389.8438f, 581.2500f, 1047.6563f, 1493.3594f, 1985.9375f, 2462.8906f, 2923.8281f, 3392.9688f, 3851.9531f, 4298.4375f, 4819.9219f, 5337.5000f, 5893.7500f, 6378.9063f, 6899.6094f, 7325.7813f +}; +/* An 16-by-1 matrix */ +const float IANB_Ave[16] = +{ + 283.5938f, 559.7656f, 973.8281f, 1331.2500f, 1695.3125f, 2037.1094f, 2383.9844f, 2713.6719f, 3035.9375f, 3334.3750f, 3614.0625f, 3910.9375f, 4261.3281f, 4854.2969f, 5467.5781f, 5934.7656f +}; +/* An 16-by-1 matrix */ +const float IAWB_Ave[16] = +{ + 225.3906f, 527.3438f, 986.7188f, 1380.8594f, 1773.0469f, 2150.0000f, 2537.8906f, 2914.0625f, 3298.8281f, 3670.3125f, 4051.1719f, 4421.4844f, 4807.4219f, 5182.8125f, 5566.0156f, 5940.2344f +}; +/* An 16-by-1 matrix */ +const float IAWB2_Ave[16] = +{ + 285.5469f, 694.1406f, 1247.6563f, 1713.2813f, 2198.8281f, 2658.5938f, 3129.6875f, 3579.6875f, 4034.7656f, 4480.0781f, 4973.0469f, 5483.2031f, 5986.7188f, 6460.1563f, 6953.5156f, 7393.3594f +}; +/* An 16-by-1 matrix */ +const float UVNB_Ave[16] = +{ + 397.6563f, 689.0625f, 1115.6250f, 1465.2344f, 1801.1719f, 2113.2813f, 2434.7656f, 2719.1406f, 3001.9531f, 3243.7500f, 3460.5469f, 3642.5781f, 3897.2656f, 4586.3281f, 5351.1719f, 5888.2813f +}; +/* An 16-by-1 matrix */ +const float UVWB_Ave[16] = +{ + 350.7813f, 742.1875f, 1239.0625f, 1636.7188f, 2023.8281f, 2406.6406f, 2786.7188f, 3150.7813f, 3513.6719f, 3862.5000f, 4212.5000f, 4545.3125f, 4893.3594f, 5232.8125f, 5586.3281f, 5930.8594f +}; +/* An 16-by-1 matrix */ +const float SVNB_Ave[16] = +{ + 347.6563f, 495.3125f, 753.9063f, 1133.5938f, 1538.2813f, 1883.9844f, 2278.1250f, 2595.3125f, 2924.6094f, 3203.9063f, 3478.9063f, 3728.5156f, 4214.0625f, 4908.2031f, 5452.7344f, 5930.8594f +}; +/* An 16-by-1 matrix */ +const float SVWB_Ave[16] = +{ + 325.0000f, 487.5000f, 761.3281f, 1204.2969f, 1613.6719f, 1998.8281f, 2413.6719f, 2760.5469f, 3128.1250f, 3485.1563f, 3857.4219f, 4195.7031f, 4603.5156f, 5023.4375f, 5456.2500f, 5878.1250f +}; +/* An 16-by-1 matrix */ +const float GEWB_Ave[16] = +{ + 289.8438f, 527.3438f, 919.5313f, 1365.2344f, 1736.7188f, 2131.2500f, 2513.2813f, 2863.6719f, 3245.7031f, 3600.7813f, 3962.8906f, 4314.0625f, 4703.9063f, 5102.7344f, 5508.2031f, 5899.6094f +}; +/* An 16-by-1 matrix */ +const float GEWB2_Ave[16] = +{ + 355.0781f, 696.4844f, 1260.5469f, 1735.5469f, 2220.7031f, 2676.1719f, 3123.4375f, 3560.9375f, 3989.4531f, 4399.6094f, 4869.1406f, 5372.6563f, 5894.5313f, 6364.4531f, 6883.2031f, 7302.7344f +}; +/* An 16-by-1 matrix */ +const float GENB_Ave[16] = +{ + 326.5625f, 525.0000f, 881.6406f, 1274.6094f, 1630.0781f, 1965.2344f, 2324.2188f, 2619.9219f, 2935.1563f, 3216.4063f, 3469.1406f, 3687.1094f, 4059.7656f, 4775.7813f, 5412.1094f, 5912.1094f +}; +/* An 16-by-1 matrix */ +const float TRNB_Ave[16] = +{ + 358.9844f, 521.4844f, 822.6563f, 1227.3438f, 1598.4375f, 1928.9063f, 2306.6406f, 2605.4688f, 2925.7813f, 3202.7344f, 3464.0625f, 3689.0625f, 4118.7500f, 4837.1094f, 5429.6875f, 5920.3125f +}; +/* An 16-by-1 matrix */ +const float TRWB_Ave[16] = +{ + 325.7813f, 517.9688f, 840.2344f, 1305.0781f, 1681.6406f, 2069.9219f, 2467.9688f, 2811.7188f, 3190.2344f, 3543.3594f, 3906.6406f, 4244.9219f, 4637.1094f, 5043.7500f, 5463.2813f, 5877.3438f +}; +/* An 16-by-1 matrix */ +const float TRWB2_Ave[16] = +{ + 369.1406f, 603.9063f, 1119.5313f, 1621.0938f, 2086.7188f, 2565.6250f, 2992.1875f, 3441.0156f, 3864.8438f, 4271.0938f, 4753.9063f, 5303.5156f, 5851.9531f, 6359.3750f, 6880.4688f, 7335.1563f +}; +/* An 16-by-1 matrix */ +const float AUNB_Ave[16] = +{ + 346.4844f, 563.6719f, 920.3125f, 1247.6563f, 1603.5156f, 1933.2031f, 2281.6406f, 2591.7969f, 2905.0781f, 3195.7031f, 3463.6719f, 3702.3438f, 4056.6406f, 4758.5938f, 5413.2813f, 5910.5469f +}; +/* An 16-by-1 matrix */ +const float AUWB_Ave[16] = +{ + 316.4063f, 573.4375f, 967.1875f, 1334.7656f, 1717.1875f, 2086.7188f, 2465.2344f, 2818.3594f, 3191.7969f, 3546.0938f, 3917.9688f, 4284.7656f, 4692.9688f, 5107.4219f, 5525.7813f, 5911.3281f +}; +/* An 16-by-1 matrix */ +const float AUWB2_Ave[16] = +{ + 364.4531f, 681.6406f, 1187.5000f, 1623.8281f, 2101.1719f, 2535.1563f, 2986.7188f, 3408.2031f, 3848.4375f, 4269.5313f, 4771.0938f, 5330.8594f, 5883.5938f, 6366.0156f, 6889.0625f, 7331.2500f +}; +/* An 16-by-1 matrix */ +const float Predictor0[16] = +{ + 0.83499f, 0.83499f, 0.83499f, 0.82999f, 0.82999f, 0.82999f, 0.80499f, 0.80750f, 0.79999f, 0.79300f, 0.80750f, 0.80750f, 0.79300f, 0.78500f, 0.78500f, 0.75500f +}; +/* An 16-by-1 matrix */ +const float Predictor1[16] = +{ + 0.82501f, 0.82501f, 0.82501f, 0.81299f, 0.80301f, 0.81299f, 0.81299f, 0.79749f, 0.79999f, 0.79999f, 0.80750f, 0.82001f, 0.82001f, 0.81500f, 0.82501f, 0.81299f +}; +/* An 16-by-1 matrix */ +const float Predictor2[16] = +{ + 0.73999f, 0.72000f, 0.74799f, 0.73999f, 0.74799f, 0.73300f, 0.73300f, 0.72501f, 0.72501f, 0.73300f, 0.73999f, 0.73999f, 0.72000f, 0.70499f, 0.72000f, 0.70499f +}; +/* An 16-by-1 matrix */ +const float Predictor3[16] = +{ + 0.73999f, 0.73999f, 0.75500f, 0.73999f, 0.74799f, 0.72501f, 0.71500f, 0.70499f, 0.69000f, 0.70499f, 0.72000f, 0.75500f, 0.76300f, 0.75500f, 0.76300f, 0.75800f +}; +/* An 16-by-1 matrix */ +const float Predictor4[16] = +{ + 0.57999f, 0.56000f, 0.58801f, 0.57999f, 0.58801f, 0.57300f, 0.57300f, 0.56500f, 0.56500f, 0.57300f, 0.57999f, 0.57999f, 0.56000f, 0.54501f, 0.54001f, 0.52499f +}; +/* An 16-by-1 matrix */ +const float Predictor5[16] = +{ + 0.72751f, 0.72000f, 0.72000f, 0.72751f, 0.72751f, 0.72000f, 0.72000f, 0.72000f, 0.72751f, 0.73499f, 0.74301f, 0.75000f, 0.75000f, 0.71301f, 0.71301f, 0.71301f +}; +/* An 16-by-1 matrix */ +const float Predictor6[16] = +{ + 0.73499f, 0.72751f, 0.73499f, 0.72000f, 0.72000f, 0.70001f, 0.68301f, 0.66501f, 0.64499f, 0.67001f, 0.68301f, 0.74301f, 0.75000f, 0.72000f, 0.75000f, 0.74301f +}; +/* An 16-by-1 matrix */ +const float Predictor7[16] = +{ + 0.74301f, 0.73499f, 0.74301f, 0.74301f, 0.74301f, 0.73499f, 0.74301f, 0.75000f, 0.75000f, 0.75500f, 0.76501f, 0.74301f, 0.73499f, 0.72751f, 0.71301f, 0.75500f +}; +/* An 16-by-1 matrix */ +const float Predictor8[16] = +{ + 0.75500f, 0.75500f, 0.75500f, 0.75000f, 0.75000f, 0.75000f, 0.73499f, 0.72751f, 0.72000f, 0.71301f, 0.72751f, 0.72751f, 0.71301f, 0.70499f, 0.70499f, 0.67499f +}; +/* An 16-by-16 matrix */ +const float UVD_MA1[256] = +{ + -117.5781f, -196.4844f, -166.4063f, -73.0469f, -51.1719f, -25.0000f, -17.5781f, -7.8125f, 4.2969f, 21.8750f, 24.6094f, 35.1563f, 42.9688f, 68.3594f, 37.8906f, 12.8906f, + 62.8906f, 137.8906f, 185.1563f, 196.0938f, 276.9531f, 305.4688f, 310.1563f, 298.8281f, 246.8750f, 207.8125f, 158.5938f, 111.3281f, 89.8438f, 56.6406f, 37.8906f, 20.3125f, + -14.4531f, -1.9531f, 80.0781f, 126.1719f, 160.9375f, 136.3281f, 86.3281f, 35.5469f, -2.3438f, -23.0469f, -33.5938f, -43.7500f, -12.5000f, 81.6406f, 28.5156f, 8.9844f, + -106.6406f, -240.2344f, -320.3125f, -310.1563f, -325.7813f, -327.3438f, -321.0938f, -319.9219f, -293.3594f, -273.8281f, -250.3906f, -219.5313f, -152.7344f, -105.8594f, -71.8750f, -24.6094f, + 102.3438f, 65.6250f, 40.6250f, -3.5156f, -30.4688f, -63.6719f, -55.0781f, -77.7344f, -74.6094f, -97.2656f, -95.7031f, -123.8281f, -65.6250f, 208.9844f, 42.5781f, 12.8906f, + -160.1563f, -263.6719f, -266.0156f, -238.6719f, -195.3125f, -154.6875f, -106.6406f, -71.4844f, -18.3594f, 23.4375f, 75.7813f, 139.4531f, 407.8125f, 421.8750f, 130.8594f, 54.6875f, + 60.1563f, 72.2656f, 100.0000f, 92.9688f, 79.2969f, 92.9688f, 109.3750f, 101.5625f, 117.1875f, 104.2969f, 100.7813f, 76.5625f, 47.2656f, -241.4063f, -102.7344f, -23.4375f, + 134.7656f, 275.3906f, 335.5469f, 307.0313f, 290.2344f, 228.1250f, 166.0156f, 104.2969f, 65.6250f, 41.0156f, 28.9063f, 10.9375f, 46.4844f, 104.2969f, 41.0156f, 15.2344f, + -15.2344f, -64.8438f, -89.8438f, -76.5625f, -99.6094f, -107.8125f, -124.2188f, -136.3281f, -151.1719f, -171.0938f, -210.5469f, -239.4531f, -293.7500f, -373.4375f, -528.5156f, -635.9375f, + 194.5313f, 187.1094f, 161.7188f, 90.2344f, 38.2813f, 1.9531f, -7.0313f, -16.0156f, -23.4375f, -30.4688f, -35.5469f, -37.5000f, -31.6406f, 28.1250f, 11.7188f, -3.1250f, + 16.0156f, 46.8750f, 25.3906f, 55.0781f, 45.7031f, 72.6563f, 97.2656f, 116.7969f, 163.2813f, 203.1250f, 221.0938f, 241.4063f, 270.3125f, 226.1719f, 125.3906f, 64.8438f, + -92.1875f, -108.5938f, -26.9531f, 5.0781f, 44.1406f, 141.4063f, 173.8281f, 210.5469f, 196.4844f, 151.1719f, 105.0781f, 67.1875f, 46.8750f, -8.2031f, 0.3906f, 1.5625f, + -40.2344f, -17.9688f, -53.5156f, -51.5625f, -42.1875f, -37.8906f, -26.1719f, -14.4531f, -3.1250f, 16.0156f, 32.0313f, 41.7969f, 16.7969f, -236.3281f, -73.8281f, -21.8750f, + -85.9375f, -123.0469f, -188.2813f, -201.5625f, -191.0156f, -173.8281f, -162.1094f, -141.4063f, -118.7500f, -80.0781f, -53.1250f, -26.5625f, -2.7344f, 51.1719f, 27.3438f, 9.7656f, + -3.9063f, -47.2656f, -82.0313f, -92.5781f, -87.5000f, -117.9688f, -96.0938f, -121.0938f, -105.8594f, -133.9844f, -111.3281f, -142.1875f, 10.9375f, 274.6094f, 52.7344f, 21.0938f, + 46.0938f, 19.5313f, -26.1719f, -64.8438f, -136.3281f, -162.5000f, -172.6563f, -174.2188f, -171.4844f, -164.0625f, -149.2188f, -124.6094f, -95.7031f, -81.6406f, -54.6875f, -32.0313f +}; +/* An 16-by-16 matrix */ +const float UVD_MA2[256] = +{ + -29.2969f, -25.0000f, -58.5938f, -90.2344f, -106.2500f, -108.5938f, -96.8750f, -75.7813f, -60.9375f, -41.7969f, -28.9063f, -16.7969f, -35.9375f, -8.2031f, 3.5156f, 1.9531f, + 153.5156f, 107.4219f, -4.6875f, -60.9375f, -81.2500f, -83.9844f, -63.2813f, -51.5625f, -44.9219f, -42.5781f, -36.7188f, -33.2031f, -40.6250f, -3.9063f, 1.9531f, -0.3906f, + -116.0156f, -151.9531f, -38.6719f, -30.4688f, -25.7813f, -7.4219f, -4.6875f, 3.1250f, 0.0000f, -1.1719f, -5.8594f, -8.5938f, -44.1406f, -32.0313f, -6.2500f, 0.7813f, + 23.0469f, -4.2969f, 1.9531f, -12.8906f, -4.2969f, -23.8281f, -27.3438f, -54.2969f, -55.8594f, -93.3594f, -80.8594f, -87.1094f, 277.7344f, 273.8281f, 55.8594f, 26.5625f, + -76.1719f, 158.5938f, 86.7188f, 19.1406f, -2.3438f, -8.9844f, -2.3438f, 3.5156f, 0.0000f, 5.0781f, 10.1563f, 19.1406f, -17.1875f, -50.3906f, -7.0313f, -2.7344f, + 8.9844f, -11.7188f, -55.0781f, 30.8594f, -7.0313f, -29.6875f, -21.4844f, -5.4688f, 17.1875f, 38.2813f, 34.3750f, 33.5938f, -37.5000f, -137.1094f, -43.7500f, -15.2344f, + 148.4375f, 128.5156f, 91.7969f, 67.5781f, 55.0781f, 28.1250f, 9.7656f, -1.5625f, -2.3438f, -7.4219f, -8.2031f, -12.8906f, -21.4844f, -8.9844f, 1.1719f, -0.3906f, + -31.6406f, -82.0313f, -110.9375f, 61.7188f, 154.6875f, 113.2813f, 63.6719f, 23.0469f, -9.7656f, -8.5938f, -3.9063f, -2.3438f, -17.9688f, -12.5000f, 3.5156f, 1.9531f, + 3.5156f, 13.2813f, -5.8594f, 1.9531f, 8.9844f, -18.7500f, -49.6094f, -94.9219f, -135.5469f, -164.4531f, -177.7344f, -185.5469f, -193.3594f, -175.3906f, -114.8438f, -63.6719f, + -5.0781f, -66.7969f, -162.5000f, -161.7188f, -95.7031f, -9.7656f, 26.9531f, 39.8438f, 40.6250f, 32.8125f, 19.5313f, 12.8906f, -14.8438f, -1.5625f, 0.0000f, 1.9531f, + 19.5313f, 46.0938f, 26.5625f, 14.4531f, 57.4219f, 124.6094f, 144.9219f, 138.6719f, 113.6719f, 79.6875f, 50.7813f, 31.6406f, 8.2031f, 17.9688f, 14.0625f, 8.5938f, + -37.1094f, -42.1875f, 121.4844f, 83.5938f, -10.9375f, -59.7656f, -88.2813f, -75.0000f, -50.3906f, -26.9531f, -16.4063f, -4.2969f, -18.7500f, -6.6406f, 5.0781f, 0.7813f, + -72.2656f, -87.1094f, -40.6250f, 10.1563f, 20.7031f, 34.7656f, 51.5625f, 70.7031f, 100.7813f, 135.1563f, 155.0781f, 173.8281f, 153.1250f, 94.1406f, 48.8281f, 22.6563f, + 32.4219f, 12.8906f, -3.5156f, -31.6406f, 15.6250f, 38.6719f, 21.8750f, 3.1250f, -19.9219f, -33.2031f, -41.4063f, -48.4375f, -76.5625f, 1.9531f, 1.9531f, 0.0000f, + 55.8594f, 57.8125f, 7.4219f, -47.2656f, -96.4844f, -82.4219f, -26.1719f, 32.4219f, 77.3438f, 104.6875f, 113.2813f, 117.1875f, 93.7500f, 64.0625f, 33.5938f, 14.4531f, + -77.3438f, -53.1250f, 144.5313f, 145.3125f, 117.1875f, 93.7500f, 60.9375f, 44.1406f, 30.8594f, 23.4375f, 17.1875f, 11.3281f, -13.6719f, -14.8438f, 2.3438f, 2.7344f +}; +/* An 16-by-16 matrix */ +const float UVWB_MA3[256] = +{ + -10.1563f, 8.9844f, 2.7344f, -2.3438f, -0.3906f, 1.1719f, 15.6250f, 13.6719f, -16.7969f, -9.3750f, 21.8750f, 61.3281f, 103.5156f, 165.2344f, 149.2188f, 101.5625f, + 23.8281f, -117.1875f, -50.7813f, -39.4531f, -3.1250f, 41.4063f, 42.1875f, 44.5313f, 34.3750f, 16.7969f, -0.7813f, -12.8906f, -21.8750f, 26.1719f, 11.3281f, 5.0781f, + -12.1094f, 18.3594f, 17.5781f, -47.2656f, 17.9688f, 8.5938f, 43.3594f, 91.0156f, -100.0000f, -98.4375f, -48.0469f, -27.7344f, -12.1094f, 21.0938f, 21.8750f, 12.8906f, + 7.8125f, -60.1563f, 26.1719f, 77.3438f, -90.6250f, -65.2344f, -33.5938f, -4.6875f, 30.8594f, 45.3125f, 34.3750f, 30.4688f, 17.1875f, 29.2969f, 10.5469f, -2.7344f, + -5.4688f, 59.7656f, -64.8438f, 8.2031f, 41.7969f, 25.0000f, 91.0156f, -87.1094f, -57.4219f, -10.5469f, -0.3906f, 16.7969f, 23.8281f, 27.3438f, 19.5313f, 7.0313f, + 1.1719f, -44.9219f, -3.1250f, 55.8594f, 75.0000f, 75.3906f, -48.4375f, -76.1719f, -77.3438f, -63.2813f, -29.2969f, 5.4688f, 17.5781f, 32.4219f, 30.8594f, 19.1406f, + 4.6875f, -22.2656f, 9.7656f, -11.3281f, -4.2969f, 4.6875f, -2.7344f, -5.0781f, -4.6875f, 12.1094f, 28.9063f, 38.6719f, -3.9063f, -164.4531f, -81.6406f, -43.3594f, + -9.7656f, 44.9219f, 46.4844f, -7.4219f, -45.7031f, -64.0625f, -79.2969f, -92.5781f, -80.4688f, -66.0156f, -42.9688f, -16.0156f, -4.2969f, 5.8594f, 0.3906f, -2.7344f, + -5.0781f, 66.4063f, -55.8594f, -50.0000f, -87.5000f, -36.7188f, 0.3906f, 37.5000f, 56.2500f, 39.8438f, 11.3281f, 0.7813f, -14.4531f, 17.9688f, 2.7344f, -4.6875f, + -4.2969f, 3.9063f, -13.2813f, 14.8438f, 9.3750f, 33.5938f, 58.2031f, 82.4219f, 93.7500f, 108.9844f, 96.4844f, 85.1563f, 60.1563f, 62.8906f, 28.9063f, 5.8594f, + -9.3750f, 25.0000f, 42.9688f, 48.8281f, -9.3750f, 48.0469f, 62.8906f, 64.8438f, 69.1406f, 7.0313f, -43.7500f, -45.3125f, -55.0781f, -45.7031f, -44.1406f, -35.5469f, + -1.5625f, -7.8125f, -6.6406f, -4.2969f, -10.5469f, 5.0781f, -5.8594f, -15.6250f, -22.6563f, -61.3281f, -98.4375f, -110.5469f, -112.5000f, -72.6563f, -63.2813f, -43.7500f, + -7.8125f, 0.7813f, 12.5000f, 17.1875f, -12.1094f, -19.1406f, 3.1250f, 5.0781f, 21.4844f, -23.0469f, -63.2813f, -82.8125f, -23.8281f, 150.0000f, 44.9219f, 14.0625f, + -1.5625f, 16.4063f, -29.2969f, 35.9375f, 104.6875f, -79.2969f, -48.8281f, 3.9063f, 20.3125f, 47.2656f, 28.1250f, -16.7969f, -42.5781f, -18.3594f, -25.7813f, -29.6875f, + -15.2344f, 29.6875f, 104.6875f, -99.2188f, -10.9375f, 33.9844f, 0.7813f, 35.5469f, 33.2031f, 26.5625f, 34.7656f, 37.5000f, 16.4063f, 35.1563f, 15.2344f, 1.5625f, + 0.7813f, 0.7813f, -21.8750f, 2.7344f, 26.1719f, -12.1094f, -85.5469f, -75.0000f, -9.3750f, 57.0313f, 97.2656f, 105.0781f, 81.6406f, 77.7344f, 41.4063f, 12.1094f +}; +/* An 16-by-16 matrix */ +const float SVNB_SN1[256] = +{ + 52.7344f, 42.5781f, 52.7344f, -59.7656f, -214.4531f, 83.5938f, 162.5000f, 76.1719f, 113.6719f, 96.4844f, 39.0625f, -49.6094f, -226.1719f, -62.5000f, -25.7813f, -12.5000f, + -41.7969f, -58.5938f, -107.0313f, -58.2031f, 250.7813f, 232.0313f, 132.0313f, 71.4844f, 31.6406f, -12.1094f, -5.4688f, -58.5938f, -151.1719f, -15.6250f, -17.1875f, -7.0313f, + 28.5156f, 16.4063f, 66.7969f, 132.4219f, 83.2031f, 16.4063f, -53.5156f, -108.2031f, -148.0469f, -172.2656f, -171.8750f, -186.7188f, 105.4688f, 49.2188f, -1.5625f, 2.3438f, + -119.9219f, -187.1094f, -248.4375f, -232.8125f, -39.0625f, 32.4219f, 65.2344f, 78.1250f, 101.5625f, 146.8750f, 204.2969f, 410.5469f, 446.0938f, 191.4063f, 97.2656f, 42.1875f, + -57.8125f, -83.9844f, -126.5625f, -222.6563f, -358.2031f, -267.5781f, -81.2500f, 49.6094f, 111.3281f, 137.8906f, 172.2656f, 367.1875f, 429.6875f, 178.9063f, 89.4531f, 39.0625f, + 166.7969f, 168.7500f, 214.0625f, 166.4063f, 51.9531f, 5.0781f, -3.5156f, -55.0781f, -42.1875f, -56.2500f, -76.1719f, -163.6719f, -286.3281f, -56.2500f, -42.5781f, -17.5781f, + -44.9219f, -85.9375f, -75.7813f, 258.2031f, 350.0000f, 268.7500f, 191.0156f, 137.1094f, 82.4219f, 100.7813f, 57.4219f, 11.7188f, -291.4063f, -306.2500f, -60.9375f, -37.1094f, + 6.2500f, -18.7500f, -34.3750f, -167.9688f, -311.7188f, 14.0625f, 79.6875f, 26.5625f, 67.9688f, 63.2813f, 7.8125f, 23.8281f, 244.9219f, 103.9063f, 39.8438f, 18.7500f, + -98.4375f, -144.5313f, -246.0938f, -239.8438f, 265.6250f, 400.0000f, 339.4531f, 233.5938f, 163.6719f, 101.1719f, 75.3906f, 10.5469f, 35.1563f, 60.9375f, 20.7031f, 10.5469f, + -18.7500f, 12.8906f, 10.1563f, -88.6719f, -217.1875f, -299.2188f, -152.7344f, 90.2344f, 161.3281f, 110.1563f, 88.2813f, 34.7656f, 75.7813f, 73.0469f, 17.1875f, 11.7188f, + -79.6875f, -113.6719f, -134.7656f, -51.1719f, 48.8281f, 28.1250f, 6.2500f, -11.3281f, -41.4063f, -19.1406f, -10.5469f, 71.4844f, 278.9063f, 108.2031f, 44.5313f, 19.1406f, + -4.2969f, 80.0781f, 111.3281f, 26.9531f, -22.6563f, -80.8594f, -117.5781f, -62.5000f, -11.7188f, -0.7813f, 4.6875f, -38.6719f, -226.5625f, -69.5313f, -31.2500f, -16.0156f, + 46.8750f, 73.8281f, 109.7656f, 166.7969f, 91.4063f, 53.9063f, 48.4375f, 49.2188f, 19.5313f, 80.0781f, 47.2656f, 29.6875f, -311.3281f, -470.3125f, -91.7969f, -51.9531f, + 24.6094f, -7.0313f, 57.0313f, 260.1563f, 187.5000f, 92.1875f, 52.3438f, -15.2344f, -37.8906f, -50.7813f, -68.3594f, -147.6563f, -291.4063f, -62.1094f, -41.4063f, -17.9688f, + 150.7813f, 155.8594f, 162.1094f, 61.3281f, -68.3594f, -110.1563f, -123.0469f, -124.2188f, -86.7188f, -87.8906f, -104.2969f, -133.5938f, 123.8281f, 59.3750f, 5.8594f, 5.4688f, + 15.2344f, 21.8750f, 27.7344f, -37.1094f, -151.1719f, -198.8281f, -232.4219f, -182.0313f, -154.2969f, -72.6563f, -9.3750f, 164.4531f, 317.9688f, 114.0625f, 49.6094f, 20.3125f +}; +/* An 16-by-16 matrix */ +const float SVNB_SN2[256] = +{ + -6.2500f, 43.3594f, 43.3594f, -34.7656f, -44.9219f, -157.8125f, -200.7813f, 63.2813f, 108.2031f, 16.0156f, -36.7188f, -34.7656f, 5.8594f, 12.1094f, 0.7813f, 0.7813f, + -32.0313f, -38.6719f, -9.7656f, -112.1094f, -181.2500f, 79.6875f, 7.0313f, -48.0469f, -14.8438f, 21.8750f, 42.5781f, 77.3438f, 62.5000f, 37.5000f, 16.0156f, 7.4219f, + -37.1094f, -24.2188f, -94.5313f, -162.1094f, 124.2188f, 46.0938f, -47.2656f, 17.1875f, 28.9063f, 15.6250f, 33.2031f, 44.5313f, 20.3125f, 14.0625f, 8.2031f, 3.1250f, + 11.3281f, 15.6250f, 16.7969f, 8.9844f, -78.9063f, -58.2031f, 112.5000f, 58.2031f, -7.8125f, -42.5781f, -72.6563f, -107.4219f, -49.6094f, 7.0313f, -9.7656f, -2.3438f, + 7.8125f, 14.0625f, -37.8906f, -89.0625f, 220.7031f, 198.4375f, 52.3438f, 16.4063f, -27.3438f, -92.5781f, -100.7813f, -101.1719f, -48.0469f, -3.5156f, -11.3281f, -3.9063f, + -28.1250f, -66.0156f, 192.1875f, 180.8594f, 75.3906f, 79.6875f, -5.0781f, -29.2969f, -32.0313f, -48.8281f, -70.7031f, -89.8438f, -70.7031f, -3.9063f, -15.6250f, -4.6875f, + -42.1875f, -86.3281f, -89.4531f, 253.1250f, 224.6094f, 112.5000f, 57.0313f, 0.3906f, -5.4688f, -1.5625f, -19.9219f, -46.8750f, -31.6406f, -5.4688f, -6.6406f, -1.9531f, + -77.7344f, -103.1250f, -120.7031f, 81.6406f, 3.1250f, -50.0000f, 9.3750f, -18.3594f, 33.9844f, 100.3906f, 93.7500f, 72.2656f, 36.3281f, 27.3438f, 13.2813f, 6.2500f, + 9.7656f, 32.0313f, -23.4375f, -60.5469f, -158.9844f, -240.2344f, 11.3281f, 39.0625f, -44.1406f, 12.5000f, 80.8594f, 100.7813f, 79.2969f, 43.3594f, 19.1406f, 8.2031f, + 14.4531f, 49.6094f, 37.1094f, 1.5625f, 43.7500f, -17.5781f, -84.7656f, -61.7188f, -108.2031f, -158.9844f, -118.7500f, -59.3750f, 28.1250f, 20.3125f, -2.3438f, 0.0000f, + -11.7188f, -31.6406f, -45.3125f, -162.5000f, -85.5469f, 264.4531f, 210.1563f, 128.1250f, 83.2031f, 23.4375f, -23.4375f, -42.5781f, -30.4688f, 0.0000f, -1.9531f, 0.0000f, + 3.5156f, -5.8594f, 10.1563f, 29.2969f, -68.3594f, -131.2500f, -262.8906f, -228.9063f, 92.9688f, 121.0938f, 77.3438f, 73.8281f, 82.8125f, 49.2188f, 18.7500f, 9.3750f, + -7.0313f, -1.5625f, -31.2500f, 39.8438f, 50.7813f, -45.3125f, -104.6875f, -183.9844f, -221.4844f, -40.6250f, 80.0781f, 86.3281f, 55.8594f, 31.6406f, 11.3281f, 4.6875f, + 1.5625f, 15.2344f, 25.3906f, 44.9219f, 34.3750f, 73.8281f, 53.1250f, 48.4375f, 19.1406f, 41.4063f, 14.4531f, 34.7656f, -146.4844f, -244.5313f, -44.5313f, -28.5156f, + 210.9375f, 205.0781f, 184.3750f, 86.3281f, 46.0938f, -12.1094f, 5.8594f, 2.7344f, -27.7344f, -54.2969f, -42.1875f, -36.3281f, -5.0781f, -1.5625f, -5.0781f, -3.1250f, + -17.1875f, -17.1875f, -55.8594f, -106.2500f, -205.0781f, -142.5781f, 187.1094f, 196.0938f, 121.8750f, 87.8906f, 62.8906f, 28.1250f, 10.9375f, 16.4063f, 10.1563f, 4.6875f +}; +/* An 16-by-16 matrix */ +const float SVWB_SN1[256] = +{ + -27.7344f, -23.8281f, -66.4063f, -219.9219f, -375.7813f, -330.0781f, 72.6563f, 164.4531f, 110.1563f, 134.3750f, 101.5625f, 60.5469f, 72.6563f, 20.3125f, -7.0313f, -4.2969f, + -41.7969f, -54.2969f, -112.8906f, -105.4688f, 307.8125f, 240.2344f, 97.2656f, 67.9688f, -0.3906f, -9.3750f, 62.1094f, 41.4063f, -17.9688f, -71.4844f, -73.0469f, -41.7969f, + -56.2500f, -86.3281f, -83.9844f, 140.2344f, 75.0000f, -13.2813f, -72.6563f, -127.3438f, -100.0000f, -48.4375f, -19.1406f, 32.8125f, 83.5938f, 92.5781f, 72.6563f, 35.5469f, + 85.1563f, 129.6875f, 130.8594f, 16.0156f, -74.6094f, -153.9063f, -239.8438f, -212.1094f, -162.1094f, -148.0469f, -111.3281f, -59.7656f, -33.5938f, -39.4531f, -26.9531f, -5.0781f, + 229.2969f, 240.6250f, 285.9375f, 163.6719f, 105.4688f, 98.4375f, 39.8438f, 15.6250f, 20.7031f, -13.6719f, -22.2656f, -13.2813f, 7.4219f, -5.4688f, -5.8594f, -46.8750f, + -29.6875f, -86.7188f, -49.6094f, 475.0000f, 464.0625f, 318.3594f, 207.8125f, 125.0000f, 121.4844f, 89.0625f, 13.2813f, -23.0469f, -37.5000f, -33.5938f, -17.1875f, -14.8438f, + -68.7500f, -110.1563f, -198.0469f, -177.7344f, 438.2813f, 530.8594f, 376.9531f, 289.8438f, 238.2813f, 175.0000f, 185.1563f, 160.9375f, 72.2656f, 49.6094f, 49.6094f, -9.3750f, + -60.9375f, -87.8906f, 6.2500f, 178.9063f, 165.2344f, 171.0938f, 153.5156f, 156.2500f, 205.0781f, 257.0313f, 266.4063f, 266.0156f, 239.0625f, 171.0938f, 104.2969f, 26.5625f, + 34.7656f, 46.8750f, 67.1875f, 138.6719f, 76.1719f, -3.1250f, -8.5938f, -26.1719f, -42.9688f, -15.6250f, -36.3281f, -63.6719f, -149.2188f, -267.5781f, -361.7188f, -182.8125f, + -88.6719f, -141.4063f, -176.5625f, -225.3906f, -83.2031f, -8.5938f, 21.8750f, 32.0313f, 51.5625f, 84.3750f, 135.9375f, 164.0625f, 139.8438f, 116.7969f, 100.3906f, 55.8594f, + 14.8438f, -30.0781f, 45.7031f, 334.3750f, 189.8438f, 110.1563f, 6.2500f, -60.1563f, -50.7813f, -123.0469f, -241.4063f, -305.8594f, -348.4375f, -212.8906f, -34.3750f, 23.0469f, + 85.1563f, 126.5625f, 90.6250f, -63.2813f, -227.7344f, -215.6250f, 49.2188f, 24.2188f, -15.6250f, -10.5469f, -88.6719f, -135.9375f, -130.4688f, -126.5625f, -92.9688f, -25.3906f, + 32.0313f, 6.2500f, -7.8125f, -210.5469f, -307.4219f, 235.9375f, 132.8125f, 101.1719f, 101.5625f, -20.7031f, -98.0469f, -82.4219f, -4.6875f, 49.6094f, 66.7969f, 38.6719f, + -9.3750f, 65.6250f, 78.9063f, -55.4688f, -87.1094f, -175.0000f, -110.1563f, 47.6563f, 57.8125f, 60.5469f, 141.7969f, 148.4375f, 135.5469f, 102.7344f, 48.4375f, -26.5625f, + 64.4531f, 58.5938f, 88.2813f, 37.1094f, -67.1875f, -100.3906f, -161.3281f, -199.2188f, -208.2031f, -286.7188f, -396.0938f, -471.0938f, -325.7813f, -63.2813f, 2.3438f, 37.8906f, + -30.4688f, -28.1250f, -31.6406f, -125.7813f, -236.3281f, -285.5469f, -289.0625f, -220.3125f, -139.0625f, -85.5469f, -58.9844f, 4.2969f, 78.1250f, 92.5781f, 82.8125f, 66.4063f +}; +/* An 16-by-16 matrix */ +const float SVWB_SN2[256] = +{ + -49.2188f, -59.3750f, -133.5938f, -165.2344f, 121.4844f, 37.1094f, 1.1719f, 11.3281f, -36.3281f, 1.5625f, 88.6719f, 75.3906f, 55.4688f, 46.8750f, 36.3281f, 24.2188f, + 74.2188f, 100.7813f, 149.2188f, 121.0938f, 64.8438f, -4.2969f, -30.0781f, -26.1719f, -84.7656f, -127.7344f, -128.9063f, -147.6563f, -180.0781f, -120.7031f, -55.4688f, -18.3594f, + -6.2500f, -22.6563f, -30.0781f, -132.4219f, -208.5938f, 183.2031f, 155.8594f, 92.5781f, 113.2813f, 52.7344f, 13.2813f, 33.5938f, -5.4688f, -30.0781f, -11.7188f, 3.9063f, + 5.0781f, -1.5625f, 251.5625f, 223.4375f, 160.9375f, 171.0938f, 106.2500f, 111.7188f, 91.4063f, 69.1406f, 46.0938f, 57.4219f, 51.1719f, 53.9063f, 49.6094f, 14.8438f, + -28.5156f, -34.3750f, -43.7500f, 16.4063f, 14.0625f, 55.0781f, 165.6250f, 150.7813f, 196.8750f, 225.0000f, 204.2969f, 188.6719f, 168.3594f, 128.1250f, 91.0156f, 23.0469f, + -46.8750f, -66.0156f, -105.4688f, -173.8281f, -231.6406f, -104.6875f, -51.9531f, -53.9063f, -4.2969f, 21.8750f, 51.9531f, 82.0313f, 64.8438f, 45.3125f, 47.6563f, 53.5156f, + 110.1563f, 144.5313f, 99.6094f, 29.6875f, -34.7656f, -74.6094f, 54.2969f, 31.2500f, 4.6875f, 68.7500f, 72.2656f, 56.6406f, 95.3125f, 98.8281f, 67.5781f, -7.0313f, + 5.0781f, 5.4688f, -16.7969f, 28.5156f, -23.0469f, -105.4688f, -175.0000f, -242.9688f, -23.0469f, 146.0938f, 137.8906f, 114.4531f, 73.8281f, -21.0938f, -77.7344f, -47.6563f, + -29.2969f, -41.4063f, -109.7656f, -121.8750f, 228.5156f, 158.2031f, 72.2656f, 24.2188f, -68.7500f, -124.6094f, -128.9063f, -156.2500f, -163.2813f, -63.2813f, -1.5625f, 30.4688f, + -12.1094f, -4.2969f, -30.8594f, -32.4219f, -34.3750f, -107.0313f, -133.9844f, -168.3594f, -243.3594f, -202.3438f, -57.8125f, -4.2969f, -6.6406f, -8.2031f, 8.2031f, 35.1563f, + -39.4531f, -67.5781f, -93.7500f, 173.4375f, 118.3594f, 47.2656f, 40.6250f, -14.4531f, 72.2656f, 52.3438f, -17.5781f, -53.1250f, -64.0625f, 1.5625f, 59.7656f, 44.5313f, + -3.1250f, 15.6250f, 41.7969f, -29.6875f, -99.2188f, -215.2344f, -262.8906f, 112.5000f, 124.2188f, 9.7656f, 5.4688f, -24.2188f, -37.8906f, -0.7813f, 5.0781f, -7.8125f, + 33.9844f, 49.6094f, 31.2500f, 84.3750f, 131.2500f, 57.4219f, 73.4375f, 64.4531f, -3.9063f, 48.8281f, 75.3906f, 33.9844f, -49.2188f, -154.6875f, -287.5000f, -261.3281f, + 0.7813f, 1.5625f, 37.5000f, 72.2656f, 2.3438f, 24.2188f, -14.4531f, -53.1250f, -69.1406f, -97.6563f, -88.6719f, 78.5156f, 290.6250f, 254.2969f, 137.1094f, 28.9063f, + -6.2500f, -15.2344f, -32.0313f, -69.1406f, -148.4375f, -71.4844f, -9.3750f, -42.5781f, -75.7813f, -158.9844f, -250.3906f, -240.2344f, -61.3281f, 57.0313f, 74.6094f, 65.2344f, + -8.2031f, -4.6875f, -15.2344f, -24.6094f, -62.1094f, -50.0000f, 7.8125f, 2.3438f, 6.2500f, 15.2344f, -23.4375f, -94.9219f, -232.0313f, -286.3281f, -142.1875f, 17.9688f +}; +/* An 16-by-32 matrix */ +const float GEWB_MA1[512] = +{ + 105.0781f, 104.6875f, 162.5000f, 112.1094f, 61.3281f, 2.7344f, -51.5625f, -107.8125f, -188.2813f, -273.8281f, -400.3906f, -527.3438f, -641.4063f, -383.5938f, -125.3906f, -19.1406f, + 92.5781f, 370.7031f, 536.7188f, 479.6875f, 522.2656f, 476.1719f, 438.6719f, 396.8750f, 332.8125f, 293.7500f, 259.3750f, 218.3594f, 175.0000f, 119.5313f, 75.7813f, 32.4219f, + -2.3438f, -68.7500f, -145.7031f, -43.3594f, -86.3281f, -151.1719f, -188.6719f, -249.6094f, -294.1406f, -307.0313f, -302.3438f, -255.8594f, -128.1250f, -44.5313f, -9.7656f, 10.5469f, + 52.7344f, 64.0625f, -1.5625f, -70.7031f, -142.1875f, -206.2500f, -181.2500f, -165.6250f, -153.5156f, -122.6563f, -94.5313f, -72.2656f, -40.6250f, -23.8281f, -12.5000f, -14.4531f, + 5.8594f, -85.1563f, -125.7813f, 260.9375f, 233.2031f, 133.9844f, 76.5625f, -1.9531f, -17.9688f, -62.1094f, -140.2344f, -204.6875f, -245.7031f, -214.0625f, -120.3125f, -37.1094f, + 94.5313f, 180.8594f, 299.6094f, 258.2031f, 217.9688f, 157.4219f, 104.6875f, 74.6094f, 27.7344f, -1.5625f, -19.9219f, -40.2344f, -55.0781f, -68.7500f, -62.8906f, -55.4688f, + -69.9219f, -57.4219f, 279.2969f, 337.8906f, 378.9063f, 364.0625f, 321.0938f, 298.0469f, 235.1563f, 200.7813f, 170.3125f, 144.5313f, 111.3281f, 73.8281f, 41.4063f, 14.0625f, + -19.1406f, -88.6719f, -230.0781f, -364.4531f, -457.8125f, -273.4375f, -96.8750f, -68.3594f, -51.5625f, -51.5625f, -48.8281f, -40.2344f, -18.3594f, -19.1406f, -4.6875f, 23.4375f, + -2.7344f, -88.6719f, -157.8125f, 106.2500f, 32.4219f, -19.5313f, -64.4531f, -124.6094f, -133.9844f, -195.7031f, -285.5469f, -366.7969f, -395.7031f, -237.1094f, -78.9063f, -0.7813f, + -29.6875f, -105.8594f, -258.2031f, -227.3438f, 115.6250f, 33.5938f, -23.4375f, -64.8438f, -130.8594f, -122.6563f, -83.2031f, -111.3281f, -126.5625f, -109.3750f, -64.0625f, -15.2344f, + -103.1250f, -176.5625f, -43.3594f, 66.7969f, 89.4531f, 139.4531f, 138.6719f, 180.0781f, 198.8281f, 201.9531f, 191.0156f, 172.2656f, 135.5469f, 96.0938f, 61.7188f, 29.2969f, + 26.1719f, -19.1406f, -132.8125f, -213.2813f, -296.0938f, -358.9844f, -342.1875f, -283.9844f, -257.0313f, -221.4844f, -192.1875f, -156.2500f, -91.4063f, -54.6875f, -24.6094f, 14.0625f, + -55.4688f, 36.7188f, 200.7813f, 156.2500f, 158.5938f, 151.9531f, 148.0469f, 161.3281f, 152.7344f, 147.2656f, 138.2813f, 122.6563f, 95.7031f, 60.9375f, 36.7188f, 13.2813f, + 37.8906f, -18.3594f, -123.4375f, -242.1875f, -341.4063f, -69.9219f, -80.4688f, -113.2813f, -118.7500f, -200.7813f, -269.5313f, -282.4219f, -196.4844f, -98.4375f, -28.5156f, 15.2344f, + 189.4531f, 263.2813f, 207.8125f, 76.1719f, 14.8438f, -23.4375f, 6.6406f, 20.3125f, 24.6094f, 28.9063f, 33.2031f, 24.2188f, 13.6719f, -3.9063f, -8.5938f, -19.9219f, + -41.0156f, -8.9844f, 112.1094f, 153.9063f, 183.2031f, 237.8906f, 275.7813f, 335.9375f, 364.4531f, 364.4531f, 341.4063f, 308.2031f, 249.2188f, 181.6406f, 116.0156f, 57.8125f, + -87.1094f, -194.9219f, -326.9531f, -317.5781f, -152.7344f, -90.2344f, -69.5313f, -71.0938f, -31.6406f, 0.7813f, 32.8125f, 44.1406f, 51.1719f, 55.4688f, 49.6094f, 41.7969f, + -25.0000f, 105.0781f, 343.3594f, 331.6406f, 395.7031f, 451.9531f, 488.2813f, 522.2656f, 493.3594f, 459.3750f, 409.3750f, 351.5625f, 274.6094f, 196.0938f, 124.2188f, 64.4531f, + 23.8281f, 0.3906f, -77.3438f, -81.6406f, -134.7656f, -162.8906f, -109.3750f, -109.3750f, -119.9219f, -106.2500f, -133.2031f, -163.2813f, -235.9375f, -288.2813f, -346.4844f, -153.9063f, + 17.5781f, 30.0781f, 48.4375f, 59.3750f, 38.6719f, 16.7969f, 7.8125f, -1.5625f, -35.5469f, -33.2031f, -75.0000f, -109.3750f, -212.5000f, -294.5313f, -459.3750f, -506.2500f, + 67.5781f, 26.9531f, -19.1406f, -88.2813f, -134.3750f, -187.1094f, -191.0156f, -241.4063f, -283.9844f, -355.0781f, -438.2813f, -564.8438f, -504.6875f, -192.1875f, -80.0781f, 3.9063f, + -31.2500f, -31.2500f, 132.0313f, 111.3281f, 48.0469f, 18.7500f, -29.6875f, -31.2500f, -41.0156f, -46.0938f, -42.1875f, -31.2500f, -22.6563f, -10.9375f, -3.5156f, -3.1250f, + 28.9063f, -30.8594f, -114.0625f, -241.4063f, -295.3125f, 134.7656f, 84.3750f, 70.3125f, 55.8594f, -28.5156f, -72.6563f, -87.1094f, -78.1250f, -55.8594f, -20.3125f, -8.2031f, + -98.8281f, -202.7344f, -225.7813f, -73.4375f, -37.5000f, -13.6719f, -2.7344f, 10.5469f, 51.9531f, 85.1563f, 100.7813f, 100.7813f, 90.2344f, 70.3125f, 46.8750f, 27.3438f, + 106.6406f, 289.0625f, 371.0938f, 287.5000f, 273.8281f, 248.0469f, 238.6719f, 235.1563f, 221.0938f, 208.2031f, 192.9688f, 174.6094f, 136.7188f, 89.8438f, 51.1719f, 16.4063f, + -39.0625f, -134.7656f, -274.2188f, -137.5000f, 276.9531f, 266.4063f, 189.4531f, 126.5625f, 62.8906f, 43.7500f, 57.8125f, 9.7656f, -34.3750f, -41.4063f, -33.5938f, -39.4531f, + 119.9219f, 103.5156f, 98.8281f, 25.3906f, -24.6094f, -29.2969f, -66.0156f, -110.1563f, -152.3438f, -195.7031f, -214.8438f, -207.8125f, -158.5938f, -115.6250f, -72.6563f, -51.5625f, + -10.1563f, 27.3438f, 19.5313f, -32.8125f, -34.7656f, 10.9375f, 41.4063f, 77.7344f, 119.1406f, 152.7344f, 175.7813f, 183.2031f, 163.6719f, 117.5781f, 74.6094f, 31.2500f, + 8.5938f, 15.2344f, -60.1563f, -166.4063f, -233.2031f, -194.1406f, -62.1094f, -26.9531f, 16.0156f, 37.1094f, 44.5313f, 44.5313f, 38.6719f, 12.8906f, -2.7344f, -15.6250f, + -63.2813f, -139.0625f, -199.6094f, -180.0781f, -185.5469f, -200.3906f, -186.3281f, -189.4531f, -154.2969f, -97.2656f, -53.1250f, -27.7344f, -1.5625f, 12.8906f, 21.0938f, 25.0000f, + -32.0313f, -115.2344f, -219.5313f, 94.1406f, 25.3906f, -63.6719f, -88.6719f, -150.0000f, -92.5781f, -89.4531f, -103.9063f, -87.1094f, -36.7188f, 3.9063f, 16.0156f, 12.1094f, + -40.6250f, -126.1719f, -117.9688f, 286.3281f, 252.3438f, 163.2813f, 105.8594f, 58.2031f, 60.5469f, 60.1563f, 46.4844f, 38.6719f, 34.7656f, 24.6094f, 5.0781f, -6.2500f +}; +/* An 16-by-32 matrix */ +const float GETRNB_SN1[512] = +{ + -46.4844f, -105.8594f, -166.7969f, 174.6094f, 125.3906f, 22.6563f, 14.4531f, -41.0156f, -25.3906f, 38.6719f, 41.4063f, 8.2031f, -108.2031f, 20.7031f, 3.5156f, -2.3438f, + -36.3281f, -94.1406f, -169.1406f, -322.6563f, -401.5625f, 6.6406f, 70.3125f, 53.9063f, 125.0000f, 91.4063f, 59.3750f, 91.7969f, 380.0781f, 232.0313f, 77.7344f, 37.5000f, + -117.1875f, -185.1563f, -216.0156f, -194.1406f, -146.0938f, -90.2344f, -87.5000f, -66.4063f, -56.6406f, 19.9219f, 60.1563f, 278.9063f, 522.6563f, 269.5313f, 105.8594f, 46.0938f, + -44.9219f, -89.0625f, -96.8750f, 3.5156f, -10.5469f, -76.5625f, -93.7500f, -105.0781f, -114.4531f, -121.0938f, -107.8125f, -99.2188f, 300.3906f, 187.8906f, 45.7031f, 23.0469f, + 67.1875f, 22.6563f, 183.2031f, 228.5156f, 200.0000f, 131.2500f, 56.6406f, -20.3125f, -65.2344f, -134.3750f, -148.0469f, -190.2344f, 111.3281f, 147.2656f, 10.5469f, 10.5469f, + 31.6406f, 13.2813f, 224.2188f, 335.5469f, 319.5313f, 274.2188f, 203.5156f, 134.3750f, 69.1406f, 8.9844f, -45.3125f, -107.0313f, -238.6719f, -30.4688f, -23.8281f, -13.6719f, + 29.6875f, 7.4219f, -40.6250f, -151.5625f, -268.3594f, 21.0938f, 108.9844f, 56.2500f, 92.5781f, 87.1094f, 42.9688f, 3.5156f, -130.8594f, 1.5625f, 1.1719f, -3.9063f, + 44.9219f, 148.4375f, 189.8438f, 174.2188f, 151.9531f, 123.4375f, 93.3594f, 97.2656f, 76.9531f, 80.8594f, 63.2813f, 55.0781f, -169.9219f, -592.1875f, -159.7656f, -53.1250f, + -57.0313f, -135.9375f, -166.0156f, 251.9531f, 389.8438f, 308.5938f, 237.8906f, 182.8125f, 110.1563f, 112.1094f, 59.7656f, 33.9844f, -180.0781f, -231.2500f, -34.3750f, -25.0000f, + -97.2656f, -183.9844f, -326.1719f, -250.7813f, 230.0781f, 375.0000f, 346.4844f, 248.8281f, 172.6563f, 111.7188f, 94.5313f, 51.5625f, 55.4688f, 116.7969f, 38.6719f, 17.1875f, + 50.0000f, 14.4531f, -46.8750f, -122.6563f, -223.0469f, -285.1563f, -339.0625f, -217.9688f, -101.1719f, -42.5781f, 3.1250f, 161.3281f, 447.2656f, 231.6406f, 82.0313f, 35.9375f, + 58.9844f, 129.2969f, 104.2969f, 50.7813f, -9.3750f, -34.7656f, -51.9531f, -16.7969f, -29.2969f, 22.2656f, 7.4219f, 36.7188f, -183.2031f, -310.9375f, -48.4375f, -35.1563f, + -132.4219f, -182.8125f, -114.0625f, -13.2813f, 29.6875f, 69.9219f, 90.2344f, 105.0781f, 101.1719f, 109.7656f, 107.4219f, 79.6875f, -36.3281f, 61.3281f, 20.7031f, 6.2500f, + 12.8906f, 68.7500f, 9.7656f, -78.5156f, -121.4844f, -194.1406f, -198.8281f, -94.5313f, -18.3594f, 2.3438f, 33.5938f, 18.7500f, -64.4531f, 68.7500f, 9.3750f, 3.1250f, + 10.5469f, 87.1094f, 180.0781f, 195.3125f, 187.1094f, 185.5469f, 191.0156f, 218.7500f, 248.0469f, 289.4531f, 360.9375f, 526.1719f, 603.9063f, 314.8438f, 108.2031f, 21.0938f, + 199.2188f, 181.2500f, 157.0313f, 44.5313f, -31.2500f, -111.3281f, -113.2813f, -125.3906f, -110.5469f, -143.7500f, -126.9531f, -165.6250f, 151.5625f, 157.0313f, 20.3125f, 14.8438f, + 203.5156f, 239.8438f, 285.9375f, 214.4531f, 167.1875f, 108.5938f, 70.3125f, 31.6406f, 5.4688f, -42.9688f, -79.6875f, -138.6719f, -253.5156f, -12.5000f, -21.8750f, -14.0625f, + 28.1250f, 10.1563f, 102.3438f, 102.7344f, 62.1094f, 44.1406f, 23.4375f, -3.9063f, -28.5156f, -47.2656f, -78.5156f, -128.5156f, -300.0000f, -23.8281f, -23.4375f, -15.2344f, + 33.2031f, 22.2656f, 45.3125f, -15.6250f, -30.4688f, -62.1094f, -60.1563f, -96.4844f, -85.9375f, -142.9688f, -129.2969f, -207.8125f, -13.6719f, 134.3750f, 0.0000f, 9.7656f, + 205.8594f, 358.9844f, 523.0469f, 478.5156f, 464.8438f, 399.6094f, 302.3438f, 225.3906f, 153.5156f, 62.5000f, -1.5625f, -71.8750f, -109.7656f, 11.3281f, -8.2031f, -4.6875f, + -89.8438f, -110.5469f, -132.0313f, -148.0469f, -122.2656f, -114.4531f, -63.6719f, -47.6563f, 5.8594f, 37.8906f, 94.9219f, 65.6250f, 141.0156f, 175.3906f, 39.8438f, 23.8281f, + 147.6563f, 144.1406f, 144.1406f, 53.1250f, 16.4063f, -28.1250f, -28.5156f, -60.1563f, -60.5469f, -101.5625f, -105.4688f, -173.4375f, -219.5313f, 67.5781f, -14.0625f, -3.5156f, + 65.6250f, 42.1875f, -14.0625f, -135.5469f, -218.3594f, -170.3125f, -99.2188f, -102.7344f, -92.1875f, -88.6719f, -96.4844f, -92.9688f, 310.9375f, 190.6250f, 48.0469f, 24.2188f, + -58.9844f, -46.0938f, 63.6719f, 176.5625f, 167.9688f, 189.0625f, 178.1250f, 163.2813f, 147.2656f, 141.7969f, 100.0000f, 71.4844f, -157.4219f, -558.2031f, -149.2188f, -49.2188f, + -79.6875f, -142.9688f, -254.6875f, -200.0000f, 167.1875f, 137.8906f, 71.0938f, 34.3750f, -3.9063f, -36.7188f, -21.0938f, -4.2969f, 312.8906f, 205.8594f, 58.9844f, 29.6875f, + 23.4375f, 30.8594f, -66.0156f, -181.6406f, -308.2031f, -329.6875f, -21.4844f, 70.7031f, 81.6406f, 67.1875f, 82.0313f, 41.7969f, 101.5625f, 155.8594f, 35.5469f, 20.3125f, + -26.9531f, -80.0781f, -147.2656f, -64.0625f, 252.7344f, 228.1250f, 117.9688f, 58.9844f, 12.5000f, -52.7344f, -53.1250f, -87.1094f, -105.0781f, 66.4063f, 1.5625f, 1.9531f, + 14.8438f, 163.2813f, 345.7031f, 382.4219f, 386.7188f, 401.1719f, 339.8438f, 314.0625f, 261.3281f, 209.7656f, 140.6250f, 94.1406f, -131.2500f, -500.3906f, -132.0313f, -43.3594f, + -164.0625f, -273.4375f, -356.2500f, -242.9688f, -131.6406f, -19.9219f, 26.1719f, 67.5781f, 127.3438f, 216.4063f, 299.2188f, 544.9219f, 646.8750f, 349.2188f, 152.3438f, 69.5313f, + -55.0781f, -98.4375f, -198.0469f, -321.0938f, -423.4375f, -330.0781f, -109.3750f, 7.8125f, 58.2031f, 94.5313f, 153.5156f, 371.4844f, 557.8125f, 289.0625f, 118.3594f, 52.7344f, + -46.8750f, -14.4531f, 12.1094f, 41.0156f, 28.1250f, 38.6719f, 20.7031f, 45.7031f, 23.0469f, 66.7969f, 46.8750f, 69.1406f, -161.7188f, -387.8906f, -62.5000f, -38.2813f, + -149.2188f, -239.0625f, -246.4844f, -65.2344f, 1.5625f, 40.6250f, 50.7813f, 55.0781f, 94.5313f, 126.9531f, 135.9375f, 167.9688f, 409.3750f, 254.2969f, 86.7188f, 42.5781f +}; +/* An 16-by-16 matrix */ +const float GETRNB_SN2[256] = +{ + -10.5469f, 27.7344f, 17.5781f, -1.5625f, 10.9375f, 26.9531f, 9.7656f, 36.7188f, 17.5781f, 35.1563f, 17.5781f, 33.9844f, -69.1406f, -221.4844f, -45.3125f, -23.0469f, + -81.2500f, -57.4219f, 207.4219f, 155.8594f, 77.7344f, 44.1406f, -8.2031f, -10.9375f, -13.2813f, -14.8438f, -18.7500f, -17.9688f, -18.3594f, 7.0313f, -0.3906f, -0.3906f, + 26.9531f, -7.8125f, -44.9219f, -138.6719f, -148.4375f, 151.5625f, 148.0469f, 75.3906f, 52.3438f, 14.4531f, -16.4063f, -23.4375f, -13.6719f, 11.3281f, 2.3438f, 1.9531f, + 41.7969f, 34.7656f, -38.2813f, -73.8281f, 148.0469f, 112.8906f, 26.5625f, 8.5938f, -27.7344f, -69.9219f, -73.0469f, -75.0000f, -53.5156f, 1.5625f, -6.6406f, -2.7344f, + -17.1875f, -31.6406f, -144.9219f, -175.0000f, 88.2813f, 29.2969f, -20.3125f, 16.7969f, 15.6250f, 14.0625f, 30.8594f, 46.8750f, 50.7813f, 29.6875f, 14.0625f, 5.8594f, + 51.1719f, 44.9219f, 75.0000f, 69.1406f, 9.7656f, -2.7344f, -8.9844f, -37.1094f, -51.5625f, -71.8750f, -80.4688f, -95.7031f, -78.1250f, -4.6875f, -11.3281f, -4.2969f, + 17.5781f, -9.7656f, -97.2656f, 19.5313f, -73.8281f, -139.8438f, 98.8281f, 56.6406f, -15.2344f, 10.5469f, 13.2813f, -7.8125f, -20.3125f, 5.0781f, 0.3906f, 0.7813f, + -99.2188f, -60.5469f, 8.9844f, -34.7656f, -11.7188f, 8.9844f, -8.9844f, -8.2031f, -17.5781f, -33.5938f, -35.9375f, -42.5781f, -18.7500f, 20.3125f, 1.1719f, 1.1719f, + -96.8750f, -91.0156f, 54.2969f, 83.2031f, 90.6250f, 141.0156f, 136.3281f, 156.6406f, 145.7031f, 117.5781f, 89.8438f, 80.8594f, 79.6875f, 39.4531f, 12.5000f, 5.4688f, + 191.7969f, 213.2813f, 159.7656f, 57.4219f, 13.2813f, -7.0313f, 20.3125f, 23.0469f, 18.7500f, 10.5469f, 5.4688f, 2.7344f, -0.3906f, -14.4531f, -6.2500f, -3.5156f, + 14.0625f, 16.0156f, 0.0000f, -8.2031f, -11.3281f, -25.0000f, -80.8594f, -135.1563f, -201.5625f, -138.6719f, -25.0000f, 28.5156f, 60.9375f, 36.7188f, 11.7188f, 4.2969f, + -10.9375f, -67.5781f, -108.5938f, 197.6563f, 166.7969f, 64.0625f, 43.3594f, 8.2031f, -12.8906f, -23.8281f, -30.4688f, -35.1563f, -12.5000f, 15.2344f, 1.5625f, 1.5625f, + -17.1875f, -23.4375f, -83.9844f, -145.7031f, -189.4531f, -105.4688f, 4.6875f, 58.9844f, 105.8594f, 103.5156f, 83.9844f, 69.5313f, 59.7656f, 27.7344f, 12.5000f, 6.6406f, + 42.9688f, 60.5469f, -11.3281f, -101.1719f, -85.1563f, -71.4844f, -68.3594f, -51.5625f, -33.2031f, -38.2813f, -33.9844f, -36.3281f, -30.0781f, 0.0000f, -3.5156f, -1.5625f, + -45.3125f, -5.4688f, 91.7969f, 0.3906f, -92.9688f, -155.4688f, -163.6719f, -21.4844f, 42.5781f, 30.0781f, 24.2188f, 28.9063f, 28.5156f, 18.3594f, 6.2500f, 3.1250f, + -7.8125f, -42.1875f, -85.5469f, 96.0938f, 7.8125f, -71.8750f, -128.1250f, -175.3906f, -26.1719f, 55.4688f, 48.8281f, 42.9688f, 35.5469f, 28.9063f, 10.9375f, 5.0781f +}; +/* An 16-by-32 matrix */ +const float GETRWB_SN1[512] = +{ + -90.6250f, -74.6094f, 110.1563f, 96.8750f, 134.3750f, 152.3438f, 167.1875f, 191.4063f, 210.1563f, 231.2500f, 242.1875f, 237.1094f, 208.2031f, 145.3125f, 101.9531f, 53.1250f, + -23.0469f, -88.6719f, -163.2813f, -112.5000f, -96.4844f, -175.0000f, -195.7031f, -251.5625f, -296.8750f, -360.1563f, -434.3750f, -470.3125f, -204.2969f, -50.7813f, 4.6875f, 51.1719f, + 54.2969f, 327.3438f, 547.6563f, 518.3594f, 572.2656f, 543.3594f, 535.5469f, 524.2188f, 476.5625f, 448.0469f, 406.6406f, 355.4688f, 286.3281f, 202.3438f, 130.8594f, 70.7031f, + 82.4219f, 57.8125f, -36.7188f, -107.4219f, -189.0625f, -228.9063f, -211.3281f, -247.6563f, -227.7344f, -199.6094f, -165.6250f, -125.7813f, -111.3281f, -116.7969f, -75.7813f, -33.9844f, + 160.1563f, 141.4063f, 131.6406f, 28.5156f, -14.0625f, -44.1406f, -70.3125f, -107.0313f, -145.7031f, -192.5781f, -195.7031f, -184.7656f, -153.5156f, -141.0156f, -105.8594f, -98.0469f, + -33.2031f, -142.9688f, -319.9219f, -207.8125f, 294.1406f, 268.7500f, 161.7188f, 79.2969f, 9.3750f, -16.7969f, 50.3906f, 23.4375f, -39.0625f, -48.0469f, -37.8906f, -44.5313f, + 1.5625f, 14.4531f, 189.0625f, 200.7813f, 132.8125f, 87.8906f, 34.7656f, 23.0469f, 15.6250f, 1.1719f, -1.9531f, -0.3906f, -4.2969f, -19.1406f, -16.7969f, -18.7500f, + -87.1094f, -183.9844f, -258.2031f, -221.4844f, -193.7500f, -202.7344f, -181.2500f, -211.7188f, -189.0625f, -133.9844f, -107.8125f, -72.2656f, -16.7969f, 6.6406f, 32.8125f, 51.9531f, + -41.4063f, -121.8750f, -260.9375f, -289.4531f, 150.3906f, 128.5156f, 47.2656f, -61.3281f, -165.2344f, -277.3438f, -373.8281f, -500.0000f, -446.4844f, -128.9063f, -7.8125f, 51.1719f, + 97.6563f, 61.3281f, 27.7344f, -121.0938f, -215.6250f, -289.0625f, -291.0156f, -303.9063f, -323.0469f, -415.6250f, -521.8750f, -636.3281f, -307.8125f, -76.1719f, -17.1875f, 51.1719f, + 54.6875f, 247.2656f, 378.9063f, 337.5000f, 338.6719f, 297.2656f, 266.7969f, 253.1250f, 223.4375f, 212.5000f, 201.5625f, 183.2031f, 149.6094f, 92.9688f, 55.8594f, 21.4844f, + 45.3125f, 55.8594f, 89.4531f, 52.3438f, -9.7656f, -46.8750f, -90.6250f, -130.0781f, -208.9844f, -250.7813f, -384.7656f, -491.7969f, -731.6406f, -674.6094f, -128.9063f, -3.9063f, + -25.0000f, -32.0313f, -24.2188f, -90.6250f, -120.3125f, -135.1563f, -115.6250f, -106.2500f, -59.7656f, -10.1563f, 42.1875f, 80.0781f, 90.6250f, 61.7188f, 50.3906f, 20.7031f, + 32.0313f, -35.9375f, -120.7031f, -308.9844f, -440.6250f, -101.1719f, -94.9219f, -158.2031f, -143.3594f, -248.8281f, -352.7344f, -423.4375f, -263.6719f, -77.7344f, 6.6406f, 57.0313f, + -96.4844f, -222.2656f, -346.0938f, -296.0938f, -130.4688f, -80.4688f, -61.7188f, -58.5938f, -25.0000f, 22.2656f, 74.2188f, 98.4375f, 101.9531f, 82.0313f, 63.6719f, 50.3906f, + -8.9844f, -124.6094f, -178.9063f, 308.9844f, 280.4688f, 156.2500f, 91.0156f, -31.6406f, -67.9688f, -156.2500f, -296.0938f, -409.3750f, -522.6563f, -405.4688f, -112.5000f, -2.3438f, + 19.5313f, 180.4688f, 118.3594f, -18.3594f, -47.6563f, -52.3438f, 5.8594f, 53.5156f, 69.9219f, 86.7188f, 103.9063f, 97.2656f, 85.5469f, 48.0469f, 31.2500f, 11.7188f, + -45.3125f, -129.6875f, -253.9063f, -431.2500f, -533.9844f, -269.9219f, -146.8750f, -115.2344f, -69.5313f, -77.7344f, -66.4063f, -9.3750f, 48.8281f, 37.1094f, 48.8281f, 65.6250f, + -25.7813f, -122.6563f, -205.4688f, 126.9531f, 60.9375f, -21.8750f, -44.5313f, -112.1094f, -49.2188f, -72.2656f, -114.0625f, -116.4063f, -73.8281f, -31.6406f, 0.3906f, 8.9844f, + 57.4219f, -11.7188f, -113.6719f, -301.1719f, -366.7969f, 102.3438f, 71.0938f, 49.2188f, 49.6094f, -39.0625f, -63.6719f, -52.3438f, -35.5469f, -37.1094f, -20.3125f, -7.4219f, + -87.8906f, -193.7500f, -175.3906f, -23.8281f, 17.9688f, 52.7344f, 71.0938f, 96.4844f, 126.5625f, 157.8125f, 178.5156f, 181.2500f, 164.0625f, 119.1406f, 81.6406f, 41.4063f, + 163.2813f, 121.8750f, 162.1094f, 28.9063f, -60.9375f, -134.7656f, -156.2500f, -247.6563f, -300.3906f, -412.8906f, -532.0313f, -719.1406f, -721.8750f, -183.9844f, -57.4219f, 33.9844f, + 14.8438f, 7.4219f, -90.6250f, -215.6250f, -272.6563f, -367.5781f, -188.6719f, 46.4844f, 21.0938f, -13.2813f, 27.3438f, -26.5625f, -56.2500f, -75.0000f, -98.8281f, -92.1875f, + 31.2500f, -11.7188f, -83.5938f, -61.3281f, -114.0625f, -121.8750f, -110.5469f, -135.5469f, -150.0000f, -145.3125f, -190.2344f, -196.4844f, -291.4063f, -371.0938f, -535.9375f, -251.5625f, + 17.1875f, 21.4844f, 48.4375f, 70.7031f, 48.8281f, 42.5781f, 23.8281f, 11.3281f, -28.5156f, -21.0938f, -80.4688f, -108.5938f, -249.2188f, -362.8906f, -610.5469f, -680.4688f, + 313.2813f, 321.4844f, 283.5938f, 137.8906f, 106.2500f, 47.6563f, 45.7031f, 36.7188f, 31.2500f, 15.6250f, 26.5625f, 18.3594f, 16.4063f, -7.4219f, -10.1563f, -26.9531f, + 19.5313f, -37.8906f, -119.5313f, -260.1563f, -358.5938f, -433.2031f, -439.0625f, -303.1250f, -277.3438f, -284.3750f, -263.6719f, -189.8438f, -58.5938f, -1.1719f, 36.3281f, 62.5000f, + 31.6406f, -56.2500f, -51.1719f, 124.6094f, 88.6719f, -37.5000f, -92.1875f, -201.9531f, -277.7344f, -370.7031f, -480.8594f, -642.1875f, -634.7656f, -173.4375f, -45.7031f, 33.5938f, + -89.8438f, -92.5781f, 228.9063f, 312.1094f, 363.6719f, 399.6094f, 420.7031f, 460.5469f, 442.5781f, 430.0781f, 401.1719f, 355.0781f, 285.5469f, 201.1719f, 128.9063f, 66.7969f, + 175.0000f, 246.8750f, 408.9844f, 305.4688f, 246.4844f, 152.3438f, 60.5469f, -32.0313f, -133.5938f, -267.5781f, -430.8594f, -593.7500f, -694.9219f, -363.6719f, -83.5938f, 13.2813f, + -30.0781f, -137.5000f, -137.8906f, 307.4219f, 366.4063f, 264.4531f, 200.3906f, 137.5000f, 110.9375f, 108.5938f, 96.4844f, 70.7031f, 55.0781f, 28.5156f, 3.1250f, -15.2344f, + 21.0938f, 16.4063f, -26.1719f, -116.4063f, -181.6406f, -231.6406f, -208.2031f, -213.6719f, -244.5313f, -289.4531f, -381.6406f, -514.4531f, -650.3906f, -239.4531f, -46.4844f, 31.2500f +}; +/* An 16-by-16 matrix */ +const float GETRWB_SN2[256] = +{ + -78.9063f, -96.0938f, -139.0625f, -139.0625f, -90.6250f, -64.0625f, -30.8594f, 1.5625f, 30.4688f, 50.7813f, 59.3750f, 64.4531f, 66.4063f, 55.0781f, 35.1563f, 27.3438f, + 14.8438f, 30.4688f, -28.1250f, -72.2656f, -174.2188f, -215.6250f, 105.0781f, 115.2344f, 40.6250f, 30.0781f, -21.0938f, -71.8750f, -65.6250f, -28.1250f, -12.5000f, -0.7813f, + 26.9531f, 36.3281f, 15.2344f, 45.3125f, 39.0625f, 17.9688f, 19.5313f, -0.3906f, -0.7813f, 24.2188f, 3.1250f, -41.0156f, -157.8125f, -256.2500f, -192.9688f, -87.5000f, + -111.3281f, -119.1406f, 102.7344f, 37.8906f, 11.3281f, 12.8906f, -9.3750f, 21.0938f, 13.6719f, 9.7656f, -1.5625f, -2.3438f, -11.7188f, 5.0781f, 7.8125f, 8.2031f, + -10.9375f, -27.3438f, -62.5000f, 13.2813f, 1.9531f, -56.6406f, -103.1250f, -166.0156f, -210.5469f, -128.5156f, -7.4219f, 89.0625f, 160.5469f, 109.3750f, 55.0781f, 19.9219f, + 95.3125f, 95.7031f, 7.4219f, -124.6094f, -180.0781f, -71.8750f, -3.9063f, 18.3594f, 85.9375f, 114.4531f, 120.7031f, 128.9063f, 109.7656f, 54.6875f, 27.7344f, 4.6875f, + -50.0000f, -98.0469f, -146.0938f, 165.6250f, 108.9844f, 26.5625f, 13.6719f, -26.5625f, 5.0781f, 17.5781f, -2.3438f, -16.0156f, -28.5156f, -6.6406f, 3.1250f, 10.5469f, + -21.4844f, -2.7344f, 171.0938f, 195.3125f, 192.5781f, 172.6563f, 111.7188f, 82.4219f, 26.5625f, -15.2344f, -45.7031f, -65.2344f, -70.3125f, -51.1719f, -29.2969f, -24.6094f, + 11.7188f, 12.1094f, 26.9531f, 44.5313f, -67.1875f, -158.9844f, -232.8125f, -152.7344f, 39.8438f, 66.0156f, 61.7188f, 51.1719f, 17.9688f, 1.5625f, -2.3438f, -1.1719f, + 26.9531f, 29.6875f, 12.8906f, 92.9688f, 64.0625f, 46.4844f, 62.5000f, 64.4531f, 106.6406f, 133.5938f, 149.6094f, 163.6719f, 178.1250f, 147.6563f, 102.3438f, 37.5000f, + -21.4844f, 16.7969f, -23.0469f, -106.6406f, -78.1250f, -111.7188f, -112.1094f, -86.3281f, -96.4844f, -95.7031f, -75.7813f, -62.5000f, -50.3906f, -14.0625f, -12.1094f, 1.1719f, + -13.6719f, -17.9688f, -106.2500f, -139.4531f, 189.0625f, 96.0938f, -4.2969f, 8.2031f, -48.0469f, -76.9531f, -39.8438f, -36.7188f, -37.5000f, -8.5938f, 2.3438f, 2.3438f, + -45.7031f, -73.4375f, -98.4375f, -88.6719f, 0.0000f, 179.6875f, 197.6563f, 205.4688f, 195.7031f, 151.9531f, 97.6563f, 51.1719f, -10.9375f, -12.5000f, 9.3750f, 6.6406f, + 155.8594f, 199.6094f, 152.3438f, 57.0313f, 31.2500f, -32.8125f, -31.6406f, -22.2656f, -48.0469f, -53.9063f, -37.1094f, -32.0313f, -19.9219f, -12.8906f, -5.4688f, -17.5781f, + -3.5156f, 4.6875f, 117.1875f, 118.7500f, 71.0938f, 10.5469f, -76.9531f, -100.7813f, -134.3750f, -153.5156f, -150.0000f, -124.2188f, -54.6875f, -1.9531f, -2.3438f, 2.3438f, + 25.0000f, 9.7656f, -2.7344f, -100.0000f, -119.5313f, 148.8281f, 94.9219f, 37.5000f, -6.6406f, -74.2188f, -111.3281f, -96.0938f, -25.3906f, 18.7500f, 14.4531f, 11.3281f +}; +/* An 16-by-16 matrix */ +const float TRWB2_SN1[256] = +{ + -28.9063f, -150.0000f, -298.4375f, -376.5625f, -438.2813f, -356.2500f, -319.9219f, -289.0625f, -284.3750f, -223.4375f, -148.0469f, -123.8281f, -97.6563f, -19.9219f, -26.1719f, 33.2031f, + -121.4844f, -241.4063f, -171.4844f, -42.1875f, 60.9375f, 100.3906f, 157.8125f, 212.1094f, 251.1719f, 284.7656f, 285.9375f, 223.4375f, 174.2188f, 128.5156f, 92.1875f, 64.0625f, + 204.2969f, 605.0781f, 608.2031f, 576.5625f, 536.7188f, 465.6250f, 417.1875f, 360.5469f, 351.9531f, 307.8125f, 280.0781f, 156.6406f, 102.3438f, 2.3438f, -39.0625f, -143.7500f, + -5.0781f, -31.2500f, -73.8281f, -150.7813f, -189.8438f, -139.4531f, -84.3750f, -24.6094f, 25.3906f, 73.8281f, 96.8750f, 75.7813f, 85.1563f, 85.5469f, 80.0781f, 66.0156f, + -40.6250f, -202.7344f, -301.5625f, 192.1875f, 87.5000f, 7.0313f, -79.2969f, -95.3125f, -49.2188f, -85.9375f, -141.4063f, -162.8906f, -105.8594f, -27.7344f, -13.2813f, -19.5313f, + -78.9063f, 48.4375f, 316.7969f, 380.8594f, 517.9688f, 573.4375f, 630.0781f, 596.4844f, 575.7813f, 533.5938f, 476.5625f, 353.9063f, 273.4375f, 198.8281f, 137.1094f, 80.8594f, + -22.2656f, -76.5625f, -92.9688f, -109.7656f, -104.2969f, -93.3594f, -74.2188f, -53.5156f, -10.5469f, 1.5625f, 30.0781f, -69.5313f, -100.0000f, -216.0156f, -261.3281f, -431.6406f, + -71.4844f, -82.4219f, 314.0625f, 308.2031f, 267.5781f, 206.6406f, 187.1094f, 157.4219f, 144.9219f, 122.2656f, 108.9844f, 19.1406f, -7.4219f, -60.9375f, -69.9219f, -130.8594f, + 296.0938f, 331.2500f, 237.5000f, 122.2656f, 105.8594f, 68.7500f, 69.1406f, 28.5156f, 41.4063f, 23.8281f, 23.0469f, -62.1094f, -79.2969f, -112.1094f, -104.6875f, -133.9844f, + 77.7344f, 27.3438f, 37.1094f, -11.3281f, -95.7031f, -160.5469f, -291.0156f, -394.1406f, -575.3906f, -750.3906f, -1028.5156f, -643.7500f, -209.7656f, -110.9375f, -33.9844f, 80.8594f, + 32.0313f, -84.7656f, -179.6875f, -252.3438f, -280.4688f, -320.7031f, -383.9844f, -500.7813f, -617.1875f, -823.4375f, -727.7344f, -237.8906f, -158.9844f, -47.6563f, -19.5313f, 94.9219f, + -51.5625f, 142.1875f, 142.1875f, 132.8125f, 191.0156f, 193.7500f, 232.8125f, 236.7188f, 275.0000f, 295.3125f, 303.5156f, 240.6250f, 203.5156f, 159.7656f, 119.1406f, 82.4219f, + 48.0469f, -73.8281f, -35.5469f, -119.5313f, -124.6094f, -158.9844f, -234.3750f, -265.2344f, -355.8594f, -333.9844f, -221.0938f, -97.2656f, -25.3906f, -0.3906f, -25.3906f, -9.7656f, + 30.8594f, -22.6563f, -40.2344f, -58.5938f, -104.6875f, -103.5156f, -166.4063f, -187.1094f, -239.8438f, -262.1094f, -392.5781f, -538.2813f, -791.7969f, -604.2969f, -221.8750f, -20.3125f, + -107.4219f, -261.3281f, -417.9688f, -428.5156f, -268.7500f, -169.1406f, -132.8125f, -57.8125f, -10.5469f, 75.7813f, 120.7031f, 108.2031f, 89.4531f, 73.4375f, 32.0313f, 49.6094f, + 155.0781f, 524.6094f, 578.9063f, 675.3906f, 772.6563f, 785.9375f, 769.1406f, 723.4375f, 675.3906f, 614.8438f, 549.6094f, 424.6094f, 331.2500f, 248.4375f, 168.3594f, 108.5938f +}; +/* An 16-by-16 matrix */ +const float TRWB2_SN2[256] = +{ + 19.5313f, -25.7813f, -189.8438f, -332.0313f, 196.8750f, 134.7656f, 101.9531f, 3.9063f, -80.8594f, -85.1563f, -67.9688f, -7.0313f, 28.1250f, 26.9531f, 1.1719f, 9.3750f, + -66.7969f, -171.4844f, -246.8750f, 152.3438f, 55.8594f, -34.7656f, -114.0625f, -122.6563f, -88.6719f, -61.3281f, 12.8906f, 70.7031f, 72.2656f, 79.6875f, 50.0000f, 65.2344f, + 178.9063f, 179.2969f, 30.4688f, -97.6563f, -142.5781f, -148.8281f, -137.8906f, -149.2188f, -127.7344f, -110.9375f, -74.6094f, -7.0313f, 1.1719f, 14.4531f, 11.3281f, 37.1094f, + -66.0156f, -88.6719f, -165.2344f, -175.0000f, -189.4531f, -166.4063f, -142.1875f, -110.9375f, -92.9688f, -71.8750f, -89.0625f, -74.2188f, -56.6406f, 6.6406f, 25.3906f, 56.6406f, + -1.5625f, -46.8750f, -66.4063f, -130.0781f, -264.4531f, -305.4688f, -280.8594f, -152.7344f, -43.7500f, 90.6250f, 181.2500f, 153.1250f, 107.4219f, 83.9844f, 47.2656f, 54.2969f, + -36.7188f, -50.7813f, 176.9531f, 115.2344f, -17.5781f, -111.7188f, -173.4375f, -184.7656f, -202.7344f, -167.1875f, -104.6875f, -15.6250f, -4.6875f, 17.9688f, 15.2344f, 46.0938f, + -73.8281f, -95.7031f, 314.4531f, 318.3594f, 202.3438f, 114.4531f, 63.2813f, 42.9688f, -26.1719f, -61.7188f, -87.1094f, -46.8750f, -14.0625f, 5.8594f, 10.1563f, 23.4375f, + 8.9844f, 50.7813f, 41.7969f, 0.0000f, -12.1094f, -25.7813f, 12.8906f, 8.5938f, 39.4531f, -3.9063f, -12.5000f, -90.6250f, -109.7656f, -230.4688f, -262.5000f, -425.3906f, + 19.9219f, 41.4063f, 61.3281f, 51.5625f, 15.6250f, 4.2969f, -28.5156f, -25.7813f, -64.4531f, -114.8438f, -219.1406f, -300.7813f, -289.8438f, -191.0156f, -78.9063f, 1.5625f, + 9.7656f, 89.8438f, 111.7188f, 69.9219f, 29.2969f, 7.0313f, 5.8594f, 9.3750f, 42.5781f, 73.0469f, 121.0938f, 130.4688f, 128.1250f, 113.6719f, 92.5781f, 82.8125f, + -92.9688f, -192.1875f, -214.8438f, 219.9219f, 298.4375f, 238.2813f, 211.7188f, 166.7969f, 145.7031f, 101.9531f, 64.8438f, 66.7969f, 47.6563f, 13.2813f, -8.2031f, -35.9375f, + -140.2344f, -180.4688f, -3.9063f, 8.5938f, -16.4063f, -0.7813f, 30.4688f, 65.2344f, 60.1563f, 60.5469f, 28.9063f, 28.5156f, 25.7813f, 36.7188f, 34.7656f, 49.2188f, + -1.9531f, -42.9688f, -146.0938f, -213.2813f, -150.7813f, -53.1250f, 37.1094f, 119.1406f, 170.7031f, 222.6563f, 240.2344f, 217.9688f, 180.8594f, 130.8594f, 81.6406f, 58.9844f, + 8.9844f, 146.8750f, 114.0625f, 91.7969f, 189.4531f, 202.7344f, 256.6406f, 214.4531f, 186.7188f, 132.0313f, 72.6563f, 2.7344f, -10.9375f, -60.5469f, -37.1094f, -73.4375f, + 64.8438f, 54.2969f, -108.2031f, -279.6875f, -321.0938f, 91.4063f, 124.6094f, 127.3438f, 91.4063f, 14.0625f, -60.5469f, -123.8281f, -96.4844f, -31.2500f, 19.1406f, 45.7031f, + 168.3594f, 333.2031f, 291.0156f, 200.0000f, 126.9531f, 54.2969f, 32.4219f, -12.1094f, -9.7656f, -18.3594f, -6.6406f, -4.6875f, -9.3750f, -16.7969f, -1.9531f, 5.0781f +}; +/* An 16-by-32 matrix */ +const float GEWB2_MA1[512] = +{ + 257.4219f, 661.7188f, 638.2813f, 591.0156f, 509.7656f, 428.9063f, 364.4531f, 314.4531f, 286.3281f, 243.7500f, 205.0781f, 132.4219f, 93.3594f, 19.5313f, -13.6719f, -83.9844f, + 2.3438f, 25.3906f, 48.8281f, 21.4844f, -33.2031f, -49.2188f, -106.2500f, -123.4375f, -198.0469f, -228.9063f, -394.5313f, -499.2188f, -758.2031f, -746.0938f, -166.4063f, 30.4688f, + 109.7656f, 123.0469f, 92.1875f, -1.5625f, -39.8438f, -66.7969f, -90.6250f, -130.8594f, -141.4063f, -166.0156f, -190.6250f, -235.5469f, -261.3281f, -287.5000f, -253.1250f, -231.6406f, + 11.3281f, -98.0469f, -227.3438f, -340.2344f, -378.5156f, -350.3906f, -387.1094f, -420.7031f, -498.0469f, -578.1250f, -389.8438f, -153.5156f, -96.4844f, -3.5156f, 10.9375f, 105.8594f, + -23.4375f, -141.0156f, 156.6406f, 215.6250f, 92.1875f, 13.6719f, -76.5625f, -83.9844f, -193.7500f, -266.7969f, -355.8594f, -320.3125f, -225.0000f, -116.7969f, -93.7500f, -55.0781f, + 162.5000f, 224.2188f, 258.5938f, 136.7188f, 51.9531f, -62.5000f, -168.3594f, -305.0781f, -468.7500f, -645.3125f, -794.9219f, -426.5625f, -175.3906f, -75.0000f, -4.2969f, 102.7344f, + -80.4688f, -237.8906f, -363.6719f, 10.9375f, -89.4531f, -139.8438f, -212.1094f, -180.4688f, -147.2656f, -140.6250f, -131.2500f, -98.0469f, -41.0156f, 13.6719f, 10.1563f, 31.2500f, + 144.1406f, 490.6250f, 539.0625f, 613.6719f, 674.2188f, 674.6094f, 642.1875f, 594.1406f, 527.3438f, 451.5625f, 384.3750f, 292.1875f, 226.5625f, 154.2969f, 99.2188f, 42.1875f, + -57.4219f, -187.1094f, -128.9063f, -28.5156f, -106.2500f, -172.2656f, -267.5781f, -326.9531f, -444.9219f, -569.5313f, -535.1563f, -161.7188f, -81.2500f, -4.6875f, 5.4688f, 83.2031f, + -19.5313f, 39.0625f, -32.0313f, -98.8281f, -2.7344f, 46.4844f, 114.8438f, 153.1250f, 192.9688f, 225.7813f, 230.0781f, 204.2969f, 180.4688f, 149.6094f, 117.1875f, 97.2656f, + -36.7188f, -141.4063f, -224.6094f, -300.7813f, -385.5469f, -390.2344f, -360.1563f, -272.2656f, -227.3438f, -119.1406f, -52.7344f, -12.1094f, -3.1250f, 8.9844f, -12.8906f, 24.2188f, + 11.3281f, -25.0000f, -1.5625f, -48.0469f, -134.3750f, -161.7188f, -265.2344f, -299.6094f, -450.0000f, -547.2656f, -822.2656f, -744.1406f, -227.3438f, -117.1875f, -25.0000f, 87.1094f, + 167.1875f, 386.7188f, 398.0469f, 316.0156f, 266.0156f, 183.5938f, 142.9688f, 69.9219f, 49.2188f, -10.1563f, -55.0781f, -141.7969f, -165.2344f, -209.3750f, -170.7031f, -212.8906f, + -51.9531f, -139.4531f, 142.1875f, 94.1406f, -15.2344f, -88.6719f, -130.4688f, -119.1406f, -166.4063f, -114.0625f, -39.8438f, 33.9844f, 62.1094f, 71.0938f, 62.5000f, 74.2188f, + 218.7500f, 298.4375f, 207.4219f, 60.9375f, 8.5938f, -7.0313f, 8.9844f, -7.8125f, 7.4219f, 0.0000f, 5.0781f, -23.8281f, -13.6719f, -17.1875f, -4.6875f, -18.7500f, + 12.8906f, -91.7969f, -247.6563f, -426.9531f, 53.1250f, -12.1094f, -26.5625f, -111.3281f, -206.6406f, -208.9844f, -180.4688f, -97.2656f, -37.1094f, -20.7031f, -45.3125f, -23.8281f, + -73.4375f, -245.3125f, -349.2188f, 274.2188f, 273.4375f, 145.7031f, 76.5625f, 19.9219f, 37.1094f, -21.8750f, -74.6094f, -70.7031f, -67.5781f, -51.5625f, -45.3125f, -85.1563f, + 14.4531f, -73.4375f, -258.2031f, -424.6094f, -516.4063f, -100.7813f, -72.6563f, -70.7031f, -92.9688f, -145.3125f, -163.2813f, -198.4375f, -169.1406f, -76.9531f, -28.5156f, 10.9375f, + -90.2344f, -86.7188f, 355.8594f, 341.7969f, 261.3281f, 171.8750f, 141.7969f, 117.5781f, 100.3906f, 75.0000f, 57.4219f, 26.5625f, 30.0781f, 16.7969f, 22.2656f, 6.6406f, + -1.5625f, -73.0469f, -139.0625f, -160.1563f, -222.2656f, -194.9219f, -228.1250f, -221.8750f, -257.8125f, -274.6094f, -376.9531f, -469.1406f, -601.5625f, -276.5625f, -98.4375f, 33.9844f, + 85.9375f, 25.0000f, -26.1719f, -139.4531f, -223.4375f, -290.6250f, -356.6406f, -459.3750f, -562.1094f, -739.8438f, -840.6250f, -297.6563f, -163.6719f, -57.0313f, -3.9063f, 109.7656f, + -98.8281f, -244.9219f, -419.9219f, -471.0938f, -281.6406f, -155.4688f, -131.6406f, -73.4375f, -46.0938f, 19.5313f, 48.8281f, 77.3438f, 78.1250f, 74.2188f, 37.5000f, 64.0625f, + -135.9375f, -289.4531f, -333.5938f, -139.4531f, -63.6719f, -40.2344f, -10.1563f, 55.8594f, 90.2344f, 124.2188f, 130.8594f, 126.9531f, 107.0313f, 91.0156f, 65.2344f, 74.2188f, + -55.8594f, -100.0000f, -74.6094f, -109.3750f, -97.6563f, -74.6094f, -32.0313f, 14.4531f, 49.2188f, 39.8438f, 26.1719f, -50.7813f, -78.9063f, -167.9688f, -193.3594f, -316.4063f, + 90.6250f, 41.7969f, -8.5938f, -133.2031f, -194.1406f, -204.2969f, -237.1094f, -252.3438f, -291.4063f, -269.5313f, -186.7188f, -115.2344f, -62.5000f, -30.0781f, -20.7031f, -2.7344f, + -12.8906f, -38.2813f, -100.7813f, -195.7031f, -230.0781f, -171.0938f, -123.4375f, -65.6250f, -22.6563f, 32.0313f, 68.3594f, 85.5469f, 97.2656f, 101.1719f, 92.5781f, 88.2813f, + -153.5156f, -259.7656f, -7.4219f, 72.2656f, 97.2656f, 103.9063f, 147.6563f, 182.8125f, 194.9219f, 198.4375f, 181.2500f, 151.5625f, 121.0938f, 92.9688f, 72.6563f, 56.6406f, + -93.7500f, -38.6719f, 159.3750f, 187.5000f, 270.7031f, 297.2656f, 369.5313f, 368.3594f, 371.4844f, 348.8281f, 305.4688f, 239.4531f, 188.2813f, 137.1094f, 101.5625f, 63.6719f, + -8.9844f, 204.2969f, 345.7031f, 352.7344f, 457.8125f, 502.7344f, 578.9063f, 582.4219f, 576.5625f, 547.6563f, 484.3750f, 392.5781f, 307.4219f, 235.9375f, 169.1406f, 114.0625f, + 102.3438f, 385.9375f, 353.1250f, 285.9375f, 286.7188f, 259.7656f, 279.2969f, 256.2500f, 262.8906f, 240.2344f, 211.3281f, 145.3125f, 110.9375f, 54.2969f, 26.5625f, -32.8125f, + -46.4844f, 174.2188f, 436.7188f, 474.6094f, 535.9375f, 500.0000f, 471.8750f, 386.3281f, 344.1406f, 263.6719f, 217.5781f, 124.6094f, 88.6719f, 8.9844f, -15.2344f, -100.0000f, + -39.8438f, 69.5313f, 148.0469f, 98.4375f, 142.5781f, 124.6094f, 177.7344f, 147.2656f, 161.3281f, 108.5938f, 87.8906f, -14.0625f, -26.1719f, -137.1094f, -146.4844f, -301.5625f +}; +/* An 16-by-16 matrix */ +const float AUNB_SN1[256] = +{ + -70.3125f, -30.8594f, -19.9219f, 15.2344f, 25.7813f, 38.6719f, 18.7500f, 42.1875f, 21.8750f, 49.6094f, 13.2813f, 17.9688f, -183.5938f, -330.0781f, -55.0781f, -35.1563f, + -82.8125f, 32.0313f, 110.9375f, 164.8438f, 162.5000f, 162.5000f, 122.2656f, 112.8906f, 91.0156f, 82.0313f, 42.1875f, 21.4844f, -171.4844f, -516.7969f, -131.2500f, -48.0469f, + -3.5156f, 158.2031f, 207.8125f, 257.4219f, 277.3438f, 311.7188f, 329.6875f, 379.2969f, 418.7500f, 461.3281f, 571.8750f, 747.2656f, 792.1875f, 481.2500f, 214.4531f, 103.5156f, + 29.2969f, 19.1406f, 128.9063f, 192.5781f, 175.0000f, 128.5156f, 79.6875f, 26.1719f, -7.0313f, -52.3438f, -91.7969f, -156.2500f, -236.3281f, -11.7188f, -26.1719f, -14.0625f, + -3.5156f, -2.7344f, -37.1094f, -86.7188f, -125.7813f, -164.4531f, -125.3906f, -91.0156f, -42.9688f, -33.5938f, 26.1719f, -7.4219f, 1.1719f, 134.7656f, 16.0156f, 11.7188f, + 59.7656f, 13.2813f, -67.1875f, -150.7813f, -195.3125f, -214.0625f, -196.4844f, -164.0625f, -123.8281f, -80.8594f, -44.5313f, 71.4844f, 428.1250f, 258.2031f, 77.3438f, 36.7188f, + 240.6250f, 195.7031f, 183.9844f, 85.9375f, 61.3281f, 21.4844f, 1.5625f, -62.8906f, -69.5313f, -122.6563f, -104.2969f, -151.9531f, 84.3750f, 167.5781f, 17.9688f, 14.8438f, + -218.3594f, -333.5938f, -308.2031f, -144.1406f, -59.7656f, 25.0000f, 57.0313f, 115.6250f, 151.5625f, 203.1250f, 224.2188f, 374.2188f, 578.5156f, 350.7813f, 132.8125f, 64.0625f, + 51.1719f, 53.5156f, 45.3125f, 22.2656f, 25.0000f, -8.2031f, -14.8438f, -43.7500f, -48.0469f, -77.7344f, -83.5938f, -148.0469f, -250.3906f, 32.4219f, -20.7031f, -8.2031f, + -39.4531f, -126.5625f, -253.1250f, -312.8906f, -326.1719f, -287.8906f, -195.7031f, -115.6250f, -33.5938f, 56.2500f, 156.2500f, 400.3906f, 586.3281f, 336.3281f, 125.7813f, 58.9844f, + -90.2344f, -155.0781f, -200.0000f, -197.6563f, -120.3125f, -78.1250f, -49.6094f, -35.5469f, -7.0313f, 6.6406f, 36.7188f, 44.5313f, 311.7188f, 244.1406f, 62.8906f, 34.3750f, + -202.3438f, -241.0156f, -78.5156f, 40.2344f, 100.7813f, 108.9844f, 106.6406f, 104.2969f, 109.7656f, 98.0469f, 83.5938f, 44.5313f, 22.6563f, 105.4688f, 27.3438f, 12.1094f, + 6.6406f, -33.5938f, -30.4688f, -32.0313f, -8.5938f, -28.5156f, -66.7969f, -116.7969f, -130.4688f, -168.3594f, -164.8438f, -205.4688f, 201.9531f, 199.6094f, 27.7344f, 20.7031f, + 107.8125f, 71.0938f, -15.6250f, -131.2500f, -180.0781f, -36.3281f, 133.5938f, 104.2969f, 64.8438f, 7.0313f, -16.7969f, -76.5625f, -57.0313f, 92.1875f, 7.0313f, 5.4688f, + 88.6719f, 132.0313f, 87.5000f, 73.4375f, 41.7969f, 31.2500f, 22.2656f, 35.9375f, 13.2813f, 31.2500f, -1.9531f, -1.5625f, -201.1719f, -362.1094f, -67.9688f, -39.0625f, + 285.5469f, 290.6250f, 311.3281f, 263.6719f, 230.4688f, 171.0938f, 128.1250f, 83.9844f, 56.2500f, 9.3750f, -37.5000f, -93.3594f, -189.8438f, -68.3594f, -25.3906f, -16.0156f +}; +/* An 16-by-16 matrix */ +const float AUWB_SN1[256] = +{ + 128.1250f, 53.5156f, 139.8438f, 128.9063f, 71.8750f, 56.6406f, -23.4375f, -114.8438f, -216.7969f, -306.2500f, -369.1406f, -340.6250f, -234.7656f, -131.6406f, -60.5469f, -12.8906f, + 12.5000f, -82.8125f, -190.6250f, -254.2969f, -293.7500f, -342.5781f, -348.4375f, -346.0938f, -333.2031f, -310.5469f, -275.3906f, -214.4531f, -128.9063f, -87.5000f, -49.6094f, -3.5156f, + 145.3125f, 127.7344f, 76.9531f, 12.8906f, 5.0781f, -21.4844f, -33.9844f, -48.4375f, -48.8281f, -57.8125f, -56.2500f, -65.6250f, -68.3594f, -71.8750f, -49.6094f, -48.8281f, + 293.7500f, 283.9844f, 243.3594f, 202.7344f, 175.3906f, 136.7188f, 120.7031f, 112.8906f, 106.2500f, 98.4375f, 72.2656f, 48.4375f, 46.0938f, 13.6719f, 8.5938f, -7.8125f, + 5.4688f, 56.2500f, 115.6250f, 168.7500f, 162.5000f, 126.9531f, 69.1406f, 64.8438f, 58.9844f, 48.0469f, 42.5781f, 40.6250f, 18.3594f, -8.5938f, -17.5781f, -19.1406f, + 121.0938f, 43.7500f, -55.0781f, -206.6406f, -255.4688f, -20.7031f, 63.2813f, -12.8906f, -116.0156f, -215.2344f, -301.5625f, -319.1406f, -210.9375f, -112.1094f, -37.1094f, -2.7344f, + -61.7188f, 94.1406f, 173.0469f, 212.1094f, 218.3594f, 226.1719f, 221.0938f, 236.7188f, 238.2813f, 242.9688f, 235.1563f, 225.7813f, 189.4531f, 129.2969f, 76.9531f, 40.6250f, + -183.9844f, -207.0313f, 14.4531f, 106.2500f, 155.0781f, 172.6563f, 182.0313f, 204.2969f, 219.1406f, 231.2500f, 237.5000f, 225.0000f, 189.4531f, 135.9375f, 86.7188f, 51.9531f, + 63.2813f, 0.0000f, -33.9844f, -33.2031f, -58.9844f, -129.2969f, -160.1563f, -235.5469f, -299.6094f, -402.3438f, -526.5625f, -707.8125f, -677.7344f, -264.8438f, -110.9375f, -2.3438f, + -60.9375f, 14.0625f, 5.8594f, 10.1563f, 16.0156f, 46.0938f, 78.5156f, 103.5156f, 132.4219f, 149.2188f, 164.0625f, 169.9219f, 147.2656f, 103.1250f, 62.1094f, 32.8125f, + -26.9531f, -107.0313f, -160.5469f, -61.7188f, 23.4375f, -21.8750f, -74.2188f, -119.1406f, -144.9219f, -151.9531f, -160.5469f, -158.9844f, -132.0313f, -107.8125f, -67.5781f, -38.6719f, + 0.0000f, -10.1563f, -76.5625f, -148.0469f, -144.1406f, -127.7344f, -75.3906f, -57.8125f, -30.0781f, -3.9063f, 24.6094f, 38.2813f, 38.2813f, 19.1406f, 15.6250f, -1.9531f, + -58.2031f, -168.7500f, -284.7656f, -360.5469f, -362.1094f, -299.2188f, -221.8750f, -177.7344f, -130.0781f, -85.5469f, -47.6563f, -11.3281f, 4.2969f, 3.5156f, 7.8125f, 21.0938f, + 69.1406f, 25.0000f, -23.4375f, -90.6250f, -160.5469f, -215.6250f, -217.5781f, -214.8438f, -198.8281f, -181.2500f, -148.4375f, -129.2969f, -116.0156f, -112.5000f, -83.9844f, -66.4063f, + -6.2500f, 171.4844f, 379.2969f, 431.2500f, 472.2656f, 516.7969f, 523.0469f, 536.7188f, 514.4531f, 477.7344f, 432.4219f, 383.9844f, 305.0781f, 208.9844f, 123.0469f, 58.9844f, + -168.7500f, -283.9844f, -267.9688f, -132.8125f, -60.9375f, -15.6250f, 7.0313f, 39.8438f, 66.0156f, 100.3906f, 119.5313f, 130.8594f, 115.6250f, 83.2031f, 53.5156f, 37.8906f +}; +/* An 16-by-16 matrix */ +const float AUWB2_SN1[256] = +{ + -41.7969f, -174.2188f, -326.1719f, -406.6406f, -450.0000f, -453.5156f, -447.6563f, -378.5156f, -323.4375f, -208.2031f, -98.0469f, -94.5313f, -54.2969f, 67.1875f, 37.1094f, 182.0313f, + 410.9375f, 393.7500f, 410.9375f, 341.7969f, 337.5000f, 292.1875f, 305.8594f, 269.5313f, 294.5313f, 279.2969f, 268.7500f, 133.5938f, 76.1719f, -12.5000f, -98.0469f, -198.8281f, + -121.4844f, -66.4063f, 142.9688f, 246.8750f, 292.1875f, 337.1094f, 383.9844f, 407.0313f, 436.7188f, 464.0625f, 442.5781f, 349.6094f, 284.3750f, 242.5781f, 179.6875f, 163.2813f, + 237.5000f, 205.0781f, 125.7813f, 11.7188f, -92.5781f, -188.6719f, -336.7188f, -460.1563f, -644.9219f, -853.1250f, -1082.0313f, -526.9531f, -167.9688f, -10.9375f, 50.0000f, 219.5313f, + 115.6250f, 66.7969f, -75.0000f, -167.5781f, -190.6250f, -183.5938f, -192.1875f, -184.7656f, -175.0000f, -137.5000f, -94.5313f, -120.7031f, -131.6406f, -82.0313f, -103.5156f, -71.0938f, + 324.6094f, 274.6094f, 178.1250f, 84.7656f, 64.4531f, 25.3906f, 6.6406f, -20.7031f, -26.1719f, -30.4688f, -14.8438f, -86.7188f, -132.8125f, -128.5156f, -136.3281f, -152.7344f, + 63.2813f, -5.0781f, -61.7188f, -130.8594f, -205.4688f, -275.3906f, -385.1563f, -486.3281f, -640.6250f, -839.4531f, -1075.7813f, -525.0000f, -145.3125f, -4.6875f, 52.3438f, 220.3125f, + -30.8594f, -151.9531f, -222.2656f, -273.0469f, -316.7969f, -367.1875f, -413.2813f, -507.4219f, -599.2188f, -811.3281f, -762.8906f, -198.0469f, -84.3750f, 55.8594f, 74.6094f, 237.1094f, + -41.4063f, -45.3125f, -82.0313f, -87.8906f, -126.1719f, -128.9063f, -192.9688f, -191.7969f, -273.4375f, -295.7031f, -412.8906f, -556.2500f, -867.9688f, -589.4531f, -101.1719f, 135.9375f, + -142.9688f, -292.1875f, -459.7656f, -475.0000f, -397.2656f, -272.6563f, -173.4375f, -60.1563f, 3.9063f, 111.3281f, 141.0156f, 110.9375f, 99.6094f, 140.2344f, 73.0469f, 142.5781f, + 30.0781f, 174.6094f, 163.2813f, 185.5469f, 176.9531f, 179.2969f, 185.5469f, 201.1719f, 219.5313f, 253.1250f, 257.0313f, 176.5625f, 143.3594f, 130.4688f, 95.3125f, 79.6875f, + 3.9063f, 76.9531f, 66.4063f, 64.8438f, 56.2500f, 23.4375f, 20.3125f, -0.7813f, -7.8125f, -15.6250f, 7.0313f, -92.9688f, -108.9844f, -169.5313f, -176.1719f, -315.2344f, + -179.6875f, -278.5156f, -213.6719f, -59.7656f, 25.0000f, 94.9219f, 150.7813f, 192.1875f, 242.1875f, 293.7500f, 296.4844f, 209.3750f, 173.8281f, 126.5625f, 58.9844f, -12.5000f, + -96.0938f, -154.6875f, -161.3281f, -144.9219f, -138.2813f, -123.8281f, -119.9219f, -89.0625f, -76.1719f, -39.4531f, -14.0625f, -67.9688f, -76.9531f, -63.2813f, -101.9531f, -136.3281f, + -128.5156f, -93.7500f, 127.3438f, 180.4688f, 167.1875f, 134.3750f, 158.2031f, 146.0938f, 171.4844f, 169.5313f, 182.4219f, 49.6094f, 33.2031f, -60.1563f, -96.8750f, -266.7969f, + -4.6875f, 5.8594f, -86.7188f, -88.6719f, -12.1094f, 48.4375f, 78.1250f, 114.8438f, 139.4531f, 211.3281f, 237.1094f, 179.2969f, 146.8750f, 137.5000f, 110.1563f, 110.5469f +}; +/* An 16-by-16 matrix */ +const float CNG_SN1[256] = +{ + 234.3750f, 640.6250f, 1187.1094f, 1662.8906f, 2153.1250f, 2632.8125f, 3120.7031f, 3581.6406f, 4059.7656f, 4535.9375f, 5031.2500f, 5507.8125f, 6007.0313f, 6466.4063f, 6959.3750f, 7389.8438f, + 464.0625f, 971.4844f, 1463.2813f, 1915.2344f, 2383.9844f, 2836.3281f, 3295.7031f, 3744.9219f, 4209.3750f, 4669.5313f, 5145.3125f, 5607.4219f, 6079.6875f, 6528.1250f, 6997.2656f, 7426.5625f, + 135.1563f, 312.1094f, 882.4219f, 1388.6719f, 1904.6875f, 2412.1094f, 2935.9375f, 3438.6719f, 3934.7656f, 4423.0469f, 4933.9844f, 5444.5313f, 5969.5313f, 6466.0156f, 6959.7656f, 7437.1094f, + 171.4844f, 631.2500f, 1346.0938f, 1852.7344f, 2372.2656f, 2846.8750f, 3341.0156f, 3799.2188f, 4276.1719f, 4728.9063f, 5200.0000f, 5653.9063f, 6113.2813f, 6551.9531f, 6989.8438f, 7412.8906f, + 359.7656f, 703.1250f, 1162.5000f, 1565.2344f, 1994.1406f, 2397.2656f, 2803.9063f, 3183.5938f, 3537.8906f, 3872.6563f, 4300.3906f, 4900.3906f, 5340.2344f, 6055.4688f, 6807.8125f, 7393.3594f, + 350.0000f, 741.7969f, 1185.5469f, 1612.5000f, 2070.7031f, 2511.3281f, 2970.3125f, 3405.8594f, 3861.7188f, 4319.9219f, 4850.3906f, 5320.7031f, 5844.5313f, 6302.7344f, 6826.1719f, 7210.9375f, + 282.0313f, 588.6719f, 991.0156f, 1342.5781f, 1690.6250f, 2027.3438f, 2350.7813f, 2672.2656f, 2963.6719f, 3258.9844f, 3486.3281f, 3715.2344f, 3874.6094f, 4326.1719f, 5317.5781f, 5867.5781f, + 123.0469f, 239.0625f, 652.7344f, 1136.7188f, 1558.5938f, 1985.5469f, 2390.6250f, 2800.7813f, 3198.4375f, 3583.2031f, 3964.0625f, 4369.5313f, 4785.1563f, 5180.4688f, 5582.0313f, 5970.3125f, + 345.7031f, 753.1250f, 1175.7813f, 1551.9531f, 1934.3750f, 2304.6875f, 2675.0000f, 3034.7656f, 3398.8281f, 3753.5156f, 4133.2031f, 4507.8125f, 4885.9375f, 5253.9063f, 5629.6875f, 5995.7031f, + 132.0313f, 398.4375f, 1037.8906f, 1459.3750f, 1890.2344f, 2262.1094f, 2658.5938f, 3031.2500f, 3413.2813f, 3773.0469f, 4151.1719f, 4518.3594f, 4896.0938f, 5260.9375f, 5631.2500f, 5989.8438f, + 439.8438f, 767.1875f, 1171.4844f, 1505.8594f, 1860.9375f, 2190.6250f, 2532.0313f, 2846.0938f, 3167.5781f, 3448.0469f, 3738.2813f, 4159.7656f, 4687.1094f, 5126.9531f, 5555.8594f, 5957.8125f, + 150.3906f, 318.3594f, 781.2500f, 1148.0469f, 1525.7813f, 1905.8594f, 2262.8906f, 2630.4688f, 2992.5781f, 3330.4688f, 3636.3281f, 3963.2813f, 4530.0781f, 5060.5469f, 5510.1563f, 5953.5156f, + 247.2656f, 564.4531f, 937.5000f, 1286.3281f, 1654.2969f, 2019.9219f, 2399.6094f, 2767.1875f, 3147.2656f, 3507.8125f, 3876.5625f, 4267.1875f, 4682.4219f, 5077.3438f, 5475.0000f, 5882.0313f, + 228.1250f, 487.5000f, 878.9063f, 1223.0469f, 1582.0313f, 1921.8750f, 2269.9219f, 2598.4375f, 2918.3594f, 3220.3125f, 3481.6406f, 3703.1250f, 3979.6875f, 4775.3906f, 5418.3594f, 5907.4219f, + 451.9531f, 710.9375f, 1072.2656f, 1369.1406f, 1700.7813f, 1991.0156f, 2317.1875f, 2596.8750f, 2893.7500f, 3138.2813f, 3373.0469f, 3548.0469f, 3897.2656f, 4776.5625f, 5398.0469f, 5901.5625f, + 223.4375f, 547.2656f, 982.0313f, 1367.5781f, 1758.9844f, 2134.7656f, 2526.9531f, 2904.2969f, 3287.5000f, 3643.7500f, 4025.7813f, 4417.5781f, 4815.6250f, 5196.4844f, 5588.2813f, 5961.3281f +}; +/* An 16-by-32 matrix */ +const float IAA_MA1[512] = +{ + -68.3594f, -191.4063f, -203.1250f, -246.4844f, -251.9531f, -239.8438f, -238.2813f, -214.0625f, -196.4844f, -168.7500f, -137.8906f, -117.5781f, -92.9688f, -55.0781f, -26.1719f, 10.1563f, + 117.5781f, 158.9844f, 88.6719f, 37.5000f, -4.6875f, -7.0313f, -5.0781f, 0.7813f, 15.2344f, 41.7969f, 48.4375f, 35.9375f, 32.4219f, 39.0625f, 24.2188f, 28.1250f, + -109.3750f, -287.8906f, -222.2656f, -64.0625f, -3.5156f, 39.0625f, 55.0781f, 82.4219f, 98.4375f, 109.7656f, 107.0313f, 84.7656f, 80.4688f, 85.5469f, 45.7031f, 41.4063f, + -103.9063f, -294.1406f, -328.5156f, -229.2969f, -190.2344f, -134.7656f, -102.7344f, -65.2344f, -44.5313f, -11.7188f, 3.1250f, 12.5000f, 13.2813f, 23.8281f, 21.4844f, 40.6250f, + -35.5469f, -53.5156f, -114.4531f, -136.3281f, -137.5000f, -127.3438f, -104.6875f, -96.4844f, -69.5313f, -50.3906f, -21.8750f, -37.5000f, -4.2969f, 85.5469f, 19.1406f, 21.8750f, + -7.0313f, 0.3906f, -12.8906f, -5.4688f, -7.4219f, -1.9531f, -8.5938f, -5.4688f, -16.7969f, -14.4531f, -40.6250f, -55.8594f, -146.4844f, -300.7813f, -74.2188f, -39.0625f, + 28.1250f, -8.5938f, -47.2656f, -85.9375f, -125.0000f, -147.6563f, -195.3125f, -229.2969f, -284.7656f, -310.5469f, -412.5000f, -509.7656f, -660.5469f, -425.7813f, -176.5625f, -23.4375f, + 7.4219f, -108.9844f, -176.9531f, -226.5625f, -229.6875f, -288.6719f, -335.1563f, -407.8125f, -500.3906f, -630.4688f, -359.7656f, -146.8750f, -106.6406f, -32.8125f, -0.7813f, 73.0469f, + 333.2031f, 296.4844f, 230.8594f, 146.8750f, 101.5625f, 47.6563f, 15.2344f, -27.7344f, -51.9531f, -71.8750f, -81.6406f, -116.0156f, -116.7969f, -66.7969f, -48.4375f, -32.4219f, + 103.9063f, 13.2813f, -71.0938f, -143.3594f, -201.5625f, -267.9688f, -344.1406f, -437.8906f, -552.3438f, -716.4063f, -824.2188f, -389.4531f, -202.7344f, -107.0313f, -42.5781f, 53.5156f, + -0.7813f, -3.1250f, 16.4063f, 35.5469f, 67.1875f, 82.4219f, 116.4063f, 131.2500f, 169.1406f, 159.7656f, 213.2813f, 407.4219f, 585.5469f, 405.4688f, 160.1563f, 73.8281f, + 33.5938f, 99.2188f, 101.1719f, 99.2188f, 96.0938f, 85.5469f, 71.8750f, 47.6563f, 30.8594f, 4.2969f, -21.4844f, -66.4063f, -141.7969f, -364.8438f, -144.9219f, -73.4375f, + 65.6250f, 65.2344f, -47.6563f, -95.3125f, -126.9531f, -132.8125f, -140.2344f, -133.9844f, -129.2969f, -113.6719f, -108.5938f, -105.4688f, -106.2500f, -63.2813f, -39.4531f, -17.9688f, + -95.3125f, -179.2969f, -143.3594f, -132.8125f, -115.2344f, -85.9375f, -67.5781f, -41.7969f, -8.5938f, 20.7031f, 40.2344f, 114.4531f, 423.4375f, 315.2344f, 101.5625f, 45.7031f, + -124.6094f, -253.9063f, -267.5781f, -166.7969f, -113.2813f, -41.0156f, 9.7656f, 62.8906f, 118.3594f, 163.2813f, 229.2969f, 419.5313f, 610.5469f, 423.8281f, 156.2500f, 66.4063f, + 57.0313f, 100.3906f, 110.1563f, 115.2344f, 118.3594f, 114.8438f, 116.0156f, 102.3438f, 92.5781f, 75.3906f, 35.9375f, 133.2031f, 476.5625f, 345.3125f, 123.0469f, 56.2500f, + -113.6719f, -217.9688f, 57.4219f, 78.5156f, 110.1563f, 109.3750f, 121.0938f, 117.9688f, 122.2656f, 119.5313f, 114.0625f, 93.3594f, 77.3438f, 73.4375f, 41.4063f, 36.7188f, + -4.2969f, -3.1250f, -60.9375f, -79.6875f, -90.2344f, -97.6563f, -103.5156f, -112.8906f, -105.0781f, -123.4375f, -125.7813f, -175.7813f, -190.6250f, -264.0625f, -303.9063f, -380.0781f, + -45.7031f, -10.5469f, 1.5625f, 37.5000f, 67.9688f, 89.4531f, 105.8594f, 121.0938f, 134.3750f, 141.4063f, 134.3750f, 106.6406f, 81.6406f, 70.3125f, 42.5781f, 41.4063f, + -101.5625f, -113.2813f, 58.9844f, 105.0781f, 158.5938f, 172.6563f, 215.2344f, 230.4688f, 265.2344f, 266.0156f, 351.5625f, 505.0781f, 637.1094f, 442.1875f, 186.3281f, 86.3281f, + -14.4531f, 146.0938f, 153.9063f, 161.7188f, 163.6719f, 154.2969f, 134.7656f, 122.2656f, 110.1563f, 99.6094f, 82.4219f, 49.2188f, 32.8125f, 19.9219f, -3.9063f, -20.7031f, + 157.8125f, 127.7344f, 67.9688f, 10.9375f, -48.4375f, -113.2813f, -191.4063f, -271.4844f, -394.9219f, -433.9844f, -206.6406f, -112.5000f, -71.4844f, -26.9531f, -2.7344f, 55.4688f, + 219.9219f, 293.7500f, 228.5156f, 216.7969f, 200.0000f, 186.7188f, 165.6250f, 154.6875f, 146.8750f, 133.9844f, 117.1875f, 75.7813f, 75.3906f, 63.2813f, 30.4688f, 17.9688f, + -23.0469f, -51.1719f, -13.6719f, 19.1406f, 21.0938f, -4.6875f, -35.9375f, -72.2656f, -94.9219f, -112.8906f, -112.5000f, -134.3750f, -127.3438f, 0.0000f, -14.8438f, 2.3438f, + 193.7500f, 227.3438f, 220.3125f, 200.7813f, 203.5156f, 191.4063f, 189.8438f, 170.3125f, 168.7500f, 125.0000f, 178.1250f, 414.0625f, 594.9219f, 413.2813f, 163.6719f, 75.7813f, + 67.9688f, 30.0781f, 7.0313f, -34.7656f, -43.7500f, -76.5625f, -64.4531f, -96.4844f, -86.7188f, -127.3438f, -129.6875f, -192.9688f, 194.9219f, 241.0156f, 47.2656f, 23.4375f, + 123.0469f, 116.7969f, 89.4531f, 53.5156f, 30.4688f, -1.1719f, -15.6250f, -53.9063f, -77.3438f, -119.9219f, -146.4844f, -196.0938f, -201.1719f, -9.7656f, -34.3750f, -19.1406f, + -90.6250f, -11.3281f, 137.8906f, 155.8594f, 189.4531f, 190.2344f, 204.2969f, 205.4688f, 217.1875f, 218.3594f, 203.1250f, 162.1094f, 128.1250f, 110.5469f, 73.0469f, 64.8438f, + 71.0938f, 150.3906f, 157.4219f, 176.9531f, 201.1719f, 223.4375f, 248.0469f, 269.9219f, 307.4219f, 332.8125f, 450.7813f, 579.2969f, 694.9219f, 480.8594f, 204.6875f, 96.0938f, + -106.6406f, -192.1875f, -72.2656f, -37.8906f, -20.3125f, -19.9219f, -6.6406f, -10.5469f, 5.0781f, 7.8125f, 17.5781f, -7.8125f, 20.3125f, 95.3125f, 22.6563f, 21.8750f, + 7.8125f, -1.1719f, -94.1406f, -104.2969f, -75.7813f, -33.5938f, 1.5625f, 29.2969f, 54.6875f, 74.6094f, 78.1250f, 60.1563f, 53.5156f, 57.0313f, 33.2031f, 30.0781f, + 35.9375f, 245.3125f, 238.6719f, 276.5625f, 275.7813f, 279.6875f, 262.5000f, 271.0938f, 255.8594f, 241.7969f, 214.8438f, 168.7500f, 138.2813f, 110.9375f, 79.6875f, 67.1875f +}; +/* An 16-by-8 matrix */ +const float GESVNB_AR1[128] = +{ + -9.7656f, -25.0000f, -54.6875f, -46.0938f, 105.4688f, 93.7500f, 49.6094f, 27.3438f, 7.8125f, -15.6250f, -21.8750f, -43.3594f, -32.0313f, 25.0000f, 0.7813f, 1.9531f, + 31.6406f, 40.6250f, 27.7344f, 27.3438f, 0.0000f, -19.1406f, -21.0938f, -28.5156f, -23.0469f, -35.9375f, -39.8438f, -78.5156f, -157.8125f, -20.3125f, -15.6250f, -5.8594f, + -43.7500f, -84.7656f, -98.0469f, -78.9063f, -13.2813f, 22.2656f, 22.6563f, 24.2188f, 30.8594f, 49.6094f, 69.1406f, 119.5313f, 204.6875f, 123.0469f, 43.7500f, 20.7031f, + 6.6406f, -2.3438f, 13.2813f, 25.7813f, 5.4688f, -10.1563f, -67.9688f, -76.5625f, -55.4688f, -51.1719f, -39.8438f, -37.8906f, 70.3125f, 60.1563f, 11.3281f, 6.6406f, + 1.9531f, -10.5469f, -41.7969f, -76.9531f, -133.9844f, -130.0781f, -71.0938f, -55.8594f, -35.5469f, -6.6406f, 16.7969f, 46.8750f, 149.6094f, 104.2969f, 32.4219f, 15.6250f, + -0.3906f, -5.8594f, -13.6719f, -21.8750f, -66.0156f, -56.6406f, 33.5938f, 39.4531f, 30.0781f, 18.7500f, 11.3281f, 30.4688f, -3.5156f, 26.5625f, 5.8594f, 3.5156f, + 1.1719f, 3.5156f, 125.0000f, 175.7813f, 150.3906f, 135.9375f, 83.9844f, 60.5469f, 41.0156f, 17.5781f, -5.0781f, -29.2969f, -106.2500f, -50.3906f, -20.3125f, -8.9844f, + 1.5625f, 19.1406f, 21.0938f, 35.1563f, 35.9375f, 39.4531f, 23.0469f, 26.9531f, 7.8125f, 27.3438f, 8.9844f, 16.7969f, -109.3750f, -243.7500f, -44.5313f, -21.4844f +}; +/* An 16-by-8 matrix */ +const float GESVNB_AR2[128] = +{ + -8.5938f, -13.6719f, -12.1094f, -64.8438f, -64.0625f, 84.7656f, 82.8125f, 60.5469f, 64.8438f, 48.0469f, 26.1719f, 12.8906f, -8.2031f, -16.0156f, -1.1719f, -0.3906f, + -5.4688f, -7.8125f, -6.2500f, -27.3438f, -30.0781f, -20.7031f, 8.9844f, -2.7344f, -38.2813f, -48.0469f, -38.6719f, -19.1406f, 139.4531f, 44.5313f, 14.0625f, 7.4219f, + -22.2656f, -46.4844f, -118.3594f, -83.9844f, -12.8906f, -40.2344f, -37.8906f, -45.7031f, -41.0156f, -39.8438f, -26.1719f, -52.3438f, -68.7500f, 44.1406f, 6.2500f, 3.1250f, + -4.6875f, 5.4688f, 11.7188f, -14.4531f, -43.7500f, -88.2813f, -80.4688f, -9.7656f, 48.8281f, 52.3438f, 38.6719f, 32.4219f, 21.4844f, -1.5625f, 3.5156f, 1.5625f, + -7.4219f, 8.9844f, 66.7969f, 22.2656f, 5.0781f, -5.8594f, -10.1563f, -16.4063f, -25.3906f, -26.9531f, -30.0781f, -66.0156f, -137.1094f, -41.0156f, -19.1406f, -8.2031f, + -5.4688f, -3.9063f, 3.1250f, 13.6719f, 62.8906f, 40.6250f, -28.9063f, -39.8438f, -52.7344f, -18.3594f, 17.5781f, 103.1250f, 20.3125f, -26.9531f, -0.3906f, -1.9531f, + 83.2031f, 110.9375f, 89.8438f, 47.2656f, 19.5313f, 4.6875f, 16.7969f, 18.7500f, 10.5469f, -2.7344f, -9.3750f, -15.2344f, 29.2969f, 0.3906f, -3.5156f, -1.1719f, + -29.2969f, -53.5156f, -34.7656f, 107.4219f, 64.0625f, 25.3906f, 48.8281f, 35.5469f, 33.5938f, 35.5469f, 21.8750f, 3.9063f, 3.5156f, -3.9063f, 0.0000f, 0.0000f +}; +/* An 16-by-8 matrix */ +const float GESVWB_AR1[128] = +{ + -1.1719f, -6.2500f, -12.1094f, 0.7813f, -31.6406f, -48.0469f, -88.2813f, -101.5625f, -76.5625f, -47.6563f, -7.8125f, 30.4688f, 69.5313f, 56.6406f, 32.8125f, 17.9688f, + 21.4844f, 16.4063f, 5.8594f, 12.5000f, -18.7500f, -31.6406f, -42.5781f, -53.5156f, -73.0469f, -103.1250f, -128.9063f, -151.1719f, -141.7969f, -68.7500f, -14.8438f, 14.4531f, + -12.5000f, -27.3438f, -56.2500f, -105.0781f, -131.6406f, -71.4844f, 23.0469f, 22.6563f, 17.1875f, 19.1406f, 16.4063f, 19.9219f, 28.1250f, 19.5313f, 10.1563f, 14.8438f, + -7.0313f, -22.6563f, -30.8594f, 48.8281f, 137.5000f, 113.6719f, 70.3125f, 46.0938f, 28.1250f, 9.7656f, -8.9844f, -32.0313f, -72.2656f, -65.2344f, -12.8906f, 2.3438f, + -3.9063f, 52.7344f, 212.5000f, 201.9531f, 201.9531f, 219.1406f, 201.1719f, 206.2500f, 195.3125f, 184.3750f, 161.3281f, 149.6094f, 124.2188f, 85.5469f, 46.0938f, 22.2656f, + -21.0938f, -109.3750f, -239.8438f, -214.0625f, -203.5156f, -203.9063f, -175.0000f, -187.1094f, -178.5156f, -171.0938f, -147.2656f, -138.6719f, -124.2188f, -105.8594f, -86.7188f, -34.7656f, + -24.2188f, -37.5000f, -33.5938f, -3.9063f, 40.6250f, 60.5469f, 46.8750f, 43.7500f, 74.2188f, 103.1250f, 113.6719f, 106.2500f, 90.6250f, 64.8438f, 37.1094f, 10.5469f, + 12.8906f, 23.8281f, 60.5469f, 47.2656f, 3.5156f, -10.9375f, 2.3438f, 40.2344f, 25.0000f, 6.6406f, 1.5625f, -0.7813f, -12.1094f, -34.3750f, -81.6406f, -80.4688f +}; +/* An 16-by-8 matrix */ +const float GESVWB_AR2[128] = +{ + -57.4219f, -127.3438f, -164.4531f, -35.5469f, -8.5938f, -9.7656f, -5.4688f, -8.2031f, 12.5000f, 29.6875f, 40.6250f, 39.8438f, 25.3906f, 18.3594f, 19.5313f, 16.0156f, + -15.2344f, -6.2500f, 23.8281f, -5.0781f, -14.8438f, -21.8750f, 18.3594f, 59.7656f, 76.1719f, 83.2031f, 82.8125f, 85.9375f, 95.7031f, 95.7031f, 81.6406f, 33.5938f, + -13.2813f, -28.5156f, 32.0313f, 151.1719f, 77.7344f, 27.7344f, 21.8750f, -7.0313f, -12.8906f, -21.8750f, -34.3750f, -30.8594f, -1.9531f, 23.0469f, 21.4844f, 11.3281f, + -2.7344f, -8.2031f, -8.2031f, -61.7188f, -48.0469f, 118.7500f, 88.2813f, 65.6250f, 48.4375f, 3.1250f, -29.2969f, -35.5469f, -21.0938f, -1.9531f, 14.4531f, 11.7188f, + -10.1563f, -8.5938f, -26.1719f, -87.8906f, 41.7969f, 14.8438f, -32.0313f, -44.1406f, -83.2031f, -80.0781f, -24.2188f, 10.9375f, 34.7656f, 37.1094f, 20.3125f, 6.6406f, + 88.6719f, 157.8125f, 126.9531f, 52.3438f, 17.5781f, -6.2500f, 1.1719f, -5.8594f, -21.4844f, -25.3906f, -21.4844f, -21.0938f, -7.0313f, -3.1250f, 0.3906f, -5.4688f, + 7.4219f, 11.7188f, 4.6875f, 10.9375f, 18.7500f, 5.0781f, 0.7813f, -18.3594f, -14.8438f, 16.0156f, 11.3281f, -3.1250f, -60.1563f, -123.0469f, -160.5469f, -94.5313f, + 3.1250f, 9.3750f, 11.3281f, -23.8281f, -83.9844f, -128.5156f, -92.5781f, -41.4063f, -4.6875f, -4.6875f, -25.0000f, -46.0938f, -65.2344f, -46.4844f, 3.1250f, 20.3125f +}; +/* An 16-by-32 matrix */ +const float AUWB2_MA1[512] = +{ + 152.7344f, 116.4063f, 69.9219f, -14.4531f, -87.8906f, -151.1719f, -244.9219f, -337.5000f, -475.0000f, -642.1875f, -823.4375f, -314.0625f, -108.2031f, -1.9531f, 47.2656f, 182.8125f, + 137.1094f, 83.2031f, 55.0781f, -29.2969f, -50.7813f, -64.0625f, -129.6875f, -160.1563f, -204.6875f, -223.8281f, -224.6094f, -185.1563f, -129.2969f, -40.2344f, -8.5938f, 78.5156f, + 31.6406f, 341.4063f, 444.1406f, 477.7344f, 485.1563f, 492.9688f, 483.5938f, 462.8906f, 445.7031f, 423.8281f, 387.8906f, 286.3281f, 222.6563f, 165.6250f, 100.0000f, 56.6406f, + -2.3438f, -9.7656f, -41.0156f, -57.4219f, -127.7344f, -133.5938f, -229.2969f, -242.1875f, -372.6563f, -446.4844f, -733.5938f, -804.2969f, -139.0625f, -39.0625f, 52.3438f, 186.3281f, + -76.9531f, -197.2656f, -322.6563f, -407.4219f, -337.1094f, -189.4531f, -115.6250f, -40.2344f, -2.3438f, 69.5313f, 105.0781f, 95.7031f, 90.2344f, 125.0000f, 94.9219f, 161.3281f, + -202.3438f, -236.3281f, 110.1563f, 167.9688f, 207.8125f, 232.8125f, 264.0625f, 292.1875f, 315.6250f, 336.3281f, 325.7813f, 266.0156f, 208.5938f, 194.5313f, 114.4531f, 131.6406f, + -95.3125f, -219.9219f, -281.2500f, -233.9844f, -195.3125f, -192.9688f, -244.9219f, -288.6719f, -401.5625f, -476.1719f, -116.0156f, 3.5156f, 27.7344f, 106.2500f, 111.3281f, 219.9219f, + -175.0000f, -333.5938f, -357.8125f, -202.3438f, -112.1094f, -20.3125f, 21.8750f, 95.7031f, 135.5469f, 204.6875f, 217.5781f, 194.1406f, 162.5000f, 176.5625f, 125.3906f, 170.7031f, + 58.5938f, 44.1406f, 10.9375f, -10.1563f, 0.3906f, -31.2500f, -69.1406f, -88.2813f, -75.3906f, -60.9375f, -24.2188f, -88.6719f, -93.7500f, -149.6094f, -208.9844f, -316.0156f, + -93.7500f, -96.0938f, -67.9688f, -25.7813f, 31.2500f, 58.2031f, 95.3125f, 110.9375f, 161.3281f, 169.5313f, 184.7656f, 61.7188f, 21.8750f, -65.2344f, -127.3438f, -282.4219f, + 51.1719f, -4.2969f, 55.0781f, 12.5000f, 9.3750f, -47.6563f, -155.0781f, -238.2813f, -346.8750f, -317.1875f, 11.7188f, 90.6250f, 119.5313f, 144.9219f, 133.2031f, 174.2188f, + -61.7188f, -212.8906f, -206.6406f, 58.9844f, 55.4688f, -39.4531f, -166.4063f, -279.6875f, -402.7344f, -577.7344f, -605.4688f, -137.5000f, -51.5625f, 56.6406f, 73.0469f, 201.9531f, + 57.8125f, -40.6250f, -173.8281f, -328.5156f, -12.1094f, 71.4844f, -33.5938f, -123.4375f, -240.2344f, -257.8125f, -90.2344f, 32.8125f, 75.0000f, 107.4219f, 78.5156f, 121.4844f, + -71.4844f, -85.9375f, -94.9219f, -71.0938f, -92.5781f, -68.7500f, -103.9063f, -91.0156f, -131.2500f, -132.4219f, -253.9063f, -398.0469f, -645.3125f, -330.4688f, -20.3125f, 151.1719f, + -40.6250f, -45.7031f, -99.2188f, -129.6875f, -74.6094f, 0.3906f, 25.0000f, 71.0938f, 123.8281f, 193.3594f, 244.5313f, 224.2188f, 202.7344f, 198.4375f, 178.1250f, 197.2656f, + -58.9844f, -92.5781f, 192.1875f, 187.1094f, 106.6406f, 54.2969f, 14.0625f, -23.4375f, -46.4844f, 28.9063f, 67.9688f, 73.4375f, 116.4063f, 142.9688f, 135.5469f, 186.7188f, + 61.7188f, 8.9844f, -82.0313f, -175.7813f, -262.8906f, -248.8281f, -165.2344f, -129.2969f, -51.9531f, 5.4688f, 50.0000f, 26.9531f, 24.2188f, 55.8594f, 66.7969f, 122.2656f, + 195.7031f, 153.9063f, 14.4531f, -22.2656f, 26.1719f, 27.3438f, 17.9688f, 13.6719f, 35.9375f, 46.8750f, 131.6406f, 100.7813f, 107.8125f, 110.5469f, 143.7500f, 195.3125f, + 16.4063f, -61.3281f, -155.4688f, -234.3750f, -289.8438f, -304.6875f, -305.0781f, -382.8125f, -455.4688f, -636.3281f, -378.1250f, -58.2031f, -38.6719f, 73.4375f, 81.6406f, 206.6406f, + -93.7500f, 74.2188f, 181.6406f, 212.1094f, 224.6094f, 220.7031f, 236.3281f, 232.8125f, 255.0781f, 233.9844f, 227.7344f, 108.9844f, 79.2969f, -19.9219f, -72.6563f, -230.0781f, + 123.4375f, 144.9219f, 162.8906f, 145.3125f, 114.4531f, 73.8281f, 89.8438f, 60.1563f, 71.8750f, 35.5469f, 36.7188f, -68.3594f, -77.3438f, -139.8438f, -177.3438f, -287.5000f, + 28.1250f, -62.1094f, -141.4063f, -194.9219f, -247.2656f, -269.5313f, -310.1563f, -288.6719f, -258.5938f, -178.1250f, -140.6250f, -132.0313f, -98.0469f, -2.3438f, 19.5313f, 135.1563f, + -78.9063f, -129.6875f, -167.1875f, -180.4688f, -198.4375f, -171.8750f, -215.6250f, -252.7344f, -345.7031f, -475.3906f, -676.9531f, -241.7969f, -63.2813f, 37.1094f, 78.9063f, 199.2188f, + -35.5469f, -152.7344f, -276.9531f, -345.3125f, -395.3125f, -391.0156f, -365.6250f, -278.9063f, -198.8281f, -77.3438f, 16.4063f, 38.6719f, 46.4844f, 101.9531f, 92.9688f, 193.7500f, + -144.5313f, 35.9375f, 185.9375f, 235.9375f, 266.0156f, 297.6563f, 322.6563f, 348.8281f, 364.8438f, 391.0156f, 372.6563f, 305.8594f, 245.7031f, 230.4688f, 160.9375f, 182.4219f, + -75.3906f, -8.5938f, -10.9375f, 17.9688f, 83.5938f, 151.1719f, 196.0938f, 251.1719f, 284.3750f, 337.5000f, 335.5469f, 282.4219f, 226.9531f, 222.2656f, 169.9219f, 188.6719f, + 87.1094f, 113.6719f, 247.2656f, 198.4375f, 136.7188f, 55.0781f, -60.9375f, -185.9375f, -363.2813f, -553.5156f, -706.6406f, -298.4375f, -80.4688f, 30.0781f, 74.6094f, 201.1719f, + -185.5469f, -308.9844f, -162.8906f, 29.2969f, 78.5156f, 133.9844f, 159.3750f, 214.4531f, 239.0625f, 276.1719f, 267.9688f, 223.4375f, 180.8594f, 178.5156f, 125.3906f, 145.7031f, + 328.9063f, 279.6875f, 261.3281f, 231.6406f, 163.6719f, 165.2344f, 145.7031f, 125.3906f, 106.6406f, 109.3750f, 138.2813f, 84.7656f, 75.3906f, 90.6250f, 68.3594f, 114.8438f, + 45.3125f, -23.4375f, -56.2500f, -116.7969f, -164.4531f, -215.2344f, -285.9375f, -371.8750f, -469.9219f, -649.2188f, -779.6875f, -209.7656f, -93.7500f, 21.4844f, 53.9063f, 189.8438f, + -126.1719f, -259.7656f, -267.9688f, -83.5938f, -78.5156f, -101.5625f, -145.7031f, -128.5156f, -130.0781f, -64.4531f, 25.7813f, 37.5000f, 68.3594f, 121.0938f, 113.6719f, 189.8438f, + -7.4219f, 16.7969f, 13.6719f, 15.6250f, 16.4063f, 21.4844f, 24.6094f, 39.4531f, 51.9531f, 75.7813f, 86.7188f, 59.3750f, 45.7031f, 56.6406f, 51.9531f, 83.2031f +}; + +/* An 16-by-16 matrix */ +const float SVWB2_SN1[256] = { + -100.78f, -150.78f, -263.28f, 361.72f, 550.39f, 341.41f, 287.11f, 200.00f, 243.75f, 229.30f, 192.58f, 268.75f, 330.08f, 203.52f, 167.19f, 37.11f, + -12.89f, -35.16f, 408.98f, 260.16f, 128.52f, -23.05f, -126.95f, -110.16f, -278.13f, -305.86f, -89.84f, 10.94f, -138.67f, -169.92f, -194.53f, -137.11f, + 71.48f, 43.36f, 200.39f, 291.41f, 142.58f, 35.55f, -83.98f, -186.33f, -157.03f, -194.14f, -364.06f, -460.94f, -555.47f, -423.83f, -178.13f, -3.52f, + -111.72f, -151.56f, -127.34f, 123.83f, 67.19f, 107.42f, 92.97f, 215.23f, 216.80f, 224.22f, 241.41f, 280.08f, 293.36f, 239.06f, 172.27f, 91.02f, + 37.50f, 69.92f, 79.30f, -43.75f, -181.64f, -230.86f, -83.20f, 48.44f, 12.89f, 75.00f, 95.70f, 36.72f, -16.02f, -114.84f, -198.05f, -253.52f, + -36.72f, -64.45f, 395.31f, 361.72f, 269.14f, 180.08f, 232.03f, 229.30f, 155.47f, 156.25f, 137.11f, 190.23f, 188.67f, 165.63f, 115.23f, 85.55f, + -101.95f, -139.45f, -178.91f, -98.44f, -63.67f, -136.72f, -153.91f, -99.61f, 11.72f, 67.58f, 35.16f, 25.39f, 36.33f, 61.33f, 26.17f, 1.17f, + 16.80f, 39.45f, -19.14f, -233.20f, -333.20f, -307.81f, -222.27f, -209.38f, -304.69f, -237.11f, -66.02f, -48.83f, -29.30f, 37.50f, 38.67f, 60.16f, + 94.14f, 79.30f, 158.20f, 30.86f, -78.91f, -216.80f, -280.47f, -399.61f, -452.73f, -542.97f, -600.78f, -302.73f, -186.72f, -67.58f, -24.61f, 106.25f, + -64.45f, -114.06f, -158.59f, 409.77f, 304.30f, 136.33f, 87.89f, 4.69f, 103.52f, 14.84f, -71.48f, -174.22f, -154.69f, -32.03f, -6.64f, -57.42f, + 29.30f, 17.58f, -96.88f, -325.39f, 284.77f, 162.50f, 195.31f, 69.92f, -45.31f, 6.64f, 30.86f, 95.31f, 103.52f, 30.08f, -27.34f, -16.80f, + 249.61f, 275.78f, 188.67f, -15.63f, -207.03f, -77.73f, -42.58f, -155.86f, -94.92f, -169.53f, -278.52f, -316.80f, -365.23f, -303.52f, -129.69f, 10.16f, + 42.97f, 65.23f, -21.48f, -309.38f, -380.47f, 151.17f, 74.22f, 75.00f, 26.56f, -67.19f, -55.08f, -116.41f, -210.55f, -156.64f, -54.30f, 31.64f, + 57.81f, 120.31f, 65.63f, 20.70f, -111.33f, -105.47f, -83.20f, -70.31f, 53.91f, 78.13f, 76.17f, 25.39f, 185.94f, 263.28f, 248.44f, 195.70f, + 2.34f, 15.23f, -68.75f, 83.20f, 293.75f, 169.53f, 126.17f, 195.70f, 218.75f, 108.20f, 41.80f, -96.09f, -140.23f, -300.00f, -319.53f, -416.02f, + -91.02f, -115.23f, -227.34f, -448.05f, -339.84f, 30.08f, 56.25f, 130.86f, 105.08f, 196.09f, 249.22f, 280.86f, 240.23f, 146.88f, 85.55f, 67.19f +}; +/* An 16-by-16 matrix */ +const float SVWB2_SN2[256] = { + -39.45f, -51.17f, -213.28f, -326.17f, 191.02f, 196.09f, 204.30f, 116.02f, 53.52f, 77.73f, 105.47f, 67.19f, 7.03f, -19.92f, -57.81f, -24.61f, + 130.08f, 137.11f, 55.86f, 55.47f, 18.36f, -53.52f, -51.56f, -126.56f, -84.38f, -12.50f, 41.02f, 103.13f, 211.33f, 166.02f, 133.98f, 59.77f, + -36.33f, -65.63f, 71.88f, 236.33f, 145.70f, 92.58f, 72.66f, 68.36f, 120.31f, 125.78f, 175.00f, 80.08f, -50.39f, -188.28f, -186.33f, -200.00f, + -9.38f, -11.72f, 10.16f, -18.36f, -62.11f, -34.38f, -134.38f, -51.17f, -34.38f, -109.38f, -290.23f, -352.34f, -103.13f, 69.14f, 15.23f, -10.16f, + 101.17f, 97.66f, 44.92f, -29.30f, -72.66f, -127.73f, -140.63f, -92.58f, 104.69f, 208.20f, 92.19f, -133.59f, -217.19f, -130.47f, -71.09f, -11.72f, + 48.05f, 94.53f, 46.48f, 80.08f, 172.27f, 67.19f, 19.53f, -61.72f, -107.03f, -83.98f, -167.19f, -284.77f, -296.48f, -208.20f, -113.28f, -43.75f, + -62.89f, -87.50f, -200.39f, 153.52f, 179.69f, 84.38f, 70.31f, -36.72f, -30.47f, -125.00f, -184.77f, 5.08f, 87.50f, 76.95f, 49.61f, 14.84f, + -14.06f, -25.78f, 140.63f, 64.45f, -72.27f, -220.31f, -266.80f, -139.84f, -247.66f, -23.83f, 156.64f, 52.34f, -90.63f, -103.13f, -67.97f, 12.50f, + -54.69f, -76.95f, -183.98f, -139.06f, -208.20f, -126.56f, -104.69f, -29.69f, 101.95f, 101.17f, 85.16f, 63.28f, 80.47f, 103.91f, 91.41f, 65.63f, + 39.06f, 42.58f, -23.44f, -143.75f, -220.70f, -19.53f, 29.30f, -23.44f, -62.89f, -255.47f, -330.86f, 63.67f, 108.98f, 29.69f, -9.38f, 16.41f, + 4.69f, 34.38f, 48.44f, -21.48f, -35.55f, 77.34f, 113.28f, 82.81f, 94.14f, 71.88f, 3.91f, 6.25f, 219.14f, 264.84f, 241.80f, 136.72f, + -14.84f, -35.55f, 301.56f, 255.47f, 114.06f, 64.84f, 40.63f, 16.80f, -87.50f, -142.58f, -160.55f, -30.47f, -35.16f, -8.20f, 33.59f, 65.63f, + 17.58f, 0.78f, 22.66f, 31.25f, 114.84f, 160.55f, 173.05f, 255.86f, 235.94f, 251.17f, 244.14f, 207.03f, 146.09f, 89.06f, 65.23f, 50.00f, + -68.75f, -48.44f, -71.48f, -51.56f, -101.95f, -49.61f, 136.72f, 179.69f, 166.02f, 101.95f, -29.69f, -156.25f, -236.33f, -197.66f, -47.27f, -19.53f, + -37.50f, -35.94f, -107.42f, -68.75f, -85.94f, -126.56f, -155.86f, -197.27f, -238.67f, -207.42f, 48.44f, 104.69f, 91.80f, 106.64f, 50.39f, 62.50f, + -2.73f, 31.64f, 57.03f, -77.73f, -77.34f, 15.23f, -5.86f, 39.45f, 17.58f, 22.66f, 211.72f, 204.69f, 77.34f, -50.39f, -126.95f, -175.00f +}; + +/* An 16-by-8 matrix */ +const float SVWB2_AR1[128] = { + -10.94f, -15.23f, -47.66f, 28.91f, 115.63f, 58.20f, 57.42f, 46.88f, 58.20f, 14.45f, -4.30f, -64.06f, -87.11f, -116.80f, -113.67f, -125.39f, + -8.98f, -11.72f, -53.91f, -124.61f, -150.78f, 62.11f, 48.44f, 20.31f, 12.89f, -17.19f, -5.86f, -30.47f, -37.89f, -21.09f, 15.63f, 25.00f, + -37.89f, -56.25f, -80.08f, -37.89f, 31.64f, 37.50f, 59.38f, 96.48f, 80.47f, 75.78f, 103.52f, 130.08f, 125.39f, 90.63f, 51.56f, 12.50f, + 42.19f, 41.41f, 40.23f, 14.84f, -5.47f, -7.03f, -23.83f, -56.25f, -63.28f, -62.50f, -100.78f, -158.20f, -210.94f, -123.44f, -48.44f, 7.42f, + 8.98f, 4.69f, 13.67f, -5.47f, -20.70f, -41.41f, -56.25f, -103.91f, -135.16f, -184.38f, -157.03f, -11.72f, -1.95f, -16.80f, -34.38f, -3.91f, + -20.70f, -46.09f, -79.30f, 162.11f, 126.95f, 66.80f, 47.27f, -12.11f, 18.75f, -12.11f, -23.44f, -25.78f, 50.00f, 75.78f, 55.08f, 26.56f, + -18.36f, -33.98f, 167.97f, 130.47f, 75.78f, 53.13f, 33.59f, 32.42f, 0.78f, -13.67f, 18.36f, 33.20f, 1.17f, -11.72f, -30.08f, -17.58f, + -1.95f, -5.47f, -3.52f, -15.23f, -53.13f, -94.92f, -84.77f, -21.48f, -15.23f, 70.31f, 74.61f, 23.83f, 16.41f, -1.56f, 2.34f, -14.84f +}; +/* An 16-by-8 matrix */ +const float SVWB2_AR2[128] = { + 4.69f, 6.64f, -17.97f, -60.94f, -128.52f, -114.84f, 16.80f, 55.08f, 23.83f, 5.86f, -3.52f, 11.33f, -28.91f, -16.02f, -14.84f, 6.25f, + -18.36f, -32.03f, -53.13f, 32.42f, -13.28f, -43.36f, -104.69f, -114.84f, 42.58f, 53.13f, 21.09f, -22.66f, -20.31f, 24.22f, 25.00f, 5.47f, + -5.86f, -7.81f, -66.80f, -135.55f, 101.17f, 63.28f, 34.38f, 5.08f, -22.27f, -10.16f, -23.05f, 9.38f, 3.91f, 5.47f, -16.02f, -3.13f, + 13.28f, 15.23f, 54.30f, 61.33f, 12.11f, 25.78f, -5.47f, 20.70f, 24.61f, 11.72f, -3.13f, -0.78f, -71.48f, -133.59f, -134.38f, -101.17f, + 5.47f, 6.64f, 17.97f, 2.73f, -21.48f, -25.00f, -53.13f, -51.95f, -124.22f, -118.36f, 102.34f, 57.42f, -7.81f, -22.27f, -11.72f, 11.72f, + -13.67f, -13.67f, 8.59f, 36.33f, 64.06f, 78.52f, 113.67f, 100.78f, 88.28f, 115.63f, 82.03f, 77.34f, 28.13f, 10.16f, 22.27f, 0.78f, + 13.28f, 26.17f, 28.52f, -3.13f, -40.63f, 17.19f, 12.11f, -5.08f, 27.73f, 28.13f, -7.03f, -19.14f, 167.97f, 146.09f, 85.16f, 35.94f, + 0.78f, -1.17f, 28.91f, 67.19f, 26.56f, -1.56f, -13.67f, -9.77f, -60.94f, -85.55f, -168.75f, -112.50f, -71.09f, -14.06f, 44.53f, 44.14f +}; + +/*----------------------------------------------------------------------------------* + * LSF quantization - LSF mode/codebook selection tables + *----------------------------------------------------------------------------------*/ +const int16_t CB_lsf[] = +{ + -1, /* Mode 0 : INACTIVE NB, Safety net */ + -1, /* Mode 1 : UNVOICED NB, Safety net */ + 0, /* Mode 2 : VOICED NB, Safety net */ + 2, /* Mode 3 : GENERIC NB, Safety net */ + 2, /* Mode 4 : TRANSITION NB, Safety net */ + 4, /* Mode 5 : AUDIO NB, Safety net */ + -1, /* Mode 6 : INACTIVE WB, Safety net */ + -1, /* Mode 7 : UNVOICED WB, Safety net */ + 5, /* Mode 8 : VOICED WB, Safety net */ + 7, /* Mode 9 : GENERIC WB, Safety net */ + 7, /* Mode 10 : TRANSITION WB, Safety net */ + 9, /* Mode 11 : AUDIO WB, Safety net */ + -1, /* Mode 12 : INACTIVE WB16k, Safety net */ + -1, /* Mode 13 : UNVOICED WB16k, Safety net */ + 14, /* Mode 14 : VOICED WB16k, Safety net */ + -1, /* Mode 15 : GENERIC WB 16k, Safety net */ + 10, /* Mode 16 : TRANSITION WB16k, Safety net */ + -1, /* Mode 17 : AUDIO WB16k, Safety net */ + 13 /* Mode 18 : CNG, Safety net */ +}; + +const int16_t CB_p_lsf[] = +{ + 0, /* Mode 0 : INACTIVE NB, Predictive */ + 1, /* Mode 1 : UNVOICED NB, Predictive */ + 4, /* Mode 2 : VOICED NB, Predictive */ + 4, /* Mode 3 : GENERIC NB, Predictive */ + -1, /* Mode 4 : TRANSITION NB, Predictive */ + -1, /* Mode 5 : AUDIO NB, Predictive */ + 0, /* Mode 6 : INACTIVE WB, Predictive */ + 1, /* Mode 7 : UNVOICED WB, Predictive */ + 6, /* Mode 8 : VOICED WB, Predictive */ + 6, /* Mode 9 : GENERIC WB, Predictive */ + -1, /* Mode 10 : TRANSITION WB, Predictive */ + -1, /* Mode 11 : AUDIO WB, Predictive */ + 0, /* Mode 12 : INACTIVE WB16k, Predictive */ + -1, /* Mode 13 : UNVOICED WB16k, Predictive */ + 11, /* Mode 14 : VOICED WB16k, Predictive */ + 8, /* Mode 15 : GENERIC WB16k, Predictive */ + -1, /* Mode 16 : TRANSITION WB16k, Predictive */ + 10, /* Mode 17 : AUDIO WB16k, Predictive */ + 9, /* Mode 18 : GENERIC WB, MA Predictive */ +}; + + +const float * const ModeMeans[] = {IANB_Ave, UVNB_Ave, SVNB_Ave, GENB_Ave, TRNB_Ave, AUNB_Ave, IAWB_Ave, UVWB_Ave, + SVWB_Ave, GEWB_Ave, TRWB_Ave, AUWB_Ave, IAWB2_Ave, NULL, SVWB2_Ave, GEWB2_Ave, TRWB2_Ave, AUWB2_Ave + }; +const float * const Predictors[] = {Predictor6, NULL, Predictor1, Predictor3, NULL, Predictor6,Predictor5, NULL, Predictor0, + Predictor2, NULL, Predictor5, Predictor7, NULL, Predictor8, Predictor4, NULL, Predictor7 + }; +const float means_nb_31bits_ma_lsf[16] = {336.3281f , 531.2500f , 886.7188f , 1266.7969f , 1629.2969f , 1973.4375f , 2348.4375f , 2646.8750f , 2998.4375f , 3292.1875f , 3591.4062f , 3806.2500f , 4132.8125f , 4652.7344f , 5250.0000f , 5883.2031f}; +const float means_wb_31bits_ma_lsf[16] = {319.5312f , 548.0469f , 934.3750f , 1353.5156f , 1730.0781f , 2120.3125f , 2505.4688f , 2860.5469f , 3243.7500f , 3601.9531f , 3969.5312f , 4332.4219f , 4736.3281f , 5137.8906f , 5562.8906f , 5963.2812f}; + + +const int16_t CBsizes[] = +{ + 1,2,4,8,16,32,64 +}; + + +const int16_t CBbits[] = +{ + -1, /* Mode 0 : INACTIVE NB, Safety net */ + -1, /* Mode 1 : UNVOICED NB, Safety net */ + 4, /* Mode 2 : VOICED NB, Safety net */ + 5, /* Mode 3 : GENERIC NB, Safety net */ + 5, /* Mode 4 : TRANSITION NB, Safety net */ + 4, /* Mode 5 : AUDIO NB, Safety net */ + -1, /* Mode 6 : INACTIVE WB, Safety net */ + -1, /* Mode 7 : UNVOICED WB, Safety net */ + 4, /* Mode 8 : VOICED WB, Safety net */ + 5, /* Mode 9 : GENERIC WB, Safety net */ + 5, /* Mode 10 : TRANSITION WB, Safety net */ + 4, /* Mode 11 : AUDIO WB, Safety net */ + -1, /* Mode 12 : INACTIVE WB16k, Safety net */ + -1, /* Mode 13 : UNVOICED WB16k, Safety net */ + 4, /* Mode 14 : VOICED WB16k, Safety net */ + -1, /* Mode 15 : GENERIC WB16k, Safety net */ + 4, /* Mode 16 : TRANSITION WB16k, Safety net */ + -1, /* Mode 17 : AUDIO WB16k, Safety net */ + 4, /* Mode 18: CNG, Safety net */ +}; + + +const int16_t CBbits_p[] = +{ + 5, /* Mode 0 : INACTIVE NB, Predictive */ + 4, /* Mode 1 : UNVOICED NB, Predictive */ + 3, /* Mode 2 : VOICED NB, Predictive */ + 3, /* Mode 3 : GENERIC NB, Predictive */ + -1, /* Mode 4 : TRANSITION NB, Predictive */ + 0, /* Mode 5 : AUDIO NB, Predictive */ + 5, /* Mode 6 : INACTIVE WB, Predictive */ + 4, /* Mode 7 : UNVOICED WB, Predictive */ + 3, /* Mode 8 : VOICED WB, Predictive */ + 3, /* Mode 9 : GENERIC WB, Predictive */ + -1, /* Mode 10 : TRANSITION WB, Predictive */ + 0, /* Mode 11 : AUDIO WB, Predictive */ + 5, /* Mode 12 : INACTIVE WB16k, Predictive */ + -1, /* Mode 13 : UNVOICED WB16k, Predictive */ + 3, /* Mode 14 : VOICED WB16k, Predictive */ + 5, /* Mode 15 : GENERIC WB16k, Predictive */ + -1, /* Mode 16 : TRANSITION WB16k, Predictive */ + 5, /* Mode 17 : AUDIO WB16k, Predictive */ + 5, /* Mode 9 : GENERIC WB, Predictive */ +}; + + + +const int16_t BitsVQ[]= +{ + -1, /* Mode 0 : INACTIVE NB, Safety net */ + -1, /* Mode 1 : UNVOICED NB, Safety net */ + 8, /* Mode 2 : VOICED NB, Safety net */ + 9, /* Mode 3 : GENERIC NB, Safety net */ + 9, /* Mode 4 : TRANSITION NB, Safety net */ + 4, /* Mode 5 : AUDIO NB, Safety net */ + -1, /* Mode 6 : INACTIVE WB, Safety net */ + -1, /* Mode 7 : UNVOICED WB, Safety net */ + 8, /* Mode 8 : VOICED WB, Safety net */ + 9, /* Mode 9 : GENERIC WB, Safety net */ + 9, /* Mode 10 : TRANSITION WB, Safety net */ + 4, /* Mode 11 : AUDIO WB, Safety net */ + -1, /* Mode 12 : INACTIVE WB16k, Safety net */ + -1, /* Mode 13 : UNVOICED WB16k, Safety net */ + 8, /* Mode 14 : VOICED WB16k, Safety net */ + -1, /* Mode 15 : GENERIC WB16k, Safety net */ + 8, /* Mode 16 : TRANSITION WB16k, Safety net */ + -1, /* Mode 17 : AUDIO WB16k, Safety net */ + 4, /* Mode 18: CNG, Safety net */ +}; + + +const int16_t BitsVQ_p[]= +{ + 5, /* Mode 0 : INACTIVE NB, Predictive */ + 8, /* Mode 1 : UNVOICED NB, Predictive */ + 6, /* Mode 2 : VOICED NB, Predictive */ + 6, /* Mode 3 : GENERIC NB, Predictive */ + -1, /* Mode 4 : TRANSITION NB, Predictive */ + 0, /* Mode 5 : AUDIO NB, Predictive */ + 5, /* Mode 6 : INACTIVE WB, Predictive */ + 12, /* Mode 7 : UNVOICED WB, Predictive */ + 6, /* Mode 8 : VOICED WB, Predictive */ + 6, /* Mode 9 : GENERIC WB, Predictive */ + -1, /* Mode 10 : TRANSITION WB, Predictive */ + 0, /* Mode 11 : AUDIO WB, Predictive */ + 5, /* Mode 12 : INACTIVE WB16k, Predictive */ + -1, /* Mode 13 : UNVOICED WB16k, Predictive */ + 6, /* Mode 14 : VOICED WB16k, Predictive */ + 5, /* Mode 15 : GENERIC WB16k, Predictive */ + -1, /* Mode 16 : TRANSITION WB16k, Predictive */ + 5, /* Mode 17 : AUDIO WB16k, Predictive */ + 5, /* Mode 18 : GENERIC WB, MA Predictive */ +}; + + +const int16_t predmode_tab[][6] = +{ + {1,1,2,2,0,2}, + {1,1,2,2,0,2}, + {1,-1,2,1,0,1}, + {1,1,2,1,0,1} /* should check how is the cb for audio mode at 13.2*/ +}; + +const float * const Quantizers[] = {SVNB_SN1, SVNB_SN2, GETRNB_SN1, GETRNB_SN2, AUNB_SN1,SVWB_SN1, SVWB_SN2, GETRWB_SN1, + GETRWB_SN2, AUWB_SN1,TRWB2_SN1, TRWB2_SN2, AUWB2_SN1, CNG_SN1, SVWB2_SN1, SVWB2_SN2 }; +const float * const Quantizers_p[] = {IAA_MA1, UVD_MA1, UVD_MA2, UVWB_MA3, GESVNB_AR1, GESVNB_AR2, GESVWB_AR1, GESVWB_AR2, + GEWB2_MA1,GEWB_MA1, AUWB2_MA1, SVWB2_AR1, SVWB2_AR2 }; + +const float vals[NO_LEADERS][MAX_NO_VALS]= +{ + {1.0f, 0.0f, 0.0f, 0.0f}, + {0.5f, 0.0f, 0.0f, 0.0f}, + {1.0f, 0.0f, 0.0f, 0.0f}, + {2.0f, 0.0f, 0.0f, 0.0f}, + {1.5f, 0.5f, 0.0f, 0.0f}, + {1.0f, 0.0f, 0.0f, 0.0f}, + {2.0f, 1.0f, 0.0f, 0.0f}, + {1.5f, 0.5f, 0.0f, 0.0f}, + {1.0f, 0.0f, 0.0f, 0.0f}, + {2.0f, 1.0f, 0.0f, 0.0f}, + {2.0f, 0.0f, 0.0f, 0.0f}, + {1.5f, 0.5f, 0.0f, 0.0f}, + {2.5f, 0.5f, 0.0f, 0.0f}, + {2.0f, 1.0f, 0.0f, 0.0f}, + {2.0f, 1.0f, 0.0f, 0.0f}, + {3.0f, 1.0f, 0.0f, 0.0f}, + {1.5f, 0.5f, 0.0f, 0.0f}, + {2.5f, 1.5f, 0.5f, 0.0f}, + {2.0f, 1.0f, 0.0f, 0.0f}, + {2.0f, 0.0f, 0.0f, 0.0f}, + {3.0f, 1.0f, 0.0f, 0.0f}, + {1.5f, 0.5f, 0.0f, 0.0f}, + {2.5f, 1.5f, 0.5f, 0.0f}, + {2.0f, 1.0f, 0.0f, 0.0f}, + {2.0f, 1.0f, 0.0f, 0.0f}, + {3.0f, 1.0f, 0.0f, 0.0f}, + {3.0f, 2.0f, 1.0f, 0.0f}, + {1.5f, 0.5f, 0.0f, 0.0f}, + {2.5f, 1.5f, 0.5f, 0.0f}, + {2.5f, 0.5f, 0.0f, 0.0f}, + {3.5f, 0.5f, 0.0f, 0.0f}, + {2.0f, 1.0f, 0.0f, 0.0f}, + {2.0f, 0.0f, 0.0f, 0.0f}, + {3.0f, 1.0f, 0.0f, 0.0f}, + {3.0f, 2.0f, 1.0f, 0.0f}, + {4.0f, 0.0f, 0.0f, 0.0f}, + {1.5f, 0.5f, 0.0f, 0.0f}, + {2.5f, 1.5f, 0.5f, 0.0f}, + {2.5f, 1.5f, 0.5f, 0.0f}, + {3.5f, 1.5f, 0.5f, 0.0f}, + {2.0f, 1.0f, 0.0f, 0.0f}, + {3.0f, 2.0f, 1.0f, 0.0f}, + {3.0f, 2.0f, 1.0f, 0.0f}, + {3.0f, 0.0f, 0.0f, 0.0f}, + {4.0f, 1.0f, 0.0f, 0.0f}, + {1.5f, 0.0f, 0.0f, 0.0f}, + {2.5f, 1.5f, 0.5f, 0.0f}, + {2.5f, 1.5f, 0.5f, 0.0f}, + {3.5f, 1.5f, 0.5f, 0.0f} +}; + +const int16_t no_vals[NO_LEADERS]= {2,1,2,2,2,2,3,2,1,3,2,2,2,3,3,3,2,3,3,2,3,2,3,2,3,3,4,2,3,2,2,3,2,2,4,2,2,3,3,3,3,4,4,2,3,1,3,3,3}; + +const int16_t no_vals_ind[NO_LEADERS][MAX_NO_VALS]= +{ + {2,6,0,0}, + {8,0,0,0}, + {4,4,0,0}, + {1,7,0,0}, + {1,7,0,0}, + {6,2,0,0}, + {1,2,5,0}, + {2,6,0,0}, + {8,0,0,0}, + {1,4,3,0}, + {2,6,0,0}, + {3,5,0,0}, + {1,7,0,0}, + {1,6,1,0}, + {2,2,4,0}, + {1,1,6,0}, + {4,4,0,0}, + {1,1,6,0}, + {2,4,2,0}, + {3,5,0,0}, + {1,3,4,0}, + {5,3,0,0}, + {1,2,5,0}, + {2,6,0,0}, + {3,2,3,0}, + {1,5,2,0}, + {1,1,1,5}, + {6,2,0,0}, + {1,3,4,0}, + {2,6,0,0}, + {1,7,0,0}, + {3,4,1,0}, + {4,4,0,0}, + {1,7,0,0}, + {1,1,3,3}, + {1,7,0,0}, + {7,1,0,0}, + {1,4,3,0}, + {2,1,5,0}, + {1,1,6,0}, + {4,2,2,0}, + {1,1,5,1}, + {1,2,1,4}, + {2,6,0,0}, + {1,2,5,0}, + {8,0,0,0}, + {1,5,2,0}, + {2,2,4,0}, + {1,2,5,0} +}; + +const int16_t C_VQ[LATTICE_DIM+1][LATTICE_DIM+1] = +{ + {1,0,0,0,0,0,0,0,0}, + {1,1,0,0,0,0,0,0,0}, + {1,2,1,0,0,0,0,0,0}, + {1,3,3,1,0,0,0,0,0}, + {1,4,6,4,1,0,0,0,0}, + {1,5,10,10,5,1,0,0,0}, + {1,6,15,20,15,6,1,0,0}, + {1,7,21,35,35,21,7,1,0}, + {1,8,28,56,70,56,28,8,1} +}; + +const UWord32 table_no_cv[] = +{ + 0, 112, 240, 1360, 1376, 2400, 4192, 5536, 9120, 9376, 18336, 18448, 25616, 26640, 33808, 40528, 40752, + 49712, 56880, 83760, 84208, 88688, 95856, 117360, 124528, 142448, 153200, 155888, 159472, 195312, 198896, 199920, 235760, 236880, + 238928, 274768, 274784, 275808, 311648, 333152, 340320, 367200, 410208, 423648, 423760, 425104, 425232, 446736, 500496, 522000, 0 +}; + +const int16_t pi0[] = +{ + 28,1,70,8,8,28,168,28,1,280,28,56,8,56,420,56, 70, 56,420, 56, 280, 56, 168, 28, 560, 168,336,28,280,28,8, + 280,70, 8, 1120, 8, 8, 280, 168, 56, 420, 336, 840, 28, 168, 1, 168, 420, 168 +}; + +const float pl_HQ[] = /* vectors in first layers */ +{ + 1, 1, 0, 0, 0, 0, 0, 0, /* 112, 4, 28 */ + 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, /* 128, 128, 1 */ + 1, 1, 1, 1, 0, 0, 0, 0, /* 1120, 16, 70 */ + 2, 0, 0, 0, 0, 0, 0, 0, /* 16 , 2, 8 */ + 1.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, /* 5 */ /* 1024,128, 8 */ + 1, 1, 1, 1, 1, 1, 0, 0, /* 1792, 64, 28 */ + 2, 1, 1, 0, 0, 0, 0, 0, /* 1344, 8, 168 */ + 1.5, 1.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, /* 3584, 128, 28*/ + 1, 1, 1, 1, 1, 1, 1, 1, /*256, 256, 1*/ + 2, 1, 1, 1, 1, 0, 0, 0, /* 10 */ /* 8960, 32, 280 */ + 2, 2, 0, 0, 0, 0, 0, 0, /* 112, 4, 28 */ + 1.5, 1.5, 1.5, 0.5, 0.5, 0.5, 0.5, 0.5, /* 7168, 128, 56 */ + 2.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, /* 1024, 128, 8*/ + 2, 1, 1, 1, 1, 1, 1, 0, /* 7168, 128, 56*/ + 2, 2, 1, 1, 0, 0, 0, 0, /* 15 */ /* 6720, 16, 420 */ + 3, 1, 0, 0, 0, 0, 0, 0, /* 224, 4, 56 */ + 1.5, 1.5, 1.5, 1.5, 0.5, 0.5, 0.5, 0.5, /* 8960, 128, 70 */ + 2.5, 1.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, /* 7168, 128, 56*/ + 2.0, 2.0, 1.0, 1.0, 1.0, 1.0, 0, 0, /* 26880, 64, 420 */ + 2, 2, 2, 0, 0, 0, 0, 0, /*20 */ /* 448, 8, 56 */ + 3, 1, 1, 1, 0, 0, 0, 0, /* 4480, 16, 280 */ + 1.5, 1.5, 1.5, 1.5, 1.5, 0.5, 0.5, 0.5, /* 7168, 128, 56 */ + 2.5, 1.5, 1.5, 0.5, 0.5, 0.5, 0.5, 0.5, /* 21504, 128, 168 */ + 2.0, 2.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, /* 7168, 256, 28 */ + 2.0, 2.0, 2.0, 1.0, 1.0, 0, 0, 0, /* 25 */ /* 17920, 32, 560 */ + 3.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0, 0, /* 10752, 64, 168 */ + 3.0, 2.0, 1.0, 0, 0, 0, 0, 0, /* 2688, 8, 336 */ + 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 0.5, 0.5, /* 3584, 128, 28 */ + 2.5, 1.5, 1.5, 1.5, 0.5, 0.5, 0.5, 0.5, /* 35840,128,280*/ + 2.5, 2.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, /*30 */ /* 3584, 128, 28*/ + 3.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, /* 1024,128, 8 */ + 2.0, 2.0, 2.0, 1.0, 1.0, 1.0, 1.0, 0, + 2.0f, 2.0f, 2.0f, 2.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 3.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, + 3.0f, 2.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, + 4.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 1.5f, 1.5f, 1.5f, 1.5f, 1.5f, 1.5f, 1.5f, 0.5f, + 2.5f, 1.5f, 1.5f, 1.5f, 1.5f, 0.5f, 0.5f, 0.5f, + 2.5f, 2.5f, 1.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, + 3.5f, 1.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, + 2.0f, 2.0f, 2.0f, 2.0f, 1.0f, 1.0f, 0.0f, 0.0f, + 3.0f, 2.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, + 3.0f, 2.0f, 2.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 3.0f, 3.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 4.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 1.5f, 1.5f, 1.5f, 1.5f, 1.5f, 1.5f, 1.5f, 1.5f, + 2.5f, 1.5f, 1.5f, 1.5f, 1.5f, 1.5f, 0.5f, 0.5f, + 2.5f, 2.5f, 1.5f, 1.5f, 0.5f, 0.5f, 0.5f, 0.5f, + 3.5f, 1.5f, 1.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f +}; + +/*----------------------------------------------------------------------------------* + * LSF quantization for CNG + *----------------------------------------------------------------------------------*/ + +const int16_t cng_sort[] = {/*5f */1,1,0,1,0,0, /* 4f */0,1,0,1,0,0,1,1,1,1}; + +const int16_t perm_MSLVQ[][4] = +{ + /* 5f*/ + {6,11,7,15}, + {6,15,-1,0}, + {5,8,7,15}, + {7,10,-1,0}, + {-1,0,0,0}, + {-1,0,0,0}, + /* 4f */ + {-1,0,0,0}, + {0,9,7,10}, + {-1,0,0,0}, + {7,15,-1,0}, + {-1,0,0,0}, + {-1,0,0,0}, + {6,10,7,11}, + {6,11,7,12}, + {6,11,7,12}, + {6,11,7,12} +}; + +const int16_t pl_par[] = /* 1 if even number of signs */ +{ + 0, 1, 0, 0, -1, 0, 0, 1, 0, 0, + 0, -1, 1, 0, 0, 0, 1, -1, 0, 0, + 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, + 0, 0, 0, 0, -1, 1, -1, 1, 0, 0, 0, 0, 0, 1, -1, 1, -1 +}; + +const float scales[][MAX_NO_SCALES*2]= /* 2 subvectors */ +{ + {1.528f, 0.000f, 0.000f, 1.532f, 0.000f, 0.000f, }, /* 14 */ + {1.605f, 0.000f, 0.000f, 1.532f, 0.000f, 0.000f, }, /* 15 */ + {1.275f, 2.458f, 0.000f, 1.532f, 0.000f, 0.000f, }, /* 18 */ + {1.275f, 2.458f, 0.000f, 1.631f, 0.000f, 0.000f, }, /* 19 */ + {1.057f, 1.794f, 2.896f, 1.154f, 1.860f, 3.067f, }, /* 25 */ + {0.927f, 1.458f, 2.317f, 1.033f, 1.791f, 3.440f, }, /* 28*/ /* mode 0 UV WB*/ + + {1.284f, 2.676f, 0.000f, 1.451f, 0.000f, 0.000f, }, /* 18 */ + {1.368f, 0.000f, 0.000f, 1.401f, 2.477f, 0.000f, }, /* 19 */ + {0.861f, 1.243f, 1.818f, 1.228f, 2.226f, 10.307f, }, /* 24 */ + {1.072f, 1.934f, 3.633f, 1.221f, 2.938f, 10.723f, }, /* 25 */ + {0.899f, 1.417f, 0.677f, 1.033f, 1.837f, 10.893f, }, /* 29 */ + {0.830f, 1.323f, 0.629f, 0.911f, 1.585f, 10.088f, }, /* 32 */ /* mode 1 UV NB*/ + {1.573f, 0.000f, 0.000f, 1.656f, 0.000f, 0.000f, }, /* 17 */ + {1.239f, 2.404f, 0.000f, 1.556f, 0.000f, 0.000f, }, /* 18 */ + {1.375f, 2.065f, 3.124f, 1.795f, 0.000f, 0.000f, }, /* (18.745) 19 */ + {1.375f, 2.065f, 3.124f, 1.901f, 0.000f, 0.000f, }, /* (19.838) 20 */ + {1.055f, 1.700f, 4.439f, 1.656f, 0.000f, 0.000f, }, /* 21 */ + {1.250f, 2.404f, 4.132f, 1.355f, 2.361f, 0.000f, }, /* 22 */ + {1.246f, 1.857f, 2.744f, 1.500f, 2.704f, 0.000f, }, /* (22.959) 23 */ + {1.243f, 2.054f, 3.638f, 1.577f, 0.000f, 0.000f, }, /* (23.949) 24 */ + {1.056f, 1.785f, 4.523f, 1.318f, 2.586f, 0.000f, }, /* 25 */ + {0.996f, 1.505f, 3.355f, 1.185f, 1.776f, 2.728f, }, + {0.929f, 1.387f, 3.357f, 1.080f, 1.701f, 2.885f, }, + {0.922f, 1.493f, 3.369f, 1.080f, 1.701f, 2.885f, }, + {0.922f, 1.493f, 3.369f, 1.066f, 1.694f, 3.135f, }, + {0.922f, 1.493f, 3.369f, 0.962f, 1.550f, 3.946f, }, /* 30 */ + {1.286f, 0.906f, 2.422f, 1.124f, 1.698f, 2.482f, }, /* (30.994) 31 */ + {0.746f, 1.108f, 2.869f, 0.959f, 1.481f, 3.907f, }, /* 32 */ + {0.770f, 1.194f, 2.823f, 0.907f, 1.402f, 2.116f, }, /* 33*/ + {0.748f, 1.103f, 2.866f, 1.182f, 0.811f, 3.332f, }, /* 34*/ + {0.765f, 1.132f, 1.844f, 1.242f, 1.893f, 0.922f, }, /* (34.981) 35 */ + {0.766f, 1.133f, 1.846f, 1.066f, 1.641f, 0.813f, }, /* (35.998) 36 */ + {0.677f, 0.963f, 2.127f, 0.726f, 1.082f, 2.204f, }, /* 37*/ /* mode 2 V WB*/ + + {1.639f, 0.000f, 0.000f, 1.218f, 2.161f, 0.000f, }, /* 17 */ + {1.286f, 2.446f, 0.000f, 1.410f, 0.000f, 0.000f, }, /* 18 */ + {1.086f, 1.728f, 3.758f, 1.218f, 2.161f, 0.000f, }, /* 22 */ + {1.035f, 1.575f, 4.815f, 1.218f, 2.161f, 0.000f, }, /* 23 */ + {0.964f, 1.533f, 4.942f, 1.218f, 2.161f, 0.000f, }, /* 24 */ + {0.841f, 1.198f, 1.982f, 1.218f, 2.161f, 0.000f, }, /* 25 */ + {0.898f, 1.298f, 2.184f, 1.216f, 2.664f, 0.000f, }, /* 27 */ + {0.841f, 1.237f, 2.237f, 0.995f, 1.657f, 2.836f, }, /* 29 */ + {0.697f, 0.981f, 2.043f, 0.935f, 1.505f, 0.659f, }, /* 34 */ + {0.669f, 0.909f, 1.328f, 0.985f, 0.654f, 1.911f, }, /* 37 */ /* mode 3 V NB*/ + + {1.212f, 1.897f, 0.000f, 0.000f, 0.000f, 0.000f, }, /* 12 (11.883) */ + {1.160f, 1.869f, 3.406f, 0.000f, 0.000f, 0.000f, }, /* (12.997) 13 */ + {1.658f, 0.000f, 0.000f, 1.896f, 0.000f, 0.000f, }, /* (13.640) 14 */ + {1.740f, 0.000f, 0.000f, 1.896f, 0.000f, 0.000f, }, /* (14.733) 15 */ + {1.634f, 0.000f, 0.000f, 1.669f, 0.000f, 0.000f, }, /* 16 (15.826) */ + {1.740f, 0.000f, 0.000f, 2.016f, 0.000f, 0.000f, }, /* (15.826) 16 */ + {1.377f, 2.548f, 0.000f, 1.896f, 0.000f, 0.000f, }, /* (17.479) 18 */ + {1.288f, 2.423f, 0.000f, 1.669f, 0.000f, 0.000f, }, /* 19 (18.572) */ + {1.212f, 1.897f, 0.000f, 1.669f, 0.000f, 0.000f, }, /* 20 (19.796) */ + {1.083f, 1.766f, 3.175f, 1.669f, 0.000f, 0.000f, }, /* 21 (20.910) */ + {1.037f, 1.609f, 4.228f, 1.669f, 0.000f, 0.000f, }, /* 22 (21.776) */ + {1.095f, 1.659f, 2.716f, 1.315f, 2.506f, 0.000f, }, /* 23 (22.959) */ + {1.166f, 1.965f, 3.654f, 1.686f, 0.000f, 0.000f, }, /* (23.949) 24 */ + {0.941f, 1.386f, 2.221f, 1.315f, 2.506f, 0.000f, }, /* 25 (24.992) */ + {0.908f, 1.306f, 1.901f, 1.320f, 2.623f, 0.000f, }, /* 26 (25.904) */ + {1.075f, 1.767f, 0.790f, 1.320f, 2.623f, 0.000f, }, /* 27 (26.829) */ + {1.022f, 1.531f, 0.759f, 1.110f, 1.755f, 2.594f, }, /* 28 (27.989) */ + {1.075f, 1.767f, 0.790f, 1.093f, 1.902f, 3.014f, }, /* 29 (28.984) */ + {0.893f, 1.472f, 0.675f, 1.103f, 1.770f, 2.842f, }, /* 30 (29.980) */ + {0.910f, 1.548f, 0.685f, 1.032f, 1.651f, 2.513f, }, /* 31 (30.966) */ + {0.826f, 1.256f, 0.632f, 0.981f, 1.542f, 2.217f, }, /* 32 (31.995) */ /* G WB*/ + + {1.184f, 1.810f, 2.761f, 0.000f, 0.000f, 0.000f, }, /* 12 (11.925) */ + {1.611f, 0.000f, 0.000f, 1.618f, 0.000f, 0.000f, }, /* 16 (15.826) */ + {1.184f, 1.810f, 2.761f, 1.550f, 0.000f, 0.000f, }, /* 19 (18.745) */ + {1.184f, 1.810f, 2.761f, 1.618f, 0.000f, 0.000f, }, /* 20 (19.838) */ + {1.063f, 1.737f, 2.985f, 1.618f, 0.000f, 0.000f, }, /* 21 (20.910) */ + {1.078f, 1.825f, 3.162f, 1.469f, 2.249f, 0.000f, }, /* 22 (21.985) */ + {1.375f, 0.915f, 2.082f, 1.469f, 2.249f, 0.000f, }, /* 23 (22.815) */ + {0.960f, 1.423f, 0.700f, 1.310f, 2.132f, 0.000f, }, /* 25 (24.996) */ + {1.124f, 0.794f, 1.902f, 1.283f, 2.302f, 0.000f, }, /* 26 (25.993) */ + {1.077f, 1.727f, 0.767f, 1.250f, 1.951f, 2.981f, }, /* 27 (26.954) */ + {0.933f, 1.471f, 0.685f, 1.250f, 1.951f, 2.981f, }, /* 28 (27.992) */ + {0.927f, 1.600f, 0.674f, 1.154f, 1.776f, 2.854f, }, /* 29 (28.996) */ + {1.047f, 0.722f, 1.785f, 1.056f, 1.642f, 2.701f, }, /* 30 (29.988) */ + {0.971f, 0.688f, 1.509f, 1.043f, 1.730f, 2.931f, }, /* 31 (30.962) */ + {0.919f, 0.662f, 1.367f, 1.057f, 1.808f, 3.069f, }, /* 32 (31.987) */ /* G NB*/ + + {1.617f, 0.000f, 0.000f, 1.657f, 0.000f, 0.000f, }, /* 17 */ + {1.275f, 2.298f, 0.000f, 1.563f, 0.000f, 0.000f, }, /* 18 */ + {1.377f, 2.548f, 0.000f, 2.016f, 0.000f, 0.000f, }, /* (18.572) 19 */ /* from GEWB */ + {1.299f, 2.019f, 0.000f, 2.016f, 0.000f, 0.000f, }, /* (19.796) 20 */ + {1.308f, 2.354f, 0.000f, 1.387f, 0.000f, 0.000f, }, /* 21 */ + {1.291f, 2.418f, 0.000f, 1.355f, 2.443f, 0.000f, }, /* 22 */ + {1.173f, 1.767f, 2.796f, 1.588f, 3.028f, 0.000f, }, /* (22.959) 23 */ /* from GEWB */ + {1.079f, 1.769f, 3.012f, 1.387f, 0.000f, 0.000f, }, /* 24 */ + {1.079f, 1.769f, 3.012f, 1.325f, 2.555f, 0.000f, }, /* 25 */ + {0.973f, 1.392f, 2.014f, 1.593f, 3.183f, 0.000f, }, /* (25.904) 26 */ /* from GEWB */ + {1.149f, 1.873f, 0.848f, 1.593f, 3.183f, 0.000f, }, /* (26.829) 27 */ + {0.897f, 1.340f, 2.604f, 1.070f, 1.689f, 2.527f, }, /* 28 */ + {1.149f, 1.873f, 0.848f, 1.319f, 2.288f, 3.687f, }, /* (28.984) 29 */ /* from GEWB */ + {0.897f, 1.340f, 2.604f, 0.939f, 1.454f, 2.083f, }, /* 30 */ + {0.905f, 1.327f, 2.599f, 1.109f, 0.777f, 1.705f, }, + {0.762f, 1.101f, 2.359f, 0.939f, 1.454f, 2.083f, }, + {0.794f, 1.226f, 3.180f, 1.109f, 0.777f, 1.705f, }, /* 33 */ /* mode 6 T WB */ + + {1.629f, 0.000f, 0.000f, 1.191f, 2.211f, 0.000f, }, /* 17 */ + {1.277f, 2.557f, 0.000f, 1.367f, 0.000f, 0.000f, }, /* 18 */ + {1.082f, 1.761f, 3.929f, 1.191f, 2.211f, 0.000f, }, /* 22 */ + {1.018f, 1.535f, 2.808f, 1.191f, 2.211f, 0.000f, }, /* 23 */ + {0.944f, 1.477f, 2.763f, 1.191f, 2.211f, 0.000f, }, /* 24 */ + {0.910f, 1.744f, 3.317f, 1.191f, 2.211f, 0.000f, }, /* 25 */ + {0.920f, 1.648f, 3.068f, 0.969f, 1.683f, 3.953f, }, /* 28 */ + {0.739f, 1.111f, 2.694f, 0.879f, 1.411f, 2.305f, }, /* 31 */ + {0.709f, 1.032f, 2.717f, 0.810f, 1.245f, 1.824f, }, /* 32*/ /* mode 7 T NB*/ + + {0.758f, 1.116f, 1.964f, 2.021f, 0.798f, 1.219f, }, /* 31 */ + {0.699f, 1.034f, 1.978f, 2.021f, 0.798f, 1.219f, }, /* 32 */ /* mode 8 G 16k */ + + {0.726f, 1.050f, 1.845f, 1.355f, 0.860f, 2.205f, }, /* 32 (31.998) */ + {0.677f, 0.997f, 1.669f, 1.355f, 0.860f, 2.205f, }, /* 33 (32.983) mode 9 T16k */ + + {1.646f, 0.000f, 0.000f, 1.254f, 2.459f, 0.000f, }, /* 17 */ + {1.480f, 2.941f, 0.000f, 1.823f, 0.000f, 0.000f, }, /* (17.479) 18 */ + {1.368f, 2.297f, 0.000f, 1.823f, 0.000f, 0.000f, }, /* (18.703) 19 */ + {1.368f, 2.297f, 0.000f, 1.985f, 0.000f, 0.000f, }, /* (19.796) 20 */ + {1.073f, 1.863f, 3.231f, 1.678f, 0.000f, 0.000f, }, /* 21 */ + {1.073f, 1.863f, 3.231f, 1.254f, 2.459f, 0.000f, }, /* 22 */ + {1.056f, 1.577f, 2.467f, 1.806f, 2.990f, 0.000f, }, /* (22.917) 23 */ + {1.130f, 1.818f, 0.836f, 1.985f, 0.000f, 0.000f, }, /* (23.978) 24 */ + {0.951f, 1.492f, 2.496f, 1.255f, 2.971f, 0.000f, }, /* 25 */ + {1.148f, 1.841f, 0.813f, 1.255f, 2.971f, 0.000f, }, /* 26 */ + {1.148f, 0.809f, 1.920f, 1.530f, 2.736f, 0.000f, }, /* (26.953) 27 */ + {1.206f, 0.851f, 2.180f, 1.513f, 3.176f, 0.000f, }, /* (27.992) 28 */ + {0.804f, 1.200f, 1.976f, 1.504f, 3.210f, 0.000f, }, /* (28.992) 29 */ + {1.141f, 0.806f, 1.915f, 1.973f, 1.166f, 3.713f, }, /* (29.976) 30 */ + {1.118f, 0.778f, 2.026f, 1.239f, 2.139f, 3.775f, }, /* (30.963) 31 */ + {0.770f, 1.134f, 1.915f, 1.231f, 2.298f, 3.880f, }, /* (31.995) 32 */ + {1.025f, 0.709f, 1.731f, 1.231f, 2.298f, 3.880f, }, /* (32.996) 33 */ + {0.967f, 0.713f, 1.653f, 1.840f, 1.100f, 2.829f, }, /* (33.994) 34 */ + {0.989f, 0.698f, 1.601f, 1.086f, 1.964f, 2.882f, }, /* (34.954) 35 */ + {0.602f, 0.869f, 1.418f, 1.264f, 0.764f, 2.218f}, /* 36 */ /* mode 10 AUDIO_WB LVQ bitrate 15-36 + 4 + 1*/ + + {0.853f, 1.769f, 4.425f, 1.000f, 1.000f, 1.000f}, /* 17 */ + {1.011f, 1.663f, 4.403f, 1.578f, 0.000f, 0.000f}, /* 21 */ + {1.011f, 1.663f, 4.403f, 1.202f, 2.424f, 0.000f}, /* 22 */ + {0.881f, 1.618f, 4.136f, 1.202f, 2.424f, 0.000f}, /* 25 */ + {0.847f, 1.791f, 4.466f, 1.202f, 2.424f, 0.000f}, /* 26 */ + {0.670f, 1.112f, 2.389f, 1.202f, 2.424f, 0.000f}, /* 28 */ /* mode 11 AUDIO_NB */ + + {1.131f, 1.815f, 0.796f, 1.265f, 2.794f, 0.000f, }, /* 26 */ + {0.570f, 0.804f, 1.197f, 1.162f, 1.949f, 0.728f, }, /* 36*/ /* mode 12 AUDIO_WB 16k bitrate 15-36 + 4 + 1*/ + + {1.045f, 1.586f, 3.754f, 1.669f, 0.000f, 0.000f, }, /* 22 (21.776) */ + {1.100f, 1.604f, 2.295f, 1.334f, 2.423f, 0.000f, }, /* (22.959) 23 */ + {1.091f, 1.752f, 3.164f, 1.407f, 0.000f, 0.000f, }, /* (23.949) 24 */ + {1.091f, 1.752f, 3.164f, 1.346f, 2.525f, 0.000f, }, /* (24.889) 25 */ + {1.091f, 1.752f, 3.164f, 1.089f, 1.684f, 2.523f, }, /* (25.821) 26 */ + {0.940f, 1.349f, 1.903f, 1.199f, 1.790f, 2.564f, }, /* (26.982) 27 */ + {0.880f, 1.280f, 2.824f, 1.099f, 1.735f, 0.000f, }, /* 28 (27.994) */ + {0.831f, 1.215f, 2.927f, 1.089f, 1.708f, 2.479f, }, /* 29 (28.996) */ + {0.870f, 1.327f, 2.906f, 1.066f, 1.719f, 2.676f, }, /* 30 (29.991) */ + {0.765f, 3.115f, 1.818f, 1.123f, 2.309f, 4.775f, }, /* (30.985) 31 */ + {0.772f, 1.122f, 2.351f, 1.446f, 0.944f, 2.072f, }, /* 32 (31.992) */ + {0.701f, 0.977f, 1.738f, 0.947f, 1.453f, 2.082f, }, /* 33 (32.993) */ + {0.719f, 1.021f, 1.701f, 1.119f, 0.794f, 1.696f, }, /* 34 (33.968) */ + {0.839f, 0.640f, 1.522f, 1.118f, 1.697f, 0.796f, }, /* (34.968) 35 */ + {0.839f, 0.640f, 1.522f, 0.961f, 1.469f, 0.707f, }, /* (35.990) 36 */ + {0.640f, 0.884f, 1.732f, 0.755f, 1.090f, 1.548f, }, /* 37 (36.995) */ /* VOICED 16k */ + /* 5sf */ + {1.218f, 0.796f, 2.283f, 1.290f, 3.325f, 0.000f, }, /* 25 (24.980) */ + {1.590f, 0.835f, 4.436f, 1.097f, 3.070f, 0.000f, }, /* 25 (24.974) */ + {0.994f, 2.617f, 0.000f, 1.091f, 2.233f, 3.457f, }, /* 25 (24.852) */ + {0.887f, 1.573f, 3.543f, 1.088f, 1.827f, 3.067f, }, /* 25 (24.994) */ + {0.837f, 1.238f, 1.903f, 1.298f, 2.797f, 0.000f, }, /* 25 (24.996) */ + {1.138f, 2.826f, 0.000f, 1.106f, 2.796f, 4.391f, }, /* 25 (24.671) */ + + /* 4sf */ + {0.941f, 1.931f, 4.473f, 0.681f, 1.266f, 2.328f, }, /* 25 (24.936) */ + {1.352f, 4.332f, 0.000f, 0.820f, 1.545f, 4.175f, }, /* 25 (24.955) */ + {1.343f, 3.607f, 0.000f, 0.859f, 1.453f, 2.590f, }, /* 25 (24.853) */ + {1.208f, 2.740f, 0.000f, 0.759f, 1.240f, 2.182f, }, /* 25 (24.881) */ + {1.123f, 2.736f, 0.000f, 0.874f, 1.498f, 2.586f, }, /* 25 (24.939) */ + {0.919f, 2.471f, 0.000f, 0.615f, 1.072f, 2.096f, }, /* 25 (24.996) */ + {1.548f, 4.508f, 0.000f, 0.825f, 2.178f, 4.305f, }, /* 25 (24.310) */ + {1.217f, 2.898f, 0.000f, 0.737f, 1.217f, 1.930f, }, /* 25 (24.955) */ + {0.976f, 2.190f, 5.716f, 1.506f, 0.642f, 4.211f, }, /* 25 (24.984) */ + {1.107f, 2.595f, 0.000f, 1.302f, 0.604f, 0.880f, }, /* 25 (24.866) */ +}; + +const float scales_p[][MAX_NO_SCALES*2]= /* 2 subvectors 20 modes */ +{ + {1.464f, 2.374f, 0.000f, 0.000f, 0.000f, 0.000f, }, /* 9 (8.464) */ + {1.284f, 2.159f, 0.000f, 0.000f, 0.000f, 0.000f, }, /* (8.910) 9 */ + {1.245f, 2.590f, 0.000f, 0.000f, 0.000f, 0.000f, }, /* (10.659) 11 */ + {1.142f, 1.858f, 2.927f, 0.000f, 0.000f, 0.000f, }, /* (11.925) 12 */ + {1.038f, 1.837f, 3.009f, 0.000f, 0.000f, 0.000f, }, /* (12.997) 13 */ + {1.515f, 0.000f, 0.000f, 1.540f, 0.000f, 0.000f, }, /* (13.640) 14 */ + {1.584f, 0.000f, 0.000f, 1.540f, 0.000f, 0.000f, }, /* (14.733) 15 */ + {1.584f, 0.000f, 0.000f, 1.620f, 0.000f, 0.000f, }, /* (15.826) 16 */ + {1.284f, 2.159f, 0.000f, 1.620f, 0.000f, 0.000f, }, /* (16.823) 17 */ + {1.245f, 2.590f, 0.000f, 1.540f, 0.000f, 0.000f, }, /* (17.479) 18 */ + {1.265f, 2.564f, 0.000f, 1.638f, 0.000f, 0.000f, }, /* 19 (18.572) */ + {1.142f, 1.858f, 2.927f, 1.620f, 0.000f, 0.000f, }, /* (19.838) 20 */ + {1.038f, 1.837f, 3.009f, 1.620f, 0.000f, 0.000f, }, /* (20.910) 21 */ + {0.988f, 1.661f, 2.539f, 1.620f, 0.000f, 0.000f, }, /* (21.776) 22 */ + {1.063f, 1.703f, 2.805f, 1.294f, 2.353f, 0.000f, }, /* 23 (22.959) */ + {1.063f, 1.917f, 3.063f, 1.365f, 0.000f, 0.000f, }, /* 24 (23.949) */ + {0.914f, 1.412f, 2.223f, 1.294f, 2.353f, 0.000f, }, /* 25 (24.992) */ + {0.900f, 1.410f, 2.254f, 1.298f, 2.413f, 0.000f, }, /* (25.718) 26 */ + {0.882f, 1.401f, 2.402f, 1.313f, 2.441f, 0.000f, }, /* 27 (26.902) */ + {1.356f, 0.867f, 2.377f, 1.070f, 1.686f, 2.546f, }, /* 28 (27.996) */ + {0.846f, 1.348f, 2.546f, 1.076f, 1.742f, 2.658f, }, /* 29 (28.937) */ + {0.845f, 1.379f, 2.566f, 1.019f, 1.577f, 2.443f, }, /* 30 (29.954) */ + {0.756f, 1.189f, 2.799f, 1.084f, 1.804f, 2.758f, }, /* 31 (30.978) */ + {0.755f, 1.218f, 2.821f, 0.944f, 1.433f, 1.973f, }, /* 32 (31.978) */ + {0.745f, 1.197f, 2.898f, 1.242f, 0.843f, 1.952f, }, /* (32.988) 33 */ + {0.724f, 1.235f, 2.942f, 1.255f, 0.848f, 2.000f, }, /* 34 (33.975) */ + {0.687f, 1.113f, 2.338f, 0.853f, 1.328f, 1.944f, }, /* 35 (34.975) */ + {0.648f, 1.029f, 1.836f, 0.854f, 1.356f, 1.961f, }, /* 36 (35.889) */ + {0.607f, 0.934f, 1.517f, 0.783f, 1.213f, 1.534f, }, /* (36.996) 37 */ + {0.599f, 0.905f, 1.529f, 0.731f, 1.111f, 1.500f, }, /* (37.993) 38 */ + {0.648f, 1.029f, 1.836f, 0.687f, 1.058f, 1.900f, }, /* 39 (38.488) */ /* V WB*/ + + {1.613f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, }, /* 8 (7.913) */ + {1.267f, 2.475f, 0.000f, 1.619f, 0.000f, 0.000f, }, /* 19 (18.572) */ + {1.014f, 1.630f, 2.464f, 1.285f, 2.151f, 0.000f, }, /* 23 (22.773) */ + {0.893f, 1.390f, 2.314f, 1.465f, 2.299f, 0.000f, }, /* 24 (23.999) */ + {0.930f, 1.401f, 2.150f, 1.280f, 2.254f, 0.000f, }, /* 25 (24.992) */ + {0.893f, 1.390f, 2.314f, 1.276f, 2.206f, 2.984f, }, /* 27 (26.962) */ + {0.893f, 1.390f, 2.314f, 1.036f, 1.646f, 2.471f, }, /* 28 (27.835) */ + {0.857f, 1.337f, 2.464f, 1.043f, 1.730f, 2.625f, }, /* 29 (28.937) */ + {0.765f, 1.219f, 1.553f, 1.036f, 1.646f, 2.471f, }, /* 30 (29.969) */ + {0.789f, 1.328f, 1.652f, 1.052f, 1.784f, 2.706f, }, /* 31 (30.952) */ + {0.764f, 1.224f, 1.555f, 0.920f, 1.443f, 2.035f, }, /* 32 (31.978) */ + {0.663f, 1.061f, 1.238f, 1.379f, 0.898f, 1.951f, }, /* 34 (33.992) */ + {0.673f, 1.104f, 1.306f, 1.259f, 0.828f, 1.954f, }, /* 35 (35.000) */ + {0.666f, 1.071f, 1.249f, 0.803f, 1.241f, 1.729f, }, /* 36 (35.980) */ + {0.658f, 1.039f, 1.214f, 0.950f, 0.651f, 1.429f, }, /* 39 (38.512) */ /* V NB*/ + + {1.600f, 0.000f, 0.000f, 1.553f, 0.000f, 0.000f, }, /* 15 (14.733) */ + {1.306f, 2.427f, 0.000f, 1.580f, 0.000f, 0.000f, }, /* (15.730) 16 */ + {1.306f, 2.427f, 0.000f, 1.676f, 0.000f, 0.000f, }, /* (16.823) 17 */ + {1.250f, 2.894f, 0.000f, 1.580f, 0.000f, 0.000f, }, /* (17.479) 18 */ + {1.134f, 1.986f, 3.295f, 1.553f, 0.000f, 0.000f, }, /* 19 (18.745) */ + {1.143f, 2.052f, 3.345f, 1.676f, 0.000f, 0.000f, }, /* (19.838) 20 */ + {1.044f, 2.031f, 3.487f, 1.676f, 0.000f, 0.000f, }, /* (20.910) 21 */ + {0.987f, 1.788f, 2.659f, 1.647f, 0.000f, 0.000f, }, /* 22 (21.776) */ + {0.899f, 1.602f, 2.579f, 1.647f, 0.000f, 0.000f, }, /* 23 (22.791) */ + {0.797f, 1.294f, 2.140f, 1.647f, 0.000f, 0.000f, }, /* 24 (23.999) */ + {0.797f, 1.294f, 2.140f, 1.335f, 2.225f, 0.000f, }, /* 25 (24.996) */ + {0.741f, 1.151f, 1.816f, 1.335f, 2.225f, 0.000f, }, /* 26 (25.934) */ + {0.980f, 1.702f, 0.706f, 1.317f, 2.628f, 0.000f, }, /* (26.887) 27 */ + {0.797f, 1.294f, 2.140f, 1.186f, 1.932f, 0.000f, }, /* 28 (27.969) */ + {0.741f, 1.151f, 1.816f, 1.164f, 1.823f, 2.769f, }, /* 29 (28.996) */ + {0.708f, 1.126f, 1.953f, 1.076f, 1.730f, 2.777f, }, /* 30 (29.988) */ + {0.660f, 1.049f, 1.571f, 1.076f, 1.730f, 2.777f, }, /* 31 (30.931) */ + {0.662f, 1.026f, 1.554f, 1.074f, 1.913f, 3.022f, }, /* 32 (31.987) */ + {0.660f, 1.049f, 1.571f, 1.439f, 0.926f, 2.131f, }, /* 33 (32.982) */ + {0.630f, 0.966f, 1.522f, 1.312f, 0.881f, 2.207f, }, /* 34 (33.967) */ + {0.617f, 0.921f, 1.447f, 1.032f, 1.549f, 0.756f, }, /* 35 (34.994) */ /* G WB*/ + + {1.595f, 0.000f, 0.000f, 1.502f, 0.000f, 0.000f, }, /* 15 (14.733) */ + {1.123f, 1.946f, 3.732f, 1.502f, 0.000f, 0.000f, }, /* 19 (18.792) */ + {1.033f, 2.075f, 4.339f, 1.419f, 2.446f, 0.000f, }, /* 22 (21.985) */ + {0.985f, 1.793f, 5.965f, 1.281f, 2.324f, 0.000f, }, /* 23 (22.773) */ + {0.881f, 1.606f, 6.995f, 1.419f, 2.446f, 0.000f, }, /* 24 (23.932) */ + {0.844f, 1.582f, 7.020f, 1.281f, 2.324f, 0.000f, }, /* 25 (24.955) */ + {0.789f, 1.520f, 7.203f, 1.281f, 2.324f, 0.000f, }, /* 26 (25.991) */ + {0.869f, 1.547f, 6.995f, 1.030f, 1.754f, 3.102f, }, /* 28 (27.979) */ + {0.817f, 1.492f, 7.120f, 1.030f, 1.754f, 3.102f, }, /* 29 (28.878) */ + {0.755f, 1.382f, 7.133f, 1.030f, 1.754f, 3.102f, }, /* 30 (29.954) */ + {0.706f, 1.315f, 7.225f, 1.030f, 1.754f, 3.102f, }, /* 31 (30.893) */ + {0.689f, 1.296f, 7.290f, 1.016f, 1.875f, 3.239f, }, /* 32 (31.963) */ + {0.698f, 1.275f, 7.209f, 0.914f, 1.548f, 2.433f, }, /* 33 (32.997) */ + {0.679f, 1.315f, 7.290f, 1.229f, 1.845f, 0.813f, }, /* 34 (33.986) */ + {0.679f, 1.315f, 7.290f, 1.188f, 0.772f, 1.955f, }, /* 35 (34.952) */ /* G NB*/ + + {1.011f, 1.777f, 2.760f, 1.614f, 0.000f, 0.000f, }, /* 21 */ + {0.964f, 1.580f, 3.996f, 1.729f, 0.000f, 0.000f, }, /* (21.776) 22 */ + {0.878f, 1.440f, 2.289f, 1.729f, 0.000f, 0.000f, }, /* (22.784) 23 */ + {0.852f, 1.643f, 2.429f, 1.729f, 0.000f, 0.000f, }, /* (23.980) 24 */ + {0.853f, 1.382f, 2.066f, 1.245f, 2.679f, 0.000f, }, /* 25 */ + { 1.207f, 0.778f, 2.208f, 1.245f, 2.679f, 0.000f, }, /* 26 */ + {0.804f, 1.354f, 2.647f, 1.408f, 2.615f, 0.000f, }, /* (26.931) 27 */ + {0.782f, 1.254f, 2.799f, 1.378f, 2.708f, 0.000f, }, /* (27.977) 28 */ + { 1.207f, 0.778f, 2.208f, 1.013f, 1.832f, 3.053f, }, /* 29 */ + {1.207f, 0.778f, 2.208f, 1.420f, 0.872f, 2.330f, }, /* 30 */ + {0.683f, 1.016f, 1.788f, 1.126f, 1.886f, 2.924f, }, /* (30.993) 31 */ + {0.627f, 0.917f, 1.448f, 1.126f, 1.886f, 2.924f, }, /* (31.998) 32 */ + {0.658f, 1.028f, 1.557f, 1.482f, 0.975f, 2.147f, }, /* (32.996) 33 */ + {0.794f, 0.580f, 1.331f, 1.482f, 0.975f, 2.147f, }, /* (33.994) 34 */ + {0.823f, 0.592f, 1.323f, 1.346f, 0.895f, 2.308f, }, /* (34.999) 35 */ + {1.098f, 0.738f, 0.555f, 0.869f, 1.290f, 1.862f, }, /* (35.984) 36 */ + {0.758f, 1.111f, 0.550f, 0.871f, 1.367f, 1.906f, }, /* (36.969) 37 */ + {0.551f, 0.766f, 1.116f, 0.791f, 1.201f, 1.663f, }, /* (37.971) 38 */ + {0.551f, 0.766f, 1.116f, 0.963f, 0.697f, 1.323f, }, /* (38.973) 39 */ + {0.525f, 0.770f, 1.073f, 0.815f, 1.237f, 0.567f,}, /* 40 */ /* mode 7 AUDIO_WB 19-40 + 0 + 1 */ + + {1.070f, 1.791f, 3.903f, 1.599f, 0.000f, 0.000f}, /* 21 */ + {0.820f, 1.217f, 2.089f, 1.255f, 2.290f, 0.000f}, /* 25 */ + {0.780f, 1.169f, 2.495f, 1.255f, 2.290f, 0.000f}, /* 26 */ + {1.075f, 0.723f, 2.361f, 1.110f, 1.961f, 3.491f}, /* 30 */ + {0.691f, 1.029f, 2.337f, 1.034f, 1.791f, 4.004f}, /* 31 */ + {0.671f, 1.076f, 2.606f, 0.955f, 1.547f, 2.514f}, /* 32 */ /*mode 8 AUDIO_NB */ + + {1.184f, 0.776f, 2.117f, 1.057f, 1.670f, 0.674f,}, /* 30 */ + {0.946f, 1.448f, 2.723f, 1.394f, 2.645f, 4.581f, }, /* (30.967) 31 */ + {0.948f, 1.454f, 2.723f, 1.970f, 1.174f, 3.484f, }, /* (31.990) 32 */ + {0.885f, 1.406f, 2.763f, 1.970f, 1.174f, 3.484f, }, /* (32.979) 33 */ + {1.245f, 0.842f, 2.378f, 1.999f, 1.168f, 3.682f, }, /* (33.989) 34 */ + {0.870f, 1.346f, 2.814f, 1.744f, 1.058f, 2.897f, }, /* (34.991) 35 */ + {0.827f, 1.219f, 2.176f, 1.588f, 2.600f, 0.995f, }, /* (35.990) 36 */ + {0.817f, 1.186f, 1.992f, 1.593f, 0.974f, 2.619f, }, /* (36.986) 37 */ + {0.822f, 1.205f, 2.099f, 1.464f, 0.904f, 2.398f, }, /* (37.982) 38 */ + {0.822f, 1.205f, 2.099f, 2.053f, 0.837f, 1.359f, }, /* (38.995) 39 */ + {0.521f, 0.747f, 1.033f, 0.796f, 1.333f, 0.542f,}, /* 40 */ /* mode 9 AUDIO_WB 16k 30-40 + 5 MA pred for WB2 (AV: not used?)*/ + + {1.679f, 0.000f, 0.000f, 1.282f, 2.471f, 0.000f, }, /* 17 (16.823) */ + {1.088f, 1.849f, 3.195f, 1.687f, 0.000f, 0.000f, }, /* 21 (20.910) */ + {1.088f, 1.849f, 3.195f, 1.282f, 2.471f, 0.000f, }, /* 22 (21.907) */ + {1.126f, 1.689f, 0.790f, 1.282f, 2.471f, 0.000f, }, /* 25 (24.863) */ + {0.930f, 1.382f, 0.682f, 1.282f, 2.471f, 0.000f, }, /* 26 (25.921) */ + {1.115f, 0.794f, 1.852f, 1.281f, 3.033f, 0.000f, }, /* 27 (26.837) */ + {0.840f, 1.376f, 0.623f, 0.800f, 1.416f, 4.260f, }, /* 36 (35.998) */ /* INACTIVE NB */ + + {0.801f, 1.148f, 1.802f, 0.000f, 0.000f, 0.000f, }, /* 17 (16.932) */ + {1.344f, 2.627f, 0.000f, 1.574f, 0.000f, 0.000f, }, /* (17.479) 18 */ + {1.260f, 2.045f, 0.000f, 1.574f, 0.000f, 0.000f, }, /* (18.703) 19 */ + {1.260f, 2.045f, 0.000f, 1.675f, 0.000f, 0.000f, }, /* (19.796) 20 */ + {1.089f, 1.812f, 3.172f, 1.677f, 0.000f, 0.000f, }, /* 21 (20.910) */ + {1.089f, 1.904f, 3.221f, 1.521f, 2.635f, 0.000f, }, /* 22 (21.985) */ + {0.963f, 1.440f, 2.117f, 1.675f, 0.000f, 0.000f, }, /* (22.934) 23 */ + {0.963f, 1.440f, 2.117f, 1.302f, 2.410f, 0.000f, }, /* (23.931) 24 */ + {0.845f, 1.212f, 1.934f, 1.313f, 2.419f, 0.000f, }, /* 25 (24.845) */ + {0.779f, 1.095f, 1.700f, 1.313f, 2.419f, 0.000f, }, /* 26 (25.999) */ + {0.723f, 1.015f, 1.664f, 1.313f, 2.419f, 0.000f, }, /* 27 (26.981) */ + {1.009f, 1.667f, 0.752f, 1.307f, 3.021f, 0.000f, }, /* (27.988) 28 */ + {1.005f, 1.647f, 0.749f, 1.064f, 1.871f, 3.348f, }, /* (28.936) 29 */ + {0.895f, 1.490f, 0.682f, 1.064f, 1.871f, 3.348f, }, /* (29.855) 30 */ + {0.787f, 1.272f, 0.608f, 1.064f, 1.871f, 3.348f, }, /* (30.968) 31 */ + {0.861f, 0.648f, 1.459f, 1.064f, 1.871f, 3.348f, }, /* (31.943) 32 */ + {0.829f, 0.631f, 1.337f, 1.059f, 2.032f, 3.428f, }, /* (32.999) 33 */ + {0.861f, 0.648f, 1.459f, 1.541f, 0.920f, 2.511f, }, /* (33.994) 34 */ + {0.848f, 0.633f, 1.358f, 1.408f, 0.879f, 2.711f, }, /* (34.989) 35 */ + {0.893f, 0.652f, 1.438f, 1.076f, 0.720f, 1.794f, }, /* 36 (35.929) */ /* INACTIVE WB*/ + + {1.359f, 2.306f, 0.000f, 1.669f, 0.000f, 0.000f, }, /* 17 (16.823) */ + {1.077f, 1.927f, 3.546f, 1.669f, 0.000f, 0.000f, }, /* 21 (20.910) */ + {1.077f, 2.032f, 3.578f, 1.429f, 2.711f, 0.000f, }, /* 22 (21.985) */ + {0.833f, 1.253f, 2.105f, 1.283f, 2.556f, 0.000f, }, /* 25 (24.845) */ + {0.776f, 1.152f, 1.858f, 1.283f, 2.556f, 0.000f, }, /* 26 (25.934) */ + {0.719f, 1.066f, 1.732f, 1.283f, 2.556f, 0.000f, }, /* 27 (26.914) */ + {0.941f, 0.651f, 1.565f, 0.722f, 1.190f, 1.940f, }, /* 36 (35.915) */ /* INACTIVE 16k*/ + + {1.292f, 2.479f, 0.000f, 1.541f, 0.000f, 0.000f, }, /* 18 (17.479) */ + {1.202f, 1.903f, 0.000f, 1.541f, 0.000f, 0.000f, }, /* 19 (18.703) */ + {1.028f, 1.641f, 2.455f, 1.648f, 0.000f, 0.000f, }, /* 22 (21.776) */ + {1.247f, 0.878f, 2.329f, 1.648f, 0.000f, 0.000f, }, /* 23 (22.791) */ + {0.863f, 1.358f, 2.522f, 1.648f, 0.000f, 0.000f, }, /* 24 (23.999) */ + {0.817f, 1.222f, 2.010f, 1.074f, 1.785f, 2.733f, }, /* 29 (28.966) */ + {0.815f, 0.612f, 1.281f, 1.055f, 1.724f, 2.952f, }, /* 32 (31.990) */ /* UNVOICED NB */ + {1.545f, 0.000f, 0.000f, 1.548f, 0.000f, 0.000f, }, /* 14 (13.640) */ + {1.640f, 0.000f, 0.000f, 1.548f, 0.000f, 0.000f, }, /* 15 (14.733) */ + {1.330f, 0.000f, 0.000f, 1.597f, 0.000f, 0.000f, }, /* (15.826) 16 */ + {1.235f, 2.316f, 0.000f, 1.597f, 0.000f, 0.000f, }, /* (16.376) 17 */ + {1.287f, 2.749f, 0.000f, 1.548f, 0.000f, 0.000f, }, /* 18 (17.479) */ + {1.287f, 2.749f, 0.000f, 1.654f, 0.000f, 0.000f, }, /* 19 (18.572) */ + {1.190f, 2.026f, 0.000f, 1.654f, 0.000f, 0.000f, }, /* 20 (19.796) */ + {0.952f, 1.674f, 2.762f, 1.597f, 0.000f, 0.000f, }, /* (20.910) 21 */ + {0.918f, 1.571f, 3.210f, 1.597f, 0.000f, 0.000f, }, /* (21.776) 22 */ + {1.256f, 0.792f, 2.078f, 1.597f, 0.000f, 0.000f, }, /* (22.784) 23 */ + {0.757f, 1.203f, 1.874f, 1.597f, 0.000f, 0.000f, }, /* (23.999) 24 */ + {0.931f, 1.458f, 2.450f, 1.294f, 2.742f, 0.000f, }, /* 25 (24.992) */ + {1.117f, 0.736f, 1.875f, 1.251f, 2.567f, 0.000f, }, /* (25.993) 26 */ + {0.772f, 1.236f, 1.921f, 1.251f, 2.567f, 0.000f, }, /* (26.883) 27 */ + {0.877f, 1.396f, 2.737f, 1.081f, 1.816f, 3.360f, }, /* 28 (27.996) */ /* UNVOICED WB*/ + + {1.131f, 1.636f, 0.000f, 1.371f, 0.000f, 0.000f, }, /* 24 (23.818) */ + {0.892f, 1.592f, 3.424f, 1.298f, 3.206f, 0.000f, }, /* (24.961) 25 */ + {0.875f, 1.547f, 3.459f, 1.285f, 2.899f, 4.150f, }, /* (25.964) 26 */ + {0.846f, 1.650f, 3.307f, 1.275f, 2.446f, 4.005f, }, /* (26.946) 27 */ + {0.808f, 3.069f, 1.716f, 1.275f, 2.446f, 4.005f, }, /* (27.856) 28 */ + {0.765f, 3.128f, 1.823f, 1.275f, 2.446f, 4.005f, }, /* (28.977) 29 */ + {0.934f, 1.277f, 0.728f,1.157f, 1.697f, 0.000f, }, /* 30 (29.992) */ + {0.833f, 1.162f, 0.658f,1.151f, 1.687f, 0.000f, }, /* 31 (30.998) */ + {0.751f, 1.032f, 0.598f,1.151f, 1.687f, 0.000f, }, /* 32 (31.987) */ + {0.759f, 3.138f, 1.845f, 0.922f, 1.508f, 3.110f, }, /* (32.975) 33 */ + {0.709f, 1.005f, 0.570f, 1.060f, 1.772f, 2.719f, }, /* 34 (33.994) */ + {0.746f, 1.001f, 0.601f,1.004f, 1.803f, 2.892f, }, /* 35 (35.000) */ + {0.743f, 1.000f, 0.599f,0.936f, 1.861f, 2.874f, }, /* 36 (35.994) */ + {0.750f, 3.170f, 1.925f, 0.737f, 1.423f, 2.687f, } , /* (36.977) 37 */ + {0.750f, 3.170f, 1.925f, 0.659f, 1.059f, 1.975f, }, /* (37.984) 38 */ + {0.775f, 0.614f, 1.037f, 0.796f, 1.304f, 1.905f, }, /* 39 (38.301) */ /* VOICED 16k */ + + {0.894f, 1.339f, 2.549f, 1.308f, 2.601f, 0.000f, }, /* 26 (25.917) */ + {0.832f, 1.254f, 1.937f, 1.307f, 2.614f, 0.000f, }, /* (26.887) 27 */ + {0.832f, 1.232f, 1.916f, 1.158f, 1.977f, 0.000f, }, /* (27.974) 28 */ + {0.825f, 1.260f, 1.993f, 1.023f, 1.739f, 2.796f, }, /* (28.910) 29 */ + {0.750f, 1.114f, 1.563f, 1.045f, 1.802f, 2.681f, }, /* (29.976) 30 */ + {0.692f, 1.000f, 1.431f, 1.023f, 1.739f, 2.796f, }, /* (30.956) 31 */ + {0.720f, 1.012f, 1.598f, 1.512f, 0.926f, 2.137f, }, /* 32 (31.980) */ + {0.681f, 0.973f, 1.649f, 1.381f, 0.876f, 2.129f, }, /* 33 (32.990) */ + {0.684f, 0.964f, 1.640f, 1.168f, 1.776f, 0.787f, }, /* 34 (33.974) */ + {0.668f, 0.935f, 1.551f, 1.016f, 1.518f, 0.712f, }, /* 35 (34.989) */ + {0.659f, 0.911f, 1.425f, 1.337f, 0.889f, 0.642f, }, /* 36 (35.988) */ + {0.659f, 0.911f, 1.425f, 0.839f, 1.287f, 0.607f, }, /* 37 (36.989) */ /* GENERIC 16k*/ + + {1.633f, 0.000f, 0.000f, 1.687f, 0.000f, 0.000f, }, /* 16 (15.826) */ + {1.691f, 0.000f, 0.000f, 1.674f, 0.000f, 0.000f, }, /* (15.826) 16 */ + {1.328f, 2.564f, 0.000f, 1.553f, 0.000f, 0.000f, }, /* (17.479) 18 */ + {1.250f, 1.992f, 0.000f, 1.553f, 0.000f, 0.000f, }, /* (18.703) 19 */ + {1.250f, 1.992f, 0.000f, 1.674f, 0.000f, 0.000f, }, /* (19.796) 20 */ + {1.076f, 1.790f, 2.942f, 1.687f, 0.000f, 0.000f, }, /* 21 (20.910) */ + {1.066f, 1.683f, 4.077f, 1.674f, 0.000f, 0.000f, }, /* (21.776) 22 */ + {1.280f, 0.911f, 2.477f, 1.674f, 0.000f, 0.000f, }, /* (22.791) 23 */ + {0.834f, 1.229f, 1.890f, 1.687f, 0.000f, 0.000f, }, /* 24 (23.999) */ + {0.938f, 1.404f, 2.153f, 1.306f, 2.630f, 0.000f, }, /* 25 (24.992) */ + {1.340f, 0.886f, 2.320f, 1.306f, 2.630f, 0.000f, }, /* 26 (25.917) */ + {0.833f, 1.250f, 1.908f, 1.306f, 2.630f, 0.000f, }, /* 27 (26.883) */ + {0.833f, 1.213f, 1.873f, 1.125f, 1.839f, 2.819f, }, /* 28 (27.901) */ + {0.854f, 1.267f, 1.828f, 1.044f, 1.760f, 2.882f, }, /* (28.937) 29 */ + {0.765f, 1.162f, 1.690f, 1.024f, 1.738f, 2.838f, }, /* 30 (29.916) */ + {0.725f, 1.050f, 1.791f, 1.480f, 0.922f, 3.104f, }, /* 31 (30.993) */ + {0.712f, 1.012f, 1.549f, 1.494f, 0.903f, 3.364f, }, /* 32 (31.980) */ + {0.659f, 0.927f, 1.357f, 1.494f, 0.903f, 3.364f, }, /* 33 (32.958) */ + {0.822f, 0.614f, 1.288f, 0.910f, 1.509f, 2.255f, }, /* 34 (33.987) */ + {0.841f, 0.624f, 1.278f, 1.161f, 0.762f, 1.808f, }, /* 35 (34.994) */ + {0.838f, 0.622f, 1.266f, 1.080f, 0.711f, 1.710f, }, /* 36 (35.968) */ + {0.832f, 0.619f, 1.275f, 0.938f, 1.430f, 0.644f, }, /* 37 (36.971) */ /* GENERIC 12.8k MA*/ + + {0.884f, 1.349f, 2.570f, 1.314f, 2.609f, 0.000f, }, /* 26 (25.917) */ + {0.981f, 1.473f, 2.784f, 1.690f, 3.342f, 0.000f, }, /* (26.981) 27 */ + {0.965f, 1.514f, 2.686f, 1.409f, 2.485f, 3.946f, }, /* (27.989) 28 */ + {0.976f, 1.457f, 2.663f, 2.151f, 1.271f, 4.176f, }, /* (28.976) 29 */ + {0.991f, 1.504f, 3.086f, 2.486f, 1.315f, 4.530f, }, /* (29.968) 30 */ + {0.946f, 1.448f, 2.723f, 1.394f, 2.645f, 4.581f, }, /* (30.967) 31 */ + {0.711f, 1.018f, 1.615f, 1.482f, 0.921f, 3.431f, }, /* 32 (31.980) */ + {0.679f, 0.974f, 1.659f, 0.948f, 1.549f, 3.448f, }, /* 33 (32.995) */ + {0.831f, 0.618f, 1.481f, 0.933f, 1.514f, 2.310f, }, /* 34 (33.993) */ + {0.816f, 0.610f, 1.402f, 1.426f, 0.877f, 2.265f, }, /* 35 (34.992) */ + {0.787f, 1.257f, 0.596f, 0.859f, 1.447f, 2.431f, }, /* 36 (35.997) */ + {0.787f, 1.257f, 0.596f, 1.106f, 0.735f, 1.659f, }, /* 37 (36.961) */ /* AUDIO 16k */ +}; + +/* An 16-by-34 matrix in Scale = 20.48f */ +const float sigma_MSLVQ[][16] = +{ + { 1.0f }, /* IA NB */ + { 1.0f }, /* UV NB */ + {41.8457031f, 43.9453125f, 62.5976563f, 72.3632813f, 78.7597656f, 82.4707031f, 85.4492188f, 86.5722656f, 86.6210938f, 84.9121094f, 85.2050781f, 105.5664063f, 127.8320313f, 68.6523438f, 25.7324219f, 16.9433594f }, /* V NB */ + {48.9257813f, 50.5859375f, 71.0449219f, 72.4609375f, 74.5117188f, 77.8808594f, 79.5898438f, 80.8105469f, 79.9804688f, 74.5117188f, 70.0683594f, 88.7207031f, 119.1406250f, 102.0019531f, 37.1093750f, 25.0976563f }, /* G NB */ + {48.2421875f, 48.0468750f, 68.7500000f, 76.9531250f, 80.9570313f, 85.1562500f, 89.0625000f, 91.8457031f, 90.4296875f, 85.2050781f, 81.5917969f, 106.2988281f, 133.6425781f, 84.3750000f, 34.7656250f, 26.6113281f }, /* T NB */ + {85.5957031f, 82.9101563f, 99.5605469f, 105.9570313f, 106.6406250f, 106.8847656f, 101.6601563f, 99.5605469f, 97.7050781f, 97.0703125f, 97.1191406f, 117.8710938f, 128.1738281f, 153.9550781f, 33.1542969f, 14.5996094f },/* AU NB*/ + { 1.0f }, + { 1.0f }, /* UV WB*/ + {44.2382813f, 52.1972656f, 85.7910156f, 98.6816406f, 101.7089844f, 107.2753906f, 106.9824219f, 112.0605469f, 118.8476563f, 126.3183594f, 125.4882813f, 126.8554688f, 136.3281250f, 136.7675781f, 146.9726563f, 129.7851563f }, /* V WB */ + {61.8164063f, 69.8730469f, 94.6289063f, 97.0214844f, 96.0449219f, 101.3671875f, 100.5371094f, 104.3945313f, 108.5937500f, 106.9824219f, 107.9101563f, 112.8417969f, 120.7519531f, 120.6542969f, 122.0214844f, 119.6289063f }, /* G WB */ + {56.8847656f, 56.9335938f, 86.7187500f, 100.1953125f, 101.9042969f, 108.5449219f, 113.4765625f, 117.9199219f, 124.1699219f, 122.1679688f, 126.3183594f, 137.4023438f, 153.9550781f, 158.8867188f, 161.9140625f, 155.9570313f }, /* T WB */ + {84.8632813f, 88.6230469f, 112.0605469f, 118.3593750f, 123.3886719f, 121.0937500f, 115.4785156f, 118.7011719f, 118.5058594f, 119.0429688f, 123.9257813f, 127.6855469f, 138.5742188f, 125.2441406f, 118.9941406f, 109.0332031f },/* AU WB */ + { 1.0f }, + { 1.0f }, + {75.2441406f, 84.3261719f, 110.6933594f, 125.0000000f, 134.0332031f, 140.3808594f, 146.6308594f, 159.5214844f, 161.3281250f, 173.9746094f, 186.9628906f, 190.9667969f, 196.2402344f, 181.9335938f, 177.9785156f, 187.2070313f }, /* VO 16k */ + {89.6972656f, 92.9687500f, 122.0703125f, 129.0527344f, 130.4687500f, 128.3691406f, 132.5683594f, 139.2578125f, 137.9882813f, 139.9902344f, 152.8320313f, 157.3730469f, 172.4121094f, 179.4433594f, 147.9980469f, 194.1894531f }, /* G 16k */ + {90.3320313f, 108.3496094f, 118.7500000f, 125.7324219f, 135.7421875f, 137.9882813f, 143.0175781f, 145.1660156f, 145.8007813f, 155.1757813f, 171.2402344f, 176.1230469f, 165.4785156f, 161.3769531f, 148.6816406f, 174.4140625f }, /* T 16k */ + {103.1250000f, 112.3046875f, 142.3339844f, 150.6347656f, 150.0488281f, 145.8496094f, 149.3164063f, 145.8496094f, 153.5156250f, 157.3242188f, 175.0000000f, 170.9960938f, 157.4707031f, 168.1152344f, 156.5917969f, 229.0527344f },/* AU 16k */ + {87.5488281f, 116.4062500f, 102.3925781f, 103.1738281f, 100.8789063f, 95.2636719f, 101.7578125f, 110.5468750f, 122.2167969f, 115.2343750f, 107.2753906f, 108.8378906f, 101.7089844f, 111.5722656f, 111.6699219f, 155.9570313f }, + {160.5957031f, 122.6074219f, 117.4804688f, 129.7363281f, 130.9570313f, 133.8378906f, 139.1601563f, 159.9121094f, 168.0664063f, 161.3281250f, 141.9433594f, 142.1386719f, 132.0312500f, 129.8828125f, 122.9980469f, 160.9863281f }, + {53.2226563f, 105.1757813f, 133.9355469f, 143.3593750f, 158.2031250f, 168.1640625f, 160.5957031f, 164.4042969f, 173.4863281f, 182.0800781f, 170.0683594f, 165.3320313f, 128.1738281f, 96.5332031f, 91.9433594f, 93.7988281f }, + {69.5312500f, 169.0429688f, 118.9453125f, 104.6875000f, 100.7812500f, 98.3398438f, 98.8281250f, 95.9472656f, 97.8027344f, 97.6562500f, 95.8496094f, 99.8046875f, 94.3847656f, 106.5917969f, 117.1386719f, 144.7265625f }, + {136.1816406f, 130.5175781f, 130.9082031f, 133.3007813f, 131.3476563f, 129.1992188f, 133.8867188f, 166.1621094f, 197.0703125f, 281.9824219f, 305.7617188f, 255.8105469f, 392.7734375f, 336.6699219f, 135.2050781f, 96.7773438f }, + {123.0957031f, 119.6777344f, 126.3183594f, 119.5800781f, 117.3339844f, 108.4472656f, 107.9101563f, 112.2070313f, 148.2910156f, 153.9550781f, 127.6367188f, 129.9316406f, 132.5683594f, 149.3164063f, 144.6777344f, 244.6289063f }, + {92.3339844f, 97.5097656f, 94.0917969f, 90.2832031f, 94.1894531f, 95.8007813f, 92.8710938f, 86.4746094f, 83.8867188f, 74.1699219f, 70.8984375f, 69.3847656f, 71.5332031f, 167.2851563f, 71.8750000f, 21.5820313f }, + {44.0429688f, 73.9257813f, 140.6738281f, 121.8750000f, 129.5410156f, 127.3437500f, 115.7226563f, 104.8339844f, 106.2500000f, 110.0097656f, 125.0000000f, 107.5195313f, 85.6445313f, 79.2968750f, 69.9218750f, 55.9570313f }, + {106.4453125f, 99.4140625f, 95.6542969f, 92.7246094f, 94.3359375f, 92.0898438f, 83.6914063f, 84.7167969f, 87.1582031f, 101.6113281f, 91.1621094f, 75.3417969f, 73.0957031f, 71.5332031f, 68.0175781f, 63.7207031f }, + {43.3105469f, 125.5371094f, 107.4707031f, 85.4003906f, 83.1542969f, 80.7617188f, 78.8574219f, 80.0781250f, 80.1269531f, 88.0859375f, 93.2128906f, 81.3964844f, 74.8535156f, 73.0957031f, 65.8203125f, 59.3750000f }, + {149.6093750f, 127.3925781f, 117.1875000f, 111.9628906f, 113.4277344f, 113.8671875f, 107.8125000f, 97.9492188f, 100.7324219f, 113.5253906f, 167.9687500f, 203.4667969f, 154.9804688f, 119.1894531f, 107.1289063f, 104.8828125f }, + {59.5214844f, 86.2792969f, 106.0058594f, 113.7207031f, 134.4726563f, 120.9960938f, 120.4589844f, 100.4882813f, 98.5839844f, 100.0488281f, 132.3730469f, 191.8457031f, 194.7753906f, 77.8320313f, 70.0195313f, 41.9433594f }, + {88.2812500f, 92.3828125f, 92.1386719f, 93.5546875f, 97.6074219f, 92.7734375f, 89.0625000f, 87.2070313f, 88.8671875f, 94.1406250f, 121.5820313f, 121.9238281f, 116.7968750f, 122.1191406f, 164.5996094f, 140.4296875f }, + {86.2792969f, 92.8710938f, 83.5937500f, 86.0839844f, 95.8984375f, 95.2148438f, 90.5273438f, 86.5234375f, 82.1289063f, 81.3964844f, 77.9785156f, 89.4042969f, 143.7011719f, 168.3593750f, 41.5039063f, 27.6855469f }, + {97.1679688f, 101.0253906f, 104.3945313f, 110.4003906f, 108.7890625f, 107.4707031f, 97.8515625f, 92.6757813f, 79.1503906f, 81.6406250f, 77.1972656f, 108.8867188f, 212.2070313f, 198.8281250f, 47.4609375f, 35.3515625f }, + {74.8535156f, 97.3632813f, 100.1464844f, 91.6992188f, 90.3808594f, 89.6484375f, 83.2031250f, 84.0820313f, 81.9335938f, 96.4355469f, 110.9863281f, 92.6757813f, 83.4960938f, 82.1289063f, 77.8808594f, 70.8984375f} +}; + +/* An 16-by-34 matrix in Scale = 20.48f */ +const float inv_sigma_MSLVQ[][16] = +{ + {1.0f }, /* IA NB */ + {1.0f }, /* UV NB */ + {0.0238973f, 0.0227556f, 0.0159750f, 0.0138192f, 0.0126968f, 0.0121255f, 0.0117029f, 0.0115510f, 0.0115445f, 0.0117769f, 0.0117364f, 0.0094727f, 0.0078228f, 0.0145661f, 0.0388615f, 0.0590202f }, /* V NB */ + {0.0204391f, 0.0197683f, 0.0140756f, 0.0138005f, 0.0134207f, 0.0128401f, 0.0125644f, 0.0123746f, 0.0125031f, 0.0134207f, 0.0142718f, 0.0112713f, 0.0083934f, 0.0098037f, 0.0269474f, 0.0398444f }, /* G NB */ + {0.0207287f, 0.0208130f, 0.0145455f, 0.0129949f, 0.0123522f, 0.0117431f, 0.0112281f, 0.0108878f, 0.0110583f, 0.0117364f, 0.0122561f, 0.0094074f, 0.0074826f, 0.0118519f, 0.0287640f, 0.0375780f }, /* T NB */ + {0.0116828f, 0.0120612f, 0.0100441f, 0.0094378f, 0.0093773f, 0.0093559f, 0.0098367f, 0.0100441f, 0.0102349f, 0.0103018f, 0.0102966f, 0.0084838f, 0.0078019f, 0.0064954f, 0.0301620f, 0.0684950f }, /* AU NB */ + {1.0f }, + {1.0f }, /* UV WB */ + {0.0226049f, 0.0191581f, 0.0116562f, 0.0101336f, 0.0098320f, 0.0093218f, 0.0093473f, 0.0089237f, 0.0084141f, 0.0079165f, 0.0079689f, 0.0078830f, 0.0073352f, 0.0073117f, 0.0068040f, 0.0077050f }, /* V WB */ + {0.0161769f, 0.0143117f, 0.0105676f, 0.0103070f, 0.0104118f, 0.0098651f, 0.0099466f, 0.0095790f, 0.0092086f, 0.0093473f, 0.0092670f, 0.0088620f, 0.0082814f, 0.0082881f, 0.0081953f, 0.0083592f }, /* G WB */ + {0.0175794f, 0.0175643f, 0.0115315f, 0.0099805f, 0.0098131f, 0.0092128f, 0.0088124f, 0.0084803f, 0.0080535f, 0.0081855f, 0.0079165f, 0.0072779f, 0.0064954f, 0.0062938f, 0.0061761f, 0.0064120f }, /* T WB */ + {0.0117837f, 0.0112837f, 0.0089237f, 0.0084488f, 0.0081045f, 0.0082581f, 0.0086596f, 0.0084245f, 0.0084384f, 0.0084003f, 0.0080693f, 0.0078317f, 0.0072163f, 0.0079844f, 0.0084038f, 0.0091715f }, /* AU WB */ + {1.0f }, + {1.0f }, + {0.0132901f, 0.0118587f, 0.0090340f, 0.0080000f, 0.0074608f, 0.0071235f, 0.0068198f, 0.0062687f, 0.0061985f, 0.0057480f, 0.0053487f, 0.0052365f, 0.0050958f, 0.0054965f, 0.0056187f, 0.0053417f }, /* V 16k */ + {0.0111486f, 0.0107563f, 0.0081920f, 0.0077488f, 0.0076647f, 0.0077900f, 0.0075433f, 0.0071809f, 0.0072470f, 0.0071434f, 0.0065431f, 0.0063543f, 0.0058001f, 0.0055728f, 0.0067568f, 0.0051496f }, /* G 16k */ + {0.0110703f, 0.0092294f, 0.0084211f, 0.0079534f, 0.0073669f, 0.0072470f, 0.0069921f, 0.0068887f, 0.0068587f, 0.0064443f, 0.0058397f, 0.0056778f, 0.0060431f, 0.0061967f, 0.0067258f, 0.0057335f }, /* T 16k */ + {0.0096970f, 0.0089043f, 0.0070257f, 0.0066386f, 0.0066645f, 0.0068564f, 0.0066972f, 0.0068564f, 0.0065140f, 0.0063563f, 0.0057143f, 0.0058481f, 0.0063504f, 0.0059483f, 0.0063860f, 0.0043658f }, /* AU 16k */ + {0.0114222f, 0.0085906f, 0.0097663f, 0.0096924f, 0.0099129f, 0.0104972f, 0.0098273f, 0.0090459f, 0.0081822f, 0.0086780f, 0.0093218f, 0.0091880f, 0.0098320f, 0.0089628f, 0.0089550f, 0.0064120f }, + {0.0062268f, 0.0081561f, 0.0085121f, 0.0077079f, 0.0076361f, 0.0074717f, 0.0071860f, 0.0062534f, 0.0059500f, 0.0061985f, 0.0070451f, 0.0070354f, 0.0075740f, 0.0076992f, 0.0081302f, 0.0062117f }, + {0.0187890f, 0.0095079f, 0.0074663f, 0.0069755f, 0.0063210f, 0.0059466f, 0.0062268f, 0.0060826f, 0.0057641f, 0.0054921f, 0.0058800f, 0.0060484f, 0.0078019f, 0.0103591f, 0.0108763f, 0.0106611f }, + {0.0143820f, 0.0059157f, 0.0084072f, 0.0095522f, 0.0099225f, 0.0101688f, 0.0101186f, 0.0104224f, 0.0102247f, 0.0102400f, 0.0104330f, 0.0100196f, 0.0105949f, 0.0093816f, 0.0085369f, 0.0069096f }, + {0.0073431f, 0.0076618f, 0.0076389f, 0.0075018f, 0.0076134f, 0.0077400f, 0.0074690f, 0.0060182f, 0.0050743f, 0.0035463f, 0.0032705f, 0.0039091f, 0.0025460f, 0.0029703f, 0.0073962f, 0.0103330f }, + {0.0081238f, 0.0083558f, 0.0079165f, 0.0083626f, 0.0085227f, 0.0092211f, 0.0092670f, 0.0089121f, 0.0067435f, 0.0064954f, 0.0078347f, 0.0076964f, 0.0075433f, 0.0066972f, 0.0069119f, 0.0040878f }, + {0.0108302f, 0.0102554f, 0.0106279f, 0.0110763f, 0.0106169f, 0.0104383f, 0.0107676f, 0.0115641f, 0.0119208f, 0.0134826f, 0.0141047f, 0.0144124f, 0.0139795f, 0.0059778f, 0.0139130f, 0.0463348f }, + {0.0227051f, 0.0135271f, 0.0071086f, 0.0082051f, 0.0077196f, 0.0078528f, 0.0086414f, 0.0095389f, 0.0094118f, 0.0090901f, 0.0080000f, 0.0093006f, 0.0116762f, 0.0126108f, 0.0143017f, 0.0178709f }, + {0.0093945f, 0.0100589f, 0.0104543f, 0.0107846f, 0.0106004f, 0.0108590f, 0.0119487f, 0.0118040f, 0.0114734f, 0.0098414f, 0.0109695f, 0.0132728f, 0.0136807f, 0.0139795f, 0.0147021f, 0.0156935f }, + {0.0230891f, 0.0079658f, 0.0093049f, 0.0117095f, 0.0120258f, 0.0123821f, 0.0126811f, 0.0124878f, 0.0124802f, 0.0113525f, 0.0107281f, 0.0122855f, 0.0133594f, 0.0136807f, 0.0151929f, 0.0168421f }, + {0.0066841f, 0.0078498f, 0.0085333f, 0.0089315f, 0.0088162f, 0.0087822f, 0.0092754f, 0.0102094f, 0.0099273f, 0.0088086f, 0.0059535f, 0.0049148f, 0.0064524f, 0.0083900f, 0.0093345f, 0.0095345f }, + {0.0168007f, 0.0115903f, 0.0094334f, 0.0087935f, 0.0074365f, 0.0082647f, 0.0083016f, 0.0099514f, 0.0101436f, 0.0099951f, 0.0075544f, 0.0052125f, 0.0051341f, 0.0128482f, 0.0142817f, 0.0238417f }, + {0.0113274f, 0.0108245f, 0.0108532f, 0.0106889f, 0.0102451f, 0.0107789f, 0.0112281f, 0.0114670f, 0.0112527f, 0.0106224f, 0.0082249f, 0.0082018f, 0.0085619f, 0.0081887f, 0.0060753f, 0.0071210f }, + {0.0115903f, 0.0107676f, 0.0119626f, 0.0116166f, 0.0104277f, 0.0105026f, 0.0110464f, 0.0115576f, 0.0121760f, 0.0122855f, 0.0128240f, 0.0111851f, 0.0069589f, 0.0059397f, 0.0240941f, 0.0361199f }, + {0.0102915f, 0.0098985f, 0.0095790f, 0.0090579f, 0.0091921f, 0.0093049f, 0.0102196f, 0.0107903f, 0.0126342f, 0.0122488f, 0.0129538f, 0.0091839f, 0.0047124f, 0.0050295f, 0.0210700f, 0.0282873f }, + {0.0133594f, 0.0102708f, 0.0099854f, 0.0109052f, 0.0110643f, 0.0111547f, 0.0120188f, 0.0118931f, 0.0122050f, 0.0103696f, 0.0090101f, 0.0107903f, 0.0119766f, 0.0121760f, 0.0128401f, 0.0141047f} +}; + +/* An 16-by-19 matrix in Scale = 20.48f */ +const float sigma_p[][16] = +{ + {59.3261719f, 63.9160156f, 69.7753906f, 66.3574219f, 67.3339844f, 68.5546875f, 66.6015625f, 66.0156250f, 66.0156250f, 67.9687500f, 68.2617188f, 84.3261719f, 96.5820313f, 118.6523438f, 44.0917969f, 43.1152344f }, /* IA NB */ + {51.2207031f, 66.6015625f, 69.3847656f, 68.6035156f, 67.9199219f, 69.6289063f, 69.6777344f, 69.5800781f, 52.5878906f, 64.9902344f, 65.3808594f, 68.7500000f, 71.4355469f, 77.0507813f, 77.9296875f, 80.3222656f }, /* U NB */ + {32.7148438f, 34.9121094f, 47.0703125f, 55.6152344f, 60.1562500f, 68.3105469f, 71.8261719f, 72.7539063f, 73.8281250f, 70.8984375f, 69.4335938f, 77.1972656f, 95.8007813f, 74.3164063f, 20.8984375f, 10.9375000f }, /* V NB */ + {53.8085938f, 61.3281250f, 78.1738281f, 75.8789063f, 73.7792969f, 81.3964844f, 80.7128906f, 80.5664063f, 83.6914063f, 77.0996094f, 72.5097656f, 86.6210938f, 121.6796875f, 117.7734375f, 40.0390625f, 16.8945313f },/* G NB */ + {1.0f }, /* T NB */ + {57.0312500f, 64.5996094f, 71.4355469f, 75.8789063f, 77.0507813f, 79.0039063f, 74.5117188f, 74.2187500f, 72.9492188f, 72.8515625f, 66.9433594f, 73.9257813f, 109.6191406f, 121.5332031f, 23.7792969f, 13.3789063f }, /* AU NB */ + {55.4687500f, 65.6738281f, 71.8261719f, 71.6308594f, 73.0468750f, 74.3164063f, 73.0957031f, 73.4863281f, 73.8769531f, 75.2441406f, 78.0761719f, 82.6171875f, 90.1367188f, 95.8496094f, 66.0644531f, 68.9941406f }, /* IA WB */ + {67.9687500f, 64.0625000f, 65.8203125f, 76.9531250f, 117.1875000f, 145.5078125f, 77.6855469f, 23.2421875f, 81.0546875f, 81.1035156f, 81.4453125f, 85.0585938f, 90.0878906f, 95.8984375f, 92.3828125f, 90.7226563f }, /* U WB */ + {35.6933594f, 39.4042969f, 57.3242188f, 64.6484375f, 68.0175781f, 76.2695313f, 80.7128906f, 82.0800781f, 85.1562500f, 89.6484375f, 89.9414063f, 95.3613281f, 104.7363281f, 106.0546875f, 105.2734375f, 97.8515625f }, /* V WB */ + {61.4257813f, 75.1464844f, 88.4277344f, 82.1777344f, 82.4218750f, 89.1601563f, 89.2578125f, 94.1894531f, 95.5566406f, 95.9472656f, 97.0703125f, 102.6367188f, 107.2265625f, 107.3730469f, 105.4199219f, 98.1933594f },/* G WB */ + {1.0f },/* T WB */ + {51.1230469f, 62.5976563f, 71.5820313f, 75.5371094f, 78.9550781f, 79.9804688f, 79.4433594f, 82.9101563f, 82.6171875f, 83.1054688f, 84.8632813f, 86.1328125f, 89.5996094f, 83.6914063f, 79.3945313f, 78.2226563f }, /* AU WB */ + {72.9980469f, 86.2792969f, 90.0878906f, 89.5996094f, 92.4316406f, 90.5273438f, 90.5273438f, 92.1386719f, 97.3632813f, 101.3671875f, 111.7675781f, 110.8398438f, 97.5585938f, 93.1640625f, 92.8710938f, 115.7226563f },/* IA 16k */ + {1.0f },/* U 16k */ + {49.714f, 67.480f, 88.315f, 84.931f, 102.979f, 99.871f, 113.361f, 115.387f, 115.951f, 126.902f, 130.543f, 127.340f, 117.813f, 113.104f, 107.586f, 99.412f }, /* V 16k */ + {96.8261719f, 117.3339844f, 132.5683594f, 134.4726563f, 140.7226563f, 136.8652344f, 141.6992188f, 141.1132813f, 143.8964844f, 152.6367188f, 168.5058594f, 169.1406250f, 158.4960938f, 156.1523438f, 147.4609375f, 182.4707031f },/* G 16k */ + {1.0f },/* T 16k */ + {55.1269531f, 70.3613281f, 83.1054688f, 87.2070313f, 90.5273438f, 91.4550781f, 94.7265625f, 93.6035156f, 97.6074219f, 98.7304688f, 104.6875000f, 99.6582031f, 95.6054688f, 91.6503906f, 88.4765625f, 78.2226563f, },/* NOT USED ! AU 16k */ + {69.5312500f, 80.1757813f, 101.3183594f, 100.9277344f, 106.4941406f, 111.1816406f, 107.6171875f, 112.9882813f, 116.6992188f, 117.1875000f, 120.9472656f, 125.0976563f, 130.7617188f, 128.7109375f, 123.3886719f, 104.9316406f} /* G WB for MA*/ +}; +/* An 16-by-19 matrix in Scale = 20.48f */ +const float inv_sigma_p[][16] = +{ + {0.0168560f, 0.0156455f, 0.0143317f, 0.0150699f, 0.0148513f, 0.0145869f, 0.0150147f, 0.0151479f, 0.0151479f, 0.0147126f, 0.0146495f, 0.0118587f, 0.0103539f, 0.0084280f, 0.0226800f, 0.0231937f }, /* IA NB */ + {0.0195234f, 0.0150147f, 0.0144124f, 0.0145765f, 0.0147232f, 0.0143619f, 0.0143518f, 0.0143719f, 0.0190158f, 0.0153869f, 0.0152950f, 0.0145455f, 0.0139986f, 0.0129785f, 0.0128321f, 0.0124498f }, /* U NB */ + {0.0305672f, 0.0286434f, 0.0212448f, 0.0179807f, 0.0166234f, 0.0146390f, 0.0139225f, 0.0137450f, 0.0135450f, 0.0141047f, 0.0144023f, 0.0129538f, 0.0104383f, 0.0134560f, 0.0478505f, 0.0914286f }, /* V NB */ + {0.0185844f, 0.0163057f, 0.0127920f, 0.0131789f, 0.0135539f, 0.0122855f, 0.0123896f, 0.0124121f, 0.0119487f, 0.0129702f, 0.0137912f, 0.0115445f, 0.0082183f, 0.0084909f, 0.0249756f, 0.0591908f }, /* G NB */ + {1.0f }, /* T NB */ + {0.0175342f, 0.0154800f, 0.0139986f, 0.0131789f, 0.0129785f, 0.0126576f, 0.0134207f, 0.0134737f, 0.0137082f, 0.0137265f, 0.0149380f, 0.0135271f, 0.0091225f, 0.0082282f, 0.0420534f, 0.0747445f }, /* AU NB */ + {0.0180282f, 0.0152268f, 0.0139225f, 0.0139605f, 0.0136898f, 0.0134560f, 0.0136807f, 0.0136080f, 0.0135360f, 0.0132901f, 0.0128080f, 0.0121040f, 0.0110943f, 0.0104330f, 0.0151367f, 0.0144940f }, /* IA WB */ + {0.0147126f, 0.0156098f, 0.0151929f, 0.0129949f, 0.0085333f, 0.0068725f, 0.0128724f, 0.0430252f, 0.0123373f, 0.0123299f, 0.0122782f, 0.0117566f, 0.0111003f, 0.0104277f, 0.0108245f, 0.0110226f }, /* U WB */ + {0.0280164f, 0.0253779f, 0.0174446f, 0.0154683f, 0.0147021f, 0.0131114f, 0.0123896f, 0.0121832f, 0.0117431f, 0.0111547f, 0.0111183f, 0.0104864f, 0.0095478f, 0.0094291f, 0.0094991f, 0.0102196f }, /* V WB */ + {0.0162798f, 0.0133073f, 0.0113087f, 0.0121687f, 0.0121327f, 0.0112158f, 0.0112035f, 0.0106169f, 0.0104650f, 0.0104224f, 0.0103018f, 0.0097431f, 0.0093260f, 0.0093133f, 0.0094859f, 0.0101840f }, /* G WB */ + {1.0f }, /* T WB */ + {0.0195606f, 0.0159750f, 0.0139700f, 0.0132385f, 0.0126654f, 0.0125031f, 0.0125876f, 0.0120612f, 0.0121040f, 0.0120329f, 0.0117837f, 0.0116100f, 0.0111608f, 0.0119487f, 0.0125953f, 0.0127840f }, /* AU WB */ + {0.0136990f, 0.0115903f, 0.0111003f, 0.0111608f, 0.0108188f, 0.0110464f, 0.0110464f, 0.0108532f, 0.0102708f, 0.0098651f, 0.0089471f, 0.0090220f, 0.0102503f, 0.0107338f, 0.0107676f, 0.0086414f }, /* IA 16k*/ + {1.0f }, /* U 16k */ + {0.0201150f, 0.0148192f, 0.0113231f, 0.0117743f, 0.0097107f, 0.0100129f, 0.0088214f, 0.0086665f, 0.0086243f, 0.0078801f, 0.0076603f, 0.0078530f, 0.0084880f, 0.0088414f, 0.0092949f, 0.0100591f}, /* V 16k */ + {0.0103278f, 0.0085227f, 0.0075433f, 0.0074365f, 0.0071062f, 0.0073065f, 0.0070572f, 0.0070865f, 0.0069494f, 0.0065515f, 0.0059345f, 0.0059122f, 0.0063093f, 0.0064040f, 0.0067815f, 0.0054803f }, /* G 16k */ + {1.0f }, /* T 16k */ + {0.0181399f, 0.0142124f, 0.0120329f, 0.0114670f, 0.0110464f, 0.0109343f, 0.0105567f, 0.0106834f, 0.0102451f, 0.0101286f, 0.0095522f, 0.0100343f, 0.0104597f, 0.0109110f, 0.0113024f, 0.0127840f },/* NOT USED ! AU 16k */ + {0.0143820f, 0.0124726f, 0.0098699f, 0.0099081f, 0.0093902f, 0.0089943f, 0.0092922f, 0.0088505f, 0.0085690f, 0.0085333f, 0.0082681f, 0.0079938f, 0.0076475f, 0.0077693f, 0.0081045f, 0.0095300f} /* G WB for MA*/ +}; + +const Word8 leaders_short[][MAX_NO_SCALES] = +{{ 0, 0, 0}, +{ 1, 0, 0}, +{ 15, 3, 3}, +{ 2, 2, 0}, +{ 2, 0, 0}, +{ 2, 1, 0}, +{ 4, 0, 0}, +{ 9, 7, 6}, +{ 4, 1, 0}, +{ 5, 2, 0}, +{ 6, 3, 2}, +{ 5, 3, 1}, +{ 8, 3, 0}, +{ 9, 3, 0}, +{ 2, 2, 1}, +{ 9, 8, 5}, +{ 5, 5, 0}, +{ 17, 3, 0}, +{ 5, 2, 1}, +{ 7, 3, 0}, +{ 5, 4, 0}, +{ 5, 5, 1}, +{ 2, 2, 2}, +{ 4, 2, 2}, +{ 5, 2, 2}, +{ 6, 6, 5}, +{ 5, 3, 2}, +{ 6, 3, 0}, +{ 12, 3, 2}, +{ 15, 3, 2}, +{ 19, 3, 2}, +{ 7, 6, 3}, +{ 5, 4, 2}, +{ 9, 8, 2}, +{ 6, 5, 2}, +{ 5, 4, 1}, +{ 9, 9, 3}, +{ 6, 6, 2}, +{ 8, 6, 2}, +{ 8, 7, 2}, +{ 8, 8, 2}, +{ 4, 2, 0}, +{ 11, 8, 2}, +{ 13, 11, 2}, +{ 5, 5, 2}, +{ 16, 13, 2}, +{ 13, 12, 2}, +{ 18, 17, 2}, +{ 21, 17, 2}, +{ 18, 16, 2}, +{ 32, 28, 2}, +{ 8, 8, 4}, +{ 7, 5, 2}, +{ 13, 11, 9}, +{ 38, 31, 2}, +{ 4, 4, 2}, +{ 8, 8, 3}, +{ 9, 8, 3}, +{ 8, 5, 2}, +{ 10, 9, 3}, +{ 11, 10, 3}, +{ 13, 10, 3}, +{ 22, 10, 3}, +{ 23, 10, 3}, +{ 13, 11, 3}, +{ 15, 13, 3}, +{ 35, 15, 3}, +{ 32, 16, 3}, +{ 5, 5, 4}, +{ 8, 7, 4}, +{ 33, 31, 2}, +{ 9, 9, 4}, +{ 16, 12, 4}, +{ 17, 13, 4}, +{ 5, 5, 5}, +{ 7, 5, 5}, +{ 4, 3, 2}, +{ 8, 6, 5}, +{ 9, 6, 5}, +{ 9, 7, 5}, +{ 8, 8, 5}, +{ 3, 2, 0}, +{ 10, 8, 5}, +{ 11, 8, 5}, +{ 12, 8, 5}, +{ 13, 8, 5}, +{ 16, 8, 5}, +{ 18, 8, 5}, +{ 10, 9, 5}, +{ 18, 9, 5}, +{ 23, 21, 2}, +{ 13, 8, 8}, +{ 14, 10, 5}, +{ 11, 11, 5}, +{ 13, 11, 5}, +{ 13, 13, 5}, +{ 14, 13, 5}, +{ 15, 13, 5}, +{ 16, 13, 5}, +{ 17, 13, 5}, +{ 18, 13, 5}, +{ 18, 16, 5}, +{ 18, 17, 5}, +{ 19, 18, 5}, +{ 13, 10, 5}, +{ 21, 21, 5}, +{ 23, 21, 5}, +{ 24, 21, 5}, +{ 25, 23, 5}, +{ 32, 23, 5}, +{ 11, 10, 5}, +{ 8, 8, 6}, +{ 5, 5, 7}, +{ 8, 7, 7}, +{ 8, 8, 7}, +{ 10, 8, 7}, +{ 13, 8, 7}, +{ 10, 9, 7}, +{ 13, 11, 7}, +{ 9, 8, 8}, +{ 12, 8, 8}, +{ 23, 18, 5}, +{ 9, 9, 8}, +{ 11, 9, 8}, +{ 13, 9, 8}, +{ 18, 10, 8}, +{ 26, 10, 8}, +{ 27, 10, 8}, +{ 31, 10, 8}, +{ 40, 21, 11}, +{ 13, 11, 8}, +{ 13, 12, 8}, +{ 14, 12, 8}, +{ 18, 12, 8}, +{ 13, 13, 8}, +{ 14, 13, 8}, +{ 16, 13, 8}, +{ 18, 13, 8}, +{ 18, 16, 8}, +{ 18, 17, 8}, +{ 23, 18, 8}, +{ 23, 21, 8}, +{ 24, 21, 8}, +{ 28, 23, 8}, +{ 31, 31, 8}, +{ 36, 31, 8}, +{ 38, 31, 8}, +{ 11, 9, 9}, +{ 12, 9, 9}, +{ 13, 9, 9}, +{ 12, 11, 9}, +{ 42, 31, 2}, +{ 14, 12, 9}, +{ 13, 13, 9}, +{ 14, 13, 9}, +{ 16, 13, 9}, +{ 17, 13, 9}, +{ 18, 13, 9}, +{ 18, 14, 9}, +{ 18, 18, 9}, +{ 26, 25, 9}, +{ 13, 11, 10}, +{ 18, 12, 10}, +{ 18, 13, 10}, +{ 21, 14, 10}, +{ 22, 16, 10}, +{ 18, 18, 10}, +{ 23, 18, 10}, +{ 24, 18, 10}, +{ 24, 21, 10}, +{ 23, 22, 10}, +{ 24, 23, 10}, +{ 32, 25, 10}, +{ 34, 28, 10}, +{ 42, 31, 10}, +{ 17, 11, 11}, +{ 18, 13, 11}, +{ 21, 13, 11}, +{ 18, 17, 11}, +{ 18, 18, 11}, +{ 48, 35, 24}, +{ 18, 17, 12}, +{ 18, 18, 12}, +{ 20, 18, 12}, +{ 39, 30, 12}, +{ 31, 31, 12}, +{ 43, 34, 12}, +{ 16, 13, 13}, +{ 17, 13, 13}, +{ 16, 16, 13}, +{ 18, 17, 13}, +{ 20, 18, 13}, +{ 22, 18, 13}, +{ 23, 18, 13}, +{ 22, 21, 13}, +{ 23, 23, 13}, +{ 24, 23, 13}, +{ 43, 36, 13}, +{ 43, 40, 13}, +{ 43, 41, 13}, +{ 31, 30, 18}, +{ 24, 21, 14}, +{ 31, 31, 14}, +{ 23, 18, 16}, +{ 23, 23, 16}, +{ 31, 25, 16}, +{ 31, 29, 16}, +{ 45, 35, 16}, +{ 23, 21, 17}, +{ 23, 22, 17}, +{ 23, 23, 17}, +{ 31, 31, 17}, +{ 21, 18, 18}, +{ 23, 21, 18}, +{ 23, 22, 18}, +{ 27, 23, 18}, +{ 29, 23, 18}, +{ 32, 23, 18}, +{ 31, 27, 18}, +{ 30, 28, 18}, +{ 31, 28, 18}, +{ 43, 42, 13}, +{ 31, 31, 18}, +{ 32, 31, 18}, +{ 36, 31, 18}, +{ 46, 48, 18}, +{ 46, 32, 19}, +{ 43, 38, 19}, +{ 43, 42, 19}, +{ 32, 32, 20}, +{ 27, 23, 21}, +{ 31, 23, 21}, +{ 31, 24, 21}, +{ 32, 30, 21}, +{ 32, 31, 21}, +{ 43, 33, 21}, +{ 43, 34, 21}, +{ 24, 23, 23}, +{ 32, 32, 23}, +{ 48, 40, 23}, +{ 48, 46, 23}, +{ 28, 24, 24}, +{ 32, 31, 24}, +{ 34, 32, 24}, +{ 36, 32, 24}, +{ 48, 32, 24}, +{ 35, 10, 8}, +{ 40, 28, 25}, +{ 45, 31, 25}, +{ 44, 32, 25}, +{ 31, 31, 27}, +{ 39, 32, 27}, +{ 44, 32, 27}, +{ 32, 32, 28}, +{ 43, 32, 28}, +{ 48, 32, 28}, +{ 36, 36, 28}, +{ 48, 45, 28}, +{ 40, 32, 29}, +{ 44, 34, 30}, +{ 40, 32, 31}, +{ 41, 32, 31}, +{ 42, 32, 31}, +{ 44, 43, 31}, +{ 48, 37, 32}, +{ 48, 39, 32}, +{ 46, 43, 32}, +{ 48, 48, 34}, +{ 48, 36, 35}, +{ 48, 41, 35}, +{ 47, 43, 36}, +{ 48, 48, 37}, +{ 48, 48, 40}, +{ 48, 48, 45}, +{ 48, 48, 47}, +{ 48, 48, 48}}; + +const UWord8 no_lead_idx[][2] = { +{ 1, 1}, +{ 4, 1}, +{ 41, 1}, +{ 41, 4}, +{ 52, 32}, +{ 56, 38}, +{ 41, 1}, +{ 6, 5}, +{119, 14}, +{ 58, 18}, +{138, 21}, +{169, 40}, +{ 4, 4}, +{ 41, 1}, +{ 35, 1}, +{ 35, 4}, +{ 52, 4}, +{ 18, 8}, +{ 44, 41}, +{ 58, 6}, +{ 58, 9}, +{ 69, 26}, +{ 51, 34}, +{ 85, 34}, +{ 85, 38}, +{ 85, 42}, +{139, 40}, +{142, 33}, +{140, 64}, +{141, 73}, +{236, 124}, +{235, 133}, +{211, 160}, +{ 4, 3}, +{ 41, 1}, +{ 52, 3}, +{ 39, 3}, +{ 42, 3}, +{153, 3}, +{118, 9}, +{158, 44}, +{202, 93}, +{250, 201}, +{ 20, 0}, +{ 52, 0}, +{ 1, 1}, +{ 4, 1}, +{ 4, 4}, +{ 4, 4}, +{ 41, 1}, +{ 41, 4}, +{ 20, 4}, +{ 52, 4}, +{ 39, 4}, +{ 44, 41}, +{ 58, 6}, +{ 80, 41}, +{114, 9}, +{124, 9}, +{130, 21}, +{124, 58}, +{165, 34}, +{164, 39}, +{169, 40}, +{ 35, 0}, +{ 4, 4}, +{ 35, 1}, +{ 35, 4}, +{ 52, 4}, +{ 58, 5}, +{ 15, 5}, +{135, 3}, +{116, 41}, +{124, 24}, +{137, 24}, +{177, 26}, +{194, 44}, +{208, 52}, +{230, 58}, +{ 4, 4}, +{ 41, 1}, +{ 41, 4}, +{ 20, 4}, +{ 8, 6}, +{ 9, 8}, +{ 44, 41}, +{ 58, 6}, +{ 58, 9}, +{114, 9}, +{124, 9}, +{ 92, 21}, +{124, 58}, +{ 92, 51}, +{104, 91}, +{141, 51}, +{121, 91}, +{ 4, 3}, +{ 41, 1}, +{ 52, 3}, +{ 69, 3}, +{ 83, 3}, +{ 87, 3}, +{ 86, 44}, +{143, 74}, +{144, 112}, +{179, 78}, +{196, 78}, +{196, 78}, +{224, 78}, +{ 4, 3}, +{ 41, 1}, +{ 20, 1}, +{ 20, 4}, +{ 52, 4}, +{ 52, 3}, +{111, 5}, +{132, 4}, +{ 57, 41}, +{123, 41}, +{214, 3}, +{183, 81}, +{215, 41}, +{213, 32}, +{219, 44}, +{233, 52}, +{ 7, 52}, +{ 3, 57}, +{ 14, 59}, +{ 11, 53}, +{ 62, 0}, +{ 37, 4}, +{ 37, 3}, +{ 63, 3}, +{ 67, 3}, +{184, 3}, +{123, 41}, +{ 19, 124}, +{ 39, 4}, +{ 44, 41}, +{ 58, 6}, +{ 58, 9}, +{ 58, 44}, +{115, 32}, +{ 95, 16}, +{102, 21}, +{ 99, 38}, +{126, 58}, +{141, 57}, +{206, 56}, +{205, 120}, +{226, 124}, +{226, 133}, +{225, 182}, +{152, 3}, +{ 65, 3}, +{ 17, 14}, +{ 61, 22}, +{135, 3}, +{ 19, 11}, +{ 76, 25}, +{ 41, 36}, +{ 41, 33}, +{ 41, 7}, +{ 27, 10}, +{ 81, 15}, +{ 3, 2}, +{ 41, 36}, +{ 55, 31}, +{ 81, 7}, +}; +const UWord8 no_lead_p_idx[][2] = { + { 5, 0}, +{ 3, 0}, +{ 41, 0}, +{ 35, 0}, +{ 52, 0}, +{ 1, 1}, +{ 4, 1}, +{ 4, 4}, +{ 3, 4}, +{ 41, 1}, +{ 41, 4}, +{ 35, 4}, +{ 52, 4}, +{ 39, 4}, +{ 44, 41}, +{ 58, 6}, +{ 80, 41}, +{ 15, 9}, +{ 94, 9}, +{110, 34}, +{ 96, 52}, +{ 98, 39}, +{105, 58}, +{107, 51}, +{105, 104}, +{109, 94}, +{145, 98}, +{207, 100}, +{239, 103}, +{240, 108}, +{207, 146}, +{ 4, 0}, +{ 41, 4}, +{ 39, 3}, +{ 94, 5}, +{ 80, 41}, +{ 94, 18}, +{ 94, 44}, +{ 96, 52}, +{106, 44}, +{121, 58}, +{107, 51}, +{199, 15}, +{197, 104}, +{198, 156}, +{221, 200}, +{ 4, 1}, +{ 3, 1}, +{ 3, 4}, +{ 41, 1}, +{ 35, 1}, +{ 35, 4}, +{ 52, 4}, +{ 39, 4}, +{ 88, 4}, +{135, 4}, +{135, 3}, +{190, 3}, +{155, 41}, +{135, 20}, +{190, 32}, +{194, 44}, +{231, 44}, +{230, 58}, +{231, 15}, +{242, 83}, +{253, 130}, +{ 4, 1}, +{ 32, 1}, +{ 58, 5}, +{ 39, 3}, +{ 43, 5}, +{ 45, 3}, +{ 48, 3}, +{ 46, 44}, +{ 49, 44}, +{ 90, 44}, +{ 50, 44}, +{ 54, 52}, +{ 70, 51}, +{151, 122}, +{151, 53}, +{ 52, 4}, +{ 39, 4}, +{ 83, 4}, +{ 89, 4}, +{ 80, 41}, +{ 85, 41}, +{100, 8}, +{101, 9}, +{ 85, 38}, +{ 85, 15}, +{195, 52}, +{234, 52}, +{217, 15}, +{254, 15}, +{251, 104}, +{ 10, 153}, +{ 18, 157}, +{ 19, 192}, +{ 19, 237}, +{ 19, 0}, +{ 52, 4}, +{153, 3}, +{159, 3}, +{171, 32}, +{185, 44}, +{186, 68}, +{ 85, 15}, +{220, 44}, +{218, 75}, +{227, 75}, +{ 1, 77}, +{228, 147}, +{ 15, 150}, +{ 18, 187}, +{ 16, 212}, +{ 16, 241}, +{ 17, 248}, +{ 4, 3}, +{ 52, 4}, +{ 52, 3}, +{161, 3}, +{166, 3}, +{149, 9}, +{247, 47}, +{178, 0}, +{ 41, 1}, +{ 20, 1}, +{ 20, 4}, +{ 52, 4}, +{ 58, 5}, +{117, 4}, +{117, 3}, +{153, 3}, +{182, 3}, +{204, 3}, +{162, 9}, +{163, 44}, +{167, 44}, +{173, 44}, +{254, 44}, +{ 12, 52}, +{254, 15}, +{ 13, 82}, +{244, 188}, +{ 3, 4}, +{ 52, 4}, +{ 58, 5}, +{153, 3}, +{190, 3}, +{209, 3}, +{243, 189}, +{ 41, 1}, +{ 20, 1}, +{ 39, 4}, +{ 88, 4}, +{ 97, 4}, +{138, 21}, +{ 6, 44}, +{ 1, 1}, +{ 4, 1}, +{ 4, 4}, +{ 5, 4}, +{ 41, 1}, +{ 41, 4}, +{ 20, 4}, +{ 52, 4}, +{ 39, 4}, +{ 83, 4}, +{135, 4}, +{ 80, 41}, +{116, 41}, +{136, 41}, +{110, 34}, +{ 13, 6}, +{113, 41}, +{114, 18}, +{ 91, 24}, +{125, 24}, +{127, 24}, +{163, 12}, +{168, 13}, +{172, 13}, +{128, 84}, +{174, 28}, +{252, 29}, +{249, 30}, +{246, 129}, +{246, 180}, +{ 9, 66}, +{110, 41}, +{155, 41}, +{154, 20}, +{158, 44}, +{203, 21}, +{232, 44}, +{210, 39}, +{223, 79}, +{222, 123}, +{229, 131}, +{238, 139}, +{238, 170}, +{ 4, 4}, +{ 4, 4}, +{ 41, 1}, +{ 20, 1}, +{ 20, 4}, +{ 52, 4}, +{ 39, 4}, +{ 88, 4}, +{135, 4}, +{ 80, 41}, +{110, 41}, +{136, 41}, +{134, 32}, +{176, 44}, +{193, 44}, +{195, 52}, +{210, 39}, +{242, 39}, +{ 6, 71}, +{ 2, 148}, +{ 4, 175}, +{ 5, 191}, +{110, 41}, +{204, 3}, +{216, 22}, +{210, 23}, +{195, 32}, +{220, 44}, +{210, 39}, +{222, 33}, +{245, 57}, +{255, 60}, +{ 8, 72}, +{ 8, 181}, +}; + +const int16_t min_lat_bits_SN[] = {-1, -1, 17, 12, 17, 17, -1, -1, 17, 12, 17, 17, -1, -1, 22, -1, 32, 26 }; + +const int16_t min_lat_bits_pred[] = {17, 18, 9, 15, -1, 21, 17, 14, 9, 15, -1, 21, 17, -1, 24, 26, -1, 26, 16}; + +const int16_t offset_lvq_modes_SN[] = {-1,-1,33,64,96, 129,-1,-1,12,43,79,109,-1,-1,137,-1,107,135, + 112 + }; /* CNG */ + +const int16_t offset_lvq_modes_pred[] = {119, 153, 31, 67, -1, 102, 126, 160, 0, 46, -1, 82, 146, -1, 175, 191, -1, 225, 203}; +const int16_t offset_in_lvq_mode_SN[][21] = +{ + {0}, /* I NB */ + {0,1,1,1,1,1,2,3,3,3,3,4,4,4,5}, /* UV NB*/ + {0,1,1,1,1,2,3,4,5,5,6,6,7,7,7,7,7,8,8,8,9}, /* V NB */ + {0,0,0,0,1,1,1,2,3,4,5,6,6,7,8,9,10,11,12,13,14}, /* G NB */ + {0,1,1,1,1,2,3,4,5,5,5,6,6,6,7,8}, /* T NB */ + {0,0,0,0,1,2,2,2,2,3,4,5}, /* A NB */ + {0}, /* I WB */ + {0}, /* UV WB*/ + {1}, /* V WB */ /* granularity 1 */ + {1}, /* G WB */ /* granularity 1 */ + {1}, /* T WB */ /* granularity 1 */ + {1}, /* A WB */ /* granularity 1 */ + {0}, /* I 16k */ + {0}, /* UV 16k */ + {1}, /* V 16k */ /* granularity 1 */ + {0}, /* G 16k */ + {0,1}, /* T 16k */ + {0}, /* A 16k */ +}; +const int16_t offset_in_lvq_mode_pred[][32] = +{ + {0,0,0,0,1,2,2,2,3,4,5,5,5,5,5,5,5,5,5,6}, /* I NB */ + {0,1,1,1,2,3,4,4,4,4,4,5,5,5,6}, /* UV NB */ + {0,0,0,0,0,0,0,0,0,0,1,1,1,1,2,3,4,4,5,6,7,8,9,10,10,11,12,13,13,13,14}, /* V NB */ + {0,0,0,0,1,1,1,2,3,4,5,6,6,7,8,9,10,11,12,13,14}, /* G NB */ + {0}, /* T NB */ + {0,0,0,0,1,2,2,2,2,3,4,5}, /* A NB */ + {1}, /* I WB */ + {1}, /* UV WB */ /* granularity 1 */ + {1}, /* V WB */ /* granularity 1 */ + {1}, /* G WB */ + {0}, /* T WB */ + {1}, /* A WB */ + {0,0,0,0,1,2,2,2,3,4,5,5,5,5,5,5,5,5,5,6}, /* I 16k */ + {0}, /* UV 16k */ + {1}, /* V 16k */ + {1}, /* G 16k */ + {0}, /* T 16k */ + {1}, /* A 16k */ + {1}, /* G WB MA*/ +}; + +/*-----------------------------------------------------------------* + * BC-TCVQ frame-end quantization tables (BC-TCVQ is used in Voiced mode for 16kHz isf) + *-----------------------------------------------------------------*/ +const int16_t NTRANS[4][NUM_STATE] = {{0,2,4,6,8,10,12,14,0,2,4,6,8,10,12,14}, /* indices of previous state of first branche */ + {1,3,5,7,9,11,13,15,1,3,5,7,9,11,13,15}, /* indices of previous state of second branches */ + {4,2,1,3,0,2,1,3,2,0,3,1,7,0,3,1}, /* indices of previous subset of first branch */ + {2,0,3,6,2,0,3,1,0,2,1,3,0,2,1,5} /* indices of previous subset of second branch */ +}; + +const int16_t NTRANS2[4][NUM_STATE] = {{0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7}, + {8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15}, + {4,2,2,0,1,3,3,6,0,2,2,0,1,3,3,1}, + {2,0,0,2,3,1,1,3,7,0,0,2,3,1,1,5} +}; + +/* BC-TCQ Bit Allocations */ +const int16_t BC_TCVQ_BIT_ALLOC_40B[M/2+4] = {1, 4, 5,5,4,4, 2,2,2,2, 5,4 }; /*1+39bit*/ + +const int16_t FixBranch_tbl[4][4][N_STAGE_VQ - 4] = +{ + {{0, 0, 0, 0}, {1, 0, 0, 0}, {0, 1, 0, 0}, {1, 1, 0, 0}}, /* incase of initial state 0 */ + {{0, 0, 1, 0}, {1, 0, 1, 0}, {0, 1, 1, 0}, {1, 1, 1, 0}}, /* incase of initial state 4 */ + {{0, 0, 0, 1}, {1, 0, 0, 1}, {0, 1, 0, 1}, {1, 1, 0, 1}}, /* incase of initial state 8 */ + {{0, 0, 1, 1}, {1, 0, 1, 1}, {0, 1, 1, 1}, {1, 1, 1, 1}} /* incase of initial state 12 */ +}; + +/* Intra-Prediction */ +const float AR_IntraCoeff[N_STAGE_VQ-1][2][2] = +{ + {{-0.292479f, 0.676331f}, {-0.422648f, 0.217490f}}, + {{ 0.048957f, 0.500476f}, { 0.087301f, 0.287286f}}, + {{ 0.199481f, 0.502784f}, { 0.106762f, 0.420907f}}, + {{ 0.240459f, 0.440504f}, { 0.214255f, 0.396496f}}, + {{ 0.193161f, 0.494850f}, { 0.158690f, 0.306771f}}, + {{ 0.093435f, 0.370662f}, { 0.065526f, 0.148231f}}, + {{ 0.037417f, 0.336906f}, {-0.024246f, 0.187298f}} +}; + +const float SN_IntraCoeff[N_STAGE_VQ-1][2][2] = +{ + {{-0.452324f, 0.808759f}, {-0.524298f, 0.305544f}}, + {{ 0.009663f, 0.606028f}, {-0.013208f, 0.421115f}}, + {{ 0.144877f, 0.673495f}, { 0.080963f, 0.580317f}}, + {{ 0.208225f, 0.633144f}, { 0.215958f, 0.584520f}}, + {{ 0.050822f, 0.767842f}, { 0.076879f, 0.416693f}}, + {{ 0.005058f, 0.550614f}, {-0.006786f, 0.296984f}}, + {{-0.023860f, 0.611144f}, {-0.162706f, 0.576228f}} +}; + +const float scale_ARSN[M] = {1.8307f, 1.8404f, 1.8009f, 1.7416f, 1.7240f, 1.7467f, 1.6106f, 1.6497f, 1.5702f, 1.5548f, 1.5745f, 1.6199f, 1.5633f, 1.5239f, 1.5796f, 1.5615f}; +const float scale_inv_ARSN[M] = {0.5462f, 0.5434f, 0.5553f, 0.5742f, 0.5800f, 0.5725f, 0.6209f, 0.6062f, 0.6369f, 0.6432f, 0.6351f, 0.6173f, 0.6397f, 0.6562f, 0.6331f, 0.6404f}; + +/* TCVQ Codebook */ +const float AR_TCVQ_CB_SUB1[2][128][2] = +{ + { + {-170.0561F,-169.3847F,},{-90.97870F,48.531700F,},{-148.6968F,17.218300F,},{-107.0229F,-34.21990F,},{-129.8378F,-87.31650F,},{-220.1001F,-234.4751F,},{-129.6736F,52.471700F,},{20.510900F,-288.6602F,}, + {-221.5495F,-0.070200F,},{58.214300F,123.37490F,},{-74.50640F,211.33990F,},{-48.14920F,123.86970F,},{-192.6126F,-247.4666F,},{-206.1983F,104.78470F,},{-125.3893F,-150.7979F,},{-168.7912F,-86.03110F,}, + {-95.16320F,-89.65400F,},{-12.70900F,177.33540F,},{-73.43770F,-250.7212F,},{-51.23060F,-84.00830F,},{-264.2502F,102.67830F,},{-184.2570F,-157.5882F,},{-121.9781F,-62.24850F,},{-132.6231F,115.89740F,}, + {-47.38870F,-84.58990F,},{-2.521300F,94.296500F,},{-79.13010F,-82.28630F,},{-49.25610F,-5.992200F,},{-286.7041F,-146.2168F,},{-178.7492F,-2.262600F,},{-115.8487F,-10.64920F,},{-119.9947F,-216.1283F,}, + {-69.10170F,1.3002000F,},{-68.48210F,-106.6926F,},{24.572700F,141.84890F,},{51.813600F,206.02520F,},{-51.84400F,-72.25850F,},{-175.4067F,-470.9963F,},{-112.2572F,-109.9498F,},{-51.26580F,339.48830F,}, + {-38.93840F,-40.88940F,},{-29.20570F,-69.73790F,},{-55.22180F,51.015500F,},{-12.33040F,42.160700F,},{-31.81780F,63.017700F,},{-174.1785F,-89.95120F,},{-110.4181F,-345.4240F,},{-49.84300F,-64.35890F,}, + {-59.63520F,-175.9810F,},{-69.02910F,-44.58650F,},{-43.97120F,-49.59230F,},{-87.25920F,-138.5465F,},{-96.25540F,-174.5186F,},{-154.7553F,-275.2756F,},{-109.5143F,128.62810F,},{-14.54350F,-25.04360F,}, + {-46.05230F,81.366800F,},{-32.03440F,24.870900F,},{-132.5154F,-143.2318F,},{-22.59640F,-51.55940F,},{-178.7877F,251.71930F,},{-148.7196F,-212.2087F,},{-106.1241F,217.56180F,},{24.099800F,29.423900F,}, + {-119.7589F,-323.8735F,},{121.21500F,173.78130F,},{28.604700F,-10.13160F,},{37.177600F,85.584900F,},{87.071500F,238.62500F,},{109.09800F,76.070100F,},{167.92980F,224.78890F,},{165.46650F,86.241500F,}, + {-9.919200F,0.5865000F,},{126.17610F,92.028000F,},{-38.94060F,-121.2069F,},{4.4071000F,-13.64760F,},{32.528700F,-1.269700F,},{109.85480F,288.47620F,},{193.40720F,153.42400F,},{34.912700F,501.59090F,}, + {12.630000F,53.019400F,},{11.431500F,13.336900F,},{191.94830F,224.70850F,},{40.979900F,-73.55240F,},{5.8897000F,-171.8742F,},{111.18560F,4.0700000F,},{201.66060F,-41.15440F,},{122.30070F,274.89960F,}, + {-2.425900F,-107.2105F,},{-24.07350F,-25.13440F,},{-4.758000F,-49.75210F,},{66.313900F,932.60360F,},{63.427900F,76.575200F,},{131.07660F,161.35400F,},{211.93280F,81.864800F,},{90.057500F,-27.39110F,}, + {-0.656200F,269.81920F,},{38.372300F,52.479100F,},{9.8096000F,55.003200F,},{101.87250F,118.98060F,},{121.92950F,-125.7858F,},{131.37830F,88.916800F,},{218.95100F,305.25590F,},{299.20050F,200.64100F,}, + {-5.459000F,-45.76330F,},{64.972100F,353.45030F,},{-19.39350F,0.4459000F,},{183.81020F,144.04150F,},{134.69810F,96.639400F,},{135.54900F,-149.4564F,},{219.02860F,440.63140F,},{200.41160F,402.24270F,}, + {39.254000F,-5.942300F,},{72.189700F,27.428900F,},{65.129100F,51.010200F,},{47.723500F,14.090300F,},{219.06510F,290.25100F,},{156.45050F,43.423900F,},{232.59480F,-226.2346F,},{263.13970F,83.869400F,}, + {74.758000F,73.874300F,},{14.975400F,-30.59550F,},{167.16620F,0.0965000F,},{101.95820F,53.053900F,},{-11.37910F,-38.59220F,},{158.02420F,120.38810F,},{239.72370F,224.38630F,},{657.07030F,665.65960F,}, + }, + + { + {-368.0999F,-65.52540F,},{-102.2718F,-140.9826F,},{-20.59040F,-66.70470F,},{-95.79090F,184.47330F,},{-837.7641F,-904.4130F,},{-510.6703F,492.69680F,},{-339.6600F,-757.9813F,},{-254.7818F,-220.3240F,}, + {-195.1893F,174.78510F,},{-225.8519F,-77.48110F,},{-216.3949F,43.255000F,},{-38.17870F,-32.99880F,},{-513.7912F,0.1722000F,},{-480.2339F,-631.9721F,},{-338.9732F,89.728000F,},{-150.2896F,414.33830F,}, + {-299.8150F,-389.7000F,},{-78.78780F,-23.51500F,},{-110.4856F,-76.99170F,},{-55.54460F,-127.1259F,},{-217.9132F,295.10380F,},{-475.2952F,178.16700F,},{-313.6053F,299.37920F,},{-383.7671F,290.27470F,}, + {-162.0853F,-139.3168F,},{-10.81860F,411.75810F,},{44.425800F,-95.93580F,},{31.498700F,285.88550F,},{-313.9570F,-197.7654F,},{-439.8449F,-43.63990F,},{-311.4479F,-51.44460F,},{-112.9209F,-79.77700F,}, + {-135.4290F,-11.18290F,},{-14.37020F,-101.2914F,},{-55.36790F,-170.9950F,},{-97.12010F,33.922700F,},{-341.4857F,133.28130F,},{-419.5535F,-1029.264F,},{-261.0493F,-606.2968F,},{-445.1823F,-298.5443F,}, + {-95.70290F,-200.4782F,},{-18.66770F,205.38260F,},{5.2869000F,154.20340F,},{-176.5040F,-252.4035F,},{-172.0901F,-378.6187F,},{-372.2359F,-501.4665F,},{-252.0296F,-151.3651F,},{-287.6742F,43.301600F,}, + {-63.75070F,119.02160F,},{-136.2005F,87.531000F,},{-87.96100F,287.68010F,},{36.839700F,-33.04480F,},{-118.0163F,-214.5814F,},{-365.9238F,-348.5409F,},{-236.4188F,-425.5134F,},{-25.16220F,-39.63130F,}, + {-63.00320F,-82.32200F,},{-152.9630F,-507.2372F,},{-57.66390F,48.660600F,},{5.3785000F,51.097300F,},{-168.7345F,-49.50600F,},{-359.4378F,-199.1688F,},{-233.7651F,-285.0083F,},{33.347500F,60.305100F,}, + {9.5961000F,-60.67060F,},{-22.43980F,93.048400F,},{184.09080F,107.94670F,},{164.32090F,265.57780F,},{-67.49340F,123.30580F,},{233.22030F,704.96710F,},{353.99250F,-262.9922F,},{210.06920F,175.77800F,}, + {-104.2510F,-314.3242F,},{0.9024000F,-7.495400F,},{86.823700F,85.372000F,},{72.376700F,137.49970F,},{-13.00090F,-69.46920F,},{236.74980F,46.279600F,},{374.54780F,-27.20110F,},{136.88650F,-35.73790F,}, + {-34.16180F,16.487600F,},{283.87900F,353.51860F,},{21.261500F,12.921800F,},{123.46920F,17.014100F,},{98.105500F,5.7719000F,},{238.18290F,-47.81850F,},{386.73840F,560.96730F,},{32.152700F,578.18980F,}, + {70.706200F,208.99530F,},{69.254100F,50.614900F,},{273.61320F,220.89670F,},{244.46280F,129.16830F,},{108.85950F,215.41490F,},{265.47770F,276.31920F,},{395.46140F,283.90850F,},{412.94530F,299.13520F,}, + {-5.075000F,-154.7571F,},{142.09250F,160.91980F,},{172.66840F,-70.68220F,},{79.050300F,-150.7248F,},{220.80900F,545.83980F,},{289.05480F,1023.7731F,},{421.94000F,140.86480F,},{436.59640F,74.580500F,}, + {31.476700F,103.73850F,},{84.791000F,-50.67070F,},{136.49490F,394.28200F,},{264.97310F,-186.0375F,},{531.67460F,343.03590F,},{310.71060F,184.35030F,},{494.98260F,403.81940F,},{406.31780F,490.15840F,}, + {137.11870F,78.459100F,},{-26.93550F,-247.3193F,},{-13.90060F,-408.4927F,},{315.74950F,11.906200F,},{507.81160F,-77.48790F,},{313.84650F,400.68920F,},{543.13960F,-127.4566F,},{895.02000F,968.45590F,}, + {65.022700F,5.1458000F,},{203.36110F,32.767800F,},{99.442400F,-280.2416F,},{385.57300F,174.81870F,},{303.53400F,86.087500F,},{316.97760F,81.139300F,},{545.10640F,789.31480F,},{585.50660F,162.80340F,}, + } +}; + +const float AR_TCVQ_CB_SUB2[2][64][2] = +{ + { + {-139.4748F,-20.51230F,},{-205.2710F,65.240700F,},{-90.66390F,99.509000F,},{-51.55990F,-140.1515F,},{-367.2977F,-86.40560F,},{-101.5758F,-506.4093F,},{-467.6164F,-177.7713F,},{-325.3952F,19.243000F,}, + {-51.50950F,-0.580700F,},{-156.7042F,-109.3179F,},{-82.92030F,-84.85600F,},{-75.64660F,36.105400F,},{-226.3753F,-277.4524F,},{-336.8399F,-293.0652F,},{-261.4553F,168.08600F,},{-203.4850F,280.69810F,}, + {-242.0593F,-177.4998F,},{-93.17880F,198.93370F,},{-6.034900F,-224.4959F,},{152.10510F,274.83370F,},{-347.4922F,202.31740F,},{-450.9290F,32.755600F,},{-246.8381F,-399.5943F,},{-242.2880F,-493.4214F,}, + {-104.8258F,-183.7260F,},{-127.2704F,-288.3692F,},{17.116300F,247.94440F,},{28.590000F,141.33180F,},{-88.39520F,-8.409100F,},{-244.1211F,-41.49450F,},{-281.3448F,-44.43050F,},{-435.1837F,-417.8239F,}, + {7.2419000F,-97.64420F,},{32.515300F,38.550200F,},{13.574300F,-6.174500F,},{102.88080F,-123.3195F,},{184.39410F,428.29360F,},{-20.13120F,-127.9658F,},{-97.25060F,379.22250F,},{541.89470F,342.12550F,}, + {3.8567000F,79.183500F,},{339.32440F,253.39800F,},{87.921000F,66.552800F,},{117.63820F,32.476100F,},{490.72400F,188.26100F,},{152.82630F,-303.6073F,},{415.46300F,-125.0126F,},{20.317700F,471.51620F,}, + {120.83170F,146.52980F,},{183.34470F,88.231900F,},{241.62970F,156.33030F,},{23.616600F,-36.17640F,},{130.82320F,95.319300F,},{123.34420F,-25.34570F,},{-17.53680F,-385.5626F,},{253.17360F,-114.7059F,}, + {85.112600F,-25.82990F,},{-42.33470F,-51.85570F,},{195.47230F,-7.405400F,},{322.01970F,63.832500F,},{188.75460F,-173.2249F,},{506.79120F,93.875700F,},{390.46690F,470.76120F,},{243.34080F,526.34460F,}, + }, + + { + {-165.6917F,-377.1008F,},{-17.98370F,-75.86160F,},{7.9923000F,116.25350F,},{-130.2646F,-108.4639F,},{-311.2591F,-203.8264F,},{-339.0670F,-23.57200F,},{-7.653600F,-54.53950F,},{-423.8622F,-353.1093F,}, + {-240.0843F,-95.08200F,},{-143.2687F,8.5443000F,},{-101.9498F,-202.8074F,},{-43.42630F,-10.37850F,},{-291.0372F,55.326100F,},{-189.0665F,-593.2565F,},{-128.3240F,5.0444000F,},{-420.8219F,35.762800F,}, + {-206.5327F,85.114800F,},{-202.6915F,-233.0529F,},{-107.8853F,-28.10810F,},{-33.95630F,-155.5147F,},{-19.77350F,-490.9996F,},{-113.7118F,159.73310F,},{-345.0899F,238.75620F,},{68.787700F,-156.6325F,}, + {-52.29900F,-95.54260F,},{14.606500F,197.56230F,},{9.1784000F,-3.906100F,},{-88.07510F,114.63690F,},{-356.4571F,-517.1363F,},{-68.02240F,-113.1240F,},{-424.2482F,-150.8795F,},{-54.13860F,-30.29230F,}, + {-48.11040F,48.722800F,},{-9.974700F,-288.3043F,},{44.249300F,-134.2835F,},{68.270600F,70.915400F,},{294.67340F,-174.3828F,},{471.33110F,206.81070F,},{363.89680F,386.90480F,},{52.930000F,47.618800F,}, + {104.26640F,127.63530F,},{149.10830F,-71.25040F,},{280.53550F,183.93680F,},{288.38200F,42.039600F,},{61.611600F,50.856600F,},{170.86680F,156.74650F,},{139.90090F,-260.6101F,},{539.24370F,326.70950F,}, + {71.975100F,-6.711500F,},{169.81850F,90.253300F,},{157.30500F,24.483300F,},{59.160200F,-48.84550F,},{-42.61460F,-92.55310F,},{270.15440F,-94.32920F,},{487.06470F,75.464100F,},{345.55540F,126.52380F,}, + {-110.4957F,258.30830F,},{17.373900F,41.055800F,},{60.912700F,355.85580F,},{151.18090F,229.57390F,},{269.34040F,569.72710F,},{259.50450F,412.82330F,},{-14.73050F,568.47830F,},{252.07040F,354.99801F,}, + } +}; + +const float AR_TCVQ_CB_SUB3[4][32][2] = +{ + { + {-190.2462F,3.7460000F,},{-178.0891F,-156.6944F,},{37.733100F,176.00550F,},{-93.45970F,165.15130F,},{-267.7612F,-511.1700F,},{27.017600F,-276.8829F,},{-118.0160F,-462.8076F,},{188.15520F,-112.6265F,}, + {-112.2084F,-272.1046F,},{-75.63800F,28.803700F,},{-62.17480F,-51.65160F,},{-62.91250F,-122.3795F,},{-315.9380F,163.32500F,},{-335.8190F,-361.7829F,},{-10.02270F,-28.26150F,},{-411.0079F,-169.0698F,}, + {21.274600F,52.847800F,},{41.786600F,-55.20310F,},{131.61950F,-6.998400F,},{157.68690F,287.15550F,},{-42.42940F,-201.8275F,},{281.21280F,-25.80890F,},{-13.25970F,522.18800F,},{-66.78560F,354.06180F,}, + {20.563700F,-135.3851F,},{140.59070F,104.26130F,},{279.11580F,136.98410F,},{39.195800F,51.957500F,},{34.262500F,51.346000F,},{381.14700F,390.58580F,},{491.52390F,213.96490F,},{288.60580F,536.49710F,}, + }, + + { + {-133.0008F,-181.1299F,},{-84.55430F,-304.3680F,},{40.548600F,-157.9567F,},{-35.81290F,-86.14820F,},{-296.9231F,-235.1026F,},{-357.0671F,-316.6972F,},{-258.1654F,-349.4409F,},{-504.7979F,-113.4180F,}, + {-123.9764F,51.459200F,},{-224.7199F,-60.69300F,},{-89.06170F,-50.36220F,},{-100.2134F,190.61760F,},{-111.9099F,-529.1262F,},{-36.32900F,-101.2426F,},{-311.5327F,69.813400F,},{-318.3195F,-534.8423F,}, + {84.270600F,222.53200F,},{-0.942100F,28.769200F,},{213.25620F,65.535600F,},{97.994500F,73.849700F,},{30.130700F,19.067100F,},{-368.2725F,229.34600F,},{148.61930F,481.44170F,},{418.05130F,44.184400F,}, + {45.929700F,-10.41460F,},{151.92930F,-55.78590F,},{7.0662000F,84.175000F,},{287.46830F,226.85480F,},{429.16810F,486.29900F,},{176.48300F,159.59660F,},{579.15160F,254.26680F,},{-68.04440F,453.68870F,}, + }, + + { + {-100.1363F,-189.9851F,},{-26.01900F,223.37290F,},{-2.345900F,62.933400F,},{-66.92170F,59.692200F,},{-463.9627F,-172.0395F,},{-422.4871F,43.361300F,},{-250.2149F,-359.6565F,},{-90.88240F,-37.63640F,}, + {-199.5678F,57.586700F,},{-112.5751F,-36.52960F,},{189.51950F,260.19820F,},{-238.2629F,-142.8535F,},{-139.3418F,-351.6046F,},{-336.3076F,-424.9823F,},{-30.62490F,-40.98700F,},{-103.6085F,-330.2230F,}, + {5.6849000F,7.1876000F,},{31.018100F,-149.6002F,},{-80.41110F,-100.6484F,},{119.56500F,103.01690F,},{11.508400F,27.501500F,},{13.331700F,25.835000F,},{457.61300F,261.34590F,},{52.531100F,28.992900F,}, + {203.48110F,71.918000F,},{51.549200F,32.858000F,},{141.30200F,-35.55590F,},{22.330400F,-70.91510F,},{349.22210F,178.05560F,},{447.99330F,289.70830F,},{82.904000F,107.10660F,},{348.09590F,102.38850F,}, + }, + + { + {37.061900F,181.46230F,},{3.6812000F,53.960400F,},{-142.5384F,-250.3814F,},{-155.8055F,67.085000F,},{-97.44510F,-42.54350F,},{-36.71330F,-123.6734F,},{-63.68890F,-97.47460F,},{-233.4995F,-274.8922F,}, + {-72.26240F,14.184600F,},{-183.6676F,-77.60290F,},{25.462700F,93.954700F,},{-40.64230F,-141.5510F,},{-85.75550F,-313.0151F,},{-338.1776F,-25.63660F,},{-363.6425F,-156.2840F,},{-67.37240F,-51.54950F,}, + {-58.24200F,-193.3120F,},{181.77980F,98.461400F,},{-70.01130F,-27.99830F,},{171.39450F,112.01820F,},{321.84770F,218.43910F,},{12.987700F,52.170200F,},{22.943500F,52.400800F,},{34.529100F,56.928800F,}, + {72.765700F,16.633700F,},{26.847700F,-102.3211F,},{104.45050F,-37.68410F,},{15.601300F,31.425000F,},{32.724900F,50.955400F,},{264.88060F,147.81980F,},{316.65590F,175.13690F,},{359.29350F,211.19690F,}, + } +}; + +const float SN_TCVQ_CB_SUB1[2][128][2] = +{ + { + {-249.7201F,40.935000F,},{-190.5588F,-175.3474F,},{-207.0069F,-316.9469F,},{-163.5806F,-247.6570F,},{-304.9679F,-414.6172F,},{-228.6147F,150.62910F,},{-195.6332F,-287.7428F,},{-190.9146F,-284.4862F,}, + {-274.4084F,-267.7108F,},{-199.2563F,-297.6162F,},{-152.2094F,-112.0928F,},{-148.0732F,-148.0190F,},{-223.7592F,-331.2033F,},{-227.6105F,-303.8584F,},{-195.2056F,-316.4586F,},{-262.2246F,-164.0172F,}, + {-201.5461F,313.27600F,},{-103.5079F,-192.2481F,},{-204.4250F,-221.9848F,},{-76.03550F,1125.8286F,},{-234.5633F,-67.04640F,},{-221.8844F,-339.4012F,},{-194.2347F,258.93820F,},{-251.0932F,-362.9766F,}, + {-135.0324F,-147.6629F,},{-98.67180F,-122.1392F,},{-163.4477F,232.42880F,},{-93.88090F,-181.8259F,},{-165.4640F,-213.2693F,},{-217.3162F,-119.1242F,},{-194.1371F,958.06900F,},{-176.2805F,-91.93370F,}, + {-176.7314F,-261.5485F,},{-143.7121F,-243.8883F,},{-148.1108F,-258.7831F,},{-118.9980F,-33.07910F,},{-214.2710F,155.74650F,},{-213.2181F,-251.6092F,},{-188.9855F,-166.4937F,},{-151.3290F,-213.3292F,}, + {-127.0467F,-214.8412F,},{-89.61480F,46.211900F,},{-32.48210F,392.23270F,},{-46.92120F,181.57460F,},{-113.0420F,-86.90470F,},{-201.7185F,60.547200F,},{-187.6557F,583.69500F,},{-161.9915F,53.907100F,}, + {-163.7852F,-39.11590F,},{-135.6215F,426.20040F,},{-169.3460F,29.788000F,},{-53.86960F,-113.5168F,},{-169.7033F,-280.7249F,},{-200.7809F,368.96580F,},{-184.8111F,-10.30170F,},{-56.33640F,-124.8625F,}, + {-146.8623F,587.82200F,},{-128.5270F,146.07030F,},{-123.4510F,-196.9422F,},{-22.75330F,-2.165400F,},{-105.3485F,-182.0782F,},{-198.0657F,-211.0788F,},{-181.9700F,-70.67280F,},{-100.1089F,-202.3083F,}, + {-76.38740F,283.61110F,},{-34.55220F,-139.0253F,},{-72.58420F,-153.9831F,},{11.931600F,-78.54570F,},{-30.11220F,-124.4284F,},{159.48950F,53.219000F,},{246.00260F,265.74940F,},{341.77020F,533.29990F,}, + {-78.13370F,-74.09460F,},{64.957700F,503.70880F,},{234.41130F,423.72930F,},{107.71920F,181.32610F,},{221.30620F,615.15230F,},{166.00660F,108.59500F,},{260.32690F,147.33710F,},{472.14910F,915.47850F,}, + {-71.05110F,-159.7740F,},{-37.06930F,-55.00150F,},{25.370000F,198.17320F,},{49.636800F,82.767400F,},{132.76160F,91.831000F,},{187.70590F,159.38410F,},{281.83160F,469.86870F,},{434.41380F,295.44770F,}, + {63.308300F,141.27590F,},{54.061700F,294.21520F,},{-65.88060F,-50.19340F,},{72.918300F,-12.50020F,},{26.680200F,-36.36690F,},{206.31630F,1119.4720F,},{306.99130F,308.17540F,},{487.14390F,573.31600F,}, + {-185.9491F,948.56350F,},{7.6792000F,52.069300F,},{0.9533000F,-92.26370F,},{166.57380F,312.24880F,},{153.64230F,230.62340F,},{207.81570F,610.05630F,},{315.18780F,208.51600F,},{550.64840F,410.71780F,}, + {-5.303600F,-102.8303F,},{32.350300F,-61.52830F,},{61.661100F,-14.86550F,},{240.57980F,214.70890F,},{329.97410F,212.08160F,},{209.52500F,92.791300F,},{356.06930F,594.08890F,},{638.68310F,525.05230F,}, + {45.061100F,-21.59060F,},{102.92090F,33.850300F,},{-49.38050F,91.477600F,},{147.03860F,74.554000F,},{179.35820F,1032.6932F,},{211.70910F,362.16160F,},{367.65010F,370.43750F,},{740.51460F,596.78260F,}, + {-7.303000F,724.00010F,},{177.80790F,142.93470F,},{213.00960F,110.61410F,},{324.63510F,326.04950F,},{475.33930F,330.59920F,},{218.87990F,211.76850F,},{395.71800F,253.94620F,},{744.16310F,915.21080F,}, + }, + + { + {-206.2475F,-95.90960F,},{-246.3082F,21.747300F,},{-280.0828F,-108.0290F,},{-15.81770F,518.20420F,},{-394.8764F,-268.7632F,},{-323.0682F,-133.0426F,},{-256.3050F,-624.6605F,},{-387.5242F,-608.8890F,}, + {-175.6982F,364.49880F,},{-210.8799F,823.99400F,},{-233.7273F,-494.8845F,},{-151.1368F,-199.8177F,},{-429.7681F,-772.9858F,},{-317.0574F,-240.9158F,},{-253.5630F,-57.26850F,},{-341.3936F,228.86220F,}, + {-281.1353F,-234.9062F,},{-109.7592F,-108.9512F,},{-225.6748F,247.90130F,},{65.929400F,31.226900F,},{-398.6104F,-52.49470F,},{-310.1716F,101.05650F,},{-249.3468F,320.56650F,},{-354.3097F,16.494000F,}, + {-277.0976F,-595.7491F,},{-188.3772F,523.29140F,},{-90.61150F,-382.6038F,},{40.513800F,903.74660F,},{-358.6226F,-460.4389F,},{-308.4215F,501.50370F,},{-237.7401F,882.27940F,},{-333.4506F,-381.9203F,}, + {-243.6204F,127.42030F,},{-75.62440F,666.13180F,},{-34.39620F,414.18390F,},{149.42210F,464.74430F,},{-162.1738F,5.7292000F,},{-308.1293F,-447.4555F,},{-236.0531F,158.90870F,},{-339.5853F,443.61930F,}, + {-196.4904F,-408.9761F,},{-212.8717F,-310.0990F,},{-50.11780F,183.79020F,},{32.747800F,249.33110F,},{-231.0534F,-589.2890F,},{-273.0207F,681.87410F,},{-234.5115F,-144.0888F,},{-306.1589F,641.38990F,}, + {-86.46690F,-261.1131F,},{-87.17310F,101.82230F,},{-32.13380F,-174.4069F,},{-147.5939F,-474.4269F,},{-289.3846F,378.38780F,},{-269.2454F,-337.1601F,},{-222.4565F,-232.3191F,},{-395.3117F,-157.5576F,}, + {-129.1616F,202.52440F,},{-68.35150F,307.27670F,},{-85.86670F,-1.271900F,},{-17.84710F,-328.4484F,},{-374.8384F,115.94100F,},{-260.0821F,26.484400F,},{-220.8236F,-532.8561F,},{-103.5023F,-8.057100F,}, + {253.68710F,299.43310F,},{99.798300F,140.48320F,},{132.05620F,-133.5340F,},{649.87660F,635.39510F,},{80.181400F,-88.45330F,},{377.92370F,11.967000F,},{475.26380F,362.41510F,},{663.04860F,481.53290F,}, + {125.93200F,564.57300F,},{125.00390F,699.34770F,},{161.43320F,82.756400F,},{388.46600F,81.488500F,},{299.40020F,103.03960F,},{380.48160F,344.82180F,},{479.55360F,94.266000F,},{656.04440F,313.06860F,}, + {29.314100F,121.82290F,},{294.35730F,556.75000F,},{136.00140F,242.52100F,},{251.75710F,185.26940F,},{393.60200F,297.97100F,},{404.77110F,790.64840F,},{528.97090F,207.17710F,},{629.35130F,831.62210F,}, + {63.429500F,363.62860F,},{344.74340F,320.98350F,},{386.67160F,190.67860F,},{240.19720F,-79.32440F,},{753.49380F,482.21660F,},{413.70600F,537.17310F,},{539.83860F,557.06520F,},{800.08120F,624.70540F,}, + {234.99860F,63.354100F,},{148.31920F,320.29180F,},{277.09270F,415.69540F,},{456.34320F,536.84340F,},{214.59280F,227.59820F,},{414.97560F,183.63070F,},{552.78850F,426.47270F,},{818.25130F,872.82940F,}, + {73.162100F,-246.0924F,},{46.113400F,-192.6345F,},{278.84370F,698.09160F,},{506.97560F,263.00580F,},{373.99370F,491.39020F,},{422.46610F,438.95710F,},{570.45150F,307.05580F,},{829.71370F,470.72770F,}, + {13.191300F,-73.93830F,},{20.994200F,-13.84500F,},{311.61780F,0.1251000F,},{291.89030F,929.08090F,},{554.80360F,450.16100F,},{436.77840F,653.52060F,},{582.72210F,893.43050F,},{943.77210F,632.08490F,}, + {452.66180F,701.26420F,},{152.06640F,-49.38430F,},{466.26870F,391.67580F,},{616.44670F,391.50590F,},{505.32310F,142.80040F,},{448.40750F,271.20620F,},{590.86500F,699.51280F,},{1072.8364F,818.59820F,}, + } +}; + +const float SN_TCVQ_CB_SUB2[2][64][2] = +{ + { + {-276.9441F,-237.9956F,},{-240.2330F,-400.5215F,},{-168.0618F,-125.3249F,},{-17.18770F,403.15550F,},{-410.3021F,-12.59720F,},{-401.4485F,-725.0255F,},{-378.9797F,-42.53260F,},{-223.4008F,-557.0544F,}, + {-221.8536F,60.339100F,},{-55.66380F,-73.67660F,},{-31.18270F,208.03420F,},{-14.70030F,-246.7032F,},{-152.7168F,497.98040F,},{-385.0540F,-285.9732F,},{-187.2953F,-199.3057F,},{-377.2813F,37.510600F,}, + {-330.8419F,-541.7451F,},{-349.7656F,237.12440F,},{-143.6113F,-363.2778F,},{-150.6399F,137.64050F,},{-113.2274F,3.7534000F,},{-325.2374F,36.570200F,},{-206.2273F,671.09990F,},{-82.19470F,45.011800F,}, + {-206.7859F,334.70390F,},{-283.9658F,-89.72660F,},{-50.10190F,12.089100F,},{51.980300F,29.857900F,},{-107.5514F,-303.3203F,},{-240.0561F,-533.9766F,},{-132.4427F,-5.247100F,},{-404.3979F,480.69020F,}, + {175.02300F,332.36460F,},{233.95710F,41.575700F,},{430.97410F,434.21950F,},{248.10350F,487.89410F,},{297.34090F,302.33480F,},{207.50040F,-27.75610F,},{281.96760F,184.93040F,},{299.70790F,161.32720F,}, + {100.61040F,107.78600F,},{135.17980F,-148.3558F,},{190.27510F,196.71720F,},{435.19680F,47.673600F,},{344.53480F,606.71120F,},{774.72370F,483.79650F,},{830.43490F,475.25730F,},{680.48470F,492.90810F,}, + {52.827400F,-98.47120F,},{84.402600F,213.06580F,},{195.15830F,-48.72150F,},{538.51170F,746.06460F,},{118.75210F,29.688100F,},{589.58180F,237.71470F,},{602.54520F,540.84130F,},{211.57020F,715.21980F,}, + {-93.92180F,-182.2399F,},{301.03150F,254.59590F,},{356.44790F,109.52270F,},{510.59830F,279.64910F,},{716.35110F,402.13940F,},{409.68830F,191.91910F,},{634.49470F,286.14310F,},{974.51980F,759.27030F,}, + }, + + { + {-284.8923F,-332.8634F,},{-230.3763F,119.65300F,},{-155.3427F,115.29910F,},{-12.21440F,5.0214000F,},{-257.4728F,-29.15460F,},{-235.7490F,-480.0754F,},{-202.7355F,-263.5491F,},{-321.4648F,18.445600F,}, + {-294.7758F,-80.74580F,},{-319.5455F,-165.6476F,},{-275.4234F,-501.8569F,},{-100.6586F,-323.5581F,},{-315.1043F,-276.3239F,},{-71.14410F,-278.0978F,},{-362.3847F,1.2822000F,},{-177.8863F,-448.9796F,}, + {-329.8557F,164.76280F,},{-232.8216F,-393.7935F,},{-196.9382F,-183.5567F,},{-179.3588F,287.84510F,},{-131.8585F,-284.4139F,},{-326.5890F,401.69820F,},{-239.3882F,485.08990F,},{-238.0748F,504.86220F,}, + {-111.2109F,13.897700F,},{-109.4982F,-165.7892F,},{39.187700F,49.242200F,},{-179.4392F,-52.56030F,},{-62.00650F,-58.79660F,},{-112.2621F,74.326700F,},{21.768200F,-102.5222F,},{-103.2492F,-123.8958F,}, + {-2.999300F,235.37390F,},{24.464500F,117.61140F,},{209.73120F,-60.41300F,},{112.71650F,222.38860F,},{75.577500F,-161.0497F,},{337.52400F,31.008400F,},{267.89200F,155.94850F,},{328.81130F,647.32140F,}, + {45.064300F,-82.58150F,},{237.66130F,132.73260F,},{4.8216000F,-253.8600F,},{277.79930F,430.66600F,},{39.273100F,199.22940F,},{139.99440F,-162.6469F,},{494.67560F,176.94150F,},{207.76570F,239.06330F,}, + {-100.0752F,-265.5905F,},{15.938200F,454.44360F,},{233.38360F,309.59500F,},{189.17920F,-23.98650F,},{185.76940F,100.17430F,},{675.38230F,486.70190F,},{472.14070F,579.37430F,},{575.03280F,434.82210F,}, + {152.01630F,129.07580F,},{68.559300F,-151.6359F,},{400.30690F,123.64090F,},{409.88600F,286.04450F,},{578.27810F,432.67370F,},{502.13100F,240.50900F,},{675.71990F,390.09750F,},{781.79560F,651.86880F,}, + } +}; + +const float SN_TCVQ_CB_SUB3[4][32][2] = +{ + { + {-147.1049F,-340.6287F,},{-158.8735F,313.47230F,},{-238.5137F,-175.2864F,},{-154.9957F,-34.27780F,},{-186.0273F,-415.2119F,},{-311.3175F,-97.27870F,},{-102.8572F,-258.6216F,},{-184.6271F,589.29930F,}, + {-279.5144F,121.03210F,},{-240.5628F,-383.6411F,},{-289.7553F,-518.3302F,},{77.502600F,128.26760F,},{-349.3453F,-608.3804F,},{-340.3397F,-491.6917F,},{-276.4456F,-539.0219F,},{-308.0319F,-331.5846F,}, + {25.470200F,-122.3889F,},{-23.10160F,-214.1888F,},{-0.632900F,26.756400F,},{142.04180F,-65.81690F,},{247.83350F,718.83400F,},{90.964100F,-139.8895F,},{485.82500F,582.96200F,},{641.17530F,379.95140F,}, + {79.709900F,202.16160F,},{199.84410F,369.96700F,},{239.35830F,94.047800F,},{423.70620F,282.88420F,},{317.36140F,127.76640F,},{337.65540F,94.710900F,},{217.43590F,208.86400F,},{764.35860F,815.30510F,}, + }, + + { + {-370.2650F,11.518200F,},{-323.1142F,-461.2694F,},{-135.8559F,-129.8608F,},{-14.09620F,84.290400F,},{-567.7608F,-453.9710F,},{-266.5970F,-249.6583F,},{-291.9762F,-592.7589F,},{-274.9419F,479.50260F,}, + {-208.9252F,-386.0126F,},{-214.9314F,-42.54240F,},{-186.7444F,227.07210F,},{-121.1719F,-272.9866F,},{-510.8044F,-87.79140F,},{-302.7620F,-617.7623F,},{-324.5998F,-240.0224F,},{-47.00890F,-86.66380F,}, + {12.928800F,78.024900F,},{47.313200F,-86.25450F,},{183.98160F,182.61360F,},{316.09290F,122.14870F,},{371.33160F,278.26560F,},{168.42590F,-225.2161F,},{775.28210F,548.66520F,},{642.86270F,346.51310F,}, + {51.413000F,448.60110F,},{112.29160F,198.86870F,},{133.44860F,-92.65510F,},{392.28070F,469.91310F,},{124.10680F,-283.7072F,},{583.68000F,286.00210F,},{521.95260F,271.37440F,},{931.01620F,692.52800F,}, + }, + + { + {-341.3078F,-146.2225F,},{-92.54280F,10.245600F,},{6.3784000F,340.04950F,},{-277.1624F,169.62960F,},{15.939400F,-300.4278F,},{-413.4964F,-527.4807F,},{25.713000F,81.620300F,},{-395.4344F,-535.2822F,}, + {-30.72550F,-179.8318F,},{-261.9265F,-367.7827F,},{-4.797200F,22.196000F,},{-63.59540F,-168.5926F,},{-320.1832F,-419.0108F,},{-346.2061F,-53.06720F,},{-127.6520F,-195.8498F,},{-21.51770F,-5.277200F,}, + {254.60570F,253.18280F,},{143.04340F,160.79980F,},{240.36910F,98.565800F,},{60.270300F,84.249700F,},{4.6884000F,24.362900F,},{88.200900F,69.498000F,},{659.95560F,473.75490F,},{293.20990F,70.108000F,}, + {11.956700F,71.243400F,},{109.95050F,-114.0644F,},{-138.5130F,-251.0179F,},{366.76410F,361.08470F,},{241.70930F,34.973000F,},{654.41940F,441.34520F,},{322.92560F,106.27710F,},{605.58650F,564.89110F,}, + }, + + { + {-142.8305F,-357.6638F,},{-135.1517F,-91.95450F,},{-202.7971F,-55.12860F,},{10.622800F,119.25650F,},{-99.61230F,-36.02510F,},{-247.5775F,-381.3310F,},{-193.0612F,-420.8008F,},{-130.4904F,-356.4558F,}, + {-220.9295F,27.109700F,},{40.264600F,84.888100F,},{-115.6413F,-362.4221F,},{-195.5899F,-402.2075F,},{-170.5517F,-393.0729F,},{-56.84850F,-56.71290F,},{-82.37190F,-78.84410F,},{24.433000F,140.77510F,}, + {63.625500F,-48.12080F,},{296.32420F,215.87390F,},{32.041200F,80.732200F,},{-69.63830F,-95.39770F,},{63.503200F,133.94610F,},{450.10010F,363.00900F,},{76.867200F,96.687600F,},{16.700500F,-57.93000F,}, + {66.165600F,144.72830F,},{-183.0404F,-407.2658F,},{268.25850F,163.71400F,},{219.75790F,95.572100F,},{411.11030F,329.38500F,},{101.35990F,133.20170F,},{415.09750F,248.72830F,},{337.80520F,255.31020F,}, + } +}; + + + +const float AR_SVQ_CB1[32][8] = +{ + {-0.339000F, 1.5012220F, 6.1853590F, 1.6161480F, 17.3955550F, -42.95738F, 3.77089400F, 65.3032460F}, + {-1.351974F, 0.8601210F, 3.1036570F, -4.589009F, -2.7011160F, 9.0795180F, 109.094322F, -18.118401F}, + {-0.051575F, 0.6542590F, 0.3318340F, 3.1915060F, -28.443743F, -15.45044F, 27.7376230F, -38.083717F}, + {-0.147188F, 0.7379020F, 16.596052F, 29.073309F, -15.221093F, 27.937109F, 10.4191210F, 3.21426900F}, + {-0.174719F, 0.3557820F, 3.3571020F, -2.442146F, 15.4601880F, -25.54004F, -21.377092F, -50.052696F}, + {-0.080591F, -0.031826F, 3.2809340F, -3.976039F, -16.756672F, 41.078621F, -1.8470560F, -49.312294F}, + {0.0404590F, -0.057671F, 4.6628590F, -1.082124F, -38.447117F, -7.158832F, -34.349442F, -28.560730F}, + {-0.191480F, 0.3673300F, -2.228691F, -4.763459F, -19.210003F, -70.05153F, -11.678687F, -5.9500840F}, + {-0.475299F, -0.021802F, 9.2386790F, 30.398779F, 9.72456700F, -26.96944F, -10.201661F, -5.2955280F}, + {-0.118115F, 0.3768040F, -0.202488F, -11.21918F, 8.99932300F, -25.32194F, -49.176136F, 13.3742710F}, + {0.6345730F, -1.451740F, -8.976882F, -2.891539F, -5.2668590F, -0.626124F, -8.6982240F, -1.6381660F}, + {-0.238382F, 0.4619150F, -0.689163F, 17.277664F, -21.009787F, -22.53389F, 41.9676740F, 23.4523370F}, + {0.1244690F, 0.2248090F, -1.099318F, -5.740384F, -21.103287F, 37.994751F, -39.226761F, 15.9438480F}, + {0.1411080F, -0.771317F, -31.48548F, 36.181248F, -5.2501020F, 7.1155840F, -12.062582F, -29.405684F}, + {-0.496825F, 0.9002190F, 0.1078140F, -1.812450F, 64.9175870F, -25.02316F, -18.672247F, 3.00326800F}, + {-0.877380F, -0.101788F, -10.38443F, -42.23261F, 14.1089240F, 1.3607690F, 4.64615900F, -31.426619F}, + {0.0982910F, 0.0130060F, -0.021137F, 1.7109680F, 32.0608750F, -0.580048F, 30.8528560F, 20.9283330F}, + {0.3703540F, -1.599935F, 1.9165930F, -3.437332F, -15.018585F, 112.87896F, 6.09581900F, 6.06509400F}, + {-0.239501F, 0.5997340F, 2.2582460F, -26.70808F, 23.7027260F, 26.134411F, -12.169220F, 39.0906330F}, + {1.1549010F, -2.333077F, 0.9387050F, -0.701751F, -0.2820180F, -2.514828F, -84.775269F, 106.470406F}, + {-0.120044F, 0.4967050F, -16.62750F, -24.21043F, -2.7719380F, -23.45862F, 10.9770750F, 30.4632150F}, + {-0.452348F, 0.9215980F, 4.0024690F, -0.181623F, 29.6472510F, 32.739918F, -21.457884F, -17.419983F}, + {-0.247916F, -0.922579F, 1.4429350F, 1.8360180F, -12.594628F, 29.236597F, 27.3443550F, 68.9287800F}, + {0.7650280F, -0.545622F, -0.185167F, 2.1660980F, 10.6230550F, 11.247939F, -85.990189F, -37.903763F}, + {-0.236738F, 0.4044940F, 35.338413F, -21.96892F, -4.0015380F, -6.422642F, 11.3325710F, 3.03891400F}, + {-0.526660F, 1.1162520F, -3.871234F, -0.059409F, 0.78312500F, -9.391847F, 18.9848520F, -131.23975F}, + {-0.433725F, 0.2320700F, -3.264241F, -3.579835F, 21.6186620F, -52.31819F, 41.0296550F, -17.336693F}, + {-0.150218F, 0.2436480F, -6.385384F, 26.976192F, 20.1004640F, 15.708211F, -20.112616F, 38.2443770F}, + {-0.024170F, 0.8500570F, -4.579786F, -12.50560F, -54.536289F, 19.191902F, 19.6398750F, 10.2497080F}, + {-0.124103F, 1.0465660F, 3.0224720F, 11.137490F, 30.1374190F, 9.5446160F, 29.8574750F, -40.261337F}, + {-0.196671F, 0.7005810F, -9.238495F, -7.187382F, 2.81278600F, 38.941822F, 36.7256850F, 1.86695500F}, + {0.0413730F, -0.259086F, 3.8143860F, 10.183937F, -33.918419F, -13.19506F, -21.927582F, 40.2238810F}, +}; + +const float AR_SVQ_CB2[16][8] = +{ + {-14.44511F, -23.12155F, 81.241760F, -34.49714F, 21.0647720F, 22.618990F, -6.4248760F, -9.472386F}, + {-0.129507F, -38.33505F, 3.5780910F, -25.32102F, -71.163628F, -8.083008F, 7.34998800F, 3.5089460F}, + {-0.531659F, 42.984482F, -2.949942F, 23.185688F, 78.3983150F, 3.3631430F, -14.996096F, -8.493151F}, + {-0.553943F, 15.531711F, -8.511508F, -71.40907F, 18.1345100F, -63.29620F, -15.015837F, -2.255207F}, + {4.7402910F, 0.7143230F, -75.55894F, 25.115595F, -16.831573F, -18.81928F, 4.13968000F, 3.3929720F}, + {-32.50397F, 68.406067F, -3.199107F, -21.32696F, -25.471333F, 25.902178F, 10.0576690F, 2.3217050F}, + {11.180623F, 1.3522740F, 0.9572140F, -3.889576F, -39.069595F, 114.30133F, 29.1799030F, -4.798602F}, + {2.5571490F, -21.08170F, -29.49300F, -35.49685F, 24.4835700F, 46.452934F, -32.716568F, -32.81908F}, + {1.2645100F, 2.9239020F, 2.2633560F, 2.5141150F, -11.900713F, 5.8893120F, -68.704033F, 65.771515F}, + {-4.081663F, 17.567835F, 10.064315F, 22.194927F, -36.000233F, -26.37986F, -45.523380F, -52.28128F}, + {0.0228670F, -14.62688F, -13.12301F, -27.02922F, 41.2410550F, 21.242199F, 47.1964420F, 51.328987F}, + {-9.871984F, -24.99879F, 2.6157990F, 80.172798F, 0.43614800F, 36.480019F, 10.4512970F, 2.2055040F}, + {25.002769F, 10.773156F, 19.834276F, 2.9322950F, -2.5556860F, 6.9424410F, 10.6092970F, 0.1834710F}, + {-7.853089F, 17.244720F, 22.289469F, 30.428480F, -21.601667F, -66.57227F, 34.5492820F, 36.391033F}, + {4.8071940F, -49.02123F, 4.8164340F, 21.801281F, 39.0447200F, -62.45168F, -33.871502F, -1.336098F}, + {-2.572755F, -7.192194F, -2.623712F, -2.309371F, 14.2487590F, -21.16166F, 68.2372970F, -68.92265F}, +}; + + + +const float W_DTX_HO[HO_HIST_SIZE] = +{ + 0.2f, 0.16f, 0.128f, 0.1024f, 0.08192f, 0.065536f, 0.0524288f, 0.01048576f +}; +const float ENR_ATT[5] = +{ + 1.7938412f, 1.3952098f, 1.0962363f, 0.9965784f, 0.9965784f +}; +const float HO_ATT[5] = +{ + 0.5370318f, 0.6165950f, 0.6839116f, 0.7079458f, 0.7079458f +}; + +const int16_t uniform_model[] = { MAX_AR_FREQ, MAX_AR_FREQ / 2, 0 }; + + +/*-----------------------------------------------------------------* + * LSF quantization - mid-frame quantization tables + *-----------------------------------------------------------------*/ + +const float tbl_mid_gen_wb_2b[] = +{ + 0.4656f, 0.6281f, 0.7148f, 0.6457f, 0.6442f, 0.5957f, 0.5953f, 0.5216f, 0.4722f, 0.4609f, 0.4141f, 0.3861f, 0.3809f, 0.3685f, 0.4144f, 0.7097f, + 0.1809f, 0.1051f, 0.2402f, 0.3904f, 0.3790f, 0.4562f, 0.4577f, 0.5524f, 0.6081f, 0.5894f, 0.6131f, 0.6512f, 0.6503f, 0.6465f, 0.6216f, 0.4204f, + 0.4828f, 0.4701f, 0.1855f, 0.2034f, 0.1897f, 0.1691f, 0.1876f, 0.1558f, 0.1762f, 0.1863f, 0.1950f, 0.1997f, 0.2279f, 0.2492f, 0.3031f, 0.2513f, + 0.8591f, 0.9902f, 0.8941f, 0.8507f, 0.8395f, 0.8579f, 0.8529f, 0.8665f, 0.8549f, 0.8490f, 0.8456f, 0.8310f, 0.8161f, 0.7884f, 0.7167f, 0.7381f +}; + +const float tbl_mid_gen_wb_4b[] = +{ + 0.6754f, 0.6266f, 0.2594f, 0.4293f, 0.5988f, 0.6866f, 0.7737f, 0.8446f, 0.8367f, 0.7757f, 0.6525f, 0.4878f, 0.4399f, 0.6822f, 0.8499f, 0.9169f, + 0.5150f, 0.5075f, 0.5972f, 0.7730f, 0.7064f, 0.3579f, 0.3356f, 0.2816f, 0.4175f, 0.5651f, 0.6825f, 0.7629f, 0.8104f, 0.8879f, 0.9649f, 1.0229f, + 0.1213f, 0.0451f, 0.3574f, 0.6272f, 0.5909f, 0.7193f, 0.6508f, 0.6297f, 0.4830f, 0.3821f, 0.4058f, 0.6131f, 0.6461f, 0.4852f, 0.3038f, 0.1367f, + 0.1303f, 0.3017f, 0.7760f, 0.5108f, 0.3865f, 0.3936f, 0.4859f, 0.6171f, 0.6062f, 0.5887f, 0.4692f, 0.2842f, 0.1756f, 0.1119f, 0.3070f, 1.0069f, + 0.4625f, 0.1159f, 0.0638f, 0.2087f, 0.2359f, 0.4036f, 0.4013f, 0.5520f, 0.6631f, 0.6459f, 0.6890f, 0.7467f, 0.7527f, 0.7255f, 0.6874f, 0.2549f, + 0.9602f, 1.0056f, 0.7894f, 0.4936f, 0.4631f, 0.5603f, 0.5964f, 0.6598f, 0.7327f, 0.8236f, 0.8793f, 0.8986f, 0.8523f, 0.7516f, 0.4876f, 0.2617f, + 0.3464f, 0.8811f, 0.9676f, 0.9462f, 0.9284f, 0.9216f, 0.8469f, 0.8365f, 0.7655f, 0.7197f, 0.6851f, 0.6403f, 0.5936f, 0.4461f, 0.3832f, 0.7717f, + 0.5270f, 0.4135f, 0.1264f, 0.3417f, 0.3381f, 0.4151f, 0.3729f, 0.2742f, 0.2817f, 0.2233f, 0.1778f, 0.1230f, 0.1289f, 0.1093f, 0.0955f, 0.0132f, + 0.8746f, 0.9792f, 0.8386f, 0.7884f, 0.7704f, 0.6721f, 0.6808f, 0.5483f, 0.4803f, 0.4591f, 0.3960f, 0.3416f, 0.3050f, 0.2645f, 0.2381f, 0.5810f, + 0.7030f, 0.6592f, 0.1469f, 0.0839f, 0.0790f, 0.1176f, 0.1814f, 0.2442f, 0.3660f, 0.3881f, 0.4437f, 0.5245f, 0.5451f, 0.4541f, 0.3998f, 0.5842f, + 0.1284f, 0.2200f, 0.7487f, 0.7905f, 0.8393f, 0.8522f, 0.8766f, 0.8915f, 0.8712f, 0.8590f, 0.8882f, 0.8786f, 0.8529f, 0.8689f, 0.8129f, 0.7096f, + 0.4999f, 0.7661f, 0.7385f, 0.5921f, 0.3904f, 0.6033f, 0.3976f, 0.1778f, 0.1621f, 0.0616f, 0.0683f, 0.1798f, 0.4865f, 0.7124f, 0.7046f, 0.8980f, + 0.8318f, 0.9070f, 0.4943f, 0.3149f, 0.5268f, 0.2983f, 0.3951f, 0.3793f, 0.3001f, 0.3530f, 0.3117f, 0.2348f, 0.2285f, 0.2525f, 0.4374f, -0.0230f, + 0.0504f, 0.0291f, 0.0302f, 0.0619f, 0.0609f, 0.0660f, 0.0991f, 0.0937f, 0.0830f, 0.0586f, 0.0509f, 0.0374f, 0.0701f, 0.0650f, 0.0893f, 0.2719f, + 1.0371f, 1.1706f, 1.0188f, 0.9709f, 0.9345f, 0.9754f, 0.9875f, 1.0269f, 1.0413f, 1.0355f, 1.0280f, 1.0279f, 1.0333f, 1.0062f, 0.9397f, 0.8962f, + 0.3767f, 0.3565f, 0.3735f, 0.3687f, 0.1498f, -0.0124f, -0.0510f, -0.1065f, -0.0239f, 0.1375f, 0.2156f, 0.3068f, 0.3234f, 0.4213f, 0.5425f, 0.2117f +}; + +const float tbl_mid_gen_wb_5b[] = +{ + 0.7947f, 0.9837f, 0.8671f, 0.7440f, 0.7914f, 0.7161f, 0.7356f, 0.7865f, 0.8401f, 0.8431f, 0.8563f, 0.8033f, 0.6896f, 0.4937f, 0.3437f, 0.3075f, + 0.4612f, 0.2591f, 0.4370f, 0.5153f, 0.3171f, 0.5653f, 0.3472f, 0.5987f, 0.6648f, 0.5528f, 0.6331f, 0.7603f, 0.7581f, 0.6949f, 0.7584f, -0.5701f, + 1.1047f, 1.2127f, 1.0304f, 0.9669f, 0.9211f, 0.9570f, 0.9737f, 1.0175f, 1.0595f, 1.0628f, 1.0624f, 1.0506f, 1.0449f, 1.0223f, 0.9471f, 0.7819f, + 0.5180f, 0.7050f, 0.3588f, 0.7186f, 0.4978f, 0.3805f, 0.6429f, 0.6934f, 0.5602f, 0.2931f, 0.0892f, 0.1234f, 0.2023f, 0.5777f, 0.8607f, 0.4873f, + 0.3062f, 0.3852f, 0.4086f, 0.1959f, 0.5432f, 0.5655f, 0.4243f, 0.7347f, 0.4984f, 0.4668f, 0.6266f, 0.7349f, 0.3971f, 0.1670f, 0.2119f, 1.6488f, + 0.7244f, 0.7778f, 0.5486f, 0.3610f, 0.5400f, 0.8138f, 0.9969f, 1.0270f, 0.9713f, 0.8714f, 0.6736f, 0.3734f, 0.3453f, 0.3443f, 0.3385f, 0.3996f, + 0.6084f, 0.6795f, 0.7118f, 0.5561f, 0.6997f, 0.8225f, 0.8165f, 0.5717f, 0.2765f, 0.5144f, 0.8840f, 1.2194f, 1.1934f, 1.1069f, 0.5796f, 0.2798f, + 0.3175f, 0.6022f, 0.3374f, 0.6010f, 0.4594f, 0.4490f, 0.6831f, 0.2538f, 0.7456f, 0.8330f, 0.6722f, 0.6850f, 0.8292f, 0.6778f, 0.1392f, 1.2199f, + 0.8647f, 0.8161f, 0.6485f, 0.6343f, 0.3797f, 0.6515f, 0.4315f, 0.3022f, 0.3024f, 0.2120f, 0.2551f, 0.4923f, 0.6934f, 0.7993f, 0.8923f, 1.4418f, + 0.9937f, 1.0501f, 0.8747f, 0.8225f, 0.7346f, 0.6469f, 0.6941f, 0.5764f, 0.5015f, 0.5440f, 0.4532f, 0.3822f, 0.3245f, 0.2851f, 0.2747f, 0.9828f, + 0.0887f, 0.2277f, 0.7413f, 0.4800f, 0.2756f, 0.2946f, 0.5888f, 0.6998f, 0.6227f, 0.7478f, 0.5725f, 0.1379f, 0.1431f, 0.1805f, 0.4829f, 0.8794f, + 0.7376f, 0.1250f, 0.6556f, 0.7320f, 0.6059f, 0.6806f, 0.6199f, 0.7132f, 0.8434f, 1.0333f, 1.0499f, 0.7492f, 0.6957f, 0.9826f, 1.2112f, 1.0154f, + 0.3330f, 0.1984f, 0.5798f, 0.6109f, 0.7079f, 0.6028f, 0.7755f, 0.3997f, 0.2174f, 0.3778f, 0.1806f, 0.3828f, 0.6677f, 0.1698f, -0.0764f, 0.2957f, + 0.5380f, 0.3941f, 0.1545f, 0.1817f, 0.1492f, 0.1176f, 0.1401f, 0.1443f, 0.1624f, 0.2161f, 0.1050f, 0.0465f, 0.0992f, 0.1548f, 0.2871f, 0.4829f, + 0.2054f, -0.0147f, 0.0101f, 0.1512f, 0.1155f, 0.1964f, 0.2419f, 0.3925f, 0.4822f, 0.5127f, 0.5489f, 0.5979f, 0.5555f, 0.4388f, 0.2863f, 0.2983f, + 0.1288f, 0.3915f, 0.9106f, 0.8310f, 0.8671f, 0.8521f, 0.9646f, 1.0005f, 0.8326f, 0.7556f, 0.7819f, 0.9050f, 0.9725f, 0.9163f, 0.8449f, 1.2049f, + 0.3862f, 0.9760f, 1.0310f, 1.0706f, 1.0307f, 1.0134f, 0.8999f, 0.8605f, 0.7434f, 0.6955f, 0.6213f, 0.5850f, 0.6099f, 0.5950f, 0.5231f, 0.8160f, + 0.4494f, 0.0389f, 0.0654f, 0.3875f, 0.5487f, 0.6697f, 0.7089f, 0.7020f, 0.6666f, 0.5399f, 0.4341f, 0.4210f, 0.6284f, 0.9229f, 0.7662f, 0.4618f, + 0.2426f, 0.5138f, 0.8489f, 0.7178f, 0.9105f, 0.9475f, 0.5281f, 0.6052f, 0.6291f, 0.2624f, 0.3647f, 0.3014f, 0.1434f, 0.1341f, 0.4881f, 0.4822f, + 0.1594f, 0.2811f, 0.9458f, 1.0056f, 0.7466f, 0.3447f, 0.2163f, 0.1379f, 0.3098f, 0.4083f, 0.6490f, 0.5827f, 0.4478f, 0.6663f, 0.6737f, 0.6829f, + 0.5054f, 0.5285f, 0.4076f, 0.3663f, 0.3258f, -0.0096f, -0.0710f, -0.2110f, -0.0830f, 0.1579f, 0.3359f, 0.4516f, 0.4427f, 0.5405f, 0.6043f, 0.3350f, + 0.6481f, 0.4408f, 0.1212f, 0.4304f, 0.2494f, 0.4807f, 0.2526f, 0.1751f, 0.5094f, 0.3185f, 0.3301f, 0.4504f, 0.4499f, 0.2312f, 0.1710f, -0.2053f, + 0.7435f, 0.5872f, 0.1184f, 0.1298f, 0.2084f, 0.3730f, 0.5612f, 0.8230f, 0.9030f, 0.8439f, 0.8983f, 0.9624f, 0.9242f, 0.8337f, 0.7372f, 0.4667f, + 0.8055f, 0.7332f, 0.1523f, 0.5286f, 0.8466f, 0.4619f, 0.4315f, 0.4763f, 0.3932f, 0.6572f, 0.6947f, 0.7321f, 0.7294f, 0.8217f, 1.1139f, 0.6574f, + 0.0249f, 0.0296f, 0.2452f, 0.4120f, 0.4165f, 0.4159f, 0.3285f, 0.3109f, 0.0730f, -0.0183f, 0.0082f, 0.0305f, 0.0754f, 0.1446f, 0.2425f, 0.1412f, + 0.6086f, 0.9737f, 0.8510f, 0.1865f, 0.0105f, 0.0343f, 0.1827f, 0.3665f, 0.5118f, 0.5408f, 0.5763f, 0.6490f, 0.7326f, 0.7545f, 0.8498f, 0.6690f, + 0.8440f, 0.9721f, 0.6413f, 0.3723f, 0.6549f, 0.3935f, 0.4616f, 0.3716f, 0.3139f, 0.3851f, 0.2738f, 0.1968f, 0.2633f, 0.3083f, 0.3398f, -0.1988f, + 0.8972f, 0.8181f, 0.2972f, 0.2365f, 0.3111f, 0.2415f, 0.3441f, 0.3439f, 0.2514f, 0.3043f, 0.4160f, 0.2861f, 0.1513f, 0.1437f, 0.1116f, 0.4593f, + 0.5325f, 0.3790f, -0.1778f, -0.2148f, 0.0383f, 0.1772f, 0.3178f, 0.2004f, 0.2038f, 0.2017f, 0.2756f, 0.3042f, 0.4692f, 0.5370f, 0.6363f, 0.0806f, + 0.0427f, 0.0436f, 0.0133f, 0.0101f, -0.0678f, -0.1081f, -0.0871f, -0.0717f, -0.0147f, 0.0031f, 0.0231f, 0.0648f, 0.0721f, 0.0178f, 0.0190f, 0.1752f, + 0.0608f, 0.0258f, 0.3738f, 0.8259f, 0.8728f, 0.9939f, 0.9193f, 0.9188f, 0.9589f, 0.8421f, 0.8073f, 0.7910f, 0.6457f, 0.5261f, 0.6520f, 0.5040f, + 0.3360f, 0.8495f, 0.8652f, 0.5642f, 0.3230f, 0.2924f, 0.2144f, 0.0397f, 0.0596f, 0.0316f, -0.0152f, -0.0704f, -0.0675f, 0.0751f, 0.0680f, 0.5636f +}; + + + +const float tbl_mid_voi_wb_1b[] = +{ + 0.5556f, 0.5614f, 0.5803f, 0.6146f, 0.6082f, 0.6382f, 0.6492f, 0.6840f, 0.6957f, 0.6899f, 0.6887f, 0.7039f, 0.7110f, 0.7170f, 0.7103f, 0.7392f, + 0.4658f, 0.4096f, 0.2833f, 0.3310f, 0.3540f, 0.3314f, 0.3406f, 0.3062f, 0.3059f, 0.3186f, 0.3194f, 0.2953f, 0.3098f, 0.3201f, 0.3667f, 0.3327f +}; +const float tbl_mid_voi_wb_4b[] = +{ + 0.5294f, 0.5170f, 0.4304f, 0.4984f, 0.4290f, 0.6661f, 0.3867f, 0.3063f, 0.5393f, 0.6129f, 0.1603f, 0.3603f, 0.6527f, 0.4752f, 1.0162f, 1.4353f, + 0.5102f, 0.4928f, 0.4840f, 0.4249f, 0.4917f, 0.4009f, 0.3227f, 0.5597f, 0.5797f, 0.3755f, 0.3920f, 0.1344f, 0.5097f, 0.9082f, 0.7013f, -0.5011f, + 0.5175f, 0.4830f, 0.5432f, 0.6072f, 0.6592f, 0.7000f, 0.7624f, 0.8040f, 0.9490f, 0.3295f, 0.3397f, 0.4241f, 0.1642f, -0.0386f, 0.6188f, 0.5986f, + 0.4839f, 0.4651f, 0.3263f, 0.3700f, 0.2745f, 0.3867f, 0.3851f, 0.5132f, 0.8931f, 0.8760f, 1.0596f, 0.8724f, 0.6003f, 0.5049f, 0.3836f, 0.3676f, + 0.4969f, 0.4703f, 0.4758f, 0.4850f, 0.4228f, 0.3513f, 0.7059f, 0.6520f, 0.2106f, 0.0978f, 0.1457f, 0.5174f, 0.8381f, 0.6043f, 0.0969f, 0.7654f, + 0.4801f, 0.4578f, 0.6019f, 0.4476f, 0.4376f, 0.3113f, 0.5259f, 0.7027f, 0.5497f, 0.8644f, 0.5973f, 0.1313f, 0.0133f, 0.2014f, 0.2304f, 1.0817f, + 0.5863f, 0.5892f, 0.6066f, 0.6727f, 0.7041f, 0.5282f, 0.6442f, 0.6023f, 0.8434f, 0.9365f, 0.6537f, 0.4810f, 1.2195f, 1.1746f, 0.9103f, 0.5129f, + 0.5512f, 0.5199f, 0.2983f, 0.5917f, 0.4551f, 0.5614f, 0.6073f, 0.7500f, 0.4989f, 0.5331f, 0.8576f, 0.6138f, 0.2936f, 0.8562f, 1.6316f, 0.7646f, + 0.5793f, 0.5562f, 0.6601f, 0.7161f, 0.5777f, 0.4990f, 0.4840f, 0.4064f, 0.5700f, 0.3790f, 0.7224f, 0.9551f, 0.7356f, 1.1203f, 0.2266f, 1.6149f, + 0.5042f, 0.5144f, 0.3071f, 0.4324f, 0.5917f, 0.4579f, 0.4522f, 0.2905f, 0.5115f, 0.5843f, 0.5678f, 0.6080f, 0.6961f, -0.0033f, -0.3615f, 0.0158f, + 0.5445f, 0.5767f, 0.6388f, 0.5713f, 0.7336f, 0.8816f, 0.7753f, 0.3746f, 0.0739f, 0.7244f, 0.6869f, 0.4683f, 0.4260f, 0.7398f, 0.4341f, 0.3155f, + 0.5650f, 0.5765f, 0.6671f, 0.5102f, 0.5444f, 0.7536f, 0.7220f, 0.8862f, 0.5741f, 0.5022f, 0.4807f, 1.1700f, 0.9869f, 0.4616f, 0.9180f, 0.0763f, + 0.6106f, 0.6861f, 0.7754f, 0.8440f, 0.8752f, 0.9422f, 0.9259f, 1.0264f, 1.0205f, 0.9623f, 0.8996f, 0.8816f, 0.8076f, 0.7327f, 0.6793f, 1.1467f, + 0.4955f, 0.5031f, 0.5100f, 0.5392f, 0.4195f, 0.1782f, 0.1258f, 0.0135f, 0.0714f, 0.2085f, 0.5150f, 0.6615f, 0.3156f, 0.3900f, 0.7506f, 0.3932f, + 0.4143f, 0.3389f, 0.2405f, 0.3305f, 0.3641f, 0.4799f, 0.3964f, 0.2111f, 0.0548f, -0.0133f, -0.0056f, -0.0572f, 0.0485f, 0.2417f, 0.2814f, 0.1920f, + 0.3978f, 0.2283f, 0.0296f, 0.0478f, 0.0913f, 0.0751f, 0.1447f, 0.1568f, 0.2758f, 0.3280f, 0.2700f, 0.2151f, 0.2654f, 0.2303f, 0.2255f, 0.2530f +}; + +const float tbl_mid_voi_wb_5b[] = +{ + 0.5105f, 0.4663f, 0.5008f, 0.6860f, 0.5005f, 0.5466f, 0.4820f, 0.6168f, 0.3562f, 0.3763f, 0.5162f, 0.4556f, 0.2225f, 0.7751f, 2.1033f, 0.5617f, + 0.5323f, 0.4977f, 0.2730f, 0.5039f, 0.3926f, 0.5704f, 0.7351f, 0.7961f, 0.7014f, 0.5227f, 0.3810f, 0.5430f, 0.7882f, 1.5348f, 0.5372f, 0.9516f, + 0.5161f, 0.4988f, 0.5340f, 0.5273f, 0.5461f, 0.5780f, 0.5404f, 0.6856f, 0.7294f, 0.0169f, 0.7186f, 0.4543f, 0.2812f, -0.4187f, 0.6098f, 0.7624f, + 0.5273f, 0.5303f, 0.4892f, 0.5282f, 0.4056f, 0.8344f, 0.4427f, 0.4065f, 0.3812f, 0.4848f, 0.2908f, 0.2198f, 0.7839f, 0.3860f, 1.1033f, 1.7247f, + 0.5119f, 0.5130f, 0.5387f, 0.3300f, 0.5096f, 0.5286f, 0.3192f, 0.9277f, 0.2096f, 0.4280f, 0.6923f, 0.8753f, 0.4327f, 0.2869f, -0.3342f, 0.8895f, + 0.5090f, 0.4776f, 0.5277f, 0.4664f, 0.5432f, 0.8258f, 0.9150f, 0.9896f, 0.9090f, 0.6744f, 0.3770f, 0.2396f, 0.2459f, 0.4065f, 0.1192f, 0.1223f, + 0.5595f, 0.5394f, 0.4375f, 0.5036f, 0.5839f, 0.6266f, 0.3891f, 0.6103f, 0.5874f, 0.5663f, 1.2253f, 0.8567f, 0.6243f, 0.6796f, 0.4019f, -0.7769f, + 0.4793f, 0.4995f, 0.3308f, 0.3321f, 0.2196f, 0.4284f, 0.5544f, 0.4090f, 0.5595f, 0.7174f, 0.7982f, 0.6268f, 0.1198f, 0.4918f, 0.8815f, 0.0723f, + 0.5645f, 0.5575f, 0.5454f, 0.5652f, 0.6970f, 0.6375f, 0.7182f, 0.3128f, 1.0318f, 0.3448f, 0.0133f, 0.7923f, 0.1477f, 0.3566f, 0.8901f, 0.8689f, + 0.5182f, 0.5078f, 0.6249f, 0.5317f, 0.6768f, 0.3704f, 0.1840f, 0.5101f, 0.7289f, 0.2379f, 0.4136f, 0.0748f, 0.6097f, 1.1010f, 0.8246f, -0.0766f, + 0.5988f, 0.6057f, 0.5528f, 0.8575f, 0.5987f, 0.5457f, 0.6180f, 0.4199f, 0.7749f, 0.7449f, 0.5272f, 0.5365f, 0.9174f, 0.7994f, -0.4513f, 0.7950f, + 0.5716f, 0.5605f, 0.6473f, 0.5607f, 0.5092f, 0.6426f, 0.7466f, 0.9075f, 0.5011f, 0.6658f, 0.3106f, 1.0367f, 0.7924f, 0.1091f, 1.0966f, -0.2937f, + 0.4433f, 0.4193f, 0.4868f, 0.5121f, 0.4497f, 0.2652f, 0.8222f, 0.5557f, -0.0414f, 0.0932f, 0.0376f, 0.4227f, 0.7474f, 0.3534f, 0.3456f, 0.6976f, + 0.5268f, 0.5018f, 0.2730f, 0.3274f, 0.1291f, 0.0664f, 0.3102f, 0.2047f, 0.4332f, 0.3378f, 0.4121f, 0.7203f, 0.8165f, 0.7094f, 0.8077f, 0.4042f, + 0.5477f, 0.5231f, 0.6094f, 0.4463f, 0.7288f, 0.5550f, 0.4852f, 0.7322f, 0.6085f, 0.8074f, 0.5868f, 0.2406f, 1.8234f, 0.5357f, 0.7511f, 0.4092f, + 0.5616f, 0.5749f, 0.6051f, 0.5437f, 0.5948f, 0.8798f, 0.7179f, 0.4225f, 0.2786f, 0.2233f, 0.6857f, 1.2117f, 1.2260f, 0.9426f, 0.3945f, 0.5651f, + 0.4840f, 0.4684f, 0.2549f, 0.5206f, 0.6155f, 0.4246f, 0.5436f, 0.3423f, 0.5080f, 0.5930f, 0.5267f, 0.5302f, 0.6339f, -0.2225f, -0.6138f, -0.1388f, + 0.4198f, 0.3463f, 0.3111f, 0.4959f, 0.3487f, 0.3243f, 0.3250f, 0.6211f, 1.2876f, 1.0880f, 0.8094f, 0.7806f, 0.6797f, 0.3919f, 0.2967f, 0.4151f, + 0.4972f, 0.4686f, 0.7088f, 0.6465f, 0.4597f, 0.2859f, 0.3155f, 0.1088f, 0.3838f, 0.3647f, 0.8309f, 0.5647f, 0.4517f, 0.7146f, 0.1884f, 1.9724f, + 0.5113f, 0.4938f, 0.5241f, 0.5526f, 0.4893f, 0.1725f, 0.5946f, 0.7423f, 0.4025f, 0.7991f, 0.6111f, -0.0446f, -0.2892f, 0.1679f, 0.6741f, 1.0726f, + 0.5833f, 0.5838f, 0.6032f, 0.5539f, 0.5489f, 0.3820f, 0.6023f, 0.5336f, 0.8758f, 0.8451f, 1.0522f, 1.2495f, 1.0576f, 1.2314f, 1.3334f, 0.8928f, + 0.6036f, 0.6123f, 0.7860f, 0.7755f, 0.8086f, 0.7890f, 0.8469f, 0.9213f, 0.8550f, 0.8890f, 0.9344f, 0.8727f, 0.9338f, 0.3353f, 0.4170f, 1.8179f, + 0.5830f, 0.6630f, 0.6732f, 0.7561f, 0.6958f, 0.6695f, 0.3412f, 0.6684f, 0.4912f, 1.0853f, 0.3577f, 0.9663f, 0.4184f, 0.9851f, 0.7226f, 1.6406f, + 0.5759f, 0.6087f, 0.5859f, 0.6453f, 0.8016f, 0.8000f, 0.8058f, 0.1508f, -0.1484f, 0.8003f, 0.7444f, 0.4837f, 0.5323f, 0.6758f, 0.6735f, 0.4804f, + 0.5787f, 0.5712f, 0.6827f, 0.5971f, 0.4699f, 0.6927f, 0.7919f, 0.7616f, 0.8621f, 1.4702f, 1.3328f, 0.2976f, 0.4855f, 0.8906f, 1.0309f, 0.8087f, + 0.5932f, 0.7057f, 0.8047f, 0.9032f, 0.9799f, 1.0813f, 0.9935f, 1.0927f, 1.0693f, 0.6721f, 0.7683f, 0.7983f, 0.7954f, 0.9188f, 0.9385f, 0.4985f, + 0.4977f, 0.4603f, 0.4455f, 0.4127f, 0.4110f, 0.4941f, 0.4759f, 0.5349f, 0.3683f, -0.2632f, -0.1787f, -0.2694f, 0.1011f, 0.5906f, 0.2528f, 0.2884f, + 0.4634f, 0.4195f, 0.4343f, 0.4690f, 0.2649f, 0.5263f, 0.3176f, 0.0849f, 0.2367f, 0.3145f, 0.1513f, 0.0400f, -0.0157f, -0.0790f, 0.2078f, 0.3531f, + 0.4901f, 0.4280f, 0.0448f, 0.1648f, 0.4062f, 0.4517f, 0.4672f, 0.2977f, 0.1751f, 0.4745f, 0.2782f, 0.1945f, 0.4484f, 0.6724f, 0.4767f, -0.3629f, + 0.4990f, 0.4870f, 0.4556f, 0.3975f, 0.5759f, 0.1679f, 0.0186f, -0.0121f, -0.0310f, 0.1391f, 0.4368f, 0.4048f, 0.2680f, 0.2939f, 0.6137f, 0.1220f, + 0.4576f, 0.3876f, 0.1800f, 0.0838f, 0.2449f, 0.2391f, 0.1902f, 0.3734f, 0.6560f, 0.6120f, 0.2977f, 0.2925f, 0.3012f, 0.2707f, 0.1258f, 0.9602f, + 0.2486f, 0.0856f, 0.0151f, 0.0339f, 0.0400f, 0.0309f, 0.0806f, 0.0645f, 0.1008f, 0.0578f, 0.0978f, 0.0977f, 0.1286f, 0.1623f, 0.0981f, 0.1181f +}; + +const float tbl_mid_unv_wb_4b[] = +{ + 0.6335f, 0.3837f, 0.0061f, 0.3077f, 0.6323f, 0.7715f, 0.4749f, 0.4108f, 0.4372f, 0.4293f, 0.4158f, 0.3722f, 0.3496f, 0.1979f, 0.2359f, -0.1160f, + 0.8317f, 0.8118f, 0.2606f, 0.1187f, 0.0552f, 0.1774f, 0.3932f, 0.2072f, 0.3864f, 0.5424f, 0.7232f, 0.7687f, 0.4769f, 0.3494f, 0.4378f, 0.5646f, + 0.3911f, 0.3263f, 0.7933f, 0.5272f, 0.1287f, 0.0682f, 0.5376f, 0.7098f, 0.6191f, 0.8087f, 0.5485f, 0.3026f, 0.2164f, 0.1960f, 0.2562f, 1.0169f, + 0.2349f, 0.3254f, 0.5092f, 0.6735f, 0.7200f, 0.8835f, 0.8933f, 0.9395f, 0.8850f, 0.7653f, 0.7524f, 0.7371f, 0.6408f, 0.5230f, 0.5062f, 0.3452f, + 0.3460f, 0.0962f, 0.0094f, 0.2461f, 0.2226f, 0.3936f, 0.4201f, 0.5459f, 0.7673f, 0.8199f, 0.8280f, 0.8231f, 0.8197f, 0.8607f, 0.8010f, 0.3089f, + 0.7795f, 0.6877f, 0.7032f, 0.6328f, 0.4300f, 0.5229f, 0.2279f, 0.1276f, 0.0707f, 0.1435f, 0.2128f, 0.3172f, 0.6441f, 0.6792f, 0.6553f, 0.9661f, + 0.2191f, 0.1685f, 0.6328f, 1.1384f, 0.9794f, 0.3831f, 0.1536f, 0.2111f, 0.4062f, 0.4802f, 0.6310f, 0.6891f, 0.6434f, 0.7195f, 0.6825f, 0.6281f, + 0.7000f, 0.7134f, 1.0741f, 1.0685f, 0.6870f, 0.6970f, 0.6415f, 0.5947f, 0.6529f, 0.4188f, 0.3670f, 0.3035f, 0.1731f, 0.1189f, 0.1361f, 0.2484f, + 0.5120f, 1.0280f, 0.2212f, 0.7419f, 0.3666f, 0.4217f, 0.8202f, 0.9157f, 0.2588f, 0.2309f, 0.3245f, 0.2828f, 0.2803f, 0.7001f, 0.7999f, 0.5475f, + 0.9854f, 1.3984f, 0.7880f, 0.6188f, 0.6003f, 0.6025f, 0.5882f, 0.6020f, 0.7360f, 0.7624f, 0.7677f, 0.8184f, 0.8239f, 0.6515f, 0.5525f, 0.4851f, + 0.4527f, 0.6817f, 0.5962f, -0.1834f, 0.5938f, 0.2848f, 0.0740f, 0.7295f, 0.7859f, 0.2945f, 0.2364f, 0.4472f, 0.6828f, 0.8532f, 0.7874f, 0.4340f, + 0.4691f, -0.8407f, 0.4513f, 0.4736f, 0.5430f, 0.5205f, 0.7277f, 0.5125f, 0.4374f, 0.4812f, 0.4402f, 0.4600f, 0.5441f, 0.5339f, 0.5000f, 0.5523f, + 0.3114f, 0.8277f, 0.8566f, 0.3543f, 1.1264f, 1.0654f, 0.8704f, 0.2286f, 0.2817f, 0.5363f, 0.4860f, 0.4854f, 0.4885f, 0.4981f, 0.5884f, 0.6849f, + 0.0269f, -0.0212f, -0.0053f, -0.0662f, 0.0548f, 0.1794f, 0.2147f, 0.2311f, 0.1580f, 0.1215f, 0.0883f, 0.0883f, 0.0939f, 0.1213f, 0.1671f, 0.5387f, + 0.2015f, 0.2757f, 0.3759f, 0.3556f, 0.1435f, -0.0599f, -0.1540f, -0.1010f, -0.0265f, 0.1109f, 0.1375f, 0.2138f, 0.2321f, 0.2154f, 0.3242f, 0.0302f, + 0.6567f, 0.8920f, 0.9432f, 0.9931f, 1.0095f, 1.0340f, 1.0733f, 1.0465f, 1.0174f, 1.0278f, 0.9835f, 0.9231f, 0.8690f, 0.9104f, 0.8308f, 0.9015f +}; + +const float tbl_mid_unv_wb_5b[] = +{ + 0.7613f, 0.7719f, 0.1405f, 0.0932f, 0.5149f, 0.7991f, 1.0299f, 1.0621f, 0.9101f, 0.8061f, 0.5653f, 0.3541f, 0.3723f, 0.2189f, 0.2387f, 0.2759f, + 0.6765f, 0.5271f, 0.6522f, 0.6740f, 0.7323f, 0.6686f, 0.6427f, 0.6389f, 0.5635f, 0.4064f, 0.4204f, 0.2217f, -0.0540f, 0.0055f, -0.0003f, 1.0891f, + 0.7776f, 1.0019f, 0.8036f, 0.6873f, 0.6593f, 0.6663f, 0.6333f, 0.6830f, 0.8102f, 0.8412f, 0.8499f, 0.8505f, 0.8562f, 0.7727f, 0.6647f, 0.3785f, + 0.3357f, 0.3489f, 0.6355f, 0.5608f, 0.4041f, 0.4265f, 0.3007f, 0.4162f, 0.4157f, 0.7509f, 0.9377f, 1.0489f, 0.5420f, 0.4535f, 0.3596f, -0.5336f, + 0.1412f, 0.0807f, 0.4569f, 0.7835f, 0.9173f, 1.0155f, 0.9137f, 0.8909f, 0.9678f, 0.9173f, 0.8315f, 0.6923f, 0.6220f, 0.6253f, 0.6100f, 0.4810f, + 0.6266f, 0.4207f, 0.3287f, 0.1977f, 0.2270f, 0.3251f, 0.5619f, 0.7677f, 0.9096f, 0.8856f, 0.9169f, 0.9138f, 1.0827f, 1.0625f, 1.0292f, 0.8096f, + 0.3048f, 0.8186f, 0.8589f, 0.4195f, 1.3250f, 1.0856f, 0.7364f, 0.3688f, 0.3584f, 0.5818f, 0.5060f, 0.5001f, 0.6320f, 0.5961f, 0.7227f, 0.9292f, + -0.0186f, -0.0066f, 0.4828f, 0.1428f, 0.6790f, 0.5731f, 0.1672f, 1.0123f, 0.3792f, 0.2371f, 0.6724f, 0.5954f, 0.4266f, 0.1336f, 0.1317f, 0.6593f, + 0.0588f, 0.0455f, 0.0269f, -0.0433f, -0.0288f, -0.0401f, -0.0520f, -0.0180f, 0.0298f, 0.0687f, 0.0692f, 0.1117f, 0.1235f, 0.0825f, 0.0981f, 0.3321f, + 0.0534f, 0.0996f, 0.3916f, 0.4144f, 0.3053f, 0.4633f, 0.5347f, 0.3117f, 0.0487f, 0.0038f, -0.0633f, -0.0580f, -0.0198f, 0.2142f, 0.3482f, 0.1270f, + 0.2523f, 0.2594f, 0.1522f, 0.2921f, 0.3506f, 0.2707f, 0.4275f, 0.4855f, 0.5752f, 0.5218f, 0.3174f, 0.2905f, 0.2825f, 0.3531f, 0.4339f, 1.7003f, + 0.4843f, -0.0775f, -0.2139f, 0.3039f, 0.0370f, 0.1183f, 0.1276f, 0.3465f, 0.6921f, 0.5677f, 0.6350f, 0.6406f, 0.5105f, 0.5348f, 0.6704f, 0.0065f, + 0.3712f, 0.3044f, 1.1308f, 0.6067f, 0.0439f, -0.4632f, 0.7686f, 0.7904f, 0.5471f, 0.8138f, 0.6427f, 0.3550f, 0.2907f, 0.3527f, 0.4539f, 0.6299f, + 0.4107f, 0.5028f, 0.7238f, 0.3862f, -0.0910f, 1.1435f, 0.2016f, -0.0878f, 0.7719f, 0.6242f, 0.2342f, 0.1538f, 0.3210f, 0.4376f, 0.2715f, 0.3880f, + 0.2006f, 0.1022f, 0.9856f, 1.0177f, 0.5172f, 0.2847f, 0.2673f, -0.1435f, 0.2402f, 0.1511f, 0.2873f, 0.5806f, 0.6432f, 0.7030f, 0.6057f, 0.6605f, + 0.9265f, 0.7899f, 0.3217f, 0.2282f, 0.1476f, 0.1837f, 0.2586f, 0.1089f, 0.2017f, 0.4537f, 0.6116f, 0.4845f, 0.2765f, 0.2964f, 0.4001f, 0.6137f, + 0.8898f, 1.0569f, 1.3651f, 1.0880f, 0.7427f, 0.8146f, 0.7277f, 0.4933f, 0.4686f, 0.3226f, 0.2556f, 0.3925f, 0.3609f, 0.3534f, 0.4061f, 0.6180f, + 0.7097f, -0.6082f, 0.1367f, 0.2578f, 0.5352f, 0.6455f, 0.7388f, 0.5255f, 0.5767f, 0.6179f, 0.4126f, 0.5127f, 0.7127f, 0.8766f, 0.7792f, 0.5824f, + 0.4750f, 0.8985f, 0.5078f, 0.1736f, 0.6068f, 0.1146f, 0.0343f, 0.4376f, 0.5880f, 0.1435f, -0.0373f, 0.0317f, 0.4657f, 1.0099f, 0.8661f, 0.1866f, + 0.9984f, 2.3701f, 0.4294f, 0.4330f, 0.5639f, 0.5165f, 0.4100f, 0.4402f, 0.6263f, 0.5455f, 0.6353f, 0.6244f, 0.6031f, 0.5825f, 0.5097f, 0.6299f, + 0.5541f, 0.6583f, 0.3303f, 0.6556f, 0.1792f, 1.0361f, 1.2642f, 0.3391f, 0.1741f, 0.0453f, 0.9879f, 0.9531f, 0.6357f, 0.7319f, 0.7423f, 0.6173f, + 0.3987f, 0.4249f, -0.6046f, -0.6882f, 0.4910f, 0.6716f, 0.4378f, 0.3805f, 0.3341f, 0.4671f, 0.4465f, 0.4801f, 0.4397f, 0.6006f, 0.6054f, 0.4252f, + 0.4695f, 1.1709f, 0.4102f, 0.7910f, 0.1483f, 0.3870f, 0.6370f, 1.0548f, 0.0811f, 0.3290f, 0.4093f, 0.1806f, 0.2059f, 0.7384f, 0.8635f, 0.5733f, + 0.2723f, 0.5489f, 0.8253f, 0.8299f, 0.7252f, 0.6647f, 0.9867f, 0.9697f, 0.7177f, 0.4570f, 0.3074f, 0.7912f, 0.8034f, 0.7441f, 0.7787f, -0.0162f, + 0.4101f, 0.7419f, 0.1299f, 1.6854f, 0.9991f, 0.4401f, 0.5282f, 0.4610f, 0.7582f, 0.6075f, 0.6122f, 0.5946f, 0.7110f, 0.3059f, 0.2600f, 0.6038f, + 0.6606f, 0.5502f, 0.1162f, 0.5003f, 0.6136f, 0.4821f, 0.4274f, 0.2171f, 0.2387f, 0.2595f, 0.1985f, 0.4479f, 0.5427f, -0.1344f, 0.0898f, -0.3306f, + 0.5889f, 0.9132f, 1.0845f, -0.3197f, -0.3362f, 0.0343f, 0.5076f, 0.3968f, 0.5618f, 0.3596f, 0.4779f, 0.7531f, 0.7416f, 0.4266f, 0.3987f, 0.5340f, + 0.7489f, 0.3257f, 0.8281f, 1.2605f, 0.8413f, 0.6688f, 0.1844f, 0.3748f, 0.7825f, 1.1222f, 0.8489f, 0.1323f, 0.3507f, 0.8581f, 0.9935f, 0.6921f, + 0.8856f, 0.7036f, 0.6252f, 0.7064f, 0.3820f, 0.6683f, -0.3320f, 0.4602f, -0.1010f, 0.1065f, 0.1942f, 0.5670f, 0.8811f, 0.6730f, 0.7053f, 0.7718f, + 0.1447f, -1.5991f, 0.6787f, 0.7162f, 0.5069f, 0.3163f, 0.6009f, 0.4212f, 0.2517f, 0.5189f, 0.5235f, 0.4147f, 0.4682f, 0.2541f, 0.2860f, 0.3872f, + 0.5444f, 0.5385f, 0.4809f, 0.5395f, 1.1487f, -0.3404f, -0.3082f, -0.3512f, -0.2280f, 0.3479f, 0.5481f, 0.4996f, 0.3860f, 0.4747f, 0.4639f, 0.4263f, + 0.7822f, 1.0122f, 1.0295f, 1.0430f, 1.0629f, 1.1165f, 1.1447f, 1.1354f, 1.1063f, 1.0919f, 1.0188f, 0.9977f, 0.8758f, 0.8855f, 0.7471f, 0.9058f +}; + + + +/*------------------------------------------------------------------------------* + * AVQ - RE8 tables + *------------------------------------------------------------------------------*/ + +const int16_t select_table22[5][9] = +{ + {1, 1, 1, 1, 1, 1, 1, 1, 1}, + {0, 1, 2, 3, 4, 5, 6, 7, 8}, + {0, 0, 1, 3, 6, 10, 15, 21, 28}, + {0, 0, 0, 1, 4, 10, 20, 35, 56}, + {0, 0, 0, 0, 1, 5, 15, 35, 70} +}; + +/* value of leader element */ +const int16_t vals_a[36][4] = +{ + {1}, {0,2}, {0,2}, {1,3}, {0,4}, {2,0}, {1,3}, {0,2,4}, + {2}, {1,3}, {2,0,4}, {0,4}, {1,5}, {1,3}, {2,0,4}, {0,2,4}, + {1,3,5}, {0,2,6}, {0,4}, {0,2,6}, {0,2,4,6}, {1,7}, {0,8}, {0,6}, + {0,2,8}, {0,4,8}, {1,9}, {0,2,10}, {0,8}, {0,6,10}, {0,12}, {0,4,12}, + {0,10}, {0,2,14}, {0,8,12}, {0,16} +}; + +/* code parameter for every leader */ +const int16_t vals_q[36][4] = +{ + {7,1}, {2,2,2}, {4,2,4}, {7,2,1}, {1,2,1}, {6,2,2}, {7,2,2}, {3,3,3,1}, + {8,1}, {7,2,3}, {5,3,4,1}, {2,2,2}, {7,2,1}, {7,2,4}, {7,3,2,1}, {4,3,4,2}, + {7,3,2,1}, {2,3,2,1}, {3,2,3}, {4,3,4,1}, {3,4,3,2}, {7,2,1}, {1,2,1}, {2,2,2}, + {3,3,3,1}, {2,3,2,1}, {7,2,1}, {2,3,2,1}, {2,2,2}, {2,3,2,1}, {1,2,1}, {2,3,2,1}, + {2,2,2}, {2,3,2,1}, {2,3,2,1}, {1,2,1} +}; + +/* codebook start address for every leader */ +const uint16_t Is[36] = +{ + 0, 128, 256, 1376, 240, 0, 1792, 2400, 5376, 5632, 12800, 3744, + 21760, 22784, 31744, 38912, 45632, 3856, 52800, 53248, 57728, 60416, 4080, 61440, + 61552, 62896, 63120, 64144, 64368, 64480, 64704, 64720, 64944, 65056, 65280, 65504 +}; + +/* A3 - Number of the absolute leaders in codebook Q3 */ +const int16_t AA3[NB_LDQ3] = +{ + 0, 1, 4, 2, 3, 7, 11, 17, 22 +}; + +/* A4 - Number of the absolute leaders in codebook Q4 */ +const int16_t AA4[NB_LDQ4] = +{ + 5, 6, 8, 9, 10, 12, 13, 14, 15, + 16, 18, 19, 20, 21, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35 +}; + +/* I3 - Cardinality offsets for absolute leaders in Q3 */ +const uint16_t II3[NB_LDQ3] = +{ + 0, 128, 240, 256, 1376, 2400, 3744, 3856, 4080 +}; + +/* I4 - Cardinality offset for absolute leaders in Q4 */ +const uint16_t II4[NB_LDQ4] = +{ + 0, 1792, 5376, 5632, 12800, 21760, 22784, 31744, 38912, + 45632, 52800, 53248, 57728, 60416, 61440, 61552, 62896, 63120, + 64144, 64368, 64480, 64704, 64720, 64944, 65056, 65280, 65504 +}; + + /* Position of the first absolute leader on a spherical shell (or sphere) */ +const int16_t Da_pos[NB_SPHERE] = +{ + 0, 2, 5, 8, 13, 18, 20, 22, 23, 25, 26, 27, 27, 28, 28, 28, + 29, 30, 31, 31, 32, 32, 32, 32, 32, 34, 35, 35, 35, 35, 35, 35 +}; + +/* Number of absolute leaders on a spherical shell */ +const int16_t Da_nb[NB_SPHERE] = +{ + 2, 3, 3, 5, 5, 2, 2, 1, 2, 1, 1, 0, 1, 0, 0, 1, + 1, 1, 0, 1, 0, 0, 0, 0, 2, 1, 0, 0, 0, 0, 0, 1 +}; + +/* Identification code of an absolute leader */ +const int16_t Da_id[NB_LEADER] = +{ + 0x0001, 0x0004, 0x0008, 0x000B, 0x0020, 0x000C, 0x0015, 0x0024, + 0x0010, 0x001F, 0x0028, 0x0040, 0x004F, 0x0029, 0x002C, 0x0044, + 0x0059, 0x00A4, 0x0060, 0x00A8, 0x00C4, 0x012D, 0x0200, 0x0144, + 0x0204, 0x0220, 0x0335, 0x04E4, 0x0400, 0x0584, 0x0A20, 0x0A40, + 0x09C4, 0x12C4, 0x0C20, 0x2000 +}; + +/* Codebook number for each absolute leader */ +const int16_t Da_nq[NB_LEADER+2] = +{ + 2, 2, 3, 3, 2, 4, 4, 3, 4, 4, 4, 3, 4, 4, 4, 4, + 4, 3, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 0, 100 +}; + + +/*------------------------------------------------------------------------------* + * SWB TBE tables + *------------------------------------------------------------------------------*/ + +const int16_t skip_bands_SWB_TBE[NUM_SHB_SUBFR+1] = {0, 20, 40, 60, 80, 100, 120, 140, 160, 180, 200, 220, 240, 260, 280, 300, 320}; /* bands for SWB TBE quantisation */ +const int16_t skip_bands_WB_TBE[NUM_SHB_SUBFR/2+1] = {0, 10, 20, 30, 40, 50, 60, 70, 80}; /* bands for WB TBE quantisation */ + +const float interpol_frac_shb[NB_SUBFR*2] = { 0.7f, 0.3f, 0.4f, 0.6f, 0.1f, 0.9f, 0.0f, 1.0f }; + +/* All pass filter coeffs for interpolation and decimation by a factor of 2 */ +const float AP1_STEEP[ALLPASSSECTIONS_STEEP] = +{ 0.06056541924291f, 0.42943401549235f, 0.80873048306552f }; + +const float AP2_STEEP[ALLPASSSECTIONS_STEEP] = +{ 0.22063024829630f, 0.63593943961708f, 0.94151583095682f }; + +const float cos_fb_exc[32] = +{ + 9.536743164062500e-007f,9.353497034680913e-007f,8.810801546133007e-007f,7.929511980364623e-007f,6.743495646333031e-007f,5.298330165715015e-007f,3.649553264040151e-007f,1.860525884467279e-007f, + 0.000000000000000e+000f,-1.860526737118562e-007f,-3.649554116691434e-007f,-5.298331302583392e-007f,-6.743496214767220e-007f,-7.929512548798812e-007f,-8.810802114567196e-007f,-9.353497603115102e-007f, + -9.536743164062500e-007f,-9.353497034680913e-007f,-8.810801546133007e-007f,-7.929511411930434e-007f,-6.743495077898842e-007f,-5.298329597280826e-007f,-3.649552411388868e-007f,-1.860525173924543e-007f, + 0.000000000000000e+000f,1.860527589769845e-007f,3.649554969342717e-007f,5.298331871017581e-007f,6.743496783201408e-007f,7.929513117233000e-007f,8.810802683001384e-007f,9.353497603115102e-007f +}; + +const float recip_order[15] = +{ + 0.0000000f, 1.0000000f, 0.5000000f, 0.3333333f, 0.2500000f, + 0.2000000f, 0.1666667f, 0.1428571f, 0.1250000f, 0.1111111f, + 0.1000000f, 0.0909091f, 0.0833333f, 0.0769231f, 0.0714286f +}; + +const float STEPS[4] = { 0.00635f, 0.003175f, 0.0015875f, 0.00079375f}; + +const float Hilbert_coeffs[4*NUM_HILBERTS][HILBERT_ORDER1+1] = +{ + { 0.0f, 0.8740234375f, 0.0f, -1.87371826171875f, 0.0f, 1.0f}, /* num_Real[0] */ + {0.72613525390625f, 0.0f, -1.7236328125f, 0.0f, 1.0f, 0.0f}, /* num_Imag[0] */ + { 1.0f, 0.0f, -1.87371826171875f, 0.0f, 0.8740234375f, 0.0f}, /* den_Real[0] */ + { 1.0f, 0.0f, -1.7236328125f, 0.0f, 0.72613525390625f, 0.0f}, /* den_Imag[0] */ + {0.46820068359375f, 0.0f, -1.45599365234375f, 0.0f, 1.0f, 0.0f}, /* num_Real[1] */ + {0.15289306640625f, 0.0f, -1.10711669921875f, 0.0f, 1.0f, 0.0f}, /* num_Imag[1] */ + { 1.0f, 0.0f, -1.45599365234375f, 0.0f, 0.46820068359375f, 0.0f}, /* den_Real[1] */ + { 1.0f, 0.0f, -1.10711669921875f, 0.0f, 0.15289306640625f, 0.0f} /* den_Imag[1] */ +}; + +/* Overlap add window for SHB excitation used in analysis and synthesis */ +const float window_shb[L_SHB_LAHEAD]= /* sin, 1, sin */ +{ + 4.618346E-02f, 1.381564E-01f, 2.289505E-01f, 3.177914E-01f, 4.039210E-01f, 4.866045E-01f, 5.651364E-01f, 6.388468E-01f, 7.071068E-01f, 7.693340E-01f, + 8.249975E-01f, 8.736224E-01f, 9.147939E-01f, 9.481606E-01f, 9.734381E-01f, 9.904104E-01f, 9.989330E-01f, 1.000000e+000f, 1.000000e+000f, 1.000000e+000f +}; + +/* Upsampled overlap add window for SHB excitation used transition generation */ +const float window_shb_32k[2*L_SHB_LAHEAD]= +{ + 4.618346E-02f, 9.216993E-02f, 1.381564E-01f, 1.835534E-01f, 2.289505E-01f, 2.733710E-01f, 3.177914E-01f, 3.608562E-01f, 4.039210E-01f, 4.452628E-01f, + 4.866045E-01f, 5.258704E-01f, 5.651364E-01f, 6.019916E-01f, 6.388468E-01f, 6.729768E-01f, 7.071068E-01f, 7.382205E-01f, 7.693340E-01f, 7.971658E-01f, + 8.249975E-01f, 8.493099E-01f, 8.736224E-01f, 8.942082E-01f, 9.147939E-01f, 9.314773E-01f, 9.481606E-01f, 9.607993E-01f, 9.734381E-01f, 9.819242E-01f, + 9.904104E-01f, 9.946717E-01f, 9.989330E-01f, 9.994665E-01f, 1.000000e+000f, 1.000000e+000f, 1.000000e+000f, 1.000000e+000f, 1.000000e+000f, 1.000000e+000f +}; + +/* Short overlap add window for SHB excitation used in anal and synth */ +const float subwin_shb[SHB_OVERLAP_LEN+1]= +{ + 0.000000000f, 0.006155830f, 0.024471742f, 0.054496738f, 0.095491503f, + 0.146446609f, 0.206107374f, 0.273004750f, 0.345491503f, 0.421782767f, + 0.500000000f, 0.578217233f, 0.654508497f, 0.726995250f, 0.793892626f, + 0.853553391f, 0.904508497f, 0.945503262f, 0.975528258f, 0.993844170f, + 1.000000000f +}; + +const float window_wb[L_SHB_LAHEAD/4]=/* sin, 1 */ +{ 2.289505E-001f, 5.651364E-001f, 8.249975E-001f, 9.734381E-001f, 1.000000e+000f}; + +/* Short overlap add window for SHB excitation used in anal and synth */ +const float subwin_wb[SHB_OVERLAP_LEN/2+1]= +{0.00000000f, 0.15643448f, 0.30901700f, 0.45399052f, 0.58778524f, 0.70710677f, 0.80901700f, 0.89100653f, 0.95105654f, 0.98768836f, 1.0000000f}; + +/* Window for calculating SHB LPC coeffs */ +const float win_lpc_shb[(L_LOOK_12k8 + L_SUBFR + L_FRAME) * 5/8]= +{ + 0.0000337210f, 0.0001348794f, 0.0003034616f, 0.0005394449f, 0.0008427974f, 0.0012134782f, 0.0016514373f, 0.0021566156f, 0.0027289450f, 0.0033683483f, + 0.0040747393f, 0.0048480226f, 0.0056880940f, 0.0065948401f, 0.0075681387f, 0.0086078584f, 0.0097138590f, 0.0108859914f, 0.0121240975f, 0.0134280101f, + 0.0147975536f, 0.0162325430f, 0.0177327850f, 0.0192980770f, 0.0209282080f, 0.0226229582f, 0.0243820988f, 0.0262053927f, 0.0280925938f, 0.0300434477f, + 0.0320576912f, 0.0341350526f, 0.0362752518f, 0.0384779999f, 0.0407430000f, 0.0430699465f, 0.0454585255f, 0.0479084149f, 0.0504192842f, 0.0529907947f, + 0.0556225996f, 0.0583143439f, 0.0610656645f, 0.0638761903f, 0.0667455422f, 0.0696733332f, 0.0726591683f, 0.0757026449f, 0.0788033524f, 0.0819608725f, + 0.0851747795f, 0.0884446397f, 0.0917700121f, 0.0951504482f, 0.0985854920f, 0.1020746802f, 0.1056175421f, 0.1092136000f, 0.1128623686f, 0.1165633559f, + 0.1203160626f, 0.1241199826f, 0.1279746028f, 0.1318794033f, 0.1358338573f, 0.1398374315f, 0.1438895859f, 0.1479897739f, 0.1521374423f, 0.1563320319f, + 0.1605729768f, 0.1648597049f, 0.1691916381f, 0.1735681920f, 0.1779887763f, 0.1824527948f, 0.1869596453f, 0.1915087200f, 0.1960994051f, 0.2007310816f, + 0.2054031247f, 0.2101149041f, 0.2148657844f, 0.2196551248f, 0.2244822791f, 0.2293465964f, 0.2342474205f, 0.2391840904f, 0.2441559401f, 0.2491622991f, + 0.2542024921f, 0.2592758392f, 0.2643816562f, 0.2695192543f, 0.2746879405f, 0.2798870178f, 0.2851157847f, 0.2903735361f, 0.2956595627f, 0.3009731516f, + 0.3063135860f, 0.3116801456f, 0.3170721065f, 0.3224887415f, 0.3279293199f, 0.3333931079f, 0.3388793684f, 0.3443873616f, 0.3499163444f, 0.3554655711f, + 0.3610342931f, 0.3666217595f, 0.3722272163f, 0.3778499077f, 0.3834890752f, 0.3891439582f, 0.3948137938f, 0.4004978174f, 0.4061952622f, 0.4119053598f, + 0.4176273399f, 0.4233604308f, 0.4291038591f, 0.4348568502f, 0.4406186280f, 0.4463884155f, 0.4521654343f, 0.4579489052f, 0.4637380481f, 0.4695320822f, + 0.4753302259f, 0.4811316971f, 0.4869357134f, 0.4927414919f, 0.4985482494f, 0.5043552028f, 0.5101615687f, 0.5159665639f, 0.5217694055f, 0.5275693108f, + 0.5333654974f, 0.5391571836f, 0.5449435881f, 0.5507239304f, 0.5564974308f, 0.5622633107f, 0.5680207922f, 0.5737690989f, 0.5795074552f, 0.5852350873f, + 0.5909512225f, 0.5966550899f, 0.6023459200f, 0.6080229454f, 0.6136854001f, 0.6193325205f, 0.6249635449f, 0.6305777137f, 0.6361742697f, 0.6417524579f, + 0.6473115260f, 0.6528507242f, 0.6583693052f, 0.6638665247f, 0.6693416413f, 0.6747939164f, 0.6802226146f, 0.6856270037f, 0.6910063547f, 0.6963599419f, + 0.7016870434f, 0.7069869405f, 0.7122589184f, 0.7175022660f, 0.7227162760f, 0.7279002451f, 0.7330534742f, 0.7381752681f, 0.7432649359f, 0.7483217913f, + 0.7533451519f, 0.7583343404f, 0.7632886838f, 0.7682075137f, 0.7730901667f, 0.7779359842f, 0.7827443127f, 0.7875145034f, 0.7922459131f, 0.7969379034f, + 0.8015898416f, 0.8062011002f, 0.8107710572f, 0.8152990961f, 0.8197846062f, 0.8242269825f, 0.8286256258f, 0.8329799428f, 0.8372893461f, 0.8415532545f, + 0.8457710928f, 0.8499422922f, 0.8540662899f, 0.8581425298f, 0.8621704620f, 0.8661495432f, 0.8700792367f, 0.8739590124f, 0.8777883471f, 0.8815667242f, + 0.8852936341f, 0.8889685740f, 0.8925910483f, 0.8961605683f, 0.8996766527f, 0.9031388271f, 0.9065466245f, 0.9098995853f, 0.9131972572f, 0.9164391954f, + 0.9196249627f, 0.9227541293f, 0.9258262731f, 0.9288409798f, 0.9317978427f, 0.9346964630f, 0.9375364498f, 0.9403174198f, 0.9430389982f, 0.9457008176f, + 0.9483025192f, 0.9508437519f, 0.9533241731f, 0.9557434481f, 0.9581012506f, 0.9603972626f, 0.9626311744f, 0.9648026847f, 0.9669115005f, 0.9689573374f, + 0.9709399196f, 0.9728589795f, 0.9747142583f, 0.9765055057f, 0.9782324802f, 0.9798949488f, 0.9814926873f, 0.9830254801f, 0.9844931206f, 0.9858954107f, + 0.9872321612f, 0.9885031920f, 0.9897083316f, 0.9908474173f, 0.9919202956f, 0.9929268217f, 0.9938668599f, 0.9947402834f, 0.9955469743f, 0.9962868239f, + 0.9969597324f, 0.9975656090f, 0.9981043719f, 0.9985759486f, 0.9989802753f, 0.9993172977f, 0.9995869701f, 0.9997892562f, 0.9999241288f, 0.9999915697f +}; + +const float win_lpc_hb_wb[(L_LOOK_12k8 + L_SUBFR + L_FRAME) * 5/32]= +{ + 0.000171338f, 0.001541333f, 0.004277569f, 0.008372546f, 0.01381504f, 0.020590133f, 0.028679254f, 0.038060234f, + 0.048707358f, 0.060591444f, 0.073679918f, 0.087936906f, 0.10332333f, 0.119797017f, 0.137312814f, 0.155822712f, + 0.175275976f, 0.195619285f, 0.216796882f, 0.238750718f, 0.26142062f, 0.284744452f, 0.308658284f, 0.33309657f, + 0.357992328f, 0.383277318f, 0.408882237f, 0.434736904f, 0.460770452f, 0.486911526f, 0.513088474f, 0.539229548f, + 0.565263096f, 0.591117763f, 0.616722682f, 0.642007672f, 0.66690343f, 0.691341716f, 0.715255548f, 0.73857938f, + 0.761249282f, 0.783203118f, 0.804380715f, 0.824724024f, 0.844177288f, 0.862687186f, 0.880202983f, 0.89667667f, + 0.912063094f, 0.926320082f, 0.939408556f, 0.951292642f, 0.961939766f, 0.971320746f, 0.979409867f, 0.98618496f, + 0.991627454f, 0.995722431f, 0.998458667f, 0.999828662f +}; + +const float ola_win_shb_switch_fold[L_SUBFR16k] = +{ + 0.009817319f, 0.029448173f, 0.049067674f, 0.068668259f, 0.088242371f, 0.107782463f, 0.127281003f, 0.146730474f, + 0.166123378f, 0.185452238f, 0.204709603f, 0.223888048f, 0.242980180f, 0.261978638f, 0.280876099f, 0.299665277f, + 0.318338928f, 0.336889853f, 0.355310901f, 0.373594970f, 0.391735011f, 0.409724030f, 0.427555093f, 0.445221326f, + 0.462715917f, 0.480032122f, 0.497163266f, 0.514102744f, 0.530844026f, 0.547380657f, 0.563706262f, 0.579814548f, + 0.595699304f, 0.611354407f, 0.626773822f, 0.641951603f, 0.656881899f, 0.671558955f, 0.685977112f, 0.700130812f, + 0.714014598f, 0.727623118f, 0.740951125f, 0.753993482f, 0.766745160f, 0.779201243f, 0.791356929f, 0.803207531f, + 0.814748483f, 0.825975333f, 0.836883753f, 0.847469539f, 0.857728610f, 0.867657010f, 0.877250911f, 0.886506616f, + 0.895420555f, 0.903989293f, 0.912209526f, 0.920078084f, 0.927591935f, 0.934748182f, 0.941544065f, 0.947976965f, + 0.954044402f, 0.959744037f, 0.965073672f, 0.970031253f, 0.974614869f, 0.978822751f, 0.982653279f, 0.986104976f, + 0.989176510f, 0.991866698f, 0.994174502f, 0.996099033f, 0.997639549f, 0.998795456f, 0.999566309f, 0.999951809f +}; + +/* Window for calculating whitening filter for SHB excitation */ +const float win_flatten[ L_FRAME16k/2]= +{ + 9.57802E-05f, 0.000383084f, 0.000861802f, 0.00153175f, 0.002392671f, 0.003444236f, 0.004686042f, 0.006117614f, + 0.007738401f, 0.009547785f, 0.011545071f, 0.013729494f, 0.016100218f, 0.018656334f, 0.021396862f, 0.024320754f, + 0.027426888f, 0.030714075f, 0.034181054f, 0.037826499f, 0.041649013f, 0.04564713f, 0.049819319f, 0.054163981f, + 0.058679453f, 0.063364004f, 0.068215839f, 0.0732331f, 0.078413864f, 0.083756147f, 0.089257901f, 0.094917019f, + 0.100731333f, 0.106698615f, 0.112816579f, 0.119082881f, 0.12549512f, 0.13205084f, 0.138747529f, 0.145582621f, + 0.152553498f, 0.159657489f, 0.166891873f, 0.174253877f, 0.181740681f, 0.189349417f, 0.197077169f, 0.204920978f, + 0.212877838f, 0.2209447f, 0.229118474f, 0.237396028f, 0.245774191f, 0.254249754f, 0.262819469f, 0.271480052f, + 0.280228187f, 0.28906052f, 0.297973669f, 0.306964218f, 0.316028723f, 0.325163712f, 0.334365684f, 0.343631114f, + 0.352956452f, 0.362338126f, 0.37177254f, 0.381256082f, 0.390785116f, 0.400355993f, 0.409965046f, 0.419608593f, + 0.42928294f, 0.43898438f, 0.448709196f, 0.458453663f, 0.468214047f, 0.477986609f, 0.487767604f, 0.497553287f, + 0.507339906f, 0.517123714f, 0.526900961f, 0.536667901f, 0.546420794f, 0.556155902f, 0.565869495f, 0.575557852f, + 0.585217262f, 0.594844023f, 0.604434447f, 0.61398486f, 0.623491603f, 0.632951034f, 0.642359529f, 0.651713483f, + 0.661009312f, 0.670243455f, 0.679412375f, 0.688512557f, 0.697540517f, 0.706492795f, 0.715365961f, 0.724156616f, + 0.732861391f, 0.741476953f, 0.75f, 0.758427267f, 0.766755524f, 0.774981583f, 0.78310229f, 0.791114534f, + 0.799015247f, 0.8068014f, 0.814470012f, 0.822018143f, 0.829442903f, 0.836741446f, 0.843910977f, 0.850948748f, + 0.857852063f, 0.864618278f, 0.871244799f, 0.87772909f, 0.884068664f, 0.890261093f, 0.896304006f, 0.902195086f, + 0.907932076f, 0.91351278f, 0.918935058f, 0.924196833f, 0.92929609f, 0.934230874f, 0.938999296f, 0.943599527f, + 0.948029807f, 0.952288437f, 0.956373785f, 0.960284288f, 0.964018446f, 0.967574828f, 0.970952073f, 0.974148887f, + 0.977164044f, 0.97999639f, 0.982644839f, 0.985108376f, 0.987386059f, 0.989477014f, 0.99138044f, 0.993095607f, + 0.99462186f, 0.995958613f, 0.997105353f, 0.998061642f, 0.998827114f, 0.999401474f, 0.999784503f, 0.999976054f +}; + +const float win_flatten_4k[ L_FRAME16k/8]= +{ + 0.000385482f, 0.003465772f, 0.00960736f, 0.018772382f, 0.030904332f, 0.045928413f, 0.063751996f, 0.084265194f, + 0.107341535f, 0.132838745f, 0.160599627f, 0.190453025f, 0.222214883f, 0.255689379f, 0.290670131f, 0.326941471f, + 0.364279775f, 0.402454839f, 0.441231301f, 0.480370092f, 0.519629908f, 0.558768699f, 0.597545161f, 0.635720225f, + 0.673058529f, 0.709329869f, 0.744310621f, 0.777785117f, 0.809546975f, 0.839400373f, 0.867161255f, 0.892658465f, + 0.915734806f, 0.936248004f, 0.954071587f, 0.969095668f, 0.981227618f, 0.99039264f, 0.996534228f, 0.999614518f +}; + +const float wb_bwe_lsfvq_cbook_8bit[256*6] = +{ + 0.064311408f, 0.10468847f, 0.15634165f, 0.20375369f, 0.28696818f, 0.40275119f, + 0.123011120f, 0.15468679f, 0.22408577f, 0.27191057f, 0.32490698f, 0.37368365f, + 0.062166951f, 0.10810068f, 0.20470853f, 0.26741467f, 0.32058192f, 0.38620580f, + 0.174916950f, 0.19449120f, 0.24146226f, 0.29131976f, 0.38403433f, 0.43426356f, + 0.061881055f, 0.10185221f, 0.16703630f, 0.24048992f, 0.31339988f, 0.37993594f, + 0.177282270f, 0.19826299f, 0.25380750f, 0.29369257f, 0.35085620f, 0.42745721f, + 0.074096108f, 0.12090045f, 0.17319672f, 0.23572965f, 0.34671734f, 0.40846492f, + 0.193731520f, 0.25350369f, 0.27155532f, 0.30359655f, 0.33746877f, 0.40740063f, + 0.108401970f, 0.13491719f, 0.17991717f, 0.21799053f, 0.30440233f, 0.40384627f, + 0.174536930f, 0.19361701f, 0.22834544f, 0.25644155f, 0.32851965f, 0.41061748f, + 0.107099060f, 0.13363550f, 0.17994689f, 0.22695679f, 0.35903688f, 0.43662047f, + 0.137970100f, 0.24785769f, 0.26827308f, 0.30078557f, 0.34276146f, 0.42785187f, + 0.066387915f, 0.12114685f, 0.23766229f, 0.29916662f, 0.34589517f, 0.39398126f, + 0.137657570f, 0.24889487f, 0.27118048f, 0.31891228f, 0.38713554f, 0.45651107f, + 0.128872750f, 0.16127981f, 0.21523141f, 0.25706016f, 0.34536624f, 0.44451874f, + 0.218467830f, 0.25571942f, 0.27589334f, 0.30889302f, 0.36007931f, 0.43548091f, + 0.056956662f, 0.09351124f, 0.14796259f, 0.22055691f, 0.34257293f, 0.42610824f, + 0.180505310f, 0.20235648f, 0.26672026f, 0.30524807f, 0.34745481f, 0.38838059f, + 0.101998340f, 0.13874827f, 0.19761236f, 0.28698298f, 0.36602473f, 0.40947282f, + 0.187859700f, 0.20997279f, 0.27259784f, 0.31595901f, 0.37782186f, 0.41948720f, + 0.080803553f, 0.15174572f, 0.23117477f, 0.28917899f, 0.36979528f, 0.42341956f, + 0.177685260f, 0.19914809f, 0.26693575f, 0.33390045f, 0.38670310f, 0.42635921f, + 0.123052730f, 0.15593820f, 0.23170087f, 0.28281293f, 0.34711335f, 0.43915513f, + 0.209470720f, 0.25584593f, 0.27727828f, 0.32496712f, 0.39502842f, 0.45856840f, + 0.111734840f, 0.14147902f, 0.20349777f, 0.25418848f, 0.31658104f, 0.37184560f, + 0.177056760f, 0.19666426f, 0.25464026f, 0.29941442f, 0.37334871f, 0.45296459f, + 0.109640340f, 0.13537075f, 0.20335155f, 0.26529530f, 0.35213594f, 0.43554990f, + 0.155959700f, 0.25239450f, 0.27483222f, 0.32663911f, 0.37442742f, 0.42423408f, + 0.060802584f, 0.098534495f, 0.17139797f, 0.27724784f, 0.34847788f, 0.40446891f, + 0.131805190f, 0.17878972f, 0.29302125f, 0.34778777f, 0.39172069f, 0.43333138f, + 0.117051780f, 0.14714169f, 0.25283080f, 0.31096928f, 0.35792401f, 0.40593001f, + 0.244642480f, 0.26542671f, 0.31064604f, 0.34894237f, 0.39502788f, 0.45113983f, + 0.057704683f, 0.10158624f, 0.18821861f, 0.25351465f, 0.33014694f, 0.43374062f, + 0.177105410f, 0.19658676f, 0.24332913f, 0.27865263f, 0.33845007f, 0.38627285f, + 0.085525863f, 0.16781621f, 0.24699003f, 0.29584215f, 0.34250327f, 0.39210727f, + 0.189876270f, 0.21305679f, 0.26289427f, 0.30053004f, 0.36670247f, 0.40832210f, + 0.077609843f, 0.14485938f, 0.23309675f, 0.28603452f, 0.33963436f, 0.41664103f, + 0.180406410f, 0.20188257f, 0.27483060f, 0.32204807f, 0.36496152f, 0.40626347f, + 0.109972660f, 0.13794764f, 0.23344532f, 0.30007610f, 0.37112553f, 0.45007031f, + 0.243211860f, 0.26638262f, 0.29846135f, 0.32926348f, 0.38096489f, 0.42680115f, + 0.115753390f, 0.14391596f, 0.21486068f, 0.26084368f, 0.32379458f, 0.41507919f, + 0.172120490f, 0.19028171f, 0.22318579f, 0.25543954f, 0.36796374f, 0.43638971f, + 0.114912990f, 0.14340870f, 0.20702577f, 0.29029375f, 0.38645739f, 0.43383786f, + 0.141428780f, 0.25522990f, 0.28059674f, 0.31690999f, 0.35024347f, 0.40617629f, + 0.075129960f, 0.14698488f, 0.26110380f, 0.31719769f, 0.36377356f, 0.41101429f, + 0.112868350f, 0.24334299f, 0.28096316f, 0.33454465f, 0.41219625f, 0.46410751f, + 0.114073120f, 0.14243275f, 0.23024102f, 0.32882107f, 0.39744618f, 0.44429863f, + 0.221774120f, 0.26274601f, 0.29020551f, 0.34374641f, 0.39126416f, 0.44235948f, + 0.080079738f, 0.13106315f, 0.18837026f, 0.27151645f, 0.37668958f, 0.43255839f, + 0.192999400f, 0.21775426f, 0.26678052f, 0.30557605f, 0.38446194f, 0.43054658f, + 0.135743140f, 0.17819346f, 0.26983813f, 0.31540557f, 0.35817370f, 0.39888741f, + 0.187602960f, 0.21325656f, 0.29023036f, 0.33244221f, 0.37354374f, 0.41305910f, + 0.092309319f, 0.15685370f, 0.21826152f, 0.28145456f, 0.34801734f, 0.40449806f, + 0.182635620f, 0.20695883f, 0.29330586f, 0.34611408f, 0.38827609f, 0.42744945f, + 0.142778630f, 0.18181581f, 0.24718913f, 0.30036890f, 0.36118151f, 0.41174750f, + 0.236204610f, 0.26138275f, 0.28782872f, 0.31976781f, 0.38485547f, 0.44582109f, + 0.116877780f, 0.14600852f, 0.23439658f, 0.29078582f, 0.33978214f, 0.38680132f, + 0.175246750f, 0.19919182f, 0.25508981f, 0.32738942f, 0.40268065f, 0.44634249f, + 0.137050570f, 0.17196927f, 0.22227536f, 0.26698633f, 0.35381724f, 0.42069877f, + 0.206672940f, 0.25909379f, 0.28239012f, 0.33396266f, 0.38073064f, 0.42642507f, + 0.061761568f, 0.10948738f, 0.22960285f, 0.31900229f, 0.37225715f, 0.42291697f, + 0.176470360f, 0.27105045f, 0.30450833f, 0.35896554f, 0.40397125f, 0.45254757f, + 0.121439660f, 0.15285670f, 0.25458177f, 0.31503554f, 0.37326878f, 0.43680361f, + 0.248663160f, 0.27168576f, 0.31107735f, 0.34636713f, 0.40424762f, 0.44219064f, + 0.070101929f, 0.11626106f, 0.17205417f, 0.22172190f, 0.27958755f, 0.35136489f, + 0.177289590f, 0.19891422f, 0.23900178f, 0.26750187f, 0.31516079f, 0.36488918f, + 0.077375897f, 0.14011343f, 0.22628590f, 0.27710762f, 0.32419150f, 0.37404180f, + 0.181505360f, 0.20134192f, 0.25984204f, 0.30768103f, 0.38822145f, 0.43297287f, + 0.074548254f, 0.13055888f, 0.20082796f, 0.24940258f, 0.30161427f, 0.36031073f, + 0.180461770f, 0.19943970f, 0.27094461f, 0.31420032f, 0.37052353f, 0.43473550f, + 0.074096252f, 0.11976634f, 0.19559390f, 0.30014559f, 0.36503791f, 0.41589500f, + 0.226750330f, 0.26034000f, 0.28387883f, 0.31307141f, 0.34924905f, 0.39466978f, + 0.112939270f, 0.14324718f, 0.19444530f, 0.23409602f, 0.28823566f, 0.35312882f, + 0.177658770f, 0.19744005f, 0.23826049f, 0.27114023f, 0.35113598f, 0.44339139f, + 0.114194520f, 0.13976692f, 0.19017221f, 0.23985925f, 0.34337933f, 0.40059157f, + 0.174247680f, 0.25422512f, 0.27291618f, 0.31259836f, 0.35694641f, 0.44284664f, + 0.079551504f, 0.12808054f, 0.20489528f, 0.31763242f, 0.38800666f, 0.43699908f, + 0.125618080f, 0.25750129f, 0.29652463f, 0.33625458f, 0.37097478f, 0.41695760f, + 0.128908580f, 0.16228143f, 0.22845947f, 0.30852429f, 0.38999548f, 0.43734932f, + 0.169819550f, 0.25672921f, 0.27816521f, 0.33356870f, 0.38415880f, 0.45040976f, + 0.057932155f, 0.096138661f, 0.17637437f, 0.28982999f, 0.37938107f, 0.44064176f, + 0.191452430f, 0.21929421f, 0.28254485f, 0.31749442f, 0.35804814f, 0.39526710f, + 0.112918430f, 0.14011863f, 0.23116641f, 0.29091351f, 0.34974963f, 0.42044500f, + 0.190242080f, 0.21680224f, 0.27563442f, 0.33525335f, 0.39940885f, 0.43998378f, + 0.071851696f, 0.13973452f, 0.23632015f, 0.30396344f, 0.38541794f, 0.45171152f, + 0.184630070f, 0.20535151f, 0.28517376f, 0.32789614f, 0.37951171f, 0.43497879f, + 0.132603770f, 0.16874406f, 0.24771421f, 0.29658241f, 0.37943509f, 0.43056925f, + 0.244405020f, 0.26554052f, 0.30099568f, 0.33429706f, 0.39811794f, 0.44169908f, + 0.127688830f, 0.15825875f, 0.20983321f, 0.25719782f, 0.34290920f, 0.39590250f, + 0.186549100f, 0.20879511f, 0.25591707f, 0.29476812f, 0.39344232f, 0.44883705f, + 0.121737520f, 0.15062455f, 0.21825312f, 0.27097532f, 0.35836887f, 0.41602781f, + 0.157742360f, 0.25669794f, 0.28102574f, 0.34671864f, 0.41050850f, 0.46008611f, + 0.073161878f, 0.13388489f, 0.21462934f, 0.27572797f, 0.36075527f, 0.41919188f, + 0.110086280f, 0.24803245f, 0.31035821f, 0.35293169f, 0.39119687f, 0.43174112f, + 0.135783090f, 0.17715049f, 0.27354016f, 0.32581513f, 0.38440836f, 0.44428392f, + 0.241434570f, 0.26676851f, 0.30639927f, 0.35469044f, 0.41439486f, 0.46056301f, + 0.072374815f, 0.13092581f, 0.21330540f, 0.26565725f, 0.32462099f, 0.41762579f, + 0.187292630f, 0.21108778f, 0.25580340f, 0.28624311f, 0.33138816f, 0.37684385f, + 0.098711036f, 0.18228306f, 0.24984319f, 0.31049971f, 0.37903925f, 0.43890093f, + 0.185453530f, 0.20642460f, 0.26094355f, 0.29915816f, 0.37078354f, 0.42966194f, + 0.090091891f, 0.15555244f, 0.20914149f, 0.27320212f, 0.36822053f, 0.42967380f, + 0.201609780f, 0.23445421f, 0.29016518f, 0.32638897f, 0.37174990f, 0.41508051f, + 0.113139770f, 0.14155327f, 0.22791682f, 0.31995140f, 0.37521299f, 0.41972433f, + 0.242912130f, 0.26597026f, 0.30674398f, 0.34632679f, 0.38930327f, 0.42944494f, + 0.126299270f, 0.15994217f, 0.23121635f, 0.27579474f, 0.33301124f, 0.41152335f, + 0.178158900f, 0.19664722f, 0.23704785f, 0.27359930f, 0.39265986f, 0.45771152f, + 0.129551450f, 0.16291546f, 0.22120094f, 0.28045517f, 0.37621782f, 0.42867219f, + 0.187946560f, 0.27082805f, 0.30209272f, 0.33978012f, 0.37078287f, 0.41235280f, + 0.068654959f, 0.13086497f, 0.26542795f, 0.33399948f, 0.38525278f, 0.43688097f, + 0.096004458f, 0.20898133f, 0.30225243f, 0.35934752f, 0.41301071f, 0.45632845f, + 0.123398330f, 0.15749653f, 0.25528304f, 0.31414621f, 0.39506227f, 0.45492910f, + 0.225770510f, 0.26622774f, 0.29947052f, 0.36073788f, 0.40423935f, 0.44409324f, + 0.064717384f, 0.11872284f, 0.20919028f, 0.28301016f, 0.36802144f, 0.44747754f, + 0.193151690f, 0.21918993f, 0.26823232f, 0.30766049f, 0.39674668f, 0.45522504f, + 0.136849720f, 0.17581869f, 0.26349318f, 0.31417345f, 0.36960066f, 0.42791831f, + 0.193061690f, 0.21996506f, 0.29517646f, 0.33806725f, 0.39153706f, 0.44340380f, + 0.098565179f, 0.16979528f, 0.23333485f, 0.30380484f, 0.36654435f, 0.41758552f, + 0.142901030f, 0.21043695f, 0.30522982f, 0.36025073f, 0.40676141f, 0.45003224f, + 0.145613190f, 0.18443712f, 0.24662242f, 0.31447027f, 0.38225381f, 0.42837277f, + 0.251176660f, 0.28085865f, 0.31587424f, 0.34871696f, 0.39445892f, 0.44662421f, + 0.133816690f, 0.17622163f, 0.24380327f, 0.28396237f, 0.32809307f, 0.37532433f, + 0.177315700f, 0.20318793f, 0.27655558f, 0.35488501f, 0.40768754f, 0.44723190f, + 0.130848580f, 0.16442355f, 0.23815274f, 0.28617893f, 0.35951574f, 0.41662766f, + 0.134220490f, 0.26123559f, 0.29436035f, 0.34059452f, 0.38761183f, 0.45385345f, + 0.059422872f, 0.10497064f, 0.21978301f, 0.33427086f, 0.40351136f, 0.45184884f, + 0.142994260f, 0.27380337f, 0.32392882f, 0.36784687f, 0.40465562f, 0.44600403f, + 0.116004830f, 0.14796778f, 0.27228987f, 0.34179617f, 0.39311954f, 0.44016822f, + 0.245996100f, 0.26896363f, 0.31898875f, 0.36352887f, 0.40696431f, 0.44890165f, + 0.072173498f, 0.11864839f, 0.17283789f, 0.22419420f, 0.31759785f, 0.43734225f, + 0.139241880f, 0.17819210f, 0.22803594f, 0.26501417f, 0.32263158f, 0.39061689f, + 0.079146669f, 0.12807914f, 0.20505754f, 0.28451768f, 0.34267396f, 0.39425014f, + 0.185581160f, 0.20673854f, 0.24816327f, 0.28211183f, 0.37238530f, 0.42474096f, + 0.073407181f, 0.12148770f, 0.18750487f, 0.26671948f, 0.34627834f, 0.42100649f, + 0.176786130f, 0.19666658f, 0.25287274f, 0.30668454f, 0.37086389f, 0.41259755f, + 0.085308694f, 0.14425344f, 0.19922831f, 0.25959335f, 0.34555917f, 0.41120310f, + 0.188639580f, 0.26239423f, 0.28521213f, 0.32391588f, 0.35782756f, 0.41337293f, + 0.122131020f, 0.15263056f, 0.20129258f, 0.23778684f, 0.30478596f, 0.39871654f, + 0.175429700f, 0.19423608f, 0.23678906f, 0.27549846f, 0.36067030f, 0.41160394f, + 0.119189400f, 0.14839651f, 0.19721773f, 0.23690964f, 0.32670187f, 0.43820403f, + 0.131684130f, 0.25721459f, 0.28448545f, 0.32294678f, 0.36442816f, 0.44250607f, + 0.085802449f, 0.14103937f, 0.22418659f, 0.30627724f, 0.35842445f, 0.40982625f, + 0.128820440f, 0.25444798f, 0.28309633f, 0.34424530f, 0.39272354f, 0.43691562f, + 0.132605980f, 0.16563241f, 0.21732948f, 0.26659585f, 0.39024087f, 0.45279860f, + 0.234312330f, 0.26289148f, 0.28858043f, 0.31923045f, 0.36693357f, 0.42273091f, + 0.066913619f, 0.11174564f, 0.17118640f, 0.24009352f, 0.37462610f, 0.44981068f, + 0.185639320f, 0.20948515f, 0.27095540f, 0.30761470f, 0.35471667f, 0.41869175f, + 0.125534910f, 0.15639919f, 0.22045213f, 0.29690027f, 0.36034274f, 0.40578263f, + 0.194798190f, 0.22069282f, 0.28234110f, 0.32713553f, 0.38517899f, 0.42816026f, + 0.085073073f, 0.15836545f, 0.24638386f, 0.30374430f, 0.35995427f, 0.43827551f, + 0.185516870f, 0.21322354f, 0.26435247f, 0.32313780f, 0.37976277f, 0.43915130f, + 0.136729910f, 0.17363096f, 0.23523415f, 0.27817766f, 0.36010086f, 0.44481285f, + 0.239499040f, 0.26742173f, 0.29913088f, 0.33337737f, 0.38191519f, 0.45262276f, + 0.109306830f, 0.13962816f, 0.20534886f, 0.27722030f, 0.33992319f, 0.39062291f, + 0.179595260f, 0.19941354f, 0.27015954f, 0.31834604f, 0.38647809f, 0.45654088f, + 0.118738240f, 0.14800700f, 0.21956599f, 0.27258212f, 0.36918433f, 0.44755545f, + 0.176908270f, 0.26077464f, 0.28640628f, 0.35265194f, 0.39663136f, 0.43922160f, + 0.059878687f, 0.10816162f, 0.21481956f, 0.28530654f, 0.34399690f, 0.42289176f, + 0.125298830f, 0.16761966f, 0.29455499f, 0.36736398f, 0.41514581f, 0.45568637f, + 0.132064950f, 0.16520436f, 0.24257245f, 0.31378956f, 0.37122182f, 0.41558003f, + 0.248260440f, 0.27214823f, 0.30690390f, 0.33828614f, 0.40254065f, 0.45821278f, + 0.082464811f, 0.14120604f, 0.19676137f, 0.24440753f, 0.31120215f, 0.41734941f, + 0.183048080f, 0.20313040f, 0.25374041f, 0.28978449f, 0.35392058f, 0.40046587f, + 0.096008750f, 0.19205652f, 0.26031936f, 0.30998267f, 0.36005002f, 0.41374267f, + 0.194524100f, 0.22245612f, 0.26543764f, 0.29833795f, 0.36269526f, 0.43446257f, + 0.096760412f, 0.17681885f, 0.23611019f, 0.28616845f, 0.34521951f, 0.42352547f, + 0.191620720f, 0.21818699f, 0.28052740f, 0.31781127f, 0.36781149f, 0.43254535f, + 0.125638810f, 0.15853683f, 0.23819940f, 0.29029299f, 0.37995224f, 0.45315055f, + 0.243017800f, 0.27328285f, 0.30734326f, 0.33963007f, 0.37608978f, 0.41520298f, + 0.133222750f, 0.16798774f, 0.21402212f, 0.24935760f, 0.32005623f, 0.41682314f, + 0.186885370f, 0.21039202f, 0.25286530f, 0.28529456f, 0.36191248f, 0.44972585f, + 0.114535160f, 0.14259486f, 0.19594154f, 0.24858528f, 0.38835896f, 0.45716846f, + 0.166527800f, 0.26567252f, 0.29289306f, 0.33677574f, 0.37519203f, 0.43541243f, + 0.084944791f, 0.15003156f, 0.24253235f, 0.32251109f, 0.37827375f, 0.43099351f, + 0.119303270f, 0.24856258f, 0.29065368f, 0.36470470f, 0.42883150f, 0.46638276f, + 0.120605420f, 0.15682171f, 0.24962093f, 0.34730291f, 0.41806540f, 0.46035776f, + 0.219732780f, 0.27560250f, 0.30592696f, 0.35044880f, 0.39439534f, 0.45312034f, + 0.077308553f, 0.13464280f, 0.19751880f, 0.25325059f, 0.34806166f, 0.44638905f, + 0.200278980f, 0.22979005f, 0.27661907f, 0.31333340f, 0.38330744f, 0.44013638f, + 0.147984570f, 0.20195322f, 0.26483855f, 0.31025032f, 0.36569269f, 0.42239969f, + 0.195086490f, 0.23098500f, 0.30395854f, 0.34483682f, 0.38586214f, 0.42438066f, + 0.096725831f, 0.15616494f, 0.21843296f, 0.29493721f, 0.35664482f, 0.43073450f, + 0.186832170f, 0.21579466f, 0.30557582f, 0.35804882f, 0.40192237f, 0.44148013f, + 0.131465720f, 0.16604695f, 0.23214633f, 0.30213654f, 0.36326612f, 0.43615662f, + 0.248074080f, 0.27538389f, 0.30784390f, 0.33816285f, 0.38664576f, 0.43811284f, + 0.129804270f, 0.16455588f, 0.24948399f, 0.29846586f, 0.34646629f, 0.39636043f, + 0.166400470f, 0.20256213f, 0.26232918f, 0.34952652f, 0.42374855f, 0.46579300f, + 0.142332960f, 0.18013006f, 0.23247726f, 0.28747540f, 0.37225279f, 0.42277361f, + 0.218164380f, 0.27036123f, 0.29741317f, 0.33658242f, 0.37288172f, 0.43297122f, + 0.070747526f, 0.12972708f, 0.23503772f, 0.30178403f, 0.35944976f, 0.43280902f, + 0.203817720f, 0.28320849f, 0.32265104f, 0.36469291f, 0.39977801f, 0.44224295f, + 0.122382190f, 0.15795076f, 0.27432170f, 0.33024348f, 0.37383108f, 0.41668653f, + 0.246445660f, 0.27118517f, 0.31770823f, 0.35773353f, 0.39648445f, 0.43540417f, + 0.070426224f, 0.12260340f, 0.18382397f, 0.23249431f, 0.29712141f, 0.39919694f, + 0.183126440f, 0.20602093f, 0.24375562f, 0.27361644f, 0.33459363f, 0.41471750f, + 0.088748459f, 0.16327910f, 0.22175401f, 0.26667908f, 0.31866453f, 0.39616098f, + 0.187460500f, 0.20871643f, 0.27548782f, 0.31634516f, 0.39309748f, 0.43994220f, + 0.081379567f, 0.12891936f, 0.18833934f, 0.25567206f, 0.32705903f, 0.38458961f, + 0.191505080f, 0.21728053f, 0.28226653f, 0.32386961f, 0.38391795f, 0.45235836f, + 0.082156793f, 0.13994262f, 0.21264164f, 0.30082758f, 0.36988471f, 0.43363836f, + 0.237145870f, 0.26759673f, 0.29733906f, 0.32792373f, 0.36448143f, 0.40360639f, + 0.128199820f, 0.16341814f, 0.21755898f, 0.25443908f, 0.30439771f, 0.35908714f, + 0.189707910f, 0.21668527f, 0.25769184f, 0.28813697f, 0.34477993f, 0.41777603f, + 0.125467980f, 0.15380570f, 0.20025914f, 0.24632028f, 0.36725388f, 0.42488725f, + 0.203165520f, 0.26241863f, 0.28495340f, 0.32547246f, 0.36743034f, 0.44873687f, + 0.093381965f, 0.15915305f, 0.22155271f, 0.30877697f, 0.38380526f, 0.43903641f, + 0.155729460f, 0.27199100f, 0.30995504f, 0.35152115f, 0.38662749f, 0.43394669f, + 0.141375780f, 0.18067408f, 0.23815984f, 0.29034933f, 0.38882061f, 0.44831617f, + 0.205067360f, 0.26200850f, 0.28831845f, 0.35265548f, 0.41227841f, 0.46066867f, + 0.072047472f, 0.12115468f, 0.18961933f, 0.28488105f, 0.40495409f, 0.46004731f, + 0.198557750f, 0.22705201f, 0.27591618f, 0.31064014f, 0.36695315f, 0.41465139f, + 0.128799860f, 0.16494038f, 0.25362087f, 0.29961433f, 0.35336792f, 0.42859765f, + 0.189710480f, 0.22045927f, 0.29038955f, 0.34755716f, 0.41335089f, 0.45984727f, + 0.087636105f, 0.16804885f, 0.24880519f, 0.32500502f, 0.39871150f, 0.45243576f, + 0.183164490f, 0.20372954f, 0.28663902f, 0.33639693f, 0.39567505f, 0.45029614f, + 0.135442360f, 0.17219131f, 0.25232067f, 0.30812818f, 0.37522467f, 0.44933943f, + 0.237947800f, 0.26313746f, 0.29423846f, 0.33363250f, 0.40548313f, 0.46136835f, + 0.136450240f, 0.17206573f, 0.23044273f, 0.28127300f, 0.34912154f, 0.39454258f, + 0.184673430f, 0.21026600f, 0.27179282f, 0.32517703f, 0.41007950f, 0.46131088f, + 0.120635550f, 0.15057589f, 0.23738282f, 0.29356081f, 0.37244051f, 0.42760875f, + 0.165980800f, 0.26393604f, 0.29879643f, 0.37329254f, 0.42416075f, 0.46364654f, + 0.083243472f, 0.13716891f, 0.20532429f, 0.28573678f, 0.34618078f, 0.42885349f, + 0.124185840f, 0.25817832f, 0.30013923f, 0.35832406f, 0.40788565f, 0.45242538f, + 0.148751310f, 0.21168861f, 0.28155588f, 0.33399871f, 0.39200642f, 0.44392882f, + 0.250092790f, 0.27749655f, 0.31714030f, 0.35382269f, 0.40755488f, 0.45807079f, + 0.090218008f, 0.15844407f, 0.21605547f, 0.26747762f, 0.33611136f, 0.43256724f, + 0.194821460f, 0.22238574f, 0.26892332f, 0.29957274f, 0.34593681f, 0.39087253f, + 0.088872041f, 0.18684006f, 0.27868480f, 0.33185291f, 0.38399584f, 0.43532623f, + 0.187631470f, 0.21132813f, 0.26919143f, 0.30608744f, 0.37267119f, 0.45037854f, + 0.078499578f, 0.14581909f, 0.22353298f, 0.28124283f, 0.35460841f, 0.44710837f, + 0.203049030f, 0.23554188f, 0.29130760f, 0.32976939f, 0.38552827f, 0.43804459f, + 0.132090630f, 0.16828557f, 0.25117965f, 0.33118164f, 0.39126122f, 0.43521955f, + 0.245699330f, 0.28091560f, 0.31693809f, 0.35063725f, 0.38679310f, 0.42687325f, + 0.141120120f, 0.18351512f, 0.24129878f, 0.28194334f, 0.34056397f, 0.42074436f, + 0.176576340f, 0.19930558f, 0.25055988f, 0.30421218f, 0.40924681f, 0.46535353f, + 0.117761100f, 0.14946364f, 0.21764598f, 0.29577606f, 0.40879019f, 0.46136645f, + 0.204842420f, 0.27294301f, 0.30601511f, 0.35160404f, 0.38727312f, 0.43085356f, + 0.073765998f, 0.14878616f, 0.27867445f, 0.35617826f, 0.40839136f, 0.45292538f, + 0.125517660f, 0.25496685f, 0.32758337f, 0.38197773f, 0.42435415f, 0.46126376f, + 0.135962010f, 0.17555426f, 0.24178151f, 0.31425983f, 0.40720232f, 0.45869366f, + 0.213570120f, 0.27094587f, 0.30863435f, 0.37331744f, 0.42018011f, 0.46102471f, + 0.082998736f, 0.14651530f, 0.21003822f, 0.28279492f, 0.38739390f, 0.45279145f, + 0.198570550f, 0.22875204f, 0.28417900f, 0.32642267f, 0.40238371f, 0.45320042f, + 0.141324200f, 0.19351582f, 0.27967266f, 0.32946724f, 0.37612094f, 0.41912905f, + 0.201481430f, 0.23856193f, 0.30309500f, 0.34633198f, 0.40074668f, 0.44775506f, + 0.094264220f, 0.16969966f, 0.23129383f, 0.28788431f, 0.37402386f, 0.44657509f, + 0.190612400f, 0.23544456f, 0.31650278f, 0.36818431f, 0.41389673f, 0.45404931f, + 0.145178650f, 0.19384152f, 0.26072685f, 0.31177170f, 0.38904763f, 0.44618125f, + 0.249738030f, 0.28583093f, 0.32433884f, 0.36184735f, 0.40237550f, 0.44552961f, + 0.144466440f, 0.19269281f, 0.25474986f, 0.29651925f, 0.34405115f, 0.39494788f, + 0.177748120f, 0.20967896f, 0.29994813f, 0.37438345f, 0.42341220f, 0.46196806f, + 0.144017810f, 0.18743776f, 0.25098351f, 0.29549083f, 0.36361608f, 0.43793137f, + 0.191890800f, 0.26774988f, 0.29463282f, 0.34191791f, 0.38746328f, 0.45369258f, + 0.081212845f, 0.13994797f, 0.22358119f, 0.33366778f, 0.41201077f, 0.45855130f, + 0.181044650f, 0.28450829f, 0.33194281f, 0.38005566f, 0.41856023f, 0.45789922f, + 0.136313630f, 0.18429069f, 0.26984493f, 0.34070980f, 0.40759216f, 0.45475266f, + 0.240476170f, 0.27948010f, 0.32327234f, 0.37258368f, 0.41532038f, 0.45744253f +}; + +const float swb_tbe_lsfvq_cbook_8b[256*LPC_SHB_ORDER] = +{ + 0.052035f, 0.098557f, 0.128235f, 0.155222f, 0.187634f, 0.220354f, 0.248003f, 0.327378f, 0.416763f, 0.468886f, + 0.050902f, 0.090274f, 0.123988f, 0.172234f, 0.224479f, 0.288101f, 0.337089f, 0.374172f, 0.403673f, 0.442608f, + 0.047188f, 0.089025f, 0.128973f, 0.167152f, 0.212901f, 0.254805f, 0.296290f, 0.362619f, 0.403389f, 0.449070f, + 0.035345f, 0.083282f, 0.158003f, 0.212631f, 0.253206f, 0.293314f, 0.325157f, 0.356067f, 0.389327f, 0.439909f, + 0.049324f, 0.091699f, 0.133308f, 0.177313f, 0.216889f, 0.248068f, 0.286140f, 0.319129f, 0.388743f, 0.452730f, + 0.037590f, 0.074792f, 0.126499f, 0.196718f, 0.236226f, 0.274430f, 0.316669f, 0.363084f, 0.433737f, 0.467349f, + 0.049999f, 0.094260f, 0.156667f, 0.193806f, 0.224624f, 0.253432f, 0.298661f, 0.377723f, 0.419777f, 0.464133f, + 0.038569f, 0.077613f, 0.169806f, 0.204031f, 0.242844f, 0.289350f, 0.336338f, 0.381981f, 0.423438f, 0.462244f, + 0.039797f, 0.077432f, 0.113315f, 0.148404f, 0.200326f, 0.241409f, 0.286872f, 0.359925f, 0.404895f, 0.452684f, + 0.050430f, 0.099036f, 0.143005f, 0.195455f, 0.242036f, 0.281478f, 0.323205f, 0.366833f, 0.402614f, 0.450408f, + 0.039724f, 0.079916f, 0.130839f, 0.179575f, 0.218692f, 0.261122f, 0.320798f, 0.380589f, 0.420132f, 0.460065f, + 0.062070f, 0.105792f, 0.170204f, 0.199290f, 0.234202f, 0.268038f, 0.333250f, 0.390551f, 0.418930f, 0.457810f, + 0.079997f, 0.120714f, 0.160981f, 0.199639f, 0.229158f, 0.259921f, 0.288582f, 0.329020f, 0.380142f, 0.430256f, + 0.045641f, 0.080952f, 0.126548f, 0.172023f, 0.224929f, 0.281759f, 0.360638f, 0.396302f, 0.426277f, 0.459174f, + 0.067880f, 0.101438f, 0.143420f, 0.179072f, 0.220060f, 0.263601f, 0.346964f, 0.387408f, 0.415045f, 0.444299f, + 0.038652f, 0.093084f, 0.143655f, 0.192895f, 0.264359f, 0.309455f, 0.341003f, 0.380032f, 0.409710f, 0.453003f, + 0.050708f, 0.090949f, 0.126797f, 0.165211f, 0.202591f, 0.237959f, 0.282372f, 0.346666f, 0.391780f, 0.440679f, + 0.046423f, 0.087161f, 0.150877f, 0.194305f, 0.229067f, 0.270295f, 0.334805f, 0.371802f, 0.405116f, 0.457953f, + 0.044360f, 0.087261f, 0.139254f, 0.182219f, 0.219289f, 0.261504f, 0.309799f, 0.359196f, 0.408816f, 0.457282f, + 0.034881f, 0.089771f, 0.160723f, 0.208734f, 0.255654f, 0.288616f, 0.323156f, 0.354465f, 0.423951f, 0.466020f, + 0.051086f, 0.093155f, 0.140520f, 0.176030f, 0.216785f, 0.257930f, 0.308053f, 0.359569f, 0.390408f, 0.419868f, + 0.051928f, 0.099511f, 0.144135f, 0.190596f, 0.241070f, 0.289741f, 0.335984f, 0.378008f, 0.417474f, 0.459764f, + 0.041656f, 0.085336f, 0.164968f, 0.198531f, 0.228507f, 0.264871f, 0.318823f, 0.366222f, 0.416159f, 0.459177f, + 0.063772f, 0.119952f, 0.176631f, 0.218406f, 0.251883f, 0.296547f, 0.335911f, 0.368682f, 0.403997f, 0.454099f, + 0.059576f, 0.096358f, 0.126102f, 0.157582f, 0.193300f, 0.225485f, 0.274787f, 0.360048f, 0.430168f, 0.473165f, + 0.050090f, 0.098011f, 0.150107f, 0.194228f, 0.239956f, 0.284161f, 0.328550f, 0.373362f, 0.417904f, 0.459405f, + 0.050455f, 0.091803f, 0.128564f, 0.163400f, 0.213005f, 0.269193f, 0.341329f, 0.387102f, 0.424272f, 0.465410f, + 0.056626f, 0.105111f, 0.157033f, 0.200776f, 0.238054f, 0.282274f, 0.337598f, 0.395108f, 0.431675f, 0.466636f, + 0.041642f, 0.108843f, 0.169446f, 0.197564f, 0.223758f, 0.251886f, 0.303709f, 0.346790f, 0.412135f, 0.456278f, + 0.045415f, 0.088367f, 0.137979f, 0.191624f, 0.240474f, 0.288265f, 0.348450f, 0.394310f, 0.440392f, 0.471964f, + 0.046252f, 0.096877f, 0.163695f, 0.195612f, 0.222631f, 0.252841f, 0.329557f, 0.384350f, 0.432499f, 0.470718f, + 0.053043f, 0.104263f, 0.159826f, 0.209898f, 0.257555f, 0.321633f, 0.369402f, 0.398653f, 0.424938f, 0.462350f, + 0.043656f, 0.081158f, 0.119295f, 0.162597f, 0.202663f, 0.242606f, 0.285262f, 0.336831f, 0.412286f, 0.457530f, + 0.042710f, 0.080739f, 0.129188f, 0.194265f, 0.236487f, 0.281364f, 0.322263f, 0.353819f, 0.398147f, 0.457506f, + 0.034022f, 0.067080f, 0.110067f, 0.161100f, 0.245813f, 0.298294f, 0.336441f, 0.379210f, 0.426400f, 0.464858f, + 0.041504f, 0.104317f, 0.174678f, 0.212809f, 0.241453f, 0.277049f, 0.329887f, 0.379542f, 0.415948f, 0.452461f, + 0.043385f, 0.093120f, 0.156620f, 0.187415f, 0.219909f, 0.252543f, 0.285489f, 0.331396f, 0.421562f, 0.463942f, + 0.032947f, 0.067948f, 0.125627f, 0.195426f, 0.246592f, 0.284364f, 0.333690f, 0.378531f, 0.417714f, 0.452488f, + 0.049156f, 0.104448f, 0.150380f, 0.189623f, 0.226621f, 0.266196f, 0.320491f, 0.363628f, 0.410110f, 0.460970f, + 0.059406f, 0.107544f, 0.158619f, 0.213862f, 0.255056f, 0.305344f, 0.347819f, 0.379775f, 0.414531f, 0.461875f, + 0.042551f, 0.081551f, 0.122191f, 0.173384f, 0.212196f, 0.253318f, 0.299526f, 0.366219f, 0.418377f, 0.460170f, + 0.054564f, 0.097456f, 0.139734f, 0.189857f, 0.240306f, 0.279858f, 0.341376f, 0.385962f, 0.412633f, 0.443663f, + 0.047246f, 0.085779f, 0.123843f, 0.162683f, 0.199213f, 0.237097f, 0.335143f, 0.388883f, 0.421806f, 0.461765f, + 0.053449f, 0.122299f, 0.157276f, 0.197221f, 0.242155f, 0.288987f, 0.338839f, 0.378598f, 0.407019f, 0.443119f, + 0.061169f, 0.096794f, 0.155005f, 0.186632f, 0.216953f, 0.248877f, 0.315884f, 0.372060f, 0.409344f, 0.450829f, + 0.050160f, 0.097186f, 0.144946f, 0.191946f, 0.238536f, 0.282942f, 0.336958f, 0.391570f, 0.431474f, 0.468178f, + 0.070512f, 0.115329f, 0.156141f, 0.186164f, 0.223411f, 0.278915f, 0.315935f, 0.370299f, 0.422165f, 0.463007f, + 0.052587f, 0.101896f, 0.154071f, 0.206102f, 0.254920f, 0.314033f, 0.367686f, 0.401531f, 0.433527f, 0.471797f, + 0.067698f, 0.106830f, 0.141570f, 0.175913f, 0.207186f, 0.239077f, 0.299182f, 0.363370f, 0.402273f, 0.448275f, + 0.050042f, 0.096846f, 0.142801f, 0.189262f, 0.233767f, 0.278335f, 0.328758f, 0.378276f, 0.424023f, 0.463870f, + 0.048564f, 0.093699f, 0.138452f, 0.183259f, 0.224028f, 0.268624f, 0.319818f, 0.373529f, 0.420181f, 0.461720f, + 0.035663f, 0.110208f, 0.182596f, 0.215274f, 0.262474f, 0.305840f, 0.334102f, 0.363985f, 0.391665f, 0.450045f, + 0.052124f, 0.097379f, 0.141664f, 0.187867f, 0.225707f, 0.268701f, 0.306038f, 0.358072f, 0.403022f, 0.453386f, + 0.046364f, 0.094056f, 0.145010f, 0.197890f, 0.235910f, 0.284683f, 0.329466f, 0.366312f, 0.443226f, 0.473416f, + 0.065692f, 0.108572f, 0.157530f, 0.204882f, 0.236869f, 0.270301f, 0.305422f, 0.366582f, 0.418869f, 0.464143f, + 0.081775f, 0.123697f, 0.162035f, 0.213510f, 0.253580f, 0.285130f, 0.316195f, 0.376374f, 0.434072f, 0.472957f, + 0.071914f, 0.116132f, 0.153572f, 0.182184f, 0.211027f, 0.240482f, 0.272342f, 0.368056f, 0.422300f, 0.463416f, + 0.055135f, 0.104947f, 0.151424f, 0.197856f, 0.244545f, 0.291623f, 0.334237f, 0.376193f, 0.417664f, 0.459559f, + 0.047928f, 0.088506f, 0.128407f, 0.196811f, 0.234221f, 0.262202f, 0.339912f, 0.389867f, 0.432755f, 0.470636f, + 0.061209f, 0.130070f, 0.168080f, 0.195727f, 0.232576f, 0.266266f, 0.329227f, 0.384677f, 0.415326f, 0.450918f, + 0.054489f, 0.114179f, 0.160730f, 0.204526f, 0.247099f, 0.288682f, 0.320040f, 0.350371f, 0.393345f, 0.454259f, + 0.050257f, 0.098343f, 0.146333f, 0.195038f, 0.244345f, 0.293566f, 0.353243f, 0.395361f, 0.430313f, 0.469396f, + 0.046313f, 0.098069f, 0.159706f, 0.198648f, 0.234593f, 0.268660f, 0.359439f, 0.425175f, 0.450429f, 0.472752f, + 0.065195f, 0.111302f, 0.163983f, 0.223289f, 0.264603f, 0.313139f, 0.359677f, 0.394680f, 0.421766f, 0.463443f, + 0.049833f, 0.099641f, 0.142577f, 0.172120f, 0.206797f, 0.237530f, 0.271835f, 0.310803f, 0.368226f, 0.442268f, + 0.051561f, 0.092407f, 0.127677f, 0.184605f, 0.228561f, 0.264833f, 0.337058f, 0.373648f, 0.408072f, 0.458254f, + 0.050312f, 0.093979f, 0.133001f, 0.176857f, 0.224745f, 0.262482f, 0.313019f, 0.370051f, 0.406746f, 0.461218f, + 0.056453f, 0.100292f, 0.164556f, 0.206451f, 0.238837f, 0.280290f, 0.320629f, 0.359375f, 0.404283f, 0.462747f, + 0.064422f, 0.107489f, 0.148611f, 0.185763f, 0.218563f, 0.255882f, 0.294328f, 0.331455f, 0.376622f, 0.436460f, + 0.046651f, 0.088769f, 0.126223f, 0.207005f, 0.246095f, 0.284572f, 0.333915f, 0.369094f, 0.423764f, 0.462912f, + 0.056372f, 0.100125f, 0.145020f, 0.186096f, 0.223092f, 0.266834f, 0.309121f, 0.374704f, 0.413627f, 0.455613f, + 0.035065f, 0.084427f, 0.179107f, 0.228245f, 0.259827f, 0.296722f, 0.342853f, 0.375360f, 0.423312f, 0.459834f, + 0.051556f, 0.093559f, 0.131989f, 0.171289f, 0.206668f, 0.242179f, 0.276215f, 0.370322f, 0.418996f, 0.458514f, + 0.064906f, 0.103567f, 0.160614f, 0.209947f, 0.240290f, 0.279374f, 0.314472f, 0.370362f, 0.411818f, 0.440592f, + 0.051333f, 0.093194f, 0.134650f, 0.184715f, 0.225233f, 0.258320f, 0.299595f, 0.380254f, 0.431966f, 0.466464f, + 0.054906f, 0.104680f, 0.156332f, 0.201242f, 0.242115f, 0.293254f, 0.350097f, 0.390361f, 0.417661f, 0.453152f, + 0.057964f, 0.111565f, 0.163839f, 0.193942f, 0.229367f, 0.268561f, 0.301745f, 0.355413f, 0.397475f, 0.426184f, + 0.043021f, 0.099243f, 0.155661f, 0.184626f, 0.228258f, 0.302504f, 0.358238f, 0.390818f, 0.429834f, 0.463440f, + 0.045380f, 0.120045f, 0.163293f, 0.195013f, 0.229454f, 0.271296f, 0.350581f, 0.391168f, 0.420733f, 0.455968f, + 0.047668f, 0.096305f, 0.154868f, 0.214976f, 0.270766f, 0.313434f, 0.350305f, 0.385491f, 0.424396f, 0.457538f, + 0.047251f, 0.089307f, 0.132379f, 0.176882f, 0.213945f, 0.248516f, 0.284924f, 0.345563f, 0.410789f, 0.454839f, + 0.043366f, 0.088702f, 0.144534f, 0.191411f, 0.235903f, 0.273950f, 0.319010f, 0.377616f, 0.422360f, 0.464893f, + 0.045624f, 0.091445f, 0.137199f, 0.184217f, 0.230245f, 0.275709f, 0.321477f, 0.366635f, 0.411549f, 0.456497f, + 0.042352f, 0.097756f, 0.173684f, 0.215934f, 0.261779f, 0.294833f, 0.331844f, 0.376147f, 0.440475f, 0.470683f, + 0.038091f, 0.091036f, 0.161878f, 0.196009f, 0.230216f, 0.262778f, 0.314032f, 0.356498f, 0.393785f, 0.443990f, + 0.045665f, 0.091177f, 0.141352f, 0.193543f, 0.239618f, 0.284706f, 0.341027f, 0.382868f, 0.419859f, 0.463306f, + 0.041904f, 0.103110f, 0.154646f, 0.188554f, 0.225202f, 0.267803f, 0.305332f, 0.349841f, 0.431723f, 0.469552f, + 0.077431f, 0.117466f, 0.168864f, 0.221652f, 0.253857f, 0.294713f, 0.346262f, 0.377031f, 0.425887f, 0.467332f, + 0.064470f, 0.103906f, 0.134849f, 0.160779f, 0.196409f, 0.244298f, 0.314086f, 0.379702f, 0.416731f, 0.463122f, + 0.049451f, 0.112350f, 0.166433f, 0.195509f, 0.227644f, 0.285465f, 0.331780f, 0.367291f, 0.432216f, 0.466286f, + 0.058067f, 0.098622f, 0.137834f, 0.175730f, 0.218379f, 0.270120f, 0.325626f, 0.378807f, 0.443060f, 0.474998f, + 0.052308f, 0.115312f, 0.157669f, 0.200104f, 0.247392f, 0.279777f, 0.322273f, 0.392271f, 0.433586f, 0.467817f, + 0.058782f, 0.111246f, 0.168484f, 0.215834f, 0.244122f, 0.273877f, 0.299244f, 0.338369f, 0.412816f, 0.466858f, + 0.055542f, 0.086661f, 0.144229f, 0.216409f, 0.252097f, 0.297799f, 0.342351f, 0.370742f, 0.429205f, 0.465769f, + 0.063246f, 0.100799f, 0.164514f, 0.204780f, 0.229008f, 0.259317f, 0.319118f, 0.378226f, 0.441896f, 0.474270f, + 0.049656f, 0.100510f, 0.158979f, 0.226797f, 0.269956f, 0.309657f, 0.351457f, 0.393377f, 0.442146f, 0.470304f, + 0.066278f, 0.103915f, 0.139783f, 0.171615f, 0.205432f, 0.233412f, 0.258944f, 0.302518f, 0.408815f, 0.464278f, + 0.048237f, 0.093317f, 0.141389f, 0.189982f, 0.235703f, 0.281926f, 0.328964f, 0.373539f, 0.416565f, 0.460637f, + 0.051115f, 0.089333f, 0.124829f, 0.175556f, 0.227688f, 0.272289f, 0.313617f, 0.356144f, 0.426854f, 0.468024f, + 0.057016f, 0.110189f, 0.160396f, 0.211405f, 0.246994f, 0.287899f, 0.335640f, 0.370610f, 0.408313f, 0.462788f, + 0.045706f, 0.110933f, 0.160922f, 0.208233f, 0.238788f, 0.272099f, 0.299401f, 0.332730f, 0.381907f, 0.454209f, + 0.044199f, 0.080129f, 0.119936f, 0.210423f, 0.254754f, 0.297418f, 0.348033f, 0.383461f, 0.436047f, 0.467678f, + 0.059370f, 0.103993f, 0.152197f, 0.193477f, 0.232752f, 0.273256f, 0.312825f, 0.377850f, 0.411394f, 0.457251f, + 0.059698f, 0.114702f, 0.164424f, 0.210373f, 0.258366f, 0.304006f, 0.349730f, 0.389369f, 0.431678f, 0.467558f, + 0.050972f, 0.099832f, 0.140005f, 0.182190f, 0.219279f, 0.255299f, 0.294189f, 0.366548f, 0.411624f, 0.452662f, + 0.059947f, 0.105101f, 0.147291f, 0.189602f, 0.242184f, 0.277632f, 0.329136f, 0.385035f, 0.415412f, 0.464746f, + 0.050246f, 0.103445f, 0.142498f, 0.184607f, 0.213644f, 0.242299f, 0.319253f, 0.380800f, 0.447847f, 0.479237f, + 0.067193f, 0.115430f, 0.155858f, 0.206126f, 0.252681f, 0.293822f, 0.356656f, 0.397588f, 0.423304f, 0.464089f, + 0.071847f, 0.116894f, 0.157883f, 0.194092f, 0.230547f, 0.274564f, 0.325945f, 0.365502f, 0.398749f, 0.451080f, + 0.071752f, 0.107567f, 0.149280f, 0.194893f, 0.232418f, 0.278702f, 0.361895f, 0.398599f, 0.425587f, 0.457898f, + 0.068739f, 0.115103f, 0.157316f, 0.197895f, 0.237993f, 0.279071f, 0.328650f, 0.383319f, 0.420022f, 0.465113f, + 0.052303f, 0.094829f, 0.144186f, 0.186062f, 0.279484f, 0.319196f, 0.354590f, 0.387530f, 0.437802f, 0.465583f, + 0.055846f, 0.106998f, 0.151640f, 0.182290f, 0.210559f, 0.239134f, 0.274479f, 0.338376f, 0.407908f, 0.453481f, + 0.056627f, 0.103955f, 0.149473f, 0.194316f, 0.238331f, 0.280339f, 0.318046f, 0.371471f, 0.426297f, 0.467870f, + 0.061231f, 0.103217f, 0.144741f, 0.186145f, 0.226738f, 0.267120f, 0.329755f, 0.373349f, 0.417263f, 0.463712f, + 0.045494f, 0.110081f, 0.163067f, 0.227778f, 0.280124f, 0.307836f, 0.336439f, 0.369219f, 0.402807f, 0.456421f, + 0.053383f, 0.102864f, 0.156288f, 0.198372f, 0.233337f, 0.267640f, 0.304209f, 0.356227f, 0.407078f, 0.455673f, + 0.056676f, 0.107005f, 0.155125f, 0.201255f, 0.250254f, 0.297223f, 0.339905f, 0.382321f, 0.423693f, 0.461944f, + 0.054333f, 0.117799f, 0.170332f, 0.204234f, 0.239159f, 0.274313f, 0.314448f, 0.375919f, 0.415366f, 0.461096f, + 0.066036f, 0.136196f, 0.172592f, 0.232898f, 0.276089f, 0.302787f, 0.329116f, 0.395210f, 0.449302f, 0.475747f, + 0.070331f, 0.100716f, 0.133253f, 0.171137f, 0.209264f, 0.237895f, 0.305371f, 0.364686f, 0.438728f, 0.479133f, + 0.049672f, 0.104018f, 0.154836f, 0.206341f, 0.253671f, 0.295628f, 0.338852f, 0.376356f, 0.415621f, 0.460077f, + 0.056211f, 0.101148f, 0.145610f, 0.197140f, 0.227748f, 0.264313f, 0.341533f, 0.388764f, 0.445317f, 0.477085f, + 0.055185f, 0.133050f, 0.180174f, 0.209627f, 0.248220f, 0.279970f, 0.328967f, 0.384183f, 0.427107f, 0.462356f, + 0.090510f, 0.132862f, 0.173536f, 0.213099f, 0.242241f, 0.277461f, 0.307068f, 0.358492f, 0.406083f, 0.445895f, + 0.058962f, 0.100504f, 0.149829f, 0.208057f, 0.234691f, 0.276924f, 0.357507f, 0.397315f, 0.440325f, 0.472359f, + 0.060359f, 0.115102f, 0.165680f, 0.200810f, 0.227294f, 0.259266f, 0.358724f, 0.400750f, 0.443988f, 0.474842f, + 0.057406f, 0.110946f, 0.171732f, 0.222531f, 0.261630f, 0.332974f, 0.376127f, 0.402824f, 0.429325f, 0.465189f, + 0.043822f, 0.082882f, 0.122127f, 0.163180f, 0.199988f, 0.233325f, 0.273271f, 0.326231f, 0.395731f, 0.451164f, + 0.043530f, 0.086208f, 0.128358f, 0.174740f, 0.247178f, 0.286590f, 0.326910f, 0.374201f, 0.412175f, 0.456349f, + 0.044183f, 0.084451f, 0.124772f, 0.160673f, 0.219266f, 0.265006f, 0.316722f, 0.374047f, 0.409896f, 0.451766f, + 0.050936f, 0.101062f, 0.152285f, 0.210171f, 0.245676f, 0.292805f, 0.333955f, 0.366681f, 0.401168f, 0.455315f, + 0.046805f, 0.085866f, 0.127908f, 0.181072f, 0.225619f, 0.265095f, 0.301043f, 0.341348f, 0.395446f, 0.449907f, + 0.042622f, 0.082584f, 0.131883f, 0.184679f, 0.232497f, 0.279794f, 0.335535f, 0.379437f, 0.425137f, 0.465917f, + 0.052394f, 0.096555f, 0.141288f, 0.193157f, 0.229466f, 0.269961f, 0.307875f, 0.369736f, 0.427604f, 0.463768f, + 0.049014f, 0.101187f, 0.157612f, 0.211850f, 0.252631f, 0.293740f, 0.349772f, 0.390796f, 0.430148f, 0.466887f, + 0.061472f, 0.102460f, 0.130638f, 0.154914f, 0.188934f, 0.224962f, 0.289961f, 0.378839f, 0.409509f, 0.454753f, + 0.040355f, 0.111547f, 0.160810f, 0.198176f, 0.232341f, 0.282372f, 0.328114f, 0.365421f, 0.405953f, 0.452666f, + 0.051498f, 0.100439f, 0.143970f, 0.177506f, 0.213658f, 0.248304f, 0.327782f, 0.387335f, 0.423694f, 0.464601f, + 0.068825f, 0.113622f, 0.169531f, 0.214249f, 0.247214f, 0.285172f, 0.328523f, 0.387739f, 0.417886f, 0.464554f, + 0.072521f, 0.113366f, 0.160172f, 0.198528f, 0.226144f, 0.254678f, 0.310546f, 0.354542f, 0.387805f, 0.442152f, + 0.056215f, 0.098619f, 0.133402f, 0.181712f, 0.239008f, 0.278502f, 0.344724f, 0.388895f, 0.423036f, 0.467855f, + 0.062429f, 0.109771f, 0.162502f, 0.196939f, 0.224387f, 0.262071f, 0.323117f, 0.368722f, 0.416985f, 0.462413f, + 0.060110f, 0.108774f, 0.150308f, 0.199802f, 0.264652f, 0.304578f, 0.347395f, 0.390206f, 0.426311f, 0.464915f, + 0.045681f, 0.089659f, 0.149800f, 0.186117f, 0.216751f, 0.246327f, 0.290352f, 0.344660f, 0.389432f, 0.444891f, + 0.050829f, 0.096543f, 0.155589f, 0.190895f, 0.224301f, 0.271682f, 0.326354f, 0.381553f, 0.421373f, 0.457146f, + 0.044771f, 0.084669f, 0.139044f, 0.192501f, 0.226907f, 0.263807f, 0.306407f, 0.377071f, 0.414961f, 0.450916f, + 0.058452f, 0.110406f, 0.157460f, 0.204676f, 0.258762f, 0.290562f, 0.319844f, 0.352065f, 0.432222f, 0.472393f, + 0.056675f, 0.105769f, 0.145256f, 0.189372f, 0.223155f, 0.268584f, 0.316662f, 0.365541f, 0.401645f, 0.434404f, + 0.049272f, 0.094814f, 0.143723f, 0.196904f, 0.246241f, 0.301437f, 0.346313f, 0.383753f, 0.419651f, 0.459244f, + 0.047694f, 0.094350f, 0.151873f, 0.209061f, 0.245856f, 0.275424f, 0.315157f, 0.371735f, 0.428434f, 0.463634f, + 0.070013f, 0.117284f, 0.176432f, 0.220387f, 0.259562f, 0.300623f, 0.342089f, 0.390694f, 0.417372f, 0.462571f, + 0.058921f, 0.104850f, 0.142858f, 0.178126f, 0.210803f, 0.238810f, 0.288098f, 0.384526f, 0.432185f, 0.467076f, + 0.047972f, 0.097327f, 0.148890f, 0.203855f, 0.243240f, 0.283598f, 0.334893f, 0.372088f, 0.412174f, 0.464413f, + 0.053684f, 0.096809f, 0.143044f, 0.181581f, 0.228389f, 0.270800f, 0.322361f, 0.391276f, 0.430659f, 0.466880f, + 0.044586f, 0.122337f, 0.167705f, 0.201662f, 0.240097f, 0.289818f, 0.345058f, 0.382092f, 0.438138f, 0.472021f, + 0.058657f, 0.131647f, 0.175035f, 0.201389f, 0.228297f, 0.262383f, 0.300653f, 0.346236f, 0.427618f, 0.466306f, + 0.038131f, 0.079609f, 0.143124f, 0.213799f, 0.246000f, 0.274980f, 0.350246f, 0.403256f, 0.438897f, 0.468033f, + 0.068699f, 0.115225f, 0.168266f, 0.197077f, 0.222782f, 0.246507f, 0.334509f, 0.387455f, 0.435752f, 0.475064f, + 0.051779f, 0.102976f, 0.156663f, 0.213128f, 0.264735f, 0.326526f, 0.372141f, 0.403846f, 0.432850f, 0.471923f, + 0.060586f, 0.101498f, 0.135493f, 0.173480f, 0.209652f, 0.250462f, 0.291284f, 0.342503f, 0.417229f, 0.462133f, + 0.044335f, 0.086169f, 0.144113f, 0.197628f, 0.235900f, 0.273515f, 0.311798f, 0.358357f, 0.413356f, 0.462417f, + 0.037139f, 0.074523f, 0.116614f, 0.165055f, 0.223223f, 0.273117f, 0.329507f, 0.383426f, 0.435814f, 0.470269f, + 0.047181f, 0.097768f, 0.171023f, 0.205397f, 0.245358f, 0.295311f, 0.336586f, 0.369485f, 0.421233f, 0.465914f, + 0.062309f, 0.104500f, 0.147401f, 0.193110f, 0.228058f, 0.260174f, 0.286437f, 0.328216f, 0.408873f, 0.457704f, + 0.033758f, 0.076535f, 0.146968f, 0.223914f, 0.256314f, 0.293898f, 0.344191f, 0.380044f, 0.429295f, 0.458511f, + 0.053820f, 0.100870f, 0.151208f, 0.199506f, 0.237034f, 0.278242f, 0.317503f, 0.365012f, 0.414293f, 0.458401f, + 0.048959f, 0.115875f, 0.173948f, 0.217520f, 0.259862f, 0.301989f, 0.347552f, 0.382497f, 0.417961f, 0.461917f, + 0.049542f, 0.091687f, 0.132903f, 0.189723f, 0.224344f, 0.257479f, 0.299641f, 0.352070f, 0.426438f, 0.468136f, + 0.074975f, 0.118701f, 0.151425f, 0.178468f, 0.223099f, 0.296570f, 0.342204f, 0.375124f, 0.418237f, 0.461155f, + 0.048862f, 0.101636f, 0.141831f, 0.184422f, 0.217823f, 0.249609f, 0.343243f, 0.399113f, 0.450686f, 0.477330f, + 0.074971f, 0.112223f, 0.157913f, 0.196284f, 0.243594f, 0.305898f, 0.340704f, 0.371399f, 0.418209f, 0.461180f, + 0.047352f, 0.115276f, 0.160725f, 0.193027f, 0.229854f, 0.263731f, 0.301940f, 0.378552f, 0.414083f, 0.446173f, + 0.059846f, 0.105671f, 0.144046f, 0.198296f, 0.245954f, 0.283923f, 0.350516f, 0.391352f, 0.430367f, 0.471737f, + 0.074555f, 0.112890f, 0.160280f, 0.193719f, 0.233102f, 0.266509f, 0.312007f, 0.386544f, 0.420167f, 0.458038f, + 0.067261f, 0.111598f, 0.155216f, 0.207272f, 0.253291f, 0.309808f, 0.375775f, 0.406060f, 0.429646f, 0.466527f, + 0.072015f, 0.113855f, 0.152641f, 0.185966f, 0.212160f, 0.244403f, 0.279304f, 0.353568f, 0.397873f, 0.432053f, + 0.057609f, 0.105877f, 0.148922f, 0.188700f, 0.232036f, 0.282119f, 0.329612f, 0.375947f, 0.416782f, 0.457815f, + 0.050973f, 0.100177f, 0.140092f, 0.185550f, 0.238056f, 0.273150f, 0.321487f, 0.383660f, 0.415638f, 0.456817f, + 0.039806f, 0.126350f, 0.178948f, 0.213873f, 0.255655f, 0.294524f, 0.330344f, 0.360261f, 0.416162f, 0.466911f, + 0.063393f, 0.108247f, 0.149242f, 0.189683f, 0.222867f, 0.262691f, 0.299364f, 0.359972f, 0.412753f, 0.457277f, + 0.050600f, 0.099234f, 0.150035f, 0.198292f, 0.246257f, 0.290806f, 0.336586f, 0.382631f, 0.424274f, 0.463374f, + 0.067312f, 0.111338f, 0.151025f, 0.202518f, 0.240338f, 0.269562f, 0.300697f, 0.385260f, 0.440923f, 0.472259f, + 0.092753f, 0.142329f, 0.176758f, 0.223424f, 0.268502f, 0.296763f, 0.319964f, 0.376238f, 0.441441f, 0.477606f, + 0.057530f, 0.097677f, 0.159509f, 0.201106f, 0.224079f, 0.245637f, 0.286003f, 0.375766f, 0.445386f, 0.477458f, + 0.055718f, 0.105169f, 0.156792f, 0.203385f, 0.244396f, 0.285413f, 0.325547f, 0.384007f, 0.421448f, 0.459753f, + 0.044415f, 0.093549f, 0.159707f, 0.192449f, 0.225942f, 0.267813f, 0.348584f, 0.389866f, 0.428214f, 0.465053f, + 0.073100f, 0.142639f, 0.179538f, 0.209861f, 0.241096f, 0.284495f, 0.333600f, 0.382609f, 0.420087f, 0.454347f, + 0.056150f, 0.133011f, 0.171789f, 0.209798f, 0.243168f, 0.280293f, 0.313300f, 0.361975f, 0.402894f, 0.441400f, + 0.050711f, 0.100022f, 0.148476f, 0.200043f, 0.247876f, 0.305520f, 0.362364f, 0.399378f, 0.431164f, 0.470519f, + 0.050151f, 0.102726f, 0.178139f, 0.214644f, 0.239684f, 0.272465f, 0.350549f, 0.395865f, 0.439724f, 0.472007f, + 0.057321f, 0.112456f, 0.176664f, 0.223544f, 0.265943f, 0.332838f, 0.374528f, 0.400087f, 0.422190f, 0.452780f, + 0.068936f, 0.111462f, 0.152424f, 0.184775f, 0.213783f, 0.241083f, 0.269875f, 0.305906f, 0.384801f, 0.449720f, + 0.047841f, 0.090004f, 0.137440f, 0.184176f, 0.226672f, 0.280565f, 0.332422f, 0.379775f, 0.414877f, 0.455906f, + 0.051208f, 0.095910f, 0.134766f, 0.179194f, 0.228900f, 0.267574f, 0.317929f, 0.370086f, 0.401118f, 0.446217f, + 0.057304f, 0.108307f, 0.167260f, 0.219044f, 0.253957f, 0.285245f, 0.321407f, 0.369771f, 0.413636f, 0.462874f, + 0.062714f, 0.102112f, 0.146902f, 0.188999f, 0.226385f, 0.267241f, 0.309584f, 0.346847f, 0.387502f, 0.451009f, + 0.045352f, 0.084823f, 0.120662f, 0.187181f, 0.252978f, 0.294385f, 0.328589f, 0.369623f, 0.440700f, 0.470814f, + 0.054539f, 0.107161f, 0.151423f, 0.184774f, 0.222621f, 0.270311f, 0.310645f, 0.379532f, 0.421532f, 0.464395f, + 0.041931f, 0.097165f, 0.176126f, 0.244078f, 0.285457f, 0.311564f, 0.343280f, 0.380534f, 0.427693f, 0.465345f, + 0.049656f, 0.089927f, 0.123487f, 0.158143f, 0.207460f, 0.251012f, 0.298147f, 0.386381f, 0.434882f, 0.470227f, + 0.064608f, 0.113031f, 0.152816f, 0.202317f, 0.244207f, 0.281442f, 0.321974f, 0.369506f, 0.411120f, 0.458796f, + 0.041667f, 0.088042f, 0.149426f, 0.187507f, 0.226638f, 0.278825f, 0.313814f, 0.388390f, 0.448889f, 0.473167f, + 0.063255f, 0.112633f, 0.161884f, 0.207517f, 0.248243f, 0.290171f, 0.339946f, 0.392358f, 0.424077f, 0.465045f, + 0.047738f, 0.124639f, 0.167770f, 0.198211f, 0.225569f, 0.260577f, 0.319448f, 0.357208f, 0.390762f, 0.448737f, + 0.056281f, 0.097031f, 0.133672f, 0.175612f, 0.249666f, 0.302816f, 0.358207f, 0.396586f, 0.431468f, 0.464859f, + 0.065840f, 0.114000f, 0.154376f, 0.181022f, 0.219481f, 0.272109f, 0.342283f, 0.390114f, 0.425579f, 0.463533f, + 0.054385f, 0.087287f, 0.133120f, 0.219075f, 0.277198f, 0.318550f, 0.353398f, 0.394571f, 0.451311f, 0.473024f, + 0.050377f, 0.099870f, 0.139986f, 0.179622f, 0.215723f, 0.254691f, 0.298673f, 0.344156f, 0.401375f, 0.451981f, + 0.047282f, 0.095779f, 0.154096f, 0.204588f, 0.238142f, 0.277769f, 0.328001f, 0.383819f, 0.421546f, 0.464335f, + 0.051096f, 0.097245f, 0.143694f, 0.189341f, 0.232614f, 0.275390f, 0.321690f, 0.370345f, 0.414317f, 0.459688f, + 0.057607f, 0.108697f, 0.166883f, 0.217010f, 0.265314f, 0.303576f, 0.339093f, 0.374926f, 0.429392f, 0.466921f, + 0.058130f, 0.096368f, 0.163828f, 0.194469f, 0.230519f, 0.266092f, 0.322506f, 0.379323f, 0.410417f, 0.440281f, + 0.059593f, 0.104108f, 0.143990f, 0.199751f, 0.246890f, 0.283738f, 0.342763f, 0.388274f, 0.417119f, 0.460115f, + 0.044521f, 0.105111f, 0.173587f, 0.207942f, 0.239336f, 0.273945f, 0.308799f, 0.369491f, 0.436878f, 0.469005f, + 0.074773f, 0.133154f, 0.177818f, 0.224283f, 0.264970f, 0.306138f, 0.340046f, 0.370218f, 0.412563f, 0.459546f, + 0.075738f, 0.111821f, 0.145360f, 0.181385f, 0.219465f, 0.256030f, 0.308392f, 0.373355f, 0.418157f, 0.463492f, + 0.056087f, 0.105731f, 0.160372f, 0.206032f, 0.244637f, 0.282396f, 0.334056f, 0.375992f, 0.420837f, 0.468046f, + 0.076209f, 0.108262f, 0.143499f, 0.182696f, 0.233318f, 0.271088f, 0.327756f, 0.373740f, 0.439247f, 0.474235f, + 0.052399f, 0.112281f, 0.162812f, 0.201017f, 0.261354f, 0.299326f, 0.327620f, 0.386801f, 0.447769f, 0.474791f, + 0.074893f, 0.121992f, 0.163699f, 0.207822f, 0.244930f, 0.271999f, 0.296466f, 0.345316f, 0.435127f, 0.476239f, + 0.058176f, 0.105085f, 0.149574f, 0.194188f, 0.249818f, 0.296524f, 0.337963f, 0.402402f, 0.448624f, 0.472243f, + 0.060779f, 0.099068f, 0.167491f, 0.198796f, 0.227494f, 0.254019f, 0.329803f, 0.403981f, 0.450520f, 0.475438f, + 0.052532f, 0.104934f, 0.160049f, 0.218916f, 0.277885f, 0.331831f, 0.371634f, 0.402258f, 0.429073f, 0.470420f, + 0.066857f, 0.108497f, 0.146533f, 0.186402f, 0.214087f, 0.239551f, 0.273028f, 0.339210f, 0.442001f, 0.475864f, + 0.058742f, 0.098634f, 0.140424f, 0.200627f, 0.237759f, 0.274315f, 0.336864f, 0.374803f, 0.415969f, 0.461915f, + 0.055406f, 0.096635f, 0.130990f, 0.174857f, 0.231572f, 0.277597f, 0.327848f, 0.376613f, 0.419923f, 0.465467f, + 0.063142f, 0.117506f, 0.165530f, 0.207973f, 0.252515f, 0.292023f, 0.332960f, 0.374855f, 0.422203f, 0.463402f, + 0.073810f, 0.115150f, 0.161374f, 0.201145f, 0.234138f, 0.271883f, 0.300056f, 0.334944f, 0.401703f, 0.457714f, + 0.037073f, 0.082702f, 0.150719f, 0.196430f, 0.266875f, 0.302676f, 0.341803f, 0.383090f, 0.434380f, 0.469480f, + 0.056987f, 0.107639f, 0.156686f, 0.198247f, 0.233643f, 0.272298f, 0.323545f, 0.383539f, 0.424062f, 0.466175f, + 0.068935f, 0.128609f, 0.175519f, 0.221849f, 0.262138f, 0.308833f, 0.354349f, 0.391305f, 0.431214f, 0.465646f, + 0.058327f, 0.099513f, 0.135693f, 0.173498f, 0.210477f, 0.259223f, 0.309074f, 0.365292f, 0.418318f, 0.460997f, + 0.053768f, 0.108301f, 0.148739f, 0.187783f, 0.248594f, 0.294002f, 0.326224f, 0.362744f, 0.418485f, 0.459503f, + 0.072347f, 0.113391f, 0.145826f, 0.186488f, 0.216571f, 0.246055f, 0.321765f, 0.384969f, 0.449111f, 0.479851f, + 0.068789f, 0.114708f, 0.171724f, 0.209662f, 0.240956f, 0.286235f, 0.354813f, 0.393328f, 0.420976f, 0.466079f, + 0.076792f, 0.122064f, 0.164111f, 0.196669f, 0.228773f, 0.263496f, 0.298068f, 0.369577f, 0.412072f, 0.446788f, + 0.072788f, 0.097673f, 0.130704f, 0.203771f, 0.250741f, 0.295679f, 0.355656f, 0.375931f, 0.431577f, 0.468953f, + 0.084680f, 0.123747f, 0.166460f, 0.199970f, 0.238683f, 0.271627f, 0.332322f, 0.389857f, 0.417976f, 0.454237f, + 0.047850f, 0.120236f, 0.163003f, 0.208247f, 0.285501f, 0.314491f, 0.348042f, 0.393049f, 0.436136f, 0.467946f, + 0.074354f, 0.116190f, 0.158181f, 0.188861f, 0.216650f, 0.247676f, 0.294654f, 0.344099f, 0.416305f, 0.461946f, + 0.053571f, 0.101937f, 0.148655f, 0.194776f, 0.237718f, 0.284302f, 0.333285f, 0.379409f, 0.424284f, 0.464382f, + 0.058960f, 0.099074f, 0.140467f, 0.196967f, 0.231626f, 0.264843f, 0.323752f, 0.385782f, 0.425341f, 0.465240f, + 0.043253f, 0.133255f, 0.191933f, 0.224667f, 0.269958f, 0.309788f, 0.340578f, 0.370291f, 0.414823f, 0.464356f, + 0.055527f, 0.103077f, 0.145933f, 0.195951f, 0.237681f, 0.276359f, 0.307310f, 0.343951f, 0.415470f, 0.466831f, + 0.056607f, 0.103731f, 0.150533f, 0.199143f, 0.247090f, 0.294661f, 0.337006f, 0.380695f, 0.436417f, 0.469044f, + 0.058017f, 0.111478f, 0.184738f, 0.222470f, 0.248826f, 0.274226f, 0.313164f, 0.396522f, 0.439606f, 0.469562f, + 0.059766f, 0.131086f, 0.177741f, 0.250119f, 0.292365f, 0.314884f, 0.343841f, 0.383029f, 0.418571f, 0.469165f, + 0.063549f, 0.123913f, 0.167854f, 0.196007f, 0.222730f, 0.248052f, 0.296431f, 0.381363f, 0.440747f, 0.474918f, + 0.057303f, 0.104523f, 0.145906f, 0.215521f, 0.258023f, 0.293742f, 0.329884f, 0.375696f, 0.425649f, 0.463893f, + 0.062113f, 0.113749f, 0.146593f, 0.190918f, 0.221197f, 0.281815f, 0.352860f, 0.400393f, 0.454168f, 0.477972f, + 0.065394f, 0.121516f, 0.199177f, 0.235275f, 0.266790f, 0.299190f, 0.343026f, 0.386286f, 0.439359f, 0.470243f, + 0.079123f, 0.135214f, 0.178870f, 0.220386f, 0.255756f, 0.285377f, 0.317392f, 0.361228f, 0.405450f, 0.467724f, + 0.056167f, 0.115899f, 0.166770f, 0.207524f, 0.241655f, 0.297597f, 0.366322f, 0.404801f, 0.440200f, 0.470576f, + 0.065840f, 0.126504f, 0.164612f, 0.196957f, 0.220935f, 0.267816f, 0.338526f, 0.391567f, 0.453372f, 0.479359f, + 0.044781f, 0.115425f, 0.177337f, 0.247881f, 0.284229f, 0.319088f, 0.355269f, 0.403159f, 0.444401f, 0.467850f +}; + +const float wac_swb[LPC_SHB_ORDER + 1] = +{ + 1.00030000f, 0.99972246f, 0.99889029f, 0.99750487f, + 0.99556853f, 0.99308446f, 0.99005679f, 0.98649053f, + 0.98239158f, 0.97776669f, 0.97262346f +}; + +const float lbr_wb_bwe_lsfvq_cbook_2bit[4*4] = {0.11829331f, 0.18065347f, 0.27315149f, 0.36268139f, + 0.20006990f, 0.24350365f, 0.33066865f, 0.40078221f, + 0.13430431f, 0.20694768f, 0.32580520f, 0.41176145f, + 0.25797083f, 0.29579351f, 0.36694117f, 0.42482337f + }; + +const float wac[LPC_SHB_ORDER + 1] = { 1.000030000f, 0.999876638f, + 0.999506642f, 0.998890286f, + 0.998028026f, 0.996920500f, + 0.995568526f, 0.993973102f, + 0.992135406f, 0.990056789f, + 0.987738783f + }; + +/* 5-bit TD SWB BWE temporal shaping codebook */ +const float SHBCB_SubGain5bit[128] = +{ + -0.1457681f, -0.4764620f, -0.4013963f, -0.3677013f, + -0.4313035f, -0.3313996f, -0.3050383f, -0.2133066f, + -1.0206577f, -0.9364462f, -0.0586007f, -0.4846374f, + -1.6047017f, -0.3614168f, -0.3000874f, -0.2672006f, + -0.0931186f, -0.4041055f, -0.5172903f, -0.5874190f, + -0.4911704f, -0.2494092f, -0.5456603f, -0.1857298f, + -0.2215641f, -0.3130259f, -0.3029806f, -0.4504822f, + -0.0164831f, -1.1390385f, -1.4790464f, -1.5514144f, + -0.5643114f, -0.4608741f, -0.3408080f, -0.1252954f, + -0.1276388f, -0.2821012f, -0.5614353f, -0.8928169f, + -0.2834879f, -0.1340739f, -0.6259241f, -0.5918277f, + -0.1487753f, -0.5728573f, -0.7163700f, -0.2789117f, + -0.8768165f, -0.6980218f, -0.5036601f, -0.0499640f, + -0.9883066f, -0.9968036f, -1.0402167f, -0.0137106f, + -0.3300310f, -0.5241924f, -0.4624851f, -0.1401303f, + -1.6058040f, -1.3385040f, -0.4591369f, -0.1534372f, + -0.1989556f, -0.2591312f, -0.4850197f, -0.4037134f, + -0.1111035f, -0.3369072f, -0.9321365f, -1.2062822f, + -0.2261946f, -0.2280687f, -0.3570638f, -0.6421078f, + -0.6153073f, -0.2471987f, -0.2481002f, -0.3052209f, + -0.2385272f, -0.6048125f, -0.1758713f, -0.5861754f, + -0.0317327f, -0.6809157f, -0.7702834f, -0.7792925f, + -0.2770282f, -0.3142404f, -0.3788958f, -0.2723185f, + -0.2970077f, -0.4682712f, -0.2584636f, -0.2690060f, + -0.5592654f, -0.8185204f, -0.1815633f, -0.2389702f, + -0.7487352f, -0.4618911f, -0.2345186f, -0.1725288f, + -0.4382800f, -0.2999320f, -0.1591911f, -0.5732270f, + -0.3830038f, -0.1750423f, -0.3638722f, -0.3974119f, + -0.7911282f, -0.0631017f, -0.5198654f, -0.6708761f, + -0.5033713f, -0.4643340f, -0.1527029f, -0.3067638f, + -0.3547296f, -0.3050630f, -0.2355810f, -0.3526833f, + -1.0319320f, -0.3646283f, -0.2706210f, -0.1999401f +}; + +/* 5-bit TD WB BWE temporal shaping codebook */ +const float HBCB_SubGain5bit[128] = +{ + -59.470337f, -69.488670f, -38.659931f, -19.719824f, + -1.7830310f, -4.812642f, -8.744000f, -10.867781f, + -13.246320f, -15.094897f, -15.727152f, -15.801854f, + -7.879738f, -5.120556f, -3.429671f, -7.706632f, + -50.144310f, -60.062901f, -32.317268f, -16.175051f, + -10.900867f, -11.864854f, -9.386131f, -1.335022f, + -13.235695f, -14.241489f, -13.557719f, -11.050961f, + -0.612834f, -7.908495f, -9.054081f, -8.763001f, + -57.235970f, -64.192162f, -30.073193f, -4.640105f, + -10.025522f, -6.857354f, -1.353238f, -6.571805f, + -8.077633f, -9.067668f, -9.157619f, -9.171074f, + -6.871120f, -4.052971f, -7.285939f, -7.970854f, + -44.516933f, -53.591618f, -30.267939f, -10.678650f, + -3.160364f, -7.559843f, -7.367127f, -3.052069f, + -8.343053f, -7.577167f, -3.678010f, -6.135194f, + -7.522539f, -9.290725f, -10.048427f, -8.378534f, + -68.482224f, -75.261124f, -30.160120f, -10.437404f, + -2.787138f, -2.637044f, -5.920231f, -8.091020f, + -7.519012f, -9.081453f, -9.857375f, -10.380337f, + -6.422596f, -6.540410f, -7.954427f, -7.877131f, + -49.924343f, -57.036163f, -26.225056f, -5.391133f, + -8.174749f, -6.656519f, -4.389360f, -2.953642f, + -10.844235f, -10.494500f, -8.072153f, -4.695106f, + -4.305107f, -2.655748f, -7.638941f, -9.281904f, + -56.389565f, -61.898930f, -19.212666f, -8.088096f, + -6.302619f, -2.904698f, -7.059662f, -5.392998f, + -2.423694f, -5.054863f, -7.913060f, -8.444733f, + -3.101384f, -6.855487f, -4.557333f, -6.881396f, + -45.418392f, -52.252014f, -22.952511f, -7.653957f, + -3.941019f, -7.339684f, -4.011926f, -7.481068f, + -6.772878f, -4.939885f, -7.817589f, -3.977276f, + -2.728315f, -6.770474f, -8.485444f, -4.669493f +}; + + +/* 6 bit Quantizer table for SHB overall gain */ +const float SHBCB_FrameGain64[64]= +{ + 0.044072020f, 0.074116257f, 0.104772820f, 0.137129910f, 0.172361440f, 0.209110170f, 0.248146360f, 0.290349910f, + 0.336033220f, 0.384576680f, 0.436074570f, 0.491054220f, 0.550217560f, 0.613450140f, 0.681455200f, 0.753997600f, + 0.831286250f, 0.914336560f, 1.003638100f, 1.100985500f, 1.205300400f, 1.317519300f, 1.437191800f, 1.566197500f, + 1.704663300f, 1.853099500f, 2.013720200f, 2.190476500f, 2.382512800f, 2.591447500f, 2.818724200f, 3.064693900f, + 3.331486000f, 3.621288500f, 3.936974000f, 4.279052900f, 4.652247100f, 5.063426700f, 5.516226500f, 6.014047700f, + 6.565030700f, 7.179005400f, 7.869640600f, 8.646445300f, 9.521977600f, 10.52553600f, 11.67516800f, 13.00652900f, + 14.56494800f, 16.38657700f, 18.56994600f, 21.17650800f, 24.29317200f, 27.95810000f, 32.33308400f, 37.72507700f, + 44.44091200f, 52.62181300f, 62.89529200f, 76.21739000f, 94.34608600f, 119.5521800f, 160.0594500f, 245.1366400f +}; + +/* 4 bit Quantizer table for SHB overall gain */ +const float SHBCB_FrameGain16[16]= +{ + 0.148650413f, + 0.477894376f, + 0.970739390f, + 1.882108080f, + 3.981442531f, + 7.946689290f, + 14.46817648f, + 24.39527659f, + 39.12384197f, + 60.03913602f, + 88.76762784f, + 130.1507349f, + 184.4881647f, + 271.3320980f, + 409.9269865f, + 735.8126500f +}; + +/* 18th order elliptic Bandpass filter at 14.15 to 20 kHz sampled at 48 kHz b0,b1,b2,a0,a1,a2 */ +const float full_band_bpf_1[6][5] = +{ + { 9.6362039055508E-02f, 9.7862105350605E-02f, 3.0245537519444E-02f, 9.7862105350605E-02f, 9.6362039055508E-02f}, + { 9.6362039055508E-02f, 1.4633143118038E-01f, 1.0233713813742E-01f, 1.4633143118038E-01f, 9.6362039055508E-02f}, + { 9.6362039055508E-02f, 1.6626923151583E-02f, -1.3709502682285E-01f, 1.6626923151583E-02f, 9.6362039055508E-02f}, + { 1.0000000000000E+00f, 2.3991100643722E+00f, 2.9774531499625E+00f, 2.0824517848412E+00f, 8.0090184246950E-01f}, + { 1.0000000000000E+00f, 1.8724727524876E+00f, 2.4558672940808E+00f, 1.6868952908597E+00f, 7.5556052044790E-01f}, + { 1.0000000000000E+00f, 2.5823882989829E+00f, 3.2419903202957E+00f, 2.1041782509434E+00f, 6.8348510539492E-01f} +}; + +/* 12th order elliptic Bandpass filter at 16.3 to 19.8 kHz sampled at 48 kHz b0,b1,b2,a0,a1,a2 */ +const float full_band_bpf_2[6][5] = +{ + { 6.0003889556380E-02f, 1.1128037231775E-01f, 1.1894140617207E-01f, 1.1128037231775E-01f, 6.0003889556380E-02f}, + { 6.0003889556380E-02f, 1.4172832594169E-01f, 1.6515046627146E-01f, 1.4172832594169E-01f, 6.0003889556380E-02f}, + { 6.0003889556380E-02f, 3.1639978682801E-02f, -3.7925280401819E-02f, 3.1639978682801E-02f, 6.0003889556380E-02f}, + { 1.0000000000000E+00f, 2.7969061159585E+00f, 3.7380107651703E+00f, 2.5896033662624E+00f, 8.7195105769838E-01f}, + { 1.0000000000000E+00f, 2.4858753840930E+00f, 3.3360972572945E+00f, 2.3002595115472E+00f, 8.4059566462167E-01f}, + { 1.0000000000000E+00f, 2.8681737877693E+00f, 3.8085295994769E+00f, 2.5421873471575E+00f, 7.9182537841461E-01f} +}; + +/* 12th order elliptic Bandpass filter at 15.4 to 20.0 kHz sampled at 48 kHz b0,b1,b2,a0,a1,a2 */ +const float full_band_bpf_3[6][5] = +{ + {7.4636437949154E-02f, 1.0834902081890E-01f, 8.7514468139390E-02f, 1.0834902081890E-01f, 7.4636437949154E-02f}, + {7.4636437949154E-02f, 1.4782752996297E-01f, 1.4824632166087E-01f, 1.4782752996297E-01f, 7.4636437949154E-02f}, + {7.4636437949154E-02f, 2.4020393588811E-02f, -8.1869063979759E-02f, 2.4020393588811E-02f, 7.4636437949154E-02f}, + {1.0000000000000E+00f, 2.6521893008573E+00f, 3.4460829518042E+00f, 2.3910633156124E+00f, 8.3876600358846E-01f}, + {1.0000000000000E+00f, 2.2507856816983E+00f, 2.9756720931932E+00f, 2.0502894449026E+00f, 8.0167514850932E-01f}, + {1.0000000000000E+00f, 2.7689100300130E+00f, 3.5940097427365E+00f, 2.3681560760262E+00f, 7.4233948915492E-01f} +}; + + +/* 4-bit/3-bit TD SWB BWE differential LSF scalar quantizer tables */ +const float lsf_q_cb_4b[16] = +{ + 0.01798018f, 0.02359377f, 0.02790103f, 0.03181538f, + 0.03579450f, 0.03974377f, 0.04364637f, 0.04754591f, + 0.05181858f, 0.05624165f, 0.06022101f, 0.06419064f, + 0.06889389f, 0.07539274f, 0.08504436f, 0.10014875f +}; + +const float lsf_q_cb_3b[8] = +{ + 0.02070812f, 0.02978384f, 0.03800822f, 0.04548685f, + 0.05307309f, 0.06137543f, 0.07216742f, 0.09013262f +}; + +const float * const lsf_q_cb[NUM_Q_LSF] = { lsf_q_cb_4b, lsf_q_cb_4b, lsf_q_cb_3b, lsf_q_cb_3b, lsf_q_cb_3b }; +const int16_t lsf_q_cb_size[NUM_Q_LSF] = {16, 16, 8, 8, 8}; +const int16_t lsf_q_num_bits[NUM_Q_LSF] = { 4, 4, 3, 3, 3 }; + +/* Tables for approximation of upper half of SWB LSFs */ +const float mirror_point_q_cb[MIRROR_POINT_Q_CB_SIZE] = { 0.01436178f, 0.02111641f, 0.02735687f, 0.03712105f }; + +const float lsf_grid[4][5] = +{ + { 0.15998503f, 0.31215086f, 0.47349756f, 0.66540429f, 0.84043882f }, + { 0.15614473f, 0.30697672f, 0.45619822f, 0.62493785f, 0.77798001f }, + { 0.14185823f, 0.26648724f, 0.39740108f, 0.55685745f, 0.74688616f }, + { 0.15416561f, 0.27238427f, 0.39376780f, 0.59287916f, 0.86613986f } +}; + +const float grid_smoothing[5] = { 0.2f, 0.35f, 0.5f, 0.75f, 0.8f }; + +const float allpass_poles_3_ov_2[9] = +{ + 0.072265625000000f, + 0.626983642578125f, + 0.934020996093750f, + 0.778808593750000f, + 0.219360351562500f, + 0.970703125000000f, + 0.872039794921875f, + 0.438964843750000f, + 0.990966796875000f +}; + +const float decimate_3_ov_2_lowpass_num[3] = +{ + 0.195271809895833f, + 0.390543619791667f, + 0.195271809895833f +}; + +const float decimate_3_ov_2_lowpass_den[3] = +{ + 1.0f, + 0.0f, + 0.171630859375f +}; + + +/*------------------------------------------------------------------------------* + * WB BWE tables + *------------------------------------------------------------------------------*/ + +const float F_2_5[64] = +{ + 1.1606680f, 0.6594560f, + -4.9874350f, -5.1700310f, + 10.230799f, -0.0125740f, + 10.605126f, 9.7910260f, + -0.3739880f, -0.6027910f, + 6.2753817f, 0.3307670f, + 9.4537100f, 8.8558020f, + 2.9320890f, 2.1643160f, + 3.1332030f, 2.9710870f, + 8.061906f, -0.5905290f, + 15.754963f, 5.0496380f, + 17.227070f, 18.329395f, + -2.4710190f, -3.1725330f, + -1.4136470f, -1.9457110f, + 15.147771f, 14.506490f, + 11.358370f, 11.714662f, + 9.4275510f, -0.1223030f, + 7.0970160f, -1.5805260f, + 12.498663f, 3.1614850f, + 10.349261f, 1.5185040f, + 5.3809850f, -1.7341900f, + 1.1224600f, -2.2397020f, + 12.362551f, 12.133788f, + 4.2788690f, -1.7729040f, + 6.1577130f, 5.4971410f, + 3.3243130f, -2.5710470f, + 19.097071f, 9.3576920f, + 7.6509204f, 7.4404626f, + -0.5055090f, -3.7073090f, + 18.584702f, 11.302494f, + 18.706564f, 18.308905f, + 23.010420f, 22.915377f +}; + +/*------------------------------------------------------------------------------* + * SWB BWE tables + *------------------------------------------------------------------------------*/ + +const int16_t swb_bwe_trans_subband[SWB_FENV_TRANS+1] = {240, 316, 392, 476, 560}; +const int16_t swb_bwe_trans_subband_width[SWB_FENV_TRANS] = {76, 76, 84, 84}; +const int16_t swb_bwe_subband[SWB_FENV+1] = {240, 256, 280, 296, 320, 336, 360, 376, 400, 424, 448, 472, 496, 528, 560}; +const float swb_inv_bwe_subband_width[SWB_FENV] = {0.0625f, 0.04167f, 0.0625f, 0.04167f, 0.0625f, 0.04167f, 0.0625f, 0.04167f, 0.04167f, 0.04167f, 0.04167f, 0.04167f, 0.03125f, 0.03125f}; +const int16_t swb_bwe_sm_subband[SWB_FENV] = {248, 268, 288, 308, 328, 348, 368, 388, 412, 436, 460, 484, 512, 544}; +const float smooth_factor[SWB_FENV-1] = {0.05f, 0.05f, 0.05f, 0.05f, 0.05f, 0.05f, 0.05f, 0.0417f, 0.0417f, 0.0417f, 0.0417f, 0.03125f, 0.03125f}; + +const int16_t fb_bwe_subband[DIM_FB+1] = {640, 680, 720, 800}; +const float fb_inv_bwe_subband_width[DIM_FB] = {0.0250f, 0.0250f, 0.0125f}; +const int16_t fb_bwe_sm_subband[DIM_FB] = {656, 696, 760}; +const float fb_smooth_factor[DIM_FB] = {0.03125f, 0.0250f, 0.015625f}; + +const float EnvCdbk11 [N_CB11 * DIM11] = +{ + -8.6703f, 0.1116f, 4.5639f, 8.2950f, 8.5148f, 4.7195f, 2.8963f, + 5.9419f, -1.2168f, -3.2933f, -5.9491f, -7.6969f, -8.6146f, -9.9275f, + 2.9127f, 7.1689f, 13.5188f, 17.1801f, 16.7640f, 16.3455f, 13.5231f, + 6.3569f, 9.6697f, 11.4712f, 11.0915f, 8.5859f, 6.7523f, 5.1755f, + -2.0082f, -2.8539f, -2.1756f, -0.7832f, 0.3904f, 1.8543f, 2.1094f, + 2.5602f, 3.7358f, 4.9688f, 4.2290f, 3.0234f, 2.6829f, 1.7943f, + 23.3857f, 21.3282f, 18.3157f, 16.3757f, 15.0204f, 14.1209f, 13.2521f, + 13.9500f, 18.9069f, 22.5926f, 24.4781f, 23.1748f, 20.1496f, 17.3157f, + 11.5571f, 8.1506f, 4.6099f, 3.8231f, 4.6089f, 5.3538f, 6.3890f, + 23.5508f, 24.0512f, 25.1225f, 26.4155f, 27.3361f, 27.9432f, 27.5377f, + -3.2117f, 0.8204f, 1.7588f, 0.6950f, -2.4959f, -5.2582f, -6.1620f, + 17.3871f, 16.3436f, 16.0602f, 16.9090f, 18.8782f, 20.4382f, 21.5310f, + 13.3594f, 15.6030f, 16.8792f, 16.4242f, 14.3912f, 12.3198f, 10.3571f, + -14.5849f, -9.0025f, -5.4218f, -1.2669f, 0.0853f, -3.3069f, -4.4553f, + 3.3195f, 1.9941f, 3.5010f, 6.9539f, 8.3192f, 10.5007f, 11.0406f, + 12.8683f, 11.0255f, 9.8051f, 9.8299f, 11.8326f, 13.3332f, 15.0119f, + -13.9167f, -13.3153f, -12.4970f, -11.3929f, -10.0932f, -8.9132f, -7.7378f, + -10.6935f, -12.4430f, -14.6553f, -16.8742f, -17.5158f, -17.6704f, -16.9116f, + -29.4308f, -29.2243f, -28.4494f, -28.0282f, -26.3950f, -24.5370f, -22.9103f, + -19.0168f, -18.8921f, -17.9786f, -17.2745f, -15.9625f, -14.5997f, -12.9787f, + -54.2808f, -53.8105f, -52.6712f, -52.1042f, -50.4929f, -48.4342f, -46.7588f, + 32.8477f, 32.8894f, 32.4420f, 31.6529f, 31.0708f, 30.3821f, 29.2828f, + 28.0454f, 26.7402f, 24.8801f, 23.3249f, 21.7053f, 20.7367f, 19.6371f, + 18.0979f, 15.6543f, 12.7634f, 9.4607f, 8.0952f, 6.9453f, 5.8996f, + 39.5644f, 40.7490f, 41.1718f, 40.9096f, 39.7482f, 38.4272f, 37.4463f, + 11.4554f, 10.5291f, 8.0459f, 5.0217f, 1.6581f, -0.9919f, -3.2238f, + -39.1890f, -38.4633f, -37.2799f, -36.7970f, -35.1580f, -33.2348f, -31.5786f, + 7.1490f, 3.6224f, -0.6163f, -1.5147f, -1.4079f, -1.4364f, -1.1211f, + -85.7873f, -85.5637f, -84.1707f, -83.8699f, -82.0486f, -80.1192f, -78.3737f, + -23.7889f, -23.9925f, -23.1930f, -22.8609f, -21.4574f, -19.9363f, -18.2458f, + -5.3981f, -6.4065f, -8.6148f, -9.9870f, -10.8787f, -11.7942f, -11.6944f, + -5.0767f, -6.1222f, -6.8130f, -6.4157f, -5.5037f, -4.2203f, -3.5243f, +}; + +const float EnvCdbk1st [N_CB1ST * DIM1ST] = +{ + -7.1064f, -4.4453f, 2.9351f, + -1.9308f, 0.6335f, -3.2258f, + -12.4978f, -0.4815f, 9.6818f, + -8.0902f, 0.9278f, -1.6759f, + -7.1051f, 6.9529f, 4.8166f, + 1.1089f, 4.6364f, -4.3871f, + -6.5985f, -2.8197f, -1.8909f, + -4.9078f, 0.2022f, -5.2175f, + -2.3609f, 14.6030f, -5.0669f, + 2.1685f, 1.6108f, 2.9025f, + -2.4455f, -6.5834f, 5.9636f, + 0.5645f, 6.0806f, -0.8753f, + -2.4904f, 5.3534f, 6.2069f, + -4.6416f, 0.1448f, -1.6019f, + -1.6724f, -12.9702f, 7.2641f, + 10.1438f, -0.3729f, -11.2325f, + -2.8994f, -2.2776f, -2.6711f, + 6.2755f, -6.5279f, -7.3185f, + -4.3406f, -3.6577f, -5.3655f, + 1.0746f, -9.0396f, 2.0233f, + 10.4764f, 9.2495f, -1.1811f, + 7.0665f, -2.1678f, -2.2621f, + 12.4715f, -4.9604f, -4.7190f, + 2.9306f, 0.3267f, 0.6027f, + -4.5326f, 1.6741f, 4.2905f, + 3.1882f, -2.3954f, -11.3147f, + 8.4338f, -7.3615f, 4.8623f, + -2.6210f, 1.6649f, 12.4120f, + 3.3880f, -0.5639f, -2.4950f, + 3.2948f, -7.3733f, 8.8713f, + 6.0225f, 1.0109f, -0.5767f, + -6.5622f, 4.0120f, 1.1130f, + 0.6314f, -2.9813f, 6.5088f, + -7.4838f, 4.5892f, -4.7926f, + -1.3492f, -3.5415f, -0.5914f, + 7.7312f, 4.1477f, 1.5695f, + -4.8092f, 9.5178f, 12.2277f, + -9.4609f, 1.4097f, 4.0613f, + -16.8501f, -16.0390f, -16.4874f, + 0.5711f, -4.6892f, -7.1391f, + 1.8938f, 3.4746f, -15.0275f, + 1.5014f, -9.6125f, -11.1128f, + 5.9617f, -2.3434f, 6.2473f, + -3.2715f, -2.2302f, 4.2871f, + 6.9371f, -13.2527f, 15.8528f, + -13.0084f, 9.4873f, 6.7652f, + 1.8265f, -8.3584f, -3.6477f, + 3.2532f, 8.9518f, -4.4112f, + -0.0785f, -4.0189f, 2.5487f, + -1.3509f, 0.6566f, 7.1658f, + -6.7577f, 3.2716f, 8.7273f, + 6.3343f, -6.6206f, -0.7569f, + -12.4925f, -3.0187f, 0.8888f, + 4.1806f, 6.8020f, 1.1128f, + 6.4660f, -0.8290f, -6.3590f, + 8.5089f, 2.3611f, 6.9696f, + 7.0355f, -12.5942f, -3.3116f, + -3.1974f, 1.3584f, 0.7314f, + 0.0624f, 1.1725f, 0.9528f, + 3.0031f, 0.7847f, 6.0715f, + 2.8083f, -1.5392f, 3.0486f, + 1.2144f, 11.1444f, 0.7234f, + 4.5417f, 1.9083f, -3.9930f, + -1.2897f, 1.7931f, 3.4268f, + 0.4267f, -2.1125f, -2.6993f, + -1.9870f, -1.0444f, 1.8659f, + -1.3273f, -1.6306f, -5.4788f, + -3.3603f, -2.6373f, -10.5580f, + 4.0034f, 3.2267f, 0.9765f, + -4.0725f, 3.9372f, -1.6940f, + -4.0711f, -2.4655f, 0.2350f, + -0.6742f, 1.2957f, -8.1420f, + 3.8434f, 3.5916f, -7.9753f, + -4.9118f, -8.9335f, 1.3240f, + 1.4296f, -5.1151f, -0.6183f, + 4.0664f, 4.0592f, 4.2287f, + 13.9299f, 3.5845f, 0.8860f, + 0.2439f, -0.5414f, 3.6573f, + 9.4697f, 2.8531f, -3.9907f, + -2.9106f, 7.6316f, 1.6666f, + -4.2611f, -5.3043f, -1.8686f, + -0.6757f, 8.2847f, -9.2447f, + -8.4955f, 9.9028f, -7.6020f, + -3.4387f, -7.6714f, -6.0496f, + -0.9730f, -4.6977f, -3.6204f, + -9.2868f, -1.7316f, -6.9325f, + -5.6205f, -2.2721f, 7.9555f, + -2.0678f, -14.3696f, -2.1494f, + 2.3769f, -1.1084f, -6.1183f, + 0.7835f, 0.2474f, -1.3438f, + 5.3736f, 0.8512f, 3.1856f, + 9.6507f, -1.3584f, 1.8708f, + -5.4226f, 3.8576f, -10.4452f, + 5.5806f, -13.8209f, 4.3938f, + 3.3739f, -5.2782f, 3.3015f, + 1.1772f, 3.8147f, 1.5955f, + -4.3838f, 13.1395f, 4.3243f, + -0.8337f, 2.8533f, -1.2842f, + 3.2788f, -2.6680f, -0.3603f, + 2.4648f, 4.5784f, 9.2339f, + 2.3348f, 2.6773f, -1.2865f, + -3.0488f, -5.1440f, 1.7493f, + -1.6552f, -0.5978f, -0.7764f, + 3.0011f, -1.2935f, 11.0366f, + 3.4439f, -4.0880f, -3.8069f, + -1.4637f, -7.1676f, -1.1671f, + 11.1758f, -13.1846f, -12.3361f, + 8.1990f, 8.4704f, -10.2721f, + 6.2564f, 7.5395f, 5.6662f, + 5.0554f, 4.9418f, -2.2877f, + -9.7668f, -10.0395f, -10.4193f, + -3.1503f, -5.9735f, 12.7823f, + -2.0408f, 4.1857f, 1.8667f, + 15.7600f, -9.7299f, 1.8762f, + -7.4519f, 9.4311f, -0.6946f, + -6.1047f, -0.5603f, 1.7096f, + 0.8003f, 3.3634f, 5.0259f, + -2.6989f, 3.7629f, -5.3679f, + -9.2139f, -7.9377f, -3.4621f, + 0.6323f, -1.7255f, 0.6234f, + 0.7594f, 9.7404f, 7.6543f, + -9.8933f, -10.0711f, 7.5139f, + 1.0426f, 6.6449f, 3.6587f, + 11.4042f, 11.5230f, 9.3039f, + -2.6163f, 8.2102f, -3.3574f, + -12.2920f, 5.4115f, -0.8387f, + 5.7900f, -2.3232f, 1.6209f, + 0.8904f, 1.1318f, -4.1407f, +}; + +const float EnvCdbk2nd [N_CB2ND * DIM2ND] = +{ + 4.3123f, -7.1616f, -4.3357f, -3.7263f, + 2.9572f, 3.3303f, -0.6874f, 1.1173f, + -3.4084f, -2.2922f, -0.0278f, 5.6960f, + -1.8039f, -2.1619f, -1.3655f, 0.4079f, + 7.5721f, 7.6436f, -5.2359f, -2.7457f, + 4.6943f, -3.0448f, 0.0822f, 7.7951f, + -11.1369f, -0.6607f, 4.0977f, 3.6717f, + -5.2941f, -2.8345f, -6.9855f, 4.2023f, + -2.9965f, -2.5020f, -2.5223f, -3.4361f, + 0.5260f, -3.2518f, -0.7710f, -3.4717f, + -3.2275f, 0.0098f, 1.0879f, -1.9621f, + -2.7904f, 2.1268f, -2.0540f, 1.4661f, + 1.1360f, -4.2031f, -3.1894f, -15.3458f, + -4.5909f, -1.8549f, 8.6689f, -2.5094f, + 0.7713f, -0.8552f, -4.1104f, -6.2533f, + 4.5892f, -0.6343f, -2.7162f, -1.3109f, + 4.3900f, 0.4919f, -9.0866f, -6.1448f, + 4.5483f, -5.1698f, -7.6465f, 4.1951f, + -8.1259f, -8.4044f, 0.4404f, 2.5339f, + -2.4877f, -3.3596f, 2.8155f, 1.0442f, + -2.3782f, 6.4752f, -3.9302f, -5.2807f, + 6.3692f, 8.6921f, 8.3109f, 7.1381f, + -4.3445f, -5.2789f, 7.2494f, 6.4679f, + -8.3291f, 3.9280f, 3.0088f, -5.0540f, + -1.8438f, 3.0318f, 6.4879f, 8.7826f, + -0.4718f, -2.2438f, -5.7862f, -1.2336f, + 10.0184f, -4.2246f, 0.7347f, 1.1461f, + 1.5549f, 10.1485f, 2.7490f, -4.4112f, + 3.9959f, 0.4078f, 2.1473f, 1.9496f, + -1.6255f, 0.4947f, 0.9865f, -7.3990f, + 1.7798f, -10.0697f, 0.7408f, 3.9759f, + -5.8117f, 1.1179f, -4.6947f, -3.5752f, + -4.5471f, 7.3211f, 6.4493f, 1.1780f, + -5.1254f, -6.0444f, -6.3492f, -5.9237f, + 0.6636f, -0.9113f, 3.1921f, 4.7217f, + -4.2586f, 1.3321f, 2.7703f, 2.8306f, + 3.3356f, 3.2010f, -1.0860f, -4.2324f, + -0.0572f, 0.4406f, 1.1161f, 1.1049f, + 4.5545f, -3.5389f, 7.3418f, 1.1747f, + 1.3350f, -0.0281f, -2.2930f, 3.0295f, + -3.0651f, -4.9167f, -4.5557f, 12.4767f, + -6.3679f, -4.1824f, 1.1715f, -4.2173f, + -0.0461f, 0.7412f, -2.1034f, -1.9263f, + 1.3714f, 3.5413f, 7.5363f, -5.9934f, + 1.8748f, 0.1406f, 2.3146f, -2.0562f, + 3.1775f, 4.7516f, 3.8512f, 0.3460f, + 0.3842f, 3.9440f, -8.8737f, 1.0470f, + 10.8029f, -0.3986f, -5.1051f, -3.4119f, + -6.4836f, -1.8259f, -1.4253f, 0.1826f, + 5.8438f, 4.9884f, -0.8889f, -10.9021f, + 6.1138f, -2.6130f, 2.0330f, -6.2434f, + -1.4101f, 4.2119f, 1.7856f, -1.4207f, + 2.1209f, -3.7111f, 0.1093f, 0.9671f, + 7.4373f, 3.1851f, -4.0372f, 4.3934f, + -0.0516f, -7.6212f, 4.2391f, -3.9245f, + -8.6836f, 5.9347f, -2.4382f, 3.3478f, + 4.3786f, 3.2445f, 3.4065f, 5.0603f, + 0.7547f, 8.9234f, -1.6469f, 2.3801f, + -0.6099f, 3.2294f, -2.8632f, 8.0661f, + -13.2408f, -13.2180f, -12.4864f, -12.5763f, + 0.1226f, 3.5019f, 2.1036f, 3.8209f, + -0.0830f, 1.5923f, 5.8683f, 1.5813f, + -2.2786f, -6.4905f, -2.5958f, -0.6420f, + 8.5661f, 3.8130f, 2.3928f, -1.7038f, +}; + +const float EnvCdbk3rd [N_CB3RD * DIM3RD] = +{ + 4.0282f, -9.5862f, 2.9221f, + 10.8219f, 9.5405f, 6.8798f, + -9.1733f, 15.9318f, -3.7461f, + 7.3196f, -2.8702f, -8.7570f, + -0.2304f, 0.1350f, 0.7863f, + -5.9316f, 0.6347f, 7.0661f, + -7.7220f, -4.1510f, -0.4015f, + 9.7056f, 4.7338f, -3.3708f, + 3.4447f, 0.7509f, 0.1539f, + 5.2980f, 3.3256f, 3.8228f, + -5.3770f, -11.5675f, -5.7681f, + 1.9411f, -3.1576f, 2.3162f, + -1.5410f, -2.9216f, -6.1087f, + -3.7107f, -0.7720f, -1.7048f, + -1.9664f, -5.5485f, -0.9158f, + 1.2430f, 3.8485f, -7.4409f, + -0.4624f, 6.9662f, 6.1050f, + 0.8584f, 3.6275f, 1.5624f, + 3.3487f, 0.1438f, -3.8870f, + -3.1533f, 7.5889f, -1.5958f, + -2.9036f, -2.0471f, 2.1555f, + 3.6715f, 6.4176f, -1.1670f, + 3.1461f, -5.5497f, -3.0001f, + -9.1009f, 2.7549f, 0.6103f, + 0.2373f, 0.7927f, 4.7365f, + -0.5389f, 2.0197f, -2.5074f, + 0.2485f, -1.9583f, -1.6996f, + 8.5694f, -2.4399f, 0.6128f, + -6.2513f, 1.3320f, -6.2922f, + 4.4430f, -1.3696f, 9.1921f, + -3.1673f, -6.6975f, 5.9466f, + -3.3971f, 2.3931f, 1.7433f, +}; + +const float EnvCdbk4th [N_CB4TH * DIM4TH] = +{ + 3.9996f, -0.8196f, -0.8101f, 2.3072f, + -1.0920f, -9.7095f, -3.7135f, 3.7429f, + 6.0104f, 4.4383f, 1.6047f, 5.1343f, + 6.8807f, -0.7893f, 5.2292f, 0.7940f, + -9.5225f, -8.2399f, -7.9213f, -8.3027f, + 7.2240f, -5.4987f, -2.6163f, 0.5630f, + -1.8336f, 10.4454f, -6.2079f, -14.0773f, + 6.4124f, -2.7411f, 0.5417f, 9.6735f, + -1.8885f, 1.4517f, -3.3639f, 2.1092f, + -0.4634f, 3.2291f, 3.3717f, 3.7183f, + 0.0901f, 0.3886f, -0.0922f, -1.1829f, + 1.9060f, -8.7228f, -5.5919f, -5.4642f, + 0.2125f, -0.1681f, 0.3767f, -5.9653f, + 4.5684f, 0.5205f, -0.4649f, -2.8002f, + 1.0087f, -4.7453f, -1.7135f, 0.6236f, + -4.0975f, 3.0989f, 3.7884f, -3.0078f, + -7.4785f, -4.8629f, 5.0050f, 1.6473f, + -4.6660f, 3.9258f, 0.6885f, -9.2509f, + -6.3693f, 5.1420f, -4.3946f, -1.4094f, + 4.3917f, 4.4225f, 0.2383f, -8.5391f, + 3.0850f, -8.0277f, 4.5875f, 3.6649f, + 11.6159f, 15.1327f, 9.0448f, 7.9694f, + -1.1705f, 9.7014f, 0.2305f, -3.3610f, + 2.1195f, 5.1060f, -7.2972f, -2.8333f, + 1.5208f, -0.4510f, -3.6906f, -0.5684f, + -7.1756f, -2.2582f, -2.4200f, 3.8082f, + 1.5182f, 6.9508f, 6.7654f, 1.1582f, + 1.4735f, 3.5020f, 6.0723f, 8.8626f, + -3.3340f, 0.1007f, 2.3028f, 5.5202f, + -3.0476f, -3.8494f, 5.4259f, 10.3093f, + 1.2195f, -1.0819f, -3.6514f, -12.8475f, + 6.7971f, 7.2347f, 2.5053f, -2.0263f, + 2.8809f, 3.5069f, -1.8220f, 0.4511f, + 4.6384f, -1.1164f, -5.9159f, -5.1137f, + 0.2896f, -3.1271f, -2.2772f, -3.8561f, + 1.9906f, -2.6068f, 1.6778f, -0.7475f, + 1.6325f, -1.1855f, 3.1499f, 4.9140f, + -4.2298f, -4.1599f, 1.4122f, -8.2593f, + -4.1992f, 0.3220f, 1.0148f, 1.1155f, + -10.0725f, 0.0539f, 0.2930f, -3.3347f, + -2.5810f, -2.4752f, 1.8829f, -2.2701f, + -1.3208f, -1.1970f, 12.7140f, 1.5150f, + -0.8982f, -0.0921f, 4.5338f, 0.8027f, + 1.0017f, 2.1335f, -0.5513f, 5.3882f, + -0.2457f, -3.0283f, -1.8919f, 5.7746f, + -2.0213f, -2.1347f, -1.7599f, 0.3340f, + 5.7553f, -4.6913f, 1.6804f, -7.3915f, + 1.5389f, 3.2468f, 2.4237f, -2.5921f, + 1.3040f, 0.2492f, 6.9277f, -6.1561f, + -6.9638f, 4.9625f, 3.9857f, 3.6889f, + 3.9950f, 0.3810f, -7.4544f, 5.1955f, + -2.1874f, -4.0774f, 1.4863f, 2.7600f, + -1.6673f, -2.7653f, -7.0891f, -0.3532f, + -0.2106f, 8.9759f, -2.0994f, 4.4973f, + -1.9481f, 2.7454f, -3.9753f, 12.9773f, + 0.3607f, 2.7997f, -2.3719f, -4.0297f, + -5.1272f, -5.4413f, -2.2644f, -1.8938f, + 0.1319f, -8.5628f, 3.0773f, -3.3584f, + 10.3160f, 2.4523f, -3.0328f, -1.0118f, + -2.7438f, -0.6207f, -5.7929f, -6.3978f, + -0.1295f, -0.2443f, 0.3800f, 2.1601f, + 2.7023f, 2.0427f, 2.1407f, 1.3633f, + -3.5645f, 0.2107f, -1.7811f, -2.7432f, + -1.3301f, 3.6876f, 0.6120f, 0.3900f, +}; + +const float EnvCdbkFB [N_CB_FB * DIM_FB] = +{ + -16.6120f, -9.7056f, -7.3815f, + 12.7223f, -5.3619f, -4.2098f, + 9.6082f, 17.5423f, 19.7838f, + 22.0461f, 24.1701f, 20.8503f, + -96.6904f, -89.9023f, -88.6123f, + 20.9213f, 27.6011f, 27.4229f, + 3.8206f, 7.0540f, 5.3791f, + 15.0749f, 22.8806f, 23.6351f, + 26.7480f, 32.6483f, 31.6408f, + -19.5344f, -13.3342f, -11.0528f, + -27.4315f, -20.0228f, -17.3748f, + -6.7548f, -7.7102f, -9.4666f, + -3.3129f, 6.9621f, 14.9937f, + 15.4388f, 19.6911f, 17.7925f, + 5.2569f, 13.0270f, 15.1931f, + 40.3814f, 47.0644f, 46.7397f, + -10.6760f, -3.9121f, -1.8455f, + -1.9827f, 5.3065f, 7.7240f, + -148.2341f, -141.3109f, -139.3314f, + -179.7394f, -172.2927f, -172.7284f, + 17.6754f, 17.9788f, -4.8806f, + -0.9671f, 3.3663f, 2.9027f, + 11.3567f, 15.3245f, 13.9899f, + 1.5588f, 8.5468f, 10.5230f, + -7.7918f, -0.8556f, 1.6643f, + -5.4487f, 2.0822f, 4.7052f, + -23.9540f, -16.9712f, -14.6548f, + -34.0472f, -27.2912f, -24.7197f, + -2.8087f, 0.4624f, -3.6887f, + -14.1611f, -7.1801f, -4.6916f, + 32.8420f, 38.8016f, 38.3823f, + 7.4425f, 11.3804f, 9.7292f +}; + +const float Mean_env_fb[DIM_FB] = {13.75f, 6.29f, 3.70f}; + +const float w_NOR[SWB_FENV] = {1.f,0.97826087f,0.957446809f,0.9375f,0.918367347f,0.9f,0.882352941f,0.865384615f,0.849056604f,0.833333333f,0.818181818f,0.803571429f,0.789473684f,0.775862069f}; +const float Mean_env[SWB_FENV] = {28.62f, 28.96f, 28.05f, 27.97f, 26.91f, 26.82f, 26.35f, 25.98f, 24.94f, 24.03f, 22.94f, 22.14f, 21.23f, 20.40f}; + +const float Env_TR_Cdbk1 [N_CB_TR1 * DIM_TR1] = +{ + 0.8936f, -9.1696f, + 32.0275f, 30.1795f, + -1.2201f, 6.6391f, + 38.5962f, 23.2366f, + 34.9278f, 32.6481f, + 15.0969f, 12.8381f, + 9.3963f, 3.1078f, + 14.3113f, 5.5971f, + 11.9502f, 8.6515f, + 2.4150f, 3.4154f, + -21.4020f, -18.1087f, + 8.7368f, 9.8116f, + 16.6597f, 9.4849f, + 25.7150f, 8.0681f, + 17.7652f, 25.6994f, + 44.2378f, 28.6702f, + 41.3199f, 36.1883f, + 33.1667f, 25.2245f, + -5.3921f, -9.7030f, + 13.1902f, 19.8007f, + 28.8781f, 20.0006f, + 18.7409f, 17.3426f, + 21.5070f, 29.7424f, + -13.1680f, -15.5559f, + 10.9594f, 11.5574f, + 8.7570f, 13.8680f, + 5.2123f, 11.9711f, + 8.0290f, -5.2743f, + 3.1843f, 21.5110f, + 19.2978f, 5.6924f, + -7.6163f, -4.0852f, + 2.5510f, -4.4247f, + 3.4072f, -14.1479f, + -6.8577f, 0.9589f, + 22.6250f, 21.6469f, + 15.9534f, 30.0623f, + 17.8474f, 20.3281f, + -3.1654f, -6.0729f, + 39.5602f, 40.5625f, + 44.3017f, 45.7556f, + 24.8628f, 19.5166f, + 33.7547f, 41.1213f, + 23.1020f, 13.1469f, + 17.6623f, 12.7562f, + 20.3773f, 11.0551f, + 31.6668f, 35.0770f, + 15.4383f, 22.8811f, + 22.8419f, 35.1167f, + 25.0950f, 23.1698f, + 20.2523f, 14.9332f, + 24.8694f, 27.0211f, + 13.8576f, 10.4789f, + 6.3835f, 8.1955f, + 10.6597f, -0.3484f, + 27.2026f, 29.9373f, + 12.4182f, 13.9096f, + 24.9543f, 16.3771f, + 15.7197f, 18.8608f, + -1.4782f, 1.6952f, + 36.4783f, 37.1348f, + 29.6594f, 13.6072f, + -26.6995f, -24.6742f, + 20.3405f, 19.6463f, + 44.2412f, 40.9698f, + 28.9498f, 23.7751f, + 39.3428f, 32.2458f, + -23.8252f, -22.0790f, + 27.6318f, 33.9910f, + -47.7664f, -44.4696f, + -44.8104f, -41.2774f, + -50.8776f, -47.8616f, + -50.3099f, -44.0979f, + -54.5008f, -51.0234f, + -63.3373f, -60.1146f, + -45.5444f, -42.1435f, + -48.2447f, -44.8312f, + -49.9558f, -46.6690f, + -59.1385f, -55.6583f, + -44.2409f, -43.8251f, + -46.6791f, -43.3332f, + -46.0956f, -42.6861f, + -92.7279f, -89.3799f, + 49.9817f, 46.4450f, + -14.8152f, -11.2475f, + -106.9255f, -103.4843f, + -46.5934f, -45.0424f, + -47.3033f, -43.9775f, + -80.0456f, -76.6952f, + -56.1359f, -53.1578f, + -49.1835f, -45.8131f, + -54.9042f, -45.8573f, + 36.9949f, 28.4050f, + -43.6866f, -40.3702f, + -52.0047f, -45.5982f, + -47.6930f, -41.4457f, + -52.5989f, -49.8475f, + 30.0399f, 27.7911f, + 10.0141f, 17.5614f, + 21.8223f, 17.7785f, + -3.1767f, -2.1954f, + -17.5132f, -21.5664f, + 6.0779f, 0.3815f, + 0.0063f, 13.5452f, + 5.5074f, 5.2318f, + 15.8166f, 0.6300f, + -17.7247f, -15.7262f, + -38.5381f, -35.6042f, + -6.3132f, -18.4667f, + 9.5978f, 6.4559f, + 2.4632f, 8.4172f, + -70.2432f, -66.7283f, + 10.2658f, 23.7825f, + -42.1539f, -38.8022f, + -48.5397f, -45.1815f, + 16.8840f, 15.6262f, + -6.1500f, 8.4442f, + -31.1246f, -29.6824f, + 5.9496f, 16.3765f, + 21.9557f, 25.5364f, + -9.8102f, -7.7609f, + 48.7145f, 36.0093f, + 34.1627f, 19.4172f, + 14.2249f, 16.2026f, + 19.8782f, 23.2358f, + 1.3653f, -0.3587f, + 27.4538f, 26.1047f, + -9.4912f, -12.5633f, + -15.5232f, -3.4597f +}; + +const float Env_TR_Cdbk2 [N_CB_TR2 * DIM_TR2] = +{ + 10.3071f, 1.4647f, + -1.8782f, 6.6168f, + -9.3764f, -12.9146f, + 0.3372f, -15.6956f, + -5.0830f, 0.1825f, + 2.8660f, 1.1668f, + 3.7385f, -4.0567f, + 8.6094f, 5.8040f, + 1.4099f, -4.4378f, + 10.2655f, -3.2743f, + -7.8499f, 5.0612f, + 1.4560f, 0.4976f, + -2.2400f, 10.1737f, + 2.6910f, -6.0696f, + 6.5484f, -1.4502f, + 5.0708f, 1.0902f, + -3.5214f, 4.2403f, + 6.8248f, -10.6363f, + 0.8362f, -2.5676f, + -2.8563f, -3.5507f, + 6.0370f, -6.4758f, + -1.4405f, -8.6255f, + -4.9844f, 6.8277f, + 4.4568f, -2.0374f, + 0.7265f, -7.3953f, + -4.9226f, -7.8758f, + -1.8669f, -1.9698f, + 5.0262f, 7.3509f, + -0.3770f, -5.4681f, + -5.3582f, -4.5491f, + 3.1235f, -0.5936f, + 1.6121f, -0.9381f, + -0.8137f, -3.3498f, + -0.3523f, -1.5590f, + 1.9211f, 9.8411f, + 3.5654f, 5.3423f, + -1.3437f, 1.1031f, + 1.1914f, 2.0560f, + -0.9800f, 3.3605f, + -4.1634f, 2.2153f, + -10.9385f, -2.6849f, + 0.0040f, 2.6311f, + 0.6873f, 3.4294f, + -2.7967f, -0.5984f, + 2.7559f, 3.2450f, + -4.2294f, -1.6565f, + 1.6359f, 4.6566f, + -0.5137f, 2.2080f, + 2.7641f, -9.3968f, + 2.3449f, -2.5829f, + 6.6876f, 11.5962f, + -7.7096f, 1.4816f, + -2.6264f, 0.8111f, + 0.1002f, 1.1574f, + -7.1116f, -1.9581f, + -2.0027f, 2.4814f, + 1.0402f, 6.7866f, + -0.8642f, 4.8143f, + -13.6639f, 6.3768f, + -1.3155f, -0.2595f, + -2.1558f, -5.5755f, + 5.1910f, 3.3215f, + -2.8061f, -11.5155f, + -0.0134f, 0.0015f +}; + +const float Mean_env_tr[5] = { 27.23f, 23.81f, 23.87f, 19.51f }; + +/*------------------------------------------------------------------------------* + * LR MDCT SWB BWE coding tables + *------------------------------------------------------------------------------*/ + +const float gain_table_SWB_BWE[NB_SWB_SUBBANDS] = {-0.4f, 0.1f, 0.6f, 1.1f}; + +const int16_t bits_lagIndices_modeNormal[NB_SWB_SUBBANDS] = {2, 2, 1, 1}; +const int16_t subband_offsets_12KBPS[NB_SWB_SUBBANDS] = {SWB_SB_OFF0_12KBPS, SWB_SB_OFF1_12KBPS, SWB_SB_OFF2_12KBPS, SWB_SB_OFF3_12KBPS}; +const int16_t subband_offsets_16KBPS[NB_SWB_SUBBANDS] = {SWB_SB_OFF0_16KBPS, SWB_SB_OFF1_16KBPS, SWB_SB_OFF2_16KBPS, SWB_SB_OFF3_16KBPS}; + +/* Search offset for the subbands that use a partial search */ +const int16_t subband_search_offsets[NB_SWB_SUBBANDS] = +{ + 0, 0, 64, 64 +}; +/* SPT : shorten subband length table */ +const Word16 bw_SPT_tbl[2][SPT_SHORTEN_SBNUM]= +{ + {15, 31, 31, 31}, /* 13.2kbps: original band_width 53, 66, 82, 102 */ + {15, 15, 31, 31} /* 16.4kbps: original band_width 51 64, 80, 90 */ +}; + + +/* Harmonic Mode */ +const int16_t bits_lagIndices_mode0_Har[NB_SWB_SUBBANDS_HAR_SEARCH_SB] = {1,1}; + +/* 13.2 kbps */ +const int16_t subband_offsets_sub5_13p2kbps_Har[NB_SWB_SUBBANDS_HAR] = +{ + SWB_SB_OFF0_SUB5_12KBPS_HAR, SWB_SB_OFF1_SUB5_12KBPS_HAR, SWB_SB_OFF2_SUB5_12KBPS_HAR, SWB_SB_OFF3_SUB5_12KBPS_HAR +}; + +/* Search offset for the subbands that use a partial search */ +const int16_t subband_search_offsets_13p2kbps_Har[NB_SWB_SUBBANDS_HAR_SEARCH_SB] = +{ + 120, 210 +}; + +/* 16.4 kbps */ +const int16_t subband_offsets_sub5_16p4kbps_Har[NB_SWB_SUBBANDS_HAR] = +{ + SWB_SB_OFF0_SUB5_16KBPS_HAR, SWB_SB_OFF1_SUB5_16KBPS_HAR, SWB_SB_OFF2_SUB5_16KBPS_HAR, SWB_SB_OFF3_SUB5_16KBPS_HAR +}; + +/* Search offset for the subbands that use a partial search */ +const int16_t subband_search_offsets_16p4kbps_Har[NB_SWB_SUBBANDS_HAR_SEARCH_SB] = +{ + 120, 210 +}; + + +/*------------------------------------------------------------------------------* + * HQ core tables + *------------------------------------------------------------------------------*/ + +const float wscw16q15[] = +{ + -1.0f, -0.999939f, -0.999878f, -0.999725f, -0.999573f, -0.999359f, -0.999084f, -0.99881f, + -0.998444f, -0.998077f, -0.99765f, -0.997162f, -0.996643f, -0.996094f, -0.995514f, -0.994873f, + -0.994171f, -0.993439f, -0.992676f, -0.991852f, -0.990997f, -0.990112f, -0.989166f, -0.98819f, + -0.987183f, -0.986115f, -0.984985f, -0.983856f, -0.982666f, -0.981415f, -0.980133f, -0.978821f, + -0.977448f, -0.976074f, -0.974609f, -0.973114f, -0.971588f, -0.970032f, -0.968414f, -0.966766f, + -0.965088f, -0.963348f, -0.961548f, -0.959747f, -0.957886f, -0.955994f, -0.954041f, -0.952057f, + -0.950043f, -0.947968f, -0.945862f, -0.943726f, -0.941559f, -0.939331f, -0.937042f, -0.934753f, + -0.932404f, -0.930023f, -0.927582f, -0.92514f, -0.922607f, -0.920074f, -0.91748f, -0.914886f, + -0.912201f, -0.909515f, -0.906769f, -0.903992f, -0.901184f, -0.898315f, -0.895416f, -0.892487f, + -0.889526f, -0.886505f, -0.883453f, -0.880371f, -0.877258f, -0.874084f, -0.87088f, -0.867645f, + -0.86438f, -0.861084f, -0.857727f, -0.85434f, -0.850922f, -0.847473f, -0.843964f, -0.840454f, + -0.836884f, -0.833282f, -0.829651f, -0.825989f, -0.822266f, -0.818512f, -0.814758f, -0.810944f, + -0.807098f, -0.803223f, -0.799286f, -0.795349f, -0.791351f, -0.787354f, -0.783295f, -0.779205f, + -0.775085f, -0.770935f, -0.766754f, -0.762512f, -0.75827f, -0.753998f, -0.749664f, -0.745331f, + -0.740936f, -0.736542f, -0.732086f, -0.727631f, -0.723114f, -0.718567f, -0.71402f, -0.709412f, + 0.704803f, 0.700134f, 0.695435f, 0.690735f, 0.685974f, 0.681213f, 0.676392f, 0.67157f, + 0.666687f, 0.661804f, 0.656891f, 0.651947f, 0.646942f, 0.641937f, 0.636932f, 0.631866f, + 0.62677f, 0.621674f, 0.616516f, 0.611359f, 0.606171f, 0.600952f, 0.595703f, 0.590424f, + 0.585144f, 0.579803f, 0.574463f, 0.569092f, 0.563721f, 0.558289f, 0.552856f, 0.547394f, + 0.541901f, 0.536377f, 0.530853f, 0.525299f, 0.519714f, 0.514099f, 0.508484f, 0.502838f, + 0.497162f, 0.491486f, 0.485748f, 0.480042f, 0.474274f, 0.468506f, 0.462708f, 0.456909f, + 0.45108f, 0.445221f, 0.439362f, 0.433472f, 0.427551f, 0.421631f, 0.41568f, 0.409729f, + 0.403748f, 0.397736f, 0.391724f, 0.385712f, 0.379669f, 0.373596f, 0.367523f, 0.36142f, + 0.355316f, 0.349182f, 0.343048f, 0.336884f, 0.330719f, 0.324524f, 0.318329f, 0.312134f, + 0.305908f, 0.299652f, 0.293427f, 0.28714f, 0.280884f, 0.274597f, 0.26828f, 0.261993f, + 0.255646f, 0.249329f, 0.242981f, 0.236633f, 0.230255f, 0.223877f, 0.217499f, 0.211121f, + 0.204712f, 0.198303f, 0.191895f, 0.185455f, 0.179016f, 0.172577f, 0.166138f, 0.159668f, + 0.153198f, 0.146729f, 0.140259f, 0.133759f, 0.127289f, 0.120789f, 0.114288f, 0.107788f, + 0.101288f, 0.0947571f, 0.0882568f, 0.0817261f, 0.0751953f, 0.0686646f, 0.0621338f, 0.055603f, + 0.0490723f, 0.0425415f, 0.0359802f, 0.0294495f, 0.0229187f, 0.0163574f, 0.00982666f,0.00326538f +}; + +const float wscw16q15_32[160] = +{ + -0.99998795f, -0.99989157f, -0.99969882f, -0.99940971f, -0.99902428f, -0.99854256f, + -0.99796460f, -0.99729046f, -0.99652019f,-0.99565388f, -0.99469160f, -0.99363345f, + -0.99247953f, -0.99122996f, -0.98988485f, -0.98844433f, -0.98690855f, -0.98527764f, + -0.98355177f, -0.98173111f, -0.97981582f, -0.97780610f, -0.97570213f, -0.97350412f, + -0.97121229f, -0.96882685f, -0.96634802f, -0.96377607f, -0.96111122f, -0.95835373f, + -0.95550388f, -0.95256194f, -0.94952818f, -0.94640291f, -0.94318642f, -0.93987902f, + -0.93648104f, -0.93299280f, -0.92941463f, -0.92574689f, -0.92198992f, -0.91814408f, + -0.91420976f, -0.91018732f, -0.90607715f, -0.90187965f, -0.89759523f, -0.89322430f, + -0.88876728f, -0.88422459f, -0.87959669f, -0.87488400f, -0.87008699f, -0.86520612f, + -0.86024186f, -0.85519469f, -0.85006509f, -0.84485357f, -0.83956061f, -0.83418673f, + -0.82873246f, -0.82319831f, -0.81758481f, -0.81189252f, -0.80612197f, -0.80027373f, + -0.79434836f, -0.78834643f, -0.78226851f, -0.77611520f, -0.76988708f, -0.76358476f, + -0.75720885f, -0.75075995f, -0.74423869f, -0.73764570f, -0.73098162f, -0.72424708f, + -0.71744274f, -0.71056925f, 0.70362727f, 0.69661748f, 0.68954054f, 0.68239715f, + 0.67518798f, 0.66791374f, 0.66057513f, 0.65317284f, 0.64570760f, 0.63818013f, + 0.63059115f, 0.62294139f, 0.61523159f, 0.60746249f, 0.59963485f, 0.59174941f, + 0.58380693f, 0.57580819f, 0.56775395f, 0.55964499f, 0.55148209f, 0.54326604f, + 0.53499762f, 0.52667764f, 0.51830690f, 0.50988620f, 0.50141636f, 0.49289819f, + 0.48433252f, 0.47572016f, 0.46706195f, 0.45835873f, 0.44961133f, 0.44082059f, + 0.43198737f, 0.42311251f, 0.41419687f, 0.40524131f, 0.39624670f, 0.38721389f, + 0.37814376f, 0.36903718f, 0.35989504f, 0.35071820f, 0.34150757f, 0.33226402f, + 0.32298845f, 0.31368174f, 0.30434480f, 0.29497853f, 0.28558383f, 0.27616160f, + 0.26671276f, 0.25723821f, 0.24773886f, 0.23821564f, 0.22866946f, 0.21910124f, + 0.20951190f, 0.19990237f, 0.19027357f, 0.18062644f, 0.17096189f, 0.16128086f, + 0.15158430f, 0.14187312f, 0.13214826f, 0.12241068f, 0.11266129f, 0.10290104f, + 0.09313088f, 0.08335174f, 0.07356456f, 0.06377030f, 0.05396989f, 0.04416428f, + 0.03435441f, 0.02454123f, 0.01472568f, 0.00490872f +}; + +const float wscw16q15_16[80] = +{ + -0.99995181f, -0.99956631f, -0.99879546f, -0.99763955f, + -0.99609903f, -0.99417450f, -0.99186670f, -0.98917651f, + -0.98610498f, -0.98265328f, -0.97882275f, -0.97461487f, + -0.97003125f, -0.96507367f, -0.95974404f, -0.95404440f, + -0.94797697f, -0.94154407f, -0.93474818f, -0.92759194f, + -0.92007808f, -0.91220953f, -0.90398929f, -0.89542056f, + -0.88650662f, -0.87725091f, -0.86765701f, -0.85772861f, + -0.84746954f, -0.83688375f, -0.82597533f, -0.81474848f, + -0.80320753f, -0.79135693f, -0.77920124f, -0.76674516f, + -0.75399348f, -0.74095113f, -0.72762312f, -0.71401460f, + 0.70013081f, 0.68597711f, 0.67155895f, 0.65688190f, + 0.64195160f, 0.62677382f, 0.61135441f, 0.59569930f, + 0.57981455f, 0.56370626f, 0.54738066f, 0.53084403f, + 0.51410274f, 0.49716327f, 0.48003212f, 0.46271592f, + 0.44522133f, 0.42755509f, 0.40972403f, 0.39173501f, + 0.37359497f, 0.35531090f, 0.33688985f, 0.31833893f, + 0.29966528f, 0.28087610f, 0.26197864f, 0.24298018f, + 0.22388805f, 0.20470960f, 0.18545224f, 0.16612338f, + 0.14673047f, 0.12728100f, 0.10778246f, 0.08824237f, + 0.06866826f, 0.04906767f, 0.02944817f, 0.00981732f +}; + +const float wscw16q15_8[40] = +{ + -0.999816894531250f, -0.998260498046875f, -0.995178222656250f, -0.990570068359375f, + -0.984436035156250f, -0.976776123046875f, -0.967590332031250f, -0.956939697265625f, + -0.944793701171875f, -0.931213378906250f, -0.916198730468750f, -0.899749755859375f, + -0.881927490234375f, -0.862731933593750f, -0.842224121093750f, -0.820404052734375f, + -0.797332763671875f, -0.773010253906250f, -0.747497558593750f, -0.720855712890625f, + 0.693084716796875f, 0.664245605468750f, 0.634399414062500f, 0.603546142578125f, + 0.571777343750000f, 0.539123535156250f, 0.505645751953125f, 0.471405029296875f, + 0.436401367187500f, 0.400756835937500f, 0.364471435546875f, 0.327636718750000f, + 0.290283203125000f, 0.252502441406250f, 0.214294433593750f, 0.175781250000000f, + 0.137023925781250f, 0.098022460937500f, 0.058868408203125f, 0.019622802734375f, +}; + +/* Codebook for quantization of norms */ +const float dicn[40] = +{ + 131072.0f, 92681.900024f, + 65536.0f, 46340.950012f, + 32768.0f, 23170.475006f, + 16384.0f, 11585.237503f, + 8192.0f, 5792.618751f, + 4096.0f, 2896.309376f, + 2048.0f, 1448.154688f, + 1024.0f, 724.077344f, + 512.0f, 362.038672f, + 256.0f, 181.019336f, + 128.0f, 90.509668f, + 64.0f, 45.254834f, + 32.0f, 22.627417f, + 16.0f, 11.313708f, + 8.0f, 5.656854f, + 4.0f, 2.828427f, + 2.0f, 1.414214f, + 1.0f, 0.707107f, + 0.5f, 0.353553f, + 0.25f, 0.176777f +}; + +const float dicn_inv[40]= /* Inversion of the codebook for quantization of norms */ +{ + 0.00000762939453f, 0.00001078959322f, + 0.00001525878906f, 0.00002157918644f, + 0.00003051757813f, 0.00004315837288f, + 0.00006103515625f, 0.00008631674575f, + 0.0001220703125f, 0.00017263349151f, + 0.000244140625f, 0.00034526698297f, + 0.00048828125f, 0.00069053396594f, + 0.0009765625f, 0.00138106793188f, + 0.001953125f, 0.00276213586376f, + 0.00390625f, 0.00552427172752f, + 0.0078125f, 0.01104854345505f, + 0.015625f, 0.02209708691010f, + 0.03125f, 0.04419417382019f, + 0.0625f, 0.08838835154664f, + 0.125f, 0.17677670309327f, + 0.25f, 0.35355340618655f, + 0.5f, 0.70710656237316f, + 1.0f, 1.41421312474633f, + 2.0f, 2.82843024949583f, + 4.0f, 5.65684449900157f +}; + +/* Codebook for quantization of peak gain */ +const float dicn_pg[45] = +{ + 131072.0000000f, 110217.9749401f, + 92681.9000237f, 77935.8774888f, + 65536.0000000f, 55108.9874701f, + 46340.9500118f, 38967.9387444f, + 32768.0000000f, 27554.4937350f, + 23170.4750059f, 16384.0000000f, + 11585.2375030f, 8192.0000000f, + 5792.6187515f, 4096.0000000f, + 2896.3093757f, 2048.0000000f, + 1448.1546879f, 1024.0000000f, + 724.0773439f, 512.0000000f, + 362.0386720f, 256.0000000f, + 181.0193360f, 128.0000000f, + 90.5096680f, 64.0000000f, + 45.2548340f, 32.0000000f, + 22.6274170f, 16.0000000f, + 11.3137085f, 8.0000000f, + 5.6568542f, 4.0000000f, + 2.8284271f, 2.0000000f, + 1.4142136f, 1.0000000f, + 0.7071070f, 0.5000000f, + 0.3535530f, 0.2500000f, + 0.176777f +}; + +const int16_t expPkEnrg_tbl[45] = +{ + 0, 0, 0, 0, 0, 2, 2, 2, 2, + 4, 4, 4, 6, 6, 8, 8, 10, 10, + 12, 12, 14, 14, 16, 16, 18, 18, 20, + 20, 22, 22, 24, 24, 26, 26, 28, 28, + 30, 30, 32, 32, 34, 34, 36, 36, 38 +}; + +const int32_t manPkEnrg_tbl[45] = +{ + 2147483646, 1518500308, 1073741787, 759250076, 536870912, + 1518500294, 1073741787, 759250076, 536870912, 1518500294, + 1073741787, 536870912, 1073741787, 536870912, 1073741787, + 536870912, 1073741787, 536870912, 1073741606, 536870912, + 1073741968, 536870912, 1073741244, 536870912, 1073741244, + 536870912, 1073744140, 536870912, 1073744140, 536870912, + 1073744140, 536870912, 1073744140, 536870912, 1073697800, + 536870912, 1073697800, 536870912, 1073883168, 536870912, + 1073512448, 536870912, 1073512448, 536870912, 1073512448 +}; +const int32_t E_max5_tbl[40] = +{ + 2047999999, 1448154663, 1024000000, 1448154663, 1024000000, + 1448154663, 1024000000, 1448154663, 1024000000, 1448154663, + 1024000000, 1448154663, 1024000000, 1448154663, 1024000000, + 1448154663, 1024000000, 1448154785, 1024000000, 1448154785, + 1024000000, 1448154296, 1024000000, 1448154296, 1024000000, + 1448156250, 1024000000, 1448156250, 1024000000, 1448156250, + 1024000000, 1448156250, 1024000000, 1448125000, 1024000000, + 1448125000, 1024000000, 1448250000, 1024000000, 1448000000 +}; + + +const int16_t resize_huffsizn[32] = +{ + 0, 0, 0, 0, 0, 11, 10, 10, 9, 8, 7, 6, 5, 4, 3, 2, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 0, 0, 0, 0, 0 +}; + +const int16_t huffsizn[32] = +{ + 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 4, 4, 3, 3, + 3, 3, 4, 4, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7 +}; + +const int16_t huffnorm_tran[32] = +{ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,122, 10, 6, 1, + 0, 3, 2, 26, 58, 186, 442, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +const int16_t huffsizn_tran[32] = +{ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 5, 3, 2, 2, + 2, 4, 6, 8, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +const int16_t pgain_huffsizn[32] = +{ + 10, 11, 10, 10, 9, 8, 6, 5, 5, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 5, 5, 6, 7, 7, 8, 10, 10, 12, 12 +}; + +const int16_t dicnlg2[40] = +{ + 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, + 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, + 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, + 4, 3, 2, 1, 0, -1, -2, -3, -4, -5 +}; + +/*** Table for quantization of MLT coefficients ***/ +const int16_t norm_order_48[NB_SFM] = +{ + 0, 1, 8, 9, 16, 20, 24, 28, 32, 36, 40, 41, 37, 33, 29, 25, 21, 17, 11, 10, 3, 2, + 4, 5, 12, 13, 18, 22, 26, 30, 34, 38, 42, 43, 39, 35, 31, 27, 23, 19, 15, 14, 7, 6 +}; + +const int16_t norm_order_32[SFM_N_SWB] = +{ + 0, 1, 8, 9, 16, 20, 24, 28, 32, 36, 37, 33, 29, 25, 21, 17, 11, 10, 3, 2, + 4, 5, 12, 13, 18, 22, 26, 30, 34, 38, 35, 31, 27, 23, 19, 15, 14, 7, 6 +}; + +const int16_t norm_order_16[SFM_N_WB] = +{ + 0, 1, 8, 9, 16, 20, 24, 21, 17, 11, 10, 3, 2, + 4, 5, 12, 13, 18, 22, 25, 23, 19, 15, 14, 7, 6 +}; + +const int16_t intl_bw_16[N_INTL_GRP_16] = {16, 16}; +const int16_t intl_bw_32[N_INTL_GRP_32] = {16, 24}; +const int16_t intl_bw_48[N_INTL_GRP_48] = {16, 24, 32}; + +const int16_t intl_cnt_16[N_INTL_GRP_16] = {4, 1}; +const int16_t intl_cnt_32[N_INTL_GRP_32] = {4, 4}; +const int16_t intl_cnt_48[N_INTL_GRP_48] = {4, 3, 2}; + +const int16_t band_start_HQ[44] = +{ + 0, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, + 96, 104, 112, 120, 128, 144, 160, 176, 192, 208, 224, 240, + 256, 280, 304, 328, 352, 376, 400, 424, 448, 472, 496, 520, + 544, 576, 608, 640, 672, 704, 736, 768 +}; + +const int16_t band_end_HQ[44] = +{ + 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, + 104, 112, 120, 128, 144, 160, 176, 192, 208, 224, 240, 256, + 280, 304, 328, 352, 376, 400, 424, 448, 472, 496, 520, 544, + 576, 608, 640, 672, 704, 736, 768, 800 +}; + +const int16_t band_len_HQ[44] = +{ + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 16, 16, 16, 16, 16, 16, 16, 16, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 32, 32, 32, 32, 32, 32, 32, 32 +}; + +const int16_t band_start_wb[26] = +{ + 0, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, + 96, 104, 112, 120, 128, 144, 160, 176, 192, 208, 224, 240, + 256, 288 +}; + +const int16_t band_end_wb[26] = +{ + 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, + 104, 112, 120, 128, 144, 160, 176, 192, 208, 224, 240, 256, + 288, 320 +}; + +const int16_t band_len_wb[26] = +{ + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 16, 16, 16, 16, 16, 16, 16, 16, + 32, 32 +}; +const Word16 band_len_harm[SFM_N_HARM_FB] = +{ + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 16, 16, 16, 16, 16, 16, 32, 32, 32, 48, 48, 48, 48, 64, 64, 64, 96 +}; + +const Word16 band_start_harm[SFM_N_HARM_FB] = +{ + 0, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120, + 128, 144, 160, 176, 192, 208, 224, 256, 288, 320, 368, 416, 464, 512, 576, 640, 704 +}; + +const Word16 band_end_harm[SFM_N_HARM_FB] = +{ + 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120, 128, + 144, 160, 176, 192, 208, 224, 256, 288, 320, 368, 416, 464, 512, 576, 640, 704, 800 +}; + + +const float rat[SFM_N_WB] = {1.5f, 1.5f, 1.5f, 1.5f, 1.5f, 1.5f, 1.5f, 1.5f, 1.5f, 1.5f, 1.5f, 1.5f, 1.5f, 1.5f, 1.5f, 1.5f, + 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.8f, 0.8f + }; + +const int16_t sfm_width[20] = {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 5, 5, 6, 6, 6, 7, 8}; +const int16_t a_map[20] = {8, 6, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 5, 7, 11}; + + +const Word32 SQRT_DIM_fx[65] = /* sqrt(x) for x = 0, 1, ..., 64. in Q15 */ +{ + 0, 32768, 46341, 56756, 65536, 73271, 80265, 86696, + 92682, 98304, 103622, 108679, 113512, 118147, 122607, 126910, + 131072, 135106, 139023, 142832, 146543, 150162, 153696, 157150, + 160530, 163840, 167085, 170268, 173392, 176461, 179478, 182445, + 185364, 188238, 191069, 193858, 196608, 199320, 201996, 204636, + 207243, 209818, 212361, 214874, 217358, 219814, 222243, 224646, + 227023, 229376, 231705, 234010, 236293, 238555, 240795, 243014, + 245213, 247393, 249554, 251696, 253820, 255926, 258015, 260088, + 262144 +}; + + + +/*------------------------------------------------------------------------------* + * HQ core tables for SWB signals + *------------------------------------------------------------------------------*/ + + +const float window_8_16_32kHz[370] = +{ + 0.00009609f, 0.00028765f, 0.00058708f, 0.00099202f, 0.00150079f, 0.00211209f, 0.00282484f, 0.00363808f, + 0.00455097f, 0.00556272f, 0.00667261f, 0.00787994f, 0.00918405f, 0.01058429f, 0.01208004f, 0.01367067f, + 0.01535558f, 0.01713416f, 0.01900581f, 0.02096992f, 0.02302588f, 0.02517309f, 0.02741093f, 0.02973879f, + 0.03215604f, 0.03466206f, 0.03725620f, 0.03993782f, 0.04270627f, 0.04556089f, 0.04850099f, 0.05152591f, + 0.05463496f, 0.05782743f, 0.06110262f, 0.06445980f, 0.06789825f, 0.07141723f, 0.07501599f, 0.07869376f, + 0.08244978f, 0.08628326f, 0.09019341f, 0.09417944f, 0.09824051f, 0.10237582f, 0.10658453f, 0.11086578f, + 0.11521874f, 0.11964252f, 0.12413626f, 0.12869907f, 0.13333005f, 0.13802829f, 0.14279289f, 0.14762290f, + 0.15251740f, 0.15747544f, 0.16249607f, 0.16757831f, 0.17272120f, 0.17792375f, 0.18318496f, 0.18850384f, + 0.19387938f, 0.19931055f, 0.20479633f, 0.21033568f, 0.21592756f, 0.22157091f, 0.22726467f, 0.23300778f, + 0.23879915f, 0.24463771f, 0.25052236f, 0.25645201f, 0.26242554f, 0.26844185f, 0.27449982f, 0.28059832f, + 0.28673623f, 0.29291240f, 0.29912569f, 0.30537495f, 0.31165902f, 0.31797676f, 0.32432698f, 0.33070852f, + 0.33712021f, 0.34326770f, 0.34902538f, 0.35469475f, 0.36039689f, 0.36612343f, 0.37187036f, 0.37763517f, + 0.38341599f, 0.38921132f, 0.39501987f, 0.40084050f, 0.40667214f, 0.41251382f, 0.41836457f, 0.42422351f, + 0.43008975f, 0.43596242f, 0.44184069f, 0.44772373f, 0.45361072f, 0.45950085f, 0.46539332f, 0.47128734f, + 0.47718210f, 0.48307684f, 0.48897077f, 0.49486311f, 0.50075309f, 0.50663994f, 0.51252290f, 0.51840120f, + 0.52427408f, 0.53014079f, 0.53600058f, 0.54185268f, 0.54769636f, 0.55353086f, 0.55935545f, 0.56516939f, + 0.57097193f, 0.57676236f, 0.58253993f, 0.58830393f, 0.59405363f, 0.59978832f, 0.60550728f, 0.61120980f, + 0.61689518f, 0.62256271f, 0.62821170f, 0.63384146f, 0.63945131f, 0.64504055f, 0.65060852f, 0.65615454f, + 0.66167795f, 0.66717809f, 0.67265431f, 0.67810596f, 0.68353240f, 0.68893300f, 0.69430713f, 0.69965417f, + 0.70497350f, 0.71026452f, 0.71552664f, 0.72075927f, 0.72596181f, 0.73113370f, 0.73627436f, 0.74053370f, + 0.74223132f, 0.74645982f, 0.75150351f, 0.75651380f, 0.76149018f, 0.76643212f, 0.77133911f, 0.77621068f, + 0.78104633f, 0.78584558f, 0.79060798f, 0.79533307f, 0.80002041f, 0.80466956f, 0.80928010f, 0.81385162f, + 0.81838372f, 0.82287601f, 0.82732812f, 0.83173967f, 0.83611032f, 0.84043971f, 0.84472753f, 0.84897345f, + 0.85317717f, 0.85733839f, 0.86145684f, 0.86553224f, 0.86956435f, 0.87355292f, 0.87749772f, 0.88139855f, + 0.88525520f, 0.88906748f, 0.89283524f, 0.89655830f, 0.90023654f, 0.90386982f, 0.90745805f, 0.91100112f, + 0.91449896f, 0.91795152f, 0.92135875f, 0.92472064f, 0.92803719f, 0.93130842f, 0.93453436f, 0.93771509f, + 0.94085071f, 0.94394132f, 0.94698708f, 0.94998816f, 0.95294479f, 0.95585723f, 0.95872577f, 0.96155077f, + 0.96433265f, 0.96707190f, 0.96976909f, 0.97242491f, 0.97504018f, 0.97761590f, 0.98015330f, 0.98265393f, + 0.98511982f, 0.98755371f, 0.98995949f, 0.99234319f, 0.99471536f, 0.99709994f, 0.99708681f, 0.99466528f, + 0.99222861f, 0.98975303f, 0.98722813f, 0.98464802f, 0.98200891f, 0.97930819f, 0.97654393f, 0.97371465f, + 0.97081921f, 0.96785667f, 0.96482628f, 0.96172739f, 0.95855948f, 0.95532207f, 0.95201479f, 0.94863729f, + 0.94518926f, 0.94167046f, 0.93808064f, 0.93441963f, 0.93068723f, 0.92688329f, 0.92300768f, 0.91906029f, + 0.91504101f, 0.91094975f, 0.90678646f, 0.90255106f, 0.89824351f, 0.89386377f, 0.88941182f, 0.88488765f, + 0.88029124f, 0.87562260f, 0.87088175f, 0.86606871f, 0.86118350f, 0.85622616f, 0.85119674f, 0.84609529f, + 0.84092187f, 0.83567654f, 0.83035938f, 0.82497048f, 0.81950991f, 0.81397777f, 0.80837415f, 0.80269917f, + 0.79695293f, 0.79113554f, 0.78524714f, 0.77928784f, 0.77325776f, 0.76715706f, 0.76098587f, 0.75474432f, + 0.74843257f, 0.74205077f, 0.73559908f, 0.72907763f, 0.72248661f, 0.71582617f, 0.70909647f, 0.70229768f, + 0.69542998f, 0.68849352f, 0.68148847f, 0.67559894f, 0.67322974f, 0.66727332f, 0.66006356f, 0.65278589f, + 0.64544049f, 0.63802752f, 0.63054716f, 0.62299955f, 0.61538487f, 0.60770327f, 0.59995491f, 0.59213992f, + 0.58425845f, 0.57631064f, 0.56829662f, 0.56021651f, 0.55207043f, 0.54385849f, 0.53558078f, 0.52723738f, + 0.51882839f, 0.51035385f, 0.50181382f, 0.49320834f, 0.48453743f, 0.47580109f, 0.46699931f, 0.45813206f, + 0.44919928f, 0.44020091f, 0.43113683f, 0.42200694f, 0.41281107f, 0.40354904f, 0.39422063f, 0.38482561f, + 0.37536367f, 0.36583448f, 0.35623768f, 0.34657285f, 0.33683949f, 0.32703708f, 0.31716502f, 0.30722265f, + 0.29720921f, 0.28712387f, 0.27696571f, 0.26673368f, 0.25642665f, 0.24604332f, 0.23558226f, 0.22504184f, + 0.21442026f, 0.20371546f, 0.19292514f, 0.18204665f, 0.17107697f, 0.16001264f, 0.14884960f, 0.13758311f, + 0.12620753f, 0.11471608f, 0.10310041f, 0.09135008f, 0.07945161f, 0.06738693f, 0.05513058f, 0.04264380f, + 0.02985996f, 0.01663146f +}; +const float window_256kHz[592] = /*ALDO at 25.6 maybe not needed ?*/ +{ + 0.00002505f, 0.00009623f, 0.00021144f, 0.00036963f, 0.00057004f, 0.00081212f, 0.00109541f, 0.00141951f, + 0.00178408f, 0.00218883f, 0.00263346f, 0.00311775f, 0.00364144f, 0.00420431f, 0.00480616f, 0.00544680f, + 0.00612602f, 0.00684364f, 0.00759949f, 0.00839340f, 0.00922518f, 0.01009468f, 0.01100174f, 0.01194618f, + 0.01292786f, 0.01394661f, 0.01500228f, 0.01609471f, 0.01722376f, 0.01838925f, 0.01959105f, 0.02082899f, + 0.02210292f, 0.02341269f, 0.02475814f, 0.02613912f, 0.02755547f, 0.02900704f, 0.03049367f, 0.03201520f, + 0.03357147f, 0.03516233f, 0.03678761f, 0.03844715f, 0.04014078f, 0.04186836f, 0.04362970f, 0.04542464f, + 0.04725302f, 0.04911467f, 0.05100942f, 0.05293708f, 0.05489750f, 0.05689050f, 0.05891590f, 0.06097352f, + 0.06306319f, 0.06518472f, 0.06733794f, 0.06952266f, 0.07173869f, 0.07398585f, 0.07626395f, 0.07857281f, + 0.08091223f, 0.08328201f, 0.08568197f, 0.08811192f, 0.09057164f, 0.09306095f, 0.09557964f, 0.09812751f, + 0.10070437f, 0.10330999f, 0.10594419f, 0.10860674f, 0.11129745f, 0.11401609f, 0.11676246f, 0.11953635f, + 0.12233753f, 0.12516579f, 0.12802091f, 0.13090267f, 0.13381086f, 0.13674524f, 0.13970559f, 0.14269169f, + 0.14570330f, 0.14874021f, 0.15180217f, 0.15488896f, 0.15800034f, 0.16113609f, 0.16429595f, 0.16747970f, + 0.17068710f, 0.17391790f, 0.17717186f, 0.18044875f, 0.18374831f, 0.18707031f, 0.19041448f, 0.19378059f, + 0.19716839f, 0.20057763f, 0.20400804f, 0.20745938f, 0.21093140f, 0.21442384f, 0.21793644f, 0.22146894f, + 0.22502109f, 0.22859261f, 0.23218326f, 0.23579277f, 0.23942087f, 0.24306730f, 0.24673180f, 0.25041408f, + 0.25411390f, 0.25783097f, 0.26156503f, 0.26531581f, 0.26908303f, 0.27286642f, 0.27666570f, 0.28048060f, + 0.28431085f, 0.28815616f, 0.29201627f, 0.29589088f, 0.29977972f, 0.30368251f, 0.30759896f, 0.31152881f, + 0.31547175f, 0.31942751f, 0.32339581f, 0.32737635f, 0.33136886f, 0.33537304f, 0.33938861f, 0.34341527f, + 0.34689352f, 0.35040979f, 0.35394433f, 0.35749191f, 0.36105010f, 0.36461744f, 0.36819295f, 0.37177588f, + 0.37536568f, 0.37896184f, 0.38256397f, 0.38617170f, 0.38978470f, 0.39340267f, 0.39702533f, 0.40065241f, + 0.40428366f, 0.40791884f, 0.41155771f, 0.41520004f, 0.41884562f, 0.42249422f, 0.42614564f, 0.42979966f, + 0.43345608f, 0.43711469f, 0.44077529f, 0.44443769f, 0.44810168f, 0.45176708f, 0.45543368f, 0.45910129f, + 0.46276972f, 0.46643878f, 0.47010827f, 0.47377802f, 0.47744783f, 0.48111751f, 0.48478688f, 0.48845574f, + 0.49212392f, 0.49579124f, 0.49945749f, 0.50312250f, 0.50678610f, 0.51044808f, 0.51410828f, 0.51776651f, + 0.52142258f, 0.52507633f, 0.52872755f, 0.53237609f, 0.53602175f, 0.53966436f, 0.54330374f, 0.54693971f, + 0.55057209f, 0.55420071f, 0.55782539f, 0.56144595f, 0.56506222f, 0.56867402f, 0.57228118f, 0.57588352f, + 0.57948087f, 0.58307305f, 0.58665990f, 0.59024124f, 0.59381690f, 0.59738672f, 0.60095051f, 0.60450811f, + 0.60805935f, 0.61160407f, 0.61514209f, 0.61867325f, 0.62219738f, 0.62571432f, 0.62922390f, 0.63272595f, + 0.63622033f, 0.63970685f, 0.64318537f, 0.64665571f, 0.65011773f, 0.65357125f, 0.65701613f, 0.66045220f, + 0.66387931f, 0.66729730f, 0.67070601f, 0.67410530f, 0.67749501f, 0.68087499f, 0.68424508f, 0.68760514f, + 0.69095502f, 0.69429456f, 0.69762363f, 0.70094207f, 0.70424975f, 0.70754651f, 0.71083222f, 0.71410673f, + 0.71736991f, 0.72062160f, 0.72386169f, 0.72709002f, 0.73030646f, 0.73351088f, 0.73670315f, 0.73988313f, + 0.74305069f, 0.74620570f, 0.74934804f, 0.75247757f, 0.75559418f, 0.75869773f, 0.76178811f, 0.76486519f, + 0.76792885f, 0.77097898f, 0.77401546f, 0.77703816f, 0.78004699f, 0.78304181f, 0.78602253f, 0.78898904f, + 0.79194121f, 0.79487896f, 0.79780216f, 0.80071072f, 0.80360454f, 0.80648352f, 0.80934755f, 0.81219653f, + 0.81503038f, 0.81784900f, 0.82065230f, 0.82344018f, 0.82621255f, 0.82896934f, 0.83171045f, 0.83443579f, + 0.83714529f, 0.83983887f, 0.84251645f, 0.84517794f, 0.84782328f, 0.85045240f, 0.85306521f, 0.85566165f, + 0.85824166f, 0.86080517f, 0.86335210f, 0.86588241f, 0.86839603f, 0.87089291f, 0.87337298f, 0.87583620f, + 0.87828250f, 0.88071185f, 0.88312419f, 0.88551948f, 0.88789767f, 0.89025873f, 0.89260261f, 0.89492928f, + 0.89723869f, 0.89953083f, 0.90180566f, 0.90406314f, 0.90630327f, 0.90852600f, 0.91073133f, 0.91291923f, + 0.91508969f, 0.91724270f, 0.91937824f, 0.92149632f, 0.92359691f, 0.92568004f, 0.92774569f, 0.92979387f, + 0.93182459f, 0.93383786f, 0.93583369f, 0.93781212f, 0.93977315f, 0.94171681f, 0.94364315f, 0.94555218f, + 0.94744396f, 0.94931853f, 0.95117594f, 0.95301624f, 0.95483951f, 0.95664580f, 0.95843521f, 0.96020781f, + 0.96196370f, 0.96370298f, 0.96542577f, 0.96713221f, 0.96882242f, 0.97049658f, 0.97215486f, 0.97379745f, + 0.97542459f, 0.97703653f, 0.97863356f, 0.98021601f, 0.98178428f, 0.98333882f, 0.98488019f, 0.98640904f, + 0.98792619f, 0.98943268f, 0.99092986f, 0.99241955f, 0.99390438f, 0.99538840f, 0.99687865f, 0.99839048f, + 0.99839048f, 0.99687316f, 0.99536647f, 0.99385512f, 0.99233208f, 0.99079337f, 0.98923638f, 0.98765934f, + 0.98606092f, 0.98444012f, 0.98279615f, 0.98112838f, 0.97943628f, 0.97771944f, 0.97597747f, 0.97421006f, + 0.97241695f, 0.97059790f, 0.96875269f, 0.96688116f, 0.96498313f, 0.96305846f, 0.96110701f, 0.95912868f, + 0.95712335f, 0.95509092f, 0.95303131f, 0.95094444f, 0.94883023f, 0.94668862f, 0.94451953f, 0.94232293f, + 0.94009875f, 0.93784694f, 0.93556747f, 0.93326028f, 0.93092535f, 0.92856264f, 0.92617212f, 0.92375376f, + 0.92130753f, 0.91883342f, 0.91633139f, 0.91380144f, 0.91124353f, 0.90865767f, 0.90604383f, 0.90340200f, + 0.90073218f, 0.89803436f, 0.89530852f, 0.89255467f, 0.88977280f, 0.88696291f, 0.88412500f, 0.88125907f, + 0.87836512f, 0.87544316f, 0.87249319f, 0.86951521f, 0.86650924f, 0.86347528f, 0.86041334f, 0.85732343f, + 0.85420557f, 0.85105976f, 0.84788602f, 0.84468436f, 0.84145481f, 0.83819737f, 0.83491207f, 0.83159893f, + 0.82825795f, 0.82488917f, 0.82149260f, 0.81806828f, 0.81461621f, 0.81113643f, 0.80762895f, 0.80409381f, + 0.80053104f, 0.79694065f, 0.79332267f, 0.78967714f, 0.78600409f, 0.78230354f, 0.77857552f, 0.77482007f, + 0.77103722f, 0.76722699f, 0.76338943f, 0.75952457f, 0.75563243f, 0.75171306f, 0.74776649f, 0.74379276f, + 0.73979190f, 0.73576394f, 0.73170893f, 0.72762691f, 0.72351790f, 0.71938195f, 0.71521909f, 0.71102937f, + 0.70681283f, 0.70256949f, 0.69829940f, 0.69400260f, 0.68967913f, 0.68532903f, 0.68095233f, 0.67654908f, + 0.67211932f, 0.66766308f, 0.66318040f, 0.65867133f, 0.65413589f, 0.64957414f, 0.64498610f, 0.64037182f, + 0.63573134f, 0.63106468f, 0.62637190f, 0.62165301f, 0.61690807f, 0.61213710f, 0.60734015f, 0.60251723f, + 0.59766840f, 0.59279367f, 0.58789308f, 0.58296667f, 0.57801446f, 0.57303647f, 0.56803275f, 0.56300331f, + 0.55794818f, 0.55286738f, 0.54776094f, 0.54262888f, 0.53747121f, 0.53228796f, 0.52707914f, 0.52184477f, + 0.51658486f, 0.51129942f, 0.50598845f, 0.50065198f, 0.49528999f, 0.48990250f, 0.48448950f, 0.47905099f, + 0.47358696f, 0.46809741f, 0.46258232f, 0.45704168f, 0.45147548f, 0.44588369f, 0.44026628f, 0.43462323f, + 0.42895451f, 0.42326008f, 0.41753990f, 0.41179392f, 0.40602210f, 0.40022438f, 0.39440070f, 0.38855100f, + 0.38267520f, 0.37677323f, 0.37084500f, 0.36489043f, 0.35890941f, 0.35290185f, 0.34686763f, 0.34080663f, + 0.33471872f, 0.32860376f, 0.32246161f, 0.31629211f, 0.31009508f, 0.30387035f, 0.29761773f, 0.29133699f, + 0.28502794f, 0.27869032f, 0.27232389f, 0.26592837f, 0.25950348f, 0.25304891f, 0.24656432f, 0.24004937f, + 0.23350366f, 0.22692680f, 0.22031833f, 0.21367779f, 0.20700468f, 0.20029842f, 0.19355844f, 0.18678407f, + 0.17997463f, 0.17312933f, 0.16624735f, 0.15932777f, 0.15236958f, 0.14537166f, 0.13833277f, 0.13125154f, + 0.12412643f, 0.11695568f, 0.10973731f, 0.10246907f, 0.09514831f, 0.08777196f, 0.08033640f, 0.07283723f, + 0.06526908f, 0.05762520f, 0.04989688f, 0.04207239f, 0.03413516f, 0.02605991f, 0.01780324f, 0.00927214f +}; + +const float small_overlap_48[R2_48/7]= +{ + 0.01308960f, 0.03925982f, 0.06540313f, 0.09150162f, 0.11753740f, 0.14349262f, 0.16934950f, 0.19509032f, + 0.22069744f, 0.24615329f, 0.27144045f, 0.29654157f, 0.32143947f, 0.34611706f, 0.37055744f, 0.39474386f, + 0.41865974f, 0.44228869f, 0.46561452f, 0.48862124f, 0.51129309f, 0.53361452f, 0.55557023f, 0.57714519f, + 0.59832460f, 0.61909395f, 0.63943900f, 0.65934582f, 0.67880075f, 0.69779046f, 0.71630194f, 0.73432251f, + 0.75183981f, 0.76884183f, 0.78531693f, 0.80125381f, 0.81664156f, 0.83146961f, 0.84572782f, 0.85940641f, + 0.87249601f, 0.88498764f, 0.89687274f, 0.90814317f, 0.91879121f, 0.92880955f, 0.93819134f, 0.94693013f, + 0.95501994f, 0.96245524f, 0.96923091f, 0.97534232f, 0.98078528f, 0.98555606f, 0.98965139f, 0.99306846f, + 0.99580493f, 0.99785892f, 0.99922904f, 0.99991433f +}; + +const float small_overlap_25[R2_25/7]= +{ + 0.02454123f, 0.07356456f, 0.12241068f, 0.17096189f, 0.21910124f, 0.26671276f, 0.31368174f, 0.35989504f, + 0.40524131f, 0.44961133f, 0.49289819f, 0.53499762f, 0.57580819f, 0.61523159f, 0.65317284f, 0.68954054f, + 0.72424708f, 0.75720885f, 0.78834643f, 0.81758481f, 0.84485357f, 0.87008699f, 0.89322430f, 0.91420976f, + 0.93299280f, 0.94952818f, 0.96377607f, 0.97570213f, 0.98527764f, 0.99247953f, 0.99729046f, 0.99969882f +}; + +const float small_overlap_int[R2_16/7]= +{ + 0.07845910f, 0.15643447f, + 0.23344536f, 0.30901699f, 0.38268343f, 0.45399050f, 0.52249856f, 0.58778525f, 0.64944805f, 0.69778617f, + 0.71630612f, 0.76040597f, 0.80901699f, 0.85264016f, 0.89100652f, 0.92387953f, 0.95105652f, 0.97236992f, + 0.98768834f, 0.99691733f +}; + + +const float half_overlap_48[3*R2_48/7]= +{ + 0.00436331f, 0.01308960f, + 0.02181489f, 0.03053851f, 0.03925982f, 0.04797813f, 0.05669279f, 0.06540313f, 0.07410849f, 0.08280821f, + 0.09150162f, 0.10018806f, 0.10886687f, 0.11753740f, 0.12619897f, 0.13485093f, 0.14349262f, 0.15212339f, + 0.16074257f, 0.16934950f, 0.17794355f, 0.18652404f, 0.19509032f, 0.20364175f, 0.21217767f, 0.22069744f, + 0.22920039f, 0.23768589f, 0.24615329f, 0.25460195f, 0.26303121f, 0.27144045f, 0.27982901f, 0.28819627f, + 0.29654157f, 0.30486430f, 0.31316381f, 0.32143947f, 0.32969065f, 0.33791672f, 0.34611706f, 0.35429104f, + 0.36243804f, 0.37055744f, 0.37864862f, 0.38671096f, 0.39474386f, 0.40274669f, 0.41071885f, 0.41865974f, + 0.42656874f, 0.43444526f, 0.44228869f, 0.45009844f, 0.45787392f, 0.46561452f, 0.47331967f, 0.48098877f, + 0.48862124f, 0.49621650f, 0.50377398f, 0.51129309f, 0.51877326f, 0.52621392f, 0.53361452f, 0.54097447f, + 0.54829323f, 0.55557023f, 0.56280493f, 0.56999676f, 0.57714519f, 0.58424967f, 0.59130965f, 0.59832460f, + 0.60529399f, 0.61221728f, 0.61909395f, 0.62592347f, 0.63270533f, 0.63943900f, 0.64612398f, 0.65275975f, + 0.65934582f, 0.66588167f, 0.67236681f, 0.67880075f, 0.68518299f, 0.69151306f, 0.69779046f, 0.70401472f, + 0.71018538f, 0.71630194f, 0.72236396f, 0.72837097f, 0.73432251f, 0.74021813f, 0.74605738f, 0.75183981f, + 0.75756498f, 0.76323247f, 0.76884183f, 0.77439264f, 0.77988448f, 0.78531693f, 0.79068957f, 0.79600200f, + 0.80125381f, 0.80644460f, 0.81157398f, 0.81664156f, 0.82164694f, 0.82658975f, 0.83146961f, 0.83628616f, + 0.84103901f, 0.84572782f, 0.85035222f, 0.85491187f, 0.85940641f, 0.86383551f, 0.86819881f, 0.87249601f, + 0.87672676f, 0.88089074f, 0.88498764f, 0.88901714f, 0.89297894f, 0.89687274f, 0.90069824f, 0.90445515f, + 0.90814317f, 0.91176204f, 0.91531148f, 0.91879121f, 0.92220097f, 0.92554050f, 0.92880955f, 0.93200787f, + 0.93513521f, 0.93819134f, 0.94117602f, 0.94408902f, 0.94693013f, 0.94969913f, 0.95239580f, 0.95501994f, + 0.95757136f, 0.96004985f, 0.96245524f, 0.96478732f, 0.96704594f, 0.96923091f, 0.97134207f, 0.97337926f, + 0.97534232f, 0.97723111f, 0.97904547f, 0.98078528f, 0.98245040f, 0.98404070f, 0.98555606f, 0.98699637f, + 0.98836151f, 0.98965139f, 0.99086590f, 0.99200495f, 0.99306846f, 0.99405634f, 0.99496852f, 0.99580493f, + 0.99656550f, 0.99725019f, 0.99785892f, 0.99839167f, 0.99884839f, 0.99922904f, 0.99953359f, 0.99976203f, + 0.99991433f, 0.99999048f +}; + +const float half_overlap_25[3*R2_25/7]= +{ + 0.00818114f, 0.02454123f, 0.04089475f, 0.05723732f, 0.07356456f, 0.08987211f, 0.10615561f, 0.12241068f, + 0.13863297f, 0.15481816f, 0.17096189f, 0.18705985f, 0.20310773f, 0.21910124f, 0.23503609f, 0.25090801f, + 0.26671276f, 0.28244610f, 0.29810383f, 0.31368174f, 0.32917568f, 0.34458148f, 0.35989504f, 0.37511224f, + 0.39022901f, 0.40524131f, 0.42014512f, 0.43493645f, 0.44961133f, 0.46416584f, 0.47859608f, 0.49289819f, + 0.50706834f, 0.52110274f, 0.53499762f, 0.54874927f, 0.56235401f, 0.57580819f, 0.58910822f, 0.60225052f, + 0.61523159f, 0.62804795f, 0.64069616f, 0.65317284f, 0.66547466f, 0.67759830f, 0.68954054f, 0.70129818f, + 0.71286806f, 0.72424708f, 0.73543221f, 0.74642045f, 0.75720885f, 0.76779452f, 0.77817464f, 0.78834643f, + 0.79830715f, 0.80805415f, 0.81758481f, 0.82689659f, 0.83598698f, 0.84485357f, 0.85349396f, 0.86190585f, + 0.87008699f, 0.87803519f, 0.88574831f, 0.89322430f, 0.90046115f, 0.90745693f, 0.91420976f, 0.92071783f, + 0.92697940f, 0.93299280f, 0.93875641f, 0.94426870f, 0.94952818f, 0.95453345f, 0.95928317f, 0.96377607f, + 0.96801094f, 0.97198664f, 0.97570213f, 0.97915640f, 0.98234852f, 0.98527764f, 0.98794298f, 0.99034383f, + 0.99247953f, 0.99434953f, 0.99595331f, 0.99729046f, 0.99836060f, 0.99916346f, 0.99969882f, 0.99996653f, +}; + +const float half_overlap_int[3*R2_16/7]= +{ + 0.02617695f, 0.05233596f, 0.07845910f, 0.10452846f, 0.13052619f, 0.15643447f, + 0.18223553f, 0.20791169f, 0.23344536f, 0.25881905f, 0.28401534f, 0.30901699f, 0.33380686f, 0.35836795f, + 0.38268343f, 0.40673664f, 0.43051110f, 0.45399050f, 0.47715876f, 0.50000000f, 0.52249856f, 0.54463904f, + 0.56640624f, 0.58778525f, 0.60876143f, 0.62932039f, 0.64944805f, 0.66913061f, 0.68835458f, 0.70401457f, + 0.71018553f, 0.72537437f, 0.74314483f, 0.76040597f, 0.77714596f, 0.79335334f, 0.80901699f, 0.82412619f, + 0.83867057f, 0.85264016f, 0.86602540f, 0.87881711f, 0.89100652f, 0.90258528f, 0.91354546f, 0.92387953f, + 0.93358043f, 0.94264149f, 0.95105652f, 0.95881973f, 0.96592583f, 0.97236992f, 0.97814760f, 0.98325491f, + 0.98768834f, 0.99144486f, 0.99452190f, 0.99691733f, 0.99862953f, 0.99965732f +}; + +const float window_48kHz[1110] = +{ + 0.00000717f, 0.00002765f, 0.00006087f, 0.00010657f, 0.00016454f, 0.00023464f, 0.00031674f, 0.00041075f, + 0.00051659f, 0.00063416f, 0.00076341f, 0.00090428f, 0.00105670f, 0.00122062f, 0.00139600f, 0.00158279f, + 0.00178095f, 0.00199044f, 0.00221121f, 0.00244323f, 0.00268646f, 0.00294088f, 0.00320644f, 0.00348313f, + 0.00377089f, 0.00406971f, 0.00437956f, 0.00470041f, 0.00503222f, 0.00537498f, 0.00572866f, 0.00609322f, + 0.00646865f, 0.00685492f, 0.00725200f, 0.00765987f, 0.00807851f, 0.00850788f, 0.00894798f, 0.00939876f, + 0.00986022f, 0.01033232f, 0.01081504f, 0.01130837f, 0.01181227f, 0.01232672f, 0.01285171f, 0.01338721f, + 0.01393319f, 0.01448963f, 0.01505652f, 0.01563383f, 0.01622153f, 0.01681961f, 0.01742804f, 0.01804680f, + 0.01867586f, 0.01931521f, 0.01996482f, 0.02062467f, 0.02129474f, 0.02197501f, 0.02266545f, 0.02336603f, + 0.02407675f, 0.02479757f, 0.02552847f, 0.02626943f, 0.02702042f, 0.02778143f, 0.02855244f, 0.02933340f, + 0.03012432f, 0.03092515f, 0.03173588f, 0.03255648f, 0.03338694f, 0.03422723f, 0.03507731f, 0.03593718f, + 0.03680680f, 0.03768616f, 0.03857522f, 0.03947397f, 0.04038238f, 0.04130042f, 0.04222808f, 0.04316532f, + 0.04411212f, 0.04506846f, 0.04603431f, 0.04700965f, 0.04799445f, 0.04898869f, 0.04999234f, 0.05100537f, + 0.05202776f, 0.05305949f, 0.05410053f, 0.05515085f, 0.05621043f, 0.05727924f, 0.05835725f, 0.05944444f, + 0.06054078f, 0.06164624f, 0.06276080f, 0.06388444f, 0.06501711f, 0.06615880f, 0.06730949f, 0.06846913f, + 0.06963771f, 0.07081519f, 0.07200155f, 0.07319676f, 0.07440080f, 0.07561362f, 0.07683522f, 0.07806555f, + 0.07930459f, 0.08055231f, 0.08180868f, 0.08307367f, 0.08434725f, 0.08562940f, 0.08692008f, 0.08821927f, + 0.08952693f, 0.09084304f, 0.09216756f, 0.09350047f, 0.09484173f, 0.09619131f, 0.09754919f, 0.09891534f, + 0.10028971f, 0.10167229f, 0.10306304f, 0.10446193f, 0.10586893f, 0.10728400f, 0.10870712f, 0.11013826f, + 0.11157738f, 0.11302444f, 0.11447943f, 0.11594230f, 0.11741303f, 0.11889158f, 0.12037792f, 0.12187201f, + 0.12337383f, 0.12488334f, 0.12640051f, 0.12792530f, 0.12945769f, 0.13099763f, 0.13254510f, 0.13410005f, + 0.13566247f, 0.13723231f, 0.13880953f, 0.14039412f, 0.14198602f, 0.14358521f, 0.14519166f, 0.14680532f, + 0.14842616f, 0.15005415f, 0.15168925f, 0.15333143f, 0.15498066f, 0.15663689f, 0.15830009f, 0.15997023f, + 0.16164727f, 0.16333117f, 0.16502191f, 0.16671943f, 0.16842371f, 0.17013472f, 0.17185240f, 0.17357674f, + 0.17530768f, 0.17704520f, 0.17878926f, 0.18053981f, 0.18229683f, 0.18406028f, 0.18583011f, 0.18760630f, + 0.18938880f, 0.19117758f, 0.19297259f, 0.19477381f, 0.19658119f, 0.19839469f, 0.20021428f, 0.20203992f, + 0.20387157f, 0.20570919f, 0.20755274f, 0.20940219f, 0.21125750f, 0.21311862f, 0.21498552f, 0.21685816f, + 0.21873650f, 0.22062050f, 0.22251012f, 0.22440532f, 0.22630606f, 0.22821231f, 0.23012402f, 0.23204116f, + 0.23396367f, 0.23589153f, 0.23782470f, 0.23976312f, 0.24170677f, 0.24365560f, 0.24560957f, 0.24756865f, + 0.24953278f, 0.25150194f, 0.25347607f, 0.25545514f, 0.25743911f, 0.25942794f, 0.26142158f, 0.26341999f, + 0.26542314f, 0.26743098f, 0.26944347f, 0.27146056f, 0.27348222f, 0.27550841f, 0.27753908f, 0.27957419f, + 0.28161370f, 0.28365757f, 0.28570575f, 0.28775820f, 0.28981489f, 0.29187576f, 0.29394078f, 0.29600991f, + 0.29808309f, 0.30016029f, 0.30224147f, 0.30432658f, 0.30641558f, 0.30850843f, 0.31060508f, 0.31270549f, + 0.31480962f, 0.31691743f, 0.31902887f, 0.32114389f, 0.32326246f, 0.32538454f, 0.32751007f, 0.32963901f, + 0.33177133f, 0.33390698f, 0.33604591f, 0.33818808f, 0.34033345f, 0.34248196f, 0.34432825f, 0.34619672f, + 0.34807434f, 0.34995817f, 0.35184686f, 0.35373965f, 0.35563601f, 0.35753559f, 0.35943811f, 0.36134336f, + 0.36325118f, 0.36516141f, 0.36707393f, 0.36898864f, 0.37090544f, 0.37282426f, 0.37474501f, 0.37666763f, + 0.37859204f, 0.38051820f, 0.38244605f, 0.38437553f, 0.38630659f, 0.38823918f, 0.39017326f, 0.39210879f, + 0.39404572f, 0.39598401f, 0.39792361f, 0.39986450f, 0.40180663f, 0.40374996f, 0.40569446f, 0.40764009f, + 0.40958682f, 0.41153461f, 0.41348342f, 0.41543322f, 0.41738398f, 0.41933567f, 0.42128825f, 0.42324169f, + 0.42519595f, 0.42715101f, 0.42910683f, 0.43106338f, 0.43302063f, 0.43497855f, 0.43693710f, 0.43889626f, + 0.44085600f, 0.44281628f, 0.44477708f, 0.44673836f, 0.44870009f, 0.45066225f, 0.45262480f, 0.45458771f, + 0.45655096f, 0.45851451f, 0.46047834f, 0.46244241f, 0.46440670f, 0.46637117f, 0.46833580f, 0.47030055f, + 0.47226541f, 0.47423033f, 0.47619530f, 0.47816027f, 0.48012523f, 0.48209014f, 0.48405498f, 0.48601971f, + 0.48798430f, 0.48994874f, 0.49191298f, 0.49387701f, 0.49584078f, 0.49780428f, 0.49976748f, 0.50173034f, + 0.50369284f, 0.50565495f, 0.50761664f, 0.50957789f, 0.51153865f, 0.51349892f, 0.51545865f, 0.51741783f, + 0.51937641f, 0.52133438f, 0.52329171f, 0.52524836f, 0.52720432f, 0.52915954f, 0.53111401f, 0.53306770f, + 0.53502057f, 0.53697261f, 0.53892378f, 0.54087405f, 0.54282340f, 0.54477180f, 0.54671922f, 0.54866564f, + 0.55061103f, 0.55255535f, 0.55449858f, 0.55644070f, 0.55838168f, 0.56032149f, 0.56226010f, 0.56419748f, + 0.56613362f, 0.56806847f, 0.57000202f, 0.57193423f, 0.57386509f, 0.57579455f, 0.57772261f, 0.57964922f, + 0.58157436f, 0.58349801f, 0.58542013f, 0.58734071f, 0.58925971f, 0.59117711f, 0.59309288f, 0.59500700f, + 0.59691943f, 0.59883016f, 0.60073915f, 0.60264638f, 0.60455182f, 0.60645545f, 0.60835724f, 0.61025717f, + 0.61215520f, 0.61405132f, 0.61594549f, 0.61783769f, 0.61972789f, 0.62161608f, 0.62350222f, 0.62538628f, + 0.62726824f, 0.62914809f, 0.63102578f, 0.63290129f, 0.63477461f, 0.63664570f, 0.63851454f, 0.64038110f, + 0.64224536f, 0.64410729f, 0.64596688f, 0.64782408f, 0.64967889f, 0.65153127f, 0.65338119f, 0.65522864f, + 0.65707360f, 0.65891602f, 0.66075590f, 0.66259321f, 0.66442791f, 0.66626000f, 0.66808944f, 0.66991621f, + 0.67174028f, 0.67356164f, 0.67538025f, 0.67719610f, 0.67900916f, 0.68081941f, 0.68262682f, 0.68443137f, + 0.68623303f, 0.68803180f, 0.68982763f, 0.69162050f, 0.69341041f, 0.69519731f, 0.69698119f, 0.69876203f, + 0.70053980f, 0.70231448f, 0.70408605f, 0.70585448f, 0.70761976f, 0.70938186f, 0.71114076f, 0.71289643f, + 0.71464886f, 0.71639803f, 0.71814390f, 0.71988647f, 0.72162570f, 0.72336158f, 0.72509409f, 0.72682320f, + 0.72854889f, 0.73027115f, 0.73198995f, 0.73370527f, 0.73541708f, 0.73712538f, 0.73883014f, 0.74053133f, + 0.74222894f, 0.74392295f, 0.74561334f, 0.74730009f, 0.74898317f, 0.75066257f, 0.75233827f, 0.75401025f, + 0.75567849f, 0.75734297f, 0.75900367f, 0.76066057f, 0.76231366f, 0.76396291f, 0.76560830f, 0.76724982f, + 0.76888745f, 0.77052118f, 0.77215097f, 0.77377682f, 0.77539870f, 0.77701660f, 0.77863050f, 0.78024038f, + 0.78184623f, 0.78344803f, 0.78504575f, 0.78663939f, 0.78822893f, 0.78981434f, 0.79139562f, 0.79297274f, + 0.79454569f, 0.79611446f, 0.79767902f, 0.79923936f, 0.80079547f, 0.80234733f, 0.80389492f, 0.80543823f, + 0.80697724f, 0.80851193f, 0.81004230f, 0.81156833f, 0.81309000f, 0.81460729f, 0.81612020f, 0.81762870f, + 0.81913279f, 0.82063245f, 0.82212766f, 0.82361842f, 0.82510470f, 0.82658650f, 0.82806380f, 0.82953658f, + 0.83100484f, 0.83246856f, 0.83392773f, 0.83538233f, 0.83683236f, 0.83827780f, 0.83971863f, 0.84115485f, + 0.84258645f, 0.84401340f, 0.84543571f, 0.84685336f, 0.84826633f, 0.84967462f, 0.85107821f, 0.85247710f, + 0.85387127f, 0.85526072f, 0.85664542f, 0.85802538f, 0.85940058f, 0.86077102f, 0.86213667f, 0.86349754f, + 0.86485361f, 0.86620487f, 0.86755132f, 0.86889294f, 0.87022973f, 0.87156168f, 0.87288878f, 0.87421101f, + 0.87552839f, 0.87684088f, 0.87814849f, 0.87945122f, 0.88074904f, 0.88204196f, 0.88332997f, 0.88461305f, + 0.88589122f, 0.88716444f, 0.88843273f, 0.88969608f, 0.89095447f, 0.89220791f, 0.89345638f, 0.89469988f, + 0.89593841f, 0.89717197f, 0.89840053f, 0.89962411f, 0.90084270f, 0.90205629f, 0.90326488f, 0.90446846f, + 0.90566704f, 0.90686060f, 0.90804915f, 0.90923267f, 0.91041118f, 0.91158466f, 0.91275311f, 0.91391654f, + 0.91507493f, 0.91622829f, 0.91737662f, 0.91851991f, 0.91965816f, 0.92079138f, 0.92191956f, 0.92304270f, + 0.92416080f, 0.92527386f, 0.92638188f, 0.92748486f, 0.92858281f, 0.92967572f, 0.93076360f, 0.93184645f, + 0.93292426f, 0.93399705f, 0.93506481f, 0.93612755f, 0.93718527f, 0.93823797f, 0.93928566f, 0.94032834f, + 0.94136602f, 0.94239870f, 0.94342639f, 0.94444909f, 0.94546681f, 0.94647956f, 0.94748733f, 0.94849015f, + 0.94948801f, 0.95048093f, 0.95146891f, 0.95245197f, 0.95343011f, 0.95440334f, 0.95537168f, 0.95633513f, + 0.95729371f, 0.95824743f, 0.95919630f, 0.96014034f, 0.96107957f, 0.96201399f, 0.96294363f, 0.96386850f, + 0.96478862f, 0.96570402f, 0.96661470f, 0.96752070f, 0.96842204f, 0.96931873f, 0.97021081f, 0.97109831f, + 0.97198124f, 0.97285966f, 0.97373358f, 0.97460304f, 0.97546808f, 0.97632874f, 0.97718506f, 0.97803710f, + 0.97888489f, 0.97972850f, 0.98056799f, 0.98140340f, 0.98223483f, 0.98306234f, 0.98388601f, 0.98470595f, + 0.98552225f, 0.98633502f, 0.98714441f, 0.98795054f, 0.98875359f, 0.98955376f, 0.99035126f, 0.99114636f, + 0.99193936f, 0.99273065f, 0.99352070f, 0.99431009f, 0.99509960f, 0.99589027f, 0.99668360f, 0.99748189f, + 0.99828914f, 0.99911401f, 0.99911401f, 0.99828759f, 0.99747571f, 0.99666970f, 0.99586557f, 0.99506104f, + 0.99425460f, 0.99344523f, 0.99263215f, 0.99181478f, 0.99099266f, 0.99016542f, 0.98933274f, 0.98849437f, + 0.98765009f, 0.98679972f, 0.98594310f, 0.98508007f, 0.98421052f, 0.98333434f, 0.98245143f, 0.98156170f, + 0.98066506f, 0.97976145f, 0.97885080f, 0.97793305f, 0.97700814f, 0.97607603f, 0.97513666f, 0.97419000f, + 0.97323600f, 0.97227462f, 0.97130583f, 0.97032960f, 0.96934589f, 0.96835468f, 0.96735594f, 0.96634965f, + 0.96533578f, 0.96431430f, 0.96328520f, 0.96224846f, 0.96120406f, 0.96015197f, 0.95909219f, 0.95802469f, + 0.95694946f, 0.95586649f, 0.95477576f, 0.95367726f, 0.95257097f, 0.95145688f, 0.95033498f, 0.94920527f, + 0.94806772f, 0.94692233f, 0.94576909f, 0.94460799f, 0.94343902f, 0.94226217f, 0.94107743f, 0.93988480f, + 0.93868427f, 0.93747583f, 0.93625947f, 0.93503520f, 0.93380299f, 0.93256285f, 0.93131476f, 0.93005873f, + 0.92879475f, 0.92752281f, 0.92624292f, 0.92495505f, 0.92365922f, 0.92235541f, 0.92104362f, 0.91972385f, + 0.91839609f, 0.91706034f, 0.91571660f, 0.91436487f, 0.91300513f, 0.91163740f, 0.91026166f, 0.90887792f, + 0.90748616f, 0.90608640f, 0.90467862f, 0.90326283f, 0.90183902f, 0.90040720f, 0.89896735f, 0.89751949f, + 0.89606360f, 0.89459969f, 0.89312776f, 0.89164780f, 0.89015982f, 0.88866382f, 0.88715979f, 0.88564773f, + 0.88412765f, 0.88259954f, 0.88106340f, 0.87951924f, 0.87796706f, 0.87640684f, 0.87483861f, 0.87326235f, + 0.87167807f, 0.87008576f, 0.86848544f, 0.86687709f, 0.86526073f, 0.86363635f, 0.86200395f, 0.86036353f, + 0.85871510f, 0.85705867f, 0.85539422f, 0.85372176f, 0.85204129f, 0.85035282f, 0.84865635f, 0.84695188f, + 0.84523941f, 0.84351895f, 0.84179049f, 0.84005404f, 0.83830960f, 0.83655718f, 0.83479677f, 0.83302839f, + 0.83125203f, 0.82946769f, 0.82767538f, 0.82587511f, 0.82406687f, 0.82225067f, 0.82042651f, 0.81859440f, + 0.81675434f, 0.81490633f, 0.81305038f, 0.81118649f, 0.80931466f, 0.80743490f, 0.80554721f, 0.80365160f, + 0.80174807f, 0.79983662f, 0.79791726f, 0.79599000f, 0.79405483f, 0.79211177f, 0.79016081f, 0.78820196f, + 0.78623522f, 0.78426061f, 0.78227812f, 0.78028777f, 0.77828954f, 0.77628346f, 0.77426952f, 0.77224773f, + 0.77021809f, 0.76818061f, 0.76613530f, 0.76408216f, 0.76202120f, 0.75995241f, 0.75787581f, 0.75579140f, + 0.75369919f, 0.75159918f, 0.74949138f, 0.74737580f, 0.74525243f, 0.74312128f, 0.74098237f, 0.73883570f, + 0.73668126f, 0.73451908f, 0.73234915f, 0.73017147f, 0.72798607f, 0.72579293f, 0.72359208f, 0.72138350f, + 0.71916722f, 0.71694323f, 0.71471154f, 0.71247217f, 0.71022510f, 0.70797036f, 0.70570794f, 0.70343786f, + 0.70116012f, 0.69887472f, 0.69658167f, 0.69428098f, 0.69197265f, 0.68965669f, 0.68733312f, 0.68500192f, + 0.68266311f, 0.68031670f, 0.67796269f, 0.67560109f, 0.67323190f, 0.67085514f, 0.66847080f, 0.66607889f, + 0.66367943f, 0.66127241f, 0.65885784f, 0.65643574f, 0.65400609f, 0.65156892f, 0.64912423f, 0.64667201f, + 0.64421229f, 0.64174507f, 0.63927035f, 0.63678813f, 0.63429843f, 0.63180125f, 0.62929660f, 0.62678447f, + 0.62426489f, 0.62173785f, 0.61920336f, 0.61666143f, 0.61411206f, 0.61155525f, 0.60899102f, 0.60641937f, + 0.60384030f, 0.60125382f, 0.59865994f, 0.59605866f, 0.59344998f, 0.59083391f, 0.58821046f, 0.58557964f, + 0.58294143f, 0.58029586f, 0.57764293f, 0.57498264f, 0.57231499f, 0.56963999f, 0.56695765f, 0.56426797f, + 0.56157095f, 0.55886660f, 0.55615492f, 0.55343592f, 0.55070960f, 0.54797596f, 0.54523501f, 0.54248675f, + 0.53973118f, 0.53696832f, 0.53419815f, 0.53142069f, 0.52863593f, 0.52584388f, 0.52304455f, 0.52023793f, + 0.51742403f, 0.51460284f, 0.51177438f, 0.50893864f, 0.50609563f, 0.50324534f, 0.50038778f, 0.49752294f, + 0.49465084f, 0.49177147f, 0.48888482f, 0.48599091f, 0.48308973f, 0.48018128f, 0.47726556f, 0.47434256f, + 0.47141230f, 0.46847477f, 0.46552996f, 0.46257788f, 0.45961852f, 0.45665188f, 0.45367796f, 0.45069676f, + 0.44770827f, 0.44471249f, 0.44170942f, 0.43869905f, 0.43568138f, 0.43265640f, 0.42962411f, 0.42658451f, + 0.42353758f, 0.42048333f, 0.41742175f, 0.41435283f, 0.41127656f, 0.40819293f, 0.40510195f, 0.40200359f, + 0.39889786f, 0.39578474f, 0.39266422f, 0.38953629f, 0.38640095f, 0.38325818f, 0.38010797f, 0.37695031f, + 0.37378519f, 0.37061258f, 0.36743249f, 0.36424489f, 0.36104978f, 0.35784713f, 0.35463693f, 0.35141916f, + 0.34819381f, 0.34496085f, 0.34172027f, 0.33847206f, 0.33521618f, 0.33195262f, 0.32868136f, 0.32540237f, + 0.32211564f, 0.31882113f, 0.31551882f, 0.31220868f, 0.30889070f, 0.30556483f, 0.30223106f, 0.29888935f, + 0.29553966f, 0.29218198f, 0.28881626f, 0.28544246f, 0.28206056f, 0.27867052f, 0.27527229f, 0.27186583f, + 0.26845112f, 0.26502809f, 0.26159670f, 0.25815692f, 0.25470869f, 0.25125196f, 0.24778667f, 0.24431278f, + 0.24083023f, 0.23733896f, 0.23383891f, 0.23033001f, 0.22681220f, 0.22328542f, 0.21974958f, 0.21620462f, + 0.21265047f, 0.20908703f, 0.20551423f, 0.20193197f, 0.19834018f, 0.19473875f, 0.19112758f, 0.18750657f, + 0.18387561f, 0.18023459f, 0.17658339f, 0.17292189f, 0.16924994f, 0.16556742f, 0.16187418f, 0.15817007f, + 0.15445492f, 0.15072857f, 0.14699084f, 0.14324154f, 0.13948047f, 0.13570741f, 0.13192214f, 0.12812442f, + 0.12431400f, 0.12049059f, 0.11665391f, 0.11280364f, 0.10893944f, 0.10506094f, 0.10116776f, 0.09725946f, + 0.09333558f, 0.08939561f, 0.08543899f, 0.08146510f, 0.07747327f, 0.07346273f, 0.06943264f, 0.06538204f, + 0.06130985f, 0.05721482f, 0.05309551f, 0.04895024f, 0.04477702f, 0.04057343f, 0.03633653f, 0.03206261f, + 0.02774685f, 0.02338280f, 0.01896129f, 0.01446831f, 0.00987977f, 0.00514389f +}; + + +const float short_window_8kHz[80] = +{ + 0.01963369f, 0.05887080f, 0.09801714f, 0.13701234f, 0.17579628f, 0.21430915f, 0.25249158f, 0.29028468f, + 0.32763018f, 0.36447050f, 0.40074883f, 0.43640924f, 0.47139674f, 0.50565737f, 0.53913832f, 0.57178796f, + 0.60355594f, 0.63439328f, 0.66425244f, 0.69308736f, 0.72085360f, 0.74750833f, 0.77301045f, 0.79732065f, + 0.82040144f, 0.84221723f, 0.86273439f, 0.88192126f, 0.89974828f, 0.91618796f, 0.93121493f, 0.94480605f, + 0.95694034f, 0.96759909f, 0.97676588f, 0.98442657f, 0.99056934f, 0.99518473f, 0.99826561f, 0.99980724f, + 0.99980724f, 0.99826561f, 0.99518473f, 0.99056934f, 0.98442657f, 0.97676588f, 0.96759909f, 0.95694034f, + 0.94480605f, 0.93121493f, 0.91618796f, 0.89974828f, 0.88192126f, 0.86273439f, 0.84221723f, 0.82040144f, + 0.79732065f, 0.77301045f, 0.74750833f, 0.72085360f, 0.69308736f, 0.66425244f, 0.63439328f, 0.60355594f, + 0.57178796f, 0.53913832f, 0.50565737f, 0.47139674f, 0.43640924f, 0.40074883f, 0.36447050f, 0.32763018f, + 0.29028468f, 0.25249158f, 0.21430915f, 0.17579628f, 0.13701234f, 0.09801714f, 0.05887080f, 0.01963369f +}; + +const float short_window_16kHz[160] = +{ + 0.00981732f, 0.02944817f, 0.04906767f, 0.06866826f, + 0.08824237f, 0.10778246f, 0.12728100f, 0.14673047f, + 0.16612338f, 0.18545224f, 0.20470960f, 0.22388805f, + 0.24298018f, 0.26197864f, 0.28087610f, 0.29966528f, + 0.31833893f, 0.33688985f, 0.35531090f, 0.37359497f, + 0.39173501f, 0.40972403f, 0.42755509f, 0.44522133f, + 0.46271592f, 0.48003212f, 0.49716327f, 0.51410274f, + 0.53084403f, 0.54738066f, 0.56370626f, 0.57981455f, + 0.59569930f, 0.61135441f, 0.62677382f, 0.64195160f, + 0.65688190f, 0.67155895f, 0.68597711f, 0.70013081f, + 0.71401460f, 0.72762312f, 0.74095113f, 0.75399348f, + 0.76674516f, 0.77920124f, 0.79135693f, 0.80320753f, + 0.81474848f, 0.82597533f, 0.83688375f, 0.84746954f, + 0.85772861f, 0.86765701f, 0.87725091f, 0.88650662f, + 0.89542056f, 0.90398929f, 0.91220953f, 0.92007808f, + 0.92759194f, 0.93474818f, 0.94154407f, 0.94797697f, + 0.95404440f, 0.95974404f, 0.96507367f, 0.97003125f, + 0.97461487f, 0.97882275f, 0.98265328f, 0.98610498f, + 0.98917651f, 0.99186670f, 0.99417450f, 0.99609903f, + 0.99763955f, 0.99879546f, 0.99956631f, 0.99995181f, + 0.99995181f, 0.99956631f, 0.99879546f, 0.99763955f, + 0.99609903f, 0.99417450f, 0.99186670f, 0.98917651f, + 0.98610498f, 0.98265328f, 0.97882275f, 0.97461487f, + 0.97003125f, 0.96507367f, 0.95974404f, 0.95404440f, + 0.94797697f, 0.94154407f, 0.93474818f, 0.92759194f, + 0.92007808f, 0.91220953f, 0.90398929f, 0.89542056f, + 0.88650662f, 0.87725091f, 0.86765701f, 0.85772861f, + 0.84746954f, 0.83688375f, 0.82597533f, 0.81474848f, + 0.80320753f, 0.79135693f, 0.77920124f, 0.76674516f, + 0.75399348f, 0.74095113f, 0.72762312f, 0.71401460f, + 0.70013081f, 0.68597711f, 0.67155895f, 0.65688190f, + 0.64195160f, 0.62677382f, 0.61135441f, 0.59569930f, + 0.57981455f, 0.56370626f, 0.54738066f, 0.53084403f, + 0.51410274f, 0.49716327f, 0.48003212f, 0.46271592f, + 0.44522133f, 0.42755509f, 0.40972403f, 0.39173501f, + 0.37359497f, 0.35531090f, 0.33688985f, 0.31833893f, + 0.29966528f, 0.28087610f, 0.26197864f, 0.24298018f, + 0.22388805f, 0.20470960f, 0.18545224f, 0.16612338f, + 0.14673047f, 0.12728100f, 0.10778246f, 0.08824237f, + 0.06866826f, 0.04906767f, 0.02944817f, 0.00981732f +}; + +const float short_window_32kHz[320] = +{ + 0.00490872f, 0.01472568f, 0.02454123f, 0.03435441f, 0.04416428f, 0.05396989f, + 0.06377030f, 0.07356456f, 0.08335174f, 0.09313088f, 0.10290104f, 0.11266129f, + 0.12241068f, 0.13214826f, 0.14187312f, 0.15158430f, 0.16128086f, 0.17096189f, + 0.18062644f, 0.19027357f, 0.19990237f, 0.20951190f, 0.21910124f, 0.22866946f, + 0.23821564f, 0.24773886f, 0.25723821f, 0.26671276f, 0.27616160f, 0.28558383f, + 0.29497853f, 0.30434480f, 0.31368174f, 0.32298845f, 0.33226402f, 0.34150757f, + 0.35071820f, 0.35989504f, 0.36903718f, 0.37814376f, 0.38721389f, 0.39624670f, + 0.40524131f, 0.41419687f, 0.42311251f, 0.43198737f, 0.44082059f, 0.44961133f, + 0.45835873f, 0.46706195f, 0.47572016f, 0.48433252f, 0.49289819f, 0.50141636f, + 0.50988620f, 0.51830690f, 0.52667764f, 0.53499762f, 0.54326604f, 0.55148209f, + 0.55964499f, 0.56775395f, 0.57580819f, 0.58380693f, 0.59174941f, 0.59963485f, + 0.60746249f, 0.61523159f, 0.62294139f, 0.63059115f, 0.63818013f, 0.64570760f, + 0.65317284f, 0.66057513f, 0.66791374f, 0.67518798f, 0.68239715f, 0.68954054f, + 0.69661748f, 0.70362727f, 0.71056925f, 0.71744274f, 0.72424708f, 0.73098162f, + 0.73764570f, 0.74423869f, 0.75075995f, 0.75720885f, 0.76358476f, 0.76988708f, + 0.77611520f, 0.78226851f, 0.78834643f, 0.79434836f, 0.80027373f, 0.80612197f, + 0.81189252f, 0.81758481f, 0.82319831f, 0.82873246f, 0.83418673f, 0.83956061f, + 0.84485357f, 0.85006509f, 0.85519469f, 0.86024186f, 0.86520612f, 0.87008699f, + 0.87488400f, 0.87959669f, 0.88422459f, 0.88876728f, 0.89322430f, 0.89759523f, + 0.90187965f, 0.90607715f, 0.91018732f, 0.91420976f, 0.91814408f, 0.92198992f, + 0.92574689f, 0.92941463f, 0.93299280f, 0.93648104f, 0.93987902f, 0.94318642f, + 0.94640291f, 0.94952818f, 0.95256194f, 0.95550388f, 0.95835373f, 0.96111122f, + 0.96377607f, 0.96634802f, 0.96882685f, 0.97121229f, 0.97350412f, 0.97570213f, + 0.97780610f, 0.97981582f, 0.98173111f, 0.98355177f, 0.98527764f, 0.98690855f, + 0.98844433f, 0.98988485f, 0.99122996f, 0.99247953f, 0.99363345f, 0.99469160f, + 0.99565388f, 0.99652019f, 0.99729046f, 0.99796460f, 0.99854256f, 0.99902428f, + 0.99940971f, 0.99969882f, 0.99989157f, 0.99998795f, 0.99998795f, 0.99989157f, + 0.99969882f, 0.99940971f, 0.99902428f, 0.99854256f, 0.99796460f, 0.99729046f, + 0.99652019f, 0.99565388f, 0.99469160f, 0.99363345f, 0.99247953f, 0.99122996f, + 0.98988485f, 0.98844433f, 0.98690855f, 0.98527764f, 0.98355177f, 0.98173111f, + 0.97981582f, 0.97780610f, 0.97570213f, 0.97350412f, 0.97121229f, 0.96882685f, + 0.96634802f, 0.96377607f, 0.96111122f, 0.95835373f, 0.95550388f, 0.95256194f, + 0.94952818f, 0.94640291f, 0.94318642f, 0.93987902f, 0.93648104f, 0.93299280f, + 0.92941463f, 0.92574689f, 0.92198992f, 0.91814408f, 0.91420976f, 0.91018732f, + 0.90607715f, 0.90187965f, 0.89759523f, 0.89322430f, 0.88876728f, 0.88422459f, + 0.87959669f, 0.87488400f, 0.87008699f, 0.86520612f, 0.86024186f, 0.85519469f, + 0.85006509f, 0.84485357f, 0.83956061f, 0.83418673f, 0.82873246f, 0.82319831f, + 0.81758481f, 0.81189252f, 0.80612197f, 0.80027373f, 0.79434836f, 0.78834643f, + 0.78226851f, 0.77611520f, 0.76988708f, 0.76358476f, 0.75720885f, 0.75075995f, + 0.74423869f, 0.73764570f, 0.73098162f, 0.72424708f, 0.71744274f, 0.71056925f, + 0.70362727f, 0.69661748f, 0.68954054f, 0.68239715f, 0.67518798f, 0.66791374f, + 0.66057513f, 0.65317284f, 0.64570760f, 0.63818013f, 0.63059115f, 0.62294139f, + 0.61523159f, 0.60746249f, 0.59963485f, 0.59174941f, 0.58380693f, 0.57580819f, + 0.56775395f, 0.55964499f, 0.55148209f, 0.54326604f, 0.53499762f, 0.52667764f, + 0.51830690f, 0.50988620f, 0.50141636f, 0.49289819f, 0.48433252f, 0.47572016f, + 0.46706195f, 0.45835873f, 0.44961133f, 0.44082059f, 0.43198737f, 0.42311251f, + 0.41419687f, 0.40524131f, 0.39624670f, 0.38721389f, 0.37814376f, 0.36903718f, + 0.35989504f, 0.35071820f, 0.34150757f, 0.33226402f, 0.32298845f, 0.31368174f, + 0.30434480f, 0.29497853f, 0.28558383f, 0.27616160f, 0.26671276f, 0.25723821f, + 0.24773886f, 0.23821564f, 0.22866946f, 0.21910124f, 0.20951190f, 0.19990237f, + 0.19027357f, 0.18062644f, 0.17096189f, 0.16128086f, 0.15158430f, 0.14187312f, + 0.13214826f, 0.12241068f, 0.11266129f, 0.10290104f, 0.09313088f, 0.08335174f, + 0.07356456f, 0.06377030f, 0.05396989f, 0.04416428f, 0.03435441f, 0.02454123f, + 0.01472568f, 0.00490872f +}; + +const float short_window_48kHz[480] = +{ + 0.00326538f, 0.00982666f, 0.0163574f, 0.0229187f, 0.0294495f, 0.0359802f, + 0.0425415f, 0.0490723f, 0.055603f, 0.0621338f, 0.0686646f, 0.0751953f, + 0.0817261f, 0.0882568f, 0.0947571f, 0.101288f, 0.107788f, 0.114288f, + 0.120789f, 0.127289f, 0.133759f, 0.140259f, 0.146729f, 0.153198f, + 0.159668f, 0.166138f, 0.172577f, 0.179016f, 0.185455f, 0.191895f, + 0.198303f, 0.204712f, 0.211121f, 0.217499f, 0.223877f, 0.230255f, + 0.236633f, 0.242981f, 0.249329f, 0.255646f, 0.261993f, 0.26828f, + 0.274597f, 0.280884f, 0.28714f, 0.293427f, 0.299652f, 0.305908f, + 0.312134f, 0.318329f, 0.324524f, 0.330719f, 0.336884f, 0.343048f, + 0.349182f, 0.355316f, 0.36142f, 0.367523f, 0.373596f, 0.379669f, + 0.385712f, 0.391724f, 0.397736f, 0.403748f, 0.409729f, 0.41568f, + 0.421631f, 0.427551f, 0.433472f, 0.439362f, 0.445221f, 0.45108f, + 0.456909f, 0.462708f, 0.468506f, 0.474274f, 0.480042f, 0.485748f, + 0.491486f, 0.497162f, 0.502838f, 0.508484f, 0.514099f, 0.519714f, + 0.525299f, 0.530853f, 0.536377f, 0.541901f, 0.547394f, 0.552856f, + 0.558289f, 0.563721f, 0.569092f, 0.574463f, 0.579803f, 0.585144f, + 0.590424f, 0.595703f, 0.600952f, 0.606171f, 0.611359f, 0.616516f, + 0.621674f, 0.62677f, 0.631866f, 0.636932f, 0.641937f, 0.646942f, + 0.651947f, 0.656891f, 0.661804f, 0.666687f, 0.67157f, 0.676392f, + 0.681213f, 0.685974f, 0.690735f, 0.695435f, 0.700134f, 0.704803f, + 0.709412f, 0.71402f, 0.718567f, 0.723114f, 0.727631f, 0.732086f, + 0.736542f, 0.740936f, 0.745331f, 0.749664f, 0.753998f, 0.75827f, + 0.762512f, 0.766754f, 0.770935f, 0.775085f, 0.779205f, 0.783295f, + 0.787354f, 0.791351f, 0.795349f, 0.799286f, 0.803223f, 0.807098f, + 0.810944f, 0.814758f, 0.818512f, 0.822266f, 0.825989f, 0.829651f, + 0.833282f, 0.836884f, 0.840454f, 0.843964f, 0.847473f, 0.850922f, + 0.85434f, 0.857727f, 0.861084f, 0.86438f, 0.867645f, 0.87088f, + 0.874084f, 0.877258f, 0.880371f, 0.883453f, 0.886505f, 0.889526f, + 0.892487f, 0.895416f, 0.898315f, 0.901184f, 0.903992f, 0.906769f, + 0.909515f, 0.912201f, 0.914886f, 0.91748f, 0.920074f, 0.922607f, + 0.92514f, 0.927582f, 0.930023f, 0.932404f, 0.934753f, 0.937042f, + 0.939331f, 0.941559f, 0.943726f, 0.945862f, 0.947968f, 0.950043f, + 0.952057f, 0.954041f, 0.955994f, 0.957886f, 0.959747f, 0.961548f, + 0.963348f, 0.965088f, 0.966766f, 0.968414f, 0.970032f, 0.971588f, + 0.973114f, 0.974609f, 0.976074f, 0.977448f, 0.978821f, 0.980133f, + 0.981415f, 0.982666f, 0.983856f, 0.984985f, 0.986115f, 0.987183f, + 0.98819f, 0.989166f, 0.990112f, 0.990997f, 0.991852f, 0.992676f, + 0.993439f, 0.994171f, 0.994873f, 0.995514f, 0.996094f, 0.996643f, + 0.997162f, 0.99765f, 0.998077f, 0.998444f, 0.99881f, 0.999084f, + 0.999359f, 0.999573f, 0.999725f, 0.999878f, 0.999939f, 0.999969f, + 0.999969f, 0.999939f, 0.999878f, 0.999725f, 0.999573f, 0.999359f, + 0.999084f, 0.99881f, 0.998444f, 0.998077f, 0.99765f, 0.997162f, + 0.996643f, 0.996094f, 0.995514f, 0.994873f, 0.994171f, 0.993439f, + 0.992676f, 0.991852f, 0.990997f, 0.990112f, 0.989166f, 0.98819f, + 0.987183f, 0.986115f, 0.984985f, 0.983856f, 0.982666f, 0.981415f, + 0.980133f, 0.978821f, 0.977448f, 0.976074f, 0.974609f, 0.973114f, + 0.971588f, 0.970032f, 0.968414f, 0.966766f, 0.965088f, 0.963348f, + 0.961548f, 0.959747f, 0.957886f, 0.955994f, 0.954041f, 0.952057f, + 0.950043f, 0.947968f, 0.945862f, 0.943726f, 0.941559f, 0.939331f, + 0.937042f, 0.934753f, 0.932404f, 0.930023f, 0.927582f, 0.92514f, + 0.922607f, 0.920074f, 0.91748f, 0.914886f, 0.912201f, 0.909515f, + 0.906769f, 0.903992f, 0.901184f, 0.898315f, 0.895416f, 0.892487f, + 0.889526f, 0.886505f, 0.883453f, 0.880371f, 0.877258f, 0.874084f, + 0.87088f, 0.867645f, 0.86438f, 0.861084f, 0.857727f, 0.85434f, + 0.850922f, 0.847473f, 0.843964f, 0.840454f, 0.836884f, 0.833282f, + 0.829651f, 0.825989f, 0.822266f, 0.818512f, 0.814758f, 0.810944f, + 0.807098f, 0.803223f, 0.799286f, 0.795349f, 0.791351f, 0.787354f, + 0.783295f, 0.779205f, 0.775085f, 0.770935f, 0.766754f, 0.762512f, + 0.75827f, 0.753998f, 0.749664f, 0.745331f, 0.740936f, 0.736542f, + 0.732086f, 0.727631f, 0.723114f, 0.718567f, 0.71402f, 0.709412f, + 0.704803f, 0.700134f, 0.695435f, 0.690735f, 0.685974f, 0.681213f, + 0.676392f, 0.67157f, 0.666687f, 0.661804f, 0.656891f, 0.651947f, + 0.646942f, 0.641937f, 0.636932f, 0.631866f, 0.62677f, 0.621674f, + 0.616516f, 0.611359f, 0.606171f, 0.600952f, 0.595703f, 0.590424f, + 0.585144f, 0.579803f, 0.574463f, 0.569092f, 0.563721f, 0.558289f, + 0.552856f, 0.547394f, 0.541901f, 0.536377f, 0.530853f, 0.525299f, + 0.519714f, 0.514099f, 0.508484f, 0.502838f, 0.497162f, 0.491486f, + 0.485748f, 0.480042f, 0.474274f, 0.468506f, 0.462708f, 0.456909f, + 0.45108f, 0.445221f, 0.439362f, 0.433472f, 0.427551f, 0.421631f, + 0.41568f, 0.409729f, 0.403748f, 0.397736f, 0.391724f, 0.385712f, + 0.379669f, 0.373596f, 0.367523f, 0.36142f, 0.355316f, 0.349182f, + 0.343048f, 0.336884f, 0.330719f, 0.324524f, 0.318329f, 0.312134f, + 0.305908f, 0.299652f, 0.293427f, 0.28714f, 0.280884f, 0.274597f, + 0.26828f, 0.261993f, 0.255646f, 0.249329f, 0.242981f, 0.236633f, + 0.230255f, 0.223877f, 0.217499f, 0.211121f, 0.204712f, 0.198303f, + 0.191895f, 0.185455f, 0.179016f, 0.172577f, 0.166138f, 0.159668f, + 0.153198f, 0.146729f, 0.140259f, 0.133759f, 0.127289f, 0.120789f, + 0.114288f, 0.107788f, 0.101288f, 0.0947571f, 0.0882568f, 0.0817261f, + 0.0751953f, 0.0686646f, 0.0621338f, 0.055603f, 0.0490723f, 0.0425415f, + 0.0359802f, 0.0294495f, 0.0229187f, 0.0163574f, 0.00982666f, 0.00326538f +}; +const int16_t subf_norm_groups[4][11] = +{ + {0,1,8,9,16,20,24,28,32,36,40}, + {2,3,10,11,17,21,25,29,33,37,41}, + {4,5,12,13,18,22,26,30,34,38,42}, + {6,7,14,15,19,23,27,31,35,39,43} +}; + +const float gain_att[MAX_P_ATT] = +{ + 0.4794745f, 0.5910453f, 0.6647078f, 0.7245839f, 0.7598486f, 0.7912783f, 0.8165831f, 0.8396713f, + 0.8562786f, 0.8716393f, 0.8848335f, 0.8971617f, 0.9061614f, 0.9146075f, 0.9220175f, 0.9290045f, + 0.9344148f, 0.9395265f, 0.9440797f, 0.9484073f, 0.9518549f, 0.9551361f, 0.9581067f, 0.9609474f, + 0.9632704f, 0.9654923f, 0.9675346f, 0.9694900f, 0.9711209f, 0.9726879f, 0.9741332f, 0.9755263f, + 0.9767067f, 0.9778463f, 0.9789108f, 0.9799438f, 0.9808353f, 0.9816967f, 0.9825032f, 0.9832868f +}; + +const Word16 stab_trans_fx[10] = /* Q15 */ +{ + 16384, 11381, 7232, 4292, 2433, + 1341, 728, 391, 209, 112 +}; +const float stab_trans[L_STAB_TBL] = +{ + 0.500000f, 0.347332f, 0.220704f, 0.130976f, 0.074252f, + 0.040937f, 0.022211f, 0.011944f, 0.006392f, 0.003412f +}; + +const float env_stab_tp[2][2] = +{ + {0.999f, 0.5f}, + {0.001f, 0.5f} +}; + +const float att_step[NB_G] = { 4.0000000f, 2.0000000f, 1.3333333f, 1.0000000f}; + +const Word32 table_logcum_fx[563] = +{ + 0, 0, 0, 65536, 169408, 300480, 452650, 622058, 806041, + 1002649, 1210393, 1428099, 1654816, 1889761, 2132272, 2381791, 2637833, + 2899977, 3167853, 3441134, 3719526, 4002767, 4290623, 4582876, 4879332, + 5179812, 5484152, 5792200, 6103816, 6418871, 6737244, 7058822, 7383500, + 7711180, 8041769, 8375181, 8711333, 9050150, 9391557, 9735485, 10081869, + 10430647, 10781759, 11135150, 11490766, 11848556, 12208469, 12570461, 12934487, + 13300503, 13668469, 14038345, 14410092, 14783676, 15159061, 15536214, 15915101, + 16295692, 16677956, 17061866, 17447390, 17834504, 18223180, 18613394, 19005122, + 19398338, 19793020, 20189146, 20586692, 20985640, 21385968, 21787658, 22190686, + 22595040, 23000696, 23407638, 23815850, 24225314, 24636014, 25047934, 25461060, + 25875374, 26290862, 26707510, 27125304, 27544232, 27964278, 28385428, 28807674, + 29231000, 29655392, 30080844, 30507338, 30934866, 31363416, 31792978, 32223540, + 32655092, 33087624, 33521126, 33955588, 34391000, 34827352, 35264636, 35702840, + 36141960, 36581988, 37022908, 37464716, 37907404, 38350964, 38795388, 39240668, + 39686792, 40133760, 40581560, 41030188, 41479632, 41929888, 42380948, 42832808, + 43285456, 43738892, 44193104, 44648088, 45103840, 45560348, 46017612, 46475624, + 46934376, 47393864, 47854080, 48315024, 48776684, 49239060, 49702144, 50165928, + 50630412, 51095588, 51561452, 52028000, 52495224, 52963124, 53431688, 53900916, + 54370808, 54841348, 55312540, 55784380, 56256856, 56729972, 57203720, 57678096, + 58153096, 58628716, 59104952, 59581800, 60059256, 60537316, 61015980, 61495236, + 61975084, 62455524, 62936548, 63418156, 63900340, 64383100, 64866428, 65350328, + 65834792, 66319816, 66805396, 67291536, 67778224, 68265456, 68753240, 69241560, + 69730424, 70219816, 70709744, 71200208, 71691192, 72182704, 72674736, 73167280, + 73660344, 74153920, 74648008, 75142600, 75637704, 76133296, 76629400, 77125992, + 77623080, 78120656, 78618728, 79117280, 79616320, 80115840, 80615832, 81116312, + 81617256, 82118680, 82620568, 83122920, 83625744, 84129024, 84632768, 85136968, + 85641624, 86146728, 86652288, 87158304, 87664760, 88171664, 88679008, 89186792, + 89695016, 90203680, 90712776, 91222304, 91732256, 92242648, 92753464, 93264704, + 93776368, 94288448, 94800952, 95313872, 95827208, 96340960, 96855120, 97369696, + 97884672, 98400064, 98915856, 99432048, 99948648, 100465640, 100983040, 101500832, + 102019016, 102537592, 103056568, 103575928, 104095672, 104615808, 105136328, 105657232, + 106178520, 106700184, 107222232, 107744656, 108267456, 108790632, 109314176, 109838096, + 110362384, 110887040, 111412064, 111937448, 112463208, 112989320, 113515800, 114042640, + 114569832, 115097392, 115625304, 116153568, 116682184, 117211160, 117740480, 118270152, + 118800168, 119330536, 119861248, 120392312, 120923712, 121455448, 121987536, 122519960, + 123052720, 123585816, 124119248, 124653016, 125187120, 125721552, 126256320, 126791416, + 127326840, 127862592, 128398664, 128935072, 129471800, 130008856, 130546224, 131083920, + 131621936, 132160272, 132698920, 133237888, 133777176, 134316768, 134856688, 135396912, + 135937440, 136478288, 137019440, 137560912, 138102688, 138644768, 139187152, 139729840, + 140272832, 140816128, 141359712, 141903616, 142447808, 142992304, 143537104, 144082192, + 144627568, 145173248, 145719232, 146265504, 146812064, 147358912, 147906048, 148453488, + 149001200, 149549216, 150097504, 150646096, 151194960, 151744112, 152293536, 152843264, + 153393264, 153943536, 154494096, 155044944, 155596064, 156147456, 156699120, 157251072, + 157803296, 158355792, 158908560, 159461616, 160014928, 160568512, 161122368, 161676496, + 162230896, 162785568, 163340496, 163895696, 164451168, 165006896, 165562896, 166119152, + 166675664, 167232448, 167789504, 168346816, 168904368, 169462208, 170020288, 170578624, + 171137232, 171696080, 172255200, 172814560, 173374192, 173934064, 174494192, 175054576, + 175615216, 176176096, 176737232, 177298608, 177860256, 178422128, 178984256, 179546640, + 180109264, 180672128, 181235248, 181798608, 182362208, 182926064, 183490144, 184054480, + 184619056, 185183872, 185748928, 186314224, 186879760, 187445520, 188011536, 188577776, + 189144272, 189710992, 190277936, 190845136, 191412560, 191980208, 192548112, 193116224, + 193684592, 194253168, 194821984, 195391040, 195960320, 196529824, 197099568, 197669520, + 198239712, 198810144, 199380784, 199951648, 200522752, 201094080, 201665616, 202237392, + 202809376, 203381600, 203954032, 204526688, 205099568, 205672672, 206246000, 206819536, + 207393296, 207967280, 208541472, 209115888, 209690528, 210265376, 210840432, 211415712, + 211991216, 212566912, 213142848, 213718976, 214295328, 214871888, 215448672, 216025664, + 216602864, 217180272, 217757888, 218335712, 218913760, 219492000, 220070464, 220649120, + 221228000, 221807072, 222386368, 222965856, 223545552, 224125456, 224705568, 225285872, + 225866400, 226447120, 227028032, 227609168, 228190496, 228772016, 229353760, 229935680, + 230517824, 231100160, 231682688, 232265424, 232848352, 233431472, 234014800, 234598336, + 235182048, 235765968, 236350080, 236934400, 237518896, 238103600, 238688496, 239273600, + 239858880, 240444352, 241030032, 241615888, 242201952, 242788192, 243374640, 243961264, + 244548096, 245135104, 245722304, 246309696, 246897280, 247485056, 248073008, 248661152, + 249249488, 249838016, 250426720, 251015616, 251604704, 252193968, 252783424, 253373056, + 253962880, 254552896, 255143088, 255733472, 256324032, 256914768, 257505696, 258096800, + 258688096, 259279568, 259871216, 260463056, 261055056, 261647264, 262239632, 262832192, + 263424928, 264017840, 264610928, 265204192, 265797632, 266391264, 266985072, 267579040, + 268173200, 268767520, 269362048, 269956736, 270551584, 271146624, 271741824, 272337216, + 272932768, 273528480, 274124384, 274720480, 275316704, 275913120, 276509728, 277106496, + 277703424, 278300544, 278897824, 279495264, 280092896, 280690688, 281288640, 281886752, + 282485056, 283083520 +}; +const Word32 pow_getbitsfrompulses_fx[16] = /*Q21 */ +{ + 2097152, 2190001, 2286961, 2388214, 2493948, 2604365, 2719671, 2840081, + 2965822, 3097129, 3234251, 3377442, 3526976, 3683128, 3846194, 4016480 +}; +const Word16 DDP_fx[4] = { 3, 0, 1, 2 }; + +const float DDP[4] = { 3.0f, 0.0f, 1.0f, 2.0f }; + + +const int16_t step_tcq[8][STATES] = { {0,4}, {0,4}, {1,5}, {1,5}, {2,6}, {2,6}, {3,7}, {3,7} }; +const int16_t denc[8][STATES] = { {0,2}, {2,0}, {1,3}, {3,1}, {2,0}, {0,2}, {3,1}, {1,3} }; /* enc trellis */ +const int16_t ddec[8][STATES] = { {0,2}, {1,3}, {2,0}, {3,1}, {2,0}, {3,1}, {0,2}, {1,3} }; /* dec trellis */ + + +const int16_t step_LSB[STATES_LSB][2] = { {0,1}, {2,3}, {0,1}, {2,3} }; +const int16_t denc_LSB[STATES_LSB][2] = { {0,3}, {2,1}, {3,0}, {1,2} }; +const int16_t dqnt_LSB[STATES_LSB][4] = { {0,8,1,8}, {0,8,1,8}, {8,0,8,1}, {8,0,8,1} }; + +const int16_t dstep_LSB[4][2] = { {0,2}, {0,2}, {1,3}, {1,3} }; +const int16_t ddec_LSB[4][2] = { {0,3}, {3,0}, {2,1}, {1,2} }; + + +const int16_t nextstate[STATES][2] = {{0, 1}, {2, 3}, {4, 5}, {6, 7}, {0, 1}, {2, 3}, {4, 5}, {6, 7}};/*current state points to next two states */ + +/*------------------------------------------------------------------------------* + * PVQ tables + *------------------------------------------------------------------------------*/ + +const int16_t fine_gain_bits[8] = {0, 0, 0, 1, 2, 2, 4, 5}; +const float finegain_1[2] = {-0.7448924f, 0.7718827f}; +const float finegain_2[4] = {-1.0847910f, -0.3616628f, 0.3668007f, 1.1455675f}; +const float finegain_3[8] = {-1.0000000f, -0.7142857f, -0.4285714f, -0.1428571f, 0.1428571f, 0.4285714f, 0.7142857f, 1.0000000f}; +const float finegain_4[16] = {-1.3234321f, -1.1164439f, -0.9153915f, -0.7248241f, -0.5453916f, -0.3807825f, -0.2259278f, -0.0836715f, 0.0576803f, 0.1999166f, 0.3715899f, 0.5541582f, 0.7598588f, 0.9764980f, 1.2082281f, 1.4567725f}; +const float finegain_5[32] = {-1.3099370f, -1.1532731f, -0.9939113f, -0.8627403f, -0.7693628f, -0.6901322f, -0.6188556f, -0.5438313f, -0.4899869f, -0.4145289f, -0.3440915f, -0.2936875f, -0.2241453f, -0.1636186f, -0.1052746f, -0.0292431f, 0.0273763f, 0.0848355f, 0.1443042f, 0.2095194f, 0.2794882f, 0.3366661f, 0.4131591f, 0.4740591f, 0.5545165f, 0.6196313f, 0.6719442f, 0.7650533f, 0.9012053f, 1.0432675f, 1.2264170f, 1.5085750f}; +const float * const finegain[5] = { finegain_1, finegain_2, finegain_3, finegain_4, finegain_5 }; + + +const uint8_t hBitsMinus1_N01[2] = {1, 7}; + +const uint8_t hBitsMinus1_N02[65]= +{ + 64, 15, 23, 28, 31, 34, 36, 38, 39, 41, 42, 43, 44, 45, 46, 47, + 47, 48, 49, 49, 50, 51, 52, 53, 54, 54, 55, 56, 57, 57, 58, 59, + 60, 61, 62, 63, 63, 64, 65, 65, 67, 68, 69, 69, 70, 71, 72, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 80, 81, 82, 83, 84, 85, 86, 87, + 87 +}; + +const uint8_t hBitsMinus1_N03[65]= +{ + 64, 20, 33, 41, 48, 53, 57, 61, 64, 66, 69, 71, 73, 75, 76, 78, + 80, 81, 82, 83, 85, 86, 88, 90, 92, 93, 95, 96, 98, 99, 100, 102, + 104, 106, 108, 110, 111, 113, 114, 115, 118, 120, 122, 123, 125, 127, 128, 129, + 131, 133, 135, 137, 139, 141, 142, 144, 145, 146, 149, 151, 153, 155, 157, 158, + 160 +}; + +const uint8_t hBitsMinus1_N04[65]= +{ + 64, 23, 39, 51, 60, 67, 73, 79, 83, 87, 91, 94, 97, 100, 102, 105, + 107, 109, 111, 113, 115, 116, 119, 122, 125, 127, 130, 132, 134, 136, 138, 141, + 144, 147, 150, 152, 154, 156, 158, 160, 164, 167, 170, 173, 175, 177, 180, 182, + 184, 187, 190, 193, 196, 199, 201, 203, 205, 207, 211, 214, 217, 220, 222, 225, + 227 +}; + +const uint8_t hBitsMinus1_N05[54]= +{ + 53, 26, 45, 59, 70, 79, 87, 94, 100, 105, 110, 114, 118, 122, 125, 128, + 131, 134, 136, 139, 141, 144, 148, 152, 155, 158, 161, 164, 167, 170, 172, 176, + 181, 184, 188, 191, 194, 197, 200, 202, 207, 211, 215, 219, 222, 225, 228, 231, + 233, 238, 242, 246, 250, 253 +}; + +const uint8_t hBitsMinus1_N06[42]= +{ + 41, 28, 49, 65, 78, 89, 99, 107, 114, 120, 126, 132, 136, 141, 145, 149, + 153, 156, 159, 162, 165, 168, 173, 178, 183, 187, 191, 194, 198, 201, 204, 209, + 214, 219, 224, 228, 231, 235, 238, 241, 247, 253 +}; + +const uint8_t hBitsMinus1_N07[34]= +{ + 33, 30, 52, 70, 85, 98, 109, 118, 126, 134, 141, 147, 153, 158, 163, 168, + 172, 176, 180, 184, 188, 191, 197, 203, 208, 213, 218, 222, 226, 230, 233, 240, + 246, 252 +}; + +const uint8_t hBitsMinus1_N08[29]= +{ + 28, 31, 55, 75, 91, 105, 117, 128, 138, 146, 154, 161, 168, 174, 180, 185, + 190, 195, 200, 204, 208, 212, 219, 226, 232, 238, 243, 248, 253 +}; + +const uint8_t hBitsMinus1_N09[25]= +{ + 24, 33, 58, 79, 97, 112, 125, 137, 148, 157, 166, 174, 182, 189, 195, 201, + 207, 212, 217, 222, 227, 231, 240, 247, 254 +}; + +const uint8_t hBitsMinus1_N10[22]= +{ + 21, 34, 61, 83, 101, 118, 132, 145, 157, 167, 177, 186, 194, 202, 209, 216, + 222, 228, 234, 239, 245, 250 +}; + +const uint8_t hBitsMinus1_N11[19]= +{ + 18, 35, 63, 86, 106, 123, 139, 152, 165, 176, 187, 197, 206, 214, 222, 230, + 237, 243, 250 +}; + +const uint8_t hBitsMinus1_N12[17]= +{ + 16, 36, 65, 89, 110, 128, 144, 159, 173, 185, 196, 207, 217, 226, 234, 242, + 250 +}; + +const uint8_t hBitsMinus1_N13[16]= +{ + 15, 37, 67, 92, 113, 133, 150, 165, 180, 193, 205, 216, 227, 237, 246, 254, +}; + +const uint8_t hBitsMinus1_N14[14]= +{ + 13, 38, 68, 94, 117, 137, 155, 171, 186, 200, 213, 225, 236, 247 +}; + +const uint8_t hBitsMinus1_N15[13]= +{ + 12, 39, 70, 97, 120, 141, 160, 177, 193, 207, 221, 233, 245 +}; + +const uint8_t hBitsMinus1_N16[13]= +{ + 12, 39, 71, 99, 123, 144, 164, 182, 198, 214, 228, 241, 253 +}; + +const uint8_t hBitsMinus1_N17[12]= +{ + 11, 40, 73, 101, 126, 148, 168, 187, 204, 220, 234, 248 +}; + +const uint8_t hBitsMinus1_N18[12]= +{ + 11, 41, 74, 103, 128, 151, 172, 191, 209, 225, 241, 255 +}; + +const uint8_t hBitsMinus1_N19[11]= +{ + 10, 41, 75, 105, 131, 154, 176, 196, 214, 231, 247 +}; + +const uint8_t hBitsMinus1_N20[11]= +{ + 10, 42, 77, 107, 133, 157, 179, 200, 219, 236, 253 +}; + +const uint8_t hBitsMinus1_N21[10]= +{ + 9, 43, 78, 108, 135, 160, 183, 204, 223, 241 +}; + +const uint8_t hBitsMinus1_N22[10]= +{ + 9, 43, 79, 110, 138, 163, 186, 207, 227, 246 +}; + +const uint8_t hBitsMinus1_N23[10]= +{ + 9, 44, 80, 111, 140, 165, 189, 211, 231, 250 +}; + +const uint8_t hBitsMinus1_N24[10]= +{ + 9, 44, 81, 113, 142, 168, 192, 214, 235, 255 +}; + +const uint8_t hBitsMinus1_N25[9]= +{ + 8, 45, 82, 114, 143, 170, 195, 217, 239 +}; + +const uint8_t hBitsMinus1_N26[9]= +{ + 8, 45, 83, 116, 145, 172, 197, 221, 242 +}; + +const uint8_t hBitsMinus1_N27[9]= +{ + 8, 46, 84, 117, 147, 175, 200, 224, 246 +}; + +const uint8_t hBitsMinus1_N28[9]= +{ + 8, 46, 84, 118, 149, 177, 202, 227, 249 +}; +const uint8_t hBitsMinus1_N29[9]= +{ + 8, 46, 85, 119, 150, 179, 205, 229, 252 +}; +const uint8_t hBitsMinus1_N30[8]= +{ + 7, 47, 86, 121, 152, 181, 207, 232 +}; +const uint8_t hBitsMinus1_N31[8]= +{ + 7, 47, 87, 122, 153, 182, 209, 235 +}; +const uint8_t hBitsMinus1_N32[8]= +{ + 7, 47, 87, 123, 155, 184, 212, 237 +}; +const uint8_t hBitsMinus1_N33[8]= +{ + 7, 48, 88, 124, 156, 186, 214, 240 +}; +const uint8_t hBitsMinus1_N34[8]= +{ + 7, 48, 89, 125, 158, 188, 216, 242 +}; +const uint8_t hBitsMinus1_N35[8]= +{ + 7, 49, 90, 126, 159, 189, 218, 245 +}; +const uint8_t hBitsMinus1_N36[8]= +{ + 7, 49, 90, 127, 160, 191, 220, 247 +}; +const uint8_t hBitsMinus1_N37[8]= +{ + 7, 49, 91, 128, 162, 193, 222, 249 +}; +const uint8_t hBitsMinus1_N38[8]= +{ + 7, 49, 91, 129, 163, 194, 224, 251 +}; +const uint8_t hBitsMinus1_N39[8]= +{ + 7, 50, 92, 130, 164, 196, 225, 253 +}; +const uint8_t hBitsMinus1_N40[8]= +{ + 7, 50, 93, 131, 165, 197, 227, 255 +}; +const uint8_t hBitsMinus1_N41[7]= +{ + 6, 50, 93, 131, 166, 199, 229 +}; +const uint8_t hBitsMinus1_N42[7]= +{ + 6, 51, 94, 132, 167, 200, 230 +}; +const uint8_t hBitsMinus1_N43[7]= +{ + 6, 51, 94, 133, 168, 201, 232 +}; +const uint8_t hBitsMinus1_N44[7]= +{ + 6, 51, 95, 134, 170, 203, 234 +}; +const uint8_t hBitsMinus1_N45[7]= +{ + 6, 51, 95, 135, 171, 204, 235 +}; +const uint8_t hBitsMinus1_N46[7]= +{ + 6, 52, 96, 135, 172, 205, 237 +}; +const uint8_t hBitsMinus1_N47[7]= +{ + 6, 52, 96, 136, 173, 206, 238 +}; +const uint8_t hBitsMinus1_N48[7]= +{ + 6, 52, 97, 137, 174, 208, 240 +}; +const uint8_t hBitsMinus1_N49[7]= +{ + 6, 52, 97, 138, 175, 209, 241 +}; +const uint8_t hBitsMinus1_N50[7]= +{ + 6, 53, 98, 138, 175, 210, 243 +}; +const uint8_t hBitsMinus1_N51[7]= +{ + 6, 53, 98, 139, 176, 211, 244 +}; +const uint8_t hBitsMinus1_N52[7]= +{ + 6, 53, 99, 140, 177, 212, 245 +}; +const uint8_t hBitsMinus1_N53[7]= +{ + 6, 53, 99, 140, 178, 213, 247 +}; +const uint8_t hBitsMinus1_N54[7]= +{ + 6, 54, 100, 141, 179, 214, 248 +}; +const uint8_t hBitsMinus1_N55[7]= +{ + 6, 54, 100, 142, 180, 216, 249 +}; +const uint8_t hBitsMinus1_N56[7]= +{ + 6, 54, 100, 142, 181, 217, 250 +}; +const uint8_t hBitsMinus1_N57[7]= +{ + 6, 54, 101, 143, 181, 218, 252 +}; +const uint8_t hBitsMinus1_N58[7]= +{ + 6, 54, 101, 143, 182, 219, 253 +}; +const uint8_t hBitsMinus1_N59[7]= +{ + 6, 55, 102, 144, 183, 220, 254 +}; +const uint8_t hBitsMinus1_N60[7]= +{ + 6, 55, 102, 145, 184, 221, 255 +}; +const uint8_t hBitsMinus1_N61[6]= +{ + 5, 55, 102, 145, 185, 221 +}; +const uint8_t hBitsMinus1_N62[6]= +{ + 5, 55, 103, 146, 185, 222 +}; +const uint8_t hBitsMinus1_N63[6]= +{ + 5, 55, 103, 146, 186, 223 +}; +const uint8_t hBitsMinus1_N64[6]= +{ + 5, 55, 103, 147, 187, 224 +}; +const int16_t dsHighDiracsTab[PVQ_MAX_BAND_SIZE - DS_INDEX_LINEAR_END ] = +{ + 23, 25, 27, 29, 31, 33, 35, 37, 39, + 43, 47, 51, 55, 59, 63, 67, 71, 75, + 83, 91, 99, 107, 115, 123, 131, 139, 147, + 163, 179, 195, 211, 227, 243, 259, 275, 291, + 323, 355, 387, 419, 451, 483, 512 +}; + +const uint32_t intLimCDivInvDQ31[67+1] = +{ + 0x00000000, 0x80000000, 0x40000000, 0x2aaaaaab, 0x20000000, 0x1999999a, 0x15555556, 0x12492493, + 0x10000000, 0x0e38e38f, 0x0ccccccd, 0x0ba2e8bb, 0x0aaaaaab, 0x09d89d8a, 0x0924924a, 0x08888889, + 0x08000000, 0x07878788, 0x071c71c8, 0x06bca1b0, 0x06666667, 0x06186187, 0x05d1745e, 0x0590b217, + 0x05555556, 0x051eb852, 0x04ec4ec5, 0x04bda130, 0x04924925, 0x0469ee59, 0x04444445, 0x04210843, + 0x04000000, 0x03e0f83f, 0x03c3c3c4, 0x03a83a84, 0x038e38e4, 0x03759f23, 0x035e50d8, 0x03483484, + 0x03333334, 0x031f3832, 0x030c30c4, 0x02fa0be9, 0x02e8ba2f, 0x02d82d83, 0x02c8590c, 0x02b93106, + 0x02aaaaab, 0x029cbc15, 0x028f5c29, 0x02828283, 0x02762763, 0x026a43a0, 0x025ed098, 0x0253c826, + 0x02492493, 0x023ee090, 0x0234f72d, 0x022b63cc, 0x02222223, 0x02192e2a, 0x02108422, 0x02082083, + 0x02000000, 0x01f81f82, 0x01f07c20, 0x01e9131b +}; + +const uint8_t obtainEnergyQuantizerDensity_f[57] = + { + 1, 1, 1, 1, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 4, 4, 4, + 4, 4, 4, 6, 6, 6, 6, 8, + 8, 8, 10,10,12,12,14,14, + 16,18,20,20,22,24,26,30, + 32,34,38,42,46,50,54,58, + 64,70,76,82,90,98,108,118, 128 +}; + + +/* (char)ceil(log2(hBitsN[N][0])) - 2) */ +const uint8_t f_log2_n[ PVQ_MAX_BAND_SIZE + 1] = +{ + 0xff, 0xff, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x03, 0x03, 0x03, 0x03, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01}; + +const uint8_t * const hBitsN[ PVQ_MAX_BAND_SIZE + 1 ]= +{ +f_log2_n/*N=0*/, hBitsMinus1_N01, hBitsMinus1_N02, hBitsMinus1_N03, hBitsMinus1_N04, +hBitsMinus1_N05, hBitsMinus1_N06, hBitsMinus1_N07, hBitsMinus1_N08, hBitsMinus1_N09, +hBitsMinus1_N10, hBitsMinus1_N11, hBitsMinus1_N12, hBitsMinus1_N13, hBitsMinus1_N14, +hBitsMinus1_N15, hBitsMinus1_N16, hBitsMinus1_N17, hBitsMinus1_N18, hBitsMinus1_N19, +hBitsMinus1_N20, hBitsMinus1_N21, hBitsMinus1_N22, hBitsMinus1_N23, hBitsMinus1_N24, +hBitsMinus1_N25, hBitsMinus1_N26, hBitsMinus1_N27, hBitsMinus1_N28, hBitsMinus1_N29, +hBitsMinus1_N30, hBitsMinus1_N31, hBitsMinus1_N32, hBitsMinus1_N33, hBitsMinus1_N34, +hBitsMinus1_N35, hBitsMinus1_N36, hBitsMinus1_N37, hBitsMinus1_N38, hBitsMinus1_N39, +hBitsMinus1_N40, hBitsMinus1_N41, hBitsMinus1_N42, hBitsMinus1_N43, hBitsMinus1_N44, +hBitsMinus1_N45, hBitsMinus1_N46, hBitsMinus1_N47, hBitsMinus1_N48, hBitsMinus1_N49, +hBitsMinus1_N50, hBitsMinus1_N51, hBitsMinus1_N52, hBitsMinus1_N53, hBitsMinus1_N54, +hBitsMinus1_N55, hBitsMinus1_N56, hBitsMinus1_N57, hBitsMinus1_N58, hBitsMinus1_N59, +hBitsMinus1_N60, hBitsMinus1_N61, hBitsMinus1_N62, hBitsMinus1_N63, hBitsMinus1_N64, +}; + +const int16_t lim_neg_inv_tbl_fx[MAX_SPLITS + 1 ] = +{ /* 1 = optimized inv_tbl_fx constant for div by 1, Q15 */ + /* 2-10 = negated inv_tbl_fx Q15*/ + 0, + -32768, -16384, -10923, -8192, -6554, + -5462, -4681, -4096, -3641, -3277 +}; + +const int16_t fg_inv_tbl_fx [HQ_MAX_BAND_LEN/8 + 1 ] = +{ /* i/8 , slice of inv_tbl_fx , Q15 */ + 0, + 4096, 2048, 1366, 1024, 820, 683, + 586, 512, 456, 410, 373, 342 +}; + + +const uint32_t exactdivodd[ODD_DIV_SIZE] = +{ + /* exactdivodd[0]=1/1, exactdivodd[1]=1/3, exactdivodd[n]=1/(2*n+1), exactdivodd[47]=1/95 ) */ + 1U, 2863311531U, 3435973837U, 3067833783U, 954437177U, 3123612579U, 3303820997U, 4008636143U, + 4042322161U, 678152731U, 1022611261U, 3921491879U, 3264175145U, 1749801491U, 1332920885U, 3186588639U, + 1041204193U, 2331553675U, 2437684141U, 2532929431U, 3247414297U, 799063683U, 2767867813U, 1736263375U, + 438261969U, 4210752251U, 2350076445U, 1483715975U, 3089362441U, 2693454067U, 3238827797U, 3204181951U, + 3237744577U, 128207979U, 2738819725U, 3811027319U, 3353604601U, 2519714147U, 1059797125U, 1631000239U, + 2014922929U, 724452315U, 4244438269U, 1875962727U, 4198451177U, 3539808211U, 1062196213U, 3571604383U +}; + +const int16_t gain_cb_size[MAX_GAIN_BITS] = {2, 4, 8, 16, 32}; + +const int16_t inner_frame_tbl[4] = {L_FRAME8k, L_FRAME16k, L_FRAME32k, L_FRAME48k}; /* corresponds to NB, WB, SWB, FB */ + +const int16_t l_spec_tbl[4] = {L_SPEC8k, L_SPEC16k, L_SPEC32k, L_SPEC48k}; /* corresponds to NB, WB, SWB, FB */ +const int16_t l_spec_ext_tbl[4] = {0, L_SPEC16k_EXT, L_SPEC32k_EXT, L_SPEC48k_EXT}; /* corresponds to NB, WB, SWB, FB */ + +/*------------------------------------------------------------------------------* + * LR-MDCT tables + *------------------------------------------------------------------------------*/ + +/* subband width tables */ + +/* NB short win: 7200/8000/9600, 13200/16400/24400 */ +const int16_t band_width_40_4_6_0_0_0[4] = { 6, 8, 11, 15 }; +const int16_t band_width_40_5_6_0_0_0[5] = { 6, 7, 7, 9, 11 }; + +/* NB long win: 7200, 8000, 9600, 13200, 16400 */ +const int16_t band_width_160_13_6_2_0_0[13] = { 6, 6, 6, 6, 7, 8, 9, 10, 13, 15, 19, 24, 31 }; +const int16_t band_width_160_14_6_3_0_0[14] = { 6, 6, 6, 6, 6, 7, 8, 9, 10, 12, 15, 18, 22, 29 }; +const int16_t band_width_160_17_6_3_0_0[17] = { 6, 6, 6, 6, 6, 6, 7, 7, 8, 8, 9, 10, 11, 13, 15, 17, 19 }; +const int16_t band_width_160_18_6_4_0_0[18] = { 6, 6, 6, 6, 6, 6, 6, 7, 7, 8, 8, 9, 10, 11, 12, 14, 15, 17 }; + +/* WB short win: 13200/16400/24400 */ +const int16_t band_width_80_7_6_0_0_0[7] = { 6, 7, 8, 10, 12, 16, 21 }; + +/* WB long win: 13200, 16400 */ +const int16_t band_width_320_18_6_3_0_0[18] = { 6, 6, 6, 6, 6, 7, 7, 8, 10, 11, 13, 16, 19, 24, 30, 37, 47, 61 }; +const int16_t band_width_320_20_6_3_0_0[20] = { 6, 6, 6, 6, 6, 6, 7, 8, 8, 9, 11, 12, 14, 17, 20, 23, 28, 34, 42, 51 }; + +/* SWB short win: 13200, 16400 */ +const int16_t band_width_142_8_8_0_0_0[8] = {7,8,10,11,15,21,29,41}; +const int16_t band_width_160_8_8_0_0_0[8] = { 8, 9, 11,13,17,23,32,47}; + +/* SWB long win: 13200, 16400 */ +const int16_t band_width_568_22_6_2_0_0[22] = { 6, 6, 6, 6, 6, 6, 7, 8, 9, 10, 11, 13, 16, 19, 23, 28, 34, 42, 55, 68, 84, 105}; +const int16_t band_width_640_24_6_4_0_0[24] = { 6, 6, 6, 6, 6, 6, 7,7,8,9,10,11,13,15,18,21,26,32,39,48,59, 74,92,115}; + +/* LR-MDCT: NB configuration tables */ +const Xcore_Config xcore_config_8kHz_007200bps_long = { 13, L_FRAME8k, band_width_160_13_6_2_0_0, 536870912L, 24576, 13107, 2, 2, 0, 0.0f, 0.40f, 0.13f, 1.2f, 0.32f }; +const Xcore_Config xcore_config_8kHz_008000bps_long = { 14, L_FRAME8k, band_width_160_14_6_3_0_0, 536870912L, 24576, 13107, 2, 2, 0, 0.0f, 0.40f, 0.13f, 1.2f, 0.32f }; +const Xcore_Config xcore_config_8kHz_013200bps_long = { 17, L_FRAME8k, band_width_160_17_6_3_0_0, 429496730L, 24576, 13107, 2, 4, 2, 12.0f, 0.40f, 0.13f, 1.2f, 0.32f }; +const Xcore_Config xcore_config_8kHz_016400bps_long = { 18, L_FRAME8k, band_width_160_18_6_4_0_0, 322122547L, 24576, 13107, 2, 2, 0, 0.0f, 0.40f, 0.13f, 1.2f, 0.32f }; + +const Xcore_Config xcore_config_8kHz_007200bps_short = { 4, L_FRAME8k / NUM_TIME_SWITCHING_BLOCKS, band_width_40_4_6_0_0_0, 966367642L, 24576, 13107, 2, 2, 0, 0.0f, 0.30f, 0.09f, 1.2f, 0.32f }; +const Xcore_Config xcore_config_8kHz_008000bps_short = { 4, L_FRAME8k / NUM_TIME_SWITCHING_BLOCKS, band_width_40_4_6_0_0_0, 1181116006L, 24576, 13107, 2, 4, 0, 0.0f, 0.30f, 0.09f, 1.2f, 0.32f }; +const Xcore_Config xcore_config_8kHz_013200bps_short = { 5, L_FRAME8k / NUM_TIME_SWITCHING_BLOCKS, band_width_40_5_6_0_0_0, 751619276L, 24576, 11469, 2, 4, 0, 0.0f, 0.70f, 0.11f, 1.2f, 0.32f }; +const Xcore_Config xcore_config_8kHz_016400bps_short = { 5, L_FRAME8k / NUM_TIME_SWITCHING_BLOCKS, band_width_40_5_6_0_0_0, 536870912L, 24576, 11469, 2, 6, 0, 0.0f, 0.90f, 0.11f, 1.2f, 0.32f }; + +/* LR-MDCT: WB configuration tables */ +const Xcore_Config xcore_config_16kHz_013200bps_long = { 18, L_FRAME16k, band_width_320_18_6_3_0_0, 429496730L, 24576, 13106, 2, 6, 3, 12.0f, 0.40f, 0.12f, 1.1f, 0.32f }; +const Xcore_Config xcore_config_16kHz_016400bps_long = { 20, L_FRAME16k, band_width_320_20_6_3_0_0, 429496730L, 24576, 13106, 2, 6, 3, 12.0f, 0.40f, 0.12f, 1.2f, 0.32f }; + +const Xcore_Config xcore_config_16kHz_013200bps_short = { 7, L_FRAME16k / NUM_TIME_SWITCHING_BLOCKS, band_width_80_7_6_0_0_0, 966367642L, 24576, 9830, 2, 4, 0, 0.0f, 0.30f, 0.13f, 1.1f, 0.32f }; +const Xcore_Config xcore_config_16kHz_016400bps_short = { 7, L_FRAME16k / NUM_TIME_SWITCHING_BLOCKS, band_width_80_7_6_0_0_0, 966367642L, 24576, 11468, 2, 8, 0, 0.0f, 0.30f, 0.13f, 1.2f, 0.32f }; + +/* LR-MDCT: SWB configuration tables */ +const Xcore_Config xcore_config_32kHz_013200bps_long = { 22, 568, band_width_568_22_6_2_0_0, 322122547L, 24576, 6554, 2, 4, 5, 14.0f, 0.40f, 0.13f, 1.2f, 0.26f }; +const Xcore_Config xcore_config_32kHz_016400bps_long = { 24, 640, band_width_640_24_6_4_0_0, 322122547L, 24576, 8192, 2, 4, 5, 14.0f, 0.40f, 0.13f, 1.2f, 0.26f }; +const Xcore_Config xcore_config_32kHz_013200bps_short = { 8, 568 / NUM_TIME_SWITCHING_BLOCKS, band_width_142_8_8_0_0_0, 1610612736L, 24576, 13107, 2, 4, 0, 0.0f, 0.50f, 0.11f, 1.2f, 0.48f }; +const Xcore_Config xcore_config_32kHz_016400bps_short = { 8, 640 / NUM_TIME_SWITCHING_BLOCKS, band_width_160_8_8_0_0_0, 644245094L, 24576, 8192, 2, 4, 0, 0.0f, 0.30f, 0.13f, 1.2f, 0.32f }; + +/* bandwidths */ +const int16_t Nb[ NB_SFM] = +{ + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 16, 16, 16, 16, + 16, 16, 16, 16, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 32, 32, 32, 32, 32, 32, 32, 32 +}; + +/* log2(Nb) to calculate minimum bits for one pulse in PVQ */ +const int16_t LNb[ NB_SFM] = +{ + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, + 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5 +}; + + +/*------------------------------------------------------------------------------* + * GSC tables + *------------------------------------------------------------------------------*/ + +const int16_t gsc_sfm_start[MBANDS_GN] = {0, 16, 32, 48, 64, 80, 96, 112, 128, 144, 160, 176, 192, 208, 224, 240}; + +const int16_t gsc_sfm_end[MBANDS_GN] = {16, 32, 48, 64, 80, 96, 112, 128, 144, 160, 176, 192, 208, 224, 240, 256}; + +const int16_t gsc_sfm_size[MBANDS_GN] = {16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16}; + +const float sm_table[] = +{ + 1.0f, 0.9804f, 0.9607f, 0.9411f, 0.9215f, 0.902f, 0.8825f, 0.863f, + 0.8436f, 0.8242f, 0.8049f, 0.7857f, 0.7666f, 0.7475f, 0.7286f, 0.7097f, 0.691f, 0.6724f, + 0.6539f, 0.6355f, 0.6173f, 0.5993f, 0.5813f, 0.5636f, 0.546f, 0.5286f, 0.5114f, 0.4943f, + 0.4775f, 0.4609f, 0.4444f, 0.4282f, 0.4122f, 0.3964f, 0.3809f, 0.3656f, 0.3506f, 0.3357f, + 0.3212f, 0.3069f, 0.2929f, 0.2791f, 0.2657f, 0.2525f, 0.2396f, 0.227f, 0.2147f, 0.2027f, + 0.191f, 0.1796f, 0.1685f, 0.1578f, 0.1474f, 0.1373f, 0.1275f, 0.1181f, 0.109f, 0.1003f, + 0.0919f, 0.0838f, 0.0761f, 0.0688f, 0.0618f, 0.0552f, 0.0489f, 0.0431f, 0.0375f, 0.0324f, + 0.0276f, 0.0232f, 0.0192f, 0.0156f, 0.0123f, 0.0094f, 0.0069f, 0.0048f, 0.0031f, 0.0017f, + 0.0008f, 0.0002f +}; + +const int16_t GSC_freq_bits[] = +{ + 21, 66, -6, 25, 15, 11, 10, 5, 0, 0, 5, 4, 0, 0, 4, 0, 0, /* ACELP_5k00*/ + 21, 66, -6, 25, 15, 11, 10, 5, 0, 0, 5, 4, 0, 0, 4, 0, 0, /* ACELP_6k15*/ + 21, 66, -6, 25, 15, 11, 10, 5, 0, 0, 5, 4, 0, 0, 4, 0, 0, /* ACELP_7k20*/ + 21, 74, -4, 26, 16, 12, 11, 9, 0, 0, 4, 4, 1, 1, 3, 0, 0, /* ACELP_8k00*/ + 26, 80, -3, 28, 18, 13, 12, 9, 0, 0, 4, 4, 1, 1, 3, 0, 0, /* ACELP_9k60*/ + 26, 96, -4, 28, 18, 13, 12,10,10, 5, 4, 4, 1, 0, 1, 3, 4, /* ACELP_11k60*/ + 26, 96, -4, 28, 18, 13, 12,10,10, 5, 4, 4, 1, 0, 1, 3, 4, /* ACELP_12k15*/ + 26, 96, -4, 28, 18, 13, 12,10,10, 5, 4, 4, 1, 0, 1, 3, 4, /* ACELP_12k85*/ + 26, 96, -4, 28, 18, 13, 12,10,10, 5, 4, 4, 1, 0, 1, 3, 4, /* ACELP_13k20*/ + 26, 96, -1, 28, 18, 13, 12,10,10, 5, 4, 4, 1, 0, 1, 3, 4, /* ACELP_14k80*/ + 26, 96, -1, 28, 18, 13, 12,10,10, 5, 4, 4, 1, 0, 1, 3, 4, /* ACELP_16k40*/ + 26, 96, 0, 28, 18, 13, 12,10,10, 5, 4, 4, 1, 0, 1, 3, 4, /* ACELP_22k60*/ + 26, 96, 0, 28, 18, 13, 12,10,10, 5, 4, 4, 1, 0, 1, 3, 4 /* ACELP_24k40*/ +}; + +const int16_t Compl_GSC_freq_bits[] = +{ + 5, 10, 10, 10 /* bitrate > ACELP_16k40 && FS = 16kHz */ +}; + +const float mfreq_loc[] = +{ + 175.0f, 375.0f, 775.0f, 1175.0f, 1575.0f, 1975.0f, 2375.0f, 2775.0f, 3175.0f, 3575.0f, 3975.0f, + 4375.0f, 4775.0f, 5175.0f, 5575.0f, 6375.0f, 7175.0f, 7975.0f +}; + +const int16_t mfreq_bindiv_loc[] = { 8, 8, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 32, 32, 32 }; + +const float mean_gp[] = { 0.5853f }; + +const float dic_gp[] = +{ + -0.5847f, -0.4695f, -0.3897f, -0.2731f, + -0.1986f, -0.1244f, -0.0492f, -0.005f, + 0.0631f, 0.1379f, 0.211f, 0.2859f, + 0.3229f, 0.3994f, 0.5217f, 0.6135f, + -0.5471f, -0.5089f, -0.4285f, -0.3512f, + -0.3124f, -0.235f, -0.162f, -0.0872f, + 0.0249f, 0.1013f, 0.1741f, 0.2485f, + 0.361f, 0.4376f, 0.4776f, 0.5645f +}; + +const float Gain_meanNB[] = { 2.4052f }; + +const float Gain_mean_dicNB[] = +{ + -0.3197f, -0.2272f, -0.1386f, -0.0966f, + -0.0132f, 0.1970f, 0.2865f, 0.3743f, + 0.4640f, 0.5108f, 0.5581f, 0.6086f, + 0.6588f, 0.7642f, 0.7101f, 0.0698f, + -0.1827f, 0.2418f, 0.1540f, -0.2733f, + -0.4144f, -0.5162f, -0.6806f, -1.3182f, + -2.4026f, -0.4643f, -0.7983f, -1.9470f, + -1.8160f, -1.6910f, -1.7558f, -0.5677f, + -0.3673f, -0.6224f, -0.7379f, -0.8624f, + -0.9321f, -1.0098f, -1.1600f, -1.2380f, + -1.4052f, -1.4876f, -2.1967f, -1.5599f, + -2.1399f, -2.3041f, 0.8225f, 0.9564f, + 0.8835f, 1.1436f, -2.0176f, 1.0387f, + -1.0822f, -1.6264f, -2.2534f, -1.8746f, + 1.4304f, 0.0288f, 0.1116f, -0.0553f, + 0.4192f, 0.3303f, -2.0750f, + -2.3558f, +}; + +const float Mean_dic_NB[] = +{ + -0.1084f, -0.0243f, -0.0292f, -0.0091f, + 0.0061f, 0.0171f, 0.0362f, 0.0153f, + 0.0416f, 0.0558f, +}; + +const float Gain_dic1_NB[] = +{ + -0.1479f, -0.0224f, 0.0013f, + -0.4797f, 0.0718f, 0.1627f, + -0.1073f, 0.0291f, 0.1613f, + -0.0258f, 0.0652f, 0.0264f, + -0.2961f, 0.0842f, -0.0332f, + -0.3053f, 0.1508f, 0.1381f, + -0.4650f, -0.1832f, 0.1581f, + -0.2546f, -0.0879f, -0.1215f, + -0.0043f, -0.0785f, 0.0235f, + 0.0816f, 0.0283f, -0.0604f, + -0.4709f, 0.1612f, 0.0056f, + -0.4504f, 0.2876f, 0.1183f, + -0.0440f, 0.2040f, 0.0408f, + -0.4619f, -0.2252f, -0.0783f, + 0.1016f, -0.1067f, -0.0839f, + 0.1452f, -0.1337f, 0.0386f, + -0.0648f, -0.1970f, -0.0826f, + -0.2599f, -0.2477f, -0.0048f, + -0.1528f, 0.1452f, -0.0814f, + -0.1389f, 0.2661f, 0.1590f, + 0.0066f, 0.1432f, -0.0809f, + -0.0450f, -0.0207f, -0.1229f, + -0.4643f, -0.4412f, 0.0796f, + -0.4543f, -0.0387f, -0.2415f, + -0.1626f, 0.0349f, -0.2839f, + -0.4194f, 0.2517f, -0.1816f, + 0.2068f, 0.0736f, -0.0144f, + 0.1757f, -0.2445f, -0.0527f, + 0.3370f, -0.2115f, -0.2366f, + 0.1961f, -0.0010f, -0.1484f, + 0.0568f, 0.0997f, -0.2436f, + 0.3561f, 0.0213f, 0.0641f, + 0.0842f, -0.1502f, -0.2506f, + 0.2140f, -0.0362f, -0.0016f, + 0.0165f, -0.2625f, 0.0660f, + 0.1958f, 0.0804f, 0.1159f, + -0.4695f, -0.0308f, -0.0092f, + 0.3114f, -0.1023f, -0.0851f, + 0.0979f, 0.2260f, 0.1403f, + 0.2066f, -0.0569f, 0.1335f, + 0.1691f, -0.4590f, 0.0869f, + -0.0883f, -0.4109f, -0.0535f, + 0.0565f, -0.0827f, 0.1460f, + 0.2996f, -0.1503f, 0.0652f, + 0.2724f, 0.0221f, -0.3213f, + -0.1344f, -0.1588f, 0.1293f, + 0.1083f, 0.0079f, 0.0442f, + -0.0937f, 0.2946f, -0.1892f, + -0.2424f, 0.2840f, 0.0099f, + 0.1915f, -0.2486f, 0.1314f, + 0.1551f, 0.1553f, -0.1036f, + 0.3353f, -0.3337f, 0.0364f, + 0.3521f, 0.0979f, -0.1083f, + 0.2671f, 0.2169f, 0.0300f, + 0.2135f, 0.2717f, -0.2642f, + -0.1578f, -0.2715f, -0.2692f, + 0.1316f, -0.3985f, -0.1668f, + 0.0981f, 0.1393f, 0.0241f, + -0.4342f, -0.4417f, -0.2072f, + -0.1788f, -0.4128f, 0.1708f, + -0.1655f, 0.1284f, 0.0670f, + 0.0782f, 0.2996f, -0.0288f, + -0.2984f, -0.0440f, 0.1108f, + 0.0423f, 0.0853f, 0.1295f, +}; + +const float Gain_dic2_NB[] = +{ + 0.0069f, 0.0000f, -0.0160f, + -0.1361f, 0.0009f, 0.0504f, + 0.0686f, -0.1568f, 0.0088f, + -0.1019f, 0.0198f, -0.1206f, + -0.0927f, 0.1671f, 0.1099f, + 0.1272f, -0.3770f, 0.0631f, + -0.2733f, 0.1496f, -0.2809f, + 0.1256f, 0.0058f, 0.1945f, + 0.0714f, -0.0204f, -0.1284f, + 0.0723f, 0.1021f, -0.0563f, + -0.1024f, -0.0165f, 0.2383f, + 0.0004f, -0.0753f, 0.0971f, + -0.1114f, -0.2459f, 0.0641f, + -0.2982f, -0.0906f, 0.1089f, + -0.0539f, -0.0952f, -0.0441f, + -0.2955f, 0.1435f, 0.1833f, + -0.2669f, 0.1288f, -0.0425f, + 0.1440f, 0.0907f, -0.3104f, + -0.0192f, -0.0612f, -0.3029f, + -0.2480f, -0.1188f, -0.1250f, + 0.1324f, 0.1419f, 0.0826f, + -0.0648f, 0.1114f, -0.0257f, + 0.1196f, -0.0173f, 0.0218f, + 0.0103f, 0.0574f, 0.0926f, + 0.0076f, 0.2916f, -0.0493f, + 0.0422f, -0.2048f, 0.2074f, + -0.0113f, 0.1221f, -0.1958f, + 0.0371f, 0.2279f, 0.2620f, + 0.2392f, 0.0843f, -0.0641f, + 0.1969f, -0.1415f, -0.1273f, + -0.0055f, -0.2421f, -0.1429f, + 0.2138f, -0.1407f, 0.1003f, +}; + +const float Gain_dic3_NB[] = +{ + -0.0039f, 0.0159f, -0.0553f, 0.0027f, + -0.0523f, 0.1349f, 0.0894f, 0.0451f, + 0.0334f, -0.0825f, -0.0732f, -0.1526f, + -0.0298f, 0.0199f, 0.1314f, -0.1946f, + 0.0391f, 0.0695f, -0.2694f, 0.0085f, + -0.1451f, 0.0762f, -0.0925f, -0.1033f, + 0.0412f, -0.1568f, -0.0964f, 0.0887f, + 0.0856f, -0.2846f, 0.1538f, -0.0637f, + -0.2905f, 0.0529f, 0.1016f, 0.0456f, + -0.1409f, 0.0596f, -0.1553f, 0.2095f, + 0.1415f, 0.1177f, -0.0536f, 0.1551f, + 0.1159f, -0.0458f, 0.0909f, 0.0066f, + -0.0159f, -0.0901f, 0.1231f, 0.2221f, + -0.1032f, -0.1080f, 0.0302f, -0.0098f, + 0.1173f, 0.1404f, -0.0101f, -0.1590f, + 0.1665f, 0.1661f, 0.2222f, 0.1193f, +}; + +const float Gain_dic2_NBHR[] = +{ + 0.0070f, 0.0001f, -0.0229f, + -0.1476f, -0.0493f, -0.0424f, + 0.0791f, -0.0927f, -0.0399f, + -0.0308f, -0.0735f, -0.0748f, + -0.0704f, 0.0302f, 0.0273f, + -0.0211f, 0.1279f, -0.0281f, + 0.0572f, 0.0045f, -0.1133f, + -0.0134f, -0.0686f, 0.0436f, + 0.0393f, 0.1088f, 0.1543f, + 0.0893f, -0.0201f, 0.0237f, + 0.0556f, -0.2804f, 0.0660f, + 0.0715f, 0.0698f, -0.0348f, + -0.0301f, -0.0085f, -0.2187f, + -0.1319f, -0.1649f, 0.0427f, + 0.0807f, -0.1180f, -0.1678f, + -0.1901f, 0.0498f, -0.1630f, + -0.1202f, 0.1876f, -0.1245f, + -0.2966f, -0.1514f, -0.1179f, + 0.1663f, -0.0185f, -0.0722f, + -0.1638f, 0.0966f, -0.0110f, + -0.1854f, 0.0728f, 0.1377f, + -0.0693f, 0.1437f, 0.0784f, + -0.3336f, -0.1445f, 0.1210f, + -0.1093f, -0.1429f, -0.1739f, + 0.0029f, -0.1845f, -0.0220f, + 0.1253f, 0.0407f, -0.2262f, + -0.2861f, 0.2587f, -0.2925f, + -0.1164f, 0.1825f, 0.2457f, + 0.0103f, 0.0251f, 0.3118f, + -0.2296f, 0.2562f, 0.0336f, + -0.2257f, -0.0035f, -0.3586f, + 0.1669f, 0.1657f, -0.3857f, + 0.1019f, -0.0912f, -0.3838f, + 0.1482f, 0.0660f, 0.0626f, + 0.1384f, 0.1899f, 0.2057f, + 0.3452f, -0.0544f, -0.1323f, + 0.0236f, 0.0488f, 0.0614f, + 0.0541f, 0.2623f, -0.1335f, + -0.1744f, -0.0697f, 0.2553f, + 0.0943f, -0.1671f, 0.2403f, + 0.0826f, 0.1646f, 0.0282f, + -0.0668f, 0.0418f, -0.0898f, + 0.1419f, -0.4567f, 0.0836f, + 0.0229f, 0.1079f, -0.1457f, + -0.0715f, -0.2943f, 0.2078f, + -0.0311f, 0.1224f, -0.3045f, + 0.0428f, 0.4151f, 0.3314f, + -0.0059f, 0.2989f, 0.0695f, + 0.1725f, -0.2325f, -0.0715f, + 0.1631f, 0.1202f, -0.0993f, + 0.2841f, 0.1833f, 0.0490f, + 0.0929f, -0.1452f, 0.0702f, + -0.3833f, 0.1174f, -0.1297f, + -0.1458f, -0.0391f, 0.0797f, + -0.1412f, -0.3200f, -0.0097f, + -0.0287f, -0.1278f, 0.1406f, + -0.3695f, 0.1286f, 0.1848f, + -0.0450f, 0.0097f, 0.1487f, + -0.2966f, 0.0239f, 0.0167f, + -0.0159f, -0.3233f, -0.2040f, + 0.2004f, -0.0729f, 0.0498f, + 0.1943f, 0.0051f, 0.2050f, + 0.0757f, -0.0325f, 0.1324f, + 0.2545f, -0.2377f, 0.1312f, +}; + +const float Gain_dic3_NBHR[] = +{ + 0.0715f, 0.0018f, -0.0493f, -0.0232f, + 0.1305f, 0.0268f, 0.1323f, -0.1251f, + -0.1410f, 0.0158f, -0.1367f, -0.0843f, + 0.0502f, 0.0811f, 0.0024f, -0.1302f, + -0.0186f, 0.0869f, -0.0034f, 0.0203f, + 0.0363f, -0.0908f, -0.0475f, -0.1196f, + -0.1168f, -0.0588f, -0.0135f, 0.0275f, + -0.0716f, -0.1147f, -0.1479f, 0.0151f, + 0.1947f, -0.3535f, 0.1525f, -0.2753f, + 0.0423f, 0.1132f, -0.4115f, -0.0120f, + -0.0956f, -0.0720f, -0.0388f, -0.1134f, + -0.1746f, 0.1026f, -0.0357f, -0.2402f, + -0.0087f, 0.0068f, -0.1182f, 0.0290f, + 0.1152f, 0.0665f, -0.1780f, -0.0283f, + 0.0167f, -0.0212f, -0.1534f, -0.1048f, + 0.1047f, -0.2240f, -0.0385f, -0.0466f, + -0.1331f, 0.0561f, -0.1063f, 0.0637f, + -0.0312f, 0.0037f, -0.1930f, 0.1494f, + 0.0655f, -0.0945f, -0.3072f, 0.0248f, + 0.0922f, 0.0580f, 0.0735f, 0.0007f, + -0.1207f, 0.0363f, 0.0319f, -0.0303f, + 0.1547f, -0.0751f, 0.0242f, 0.0058f, + 0.1397f, 0.1735f, 0.1842f, -0.2776f, + -0.2707f, 0.0977f, 0.2668f, 0.0901f, + -0.2028f, -0.1033f, 0.3865f, 0.2659f, + -0.0203f, 0.0380f, -0.0256f, 0.2631f, + -0.2270f, 0.1163f, 0.0372f, 0.0927f, + 0.1894f, 0.2838f, 0.1924f, -0.0104f, + 0.0680f, 0.0122f, 0.0997f, 0.1458f, + 0.1162f, 0.1180f, 0.0179f, 0.1828f, + 0.2204f, 0.1676f, 0.0196f, -0.1003f, + 0.0476f, -0.1876f, 0.0683f, 0.0840f, + -0.0641f, -0.2440f, -0.0112f, -0.0693f, + -0.0161f, 0.0641f, 0.0769f, -0.3024f, + 0.1061f, 0.1410f, -0.0572f, -0.2854f, + 0.0487f, -0.4075f, 0.0459f, 0.0278f, + -0.0140f, 0.1022f, -0.1243f, -0.1545f, + 0.0240f, -0.0290f, 0.0314f, -0.1991f, + -0.0383f, -0.0890f, -0.0607f, 0.1311f, + 0.0164f, -0.1524f, 0.0296f, 0.2814f, + 0.3526f, 0.0346f, -0.1425f, 0.0093f, + 0.2652f, -0.0205f, 0.0395f, 0.2426f, + 0.0958f, -0.0937f, -0.0302f, 0.1301f, + 0.0615f, 0.0446f, -0.2835f, -0.2160f, + -0.1053f, -0.2025f, 0.0248f, 0.1055f, + -0.1728f, 0.2409f, -0.2493f, -0.1572f, + -0.0157f, 0.0293f, -0.4112f, 0.2406f, + 0.0512f, -0.1206f, -0.2211f, 0.3179f, + 0.0121f, -0.0455f, 0.0431f, 0.0451f, + -0.0626f, 0.2130f, -0.2451f, 0.0946f, + 0.1376f, -0.0196f, -0.1657f, 0.1258f, + -0.1862f, -0.0097f, -0.2866f, 0.0556f, + -0.2513f, 0.0485f, -0.0144f, -0.0726f, + 0.0073f, -0.0115f, 0.0484f, -0.0645f, + -0.0966f, -0.3504f, 0.2229f, -0.2486f, + -0.0344f, 0.2348f, 0.0088f, 0.1117f, + 0.0088f, -0.0947f, 0.1894f, -0.2441f, + -0.0181f, 0.1194f, 0.2775f, 0.0341f, + -0.2369f, -0.1871f, 0.1625f, -0.0285f, + 0.0220f, 0.1462f, 0.4066f, 0.3429f, + -0.0763f, -0.1673f, -0.1866f, -0.1501f, + 0.1374f, -0.1128f, -0.1530f, -0.1874f, + 0.1933f, 0.1366f, -0.3527f, 0.1357f, + -0.1419f, 0.1760f, -0.1364f, 0.2775f, + -0.1707f, -0.0667f, 0.0668f, -0.2065f, + 0.2295f, -0.1684f, 0.1824f, -0.0617f, + -0.0431f, -0.1322f, 0.3309f, -0.0529f, + -0.1430f, 0.1042f, 0.2921f, -0.2119f, + 0.0358f, 0.1299f, -0.1342f, 0.0989f, + 0.0631f, 0.1654f, -0.0598f, -0.0405f, + 0.1884f, 0.2592f, -0.0807f, 0.1176f, + 0.0948f, 0.4565f, -0.1406f, 0.3869f, + 0.1129f, 0.2113f, 0.1108f, 0.2958f, + 0.1392f, 0.1289f, -0.1663f, 0.3001f, + -0.0943f, 0.1483f, 0.1463f, 0.2112f, + -0.0376f, -0.0049f, -0.0515f, -0.0564f, + 0.0234f, 0.1798f, 0.0996f, -0.0633f, + 0.1864f, -0.3743f, 0.2672f, 0.0607f, + 0.1720f, -0.2764f, 0.4289f, -0.2641f, + 0.0758f, -0.1174f, 0.0803f, -0.0964f, + 0.0473f, -0.1906f, 0.0144f, -0.2328f, + -0.2278f, -0.2336f, -0.0060f, 0.4555f, + -0.2079f, -0.0547f, -0.1176f, 0.2006f, + -0.3511f, 0.1197f, 0.0539f, 0.3127f, + 0.0956f, 0.1653f, 0.1317f, 0.0846f, + 0.2158f, -0.1499f, 0.4502f, 0.1656f, + -0.1886f, 0.1181f, -0.2266f, 0.6047f, + -0.0670f, -0.1125f, 0.0923f, -0.0642f, + -0.0690f, -0.0762f, 0.1423f, 0.0834f, + 0.1107f, -0.3762f, 0.0924f, 0.3090f, + 0.1900f, 0.2673f, 0.3150f, 0.2012f, + -0.2339f, -0.1082f, -0.0508f, -0.0173f, + 0.2405f, -0.2444f, -0.0301f, 0.1156f, + 0.0136f, -0.2449f, -0.1253f, 0.1158f, + -0.0633f, 0.3504f, 0.2381f, 0.0768f, + -0.0143f, -0.0412f, 0.1767f, 0.2347f, + -0.0512f, 0.2515f, 0.0832f, -0.2386f, + 0.2573f, 0.7121f, -0.0018f, -0.2141f, + -0.2079f, -0.0557f, 0.0805f, 0.1525f, + 0.0022f, -0.1280f, -0.0237f, -0.0035f, + 0.0038f, -0.0122f, 0.1163f, 0.5874f, + 0.0644f, -0.0581f, 0.1875f, 0.0136f, + 0.0457f, 0.0263f, -0.0413f, 0.1088f, + 0.1644f, 0.0582f, 0.2423f, 0.1638f, + -0.0532f, 0.0697f, 0.1184f, 0.0443f, + 0.1633f, -0.1285f, 0.1561f, 0.1394f, + 0.1586f, 0.0050f, -0.0458f, -0.1260f, + 0.2517f, 0.0403f, 0.1285f, 0.0333f, + -0.0813f, 0.0750f, 0.0248f, -0.1389f, + -0.0383f, 0.0755f, -0.2281f, -0.0295f, + -0.0820f, 0.0345f, 0.0096f, 0.1308f, + 0.1616f, 0.0888f, -0.0324f, 0.0543f, + -0.3135f, 0.1556f, -0.1552f, 0.0187f, + 0.3031f, 0.2066f, 0.1139f, 0.1557f, + 0.2055f, 0.0801f, 0.3248f, -0.0781f, + 0.0372f, -0.2464f, 0.1343f, -0.0524f, + -0.1885f, 0.0032f, 0.1451f, -0.0297f, + 0.0820f, -0.1000f, -0.1336f, -0.0005f, + 0.2121f, -0.0259f, 0.0784f, -0.2882f, + 0.1259f, 0.3045f, -0.2021f, -0.1408f, + -0.1636f, 0.2132f, 0.0897f, -0.0322f, + -0.1013f, 0.1537f, -0.0700f, -0.0400f, + -0.0256f, 0.0338f, 0.1603f, -0.1077f, + -0.0390f, -0.2649f, 0.2294f, 0.1718f, + -0.0313f, -0.0166f, -0.0901f, -0.2568f, + -0.3501f, 0.1449f, 0.1334f, -0.1623f, + -0.4515f, 0.0182f, 0.0428f, 0.0424f, + -0.3133f, 0.1780f, -0.3883f, 0.2519f, +}; + +const float YG_mean16[] = +{ + -0.0968f, -0.0468f, -0.0409f, -0.0332f, + -0.0147f, -0.0042f, 0.0111f, 0.0096f, + 0.0293f, 0.0198f, 0.0219f, 0.0164f, + 0.0358f, 0.0083f, 0.0398f, 0.0448f, +}; + +const float YG_dicMR_1[] = +{ + -0.4588f, 0.2016f, 0.1315f, -0.0513f, + -0.0294f, 0.0652f, -0.0335f, -0.0347f, + -0.1948f, -0.1154f, 0.1059f, 0.0594f, + 0.0724f, -0.2188f, 0.0901f, 0.0750f, + -0.4597f, -0.3254f, 0.1015f, 0.1244f, + -0.4774f, -0.1611f, -0.1151f, 0.0548f, + -0.2210f, -0.1962f, -0.1262f, 0.1056f, + -0.2346f, 0.0050f, -0.0631f, -0.0547f, + 0.0510f, 0.2386f, -0.0519f, -0.0042f, + 0.1308f, -0.0595f, 0.0388f, 0.0238f, + -0.0647f, 0.1891f, 0.1005f, -0.0799f, + 0.0823f, -0.0955f, -0.0579f, -0.1152f, + -0.4790f, -0.4482f, -0.1689f, 0.1149f, + 0.1525f, 0.0422f, -0.1130f, -0.0037f, + -0.2356f, 0.0643f, 0.0151f, 0.1466f, + -0.1910f, 0.2170f, -0.1056f, 0.0514f, + -0.4373f, 0.2081f, -0.1106f, -0.1895f, + -0.0445f, -0.0433f, -0.2631f, 0.0195f, + -0.0889f, 0.0855f, 0.0683f, 0.0715f, + -0.2201f, 0.2731f, 0.0719f, -0.2914f, + 0.0038f, 0.1073f, -0.0835f, 0.1121f, + -0.4455f, -0.3868f, -0.3375f, -0.1949f, + 0.1764f, 0.0140f, -0.3015f, -0.1613f, + 0.2167f, -0.3999f, 0.0677f, 0.0572f, + 0.0831f, 0.0842f, 0.0345f, -0.1490f, + 0.3124f, -0.0055f, 0.0042f, 0.0352f, + -0.1561f, -0.2081f, -0.1269f, -0.1350f, + 0.2519f, 0.2059f, 0.0364f, 0.1061f, + 0.1418f, 0.1911f, 0.1266f, -0.0479f, + 0.1115f, 0.2308f, 0.1216f, -0.3146f, + -0.4631f, -0.0101f, 0.1038f, 0.1255f, + 0.1921f, 0.0393f, 0.1236f, 0.0941f, + -0.1365f, 0.2635f, 0.0780f, 0.1258f, + 0.1220f, 0.0830f, 0.0146f, 0.0258f, + 0.0614f, -0.2434f, -0.2840f, -0.2344f, + 0.0638f, -0.3144f, -0.1540f, 0.0817f, + 0.3029f, -0.1514f, -0.0944f, -0.1617f, + 0.0407f, 0.0474f, 0.1163f, 0.0163f, + 0.2027f, -0.0636f, 0.1049f, -0.2933f, + -0.1169f, -0.0300f, 0.0174f, -0.2837f, + 0.0550f, -0.3618f, 0.0322f, -0.1958f, + 0.1659f, 0.1862f, -0.2466f, 0.1048f, + 0.0488f, -0.0304f, 0.0638f, 0.1441f, + 0.1882f, -0.1807f, -0.0447f, 0.0559f, + -0.4542f, -0.0850f, 0.0678f, -0.1340f, + -0.4317f, 0.2362f, 0.0687f, 0.1451f, + -0.4217f, -0.4143f, 0.0213f, -0.1866f, + 0.2853f, 0.1540f, -0.0279f, -0.1151f, + -0.3994f, -0.0247f, -0.3232f, -0.0221f, + 0.2004f, -0.1819f, 0.1119f, -0.0644f, + 0.2475f, -0.1406f, 0.0951f, 0.1147f, + 0.2541f, -0.1261f, -0.2486f, 0.0897f, + 0.2016f, 0.0042f, 0.1040f, -0.0797f, + -0.1140f, -0.4007f, 0.0491f, 0.0794f, + -0.4653f, 0.1045f, -0.0824f, 0.0541f, + -0.2492f, 0.1539f, 0.1023f, -0.0183f, + -0.0211f, -0.0926f, -0.0495f, 0.0572f, + 0.1609f, 0.1286f, -0.1199f, -0.3680f, + -0.1378f, -0.4261f, -0.2389f, -0.0422f, + -0.4306f, -0.1056f, -0.1813f, -0.2662f, + 0.0590f, 0.1732f, 0.0657f, 0.1213f, + 0.1749f, 0.0180f, -0.0507f, 0.1508f, + -0.0724f, 0.1574f, -0.2109f, -0.1965f, + -0.0112f, -0.0797f, 0.1006f, -0.0723f, +}; + +const float YG_dicMR_2[] = +{ + 0.0228f, 0.0529f, -0.0298f, 0.0091f, + -0.0032f, -0.0203f, 0.0257f, -0.1199f, + -0.0972f, -0.1446f, 0.0973f, -0.0390f, + 0.1325f, -0.0197f, -0.1147f, 0.0997f, + 0.0963f, -0.1539f, -0.0230f, -0.0630f, + -0.1623f, 0.0325f, -0.0331f, -0.0305f, + 0.0970f, -0.0857f, 0.1538f, -0.0361f, + -0.2846f, 0.0992f, -0.2111f, 0.1353f, + -0.0333f, -0.0737f, -0.0642f, 0.0198f, + -0.1646f, -0.1605f, -0.1393f, -0.1688f, + -0.0503f, 0.0930f, -0.1707f, 0.0298f, + 0.0665f, -0.3677f, 0.0868f, 0.0036f, + 0.1102f, -0.2346f, 0.1557f, -0.2765f, + 0.0772f, -0.1922f, 0.0404f, 0.1428f, + 0.0762f, -0.0352f, 0.0451f, 0.0668f, + 0.0095f, -0.1723f, -0.2433f, 0.0611f, + -0.2235f, -0.2127f, -0.0279f, 0.1118f, + -0.2035f, 0.0849f, 0.0888f, -0.2901f, + 0.1098f, 0.1764f, -0.0625f, 0.1007f, + 0.0902f, 0.1143f, -0.3346f, 0.1015f, + 0.0841f, 0.0401f, 0.0707f, -0.2672f, + 0.1622f, 0.0297f, 0.0082f, -0.0532f, + 0.1355f, 0.0621f, 0.1365f, 0.2015f, + 0.0762f, 0.1201f, 0.1211f, -0.0066f, + -0.0974f, 0.0770f, 0.1685f, -0.0806f, + -0.1118f, 0.1734f, 0.0503f, 0.1013f, + 0.0709f, 0.0217f, -0.1615f, -0.1139f, + -0.0176f, 0.1448f, -0.0264f, -0.1122f, + -0.0531f, 0.0113f, 0.0778f, 0.0461f, + -0.3335f, 0.0486f, 0.0892f, 0.0152f, + -0.1348f, -0.0405f, 0.1884f, 0.2103f, + -0.0387f, 0.0294f, -0.0525f, 0.1893f, +}; + +const float YG_dicMR_3[] = +{ + -0.0251f, -0.0350f, -0.0207f, -0.0047f, + -0.0986f, 0.0444f, -0.1942f, 0.0205f, + 0.0972f, -0.1449f, -0.0134f, -0.0624f, + 0.0691f, 0.0313f, -0.1153f, 0.0682f, + -0.0600f, -0.1532f, 0.0686f, 0.0726f, + -0.2082f, 0.1143f, 0.0874f, -0.2235f, + 0.0664f, 0.0363f, 0.0510f, -0.1081f, + -0.0409f, -0.1231f, 0.1104f, -0.1281f, + 0.1524f, -0.1042f, 0.1901f, 0.0286f, + 0.2634f, 0.0987f, -0.0240f, 0.0196f, + 0.0332f, 0.0404f, 0.0347f, -0.3404f, + 0.1252f, -0.1383f, -0.0367f, 0.2006f, + 0.0302f, 0.1576f, 0.0487f, 0.0664f, + -0.0403f, -0.1715f, -0.1502f, 0.0404f, + 0.0814f, 0.1978f, -0.1116f, 0.2533f, + -0.0878f, 0.0256f, -0.0268f, 0.1310f, + -0.0548f, 0.0305f, 0.1372f, -0.0063f, + 0.1706f, -0.2698f, 0.1976f, -0.3231f, + -0.3001f, 0.2054f, -0.1872f, 0.1393f, + -0.0756f, 0.1066f, -0.0278f, -0.0562f, + -0.2551f, 0.1538f, 0.1377f, 0.0787f, + 0.0689f, 0.2857f, -0.1765f, -0.0746f, + -0.0800f, -0.0604f, -0.0612f, -0.1461f, + 0.0864f, 0.0811f, -0.3889f, 0.1219f, + 0.0810f, -0.0055f, 0.0534f, 0.0743f, + 0.0794f, -0.3690f, 0.0922f, 0.0731f, + -0.0230f, -0.0132f, 0.1657f, 0.2333f, + 0.1238f, 0.2026f, 0.2103f, -0.1805f, + -0.2186f, -0.0329f, 0.0040f, -0.0083f, + 0.1654f, 0.1588f, 0.2346f, 0.1744f, + 0.1993f, -0.1624f, -0.4251f, -0.1638f, + 0.0670f, 0.0227f, -0.1506f, -0.1057f, +}; + +const float YG_dicMR_4[] = +{ + -0.0398f, -0.0108f, -0.0263f, 0.0079f, + 0.1358f, 0.0373f, 0.0281f, 0.0293f, + 0.1507f, 0.1997f, 0.1958f, 0.1756f, + -0.1560f, -0.1623f, 0.0297f, 0.1620f, + 0.0863f, -0.1354f, -0.0860f, -0.0209f, + -0.2836f, 0.2034f, -0.2525f, 0.0796f, + -0.1247f, -0.0991f, -0.1167f, -0.1276f, + 0.1198f, -0.3596f, 0.0987f, -0.0051f, + 0.0362f, 0.0702f, -0.0111f, -0.1328f, + -0.0148f, 0.0420f, -0.1931f, -0.0108f, + 0.1745f, -0.1095f, 0.2103f, 0.1230f, + -0.0264f, 0.0641f, 0.1489f, 0.0289f, + 0.2348f, 0.2016f, -0.2473f, -0.0091f, + -0.0077f, -0.1208f, 0.0883f, -0.0523f, + -0.0091f, 0.1614f, -0.0183f, 0.0706f, + -0.2039f, 0.0593f, 0.0207f, -0.0256f, +}; + +const float mean_m[] = { 2.8717f }; + +const float mean_gain_dic[] = +{ + -0.1804f, -0.1267f, -0.0185f, 0.0358f, + 0.1402f, 0.1903f, 0.2399f, 0.2894f, + 0.3379f, 0.3858f, 0.4356f, 0.4857f, + 0.5380f, 0.6452f, 0.6992f, 0.5914f, + 0.0885f, -0.0721f, -0.2922f, -0.4726f, + -0.6732f, -2.8699f, -2.0059f, 0.7528f, + 0.8083f, -0.3501f, -0.4106f, -0.8156f, + -2.2665f, -2.2112f, -2.1036f, -1.9001f, + -1.7967f, -1.7001f, -1.6094f, -1.5218f, + -1.3355f, -1.2328f, -1.1354f, -0.9654f, + -0.6031f, -0.2352f, -0.5368f, -0.7426f, + -0.8894f, -1.0479f, -1.4292f, -2.4899f, + 1.0016f, 0.8661f, 1.0718f, 1.1517f, + 0.9318f, -2.5695f, -2.8128f, -2.3365f, + -2.4168f, -2.2389f, -2.6467f, -2.7259f, + 1.3428f, 1.2399f, 1.4988f, 1.7072f, +}; + +const float YGain_mean_LR[] = +{ + -0.0940f, -0.0435f, -0.0348f, -0.0284f, + -0.0113f, -0.0029f, 0.0156f, 0.0123f, + 0.0288f, 0.0167f, 0.0324f, 0.0369f, +}; + +const float YGain_dic1_LR[] = +{ + -0.4660f, 0.0389f, -0.0220f, + -0.0378f, 0.1016f, -0.0036f, + -0.0241f, -0.0205f, 0.0967f, + -0.4472f, -0.2070f, -0.0781f, + -0.1901f, 0.2501f, 0.0111f, + -0.4541f, -0.4299f, 0.0666f, + 0.0197f, -0.0832f, -0.0755f, + -0.1999f, -0.0008f, -0.0770f, + 0.1179f, 0.0525f, -0.0474f, + 0.0591f, 0.2288f, -0.0186f, + -0.4468f, -0.4279f, -0.2691f, + -0.3880f, 0.2118f, -0.1605f, + -0.2224f, 0.0950f, 0.1028f, + -0.4478f, 0.2234f, 0.0952f, + -0.0352f, 0.1378f, -0.2121f, + 0.2143f, -0.3769f, 0.0736f, + 0.1089f, 0.0811f, 0.0917f, + -0.1318f, -0.2008f, -0.2444f, + 0.1339f, -0.0469f, 0.0567f, + 0.2245f, -0.1437f, -0.0427f, + 0.2121f, 0.1750f, -0.1378f, + 0.1945f, -0.0252f, -0.2556f, + -0.0819f, -0.4228f, -0.0453f, + -0.4492f, -0.0842f, 0.1383f, + 0.2943f, 0.0266f, 0.0106f, + 0.2405f, -0.1113f, 0.1391f, + 0.1588f, -0.2987f, -0.2134f, + 0.2265f, 0.1837f, 0.0951f, + -0.0302f, 0.2034f, 0.1404f, + -0.4421f, -0.0608f, -0.2788f, + -0.1736f, -0.1872f, 0.0451f, + 0.0840f, -0.2138f, 0.0652f, +}; + +const float YGain_dic2_LR[] = +{ + -0.0718f, -0.0178f, -0.0101f, 0.0026f, + 0.0675f, 0.0806f, -0.3212f, 0.0423f, + 0.0064f, -0.1738f, 0.0211f, 0.0003f, + -0.2054f, -0.1316f, 0.0600f, -0.1170f, + 0.0105f, -0.0505f, 0.1732f, 0.0282f, + 0.0254f, -0.0482f, 0.0554f, -0.1338f, + 0.0638f, -0.0556f, 0.0402f, 0.1480f, + 0.1496f, 0.0983f, -0.0297f, -0.1025f, + 0.0034f, 0.0444f, -0.1327f, -0.1633f, + -0.1793f, 0.0958f, -0.1200f, -0.0319f, + -0.3214f, 0.0670f, 0.0283f, 0.0808f, + -0.3269f, 0.1307f, -0.3079f, 0.1485f, + -0.0844f, 0.0677f, -0.1040f, 0.1779f, + -0.2606f, -0.2042f, -0.1393f, 0.0948f, + 0.1570f, 0.1228f, 0.1182f, 0.1300f, + -0.0362f, 0.1092f, 0.0294f, -0.0957f, + -0.1465f, 0.0641f, 0.1266f, -0.0182f, + 0.1676f, -0.0844f, 0.0926f, 0.0055f, + 0.0318f, 0.0583f, 0.0917f, -0.3336f, + 0.0165f, 0.1601f, -0.0881f, 0.0224f, + 0.1485f, 0.0699f, -0.0988f, 0.1190f, + -0.2517f, 0.1238f, 0.1276f, -0.2371f, + 0.0124f, -0.0108f, -0.1272f, 0.0421f, + -0.1400f, -0.1221f, 0.0972f, 0.1542f, + 0.0587f, 0.0358f, 0.0254f, 0.0125f, + -0.0780f, -0.1659f, -0.2174f, -0.0971f, + -0.0475f, 0.1229f, 0.0746f, 0.1120f, + 0.0819f, 0.0898f, 0.1615f, -0.0950f, + 0.0923f, -0.1925f, -0.1311f, 0.1660f, + 0.1057f, -0.2756f, 0.1153f, -0.2155f, + 0.1153f, -0.0761f, -0.0735f, -0.0506f, + 0.0922f, -0.3286f, 0.1058f, 0.0996f, +}; + +const float YGain_dic3_LR[] = +{ + -0.0810f, -0.0466f, -0.0299f, -0.1110f, -0.0512f, + 0.0888f, -0.0116f, -0.1622f, 0.0996f, 0.0549f, + -0.1406f, -0.0835f, 0.0897f, 0.0128f, 0.0658f, + -0.0958f, -0.0384f, -0.0188f, 0.1526f, -0.0546f, + -0.0446f, -0.1591f, -0.0990f, 0.0242f, 0.0650f, + 0.0059f, 0.0158f, 0.0180f, 0.1281f, 0.1497f, + -0.1966f, 0.0746f, -0.0936f, -0.0051f, 0.0602f, + 0.0038f, 0.0325f, -0.1016f, -0.0009f, -0.1385f, + 0.0718f, -0.1831f, 0.1082f, -0.0897f, 0.0557f, + 0.1308f, 0.1992f, 0.1872f, 0.1371f, 0.1449f, + -0.0131f, 0.0489f, -0.2706f, -0.1422f, 0.0554f, + 0.0300f, -0.0106f, 0.1011f, -0.0918f, -0.1585f, + 0.1445f, -0.1593f, -0.1646f, -0.0943f, -0.0868f, + 0.0244f, -0.0142f, -0.0110f, -0.0264f, 0.0251f, + -0.1774f, -0.0473f, -0.2856f, 0.2274f, 0.2675f, + 0.1251f, 0.1851f, -0.1073f, -0.1877f, -0.2566f, + 0.0885f, 0.1921f, -0.0673f, -0.0339f, 0.0364f, + -0.0533f, 0.0944f, 0.1116f, -0.1010f, 0.0646f, + -0.0492f, 0.1618f, -0.2695f, 0.2154f, -0.0825f, + -0.0139f, 0.0988f, 0.0656f, 0.0628f, -0.0539f, + 0.0817f, 0.2109f, 0.2841f, -0.1492f, -0.1509f, + 0.3113f, 0.1205f, -0.4354f, 0.0290f, 0.2983f, + 0.1837f, 0.0186f, 0.0660f, 0.0179f, -0.0140f, + 0.0917f, -0.3063f, 0.0353f, 0.1767f, 0.1473f, + -0.2414f, 0.1508f, 0.1609f, 0.1647f, 0.1367f, + 0.0313f, -0.0359f, -0.0337f, -0.0899f, 0.2352f, + 0.0341f, -0.0414f, 0.2115f, 0.1313f, 0.0311f, + 0.0299f, -0.1503f, 0.0406f, 0.0575f, -0.0966f, + 0.0914f, 0.0680f, 0.0994f, 0.1587f, -0.3097f, + -0.2103f, 0.1496f, -0.1844f, -0.3256f, -0.2372f, + -0.2251f, 0.0767f, 0.1015f, -0.0279f, -0.1582f, + 0.0647f, 0.0207f, 0.0148f, -0.2710f, 0.0109f, +}; + +const float YG_mean16HR[] = +{ + -0.0968f, -0.0468f, -0.0409f, -0.0332f, + -0.0147f, -0.0042f, 0.0111f, 0.0096f, + 0.0293f, 0.0198f, 0.0219f, 0.0164f, + 0.0358f, 0.0083f, 0.0398f, 0.0448f, +}; + +const float YG_dicHR_1[] = +{ + -0.4774f, 0.1006f, 0.0327f, 0.0080f, + -0.0832f, 0.0217f, -0.0103f, 0.0049f, + -0.2440f, 0.0768f, -0.0353f, 0.1115f, + -0.1048f, -0.0464f, 0.0456f, 0.1336f, + -0.2582f, 0.0393f, 0.0595f, -0.0481f, + -0.0114f, -0.0198f, -0.1200f, -0.0546f, + 0.0351f, 0.2409f, -0.0276f, 0.0037f, + 0.0699f, -0.0765f, 0.0189f, 0.0008f, + 0.0610f, -0.3055f, 0.0930f, 0.0745f, + -0.4662f, -0.0631f, 0.1176f, 0.0212f, + 0.2203f, 0.0146f, 0.0104f, -0.0456f, + -0.4809f, -0.2422f, -0.0819f, 0.0545f, + -0.4672f, -0.0398f, -0.1137f, -0.0410f, + -0.1970f, 0.2933f, 0.0060f, 0.1176f, + -0.1377f, -0.4744f, 0.0520f, 0.0928f, + -0.0293f, -0.1688f, -0.0396f, 0.0339f, + -0.2359f, 0.2464f, 0.1067f, -0.1134f, + 0.1061f, 0.0360f, 0.0452f, 0.0388f, + -0.4747f, -0.0325f, -0.0765f, 0.1470f, + -0.2514f, 0.0578f, -0.1495f, -0.0912f, + -0.1831f, -0.1396f, -0.2463f, -0.0975f, + 0.1628f, -0.2331f, -0.0273f, 0.0217f, + 0.0455f, -0.0040f, -0.0425f, 0.0827f, + -0.0575f, -0.0769f, 0.0984f, -0.0597f, + 0.0696f, 0.0327f, 0.0209f, -0.0854f, + -0.4838f, -0.3677f, -0.3150f, 0.0826f, + -0.4827f, -0.4701f, -0.0899f, 0.2140f, + -0.4713f, 0.0627f, 0.1106f, 0.1629f, + -0.4600f, 0.0633f, -0.0302f, -0.1902f, + -0.1985f, 0.2655f, -0.1455f, -0.2476f, + 0.0968f, 0.0162f, -0.2139f, 0.1007f, + -0.1328f, 0.2215f, -0.1605f, 0.0736f, + -0.1185f, 0.1496f, 0.1259f, 0.1897f, + -0.0884f, 0.1026f, 0.1019f, -0.1266f, + -0.4284f, 0.3193f, 0.0159f, -0.2937f, + -0.1511f, 0.1722f, -0.0139f, -0.0138f, + -0.4732f, 0.2455f, 0.1371f, 0.0145f, + 0.0152f, 0.1274f, -0.1076f, 0.0780f, + -0.4338f, 0.2469f, -0.0683f, -0.0405f, + 0.1364f, 0.0873f, -0.1085f, -0.0116f, + 0.1958f, -0.4880f, 0.0765f, 0.0780f, + -0.4573f, -0.2017f, -0.4130f, -0.2389f, + -0.1437f, -0.0720f, -0.0801f, -0.2493f, + -0.0224f, 0.1254f, -0.0705f, -0.1295f, + -0.4750f, -0.4797f, -0.0855f, -0.0717f, + -0.0751f, -0.2582f, 0.0497f, -0.1541f, + 0.0231f, -0.4184f, -0.1340f, -0.0153f, + 0.1505f, -0.0029f, -0.1247f, -0.1905f, + 0.1667f, -0.3843f, 0.0636f, -0.1079f, + 0.1239f, -0.1901f, 0.1275f, -0.0215f, + 0.3226f, -0.1551f, -0.1057f, -0.1512f, + 0.0901f, -0.1502f, -0.0820f, -0.4019f, + 0.2507f, -0.1398f, 0.0648f, -0.0626f, + 0.1902f, 0.0312f, -0.0379f, 0.0871f, + -0.1130f, -0.0441f, -0.1557f, 0.0990f, + 0.3247f, 0.2615f, 0.1327f, 0.1916f, + 0.1061f, -0.1145f, 0.0293f, -0.1419f, + 0.3159f, -0.1299f, 0.0148f, 0.0922f, + 0.0156f, -0.3151f, -0.0822f, 0.1729f, + 0.1848f, 0.0104f, 0.1008f, 0.1483f, + 0.1787f, 0.2451f, 0.1461f, -0.3391f, + -0.4440f, -0.4068f, 0.1336f, 0.0454f, + -0.4677f, -0.1959f, 0.1186f, 0.1927f, + 0.2215f, 0.1068f, 0.1111f, 0.0264f, + 0.1240f, -0.0250f, 0.1399f, -0.0267f, + 0.2534f, -0.3155f, -0.1689f, 0.1250f, + 0.3487f, 0.0389f, 0.0050f, 0.0662f, + 0.0273f, -0.2017f, -0.1483f, -0.1375f, + -0.1520f, -0.3243f, -0.3398f, -0.2442f, + -0.0039f, 0.2672f, 0.0828f, -0.1671f, + 0.1096f, 0.1931f, -0.1074f, -0.3950f, + -0.4310f, -0.2304f, -0.1606f, -0.1649f, + 0.0262f, -0.2040f, -0.2784f, 0.0590f, + 0.0081f, 0.0298f, 0.1270f, 0.0592f, + 0.0475f, 0.0499f, 0.0766f, -0.2637f, + 0.3194f, 0.1340f, -0.1736f, -0.2076f, + 0.3712f, 0.1159f, 0.0816f, -0.1261f, + 0.2666f, -0.0103f, 0.0849f, -0.3768f, + 0.2682f, -0.0535f, 0.1662f, 0.0341f, + 0.2089f, -0.2186f, 0.1498f, -0.2405f, + -0.3982f, -0.3785f, 0.1317f, -0.3119f, + 0.1642f, 0.2211f, -0.2583f, 0.1052f, + 0.1357f, 0.1610f, -0.0094f, 0.1101f, + -0.2731f, -0.0130f, 0.1309f, 0.1191f, + 0.1376f, -0.1186f, -0.0500f, 0.1589f, + -0.1657f, -0.2271f, 0.1148f, 0.1038f, + 0.2881f, -0.0634f, -0.2417f, 0.0781f, + 0.2425f, 0.0780f, -0.0886f, 0.2261f, + 0.1911f, -0.0621f, -0.3533f, -0.1305f, + -0.4753f, 0.2355f, 0.0210f, 0.1508f, + -0.4033f, 0.1776f, -0.1987f, 0.1256f, + -0.1350f, 0.0966f, 0.1276f, 0.0305f, + -0.4175f, 0.1414f, 0.2031f, -0.1324f, + 0.0085f, 0.1132f, 0.0351f, 0.0005f, + -0.4254f, -0.0507f, -0.1569f, -0.3704f, + -0.4804f, -0.1808f, 0.0665f, -0.1480f, + 0.1621f, 0.1638f, 0.0143f, -0.1516f, + 0.0561f, 0.0670f, 0.0299f, 0.1654f, + 0.0160f, 0.2794f, 0.0060f, 0.1692f, + -0.3377f, 0.2591f, 0.1540f, 0.2183f, + 0.1311f, 0.1317f, 0.0259f, -0.0077f, + 0.2639f, 0.1890f, -0.0654f, 0.0164f, + 0.0867f, 0.1267f, 0.1488f, -0.0822f, + 0.1899f, -0.1796f, 0.1008f, 0.1346f, + 0.0535f, -0.1037f, 0.0958f, 0.1103f, + -0.1326f, -0.4661f, -0.0463f, -0.2278f, + -0.2291f, -0.0436f, 0.1196f, -0.2462f, + -0.1829f, -0.2971f, -0.1075f, -0.0384f, + 0.1663f, -0.0868f, -0.1033f, -0.0047f, + 0.0731f, 0.2571f, -0.2231f, -0.1236f, + -0.0632f, 0.0881f, -0.3559f, -0.0095f, + -0.0645f, 0.2361f, 0.1268f, 0.0144f, + -0.1754f, -0.4094f, -0.2893f, 0.0454f, + 0.1811f, -0.0769f, 0.0451f, 0.0513f, + -0.4348f, -0.0747f, -0.3173f, 0.0408f, + -0.4670f, -0.4717f, -0.3156f, -0.2369f, + -0.2484f, -0.1271f, -0.0235f, -0.0333f, + -0.4466f, 0.1222f, -0.3039f, -0.1527f, + -0.2543f, -0.1933f, -0.1126f, 0.1443f, + 0.1729f, -0.3386f, -0.2632f, -0.2335f, + 0.0828f, 0.1555f, 0.1244f, 0.0997f, + -0.0321f, 0.0260f, -0.2937f, -0.2730f, + 0.1999f, 0.0046f, 0.1166f, -0.1652f, + 0.1631f, 0.2872f, 0.1031f, -0.0089f, + 0.2623f, -0.3076f, 0.1038f, 0.0652f, + -0.0688f, 0.1318f, 0.0077f, 0.1051f, + -0.2922f, 0.1846f, 0.0826f, 0.0577f, + -0.1389f, 0.2515f, 0.1029f, -0.3880f, +}; + +const float YG_dicHR_2[] = +{ + 0.0357f, -0.0180f, -0.0164f, -0.0247f, + -0.0028f, 0.0807f, -0.0430f, -0.1487f, + -0.0693f, -0.0078f, -0.0931f, -0.0468f, + -0.0510f, -0.0198f, 0.0348f, 0.0573f, + 0.0345f, -0.0919f, -0.0162f, -0.1579f, + 0.1387f, -0.0093f, -0.1048f, 0.0391f, + 0.0406f, 0.2031f, 0.0219f, -0.0253f, + 0.0684f, -0.2153f, -0.0724f, -0.0201f, + -0.0288f, -0.0010f, 0.0831f, -0.2336f, + 0.0699f, -0.0333f, -0.1658f, -0.1001f, + 0.0345f, 0.0443f, -0.0483f, 0.1249f, + -0.1674f, 0.1583f, 0.0602f, -0.0893f, + 0.1526f, -0.1636f, 0.1444f, 0.0464f, + -0.0019f, -0.0723f, -0.1110f, 0.0575f, + 0.2052f, 0.0309f, 0.1594f, 0.2598f, + -0.1046f, -0.1393f, -0.0044f, -0.0189f, + -0.0728f, -0.2377f, 0.1556f, 0.0930f, + -0.1890f, -0.0078f, -0.0813f, -0.2203f, + -0.3685f, 0.0409f, 0.1152f, -0.0903f, + 0.1053f, -0.3510f, 0.0303f, 0.1491f, + -0.2241f, 0.1248f, 0.1267f, -0.3634f, + -0.0239f, 0.0640f, -0.2129f, 0.0604f, + 0.1341f, -0.0406f, 0.1471f, -0.1442f, + 0.1574f, -0.2515f, 0.1945f, -0.3124f, + 0.1283f, -0.0092f, 0.0518f, 0.0483f, + 0.0345f, 0.0844f, 0.0477f, 0.0517f, + 0.0223f, -0.0175f, 0.1646f, 0.0546f, + -0.3280f, -0.2203f, -0.0068f, 0.0572f, + -0.1142f, -0.2396f, -0.1043f, 0.1771f, + 0.0430f, -0.1288f, 0.0208f, 0.0672f, + -0.1597f, -0.2099f, 0.1155f, -0.2132f, + 0.1640f, -0.1117f, -0.0797f, 0.1813f, + 0.1707f, 0.1498f, -0.0192f, 0.1117f, + -0.1191f, 0.1235f, 0.0566f, 0.1413f, + -0.0476f, 0.2265f, -0.1205f, 0.1293f, + 0.1551f, 0.1354f, -0.2239f, 0.1299f, + -0.1354f, -0.0030f, -0.0768f, 0.1492f, + 0.0422f, 0.1630f, 0.1301f, -0.2134f, + 0.1451f, 0.0660f, -0.0068f, -0.0923f, + 0.0948f, -0.1294f, -0.3191f, 0.0669f, + 0.1581f, 0.1102f, 0.1638f, 0.0059f, + 0.1820f, -0.1148f, 0.0020f, -0.0635f, + -0.1771f, -0.0715f, -0.2487f, -0.0080f, + 0.0234f, 0.0451f, 0.0808f, -0.0684f, + -0.1860f, -0.0331f, 0.1349f, 0.0612f, + -0.1014f, -0.0008f, 0.0482f, -0.0750f, + 0.0347f, 0.1714f, 0.1427f, 0.1845f, + 0.1100f, 0.1455f, -0.2468f, -0.1282f, + -0.1112f, -0.2792f, -0.1894f, -0.1562f, + 0.0557f, 0.1211f, -0.4094f, 0.0976f, + 0.0201f, 0.0593f, -0.1301f, 0.2984f, + 0.0306f, -0.0523f, 0.0779f, 0.1963f, + -0.0715f, 0.0928f, -0.0309f, 0.0172f, + 0.0235f, -0.1172f, 0.0995f, -0.0633f, + -0.1553f, -0.0363f, 0.2174f, 0.3030f, + 0.0521f, 0.0987f, -0.0934f, -0.0018f, + -0.0770f, 0.1243f, 0.1613f, 0.0150f, + 0.1233f, 0.0046f, 0.0082f, -0.3383f, + -0.1388f, 0.1750f, -0.1521f, -0.0827f, + -0.1075f, 0.0095f, 0.2374f, -0.1111f, + -0.3469f, 0.1407f, -0.2749f, 0.1633f, + -0.3396f, 0.1176f, 0.0561f, 0.1449f, + 0.0819f, -0.3576f, 0.1050f, -0.0916f, + -0.2243f, 0.0304f, -0.0379f, 0.0084f, +}; + +const float YG_dicHR_3[] = +{ + -0.0426f, -0.0202f, -0.0387f, -0.0030f, + 0.0380f, -0.0984f, 0.0280f, -0.0324f, + 0.0460f, 0.0006f, -0.0566f, -0.1148f, + 0.1094f, -0.0542f, -0.1462f, -0.0253f, + -0.0863f, 0.0744f, -0.2866f, 0.1026f, + -0.0105f, -0.0188f, -0.1303f, 0.0944f, + 0.1286f, -0.0140f, 0.0879f, -0.0605f, + -0.2045f, -0.0537f, -0.0840f, 0.0103f, + -0.0578f, 0.0215f, -0.1623f, -0.0552f, + -0.2976f, 0.0162f, 0.0885f, -0.1293f, + -0.0974f, 0.1213f, -0.0734f, 0.0731f, + 0.0520f, 0.1242f, -0.1272f, 0.0196f, + -0.0653f, -0.1276f, 0.0112f, 0.0700f, + -0.0159f, -0.2792f, 0.0376f, -0.0414f, + 0.1771f, -0.3623f, 0.2157f, -0.3563f, + 0.0022f, -0.0268f, 0.0817f, -0.1837f, + -0.0095f, 0.2102f, -0.0056f, -0.0815f, + -0.1191f, 0.0831f, 0.0495f, -0.3733f, + -0.0854f, 0.0945f, 0.1575f, -0.1134f, + -0.0259f, 0.0180f, 0.0416f, 0.1044f, + 0.0441f, 0.0938f, -0.0713f, 0.2415f, + 0.0436f, -0.1234f, 0.1509f, 0.0916f, + 0.1176f, 0.1316f, -0.4339f, 0.2564f, + 0.1662f, -0.1935f, 0.0160f, 0.0334f, + -0.3389f, 0.1950f, -0.2663f, 0.1638f, + -0.0921f, -0.1238f, -0.0341f, -0.1417f, + 0.0737f, 0.1500f, 0.0476f, 0.0958f, + -0.0533f, -0.2820f, 0.0834f, 0.2038f, + 0.0826f, -0.2616f, -0.2874f, 0.1644f, + -0.0993f, 0.0460f, -0.0225f, -0.1335f, + -0.0142f, -0.1604f, 0.1888f, -0.1319f, + 0.1126f, 0.1585f, 0.2053f, -0.0266f, + -0.1893f, -0.0861f, 0.1514f, 0.0570f, + -0.0954f, 0.1628f, 0.1468f, 0.1070f, + -0.0964f, 0.3893f, -0.0730f, 0.2465f, + 0.0898f, 0.1094f, 0.0711f, -0.2164f, + 0.1926f, 0.0187f, 0.1170f, 0.1297f, + -0.0188f, -0.1601f, -0.1222f, -0.0035f, + 0.1257f, -0.4262f, 0.1214f, 0.0531f, + 0.2209f, -0.2352f, 0.1540f, 0.3080f, + 0.1894f, 0.0548f, -0.1943f, 0.1270f, + 0.0712f, -0.1064f, -0.0275f, 0.1659f, + 0.1207f, 0.3370f, -0.2487f, -0.0456f, + -0.0185f, 0.0212f, 0.1785f, 0.2561f, + 0.0161f, 0.0183f, 0.1507f, 0.0244f, + 0.1251f, -0.0114f, 0.1731f, -0.3995f, + -0.2262f, 0.3021f, 0.2663f, -0.1984f, + 0.0100f, 0.0727f, 0.0237f, -0.0320f, + 0.1602f, 0.1882f, 0.2873f, 0.2248f, + 0.3206f, -0.1423f, -0.4473f, -0.2229f, + 0.1197f, -0.1583f, -0.0106f, -0.1966f, + -0.1098f, -0.2154f, -0.3597f, -0.1705f, + 0.2511f, 0.1028f, -0.0370f, -0.0707f, + 0.2659f, 0.2704f, -0.0354f, 0.1857f, + 0.0461f, 0.0873f, -0.1559f, -0.2509f, + -0.0824f, -0.0513f, 0.0733f, -0.0475f, + 0.0781f, 0.0546f, -0.3875f, -0.0158f, + 0.2374f, 0.3380f, 0.1919f, -0.2505f, + 0.2268f, -0.1145f, 0.2727f, -0.0484f, + -0.3637f, 0.1569f, 0.0659f, 0.0942f, + -0.1531f, 0.0612f, 0.0375f, 0.0123f, + -0.2213f, 0.1497f, -0.1265f, -0.1066f, + 0.0926f, 0.0044f, -0.0167f, 0.0533f, + -0.1584f, -0.0208f, -0.0269f, 0.1868f, +}; + +const float YG_mean16HR_16kHz[] = +{ + 0.0837f, 0.0372f, 0.0912f, 0.0878f, +}; + +const float YG_dicHR_4_16kHz[] = +{ + 0.0336f, 0.0267f, 0.0526f, 0.0053f, + 0.0802f, -0.0065f, 0.1313f, -0.0660f, + -0.0335f, -0.2078f, -0.0942f, -0.1717f, + -0.1312f, -0.0199f, -0.0596f, -0.0058f, + -0.0426f, -0.1039f, -0.0428f, -0.0858f, + 0.2103f, 0.2687f, 0.1701f, 0.1402f, + -0.0368f, -0.0036f, -0.0953f, -0.0589f, + -0.2022f, 0.0406f, 0.0402f, -0.0370f, + -0.0552f, 0.1323f, 0.0499f, -0.0270f, + 0.0450f, 0.2002f, -0.0219f, 0.0645f, + -0.0065f, 0.2172f, 0.1731f, 0.1270f, + 0.0205f, -0.0432f, -0.1742f, -0.0674f, + -0.0365f, -0.3219f, 0.1785f, -0.0473f, + -0.0792f, -0.0136f, 0.0290f, 0.0446f, + 0.1158f, -0.1206f, -0.1005f, 0.0128f, + 0.0381f, -0.3563f, -0.0904f, -0.0175f, + 0.1253f, 0.1103f, 0.2376f, 0.0693f, + 0.2207f, -0.0725f, 0.0756f, 0.0296f, + 0.3080f, 0.0724f, 0.2164f, 0.1716f, + 0.2403f, -0.2941f, 0.2234f, 0.0037f, + -0.0980f, 0.1115f, -0.0772f, 0.0333f, + 0.1119f, -0.4345f, 0.0818f, -0.1924f, + 0.1152f, -0.1945f, 0.0584f, -0.0809f, + -0.0954f, -0.5530f, 0.1204f, -0.0747f, + 0.1146f, -0.4752f, 0.0950f, 0.0684f, + 0.0368f, 0.1132f, -0.1772f, 0.0279f, + -0.1005f, 0.0244f, -0.2212f, -0.0313f, + 0.1534f, 0.2169f, 0.3173f, 0.2538f, + 0.3552f, 0.3364f, 0.3457f, 0.3297f, + -0.0003f, 0.0593f, -0.0401f, -0.0028f, + 0.1544f, 0.1517f, 0.1017f, 0.1697f, + 0.0969f, -0.2516f, 0.0871f, 0.1202f, + 0.0119f, -0.0682f, -0.0240f, -0.0075f, + -0.1389f, -0.0520f, -0.0920f, -0.1396f, + 0.0672f, 0.1392f, 0.0935f, 0.0373f, + 0.1082f, 0.0185f, 0.1273f, 0.1021f, + -0.3336f, -0.3825f, -0.6008f, -0.7142f, + -0.2587f, 0.0157f, -0.1429f, -0.0564f, + 0.0328f, 0.1196f, -0.0725f, -0.0929f, + -0.3548f, -0.2175f, -0.2930f, -0.2825f, + -0.0066f, 0.0587f, -0.4138f, 0.0117f, + 0.1133f, 0.0211f, -0.0499f, -0.0194f, + 0.1823f, 0.1128f, 0.0573f, 0.0140f, + 0.2655f, -0.1803f, 0.2675f, 0.2565f, + 0.2253f, 0.1513f, -0.1007f, 0.1000f, + -0.0639f, 0.0086f, 0.0303f, -0.0766f, + -0.1939f, 0.2057f, -0.2423f, 0.0769f, + 0.0686f, -0.1137f, 0.2511f, 0.0480f, + 0.0571f, -0.0847f, 0.0629f, 0.0448f, + -0.4005f, 0.0596f, -0.0270f, 0.0070f, + 0.0922f, 0.0418f, -0.0140f, 0.0958f, + -0.0218f, 0.0900f, 0.0477f, 0.1115f, + 0.1225f, 0.3240f, 0.0291f, 0.2393f, + -0.0158f, -0.0206f, -0.1019f, 0.0642f, + -0.1011f, -0.1364f, -0.1560f, -0.0251f, + -0.4360f, 0.0958f, -0.4289f, -0.1051f, + -0.1723f, -0.0732f, -0.2905f, -0.1783f, + -0.1166f, 0.0848f, -0.0978f, -0.0897f, + -0.0229f, -0.2016f, -0.0050f, -0.0033f, + -0.1734f, -0.1320f, 0.0110f, -0.0649f, + -0.0370f, -0.1189f, 0.0929f, -0.0594f, + -0.0657f, 0.0080f, 0.1716f, 0.0350f, + 0.0503f, -0.0355f, -0.0068f, -0.1159f, + -0.1695f, 0.1897f, 0.0702f, 0.0873f, +}; + +const float YG_meanL2G_16kHz[] = +{ + 0.1036f, 0.1590f, +}; + +const float YG_dicL2G_16kHz[] = +{ + -0.0624f, 0.0298f, + 0.0723f, 0.0768f, + -0.0553f, -0.0814f, + 0.1633f, 0.1633f, + 0.0249f, -0.0130f, + -0.1415f, -0.1581f, + -0.2937f, -0.3039f, + 0.2962f, 0.3062f, +}; + +const int16_t Odx_fft64[64] = +{ + 0,59,54,49,44,39,34,29,24,19,14,9,4,63,58,53,48,43,38,33,28,23,18,13,8,3,62,57,52,47,42,37, + 32,27,22,17,12,7,2,61,56,51,46,41,36,31,26,21,16,11,6,1,60,55,50,45,40,35,30,25,20,15,10,5 +}; + +const float w_fft64[32] = +{ + 1.0000000f,0.00000000f,0.70710677f,0.70710677f,0.92387950f,0.38268346f,0.38268346f,0.92387950f, + 0.98078525f,0.19509032f,0.55557024f,0.83146960f,0.83146960f,0.55557024f,0.19509032f,0.98078525f, + 0.99518472f,0.098017141f,0.63439327f,0.77301043f,0.88192123f,0.47139674f,0.29028469f,0.95694035f, + 0.95694035f,0.29028469f,0.47139674f,0.88192123f,0.77301043f,0.63439327f,0.098017141f,0.99518472f +}; + +const int16_t Ip_fft64[6] = { 32,1,0,64,32,96 }; + +const int16_t Odx_fft32_15[32] = { 0,17,2,19,4,21,6,23,8,25,10,27,12,29,14,31,16,1,18,3,20,5,22,7,24,9,26,11,28,13,30,15 }; + +const float w_fft32[16] = +{ + 1.0000000f,0.00000000f,0.70710677f,0.70710677f,0.92387950f,0.38268346f,0.38268346f,0.92387950f, + 0.98078525f,0.19509032f,0.55557024f,0.83146960f,0.83146960f,0.55557024f,0.19509032f,0.98078525f +}; + +const int16_t Ip_fft32[6] = { 16,1,0,32,16,48 }; + +const int16_t Odx_fft32_5[32] = { 0,27,22,17,12,7,2,29,24,19,14,9,4,31,26,21,16,11,6,1,28,23,18,13,8,3,30,25,20,15,10,5 }; + +const int16_t Odx_fft16[16] = {0,11,6,1,12,7,2,13,8,3,14,9,4,15,10,5}; + +const float w_fft16[8] = { 1.0000000f,0.00000000f,0.70710677f,0.70710677f,0.92387950f,0.38268346f,0.38268346f,0.92387950f }; + +const int16_t Ip_fft16[6] = {8,1,0,16,8,24}; + +const float w_fft8[8] = {1.0000000f,0.00000000f,0.70710677f,0.70710677f }; + +const int16_t Ip_fft8[6] = {4,1,0,8,4,12}; + +const int16_t Idx_dortft80[80] = +{ + 0,65,50,35,20,5,70,55,40,25,10,75,60,45,30,15,16,1,66,51,36,21,6,71,56,41,26,11,76,61, + 46,31,32,17,2,67,52,37,22,7,72,57,42,27,12,77,62,47,48,33,18,3,68,53,38,23,8,73,58,43, + 28,13,78,63,64,49,34,19,4,69,54,39,24,9,74,59,44,29,14,79 +}; + +const int16_t Idx_dortft120[120] = +{ + 0,105,90,75,60,45,30,15,16,1,106,91,76,61,46,31,32,17,2,107,92,77,62,47, + 48,33,18,3,108,93,78,63,64,49,34,19,4,109,94,79,80,65,50,35,20,5,110,95, + 96,81,66,51,36,21,6,111,112,97,82,67,52,37,22,7,8,113,98,83,68,53,38,23, + 24,9,114,99,84,69,54,39,40,25,10,115,100,85,70,55,56,41,26,11,116,101,86, + 71,72,57,42,27,12,117,102,87,88,73,58,43,28,13,118,103,104,89,74,59,44,29,14,119 +}; + +const int16_t Idx_dortft160[160] = +{ + 0,65,130,35,100,5,70,135,40,105,10,75,140,45,110,15,80,145, + 50,115,20,85,150,55,120,25,90,155,60,125,30,95,96,1,66,131, + 36,101,6,71,136,41,106,11,76,141,46,111,16,81,146,51,116,21, + 86,151,56,121,26,91,156,61,126,31,32,97,2,67,132,37,102,7, + 72,137,42,107,12,77,142,47,112,17,82,147,52,117,22,87,152,57, + 122,27,92,157,62,127,128,33,98,3,68,133,38,103,8,73,138,43, + 108,13,78,143,48,113,18,83,148,53,118,23,88,153,58,123,28,93, + 158,63,64,129,34,99,4,69,134,39,104,9,74,139,44,109,14,79, + 144,49,114,19,84,149,54,119,24,89,154,59,124,29,94,159 +}; + +const int16_t Idx_dortft320[320] = +{ + 0,65,130,195,260,5,70,135,200,265,10,75,140,205,270,15,80,145,210,275,20,85,150,215,280,25,90,155,220,285,30,95, + 160,225,290,35,100,165,230,295,40,105,170,235,300,45,110,175,240,305,50,115,180,245,310,55,120,185,250,315,60,125, + 190,255,256,1,66,131,196,261,6,71,136,201,266,11,76,141,206,271,16,81,146,211,276,21,86,151,216,281,26,91,156,221, + 286,31,96,161,226,291,36,101,166,231,296,41,106,171,236,301,46,111,176,241,306,51,116,181,246,311,56,121,186,251, + 316,61,126,191,192,257,2,67,132,197,262,7,72,137,202,267,12,77,142,207,272,17,82,147,212,277,22,87,152,217,282,27, + 92,157,222,287,32,97,162,227,292,37,102,167,232,297,42,107,172,237,302,47,112,177,242,307,52,117,182,247,312,57,122, + 187,252,317,62,127,128,193,258,3,68,133,198,263,8,73,138,203,268,13,78,143,208,273,18,83,148,213,278,23,88,153,218, + 283,28,93,158,223,288,33,98,163,228,293,38,103,168,233,298,43,108,173,238,303,48,113,178,243,308,53,118,183,248,313, + 58,123,188,253,318,63,64,129,194,259,4,69,134,199,264,9,74,139,204,269,14,79,144,209,274,19,84,149,214,279,24,89,154, + 219,284,29,94,159,224,289,34,99,164,229,294,39,104,169,234,299,44,109,174,239,304,49,114,179,244,309,54,119,184,249, + 314,59,124,189,254,319 +}; + +const int16_t Idx_dortft480[480] = +{ + 0,225,450,195,420,165,390,135,360,105,330,75,300,45,270,15,240,465,210,435,180,405,150,375,120,345, + 90,315,60,285,30,255,256,1,226,451,196,421,166,391,136,361,106,331,76,301,46,271,16,241,466,211,436, + 181,406,151,376,121,346,91,316,61,286,31,32,257,2,227,452,197,422,167,392,137,362,107,332,77,302,47, + 272,17,242,467,212,437,182,407,152,377,122,347,92,317,62,287,288,33,258,3,228,453,198,423,168,393,138, + 363,108,333,78,303,48,273,18,243,468,213,438,183,408,153,378,123,348,93,318,63,64,289,34,259,4,229,454, + 199,424,169,394,139,364,109,334,79,304,49,274,19,244,469,214,439,184,409,154,379,124,349,94,319,320, + 65,290,35,260,5,230,455,200,425,170,395,140,365,110,335,80,305,50,275,20,245,470,215,440,185,410,155, + 380,125,350,95,96,321,66,291,36,261,6,231,456,201,426,171,396,141,366,111,336,81,306,51,276,21,246,471, + 216,441,186,411,156,381,126,351,352,97,322,67,292,37,262,7,232,457,202,427,172,397,142,367,112,337,82, + 307,52,277,22,247,472,217,442,187,412,157,382,127,128,353,98,323,68,293,38,263,8,233,458,203,428,173, + 398,143,368,113,338,83,308,53,278,23,248,473,218,443,188,413,158,383,384,129,354,99,324,69,294,39,264, + 9,234,459,204,429,174,399,144,369,114,339,84,309,54,279,24,249,474,219,444,189,414,159,160,385,130,355, + 100,325,70,295,40,265,10,235,460,205,430,175,400,145,370,115,340,85,310,55,280,25,250,475,220,445,190, + 415,416,161,386,131,356,101,326,71,296,41,266,11,236,461,206,431,176,401,146,371,116,341,86,311,56,281, + 26,251,476,221,446,191,192,417,162,387,132,357,102,327,72,297,42,267,12,237,462,207,432,177,402,147,372, + 117,342,87,312,57,282,27,252,477,222,447,448,193,418,163,388,133,358,103,328,73,298,43,268,13,238,463, + 208,433,178,403,148,373,118,343,88,313,58,283,28,253,478,223,224,449,194,419,164,389,134,359,104,329,74, + 299,44,269,14,239,464,209,434,179,404,149,374,119,344,89,314,59,284,29,254,479 +}; + +const int16_t Ip_fft128[10] = { 64, 1, 0, 128, 64, 192, 32, 160, 96, 224 }; + +const float w_fft128[64] = +{ + 1.0000000f, 0.00000000f, 0.70710677f, 0.70710677f, 0.92387950f, 0.38268346f, 0.38268346f, 0.92387950f, + 0.98078525f, 0.19509032f, 0.55557024f, 0.83146960f, 0.83146960f, 0.55557024f, 0.19509032f, 0.98078525f, + 0.99518472f, 0.09801714f, 0.63439327f, 0.77301043f, 0.88192123f, 0.47139674f, 0.29028469f, 0.95694035f, + 0.95694035f, 0.29028469f, 0.47139674f, 0.88192123f, 0.77301043f, 0.63439327f, 0.09801714f, 0.99518472f, + 0.99879545f, 0.04906767f, 0.67155895f, 0.74095112f, 0.90398929f, 0.42755509f, 0.33688985f, 0.94154406f, + 0.97003125f, 0.24298017f, 0.51410274f, 0.85772861f, 0.80320753f, 0.59569930f, 0.14673047f, 0.98917650f, + 0.98917650f, 0.14673047f, 0.59569930f, 0.80320753f, 0.85772861f, 0.51410274f, 0.24298017f, 0.97003125f, + 0.94154406f, 0.33688985f, 0.42755509f, 0.90398929f, 0.74095112f, 0.67155895f, 0.04906767f, 0.99879545f +}; + +const int16_t Ip_fft256[10] = {128, 1, 0, 256, 128, 384, 64, 320,192, 448}; + +const float w_fft256[128] = +{ + 1.00000000f, 0.00000000f, 0.70710678f, 0.70710678f, 0.92387953f, 0.38268343f, 0.38268343f, 0.92387953f, + 0.98078528f, 0.19509032f, 0.55557023f, 0.83146961f, 0.83146961f, 0.55557023f, 0.19509032f, 0.98078528f, + 0.99518473f, 0.09801714f, 0.63439328f, 0.77301045f, 0.88192126f, 0.47139674f, 0.29028468f, 0.95694034f, + 0.95694034f, 0.29028468f, 0.47139674f, 0.88192126f, 0.77301045f, 0.63439328f, 0.09801714f, 0.99518473f, + 0.99879546f, 0.04906767f, 0.67155895f, 0.74095113f, 0.90398929f, 0.42755509f, 0.33688985f, 0.94154407f, + 0.97003125f, 0.24298018f, 0.51410274f, 0.85772861f, 0.80320753f, 0.59569930f, 0.14673047f, 0.98917651f, + 0.98917651f, 0.14673047f, 0.59569930f, 0.80320753f, 0.85772861f, 0.51410274f, 0.24298018f, 0.97003125f, + 0.94154407f, 0.33688985f, 0.42755509f, 0.90398929f, 0.74095113f, 0.67155895f, 0.04906767f, 0.99879546f, + 0.99969882f, 0.02454123f, 0.68954054f, 0.72424708f, 0.91420976f, 0.40524131f, 0.35989504f, 0.93299280f, + 0.97570213f, 0.21910124f, 0.53499762f, 0.84485357f, 0.81758481f, 0.57580819f, 0.17096189f, 0.98527764f, + 0.99247953f, 0.12241068f, 0.61523159f, 0.78834643f, 0.87008699f, 0.49289819f, 0.26671276f, 0.96377607f, + 0.94952818f, 0.31368174f, 0.44961133f, 0.89322430f, 0.75720885f, 0.65317284f, 0.07356456f, 0.99729046f, + 0.99729046f, 0.07356456f, 0.65317284f, 0.75720885f, 0.89322430f, 0.44961133f, 0.31368174f, 0.94952818f, + 0.96377607f, 0.26671276f, 0.49289819f, 0.87008699f, 0.78834643f, 0.61523159f, 0.12241068f, 0.99247953f, + 0.98527764f, 0.17096189f, 0.57580819f, 0.81758481f, 0.84485357f, 0.53499762f, 0.21910124f, 0.97570213f, + 0.93299280f, 0.35989504f, 0.40524131f, 0.91420976f, 0.72424708f, 0.68954054f, 0.02454123f, 0.99969882f +}; + +const int16_t Ip_fft512[18] = {256, 1, 0, 512, 256, 768, 128, 640,384, 896, 64, 576, 320, 832, 192, 704,448, 960}; + +const float w_fft512[256] = +{ + 1.00000000f, 0.00000000f, 0.70710678f, 0.70710678f, 0.92387953f, 0.38268343f, 0.38268343f, 0.92387953f, + 0.98078528f, 0.19509032f, 0.55557023f, 0.83146961f, 0.83146961f, 0.55557023f, 0.19509032f, 0.98078528f, + 0.99518473f, 0.09801714f, 0.63439328f, 0.77301045f, 0.88192126f, 0.47139674f, 0.29028468f, 0.95694034f, + 0.95694034f, 0.29028468f, 0.47139674f, 0.88192126f, 0.77301045f, 0.63439328f, 0.09801714f, 0.99518473f, + 0.99879546f, 0.04906767f, 0.67155895f, 0.74095113f, 0.90398929f, 0.42755509f, 0.33688985f, 0.94154407f, + 0.97003125f, 0.24298018f, 0.51410274f, 0.85772861f, 0.80320753f, 0.59569930f, 0.14673047f, 0.98917651f, + 0.98917651f, 0.14673047f, 0.59569930f, 0.80320753f, 0.85772861f, 0.51410274f, 0.24298018f, 0.97003125f, + 0.94154407f, 0.33688985f, 0.42755509f, 0.90398929f, 0.74095113f, 0.67155895f, 0.04906767f, 0.99879546f, + 0.99969882f, 0.02454123f, 0.68954054f, 0.72424708f, 0.91420976f, 0.40524131f, 0.35989504f, 0.93299280f, + 0.97570213f, 0.21910124f, 0.53499762f, 0.84485357f, 0.81758481f, 0.57580819f, 0.17096189f, 0.98527764f, + 0.99247953f, 0.12241068f, 0.61523159f, 0.78834643f, 0.87008699f, 0.49289819f, 0.26671276f, 0.96377607f, + 0.94952818f, 0.31368174f, 0.44961133f, 0.89322430f, 0.75720885f, 0.65317284f, 0.07356456f, 0.99729046f, + 0.99729046f, 0.07356456f, 0.65317284f, 0.75720885f, 0.89322430f, 0.44961133f, 0.31368174f, 0.94952818f, + 0.96377607f, 0.26671276f, 0.49289819f, 0.87008699f, 0.78834643f, 0.61523159f, 0.12241068f, 0.99247953f, + 0.98527764f, 0.17096189f, 0.57580819f, 0.81758481f, 0.84485357f, 0.53499762f, 0.21910124f, 0.97570213f, + 0.93299280f, 0.35989504f, 0.40524131f, 0.91420976f, 0.72424708f, 0.68954054f, 0.02454123f, 0.99969882f, + 0.99992470f, 0.01227154f, 0.69837625f, 0.71573083f, 0.91911385f, 0.39399204f, 0.37131719f, 0.92850608f, + 0.97831737f, 0.20711138f, 0.54532499f, 0.83822471f, 0.82458930f, 0.56573181f, 0.18303989f, 0.98310549f, + 0.99390697f, 0.11022221f, 0.62485949f, 0.78073723f, 0.87607009f, 0.48218377f, 0.27851969f, 0.96043052f, + 0.95330604f, 0.30200595f, 0.46053871f, 0.88763962f, 0.76516727f, 0.64383154f, 0.08579731f, 0.99631261f, + 0.99811811f, 0.06132074f, 0.66241578f, 0.74913639f, 0.89867447f, 0.43861624f, 0.32531029f, 0.94560733f, + 0.96697647f, 0.25486566f, 0.50353838f, 0.86397286f, 0.79583690f, 0.60551104f, 0.13458071f, 0.99090264f, + 0.98730142f, 0.15885814f, 0.58579786f, 0.81045720f, 0.85135519f, 0.52458968f, 0.23105811f, 0.97293995f, + 0.93733901f, 0.34841868f, 0.41642956f, 0.90916798f, 0.73265427f, 0.68060100f, 0.03680722f, 0.99932238f, + 0.99932238f, 0.03680722f, 0.68060100f, 0.73265427f, 0.90916798f, 0.41642956f, 0.34841868f, 0.93733901f, + 0.97293995f, 0.23105811f, 0.52458968f, 0.85135519f, 0.81045720f, 0.58579786f, 0.15885814f, 0.98730142f, + 0.99090264f, 0.13458071f, 0.60551104f, 0.79583690f, 0.86397286f, 0.50353838f, 0.25486566f, 0.96697647f, + 0.94560733f, 0.32531029f, 0.43861624f, 0.89867447f, 0.74913639f, 0.66241578f, 0.06132074f, 0.99811811f, + 0.99631261f, 0.08579731f, 0.64383154f, 0.76516727f, 0.88763962f, 0.46053871f, 0.30200595f, 0.95330604f, + 0.96043052f, 0.27851969f, 0.48218377f, 0.87607009f, 0.78073723f, 0.62485949f, 0.11022221f, 0.99390697f, + 0.98310549f, 0.18303989f, 0.56573181f, 0.82458930f, 0.83822471f, 0.54532499f, 0.20711138f, 0.97831737f, + 0.92850608f, 0.37131719f, 0.39399204f, 0.91911385f, 0.71573083f, 0.69837625f, 0.01227154f, 0.99992470f +}; + +const int16_t Idx_dortft40[40] = +{ + 0, 25, 10, 35, 20, 5, 30, 15, 16, 1, 26, 11, 36, 21, 6, 31, 32, 17, 2, 27, + 12, 37, 22, 7, 8, 33, 18, 3, 28, 13, 38, 23, 24, 9, 34, 19, 4, 29, 14, 39 +}; + +const int16_t Odx_fft8_5[8] = {0, 3, 6, 1, 4, 7, 2, 5}; +const int16_t Idx_dortft20[20] = {0, 5, 10, 15, 16, 1, 6, 11, 12, 17, 2, 7, 8, 13, 18, 3, 4, 9, 14, 19}; +const int16_t Odx_fft4_5[4] = {0, 3, 2, 1}; +const float w_fft4[2] = {1.0000000f, 0.00000000f}; +const int16_t Ip_fft4[6] = {2,1,0,4,2,6}; +const int16_t ip_edct2_64[6] = {16, 64, 0, 32, 16, 48}; + +const float w_edct2_64[80] = +{ + 1.00000000f, 0.00000000f, 0.70710678f, 0.70710678f, 0.92387953f, 0.38268343f, 0.38268343f, 0.92387953f, + 0.98078528f, 0.19509032f, 0.55557023f, 0.83146961f, 0.83146961f, 0.55557023f, 0.19509032f, 0.98078528f, + 0.70710678f, 0.49984940f, 0.49939772f, 0.49864522f, 0.49759236f, 0.49623976f, 0.49458825f, 0.49263882f, + 0.49039264f, 0.48785106f, 0.48501562f, 0.48188803f, 0.47847016f, 0.47476409f, 0.47077203f, 0.46649639f, + 0.46193976f, 0.45710487f, 0.45199464f, 0.44661215f, 0.44096063f, 0.43504349f, 0.42886430f, 0.42242678f, + 0.41573480f, 0.40879240f, 0.40160376f, 0.39417321f, 0.38650522f, 0.37860442f, 0.37047556f, 0.36212354f, + 0.35355339f, 0.34477027f, 0.33577947f, 0.32658642f, 0.31719664f, 0.30761579f, 0.29784965f, 0.28790409f, + 0.27778511f, 0.26749880f, 0.25705137f, 0.24644909f, 0.23569836f, 0.22480566f, 0.21377754f, 0.20262065f, + 0.19134171f, 0.17994751f, 0.16844492f, 0.15684087f, 0.14514233f, 0.13335637f, 0.12149008f, 0.10955062f, + 0.09754516f, 0.08548094f, 0.07336523f, 0.06120533f, 0.04900857f, 0.03678228f, 0.02453383f, 0.01227061f +}; + +const float FFT_RotVector_32[40] = { + 0.9807852507f, -0.1950903237f, 0.9238796234f, -0.3826834261f, 0.8314696550f, -0.5555702448f, 0.7071067691f, -0.7071067691f, + 0.5555703044f, -0.8314695954f, 0.3826835155f, -0.9238795042f, 0.1950902939f, -0.9807852507f, 0.9238796234f, -0.3826834261f, + 0.7071067691f, -0.7071067691f, 0.3826835155f, -0.9238795042f, -0.3826833963f, -0.9238795042f, -0.7071067691f, -0.7071067691f, + -0.9238795042f, -0.3826834261f, 0.8314696550f, -0.5555702448f, 0.3826835155f, -0.9238795042f, -0.1950902939f, -0.9807852507f, + -0.7071067691f, -0.7071067691f, -0.9807852507f, -0.1950903237f, -0.9238796234f, 0.3826834261f, -0.5555703044f, 0.8314695954f +}; + +const float FFT_RotVector_256[448] = { + 1.0000000000f, -0.0000000000f, 0.9996988177f, -0.0245412290f, 0.9987954497f, -0.0490676761f, 0.9972904325f, -0.0735645667f, + 0.9951847196f, -0.0980171412f, 0.9924795628f, -0.1224106774f, 0.9891765118f, -0.1467304677f, 0.9852776527f, -0.1709618866f, + 0.9807852507f, -0.1950903237f, 0.9757021070f, -0.2191012353f, 0.9700312614f, -0.2429801822f, 0.9637760520f, -0.2667127550f, + 0.9569403529f, -0.2902846634f, 0.9495281577f, -0.3136817515f, 0.9415440559f, -0.3368898630f, 0.9329928160f, -0.3598950505f, + 0.9238795042f, -0.3826834261f, 0.9142097831f, -0.4052413106f, 0.9039893150f, -0.4275550842f, 0.8932242990f, -0.4496113360f, + 0.8819212914f, -0.4713967443f, 0.8700869679f, -0.4928981960f, 0.8577286005f, -0.5141027570f, 0.8448535800f, -0.5349976420f, + 0.8314695954f, -0.5555702448f, 0.8175848126f, -0.5758081675f, 0.8032075167f, -0.5956993103f, 0.7883464098f, -0.6152315736f, + 0.7730104327f, -0.6343932748f, 0.7572088242f, -0.6531728506f, 0.7409511209f, -0.6715589762f, 0.7242470980f, -0.6895405650f, + 1.0000000000f, -0.0000000000f, 0.9987954497f, -0.0490676761f, 0.9951847196f, -0.0980171412f, 0.9891765118f, -0.1467304677f, + 0.9807852507f, -0.1950903237f, 0.9700312614f, -0.2429801822f, 0.9569403529f, -0.2902846634f, 0.9415440559f, -0.3368898630f, + 0.9238795042f, -0.3826834261f, 0.9039893150f, -0.4275550842f, 0.8819212914f, -0.4713967443f, 0.8577286005f, -0.5141027570f, + 0.8314695954f, -0.5555702448f, 0.8032075167f, -0.5956993103f, 0.7730104327f, -0.6343932748f, 0.7409511209f, -0.6715589762f, + 0.7071067691f, -0.7071067691f, 0.6715589762f, -0.7409511209f, 0.6343932748f, -0.7730104327f, 0.5956993103f, -0.8032075167f, + 0.5555702448f, -0.8314695954f, 0.5141027570f, -0.8577286005f, 0.4713967443f, -0.8819212914f, 0.4275550842f, -0.9039893150f, + 0.3826834261f, -0.9238795042f, 0.3368898630f, -0.9415440559f, 0.2902846634f, -0.9569403529f, 0.2429801822f, -0.9700312614f, + 0.1950903237f, -0.9807852507f, 0.1467304677f, -0.9891765118f, 0.0980171412f, -0.9951847196f, 0.0490676761f, -0.9987954497f, + 1.0000000000f, -0.0000000000f, 0.9972904325f, -0.0735645667f, 0.9891765118f, -0.1467304677f, 0.9757021070f, -0.2191012353f, + 0.9569403529f, -0.2902846634f, 0.9329928160f, -0.3598950505f, 0.9039893150f, -0.4275550842f, 0.8700869679f, -0.4928981960f, + 0.8314695954f, -0.5555702448f, 0.7883464098f, -0.6152315736f, 0.7409511209f, -0.6715589762f, 0.6895405650f, -0.7242470980f, + 0.6343932748f, -0.7730104327f, 0.5758081675f, -0.8175848126f, 0.5141027570f, -0.8577286005f, 0.4496113360f, -0.8932242990f, + 0.3826834261f, -0.9238795042f, 0.3136817515f, -0.9495281577f, 0.2429801822f, -0.9700312614f, 0.1709618866f, -0.9852776527f, + 0.0980171412f, -0.9951847196f, 0.0245412290f, -0.9996988177f, -0.0490676761f, -0.9987954497f, -0.1224106774f, -0.9924795628f, + -0.1950903237f, -0.9807852507f, -0.2667127550f, -0.9637760520f, -0.3368898630f, -0.9415440559f, -0.4052413106f, -0.9142097831f, + -0.4713967443f, -0.8819212914f, -0.5349976420f, -0.8448535800f, -0.5956993103f, -0.8032075167f, -0.6531728506f, -0.7572088242f, + 1.0000000000f, -0.0000000000f, 0.9951847196f, -0.0980171412f, 0.9807852507f, -0.1950903237f, 0.9569403529f, -0.2902846634f, + 0.9238795042f, -0.3826834261f, 0.8819212914f, -0.4713967443f, 0.8314695954f, -0.5555702448f, 0.7730104327f, -0.6343932748f, + 0.7071067691f, -0.7071067691f, 0.6343932748f, -0.7730104327f, 0.5555702448f, -0.8314695954f, 0.4713967443f, -0.8819212914f, + 0.3826834261f, -0.9238795042f, 0.2902846634f, -0.9569403529f, 0.1950903237f, -0.9807852507f, 0.0980171412f, -0.9951847196f, + -0.0000000000f, -1.0000000000f, -0.0980171412f, -0.9951847196f, -0.1950903237f, -0.9807852507f, -0.2902846634f, -0.9569403529f, + -0.3826834261f, -0.9238795042f, -0.4713967443f, -0.8819212914f, -0.5555702448f, -0.8314695954f, -0.6343932748f, -0.7730104327f, + -0.7071067691f, -0.7071067691f, -0.7730104327f, -0.6343932748f, -0.8314695954f, -0.5555702448f, -0.8819212914f, -0.4713967443f, + -0.9238795042f, -0.3826834261f, -0.9569403529f, -0.2902846634f, -0.9807852507f, -0.1950903237f, -0.9951847196f, -0.0980171412f, + 1.0000000000f, -0.0000000000f, 0.9924795628f, -0.1224106774f, 0.9700312614f, -0.2429801822f, 0.9329928160f, -0.3598950505f, + 0.8819212914f, -0.4713967443f, 0.8175848126f, -0.5758081675f, 0.7409511209f, -0.6715589762f, 0.6531728506f, -0.7572088242f, + 0.5555702448f, -0.8314695954f, 0.4496113360f, -0.8932242990f, 0.3368898630f, -0.9415440559f, 0.2191012353f, -0.9757021070f, + 0.0980171412f, -0.9951847196f, -0.0245412290f, -0.9996988177f, -0.1467304677f, -0.9891765118f, -0.2667127550f, -0.9637760520f, + -0.3826834261f, -0.9238795042f, -0.4928981960f, -0.8700869679f, -0.5956993103f, -0.8032075167f, -0.6895405650f, -0.7242470980f, + -0.7730104327f, -0.6343932748f, -0.8448535800f, -0.5349976420f, -0.9039893150f, -0.4275550842f, -0.9495281577f, -0.3136817515f, + -0.9807852507f, -0.1950903237f, -0.9972904325f, -0.0735645667f, -0.9987954497f, 0.0490676761f, -0.9852776527f, 0.1709618866f, + -0.9569403529f, 0.2902846634f, -0.9142097831f, 0.4052413106f, -0.8577286005f, 0.5141027570f, -0.7883464098f, 0.6152315736f, + 1.0000000000f, -0.0000000000f, 0.9891765118f, -0.1467304677f, 0.9569403529f, -0.2902846634f, 0.9039893150f, -0.4275550842f, + 0.8314695954f, -0.5555702448f, 0.7409511209f, -0.6715589762f, 0.6343932748f, -0.7730104327f, 0.5141027570f, -0.8577286005f, + 0.3826834261f, -0.9238795042f, 0.2429801822f, -0.9700312614f, 0.0980171412f, -0.9951847196f, -0.0490676761f, -0.9987954497f, + -0.1950903237f, -0.9807852507f, -0.3368898630f, -0.9415440559f, -0.4713967443f, -0.8819212914f, -0.5956993103f, -0.8032075167f, + -0.7071067691f, -0.7071067691f, -0.8032075167f, -0.5956993103f, -0.8819212914f, -0.4713967443f, -0.9415440559f, -0.3368898630f, + -0.9807852507f, -0.1950903237f, -0.9987954497f, -0.0490676761f, -0.9951847196f, 0.0980171412f, -0.9700312614f, 0.2429801822f, + -0.9238795042f, 0.3826834261f, -0.8577286005f, 0.5141027570f, -0.7730104327f, 0.6343932748f, -0.6715589762f, 0.7409511209f, + -0.5555702448f, 0.8314695954f, -0.4275550842f, 0.9039893150f, -0.2902846634f, 0.9569403529f, -0.1467304677f, 0.9891765118f, + 1.0000000000f, -0.0000000000f, 0.9852776527f, -0.1709618866f, 0.9415440559f, -0.3368898630f, 0.8700869679f, -0.4928981960f, + 0.7730104327f, -0.6343932748f, 0.6531728506f, -0.7572088242f, 0.5141027570f, -0.8577286005f, 0.3598950505f, -0.9329928160f, + 0.1950903237f, -0.9807852507f, 0.0245412290f, -0.9996988177f, -0.1467304677f, -0.9891765118f, -0.3136817515f, -0.9495281577f, + -0.4713967443f, -0.8819212914f, -0.6152315736f, -0.7883464098f, -0.7409511209f, -0.6715589762f, -0.8448535800f, -0.5349976420f, + -0.9238795042f, -0.3826834261f, -0.9757021070f, -0.2191012353f, -0.9987954497f, -0.0490676761f, -0.9924795628f, 0.1224106774f, + -0.9569403529f, 0.2902846634f, -0.8932242990f, 0.4496113360f, -0.8032075167f, 0.5956993103f, -0.6895405650f, 0.7242470980f, + -0.5555702448f, 0.8314695954f, -0.4052413106f, 0.9142097831f, -0.2429801822f, 0.9700312614f, -0.0735645667f, 0.9972904325f, + 0.0980171412f, 0.9951847196f, 0.2667127550f, 0.9637760520f, 0.4275550842f, 0.9039893150f, 0.5758081675f, 0.8175848126f +}; + +const float FFT_RotVector_400[760] = { + 1.0000000000f, -0.0000000000f, 0.9995065331f, -0.0314107575f, 0.9980267286f, -0.0627905205f, 0.9955619574f, -0.0941083133f, + 0.9921147227f, -0.1253332347f, 0.9876883626f, -0.1564344615f, 0.9822872281f, -0.1873813123f, 0.9759167433f, -0.2181432396f, + 0.9685831666f, -0.2486898899f, 0.9602937102f, -0.2789911032f, 0.9510565400f, -0.3090170026f, 0.9408807755f, -0.3387379348f, + 0.9297764897f, -0.3681245446f, 0.9177546501f, -0.3971478939f, 0.9048270583f, -0.4257792830f, 0.8910065293f, -0.4539904892f, + 0.8763066530f, -0.4817536771f, 0.8607420325f, -0.5090414286f, 0.8443279266f, -0.5358268023f, 0.8270805478f, -0.5620833635f, + 1.0000000000f, -0.0000000000f, 0.9980267286f, -0.0627905205f, 0.9921147227f, -0.1253332347f, 0.9822872281f, -0.1873813123f, + 0.9685831666f, -0.2486898899f, 0.9510565400f, -0.3090170026f, 0.9297764897f, -0.3681245446f, 0.9048270583f, -0.4257792830f, + 0.8763066530f, -0.4817536771f, 0.8443279266f, -0.5358268023f, 0.8090170026f, -0.5877852440f, 0.7705132365f, -0.6374239922f, + 0.7289686203f, -0.6845471263f, 0.6845471263f, -0.7289686203f, 0.6374239922f, -0.7705132365f, 0.5877852440f, -0.8090170026f, + 0.5358268023f, -0.8443279266f, 0.4817536771f, -0.8763066530f, 0.4257792830f, -0.9048270583f, 0.3681245446f, -0.9297764897f, + 1.0000000000f, -0.0000000000f, 0.9955619574f, -0.0941083133f, 0.9822872281f, -0.1873813123f, 0.9602937102f, -0.2789911032f, + 0.9297764897f, -0.3681245446f, 0.8910065293f, -0.4539904892f, 0.8443279266f, -0.5358268023f, 0.7901549935f, -0.6129070520f, + 0.7289686203f, -0.6845471263f, 0.6613118649f, -0.7501110435f, 0.5877852440f, -0.8090170026f, 0.5090414286f, -0.8607420325f, + 0.4257792830f, -0.9048270583f, 0.3387379348f, -0.9408807755f, 0.2486898899f, -0.9685831666f, 0.1564344615f, -0.9876883626f, + 0.0627905205f, -0.9980267286f, -0.0314107575f, -0.9995065331f, -0.1253332347f, -0.9921147227f, -0.2181432396f, -0.9759167433f, + 1.0000000000f, -0.0000000000f, 0.9921147227f, -0.1253332347f, 0.9685831666f, -0.2486898899f, 0.9297764897f, -0.3681245446f, + 0.8763066530f, -0.4817536771f, 0.8090170026f, -0.5877852440f, 0.7289686203f, -0.6845471263f, 0.6374239922f, -0.7705132365f, + 0.5358268023f, -0.8443279266f, 0.4257792830f, -0.9048270583f, 0.3090170026f, -0.9510565400f, 0.1873813123f, -0.9822872281f, + 0.0627905205f, -0.9980267286f, -0.0627905205f, -0.9980267286f, -0.1873813123f, -0.9822872281f, -0.3090170026f, -0.9510565400f, + -0.4257792830f, -0.9048270583f, -0.5358268023f, -0.8443279266f, -0.6374239922f, -0.7705132365f, -0.7289686203f, -0.6845471263f, + 1.0000000000f, -0.0000000000f, 0.9876883626f, -0.1564344615f, 0.9510565400f, -0.3090170026f, 0.8910065293f, -0.4539904892f, + 0.8090170026f, -0.5877852440f, 0.7071067691f, -0.7071067691f, 0.5877852440f, -0.8090170026f, 0.4539904892f, -0.8910065293f, + 0.3090170026f, -0.9510565400f, 0.1564344615f, -0.9876883626f, -0.0000000000f, -1.0000000000f, -0.1564344615f, -0.9876883626f, + -0.3090170026f, -0.9510565400f, -0.4539904892f, -0.8910065293f, -0.5877852440f, -0.8090170026f, -0.7071067691f, -0.7071067691f, + -0.8090170026f, -0.5877852440f, -0.8910065293f, -0.4539904892f, -0.9510565400f, -0.3090170026f, -0.9876883626f, -0.1564344615f, + 1.0000000000f, -0.0000000000f, 0.9822872281f, -0.1873813123f, 0.9297764897f, -0.3681245446f, 0.8443279266f, -0.5358268023f, + 0.7289686203f, -0.6845471263f, 0.5877852440f, -0.8090170026f, 0.4257792830f, -0.9048270583f, 0.2486898899f, -0.9685831666f, + 0.0627905205f, -0.9980267286f, -0.1253332347f, -0.9921147227f, -0.3090170026f, -0.9510565400f, -0.4817536771f, -0.8763066530f, + -0.6374239922f, -0.7705132365f, -0.7705132365f, -0.6374239922f, -0.8763066530f, -0.4817536771f, -0.9510565400f, -0.3090170026f, + -0.9921147227f, -0.1253332347f, -0.9980267286f, 0.0627905205f, -0.9685831666f, 0.2486898899f, -0.9048270583f, 0.4257792830f, + 1.0000000000f, -0.0000000000f, 0.9759167433f, -0.2181432396f, 0.9048270583f, -0.4257792830f, 0.7901549935f, -0.6129070520f, + 0.6374239922f, -0.7705132365f, 0.4539904892f, -0.8910065293f, 0.2486898899f, -0.9685831666f, 0.0314107575f, -0.9995065331f, + -0.1873813123f, -0.9822872281f, -0.3971478939f, -0.9177546501f, -0.5877852440f, -0.8090170026f, -0.7501110435f, -0.6613118649f, + -0.8763066530f, -0.4817536771f, -0.9602937102f, -0.2789911032f, -0.9980267286f, -0.0627905205f, -0.9876883626f, 0.1564344615f, + -0.9297764897f, 0.3681245446f, -0.8270805478f, 0.5620833635f, -0.6845471263f, 0.7289686203f, -0.5090414286f, 0.8607420325f, + 1.0000000000f, -0.0000000000f, 0.9685831666f, -0.2486898899f, 0.8763066530f, -0.4817536771f, 0.7289686203f, -0.6845471263f, + 0.5358268023f, -0.8443279266f, 0.3090170026f, -0.9510565400f, 0.0627905205f, -0.9980267286f, -0.1873813123f, -0.9822872281f, + -0.4257792830f, -0.9048270583f, -0.6374239922f, -0.7705132365f, -0.8090170026f, -0.5877852440f, -0.9297764897f, -0.3681245446f, + -0.9921147227f, -0.1253332347f, -0.9921147227f, 0.1253332347f, -0.9297764897f, 0.3681245446f, -0.8090170026f, 0.5877852440f, + -0.6374239922f, 0.7705132365f, -0.4257792830f, 0.9048270583f, -0.1873813123f, 0.9822872281f, 0.0627905205f, 0.9980267286f, + 1.0000000000f, -0.0000000000f, 0.9602937102f, -0.2789911032f, 0.8443279266f, -0.5358268023f, 0.6613118649f, -0.7501110435f, + 0.4257792830f, -0.9048270583f, 0.1564344615f, -0.9876883626f, -0.1253332347f, -0.9921147227f, -0.3971478939f, -0.9177546501f, + -0.6374239922f, -0.7705132365f, -0.8270805478f, -0.5620833635f, -0.9510565400f, -0.3090170026f, -0.9995065331f, -0.0314107575f, + -0.9685831666f, 0.2486898899f, -0.8607420325f, 0.5090414286f, -0.6845471263f, 0.7289686203f, -0.4539904892f, 0.8910065293f, + -0.1873813123f, 0.9822872281f, 0.0941083133f, 0.9955619574f, 0.3681245446f, 0.9297764897f, 0.6129070520f, 0.7901549935f, + 1.0000000000f, -0.0000000000f, 0.9998766184f, -0.0157073177f, 0.9995065331f, -0.0314107575f, 0.9988898635f, -0.0471064523f, + 0.9980267286f, -0.0627905205f, 0.9969173074f, -0.0784590989f, 0.9955619574f, -0.0941083133f, 0.9939609766f, -0.1097343117f, + 0.9921147227f, -0.1253332347f, 0.9900236726f, -0.1409012377f, 0.9876883626f, -0.1564344615f, 0.9851093292f, -0.1719291061f, + 0.9822872281f, -0.1873813123f, 0.9792228341f, -0.2027872950f, 0.9759167433f, -0.2181432396f, 0.9723699093f, -0.2334453613f, + 0.9685831666f, -0.2486898899f, 0.9645574093f, -0.2638730407f, 0.9602937102f, -0.2789911032f, 0.9557930231f, -0.2940403223f, + 1.0000000000f, -0.0000000000f, 0.9988898635f, -0.0471064523f, 0.9955619574f, -0.0941083133f, 0.9900236726f, -0.1409012377f, + 0.9822872281f, -0.1873813123f, 0.9723699093f, -0.2334453613f, 0.9602937102f, -0.2789911032f, 0.9460853338f, -0.3239174187f, + 0.9297764897f, -0.3681245446f, 0.9114032984f, -0.4115143716f, 0.8910065293f, -0.4539904892f, 0.8686315417f, -0.4954586625f, + 0.8443279266f, -0.5358268023f, 0.8181497455f, -0.5750052333f, 0.7901549935f, -0.6129070520f, 0.7604059577f, -0.6494480371f, + 0.7289686203f, -0.6845471263f, 0.6959127784f, -0.7181262970f, 0.6613118649f, -0.7501110435f, 0.6252426505f, -0.7804304361f, + 1.0000000000f, -0.0000000000f, 0.9969173074f, -0.0784590989f, 0.9876883626f, -0.1564344615f, 0.9723699093f, -0.2334453613f, + 0.9510565400f, -0.3090170026f, 0.9238795042f, -0.3826834261f, 0.8910065293f, -0.4539904892f, 0.8526401520f, -0.5224985480f, + 0.8090170026f, -0.5877852440f, 0.7604059577f, -0.6494480371f, 0.7071067691f, -0.7071067691f, 0.6494480371f, -0.7604059577f, + 0.5877852440f, -0.8090170026f, 0.5224985480f, -0.8526401520f, 0.4539904892f, -0.8910065293f, 0.3826834261f, -0.9238795042f, + 0.3090170026f, -0.9510565400f, 0.2334453613f, -0.9723699093f, 0.1564344615f, -0.9876883626f, 0.0784590989f, -0.9969173074f, + 1.0000000000f, -0.0000000000f, 0.9939609766f, -0.1097343117f, 0.9759167433f, -0.2181432396f, 0.9460853338f, -0.3239174187f, + 0.9048270583f, -0.4257792830f, 0.8526401520f, -0.5224985480f, 0.7901549935f, -0.6129070520f, 0.7181262970f, -0.6959127784f, + 0.6374239922f, -0.7705132365f, 0.5490227938f, -0.8358073831f, 0.4539904892f, -0.8910065293f, 0.3534748554f, -0.9354440570f, + 0.2486898899f, -0.9685831666f, 0.1409012377f, -0.9900236726f, 0.0314107575f, -0.9995065331f, -0.0784590989f, -0.9969173074f, + -0.1873813123f, -0.9822872281f, -0.2940403223f, -0.9557930231f, -0.3971478939f, -0.9177546501f, -0.4954586625f, -0.8686315417f, + 1.0000000000f, -0.0000000000f, 0.9900236726f, -0.1409012377f, 0.9602937102f, -0.2789911032f, 0.9114032984f, -0.4115143716f, + 0.8443279266f, -0.5358268023f, 0.7604059577f, -0.6494480371f, 0.6613118649f, -0.7501110435f, 0.5490227938f, -0.8358073831f, + 0.4257792830f, -0.9048270583f, 0.2940403223f, -0.9557930231f, 0.1564344615f, -0.9876883626f, 0.0157073177f, -0.9998766184f, + -0.1253332347f, -0.9921147227f, -0.2638730407f, -0.9645574093f, -0.3971478939f, -0.9177546501f, -0.5224985480f, -0.8526401520f, + -0.6374239922f, -0.7705132365f, -0.7396311164f, -0.6730124950f, -0.8270805478f, -0.5620833635f, -0.8980275989f, -0.4399391711f, + 1.0000000000f, -0.0000000000f, 0.9851093292f, -0.1719291061f, 0.9408807755f, -0.3387379348f, 0.8686315417f, -0.4954586625f, + 0.7705132365f, -0.6374239922f, 0.6494480371f, -0.7604059577f, 0.5090414286f, -0.8607420325f, 0.3534748554f, -0.9354440570f, + 0.1873813123f, -0.9822872281f, 0.0157073177f, -0.9998766184f, -0.1564344615f, -0.9876883626f, -0.3239174187f, -0.9460853338f, + -0.4817536771f, -0.8763066530f, -0.6252426505f, -0.7804304361f, -0.7501110435f, -0.6613118649f, -0.8526401520f, -0.5224985480f, + -0.9297764897f, -0.3681245446f, -0.9792228341f, -0.2027872950f, -0.9995065331f, -0.0314107575f, -0.9900236726f, 0.1409012377f, + 1.0000000000f, -0.0000000000f, 0.9792228341f, -0.2027872950f, 0.9177546501f, -0.3971478939f, 0.8181497455f, -0.5750052333f, + 0.6845471263f, -0.7289686203f, 0.5224985480f, -0.8526401520f, 0.3387379348f, -0.9408807755f, 0.1409012377f, -0.9900236726f, + -0.0627905205f, -0.9980267286f, -0.2638730407f, -0.9645574093f, -0.4539904892f, -0.8910065293f, -0.6252426505f, -0.7804304361f, + -0.7705132365f, -0.6374239922f, -0.8837656379f, -0.4679298103f, -0.9602937102f, -0.2789911032f, -0.9969173074f, -0.0784590989f, + -0.9921147227f, 0.1253332347f, -0.9460853338f, 0.3239174187f, -0.8607420325f, 0.5090414286f, -0.7396311164f, 0.6730124950f, + 1.0000000000f, -0.0000000000f, 0.9723699093f, -0.2334453613f, 0.8910065293f, -0.4539904892f, 0.7604059577f, -0.6494480371f, + 0.5877852440f, -0.8090170026f, 0.3826834261f, -0.9238795042f, 0.1564344615f, -0.9876883626f, -0.0784590989f, -0.9969173074f, + -0.3090170026f, -0.9510565400f, -0.5224985480f, -0.8526401520f, -0.7071067691f, -0.7071067691f, -0.8526401520f, -0.5224985480f, + -0.9510565400f, -0.3090170026f, -0.9969173074f, -0.0784590989f, -0.9876883626f, 0.1564344615f, -0.9238795042f, 0.3826834261f, + -0.8090170026f, 0.5877852440f, -0.6494480371f, 0.7604059577f, -0.4539904892f, 0.8910065293f, -0.2334453613f, 0.9723699093f, + 1.0000000000f, -0.0000000000f, 0.9645574093f, -0.2638730407f, 0.8607420325f, -0.5090414286f, 0.6959127784f, -0.7181262970f, + 0.4817536771f, -0.8763066530f, 0.2334453613f, -0.9723699093f, -0.0314107575f, -0.9995065331f, -0.2940403223f, -0.9557930231f, + -0.5358268023f, -0.8443279266f, -0.7396311164f, -0.6730124950f, -0.8910065293f, -0.4539904892f, -0.9792228341f, -0.2027872950f, + -0.9980267286f, 0.0627905205f, -0.9460853338f, 0.3239174187f, -0.8270805478f, 0.5620833635f, -0.6494480371f, 0.7604059577f, + -0.4257792830f, 0.9048270583f, -0.1719291061f, 0.9851093292f, 0.0941083133f, 0.9955619574f, 0.3534748554f, 0.9354440570f, + 1.0000000000f, -0.0000000000f, 0.9557930231f, -0.2940403223f, 0.8270805478f, -0.5620833635f, 0.6252426505f, -0.7804304361f, + 0.3681245446f, -0.9297764897f, 0.0784590989f, -0.9969173074f, -0.2181432396f, -0.9759167433f, -0.4954586625f, -0.8686315417f, + -0.7289686203f, -0.6845471263f, -0.8980275989f, -0.4399391711f, -0.9876883626f, -0.1564344615f, -0.9900236726f, 0.1409012377f, + -0.9048270583f, 0.4257792830f, -0.7396311164f, 0.6730124950f, -0.5090414286f, 0.8607420325f, -0.2334453613f, 0.9723699093f, + 0.0627905205f, 0.9980267286f, 0.3534748554f, 0.9354440570f, 0.6129070520f, 0.7901549935f, 0.8181497455f, 0.5750052333f +}; + +const float FFT_RotVector_600[1140] = { + 1.0000000000f, -0.0000000000f, 0.9997806549f, -0.0209424198f, + 0.9991228580f, -0.0418756530f, 0.9980267286f, -0.0627905205f, 0.9964928627f, -0.0836778432f, 0.9945219159f, -0.1045284644f, + 0.9921147227f, -0.1253332347f, 0.9892723560f, -0.1460830271f, 0.9859960079f, -0.1667687446f, 0.9822872281f, -0.1873813123f, + 0.9781476259f, -0.2079116851f, 0.9735789299f, -0.2283508629f, 0.9685831666f, -0.2486898899f, 0.9631625414f, -0.2689198256f, + 0.9573194981f, -0.2890318036f, 0.9510565400f, -0.3090170026f, 0.9443763494f, -0.3288666606f, 0.9372819662f, -0.3485720456f, + 0.9297764897f, -0.3681245446f, 0.9218631387f, -0.3875155747f, 0.9135454297f, -0.4067366421f, 0.9048270583f, -0.4257792830f, + 0.8957117796f, -0.4446351826f, 0.8862035871f, -0.4632960260f, 0.8763066530f, -0.4817536771f, 0.8660253882f, -0.5000000000f, + 0.8553642631f, -0.5180270076f, 0.8443279266f, -0.5358268023f, 0.8329212666f, -0.5533915758f, 0.8211492300f, -0.5707135797f, + 1.0000000000f, -0.0000000000f, 0.9991228580f, -0.0418756530f, 0.9964928627f, -0.0836778432f, 0.9921147227f, -0.1253332347f, + 0.9859960079f, -0.1667687446f, 0.9781476259f, -0.2079116851f, 0.9685831666f, -0.2486898899f, 0.9573194981f, -0.2890318036f, + 0.9443763494f, -0.3288666606f, 0.9297764897f, -0.3681245446f, 0.9135454297f, -0.4067366421f, 0.8957117796f, -0.4446351826f, + 0.8763066530f, -0.4817536771f, 0.8553642631f, -0.5180270076f, 0.8329212666f, -0.5533915758f, 0.8090170026f, -0.5877852440f, + 0.7836934328f, -0.6211477518f, 0.7569950819f, -0.6534206271f, 0.7289686203f, -0.6845471263f, 0.6996633410f, -0.7144726515f, + 0.6691306233f, -0.7431448102f, 0.6374239922f, -0.7705132365f, 0.6045991182f, -0.7965298891f, 0.5707135797f, -0.8211492300f, + 0.5358268023f, -0.8443279266f, 0.5000000000f, -0.8660253882f, 0.4632960260f, -0.8862035871f, 0.4257792830f, -0.9048270583f, + 0.3875155747f, -0.9218631387f, 0.3485720456f, -0.9372819662f, 1.0000000000f, -0.0000000000f, 0.9980267286f, -0.0627905205f, + 0.9921147227f, -0.1253332347f, 0.9822872281f, -0.1873813123f, 0.9685831666f, -0.2486898899f, 0.9510565400f, -0.3090170026f, + 0.9297764897f, -0.3681245446f, 0.9048270583f, -0.4257792830f, 0.8763066530f, -0.4817536771f, 0.8443279266f, -0.5358268023f, + 0.8090170026f, -0.5877852440f, 0.7705132365f, -0.6374239922f, 0.7289686203f, -0.6845471263f, 0.6845471263f, -0.7289686203f, + 0.6374239922f, -0.7705132365f, 0.5877852440f, -0.8090170026f, 0.5358268023f, -0.8443279266f, 0.4817536771f, -0.8763066530f, + 0.4257792830f, -0.9048270583f, 0.3681245446f, -0.9297764897f, 0.3090170026f, -0.9510565400f, 0.2486898899f, -0.9685831666f, + 0.1873813123f, -0.9822872281f, 0.1253332347f, -0.9921147227f, 0.0627905205f, -0.9980267286f, -0.0000000000f, -1.0000000000f, + -0.0627905205f, -0.9980267286f, -0.1253332347f, -0.9921147227f, -0.1873813123f, -0.9822872281f, -0.2486898899f, -0.9685831666f, + 1.0000000000f, -0.0000000000f, 0.9964928627f, -0.0836778432f, 0.9859960079f, -0.1667687446f, 0.9685831666f, -0.2486898899f, + 0.9443763494f, -0.3288666606f, 0.9135454297f, -0.4067366421f, 0.8763066530f, -0.4817536771f, 0.8329212666f, -0.5533915758f, + 0.7836934328f, -0.6211477518f, 0.7289686203f, -0.6845471263f, 0.6691306233f, -0.7431448102f, 0.6045991182f, -0.7965298891f, + 0.5358268023f, -0.8443279266f, 0.4632960260f, -0.8862035871f, 0.3875155747f, -0.9218631387f, 0.3090170026f, -0.9510565400f, + 0.2283508629f, -0.9735789299f, 0.1460830271f, -0.9892723560f, 0.0627905205f, -0.9980267286f, -0.0209424198f, -0.9997806549f, + -0.1045284644f, -0.9945219159f, -0.1873813123f, -0.9822872281f, -0.2689198256f, -0.9631625414f, -0.3485720456f, -0.9372819662f, + -0.4257792830f, -0.9048270583f, -0.5000000000f, -0.8660253882f, -0.5707135797f, -0.8211492300f, -0.6374239922f, -0.7705132365f, + -0.6996633410f, -0.7144726515f, -0.7569950819f, -0.6534206271f, 1.0000000000f, -0.0000000000f, 0.9945219159f, -0.1045284644f, + 0.9781476259f, -0.2079116851f, 0.9510565400f, -0.3090170026f, 0.9135454297f, -0.4067366421f, 0.8660253882f, -0.5000000000f, + 0.8090170026f, -0.5877852440f, 0.7431448102f, -0.6691306233f, 0.6691306233f, -0.7431448102f, 0.5877852440f, -0.8090170026f, + 0.5000000000f, -0.8660253882f, 0.4067366421f, -0.9135454297f, 0.3090170026f, -0.9510565400f, 0.2079116851f, -0.9781476259f, + 0.1045284644f, -0.9945219159f, -0.0000000000f, -1.0000000000f, -0.1045284644f, -0.9945219159f, -0.2079116851f, -0.9781476259f, + -0.3090170026f, -0.9510565400f, -0.4067366421f, -0.9135454297f, -0.5000000000f, -0.8660253882f, -0.5877852440f, -0.8090170026f, + -0.6691306233f, -0.7431448102f, -0.7431448102f, -0.6691306233f, -0.8090170026f, -0.5877852440f, -0.8660253882f, -0.5000000000f, + -0.9135454297f, -0.4067366421f, -0.9510565400f, -0.3090170026f, -0.9781476259f, -0.2079116851f, -0.9945219159f, -0.1045284644f, + 1.0000000000f, -0.0000000000f, 0.9921147227f, -0.1253332347f, 0.9685831666f, -0.2486898899f, 0.9297764897f, -0.3681245446f, + 0.8763066530f, -0.4817536771f, 0.8090170026f, -0.5877852440f, 0.7289686203f, -0.6845471263f, 0.6374239922f, -0.7705132365f, + 0.5358268023f, -0.8443279266f, 0.4257792830f, -0.9048270583f, 0.3090170026f, -0.9510565400f, 0.1873813123f, -0.9822872281f, + 0.0627905205f, -0.9980267286f, -0.0627905205f, -0.9980267286f, -0.1873813123f, -0.9822872281f, -0.3090170026f, -0.9510565400f, + -0.4257792830f, -0.9048270583f, -0.5358268023f, -0.8443279266f, -0.6374239922f, -0.7705132365f, -0.7289686203f, -0.6845471263f, + -0.8090170026f, -0.5877852440f, -0.8763066530f, -0.4817536771f, -0.9297764897f, -0.3681245446f, -0.9685831666f, -0.2486898899f, + -0.9921147227f, -0.1253332347f, -1.0000000000f, 0.0000000000f, -0.9921147227f, 0.1253332347f, -0.9685831666f, 0.2486898899f, + -0.9297764897f, 0.3681245446f, -0.8763066530f, 0.4817536771f, 1.0000000000f, -0.0000000000f, 0.9892723560f, -0.1460830271f, + 0.9573194981f, -0.2890318036f, 0.9048270583f, -0.4257792830f, 0.8329212666f, -0.5533915758f, 0.7431448102f, -0.6691306233f, + 0.6374239922f, -0.7705132365f, 0.5180270076f, -0.8553642631f, 0.3875155747f, -0.9218631387f, 0.2486898899f, -0.9685831666f, + 0.1045284644f, -0.9945219159f, -0.0418756530f, -0.9991228580f, -0.1873813123f, -0.9822872281f, -0.3288666606f, -0.9443763494f, + -0.4632960260f, -0.8862035871f, -0.5877852440f, -0.8090170026f, -0.6996633410f, -0.7144726515f, -0.7965298891f, -0.6045991182f, + -0.8763066530f, -0.4817536771f, -0.9372819662f, -0.3485720456f, -0.9781476259f, -0.2079116851f, -0.9980267286f, -0.0627905205f, + -0.9964928627f, 0.0836778432f, -0.9735789299f, 0.2283508629f, -0.9297764897f, 0.3681245446f, -0.8660253882f, 0.5000000000f, + -0.7836934328f, 0.6211477518f, -0.6845471263f, 0.7289686203f, -0.5707135797f, 0.8211492300f, -0.4446351826f, 0.8957117796f, + 1.0000000000f, -0.0000000000f, 0.9859960079f, -0.1667687446f, 0.9443763494f, -0.3288666606f, 0.8763066530f, -0.4817536771f, + 0.7836934328f, -0.6211477518f, 0.6691306233f, -0.7431448102f, 0.5358268023f, -0.8443279266f, 0.3875155747f, -0.9218631387f, + 0.2283508629f, -0.9735789299f, 0.0627905205f, -0.9980267286f, -0.1045284644f, -0.9945219159f, -0.2689198256f, -0.9631625414f, + -0.4257792830f, -0.9048270583f, -0.5707135797f, -0.8211492300f, -0.6996633410f, -0.7144726515f, -0.8090170026f, -0.5877852440f, + -0.8957117796f, -0.4446351826f, -0.9573194981f, -0.2890318036f, -0.9921147227f, -0.1253332347f, -0.9991228580f, 0.0418756530f, + -0.9781476259f, 0.2079116851f, -0.9297764897f, 0.3681245446f, -0.8553642631f, 0.5180270076f, -0.7569950819f, 0.6534206271f, + -0.6374239922f, 0.7705132365f, -0.5000000000f, 0.8660253882f, -0.3485720456f, 0.9372819662f, -0.1873813123f, 0.9822872281f, + -0.0209424198f, 0.9997806549f, 0.1460830271f, 0.9892723560f, 1.0000000000f, -0.0000000000f, 0.9822872281f, -0.1873813123f, + 0.9297764897f, -0.3681245446f, 0.8443279266f, -0.5358268023f, 0.7289686203f, -0.6845471263f, 0.5877852440f, -0.8090170026f, + 0.4257792830f, -0.9048270583f, 0.2486898899f, -0.9685831666f, 0.0627905205f, -0.9980267286f, -0.1253332347f, -0.9921147227f, + -0.3090170026f, -0.9510565400f, -0.4817536771f, -0.8763066530f, -0.6374239922f, -0.7705132365f, -0.7705132365f, -0.6374239922f, + -0.8763066530f, -0.4817536771f, -0.9510565400f, -0.3090170026f, -0.9921147227f, -0.1253332347f, -0.9980267286f, 0.0627905205f, + -0.9685831666f, 0.2486898899f, -0.9048270583f, 0.4257792830f, -0.8090170026f, 0.5877852440f, -0.6845471263f, 0.7289686203f, + -0.5358268023f, 0.8443279266f, -0.3681245446f, 0.9297764897f, -0.1873813123f, 0.9822872281f, 0.0000000000f, 1.0000000000f, + 0.1873813123f, 0.9822872281f, 0.3681245446f, 0.9297764897f, 0.5358268023f, 0.8443279266f, 0.6845471263f, 0.7289686203f, + 1.0000000000f, -0.0000000000f, 0.9999451637f, -0.0104717845f, 0.9997806549f, -0.0209424198f, 0.9995065331f, -0.0314107575f, + 0.9991228580f, -0.0418756530f, 0.9986295104f, -0.0523359552f, 0.9980267286f, -0.0627905205f, 0.9973144531f, -0.0732381940f, + 0.9964928627f, -0.0836778432f, 0.9955619574f, -0.0941083133f, 0.9945219159f, -0.1045284644f, 0.9933727384f, -0.1149371490f, + 0.9921147227f, -0.1253332347f, 0.9907478690f, -0.1357155740f, 0.9892723560f, -0.1460830271f, 0.9876883626f, -0.1564344615f, + 0.9859960079f, -0.1667687446f, 0.9841955900f, -0.1770847440f, 0.9822872281f, -0.1873813123f, 0.9802711606f, -0.1976573467f, + 0.9781476259f, -0.2079116851f, 0.9759167433f, -0.2181432396f, 0.9735789299f, -0.2283508629f, 0.9711343050f, -0.2385334522f, + 0.9685831666f, -0.2486898899f, 0.9659258127f, -0.2588190436f, 0.9631625414f, -0.2689198256f, 0.9602937102f, -0.2789911032f, + 0.9573194981f, -0.2890318036f, 0.9542403221f, -0.2990407944f, 1.0000000000f, -0.0000000000f, 0.9995065331f, -0.0314107575f, + 0.9980267286f, -0.0627905205f, 0.9955619574f, -0.0941083133f, 0.9921147227f, -0.1253332347f, 0.9876883626f, -0.1564344615f, + 0.9822872281f, -0.1873813123f, 0.9759167433f, -0.2181432396f, 0.9685831666f, -0.2486898899f, 0.9602937102f, -0.2789911032f, + 0.9510565400f, -0.3090170026f, 0.9408807755f, -0.3387379348f, 0.9297764897f, -0.3681245446f, 0.9177546501f, -0.3971478939f, + 0.9048270583f, -0.4257792830f, 0.8910065293f, -0.4539904892f, 0.8763066530f, -0.4817536771f, 0.8607420325f, -0.5090414286f, + 0.8443279266f, -0.5358268023f, 0.8270805478f, -0.5620833635f, 0.8090170026f, -0.5877852440f, 0.7901549935f, -0.6129070520f, + 0.7705132365f, -0.6374239922f, 0.7501110435f, -0.6613118649f, 0.7289686203f, -0.6845471263f, 0.7071067691f, -0.7071067691f, + 0.6845471263f, -0.7289686203f, 0.6613118649f, -0.7501110435f, 0.6374239922f, -0.7705132365f, 0.6129070520f, -0.7901549935f, + 1.0000000000f, -0.0000000000f, 0.9986295104f, -0.0523359552f, 0.9945219159f, -0.1045284644f, 0.9876883626f, -0.1564344615f, + 0.9781476259f, -0.2079116851f, 0.9659258127f, -0.2588190436f, 0.9510565400f, -0.3090170026f, 0.9335803986f, -0.3583679497f, + 0.9135454297f, -0.4067366421f, 0.8910065293f, -0.4539904892f, 0.8660253882f, -0.5000000000f, 0.8386705518f, -0.5446390510f, + 0.8090170026f, -0.5877852440f, 0.7771459818f, -0.6293203831f, 0.7431448102f, -0.6691306233f, 0.7071067691f, -0.7071067691f, + 0.6691306233f, -0.7431448102f, 0.6293203831f, -0.7771459818f, 0.5877852440f, -0.8090170026f, 0.5446390510f, -0.8386705518f, + 0.5000000000f, -0.8660253882f, 0.4539904892f, -0.8910065293f, 0.4067366421f, -0.9135454297f, 0.3583679497f, -0.9335803986f, + 0.3090170026f, -0.9510565400f, 0.2588190436f, -0.9659258127f, 0.2079116851f, -0.9781476259f, 0.1564344615f, -0.9876883626f, + 0.1045284644f, -0.9945219159f, 0.0523359552f, -0.9986295104f, 1.0000000000f, -0.0000000000f, 0.9973144531f, -0.0732381940f, + 0.9892723560f, -0.1460830271f, 0.9759167433f, -0.2181432396f, 0.9573194981f, -0.2890318036f, 0.9335803986f, -0.3583679497f, + 0.9048270583f, -0.4257792830f, 0.8712137938f, -0.4909037650f, 0.8329212666f, -0.5533915758f, 0.7901549935f, -0.6129070520f, + 0.7431448102f, -0.6691306233f, 0.6921432018f, -0.7217602134f, 0.6374239922f, -0.7705132365f, 0.5792811513f, -0.8151277900f, + 0.5180270076f, -0.8553642631f, 0.4539904892f, -0.8910065293f, 0.3875155747f, -0.9218631387f, 0.3189592957f, -0.9477683902f, + 0.2486898899f, -0.9685831666f, 0.1770847440f, -0.9841955900f, 0.1045284644f, -0.9945219159f, 0.0314107575f, -0.9995065331f, + -0.0418756530f, -0.9991228580f, -0.1149371490f, -0.9933727384f, -0.1873813123f, -0.9822872281f, -0.2588190436f, -0.9659258127f, + -0.3288666606f, -0.9443763494f, -0.3971478939f, -0.9177546501f, -0.4632960260f, -0.8862035871f, -0.5269557834f, -0.8498926759f, + 1.0000000000f, -0.0000000000f, 0.9955619574f, -0.0941083133f, 0.9822872281f, -0.1873813123f, 0.9602937102f, -0.2789911032f, + 0.9297764897f, -0.3681245446f, 0.8910065293f, -0.4539904892f, 0.8443279266f, -0.5358268023f, 0.7901549935f, -0.6129070520f, + 0.7289686203f, -0.6845471263f, 0.6613118649f, -0.7501110435f, 0.5877852440f, -0.8090170026f, 0.5090414286f, -0.8607420325f, + 0.4257792830f, -0.9048270583f, 0.3387379348f, -0.9408807755f, 0.2486898899f, -0.9685831666f, 0.1564344615f, -0.9876883626f, + 0.0627905205f, -0.9980267286f, -0.0314107575f, -0.9995065331f, -0.1253332347f, -0.9921147227f, -0.2181432396f, -0.9759167433f, + -0.3090170026f, -0.9510565400f, -0.3971478939f, -0.9177546501f, -0.4817536771f, -0.8763066530f, -0.5620833635f, -0.8270805478f, + -0.6374239922f, -0.7705132365f, -0.7071067691f, -0.7071067691f, -0.7705132365f, -0.6374239922f, -0.8270805478f, -0.5620833635f, + -0.8763066530f, -0.4817536771f, -0.9177546501f, -0.3971478939f, 1.0000000000f, -0.0000000000f, 0.9933727384f, -0.1149371490f, + 0.9735789299f, -0.2283508629f, 0.9408807755f, -0.3387379348f, 0.8957117796f, -0.4446351826f, 0.8386705518f, -0.5446390510f, + 0.7705132365f, -0.6374239922f, 0.6921432018f, -0.7217602134f, 0.6045991182f, -0.7965298891f, 0.5090414286f, -0.8607420325f, + 0.4067366421f, -0.9135454297f, 0.2990407944f, -0.9542403221f, 0.1873813123f, -0.9822872281f, 0.0732381940f, -0.9973144531f, + -0.0418756530f, -0.9991228580f, -0.1564344615f, -0.9876883626f, -0.2689198256f, -0.9631625414f, -0.3778407872f, -0.9258705974f, + -0.4817536771f, -0.8763066530f, -0.5792811513f, -0.8151277900f, -0.6691306233f, -0.7431448102f, -0.7501110435f, -0.6613118649f, + -0.8211492300f, -0.5707135797f, -0.8813034296f, -0.4725507796f, -0.9297764897f, -0.3681245446f, -0.9659258127f, -0.2588190436f, + -0.9892723560f, -0.1460830271f, -0.9995065331f, -0.0314107575f, -0.9964928627f, 0.0836778432f, -0.9802711606f, 0.1976573467f, + 1.0000000000f, -0.0000000000f, 0.9907478690f, -0.1357155740f, 0.9631625414f, -0.2689198256f, 0.9177546501f, -0.3971478939f, + 0.8553642631f, -0.5180270076f, 0.7771459818f, -0.6293203831f, 0.6845471263f, -0.7289686203f, 0.5792811513f, -0.8151277900f, + 0.4632960260f, -0.8862035871f, 0.3387379348f, -0.9408807755f, 0.2079116851f, -0.9781476259f, 0.0732381940f, -0.9973144531f, + -0.0627905205f, -0.9980267286f, -0.1976573467f, -0.9802711606f, -0.3288666606f, -0.9443763494f, -0.4539904892f, -0.8910065293f, + -0.5707135797f, -0.8211492300f, -0.6768759489f, -0.7360970974f, -0.7705132365f, -0.6374239922f, -0.8498926759f, -0.5269557834f, + -0.9135454297f, -0.4067366421f, -0.9602937102f, -0.2789911032f, -0.9892723560f, -0.1460830271f, -0.9999451637f, -0.0104717845f, + -0.9921147227f, 0.1253332347f, -0.9659258127f, 0.2588190436f, -0.9218631387f, 0.3875155747f, -0.8607420325f, 0.5090414286f, + -0.7836934328f, 0.6211477518f, -0.6921432018f, 0.7217602134f, 1.0000000000f, -0.0000000000f, 0.9876883626f, -0.1564344615f, + 0.9510565400f, -0.3090170026f, 0.8910065293f, -0.4539904892f, 0.8090170026f, -0.5877852440f, 0.7071067691f, -0.7071067691f, + 0.5877852440f, -0.8090170026f, 0.4539904892f, -0.8910065293f, 0.3090170026f, -0.9510565400f, 0.1564344615f, -0.9876883626f, + -0.0000000000f, -1.0000000000f, -0.1564344615f, -0.9876883626f, -0.3090170026f, -0.9510565400f, -0.4539904892f, -0.8910065293f, + -0.5877852440f, -0.8090170026f, -0.7071067691f, -0.7071067691f, -0.8090170026f, -0.5877852440f, -0.8910065293f, -0.4539904892f, + -0.9510565400f, -0.3090170026f, -0.9876883626f, -0.1564344615f, -1.0000000000f, 0.0000000000f, -0.9876883626f, 0.1564344615f, + -0.9510565400f, 0.3090170026f, -0.8910065293f, 0.4539904892f, -0.8090170026f, 0.5877852440f, -0.7071067691f, 0.7071067691f, + -0.5877852440f, 0.8090170026f, -0.4539904892f, 0.8910065293f, -0.3090170026f, 0.9510565400f, -0.1564344615f, 0.9876883626f, + 1.0000000000f, -0.0000000000f, 0.9841955900f, -0.1770847440f, 0.9372819662f, -0.3485720456f, 0.8607420325f, -0.5090414286f, + 0.7569950819f, -0.6534206271f, 0.6293203831f, -0.7771459818f, 0.4817536771f, -0.8763066530f, 0.3189592957f, -0.9477683902f, + 0.1460830271f, -0.9892723560f, -0.0314107575f, -0.9995065331f, -0.2079116851f, -0.9781476259f, -0.3778407872f, -0.9258705974f, + -0.5358268023f, -0.8443279266f, -0.6768759489f, -0.7360970974f, -0.7965298891f, -0.6045991182f, -0.8910065293f, -0.4539904892f, + -0.9573194981f, -0.2890318036f, -0.9933727384f, -0.1149371490f, -0.9980267286f, 0.0627905205f, -0.9711343050f, 0.2385334522f, + -0.9135454297f, 0.4067366421f, -0.8270805478f, 0.5620833635f, -0.7144726515f, 0.6996633410f, -0.5792811513f, 0.8151277900f, + -0.4257792830f, 0.9048270583f, -0.2588190436f, 0.9659258127f, -0.0836778432f, 0.9964928627f, 0.0941083133f, 0.9955619574f, + 0.2689198256f, 0.9631625414f, 0.4352310896f, 0.9003187418f, 1.0000000000f, -0.0000000000f, 0.9802711606f, -0.1976573467f, + 0.9218631387f, -0.3875155747f, 0.8270805478f, -0.5620833635f, 0.6996633410f, -0.7144726515f, 0.5446390510f, -0.8386705518f, + 0.3681245446f, -0.9297764897f, 0.1770847440f, -0.9841955900f, -0.0209424198f, -0.9997806549f, -0.2181432396f, -0.9759167433f, + -0.4067366421f, -0.9135454297f, -0.5792811513f, -0.8151277900f, -0.7289686203f, -0.6845471263f, -0.8498926759f, -0.5269557834f, + -0.9372819662f, -0.3485720456f, -0.9876883626f, -0.1564344615f, -0.9991228580f, 0.0418756530f, -0.9711343050f, 0.2385334522f, + -0.9048270583f, 0.4257792830f, -0.8028174639f, 0.5962249041f, -0.6691306233f, 0.7431448102f, -0.5090414286f, 0.8607420325f, + -0.3288666606f, 0.9443763494f, -0.1357155740f, 0.9907478690f, 0.0627905205f, 0.9980267286f, 0.2588190436f, 0.9659258127f, + 0.4446351826f, 0.8957117796f, 0.6129070520f, 0.7901549935f, 0.7569950819f, 0.6534206271f, 0.8712137938f, 0.4909037650f +}; + +const float FFT_RotVector_640[1240] = { + 1.0000000000f, -0.0000000000f, 0.9998072386f, -0.0196336918f, 0.9992290139f, -0.0392598175f, 0.9982656240f, -0.0588708036f, + 0.9969173074f, -0.0784590989f, 0.9951847196f, -0.0980171412f, 0.9930684566f, -0.1175373942f, 0.9905693531f, -0.1370123476f, + 0.9876883626f, -0.1564344615f, 0.9844265580f, -0.1757962853f, 0.9807852507f, -0.1950903237f, 0.9767658710f, -0.2143091559f, + 0.9723699093f, -0.2334453613f, 0.9675990939f, -0.2524915636f, 0.9624552131f, -0.2714404464f, 0.9569403529f, -0.2902846634f, + 0.9510565400f, -0.3090170026f, 0.9448060393f, -0.3276301920f, 0.9381913543f, -0.3461170495f, 0.9312149286f, -0.3644705117f, + 1.0000000000f, -0.0000000000f, 0.9992290139f, -0.0392598175f, 0.9969173074f, -0.0784590989f, 0.9930684566f, -0.1175373942f, + 0.9876883626f, -0.1564344615f, 0.9807852507f, -0.1950903237f, 0.9723699093f, -0.2334453613f, 0.9624552131f, -0.2714404464f, + 0.9510565400f, -0.3090170026f, 0.9381913543f, -0.3461170495f, 0.9238795042f, -0.3826834261f, 0.9081431627f, -0.4186597466f, + 0.8910065293f, -0.4539904892f, 0.8724960089f, -0.4886212349f, 0.8526401520f, -0.5224985480f, 0.8314695954f, -0.5555702448f, + 0.8090170026f, -0.5877852440f, 0.7853169441f, -0.6190939546f, 0.7604059577f, -0.6494480371f, 0.7343224883f, -0.6788007617f, + 1.0000000000f, -0.0000000000f, 0.9982656240f, -0.0588708036f, 0.9930684566f, -0.1175373942f, 0.9844265580f, -0.1757962853f, + 0.9723699093f, -0.2334453613f, 0.9569403529f, -0.2902846634f, 0.9381913543f, -0.3461170495f, 0.9161879420f, -0.4007488191f, + 0.8910065293f, -0.4539904892f, 0.8627343774f, -0.5056573749f, 0.8314695954f, -0.5555702448f, 0.7973206639f, -0.6035559177f, + 0.7604059577f, -0.6494480371f, 0.7208535671f, -0.6930873394f, 0.6788007617f, -0.7343224883f, 0.6343932748f, -0.7730104327f, + 0.5877852440f, -0.8090170026f, 0.5391383171f, -0.8422172070f, 0.4886212349f, -0.8724960089f, 0.4364092350f, -0.8997482657f, + 1.0000000000f, -0.0000000000f, 0.9969173074f, -0.0784590989f, 0.9876883626f, -0.1564344615f, 0.9723699093f, -0.2334453613f, + 0.9510565400f, -0.3090170026f, 0.9238795042f, -0.3826834261f, 0.8910065293f, -0.4539904892f, 0.8526401520f, -0.5224985480f, + 0.8090170026f, -0.5877852440f, 0.7604059577f, -0.6494480371f, 0.7071067691f, -0.7071067691f, 0.6494480371f, -0.7604059577f, + 0.5877852440f, -0.8090170026f, 0.5224985480f, -0.8526401520f, 0.4539904892f, -0.8910065293f, 0.3826834261f, -0.9238795042f, + 0.3090170026f, -0.9510565400f, 0.2334453613f, -0.9723699093f, 0.1564344615f, -0.9876883626f, 0.0784590989f, -0.9969173074f, + 1.0000000000f, -0.0000000000f, 0.9951847196f, -0.0980171412f, 0.9807852507f, -0.1950903237f, 0.9569403529f, -0.2902846634f, + 0.9238795042f, -0.3826834261f, 0.8819212914f, -0.4713967443f, 0.8314695954f, -0.5555702448f, 0.7730104327f, -0.6343932748f, + 0.7071067691f, -0.7071067691f, 0.6343932748f, -0.7730104327f, 0.5555702448f, -0.8314695954f, 0.4713967443f, -0.8819212914f, + 0.3826834261f, -0.9238795042f, 0.2902846634f, -0.9569403529f, 0.1950903237f, -0.9807852507f, 0.0980171412f, -0.9951847196f, + -0.0000000000f, -1.0000000000f, -0.0980171412f, -0.9951847196f, -0.1950903237f, -0.9807852507f, -0.2902846634f, -0.9569403529f, + 1.0000000000f, -0.0000000000f, 0.9930684566f, -0.1175373942f, 0.9723699093f, -0.2334453613f, 0.9381913543f, -0.3461170495f, + 0.8910065293f, -0.4539904892f, 0.8314695954f, -0.5555702448f, 0.7604059577f, -0.6494480371f, 0.6788007617f, -0.7343224883f, + 0.5877852440f, -0.8090170026f, 0.4886212349f, -0.8724960089f, 0.3826834261f, -0.9238795042f, 0.2714404464f, -0.9624552131f, + 0.1564344615f, -0.9876883626f, 0.0392598175f, -0.9992290139f, -0.0784590989f, -0.9969173074f, -0.1950903237f, -0.9807852507f, + -0.3090170026f, -0.9510565400f, -0.4186597466f, -0.9081431627f, -0.5224985480f, -0.8526401520f, -0.6190939546f, -0.7853169441f, + 1.0000000000f, -0.0000000000f, 0.9905693531f, -0.1370123476f, 0.9624552131f, -0.2714404464f, 0.9161879420f, -0.4007488191f, + 0.8526401520f, -0.5224985480f, 0.7730104327f, -0.6343932748f, 0.6788007617f, -0.7343224883f, 0.5717879534f, -0.8204014301f, + 0.4539904892f, -0.8910065293f, 0.3276301920f, -0.9448060393f, 0.1950903237f, -0.9807852507f, 0.0588708036f, -0.9982656240f, + -0.0784590989f, -0.9969173074f, -0.2143091559f, -0.9767658710f, -0.3461170495f, -0.9381913543f, -0.4713967443f, -0.8819212914f, + -0.5877852440f, -0.8090170026f, -0.6930873394f, -0.7208535671f, -0.7853169441f, -0.6190939546f, -0.8627343774f, -0.5056573749f, + 1.0000000000f, -0.0000000000f, 0.9876883626f, -0.1564344615f, 0.9510565400f, -0.3090170026f, 0.8910065293f, -0.4539904892f, + 0.8090170026f, -0.5877852440f, 0.7071067691f, -0.7071067691f, 0.5877852440f, -0.8090170026f, 0.4539904892f, -0.8910065293f, + 0.3090170026f, -0.9510565400f, 0.1564344615f, -0.9876883626f, -0.0000000000f, -1.0000000000f, -0.1564344615f, -0.9876883626f, + -0.3090170026f, -0.9510565400f, -0.4539904892f, -0.8910065293f, -0.5877852440f, -0.8090170026f, -0.7071067691f, -0.7071067691f, + -0.8090170026f, -0.5877852440f, -0.8910065293f, -0.4539904892f, -0.9510565400f, -0.3090170026f, -0.9876883626f, -0.1564344615f, + 1.0000000000f, -0.0000000000f, 0.9844265580f, -0.1757962853f, 0.9381913543f, -0.3461170495f, 0.8627343774f, -0.5056573749f, + 0.7604059577f, -0.6494480371f, 0.6343932748f, -0.7730104327f, 0.4886212349f, -0.8724960089f, 0.3276301920f, -0.9448060393f, + 0.1564344615f, -0.9876883626f, -0.0196336918f, -0.9998072386f, -0.1950903237f, -0.9807852507f, -0.3644705117f, -0.9312149286f, + -0.5224985480f, -0.8526401520f, -0.6642524600f, -0.7475083470f, -0.7853169441f, -0.6190939546f, -0.8819212914f, -0.4713967443f, + -0.9510565400f, -0.3090170026f, -0.9905693531f, -0.1370123476f, -0.9992290139f, 0.0392598175f, -0.9767658710f, 0.2143091559f, + 1.0000000000f, -0.0000000000f, 0.9807852507f, -0.1950903237f, 0.9238795042f, -0.3826834261f, 0.8314695954f, -0.5555702448f, + 0.7071067691f, -0.7071067691f, 0.5555702448f, -0.8314695954f, 0.3826834261f, -0.9238795042f, 0.1950903237f, -0.9807852507f, + -0.0000000000f, -1.0000000000f, -0.1950903237f, -0.9807852507f, -0.3826834261f, -0.9238795042f, -0.5555702448f, -0.8314695954f, + -0.7071067691f, -0.7071067691f, -0.8314695954f, -0.5555702448f, -0.9238795042f, -0.3826834261f, -0.9807852507f, -0.1950903237f, + -1.0000000000f, 0.0000000000f, -0.9807852507f, 0.1950903237f, -0.9238795042f, 0.3826834261f, -0.8314695954f, 0.5555702448f, + 1.0000000000f, -0.0000000000f, 0.9767658710f, -0.2143091559f, 0.9081431627f, -0.4186597466f, 0.7973206639f, -0.6035559177f, + 0.6494480371f, -0.7604059577f, 0.4713967443f, -0.8819212914f, 0.2714404464f, -0.9624552131f, 0.0588708036f, -0.9982656240f, + -0.1564344615f, -0.9876883626f, -0.3644705117f, -0.9312149286f, -0.5555702448f, -0.8314695954f, -0.7208535671f, -0.6930873394f, + -0.8526401520f, -0.5224985480f, -0.9448060393f, -0.3276301920f, -0.9930684566f, -0.1175373942f, -0.9951847196f, 0.0980171412f, + -0.9510565400f, 0.3090170026f, -0.8627343774f, 0.5056573749f, -0.7343224883f, 0.6788007617f, -0.5717879534f, 0.8204014301f, + 1.0000000000f, -0.0000000000f, 0.9723699093f, -0.2334453613f, 0.8910065293f, -0.4539904892f, 0.7604059577f, -0.6494480371f, + 0.5877852440f, -0.8090170026f, 0.3826834261f, -0.9238795042f, 0.1564344615f, -0.9876883626f, -0.0784590989f, -0.9969173074f, + -0.3090170026f, -0.9510565400f, -0.5224985480f, -0.8526401520f, -0.7071067691f, -0.7071067691f, -0.8526401520f, -0.5224985480f, + -0.9510565400f, -0.3090170026f, -0.9969173074f, -0.0784590989f, -0.9876883626f, 0.1564344615f, -0.9238795042f, 0.3826834261f, + -0.8090170026f, 0.5877852440f, -0.6494480371f, 0.7604059577f, -0.4539904892f, 0.8910065293f, -0.2334453613f, 0.9723699093f, + 1.0000000000f, -0.0000000000f, 0.9675990939f, -0.2524915636f, 0.8724960089f, -0.4886212349f, 0.7208535671f, -0.6930873394f, + 0.5224985480f, -0.8526401520f, 0.2902846634f, -0.9569403529f, 0.0392598175f, -0.9992290139f, -0.2143091559f, -0.9767658710f, + -0.4539904892f, -0.8910065293f, -0.6642524600f, -0.7475083470f, -0.8314695954f, -0.5555702448f, -0.9448060393f, -0.3276301920f, + -0.9969173074f, -0.0784590989f, -0.9844265580f, 0.1757962853f, -0.9081431627f, 0.4186597466f, -0.7730104327f, 0.6343932748f, + -0.5877852440f, 0.8090170026f, -0.3644705117f, 0.9312149286f, -0.1175373942f, 0.9930684566f, 0.1370123476f, 0.9905693531f, + 1.0000000000f, -0.0000000000f, 0.9624552131f, -0.2714404464f, 0.8526401520f, -0.5224985480f, 0.6788007617f, -0.7343224883f, + 0.4539904892f, -0.8910065293f, 0.1950903237f, -0.9807852507f, -0.0784590989f, -0.9969173074f, -0.3461170495f, -0.9381913543f, + -0.5877852440f, -0.8090170026f, -0.7853169441f, -0.6190939546f, -0.9238795042f, -0.3826834261f, -0.9930684566f, -0.1175373942f, + -0.9876883626f, 0.1564344615f, -0.9081431627f, 0.4186597466f, -0.7604059577f, 0.6494480371f, -0.5555702448f, 0.8314695954f, + -0.3090170026f, 0.9510565400f, -0.0392598175f, 0.9992290139f, 0.2334453613f, 0.9723699093f, 0.4886212349f, 0.8724960089f, + 1.0000000000f, -0.0000000000f, 0.9569403529f, -0.2902846634f, 0.8314695954f, -0.5555702448f, 0.6343932748f, -0.7730104327f, + 0.3826834261f, -0.9238795042f, 0.0980171412f, -0.9951847196f, -0.1950903237f, -0.9807852507f, -0.4713967443f, -0.8819212914f, + -0.7071067691f, -0.7071067691f, -0.8819212914f, -0.4713967443f, -0.9807852507f, -0.1950903237f, -0.9951847196f, 0.0980171412f, + -0.9238795042f, 0.3826834261f, -0.7730104327f, 0.6343932748f, -0.5555702448f, 0.8314695954f, -0.2902846634f, 0.9569403529f, + 0.0000000000f, 1.0000000000f, 0.2902846634f, 0.9569403529f, 0.5555702448f, 0.8314695954f, 0.7730104327f, 0.6343932748f, + 1.0000000000f, -0.0000000000f, 0.9999517798f, -0.0098173190f, 0.9998072386f, -0.0196336918f, 0.9995663166f, -0.0294481739f, + 0.9992290139f, -0.0392598175f, 0.9987954497f, -0.0490676761f, 0.9982656240f, -0.0588708036f, 0.9976395369f, -0.0686682612f, + 0.9969173074f, -0.0784590989f, 0.9960990548f, -0.0882423669f, 0.9951847196f, -0.0980171412f, 0.9941744804f, -0.1077824607f, + 0.9930684566f, -0.1175373942f, 0.9918667078f, -0.1272810102f, 0.9905693531f, -0.1370123476f, 0.9891765118f, -0.1467304677f, + 0.9876883626f, -0.1564344615f, 0.9861049652f, -0.1661233753f, 0.9844265580f, -0.1757962853f, 0.9826532602f, -0.1854522377f, + 1.0000000000f, -0.0000000000f, 0.9995663166f, -0.0294481739f, 0.9982656240f, -0.0588708036f, 0.9960990548f, -0.0882423669f, + 0.9930684566f, -0.1175373942f, 0.9891765118f, -0.1467304677f, 0.9844265580f, -0.1757962853f, 0.9788227677f, -0.2047096044f, + 0.9723699093f, -0.2334453613f, 0.9650736451f, -0.2619786263f, 0.9569403529f, -0.2902846634f, 0.9479769468f, -0.3183389306f, + 0.9381913543f, -0.3461170495f, 0.9275919199f, -0.3735949695f, 0.9161879420f, -0.4007488191f, 0.9039893150f, -0.4275550842f, + 0.8910065293f, -0.4539904892f, 0.8772509098f, -0.4800321162f, 0.8627343774f, -0.5056573749f, 0.8474695683f, -0.5308440328f, + 1.0000000000f, -0.0000000000f, 0.9987954497f, -0.0490676761f, 0.9951847196f, -0.0980171412f, 0.9891765118f, -0.1467304677f, + 0.9807852507f, -0.1950903237f, 0.9700312614f, -0.2429801822f, 0.9569403529f, -0.2902846634f, 0.9415440559f, -0.3368898630f, + 0.9238795042f, -0.3826834261f, 0.9039893150f, -0.4275550842f, 0.8819212914f, -0.4713967443f, 0.8577286005f, -0.5141027570f, + 0.8314695954f, -0.5555702448f, 0.8032075167f, -0.5956993103f, 0.7730104327f, -0.6343932748f, 0.7409511209f, -0.6715589762f, + 0.7071067691f, -0.7071067691f, 0.6715589762f, -0.7409511209f, 0.6343932748f, -0.7730104327f, 0.5956993103f, -0.8032075167f, + 1.0000000000f, -0.0000000000f, 0.9976395369f, -0.0686682612f, 0.9905693531f, -0.1370123476f, 0.9788227677f, -0.2047096044f, + 0.9624552131f, -0.2714404464f, 0.9415440559f, -0.3368898630f, 0.9161879420f, -0.4007488191f, 0.8865066171f, -0.4627159238f, + 0.8526401520f, -0.5224985480f, 0.8147484660f, -0.5798145533f, 0.7730104327f, -0.6343932748f, 0.7276231050f, -0.6859771013f, + 0.6788007617f, -0.7343224883f, 0.6267738342f, -0.7792012691f, 0.5717879534f, -0.8204014301f, 0.5141027570f, -0.8577286005f, + 0.4539904892f, -0.8910065293f, 0.3917350173f, -0.9200780988f, 0.3276301920f, -0.9448060393f, 0.2619786263f, -0.9650736451f, + 1.0000000000f, -0.0000000000f, 0.9960990548f, -0.0882423669f, 0.9844265580f, -0.1757962853f, 0.9650736451f, -0.2619786263f, + 0.9381913543f, -0.3461170495f, 0.9039893150f, -0.4275550842f, 0.8627343774f, -0.5056573749f, 0.8147484660f, -0.5798145533f, + 0.7604059577f, -0.6494480371f, 0.7001308203f, -0.7140145898f, 0.6343932748f, -0.7730104327f, 0.5637062788f, -0.8259753585f, + 0.4886212349f, -0.8724960089f, 0.4097240269f, -0.9122095108f, 0.3276301920f, -0.9448060393f, 0.2429801822f, -0.9700312614f, + 0.1564344615f, -0.9876883626f, 0.0686682612f, -0.9976395369f, -0.0196336918f, -0.9998072386f, -0.1077824607f, -0.9941744804f, + 1.0000000000f, -0.0000000000f, 0.9941744804f, -0.1077824607f, 0.9767658710f, -0.2143091559f, 0.9479769468f, -0.3183389306f, + 0.9081431627f, -0.4186597466f, 0.8577286005f, -0.5141027570f, 0.7973206639f, -0.6035559177f, 0.7276231050f, -0.6859771013f, + 0.6494480371f, -0.7604059577f, 0.5637062788f, -0.8259753585f, 0.4713967443f, -0.8819212914f, 0.3735949695f, -0.9275919199f, + 0.2714404464f, -0.9624552131f, 0.1661233753f, -0.9861049652f, 0.0588708036f, -0.9982656240f, -0.0490676761f, -0.9987954497f, + -0.1564344615f, -0.9876883626f, -0.2619786263f, -0.9650736451f, -0.3644705117f, -0.9312149286f, -0.4627159238f, -0.8865066171f, + 1.0000000000f, -0.0000000000f, 0.9918667078f, -0.1272810102f, 0.9675990939f, -0.2524915636f, 0.9275919199f, -0.3735949695f, + 0.8724960089f, -0.4886212349f, 0.8032075167f, -0.5956993103f, 0.7208535671f, -0.6930873394f, 0.6267738342f, -0.7792012691f, + 0.5224985480f, -0.8526401520f, 0.4097240269f, -0.9122095108f, 0.2902846634f, -0.9569403529f, 0.1661233753f, -0.9861049652f, + 0.0392598175f, -0.9992290139f, -0.0882423669f, -0.9960990548f, -0.2143091559f, -0.9767658710f, -0.3368898630f, -0.9415440559f, + -0.4539904892f, -0.8910065293f, -0.5637062788f, -0.8259753585f, -0.6642524600f, -0.7475083470f, -0.7539935112f, -0.6568819284f, + 1.0000000000f, -0.0000000000f, 0.9891765118f, -0.1467304677f, 0.9569403529f, -0.2902846634f, 0.9039893150f, -0.4275550842f, + 0.8314695954f, -0.5555702448f, 0.7409511209f, -0.6715589762f, 0.6343932748f, -0.7730104327f, 0.5141027570f, -0.8577286005f, + 0.3826834261f, -0.9238795042f, 0.2429801822f, -0.9700312614f, 0.0980171412f, -0.9951847196f, -0.0490676761f, -0.9987954497f, + -0.1950903237f, -0.9807852507f, -0.3368898630f, -0.9415440559f, -0.4713967443f, -0.8819212914f, -0.5956993103f, -0.8032075167f, + -0.7071067691f, -0.7071067691f, -0.8032075167f, -0.5956993103f, -0.8819212914f, -0.4713967443f, -0.9415440559f, -0.3368898630f, + 1.0000000000f, -0.0000000000f, 0.9861049652f, -0.1661233753f, 0.9448060393f, -0.3276301920f, 0.8772509098f, -0.4800321162f, + 0.7853169441f, -0.6190939546f, 0.6715589762f, -0.7409511209f, 0.5391383171f, -0.8422172070f, 0.3917350173f, -0.9200780988f, + 0.2334453613f, -0.9723699093f, 0.0686682612f, -0.9976395369f, -0.0980171412f, -0.9951847196f, -0.2619786263f, -0.9650736451f, + -0.4186597466f, -0.9081431627f, -0.5637062788f, -0.8259753585f, -0.6930873394f, -0.7208535671f, -0.8032075167f, -0.5956993103f, + -0.8910065293f, -0.4539904892f, -0.9540444016f, -0.2996652722f, -0.9905693531f, -0.1370123476f, -0.9995663166f, 0.0294481739f, + 1.0000000000f, -0.0000000000f, 0.9826532602f, -0.1854522377f, 0.9312149286f, -0.3644705117f, 0.8474695683f, -0.5308440328f, + 0.7343224883f, -0.6788007617f, 0.5956993103f, -0.8032075167f, 0.4364092350f, -0.8997482657f, 0.2619786263f, -0.9650736451f, + 0.0784590989f, -0.9969173074f, -0.1077824607f, -0.9941744804f, -0.2902846634f, -0.9569403529f, -0.4627159238f, -0.8865066171f, + -0.6190939546f, -0.7853169441f, -0.7539935112f, -0.6568819284f, -0.8627343774f, -0.5056573749f, -0.9415440559f, -0.3368898630f, + -0.9876883626f, -0.1564344615f, -0.9995663166f, 0.0294481739f, -0.9767658710f, 0.2143091559f, -0.9200780988f, 0.3917350173f, + 1.0000000000f, -0.0000000000f, 0.9788227677f, -0.2047096044f, 0.9161879420f, -0.4007488191f, 0.8147484660f, -0.5798145533f, + 0.6788007617f, -0.7343224883f, 0.5141027570f, -0.8577286005f, 0.3276301920f, -0.9448060393f, 0.1272810102f, -0.9918667078f, + -0.0784590989f, -0.9969173074f, -0.2808761001f, -0.9597440362f, -0.4713967443f, -0.8819212914f, -0.6419516206f, -0.7667451501f, + -0.7853169441f, -0.6190939546f, -0.8954205513f, -0.4452213347f, -0.9675990939f, -0.2524915636f, -0.9987954497f, -0.0490676761f, + -0.9876883626f, 0.1564344615f, -0.9347481728f, 0.3553108871f, -0.8422172070f, 0.5391383171f, -0.7140145898f, 0.7001308203f, + 1.0000000000f, -0.0000000000f, 0.9746148586f, -0.2238880545f, 0.8997482657f, -0.4364092350f, 0.7792012691f, -0.6267738342f, + 0.6190939546f, -0.7853169441f, 0.4275550842f, -0.9039893150f, 0.2143091559f, -0.9767658710f, -0.0098173190f, -0.9999517798f, + -0.2334453613f, -0.9723699093f, -0.4452213347f, -0.8954205513f, -0.6343932748f, -0.7730104327f, -0.7913569212f, -0.6113544106f, + -0.9081431627f, -0.4186597466f, -0.9788227677f, -0.2047096044f, -0.9998072386f, 0.0196336918f, -0.9700312614f, 0.2429801822f, + -0.8910065293f, 0.4539904892f, -0.7667451501f, 0.6419516206f, -0.6035559177f, 0.7973206639f, -0.4097240269f, 0.9122095108f, + 1.0000000000f, -0.0000000000f, 0.9700312614f, -0.2429801822f, 0.8819212914f, -0.4713967443f, 0.7409511209f, -0.6715589762f, + 0.5555702448f, -0.8314695954f, 0.3368898630f, -0.9415440559f, 0.0980171412f, -0.9951847196f, -0.1467304677f, -0.9891765118f, + -0.3826834261f, -0.9238795042f, -0.5956993103f, -0.8032075167f, -0.7730104327f, -0.6343932748f, -0.9039893150f, -0.4275550842f, + -0.9807852507f, -0.1950903237f, -0.9987954497f, 0.0490676761f, -0.9569403529f, 0.2902846634f, -0.8577286005f, 0.5141027570f, + -0.7071067691f, 0.7071067691f, -0.5141027570f, 0.8577286005f, -0.2902846634f, 0.9569403529f, -0.0490676761f, 0.9987954497f, + 1.0000000000f, -0.0000000000f, 0.9650736451f, -0.2619786263f, 0.8627343774f, -0.5056573749f, 0.7001308203f, -0.7140145898f, + 0.4886212349f, -0.8724960089f, 0.2429801822f, -0.9700312614f, -0.0196336918f, -0.9998072386f, -0.2808761001f, -0.9597440362f, + -0.5224985480f, -0.8526401520f, -0.7276231050f, -0.6859771013f, -0.8819212914f, -0.4713967443f, -0.9746148586f, -0.2238880545f, + -0.9992290139f, 0.0392598175f, -0.9540444016f, 0.2996652722f, -0.8422172070f, 0.5391383171f, -0.6715589762f, 0.7409511209f, + -0.4539904892f, 0.8910065293f, -0.2047096044f, 0.9788227677f, 0.0588708036f, 0.9982656240f, 0.3183389306f, 0.9479769468f, + 1.0000000000f, -0.0000000000f, 0.9597440362f, -0.2808761001f, 0.8422172070f, -0.5391383171f, 0.6568819284f, -0.7539935112f, + 0.4186597466f, -0.9081431627f, 0.1467304677f, -0.9891765118f, -0.1370123476f, -0.9905693531f, -0.4097240269f, -0.9122095108f, + -0.6494480371f, -0.7604059577f, -0.8368837237f, -0.5473806858f, -0.9569403529f, -0.2902846634f, -0.9999517798f, -0.0098173190f, + -0.9624552131f, 0.2714404464f, -0.8474695683f, 0.5308440328f, -0.6642524600f, 0.7475083470f, -0.4275550842f, 0.9039893150f, + -0.1564344615f, 0.9876883626f, 0.1272810102f, 0.9918667078f, 0.4007488191f, 0.9161879420f, 0.6419516206f, 0.7667451501f, + 1.0000000000f, -0.0000000000f, 0.9540444016f, -0.2996652722f, 0.8204014301f, -0.5717879534f, 0.6113544106f, -0.7913569212f, + 0.3461170495f, -0.9381913543f, 0.0490676761f, -0.9987954497f, -0.2524915636f, -0.9675990939f, -0.5308440328f, -0.8474695683f, + -0.7604059577f, -0.6494480371f, -0.9200780988f, -0.3917350173f, -0.9951847196f, -0.0980171412f, -0.9788227677f, 0.2047096044f, + -0.8724960089f, 0.4886212349f, -0.6859771013f, 0.7276231050f, -0.4364092350f, 0.8997482657f, -0.1467304677f, 0.9891765118f, + 0.1564344615f, 0.9876883626f, 0.4452213347f, 0.8954205513f, 0.6930873394f, 0.7208535671f, 0.8772509098f, 0.4800321162f +}; + +const float FFT_RotVector_960[1860] = { + 1.0000000000f, -0.0000000000f, 0.9999143481f, -0.0130895954f, + 0.9996573329f, -0.0261769481f, 0.9992290139f, -0.0392598175f, 0.9986295104f, -0.0523359552f, 0.9978589416f, -0.0654031262f, + 0.9969173074f, -0.0784590989f, 0.9958049059f, -0.0915016159f, 0.9945219159f, -0.1045284644f, 0.9930684566f, -0.1175373942f, + 0.9914448857f, -0.1305261850f, 0.9896513820f, -0.1434926242f, 0.9876883626f, -0.1564344615f, 0.9855560660f, -0.1693495065f, + 0.9832549095f, -0.1822355241f, 0.9807852507f, -0.1950903237f, 0.9781476259f, -0.2079116851f, 0.9753423333f, -0.2206974328f, + 0.9723699093f, -0.2334453613f, 0.9692308903f, -0.2461532950f, 0.9659258127f, -0.2588190436f, 0.9624552131f, -0.2714404464f, + 0.9588197470f, -0.2840153575f, 0.9550199509f, -0.2965415716f, 0.9510565400f, -0.3090170026f, 0.9469301105f, -0.3214394748f, + 0.9426414967f, -0.3338068724f, 0.9381913543f, -0.3461170495f, 0.9335803986f, -0.3583679497f, 0.9288095236f, -0.3705574274f, + 1.0000000000f, -0.0000000000f, 0.9996573329f, -0.0261769481f, 0.9986295104f, -0.0523359552f, 0.9969173074f, -0.0784590989f, + 0.9945219159f, -0.1045284644f, 0.9914448857f, -0.1305261850f, 0.9876883626f, -0.1564344615f, 0.9832549095f, -0.1822355241f, + 0.9781476259f, -0.2079116851f, 0.9723699093f, -0.2334453613f, 0.9659258127f, -0.2588190436f, 0.9588197470f, -0.2840153575f, + 0.9510565400f, -0.3090170026f, 0.9426414967f, -0.3338068724f, 0.9335803986f, -0.3583679497f, 0.9238795042f, -0.3826834261f, + 0.9135454297f, -0.4067366421f, 0.9025852680f, -0.4305110872f, 0.8910065293f, -0.4539904892f, 0.8788171411f, -0.4771587551f, + 0.8660253882f, -0.5000000000f, 0.8526401520f, -0.5224985480f, 0.8386705518f, -0.5446390510f, 0.8241261840f, -0.5664062500f, + 0.8090170026f, -0.5877852440f, 0.7933533192f, -0.6087614298f, 0.7771459818f, -0.6293203831f, 0.7604059577f, -0.6494480371f, + 0.7431448102f, -0.6691306233f, 0.7253744006f, -0.6883545518f, 1.0000000000f, -0.0000000000f, 0.9992290139f, -0.0392598175f, + 0.9969173074f, -0.0784590989f, 0.9930684566f, -0.1175373942f, 0.9876883626f, -0.1564344615f, 0.9807852507f, -0.1950903237f, + 0.9723699093f, -0.2334453613f, 0.9624552131f, -0.2714404464f, 0.9510565400f, -0.3090170026f, 0.9381913543f, -0.3461170495f, + 0.9238795042f, -0.3826834261f, 0.9081431627f, -0.4186597466f, 0.8910065293f, -0.4539904892f, 0.8724960089f, -0.4886212349f, + 0.8526401520f, -0.5224985480f, 0.8314695954f, -0.5555702448f, 0.8090170026f, -0.5877852440f, 0.7853169441f, -0.6190939546f, + 0.7604059577f, -0.6494480371f, 0.7343224883f, -0.6788007617f, 0.7071067691f, -0.7071067691f, 0.6788007617f, -0.7343224883f, + 0.6494480371f, -0.7604059577f, 0.6190939546f, -0.7853169441f, 0.5877852440f, -0.8090170026f, 0.5555702448f, -0.8314695954f, + 0.5224985480f, -0.8526401520f, 0.4886212349f, -0.8724960089f, 0.4539904892f, -0.8910065293f, 0.4186597466f, -0.9081431627f, + 1.0000000000f, -0.0000000000f, 0.9986295104f, -0.0523359552f, 0.9945219159f, -0.1045284644f, 0.9876883626f, -0.1564344615f, + 0.9781476259f, -0.2079116851f, 0.9659258127f, -0.2588190436f, 0.9510565400f, -0.3090170026f, 0.9335803986f, -0.3583679497f, + 0.9135454297f, -0.4067366421f, 0.8910065293f, -0.4539904892f, 0.8660253882f, -0.5000000000f, 0.8386705518f, -0.5446390510f, + 0.8090170026f, -0.5877852440f, 0.7771459818f, -0.6293203831f, 0.7431448102f, -0.6691306233f, 0.7071067691f, -0.7071067691f, + 0.6691306233f, -0.7431448102f, 0.6293203831f, -0.7771459818f, 0.5877852440f, -0.8090170026f, 0.5446390510f, -0.8386705518f, + 0.5000000000f, -0.8660253882f, 0.4539904892f, -0.8910065293f, 0.4067366421f, -0.9135454297f, 0.3583679497f, -0.9335803986f, + 0.3090170026f, -0.9510565400f, 0.2588190436f, -0.9659258127f, 0.2079116851f, -0.9781476259f, 0.1564344615f, -0.9876883626f, + 0.1045284644f, -0.9945219159f, 0.0523359552f, -0.9986295104f, 1.0000000000f, -0.0000000000f, 0.9978589416f, -0.0654031262f, + 0.9914448857f, -0.1305261850f, 0.9807852507f, -0.1950903237f, 0.9659258127f, -0.2588190436f, 0.9469301105f, -0.3214394748f, + 0.9238795042f, -0.3826834261f, 0.8968727589f, -0.4422886968f, 0.8660253882f, -0.5000000000f, 0.8314695954f, -0.5555702448f, + 0.7933533192f, -0.6087614298f, 0.7518398166f, -0.6593458056f, 0.7071067691f, -0.7071067691f, 0.6593458056f, -0.7518398166f, + 0.6087614298f, -0.7933533192f, 0.5555702448f, -0.8314695954f, 0.5000000000f, -0.8660253882f, 0.4422886968f, -0.8968727589f, + 0.3826834261f, -0.9238795042f, 0.3214394748f, -0.9469301105f, 0.2588190436f, -0.9659258127f, 0.1950903237f, -0.9807852507f, + 0.1305261850f, -0.9914448857f, 0.0654031262f, -0.9978589416f, -0.0000000000f, -1.0000000000f, -0.0654031262f, -0.9978589416f, + -0.1305261850f, -0.9914448857f, -0.1950903237f, -0.9807852507f, -0.2588190436f, -0.9659258127f, -0.3214394748f, -0.9469301105f, + 1.0000000000f, -0.0000000000f, 0.9969173074f, -0.0784590989f, 0.9876883626f, -0.1564344615f, 0.9723699093f, -0.2334453613f, + 0.9510565400f, -0.3090170026f, 0.9238795042f, -0.3826834261f, 0.8910065293f, -0.4539904892f, 0.8526401520f, -0.5224985480f, + 0.8090170026f, -0.5877852440f, 0.7604059577f, -0.6494480371f, 0.7071067691f, -0.7071067691f, 0.6494480371f, -0.7604059577f, + 0.5877852440f, -0.8090170026f, 0.5224985480f, -0.8526401520f, 0.4539904892f, -0.8910065293f, 0.3826834261f, -0.9238795042f, + 0.3090170026f, -0.9510565400f, 0.2334453613f, -0.9723699093f, 0.1564344615f, -0.9876883626f, 0.0784590989f, -0.9969173074f, + -0.0000000000f, -1.0000000000f, -0.0784590989f, -0.9969173074f, -0.1564344615f, -0.9876883626f, -0.2334453613f, -0.9723699093f, + -0.3090170026f, -0.9510565400f, -0.3826834261f, -0.9238795042f, -0.4539904892f, -0.8910065293f, -0.5224985480f, -0.8526401520f, + -0.5877852440f, -0.8090170026f, -0.6494480371f, -0.7604059577f, 1.0000000000f, -0.0000000000f, 0.9958049059f, -0.0915016159f, + 0.9832549095f, -0.1822355241f, 0.9624552131f, -0.2714404464f, 0.9335803986f, -0.3583679497f, 0.8968727589f, -0.4422886968f, + 0.8526401520f, -0.5224985480f, 0.8012537956f, -0.5983245969f, 0.7431448102f, -0.6691306233f, 0.6788007617f, -0.7343224883f, + 0.6087614298f, -0.7933533192f, 0.5336145163f, -0.8457278013f, 0.4539904892f, -0.8910065293f, 0.3705574274f, -0.9288095236f, + 0.2840153575f, -0.9588197470f, 0.1950903237f, -0.9807852507f, 0.1045284644f, -0.9945219159f, 0.0130895954f, -0.9999143481f, + -0.0784590989f, -0.9969173074f, -0.1693495065f, -0.9855560660f, -0.2588190436f, -0.9659258127f, -0.3461170495f, -0.9381913543f, + -0.4305110872f, -0.9025852680f, -0.5112931132f, -0.8594064116f, -0.5877852440f, -0.8090170026f, -0.6593458056f, -0.7518398166f, + -0.7253744006f, -0.6883545518f, -0.7853169441f, -0.6190939546f, -0.8386705518f, -0.5446390510f, -0.8849876523f, -0.4656145275f, + 1.0000000000f, -0.0000000000f, 0.9945219159f, -0.1045284644f, 0.9781476259f, -0.2079116851f, 0.9510565400f, -0.3090170026f, + 0.9135454297f, -0.4067366421f, 0.8660253882f, -0.5000000000f, 0.8090170026f, -0.5877852440f, 0.7431448102f, -0.6691306233f, + 0.6691306233f, -0.7431448102f, 0.5877852440f, -0.8090170026f, 0.5000000000f, -0.8660253882f, 0.4067366421f, -0.9135454297f, + 0.3090170026f, -0.9510565400f, 0.2079116851f, -0.9781476259f, 0.1045284644f, -0.9945219159f, -0.0000000000f, -1.0000000000f, + -0.1045284644f, -0.9945219159f, -0.2079116851f, -0.9781476259f, -0.3090170026f, -0.9510565400f, -0.4067366421f, -0.9135454297f, + -0.5000000000f, -0.8660253882f, -0.5877852440f, -0.8090170026f, -0.6691306233f, -0.7431448102f, -0.7431448102f, -0.6691306233f, + -0.8090170026f, -0.5877852440f, -0.8660253882f, -0.5000000000f, -0.9135454297f, -0.4067366421f, -0.9510565400f, -0.3090170026f, + -0.9781476259f, -0.2079116851f, -0.9945219159f, -0.1045284644f, 1.0000000000f, -0.0000000000f, 0.9930684566f, -0.1175373942f, + 0.9723699093f, -0.2334453613f, 0.9381913543f, -0.3461170495f, 0.8910065293f, -0.4539904892f, 0.8314695954f, -0.5555702448f, + 0.7604059577f, -0.6494480371f, 0.6788007617f, -0.7343224883f, 0.5877852440f, -0.8090170026f, 0.4886212349f, -0.8724960089f, + 0.3826834261f, -0.9238795042f, 0.2714404464f, -0.9624552131f, 0.1564344615f, -0.9876883626f, 0.0392598175f, -0.9992290139f, + -0.0784590989f, -0.9969173074f, -0.1950903237f, -0.9807852507f, -0.3090170026f, -0.9510565400f, -0.4186597466f, -0.9081431627f, + -0.5224985480f, -0.8526401520f, -0.6190939546f, -0.7853169441f, -0.7071067691f, -0.7071067691f, -0.7853169441f, -0.6190939546f, + -0.8526401520f, -0.5224985480f, -0.9081431627f, -0.4186597466f, -0.9510565400f, -0.3090170026f, -0.9807852507f, -0.1950903237f, + -0.9969173074f, -0.0784590989f, -0.9992290139f, 0.0392598175f, -0.9876883626f, 0.1564344615f, -0.9624552131f, 0.2714404464f, + 1.0000000000f, -0.0000000000f, 0.9914448857f, -0.1305261850f, 0.9659258127f, -0.2588190436f, 0.9238795042f, -0.3826834261f, + 0.8660253882f, -0.5000000000f, 0.7933533192f, -0.6087614298f, 0.7071067691f, -0.7071067691f, 0.6087614298f, -0.7933533192f, + 0.5000000000f, -0.8660253882f, 0.3826834261f, -0.9238795042f, 0.2588190436f, -0.9659258127f, 0.1305261850f, -0.9914448857f, + -0.0000000000f, -1.0000000000f, -0.1305261850f, -0.9914448857f, -0.2588190436f, -0.9659258127f, -0.3826834261f, -0.9238795042f, + -0.5000000000f, -0.8660253882f, -0.6087614298f, -0.7933533192f, -0.7071067691f, -0.7071067691f, -0.7933533192f, -0.6087614298f, + -0.8660253882f, -0.5000000000f, -0.9238795042f, -0.3826834261f, -0.9659258127f, -0.2588190436f, -0.9914448857f, -0.1305261850f, + -1.0000000000f, 0.0000000000f, -0.9914448857f, 0.1305261850f, -0.9659258127f, 0.2588190436f, -0.9238795042f, 0.3826834261f, + -0.8660253882f, 0.5000000000f, -0.7933533192f, 0.6087614298f, 1.0000000000f, -0.0000000000f, 0.9896513820f, -0.1434926242f, + 0.9588197470f, -0.2840153575f, 0.9081431627f, -0.4186597466f, 0.8386705518f, -0.5446390510f, 0.7518398166f, -0.6593458056f, + 0.6494480371f, -0.7604059577f, 0.5336145163f, -0.8457278013f, 0.4067366421f, -0.9135454297f, 0.2714404464f, -0.9624552131f, + 0.1305261850f, -0.9914448857f, -0.0130895954f, -0.9999143481f, -0.1564344615f, -0.9876883626f, -0.2965415716f, -0.9550199509f, + -0.4305110872f, -0.9025852680f, -0.5555702448f, -0.8314695954f, -0.6691306233f, -0.7431448102f, -0.7688418031f, -0.6394389868f, + -0.8526401520f, -0.5224985480f, -0.9187912345f, -0.3947438598f, -0.9659258127f, -0.2588190436f, -0.9930684566f, -0.1175373942f, + -0.9996573329f, 0.0261769481f, -0.9855560660f, 0.1693495065f, -0.9510565400f, 0.3090170026f, -0.8968727589f, 0.4422886968f, + -0.8241261840f, 0.5664062500f, -0.7343224883f, 0.6788007617f, -0.6293203831f, 0.7771459818f, -0.5112931132f, 0.8594064116f, + 1.0000000000f, -0.0000000000f, 0.9876883626f, -0.1564344615f, 0.9510565400f, -0.3090170026f, 0.8910065293f, -0.4539904892f, + 0.8090170026f, -0.5877852440f, 0.7071067691f, -0.7071067691f, 0.5877852440f, -0.8090170026f, 0.4539904892f, -0.8910065293f, + 0.3090170026f, -0.9510565400f, 0.1564344615f, -0.9876883626f, -0.0000000000f, -1.0000000000f, -0.1564344615f, -0.9876883626f, + -0.3090170026f, -0.9510565400f, -0.4539904892f, -0.8910065293f, -0.5877852440f, -0.8090170026f, -0.7071067691f, -0.7071067691f, + -0.8090170026f, -0.5877852440f, -0.8910065293f, -0.4539904892f, -0.9510565400f, -0.3090170026f, -0.9876883626f, -0.1564344615f, + -1.0000000000f, 0.0000000000f, -0.9876883626f, 0.1564344615f, -0.9510565400f, 0.3090170026f, -0.8910065293f, 0.4539904892f, + -0.8090170026f, 0.5877852440f, -0.7071067691f, 0.7071067691f, -0.5877852440f, 0.8090170026f, -0.4539904892f, 0.8910065293f, + -0.3090170026f, 0.9510565400f, -0.1564344615f, 0.9876883626f, 1.0000000000f, -0.0000000000f, 0.9855560660f, -0.1693495065f, + 0.9426414967f, -0.3338068724f, 0.8724960089f, -0.4886212349f, 0.7771459818f, -0.6293203831f, 0.6593458056f, -0.7518398166f, + 0.5224985480f, -0.8526401520f, 0.3705574274f, -0.9288095236f, 0.2079116851f, -0.9781476259f, 0.0392598175f, -0.9992290139f, + -0.1305261850f, -0.9914448857f, -0.2965415716f, -0.9550199509f, -0.4539904892f, -0.8910065293f, -0.5983245969f, -0.8012537956f, + -0.7253744006f, -0.6883545518f, -0.8314695954f, -0.5555702448f, -0.9135454297f, -0.4067366421f, -0.9692308903f, -0.2461532950f, + -0.9969173074f, -0.0784590989f, -0.9958049059f, 0.0915016159f, -0.9659258127f, 0.2588190436f, -0.9081431627f, 0.4186597466f, + -0.8241261840f, 0.5664062500f, -0.7163019180f, 0.6977904439f, -0.5877852440f, 0.8090170026f, -0.4422886968f, 0.8968727589f, + -0.2840153575f, 0.9588197470f, -0.1175373942f, 0.9930684566f, 0.0523359552f, 0.9986295104f, 0.2206974328f, 0.9753423333f, + 1.0000000000f, -0.0000000000f, 0.9832549095f, -0.1822355241f, 0.9335803986f, -0.3583679497f, 0.8526401520f, -0.5224985480f, + 0.7431448102f, -0.6691306233f, 0.6087614298f, -0.7933533192f, 0.4539904892f, -0.8910065293f, 0.2840153575f, -0.9588197470f, + 0.1045284644f, -0.9945219159f, -0.0784590989f, -0.9969173074f, -0.2588190436f, -0.9659258127f, -0.4305110872f, -0.9025852680f, + -0.5877852440f, -0.8090170026f, -0.7253744006f, -0.6883545518f, -0.8386705518f, -0.5446390510f, -0.9238795042f, -0.3826834261f, + -0.9781476259f, -0.2079116851f, -0.9996573329f, -0.0261769481f, -0.9876883626f, 0.1564344615f, -0.9426414967f, 0.3338068724f, + -0.8660253882f, 0.5000000000f, -0.7604059577f, 0.6494480371f, -0.6293203831f, 0.7771459818f, -0.4771587551f, 0.8788171411f, + -0.3090170026f, 0.9510565400f, -0.1305261850f, 0.9914448857f, 0.0523359552f, 0.9986295104f, 0.2334453613f, 0.9723699093f, + 0.4067366421f, 0.9135454297f, 0.5664062500f, 0.8241261840f, 1.0000000000f, -0.0000000000f, 0.9807852507f, -0.1950903237f, + 0.9238795042f, -0.3826834261f, 0.8314695954f, -0.5555702448f, 0.7071067691f, -0.7071067691f, 0.5555702448f, -0.8314695954f, + 0.3826834261f, -0.9238795042f, 0.1950903237f, -0.9807852507f, -0.0000000000f, -1.0000000000f, -0.1950903237f, -0.9807852507f, + -0.3826834261f, -0.9238795042f, -0.5555702448f, -0.8314695954f, -0.7071067691f, -0.7071067691f, -0.8314695954f, -0.5555702448f, + -0.9238795042f, -0.3826834261f, -0.9807852507f, -0.1950903237f, -1.0000000000f, 0.0000000000f, -0.9807852507f, 0.1950903237f, + -0.9238795042f, 0.3826834261f, -0.8314695954f, 0.5555702448f, -0.7071067691f, 0.7071067691f, -0.5555702448f, 0.8314695954f, + -0.3826834261f, 0.9238795042f, -0.1950903237f, 0.9807852507f, 0.0000000000f, 1.0000000000f, 0.1950903237f, 0.9807852507f, + 0.3826834261f, 0.9238795042f, 0.5555702448f, 0.8314695954f, 0.7071067691f, 0.7071067691f, 0.8314695954f, 0.5555702448f, + 1.0000000000f, -0.0000000000f, 0.9999786019f, -0.0065449378f, 0.9999143481f, -0.0130895954f, 0.9998072386f, -0.0196336918f, + 0.9996573329f, -0.0261769481f, 0.9994645715f, -0.0327190831f, 0.9992290139f, -0.0392598175f, 0.9989506602f, -0.0457988679f, + 0.9986295104f, -0.0523359552f, 0.9982656240f, -0.0588708036f, 0.9978589416f, -0.0654031262f, 0.9974094629f, -0.0719326511f, + 0.9969173074f, -0.0784590989f, 0.9963824749f, -0.0849821791f, 0.9958049059f, -0.0915016159f, 0.9951847196f, -0.0980171412f, + 0.9945219159f, -0.1045284644f, 0.9938164353f, -0.1110353097f, 0.9930684566f, -0.1175373942f, 0.9922779202f, -0.1240344495f, + 0.9914448857f, -0.1305261850f, 0.9905693531f, -0.1370123476f, 0.9896513820f, -0.1434926242f, 0.9886910319f, -0.1499667615f, + 0.9876883626f, -0.1564344615f, 0.9866433144f, -0.1628954709f, 0.9855560660f, -0.1693495065f, 0.9844265580f, -0.1757962853f, + 0.9832549095f, -0.1822355241f, 0.9820411205f, -0.1886669695f, 1.0000000000f, -0.0000000000f, 0.9998072386f, -0.0196336918f, + 0.9992290139f, -0.0392598175f, 0.9982656240f, -0.0588708036f, 0.9969173074f, -0.0784590989f, 0.9951847196f, -0.0980171412f, + 0.9930684566f, -0.1175373942f, 0.9905693531f, -0.1370123476f, 0.9876883626f, -0.1564344615f, 0.9844265580f, -0.1757962853f, + 0.9807852507f, -0.1950903237f, 0.9767658710f, -0.2143091559f, 0.9723699093f, -0.2334453613f, 0.9675990939f, -0.2524915636f, + 0.9624552131f, -0.2714404464f, 0.9569403529f, -0.2902846634f, 0.9510565400f, -0.3090170026f, 0.9448060393f, -0.3276301920f, + 0.9381913543f, -0.3461170495f, 0.9312149286f, -0.3644705117f, 0.9238795042f, -0.3826834261f, 0.9161879420f, -0.4007488191f, + 0.9081431627f, -0.4186597466f, 0.8997482657f, -0.4364092350f, 0.8910065293f, -0.4539904892f, 0.8819212914f, -0.4713967443f, + 0.8724960089f, -0.4886212349f, 0.8627343774f, -0.5056573749f, 0.8526401520f, -0.5224985480f, 0.8422172070f, -0.5391383171f, + 1.0000000000f, -0.0000000000f, 0.9994645715f, -0.0327190831f, 0.9978589416f, -0.0654031262f, 0.9951847196f, -0.0980171412f, + 0.9914448857f, -0.1305261850f, 0.9866433144f, -0.1628954709f, 0.9807852507f, -0.1950903237f, 0.9738769531f, -0.2270762622f, + 0.9659258127f, -0.2588190436f, 0.9569403529f, -0.2902846634f, 0.9469301105f, -0.3214394748f, 0.9359059334f, -0.3522500396f, + 0.9238795042f, -0.3826834261f, 0.9108638167f, -0.4127070308f, 0.8968727589f, -0.4422886968f, 0.8819212914f, -0.4713967443f, + 0.8660253882f, -0.5000000000f, 0.8492021561f, -0.5280678272f, 0.8314695954f, -0.5555702448f, 0.8128466606f, -0.5824776888f, + 0.7933533192f, -0.6087614298f, 0.7730104327f, -0.6343932748f, 0.7518398166f, -0.6593458056f, 0.7298640609f, -0.6835923195f, + 0.7071067691f, -0.7071067691f, 0.6835923195f, -0.7298640609f, 0.6593458056f, -0.7518398166f, 0.6343932748f, -0.7730104327f, + 0.6087614298f, -0.7933533192f, 0.5824776888f, -0.8128466606f, 1.0000000000f, -0.0000000000f, 0.9989506602f, -0.0457988679f, + 0.9958049059f, -0.0915016159f, 0.9905693531f, -0.1370123476f, 0.9832549095f, -0.1822355241f, 0.9738769531f, -0.2270762622f, + 0.9624552131f, -0.2714404464f, 0.9490136504f, -0.3152349889f, 0.9335803986f, -0.3583679497f, 0.9161879420f, -0.4007488191f, + 0.8968727589f, -0.4422886968f, 0.8756753206f, -0.4829003513f, 0.8526401520f, -0.5224985480f, 0.8278156519f, -0.5610002279f, + 0.8012537956f, -0.5983245969f, 0.7730104327f, -0.6343932748f, 0.7431448102f, -0.6691306233f, 0.7117196321f, -0.7024636865f, + 0.6788007617f, -0.7343224883f, 0.6444573402f, -0.7646402717f, 0.6087614298f, -0.7933533192f, 0.5717879534f, -0.8204014301f, + 0.5336145163f, -0.8457278013f, 0.4943211973f, -0.8692793250f, 0.4539904892f, -0.8910065293f, 0.4127070308f, -0.9108638167f, + 0.3705574274f, -0.9288095236f, 0.3276301920f, -0.9448060393f, 0.2840153575f, -0.9588197470f, 0.2398044616f, -0.9708212018f, + 1.0000000000f, -0.0000000000f, 0.9982656240f, -0.0588708036f, 0.9930684566f, -0.1175373942f, 0.9844265580f, -0.1757962853f, + 0.9723699093f, -0.2334453613f, 0.9569403529f, -0.2902846634f, 0.9381913543f, -0.3461170495f, 0.9161879420f, -0.4007488191f, + 0.8910065293f, -0.4539904892f, 0.8627343774f, -0.5056573749f, 0.8314695954f, -0.5555702448f, 0.7973206639f, -0.6035559177f, + 0.7604059577f, -0.6494480371f, 0.7208535671f, -0.6930873394f, 0.6788007617f, -0.7343224883f, 0.6343932748f, -0.7730104327f, + 0.5877852440f, -0.8090170026f, 0.5391383171f, -0.8422172070f, 0.4886212349f, -0.8724960089f, 0.4364092350f, -0.8997482657f, + 0.3826834261f, -0.9238795042f, 0.3276301920f, -0.9448060393f, 0.2714404464f, -0.9624552131f, 0.2143091559f, -0.9767658710f, + 0.1564344615f, -0.9876883626f, 0.0980171412f, -0.9951847196f, 0.0392598175f, -0.9992290139f, -0.0196336918f, -0.9998072386f, + -0.0784590989f, -0.9969173074f, -0.1370123476f, -0.9905693531f, 1.0000000000f, -0.0000000000f, 0.9974094629f, -0.0719326511f, + 0.9896513820f, -0.1434926242f, 0.9767658710f, -0.2143091559f, 0.9588197470f, -0.2840153575f, 0.9359059334f, -0.3522500396f, + 0.9081431627f, -0.4186597466f, 0.8756753206f, -0.4829003513f, 0.8386705518f, -0.5446390510f, 0.7973206639f, -0.6035559177f, + 0.7518398166f, -0.6593458056f, 0.7024636865f, -0.7117196321f, 0.6494480371f, -0.7604059577f, 0.5930676460f, -0.8051526546f, + 0.5336145163f, -0.8457278013f, 0.4713967443f, -0.8819212914f, 0.4067366421f, -0.9135454297f, 0.3399692476f, -0.9404365420f, + 0.2714404464f, -0.9624552131f, 0.2015053183f, -0.9794874191f, 0.1305261850f, -0.9914448857f, 0.0588708036f, -0.9982656240f, + -0.0130895954f, -0.9999143481f, -0.0849821791f, -0.9963824749f, -0.1564344615f, -0.9876883626f, -0.2270762622f, -0.9738769531f, + -0.2965415716f, -0.9550199509f, -0.3644705117f, -0.9312149286f, -0.4305110872f, -0.9025852680f, -0.4943211973f, -0.8692793250f, + 1.0000000000f, -0.0000000000f, 0.9963824749f, -0.0849821791f, 0.9855560660f, -0.1693495065f, 0.9675990939f, -0.2524915636f, + 0.9426414967f, -0.3338068724f, 0.9108638167f, -0.4127070308f, 0.8724960089f, -0.4886212349f, 0.8278156519f, -0.5610002279f, + 0.7771459818f, -0.6293203831f, 0.7208535671f, -0.6930873394f, 0.6593458056f, -0.7518398166f, 0.5930676460f, -0.8051526546f, + 0.5224985480f, -0.8526401520f, 0.4481492043f, -0.8939588070f, 0.3705574274f, -0.9288095236f, 0.2902846634f, -0.9569403529f, + 0.2079116851f, -0.9781476259f, 0.1240344495f, -0.9922779202f, 0.0392598175f, -0.9992290139f, -0.0457988679f, -0.9989506602f, + -0.1305261850f, -0.9914448857f, -0.2143091559f, -0.9767658710f, -0.2965415716f, -0.9550199509f, -0.3766284883f, -0.9263643622f, + -0.4539904892f, -0.8910065293f, -0.5280678272f, -0.8492021561f, -0.5983245969f, -0.8012537956f, -0.6642524600f, -0.7475083470f, + -0.7253744006f, -0.6883545518f, -0.7812481523f, -0.6242205501f, 1.0000000000f, -0.0000000000f, 0.9951847196f, -0.0980171412f, + 0.9807852507f, -0.1950903237f, 0.9569403529f, -0.2902846634f, 0.9238795042f, -0.3826834261f, 0.8819212914f, -0.4713967443f, + 0.8314695954f, -0.5555702448f, 0.7730104327f, -0.6343932748f, 0.7071067691f, -0.7071067691f, 0.6343932748f, -0.7730104327f, + 0.5555702448f, -0.8314695954f, 0.4713967443f, -0.8819212914f, 0.3826834261f, -0.9238795042f, 0.2902846634f, -0.9569403529f, + 0.1950903237f, -0.9807852507f, 0.0980171412f, -0.9951847196f, -0.0000000000f, -1.0000000000f, -0.0980171412f, -0.9951847196f, + -0.1950903237f, -0.9807852507f, -0.2902846634f, -0.9569403529f, -0.3826834261f, -0.9238795042f, -0.4713967443f, -0.8819212914f, + -0.5555702448f, -0.8314695954f, -0.6343932748f, -0.7730104327f, -0.7071067691f, -0.7071067691f, -0.7730104327f, -0.6343932748f, + -0.8314695954f, -0.5555702448f, -0.8819212914f, -0.4713967443f, -0.9238795042f, -0.3826834261f, -0.9569403529f, -0.2902846634f, + 1.0000000000f, -0.0000000000f, 0.9938164353f, -0.1110353097f, 0.9753423333f, -0.2206974328f, 0.9448060393f, -0.3276301920f, + 0.9025852680f, -0.4305110872f, 0.8492021561f, -0.5280678272f, 0.7853169441f, -0.6190939546f, 0.7117196321f, -0.7024636865f, + 0.6293203831f, -0.7771459818f, 0.5391383171f, -0.8422172070f, 0.4422886968f, -0.8968727589f, 0.3399692476f, -0.9404365420f, + 0.2334453613f, -0.9723699093f, 0.1240344495f, -0.9922779202f, 0.0130895954f, -0.9999143481f, -0.0980171412f, -0.9951847196f, + -0.2079116851f, -0.9781476259f, -0.3152349889f, -0.9490136504f, -0.4186597466f, -0.9081431627f, -0.5169069171f, -0.8560416102f, + -0.6087614298f, -0.7933533192f, -0.6930873394f, -0.7208535671f, -0.7688418031f, -0.6394389868f, -0.8350879550f, -0.5501164198f, + -0.8910065293f, -0.4539904892f, -0.9359059334f, -0.3522500396f, -0.9692308903f, -0.2461532950f, -0.9905693531f, -0.1370123476f, + -0.9996573329f, -0.0261769481f, -0.9963824749f, 0.0849821791f, 1.0000000000f, -0.0000000000f, 0.9922779202f, -0.1240344495f, + 0.9692308903f, -0.2461532950f, 0.9312149286f, -0.3644705117f, 0.8788171411f, -0.4771587551f, 0.8128466606f, -0.5824776888f, + 0.7343224883f, -0.6788007617f, 0.6444573402f, -0.7646402717f, 0.5446390510f, -0.8386705518f, 0.4364092350f, -0.8997482657f, + 0.3214394748f, -0.9469301105f, 0.2015053183f, -0.9794874191f, 0.0784590989f, -0.9969173074f, -0.0457988679f, -0.9989506602f, + -0.1693495065f, -0.9855560660f, -0.2902846634f, -0.9569403529f, -0.4067366421f, -0.9135454297f, -0.5169069171f, -0.8560416102f, + -0.6190939546f, -0.7853169441f, -0.7117196321f, -0.7024636865f, -0.7933533192f, -0.6087614298f, -0.8627343774f, -0.5056573749f, + -0.9187912345f, -0.3947438598f, -0.9606580734f, -0.2777338326f, -0.9876883626f, -0.1564344615f, -0.9994645715f, -0.0327190831f, + -0.9958049059f, 0.0915016159f, -0.9767658710f, 0.2143091559f, -0.9426414967f, 0.3338068724f, -0.8939588070f, 0.4481492043f, + 1.0000000000f, -0.0000000000f, 0.9905693531f, -0.1370123476f, 0.9624552131f, -0.2714404464f, 0.9161879420f, -0.4007488191f, + 0.8526401520f, -0.5224985480f, 0.7730104327f, -0.6343932748f, 0.6788007617f, -0.7343224883f, 0.5717879534f, -0.8204014301f, + 0.4539904892f, -0.8910065293f, 0.3276301920f, -0.9448060393f, 0.1950903237f, -0.9807852507f, 0.0588708036f, -0.9982656240f, + -0.0784590989f, -0.9969173074f, -0.2143091559f, -0.9767658710f, -0.3461170495f, -0.9381913543f, -0.4713967443f, -0.8819212914f, + -0.5877852440f, -0.8090170026f, -0.6930873394f, -0.7208535671f, -0.7853169441f, -0.6190939546f, -0.8627343774f, -0.5056573749f, + -0.9238795042f, -0.3826834261f, -0.9675990939f, -0.2524915636f, -0.9930684566f, -0.1175373942f, -0.9998072386f, 0.0196336918f, + -0.9876883626f, 0.1564344615f, -0.9569403529f, 0.2902846634f, -0.9081431627f, 0.4186597466f, -0.8422172070f, 0.5391383171f, + -0.7604059577f, 0.6494480371f, -0.6642524600f, 0.7475083470f, 1.0000000000f, -0.0000000000f, 0.9886910319f, -0.1499667615f, + 0.9550199509f, -0.2965415716f, 0.8997482657f, -0.4364092350f, 0.8241261840f, -0.5664062500f, 0.7298640609f, -0.6835923195f, + 0.6190939546f, -0.7853169441f, 0.4943211973f, -0.8692793250f, 0.3583679497f, -0.9335803986f, 0.2143091559f, -0.9767658710f, + 0.0654031262f, -0.9978589416f, -0.0849821791f, -0.9963824749f, -0.2334453613f, -0.9723699093f, -0.3766284883f, -0.9263643622f, + -0.5112931132f, -0.8594064116f, -0.6343932748f, -0.7730104327f, -0.7431448102f, -0.6691306233f, -0.8350879550f, -0.5501164198f, + -0.9081431627f, -0.4186597466f, -0.9606580734f, -0.2777338326f, -0.9914448857f, -0.1305261850f, -0.9998072386f, 0.0196336918f, + -0.9855560660f, 0.1693495065f, -0.9490136504f, 0.3152349889f, -0.8910065293f, 0.4539904892f, -0.8128466606f, 0.5824776888f, + -0.7163019180f, 0.6977904439f, -0.6035559177f, 0.7973206639f, -0.4771587551f, 0.8788171411f, -0.3399692476f, 0.9404365420f, + 1.0000000000f, -0.0000000000f, 0.9866433144f, -0.1628954709f, 0.9469301105f, -0.3214394748f, 0.8819212914f, -0.4713967443f, + 0.7933533192f, -0.6087614298f, 0.6835923195f, -0.7298640609f, 0.5555702448f, -0.8314695954f, 0.4127070308f, -0.9108638167f, + 0.2588190436f, -0.9659258127f, 0.0980171412f, -0.9951847196f, -0.0654031262f, -0.9978589416f, -0.2270762622f, -0.9738769531f, + -0.3826834261f, -0.9238795042f, -0.5280678272f, -0.8492021561f, -0.6593458056f, -0.7518398166f, -0.7730104327f, -0.6343932748f, + -0.8660253882f, -0.5000000000f, -0.9359059334f, -0.3522500396f, -0.9807852507f, -0.1950903237f, -0.9994645715f, -0.0327190831f, + -0.9914448857f, 0.1305261850f, -0.9569403529f, 0.2902846634f, -0.8968727589f, 0.4422886968f, -0.8128466606f, 0.5824776888f, + -0.7071067691f, 0.7071067691f, -0.5824776888f, 0.8128466606f, -0.4422886968f, 0.8968727589f, -0.2902846634f, 0.9569403529f, + -0.1305261850f, 0.9914448857f, 0.0327190831f, 0.9994645715f, 1.0000000000f, -0.0000000000f, 0.9844265580f, -0.1757962853f, + 0.9381913543f, -0.3461170495f, 0.8627343774f, -0.5056573749f, 0.7604059577f, -0.6494480371f, 0.6343932748f, -0.7730104327f, + 0.4886212349f, -0.8724960089f, 0.3276301920f, -0.9448060393f, 0.1564344615f, -0.9876883626f, -0.0196336918f, -0.9998072386f, + -0.1950903237f, -0.9807852507f, -0.3644705117f, -0.9312149286f, -0.5224985480f, -0.8526401520f, -0.6642524600f, -0.7475083470f, + -0.7853169441f, -0.6190939546f, -0.8819212914f, -0.4713967443f, -0.9510565400f, -0.3090170026f, -0.9905693531f, -0.1370123476f, + -0.9992290139f, 0.0392598175f, -0.9767658710f, 0.2143091559f, -0.9238795042f, 0.3826834261f, -0.8422172070f, 0.5391383171f, + -0.7343224883f, 0.6788007617f, -0.6035559177f, 0.7973206639f, -0.4539904892f, 0.8910065293f, -0.2902846634f, 0.9569403529f, + -0.1175373942f, 0.9930684566f, 0.0588708036f, 0.9982656240f, 0.2334453613f, 0.9723699093f, 0.4007488191f, 0.9161879420f, + 1.0000000000f, -0.0000000000f, 0.9820411205f, -0.1886669695f, 0.9288095236f, -0.3705574274f, 0.8422172070f, -0.5391383171f, + 0.7253744006f, -0.6883545518f, 0.5824776888f, -0.8128466606f, 0.4186597466f, -0.9081431627f, 0.2398044616f, -0.9708212018f, + 0.0523359552f, -0.9986295104f, -0.1370123476f, -0.9905693531f, -0.3214394748f, -0.9469301105f, -0.4943211973f, -0.8692793250f, + -0.6494480371f, -0.7604059577f, -0.7812481523f, -0.6242205501f, -0.8849876523f, -0.4656145275f, -0.9569403529f, -0.2902846634f, + -0.9945219159f, -0.1045284644f, -0.9963824749f, 0.0849821791f, -0.9624552131f, 0.2714404464f, -0.8939588070f, 0.4481492043f, + -0.7933533192f, 0.6087614298f, -0.6642524600f, 0.7475083470f, -0.5112931132f, 0.8594064116f, -0.3399692476f, 0.9404365420f, + -0.1564344615f, 0.9876883626f, 0.0327190831f, 0.9994645715f, 0.2206974328f, 0.9753423333f, 0.4007488191f, 0.9161879420f, + 0.5664062500f, 0.8241261840f, 0.7117196321f, 0.7024636865f, 1.0000000000f, -0.0000000000f, 0.9794874191f, -0.2015053183f, + 0.9187912345f, -0.3947438598f, 0.8204014301f, -0.5717879534f, 0.6883545518f, -0.7253744006f, 0.5280678272f, -0.8492021561f, + 0.3461170495f, -0.9381913543f, 0.1499667615f, -0.9886910319f, -0.0523359552f, -0.9986295104f, -0.2524915636f, -0.9675990939f, + -0.4422886968f, -0.8968727589f, -0.6139408350f, -0.7893520594f, -0.7604059577f, -0.6494480371f, -0.8756753206f, -0.4829003513f, + -0.9550199509f, -0.2965415716f, -0.9951847196f, -0.0980171412f, -0.9945219159f, 0.1045284644f, -0.9530586600f, 0.3027857840f, + -0.8724960089f, 0.4886212349f, -0.7561390996f, 0.6544109583f, -0.6087614298f, 0.7933533192f, -0.4364092350f, 0.8997482657f, + -0.2461532950f, 0.9692308903f, -0.0457988679f, 0.9989506602f, 0.1564344615f, 0.9876883626f, 0.3522500396f, 0.9359059334f, + 0.5336145163f, 0.8457278013f, 0.6930873394f, 0.7208535671f, 0.8241261840f, 0.5664062500f, 0.9213551283f, 0.3887219727f +}; + + +/* HVQ */ +const float hvq_thr_adj[5] = { 0.7071068f, 0.5000000f, 0.2500000f, 0.5000000f, 0.7071068f}; + +const float hvq_class_c[16] = +{ + -0.2324457f, -0.4390556f, 0.0651793f, 0.2109977f, + 0.1471332f, -0.1351437f, 0.4312476f, -0.1384814f, + -0.1384814f, 0.4312476f, -0.1351437f, 0.1471332f, + 0.2109977f, 0.0651793f, -0.4390556f, -0.2324457f +}; + +const int16_t hvq_cb_search_overlap24k[17] = +{ + 0, 8, 17, 27, + 39, 53, 69, 89, + 113, 128, 128, 128, + 128, 128, 128, 128, + 128 +}; + +const int16_t hvq_cb_search_overlap32k[21] = +{ + 0, 6, 13, 21, + 30, 40, 51, 64, + 78, 96, 116, 128, + 128, 128, 128, 128, + 128, 128, 128, 128, + 128 +}; + +const float hvq_peak_cb[1024] = +{ + -0.6912956f, -0.6271097f, -0.7024875f, 0.4262808f, + -0.7780800f, -0.8390081f, -0.2123103f, 0.1755754f, + -0.6005284f, -0.6187206f, -0.1867433f, 0.5583949f, + -0.1626335f, -0.6971197f, -0.6486326f, 0.4250869f, + -0.8399908f, -0.8860587f, 0.0171807f, 0.2217064f, + -0.7976624f, -0.4009260f, -0.2953390f, 0.2432917f, + -0.0157667f, -0.6356865f, -0.3266405f, 0.8188483f, + -0.8489450f, -0.6545582f, 0.0063441f, 0.1921560f, + -0.4517379f, -0.8665710f, -0.2336057f, 0.1562026f, + 0.4618506f, -0.7325841f, -0.6645442f, 0.7730063f, + -0.3442883f, -0.7223252f, -0.6207414f, -0.0612312f, + -0.4947599f, -0.7362953f, 0.2769519f, 0.6891029f, + -0.6117975f, -0.7841619f, -0.0077496f, 0.1986304f, + -0.5240943f, -0.9067913f, 0.0485043f, 0.2167943f, + -0.5396412f, -0.1256491f, -0.1235545f, 0.6819669f, + -0.8648130f, -0.4241201f, 0.0204877f, 0.2068082f, + -0.5605495f, -0.5470207f, -0.2261054f, 0.1577327f, + -0.6742380f, -0.5969556f, 0.0214089f, 0.1821478f, + -0.2017185f, -0.8361119f, -0.1487647f, 0.2677230f, + -0.9043679f, -0.1694224f, 0.0082920f, 0.2133927f, + -0.2797693f, -0.6069181f, -0.2787998f, 0.1967338f, + -0.7057108f, -0.7816155f, 0.2978523f, 0.1754361f, + -0.3176815f, -0.9099026f, 0.0490125f, 0.2141907f, + -0.4198575f, -0.7583196f, 0.0635993f, 0.2175556f, + -0.5430584f, -0.4931615f, 0.0181889f, 0.2223880f, + -0.6798062f, -0.3401114f, 0.0158910f, 0.1975791f, + -0.4111015f, -0.6318658f, -0.0022674f, 0.2056921f, + 0.0577086f, -0.4957561f, -0.3895008f, 0.4151040f, + -0.0493461f, -0.8356919f, -0.2944458f, 0.0766301f, + -0.6653519f, -0.3581038f, -0.1475882f, -0.0488843f, + -0.2951041f, -0.8518280f, 0.1970185f, 0.1934331f, + -0.7088394f, -0.1404796f, 0.0230110f, 0.1779071f, + -0.2349629f, -0.7451124f, 0.0672633f, 0.1989080f, + -0.8420037f, 0.0843352f, 0.0575119f, 0.2087238f, + -0.4653422f, -0.3204370f, 0.0104996f, 0.2118398f, + -0.4042698f, -0.2978680f, -0.1369022f, 0.1310524f, + -0.3691715f, -0.4627771f, 0.0194469f, 0.1874501f, + -0.7932880f, -0.4999925f, 0.5272518f, 0.1987127f, + -0.3157207f, -0.7989150f, 0.0281708f, -0.0724433f, + -0.4063714f, -0.5531399f, 0.2087681f, 0.2166726f, + -0.6433928f, -0.7400934f, 0.1283951f, -0.2888276f, + -0.6992665f, -0.2153651f, 0.2638986f, 0.2449246f, + 0.0759221f, -0.6326668f, -0.0243810f, 0.4197445f, + -0.1053094f, -0.3928218f, 0.0776661f, 0.5284011f, + 0.0786145f, -0.5979541f, -0.3155530f, 0.1330860f, + -0.2138216f, -0.5920822f, 0.0591093f, 0.2060311f, + 0.5341295f, -0.7605932f, -0.5172090f, 0.2604366f, + -0.1048604f, -0.8851262f, 0.1927255f, 0.1973499f, + -0.5168340f, -0.1512779f, 0.0180467f, 0.2015491f, + 0.0335269f, -0.8175794f, -0.0216168f, 0.1691676f, + -0.1815545f, -0.4323540f, -0.1449728f, 0.1241323f, + -0.3259940f, -0.4574721f, -0.2285515f, -0.1586095f, + 0.0051494f, -0.1975091f, -0.1569577f, 0.4943931f, + -0.6204569f, 0.0525578f, 0.0120660f, 0.1902273f, + -0.4779290f, -0.6992531f, 0.7534508f, 0.4339787f, + -0.1187649f, -0.6976845f, 0.1573026f, 0.1922948f, + -0.2681343f, -0.3088476f, 0.0065871f, 0.2084513f, + -0.3780985f, -0.3375740f, 0.1472063f, 0.1975328f, + -0.2351356f, -0.1280155f, -0.1625378f, 0.2005500f, + -0.0170806f, -0.6339361f, -0.0847550f, 0.0556140f, + -0.2045688f, -0.4398525f, 0.0735149f, 0.1856326f, + -0.3233196f, -0.7640965f, 0.4361117f, 0.1472444f, + 0.0629942f, -0.7853858f, 0.5146322f, 0.6244928f, + -0.0839811f, -0.8881392f, 0.3847862f, 0.2300789f, + -0.2330840f, -0.5500582f, 0.0594403f, 0.0210406f, + -0.3345076f, -0.1781868f, 0.0208460f, 0.1883004f, + -0.7935783f, 0.3725855f, 0.3278117f, 0.4754694f, + -0.0642284f, -0.2632120f, -0.1505273f, 0.2129149f, + -0.3033468f, -0.4616954f, 0.3710885f, 0.2992681f, + -0.4248384f, -0.0016876f, 0.0134380f, 0.1927050f, + -0.0092953f, -0.1855540f, 0.3449483f, 0.7852289f, + -0.3791312f, -0.0964576f, 0.2097941f, 0.3001604f, + -0.0848375f, -0.5015270f, 0.1259740f, 0.1763195f, + 0.5429158f, -0.3354102f, -0.2024174f, 0.6442416f, + 0.3773962f, -0.8102532f, -0.3228953f, -0.0772150f, + -0.2048677f, -0.3115774f, 0.1465945f, 0.1916357f, + -0.1810441f, 0.0864401f, 0.1519246f, 0.5593738f, + 0.0822840f, -0.7269843f, -0.3622333f, -0.4062700f, + 0.1607091f, -0.3317170f, -0.2421061f, 0.1359637f, + -0.0962719f, -0.3355251f, 0.0679005f, 0.1770951f, + 0.0250174f, -0.3651731f, -0.0426421f, 0.1630863f, + -0.1534063f, -0.2206571f, 0.0377216f, 0.1773635f, + -0.0503107f, -0.6410940f, 0.2730565f, 0.1690477f, + -0.4957757f, -0.0244409f, -0.0162808f, -0.0955787f, + -0.2524313f, -0.0397484f, 0.0112025f, 0.1818186f, + -0.8109849f, -0.1058945f, 0.2174591f, -0.2708842f, + -0.1470562f, -0.1641739f, -0.1197168f, 0.0447477f, + 0.0588656f, -0.6303298f, 0.1348466f, 0.1117979f, + 0.0743650f, -0.8166042f, 0.3325572f, 0.1713777f, + -0.2014585f, -0.3172087f, 0.0655640f, 0.0041949f, + 0.4579843f, -0.6991156f, -0.1204969f, 0.1891217f, + -0.2764455f, -0.8453921f, 0.7031553f, 0.1247506f, + 0.2536679f, -0.0081430f, 0.0907404f, 0.7806163f, + -0.1158093f, -0.1102171f, -0.0149151f, 0.1648406f, + 0.2353252f, -0.7899960f, 0.1050820f, 0.0800406f, + -0.7417480f, 0.0943212f, 0.4042825f, 0.0998893f, + -0.0950040f, -0.0430378f, 0.1080511f, 0.3676440f, + 0.0093255f, -0.3641596f, -0.1371177f, -0.0609554f, + -0.5714336f, 0.2519692f, 0.2317291f, 0.2202618f, + -0.4146698f, -0.2566845f, 0.2659634f, -0.0347036f, + -0.3670773f, 0.1802618f, 0.5463926f, 0.6508593f, + -0.0678326f, -0.7015804f, 0.3010046f, -0.0498279f, + -0.0220688f, -0.1813971f, 0.0217875f, 0.1577779f, + 0.0649310f, -0.4638375f, 0.0635012f, 0.0496216f, + -0.0147237f, -0.2600337f, 0.2481463f, 0.3285215f, + 0.0016037f, -0.3668163f, 0.1572298f, 0.1535826f, + 0.0720517f, -0.4195340f, 0.7542142f, 0.8043668f, + 0.0327889f, -0.8709202f, 0.5519686f, 0.1322237f, + 0.0325743f, -0.6758953f, 0.4356905f, 0.1690573f, + 0.0222460f, -0.4592628f, 0.2421902f, 0.1418606f, + -0.5079813f, -0.1937920f, 0.7216264f, 0.2938249f, + -0.0027737f, -0.2586997f, 0.1006489f, 0.1311191f, + 0.1067900f, -0.2263411f, -0.0675541f, 0.0894570f, + -0.1463278f, -0.1350150f, 0.1979781f, 0.1301280f, + -0.2848267f, 0.1030649f, 0.2004989f, 0.1749749f, + 0.0528965f, -0.5370577f, 0.3406753f, 0.1271570f, + -0.0828084f, -0.4938643f, 0.4483900f, 0.1278149f, + -0.7256999f, 0.2998409f, 0.7843215f, 0.4678534f, + 0.0178764f, -0.5886182f, 0.6584490f, 0.3674424f, + 0.3457182f, -0.4777862f, 0.0898507f, 0.2238471f, + 0.2808650f, -0.5159423f, -0.1746428f, -0.1639121f, + -0.2412612f, -0.1413623f, 0.3805663f, 0.1746805f, + -0.0037664f, -0.5041469f, 0.0297737f, -0.2529321f, + 0.0385025f, -0.1210239f, -0.0919721f, -0.0045255f, + 0.0070289f, -0.0661929f, 0.0154059f, 0.1206527f, + -0.0688511f, -0.3501640f, 0.3048728f, 0.0806736f, + 0.1477360f, -0.2446724f, -0.1408905f, -0.0903137f, + 0.7393242f, -0.6937444f, 0.2281068f, 0.5408337f, + 0.2058932f, -0.1764501f, 0.1488327f, 0.2644186f, + -0.2103685f, -0.7390670f, 0.3717342f, -0.4480860f, + 0.0866347f, -0.2311362f, 0.1469333f, 0.0725029f, + 0.0817948f, -0.1216286f, 0.0533709f, 0.0628859f, + -0.0171689f, 0.0986378f, 0.0927410f, 0.1758267f, + 0.0104681f, -0.1266550f, 0.2014265f, 0.1157332f, + 0.1939706f, 0.2196828f, 0.3266076f, 0.7405447f, + -0.7823431f, -0.3710044f, 0.6980741f, -0.4465685f, + 0.0743889f, -0.2648934f, 0.2536655f, 0.0943156f, + 0.2177452f, -0.0949112f, 0.0081777f, 0.1387556f, + 0.1303671f, 0.1490959f, 0.1788726f, 0.4326436f, + 0.3473369f, -0.3169577f, -0.0234188f, 0.0441885f, + 0.0540186f, -0.8776336f, 0.8440490f, 0.1417058f, + -0.0917870f, -0.3147601f, 0.5500574f, 0.1602690f, + 0.2136007f, -0.5448702f, 0.2987510f, 0.0277404f, + 0.0474804f, -0.6571059f, 0.6386938f, 0.0971133f, + 0.8189747f, -0.7255339f, -0.0875124f, 0.1071008f, + -0.3016306f, -0.4416167f, 0.7533376f, 0.0058841f, + -0.1006996f, -0.1797670f, 0.1598059f, -0.1746155f, + -0.2759751f, -0.4375621f, 0.5324653f, -0.2187090f, + -0.0208548f, 0.0007885f, 0.1221271f, -0.0071798f, + 0.0937424f, -0.3872427f, 0.4131232f, 0.0814878f, + 0.1091490f, -0.3197269f, 0.3081368f, 0.0438068f, + 0.5405672f, -0.7493672f, 0.2284625f, 0.0522655f, + 0.2024367f, -0.2027840f, 0.0568407f, -0.0238867f, + 0.0971868f, -0.2548049f, 0.1213150f, -0.1210491f, + 0.2468838f, -0.7298202f, 0.2279600f, -0.2664659f, + 0.0852271f, -0.5106476f, 0.5313835f, 0.0594584f, + -0.1823397f, -0.4332103f, 0.0531194f, -0.6742789f, + 0.1030347f, -0.0238603f, 0.5571925f, 0.5078690f, + 0.1173396f, -0.1079135f, 0.1567269f, 0.0102248f, + 0.0996963f, -0.0219312f, 0.3216055f, 0.2366872f, + -0.3354882f, 0.1576330f, 0.5458030f, 0.1454629f, + 0.1444273f, -0.2365381f, 0.4773806f, 0.2506996f, + 0.1122540f, 0.0514636f, 0.1089756f, 0.0667886f, + -0.3413622f, 0.0448554f, 0.1877440f, -0.3506308f, + 0.1328394f, -0.0670468f, 0.0414011f, -0.0965496f, + 0.1299393f, -0.1839806f, 0.2569631f, -0.0070157f, + 0.1898328f, -0.0451201f, 0.0642396f, -0.0240266f, + -0.1290649f, -0.1413532f, 0.4606663f, -0.0510201f, + 0.0606055f, -0.4923670f, 0.4283018f, -0.1857787f, + 0.2395181f, -0.4428843f, 0.0877497f, -0.3090582f, + 0.1463607f, -0.4354426f, -0.2673760f, -0.7759982f, + 0.0363660f, -0.7473857f, 0.6714249f, -0.1897013f, + 0.0078778f, -0.3179395f, 0.8379888f, 0.3211752f, + -0.0229962f, 0.2191676f, 0.2311431f, 0.1050956f, + 0.1829474f, 0.0992829f, 0.7687454f, 0.7776823f, + 0.1946814f, -0.1941786f, 0.0124760f, -0.2574112f, + -0.1012860f, 0.0992883f, 0.3672758f, 0.0414330f, + 0.0971759f, -0.1978175f, 0.3925655f, -0.0065848f, + 0.7740223f, -0.2335201f, -0.0906675f, 0.1745083f, + 0.1516487f, -0.1042227f, 0.2148387f, -0.0795036f, + 0.0798246f, -0.6448072f, 0.8609363f, 0.0393394f, + 0.0779220f, -0.4600459f, 0.7273327f, 0.0570835f, + 0.4454859f, -0.2072924f, 0.2193948f, 0.1384101f, + 0.1703254f, -0.0609580f, 0.1299055f, -0.1323671f, + 0.1839394f, -0.3244128f, 0.3025059f, -0.1719029f, + 0.1127521f, -0.3544195f, 0.5826200f, 0.0178632f, + 0.1347488f, -0.2685010f, 0.4751232f, -0.0335460f, + -0.0268326f, 0.0229464f, 0.5944858f, 0.1651578f, + 0.1752550f, 0.0136593f, 0.3010034f, 0.0409467f, + 0.6297039f, -0.5169880f, -0.2259630f, -0.5169126f, + -0.3645581f, 0.5447856f, 0.5927204f, 0.1806151f, + 0.3826406f, -0.6356577f, 0.6929637f, 0.0339571f, + 0.1438846f, -0.1324825f, 0.3836886f, -0.1131758f, + 0.1225381f, -0.2508278f, 0.1022063f, -0.5355556f, + 0.1951728f, -0.0473224f, 0.1347071f, -0.2533568f, + 0.7506700f, -0.7468928f, 0.6686158f, 0.2984126f, + 0.1631571f, 0.0422823f, 0.2118532f, -0.1436800f, + -0.0460037f, 0.0633928f, 0.2509617f, -0.3180083f, + 0.1858027f, -0.1040863f, 0.2692820f, -0.1939493f, + 0.2203176f, 0.5295745f, 0.6812901f, 0.7900824f, + 0.2034420f, -0.0552806f, 0.0599414f, -0.4107925f, + 0.2479052f, -0.1359192f, 0.8121924f, 0.3484631f, + 0.1398457f, -0.2176905f, 0.5621405f, -0.1195728f, + -0.0080597f, 0.3218221f, 0.7571263f, 0.3912670f, + 0.2116680f, -0.6982532f, 0.3125198f, -0.7360096f, + 0.0948572f, -0.2203334f, 0.3659414f, -0.3956103f, + 0.1293136f, -0.3171252f, 0.7146217f, -0.0790813f, + 0.1411146f, -0.4510387f, 0.8887131f, -0.0377003f, + 0.2301871f, -0.0353170f, 0.5297350f, 0.0379717f, + 0.6152722f, -0.1928382f, 0.0785710f, -0.1588030f, + 0.1337912f, 0.1823085f, 0.3354832f, -0.0887607f, + 0.0494082f, -0.1225804f, 0.7939893f, 0.0220200f, + 0.1421773f, 0.3523192f, 0.4413828f, 0.1457048f, + -0.0882652f, 0.3232748f, 0.4595339f, -0.1386560f, + 0.0601664f, -0.4816208f, 0.8133457f, -0.3112419f, + 0.1845199f, -0.0171361f, 0.3659768f, -0.2448125f, + 0.1891260f, -0.0106495f, 0.2419292f, -0.3683512f, + 0.6530412f, -0.4171780f, 0.4613151f, 0.0030213f, + 0.1778989f, -0.1239391f, 0.5100323f, -0.2197134f, + -0.2717385f, 0.1272452f, 0.7572512f, -0.2318920f, + 0.3716251f, 0.1855403f, 0.5916812f, 0.3385713f, + 0.1300696f, 0.0471288f, 0.5215391f, -0.1457248f, + -0.2123145f, -0.1802899f, 0.5974199f, -0.7072856f, + 0.2174739f, -0.7171207f, 0.7595373f, -0.5396347f, + 0.1682724f, -0.1652717f, 0.7105864f, -0.1779208f, + 0.1949437f, -0.0545715f, 0.4387951f, -0.3539158f, + 0.1556118f, -0.2676762f, 0.8786431f, -0.1395478f, + 0.1839802f, -0.1270819f, 0.0981727f, -0.8218095f, + 0.1961324f, 0.0044393f, 0.2839973f, -0.5454667f, + 0.1691811f, 0.1170212f, 0.7761239f, -0.0004658f, + 0.2532176f, -0.3257096f, 0.6409724f, -0.4603164f, + 0.1836927f, -0.2327923f, 0.4239208f, -0.6877027f, + 0.8283811f, 0.0514265f, 0.3075364f, 0.1290827f, + 0.1590365f, -0.0471006f, 0.6768611f, -0.3246488f, + 0.1948562f, 0.1742693f, 0.4112475f, -0.3959884f, + 0.1608810f, 0.5362161f, 0.7247152f, 0.1551418f, + -0.0640990f, 0.2785439f, 0.4195016f, -0.6363523f, + -0.4977460f, 0.4795997f, 0.6537622f, -0.7041565f, + 0.1993300f, -0.0009453f, 0.5226769f, -0.5072073f, + 0.1647024f, -0.1025920f, 0.8690643f, -0.2884946f, + 0.1903634f, 0.0383981f, 0.4024816f, -0.6858912f, + 0.3935245f, -0.1394052f, 0.2460183f, -0.8132467f, + 0.0876800f, 0.1823305f, 0.6760031f, -0.4640969f, + 0.1928370f, -0.0154626f, 0.7054892f, -0.5314507f, + 0.7363694f, -0.4335648f, 0.3939214f, -0.6439396f, + 0.2216142f, 0.2584981f, 0.7753125f, -0.2883786f, + 0.1655171f, -0.0354699f, 0.9000988f, -0.4917610f, + 0.6522388f, 0.6980886f, 0.7493314f, 0.5121635f, + 0.2039644f, 0.0748634f, 0.4817260f, -0.8814858f, + 0.1984904f, 0.0331222f, 0.6597681f, -0.7397799f, + 0.6551378f, 0.0189344f, 0.7086707f, -0.2207969f, + 0.3331688f, 0.2704824f, 0.5667230f, -0.6593540f, + 0.2047795f, -0.0638265f, 0.8838190f, -0.7884763f, + 0.2100875f, 0.6368825f, 0.8423747f, -0.2746185f, + 0.2074577f, 0.1714071f, 0.8760290f, -0.6561672f, + 0.1851064f, 0.1440378f, 0.7655031f, -0.8835155f +}; + +const int16_t hvq_pg_huff_offset[NUM_PG_HUFFLEN] = {0,2,3,8,9,11,13,15,19}; +const int16_t hvq_pg_huff_thres[NUM_PG_HUFFLEN] = {0,0x2,0x4,0x18,0x20,0x40,0x80,0x100,0x300}; + +const int16_t hvq_pg_huff_tab[32] = +{ + 30, 31, 1, 0, 2, 3, 28, 29, 4, 5, 27, 25, 26, 6, 24, 7, 8, 22, 23, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21 +}; + +const int16_t hvq_cp_huff_len[52] = +{ + 3, 4, 5, 6, 6, 6, 6, 6, 4, 4, 5, 5, 5, 5, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 8, + 8, 8, 8, 8, 9, 10, 10, 11, 11, 11, 10, 10, 10, 10, 11, 12, 12, 13, 13, 12, 12, 11, 12 +}; + +const int16_t hvq_cp_huff_val[52] = +{ + 7, 8, 6, 3, 4, 5, 6, 7, 9, 10, 7, 8, 9, 10, 11, 12, 13, 11, 12, 13, 14, 15, 8, 9, 10, + 11, 4, 5, 3, 4, 5, 6, 7, 5, 4, 5, 3, 4, 5, 6, 7, 8, 9, 6, 1, 2, 0, 1, 3, 4, 7, 5 +}; + +const int16_t hvq_cp_layer1_map5[HVQ_CP_MAP_LEN] = { 16, 8, 4, 2, 1, 18, 17, 9 }; + +const int16_t hvq_cp_huff_thres[HVQ_CP_HUFF_NUM_LEN] = { 0x0, 0x2, 0xC, 0x20, 0x50, 0x60, 0x100, 0x180, 0x600, 0x1000, 0x1C00 }; +const int16_t hvq_cp_huff_offset[HVQ_CP_HUFF_NUM_LEN] = { 0, 2, 7, 12, 18, 19, 24, 26, 35, 45, 51 }; + +const int16_t hvq_cp_huff_tab[52] = +{ + 46, 47, 44, 45, 48, 49, 51, 36, 37, 38, 43, 50, 34, 35, 39, 40, 41, 42, 33, 28, 29, 30, 31, 32, 26, 27, + 3, 4, 5, 6, 7, 22, 23, 24, 25, 2, 10, 11, 12, 13, 17, 18, 19, 20, 21, 1, 8, 9, 14, 15, 16, 0 +}; + +/*----------------------------------------------------------------------------------* + * FEC for HQ core + *----------------------------------------------------------------------------------*/ + +const int16_t Num_bands_NB[MAX_SB_NB] = {8,8,2}; + +const float SmoothingWin_NB875[70] = +{ + 0.00000000f,0.00050347f,0.00201285f,0.00452512f,0.00803521f,0.01253604f,0.01801857f,0.02447174f,0.03188256f,0.04023611f, + 0.04951557f,0.05970223f,0.07077560f,0.08271337f,0.09549150f,0.10908426f,0.12346427f,0.13860257f,0.15446869f,0.17103064f, + 0.18825510f,0.20610736f,0.22455151f,0.24355036f,0.26306567f,0.28305814f,0.30348748f,0.32431260f,0.34549150f,0.36698157f, + 0.38873953f,0.41072154f,0.43288338f,0.45518035f,0.47756758f,0.50000000f,0.52243245f,0.54481965f,0.56711662f,0.58927846f, + 0.61126047f,0.63301843f,0.65450847f,0.67568743f,0.69651252f,0.71694189f,0.73693430f,0.75644964f,0.77544850f,0.79389262f, + 0.81174493f,0.82896936f,0.84553134f,0.86139745f,0.87653571f,0.89091575f,0.90450847f,0.91728663f,0.92922437f,0.94029778f, + 0.95048445f,0.95976388f,0.96811742f,0.97552824f,0.98198146f,0.98746395f,0.99196482f,0.99547487f,0.99798715f,0.99949653f +}; + +const float SmoothingWin_NB2[16] = +{ + 0.00000000f,0.00960736f,0.03806023f,0.08426519f,0.14644661f,0.22221488f,0.30865828f,0.40245484f,0.50000000f,0.59754516f, + 0.69134172f,0.77778512f,0.85355339f,0.91573481f,0.96193977f,0.99039264f +}; + +/*----------------------------------------------------------------------------------* + * SC-VBR + *----------------------------------------------------------------------------------*/ + +const float bp1_num_coef_wb[5] = {0.9329833984375,0,-1.865966796875,0,0.9329833984375}; +const float bp1_den_coef_wb[5] = {1,0,-1.8614501953125,0,0.8704833984375}; + +const float shape1_num_coef[11] = +{ + 0.959381103515625f, -0.074554443359375f, -0.4161376953125f, 0.1317138671875f, + -0.3109130859375f, 0.00146484375f, 0.080535888671875f, -0.109100341796875f, + -0.023681640625f, 0.03192138671875f, 0.012176513671875f +}; + +const float shape1_den_coef[11] = +{ + 1, 0.0897216796875f, -0.373443603515625f, 0.123046875f, -0.293243408203125f, + -0.06097412109375f, 0.071258544921875f, -0.1190185546875f, -0.048675537109375f, + 0.026153564453125f, 0.007720947265625f +}; + +const float shape2_num_coef[11] = +{ + 0.938720703125f, 0.000946044921875f, -0.295989990234375f, 0.2904052734375f, + -0.17938232421875f, -0.221221923828125f, -0.3194580078125f, 0.01348876953125f, + 0.10003662109375f, -0.001922607421875f, 0.034027099609375f +}; + +const float shape2_den_coef[11] = +{ + 1, 0.488861083984375f, -0.02716064453125f, 0.390594482421875f, 0.07159423828125f, + -0.213165283203125f, -0.402587890625f, -0.176849365234375f, -0.028961181640625f, + -0.0455322265625f, -0.00927734375f +}; + +const float shape3_num_coef[11] = +{ + 0.936431884765625f, -0.011688232421875f, -0.303253173828125f, -0.293121337890625f, + -0.183013916015625f, 0.232269287109375f, -0.317169189453125f, -0.010833740234375f, + 0.098846435546875f, 0.0003662109375f, 0.0364990234375f +}; + +const float shape3_den_coef[11] = +{ + 1, -0.50347900390625f, -0.027801513671875f, -0.395111083984375f, 0.06976318359375f, + 0.22674560546875f, -0.408477783203125f, 0.18511962890625f, -0.03607177734375f, + 0.0482177734375f, -0.008331298828125f +}; + +const float txlpf1_num_coef[11] = +{ + 0.016845703125, 0.024169921875, 0.062744140625, 0.0831298828125, 0.1124267578125, + 0.11767578125, 0.1124267578125, 0.0831298828125, 0.062744140625, 0.024169921875, + 0.016845703125 +}; + +const float txlpf1_den_coef[11] = +{ + 1, -2.3126220703125, 3.8590087890625, -3.8023681640625, 2.989990234375, + -1.5567626953125, 0.6748046875, -0.17529296875, 0.0423583984375, -0.0030517578125, + 0.00048828125 +}; + +const float txhpf1_num_coef[11] = +{ + 0.016845703125, -0.024169921875, 0.062744140625, -0.0831298828125, 0.1124267578125, + -0.11767578125, 0.1124267578125, -0.0831298828125, 0.062744140625, -0.024169921875, + 0.016845703125 +}; + +const float txhpf1_den_coef[11] = +{ + 1, 2.3126220703125, 3.8590087890625, 3.8023681640625, 2.989990234375, 1.5567626953125, + 0.6748046875, 0.17529296875, 0.0423583984375, 0.0030517578125, 0.00048828125 +}; + +/* NELP filter coefficients */ +const float bp1_num_coef_nb_fx_order7[8] = +{ + 0.180780569293627f, 0.821512462016641f, 1.901786162198923f, 2.798216464912205f, + 2.798216464912205f, 1.901786162198923f, 0.821512462016641f, 0.180780569293627f +}; + +const float bp1_den_coef_nb_fx_order7[8] = +{ + 1.0f, 1.972212566911875f, 2.906981567843655f, 2.667903533650106f, + 1.784691945273023f, 0.807367818229743f, 0.232764318343094f, 0.032669566591295f +}; + + +/* order 8 LPF for nelp frames when non-native sampling freq inputs used with -max_band NB */ +/* used to suppress frequencies above 4kHz present at the output of filters in pre_proc() */ + +const float num_nelp_lp[NELP_LP_ORDER+1] = +{ + 0.088754442436105f, 0.427948705228526f, 1.097120864220837f, 1.834535180016855f, + 2.164546590741725f, 1.833722723336889f, 1.096120298806107f, 0.427341227067866f, 0.088564563680987f +}; + +const float den_nelp_lp[NELP_LP_ORDER+1] = +{ + 1.000000000000000f, 1.076558216566388f, 2.638952788853937f, 1.485213059043660f, + 1.941109655171129f, 0.433697456681428f, 0.488030665133170f, -0.014677457543018f, 0.043067530202687f +}; + + + +/* NELP gain tables */ +const float UVG1CB_WB[UVG1_CBSIZE][2] = +{ + { -0.271424f, -0.258097f, }, + { 1.546157f, 1.503115f, }, + { 0.454480f, 1.182801f, }, + { 2.182661f, 2.194626f, }, + { 0.504902f, 0.481656f, }, + { 1.416585f, 2.597607f, }, + { 1.193427f, 1.140118f, }, + { 2.649107f, 2.640023f, }, + { 0.132870f, 0.204961f, }, + { 1.708137f, 1.672001f, }, + { 1.274749f, 0.636471f, }, + { 2.405026f, 2.403867f, }, + { 0.666233f, 0.649061f, }, + { 2.081430f, 2.065141f, }, + { 1.734086f, 1.037998f, }, + { 2.969951f, 2.962773f, }, + { -0.014392f, -0.034103f, }, + { 1.417866f, 1.814293f, }, + { 0.842041f, 0.798819f, }, + { 2.308757f, 2.275084f, }, + { 0.139464f, 0.831392f, }, + { 1.952503f, 1.961636f, }, + { 0.844903f, 1.609146f, }, + { 2.790210f, 2.775995f, }, + { 0.368318f, 0.275885f, }, + { 1.825159f, 1.830021f, }, + { 0.998048f, 0.987868f, }, + { 2.529417f, 2.508405f, }, + { 0.908356f, 0.289270f, }, + { 2.184707f, 1.707541f, }, + { 1.341007f, 1.338580f, }, + { 3.185808f, 3.172863f, }, +}; + +const float UVG1CB_NB[UVG1_CBSIZE][2] = +{ + { -0.584898f, -0.629564f, }, + { 0.588898f, 0.602697f, }, + { -0.420328f, 0.440621f, }, + { 0.676153f, 1.866763f, }, + { -0.057218f, -0.486523f, }, + { 0.973746f, 0.995785f, }, + { 0.335472f, 0.304245f, }, + { 1.717476f, 1.710655f, }, + { -0.303435f, -0.349463f, }, + { 0.736475f, 0.719210f, }, + { 0.326864f, -0.053863f, }, + { 1.433214f, 1.440908f, }, + { -0.031290f, -0.103346f, }, + { 1.117363f, 1.089082f, }, + { -0.012970f, 0.729895f, }, + { 2.060025f, 2.043535f, }, + { -0.437514f, -0.472825f, }, + { 0.428648f, 1.164362f, }, + { 0.049001f, 0.050772f, }, + { 1.352832f, 1.287837f, }, + { -0.173046f, -0.210522f, }, + { 1.097114f, 0.641427f, }, + { 0.765980f, 0.138765f, }, + { 1.876515f, 1.861232f, }, + { -0.475929f, 0.036795f, }, + { 0.851593f, 0.866113f, }, + { 0.192944f, 0.177338f, }, + { 1.585417f, 1.565396f, }, + { 0.328590f, -0.377592f, }, + { 1.193646f, 1.239326f, }, + { 0.480756f, 0.442872f, }, + { 2.297758f, 2.282144f, }, +}; + +const float UVG2CB1_WB[UVG2_CBSIZE][5] = +{ + { 0.223040f, 0.241651f, 0.363680f, 1.453550f, 0.639043f, }, + { 1.367034f, 1.128134f, 0.995599f, 0.852711f, 0.746318f, }, + { 1.203618f, 0.984239f, 0.732146f, 0.524829f, 0.416474f, }, + { 1.885173f, 0.737643f, 0.440409f, 0.360901f, 0.354375f, }, + { 0.285902f, 0.339404f, 1.683466f, 0.632872f, 0.362779f, }, + { 1.014419f, 1.046733f, 1.076532f, 1.102226f, 1.117500f, }, + { 0.886868f, 0.893899f, 0.901808f, 0.906043f, 0.912148f, }, + { 3.225548f, 1.222902f, 0.637340f, 0.530948f, 0.499932f, }, + { 0.907185f, 0.704885f, 0.549973f, 0.479615f, 0.420607f, }, + { 1.743322f, 1.114901f, 0.838360f, 0.725076f, 0.584914f, }, + { 0.697213f, 0.741751f, 0.795735f, 0.849916f, 0.905532f, }, + { 1.447413f, 1.332714f, 1.201884f, 1.085950f, 0.997001f, }, + { 0.239259f, 0.250031f, 0.378390f, 1.388066f, 1.962520f, }, + { 0.858277f, 1.795467f, 2.537226f, 0.883659f, 0.697253f, }, + { 0.634313f, 0.755069f, 0.874414f, 1.167114f, 1.456359f, }, + { 0.479120f, 2.683769f, 1.225698f, 0.698405f, 0.631620f, }, + { 0.194304f, 0.223532f, 0.246663f, 0.286883f, 1.884711f, }, + { 1.085250f, 1.075760f, 1.060584f, 1.037376f, 1.019217f, }, + { 0.355082f, 1.585122f, 0.637538f, 0.429221f, 0.431000f, }, + { 1.537046f, 1.876537f, 1.162872f, 0.718938f, 0.537773f, }, + { 0.366750f, 0.384063f, 0.462624f, 0.727828f, 1.333889f, }, + { 1.159580f, 1.178847f, 1.198408f, 1.203392f, 1.195077f, }, + { 0.889680f, 0.921507f, 0.957437f, 0.985704f, 1.004871f, }, + { 2.209824f, 1.807385f, 1.465675f, 1.158738f, 0.996400f, }, + { 0.380420f, 0.456231f, 0.569092f, 0.732313f, 0.877647f, }, + { 1.140464f, 1.134349f, 1.126392f, 1.111634f, 1.094200f, }, + { 0.552280f, 0.636810f, 0.771019f, 0.949718f, 1.090795f, }, + { 1.356338f, 1.328390f, 1.665898f, 1.744565f, 1.397443f, }, + { 0.358875f, 0.378330f, 0.492142f, 2.726906f, 0.934503f, }, + { 1.339929f, 1.530712f, 1.653071f, 2.002372f, 2.265826f, }, + { 0.848927f, 0.901721f, 1.004240f, 1.088962f, 1.148716f, }, + { 2.655634f, 4.390627f, 2.488829f, 1.779943f, 0.689514f, }, + { 0.323918f, 0.365752f, 0.360473f, 0.406899f, 0.521889f, }, + { 1.089529f, 1.049556f, 0.999532f, 0.947192f, 0.910775f, }, + { 0.778315f, 0.772521f, 0.770412f, 0.757735f, 0.766615f, }, + { 2.382149f, 1.389184f, 0.821738f, 0.560577f, 0.437522f, }, + { 0.422645f, 0.427987f, 3.028798f, 0.996559f, 0.548607f, }, + { 0.943902f, 0.991288f, 1.222348f, 1.287613f, 1.275699f, }, + { 0.976039f, 0.966009f, 0.952110f, 0.937347f, 0.925149f, }, + { 4.404412f, 2.299179f, 1.359051f, 0.845995f, 0.611213f, }, + { 0.527446f, 0.618156f, 0.706851f, 0.629108f, 0.566558f, }, + { 1.233373f, 1.169295f, 1.096161f, 1.026234f, 0.965180f, }, + { 0.825364f, 0.833740f, 0.844135f, 0.853512f, 0.863188f, }, + { 1.505253f, 1.418813f, 1.328096f, 1.229135f, 1.135295f, }, + { 0.693032f, 0.827423f, 1.234705f, 1.845313f, 2.542454f, }, + { 0.945943f, 1.081860f, 1.265427f, 1.540595f, 1.749407f, }, + { 1.052402f, 1.008307f, 0.871943f, 0.749492f, 2.088583f, }, + { 2.146194f, 2.016499f, 1.782081f, 1.524242f, 1.323508f, }, + { 0.290883f, 0.301913f, 0.334033f, 0.442895f, 2.885471f, }, + { 0.606905f, 1.398622f, 1.501382f, 1.030661f, 0.895216f, }, + { 0.980941f, 0.933889f, 0.878940f, 0.827155f, 0.794956f, }, + { 1.832121f, 1.420187f, 1.218118f, 0.992368f, 0.811142f, }, + { 0.349042f, 0.479090f, 1.353992f, 0.999951f, 1.142766f, }, + { 1.316650f, 1.312876f, 1.299885f, 1.276895f, 1.233464f, }, + { 0.986649f, 0.998506f, 1.008895f, 1.015456f, 1.020661f, }, + { 3.044209f, 2.251119f, 1.400128f, 0.883141f, 0.610713f, }, + { 0.606060f, 0.626282f, 0.675680f, 0.754010f, 0.845070f, }, + { 1.271739f, 1.240164f, 1.197404f, 1.148908f, 1.103891f, }, + { 0.766260f, 0.820830f, 0.890415f, 0.954560f, 1.014693f, }, + { 1.742866f, 1.608286f, 1.450560f, 1.281919f, 1.141203f, }, + { 0.419616f, 0.455676f, 1.951458f, 1.863714f, 0.973334f, }, + { 0.875636f, 1.291339f, 1.924261f, 3.300506f, 3.929508f, }, + { 0.588088f, 0.613937f, 0.671033f, 1.786119f, 1.131808f, }, + { 7.419703f, 4.514918f, 3.368681f, 1.171582f, 0.557291f, }, +}; + +const float UVG2CB2_WB[UVG2_CBSIZE][5] = +{ + { 0.382157f, 0.339570f, 0.399108f, 1.276274f, 0.654653f, }, + { 0.526317f, 0.624477f, 1.514850f, 1.357657f, 0.962890f, }, + { 0.497765f, 0.587492f, 0.755478f, 0.832206f, 0.968825f, }, + { 1.242760f, 1.236637f, 1.218059f, 1.186075f, 1.163104f, }, + { 0.350569f, 0.423863f, 0.687511f, 0.576640f, 0.586036f, }, + { 1.068227f, 1.080389f, 1.090163f, 1.093335f, 1.096811f, }, + { 1.134662f, 0.996393f, 0.866640f, 0.727742f, 0.651101f, }, + { 0.416366f, 0.476179f, 0.898235f, 1.911077f, 2.415833f, }, + { 0.693081f, 0.445820f, 0.352293f, 0.295523f, 0.303834f, }, + { 0.338564f, 0.344193f, 0.431633f, 2.166267f, 1.070002f, }, + { 0.981922f, 0.923891f, 0.870264f, 0.809574f, 0.755981f, }, + { 2.437343f, 1.744939f, 1.275522f, 0.913573f, 0.738923f, }, + { 1.652469f, 0.575451f, 0.373855f, 0.353600f, 0.379997f, }, + { 1.120803f, 1.140296f, 1.155888f, 1.163382f, 1.169191f, }, + { 1.051700f, 1.024805f, 0.989204f, 0.951249f, 0.920163f, }, + { 0.558571f, 0.622568f, 1.201735f, 2.024839f, 3.632277f, }, + { 0.332205f, 0.361342f, 0.368816f, 0.486187f, 2.551270f, }, + { 0.716016f, 0.764423f, 0.901925f, 1.144217f, 1.269692f, }, + { 0.972618f, 0.744037f, 0.605346f, 0.645594f, 1.346183f, }, + { 1.306825f, 1.337871f, 1.339887f, 1.326540f, 1.327383f, }, + { 0.810386f, 0.703444f, 0.617077f, 0.525349f, 0.470428f, }, + { 1.189609f, 1.159137f, 1.117761f, 1.075965f, 1.039311f, }, + { 1.509928f, 1.073290f, 0.915705f, 0.830047f, 0.707661f, }, + { 0.527199f, 1.969524f, 1.839455f, 1.250142f, 0.888607f, }, + { 0.553059f, 2.484691f, 0.928542f, 0.631924f, 0.595981f, }, + { 0.534157f, 0.538470f, 1.048001f, 3.098313f, 1.438832f, }, + { 0.875629f, 0.891265f, 0.918069f, 0.943470f, 0.966723f, }, + { 3.212350f, 2.380788f, 1.750784f, 1.325976f, 1.309454f, }, + { 1.393980f, 1.018875f, 0.714902f, 0.510150f, 0.433226f, }, + { 0.861995f, 0.935236f, 1.133018f, 1.412823f, 1.616763f, }, + { 1.073054f, 1.063390f, 1.045198f, 1.023854f, 1.003573f, }, + { 0.547694f, 0.604539f, 1.419472f, 0.968088f, 6.634663f, }, + { 0.384404f, 0.407015f, 1.841710f, 0.733522f, 0.484417f, }, + { 0.630723f, 0.612993f, 2.852480f, 1.407572f, 1.173696f, }, + { 0.886615f, 0.844153f, 0.800046f, 0.760230f, 0.725250f, }, + { 2.092080f, 1.654743f, 1.432156f, 1.346378f, 1.255149f, }, + { 0.797508f, 0.740916f, 0.717801f, 0.679101f, 0.657052f, }, + { 0.959244f, 1.037313f, 1.117438f, 1.190695f, 1.260351f, }, + { 1.084782f, 1.018723f, 0.943477f, 0.876418f, 0.814781f, }, + { 0.976114f, 1.153683f, 1.398515f, 1.677934f, 1.925023f, }, + { 1.066698f, 0.689574f, 0.546216f, 0.402266f, 0.342894f, }, + { 0.244053f, 0.249520f, 0.360608f, 0.654699f, 3.729612f, }, + { 0.955958f, 0.940178f, 0.919330f, 0.894537f, 0.876740f, }, + { 3.224046f, 1.094907f, 0.788658f, 0.951478f, 0.890611f, }, + { 2.441966f, 0.858237f, 0.584262f, 0.545170f, 0.539909f, }, + { 1.123818f, 1.180721f, 1.238015f, 1.283992f, 1.321097f, }, + { 0.956697f, 0.985042f, 1.019696f, 1.050902f, 1.078825f, }, + { 0.743688f, 2.034202f, 4.022331f, 2.727508f, 2.650772f, }, + { 0.250845f, 0.245822f, 0.291984f, 0.385336f, 1.449503f, }, + { 0.461815f, 0.591238f, 0.787875f, 0.956948f, 1.806615f, }, + { 0.875089f, 0.862359f, 0.856436f, 0.847061f, 0.839057f, }, + { 1.309442f, 1.502701f, 1.661279f, 1.673280f, 1.662961f, }, + { 0.985927f, 0.857309f, 0.739752f, 0.643488f, 0.569376f, }, + { 1.650427f, 1.495147f, 1.278185f, 1.049539f, 0.900202f, }, + { 1.006963f, 1.593657f, 0.993154f, 0.790603f, 0.850326f, }, + { 1.225572f, 1.441567f, 1.728901f, 2.088278f, 2.349483f, }, + { 0.341446f, 1.432559f, 0.749195f, 0.421280f, 0.404079f, }, + { 1.145314f, 1.033705f, 0.970105f, 0.917177f, 2.347552f, }, + { 0.971156f, 0.977194f, 0.977277f, 0.972506f, 0.966892f, }, + { 0.513513f, 4.115618f, 2.258778f, 1.186578f, 1.154071f, }, + { 1.963588f, 1.292572f, 0.969148f, 0.756260f, 0.630658f, }, + { 1.142688f, 1.247234f, 1.361439f, 1.456244f, 1.531956f, }, + { 1.188195f, 1.119173f, 1.043934f, 0.966349f, 0.898995f, }, + { 0.296171f, 0.760591f, 1.599661f, 5.561118f, 5.121441f, }, +}; + + +const float UVG2CB1_NB[UVG2_CBSIZE][5] = +{ + { 0.188739f, 0.191757f, 0.191531f, 0.191578f, 0.209839f, }, + { 0.869071f, 0.859505f, 0.832542f, 0.797074f, 0.773080f, }, + { 0.431109f, 0.727906f, 2.508026f, 0.925174f, 0.548901f, }, + { 1.217337f, 1.160289f, 1.097694f, 1.018471f, 0.957574f, }, + { 0.497102f, 0.495688f, 0.490534f, 0.481662f, 0.463058f, }, + { 0.803575f, 0.867673f, 0.944431f, 1.007241f, 1.060698f, }, + { 0.783034f, 0.762224f, 0.738827f, 0.711210f, 0.682893f, }, + { 3.227538f, 1.670940f, 0.968417f, 0.670516f, 0.602001f, }, + { 0.379041f, 0.397159f, 0.339889f, 0.431105f, 0.898154f, }, + { 1.313227f, 1.132838f, 0.938410f, 0.794448f, 0.643291f, }, + { 0.390638f, 0.395881f, 0.593166f, 2.306134f, 1.028762f, }, + { 1.248727f, 1.269418f, 1.296714f, 1.309796f, 1.304405f, }, + { 1.520874f, 0.734382f, 0.485483f, 0.396077f, 0.389855f, }, + { 0.421502f, 0.516180f, 1.720254f, 1.504402f, 1.050148f, }, + { 0.245081f, 0.257874f, 0.449391f, 1.466236f, 1.733604f, }, + { 1.559619f, 2.358229f, 1.100964f, 0.677191f, 0.515930f, }, + { 0.258870f, 0.281444f, 0.341911f, 0.423056f, 0.517793f, }, + { 0.841801f, 0.860159f, 0.881827f, 0.899050f, 0.920338f, }, + { 0.365189f, 0.499345f, 0.710492f, 0.869768f, 0.990808f, }, + { 1.078960f, 1.121199f, 1.170587f, 1.201313f, 1.215423f, }, + { 0.343519f, 1.297406f, 0.680773f, 0.408835f, 0.329668f, }, + { 1.027852f, 1.031491f, 1.031891f, 1.021937f, 1.017812f, }, + { 0.548592f, 2.012860f, 1.072282f, 0.615844f, 0.417353f, }, + { 1.760444f, 1.645651f, 1.491751f, 1.317721f, 1.142677f, }, + { 0.879361f, 0.558186f, 0.385066f, 0.300063f, 0.280186f, }, + { 1.629306f, 1.276033f, 0.873148f, 0.597645f, 0.464031f, }, + { 0.233010f, 0.252664f, 0.263381f, 0.410771f, 2.333462f, }, + { 0.979199f, 1.428996f, 2.192152f, 1.742747f, 1.094684f, }, + { 0.679754f, 0.659549f, 0.643852f, 0.621674f, 0.603191f, }, + { 1.077752f, 0.992367f, 1.129539f, 1.027383f, 2.264297f, }, + { 0.676422f, 0.735375f, 0.819505f, 0.911898f, 0.992613f, }, + { 4.819767f, 2.100243f, 0.962614f, 0.621495f, 0.509149f, }, + { 0.276365f, 0.274270f, 0.270315f, 0.266915f, 0.271854f, }, + { 0.955282f, 0.937005f, 0.911375f, 0.886292f, 0.866125f, }, + { 0.231384f, 0.382150f, 1.480144f, 0.647910f, 0.407074f, }, + { 1.503587f, 1.359087f, 1.192322f, 1.035379f, 0.920358f, }, + { 0.225897f, 0.284201f, 0.386850f, 1.479923f, 0.754288f, }, + { 0.932117f, 0.985694f, 1.055295f, 1.107535f, 1.153749f, }, + { 1.047555f, 0.950740f, 0.840054f, 0.733910f, 0.667261f, }, + { 2.085890f, 1.583746f, 1.211518f, 0.930697f, 0.725212f, }, + { 0.425680f, 0.429169f, 0.415950f, 0.398797f, 0.384700f, }, + { 1.078194f, 1.039819f, 0.987399f, 0.930104f, 0.885793f, }, + { 0.468506f, 0.527117f, 0.811323f, 3.412384f, 1.928112f, }, + { 1.453081f, 1.399223f, 1.322881f, 1.235534f, 1.155194f, }, + { 0.677564f, 0.686571f, 0.612173f, 0.620178f, 1.607781f, }, + { 0.838759f, 0.966836f, 1.138047f, 1.458807f, 1.531620f, }, + { 0.752352f, 0.769151f, 0.792542f, 0.814617f, 0.830990f, }, + { 0.998295f, 3.910764f, 2.022774f, 1.004988f, 0.660092f, }, + { 0.346421f, 0.347923f, 0.341870f, 0.334828f, 0.332826f, }, + { 0.933744f, 0.949722f, 0.965032f, 0.974951f, 0.980120f, }, + { 0.609754f, 0.656553f, 0.694920f, 0.735124f, 0.784513f, }, + { 1.250595f, 1.226482f, 1.191682f, 1.145255f, 1.104473f, }, + { 0.557881f, 0.567717f, 0.565744f, 0.564657f, 0.554475f, }, + { 1.096985f, 1.105627f, 1.102877f, 1.093358f, 1.084804f, }, + { 2.230968f, 0.968956f, 0.615720f, 0.542594f, 0.589697f, }, + { 2.443527f, 2.128707f, 1.780354f, 1.424964f, 1.106474f, }, + { 0.202766f, 0.221654f, 0.253737f, 0.404291f, 1.663403f, }, + { 0.505346f, 1.337503f, 1.263272f, 0.954743f, 0.901882f, }, + { 0.385023f, 0.382150f, 0.399218f, 0.630553f, 3.211494f, }, + { 1.364681f, 1.413025f, 1.445785f, 1.648508f, 1.724301f, }, + { 0.991474f, 0.853670f, 0.661673f, 0.512336f, 0.418893f, }, + { 0.671308f, 0.761259f, 4.046266f, 1.926581f, 0.891469f, }, + { 0.634219f, 0.750043f, 0.930049f, 1.197664f, 1.262605f, }, + { 3.747086f, 2.672835f, 1.889530f, 1.215477f, 0.841197f, }, +}; + +const float UVG2CB2_NB[UVG2_CBSIZE][5]= +{ + { 0.234676f, 0.211553f, 0.198300f, 0.188137f, 0.189102f, }, + { 0.621072f, 0.655881f, 0.734889f, 0.880212f, 1.232321f, }, + { 0.372062f, 0.443795f, 0.705281f, 0.739519f, 0.743747f, }, + { 1.024051f, 1.049997f, 1.079370f, 1.098001f, 1.118202f, }, + { 0.494519f, 0.485721f, 0.479727f, 0.474381f, 0.473326f, }, + { 1.059136f, 1.014755f, 0.967436f, 0.915428f, 0.876510f, }, + { 1.887753f, 0.709034f, 0.440367f, 0.343384f, 0.369381f, }, + { 0.393820f, 0.574466f, 2.762395f, 1.407229f, 1.047606f, }, + { 0.370772f, 0.356840f, 0.349999f, 0.327343f, 0.316005f, }, + { 0.397170f, 0.417453f, 0.528104f, 2.356989f, 1.370805f, }, + { 0.566954f, 1.780471f, 0.793633f, 0.493204f, 0.504320f, }, + { 1.212718f, 1.247958f, 1.263151f, 1.270187f, 1.276770f, }, + { 0.388100f, 0.353795f, 0.474245f, 1.451972f, 0.869892f, }, + { 1.891456f, 1.262146f, 0.797925f, 0.583916f, 0.508257f, }, + { 0.969344f, 0.868915f, 0.772349f, 0.677308f, 0.608680f, }, + { 0.486474f, 0.539484f, 0.782305f, 0.907366f, 5.745668f, }, + { 0.289328f, 0.301705f, 0.347406f, 0.516255f, 1.165024f, }, + { 0.960737f, 0.937409f, 0.906673f, 0.874736f, 0.848802f, }, + { 0.400429f, 0.378419f, 0.439385f, 0.636950f, 2.656142f, }, + { 0.992977f, 1.083218f, 1.174551f, 1.247095f, 1.351591f, }, + { 0.359381f, 0.333729f, 0.374249f, 0.520426f, 1.795028f, }, + { 1.052276f, 1.045824f, 1.029194f, 1.005147f, 0.990365f, }, + { 2.640896f, 1.119783f, 0.637471f, 0.504513f, 0.497219f, }, + { 0.510018f, 0.592500f, 1.147016f, 3.572948f, 1.835225f, }, + { 0.617425f, 0.380988f, 0.295255f, 0.238370f, 0.230673f, }, + { 0.709915f, 0.749521f, 0.990016f, 1.431043f, 1.574221f, }, + { 0.653333f, 0.698564f, 0.760571f, 0.804532f, 0.831992f, }, + { 0.715875f, 3.498556f, 1.594958f, 0.912733f, 0.845138f, }, + { 0.898701f, 0.751704f, 0.624648f, 0.525250f, 0.464610f, }, + { 1.375977f, 1.297850f, 1.215381f, 1.145089f, 1.080297f, }, + { 0.561123f, 1.764692f, 1.703012f, 1.037951f, 0.817155f, }, + { 0.611282f, 0.835322f, 1.656358f, 2.071091f, 3.677700f, }, + { 0.305955f, 0.288104f, 0.277282f, 0.266999f, 0.262681f, }, + { 0.842437f, 0.860463f, 0.878879f, 0.890085f, 0.905076f, }, + { 0.415168f, 0.495616f, 1.605015f, 1.158622f, 1.086554f, }, + { 1.144592f, 1.160015f, 1.162718f, 1.153999f, 1.152784f, }, + { 0.726849f, 0.577021f, 0.459744f, 0.381537f, 0.341456f, }, + { 1.240211f, 1.143782f, 1.043599f, 0.936329f, 0.857727f, }, + { 1.329362f, 0.934539f, 0.696166f, 0.547436f, 0.475481f, }, + { 0.470979f, 1.229760f, 4.335935f, 2.037582f, 1.538102f, }, + { 0.448859f, 0.435001f, 0.410153f, 0.387131f, 0.374390f, }, + { 0.753476f, 0.847563f, 0.984091f, 1.208422f, 2.367011f, }, + { 0.781083f, 0.745169f, 0.707134f, 0.671579f, 0.640062f, }, + { 1.421280f, 1.411590f, 1.398311f, 1.358993f, 1.337416f, }, + { 0.377859f, 0.545381f, 1.647399f, 0.625545f, 0.420396f, }, + { 1.635438f, 1.273369f, 1.092522f, 0.862149f, 0.739370f, }, + { 0.921246f, 0.885689f, 0.844748f, 0.800456f, 0.770371f, }, + { 0.385947f, 0.408195f, 0.715197f, 4.936704f, 4.011602f, }, + { 0.295343f, 0.296573f, 0.339012f, 0.409703f, 0.531531f, }, + { 0.943088f, 0.948849f, 0.961247f, 0.966943f, 0.973872f, }, + { 0.376239f, 0.425963f, 0.446486f, 0.849370f, 3.799501f, }, + { 1.085015f, 1.208963f, 1.360517f, 1.478597f, 1.597861f, }, + { 0.600520f, 0.585154f, 0.557646f, 0.520820f, 0.498211f, }, + { 1.173770f, 1.141539f, 1.096824f, 1.055073f, 1.028510f, }, + { 3.669747f, 1.622178f, 0.809242f, 0.707943f, 0.704413f, }, + { 0.977405f, 1.162230f, 1.695878f, 2.019914f, 2.051052f, }, + { 1.221003f, 0.609077f, 0.389066f, 0.326390f, 0.333196f, }, + { 0.836930f, 0.904878f, 0.994299f, 1.088050f, 1.140088f, }, + { 0.812087f, 0.799997f, 0.786734f, 0.767023f, 0.753822f, }, + { 1.504493f, 1.542127f, 1.585432f, 1.577024f, 1.594146f, }, + { 0.649261f, 0.634440f, 0.619454f, 0.606033f, 0.621463f, }, + { 2.088260f, 1.685051f, 1.277621f, 1.004769f, 0.891082f, }, + { 1.133569f, 1.000746f, 0.882781f, 0.781417f, 0.706843f, }, + { 2.340990f, 6.501577f, 3.762808f, 3.059604f, 2.127793f, }, +}; + +const float frac_4sf[NB_SUBFR+2] = {0.25f,0.5f,0.75f,1.0f,1.0f,1.0f}; + +/* ERB table for PPP-ampl-quant */ +const float erb_WB[NUM_ERB_WB+1] = {0.0f, 92.8061f, 185.6121f, 278.4182f, 371.2243f, 464.0304f, 556.8364f, 649.6425f, 746.4f, 853.6f, + 972.5f, 1104.0f, 1251.8f, 1415.8f, 1599.2f, 1804.6f, 2035.2f, 2294.9f, 2588.4f, 2921.2f, 3300.1f, + 3733.7f, 4400.0f, 5300.0f, 6400.0f+1 + }; + +/* ERB table for PPP-ampl-quant */ +const float erb_NB[NUM_ERB_NB+1] = {0.0f, 92.8061f, 185.6121f, 278.4182f, 371.2243f, 464.0304f, 556.8364f, 649.6425f, 746.4f, 853.6f, + 972.5f, 1104.0f, 1251.8f, 1415.8f, 1599.2f, 1804.6f, 2035.2f, 2294.9f, 2588.4f, 2921.2f, 3300.1f, + 3733.7f, 4000.0f+1.0f + }; + + + + +/*Amplitude and power tables for PPP*/ + + +const float AmpCB1_WB[64][10] = +{ + { 0.6903076f, 0.1939697f, -0.0797119f, 0.4355469f, -0.3873291f, -0.2260742f, -0.3911133f, -0.5643311f, -0.2563477f, -0.6229248f, }, + { -0.1126709f, -0.0081787f, -0.8730469f, -0.6052246f, -0.2464600f, -0.2209473f, -1.0415039f, -0.0791016f, 0.8033447f, 0.9818115f, }, + { 0.0195313f, 0.0949707f, -0.1873779f, 0.1053467f, 0.6691895f, 0.2043457f, -0.4365234f, 0.0150146f, -0.3861084f, -0.4388428f, }, + { -0.1040039f, -0.0064697f, -0.1318359f, -0.3275146f, -0.3905029f, -0.1159668f, -0.1651611f, 0.7639160f, -0.1746826f, 0.1524658f, }, + { 0.2513428f, 0.0826416f, 0.0178223f, 0.1234131f, 0.1166992f, -0.2468262f, -0.0030518f, 0.0366211f, 0.0513916f, -0.7152100f, }, + { 0.1253662f, -0.0551758f, -0.8963623f, -0.1284180f, 0.4660645f, 0.1341553f, -0.1226807f, 0.0804443f, -0.0623779f, -0.0803223f, }, + { 0.2552490f, 0.0878906f, -0.0732422f, 0.0177002f, -0.1835938f, -0.2094727f, -0.0539551f, -0.2651367f, -0.1837158f, 0.3298340f, }, + { 0.0892334f, 0.1798096f, -0.0260010f, -0.5029297f, -0.3632813f, 0.0839844f, 0.3912354f, 0.1480713f, 0.0828857f, 0.0283203f, }, + { 0.4482422f, 0.5822754f, -0.1462402f, -0.0363770f, -0.2092285f, -0.4478760f, -0.3458252f, -0.0810547f, -0.2269287f, -0.2905273f, }, + { -0.1427002f, -0.1944580f, -0.0552979f, 0.0360107f, -0.1495361f, -0.3796387f, -0.2167969f, 0.2578125f, 0.3308105f, 0.4068604f, }, + { 0.1247559f, 0.1523438f, 0.1331787f, 0.1420898f, 0.1464844f, 0.2175293f, -0.0987549f, -0.2814941f, -0.3813477f, -0.2678223f, }, + { -0.1912842f, 0.0567627f, 0.2713623f, -0.1588135f, -0.0565186f, -0.2633057f, 0.0889893f, 0.2781982f, -0.2365723f, 0.0744629f, }, + { 0.0533447f, -0.0980225f, -0.1251221f, 0.0946045f, -0.0208740f, -0.0777588f, 0.0198975f, 0.2747803f, 0.0385742f, -0.2030029f, }, + { -0.5032959f, -0.0024414f, -0.3450928f, -0.1866455f, -0.1752930f, 0.4207764f, 0.0096436f, -0.0334473f, 0.2014160f, 0.5001221f, }, + { 0.2891846f, 0.1131592f, 0.0546875f, -0.0548096f, 0.0357666f, -0.0291748f, -0.1254883f, -0.5865479f, 0.1652832f, 0.0526123f, }, + { -0.2708740f, -0.0598145f, -0.4698486f, 0.2000732f, -0.3570557f, 0.0997314f, 0.1812744f, 0.3084717f, 0.6645508f, -0.2434082f, }, + { 0.1801758f, 0.0617676f, -0.2005615f, 0.2445068f, -0.2045898f, -0.0961914f, -0.2052002f, -0.2454834f, 0.1695557f, 0.0551758f, }, + { 0.0723877f, 0.0003662f, -0.1464844f, -0.4866943f, -0.1994629f, -0.5261230f, -0.0837402f, 0.1076660f, 0.7611084f, 0.2954102f, }, + { -0.0239258f, -0.1534424f, -0.2487793f, -0.0607910f, 0.1701660f, 0.0819092f, -0.2810059f, -0.0987549f, -0.0544434f, 0.4448242f, }, + { -0.2005615f, -0.2812500f, -0.1010742f, 0.0128174f, -0.0394287f, -0.4768066f, -0.1171875f, 0.8940430f, 0.3778076f, -0.0959473f, }, + { 0.0115967f, 0.0772705f, 0.1545410f, 0.0915527f, 0.1842041f, -0.2481689f, -0.3825684f, 0.0527344f, 0.1254883f, -0.2227783f, }, + { 0.1535645f, 0.0312500f, -0.3966064f, -0.8383789f, -0.0638428f, -0.0396729f, -0.2171631f, 0.5264893f, 0.3081055f, 0.4190674f, }, + { -0.0732422f, -0.0500488f, -0.0107422f, 0.0500488f, -0.1442871f, -0.1391602f, -0.1767578f, -0.1640625f, -0.6193848f, 0.7390137f, }, + { 0.2678223f, 0.1837158f, -0.0831299f, -0.2939453f, 0.1679688f, 0.1695557f, 0.1475830f, 0.1279297f, -0.5125732f, -0.3587646f, }, + { 0.2264404f, 0.2128906f, -0.1640625f, -0.1746826f, -0.2386475f, -0.2203369f, -0.6093750f, 0.0625000f, 0.0761719f, 0.3355713f, }, + { -0.4206543f, -0.1483154f, -0.4594727f, -0.2647705f, -0.4395752f, -0.1612549f, 0.0081787f, 0.5280762f, 0.8085938f, 0.7099609f, }, + { -0.0407715f, -0.2131348f, -0.0538330f, -0.0920410f, 0.2261963f, 0.4747314f, -0.0726318f, -0.0601807f, 0.0538330f, -0.0989990f, }, + { -0.0058594f, -0.0932617f, -0.1798096f, -0.0833740f, 0.0736084f, -0.2141113f, 0.0952148f, 0.0852051f, 0.1323242f, 0.2091064f, }, + { 0.0683594f, -0.0986328f, -0.0920410f, -0.3527832f, -0.1470947f, -0.0388184f, -0.1246338f, 0.3900146f, 0.6949463f, -0.5618896f, }, + { 0.1639404f, -0.1295166f, -0.2979736f, -0.2177734f, 0.0880127f, 0.0325928f, 0.0277100f, -0.0759277f, 0.3677979f, -0.0937500f, }, + { -0.0576172f, 0.0109863f, 0.0015869f, 0.0354004f, 0.1287842f, 0.1157227f, 0.1973877f, -0.2890625f, -0.1326904f, 0.1346436f, }, + { -0.5839844f, -0.4726563f, 0.6256104f, -0.3073730f, -0.0262451f, 0.8498535f, 0.1336670f, -0.1856689f, 0.2552490f, -0.3615723f, }, + { 0.2789307f, 0.1363525f, 0.1433105f, 0.3216553f, -0.2327881f, -0.1235352f, 0.0993652f, -0.0509033f, -0.2639160f, -0.3424072f, }, + { -0.1450195f, -0.0863037f, -0.0986328f, -0.2144775f, 0.0317383f, -0.1334229f, -0.4830322f, -0.3986816f, 0.5043945f, 0.7299805f, }, + { 0.0216064f, -0.1804199f, 0.1171875f, 0.2476807f, 0.4869385f, 0.0728760f, -0.3737793f, -0.4809570f, -0.2060547f, 0.0288086f, }, + { -0.1903076f, 0.0183105f, 0.2968750f, 0.0424805f, -0.0295410f, -0.2458496f, -0.1253662f, 0.7687988f, -0.3609619f, -0.4833984f, }, + { 0.1330566f, 0.1237793f, -0.1539307f, -0.0908203f, -0.1164551f, -0.1145020f, -0.4532471f, -0.3994141f, 0.6538086f, -0.2875977f, }, + { -0.1756592f, 0.4648438f, -0.2844238f, -0.5416260f, 0.6319580f, -0.4401855f, -0.1687012f, 0.2226563f, 0.0496826f, 0.0396729f, }, + { 0.0792236f, 0.0402832f, 0.0103760f, 0.0251465f, -0.0506592f, 0.0223389f, -0.0788574f, 0.0734863f, -0.3242188f, 0.0986328f, }, + { 0.1268311f, 0.0035400f, -0.3908691f, -0.7529297f, -0.4443359f, 0.4560547f, 0.5106201f, 0.4832764f, 0.0402832f, 0.0413818f, }, + { 0.3297119f, 0.0418701f, 0.1832275f, 0.2293701f, -0.3898926f, -0.5673828f, -0.1989746f, 0.2021484f, -0.1926270f, -0.0102539f, }, + { -0.3741455f, -0.5036621f, 0.0029297f, -0.0317383f, 0.0321045f, -0.2081299f, -0.1573486f, 0.2968750f, 0.1500244f, 0.9132080f, }, + { 0.3156738f, 0.2070313f, 0.0788574f, -0.2164307f, -0.0966797f, 0.2358398f, -0.2329102f, -0.2315674f, -0.1378174f, 0.0136719f, }, + { -0.6917725f, -0.1943359f, 0.2750244f, -0.1196289f, 0.1929932f, 0.0257568f, 0.6441650f, 0.5915527f, -0.0351563f, -0.0194092f, }, + { 0.1166992f, 0.1459961f, 0.0941162f, -0.1187744f, -0.2178955f, -0.0629883f, -0.1239014f, 0.1033936f, 0.0749512f, -0.0965576f, }, + { -0.0539551f, -0.1945801f, -0.5654297f, -0.5361328f, -0.0507813f, 0.1706543f, 0.3137207f, 0.0917969f, 0.0322266f, 0.8020020f, }, + { 0.2020264f, 0.0666504f, 0.1511230f, -0.1662598f, -0.1623535f, -0.2447510f, 0.4382324f, -0.2630615f, -0.0224609f, -0.1494141f, }, + { -0.1772461f, -0.1871338f, -0.0651855f, 0.1232910f, -0.2083740f, 0.0977783f, 0.4428711f, -0.0352783f, 0.2946777f, 0.0161133f, }, + { 0.3226318f, -0.3433838f, -0.5522461f, 0.6215820f, -0.8986816f, 0.0903320f, 0.0522461f, -0.0622559f, 0.0098877f, -0.1475830f, }, + { 0.0751953f, 0.1774902f, 0.2271729f, -0.4831543f, -0.4985352f, 0.0230713f, -0.1488037f, -0.1068115f, 0.4594727f, 0.2546387f, }, + { -0.1896973f, -0.2528076f, 0.1849365f, 0.4140625f, 0.0014648f, -0.0837402f, -0.2946777f, -0.1687012f, 0.0214844f, 0.2056885f, }, + { 0.2508545f, -0.6955566f, 0.1931152f, 0.5025635f, -0.5915527f, -0.3566895f, 0.0744629f, 0.2541504f, 0.5715332f, -0.3035889f, }, + { 0.0424805f, 0.2756348f, -0.0412598f, -0.1683350f, 0.1796875f, 0.0754395f, -0.0246582f, -0.1369629f, -0.0092773f, -0.3012695f, }, + { -0.1484375f, -0.1203613f, -0.0399170f, -0.1759033f, 0.0124512f, 0.0491943f, -0.2569580f, 0.2943115f, 0.1843262f, 0.1572266f, }, + { -0.0872803f, -0.0704346f, 0.1311035f, 0.3092041f, -0.4298096f, -0.4210205f, 0.2612305f, -0.0916748f, -0.0374756f, 0.4644775f, }, + { 0.0192871f, -0.1690674f, -0.0493164f, -0.1682129f, -0.2377930f, 0.4620361f, 0.5146484f, 0.3255615f, -0.2312012f, -0.1903076f, }, + { 0.1265869f, 0.1673584f, 0.1207275f, -0.0250244f, -0.0406494f, -0.5839844f, -0.4185791f, -0.1566162f, 0.4027100f, 0.1048584f, }, + { -0.6008301f, -0.6690674f, -0.1459961f, -0.2133789f, -0.0878906f, 0.0629883f, 0.0137939f, 0.5603027f, 0.8631592f, 0.5303955f, }, + { -0.6993408f, -0.4714355f, 0.4382324f, 0.1785889f, 0.8659668f, 0.6092529f, 0.1042480f, -0.0080566f, -0.1989746f, -0.0837402f, }, + { -0.1126709f, -0.3986816f, -0.2426758f, 0.2862549f, 0.0958252f, -0.1733398f, 0.3666992f, 0.3581543f, -0.1519775f, -0.0079346f, }, + { -0.3291016f, -0.3769531f, -0.1755371f, 0.0749512f, 0.1933594f, -0.0291748f, -0.1894531f, 0.0708008f, 0.7672119f, -0.2042236f, }, + { -0.1950684f, -0.4904785f, -0.2330322f, 0.0911865f, 0.3895264f, 0.0446777f, 0.1790771f, -0.2359619f, 0.3367920f, 0.3422852f, }, + { 0.0632324f, 0.0235596f, -0.1402588f, -0.3793945f, 0.0538330f, 0.1779785f, 0.3406982f, -0.5042725f, 0.3288574f, 0.4116211f, }, + { -0.6131592f, -0.7923584f, 0.2189941f, 0.3343506f, 0.1785889f, 0.7132568f, 0.3502197f, 0.2432861f, -0.1719971f, 0.5898438f, }, +}; + +const float AmpCB2_WB[64][NUM_ERB_WB-11] = +{ + { -0.6440430f, -0.9412842f, -0.4294434f, -0.2949219f, -0.0466309f, 0.0389404f, -0.2319336f, -0.1098633f, 0.2105713f, 0.1079102f, 0.4969482f, }, + { -0.4946289f, -0.2966309f, -0.0410156f, 0.2607422f, 0.3669434f, 0.0721436f, -0.4752197f, -0.3333740f, 0.3204346f, 0.2917480f, -0.1278076f, }, + { -0.1077881f, -0.4111328f, -0.5169678f, -0.4548340f, 0.0230713f, -0.2200928f, 0.0957031f, 0.2851563f, 0.0251465f, -0.2612305f, 0.3663330f, }, + { -0.0891113f, -0.2781982f, 0.0103760f, -0.4144287f, 0.5330811f, 0.2702637f, -0.0310059f, -0.3801270f, -0.2866211f, 0.3372803f, 0.0837402f, }, + { -0.9149170f, -0.8078613f, 0.3862305f, -0.4830322f, -0.3272705f, -0.2501221f, 0.2025146f, 0.4436035f, 0.3615723f, 0.1921387f, 0.0462646f, }, + { -0.3024902f, 0.3492432f, 0.0751953f, 0.1372070f, 0.0250244f, -0.3753662f, -0.0424805f, -0.2448730f, -0.0109863f, 0.0928955f, 0.1412354f, }, + { -0.0139160f, -1.1547852f, -0.3400879f, -0.3972168f, -0.1367188f, -0.1831055f, -0.0544434f, 0.3460693f, -0.0383301f, 0.3912354f, 0.2581787f, }, + { -0.1021729f, -0.0318604f, 0.0043945f, 0.0097656f, -0.0592041f, 0.1383057f, 0.2592773f, -0.1258545f, -0.0489502f, -0.3864746f, 0.1397705f, }, + { -0.1972656f, -0.4180908f, -0.3748779f, -0.8411865f, -0.5124512f, 0.2797852f, 0.6298828f, -0.0056152f, 0.1745605f, 0.0341797f, 0.1682129f, }, + { 0.2075195f, -0.2042236f, -0.1374512f, 0.6433105f, 0.6220703f, -0.1190186f, -0.1306152f, 0.1604004f, -0.2916260f, -0.3640137f, 0.0024414f, }, + { -0.3928223f, -0.1088867f, -0.0776367f, -0.1069336f, -0.0368652f, -0.3568115f, -0.3955078f, 0.5030518f, 0.1983643f, -0.0679932f, 0.1213379f, }, + { 0.0664063f, 0.3243408f, 0.8707275f, -0.0333252f, -0.4309082f, -0.1732178f, 0.1746826f, -0.1142578f, -0.3200684f, 0.0369873f, 0.0091553f, }, + { -0.6645508f, -0.6773682f, 0.5106201f, 0.1523438f, 0.4240723f, -0.0963135f, 0.2899170f, -0.2170410f, 0.2026367f, 0.1855469f, -0.1749268f, }, + { -0.4940186f, 0.0648193f, 0.8546143f, 0.0848389f, 0.2305908f, 0.5201416f, -0.3406982f, -0.1900635f, -0.3637695f, -0.0385742f, 0.0506592f, }, + { 0.1384277f, 0.1832275f, -0.8450928f, 0.0635986f, -0.3825684f, -0.2211914f, 0.2255859f, 0.0825195f, -0.2115479f, 0.0895996f, 0.2694092f, }, + { 0.2476807f, -0.0581055f, -0.2412109f, -0.0196533f, 0.0035400f, 0.8724365f, -0.2165527f, 0.0878906f, -0.1306152f, -0.0454102f, -0.1984863f, }, + { -0.7901611f, -0.2988281f, -0.6390381f, -0.3236084f, -0.2197266f, -0.1802979f, -0.0936279f, 0.1629639f, 0.0574951f, 0.5928955f, 0.1083984f, }, + { 0.0723877f, -0.0451660f, 0.0239258f, 0.1107178f, 0.0212402f, 0.0679932f, -0.0878906f, -0.1634521f, 0.1940918f, 0.0045166f, -0.1522217f, }, + { -0.1595459f, 0.0336914f, -0.2122803f, -0.7363281f, -0.3769531f, -0.3050537f, -0.0606689f, -0.0479736f, -0.0694580f, 0.3665771f, 0.3288574f, }, + { 0.4578857f, 0.5678711f, -0.0314941f, -0.1593018f, 0.0213623f, 0.0230713f, -0.0419922f, -0.2906494f, -0.2431641f, 0.0565186f, 0.0645752f, }, + { -0.7781982f, 0.4841309f, -0.4343262f, -0.3663330f, -0.0781250f, 0.3804932f, 0.1367188f, 0.1179199f, 0.1606445f, -0.0684814f, 0.0032959f, }, + { 0.3410645f, 0.3455811f, 0.4287109f, 0.4215088f, -0.0510254f, -0.2830811f, -0.8228760f, -0.4202881f, 0.0097656f, 0.1563721f, 0.2064209f, }, + { 0.1831055f, -0.0721436f, -0.0902100f, 0.2911377f, -0.5708008f, -0.7106934f, -0.1754150f, 0.0891113f, 0.4385986f, -0.0533447f, 0.1330566f, }, + { 0.4268799f, -0.2358398f, 0.3483887f, 0.5930176f, 0.3239746f, 0.1156006f, 0.2293701f, -0.5023193f, 0.3295898f, -0.3774414f, -0.1860352f, }, + { 0.0274658f, -1.0097656f, -0.8222656f, -0.1558838f, 0.3651123f, 0.3641357f, 0.1378174f, -0.2027588f, 0.3438721f, 0.0571289f, 0.0599365f, }, + { -0.0908203f, 0.0476074f, 0.0826416f, 0.9923096f, -0.3820801f, -0.0838623f, -0.0528564f, 0.1816406f, -0.4593506f, -0.0216064f, -0.0709229f, }, + { -0.0932617f, 0.0047607f, 0.1876221f, -0.2689209f, -0.2048340f, 0.0321045f, -0.1481934f, 0.2655029f, -0.2266846f, 0.3780518f, -0.1091309f, }, + { 0.5135498f, -0.2371826f, -0.1018066f, 0.1846924f, -0.5032959f, 0.4859619f, 0.7374268f, 0.0797119f, -0.0924072f, -0.0382080f, -0.3691406f, }, + { -0.5632324f, -0.3831787f, -0.3620605f, 0.0217285f, 0.6049805f, -0.0521240f, -0.0050049f, 0.2900391f, 0.1230469f, -0.1649170f, -0.0112305f, }, + { 0.1193848f, 0.2438965f, 0.6281738f, 0.2525635f, 0.0142822f, -0.2141113f, -0.3364258f, 0.5401611f, 0.0205078f, -0.2205811f, -0.2149658f, }, + { -0.1483154f, 0.0217285f, -0.1906738f, -0.4112549f, -0.1121826f, -0.3144531f, 0.4411621f, 0.6064453f, -0.0036621f, -0.0483398f, -0.1405029f, }, + { -0.1398926f, 0.1059570f, 0.1309814f, -0.0438232f, 0.3334961f, 0.0666504f, 0.5408936f, -0.0391846f, -0.1319580f, 0.1721191f, -0.3923340f, }, + { -0.2827148f, -0.5968018f, -0.3002930f, -0.4692383f, -0.8939209f, -0.1755371f, -0.1816406f, 0.2257080f, 0.4927979f, 0.2955322f, 0.3292236f, }, + { -0.2895508f, -0.2291260f, 0.0817871f, 0.4484863f, -0.1107178f, 0.1083984f, -0.4520264f, 0.0457764f, -0.1560059f, -0.1802979f, 0.3052979f, }, + { -0.1142578f, -0.2053223f, -0.1651611f, -0.0408936f, -0.5419922f, 0.0467529f, -0.3332520f, -0.2600098f, -0.1348877f, 0.1938477f, 0.4077148f, }, + { 0.5878906f, -0.4910889f, 0.0612793f, -0.5061035f, 0.0288086f, 0.5469971f, 0.0718994f, -0.4511719f, 0.1008301f, -0.0118408f, 0.0270996f, }, + { -0.9810791f, -0.2739258f, 0.0173340f, 0.0988770f, -0.2679443f, 0.1605225f, 0.0800781f, 0.2320557f, -0.0592041f, 0.0386963f, 0.1845703f, }, + { 0.1788330f, -0.2473145f, 0.2261963f, 0.1134033f, 0.2038574f, -0.3339844f, -0.0565186f, -0.1020508f, -0.6037598f, -0.0163574f, 0.3380127f, }, + { 0.3627930f, -0.6284180f, -0.3841553f, 0.1114502f, -0.1810303f, 0.0325928f, -0.1904297f, 0.4764404f, 0.1839600f, 0.1348877f, -0.1826172f, }, + { 0.0256348f, -0.1459961f, 0.4594727f, 0.0733643f, 0.1989746f, 0.4689941f, 0.7780762f, -0.1578369f, -0.5560303f, -0.3768311f, 0.0242920f, }, + { -0.2340088f, -0.4066162f, -0.2828369f, -0.2165527f, 0.0584717f, 0.4531250f, 0.3331299f, 0.1597900f, -0.3719482f, -0.0627441f, 0.1051025f, }, + { -0.0260010f, 0.1607666f, -0.2484131f, 0.5333252f, 0.6381836f, 0.1149902f, -0.3725586f, -0.2827148f, -0.4122314f, 0.1370850f, -0.0079346f, }, + { 0.3060303f, 0.3309326f, -0.2558594f, -0.2641602f, -0.3215332f, -0.6365967f, -0.4783936f, 0.1893311f, -0.0057373f, 0.2429199f, 0.2893066f, }, + { 0.2471924f, -0.2930908f, 0.5899658f, -0.4735107f, -0.0197754f, -0.3760986f, 0.0611572f, -0.0622559f, 0.3349609f, -0.1107178f, 0.0308838f, }, + { -0.2131348f, -0.3076172f, 0.4172363f, -0.1783447f, 0.2612305f, 0.3060303f, 0.0164795f, 0.1778564f, 0.3900146f, -0.1558838f, -0.3122559f, }, + { -0.0080566f, 1.3244629f, -0.1993408f, -0.1282959f, -0.4194336f, -0.1973877f, 0.1755371f, -0.1502686f, -0.2128906f, 0.0849609f, -0.0424805f, }, + { 0.4191895f, 0.2589111f, -0.1988525f, -0.3002930f, -0.4962158f, 0.1414795f, -0.1572266f, 0.3470459f, 0.0850830f, -0.1052246f, 0.0004883f, }, + { 0.1179199f, -0.0541992f, -0.2270508f, 0.1770020f, 0.7844238f, 0.6767578f, 0.1777344f, -0.3449707f, -0.1590576f, -0.3391113f, -0.1560059f, }, + { -0.8125000f, -0.3956299f, -0.8646240f, 0.2727051f, 0.0249023f, 0.2139893f, 0.0980225f, 0.0609131f, 0.2003174f, 0.0106201f, 0.1795654f, }, + { -0.1617432f, 0.0485840f, 0.3641357f, 0.5297852f, -0.1687012f, 0.0897217f, -0.0732422f, -0.5701904f, -0.0310059f, 0.2840576f, -0.1230469f, }, + { -0.0175781f, -0.1773682f, -0.2204590f, -0.2037354f, 0.0482178f, -0.4010010f, -0.2200928f, -0.2586670f, 0.1503906f, 0.3557129f, 0.1806641f, }, + { 1.0510254f, 0.2182617f, 0.3227539f, 0.1658936f, 0.4617920f, -0.0134277f, -0.1634521f, -0.1632080f, -0.4183350f, -0.0769043f, -0.1451416f, }, + { -0.3125000f, 0.1191406f, 0.0589600f, -0.3349609f, -0.4459229f, -0.1573486f, 0.3552246f, -0.2974854f, 0.3870850f, 0.1805420f, 0.0191650f, }, + { 0.1004639f, 0.5653076f, -0.2331543f, 0.4560547f, -0.0517578f, -0.0189209f, -0.6677246f, -0.0904541f, 0.4674072f, -0.3410645f, -0.0067139f, }, + { -0.1766357f, -0.4234619f, -0.2376709f, 0.3557129f, -0.0074463f, -0.4187012f, 0.4326172f, -0.2279053f, 0.3645020f, 0.1231689f, -0.1282959f, }, + { 0.0885010f, 0.3580322f, 0.3571777f, 0.7139893f, 0.0313721f, -0.3254395f, 0.7673340f, -0.2785645f, -0.3659668f, -0.3144531f, -0.1190186f, }, + { -0.4461670f, -0.2279053f, -0.6152344f, -0.1757813f, 0.4323730f, -0.0736084f, 0.5866699f, -0.3427734f, -0.1993408f, 0.1694336f, 0.1402588f, }, + { -0.1972656f, -0.2259521f, 0.2590332f, 0.5465088f, 0.3033447f, 0.1679688f, 0.0880127f, 0.2653809f, -0.3750000f, 0.1682129f, -0.3142090f, }, + { -0.0045166f, 0.1613770f, -0.2009277f, -0.4409180f, 0.5423584f, 0.1967773f, -0.4154053f, 0.0867920f, 0.0161133f, 0.0145264f, -0.0277100f, }, + { 0.6175537f, 0.3530273f, 0.1025391f, 0.6667480f, -0.4237061f, -0.1635742f, 0.2559814f, 0.0174561f, 0.2136230f, -0.3725586f, -0.2358398f, }, + { -0.7753906f, -0.5085449f, -0.0787354f, 0.5269775f, 0.0772705f, 0.4493408f, 0.3431396f, 0.2863770f, 0.2897949f, -0.3660889f, -0.1544189f, }, + { -0.0256348f, 0.6243896f, 0.5678711f, 0.1593018f, 0.4521484f, -0.1777344f, -0.0374756f, -0.0557861f, -0.1776123f, -0.4370117f, 0.0822754f, }, + { 0.2703857f, 0.3000488f, -0.3687744f, -0.0080566f, 0.3094482f, -0.0795898f, 0.1496582f, 0.0836182f, 0.1068115f, -0.2139893f, -0.1420898f, }, + { -0.0743408f, 0.4204102f, 0.0687256f, 0.4670410f, 0.1961670f, 0.4636230f, 0.1690674f, 0.4763184f, -0.2429199f, -0.4978027f, -0.3062744f, }, +}; + +const float AmpCB1_NB[64][10] = +{ + { -0.1654053f, 0.0225830f, -0.0270996f, -0.0269775f, 0.2412109f, 0.3807373f, 0.0659180f, 0.1627197f, -0.4450684f, -0.3065186f, }, + { -0.1195068f, 0.2031250f, 0.2547607f, 0.1160889f, 0.0960693f, -0.2059326f, -0.1043701f, 0.1945801f, 0.1542969f, -0.6091309f, }, + { -0.2388916f, -0.0262451f, -0.1037598f, 0.1671143f, -0.0137939f, 0.3101807f, -0.3544922f, 0.0906982f, 0.0773926f, -0.0802002f, }, + { -0.4196777f, -0.2498779f, 0.0861816f, 0.0103760f, -0.0727539f, -0.0061035f, 0.0258789f, 0.1152344f, 0.0144043f, 0.1684570f, }, + { -0.1468506f, -0.0095215f, -0.0260010f, -0.2210693f, -0.0953369f, -0.2404785f, 0.8065186f, -0.3626709f, 0.0179443f, -0.1810303f, }, + { 0.0046387f, 0.6844482f, 0.6374512f, -0.5574951f, -0.4931641f, -0.2757568f, -0.3796387f, -0.2587891f, 0.1137695f, -0.0288086f, }, + { -0.1284180f, 0.1268311f, -0.1064453f, 0.0407715f, -0.1121826f, 0.3370361f, 0.4052734f, -0.7114258f, 0.0064697f, 0.1297607f, }, + { -0.1298828f, -0.0091553f, -0.1239014f, -0.2608643f, -0.0881348f, 0.0689697f, 0.0767822f, 0.2393799f, -0.0554199f, 0.1057129f, }, + { -0.1083984f, 0.3237305f, 0.2436523f, -0.2648926f, -0.1080322f, 0.4058838f, -0.0787354f, -0.2316895f, -0.1201172f, -0.0784912f, }, + { -0.1230469f, 0.3017578f, 0.2929688f, -0.4526367f, -0.2939453f, -0.1282959f, 0.2476807f, 0.1656494f, -0.0776367f, -0.0573730f, }, + { -0.1595459f, 0.0799561f, 0.0809326f, 0.0035400f, 0.1088867f, -0.0115967f, -0.0111084f, -0.3620605f, -0.1965332f, 0.3243408f, }, + { -0.2655029f, -0.3869629f, -0.4637451f, -0.3741455f, 0.1379395f, 0.1649170f, 0.4655762f, 0.3406982f, 0.1804199f, 0.1855469f, }, + { -0.1618652f, -0.0634766f, -0.0844727f, 0.1097412f, 0.2415771f, -0.0484619f, -0.0496826f, 0.0549316f, -0.0694580f, -0.0745850f, }, + { -0.1499023f, 0.1054688f, 0.3111572f, 0.3743896f, -0.3065186f, -0.5782471f, -0.3297119f, -0.0371094f, 0.0830078f, 0.1740723f, }, + { -0.1306152f, -0.0023193f, -0.1931152f, -0.3433838f, -0.2236328f, 0.3674316f, 0.0305176f, -0.0748291f, 0.4138184f, -0.0208740f, }, + { -0.1770020f, -0.0509033f, -0.0943604f, -0.0794678f, -0.0494385f, -0.2812500f, -0.0952148f, 0.8125000f, -0.3991699f, -0.1613770f, }, + { 0.0085449f, 0.6231689f, 0.3908691f, -0.0101318f, -0.1129150f, -0.0559082f, 0.1468506f, -0.1931152f, -0.5075684f, -0.4431152f, }, + { -0.2077637f, -0.1036377f, -0.0067139f, -0.1203613f, -0.2396240f, -0.1391602f, -0.2370605f, 0.4085693f, 0.4304199f, -0.0531006f, }, + { -0.1744385f, -0.2550049f, -0.1977539f, -0.1551514f, 0.3480225f, 0.2666016f, -0.3017578f, 0.3925781f, 0.3521729f, -0.3566895f, }, + { -0.1485596f, 0.0104980f, -0.0227051f, -0.0340576f, -0.0910645f, 0.1572266f, 0.3681641f, -0.0794678f, -0.3319092f, 0.0386963f, }, + { -0.1595459f, -0.0155029f, -0.1354980f, 0.1695557f, 0.0258789f, 0.2176514f, 0.3197021f, -0.2097168f, 0.2191162f, -0.4987793f, }, + { -0.1580811f, 0.0906982f, 0.0367432f, -0.2225342f, -0.0272217f, -0.0794678f, -0.2165527f, -0.0494385f, 0.2059326f, 0.2479248f, }, + { -0.1055908f, 0.1292725f, -0.0477295f, 0.0616455f, -0.3343506f, -0.3385010f, 0.0019531f, -0.3613281f, 0.3748779f, 0.4058838f, }, + { -0.0965576f, 0.2808838f, 0.0531006f, 0.0130615f, -0.4930420f, 0.0977783f, -0.1494141f, 0.2263184f, -0.1268311f, 0.0618896f, }, + { -0.0632324f, 0.1217041f, 0.1021729f, 0.4041748f, 0.0617676f, 0.1252441f, -0.0283203f, -0.2343750f, -0.4765625f, 0.0495605f, }, + { -0.2266846f, -0.0645752f, -0.0947266f, -0.0854492f, -0.0809326f, -0.1855469f, 0.2073975f, 0.0993652f, 0.2543945f, -0.0582275f, }, + { -0.1636963f, -0.1370850f, -0.3129883f, -0.3398438f, 0.2999268f, 0.3934326f, -0.1170654f, 0.0469971f, -0.2275391f, 0.4582520f, }, + { -0.1649170f, -0.1644287f, -0.2720947f, -0.3518066f, -0.1295166f, -0.1829834f, -0.3696289f, 0.4030762f, 0.2746582f, 0.6761475f, }, + { -0.1168213f, -0.0415039f, 0.0032959f, 0.1840820f, 0.0203857f, -0.4288330f, 0.2061768f, 0.3145752f, -0.2209473f, -0.0629883f, }, + { -0.1295166f, 0.2650146f, 0.2165527f, 0.2479248f, 0.1126709f, -0.2359619f, -0.2001953f, -0.3516846f, 0.1048584f, -0.1018066f, }, + { 0.0498047f, 0.3005371f, 0.2530518f, 0.2572021f, -0.3260498f, 0.1391602f, -0.4268799f, -0.3048096f, 0.3642578f, -0.3304443f, }, + { -0.2150879f, -0.3081055f, -0.2680664f, 0.0340576f, -0.3149414f, 0.0582275f, 0.2814941f, 0.5670166f, 0.0845947f, -0.1109619f, }, + { -0.1329346f, 0.2382813f, 0.3703613f, -0.2185059f, 0.0959473f, -0.1402588f, -0.3804932f, 0.4400635f, -0.2359619f, -0.2302246f, }, + { -0.1170654f, 0.1140137f, 0.0300293f, -0.2657471f, -0.2978516f, 0.1655273f, 0.1063232f, 0.4238281f, 0.3122559f, -0.5507813f, }, + { -0.0954590f, 0.1540527f, 0.1090088f, 0.2415771f, 0.2912598f, -0.2208252f, -0.5318604f, -0.0478516f, -0.2353516f, 0.1923828f, }, + { -0.2137451f, -0.0399170f, -0.1242676f, -0.0753174f, -0.2893066f, -0.3552246f, 0.5163574f, -0.0109863f, -0.1661377f, 0.4389648f, }, + { -0.1304932f, -0.0384521f, -0.0197754f, -0.0413818f, -0.0382080f, 0.0040283f, 0.5717773f, 0.3431396f, -0.3316650f, -0.4497070f, }, + { 0.0848389f, 0.5574951f, -0.0909424f, -0.2821045f, -0.0947266f, -0.3173828f, -0.1009521f, -0.1269531f, -0.1217041f, 0.3027344f, }, + { -0.1890869f, -0.0913086f, -0.0759277f, -0.0317383f, 0.1782227f, 0.1362305f, -0.0368652f, -0.3087158f, 0.2631836f, -0.0051270f, }, + { -0.1608887f, -0.0693359f, -0.0324707f, -0.0544434f, -0.2700195f, 0.3283691f, -0.5699463f, 0.6500244f, -0.2468262f, 0.1657715f, }, + { -0.1601563f, 0.2799072f, 0.1865234f, 0.0861816f, 0.1184082f, -0.0355225f, 0.0467529f, -0.0833740f, -0.1870117f, -0.2249756f, }, + { -0.1683350f, 0.1031494f, 0.1486816f, 0.0482178f, -0.2299805f, 0.0017090f, 0.0825195f, -0.2088623f, 0.0970459f, 0.0354004f, }, + { -0.0905762f, 0.0471191f, -0.0531006f, 0.0501709f, 0.1600342f, 0.0670166f, -0.5103760f, -0.6008301f, 0.1827393f, 0.5450439f, }, + { -0.2102051f, -0.0853271f, -0.2390137f, -0.5036621f, -0.4549561f, -0.0799561f, 0.1895752f, 0.2188721f, 0.6021729f, 0.3729248f, }, + { -0.1538086f, -0.0754395f, 0.0653076f, -0.2451172f, 0.4641113f, -0.4619141f, 0.3084717f, -0.1016846f, 0.0235596f, -0.1296387f, }, + { -0.1057129f, 0.1004639f, 0.1906738f, 0.0179443f, -0.0760498f, -0.2207031f, -0.1341553f, 0.0847168f, -0.0704346f, 0.0909424f, }, + { -0.2785645f, -0.5052490f, -0.3870850f, 0.0092773f, 0.0030518f, -0.1314697f, 0.0582275f, 0.0665283f, 0.7423096f, 0.3959961f, }, + { -0.1625977f, -0.0958252f, 0.0119629f, -0.2052002f, -0.4398193f, -0.4805908f, 0.0639648f, 0.5673828f, 0.1359863f, 0.3109131f, }, + { -0.1397705f, 0.0496826f, 0.2478027f, 0.3808594f, -0.2122803f, -0.0626221f, -0.0632324f, 0.1617432f, -0.2075195f, -0.3491211f, }, + { -0.1741943f, 0.0634766f, -0.1269531f, -0.0966797f, -0.0446777f, -0.2653809f, -0.0637207f, -0.0292969f, 0.6909180f, -0.3861084f, }, + { -0.1768799f, -0.2017822f, -0.1839600f, 0.0709229f, 0.1633301f, -0.3206787f, -0.2274170f, 0.2235107f, 0.1588135f, 0.2570801f, }, + { -0.1528320f, 0.1188965f, 0.0242920f, 0.0083008f, -0.0084229f, -0.1060791f, 0.1054688f, 0.2896729f, -0.7102051f, 0.3507080f, }, + { 0.0031738f, 0.1186523f, 0.0438232f, -0.0684814f, -0.0476074f, 0.0458984f, 0.0274658f, 0.0631104f, 0.0792236f, -0.2156982f, }, + { -0.0797119f, 0.2645264f, 0.1076660f, -0.0852051f, 0.0261230f, -0.4985352f, -0.5046387f, 0.2553711f, 0.3415527f, -0.0638428f, }, + { -0.1223145f, 0.0593262f, 0.0791016f, -0.1320801f, 0.0493164f, -0.1818848f, 0.1904297f, -0.6083984f, 0.6853027f, -0.1759033f, }, + { -0.1250000f, -0.0379639f, 0.0521240f, 0.0434570f, -0.2858887f, 0.0262451f, -0.2822266f, 0.0543213f, -0.2902832f, 0.6239014f, }, + { -0.0693359f, 0.0103760f, 0.1621094f, 0.2254639f, 0.4279785f, 0.1444092f, -0.3077393f, -0.2526855f, -0.0969238f, -0.2296143f, }, + { -0.0592041f, 0.1368408f, 0.1516113f, 0.1588135f, -0.5328369f, -0.2712402f, 0.3176270f, -0.0472412f, 0.1828613f, -0.1640625f, }, + { -0.1552734f, -0.1666260f, -0.2694092f, -0.0260010f, -0.2291260f, 0.3488770f, 0.1036377f, -0.1116943f, 0.0406494f, 0.3037109f, }, + { -0.2464600f, -0.2500000f, -0.1783447f, -0.2355957f, -0.1719971f, -0.0488281f, 0.0598145f, -0.2712402f, 0.1557617f, 0.8917236f, }, + { -0.1867676f, -0.2125244f, -0.3250732f, 0.3856201f, 0.1418457f, -0.1818848f, 0.1850586f, -0.1828613f, 0.1491699f, 0.1022949f, }, + { 0.1617432f, 0.6575928f, 0.4746094f, 0.2373047f, -0.2082520f, -0.3527832f, -0.2325439f, -0.4761963f, -0.3914795f, 0.0251465f, }, + { -0.1722412f, -0.1170654f, -0.0356445f, -0.0483398f, -0.1888428f, -0.0102539f, -0.5377197f, -0.1309814f, 0.6752930f, 0.2192383f, }, + { 0.3857422f, 0.0058594f, -0.2855225f, -0.7182617f, -0.0224609f, -0.0063477f, 0.0157471f, 0.6589355f, 0.0461426f, -0.0391846f, }, +}; + +const float AmpCB2_NB[64][NUM_ERB_NB-11] = +{ + { -0.3272705f, -0.5357666f, -0.5212402f, -0.5770264f, -0.0291748f, 0.2365723f, 0.2133789f, 0.2821045f, 0.5249023f, }, + { -0.4830322f, -0.1585693f, 0.4256592f, 0.1947021f, -0.0460205f, 0.0360107f, -0.1456299f, -0.1938477f, 0.2578125f, }, + { -0.1920166f, -0.7766113f, -0.0615234f, 0.2192383f, -0.3077393f, -0.0083008f, 0.1613770f, 0.1492920f, 0.2762451f, }, + { -0.0614014f, -0.4768066f, 0.4499512f, -0.4759521f, -0.0169678f, 0.2546387f, 0.0058594f, 0.0426025f, 0.0667725f, }, + { -0.7796631f, 0.1635742f, -0.1790771f, -0.1296387f, -0.0235596f, 0.1617432f, -0.1452637f, 0.2922363f, 0.2039795f, }, + { -0.2419434f, -0.3170166f, -0.0476074f, -0.1835938f, 0.2772217f, -0.0462646f, -0.2868652f, 0.4969482f, 0.0085449f, }, + { -0.1165771f, -0.1077881f, -0.2160645f, -0.1300049f, -0.2982178f, -0.2171631f, -0.1343994f, -0.0806885f, 0.7720947f, }, + { 0.2283936f, -0.3262939f, 0.4389648f, 0.4605713f, -0.0831299f, 0.4077148f, -0.1730957f, 0.0855713f, -0.5191650f, }, + { -0.4798584f, -0.2246094f, -0.2915039f, -0.3267822f, -0.4327393f, -0.0050049f, 0.4486084f, 0.4691162f, 0.2683105f, }, + { -0.2091064f, -0.0395508f, 0.0731201f, 0.1614990f, 0.2230225f, -0.5992432f, -0.2036133f, 0.0751953f, 0.3183594f, }, + { 0.0439453f, -0.2159424f, -0.6424561f, -0.1560059f, 0.4260254f, 0.2362061f, 0.1654053f, -0.1584473f, 0.1162109f, }, + { 0.2198486f, 0.0548096f, 0.0306396f, -0.1246338f, -0.4475098f, 0.0584717f, 0.4268799f, 0.1882324f, -0.2727051f, }, + { -0.4167480f, -0.5472412f, -0.7061768f, 0.1716309f, 0.1473389f, 0.3642578f, 0.2156982f, 0.3981934f, -0.0975342f, }, + { -0.3813477f, 0.6392822f, 0.0561523f, 0.2449951f, -0.1861572f, -0.2570801f, -0.0939941f, 0.0666504f, 0.0167236f, }, + { 0.0489502f, -0.1596680f, 0.1182861f, 0.0249023f, -0.1984863f, -0.0718994f, -0.5196533f, 0.2128906f, 0.3461914f, }, + { 0.2908936f, 0.3344727f, -0.0516357f, 0.3864746f, 0.2343750f, -0.0842285f, -0.3662109f, -0.5479736f, 0.3079834f, }, + { -0.8170166f, -0.6268311f, -0.0902100f, -0.2342529f, 0.1499023f, 0.2873535f, 0.4077148f, 0.2321777f, 0.1304932f, }, + { -0.3887939f, -0.3190918f, 0.3374023f, -0.0258789f, -0.2515869f, -0.1680908f, 0.0852051f, 0.4509277f, -0.0152588f, }, + { -0.1164551f, -0.5043945f, -0.0493164f, 0.5245361f, 0.1579590f, 0.2154541f, 0.2985840f, -0.2791748f, -0.1693115f, }, + { -0.0017090f, 0.0620117f, 0.1402588f, 0.0010986f, -0.0533447f, 0.0633545f, -0.0512695f, 0.0549316f, -0.0916748f, }, + { -0.1992188f, -0.1697998f, -0.2695313f, -0.2386475f, -0.1428223f, 0.5881348f, 0.1357422f, 0.1325684f, -0.0954590f, }, + { 0.1632080f, 0.1032715f, -0.4191895f, 0.0694580f, 0.2100830f, -0.0947266f, -0.3323975f, 0.1473389f, 0.1198730f, }, + { -0.1748047f, -0.1082764f, 0.0384521f, -0.3699951f, 0.4213867f, 0.0933838f, -0.1541748f, -0.2619629f, 0.3612061f, }, + { -0.3197021f, 0.1839600f, 0.1601563f, 0.4989014f, 0.3814697f, 0.1998291f, -0.1711426f, -0.0054932f, -0.3897705f, }, + { 0.1705322f, -0.3187256f, -0.4444580f, -0.3024902f, -0.2082520f, 0.0717773f, 0.0242920f, 0.4542236f, 0.1485596f, }, + { -0.1524658f, -0.1459961f, 0.8823242f, 0.1215820f, 0.1072998f, -0.1634521f, 0.0013428f, -0.1185303f, -0.2050781f, }, + { 0.0874023f, -0.0047607f, 0.0284424f, 0.2374268f, 0.1889648f, -0.1801758f, 0.0671387f, -0.2779541f, 0.0374756f, }, + { 0.9049072f, 0.2556152f, -0.1990967f, -0.0694580f, -0.1649170f, -0.0241699f, -0.0589600f, -0.0628662f, -0.1644287f, }, + { -0.0258789f, -0.3233643f, -0.0633545f, 0.0238037f, 0.3593750f, -0.0970459f, 0.1794434f, 0.0798340f, -0.1767578f, }, + { 0.3852539f, 0.1671143f, 0.4841309f, 0.4128418f, -0.3395996f, -0.5194092f, -0.1412354f, -0.0258789f, 0.0478516f, }, + { 0.1051025f, 0.6181641f, 0.5786133f, -0.3067627f, -0.4166260f, -0.0673828f, -0.2805176f, -0.0701904f, 0.1379395f, }, + { 0.1437988f, 0.1914063f, 0.5604248f, 0.1511230f, 0.0447998f, 0.1984863f, 0.0732422f, -0.7188721f, 0.0198975f, }, + { -0.4567871f, -0.4455566f, -0.4774170f, 0.0874023f, 0.1121826f, -0.1832275f, 0.0067139f, 0.2205811f, 0.4639893f, }, + { -0.6800537f, -0.5657959f, 0.1495361f, 0.3919678f, 0.4643555f, 0.1820068f, -0.1105957f, 0.0122070f, 0.0493164f, }, + { -0.2126465f, -0.2292480f, -0.2612305f, 0.2015381f, 0.2001953f, 0.4853516f, -0.4189453f, -0.1402588f, 0.1666260f, }, + { 0.2492676f, 0.0478516f, 0.0937500f, -0.1872559f, 0.1337891f, 0.4652100f, -0.0257568f, -0.2523193f, -0.1605225f, }, + { -0.5086670f, 0.1397705f, -0.3353271f, -0.0181885f, 0.6464844f, -0.0897217f, 0.0534668f, 0.0068359f, -0.0493164f, }, + { -0.0194092f, -0.2641602f, -0.1170654f, 0.4262695f, -0.0842285f, -0.0839844f, -0.1319580f, 0.3371582f, -0.1453857f, }, + { 0.0798340f, 0.2503662f, -0.2617188f, -0.3918457f, -0.2225342f, 0.0906982f, 0.0837402f, -0.0916748f, 0.3031006f, }, + { 0.0195313f, 0.1561279f, 0.3962402f, 0.2287598f, 0.3037109f, 0.1455078f, -0.7296143f, -0.0583496f, 0.0146484f, }, + { -0.0426025f, -0.0079346f, -0.2868652f, -0.0270996f, -0.2048340f, -0.4375000f, 0.1359863f, 0.3990479f, 0.1784668f, }, + { -0.1359863f, -0.0168457f, 0.2880859f, -0.3371582f, 0.0878906f, -0.4665527f, 0.3079834f, 0.0263672f, 0.1428223f, }, + { 0.5368652f, -0.5162354f, -0.2258301f, 0.1552734f, 0.0467529f, 0.2119141f, -0.0467529f, -0.1580811f, 0.0103760f, }, + { -0.0161133f, 0.1383057f, 0.1837158f, 0.1790771f, -0.2916260f, -0.2655029f, 0.4916992f, -0.3359375f, 0.0294189f, }, + { -0.5313721f, -0.2567139f, -0.0686035f, 0.0997314f, 0.4832764f, 0.6678467f, 0.2369385f, -0.1950684f, -0.2867432f, }, + { 0.0245361f, 0.1723633f, -0.0971680f, 0.3406982f, -0.5158691f, 0.3939209f, -0.2431641f, -0.0194092f, -0.0194092f, }, + { 0.4986572f, -0.1890869f, 0.1245117f, -0.2659912f, -0.0947266f, -0.2548828f, -0.0179443f, -0.0051270f, 0.2294922f, }, + { -0.1256104f, 0.6081543f, -0.2509766f, 0.0135498f, 0.1733398f, 0.2613525f, 0.0368652f, -0.3142090f, -0.1203613f, }, + { -0.0582275f, -0.4512939f, -0.2867432f, -0.2519531f, -0.0408936f, -0.0268555f, 0.7149658f, 0.0069580f, -0.0008545f, }, + { -0.6600342f, -0.0666504f, -0.0430908f, 0.3498535f, 0.0167236f, -0.0166016f, 0.4282227f, 0.1210938f, -0.2513428f, }, + { -0.2482910f, -0.1375732f, -0.0230713f, -0.0366211f, -0.2628174f, 0.4401855f, 0.3079834f, -0.4549561f, 0.1862793f, }, + { -0.4635010f, 0.2604980f, 0.5312500f, -0.1123047f, -0.0560303f, 0.3322754f, 0.2177734f, -0.0086670f, -0.3698730f, }, + { -0.1070557f, 0.2401123f, -0.2008057f, -0.5410156f, 0.0625000f, 0.0047607f, 0.2144775f, 0.3509521f, -0.1156006f, }, + { 0.2248535f, 0.1666260f, 0.1831055f, 0.1038818f, 0.0725098f, -0.3530273f, -0.0493164f, 0.4061279f, -0.3757324f, }, + { -0.1922607f, -0.1535645f, -0.1187744f, -0.0233154f, -0.0476074f, 0.0054932f, 0.0765381f, -0.0277100f, 0.1982422f, }, + { -0.0174561f, 0.0262451f, 0.2633057f, 0.5915527f, 0.6512451f, 0.4146729f, -0.0242920f, -0.5423584f, -0.3773193f, }, + { -0.0345459f, -0.0263672f, 0.1510010f, -0.1804199f, -0.6883545f, -0.0946045f, 0.0640869f, 0.2572021f, 0.3013916f, }, + { 0.3581543f, -0.0311279f, 0.2976074f, 0.1005859f, 0.7291260f, -0.2221680f, -0.1623535f, -0.1467285f, -0.2969971f, }, + { 0.1098633f, 0.0793457f, -0.6901855f, 0.3529053f, -0.1878662f, -0.0552979f, 0.2028809f, 0.0281982f, -0.0177002f, }, + { 0.2027588f, 0.0904541f, -0.0405273f, 0.1490479f, 0.2208252f, 0.1151123f, 0.5897217f, -0.1938477f, -0.5638428f, }, + { 0.0079346f, -0.0964355f, -0.1202393f, -0.1090088f, 0.4118652f, 0.3842773f, 0.0352783f, 0.3597412f, -0.6079102f, }, + { -0.0806885f, -0.0521240f, 0.1759033f, 0.9394531f, 0.0192871f, -0.2336426f, -0.2525635f, -0.2095947f, -0.0510254f, }, + { 0.3243408f, 0.5150146f, 0.1837158f, -0.1337891f, 0.0733643f, -0.1789551f, -0.2141113f, -0.0584717f, -0.0194092f, }, + { 0.4123535f, 0.6411133f, 0.6176758f, 0.4884033f, 0.1588135f, 0.0512695f, -0.1547852f, -0.3433838f, -0.5122070f, }, +}; + + + +const float PowerCB_WB[64][2] = +{ + { -1.6459961f, -0.8359375f, }, + { -0.083007813f, 0.17089844f, }, + { -0.31152344f, -0.45849609f, }, + { 0.02734375f, 0.52441406f, }, + { -0.76123047f, -0.30566406f, }, + { 0.09765625f, 0.16796875f, }, + { -0.19384766f, 0.11621094f, }, + { 0.13867188f, 0.69091797f, }, + { -0.64599609f, -0.91796875f, }, + { -0.265625f, 0.57128906f, }, + { -0.30224609f, -0.12451172f, }, + { 0.28662109f, 0.47558594f, }, + { -0.61621094f, -0.047851563f, }, + { 0.15966797f, 0.073730469f, }, + { 0.020019531f, -0.14746094f, }, + { 0.45947266f, 0.91601563f, }, + { -1.1020508f, -0.60205078f, }, + { 0.013671875f, 0.098632813f, }, + { -0.25390625f, -0.27392578f, }, + { 0.16503906f, 0.51171875f, }, + { -0.52734375f, -0.24169922f, }, + { 0.092773438f, 0.28417969f, }, + { -0.13867188f, -0.01171875f, }, + { 0.28222656f, 0.77392578f, }, + { -0.64648438f, -0.53173828f, }, + { -0.034667969f, 0.27734375f, }, + { -0.22998047f, -0.012695313f, }, + { 0.55664063f, 0.44384766f, }, + { -0.41796875f, -0.0625f, }, + { 0.20751953f, 0.36132813f, }, + { 0.068359375f, 0.005859375f, }, + { 0.77880859f, 0.92333984f, }, + { -1.0625f, -1.1279297f, }, + { -0.15039063f, 0.26416016f, }, + { -0.15380859f, -0.41943359f, }, + { -0.0390625f, 0.64160156f, }, + { -0.87011719f, 0.24902344f, }, + { 0.19677734f, 0.21972656f, }, + { -0.29638672f, 0.28417969f, }, + { 0.070800781f, 0.89697266f, }, + { -0.44921875f, -0.67675781f, }, + { -0.10986328f, 0.42578125f, }, + { -0.19287109f, -0.12597656f, }, + { 0.40478516f, 0.47900391f, }, + { -0.46142578f, 0.16845703f, }, + { 0.31396484f, 0.11767578f, }, + { -0.02734375f, -0.011230469f, }, + { 0.59130859f, 0.72363281f, }, + { -0.87548828f, -0.71240234f, }, + { 0.01953125f, 0.1953125f, }, + { -0.11669922f, -0.22998047f, }, + { 0.25976563f, 0.60449219f, }, + { -0.37792969f, -0.25195313f, }, + { 0.11914063f, 0.40576172f, }, + { -0.076660156f, 0.07421875f, }, + { 0.28125f, 1.1166992f, }, + { -0.453125f, -0.41210938f, }, + { 0.020019531f, 0.37060547f, }, + { -0.078613281f, -0.096679688f, }, + { 0.42626953f, 0.66064453f, }, + { -0.3125f, 0.051269531f, }, + { 0.33935547f, 0.30419922f, }, + { 0.17773438f, -0.08984375f, }, + { 0.60449219f, 1.1943359f, }, +}; + + +const float PowerCB_NB[64][2] = +{ + { -1.6352539f, -1.359375f, }, + { -0.3828125f, 0.18798828f, }, + { -0.43505859f, -0.27441406f, }, + { 0.061523438f, 0.44677734f, }, + { -0.74121094f, -0.70214844f, }, + { 0.1484375f, 0.025878906f, }, + { -0.15332031f, -0.21826172f, }, + { 0.33544922f, 0.59521484f, }, + { -1.262207f, -0.88232422f, }, + { -0.031738281f, 0.074707031f, }, + { -0.59521484f, -0.16455078f, }, + { 0.24267578f, 0.34179688f, }, + { -0.43652344f, -0.51318359f, }, + { 0.078613281f, 0.22021484f, }, + { -0.022460938f, -0.25195313f, }, + { 0.48193359f, 0.74169922f, }, + { -1.1118164f, -1.1245117f, }, + { -0.17285156f, 0.21728516f, }, + { -0.25976563f, -0.26367188f, }, + { 0.0024414063f, 0.62060547f, }, + { -0.51123047f, -0.69970703f, }, + { 0.328125f, -0.10986328f, }, + { -0.16357422f, -0.036621094f, }, + { 0.49169922f, 0.515625f, }, + { -0.66503906f, -0.91748047f, }, + { -0.045410156f, 0.17919922f, }, + { -0.22851563f, -0.12646484f, }, + { 0.87890625f, -0.14160156f, }, + { -0.54589844f, -0.38720703f, }, + { 0.20117188f, 0.23046875f, }, + { -0.0043945313f, -0.096191406f, }, + { 0.71826172f, 0.79785156f, }, + { -1.2827148f, -1.3901367f, }, + { -0.13134766f, 0.080078125f, }, + { -0.33642578f, -0.18212891f, }, + { 0.2109375f, 0.45898438f, }, + { -0.78173828f, -0.40966797f, }, + { 0.15185547f, 0.13232422f, }, + { -0.10351563f, -0.12255859f, }, + { 0.26513672f, 0.83691406f, }, + { -0.98339844f, -0.65234375f, }, + { 0.053222656f, 0.11767578f, }, + { -0.38525391f, -0.053710938f, }, + { 0.35595703f, 0.43359375f, }, + { -0.20410156f, -0.62353516f, }, + { 0.125f, 0.32910156f, }, + { 0.10644531f, -0.10595703f, }, + { 0.50146484f, 1.0083008f, }, + { -0.86376953f, -1.1196289f, }, + { -0.13476563f, 0.41650391f, }, + { -0.17578125f, -0.37304688f, }, + { 0.18359375f, 0.60888672f, }, + { -0.62207031f, -0.54785156f, }, + { 0.29394531f, 0.1328125f, }, + { -0.064941406f, -0.015625f, }, + { 0.67089844f, 0.54589844f, }, + { -0.90820313f, -0.87646484f, }, + { -0.011230469f, 0.30273438f, }, + { -0.25634766f, 0.029296875f, }, + { 0.52246094f, 0.26757813f, }, + { -0.33740234f, -0.39013672f, }, + { 0.34228516f, 0.27929688f, }, + { 0.039550781f, 0.0087890625f, }, + { 0.95166016f, 1.0351563f, }, +}; + +/* sinc for warp/extrapolate./16384., in Q14 */ +const float sinc[8][12] = +{ + {0.0f/16384.0f,0.0f/16384.0f,0.0f/16384.0f,0.0f/16384.0f,0.0f/16384.0f,16384.0f/16384.0f,0.0f/16384.0f,0.0f/16384.0f,0.0f/16384.0f,0.0f/16384.0f,0.0f/16384.0f,0.0f/16384.0f,}, + {-388.0f/16384.0f,484.0f/16384.0f,-638.0f/16384.0f,939.0f/16384.0f,-1773.0f/16384.0f,15966.0f/16384.0f,2281.0f/16384.0f,-1063.0f/16384.0f,694.0f/16384.0f,-514.0f/16384.0f,409.0f/16384.0f,-339.0f/16384.0f,}, + {-701.0f/16384.0f,868.0f/16384.0f,-1134.0f/16384.0f,1639.0f/16384.0f,-2949.0f/16384.0f,14751.0f/16384.0f,4917.0f/16384.0f,-2106.0f/16384.0f,1341.0f/16384.0f,-982.0f/16384.0f,776.0f/16384.0f,-640.0f/16384.0f,}, + {-895.0f/16384.0f,1101.0f/16384.0f,-1427.0f/16384.0f,2029.0f/16384.0f,-3503.0f/16384.0f,12849.0f/16384.0f,7709.0f/16384.0f,-2964.0f/16384.0f,1835.0f/16384.0f,-1328.0f/16384.0f,1042.0f/16384.0f,-856.0f/16384.0f,}, + {-947.0f/16384.0f,1159.0f/16384.0f,-1489.0f/16384.0f,2086.0f/16384.0f,-3476.0f/16384.0f,10430.0f/16384.0f,10430.0f/16384.0f,-3476.0f/16384.0f,2086.0f/16384.0f,-1489.0f/16384.0f,1159.0f/16384.0f,-947.0f/16384.0f,}, + {-856.0f/16384.0f,1042.0f/16384.0f,-1328.0f/16384.0f,1835.0f/16384.0f,-2964.0f/16384.0f,7709.0f/16384.0f,12849.0f/16384.0f,-3503.0f/16384.0f,2029.0f/16384.0f,-1427.0f/16384.0f,1101.0f/16384.0f,-895.0f/16384.0f,}, + {-640.0f/16384.0f,776.0f/16384.0f,-982.0f/16384.0f,1341.0f/16384.0f,-2106.0f/16384.0f,4917.0f/16384.0f,14751.0f/16384.0f,-2949.0f/16384.0f,1639.0f/16384.0f,-1134.0f/16384.0f,868.0f/16384.0f,-701.0f/16384.0f,}, + {-339.0f/16384.0f,409.0f/16384.0f,-514.0f/16384.0f,694.0f/16384.0f,-1063.0f/16384.0f,2281.0f/16384.0f,15966.0f/16384.0f,-1773.0f/16384.0f,939.0f/16384.0f,-638.0f/16384.0f,484.0f/16384.0f,-388.0f/16384.0f,}, +}; + +/*----------------------------------------------------------------------------------* + * Highrate SWB BWE tables + *----------------------------------------------------------------------------------*/ + +const float overlap_coefs_48kHz[NSV_OVERLAP*WIDTH_BAND] = +{ 0.30f, 0.34f, 0.36f, 0.39f, 0.42f, 0.44f, 0.46f, 0.475f, 0.49f, 0.51f, 0.54f, 0.57f, 0.62f, 0.72f, 0.83f, 0.95f }; + +const float overlap_coefs[NSV_OVERLAP*WIDTH_BAND] = +{ 0.2700f, 0.3060f, 0.3240f, 0.3510f, 0.3780f, 0.3960f, 0.4140f, 0.4275f, 0.4410f, 0.4590f, 0.4860f, 0.5130f, 0.5580f, 0.6480f, 0.7470f, 0.855f }; + +const float swb_hr_env_code1[NUM_ENVLOPE_CODE_HR1*2] = +{ + 0.044983f, 0.041700f, + 0.524276f, 0.469365f, + 0.671757f, 0.605513f, + 0.983501f, 0.855093f, + 1.227874f, 1.132200f, + 1.672212f, 1.432704f, + 2.548211f, 2.361091f, + 3.196961f, 3.306999f, + 2.580753f, 5.217478f, + 4.207751f, 7.243802f, + 3.517157f, 1.738487f, + 4.381567f, 2.753657f, + 4.758266f, 4.696094f, + 6.827988f, 6.106459f, + 4.450459f, 10.131211f, + 7.256045f, 12.488036f, + 6.708720f, 1.953339f, + 6.604030f, 3.699560f, + 10.612728f, 2.537916f, + 9.387467f, 4.241173f, + 7.119045f, 8.281485f, + 9.062854f, 7.086526f, + 8.919388f, 9.762914f, + 11.299319f, 11.763904f, + 11.782217f, 5.879754f, + 14.050457f, 9.665228f, + 11.201525f, 9.001128f, + 14.434753f, 13.236565f, + 14.337260f, 3.904411f, + 20.071049f, 4.335061f, + 18.105812f, 8.223599f, + 22.352287f, 9.603263f, + 7.242756f, 16.564487f, + 11.777528f, 19.167645f, + 11.121798f, 15.455982f, + 14.563579f, 17.359568f, + 17.821218f, 11.894719f, + 17.466026f, 15.296063f, + 21.336960f, 13.455175f, + 20.544336f, 17.125366f, + 9.056358f, 22.338306f, + 11.238424f, 28.832520f, + 13.262732f, 25.143383f, + 16.243559f, 28.256853f, + 15.269305f, 21.539135f, + 16.983515f, 24.699589f, + 19.591730f, 22.689682f, + 20.146198f, 25.888466f, + 17.797417f, 19.453121f, + 21.290621f, 20.186579f, + 24.097319f, 19.086721f, + 23.613092f, 22.545858f, + 23.682005f, 16.328239f, + 26.886553f, 19.402439f, + 26.009769f, 15.632211f, + 28.939930f, 16.240620f, + 25.094482f, 12.366419f, + 27.713383f, 13.263280f, + 28.330946f, 10.329259f, + 30.632830f, 12.851279f, + 25.273802f, 6.138124f, + 29.195339f, 7.222413f, + 32.171322f, 5.019567f, + 31.979000f, 9.473855f, +}; + +const float swb_hr_env_code2[NUM_ENVLOPE_CODE_HR2*2] = +{ + 0.512539f, 0.472507f, + 1.338963f, 1.108591f, + 2.544041f, 1.759765f, + 3.124053f, 3.045299f, + 4.892713f, 3.721097f, + 4.010297f, 5.750862f, + 5.111215f, 2.164709f, + 6.667518f, 3.893404f, + 8.454117f, 2.751430f, + 11.123573f, 3.518174f, + 6.622948f, 5.960704f, + 8.562429f, 5.003579f, + 8.919363f, 7.784057f, + 10.759037f, 5.959438f, + 12.449193f, 8.359519f, + 13.677005f, 11.230577f, + 13.672631f, 5.457414f, + 16.471989f, 3.917684f, + 20.910328f, 6.432810f, + 25.457325f, 8.617220f, + 16.410700f, 7.574456f, + 18.574385f, 10.291498f, + 22.088757f, 12.512156f, + 21.170530f, 17.208714f, + 5.276107f, 9.622470f, + 9.093585f, 11.274686f, + 11.945659f, 15.538144f, + 16.550409f, 15.046564f, + 6.358148f, 17.547396f, + 13.316619f, 21.765524f, + 7.646096f, 26.106720f, + 2.451297f, 31.933104f +}; + +const float swb_hr_env_code3[NUM_ENVLOPE_CODE_HR_TR*N_BANDS_TRANS_BWE_HR] = +{ + 0.799219f, 0.677609f, + 1.754571f, 1.215689f, + 2.846222f, 2.017775f, + 4.379336f, 1.975914f, + 5.935472f, 2.945818f, + 3.938621f, 4.220399f, + 8.080808f, 2.632276f, + 7.579771f, 4.986835f, + 4.956485f, 10.363663f, + 7.739148f, 8.652471f, + 9.238397f, 7.051655f, + 10.205707f, 5.619638f, + 10.645117f, 4.374648f, + 11.660180f, 3.474015f, + 10.845836f, 2.664596f, + 11.724073f, 1.637023f +}; + +/* Searching thresholds for quantization of norms */ +const float thren_HQ[39] = +{ + 110217.974940f, 77935.877489f, + 55108.987470f, 38967.938744f, + 27554.493735f, 19483.969372f, + 13777.246868f, 9741.984686f, + 6888.623434f, 4870.992343f, + 3444.311717f, 2435.496172f, + 1722.155858f, 1217.748086f, + 861.077929f, 608.874043f, + 430.538965f, 304.437021f, + 215.269482f, 152.218511f, + 107.634741f, 76.109255f, + 53.817371f, 38.054628f, + 26.908685f, 19.027314f, + 13.454343f, 9.513657f, + 6.727171f, 4.756828f, + 3.363586f, 2.378414f, + 1.681793f, 1.189207f, + 0.840896f, 0.594604f, + 0.420448f, 0.297302f, + 0.210224f +}; + +/*----------------------------------------------------------------------------------* + * ACELP/HQ core switching + *----------------------------------------------------------------------------------*/ + +/* short filters for BWE of ACELP->HQ switching frame */ +const float hp12800_16000[21] = +{ + -0.00000000f, 0.00212227f, -0.00632535f, 0.01161181f, -0.01235466f, 0.00000000f, 0.03177450f, -0.08143591f, + 0.13749378f, -0.18212549f, 0.19916883f, -0.18212549f, 0.13749378f, -0.08143591f, 0.03177450f, 0.00000000f, + -0.01235466f, 0.01161181f, -0.00632535f, 0.00212227f, -0.00000000f +}; + +const float hp12800_32000[41] = +{ + -0.00000000f, 0.00136608f, 0.00106650f, -0.00143351f, -0.00317865f, 0.00000000f, 0.00583523f, 0.00477033f, + -0.00620853f, -0.01289218f, -0.00000000f, 0.02060233f, 0.01596749f, -0.02003257f, -0.04092361f, 0.00000000f, + 0.06909412f, 0.05929089f, -0.09152269f, -0.30127931f, 0.60052441f, -0.30127931f, -0.09152269f, 0.05929089f, + 0.06909412f, 0.00000000f, -0.04092361f, -0.02003257f, 0.01596749f, 0.02060233f, -0.00000000f, -0.01289218f, + -0.00620853f, 0.00477033f, 0.00583523f, 0.00000000f, -0.00317865f, -0.00143351f, 0.00106650f, 0.00136608f, + -0.00000000f +}; + +const float hp12800_48000[61] = +{ + -0.00000000f, 0.00067336f, 0.00101850f, 0.00071064f, -0.00030497f, -0.00156225f, -0.00211804f, -0.00111583f, + 0.00136699f, 0.00388820f, 0.00427438f, 0.00122967f, -0.00413694f, -0.00827775f, -0.00727539f, 0.00000000f, + 0.00994020f, 0.01548435f, 0.01063964f, -0.00437614f, -0.02123403f, -0.02726869f, -0.01372549f, 0.01631621f, + 0.04603958f, 0.05175432f, 0.01589299f, -0.06098444f, -0.15675008f, -0.23604172f, 0.73360516f, -0.23604172f, + -0.15675008f, -0.06098444f, 0.01589299f, 0.05175432f, 0.04603958f, 0.01631621f, -0.01372549f, -0.02726869f, + -0.02123403f, -0.00437614f, 0.01063964f, 0.01548435f, 0.00994020f, 0.00000000f, -0.00727539f, -0.00827775f, + -0.00413694f, 0.00122967f, 0.00427438f, 0.00388820f, 0.00136699f, -0.00111583f, -0.00211804f, -0.00156225f, + -0.00030497f, 0.00071064f, 0.00101850f, 0.00067336f, -0.00000000f +}; + + +const float hp16000_32000[33] = +{ + -0.00000000f, 0.00188788f, -0.00000000f, -0.00386248f, -0.00000000f, 0.00824247f, -0.00000000f, -0.01594711f, + -0.00000000f, 0.02867656f, -0.00000000f, -0.05071856f, -0.00000000f, 0.09801591f, -0.00000000f, -0.31594176f, + 0.50070579f, -0.31594176f, -0.00000000f, 0.09801591f, -0.00000000f, -0.05071856f, -0.00000000f, 0.02867656f, + -0.00000000f, -0.01594711f, -0.00000000f, 0.00824247f, -0.00000000f, -0.00386248f, -0.00000000f, 0.00188788f, + -0.00000000f +}; + +const float hp16000_48000[49] = +{ + -0.00000000f, 0.00100660f, 0.00119953f, -0.00000000f, -0.00195325f, -0.00254135f, -0.00000000f, 0.00421805f, + 0.00534416f, 0.00000000f, -0.00829341f, -0.01018351f, -0.00000000f, 0.01504620f, 0.01817861f, 0.00000000f, + -0.02654841f, -0.03231243f, -0.00000000f, 0.04992164f, 0.06470722f, 0.00000000f, -0.13575216f, -0.27474220f, + 0.66706142f, -0.27474220f, -0.13575216f, 0.00000000f, 0.06470722f, 0.04992164f, -0.00000000f, -0.03231243f, + -0.02654841f, 0.00000000f, 0.01817861f, 0.01504620f, -0.00000000f, -0.01018351f, -0.00829341f, 0.00000000f, + 0.00534416f, 0.00421805f, -0.00000000f, -0.00254135f, -0.00195325f, -0.00000000f, 0.00119953f, 0.00100660f, + -0.00000000f +}; + +const double cu15[28][3] = +{ + /* xx/3, xx*xx/3, xx*xx*xx/3 xx v */ + /* 0:*/ { 0.0222222222, 0.0014814815, 0.0000987654 }, /* 1/15 */ + /* 1:*/ { 0.0444444444, 0.0059259259, 0.0007901235 }, /* 2/15 */ + /* 2:*/ { 0.0666666667, 0.0133333333, 0.0026666667 }, + /* 3:*/ { 0.0888888889, 0.0237037037, 0.0063209877 }, + /* 4:*/ { 0.1111111111, 0.0370370370, 0.0123456790 }, + /* 5:*/ { 0.1333333333, 0.0533333333, 0.0213333333 }, + /* 6:*/ { 0.1555555556, 0.0725925926, 0.0338765432 }, + /* 7:*/ { 0.1777777778, 0.0948148148, 0.0505679012 }, + /* 8:*/ { 0.2000000000, 0.1200000000, 0.0720000000 }, /* 9/15 */ + /* 9:*/ { 0.2222222222, 0.1481481481, 0.0987654321 }, /* 10/15 */ + /*10:*/ { 0.2444444444, 0.1792592593, 0.1314567901 }, + /*11:*/ { 0.2666666667, 0.2133333333, 0.1706666667 }, + /*12:*/ { 0.2888888889, 0.2503703704, 0.2169876543 }, + /*13:*/ { 0.3111111111, 0.2903703704, 0.2710123457 }, /* 14/15 */ + /*14:*/ { 0.3555555556, 0.3792592593, 0.4045432099 }, /* 16/15 */ + /*15:*/ { 0.3777777778, 0.4281481481, 0.4852345679 }, + /*16:*/ { 0.4000000000, 0.4800000000, 0.5760000000 }, /* 18/15 */ + /*17:*/ { 0.4222222222, 0.5348148148, 0.6774320988 }, + /*18:*/ { 0.4444444444, 0.5925925926, 0.7901234568 }, /* 20/15 */ + /*19:*/ { 0.4666666667, 0.6533333333, 0.9146666667 }, + /*20:*/ { 0.4888888889, 0.7170370370, 1.0516543210 }, + /*21:*/ { 0.5111111111, 0.7837037037, 1.2016790123 }, + /*22:*/ { 0.5333333333, 0.8533333333, 1.3653333333 }, + /*23:*/ { 0.5555555556, 0.9259259259, 1.5432098765 }, + /*24:*/ { 0.5777777778, 1.0014814815, 1.7359012346 }, + /*25:*/ { 0.6000000000, 1.0800000000, 1.9440000000 }, /* 27/15 */ + /*26:*/ { 0.6222222222, 1.1614814815, 2.1680987654 }, + /*27:*/ { 0.6444444444, 1.2459259259, 2.4087901235 }, /* 29/15 */ +}; + +const double cu4[6][3] = +{ + /* xx/3, xx*xx/3, xx*xx*xx/3 */ + /* 0:*/ { 0.0833333333, 0.0208333333, 0.0052083333 }, /*0.25*/ + /* 1:*/ { 0.1666666667, 0.0833333333, 0.0416666667 }, /*0.5*/ + /* 2:*/ { 0.2500000000, 0.1875000000, 0.1406250000 }, /*0.75*/ + /* 3:*/ { 0.4166666667, 0.5208333333, 0.6510416667 }, /*1.25*/ + /* 4:*/ { 0.5000000000, 0.7500000000, 1.1250000000 }, /*1.5*/ + /* 5:*/ { 0.5833333333, 1.0208333333, 1.7864583333 } /*1.75*/ +}; + +const int16_t ct2[7][13] = +{ + /* accepted configurations */ + /*input 12.8, output :*/ + /*8*/ {30, 22, 30, 16, 25, 30, 19, 30, 30, 0, 8, 4, 15}, + /*16*/ {25, 22, 19, 16, 16, 0, 0, 0, 12, 1, 4, 4, 15}, + /*32*/ {19, 16, 19, 16, 16, 0, 0, 0, 6, 2, 2, 4, 15}, + /*48*/ {17, 14, 15, 16, 16, 0, 0, 0, 4, 3, 4, 4, 15}, + + /*input 16, output :*/ + /*12*/ { 9, 3, 4, 5, 9, 0, 0, 0, 5, 0, 5, 5, 4}, + /*32*/ { 4, 4, 4, 4, 4, 0, 0, 0, 2, 1, 1, 4, 4}, + /*48*/ {18, 18, 18, 18, 18, 0, 0, 0, 5, 2, 1, 4, 15}, +}; + + +/*----------------------------------------------------------------------------------* + * hp filter for filtering random part of excitation in frame error concealment + * Used in lib_dec\syn_bfi.c + *----------------------------------------------------------------------------------*/ + +const float h_high[5] = { -0.0125f, -0.1090f, 0.7813f, -0.1090f, -0.0125f }; + +const float sincos_t_rad3[T_SIN_PI_2+1] = +{ + 0.000000000000000f, 0.004090604026235f, 0.008181139603937f, 0.012271538285720f, 0.016361731626487f, 0.020451651184577f, 0.024541228522912f, 0.028630395210139f, + 0.032719082821776f, 0.036807222941359f, 0.040894747161583f, 0.044981587085452f, 0.049067674327418f, 0.053152940514528f, 0.057237317287569f, 0.061320736302209f, + 0.065403129230143f, 0.069484427760237f, 0.073564563599667f, 0.077643468475068f, 0.081721074133668f, 0.085797312344440f, 0.089872114899235f, 0.093945413613929f, + 0.098017140329561f, 0.102087226913474f, 0.106155605260457f, 0.110222207293883f, 0.114286964966846f, 0.118349810263305f, 0.122410675199216f, 0.126469491823675f, + 0.130526192220052f, 0.134580708507126f, 0.138632972840227f, 0.142682917412363f, 0.146730474455362f, 0.150775576241001f, 0.154818155082141f, 0.158858143333861f, + 0.162895473394589f, 0.166930077707230f, 0.170961888760301f, 0.174990839089060f, 0.179016861276633f, 0.183039887955141f, 0.187059851806832f, 0.191076685565203f, + 0.195090322016128f, 0.199100693998982f, 0.203107734407763f, 0.207111376192219f, 0.211111552358965f, 0.215108195972610f, 0.219101240156870f, 0.223090618095693f, + 0.227076263034373f, 0.231058108280671f, 0.235036087205927f, 0.239010133246176f, 0.242980179903264f, 0.246946160745958f, 0.250908009411060f, 0.254865659604515f, + 0.258819045102521f, 0.262768099752639f, 0.266712757474898f, 0.270652952262902f, 0.274588618184932f, 0.278519689385053f, 0.282446100084213f, 0.286367784581343f, + 0.290284677254462f, 0.294196712561769f, 0.298103825042740f, 0.302005949319228f, 0.305903020096553f, 0.309794972164597f, 0.313681740398891f, 0.317563259761712f, + 0.321439465303162f, 0.325310292162263f, 0.329175675568039f, 0.333035550840599f, 0.336889853392220f, 0.340738518728429f, 0.344581482449080f, 0.348418680249435f, + 0.352250047921233f, 0.356075521353776f, 0.359895036534988f, 0.363708529552498f, 0.367515936594704f, 0.371317193951837f, 0.375112238017038f, 0.378901005287410f, + 0.382683432365090f, 0.386459455958303f, 0.390229012882428f, 0.393992040061048f, 0.397748474527011f, 0.401498253423481f, 0.405241314004990f, 0.408977593638489f, + 0.412707029804395f, 0.416429560097637f, 0.420145122228702f, 0.423853654024676f, 0.427555093430282f, 0.431249378508924f, 0.434936447443717f, 0.438616238538528f, + 0.442288690219001f, 0.445953741033595f, 0.449611329654607f, 0.453261394879198f, 0.456903875630421f, 0.460538710958240f, 0.464165840040552f, 0.467785202184201f, + 0.471396736825998f, 0.475000383533732f, 0.478596082007181f, 0.482183772079123f, 0.485763393716340f, 0.489334887020625f, 0.492898192229784f, 0.496453249718633f, + 0.500000000000000f, 0.503538383725718f, 0.507068341687617f, 0.510589814818519f, 0.514102744193222f, 0.517607071029487f, 0.521102736689023f, 0.524589682678469f, + 0.528067850650368f, 0.531537182404149f, 0.534997619887097f, 0.538449105195327f, 0.541891580574752f, 0.545324988422046f, 0.548749271285616f, 0.552164371866554f, + 0.555570233019602f, 0.558966797754107f, 0.562354009234973f, 0.565731810783613f, 0.569100145878898f, 0.572458958158102f, 0.575808191417845f, 0.579147789615035f, + 0.582477696867802f, 0.585797857456439f, 0.589108215824328f, 0.592408716578875f, 0.595699304492433f, 0.598979924503229f, 0.602250521716282f, 0.605511041404326f, + 0.608761429008721f, 0.612001630140370f, 0.615231590580627f, 0.618451256282204f, 0.621660573370077f, 0.624859488142386f, 0.628047947071334f, 0.631225896804083f, + 0.634393284163645f, 0.637550056149777f, 0.640696159939861f, 0.643831542889791f, 0.646956152534857f, 0.650069936590618f, 0.653172842953777f, 0.656264819703058f, + 0.659345815100069f, 0.662415777590172f, 0.665474655803342f, 0.668522398555031f, 0.671558954847018f, 0.674584273868271f, 0.677598304995789f, 0.680600997795453f, + 0.683592302022871f, 0.686572167624217f, 0.689540544737067f, 0.692497383691237f, 0.695442635009612f, 0.698376249408973f, 0.701298177800824f, 0.704208371292213f, + 0.707106781186547f, 0.709993358984412f, 0.712868056384380f, 0.715730825283819f, 0.718581617779698f, 0.721420386169390f, 0.724247082951467f, 0.727061660826497f, + 0.729864072697836f, 0.732654271672413f, 0.735432211061519f, 0.738197844381584f, 0.740951125354959f, 0.743692007910687f, 0.746420446185274f, 0.749136394523459f, + 0.751839807478977f, 0.754530639815318f, 0.757208846506485f, 0.759874382737746f, 0.762527203906388f, 0.765167265622459f, 0.767794523709512f, 0.770408934205345f, + 0.773010453362737f, 0.775599037650177f, 0.778174643752598f, 0.780737228572094f, 0.783286749228650f, 0.785823163060853f, 0.788346427626606f, 0.790856500703845f, + 0.793353340291235f, 0.795836904608884f, 0.798307152099031f, 0.800764041426753f, 0.803207531480645f, 0.805637581373517f, 0.808054150443073f, 0.810457198252595f, + 0.812846684591615f, 0.815222569476594f, 0.817584813151584f, 0.819933376088899f, 0.822268218989775f, 0.824589302785025f, 0.826896588635696f, 0.829190037933717f, + 0.831469612302545f, 0.833735273597809f, 0.835986983907947f, 0.838224705554838f, 0.840448401094438f, 0.842658033317402f, 0.844853565249707f, 0.847034960153274f, + 0.849202181526579f, 0.851355193105265f, 0.853493958862750f, 0.855618443010829f, 0.857728610000272f, 0.859824424521420f, 0.861905851504774f, 0.863972856121587f, + 0.866025403784439f, 0.868063460147822f, 0.870086991108711f, 0.872095962807139f, 0.874090341626759f, 0.876070094195407f, 0.878035187385663f, 0.879985588315404f, + 0.881921264348355f, 0.883842183094633f, 0.885748312411290f, 0.887639620402854f, 0.889516075421856f, 0.891377646069366f, 0.893224301195515f, 0.895056009900018f, + 0.896872741532688f, 0.898674465693954f, 0.900461152235364f, 0.902232771260093f, 0.903989293123443f, 0.905730688433339f, 0.907456928050819f, 0.909167983090522f, + 0.910863824921176f, 0.912544425166069f, 0.914209755703531f, 0.915859788667400f, 0.917494496447491f, 0.919113851690058f, 0.920717827298248f, 0.922306396432559f, + 0.923879532511287f, 0.925437209210971f, 0.926979400466833f, 0.928506080473216f, 0.930017223684012f, 0.931512804813095f, 0.932992798834739f, 0.934457180984039f, + 0.935905926757326f, 0.937339011912575f, 0.938756412469813f, 0.940158104711519f, 0.941544065183021f, 0.942914270692887f, 0.944268698313317f, 0.945607325380521f, + 0.946930129495106f, 0.948237088522441f, 0.949528180593037f, 0.950803384102905f, 0.952062677713924f, 0.953306040354194f, 0.954533451218389f, 0.955744889768105f, + 0.956940335732209f, 0.958119769107168f, 0.959283170157394f, 0.960430519415566f, 0.961561797682962f, 0.962676986029777f, 0.963776065795440f, 0.964859018588927f, + 0.965925826289068f, 0.966976471044852f, 0.968010935275723f, 0.969029201671875f, 0.970031253194544f, 0.971017073076290f, 0.971986644821279f, 0.972939952205560f, + 0.973876979277334f, 0.974797710357222f, 0.975702130038528f, 0.976590223187499f, 0.977461974943572f, 0.978317370719628f, 0.979156396202234f, 0.979979037351883f, + 0.980785280403230f, 0.981575111865320f, 0.982348518521816f, 0.983105487431216f, 0.983846005927077f, 0.984570061618220f, 0.985277642388941f, 0.985968736399212f, + 0.986643332084879f, 0.987301418157858f, 0.987942983606322f, 0.988568017694885f, 0.989176509964781f, 0.989768450234042f, 0.990343828597665f, 0.990902635427780f, + 0.991444861373810f, 0.991970497362629f, 0.992479534598710f, 0.992971964564277f, 0.993447779019444f, 0.993906970002356f, 0.994349529829318f, 0.994775451094928f, + 0.995184726672197f, 0.995577349712672f, 0.995953313646548f, 0.996312612182778f, 0.996655239309180f, 0.996981189292537f, 0.997290456678690f, 0.997583036292635f, + 0.997858923238603f, 0.998118112900149f, 0.998360600940223f, 0.998586383301244f, 0.998795456205172f, 0.998987816153567f, 0.999163459927649f, 0.999322384588350f, + 0.999464587476366f, 0.999590066212200f, 0.999698818696204f, 0.999790843108610f, 0.999866137909562f, 0.999924701839145f, 0.999966533917401f, 0.999991633444351f, + 1.000000000000000f +}; + +/*----------------------------------------------------------------------------------* + * TCX + *----------------------------------------------------------------------------------*/ + +const float gain_corr_fac[3] = {1.0208f,1.0103f,1.0052f}; /*pow(10,2^(-n-2)/28)*/ +const float gain_corr_inv_fac[3] = {0.9797f,0.9898f,0.9949f};/*pow(10,-2^(-n-2)/28)*/ + +const float inter4_2tcx2[4][4] = +{ + { 0.2325402f, 0.5349195f, 0.2325402f, 0.0000000f }, + { 0.1353017f, 0.5094465f, 0.3400065f, 0.0152453f }, + { 0.0608774f, 0.4391226f, 0.4391226f, 0.0608774f }, + { 0.0152453f, 0.3400065f, 0.5094465f, 0.1353017f } +}; + +const float inter6_2tcx2[6][4] = +{ + { 0.2241379f, 0.5517241f, 0.2241379f, 0.0000000f }, + { 0.1562044f, 0.5388595f, 0.2990011f, 0.0059349f }, + { 0.0991379f, 0.5018346f, 0.3750000f, 0.0240275f }, + { 0.0549361f, 0.4450639f, 0.4450639f, 0.0549361f }, + { 0.0240275f, 0.3750000f, 0.5018346f, 0.0991379f }, + { 0.0059349f, 0.2990011f, 0.5388595f, 0.1562044f } +}; +const float inter_core_12_8kHz_output_8kHz[] = +{ + 0.5349196f, 0.5094466f, 0.4391227f, 0.3400065f, + 0.2325402f, 0.1353016f, 0.0608773f, 0.0152453f, + 0.0000000f +}; +const float inter_core_12_8kHz_output_16kHz[] = +{ + 0.4279357f, 0.4147958f, 0.3774199f, 0.3214508f, + 0.2548195f, 0.1860321f, 0.1225801f, 0.0699165f, + 0.0312127f, 0.0078047f, 0.0000000f, 0.0000000f, + 0.0000000f +}; +const float inter_core_12_8kHz_output_32kHz[] = +{ + 0.2139679f, 0.2123089f, 0.2073979f, 0.1994284f, + 0.1887100f, 0.1756491f, 0.1607254f, 0.1444646f, + 0.1274097f, 0.1100939f, 0.0930161f, 0.0766219f, + 0.0612900f, 0.0473253f, 0.0349583f, 0.0243509f, + 0.0156063f, 0.0087817f, 0.0039024f, 0.0009753f, + 0.0000000f +}; +const float inter_core_12_8kHz_output_48kHz[] = +{ + 0.1426452f, 0.1421528f, 0.1406841f, 0.1382653f, + 0.1349386f, 0.1307618f, 0.1258066f, 0.1201564f, + 0.1139041f, 0.1071503f, 0.1000000f, 0.0925607f, + 0.0849398f, 0.0772420f, 0.0695677f, 0.0620107f, + 0.0546572f, 0.0475844f, 0.0408600f, 0.0345417f, + 0.0286774f, 0.0233055f, 0.0184558f, 0.0141503f, + 0.0104042f, 0.0072274f, 0.0046257f, 0.0026016f, + 0.0011560f, 0.0002890f, 0.0000000f, 0.0000000f, + 0.0000000f +}; +const float inter_core_16kHz_output_8kHz[] = +{ + 0.5517241f, 0.5388595f, 0.5018346f, 0.4450639f, 0.3750000f, 0.2990011f, + 0.2241379f, 0.1562044f, 0.0991379f, 0.0549361f, 0.0240275f, 0.0059349f, + 0.0000000f +}; +const float inter_core_16kHz_output_16kHz[] = +{ + 0.5517241f, 0.5388595f, 0.5018346f, 0.4450639f, 0.3750000f, 0.2990011f, + 0.2241379f, 0.1562044f, 0.0991379f, 0.0549361f, 0.0240275f, 0.0059349f, + 0.0000000f +}; +const float inter_core_16kHz_output_32kHz[] = +{ + 0.2758621f, 0.2742414f, 0.2694298f, 0.2615753f, 0.2509173f, 0.2377748f, + 0.2225320f, 0.2056203f, 0.1875000f, 0.1686403f, 0.1495006f, 0.1305132f, + 0.1120690f, 0.0945060f, 0.0781022f, 0.0630725f, 0.0495690f, 0.0376861f, + 0.0274680f, 0.0189188f, 0.0120137f, 0.0067120f, 0.0029675f, 0.0007394f, + 0.0000000f +}; +const float inter_core_16kHz_output_48kHz[] = +{ + 0.1839080f, 0.1834272f, 0.1819912f, 0.1796198f, 0.1763457f, 0.1722133f, + 0.1672782f, 0.1616061f, 0.1552712f, 0.1483546f, 0.1409433f, 0.1331275f, + 0.1250000f, 0.1166535f, 0.1081796f, 0.0996670f, 0.0912002f, 0.0828579f, + 0.0747126f, 0.0668293f, 0.0592649f, 0.0520681f, 0.0452794f, 0.0389306f, + 0.0330460f, 0.0276422f, 0.0227295f, 0.0183120f, 0.0143894f, 0.0109575f, + 0.0080092f, 0.0055360f, 0.0035286f, 0.0019783f, 0.0008771f, 0.0002189f, + 0.0000000f +}; +const float inter_core_25_6kHz_output_8kHz[] = +{ + 0.5349196f, 0.5094466f, 0.4391227f, 0.3400065f, + 0.2325402f, 0.1353016f, 0.0608773f, 0.0152453f, + 0.0000000f +}; +const float inter_core_25_6kHz_output_16kHz[] = +{ + 0.5349196f, 0.5094466f, 0.4391227f, 0.3400065f, + 0.2325402f, 0.1353016f, 0.0608773f, 0.0152453f, + 0.0000000f +}; +const float inter_core_25_6kHz_output_32kHz[] = +{ + 0.4279357f, 0.4147958f, 0.3774199f, 0.3214508f, + 0.2548195f, 0.1860321f, 0.1225801f, 0.0699165f, + 0.0312127f, 0.0078047f, 0.0000000f, 0.0000000f, + 0.0000000f +}; +const float inter_core_25_6kHz_output_48kHz[] = +{ + 0.2852965f, 0.2813740f, 0.2698819f, 0.2516166f, + 0.2278099f, 0.2000000f, 0.1698781f, 0.1391327f, + 0.1093111f, 0.0817166f, 0.0573517f, 0.0369093f, + 0.0208069f, 0.0092505f, 0.0023118f, 0.0000000f, + 0.0000000f +}; + +const TCX_LTP_FILTER tcxLtpFilters[12] = +{ + { inter_core_12_8kHz_output_8kHz, 2 }, + { inter_core_12_8kHz_output_16kHz, 3 }, + { inter_core_12_8kHz_output_32kHz, 5 }, + { inter_core_12_8kHz_output_48kHz, 8 }, + { inter_core_16kHz_output_8kHz, 2 }, + { inter_core_16kHz_output_16kHz, 2 }, + { inter_core_16kHz_output_32kHz, 4 }, + { inter_core_16kHz_output_48kHz, 6 }, + { inter_core_25_6kHz_output_8kHz, 2 }, + { inter_core_25_6kHz_output_16kHz, 2 }, + { inter_core_25_6kHz_output_32kHz, 3 }, + { inter_core_25_6kHz_output_48kHz, 4 }, +}; + + +const SCALE_TCX_SETUP scaleTcxTable[SIZE_SCALE_TABLE_TCX] = +{ + { 0, 0, 8000, 0.67f }, + { 0, 8000, 9600, 0.70f }, + { 0, 9600, 13200, 0.76f }, + { 0, 13200, 16400, 0.86f }, + { 0, 16400, 24400, 0.90f }, + { 0, 24400, 64000, 0.96f }, + + { 1, 0, 8000, 1.f }, + { 1, 8000, 9600, 1.f }, + { 1, 9600, 13200, 1.f }, + { 1, 13200, 16400, 0.85f /*0.85f*/ }, + { 1, 16400, 24400, 0.88f /*0.90*/}, + { 1, 24400, 32000, 0.90f /*0.90*/}, + { 1, 32000, 32400, 0.95f /*0.91f*/}, +}; + + +/*----------------------------------------------------------------------------------* + * Arithmetic coder + *----------------------------------------------------------------------------------*/ + +const uint8_t ari_lookup_s17_LC[4096] = +{ + 0x01,0x04,0x29,0x13,0x0A,0x0D,0x05,0x10, + 0x10,0x0D,0x00,0x0D,0x2A,0x2A,0x22,0x25, + 0x25,0x28,0x2B,0x2E,0x31,0x34,0x34,0x0E, + 0x21,0x21,0x21,0x36,0x38,0x38,0x36,0x10, + 0x10,0x08,0x09,0x0B,0x0C,0x0E,0x0E,0x21, + 0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x10, + 0x10,0x1A,0x09,0x1D,0x0C,0x20,0x20,0x21, + 0x36,0x36,0x36,0x36,0x36,0x0A,0x36,0x16, + 0x1A,0x1A,0x2D,0x0C,0x20,0x20,0x21,0x21, + 0x21,0x36,0x38,0x38,0x38,0x38,0x36,0x16, + 0x16,0x1A,0x3F,0x1F,0x20,0x21,0x24,0x06, + 0x36,0x36,0x36,0x38,0x00,0x0A,0x36,0x22, + 0x3E,0x3E,0x3F,0x30,0x20,0x21,0x06,0x06, + 0x06,0x38,0x36,0x36,0x36,0x26,0x36,0x1C, + 0x1C,0x3E,0x3F,0x02,0x20,0x21,0x06,0x36, + 0x36,0x38,0x0A,0x0A,0x0A,0x0A,0x05,0x16, + 0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16, + 0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16, + 0x16,0x3F,0x3F,0x0E,0x35,0x14,0x38,0x38, + 0x05,0x05,0x05,0x0D,0x13,0x13,0x1C,0x16, + 0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F, + 0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F, + 0x3F,0x3F,0x3F,0x20,0x35,0x14,0x27,0x38, + 0x38,0x0A,0x2A,0x2A,0x2A,0x16,0x05,0x10, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x3F,0x02,0x0E,0x02,0x14,0x13,0x0A, + 0x0D,0x0D,0x0D,0x13,0x00,0x00,0x16,0x19, + 0x19,0x3F,0x3F,0x02,0x02,0x14,0x38,0x36, + 0x0A,0x0A,0x0A,0x0D,0x0D,0x0D,0x1C,0x22, + 0x22,0x3F,0x3F,0x02,0x17,0x26,0x26,0x1C, + 0x1C,0x10,0x16,0x16,0x16,0x19,0x22,0x25, + 0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39, + 0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39, + 0x39,0x39,0x15,0x2C,0x2E,0x2E,0x2E,0x31, + 0x31,0x31,0x31,0x31,0x31,0x31,0x34,0x39, + 0x39,0x39,0x15,0x2C,0x2E,0x2E,0x0C,0x34, + 0x34,0x34,0x36,0x36,0x36,0x36,0x36,0x36, + 0x36,0x39,0x15,0x3C,0x2E,0x31,0x34,0x34, + 0x31,0x31,0x31,0x1F,0x1E,0x1E,0x1E,0x1E, + 0x1E,0x39,0x28,0x2C,0x2E,0x31,0x37,0x34, + 0x01,0x01,0x01,0x01,0x01,0x00,0x39,0x39, + 0x39,0x39,0x39,0x2C,0x2E,0x31,0x1E,0x34, + 0x34,0x35,0x01,0x01,0x01,0x01,0x01,0x01, + 0x01,0x39,0x39,0x3C,0x2E,0x03,0x07,0x34, + 0x34,0x0F,0x39,0x39,0x39,0x39,0x39,0x39, + 0x39,0x39,0x39,0x15,0x2B,0x31,0x1E,0x34, + 0x34,0x01,0x39,0x39,0x39,0x39,0x39,0x39, + 0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39, + 0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39, + 0x39,0x39,0x39,0x2C,0x39,0x2F,0x2E,0x2E, + 0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E, + 0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E, + 0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E, + 0x2E,0x39,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E, + 0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E, + 0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E, + 0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E, + 0x1E,0x1E,0x1E,0x1E,0x1E,0x0F,0x2E,0x2E, + 0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E, + 0x2E,0x2E,0x39,0x15,0x39,0x39,0x39,0x39, + 0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39, + 0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39, + 0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39, + 0x19,0x1C,0x16,0x22,0x22,0x25,0x25,0x25, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x3E,0x3E,0x2F,0x3D,0x21,0x36,0x38,0x05, + 0x0D,0x0D,0x0D,0x10,0x16,0x16,0x16,0x25, + 0x2D,0x2D,0x37,0x3D,0x33,0x38,0x05,0x0D, + 0x0D,0x10,0x16,0x16,0x16,0x16,0x16,0x25, + 0x2F,0x2F,0x30,0x12,0x06,0x05,0x0A,0x0D, + 0x0D,0x10,0x16,0x16,0x16,0x22,0x22,0x25, + 0x1F,0x1F,0x32,0x3B,0x29,0x0A,0x0A,0x10, + 0x16,0x16,0x16,0x16,0x22,0x22,0x22,0x25, + 0x02,0x02,0x14,0x29,0x05,0x0D,0x2A,0x10, + 0x16,0x16,0x16,0x22,0x22,0x22,0x22,0x25, + 0x35,0x35,0x14,0x29,0x0A,0x2A,0x2A,0x10, + 0x16,0x16,0x16,0x22,0x22,0x22,0x22,0x25, + 0x17,0x17,0x26,0x05,0x0D,0x10,0x10,0x16, + 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x25, + 0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26, + 0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26, + 0x26,0x26,0x26,0x1C,0x0D,0x16,0x16,0x16, + 0x22,0x22,0x22,0x22,0x22,0x22,0x25,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x26,0x1C,0x1C,0x10,0x16,0x16,0x22, + 0x22,0x22,0x22,0x22,0x22,0x25,0x25,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x1C,0x1C,0x1C,0x16,0x16,0x16,0x22, + 0x22,0x22,0x22,0x25,0x25,0x25,0x25,0x00, + 0x00,0x26,0x1C,0x1C,0x16,0x16,0x16,0x22, + 0x22,0x22,0x22,0x25,0x25,0x25,0x25,0x00, + 0x16,0x16,0x16,0x16,0x16,0x22,0x22,0x22, + 0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x00, + 0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15, + 0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15, + 0x15,0x15,0x3C,0x1E,0x0F,0x06,0x27,0x2A, + 0x2A,0x10,0x16,0x16,0x16,0x16,0x16,0x22, + 0x2C,0x2C,0x0B,0x37,0x23,0x27,0x13,0x2A, + 0x10,0x10,0x10,0x16,0x16,0x16,0x16,0x22, + 0x1B,0x1B,0x1D,0x0F,0x24,0x13,0x13,0x2A, + 0x00,0x10,0x16,0x16,0x16,0x16,0x16,0x22, + 0x1F,0x1F,0x03,0x24,0x07,0x0A,0x0A,0x10, + 0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x22, + 0x22,0x35,0x06,0x27,0x13,0x2A,0x2A,0x10, + 0x16,0x16,0x16,0x16,0x16,0x22,0x22,0x22, + 0x22,0x06,0x27,0x27,0x13,0x2A,0x2A,0x10, + 0x16,0x16,0x16,0x16,0x16,0x16,0x22,0x22, + 0x22,0x05,0x0A,0x2A,0x2A,0x10,0x10,0x16, + 0x16,0x16,0x16,0x16,0x16,0x22,0x22,0x22, + 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, + 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, + 0x22,0x0D,0x2A,0x10,0x10,0x10,0x10,0x16, + 0x16,0x16,0x16,0x16,0x16,0x22,0x22,0x25, + 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10, + 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10, + 0x10,0x10,0x10,0x10,0x10,0x16,0x16,0x16, + 0x16,0x16,0x16,0x22,0x22,0x22,0x22,0x25, + 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10, + 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10, + 0x10,0x10,0x10,0x10,0x16,0x16,0x16,0x16, + 0x16,0x22,0x22,0x22,0x22,0x22,0x22,0x25, + 0x0D,0x0D,0x10,0x10,0x10,0x16,0x16,0x16, + 0x16,0x22,0x22,0x22,0x22,0x22,0x22,0x25, + 0x0D,0x0D,0x0D,0x0D,0x0D,0x10,0x10,0x16, + 0x16,0x16,0x16,0x22,0x22,0x22,0x22,0x25, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, + 0x11,0x11,0x11,0x3A,0x11,0x11,0x11,0x18, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, + 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x11,0x3A,0x11, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, + 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, + 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x18, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x18, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11,0x18, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x11,0x3A,0x3A,0x3A,0x11, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x11,0x11,0x11,0x18, + 0x00,0x11,0x3A,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x18, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x11,0x11,0x11,0x18,0x18,0x18,0x18, + 0x18,0x25,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x18, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x18, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x18, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x18, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x11,0x3A,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x18, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x18, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x3A,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x18,0x18, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x18,0x18, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x18,0x18,0x18,0x18, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x11,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x11,0x11,0x11,0x11, + 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11,0x11, + 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x11,0x11,0x11,0x11, + 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11,0x11, + 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x11,0x11,0x11,0x11, + 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x11,0x11,0x11, + 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x11,0x11,0x11,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x18, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x18, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x18, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x18, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x11,0x3A,0x11, + 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x11,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x11,0x11,0x3A,0x11, + 0x11,0x3A,0x3A,0x3A,0x11,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x11,0x11,0x11,0x3A,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x18,0x3A,0x3A,0x11,0x11,0x11,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x11,0x11,0x11,0x3A,0x11,0x11, + 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11,0x11, + 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x11,0x11,0x11,0x11, + 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11,0x11, + 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11,0x11, + 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11,0x11, + 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11,0x18, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x11,0x11,0x11,0x11,0x11,0x18, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x18, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, + 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x11,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x2A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x18, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, + 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, + 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, + 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, + 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, + 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, + 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, + 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, + 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A +}; + +const uint16_t ari_pk_s17_LC_ext[64][18] = +{ + { + 16384, 16368,16337,16231,16143,16115,16059,15916,15793,15710,15586,15472,15367,15302,15201,15107,15020, + 0 + }, + { + 16384, 8983, 8540, 8498, 8485, 4319, 3666, 3594, 3579, 2285, 1908, 1851, 1835, 1326, 1120, 1085, 1074, + 0 + }, + { + 16384, 12022,10039, 9520, 9346, 7347, 5335, 4648, 4382, 3815, 3083, 2728, 2562, 2363, 2050, 1869, 1777, + 0 + }, + { + 16384, 13429,11201,10562,10371, 8231, 5713, 4770, 4441, 3798, 2844, 2359, 2152, 1947, 1614, 1406, 1304, + 0 + }, + { + 16384, 13229,11403,10769,10529, 8415, 6431, 5645, 5311, 4448, 3547, 3176, 3001, 2617, 2181, 1984, 1886, + 0 + }, + { + 16384, 15168,13754,13120,12826,11553, 9705, 8723, 8227, 7675, 6762, 6180, 5842, 5585, 5141, 4816, 4607, + 0 + }, + { + 16384, 14625,12743,12034,11772,10059, 7706, 6652, 6223, 5594, 4594, 4023, 3742, 3501, 3089, 2818, 2664, + 0 + }, + { + 16384, 15275,13679,12951,12652,11158, 8852, 7652, 7121, 6406, 5242, 4542, 4196, 3894, 3398, 3063, 2864, + 0 + }, + { + 16384, 4860, 3338, 3214, 3193, 1428, 676, 571, 547, 356, 222, 189, 180, 139, 102, 89, 84, + 0 + }, + { + 16384, 8357, 5798, 5475, 5410, 3093, 1523, 1227, 1152, 849, 560, 470, 441, 370, 294, 261, 248, + 0 + }, + { + 16384, 15550,14350,13710,13387,12297,10541, 9493, 8929, 8354, 7371, 6696, 6299, 6008, 5491, 5107, 4856, + 0 + }, + { + 16384, 10346, 7298, 6933, 6865, 4052, 1863, 1471, 1381, 1055, 673, 536, 491, 429, 339, 293, 273, + 0 + }, + { + 16384, 11652, 8699, 8030, 7839, 5667, 3460, 2766, 2532, 2093, 1542, 1301, 1203, 1070, 893, 802, 759, + 0 + }, + { + 16384, 15639,14601,14037,13729,12847,11421,10520, 9978, 9521, 8720, 8136, 7750, 7493, 7033, 6676, 6426, + 0 + }, + { + 16384, 12427, 9590, 8715, 8386, 6641, 4708, 3886, 3515, 3071, 2490, 2198, 2052, 1886, 1670, 1549, 1478, + 0 + }, + { + 16384, 13605,10996,10363,10183, 7802, 5032, 4124, 3840, 3267, 2403, 1976, 1804, 1633, 1345, 1171, 1086, + 0 + }, + { + 16384, 15936,15224,14759,14464,13808,12678,11866,11331,10910,10150, 9549, 9122, 8853, 8352, 7938, 7626, + 0 + }, + { + 16384, 16383,16382,14829,14138,14137,14136,12895,12272,10935, 9788, 9082, 8674, 8073, 7508, 7118, 6867, + 0 + }, + { + 16384, 13888,11474,10840,10662, 8335, 5585, 4695, 4411, 3801, 2917, 2506, 2337, 2150, 1847, 1672, 1581, + 0 + }, + { + 16384, 15463,14162,13504,13196,11977,10063, 8978, 8429, 7811, 6768, 6088, 5705, 5406, 4882, 4504, 4266, + 0 + }, + { + 16384, 13764,11941,11367,11151, 9312, 7171, 6301, 5943, 5335, 4430, 3942, 3708, 3466, 3074, 2819, 2679, + 0 + }, + { + 16384, 5179, 3300, 3206, 3197, 1220, 374, 303, 293, 171, 81, 63, 59, 44, 29, 24, 22, + 0 + }, + { + 16384, 16026,15468,15096,14842,14329,13447,12790,12322,11985,11367,10860,10477,10248, 9811, 9443, 9148, + 0 + }, + { + 16384, 12809,11291,10848,10649, 8976, 7199, 6506, 6196, 5657, 4887, 4451, 4219, 3974, 3590, 3365, 3218, + 0 + }, + { + 16384, 16383,16382,15744,15348,15347,15346,14714,14288,13688,13097,12652,12328,11967,11584,11278,11045, + 0 + }, + { + 16384, 15415,14987,14866,14806,13751,13046,12818,12709,12187,11720,11527,11427,11096,10759,10601,10510, + 0 + }, + { + 16384, 5926, 4280, 4090, 4053, 2138, 1120, 947, 903, 632, 413, 353, 334, 264, 198, 174, 166, + 0 + }, + { + 16384, 9206, 6640, 6345, 6291, 3683, 1772, 1423, 1342, 1024, 652, 515, 467, 406, 314, 267, 245, + 0 + }, + { + 16384, 15086,13966,13505,13271,12238,10875,10157, 9763, 9331, 8629, 8155, 7845, 7608, 7198, 6892, 6670, + 0 + }, + { + 16384, 11427, 8599, 8132, 8027, 5406, 3012, 2429, 2270, 1823, 1244, 1006, 920, 814, 654, 564, 524, + 0 + }, + { + 16384, 11561, 8220, 7814, 7737, 4780, 2215, 1731, 1621, 1279, 830, 657, 599, 532, 424, 366, 339, + 0 + }, + { + 16384, 11649, 9374, 8867, 8724, 6398, 4154, 3470, 3253, 2718, 2010, 1695, 1570, 1412, 1172, 1042, 980, + 0 + }, + { + 16384, 13021,10503, 9726, 9443, 7520, 5271, 4369, 4016, 3495, 2741, 2365, 2181, 1990, 1719, 1561, 1478, + 0 + }, + { + 16384, 13815,11388,10605,10316, 8467, 6133, 5175, 4782, 4255, 3466, 3063, 2864, 2688, 2408, 2229, 2125, + 0 + }, + { + 16384, 16175,15807,15536,15338,15006,14402,13919,13549,13312,12871,12491,12182,12010,11681,11390,11143, + 0 + }, + { + 16384, 14310,12047,11336,11110, 9065, 6381, 5318, 4938, 4279, 3272, 2732, 2499, 2284, 1920, 1693, 1574, + 0 + }, + { + 16384, 14765,12824,12096,11834,10003, 7429, 6282, 5841, 5145, 4022, 3402, 3123, 2868, 2426, 2150, 2003, + 0 + }, + { + 16384, 16295,16127,15943,15802,15650,15360,15059,14816,14668,14401,14162,13954,13839,13634,13443,13275, + 0 + }, + { + 16384, 14182,12821,12340,12120,10698, 9040, 8284, 7908, 7378, 6549, 6053, 5772, 5520, 5080, 4785, 4597, + 0 + }, + { + 16384, 15164,13583,12892,12600,11161, 8997, 7888, 7386, 6744, 5673, 5015, 4673, 4391, 3898, 3555, 3349, + 0 + }, + { + 16384, 3758, 2571, 2481, 2467, 988, 478, 412, 397, 245, 154, 133, 127, 95, 69, 61, 58, + 0 + }, + { + 16384, 14805,13193,12553,12285,10706, 8596, 7623, 7178, 6542, 5563, 4996, 4703, 4426, 3967, 3662, 3482, + 0 + }, + { + 16384, 15787,14870,14320,14005,13147,11705,10747,10171, 9651, 8735, 8068, 7629, 7332, 6785, 6361, 6061, + 0 + }, + { + 16384, 7111, 4622, 4304, 4233, 2346, 1174, 938, 870, 659, 455, 389, 365, 316, 260, 236, 226, + 0 + }, + { + 16384, 7146, 4703, 4532, 4512, 2078, 740, 583, 556, 371, 201, 153, 141, 118, 87, 72, 66, + 0 + }, + { + 16384, 9593, 7184, 6853, 6790, 4144, 2206, 1832, 1745, 1320, 878, 741, 697, 599, 476, 424, 401, + 0 + }, + { + 16384, 9209, 5969, 5479, 5351, 3346, 1763, 1382, 1261, 1017, 733, 622, 578, 520, 446, 410, 392, + 0 + }, + { + 16384, 11324, 8681, 8252, 8159, 5450, 3114, 2606, 2473, 1987, 1412, 1211, 1142, 1017, 847, 765, 730, + 0 + }, + { + 16384, 12663,10073, 9527, 9392, 6827, 4204, 3489, 3286, 2713, 1966, 1666, 1554, 1400, 1172, 1051, 994, + 0 + }, + { + 16384, 10413, 7096, 6340, 6115, 4393, 2704, 2156, 1947, 1634, 1254, 1091, 1010, 925, 805, 742, 707, + 0 + }, + { + 16384, 13337,11073,10477,10306, 8045, 5534, 4705, 4438, 3804, 2942, 2530, 2360, 2164, 1850, 1668, 1574, + 0 + }, + { + 16384, 14323,12104,11391,11156, 9183, 6649, 5649, 5287, 4676, 3778, 3302, 3089, 2886, 2548, 2341, 2223, + 0 + }, + { + 16384, 11646, 8435, 7504, 7150, 5603, 3882, 3170, 2853, 2487, 2029, 1791, 1666, 1549, 1386, 1288, 1231, + 0 + }, + { + 16384, 13147,11339,10752,10524, 8775, 6682, 5776, 5398, 4813, 3908, 3406, 3154, 2933, 2554, 2310, 2176, + 0 + }, + { + 16384, 14551,12495,11707,11356, 9962, 8005, 7006, 6500, 6034, 5298, 4839, 4575, 4381, 4057, 3825, 3673, + 0 + }, + { + 16384, 12395, 9526, 9032, 8925, 6130, 3448, 2813, 2649, 2144, 1489, 1231, 1142, 1020, 836, 738, 694, + 0 + }, + { + 16384, 14921,13187,12475,12164,10758, 8775, 7752, 7257, 6727, 5864, 5306, 5004, 4777, 4393, 4119, 3942, + 0 + }, + { + 16384, 2151, 1301, 1276, 1274, 315, 84, 70, 68, 32, 14, 11, 10, 7, 4, 3, 2, + 0 + }, + { + 16384, 16383,16382,13774,13091,13090,13089,11287,10713, 7917, 6052, 5265, 4947, 4161, 3534, 3199, 3039, + 0 + }, + { + 16384, 14374,12331,11688,11474, 9505, 6993, 5998, 5634, 4991, 4008, 3498, 3265, 3036, 2658, 2417, 2285, + 0 + }, + { + 16384, 8798, 5867, 5626, 5593, 2841, 1038, 807, 765, 538, 302, 234, 215, 182, 139, 119, 111, + 0 + }, + { + 16384, 13325,10612,10015, 9860, 7343, 4583, 3802, 3571, 3023, 2269, 1945, 1817, 1670, 1440, 1309, 1243, + 0 + }, + { + 16384, 7741, 5790, 5571, 5528, 3110, 1698, 1464, 1409, 1034, 704, 613, 585, 487, 381, 342, 327, + 0 + }, + { + 16384, 9664, 7506, 7059, 6917, 4820, 3136, 2640, 2455, 2000, 1504, 1297, 1217, 1073, 896, 815, 777, + 0 + } +}; + +const int16_t NumRatioBits[2][17] = +{ + /* NB */ + { + 5, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2 + }, + + /* WB */ + { + 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2 + } +}; + +const float Ratios_WB_2[32] = + /* 2 */ { 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 60, 64, 72 }; + +const float Ratios_WB_3[32] = + /* 3 */ { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 44, 48, 54, 60, 68, 78, 80 }; + +const float Ratios_WB_4[32] = + /* 4 */ { 1.5f, 2, 2.5f, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 48, 52, 54, 68 }; + +const float Ratios_WB_5[32] = + /* 5 */ { 1, 1.5f, 2, 2.5f, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 40, 44, 48, 54 }; + +const float Ratios_WB_6[32] = + /* 6 */ { 1, 1.5f, 2, 2.5f, 3, 3.5f, 4, 4.5f, 5, 5.5f, 6, 6.5f, 7, 7.5f, 8, 9, 10, 11, 12, 13, 14, 15, 16, 18, 20, 22, 24, 26, 28, 34, 40, 41 }; + +const float Ratios_WB_7[32] = + /* 7 */ { 1, 1.5f, 2, 2.5f, 3, 3.5f, 4, 4.5f, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22.5f, 24, 25, 27, 28, 30, 35 }; + +const float Ratios_WB_8[16] = + /* 8 */ { 0.5f, 1, 1.5f, 2, 2.5f, 3, 3.5f, 4, 4.5f, 5, 5.5f, 6, 7, 8, 9, 10 }; + +const float Ratios_WB_9[16] = + /* 9 */ { 1, 2, 2.5f, 3, 4, 5, 6, 7, 8, 9, 10, 12, 15, 16, 18, 27 }; + +const float Ratios_WB_10[16] = + /* 10 */ { 1, 1.5f, 2, 2.5f, 3, 3.5f, 4, 5, 6, 8, 10, 15, 18, 22, 24, 26 }; + +const float Ratios_WB_11[16] = + /* 11 */ { 1, 1.5f, 2, 2.5f, 3, 3.5f, 4, 5, 6, 8, 10, 12, 13, 14, 18, 21 }; + +const float Ratios_WB_12[16] = + /* 12 */ { 0.5f, 1, 1.5f, 2, 2.5f, 3, 4, 5, 6, 8, 9, 11, 12, 13.5f, 16, 20 }; + +const float Ratios_WB_13[16] = + /* 13 */ { 0.5f, 1, 1.5f, 2, 2.5f, 3, 4, 5, 6, 7, 8, 10, 11, 12, 14, 20 }; + +const float Ratios_WB_14[16] = + /* 14 */ { 0.5f, 1, 1.5f, 2, 2.5f, 3, 4, 4.5f, 6, 7.5f, 9, 10, 12, 14, 15, 18 }; + +const float Ratios_WB_15[16] = + /* 15 */ { 0.5f, 1, 1.25f, 1.5f, 1.75f, 2, 2.5f, 3, 3.5f, 4, 4.5f, 5, 6, 8, 9, 14 }; + +const float Ratios_WB_16[4] = + /* 16 */ { 0.5f, 1, 2, 4 }; + +const float Ratios_WB_17[4] = + /* 17 */ { 1, 1.5f, 2, 4 }; + +const float Ratios_WB_18[4] = + /* 18 */ { 1, 2, 3, 4 }; + +const float Ratios_NB_2[32] = + /* 2 */ { 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 30, 32, 34, 36, 38, 40 }; + +const float Ratios_NB_3[16] = + /* 3 */ { 0.5f, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 16, 20, 24, 30 }; + +const float Ratios_NB_4[16] = + /* 4 */ { 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 16, 18, 20, 24, 30 }; + +const float Ratios_NB_5[16] = + /* 5 */ { 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 16, 18, 20, 24, 30 }; + +const float Ratios_NB_6[16] = + /* 6 */ { 2, 2.5f, 3, 3.5f, 4, 5, 6, 7, 8, 9, 10, 12, 14, 16, 18, 20 }; + +const float Ratios_NB_7[16] = + /* 7 */ { 1, 2, 2.5f, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 16, 18, 20 }; + +const float Ratios_NB_8[16] = + /* 8 */ { 1, 1.5f, 2, 2.5f, 3, 3.5f, 4, 4.5f, 5, 6, 7, 8, 9, 10, 12, 16 }; + +const float Ratios_NB_9[8] = + /* 9 */ { 1, 2, 3, 4, 5, 6, 8, 10 }; + +const float Ratios_NB_10[8] = + /* 10 */ { 1, 2, 3, 4, 5, 6, 8, 10 }; + +const float Ratios_NB_11[8] = + /* 11 */ { 1, 1.5f, 2, 3, 4, 5, 6, 8 }; + +const float Ratios_NB_12[8] = + /* 12 */ { 1, 2, 2.5f, 3, 4, 5, 6, 8 }; + +const float Ratios_NB_13[4] = + /* 13 */ { 1, 2, 3, 4 }; + +const float Ratios_NB_14[4] = + /* 14 */ { 1, 2, 4, 6 }; + +const float Ratios_NB_15[4] = + /* 15 */ { 1, 2, 3, 4 }; + +const float Ratios_NB_16[4] = + /* 16 */ { 1, 1.5f, 2, 4 }; + +const float Ratios_NB_17[4] = + /* 17 */ { 1, 1.5f, 2, 3 }; + +const float Ratios_NB_18[4] = + /* 18 */ { 0.5f, 1, 2, 3 }; + +const float * const Ratios[2][17] = +{ + /* NB */ + { + Ratios_NB_2, + Ratios_NB_3, + Ratios_NB_4, + Ratios_NB_5, + Ratios_NB_6, + Ratios_NB_7, + Ratios_NB_8, + Ratios_NB_9, + Ratios_NB_10, + Ratios_NB_11, + Ratios_NB_12, + Ratios_NB_13, + Ratios_NB_14, + Ratios_NB_15, + Ratios_NB_16, + Ratios_NB_17, + Ratios_NB_18 + }, + + /* WB */ + { + Ratios_WB_2, + Ratios_WB_3, + Ratios_WB_4, + Ratios_WB_5, + Ratios_WB_6, + Ratios_WB_7, + Ratios_WB_8, + Ratios_WB_9, + Ratios_WB_10, + Ratios_WB_11, + Ratios_WB_12, + Ratios_WB_13, + Ratios_WB_14, + Ratios_WB_15, + Ratios_WB_16, + Ratios_WB_17, + Ratios_WB_18 + } +}; + +#define QGC(x) FL2WORD16_SCALE(x, 4) +const Word16 qGains[2][1 << kTcxHmNumGainBits] = +{ + /* GC */ { QGC(0.75f) }, + /* VC */ { QGC(0.6f), QGC(1.4f), QGC(4.5f), QGC(10.0f) } +}; + + +/*----------------------------------------------------------------------------------* + * TNS + *----------------------------------------------------------------------------------*/ + +const struct TnsParameters tnsParametersIGF32kHz_LowBR[1] = +{ + { 600, 3, 1.85f, 0.075f, 4.4f } +}; + +const struct TnsParameters tnsParameters32kHz[2] = +{ + { 4500, 3, 1.35f, 0.0300f, 1.0f }, + { 600, 1, 1.75f, 0.0625f, 4.4f } +}; + +const struct TnsParameters tnsParameters32kHz_grouped[2] = +{ + { 8400, 3, 1.375f, 0.03125f, 1.0f }, + { 800, 3, 1.375f, 0.03125f, 1.0f } +}; + +const struct TnsParameters tnsParameters16kHz[1] = +{ + { 600, 3, 1.5f, 0.05f, 4.4f } +}; + +const struct TnsParameters tnsParameters16kHz_grouped[2] = +{ + { 4400, 3, 1.5f, 0.05f, 1.0f }, + { 800, 3, 1.5f, 0.05f, 1.0f } +}; + +const struct TnsParameters tnsParameters48kHz_grouped[2] = +{ + { 10400, 3, 1.375f, 0.03125f, 1.0f }, + { 800, 3, 1.375f, 0.03125f, 1.0f } +}; + +const struct TnsParameters tnsParameters32kHz_Stereo[2]= +{ + { 4500, 3, 1.35f, 0.0300f, 1.0f }, + { 600, 3, 1.75f, 0.0625f, 4.4f } +}; + +const float tnsAcfWindow[TNS_MAX_FILTER_ORDER] = +{ + 0.997803f, 0.991211f, 0.980225f, 0.964844f, 0.945068f, 0.920898f, 0.892334f, 0.859375f +}; + + + +/* Definition of the mapping between TNS parameters and a bitstream */ +/* Helper structures for hufmann table coding */ + +const Coding codesTnsCoeff0TCX20[] = +{ + { -8+INDEX_SHIFT, 609, 11 }, /* 01001100001 */ + { -7+INDEX_SHIFT, 305, 10 }, /* 0100110001 */ + { -6+INDEX_SHIFT, 77, 8 }, /* 01001101 */ + { -5+INDEX_SHIFT, 39, 7 }, /* 0100111 */ + { -4+INDEX_SHIFT, 8, 5 }, /* 01000 */ + { -3+INDEX_SHIFT, 21, 5 }, /* 10101 */ + { -2+INDEX_SHIFT, 11, 4 }, /* 1011 */ + { -1+INDEX_SHIFT, 3, 3 }, /* 011 */ + { 0+INDEX_SHIFT, 3, 2 }, /* 11 */ + { 1+INDEX_SHIFT, 0, 2 }, /* 00 */ + { 2+INDEX_SHIFT, 4, 3 }, /* 100 */ + { 3+INDEX_SHIFT, 5, 4 }, /* 0101 */ + { 4+INDEX_SHIFT, 20, 5 }, /* 10100 */ + { 5+INDEX_SHIFT, 18, 6 }, /* 010010 */ + { 6+INDEX_SHIFT, 153, 9 }, /* 010011001 */ + { 7+INDEX_SHIFT, 608, 11 } /* 01001100000 */ +}; + +const Coding codesTnsCoeff0TCX10[] = +{ + { -8+INDEX_SHIFT, 441, 9 }, /* 110111001 */ + { -7+INDEX_SHIFT, 111, 7 }, /* 1101111 */ + { -6+INDEX_SHIFT, 8, 4 }, /* 1000 */ + { -5+INDEX_SHIFT, 9, 4 }, /* 1001 */ + { -4+INDEX_SHIFT, 14, 4 }, /* 1110 */ + { -3+INDEX_SHIFT, 15, 4 }, /* 1111 */ + { -2+INDEX_SHIFT, 3, 3 }, /* 011 */ + { -1+INDEX_SHIFT, 5, 3 }, /* 101 */ + { 0+INDEX_SHIFT, 0, 2 }, /* 00 */ + { 1+INDEX_SHIFT, 2, 3 }, /* 010 */ + { 2+INDEX_SHIFT, 12, 4 }, /* 1100 */ + { 3+INDEX_SHIFT, 26, 5 }, /* 11010 */ + { 4+INDEX_SHIFT, 54, 6 }, /* 110110 */ + { 5+INDEX_SHIFT, 221, 8 }, /* 11011101 */ + { 6+INDEX_SHIFT, 881, 10 }, /* 1101110001 */ + { 7+INDEX_SHIFT, 880, 10 } /* 1101110000 */ +}; + +const Coding codesTnsCoeff1TCX20[] = +{ + { -8+INDEX_SHIFT, 30018, 15 }, /* 111010101000010 */ + { -7+INDEX_SHIFT, 30019, 15 }, /* 111010101000011 */ + { -6+INDEX_SHIFT, 7505, 13 }, /* 1110101010001 */ + { -5+INDEX_SHIFT, 3753, 12 }, /* 111010101001 */ + { -4+INDEX_SHIFT, 939, 10 }, /* 1110101011 */ + { -3+INDEX_SHIFT, 235, 8 }, /* 11101011 */ + { -2+INDEX_SHIFT, 28, 5 }, /* 11100 */ + { -1+INDEX_SHIFT, 6, 3 }, /* 110 */ + { 0+INDEX_SHIFT, 0, 1 }, /* 0 */ + { 1+INDEX_SHIFT, 2, 2 }, /* 10 */ + { 2+INDEX_SHIFT, 15, 4 }, /* 1111 */ + { 3+INDEX_SHIFT, 59, 6 }, /* 111011 */ + { 4+INDEX_SHIFT, 116, 7 }, /* 1110100 */ + { 5+INDEX_SHIFT, 468, 9 }, /* 111010100 */ + { 6+INDEX_SHIFT, 1877, 11 }, /* 11101010101 */ + { 7+INDEX_SHIFT, 15008, 14 } /* 11101010100000 */ +}; + +const Coding codesTnsCoeff1TCX10[] = +{ + { -8+INDEX_SHIFT, 2818, 12 }, /* 101100000010 */ + { -7+INDEX_SHIFT, 2819, 12 }, /* 101100000011 */ + { -6+INDEX_SHIFT, 705, 10 }, /* 1011000001 */ + { -5+INDEX_SHIFT, 353, 9 }, /* 101100001 */ + { -4+INDEX_SHIFT, 177, 8 }, /* 10110001 */ + { -3+INDEX_SHIFT, 45, 6 }, /* 101101 */ + { -2+INDEX_SHIFT, 10, 4 }, /* 1010 */ + { -1+INDEX_SHIFT, 3, 3 }, /* 011 */ + { 0+INDEX_SHIFT, 6, 3 }, /* 110 */ + { 1+INDEX_SHIFT, 0, 2 }, /* 00 */ + { 2+INDEX_SHIFT, 7, 3 }, /* 111 */ + { 3+INDEX_SHIFT, 4, 3 }, /* 100 */ + { 4+INDEX_SHIFT, 2, 3 }, /* 010 */ + { 5+INDEX_SHIFT, 23, 5 }, /* 10111 */ + { 6+INDEX_SHIFT, 89, 7 }, /* 1011001 */ + { 7+INDEX_SHIFT, 1408, 11 } /* 10110000000 */ +}; + +const Coding codesTnsCoeff2TCX20[] = +{ + { -8+INDEX_SHIFT, 13312, 14 }, /* 11010000000000 */ + { -7+INDEX_SHIFT, 13313, 14 }, /* 11010000000001 */ + { -6+INDEX_SHIFT, 3329, 12 }, /* 110100000001 */ + { -5+INDEX_SHIFT, 833, 10 }, /* 1101000001 */ + { -4+INDEX_SHIFT, 209, 8 }, /* 11010001 */ + { -3+INDEX_SHIFT, 53, 6 }, /* 110101 */ + { -2+INDEX_SHIFT, 12, 4 }, /* 1100 */ + { -1+INDEX_SHIFT, 2, 2 }, /* 10 */ + { 0+INDEX_SHIFT, 0, 1 }, /* 0 */ + { 1+INDEX_SHIFT, 7, 3 }, /* 111 */ + { 2+INDEX_SHIFT, 27, 5 }, /* 11011 */ + { 3+INDEX_SHIFT, 105, 7 }, /* 1101001 */ + { 4+INDEX_SHIFT, 417, 9 }, /* 110100001 */ + { 5+INDEX_SHIFT, 1665, 11 }, /* 11010000001 */ + { 6+INDEX_SHIFT, 13314, 14 }, /* 11010000000010 */ + { 7+INDEX_SHIFT, 13315, 14 } /* 11010000000011 */ +}; + +const Coding codesTnsCoeff2TCX10[] = +{ + { -8+INDEX_SHIFT, 512, 12 }, /* 001000000000 */ + { -7+INDEX_SHIFT, 513, 12 }, /* 001000000001 */ + { -6+INDEX_SHIFT, 65, 9 }, /* 001000001 */ + { -5+INDEX_SHIFT, 17, 7 }, /* 0010001 */ + { -4+INDEX_SHIFT, 5, 5 }, /* 00101 */ + { -3+INDEX_SHIFT, 0, 3 }, /* 000 */ + { -2+INDEX_SHIFT, 6, 3 }, /* 110 */ + { -1+INDEX_SHIFT, 1, 2 }, /* 01 */ + { 0+INDEX_SHIFT, 2, 2 }, /* 10 */ + { 1+INDEX_SHIFT, 7, 3 }, /* 111 */ + { 2+INDEX_SHIFT, 3, 4 }, /* 0011 */ + { 3+INDEX_SHIFT, 9, 6 }, /* 001001 */ + { 4+INDEX_SHIFT, 33, 8 }, /* 00100001 */ + { 5+INDEX_SHIFT, 129, 10 }, /* 0010000001 */ + { 6+INDEX_SHIFT, 514, 12 }, /* 001000000010 */ + { 7+INDEX_SHIFT, 515, 12 } /* 001000000011 */ +}; + +const Coding codesTnsCoeff3TCX20[] = +{ + { -8+INDEX_SHIFT, 13318, 14 }, /* 11010000000110 */ + { -7+INDEX_SHIFT, 13319, 14 }, /* 11010000000111 */ + { -6+INDEX_SHIFT, 6656, 13 }, /* 1101000000000 */ + { -5+INDEX_SHIFT, 1665, 11 }, /* 11010000001 */ + { -4+INDEX_SHIFT, 417, 9 }, /* 110100001 */ + { -3+INDEX_SHIFT, 105, 7 }, /* 1101001 */ + { -2+INDEX_SHIFT, 27, 5 }, /* 11011 */ + { -1+INDEX_SHIFT, 7, 3 }, /* 111 */ + { 0+INDEX_SHIFT, 0, 1 }, /* 0 */ + { 1+INDEX_SHIFT, 2, 2 }, /* 10 */ + { 2+INDEX_SHIFT, 12, 4 }, /* 1100 */ + { 3+INDEX_SHIFT, 53, 6 }, /* 110101 */ + { 4+INDEX_SHIFT, 209, 8 }, /* 11010001 */ + { 5+INDEX_SHIFT, 833, 10 }, /* 1101000001 */ + { 6+INDEX_SHIFT, 6657, 13 }, /* 1101000000001 */ + { 7+INDEX_SHIFT, 6658, 13 } /* 1101000000010 */ +}; + +const Coding codesTnsCoeff3TCX10[] = +{ + { -8+INDEX_SHIFT, 1284, 12 }, /* 010100000100 */ + { -7+INDEX_SHIFT, 1285, 12 }, /* 010100000101 */ + { -6+INDEX_SHIFT, 1286, 12 }, /* 010100000110 */ + { -5+INDEX_SHIFT, 1287, 12 }, /* 010100000111 */ + { -4+INDEX_SHIFT, 161, 9 }, /* 010100001 */ + { -3+INDEX_SHIFT, 41, 7 }, /* 0101001 */ + { -2+INDEX_SHIFT, 11, 5 }, /* 01011 */ + { -1+INDEX_SHIFT, 0, 2 }, /* 00 */ + { 0+INDEX_SHIFT, 2, 2 }, /* 10 */ + { 1+INDEX_SHIFT, 3, 2 }, /* 11 */ + { 2+INDEX_SHIFT, 3, 3 }, /* 011 */ + { 3+INDEX_SHIFT, 4, 4 }, /* 0100 */ + { 4+INDEX_SHIFT, 21, 6 }, /* 010101 */ + { 5+INDEX_SHIFT, 81, 8 }, /* 01010001 */ + { 6+INDEX_SHIFT, 640, 11 }, /* 01010000000 */ + { 7+INDEX_SHIFT, 641, 11 } /* 01010000001 */ +}; + +const Coding codesTnsCoeff4TCX20[] = +{ + { -8+INDEX_SHIFT, 13318, 14 }, /* 11010000000110 */ + { -7+INDEX_SHIFT, 13319, 14 }, /* 11010000000111 */ + { -6+INDEX_SHIFT, 6656, 13 }, /* 1101000000000 */ + { -5+INDEX_SHIFT, 833, 10 }, /* 1101000001 */ + { -4+INDEX_SHIFT, 209, 8 }, /* 11010001 */ + { -3+INDEX_SHIFT, 53, 6 }, /* 110101 */ + { -2+INDEX_SHIFT, 12, 4 }, /* 1100 */ + { -1+INDEX_SHIFT, 2, 2 }, /* 10 */ + { 0+INDEX_SHIFT, 0, 1 }, /* 0 */ + { 1+INDEX_SHIFT, 7, 3 }, /* 111 */ + { 2+INDEX_SHIFT, 27, 5 }, /* 11011 */ + { 3+INDEX_SHIFT, 105, 7 }, /* 1101001 */ + { 4+INDEX_SHIFT, 417, 9 }, /* 110100001 */ + { 5+INDEX_SHIFT, 1665, 11 }, /* 11010000001 */ + { 6+INDEX_SHIFT, 6657, 13 }, /* 1101000000001 */ + { 7+INDEX_SHIFT, 6658, 13 } /* 1101000000010 */ +}; + +const Coding codesTnsCoeff4TCX10[] = +{ + { -8+INDEX_SHIFT, 20, 12 }, /* 000000010100 */ + { -7+INDEX_SHIFT, 21, 12 }, /* 000000010101 */ + { -6+INDEX_SHIFT, 22, 12 }, /* 000000010110 */ + { -5+INDEX_SHIFT, 3, 9 }, /* 000000011 */ + { -4+INDEX_SHIFT, 1, 7 }, /* 0000001 */ + { -3+INDEX_SHIFT, 1, 5 }, /* 00001 */ + { -2+INDEX_SHIFT, 1, 3 }, /* 001 */ + { -1+INDEX_SHIFT, 2, 2 }, /* 10 */ + { 0+INDEX_SHIFT, 3, 2 }, /* 11 */ + { 1+INDEX_SHIFT, 1, 2 }, /* 01 */ + { 2+INDEX_SHIFT, 1, 4 }, /* 0001 */ + { 3+INDEX_SHIFT, 1, 6 }, /* 000001 */ + { 4+INDEX_SHIFT, 0, 8 }, /* 00000000 */ + { 5+INDEX_SHIFT, 23, 12 }, /* 000000010111 */ + { 6+INDEX_SHIFT, 8, 11 }, /* 00000001000 */ + { 7+INDEX_SHIFT, 9, 11 } /* 00000001001 */ +}; + +const Coding codesTnsCoeff5[] = +{ + { -8+INDEX_SHIFT, 6788, 13 }, /* 1101010000100 */ + { -7+INDEX_SHIFT, 6789, 13 }, /* 1101010000101 */ + { -6+INDEX_SHIFT, 6790, 13 }, /* 1101010000110 */ + { -5+INDEX_SHIFT, 849, 10 }, /* 1101010001 */ + { -4+INDEX_SHIFT, 213, 8 }, /* 11010101 */ + { -3+INDEX_SHIFT, 107, 7 }, /* 1101011 */ + { -2+INDEX_SHIFT, 27, 5 }, /* 11011 */ + { -1+INDEX_SHIFT, 7, 3 }, /* 111 */ + { 0+INDEX_SHIFT, 0, 1 }, /* 0 */ + { 1+INDEX_SHIFT, 2, 2 }, /* 10 */ + { 2+INDEX_SHIFT, 12, 4 }, /* 1100 */ + { 3+INDEX_SHIFT, 52, 6 }, /* 110100 */ + { 4+INDEX_SHIFT, 425, 9 }, /* 110101001 */ + { 5+INDEX_SHIFT, 6791, 13 }, /* 1101010000111 */ + { 6+INDEX_SHIFT, 3392, 12 }, /* 110101000000 */ + { 7+INDEX_SHIFT, 3393, 12 } /* 110101000001 */ +}; + +const Coding codesTnsCoeff6[] = +{ + { -8+INDEX_SHIFT, 4, 12 }, /* 000000000100 */ + { -7+INDEX_SHIFT, 5, 12 }, /* 000000000101 */ + { -6+INDEX_SHIFT, 6, 12 }, /* 000000000110 */ + { -5+INDEX_SHIFT, 1, 9 }, /* 000000001 */ + { -4+INDEX_SHIFT, 1, 7 }, /* 0000001 */ + { -3+INDEX_SHIFT, 1, 5 }, /* 00001 */ + { -2+INDEX_SHIFT, 1, 3 }, /* 001 */ + { -1+INDEX_SHIFT, 2, 2 }, /* 10 */ + { 0+INDEX_SHIFT, 3, 2 }, /* 11 */ + { 1+INDEX_SHIFT, 1, 2 }, /* 01 */ + { 2+INDEX_SHIFT, 1, 4 }, /* 0001 */ + { 3+INDEX_SHIFT, 1, 6 }, /* 000001 */ + { 4+INDEX_SHIFT, 1, 8 }, /* 00000001 */ + { 5+INDEX_SHIFT, 7, 12 }, /* 000000000111 */ + { 6+INDEX_SHIFT, 0, 11 }, /* 00000000000 */ + { 7+INDEX_SHIFT, 1, 11 } /* 00000000001 */ +}; + +const Coding codesTnsCoeff7[] = +{ + { -8+INDEX_SHIFT, 14, 11 }, /* 00000001110 */ + { -7+INDEX_SHIFT, 15, 11 }, /* 00000001111 */ + { -6+INDEX_SHIFT, 0, 10 }, /* 0000000000 */ + { -5+INDEX_SHIFT, 1, 10 }, /* 0000000001 */ + { -4+INDEX_SHIFT, 1, 7 }, /* 0000001 */ + { -3+INDEX_SHIFT, 1, 5 }, /* 00001 */ + { -2+INDEX_SHIFT, 1, 4 }, /* 0001 */ + { -1+INDEX_SHIFT, 1, 2 }, /* 01 */ + { 0+INDEX_SHIFT, 2, 10 }, /* 0000000010 */ + { 1+INDEX_SHIFT, 1, 1 }, /* 1 */ + { 2+INDEX_SHIFT, 1, 3 }, /* 001 */ + { 3+INDEX_SHIFT, 1, 6 }, /* 000001 */ + { 4+INDEX_SHIFT, 3, 10 }, /* 0000000011 */ + { 5+INDEX_SHIFT, 4, 10 }, /* 0000000100 */ + { 6+INDEX_SHIFT, 5, 10 }, /* 0000000101 */ + { 7+INDEX_SHIFT, 6, 10 } /* 0000000110 */ +}; + +const Coding codesTnsCoeff456[] = +{ + { -8+INDEX_SHIFT, 516, 12 }, /* 001000000100 */ + { -7+INDEX_SHIFT, 517, 12 }, /* 001000000101 */ + { -6+INDEX_SHIFT, 518, 12 }, /* 001000000110 */ + { -5+INDEX_SHIFT, 65, 9 }, /* 001000001 */ + { -4+INDEX_SHIFT, 17, 7 }, /* 0010001 */ + { -3+INDEX_SHIFT, 5, 5 }, /* 00101 */ + { -2+INDEX_SHIFT, 3, 4 }, /* 0011 */ + { -1+INDEX_SHIFT, 1, 2 }, /* 01 */ + { 0+INDEX_SHIFT, 3, 2 }, /* 11 */ + { 1+INDEX_SHIFT, 2, 2 }, /* 10 */ + { 2+INDEX_SHIFT, 0, 3 }, /* 000 */ + { 3+INDEX_SHIFT, 9, 6 }, /* 001001 */ + { 4+INDEX_SHIFT, 33, 8 }, /* 00100001 */ + { 5+INDEX_SHIFT, 519, 12 }, /* 001000000111 */ + { 6+INDEX_SHIFT, 256, 11 }, /* 00100000000 */ + { 7+INDEX_SHIFT, 257, 11 } /* 00100000001 */ +}; + +const Coding codesTnsCoeff0WBTCX20[] = +{ + { -8+INDEX_SHIFT, 225, 10 }, /* 0011100001 */ + { -7+INDEX_SHIFT, 113, 9 }, /* 001110001 */ + { -6+INDEX_SHIFT, 29, 7 }, /* 0011101 */ + { -5+INDEX_SHIFT, 15, 6 }, /* 001111 */ + { -4+INDEX_SHIFT, 2, 4 }, /* 0010 */ + { -3+INDEX_SHIFT, 0, 3 }, /* 000 */ + { -2+INDEX_SHIFT, 13, 4 }, /* 1101 */ + { -1+INDEX_SHIFT, 2, 3 }, /* 010 */ + { 0+INDEX_SHIFT, 5, 3 }, /* 101 */ + { 1+INDEX_SHIFT, 3, 3 }, /* 011 */ + { 2+INDEX_SHIFT, 4, 3 }, /* 100 */ + { 3+INDEX_SHIFT, 7, 3 }, /* 111 */ + { 4+INDEX_SHIFT, 12, 4 }, /* 1100 */ + { 5+INDEX_SHIFT, 6, 5 }, /* 00110 */ + { 6+INDEX_SHIFT, 57, 8 }, /* 00111001 */ + { 7+INDEX_SHIFT, 224, 10 } /* 0011100000 */ +}; + + +const Coding codesTnsCoeff1WBTCX20[] = +{ + { -8+INDEX_SHIFT, 512, 12 }, /* 001000000000 */ + { -7+INDEX_SHIFT, 513, 12 }, /* 001000000001 */ + { -6+INDEX_SHIFT, 514, 12 }, /* 001000000010 */ + { -5+INDEX_SHIFT, 65, 9 }, /* 001000001 */ + { -4+INDEX_SHIFT, 17, 7 }, /* 0010001 */ + { -3+INDEX_SHIFT, 5, 5 }, /* 00101 */ + { -2+INDEX_SHIFT, 0, 3 }, /* 000 */ + { -1+INDEX_SHIFT, 2, 3 }, /* 010 */ + { 0+INDEX_SHIFT, 3, 2 }, /* 11 */ + { 1+INDEX_SHIFT, 2, 2 }, /* 10 */ + { 2+INDEX_SHIFT, 3, 3 }, /* 011 */ + { 3+INDEX_SHIFT, 3, 4 }, /* 0011 */ + { 4+INDEX_SHIFT, 9, 6 }, /* 001001 */ + { 5+INDEX_SHIFT, 33, 8 }, /* 00100001 */ + { 6+INDEX_SHIFT, 129, 10 }, /* 0010000001 */ + { 7+INDEX_SHIFT, 515, 12 } /* 001000000011 */ +}; + + +const Coding codesTnsCoeff2WB[] = +{ + { -8+INDEX_SHIFT, 5632, 13 }, /* 1011000000000 */ + { -7+INDEX_SHIFT, 5633, 13 }, /* 1011000000001 */ + { -6+INDEX_SHIFT, 1409, 11 }, /* 10110000001 */ + { -5+INDEX_SHIFT, 353, 9 }, /* 101100001 */ + { -4+INDEX_SHIFT, 89, 7 }, /* 1011001 */ + { -3+INDEX_SHIFT, 23, 5 }, /* 10111 */ + { -2+INDEX_SHIFT, 4, 3 }, /* 100 */ + { -1+INDEX_SHIFT, 0, 2 }, /* 00 */ + { 0+INDEX_SHIFT, 3, 2 }, /* 11 */ + { 1+INDEX_SHIFT, 1, 2 }, /* 01 */ + { 2+INDEX_SHIFT, 10, 4 }, /* 1010 */ + { 3+INDEX_SHIFT, 45, 6 }, /* 101101 */ + { 4+INDEX_SHIFT, 177, 8 }, /* 10110001 */ + { 5+INDEX_SHIFT, 705, 10 }, /* 1011000001 */ + { 6+INDEX_SHIFT, 5634, 13 }, /* 1011000000010 */ + { 7+INDEX_SHIFT, 5635, 13 } /* 1011000000011 */ +}; + +const Coding codesTnsCoeff3WB[] = +{ + { -8+INDEX_SHIFT, 5638, 13 }, /* 1011000000110 */ + { -7+INDEX_SHIFT, 5639, 13 }, /* 1011000000111 */ + { -6+INDEX_SHIFT, 2816, 12 }, /* 101100000000 */ + { -5+INDEX_SHIFT, 353, 9 }, /* 101100001 */ + { -4+INDEX_SHIFT, 177, 8 }, /* 10110001 */ + { -3+INDEX_SHIFT, 45, 6 }, /* 101101 */ + { -2+INDEX_SHIFT, 10, 4 }, /* 1010 */ + { -1+INDEX_SHIFT, 0, 2 }, /* 00 */ + { 0+INDEX_SHIFT, 3, 2 }, /* 11 */ + { 1+INDEX_SHIFT, 1, 2 }, /* 01 */ + { 2+INDEX_SHIFT, 4, 3 }, /* 100 */ + { 3+INDEX_SHIFT, 23, 5 }, /* 10111 */ + { 4+INDEX_SHIFT, 89, 7 }, /* 1011001 */ + { 5+INDEX_SHIFT, 705, 10 }, /* 1011000001 */ + { 6+INDEX_SHIFT, 2817, 12 }, /* 101100000001 */ + { 7+INDEX_SHIFT, 2818, 12 } /* 101100000010 */ +}; + +const int16_t nTnsCoeffCodes = sizeof(codesTnsCoeff0TCX20)/sizeof(codesTnsCoeff0TCX20[0]); + +const Coding * const codesTnsCoeffSWBTCX20[] = { codesTnsCoeff0TCX20, codesTnsCoeff1TCX20, codesTnsCoeff2TCX20, codesTnsCoeff3TCX20, codesTnsCoeff4TCX20, codesTnsCoeff5, codesTnsCoeff6, codesTnsCoeff7 }; +const Coding * const codesTnsCoeffSWBTCX10[] = { codesTnsCoeff0TCX10, codesTnsCoeff1TCX10, codesTnsCoeff2TCX10, codesTnsCoeff3TCX10, codesTnsCoeff4TCX10, codesTnsCoeff5, codesTnsCoeff6, codesTnsCoeff7 }; +const Coding * const codesTnsCoeffWBTCX20[] = { codesTnsCoeff0WBTCX20, codesTnsCoeff1WBTCX20, codesTnsCoeff2WB, codesTnsCoeff3WB, codesTnsCoeff456, codesTnsCoeff456, codesTnsCoeff456, codesTnsCoeff7 }; + +const int16_t nTnsCoeffTables = sizeof(codesTnsCoeffSWBTCX20)/sizeof(codesTnsCoeffSWBTCX20[0]); + +const Coding codesTnsOrderTCX20[] = +{ + { 1, 0, 2 }, /* 00 */ + { 2, 40, 6 }, /* 101000 */ + { 3, 41, 6 }, /* 101001 */ + { 4, 21, 5 }, /* 10101 */ + { 5, 11, 4 }, /* 1011 */ + { 6, 4, 3 }, /* 100 */ + { 7, 1, 2 }, /* 01 */ + { 8, 3, 2 } /* 11 */ +}; +const Coding codesTnsOrderTCX10[] = +{ + { 1, 0, 3 }, /* 000 */ + { 2, 16, 5 }, /* 10000 */ + { 3, 17, 5 }, /* 10001 */ + { 4, 9, 4 }, /* 1001 */ + { 5, 1, 3 }, /* 001 */ + { 6, 5, 3 }, /* 101 */ + { 7, 1, 2 }, /* 01 */ + { 8, 3, 2 } /* 11 */ +}; +const Coding codesTnsOrder[] = +{ + { 1, 96, 7 }, /* 1100000 */ + { 2, 97, 7 }, /* 1100001 */ + { 3, 49, 6 }, /* 110001 */ + { 4, 25, 5 }, /* 11001 */ + { 5, 13, 4 }, /* 1101 */ + { 6, 7, 3 }, /* 111 */ + { 7, 2, 2 }, /* 10 */ + { 8, 0, 1 } /* 0 */ +}; + +const int16_t nTnsOrderCodes = sizeof(codesTnsOrder)/sizeof(codesTnsOrder[0]); + +const ParamsBitMap tnsSWBTCX20FilterCoeffBitMap = +{ + 1, + { + { 0, GetSWBTCX20TnsFilterCoeffBits, TRUE, GetTnsFilterCoeff, SetTnsFilterCoeff, EncodeSWBTCX20TnsFilterCoeff, DecodeSWBTCX20TnsFilterCoeff, NULL } /* TNS filter coefficients */ + } +}; + +const ParamsBitMap tnsSWBTCX10FilterCoeffBitMap = +{ + 1, + { + { 0, GetSWBTCX10TnsFilterCoeffBits, TRUE, GetTnsFilterCoeff, SetTnsFilterCoeff, EncodeSWBTCX10TnsFilterCoeff, DecodeSWBTCX10TnsFilterCoeff, NULL } /* TNS filter coefficients */ + } +}; + +const ParamsBitMap tnsSWBTCX20FilterBitMap = +{ + 1, + { + { 0, GetTnsFilterOrderBitsSWBTCX20, FALSE, GetTnsFilterOrder, SetTnsFilterOrder, EncodeTnsFilterOrderSWBTCX20, DecodeTnsFilterOrderSWBTCX20, &tnsSWBTCX20FilterCoeffBitMap } /* TNS filter order */ + } +}; + +const ParamsBitMap tnsSWBTCX10FilterBitMap = +{ + 1, + { + { 0, GetTnsFilterOrderBitsSWBTCX10, FALSE, GetTnsFilterOrder, SetTnsFilterOrder, EncodeTnsFilterOrderSWBTCX10, DecodeTnsFilterOrderSWBTCX10, &tnsSWBTCX10FilterCoeffBitMap } /* TNS filter order */ + } +}; + +const ParamsBitMap tnsSWBTCX20BitMap = +{ + 1, + { + { 1, NULL, FALSE, GetNumOfTnsFilters, SetNumOfTnsFilters, NULL, NULL, &tnsSWBTCX20FilterBitMap } /* Number of TNS filters */ + } +}; + +/* For storing/reading bits in SWB/FB mode */ +const ParamsBitMap tnsEnabledSWBTCX20BitMap = +{ + 1, + { + { 1, NULL, TRUE, GetTnsEnabled, SetTnsEnabled, NULL, NULL, &tnsSWBTCX20BitMap } /* TNS Enabled/Disable */ + } +}; + +const ParamsBitMap tnsSWBTCX10BitMap = +{ + 1, + { + { 1, NULL, FALSE, GetNumOfTnsFilters, SetNumOfTnsFilters, NULL, NULL, &tnsSWBTCX10FilterBitMap } /* Number of TNS filters */ + } +}; + +/* For storing/reading bits in SWB/FB mode */ +const ParamsBitMap tnsEnabledSWBTCX10BitMap = +{ + 1, + { + { 1, NULL, TRUE, GetTnsEnabled, SetTnsEnabled, NULL, NULL, &tnsSWBTCX10BitMap } /* TNS Enabled/Disable */ + } +}; + +const ParamsBitMap tnsWBTCX20FilterCoeffBitMap = +{ + 1, + { + { 0, GetWBTCX20TnsFilterCoeffBits, TRUE, GetTnsFilterCoeff, SetTnsFilterCoeff, EncodeWBTCX20TnsFilterCoeff, DecodeWBTCX20TnsFilterCoeff, NULL } /* TNS filter coefficients */ + } +}; + + +const ParamsBitMap tnsWBTCX20FilterBitMap = +{ + 1, + { + { 0, GetTnsFilterOrderBits, FALSE, GetTnsFilterOrder, SetTnsFilterOrder, EncodeTnsFilterOrder, DecodeTnsFilterOrder, &tnsWBTCX20FilterCoeffBitMap } /* TNS filter order */ + } +}; + + +/* For storing/reading bits in WB mode */ +const ParamsBitMap tnsEnabledWBTCX20BitMap = +{ + 1, + { + { 1, NULL, TRUE, GetTnsEnabledSingleFilter, SetTnsEnabledSingleFilter, NULL, NULL, &tnsWBTCX20FilterBitMap } /* TNS Enabled/Disable */ + } +}; + +/* For storing/reading bits in SWB/FB mode */ +const ParamsBitMap tnsOnWhiteSWBTCX20BitMap = +{ + 2, + { + { 1, NULL, TRUE, GetTnsOnWhite, SetTnsOnWhite, NULL, NULL, NULL }, /* TNS Enabled/Disable */ + { 1, NULL, FALSE, GetNumOfTnsFilters, SetNumOfTnsFilters, NULL, NULL, &tnsSWBTCX20FilterBitMap } + } +}; + +const ParamsBitMap tnsEnabledOnWhiteSWBTCX20BitMap = +{ + 1, + { + { 1, NULL, TRUE, GetTnsEnabled, SetTnsEnabled, NULL, NULL, &tnsOnWhiteSWBTCX20BitMap } /* TNS Enabled/Disable */ + } +}; +/* For storing/reading bits in SWB/FB mode */ +const ParamsBitMap tnsOnWhiteSWBTCX10BitMap = +{ + 2, + { + { 1, NULL, TRUE, GetTnsOnWhite, SetTnsOnWhite, NULL, NULL, NULL }, /* TNS on whitened spectra */ + { 1, NULL, FALSE, GetNumOfTnsFilters, SetNumOfTnsFilters, NULL, NULL, &tnsSWBTCX10FilterBitMap } + } +}; + +/* For storing/reading bits in SWB/FB mode */ +const ParamsBitMap tnsEnabledOnWhiteSWBTCX10BitMap = +{ + 1, + { + { 1, NULL, TRUE, GetTnsEnabled, SetTnsEnabled, NULL, NULL, &tnsOnWhiteSWBTCX10BitMap } /* TNS Enabled/Disable */ + } +}; + + +/** + * 4 bit resolution TNS coefficients. + */ +const float tnsCoeff4[16]= +{ + -0.99573418F, /* = sin(-8*(EVS_PI/2.0)/(8 + 0.5)) */ + -0.96182564F, /* = sin(-7*(EVS_PI/2.0)/(8 + 0.5)) */ + -0.89516329F, + -0.79801723F, + -0.67369564F, + -0.52643216F, + -0.36124167F, + -0.18374952F, /* = sin(-1*(EVS_PI/2.0)/(8 + 0.5)) */ + 0.00000000F, /* = sin(0*(EVS_PI/2.0)/(8 + 0.5)) */ + 0.20791169F, /* = sin(1*(EVS_PI/2.0)/(8 - 0.5)) */ + 0.40673664F, + 0.58778525F, + 0.74314483F, + 0.86602540F, + 0.95105652F, /* = sin(6*(EVS_PI/2.0)/(8 - 0.5)) */ + 0.99452190F /* = sin(7*(EVS_PI/2.0)/(8 - 0.5)) */ +}; + + +/*----------------------------------------------------------------------------------* + * IGF settings for each bitrate + *----------------------------------------------------------------------------------*/ + +const int16_t swb_offset_LB_new[IGF_BITRATE_UNKNOWN][IGF_MAX_SFB] = +{ + /* 0: for 9600 kbs WB */ + { + 4, 164, 186, 242, 320 + }, + /* 1: for 13200 kbs WB RF */ + { + 4, 164, 186, 242, 320 + }, + /* 2: for 9600 kbs SWB */ + { + 4, 200, 322, 444, 566 + }, + /* 3: for 13200 kbs SWB */ + { + 7, 256, 288, 328, 376, 432, 496, 566 + }, + /* 4: for 13200 kbs SWB RF */ + { + 4, 200, 322, 444, 566 + }, + /* 5: for 16400 kbs SWB */ + { + 8, 256, 288, 328, 376, 432, 496, 576, 640 + }, + /* 6: for 24400 kbs SWB */ + { + 9, 256, 284, 318, 358, 402, 450, 508, 576, 640 + }, + /* 7: for 32000 kbs SWB */ + { + 9, 256, 284, 318, 358, 402, 450, 508, 576, 640 + }, + /* 8: for 48000 kbs SWB */ + { + 4, 512, 534, 576, 640 + }, + /* 9: for 64000 kbs SWB */ + { + 4, 512, 534, 576, 640 + }, + /* 10: for 16400 kbs FB */ + { + 10, 256, 288, 328, 376, 432, 496, 576, 640, 720, 800 + }, + /* 11: for 24400 kbs FB */ + { + 11, 256, 284, 318, 358, 402, 450, 508, 576, 640, 720, 800 + }, + /* 12: for 32000 kbs FB */ + { + 11, 256, 284, 318, 358, 402, 450, 508, 576, 640, 720, 800 + }, + /* 13: for 48000 kbs FB */ + { + 5, 512, 584, 656, 728, 800 + }, + /* 14: for 64000 kbs FB */ + { + 5, 512, 584, 656, 728, 800 + }, + /* 15: for 96000 kbs FB */ + { + 3, 640, 720, 800 /* old: 640, 760, 880 */ + }, + /* 16: for 128000 kbs FB */ + { + 3, 640, 720, 800 /* old: 640, 760, 880 */ + }, + /* 17: for 13200 kbs WB (stereo) */ + { + 3, 196, 248, 320 + }, + /* 18: for 16400 kbs WB (stereo) */ + { + 3, 228, 268, 320 + }, + /* 19: for 13200 kbs SWB (stereo) */ + { + 5, 200, 264, 344, 440, 566 + }, + /* 20: for 16400 kbs SWB (stereo) */ + { + 7, 228, 264, 308, 360, 420, 488, 566 + }, + /* 21: for 24400 kbs SWB (stereo) */ + { + 8, 256, 288, 328, 376, 432, 496, 576, 640 + }, + /* 22: for 32000 kbs SWB (stereo) */ + { + 9, 256, 284, 320, 360, 404, 452, 508, 576, 640 + }, + /* 23: for 48000 kbs SWB (stereo) */ + { + 7, 360, 392, 424, 464, 508, 560, 640 + }, + /* 24: for 48000 kbs SWB (stereo TCX10) */ + { + 4, 360, 424, 508, 640 + }, + /* 25: for 64000 kbs SWB (stereo) */ + { + 8, 400, 424, 448, 476, 508, 540, 576, 640 + }, + /* 26: for 80000 kbs SWB (stereo) */ + { + 5, 464, 496, 532, 576, 640 + }, + /* 27: for 96000 kbs SWB (stereo) */ + { + 4, 512, 536, 576, 640 + }, + /* 28: for 24400 kbs FB (stereo) */ + { + 10, 256, 288, 328, 376, 432, 496, 576, 640, 720, 800 + }, + /* 29: for 32000 kbs FB (stereo) */ + { + 11, 256, 284, 320, 360, 404, 452, 508, 576, 640, 720, 800 + }, + /* 30: for 48000 kbs FB (stereo) */ + { + 9, 360, 392, 424, 464, 508, 560, 640, 720, 800 + }, + /* 31: for 48000 kbs FB (stereo TCX10) */ + { + 5, 360, 424, 508, 640, 800 + }, + /* 32: for 64000 kbs FB (stereo) */ + { + 10, 400, 424, 448, 476, 508, 540, 576, 640, 720, 800 + }, + /* 33: for 80000 kbs FB (stereo) */ + { + 7, 464, 496, 532, 576, 640, 720, 800 + }, + /* 34: for 96000 kbs FB (stereo) */ + { + 6, 512, 536, 576, 640, 720, 800 + }, + /* 35: for 128000 kbs FB (stereo) */ + { + 3, 640, 720, 800 + } +}; + +const int16_t igf_tile_offset_table[IGF_BITRATE_UNKNOWN][2*IGF_MAX_TILES+1] = { + { 2, 2, 0, 3, 0}, /* 9600 WB*/ + { 2, 2, 0, 3, 0}, /* 13200 WB RF */ + { 3, 1, 0, 2, 32, 3, 46}, /* 9600 SWB */ + { 2, 4, 0, 6, 32}, /* 13200 SWB RF */ + { 3, 1, 0, 2, 32, 3, 46}, /* 13200 SWB */ + { 3, 4, 0, 6, 48, 7, 64}, /* 16400 SWB */ + { 3, 4, 0, 7, 32, 8, 64}, /* 24400 SWB */ + { 3, 4, 0, 7, 32, 8, 64}, /* 32000 SWB */ + { 1, 3, 320}, /* 48000 SWB */ + { 1, 3, 320}, /* 64000 SWB */ + { 3, 4, 0, 7, 0, 9, 0}, /* 16400 FB */ + { 4, 4, 0, 6, 32, 9, 0, 10, 80}, /* 24400 FB */ + { 4, 4, 0, 6, 32, 9, 0, 10, 80}, /* 32000 FB */ + { 1, 4, 160}, /* 48000 FB */ + { 1, 4, 160}, /* 64000 FB */ + { 1, 2, 416}, /* 96000 FB */ + { 1, 2, 416}, /*128000 FB */ + { 2, 1, 40, 2, 92}, /* 13200 WB (stereo) */ + { 2, 1, 80, 2, 120}, /* 16400 WB (stereo) */ + { 4, 1, 0, 2, 32, 3, 46, 4, 40}, /* 13200 SWB (stereo) */ + { 6, 1, 0, 2, 36, 3, 80, 4, 132, 5, 32, 6, 100 }, /* 16400 SWB (stereo) */ + { 7, 1, 0, 2, 32, 3, 72, 4, 120, 5, 48, 6, 112, 7, 64 }, /* 24400 SWB (stereo) */ + { 8, 1, 0, 2, 28, 3, 64, 4, 104, 5, 32, 6, 80, 7, 136, 8, 64 }, /* 32000 SWB (stereo) */ + { 6, 1, 120, 2, 152, 3, 184, 4, 224, 5, 140, 6, 192}, /* 48000 SWB (stereo) */ + { 3, 1, 0, 2, 40, 3, 80 }, /* 48000 SWB (stereo TCX10) */ + { 4, 2, 80, 4, 128, 6, 144, 7, 212 }, /* 64000 SWB (stereo) */ + { 2, 2, 212, 4, 280 }, /* 80000 SWB (stereo) */ + { 1, 3, 200}, /* 96000 SWB (stereo) */ + { 9, 1, 0, 2, 32, 3, 72, 4, 120, 5, 48, 6, 112, 7, 64, 8, 0, 9, 80 }, /* 24400 FB (stereo) */ + {10, 1, 0, 2, 28, 3, 64, 4, 104, 5, 32, 6, 80, 7, 136, 8, 64, 9, 0, 10, 80 }, /* 32000 FB (stereo) */ + { 7, 1, 120, 2, 152, 3, 184, 4, 224, 5, 140, 6, 192, 8, 140}, /* 48000 FB (stereo) */ + { 4, 1, 0, 2, 40, 3, 80, 4, 140 }, /* 48000 FB (stereo TCX10) */ + { 5, 2, 80, 4, 128, 6, 144, 7, 212, 9, 160 }, /* 64000 FB (stereo) */ + { 3, 2, 212, 4, 280, 6, 200 }, /* 80000 FB (stereo) */ + { 2, 3, 200, 5, 240}, /* 96000 FB (stereo) */ + { 1, 2, 416} /*128000 FB (stereo) */ +}; + +const float igf_whitening_TH[IGF_BITRATE_UNKNOWN][2][IGF_MAX_TILES] = +{ + /* 0: for 9600 kbs WB */ + { + /* medium */ {0.36f, 0.36f, 0.f, 0.f}, + /* strong */ {1.41f, 1.41f, 0.f, 0.f} + }, + /* 1: for 13200 kbs WB RF */ + { + /* medium */ {0.36f, 0.36f, 0.f, 0.f}, + /* strong */ {1.41f, 1.41f, 0.f, 0.f} + }, + /* 2: for 9600 kbs SWB */ + { + /* medium */ {0.84f, 0.89f, 0.f, 0.f}, + /* strong */ {1.30f, 1.25f, 0.f, 0.f} + }, + /* 3: for 13200 kbs SWB */ + { + /* medium */ {0.84f, 0.89f, 0.f, 0.f}, + /* strong */ {1.30f, 1.25f, 0.f, 0.f} + }, + /* 4: for 13200 kbs SWB RF */ + { + /* medium */ {0.84f, 0.89f, 0.f, 0.f}, + /* strong */ {1.30f, 1.25f, 0.f, 0.f} + }, + /* 5: for 16400 kbs SWB */ + { + /* medium */ {0.83f, 0.89f, 0.89f, 0.f}, + /* strong */ {1.31f, 1.19f, 1.19f, 0.f} + }, + /* 6: for 24400 kbs SWB*/ + { + /* medium */ {0.81f, 0.85f, 0.85f, 0.f}, + /* strong */ {1.35f, 1.23f, 1.23f, 0.f} + }, + /* 7: for 32000 kbs SWB */ + { + /* medium */ {0.91f, 0.85f, 0.85f, 0.f}, + /* strong */ {1.34f, 1.35f, 1.35f, 0.f} + }, + /* 8: for 48000 kbs SWB */ + { + /* medium */ {1.15f, 0.f, 0.f, 0.f}, + /* strong */ {1.19f, 0.f, 0.f, 0.f} + }, + /* 9: for 64000 kbs SWB */ + { + /* medium */ {1.15f, 0.f, 0.f, 0.f}, + /* strong */ {1.19f, 0.f, 0.f, 0.f} + }, + /* 10: for 16400 kbs FB */ + { + /* medium */ {0.63f, 0.27f, 0.36f, 0.f}, + /* strong */ {1.53f, 1.32f, 0.67f, 0.f} + }, + /* 11: for 24400 kbs FB */ + { + /* medium */ {0.78f, 0.31f, 0.34f, 0.34f}, + /* strong */ {1.49f, 1.38f, 0.65f, 0.65f} + }, + /* 12: for 32000 kbs FB */ + { + /* medium */ {0.78f, 0.31f, 0.34f, 0.34f}, + /* strong */ {1.49f, 1.38f, 0.65f, 0.65f} + }, + /* 13: for 48000 kbs FB */ + { + /* medium */ {0.80f, 0.f, 0.f, 0.f}, + /* strong */ {1.00f, 0.f, 0.f, 0.f} + }, + /* 14: for 64000 kbs FB */ + { + /* medium */ {0.80f, 0.f, 0.f, 0.f}, + /* strong */ {1.00f, 0.f, 0.f, 0.f} + }, + /* 15: for 96000 kbs FB */ + { + /* medium */ {0.f, 0.f, 0.f, 0.f}, + /* strong */ {2.82f, 0.f, 0.f, 0.f} + }, + /* 16: for 128000 kbs FB */ + { + /* medium */ {0.f, 0.f, 0.f, 0.f}, + /* strong */ {2.82f, 0.f, 0.f, 0.f} + }, + /* 17: for 13200 kbs WB (stereo) */ + { + /* medium */ {0.80f, 0.75f, 0.f, 0.f}, + /* strong */ {1.50f, 1.45f, 0.f, 0.f} + }, + /* 18: for 16400 kbs WB (stereo) */ + { + /* medium */ {0.90f, 0.85f, 0.f, 0.f}, + /* strong */ {1.60f, 1.50f, 0.f, 0.f} + }, + /* 19: for 13200 kbs SWB (stereo) */ + { + /* medium */ { 0.89f, 0.89f, 0.80f ,0.80f }, + /* strong */ { 1.25f, 1.25f, 1.19f, 1.19f } + }, + /* 20: for 16400 kbs SWB (stereo) */ + { + /* medium */{ 1.05f, 1.05f, 1.10f, 1.10f, 1.05f, 1.05f }, + /* strong */{ 1.70f, 1.70f, 1.65f, 1.65f, 1.6f, 1.5f } + }, + /* 21: for 24400 kbs SWB (stereo) */ + { + /* medium */{ 1.20f, 1.20f, 1.15f, 1.10f, 1.05f, 1.00f, 0.90f }, + /* strong */{ 1.70f, 1.70f, 1.70f, 1.70f, 1.55f, 1.45f, 1.20f } + }, + /* 22: for 32000 kbs SWB (stereo) */ + { + /* medium */{ 1.20f, 1.20f, 1.15f, 1.15f, 1.10f, 1.05f, 1.00f, 0.90f }, + /* strong */{ 1.80f, 1.80f, 1.80f, 1.80f, 1.65f, 1.55f, 1.45f, 1.20f } + }, + /* 23: for 48000 kbs SWB (stereo) */ /* currently not used due to adaptive calculation of thresholds at 48 kbps */ + { + /* medium */ {0.75f, 0.70f, 0.50f, 0.f }, + /* strong */ {1.25f, 1.10f, 1.00f, 0.f } + }, + /* 24: for 48000 kbs SWB (stereo TCX10) */ /* currently not used due to adaptive calculation of thresholds at 48 kbps */ + { + /* medium */ {0.75f, 0.70f, 0.50f, 0.f }, + /* strong */ {1.25f, 1.10f, 1.00f, 0.f } + }, + /* 25: for 64000 kbs SWB (stereo) */ + { + /* medium */ {1.00f, 1.00f, 1.20f, 1.25f}, + /* strong */ {1.50f, 1.50f, 1.60f, 1.60f} + }, + /* 26: for 80000 kbs SWB (stereo) */ + { + /* medium */ { 1.20f, 1.25f, 0.f, 0.f }, + /* strong */ { 1.60f, 1.60f, 0.f, 0.f } + }, + /* 27: for 96000 kbs SWB (stereo) */ + { + /* medium */ {1.15f, 0.f, 0.f, 0.f}, + /* strong */ {1.19f, 0.f, 0.f, 0.f} + }, + /* 28: for 24400 kbs FB (stereo) */ + { + /* medium */{ 1.20f, 1.20f, 1.15f, 1.10f, 1.05f, 1.00f, 0.90f, 0.34f, 0.34f }, + /* strong */{ 1.70f, 1.70f, 1.70f, 1.70f, 1.55f, 1.45f, 1.20f, 0.65f, 0.65f } + }, + /* 29: for 32000 kbs FB (stereo) */ + { + /* medium */{ 1.20f, 1.20f, 1.15f, 1.15f, 1.10f, 1.05f, 1.00f, 0.90f, 0.34f, 0.34f }, + /* strong */{ 1.80f, 1.80f, 1.80f, 1.80f, 1.65f, 1.55f, 1.45f, 1.20f, 0.65f, 0.65f } + }, + /* 30: for 48000 kbs FB (stereo) */ /* currently not used due to adaptive calculation of thresholds at 48 kbps */ + { + /* medium */ {0.78f, 0.31f, 0.34f, 0.34f}, + /* strong */ {1.49f, 1.38f, 0.65f, 0.65f} + }, + /* 31: for 48000 kbs FB (stereo TCX10) */ /* currently not used due to adaptive calculation of thresholds at 48 kbps */ + { + /* medium */ {0.75f, 0.70f, 0.50f, 0.50f }, + /* strong */ {1.25f, 1.10f, 1.00f, 1.00f } + }, + /* 32: for 64000 kbs FB (stereo) */ + { + /* medium */ {1.00f, 1.00f, 1.20f, 1.25f, 0.75f}, + /* strong */ {1.50f, 1.50f, 1.60f, 1.60f, 1.00f} + }, + /* 33: for 80000 kbs FB (stereo) */ + { + /* medium */ { 1.20f, 1.25f, 0.75f, 0.f }, + /* strong */ { 1.60f, 1.60f, 1.00f, 0.f } + }, + /* 34: for 96000 kbs FB (stereo) */ + { + /* medium */ {0.91f, 0.85f, 0.0f, 0.f}, + /* strong */ {1.34f, 1.35f, 0.0f, 0.f} + }, + /* 35: for 128000 kbs FB (stereo) */ + { + /* medium */ {0.f, 0.f, 0.f, 0.f}, + /* strong */ {2.82f, 0.f, 0.f, 0.f} + } +}; + +/* IGF SCF arithmetic coder cumulative frequency tables and offsets */ + +const int16_t cf_off_se01_tab[10] = { + +1, /* 9.6 kbs B*/ + +1, /* 13.2 kbs WB RF B*/ + +1, /* 9.6 kbs SWB B*/ + +1, /* 13.2 kbs A*/ + +1, /* 13.2 kbs SWB RF B*/ + +1, /* 16.4 kbs B*/ + +1, /* 24.4 kbs B*/ + +1, /* 32.0 kbs A*/ + -1, /* 48.0 kbs B*/ + -1 /* 64.0 kbs B*/ +}; + +const int16_t cf_off_se02_tab[10][IGF_CTX_COUNT] = { + { +1, +2, +2, +2, +3, +3, +4}, /* 9.6 kbs B*/ + { +1, +2, +2, +2, +3, +3, +4}, /* 13.2 kbs WB RF B*/ + { +0, +2, +3, +3, +2, +2, +4}, /* 9.6 kbs SWB B*/ + { +0, +2, +3, +3, +2, +2, +4}, /* 13.2 kbs A*/ + { +0, +2, +3, +3, +2, +2, +4}, /* 13.2 kbs SWB RF B*/ + { +0, +2, +3, +3, +2, +2, +4}, /* 16.4 kbs B*/ + { -1, +2, +2, +2, +2, +3, +5}, /* 24.4 kbs B*/ + { -1, +2, +2, +2, +2, +3, +5}, /* 32.0 kbs A*/ + { +3, +2, +3, +2, +3, +3, +6}, /* 48.0 kbs B*/ + { +3, +2, +3, +2, +3, +3, +6} /* 64.0 kbs B*/ +}; + +const int16_t cf_off_se10_tab = -7; + +const int16_t cf_off_se11_tab[IGF_CTX_COUNT][IGF_CTX_COUNT] = +{ + { -5, +0, +0, +0, +0, +0, +0}, + { +0, +0, +0, +0, +0, +0, +0}, + { +0, +0, +0, +0, +0, +0, +0}, + { +0, +0, +0, +0, +0, +0, +0}, + { +0, +0, +0, +0, +0, +0, +0}, + { +0, +0, +0, +0, +0, +0, +1}, + { +0, +1, +0, +0, +3, +0, +3} +}; + +const uint16_t cf_se00_tab[IGF_SYMBOLS_IN_TABLE + 1] = +{ + 16384, 16356, 16299, 16185, 15904, 15282, 14669, 13598, 11886, 9541, 6613, 3845, 1799, 606, 153, 32, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 +}; + +const uint16_t cf_se01_tab[10][IGF_SYMBOLS_IN_TABLE + 1] = +{ + {16384, 16320, 16285, 16237, 16163, 16049, 15864, 15604, 15187, 14557, 13612, 12308, 10590, 8535, 6346, 4396, 2900, 1917, 1289, 870, 593, 408, 279, 181, 122, 78, 52, 0}, /* 9.6 kbs B*/ + {16384, 16320, 16285, 16237, 16163, 16049, 15864, 15604, 15187, 14557, 13612, 12308, 10590, 8535, 6346, 4396, 2900, 1917, 1289, 870, 593, 408, 279, 181, 122, 78, 52, 0}, /* 13.2 kbs WB RF B*/ + {16384, 16375, 16362, 16339, 16307, 16258, 16180, 16061, 15845, 15463, 14795, 13680, 11828, 9252, 6358, 3769, 2079, 1186, 687, 415, 242, 150, 100, 67, 44, 30, 19, 0}, /* 9.6 kbs SWB B*/ + {16384, 16375, 16362, 16339, 16307, 16258, 16180, 16061, 15845, 15463, 14795, 13680, 11828, 9252, 6358, 3769, 2079, 1186, 687, 415, 242, 150, 100, 67, 44, 30, 19, 0}, /* 13.2 kbs A*/ + {16384, 16375, 16362, 16339, 16307, 16258, 16180, 16061, 15845, 15463, 14795, 13680, 11828, 9252, 6358, 3769, 2079, 1186, 687, 415, 242, 150, 100, 67, 44, 30, 19, 0}, /* 13.2 kbs SWB RF B*/ + {16384, 16375, 16362, 16339, 16307, 16258, 16180, 16061, 15845, 15463, 14795, 13680, 11828, 9252, 6358, 3769, 2079, 1186, 687, 415, 242, 150, 100, 67, 44, 30, 19, 0}, /* 16.4 kbs B*/ + {16384, 16369, 16356, 16337, 16311, 16268, 16197, 16073, 15876, 15544, 14977, 13987, 12327, 9908, 7017, 4393, 2545, 1446, 840, 493, 292, 183, 111, 70, 45, 31, 20, 0 }, /* 24.4 kbs B*/ + {16384, 16369, 16356, 16337, 16311, 16268, 16197, 16073, 15876, 15544, 14977, 13987, 12327, 9908, 7017, 4393, 2545, 1446, 840, 493, 292, 183, 111, 70, 45, 31, 20, 0}, /* 32.0 kbs A*/ + {16384, 16368, 16355, 16334, 16291, 16212, 16071, 15816, 15359, 14523, 13014, 10534, 7345, 4272, 2228, 1149, 626, 357, 215, 139, 93, 67, 53, 43, 36, 28, 22, 0}, /* 48.0 kbs B*/ + {16384, 16368, 16355, 16334, 16291, 16212, 16071, 15816, 15359, 14523, 13014, 10534, 7345, 4272, 2228, 1149, 626, 357, 215, 139, 93, 67, 53, 43, 36, 28, 22, 0} /* 64.0 kbs B*/ +}; + +const uint16_t cf_se02_tab[10][IGF_CTX_COUNT][IGF_SYMBOLS_IN_TABLE + 1] = +{ + { /* 9.6 kbs B */ + { 16384, 16369, 16348, 16316, 16256, 16172, 16017, 15735, 15246, 14363, 13036, 11139, 8916, 6724, 4757, 3282, 2221, 1549, 1105, 771, 548, 364, 238, 151, 89, 50, 30, 0}, + { 16384, 16371, 16358, 16339, 16290, 16241, 16153, 16040, 15813, 15397, 14601, 13301, 11360, 8916, 6254, 3911, 2220, 1280, 755, 461, 278, 177, 111, 70, 35, 20, 12, 0}, + { 16384, 16375, 16359, 16333, 16286, 16243, 16154, 16024, 15771, 15380, 14712, 13537, 11742, 9425, 6872, 4378, 2327, 1197, 671, 412, 259, 145, 93, 52, 26, 13, 5, 0}, + { 16384, 16372, 16358, 16326, 16289, 16241, 16147, 16014, 15765, 15321, 14670, 13546, 11912, 9787, 7323, 4824, 2536, 1330, 731, 438, 258, 148, 86, 37, 22, 11, 2, 0}, + { 16384, 16376, 16364, 16344, 16315, 16272, 16219, 16119, 15910, 15620, 15100, 14254, 13063, 11489, 9413, 7100, 4738, 2751, 1584, 973, 597, 349, 201, 96, 47, 22, 9, 0}, + { 16384, 16364, 16340, 16312, 16288, 16237, 16166, 16026, 15756, 15390, 14833, 13870, 12627, 10998, 8985, 6893, 4720, 3048, 1860, 1131, 725, 449, 215, 111, 56, 34, 14, 0}, + { 16384, 16326, 16297, 16246, 16183, 16064, 15884, 15632, 15240, 14763, 14107, 13230, 12185, 10886, 9390, 7781, 6194, 4696, 3350, 2259, 1506, 975, 604, 356, 201, 106, 48, 0} + }, + { /* 13.2 kbs WB RF B*/ + { 16384, 16369, 16348, 16316, 16256, 16172, 16017, 15735, 15246, 14363, 13036, 11139, 8916, 6724, 4757, 3282, 2221, 1549, 1105, 771, 548, 364, 238, 151, 89, 50, 30, 0}, + { 16384, 16371, 16358, 16339, 16290, 16241, 16153, 16040, 15813, 15397, 14601, 13301, 11360, 8916, 6254, 3911, 2220, 1280, 755, 461, 278, 177, 111, 70, 35, 20, 12, 0}, + { 16384, 16375, 16359, 16333, 16286, 16243, 16154, 16024, 15771, 15380, 14712, 13537, 11742, 9425, 6872, 4378, 2327, 1197, 671, 412, 259, 145, 93, 52, 26, 13, 5, 0}, + { 16384, 16372, 16358, 16326, 16289, 16241, 16147, 16014, 15765, 15321, 14670, 13546, 11912, 9787, 7323, 4824, 2536, 1330, 731, 438, 258, 148, 86, 37, 22, 11, 2, 0}, + { 16384, 16376, 16364, 16344, 16315, 16272, 16219, 16119, 15910, 15620, 15100, 14254, 13063, 11489, 9413, 7100, 4738, 2751, 1584, 973, 597, 349, 201, 96, 47, 22, 9, 0}, + { 16384, 16364, 16340, 16312, 16288, 16237, 16166, 16026, 15756, 15390, 14833, 13870, 12627, 10998, 8985, 6893, 4720, 3048, 1860, 1131, 725, 449, 215, 111, 56, 34, 14, 0}, + { 16384, 16326, 16297, 16246, 16183, 16064, 15884, 15632, 15240, 14763, 14107, 13230, 12185, 10886, 9390, 7781, 6194, 4696, 3350, 2259, 1506, 975, 604, 356, 201, 106, 48, 0} + }, + { /* 9.6 kbs SWB B*/ + { 16384, 16359, 16349, 16331, 16300, 16236, 16112, 15894, 15480, 14691, 13257, 10996, 8168, 5357, 3193, 1864, 1098, 676, 426, 265, 173, 117, 81, 59, 45, 35, 26, 0}, + { 16384, 16374, 16370, 16367, 16362, 16348, 16325, 16283, 16204, 16058, 15715, 14980, 13521, 11144, 7972, 4702, 2366, 1063, 480, 241, 128, 71, 42, 22, 14, 9, 5, 0}, + { 16384, 16380, 16377, 16375, 16372, 16365, 16354, 16334, 16295, 16216, 16056, 15716, 15034, 13690, 11467, 8404, 5150, 2385, 908, 417, 199, 106, 62, 35, 21, 13, 7, 0}, + { 16384, 16378, 16376, 16373, 16368, 16360, 16346, 16318, 16267, 16173, 15991, 15644, 14932, 13623, 11575, 8688, 5224, 2309, 891, 393, 202, 103, 57, 34, 20, 11, 8, 0}, + { 16384, 16375, 16372, 16365, 16348, 16322, 16279, 16201, 16046, 15728, 15214, 14297, 12811, 10673, 7918, 4530, 2109, 978, 466, 234, 121, 72, 46, 31, 25, 17, 13, 0}, + { 16384, 16366, 16357, 16341, 16325, 16289, 16220, 16084, 15768, 15300, 14466, 13206, 11402, 9176, 6633, 4092, 2192, 1171, 592, 315, 179, 111, 74, 46, 31, 26, 18, 0}, + { 16384, 16301, 16266, 16211, 16140, 16045, 15889, 15652, 15358, 14883, 14192, 13119, 11753, 10181, 8445, 6708, 5023, 3449, 2226, 1375, 849, 516, 353, 231, 153, 107, 78, 0} + }, + { /* 13.2 kbs A */ + { 16384, 16359, 16349, 16331, 16300, 16236, 16112, 15894, 15480, 14691, 13257, 10996, 8168, 5357, 3193, 1864, 1098, 676, 426, 265, 173, 117, 81, 59, 45, 35, 26, 0}, + { 16384, 16374, 16370, 16367, 16362, 16348, 16325, 16283, 16204, 16058, 15715, 14980, 13521, 11144, 7972, 4702, 2366, 1063, 480, 241, 128, 71, 42, 22, 14, 9, 5, 0}, + { 16384, 16380, 16377, 16375, 16372, 16365, 16354, 16334, 16295, 16216, 16056, 15716, 15034, 13690, 11467, 8404, 5150, 2385, 908, 417, 199, 106, 62, 35, 21, 13, 7, 0}, + { 16384, 16378, 16376, 16373, 16368, 16360, 16346, 16318, 16267, 16173, 15991, 15644, 14932, 13623, 11575, 8688, 5224, 2309, 891, 393, 202, 103, 57, 34, 20, 11, 8, 0}, + { 16384, 16375, 16372, 16365, 16348, 16322, 16279, 16201, 16046, 15728, 15214, 14297, 12811, 10673, 7918, 4530, 2109, 978, 466, 234, 121, 72, 46, 31, 25, 17, 13, 0}, + { 16384, 16366, 16357, 16341, 16325, 16289, 16220, 16084, 15768, 15300, 14466, 13206, 11402, 9176, 6633, 4092, 2192, 1171, 592, 315, 179, 111, 74, 46, 31, 26, 18, 0}, + { 16384, 16301, 16266, 16211, 16140, 16045, 15889, 15652, 15358, 14883, 14192, 13119, 11753, 10181, 8445, 6708, 5023, 3449, 2226, 1375, 849, 516, 353, 231, 153, 107, 78, 0} + }, + { /* 13.2 kbs SWB RF B*/ + { 16384, 16359, 16349, 16331, 16300, 16236, 16112, 15894, 15480, 14691, 13257, 10996, 8168, 5357, 3193, 1864, 1098, 676, 426, 265, 173, 117, 81, 59, 45, 35, 26, 0}, + { 16384, 16374, 16370, 16367, 16362, 16348, 16325, 16283, 16204, 16058, 15715, 14980, 13521, 11144, 7972, 4702, 2366, 1063, 480, 241, 128, 71, 42, 22, 14, 9, 5, 0}, + { 16384, 16380, 16377, 16375, 16372, 16365, 16354, 16334, 16295, 16216, 16056, 15716, 15034, 13690, 11467, 8404, 5150, 2385, 908, 417, 199, 106, 62, 35, 21, 13, 7, 0}, + { 16384, 16378, 16376, 16373, 16368, 16360, 16346, 16318, 16267, 16173, 15991, 15644, 14932, 13623, 11575, 8688, 5224, 2309, 891, 393, 202, 103, 57, 34, 20, 11, 8, 0}, + { 16384, 16375, 16372, 16365, 16348, 16322, 16279, 16201, 16046, 15728, 15214, 14297, 12811, 10673, 7918, 4530, 2109, 978, 466, 234, 121, 72, 46, 31, 25, 17, 13, 0}, + { 16384, 16366, 16357, 16341, 16325, 16289, 16220, 16084, 15768, 15300, 14466, 13206, 11402, 9176, 6633, 4092, 2192, 1171, 592, 315, 179, 111, 74, 46, 31, 26, 18, 0}, + { 16384, 16301, 16266, 16211, 16140, 16045, 15889, 15652, 15358, 14883, 14192, 13119, 11753, 10181, 8445, 6708, 5023, 3449, 2226, 1375, 849, 516, 353, 231, 153, 107, 78, 0} + }, + { /* 16.4 kbs B */ + { 16384, 16359, 16349, 16331, 16300, 16236, 16112, 15894, 15480, 14691, 13257, 10996, 8168, 5357, 3193, 1864, 1098, 676, 426, 265, 173, 117, 81, 59, 45, 35, 26, 0}, + { 16384, 16374, 16370, 16367, 16362, 16348, 16325, 16283, 16204, 16058, 15715, 14980, 13521, 11144, 7972, 4702, 2366, 1063, 480, 241, 128, 71, 42, 22, 14, 9, 5, 0}, + { 16384, 16380, 16377, 16375, 16372, 16365, 16354, 16334, 16295, 16216, 16056, 15716, 15034, 13690, 11467, 8404, 5150, 2385, 908, 417, 199, 106, 62, 35, 21, 13, 7, 0}, + { 16384, 16378, 16376, 16373, 16368, 16360, 16346, 16318, 16267, 16173, 15991, 15644, 14932, 13623, 11575, 8688, 5224, 2309, 891, 393, 202, 103, 57, 34, 20, 11, 8, 0}, + { 16384, 16375, 16372, 16365, 16348, 16322, 16279, 16201, 16046, 15728, 15214, 14297, 12811, 10673, 7918, 4530, 2109, 978, 466, 234, 121, 72, 46, 31, 25, 17, 13, 0}, + { 16384, 16366, 16357, 16341, 16325, 16289, 16220, 16084, 15768, 15300, 14466, 13206, 11402, 9176, 6633, 4092, 2192, 1171, 592, 315, 179, 111, 74, 46, 31, 26, 18, 0}, + { 16384, 16301, 16266, 16211, 16140, 16045, 15889, 15652, 15358, 14883, 14192, 13119, 11753, 10181, 8445, 6708, 5023, 3449, 2226, 1375, 849, 516, 353, 231, 153, 107, 78, 0} + }, + { /* 24.4 kbs B */ + { 16384, 16351, 16333, 16303, 16254, 16163, 15993, 15681, 15080, 13987, 12109, 9465, 6588, 4160, 2488, 1480, 912, 589, 389, 266, 190, 131, 93, 68, 47, 34, 24, 0}, + { 16384, 16379, 16375, 16369, 16360, 16345, 16328, 16286, 16211, 16078, 15810, 15233, 14058, 11933, 8881, 5609, 2940, 1290, 558, 274, 150, 80, 47, 29, 17, 11, 6, 0}, + { 16384, 16382, 16380, 16377, 16370, 16358, 16337, 16300, 16224, 16088, 15811, 15233, 14112, 12019, 9061, 5723, 2780, 1121, 480, 239, 123, 69, 41, 22, 13, 8, 5, 0}, + { 16384, 16377, 16375, 16369, 16363, 16351, 16325, 16268, 16172, 16009, 15686, 15039, 13830, 11799, 8924, 5422, 2444, 960, 441, 220, 111, 63, 37, 22, 11, 6, 3, 0}, + { 16384, 16374, 16369, 16363, 16356, 16335, 16290, 16214, 16068, 15826, 15382, 14550, 13126, 10956, 8000, 4622, 2090, 973, 478, 249, 128, 75, 42, 19, 13, 7, 4, 0}, + { 16384, 16375, 16370, 16367, 16362, 16340, 16298, 16232, 16097, 15860, 15440, 14718, 13570, 11874, 9557, 6790, 4053, 2166, 1150, 622, 323, 179, 96, 53, 33, 17, 12, 0}, + { 16384, 16335, 16304, 16276, 16228, 16166, 16094, 15983, 15775, 15501, 15040, 14417, 13552, 12326, 10847, 9117, 7308, 5373, 3666, 2297, 1336, 807, 495, 313, 216, 152, 114, 0} + }, + { /* 32.0 kbs A */ + { 16384, 16351, 16333, 16303, 16254, 16163, 15993, 15681, 15080, 13987, 12109, 9465, 6588, 4160, 2488, 1480, 912, 589, 389, 266, 190, 131, 93, 68, 47, 34, 24, 0}, + { 16384, 16379, 16375, 16369, 16360, 16345, 16328, 16286, 16211, 16078, 15810, 15233, 14058, 11933, 8881, 5609, 2940, 1290, 558, 274, 150, 80, 47, 29, 17, 11, 6, 0}, + { 16384, 16382, 16380, 16377, 16370, 16358, 16337, 16300, 16224, 16088, 15811, 15233, 14112, 12019, 9061, 5723, 2780, 1121, 480, 239, 123, 69, 41, 22, 13, 8, 5, 0}, + { 16384, 16377, 16375, 16369, 16363, 16351, 16325, 16268, 16172, 16009, 15686, 15039, 13830, 11799, 8924, 5422, 2444, 960, 441, 220, 111, 63, 37, 22, 11, 6, 3, 0}, + { 16384, 16374, 16369, 16363, 16356, 16335, 16290, 16214, 16068, 15826, 15382, 14550, 13126, 10956, 8000, 4622, 2090, 973, 478, 249, 128, 75, 42, 19, 13, 7, 4, 0}, + { 16384, 16375, 16370, 16367, 16362, 16340, 16298, 16232, 16097, 15860, 15440, 14718, 13570, 11874, 9557, 6790, 4053, 2166, 1150, 622, 323, 179, 96, 53, 33, 17, 12, 0}, + { 16384, 16335, 16304, 16276, 16228, 16166, 16094, 15983, 15775, 15501, 15040, 14417, 13552, 12326, 10847, 9117, 7308, 5373, 3666, 2297, 1336, 807, 495, 313, 216, 152, 114, 0} + }, + { /* 48.0 kbs B */ + { 16384, 16334, 16310, 16285, 16254, 16204, 16128, 16031, 15903, 15697, 15380, 14820, 13857, 12267, 9878, 7099, 4509, 2576, 1478, 871, 531, 349, 230, 163, 111, 80, 62, 0}, + { 16384, 16337, 16327, 16307, 16278, 16239, 16178, 16092, 15947, 15719, 15286, 14428, 12833, 10246, 7123, 4088, 1896, 849, 481, 287, 190, 139, 94, 66, 52, 34, 24, 0}, + { 16384, 16352, 16341, 16329, 16312, 16295, 16265, 16223, 16151, 16026, 15825, 15437, 14645, 13089, 10612, 7364, 4077, 1783, 779, 444, 281, 192, 138, 93, 65, 43, 30, 0}, + { 16384, 16354, 16347, 16337, 16314, 16284, 16233, 16165, 16051, 15847, 15450, 14621, 13069, 10623, 7298, 3789, 1569, 727, 445, 302, 207, 143, 96, 59, 36, 18, 9, 0}, + { 16384, 16352, 16342, 16330, 16314, 16295, 16266, 16215, 16127, 15984, 15709, 15190, 14242, 12540, 9979, 6448, 3160, 1392, 752, 481, 344, 251, 169, 115, 73, 28, 8, 0}, + { 16384, 16340, 16320, 16302, 16272, 16257, 16220, 16135, 16011, 15784, 15370, 14688, 13423, 11457, 8721, 5529, 2736, 1375, 784, 525, 353, 263, 172, 113, 78, 26, 11, 0}, + { 16384, 16238, 16170, 16113, 16077, 16030, 16000, 15948, 15873, 15752, 15535, 15157, 14595, 13788, 12569, 10767, 8611, 6186, 4101, 2459, 1478, 881, 607, 385, 243, 168, 116, 0} + }, + { /* 64.0 kbs B */ + { 16384, 16334, 16310, 16285, 16254, 16204, 16128, 16031, 15903, 15697, 15380, 14820, 13857, 12267, 9878, 7099, 4509, 2576, 1478, 871, 531, 349, 230, 163, 111, 80, 62, 0}, + { 16384, 16337, 16327, 16307, 16278, 16239, 16178, 16092, 15947, 15719, 15286, 14428, 12833, 10246, 7123, 4088, 1896, 849, 481, 287, 190, 139, 94, 66, 52, 34, 24, 0}, + { 16384, 16352, 16341, 16329, 16312, 16295, 16265, 16223, 16151, 16026, 15825, 15437, 14645, 13089, 10612, 7364, 4077, 1783, 779, 444, 281, 192, 138, 93, 65, 43, 30, 0}, + { 16384, 16354, 16347, 16337, 16314, 16284, 16233, 16165, 16051, 15847, 15450, 14621, 13069, 10623, 7298, 3789, 1569, 727, 445, 302, 207, 143, 96, 59, 36, 18, 9, 0}, + { 16384, 16352, 16342, 16330, 16314, 16295, 16266, 16215, 16127, 15984, 15709, 15190, 14242, 12540, 9979, 6448, 3160, 1392, 752, 481, 344, 251, 169, 115, 73, 28, 8, 0}, + { 16384, 16340, 16320, 16302, 16272, 16257, 16220, 16135, 16011, 15784, 15370, 14688, 13423, 11457, 8721, 5529, 2736, 1375, 784, 525, 353, 263, 172, 113, 78, 26, 11, 0}, + { 16384, 16238, 16170, 16113, 16077, 16030, 16000, 15948, 15873, 15752, 15535, 15157, 14595, 13788, 12569, 10767, 8611, 6186, 4101, 2459, 1478, 881, 607, 385, 243, 168, 116, 0} + } +}; + +/* only needed for >= 48 kbps */ + +const uint16_t cf_se10_tab[IGF_SYMBOLS_IN_TABLE + 1] = +{ + 16384, 15493, 15154, 14810, 14331, 13701, 13086, 12403, 11585, 10923, 10293, 9631, 8943, 8385, 7760, 7182, 6593, 6009, 5540, 5082, 4571, 4133, 3711, 3299, 2887, 2460, 2043, 0 +}; + +const uint16_t cf_se11_tab[IGF_CTX_COUNT][IGF_CTX_COUNT][IGF_SYMBOLS_IN_TABLE + 1] = +{ + { + { 16384, 16313, 16312, 16241, 16206, 16099, 15957, 15386, 14601, 12852, 10282, 7534, 4964, 2966, 1824, 896, 504, 255, 113, 112, 41, 40, 39, 38, 37, 36, 1, 0}, + { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16207, 16206, 16205, 16120, 15949, 14663, 12777, 9947, 6860, 3773, 1972, 772, 430, 259, 174, 89, 4, 3, 2, 1, 0}, + { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 16376, 16115, 15941, 14891, 12965, 11477, 8587, 5347, 3421, 1407, 620, 8, 7, 6, 5, 4, 3, 2, 1, 0}, + { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16254, 16253, 16004, 15005, 13756, 12006, 9256, 5755, 3755, 1755, 756, 132, 131, 130, 129, 5, 4, 3, 2, 1, 0}, + { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 15964, 15550, 14929, 12856, 9954, 6430, 2906, 1456, 1042, 628, 214, 8, 7, 6, 5, 4, 3, 2, 1, 0}, + { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16087, 15503, 14334, 14333, 11994, 10240, 8193, 5268, 2929, 1760, 1176, 299, 298, 297, 296, 295, 294, 293, 2, 1, 0}, + { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 14922, 13467, 10919, 9464, 7280, 6189, 3641, 2914, 2187, 1824, 1823, 1096, 369, 368, 367, 4, 3, 2, 1, 0} + }, + { + { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 16238, 16237, 15678, 15399, 14840, 13441, 11341, 8681, 6161, 3781, 2522, 702, 283, 144, 5, 4, 3, 2, 1, 0}, + { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 16376, 16375, 16374, 15693, 14671, 12625, 7507, 4778, 2390, 1368, 1028, 347, 7, 6, 5, 4, 3, 2, 1, 0}, + { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 16376, 16375, 16374, 15595, 13776, 9877, 6498, 3639, 3120, 1561, 1042, 523, 265, 6, 5, 4, 3, 2, 1, 0}, + { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 16376, 15709, 13704, 12702, 11032, 7355, 3010, 1340, 1007, 674, 341, 8, 7, 6, 5, 4, 3, 2, 1, 0}, + { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 16376, 16375, 16374, 12816, 10683, 7125, 2854, 720, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}, + { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 16376, 16375, 12738, 12737, 10920, 9103, 5466, 1828, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}, + { 16384, 16383, 16382, 16381, 16380, 15359, 15358, 14337, 14336, 14335, 14334, 14333, 10240, 7170, 5124, 2054, 1032, 1031, 1030, 1029, 7, 6, 5, 4, 3, 2, 1, 0} + }, + { + { 16384, 16383, 16382, 16107, 16106, 16105, 16104, 16103, 15966, 15965, 15690, 15140, 14315, 12939, 10324, 8122, 4956, 2479, 1654, 966, 691, 416, 141, 140, 3, 2, 1, 0}, + { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 16376, 16375, 15320, 14265, 12945, 10568, 8984, 6343, 4230, 1853, 797, 270, 7, 6, 5, 4, 3, 2, 1, 0}, + { 16384, 16383, 16382, 16381, 16380, 16379, 16112, 16111, 16110, 15037, 14501, 12622, 11012, 7790, 5374, 3226, 1347, 542, 275, 274, 273, 6, 5, 4, 3, 2, 1, 0}, + { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 16376, 16375, 15597, 14819, 12090, 7021, 4292, 1953, 1175, 787, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}, + { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 16376, 15935, 14165, 12838, 9297, 6641, 3985, 1772, 1331, 890, 449, 8, 7, 6, 5, 4, 3, 2, 1, 0}, + { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 16376, 14740, 13923, 9010, 6555, 4100, 2464, 828, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}, + { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 16376, 13104, 13103, 8192, 4920, 1647, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0} + }, + { + { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 16077, 16076, 16075, 15926, 15176, 14425, 10819, 7664, 5711, 2856, 1354, 754, 454, 154, 5, 4, 3, 2, 1, 0}, + { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 16376, 16044, 16043, 14373, 12369, 10030, 7023, 5019, 1677, 676, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}, + { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16077, 16076, 16075, 15470, 14258, 12743, 11531, 6375, 3040, 3039, 917, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}, + { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 16376, 16375, 15309, 13531, 11396, 7480, 3564, 1786, 364, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}, + { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 15833, 15289, 13652, 10377, 6556, 3827, 3283, 1646, 555, 554, 553, 552, 7, 6, 5, 4, 3, 2, 1, 0}, + { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 14146, 13404, 13403, 13402, 10425, 7448, 3727, 2240, 2239, 752, 751, 750, 749, 7, 6, 5, 4, 3, 2, 1, 0}, + { 16384, 16383, 16382, 16381, 16380, 16379, 15562, 14745, 13928, 10653, 7378, 5742, 2467, 830, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0} + }, + { + { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 16376, 16375, 16219, 15590, 14803, 13544, 11339, 9292, 6930, 4568, 2521, 1419, 790, 318, 161, 4, 3, 2, 1, 0}, + { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 16376, 16014, 15652, 14925, 14198, 12743, 10196, 5464, 3645, 1826, 371, 8, 7, 6, 5, 4, 3, 2, 1, 0}, + { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 16376, 16050, 15396, 15395, 12447, 10810, 8518, 4915, 2950, 1313, 659, 333, 7, 6, 5, 4, 3, 2, 1, 0}, + { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 16376, 16375, 14792, 14001, 11096, 8455, 6079, 3174, 2119, 535, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}, + { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 15796, 15795, 15794, 15793, 11700, 8777, 6439, 4101, 1178, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}, + { 16384, 16383, 16382, 16381, 15473, 15472, 15471, 14563, 13655, 12746, 10017, 7288, 6379, 6378, 4559, 1830, 1829, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}, + { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 15723, 15069, 13105, 9174, 7865, 3934, 3280, 1971, 1317, 663, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0} + }, + { + { 16384, 16383, 16382, 16381, 16232, 16231, 16230, 16229, 16228, 16227, 16078, 15628, 15329, 13977, 12325, 10222, 5413, 4212, 1959, 908, 7, 6, 5, 4, 3, 2, 1, 0}, + { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 16376, 16109, 15842, 15841, 13694, 11815, 10205, 5640, 3493, 2151, 1347, 543, 542, 6, 5, 4, 3, 2, 1, 0}, + { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 16376, 16168, 14699, 13650, 11761, 9452, 6093, 3784, 1685, 636, 427, 426, 425, 424, 423, 422, 421, 2, 1, 0}, + { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 16376, 16122, 15611, 14332, 13053, 10238, 7423, 4608, 2561, 2050, 1027, 516, 515, 260, 259, 258, 257, 2, 1, 0}, + { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 16376, 16375, 15207, 13649, 10531, 6632, 3514, 1176, 398, 397, 396, 395, 394, 393, 5, 4, 3, 2, 1, 0}, + { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 15749, 15120, 12601, 10082, 8823, 6304, 3785, 3156, 1267, 638, 637, 636, 7, 6, 5, 4, 3, 2, 1, 0}, + { 16384, 16383, 15729, 15728, 15727, 15726, 15725, 15071, 14417, 12453, 10489, 8525, 5905, 1975, 1321, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0} + }, + { + { 16384, 16383, 16372, 16340, 16339, 16328, 16285, 16253, 16136, 15923, 15614, 14931, 13833, 12201, 10175, 7615, 5269, 3243, 2123, 1142, 673, 342, 182, 150, 86, 54, 11, 0}, + { 16384, 16383, 16366, 16349, 16332, 16331, 16314, 16245, 16244, 16141, 15813, 15451, 14105, 12672, 9910, 7113, 4472, 2590, 1071, 484, 294, 156, 53, 36, 19, 18, 1, 0}, + { 16384, 16383, 16382, 16369, 16355, 16341, 16271, 16117, 15921, 15627, 14772, 13089, 10929, 8334, 5487, 3299, 1644, 999, 424, 228, 88, 46, 18, 17, 16, 15, 14, 0}, + { 16384, 16367, 16366, 16365, 16364, 16363, 16259, 16173, 15809, 15028, 13951, 12214, 9278, 6203, 3719, 2052, 1079, 402, 194, 125, 56, 22, 21, 20, 3, 2, 1, 0}, + { 16384, 16383, 16360, 16359, 16358, 16357, 16356, 16333, 16332, 16143, 15954, 15434, 14227, 12262, 9540, 6652, 3882, 1988, 1207, 829, 427, 191, 73, 50, 49, 2, 1, 0}, + { 16384, 16383, 16382, 16381, 16380, 16296, 16254, 15748, 14862, 13427, 11189, 8487, 5278, 3252, 2028, 1099, 551, 340, 298, 214, 172, 88, 46, 45, 3, 2, 1, 0}, + { 16384, 16383, 16307, 16269, 16231, 16230, 16077, 15886, 15464, 14620, 13546, 11896, 9671, 7024, 4338, 2382, 1423, 809, 541, 311, 158, 43, 5, 4, 3, 2, 1, 0} + } +}; + +const IGF_MODE igfMode[IGF_BITRATE_UNKNOWN] = +{ + /* sampleRate, frameLength, igfMinFq, maxHopsize */ + { 16000, 320, 774, 4 }, /* 9.6kbs WB 0 */ + { 16000, 320, 774, 4 }, /* 13.2kbs WB RF 1 */ + { 32000, 640, 800, 2 }, /* 9.6kbs SWB 2 */ + { 32000, 640, 800, 4 }, /* 13.2kbs SWB 3 */ + { 32000, 640, 800, 2 }, /* 13.2kbs SWB RF 4 */ + { 32000, 640, 800, 4 }, /* 16.4kbs SWB 5 */ + { 32000, 640, 800, 4 }, /* 24.4kbs SWB 6 */ + { 32000, 640, 800, 4 }, /* 32.0kbs SWB 7 */ + { 32000, 640, 1600, 4 }, /* 48.0kbs SWB 8 */ + { 32000, 640, 1600, 4 }, /* 64.0kbs SWB 9 */ + { 48000, 960, 800, 4 }, /* 16.4kbs FB 10 */ + { 48000, 960, 800, 2 }, /* 24.4kbs FB 11 */ + { 48000, 960, 800, 2 }, /* 32.0kbs FB 12 */ + { 48000, 960, 1600, 2 }, /* 48.0kbs FB 13 */ + { 48000, 960, 1600, 2 }, /* 64.0kbs FB 14 */ + { 48000, 960, 1600, 1 }, /* 96.0kbs FB 15 */ + { 48000, 960, 1600, 1 }, /*128.0kbs FB 16 */ + { 16000, 320, 800, 2 }, /* 13.2kbs WB CPE 17 */ /* stereo mode */ + { 16000, 320, 800, 2 }, /* 16.4kbs WB CPE 18 */ /* stereo mode */ + { 32000, 640, 800, 2 }, /* 13.2kbs SWB CPE 19 */ /* stereo mode */ + { 32000, 640, 800, 2 }, /* 16.4kbs SWB CPE 20 */ /* stereo mode */ + { 32000, 640, 800, 2 }, /* 24.4kbs SWB CPE 21 */ /* stereo mode */ + { 32000, 640, 800, 2 }, /* 32.0kbs SWB CPE 22 */ /* stereo mode */ + { 32000, 640, 1200, 2 }, /* 48.0kbs SWB CPE 23 */ /* stereo mode */ + { 32000, 640, 1200, 2 }, /* 48.0kbs SWB CPE 24 */ /* stereo TCX10 mode */ + { 32000, 640, 1200, 2 }, /* 64.0kbs SWB CPE 25 */ /* stereo mode */ + { 32000, 640, 1600, 2 }, /* 80.0kbs SWB CPE 26 */ /* stereo mode */ + { 32000, 640, 1600, 4 }, /* 96.0kbs SWB CPE 27 */ /* stereo mode */ + { 48000, 960, 800, 2 }, /* 24.4kbs FB CPE 28 */ /* stereo mode */ + { 48000, 960, 800, 2 }, /* 32.0kbs FB CPE 29 */ /* stereo mode */ + { 48000, 960, 1200, 2 }, /* 48.0kbs FB CPE 30 */ /* stereo mode */ + { 48000, 960, 1200, 2 }, /* 48.0kbs FB CPE 31 */ /* stereo TCX10 mode */ + { 48000, 960, 1200, 2 }, /* 64.0kbs FB CPE 32 */ /* stereo mode */ + { 48000, 960, 1600, 2 }, /* 80.0kbs FB CPE 33 */ /* stereo mode */ + { 48000, 960, 1600, 1 }, /* 96.0kbs FB CPE 34 */ /* stereo mode */ + { 48000, 960, 1600, 1 } /*128.0kbs FB CPE 35 */ /* stereo mode */ +}; + +const float normReciprocal[CHEAP_NORM_SIZE] = +{ + 0.0f, 1.0000000000f, 0.5000000000f, 0.3333333333f, 0.2500000000f, 0.2000000000f, 0.1666666667f, 0.1428571429f, 0.1250000000f, 0.1111111111f, 0.1000000000f, 0.0909090909f, 0.0833333333f, 0.0769230769f, 0.0714285714f, 0.0666666667f, 0.0625000000f, 0.0588235294f, 0.0555555556f, 0.0526315789f, 0.0500000000f, 0.0476190476f, 0.0454545455f, 0.0434782609f, 0.0416666667f, 0.0400000000f, 0.0384615385f, 0.0370370370f, 0.0357142857f, 0.0344827586f, 0.0333333333f, 0.0322580645f, 0.0312500000f, 0.0303030303f, 0.0294117647f, 0.0285714286f, 0.0277777778f, 0.0270270270f, 0.0263157895f, 0.0256410256f, 0.0250000000f, 0.0243902439f, 0.0238095238f, 0.0232558140f, 0.0227272727f, 0.0222222222f, 0.0217391304f, 0.0212765957f, 0.0208333333f, 0.0204081633f, 0.0200000000f, 0.0196078431f, 0.0192307692f, 0.0188679245f, 0.0185185185f, 0.0181818182f, 0.0178571429f, 0.0175438596f, 0.0172413793f, 0.0169491525f, 0.0166666667f, 0.0163934426f, 0.0161290323f, 0.0158730159f, 0.0156250000f, 0.0153846154f, 0.0151515152f, 0.0149253731f, 0.0147058824f, 0.0144927536f, 0.0142857143f, 0.0140845070f, 0.0138888889f, 0.0136986301f, 0.0135135135f, 0.0133333333f, 0.0131578947f, 0.0129870130f, 0.0128205128f, 0.0126582278f, 0.0125000000f, 0.0123456790f, 0.0121951220f, 0.0120481928f, 0.0119047619f, 0.0117647059f, 0.0116279070f, 0.0114942529f, 0.0113636364f, 0.0112359551f, 0.0111111111f, 0.0109890110f, 0.0108695652f, 0.0107526882f, 0.0106382979f, 0.0105263158f, 0.0104166667f, 0.0103092784f, 0.0102040816f, 0.0101010101f, 0.0100000000f, 0.0099009901f, 0.0098039216f, 0.0097087379f, 0.0096153846f, 0.0095238095f, 0.0094339623f, 0.0093457944f, 0.0092592593f, 0.0091743119f, 0.0090909091f, 0.0090090090f, 0.0089285714f, 0.0088495575f, 0.0087719298f, 0.0086956522f, 0.0086206897f, 0.0085470085f, 0.0084745763f, 0.0084033613f, 0.0083333333f, 0.0082644628f, 0.0081967213f, 0.0081300813f, 0.0080645161f, 0.0080000000f, 0.0079365079f, 0.0078740157f, 0.0078125000f, 0.0077519380f, 0.0076923077f, 0.0076335878f, 0.0075757576f, 0.0075187970f, 0.0074626866f, 0.0074074074f, 0.0073529412f, 0.0072992701f, 0.0072463768f, 0.0071942446f, 0.0071428571f, 0.0070921986f, 0.0070422535f, 0.0069930070f, 0.0069444444f, 0.0068965517f, 0.0068493151f, 0.0068027211f, 0.0067567568f, 0.0067114094f, 0.0066666667f, 0.0066225166f, 0.0065789474f, 0.0065359477f, 0.0064935065f, 0.0064516129f, 0.0064102564f, 0.0063694268f, 0.0063291139f, 0.0062893082f, 0.0062500000f +}; + +const float w1N8[30] = {0.998795f, -0.049068f, 0.995185f, -0.098017f, 0.989177f, -0.146730f, 0.980785f, -0.195090f, 0.970031f, -0.242980f, 0.956940f, -0.290285f, 0.941544f, -0.336890f, 0.923880f, -0.382683f, 0.903989f, -0.427555f, 0.881921f, -0.471397f, 0.857729f, -0.514103f, 0.831470f, -0.555570f, 0.803208f, -0.595699f, 0.773010f, -0.634393f, 0.740951f, -0.671559f}; +const float w2N8[30] = {0.995185f, -0.098017f, 0.980785f, -0.195090f, 0.956940f, -0.290285f, 0.923880f, -0.382683f, 0.881921f, -0.471397f, 0.831470f, -0.555570f, 0.773010f, -0.634393f, 0.707107f, -0.707107f, 0.634393f, -0.773010f, 0.555570f, -0.831470f, 0.471397f, -0.881921f, 0.382683f, -0.923880f, 0.290285f, -0.956940f, 0.195090f, -0.980785f, 0.098017f, -0.995185f}; +const float w3N8[30] = {0.989177f, -0.146730f, 0.956940f, -0.290285f, 0.903989f, -0.427555f, 0.831470f, -0.555570f, 0.740951f, -0.671559f, 0.634393f, -0.773010f, 0.514103f, -0.857729f, 0.382683f, -0.923880f, 0.242980f, -0.970031f, 0.098017f, -0.995185f, -0.049068f, -0.998795f, -0.195090f, -0.980785f, -0.336890f, -0.941544f, -0.471397f, -0.881921f, -0.595699f, -0.803208f}; +const float w4N8[30] = {0.980785f, -0.195090f, 0.923880f, -0.382683f, 0.831470f, -0.555570f, 0.707107f, -0.707107f, 0.555570f, -0.831470f, 0.382683f, -0.923880f, 0.195090f, -0.980785f, 0.000000f, -1.000000f, -0.195090f, -0.980785f, -0.382683f, -0.923880f, -0.555570f, -0.831470f, -0.707107f, -0.707107f, -0.831470f, -0.555570f, -0.923880f, -0.382683f, -0.980785f, -0.195090f}; +const float w5N8[30] = {0.970031f, -0.242980f, 0.881921f, -0.471397f, 0.740951f, -0.671559f, 0.555570f, -0.831470f, 0.336890f, -0.941544f, 0.098017f, -0.995185f, -0.146730f, -0.989177f, -0.382683f, -0.923880f, -0.595699f, -0.803208f, -0.773010f, -0.634393f, -0.903989f, -0.427555f, -0.980785f, -0.195090f, -0.998795f, 0.049068f, -0.956940f, 0.290285f, -0.857729f, 0.514103f}; +const float w6N8[30] = {0.956940f, -0.290285f, 0.831470f, -0.555570f, 0.634393f, -0.773010f, 0.382683f, -0.923880f, 0.098017f, -0.995185f, -0.195090f, -0.980785f, -0.471397f, -0.881921f, -0.707107f, -0.707107f, -0.881921f, -0.471397f, -0.980785f, -0.195090f, -0.995185f, 0.098017f, -0.923880f, 0.382683f, -0.773010f, 0.634393f, -0.555570f, 0.831470f, -0.290285f, 0.956940f}; +const float w7N8[30] = {0.941544f, -0.336890f, 0.773010f, -0.634393f, 0.514103f, -0.857729f, 0.195090f, -0.980785f, -0.146730f, -0.989177f, -0.471397f, -0.881921f, -0.740951f, -0.671559f, -0.923880f, -0.382683f, -0.998795f, -0.049068f, -0.956940f, 0.290285f, -0.803208f, 0.595699f, -0.555570f, 0.831470f, -0.242980f, 0.970031f, 0.098017f, 0.995185f, 0.427555f, 0.903989f}; +const float * const w_a[7] = {w1N8, w2N8, w3N8, w4N8, w5N8, w6N8, w7N8}; + + +#define STCP( a, b ) {{ WORD322WORD16( a ), WORD322WORD16( b ) }} + +const PWord16 SineTable512_fx[] = +{ + STCP(0x7fffffff, 0x00000000), STCP(0x7fffd886, 0x006487e3), STCP(0x7fff6216, 0x00c90f88), STCP(0x7ffe9cb2, 0x012d96b1), + STCP(0x7ffd885a, 0x01921d20), STCP(0x7ffc250f, 0x01f6a297), STCP(0x7ffa72d1, 0x025b26d7), STCP(0x7ff871a2, 0x02bfa9a4), + STCP(0x7ff62182, 0x03242abf), STCP(0x7ff38274, 0x0388a9ea), STCP(0x7ff09478, 0x03ed26e6), STCP(0x7fed5791, 0x0451a177), + STCP(0x7fe9cbc0, 0x04b6195d), STCP(0x7fe5f108, 0x051a8e5c), STCP(0x7fe1c76b, 0x057f0035), STCP(0x7fdd4eec, 0x05e36ea9), + STCP(0x7fd8878e, 0x0647d97c), STCP(0x7fd37153, 0x06ac406f), STCP(0x7fce0c3e, 0x0710a345), STCP(0x7fc85854, 0x077501be), + STCP(0x7fc25596, 0x07d95b9e), STCP(0x7fbc040a, 0x083db0a7), STCP(0x7fb563b3, 0x08a2009a), STCP(0x7fae7495, 0x09064b3a), + STCP(0x7fa736b4, 0x096a9049), STCP(0x7f9faa15, 0x09cecf89), STCP(0x7f97cebd, 0x0a3308bd), STCP(0x7f8fa4b0, 0x0a973ba5), + STCP(0x7f872bf3, 0x0afb6805), STCP(0x7f7e648c, 0x0b5f8d9f), STCP(0x7f754e80, 0x0bc3ac35), STCP(0x7f6be9d4, 0x0c27c389), + STCP(0x7f62368f, 0x0c8bd35e), STCP(0x7f5834b7, 0x0cefdb76), STCP(0x7f4de451, 0x0d53db92), STCP(0x7f434563, 0x0db7d376), + STCP(0x7f3857f6, 0x0e1bc2e4), STCP(0x7f2d1c0e, 0x0e7fa99e), STCP(0x7f2191b4, 0x0ee38766), STCP(0x7f15b8ee, 0x0f475bff), + STCP(0x7f0991c4, 0x0fab272b), STCP(0x7efd1c3c, 0x100ee8ad), STCP(0x7ef05860, 0x1072a048), STCP(0x7ee34636, 0x10d64dbd), + STCP(0x7ed5e5c6, 0x1139f0cf), STCP(0x7ec8371a, 0x119d8941), STCP(0x7eba3a39, 0x120116d5), STCP(0x7eabef2c, 0x1264994e), + STCP(0x7e9d55fc, 0x12c8106f), STCP(0x7e8e6eb2, 0x132b7bf9), STCP(0x7e7f3957, 0x138edbb1), STCP(0x7e6fb5f4, 0x13f22f58), + STCP(0x7e5fe493, 0x145576b1), STCP(0x7e4fc53e, 0x14b8b17f), STCP(0x7e3f57ff, 0x151bdf86), STCP(0x7e2e9cdf, 0x157f0086), + STCP(0x7e1d93ea, 0x15e21445), STCP(0x7e0c3d29, 0x16451a83), STCP(0x7dfa98a8, 0x16a81305), STCP(0x7de8a670, 0x170afd8d), + STCP(0x7dd6668f, 0x176dd9de), STCP(0x7dc3d90d, 0x17d0a7bc), STCP(0x7db0fdf8, 0x183366e9), STCP(0x7d9dd55a, 0x18961728), + STCP(0x7d8a5f40, 0x18f8b83c), STCP(0x7d769bb5, 0x195b49ea), STCP(0x7d628ac6, 0x19bdcbf3), STCP(0x7d4e2c7f, 0x1a203e1b), + STCP(0x7d3980ec, 0x1a82a026), STCP(0x7d24881b, 0x1ae4f1d6), STCP(0x7d0f4218, 0x1b4732ef), STCP(0x7cf9aef0, 0x1ba96335), + STCP(0x7ce3ceb2, 0x1c0b826a), STCP(0x7ccda169, 0x1c6d9053), STCP(0x7cb72724, 0x1ccf8cb3), STCP(0x7ca05ff1, 0x1d31774d), + STCP(0x7c894bde, 0x1d934fe5), STCP(0x7c71eaf9, 0x1df5163f), STCP(0x7c5a3d50, 0x1e56ca1e), STCP(0x7c4242f2, 0x1eb86b46), + STCP(0x7c29fbee, 0x1f19f97b), STCP(0x7c116853, 0x1f7b7481), STCP(0x7bf88830, 0x1fdcdc1b), STCP(0x7bdf5b94, 0x203e300d), + STCP(0x7bc5e290, 0x209f701c), STCP(0x7bac1d31, 0x21009c0c), STCP(0x7b920b89, 0x2161b3a0), STCP(0x7b77ada8, 0x21c2b69c), + STCP(0x7b5d039e, 0x2223a4c5), STCP(0x7b420d7a, 0x22847de0), STCP(0x7b26cb4f, 0x22e541af), STCP(0x7b0b3d2c, 0x2345eff8), + STCP(0x7aef6323, 0x23a6887f), STCP(0x7ad33d45, 0x24070b08), STCP(0x7ab6cba4, 0x24677758), STCP(0x7a9a0e50, 0x24c7cd33), + STCP(0x7a7d055b, 0x25280c5e), STCP(0x7a5fb0d8, 0x2588349d), STCP(0x7a4210d8, 0x25e845b6), STCP(0x7a24256f, 0x26483f6c), + STCP(0x7a05eead, 0x26a82186), STCP(0x79e76ca7, 0x2707ebc7), STCP(0x79c89f6e, 0x27679df4), STCP(0x79a98715, 0x27c737d3), + STCP(0x798a23b1, 0x2826b928), STCP(0x796a7554, 0x288621b9), STCP(0x794a7c12, 0x28e5714b), STCP(0x792a37fe, 0x2944a7a2), + STCP(0x7909a92d, 0x29a3c485), STCP(0x78e8cfb2, 0x2a02c7b8), STCP(0x78c7aba2, 0x2a61b101), STCP(0x78a63d11, 0x2ac08026), + STCP(0x78848414, 0x2b1f34eb), STCP(0x786280bf, 0x2b7dcf17), STCP(0x78403329, 0x2bdc4e6f), STCP(0x781d9b65, 0x2c3ab2b9), + STCP(0x77fab989, 0x2c98fbba), STCP(0x77d78daa, 0x2cf72939), STCP(0x77b417df, 0x2d553afc), STCP(0x7790583e, 0x2db330c7), + STCP(0x776c4edb, 0x2e110a62), STCP(0x7747fbce, 0x2e6ec792), STCP(0x77235f2d, 0x2ecc681e), STCP(0x76fe790e, 0x2f29ebcc), + STCP(0x76d94989, 0x2f875262), STCP(0x76b3d0b4, 0x2fe49ba7), STCP(0x768e0ea6, 0x3041c761), STCP(0x76680376, 0x309ed556), + STCP(0x7641af3d, 0x30fbc54d), STCP(0x761b1211, 0x3158970e), STCP(0x75f42c0b, 0x31b54a5e), STCP(0x75ccfd42, 0x3211df04), + STCP(0x75a585cf, 0x326e54c7), STCP(0x757dc5ca, 0x32caab6f), STCP(0x7555bd4c, 0x3326e2c3), STCP(0x752d6c6c, 0x3382fa88), + STCP(0x7504d345, 0x33def287), STCP(0x74dbf1ef, 0x343aca87), STCP(0x74b2c884, 0x34968250), STCP(0x7489571c, 0x34f219a8), + STCP(0x745f9dd1, 0x354d9057), STCP(0x74359cbd, 0x35a8e625), STCP(0x740b53fb, 0x36041ad9), STCP(0x73e0c3a3, 0x365f2e3b), + STCP(0x73b5ebd1, 0x36ba2014), STCP(0x738acc9e, 0x3714f02a), STCP(0x735f6626, 0x376f9e46), STCP(0x7333b883, 0x37ca2a30), + STCP(0x7307c3d0, 0x382493b0), STCP(0x72db8828, 0x387eda8e), STCP(0x72af05a7, 0x38d8fe93), STCP(0x72823c67, 0x3932ff87), + STCP(0x72552c85, 0x398cdd32), STCP(0x7227d61c, 0x39e6975e), STCP(0x71fa3949, 0x3a402dd2), STCP(0x71cc5626, 0x3a99a057), + STCP(0x719e2cd2, 0x3af2eeb7), STCP(0x716fbd68, 0x3b4c18ba), STCP(0x71410805, 0x3ba51e29), STCP(0x71120cc5, 0x3bfdfecd), + STCP(0x70e2cbc6, 0x3c56ba70), STCP(0x70b34525, 0x3caf50da), STCP(0x708378ff, 0x3d07c1d6), STCP(0x70536771, 0x3d600d2c), + STCP(0x7023109a, 0x3db832a6), STCP(0x6ff27497, 0x3e10320d), STCP(0x6fc19385, 0x3e680b2c), STCP(0x6f906d84, 0x3ebfbdcd), + STCP(0x6f5f02b2, 0x3f1749b8), STCP(0x6f2d532c, 0x3f6eaeb8), STCP(0x6efb5f12, 0x3fc5ec98), STCP(0x6ec92683, 0x401d0321), + STCP(0x6e96a99d, 0x4073f21d), STCP(0x6e63e87f, 0x40cab958), STCP(0x6e30e34a, 0x4121589b), STCP(0x6dfd9a1c, 0x4177cfb1), + STCP(0x6dca0d14, 0x41ce1e65), STCP(0x6d963c54, 0x42244481), STCP(0x6d6227fa, 0x427a41d0), STCP(0x6d2dd027, 0x42d0161e), + STCP(0x6cf934fc, 0x4325c135), STCP(0x6cc45698, 0x437b42e1), STCP(0x6c8f351c, 0x43d09aed), STCP(0x6c59d0a9, 0x4425c923), + STCP(0x6c242960, 0x447acd50), STCP(0x6bee3f62, 0x44cfa740), STCP(0x6bb812d1, 0x452456bd), STCP(0x6b81a3cd, 0x4578db93), + STCP(0x6b4af279, 0x45cd358f), STCP(0x6b13fef5, 0x4621647d), STCP(0x6adcc964, 0x46756828), STCP(0x6aa551e9, 0x46c9405c), + STCP(0x6a6d98a4, 0x471cece7), STCP(0x6a359db9, 0x47706d93), STCP(0x69fd614a, 0x47c3c22f), STCP(0x69c4e37a, 0x4816ea86), + STCP(0x698c246c, 0x4869e665), STCP(0x69532442, 0x48bcb599), STCP(0x6919e320, 0x490f57ee), STCP(0x68e06129, 0x4961cd33), + STCP(0x68a69e81, 0x49b41533), STCP(0x686c9b4b, 0x4a062fbd), STCP(0x683257ab, 0x4a581c9e), STCP(0x67f7d3c5, 0x4aa9dba2), + STCP(0x67bd0fbd, 0x4afb6c98), STCP(0x67820bb7, 0x4b4ccf4d), STCP(0x6746c7d8, 0x4b9e0390), STCP(0x670b4444, 0x4bef092d), + STCP(0x66cf8120, 0x4c3fdff4), STCP(0x66937e91, 0x4c9087b1), STCP(0x66573cbb, 0x4ce10034), STCP(0x661abbc5, 0x4d31494b), + STCP(0x65ddfbd3, 0x4d8162c4), STCP(0x65a0fd0b, 0x4dd14c6e), STCP(0x6563bf92, 0x4e210617), STCP(0x6526438f, 0x4e708f8f), + STCP(0x64e88926, 0x4ebfe8a5), STCP(0x64aa907f, 0x4f0f1126), STCP(0x646c59bf, 0x4f5e08e3), STCP(0x642de50d, 0x4faccfab), + STCP(0x63ef3290, 0x4ffb654d), STCP(0x63b0426d, 0x5049c999), STCP(0x637114cc, 0x5097fc5e), STCP(0x6331a9d4, 0x50e5fd6d), + STCP(0x62f201ac, 0x5133cc94), STCP(0x62b21c7b, 0x518169a5), STCP(0x6271fa69, 0x51ced46e), STCP(0x62319b9d, 0x521c0cc2), + STCP(0x61f1003f, 0x5269126e), STCP(0x61b02876, 0x52b5e546), STCP(0x616f146c, 0x53028518), STCP(0x612dc447, 0x534ef1b5), + STCP(0x60ec3830, 0x539b2af0), STCP(0x60aa7050, 0x53e73097), STCP(0x60686ccf, 0x5433027d), STCP(0x60262dd6, 0x547ea073), + STCP(0x5fe3b38d, 0x54ca0a4b), STCP(0x5fa0fe1f, 0x55153fd4), STCP(0x5f5e0db3, 0x556040e2), STCP(0x5f1ae274, 0x55ab0d46), + STCP(0x5ed77c8a, 0x55f5a4d2), STCP(0x5e93dc1f, 0x56400758), STCP(0x5e50015d, 0x568a34a9), STCP(0x5e0bec6e, 0x56d42c99), + STCP(0x5dc79d7c, 0x571deefa), STCP(0x5d8314b1, 0x57677b9d), STCP(0x5d3e5237, 0x57b0d256), STCP(0x5cf95638, 0x57f9f2f8), + STCP(0x5cb420e0, 0x5842dd54), STCP(0x5c6eb258, 0x588b9140), STCP(0x5c290acc, 0x58d40e8c), STCP(0x5be32a67, 0x591c550e), + STCP(0x5b9d1154, 0x59646498), STCP(0x5b56bfbd, 0x59ac3cfd), STCP(0x5b1035cf, 0x59f3de12), STCP(0x5ac973b5, 0x5a3b47ab), + STCP(0x5a82799a, 0x5a82799a) +}; + +/* Lookup-Table for binary logarithm */ +const Word16 ldCoeff[7] = +{ + -32768, -16384, -10923, -8192, -6554, -5461, -4681 + /* -4096, -3641, -3277 */ +}; + +/* Lookup-Table for binary power algorithm */ +/* This table is used for lookup 2^x with x in range [0...1.0[ in steps of 1/32 */ +const UWord32 exp2_tab_long[32] = +{ + 0x40000000,0x4166C34C,0x42D561B4,0x444C0740, + 0x45CAE0F2,0x47521CC6,0x48E1E9BA,0x4A7A77D4, + 0x4C1BF829,0x4DC69CDD,0x4F7A9930,0x51382182, + 0x52FF6B55,0x54D0AD5A,0x56AC1F75,0x5891FAC1, + 0x5A82799A,0x5C7DD7A4,0x5E8451D0,0x60962665, + 0x62B39509,0x64DCDEC3,0x6712460B,0x69540EC9, + 0x6BA27E65,0x6DFDDBCC,0x70666F76,0x72DC8374, + 0x75606374,0x77F25CCE,0x7A92BE8B,0x7D41D96E +}; + +/* Lookup-Table for binary power algorithm */ +/* This table is used for lookup 2^x with x in range [0...1/32[ in steps of 1/1024 */ +const UWord32 exp2w_tab_long[32] = +{ + 0x40000000,0x400B1818,0x4016321B,0x40214E0C, + 0x402C6BE9,0x40378BB4,0x4042AD6D,0x404DD113, + 0x4058F6A8,0x40641E2B,0x406F479E,0x407A7300, + 0x4085A051,0x4090CF92,0x409C00C4,0x40A733E6, + 0x40B268FA,0x40BD9FFF,0x40C8D8F5,0x40D413DD, + 0x40DF50B8,0x40EA8F86,0x40F5D046,0x410112FA, + 0x410C57A2,0x41179E3D,0x4122E6CD,0x412E3152, + 0x41397DCC,0x4144CC3B,0x41501CA0,0x415B6EFB +}; + +/* Lookup-Table for binary power algorithm */ +/* This table is used for lookup 2^x with x in range [0...1/1024[ in steps of 1/32768 */ +const UWord32 exp2x_tab_long[32] = +{ + 0x40000000,0x400058B9,0x4000B173,0x40010A2D, + 0x400162E8,0x4001BBA3,0x4002145F,0x40026D1B, + 0x4002C5D8,0x40031E95,0x40037752,0x4003D011, + 0x400428CF,0x4004818E,0x4004DA4E,0x4005330E, + 0x40058BCE,0x4005E48F,0x40063D51,0x40069613, + 0x4006EED5,0x40074798,0x4007A05B,0x4007F91F, + 0x400851E4,0x4008AAA8,0x4009036E,0x40095C33, + 0x4009B4FA,0x400A0DC0,0x400A6688,0x400ABF4F +}; + +/* square root tables */ +const Word32 SqrtTable[32] = /* Q31 */ +{ + 0x5A82D429, 0x5BEA10FE, 0x5D4BE6E5, 0x5EA89270, 0x60004BE2, 0x615347A1, 0x62A1B68C, 0x63EBC651, + 0x6531A1B5, 0x667370D4, 0x67B1595F, 0x68EB7EC8, 0x6A220277, 0x6B5503F0, 0x6C84A0F9, 0x6DB0F5BD, + 0x6EDA1CE9, 0x70002FC7, 0x7123465A, 0x72437773, 0x7360D8C5, 0x747B7EFA, 0x75937DC4, 0x76A8E7EB, + 0x77BBCF60, 0x78CC4545, 0x79DA5A00, 0x7AE61D3E, 0x7BEF9E07, 0x7CF6EAC2, 0x7DFC113F, 0x7EFF1EC0 +}; + +const Word16 SqrtDiffTable[32] = /* Q21 */ +{ + 0x59CF, 0x5875, 0x572B, 0x55EE, 0x54BF, 0x539C, 0x5284, 0x5177, + 0x5074, 0x4F7A, 0x4E89, 0x4DA1, 0x4CC0, 0x4BE7, 0x4B15, 0x4A4A, + 0x4985, 0x48C6, 0x480C, 0x4758, 0x46AA, 0x4600, 0x455B, 0x44BA, + 0x441D, 0x4385, 0x42F1, 0x4260, 0x41D3, 0x414A, 0x40C3, 0x4040 +}; + +const Word32 ISqrtTable[32] = /* Q31 */ +{ + 0x7FFE7F85, 0x7E0A4E25, 0x7C2C56C7, 0x7A63002C, 0x78ACD922, 0x7708939D, 0x75750088, 0x73F10C2D, + 0x727BBB1A, 0x71142774, 0x6FB97EA5, 0x6E6AFF54, 0x6D27F79D, 0x6BEFC388, 0x6AC1CBA4, 0x699D83DA, + 0x68826A53, 0x6770068E, 0x6665E882, 0x6563A7DF, 0x6468E364, 0x63754043, 0x62886999, 0x61A20FEE, + 0x60C1E8C8, 0x5FE7AE45, 0x5F131EBE, 0x5E43FC76, 0x5D7A0D4F, 0x5CB51A81, 0x5BF4F061, 0x5B395E26 +}; + +const Word16 ISqrtDiffTable[32] = /* Q21 */ +{ + 0x7D0C, 0x777E, 0x7256, 0x6D8A, 0x6911, 0x64E5, 0x60FD, 0x5D54, + 0x59E5, 0x56AA, 0x53A0, 0x50C2, 0x4E0D, 0x4B7E, 0x4912, 0x46C6, + 0x4499, 0x4288, 0x4090, 0x3EB1, 0x3CE9, 0x3B36, 0x3996, 0x380A, + 0x368F, 0x3524, 0x33C9, 0x327C, 0x313D, 0x300B, 0x2EE5, 0x2DCA +}; + +/* 1/x tables */ +const Word32 InvTable[32] = /* Q31 */ +{ + 0x7FFBFE40, 0x7C1B608E, 0x78752176, 0x750440BA, 0x71C44C49, 0x6EB14D0A, 0x6BC7B6B4, 0x69045A19, + 0x6664598A, 0x63E51EE2, 0x61845308, 0x5F3FD698, 0x5D15BB8E, 0x5B043FD0, 0x5909C861, 0x5724DD3C, + 0x555425B2, 0x53966532, 0x51EA787F, 0x504F5331, 0x4EC3FD84, 0x4D479267, 0x4BD93DBE, 0x4A783ADC, + 0x4923D31D, 0x47DB5CAE, 0x469E3974, 0x456BD608, 0x4443A8D9, 0x43253159, 0x420FF746, 0x41038A01 +}; + +const Word16 InvDiffTable[32] = /* Q20 */ +{ + 0x7C14, 0x74C8, 0x6E1C, 0x67FF, 0x6260, 0x5D33, 0x586C, 0x5400, + 0x4FE7, 0x4C19, 0x4890, 0x4543, 0x422F, 0x3F4F, 0x3C9D, 0x3A17, + 0x37B8, 0x357E, 0x3365, 0x316B, 0x2F8D, 0x2DCB, 0x2C20, 0x2A8D, + 0x290F, 0x27A4, 0x264C, 0x2506, 0x23CF, 0x22A7, 0x218E, 0x2081 +}; + + +const float tcx_mdct_window_48[420] = +{ + 0.00186999f , 0.00560996f , 0.00934984f , 0.01308960f , 0.01682917f , 0.02056850f , 0.02430755f , 0.02804626f , 0.03178458f , 0.03552244f , + 0.03925982f , 0.04299664f , 0.04673287f , 0.05046843f , 0.05420330f , 0.05793741f , 0.06167070f , 0.06540313f , 0.06913465f , 0.07286520f , + 0.07659473f , 0.08032320f , 0.08405053f , 0.08777669f , 0.09150162f , 0.09522527f , 0.09894760f , 0.10266854f , 0.10638804f , 0.11010605f , + 0.11382252f , 0.11753740f , 0.12125064f , 0.12496217f , 0.12867197f , 0.13237998f , 0.13608611f , 0.13979036f , 0.14349262f , 0.14719291f , + 0.15089111f , 0.15458722f , 0.15828118f , 0.16197290f , 0.16566236f , 0.16934951f , 0.17303430f , 0.17671664f , 0.18039654f , 0.18407391f , + 0.18774869f , 0.19142085f , 0.19509032f , 0.19875708f , 0.20242107f , 0.20608221f , 0.20974047f , 0.21339579f , 0.21704814f , 0.22069745f , + 0.22434367f , 0.22798675f , 0.23162664f , 0.23526330f , 0.23889665f , 0.24252668f , 0.24615330f , 0.24977650f , 0.25339618f , 0.25701234f , + 0.26062489f , 0.26423380f , 0.26783898f , 0.27144048f , 0.27503812f , 0.27863196f , 0.28222188f , 0.28580785f , 0.28938982f , 0.29296774f , + 0.29654160f , 0.30011126f , 0.30367675f , 0.30723801f , 0.31079495f , 0.31434754f , 0.31789574f , 0.32143947f , 0.32497874f , 0.32851344f , + 0.33204356f , 0.33556902f , 0.33908981f , 0.34260586f , 0.34611708f , 0.34962347f , 0.35312498f , 0.35662156f , 0.36011314f , 0.36359966f , + 0.36708114f , 0.37055746f , 0.37402859f , 0.37749448f , 0.38095513f , 0.38441044f , 0.38786036f , 0.39130485f , 0.39474389f , 0.39817739f , + 0.40160531f , 0.40502763f , 0.40844429f , 0.41185522f , 0.41526040f , 0.41865978f , 0.42205328f , 0.42544088f , 0.42882255f , 0.43219820f , + 0.43556780f , 0.43893135f , 0.44228873f , 0.44563991f , 0.44898486f , 0.45232356f , 0.45565590f , 0.45898187f , 0.46230146f , 0.46561456f , + 0.46892112f , 0.47222117f , 0.47551456f , 0.47880134f , 0.48208141f , 0.48535472f , 0.48862126f , 0.49188098f , 0.49513379f , 0.49837968f , + 0.50161862f , 0.50485051f , 0.50807536f , 0.51129311f , 0.51450372f , 0.51770711f , 0.52090323f , 0.52409208f , 0.52727365f , 0.53044778f , + 0.53361452f , 0.53677386f , 0.53992558f , 0.54306978f , 0.54620641f , 0.54933536f , 0.55245668f , 0.55557030f , 0.55867606f , 0.56177408f , + 0.56486416f , 0.56794637f , 0.57102066f , 0.57408696f , 0.57714522f , 0.58019543f , 0.58323747f , 0.58627141f , 0.58929712f , 0.59231454f , + 0.59532380f , 0.59832466f , 0.60131711f , 0.60430121f , 0.60727680f , 0.61024398f , 0.61320257f , 0.61615258f , 0.61909395f , 0.62202674f , + 0.62495077f , 0.62786609f , 0.63077259f , 0.63367027f , 0.63655913f , 0.63943905f , 0.64231002f , 0.64517200f , 0.64802498f , 0.65086889f , + 0.65370369f , 0.65652937f , 0.65934587f , 0.66215312f , 0.66495109f , 0.66773981f , 0.67051917f , 0.67328912f , 0.67604965f , 0.67880082f , + 0.68154240f , 0.68427444f , 0.68699700f , 0.68970984f , 0.69241309f , 0.69510663f , 0.69779050f , 0.70046461f , 0.70312881f , 0.70578331f , + 0.70842785f , 0.71106249f , 0.71368724f , 0.71630198f , 0.71890670f , 0.72150135f , 0.72408593f , 0.72666037f , 0.72922462f , 0.73177868f , + 0.73432255f , 0.73685610f , 0.73937935f , 0.74189228f , 0.74439484f , 0.74688697f , 0.74936867f , 0.75183988f , 0.75430053f , 0.75675064f , + 0.75919020f , 0.76161915f , 0.76403743f , 0.76644498f , 0.76884186f , 0.77122796f , 0.77360326f , 0.77596778f , 0.77832144f , 0.78066421f , + 0.78299606f , 0.78531700f , 0.78762686f , 0.78992575f , 0.79221362f , 0.79449034f , 0.79675603f , 0.79901052f , 0.80125386f , 0.80348599f , + 0.80570680f , 0.80791646f , 0.81011480f , 0.81230175f , 0.81447738f , 0.81664157f , 0.81879437f , 0.82093573f , 0.82306564f , 0.82518393f , + 0.82729077f , 0.82938600f , 0.83146966f , 0.83354163f , 0.83560199f , 0.83765066f , 0.83968759f , 0.84171283f , 0.84372622f , 0.84572780f , + 0.84771764f , 0.84969556f , 0.85166162f , 0.85361582f , 0.85555798f , 0.85748821f , 0.85940647f , 0.86131269f , 0.86320680f , 0.86508894f , + 0.86695892f , 0.86881679f , 0.87066251f , 0.87249607f , 0.87431735f , 0.87612653f , 0.87792331f , 0.87970787f , 0.88148010f , 0.88324010f , + 0.88498765f , 0.88672286f , 0.88844568f , 0.89015603f , 0.89185393f , 0.89353943f , 0.89521235f , 0.89687276f , 0.89852065f , 0.90015596f , + 0.90177864f , 0.90338880f , 0.90498626f , 0.90657103f , 0.90814322f , 0.90970266f , 0.91124934f , 0.91278332f , 0.91430449f , 0.91581285f , + 0.91730851f , 0.91879123f , 0.92026114f , 0.92171818f , 0.92316234f , 0.92459357f , 0.92601186f , 0.92741722f , 0.92880958f , 0.93018895f , + 0.93155533f , 0.93290865f , 0.93424892f , 0.93557620f , 0.93689030f , 0.93819135f , 0.93947929f , 0.94075406f , 0.94201565f , 0.94326407f , + 0.94449931f , 0.94572133f , 0.94693017f , 0.94812572f , 0.94930798f , 0.95047700f , 0.95163274f , 0.95277512f , 0.95390421f , 0.95501995f , + 0.95612234f , 0.95721138f , 0.95828700f , 0.95934916f , 0.96039802f , 0.96143335f , 0.96245527f , 0.96346366f , 0.96445870f , 0.96544015f , + 0.96640813f , 0.96736264f , 0.96830356f , 0.96923089f , 0.97014475f , 0.97104502f , 0.97193170f , 0.97280478f , 0.97366422f , 0.97451007f , + 0.97534233f , 0.97616094f , 0.97696584f , 0.97775710f , 0.97853470f , 0.97929859f , 0.98004884f , 0.98078531f , 0.98150808f , 0.98221713f , + 0.98291242f , 0.98359400f , 0.98426181f , 0.98491579f , 0.98555607f , 0.98618257f , 0.98679525f , 0.98739409f , 0.98797917f , 0.98855042f , + 0.98910779f , 0.98965138f , 0.99018115f , 0.99069703f , 0.99119908f , 0.99168724f , 0.99216151f , 0.99262190f , 0.99306846f , 0.99350113f , + 0.99391985f , 0.99432468f , 0.99471563f , 0.99509263f , 0.99545574f , 0.99580491f , 0.99614018f , 0.99646151f , 0.99676889f , 0.99706233f , + 0.99734181f , 0.99760735f , 0.99785894f , 0.99809659f , 0.99832022f , 0.99852991f , 0.99872565f , 0.99890745f , 0.99907523f , 0.99922901f , + 0.99936891f , 0.99949473f , 0.99960661f , 0.99970454f , 0.99978846f , 0.99985838f , 0.99991435f , 0.99995631f , 0.99998426f , 0.99999827f , +}; + +const float tcx_mdct_window_half_48[180] = +{ + 0.00436331f , 0.01308960f , 0.02181488f , 0.03053851f , 0.03925982f , 0.04797813f , 0.05669279f , 0.06540313f , 0.07410849f , 0.08280820f , + 0.09150162f , 0.10018806f , 0.10886688f , 0.11753739f , 0.12619896f , 0.13485092f , 0.14349262f , 0.15212339f , 0.16074257f , 0.16934951f , + 0.17794354f , 0.18652403f , 0.19509032f , 0.20364176f , 0.21217766f , 0.22069743f , 0.22920039f , 0.23768589f , 0.24615328f , 0.25460196f , + 0.26303121f , 0.27144045f , 0.27982903f , 0.28819627f , 0.29654157f , 0.30486432f , 0.31316379f , 0.32143945f , 0.32969064f , 0.33791670f , + 0.34611705f , 0.35429105f , 0.36243802f , 0.37055743f , 0.37864861f , 0.38671094f , 0.39474386f , 0.40274671f , 0.41071883f , 0.41865975f , + 0.42656875f , 0.43444523f , 0.44228870f , 0.45009845f , 0.45787391f , 0.46561453f , 0.47331968f , 0.48098877f , 0.48862121f , 0.49621648f , + 0.50377399f , 0.51129311f , 0.51877326f , 0.52621394f , 0.53361452f , 0.54097444f , 0.54829323f , 0.55557024f , 0.56280494f , 0.56999677f , + 0.57714516f , 0.58424968f , 0.59130967f , 0.59832460f , 0.60529399f , 0.61221731f , 0.61909395f , 0.62592345f , 0.63270533f , 0.63943899f , + 0.64612401f , 0.65275973f , 0.65934581f , 0.66588163f , 0.67236680f , 0.67880076f , 0.68518299f , 0.69151300f , 0.69779044f , 0.70401472f , + 0.71018535f , 0.71630198f , 0.72236395f , 0.72837096f , 0.73432249f , 0.74021810f , 0.74605739f , 0.75183982f , 0.75756502f , 0.76323247f , + 0.76884180f , 0.77439266f , 0.77988446f , 0.78531694f , 0.79068959f , 0.79600197f , 0.80125380f , 0.80644459f , 0.81157398f , 0.81664157f , + 0.82164693f , 0.82658976f , 0.83146960f , 0.83628613f , 0.84103900f , 0.84572780f , 0.85035223f , 0.85491186f , 0.85940641f , 0.86383545f , + 0.86819881f , 0.87249601f , 0.87672675f , 0.88089073f , 0.88498765f , 0.88901716f , 0.89297891f , 0.89687276f , 0.90069824f , 0.90445518f , + 0.90814316f , 0.91176200f , 0.91531146f , 0.91879117f , 0.92220098f , 0.92554051f , 0.92880958f , 0.93200785f , 0.93513519f , 0.93819135f , + 0.94117600f , 0.94408906f , 0.94693011f , 0.94969910f , 0.95239580f , 0.95501995f , 0.95757139f , 0.96004987f , 0.96245521f , 0.96478730f , + 0.96704590f , 0.96923089f , 0.97134209f , 0.97337925f , 0.97534233f , 0.97723109f , 0.97904545f , 0.98078525f , 0.98245043f , 0.98404068f , + 0.98555607f , 0.98699635f , 0.98836148f , 0.98965138f , 0.99086589f , 0.99200493f , 0.99306846f , 0.99405634f , 0.99496853f , 0.99580491f , + 0.99656552f , 0.99725020f , 0.99785894f , 0.99839169f , 0.99884838f , 0.99922901f , 0.99953359f , 0.99976200f , 0.99991435f , 0.99999046f , +}; + +const float tcx_mdct_window_trans_48[60] = +{ + 0.01308960f , 0.03925982f , 0.06540313f , 0.09150162f , 0.11753740f , 0.14349262f , 0.16934951f , 0.19509032f , 0.22069745f , 0.24615330f , + 0.27144045f , 0.29654160f , 0.32143945f , 0.34611708f , 0.37055743f , 0.39474389f , 0.41865975f , 0.44228873f , 0.46561453f , 0.48862126f , + 0.51129311f , 0.53361452f , 0.55557024f , 0.57714522f , 0.59832460f , 0.61909395f , 0.63943899f , 0.65934587f , 0.67880076f , 0.69779050f , + 0.71630198f , 0.73432255f , 0.75183982f , 0.76884186f , 0.78531694f , 0.80125386f , 0.81664157f , 0.83146966f , 0.84572780f , 0.85940641f , + 0.87249607f , 0.88498765f , 0.89687276f , 0.90814316f , 0.91879123f , 0.92880958f , 0.93819135f , 0.94693011f , 0.95501995f , 0.96245527f , + 0.96923089f , 0.97534233f , 0.98078531f , 0.98555607f , 0.98965138f , 0.99306846f , 0.99580491f , 0.99785894f , 0.99922901f , 0.99991435f , +}; + + +/*----------------------------------------------------------------------------------* + * SWB TBE LSF tables (1.75 kbps) + *----------------------------------------------------------------------------------*/ + +const float sigma_BWE[] = { + 0.007921463476314f, 0.007777463575548f, 0.008177571366090f, 0.008137429089606f, 0.008964571099066f, + 0.009613750221879f, 0.018255917586799f, 0.018995351636606f, /* for 4 bits first stage */ + 0.008809121277345f, 0.008799007638233f, 0.009070002122415f, 0.009080199707624f, 0.009739951681282f, + 0.010572954192948f, 0.018255917586799f, 0.018995351636606f }; /* for 3 bits first stage */ + + +const float inv_sigma_BWE[] = { + 126.2392994665869f, 128.5766227364854f, 122.2856952550425f, 122.8889356808437f, 111.5502335749417f, + 104.0176806054527f, 54.7767591108706f, 52.6444584512409f, /* for 4 bits first stage */ + 113.5187005055512f, 113.6491796705346f, 110.2535574416955f, 110.1297363713734f, 102.6699138479089f, + 94.5809450935691f, 54.7767591108706f, 52.6444584512409f /* for 3 bits fiest stage */ + }; + +const float SHB_LSF_mean[10] = { + 0.04131f, 0.08078f, 0.12348f, 0.16567f, 0.21045f, 0.25449f, 0.30101f, 0.34693f, 0.39605f, 0.44428f +}; + +/* 4 bit VQ first stage */ +/* An 6-by-16 matrix */ +const float SHB_LSF_VQ4[96] = { + 0.00458f, 0.00158f, -0.01548f, -0.03011f, -0.03405f, -0.02881f, + -0.00563f, -0.00235f, 0.00290f, 0.00711f, 0.01343f, 0.01517f, + -0.00353f, -0.00329f, -0.00335f, -0.00740f, -0.01364f, -0.01809f, + 0.01182f, 0.02439f, 0.03457f, 0.03855f, 0.03844f, 0.03426f, + -0.00393f, -0.01831f, -0.03707f, -0.04240f, -0.04027f, -0.03102f, + 0.01627f, 0.01295f, 0.00453f, -0.00382f, -0.01155f, -0.01531f, + -0.01031f, -0.01803f, -0.01792f, -0.01925f, -0.02185f, -0.02290f, + 0.01540f, 0.02593f, 0.02290f, 0.01553f, 0.00715f, 0.00208f, + 0.00539f, -0.00543f, -0.01244f, 0.01000f, 0.00631f, 0.00066f, + -0.00329f, 0.01043f, 0.01291f, 0.00806f, -0.00054f, -0.00551f, + -0.00337f, -0.01163f, -0.02186f, -0.02214f, -0.00709f, -0.00129f, + 0.00521f, 0.00811f, 0.00835f, 0.01026f, 0.01212f, 0.01374f, + 0.00212f, 0.00871f, 0.01585f, 0.02096f, 0.02002f, 0.01723f, + 0.00368f, 0.00352f, -0.00376f, -0.01167f, -0.00058f, 0.00715f, + -0.01151f, -0.01920f, -0.00905f, -0.00292f, 0.00065f, 0.00195f, + -0.00631f, -0.01393f, 0.01581f, 0.01441f, 0.00548f, 0.00070f +}; + +/* 3 bit VQ first stage */ +const float SHB_LSF_VQ3[48] = { + 0.0085f, 0.0123f, 0.0087f, 0.0020f, -0.0063f, -0.0103f, + 0.0118f, 0.0235f, 0.0256f, 0.0230f, 0.0183f, 0.0136f, + -0.0060f, -0.0139f, -0.0186f, -0.0160f, -0.0063f, -0.0024f, + 0.0012f, 0.0061f, 0.0120f, 0.0157f, 0.0150f, 0.0141f, + -0.0028f, -0.0133f, -0.0299f, -0.0379f, -0.0374f, -0.0298f, + -0.0016f, -0.0030f, -0.0066f, -0.0129f, -0.0183f, -0.0210f, + 0.0039f, 0.0042f, 0.0000f, 0.0016f, 0.0092f, 0.0126f, + -0.0085f, -0.0129f, 0.0003f, 0.0061f, 0.0042f, 0.0022f +}; + +const float *const cb_LSF_BWE[] = { SHB_LSF_VQ4, SHB_LSF_VQ3 }; + +const int16_t mslvq_SHB_min_bits[] = {14, 12}; /* for 4 bits and 3 bits respectively */ +const float scales_BWE[] = { + 0.932f, 1.677f, 2.811f, /* 14 bits*/ + 0.891f, 1.770f, 3.002f, /* 15 bits */ + 0.849f, 1.769f, 3.226f}; /* 16 bits */ + + +const Word8 no_lead_BWE[] = { + 8, 6, 5, /* 14 bits */ + 10,9,5, /* 15 bits*/ + 16, 11, 5}; /* 16 bits */ + + +const float scales_BWE_3b[] = { + 0.958f, 1.741f, 3.532f, /* 12 bits */ + 0.929f, 1.559f, 2.630f, /* 13 bits */ + 0.885f, 1.549f, 2.815f /* 14 bits*/ +}; + +const Word8 no_lead_BWE_3b[] = { + 4, 5, 2, /* 12 bits */ + 5, 5, 5, /* 13 bits */ + 8, 6, 5 /* 14 bits */ + }; + +const float LastCoefPred_0bit[18] = { + 0.00509f, -0.01367f, -0.00675f, -0.00555f, 0.00160f, 0.04158f, 0.12546f, 0.51500f, -0.00000f, + 0.00817f, -0.00645f, -0.00937f, -0.00726f, 0.00363f, 0.02148f, 0.08237f, 0.20400f, 0.00000f +}; + + +const float LastCoefPred_1bit[36] = { + 0.01760f, -0.02193f, 0.01160f, 0.00841f, 0.01782f, 0.04071f, 0.10121f, 0.37727f, 0.00451f, + 0.02473f, -0.01250f, 0.00545f, -0.00340f, 0.00952f, 0.01055f, 0.06447f, 0.14326f, 0.00430f, + -0.01490f, -0.01315f, -0.00990f, -0.00583f, -0.01288f, 0.05020f, 0.14868f, 0.68413f, -0.01206f, + -0.01554f, -0.02277f, -0.00474f, 0.00468f, 0.01070f, 0.04327f, 0.09857f, 0.26611f, -0.01164f +}; + +const int16_t config_LSF_BWE[] = { + 4, 16, 1, /* 21 bits */ + 4, 16, 1, /* 20 */ + 4, 16, 1, /* 19 */ + 3, 8, 1, /* 18 */ + 3, 8, 1, /* 17 */ + 3, 8, 0 /* 16 */ +}; + +/* clang-format on */ diff --git a/lib_com/rom_com.h b/lib_com/rom_com.h new file mode 100644 index 0000000000000000000000000000000000000000..f5e2eef1d018c50a190428f62d11c0beaf76f117 --- /dev/null +++ b/lib_com/rom_com.h @@ -0,0 +1,1367 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#ifndef ROM_COM_H +#define ROM_COM_H + +#include +#include "options.h" +#include "stat_enc.h" +#include "stat_dec.h" +#include "stl.h" +#include "basop_util.h" + +typedef struct +{ + int32_t fin; /* input frequency */ + int32_t fout; /* output frequency */ + int16_t fac_num; /* numerator of resampling factor */ + const float *filter; /* resampling filter coefficients */ + int16_t filt_len; /* number of filter coeff. */ + uint16_t flags; /* flags from config. table */ +} Resampling_cfg; + +typedef struct +{ + int16_t bands; + int16_t bw; + const int16_t *band_width; + Word32 L_qint; + Word16 eref_fx; + Word16 bit_alloc_weight_fx; + int16_t gqlevs; + int16_t Ngq; + int16_t p2a_bands; + float p2a_th; + float pd_thresh; + float ld_slope; + float ni_coef; + float ni_pd_th; +} Xcore_Config; + +/*-----------------------------------------------------------------* + * Table of bitrates + *-----------------------------------------------------------------*/ + +extern const int32_t brate_tbl[SIZE_BRATE_TBL]; +extern const int32_t brate_intermed_tbl[]; +extern const int32_t acelp_sig_tbl[MAX_ACELP_SIG]; + +/*-----------------------------------------------------------------* + * Bit-allocation tables + *-----------------------------------------------------------------*/ + +extern const int16_t LSF_bits_tbl[]; /* Bit allocation table for end-frame ISF quantizer */ +extern const int16_t mid_LSF_bits_tbl[]; /* Bit allocation table for mid-frame ISF quantizer */ +extern const int16_t Es_pred_bits_tbl[]; /* Bit allocation table for scaled innovation energy prediction */ +extern const int16_t gain_bits_tbl[]; /* Bit allocation table for gain quantizer */ + +extern const int16_t ACB_bits_tbl[]; /* Bit allocation table for adaptive codebook (pitch) */ +extern const int16_t FCB_bits_tbl[]; /* Bit allocation table for algebraic (fixed) codebook (innovation) */ +extern const int16_t reserved_bits_tbl[]; /* Bit allocation table for reseved bits */ + +extern const int16_t ACB_bits_16kHz_tbl[]; /* Bit allocation table for adaptive codebook (pitch) @16kHz */ +extern const int16_t FCB_bits_16kHz_tbl[]; /* Bit allocation table for algebraic (fixed) codebook (innovation) @16kHz */ +extern const int16_t gain_bits_16kHz_tbl[]; /* Bit allocation table for gain quantizer @16kHz */ +extern const int16_t AVQ_bits_16kHz_tbl[]; /* Bit allocation table for AVQ bits @16kHz ACELP, active segments */ + +extern const uint32_t pulsestostates[17][9]; /* Number of states for any combination of pulses in any combination of vector length */ + +extern const uint8_t ACELP_NRG_MODE[RATE_MODE_MAX][BANDWIDTH_MODE_MAX][ACELP_MODE_MAX + RF_MODE_MAX]; +extern const uint8_t ACELP_NRG_BITS[3]; + +extern const uint8_t ACELP_LTP_MODE[RATE_MODE_MAX][BANDWIDTH_MODE_MAX][ACELP_MODE_MAX + RF_MODE_MAX]; +extern const uint8_t ACELP_LTP_BITS[RATE_MODE_MAX][BANDWIDTH_MODE_MAX][ACELP_MODE_MAX + RF_MODE_MAX]; +extern const uint8_t ACELP_LTP_BITS_SFR[8 + RF_MODE_MAX][5]; + +extern const uint8_t ACELP_LTF_MODE[RATE_MODE_MAX][BANDWIDTH_MODE_MAX][ACELP_MODE_MAX + RF_MODE_MAX]; +extern const uint8_t ACELP_LTF_BITS[4]; + +extern const uint8_t ACELP_GAINS_MODE[RATE_MODE_MAX][BANDWIDTH_MODE_MAX][ACELP_MODE_MAX + RF_MODE_MAX]; +extern const uint8_t ACELP_GAINS_BITS[10]; + +extern const uint8_t ACELP_BPF_MODE[RATE_MODE_MAX][BANDWIDTH_MODE_MAX][ACELP_MODE_MAX + RF_MODE_MAX]; +extern const uint8_t ACELP_BPF_BITS[3]; + + +/*----------------------------------------------------------------------------------* + * Pre-processing + *----------------------------------------------------------------------------------*/ + +extern const float inv_tbl[]; /* Table of 1/x values */ + +extern const Resampling_cfg resampling_cfg_tbl[]; /* table of resampling configurations */ +extern const FrameSizeParams FrameSizeConfig[FRAME_SIZE_NB]; + +extern const float h_high[]; /* HP filter for filtering random part of excitation in FEC */ +extern const float crit_bands[]; /* Table of critical bands */ +extern const float sincos_t[]; /* FFT - sinus and cosinus tables */ +extern const float sincos_t_ext[]; +extern const float sincos_t_rad3[]; +extern const int16_t fft256_read_indexes[]; /* FFT */ +extern const float inter4_2[]; /* 1/4 resolution interpolation filter */ +extern const float LP_assym_window[]; /* Assymetric window for LP analysis @12.8kHz */ +extern const float LP_assym_window_16k[]; /* Assymetric window for LP analysis @16kHz */ +extern const float hamcos_window[]; /* Hamming-Cosinus window */ +extern const float grid50[]; /* Table of grid points for evaluating Chebyshev polynomials */ +extern const float grid40[]; /* Table of grid points for evaluating Chebyshev polynomials */ +extern const float grid100[]; /* Table of 100 grid points for evaluating Chebyshev polynomials */ + +extern const float wind_sss[LEN_WIN_SSS]; /* window for modify_sf ana */ +extern const float filter5_39s320_120[]; /* LP FIR filter for 8kHz signal resampling */ + +extern const float lag_window_8k[17]; +extern const float lag_window_12k8[][17]; +extern const float lag_window_16k[][17]; +extern const float lag_window_25k6[][17]; +extern const float lag_window_32k[][17]; +extern const float lag_window_48k[17]; +extern const float interpol_frac2[]; /* LPC interpolation coefficients for two-subframe mode */ +extern const float interpol_frac2_mid[]; /* LPC interpolation coefficients with mid-ISFs for two-subframe mode */ +extern const float interpol_frac_12k8[]; /* LPC interpolation coefficients */ +extern const float interpol_isp_amr_wb[]; /* LPC interpolation coefficients for AMR-WB interoperable mode */ +extern const float interpol_frac_16k[]; /* LPC interpolation coefficients @ 16kHz */ +extern const float interpol_frac_mid[]; /* LPC interpolation coefficients with mid-ISFs */ +extern const float interpol_frac_mid_16k[]; /* LPC interpolation coefficients with mid-ISFs @ 16kHz */ +extern const float interpol_frac_mid_relaxprev_12k8[]; /* LPC interpolation coefficients with mid-ISFs @ 16kHz - relaxed prev frame interp */ +extern const float interpol_frac_mid_FEC[]; /* LPC interpolation coefficients with mid-ISFs - FEC */ +extern const float interpol_frac_mid_relaxprev_16k[]; /* LPC interpolation coefficients with mid-ISFs @ 16kHz - relaxed prev frame interp */ +extern const float interpol_frac_mid_16k_FEC[]; /* LPC interpolation coefficients with mid-ISFs @ 16kHz - FEC */ +extern const float interpol_frac_mid_relaxprev_pred_12k8[]; +extern const float interpol_frac_mid_relaxprev_pred_16k[]; + +extern const float inter6_2[PIT_FIR_SIZE6_2]; +extern const float inter4_2tcx2[4][4]; +extern const float inter6_2tcx2[6][4]; +typedef struct TCX_LTP_FILTER +{ + const float *filt; + int16_t length; +} TCX_LTP_FILTER; +extern const TCX_LTP_FILTER tcxLtpFilters[12]; + +extern const float gain_qua_mless_7b[]; /* Gain quantization - gain quantization table */ +extern const float gain_qua_mless_6b_stereo[]; /* Gain quantization - gain quantization table in IVAS */ +extern const float gain_qua_mless_6b[]; /* Gain quantization - gain quantization table */ +extern const float gain_qua_mless_5b[]; /* Gain quantization - gain quantization table */ +extern const float pred_gain[]; /* Gain quantization - MA predicition coefficients for gain quantizer */ +extern const float t_qua_gain6b[]; /* Gain quantization - gain quantization table for AMR-WB interoperable mode */ +extern const float t_qua_gain7b[]; /* Gain quantization - gain quantization table for AMR-WB interoperable mode */ +extern const float Es_pred_qua_5b[]; /* Gain quantization - quantization table for scaled innovation energy prediciton */ +extern const float Es_pred_qua_4b[]; /* Gain quantization - quantization table for scaled innovation energy prediciton */ +extern const float Es_pred_qua_3b[]; /* Gain quantization - quantization table for scaled innovation energy prediciton */ +extern const float Es_pred_qua_4b_no_ltp[]; /* Gain quantization - quantization table for scaled innovation energy prediciton */ + +extern const float b_1sfr[]; /* Gain quantization - gain estimation constants for gain quantizer at 7.2 and 8.0 kbps */ +extern const float b_2sfr[]; /* Gain quantization - gain estimation constants for gain quantizer at 7.2 and 8.0 kbps */ +extern const float b_3sfr[]; /* Gain quantization - gain estimation constants for gain quantizer at 7.2 and 8.0 kbps */ +extern const float b_4sfr[]; /* Gain quantization - gain estimation constants for gain quantizer at 7.2 and 8.0 kbps */ + +extern const float gp_gamma_1sfr_8b[]; /* Gain quantization - gain quantization table for gain quantizer at 7.2 and 8.0 kbps */ + +extern const float gp_gamma_1sfr_7b[]; /* Gain quantization - gain quantization table for gain quantizer at 7.2 and 8.0 kbps */ +extern const float gp_gamma_2sfr_7b[]; /* Gain quantization - gain quantization table for gain quantizer at 7.2 and 8.0 kbps */ +extern const float gp_gamma_3sfr_7b[]; /* Gain quantization - gain quantization table for gain quantizer at 7.2 and 8.0 kbps */ +extern const float gp_gamma_4sfr_7b[]; /* Gain quantization - gain quantization table for gain quantizer at 7.2 and 8.0 kbps */ + +extern const float gp_gamma_1sfr_6b[]; /* Gain quantization - gain quantization table for gain quantizer at 7.2 and 8.0 kbps */ +extern const float gp_gamma_2sfr_6b[]; /* Gain quantization - gain quantization table for gain quantizer at 7.2 and 8.0 kbps */ +extern const float gp_gamma_3sfr_6b[]; /* Gain quantization - gain quantization table for gain quantizer at 7.2 and 8.0 kbps */ +extern const float gp_gamma_4sfr_6b[]; /* Gain quantization - gain quantization table for gain quantizer at 7.2 and 8.0 kbps */ + +extern const int16_t E_ROM_qua_gain5b_const[]; +extern const int16_t E_ROM_qua_gain6b_const[]; +extern const int16_t E_ROM_qua_gain7b_const[]; + +extern const float gain_qua_mless[]; + +extern const float tbl_gain_code_tc[]; /* TC - code gain quantization table */ +extern const float tbl_gain_trans_tc[]; /* TC - gain quantization table for g_trans */ +extern const float glottal_cdbk[]; /* TC - table of prototype glottal impulses */ + +extern const int32_t PI_select_table[23][8]; /* selection table for Pulse indexing */ +extern const int32_t PI_offset[8][8]; /* offset table for Pulse indexing */ +extern const int16_t PI_factor[]; /* EVS_PI factor table for Pulse indexing */ + +/* ACELP pulse coding */ +extern const uint16_t low_len[10]; +extern const uint16_t low_mask[10]; +extern const uint16_t indx_fact[10]; +extern const int16_t index_len[3]; +extern const int16_t index_mask_ACELP[3]; + + +extern const float deem_tab[]; /* HF BWE - de-emphasis coefficients */ +extern const float filt_hp[]; +extern const float exp_tab_p[]; /* HF BWE - Table of values exp(-j*w*i) */ +extern const float exp_tab_q[]; /* HF BWE - Table of values exp(-j*w*i) */ +extern const float HP_gain[]; /* HF BWE - quantization table for 23.85 */ +extern const float fir_6k_8k[]; /* HF BWE - band-pass filter coefficients */ + +extern const float b_hp400[]; /* HF (6-7kHz) BWE - 400Hz HP filter coefficients */ +extern const float a_hp400[]; /* HF (6-7kHz) BWE - 400Hz HP filter coefficients */ +extern const float fir_6k_7k[]; /* HF (6-7kHz) BWE - 6.0 - 7.0 kHz BP filter coefficients */ + +extern const float low_H[]; /* Enhacer - 2.0 - 6.4 kHz impulse response with phase dispersion */ +extern const float mid_H[]; /* Enhancer - 3.2 - 6.4 kHz impulse response with phase dispersion */ + +extern const float filt_lp[1 + L_FILT]; +extern const float filt_lp_16kHz[1 + L_FILT16k]; + +extern const float tab_hup_l[SIZ_TAB_HUP_L]; /* NB post-filter */ +extern const float tab_hup_s[SIZ_TAB_HUP_S]; /* NB post-filter */ + +extern const float edct_table_80[]; /* EDCT */ +extern const float edct_table_120[]; /* EDCT */ +extern const float edct_table_320[]; /* EDCT */ +extern const float edct_table_480[]; /* EDCT */ +extern const float edct_table_128[]; /* EDCT */ +extern const float edct_table_160[]; /* EDCT */ +extern const float edct_table_40[]; /* EDCT */ +extern const float edct_table_20[]; /* EDCT */ +extern const float edct_table_64[]; +extern const float edct_table_100[]; /* EDCT */ +extern const float edct_table_200[]; +extern const float edct_table_240[]; +extern const float edct_table_256[]; +extern const float edct_table_400[]; +extern const float edct_table_600[]; /* EDCT */ + +extern const int16_t crit_bins[]; /* (used only in AMR-WB IO mode) */ +extern const float crit_bins_corr[CRIT_NOIS_BAND]; +extern const float crit_bands_loc[]; /* (used only in AMR-WB IO mode) */ +extern const float mfreq_loc_LD[]; /* LD music post-filter */ +extern const int16_t mfreq_bindiv_LD[]; +extern const float post_dct_wind[OFFSET2]; +extern const float MAX_SNR_SNR1_tab[]; +extern const float INV_MAX_SNR_tab[]; +extern const float sc_qnoise[]; + +extern const float W_DTX_HO[HO_HIST_SIZE]; +extern const float ENR_ATT[5]; +extern const float HO_ATT[5]; + +extern const int16_t hq_swb_bwe_nb_bits[]; + +/*----------------------------------------------------------------------------------* + * ISF quantization (AMR-WB IO mode) + *----------------------------------------------------------------------------------*/ + +extern const float mean_isf_amr_wb[M]; /* Mean ISF vector (only in AMR-WB IO mode) */ +extern const float mean_isf_noise_amr_wb[]; /* Mean ISF vector for SID frame (only in AMR-WB IO mode) */ +extern const float gaus_dico[]; /* Gaussian codebook */ +extern const float gaus_dico_swb[]; /* Gaussian codebook for SWB TBE */ + +extern const float dico1_isf[]; /* ISF codebook - common 1st stage, 1st split (only in AMR-WB IO mode) */ +extern const float dico2_isf[]; /* ISF codebook - common 1st stage, 2nd split (only in AMR-WB IO mode) */ + +extern const float dico21_isf_46b[]; /* ISF codebook - 46b, 2nd stage, 1st split (only in AMR-WB IO mode) */ +extern const float dico22_isf_46b[]; /* ISF codebook - 46b, 2nd stage, 2st split (only in AMR-WB IO mode) */ +extern const float dico23_isf_46b[]; /* ISF codebook - 46b, 2nd stage, 3rd split (only in AMR-WB IO mode) */ +extern const float dico24_isf_46b[]; /* ISF codebook - 46b, 2nd stage, 4th split (only in AMR-WB IO mode) */ +extern const float dico25_isf_46b[]; /* ISF codebook - 46b, 2nd stage, 5th split (only in AMR-WB IO mode) */ + +extern const float dico21_isf_36b[]; /* ISF codebook - 36b, 2nd stage, 1st split (only in AMR-WB IO mode) */ +extern const float dico22_isf_36b[]; /* ISF codebook - 36b, 2nd stage, 2nd split (only in AMR-WB IO mode) */ +extern const float dico23_isf_36b[]; /* ISF codebook - 36b, 2nd stage, 3rd split (only in AMR-WB IO mode) */ + +extern const float dico1_ns_28b[]; /* ISF codebook for SID frames - 28b, 1st split */ +extern const float dico2_ns_28b[]; /* ISF codebook for SID frames - 28b, 2nd spilt */ +extern const float dico3_ns_28b[]; /* ISF codebook for SID frames - 28b, 3rd spilt */ +extern const float dico4_ns_28b[]; /* ISF codebook for SID frames - 28b, 4th spilt */ +extern const float dico5_ns_28b[]; /* ISF codebook for SID frames - 28b, 5th spilt */ + +extern const float dico1_cng_ev[]; +extern const float dico2_cng_ev[]; +extern const float dico3_cng_ev[]; +extern const float dico4_cng_ev[]; +extern const float dico5_cng_ev[]; + +/*----------------------------------------------------------------------------------* + * LSF quantization - MSVQ tables + *----------------------------------------------------------------------------------*/ + +extern const float stable_ISP[]; +extern const float stable_LSP[]; +extern const float stable_ISF[]; + +extern const float UVWB_Ave[]; +extern const float UVNB_Ave[]; +extern const float SVWB_Ave[]; +extern const float SVNB_Ave[]; +extern const float IAWB_Ave[]; +extern const float IANB_Ave[]; +extern const float GENB_Ave[]; +extern const float GEWB_Ave[]; +extern const float GEWB2_Ave[]; +extern const float TRWB_Ave[]; +extern const float TRWB2_Ave[]; +extern const float means_wb_cleanspeech_lsf16k0[]; +extern const float means_swb_cleanspeech_lsf25k6[]; +extern const float means_swb_cleanspeech_lsf32k0[]; +extern const float ModeMean12[]; + +extern const float Predictor0[]; +extern const float Predictor1[]; +extern const float Predictor2[]; +extern const float Predictor3[]; +extern const float Predictor4[]; +extern const float Predictor5[]; +extern const float Predictor6[]; +extern const float Predictor7[]; +extern const float Predictor8[]; +extern const float CNG_SN1[]; + +extern const int16_t CB_lsf[]; +extern const int16_t CB_p_lsf[]; +extern const float *const ModeMeans[]; +extern const float *const Predictors[]; +extern const int16_t CBsizes[]; +extern const int16_t CBbits[]; + +extern const int16_t CBbits_p[]; +extern const float vals[NO_LEADERS][MAX_NO_VALS]; +extern const int16_t no_vals[NO_LEADERS]; +extern const int16_t no_vals_ind[NO_LEADERS][MAX_NO_VALS]; +extern const int16_t C_VQ[LATTICE_DIM + 1][LATTICE_DIM + 1]; +extern const int16_t BitsVQ[]; +extern const int16_t BitsVQ_p[]; +extern const UWord8 no_lead_idx[][2]; +extern const UWord8 no_lead_p_idx[][2]; +extern const Word8 leaders_short[][MAX_NO_SCALES]; +extern const float sigma_MSLVQ[][16]; +extern const float sigma_p[][16]; +extern const float inv_sigma_MSLVQ[][16]; +extern const float inv_sigma_p[][16]; +extern const float scales[][MAX_NO_SCALES * 2]; +extern const float scales_p[][MAX_NO_SCALES * 2]; +extern const int16_t predmode_tab[][6]; +extern const float pl_HQ[]; +extern const int16_t pi0[]; +extern const UWord32 table_no_cv[]; +extern const int16_t pl_par[]; +extern const float *const Quantizers[]; +extern const float *const Quantizers_p[]; +extern const int16_t cng_sort[]; +extern const int16_t perm_MSLVQ[][4]; +extern const int16_t min_lat_bits_SN[]; +extern const int16_t min_lat_bits_pred[]; +extern const int16_t offset_in_lvq_mode_SN[][21]; +extern const int16_t offset_in_lvq_mode_pred[][32]; +extern const int16_t offset_lvq_modes_SN[]; +extern const int16_t offset_lvq_modes_pred[]; + +/*-----------------------------------------------------------------* + * LSF quantization - BC-TCVQ tables + *-----------------------------------------------------------------*/ + +extern const int16_t FixBranch_tbl[4][4][N_STAGE_VQ - 4]; + +extern const int16_t BC_TCVQ_BIT_ALLOC_40B[]; + +extern const int16_t NTRANS[4][16]; +extern const int16_t NTRANS2[4][16]; + +extern const float AR_IntraCoeff[N_STAGE_VQ - 1][2][2]; +extern const float SN_IntraCoeff[N_STAGE_VQ - 1][2][2]; + +extern const float scale_ARSN[]; +extern const float scale_inv_ARSN[]; + +extern const float AR_TCVQ_CB_SUB1[2][128][2]; +extern const float AR_TCVQ_CB_SUB2[2][64][2]; +extern const float AR_TCVQ_CB_SUB3[4][32][2]; + +extern const float SN_TCVQ_CB_SUB1[2][128][2]; +extern const float SN_TCVQ_CB_SUB2[2][64][2]; +extern const float SN_TCVQ_CB_SUB3[4][32][2]; + +extern const float AR_SVQ_CB1[32][8]; +extern const float AR_SVQ_CB2[16][8]; + + +extern const int16_t uniform_model[]; + +/*-----------------------------------------------------------------* + * LSF quantization - mid-frame quantization tables + *-----------------------------------------------------------------*/ + +extern const float tbl_mid_gen_wb_2b[]; +extern const float tbl_mid_gen_wb_4b[]; +extern const float tbl_mid_gen_wb_5b[]; + +extern const float tbl_mid_unv_wb_4b[]; +extern const float tbl_mid_unv_wb_5b[]; + +extern const float tbl_mid_voi_wb_1b[]; +extern const float tbl_mid_voi_wb_4b[]; +extern const float tbl_mid_voi_wb_5b[]; + +/*-----------------------------------------------------------------* + * LSF quantization - Mode 2 quantization tables + *-----------------------------------------------------------------*/ + +extern const float lsf_init[16]; +extern const float means_wb_31bits_ma_lsf[16]; +extern const float means_nb_31bits_ma_lsf[16]; +extern const float *const lsf_means[2]; +extern const float *const lsf_codebook[2][2][TCXLPC_NUMSTAGES]; +extern const int16_t lsf_numbits[TCXLPC_NUMSTAGES]; +extern const int16_t lsf_dims[TCXLPC_NUMSTAGES]; +extern const int16_t lsf_offs[TCXLPC_NUMSTAGES]; + +extern const float dico_lsf_abs_8b[]; + +extern const float lsf_q_diff_cb_8b_rf[]; +extern const float lsf_cdk_nb_gc_stg1[]; +extern const float lsf_cdk_nb_gc_stg2[]; +extern const float lsf_cdk_nb_gc_stg3[]; +extern const float lsf_ind_cdk_nb_gc_stg4[]; +extern const float lsf_cdk_nb_vc_stg1[]; +extern const float lsf_cdk_nb_vc_stg2[]; +extern const float lsf_cdk_nb_vc_stg3[]; +extern const float lsf_ind_cdk_nb_vc_stg4[]; +extern const float lsf_cdk_wb_gc_stg1[]; +extern const float lsf_cdk_wb_gc_stg2[]; +extern const float lsf_cdk_wb_gc_stg3[]; +extern const float lsf_ind_cdk_wb_gc_stg4[]; +extern const float lsf_cdk_wb_vc_stg1[]; +extern const float lsf_cdk_wb_vc_stg2[]; +extern const float lsf_cdk_wb_vc_stg3[]; +extern const float lsf_ind_cdk_wb_vc_stg4[]; + +extern const float *const lsf_ind_codebook[2][2][TCXLPC_IND_NUMSTAGES]; +extern const int16_t lsf_ind_numbits[TCXLPC_IND_NUMSTAGES]; +extern const int16_t lsf_ind_dims[TCXLPC_IND_NUMSTAGES]; +extern const int16_t lsf_ind_offs[TCXLPC_IND_NUMSTAGES]; +extern const Word16 min_distance_thr[2][2]; + +typedef float lsp_unw_triplet[3]; +extern const lsp_unw_triplet p16_gamma0_92to1[16]; +extern const lsp_unw_triplet p16_gamma0_94to1[16]; + + +/*------------------------------------------------------------------------------* + * AVQ - RE8 tables + *------------------------------------------------------------------------------*/ + +extern const int16_t select_table22[][9]; +extern const int16_t vals_a[][4]; /* value of leader element */ +extern const int16_t vals_q[][4]; /* code parameter for every leader */ +extern const uint16_t Is[]; /* codebook start address for every leader */ +extern const int16_t AA3[]; /* A3 - Number of the absolute leaders in codebook Q3 */ +extern const int16_t AA4[]; /* A4 - Number of the absolute leaders in codebook Q4 */ +extern const uint16_t II3[]; /* I3 - Cardinality offsets for absolute leaders in Q3 */ +extern const uint16_t II4[]; /* I4 - Cardinality offset for absolute leaders in Q4 */ +extern const int16_t Da_pos[]; /* Position of the first absolute leader on a spherical shell (or sphere) */ +extern const int16_t Da_nb[]; /* Number of absolute leaders on a spherical shell */ +extern const int16_t Da_id[]; /* identification code of an absolute leader */ +extern const int16_t Da_nq[]; /* Codebook number for each absolute leader */ + +/*------------------------------------------------------------------------------* + * SWB TBE tables + *------------------------------------------------------------------------------*/ + +extern const int16_t skip_bands_SWB_TBE[]; /* bands for SWB TBE quantisation */ +extern const int16_t skip_bands_WB_TBE[]; /* bands for WB TBE quantisation */ + +extern const float interpol_frac_shb[]; + +extern const float AP1_STEEP[]; /* All pass filter coeffs for interpolation and decimation by a factor of 2 */ +extern const float AP2_STEEP[]; /* All pass filter coeffs for interpolation and decimation by a factor of 2 */ +extern const float STEPS[]; /* Granuality in conversion from lpc to lsp */ + +extern const float cos_fb_exc[]; +extern const float recip_order[]; + +extern const float win_lpc_shb[]; /* Window for calculating SHB LPC coeffs */ +extern const float win_lpc_hb_wb[]; +extern const float ola_win_shb_switch_fold[]; +extern const float win_flatten[]; /* Window for calculating whitening filter for SHB excitation */ +extern const float win_flatten_4k[]; /* Window for calculating whitening filter for WB excitation */ +extern const float window_shb[]; /* Overlap add window for SHB excitation used in anal and synth */ +extern const float window_shb_32k[]; /* Upsampled overlap add window for SHB excitation used transition generation */ +extern const float subwin_shb[]; /* Short overlap add window for SHB excitation used in anal and synth */ +extern const float window_wb[]; +extern const float subwin_wb[]; /* Short overlap add window for SHB excitation used in anal and synth */ + +extern const float Hilbert_coeffs[4 * NUM_HILBERTS][HILBERT_ORDER1 + 1]; + +extern const float wac[]; +extern const float wac_swb[]; + +extern const float wb_bwe_lsfvq_cbook_8bit[]; +extern const float lbr_wb_bwe_lsfvq_cbook_2bit[]; +extern const float swb_tbe_lsfvq_cbook_8b[]; +extern const float SHBCB_SubGain5bit[]; /* 5 bit Quantizer table for SHB gain shapes */ +extern const float HBCB_SubGain5bit[]; /* 5-bit TD WB BWE temporal shaping codebook */ +extern const float SHBCB_FrameGain64[]; /* 6 bit Quantizer table for SHB overall gain */ +extern const float SHBCB_FrameGain16[]; + +extern const float full_band_bpf_1[][5]; +extern const float full_band_bpf_2[][5]; +extern const float full_band_bpf_3[][5]; + +extern const float lsf_q_cb_4b[]; /* 4 bit differential scalar quantizer table for TD SWB BWE LSFs 1 and 2*/ +extern const float lsf_q_cb_3b[]; /* 3 bit differential scalar quantizer table for TD SWB BWE LSFs 3, 4 and 5*/ +extern const float *const lsf_q_cb[]; /* Codebook array for each LSF */ +extern const int16_t lsf_q_cb_size[]; /* Size of each element of the above */ +extern const int16_t lsf_q_num_bits[]; /* Size of each element of the above, in bits */ +extern const float mirror_point_q_cb[]; /* LSF mirroring point codebook */ +extern const float lsf_grid[4][5]; /* LSF mirroring adjustment grid */ +extern const float grid_smoothing[]; /* LSF mirroring smoothing table */ + +extern const float overlap_coefs[]; /* HR SWB BWE - overlap coefficients */ +extern const float overlap_coefs_48kHz[]; /* HR SWB BWE - overlap coefficients @48kHz */ +extern const float swb_hr_env_code1[]; /* HR SWB BWE - envelope Q table - first two subabnds in non-transient frames */ +extern const float swb_hr_env_code2[]; /* HR SWB BWE - envelope Q table - second two subabnds in non-transient frames*/ +extern const float swb_hr_env_code3[]; /* HR SWB BWE - envelope Q table - two subabnds in transient frames */ + +extern const float allpass_poles_3_ov_2[]; +extern const float decimate_3_ov_2_lowpass_num[]; +extern const float decimate_3_ov_2_lowpass_den[]; + + +/*------------------------------------------------------------------------------* + * WB BWE tables + *------------------------------------------------------------------------------*/ + +extern const float F_2_5[64]; + +/*------------------------------------------------------------------------------* + * SWB BWE tables + *------------------------------------------------------------------------------*/ + +extern const int16_t swb_bwe_trans_subband[]; +extern const int16_t swb_bwe_trans_subband_width[]; +extern const int16_t swb_bwe_subband[]; +extern const float swb_inv_bwe_subband_width[]; +extern const int16_t swb_bwe_sm_subband[]; +extern const float smooth_factor[]; +extern const int16_t fb_bwe_subband[]; +extern const float fb_inv_bwe_subband_width[]; +extern const int16_t fb_bwe_sm_subband[]; +extern const float fb_smooth_factor[]; +extern const float EnvCdbk11[]; +extern const float EnvCdbk1st[]; +extern const float EnvCdbk2nd[]; +extern const float EnvCdbk3rd[]; +extern const float EnvCdbk4th[]; +extern const float EnvCdbkFB[]; +extern const float Env_TR_Cdbk1[]; +extern const float Env_TR_Cdbk2[]; +extern const float w_NOR[]; +extern const float Mean_env[]; +extern const float Mean_env_fb[]; +extern const float Mean_env_tr[]; + +/*------------------------------------------------------------------------------* + * ACEPL/HQ core switching tables + *------------------------------------------------------------------------------*/ + +extern const float hp12800_32000[]; +extern const float hp16000_32000[]; +extern const float hp12800_48000[]; +extern const float hp16000_48000[]; +extern const float hp12800_16000[]; + + +extern const double cu15[28][3]; +extern const double cu4[6][3]; +extern const int16_t ct2[7][13]; + +/*------------------------------------------------------------------------------* + * HQ core tables + *------------------------------------------------------------------------------*/ + +extern const float window_48kHz[]; +extern const float window_256kHz[]; +extern const float half_overlap_25[]; +extern const float half_overlap_48[]; +extern const float half_overlap_int[]; +extern const float small_overlap_25[]; +extern const float small_overlap_48[]; +extern const float small_overlap_int[]; +extern const float window_8_16_32kHz[]; + +extern const float short_window_48kHz[]; +extern const float short_window_32kHz[]; +extern const float short_window_16kHz[]; +extern const float short_window_8kHz[]; + +extern const float wscw16q15[]; +extern const float wscw16q15_8[]; +extern const float wscw16q15_16[]; +extern const float wscw16q15_32[]; + +/* Band structure */ +extern const int16_t band_len_HQ[]; +extern const int16_t band_start_HQ[]; +extern const int16_t band_end_HQ[]; +extern const int16_t band_len_wb[]; +extern const int16_t band_start_wb[]; +extern const int16_t band_end_wb[]; +extern const int16_t band_len_harm[]; +extern const int16_t band_start_harm[]; +extern const int16_t band_end_harm[]; +extern const float rat[SFM_N_WB]; + +extern const int16_t intl_bw_16[N_INTL_GRP_16]; +extern const int16_t intl_bw_32[N_INTL_GRP_32]; +extern const int16_t intl_bw_48[N_INTL_GRP_48]; +extern const int16_t intl_cnt_16[N_INTL_GRP_16]; +extern const int16_t intl_cnt_32[N_INTL_GRP_32]; +extern const int16_t intl_cnt_48[N_INTL_GRP_48]; +extern const int16_t norm_order_48[NB_SFM]; +extern const int16_t norm_order_32[SFM_N_SWB]; +extern const int16_t norm_order_16[SFM_N_WB]; + +extern const float dicn_pg[45]; +extern const int16_t expPkEnrg_tbl[45]; +extern const int32_t manPkEnrg_tbl[45]; +extern const int32_t E_max5_tbl[40]; + +extern const float thren_pg[44]; + +extern const float dicn[40]; +extern const float dicn_inv[40]; +extern const float thren_HQ[39]; +extern const int16_t dicnlg2[40]; +extern const int16_t huffnorm[32]; +extern const int16_t huffsizn[32]; +extern const int16_t huffcoef[60]; +extern const int16_t pgain_huffnorm[32]; +extern const int16_t pgain_huffsizn[32]; + +extern const int16_t resize_huffnorm[32]; +extern const int16_t resize_huffsizn[32]; + +extern const int16_t huffnorm_tran[32]; +extern const int16_t huffsizn_tran[32]; + +extern const int16_t sfm_width[20]; +extern const int16_t a_map[20]; +extern const int16_t subf_norm_groups[4][11]; + +extern const Word32 SQRT_DIM_fx[]; + +/* HQ inner_frame signallisation table */ +extern const int16_t inner_frame_tbl[]; + +/* HQ spectrum length lookup tables */ +extern const int16_t l_spec_tbl[]; +extern const int16_t l_spec_ext_tbl[]; + +/* NB short win: 7200/8000/9600, 13200/16400 */ +extern const int16_t band_width_40_4_6_0_0_0[4]; +extern const int16_t band_width_40_5_6_0_0_0[5]; + +/* NB long win: 7200, 8000, 9600, 13200, 16400 */ +extern const int16_t band_width_160_18_6_4_0_0[18]; +extern const int16_t band_width_160_17_6_3_0_0[17]; +extern const int16_t band_width_160_14_6_3_0_0[14]; +extern const int16_t band_width_160_13_6_2_0_0[13]; + +/* WB short win: 13200/16400 */ +extern const int16_t band_width_80_7_6_0_0_0[7]; + +/* WB long win: 13200, 16400 */ +extern const int16_t band_width_320_18_6_3_0_0[18]; +extern const int16_t band_width_320_20_6_3_0_0[20]; + +/* SWB short win: 13200, 16400 */ +extern const int16_t band_width_142_8_8_0_0_0[8]; +extern const int16_t band_width_160_8_8_0_0_0[8]; + +/* SWB long win: 13200, 16400 */ +extern const int16_t band_width_568_22_6_2_0_0[22]; +extern const int16_t band_width_640_24_6_4_0_0[24]; + +/* LR-MDCT configuration tables */ +extern const Xcore_Config xcore_config_8kHz_007200bps_long; +extern const Xcore_Config xcore_config_8kHz_008000bps_long; +extern const Xcore_Config xcore_config_8kHz_013200bps_long; +extern const Xcore_Config xcore_config_8kHz_016400bps_long; + +extern const Xcore_Config xcore_config_8kHz_007200bps_short; +extern const Xcore_Config xcore_config_8kHz_008000bps_short; +extern const Xcore_Config xcore_config_8kHz_013200bps_short; +extern const Xcore_Config xcore_config_8kHz_016400bps_short; + +extern const Xcore_Config xcore_config_16kHz_013200bps_long; +extern const Xcore_Config xcore_config_16kHz_016400bps_long; + +extern const Xcore_Config xcore_config_16kHz_013200bps_short; +extern const Xcore_Config xcore_config_16kHz_016400bps_short; + +extern const Xcore_Config xcore_config_32kHz_013200bps_long; +extern const Xcore_Config xcore_config_32kHz_016400bps_long; + +extern const Xcore_Config xcore_config_32kHz_013200bps_short; +extern const Xcore_Config xcore_config_32kHz_016400bps_short; + + +extern const int16_t Nb[NB_SFM]; +extern const int16_t LNb[NB_SFM]; + +extern const Word32 pow_getbitsfrompulses_fx[16]; +extern const Word32 table_logcum_fx[563]; +extern const Word16 DDP_fx[4]; +extern const float DDP[4]; + + +extern const int16_t step_tcq[8][STATES]; +extern const int16_t denc[8][STATES]; +extern const int16_t ddec[8][STATES]; + +extern const int16_t step_LSB[STATES_LSB][2]; +extern const int16_t denc_LSB[STATES_LSB][2]; +extern const int16_t dqnt_LSB[STATES_LSB][4]; +extern const int16_t dstep_LSB[4][2]; +extern const int16_t ddec_LSB[4][2]; + +extern const int16_t nextstate[STATES][2]; + +extern const int16_t fine_gain_bits[]; +extern const float *const finegain[]; + +extern const uint8_t hBitsMinus1_N01[2]; +extern const uint8_t hBitsMinus1_N02[65]; +extern const uint8_t hBitsMinus1_N03[65]; +extern const uint8_t hBitsMinus1_N04[65]; +extern const uint8_t hBitsMinus1_N05[54]; +extern const uint8_t hBitsMinus1_N06[42]; +extern const uint8_t hBitsMinus1_N07[34]; +extern const uint8_t hBitsMinus1_N08[29]; +extern const uint8_t hBitsMinus1_N09[25]; +extern const uint8_t hBitsMinus1_N10[22]; +extern const uint8_t hBitsMinus1_N11[19]; +extern const uint8_t hBitsMinus1_N12[17]; +extern const uint8_t hBitsMinus1_N13[16]; +extern const uint8_t hBitsMinus1_N14[14]; +extern const uint8_t hBitsMinus1_N15[13]; +extern const uint8_t hBitsMinus1_N16[13]; +extern const uint8_t hBitsMinus1_N17[12]; +extern const uint8_t hBitsMinus1_N18[12]; +extern const uint8_t hBitsMinus1_N19[11]; +extern const uint8_t hBitsMinus1_N20[11]; +extern const uint8_t hBitsMinus1_N21[10]; +extern const uint8_t hBitsMinus1_N22[10]; +extern const uint8_t hBitsMinus1_N23[10]; +extern const uint8_t hBitsMinus1_N24[10]; +extern const uint8_t hBitsMinus1_N25[9]; +extern const uint8_t hBitsMinus1_N26[9]; +extern const uint8_t hBitsMinus1_N27[9]; +extern const uint8_t hBitsMinus1_N28[9]; +extern const uint8_t hBitsMinus1_N29[9]; +extern const uint8_t hBitsMinus1_N30[8]; +extern const uint8_t hBitsMinus1_N31[8]; +extern const uint8_t hBitsMinus1_N32[8]; +extern const uint8_t hBitsMinus1_N33[8]; +extern const uint8_t hBitsMinus1_N34[8]; +extern const uint8_t hBitsMinus1_N35[8]; +extern const uint8_t hBitsMinus1_N36[8]; +extern const uint8_t hBitsMinus1_N37[8]; +extern const uint8_t hBitsMinus1_N38[8]; +extern const uint8_t hBitsMinus1_N39[8]; +extern const uint8_t hBitsMinus1_N40[8]; +extern const uint8_t hBitsMinus1_N41[7]; +extern const uint8_t hBitsMinus1_N42[7]; +extern const uint8_t hBitsMinus1_N43[7]; +extern const uint8_t hBitsMinus1_N44[7]; +extern const uint8_t hBitsMinus1_N45[7]; +extern const uint8_t hBitsMinus1_N46[7]; +extern const uint8_t hBitsMinus1_N47[7]; +extern const uint8_t hBitsMinus1_N48[7]; +extern const uint8_t hBitsMinus1_N49[7]; +extern const uint8_t hBitsMinus1_N50[7]; +extern const uint8_t hBitsMinus1_N51[7]; +extern const uint8_t hBitsMinus1_N52[7]; +extern const uint8_t hBitsMinus1_N53[7]; +extern const uint8_t hBitsMinus1_N54[7]; +extern const uint8_t hBitsMinus1_N55[7]; +extern const uint8_t hBitsMinus1_N56[7]; +extern const uint8_t hBitsMinus1_N57[7]; +extern const uint8_t hBitsMinus1_N58[7]; +extern const uint8_t hBitsMinus1_N59[7]; +extern const uint8_t hBitsMinus1_N60[7]; +extern const uint8_t hBitsMinus1_N61[6]; +extern const uint8_t hBitsMinus1_N62[6]; +extern const uint8_t hBitsMinus1_N63[6]; +extern const uint8_t hBitsMinus1_N64[6]; +extern const uint8_t *const hBitsN[65]; +extern const int16_t dsHighDiracsTab[43]; +extern const uint32_t intLimCDivInvDQ31[68]; +extern const uint8_t obtainEnergyQuantizerDensity_f[57]; +extern const int16_t lim_neg_inv_tbl_fx[11]; +extern const int16_t fg_inv_tbl_fx[13]; + +/* functions and tables for pvq_indexing */ +extern const uint32_t exactdivodd[ODD_DIV_SIZE]; + +extern const float gain_att[]; +extern const float att_step[]; +extern const float gain_qlow[]; +extern const int16_t gain_cb_size[]; +extern const float stab_trans[]; +extern const Word16 stab_trans_fx[]; +extern const float env_stab_tp[2][2]; + +/*----------------------------------------------------------------------------------* + * SWB BWE for LR MDCT core + *----------------------------------------------------------------------------------*/ +extern const float gain_table_SWB_BWE[NB_SWB_SUBBANDS]; +/* HQ_NORMAL mode */ +extern const int16_t bits_lagIndices_modeNormal[NB_SWB_SUBBANDS]; +extern const int16_t subband_offsets_12KBPS[NB_SWB_SUBBANDS]; +extern const int16_t subband_offsets_16KBPS[NB_SWB_SUBBANDS]; +extern const int16_t subband_search_offsets[NB_SWB_SUBBANDS]; +extern const int16_t bw_SPT_tbl[2][SPT_SHORTEN_SBNUM]; + +/* HQ_HARMONIC mode */ +extern const int16_t bits_lagIndices_mode0_Har[NB_SWB_SUBBANDS_HAR_SEARCH_SB]; +extern const int16_t subband_offsets_sub5_13p2kbps_Har[NB_SWB_SUBBANDS_HAR]; +extern const int16_t subband_search_offsets_13p2kbps_Har[NB_SWB_SUBBANDS_HAR_SEARCH_SB]; +extern const int16_t subband_offsets_sub5_16p4kbps_Har[NB_SWB_SUBBANDS_HAR]; +extern const int16_t subband_search_offsets_16p4kbps_Har[NB_SWB_SUBBANDS_HAR_SEARCH_SB]; + +/*----------------------------------------------------------------------------------* + * SC-VBR + *----------------------------------------------------------------------------------*/ + +/* NELP filter coefficients */ +extern const float bp1_num_coef_wb[5]; +extern const float bp1_den_coef_wb[5]; +extern const float shape1_num_coef[11]; +extern const float shape1_den_coef[11]; +extern const float shape2_num_coef[11]; +extern const float shape2_den_coef[11]; +extern const float shape3_num_coef[11]; +extern const float shape3_den_coef[11]; +extern const float txlpf1_num_coef[11]; +extern const float txlpf1_den_coef[11]; +extern const float txhpf1_num_coef[11]; +extern const float txhpf1_den_coef[11]; +extern const float bp1_num_coef_nb_fx_order7[8]; +extern const float bp1_den_coef_nb_fx_order7[8]; +extern const float num_nelp_lp[NELP_LP_ORDER + 1]; +extern const float den_nelp_lp[NELP_LP_ORDER + 1]; + +extern const float UVG1CB_WB[UVG1_CBSIZE][2]; +extern const float UVG2CB1_WB[UVG2_CBSIZE][5]; +extern const float UVG2CB2_WB[UVG2_CBSIZE][5]; + +extern const float UVG1CB_NB[UVG1_CBSIZE][2]; +extern const float UVG2CB1_NB[UVG2_CBSIZE][5]; +extern const float UVG2CB2_NB[UVG2_CBSIZE][5]; + +extern const float frac_4sf[NB_SUBFR + 2]; + +extern const float erb_WB[NUM_ERB_WB + 1]; +extern const float erb_NB[NUM_ERB_NB + 1]; + +extern const float AmpCB1_WB[64][10]; +extern const float AmpCB2_WB[64][NUM_ERB_WB - 11]; + +extern const float AmpCB1_NB[64][10]; +extern const float AmpCB2_NB[64][NUM_ERB_NB - 11]; + +extern const float PowerCB_WB[64][2]; +extern const float PowerCB_NB[64][2]; +extern const float sinc[8][12]; + +extern const float hvq_thr_adj[5]; +extern const float hvq_peak_cb[1024]; +extern const float hvq_class_c[16]; +extern const int16_t hvq_cb_search_overlap24k[17]; +extern const int16_t hvq_cb_search_overlap32k[21]; + +extern const int16_t hvq_pg_huff_offset[NUM_PG_HUFFLEN]; +extern const int16_t hvq_pg_huff_thres[NUM_PG_HUFFLEN]; +extern const int16_t hvq_pg_huff_tab[32]; + +extern const int16_t hvq_cp_huff_len[52]; +extern const int16_t hvq_cp_huff_val[52]; +extern const int16_t hvq_cp_layer1_map5[HVQ_CP_MAP_LEN]; + +extern const int16_t hvq_cp_huff_thres[HVQ_CP_HUFF_NUM_LEN]; +extern const int16_t hvq_cp_huff_offset[HVQ_CP_HUFF_NUM_LEN]; +extern const int16_t hvq_cp_huff_tab[52]; + +/*------------------------------------------------------------------------------* + * GSC mode + *------------------------------------------------------------------------------*/ + +extern const float sin_table256[]; + +extern const int16_t gsc_sfm_start[]; +extern const int16_t gsc_sfm_end[]; +extern const int16_t gsc_sfm_size[]; + +extern const float sm_table[]; + +extern const float mfreq_loc[]; +extern const int16_t mfreq_bindiv_loc[]; + +extern const float mean_gp[]; +extern const float dic_gp[]; + +extern const float Gain_mean[]; +extern const float Gain_meanHR[]; +extern const float Gain_mean_dic[]; +extern const float Gain_mean_dicHR[]; + +extern const float YG_mean16[]; +extern const float YG_dicMR_1[]; +extern const float YG_dicMR_2[]; +extern const float YG_dicMR_3[]; +extern const float YG_dicMR_4[]; + +extern const float mean_m[]; +extern const float mean_gain_dic[]; + +extern const float YGain_mean_LR[]; +extern const float YGain_dic1_LR[]; +extern const float YGain_dic2_LR[]; +extern const float YGain_dic3_LR[]; +extern const float Gain_dic2_NBHR[]; +extern const float Gain_dic3_NBHR[]; +extern const float YG_mean16HR[]; +extern const float YG_dicHR_1[]; +extern const float YG_dicHR_2[]; +extern const float YG_dicHR_3[]; +extern const float YG_mean16HR_16kHz[]; +extern const float YG_dicHR_4_16kHz[]; +extern const float YG_meanL2G_16kHz[]; +extern const float YG_dicL2G_16kHz[]; +extern const int16_t GSC_freq_bits[]; +extern const int16_t GSC_freq_DL0_bits[]; +extern const int16_t Compl_GSC_freq_bits[]; +extern const float Gain_meanNB[]; +extern const float Gain_mean_dicNB[]; +extern const float Mean_dic_NB[]; +extern const float Gain_dic1_NB[]; +extern const float Gain_dic2_NB[]; +extern const float Gain_dic3_NB[]; + + +/*------------------------------------------------------------------------------* + * FFT transform + *------------------------------------------------------------------------------*/ + +extern const int16_t Odx_fft64[64]; +extern const float w_fft64[32]; +extern const int16_t Ip_fft64[6]; +extern const int16_t Odx_fft32_15[32]; +extern const float w_fft32[16]; +extern const int16_t Ip_fft32[6]; +extern const int16_t Odx_fft32_5[32]; +extern const int16_t Odx_fft16[16]; +extern const float w_fft16[8]; +extern const int16_t Ip_fft16[6]; +extern const float w_fft8[8]; +extern const int16_t Ip_fft8[6]; +extern const int16_t Idx_dortft80[80]; +extern const int16_t Idx_dortft120[120]; +extern const int16_t Idx_dortft160[160]; +extern const int16_t Idx_dortft320[320]; +extern const int16_t Idx_dortft480[480]; +extern const int16_t Ip_fft128[10]; +extern const float w_fft128[64]; +extern const int16_t Ip_fft256[10]; +extern const float w_fft256[128]; +extern const int16_t Ip_fft512[18]; +extern const float w_fft512[256]; +extern const int16_t Idx_dortft40[40]; +extern const int16_t Odx_fft8_5[8]; +extern const int16_t ip_edct2_64[6]; +extern const float w_edct2_64[80]; +extern const int16_t Idx_dortft20[20]; +extern const int16_t Odx_fft4_5[4]; +extern const float w_fft4[2]; +extern const int16_t Ip_fft4[6]; + +extern const float FFT_RotVector_32[40]; +extern const float FFT_RotVector_256[448]; +extern const float FFT_RotVector_400[760]; +extern const float FFT_RotVector_600[1140]; +extern const float FFT_RotVector_640[1240]; +extern const float FFT_RotVector_960[1860]; + + +/*----------------------------------------------------------------------------------* + * FEC for HQ core + *----------------------------------------------------------------------------------*/ + +extern const float Asr_LP32[41]; +extern const float Asr_LP16[21]; +extern const float Asr_LP48[61]; + +extern const int16_t Num_bands_NB[]; +extern const float SmoothingWin_NB875[]; +extern const float SmoothingWin_NB2[]; + +/*----------------------------------------------------------------------------------* + * CLDFB + *----------------------------------------------------------------------------------*/ + +extern const int16_t freqTable[2]; + +extern const float CLDFB80_10[100]; +extern const float CLDFB80_16[160]; +extern const float CLDFB80_20[200]; +extern const float CLDFB80_30[300]; +extern const float CLDFB80_32[320]; +extern const float CLDFB80_40[400]; +extern const float CLDFB80_60[600]; + +/*5ms delay*/ +extern const float LDQMF_10[100]; +extern const float LDQMF_16[160]; +extern const float LDQMF_20[200]; +extern const float LDQMF_30[300]; +extern const float LDQMF_32[320]; +extern const float LDQMF_40[400]; +extern const float LDQMF_60[600]; +extern const float rot_vec_delay_re_LDQMF[60]; +extern const float rot_vec_delay_im_LDQMF[60]; + +extern const float rot_vec_ana_re_L10[5]; +extern const float rot_vec_ana_im_L10[5]; +extern const float rot_vec_ana_re_L16[8]; +extern const float rot_vec_ana_im_L16[8]; +extern const float rot_vec_ana_re_L20[10]; +extern const float rot_vec_ana_im_L20[10]; +extern const float rot_vec_ana_re_L30[15]; +extern const float rot_vec_ana_im_L30[15]; +extern const float rot_vec_ana_re_L32[16]; +extern const float rot_vec_ana_im_L32[16]; +extern const float rot_vec_ana_re_L40[20]; +extern const float rot_vec_ana_im_L40[20]; +extern const float rot_vec_ana_re_L60[30]; +extern const float rot_vec_ana_im_L60[30]; + +extern const float rot_vec_syn_re_L10[5]; +extern const float rot_vec_syn_im_L10[5]; +extern const float rot_vec_syn_re_L16[8]; +extern const float rot_vec_syn_im_L16[8]; +extern const float rot_vec_syn_re_L20[10]; +extern const float rot_vec_syn_im_L20[10]; +extern const float rot_vec_syn_re_L30[15]; +extern const float rot_vec_syn_im_L30[15]; +extern const float rot_vec_syn_re_L32[16]; +extern const float rot_vec_syn_im_L32[16]; +extern const float rot_vec_syn_re_L40[20]; +extern const float rot_vec_syn_im_L40[20]; +extern const float rot_vec_syn_re_L60[30]; +extern const float rot_vec_syn_im_L60[30]; + +extern const float bpf_weights_16[CLDFB_NO_COL_MAX]; + +extern const float CNG_details_codebook[64][NUM_ENV_CNG]; + + +/*----------------------------------------------------------------------------------* + * FD CNG + *----------------------------------------------------------------------------------*/ + +extern const int16_t d_array[SIZE_SCALE_TABLE_CN]; +extern const float m_array[SIZE_SCALE_TABLE_CN]; +extern const float msQeqInvAv_thresh[3]; +extern const float msNoiseSlopeMax[4]; + +extern const SCALE_SETUP scaleTableStereo[SIZE_SCALE_TABLE_STEREO]; +extern const SCALE_SETUP scaleTableMono[SIZE_SCALE_TABLE_MONO]; +extern const SCALE_SETUP scaleTable_cn_only[SIZE_SCALE_TABLE_CN]; +extern const SCALE_SETUP scaleTable_cn_dirac[15]; +extern const float scaleTable_cn_only_amrwbio[SIZE_SCALE_TABLE_CN_AMRWB][2]; + +extern const int16_t sidparts_encoder_noise_est[SIZE_SIDPARTS_ENC_NOISE_EST]; + + +extern const FD_CNG_SETUP FdCngSetup_nb; +extern const FD_CNG_SETUP FdCngSetup_wb1; +extern const FD_CNG_SETUP FdCngSetup_wb2; +extern const FD_CNG_SETUP FdCngSetup_wb3; +extern const FD_CNG_SETUP FdCngSetup_swb1; +extern const FD_CNG_SETUP FdCngSetup_swb1_stereo; +extern const FD_CNG_SETUP FdCngSetup_swb2; + +extern const int16_t levels_37bits[FD_CNG_stages_37bits]; +extern const int16_t bits_37bits[FD_CNG_stages_37bits]; +extern const float *const cdk_37bits[]; +extern const float *const cdk_37bits_ivas[]; + +extern const float fftSineTab640[321]; + +extern const float olapWinAna512[512]; +extern const float olapWinAna640[640]; + +extern const float olapWinSyn256[256]; +extern const float olapWinSyn320[320]; + +#ifdef ERI_FDCNGVQ_LOW_ROM_TESTING +extern const float *const cdk_37bits_ivas_orig[]; +#endif + +extern const Word8 cdk1_ivas_dct_s0_W8[]; +extern const Word8 cdk1_ivas_dct_s1_W8[]; +extern const Word8 cdk1_ivas_dct_s2_W8[]; +extern const Word8 cdk1_ivas_dct_s3_W8[]; +extern const Word8 *const cdk_37bits_ivas_stage1_W8Qx_dct_sections[]; + +extern const Word16 cdk1_ivas_entries_per_segment[]; +extern const Word16 cdk1_ivas_cum_entries_per_segment[]; +extern const Word16 cdk1_ivas_cols_per_segment[]; +extern const Word16 cdk1_ivas_trunc_dct_cols_per_segment[]; + +extern const Word16 *stage1_dct_col_syn_shift[]; +extern const float cdk1r_tr_midQ_truncQ[]; +extern const float fdcng_dct_invScaleF[]; +extern const float fdcng_dct_scaleF[]; + +extern const Word16 unique_idctT2_24coeffsQ16[]; +extern const Word8 idctT2_24_compressed_idx[]; + +extern const Word16 unique_idctT2_21coeffsQ16[]; +extern const Word8 idctT2_21_compressed_idx[]; + + +extern const float idctT2_24_X_matrixFloatQ[]; + +extern const Word16 cdk1_ivas_entries_per_segment[]; +extern const Word16 cdk1_ivas_cum_entries_per_segment[]; + +/* circular mse ordered list fwd/rev directions for candidate evaluations */ +extern const Word8 cdk1_ivas_segm_neighbour_fwd[]; +extern const Word8 cdk1_ivas_segm_neighbour_rev[]; + + +extern const float cdk_37bits_1[]; +extern const float cdk_37bits_2[]; +extern const float cdk_37bits_3[]; +extern const float cdk_37bits_4[]; +extern const float cdk_37bits_5[]; +extern const float cdk_37bits_6[]; + + +/*----------------------------------------------------------------------------------* + * TCX + *----------------------------------------------------------------------------------*/ + +extern const float gain_corr_fac[]; +extern const float gain_corr_inv_fac[]; + +extern const SCALE_TCX_SETUP scaleTcxTable[SIZE_SCALE_TABLE_TCX]; + + +/*----------------------------------------------------------------------------------* + * Arithmetic coder + *----------------------------------------------------------------------------------*/ + +extern const uint8_t ari_lookup_s17_LC[4096]; +extern const uint16_t ari_pk_s17_LC_ext[64][18]; + +extern const int16_t NumRatioBits[2][17]; +extern const float Ratios_WB_2[32]; +extern const float Ratios_WB_3[32]; +extern const float Ratios_WB_4[32]; +extern const float Ratios_WB_5[32]; +extern const float Ratios_WB_6[32]; +extern const float Ratios_WB_7[32]; +extern const float Ratios_WB_8[16]; +extern const float Ratios_WB_9[16]; +extern const float Ratios_WB_10[16]; +extern const float Ratios_WB_11[16]; +extern const float Ratios_WB_12[16]; +extern const float Ratios_WB_13[16]; +extern const float Ratios_WB_14[16]; +extern const float Ratios_WB_15[16]; +extern const float Ratios_WB_16[4]; +extern const float Ratios_WB_17[4]; +extern const float Ratios_WB_18[4]; +extern const float Ratios_NB_2[32]; +extern const float Ratios_NB_3[16]; +extern const float Ratios_NB_4[16]; +extern const float Ratios_NB_5[16]; +extern const float Ratios_NB_6[16]; +extern const float Ratios_NB_7[16]; +extern const float Ratios_NB_8[16]; +extern const float Ratios_NB_9[8]; +extern const float Ratios_NB_10[8]; +extern const float Ratios_NB_11[8]; +extern const float Ratios_NB_12[8]; +extern const float Ratios_NB_13[4]; +extern const float Ratios_NB_14[4]; +extern const float Ratios_NB_15[4]; +extern const float Ratios_NB_16[4]; +extern const float Ratios_NB_17[4]; +extern const float Ratios_NB_18[4]; +extern const float *const Ratios[2][17]; + +extern const Word16 qGains[2][1 << kTcxHmNumGainBits]; + +/*----------------------------------------------------------------------------------* + * Innovative codebook + *----------------------------------------------------------------------------------*/ + +extern const PulseConfig PulseConfTable[]; + +/*----------------------------------------------------------------------------------* + * TNS + *----------------------------------------------------------------------------------*/ + +extern const struct TnsParameters tnsParametersIGF32kHz_LowBR[1]; +extern const struct TnsParameters tnsParameters32kHz[2]; +extern const struct TnsParameters tnsParameters32kHz_grouped[2]; +extern const struct TnsParameters tnsParameters16kHz[1]; +extern const struct TnsParameters tnsParameters16kHz_grouped[2]; +extern const struct TnsParameters tnsParameters48kHz_grouped[2]; + +extern const struct TnsParameters tnsParameters32kHz_Stereo[2]; + +extern const float tnsAcfWindow[TNS_MAX_FILTER_ORDER]; + +extern const ParamsBitMap tnsEnabledSWBTCX20BitMap; +extern const ParamsBitMap tnsEnabledSWBTCX10BitMap; +extern const ParamsBitMap tnsEnabledWBTCX20BitMap; + +extern const ParamsBitMap tnsEnabledOnWhiteSWBTCX10BitMap; +extern const ParamsBitMap tnsEnabledOnWhiteSWBTCX20BitMap; + +extern const Coding codesTnsAllCoeffs[]; + +extern const Coding codesTnsCoeff0SWBTCX20[]; +extern const Coding codesTnsCoeff0SWBTCX10[]; +extern const Coding codesTnsCoeff1SWBTCX20[]; +extern const Coding codesTnsCoeff1SWBTCX10[]; +extern const Coding codesTnsCoeff2SWBTCX20[]; +extern const Coding codesTnsCoeff2SWBTCX10[]; +extern const Coding codesTnsCoeff3SWBTCX20[]; +extern const Coding codesTnsCoeff3SWBTCX10[]; +extern const Coding codesTnsCoeff4SWBTCX20[]; +extern const Coding codesTnsCoeff4SWBTCX10[]; +extern const Coding codesTnsCoeff5[]; +extern const Coding codesTnsCoeff6[]; + +extern const Coding codesTnsCoeff0WBTCX20[]; +extern const Coding codesTnsCoeff1WBTCX20[]; +extern const Coding codesTnsCoeff2WBTCX20[]; +extern const Coding codesTnsCoeff3WB[]; + +extern const Coding codesTnsCoeff456[]; +extern const Coding codesTnsCoeff7[]; + +extern const int16_t nTnsCoeffCodes; + +extern const Coding *const codesTnsCoeffSWBTCX20[]; +extern const Coding *const codesTnsCoeffSWBTCX10[]; +extern const Coding *const codesTnsCoeffWBTCX20[]; +extern const int16_t nTnsCoeffTables; + +extern const Coding codesTnsOrderTCX20[]; +extern const Coding codesTnsOrderTCX10[]; +extern const Coding codesTnsOrder[]; +extern const int16_t nTnsOrderCodes; + +extern const float tnsCoeff4[16]; + +/*----------------------------------------------------------------------------------* + * IGF settings for each bitrate + *----------------------------------------------------------------------------------*/ + +typedef struct igf_mode_type +{ + int32_t sampleRate; + int16_t frameLength; + int16_t igfMinFq; + int16_t maxHopsize; +} IGF_MODE; + +extern const IGF_MODE igfMode[IGF_BITRATE_UNKNOWN]; +extern const int16_t swb_offset_LB_new[IGF_BITRATE_UNKNOWN][IGF_MAX_SFB]; +extern const int16_t igf_tile_offset_table[IGF_BITRATE_UNKNOWN][2 * IGF_MAX_TILES + 1]; +extern const float igf_whitening_TH[IGF_BITRATE_UNKNOWN][2][IGF_MAX_TILES]; +extern const int16_t cf_off_se01_tab[10]; +extern const int16_t cf_off_se10_tab; +extern const int16_t cf_off_se02_tab[10][IGF_CTX_COUNT]; +extern const int16_t cf_off_se11_tab[IGF_CTX_COUNT][IGF_CTX_COUNT]; +extern const uint16_t cf_se00_tab[IGF_SYMBOLS_IN_TABLE + 1]; +extern const uint16_t cf_se01_tab[10][IGF_SYMBOLS_IN_TABLE + 1]; +extern const uint16_t cf_se02_tab[10][IGF_CTX_COUNT][IGF_SYMBOLS_IN_TABLE + 1]; +extern const uint16_t cf_se10_tab[IGF_SYMBOLS_IN_TABLE + 1]; +extern const uint16_t cf_se11_tab[IGF_CTX_COUNT][IGF_CTX_COUNT][IGF_SYMBOLS_IN_TABLE + 1]; + +extern const float normReciprocal[CHEAP_NORM_SIZE]; +extern const float *const w_a[7]; + +extern const PWord16 SineTable512_fx[]; +extern const Word16 ldCoeff[7]; +extern const UWord32 exp2_tab_long[32]; +extern const UWord32 exp2w_tab_long[32]; +extern const UWord32 exp2x_tab_long[32]; +extern const Word16 invTable[INV_TABLE_SIZE + 1]; +extern const Word16 sqrtTable[SQRT_TABLE_SIZE + 1]; +extern const Word16 invSqrtTable[SQRT_TABLE_SIZE + 1]; + +extern const float tcx_mdct_window_48[420]; +extern const float tcx_mdct_window_half_48[180]; +extern const float tcx_mdct_window_trans_48[60]; + + +/*----------------------------------------------------------------------------------* + * SWB TBE LSF tables (1.75 kbps) + *----------------------------------------------------------------------------------*/ + +extern const float sigma_BWE[]; +extern const float inv_sigma_BWE[]; +extern const float scales_BWE[]; +extern const Word8 no_lead_BWE[]; + +extern const float scales_BWE_3b[]; +extern const Word8 no_lead_BWE_3b[]; +extern const int16_t mslvq_SHB_min_bits[]; + +extern const float SHB_LSF_mean[]; + +extern const float SHB_LSF_VQ3[48]; +extern const float SHB_LSF_VQ4[96]; +extern const float *const cb_LSF_BWE[]; +extern const float LastCoefPred_0bit[18]; +extern const float LastCoefPred_1bit[36]; +extern const int16_t config_LSF_BWE[]; + +#endif diff --git a/lib_com/stab_est.c b/lib_com/stab_est.c new file mode 100644 index 0000000000000000000000000000000000000000..2b11c7f5f5d09221df925716835aaa48f9c7cc3c --- /dev/null +++ b/lib_com/stab_est.c @@ -0,0 +1,231 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * Local constants + *-------------------------------------------------------------------*/ + +#define BIN_4000 80 /* The frequency bin corresponding to 4kHz */ +#define MAX_SNR1 45.0f +#define INV_MAX_SNR ( 1.0f / ( MAX_SNR1 - 1.0f ) ) /* Max. SNR considered for noise subtraction in voiced segments */ +#define MAX_SNR_SNR1 ( MAX_SNR1 * INV_MAX_SNR ) /* 45 * (1 / (MAX_SNR1-1)) */ +#define MAX_BANDEXC 20 +#define TH_0_MAX ( 1.5f * 3.125f ) +#define TH_1_MAX ( 1.5f * 2.8125f ) +#define TH_2_MAX ( 1.5f * 2.1875f ) +#define TH_3_MAX ( 1.5f * 1.875f ) + +#define TH_UP 0.15625f +#define TH_DW 0.15625f +#define NB_TH3_MIN 30 +#define NB_TH1_MIN 30 + +#define MAX_THR 0.92f + +/*------------------------------------------------------------------------* + * stab_est() + * + * Signal stability estimation based on energy variation + *------------------------------------------------------------------------*/ + +int16_t stab_est( + float etot, /* i : Total energy of the current frame */ + float *lt_diff_etot, /* i/o: Long term total energy variation */ + float *mem_etot, /* i/o: Total energy memory */ + int16_t *nb_thr_3, /* i/o: Number of consecutives frames of level 3 */ + int16_t *nb_thr_1, /* i/o: Number of consecutives frames of level 1 */ + float *thresh, /* i/o: Detection thresold */ + int16_t *last_music_flag, /* i/o: Previous music detection ouptut */ + const int16_t vad_flag /* i : VAD flag */ +) +{ + int16_t i, music_flag2; + float mean_diff; + float ftmp_c, fcorr, dev; + + /*------------------------------------------------------------------------* + * Find mean of the past MAX_LT frames energy variation + *------------------------------------------------------------------------*/ + + mean_diff = 0.0f; + for ( i = 1; i < MAX_LT; i++ ) + { + mean_diff += lt_diff_etot[i - 1] * INV_MAX_LT; /* divide by MAX_LT */ + lt_diff_etot[i - 1] = lt_diff_etot[i]; + } + + mean_diff += lt_diff_etot[i - 1] * INV_MAX_LT; /* divide by MAX_LT */ + + /*------------------------------------------------------------------------* + * Find statistical deviation of the energy variation history + * against the last 15 frames + *------------------------------------------------------------------------*/ + + fcorr = 0.0f; + for ( i = MAX_LT - 15; i < MAX_LT; i++ ) + { + ftmp_c = lt_diff_etot[i] - mean_diff; + fcorr += ftmp_c * ftmp_c; + } + + lt_diff_etot[i - 1] = etot - *mem_etot; + *mem_etot = etot; + + /*------------------------------------------------------------------------* + * Compute statistical deviation + *------------------------------------------------------------------------*/ + + dev = (float) sqrt( fcorr / ( MAX_LT - 15 ) ); + + /*------------------------------------------------------------------------* + * State machine to decide level of inter-harmonic noise reduction and + * the first bins where this inter-harmonic noise reduction will be applied + * (only if this frame is GOOD or if we are already far from NB_BFI_THR) + * (if music_flag2 is 0, the spectral modification is deactivated, otherwise, it is activated) + *------------------------------------------------------------------------*/ + + music_flag2 = 0; + + /*--------------------------------------------------------------------* + * statistical deviation < Thresh3 and last signal category type >= 3 + * (last category was "tonal" and the new one is "very tonal") + *--------------------------------------------------------------------*/ + + if ( dev < thresh[3] && *last_music_flag >= 3 ) + { + music_flag2 = 4; + *nb_thr_3 += 1; + *nb_thr_1 = 0; + } + + /*--------------------------------------------------------------------* + * statistical deviation < Thresh2 and last signal category type >= 2 + * (last category was "moderatly tonal" and the new one is a "tonal" ) + *--------------------------------------------------------------------*/ + + else if ( dev < thresh[2] && *last_music_flag >= 2 ) + { + music_flag2 = 3; + *nb_thr_3 += 1; + *nb_thr_1 = 0; + } + + /*--------------------------------------------------------------------* + * statistical deviation < Thresh1 and last signal category type >= 1 + * (last category was "slightly tonal" and the new one is a "moderatly tonal") + *--------------------------------------------------------------------*/ + + else if ( dev < thresh[1] && *last_music_flag >= 1 ) + { + music_flag2 = 2; + } + + /*--------------------------------------------------------------------* + * statistical deviation < Thresh0 + * (last category was "not tonal" and the new one is "slightly tonal") + *--------------------------------------------------------------------*/ + + else if ( dev < thresh[0] ) + { + music_flag2 = 1; + } + + /*--------------------------------------------------------------------* + * statistical deviation > Thresh0 + * (Statistical deviation is high: the new tonal category is not tonal) + *--------------------------------------------------------------------*/ + + else + { + *nb_thr_1 += 1; + *nb_thr_3 = 0; + } + + /*------------------------------------------------------------------------* + * Update the thresholds + *------------------------------------------------------------------------*/ + + if ( *nb_thr_3 > NB_TH3_MIN ) + { + /* the number of consecutive categories type 3 or 4 (most tonal and tonal) */ + /* is greater than 30 frames ->increase the deviations thresholds to allow more variation */ + thresh[0] += TH_UP; + thresh[1] += TH_UP; + thresh[2] += TH_UP; + thresh[3] += TH_UP; + } + else if ( *nb_thr_1 > NB_TH1_MIN ) + { + /* the number of consecutive categories type 0 (non tonal frames) */ + /* is greater than 30 frames -> decrease the deviations thresholds to allow less variation */ + thresh[0] -= TH_DW; + thresh[1] -= TH_DW; + thresh[2] -= TH_DW; + thresh[3] -= TH_DW; + } + + /* limitation of the threshold (this local macro stores the highest of the two and it also counts the # of operations) */ + set_max( &thresh[0], TH_0_MIN2 ); + set_max( &thresh[1], TH_1_MIN2 ); + set_max( &thresh[2], TH_2_MIN2 ); + + set_min( &thresh[0], TH_0_MAX ); + set_min( &thresh[1], TH_1_MAX ); + set_min( &thresh[2], TH_2_MAX ); + + set_max( &thresh[3], TH_3_MIN2 ); + set_min( &thresh[3], TH_3_MAX ); + /*------------------------------------------------------------------------* + * Final updates + *------------------------------------------------------------------------*/ + + *last_music_flag = music_flag2; + if ( vad_flag == 0 ) + { + /* overwrite decision in unvoiced frames */ + music_flag2 = 0; + } + + return music_flag2; +} diff --git a/lib_com/stat_com.h b/lib_com/stat_com.h new file mode 100644 index 0000000000000000000000000000000000000000..a3e139c187da29094733b0e99a86c1552aac2473 --- /dev/null +++ b/lib_com/stat_com.h @@ -0,0 +1,686 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + + +#ifndef STAT_COM_H +#define STAT_COM_H + +#include +#include "options.h" +#include "typedef.h" +#include "cnst.h" + +/* Forward declaration of Decoder_State */ +struct Decoder_State; + + +/*----------------------------------------------------------------------------------* + * Declaration of structures + *----------------------------------------------------------------------------------*/ + +typedef struct +{ + float a[MAXLAG_WI]; + float b[MAXLAG_WI]; + int16_t lag; + int16_t nH; + int16_t nH_4kHz; + float upper_cut_off_freq_of_interest; + float upper_cut_off_freq; + int32_t sampling_rate; +} DTFS_STRUCTURE; + +typedef struct +{ + int16_t lead_sign_ind; + uint32_t index, size; + int16_t dim, k_val; +} PvqEntry; + +typedef struct +{ + uint8_t buf[MAX_SIZEBUF_PBITSTREAM]; + signed char curPos; + uint16_t numByte; + uint16_t numbits; + uint16_t maxBytes; +} TCQ_BITSTREAM, *TCQ_PBITSTREAM; + +typedef struct +{ + TCQ_PBITSTREAM bsInst; + + uint32_t low; + uint32_t high; + + uint32_t value; + int16_t bits_to_follow; + + int16_t num_bits; + int16_t max_bits; + +} ARCODEC, *PARCODEC; + +/*---------------------------------------------------------------* + * ACELP Encoder/Decoder Static RAM * + *---------------------------------------------------------------*/ + +typedef struct +{ + /*Coding mode info*/ + int16_t mode_index; + + /*LPC info*/ + int16_t midLpc; /*Flag for using or not mid LPC for the current frame*/ + int16_t midLpc_enable; /*Flag enabling or not the mid LPC for the current mode*/ + + /*ICB flags*/ + int16_t pre_emphasis; /*Flag for triggering pre-emphasis*/ + int16_t pitch_sharpening; /*Flag for triggering pitch sharpening*/ + int16_t phase_scrambling; /*Flag for triggering phase scrambling*/ + int16_t formant_enh; /*Flag for triggering formant enhancement*/ + int16_t formant_tilt; /*Flag for triggering formant tile*/ + + int16_t voice_tilt; /*Flag for triggering new voice factor tilt*/ + + float formant_enh_num; + float formant_enh_den; + + int16_t bpf_mode; + + int16_t nrg_mode; + int16_t nrg_bits; + + int16_t ltp_mode; + int16_t ltp_bits; + + int16_t ltf_mode; + int16_t ltf_bits; + + int16_t gains_mode[NB_SUBFR16k]; + + int16_t fixed_cdk_index[NB_SUBFR16k]; + + /* IVAS related parameters */ + int16_t pitch_bits[NB_SUBFR16k]; + int16_t lsf_bits; + int16_t mid_lsf_bits; + int16_t AVQ_cdk_bits[NB_SUBFR16k]; + int16_t FEC_mode; /* 0 == no FEC bits; 1 == class; 2 == clas+energy; 3== class+energy+pulse */ + int16_t ubits; + int16_t fcb_mode; /* 0 == mode1; 1 == mode2 */ + +} ACELP_config; + +typedef struct +{ + int16_t bits; /* bits per subframe */ + int16_t nbiter; /* number of iterations */ + float alp; /* initial energy of all fixed pulses */ + int16_t nb_pulse; /* number of pulses */ + int16_t fixedpulses; /* number of pulses whose position is determined from correlation and not by iteration */ + int16_t nbpos[13]; /* number of positions tried in the pair-wise search */ + enum TRACKPOS codetrackpos; /* ordering of tracks -mode */ + +} PulseConfig; + +/*---------------------------------------------------------------* + * TCX Encoder/Decoder Static RAM * + *---------------------------------------------------------------*/ + +typedef struct +{ + uint8_t maxOrder; + uint8_t nMaxFilters; /* Maximum number of filters. */ + uint8_t allowTnsOnWhite; + struct TnsParameters const *pTnsParameters; /* Parameters for each TNS filter */ + int16_t iFilterBorders[TNS_MAX_NUM_OF_FILTERS + 1]; /* Lower borders for each filter. Upper border for the first filter is nsbBorders-1. Upper borders for other filters is the lower border of previous filter. */ + +} STnsConfig; + +typedef struct TNS_filter_structure +{ + int16_t filterType; + int16_t spectrumLength; /* Number of subbands covered by the filter. */ + int16_t order; /* Filter order. */ + int16_t coefIndex[TNS_MAX_FILTER_ORDER]; /* Quantized filter coefficients. */ + float predictionGain; /* Prediction gain. The ratio of a signal and TNS residual energy. */ + float avgSqrCoef; /* Average squared filter coefficient. */ + +} STnsFilter; + +typedef struct /* TNS data describing all active filters. */ +{ + int16_t nFilters; /* Number of active filters. */ + int16_t tnsOnWhitenedSpectra; + STnsFilter filter[TNS_MAX_NUM_OF_FILTERS]; /* Active filters. */ + +} STnsData; + +/* Structure containing lengths for band division and polynomial aproximation for spectrum weighting. + Borders and weighting are available for TCX10 and TCX20 for a specific sampling rate. */ +typedef struct +{ + const uint8_t bandLengthsTCX20[FDNS_NPTS]; /* Length of a band in number of bins. Range is 2..31 */ + const uint8_t bandLengthsTCX10[FDNS_NPTS]; /* Length of a band in number of bins. Range is 2..20, always divisible by 2 */ + +} SpectrumWarping; + +typedef struct +{ + int16_t nBins; /* Range 0..1200 */ + uint8_t nBands; /* Range 0..64 */ + const uint8_t *bandLengths; /* Length of a band in number of bins. Range is 2..31 */ + +} PsychoacousticParameters; + + +typedef struct TCX_config_structure +{ + /* TCX mdct window */ + float tcx_mdct_window[L_MDCT_OVLP_MAX_CORE_FS]; /* Sine window for OL decision and DTX transitions*/ + float tcx_aldo_window_1[L_ALDO_WIN1_MAX_CORE_FS]; /* ALDO window long slope */ + float tcx_aldo_window_2[L_MDCT_OVLP_MAX_CORE_FS]; /* ALDO window short slope */ + float *tcx_aldo_window_1_trunc; /* ALDO window truncated long slope */ + + int16_t last_aldo; + float tcx_mdct_window_half[L_MDCT_HALF_OVLP_MAX_CORE_FS]; + float tcx_mdct_window_minimum[L_MDCT_MIN_OVLP_MAX_CORE_FS]; + float tcx_mdct_window_trans[L_MDCT_MIN_OVLP_MAX_CORE_FS]; /* transition window for ACELP->TCX */ + + int16_t tcx5Size; /* Size of the TCX5 spectrum in number of samples. Always 5ms. */ + + int16_t tcx_curr_overlap_mode; /* window overlap of current frame (0: full, 2: none, or 3: half) */ + int16_t tcx_last_overlap_mode; /* previous window overlap, i.e. left-side overlap of current frame */ + + int16_t tcx_mdct_window_length; /* length of overlap-add region*/ + int16_t tcx_mdct_window_half_length; /* length of the "half" overlap */ + int16_t tcx_mdct_window_min_length; /* length of the "minimum" overlap */ + int16_t tcx_mdct_window_trans_length; /* length of the ACELP->TCX overlap */ + + int16_t tcx_mdct_window_delay; /* length of window delay */ + int16_t tcx_offset; /* Offset of the folding point relative to the end of the previous synthetised frame */ + int16_t tcx_mdct_window_length_old; /* for keeping old value for sample rate switching */ + float tcx_mdct_windowFB[L_MDCT_OVLP_MAX]; + float tcx_aldo_window_1_FB[L_ALDO_WIN1_FB_MAX]; /* ALDO window long slope */ + float tcx_aldo_window_2_FB[L_MDCT_OVLP_MAX]; /* ALDO window short slope */ + float *tcx_aldo_window_1_FB_trunc; /* ALDO window truncated long slope */ + + float tcx_mdct_window_halfFB[L_MDCT_HALF_OVLP_MAX]; + float tcx_mdct_window_minimumFB[L_MDCT_MIN_OVLP_MAX]; + float tcx_mdct_window_transFB[L_MDCT_TRANS_OVLP_MAX]; /* transition window for ACELP->TCX */ + + int16_t tcx5SizeFB; /* Size of the TCX5 spectrum in number of samples. Always 5ms. */ + + int16_t tcx_mdct_window_lengthFB; /* length of window, length of overlap-add region */ + int16_t tcx_mdct_window_half_lengthFB; /* length of the "half" overlap window */ + int16_t tcx_mdct_window_min_lengthFB; /* length of the "minimum" overlap window */ + int16_t tcx_mdct_window_trans_lengthFB; /* length of the ACELP->TCX overlap */ + + int16_t tcx_mdct_window_delayFB; /* length of window delay */ + int16_t tcx_offsetFB; + + int16_t tcx_coded_lines; /* max number of coded lines, depending on audio bandwidth */ + + /* FAC window */ + int16_t lfacNext; + int16_t lfacNextFB; + + /* TNS */ + int16_t fIsTNSAllowed; + STnsConfig tnsConfig[2][2]; + STnsConfig const *pCurrentTnsConfig; + + /*Quantization*/ + float sq_rounding; /*set the sq deadzone (no deadzone=0.5f)*/ + int16_t tcxRateLoopOpt; + + /*Bandwidth*/ + float preemph_fac; /* preemphasis factor */ + float bandwidth; + + /* Context HM - Residual Quantization*/ + int16_t ctx_hm; /* Flag for enabling Context HM */ + int16_t resq; /* Flag for enabling Residual Quantization */ + int16_t coder_type; /* GC,VC,UC */ + + float na_scale; + + float SFM2; + + /* Psychoacoustic parameters for LPC in TCX */ + PsychoacousticParameters psychParamsTCX10; + PsychoacousticParameters psychParamsTCX20; + PsychoacousticParameters psychParamsTCX20AfterACELP; + PsychoacousticParameters const *psychParamsCurrent; + +} TCX_config, *TCX_CONFIG_HANDLE; + +typedef struct +{ + int32_t low; + int32_t high; + uint32_t value; + int32_t bits_to_follow; +} Tastat; + +/*---------------------------------------------------------------* + * FD CNG common structure * + *---------------------------------------------------------------*/ + +typedef struct +{ + int16_t fftlen; /* FFT length */ + int16_t stopFFTbin; /* Number of FFT bins to be actually processed */ + int16_t numPartitions; /* Number of partitions */ + const int16_t *sidPartitions; /* Upper boundaries for grouping the (sub)bands into partitions when transmitting SID frames (define as NULL pointer to avoid grouping) */ + + int16_t numShapingPartitions; /* Number of partitions */ + const int16_t *shapingPartitions; /* Upper boundaries for grouping the (sub)bands into partitions for shaping at the decoder (define as NULL pointer to avoid grouping) */ + +} FD_CNG_SETUP; + +typedef struct +{ + int16_t bwmode; + + int32_t bitrateFrom; + int32_t bitrateTo; + + float scale; + +} SCALE_SETUP; + +typedef struct +{ + FD_CNG_SETUP FdCngSetup; + + int16_t numSlots; /* Number of time slots in CLDFB matrix */ + int16_t regularStopBand; /* Number of CLDFB bands to be considered */ + + int16_t numCoreBands; /* Number of core bands to be decomposed into FFT subbands */ + int16_t stopBand; /* Total number of (sub)bands to be considered */ + int16_t startBand; /* First (sub)band to be considered */ + int16_t stopFFTbin; /* Total number of FFT subbands */ + int16_t frameSize; /* Frame size in samples */ + int16_t fftlen; /* FFT length used for the decomposition */ + + float timeDomainBuffer[L_FRAME16k]; + float fftBuffer[FFTLEN]; + float olapBufferAna[FFTLEN]; + float olapBufferSynth[FFTLEN]; + float olapBufferSynth2[FFTLEN]; + const float *olapWinAna; + const float *olapWinSyn; + const float *fftSineTab; + + float msM_win; + float msM_subwin; + + int16_t msFrCnt_init_counter; /* Frame counter at initialization */ + int16_t msFrCnt_init_thresh; + float init_old; + int16_t msFrCnt; /* Frame counter */ + float msAlphaCor[2]; /* Correction factor (smoothed) */ + float msSlope[2]; + float msQeqInvAv[2]; + int16_t msMinBufferPtr; + + float msPsdSum[2]; + float msPeriodogSum[2]; + + int16_t offsetflag; + + float periodog[PERIODOGLEN]; /* Periodogram */ + float cngNoiseLevel[FFTCLDFBLEN]; /* Noise level applied for the CNG in each (sub)band */ + int16_t seed; /* Seed memory (for random function) */ + int16_t seed2; /* Seed for second noise source in MDCT-Stereo DTX */ + int16_t seed3; /* Seed for third noise source in MDCT-Stereo DTX */ + + int16_t npart; /* Number of partitions */ + int16_t midband[NPART]; /* Central band of each partition */ + int16_t nFFTpart; /* Number of hybrid spectral partitions */ + int16_t part[NPART]; /* Partition upper boundaries (band indices starting from 0) */ + float psize[NPART]; /* Partition sizes */ + float psize_inv[NPART]; /* Inverse of partition sizes */ + float FFTscalingFactor; /* Squared ratio between core signal analysis FFT and noise estimator FFT */ + float scalingFactor; + int16_t nCLDFBpart; /* Number of CLDFB spectral partitions */ + int16_t CLDFBpart[NPARTCLDFB]; /* CLDFB Partition upper boundaries (band indices starting from 0 above the core coder bands) */ + float CLDFBpsize_inv[NPARTCLDFB]; /* Inverse of CLDFB partition sizes */ + + int16_t inactive_frame_counter; + int16_t sid_frame_counter; + int16_t active_frame_counter; /* Active frame counter limited to MSBUFLEN in stereo decoder */ + + float sidNoiseEst[NPART]; /* Transmitted noise level */ + + float sidNoiseEstLp[NPART]; + + int16_t frame_type_previous; + + float A_cng[M + 1]; + float exc_cng[L_FRAME16k]; + + int32_t CngBitrate; + int16_t CngBandwidth; + + int16_t flag_noisy_speech; + float likelihood_noisy_speech; + + float coherence; /* inter-channel coherence of noise */ + int16_t no_side_flag; /* indicates whether the side noise shape should be zeroed-out or not */ + +} FD_CNG_COM, *HANDLE_FD_CNG_COM; + + +/*---------------------------------------------------------------* + * TNS bitmapping * + *---------------------------------------------------------------*/ + +/** Function that gets specific value from p. + * @param p Pointer to a variable that can also be structure or array. + * @param index Index of a variable when p is an array, otherwise 0. + * @param pValue Pointer to the value. + * @return Substructure associated with this value or NULL if there is none. + */ +typedef void const *( *TGetParamValue )( void const *p, int16_t index, int16_t *pValue ); + +/** Function that puts specific value to p. + * @param p Pointer to a variable that can also be structure or array. + * @param index Index of a variable when p is an array, otherwise 0. + * @param value The value. + * @return Substructure associated with this value or NULL if there is none. + */ +typedef void *( *TSetParamValue )( void *p, int16_t index, int16_t value ); + +/** Function that return required number of bits for a value when it is coded. + * @param value The value. + * @param index Index of a variable when it is an element of an array, otherwise 0. + * @return Number of bits required to code the value. + */ +typedef int16_t ( *TGetNumberOfBits )( int16_t value, int16_t index ); + +/** Function that encodes a value. + * @param value The value. + * @param index Index of a variable when it is an element of an array, otherwise 0. + * @return Coded value. + */ +typedef int16_t ( *TEncodeValue )( int16_t value, int16_t index ); + +/** Function that decodes a value. + * @param bitstream Bitstream containing a coded value. + * @param index Index of a variable when it is an element of an array, otherwise 0. + * @param pValue A pointer where the decoded value should be stored. + * @return Number of bits read from the bitstream. + */ +typedef int16_t ( *TDecodeValue )( struct Decoder_State *st, int16_t index, int16_t *pValue ); + +/** Linear prediction analysis/synthesis filter definition. + * @param order filter order. + * @param parCoeff filter (PARCOR) coefficients. + * @param state state of the filter. Must be at least of 'order' size. + * @param x the current input value. + * @return the output of the filter. + */ +typedef float ( *TLinearPredictionFilter )( const int16_t order, const float parCoeff[], float *state, float x ); + +/** Structure that defines mapping between a parameter and a bitstream. */ +typedef struct ParamBitMap +{ + /** Number of bits in a bitstream required for the parameter. + * If nBits is equal to 0 then GetNumberOfBits is used. + */ + int16_t nBits; + /** Function to get the number of bits required for a value of this parameter. + * If nBits != 0 it is not used and can be set to NULL. + * If fZeroAllowed == 0 then GetNumberOfBits must take care of this. + */ + TGetNumberOfBits GetNumberOfBits; + /** If fZeroAllowed is 0 then the value can be zero. + * If the value can't be zero then value-1 is stored in a bitstream. + * If EncodeValue is not equal to NULL, then the encode/decode function + * must take care of this flag - there is no additional processing in parameter bitmapping. + * If EncodeValue is equal to NULL, then the encode/decode function takes care of this. + */ + int16_t fZeroAllowed; + /** Function to get the value of this parameter. + * The function returns a pointer to be used in functions in pSubParamBitMap. + * If the function returns NULL then the same pointer as for the current + * parameter is to be used. + * The function should not do any additional processing if fZeroAllowed == 0, + * but just set the value as it is. + */ + TGetParamValue GetParamValue; + /** Function to set the value of this parameter. + * The function returns a pointer to be used in functions in pSubParamBitMap. + * If the function returns NULL then the same pointer as for the current + * parameter is to be used. + * The function should not do any additional processing if fZeroAllowed == 0, + * but just set the value as it is. + */ + TSetParamValue SetParamValue; + + /** Function to encode a value of this parameter. + * When it is equal to NULL, fixed-width coding is used. + * If fZeroAllowed == 0 then EncodeValue must take care of this. + */ + TEncodeValue EncodeValue; + + /** Function to decode a value of this parameter. + * When it is equal to NULL, fixed-width coding is used. + * If fZeroAllowed == 0 then DecodeValue must take care of this. + */ + TDecodeValue DecodeValue; + + /** Pointer to the map for substructure. + * The number of structures is determined by this parameter's value. + * NULL means that there is no substructure. + */ + struct ParamsBitMap const *pSubParamBitMap; +} ParamBitMap; + +/** Structure that defines mapping between parameters and a bitstream. */ +typedef struct ParamsBitMap +{ + /** Number of parameters in params. */ + int16_t nParams; + /** Definition of the mapping for each parameter. */ + ParamBitMap params[10]; +} ParamsBitMap; + +struct TnsParameters +{ + /* Parameters for each TNS filter */ + int16_t startLineFrequency; /* Starting lower frequency of the TNS filter [20..16000] */ + int16_t nSubdivisions; /* Number of spectrum subdivisions in which the filter operates [1..8) */ + float minPredictionGain; /* Minimum prediction gain required to turn on the TNS filter */ + float minAvgSqrCoef; /* Minimum average square of coefficients required to turn on the TNS filter */ + float minEnergyChange; /* Minimum energy change required to turn on the TNS filter */ +}; + +/**********************************************/ +/* Helper structures for hufmann table coding */ +/**********************************************/ + +typedef struct +{ + uint8_t value; + uint16_t code; + uint8_t nBits; +} Coding; + + +/* Scale TCX setup */ +typedef struct +{ + int16_t bwmode; + + int32_t bitrateFrom; + int32_t bitrateTo; + + float scale; + +} SCALE_TCX_SETUP; + + +typedef struct +{ + uint16_t frame_bits; /*Bits per frame*/ + uint16_t frame_net_bits; /*Net Bits per frame*/ + uint8_t transmission_bits; /*max=1*/ + uint8_t transmission_mode[2]; /*SID,VBR/CBR*/ + uint8_t bandwidth_bits; /*max=2*/ + uint8_t bandwidth_min; /*first valid bandwidth (NB,WB,SWB,FB)*/ + uint8_t bandwidth_max; /*last valid bandwidth (NB,WB,SWB,FB)*/ + uint8_t reserved_bits; /*max=1*/ + +} FrameSizeParams; + +typedef struct cldfb_filter_bank_struct +{ + int16_t no_channels; + int16_t no_col; + int16_t p_filter_length; + CLDFB_TYPE type; + int16_t ds; /* delay synthesis */ + int16_t da; /* delay analysis */ + CLDFB_PROTOTYPE prototype; + + const float *p_filter; + + /* rotation vectors */ + const float *rot_vec_ana_re; + const float *rot_vec_ana_im; + const float *rot_vec_syn_re; + const float *rot_vec_syn_im; + + /* rotation vectors for delay */ + const float *rot_vec_ana_delay_re; + const float *rot_vec_ana_delay_im; + const float *rot_vec_syn_delay_re; + const float *rot_vec_syn_delay_im; + + /* memory helper states */ + float *memory; + uint16_t memory_length; + + /* main filter state */ + float *cldfb_state; + + /* other parameters */ + int16_t bandsToZero; /* bands not synthesized */ + int16_t nab; /* number of active bands */ + float scale; /* scaling of frequency domain */ + +} CLDFB_FILTER_BANK, *HANDLE_CLDFB_FILTER_BANK; + + +typedef enum +{ + FRAME_0 = 0, + FRAME_2 = 40, + FRAME_2_4 = 48, + FRAME_4 = 80, + FRAME_5_6 = 112, + FRAME_7_2 = 144, + FRAME_8 = 160, + FRAME_9_6 = 192, + FRAME_13_2 = 264, + FRAME_16_4 = 328, + FRAME_24_4 = 488, + FRAME_32 = 640, + FRAME_48 = 960, + FRAME_64 = 1280, + FRAME_96 = 1920, + FRAME_128 = 2560 + +} FRAME_SIZE; + +/*---------------------------------------------------------------* + * IGF * + *---------------------------------------------------------------*/ + +typedef struct igf_grid_struct +{ + int16_t swb_offset[IGF_MAX_SFB]; + int16_t swb_offset_len; + int16_t startFrequency; + int16_t stopFrequency; + int16_t startLine; + int16_t stopLine; + int16_t startSfb; + int16_t stopSfb; + int16_t sfbWrap[IGF_MAX_TILES + 1]; + int16_t sbWrap[IGF_MAX_TILES]; + int16_t nTiles; + int16_t minSrcSubband; + int16_t minSrcFrequency; + int16_t tile[IGF_MAX_TILES + 1]; + int16_t infoIsRefined; + int16_t infoGranuleLen; + float whiteningThreshold[2][IGF_MAX_TILES]; + float gFactor; + float fFactor; + float lFactor; +} IGF_GRID, *H_IGF_GRID; + +typedef struct IGF_INFO_struct +{ + int16_t *nfSeed; + int16_t nfSeedBuf[2]; + int32_t sampleRate; + int16_t frameLength; + int16_t maxHopsize; + IGF_GRID grid[IGF_NOF_GRIDS]; + int16_t bitRateIndex; +} IGF_INFO, *H_IGF_INFO; + + +typedef struct +{ + int16_t *indexBuffer; + int16_t *peakIndices, *holeIndices; + int16_t numPeakIndices, numHoleIndices; +} CONTEXT_HM_CONFIG; + +typedef enum +{ + LPC_ABS_QUANT_BITS = 8, + SNS_ABS_QUANT_BITS = 10 +} ABS_QUANT_BITS; + +#endif diff --git a/lib_com/stat_noise_uv_mod.c b/lib_com/stat_noise_uv_mod.c new file mode 100644 index 0000000000000000000000000000000000000000..b269b3fb09d0404c8aa68e4658a64fc604808e15 --- /dev/null +++ b/lib_com/stat_noise_uv_mod.c @@ -0,0 +1,238 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "prot.h" +#include "wmc_auto.h" + +/*---------------------------------------------------------------------* + * Local constants + *---------------------------------------------------------------------*/ + +#define TILT_COMP_LIM 0.75f + +/*---------------------------------------------------------* + * Local function prototypes + *---------------------------------------------------------*/ + +static float calc_tilt( const float *x, const int16_t len ); + +/*--------------------------------------------------------------------* + * stat_noise_uv_mod() + * + * Modifies excitation signal in stationary noise segments + *--------------------------------------------------------------------*/ + +void stat_noise_uv_mod( + const int16_t coder_type, /* i : coder type */ + float noisiness, /* i : noisiness parameter */ + const float *const lsp_old, /* i : old LSP vector at 4th sfr */ + const float *const lsp_new, /* i : LSP vector at 4th sfr */ + const float *const lsp_mid, /* i : LSP vector at 2nd sfr */ + float *Aq, /* o : A(z) quantized for the 4 subframes */ + float *exc2, /* o : excitation buffer */ + const int16_t bfi, /* i : bad frame indicator */ + float *ge_sm, /* i/o: smoothed excitation gain */ + int16_t *uv_count, /* i/o: unvoiced counter */ + int16_t *act_count, /* i/o: activation counter */ + float lspold_s[], /* i/o: old LSP */ + int16_t *noimix_seed, /* i/o: mixture seed */ + float *st_min_alpha, /* i/o: minimum alpha */ + float *exc_pe, /* i/o: memory of the preemphasis filter */ + const int32_t bitrate, /* i : core bitrate */ + const int16_t bwidth /* i : audio bandwidth */ +) +{ + int16_t i, k; + int16_t i_subfr; + float exctilt; + float vare, ge, randval; + float alpha, min_alpha; + float lspnew_s[M], oldlsp_mix[M], midlsp_mix[M], newlsp_mix[M]; + float beta; + float noimix_fac; + + alpha = 1.0f; + min_alpha = 0.5f; + + /*---------------------------------------------------------* + * Update minimum mixing factor alpha + *---------------------------------------------------------*/ + + /* Activate modifications for WB/SWB <= 9.6kbps for NB only at 9.6kbps */ + if ( coder_type == INACTIVE && ( bitrate == ACELP_9k60 || ( bitrate < ACELP_9k60 && bwidth > NB ) ) ) + { + if ( !bfi ) + { + min_alpha = max( noisiness / 31.0f * 0.5f + 0.5f, *st_min_alpha - 0.05f ); + *st_min_alpha = min_alpha; + } + else + { + min_alpha = *st_min_alpha; + } + } + + /*---------------------------------------------------------* + * Mix excitation signal with random noise + *---------------------------------------------------------*/ + + /* Activate modifications for WB/SWB <= 9.6kbps for NB only at 9.6kbps */ + if ( coder_type == INACTIVE && ( bitrate == ACELP_9k60 || ( bitrate < ACELP_9k60 && bwidth > NB ) ) ) + { + /* preemphasize the excitation signal with its tilt */ + if ( min_alpha < TILT_COMP_LIM ) + { + for ( i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR ) + { + exctilt = calc_tilt( &exc2[i_subfr], L_SUBFR ); + exctilt = ( TILT_COMP_LIM - min_alpha ) / ( TILT_COMP_LIM - 0.5f ) * exctilt; + + preemph( &exc2[i_subfr], exctilt, L_SUBFR, exc_pe ); + } + } + + /* set the mixing factor alpha */ + ( *uv_count )++; + if ( *uv_count <= START_NG ) + { + *act_count = 3; + alpha = 1; + mvr2r( lsp_new, lspold_s, M ); + } + else + { + *act_count = 0; + if ( *uv_count > FULL_NG ) + { + *uv_count = FULL_NG; + } + + alpha = 1 + ( (float) *uv_count - START_NG ) / ( (float) FULL_NG - START_NG ) * ( min_alpha - 1.0f ); + } + + /* calculate lowpass-filtered excitation gain */ + vare = 0.01f; + for ( i = 0; i < L_FRAME; i++ ) + { + vare += exc2[i] * exc2[i]; + } + + ge = (float) sqrt( vare / (float) L_FRAME ); + if ( *uv_count == 1 ) + { + *ge_sm = ge; + } + else + { + *ge_sm = ISP_SMOOTHING_QUANT_A1 * *ge_sm + ( 1 - ISP_SMOOTHING_QUANT_A1 ) * ge; + } + + /* generate mixture of excitation and noise */ + beta = 2 * ( alpha - 0.5f ); + noimix_fac = ( beta + *ge_sm / ge * ( 1 - beta ) ) / (float) sqrt( alpha * alpha + ( 1 - alpha ) * ( 1 - alpha ) ); + + for ( i = 0; i < L_FRAME; i++ ) + { + randval = ge * (float) sqrt( 12.0f ) * ( (float) own_random( noimix_seed ) / 65536.0f ); + exc2[i] = noimix_fac * ( exc2[i] * alpha + randval * ( 1 - alpha ) ); + } + + /* generate low-pass filtered version of LSP coefficients */ + for ( k = 0; k < M; k++ ) + { + lspnew_s[k] = (float) ISP_SMOOTHING_QUANT_A1 * lspold_s[k] + (float) ( 1 - ISP_SMOOTHING_QUANT_A1 ) * lsp_new[k]; + } + + for ( i = 0; i < M; i++ ) + { + oldlsp_mix[i] = beta * lsp_old[i] + ( 1 - beta ) * lspold_s[i]; + midlsp_mix[i] = beta * lsp_mid[i] + ( 1 - beta ) * 0.5f * ( lspold_s[i] + lspnew_s[i] ); + newlsp_mix[i] = beta * lsp_new[i] + ( 1 - beta ) * lspnew_s[i]; + } + + /* redo the interpolation of LSP coefficients and recalculte A(z) */ + int_lsp4( L_FRAME, oldlsp_mix, midlsp_mix, newlsp_mix, Aq, M, 0 ); + + mvr2r( lspnew_s, lspold_s, M ); + } + else + { + /* active signal - reset counters */ + ( *act_count )++; + if ( *act_count > 3 ) + { + *act_count = 3; + *uv_count = 0; + } + } + + return; +} + +/*---------------------------------------------------------------------------* + * calc_tilt() + * + * Calculate spectral tilt by means of 1st-order LP analysis + *---------------------------------------------------------------------------*/ + +/*! r: estimated tilt */ +static float calc_tilt( + const float *x, /* i : Signal input */ + const int16_t len /* i : length */ +) +{ + int16_t i; + float r0, r1; + + r0 = 0; + r1 = 0; + + for ( i = 0; i < len - 1; i++ ) + { + r0 += x[i] * x[i]; + r1 += x[i] * x[i + 1]; + } + + if ( r0 == 0 ) + { + r0 = 0.005f; + } + + return r1 / r0; +} diff --git a/lib_com/stl.h b/lib_com/stl.h new file mode 100644 index 0000000000000000000000000000000000000000..c9ca42280642ae4ba91cc65258d8a567b04a195c --- /dev/null +++ b/lib_com/stl.h @@ -0,0 +1,71 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ +/* + =========================================================================== + File: STL.H v.2.3 - 30.Nov.2009 + =========================================================================== + + ITU-T STL BASIC OPERATORS + + MAIN HEADER FILE + + History: + 07 Nov 04 v2.0 Incorporation of new 32-bit / 40-bit / control + operators for the ITU-T Standard Tool Library as + described in Geneva, 20-30 January 2004 WP 3/16 Q10/16 + TD 11 document and subsequent discussions on the + wp3audio@yahoogroups.com email reflector. + March 06 v2.1 Changed to improve portability. + + ============================================================================ +*/ + + +#ifndef _STL_H +#define _STL_H + +#include "options.h" /* note: needed until BASOP_NOGLOB is accepted */ +#include "typedef.h" +#include "basop32.h" +#include "move.h" +#include "control.h" +#include "enh1632.h" +#include "enh40.h" + +#endif /* ifndef _STL_H */ + + +/* end of file */ diff --git a/lib_com/swb_bwe_com.c b/lib_com/swb_bwe_com.c new file mode 100644 index 0000000000000000000000000000000000000000..f879d274ba8831c44d97ce9798c5732acb5a72ad --- /dev/null +++ b/lib_com/swb_bwe_com.c @@ -0,0 +1,1546 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * WB_BWE_gain_pred() + * + * predict WB frequency envelopes for 0b WB BWE + *-------------------------------------------------------------------*/ + +int16_t WB_BWE_gain_pred( + float *WB_fenv, /* o : WB frequency envelopes */ + const float *core_dec_freq, /* i : Frequency domain core decoded signal */ + const int16_t coder_type, /* i : coding type */ + const int16_t prev_coder_type, /* i : coding type of last frame */ + const float prev_WB_fenv, /* i : envelope for last frame */ + const float voice_factors[], /* i : voicing factors */ + const float pitch_buf[], /* i : pitch buffer */ + const int32_t last_core_brate, /* i : previous frame core bitrate */ + const float last_wb_bwe_ener, /* i : previous frame wb bwe signal energy */ + const int16_t last_extl, /* i : extl. layer for last frame */ + const float tilt ) +{ + float enerL, alfa = 1.0f; + int16_t n_freq, mode; + int16_t ener_var_flag = 0; + float voice_factor, pitch; + int16_t env_var_flag = 0; + + mode = NORMAL; + + enerL = EPSILON; + for ( n_freq = 128; n_freq < 192; n_freq++ ) + { + enerL += core_dec_freq[n_freq] * core_dec_freq[n_freq]; + } + WB_fenv[0] = EPSILON; + for ( n_freq = 192; n_freq < 224; n_freq++ ) + { + WB_fenv[0] += core_dec_freq[n_freq] * core_dec_freq[n_freq]; + } + + WB_fenv[1] = EPSILON; + for ( n_freq = 224; n_freq < 256; n_freq++ ) + { + WB_fenv[1] += core_dec_freq[n_freq] * core_dec_freq[n_freq]; + } + + voice_factor = sum_f( voice_factors, 4 ); + pitch = sum_f( pitch_buf, 4 ) + EPSILON; + + if ( enerL < 16.0f * max( WB_fenv[0], WB_fenv[1] ) && pitch < 308 ) + { + ener_var_flag = 1; + } + + if ( WB_fenv[0] > 2.0f * WB_fenv[1] ) + { + alfa = max( 2.0f * WB_fenv[1] / WB_fenv[0], 0.1f ); + WB_fenv[0] *= alfa; + } + else if ( 2.0f * WB_fenv[0] < WB_fenv[1] && coder_type != UNVOICED ) + { + alfa = max( 2.0f * WB_fenv[0] / WB_fenv[1], 0.1f ); + WB_fenv[1] *= alfa; + } + + WB_fenv[0] = (float) sqrt( ( WB_fenv[0] + WB_fenv[1] ) / 64 ); + + if ( coder_type != AUDIO && coder_type != UNVOICED && ener_var_flag == 0 ) + { + WB_fenv[0] *= 1.5f; + } + + if ( coder_type != TRANSITION && coder_type != AUDIO && coder_type != UNVOICED && sqrt( enerL ) > 40.0f * WB_fenv[0] && alfa > 0.9f && + !( coder_type == prev_coder_type && WB_fenv[0] > prev_WB_fenv ) ) + { + WB_fenv[0] *= min( (float) ( 0.025f * sqrt( enerL ) / WB_fenv[0] ), 4.0f ); + + if ( WB_fenv[0] > prev_WB_fenv ) + { + WB_fenv[0] = 0.3f * WB_fenv[0] + 0.7f * prev_WB_fenv; + } + } + + alfa = min( 1.5f, max( 0.5f, 77.0f * voice_factor / pitch ) ); + if ( sqrt( enerL ) > 64.0f * alfa * WB_fenv[0] && 3.0f * WB_fenv[0] * WB_fenv[0] < sqrt( enerL ) && prev_coder_type != UNVOICED ) + { + env_var_flag = 1; + WB_fenv[0] *= min( (float) ( 0.015625f * sqrt( enerL ) / WB_fenv[0] ), 4.0f ); + + if ( WB_fenv[0] > prev_WB_fenv ) + { + WB_fenv[0] = 0.3f * WB_fenv[0] + 0.7f * prev_WB_fenv; + } + } + + if ( coder_type == UNVOICED || prev_coder_type == UNVOICED ) + { + WB_fenv[0] *= 0.5f; + } + + if ( coder_type != AUDIO ) + { + WB_fenv[0] /= max( 1.2f * voice_factor, 1.0f ); + WB_fenv[0] *= min( 2.0f, max( 0.125f, pitch / 400.0f ) ); + } + + if ( last_core_brate > ACELP_8k00 && WB_fenv[0] > last_wb_bwe_ener ) + { + WB_fenv[0] = 0.9f * last_wb_bwe_ener + 0.1f * WB_fenv[0]; + } + + if ( last_extl != WB_BWE && ( tilt < 8.f ) ) + { + WB_fenv[0] *= min( 0.5f, 16.0f * tilt ); + } + + if ( env_var_flag == 1 ) + { + WB_fenv[1] = 1.5f * WB_fenv[0]; + WB_fenv[0] *= 0.75f; + } + else + { + WB_fenv[1] = WB_fenv[0]; + } + + if ( coder_type == UNVOICED || prev_coder_type == UNVOICED ) + { + WB_fenv[1] *= 0.5f; + } + + return ( mode ); +} + +/*-------------------------------------------------------------------* + * calc_normal_length() + * + *-------------------------------------------------------------------*/ + +void calc_normal_length( + const int16_t core, /* i : core */ + const float *sp, /* i : input signal */ + const int16_t mode, /* i : input mode */ + const int16_t extl, /* i : extension layer */ + int16_t *L_swb_norm, /* o : normalize length */ + int16_t *prev_L_swb_norm /* i/o: last normalize length */ +) +{ + int16_t i, n_freq, n_band, THRES; + const float *pit; + float peak, mean, mag; + int16_t L_swb_norm_trans, L_swb_norm_norm, L_swb_norm_harm, L_swb_norm_cur; + int16_t N; + + if ( core == HQ_CORE || extl == SWB_BWE || extl == FB_BWE ) + { + THRES = 8; + } + else + { + THRES = 4; + } + + if ( core == HQ_CORE && ( mode == HQ_HARMONIC || mode == HQ_HVQ ) ) + { + N = 13; + } + else + { + N = 16; + } + + n_band = 0; + pit = sp; + for ( i = 0; i < N; i++ ) + { + peak = 0.0f; + mean = 0; + + for ( n_freq = 0; n_freq < 16; n_freq++ ) + { + mag = (float) fabs( *pit ); + if ( mag > peak ) + { + peak = mag; + } + mean += mag; + pit++; + } + + if ( ( 15 + THRES ) * peak > THRES * mean && peak > 10 ) + { + n_band += 1; + } + } + + if ( core == ACELP_CORE ) + { + L_swb_norm_trans = (int16_t) ( 4 + 0.25f * n_band ); + L_swb_norm_norm = (int16_t) ( 8 + 0.5f * n_band ); + L_swb_norm_harm = max( (int16_t) ( 32 + 2.0f * n_band ), 24 ); + + if ( mode == HARMONIC ) + { + L_swb_norm_cur = L_swb_norm_harm; + } + else if ( mode == NORMAL ) + { + L_swb_norm_cur = L_swb_norm_norm; + } + else + { + L_swb_norm_cur = L_swb_norm_trans; + } + + *L_swb_norm = (int16_t) ( 0.5f * L_swb_norm_cur + 0.5f * ( *prev_L_swb_norm ) ); + *prev_L_swb_norm = L_swb_norm_cur; + } + else + { + if ( mode == HQ_HARMONIC || mode == HQ_HVQ ) + { + L_swb_norm_cur = (int16_t) ( 32 + 2.5f * n_band ); + } + else + { + L_swb_norm_cur = (int16_t) ( 8 + 0.5f * n_band ); + } + + *L_swb_norm = (int16_t) ( 0.1f * L_swb_norm_cur + 0.9f * ( *prev_L_swb_norm ) + 0.5f ); + *prev_L_swb_norm = L_swb_norm_cur; + } + + return; +} +/*-------------------------------------------------------------------* + * calc_tilt_bwe() + * + * calculate tilt parameter + *-------------------------------------------------------------------*/ + +void calc_tilt_bwe( + const float *sp, /* i : input signal */ + float *tilt, /* o : signal tilt */ + const int16_t N /* i : signal length */ +) +{ + int16_t i; + float r0, r1; + + r0 = EPSILON; + for ( i = 0; i < N; i++ ) + { + r0 += sp[i] * sp[i]; + } + + r1 = (float) fabs( sp[1] - sp[0] ); + for ( i = 2; i < N; i++ ) + { + if ( ( sp[i] - sp[i - 1] ) * ( sp[i - 1] - sp[i - 2] ) < 0 ) + { + r1 += (float) fabs( sp[i] - sp[i - 1] ); + } + } + + *tilt = (float) ( r1 / sqrt( r0 ) ); + + return; +} + +/*-------------------------------------------------------------------* + * calc_norm_envelop() + * + * calculate normalized parameter + *-------------------------------------------------------------------*/ + +void calc_norm_envelop( + const float SWB_signal[], /* i : SWB spectrum */ + float *envelope, /* o : normalized envelope */ + const int16_t L_swb_norm, /* i : length of envelope */ + const int16_t SWB_flength, /* i : Length of input/output */ + const int16_t st_offset /* i : offset */ +) +{ + int16_t i, lookback, env_index, n_freq, n_lag_now, n_lag; + + lookback = L_swb_norm / 2; + env_index = swb_bwe_subband[0] + st_offset; + n_lag_now = L_swb_norm; + for ( n_freq = swb_bwe_trans_subband[0] + st_offset - lookback; n_freq < SWB_flength + st_offset - L_swb_norm; n_freq++ ) + { + /* Apply MA filter */ + envelope[env_index] = EPSILON; + for ( n_lag = 0; n_lag < n_lag_now; n_lag++ ) + { + envelope[env_index] += (float) fabs( SWB_signal[n_freq + n_lag] ); + } + env_index++; + } + + for ( n_freq = SWB_flength + st_offset - L_swb_norm, i = 0; n_freq < SWB_flength + st_offset - lookback; n_freq++, i++ ) + { + n_lag_now = L_swb_norm - i; + /* Apply MA filter */ + envelope[env_index] = EPSILON; + for ( n_lag = 0; n_lag < n_lag_now; n_lag++ ) + { + envelope[env_index] += (float) fabs( SWB_signal[n_freq + n_lag] ); + } + env_index++; + } + + return; +} + + +/*-------------------------------------------------------------------* + * calc_norm_envelop_lf() + * + * calc_envelope of low frequency spectrum + *-------------------------------------------------------------------*/ +static void calc_norm_envelop_lf( + const float SWB_signal[], /* i : SWB spectrum */ + float *envelope, /* o : normalized envelope */ + int16_t *L_swb_norm, /* i/o: length of envelope */ + const int16_t HQ_mode, /* i : HQ mode */ + const int16_t hq_generic_offset, /* i : frequency offset for representing hq swb bwe */ + int16_t *sfreq, /* i : starting frequency index */ + int16_t *efreq ) /* i : ending frequency index */ +{ + int16_t lookback, env_index, n_freq, n_lag_now, n_lag; + + *sfreq = 2; + if ( hq_generic_offset == HQ_GENERIC_FOFFSET_24K4 ) + { + *efreq = 146; + if ( HQ_mode == HQ_GEN_FB ) + { + *efreq = 306; + } + if ( ( 328 - *efreq ) * 2 + 1 < *L_swb_norm ) + { + *L_swb_norm = ( 328 - *efreq ) * 2 + 1; + } + } + else + { + *efreq = 130; + if ( HQ_mode == HQ_GEN_FB ) + { + *efreq = 290; + } + if ( ( 400 - *efreq ) * 2 + 1 < *L_swb_norm ) + { + *L_swb_norm = ( 400 - *efreq ) * 2 + 1; + } + } + + lookback = *L_swb_norm / 2; + env_index = 0; + n_lag_now = *L_swb_norm; + for ( n_freq = 0; n_freq < lookback; n_freq++ ) + { + envelope[env_index] = EPSILON; + for ( n_lag = 0; n_lag < lookback + n_freq; n_lag++ ) + { + envelope[env_index] += (float) fabs( SWB_signal[n_lag] ); + } + env_index++; + } + for ( ; n_freq < *efreq; n_freq++ ) + { + /* Apply MA filter */ + envelope[env_index] = EPSILON; + for ( n_lag = 0; n_lag < n_lag_now; n_lag++ ) + { + envelope[env_index] += (float) fabs( SWB_signal[n_freq - lookback + n_lag] ); + } + env_index++; + } + return; +} + +/*-------------------------------------------------------------------* + * WB_BWE_decoding() + * + * WB BWE decoder + *-------------------------------------------------------------------*/ + +void WB_BWE_decoding( + const float *core_dec_freq, /* i : Frequency domain core decoded signal */ + float *WB_fenv, /* i : WB frequency envelopes */ + float *WB_signal, /* o : WB signal in MDCT domain */ + const int16_t WB_flength, /* i : Length of input/output */ + const int16_t mode, /* i : classification for WB signal */ + const int16_t last_extl, /* i : extl. layer for last frame */ + float *prev_Energy, /* i/o: energy for last frame */ + float *prev_WB_fenv, /* i/o: envelope for last frame */ + int16_t *prev_L_wb_norm, /* i/o: length for last frame wb norm */ + const int16_t extl, /* i : extension layer */ + const int16_t coder_type, /* i : coding type */ + const int32_t total_brate, /* i : core layer bitrate */ + int16_t *Seed, /* i/o: random generator seed */ + int16_t *prev_flag, /* i/o: attenu flag of last frame */ + int16_t prev_coder_type /* i : coding type of last frame */ +) +{ + int16_t n_freq, n_band; + int16_t i, L; + float envelope[L_FRAME16k]; + float energy, wfenv[2], EnergyL; + float *pit1; + int16_t L_wb_norm; + float alfa, beta; + int16_t flag = 0; + int16_t core_type = 1; + int16_t signum[L_FRAME16k]; + float inv_L_wb_norm, weight; + + calc_normal_length( ACELP_CORE, core_dec_freq, mode, extl, &L_wb_norm, prev_L_wb_norm ); + + set_f( WB_signal, 0, L_FRAME16k ); + + /* copy excitation */ + if ( coder_type != AUDIO && total_brate <= ACELP_8k00 ) + { + core_type = 0; + } + + if ( core_type == 0 ) + { + mvr2r( &core_dec_freq[160], &WB_signal[240], 80 ); + } + else + { + mvr2r( &core_dec_freq[80], &WB_signal[240], 80 ); + } + + /* calculate envelope */ + calc_norm_envelop( WB_signal, envelope, L_wb_norm, WB_flength, 0 ); + + if ( coder_type != UNVOICED && total_brate <= ACELP_8k00 ) + { + inv_L_wb_norm = 1.0f / L_wb_norm; + weight = ( mode != HARMONIC ) ? max( min( 3.0f * inv_L_wb_norm, 0.5f ), 0.25f ) : 0.25f; + for ( n_freq = swb_bwe_subband[0]; n_freq < swb_bwe_subband[4]; n_freq++ ) + { + signum[n_freq] = 1; + if ( WB_signal[n_freq] < 0 ) + { + signum[n_freq] = -1; + WB_signal[n_freq] *= signum[n_freq]; + } + + WB_signal[n_freq] = WB_signal[n_freq] - 0.45f * envelope[n_freq] * inv_L_wb_norm; + if ( WB_signal[n_freq] > 0 ) + { + WB_signal[n_freq] *= ( 0.55f - weight ); + } + WB_signal[n_freq] *= signum[n_freq]; + } + } + + /* Normalize with envelope */ + for ( n_freq = swb_bwe_subband[0]; n_freq < swb_bwe_subband[4]; n_freq++ ) + { + WB_signal[n_freq] /= envelope[n_freq]; + } + + if ( mode == HARMONIC ) + { + L = 4; + } + else + { + L = 1; + } + + if ( coder_type == UNVOICED ) + { + for ( n_freq = swb_bwe_subband[0]; n_freq < swb_bwe_subband[4]; n_freq++ ) + { + *Seed = (int16_t) ( 12345 * ( *Seed ) + 20101 ); + WB_signal[n_freq] = ( *Seed ) / PCM16_TO_FLT_FAC; + } + } + else + { + for ( n_band = 0; n_band < 4; n_band += L ) + { + energy = EPSILON; + for ( n_freq = swb_bwe_subband[n_band]; n_freq < swb_bwe_subband[n_band + L]; n_freq++ ) + { + energy += WB_signal[n_freq] * WB_signal[n_freq]; + } + + energy = (float) sqrt( ( swb_bwe_subband[n_band + L] - swb_bwe_subband[n_band] ) / energy ); + + for ( n_freq = swb_bwe_subband[n_band]; n_freq < swb_bwe_subband[n_band + L]; n_freq++ ) + { + WB_signal[n_freq] *= energy; + } + } + } + + + EnergyL = 0.0f; + if ( core_type == 1 ) + { + if ( prev_coder_type != AUDIO && total_brate <= ACELP_8k00 ) + { + for ( i = 160; i < 240; i++ ) + { + EnergyL += (float) fabs( core_dec_freq[i] ); + } + } + else + { + for ( i = 80; i < 240; i++ ) + { + EnergyL += (float) fabs( core_dec_freq[i] ); + } + } + + if ( total_brate <= ACELP_8k00 ) + { + alfa = 0.8f; + beta = 1.25f; + } + else + { + alfa = 0.5f; + beta = 2.0f; + } + } + else + { + if ( prev_coder_type == AUDIO ) + { + for ( i = 80; i < 240; i++ ) + { + EnergyL += (float) fabs( core_dec_freq[i] ); + } + } + else + { + for ( i = 160; i < 240; i++ ) + { + EnergyL += (float) fabs( core_dec_freq[i] ); + } + } + + if ( prev_coder_type == coder_type && WB_fenv[0] > prev_WB_fenv[0] ) + { + alfa = 0.4f; + beta = 2.5f; + } + else + { + alfa = 0.6f; + beta = 1.67f; + } + + if ( coder_type == GENERIC || ( EnergyL > 0.5f * ( *prev_Energy ) && EnergyL < 2.0f * ( *prev_Energy ) && *prev_flag == 1 ) ) + { + WB_fenv[0] *= 0.5f; + WB_fenv[1] *= 0.5f; + flag = 1; + } + } + if ( ( mode == HARMONIC && WB_fenv[1] < 0.25f * WB_fenv[0] ) || mode == NORMAL ) + { + if ( last_extl == WB_BWE && ( ( prev_coder_type == AUDIO && coder_type != AUDIO ) || ( prev_coder_type != AUDIO && coder_type == AUDIO ) ) && total_brate <= ACELP_8k00 ) + { + if ( WB_fenv[0] > prev_WB_fenv[0] ) + { + wfenv[0] = 0.3f * WB_fenv[0] + 0.7f * prev_WB_fenv[0]; + wfenv[1] = 0.3f * WB_fenv[1] + 0.7f * prev_WB_fenv[1]; + } + else + { + wfenv[0] = 0.5f * WB_fenv[0] + 0.5f * prev_WB_fenv[0]; + wfenv[1] = 0.4f * WB_fenv[1] + 0.4f * prev_WB_fenv[1]; + } + } + else if ( last_extl == WB_BWE && prev_WB_fenv[0] * EnergyL < WB_fenv[0] * ( *prev_Energy ) && WB_fenv[0] > prev_WB_fenv[0] && coder_type != AUDIO && coder_type != UNVOICED && total_brate <= ACELP_8k00 ) + { + wfenv[0] = 0.3f * WB_fenv[0] + 0.7f * prev_WB_fenv[0]; + wfenv[1] = 0.3f * WB_fenv[1] + 0.7f * prev_WB_fenv[1]; + } + else if ( last_extl == WB_BWE && EnergyL > alfa * ( *prev_Energy ) && EnergyL < beta * ( *prev_Energy ) && prev_coder_type != UNVOICED ) + { + wfenv[0] = 0.5f * ( WB_fenv[0] + prev_WB_fenv[0] ); + wfenv[1] = 0.5f * ( WB_fenv[1] + prev_WB_fenv[1] ); + } + else + { + wfenv[0] = WB_fenv[0]; + wfenv[1] = WB_fenv[1]; + } + for ( n_freq = swb_bwe_subband[0]; n_freq < swb_bwe_subband[2]; n_freq++ ) + { + WB_signal[n_freq] *= wfenv[0]; + } + + for ( n_freq = swb_bwe_subband[2]; n_freq < swb_bwe_subband[4]; n_freq++ ) + { + WB_signal[n_freq] *= wfenv[1]; + } + + prev_WB_fenv[0] = wfenv[0]; + prev_WB_fenv[1] = wfenv[1]; + } + else + { + wfenv[0] = 0.5f * ( WB_fenv[0] + WB_fenv[1] ); + + if ( last_extl == WB_BWE && EnergyL > 0.5f * ( *prev_Energy ) && EnergyL < 2.0f * ( *prev_Energy ) ) + { + wfenv[0] = 0.25f * wfenv[0] + 0.375f * ( prev_WB_fenv[0] + prev_WB_fenv[1] ); + } + for ( n_freq = swb_bwe_subband[0]; n_freq < swb_bwe_subband[4]; n_freq++ ) + { + WB_signal[n_freq] *= wfenv[0]; + } + + prev_WB_fenv[0] = wfenv[0]; + prev_WB_fenv[1] = wfenv[0]; + } + + *prev_flag = flag; + *prev_Energy = EnergyL; + pit1 = &WB_signal[240]; + + for ( n_freq = 0; n_freq < 16; n_freq++ ) + { + *( pit1++ ) *= ( 0.2f + n_freq * 0.05f ); + } + + if ( core_type == 1 ) + { + pit1 = &WB_signal[280]; + for ( n_freq = 0; n_freq < 40; n_freq++ ) + { + *( pit1++ ) *= ( 1.0f - n_freq * 0.02f ); + } + } + else + { + pit1 = &WB_signal[300]; + for ( n_freq = 0; n_freq < 20; n_freq++ ) + { + *( pit1++ ) *= ( 1.0f - n_freq * 0.04f ); + } + } + + return; +} + +/*-------------------------------------------------------------------* + * SWB_BWE_decoding() + * + * SWB BWE decoder + *-------------------------------------------------------------------*/ + +void SWB_BWE_decoding( + const float *core_dec_freq, /* i : Frequency domain core decoded signal */ + float *SWB_fenv, /* i/o: SWB frequency envelopes */ + float *SWB_signal, /* o : SWB signal in MDCT domain */ + const int16_t SWB_flength, /* i : Length of input/output */ + const int16_t mode, /* i : classification for SWB signal */ + int16_t *frica_flag, /* o : fricative signal flag */ + float *prev_Energy, /* i/o: energy for last frame */ + float *prev_SWB_fenv, /* i/o: envelope for last frame */ + int16_t *prev_L_swb_norm, /* i/o: length for last frame wb norm */ + const float tilt_nb, /* i : tilt of synthesis wb signal */ + int16_t *Seed, /* i/o: random generator seed */ + const int16_t st_offset, /* i : offset value due to different core */ + float *prev_weight, /* i/o: excitation weight value of last frame */ + const int16_t extl, /* i : extension layer */ + const int16_t last_extl /* i : extension layer of last frame */ +) +{ + int16_t n_freq, n_band, L, L_swb_norm; + float *pit1; + float envelope[L_FRAME32k]; + float fenvL, EnergyL, Energy, energy, weight, wfenv, factor; + float mean, factor1, tmp1, tmp2, tmp3, tmp4, tmp_ener; + int16_t signum[L_FRAME32k]; + float inv_L_swb_norm; + + fenvL = EPSILON; + EnergyL = EPSILON; + for ( n_freq = 224 + st_offset; n_freq < swb_bwe_trans_subband[0] + st_offset; n_freq++ ) + { + fenvL += core_dec_freq[n_freq] * core_dec_freq[n_freq]; + } + + for ( n_freq = 16; n_freq < L_FRAME; n_freq++ ) + { + EnergyL += core_dec_freq[n_freq] * core_dec_freq[n_freq]; + } + fenvL = (float) sqrt( fenvL / 16 ); + EnergyL = (float) sqrt( EnergyL / 240 ); + if ( fenvL > 8.0f * SWB_fenv[0] ) + { + fenvL = SWB_fenv[0]; + } + calc_normal_length( ACELP_CORE, core_dec_freq, mode, extl, &L_swb_norm, prev_L_swb_norm ); + + if ( mode == TRANSIENT ) + { + Energy = 0.0f; + for ( n_band = 0; n_band < SWB_FENV_TRANS; n_band++ ) + { + Energy += SWB_fenv[n_band] * SWB_fenv[n_band]; + } + Energy /= SWB_FENV_TRANS; + + /* Reconstruct excitation from LF signal */ + mvr2r( &core_dec_freq[112], &SWB_signal[240 + st_offset], 128 ); + mvr2r( &core_dec_freq[112], &SWB_signal[368 + st_offset], 128 ); + mvr2r( &core_dec_freq[176], &SWB_signal[496 + st_offset], 64 ); + + /* calculate envelope */ + calc_norm_envelop( SWB_signal, envelope, L_swb_norm, SWB_flength, st_offset ); + + /* Normalize with envelope */ + for ( n_freq = swb_bwe_trans_subband[0] + st_offset; n_freq < swb_bwe_trans_subband[SWB_FENV_TRANS] + st_offset; n_freq++ ) + { + SWB_signal[n_freq] /= envelope[n_freq]; + } + + for ( n_band = 0; n_band < SWB_FENV_TRANS; n_band++ ) + { + energy = EPSILON; + for ( n_freq = swb_bwe_trans_subband[n_band] + st_offset; n_freq < swb_bwe_trans_subband[n_band + 1] + st_offset; n_freq++ ) + { + energy += SWB_signal[n_freq] * SWB_signal[n_freq]; + } + + tmp_ener = (float) ( sqrt( swb_bwe_trans_subband_width[n_band] / energy ) * SWB_fenv[n_band] ); + + for ( n_freq = swb_bwe_trans_subband[n_band] + st_offset; n_freq < swb_bwe_trans_subband[n_band + 1] + st_offset; n_freq++ ) + { + SWB_signal[n_freq] *= tmp_ener; + } + } + + for ( n_band = 0; n_band < 8; n_band++ ) + { + prev_SWB_fenv[n_band] = SWB_fenv[n_band / 4] * SWB_fenv[n_band / 4]; + } + + for ( n_band = 0; n_band < 6; n_band++ ) + { + prev_SWB_fenv[8 + n_band] = SWB_fenv[2 + n_band / 3] * SWB_fenv[2 + n_band / 3]; + } + + *prev_weight = 0.5f; + } + else + { + Energy = EPSILON; + for ( n_band = 0; n_band < SWB_FENV; n_band++ ) + { + Energy += SWB_fenv[n_band]; + } + Energy /= SWB_FENV; + if ( last_extl != SWB_BWE && last_extl != FB_BWE ) + { + if ( 16.0f * Energy < EnergyL && extl == FB_BWE ) + { + for ( n_band = 0; n_band < SWB_FENV; n_band++ ) + { + SWB_fenv[n_band] *= 0.2f; + } + fenvL *= 0.2f; + } + mvr2r( SWB_fenv, prev_SWB_fenv, SWB_FENV ); + } + if ( mode == HARMONIC ) + { + mvr2r( core_dec_freq, &SWB_signal[240 + st_offset], 240 ); + mvr2r( &core_dec_freq[128], &SWB_signal[480 + st_offset], 80 ); + + /* calculate envelope */ + calc_norm_envelop( SWB_signal, envelope, L_swb_norm, SWB_flength, st_offset ); + } + else + { + if ( mode == NOISE || ( ( Energy > EnergyL || ( tilt_nb > 7 && Energy > 0.5f * EnergyL ) || tilt_nb > 12 ) && Energy > 75 && fenvL > 25 ) ) + { + for ( n_freq = swb_bwe_subband[0] + st_offset; n_freq < swb_bwe_subband[SWB_FENV] + st_offset; n_freq++ ) + { + *Seed = (int16_t) ( 12345 * ( *Seed ) + 20101 ); + SWB_signal[n_freq] = ( *Seed ) / PCM16_TO_FLT_FAC; + } + if ( mode != NOISE ) + { + *frica_flag = 1; + } + } + else + { + /* modify SHB frequency envelopes when SHB spectrum is unflat */ + for ( n_band = 0; n_band < 13; n_band++ ) + { + if ( SWB_fenv[n_band] * 0.9f > SWB_fenv[n_band + 1] ) + { + SWB_fenv[n_band + 1] *= ( 0.8f + 0.015f * n_band ); + } + else if ( SWB_fenv[n_band + 1] * 0.9f > SWB_fenv[n_band] ) + { + SWB_fenv[n_band] *= ( 0.8f + 0.015f * n_band ); + } + } + + mvr2r( &core_dec_freq[112], &SWB_signal[240 + st_offset], 128 ); + mvr2r( &core_dec_freq[112], &SWB_signal[368 + st_offset], 128 ); + mvr2r( &core_dec_freq[176], &SWB_signal[496 + st_offset], 64 ); + + tmp1 = (float) ( fabs( SWB_signal[368 + st_offset] ) + fabs( SWB_signal[369 + st_offset] ) ) + EPSILON; + tmp2 = (float) ( fabs( SWB_signal[365 + st_offset] ) + fabs( SWB_signal[366 + st_offset] ) ) + EPSILON; + pit1 = &SWB_signal[368 + st_offset]; + + tmp3 = tmp2 / tmp1; + if ( tmp3 < 0.3 ) + { + tmp3 = 0.3f; + } + + while ( tmp3 < 1 ) + { + *pit1++ *= tmp3; + tmp3 += 0.1f; + } + + pit1 = &SWB_signal[367 + st_offset]; + tmp3 = tmp1 / tmp2; + + if ( tmp3 > 5 ) + { + tmp3 = 5; + while ( tmp3 > 1 ) + { + *pit1-- *= tmp3; + tmp3 -= 0.5f; + } + } + + tmp1 = (float) ( fabs( SWB_signal[496 + st_offset] ) + fabs( SWB_signal[497 + st_offset] ) ) + EPSILON; + tmp2 = (float) ( fabs( SWB_signal[492 + st_offset] ) + fabs( SWB_signal[493 + st_offset] ) + fabs( SWB_signal[494 + st_offset] ) + fabs( SWB_signal[495 + st_offset] ) ) + EPSILON; + pit1 = &SWB_signal[496 + st_offset]; + + tmp3 = tmp2 / tmp1; + if ( tmp3 < 0.3 ) + { + tmp3 = 0.3f; + } + + while ( tmp3 < 1 ) + { + *pit1++ *= tmp3; + tmp3 += 0.1f; + } + + pit1 = &SWB_signal[495 + st_offset]; + + tmp3 = tmp1 / tmp2; + tmp3 = 0.5f * tmp3; + tmp4 = 0.05f * tmp3; + + while ( tmp3 > 1 ) + { + *pit1-- *= tmp3; + tmp3 -= tmp4; + } + + /* calculate envelope */ + calc_norm_envelop( SWB_signal, envelope, L_swb_norm, SWB_flength, st_offset ); + } + } + + /* Normalize with envelope */ + if ( *frica_flag == 0 && mode != NOISE ) + { + L = swb_bwe_subband[0] + st_offset; + inv_L_swb_norm = 1.0f / L_swb_norm; + weight = ( mode != HARMONIC ) ? max( min( 3.0f * inv_L_swb_norm, 0.5f ), 0.2f ) : 0.2f; + weight = 0.4f * weight + 0.6f * ( *prev_weight ); + for ( n_freq = L; n_freq < swb_bwe_subband[SWB_FENV] + st_offset; n_freq++ ) + { + signum[n_freq] = 1; + if ( SWB_signal[n_freq] < 0 ) + { + signum[n_freq] = -1; + SWB_signal[n_freq] *= signum[n_freq]; + } + + SWB_signal[n_freq] = SWB_signal[n_freq] - envelope[n_freq] * inv_L_swb_norm; + if ( SWB_signal[n_freq] > 0 ) + { + SWB_signal[n_freq] *= ( 1.2f - weight ); + } + SWB_signal[n_freq] *= signum[n_freq]; + } + + for ( n_freq = L; n_freq < swb_bwe_subband[SWB_FENV] + st_offset; n_freq++ ) + { + SWB_signal[n_freq] /= envelope[n_freq]; + } + + *prev_weight = weight; + } + else + { + *prev_weight = max( min( 3.0f / L_swb_norm, 0.5f ), 0.2f ); + } + + if ( mode == HARMONIC ) + { + pit1 = &SWB_signal[swb_bwe_subband[0] + st_offset]; + for ( n_band = 0; n_band < 19; n_band++ ) + { + mean = 0; + for ( n_freq = 0; n_freq < 16; n_freq++ ) + { + mean += (float) fabs( *pit1 ); + pit1++; + } + mean /= 16; + pit1 -= 16; + for ( n_freq = 0; n_freq < 16; n_freq++ ) + { + if ( fabs( *pit1 ) < mean ) + { + *pit1 *= 0.2f; + } + pit1++; + } + } + } + + if ( mode == HARMONIC ) + { + L = 2; + } + else + { + L = 1; + } + + for ( n_band = 0; n_band < SWB_FENV; n_band += L ) + { + energy = EPSILON; + for ( n_freq = swb_bwe_subband[n_band] + st_offset; n_freq < swb_bwe_subband[n_band + L] + st_offset; n_freq++ ) + { + energy += SWB_signal[n_freq] * SWB_signal[n_freq]; + } + + tmp_ener = (float) sqrt( ( swb_bwe_subband[n_band + L] - swb_bwe_subband[n_band] ) / energy ); + + for ( n_freq = swb_bwe_subband[n_band] + st_offset; n_freq < swb_bwe_subband[n_band + L] + st_offset; n_freq++ ) + { + SWB_signal[n_freq] *= tmp_ener; + } + } + + if ( *prev_Energy > 1.25f * Energy && Energy > 0 ) + { + weight = 0.5f * Energy / ( *prev_Energy ); + } + else + { + weight = 0.5f; + } + + wfenv = weight * prev_SWB_fenv[0] + ( 1 - weight ) * SWB_fenv[0]; + factor = fenvL; + factor1 = ( wfenv - fenvL ) * 0.125f; + for ( n_freq = swb_bwe_subband[0] + st_offset; n_freq < swb_bwe_subband[0] + 8 + st_offset; n_freq++ ) + { + SWB_signal[n_freq] *= factor; + factor += factor1; + } + + for ( n_band = 0; n_band < 12; n_band++ ) + { + wfenv = weight * prev_SWB_fenv[n_band + 1] + ( 1 - weight ) * SWB_fenv[n_band + 1]; + factor = SWB_fenv[n_band]; + factor1 = ( wfenv - SWB_fenv[n_band] ) * smooth_factor[n_band]; + for ( ; n_freq < swb_bwe_sm_subband[n_band + 1] + st_offset; n_freq++ ) + { + SWB_signal[n_freq] *= factor; + factor += factor1; + } + } + + wfenv = weight * prev_SWB_fenv[13] + ( 1 - weight ) * SWB_fenv[13]; + factor = SWB_fenv[12]; + factor1 = ( wfenv - SWB_fenv[12] ) * smooth_factor[12]; + for ( ; n_freq < swb_bwe_sm_subband[13] + st_offset; n_freq++ ) + { + SWB_signal[n_freq] *= factor; + factor += factor1; + } + + for ( n_band = 13; n_band < SWB_FENV; n_band++ ) + { + wfenv = weight * prev_SWB_fenv[n_band] + ( 1 - weight ) * SWB_fenv[n_band]; + for ( ; n_freq < swb_bwe_subband[n_band + 1] + st_offset; n_freq++ ) + { + SWB_signal[n_freq] *= wfenv; + } + } + + for ( n_band = 0; n_band < SWB_FENV; n_band++ ) + { + prev_SWB_fenv[n_band] = SWB_fenv[n_band]; + } + } + + pit1 = &SWB_signal[240 + st_offset]; + for ( n_freq = 0; n_freq < 4; n_freq++ ) + { + *( pit1++ ) *= 0.5f; + } + *prev_Energy = Energy; + + return; +} + +/*-------------------------------------------------------------------* + * time_envelop_shaping() + * + * time shaping of the SHB signal + *-------------------------------------------------------------------*/ + +void time_envelop_shaping( + float werr[], /* i/o: SHB synthesis */ + float SWB_tenv[], /* i/o: frequency envelope */ + const int16_t L /* i : frame length */ +) +{ + float *pit; + float Energy; + int16_t i, j; + float tmp_ener; + + pit = werr; + for ( i = 0; i < SWB_TENV; i++ ) + { + Energy = EPSILON; + for ( j = 0; j < L / 4; j++ ) + { + Energy += *pit * *pit; + pit++; + } + Energy = (float) sqrt( 4 * Energy / L ); + + if ( SWB_tenv[i] < 2 && Energy < SWB_tenv[i] ) + { + SWB_tenv[i] = Energy; + } + + pit -= L / 4; + tmp_ener = 1.0f / Energy; + for ( j = 0; j < L / 4; j++ ) + { + *pit *= SWB_tenv[i] * tmp_ener; + pit++; + } + } + + return; +} + +/*-------------------------------------------------------------------* + * time_reduce_pre_echo() + * + * Pre-echo reduction. + *-------------------------------------------------------------------*/ + +void time_reduce_pre_echo( + const float *synth, /* i : ACELP core synthesis */ + float *error, /* o : SHB BWE synthesis */ + float prev_td_energy, /* o : last td energy */ + const int16_t L /* i : subframe length */ +) +{ + int16_t i, j, pos = 0; + float energy; + float energyL[4]; + float tmp_ener; + float *pit; + float tmpi; + + for ( i = 0; i < 4; i++ ) + { + energyL[i] = 0; + for ( j = 0; j < L; j++ ) + { + energyL[i] += synth[L * i + j] * synth[L * i + j]; + } + energyL[i] = (float) sqrt( energyL[i] / L ); + } + + for ( i = 0; i < 3; i++ ) + { + if ( energyL[i + 1] > 1.8f * energyL[i] && energyL[i + 1] > 50 ) + { + pos = i + 1; + break; + } + } + + if ( pos > 0 ) + { + if ( pos < 3 ) + { + pos++; + } + + energy = EPSILON; + j = L * pos; + for ( i = 0; i < j; i++ ) + { + energy += error[i] * error[i]; + } + energy = (float) sqrt( energy / j ); + + if ( prev_td_energy < 0.2f * energy ) + { + prev_td_energy = 0.2f * energy; + } + + tmp_ener = prev_td_energy / energy; + for ( i = 0; i < j; i++ ) + { + error[i] *= tmp_ener; + } + + energy = EPSILON; + for ( i = j; i < ( j + L ); i++ ) + { + energy += error[i] * error[i]; + } + energy = (float) sqrt( energy / L ); + + pit = &error[j]; + tmp_ener = prev_td_energy / energy; + for ( i = 0; i < L; i++ ) + { + tmpi = i / ( 1.0f * L ); + *pit++ *= ( ( 1.0f - tmpi ) * tmp_ener + tmpi ); + } + } + + return; +} + +/*-------------------------------------------------------------------* + * hq_generic_hf_decoding() + * + *-------------------------------------------------------------------*/ +void hq_generic_hf_decoding( + const int16_t HQ_mode, /* i : HQ mode */ + float *coeff_out1, /* i/o: BWE input & temporary buffer */ + const float *hq_generic_fenv, /* i : SWB frequency envelopes */ + float *coeff_out, /* o : SWB signal in MDCT domain */ + const int16_t hq_generic_offset, /* i : frequency offset for representing hq swb bwe*/ + int16_t *prev_L_swb_norm, /* i/o: last normalize length */ + const int16_t hq_generic_exc_clas, /* i : bwe excitation class */ + const int16_t *R ) +{ + int16_t i, n_freq, n_band, L_swb_norm; + float fenvL, energy, wfenv, factor; + float envelope[L_FRAME16k]; + float *pit1; + float tmp1, tmp2, tmp3, tmp4; + float mean_vector[20]; + int16_t k; + int16_t nenv; + int16_t tenv; + float rn_weight0; + int16_t blen, nband_lf, sfidx, efidx; + int16_t bwe_seed; + int16_t signum[L_FRAME16k]; + + if ( hq_generic_offset <= HQ_GENERIC_FOFFSET_24K4 ) + { + nenv = SWB_FENV; + } + else + { + nenv = SWB_FENV - 2; + } + + if ( HQ_mode == HQ_GEN_FB ) + { + tenv = nenv + DIM_FB; + } + else + { + tenv = nenv; + } + + fenvL = EPSILON; + for ( n_freq = HQ_GENERIC_ST_FREQ + hq_generic_offset; n_freq < swb_bwe_subband[0] + hq_generic_offset; n_freq++ ) + { + fenvL += coeff_out1[n_freq] * coeff_out1[n_freq]; + } + + fenvL = (float) sqrt( fenvL / 16 ); + + calc_normal_length( HQ_CORE, coeff_out1, HQ_GEN_SWB, -1, &L_swb_norm, prev_L_swb_norm ); + + /* calculate envelope */ + calc_norm_envelop_lf( coeff_out1, envelope, &L_swb_norm, HQ_mode, hq_generic_offset, &sfidx, &efidx ); + + blen = 16; + if ( hq_generic_exc_clas == HQ_GENERIC_EXC0 ) + { + rn_weight0 = 0.8f; + } + else if ( hq_generic_exc_clas == HQ_GENERIC_EXC1 ) + { + rn_weight0 = 0.05f; + } + else + { + rn_weight0 = 0.2f; + } + + nband_lf = ( efidx - sfidx ) / blen; + for ( n_freq = sfidx; n_freq < efidx; n_freq++ ) + { + if ( coeff_out1[n_freq] < 0 ) + { + signum[n_freq] = -1; + coeff_out1[n_freq] *= signum[n_freq]; + } + else + { + signum[n_freq] = 1; + } + } + + /* applying whitening */ + for ( n_freq = sfidx; n_freq < efidx; n_freq++ ) + { + coeff_out1[n_freq] = coeff_out1[n_freq] / envelope[n_freq]; + } + + /* mean vector generation for controlling dynamic range */ + for ( k = 0; k < nband_lf; ++k ) + { + energy = EPSILON; + for ( i = k * blen + sfidx; i < ( k + 1 ) * blen + sfidx; ++i ) + { + energy += coeff_out1[i]; + } + mean_vector[k] = energy / blen; + } + + /* dynamic range control */ + for ( k = 0; k < nband_lf; ++k ) + { + for ( i = k * blen + sfidx; i < ( k + 1 ) * blen + sfidx; ++i ) + { + coeff_out1[i] = coeff_out1[i] - ( coeff_out1[i] - mean_vector[k] ) * rn_weight0; + } + } + + if ( hq_generic_exc_clas == HQ_GENERIC_EXC0 ) + { + /* applying random sign */ + bwe_seed = R[0] * 8 + R[1] * 4 + R[2] * 2 + R[3]; + for ( n_freq = sfidx; n_freq < efidx; n_freq++ ) + { + coeff_out1[n_freq] = coeff_out1[n_freq] * signum[n_freq] * ( own_random( &bwe_seed ) > 0 ? 1.0f : -1.0f ); + } + } + else + { + for ( n_freq = sfidx; n_freq < efidx; n_freq++ ) + { + coeff_out1[n_freq] = coeff_out1[n_freq] * signum[n_freq]; + } + } + + /* normalizing modified low frequency spectrum */ + for ( k = 0; k < nband_lf; ++k ) + { + energy = EPSILON; + for ( i = k * blen + sfidx; i < ( k + 1 ) * blen + sfidx; ++i ) + { + energy += coeff_out1[i] * coeff_out1[i]; + } + energy = (float) sqrt( energy / blen ); + + for ( i = k * blen + sfidx; i < ( k + 1 ) * blen + sfidx; ++i ) + { + coeff_out1[i] /= energy; + } + } + mvr2r( coeff_out1 + HQ_GENERIC_OFFSET, &coeff_out[HQ_GENERIC_HIGH0 + hq_generic_offset], HQ_GENERIC_LEN0 ); + mvr2r( coeff_out1 + HQ_GENERIC_OFFSET, &coeff_out[HQ_GENERIC_HIGH1 + hq_generic_offset], HQ_GENERIC_LEN0 ); + + if ( hq_generic_offset <= HQ_GENERIC_FOFFSET_24K4 ) + { + mvr2r( &coeff_out1[HQ_GENERIC_LOW0], &coeff_out[HQ_GENERIC_HIGH2 + hq_generic_offset], HQ_GENERIC_END_FREQ - HQ_GENERIC_HIGH2 ); + } + + if ( HQ_mode == HQ_GEN_FB ) + { + if ( hq_generic_offset <= HQ_GENERIC_FOFFSET_24K4 ) + { + mvr2r( coeff_out1 + HQ_GENERIC_LOW0 + HQ_GENERIC_END_FREQ - HQ_GENERIC_HIGH2, &coeff_out[fb_bwe_subband[0]], 160 ); + } + else + { + mvr2r( coeff_out1 + HQ_GENERIC_OFFSET + HQ_GENERIC_LEN0, &coeff_out[fb_bwe_subband[0]], 160 ); + } + } + tmp1 = EPSILON; + tmp2 = EPSILON; + for ( i = 0; i < 5; ++i ) + { + tmp1 += (float) fabs( coeff_out[HQ_GENERIC_HIGH1 + hq_generic_offset + i] ); + tmp2 += (float) fabs( coeff_out[HQ_GENERIC_HIGH1 - 2 + hq_generic_offset - i] ); + } + + pit1 = &coeff_out[HQ_GENERIC_HIGH1 + hq_generic_offset]; + tmp3 = tmp2 / tmp1; + if ( tmp3 < 0.3f ) + { + tmp3 = 0.3f; + } + + while ( tmp3 < 1 ) + { + *pit1++ *= tmp3; + tmp3 += 0.1f; + } + + pit1 = &coeff_out[HQ_GENERIC_HIGH1 - 1 + hq_generic_offset]; + tmp3 = tmp1 / tmp2; + if ( tmp3 > 5 ) + { + tmp3 = 5; + while ( tmp3 > 1 ) + { + *pit1-- *= tmp3; + tmp3 -= 0.5f; + } + } + + if ( hq_generic_offset <= HQ_GENERIC_FOFFSET_24K4 ) + { + tmp1 = (float) ( fabs( coeff_out[HQ_GENERIC_HIGH2 + hq_generic_offset] ) + fabs( coeff_out[HQ_GENERIC_HIGH2 + 1 + hq_generic_offset] ) ) + EPSILON; + tmp2 = (float) ( fabs( coeff_out[HQ_GENERIC_HIGH2 - 4 + hq_generic_offset] ) + fabs( coeff_out[HQ_GENERIC_HIGH2 - 3 + hq_generic_offset] ) + fabs( coeff_out[HQ_GENERIC_HIGH2 - 2 + hq_generic_offset] ) + fabs( coeff_out[HQ_GENERIC_HIGH2 - 1 + hq_generic_offset] ) ) + + EPSILON; + + pit1 = &coeff_out[HQ_GENERIC_HIGH2 + hq_generic_offset]; + tmp3 = tmp2 / tmp1; + if ( tmp3 < 0.3f ) + { + tmp3 = 0.3f; + } + + while ( tmp3 < 1 ) + { + *pit1++ *= tmp3; + tmp3 += 0.1f; + } + + pit1 = &coeff_out[HQ_GENERIC_HIGH2 - 1 + hq_generic_offset]; + tmp3 = tmp1 / tmp2; + tmp3 = 0.5f * tmp3; + tmp4 = 0.05f * tmp3; + while ( tmp3 > 1 ) + { + *pit1-- *= tmp3; + tmp3 -= tmp4; + } + } + + wfenv = hq_generic_fenv[0]; + for ( n_freq = swb_bwe_subband[0] + hq_generic_offset, i = 0; n_freq < swb_bwe_subband[0] + hq_generic_offset + 8; n_freq++, i++ ) + { + factor = i * 0.125f; + coeff_out[n_freq] *= ( ( 1 - factor ) * fenvL + factor * wfenv ); + } + + for ( n_band = 0; n_band < nenv - 2; n_band++ ) + { + wfenv = hq_generic_fenv[n_band + 1]; + for ( i = 0; n_freq < swb_bwe_sm_subband[n_band + 1] + hq_generic_offset; n_freq++, i++ ) + { + factor = i * smooth_factor[n_band]; + coeff_out[n_freq] *= ( ( 1 - factor ) * hq_generic_fenv[n_band] + factor * wfenv ); + } + } + + wfenv = hq_generic_fenv[nenv - 1]; + for ( i = 0; n_freq < swb_bwe_sm_subband[nenv - 1] + hq_generic_offset; n_freq++, i++ ) + { + factor = i * smooth_factor[nenv - 2]; + + coeff_out[n_freq] *= ( ( 1 - factor ) * hq_generic_fenv[nenv - 2] + factor * wfenv ); + } + + if ( HQ_mode == HQ_GEN_SWB ) + { + for ( n_band = nenv - 1; n_band < nenv; ++n_band ) + { + wfenv = hq_generic_fenv[n_band]; + for ( ; n_freq < swb_bwe_subband[n_band + 1] + hq_generic_offset; n_freq++ ) + { + coeff_out[n_freq] *= wfenv; + } + } + } + else + { + if ( hq_generic_fenv[nenv - 1] - hq_generic_fenv[nenv] > 15.f || hq_generic_fenv[nenv] < 5.f ) + { + wfenv = hq_generic_fenv[nenv - 1]; + for ( i = 0; n_freq < fb_bwe_subband[0]; n_freq++, i++ ) + { + coeff_out[n_freq] *= wfenv; + } + + for ( n_band = 0; n_band < DIM_FB; n_band++ ) + { + wfenv = hq_generic_fenv[n_band + nenv]; + for ( i = 0; n_freq < fb_bwe_subband[n_band + 1]; n_freq++, i++ ) + { + coeff_out[n_freq] *= wfenv; + } + } + } + else + { + for ( n_band = 0; n_band < DIM_FB; n_band++ ) + { + wfenv = hq_generic_fenv[n_band + nenv - 1]; + + for ( i = 0; n_freq < fb_bwe_sm_subband[n_band]; n_freq++, i++ ) + { + factor = i * fb_smooth_factor[n_band]; + coeff_out[n_freq] *= ( ( 1 - factor ) * hq_generic_fenv[n_band + nenv] + factor * wfenv ); + } + } + + wfenv = hq_generic_fenv[tenv - 1]; + + for ( ; n_freq < fb_bwe_subband[DIM_FB]; n_freq++ ) + { + coeff_out[n_freq] *= wfenv; + } + } + } + return; +} + + +/*-------------------------------------------------------------------* + * save_old_syn() + * + * Save and delay the ACELP core synthesis signal by + * DELAY_FD_BWE_ENC_xxkx to be used by SWB BWE + *-------------------------------------------------------------------*/ + +void save_old_syn( + const int16_t L_frame, /* i : frame length */ + const float syn[], /* i : ACELP synthesis */ + float old_syn[], /* o : old synthesis buffer */ + float old_syn_mem[], /* i/o: old synthesis buffer memory */ + const float preemph_fac, /* i : preemphasis factor */ + float *mem_deemph /* i/o: deemphasis filter memory */ +) +{ + int16_t tmps; + + if ( L_frame == L_FRAME ) + { + tmps = NS2SA( 12800, DELAY_FD_BWE_ENC_12k8_NS ); + } + else + { + tmps = NS2SA( 16000, DELAY_FD_BWE_ENC_16k_NS ); + } + + mvr2r( old_syn_mem, old_syn, tmps ); + mvr2r( syn, old_syn + tmps, L_frame - tmps ); + mvr2r( syn + L_frame - tmps, old_syn_mem, tmps ); + + deemph( old_syn, preemph_fac, L_frame, mem_deemph ); + + return; +} diff --git a/lib_com/swb_bwe_com_hr.c b/lib_com/swb_bwe_com_hr.c new file mode 100644 index 0000000000000000000000000000000000000000..937660f234421fff30db87749558b61b0980e555 --- /dev/null +++ b/lib_com/swb_bwe_com_hr.c @@ -0,0 +1,320 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * swb_hr_nonzero_subband_noise_fill() + * + * SWB BWE HR noise filling of zero subbands + *-------------------------------------------------------------------*/ + +static void swb_hr_nonzero_subband_noise_fill( + const float tilt_wb, /* i : tilt of wideband signal */ + float *t_audio, /* i/o: mdct spectrum */ + int16_t *bwe_highrate_seed, /* i/o: seed of random noise */ + const int16_t N, /* i : length of subband */ + const int16_t Nsv /* i : number of subband */ +) +{ + int16_t i, j; + float *ptr; + float min_bwe, max_bwe, tmpF; + + if ( tilt_wb > 5.0f ) + { + for ( i = 0; i < Nsv; i++ ) + { + min_bwe = FLT_MAX; + max_bwe = FLT_MIN; + for ( j = 0; j < N; j++ ) + { + tmpF = (float) fabs( t_audio[i * N + j] ); + + if ( tmpF > 0 ) + { + min_bwe = min( tmpF, min_bwe ); + max_bwe = max( tmpF, max_bwe ); + } + } + + if ( max_bwe == min_bwe && min_bwe > 1.0f ) + { + min_bwe *= 0.5f; + } + + ptr = &t_audio[i * N]; + for ( j = 0; j < N; j++ ) + { + if ( *ptr == 0 ) + { + if ( own_random( bwe_highrate_seed ) > 0 ) + { + *ptr = 0.5f * min_bwe; + } + else + { + *ptr = -0.5f * min_bwe; + } + } + ptr++; + } + } + } + + return; +} + +/*-------------------------------------------------------------------* + * swb_hr_noise_fill() + * + * SWB BWE HR noise filling + *-------------------------------------------------------------------*/ + +void swb_hr_noise_fill( + const int16_t is_transient, /* i : transient flag */ + const int16_t spect_start, /* i : spectrum start point */ + const int16_t spect_end, /* i : spectrum end point */ + const float tilt_wb, /* i : tilt of wideband signal */ + const float pitch, /* i : pitch value */ + const int16_t nq[], /* i : AVQ nq index */ + int16_t Nsv, /* i : number of subband */ + int16_t *bwe_highrate_seed, /* i/o: seed of random noise */ + float *t_audio /* i/o: mdct spectrum */ +) +{ + int16_t i, j, k; + float alpha, beta; + int16_t pos_start, pos_end, incr; + + if ( is_transient ) + { + for ( i = 0; i < Nsv; i++ ) + { + if ( nq[i] == 0 ) + { + for ( j = 0; j < WIDTH_BAND; j++ ) + { + t_audio[i * WIDTH_BAND + j] = own_random( bwe_highrate_seed ) / 65536.0f; + } + } + } + } + else + { + Nsv = ( spect_end - spect_start ) / WIDTH_BAND; + alpha = 0.25f; + if ( tilt_wb > 5.0f ) + { + beta = 0.25f; + } + else + { + if ( 100 > 0.25f * pitch ) + { + beta = 0.25f; + } + else + { + beta = 100 / pitch; + } + } + + i = 0; + if ( nq[i] == 0 ) + { + i = 1; + while ( i < Nsv && nq[i] == 0 ) + { + i++; + } + + pos_start = i; + + + while ( i < Nsv && nq[i] != 0 ) + { + i++; + } + + pos_end = i - 1; + + if ( pos_end - pos_start > pos_start ) + { + pos_end = 2 * pos_start - 1; + } + + incr = pos_end; + + for ( j = pos_start - 1; j >= 0; j-- ) + { + for ( k = 0; k < WIDTH_BAND; k++ ) + { + t_audio[j * WIDTH_BAND + k] = alpha * t_audio[incr * WIDTH_BAND + k] + beta * own_random( bwe_highrate_seed ) / PCM16_TO_FLT_FAC; + } + + incr = ( incr < pos_start ) ? pos_end : incr - 1; + } + } + + while ( i < Nsv ) + { + if ( nq[i] == 0 ) + { + pos_start = i; + pos_end = i; + + for ( j = pos_start; j < Nsv; j++ ) + { + if ( nq[j] != 0 ) + { + i = j; + pos_end = j; + break; + } + } + + if ( pos_start == pos_end ) + { + i = Nsv; + pos_end = Nsv; + } + + incr = ( pos_start - 1 ); + + for ( j = pos_end - 1; j >= pos_start; j-- ) + { + for ( k = 0; k < WIDTH_BAND; k++ ) + { + t_audio[j * WIDTH_BAND + k] = alpha * t_audio[incr * WIDTH_BAND + k] + beta * own_random( bwe_highrate_seed ) / PCM16_TO_FLT_FAC; + } + incr = ( incr == 0 ) ? ( pos_start - 1 ) : incr - 1; + } + } + else + { + i++; + } + } + } + + swb_hr_nonzero_subband_noise_fill( tilt_wb, t_audio, bwe_highrate_seed, WIDTH_BAND, Nsv ); + + return; +} + + +/*-------------------------------------------------------------------* + * td_postprocess() + * + * post processing in time domain for td/fd switching + *-------------------------------------------------------------------*/ + +/*! r: gain */ +float td_postprocess( + float hb_synth[], /* i/o: high-band synthesis */ + const int16_t input_frame, /* i : frame length */ + const int16_t last_extl /* i : last extension layer */ +) +{ + int16_t i; + int16_t pos, ind1, ind2; + float max_samp, gain, tmpF; + float alpha, beta, step; + + max_samp = (float) fabs( hb_synth[0] ); + pos = 0; + for ( i = 1; i < input_frame; i++ ) + { + if ( fabs( hb_synth[i] ) > max_samp ) + { + max_samp = (float) fabs( hb_synth[i] ); + pos = i; + } + } + + if ( pos < 160 ) + { + gain = sum2_f( hb_synth + input_frame - 80, 80 ) + EPSILON; + } + else + { + gain = sum2_f( hb_synth, 80 ) + EPSILON; + } + + gain = (float) sqrt( gain / 80 ); + + ind1 = max( 0, pos - 40 ); + ind2 = min( input_frame, pos + 40 ); + tmpF = sum2_f( hb_synth + ind1, ind2 - ind1 ) + EPSILON; + tmpF = (float) sqrt( tmpF / ( ind2 - ind1 ) ); + + gain = min( 1.0f, gain / tmpF ); + + if ( last_extl == SWB_BWE || last_extl == FB_BWE ) + { + for ( i = ind1; i < input_frame; i++ ) + { + hb_synth[i] *= gain; + } + } + else + { + for ( i = ind1; i < ind2; i++ ) + { + hb_synth[i] *= gain; + } + + if ( ind2 != input_frame ) + { + step = 0.0f; + alpha = ( gain > 0.5f ) ? 1.0f : 0.5f; + beta = ( alpha - gain ) / ( input_frame - ind2 ); + + for ( i = ind2; i < input_frame; i++ ) + { + hb_synth[i] *= ( gain + step ); + step += beta; + } + } + } + + return ( gain ); +} diff --git a/lib_com/swb_bwe_com_lr.c b/lib_com/swb_bwe_com_lr.c new file mode 100644 index 0000000000000000000000000000000000000000..ef3af7ae33e904184b4ad7d230a5bbf64832a7b6 --- /dev/null +++ b/lib_com/swb_bwe_com_lr.c @@ -0,0 +1,2110 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * hf_parinitiz() + * + * + *-------------------------------------------------------------------*/ + +void hf_parinitiz( + const int32_t total_brate, + const int16_t hqswb_clas, + int16_t lowlength, + int16_t highlength, + int16_t wBands[], + const int16_t **subband_search_offset, + const int16_t **subband_offsets, + int16_t *nBands, + int16_t *nBands_search, + int16_t *swb_lowband, + int16_t *swb_highband ) +{ + *swb_lowband = lowlength; + *swb_highband = highlength; + + if ( hqswb_clas == HQ_HARMONIC ) + { + /* Mode dependent initializations (performed every frame in case mode-switching implemented) */ + *nBands = NB_SWB_SUBBANDS_HAR; + *nBands_search = NB_SWB_SUBBANDS_HAR_SEARCH_SB; + + if ( total_brate == HQ_13k20 ) + { + wBands[0] = SWB_SB_BW_LEN0_12KBPS_HAR; + wBands[1] = SWB_SB_BW_LEN1_12KBPS_HAR; + wBands[2] = SWB_SB_BW_LEN2_12KBPS_HAR; + wBands[3] = SWB_SB_BW_LEN3_12KBPS_HAR; + *subband_offsets = subband_offsets_sub5_13p2kbps_Har; + *subband_search_offset = subband_search_offsets_13p2kbps_Har; + } + else + { + wBands[0] = SWB_SB_BW_LEN0_16KBPS_HAR; + wBands[1] = SWB_SB_BW_LEN1_16KBPS_HAR; + wBands[2] = SWB_SB_BW_LEN2_16KBPS_HAR; + wBands[3] = SWB_SB_BW_LEN3_16KBPS_HAR; + *subband_offsets = subband_offsets_sub5_16p4kbps_Har; + *subband_search_offset = subband_search_offsets_16p4kbps_Har; + } + } + else + { + /* Mode-dependent initializations (performed every frame in case mode-switching implemented) */ + *nBands = NB_SWB_SUBBANDS; + *nBands_search = NB_SWB_SUBBANDS; + + if ( total_brate == HQ_13k20 ) + { + wBands[0] = SWB_SB_LEN0_12KBPS; + wBands[1] = SWB_SB_LEN1_12KBPS; + wBands[2] = SWB_SB_LEN2_12KBPS; + wBands[3] = SWB_SB_LEN3_12KBPS; + *subband_offsets = subband_offsets_12KBPS; + } + else + { + wBands[0] = SWB_SB_LEN0_16KBPS; + wBands[1] = SWB_SB_LEN1_16KBPS; + wBands[2] = SWB_SB_LEN2_16KBPS; + wBands[3] = SWB_SB_LEN3_16KBPS; + *subband_offsets = subband_offsets_16KBPS; + } + } + return; +} + +/*-------------------------------------------------------------------* + * GetPredictedSignal() + * + * Routine for calculating the predicted signal + *-------------------------------------------------------------------*/ +void GetPredictedSignal( + const float *predBuf, /* i : prediction buffer */ + float *outBuf, /* o : output buffer */ + const int16_t lag, /* i : prediction buffer offset */ + const int16_t fLen, /* i : length of loop (output) */ + const float gain /* i : gain to be applied */ +) +{ + int16_t i; + + predBuf += lag; + + for ( i = 0; i < fLen; i++ ) + { + *outBuf++ = *predBuf++ * gain; + } + + return; +} +/*-------------------------------------------------------------------* + * est_freq_har_decis() + * + * Harmonic frequency decision matrix + *-------------------------------------------------------------------*/ + +static void est_freq_har_decis( + int16_t *har_freq_est1, /* o : harmonic analysis 1*/ + int16_t *har_freq_est2, /* o : harmonic analysis 2*/ + int16_t sharp, /* i : pka-avg for group 1 */ + int16_t sharp1, /* i : pka-avg for group 2 */ + int16_t hfe_est_countk1, /* i : group pks count 1*/ + int16_t hfe_est_countk2, /* i : group pks count 2*/ + int16_t k, /* i : group count */ + int16_t k1, + int16_t k2, + int16_t *prev_frm_hfe2 /* i : harmonic estimation */ +) +{ + int16_t temp_hfe2 = 0; + + if ( k != 0 ) + { + *har_freq_est1 = (int16_t) sharp / k; + } + if ( k1 > 1 ) + { + *har_freq_est2 = (int16_t) sharp1 / k1; + } + else if ( ( k1 < 2 && ( k2 != 0 || k > 1 ) ) ) + { + *har_freq_est2 = *har_freq_est1; + } + else + { + if ( ( hfe_est_countk1 != 0 || hfe_est_countk2 != 0 ) && ( k1 == 0 && k2 == 0 ) ) + { + *har_freq_est2 = ( *har_freq_est1 ); + } + else + { + *har_freq_est2 = 2 * ( *har_freq_est1 ); + } + } + + /* Consider Estimation Error upto 200Hz */ + if ( *prev_frm_hfe2 != 0 && ( (int16_t) abs( *prev_frm_hfe2 - *har_freq_est2 ) < 10 || abs( *prev_frm_hfe2 - 2 * ( *har_freq_est2 ) ) < 10 ) ) + { + *har_freq_est2 = *prev_frm_hfe2; + } + else if ( *prev_frm_hfe2 != 0 && abs( *har_freq_est2 - 2 * ( *prev_frm_hfe2 ) ) < 10 ) + { + *har_freq_est2 = 2 * ( *prev_frm_hfe2 ); + } + else + { + temp_hfe2 = (int16_t) ( *prev_frm_hfe2 + *har_freq_est2 ) / 2; + + if ( abs( temp_hfe2 - *prev_frm_hfe2 ) < 2 ) + { + temp_hfe2 = *prev_frm_hfe2; + *har_freq_est2 = temp_hfe2; + } + } + if ( *har_freq_est2 < *har_freq_est1 && ( k > 1 && k1 < 2 ) ) + { + *har_freq_est2 = *har_freq_est1; + } + return; +} + +/*--------------------------------------------------------------------------* + * har_est() + * + * Harmonic Structure analysis using LF spectrum + *--------------------------------------------------------------------------*/ + +int16_t har_est( + float spectra[], /* i : coded spectrum */ + const int16_t N, /* i : length of the desired spectrum */ + int16_t *har_freq_est1, /* i/o: Estimation harmonics 1 */ + int16_t *har_freq_est2, /* o : Estimation harmonics 2 */ + int16_t *flag_dis, /* i/o: flag for BWE reconstruction */ + int16_t *prev_frm_hfe2, /* i/o: Estimated harmonic update */ + const int16_t subband_search_offset[], /* i : Subband Search range */ + const int16_t sbWidth[], /* i : Subband Search range */ + int16_t *prev_stab_hfe2 /* i/o: Estimated harmonic position */ +) +{ + float peak; + int16_t i, j, q, k, k1, k2; + float input_abs[L_FRAME32k], blk_peak[30]; + int16_t blk_end, blk_st; + int16_t peak_pos, blk_peak_pos[30], diff_peak_pos[30], sharp, sharp1; + int16_t min_har_pos; + int16_t blk_peak_pos_te[30]; + float blk_peak_te[30]; + int16_t temp; + int16_t hfe_est_countk, hfe_est_countk1, hfe_est_countk2; + int16_t r1, r2, r3; + int16_t start_pos; + float blk_peak_max; + int16_t blk_peak_pos_max; + int16_t nlags, ct_hfsb2, sum_diff = 0; + int16_t blk_peak_pos_hfsb2[30], diff_peak_pos_hfsb2[30]; + int16_t rem_hfe2, q_diffpos_hfe2 = 0, diff_posmax_hfe2, q_diffpos_prevhfe2; + int16_t blk_peak_max_idx, blk_peak_pos_max_diff, diff_peak_pos_te[30]; + + rem_hfe2 = 0; + q_diffpos_hfe2 = 0; + diff_posmax_hfe2 = 0; + q_diffpos_prevhfe2 = 0; + + set_s( blk_peak_pos_te, 0, 30 ); + set_s( diff_peak_pos, 0, 30 ); + + r1 = SWB_HAR_RAN1; + r2 = SWB_HAR_RAN2; + r3 = SWB_HAR_RAN3; + start_pos = r1; + + /* Copy the abs values of LF spectrum*/ + for ( i = start_pos; i < N; i++ ) + { + input_abs[i] = (float) fabs( spectra[i] ); + } + + blk_end = (int16_t) N / LR_BLK_LEN; + blk_st = (int16_t) start_pos / LR_BLK_LEN; + + if ( (float) N / (LR_BLK_LEN) -blk_end > 0.0f ) + { + blk_end++; + } + + /* initialization of over buffer for fractional point */ + for ( i = N; i < ( blk_end * LR_BLK_LEN ); i++ ) + { + input_abs[i] = 0.0f; + } + + q = start_pos; + + /* Block Processing, to detect the spectral peaks*/ + for ( i = blk_st; i < blk_end; i++ ) + { + peak = 0.0f; + peak_pos = 0; + + for ( j = 0; j < LR_BLK_LEN; j++, q++ ) + { + if ( input_abs[q] > peak ) + { + peak = input_abs[q]; + peak_pos = q; + } + + if ( i > blk_st && input_abs[q] != 0 && input_abs[q] == peak && ( peak_pos - blk_peak_pos[i - 1] ) < LR_HLF_PK_BLK_LEN ) + { + peak = input_abs[q]; + peak_pos = q; + } + } + + blk_peak[i] = peak; + blk_peak_pos[i] = peak_pos; + } + + for ( i = blk_st; i < blk_end; i++ ) + { + if ( i > blk_st ) + { + if ( blk_peak_pos[i] != 0 && blk_peak_pos[i - 1] != 0 ) + { + if ( ( blk_peak_pos[i] - blk_peak_pos[i - 1] ) < LR_LOWBAND_DIF_PK_LEN ) + { + if ( blk_peak[i] > blk_peak[i - 1] ) + { + blk_peak[i - 1] = 0.0f; + blk_peak_pos[i - 1] = 0; + } + else + { + blk_peak[i] = blk_peak[i - 1]; + blk_peak_pos[i] = blk_peak_pos[i - 1]; + blk_peak[i - 1] = 0.0f; + blk_peak_pos[i - 1] = 0; + } + } + } + } + } + + /* peak counts in each group */ + j = 0; + hfe_est_countk = 0; + hfe_est_countk1 = 0; + hfe_est_countk2 = 0; + for ( i = blk_st; i < blk_end; i++ ) + { + if ( blk_peak_pos[i] != 0 ) + { + blk_peak_pos_te[j] = blk_peak_pos[i]; + if ( blk_peak_pos[i] < r2 ) + { + hfe_est_countk++; + } + else if ( blk_peak_pos[i] < r3 ) + { + hfe_est_countk1++; + } + else + { + hfe_est_countk2++; + } + + blk_peak_te[j] = blk_peak[i]; + j++; + } + } + + min_har_pos = SWB_HAR_RAN1; + temp = 0; + blk_peak_max = blk_peak_te[0]; + blk_peak_pos_max = blk_peak_pos_te[0]; + blk_peak_max_idx = 0; + for ( i = 1; i < j; i++ ) + { + diff_peak_pos[i - 1] = blk_peak_pos_te[i] - blk_peak_pos_te[i - 1]; + if ( diff_peak_pos[i - 1] <= min_har_pos ) + { + min_har_pos = diff_peak_pos[i - 1]; + } + + if ( blk_peak_te[i - 1] > blk_peak_max ) + { + blk_peak_max = blk_peak_te[i - 1]; + blk_peak_pos_max = blk_peak_pos_te[i - 1]; + blk_peak_max_idx = i - 1; + } + + temp++; + } + blk_peak_pos_max_diff = diff_peak_pos[blk_peak_max_idx]; + + /* Decision for BWE reconstruction */ + if ( ( hfe_est_countk < 2 && hfe_est_countk1 < 2 && hfe_est_countk2 < 2 ) || min_har_pos >= SWB_HAR_RAN1 ) + { + *flag_dis = 0; + if ( ( hfe_est_countk == 1 && hfe_est_countk1 == 1 ) && ( hfe_est_countk2 == 1 || hfe_est_countk2 == 0 ) ) + { + *flag_dis = 1; + } + } + for ( i = 0; i < temp; i++ ) + { + if ( blk_peak_pos_max_diff + LR_LOWBAND_DIF_PK_LEN < diff_peak_pos[i] ) + { + diff_peak_pos[i] = 0; + } + } + mvs2s( diff_peak_pos, diff_peak_pos_te, temp ); + set_s( diff_peak_pos, -1, temp ); + j = 0; + for ( i = 0; i < temp; i++ ) + { + if ( diff_peak_pos_te[i] != 0 ) + { + diff_peak_pos[j] = diff_peak_pos_te[i]; + j++; + } + } + temp = j; + /* harmonic estimation analysis to perform BWE Reconstruction */ + if ( *flag_dis ) + { + sharp = 0; + k = 0; + k1 = 0; + sharp1 = 0; + k2 = 0; + + for ( i = 0, q = 1; i < temp; i++, q++ ) + { + if ( ( diff_peak_pos[i] <= ( min_har_pos + LR_LOWBAND_DIF_PK_LEN ) ) && diff_peak_pos[i] > 0 ) + { + sharp += diff_peak_pos[i]; + k++; + } + else if ( ( diff_peak_pos[i] <= ( min_har_pos + 2 * LR_LOWBAND_DIF_PK_LEN ) ) && diff_peak_pos[i] > 0 ) + { + sharp1 += diff_peak_pos[i]; + k1++; + } + else if ( diff_peak_pos[i] > 0 ) + { + k2++; + } + } + + est_freq_har_decis( har_freq_est1, har_freq_est2, sharp, sharp1, hfe_est_countk1, hfe_est_countk2, k, k1, k2, prev_frm_hfe2 ); + + blk_peak_pos_max = blk_peak_pos_te[temp - 1]; + + if ( ( *prev_stab_hfe2 ) > 0 && ( *prev_frm_hfe2 ) > 0 && *prev_stab_hfe2 < N ) + { + rem_hfe2 = *har_freq_est2 % ( *prev_frm_hfe2 ); + diff_posmax_hfe2 = (int16_t) abs( blk_peak_pos_max - *prev_stab_hfe2 ); + if ( rem_hfe2 == 0 ) + { + if ( diff_posmax_hfe2 < 9 || *har_freq_est2 == 0 ) + { + blk_peak_pos_max = *prev_stab_hfe2; + } + else + { + q_diffpos_hfe2 = diff_posmax_hfe2 / ( *har_freq_est2 ); + q_diffpos_prevhfe2 = diff_posmax_hfe2 / ( *prev_frm_hfe2 ); + if ( q_diffpos_hfe2 < 10 || q_diffpos_prevhfe2 < 10 ) + { + blk_peak_pos_max = *prev_stab_hfe2; + } + else + { + *prev_stab_hfe2 = blk_peak_pos_max; + } + } + } + else + { + *prev_stab_hfe2 = blk_peak_pos_max; + } + } + else + { + *prev_stab_hfe2 = blk_peak_pos_max; + } + + if ( *har_freq_est1 == 0 || *har_freq_est2 == 0 ) + { + *flag_dis = 0; + } + } + + if ( *flag_dis == 0 ) + { + if ( *prev_frm_hfe2 != 0 ) + { + *har_freq_est2 = *prev_frm_hfe2; + } + else + { + nlags = (int16_t) pow( 2, bits_lagIndices_mode0_Har[0] ); + ct_hfsb2 = 0; + for ( i = 0; i < j; i++ ) + { + if ( blk_peak_pos_te[i] >= ( subband_search_offset[0] - nlags / 2 ) && blk_peak_pos_te[i] < ( subband_search_offset[0] + sbWidth[0] + nlags / 2 ) ) + { + blk_peak_pos_hfsb2[ct_hfsb2] = blk_peak_pos_te[i]; + ct_hfsb2++; + } + } + + if ( ct_hfsb2 > 1 ) + { + for ( i = 1; i < ct_hfsb2; i++ ) + { + diff_peak_pos_hfsb2[i - 1] = blk_peak_pos_hfsb2[i] - blk_peak_pos_hfsb2[i - 1]; + sum_diff += diff_peak_pos_hfsb2[i - 1]; + } + *har_freq_est2 = sum_diff / ct_hfsb2; + } + else + { + *har_freq_est2 = min_har_pos; + } + } + } + + + return blk_peak_pos_max; +} + + +/*-------------------------------------------------------------------* + * genhf_noise() + * + * + *-------------------------------------------------------------------*/ + +void genhf_noise( + float noise_flr[], /* i : smoothed non tonal */ + float xSynth_har[], /* o : hf non tonal components */ + float *predBuf, /* i : smoothed tonal compone */ + int16_t bands, /* i : total number of subbands in a frame */ + int16_t harmonic_band, /* i : Number of LF harmonic frames */ + int16_t har_freq_est2, /* i : harmonic signal parameter */ + int16_t pos_max_hfe2, /* i : last pulse in core coder */ + int16_t *pul_res, /* o : pulse resolution */ + GainItem pk_sf[], /* o : representative region */ + const int16_t fLenLow, /* i : low frequency length */ + const int16_t fLenHigh, /* i : high frequency length */ + const int16_t sbWidth[], /* i : bandwidth for high bands */ + const int16_t lagIndices[], /* i : correlation indices for most representative */ + const int16_t subband_offsets[], /* i : band offsets for HF reconstruction */ + const int16_t subband_search_offset[] /* i : most representative regions offsets in LF */ +) +{ + int16_t k, j, ii, st_pos, dst_pos; + int16_t nlags[NB_SWB_SUBBANDS_HAR_SEARCH_SB]; + float tmpbuf[L_FRAME32k]; + int16_t hfband_end[NB_SWB_SUBBANDS]; + int16_t rem_hfe, temp_last_peakpos, i, l, pos, res; + float hf_pulse_peaks[160], pulse_peak_sb[320]; + int16_t st_last_peakpos; + + set_f( tmpbuf, 0.0f, L_FRAME32k ); + for ( k = 0; k < 3; k++ ) + { + hfband_end[k] = fLenLow + subband_offsets[k + 1]; + } + hfband_end[3] = fLenLow + fLenHigh; + + rem_hfe = (int16_t) ( fLenLow - pos_max_hfe2 - 1 ) / har_freq_est2; + st_last_peakpos = pos_max_hfe2 + ( rem_hfe * har_freq_est2 ); + temp_last_peakpos = st_last_peakpos; + i = 0; + + for ( k = 0; k < 2; k++ ) + { + nlags[k] = (int16_t) pow( 2, bits_lagIndices_mode0_Har[k] ); + + l = 0; + while ( st_last_peakpos < ( fLenLow + subband_offsets[k] ) ) + { + st_last_peakpos += har_freq_est2; + } + st_last_peakpos -= har_freq_est2; + + if ( k == 0 ) + { + st_pos = subband_search_offset[k] - nlags[k] / 2 + lagIndices[k]; + + /*Copy the LF Smoothed Noise to the HF*/ + for ( j = 0; j < sbWidth[k]; j++ ) + { + xSynth_har[j] = noise_flr[st_pos + j]; + tmpbuf[j] = xSynth_har[j]; + if ( predBuf[st_pos + j] != 0.0f ) + { + hf_pulse_peaks[l] = predBuf[st_pos + j]; + l++; + } + } + } + else + { + st_pos = subband_search_offset[k] + nlags[k] / 2 - lagIndices[k]; + dst_pos = st_pos - sbWidth[k]; + ii = sbWidth[k - 1]; + /*Copy the LF Smoothed Noise floor to the HF*/ + for ( j = st_pos; j > ( dst_pos ) && ii < ( sbWidth[k] + sbWidth[k - 1] ); j-- ) + { + xSynth_har[ii] = noise_flr[j]; + tmpbuf[ii] = xSynth_har[ii]; + if ( predBuf[j] != 0.0f ) + { + hf_pulse_peaks[l] = predBuf[j]; + l++; + } + ii++; + } + } + pos = 0; + for ( j = 0; j < l; j++ ) + { + st_last_peakpos += har_freq_est2; + if ( st_last_peakpos < hfband_end[k] ) + { + pk_sf[k * 8 + pos].nmrValue = hf_pulse_peaks[j]; + pk_sf[k * 8 + pos].gainIndex = st_last_peakpos - fLenLow; + pul_res[k]++; + pulse_peak_sb[i] = hf_pulse_peaks[j]; + i++; + pos++; + } + } + st_last_peakpos = temp_last_peakpos; + } + res = i - 1; + l = 1; + ii = hfband_end[k - 1] - fLenLow - 1; + for ( ; k < ( bands - harmonic_band ); k++ ) + { + for ( j = hfband_end[k - 1] - fLenLow; j < ( hfband_end[k] - fLenLow ); j++ ) + { + xSynth_har[j] = tmpbuf[ii]; + tmpbuf[j] = xSynth_har[j]; + ii--; + } + pos = 0; + while ( st_last_peakpos < hfband_end[k - 1] ) + { + st_last_peakpos += har_freq_est2; + } + while ( st_last_peakpos < hfband_end[k] && pul_res[k] < pul_res[2 - l] && l <= 2 ) + { + pk_sf[k * 8 + pos].nmrValue = pulse_peak_sb[res]; + pk_sf[k * 8 + pos].gainIndex = st_last_peakpos - fLenLow; + pul_res[k]++; + res--; + pos++; + st_last_peakpos += har_freq_est2; + } + l++; + } + + return; +} + +/*-------------------------------------------------------------------* + * SmoothSpec() + * + * Smoothes specified samples using moving average method. The number + * of points in the average is given by 'span'. Note that current + * implementation does not accept 'span' to be smaller than 'fLen'. + *-------------------------------------------------------------------*/ + +static void SmoothSpec( + const float *inBuf, /* i : input */ + float *outBuf, /* o : output */ + const int16_t fLen, /* i : length */ + int16_t span /* i : averaging length */ +) +{ + int16_t i, span1, nItems; + float sum, ispan; + const float *oldPtr, *newPtr; + + /* not accepted */ + if ( span > fLen ) + { + mvr2r( inBuf, outBuf, fLen ); + return; + } + + /* span must be odd */ + if ( ( span & 0x1 ) == 0 ) + { + span--; + } + + span1 = span >> 1; + + /* first sample */ + sum = *inBuf; + *outBuf++ = sum; + + oldPtr = inBuf; + newPtr = inBuf + 2; + + /* handle start */ + inBuf++; + sum += *inBuf; + + for ( i = 1, nItems = 3; i < span1; i++, inBuf++ ) + { + sum += *newPtr++; + *outBuf++ = sum / nItems; + + sum += *newPtr++; + nItems += 2; + } + + ispan = 1.0f / span; + inBuf++; + i++; + sum += *newPtr++; + *outBuf++ = sum * ispan; + + /* moving average */ + for ( ; i < fLen - span1; i++, inBuf++ ) + { + sum += *newPtr++; + sum -= *oldPtr++; + *outBuf++ = sum * ispan; + } + + /* handle end */ + nItems = span - 2; + sum -= *oldPtr++; + + for ( ; i < fLen - 1; i++, inBuf++ ) + { + sum -= *oldPtr++; + *outBuf++ = sum / nItems; + nItems -= 2; + sum -= *oldPtr++; + } + + /* last sample */ + *outBuf = *inBuf; + + return; +} + +/*-------------------------------------------------------------------* + * SpectrumSmoothing() + * + * Smoothing of the low-frequency envelope + *-------------------------------------------------------------------*/ + +void SpectrumSmoothing( + float *inBuf, /* i : input */ + float *outBuf, /* o : output */ + const int16_t fLen, /* i : length */ + const float th_cut /* i : threshold of cut */ +) +{ + int16_t i, k; + float inBuf_pss[L_FRAME32k]; + float outBuf_pss[L_FRAME32k]; + float max_val[L_FRAME32k / L_SB]; + float max_val_norm; + float inBuf_abs; + int16_t j; + int16_t num_subband_smooth; + int16_t m, n; + int16_t cnt_zero_cont; + int16_t n_list[BANDS_MAX]; + int16_t reset_flag; + + num_subband_smooth = (int16_t) fLen / L_SB; + if ( (float) fLen / L_SB - num_subband_smooth > 0.0f ) + { + num_subband_smooth++; + } + + for ( i = 0; i < fLen; i++ ) + { + inBuf_pss[i] = inBuf[i]; + outBuf_pss[i] = 0.0f; + } + + for ( i = fLen; i < fLen + ( num_subband_smooth * L_SB - fLen ); i++ ) + { + inBuf_pss[i] = 0.0f; + outBuf_pss[i] = 0.0f; + } + + j = 0; + for ( i = 0; i < num_subband_smooth; i++ ) + { + max_val[i] = 0; + for ( k = 0; k < L_SB; k++ ) + { + inBuf_abs = (float) fabs( inBuf_pss[j] ); + if ( max_val[i] < inBuf_abs ) + { + max_val[i] = inBuf_abs; + } + + j++; + } + } + + /* convert to maximum amplitude frequency log scale envelope */ + j = 0; + for ( i = 0; i < num_subband_smooth; i++ ) + { + max_val_norm = 0.0f; + if ( max_val[i] != 0.0f ) + { + max_val_norm = 10.0f / max_val[i]; + } + + for ( k = 0; k < L_SB; k++ ) + { + if ( inBuf_pss[j] == 0.0f ) + { + outBuf_pss[j] = 0.0f; + } + else if ( fabs( inBuf_pss[j] ) < max_val[i] ) + { + outBuf_pss[j] = inBuf_pss[j] * max_val_norm; + } + else + { + /* CLIP , for avoiding computational difference */ + outBuf_pss[j] = 10.0f; + if ( inBuf_pss[j] < 0.0f ) + { + outBuf_pss[j] = -10.0f; + } + } + j++; + } + } + k = 0; + m = 0; + n = 0; + reset_flag = 0; + n_list[0] = 0; + for ( j = 0; j < num_subband_smooth; j++ ) + { + cnt_zero_cont = 0; + for ( i = 0; i < L_SB; i++ ) + { + if ( outBuf_pss[k] == 0.0f ) + { + cnt_zero_cont++; + } + else + { + cnt_zero_cont = 0; + } + k++; + } + + if ( cnt_zero_cont != 0 ) + { + if ( j > subband_search_offsets[0] / L_SB && reset_flag == 0 ) + { + n = 0; + reset_flag = 1; + } + n_list[n] = j; + n++; + } + + if ( reset_flag == 1 && n == 1 ) + { + m = 0; + } + + if ( cnt_zero_cont > 3 * L_SB / 4 ) + { + for ( i = 0; i < L_SB; i++ ) + { + if ( outBuf_pss[k - L_SB + i] == 0.0f ) + { + outBuf_pss[k - L_SB + i] = outBuf_pss[n_list[m] * L_SB + i] * 0.5f; + } + } + m++; + } + } + + for ( i = 0; i < fLen; i++ ) + { + outBuf[i] = 0.0f; + if ( fabs( outBuf_pss[i] ) > th_cut ) + { + outBuf[i] = outBuf_pss[i]; + } + } + + return; +} + +/*-------------------------------------------------------------------* + * Get20Log10Spec() + * + * Calculates 20*log10() for the specified samples. Input and output buffers can be the same. + *-------------------------------------------------------------------*/ + +static void Get20Log10Spec( + const float *inBuf, /* i : input */ + float *outBuf, /* o : output */ + const int16_t fLen /* i : loop length */ +) +{ + int16_t i; + + for ( i = 0; i < fLen; i++, inBuf++ ) + { + *outBuf++ = (float) ( 20.0f * log10( fabs( *inBuf + 1.0 ) ) ); + } + + return; +} + +/*-------------------------------------------------------------------* + * convert_lagIndices_pls2smp() + * + * + *-------------------------------------------------------------------*/ + +void convert_lagIndices_pls2smp( + int16_t lagIndices_in[], + int16_t nBands_search, + int16_t lagIndices_out[], + const float sspectra[], + const int16_t sbWidth[], + const int16_t fLenLow ) +{ + int16_t sb; + int16_t i, cnt; + + for ( sb = 0; sb < nBands_search; sb++ ) + { + cnt = 0; + i = 0; + while ( cnt <= lagIndices_in[sb] ) + { + if ( sspectra[subband_search_offsets[sb] + i] != 0.0f ) + { + cnt++; + } + + i++; + + if ( subband_search_offsets[sb] + i + sbWidth[sb] >= fLenLow ) + { + /* over fLenLow, no need for more search */ + break; + } + } + + lagIndices_out[sb] = i - 1 + subband_search_offsets[sb]; + } + + return; +} + + +/*-------------------------------------------------------------------* + * get_usebit_npswb() + * + * + *-------------------------------------------------------------------*/ + +int16_t get_usebit_npswb( + const int16_t hqswb_clas ) +{ + int16_t i; + int16_t bits; + int16_t up_lmt; + const int16_t *bits_req; + + up_lmt = 0; + bits_req = bits_lagIndices_modeNormal; + bits = 0; + if ( hqswb_clas == HQ_NORMAL ) + { + up_lmt = NB_SWB_SUBBANDS; + bits_req = bits_lagIndices_modeNormal; + } + else if ( hqswb_clas == HQ_HARMONIC ) + { + up_lmt = NB_SWB_SUBBANDS_HAR_SEARCH_SB; + bits_req = bits_lagIndices_mode0_Har; + bits = 2; /*noise gain*/ + } + for ( i = 0; i < up_lmt; i++ ) + { + bits += bits_req[i]; + } + + return bits; +} + + +/*-------------------------------------------------------------------* + * SpectrumSmoothing_nss() + * + * + *-------------------------------------------------------------------*/ + +static void SpectrumSmoothing_nss( + const float *inBuf, + float *outBuf, + const int16_t fLen ) +{ + int16_t i, k; + float inBufw[L_FRAME32k + L_SB_NSS]; + float outBufw[L_FRAME32k + L_SB_NSS]; + float temp_sum_1[NUM_SUBBAND_SMOOTH_MAX]; + float temp_sum_2[NUM_SUBBAND_SMOOTH_MAX]; + float temp_sum_3[NUM_SUBBAND_SMOOTH_MAX]; + float temp_sum_log[NUM_SUBBAND_SMOOTH_MAX]; + float temp_sum_smooth[NUM_SUBBAND_SMOOTH_MAX]; + float temp_sum_div[NUM_SUBBAND_SMOOTH_MAX]; + int16_t num_subband_smooth; + float smr, avg_val, r0; + float clip_cof, avg_val2, thre; + float thre_min; + float max_peak; + + /* calculate subband number */ + num_subband_smooth = (int16_t) ( fLen / L_SB_NSS ); + if ( fLen / ( L_SB_NSS + 0.0f ) - num_subband_smooth > 0.0f ) + { + num_subband_smooth++; + } + + /* buffer copy for fractional point */ + for ( i = 0; i < fLen; i++ ) + { + inBufw[i] = inBuf[i]; + outBufw[i] = 0.0f; + } + + /* initialization of over buffer for fractional point */ + for ( i = fLen; i < fLen + L_SB_NSS; i++ ) + { + inBufw[i] = 0.0f; + outBufw[i] = 0.0f; + } + + avg_val = 0.0f; + for ( i = 0; i < fLen; i++ ) + { + r0 = (float) fabs( inBufw[i] ); + avg_val += r0; + } + avg_val /= (float) fLen; + + max_peak = 0.0f; + for ( i = 0; i < fLen; i++ ) + { + r0 = (float) fabs( inBufw[i] ); + if ( max_peak < r0 ) + { + max_peak = r0; + } + } + + smr = 10.0f * (float) log10( max_peak / ( avg_val + 1.0e-20 ) + 1.0e-20 ); + + for ( i = 0; i < num_subband_smooth; i++ ) + { + temp_sum_1[i] = 0.0; + temp_sum_2[i] = 0.0; + + for ( k = 0; k < L_SB_NSS_HALF; k++ ) + { + temp_sum_1[i] += (float) ( fabs( inBufw[k + L_SB_NSS * i] ) ); + } + + for ( k = L_SB_NSS_HALF; k < L_SB_NSS; k++ ) + { + temp_sum_2[i] += (float) ( fabs( inBufw[k + L_SB_NSS * i] ) ); + } + + temp_sum_1[i] *= 0.25f; + temp_sum_2[i] *= 0.25f; + temp_sum_3[i] = temp_sum_1[i] * temp_sum_2[i]; + + if ( temp_sum_3[i] == 0.0f ) + { + temp_sum_3[i] = temp_sum_1[i] + temp_sum_2[i]; + } + } + + Get20Log10Spec( temp_sum_3, temp_sum_log, num_subband_smooth ); + + for ( i = 0; i < num_subband_smooth; i++ ) + { + temp_sum_log[i] *= 0.5f; + } + + SmoothSpec( temp_sum_log, temp_sum_smooth, num_subband_smooth, MA_LEN ); + + for ( i = 0; i < num_subband_smooth; i++ ) + { + temp_sum_div[i] = (float) pow( 10, -1.0f * temp_sum_smooth[i] / 20 ); + } + + for ( i = 0; i < num_subband_smooth; i++ ) + { + for ( k = 0; k < L_SB_NSS; k++ ) + { + outBufw[k + L_SB_NSS * i] = inBufw[k + L_SB_NSS * i] * temp_sum_div[i]; + } + } + + avg_val2 = 0.0f; + for ( i = 0; i < fLen; i++ ) + { + r0 = (float) fabs( outBufw[i] ); + avg_val2 += r0; + } + avg_val2 /= (float) fLen; + + clip_cof = smr - 16.0f; + if ( clip_cof < 0.0f ) + { + clip_cof = 0.0f; + } + clip_cof += 2.5f; + + thre = avg_val2 * clip_cof; + thre_min = avg_val2 * 0.25f; + for ( i = 0; i < fLen; i++ ) + { + if ( fabs( outBufw[i] ) > thre ) + { + if ( outBufw[i] < 0.0f ) + { + outBufw[i] = -1.0f * thre; + } + else + { + outBufw[i] = thre; + } + } + + if ( fabs( outBufw[i] ) < thre_min ) + { + outBufw[i] = 0.0f; + } + } + + for ( i = 0; i < fLen; i++ ) + { + outBuf[i] = outBufw[i]; + } + + return; +} + + +/*-------------------------------------------------------------------* + * get_sigma() + * + * + *-------------------------------------------------------------------*/ + +static float get_sigma( + const float x_abs[], + const float avg, + const int16_t length ) +{ + int16_t i; + float d; + float sigma; + + d = 0; + for ( i = 0; i < length; i++ ) + { + d += x_abs[i] * x_abs[i]; + } + + d /= ( length - 1 ); + d -= avg * avg; + + sigma = (float) sqrt( d ); + + return sigma; +} + +/*--------------------------------------------------------------------------* + * FindNBiggest2_simple() + * + * Finds N biggest components from input + * Maximum value allowed for nIdx is currently 140 and the maximum value of n is currently 20 + *--------------------------------------------------------------------------*/ + +void FindNBiggest2_simple( + const float *inBuf, /* i : input buffer (searched) */ + GainItem *g, /* o : N biggest components found */ + const int16_t nIdx, /* i : search length */ + int16_t *n, /* i : number of components searched (N biggest) */ + const int16_t N_NBIGGESTSEARCH ) +{ + int16_t j; + float abs_in[400]; + float avg_in; + float max_in; + float thr; + int16_t peak_cnt; + float sigma; + + max_in = 0; + avg_in = 0; + for ( j = 0; j < nIdx; j++ ) + { + abs_in[j] = (float) fabs( inBuf[j] ); + + if ( max_in < abs_in[j] ) + { + max_in = abs_in[j]; + } + + avg_in += abs_in[j]; + } + + avg_in /= (float) nIdx; + + peak_cnt = 0; + if ( max_in <= 0.0001f ) + { + for ( j = 0; j < N_NBIGGESTSEARCH; j++ ) + { + g[peak_cnt].nmrValue = 0.0f; + g[peak_cnt].gainIndex = j; + peak_cnt++; + } + } + + sigma = get_sigma( abs_in, avg_in, nIdx ); + thr = avg_in + sigma * 1.15f; + + if ( peak_cnt < N_NBIGGESTSEARCH ) + { + for ( j = 0; j < nIdx; j++ ) + { + if ( abs_in[j] > thr ) + { + g[peak_cnt].nmrValue = abs_in[j]; + g[peak_cnt].gainIndex = j; + abs_in[j] = 0.0f; + peak_cnt++; + } + + if ( peak_cnt == N_NBIGGESTSEARCH ) + { + break; + } + } + } + + thr *= ( 0.3f / N_NBIGGESTSEARCH ) * peak_cnt + 0.7f; + + if ( peak_cnt < N_NBIGGESTSEARCH ) + { + for ( j = 0; j < nIdx; j++ ) + { + if ( abs_in[j] > thr ) + { + g[peak_cnt].nmrValue = abs_in[j]; + g[peak_cnt].gainIndex = j; + abs_in[j] = 0.0f; + peak_cnt++; + } + + if ( peak_cnt == N_NBIGGESTSEARCH ) + { + break; + } + } + } + + thr *= ( 0.6f / N_NBIGGESTSEARCH ) * peak_cnt + 0.3f; + if ( peak_cnt < N_NBIGGESTSEARCH ) + { + for ( j = 0; j < nIdx; j++ ) + { + if ( abs_in[j] > thr ) + { + g[peak_cnt].nmrValue = abs_in[j]; + g[peak_cnt].gainIndex = j; + abs_in[j] = 0.0f; + peak_cnt++; + } + + if ( peak_cnt == N_NBIGGESTSEARCH ) + { + break; + } + } + } + + *n = peak_cnt; + + return; +} + +/*--------------------------------------------------------------------------* + * spectrumsmooth_noiseton() + * + * Spectrum normalization for the the core coder + *--------------------------------------------------------------------------*/ + +float spectrumsmooth_noiseton( + float spectra[], /* i : core coder */ + const float spectra_ni[], /* i : core coder with sparse filling */ + float sspectra[], /* o : Smoothed tonal information from core coder */ + float sspectra_diff[], /* o : non tonal infomration for gap filling */ + float sspectra_ni[], /* o : smoothed core coder */ + const int16_t fLenLow, /* i : low frequency boundaries */ + int16_t *ni_seed /* io : random seed */ +) +{ + float spectra_diff[L_FRAME32k]; + float ni_ratio, ss_min, cut_sig_th, cut_ni_th; + int16_t i, pcnt, sign; + float spectra_rm[L_FRAME32k]; + float cut_input = 0.1f; + float rand_a[L_FRAME32k]; + + /* pre-prepare random array for float-fix interoperability */ + for ( i = 0; i < fLenLow; i++ ) + { + rand_a[i] = own_random( ni_seed ) / PCM16_TO_FLT_FAC; + } + + /*Get the pulse resolution for the core coder*/ + pcnt = 0; + for ( i = 0; i < fLenLow; i++ ) + { + if ( spectra[i] != 0.0 ) + { + pcnt++; + } + } + + ni_ratio = 4.0f * ( pcnt ) / ( fLenLow + 0.0f ); + ni_ratio = min( 0.9f, ni_ratio ); + + ss_min = ni_ratio * 10.0f; + cut_sig_th = ss_min / 4.0f; + cut_sig_th = max( 0.95f, cut_sig_th ); + /*core coder normalization for gap filling*/ + for ( i = 0; i < fLenLow; i++ ) + { + spectra_rm[i] = 0.0f; + if ( fabs( spectra[i] ) > cut_input ) + { + spectra_rm[i] = spectra[i]; + } + } + SpectrumSmoothing( spectra_rm, sspectra, fLenLow, cut_sig_th ); + /*Extract noise informaton from the core coder*/ + mvr2r( sspectra, sspectra_ni, fLenLow ); + for ( i = 0; i < fLenLow; i++ ) + { + spectra_diff[i] = spectra_ni[i] - spectra[i]; + } + cut_ni_th = 0.0f; + /*normalize sparse filled components*/ + for ( i = 0; i < fLenLow; i++ ) + { + spectra_rm[i] = 0.0f; + if ( fabs( spectra_diff[i] ) > cut_input ) + { + spectra_rm[i] = spectra_diff[i]; + } + } + SpectrumSmoothing( spectra_rm, sspectra_diff, fLenLow, cut_ni_th ); + /*Normalized corecoder for Gap filling */ + for ( i = 0; i < fLenLow; i++ ) + { + sign = 1; + if ( sspectra[i] < 0 ) + { + sign = -1; + } + if ( fabs( sspectra[i] ) > ss_min ) + { + sspectra[i] = sign * ( ( 10 - ss_min ) / 10.0f * (float) fabs( sspectra[i] ) + ss_min ); + } + if ( sspectra[i] != 0.0 ) + { + sspectra_ni[i] = sspectra[i]; + } + else + { + sspectra_ni[i] = sspectra_diff[i] * ni_ratio; + } + if ( sspectra_ni[i] == 0.0f ) + { + sspectra_ni[i] = 0.5f * 10.0f * ni_ratio * rand_a[i]; + } + } + + return ( ss_min ); +} + +/*--------------------------------------------------------------------------* + * noiseinj_hf() + * + * level adjustments for the missing bands in the core coder + *--------------------------------------------------------------------------*/ + +void noiseinj_hf( + float xSynth_har[], /* o : gap filled information */ + const float th_g[], /* i : level adjustment information */ + const float band_energy[], /* i : subband energies */ + float *prev_En_sb, /* i/o: band Energies */ + const int16_t p2a_flags[], /* i : Missing bands in the core coder */ + const int16_t BANDS, /* i : total bands */ + const int16_t band_start[], /* i : band start indices */ + const int16_t band_end[], /* i : band end indices */ + const int16_t fLenLow /* i : low frequency bandwidth */ +) +{ + + float *p_En, ni_scale, *p_Enn_sm_sb, En[NB_SWB_SUBBANDS], Enn_sm_sb[NB_SWB_SUBBANDS]; + int16_t k, i; + + int16_t map_pulse_t[L_FRAME32k]; + int16_t map_pulse[L_FRAME32k]; + + set_s( map_pulse_t, 0, band_end[BANDS - 1] + 1 ); + set_s( map_pulse, 0, band_end[BANDS - 1] + 1 ); + /*level adjust the missing bands in the core coder */ + p_En = En; + for ( k = BANDS - NB_SWB_SUBBANDS; k < BANDS; k++ ) + { + *p_En = 0.0f; + if ( p2a_flags[k] == 0 ) + { + for ( i = band_start[k]; i <= band_end[k]; i++ ) + { + if ( fabs( xSynth_har[i - fLenLow] ) <= th_g[k - ( BANDS - NB_SWB_SUBBANDS )] ) + { + *p_En += xSynth_har[i - fLenLow] * xSynth_har[i - fLenLow]; + } + else + { + map_pulse_t[i] = 1; + } + } + *p_En = (float) sqrt( *p_En ); + } + p_En++; + } + + p_En = En; + p_Enn_sm_sb = Enn_sm_sb; + for ( k = BANDS - NB_SWB_SUBBANDS; k < BANDS; k++ ) + { + *p_Enn_sm_sb = prev_En_sb[k - ( BANDS - NB_SWB_SUBBANDS )]; + if ( p2a_flags[k] == 0 ) + { + if ( prev_En_sb[k - ( BANDS - NB_SWB_SUBBANDS )] < 0.8f * band_energy[k] ) + { + *p_Enn_sm_sb = ( 0.15f * ( *p_En ) ) + ( 0.85f * prev_En_sb[k - ( BANDS - NB_SWB_SUBBANDS )] ); + } + else + { + *p_Enn_sm_sb = ( 0.8f * ( *p_En ) ) + ( 0.2f * prev_En_sb[k - ( BANDS - NB_SWB_SUBBANDS )] ); + } + } + + p_Enn_sm_sb++; + p_En++; + } + + p_En = En; + p_Enn_sm_sb = Enn_sm_sb; + map_pulse[fLenLow] = ( map_pulse_t[fLenLow] | map_pulse_t[fLenLow + 1] ); + for ( i = fLenLow + 1; i < band_end[BANDS - 1]; i++ ) + { + map_pulse[i] = ( map_pulse_t[i - 1] | map_pulse_t[i] | map_pulse_t[i + 1] ); + } + map_pulse[i] = ( map_pulse_t[i - 1] | map_pulse_t[i] ); + for ( k = BANDS - NB_SWB_SUBBANDS; k < BANDS; k++ ) + { + if ( p2a_flags[k] == 0 && *p_En != 0.0f ) + { + ni_scale = (float) sqrt( ( *p_Enn_sm_sb ) / ( *p_En ) ); + ni_scale = min( 1.25f, ni_scale ); + ni_scale = max( 0.75f, ni_scale ); + ni_scale *= 0.8f; + for ( i = band_start[k]; i <= band_end[k]; i++ ) + { + if ( fabs( xSynth_har[i - fLenLow] ) <= th_g[k - ( BANDS - NB_SWB_SUBBANDS )] ) + { + if ( map_pulse[i] == 0 ) + { + xSynth_har[i - fLenLow] *= ni_scale; + } + } + } + prev_En_sb[k - ( BANDS - NB_SWB_SUBBANDS )] = *p_Enn_sm_sb; + } + p_Enn_sm_sb++; + p_En++; + } + + return; +} + +/*--------------------------------------------------------------------------* + * noise_extr_corcod() + * + * Spectrum normalization for the core coder + *--------------------------------------------------------------------------*/ + +void noise_extr_corcod( + float spectra[], /* i : core coder */ + const float spectra_ni[], /* i : core coder with sparse filling */ + float sspectra[], /* o : Smoothed tonal information from core coder */ + float sspectra_diff[], /* o : non tonal infomration for gap filling */ + float sspectra_ni[], /* o : smoothed core coder */ + const int16_t fLenLow, /* i : low frequency bands width */ + int16_t prev_hqswb_clas, /* i : classification information */ + float *prev_ni_ratio /* i/o: noise parameter */ +) +{ + int16_t i, pulse_num; + float spectra_diff[L_FRAME32k]; + float ni_ratio, ni_ratio_cur, br_adj; + + /*Spectrum Smoothing for tonal signals*/ + SpectrumSmoothing_nss( spectra, sspectra, fLenLow ); + + mvr2r( sspectra, sspectra_ni, fLenLow ); + /*noise extraction*/ + for ( i = 0; i < fLenLow; i++ ) + { + spectra_diff[i] = spectra_ni[i] - spectra[i]; + } + SpectrumSmoothing_nss( spectra_diff, sspectra_diff, fLenLow ); + /*Smoothing the noise components*/ + br_adj = 0.9f; + pulse_num = 0; + for ( i = 0; i < fLenLow; i++ ) + { + if ( spectra[i] != 0.0f ) + { + pulse_num++; + } + } + ni_ratio_cur = 0.0f; + if ( pulse_num != 0 ) + { + ni_ratio_cur = ( fLenLow - pulse_num ) / ( fLenLow + 0.0f ); + ni_ratio_cur *= br_adj; + } + if ( prev_hqswb_clas == HQ_HARMONIC ) + { + if ( ni_ratio_cur > ( *prev_ni_ratio ) ) + { + ni_ratio = 0.8f * ni_ratio_cur + ( *prev_ni_ratio ) * 0.2f; + } + else + { + ni_ratio = 0.6f * ni_ratio_cur + ( *prev_ni_ratio ) * 0.4f; + } + } + else + { + ni_ratio = 0.7f * ni_ratio_cur; + } + *prev_ni_ratio = ni_ratio; + + for ( i = 0; i < fLenLow; i++ ) + { + sspectra_diff[i] *= ni_ratio; + sspectra_ni[i] = sspectra[i] + sspectra_diff[i]; + } + + return; +} + +/*--------------------------------------------------------------------------* + * ton_ene_est() + * + * band energies for missing bands in the core coder + *--------------------------------------------------------------------------*/ + +void ton_ene_est( + float xSynth_har[], /* i : buffer with non tonal compoents */ + float be_tonal[], /* o : tonal energy of the missing bands */ + float band_energy[], /* i : subband energies */ + int16_t band_start[], /* i : subband start indices */ + int16_t band_end[], /* i : subband end indices */ + int16_t band_width[], /* i : subband widths */ + const int16_t fLenLow, /* i : low frequency width */ + const int16_t fLenHigh, /* i : High frequency width */ + int16_t bands, /* i : total subbands */ + int16_t har_bands, /* i : total number of harmonics bands */ + float ni_lvl, /* i : noise enve for the hf bands */ + GainItem pk_sf[], /* i : subband widths */ + int16_t *pul_res /* i : tonal resolution */ +) +{ + int16_t sb_ton_loc[SWB_HAR_RAN1]; + float sb_ton[SWB_HAR_RAN1], peak[NB_SWB_SUBBANDS]; + int16_t pos, count_pos_st, count_pos_end; + int16_t pul_res_bnd[NB_SWB_SUBBANDS]; + int16_t k, i, j; + float E = 0.0f, E_r = 0.0f, fac, ni_gain[NB_SWB_SUBBANDS], avg_pe[NB_SWB_SUBBANDS]; + + set_s( sb_ton_loc, -1, SWB_HAR_RAN1 ); + set_f( ni_gain, 0.0f, NB_SWB_SUBBANDS ); + set_f( avg_pe, 0.0f, NB_SWB_SUBBANDS ); + set_f( sb_ton, 0.0f, NB_SWB_SUBBANDS ); + set_f( peak, 0.0f, NB_SWB_SUBBANDS ); + /*non tonal adjustments*/ + for ( i = 0; i < fLenHigh; i++ ) + { + xSynth_har[i] *= ni_lvl; + } + + pos = 0; + for ( k = 0; k < bands - har_bands; k++ ) + { + for ( j = 0; j < pul_res[k]; j++ ) + { + sb_ton_loc[pos] = pk_sf[k * 8 + j].gainIndex; + sb_ton[pos] = pk_sf[k * 8 + j].nmrValue; + pos++; + } + } + k = 0; + pos = 0; + do + { + count_pos_st = pos; + while ( sb_ton_loc[pos] <= ( band_end[k + har_bands] - fLenLow ) && sb_ton_loc[pos] >= 0 ) + { + pos++; + } + count_pos_end = pos; + pul_res_bnd[k] = count_pos_end - count_pos_st; + if ( pul_res_bnd[k] > 0 ) + { + peak[k] = (float) fabs( sb_ton[count_pos_st] ); + } + k++; + } while ( k < NB_SWB_SUBBANDS ); + + k = 0; + /*energy calculation for tonal components*/ + for ( i = har_bands; i < bands; i++ ) + { + E = sum2_f( &xSynth_har[band_start[i] - fLenLow], band_width[i] ); /*noise energy*/ + E_r = (float) E / (float) pow( 2.0f, band_energy[i] ); + + if ( E_r < 0.06f ) + { + avg_pe[k] = (float) sqrt( pow( 2.0f, band_energy[i] ) / band_width[i] ); + fac = 0.6f; + if ( pul_res_bnd[k] != 0 ) + { + fac = ( (float) sqrt( E / band_width[i] ) / peak[k] ); + } + ni_gain[k] = fac * avg_pe[k]; + + ni_gain[k] = max( ( ( ni_gain[k] * ni_gain[k] * E_r ) >= 0.12f ) ? 0.05f * ni_gain[k] : 1.0f * ni_gain[k], 1.4f ); + + for ( j = band_start[i]; j <= band_end[i]; j++ ) + { + xSynth_har[j - fLenLow] *= ni_gain[k]; + } + E = sum2_f( &xSynth_har[band_start[i] - fLenLow], band_width[i] ); /*noise energy*/ + } + k++; + be_tonal[i] = (float) pow( 2.0f, band_energy[i] ) - E; /*tonal energy*/ + + if ( be_tonal[i] < 0.0f ) + { + E = 0; + for ( j = ( band_start[i] - fLenLow ); j <= ( band_end[i] - fLenLow ); j++ ) + { + xSynth_har[j] *= 0.25f; + E += xSynth_har[j] * xSynth_har[j]; + } + be_tonal[i] = (float) pow( 2.0f, band_energy[i] ) - E; /*tonal energy*/ + } + } + + return; +} + + +/*--------------------------------------------------------------------------* + * Gettonl_scalfact() + * + * Gap filling for the core coder + *--------------------------------------------------------------------------*/ +void Gettonl_scalfact( + float *outBuf, /* o : synthesized spectrum */ + const float *codbuf, /* i : core coder */ + const int16_t fLenLow, /* i : lowband length */ + const int16_t fLenHigh, /* i : highband length */ + int16_t harmonic_band, /* i : total number of Low frequency bands */ + int16_t bands, /* i : total number of subbands in a frame */ + float *band_energy, /* i : band energy of each subband */ + int16_t *band_start, /* i : subband start indices */ + int16_t *band_end, /* i : subband end indices */ + const int16_t p2aflags[], /* i : missing bands in the core coder */ + float be_tonal[], /* i : tonal energy */ + GainItem *pk_sf, /* i : toanl information for Sparse filling */ + int16_t *pul_res_pk /* i : pulse resolution information */ +) +{ + int16_t k, i, band_pos; + int16_t sb_ton_loc[SWB_HAR_RAN1]; + int16_t pos_tmp; + float sb_ton[SWB_HAR_RAN1], est_ton_ene[NB_SWB_SUBBANDS], ton_sf; + float step, enrd_r = 0.9f; + float band_sf[SWB_HAR_RAN1]; + int16_t pos, count_pos_st, count_pos_end, j; + + set_f( est_ton_ene, 0.0f, NB_SWB_SUBBANDS ); + set_s( sb_ton_loc, -1, SWB_HAR_RAN1 ); + /* Get the tonal information for sparse filling */ + pos = 0; + for ( k = 0; k < bands - harmonic_band; k++ ) + { + for ( j = 0; j < pul_res_pk[k]; j++ ) + { + sb_ton_loc[pos] = pk_sf[k * 8 + j].gainIndex; + sb_ton[pos] = pk_sf[k * 8 + j].nmrValue; + pos++; + } + } + k = 0; + pos = 0; + pos_tmp = 0; + + do + { + band_pos = k + harmonic_band; + count_pos_st = pos; + while ( sb_ton_loc[pos] <= ( band_end[band_pos] - fLenLow ) && sb_ton_loc[pos] >= 0 ) + { + pos++; + } + count_pos_end = pos; + for ( i = count_pos_st; i < count_pos_end; i++ ) + { + est_ton_ene[k] += ( sb_ton[i] * sb_ton[i] ); + } + if ( est_ton_ene[k] <= 0.0f ) + { + est_ton_ene[k] = 0.01f; + } + ton_sf = 0.0f; + if ( be_tonal[band_pos] > 0.0f ) + { + ton_sf = (float) sqrt( be_tonal[band_pos] / est_ton_ene[k] ); + } + for ( i = count_pos_st; i < count_pos_end; i++ ) + { + band_sf[pos_tmp] = ton_sf; + pos_tmp++; + } + k++; + } while ( k < NB_SWB_SUBBANDS ); + /* Gap filling for the core coder */ + step = 1.0f / ( 0.077f * fLenHigh ); + pos_tmp = 0; + for ( k = 0; k < bands - harmonic_band; k++ ) + { + band_pos = k + harmonic_band; + if ( be_tonal[band_pos] > 0.0f ) + { + enrd_r *= (float) sqrt( be_tonal[band_pos] / pow( 2.0f, band_energy[band_pos] ) ); + } + else + { + enrd_r = 0.0f; + } + enrd_r -= step; + if ( p2aflags[band_pos] == 1 ) + { + for ( i = band_start[band_pos]; i <= band_end[band_pos]; i++ ) + { + outBuf[i - fLenLow] = codbuf[i]; + } + } + else + { + pos = 0; + pos += pos_tmp; + for ( j = 0; j < pul_res_pk[k]; j++ ) + { + outBuf[pk_sf[k * 8 + j].gainIndex] = pk_sf[k * 8 + j].nmrValue * band_sf[pos] * enrd_r; + pos++; + } + } + pos_tmp += pul_res_pk[k]; + } + + return; +} + + +/*--------------------------------------------------------------------------* + * return_bits_normal2() + * + * + *--------------------------------------------------------------------------*/ + +void return_bits_normal2( + int16_t *bit_budget, + const int16_t p2a_flags[], + const int16_t bands, + const int16_t bits_lagIndices[] ) +{ + int16_t i; + + for ( i = 0; i < NB_SWB_SUBBANDS; i++ ) + { + if ( p2a_flags[bands - NB_SWB_SUBBANDS + i] == 1 ) + { + *bit_budget += bits_lagIndices[i]; + } + } + + return; +} + +/*--------------------------------------------------------------------------* + * preset_hq2_swb() + * + * + *--------------------------------------------------------------------------*/ + +void preset_hq2_swb( + const int16_t hqswb_clas, + const int16_t band_end[], + int16_t *har_bands, + int16_t p2a_bands, + const int16_t length, + const int16_t bands, + int16_t *lowlength, + int16_t *highlength, + float m[] ) +{ + if ( hqswb_clas == HQ_HARMONIC ) + { + *har_bands = bands - p2a_bands + 1; + *lowlength = band_end[*har_bands - 1] + 1; + } + else + { + *lowlength = band_end[bands - NB_SWB_SUBBANDS - 1] + 1; + } + + *highlength = ( length - *lowlength ); + set_f( m, 0.0f, length ); + + return; +} + + +/*--------------------------------------------------------------------------* + * post_hq2_swb() + * + * + *--------------------------------------------------------------------------*/ + +void post_hq2_swb( + const float m[], + const int16_t lowlength, + const int16_t highlength, + const int16_t hqswb_clas, + const int16_t har_bands, + const int16_t bands, + const int16_t p2a_flags[], + const int16_t band_start[], + const int16_t band_end[], + float y2[], + int16_t npulses[] ) +{ + int16_t i, k; + + /* copy the scratch buffer to the output */ + mvr2r( &m[lowlength], &y2[lowlength], highlength ); + + if ( hqswb_clas == HQ_HARMONIC ) + { + k = har_bands; + } + else + { + k = bands - NB_SWB_SUBBANDS; + } + + for ( ; k < bands; k++ ) + { + if ( p2a_flags[k] == 0 && npulses[k] == 0 ) + { + for ( i = band_start[k]; i <= band_end[k]; i++ ) + { + if ( y2[i] != 0.0f ) + { + npulses[k]++; + } + } + } + } + + return; +} + + +/*--------------------------------------------------------------------------* + * GetSynthesizedSpecThinOut() + * + * Synthesize the spectrum in generic subband coding + *--------------------------------------------------------------------------*/ + +void GetSynthesizedSpecThinOut( + const float *predBuf, /* i : prediction buffer (i.e., lowband) */ + float *outBuf, /* o : synthesized spectrum */ + const int16_t nBands, /* i : number of subbands calculated */ + const int16_t *sbWidth, /* i : subband lengths */ + const int16_t *lagIndices, /* i : lowband index for each subband */ + const float *lagGains, /* i : first gain for each subband */ + const int16_t predBufLen /* i : lowband length */ +) +{ + int16_t sb; + int16_t fLen, lag; + float *ptr_in_outBuf; + + ptr_in_outBuf = outBuf; + + for ( sb = 0; sb < nBands; sb++ ) + { + fLen = sbWidth[sb]; + lag = lagIndices[sb]; + + if ( lag + fLen > predBufLen ) + { + /* should never happen */ + lag = predBufLen - fLen; + } + + GetPredictedSignal( predBuf, outBuf, lag, fLen, lagGains[sb] ); + outBuf += fLen; + } + + outBuf = ptr_in_outBuf; + + return; +} + + +/*--------------------------------------------------------------------------* + * GetlagGains() + * + * + *--------------------------------------------------------------------------*/ + +void GetlagGains( + const float *predBuf, /* i : predictve buffer */ + const float *band_energy, /* i : band Energies */ + const int16_t nBands, /* i : high frequency bands */ + const int16_t *sbWidth, /* i : high frequency band resolution */ + const int16_t *lagIndices, /* i : correlation indices */ + const int16_t predBufLen, /* i : predictive buffer length */ + float *lagGains /* o : lag gains */ +) +{ + int16_t i; + int16_t sb, fLen, lag; + float outBuf[L_FRAME32k]; + float lagEnergy; + + /* Get the gain information for the missing bands*/ + for ( sb = 0; sb < nBands; sb++ ) + { + fLen = sbWidth[sb]; + lag = lagIndices[sb]; + + if ( lag + fLen > predBufLen ) + { + /* should never happen */ + lag = predBufLen - fLen; + } + + GetPredictedSignal( predBuf, outBuf, lag, fLen, 1.0 ); + + lagEnergy = 0.0f; + for ( i = 0; i < fLen; i++ ) + { + lagEnergy += outBuf[i] * outBuf[i]; + } + + if ( lagEnergy != 0.0f ) + { + lagGains[sb] = (float) sqrt( pow( 2.0f, band_energy[sb] ) / lagEnergy ); + } + else + { + lagGains[sb] = (float) sqrt( pow( 2.0f, band_energy[sb] ) / ( lagEnergy + 0.001f ) ); + } + } + + return; +} + + +/*--------------------------------------------------------------------------* + * updat_prev_frm() + * + * + *--------------------------------------------------------------------------*/ + +void updat_prev_frm( + float y2[], /* i/o: core coder buffer */ + float t_audio[], /* o : core coder buffer */ + const int32_t bwe_br, /* i : core bitrate */ + const int16_t length, /* i : frame length coded bw */ + const int16_t inner_frame, /* i : input frame length */ + const int16_t bands, /* i : sub band resolution */ + const int16_t bwidth, /* i : audio bandwidth */ + const int16_t is_transient, /* i : signal class information */ + const int16_t hqswb_clas, /* i : signal class information */ + int16_t *prev_hqswb_clas, /* o : update signal class information */ + int16_t prev_SWB_peak_pos[], /* o : update core coder last coded peaks*/ + int16_t prev_SWB_peak_pos_tmp[], /* o : update core coder last coded peaks*/ + int16_t *prev_frm_hfe2, /* o : update harmonics */ + int16_t *prev_stab_hfe2, /* o : update harmonics */ + const int16_t bws_cnt /* i : band width detector counter */ +) +{ + int16_t i, k, k1, k2, j; + + /* Copy the coded MDCT coefficient to the output buffer */ + if ( !is_transient ) + { + /* Copy the scratch buffer to the output */ + mvr2r( y2, t_audio, length ); + + /* If the input frame is larger than coded bandwidth, zero out uncoded MDCT coefficients */ + if ( inner_frame > length ) + { + set_f( t_audio + length, 0.0f, inner_frame - length ); + } + } + else /* transient frame */ + { + if ( inner_frame == length || bws_cnt > 0 ) + { + /* Copy the scratch buffer to the output */ + mvr2r( y2, t_audio, length ); + } + else + { + /* un-collapse transient frame and interleave zeros */ + for ( i = 0; i < NUM_TIME_SWITCHING_BLOCKS; i++ ) + { + k1 = i * length / NUM_TIME_SWITCHING_BLOCKS; + k2 = i * inner_frame / NUM_TIME_SWITCHING_BLOCKS; + + mvr2r( y2 + k1, t_audio + k2, length / NUM_TIME_SWITCHING_BLOCKS ); + set_f( t_audio + k2 + length / NUM_TIME_SWITCHING_BLOCKS, 0.0f, ( inner_frame - length ) / NUM_TIME_SWITCHING_BLOCKS ); + } + } + } + + /* update */ + if ( ( bwe_br == HQ_16k40 || bwe_br == HQ_13k20 ) && bwidth == SWB ) + { + *prev_hqswb_clas = hqswb_clas; + if ( hqswb_clas != HQ_HARMONIC ) + { + *prev_frm_hfe2 = 0; + *prev_stab_hfe2 = 0; + } + } + else + { + *prev_hqswb_clas = is_transient; + } + + if ( ( bwe_br == HQ_16k40 || bwe_br == HQ_13k20 ) && bwidth == SWB && hqswb_clas == HQ_NORMAL ) + { + j = 0; + for ( k = bands - SPT_SHORTEN_SBNUM; k < bands; k++ ) + { + prev_SWB_peak_pos[j] = prev_SWB_peak_pos_tmp[j]; + j++; + } + } + + return; +} diff --git a/lib_com/swb_tbe_com.c b/lib_com/swb_tbe_com.c new file mode 100644 index 0000000000000000000000000000000000000000..fb1382ae4a94e16715dd226f3ff4199e3919d632 --- /dev/null +++ b/lib_com/swb_tbe_com.c @@ -0,0 +1,2072 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" +#include "ivas_prot.h" +#include + +#define POW_EXC16k_WHTND 1.14e11f /* power of random excitation, length 320 samples, uniform distribution */ +#define THR_ENV_ERROR_PLOSIVE 200.0f /* threshold for envelope error used in plosive detection */ + +/*-----------------------------------------------------------------* + * Local function prototypes + *-----------------------------------------------------------------*/ + +static void create_random_vector( float output[], const int16_t length, int16_t seed[] ); +static void flip_spectrum( const float input[], float output[], const int16_t length ); +static void Hilbert_transform( float tmp_R[], float tmp_I[], float *tmpi_R, float *tmpi_I, const int16_t length, const int16_t HB_stage_id ); +static void Estimate_mix_factors( const float *shb_res, const float *exc16kWhtnd, const float *White_exc16k, const float pow1, const float pow22, float *vf_modified, int16_t *vf_ind ); + +/*-------------------------------------------------------------------* + * swb_tbe_reset() + * + * Reset the SWB TBE encoder + *-------------------------------------------------------------------*/ + +void swb_tbe_reset( + float mem_csfilt[], + float mem_genSHBexc_filt_down_shb[], + float state_lpc_syn[], + float syn_overlap[], + float state_syn_shbexc[], + float *tbe_demph, + float *tbe_premph, + float mem_stp_swb[], + float *gain_prec_swb ) +{ + set_f( mem_csfilt, 0, 2 ); + set_f( mem_genSHBexc_filt_down_shb, 0.0f, ( 2 * ALLPASSSECTIONS_STEEP + 1 ) ); + set_f( state_lpc_syn, 0.0f, LPC_SHB_ORDER ); + set_f( syn_overlap, 0.0f, L_SHB_LAHEAD ); + set_f( state_syn_shbexc, 0.0f, L_SHB_LAHEAD ); + *tbe_demph = 0.0f; + *tbe_premph = 0.0f; + set_f( mem_stp_swb, 0, LPC_SHB_ORDER ); + *gain_prec_swb = 1.0f; + + return; +} + + +/*-------------------------------------------------------------------* + * swb_tbe_reset_synth() + * + * Reset the extra parameters needed for synthesis of the SWB TBE output + *-------------------------------------------------------------------*/ + +void swb_tbe_reset_synth( + float genSHBsynth_Hilbert_Mem[], + float genSHBsynth_state_lsyn_filt_shb_local[] ) +{ + set_f( genSHBsynth_Hilbert_Mem, 0.0f, HILBERT_MEM_SIZE ); + set_f( genSHBsynth_state_lsyn_filt_shb_local, 0.0f, 2 * ALLPASSSECTIONS_STEEP ); + + return; +} + + +/*-------------------------------------------------------------------* + * tbe_celp_exc_offset() + * + * Compute tbe bwe celp excitation offset + *-------------------------------------------------------------------*/ + +/*! r: offset value */ +int16_t tbe_celp_exc_offset( + const int16_t T0, /* i : Integer pitch */ + const int16_t T0_frac /* i : Fractional part of the pitch */ +) +{ + int16_t offset; + offset = T0 * HIBND_ACB_L_FAC + (int16_t) ( (float) T0_frac * 0.25f * HIBND_ACB_L_FAC + 2 * HIBND_ACB_L_FAC + 0.5f ) - 2 * HIBND_ACB_L_FAC; + + return offset; +} + + +/*-------------------------------------------------------------------* + * flip_and_downmix_generic() + * + * flips the spectrum and downmixes the signals, lpf if needed + *-------------------------------------------------------------------*/ + +void flip_and_downmix_generic( + float input[], /* i : input spectrum */ + float output[], /* o : output spectrum */ + const int16_t length, /* i : length of spectra */ + float mem1_ext[HILBERT_ORDER1], /* i/o: Hilbert filter memory */ + float mem2_ext[2 * HILBERT_ORDER2], /* i/o: memory */ + float mem3_ext[2 * HILBERT_ORDER2], /* i/o: memory */ + int16_t *phase_state /* i/o: Phase state in case frequency isn't multiple of 50 Hz */ +) +{ + int16_t i, j; + float tmp[L_FRAME32k + HILBERT_ORDER1]; + float tmpi_R[L_FRAME32k]; + float tmpi_I[L_FRAME32k]; + float tmpi2_R[L_FRAME32k + HILBERT_ORDER2]; + float tmpi2_I[L_FRAME32k + HILBERT_ORDER2]; + float tmp_R[L_FRAME32k + HILBERT_ORDER2]; + float tmp_I[L_FRAME32k + HILBERT_ORDER2]; + int16_t k, period; + float recip_period; + float local_negsin_table[L_FRAME16k]; + float local_cos_table[L_FRAME16k]; + + period = 17; /* == (int16_t) (32000.0f / 1850.0f + 0.5f); */ + + recip_period = 256.0f / (float) period; + for ( i = 0; i < period; i++ ) + { + k = (int16_t) ( i * recip_period + 0.5f ); + if ( k <= 64 ) + { + local_negsin_table[i] = -sincos_t[k]; + local_cos_table[i] = sincos_t[64 - k]; + } + else if ( k <= 128 ) + { + local_negsin_table[i] = -sincos_t[128 - k]; + local_cos_table[i] = -sincos_t[k - 64]; + } + else if ( k <= 192 ) + { + local_negsin_table[i] = sincos_t[k - 128]; + local_cos_table[i] = -sincos_t[192 - k]; + } + else + { + local_negsin_table[i] = sincos_t[256 - k]; + local_cos_table[i] = sincos_t[k - 192]; + } + } + + for ( i = 0; i < length; i = i + 2 ) + { + input[i] = -input[i]; + } + + mvr2r( input, tmp + HILBERT_ORDER1, length ); + + mvr2r( mem1_ext, tmp, HILBERT_ORDER1 ); + + /* Hilber transform stage - 0 */ + Hilbert_transform( tmp, tmp, tmpi_R, tmpi_I, length, 0 ); + + mvr2r( mem2_ext, tmpi2_R, HILBERT_ORDER2 ); + mvr2r( mem3_ext, tmpi2_I, HILBERT_ORDER2 ); + + /* Hilber transform stage - 1 */ + Hilbert_transform( tmpi_R, tmpi_I, tmpi2_R, tmpi2_I, length, 1 ); + + mvr2r( tmp + length, mem1_ext, HILBERT_ORDER1 ); + mvr2r( mem2_ext + HILBERT_ORDER2, tmp_R, HILBERT_ORDER2 ); + mvr2r( mem3_ext + HILBERT_ORDER2, tmp_I, HILBERT_ORDER2 ); + + /* Hilber transform stage - 2 */ + Hilbert_transform( tmpi2_R, tmpi2_I, tmpi_R, tmpi_I, length, 2 ); + + mvr2r( tmpi2_R + length, mem2_ext, HILBERT_ORDER2 ); + mvr2r( tmpi2_I + length, mem3_ext, HILBERT_ORDER2 ); + + /* Hilber transform stage - 3 */ + Hilbert_transform( tmpi_R, tmpi_I, tmp_R, tmp_I, length, 3 ); + + mvr2r( tmp_R + length, mem2_ext + HILBERT_ORDER2, HILBERT_ORDER2 ); + mvr2r( tmp_I + length, mem3_ext + HILBERT_ORDER2, HILBERT_ORDER2 ); + + if ( *phase_state >= period ) + { + *phase_state = 0; + } + + for ( i = 0, j = *phase_state; i < length; ) + { + for ( ; ( j < period ) && ( i < length ); j++, i++ ) + { + output[i] = tmp_R[i + HILBERT_ORDER2] * local_cos_table[j] + tmp_I[i + HILBERT_ORDER2] * local_negsin_table[j]; + } + + if ( j >= period ) + { + j = 0; + } + } + + *phase_state = j; + + return; +} + +/*---------------------------------------------- + * Hilbert_transform() + * + * Hilbert transform + *------------------------------------------------*/ + +static void Hilbert_transform( + float tmp_R[], /* i : Real component of HB */ + float tmp_I[], /* i : Real component of HB */ + float tmpi_R[], /* o : Real component of HB */ + float tmpi_I[], /* o : Imag. component of HB */ + const int16_t length, /* i : input length */ + const int16_t HB_stage_id /* i : HB transform stage */ +) +{ + int16_t i, hb_filter_stage, offset; + + hb_filter_stage = 2 * HB_stage_id; + offset = ( HB_stage_id == 0 ) ? 1 : 0; + + if ( HB_stage_id == 0 || HB_stage_id == 2 ) + { + for ( i = 0; i < length; i++ ) + { + tmpi_R[i] = tmp_R[i + 4] * Hilbert_coeffs[hb_filter_stage][0 + offset] + tmp_R[i + 2] * Hilbert_coeffs[hb_filter_stage][2 + offset] + tmp_R[i] * Hilbert_coeffs[hb_filter_stage][4 + offset]; + + tmpi_I[i] = tmp_I[i + 4 + offset] * Hilbert_coeffs[hb_filter_stage + 1][0] + tmp_I[i + 2 + offset] * Hilbert_coeffs[hb_filter_stage + 1][2] + tmp_I[i + offset] * Hilbert_coeffs[hb_filter_stage + 1][4]; + } + } + else if ( HB_stage_id == 1 || HB_stage_id == 3 ) + { + for ( i = 0; i < length; i++ ) + { + tmpi_R[i + 4] = tmp_R[i] - tmpi_R[i + 2] * Hilbert_coeffs[hb_filter_stage][2] - tmpi_R[i] * Hilbert_coeffs[hb_filter_stage][4]; + + tmpi_I[i + 4] = tmp_I[i] - tmpi_I[i + 2] * Hilbert_coeffs[hb_filter_stage + 1][2] - tmpi_I[i] * Hilbert_coeffs[hb_filter_stage + 1][4]; + } + } + + return; +} + +/*-------------------------------------------------------------------* + * flip_spectrum() + * + * + *-------------------------------------------------------------------*/ + +void flip_spectrum( + const float input[], /* i : input spectrum */ + float output[], /* o : output spectrum */ + const int16_t length /* i : vector length */ +) +{ + int16_t i; + + for ( i = 0; i < length; i = i + 2 ) + { + output[i] = -input[i]; + output[i + 1] = input[i + 1]; + } + + return; +} + +/*-------------------------------------------------------------------* + * flip_spectrum_and_decimby4() + * + * + *-------------------------------------------------------------------*/ + +void flip_spectrum_and_decimby4( + const float input[], /* i : input spectrum */ + float output[], /* o : output spectrum */ + const int16_t length, /* i : vector length */ + float mem1[], /* i/o: memory */ + float mem2[], /* i/o: memory */ + const int16_t ramp_flag /* i : flag to trigger slow ramp-up of output following change of core (HQ to ACELP or 12k8 to 16k ACELP) */ +) +{ + int16_t i; + float factor, tmp[L_FRAME16k / 2]; + float input_change[L_FRAME16k]; + + if ( ramp_flag ) + { + factor = 4.0f / length; + for ( i = 0; i < length / 4; i = i + 2 ) + { + input_change[i] = -input[i] * ( i * factor ); + input_change[i + 1] = input[i + 1] * ( ( i + 1.0f ) * factor ); + } + } + else + { + i = 0; + } + + for ( ; i < length; i = i + 2 ) + { + input_change[i] = -input[i]; + input_change[i + 1] = input[i + 1]; + } + + Decimate_allpass_steep( input_change, mem1, length, tmp ); + Decimate_allpass_steep( tmp, mem2, length / 2, output ); + + return; +} + +/*-------------------------------------------------------------------* + * GenShapedWBExcitation() + * + * Synthesize spectrally shaped highband excitation signal for the wideband + *-------------------------------------------------------------------*/ + +void GenShapedWBExcitation( + float *excSHB, /* o : synthesized shaped shb exctiation */ + const float *lpc_shb, /* i : lpc coefficients */ + float *exc4kWhtnd, /* o : whitened synthesized shb excitation */ + float *mem_csfilt, /* i/o: memory */ + float *mem_genSHBexc_filt_down1, /* i/o: memory */ + float *mem_genSHBexc_filt_down2, /* i/o: memory */ + float *mem_genSHBexc_filt_down3, /* i/o: memory */ + float *state_lpc_syn, /* i/o: memory */ + const int16_t coder_type, /* i : coding type */ + const float *bwe_exc_extended, /* i : bandwidth extended exciatation */ + int16_t bwe_seed[], /* i/o: random number generator seed */ + const float voice_factors[], /* i : voicing factor */ + const int16_t uv_flag, /* i : unvoiced flag */ + const int16_t igf_flag ) +{ + int16_t i, j, k; + float wht_fil_mem[LPC_WHTN_ORDER_WB]; + float lpc_whtn[LPC_WHTN_ORDER_WB + 1]; + float R[LPC_WHTN_ORDER_WB + 2]; + float excTmp[L_FRAME16k]; + float excTmp2[L_FRAME16k / 4]; + float exc4k[L_FRAME16k / 4]; + float pow1, pow22, scale; + float excNoisyEnv[L_FRAME16k / 4]; + float csfilt_num2[1] = { 0.05f }; + float csfilt_den2[2] = { 1.0f, -0.96f }; + float temp1, temp2; + float ervec[LPC_WHTN_ORDER_WB + 2]; + float tmp_vfac; + float avg_voice_fac = 0.25f * sum_f( voice_factors, NB_SUBFR ); + + if ( igf_flag && ( coder_type == VOICED || avg_voice_fac > 0.35f ) ) + { + csfilt_num2[0] = 0.2f; + csfilt_den2[1] = -0.8f; + } + else if ( igf_flag && ( coder_type == UNVOICED || avg_voice_fac < 0.2f ) ) + { + csfilt_num2[0] = 0.01f; + csfilt_den2[1] = -0.99f; + } + set_f( wht_fil_mem, 0, LPC_WHTN_ORDER_WB ); + + Decimate_allpass_steep( bwe_exc_extended, mem_genSHBexc_filt_down1, L_FRAME32k, excTmp ); + + flip_spectrum_and_decimby4( excTmp, exc4k, L_FRAME16k, mem_genSHBexc_filt_down2, mem_genSHBexc_filt_down3, 0 ); + + if ( uv_flag ) + { + /* unvoiced signal */ + create_random_vector( exc4kWhtnd, L_FRAME16k / 4, bwe_seed ); + } + else + { + autocorr( exc4k, R, LPC_WHTN_ORDER_WB + 1, L_FRAME16k / 4, win_flatten_4k, 0, 1, 1 ); + + /* Ensure R[0] isn't zero when entering Levinson Durbin */ + R[0] = max( R[0], 1.0e-8f ); + for ( i = 0; i <= LPC_WHTN_ORDER_WB; i++ ) + { + R[i] = R[i] * wac[i]; + } + lev_dur( lpc_whtn, R, LPC_WHTN_ORDER_WB, ervec ); + + fir( exc4k, lpc_whtn, exc4kWhtnd, wht_fil_mem, L_FRAME16k / 4, LPC_WHTN_ORDER_WB, 0 ); + + /* Ensure pow1 is greater than zero when computing normalization */ + for ( i = 0, pow1 = 0.00001f; i < L_FRAME16k / 4; i++ ) + { + excTmp2[i] = (float) ( fabs( exc4kWhtnd[i] ) ); + pow1 += exc4kWhtnd[i] * exc4kWhtnd[i]; + } + + for ( i = 0; i < L_FRAME16k / 4; i++ ) + { + excNoisyEnv[i] = *mem_csfilt + csfilt_num2[0] * excTmp2[i]; + *mem_csfilt = -csfilt_den2[1] * excNoisyEnv[i]; + } + + create_random_vector( exc4k, L_FRAME16k / 4, bwe_seed ); + + /* Ensure pow22 is greater than zero when computing normalization */ + for ( i = 0, pow22 = 0.00001f; i < L_FRAME16k / 4; i++ ) + { + exc4k[i] *= excNoisyEnv[i]; + pow22 += exc4k[i] * exc4k[i]; + } + + if ( coder_type == UNVOICED || ( igf_flag && avg_voice_fac < 0.2f ) ) + { + scale = (float) sqrt( pow1 / pow22 ); + if ( pow22 == 0.f ) + { + scale = 0; + } + + for ( i = 0; i < L_FRAME16k / 4; i++ ) + { + exc4kWhtnd[i] = exc4k[i] * scale; + } + } + else + { + for ( i = 0, k = 0; i < 4; i++ ) + { + + if ( igf_flag && coder_type == VOICED ) + { + tmp_vfac = 2 * voice_factors[i]; + tmp_vfac = min( 1, tmp_vfac ); + } + else + { + tmp_vfac = voice_factors[i]; + } + + temp1 = root_a( tmp_vfac ); + temp2 = root_a_over_b( pow1 * ( 1.0f - tmp_vfac ), pow22 ); + + + for ( j = 0; j < L_FRAME16k / 16; j++, k++ ) + { + exc4kWhtnd[k] = temp1 * exc4kWhtnd[k] + temp2 * exc4k[k]; + } + } + } + } + + syn_filt( lpc_shb, LPC_SHB_ORDER_WB, exc4kWhtnd, excSHB, L_FRAME16k / 4, state_lpc_syn, 1 ); + + return; +} + +/*-------------------------------------------------------------------* + * GenWBSynth() + * + * Generate 16 KHz sampled highband component from synthesized highband + *-------------------------------------------------------------------*/ + +void GenWBSynth( + const float *input_synspeech, /* i : input synthesized speech */ + float *shb_syn_speech_16k, /* o : output highband compnent */ + float *state_lsyn_filt_shb1, /* i/o: memory */ + float *state_lsyn_filt_shb2 /* i/o: memory */ +) +{ + float speech_buf_16k1[L_FRAME16k], speech_buf_16k2[L_FRAME16k]; + + Interpolate_allpass_steep( input_synspeech, state_lsyn_filt_shb1, L_FRAME16k / 4, speech_buf_16k1 ); + + Interpolate_allpass_steep( speech_buf_16k1, state_lsyn_filt_shb2, L_FRAME16k / 2, speech_buf_16k2 ); + + flip_spectrum( speech_buf_16k2, shb_syn_speech_16k, L_FRAME16k ); + + return; +} + +/*-------------------------------------------------------------------* + * PostShortTerm() + * + * Short term processing + *-------------------------------------------------------------------*/ + +void PostShortTerm( + float *sig_in, /* i : input signal (pointer to current subframe */ + float *lpccoeff, /* i : LPC coefficients for current subframe */ + float *sig_out, /* o : postfiltered output */ + float *mem_stp, /* i/o: postfilter memory*/ + float *ptr_mem_stp, /* i/o: pointer to postfilter memory*/ + float *ptr_gain_prec, /* i/o: for gain adjustment*/ + float *mem_zero, /* i/o: null memory to compute h_st*/ + const float formant_fac /* i : Strength of post-filter [0,1] */ +) +{ + float apond1[LPC_SHB_ORDER + 1]; /* denominator coeff.*/ + float apond2[LONG_H_ST]; /* numerator coeff. */ + float sig_ltp[L_SUBFR16k + 1]; /* residual signal */ + float parcor0; + float g1, g2; + + set_f( apond1, 0, LPC_SHB_ORDER + 1 ); + set_f( apond2, 0, LONG_H_ST ); + set_f( sig_ltp, 0, L_SUBFR16k + 1 ); + + /* Obtain post-filter weights */ + g1 = GAMMA0 + GAMMA_SHARP * formant_fac; + g2 = GAMMA0 - GAMMA_SHARP * formant_fac; + + /* Compute weighted LPC coefficients */ + weight_a( lpccoeff, apond1, g1, LPC_SHB_ORDER ); + weight_a( lpccoeff, apond2, g2, LPC_SHB_ORDER ); + + /* Compute A(gamma2) residual */ + residu( apond2, LPC_SHB_ORDER, sig_in, sig_ltp + 1, L_SUBFR16k ); + + /* Save last output of 1/A(gamma1) */ + sig_ltp[0] = *ptr_mem_stp; + + /* Control short term pst filter gain and compute parcor0 */ + calc_st_filt( apond2, apond1, &parcor0, sig_ltp + 1, mem_zero, L_SUBFR16k, SWB_TBE ); + + /* 1/A(gamma1) filtering, mem_stp is updated */ + syn_filt( apond1, LPC_SHB_ORDER, sig_ltp + 1, sig_ltp + 1, L_SUBFR16k, mem_stp, 1 ); + + /* (1 + mu z-1) tilt filtering */ + filt_mu( sig_ltp, sig_out, parcor0, L_SUBFR16k, SWB_TBE ); + + /* gain control */ + scale_st( sig_in, sig_out, ptr_gain_prec, L_SUBFR16k, SWB_TBE ); + + return; +} + +/*-------------------------------------------------------------------* + * swb_formant_fac() + * + * Find strength of adaptive formant postfilter using tilt of the high + * band. The 2nd lpc coefficient is used as a tilt approximation. + *-------------------------------------------------------------------*/ + +/*! r: Formant filter strength [0,1] */ +float swb_formant_fac( + const float lpc_shb2, /* i : 2nd HB LPC coefficient */ + float *tilt_mem /* i/o: Tilt smoothing memory */ +) +{ + float formant_fac; + float tmp; + + /* Smoothen tilt value */ + tmp = 0.5f * (float) fabs( lpc_shb2 ) + 0.5f * *tilt_mem; + *tilt_mem = tmp; + + /* Map to PF strength */ + formant_fac = ( tmp - SWB_TILT_LOW ) * SWB_TILT_DELTA; + if ( formant_fac > 1.0f ) + { + formant_fac = 1.0f; + } + else if ( formant_fac < 0.0f ) + { + formant_fac = 0.0f; + } + + formant_fac = 1.0f - 0.5f * formant_fac; + + return formant_fac; +} + +void find_td_envelope( + const float inp[], /* i : input signal */ + const int16_t len, /* i : length of the input signal */ + const int16_t len_h, /* i : length of the MA filter */ + float mem_h[], /* i/o: memory of the MA filter, length len_h/2 */ + float out[] /* o : td envelope of the input signal */ +) +{ + int16_t k, K; + float buf_in[L_FRAME16k + MAX_LEN_MA_FILTER], *p_in, *p_out, *p_prev, w; + + assert( len > 0 && len <= L_FRAME16k ); + + K = (int16_t) ( len_h / 2 ); /* length of FIR filter memory = half of the total filter length */ + w = 1.0f / len_h; /* MA filtering coefficient */ + + /* copy filter memory to the input buffer */ + if ( mem_h != NULL ) + { + mvr2r( mem_h, buf_in, K ); + } + else + { + /* no memory available, use the first len_h/2 samples as memory */ + p_in = buf_in; + for ( k = 0; k < K; k++ ) + { + *p_in++ = (float) fabs( inp[k] ) * w; + } + } + + /* take the absolute value of the input signal and copy it to the input buffer */ + /* multiply each value by 1 / filter length */ + p_in = &buf_in[K]; + for ( k = 0; k < len; k++ ) + { + *p_in++ = (float) fabs( inp[k] ) * w; + } + + /* update filter memory from the end of the input buffer */ + if ( mem_h != NULL ) + { + mvr2r( &buf_in[len], mem_h, K ); + } + + /* do MA filtering */ + out[0] = sum_f( buf_in, len_h ); + p_out = &buf_in[0]; /* pointer to leaving sample */ + p_in = &buf_in[len_h]; /* pointer to entering sample*/ + for ( k = 1; k < len - K; k++ ) + { + out[k] = out[k - 1] - *p_out++ + *p_in++; + } + + /* use IIR filtering to extrapolate the last K samples */ + p_in = &buf_in[len - K]; + p_out = &out[len - K]; + p_prev = p_out - 1; + for ( k = 0; k < K; k++ ) + { + *p_out++ = 0.05f * ( *p_in++ ) + 0.95f * ( *p_prev++ ); + } + + return; +} + +/*-------------------------------------------------------------------* + * GenShapedSHBExcitation() + * + * Synthesize spectrally shaped highband excitation signal + *-------------------------------------------------------------------*/ + +void GenShapedSHBExcitation( + float *excSHB, /* o : synthesized shaped shb excitation */ + const float *lpc_shb, /* i : lpc coefficients */ + float *White_exc16k_FB, /* o : white excitation for the Fullband extension */ + float *mem_csfilt, /* i/o: memory */ + float *mem_genSHBexc_filt_down_shb, /* i/o: memory */ + float *state_lpc_syn, /* i/o: memory */ + const int16_t coder_type, /* i : coding type */ + const float *bwe_exc_extended, /* i : bandwidth extended excitation */ + int16_t bwe_seed[], /* i/o: random number generator seed */ + float voice_factors[], /* i : voicing factor */ + const int16_t extl, /* i : extension layer */ + float *tbe_demph, /* i/o: de-emphasis memory */ + float *tbe_premph, /* i/o: pre-emphasis memory */ + float *lpc_shb_sf, /* i : LP coefficients */ + float *shb_ener_sf, + float *shb_res_gshape, + float *shb_res, + int16_t *vf_ind, + const float formant_fac, /* i : Formant sharpening factor [0..1] */ + float fb_state_lpc_syn[], /* i/o: memory */ + float *fb_tbe_demph, /* i/o: fb de-emphasis memory */ + const int32_t total_brate, /* i : bitrate */ + const int16_t prev_bfi, /* i : previous frame was concealed */ + const int16_t element_mode, /* i : element mode */ + const int16_t flag_ACELP16k, /* i : ACELP@16kHz flag */ + float *nlExc16k, /* i/o: NL exc for IC-BWE */ + float *mixExc16k, /* i/o: exc spreading for IC-BWE */ + const int32_t extl_brate, /* i : extension layer bitarte */ + const int16_t MSFlag, /* i : Multi Source flag */ + float EnvSHBres_4k[], /* i/o: TD envelope of the SHB residual signal */ + float *prev_pow_exc16kWhtnd, /* i/o: power of the LB excitation signal in the previous frame */ + float *prev_mix_factor, /* i/o: mixing factor in the previous frame */ + float *Env_error, /* o : error in SHB residual envelope modelling*/ + float Env_error_part[] /* o : per-segment error in SHB residual envelope modelling */ +) +{ + int16_t i, j, k; + float wht_fil_mem[LPC_WHTN_ORDER]; + float lpc_whtn[LPC_WHTN_ORDER + 1]; + float R[LPC_WHTN_ORDER + 2]; + float exc32k[L_FRAME32k], exc16k[L_FRAME16k]; + float pow1, pow22, scale, temp1, temp2; + float excTmp2[L_FRAME16k]; + int16_t nbSubFr; + float excNoisyEnv[L_FRAME16k]; + float csfilt_num2[1] = { 0.2f }; + float csfilt_den2[2] = { 1.0f, -0.8f }; + float varEnvShape; + float ervec[LPC_WHTN_ORDER + 2]; + float exc16kWhtnd[L_FRAME16k]; + float temp = 0.0f; + float *White_exc16k; + float voiceFacEst[NB_SUBFR16k]; + float syn_shb_ener_sf[4], tempSHB[80]; + float zero_mem[LPC_SHB_ORDER]; + float vf_tmp; + float White_exc16k_FB_temp[L_FRAME16k]; + float fb_deemph_fac = 0.48f; + double tempD; + float alpha, step, mem_csfilt_left, mem_csfilt_right, excNoisyEnvLeft[L_FRAME16k], excNoisyEnvRight[L_FRAME16k]; + int16_t cbsize; + float mix_factor, old_fact, new_fact, fact, old_scale, new_scale, step_scale; + float c0, c1, c2, c3, c4, c5, g1, g2, g, den; + float EnvWhiteExc16k[L_FRAME16k], EnvExc16kWhtnd[L_FRAME16k]; + float EnvWhiteExc16k_4k[L_FRAME4k], EnvExc16kWhtnd_4k[L_FRAME4k]; + int16_t flag_plosive; + float delta; + float c0_part[NUM_SHB_SUBGAINS], c1_part[NUM_SHB_SUBGAINS], c2_part[NUM_SHB_SUBGAINS], c3_part[NUM_SHB_SUBGAINS], c4_part[NUM_SHB_SUBGAINS], c5_part[NUM_SHB_SUBGAINS]; + + mix_factor = 0.0f; + + set_f( zero_mem, 0, LPC_SHB_ORDER ); + set_f( wht_fil_mem, 0, LPC_WHTN_ORDER ); + set_f( EnvWhiteExc16k_4k, 0, L_FRAME4k ); + set_f( EnvExc16kWhtnd_4k, 0, L_FRAME4k ); + + /* Mirror the spectrum */ + for ( i = 0; i < L_FRAME32k; i++ ) + { + exc32k[i] = ( ( i % 2 ) == 0 ) ? ( -bwe_exc_extended[i] ) : ( bwe_exc_extended[i] ); + } + + /* Decimate by 2 */ + Decimate_allpass_steep( exc32k, mem_genSHBexc_filt_down_shb, 2 * L_FRAME16k, exc16k ); + + autocorr( exc16k, R, LPC_WHTN_ORDER + 1, L_FRAME16k, win_flatten, 0, 1, 1 ); + + /* Ensure R[0] isn't zero when entering Levinson-Durbin */ + R[0] = max( R[0], 1.0e-8f ); + for ( i = 0; i <= LPC_WHTN_ORDER; i++ ) + { + R[i] = R[i] * wac[i]; + } + + /* Ensure R[0] isn't zero when entering Levinson-Durbin */ + R[0] += 1.0e-8f; + + lev_dur( lpc_whtn, R, LPC_WHTN_ORDER, ervec ); + + fir( exc16k, lpc_whtn, exc16kWhtnd, wht_fil_mem, L_FRAME16k, LPC_WHTN_ORDER, 0 ); + + if ( extl_brate >= SWB_TBE_2k8 ) + { + for ( i = 0; i < L_FRAME16k; i++ ) + { + exc16kWhtnd[i] *= shb_res_gshape[(int16_t) ( i / 80 )]; + } + } + + for ( k = 0, pow1 = 0.00001f; k < L_FRAME16k; k++ ) + { + excTmp2[k] = (float) ( fabs( exc16kWhtnd[k] ) ); + pow1 += exc16kWhtnd[k] * exc16kWhtnd[k]; + } + + if ( !flag_ACELP16k ) + { + varEnvShape = mean( voice_factors, NB_SUBFR ); + } + else + { + varEnvShape = mean( voice_factors, NB_SUBFR16k ); + } + + if ( extl == FB_TBE ) + { + fb_deemph_fac = max( ( 0.68f - (float) pow( varEnvShape, 3 ) ), 0.48f ); + } + + varEnvShape = 1.09875f - 0.49875f * varEnvShape; + varEnvShape = min( max( varEnvShape, 0.6f ), 0.999f ); + csfilt_num2[0] = 1.0f - varEnvShape; + csfilt_den2[1] = -varEnvShape; + + if ( element_mode == EVS_MONO && *mem_csfilt == 0 && ( total_brate == ACELP_9k60 || total_brate == ACELP_16k40 || total_brate == ACELP_24k40 ) ) + { + /* pre-init smoothing avoid energy drop outs */ + float tmp_scale = 0; + for ( i = 0; i < L_SUBFR16k / 4; i++ ) + { + tmp_scale += excTmp2[i]; + } + + /* don't apply for FB in case the FB start-frame was potentially lost - White_exc16k is very sensitive to enery mismatch between enc - dec */ + /* rather stick to the more conservative approach, to avoid potential clippings */ + if ( !( prev_bfi && extl == FB_TBE ) ) + { + /* use weak smoothing for 1st frame after switching to make filter recover more quickly */ + varEnvShape = 0.8f; + csfilt_num2[0] = 1.0f - varEnvShape; + csfilt_den2[1] = -varEnvShape; + } + *mem_csfilt = varEnvShape * ( tmp_scale / ( L_SUBFR16k / 4 ) ); + } + + if ( MSFlag > 0 ) + { + varEnvShape = 0.995f; + csfilt_num2[0] = 1.0f - varEnvShape; + csfilt_den2[1] = -varEnvShape; + } + + White_exc16k = exc16k; + + /* Track the low band envelope */ + if ( element_mode == IVAS_CPE_TD || element_mode == IVAS_CPE_DFT ) + { + if ( extl_brate != SWB_TBE_1k10 && extl_brate != SWB_TBE_1k75 ) + { + mem_csfilt_left = 0.0f; + mem_csfilt_right = 0.0f; + for ( k = 0; k < L_FRAME16k; k++ ) + { + excNoisyEnvLeft[k] = mem_csfilt_left + csfilt_num2[0] * excTmp2[k]; + mem_csfilt_left = -csfilt_den2[1] * excNoisyEnvLeft[k]; + excNoisyEnvRight[L_FRAME16k - k - 1] = mem_csfilt_right + csfilt_num2[0] * excTmp2[L_FRAME16k - k - 1]; + mem_csfilt_right = -csfilt_den2[1] * excNoisyEnvRight[L_FRAME16k - k - 1]; + } + + alpha = 0.0f; + step = 1.0f / L_FRAME16k; + for ( k = 0; k < L_FRAME16k; k++ ) + { + excNoisyEnv[k] = alpha * excNoisyEnvLeft[k] + ( 1 - alpha ) * excNoisyEnvRight[k]; + alpha += step; + } + } + } + else + { + for ( k = 0; k < L_FRAME16k; k++ ) + { + excNoisyEnv[k] = *mem_csfilt + csfilt_num2[0] * excTmp2[k]; + *mem_csfilt = -csfilt_den2[1] * excNoisyEnv[k]; + } + } + + if ( extl_brate == SWB_TBE_1k10 || extl_brate == SWB_TBE_1k75 ) + { + /* generate gaussian (white) excitation */ + for ( k = 0; k < L_FRAME16k; k++ ) + { + White_exc16k[k] = (float) own_random( &bwe_seed[0] ); + } + + /* normalize the amplitude of the gaussian excitation to that of the LB exc. */ + pow22 = POW_EXC16k_WHTND; + v_multc( White_exc16k, (float) sqrt( pow1 / pow22 ), White_exc16k, L_FRAME16k ); + } + else + { + create_random_vector( White_exc16k, L_FRAME, bwe_seed ); + create_random_vector( White_exc16k + L_FRAME, L_FRAME16k - L_FRAME, bwe_seed ); + + for ( k = 0, pow22 = 0.00001f; k < L_FRAME16k; k++ ) + { + White_exc16k[k] *= excNoisyEnv[k]; + pow22 += White_exc16k[k] * White_exc16k[k]; + } + } + + flag_plosive = 0; + + if ( extl_brate >= SWB_TBE_2k8 || extl_brate == SWB_TBE_1k10 || extl_brate == SWB_TBE_1k75 ) + { + if ( *vf_ind == 20 ) /* encoder side */ + { + if ( extl_brate == SWB_TBE_1k10 || extl_brate == SWB_TBE_1k75 ) + { + /* calculate TD envelopes of exc16kWhtnd and White_exc16k */ + find_td_envelope( White_exc16k, L_FRAME16k, 20, NULL, EnvWhiteExc16k ); + find_td_envelope( exc16kWhtnd, L_FRAME16k, 20, NULL, EnvExc16kWhtnd ); + + for ( k = 0; k < L_FRAME4k; k++ ) + { + EnvWhiteExc16k_4k[k] = EnvWhiteExc16k[4 * k]; + EnvExc16kWhtnd_4k[k] = EnvExc16kWhtnd[4 * k]; + } + + /* calculate the optimal mix factor */ + c0 = c1 = c2 = c3 = c4 = c5 = 0.0f; + for ( i = 0; i < NUM_SHB_SUBGAINS; i++ ) + { + c0_part[i] = sum2_f( &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ); + c1_part[i] = -2.0f * dotp( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ); + c2_part[i] = sum2_f( &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ); + c3_part[i] = -2.0f * dotp( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ); + c4_part[i] = 2.0f * dotp( &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ); + c5_part[i] = sum2_f( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ); + + c0 += c0_part[i]; + c1 += c1_part[i]; + c2 += c2_part[i]; + c3 += c3_part[i]; + c4 += c4_part[i]; + c5 += c5_part[i]; + } + + den = 4.0f * c0 * c2 - c4 * c4; + g1 = ( c3 * c4 - 2 * c1 * c2 ) / den; + g2 = ( c1 * c4 - 2 * c0 * c3 ) / den; + + *Env_error = 0.0f; + flag_plosive = 0; + for ( i = 0; i < NUM_SHB_SUBGAINS; i++ ) + { + Env_error_part[i] = c5_part[i] + g1 * g1 * c0_part[i] + g1 * c1_part[i] + g2 * g2 * c2_part[i] + g2 * c3_part[i] + g1 * g2 * c4_part[i]; + *Env_error += Env_error_part[i]; + + if ( Env_error_part[i] > THR_ENV_ERROR_PLOSIVE ) + { + /* envelope error is too high -> likely a plosive */ + flag_plosive = 1; + } + } + + if ( flag_plosive ) + { + /* plosive detected -> set the mixing factor to 0 */ + *vf_ind = 0; + mix_factor = 0.0f; + } + else + { + /* normalize gain */ + g = g2 / ( g1 + g2 ); + + /* quantization of the mixing factor */ + cbsize = 1 << NUM_BITS_SHB_VF; + delta = 1.0f / ( cbsize - 1 ); + if ( g > 1.0f ) + { + g = 1.0f; + } + else if ( g < delta ) + { + /* prevent low gains to be quantized to 0 as this is reserved for plosives */ + g = delta; + } + + *vf_ind = usquant( g, &mix_factor, 0.0f, 1.0f / ( cbsize - 1 ), cbsize ); + } + } + else + { + Estimate_mix_factors( shb_res, exc16kWhtnd, White_exc16k, pow1, pow22, voiceFacEst, vf_ind ); + temp = ( voiceFacEst[0] > 0.7f ) ? 1.0f : 0.8f; + } + } + else /* decoder side */ + { + if ( extl_brate == SWB_TBE_1k10 || extl_brate == SWB_TBE_1k75 ) + { + if ( *vf_ind == 0 ) + { + mix_factor = 0.0f; + flag_plosive = 1; + } + else + { + mix_factor = usdequant( *vf_ind, 0.0f, 1.0f / ( ( 1 << NUM_BITS_SHB_VF ) - 1 ) ); + } + } + else + { + temp = ( ( *vf_ind * 0.125f ) > 0.7f ) ? 1.0f : 0.8f; + } + } + + if ( extl_brate != SWB_TBE_1k10 && extl_brate != SWB_TBE_1k75 ) + { + for ( i = 0; i < NB_SUBFR16k; i++ ) + { + voice_factors[i] *= temp; + } + } + } + + if ( element_mode >= IVAS_CPE_DFT && nlExc16k != NULL ) + { + /* save buffers for IC-BWE */ + mvr2r( exc16kWhtnd, nlExc16k, L_FRAME16k ); + v_multc( White_exc16k, (float) sqrt( pow1 / pow22 ), mixExc16k, L_FRAME16k ); + } + + mvr2r( White_exc16k, White_exc16k_FB, L_FRAME16k ); + deemph( White_exc16k, PREEMPH_FAC, L_FRAME16k, tbe_demph ); + + if ( extl_brate == SWB_TBE_1k10 || extl_brate == SWB_TBE_1k75 ) + { + if ( !flag_plosive ) /* use only LB excitation in case of plosives */ + { + /* re-scale gaussian excitation at the beginning to gradually move from old energy to new energy */ + old_scale = (float) sqrt( *prev_pow_exc16kWhtnd / pow1 ); + new_scale = 1.0f; + step_scale = ( new_scale - old_scale ) / ( L_FRAME16k / 2 ); + scale = old_scale; + + /* interpolate between the old and the new value of the mixing factor */ + old_fact = *prev_mix_factor; + new_fact = mix_factor; + step = ( new_fact - old_fact ) / ( L_FRAME16k / 2 ); + fact = old_fact; + + /* mixing of LB and gaussian excitation in the first half of the frame */ + for ( k = 0; k < L_FRAME16k / 2; k++ ) + { + exc16kWhtnd[k] = (float) fact * ( White_exc16k[k] * scale ) + (float) ( 1 - fact ) * exc16kWhtnd[k]; + fact += step; + scale += step_scale; + } + + /* mixing of LB and gaussian excitation in the second half of the frame */ + for ( ; k < L_FRAME16k; k++ ) + { + exc16kWhtnd[k] = (float) new_fact * White_exc16k[k] + (float) ( 1 - new_fact ) * exc16kWhtnd[k]; + } + } + preemph( exc16kWhtnd, PREEMPH_FAC, L_FRAME16k, tbe_premph ); + } + else + { + if ( coder_type == UNVOICED || MSFlag == 1 ) + { + scale = (float) sqrt( pow1 / pow22 ); + if ( pow22 == 0.f ) + { + scale = 0; + } + for ( k = 0; k < L_FRAME16k; k++ ) + { + exc16kWhtnd[k] = White_exc16k[k] * scale; + } + + preemph( exc16kWhtnd, PREEMPH_FAC, L_FRAME16k, tbe_premph ); + } + else + { + nbSubFr = ( extl_brate < SWB_TBE_2k8 ) ? NB_SUBFR : NB_SUBFR16k; /* note: this condition is designed based on TBE bitrate rather than internal sampling rate */ + + for ( i = 0, k = 0; i < nbSubFr; i++ ) + { + if ( coder_type == VOICED && extl_brate < SWB_TBE_2k8 ) + { + temp = (float) sqrt( voice_factors[i] ); + temp1 = (float) sqrt( temp ); + temp2 = (float) sqrt( ( pow1 * ( 1.0f - temp ) ) / pow22 ); + if ( pow22 == 0.f ) + { + temp2 = 0; + } + } + else + { + /* Adjust noise mixing for formant sharpening filter */ + vf_tmp = SWB_NOISE_MIX_FAC * formant_fac; + vf_tmp = voice_factors[i] * ( 1.0f - vf_tmp ); + + temp1 = (float) sqrt( vf_tmp ); + temp2 = (float) sqrt( ( pow1 * ( 1.0f - vf_tmp ) ) / pow22 ); + if ( pow22 == 0.f ) + { + temp2 = 0; + } + } + + for ( j = 0; j < L_FRAME16k / nbSubFr; j++, k++ ) + { + exc16kWhtnd[k] = temp1 * exc16kWhtnd[k] + temp2 * White_exc16k[k]; + } + + temp = (float) sqrt( 1.0f - voice_factors[i] ); + temp = PREEMPH_FAC * temp / ( temp1 + temp ); + + preemph( &exc16kWhtnd[i * L_FRAME16k / nbSubFr], temp, L_FRAME16k / nbSubFr, tbe_premph ); + } + } + } + + if ( extl_brate < SWB_TBE_2k8 ) + { + syn_filt( lpc_shb, LPC_SHB_ORDER, exc16kWhtnd, excSHB, L_FRAME16k, state_lpc_syn, 1 ); + } + else + { + set_f( zero_mem, 0, LPC_SHB_ORDER ); + syn_filt( lpc_shb_sf, LPC_SHB_ORDER, exc16kWhtnd, tempSHB, 80, zero_mem, 1 ); + syn_shb_ener_sf[0] = 0.125f * sum2_f( tempSHB, 80 ); + syn_filt( lpc_shb_sf + ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 80, tempSHB, 80, zero_mem, 1 ); + syn_shb_ener_sf[1] = 0.125f * sum2_f( tempSHB, 80 ); + syn_filt( lpc_shb_sf + 2 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 160, tempSHB, 80, zero_mem, 1 ); + syn_shb_ener_sf[2] = 0.125f * sum2_f( tempSHB, 80 ); + syn_filt( lpc_shb_sf + 3 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 240, tempSHB, 80, zero_mem, 1 ); + syn_shb_ener_sf[3] = 0.125f * sum2_f( tempSHB, 80 ); + + if ( total_brate <= MAX_ACELP_BRATE ) + { + tempSHB[0] = (float) ( shb_ener_sf[0] ) / ( syn_shb_ener_sf[0] + syn_shb_ener_sf[1] + syn_shb_ener_sf[2] + syn_shb_ener_sf[3] ); + tempD = sqrt( tempSHB[0] ); + + for ( i = 0; i < L_FRAME16k; i++ ) + { + exc16kWhtnd[i] = (float) ( exc16kWhtnd[i] * tempD ); + } + } + + syn_filt( lpc_shb_sf, LPC_SHB_ORDER, exc16kWhtnd, excSHB, 80, state_lpc_syn, 1 ); + syn_filt( lpc_shb_sf + ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 80, excSHB + 80, 80, state_lpc_syn, 1 ); + syn_filt( lpc_shb_sf + 2 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 160, excSHB + 160, 80, state_lpc_syn, 1 ); + syn_filt( lpc_shb_sf + 3 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 240, excSHB + 240, 80, state_lpc_syn, 1 ); + } + + if ( extl == FB_TBE ) + { + syn_filt( lpc_shb, LPC_SHB_ORDER, White_exc16k_FB, White_exc16k_FB_temp, L_FRAME16k, fb_state_lpc_syn, 1 ); + + for ( i = 0; i < L_FRAME16k; i++ ) + { + White_exc16k_FB_temp[i] *= cos_fb_exc[i % 32]; + } + + flip_spectrum( White_exc16k_FB_temp, White_exc16k_FB, L_FRAME16k ); + + deemph( White_exc16k_FB, fb_deemph_fac, L_FRAME16k, fb_tbe_demph ); + } + else + { + for ( i = 0; i < L_FRAME16k; i++ ) + { + White_exc16k_FB[i] = 0.0f; + } + } + + *prev_pow_exc16kWhtnd = pow1; + *prev_mix_factor = mix_factor; + + return; +} + +/*-------------------------------------------------------------------* + * GenSHBSynth() + * + * Generate 32 KHz sampled highband component from synthesized highband + *-------------------------------------------------------------------*/ + +void GenSHBSynth( + const float *input_synspeech, /* i : input synthesized speech */ + float *shb_syn_speech_32k, /* o : output highband component */ + float Hilbert_Mem[], /* i/o: memory */ + float state_lsyn_filt_shb_local[], /* i/o: memory */ + const int16_t L_frame, /* i : ACELP frame length */ + int16_t *syn_dm_phase ) +{ + float speech_buf_32k[L_FRAME32k]; + int16_t i; + + Interpolate_allpass_steep( input_synspeech, state_lsyn_filt_shb_local, L_FRAME16k, speech_buf_32k ); + + if ( L_frame == L_FRAME ) + { + flip_and_downmix_generic( speech_buf_32k, shb_syn_speech_32k, L_FRAME32k, Hilbert_Mem, Hilbert_Mem + HILBERT_ORDER1, Hilbert_Mem + ( HILBERT_ORDER1 + 2 * HILBERT_ORDER2 ), syn_dm_phase ); + } + else + { + for ( i = 0; i < L_FRAME32k; i++ ) + { + shb_syn_speech_32k[i] = ( ( i % 2 ) == 0 ) ? ( -speech_buf_32k[i] ) : ( speech_buf_32k[i] ); + } + } + + return; +} + +/*-------------------------------------------------------------------* + * ScaleShapedSHB() + * + * + *-------------------------------------------------------------------*/ + +void ScaleShapedSHB( + const int16_t length, /* i : SHB overlap length */ + float *synSHB, /* i/o: synthesized shb signal */ + float *overlap, /* i/o: buffer for overlap-add */ + const float *subgain, /* i : subframe gain */ + const float frame_gain, /* i : frame gain */ + const float *win, /* i : window */ + const float *subwin /* i : subframes window */ +) +{ + const int16_t *skip; + int16_t i, j, k, l_shb_lahead, l_frame; + int16_t join_length, num_join; + float mod_syn[L_FRAME16k + L_SHB_LAHEAD], sum_gain; + + /* initilaization */ + l_frame = L_FRAME16k; + l_shb_lahead = L_SHB_LAHEAD; + skip = skip_bands_SWB_TBE; + + if ( length == SHB_OVERLAP_LEN / 2 ) + { + skip = skip_bands_WB_TBE; + l_frame = L_FRAME16k / 4; + l_shb_lahead = L_SHB_LAHEAD / 4; + } + + /* apply gain for each subframe, and store noise output signal using overlap-add */ + set_f( mod_syn, 0, l_frame + l_shb_lahead ); + + if ( length == SHB_OVERLAP_LEN / 2 ) + { + sum_gain = 0; + for ( k = 0; k < length / 2; k++ ) + { + sum_gain = subwin[2 * k + 2] * subgain[0]; + mod_syn[skip[0] + k] = synSHB[skip[0] + k] * sum_gain; + mod_syn[skip[0] + k + length / 2] = synSHB[skip[0] + k + length / 2] * subgain[0]; + } + for ( i = 1; i < NUM_SHB_SUBFR / 2; i++ ) + { + for ( k = 0; k < length; k++ ) + { + sum_gain = subwin[k + 1] * subgain[i] + subwin[length - k - 1] * subgain[i - 1]; + mod_syn[skip[i] + k] = synSHB[skip[i] + k] * sum_gain; + } + } + for ( k = 0; k < length / 2; k++ ) + { + sum_gain = subwin[length - 2 * k - 2] * subgain[i - 1]; + mod_syn[skip[i] + k] = synSHB[skip[i] + k] * sum_gain; + } + } + else + { + num_join = NUM_SHB_SUBFR / NUM_SHB_SUBGAINS; + join_length = num_join * length; + for ( k = 0, j = 0; k < length; k++ ) + { + mod_syn[j] = synSHB[j] * subwin[k + 1] * subgain[0]; + j++; + } + for ( i = 0; i < NUM_SHB_SUBGAINS - 1; i++ ) + { + for ( k = 0; k < join_length - length; k++ ) + { + mod_syn[j] = synSHB[j] * subgain[i * num_join]; + j++; + } + + for ( k = 0; k < length; k++ ) + { + mod_syn[j] = synSHB[j] * ( subwin[length - k - 1] * subgain[i * num_join] + subwin[k + 1] * subgain[( i + 1 ) * num_join] ); + j++; + } + } + for ( k = 0; k < join_length - length; k++ ) + { + mod_syn[j] = synSHB[j] * subgain[( NUM_SHB_SUBGAINS - 1 ) * num_join]; + j++; + } + for ( k = 0; k < length; k++ ) + { + mod_syn[j] = synSHB[j] * subwin[length - k - 1] * subgain[( NUM_SHB_SUBGAINS - 1 ) * num_join]; + j++; + } + } + + for ( i = 0; i < l_shb_lahead; i++ ) + { + synSHB[i] = mod_syn[i] * win[i] * frame_gain; + synSHB[i] += overlap[i]; + synSHB[i + l_shb_lahead] = mod_syn[i] * frame_gain; + } + + for ( ; i < l_frame; i++ ) + { + synSHB[i] = mod_syn[i] * frame_gain; + } + + for ( ; i < l_frame + l_shb_lahead; i++ ) + { + overlap[i - l_frame] = mod_syn[i] * win[l_frame + l_shb_lahead - 1 - i] * frame_gain; + } + + return; +} + +/*-------------------------------------------------------------------* + * non_linearity() + * + * Apply a non linearity to the SHB excitation + * -------------------------------------------------------------------*/ + +void non_linearity( + const float input[], /* i : input signal */ + float output[], /* o : output signal */ + float old_bwe_exc_extended[], /* i/o: memory bugffer */ + const int16_t length, /* i : input length */ + float *prev_scale, /* i/o: memory */ + const int16_t coder_type, /* i : Coder Type */ + const float *voice_factors, /* i : Voice Factors */ + const int16_t L_frame /* i : ACELP frame length */ +) +{ + int16_t i, j; + + float max_val = 0.0; + float scale, temp; + float scale_step; + float *p_out; + + int16_t en_abs = 0; + float v_fac = 0, ths; + int16_t nframes; + + if ( L_frame == L_FRAME16k ) + { + nframes = 5; + ths = 0.87f; + } + else + { + nframes = 4; + ths = 0.94f; + } + + for ( i = 0; i < nframes; i++ ) + { + v_fac += voice_factors[i]; + } + v_fac /= nframes; + + if ( coder_type == VOICED && v_fac > ths ) + { + en_abs = 1; + } + + p_out = output + NL_BUFF_OFFSET; /* NL_BUFF_OFFSET = 12 */ + /* update buffer memory */ + mvr2r( old_bwe_exc_extended, output, NL_BUFF_OFFSET ); + + for ( i = j = 0; i < length / 2; i++ ) + { + if ( ( temp = (float) fabs( input[i] ) ) > max_val ) + { + max_val = temp; + j = i; + } + } + + if ( max_val > 1.0f ) + { + scale = 0.67f / max_val; + } + else + { + scale = 0.67f; + } + + + if ( *prev_scale <= 0.0 || *prev_scale > 1024.0f * scale ) + { + scale_step = 1.0; + *prev_scale = scale; + } + else + { + scale_step = 1.0f; + if ( j != 0 ) + { + scale_step = (float) exp( 1.0f / (float) j * (float) log( scale / *prev_scale ) ); + } + } + + for ( i = 0; i < length / 2; i++ ) + { + if ( input[i] >= 0.0 ) + { + *p_out++ = ( input[i] * input[i] ) * *prev_scale; + } + else + { + if ( en_abs ) + { + *p_out++ = 1.0f * ( input[i] * input[i] ) * *prev_scale; + } + else + { + *p_out++ = -1.0f * ( input[i] * input[i] ) * *prev_scale; + } + } + + if ( i < j ) + { + *prev_scale *= scale_step; + } + } + + max_val = 0.0f; + for ( i = j = length / 2; i < length; i++ ) + { + if ( ( temp = (float) fabs( input[i] ) ) > max_val ) + { + max_val = temp; + j = i; + } + } + + if ( max_val > 1.0f ) + { + scale = 0.67f / max_val; + } + else + { + scale = 0.67f; + } + + + if ( *prev_scale <= 0.0 || *prev_scale > 1024.0f * scale ) + { + scale_step = 1.0; + *prev_scale = scale; + } + else + { + scale_step = 1.0f; + if ( j != length / 2 ) + { + scale_step = (float) exp( 1.0f / (float) ( j - length / 2 ) * (float) log( scale / *prev_scale ) ); + } + } + + for ( i = length / 2; i < length; i++ ) + { + if ( input[i] >= 0.0 ) + { + *p_out++ = ( input[i] * input[i] ) * *prev_scale; + } + else + { + if ( en_abs ) + { + *p_out++ = 1.0f * ( input[i] * input[i] ) * *prev_scale; + } + else + { + *p_out++ = -1.0f * ( input[i] * input[i] ) * *prev_scale; + } + } + + if ( i < j ) + { + *prev_scale *= scale_step; + } + } + + /* update buffer memory */ + mvr2r( output + L_FRAME32k, old_bwe_exc_extended, NL_BUFF_OFFSET ); + + return; +} + + +/*-------------------------------------------------------------------* + * create_random_vector() + * + * creates random number vector + * -------------------------------------------------------------------*/ + +void create_random_vector( + float output[], /* o : output random vector */ + const int16_t length, /* i : length of random vector */ + int16_t seed[] /* i/o: start seed */ +) +{ + int16_t i, j, k; + float scale1, scale2; + + j = (int16_t) ( own_random( &seed[0] ) * 0.0078f ); + j = abs( j ) & 0xff; + k = (int16_t) ( own_random( &seed[1] ) * 0.0078f ); + k = abs( k ) & 0xff; + + while ( k == j ) + { + k = (int16_t) ( own_random( &seed[1] ) * 0.0078f ); + k = abs( k ) & 0xff; + } + + if ( own_random( &seed[0] ) < 0 ) + { + scale1 = -563.154f; /* -200.00f * 0.35f/0.1243f; */ + } + else + { + scale1 = 563.154f; /* 200.00f * 0.35f/0.1243f; */ + } + + if ( own_random( &seed[1] ) < 0 ) + { + scale2 = -225.261f; /* -80.00f * 0.35f/0.1243f; */ + } + else + { + scale2 = 225.261f; /* 80.00f * 0.35f/0.1243f; */ + } + + for ( i = 0; i < length; i++, j++, k++ ) + { + j &= 0xff; + k &= 0xff; + output[i] = scale1 * gaus_dico_swb[j] + scale2 * gaus_dico_swb[k]; + } + + return; +} + + +/*-------------------------------------------------------------------* + * interp_code_5over2() + * + * Used to interpolate the excitation from the core sample rate + * of 12.8 kHz to 32 kHz. + * Simple linear interpolator - No need for precision here. + *-------------------------------------------------------------------*/ + +void interp_code_5over2( + const float inp_code[], /* i : input vector */ + float interp_code[], /* o : output vector */ + const int16_t inp_length /* i : length of input vector */ +) +{ + int16_t i, kk, kkp1; + const float factor_i[5] = { 0.2f, 0.6f, 1.0f, 0.6f, 0.2f }; + const float factor_j[5] = { 0.8f, 0.4f, 0.0f, 0.4f, 0.8f }; + + interp_code[0] = inp_code[0]; + interp_code[1] = inp_code[0] * factor_i[3] + inp_code[1] * factor_j[3]; + interp_code[2] = inp_code[0] * factor_i[4] + inp_code[1] * factor_j[4]; + + for ( i = 3, kk = 1, kkp1 = 2; i < ( inp_length - 2 ) * HIBND_ACB_L_FAC; i += 5, kk++, kkp1++ ) + { + interp_code[i] = inp_code[kk] * factor_j[0] + inp_code[kkp1] * factor_i[0]; + interp_code[i + 1] = inp_code[kk] * factor_j[1] + inp_code[kkp1] * factor_i[1]; + interp_code[i + 2] = inp_code[kkp1] * factor_i[2]; + kk++; + kkp1++; + interp_code[i + 3] = inp_code[kk] * factor_i[3] + inp_code[kkp1] * factor_j[3]; + interp_code[i + 4] = inp_code[kk] * factor_i[4] + inp_code[kkp1] * factor_j[4]; + } + + interp_code[i] = inp_code[kk] * factor_j[0]; + interp_code[i + 1] = inp_code[kk] * factor_j[1]; + + return; +} + +/*-------------------------------------------------------------------* + * interp_code_4over2() + * + * Used to interpolate the excitation from the core sample rate + * of 16 kHz to 32 kHz. + * Simple linear interpolator - No need for precision here. + *-------------------------------------------------------------------*/ + +void interp_code_4over2( + const float inp_code[], /* i : input vector */ + float interp_code[], /* o : output vector */ + const int16_t inp_length /* i : length of input vector */ +) +{ + int16_t i, j; + for ( i = j = 0; i < inp_length - 1; i++, j += 2 ) + { + interp_code[j] = inp_code[i]; + interp_code[j + 1] = inp_code[i] * 0.5f + inp_code[i + 1] * 0.5f; + } + + interp_code[j] = inp_code[i]; + interp_code[j + 1] = inp_code[i] * 0.5f; + + return; +} + +/*-------------------------------------------------------------------* + * fb_tbe_reset_synth() + * + * Reset the extra parameters needed for synthesis of the FB TBE output + *-------------------------------------------------------------------*/ + +void fb_tbe_reset_synth( + float fbbwe_hpf_mem[][4], + float *prev_fbbwe_ratio ) +{ + set_f( fbbwe_hpf_mem[0], 0, 4 ); + set_f( fbbwe_hpf_mem[1], 0, 4 ); + set_f( fbbwe_hpf_mem[2], 0, 4 ); + set_f( fbbwe_hpf_mem[3], 0, 4 ); + *prev_fbbwe_ratio = 1.0f; + + return; +} + +/*-------------------------------------------------------------------* + * wb_tbe_extras_reset() + * + * Reset the extra parameters only required for WB TBE encoding + *-------------------------------------------------------------------*/ + +void wb_tbe_extras_reset( + float mem_genSHBexc_filt_down_wb2[], + float mem_genSHBexc_filt_down_wb3[] ) +{ + set_f( mem_genSHBexc_filt_down_wb2, 0.0f, ( 2 * ALLPASSSECTIONS_STEEP + 1 ) ); + set_f( mem_genSHBexc_filt_down_wb3, 0.0f, ( 2 * ALLPASSSECTIONS_STEEP + 1 ) ); + + return; +} + +/*-------------------------------------------------------------------* + * wb_tbe_extras_reset_synth() + * + * Reset the extra parameters only required for WB TBE synthesis + *-------------------------------------------------------------------*/ + +void wb_tbe_extras_reset_synth( + float state_lsyn_filt_shb[], + float state_lsyn_filt_dwn_shb[], + float mem_resamp_HB[] ) +{ + set_f( state_lsyn_filt_shb, 0.0f, 2 * ALLPASSSECTIONS_STEEP ); + set_f( state_lsyn_filt_dwn_shb, 0.0f, 2 * ALLPASSSECTIONS_STEEP ); + set_f( mem_resamp_HB, 0.0f, INTERP_3_1_MEM_LEN ); + + return; +} + +/*-------------------------------------------------------------------* + * elliptic_bpf_48k_generic() + * + * 18th-order elliptic bandpass filter at 14.0 to 20 kHz sampled at 48 kHz + * Implemented as 3 fourth order sections cascaded. + *-------------------------------------------------------------------*/ + +void elliptic_bpf_48k_generic( + const float input[], /* i : input signal */ + float output[], /* o : output signal */ + float memory[][4], /* i/o: 4 arrays of 4 for memory */ + const float full_band_bpf[][5] /* i : filter coefficients b0,b1,b2,a0,a1,a2 */ +) +{ + int16_t i; + float tmp[L_FRAME48k], tmp2[L_FRAME48k]; + + tmp[0] = memory[0][0] * full_band_bpf[0][4] + memory[0][1] * full_band_bpf[0][3] + memory[0][2] * full_band_bpf[0][2] + memory[0][3] * full_band_bpf[0][1] + input[0] * full_band_bpf[0][0] - full_band_bpf[3][1] * memory[1][3] - full_band_bpf[3][2] * memory[1][2] - full_band_bpf[3][3] * memory[1][1] - full_band_bpf[3][4] * memory[1][0]; + tmp[1] = memory[0][1] * full_band_bpf[0][4] + memory[0][2] * full_band_bpf[0][3] + memory[0][3] * full_band_bpf[0][2] + input[0] * full_band_bpf[0][1] + input[1] * full_band_bpf[0][0] - full_band_bpf[3][1] * tmp[0] - full_band_bpf[3][2] * memory[1][3] - full_band_bpf[3][3] * memory[1][2] - full_band_bpf[3][4] * memory[1][1]; + tmp[2] = memory[0][2] * full_band_bpf[0][4] + memory[0][3] * full_band_bpf[0][3] + input[0] * full_band_bpf[0][2] + input[1] * full_band_bpf[0][1] + input[2] * full_band_bpf[0][0] - full_band_bpf[3][1] * tmp[1] - full_band_bpf[3][2] * tmp[0] - full_band_bpf[3][3] * memory[1][3] - full_band_bpf[3][4] * memory[1][2]; + tmp[3] = memory[0][3] * full_band_bpf[0][4] + input[0] * full_band_bpf[0][3] + input[1] * full_band_bpf[0][2] + input[2] * full_band_bpf[0][1] + input[3] * full_band_bpf[0][0] - full_band_bpf[3][1] * tmp[2] - full_band_bpf[3][2] * tmp[1] - full_band_bpf[3][3] * tmp[0] - full_band_bpf[3][4] * memory[1][3]; + + for ( i = 4; i < L_FRAME48k; i++ ) + { + tmp[i] = input[i - 4] * full_band_bpf[0][4] + input[i - 3] * full_band_bpf[0][3] + input[i - 2] * full_band_bpf[0][2] + input[i - 1] * full_band_bpf[0][1] + input[i] * full_band_bpf[0][0] - full_band_bpf[3][1] * tmp[i - 1] - full_band_bpf[3][2] * tmp[i - 2] - full_band_bpf[3][3] * tmp[i - 3] - full_band_bpf[3][4] * tmp[i - 4]; + } + + memory[0][0] = input[L_FRAME48k - 4]; + memory[0][1] = input[L_FRAME48k - 3]; + memory[0][2] = input[L_FRAME48k - 2]; + memory[0][3] = input[L_FRAME48k - 1]; + + tmp2[0] = memory[1][0] * full_band_bpf[1][4] + memory[1][1] * full_band_bpf[1][3] + memory[1][2] * full_band_bpf[1][2] + memory[1][3] * full_band_bpf[1][1] + tmp[0] * full_band_bpf[1][0] - full_band_bpf[4][1] * memory[2][3] - full_band_bpf[4][2] * memory[2][2] - full_band_bpf[4][3] * memory[2][1] - full_band_bpf[4][4] * memory[2][0]; + tmp2[1] = memory[1][1] * full_band_bpf[1][4] + memory[1][2] * full_band_bpf[1][3] + memory[1][3] * full_band_bpf[1][2] + tmp[0] * full_band_bpf[1][1] + tmp[1] * full_band_bpf[1][0] - full_band_bpf[4][1] * tmp2[0] - full_band_bpf[4][2] * memory[2][3] - full_band_bpf[4][3] * memory[2][2] - full_band_bpf[4][4] * memory[2][1]; + tmp2[2] = memory[1][2] * full_band_bpf[1][4] + memory[1][3] * full_band_bpf[1][3] + tmp[0] * full_band_bpf[1][2] + tmp[1] * full_band_bpf[1][1] + tmp[2] * full_band_bpf[1][0] - full_band_bpf[4][1] * tmp2[1] - full_band_bpf[4][2] * tmp2[0] - full_band_bpf[4][3] * memory[2][3] - full_band_bpf[4][4] * memory[2][2]; + tmp2[3] = memory[1][3] * full_band_bpf[1][4] + tmp[0] * full_band_bpf[1][3] + tmp[1] * full_band_bpf[1][2] + tmp[2] * full_band_bpf[1][1] + tmp[3] * full_band_bpf[1][0] - full_band_bpf[4][1] * tmp2[2] - full_band_bpf[4][2] * tmp2[1] - full_band_bpf[4][3] * tmp2[0] - full_band_bpf[4][4] * memory[2][3]; + + for ( i = 4; i < L_FRAME48k; i++ ) + { + tmp2[i] = tmp[i - 4] * full_band_bpf[1][4] + tmp[i - 3] * full_band_bpf[1][3] + tmp[i - 2] * full_band_bpf[1][2] + tmp[i - 1] * full_band_bpf[1][1] + tmp[i] * full_band_bpf[1][0] - full_band_bpf[4][1] * tmp2[i - 1] - full_band_bpf[4][2] * tmp2[i - 2] - full_band_bpf[4][3] * tmp2[i - 3] - full_band_bpf[4][4] * tmp2[i - 4]; + } + + memory[1][0] = tmp[L_FRAME48k - 4]; + memory[1][1] = tmp[L_FRAME48k - 3]; + memory[1][2] = tmp[L_FRAME48k - 2]; + memory[1][3] = tmp[L_FRAME48k - 1]; + + output[0] = memory[2][0] * full_band_bpf[2][4] + memory[2][1] * full_band_bpf[2][3] + memory[2][2] * full_band_bpf[2][2] + memory[2][3] * full_band_bpf[2][1] + tmp2[0] * full_band_bpf[2][0] - full_band_bpf[5][1] * memory[3][3] - full_band_bpf[5][2] * memory[3][2] - full_band_bpf[5][3] * memory[3][1] - full_band_bpf[5][4] * memory[3][0]; + output[1] = memory[2][1] * full_band_bpf[2][4] + memory[2][2] * full_band_bpf[2][3] + memory[2][3] * full_band_bpf[2][2] + tmp2[0] * full_band_bpf[2][1] + tmp2[1] * full_band_bpf[2][0] - full_band_bpf[5][1] * output[0] - full_band_bpf[5][2] * memory[3][3] - full_band_bpf[5][3] * memory[3][2] - full_band_bpf[5][4] * memory[3][1]; + output[2] = memory[2][2] * full_band_bpf[2][4] + memory[2][3] * full_band_bpf[2][3] + tmp2[0] * full_band_bpf[2][2] + tmp2[1] * full_band_bpf[2][1] + tmp2[2] * full_band_bpf[2][0] - full_band_bpf[5][1] * output[1] - full_band_bpf[5][2] * output[0] - full_band_bpf[5][3] * memory[3][3] - full_band_bpf[5][4] * memory[3][2]; + output[3] = memory[2][3] * full_band_bpf[2][4] + tmp2[0] * full_band_bpf[2][3] + tmp2[1] * full_band_bpf[2][2] + tmp2[2] * full_band_bpf[2][1] + tmp2[3] * full_band_bpf[2][0] - full_band_bpf[5][1] * output[2] - full_band_bpf[5][2] * output[1] - full_band_bpf[5][3] * output[0] - full_band_bpf[5][4] * memory[3][3]; + + for ( i = 4; i < L_FRAME48k; i++ ) + { + output[i] = tmp2[i - 4] * full_band_bpf[2][4] + tmp2[i - 3] * full_band_bpf[2][3] + tmp2[i - 2] * full_band_bpf[2][2] + tmp2[i - 1] * full_band_bpf[2][1] + tmp2[i] * full_band_bpf[2][0] - full_band_bpf[5][1] * output[i - 1] - full_band_bpf[5][2] * output[i - 2] - full_band_bpf[5][3] * output[i - 3] - full_band_bpf[5][4] * output[i - 4]; + } + + memory[2][0] = tmp2[L_FRAME48k - 4]; + memory[2][1] = tmp2[L_FRAME48k - 3]; + memory[2][2] = tmp2[L_FRAME48k - 2]; + memory[2][3] = tmp2[L_FRAME48k - 1]; + + memory[3][0] = output[L_FRAME48k - 4]; + memory[3][1] = output[L_FRAME48k - 3]; + memory[3][2] = output[L_FRAME48k - 2]; + memory[3][3] = output[L_FRAME48k - 1]; + + return; +} + + +/*-------------------------------------------------------------------* + * synthesise_fb_high_band() + * + * Creates the highband output for full band - 14.0 to 20 kHz + * Using the energy shaped white excitation signal from the SWB BWE. + * The excitation signal input is sampled at 16kHz and so is upsampled + * to 48 kHz first. + * Uses a complementary split filter to code the two regions from + * 14kHz to 16kHz and 16 kHz to 20 kHz. + * One of 16 tilt filters is also applied afterwards to further + * refine the spectral shape of the fullband signal. + * The tilt is specified in dB per kHz. N.B. Only negative values are + * accomodated. + *-------------------------------------------------------------------*/ + +void synthesise_fb_high_band( + const float excitation_in[], /* i : full band excitation */ + float output[], /* o : high band speech - 14.0 to 20 kHz */ + const float fb_exc_energy, /* i : full band excitation energy */ + const float ratio, /* i : energy ratio */ + const int16_t L_frame, /* i : ACELP frame length */ + const int16_t bfi, /* i : BFI flag */ + float *prev_fbbwe_ratio, /* o : previous frame energy for FEC */ + float bpf_memory[][4] /* i/o: memory for elliptic bpf 48k */ +) +{ + int16_t i, j; + float excitation_in_interp3[L_FRAME48k]; + float tmp[L_FRAME48k]; + float temp1, ratio2; + + /* Interpolate the white energy shaped gaussian excitation from 16 kHz to 48 kHz with zeros */ + /* white excitation from DC to 8 kHz resampled to produce DC to 24 kHz excitation. */ + for ( i = 0, j = 0; i < L_FRAME48k; i += 3, j++ ) + { + excitation_in_interp3[i] = 3.0f * excitation_in[j]; + excitation_in_interp3[i + 1] = 0.0f; + excitation_in_interp3[i + 2] = 0.0f; + } + + if ( L_frame == L_FRAME16k ) + { + /* for 16kHz ACELP core */ + elliptic_bpf_48k_generic( excitation_in_interp3, tmp, bpf_memory, full_band_bpf_3 ); + } + else + { + /* for 12.8kHz ACELP core */ + elliptic_bpf_48k_generic( excitation_in_interp3, tmp, bpf_memory, full_band_bpf_1 ); + } + temp1 = sum2_f( tmp, L_FRAME48k ) + 0.001f; + ratio2 = (float) ( ratio * sqrt( fb_exc_energy / temp1 ) ); + + if ( !bfi ) + { + *prev_fbbwe_ratio = ratio; + } + else + { + *prev_fbbwe_ratio = ratio * 0.5f; + } + for ( i = 0; i < L_FRAME48k; i++ ) + { + output[i] = tmp[i] * ratio2; + } + + return; +} + +/*-------------------------------------------------------------------* + * Estimate_mix_factors() * + * * + * Estimate mix factors for SHB excitation generation * + *-------------------------------------------------------------------*/ + +static void Estimate_mix_factors( + const float *shb_res, /* i : SHB LP residual */ + const float *exc16kWhtnd, /* i : SHB transformed low band excitation */ + const float *White_exc16k, /* i : Modulated envelope shaped white noise */ + const float pow1, /* i : SHB exc. power for normalization */ + const float pow22, /* i : White noise excitation for normalization*/ + float *vf_modified, /* o : Estimated voice factors */ + int16_t *vf_ind /* o : voice factors VQ index */ +) +{ + float shb_res_local[L_FRAME16k], WN_exc_local[L_FRAME16k]; + float pow3, temp_p1_p2, temp_p1_p3; + float temp_numer1[L_FRAME16k], temp_numer2[L_FRAME16k]; + int16_t i, length; + + mvr2r( shb_res, shb_res_local, L_FRAME16k ); + mvr2r( White_exc16k, WN_exc_local, L_FRAME16k ); + + pow3 = dotp( shb_res_local, shb_res_local, L_FRAME16k ); + + pow3 += 0.00001f; + temp_p1_p2 = (float) sqrt( pow1 / pow22 ); + temp_p1_p3 = (float) sqrt( pow1 / pow3 ); + + + for ( i = 0; i < L_FRAME16k; i++ ) + { + WN_exc_local[i] *= temp_p1_p2; + shb_res_local[i] *= temp_p1_p3; + } + for ( i = 0; i < L_FRAME16k; i++ ) + { + temp_numer1[i] = shb_res_local[i] - WN_exc_local[i]; + temp_numer2[i] = exc16kWhtnd[i] - WN_exc_local[i]; + } + + length = L_FRAME16k; + for ( i = 0; i < 1; i++ ) + { + temp_p1_p2 = dotp( temp_numer1 + i * length, temp_numer2 + i * length, length ); + temp_p1_p3 = dotp( temp_numer2 + i * length, temp_numer2 + i * length, length ); + vf_modified[i] = min( max( ( temp_p1_p2 / temp_p1_p3 ), 0.1f ), 0.99f ); + } + + *vf_ind = usquant( vf_modified[0], &temp_p1_p2, 0.125, 0.125, 1 << NUM_BITS_SHB_VF ); + set_f( vf_modified, temp_p1_p2, NB_SUBFR16k ); + + return; +} + +/*-------------------------------------------------------------------* + * tbe_celp_exc() * + * * + * Prepare adaptive part of TBE excitation * + *-------------------------------------------------------------------*/ + +void tbe_celp_exc( + const int16_t element_mode, /* i : element mode */ + const int16_t idchan, /* i : channel ID */ + float *bwe_exc, /* i/o: BWE excitation */ + const int16_t L_frame, /* i : frame length */ + const int16_t L_subfr, /* i : subframe length */ + const int16_t i_subfr, /* i : subframe index */ + const int16_t T0, /* i : integer pitch lag */ + const int16_t T0_frac, /* i : fraction of lag */ + float *error, /* i/o: error */ + const int16_t tdm_LRTD_flag /* i : LRTD stereo mode flag */ +) +{ + int16_t i, offset; + + if ( element_mode == IVAS_CPE_TD && idchan == 1 && !tdm_LRTD_flag ) + { + return; + } + + assert( bwe_exc != NULL && "BWE excitation is NULL" ); + + if ( L_frame == L_FRAME ) + { + offset = tbe_celp_exc_offset( T0, T0_frac ); + + for ( i = 0; i < L_subfr * HIBND_ACB_L_FAC; i++ ) + { + bwe_exc[i + i_subfr * HIBND_ACB_L_FAC] = bwe_exc[i + i_subfr * HIBND_ACB_L_FAC - offset + (int16_t) *error]; + } + *error += (float) offset - (float) T0 * HIBND_ACB_L_FAC - 0.25f * HIBND_ACB_L_FAC * (float) T0_frac; + } + else + { + offset = T0 * 2 + (int16_t) ( (float) T0_frac * 0.5f + 4 + 0.5f ) - 4; + for ( i = 0; i < L_subfr * 2; i++ ) + { + bwe_exc[i + i_subfr * 2] = bwe_exc[i + i_subfr * 2 - offset + (int16_t) *error]; + } + *error += (float) offset - (float) T0 * 2 - 0.5f * (float) T0_frac; + } + + return; +} + +/*-------------------------------------------------------------------* + * prep_tbe_exc() * + * * + * Prepare TBE excitation * + *-------------------------------------------------------------------*/ + +void prep_tbe_exc( + const int16_t L_frame, /* i : length of the frame */ + const int16_t L_subfr, /* i : subframe length */ + const int16_t i_subfr, /* i : subframe index */ + const float gain_pit, /* i : Pitch gain */ + const float gain_code, /* i : algebraic codebook gain */ + const float code[], /* i : algebraic excitation */ + const float voice_fac, /* i : voicing factor */ + float *voice_factors, /* o : TBE voicing factor */ + float bwe_exc[], /* i/o: excitation for TBE */ + const float gain_preQ, /* i : prequantizer excitation gain*/ + const float code_preQ[], /* i : prequantizer excitation */ + const int16_t T0, /* i : integer pitch variables */ + const int16_t coder_type, /* i : coding type */ + const int32_t core_brate, /* i : core bitrate */ + const int16_t element_mode, /* i : element mode */ + const int16_t idchan, /* i : channel ID */ + const int16_t flag_TD_BWE, /* i : flag indicating whether hTD_BWE exists */ + const int16_t tdm_LRTD_flag /* i : LRTD stereo mode flag */ +) +{ + int16_t i; + float tmp_code[2 * L_SUBFR * HIBND_ACB_L_FAC]; + float tmp_code_preInt[L_SUBFR]; + float tmp = 1.0f; + + *voice_factors = VF_0th_PARAM + VF_1st_PARAM * voice_fac + VF_2nd_PARAM * voice_fac * voice_fac; + + if ( ( coder_type == VOICED || T0 > 115.5f ) && core_brate > ACELP_8k00 ) + { + tmp = 1.0f; + *voice_factors *= tmp; + } + + *voice_factors = min( max( 0.000001f, *voice_factors ), 0.999999f ); + + if ( element_mode == IVAS_CPE_TD && idchan == 1 && !tdm_LRTD_flag ) + { + if ( flag_TD_BWE && i_subfr == 0 ) + { + set_f( bwe_exc, 0, L_FRAME32k ); + } + + return; + } + + if ( L_frame == L_FRAME ) + { + interp_code_5over2( code, tmp_code, L_subfr ); + + for ( i = 0; i < L_subfr * HIBND_ACB_L_FAC; i++ ) + { + bwe_exc[i + i_subfr * HIBND_ACB_L_FAC] = gain_pit * bwe_exc[i + i_subfr * HIBND_ACB_L_FAC] + + gain_code * tmp_code[i]; + } + } + else + { + for ( i = 0; i < L_subfr; i++ ) + { + tmp_code_preInt[i] = gain_code * code[i] + 2 * gain_preQ * code_preQ[i]; + } + + interp_code_4over2( tmp_code_preInt, tmp_code, L_subfr ); + + for ( i = 0; i < L_subfr * 2; i++ ) + { + bwe_exc[i + i_subfr * 2] = gain_pit * bwe_exc[i + i_subfr * 2] + tmp_code[i]; + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * get_tbe_bits() * + * * + * Determine TBE bit consumption per frame from bitrate * + *-------------------------------------------------------------------*/ + +int16_t get_tbe_bits( + const int32_t total_brate, + const int16_t bwidth, + const int16_t rf_mode ) +{ + int16_t i, bits = 0; + + if ( rf_mode ) + { + /* TBE bits for core, primary frame */ + if ( bwidth == WB && total_brate == ACELP_13k20 ) + { + /* Gain frame: 4, Gain shapes: 0, and LSFs: 2 */ + bits = NUM_BITS_SHB_FrameGain_LBR_WB + NUM_BITS_LBR_WB_LSF; + } + else if ( bwidth == SWB && total_brate == ACELP_13k20 ) + { + /* Gain frame: 5, Gain shapes: 5, and lowrate LSFs: 8 */ + bits = NUM_BITS_SHB_FRAMEGAIN + NUM_BITS_SHB_SUBGAINS + 8; + } + } + else + { + if ( bwidth == WB && total_brate == ACELP_9k60 ) + { + bits = NUM_BITS_LBR_WB_LSF + NUM_BITS_SHB_FrameGain_LBR_WB; + } + else if ( bwidth == SWB || bwidth == FB ) + { + if ( total_brate == ACELP_9k60 ) + { + bits = NUM_BITS_SHB_FRAMEGAIN + NUM_BITS_SHB_SUBGAINS + 8; + } + else if ( total_brate >= ACELP_13k20 && total_brate <= ACELP_32k ) + { + bits = NUM_BITS_SHB_SUBGAINS + NUM_BITS_SHB_FRAMEGAIN + NUM_LSF_GRID_BITS + MIRROR_POINT_BITS; + + for ( i = 0; i < NUM_Q_LSF; i++ ) + { + bits += lsf_q_num_bits[i]; + } + } + + if ( total_brate >= ACELP_24k40 ) + { + bits += NUM_BITS_SHB_ENER_SF + NUM_BITS_SHB_VF + NUM_BITS_SHB_RES_GS * NB_SUBFR16k; + } + + if ( bwidth == SWB && ( total_brate == ACELP_16k40 || total_brate == ACELP_24k40 ) ) + { + bits += BITS_TEC + BITS_TFA; + } + + if ( bwidth == FB ) + { + /* fullband slope */ + bits += 4; + } + } + } + + return bits; +} diff --git a/lib_com/syn_12k8.c b/lib_com/syn_12k8.c new file mode 100644 index 0000000000000000000000000000000000000000..7d670e1a3fff4bcee8d991f784d8e1248557a19a --- /dev/null +++ b/lib_com/syn_12k8.c @@ -0,0 +1,69 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "prot.h" +#include "wmc_auto.h" + +/*------------------------------------------------------------------ + * syn_12k8() + * + * perform the synthesis filtering 1/A(z) + *------------------------------------------------------------------*/ + +void syn_12k8( + const int16_t L_frame, /* i : length of the frame */ + const float *Aq, /* i : LP filter coefficients */ + const float *exc, /* i : input signal */ + float *synth, /* o : output signal */ + float *mem, /* i/o: initial filter states */ + const int16_t update_m /* i : update memory flag: 0 --> no memory update */ + ) /* 1 --> update of memory */ +{ + const float *p_Aq; + int16_t i_subfr; + + p_Aq = Aq; /* pointer to interpolated LPC parameters */ + for ( i_subfr = 0; i_subfr < L_frame; i_subfr += L_SUBFR ) + { + syn_filt( p_Aq, M, &exc[i_subfr], &synth[i_subfr], L_SUBFR, mem, update_m ); + p_Aq += ( M + 1 ); /* interpolated LPC parameters for next subframe */ + } + + return; +} diff --git a/lib_com/syn_filt.c b/lib_com/syn_filt.c new file mode 100644 index 0000000000000000000000000000000000000000..9b766c1bc0cd2efb0e86105a7ba762c105e3849a --- /dev/null +++ b/lib_com/syn_filt.c @@ -0,0 +1,170 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" +#include + +/*------------------------------------------------------------------* + * syn_filt() + * + * perform the synthesis filtering 1/A(z) + *------------------------------------------------------------------*/ + +void syn_filt( + const float a[], /* i : LP filter coefficients */ + const int16_t m, /* i : order of LP filter */ + const float x[], /* i : input signal */ + float y[], /* o : output signal */ + const int16_t l, /* i : size of filtering */ + float mem[], /* i/o: initial filter states */ + const int16_t update_m /* i : update memory flag: 0 --> no memory update */ + ) /* 1 --> update of memory */ +{ + int16_t i, j; + float buf[L_FRAME48k + L_FRAME48k / 2 + TCXLTP_LTP_ORDER]; /* temporary synthesis buffer */ + float s, *yy; + + yy = &buf[0]; + + /*------------------------------------------------------------------* + * copy initial filter states into synthesis buffer and do synthesis + *------------------------------------------------------------------*/ + + for ( i = 0; i < m; i++ ) + { + *yy++ = mem[i]; + } + + /*-----------------------------------------------------------------------* + * Do the filtering + *-----------------------------------------------------------------------*/ + + for ( i = 0; i < l; i++ ) + { + s = x[i]; + for ( j = 1; j <= m; j++ ) + { + s -= a[j] * yy[i - j]; + } + + yy[i] = s; + y[i] = s; + } + + /*------------------------------------------------------------------* + * Update memory if required + *------------------------------------------------------------------*/ + + if ( update_m ) + { + for ( i = 0; i < m; i++ ) + { + mem[i] = yy[l - m + i]; + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * synth_mem_updt2() + * + * Update of synthesis filter memories in case of ACELP@12k8 <-> ACELP@16k switching + *--------------------------------------------------------------------*/ + +void synth_mem_updt2( + const int16_t L_frame, /* i : frame length */ + const int16_t last_L_frame, /* i : frame length */ + float old_exc[], /* i/o: excitation buffer */ + float mem_syn_r[], /* i/o: synthesis filter memory */ + float mem_syn2[], /* o : synthesis filter memory for find_target */ + float mem_syn[], /* o : synthesis filter memory for find_target */ + const int16_t dec /* i : flag for decoder indication */ +) +{ + int16_t mem_syn_r_size_old, mem_syn_r_size_new; + int16_t i; + float en1, en2, loc_rat; + + /* Residual and update old_exc */ + if ( dec >= DEC ) + { + lerp( old_exc + L_EXC_MEM_DEC - ( last_L_frame + last_L_frame / 2 ), old_exc + L_EXC_MEM_DEC - ( L_frame + L_frame / 2 ), L_frame + L_frame / 2, last_L_frame + last_L_frame / 2 ); + } + else + { + lerp( old_exc + L_EXC_MEM - last_L_frame, old_exc + L_EXC_MEM - L_frame, L_frame, last_L_frame ); + } + + /*Resamp memory*/ + /*Size of LPC syn memory*/ + mem_syn_r_size_old = (int16_t) ( 1.25 * last_L_frame / 20.f ); + mem_syn_r_size_new = (int16_t) ( 1.25 * L_frame / 20.f ); + + lerp( mem_syn_r + L_SYN_MEM - mem_syn_r_size_old, mem_syn_r + L_SYN_MEM - mem_syn_r_size_new, mem_syn_r_size_new, mem_syn_r_size_old ); + + if ( dec == DEC_IVAS ) + { + if ( L_frame == L_FRAME16k ) + { + /* find scaling factor */ + en1 = 1.25f * sum2_f( mem_syn2, M ); + en2 = sum2_f( mem_syn_r + L_SYN_MEM - M, M ); + + loc_rat = sqrtf( en2 ) / ( sqrtf( en1 ) + 0.01f ); + /* scale synthesis filter memory */ + for ( i = 0; i < M; i++ ) + { + mem_syn_r[L_SYN_MEM - M + i] *= loc_rat; + } + } + } + + mvr2r( mem_syn_r + L_SYN_MEM - M, mem_syn2, M ); + + if ( mem_syn != NULL ) + { + mvr2r( mem_syn2, mem_syn, M ); + } + + return; +} diff --git a/lib_com/tcq_position_arith.c b/lib_com/tcq_position_arith.c new file mode 100644 index 0000000000000000000000000000000000000000..a1a2d39ab3060fcb2bce6c9494205389e7841e09 --- /dev/null +++ b/lib_com/tcq_position_arith.c @@ -0,0 +1,2195 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "prot.h" +#include "rom_com.h" +#include "basop_util.h" +#include "basop_proto_func.h" +#include "wmc_auto.h" + + +static void bitstream_save_bit( TCQ_PBITSTREAM pBS, const int16_t bit ); +static uint32_t bitstream_load_bit( TCQ_PBITSTREAM pBS ); +static void bitstream_rollback( TCQ_PBITSTREAM pBS, int16_t numBits ); + +static int32_t ar_make_model( const int16_t *freq, int16_t *model, const int16_t len ); +static int32_t ar_decode( PARCODEC arInst, const int16_t *model ); +static void ar_encode( PARCODEC arInst, const int16_t *model, int32_t symbol ); +static void ar_encode_uniform( PARCODEC arInst, uint16_t data, const int16_t bits ); + + +/* 32x16 multiply: */ +Word32 Mult_32_16( Word32 a, Word16 b ) +{ + Word32 result; + UWord16 lo; + /* use Mpy_32_16_ss(): */ + Mpy_32_16_ss( a, b, &result, &lo ); + + return result; +} + +/* 32x32 multiply: */ +Word32 Mult_32_32( Word32 a, Word32 b ) +{ + Word32 result; + UWord32 lo; + /* use Mpy_32_32_ss(): */ + Mpy_32_32_ss( a, b, &result, &lo ); + + return result; +} + +static void set16_fx( + Word16 y[], /* i/o: Vector to set */ + const Word16 a, /* i : Value to set the vector to */ + const Word16 N /* i : Lenght of the vector */ +) +{ + Word16 i; + + for ( i = 0; i < N; i++ ) + { + y[i] = a; + } + + return; +} + +static void set32_fx( + Word32 y[], /* i/o: Vector to set */ + const Word32 a, /* i : Value to set the vector to */ + const Word16 N /* i : Lenght of the vector */ +) +{ + Word16 i; + for ( i = 0; i < N; i++ ) + { + y[i] = a; + } + + return; +} + +Word32 ar_div( + Word32 num, + Word32 denum ) +{ + Word16 exp1, exp2, exp, i; + Word32 varout; + Word32 sign; + + sign = L_and( L_xor( num, denum ), 0x80000000 ); + + num = L_abs( num ); + denum = L_abs( denum ); + + if ( L_sub( num, denum ) < 0 || denum == 0 ) + { + return 0; + } + else if ( L_sub( num, denum ) == 0 ) + { + return 1; + } + else + { + exp1 = norm_l( num ); + exp2 = norm_l( denum ); + exp = sub( exp2, exp1 ); + denum = L_shl( denum, exp ); + exp = add( exp, 1 ); + varout = 0; + for ( i = 0; i < exp; i++ ) + { + num = L_sub( num, denum ); + varout = L_shl( varout, 1 ); + if ( num >= 0 ) + { + num = L_shl( num, 1 ); + varout = L_add( varout, 1 ); + } + else + { + num = L_add( num, denum ); + num = L_shl( num, 1 ); + } + } + } + + if ( sign != 0 ) + { + varout = L_negate( varout ); + } + + return varout; +} + +void srt_vec_ind_fx( + const Word32 *linear, /* linear input */ + Word32 *srt, /* sorted output*/ + Word16 *I, /* index for sorted output */ + Word16 length ) +{ + Word16 pos, npos; + Word16 idxMem; + Word32 valMem; + + /*initialize */ + for ( pos = 0; pos < length; pos++ ) + { + I[pos] = pos; + } + + for ( pos = 0; pos < length; pos++ ) + { + srt[pos] = linear[pos]; + } + + /* now iterate */ + for ( pos = 0; pos < ( length - 1 ); pos++ ) + { + for ( npos = ( pos + 1 ); npos < length; npos++ ) + { + if ( L_sub( srt[npos], srt[pos] ) < 0 ) + { + idxMem = I[pos]; + I[pos] = I[npos]; + I[npos] = idxMem; + + valMem = srt[pos]; + srt[pos] = srt[npos]; + srt[npos] = valMem; + } + } + } + + return; +} + +static Word32 GetBitsFromPulses_fx( + Word16 m, + Word16 n ) +{ + Word16 i, integer_fx, temp_fx1, temp_fx2, exp1, exp2; + Word32 temp32; + Word32 frac_fx32; + Word32 logCoeff_fx; + Word16 exp = 0; + Word32 mantissa_fx = 0; + + if ( m == 0 ) + { + return 0; + } + + for ( i = 0; i < min( m, n ); i++ ) + { + logCoeff_fx = L_add( L_shl( i + 1, 16 ), L_sub( table_logcum_fx[n + 1], L_add( table_logcum_fx[i + 2], table_logcum_fx[n - i] ) ) ); + logCoeff_fx = L_add( logCoeff_fx, L_sub( table_logcum_fx[m], L_add( table_logcum_fx[i + 1], table_logcum_fx[m - i] ) ) ); /*Q16 */ + + integer_fx = extract_h( logCoeff_fx ); /*Q0 */ + frac_fx32 = L_sub( logCoeff_fx, L_shl( integer_fx, 16 ) ); /*Q16 */ + + /*ln2, 0.987, ln2 * ln2, 0.977 */ + /*temp1 = (long) (frac / 0.0625); */ + /*temp2 = frac - (float)temp1 * 0.0625f; */ + + /* frac = pow(2.0, temp1 * 0.0625) * (1 + 0.693 * temp2 + 0.480 * temp2 * temp2 * 0.5);*/ + /*frac = pow_getbitsfrompulses[temp1] * (1 + 0.693f * temp2 + 0.480f * temp2 * temp2 * 0.5f); */ + + temp_fx1 = extract_h( L_shl( frac_fx32, 4 ) ); + temp_fx2 = extract_l( L_and( frac_fx32, 0xfff ) ); /*Q16 */ + + frac_fx32 = L_add( L_mult( temp_fx2, 22708 ), Mult_32_16( L_mult0( temp_fx2, temp_fx2 ), 7864 ) ); /*Q32 */ + frac_fx32 = L_add( 0x40000000, L_shr( frac_fx32, 2 ) ); /*30 */ + + exp1 = norm_l( pow_getbitsfrompulses_fx[temp_fx1] ); + exp2 = norm_l( frac_fx32 ); + frac_fx32 = Mult_32_32( L_shl( pow_getbitsfrompulses_fx[temp_fx1], exp1 ), L_shl( frac_fx32, exp2 ) ); /*21 + exp1 + 30 + exp2 - 31 */ + frac_fx32 = L_shr( frac_fx32, exp1 + exp2 ) + 1; /*20 */ + + if ( sub( exp, integer_fx ) < 0 ) + { + mantissa_fx = L_shr( mantissa_fx, sub( integer_fx, exp ) ); + mantissa_fx = L_add( mantissa_fx, frac_fx32 ); + + exp = integer_fx; + } + else + { + mantissa_fx = L_add( mantissa_fx, L_shr( frac_fx32, sub( exp, integer_fx ) ) ); + } + if ( L_sub( mantissa_fx, 0x200000 ) >= 0 ) + { + exp++; + + mantissa_fx = L_shr( mantissa_fx, 1 ); + } + } + + mantissa_fx = L_shl( mantissa_fx, 2 ); /*22 */ + temp_fx1 = extract_h( mantissa_fx ); + temp32 = L_shl( L_sub( mantissa_fx, L_deposit_h( temp_fx1 ) ), 15 ); /*31 */ + exp1 = sub( norm_l( temp32 ), 1 ); + temp32 = ar_div( L_shl( temp32, exp1 ), temp_fx1 ); /*31 + exp1 */ + temp32 = L_shr( temp32, exp1 + 1 ); /*30 */ + + frac_fx32 = L_sub( 0x40000000, L_shr( temp32, 1 ) ); /*30 */ + frac_fx32 = Mult_32_32( frac_fx32, temp32 ); /*29 */ + frac_fx32 = L_shr( frac_fx32, 13 ); /*16 */ + exp1 = norm_l( temp_fx1 ); + temp_fx1 = Log2_norm_lc( L_shl( temp_fx1, exp1 ) ); /*15 */ + frac_fx32 = frac_fx32 + Mult_32_32( frac_fx32, 950680361 ); /* frac_fx32 *= 1/ln(2) */ + return L_add( L_deposit_h( exp ), L_add( L_shl( temp_fx1, 1 ), frac_fx32 ) ); +} + +void decode_position_ari_fx( + PARCODEC pardec, + Word16 size, + Word16 npulses, + Word16 *nz, + Word32 *position ) +{ + Word16 i, nzp; + Word16 mode_num_nz[TCQ_MAX_BAND_SIZE]; + Word16 prob[TCQ_MAX_BAND_SIZE]; + + Word32 btcq_fx, pnzp_fx; + Word16 integer, frac; + + Word32 cp, scp, fxone, fxp1; + Word16 stpos = 0, pos, ovrflag, temppos, storepos; + + fxone = 32768; + fxp1 = 512 * 32768; + temppos = 0; + storepos = 0; + ovrflag = 0; + + set16_fx( mode_num_nz, 0, TCQ_MAX_BAND_SIZE ); + set16_fx( prob, 0, TCQ_MAX_BAND_SIZE ); + + for ( i = 0; i < size; i++ ) + { + position[i] = 0; + } + + if ( L_sub( npulses, 1 ) > 0 ) + { + btcq_fx = GetBitsFromPulses_fx( npulses, size ); + for ( i = 0; i < L_min( npulses, size ); i++ ) + { + /*calculate the probability of #nz */ + + pnzp_fx = L_sub( L_deposit_h( add( i, 1 ) ), btcq_fx ); + pnzp_fx = L_add( pnzp_fx, L_add( L_sub( table_logcum_fx[size + 1], L_add( table_logcum_fx[i + 2], table_logcum_fx[size - i] ) ), L_sub( table_logcum_fx[npulses], L_add( table_logcum_fx[i + 1], table_logcum_fx[npulses - i] ) ) ) ); + pnzp_fx = L_add( pnzp_fx, 917498 ); /*16 */ + if ( L_sub( pnzp_fx, 0 ) > 0 ) + { + integer = extract_h( pnzp_fx ); + frac = extract_l( L_shr( L_sub( pnzp_fx, L_deposit_h( integer ) ), 1 ) ); /*15 */ + prob[i] = extract_h( L_shl( Pow2( integer, frac ), 16 ) ); /*0 */ + if ( prob[i] == 0 ) + { + prob[i] = 1; + } + } + else + { + prob[i] = 1; + } + } + + ar_make_model( prob, mode_num_nz, min( npulses, size ) ); + *nz = add( 1, (Word16) ar_decode( pardec, mode_num_nz ) ); /*get #nz */ + nzp = *nz; + + if ( nzp == 1 ) + { + Word16 tmp; + mode_num_nz[0] = MAX_AR_FREQ; + for ( i = 0; i < size; i++ ) + { + tmp = div_l( L_deposit_h( size - i - 1 ), size ); + mode_num_nz[i + 1] = round_fx( L_shr( L_deposit_h( tmp ), 1 ) ); + } + + position[ar_decode( pardec, mode_num_nz )] = 1; + } + else + { + Word16 tmp; + mode_num_nz[0] = MAX_AR_FREQ; + + for ( ; nzp > 0; nzp-- ) + { + scp = fxp1; + temppos = 0; + storepos = 0; + + for ( i = stpos; i < size; i++ ) + { + ovrflag = 0; + + if ( nzp == ( size - i ) ) + { + cp = 0; + } + else + { + tmp = div_l( L_deposit_h( nzp ), ( size - i ) ); + cp = L_sub( fxone, tmp ); + } + scp = Mult_32_16( scp, extract_l( cp ) ); + mode_num_nz[i + 1 - storepos - stpos] = round_fx( L_shl( scp, 6 ) ); + + if ( ( mode_num_nz[i + 1 - storepos - stpos] == 0 && scp > 0 ) || mode_num_nz[i - storepos - stpos] == mode_num_nz[i + 1 - storepos - stpos] ) + { + ovrflag = 1; + temppos = (Word16) ar_decode( pardec, mode_num_nz ); + storepos += temppos; + scp = fxp1; + + if ( temppos == i - stpos ) /* esc transmitted */ + { + i--; + } + else + { + break; + } + } + } + if ( !ovrflag ) + { + pos = (Word16) ar_decode( pardec, mode_num_nz ) + storepos; + } + else + { + pos = storepos; + } + + position[stpos + pos] = 1; + stpos += pos + 1; + } + } + } + else if ( L_sub( npulses, 1 ) == 0 ) + { + Word16 tmp; + *nz = npulses; + nzp = *nz; + mode_num_nz[0] = MAX_AR_FREQ; + for ( i = 0; i < size; i++ ) + { + tmp = div_l( L_deposit_h( size - i - 1 ), size ); + mode_num_nz[i + 1] = round_fx( L_shr( L_deposit_h( tmp ), 1 ) ); + } + + position[ar_decode( pardec, mode_num_nz )] = 1; + } + else + { + *nz = 0; + } + + return; +} + + +void decode_magnitude_usq_fx( + ARCODEC *pardec, + Word16 size, + Word16 npulses, + Word16 nzpos, + Word32 *positions, + Word32 *out ) +{ + Word16 i, magnp, magnzp; + Word16 magns[TCQ_MAX_BAND_SIZE], magncout = 0; + + Word16 storemagn, ovrflag, pos, tempmagn = 0, mmodel[MAX_PULSES + 2]; + Word32 cp, scp, fxone, fxp1; + + fxone = 32768; + fxp1 = 512 * 32768; + ovrflag = 0; + + + set16_fx( magns, 1, TCQ_MAX_BAND_SIZE ); + if ( sub( nzpos, npulses ) == 0 ) + { + for ( i = 0; i < size; i++ ) + { + out[i] = positions[i]; + } + return; + } + else if ( sub( nzpos, 1 ) == 0 ) + { + for ( i = 0; i < size; i++ ) + { + if ( positions[i] != 0 ) + { + out[i] = npulses; + return; + } + } + } + + magnzp = sub( nzpos, 1 ); + magnp = sub( npulses, 1 ); + + magncout = 0; + + set32_fx( out, 0, size ); + set16_fx( mmodel, 0, MAX_PULSES + 2 ); + + mmodel[0] = MAX_AR_FREQ; + magncout = 0; + for ( pos = 0; pos < size; pos++ ) + { + scp = fxp1; + if ( positions[pos] != 0 ) + { + storemagn = 0; + + for ( i = 0; i < magnp; i++ ) + { + ovrflag = 0; + + if ( magnzp == ( magnp - i ) ) + { + cp = 0; + } + else + { + Word16 tmp; + tmp = div_l( L_deposit_h( magnzp ), magnp - i ); + cp = L_sub( fxone, tmp ); + } + + if ( cp == fxone ) + { + break; + } + + scp = Mult_32_16( scp, extract_l( cp ) ); + mmodel[i + 1 - storemagn] = round_fx( L_shl( scp, 6 ) ); + + if ( ( mmodel[i + 1 - storemagn] == 0 && scp > 0 ) || mmodel[i - storemagn] == mmodel[i + 1 - storemagn] ) + { + mmodel[i + 1 - storemagn] = 0; + /* read data */ + tempmagn = (Word16) ar_decode( pardec, mmodel ); + storemagn += tempmagn; + + if ( tempmagn < i ) + { + /* just magnitude */ + ovrflag = 1; + break; + } + else + { + /* esc code */ + scp = fxp1; + i--; + } + } + } + + if ( ovrflag ) + { + out[magncout] = storemagn + 1; + } + else + { + out[magncout] = ar_decode( pardec, mmodel ) + storemagn + 1; + } + magnp -= (Word16) out[magncout]; + magnzp--; + magncout++; + + if ( magnzp == 0 ) /* last magnitude generation */ + { + for ( pos = pos + 1; pos < size; pos++ ) + { + if ( positions[pos] != 0 ) + { + out[magncout] = magnp + 1; + return; + } + else + { + out[magncout] = 0; + magncout++; + } + } + } + else if ( magnzp == magnp ) /* rest magnitudes generation */ + { + for ( pos = pos + 1; pos < size; pos++ ) + { + out[magncout] = positions[pos]; + magncout++; + } + return; + } + } + else + { + out[magncout] = 0; + magncout++; + } + } + + return; +} + +static Word16 quantize_fx( + Word16 val, + Word16 D ) +{ + Word16 qval4_fx; + Word16 retval_fx; + + qval4_fx = shr( abs_s( add( val, 512 ) ), 12 ); + retval_fx = add( shl( qval4_fx, 2 ), DDP_fx[D] ); + /* 2nd zero check */ + if ( D == 0 ) + { + if ( sub( abs_s( sub( shl( abs_s( retval_fx ), 10 ), abs_s( val ) ) ), abs_s( val ) ) > 0 ) + { + retval_fx = 0; + } + } + + return retval_fx; +} + +void decode_mangitude_tcq_fx( + ARCODEC *pardec, + Word16 size, + Word16 npulses, + Word16 nzpos, + Word32 *positions, + Word32 *out, + Word32 *surplus_fx ) +{ + Word32 tcq_bits_fx, bits_fx /*, surplus_fx*/; + Word16 prob0_fx, prob1_fx, num, denum, quantum1_fx, quantum2_fx; + Word16 exp, exp1, exp2, tmp16; + Word32 tmp32; + + Word16 i, j, symbol, st; + Word16 leftp = npulses; /*pulsesnum; */ + Word16 leftnz = nzpos; /*nzpos; */ + Word16 magn_mode[3] = { MAX_AR_FREQ, 0, 0 }; + + bits_fx = 0; + tcq_bits_fx = L_sub( table_logcum_fx[npulses], L_add( table_logcum_fx[nzpos], table_logcum_fx[npulses - ( nzpos - 1 )] ) ); + + if ( sub( nzpos, npulses ) == 0 ) + { + for ( i = 0; i < size; i++ ) + { + out[i] = positions[i]; + } + + return; + } + else if ( sub( nzpos, 1 ) == 0 ) + { + for ( i = 0; i < size; i++ ) + { + if ( positions[i] != 0 ) + { + out[i] = npulses; + return; + } + } + } + st = 0; + for ( i = 0; i < size && leftnz > 1; i++ ) + { + out[i] = positions[i]; + if ( positions[i] != 0 ) + { + /*generate the trellis path */ + symbol = 0; + for ( j = 0; j < leftp; j++ ) + { + num = sub( leftnz, 1 ); + denum = sub( leftp, add( j, 1 ) ); + if ( sub( num, denum ) >= 0 ) + { + prob1_fx = MAX_16; + prob0_fx = 0; + } + else + { + exp1 = sub( norm_s( num ), 1 ); + exp2 = norm_s( denum ); + prob1_fx = div_s( shl( num, exp1 ), shl( denum, exp2 ) ); /*15 + exp1 - exp2 */ + exp = 15 + exp1 - exp2; + prob1_fx = shl( prob1_fx, sub( 15, exp ) ); + prob0_fx = sub( MAX_16, prob1_fx ); + } + if ( L_sub( sub( leftp, j ), leftnz ) == 0 ) + { + symbol = add( j, 1 ); + break; + } + + quantum1_fx = quantize_fx( shl( add( j, 1 ), 10 ), ddec[st][0] ); + quantum2_fx = quantize_fx( shl( add( j, 1 ), 10 ), ddec[st][1] ); + + if ( sub( quantum1_fx, add( j, 1 ) ) != 0 && sub( quantum2_fx, add( j, 1 ) ) != 0 ) + { + prob0_fx = MAX_16; + move16(); + prob1_fx = 0; + move16(); + } + if ( sub( prob0_fx, MAX_16 ) == 0 || sub( prob1_fx, MAX_16 ) == 0 ) + { + symbol = add( j, 1 ); + continue; + } + + /*magn_mode[1] = (int16_t)(prob1 * MAX_AR_FREQ); */ + magn_mode[1] = mult( prob1_fx, MAX_AR_FREQ ); + + if ( ar_decode( pardec, magn_mode ) ) + { + exp1 = norm_s( prob1_fx ); + tmp32 = L_deposit_h( shl( prob1_fx, exp1 ) ); /*exp1 + 15 + 16 */ + tmp16 = Log2_norm_lc( tmp32 ); /*15 */ + bits_fx = L_sub( bits_fx, L_sub( tmp16, L_shl( add( exp1, 1 ), 15 ) ) ); /*15 */ + + symbol = add( j, 1 ); + break; + } + else + { + exp1 = norm_s( prob0_fx ); + tmp32 = L_deposit_h( shl( prob0_fx, exp1 ) ); /*exp1 + 15 + 16 */ + tmp16 = Log2_norm_lc( tmp32 ); /*15 */ + bits_fx = L_sub( bits_fx, L_sub( tmp16, L_shl( add( exp1, 1 ), 15 ) ) ); /*15 */ + } + } + out[i] = symbol; + /*leftp -= symbol; */ + leftp = sub( leftp, symbol ); + leftnz--; + } + + quantum1_fx = quantize_fx( (Word16) out[i], ddec[st][0] ); + quantum2_fx = quantize_fx( (Word16) out[i], ddec[st][1] ); + + /*generate the next state */ + if ( sub( quantum1_fx, (Word16) out[i] ) == 0 ) + { + st = nextstate[st][0]; + } + else + { + st = nextstate[st][1]; + } + } + + /*generate the magnitudes */ + for ( ; i < size; i++ ) + { + out[i] = 0; + if ( positions[i] != 0 ) + { + out[i] = add( sub( leftp, leftnz ), 1 ); + } + } + + if ( sub( nzpos, npulses ) != 0 && sub( nzpos, 1 ) > 0 ) + { + /*update the surplus */ + *surplus_fx = L_add( *surplus_fx, L_sub( tcq_bits_fx, L_shl( bits_fx, 1 ) ) ); + } + + return; +} + +Word16 GetScale_fx( + Word16 blen, + Word32 bits_fx /*Q16*/, + Word32 *surplus_fx /*Q16*/ +) +{ + Word16 pulses = MAX_PULSES, p_est, exp, exp1, exp2, magicnum, tmp; + Word32 t, a, b, ab, estbits_fx = 0; + + magicnum = 24773; /*Q17: 0.188992013101951f; */ + + t = L_shr( L_mult( magicnum, blen ), 2 ); + exp = norm_l( t ); + a = L_shl( 14 - exp, 15 ) + Log2_norm_lc( L_shl( t, exp ) ); + + exp1 = sub( norm_l( bits_fx ), 1 ); + exp2 = norm_s( blen - 1 ); + + tmp = div_l( L_shl( bits_fx, exp1 ), shl( blen - 1, exp2 ) ); + b = L_shr( L_deposit_l( tmp ), exp1 - exp2 ); + + ab = L_add( a, b ); + + p_est = extract_h( L_shl( Pow2( extract_l( L_shr( ab, 15 ) ), ab & 0x7FFF ), 16 ) ); /* enable saturation of pow2 result */ + + pulses = min( p_est, MAX_PULSES ); + + for ( ; pulses >= 0; pulses-- ) + { + estbits_fx = GetBitsFromPulses_fx( pulses, blen ); + if ( L_sub( bits_fx, estbits_fx ) >= 0 ) + { + break; + } + } + + if ( surplus_fx != NULL ) + { + *surplus_fx = L_add( *surplus_fx, L_sub( bits_fx, estbits_fx ) ); + } + + return pulses; +} + + +void decode_signs_fx( + ARCODEC *pardec, + Word16 size, + Word32 *out ) +{ + Word16 i; + + for ( i = 0; i < size; i++ ) + { + if ( out[i] != 0 ) + { + out[i] = ( ar_decode( pardec, uniform_model ) > 0 ) ? out[i] : -out[i]; + } + } + + return; +} + +Word32 encode_position_ari_fx( + PARCODEC parenc, + float *quants, + Word16 size, + Word32 *est_bits_frame_fx ) +{ + Word16 i; + Word16 nz = 0, pulses = 0; + Word16 prob[TCQ_MAX_BAND_SIZE]; + Word16 model_num_nz[TCQ_MAX_BAND_SIZE]; + float *cur_quants = quants; + Word16 integer, frac; + Word32 /*est_bits_frame_fx, */ btcq_fx = 0, bits_fx = 0, pnzp_fx; + Word32 cp, scp, fxone, fxp1; + Word16 pos; + + fxone = 32768; + fxp1 = 512 * 32768; + + set16_fx( prob, 0, TCQ_MAX_BAND_SIZE ); + set16_fx( model_num_nz, 0, TCQ_MAX_BAND_SIZE ); + + for ( i = 0; i < size; i++ ) + { + pulses = add( pulses, abs_s( (int16_t) cur_quants[i] ) ); + if ( cur_quants[i] != 0 ) + { + nz++; + } + } + + btcq_fx = GetBitsFromPulses_fx( pulses, size ); + /* Estimate TCQ bits */ + bits_fx = L_sub( table_logcum_fx[size + 1], L_add( table_logcum_fx[nz + 1], table_logcum_fx[size - nz + 1] ) ); + bits_fx = L_add( bits_fx, L_sub( btcq_fx, L_sub( table_logcum_fx[size + 1], L_add( table_logcum_fx[nz + 1], table_logcum_fx[size - nz + 1] ) ) ) ); + bits_fx = L_sub( bits_fx, L_sub( table_logcum_fx[pulses], L_add( table_logcum_fx[nz], table_logcum_fx[pulses - ( nz - 1 )] ) ) ); + + bits_fx = L_sub( bits_fx, nz ); + *est_bits_frame_fx = L_add( *est_bits_frame_fx, bits_fx ); + + /*caculate the #nz probability */ + for ( i = 0; i < min( pulses, size ); i++ ) + { + pnzp_fx = L_sub( L_deposit_h( add( i, 1 ) ), btcq_fx ); + + pnzp_fx = L_add( pnzp_fx, L_add( L_sub( table_logcum_fx[size + 1], L_add( table_logcum_fx[i + 2], table_logcum_fx[size - i] ) ), L_sub( table_logcum_fx[pulses], L_add( table_logcum_fx[i + 1], table_logcum_fx[pulses - i] ) ) ) ); + + pnzp_fx = L_add( pnzp_fx, 917498 ); /*16 */ + if ( L_sub( pnzp_fx, 0 ) > 0 ) + { + integer = extract_h( pnzp_fx ); + frac = extract_l( L_shr( L_sub( pnzp_fx, L_deposit_h( integer ) ), 1 ) ); /*15 */ + prob[i] = extract_h( L_shl( Pow2( integer, frac ), 16 ) ); /*0 */ + + /*zero probability will incur problems in ar_make_model() */ + if ( prob[i] == 0 ) + { + prob[i] = 1; + } + } + else + { + prob[i] = 1; + } + } + + ar_make_model( prob, model_num_nz, min( pulses, size ) ); + + if ( sub( nz, 1 ) > 0 ) + { + ar_encode( parenc, model_num_nz, nz - 1 ); /*encode #nz */ + + scp = fxp1; + pos = 0; + for ( i = 0; i < size && nz > 0; i++ ) + { + if ( nz == ( size - i ) ) + { + cp = 0; + } + else + { + Word16 tmp; + tmp = div_l( L_deposit_h( nz ), ( size - i ) ); + cp = L_sub( fxone, tmp ); + } + scp = Mult_32_16( scp, extract_l( cp ) ); + model_num_nz[pos + 1] = round_fx( L_shl( scp, 6 ) ); + + if ( ( model_num_nz[pos + 1] == 0 && scp > 0 ) || model_num_nz[pos] == model_num_nz[pos + 1] ) + { + model_num_nz[pos + 1] = 0; + ar_encode( parenc, model_num_nz, pos ); + i--; + scp = fxp1; + pos = 0; + continue; + } + + if ( cur_quants[i] != 0 ) + { + ar_encode( parenc, model_num_nz, pos ); + pos = 0; + scp = fxp1; + nz--; + } + else + { + pos++; + } + } + } + else if ( sub( nz, 1 ) == 0 ) + { + if ( sub( pulses, 1 ) > 0 ) + { + /*temp -= log2_f((float)(model_num_nz[nz-1] - model_num_nz[nz]) / MAX_AR_FREQ); */ + ar_encode( parenc, model_num_nz, 0 ); /*encode #nz */ + } + + pos = 0; + for ( i = 0; i < size; i++ ) + { + Word16 tmp; + tmp = div_l( L_deposit_h( size - i - 1 ), size ); + model_num_nz[i + 1] = round_fx( L_shr( L_deposit_h( tmp ), 1 ) ); + + if ( cur_quants[i] != 0 ) + { + pos = i; + } + } + ar_encode( parenc, model_num_nz, pos ); /* encode pos */ + } + return bits_fx; +} + + +Word32 encode_magnitude_tcq_fx( + ARCODEC *parenc, + float *magn_fx, + Word16 size, + Word16 npulses, + Word16 nzpos, + Word32 *savedstates, + Word32 *est_frame_bits_fx ) +{ + Word32 tcq_bits_fx, bits_fx /*, est_frame_bits_fx*/; + Word16 prob0_fx, prob1_fx, num, denum, quantum1_fx, quantum2_fx; + Word16 exp, exp1, exp2; + + Word16 i, j; + Word32 st; + Word16 magn_mode[3] = { MAX_AR_FREQ, 0, 0 }; + + Word16 leftp = npulses; /*pulsesnum; */ + Word16 leftnz = nzpos; /*nzpos; */ + + bits_fx = 0; + + tcq_bits_fx = L_sub( table_logcum_fx[npulses], L_add( table_logcum_fx[nzpos], table_logcum_fx[npulses - ( nzpos - 1 )] ) ); + + *est_frame_bits_fx = L_add( *est_frame_bits_fx, tcq_bits_fx ); + + if ( sub( nzpos, npulses ) == 0 || sub( nzpos, 1 ) == 0 ) + { + return bits_fx; + } + + st = 0; + for ( i = 0; i < size && leftnz > 1; i++ ) + { + st = savedstates[i]; + if ( magn_fx[i] != 0 ) + { + for ( j = 0; j < leftp; j++ ) + { + /*calculate the two path probs point to next two states */ + num = sub( leftnz, 1 ); + denum = sub( leftp, add( j, 0x1 ) ); + if ( sub( num, denum ) >= 0 ) + { + prob1_fx = MAX_16; + prob0_fx = 0; + } + else + { + exp1 = sub( norm_s( num ), 1 ); + exp2 = norm_s( denum ); + prob1_fx = div_s( shl( num, exp1 ), shl( denum, exp2 ) ); /*15 + exp1 - exp2 */ + exp = 15 + exp1 - exp2; + prob1_fx = shl( prob1_fx, sub( 15, exp ) ); + prob0_fx = sub( MAX_16, prob1_fx ); + } + + quantum1_fx = quantize_fx( shl( add( j, 1 ), 10 ), ddec[st][0] ); + quantum2_fx = quantize_fx( shl( add( j, 1 ), 10 ), ddec[st][1] ); + + if ( sub( quantum1_fx, add( j, 1 ) ) != 0 && sub( quantum2_fx, add( j, 1 ) ) != 0 ) + { + prob0_fx = MAX_16; + prob1_fx = 0; + } + if ( sub( prob0_fx, MAX_16 ) == 0 || sub( prob1_fx, MAX_16 ) == 0 ) + { + continue; + } + + magn_mode[1] = mult( prob1_fx, MAX_AR_FREQ ); + if ( sub( j, sub( abs_s( (int16_t) magn_fx[i] ), 1 ) ) < 0 ) + { + ar_encode( parenc, magn_mode, 0 ); + } + else + { + if ( sub( leftp, j ) > leftnz ) + { + ar_encode( parenc, magn_mode, 1 ); + } + break; + } + } + + leftnz--; + leftp = sub( leftp, abs_s( (int16_t) magn_fx[i] ) ); + } + } + + return bits_fx; +} + + +Word32 encode_signs_fx( + ARCODEC *parenc, + float *magn, + Word16 size, + Word16 npos, + Word32 *est_frame_bits_fx ) +{ + Word32 i, sign; + + *est_frame_bits_fx = L_add( *est_frame_bits_fx, L_deposit_h( npos ) ); + for ( i = 0; i < size; i++ ) + { + if ( magn[i] != 0 ) + { + sign = ( magn[i] > 0 ) ? 1 : 0; + ar_encode_uniform( parenc, (uint16_t) sign, 1 ); + } + } + + return L_deposit_h( npos ); +} + + +Word32 encode_magnitude_usq_fx( + ARCODEC *parenc, + float *magn_fx, + Word16 size, + Word16 npulses, + Word16 nzpos, + Word32 *est_frame_bits_fx ) +{ + Word16 i, j, k, magnp, magnzp; + Word16 magn_position[MAX_PULSES]; + Word32 /*est_frame_bits_fx, */ bits_fx; + + Word16 pos, model_m[MAX_PULSES + 2]; + Word32 fxone, fxp1, cp, scp; + + fxone = 32768; + fxp1 = 512 * 32768; + + /*estimate fac bits */ + bits_fx = L_sub( table_logcum_fx[npulses], L_add( table_logcum_fx[nzpos], table_logcum_fx[npulses - nzpos + 1] ) ); + + *est_frame_bits_fx = L_add( *est_frame_bits_fx, bits_fx ); + + if ( sub( npulses, nzpos ) == 0 || sub( nzpos, 1 ) == 0 ) + { + return bits_fx; + } + magnp = sub( npulses, 1 ); + magnzp = sub( nzpos, 1 ); + + /*generate the binary sequences of magnitudes */ + k = 0; + for ( i = 0; i < size; i++ ) + { + if ( magn_fx[i] != 0 ) + { + for ( j = 0; j < abs_s( (int16_t) magn_fx[i] ) - 1; j++ ) + { + magn_position[k++] = 0; + } + magn_position[k++] = 1; + } + } + + set16_fx( model_m, 0, MAX_PULSES + 2 ); + scp = fxp1; + model_m[0] = MAX_AR_FREQ; + pos = 0; + for ( i = 0; i < npulses - 1 && magnzp > 0; i++ ) + { + if ( magnzp == magnp ) + { + cp = 0; + } + else + { + Word16 tmp; + tmp = div_l( L_deposit_h( magnzp ), magnp ); + cp = L_sub( fxone, tmp ); + } + scp = Mult_32_16( scp, extract_l( cp ) ); + model_m[pos + 1] = round_fx( L_shl( scp, 6 ) ); + + if ( ( model_m[pos + 1] == 0 && scp > 0 ) || model_m[pos] == model_m[pos + 1] ) + { + model_m[pos + 1] = 0; + + ar_encode( parenc, model_m, pos ); + pos = 0; + i--; + scp = fxp1; + continue; + } + + if ( magn_position[i] != 0 ) + { + ar_encode( parenc, model_m, pos ); + pos = 0; + magnzp--; + scp = fxp1; + } + else + { + pos++; + } + + magnp--; + } + return bits_fx; +} + + +static void transmission_bits( + PARCODEC arInst, + int16_t bit ) +{ + bitstream_save_bit( arInst->bsInst, bit ); + arInst->num_bits++; + bit = !bit; + + for ( ; arInst->bits_to_follow > 0 && arInst->num_bits < arInst->max_bits; arInst->bits_to_follow-- ) + { + bitstream_save_bit( arInst->bsInst, bit ); + arInst->num_bits++; + } + + return; +} + +void ar_encoder_start( + PARCODEC arInst, + TCQ_PBITSTREAM bsInst, + int16_t max_bits ) +{ + arInst->bsInst = bsInst; + + arInst->low = 0; + arInst->high = AR_TOP; + arInst->bits_to_follow = 0; + + arInst->num_bits = 0; + arInst->max_bits = max_bits; + + return; +} + + +static void ar_encode( + PARCODEC arInst, + const int16_t *model, + int32_t symbol ) +{ + uint32_t range, high, low; + + high = arInst->high; + low = arInst->low; + + symbol++; + range = high - low + 1; + + high = low + ( range * model[symbol - 1] ) / model[0] - 1; + low = low + ( range * model[symbol] ) / model[0]; + + for ( ;; ) + { + if ( high < AR_HALF ) + { + transmission_bits( arInst, 0 ); + } + else + { + if ( low >= AR_HALF ) + { + transmission_bits( arInst, 1 ); + + low -= AR_HALF; + high -= AR_HALF; + } + else + { + if ( low >= AR_FIRST && high < AR_THIRD ) + { + arInst->bits_to_follow++; + + low -= AR_FIRST; + high -= AR_FIRST; + } + else + { + break; + } + } + } + + low = low << 1; + high = ( high << 1 ) + 1; + } + + arInst->high = high; + arInst->low = low; + + return; +} + + +static void ar_encode_uniform( + PARCODEC arInst, + uint16_t data, + const int16_t bits ) +{ + int16_t i; + + for ( i = 0; i < bits; i++ ) + { + ar_encode( arInst, uniform_model, data & 0x1 ); + data >>= 1; + } + + return; +} + + +void ar_encoder_done( + PARCODEC arInst ) +{ + arInst->bits_to_follow++; + transmission_bits( arInst, arInst->low >= AR_FIRST ); + + return; +} + + +void ar_decoder_start( + PARCODEC arInst, + TCQ_PBITSTREAM bsInst ) +{ + int16_t i; + + arInst->bsInst = bsInst; + + arInst->low = 0; + arInst->high = AR_TOP; + arInst->value = 0; + + for ( i = 0; i < AR_BITS; i++ ) + { + arInst->value = ( arInst->value << 1 ) + bitstream_load_bit( arInst->bsInst ); + } + + return; +} + + +static int32_t ar_decode( + PARCODEC arInst, + const int16_t *model ) +{ + uint32_t range; + int16_t cum; + int16_t symbol; + + range = (uint32_t) ( arInst->high - arInst->low ) + 1; + cum = (int16_t) ( ( ( (uint32_t) ( arInst->value - arInst->low ) + 1 ) * model[0] - 1 ) / range ); + + for ( symbol = 1; model[symbol] > cum; symbol++ ) + { + ; + } + + arInst->high = arInst->low + ( range * model[symbol - 1] ) / model[0] - 1; + arInst->low = arInst->low + ( range * model[symbol] ) / model[0]; + + for ( ;; ) + { + if ( arInst->high >= AR_HALF ) + { + if ( arInst->low >= AR_HALF ) + { + arInst->value -= AR_HALF; + arInst->low -= AR_HALF; + arInst->high -= AR_HALF; + } + else + { + if ( arInst->low >= AR_FIRST && arInst->high < AR_THIRD ) + { + arInst->value -= AR_FIRST; + arInst->low -= AR_FIRST; + arInst->high -= AR_FIRST; + } + else + { + break; + } + } + } + arInst->low <<= 1; + arInst->high = ( arInst->high << 1 ) + 1; + arInst->value = ( arInst->value << 1 ) + bitstream_load_bit( arInst->bsInst ); + } + + return ( symbol - 1 ); +} + +void ar_decoder_done( + PARCODEC arInst ) +{ + bitstream_rollback( arInst->bsInst, AR_BITS - 2 ); + + return; +} + + +static int32_t ar_make_model( + const int16_t *freq, + int16_t *model, + const int16_t len ) +{ + int16_t dist; + uint32_t sum = 0; + uint32_t cum = 0; + int16_t i; + + for ( i = 0; i < len; i++ ) + { + sum += freq[i]; + } + + if ( sum == 0 ) + { + return 0; + } + + for ( i = len;; i-- ) + { + model[i] = (int16_t) ( ( cum * MAX_AR_FREQ ) / sum ); + + if ( !i ) + { + break; + } + + cum += freq[i - 1]; + } + + + for ( i = 0; i < len - 1; i++ ) + { + dist = model[i] - model[i + 1]; + + if ( dist <= 0 ) + { + model[i + 1] += dist - 1; + } + } + + for ( i = len; i; i-- ) + { + dist = model[i - 1] - model[i]; + + if ( dist <= 0 ) + { + model[i - 1] -= dist - 1; + } + } + + return ( model[0] > model[1] ); +} + +static void bitstream_save_bit( + TCQ_PBITSTREAM pBS, + const int16_t bit ) +{ + uint8_t cur; + + cur = pBS->buf[pBS->numByte]; + + cur = (uint8_t) ( cur | ( bit << pBS->curPos-- ) ); + pBS->buf[pBS->numByte] = cur; + pBS->numbits++; + + if ( pBS->curPos < 0 ) + { + pBS->curPos = 7; + pBS->numByte++; + } + + return; +} + + +static uint32_t bitstream_load_bit( + TCQ_PBITSTREAM pBS ) +{ + uint32_t bit; + signed char *curPos; + + /* safety check in case of bit errors */ + if ( pBS->numByte >= pBS->maxBytes ) + { + return 0; + } + + curPos = &pBS->curPos; + bit = ( ( pBS->buf[pBS->numByte] >> ( *curPos )-- ) & 0x00000001 ); + + if ( *curPos < 0 ) + { + pBS->numByte++; + *curPos = 7; + } + + return bit; +} + + +static void bitstream_rollback( + TCQ_PBITSTREAM pBS, + int16_t numBits ) +{ + while ( numBits > 0 ) + { + pBS->curPos++; + pBS->numbits--; + if ( pBS->curPos == 8 ) + { + pBS->curPos = 0; + pBS->numByte--; + } + numBits--; + } + + return; +} + + +static float quantize( + float val, + const int16_t D ) +{ + int32_t qval4; + float retval; /* = qval4*4.0f + DD[D]; */ + + qval4 = (int32_t) fabs( ( val + 0.5 ) / 4.0 ); + retval = qval4 * 4.0f + DDP[D]; + + /* 2nd zero check */ + if ( D == 0 ) + { + if ( fabs( fabs( retval ) - fabs( val ) ) > fabs( val ) ) + { + retval = 0; + } + } + + return retval; +} + + +static void TCQnew( + float *v, + float scale, + int16_t length, + float *vout, + int32_t pulses, + int32_t *pulsesout, + int32_t *nzposout, + int32_t *savedstates, + int32_t *lasttrellislevel, + int32_t terminate ) +{ + int16_t i, st, dminpos, position, pulsesnum, nzpos = 0; + float dmin, quantum1, quantum2, curdist1, curdist2, newdist1, newdist2, signq; + + float metric[STATES][TCQ_MAX_BAND_SIZE]; + int16_t path[STATES][TCQ_MAX_BAND_SIZE]; + int16_t quant[STATES][TCQ_MAX_BAND_SIZE]; + int16_t pused[STATES][TCQ_MAX_BAND_SIZE]; + + set_f( *metric, 0.0f, STATES * TCQ_MAX_BAND_SIZE ); + set_s( *path, 0, STATES * TCQ_MAX_BAND_SIZE ); + set_s( *quant, 0, STATES * TCQ_MAX_BAND_SIZE ); + set_s( *pused, 0, STATES * TCQ_MAX_BAND_SIZE ); + + /* Initialize metric */ + for ( st = 1; st < STATES; st++ ) + { + metric[st][0] = 1000; + } + for ( st = 2; st < STATES; st++ ) + { + metric[st][1] = 1000; + } + for ( st = 4; st < STATES; st++ ) + { + metric[st][2] = 1000; + } + + /* Viterbi for input sequence */ + for ( i = 0; i < length; i++ ) /* cycle over symbols */ + { + for ( st = 0; st < STATES; st++ ) /* cycle over conditions */ + { + curdist1 = metric[step_tcq[st][0]][i]; + curdist2 = metric[step_tcq[st][1]][i]; + + /* step 1 */ + quantum1 = quantize( v[i] * scale, denc[st][0] ); + newdist1 = (float) ( quantum1 - fabs( v[i] ) * scale ); + newdist1 *= newdist1; + + if ( quantum1 + pused[step_tcq[st][0]][i] > pulses && terminate ) + { + newdist1 = 10000.0f; /* pulses check */ + } + + /* step 2 */ + quantum2 = quantize( v[i] * scale, denc[st][1] ); + newdist2 = (float) ( quantum2 - fabs( v[i] ) * scale ); + newdist2 *= newdist2; + + if ( quantum2 + pused[step_tcq[st][1]][i] > pulses && terminate ) + { + newdist2 = 10000.0f; /* pulses check */ + } + + /* decision */ + if ( curdist1 + newdist1 < curdist2 + newdist2 ) + { + path[st][i + 1] = step_tcq[st][0]; + metric[st][i + 1] = curdist1 + newdist1; + quant[st][i + 1] = (int16_t) quantize( v[i] * scale, denc[st][0] ); + pused[st][i + 1] = (int16_t) ( pused[step_tcq[st][0]][i] + abs( quant[st][i + 1] ) ); + } + else + { + path[st][i + 1] = step_tcq[st][1]; + metric[st][i + 1] = curdist2 + newdist2; + quant[st][i + 1] = (int16_t) quantize( v[i] * scale, denc[st][1] ); + pused[st][i + 1] = (int16_t) ( pused[step_tcq[st][1]][i] + abs( quant[st][i + 1] ) ); + } + } + } + + /* Find path with minimal metric */ + dminpos = 0; + dmin = metric[dminpos][length]; + for ( i = 1; i < STATES; i++ ) + { + if ( ( dmin > metric[i][length] && pused[i][length] == pulses ) || + ( pused[dminpos][length] != pulses && pused[i][length] == pulses ) ) + { + dmin = metric[i][length]; + dminpos = i; + } + } + + /* Trace back to get output */ + pulsesnum = 0; + position = dminpos; + + for ( i = length; i > 0; i-- ) + { + signq = ( v[i - 1] > 0.0f ) ? ( 1.0f ) : ( -1.0f ); + vout[i - 1] = signq * quant[position][i]; + + position = path[position][i]; + savedstates[i - 1] = position; + + /* calculate output pulses number & nz */ + pulsesnum += (int16_t) fabs( vout[i - 1] ); /*quant[position][i]; */ + if ( fabs( vout[i - 1] ) > 0.0f ) + { + if ( nzpos == 0 ) + { + *lasttrellislevel = i; + } + + nzpos++; + } + } + + if ( pulsesout != NULL ) + { + *pulsesout = pulsesnum; + } + if ( nzposout != NULL ) + { + *nzposout = nzpos; + } + + return; +} + + +float GetISCScale( + float *quants, + int16_t size, + Word32 bits_fx, + float *magn, + float *qscale, + Word32 *surplus_fx, + float *pulses, + int32_t *savedstates, + int16_t noTCQ, + int32_t *nzpout, + int16_t *bcount, + float *abuffer, + float *mbuffer, + float *sbuffer ) +{ + float scale, m, t, actualt, magnbits = 0.0f; + int32_t pulsesnum, pos, terminate, leftp, leftnz, trellislevel, st; + int32_t i, j, nzpos, direction, pulsescurr, nzposcurr, lasttrellislevel; + float dist[TCQ_MAX_BAND_SIZE]; + float aquants[TCQ_MAX_BAND_SIZE]; + float dmin, prob0, prob1, quantum1, quantum2; + float sx2 = 0, sy2 = 0, sxy = 0, g; + int32_t pn = 0; + float pt = 0.f; + int32_t diff; + int16_t sign; + int32_t m_int; + int8_t flag_g1; + + set_f( dist, 0.0f, TCQ_MAX_BAND_SIZE ); + set_f( aquants, 0.0f, TCQ_MAX_BAND_SIZE ); + + if ( bits_fx < 0 ) + { + pulsesnum = 0; + + if ( surplus_fx != NULL ) + { + *surplus_fx = L_add( *surplus_fx, bits_fx ); + } + } + else + { + pulsesnum = GetScale_fx( size, bits_fx, surplus_fx ); + } + *nzpout = 0; + + if ( pulses != NULL ) + { + *pulses = (float) pulsesnum; + } + + if ( pulsesnum > 0 ) + { + /* Initial quantization */ + for ( i = 0, m = 0; i < size; i++ ) + { + aquants[i] = (float) fabs( quants[i] ); + m += aquants[i]; + } + + scale = ( pulsesnum + EPSILON ) / ( m + EPSILON ); + + for ( i = 0, t = 0.0f; i < size; i++ ) + { + magn[i] = (float) ( (int16_t) ( 0.5f + aquants[i] * scale ) ); + + t += magn[i]; + } + + /* Pulses redistribution */ + while ( t != pulsesnum ) + { + pn = 0; + pt = 0.f; + + + for ( i = 0, nzpos = 0; i < size; i++ ) + { + if ( magn[i] > 0.0f ) + { + pn += (int32_t) magn[i]; + pt += aquants[i]; + } + } + + direction = ( pulsesnum - t > 0 ) ? ( 1 ) : ( -1 ); + + /* new alg */ + { + for ( i = 0; i < size; i++ ) + { + sxy += aquants[i] * magn[i]; + sx2 += aquants[i] * aquants[i]; + sy2 += magn[i] * magn[i]; + } + for ( i = 0; i < size; i++ ) + { + if ( magn[i] > 0.0f ) + { + g = ( pt ) / ( pn + direction + EPSILON ); + } + else + { + g = ( pt + aquants[i] ) / ( pn + direction + EPSILON ); + } + + dist[i] = sx2 - 2.0f * ( sxy + direction * aquants[i] ) * g + g * g * ( sy2 + 2.0f * magn[i] * direction + 1.0f ); + } + } + + { + pos = 0; + dmin = dist[0]; + + /* find min */ + for ( i = 1; i < size; i++ ) + { + if ( dmin > dist[i] ) + { + pos = i; + dmin = dist[i]; + } + } + + magn[pos] += direction; + t += direction; + } + } + + /* calculate actual nz positions */ + actualt = 0.0f; + for ( i = 0, nzpos = 0; i < size; i++ ) + { + if ( magn[i] > 0.0f ) + { + if ( quants[i] < 0 ) + { + magn[i] *= -1; + } + + actualt += aquants[i]; + nzpos++; + } + } + + /* calculate scale */ + if ( actualt > 0 ) + { + scale = pulsesnum / actualt; + } + else + { + scale = FLT_MAX; + } + *qscale = scale; + *nzpout = nzpos; + + if ( ( nzpos != pulsesnum && nzpos > 1 ) && noTCQ == 0 ) + { + terminate = 1; + TCQnew( quants, scale, size, magn, pulsesnum, &pulsescurr, &nzposcurr, savedstates, &lasttrellislevel, terminate ); + + if ( pulsesnum > pulsescurr ) + { + scale *= 1.1f; + } + + if ( pulsesnum < pulsescurr ) + { + scale *= 0.9f; + } + if ( pulsesnum > pulsescurr ) + { + diff = pulsesnum - pulsescurr; + + for ( i = size - 1; i >= 0; i-- ) + { + if ( fabs( magn[i] ) > 0 ) + { + sign = ( magn[i] > 0 ) ? ( 1 ) : ( -1 ); + magn[i] = (float) ( sign * ( fabs( magn[i] ) + diff ) ); + + break; + } + } + } + else if ( pulsesnum < pulsescurr ) + { + diff = pulsescurr - pulsesnum; + + for ( i = size - 1; i >= 0 && diff > 0; i-- ) + { + if ( fabs( magn[i] ) > 0 ) + { + sign = ( magn[i] > 0 ) ? ( 1 ) : ( -1 ); + m_int = (int32_t) fabs( magn[i] ); + + if ( diff < m_int ) + { + magn[i] = (float) ( sign * ( fabs( magn[i] ) - diff ) ); + break; + } + else + { + diff = diff - m_int; + magn[i] = 0; + nzposcurr--; + } + } + } + } + + pulsescurr = pulsesnum; + + /* Magnitudes coding */ + { + leftp = pulsescurr; /*pulsesnum; */ + leftnz = nzposcurr; /*nzpos; */ + trellislevel = 0; + + for ( i = 0; i < size && leftnz > 1; i++ ) + { + if ( magn[i] != 0.0f ) + { + for ( j = 0; j < leftp; j++ ) + { + prob1 = ( leftnz - 1.0f ) / ( leftp - j - 1.0f ); + prob0 = 1.0f - prob1; + + st = savedstates[trellislevel]; + quantum1 = (float) quantize( (float) ( j + 1 ), ddec[st][0] ); + quantum2 = (float) quantize( (float) ( j + 1 ), ddec[st][1] ); + + if ( quantum1 != ( j + 1 ) && quantum2 != ( j + 1 ) ) + { + /* this magnitude is not possible so set probabilities */ + prob0 = 1.0f; + prob1 = 0.0f; + } + + if ( j < fabs( magn[i] ) - 1 ) + { + magnbits -= log2_f( prob0 ); + } + else + { + magnbits -= log2_f( prob1 ); + break; + } + } + + leftnz--; + leftp -= (int32_t) fabs( magn[i] ); + } + + trellislevel++; + } + + /* Update actual occured surplus */ + *nzpout = nzposcurr; + } + } + + if ( *nzpout > 1 && bcount != NULL ) + { + flag_g1 = 0; + + for ( i = 0; i < size; i++ ) + { + if ( fabs( magn[i] ) > 1.0f ) + { + flag_g1 = 1; + } + } + /* prepare vector for TCQ */ + for ( i = 0; i < size && flag_g1 && *bcount < 2 * TCQ_AMP; i++ ) + { + if ( fabs( magn[i] ) > 0.0f ) + { + abuffer[*bcount] = quants[i]; + mbuffer[*bcount] = magn[i]; + sbuffer[*bcount] = scale; + + ( *bcount )++; + } + } + } + + if ( actualt > 0 ) + { + *qscale = pulsesnum / actualt; + } + else + { + *qscale = FLT_MAX; + } + } + + return magnbits; +} + + +void InitLSBTCQ( + int16_t *bcount ) +{ + *bcount = 0; + + return; +} + + +void TCQLSB( + int16_t bcount, + float *abuffer, + float *mbuffer, + float *sbuffer, + int16_t *dpath ) +{ + int16_t i, st, dminpos, position; + float q = QTCQ; + float dmin, curdist1, curdist2, newdist1, newdist2; + float metric[STATES_LSB][TCQ_LSB_SIZE]; + int16_t path[STATES_LSB][TCQ_LSB_SIZE]; + int16_t quant[STATES_LSB][TCQ_LSB_SIZE]; + int16_t dquant[STATES_LSB][TCQ_LSB_SIZE]; + int16_t qout[TCQ_LSB_SIZE]; + float q1, q2, s1, s2, a1, a2, sign1, sign2; + float dbuffer[MAX_PULSES]; + + set_f( *metric, 0.0f, STATES_LSB * TCQ_LSB_SIZE ); + set_s( *path, 0, STATES_LSB * TCQ_LSB_SIZE ); + set_s( *quant, 0, STATES_LSB * TCQ_LSB_SIZE ); + set_s( *dquant, 0, STATES_LSB * TCQ_LSB_SIZE ); + set_s( qout, 0, TCQ_LSB_SIZE ); + set_f( dbuffer, 0.0f, MAX_PULSES ); + + metric[1][0] = 16777216.0f; + metric[2][0] = 16777216.0f; + metric[3][0] = 16777216.0f; + + for ( i = 0; i < 2 * TCQ_AMP; i += 2 ) + { + q1 = mbuffer[i]; + q2 = mbuffer[i + 1]; + + s1 = sbuffer[i]; + s2 = sbuffer[i + 1]; + + a1 = abuffer[i]; + a2 = abuffer[i + 1]; + + /* cycle over conditions */ + for ( st = 0; st < 4; st++ ) + { + curdist1 = metric[step_LSB[st][0]][i / 2]; + curdist2 = metric[step_LSB[st][1]][i / 2]; + + /* step 1 */ + sign1 = ( denc_LSB[st][0] & 0x1 ) ? ( q ) : ( -q ); + sign2 = ( denc_LSB[st][0] & 0x2 ) ? ( q ) : ( -q ); + newdist1 = ( a1 - ( q1 + sign1 ) / s1 ) * ( a1 - ( q1 + sign1 ) / s1 ) + ( a2 - ( q2 + sign2 ) / s2 ) * ( a2 - ( q2 + sign2 ) / s2 ); + + /* step 2 */ + sign1 = ( denc_LSB[st][1] & 0x1 ) ? ( q ) : ( -q ); + sign2 = ( denc_LSB[st][1] & 0x2 ) ? ( q ) : ( -q ); + newdist2 = ( a1 - ( q1 + sign1 ) / s1 ) * ( a1 - ( q1 + sign1 ) / s1 ) + ( a2 - ( q2 + sign2 ) / s2 ) * ( a2 - ( q2 + sign2 ) / s2 ); + + /* decision */ + if ( curdist1 + newdist1 < curdist2 + newdist2 ) + { + path[st][i / 2 + 1] = step_LSB[st][0]; + metric[st][i / 2 + 1] = curdist1 + newdist1; + quant[st][i / 2 + 1] = 0; + dquant[st][i / 2 + 1] = dqnt_LSB[step_LSB[st][0]][st]; + } + else + { + path[st][i / 2 + 1] = step_LSB[st][1]; + metric[st][i / 2 + 1] = curdist2 + newdist2; + quant[st][i / 2 + 1] = 1; + dquant[st][i / 2 + 1] = dqnt_LSB[step_LSB[st][0]][st]; + } + } + } + + /* Find path with minimal metric */ + dminpos = 0; + dmin = metric[dminpos][i / 2]; + for ( st = 1; st < 4; st++ ) + { + if ( dmin > metric[st][i / 2] ) + { + dmin = metric[st][i / 2]; + dminpos = st; + } + } + + /* Trace back to get output */ + position = dminpos; + + for ( ; i >= 0; i -= 2 ) + { + qout[i / 2] = quant[position][i / 2 + 1]; + dpath[i / 2] = dquant[position][i / 2 + 1]; + + dbuffer[i] = ( denc_LSB[position][qout[i / 2]] & 0x1 ) ? ( q ) : ( -q ); + dbuffer[i + 1] = ( denc_LSB[position][qout[i / 2]] & 0x2 ) ? ( q ) : ( -q ); + + position = path[position][i / 2 + 1]; + } + + /* add decoded sequence to quanta */ + for ( i = 0; i < bcount; i++ ) + { + mbuffer[i] += dbuffer[i]; + } + + return; +} + +void TCQLSBdec( + int16_t *dpath, + float *mbuffer, + int16_t bcount ) +{ + float q = QTCQ; + int16_t i, state = 0; + + for ( i = 0; i < bcount / 2; i++ ) + { + mbuffer[2 * i] = ( ddec_LSB[state][dpath[i]] & 0x1 ) ? ( q ) : ( -q ); + mbuffer[2 * i + 1] = ( ddec_LSB[state][dpath[i]] & 0x2 ) ? ( q ) : ( -q ); + + state = dstep_LSB[state][dpath[i]]; + } + + return; +} + +void SaveTCQdata( + PARCODEC arInst, + int16_t *dpath, + int16_t bcount ) +{ + int16_t i; + + for ( i = 0; i < bcount; i++ ) + { + ar_encode_uniform( arInst, dpath[i], 1 ); + } + + return; +} + +void LoadTCQdata( + PARCODEC arInst, + int16_t *dpath, + int16_t bcount ) +{ + int16_t i; + + for ( i = 0; i < bcount; i++ ) + { + dpath[i] = (int16_t) ar_decode( arInst, uniform_model ); + } + + return; +} + +void RestoreTCQdec( + int32_t *magn, + int16_t size, + int16_t *bcount, + float *mbuffer ) +{ + int16_t i, nzpos = 0, flag_g1 = 0; + + /* calculate actual nz positions */ + for ( i = 0, nzpos = 0; i < size; i++ ) + { + if ( magn[i] != 0 ) + { + nzpos++; + if ( abs( magn[i] ) > 1 ) + { + flag_g1 = 1; + } + magn[i] *= (int32_t) ( 1.0f / QTCQ ); + } + } + + if ( nzpos > 1 ) + { + for ( i = 0; i < size && flag_g1 && *bcount < 2 * TCQ_AMP; i++ ) + { + if ( magn[i] != 0 ) + { + mbuffer[*bcount] = magn[i] + ( 1.0f / QTCQ ) * mbuffer[*bcount]; + magn[i] = round_f( mbuffer[*bcount] ); + ( *bcount )++; + } + } + } + + return; +} + + +void RestoreTCQ( + float *magn, + int16_t size, + int16_t *bcount, + float *mbuffer ) +{ + int16_t i, nzpos = 0, flag_g1 = 0; + + /* calculate actual nz positions */ + for ( i = 0, nzpos = 0; i < size; i++ ) + { + if ( magn[i] != 0.0f ) + { + nzpos++; + if ( fabs( magn[i] ) > 1.0f ) + { + flag_g1 = 1; + } + } + } + + if ( nzpos > 1 ) + { + for ( i = 0; i < size && flag_g1 && *bcount < 2 * TCQ_AMP; i++ ) + { + if ( fabs( magn[i] ) > 0.0f ) + { + magn[i] = mbuffer[*bcount]; + ( *bcount )++; + } + } + } + + return; +} diff --git a/lib_com/tcx_ltp.c b/lib_com/tcx_ltp.c new file mode 100644 index 0000000000000000000000000000000000000000..4ea3f11066c93400494d615925b98091a0a82703 --- /dev/null +++ b/lib_com/tcx_ltp.c @@ -0,0 +1,1094 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include "options.h" +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*------------------------------------------------------------------- + * Local constants + *-------------------------------------------------------------------*/ + +#define ALPHA 0.85f + +/*------------------------------------------------------------------- + * tcx_ltp_get_lpc() + * + * + *-------------------------------------------------------------------*/ + +static void tcx_ltp_get_lpc( + float *input, + const int16_t length, + float *A, + const int16_t lpcorder ) +{ + int16_t i, j; + float s, r[TCXLTP_LTP_ORDER + 1]; + + for ( i = 0; i <= lpcorder; i++ ) + { + s = 0.0; + + for ( j = 0; j < length - i; j++ ) + { + s += input[j] * input[j + i]; + } + r[i] = s; + } + + if ( r[0] < 100.0f ) + { + r[0] = 100.0f; + } + r[0] *= 1.0001f; + + lev_dur( A, r, lpcorder, NULL ); + + return; +} + + +/*------------------------------------------------------------------- + * tcx_ltp_get_zir() + * + * + *-------------------------------------------------------------------*/ + +static void tcx_ltp_get_zir( + float *zir, + const int16_t length, + float *synth_ltp, + float *synth, + float *A, + const int16_t lpcorder, + const float gain, + const int16_t pitch_int, + const int16_t pitch_fr, + const int16_t pitres, + const int16_t filtIdx ) +{ + float buf[TCXLTP_LTP_ORDER], alpha, step; + float *x0, *x1, s; + float *y0, *y1, s2; + const float *w0, *w1, *v0, *v1; + int16_t i, j, k, L; + + x0 = &synth_ltp[-pitch_int]; + x1 = x0 - 1; + y0 = synth; + y1 = y0 - 1; + + assert( filtIdx >= 0 ); + + w0 = &tcxLtpFilters[filtIdx].filt[pitch_fr]; + w1 = &tcxLtpFilters[filtIdx].filt[pitres - pitch_fr]; + v0 = &tcxLtpFilters[filtIdx].filt[0]; + v1 = &tcxLtpFilters[filtIdx].filt[pitres]; + L = tcxLtpFilters[filtIdx].length; + + for ( j = 0; j < lpcorder; j++ ) + { + s = 0; + s2 = 0; + for ( i = 0, k = 0; i < L; i++, k += pitres ) + { + s += w0[k] * x0[i] + w1[k] * x1[-i]; + s2 += v0[k] * y0[i] + v1[k] * y1[-i]; + } + s2 *= ALPHA; + + buf[j] = ( synth[j] - gain * s2 ) - ( synth_ltp[j] - gain * s ); + + + x0++; + x1++; + y0++; + y1++; + } + + set_f( zir, 0.0f, length ); + + syn_filt( A, lpcorder, zir, zir, length, buf, 0 ); + + alpha = 1.f; + step = 1.f / (float) ( length / 2 ); + + for ( j = length / 2; j < length; j++ ) + { + zir[j] *= alpha; + alpha -= step; + } + + return; +} + + +/*------------------------------------------------------------------- + * predict_signal() + * + * + *-------------------------------------------------------------------*/ + +void predict_signal( + const float excI[], /* i : input excitation buffer */ + float excO[], /* o : output excitation buffer */ + const int16_t T0, /* i : integer pitch lag */ + int16_t frac, /* i : fraction of lag */ + const int16_t frac_max, /* i : max fraction */ + const int16_t L_subfr /* i : subframe size */ +) +{ + int16_t j; + float s; + const float *x0, *win; + + x0 = &excI[-T0 - 1]; + frac = -frac; + + if ( frac < 0 ) + { + frac += frac_max; + x0--; + } + + if ( frac_max == 6 ) + { + win = &inter6_2tcx2[frac][0]; + } + else + { + win = &inter4_2tcx2[frac][0]; + } + + for ( j = 0; j < L_subfr; j++ ) + { + s = win[1] * x0[1] + win[2] * x0[2]; + excO[j] = s + win[0] * x0[0] + win[3] * x0[3]; + x0++; + } + + return; +} + + +/*------------------------------------------------------------------- + * tcx_ltp_synth_filter() + * + * + *-------------------------------------------------------------------*/ + +static void tcx_ltp_synth_filter( + float *synth_ltp, + float *synth, + const int16_t length, + const int16_t pitch_int, + const int16_t pitch_fr, + const float gain, + const int16_t pitch_res, + const int16_t filtIdx ) +{ + float *x0, *x1, s; + float *y0, *y1, s2; + const float *v0, *v1; + const float *w0, *w1; + int16_t i, j, k, L; + + if ( gain > 0.f ) + { + x0 = &synth_ltp[-pitch_int]; + x1 = x0 - 1; + y0 = synth; + y1 = y0 - 1; + + assert( filtIdx >= 0 ); + + w0 = &tcxLtpFilters[filtIdx].filt[pitch_fr]; + w1 = &tcxLtpFilters[filtIdx].filt[pitch_res - pitch_fr]; + v0 = &tcxLtpFilters[filtIdx].filt[0]; + v1 = &tcxLtpFilters[filtIdx].filt[pitch_res]; + + L = tcxLtpFilters[filtIdx].length; + + + for ( j = 0; j < length; j++ ) + { + s = 0; + s2 = 0; + for ( i = 0, k = 0; i < L; i++, k += pitch_res ) + { + s += w0[k] * x0[i] + w1[k] * x1[-i]; + s2 += v0[k] * y0[i] + v1[k] * y1[-i]; + } + + s2 *= ALPHA; + synth_ltp[j] = synth[j] - gain * s2 + gain * s; + + x0++; + x1++; + y0++; + y1++; + } + } + else + { + mvr2r( synth, synth_ltp, length ); + } + + return; +} + + +/*------------------------------------------------------------------- + * tcx_ltp_synth_filter_zir() + * + * + *-------------------------------------------------------------------*/ + +static void tcx_ltp_synth_filter_zir( + float *synth_ltp, + float *synth, + const int16_t length, + const int16_t pitch_int, + const int16_t pitch_fr, + const float gain, + const int16_t pitch_res, + float *zir, + const int16_t filtIdx ) +{ + float *x0, *x1, s; + float *y0, *y1, s2; + const float *v0, *v1; + const float *w0, *w1; + int16_t i, j, k, L; + + x0 = &synth_ltp[-pitch_int]; + x1 = x0 - 1; + y0 = synth; + y1 = y0 - 1; + + assert( filtIdx >= 0 ); + + w0 = &tcxLtpFilters[filtIdx].filt[pitch_fr]; + w1 = &tcxLtpFilters[filtIdx].filt[pitch_res - pitch_fr]; + v0 = &tcxLtpFilters[filtIdx].filt[0]; + v1 = &tcxLtpFilters[filtIdx].filt[pitch_res]; + L = tcxLtpFilters[filtIdx].length; + + for ( j = 0; j < length; j++ ) + { + s = 0; + s2 = 0; + + for ( i = 0, k = 0; i < L; i++, k += pitch_res ) + { + s += w0[k] * x0[i] + w1[k] * x1[-i]; + s2 += v0[k] * y0[i] + v1[k] * y1[-i]; + } + + s2 *= ALPHA; + + synth_ltp[j] = ( synth[j] - gain * s2 + gain * s ) - zir[j]; + + x0++; + x1++; + y0++; + y1++; + } + + return; +} + + +/*------------------------------------------------------------------- + * tcx_ltp_synth_filter_fadein() + * + * + *-------------------------------------------------------------------*/ + +static void tcx_ltp_synth_filter_fadein( + float *synth_ltp, + float *synth, + const int16_t length, + const int16_t pitch_int, + const int16_t pitch_fr, + const float gain, + const int16_t pitch_res, + const int16_t filtIdx ) +{ + float *x0, *x1, s; + float *y0, *y1, s2; + const float *v0, *v1; + const float *w0, *w1; + int16_t i, j, k, L; + float alpha, step; + + if ( gain > 0.f ) + { + x0 = &synth_ltp[-pitch_int]; + x1 = x0 - 1; + y0 = synth; + y1 = y0 - 1; + + assert( filtIdx >= 0 ); + + w0 = &tcxLtpFilters[filtIdx].filt[pitch_fr]; + w1 = &tcxLtpFilters[filtIdx].filt[pitch_res - pitch_fr]; + v0 = &tcxLtpFilters[filtIdx].filt[0]; + v1 = &tcxLtpFilters[filtIdx].filt[pitch_res]; + L = tcxLtpFilters[filtIdx].length; + + alpha = 0.f; + step = 1.f / (float) ( length ); + + + for ( j = 0; j < length; j++ ) + { + s = 0; + s2 = 0; + + for ( i = 0, k = 0; i < L; i++, k += pitch_res ) + { + s += w0[k] * x0[i] + w1[k] * x1[-i]; + s2 += v0[k] * y0[i] + v1[k] * y1[-i]; + } + + s2 *= ALPHA; + + synth_ltp[j] = synth[j] - alpha * gain * s2 + alpha * gain * s; + + alpha += step; + + x0++; + x1++; + y0++; + y1++; + } + } + else + { + mvr2r( synth, synth_ltp, length ); + } + + return; +} + + +/*------------------------------------------------------------------- + * tcx_ltp_synth_filter_fadeout() + * + * + *-------------------------------------------------------------------*/ + +static void tcx_ltp_synth_filter_fadeout( + float *synth_ltp, + float *synth, + const int16_t length, + const int16_t pitch_int, + const int16_t pitch_fr, + const float gain, + const int16_t pitch_res, + const int16_t filtIdx ) +{ + float *x0, *x1, s; + float *y0, *y1, s2; + const float *v0, *v1; + const float *w0, *w1; + int16_t i, j, k, L; + float alpha, step; + + if ( gain > 0.f ) + { + x0 = &synth_ltp[-pitch_int]; + x1 = x0 - 1; + y0 = synth; + y1 = y0 - 1; + + assert( filtIdx >= 0 ); + + w0 = &tcxLtpFilters[filtIdx].filt[pitch_fr]; + w1 = &tcxLtpFilters[filtIdx].filt[pitch_res - pitch_fr]; + v0 = &tcxLtpFilters[filtIdx].filt[0]; + v1 = &tcxLtpFilters[filtIdx].filt[pitch_res]; + L = tcxLtpFilters[filtIdx].length; + + alpha = 1.f; + step = 1.f / (float) ( length ); + + for ( j = 0; j < length; j++ ) + { + s = 0; + s2 = 0; + + for ( i = 0, k = 0; i < L; i++, k += pitch_res ) + { + s += w0[k] * x0[i] + w1[k] * x1[-i]; + s2 += v0[k] * y0[i] + v1[k] * y1[-i]; + } + + s2 *= ALPHA; + synth_ltp[j] = synth[j] - alpha * gain * s2 + alpha * gain * s; + alpha -= step; + + x0++; + x1++; + y0++; + y1++; + } + } + else + { + mvr2r( synth, synth_ltp, length ); + } + + return; +} + + +/*------------------------------------------------------------------- + * tcx_ltp_decode_params() + * + * + *-------------------------------------------------------------------*/ + +int16_t tcx_ltp_decode_params( + int16_t *ltp_param, + int16_t *pitch_int, + int16_t *pitch_fr, + float *gain, + const int16_t pitmin, + const int16_t pitfr1, + const int16_t pitfr2, + const int16_t pitmax, + const int16_t pitres ) +{ + int16_t gainbits = 2; + + /* Decode Pitch and Gain */ + if ( ( ltp_param ) && ( ltp_param[0] ) ) + { + if ( ltp_param[1] < ( ( pitfr2 - pitmin ) * pitres ) ) + { + *pitch_int = pitmin + ( ltp_param[1] / pitres ); + *pitch_fr = ltp_param[1] - ( *pitch_int - pitmin ) * pitres; + } + else if ( ltp_param[1] < ( ( pitfr2 - pitmin ) * pitres + ( pitfr1 - pitfr2 ) * ( pitres >> 1 ) ) ) + { + *pitch_int = pitfr2 + ( ( ltp_param[1] - ( pitfr2 - pitmin ) * pitres ) / ( pitres >> 1 ) ); + *pitch_fr = ( ltp_param[1] - ( pitfr2 - pitmin ) * pitres ) - ( *pitch_int - pitfr2 ) * ( pitres >> 1 ); + *pitch_fr = *pitch_fr << 1; /* was *= (pitres>>1); */ + } + else + { + *pitch_int = ltp_param[1] + pitfr1 - ( ( pitfr2 - pitmin ) * pitres ) - ( ( pitfr1 - pitfr2 ) * ( pitres >> 1 ) ); + *pitch_fr = 0; + } + *gain = (float) ( ltp_param[2] + 1 ) * 0.625f / (float) ( 1 << gainbits ); + if ( *pitch_int < PIT_MIN_SHORTER ) + { + /*pitch out of range due to bit error */ + *pitch_int = PIT_MIN_SHORTER; + return 1; + } + if ( *pitch_int > PIT_MAX_MAX ) + { + /*pitch out of range due to bit error */ + *pitch_int = PIT_MAX_MAX; + return 1; + } + } + else + { + *pitch_int = pitmax; + *pitch_fr = 0; + *gain = 0.0f; + } + + return 0; +} + +/*------------------------------------------------------------------- + *tcx_ltp_synth_filter_10() + * + * + ---------------------------------------------------------------------*/ +static void tcx_ltp_synth_filter_10( + float *out, + float *in, + const int16_t length, + const int16_t pitch_int, + const int16_t pitch_fr, + const float gain, + const int16_t pitch_res, + const int16_t filtIdx ) +{ + float *x0, *x1, s; + float *y0, *y1, s2; + const float *v0, *v1; + const float *w0, *w1; + int16_t i, j, k, L; + float curr_gain, gain_step; + + x0 = &out[-pitch_int]; + x1 = x0 - 1; + y0 = in; + y1 = y0 - 1; + + assert( filtIdx >= 0 ); + + w0 = &tcxLtpFilters[filtIdx].filt[pitch_fr]; + w1 = &tcxLtpFilters[filtIdx].filt[pitch_res - pitch_fr]; + v0 = &tcxLtpFilters[filtIdx].filt[0]; + v1 = &tcxLtpFilters[filtIdx].filt[pitch_res]; + L = tcxLtpFilters[filtIdx].length; + + curr_gain = gain; + gain_step = -gain / length; + + for ( j = 0; j < length; j++ ) + { + s = 0; + s2 = 0; + + for ( i = 0, k = 0; i < L; i++, k += pitch_res ) + { + s += w0[k] * x0[i] + w1[k] * x1[-i]; + s2 += v0[k] * y0[i] + v1[k] * y1[-i]; + } + + out[j] = in[j] - curr_gain * s2 * ALPHA + curr_gain * s; + + x0++; + x1++; + y0++; + y1++; + + curr_gain += gain_step; + } + + return; +} + + +/*------------------------------------------------------------------- + *tcx_ltp_synth_filter_01() + * + * + ---------------------------------------------------------------------*/ + +static void tcx_ltp_synth_filter_01( + float *out, + float *in, + const int16_t length, + const int16_t pitch_int, + const int16_t pitch_fr, + const float gain, + const int16_t pitch_res, + const int16_t filtIdx ) +{ + float *x0, *x1, s; + float *y0, *y1, s2; + const float *v0, *v1; + const float *w0, *w1; + int16_t i, j, k, L; + float curr_gain, gain_step; + + x0 = &out[-pitch_int]; + x1 = x0 - 1; + y0 = in; + y1 = y0 - 1; + + assert( filtIdx >= 0 ); + + w0 = &tcxLtpFilters[filtIdx].filt[pitch_fr]; + w1 = &tcxLtpFilters[filtIdx].filt[pitch_res - pitch_fr]; + v0 = &tcxLtpFilters[filtIdx].filt[0]; + v1 = &tcxLtpFilters[filtIdx].filt[pitch_res]; + L = tcxLtpFilters[filtIdx].length; + + curr_gain = 0.0f; + gain_step = gain / length; + + for ( j = 0; j < length; j++ ) + { + s = 0; + s2 = 0; + + for ( i = 0, k = 0; i < L; i++, k += pitch_res ) + { + s += w0[k] * x0[i] + w1[k] * x1[-i]; + s2 += v0[k] * y0[i] + v1[k] * y1[-i]; + } + + out[j] = in[j] - curr_gain * s2 * ALPHA + curr_gain * s; + + x0++; + x1++; + y0++; + y1++; + + curr_gain += gain_step; + } + + return; +} + +#define MAX_TCX_LTP_FILTER_LEN 8 +#define MAX_TRANSITION_LEN 240 /* L_FRAME_48K / 4 */ + +/*------------------------------------------------------------------- + *tcx_ltp_synth_filter_11_unequal_pitch() + * + * blend between two filters by means of OAO + * filter the input signal at the initial subinterval with + * the first filter unit according to parameters associated to + * the preceding update interval with scaling from non-zero gain towards 0 + * followed by the second filter unit according to parameters associated to + * the current update interval with scaling from 0 towards non-zero gain + ---------------------------------------------------------------------*/ + +static void tcx_ltp_synth_filter_11_unequal_pitch( + float *out, + float *in, + const int16_t length, + const int16_t cur_pitch_int, + const int16_t cur_pitch_fr, + const float cur_gain, + const int16_t pitch_res, + const int16_t filtIdx, + const int16_t prev_pitch_int, + const int16_t prev_pitch_fr, + const float prev_gain, + const int16_t prev_pitch_res, + const int16_t prev_filtIdx ) +{ + float *x0, *x1, s; + float *y0, *y1, s2; + float *l0, *l1, s3; + float *m0, *m1, s4; + const float *v0, *v1; + const float *w0, *w1; + const float *p0, *p1; + const float *q0, *q1; + int16_t i, j, k, L; + int16_t prev_L; + float temp_buf[MAX_TRANSITION_LEN + 2 * MAX_TCX_LTP_FILTER_LEN]; + float *temp_ptr; + float gain, gain_step; + + x0 = &out[-prev_pitch_int]; + x1 = x0 - 1; + y0 = in; + y1 = y0 - 1; + + assert( filtIdx >= 0 && prev_filtIdx >= 0 ); + + w0 = &tcxLtpFilters[prev_filtIdx].filt[prev_pitch_fr]; + w1 = &tcxLtpFilters[prev_filtIdx].filt[prev_pitch_res - prev_pitch_fr]; + v0 = &tcxLtpFilters[prev_filtIdx].filt[0]; + v1 = &tcxLtpFilters[prev_filtIdx].filt[prev_pitch_res]; + + prev_L = tcxLtpFilters[prev_filtIdx].length; + + p0 = &tcxLtpFilters[filtIdx].filt[cur_pitch_fr]; + p1 = &tcxLtpFilters[filtIdx].filt[pitch_res - cur_pitch_fr]; + q0 = &tcxLtpFilters[filtIdx].filt[0]; + q1 = &tcxLtpFilters[filtIdx].filt[pitch_res]; + + L = tcxLtpFilters[filtIdx].length; + + /* 1. decreasing gain filter. The first filter unit with the parameters associated to the previous interval and scaling towards 0 */ + gain = prev_gain; + gain_step = -prev_gain / length; + + for ( j = 0; j < length + L; j++ ) + { + s = 0; + s2 = 0; + + for ( i = 0, k = 0; i < prev_L; i++, k += prev_pitch_res ) + { + s += w0[k] * x0[i] + w1[k] * x1[-i]; + s2 += v0[k] * y0[i] + v1[k] * y1[-i]; + } + + out[j] = in[j] - gain * s2 * ALPHA + gain * s; + + x0++; + x1++; + y0++; + y1++; + + gain += gain_step; + } + + mvr2r( out - MAX_TCX_LTP_FILTER_LEN, temp_buf, MAX_TRANSITION_LEN + 2 * MAX_TCX_LTP_FILTER_LEN ); + temp_ptr = &temp_buf[0] + MAX_TCX_LTP_FILTER_LEN; + + m0 = temp_ptr; + m1 = temp_ptr - 1; + l0 = &out[-cur_pitch_int]; + l1 = l0 - 1; + + /* 2. increasing gain filter. The second filter unit with the parameters associated to the current interval and scaling from 0 towards current gain */ + gain = 0.0f; + gain_step = cur_gain / length; + + for ( j = 0; j < length; j++ ) + { + s3 = 0; + s4 = 0; + + for ( i = 0, k = 0; i < L; i++, k += pitch_res ) + { + s3 += p0[k] * l0[i] + p1[k] * l1[-i]; + s4 += q0[k] * m0[i] + q1[k] * m1[-i]; + } + + out[j] = *( temp_ptr + j ) - gain * s4 * ALPHA + gain * s3; + + l0++; + l1++; + m0++; + m1++; + + gain += gain_step; + } + + return; +} + + +/*------------------------------------------------------------------- + * tcx_ltp_post() + * + * + *-------------------------------------------------------------------*/ + +void tcx_ltp_post( + Decoder_State *st, + TCX_LTP_DEC_HANDLE hTcxLtpDec, + const int16_t core, + const int16_t output_frame, + const int16_t delay, + float sig[], + const float tcx_buf[] ) +{ + int16_t tmp, L_transition, lpcorder, filtIdx; + int16_t bfi, L_frame_core, SideInfoOnly; + float gain, gain2; + float zir[L_FRAME_PLUS / 4], A[TCXLTP_LTP_ORDER + 1]; + float buf_in[TCXLTP_MAX_DELAY + L_FRAME48k + TCXLTP_MAX_DELAY], buf_out[2 * L_FRAME48k]; + float *sig_in, *sig_out; + int16_t pitch_int, pitch_fr; + int16_t tcx_buf_len; + int32_t total_brate; + + total_brate = ( st->element_mode == IVAS_CPE_MDCT ? st->bits_frame_nominal * FRAMES_PER_SEC : st->total_brate ); + filtIdx = 0; /* just to avoid compilation warnings */ + tcx_buf_len = NS2SA( st->output_Fs, TCXLTP_DELAY_NS ); + SideInfoOnly = 0; + + if ( total_brate >= HQ_96k ) + { + SideInfoOnly = 1; + } + + L_frame_core = st->L_frame; + if ( st->element_mode == IVAS_CPE_MDCT ) + { + L_frame_core = L_FRAME; + } + + if ( core == ACELP_CORE ) + { + bfi = 0; + pitch_int = 0; + pitch_fr = 0; + gain = 0.0f; + + L_frame_core = st->L_frame_past; + } + else + { + bfi = st->bfi; + pitch_int = hTcxLtpDec->tcxltp_pitch_int; + pitch_fr = hTcxLtpDec->tcxltp_pitch_fr; + gain = hTcxLtpDec->tcxltp_gain; + } + + /******** Init ********/ + + /* Parameters */ + L_transition = output_frame / 4; + lpcorder = TCXLTP_LTP_ORDER; + + + /* Input buffer */ + sig_in = buf_in + tcx_buf_len; + mvr2r( hTcxLtpDec->tcxltp_mem_in, buf_in, tcx_buf_len ); + mvr2r( sig, buf_in + tcx_buf_len, output_frame ); + if ( core > ACELP_CORE ) + { + mvr2r( tcx_buf, sig_in + output_frame, tcx_buf_len ); + } + mvr2r( sig + output_frame - tcx_buf_len, hTcxLtpDec->tcxltp_mem_in, tcx_buf_len ); + + /* Output buffer */ + sig_out = buf_out + output_frame; + mvr2r( hTcxLtpDec->tcxltp_mem_out, buf_out, output_frame ); + + /* TCX-LTP parameters: integer pitch, fractional pitch, gain */ + + if ( !( SideInfoOnly || hTcxLtpDec->tcxltp ) || core == ACELP_CORE ) + { + /* No LTP */ + pitch_int = 0; + pitch_fr = 0; + gain = 0.f; + } + else if ( !bfi ) + { + /* LTP and good frame */ + if ( output_frame != L_frame_core ) + { + tmp = pitch_int * st->pit_res_max + pitch_fr; + tmp = ( tmp * output_frame + L_frame_core / 2 ) / L_frame_core; + pitch_int = tmp / st->pit_res_max; + pitch_fr = tmp % st->pit_res_max; + } + + if ( st->element_mode == EVS_MONO ) /* hard tunings for EVS_MONO, HQ_48k is TCX only */ + { + if ( total_brate == HQ_48k && L_frame_core == L_FRAME16k ) + { + gain *= 0.32f; + } + else if ( total_brate == HQ_48k && L_frame_core == 512 ) + { + gain *= 0.40f; + } + else + { + gain *= 0.64f; + } + } + else if ( ( st->element_mode > IVAS_SCE ) && ( total_brate >= IVAS_96k ) ) + { + gain *= 0.40f; + } + else + { + gain *= 0.64f; + } + } + else + { + /* PLC: [TCX: Fade-out] + * PLC: LTP and bad frame (concealment) */ + if ( st->pit_res_max == st->pit_res_max_past ) /* ensure consistent core SR to previous frame; otherwise, set gain to 0 */ + { + pitch_int = hTcxLtpDec->tcxltp_pitch_int_post_prev; + pitch_fr = hTcxLtpDec->tcxltp_pitch_fr_post_prev; + gain = hTcxLtpDec->tcxltp_gain_post_prev * st->hTcxDec->damping; + } + else + { + gain = 0.f; + } + } + + if ( SideInfoOnly ) + { + gain = 0.f; + if ( bfi ) + { + hTcxLtpDec->tcxltp_gain_post_prev = 0.f; + } + } + gain2 = gain; + + if ( L_frame_core == L_FRAME ) + { + switch ( output_frame ) + { + case L_FRAME8k: + filtIdx = 0; + break; + case L_FRAME16k: + filtIdx = 1; + break; + case L_FRAME32k: + filtIdx = 2; + break; + case L_FRAME48k: + filtIdx = 3; + break; + default: + assert( 0 ); + break; + } + } + else if ( L_frame_core == L_FRAME16k ) + { + switch ( output_frame ) + { + case L_FRAME8k: + filtIdx = 4; + break; + case L_FRAME16k: + filtIdx = 5; + break; + case L_FRAME32k: + filtIdx = 6; + break; + case L_FRAME48k: + filtIdx = 7; + break; + default: + assert( 0 ); + break; + } + } + else if ( L_frame_core == 512 ) + { + switch ( output_frame ) + { + case L_FRAME8k: + filtIdx = 8; + break; + case L_FRAME16k: + filtIdx = 9; + break; + case L_FRAME32k: + filtIdx = 10; + break; + case L_FRAME48k: + filtIdx = 11; + break; + default: + assert( 0 ); + break; + } + } + else + { + filtIdx = -1; + } + + + /******** Previous-frame part ********/ + tcx_ltp_synth_filter( sig_out, sig_in, delay, hTcxLtpDec->tcxltp_pitch_int_post_prev, hTcxLtpDec->tcxltp_pitch_fr_post_prev, hTcxLtpDec->tcxltp_gain_post_prev, st->pit_res_max_past, hTcxLtpDec->tcxltp_filt_idx_prev ); + + /******** Transition part - initial subinterval ********/ + + if ( st->element_mode != EVS_MONO ) + { + if ( gain == 0.f && hTcxLtpDec->tcxltp_gain_post_prev == 0.f ) + { + /* The filtering is deactivated, just copy input to the output */ + mvr2r( sig_in + delay, sig_out + delay, L_transition ); + } + else if ( gain == 0.f && hTcxLtpDec->tcxltp_gain_post_prev != 0.f ) + { + /* Filtering with the first filter unit */ + tcx_ltp_synth_filter_10( sig_out + delay, sig_in + delay, L_transition, hTcxLtpDec->tcxltp_pitch_int_post_prev, hTcxLtpDec->tcxltp_pitch_fr_post_prev, hTcxLtpDec->tcxltp_gain_post_prev, st->pit_res_max_past, hTcxLtpDec->tcxltp_filt_idx_prev ); + } + else if ( gain != 0.f && hTcxLtpDec->tcxltp_gain_post_prev == 0.f ) + { + /* Filtering with the second filter unit */ + tcx_ltp_synth_filter_01( sig_out + delay, sig_in + delay, L_transition, pitch_int, pitch_fr, gain, st->pit_res_max, filtIdx ); + } + else if ( gain == hTcxLtpDec->tcxltp_gain_post_prev && pitch_int == hTcxLtpDec->tcxltp_pitch_int_post_prev && pitch_fr == hTcxLtpDec->tcxltp_pitch_fr_post_prev && st->pit_res_max == st->pit_res_max_past && filtIdx == hTcxLtpDec->tcxltp_filt_idx_prev ) + { + tcx_ltp_synth_filter( sig_out + delay, sig_in + delay, L_transition, pitch_int, pitch_fr, gain, st->pit_res_max, filtIdx ); + } + else + { + /* Filtering with the first filter unit, followed by the filtering with the second filter unit */ + tcx_ltp_synth_filter_11_unequal_pitch( sig_out + delay, sig_in + delay, L_transition, pitch_int, pitch_fr, gain, st->pit_res_max, filtIdx, + hTcxLtpDec->tcxltp_pitch_int_post_prev, hTcxLtpDec->tcxltp_pitch_fr_post_prev, hTcxLtpDec->tcxltp_gain_post_prev, st->pit_res_max_past, hTcxLtpDec->tcxltp_filt_idx_prev ); + } + } + else + { + if ( gain == 0.f && hTcxLtpDec->tcxltp_gain_post_prev == 0.f ) + { + mvr2r( sig_in + delay, sig_out + delay, L_transition ); + } + else if ( hTcxLtpDec->tcxltp_gain_post_prev == 0.f ) + { + tcx_ltp_synth_filter_fadein( sig_out + delay, sig_in + delay, L_transition, pitch_int, pitch_fr, gain, st->pit_res_max, filtIdx ); + } + else if ( gain == 0.f ) + { + tcx_ltp_synth_filter_fadeout( sig_out + delay, sig_in + delay, L_transition, hTcxLtpDec->tcxltp_pitch_int_post_prev, hTcxLtpDec->tcxltp_pitch_fr_post_prev, hTcxLtpDec->tcxltp_gain_post_prev, st->pit_res_max_past, hTcxLtpDec->tcxltp_filt_idx_prev ); + } + else if ( gain == hTcxLtpDec->tcxltp_gain_post_prev && pitch_int == hTcxLtpDec->tcxltp_pitch_int_post_prev && pitch_fr == hTcxLtpDec->tcxltp_pitch_fr_post_prev ) + { + tcx_ltp_synth_filter( sig_out + delay, sig_in + delay, L_transition, pitch_int, pitch_fr, gain, st->pit_res_max, filtIdx ); + } + else + { + { + tcx_ltp_get_lpc( sig_out + delay - output_frame, output_frame, A, lpcorder ); + tcx_ltp_get_zir( zir, L_transition, sig_out + delay - lpcorder, sig_in + delay - lpcorder, A, lpcorder, gain, pitch_int, pitch_fr, st->pit_res_max, filtIdx ); + tcx_ltp_synth_filter_zir( sig_out + delay, sig_in + delay, L_transition, pitch_int, pitch_fr, gain, st->pit_res_max, zir, filtIdx ); + } + } + } + + /******** Current-frame part - subsequent subinterval, filtered with the third filter unit ********/ + tcx_ltp_synth_filter( sig_out + ( delay + L_transition ), sig_in + ( delay + L_transition ), output_frame - ( delay + L_transition ), pitch_int, pitch_fr, gain, st->pit_res_max, filtIdx ); + + /******** Output ********/ + + /* copy to output */ + mvr2r( sig_out, sig, output_frame ); + + /* Update */ + hTcxLtpDec->tcxltp_pitch_int_post_prev = pitch_int; + hTcxLtpDec->tcxltp_pitch_fr_post_prev = pitch_fr; + hTcxLtpDec->tcxltp_gain_post_prev = gain2; + hTcxLtpDec->tcxltp_filt_idx_prev = filtIdx; + st->pit_res_max_past = st->pit_res_max; + mvr2r( sig_out, hTcxLtpDec->tcxltp_mem_out, output_frame ); + + return; +} diff --git a/lib_com/tcx_mdct.c b/lib_com/tcx_mdct.c new file mode 100644 index 0000000000000000000000000000000000000000..e8ac35d07aa1c67f1cc385de95ad4330e8d38464 --- /dev/null +++ b/lib_com/tcx_mdct.c @@ -0,0 +1,255 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * TCX_MDCT() + * + * + *-------------------------------------------------------------------*/ + +void TCX_MDCT( + const float *x, + float *y, + const int16_t l, + const int16_t m, + const int16_t r, + const int16_t element_mode ) +{ + int16_t i; + float dctInBuffer[N_MAX]; + + /* Init */ + for ( i = 0; i < m / 2; i++ ) + { + dctInBuffer[m / 2 + r / 2 + i] = -1.0f * x[l + m / 2 - 1 - i]; + } + + for ( i = 0; i < l / 2; i++ ) + { + dctInBuffer[m / 2 + r / 2 + m / 2 + i] = x[i] - x[l - 1 - i]; + } + + for ( i = 0; i < m / 2; i++ ) + { + dctInBuffer[m / 2 + r / 2 - 1 - i] = -1.0f * x[l + m / 2 + i]; + } + + for ( i = 0; i < r / 2; i++ ) + { + dctInBuffer[m / 2 + r / 2 - 1 - m / 2 - i] = -1.0f * x[l + m + i] - x[l + m + r - 1 - i]; + } + + edct( dctInBuffer, y, l / 2 + m + r / 2, element_mode ); + + v_multc( y, (float) sqrt( (float) NORM_MDCT_FACTOR / ( l / 2 + m + r / 2 ) ), y, l / 2 + m + r / 2 ); + + return; +} + + +/*-------------------------------------------------------------------* + * TCX_MDST() + * + * + *-------------------------------------------------------------------*/ + +void TCX_MDST( + const float *x, + float *y, + const int16_t l, + const int16_t m, + const int16_t r, + const int16_t element_mode ) +{ + int16_t i; + float dctInBuffer[N_MAX]; + + /* Init */ + for ( i = 0; i < m / 2; i++ ) + { + dctInBuffer[m / 2 + r / 2 + i] = -1.0f * x[l + m / 2 - 1 - i]; + } + for ( i = 0; i < l / 2; i++ ) + { + dctInBuffer[m / 2 + r / 2 + m / 2 + i] = -1.0f * x[i] - x[l - 1 - i]; + } + for ( i = 0; i < m / 2; i++ ) + { + dctInBuffer[m / 2 + r / 2 - 1 - i] = -1.0f * x[l + m / 2 + i]; + } + for ( i = 0; i < r / 2; i++ ) + { + dctInBuffer[m / 2 + r / 2 - 1 - m / 2 - i] = -1.0f * x[l + m + i] + x[l + m + r - 1 - i]; + } + + edst( dctInBuffer, y, l / 2 + m + r / 2, element_mode ); + + v_multc( y, (float) sqrt( (float) NORM_MDCT_FACTOR / ( l / 2 + m + r / 2 ) ), y, l / 2 + m + r / 2 ); + + return; +} + + +/*-------------------------------------------------------------------* + * TCX_MDCT_Inverse() + * + * + *-------------------------------------------------------------------*/ + +void TCX_MDCT_Inverse( + const float *x, + float *y, + const int16_t l, + const int16_t m, + const int16_t r, + const int16_t element_mode ) +{ + int16_t i; + const int16_t L2 = l >> 1, R2 = r >> 1; + float f; + + edct( x, y + L2, L2 + m + R2, element_mode ); + + for ( i = 0; i < R2; i++ ) + { + y[l + m + R2 + i] = -1.0f * y[L2 + i]; /* fold out right end of DCT */ + } + + mvr2r( y + L2 + m + R2, y, L2 ); /* negate, fold out left end of DCT */ + + for ( i = 0; i < ( ( L2 + m + R2 ) >> 1 ); i++ ) + { + f = y[L2 + i]; + y[L2 + i] = -1.0f * y[l + m + R2 - 1 - i]; /* time-reverse mid of DCT */ + y[l + m + R2 - 1 - i] = -1.0f * f; + } + + v_multc( y, (float) sqrt( (float) ( l / 2 + m + r / 2 ) / NORM_MDCT_FACTOR ), y, l + m + r ); + + return; +} + + +/*-------------------------------------------------------------------* + * TCX_MDST_Inverse() + * + * + *-------------------------------------------------------------------*/ + +void TCX_MDST_Inverse( + const float *x, + float *y, + const int16_t l, + const int16_t m, + const int16_t r, + const int16_t element_mode ) +{ + int16_t i; + const int16_t L2 = l >> 1, R2 = r >> 1; + float f; + + edst( x, y + L2, L2 + m + R2, element_mode ); + + mvr2r( y + L2, y + l + m + R2, R2 ); /* negate, fold out right end of DST */ + + for ( i = 0; i < L2; i++ ) + { + y[i] = -1.0f * y[L2 + m + R2 + i]; /* fold out left end of DST */ + } + + for ( i = 0; i < ( ( L2 + m + R2 ) >> 1 ); i++ ) + { + f = y[L2 + i]; + y[L2 + i] = -1.0f * y[l + m + R2 - 1 - i]; /* time-reverse mid of DST */ + y[l + m + R2 - 1 - i] = -1.0f * f; + } + + v_multc( y, (float) sqrt( (float) ( l / 2 + m + r / 2 ) / NORM_MDCT_FACTOR ), y, l + m + r ); + + return; +} + + +/*-------------------------------------------------------------------* + * TCX_MDXT_Inverse() + * + * + *-------------------------------------------------------------------*/ + +void TCX_MDXT_Inverse( + const float *x, + float *y, + const int16_t l, + const int16_t m, + const int16_t r, + const uint16_t kernel_type ) +{ + const float signLeft = ( kernel_type >= MDCT_II ? -1.f : 1.f ); + const float signRight = ( kernel_type & 1 ? 1.f : -1.f ); + int16_t i; + const int16_t L2 = l >> 1, R2 = r >> 1; + float f; + + edxt( x, y + L2, L2 + m + R2, kernel_type, TRUE ); + + for ( i = 0; i < L2; i++ ) + { + y[i] = signLeft * y[L2 + m + R2 + i]; /* fold out the left end */ + } + + for ( i = 0; i < R2; i++ ) + { + y[l + m + R2 + i] = signRight * y[L2 + i]; /* ...and right end */ + } + + for ( i = 0; i < ( ( L2 + m + R2 ) >> 1 ); i++ ) + { + f = y[L2 + i]; + y[L2 + i] = -1.0f * y[l + m + R2 - 1 - i]; /* time-reverse mid */ + y[l + m + R2 - 1 - i] = -1.0f * f; + } + + v_multc( y, (float) sqrt( (float) ( l / 2 + m + r / 2 ) / NORM_MDCT_FACTOR ), y, l + m + r ); + + return; +} diff --git a/lib_com/tcx_mdct_window.c b/lib_com/tcx_mdct_window.c new file mode 100644 index 0000000000000000000000000000000000000000..05a70cdc908d1d9158d01339ed96565852d07916 --- /dev/null +++ b/lib_com/tcx_mdct_window.c @@ -0,0 +1,260 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*------------------------------------------------------------------- + * mdct_window_sine() + * + * + *-------------------------------------------------------------------*/ +void mdct_window_sine( + float *window, + const int32_t Fs, + const int16_t n, + const int16_t window_type, + const int16_t element_mode ) +{ + if ( element_mode == EVS_MONO ) + { + int16_t i; + float c; + + c = EVS_PI / ( 2.0f * (float) n ); + + for ( i = 0; i < n; i++ ) + { + window[i] = (float) sin( c * ( 0.5f + (float) i ) ); + } + } + else + { + const float *window_table = 0; + int16_t buf_in_size = 0; + switch ( window_type ) + { + case FULL_OVERLAP: + window_table = tcx_mdct_window_48; + buf_in_size = 420; + break; + case HALF_OVERLAP: + window_table = tcx_mdct_window_half_48; + buf_in_size = 180; + break; + case TRANSITION_OVERLAP: + case MIN_OVERLAP: + window_table = tcx_mdct_window_trans_48; + buf_in_size = 60; + break; + + default: + assert( 0 && "Unsupported window type" ); + break; + } + + if ( Fs == 48000 ) + { + mvr2r( window_table, window, n ); + } + else + { + lerp( window_table, window, n, buf_in_size ); + } + } + + return; +} + + +/*------------------------------------------------------------------- + * mdct_window_aldo() + * + * + *-------------------------------------------------------------------*/ + +void mdct_window_aldo( + float *window1, + float *window2, + const int16_t n ) +{ + int16_t i, n1, n2, d; + const float *p1, *p2; + + /* set table pointers and decimation factor */ + switch ( n ) + { + case 320 / 2: + p1 = window_48kHz + 2; + p2 = window_48kHz + 1110 - 3; + d = 6; + break; + case 512 / 2: + p1 = window_256kHz; + p2 = window_256kHz + 592 - 1; + d = 2; + break; + case 640 / 2: + p1 = window_48kHz + 1; + p2 = window_48kHz + 1110 - 2; + d = 3; + break; + case 1024 / 2: + p1 = window_256kHz; + p2 = window_256kHz + 592 - 1; + d = 1; + break; + case 1280 / 2: + p1 = window_48kHz + 1; + p2 = window_48kHz + 1110 - 2; + d = 3; + break; + case 1920 / 2: + p1 = window_48kHz; + p2 = window_48kHz + 1110 - 1; + d = 1; + break; + default: + assert( 0 ); + return; + } + + /* set lengths */ + n1 = n * 23 / 32; /* left slope length */ + n2 = n * 14 / 32; /* right slope length */ + + /* first part (long slope) */ + if ( n != 1280 / 2 ) + { + for ( i = 0; i < n / 2; i++ ) + { + *window1 = *p1; + window1++; + p1 += d; + } + + if ( ( n == 512 / 2 ) || ( n == 320 / 2 ) ) + p1++; + + for ( ; i < n1; i++ ) + { + *window1 = *p1; + window1++; + p1 += d; + } + } + else + { + const float *pi = window_8_16_32kHz; + + for ( i = 0; i < n / 2; i += 2 ) + { + *window1 = *p1; + window1++; + p1 += d; + + *window1 = *pi; + window1++; + pi++; + } + for ( ; i < n1; i += 2 ) + { + *window1 = *pi; + window1++; + pi++; + + *window1 = *p1; + window1++; + p1 += d; + } + } + + /* second part (short slope) */ + + if ( n != 1280 / 2 ) + { + for ( i = 0; i < n2 / 2; i++ ) + { + *window2 = *p2; + window2++; + p2 -= d; + } + + if ( ( n == 512 / 2 ) || ( n == 320 / 2 ) ) + p2--; + + for ( ; i < n2; i++ ) + { + *window2 = *p2; + window2++; + p2 -= d; + } + } + else + { + const float *pi = window_8_16_32kHz + 370 - 1; + + for ( i = 0; i < n2 / 2; i += 2 ) + { + *window2 = *p2; + window2++; + p2 -= d; + + *window2 = *pi; + window2++; + pi--; + } + + for ( ; i < n2; i += 2 ) + { + *window2 = *pi; + window2++; + pi--; + + *window2 = *p2; + window2++; + p2 -= d; + } + } + + return; +} diff --git a/lib_com/tcx_utils.c b/lib_com/tcx_utils.c new file mode 100644 index 0000000000000000000000000000000000000000..a96c19e11784c3c251b8e540bae2861d3b9e92ac --- /dev/null +++ b/lib_com/tcx_utils.c @@ -0,0 +1,1005 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include "options.h" +#include +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * tcx_get_windows() + * + * + *-------------------------------------------------------------------*/ +void tcx_get_windows( + TCX_CONFIG_HANDLE hTcxCfg, /* i : TCX configuration */ + const int16_t left_mode, /* i : overlap mode of left window half */ + const int16_t right_mode, /* i : overlap mode of right window half */ + int16_t *left_overlap, /* o : left overlap length */ + const float **left_win, /* o : left overlap window */ + int16_t *right_overlap, /* o : right overlap length */ + const float **right_win, /* o : right overlap window */ + const int16_t fullband /* i : fullband flag */ +) +{ + if ( !fullband ) + { + /* Left part */ + + if ( left_mode == TRANSITION_OVERLAP ) + { + /* ACELP->TCX transition */ + *left_overlap = hTcxCfg->tcx_mdct_window_trans_length; + *left_win = hTcxCfg->tcx_mdct_window_trans; + } + else if ( left_mode == MIN_OVERLAP ) + { + *left_overlap = hTcxCfg->tcx_mdct_window_min_length; + *left_win = hTcxCfg->tcx_mdct_window_minimum; + } + else if ( left_mode == HALF_OVERLAP ) + { + *left_overlap = hTcxCfg->tcx_mdct_window_half_length; + *left_win = hTcxCfg->tcx_mdct_window_half; + } + else if ( left_mode == FULL_OVERLAP ) + { + *left_overlap = hTcxCfg->tcx_mdct_window_length; + *left_win = hTcxCfg->tcx_aldo_window_1_trunc; + } + else + { + assert( !"Not supported overlap" ); + } + + /* Right part */ + + if ( right_mode == MIN_OVERLAP ) + { + *right_overlap = hTcxCfg->tcx_mdct_window_min_length; + *right_win = hTcxCfg->tcx_mdct_window_minimum; + } + else if ( right_mode == HALF_OVERLAP ) + { + *right_overlap = hTcxCfg->tcx_mdct_window_half_length; + *right_win = hTcxCfg->tcx_mdct_window_half; + } + else if ( right_mode == FULL_OVERLAP ) + { + *right_overlap = hTcxCfg->tcx_mdct_window_delay; + *right_win = hTcxCfg->tcx_aldo_window_2; + } + else + { + assert( !"Not supported overlap" ); + } + } + else + { + /* Left part */ + + if ( left_mode == TRANSITION_OVERLAP ) + { + /* ACELP->TCX transition */ + *left_overlap = hTcxCfg->tcx_mdct_window_trans_lengthFB; + *left_win = hTcxCfg->tcx_mdct_window_transFB; + } + else if ( left_mode == MIN_OVERLAP ) + { + *left_overlap = hTcxCfg->tcx_mdct_window_min_lengthFB; + *left_win = hTcxCfg->tcx_mdct_window_minimumFB; + } + else if ( left_mode == HALF_OVERLAP ) + { + *left_overlap = hTcxCfg->tcx_mdct_window_half_lengthFB; + *left_win = hTcxCfg->tcx_mdct_window_halfFB; + } + else if ( left_mode == RECTANGULAR_OVERLAP ) + { + *left_overlap = 0; + *left_win = NULL; + } + else if ( left_mode == FULL_OVERLAP ) + { + *left_overlap = hTcxCfg->tcx_mdct_window_lengthFB; + *left_win = hTcxCfg->tcx_aldo_window_1_FB_trunc; + } + else + { + assert( !"Not supported overlap" ); + } + + /* Right part */ + + if ( right_mode == MIN_OVERLAP ) + { + *right_overlap = hTcxCfg->tcx_mdct_window_min_lengthFB; + *right_win = hTcxCfg->tcx_mdct_window_minimumFB; + } + else if ( right_mode == HALF_OVERLAP ) + { + *right_overlap = hTcxCfg->tcx_mdct_window_half_lengthFB; + *right_win = hTcxCfg->tcx_mdct_window_halfFB; + } + else if ( right_mode == RECTANGULAR_OVERLAP ) + { + *right_overlap = 0; + *right_win = NULL; + } + else if ( right_mode == FULL_OVERLAP ) + { + *right_overlap = hTcxCfg->tcx_mdct_window_delayFB; + *right_win = hTcxCfg->tcx_aldo_window_2_FB; + } + else + { + assert( !"Not supported overlap" ); + } + } + + return; +} + +/*-------------------------------------------------------------------* + * tcx_windowing_analysis() + * + * + *-------------------------------------------------------------------*/ + +void tcx_windowing_analysis( + const float *signal, /* i : signal vector */ + const int16_t L_frame, /* i : frame length */ + const int16_t left_overlap, /* i : left overlap length */ + const float *left_win, /* i : left overlap window */ + const int16_t right_overlap, /* i : right overlap length */ + const float *right_win, /* i : right overlap window */ + float *output /* o : windowed signal vector */ +) +{ + int16_t w; + + /* Left overlap */ + for ( w = 0; w < left_overlap; w++ ) + { + *output++ = *signal++ * left_win[w]; + } + + /* Non overlapping region */ + for ( w = 0; w < L_frame - ( left_overlap + right_overlap ) / 2; w++ ) + { + *output++ = *signal++; + } + + /* Right overlap */ + for ( w = 0; w < right_overlap; w++ ) + { + *output++ = *signal++ * right_win[right_overlap - 1 - w]; + } + + return; +} + + +/*-------------------------------------------------------------------* + * WindowSignal() + * + * + *-------------------------------------------------------------------*/ + +void WindowSignal( + TCX_CONFIG_HANDLE hTcxCfg, /* i : configuration of TCX */ + int16_t offset, /* i : left folding point offset relative to the input signal pointer */ + const int16_t left_overlap_mode, /* i : overlap mode of left window half */ + const int16_t right_overlap_mode, /* i : overlap mode of right window half */ + int16_t *left_overlap_length, /* o : TCX window left overlap length */ + int16_t *right_overlap_length, /* o : TCX window right overlap length */ + const float in[], /* i : input signal */ + int16_t *L_frame, /* i/o: frame length */ + float out[], /* o : output windowed signal */ + const int16_t truncate_aldo, /* i : nonzero to truncate long ALDO slope */ + const int16_t fullband /* i : fullband flag */ +) +{ + int16_t l, r; + const float *left_win; + const float *right_win; + + /*-----------------------------------------------------------* + * Init * + *-----------------------------------------------------------*/ + + tcx_get_windows( hTcxCfg, left_overlap_mode, right_overlap_mode, &l, &left_win, &r, &right_win, fullband ); + + /* Init lengths */ + + /* if past frame is ACELP */ + if ( left_overlap_mode == TRANSITION_OVERLAP ) + { + /* Increase frame size for 5ms */ + if ( !fullband ) + { + *L_frame += hTcxCfg->tcx5Size; + offset = -hTcxCfg->tcx_mdct_window_trans_length / 2; + } + else + { + *L_frame += hTcxCfg->tcx5SizeFB; + offset = -hTcxCfg->tcx_mdct_window_trans_lengthFB / 2; + } + } + + /*-----------------------------------------------------------* + * Windowing * + *-----------------------------------------------------------*/ + + tcx_windowing_analysis( in - l / 2 + offset, *L_frame, l, left_win, r, right_win, out ); + + if ( left_overlap_mode == FULL_OVERLAP && truncate_aldo ) + { + /* fade truncated ALDO window to avoid discontinuities */ + if ( !fullband ) + { + v_mult( out, hTcxCfg->tcx_mdct_window_minimum, out, hTcxCfg->tcx_mdct_window_min_length ); + } + else + { + v_mult( out, hTcxCfg->tcx_mdct_window_minimumFB, out, hTcxCfg->tcx_mdct_window_min_lengthFB ); + } + } + + *left_overlap_length = l; + *right_overlap_length = r; + + return; +} + + +/*-------------------------------------------------------------------* + * tcx_windowing_synthesis_current_frame() + * + * + *-------------------------------------------------------------------*/ + +void tcx_windowing_synthesis_current_frame( + float *signal, /* i/o: signal vector */ + const float *window, /* i : TCX window vector */ + const float *window_half, /* i : TCX window vector for half-overlap window */ + const float *window_min, /* i : TCX minimum overlap window */ + const int16_t window_length, /* i : TCX window length */ + const int16_t window_half_length, /* i : TCX half window length */ + const int16_t window_min_length, /* i : TCX minimum overlap length */ + const int16_t left_rect, /* i : left part is rectangular */ + const int16_t left_mode, /* i : overlap mode of left window half */ + float *acelp_zir, /* i/o: acelp ZIR */ + const float *old_syn, /* i : old synthesis */ + const float *syn_overl, /* i : overlap synthesis */ + const float *A_zir, + const float *window_trans, + int16_t acelp_zir_len, + const int16_t acelp_mem_len, + const int16_t last_core_bfi, /* i : last mode */ + const int16_t last_is_cng, + const int16_t fullbandScale ) +{ + int16_t i, w, overlap; + float tmp[L_FRAME_MAX / 2]; + + /* Init */ + overlap = window_length >> 1; + + /* Past-frame is TCX concealed as CNG and current-frame is TCX */ + if ( last_is_cng == 1 && left_rect == 0 ) + { + if ( !fullbandScale ) + { + set_zero( acelp_zir, acelp_zir_len ); + syn_filt( A_zir, M, acelp_zir, acelp_zir, acelp_zir_len, signal + overlap + acelp_mem_len - M, 0 ); + } + else + { + lerp( acelp_zir, tmp, acelp_zir_len, acelp_zir_len * FSCALE_DENOM / fullbandScale ); + acelp_zir = tmp; + } + + for ( i = 0; i < acelp_zir_len; i++ ) + { + signal[i] *= (float) ( i ) / (float) ( acelp_zir_len ); + signal[i] += acelp_zir[i] * (float) ( acelp_zir_len - i ) / (float) ( acelp_zir_len ); + } + } + else if ( left_rect == 1 && last_core_bfi == ACELP_CORE ) /* Rectangular window (past-frame is ACELP) */ + { + for ( i = 0; i < overlap - acelp_mem_len; i++ ) + { + signal[i] = 0; + } + + if ( fullbandScale == 0 ) + { + /*OLA with ACELP*/ + for ( i = 0; i < 2 * acelp_mem_len; i++ ) + { + /*window decoded TCX with aliasing*/ + signal[i + overlap - acelp_mem_len] *= window_trans[i]; + /*Time TDAC: 1)forward part of ACELP*/ + signal[i + overlap - acelp_mem_len] += old_syn[acelp_zir_len - 2 * acelp_mem_len + i] * window_trans[2 * acelp_mem_len - i - 1] * window_trans[2 * acelp_mem_len - i - 1]; + + /*Time TDAC: 1)reward part of ACELP*/ + signal[i + overlap - acelp_mem_len] += old_syn[acelp_zir_len - i - 1] * window_trans[i] * window_trans[2 * acelp_mem_len - i - 1]; + } + + for ( i = 0; i < M; i++ ) + { + signal[overlap + acelp_mem_len - M + i] -= old_syn[acelp_zir_len - M + i]; + } + } + + /* ZIR at the end of the ACELP frame */ + acelp_zir_len = 64; + + if ( !fullbandScale ) + { + set_zero( acelp_zir, acelp_zir_len ); + syn_filt( A_zir, M, acelp_zir, acelp_zir, acelp_zir_len, signal + overlap + acelp_mem_len - M, 0 ); + } + else + { + lerp( acelp_zir, tmp, acelp_zir_len * fullbandScale / FSCALE_DENOM, acelp_zir_len ); + acelp_zir_len = acelp_zir_len * fullbandScale / FSCALE_DENOM; + acelp_zir = tmp; + + if ( acelp_zir_len >= 2.0f * 64 ) + { + /* apply a simple low-pass to the ZIR, to avoid potentially unmasked HF content */ + for ( i = 2; i < acelp_zir_len; i++ ) + { + acelp_zir[i] = 0.25f * acelp_zir[i - 2] + 0.35f * acelp_zir[i - 1] + 0.40f * acelp_zir[i]; + } + acelp_zir[acelp_zir_len - 1] = 0.40f * acelp_zir[acelp_zir_len - 1] + 0.35f * acelp_zir[acelp_zir_len - 1] + 0.25f * acelp_zir[acelp_zir_len - 2]; + acelp_zir[acelp_zir_len - 2] = 0.40f * acelp_zir[acelp_zir_len - 2] + 0.35f * acelp_zir[acelp_zir_len - 1] + 0.25f * acelp_zir[acelp_zir_len - 1]; + for ( i = acelp_zir_len - 3; i >= 0; i-- ) + { + acelp_zir[i] = 0.40f * acelp_zir[i] + 0.35f * acelp_zir[i + 1] + 0.25f * acelp_zir[i + 2]; + } + } + } + + for ( i = 0; i < acelp_zir_len; i++ ) + { + /*remove reconstructed ZIR and add ACELP ZIR*/ + signal[i + overlap + acelp_mem_len] -= acelp_zir[i] * (float) ( acelp_zir_len - i ) / (float) acelp_zir_len; + } + } + else if ( left_rect == 1 && last_core_bfi != 0 ) /* Rectangular window (past-frame is TCX) */ + { + for ( i = 0; i < overlap + acelp_mem_len; i++ ) + { + signal[i] = 0; + } + for ( i = 0; i < window_length; i++ ) + { + signal[i + overlap + acelp_mem_len] *= window[i]; + } + } + else if ( left_rect != 1 && last_core_bfi == 0 ) /* Normal window (past-frame is ACELP) */ + { + for ( i = 0; i < window_length; i++ ) + { + signal[i] *= window[i]; + } + + for ( i = 0; i < window_length; i++ ) + { + signal[i] += syn_overl[i]; + } + } + else /* Normal window (past-frame is TCX) */ + { + if ( left_mode == 2 ) + { + /* min. overlap */ + for ( i = 0; i < ( window_length - window_min_length ) / 2; i++ ) + { + signal[i] = 0.0f; + } + for ( w = 0; w < window_min_length; i++, w++ ) + { + signal[i] *= window_min[w]; + } + } + else if ( left_mode == 3 ) + { + /* half OL */ + for ( i = 0; i < ( window_length - window_half_length ) / 2; i++ ) + { + signal[i] = 0.0f; + } + for ( w = 0; w < window_half_length; i++, w++ ) + { + signal[i] *= window_half[w]; + } + } + else + { + /* normal full/maximum overlap */ + for ( i = 0; i < window_length; i++ ) + { + signal[i] *= window[i]; + } + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * tcx_windowing_synthesis_past_frame() + * + * + *-------------------------------------------------------------------*/ + +void tcx_windowing_synthesis_past_frame( + float *signal, /* i/o: signal vector */ + const float *window, /* i : TCX window vector */ + const float *window_half, /* i : TCX window vector for half-overlap window */ + const float *window_min, /* i : TCX minimum overlap window */ + const int16_t window_length, /* i : TCX window length */ + const int16_t window_half_length, /* i : TCX half window length */ + const int16_t window_min_length, /* i : TCX minimum overlap length */ + const int16_t right_mode /* i : overlap mode (left_mode of current frame) */ +) +{ + int16_t i, w; + + if ( right_mode == MIN_OVERLAP ) + { + /* min. overlap */ + for ( i = ( window_length - window_min_length ) / 2, w = 0; w < window_min_length; i++, w++ ) + { + signal[i] *= window_min[window_min_length - 1 - w]; + } + for ( ; i < window_length; i++ ) + { + signal[i] = 0.0f; + } + } + else if ( right_mode == HALF_OVERLAP ) + { + /* half OL */ + for ( i = ( window_length - window_half_length ) / 2, w = 0; w < window_half_length; i++, w++ ) + { + signal[i] *= window_half[window_half_length - 1 - w]; + } + for ( ; i < window_length; i++ ) + { + signal[i] = 0.0f; + } + } + else if ( right_mode == FULL_OVERLAP ) + { + /* normal full/maximum overlap */ + for ( i = 0; i < window_length; i++ ) + { + signal[i] *= window[window_length - 1 - i]; + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * lpc2mdct() + * + * + *-------------------------------------------------------------------*/ + +void lpc2mdct( + float *lpcCoeffs, + const int16_t lpcOrder, + float mdct_gains[], + const int16_t length, + const int16_t noInverse ) +{ + float RealData[2 * FDNS_NPTS], ImagData[2 * FDNS_NPTS]; + float tmp; + int16_t i, sizeN; + + assert( length <= FDNS_NPTS ); + + sizeN = 2 * length; + + /* ODFT */ + for ( i = 0; i < lpcOrder + 1; i++ ) + { + tmp = (float) ( ( (float) i ) * EVS_PI / (float) ( sizeN ) ); + RealData[i] = (float) ( lpcCoeffs[i] * cos( tmp ) ); + ImagData[i] = (float) ( -lpcCoeffs[i] * sin( tmp ) ); + } + + for ( ; i < sizeN; i++ ) + { + RealData[i] = 0.f; + ImagData[i] = 0.f; + } + + DoFFT( RealData, ImagData, sizeN ); + + if ( noInverse ) + { + for ( i = 0; i < length; i++ ) + { + mdct_gains[i] = (float) ( sqrt( RealData[i] * RealData[i] + ImagData[i] * ImagData[i] ) ); + } + } + else + /* Get amplitude */ + { + for ( i = 0; i < length; i++ ) + { + mdct_gains[i] = (float) ( 1.0f / max( EPSILON, sqrt( RealData[i] * RealData[i] + ImagData[i] * ImagData[i] ) ) ); + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * mdct_noiseShaping() + * + * + *-------------------------------------------------------------------*/ + +void mdct_noiseShaping( + float x[], + const int16_t lg, + const float gains[], + const int16_t nBands ) +{ + int16_t i, j, k, l; + float g; + int16_t m, n, k1, k2; + + j = 0; + assert( nBands != 0 ); + k = lg / nBands; + m = lg % nBands; + + if ( m ) + { + if ( m <= ( FDNS_NPTS / 2 ) ) + { + n = FDNS_NPTS / m; + k1 = k; + k2 = k + 1; + } + else + { + n = FDNS_NPTS / ( FDNS_NPTS - m ); + k1 = k + 1; + k2 = k; + } + + for ( i = 0; i < lg; ) + { + if ( j % n ) + { + k = k1; + } + else + { + k = k2; + } + g = gains[j++]; + + /* Limit number of loops, if end is reached */ + k = min( k, lg - i ); + + for ( l = 0; l < k; l++ ) + { + x[i++] *= g; + } + } + } + else + { + for ( i = 0; i < lg; ) + { + g = gains[j++]; + + for ( l = 0; l < k; l++ ) + { + x[i++] *= g; + } + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * PsychAdaptLowFreqDeemph() + * + * + *-------------------------------------------------------------------*/ + +void PsychAdaptLowFreqDeemph( + float x[], + const float lpcGains[], + float lf_deemph_factors[] ) +{ + int16_t i; + float max_val, fac, tmp; + + max_val = tmp = lpcGains[0]; + + /* find minimum (tmp) and maximum (max) of LPC gains in low frequencies */ + for ( i = 1; i < 9; i++ ) + { + if ( tmp > lpcGains[i] ) + { + tmp = lpcGains[i]; + } + if ( max_val < lpcGains[i] ) + { + max_val = lpcGains[i]; + } + } + + tmp *= 32.0f; + + if ( ( max_val < tmp ) && ( tmp > FLT_MIN ) ) + { + fac = tmp = (float) pow( max_val / tmp, 0.0078125f ); + + if ( lf_deemph_factors ) + { + /* gradual lowering of lowest 32 bins; DC is lowered by (max/tmp)^1/4 */ + for ( i = 31; i >= 0; i-- ) + { + x[i] *= fac; + lf_deemph_factors[i] *= fac; + fac *= tmp; + } + } + else + { + /* gradual lowering of lowest 32 bins; DC is lowered by (max/tmp)^1/4 */ + for ( i = 31; i >= 0; i-- ) + { + x[i] *= fac; + fac *= tmp; + } + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * AdaptLowFreqDeemph() + * + * + *-------------------------------------------------------------------*/ + +void AdaptLowFreqDeemph( + float x[], + int16_t tcx_lpc_shaped_ari, + const float lpcGains[], + const int16_t lg, + float lf_deemph_factors[] ) +{ + int16_t i, i_max_old, i_max; + + if ( !tcx_lpc_shaped_ari ) + { + /* 1. find first magnitude maximum in lower quarter of spectrum */ + i_max = -1; + + for ( i = 0; i < lg / 4; i++ ) + { + if ( ( x[i] <= -4.0f ) || ( x[i] >= 4.0f ) ) + { + x[i] += ( x[i] < 0.0f ) ? 2.0f : -2.0f; + i_max = i; + break; + } + } + /* 2. expand value range of all xi up to i_max: two extra steps */ + + for ( i = 0; i < i_max; i++ ) + { + x[i] *= 0.5f; + lf_deemph_factors[i] *= 0.5f; + } + /* 3. find first magnitude maximum in lower quarter of spectrum */ + i_max_old = i_max; + + if ( i_max_old > -1 ) + { + i_max = -1; + + for ( i = 0; i < lg / 4; i++ ) + { + if ( ( x[i] <= -4.0f ) || ( x[i] >= 4.0f ) ) + { + x[i] += ( x[i] < 0.0f ) ? 2.0f : -2.0f; + i_max = i; + break; + } + } + } + /* 4. expand value range of all xi up to i_max: two extra steps */ + for ( i = 0; i < i_max; i++ ) + { + x[i] *= 0.5f; + lf_deemph_factors[i] *= 0.5f; + } + /* 5. always expand two lines; lines could be at index 0 and 1! */ + if ( i_max < i_max_old ) + { + i_max = i_max_old; + } + i = i_max + 1; + if ( x[i] < 0.0f ) + { + if ( x[i] > -4.0f ) + { + lf_deemph_factors[i] *= 0.5f; + } + x[i] = ( x[i] <= -4.0f ) ? x[i] + 2.0f : x[i] * 0.5f; + } + else + { + if ( x[i] < 4.0f ) + { + lf_deemph_factors[i] *= 0.5f; + } + x[i] = ( x[i] >= 4.0f ) ? x[i] - 2.0f : x[i] * 0.5f; + } + i++; + if ( x[i] < 0.0f ) + { + if ( x[i] > -4.0f ) + { + lf_deemph_factors[i] *= 0.5f; + } + x[i] = ( x[i] <= -4.0f ) ? x[i] + 2.0f : x[i] * 0.5f; + } + else + { + if ( x[i] < 4.0f ) + { + lf_deemph_factors[i] *= 0.5f; + } + x[i] = ( x[i] >= 4.0f ) ? x[i] - 2.0f : x[i] * 0.5f; + } + } + else + { + PsychAdaptLowFreqDeemph( x, lpcGains, lf_deemph_factors ); + } + + return; +} + + +/*-------------------------------------------------------------------* + * tcx_noise_filling() + * + * + *-------------------------------------------------------------------*/ + +void tcx_noise_filling( + float *Q, + const int16_t noiseFillSeed, + const int16_t iFirstLine, + const int16_t lowpassLine, + const int16_t nTransWidth, + const int16_t L_frame, + const float tiltCompFactor, + float fac_ns, + uint8_t *infoTCXNoise, + const int16_t element_mode /* i : IVAS element mode */ +) +{ + int16_t i, m, segmentOffset; + int16_t win; /* window coefficient */ + Word16 seed; + float tilt_factor, nrg, tmp1, tmp2; + + /* 16-bit random number generator seed for generating filled lines */ + seed = (Word16) noiseFillSeed; + + tilt_factor = (float) pow( max( 0.375f, tiltCompFactor ), 1.0f / (float) L_frame ); + fac_ns /= (float) ( nTransWidth * nTransWidth ); + + /* find last nonzero line below iFirstLine, use it as start offset */ + i = iFirstLine; + + if ( element_mode == IVAS_CPE_MDCT ) /* ... but only in mono or parametric stereo since it may cause binaural unmasking in discrete stereo */ + { + segmentOffset = i; + } + else + { + for ( ; i > ( iFirstLine >> 1 ); i-- ) + { + if ( Q[i] != 0.0f ) + { + break; + } + } + + fac_ns *= (float) pow( tilt_factor, (float) i ); + segmentOffset = ++i; + } + + nrg = 1e-9f; + win = 0; + + for ( ; i < lowpassLine; i++ ) + { + fac_ns *= tilt_factor; + + if ( Q[i] != 0.0f ) + { + if ( win > 0 ) + { + /* RMS-normalize current noise-filled segment */ + tmp1 = (float) sqrt( ( i - segmentOffset ) / nrg ); + tmp2 = tmp1 * (float) nTransWidth; + + for ( m = segmentOffset; m < i - win; m++ ) + { + Q[m] *= tmp2; + } + + for ( ; win > 0; win-- ) + { + Q[m++] *= tmp1 * (float) win; + } + nrg = 1e-9f; /* start new segment: reset noise segment energy */ + } + segmentOffset = i + 1; + } + else + { + /* line is zero, so fill line and update window and energy */ + if ( win < nTransWidth ) + { + win++; + } + tmp1 = (float) own_random( &seed ); + nrg += tmp1 * tmp1; /* sum up energy of current noise segment */ + Q[i] = tmp1 * (float) win * fac_ns; + + if ( infoTCXNoise ) + { + /* set noiseflags for IGF */ + infoTCXNoise[i] = 1; + } + } + } + + if ( win > 0 ) + { + /* RMS-normalize uppermost noise-filled segment */ + tmp1 = (float) sqrt( ( lowpassLine - segmentOffset ) / nrg ); + tmp2 = tmp1 * (float) nTransWidth; + + for ( m = segmentOffset; m < lowpassLine; m++ ) + { + Q[m] *= tmp2; + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * InitTnsConfigs() + * + * + *-------------------------------------------------------------------*/ + +void InitTnsConfigs( + const int16_t bwidth, + const int16_t L_frame, + STnsConfig tnsConfig[2][2], + const int16_t igfStopFreq, + const int32_t total_brate, + const int16_t element_mode, + const int16_t MCT_flag ) +{ + if ( total_brate > ACELP_32k ) + { + InitTnsConfiguration( bwidth, L_frame / 2, &tnsConfig[0][0], igfStopFreq, total_brate, element_mode, MCT_flag ); + } + + InitTnsConfiguration( bwidth, L_frame, &tnsConfig[1][0], igfStopFreq, total_brate, element_mode, MCT_flag ); + + InitTnsConfiguration( bwidth, L_frame + L_frame / 4, &tnsConfig[1][1], igfStopFreq, total_brate, element_mode, MCT_flag ); + + return; +} + + +/*-------------------------------------------------------------------* + * SetAllowTnsOnWhite + * + * set TNS config flag for possible application of TNS in the whitened domain + *-------------------------------------------------------------------*/ + +void SetAllowTnsOnWhite( + STnsConfig tnsConfig[2][2], /* o : updated TNS configurations */ + const int8_t allowTnsOnWhite /* i : flag for TNS in whiteded domain mode */ +) +{ + tnsConfig[0][0].allowTnsOnWhite = allowTnsOnWhite; + tnsConfig[0][1].allowTnsOnWhite = allowTnsOnWhite; + tnsConfig[1][0].allowTnsOnWhite = allowTnsOnWhite; + tnsConfig[1][1].allowTnsOnWhite = allowTnsOnWhite; + + return; +} + + +/*-------------------------------------------------------------------* + * SetTnsConfig() + * + * + *-------------------------------------------------------------------*/ + +void SetTnsConfig( + TCX_CONFIG_HANDLE hTcxCfg, + const int16_t isTCX20, + const int16_t isAfterACELP ) +{ + hTcxCfg->pCurrentTnsConfig = &hTcxCfg->tnsConfig[isTCX20][isAfterACELP]; + assert( hTcxCfg->pCurrentTnsConfig != NULL ); + + return; +} diff --git a/lib_com/tec_com.c b/lib_com/tec_com.c new file mode 100644 index 0000000000000000000000000000000000000000..346d38292b237a1271c2d12d84dd9dbedfed14a6 --- /dev/null +++ b/lib_com/tec_com.c @@ -0,0 +1,934 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include "options.h" +#include +#include "rom_com.h" +#include "prot.h" +#include "stat_dec.h" +#include "wmc_auto.h" + +/*------------------------------------------------------------------- + * Local constants + *-------------------------------------------------------------------*/ + +#define LOBUF_NO_SMOOTHING_MODE 1 + +#define EPS ( 1e-12f ) +#define ENV_SCALE_OFFSET_1 90.309f /* 10*log10(2^30) */ +#define MAX_TEC_BW_LO ( 12 ) +#define MAX_NB_TEC_LOW_BAND ( 3 ) + +const float TecSC[] = { 0.3662f, 0.1078f, 0.1194f, 0.1289f, 0.1365f, 0.1412f }; +const int16_t TecLowBandTable[] = { 0, 2, 4, 6 }; + +#define TecSmoothingDeg 5 +#define NbTecLowBand 3 + +#define ratioHiLoFac 1.5894f +#define thRatio 0.3649f +#define thRatio2 2.0288f +#define thCorrCoef 0.8795f +#define ratioHiLoFacDec ( 1.5894f * 0.75f ) + +/*------------------------------------------------------------------- + * calcLoBufferDec() + * + * + *-------------------------------------------------------------------*/ + +static void calcLoBufferDec( + float **pCldfbReal, + float **pCldfbImag, + float *loBuffer, + const int16_t startPos, + const int16_t stopPos, + const int16_t bandOffsetBottom, + const float scaleOffset ) +{ + int16_t slot, k, lb, li, ui; + float nrg, tmp; + + /* calc loTempEnv */ + for ( slot = startPos; slot < stopPos; slot++ ) + { + tmp = 0; + + for ( lb = 0; lb < NbTecLowBand; lb++ ) + { + li = TecLowBandTable[lb]; + ui = TecLowBandTable[lb + 1]; + + nrg = 0; + for ( k = li; k < ui; k++ ) + { + nrg += pCldfbReal[slot][k + bandOffsetBottom] * pCldfbReal[slot][k + bandOffsetBottom] + pCldfbImag[slot][k + bandOffsetBottom] * pCldfbImag[slot][k + bandOffsetBottom]; + } + tmp += (float) log10( nrg * normReciprocal[ui - li] + EPS ); + } + + loBuffer[slot] = 10.0f * tmp / NbTecLowBand + scaleOffset; + } + + return; +} + + +/*------------------------------------------------------------------- + * calcLoBufferEnc() + * + * + *-------------------------------------------------------------------*/ + +static void calcLoBufferEnc( + float **pCldfbPow, + const int16_t startPos, + const int16_t stopPos, + const int16_t bandOffsetBottom, + const float scaleOffset, + float *loBuffer ) +{ + int16_t slot, k, lb, li, ui; + float nrg, tmp; + + /* calc loTempEnv */ + for ( slot = startPos; slot < stopPos; slot++ ) + { + tmp = 0; + + for ( lb = 0; lb < NbTecLowBand; lb++ ) + { + li = TecLowBandTable[lb]; + ui = TecLowBandTable[lb + 1]; + + nrg = 0; + for ( k = li; k < ui; k++ ) + { + nrg += pCldfbPow[slot][k + bandOffsetBottom]; + } + tmp += (float) log10( nrg * normReciprocal[ui - li] + EPS ); + } + + loBuffer[slot] = 10.0f * tmp / NbTecLowBand + scaleOffset; + } + + return; +} + + +/*------------------------------------------------------------------- + * calcLoTempEnv() + * + * + *-------------------------------------------------------------------*/ + +static void calcLoTempEnv( + const float *loBuffer, + const int16_t noCols, + float *loTempEnv, + const float adjFac ) +{ + int16_t slot, i; + + for ( slot = 0; slot < noCols; slot++ ) + { + loTempEnv[slot] = TecSC[0] * loBuffer[slot]; + for ( i = 1; i < TecSmoothingDeg + 1; i++ ) + { + loTempEnv[slot] += TecSC[i] * loBuffer[slot - i]; + } + + loTempEnv[slot] *= adjFac; + } + + return; +} + +/*------------------------------------------------------------------- + * calcHiTempEnv() + * + * + *-------------------------------------------------------------------*/ + +static void calcHiTempEnv( + float **pCldfbPow, + const int16_t startPos, + const int16_t stopPos, + const int16_t lowSubband, + const int16_t highSubband, + const float scaleOffset, + float *hiTempEnv ) +{ + int16_t timeIndex, k; + int16_t bwHigh = highSubband - lowSubband; + + /* set hiTempEnv */ + for ( timeIndex = startPos; timeIndex < stopPos; timeIndex++ ) + { + hiTempEnv[timeIndex] = 0; + for ( k = lowSubband; k < highSubband; k++ ) + { + hiTempEnv[timeIndex] += pCldfbPow[timeIndex][k]; + } + hiTempEnv[timeIndex] = (float) ( 10 * log10( hiTempEnv[timeIndex] / bwHigh + EPS ) + scaleOffset ); + } + + return; +} + + +/*------------------------------------------------------------------- + * calcVar() + * + * + *-------------------------------------------------------------------*/ + +static float calcVar( + const float in[], + const int16_t len, + float *x ) +{ + float xx; + int16_t i; + + xx = 0; + *x = 0; + + for ( i = 0; i < len; i++ ) + { + xx += in[i] * in[i]; + *x += in[i]; + } + + return ( xx - ( *x * *x ) / (float) len ); +} + + +/*------------------------------------------------------------------- + * calcCorrelationCoefficient2() + * + * + *-------------------------------------------------------------------*/ + +static float calcCorrelationCoefficient2( + const float in_vec1[], + const float in_vec2[], + const int16_t len, + float var_x, + float var_y, + float x, + float y ) +{ + int16_t i; + float xy; + float ans; + + xy = 0; + + for ( i = 0; i < len; i++ ) + { + xy += ( in_vec1[i] * in_vec2[i] ); + } + + ans = ( xy - x * y / (float) ( len ) ) / (float) sqrt( var_x * var_y + EPS ); + + return ans; +} + + +/*------------------------------------------------------------------- + * resetTecDec() + * + * + *-------------------------------------------------------------------*/ + +void resetTecDec( + TEC_DEC_HANDLE hTecDec ) +{ + set_f( hTecDec->pGainTemp, 0, CLDFB_NO_COL_MAX ); + + set_f( hTecDec->loBuffer, 0.f, CLDFB_NO_COL_MAX + MAX_TEC_SMOOTHING_DEG ); + + return; +} + + +/*------------------------------------------------------------------- + * calcLoTempEnv_TBE() + * + * + *-------------------------------------------------------------------*/ + +static void calcLoTempEnv_TBE( + const float *loBuffer, + const int16_t noCols, + float *loTempEnv, + const float adjFac ) +{ + int16_t slot, i; + int16_t delay = 1; + + for ( slot = 0; slot < noCols; slot++ ) + { + loTempEnv[slot] = TecSC[0] * loBuffer[slot - delay]; + + for ( i = 1; i < TecSmoothingDeg + 1; i++ ) + { + loTempEnv[slot] += TecSC[i] * loBuffer[slot - delay - i]; + } + + loTempEnv[slot] *= adjFac; + } + + return; +} + + +/*------------------------------------------------------------------- + * set_TEC_TFA_code() + * + * + *-------------------------------------------------------------------*/ + +void set_TEC_TFA_code( + const int16_t corrFlag, + int16_t *tec_flag, + int16_t *tfa_flag ) +{ + *tec_flag = 0; + if ( *tfa_flag == 0 ) + { + if ( corrFlag == 1 ) + { + *tec_flag = 1; + } + else if ( corrFlag == 2 ) + { + *tec_flag = 1; + *tfa_flag = 1; + } + } + + return; +} + + +/*------------------------------------------------------------------- + * calcLoTempEnv_ns_TBE() + * + * + *-------------------------------------------------------------------*/ + +static void calcLoTempEnv_ns_TBE( + const float *loBuffer, + const int16_t noCols, + float *loTempEnv ) +{ + int16_t slot; + int16_t delay = 1; + float fac = 1.4f; + + for ( slot = 0; slot < noCols; slot++ ) + { + loTempEnv[slot] = fac * loBuffer[slot - delay]; + } + + return; +} + + +/*------------------------------------------------------------------- + * calcLoTempEnv_ns() + * + * + *-------------------------------------------------------------------*/ + +static void calcLoTempEnv_ns( + const float *loBuffer, + const int16_t noCols, + float *loTempEnv ) +{ + int16_t slot; + + for ( slot = 0; slot < noCols; slot++ ) + { + loTempEnv[slot] = loBuffer[slot]; + } + + return; +} + +/*------------------------------------------------------------------- + * calcGainLinear_TBE() + * + * + *-------------------------------------------------------------------*/ + +static void calcGainLinear_TBE( + const float *loTempEnv, + const int16_t startPos, + const int16_t stopPos, + float *pGainTemp ) +{ + int16_t timeIndex; + float ftmp; + + for ( timeIndex = startPos; timeIndex < stopPos; timeIndex++ ) + { + ftmp = loTempEnv[timeIndex]; + pGainTemp[timeIndex] = (float) pow( 10.0, 0.1 * ftmp ); + } + + return; +} + + +/*------------------------------------------------------------------- + * calcGainTemp_TBE() + * + * + *-------------------------------------------------------------------*/ + +void calcGainTemp_TBE( + float **pCldfbRealSrc, + float **pCldfbImagSrc, + float *loBuffer, + const int16_t startPos, /*!< Start position of the current envelope. */ + const int16_t stopPos, /*!< Stop position of the current envelope. */ + const int16_t lowSubband, /* lowSubband */ + float *pGainTemp, + const int16_t code ) +{ + float loTempEnv[16]; + const int16_t BW_LO = TecLowBandTable[NbTecLowBand]; + int16_t slot; + int16_t noCols = stopPos - startPos; + int16_t bandOffset = 0; + float scaleOffset = 0; + + assert( lowSubband >= BW_LO ); + + bandOffset = lowSubband - BW_LO; + + calcLoBufferDec( pCldfbRealSrc, pCldfbImagSrc, loBuffer + MAX_TEC_SMOOTHING_DEG, startPos, stopPos, bandOffset, scaleOffset ); + + if ( code > 0 ) + { + if ( code != 2 ) + { + calcLoTempEnv_TBE( loBuffer + MAX_TEC_SMOOTHING_DEG, noCols, loTempEnv, ratioHiLoFacDec ); + } + else + { + calcLoTempEnv_ns_TBE( loBuffer + MAX_TEC_SMOOTHING_DEG, noCols, loTempEnv ); + } + + calcGainLinear_TBE( loTempEnv, startPos, stopPos, pGainTemp ); + } + + + for ( slot = 0; slot < MAX_TEC_SMOOTHING_DEG; slot++ ) + { + loBuffer[slot] = loBuffer[slot + stopPos]; + } + + return; +} + + +/*------------------------------------------------------------------- + * setSubfrConfig() + * + * + *-------------------------------------------------------------------*/ + +static void setSubfrConfig( + const int16_t i_offset, + int16_t *k_offset, + int16_t *n_subfr, + const int16_t l_subfr ) +{ + *n_subfr = N_TEC_TFA_SUBFR - i_offset; + *k_offset = i_offset * l_subfr; + + return; +} + + +/*------------------------------------------------------------------- + * calcSubfrNrg() + * + * + *-------------------------------------------------------------------*/ + +static float calcSubfrNrg( + const float *hb_synth, + const int16_t i_offset, + float *enr, + const int16_t k_offset, + const int16_t l_subfr ) +{ + int16_t i, j, k; + float enr_all = 1e-12f; + + for ( i = i_offset, k = k_offset; i < N_TEC_TFA_SUBFR; i++ ) + { + enr[i] = 1e-12f; + for ( j = 0; j < l_subfr; j++ ) + { + enr[i] += hb_synth[k] * hb_synth[k]; + k++; + } + enr_all += enr[i]; + } + + return enr_all; +} + + +/*------------------------------------------------------------------- + * procTfa() + * + * + *-------------------------------------------------------------------*/ + +static void procTfa( + float *hb_synth, + const int16_t i_offset, + const int16_t l_subfr ) +{ + int16_t i, j, k; + int16_t k_offset, n_subfr; + float enr[N_TEC_TFA_SUBFR], enr_ave; + + setSubfrConfig( i_offset, &k_offset, &n_subfr, l_subfr ); + + enr_ave = calcSubfrNrg( hb_synth, i_offset, enr, k_offset, l_subfr ) / n_subfr; + + for ( i = i_offset, k = k_offset; i < N_TEC_TFA_SUBFR; i++ ) + { + float gain; + + gain = (float) sqrt( enr_ave / enr[i] ); + + for ( j = 0; j < l_subfr; j++ ) + { + hb_synth[k] *= gain; + k++; + } + } + + return; +} + + +/*------------------------------------------------------------------- + * procTec() + * + * + *-------------------------------------------------------------------*/ + +static void procTec( + float *hb_synth, + const int16_t i_offset, + const int16_t l_subfr, + float *gain, + const int16_t code ) +{ + int16_t i, j, k; + int16_t k_offset, n_subfr; + float enr[N_TEC_TFA_SUBFR], enr_ave, gain_ave; + float inv_curr_enr[N_TEC_TFA_SUBFR]; + float max_inv_curr_enr, lower_limit_gain; + float upper_limit_gain; + float tmp; + + setSubfrConfig( i_offset, &k_offset, &n_subfr, l_subfr ); + + enr_ave = calcSubfrNrg( hb_synth, i_offset, enr, k_offset, l_subfr ) / n_subfr; + + gain_ave = ( sum_f( &gain[i_offset], n_subfr ) + 1.0e-12f ) / n_subfr; + + max_inv_curr_enr = 10e-6f; + for ( i = i_offset, k = k_offset; i < N_TEC_TFA_SUBFR; i++ ) + { + inv_curr_enr[i] = enr_ave / enr[i]; + gain[i] /= gain_ave; + if ( max_inv_curr_enr < inv_curr_enr[i] ) + { + max_inv_curr_enr = inv_curr_enr[i]; + } + } + + lower_limit_gain = 0.1f; + if ( lower_limit_gain > ( tmp = 1.f / max_inv_curr_enr ) ) + { + lower_limit_gain = tmp * 0.5f; + } + + upper_limit_gain = 1.2f; + if ( code == LOBUF_NO_SMOOTHING_MODE ) + { + upper_limit_gain = 3.0; + } + + for ( i = i_offset, k = k_offset; i < N_TEC_TFA_SUBFR; i++ ) + { + if ( lower_limit_gain > gain[i] ) + { + gain[i] = lower_limit_gain; + } + gain[i] *= inv_curr_enr[i]; + + if ( gain[i] > upper_limit_gain ) + { + gain[i] = upper_limit_gain; + } + + gain[i] = (float) sqrt( gain[i] ); + for ( j = 0; j < l_subfr; j++ ) + { + hb_synth[k] *= gain[i]; + k++; + } + } + + return; +} + + +/*------------------------------------------------------------------- + * procTecTfa_TBE() + * + * + *-------------------------------------------------------------------*/ + +void procTecTfa_TBE( + float *hb_synth, + float *gain, + const int16_t flat_flag, + const int16_t last_core, + const int16_t l_subfr, + const int16_t code ) +{ + int16_t i_offset = 0; + + if ( flat_flag ) + { + procTfa( hb_synth, i_offset, l_subfr ); + } + else + { + if ( last_core != ACELP_CORE ) + { + i_offset = 1; + } + + procTec( hb_synth, i_offset, l_subfr, gain, code ); + } + + return; +} + + +/*------------------------------------------------------------------- + * resetTecEnc() + * + * + *-------------------------------------------------------------------*/ + +void resetTecEnc( + TEC_ENC_HANDLE hTecEnc, + const int16_t flag ) +{ + if ( flag == 0 ) + { + set_f( hTecEnc->loBuffer, 0.f, CLDFB_NO_COL_MAX + MAX_TEC_SMOOTHING_DEG + DELAY_TEMP_ENV_BUFF_TEC ); + set_f( hTecEnc->hiTempEnv, 0.f, CLDFB_NO_COL_MAX + DELAY_TEMP_ENV_BUFF_TEC + EXT_DELAY_HI_TEMP_ENV ); + set_f( hTecEnc->loTempEnv, 0.f, CLDFB_NO_COL_MAX ); + set_f( hTecEnc->loTempEnv_ns, 0.f, CLDFB_NO_COL_MAX ); + } + else + { + set_f( hTecEnc->loBuffer, 0.f, MAX_TEC_SMOOTHING_DEG ); + } + + return; +} + + +/*------------------------------------------------------------------- + * calcHiEnvLoBuff() + * + * + *-------------------------------------------------------------------*/ + +void calcHiEnvLoBuff( + const int16_t noCols, + const int16_t *pFreqBandTable, /*!< freqbandTable. */ + const int16_t nSfb, /*!< Number of scalefactors. */ + float **pCldfbPow, + float *loBuffer, + float *hiTempEnvOrig ) +{ + const int16_t BW_LO = TecLowBandTable[NbTecLowBand]; + const int16_t lowSubband = pFreqBandTable[0]; + const int16_t highSubband = pFreqBandTable[nSfb]; + + int16_t bandOffsetBottom = lowSubband - BW_LO; + + float scaleOffset = 0; + float *hiTempEnv = hiTempEnvOrig + EXT_DELAY_HI_TEMP_ENV; + + assert( bandOffsetBottom > 0 ); + + /* calc hiTempEnv*/ + calcHiTempEnv( pCldfbPow, 0, noCols, lowSubband, highSubband, scaleOffset, hiTempEnv + DELAY_TEMP_ENV_BUFF_TEC ); + + /* calc loBuffer */ + calcLoBufferEnc( pCldfbPow, 0, noCols, bandOffsetBottom, scaleOffset, loBuffer + MAX_TEC_SMOOTHING_DEG + DELAY_TEMP_ENV_BUFF_TEC ); + + return; +} + + +/*------------------------------------------------------------------- + * calcLoEnvCheckCorrHiLo() + * + * + *-------------------------------------------------------------------*/ + +void calcLoEnvCheckCorrHiLo( + const int16_t noCols, + const int16_t *pFreqBandTable, /*!< freqbandTable. */ + float *loBuffer, + float *loTempEnv, + float *loTempEnv_ns, + float *hiTempEnvOrig, + int16_t *corrFlag ) +{ + const int16_t BW_LO = TecLowBandTable[NbTecLowBand]; + const int16_t lowSubband = pFreqBandTable[0]; + int16_t i; + float corrCoef; + int16_t bandOffsetBottom = lowSubband - BW_LO; + float ratio; + float hiVar, loVar; + float hiSum, loSum; + int16_t code = 0; /* SET TENTATIVELY */ + float loVar_ns; + float loSum_ns; + float diff_hi_lo_sum; + + float *hiTempEnv = hiTempEnvOrig + EXT_DELAY_HI_TEMP_ENV; + + assert( bandOffsetBottom > 0 ); + + hiVar = calcVar( hiTempEnv, noCols, &hiSum ); + + /* calc loTempEnv */ + calcLoTempEnv( loBuffer + MAX_TEC_SMOOTHING_DEG, noCols, loTempEnv, ratioHiLoFac ); + + calcLoTempEnv_ns( loBuffer + MAX_TEC_SMOOTHING_DEG, noCols, loTempEnv_ns ); + + loVar_ns = calcVar( loTempEnv_ns, noCols, &loSum_ns ); + diff_hi_lo_sum = loSum_ns - hiSum; + + if ( hiVar > 800 && loVar_ns > 720 && diff_hi_lo_sum < 100 ) + { + code = 1; + } + + *corrFlag = 0; + + assert( code == 0 || code == 1 ); + + if ( code ) + { + /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ + /* ++++ code == 1 +++++*/ + /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ + int16_t maxPosHi, maxPosLo; + float maxHi, maxLo; + + maxHi = hiTempEnv[0]; + maxLo = loTempEnv_ns[0]; + maxPosHi = maxPosLo = 0; + + for ( i = 1; i < noCols; i++ ) + { + if ( maxHi < hiTempEnv[i] ) + { + maxHi = hiTempEnv[i]; + maxPosHi = i; + } + + if ( maxLo < loTempEnv_ns[i] ) + { + maxLo = loTempEnv_ns[i]; + maxPosLo = i; + } + } + + if ( abs( maxPosHi - maxPosLo ) < 2 ) + { + *corrFlag = 2; + } + + { + float feature_max = 0; + int16_t pos_feature_max = 0; + float feature[16]; + + float min_local, max_local; + int16_t j; + int16_t len_window = EXT_DELAY_HI_TEMP_ENV + 1; + float *curr_pos = hiTempEnv; + + feature_max = 0; + pos_feature_max = 0; + + for ( i = 0; i < 16; i++, curr_pos++ ) + { + max_local = min_local = curr_pos[0]; + + for ( j = 1; j < len_window; j++ ) + { + if ( max_local < curr_pos[-j] ) + { + max_local = curr_pos[-j]; + } + + if ( min_local > curr_pos[-j] ) + { + min_local = curr_pos[-j]; + } + } + + feature[i] = max_local - min_local; + + if ( feature_max < feature[i] ) + { + feature_max = feature[i]; + pos_feature_max = i; + } + } + + if ( *corrFlag > 0 ) + { + if ( !( feature_max > 20 && abs( pos_feature_max - maxPosHi ) < 3 ) ) + { + *corrFlag = 0; + } + } + } + } + else + { + /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ + /* ++++ code == 0 ++++*/ + /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ + + /* calc the variance of loTempEnv */ + loVar = calcVar( loTempEnv, noCols, &loSum ); + + /* calc correlation coefficient between loTempEnv and hiTempEnv */ + corrCoef = calcCorrelationCoefficient2( hiTempEnv, loTempEnv, noCols, hiVar, loVar, hiSum, loSum ); + + ratio = hiVar / ( loVar + EPS ); + + if ( corrCoef >= thCorrCoef && ratio > thRatio && ratio < thRatio2 ) + { + *corrFlag = 1; + } + } + + for ( i = 0; i < MAX_TEC_SMOOTHING_DEG + DELAY_TEMP_ENV_BUFF_TEC; i++ ) + { + loBuffer[i] = loBuffer[noCols + i]; + } + + for ( i = 0; i < DELAY_TEMP_ENV_BUFF_TEC + EXT_DELAY_HI_TEMP_ENV; i++ ) + { + hiTempEnvOrig[i] = hiTempEnvOrig[noCols + i]; + } + + return; +} + + +/*------------------------------------------------------------------- + * tecEnc_TBE() + * + * + *-------------------------------------------------------------------*/ + +void tecEnc_TBE( + int16_t *corrFlag, + const float *voicing, + const int16_t coder_type ) +{ + float voice_sum; + float voice_diff; + + /*-----------------------------------------------------------------* + * TEC updates + *-----------------------------------------------------------------*/ + + voice_sum = voicing[0] + voicing[1]; + voice_diff = voicing[0] - voicing[1]; + + if ( voice_diff < 0 ) + { + voice_diff *= -1.0f; + } + + if ( *corrFlag == 1 ) + { + if ( coder_type == INACTIVE || ( ( voice_sum > 0.35 * 2 && voice_sum < 0.55 * 2 ) && ( voice_diff < 0.2 ) ) ) + { + *corrFlag = 0; + } + } + if ( voice_sum > 0.6 * 2 ) + { + *corrFlag = 0; + } + + return; +} diff --git a/lib_com/tns_base.c b/lib_com/tns_base.c new file mode 100644 index 0000000000000000000000000000000000000000..20e679c3167406981d5131f6f325e9defa87e545 --- /dev/null +++ b/lib_com/tns_base.c @@ -0,0 +1,849 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include "options.h" +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "stat_com.h" +#include "wmc_auto.h" + + +/*---------------------------------------------------------------------------- + * Local constants + *---------------------------------------------------------------------------*/ + +#define HLM_MIN_NRG PCM16_TO_FLT_FAC +#define MAX_SUBDIVISIONS 3 + + +/*---------------------------------------------------------------------------- + * Local prototypes + *---------------------------------------------------------------------------*/ + + +static void Index2Parcor( const int16_t index[], float parCoeff[], const int16_t order ); + +static float FIRLattice( const int16_t order, const float *parCoeff, float *state, float x ); + +static float IIRLattice( const int16_t order, const float *parCoeff, float *state, float x ); + +static void TnsFilter( const float spectrum[], const int16_t numOfLines, const float parCoeff[], const int16_t order, TLinearPredictionFilter filter, float *state, float output[] ); + + +/*-------------------------------------------------------------------* + * InitTnsConfiguration() + * + *-------------------------------------------------------------------*/ + +void InitTnsConfiguration( + const int16_t bwidth, + const int16_t frameLength, + STnsConfig *pTnsConfig, + const int16_t igfStopFreq, + const int32_t total_brate, + const int16_t element_mode, + const int16_t MCT_flag ) +{ + int32_t nSampleRate; + int16_t iFilter; + int16_t *startLineFilter = &pTnsConfig->iFilterBorders[1]; + + nSampleRate = inner_frame_tbl[bwidth] * FRAMES_PER_SEC; + + /* Sanity checks */ + assert( ( nSampleRate > 0 ) && ( frameLength > 0 ) && ( pTnsConfig != NULL ) ); + if ( ( nSampleRate <= 0 ) || ( frameLength <= 0 ) || ( pTnsConfig == NULL ) ) + { + return /*TNS_FATAL_ERROR*/; + } + + /* WMOPS: All initializations are either for safety or static (tables) and thus not to be counted */ + /* Initialize TNS filter flag and maximum order */ + pTnsConfig->maxOrder = TNS_MAX_FILTER_ORDER; + if ( total_brate <= ACELP_32k ) + { + pTnsConfig->nMaxFilters = sizeof( tnsParametersIGF32kHz_LowBR ) / sizeof( tnsParametersIGF32kHz_LowBR[0] ); + + pTnsConfig->pTnsParameters = tnsParametersIGF32kHz_LowBR; + } + else + { + if ( nSampleRate > 32000 && nSampleRate == 100 * frameLength ) + { + pTnsConfig->nMaxFilters = sizeof( tnsParameters48kHz_grouped ) / sizeof( tnsParameters48kHz_grouped[0] ); + pTnsConfig->pTnsParameters = tnsParameters48kHz_grouped; + } + else if ( nSampleRate > 16000 ) + { + if ( ( element_mode > IVAS_SCE ) && ( total_brate >= ( MCT_flag ? IVAS_32k : IVAS_48k ) ) ) + { + pTnsConfig->nMaxFilters = sizeof( tnsParameters32kHz_Stereo ) / sizeof( tnsParameters32kHz_Stereo[0] ); + if ( nSampleRate == 100 * frameLength ) /* sub-frame length is <= 10 ms */ + { + pTnsConfig->pTnsParameters = tnsParameters32kHz_grouped; + } + else + { + pTnsConfig->pTnsParameters = tnsParameters32kHz_Stereo; + } + } + else + { + pTnsConfig->nMaxFilters = sizeof( tnsParameters32kHz ) / sizeof( tnsParameters32kHz[0] ); + if ( nSampleRate == 100 * frameLength ) /* sub-frame length is <= 10 ms */ + { + pTnsConfig->pTnsParameters = tnsParameters32kHz_grouped; + } + else + { + pTnsConfig->pTnsParameters = tnsParameters32kHz; + } + } + } + else + { + if ( nSampleRate == 100 * frameLength ) /* sub-frame length is <= 10 ms */ + { + pTnsConfig->nMaxFilters = sizeof( tnsParameters16kHz_grouped ) / sizeof( tnsParameters16kHz_grouped[0] ); + pTnsConfig->pTnsParameters = tnsParameters16kHz_grouped; + } + else + { + pTnsConfig->nMaxFilters = sizeof( tnsParameters16kHz ) / sizeof( tnsParameters16kHz[0] ); + pTnsConfig->pTnsParameters = tnsParameters16kHz; + } + } + } + + assert( pTnsConfig->nMaxFilters <= TNS_MAX_NUM_OF_FILTERS ); + + /* Set starting MDCT line for each filter based on the starting frequencies from the TNS table */ + for ( iFilter = 0; iFilter < pTnsConfig->nMaxFilters; iFilter++ ) + { + assert( pTnsConfig->pTnsParameters[iFilter].startLineFrequency < 0.5f * nSampleRate ); + startLineFilter[iFilter] = (int16_t) ( ( frameLength * 2 * pTnsConfig->pTnsParameters[iFilter].startLineFrequency ) / nSampleRate ); + } + if ( igfStopFreq > 0 ) + { + pTnsConfig->iFilterBorders[0] = (int16_t) ( ( frameLength * 2 * igfStopFreq ) / nSampleRate ); + } + else + { + pTnsConfig->iFilterBorders[0] = frameLength; + } + + pTnsConfig->allowTnsOnWhite = 0; + + return /*TNS_NO_ERROR*/; +} + + +/*-------------------------------------------------------------------* + * ApplyTnsFilter() + * + *-------------------------------------------------------------------*/ + +void ApplyTnsFilter( + STnsConfig const *pTnsConfig, + STnsData const *pTnsData, + float spectrum[], + const int16_t fIsAnalysis ) +{ + TLinearPredictionFilter filter; + float state[TNS_MAX_FILTER_ORDER]; + int16_t iFilter; + int16_t stopLine, startLine; + const int16_t *pBorders; + + filter = fIsAnalysis ? FIRLattice : IIRLattice; + set_f( state, 0, TNS_MAX_FILTER_ORDER ); + pBorders = pTnsConfig->iFilterBorders; + + for ( iFilter = pTnsConfig->nMaxFilters - 1; iFilter >= 0; iFilter-- ) + { + float parCoeff[TNS_MAX_FILTER_ORDER]; + const STnsFilter *pFilter = &pTnsData->filter[iFilter]; + + set_f( parCoeff, 0, TNS_MAX_FILTER_ORDER ); + stopLine = pBorders[iFilter]; + startLine = pBorders[iFilter + 1]; + + Index2Parcor( pFilter->coefIndex, parCoeff, pFilter->order ); + + TnsFilter( &spectrum[startLine], stopLine - startLine, parCoeff, pFilter->order, filter, state, &spectrum[startLine] ); + } + + return /*( pTnsData->nFilters < 0 ) ? TNS_FATAL_ERROR : TNS_NO_ERROR*/; +} + + +/*********************************************************************************************/ +/* Definitions of functions used in the mapping between TNS parameters and a bitstream. */ +/*********************************************************************************************/ + +/* Helper functions for hufmann table coding */ + +/** Get number of bits from a Huffman table. + * The table must be sorted by values. + */ +static int16_t GetBitsFromTable( int16_t value, const Coding codes[], const int16_t nSize ) +{ + (void) nSize; + assert( ( value >= 0 ) && ( value < nSize ) && ( nSize >= 0 ) && ( nSize <= 256 ) ); + return codes[value].nBits; +} + +/** Get the code for a value from a Huffman table. + * The table must be sorted by values. + */ +static int16_t EncodeUsingTable( int16_t value, const Coding codes[], const int16_t nSize ) +{ + (void) nSize; + assert( ( value >= 0 ) && ( value < nSize ) && ( nSize >= 0 ) && ( nSize <= 256 ) ); + return codes[value].code; +} + +/** Decode a value from a bitstream using a Huffman table. */ +static int16_t DecodeUsingTable( Decoder_State *st, int16_t *pValue, const Coding codes[], const int16_t nSize ) +{ + uint16_t code = 0; + uint8_t nBits = 0; + int16_t valueIndex = nSize; + + assert( ( nSize >= 0 ) && ( nSize <= 256 ) ); + /* Variable initialization. All are required! */ + while ( valueIndex == nSize ) + { + code = ( code << 1 ) + get_next_indice( st, 1 ); + ++nBits; + if ( nBits > nSize || nBits > 16 ) + { + st->BER_detect = 1; + *pValue = 0; + return -1; + } + for ( valueIndex = 0; valueIndex < nSize; valueIndex++ ) + { + if ( codes[valueIndex].nBits == nBits ) + { + if ( codes[valueIndex].code == code ) + { + break; + } + } + } + /* Loop condition */ + } + + if ( valueIndex < nSize ) + { + *pValue = codes[valueIndex].value; + } + else + { + st->BER_detect = 1; + *pValue = 0; + return -1; + } + + return nBits; +} + +/* TNS filter coefficients */ + +void const *GetTnsFilterCoeff( void const *p, const int16_t index, int16_t *pValue ) +{ + *pValue = ( (int16_t const *) p )[index] + INDEX_SHIFT; + return NULL; +} + +void *SetTnsFilterCoeff( void *p, const int16_t index, const int16_t value ) +{ + ( (int16_t *) p )[index] = value - INDEX_SHIFT; + return NULL; +} + +int16_t GetSWBTCX20TnsFilterCoeffBits( const int16_t value, const int16_t index ) +{ + assert( ( index >= 0 ) && ( index < nTnsCoeffTables ) ); + return GetBitsFromTable( value, codesTnsCoeffSWBTCX20[index], nTnsCoeffCodes ); +} + +int16_t EncodeSWBTCX20TnsFilterCoeff( const int16_t value, const int16_t index ) +{ + assert( ( index >= 0 ) && ( index < nTnsCoeffTables ) ); + return EncodeUsingTable( value, codesTnsCoeffSWBTCX20[index], nTnsCoeffCodes ); +} + +int16_t DecodeSWBTCX20TnsFilterCoeff( Decoder_State *st, const int16_t index, int16_t *pValue ) +{ + assert( ( index >= 0 ) && ( index < nTnsCoeffTables ) ); + return DecodeUsingTable( st, pValue, codesTnsCoeffSWBTCX20[index], nTnsCoeffCodes ); +} + +int16_t GetSWBTCX10TnsFilterCoeffBits( const int16_t value, const int16_t index ) +{ + assert( ( index >= 0 ) && ( index < nTnsCoeffTables ) ); + return GetBitsFromTable( value, codesTnsCoeffSWBTCX10[index], nTnsCoeffCodes ); +} + +int16_t EncodeSWBTCX10TnsFilterCoeff( const int16_t value, const int16_t index ) +{ + assert( ( index >= 0 ) && ( index < nTnsCoeffTables ) ); + return EncodeUsingTable( value, codesTnsCoeffSWBTCX10[index], nTnsCoeffCodes ); +} + +int16_t DecodeSWBTCX10TnsFilterCoeff( Decoder_State *st, const int16_t index, int16_t *pValue ) +{ + assert( ( index >= 0 ) && ( index < nTnsCoeffTables ) ); + return DecodeUsingTable( st, pValue, codesTnsCoeffSWBTCX10[index], nTnsCoeffCodes ); +} + +int16_t GetWBTCX20TnsFilterCoeffBits( const int16_t value, const int16_t index ) +{ + assert( ( index >= 0 ) && ( index < nTnsCoeffTables ) ); + return GetBitsFromTable( value, codesTnsCoeffWBTCX20[index], nTnsCoeffCodes ); +} + +int16_t EncodeWBTCX20TnsFilterCoeff( const int16_t value, const int16_t index ) +{ + assert( ( index >= 0 ) && ( index < nTnsCoeffTables ) ); + return EncodeUsingTable( value, codesTnsCoeffWBTCX20[index], nTnsCoeffCodes ); +} + +int16_t DecodeWBTCX20TnsFilterCoeff( Decoder_State *st, const int16_t index, int16_t *pValue ) +{ + assert( ( index >= 0 ) && ( index < nTnsCoeffTables ) ); + return DecodeUsingTable( st, pValue, codesTnsCoeffWBTCX20[index], nTnsCoeffCodes ); +} + + +/* TNS filter order */ + +void const *GetTnsFilterOrder( void const *p, const int16_t index, int16_t *pValue ) +{ + *pValue = ( (STnsFilter const *) p )[index].order; + return ( (STnsFilter const *) p )[index].coefIndex; +} + +void *SetTnsFilterOrder( void *p, const int16_t index, const int16_t value ) +{ + ( (STnsFilter *) p )[index].order = value; + return ( (STnsFilter *) p )[index].coefIndex; +} + +int16_t GetTnsFilterOrderBitsSWBTCX20( const int16_t value, const int16_t index ) +{ + (void) index; + return GetBitsFromTable( value - 1, codesTnsOrderTCX20, nTnsOrderCodes ); +} + +int16_t EncodeTnsFilterOrderSWBTCX20( const int16_t value, const int16_t index ) +{ + (void) index; + return EncodeUsingTable( value - 1, codesTnsOrderTCX20, nTnsOrderCodes ); +} + +int16_t DecodeTnsFilterOrderSWBTCX20( Decoder_State *st, const int16_t index, int16_t *pValue ) +{ + (void) index; + return DecodeUsingTable( st, pValue, codesTnsOrderTCX20, nTnsOrderCodes ); +} + +int16_t GetTnsFilterOrderBitsSWBTCX10( const int16_t value, const int16_t index ) +{ + (void) index; + return GetBitsFromTable( value - 1, codesTnsOrderTCX10, nTnsOrderCodes ); +} + +int16_t EncodeTnsFilterOrderSWBTCX10( const int16_t value, const int16_t index ) +{ + (void) index; + return EncodeUsingTable( value - 1, codesTnsOrderTCX10, nTnsOrderCodes ); +} + +int16_t DecodeTnsFilterOrderSWBTCX10( Decoder_State *st, const int16_t index, int16_t *pValue ) +{ + (void) index; + return DecodeUsingTable( st, pValue, codesTnsOrderTCX10, nTnsOrderCodes ); +} + +int16_t GetTnsFilterOrderBits( const int16_t value, const int16_t index ) +{ + (void) index; + return GetBitsFromTable( value - 1, codesTnsOrder, nTnsOrderCodes ); +} + +int16_t EncodeTnsFilterOrder( const int16_t value, const int16_t index ) +{ + (void) index; + return EncodeUsingTable( value - 1, codesTnsOrder, nTnsOrderCodes ); +} + +int16_t DecodeTnsFilterOrder( Decoder_State *st, const int16_t index, int16_t *pValue ) +{ + (void) index; + return DecodeUsingTable( st, pValue, codesTnsOrder, nTnsOrderCodes ); +} + +/* Number of TNS filters */ + +void const *GetNumOfTnsFilters( void const *p, const int16_t index, int16_t *pValue ) +{ + *pValue = (int16_t) abs( ( (STnsData const *) p )[index].nFilters ); + return ( (STnsData const *) p )[index].filter; +} + +void *SetNumOfTnsFilters( void *p, const int16_t index, const int16_t value ) +{ + ( (STnsData *) p )[index].nFilters = (int16_t) abs( value ); + return ( (STnsData *) p )[index].filter; +} + +/* TNS enabled/disabled flag */ + +void const *GetTnsEnabled( void const *p, const int16_t index, int16_t *pValue ) +{ + *pValue = ( (STnsData const *) p )[index].nFilters != 0 ? 1 : 0; + return NULL; +} + +void *SetTnsEnabled( void *p, const int16_t index, const int16_t value ) +{ + (void) p, (void) index, (void) value; + return NULL; +} + +/* TNS on whitened spectra flag */ + +void const *GetTnsOnWhite( void const *p, const int16_t index, int16_t *pValue ) +{ + *pValue = ( (STnsData const *) p )[index].tnsOnWhitenedSpectra > 0 ? 1 : 0; + return NULL; +} + +void *SetTnsOnWhite( void *p, const int16_t index, const int16_t value ) +{ + ( (STnsData *) p )[index].tnsOnWhitenedSpectra = value; + return NULL; +} + +void const *GetTnsEnabledSingleFilter( void const *p, const int16_t index, int16_t *pValue ) +{ + *pValue = ( (STnsData const *) p )[index].nFilters != 0 ? 1 : 0; + return ( (STnsData const *) p )[index].filter; +} + +void *SetTnsEnabledSingleFilter( void *p, const int16_t index, const int16_t value ) +{ + ( (STnsData *) p )[index].nFilters = value; + return ( (STnsData *) p )[index].filter; +} + + +/*-------------------------------------------------------------------* + * ResetTnsData() + * + *-------------------------------------------------------------------*/ + +void ResetTnsData( + STnsData *pTnsData ) +{ + uint16_t iFilter; + + pTnsData->nFilters = 0; + pTnsData->tnsOnWhitenedSpectra = 0; + + for ( iFilter = 0; iFilter < sizeof( pTnsData->filter ) / sizeof( pTnsData->filter[0] ); iFilter++ ) + { + STnsFilter *const pTnsFilter = &pTnsData->filter[iFilter]; + pTnsFilter->spectrumLength = 0; + pTnsFilter->predictionGain = 1.0f; + pTnsFilter->avgSqrCoef = 0; + pTnsFilter->filterType = TNS_FILTER_OFF; + ClearTnsFilterCoefficients( pTnsFilter ); + } + + return; +} + + +/*-------------------------------------------------------------------* + * ClearTnsFilterCoefficients() + * + *-------------------------------------------------------------------*/ + +void ClearTnsFilterCoefficients( + STnsFilter *pTnsFilter ) +{ + pTnsFilter->order = 0; + set_s( pTnsFilter->coefIndex, 0, TNS_MAX_FILTER_ORDER ); + + return; +} + +/** Inverse quantization for reflection coefficients. + * + * @param index input quantized values. + * @param parCoeff output reflection coefficients. + * @param order number of coefficients/values. + */ +static void Index2Parcor( + const int16_t index[], + float parCoeff[], + const int16_t order ) +{ + const float *values = tnsCoeff4; + int16_t i; + + for ( i = 0; i < order; i++ ) + { + parCoeff[i] = values[index[i] + INDEX_SHIFT]; + } + + return; +} + +/* Linear prediction analysis filter. */ +static float FIRLattice( + const int16_t order, + const float *parCoeff, + float *state, + float x ) +{ + int16_t i; + float tmpSave; + + tmpSave = x; + for ( i = 0; i < order - 1; i++ ) + { + const float tmp = parCoeff[i] * x + state[i]; + /* Variable initialization */ + x += parCoeff[i] * state[i]; + state[i] = tmpSave; + tmpSave = tmp; + } + + /* last stage: only need half operations */ + x += parCoeff[order - 1] * state[order - 1]; + state[order - 1] = tmpSave; + + return x; +} + +/* Linear prediction synthesis filter. */ +static float IIRLattice( + const int16_t order, + const float *parCoeff, + float *state, + float x ) +{ + int16_t i; + + /* first stage: no need to calculate state[order-1] */ + x -= parCoeff[order - 1] * state[order - 1]; + for ( i = order - 2; i >= 0; i-- ) + { + x -= parCoeff[i] * state[i]; + state[i + 1] = parCoeff[i] * x + state[i]; + } + + state[0] = x; + + return x; +} + +/** TNS analysis/synthesis filter. + * @param spectrum input spectrum values. + * @param numOfLines number of lines in the spectrum. + * @param parCoeff filter (PARCOR) coefficients. + * @param order filter order. + * @param filter function that implements filtering. + By this function it is defined whether analysis or synthesis is performed. + * @param output filtered output spectrum values. + Inplace operation is supported, so it can be equal to spectrum. + */ +static void TnsFilter( + const float spectrum[], + const int16_t numOfLines, + const float parCoeff[], + const int16_t order, + TLinearPredictionFilter filter, + float *state, + float output[] ) +{ + int16_t j; + + assert( ( order >= 0 ) && ( order <= TNS_MAX_FILTER_ORDER ) ); + assert( ( numOfLines > 0 ) || ( ( numOfLines == 0 ) && ( order == 0 ) ) ); + + if ( order == 0 ) + { + if ( ( spectrum != output ) && ( numOfLines > 0 ) ) + { + mvr2r( spectrum, output, numOfLines ); + } + } + else + { + for ( j = 0; j < numOfLines; j++ ) + { + output[j] = filter( order, parCoeff, state, spectrum[j] ); + } + } + + return; +} + + +static void ITF_TnsFilter( + const float spectrum[], + const int16_t numOfLines, + const float A[], + const int16_t order, + float output[] ) +{ + int16_t i, j; + float *p, buf[ITF_MAX_FILTER_ORDER + N_MAX]; + + assert( ( order >= 0 ) && ( order <= ITF_MAX_FILTER_ORDER ) ); + assert( ( numOfLines > 0 ) || ( ( numOfLines == 0 ) && ( order == 0 ) ) ); + + if ( order == 0 ) + { + if ( ( spectrum != output ) && ( numOfLines > 0 ) ) + { + mvr2r( spectrum, output, numOfLines ); + } + } + else + { + p = buf + ITF_MAX_FILTER_ORDER; + + set_f( buf, 0, ITF_MAX_FILTER_ORDER ); + mvr2r( spectrum, p, numOfLines ); + + for ( j = 0; j < numOfLines; j++, p++ ) + { + output[j] = p[0]; + for ( i = 1; i < order; i++ ) + { + output[j] += A[i] * p[-i]; + } + } + } + + return; +} + + +/*********************************************************************************************/ +/* Definitions of functions used in the mapping between TNS parameters and a bitstream. */ +/*********************************************************************************************/ + +/* Helper functions for hufmann table coding */ + +/********************************/ +/* Private functions */ +/********************************/ + +/** Autocorrelation to parcor coefficients. + * Conversion of autocorrelation to parcor/reflection coefficients. + * @param input Autocorrelation function/coefficients. + * @param parCoeff output filter (PARCOR) coefficients. + * @param order filter order. + * @return prediction gain. + */ +static float ITF_AutoToLPcoef( + const float input[], + float a[], + const int16_t order ) +{ + int16_t i, j; + float tmp, tmp2; + float workBuffer[2 * ITF_MAX_FILTER_ORDER]; + float parCoeff[ITF_MAX_FILTER_ORDER]; + float *const pWorkBuffer = &workBuffer[order]; /* temp pointer */ + + for ( i = 0; i < order; i++ ) + { + workBuffer[i] = input[i]; + pWorkBuffer[i] = input[i + 1]; + } + + for ( i = 0; i < order; i++ ) + { + if ( workBuffer[0] < 1.0f / 65536.0f ) + { + tmp = 0; + } + else + { + tmp = -pWorkBuffer[i] / workBuffer[0]; + } + + /* compensate for calculation inaccuracies limit reflection coefs to ]-1,1[ */ + tmp = min( 0.999f, max( -0.999f, tmp ) ); + + parCoeff[i] = tmp; + for ( j = i; j < order; j++ ) + { + tmp2 = pWorkBuffer[j] + tmp * workBuffer[j - i]; + workBuffer[j - i] += tmp * pWorkBuffer[j]; + pWorkBuffer[j] = tmp2; + } + } + + /* Convert ParCor / reflection coefficients to LPC */ + a[0] = 1.0f; + a[1] = parCoeff[0]; + + for ( i = 1; i < order; i++ ) + { + for ( j = 0; j < i / 2; j++ ) + { + tmp = a[j + 1]; + a[j + 1] += parCoeff[i] * a[i - 1 - j + 1]; + a[i - 1 - j + 1] += parCoeff[i] * tmp; + } + if ( i & 1 ) + { + a[j + 1] += parCoeff[i] * a[j + 1]; + } + + a[i + 1] = parCoeff[i]; + } + + return ( ( input[0] + 1e-30f ) / ( workBuffer[0] + 1e-30f ) ); +} + + +/*-------------------------------------------------------------------* + * ITF_Apply() + * + *-------------------------------------------------------------------*/ + +void ITF_Apply( + float spectrum[], + const int16_t startLine, + const int16_t stopLine, + const float *A, + const int16_t order ) +{ + ITF_TnsFilter( &spectrum[startLine], stopLine - startLine, A, order, &spectrum[startLine] ); + + return; +} + + +/*-------------------------------------------------------------------* + * ITF_Detect() + * + * + *-------------------------------------------------------------------*/ + +int16_t ITF_Detect( + const float pSpectrum[], + const int16_t startLine, + const int16_t stopLine, + const int16_t maxOrder, + float *A, + float *predictionGain, + int16_t *curr_order ) +{ + float norms[MAX_SUBDIVISIONS]; + int16_t nSubdivisions; + int16_t iStartLine, iEndLine, spectrumLength; + float rxx[ITF_MAX_FILTER_ORDER + 1]; + float fac; + const float *pWindow; + int16_t iSubdivisions, lag; + + nSubdivisions = MAX_SUBDIVISIONS; + set_f( norms, 0.f, MAX_SUBDIVISIONS ); + set_f( rxx, 0.f, ITF_MAX_FILTER_ORDER + 1 ); /* This initialization is required */ + + if ( maxOrder <= 0 ) + { + return 0; + } + + /* Calculate norms for each spectrum part */ + for ( iSubdivisions = 0; iSubdivisions < nSubdivisions; iSubdivisions++ ) + { + iStartLine = startLine + ( stopLine - startLine ) * iSubdivisions / nSubdivisions; + iEndLine = startLine + ( stopLine - startLine ) * ( iSubdivisions + 1 ) / nSubdivisions; + + /* Variable initialization */ + norms[iSubdivisions] = sum2_f( pSpectrum + iStartLine - IGF_START_MN, iEndLine - iStartLine ); + } + + /* Calculate normalized autocorrelation for spectrum subdivision and get TNS filter parameters based on it */ + spectrumLength = stopLine - startLine; + + /* Variable initialization */ + for ( iSubdivisions = 0; ( iSubdivisions < nSubdivisions ) && ( norms[iSubdivisions] > HLM_MIN_NRG ); iSubdivisions++ ) + { + fac = 1.0f / norms[iSubdivisions]; + iStartLine = startLine + spectrumLength * iSubdivisions / nSubdivisions; + iEndLine = startLine + spectrumLength * ( iSubdivisions + 1 ) / nSubdivisions; + pWindow = tnsAcfWindow; + + /* For additional loop condition */ + /* Variable initialization */ + for ( lag = 1; lag <= maxOrder; lag++ ) + { + rxx[lag] += fac * ( *pWindow ) * dotp( pSpectrum + iStartLine - IGF_START_MN, pSpectrum + iStartLine - IGF_START_MN + lag, iEndLine - iStartLine - lag ); + pWindow++; + } + } + + *predictionGain = 0; + if ( iSubdivisions == nSubdivisions ) /* meaning there is no subdivision with low energy */ + { + rxx[0] = (float) nSubdivisions; + + /* Limit the maximum order to spectrum length/4 */ + *predictionGain = ITF_AutoToLPcoef( rxx, A, min( maxOrder, spectrumLength / 4 ) ); + + *curr_order = maxOrder; + } + + return 1; +} diff --git a/lib_com/tools.c b/lib_com/tools.c new file mode 100644 index 0000000000000000000000000000000000000000..a30895bac38c3fb3d044cb10217b34a227f77964 --- /dev/null +++ b/lib_com/tools.c @@ -0,0 +1,1723 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "prot.h" +#include "wmc_auto.h" + +/*------------------------------------------------------------------* + * own_random() + * + * Random generator + *------------------------------------------------------------------*/ + +/*! r: output random value */ +int16_t own_random( + int16_t *seed /* i/o: random seed */ +) +{ + *seed = (int16_t) ( *seed * 31821L + 13849L ); + + return ( *seed ); +} + +/*--------------------------------------------------------------------- + * sign() + * + *---------------------------------------------------------------------*/ + +/*! r: sign of x (+1/-1) */ +float sign( + const float x /* i : input value of x */ +) +{ + if ( x < 0.0f ) + { + return -1.0f; + } + else + { + return 1.0f; + } +} + +/*--------------------------------------------------------------------- + * log2_f() + * + *---------------------------------------------------------------------*/ + +/*! r: logarithm2 of x */ +float log2_f( + const float x /* i : input value of x */ +) +{ + return (float) ( log( x ) / log( 2.0f ) ); +} + +int16_t norm_ul( uint32_t UL_var1 ) +{ + int16_t var_out; + + if ( UL_var1 == 0 ) + { + var_out = 0; + } + else + { + for ( var_out = 0; UL_var1 < (uint32_t) 0x80000000U; var_out++ ) + { + UL_var1 <<= 1; + } + } + BASOP_CHECK(); + + return ( var_out ); +} + + +/*--------------------------------------------------------------------- + * sum_s() + * sum_l() + * sum_f() + * + *---------------------------------------------------------------------*/ + +/*! r: sum of all vector elements */ +int16_t sum_s( + const int16_t *vec, /* i : input vector */ + const int16_t lvec /* i : length of input vector */ +) +{ + int16_t i; + int16_t tmp; + + tmp = 0; + for ( i = 0; i < lvec; i++ ) + { + tmp += vec[i]; + } + + return tmp; +} + +/*! r: sum of all vector elements */ +int32_t sum_l( + const int32_t *vec, /* i : input vector */ + const int16_t lvec /* i : length of input vector */ +) +{ + int16_t i; + int32_t tmpL; + + tmpL = 0; + for ( i = 0; i < lvec; i++ ) + { + tmpL += vec[i]; + } + + return tmpL; +} + +/*! r: sum of all vector elements */ +float sum_f( + const float *vec, /* i : input vector */ + const int16_t lvec /* i : length of input vector */ +) +{ + int16_t i; + float tmp; + + tmp = 0.0f; + for ( i = 0; i < lvec; i++ ) + { + tmp += vec[i]; + } + + return tmp; +} + +/*---------------------------------------------------------------------- + * sum2_f() + * + *---------------------------------------------------------------------*/ + +/*! r: sum of all squared vector elements */ +float sum2_f( + const float *vec, /* i : input vector */ + const int16_t lvec /* i : length of input vector */ +) +{ + int16_t i; + float tmp; + + tmp = 0.0f; + for ( i = 0; i < lvec; i++ ) + { + tmp += vec[i] * vec[i]; + } + + return tmp; +} + +/*-------------------------------------------------------------------* + * set_c() + * set_s() + * set_f() + * set_l() + * set_d() + * + * Set the vector elements to a value + *-------------------------------------------------------------------*/ + +void set_c( + int8_t y[], /* i/o: Vector to set */ + const int8_t a, /* i : Value to set the vector to */ + const int32_t N /* i : Length of the vector */ +) +{ + int16_t i; + + for ( i = 0; i < N; i++ ) + { + y[i] = a; + } + + return; +} + + +void set_s( + int16_t y[], /* i/o: Vector to set */ + const int16_t a, /* i : Value to set the vector to */ + const int16_t N /* i : Length of the vector */ +) +{ + int16_t i; + + for ( i = 0; i < N; i++ ) + { + y[i] = a; + } + + return; +} + + +void set_l( + int32_t y[], /* i/o: Vector to set */ + const int32_t a, /* i : Value to set the vector to */ + const int16_t N /* i : Length of the vector */ +) +{ + int16_t i; + + for ( i = 0; i < N; i++ ) + { + y[i] = a; + } + + return; +} + +void set_f( + float y[], /* i/o: Vector to set */ + const float a, /* i : Value to set the vector to */ + const int16_t N /* i : Lenght of the vector */ +) +{ + int16_t i; + + for ( i = 0; i < N; i++ ) + { + y[i] = a; + } + + return; +} + + +/*---------------------------------------------------------------------* + * set_zero() + * + * Set a vector vec[] of dimension lvec to zero + *---------------------------------------------------------------------*/ + +void set_zero( + float *vec, /* o : input vector */ + const int16_t lvec /* i : length of the vector */ +) +{ + int16_t i; + + for ( i = 0; i < lvec; i++ ) + { + *vec++ = 0.0f; + } + + return; +} + + +/*---------------------------------------------------------------------* + * mvr2r() + * mvs2s() + * mvr2s() + * mvs2r() + * mvr2d() + * mvd2r() + * + * Transfer the contents of vector x[] to vector y[] + *---------------------------------------------------------------------*/ + +void mvr2r( + const float x[], /* i : input vector */ + float y[], /* o : output vector */ + const int16_t n /* i : vector size */ +) +{ + int16_t i; + + if ( n <= 0 ) + { + /* cannot transfer vectors with size 0 */ + return; + } + + if ( y < x ) + { + for ( i = 0; i < n; i++ ) + { + y[i] = x[i]; + } + } + else + { + for ( i = n - 1; i >= 0; i-- ) + { + y[i] = x[i]; + } + } + + return; +} + +void mvs2s( + const int16_t x[], /* i : input vector */ + int16_t y[], /* o : output vector */ + const int16_t n /* i : vector size */ +) +{ + int16_t i; + + if ( n <= 0 ) + { + /* cannot transfer vectors with size 0 */ + return; + } + + if ( y < x ) + { + for ( i = 0; i < n; i++ ) + { + y[i] = x[i]; + } + } + else + { + for ( i = n - 1; i >= 0; i-- ) + { + y[i] = x[i]; + } + } + + return; +} + +uint32_t mvr2s( + const float x[], /* i : input vector */ + int16_t y[], /* o : output vector */ + const int16_t n /* i : vector size */ +) +{ + int16_t i; + float temp; + uint32_t noClipping = 0; + + if ( n <= 0 ) + { + /* cannot transfer vectors with size 0 */ + return 0; + } + + if ( (void *) y <= (const void *) x ) + { + for ( i = 0; i < n; i++ ) + { + temp = x[i]; + temp = (float) floor( temp + 0.5f ); + + if ( temp > MAX16B_FLT ) + { + temp = MAX16B_FLT; + noClipping++; + } + else if ( temp < MIN16B_FLT ) + { + temp = MIN16B_FLT; + noClipping++; + } + + y[i] = (int16_t) temp; + } + } + else + { + for ( i = n - 1; i >= 0; i-- ) + { + temp = x[i]; + temp = (float) floor( temp + 0.5f ); + + if ( temp > MAX16B_FLT ) + { + temp = MAX16B_FLT; + noClipping++; + } + else if ( temp < MIN16B_FLT ) + { + temp = MIN16B_FLT; + noClipping++; + } + + y[i] = (int16_t) temp; + } + } + + return noClipping; +} + +void mvs2r( + const int16_t x[], /* i : input vector */ + float y[], /* o : output vector */ + const int16_t n /* i : vector size */ +) +{ + int16_t i; + + if ( n <= 0 ) + { + /* cannot transfer vectors with size 0 */ + return; + } + + if ( (void *) y < (const void *) x ) + { + for ( i = 0; i < n; i++ ) + { + y[i] = (float) x[i]; + } + } + else + { + for ( i = n - 1; i >= 0; i-- ) + { + y[i] = (float) x[i]; + } + } + + return; +} + + +void mvl2l( + const int32_t x[], /* i : input vector */ + int32_t y[], /* o : output vector */ + const int16_t n /* i : vector size */ +) +{ + int16_t i; + + if ( n <= 0 ) + { + /* no need to transfer vectors with size 0 */ + return; + } + + if ( y < x ) + { + for ( i = 0; i < n; i++ ) + { + y[i] = x[i]; + } + } + else + { + for ( i = n - 1; i >= 0; i-- ) + { + y[i] = x[i]; + } + } + + return; +} + + +/*---------------------------------------------------------------------* + * maximum() + * + * Find index and value of the maximum in a vector + *---------------------------------------------------------------------*/ + +/*! r: index of the maximum value in the input vector */ +int16_t maximum( + const float *vec, /* i : input vector */ + const int16_t lvec, /* i : length of input vector */ + float *max_val /* o : maximum value in the input vector */ +) +{ + int16_t j, ind; + float tmp; + + ind = 0; + tmp = vec[0]; + + for ( j = 1; j < lvec; j++ ) + { + if ( vec[j] > tmp ) + { + ind = j; + tmp = vec[j]; + } + } + + if ( max_val != NULL ) + { + *max_val = tmp; + } + + return ind; +} + + +/*! r: index of the maximum value in the input vector */ +int16_t maximum_s( + const int16_t *vec, /* i : input vector */ + const int16_t lvec, /* i : length of input vector */ + int16_t *max /* o : maximum value in the input vector */ +) +{ + int16_t i, ind; + int16_t tmp; + + ind = 0; + tmp = vec[0]; + + for ( i = 1; i < lvec; i++ ) + { + if ( vec[i] > tmp ) + { + ind = i; + tmp = vec[i]; + } + } + + if ( max != NULL ) + { + *max = tmp; + } + + return ind; +} + +/*---------------------------------------------------------------------* + * maximumAbs() + * + * Find index and value of the maximum in a vector + *---------------------------------------------------------------------*/ + +/*! r: index of the maximum value in the input vector */ +int16_t maximumAbs( + const float *vec, /* i : input vector */ + const int16_t lvec, /* i : length of input vector */ + float *max_val /* o : maximum value in the input vector */ +) +{ + int16_t j, ind; + float tmp; + + ind = 0; + tmp = (float) fabs( vec[0] ); + + for ( j = 1; j < lvec; j++ ) + { + if ( (float) fabs( vec[j] ) > tmp ) + { + ind = j; + tmp = (float) fabs( vec[j] ); + } + } + + if ( max_val != NULL ) + { + *max_val = tmp; + } + + return ind; +} + +/*---------------------------------------------------------------------* + * minimum() + * + * Find index of a minimum in a vector + *---------------------------------------------------------------------*/ + +/*! r: index of the minimum value in the input vector */ +int16_t minimum( + const float *vec, /* i : input vector */ + const int16_t lvec, /* i : length of input vector */ + float *min_val /* o : minimum value in the input vector */ +) +{ + int16_t j, ind; + float tmp; + + ind = 0; + tmp = vec[0]; + + for ( j = 1; j < lvec; j++ ) + { + if ( vec[j] < tmp ) + { + ind = j; + tmp = vec[j]; + } + } + + if ( min_val != NULL ) + { + *min_val = tmp; + } + + return ind; +} + +/*-------------------------------------------------------------------* + * minimum_s() + * + * Finds minimum 16-bit signed integer value in the array and returns it. + *-------------------------------------------------------------------*/ + +/*! r: index of the minimum value in the input vector */ +int16_t minimum_s( + const int16_t *vec, /* i : Input vector */ + const int16_t lvec, /* i : Vector length */ + int16_t *min_val /* o : minimum value in the input vector */ +) +{ + int16_t i, ind, tmp; + + ind = 0; + tmp = vec[0]; + + for ( i = 1; i < lvec; i++ ) + { + if ( vec[i] < tmp ) + { + ind = i; + tmp = vec[i]; + } + } + + if ( min_val != NULL ) + { + *min_val = tmp; + } + + return ind; +} + + +/*---------------------------------------------------------------------* + * emaximum() + * + * Find index of a maximum energy in a vector + *---------------------------------------------------------------------*/ + +/*! r: return index with max energy value in vector */ +int16_t emaximum( + const float *vec, /* i : input vector */ + const int16_t lvec, /* i : length of input vector */ + float *ener_max /* o : maximum energy value */ +) +{ + int16_t j, ind; + float temp; + + *ener_max = 0.0f; + ind = 0; + + for ( j = 0; j < lvec; j++ ) + { + temp = vec[j] * vec[j]; + + if ( temp > *ener_max ) + { + ind = j; + *ener_max = temp; + } + } + + return ind; +} + + +/*---------------------------------------------------------------------* + * mean() + * + * Find the mean of the vector + *---------------------------------------------------------------------*/ + +/*! r: mean of vector */ +float mean( + const float *vec, /* i : input vector */ + const int16_t lvec /* i : length of input vector */ +) +{ + float tmp; + + tmp = sum_f( vec, lvec ) / (float) lvec; + + return tmp; +} + +/*---------------------------------------------------------------------* + * dotp() + * + * Dot product of vector x[] and vector y[] + *---------------------------------------------------------------------*/ + +/*! r: dot product of x[] and y[] */ +float dotp( + const float x[], /* i : vector x[] */ + const float y[], /* i : vector y[] */ + const int16_t n /* i : vector length */ +) +{ + int16_t i; + float suma; + + suma = x[0] * y[0]; + + for ( i = 1; i < n; i++ ) + { + suma += x[i] * y[i]; + } + + return suma; +} + + +/*---------------------------------------------------------------------* + * inv_sqrt() + * + * Find the inverse square root of the input value + *---------------------------------------------------------------------*/ + +/*! r: inverse square root of input value */ +float inv_sqrt( + const float x /* i : input value */ +) +{ + return (float) ( 1.0 / sqrt( x ) ); +} + + +/*-------------------------------------------------------------------* + * conv() + * + * Convolution between vectors x[] and h[] written to y[] + * All vectors are of length L. Only the first L samples of the + * convolution are considered. + *-------------------------------------------------------------------*/ + +void conv( + const float x[], /* i : input vector */ + const float h[], /* i : impulse response (or second input vector) */ + float y[], /* o : output vetor (result of convolution) */ + const int16_t L /* i : vector size */ +) +{ + float temp; + int16_t i, n; + for ( n = 0; n < L; n++ ) + { + temp = x[0] * h[n]; + for ( i = 1; i <= n; i++ ) + { + temp += x[i] * h[n - i]; + } + y[n] = temp; + } + + return; +} + +/*-------------------------------------------------------------------* + * fir() + * + * FIR filtering of vector x[] with filter having impulse response h[] + * written to y[] + * The input vector has length L and the FIR filter has an order of K, i.e. + * K+1 coefficients. The memory of the input signal is provided in the vector mem[] + * which has K values + * The maximum length of the input signal is L_FRAME32k and the maximum order + * of the FIR filter is L_FILT_MAX + *-------------------------------------------------------------------*/ + +void fir( + const float x[], /* i : input vector */ + const float h[], /* i : impulse response of the FIR filter */ + float y[], /* o : output vector (result of filtering) */ + float mem[], /* i/o: memory of the input signal (L samples) */ + const int16_t L, /* i : input vector size */ + const int16_t K, /* i : order of the FIR filter (K+1 coefs.) */ + const int16_t upd /* i : 1 = update the memory, 0 = not */ +) +{ + float buf_in[L_FRAME48k + 60], buf_out[L_FRAME48k], s; + int16_t i, j; + + /* prepare the input buffer (copy and update memory) */ + mvr2r( mem, buf_in, K ); + mvr2r( x, buf_in + K, L ); + + if ( upd ) + { + mvr2r( buf_in + L, mem, K ); + } + + /* do the filtering */ + for ( i = 0; i < L; i++ ) + { + s = buf_in[K + i] * h[0]; + + for ( j = 1; j <= K; j++ ) + { + s += h[j] * buf_in[K + i - j]; + } + + buf_out[i] = s; + } + + /* copy to the output buffer */ + mvr2r( buf_out, y, L ); + + return; +} + +/*-------------------------------------------------------------------* + * v_add() + * + * Addition of two vectors sample by sample + *-------------------------------------------------------------------*/ + +void v_add( + const float x1[], /* i : Input vector 1 */ + const float x2[], /* i : Input vector 2 */ + float y[], /* o : Output vector that contains vector 1 + vector 2 */ + const int16_t N /* i : Vector length */ +) +{ + int16_t i; + + for ( i = 0; i < N; i++ ) + { + y[i] = x1[i] + x2[i]; + } + + return; +} + + +/*-------------------------------------------------------------------* + * v_sub() + * + * Subtraction of two vectors sample by sample + *-------------------------------------------------------------------*/ + +void v_sub( + const float x1[], /* i : Input vector 1 */ + const float x2[], /* i : Input vector 2 */ + float y[], /* o : Output vector that contains vector 1 - vector 2 */ + const int16_t N /* i : Vector length */ +) +{ + int16_t i; + + for ( i = 0; i < N; i++ ) + { + y[i] = x1[i] - x2[i]; + } + + return; +} + +/*-------------------------------------------------------------------* + * v_mult() + * + * Multiplication of two vectors + *-------------------------------------------------------------------*/ + +void v_mult( + const float x1[], /* i : Input vector 1 */ + const float x2[], /* i : Input vector 2 */ + float y[], /* o : Output vector that contains vector 1 .* vector 2 */ + const int16_t N /* i : Vector length */ +) +{ + int16_t i; + + for ( i = 0; i < N; i++ ) + { + y[i] = x1[i] * x2[i]; + } + + return; +} + +/*-------------------------------------------------------------------* + * v_multc() + * + * Multiplication of vector by constant + *-------------------------------------------------------------------*/ + +void v_multc( + const float x[], /* i : Input vector */ + const float c, /* i : Constant */ + float y[], /* o : Output vector that contains c*x */ + const int16_t N /* i : Vector length */ +) +{ + int16_t i; + + for ( i = 0; i < N; i++ ) + { + y[i] = c * x[i]; + } + + return; +} + + +/*-------------------------------------------------------------------* + * squant() + * + * Scalar quantizer according to MMSE criterion (nearest neighbour in Euclidean space) + * + * Searches a given codebook to find the nearest neighbour in Euclidean space. + * Index of the winning codeword and the winning codeword itself are returned. + *-------------------------------------------------------------------*/ + +/*! r: index of the winning codeword */ +int16_t squant( + const float x, /* i : scalar value to quantize */ + float *xq, /* o : quantized value */ + const float cb[], /* i : codebook */ + const int16_t cbsize /* i : codebook size */ +) +{ + float dist, mindist, tmp; + int16_t c, idx; + + idx = 0; + mindist = 1e16f; + + for ( c = 0; c < cbsize; c++ ) + { + dist = 0.0f; + tmp = x - cb[c]; + dist += tmp * tmp; + if ( dist < mindist ) + { + mindist = dist; + idx = c; + } + } + + *xq = cb[idx]; + + return idx; +} + +/*! r: index of the winning codeword */ +int16_t squant_int( + uint8_t x, /* i : scalar value to quantize */ + uint8_t *xq, /* o : quantized value */ + const uint8_t *cb, /* i : codebook */ + const int16_t cbsize /* i : codebook size */ +) +{ + int16_t i, idx; + float mindist, d; + + idx = 0; + mindist = 10000000.0f; + for ( i = 0; i < cbsize; i++ ) + { + d = (float) ( x - cb[i] ) * ( x - cb[i] ); + if ( d < mindist ) + { + mindist = d; + idx = i; + } + } + *xq = cb[idx]; + + return idx; +} + + +/*-------------------------------------------------------------------* + * usquant() + * + * Uniform scalar quantizer according to MMSE criterion + * (nearest neighbour in Euclidean space) + * + * Applies quantization based on scale and round operations. + * Index of the winning codeword and the winning codeword itself are returned. + *-------------------------------------------------------------------*/ + +/*! r: index of the winning codeword */ +int16_t usquant( + const float x, /* i : scalar value to quantize */ + float *xq, /* o : quantized value */ + const float qlow, /* i : lowest codebook entry (index 0) */ + const float delta, /* i : quantization step */ + const int16_t cbsize /* i : codebook size */ +) +{ + int16_t idx; + + idx = (int16_t) max( 0.f, min( cbsize - 1, ( ( x - qlow ) / delta + 0.5f ) ) ); + *xq = idx * delta + qlow; + + return idx; +} + + +/*-------------------------------------------------------------------* + * usdequant() + * + * Uniform scalar de-quantizer routine + * + * Applies de-quantization based on scale and round operations. + *-------------------------------------------------------------------*/ + +float usdequant( + const int16_t idx, /* i : quantizer index */ + const float qlow, /* i : lowest codebook entry (index 0) */ + const float delta /* i : quantization step */ +) +{ + float g; + + g = idx * delta + qlow; + + return ( g ); +} + + +/*-------------------------------------------------------------------* + * vquant() + * + * Vector quantizer according to MMSE criterion (nearest neighbour in Euclidean space) + * + * Searches a given codebook to find the nearest neighbour in Euclidean space. + * Index of the winning codevector and the winning vector itself are returned. + *-------------------------------------------------------------------*/ + +/*! r: index of the winning codevector */ +int16_t vquant( + float x[], /* i : vector to quantize */ + const float x_mean[], /* i : vector mean to subtract (0 if none) */ + float xq[], /* o : quantized vector */ + const float cb[], /* i : codebook */ + const int16_t dim, /* i : dimension of codebook vectors */ + const int16_t cbsize /* i : codebook size */ +) +{ + float dist, mindist, tmp; + int16_t c, d, idx, j; + + idx = 0; + mindist = 1e16f; + + if ( x_mean != 0 ) + { + for ( d = 0; d < dim; d++ ) + { + x[d] -= x_mean[d]; + } + } + + j = 0; + for ( c = 0; c < cbsize; c++ ) + { + dist = 0.0f; + for ( d = 0; d < dim; d++ ) + { + tmp = x[d] - cb[j++]; + dist += tmp * tmp; + } + + if ( dist < mindist ) + { + mindist = dist; + idx = c; + } + } + + if ( xq == 0 ) + { + return idx; + } + + j = idx * dim; + for ( d = 0; d < dim; d++ ) + { + xq[d] = cb[j++]; + } + + if ( x_mean != 0 ) + { + for ( d = 0; d < dim; d++ ) + { + xq[d] += x_mean[d]; + } + } + + return idx; +} + +/*-------------------------------------------------------------------* + * w_vquant() + * + * Vector quantizer according to MMSE criterion (nearest neighbour in Euclidean space) + * + * Searches a given codebook to find the nearest neighbour in Euclidean space. + * Weights are put on the error for each vector element. + * Index of the winning codevector and the winning vector itself are returned. + *-------------------------------------------------------------------*/ + +/*! r: index of the winning codevector */ +int16_t w_vquant( + float x[], /* i : vector to quantize */ + const float x_mean[], /* i : vector mean to subtract (0 if none) */ + const int16_t weights[], /* i : error weights */ + float xq[], /* o : quantized vector */ + const float cb[], /* i : codebook */ + const int16_t dim, /* i : dimension of codebook vectors */ + const int16_t cbsize, /* i : codebook size */ + const int16_t rev_vect /* i : reverse codebook vectors */ +) +{ + float dist, mindist, tmp; + int16_t c, d, idx, j, k; + + idx = 0; + mindist = 1e16f; + + if ( x_mean != 0 ) + { + for ( d = 0; d < dim; d++ ) + { + x[d] -= x_mean[d]; + } + } + + j = 0; + if ( rev_vect ) + { + k = dim - 1; + for ( c = 0; c < cbsize; c++ ) + { + dist = 0.0f; + + for ( d = k; d >= 0; d-- ) + { + tmp = x[d] - cb[j++]; + dist += weights[d] * ( tmp * tmp ); + } + + if ( dist < mindist ) + { + mindist = dist; + idx = c; + } + } + + if ( xq == 0 ) + { + return idx; + } + + j = idx * dim; + for ( d = k; d >= 0; d-- ) + { + xq[d] = cb[j++]; + } + } + else + { + for ( c = 0; c < cbsize; c++ ) + { + dist = 0.0f; + + for ( d = 0; d < dim; d++ ) + { + tmp = x[d] - cb[j++]; + dist += weights[d] * ( tmp * tmp ); + } + + if ( dist < mindist ) + { + mindist = dist; + idx = c; + } + } + + if ( xq == 0 ) + { + return idx; + } + + j = idx * dim; + for ( d = 0; d < dim; d++ ) + { + xq[d] = cb[j++]; + } + } + + if ( x_mean != 0 ) + { + for ( d = 0; d < dim; d++ ) + { + xq[d] += x_mean[d]; + } + } + + return idx; +} + + +/*----------------------------------------------------------------------------------* + * v_sort() + * + * Sorting of vectors. This is very fast with almost ordered vectors. + *----------------------------------------------------------------------------------*/ + +void v_sort( + float *r, /* i/o: Vector to be sorted in place */ + const int16_t lo, /* i : Low limit of sorting range */ + const int16_t up /* I : High limit of sorting range */ +) +{ + int16_t i, j; + float tempr; + + for ( i = up - 1; i >= lo; i-- ) + { + tempr = r[i]; + for ( j = i + 1; j <= up && ( tempr > r[j] ); j++ ) + { + r[j - 1] = r[j]; + } + + r[j - 1] = tempr; + } + + return; +} + +void sort( + uint16_t *x, /* i/o: Vector to be sorted */ + uint16_t len /* i/o: vector length */ +) +{ + int16_t i; + uint16_t j, tempr; + + for ( i = len - 2; i >= 0; i-- ) + { + tempr = x[i]; + for ( j = i + 1; ( j < len ) && ( tempr > x[j] ); j++ ) + { + x[j - 1] = x[j]; + } + x[j - 1] = tempr; + } + + return; +} + + +/*---------------------------------------------------------------------* + * var() + * + * Calculate the variance of a vector + *---------------------------------------------------------------------*/ + +/*! r: variance of vector */ +float var( + const float *x, /* i : input vector */ + const int16_t len /* i : length of inputvector */ +) +{ + float m; + float v; + int16_t i; + + m = mean( x, len ); + + v = 0.0f; + for ( i = 0; i < len; i++ ) + { + v += ( x[i] - m ) * ( x[i] - m ); + } + v /= len; + + return v; +} + + +/*---------------------------------------------------------------------* + * std_dev() + * + * Calculate the standard deviation of a vector + *---------------------------------------------------------------------*/ + +/*! r: standard deviation */ +float std_dev( + const float *x, /* i : input vector */ + const int16_t len /* i : length of the input vector */ +) +{ + int16_t i; + float std; + + std = 1e-16f; + for ( i = 0; i < len; i++ ) + { + std += x[i] * x[i]; + } + + std = (float) sqrt( std / len ); + + return std; +} + + +/*---------------------------------------------------------------------* + * dot_product_mat() + * + * Calculates dot product of type x'*A*x, where x is column vector of size m, + * and A is square matrix of size m*m + *---------------------------------------------------------------------*/ + +/*! r: the dot product x'*A*x */ +float dot_product_mat( + const float *x, /* i : vector x */ + const float *A, /* i : matrix A */ + const int16_t m /* i : vector & matrix size */ +) +{ + int16_t i, j; + float suma, tmp_sum; + const float *pt_x, *pt_A; + + pt_A = A; + suma = 0; + + for ( i = 0; i < m; i++ ) + { + tmp_sum = 0; + pt_x = x; + for ( j = 0; j < m; j++ ) + { + tmp_sum += *pt_x++ * *pt_A++; + } + + suma += x[i] * tmp_sum; + } + + return suma; +} + + +/*--------------------------------------------------------------------------------* + * polezero_filter() + * + * Y(Z)=X(Z)(b[0]+b[1]z^(-1)+..+b[L]z^(-L))/(a[0]+a[1]z^(-1)+..+a[M]z^(-M)) + * mem[n]=x[n]+cp[0]mem[n-1]+..+cp[M-1]mem[n-M], where cp[i]=-a[i+1]/a[0] + * y[n]=cz[0]mem[n]+cz[1]mem[n-1]+..+cz[L]mem[n-L], where cz[i]=b[i]/a[0] + * mem={mem[n-K] mem[n-K+1] . . . . mem[n-2] mem[n-1]}, where K=max(L,M) + * + * a[0] must be equal to 1.0f! + *---------------------------------------------------------------------------------*/ + +void polezero_filter( + const float *in, /* i : input vector */ + float *out, /* o : output vector */ + const int16_t N, /* i : input vector size */ + const float *b, /* i : numerator coefficients */ + const float *a, /* i : denominator coefficients */ + const int16_t order, /* i : filter order */ + float *mem /* i/o: filter memory */ +) +{ + int16_t i, j, k; + + + for ( i = 0; i < order; i++ ) + { + out[i] = in[i] * b[0]; + for ( j = 0; j < i; j++ ) + { + out[i] += in[i - 1 - j] * b[j + 1] - out[i - 1 - j] * a[j + 1]; + } + + for ( k = order - 1; j < order; j++, k-- ) + { + out[i] += mem[k] * b[j + 1] - mem[k + order] * a[j + 1]; + } + } + + for ( ; i < N; i++ ) + { + out[i] = in[i] * b[0]; + for ( j = 0; j < order; j++ ) + { + out[i] += in[i - 1 - j] * b[j + 1] - out[i - 1 - j] * a[j + 1]; + } + } + + for ( i = 0; i < order; i++ ) + { + mem[i] = in[N - order + i]; + mem[i + order] = out[N - order + i]; + } + + return; +} + +#define WMC_TOOL_SKIP +static float fleft_shift( float input, const int16_t shift ) +{ + return ( input * (float) pow( 2.0, (double) shift ) ); +} + +static float fright_shift( float input, const int16_t shift ) +{ + return ( input * (float) pow( 0.5, (double) shift ) ); +} +#undef WMC_TOOL_SKIP + + +/*--------------------------------------------------------------------------------* + * root_a() + * + * Implements a quadratic approximation to sqrt(a) + * Firstly, a is normalized to lie between 0.25 & 1.0 + * by shifting the input left or right by an even number of + * shifts. Even shifts represent powers of 4 which, after + * the sqrt, can easily be converted to powers of 2 and are + * easily dealt with. + * At the heart of the algorithm is a quadratic + * approximation of the curve sqrt(a) for 0.25 <= a <= 1.0. + * Sqrt(a) approx = 0.27 + 1.0127 * a - 0.2864 * a^2 + * + *---------------------------------------------------------------------------------*/ + +float root_a( + float a ) +{ + int16_t shift_a; + float mod_a; + float approx; + + if ( a <= 0.0f ) + { + return 0.0; + } + +#define WMC_TOOL_SKIP + /* This next piece of code implements a "norm" function */ + /* and returns the shift needed to scale "a" to have a */ + /* 1 in the (MSB-1) position. This is equivalent to */ + /* giving a value between 0.5 & 1.0. */ + mod_a = a; + + shift_a = 0; + while ( mod_a > 1.0 ) + { + mod_a /= 2.0; + shift_a--; + } + + while ( mod_a < 0.5 ) + { + mod_a *= 2.0; + shift_a++; + } +#undef WMC_TOOL_SKIP + + shift_a &= 0xfffe; + mod_a = fleft_shift( a, shift_a ); + + approx = 0.27f + 1.0127f * mod_a - 0.2864f * mod_a * mod_a; + + approx = fright_shift( approx, ( shift_a >> 1 ) ); + + return ( approx ); +} + +/*--------------------------------------------------------------------------------* + * root_a_over_b() + * + * Implements an approximation to sqrt(a/b) + * Firstly a & b are normalized to lie between 0.25 & 1.0 + * by shifting the inputs left or right by an even number + * of shifts. + * Even shifts represent powers of 4 which, after the sqrt, + * become powers of 2 and are easily dealt with. + * At the heart of the algorithm is an approximation of the + * curve sqrt(a/b) for 0.25 <= a <= 1.0 & 0.25 <= b <= 1.0. + * Given the value of b, the 2nd order coefficients p0, p1 + * & p2 can be determined so that... + * Sqrt(a/b) approx = p0 + p1 * a + p2 * a^2 + * where p0 approx = 0.7176 - 0.8815 * b + 0.4429 * b^2 + * p1 approx = 2.6908 - 3.3056 * b + 1.6608 * b^2 + * p2 approx = -0.7609 + 0.9346 * b - 0.4695 * b^2 + * + *---------------------------------------------------------------------------------*/ + +float root_a_over_b( + float a, + float b ) +{ + int16_t shift_a, shift_b, shift; + float mod_a, mod_b; + float p2 = -0.7609f; + float p1 = 2.6908f; + float p0 = 0.7176f; + float b_sqr; + float approx; + + if ( ( a <= 0.0f ) || ( b <= 0.0f ) ) + { + return 0.0; + } +#define WMC_TOOL_SKIP + if ( isinf( a ) ) +#undef WMC_TOOL_SKIP + { + return FLT_MAX; + } +#define WMC_TOOL_SKIP + if ( isinf( b ) ) +#undef WMC_TOOL_SKIP + { + return 0.f; + } + + a += 0x00000001; + b += 0x00000001; + +#define WMC_TOOL_SKIP + /* This next piece of code implements a "norm" function */ + /* and returns the shift needed to scale "a" to have a */ + /* 1 in the (MSB-1) position. This is equivalent to */ + /* giving a value between 0.5 & 1.0. */ + mod_a = a; + + shift_a = 0; + while ( mod_a > 1.0 ) + { + mod_a /= 2.0; + shift_a--; + } + + while ( mod_a < 0.5 ) + { + mod_a *= 2.0; + shift_a++; + } +#undef WMC_TOOL_SKIP + + shift_a &= 0xfffe; + mod_a = fleft_shift( a, shift_a ); + +#define WMC_TOOL_SKIP + /* This next piece of code implements a "norm" function */ + /* and returns the shift needed to scale "b" to have a */ + /* 1 in the (MSB-1) position. This is equivalent to */ + /* giving a value between 0.5 & 1.0. */ + mod_b = b; + + shift_b = 0; + while ( mod_b > 1.0 ) + { + mod_b /= 2.0; + shift_b--; + } + + while ( mod_b < 0.5 ) + { + mod_b *= 2.0; + shift_b++; + } +#undef WMC_TOOL_SKIP + + shift_b &= 0xfffe; + mod_b = fleft_shift( b, shift_b ); + + shift = ( shift_b - shift_a ) >> 1; + + b_sqr = mod_b * mod_b; + + p2 += 0.9346f * mod_b + -0.4695f * b_sqr; + p1 += -3.3056f * mod_b + 1.6608f * b_sqr; + p0 += -0.8815f * mod_b + 0.4429f * b_sqr; + + approx = p0 + p1 * mod_a + p2 * mod_a * mod_a; + + approx = fleft_shift( approx, shift ); + + return ( approx ); +} + +/*--------------------------------------------------------------------------------* + * rint_new() + * + * Round to the nearest integer with mid-point exception + *---------------------------------------------------------------------------------*/ + +double rint_new( + double x ) +{ + int16_t a; + + /* middle value point test */ + if ( ceil( x + 0.5 ) == floor( x + 0.5 ) ) + { + a = (int16_t) ceil( x ); + + if ( a % 2 == 0 ) + { + return ceil( x ); + } + else + { + return floor( x ); + } + } + else + { + return floor( x + 0.5 ); + } +} + + +/*-------------------------------------------------------------------* + * anint() + * + * Round to the nearest integer. + *-------------------------------------------------------------------*/ + +double anint( + double x ) +{ + return ( x ) >= 0 ? (int32_t) ( ( x ) + 0.5 ) : (int32_t) ( (x) -0.5 ); +} + +/*-------------------------------------------------------------------* + * is_numeric_float() + * + * Returns 0 for all NaN and Inf values defined according to IEEE 754 + * floating point number's definition. Returns 1 for numeric values. + *-------------------------------------------------------------------*/ + +int16_t is_numeric_float( + float x ) +{ +#ifndef BASOP_NOGLOB + union float_int +#else /* BASOP_NOGLOB */ + union float_int +#endif /* BASOP_NOGLOB */ + { + float float_val; + int32_t int_val; + } float_int; + + float_int.float_val = x; + + return ( ( float_int.int_val & 0x7f800000 ) != 0x7f800000 ); +} + +/*-------------------------------------------------------------------* + * delay_signal() + * + * Delay buffer by defined number of samples + *-------------------------------------------------------------------*/ + +void delay_signal( + float x[], /* i/o: signal to be delayed */ + const int16_t len, /* i : length of the input signal */ + float mem[], /* i/o: synchronization memory */ + const int16_t delay /* i : delay in samples */ +) +{ + float tmp_buffer[L_FRAME48k]; + + mvr2r( mem, tmp_buffer, delay ); + mvr2r( x + len - delay, mem, delay ); + mvr2r( x, x + delay, len - delay ); + mvr2r( tmp_buffer, x, delay ); + + return; +} diff --git a/lib_com/trans_direct.c b/lib_com/trans_direct.c new file mode 100644 index 0000000000000000000000000000000000000000..cc63ce39faa0fab1beb1ad875eff2a9daa44cd10 --- /dev/null +++ b/lib_com/trans_direct.c @@ -0,0 +1,175 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*------------------------------------------------------------------- + * direct_transform() + * + * Transformation of the signal to DCT domain + *-------------------------------------------------------------------*/ + +void direct_transform( + const float *in32, /* i : input signal */ + float *out32, /* o : transformation */ + const int16_t is_transient, /* i : is transient */ + const int16_t L, /* i : length */ + const int16_t element_mode /* i : IVAS element mode */ +) +{ + int16_t i; + int16_t seg; + int16_t segment_length; + + const float *wh; + const float *wl; + float *sh; + float *sl; + float *iseg; + float *oseg; + float dctin32[L_FRAME48k]; + float in32_r16[L_FRAME48k]; + + const float *win; + + + segment_length = L / 2; + + if ( is_transient ) + { + if ( L == L_FRAME48k ) + { + win = wscw16q15; + } + else if ( L == L_FRAME32k ) + { + win = wscw16q15_32; + } + else if ( L == L_FRAME8k ) + { + win = wscw16q15_8; + } + else + { + win = wscw16q15_16; + } + + for ( i = 0; i < L / 2; i++ ) + { + in32_r16[i] = in32[L - 1 - i]; + in32_r16[L - 1 - i] = in32[i]; + } + iseg = in32_r16 - segment_length / 4; + oseg = out32; + + wh = win + segment_length / 4; + wl = win + segment_length / 4 - 1; + sh = iseg + 3 * segment_length / 4; + sl = iseg + 3 * segment_length / 4 - 1; + for ( i = 0; i < segment_length / 4; i++ ) + { + dctin32[i] = ( ( *wl-- * *sl-- ) - ( *wh++ * *sh++ ) ); + } + + sl = iseg + segment_length / 2 - 1; + + for ( i = 0; i < segment_length / 4; i++ ) + { + dctin32[segment_length / 4 + i] = -( *sl-- ); + } + + edct( dctin32, oseg, segment_length / 2, element_mode ); + + iseg = iseg + segment_length / 2; + oseg = oseg + segment_length / 2; + + for ( seg = 1; seg < NUM_TIME_SWITCHING_BLOCKS - 1; seg++ ) + { + wh = win + segment_length / 4; + wl = win + segment_length / 4 - 1; + sh = iseg + 3 * segment_length / 4; + sl = iseg + 3 * segment_length / 4 - 1; + for ( i = 0; i < segment_length / 4; i++ ) + { + dctin32[i] = ( ( *wl-- * *sl-- ) - ( *wh++ * *sh++ ) ); + } + + sh = iseg; + sl = iseg + segment_length / 2 - 1; + wh = win + segment_length / 2 - 1; + wl = win + 0; + + for ( i = 0; i < segment_length / 4; i++ ) + { + dctin32[segment_length / 4 + i] = ( ( *wl++ * *sl-- ) + ( *wh-- * *sh++ ) ); + } + + edct( dctin32, oseg, segment_length / 2, element_mode ); + + iseg = iseg + segment_length / 2; + oseg = oseg + segment_length / 2; + } + + sh = iseg + 3 * segment_length / 4 - 1; + for ( i = 0; i < segment_length / 4; i++ ) + { + dctin32[i] = -( *sh-- ); + } + + sh = iseg; + sl = iseg + segment_length / 2 - 1; + wh = win + segment_length / 2 - 1; + wl = win + 0; + + for ( i = 0; i < segment_length / 4; i++ ) + { + dctin32[segment_length / 4 + i] = ( ( *wh-- * *sh++ ) + ( *wl++ * *sl-- ) ); + } + + edct( dctin32, oseg, segment_length / 2, element_mode ); + } + else + { + edct( in32, out32, L, element_mode ); + } + + return; +} diff --git a/lib_com/trans_inv.c b/lib_com/trans_inv.c new file mode 100644 index 0000000000000000000000000000000000000000..5b4d485afffec820309db3ecce84eb1bf0e1b477 --- /dev/null +++ b/lib_com/trans_inv.c @@ -0,0 +1,894 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "wmc_auto.h" + +/*--------------------------------------------------------------------------* + * Local constants + *--------------------------------------------------------------------------*/ + +#define NUMSF 8 +#define LOG2_NUMSF 3 +#define INV_NUMSF 0.125f + +/*--------------------------------------------------------------------------* + * preecho_sb() + * + * Time-domain sub-band based pre-echo reduction + *--------------------------------------------------------------------------*/ + +void preecho_sb( + const int32_t core_brate, /* i : core bitrate */ + const float wtda_audio[], /* i : imdct signal */ + float *rec_sig, /* i : reconstructed signal, output of the imdct transform */ + const int16_t framelength, /* i : frame length */ + float *memfilt_lb, /* i/o: memory */ + float *mean_prev_hb, /* i/o: memory */ + float *smoothmem, /* i/o: memory */ + float *mean_prev, /* i/o: memory */ + float *mean_prev_nc, /* i/o: memory */ + float *wmold_hb, /* i/o: memory */ + int16_t *prevflag, /* i/o: flag */ + int16_t *pastpre, /* i/o: flag */ + const int16_t bwidth /* i : audio bandwidth */ +) +{ + int16_t i, j, len3xLp20; + float es_mdct[9]; /* 0..3 (0..7): energy of the 4 (8) subframes, 4..5: (8..10) energy of the future subframes */ + float es_mdct_hb[9]; /* 0..3 (0..7): energy of the 4 (8) subframes, 4..5: (8..10) energy of the future subframes */ + int16_t zcr[9]; /* 0..3 (0..7): zero crossing of the 4 (8) subframes, 4..5: (8..10) zero crossing of the future subframes */ + int16_t maxnzcr[8], cntnzcr; /* max number of samples without zero crossing */ + float plus_es_mdct[64]; /* 8*8 subsubframes */ + float imdct_mem[L_FRAME48k]; /* memory of the imdct transform, used in the next frame */ + + int16_t maxind, stind, stind_hb, cnt2, cnt5, adv, advmem; + int16_t ind2, ind3, pluslim; + float max_es; + float *ptr; + float min_g[13], g, gt[13]; + float min_g_hb[13], gt_hb[13]; + float preechogain[L_FRAME48k + PREECHO_SMOOTH_LEN]; + float preechogain_hb[L_FRAME48k]; + int16_t subframelength, subsubframelength; + float maxcrit, savehalfe, savehalfe_hb; + float rec_sig_lb[L_FRAME48k], rec_sig_hb[L_FRAME48k]; + float eshbmean2, eshbmean3, sxyhb2, sxylb3, sxyhb3; + float *fptr1, *fptr2, *fptr3, *fptr4, *fptr5, *fptr6; + int16_t *sptr1, *sptr2; + float wmold; + float lim16, lim32; + int16_t limzcr, limmaxnzcr; + float max_es_hb; + int16_t num_subsubframes, log2_num_subsubframes; + float ftmp, fattnext; + float sum_plus_es, mean_plus_es[65]; + float last2, last2_hb; + float max_plus_es_mdct; + int16_t nb_flag, smooth_len; + int16_t firstnzcr; + float es_mdct_half[9]; + float es_mdct_quart[9]; + double invsmoothlenp1; /*double just to have bit-exactness with the previous version, otherwise rounding difference of +-1*/ + int16_t subframelength_s2, subframelength_s34; + float oldgain, oldgain_hb; + + if ( core_brate <= HQ_32k ) + { + nb_flag = 0; + if ( bwidth == NB ) + { + nb_flag = 1; + } + + limzcr = 16; + smooth_len = 4; + invsmoothlenp1 = 0.2; + + if ( nb_flag == 1 ) + { + limzcr = 10; + smooth_len = PREECHO_SMOOTH_LEN; + invsmoothlenp1 = INV_PREECHO_SMOOTH_LENP1; + } + + limmaxnzcr = framelength / 24; + num_subsubframes = 8; + log2_num_subsubframes = 3; + + if ( framelength == L_FRAME8k ) + { + num_subsubframes = 4; + log2_num_subsubframes = 2; + } + len3xLp20 = framelength / 2 - (int16_t) ( (float) framelength * N_ZERO_MDCT_NS / FRAME_SIZE_NS ); + for ( i = 0; i < len3xLp20; i++ ) + { + imdct_mem[i] = -wtda_audio[len3xLp20 - 1 - i]; + } + + for ( i = 0; i < framelength / 2; i++ ) + { + imdct_mem[len3xLp20 + i] = -wtda_audio[i]; + } + + + subframelength = framelength >> LOG2_NUMSF; + subsubframelength = subframelength >> log2_num_subsubframes; + wmold = *smoothmem; + subframelength_s2 = subframelength / 2; + subframelength_s34 = subframelength * 3 / 4; + + cntnzcr = -1; + + lim16 = 0.1f; + lim32 = 0.01f; + savehalfe = 0.0f; + savehalfe_hb = 0.0f; + + if ( *pastpre == 0 ) + { + /* if past frame mean energies are not known (no preecho_sb in the past frame), limit max attenuation to 1*/ + lim16 = (float) 1; + lim32 = (float) 1; + } + + *pastpre = 2; + fptr1 = rec_sig_lb; + fptr2 = rec_sig; + fptr3 = rec_sig + 1; + fptr4 = rec_sig + 2; + *fptr1 = (float) ( 0.25 * ( *memfilt_lb + *fptr3 ) + 0.5 * *fptr2 ); + fptr1++; + + for ( j = 1; j < framelength - 1; j++ ) + { + *fptr1 = (float) ( 0.25 * ( *fptr2 + *fptr4 ) + 0.5 * *fptr3 ); + fptr1++; + fptr2++; + fptr3++; + fptr4++; + } + + *fptr1 = (float) ( 0.25 * ( *fptr2 ) + 0.5 * *fptr3 ); + fptr1 = rec_sig_lb; + fptr2 = rec_sig; + fptr3 = rec_sig_hb; + + for ( j = 0; j < framelength; j++ ) + { + *fptr3 = *fptr2 - *fptr1; + fptr1++; + fptr2++; + fptr3++; + } + + fptr2--; + *memfilt_lb = *fptr2; + + /* energy of low bands 8 present and 1 future sub-frames */ + fptr1 = es_mdct; + fptr5 = es_mdct_half; + fptr6 = es_mdct_quart; + fptr4 = es_mdct_hb; + fptr2 = rec_sig; + fptr3 = rec_sig_hb; + sptr1 = zcr; + *sptr1 = 0; + sptr2 = maxnzcr; + for ( j = 0; j < NUMSF; j++ ) /* 8 present subframes */ + { + *fptr1 = 100 + *fptr2 * *fptr2; + *fptr4 = 100 + *fptr3 * *fptr3; + + *sptr2 = 0; + firstnzcr = 1; + if ( j == 0 ) + { + firstnzcr = 0; + } + + fptr2++; + fptr3++; + + for ( i = 1; i < subframelength; i++ ) + { + if ( i == subframelength_s2 ) + { + *fptr5 = *fptr1; + } + + if ( i == subframelength_s34 ) + { + *fptr6 = *fptr1; + } + *fptr1 += *fptr2 * *fptr2; + *fptr4 += *fptr3 * *fptr3; + cntnzcr++; + if ( *fptr2 * *( fptr2 - 1 ) < 0 ) + { + ( *sptr1 )++; + if ( cntnzcr > *sptr2 ) + { + *sptr2 = cntnzcr; + } + + if ( ( firstnzcr > 0 ) && ( cntnzcr > maxnzcr[j - 1] ) ) + { + maxnzcr[j - 1] = cntnzcr; + } + + firstnzcr = 0; + cntnzcr = -1; + } + fptr2++; + fptr3++; + } + + if ( cntnzcr > *sptr2 ) + { + *sptr2 = cntnzcr; + } + fptr4++; + sptr1++; + sptr2++; + + if ( ( firstnzcr > 0 ) && ( cntnzcr > maxnzcr[j - 1] ) ) + { + maxnzcr[j - 1] = cntnzcr; + } + + *sptr1 = 0; + if ( ( j < NUMSF - 1 ) && ( *fptr2 * *( fptr2 - 1 ) < 0 ) ) /* zcr between 2 subframes */ + { + ( *sptr1 )++; /* counts for the nexte subframe */ + cntnzcr = -1; + } + + if ( *fptr5 < ( *fptr1 ) / 2 ) + { + *fptr5 = 2 * ( *fptr1 - *fptr5 ); + } + else + { + *fptr5 = *fptr1; + } + fptr1++; + fptr5++; + fptr6++; + } + + fptr2 = imdct_mem; + j = NUMSF; + *fptr1 = 100 + *fptr2 * *fptr2; + *sptr1 = 0; + fptr2++; + for ( i = 1; i < len3xLp20; i++ ) /* one future subframe but 140 samples (not 80) (enough with ALDO window) */ + { + *fptr1 += *fptr2 * *fptr2; + + if ( *fptr2 * *( fptr2 - 1 ) < 0 ) + { + ( *sptr1 )++; + } + + fptr2++; + } + + fptr2 = imdct_mem; + fptr3 = imdct_mem + 1; + fptr4 = imdct_mem + 2; + ftmp = (float) ( -0.25 * ( rec_sig[framelength - 1] + *fptr3 ) + 0.5 * *fptr2 ); + es_mdct_hb[NUMSF] = 100 + ftmp * ftmp; + + for ( j = 1; j < len3xLp20 - 1; j++ ) + { + ftmp = (float) ( -0.25 * ( *fptr2 + *fptr4 ) + 0.5 * *fptr3 ); + es_mdct_hb[NUMSF] += ftmp * ftmp; + fptr2++; + fptr3++; + fptr4++; + } + + ftmp = (float) ( -0.25 * ( *fptr2 ) + 0.5 * *fptr3 ); + es_mdct_hb[NUMSF] += ftmp * ftmp; + max_es_hb = es_mdct_hb[0]; /* for memorising the max energy */ + + max_es = es_mdct[0]; /* for memorising the max energy */ + maxind = 0; + for ( i = 1; i <= NUMSF; i++ ) + { + if ( es_mdct_hb[i] >= max_es_hb ) /* '=' to handle the first window*/ + { + max_es_hb = es_mdct_hb[i]; /* max energy low band, 8 present and 1 future subframes */ + } + + if ( es_mdct[i] >= max_es ) /* '=' to handle the first window*/ + { + max_es = es_mdct[i]; /* max energy low band, 8 present and 1 future subframes */ + maxind = i; + } + } + + cnt2 = cnt5 = 0; + if ( *prevflag != 0 || max_es < subframelength * 10000 ) + { + maxind = 0; + } + + if ( max_es < 4 * *mean_prev ) + { + maxind = 0; + } + *prevflag = 0; + + for ( i = 0; i < maxind; i++ ) /* only subbands before max energy subband are handled */ + { + g = 1; /* default gain */ + min_g[i] = 1; + min_g_hb[i] = 1; + if ( ( es_mdct_half[i] > 100 * ( *mean_prev_nc + 500000 ) ) || /* less then 20% energy in 3/4 of the subframe -> starting onset in the last quarter */ + ( ( es_mdct_half[i] > 10 * ( *mean_prev_nc + 500000 ) ) && + ( ( zcr[i] < limzcr ) || ( es_mdct_quart[i] < es_mdct[i] / 6 ) ) ) ) /* already an offset, plosif, do not touch */ + { + maxind = i; /* no preecho reduction after the first subframe with gain 1 */ + *prevflag = 1; + for ( j = i - 1; j >= 0; j-- ) + { + if ( es_mdct[j] > es_mdct[i] / 2 ) + { + maxind = j; + } + } + } + else + { + if ( es_mdct[i] < max_es / 16 ) + { + g = lim16; + cnt5++; + + if ( es_mdct[i] < max_es / 32 ) + { + g = lim32; + cnt2++; + } + + min_g[i] = (float) sqrt( (double) ( *mean_prev / es_mdct[i] ) ); /*limitation of attenuation gain */ + min_g_hb[i] = (float) sqrt( (double) ( *mean_prev_hb / es_mdct_hb[i] ) ); /*limitation of attenuation gain */ + if ( ( zcr[i] < limzcr / 2 ) || ( maxnzcr[i] > limmaxnzcr ) ) + { + if ( min_g[i] < 1 ) /* *mean_prev < es_mdct[i]) */ + { + *mean_prev = es_mdct[i]; + } + min_g[i] = 1; /* not noise-like, do not touch the amplitude, but may do in HB*/ + } + + if ( min_g[i] > 1 ) /* in fix point will be min_g = min(min_g, 1), weight 1 */ + { + min_g[i] = (float) 1; + } + + if ( min_g_hb[i] > 1 ) /* in fix point will be min_g = min(min_g, 1), weight 1 */ + { + min_g_hb[i] = (float) 1; + } + } + else + { + if ( i > 0 && maxind < NUMSF ) + { + *prevflag = 1; + } + maxind = i; /* no preecho reduction after the first subframe with gain 1*/ + } + } + gt[i] = g; + gt_hb[i] = g; + } + + for ( i = maxind; i <= NUMSF; i++ ) /* also for the first memory subframe */ + { + gt[i] = 1; + min_g[i] = 1; + gt_hb[i] = 1; + min_g_hb[i] = 1; + } + + ind2 = 0; + for ( i = 0; i < NUMSF; i++ ) + { + if ( gt[i] < 1 ) /*gt not yet limited by min_g*/ + { + ind2 = i + 1; /* first subframe with gain = 1 after last gain < 1 --> frame with the attack*/ + } + } + + if ( ( wmold > 0.5 ) && ( ( cnt2 + cnt5 ) < 2 ) ) /* mini either 1 cnt2 (and so also cnt5) or 2 cnt5 */ + { + /* maxind = 0; false alarm, no echo reduction */ + ind2 = 0; + } + + fptr3 = gt; + fptr4 = gt_hb; + fptr5 = min_g; + fptr6 = min_g_hb; + + for ( i = 0; i < ind2; i++ ) /* only subbands before max energy subband are handled*/ + { + if ( *fptr3 < *fptr5 ) /* in fix point will be g = max(g, min_g), weight 1 */ + { + *fptr3 = *fptr5; + } + + if ( *fptr4 < *fptr6 ) /* in fix point will be g = max(g, min_g), weight 1 */ + { + *fptr4 = *fptr6; + } + + fptr1 = preechogain + i * subframelength + smooth_len; + fptr2 = preechogain_hb + i * subframelength; + for ( j = 0; j < subframelength; j++ ) + { + *fptr1 = *fptr3; + *fptr2 = *fptr4; + fptr1++; + fptr2++; + } + + fptr3++; + fptr4++; + fptr5++; + fptr6++; + } + + max_plus_es_mdct = 0; + adv = smooth_len; /* samples needed to have near 1 gain after smoothing at the beggining of the attack subframe*/ + advmem = adv; + + if ( ind2 > 0 || wmold < 1 || *wmold_hb < 1 ) + { + ptr = imdct_mem; + pluslim = num_subsubframes; /* if ind2 == NUMSF */ + + if ( ind2 < NUMSF ) + { + ptr = rec_sig + subframelength * ind2; + pluslim = ( NUMSF - ind2 ) * num_subsubframes; + } + + maxcrit = *mean_prev_nc; + if ( ind2 == 0 ) + { + sum_plus_es = *mean_prev_nc; /* 8 times mean sususb enenrgy (=maxcrit)*/ + pluslim = num_subsubframes; + oldgain = wmold; + oldgain_hb = *wmold_hb; + } + else /* ind2 > 0*/ + { + sum_plus_es = es_mdct[ind2 - 1]; /* 8 times mean sususb enenrgy (=maxcrit)*/ + oldgain = gt[ind2 - 1]; + oldgain_hb = gt_hb[ind2 - 1]; + maxcrit = es_mdct[ind2 - 1] * gt[ind2 - 1] * gt[ind2 - 1]; /* /1 (iso /8) : 8 times of the pevious subframe mean*/ + + if ( ( max_es / 80 > maxcrit ) && ( zcr[ind2] > limzcr ) ) + { + maxcrit = max_es / 80; /* still 10 times smaller then mean max_es*/ + } + } + + for ( j = 0; j < pluslim; j++ ) /* 8 sub-subframes */ + { + plus_es_mdct[j] = 100; + for ( i = 0; i < subsubframelength; i++ ) + { + + ftmp = *ptr * *ptr; + plus_es_mdct[j] += ftmp; + if ( plus_es_mdct[j] > max_plus_es_mdct ) + { + max_plus_es_mdct = plus_es_mdct[j]; + } + ptr++; + } + + sum_plus_es += 4 * plus_es_mdct[j]; + mean_plus_es[j + 1] = sum_plus_es / ( j + 2 ); /* 4/j could be tabulated in fixed point */ + if ( mean_plus_es[j + 1] < maxcrit ) + { + mean_plus_es[j + 1] = maxcrit; + } + } + mean_plus_es[0] = plus_es_mdct[0]; + if ( mean_plus_es[0] < maxcrit ) + { + mean_plus_es[0] = maxcrit; + } + mean_plus_es[pluslim] = -1; + + j = 0; + while ( ( plus_es_mdct[j] < mean_plus_es[j] ) && ( plus_es_mdct[j] < max_plus_es_mdct / 8 ) ) + { + j++; + } + + adv -= j * subsubframelength; + + if ( ind2 < NUMSF ) /* onset not in future frame */ + { + fptr1 = preechogain + ind2 * subframelength + smooth_len; + fptr2 = preechogain_hb + ind2 * subframelength; + + for ( i = 0; i < j * subsubframelength; i++ ) + { + *fptr1 = oldgain; /*keep the gain of the previous subframe*/ + *fptr2 = oldgain_hb; /*keep the gain of the previous subframe*/ + fptr1++; + fptr2++; + } + } + } + + if ( ind2 > 0 ) + { + /* check increasing energy of preecho by regression last 3 subframes (if possible) */ + ind3 = ind2 + ( j >> log2_num_subsubframes ); /* return (with rounding) to subframe basis */ + if ( ind3 > 1 ) + { + /* case of 3 points is simply */ + eshbmean2 = es_mdct_hb[ind3 - 1] + es_mdct_hb[ind3 - 2]; + sxyhb2 = ( es_mdct_hb[ind3 - 1] - es_mdct_hb[ind3 - 2] ); /* / eshbmean2 * 2; 04042013: division not needed, only sign of sxyhb2 is used*/ + + if ( ind3 > 2 ) + { + eshbmean3 = ( eshbmean2 + es_mdct_hb[ind3 - 3] ) / 3; + sxylb3 = ( es_mdct[ind3 - 1] - es_mdct[ind3 - 3] ); /* /eslbmean3 / 2; /2 for 3 points regression calc; 04042013: division not needed, only sign of sxylb3 is used*/ + sxyhb3 = ( es_mdct_hb[ind3 - 1] - es_mdct_hb[ind3 - 3] ) / eshbmean3 / 2; + if ( ( sxyhb3 < 0.2f ) || ( sxylb3 < 0 ) ) + { + ind2 = 0; + adv = advmem; + } + } + else + { + if ( sxyhb2 < 0.0f ) + { + ind2 = 0; + adv = advmem; /* 04042013: small bug corection*/ + } + } + + eshbmean3 = ( eshbmean2 + es_mdct_hb[ind3] ) / 3; /*verif toward future subsubframe*/ + sxyhb3 = ( es_mdct_hb[ind3] - es_mdct_hb[ind3 - 2] ) / eshbmean3 / 2; + if ( sxyhb3 < 0.2f ) + { + ind2 = 0; + adv = advmem; + } + } + } + + stind = ind2 * subframelength - adv; + stind_hb = stind + advmem; + if ( stind < 0 ) + { + stind = 0; + } + + if ( stind_hb < 0 ) + { + stind_hb = 0; + } + + fptr1 = preechogain + stind + smooth_len; + fptr2 = preechogain_hb + stind_hb; + + for ( i = stind + smooth_len; i < framelength; i++ ) /* rest of the gains, without 4 (PREECHO_SMOOTH_LEN) 1 for fadeout */ + { + *( fptr1++ ) = 1; + } + + for ( i = stind_hb; i < framelength; i++ ) /* rest of the gains*/ + { + *( fptr2++ ) = 1; + } + + for ( i = 0; i < smooth_len; i++ ) + { + preechogain[i] = *smoothmem; + } + + fattnext = 1; + if ( stind > framelength ) + { + fattnext = gt[ind2 - 1]; + } + + for ( i = 0; i < smooth_len; i++ ) + { + preechogain[framelength + i] = fattnext; + } + + fptr1 = preechogain; + for ( i = 0; i < framelength; i++ ) + { + fptr2 = fptr1; + for ( j = 1; j <= smooth_len; j++ ) + { + *fptr1 += *( ++fptr2 ); + } + + *fptr1 *= (float) invsmoothlenp1; + fptr1++; + } + + *smoothmem = fattnext; + *wmold_hb = preechogain_hb[framelength - 1]; + + /* apply gain */ + fptr1 = preechogain; + fptr2 = preechogain_hb; + fptr3 = rec_sig; + fptr4 = rec_sig_lb; + fptr5 = rec_sig_hb; + + for ( i = 0; i < framelength; i++ ) + { + *fptr3 = *fptr4 * *fptr1 + *fptr5 * *fptr2; + fptr1++; + fptr2++; + fptr3++; + fptr4++; + fptr5++; + } + + *mean_prev_nc = es_mdct[0]; /* compute mean not corrected by the actual gains*/ + + for ( i = 1; i < NUMSF; i++ ) /* all present subbands */ + { + if ( i == NUMSF / 2 ) + { + savehalfe = *mean_prev_nc; + } + *mean_prev_nc += es_mdct[i]; + } + + if ( savehalfe < *mean_prev_nc / 2 ) + { + *mean_prev_nc = 2 * ( *mean_prev_nc - savehalfe ); + } + *mean_prev_nc = *mean_prev_nc * INV_NUMSF; /* >> LOG2_NUMSF in fixpoint */ + + for ( i = 0; i < ind2; i++ ) /* only subbands before max energy subband are handled*/ + { + es_mdct[i] = es_mdct[i] * gt[i] * gt[i]; + es_mdct_hb[i] = es_mdct_hb[i] * gt_hb[i] * gt_hb[i]; + } + + *mean_prev = es_mdct[0]; /* compute mean used in next frame to limit gain*/ + *mean_prev_hb = es_mdct_hb[0]; /* compute mean used in next frame to limit gain*/ + + for ( i = 1; i < NUMSF; i++ ) /* all present subbands */ + { + if ( i == NUMSF / 2 ) + { + savehalfe = *mean_prev; + savehalfe_hb = *mean_prev_hb; + } + + *mean_prev += es_mdct[i]; + *mean_prev_hb += es_mdct_hb[i]; + } + + if ( savehalfe < *mean_prev / 2 ) + { + *mean_prev = 2 * ( *mean_prev - savehalfe ); + } + + if ( savehalfe_hb < *mean_prev_hb / 2 ) + { + *mean_prev_hb = 2 * ( *mean_prev_hb - savehalfe_hb ); + } + + *mean_prev = *mean_prev * INV_NUMSF; /* >> LOG2_NUMSF in fixpoint */ + *mean_prev_hb = *mean_prev_hb * INV_NUMSF; /* >> LOG2_NUMSF in fixpoint */ + last2 = ( es_mdct[NUMSF - 1] + es_mdct[NUMSF - 2] ) / 2; + last2_hb = ( es_mdct_hb[NUMSF - 1] + es_mdct_hb[NUMSF - 2] ) / 2; + + if ( last2 > *mean_prev ) + { + *mean_prev = last2; + } + + if ( last2_hb > *mean_prev_hb ) + { + *mean_prev_hb = last2_hb; + } + } + + return; +} + + +/*--------------------------------------------------------------------------* + * inverse_transform() + * + * Inverse transform from the DCT domain to time domain + *--------------------------------------------------------------------------*/ + +void inverse_transform( + const float *in_mdct, /* i : input MDCT vector */ + float *out, /* o : output vector */ + const int16_t is_transient, /* i : transient flag */ + const int16_t L, /* i : output frame length */ + const int16_t L_inner, /* i : length of the transform */ + const int16_t element_mode /* i : IVAS element mode */ +) +{ + float out_alias[L_FRAME48k]; + float alias[MAX_SEGMENT_LENGTH]; + const float *in_segment; + float *out_segment; + float tmp; + int16_t ta, seg; + int16_t segment_length; + float in_mdct_modif[L_FRAME48k]; + float *in_segment_modif; + const float *win; + + segment_length = L / 2; + + if ( is_transient ) + { + if ( L == L_FRAME48k ) + { + win = short_window_48kHz; + } + else if ( L == L_FRAME32k ) + { + win = short_window_32kHz; + } + else if ( L == L_FRAME16k ) + { + win = short_window_16kHz; + } + else /* L == L_FRAME8k */ + { + win = short_window_8kHz; + } + + set_f( out_alias, 0.0f, L ); + + in_segment = in_mdct; + in_segment_modif = in_mdct_modif; + + if ( L == L_inner ) + { + mvr2r( in_mdct, in_mdct_modif, L ); + } + else if ( L > L_inner ) + { + for ( seg = 0; seg < NUM_TIME_SWITCHING_BLOCKS; seg++ ) + { + for ( ta = 0; ta < L_inner / NUM_TIME_SWITCHING_BLOCKS; ta++ ) + { + *in_segment_modif++ = *in_segment++; + } + + for ( ta = 0; ta < ( L - L_inner ) / NUM_TIME_SWITCHING_BLOCKS; ta++ ) + { + *in_segment_modif++ = 0; + } + } + } + else /* L < L_inner */ + { + for ( seg = 0; seg < NUM_TIME_SWITCHING_BLOCKS; seg++ ) + { + for ( ta = 0; ta < segment_length / 2; ta++ ) + { + *in_segment_modif++ = *in_segment++; + } + in_segment += ( L_inner - L ) / NUM_TIME_SWITCHING_BLOCKS; + } + } + + out_segment = out_alias - segment_length / 4; + in_segment = in_mdct_modif; + + iedct_short( in_segment, alias, segment_length, element_mode ); + + for ( ta = segment_length / 4; ta < segment_length / 2; ta++ ) + { + out_segment[ta] = alias[ta]; + } + + for ( ta = segment_length / 2; ta < segment_length; ta++ ) + { + out_segment[ta] = alias[ta] * win[ta]; + } + + out_segment = out_segment + segment_length / 2; + in_segment = in_segment + segment_length / 2; + + for ( seg = 1; seg < NUM_TIME_SWITCHING_BLOCKS - 1; seg++ ) + { + iedct_short( in_segment, alias, segment_length, element_mode ); + + for ( ta = 0; ta < segment_length; ta++ ) + { + out_segment[ta] = out_segment[ta] + alias[ta] * win[ta]; + } + + in_segment = in_segment + segment_length / 2; + out_segment = out_segment + segment_length / 2; + } + + iedct_short( in_segment, alias, segment_length, element_mode ); + + for ( ta = 0; ta < segment_length / 2; ta++ ) + { + out_segment[ta] = out_segment[ta] + alias[ta] * win[ta]; + } + + for ( ta = segment_length / 2; ta < 3 * segment_length / 4; ta++ ) + { + out_segment[ta] = alias[ta]; + } + + for ( ta = 0; ta < L / 2; ta++ ) + { + tmp = out_alias[ta]; + out[ta] = out_alias[L - 1 - ta]; + out[L - 1 - ta] = tmp; + } + } + else + { + edct( in_mdct, out, L, element_mode ); + } + + return; +} diff --git a/lib_com/typedef.h b/lib_com/typedef.h new file mode 100644 index 0000000000000000000000000000000000000000..9b1ed7bc9327f535c43c82018a4ee7d6e3a5e031 --- /dev/null +++ b/lib_com/typedef.h @@ -0,0 +1,129 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +/* + =========================================================================== + File: TYPEDEF.H v.2.3 - 30.Nov.2009 + =========================================================================== + + ITU-T STL BASIC OPERATORS + + TYPE DEFINITION PROTOTYPES + + History: + 26.Jan.00 v1.0 Incorporated to the STL from updated G.723.1/G.729 + basic operator library (based on basic_op.h) + + 03 Nov 04 v2.0 Incorporation of new 32-bit / 40-bit / control + operators for the ITU-T Standard Tool Library as + described in Geneva, 20-30 January 2004 WP 3/16 Q10/16 + TD 11 document and subsequent discussions on the + wp3audio@yahoogroups.com email reflector. + March 06 v2.1 Changed to improve portability. + + ============================================================================ +*/ + +/*_____________________ + | | + | Basic types. | + |_____________________| +*/ + +#ifndef TYPEDEF_H +#define TYPEDEF_H + +#include +#include + +#if __STDC_VERSION__ >= 199901L +typedef int8_t Word8; +typedef uint8_t UWord8; +typedef int16_t Word16; +typedef int32_t Word32; +typedef uint16_t UWord16; +typedef uint32_t UWord32; +typedef int64_t Word40; +typedef bool Flag; +#define TYPEDEF_INITIALIZED +#else +/* + * This is the original code from the file typedef.h + */ +#if defined( __BORLANDC__ ) || defined( __WATCOMC__ ) || defined( _MSC_VER ) || defined( __ZTC__ ) +typedef signed char Word8; +typedef unsigned char UWord8; +typedef short Word16; +typedef int Word32; +typedef unsigned short UWord16; +typedef unsigned int UWord32; +typedef __int64 Word40; +typedef int Flag; +#define TYPEDEF_INITIALIZED +#elif defined( __sun ) +typedef signed char Word8; +typedef unsigned char UWord8; +typedef short Word16; +typedef long Word32; +/*#error "The 40-bit operations have not been tested on __sun : need to define Word40"*/ +typedef unsigned short UWord16; +typedef unsigned long UWord32; +typedef long long Word40; +typedef int Flag; +#define TYPEDEF_INITIALIZED +#elif defined( __unix__ ) || defined( __unix ) || defined( __APPLE__ ) || defined( __CYGWIN__ ) || defined( __MINGW32__ ) +typedef signed char Word8; +typedef unsigned char UWord8; +typedef short Word16; +typedef int Word32; +typedef unsigned short UWord16; +typedef unsigned int UWord32; +/*#error "The 40-bit operations have not been tested on unix : need to define Word40"*/ +typedef long long Word40; +typedef int Flag; +#endif +#define TYPEDEF_INITIALIZED +#endif + +typedef float Float32; + +#ifndef TYPEDEF_INITIALIZED +#error types in typedef.h not initialized +#endif +#endif /* ifndef _TYPEDEF_H */ + + +/* end of file */ diff --git a/lib_com/vlpc_2st_com.c b/lib_com/vlpc_2st_com.c new file mode 100644 index 0000000000000000000000000000000000000000..e180454c3e412fbba0de5970fdc6ae0173705531 --- /dev/null +++ b/lib_com/vlpc_2st_com.c @@ -0,0 +1,90 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "wmc_auto.h" + +/*------------------------------------------------------------------* + * lsf_weight_2st() + * + * + *------------------------------------------------------------------*/ + +void lsf_weight_2st( + const float *lsfq, + float *w, + const int16_t mode, + const int32_t sr_core ) +{ + int16_t i; + float d[M + 1]; + float freq_max = sr_core / 2.f; + float freq_div = freq_max / (float) M; + + /* compute lsf distance */ + d[0] = lsfq[0]; + for ( i = 1; i < M; i++ ) + { + d[i] = lsfq[i] - lsfq[i - 1]; + } + d[M] = freq_max - lsfq[M - 1]; + + /* weighting function */ + for ( i = 0; i < M; i++ ) + { + assert( d[i] > 0 ); + + if ( mode == 0 ) + { + w[i] = (float) ( 60.0f / ( freq_div / sqrt( d[i] * d[i + 1] ) ) ); /* abs */ + } + else if ( mode == 1 ) + { + w[i] = (float) ( 65.0f / ( freq_div / sqrt( d[i] * d[i + 1] ) ) ); /* mid */ + } + else + { + w[i] = (float) ( 63.0f / ( freq_div / sqrt( d[i] * d[i + 1] ) ) ); /* rel2 */ + } + } + + return; +} diff --git a/lib_com/weight.c b/lib_com/weight.c new file mode 100644 index 0000000000000000000000000000000000000000..61985717838b0e60599f924636b15603be63d4fb --- /dev/null +++ b/lib_com/weight.c @@ -0,0 +1,367 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "wmc_auto.h" + +/*--------------------------------------------------------------------------* + * sfm2mqb() + * + * Map sub-vectors to pbands + *--------------------------------------------------------------------------*/ + +static void sfm2mqb( + int16_t spe[], /* i : sub-vectors */ + int16_t spe2q[], /* o : pbands */ + const int16_t nb_sfm /* i : number of norms */ +) +{ + int16_t tmp, i; + + /* short groups */ + spe2q[0] = spe[0] + 3; + spe2q[1] = spe[1] + 3; + spe2q[2] = spe[2] + 3; + spe2q[3] = spe[3] + 3; + spe2q[4] = spe[4] + 3; + spe2q[5] = spe[5] + 3; + spe2q[6] = spe[6] + 3; + spe2q[7] = spe[7] + 3; + spe2q[8] = spe[8] + 3; + spe2q[9] = spe[9] + 3; + + spe2q[10] = ( ( spe[10] + spe[11] ) >> 1 ) + 4; + spe2q[11] = ( ( spe[12] + spe[13] ) >> 1 ) + 4; + spe2q[12] = ( ( spe[14] + spe[15] ) >> 1 ) + 4; + + spe2q[13] = ( ( spe[16] + spe[17] ) >> 1 ) + 5; + spe2q[14] = ( ( spe[18] + spe[19] ) >> 1 ) + 5; + + tmp = 0; + for ( i = 20; i < 24; i++ ) + { + tmp += spe[i]; + } + spe2q[15] = (int16_t) ( ( (int32_t) tmp * 8192L ) >> 15 ) + 6; + + tmp = 0; + for ( i = 24; i < 27; i++ ) + { + tmp += spe[i]; + } + spe2q[16] = (int16_t) ( ( (int32_t) tmp * 10923L ) >> 15 ) + 6; + + if ( nb_sfm > 27 ) + { + tmp = 0; + for ( i = 27; i < 30; i++ ) + { + tmp += spe[i]; + } + spe2q[17] = (int16_t) ( ( (int32_t) tmp * 10923L ) >> 15 ) + 6; + + if ( nb_sfm > 30 ) + { + tmp = 0; + for ( i = 30; i < 35; i++ ) + { + tmp += spe[i]; + } + spe2q[18] = (int16_t) ( ( (int32_t) tmp * 6553L ) >> 15 ) + 7; + + tmp = 0; + for ( i = 35; i < 44; i++ ) + { + tmp += spe[i]; + } + spe2q[19] = (int16_t) ( ( (int32_t) tmp * 3641L ) >> 15 ) + 8; + } + } + + return; +} + +/*--------------------------------------------------------------------------* + * mqb2sfm() + * + * Map pbands to sub-vectors + *--------------------------------------------------------------------------*/ + +static void mqb2sfm( + int16_t spe2q[], /* i : pbands */ + int16_t spe[], /* o : sub-vectors */ + const int16_t lnb_sfm /* i : number of norms */ +) +{ + int16_t i; + + spe[0] = spe2q[0]; + spe[1] = spe2q[1]; + spe[2] = spe2q[2]; + spe[3] = spe2q[3]; + spe[4] = spe2q[4]; + spe[5] = spe2q[5]; + spe[6] = spe2q[6]; + spe[7] = spe2q[7]; + spe[8] = spe2q[8]; + spe[9] = spe2q[9]; + + spe[10] = spe2q[10]; + spe[11] = spe2q[10]; + + spe[12] = spe2q[11]; + spe[13] = spe2q[11]; + + spe[14] = spe2q[12]; + spe[15] = spe2q[12]; + + spe[16] = spe2q[13]; + spe[17] = spe2q[13]; + + spe[18] = spe2q[14]; + spe[19] = spe2q[14]; + for ( i = 20; i < 24; i++ ) + { + spe[i] = spe2q[15]; + } + + for ( i = 24; i < 27; i++ ) + { + spe[i] = spe2q[16]; + } + + if ( lnb_sfm > SFM_N_STA_8k ) + { + for ( i = 27; i < 30; i++ ) + { + spe[i] = spe2q[17]; + } + + if ( lnb_sfm > SFM_N_STA_10k ) + { + for ( i = 30; i < 35; i++ ) + { + spe[i] = spe2q[18]; + } + + for ( i = 35; i < 44; i++ ) + { + spe[i] = spe2q[19]; + } + } + } + + return; +} + +/*--------------------------------------------------------------------------* + * map_quant_weight() + * + * Calculate the quantization weights + *--------------------------------------------------------------------------*/ + +void map_quant_weight( + const int16_t normqlg2[], /* i : quantized norms */ + int16_t wnorm[], /* o : weighted norm */ + const int16_t is_transient /* i : transient flag */ +) +{ + int16_t sfm; + int16_t tmp16; + int16_t spe2q[NUM_MAP_BANDS]; + int16_t spe[NB_SFM]; + + int16_t spe2q_max; + int16_t spe2q_min; + int16_t norm_max; + int16_t shift; + int16_t sum; + int16_t k; + int16_t lnb_sfm, num_map_bands; + + if ( is_transient ) + { + lnb_sfm = NB_SFM; + num_map_bands = NUM_MAP_BANDS; + + for ( sfm = 0; sfm < lnb_sfm; sfm += 4 ) + { + sum = 0; + for ( k = 0; k < 4; k++ ) + { + sum = sum + normqlg2[sfm + k]; + } + sum = sum >> 2; + for ( k = 0; k < 4; k++ ) + { + spe[sfm + k] = sum; + } + } + } + else + { + lnb_sfm = NB_SFM; + num_map_bands = NUM_MAP_BANDS; + + + for ( sfm = 0; sfm < lnb_sfm; sfm++ ) + { + spe[sfm] = normqlg2[sfm]; + } + } + + sfm2mqb( spe, spe2q, lnb_sfm ); + + for ( sfm = 0; sfm < num_map_bands; sfm++ ) + { + spe2q[sfm] = spe2q[sfm] - 10; + } + + /* spectral smoothing */ + for ( sfm = 1; sfm < num_map_bands; sfm++ ) + { + tmp16 = spe2q[sfm - 1] - 4; + if ( spe2q[sfm] < tmp16 ) + { + spe2q[sfm] = tmp16; + } + } + + for ( sfm = num_map_bands - 2; sfm >= 0; sfm-- ) + { + tmp16 = spe2q[sfm + 1] - 8; + if ( spe2q[sfm] < tmp16 ) + { + spe2q[sfm] = tmp16; + } + } + + for ( sfm = 0; sfm < num_map_bands; sfm++ ) + { + if ( spe2q[sfm] < a_map[sfm] ) + { + spe2q[sfm] = a_map[sfm]; + } + } + + /* Saturate by the Absolute Threshold of Hearing */ + spe2q_max = MIN16B; + spe2q_min = MAX16B; + + for ( sfm = 0; sfm < num_map_bands; sfm++ ) + { + spe2q[sfm] = sfm_width[sfm] - spe2q[sfm]; + + if ( spe2q_max < spe2q[sfm] ) + { + spe2q_max = spe2q[sfm]; + } + + if ( spe2q_min > spe2q[sfm] ) + { + spe2q_min = spe2q[sfm]; + } + } + + for ( sfm = 0; sfm < num_map_bands; sfm++ ) + { + spe2q[sfm] = spe2q[sfm] - spe2q_min; + } + + spe2q_max = spe2q_max - spe2q_min; + + if ( spe2q_max == 0 ) + { + norm_max = 0; + } + else + { + if ( spe2q_max < 0 ) + { + spe2q_max = ~spe2q_max; + } + for ( norm_max = 0; spe2q_max < 0x4000; norm_max++ ) + { + spe2q_max <<= 1; + } + } + + shift = norm_max - 13; + for ( sfm = 0; sfm < num_map_bands; sfm++ ) + { + if ( shift < 0 ) + { + spe2q[sfm] = spe2q[sfm] >> ( -shift ); + } + else + { + spe2q[sfm] = spe2q[sfm] << shift; + } + } + + mqb2sfm( spe2q, spe, lnb_sfm ); + + if ( is_transient ) + { + for ( sfm = 0; sfm < lnb_sfm; sfm += 4 ) + { + sum = 0; + for ( k = 0; k < 4; k++ ) + { + sum = sum + spe[sfm + k]; + } + + sum = sum >> 2; + + for ( k = 0; k < 4; k++ ) + { + spe[sfm + k] = sum; + } + } + } + + /* modify the norms for bit-allocation */ + for ( sfm = 0; sfm < lnb_sfm; sfm++ ) + { + wnorm[sfm] = spe[sfm] + normqlg2[sfm]; + } + + return; +} diff --git a/lib_com/weight_a.c b/lib_com/weight_a.c new file mode 100644 index 0000000000000000000000000000000000000000..5b5619eec5e89edb8876f89694a02a624b5854f5 --- /dev/null +++ b/lib_com/weight_a.c @@ -0,0 +1,106 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "prot.h" +#include "wmc_auto.h" + +/*------------------------------------------------------------------ + * weight_a() + * + * Weighting of LP filter coefficients, ap[i] = a[i] * (gamma^i) + *------------------------------------------------------------------*/ + +void weight_a( + const float *a, /* i : LP filter coefficients */ + float *ap, /* o : weighted LP filter coefficients */ + const float gamma, /* i : weighting factor */ + const int16_t m /* i : order of LP filter */ +) +{ + float f; + int16_t i; + + ap[0] = a[0]; + f = gamma; + + for ( i = 1; i <= m; i++ ) + { + ap[i] = f * a[i]; + f *= gamma; + } + + return; +} + + +/*------------------------------------------------------------------ + * weight_a_subfr() + * + * Weighting of LP filter coefficients for multiple subframes, + * ap[i] = a[i] * (gamma^i) + *------------------------------------------------------------------*/ + +void weight_a_subfr( + const int16_t nb_subfr, /* i : number of subframes */ + const float *A, /* i : LP filter coefficients */ + float *Aw, /* o : weighted LP filter coefficients */ + const float gamma, /* i : weighting factor */ + const int16_t m /* i : order of LP filter */ +) +{ + int16_t i, j; + float tmp; + + for ( j = 0; j < nb_subfr; j++ ) + { + Aw[j * ( m + 1 )] = A[j * ( m + 1 )]; + } + + /* Smoothing aka spreading aka masking envelope generation */ + tmp = gamma; + for ( i = 1; i < m + 1; i++ ) + { + for ( j = 0; j < nb_subfr; j++ ) + { + Aw[i + j * ( m + 1 )] = A[i + j * ( m + 1 )] * tmp; + } + tmp *= gamma; + } + + return; +} diff --git a/lib_com/wi.c b/lib_com/wi.c new file mode 100644 index 0000000000000000000000000000000000000000..7ec30010fe0365b2eb6a84cc8a295790afd98ca8 --- /dev/null +++ b/lib_com/wi.c @@ -0,0 +1,2295 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * Local constants + *-------------------------------------------------------------------*/ + +#define WARP_OS_RATE 8 +#define LL 256 +#define LL_OS ( WARP_OS_RATE * LL ) +#define OSLENGTH 12 +#define WI_THRESHLD 0.8 +#define WI_SAMPLE_THLD 20 +#define ERB_CBSIZE1 64 +#define ERB_CBSIZE2 64 + +#define _POLY1( x, c ) ( ( c )[0] * ( x ) + ( c )[1] ) +#define _POLY2( x, c ) ( _POLY1( ( x ), ( c ) ) * ( x ) + ( c )[2] ) +#define _POLY3( x, c ) ( _POLY2( ( x ), ( c ) ) * ( x ) + ( c )[3] ) + + +/*-------------------------------------------------------------------* + * DTFS_new() + * + * DTFS structure initialization. + *-------------------------------------------------------------------*/ + +/*! r: DTFS structure */ +ivas_error DTFS_new( + DTFS_STRUCTURE **dtfs_out ) +{ + int16_t i; + DTFS_STRUCTURE *dtfs = NULL; + + if ( ( dtfs = (DTFS_STRUCTURE *) malloc( sizeof( DTFS_STRUCTURE ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DTFS (SC-VBR) structure\n" ) ); + } + +#define WMC_TOOL_SKIP + MOVE( 2 ); + LOOP( 1 ); + MOVE( 2 ); + dtfs->lag = 0; + dtfs->nH = 0; + dtfs->nH_4kHz = 0; + dtfs->upper_cut_off_freq_of_interest = 3300.0; + dtfs->upper_cut_off_freq = 4000.0; + + for ( i = 0; i < MAXLAG_WI; i++ ) + { + dtfs->a[i] = dtfs->b[i] = 0.0; + } + + dtfs->sampling_rate = -1; + + *dtfs_out = dtfs; +#undef WMC_TOOL_SKIP + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * DTFS_copy() + * + * Copy from one DTFS STRUCTURE to another. + *-------------------------------------------------------------------*/ + +void DTFS_copy( + DTFS_STRUCTURE *Xout, /* o : DTFS structure */ + DTFS_STRUCTURE Xinp /* i : DTFS structure */ +) +{ + int16_t k; + +#define WMC_TOOL_SKIP + LOOP( 1 ); + for ( k = 0; k < MAXLAG_WI; k++ ) + { + MOVE( 1 ); + Xout->a[k] = Xinp.a[k]; + } + LOOP( 1 ); + for ( k = 0; k < MAXLAG_WI; k++ ) + { + MOVE( 1 ); + Xout->b[k] = Xinp.b[k]; + } + MOVE( 1 ); + Xout->lag = Xinp.lag; + Xout->nH = Xinp.nH; + Xout->nH_4kHz = Xinp.nH_4kHz; + Xout->upper_cut_off_freq_of_interest = Xinp.upper_cut_off_freq_of_interest; + Xout->upper_cut_off_freq = Xinp.upper_cut_off_freq; +#undef WMC_TOOL_SKIP + + return; +} + + +/*-------------------------------------------------------------------* + * DTFS_sub() + * + * Difference of A and B coefficients in cartesian domain. + * Equivalent to time domain subtraction. + *-------------------------------------------------------------------*/ + +void DTFS_sub( + DTFS_STRUCTURE *tmp, /* o : output DFTS */ + DTFS_STRUCTURE X1, /* i : DTFS input 1 */ + DTFS_STRUCTURE X2 /* i : DTFS input 2 */ +) +{ + int16_t i; + +#define WMC_TOOL_SKIP + MULT( 1 ); + LOOP( 1 ); + for ( i = 0; i <= X1.lag / 2; i++ ) + { + MOVE( 1 ); + MULT( 1 ); + tmp->a[i] = X1.a[i]; + MOVE( 1 ); + tmp->b[i] = X1.b[i]; + } + MULT( 1 ); + LOOP( 1 ); + for ( i = 0; i <= X2.lag / 2; i++ ) + { + MAC( 1 ); + tmp->a[i] -= X2.a[i]; + ADD( 1 ); + tmp->b[i] -= X2.b[i]; + } + MOVE( 1 ); + tmp->lag = max( X1.lag, X2.lag ); + tmp->nH = max( X1.nH, X2.nH ); + tmp->nH_4kHz = max( X1.nH_4kHz, X2.nH_4kHz ); + tmp->upper_cut_off_freq_of_interest = X1.upper_cut_off_freq_of_interest; + tmp->upper_cut_off_freq = X1.upper_cut_off_freq; +#undef WMC_TOOL_SKIP + + return; +} + +/*-------------------------------------------------------------------* + * DTFS_fast_fs_inv() + * + * DTFS inverse. + *-------------------------------------------------------------------*/ + +static void DTFS_fast_fs_inv( + DTFS_STRUCTURE *X1_DTFS, /* i : DTFS */ + float *out, /* o : time domain output */ + int16_t N /* i : number of output samples */ +) +{ + uint16_t i, M_2 = (uint16_t) min( X1_DTFS->lag >> 1, X1_DTFS->nH ), N_2 = (uint16_t) N >> 1; + float dbuf[256 + 1]; /* N can't be > 256 */ + + if ( N < X1_DTFS->lag ) + { + N = X1_DTFS->lag; + } + +#define WMC_TOOL_SKIP + /* Populate the dbuf array */ + dbuf[1] = X1_DTFS->a[0]; + dbuf[2] = 0.0; + for ( i = 1; i < M_2; i++ ) + { + MAC( 1 ); + dbuf[2 * i + 1] = X1_DTFS->a[i] * N_2; + MAC( 1 ); + dbuf[2 * i + 2] = X1_DTFS->b[i] * N_2; + } + + if ( N_2 != M_2 ) + { + dbuf[2 * i + 1] = X1_DTFS->a[i] * N_2; + dbuf[2 * i + 2] = X1_DTFS->b[i] * N_2; + i++; + } + + /* Zero-padding in the frequency domain */ + for ( ; i < N_2; i++ ) + { + MOVE( 1 ); + MAC( 2 ); + dbuf[2 * i + 1] = dbuf[2 * i + 2] = 0.0; + } + + FUNC( 3 ); + realft( dbuf, N_2, -1 ); + + for ( i = 1; i <= N; i++ ) + { + MULT( 1 ); + ADD( 1 ); + out[i - 1] = dbuf[i] / N_2; + } +#undef WMC_TOOL_SKIP + + return; +} + + +/*-------------------------------------------------------------------* + * DTFS_alignment_weight() + * + * Estimate the shift to find the best match between the reference + * DTFS and the test DTFS. + *-------------------------------------------------------------------*/ + +/*! r: shift value to shift X2_DTFS by */ +static float DTFS_alignment_weight( + DTFS_STRUCTURE refX1_DTFS, /* i : X1 the reference DTFS to keep fixed */ + DTFS_STRUCTURE X2_DTFS, /* i : X2 the test DTFS to shift to find best match */ + float Eshift, /* i : Expected shift - coarse value */ + const float *LPC1, /* i : LPC to filter to find correlation in spch */ + const float *LPC2 /* i : LPC to filter to find correlation in spch */ +) +{ + /* Eshift is w.r.t X2 */ + int16_t k; + float maxcorr, corr, Adiff, diff, tmp, tmp1, fshift, n, wcorr; + float pwf = 0.7f, tmplpc[M + 1]; + DTFS_STRUCTURE X1_DTFS; + +#define WMC_TOOL_SKIP + FUNC( 2 ); + DTFS_copy( &X1_DTFS, refX1_DTFS ); + FUNC( 2 ); + DTFS_adjustLag( &X1_DTFS, X2_DTFS.lag ); + FUNC( 3 ); + ADD( 1 ); + DTFS_poleFilter( &X1_DTFS, LPC1, M + 1 ); + MOVE( 1 ); + tmp = 1.0; + LOOP( 1 ); + for ( k = 0, tmp = 1.0; k < M + 1; k++ ) + { + MOVE( 1 ); + MULT( 2 ); + tmplpc[k] = LPC1[k] * ( tmp *= pwf ); + } + + FUNC( 3 ); + DTFS_zeroFilter( &X1_DTFS, tmplpc, M + 1 ); + FUNC( 3 ); + DTFS_poleFilter( &X2_DTFS, LPC2, M + 1 ); + MOVE( 1 ); + LOOP( 1 ); + for ( k = 0, tmp = 1.0; k < M + 1; k++ ) + { + /* can be stored as a table */ + MULT( 1 ); + tmplpc[k] = LPC2[k] * ( tmp *= pwf ); + } + FUNC( 3 ); + DTFS_zeroFilter( &X2_DTFS, tmplpc, M + 1 ); + MOVE( 1 ); + ADD( 1 ); + maxcorr = (float) -HUGE_VAL; + MOVE( 1 ); + fshift = Eshift; + MOVE( 1 ); + MULT( 1 ); + Adiff = max( 6, 0.15f * X2_DTFS.lag ); + LOGIC( 1 ); + if ( X2_DTFS.lag < 60 ) + { + MOVE( 1 ); + diff = 0.25; + } + else + { + MOVE( 1 ); + diff = 0.5; + } + ADD( 1 ); + ADD( 1 ); + LOOP( 1 ); + for ( n = Eshift - Adiff; n <= Eshift + Adiff; n += diff ) + { + MOVE( 2 ); + ADD( 1 ); + corr = tmp = 0.0f; + /* bit-exact optimization - PI2/X2_DTFS.lag should be counted as a single divide */ + MULT( 1 ); + tmp1 = (float) ( PI2 * n / X2_DTFS.lag ); + ADD( 1 ); + LOOP( 1 ); + for ( k = 0; k <= min( X2_DTFS.lag >> 1, X2_DTFS.nH_4kHz ); k++, tmp += tmp1 ) + { + /* Not counting math function cos and sin since they will be implemented as look-up tables */ + MAC( 1 ); + ADD( 1 ); + corr += (float) ( ( X1_DTFS.a[k] * X2_DTFS.a[k] + X1_DTFS.b[k] * X2_DTFS.b[k] ) * cos( tmp ) ); + MAC( 1 ); + ADD( 1 ); + corr += (float) ( ( X1_DTFS.b[k] * X2_DTFS.a[k] - X1_DTFS.a[k] * X2_DTFS.b[k] ) * sin( tmp ) ); + } + MOVE( 1 ); + MAC( 2 ); + ABS( 1 ); + wcorr = (float) ( corr * ( 1.0f - 0.01f * fabs( n - Eshift ) ) ); + LOGIC( 1 ); + if ( wcorr > maxcorr ) + { + MOVE( 1 ); + fshift = n; + MOVE( 1 ); + maxcorr = wcorr; + } + } +#undef WMC_TOOL_SKIP + + return fshift; +} + + +/*-------------------------------------------------------------------* + * DTFS_alignment_full() + * + * Shift value for DTFS full alignment. + *-------------------------------------------------------------------*/ + +float DTFS_alignment_full( + DTFS_STRUCTURE X1_DTFS, /* i : reference DTFS */ + DTFS_STRUCTURE X2_DTFS, /* i : DTFS to shift */ + const int16_t num_steps /* i : resolution */ +) +{ + int16_t k; + float maxcorr, corr, tmp, tmp1, fshift, n, diff; + +#define WMC_TOOL_SKIP + LOGIC( 1 ); + if ( X1_DTFS.lag < X2_DTFS.lag ) + { + FUNC( 2 ); + DTFS_zeroPadd( X2_DTFS.lag, &X1_DTFS ); + } + + MOVE( 1 ); + ADD( 1 ); + maxcorr = (float) -HUGE_VAL; + /* bit-exact optimization - 1/num_steps can be constant => should be counted as a multiply */ + MOVE( 1 ); + MULT( 1 ); + diff = (float) X2_DTFS.lag / num_steps; + + LOOP( 1 ); + for ( fshift = n = 0.0; n < (float) X2_DTFS.lag; n += diff ) + { + MOVE( 2 ); + corr = tmp = 0.0f; + MOVE( 1 ); + MULT( 2 ); + tmp1 = (float) ( PI2 * n / X2_DTFS.lag ); + ADD( 1 ); + + LOOP( 1 ); + for ( k = 0; k <= min( X2_DTFS.lag >> 1, X2_DTFS.nH_4kHz ); k++, tmp += tmp1 ) + + { + MAC( 1 ); + ADD( 2 ); + corr += (float) ( ( X1_DTFS.a[k] * X2_DTFS.a[k] + X1_DTFS.b[k] * X2_DTFS.b[k] ) * cos( tmp ) ); + MAC( 1 ); + ADD( 1 ); + corr += (float) ( ( X1_DTFS.b[k] * X2_DTFS.a[k] - X1_DTFS.a[k] * X2_DTFS.b[k] ) * sin( tmp ) ); + } + LOGIC( 1 ); + if ( corr > maxcorr ) + { + MOVE( 1 ); + fshift = n; + MOVE( 1 ); + maxcorr = corr; + } + } +#undef WMC_TOOL_SKIP + + return fshift; +} + + +/*-------------------------------------------------------------------* + * DTFS_phaseShift() + * + * Phase shift the DTFS coefficients. + * ph is the amount of phase shift (between 0 and 2pi), where positive + * value indicates a shift to right, and a negative ph value indicates a + * left shift. + *-------------------------------------------------------------------*/ + +void DTFS_phaseShift( + DTFS_STRUCTURE *X, /* i/o: DTFS to shift */ + float ph /* i : phase to shift */ +) +{ + int16_t k; + float tmp, tmp2 = 0.0f; + +#define WMC_TOOL_SKIP + ADD( 1 ); + LOOP( 1 ); + for ( k = 0; k <= min( X->lag >> 1, X->nH ); k++, tmp2 += ph ) + { + MOVE( 1 ); + ADD( 1 ); + tmp = X->a[k]; + MOVE( 1 ); + MAC( 1 ); + X->a[k] = (float) ( tmp * cos( tmp2 ) - X->b[k] * sin( tmp2 ) ); + MOVE( 1 ); + MAC( 1 ); + X->b[k] = (float) ( tmp * sin( tmp2 ) + X->b[k] * cos( tmp2 ) ); + } +#undef WMC_TOOL_SKIP + + return; +} + + +/*-------------------------------------------------------------------* + * DTFS_zeroPadd() + * + * Zero-pad the DTFS coefficients. + *-------------------------------------------------------------------*/ + +void DTFS_zeroPadd( + const int16_t N, /* i : Target lag */ + DTFS_STRUCTURE *X /* i/o: DTFS */ +) +{ + int16_t i; + float diff; + +#define WMC_TOOL_SKIP + LOGIC( 1 ); + if ( N == X->lag ) + { +#undef WMC_TOOL_SKIP + return; +#define WMC_TOOL_SKIP + } + ADD( 1 ); + LOOP( 1 ); + for ( i = ( X->lag >> 1 ) + 1; i <= N >> 1; i++ ) + { + MOVE( 2 ); + X->a[i] = X->b[i] = 0.0; + } + MOVE( 1 ); + X->lag = N; + /* recompute nH for new lag */ + X->nH = (int16_t) floor( X->upper_cut_off_freq / ( 12800.0 / X->lag ) ); + MOVE( 1 ); + MULT( 1 ); + diff = 12800.0f / X->lag; + MULT( 1 ); + ADD( 1 ); + LOGIC( 1 ); + if ( X->upper_cut_off_freq - ( diff * X->nH ) >= diff ) + { + X->nH++; + } +#undef WMC_TOOL_SKIP + + return; +} + + +/*-------------------------------------------------------------------* + * DTFS_to_fs() + * + * DTFS to Fs conversion. + *-------------------------------------------------------------------*/ + +void DTFS_to_fs( + const float *x, /* i : time domain signal */ + const int16_t N, /* i : Length of input vector */ + DTFS_STRUCTURE *X, /* o : DTFS structure with a, b, lag */ + const int32_t sampling_rate, /* i : sampling rate */ + const int16_t FR_flag /* i : FR flag */ +) +{ + int16_t n; + int16_t nH, k, nH_band, nH_4kHz; + float sum, tmp, diff; + + if ( !FR_flag ) + { + if ( sampling_rate == 16000 ) + { + X->upper_cut_off_freq_of_interest = 4000.0; + X->upper_cut_off_freq = 6400.0; + X->sampling_rate = INT_FS_12k8; + } + else if ( sampling_rate == 8000 ) + { + X->upper_cut_off_freq_of_interest = 3300.0; + X->upper_cut_off_freq = 4000.0; + X->sampling_rate = INT_FS_12k8; + } + } + else + { + X->upper_cut_off_freq_of_interest = 8000.0; + X->upper_cut_off_freq = 8000.0; + X->sampling_rate = INT_FS_16k; + } + +#define WMC_TOOL_SKIP + X->lag = N; + MOVE( 1 ); + MULT( 1 ); + nH_band = (int16_t) floor( X->upper_cut_off_freq / ( 12800.0 / X->lag ) ); + + nH_4kHz = (int16_t) floor( 4000 / ( 12800.0 / X->lag ) ); + MOVE( 1 ); + MULT( 1 ); + diff = 12800.0f / X->lag; + MULT( 1 ); + ADD( 1 ); + LOGIC( 1 ); + if ( X->upper_cut_off_freq - ( diff * nH_band ) >= diff ) + { + nH_band++; + } + if ( 4000 - ( diff * nH_4kHz ) >= diff ) + { + nH_4kHz++; + } + /* Number of harmonics excluding the ones at 0 and at pi */ + MOVE( 1 ); + MULT( 1 ); + ADD( 1 ); + nH = ( N - 1 ) >> 1; + /* The DC component */ + X->a[0] = 0.0; + X->b[0] = 0.0; + LOOP( 1 ); + for ( n = 0; n < N; n++ ) + { + ADD( 1 ); + X->a[0] += x[n]; + } + MULT( 1 ); + X->a[0] /= N; + + /* Strictly set the DC componet to zero */ + MOVE( 1 ); + X->a[0] = 0.0; + + /* The harmonics excluding the one at pi */ + LOOP( 1 ); + for ( k = 1; k <= nH; k++ ) + { + X->a[k] = x[0]; + X->b[k] = 0.0; + MOVE( 2 ); + MULT( 1 ); + sum = tmp = (float) ( PI2 * k / N ); + LOOP( 1 ); + for ( n = 1; n < N; n++, sum += tmp ) + { + ADD( 1 ); + X->a[k] += (float) ( x[n] * cos( sum ) ); + ADD( 1 ); + X->b[k] += (float) ( x[n] * sin( sum ) ); + } + MULT( 2 ); + X->a[k] *= ( 2.0f / N ); + MULT( 2 ); + X->b[k] *= ( 2.0f / N ); + } + + /* The harmonic at 'pi' */ + LOGIC( 1 ); + if ( N % 2 == 0 ) + { + MOVE( 1 ); + X->a[k] = 0.0; + MOVE( 1 ); + tmp = 1.0; + LOOP( 1 ); + for ( n = 0; n < N; n++, tmp *= -1.0 ) + { + ADD( 1 ); + X->a[k] += x[n] * tmp; + } + MULT( 1 ); + X->a[k] /= N; + MOVE( 1 ); + X->b[k] = 0.0; + } + ADD( 1 ); + LOOP( 1 ); + for ( k = nH_band + 1; k <= min( ( X->lag >> 1 ), ( MAXLAG_WI - 1 ) ); k++ ) + { + MOVE( 1 ); + X->a[k] = 0.0; + MOVE( 1 ); + X->b[k] = 0.0; + } + X->nH = nH_band; + X->nH_4kHz = nH_4kHz; +#undef WMC_TOOL_SKIP + + return; +} + + +/*-------------------------------------------------------------------* + * DTFS_fs_inv() + * + * DTFS Inverse + *-------------------------------------------------------------------*/ + +void DTFS_fs_inv( + DTFS_STRUCTURE *X, /* i : DTFS input */ + float *x, /* o : time domain sig */ + const int16_t N, /* i : Output length */ + float ph0 /* i : phase shift applied to the output */ +) +{ + float phase, tmp; + int16_t k, n; + +#define WMC_TOOL_SKIP + LOOP( 1 ); + for ( n = 0; n < N; n++ ) + { + MOVE( 1 ); + x[n] = X->a[0]; + MOVE( 2 ); + MAC( 1 ); + tmp = phase = (float) ( PI2 * n / X->lag + ph0 ); + ADD( 1 ); + LOOP( 1 ); + for ( k = 1; k <= min( X->lag >> 1, X->nH ); k++, tmp += phase ) + { + MAC( 1 ); + ADD( 1 ); + x[n] += (float) ( X->a[k] * cos( tmp ) + X->b[k] * sin( tmp ) ); + } + } +#undef WMC_TOOL_SKIP + + return; +} + + +/*-------------------------------------------------------------------* + * DTFS_transform() + * + * DTFS transform. + *-------------------------------------------------------------------*/ + +static void DTFS_transform( + DTFS_STRUCTURE X, /* i : Starting DTFS to use in WI */ + DTFS_STRUCTURE X2, /* i : Ending DTFS to use in WI */ + const float *phase, /* i : Phase contour */ + float *out, /* o : Output time domain waveform */ + int16_t N, /* i : Number of samples to generate */ + const int16_t FR_flag /* i : Flag to indicate called in FR context */ +) +{ + int16_t i, j, j1; + float w, tmp; + float x1_256[256], x2_256[256]; + float sum1, sum2; + int16_t m, l1, k; + int16_t N1; + float nrg_flag = 0; + float x_r_fx[L_FRAME]; + float temp_w; + ivas_error error; + + DTFS_STRUCTURE *tmp1_dtfs; + DTFS_STRUCTURE *tmp2_dtfs; + DTFS_STRUCTURE *tmp3_dtfs; + + error = IVAS_ERR_OK; + + if ( ( error = DTFS_new( &tmp1_dtfs ) ) != IVAS_ERR_OK ) + { + IVAS_ERROR( error, "Error creating DTFS structure 1" ); + } + if ( ( error = DTFS_new( &tmp2_dtfs ) ) != IVAS_ERR_OK ) + { + IVAS_ERROR( error, "Error creating DTFS structure 2" ); + } + if ( ( error = DTFS_new( &tmp3_dtfs ) ) != IVAS_ERR_OK ) + { + IVAS_ERROR( error, "Error creating DTFS structure 3" ); + } + +#define WMC_TOOL_SKIP + FUNC( 2 ); + DTFS_copy( tmp1_dtfs, X ); + FUNC( 2 ); + DTFS_copy( tmp2_dtfs, X2 ); + FUNC( 3 ); + DTFS_fast_fs_inv( tmp1_dtfs, x1_256, 256 ); + FUNC( 3 ); + DTFS_fast_fs_inv( tmp2_dtfs, x2_256, 256 ); + MOVE( 1 ); + MAC( 1 ); + ADD( 1 ); + LOG( 1 ); + tmp = (float) ( log( 1.0 - WI_THRESHLD ) / ( X.lag - N ) ); + LOOP( 1 ); + for ( i = 0; i < N; i++ ) + { + if ( FR_flag == 0 ) + { + /* should not be counted inside the loop */ + if ( N - WI_SAMPLE_THLD > X.lag ) + { + /* pre-computed and stored in a table */ + MOVE( 1 ); + w = (float) ( 1.0 - exp( -( i + 1 ) * tmp ) ); + } + else + { + /* can be a look-up table */ + MOVE( 1 ); + w = (float) ( i + 1 ) / N; + } + } + else + { + if ( nrg_flag ) + { + w = (float) ( i + 1 ) / N; + } + else + { + if ( N <= tmp2_dtfs->lag ) + { + N = tmp2_dtfs->lag + 1; + } + + N1 = N - tmp2_dtfs->lag; + if ( i < N1 ) + { + w = (float) ( i + 1 ) / N1; + } + else + w = 1.0; + } + } + + /* add sinc interpolation of two time domain waveforms at + appropriate phase position */ + MULT( 1 ); + DIV( 1 ); + FUNC( 1 ); + ADD( 1 ); + j = ( LL_OS * 10 + (int) rint_new( phase[i] * LL_OS / PI2 ) ) % LL_OS; + + if ( j < 0 ) + { + j = 0; + } + + MOVE( 1 ); + DIV( 1 ); + k = j % WARP_OS_RATE; + MOVE( 1 ); + MULT( 1 ); + l1 = j / WARP_OS_RATE; + MOVE( 2 ); + + set_f( x_r_fx, 0.0f, L_FRAME ); + + temp_w = ( 1 - w ); + + for ( j1 = 0; j1 < 12; j1++ ) + { + m = ( 1000 * LL + l1 - OSLENGTH / 2 + j1 ) % LL; + + if ( m < 0 ) + { + m = 0; + } + + x_r_fx[m] = x1_256[m] * temp_w + x2_256[m] * w; + } + + LOOP( 1 ); + for ( j1 = 0, sum1 = sum2 = 0.0; j1 < OSLENGTH; j1++ ) + { + /* mult or div by constants should be done once outside the loop */ + DIV( 1 ); + ADD( 1 ); + m = ( 1000 * LL + l1 - OSLENGTH / 2 + j1 ) % LL; + + if ( m < 0 ) + { + m = 0; + } + + sum1 += x_r_fx[m] * sinc[k][j1]; + } + + out[i] = sum1; + } +#undef WMC_TOOL_SKIP + + free( tmp1_dtfs ); + free( tmp2_dtfs ); + free( tmp3_dtfs ); + + return; +} + + +/*-------------------------------------------------------------------* + * DTFS_zeroFilter() + * + * DTFS zero filter response. + *-------------------------------------------------------------------*/ + +void DTFS_zeroFilter( + DTFS_STRUCTURE *X, /* i/o: DTFS to zeroFilter inplace */ + const float *LPC, /* i : LPCs */ + const int16_t N /* i : LPC order */ +) +{ + float tmp, tmp1, tmp2, sum1, sum2; + int16_t k, n; + +#define WMC_TOOL_SKIP + MOVE( 1 ); + MULT( 1 ); + tmp1 = (float) ( PI2 / X->lag ); + LOOP( 1 ); + for ( k = 0; k <= min( X->lag >> 1, X->nH ); k++ ) + { + MOVE( 2 ); + MULT( 1 ); + tmp = tmp2 = k * tmp1; + /* Calculate sum1 and sum2 */ + MOVE( 1 ); + sum1 = 1.0; + MOVE( 1 ); + sum2 = 0.0; + ADD( 1 ); + LOOP( 1 ); + for ( n = 0; n < N; n++, tmp2 += tmp ) + { + MULT( 1 ); + ADD( 2 ); + sum1 += (float) ( LPC[n] * cos( tmp2 ) ); + MULT( 1 ); + ADD( 1 ); + sum2 += (float) ( LPC[n] * sin( tmp2 ) ); + } + /* Calculate the circular convolution */ + MOVE( 1 ); + tmp = X->a[k]; + MOVE( 1 ); + MAC( 1 ); + X->a[k] = tmp * sum1 - X->b[k] * sum2; + MOVE( 1 ); + MAC( 1 ); + X->b[k] = X->b[k] * sum1 + tmp * sum2; + } +#undef WMC_TOOL_SKIP + + return; +} + + +/*-------------------------------------------------------------------* + * DTFS_poleFilter() + * + * DTFS pole filter response. + *-------------------------------------------------------------------*/ + +void DTFS_poleFilter( + DTFS_STRUCTURE *X, /* i/o: DTFS to poleFilter inplace */ + const float *LPC, /* i : LPCs */ + const int16_t N /* i : LPC order */ +) +{ + float tmp, tmp1, tmp2, sum1, sum2; + int16_t k, n; + +#define WMC_TOOL_SKIP + MOVE( 1 ); + MULT( 1 ); + tmp1 = (float) ( PI2 / X->lag ); + LOOP( 1 ); + for ( k = 0; k <= min( X->lag >> 1, X->nH ); k++ ) + { + MOVE( 2 ); + MULT( 1 ); + tmp = tmp2 = k * tmp1; + /* Calculate sum1 and sum2 */ + MOVE( 1 ); + sum1 = 1.0; + MOVE( 1 ); + sum2 = 0.0; + ADD( 1 ); + LOOP( 1 ); + for ( n = 0; n < N; n++, tmp2 += tmp ) + { + MULT( 1 ); + ADD( 2 ); + sum1 += (float) ( LPC[n] * cos( tmp2 ) ); + MULT( 1 ); + ADD( 1 ); + sum2 += (float) ( LPC[n] * sin( tmp2 ) ); + } + /* Calculate the circular convolution */ + MOVE( 1 ); + tmp = X->a[k]; + MAC( 1 ); + tmp2 = sum1 * sum1 + sum2 * sum2; + MAC( 1 ); + DIV( 1 ); + X->a[k] = ( tmp * sum1 + X->b[k] * sum2 ) / tmp2; + MAC( 1 ); + ADD( 1 ); + X->b[k] = ( -tmp * sum2 + X->b[k] * sum1 ) / tmp2; + } +#undef WMC_TOOL_SKIP + + return; +} + + +/*-------------------------------------------------------------------* + * DTFS_setEngy() + * + * Set DTFS energy. + *-------------------------------------------------------------------*/ + +static float DTFS_setEngy( + DTFS_STRUCTURE *X_DTFS, /* i/o: DTFS structure to set engy */ + float en2 /* i : Energy to set to */ +) +{ + int16_t k; + float en1, tmp; + +#define WMC_TOOL_SKIP + FUNC( 1 ); + MOVE( 1 ); + en1 = DTFS_getEngy( *X_DTFS ); + LOGIC( 1 ); + if ( en1 == 0.0 ) + { +#undef WMC_TOOL_SKIP + return 0.0; +#define WMC_TOOL_SKIP + } + MOVE( 1 ); + DIV( 1 ); + SQRT( 1 ); + tmp = (float) sqrt( en2 / en1 ); + LOOP( 1 ); + for ( k = 0; k <= min( X_DTFS->lag >> 1, X_DTFS->nH ); k++ ) + { + MULT( 1 ); + X_DTFS->a[k] *= tmp; + MULT( 1 ); + X_DTFS->b[k] *= tmp; + } +#undef WMC_TOOL_SKIP + + return en1; +} + + +/*-------------------------------------------------------------------* + * DTFS_adjustLag() + * + * Adjust DTFS lag based on a target lag. + *-------------------------------------------------------------------*/ + +void DTFS_adjustLag( + DTFS_STRUCTURE *X_DTFS, /* i/o: DTFS to adjust lag for */ + const int16_t N /* i : Target lag */ +) +{ + int16_t k; + float en, diff; + +#define WMC_TOOL_SKIP + LOGIC( 1 ); + if ( N == X_DTFS->lag ) + { +#undef WMC_TOOL_SKIP + return; +#define WMC_TOOL_SKIP + } + + LOGIC( 1 ); + if ( N > X_DTFS->lag ) + { + + FUNC( 2 ); + DTFS_zeroPadd( N, X_DTFS ); + } + else + { + FUNC( 1 ); + MOVE( 1 ); + en = DTFS_getEngy( *X_DTFS ); + ADD( 1 ); + LOOP( 1 ); + for ( k = ( N >> 1 ) + 1; k <= min( X_DTFS->lag >> 1, X_DTFS->nH ); k++ ) + { + MOVE( 1 ); + X_DTFS->a[k] = 0.0; + MOVE( 1 ); + X_DTFS->b[k] = 0.0; + } + FUNC( 2 ); + DTFS_setEngy( X_DTFS, en ); + MOVE( 1 ); + X_DTFS->lag = N; + /* recompute nH for new lag */ + X_DTFS->nH = (int16_t) floor( X_DTFS->upper_cut_off_freq / ( 12800.0 / X_DTFS->lag ) ); + + X_DTFS->nH_4kHz = (int16_t) floor( 4000.0 / ( 12800.0 / X_DTFS->lag ) ); + MOVE( 1 ); + MULT( 1 ); + diff = 12800.0f / X_DTFS->lag; + MULT( 1 ); + ADD( 1 ); + LOGIC( 1 ); + if ( X_DTFS->upper_cut_off_freq - ( diff * X_DTFS->nH ) >= diff ) + { + X_DTFS->nH++; + } + if ( 4000.0 - ( diff * X_DTFS->nH_4kHz ) >= diff ) + { + X_DTFS->nH_4kHz++; + } + } +#undef WMC_TOOL_SKIP + + return; +} + + +/*-------------------------------------------------------------------* + * DTFS_getEngy() + * + * Get DTFS energy. + *-------------------------------------------------------------------*/ + +float DTFS_getEngy( + DTFS_STRUCTURE X /* i : DTFS to compute energy of */ +) +{ + int16_t k; + float en; + + en = 0.0f; +#define WMC_TOOL_SKIP + LOOP( 1 ); + for ( k = 1; k <= min( ( X.lag - 1 ) >> 1, X.nH ); k++ ) + { + MAC( 1 ); + ADD( 1 ); + en += X.a[k] * X.a[k] + X.b[k] * X.b[k]; + } + MULT( 1 ); + en /= 2.0; + MULT( 1 ); + ADD( 1 ); + en += X.a[0] * X.a[0]; + LOGIC( 1 ); + if ( X.lag % 2 == 0 ) + { + MAC( 1 ); + ADD( 1 ); + en += X.a[k] * X.a[k] + X.b[k] * X.b[k]; + } +#undef WMC_TOOL_SKIP + + return en; +} + + +/*-------------------------------------------------------------------* + * DTFS_car2pol() + * + * DTFS cartesian to polar co-ordinates conversion. + *-------------------------------------------------------------------*/ + +void DTFS_car2pol( + DTFS_STRUCTURE *X /* i/o: DTFS structure a, b, lag */ +) +{ + int16_t k; + float tmp; + +#define WMC_TOOL_SKIP + LOOP( 1 ); + for ( k = 1; k <= min( ( X->lag - 1 ) >> 1, X->nH ); k++ ) + { + MOVE( 1 ); + tmp = X->a[k]; + MOVE( 1 ); + FUNC( 2 ); + MULT( 1 ); + X->a[k] = (float) ( 0.5f * sqrt( tmp * tmp + X->b[k] * X->b[k] ) ); + MOVE( 1 ); + X->b[k] = (float) atan2( X->b[k], tmp ); + } + LOGIC( 1 ); + if ( X->lag % 2 == 0 ) + { + MOVE( 1 ); + tmp = X->a[k]; + FUNC( 2 ); + MOVE( 1 ); + X->a[k] = (float) sqrt( tmp * tmp + X->b[k] * X->b[k] ); + MOVE( 1 ); + X->b[k] = (float) atan2( X->b[k], tmp ); + } +#undef WMC_TOOL_SKIP + + return; +} + + +/*-------------------------------------------------------------------* + * DTFS_pol2car() + * + * DTFS polar to cartesian co-ordinates conversion. + *-------------------------------------------------------------------*/ + +void DTFS_pol2car( + DTFS_STRUCTURE *X /* i/o: DTFS structure a, b, lag */ +) +{ + int16_t k; + float tmp; + +#define WMC_TOOL_SKIP + LOOP( 1 ); + for ( k = 1; k <= min( ( X->lag - 1 ) >> 1, X->nH ); k++ ) + { + MOVE( 1 ); + tmp = X->b[k]; + MOVE( 1 ); + MULT( 2 ); + X->b[k] = (float) ( 2.0f * X->a[k] * sin( tmp ) ); + MOVE( 1 ); + MULT( 2 ); + X->a[k] = (float) ( 2.0f * X->a[k] * cos( tmp ) ); + } + LOGIC( 1 ); + if ( X->lag % 2 == 0 ) + { + MOVE( 1 ); + tmp = X->b[k]; + MOVE( 1 ); + MULT( 1 ); + X->b[k] = (float) ( X->a[k] * sin( tmp ) ); + MOVE( 1 ); + MULT( 1 ); + X->a[k] = (float) ( X->a[k] * cos( tmp ) ); + } +#undef WMC_TOOL_SKIP + + return; +} + + +/*-------------------------------------------------------------------* + * DTFS_setEngyHarm() + * + * Adjust DTFS energy based on the input target energy. + *-------------------------------------------------------------------*/ + +/*! r: Input RMS between f1 and f2 before scaling */ +float DTFS_setEngyHarm( + float f1, /* i : lower band freq of input to control energy */ + float f2, /* i : upper band freq of input to control energy */ + float g1, /* i : lower band freq of output to control energy */ + float g2, /* i : upper band freq of output to control energy */ + float en2, /* i : Target Energy to set the DTFS to */ + DTFS_STRUCTURE *X /* i/o: DTFS to adjust the energy of */ +) +{ + int16_t k, count; + float en1, tmp, factor, diff; + + diff = (float) INT_FS_12k8 / X->lag; + + en1 = 0.0f; + count = 0; + +#define WMC_TOOL_SKIP + LOGIC( 1 ); + if ( f1 == 0.0 ) + { + MULT( 1 ); + ADD( 1 ); + en1 += X->a[0] * X->a[0]; + count++; + } + MOVE( 1 ); + ADD( 1 ); + ADD( 1 ); + LOOP( 1 ); + for ( k = 1, tmp = diff; k <= min( ( X->lag - 1 ) >> 1, X->nH ); k++, tmp += diff ) + { + if ( X->a[k] < EPSILON ) + { + X->a[k] = 0; + } + + LOGIC( 1 ); + if ( tmp > f1 && tmp <= f2 ) + { + MULT( 1 ); + ADD( 1 ); + en1 += X->a[k] * X->a[k]; + count++; + } + } + + if ( count <= 0.0 ) + { + count = 1; + } + + + DIV( 1 ); + en1 /= count; + + if ( en2 < 0.0 ) + { + en2 = 0.0; + } + + LOGIC( 1 ); + if ( en1 > 0.0 ) + { + MOVE( 1 ); + DIV( 1 ); + SQRT( 1 ); + factor = (float) sqrt( en2 / en1 ); + } + else + { + MOVE( 1 ); + factor = 0.0f; + } + LOGIC( 1 ); + if ( g1 == 0.0 ) + { + MULT( 1 ); + X->a[k] *= factor; + } + MOVE( 1 ); + ADD( 1 ); + ADD( 1 ); + LOOP( 1 ); + for ( k = 1, tmp = diff; k <= min( ( X->lag - 1 ) >> 1, X->nH ); k++, tmp += diff ) + { + ADD( 1 ); + ADD( 1 ); + LOGIC( 1 ); + if ( tmp > g1 && tmp <= g2 ) + { + MULT( 1 ); + X->a[k] *= factor; + } + } +#undef WMC_TOOL_SKIP + + return (float) ( en1 + 1e-20 ); +} + + +/*-------------------------------------------------------------------* + * cubicPhase() + * + * Compute coefficients of cubic phase function + *-------------------------------------------------------------------*/ + +static void cubicPhase( + float ph1, /* i : phase offset */ + float ph2, /* i : phase 2 */ + const float L1, /* i : previous lag */ + const float L2, /* i : current lag */ + int16_t N, /* i : input length */ + float *phOut /* o : cubic phase output */ +) +{ + float coef[4], f1, f2, c1, c2, factor; + int16_t n; + double diff; + +#define WMC_TOOL_SKIP + ADD( 1 ); + N -= (int16_t) L2; + + if ( N <= 0 ) + { + N = 1; + } + + /* Computation of the coefficients of the cubic phase function */ + MOVE( 1 ); + DIV( 1 ); + f1 = (float) ( PI2 / L1 ); + MOVE( 1 ); + DIV( 1 ); + f2 = (float) ( PI2 / L2 ); + MOVE( 1 ); + DIV( 1 ); + ph1 = (float) fmod( (double) ( ph1 ), PI2 ); + MOVE( 1 ); + DIV( 1 ); + ph2 = (float) fmod( (double) ( ph2 ), PI2 ); + MOVE( 1 ); + coef[3] = ph1; + MOVE( 1 ); + coef[2] = f1; + MOVE( 1 ); + MAC( 1 ); + ADD( 1 ); + FUNC( 1 ); + ADD( 1 ); + factor = (float) ( anint( ( ph1 - ph2 + 0.5 * N * ( f2 + f1 ) ) / PI2 ) ); + MOVE( 1 ); + ADD( 1 ); + c1 = f2 - f1; + MOVE( 1 ); + MAC( 1 ); + ADD( 2 ); + c2 = (float) ( ph2 - ph1 - N * f1 + PI2 * factor ); + MOVE( 1 ); + MAC( 1 ); + DIV( 1 ); + coef[0] = ( N * c1 - 2 * c2 ) / ( N * N * N ); + MOVE( 1 ); + MULT( 4 ); + DIV( 1 ); + ADD( 1 ); + coef[1] = ( c1 - 3 * N * N * coef[0] ) / ( 2 * N ); + /* Computation of the phase value at each sample point */ + MOVE( 1 ); + phOut[0] = ph1; + LOOP( 1 ); + for ( n = 1; n < N; n++ ) + { + MOVE( 1 ); + phOut[n] = _POLY3( n, coef ); + } + MOVE( 1 ); + MULT( 1 ); + diff = (float) ( PI2 / L2 ); + ADD( 1 ); + LOOP( 1 ); + for ( ; n < N + (int) L2; n++ ) + { + MOVE( 1 ); + ADD( 2 ); + phOut[n] = (float) ( phOut[n - 1] + diff ); + } +#undef WMC_TOOL_SKIP + + return; +} + + +/*-------------------------------------------------------------------* + * DTFS_to_erb() + * + * DTFS to ERB conversion + *-------------------------------------------------------------------*/ + +void DTFS_to_erb( + DTFS_STRUCTURE X, /* i : DTFS input */ + float *out /* o : ERB output */ +) +{ + int16_t num_erb; + uint16_t i, j, count[NUM_ERB_WB]; + float freq, diff; + + const float *erb = NULL; + num_erb = NUM_ERB_NB; + if ( X.upper_cut_off_freq == 4000.0 ) + { + num_erb = NUM_ERB_NB; + erb = &( erb_NB[0] ); + } + else if ( X.upper_cut_off_freq == 6400.0 ) + { + num_erb = NUM_ERB_WB; + erb = &( erb_WB[0] ); + } + +#define WMC_TOOL_SKIP + LOOP( 1 ); + for ( i = 0; i < num_erb; i++ ) + { + MOVE( 1 ); + count[i] = 0; + MOVE( 1 ); + out[i] = 0.0; + } + MOVE( 1 ); + MULT( 1 ); + diff = 12800.0f / X.lag; + MOVE( 2 ); + ADD( 1 ); + LOOP( 1 ); + for ( i = j = 0, freq = 0.0; i <= min( X.lag >> 1, X.nH ); i++, freq += diff ) + { + if ( !( freq <= erb[num_erb] ) ) + { + freq = erb[num_erb]; + } + + LOOP( 1 ); + for ( ; j < num_erb; j++ ) + { + LOGIC( 1 ); + if ( freq < erb[j + 1] ) + { + if ( X.a[i] < 0.0f ) + { + X.a[i] = 0.0f; + } + + ADD( 1 ); + out[j] += X.a[i]; + count[j]++; + break; + } + } + } + LOOP( 1 ); + for ( i = 0; i < num_erb; i++ ) + { + LOGIC( 1 ); + if ( count[i] > 1 ) + { + DIV( 1 ); + out[i] /= count[i]; + } + } +#undef WMC_TOOL_SKIP + + return; +} + + +/*-------------------------------------------------------------------* + * erb_slot() + * + * Estimation of ERB slots. + *-------------------------------------------------------------------*/ + +void erb_slot( + int16_t lag, /* i : input lag */ + int16_t *out, /* o : ERB slots */ + float *mfreq, /* i : ERB frequencies */ + int16_t num_erb /* i : number of ERBs */ +) +{ + uint16_t i, j; + float freq, diff; + int16_t upper_cut_off_freq; + const float *erb = NULL; + int16_t nH_band; + + upper_cut_off_freq = 4000; + if ( num_erb == NUM_ERB_NB ) + { + upper_cut_off_freq = 4000; + erb = &( erb_NB[0] ); + } + else if ( num_erb == NUM_ERB_WB ) + { + upper_cut_off_freq = 6400; + erb = &( erb_WB[0] ); + } + +#define WMC_TOOL_SKIP + MOVE( 1 ); + MULT( 1 ); + nH_band = (int16_t) floor( upper_cut_off_freq / ( 12800.0 / lag ) ); + + LOOP( 1 ); + for ( i = 0; i < num_erb; i++ ) + { + MOVE( 1 ); + out[i] = 0; + MOVE( 1 ); + mfreq[i] = 0.0; + } + MOVE( 1 ); + MULT( 1 ); + diff = 12800.0f / lag; + MULT( 1 ); + ADD( 1 ); + LOGIC( 1 ); + if ( upper_cut_off_freq - ( diff * nH_band ) >= diff ) + { + nH_band++; + } + MOVE( 2 ); + ADD( 1 ); + LOOP( 1 ); + for ( i = j = 0, freq = 0.0; i <= min( lag >> 1, nH_band ); i++, freq += diff ) + { + + if ( !( freq <= erb[num_erb] ) ) + { + freq = erb[num_erb]; + } + + MOVE( 1 ); + freq = min( freq, upper_cut_off_freq ); + + LOOP( 1 ); + for ( ; j < num_erb; j++ ) + { + LOGIC( 1 ); + if ( freq < erb[j + 1] ) + { + ADD( 1 ); + mfreq[j] += freq; + out[j]++; + break; + } + } + } + LOOP( 1 ); + for ( j = 0; j < num_erb; j++ ) + { + LOGIC( 1 ); + if ( out[j] > 1 ) + { + DIV( 1 ); + mfreq[j] /= out[j]; + } + } +#undef WMC_TOOL_SKIP + + return; +} + + +/*-------------------------------------------------------------------* + * DTFS_erb_inv() + * + * .DTFS after ERB inverse + *-------------------------------------------------------------------*/ + +void DTFS_erb_inv( + float *in, /* i : ERB inpt */ + int16_t *slot, /* i : ERB slots filled based on lag */ + float *mfreq, /* i : erb frequence edges */ + DTFS_STRUCTURE *X, /* o : DTFS after erb-inv */ + const int16_t num_erb /* i : Number of ERB bands */ +) +{ + int16_t i, j, m = 0; + float diff; + float freq, f[NUM_ERB_WB + 2], amp[NUM_ERB_WB + 2]; + int16_t upper_cut_off_freq = 0; + + const float *erb = NULL; + + if ( num_erb == NUM_ERB_NB ) + { + upper_cut_off_freq = 4000; + erb = &( erb_NB[0] ); + } + else if ( num_erb == NUM_ERB_WB ) + { + upper_cut_off_freq = 6400; + erb = &( erb_WB[0] ); + } + +#define WMC_TOOL_SKIP + MOVE( 1 ); + f[m] = 0.0; + MOVE( 1 ); + amp[m] = 0.0; + m++; + LOOP( 1 ); + for ( i = 0; i < num_erb; i++ ) + { + LOGIC( 1 ); + if ( slot[i] != 0 ) + { + MOVE( 1 ); + f[m] = mfreq[i]; + MOVE( 1 ); + amp[m] = in[i]; + m++; + } + } + MOVE( 1 ); + f[m] = upper_cut_off_freq; + MOVE( 1 ); + amp[m] = 0.0; + m++; + + MOVE( 1 ); + MULT( 1 ); + diff = 12800.0f / X->lag; + + MOVE( 2 ); + ADD( 1 ); + LOOP( 1 ); + for ( i = 0, j = 1, freq = 0.0; i <= min( X->lag >> 1, X->nH ); i++, freq += diff ) + { + if ( !( freq <= erb[num_erb] ) ) + { + freq = erb[num_erb]; + } + + if ( !( m <= num_erb + 2 ) ) + { + m = num_erb + 2; + } + + LOGIC( 1 ); + if ( freq > upper_cut_off_freq ) + { + MOVE( 1 ); + freq = upper_cut_off_freq; + } + LOOP( 1 ); + for ( ; j < m; j++ ) + { + LOGIC( 1 ); + if ( freq <= f[j] ) + { + MOVE( 1 ); + MAC( 2 ); + ADD( 1 ); + X->a[i] = amp[j] * ( freq - f[j - 1] ) + amp[j - 1] * ( f[j] - freq ); + LOGIC( 1 ); + if ( f[j] != f[j - 1] ) + { + DIV( 1 ); + ADD( 1 ); + X->a[i] /= ( f[j] - f[j - 1] ); + } + break; + } + } + + X->a[0] = 0.0f; + } +#undef WMC_TOOL_SKIP + + return; +} + + +/*-------------------------------------------------------------------* + * LPCPowSpect() + * + * LPC power spectrum + *-------------------------------------------------------------------*/ + +static void LPCPowSpect( + const float *freq, /* i : ERB frequencies */ + const int16_t Nf, /* i : Number of ERBs */ + const float *LPC, /* i : LPC coefficients */ + const int16_t Np, /* i : Number of LPCs */ + float *out /* o : LPC power spectrum */ +) +{ + float w, tmp, Re, Im; + int16_t i, k; + +#define WMC_TOOL_SKIP + LOOP( 1 ); + for ( k = 0; k < Nf; k++ ) + { + MOVE( 1 ); + Re = 1.0; + MOVE( 1 ); + Im = 0.0; + /* Note that freq ranges between [0 UPPER_CUT_OFF_FREQ] */ + MOVE( 1 ); + MULT( 2 ); + tmp = (float) ( freq[k] / 12800.0f * PI2 ); + MOVE( 1 ); + ADD( 1 ); + LOOP( 1 ); + for ( i = 0, w = tmp; i < Np; i++, w += tmp ) + { + MULT( 1 ); + ADD( 2 ); + Re += (float) ( LPC[i] * cos( w ) ); + MULT( 1 ); + ADD( 1 ); + Im -= (float) ( LPC[i] * sin( w ) ); + } + MOVE( 1 ); + MAC( 1 ); + DIV( 1 ); + out[k] = 1.0f / ( Re * Re + Im * Im ); + } +#undef WMC_TOOL_SKIP + + return; +} + + +/*-------------------------------------------------------------------* + * erb_diff() + * + * ERB difference + *-------------------------------------------------------------------*/ + +void erb_diff( + const float *prev_erb, /* i : previous ERB */ + const int16_t pl, /* i : previous lag */ + const float *curr_erb, /* i : current ERB */ + const int16_t l, /* i : current lag */ + const float *curr_lsp, /* i : current LSP coefficients */ + float *out, /* o : ERB difference */ + int16_t *index, /* i : ERB index */ + const int16_t num_erb /* i : Number of ERBs */ +) +{ + int16_t i, j; + int16_t pslot[NUM_ERB_WB], cslot[NUM_ERB_WB], mmseindex; + float tmp, tmp1, t_prev_erb[NUM_ERB_WB], LPC[M + 1], mfreq[NUM_ERB_WB], PowSpect[NUM_ERB_WB], mmse; + const float( *AmpCB1 )[10] = 0; + + if ( num_erb == NUM_ERB_NB ) + { + AmpCB1 = AmpCB1_NB; + } + else if ( num_erb == NUM_ERB_WB ) + { + AmpCB1 = AmpCB1_WB; + } + +#define WMC_TOOL_SKIP + FUNC( 3 ); + erb_slot( l, cslot, mfreq, num_erb ); + FUNC( 3 ); + erb_slot( pl, pslot, t_prev_erb, num_erb ); + MOVE( 1 ); + ADD( 1 ); + LOOP( 1 ); + for ( i = 0, tmp = 1.0f; i < M + 1; i++ ) + { + MOVE( 1 ); + MULT( 2 ); + ADD( 1 ); + LPC[i] = curr_lsp[i] * ( tmp *= 0.78f ); + } + FUNC( 5 ); + ADD( 1 ); + LPCPowSpect( mfreq, num_erb, LPC, M + 1, PowSpect ); + + LOOP( 1 ); + for ( i = 0; i < num_erb; i++ ) + { + MOVE( 1 ); + t_prev_erb[i] = prev_erb[i]; + } + + LOGIC( 1 ); + if ( pl > l ) + { + MOVE( 1 ); + tmp = t_prev_erb[0]; + LOOP( 1 ); + for ( i = 0; i < num_erb; i++ ) + { + if ( pslot[i] < 0 ) + { + pslot[i] = 0; + } + + LOGIC( 1 ); + if ( pslot[i] != 0 ) + { + MOVE( 1 ); + tmp = t_prev_erb[i]; + } + else + { + MOVE( 1 ); + t_prev_erb[i] = tmp; + } + } + } + else if ( l > pl ) + { + MOVE( 1 ); + tmp = t_prev_erb[num_erb - 1]; + ADD( 1 ); + LOOP( 1 ); + for ( i = num_erb - 1; i >= 0; i-- ) + { + LOGIC( 1 ); + if ( pslot[i] != 0 ) + { + MOVE( 1 ); + tmp = t_prev_erb[i]; + } + else + { + MOVE( 1 ); + t_prev_erb[i] = tmp; + } + } + } + + LOOP( 1 ); + for ( i = 0; i < num_erb; i++ ) + { + MOVE( 1 ); + ADD( 1 ); + out[i] = curr_erb[i] - t_prev_erb[i]; + } + + /* First Band Amplitude Search */ + MOVE( 1 ); + mmse = (float) HUGE_VAL; + MOVE( 1 ); + mmseindex = -1; + LOOP( 1 ); + for ( j = 0; j < ERB_CBSIZE1; j++ ) + { + MOVE( 1 ); + tmp = 0.0; + LOOP( 1 ); + for ( i = 1; i < 11; i++ ) + { + LOGIC( 1 ); + if ( cslot[i] != 0 ) + { + ADD( 1 ); + LOGIC( 1 ); + if ( AmpCB1[j][i - 1] < -t_prev_erb[i] ) + { + MOVE( 1 ); + MULT( 1 ); + MULT( 1 ); + tmp1 = PowSpect[i] * SQR( curr_erb[i] ); + } + else + { + MOVE( 1 ); + MAC( 1 ); + MULT( 1 ); + tmp1 = (float) ( PowSpect[i] * SQR( out[i] - AmpCB1[j][i - 1] ) ); + } + LOGIC( 1 ); + if ( AmpCB1[j][i - 1] < out[i] ) + { + MULT( 1 ); + tmp1 *= 0.9f; + } + ADD( 1 ); + tmp += tmp1; + } + } + + LOGIC( 1 ); + if ( tmp < mmse ) + { + MOVE( 1 ); + mmse = tmp; + MOVE( 1 ); + mmseindex = j; + } + } + + if ( !( mmseindex < ERB_CBSIZE1 && mmseindex >= 0 ) ) + { + mmseindex = 0; + } + + MOVE( 1 ); + index[0] = mmseindex; + + /* Second Band Amplitude Search */ + MOVE( 1 ); + mmse = (float) HUGE_VAL; + MOVE( 1 ); + mmseindex = -1; + LOOP( 1 ); + for ( j = 0; j < ERB_CBSIZE2; j++ ) + { + MOVE( 1 ); + tmp = 0.0; + for ( i = 11; i < num_erb; i++ ) + { + if ( num_erb == NUM_ERB_NB ) + { + LOGIC( 1 ); + if ( cslot[i] != 0 ) + { + ADD( 1 ); + LOGIC( 1 ); + if ( AmpCB2_NB[j][i - 11] < -t_prev_erb[i] ) + { + MOVE( 1 ); + MULT( 1 ); + MULT( 1 ); + tmp1 = PowSpect[i] * SQR( curr_erb[i] ); + } + else + { + MOVE( 1 ); + MAC( 1 ); + MULT( 1 ); + tmp1 = (float) ( PowSpect[i] * SQR( out[i] - AmpCB2_NB[j][i - 11] ) ); + } + + LOGIC( 1 ); + if ( AmpCB2_NB[j][i - 11] < out[i] ) + { + MULT( 1 ); + tmp1 *= 0.9f; + } + ADD( 1 ); + tmp += tmp1; + } + } + else if ( num_erb == NUM_ERB_WB ) + { + if ( cslot[i] != 0 ) + { + ADD( 1 ); + LOGIC( 1 ); + if ( AmpCB2_WB[j][i - 11] < -t_prev_erb[i] ) + { + MOVE( 1 ); + MULT( 1 ); + MULT( 1 ); + tmp1 = PowSpect[i] * SQR( curr_erb[i] ); + } + else + { + MOVE( 1 ); + MAC( 1 ); + MULT( 1 ); + tmp1 = (float) ( PowSpect[i] * SQR( out[i] - AmpCB2_WB[j][i - 11] ) ); + } + + LOGIC( 1 ); + if ( AmpCB2_WB[j][i - 11] < out[i] ) + { + MULT( 1 ); + tmp1 *= 0.9f; + } + ADD( 1 ); + tmp += tmp1; + } + } + } + + LOGIC( 1 ); + if ( tmp < mmse ) + { + MOVE( 1 ); + mmse = tmp; + MOVE( 1 ); + mmseindex = j; + } + } + + if ( !( mmseindex < ERB_CBSIZE2 && mmseindex >= 0 ) ) + { + mmseindex = 0; + } + + MOVE( 1 ); + index[1] = mmseindex; +#undef WMC_TOOL_SKIP + + return; +} + +/*-------------------------------------------------------------------* + * erb_add() + * + * Add current and past ERB + *-------------------------------------------------------------------*/ + +void erb_add( + float *curr_erb, /* i/o: current ERB */ + const int16_t l, /* i : current lag */ + const float *prev_erb, /* i : previous ERB */ + const int16_t pl, /* i : previous lag */ + const int16_t *index, /* i : ERB index */ + const int16_t num_erb /* i : number of ERBs */ +) +{ + int16_t i, pslot[NUM_ERB_WB], cslot[NUM_ERB_WB]; + float tmp, t_prev_erb[NUM_ERB_WB]; + const float( *AmpCB1 )[10] = 0; + + if ( num_erb == NUM_ERB_NB ) + { + AmpCB1 = AmpCB1_NB; + } + else if ( num_erb == NUM_ERB_WB ) + { + AmpCB1 = AmpCB1_WB; + } + +#define WMC_TOOL_SKIP + FUNC( 3 ); + erb_slot( l, cslot, t_prev_erb, num_erb ); + FUNC( 3 ); + erb_slot( pl, pslot, t_prev_erb, num_erb ); + + LOOP( 1 ); + for ( i = 0; i < num_erb; i++ ) + { + MOVE( 1 ); + t_prev_erb[i] = prev_erb[i]; + } + + LOGIC( 1 ); + if ( pl > l ) + { + MOVE( 1 ); + tmp = t_prev_erb[0]; + LOOP( 1 ); + for ( i = 0; i < num_erb; i++ ) + { + if ( !( pslot[i] >= 0 ) ) + { + pslot[i] = 0; + } + + LOGIC( 1 ); + if ( pslot[i] != 0 ) + { + MOVE( 1 ); + tmp = t_prev_erb[i]; + } + else + { + MOVE( 1 ); + t_prev_erb[i] = tmp; + } + } + } + else if ( l > pl ) + { + MOVE( 1 ); + tmp = t_prev_erb[num_erb - 1]; + ADD( 1 ); + LOOP( 1 ); + for ( i = num_erb - 1; i >= 0; i-- ) + { + LOGIC( 1 ); + if ( pslot[i] != 0 ) + { + MOVE( 1 ); + tmp = t_prev_erb[i]; + } + else + { + MOVE( 1 ); + t_prev_erb[i] = tmp; + } + } + } + + LOOP( 1 ); + for ( i = 1; i < 11; i++ ) + { + LOGIC( 1 ); + if ( cslot[i] != 0 ) + { + MOVE( 1 ); + ADD( 1 ); + curr_erb[i] = (float) ( AmpCB1[index[0]][i - 1] + t_prev_erb[i] ); + MOVE( 1 ); + curr_erb[i] = max( 0.0f, curr_erb[i] ); + } + else + { + MOVE( 1 ); + curr_erb[i] = 0.0; + } + } + LOOP( 1 ); + for ( i = 11; i < ( num_erb - 2 ); i++ ) + { + LOGIC( 1 ); + if ( cslot[i] != 0 ) + { + MOVE( 1 ); + if ( num_erb == NUM_ERB_NB ) + { + ADD( 1 ); + curr_erb[i] = (float) ( AmpCB2_NB[index[1]][i - 11] + t_prev_erb[i] ); + MOVE( 1 ); + curr_erb[i] = max( 0.0f, curr_erb[i] ); + } + else if ( num_erb == NUM_ERB_WB ) + { + ADD( 1 ); + curr_erb[i] = (float) ( AmpCB2_WB[index[1]][i - 11] + t_prev_erb[i] ); + MOVE( 1 ); + curr_erb[i] = max( 0.0f, curr_erb[i] ); + } + } + else + { + MOVE( 1 ); + curr_erb[i] = 0.0f; + } + } +#undef WMC_TOOL_SKIP + + return; +} + + +/*-------------------------------------------------------------------* + * WIsyn() + * + * Synthesis using waveform interpolation + *-------------------------------------------------------------------*/ + +ivas_error WIsyn( + DTFS_STRUCTURE PREVCW, /* i : Prev frame DTFS */ + DTFS_STRUCTURE *CURRCW_DTFS_out, /* i/o: Curr frame DTFS */ + const float *curr_lpc, /* i : LPC */ + float *ph_offset, /* i/o: Phase offset to line up at end of frame */ + float *out, /* o : Waveform Interpolated time domain signal */ + const int16_t N, /* i : Number of output samples to generate */ + const int16_t FR_flag /* i : called for post-smoothing in FR */ +) +{ + DTFS_STRUCTURE *CURRCW_DTFS; + uint16_t I = 1, flag = 0; + float alignment, tmp, *phase; + ivas_error error; + + error = IVAS_ERR_OK; + + if ( ( phase = (float *) malloc( N * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for WI structure\n" ) ); + } + + if ( ( error = DTFS_new( &CURRCW_DTFS ) ) != IVAS_ERR_OK ) + { + return IVAS_ERROR( error, "Error creating new DTFS structure\n" ); + } + +#define WMC_TOOL_SKIP + FUNC( 2 ); + DTFS_copy( CURRCW_DTFS, *CURRCW_DTFS_out ); + + /* Calculating the expected alignment shift */ + MOVE( 1 ); + MULT( 2 ); + INDIRECT( 1 ); + INDIRECT( 1 ); + alignment = (float) ( *ph_offset / PI2 * PREVCW.lag ); + LOGIC( 1 ); + if ( flag == 1 ) + { + MULT( 1 ); + alignment *= I; + } + /* Calculating the expected alignment shift */ + MOVE( 1 ); + DIV( 1 ); + ADD( 2 ); + DIV( 1 ); + tmp = (float) fmod( ( N % ( ( PREVCW.lag + CURRCW_DTFS->lag ) >> 1 ) + alignment ), CURRCW_DTFS->lag ); + + /* Compute the alignment shift */ + if ( FR_flag == 0 ) + { + FUNC( 5 ); + MOVE( 1 ); + alignment = DTFS_alignment_weight( PREVCW, *CURRCW_DTFS, tmp, curr_lpc, curr_lpc ); + } + else /* FR case */ + { + FUNC( 5 ); + MOVE( 1 ); + alignment = DTFS_alignment_full( PREVCW, *CURRCW_DTFS, CURRCW_DTFS->lag * 2 ); + } + + MOVE( 1 ); + MULT( 2 ); + tmp = (float) ( PI2 * alignment / CURRCW_DTFS->lag ); + FUNC( 2 ); + DTFS_phaseShift( CURRCW_DTFS, tmp ); + FUNC( 2 ); + MULT( 2 ); + DTFS_phaseShift( CURRCW_DTFS_out, (float) ( PI2 * alignment / CURRCW_DTFS->lag ) ); + + /* Compute the cubic phase track and transform to 1-D signal */ + FUNC( 6 ); + cubicPhase( *ph_offset, tmp, (float) PREVCW.lag, (float) CURRCW_DTFS->lag, N, phase ); + + if ( FR_flag == 0 ) + { + FUNC( 6 ); + DTFS_transform( PREVCW, *CURRCW_DTFS, phase, out, N, 0 ); + } + else + { + FUNC( 6 ); + DTFS_transform( PREVCW, *CURRCW_DTFS, phase, out, N, 1 ); + } + + /* Adjust the phase offset and wrap it between 0 and 2pi */ + LOGIC( 1 ); + if ( flag == 2 ) + { + MULT( 1 ); + tmp *= I; + } + MOVE( 1 ); + DIV( 1 ); + *ph_offset = (float) fmod( (double) ( tmp ), PI2 ); +#undef WMC_TOOL_SKIP + + free( phase ); + free( CURRCW_DTFS ); + + return error; +} diff --git a/lib_com/window.c b/lib_com/window.c new file mode 100644 index 0000000000000000000000000000000000000000..a54cb7c0771d149e6eb3392a5d4c143f2eaddd30 --- /dev/null +++ b/lib_com/window.c @@ -0,0 +1,77 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include "options.h" +#include "prot.h" + +#define WMC_TOOL_SKIP + +/*------------------------------------------------------------------- + * ham_cos_window() + * + * + *-------------------------------------------------------------------*/ + +void ham_cos_window( + float *fh, + const int16_t n1, + const int16_t n2 ) +{ + float cc, cte; + int16_t i; + + cte = PI2 / (float) ( 2 * n1 - 1 ); + cc = 0.0f; + for ( i = 0; i < n1; i++ ) + { + *fh++ = 0.54f - 0.46f * (float) cos( cc ); + cc += cte; + } + + cte = PI2 / (float) ( 4 * n2 - 1 ); + cc = 0.0f; + for ( i = 0; i < n2; i++ ) + { + *fh++ = (float) cos( cc ); + cc += cte; + } + + return; +} + +#undef WMC_TOOL_SKIP diff --git a/lib_com/window_ola.c b/lib_com/window_ola.c new file mode 100644 index 0000000000000000000000000000000000000000..8d1b98e38e566416d0ff2793c63b678ca2f76945 --- /dev/null +++ b/lib_com/window_ola.c @@ -0,0 +1,604 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------------- + * window_ola() + * + * Windowing, Overlap and Add + *--------------------------------------------------------------------------*/ + + +void window_ola( + const float *ImdctOut, /* i : input */ + float *auOut, /* o : output audio */ + float *OldauOut, /* i/o: audio from previous frame */ + const int16_t L, /* i : length */ + const int16_t right_mode, + const int16_t left_mode, /* i : window overlap of current frame (0: full, 2: none, or 3: half) */ + const int16_t use_bfi_win, /* i : use BFI windowing */ + const int16_t oldHqVoicing, /* i : previous HqVoicing */ + float *oldgapsynth /* i : previous gapsynth */ +) +{ + int16_t i, decimate, decay; + int16_t n, n16, windecay48, windecay16; + float win_right[R2_48]; + float win_int_left[R1_16]; + float win_left[R1_48]; + float win_int_right[R2_16]; + + + float SS2[L_FRAME48k - NS2SA( 48000, N_ZERO_MDCT_NS )]; + float wret2[L_FRAME48k - NS2SA( 48000, N_ZERO_MDCT_NS )]; + + float *paout; + + + n = (int16_t) ( (float) L * N_ZERO_MDCT_NS / FRAME_SIZE_NS ); + n16 = (int16_t) ( (float) L_FRAME16k * N_ZERO_MDCT_NS / FRAME_SIZE_NS ); + windecay48 = (int16_t) ( 2 * ( (float) L_FRAME48k * N_ZERO_MDCT_NS / FRAME_SIZE_NS ) ) + R1_48; + windecay16 = (int16_t) ( 2 * ( (float) L_FRAME16k * N_ZERO_MDCT_NS / FRAME_SIZE_NS ) ) + R1_16; + decimate = 1; + decay = 0; + + tcx_get_windows_mode1( left_mode, right_mode, win_left, win_right, win_int_left, win_int_right, L ); + + if ( L == L_FRAME32k || L == L_FRAME16k ) + { + decimate = 3; + decay = 1; + } + else if ( L == L_FRAME8k ) + { + decimate = 6; + decay = 2; + } + + else if ( L == 512 ) + { + windecay48 = (int16_t) ( 2 * ( (float) 512 * N_ZERO_MDCT_NS / FRAME_SIZE_NS ) ) + R1_25; + decimate = 1; + decay = 0; + } + else if ( L == 256 ) + { + windecay48 = (int16_t) ( 2 * ( (float) 512 * N_ZERO_MDCT_NS / FRAME_SIZE_NS ) ) + R1_25; + decimate = 2; + decay = 0; + } + + paout = auOut - n; + + if ( use_bfi_win ) + { + if ( L == L_FRAME32k ) + { + for ( i = 0; i < L / 2; i += 2 ) + { + wret2[L / 2 - n + i + 1] = win_left[( L_FRAME16k / 2 - i / 2 - 1 ) * decimate + decay]; + wret2[L / 2 - n + i] = win_int_left[( L_FRAME16k / 2 - i / 2 - 1 )]; + } + + for ( i = n; i < L / 2; i += 2 ) + { + wret2[i - n] = win_left[( L_FRAME16k - i / 2 ) * decimate - decay - 1]; + wret2[i + 1 - n] = win_int_left[L_FRAME16k - ( i / 2 ) - 1]; + } + } + else + { + for ( i = 0; i < L / 2; i++ ) + { + wret2[i + L / 2 - n] = win_left[( L / 2 - i - 1 ) * decimate + decay]; + } + + for ( i = n; i < L / 2; i++ ) + { + wret2[i - n] = win_left[( L - i ) * decimate - decay - 1]; + } + } + sinq( EVS_PI / ( 2 * ( L - n ) ), EVS_PI / ( 4 * ( L - n ) ), L - n, SS2 ); + + for ( i = n; i < L / 2; i++ ) + { + paout[i] = ImdctOut[L / 2 + i]; + } + + for ( i = 0; i < L / 2; i++ ) + { + paout[L / 2 + i] = -ImdctOut[L - 1 - i]; + } + + if ( oldHqVoicing ) + { + for ( i = 0; i < L - n; i++ ) + { + auOut[i] = auOut[i] * SS2[i] + oldgapsynth[i + n] * ( SS2[L - n - i - 1] ); + } + } + else + { + for ( i = 0; i < L - n; i++ ) + { + auOut[i] = auOut[i] * SS2[i] + OldauOut[i + n] * ( SS2[L - n - i - 1] ) / ( wret2[i] + 0.01f ); + } + } + } + + if ( L == L_FRAME32k ) + { + if ( use_bfi_win == 0 ) + { + for ( i = n; i < L / 2; i += 2 ) + { + paout[i] = ImdctOut[L / 2 + i] * win_right[( 2 * L_FRAME16k - ( n16 + ( i - n ) / 2 ) ) * decimate - 1 - decay - windecay48] + OldauOut[i]; + paout[i + 1] = ImdctOut[L / 2 + i + 1] * win_int_right[2 * L_FRAME16k - ( n16 + ( i - n ) / 2 ) - 1 - windecay16] + OldauOut[i + 1]; + } + + for ( i = 0; i < L / 2 - n; i += 2 ) + { + paout[L / 2 + i + 1] = -ImdctOut[L - 1 - ( i + 1 )] * win_right[( 3 * L_FRAME16k / 2 - 1 - i / 2 ) * decimate + decay - windecay48] + OldauOut[i + L / 2 + 1]; + paout[L / 2 + i] = -ImdctOut[L - 1 - i] * win_int_right[( 3 * L_FRAME16k / 2 - 1 - i / 2 ) - windecay16] + OldauOut[i + L / 2]; + } + + for ( i = L / 2 - n; i < L / 2; i += 2 ) + { + paout[L / 2 + i + 1] = -ImdctOut[L - 1 - ( i + 1 )] + OldauOut[i + L / 2 + 1]; + paout[L / 2 + i] = -ImdctOut[L - 1 - i] + OldauOut[i + L / 2]; + } + } + + for ( i = 0; i < L / 2; i += 2 ) + { + OldauOut[L / 2 + i + 1] = -ImdctOut[i + 1] * win_left[( L_FRAME16k / 2 - i / 2 - 1 ) * decimate + decay]; + OldauOut[L / 2 + i] = -ImdctOut[i] * win_int_left[( L_FRAME16k / 2 - i / 2 - 1 )]; + } + + + for ( i = n; i < L / 2; i += 2 ) + { + OldauOut[i] = -ImdctOut[L / 2 - 1 - i] * win_left[( L_FRAME16k - i / 2 ) * decimate - decay - 1]; + OldauOut[i + 1] = -ImdctOut[L / 2 - 1 - ( i + 1 )] * win_int_left[L_FRAME16k - ( i / 2 ) - 1]; + } + } + else + { + if ( use_bfi_win == 0 ) + { + + for ( i = n; i < L / 2; i++ ) + { + paout[i] = ImdctOut[L / 2 + i] * win_right[( 2 * L - i ) * decimate - 1 - decay - windecay48] + OldauOut[i]; + } + + for ( i = 0; i < L / 2 - n; i++ ) + { + paout[L / 2 + i] = -ImdctOut[L - 1 - i] * win_right[( 3 * L / 2 - 1 - i ) * decimate + decay - windecay48] + OldauOut[i + L / 2]; + } + + for ( i = L / 2 - n; i < L / 2; i++ ) + { + paout[L / 2 + i] = -ImdctOut[L - 1 - i] + OldauOut[i + L / 2]; + } + } + + for ( i = 0; i < L / 2; i++ ) + { + OldauOut[L / 2 + i] = -ImdctOut[i] * win_left[( L / 2 - i - 1 ) * decimate + decay]; + } + + + for ( i = n; i < L / 2; i++ ) + { + OldauOut[i] = -ImdctOut[L / 2 - 1 - i] * win_left[( L - i ) * decimate - decay - 1]; + } + } + + for ( i = 0; i < n; i++ ) + { + OldauOut[i] = -ImdctOut[L / 2 - 1 - i]; + } + for ( i = 0; i < n; i++ ) + { + paout[L + i] = OldauOut[i]; + } + + return; +} + + +/*-------------------------------------------------------------------* + * window_ola_ext() + * + * + *-------------------------------------------------------------------*/ + +void window_ola_ext( + const float *ImdstOut, /* i : input */ + float *auOut, /* o : output audio */ + float *OldauOut, /* i/o: audio from previous frame */ + const int16_t L, /* i : length */ + const int16_t right_mode, + const int16_t left_mode, /* i : window overlap of current frame (0: full, 2: none, or 3: half) */ + const uint16_t kernel_type /* i : transform kernel type */ +) +{ + const float sign_left = ( kernel_type & 1 ? 1.f : -1.f ); + const float sign_right = ( kernel_type >= MDCT_II ? -1.f : 1.f ); + int16_t i, decimate, decay; + int16_t n, n16, windecay48, windecay16; + float win_right[R2_48]; + float win_int_left[R1_16]; + float win_left[R1_48]; + float win_int_right[R2_16]; + float *paout; + + n = (int16_t) ( (float) L * N_ZERO_MDCT_NS / FRAME_SIZE_NS ); + n16 = (int16_t) ( (float) L_FRAME16k * N_ZERO_MDCT_NS / FRAME_SIZE_NS ); + windecay48 = (int16_t) ( 2 * ( (float) L_FRAME48k * N_ZERO_MDCT_NS / FRAME_SIZE_NS ) ) + R1_48; + windecay16 = (int16_t) ( 2 * ( (float) L_FRAME16k * N_ZERO_MDCT_NS / FRAME_SIZE_NS ) ) + R1_16; + decimate = 1; + decay = 0; + + tcx_get_windows_mode1( left_mode, right_mode, win_left, win_right, win_int_left, win_int_right, L ); + + if ( L == L_FRAME32k || L == L_FRAME16k ) + { + decimate = 3; + decay = 1; + } + else if ( L == L_FRAME8k ) + { + decimate = 6; + decay = 2; + } + + else if ( L == 512 ) + { + windecay48 = (int16_t) ( 2 * ( (float) 512 * N_ZERO_MDCT_NS / FRAME_SIZE_NS ) ) + R1_25; + decimate = 1; + decay = 0; + } + else if ( L == 256 ) + { + windecay48 = (int16_t) ( 2 * ( (float) 512 * N_ZERO_MDCT_NS / FRAME_SIZE_NS ) ) + R1_25; + decimate = 2; + decay = 0; + } + + paout = auOut - n; + + if ( L == L_FRAME32k ) + { + for ( i = n; i < L / 2; i += 2 ) + { + paout[i] = sign_right * ImdstOut[L / 2 + i] * win_right[( 2 * L_FRAME16k - ( n16 + ( i - n ) / 2 ) ) * decimate - 1 - decay - windecay48] + OldauOut[i]; + paout[i + 1] = sign_right * ImdstOut[L / 2 + i + 1] * win_int_right[2 * L_FRAME16k - ( n16 + ( i - n ) / 2 ) - 1 - windecay16] + OldauOut[i + 1]; + } + + for ( i = 0; i < L / 2 - n; i += 2 ) + { + paout[L / 2 + i + 1] = -ImdstOut[L - 1 - ( i + 1 )] * win_right[( 3 * L_FRAME16k / 2 - 1 - i / 2 ) * decimate + decay - windecay48] + OldauOut[i + L / 2 + 1]; + paout[L / 2 + i] = -ImdstOut[L - 1 - i] * win_int_right[( 3 * L_FRAME16k / 2 - 1 - i / 2 ) - windecay16] + OldauOut[i + L / 2]; + } + + for ( i = L / 2 - n; i < L / 2; i += 2 ) + { + paout[L / 2 + i + 1] = -ImdstOut[L - 1 - ( i + 1 )] + OldauOut[i + L / 2 + 1]; + paout[L / 2 + i] = -ImdstOut[L - 1 - i] + OldauOut[i + L / 2]; + } + + for ( i = 0; i < L / 2; i += 2 ) + { + OldauOut[L / 2 + i + 1] = sign_left * ImdstOut[i + 1] * win_left[( L_FRAME16k / 2 - i / 2 - 1 ) * decimate + decay]; + OldauOut[L / 2 + i] = sign_left * ImdstOut[i] * win_int_left[( L_FRAME16k / 2 - i / 2 - 1 )]; + } + + + for ( i = n; i < L / 2; i += 2 ) + { + OldauOut[i] = -ImdstOut[L / 2 - 1 - i] * win_left[( L_FRAME16k - i / 2 ) * decimate - decay - 1]; + OldauOut[i + 1] = -ImdstOut[L / 2 - 1 - ( i + 1 )] * win_int_left[L_FRAME16k - ( i / 2 ) - 1]; + } + } + else + { + for ( i = n; i < L / 2; i++ ) + { + paout[i] = sign_right * ImdstOut[L / 2 + i] * win_right[( 2 * L - i ) * decimate - 1 - decay - windecay48] + OldauOut[i]; + } + + for ( i = 0; i < L / 2 - n; i++ ) + { + paout[L / 2 + i] = -ImdstOut[L - 1 - i] * win_right[( 3 * L / 2 - 1 - i ) * decimate + decay - windecay48] + OldauOut[i + L / 2]; + } + + for ( i = L / 2 - n; i < L / 2; i++ ) + { + paout[L / 2 + i] = -ImdstOut[L - 1 - i] + OldauOut[i + L / 2]; + } + + for ( i = 0; i < L / 2; i++ ) + { + OldauOut[L / 2 + i] = sign_left * ImdstOut[i] * win_left[( L / 2 - i - 1 ) * decimate + decay]; + } + + + for ( i = n; i < L / 2; i++ ) + { + OldauOut[i] = -ImdstOut[L / 2 - 1 - i] * win_left[( L - i ) * decimate - decay - 1]; + } + } + + for ( i = 0; i < n; i++ ) + { + OldauOut[i] = -ImdstOut[L / 2 - 1 - i]; + } + for ( i = 0; i < n; i++ ) + { + paout[L + i] = OldauOut[i]; + } + + return; +} + + +/*---------------------------------------------------------------------* + * core_switching_OLA() + * + * modify window after HQ core decoding + * Overlap ACELP and HQ + *---------------------------------------------------------------------*/ + +void core_switching_OLA( + const float *mem_over_hp, /* i : upsampling filter memory */ + const int16_t last_L_frame, /* i : last L_frame lengthture */ + const int32_t output_Fs, /* i : output sampling rate */ + float *synth, /* i/o: synthesized signal from HQ core */ + const float *synth_subfr_out, /* i : synthesized signal from ACELP core */ + float *synth_subfr_bwe, /* i : synthesized BWE from ACELP core */ + const int16_t output_frame, /* i : output frame length */ + const int16_t bwidth /* i : output bandwidth */ +) +{ + int16_t i, L, Loverlapp, out_filt_length, filt_delay, decimate, decay; + float tmp_buf_switch[SWITCH_MAX_GAP], tmp_buf_switch2[HQ_DELAY_COMP * HQ_DELTA_MAX + 2]; + float delta; + const float *win, *win_int; + + win = window_48kHz; + win_int = window_8_16_32kHz; + decimate = 1; + decay = 0; + + if ( output_frame == L_FRAME32k || output_frame == L_FRAME16k ) + { + decimate = 3; + decay = 1; + } + else if ( output_frame == L_FRAME8k ) + { + decimate = 6; + decay = 2; + } + + /* set multiplication factor according to the sampling rate */ + delta = 1; + if ( output_frame == L_FRAME16k ) + { + delta = 2; + } + else if ( output_frame == L_FRAME32k ) + { + delta = 4; + } + else if ( output_frame == L_FRAME48k ) + { + delta = 6; + } + + set_f( tmp_buf_switch, 0, SWITCH_MAX_GAP ); + set_f( tmp_buf_switch2, 0, HQ_DELAY_COMP * HQ_DELTA_MAX + 2 ); + + Loverlapp = (int16_t) ( delta * SWITCH_OVERLAP_8k ); + + mvr2r( synth_subfr_out, tmp_buf_switch, NS2SA( output_Fs, SWITCH_GAP_LENGTH_NS ) ); /* copy 6.25 ms subframe */ + + /* conversion from 12.8kHz to output_Fs */ + if ( last_L_frame == L_FRAME ) + { + /* resample filter memory */ + if ( output_frame == L_FRAME8k ) + { + mvr2r( synth_subfr_out + NS2SA( output_Fs, SWITCH_GAP_LENGTH_NS ), tmp_buf_switch + NS2SA( output_Fs, SWITCH_GAP_LENGTH_NS ), NS2SA( output_Fs, DELAY_CLDFB_NS ) ); /* copy subframe to tmp buffer */ + } + else + { + out_filt_length = modify_Fs_intcub3m_sup( mem_over_hp + 2, NS2SA( 12800, DELAY_CLDFB_NS ), 12800, tmp_buf_switch2, output_Fs, &filt_delay ); + + for ( i = 0; i < filt_delay; i++ ) + { + tmp_buf_switch2[out_filt_length + i - filt_delay] = tmp_buf_switch2[out_filt_length - 1 - filt_delay]; + } + + if ( ( bwidth == NB && output_Fs >= 16000 ) || ( bwidth > NB && output_Fs > 16000 ) ) + { + /* mix cubic and CLDFB resampled buffers in case of resampling to higher frequency rates */ + for ( i = 0; i < out_filt_length; i++ ) + { + float a = (float) i / out_filt_length; + float b = 1.f - a; + + tmp_buf_switch[NS2SA( output_Fs, SWITCH_GAP_LENGTH_NS ) + i] = a * tmp_buf_switch2[i] + b * synth_subfr_out[NS2SA( output_Fs, SWITCH_GAP_LENGTH_NS ) + i]; + } + } + else + { + /* copy cubic resampled buffer (memory) */ + mvr2r( tmp_buf_switch2, tmp_buf_switch + NS2SA( output_Fs, SWITCH_GAP_LENGTH_NS ), out_filt_length ); + } + } + } + else + { + if ( output_frame == L_FRAME16k ) + { + /* no resampling */ + mvr2r( mem_over_hp + 2, tmp_buf_switch + NS2SA( output_Fs, SWITCH_GAP_LENGTH_NS ), NS2SA( output_Fs, DELAY_CLDFB_NS ) ); + } + else + { + if ( output_frame == L_FRAME8k ) + { + mvr2r( synth_subfr_out + NS2SA( output_Fs, SWITCH_GAP_LENGTH_NS ), tmp_buf_switch + NS2SA( output_Fs, SWITCH_GAP_LENGTH_NS ), NS2SA( output_Fs, DELAY_CLDFB_NS ) ); /* copy subframe to tmp buffer */ + } + else + { + /* resample filter memory */ + out_filt_length = modify_Fs_intcub3m_sup( mem_over_hp + 2, NS2SA( 16000, DELAY_CLDFB_NS ), 16000, tmp_buf_switch2, output_Fs, &filt_delay ); + + for ( i = 0; i < filt_delay; i++ ) + { + tmp_buf_switch2[out_filt_length + i - filt_delay] = tmp_buf_switch2[out_filt_length - 1 - filt_delay]; + } + + if ( ( bwidth == NB && output_Fs >= 16000 ) || ( bwidth > NB && output_Fs > 16000 ) ) + { + /* mix cubic and CLDFB resampled buffers in case of resampling to higher frequency rates */ + for ( i = 0; i < out_filt_length; i++ ) + { + float a = (float) i / out_filt_length; + float b = 1.f - a; + + tmp_buf_switch[NS2SA( output_Fs, SWITCH_GAP_LENGTH_NS ) + i] = a * tmp_buf_switch2[i] + b * synth_subfr_out[NS2SA( output_Fs, SWITCH_GAP_LENGTH_NS ) + i]; + } + } + else + { + /* copy cubic resampled buffer (memory) */ + mvr2r( tmp_buf_switch2, tmp_buf_switch + NS2SA( output_Fs, SWITCH_GAP_LENGTH_NS ), out_filt_length ); + } + } + } + } + + /* Windowing for overlapadd */ + L = NS2SA( output_Fs, SWITCH_GAP_LENGTH_NS + DELAY_CLDFB_NS ); /* 6.25 ms gap + 1.25 ms resamp */ + + set_f( synth, 0, L - Loverlapp ); + + if ( output_frame == L_FRAME32k ) + { + for ( i = 0; i < NS2SA( output_Fs, 10000000.0f - N_ZERO_MDCT_NS ); i += 2 ) + { + synth[L - Loverlapp + i] /= win[( 3 * L_FRAME16k / 2 - 1 - i / 2 ) * decimate + decay - (int16_t) ( 2 * ( (float) L_FRAME48k * N_ZERO_MDCT_NS / FRAME_SIZE_NS ) )]; + synth[L - Loverlapp + i + 1] /= win_int[( 3 * L_FRAME16k / 2 - 1 - i / 2 ) - (int16_t) ( 2 * ( (float) L_FRAME16k * N_ZERO_MDCT_NS / FRAME_SIZE_NS ) )]; + } + } + else + { + for ( i = 0; i < NS2SA( output_Fs, 10000000.0f - N_ZERO_MDCT_NS ); i++ ) + { + synth[L - Loverlapp + i] /= win[( 3 * output_frame / 2 - 1 - i ) * decimate + decay - (int16_t) ( 2 * ( (float) L_FRAME48k * N_ZERO_MDCT_NS / FRAME_SIZE_NS ) )]; + } + } + + + for ( i = 0; i < Loverlapp; i++ ) /* Windowing for overlapadd */ + { + synth[i + (int16_t) ( L - Loverlapp )] *= (float) sin( ( i + 1 ) * EVS_PI / ( 2 * ( Loverlapp + 1 ) ) ); + synth_subfr_bwe[i + (int16_t) ( L - Loverlapp ) - NS2SA( output_Fs, DELAY_CLDFB_NS )] *= (float) cos( ( i + 1 ) * EVS_PI / ( 2 * ( Loverlapp + 1 ) ) ) * (float) cos( ( i + 1 ) * EVS_PI / ( 2 * ( Loverlapp + 1 ) ) ); + tmp_buf_switch[i + (int16_t) ( L - Loverlapp )] *= (float) cos( ( i + 1 ) * EVS_PI / ( 2 * ( Loverlapp + 1 ) ) ) * (float) cos( ( i + 1 ) * EVS_PI / ( 2 * ( Loverlapp + 1 ) ) ); + } + + /* overlap-add ACELP (tmp_buf_switch) + HQ (synth) */ + for ( i = 0; i < NS2SA( output_Fs, DELAY_CLDFB_NS ); i++ ) + { + synth[i] += tmp_buf_switch[i]; + } + for ( i = NS2SA( output_Fs, DELAY_CLDFB_NS ); i < L; i++ ) + { + synth[i] += tmp_buf_switch[i] + synth_subfr_bwe[i - NS2SA( output_Fs, DELAY_CLDFB_NS )]; + } + + return; +} + + +/*-------------------------------------------------------------------* + * sinq() + * + * Fast sinus generate sin(tmp*i+phi) + *-------------------------------------------------------------------*/ + +void sinq( + const float tmp, /* i : sinus factor cos(tmp*i+phi) */ + const float phi, /* i : sinus phase cos(tmp*i+phi) */ + const int16_t N, /* i : size of output */ + float x[] /* o : output vector */ +) +{ + float A; + int16_t i; + + x[0] = (float) sin( phi ); + x[1] = (float) sin( tmp + phi ); + x[2] = (float) sin( 2 * tmp + phi ); + + if ( fabs( (float) ( tmp ) ) > 0.0001f ) + { + A = ( x[2] + x[0] ) / x[1]; + } + else + { + A = 0; + } + + for ( i = 3; i < N; i++ ) + { + x[i] = A * x[i - 1] - x[i - 2]; + } + + return; +} diff --git a/lib_com/wtda.c b/lib_com/wtda.c new file mode 100644 index 0000000000000000000000000000000000000000..ec7bc080a243f79a3a2c930a9e5c0425f2fd6390 --- /dev/null +++ b/lib_com/wtda.c @@ -0,0 +1,442 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "prot.h" +#include "rom_com.h" +#include +#include "wmc_auto.h" + +/*--------------------------------------------------------------------------* + * mvr2r_inv() + * + * + *--------------------------------------------------------------------------*/ + +static void mvr2r_inv( + const float *in, /* i : input vector */ + float *out, /* o : output vector */ + const int16_t L, /* i : length */ + const int16_t decimate /* i : decimation flag [-1,1] */ +) +{ + int16_t i; + + in = in + (int16_t) ( ( decimate - 1 ) / 2 ); + out = out + L - 1; + + for ( i = 0; i < L; i++ ) + { + *out = *in; + in += decimate; + out--; + } + + return; +} + +/*--------------------------------------------------------------------------* + * mvr2r_dec() + * + * + *--------------------------------------------------------------------------*/ + +static void mvr2r_dec( + const float *in, /* i : input vector */ + float *out, /* o : output vector */ + int16_t L, /* i : length */ + int16_t decimate /* i : decimation flag [-1,1] */ +) +{ + int16_t i; + in = in + (int16_t) ( ( decimate - 1 ) / 2 ); + for ( i = 0; i < L; i++ ) + { + *out = *in; + in += decimate; + out++; + } + + return; +} + +/*--------------------------------------------------------------------------* + * copy_win() + * + * + *--------------------------------------------------------------------------*/ + +static void copy_win( + float *out_win, /* o : output window buffer */ + const int16_t nb_zero, /* i : length of zero padding */ + const float *in_win, /* i : input window */ + const int16_t win_lenght, /* i : length */ + const int16_t nb_one, /* i : length of flat section (ones) */ + const int16_t decimate /* i : input window */ +) +{ + if ( decimate < 0 ) + { + set_f( out_win, 1, nb_one ); + mvr2r_inv( in_win, out_win + nb_one, win_lenght, -decimate ); + set_f( out_win + win_lenght + nb_one, 0, nb_zero ); + } + else + { + set_f( out_win, 0, nb_zero ); + mvr2r_dec( in_win, out_win + nb_zero, win_lenght, decimate ); + set_f( out_win + nb_zero + win_lenght, 1, nb_one ); + } + + return; +} + +/*--------------------------------------------------------------------------* + * tcx_get_windows_mode1() + * + * + *--------------------------------------------------------------------------*/ + +void tcx_get_windows_mode1( + const int16_t left_mode, /* i : overlap mode of left window half */ + const int16_t right_mode, /* i : overlap mode of right window half */ + float *left_win, /* o : left overlap window */ + float *right_win, /* o : right overlap window */ + float *left_win_int, /* o : left overlap window */ + float *right_win_int, /* o : right overlap window */ + const int16_t L /* i : length */ +) +{ + /* Left part */ + if ( left_mode == MIN_OVERLAP || left_mode == TRANSITION_OVERLAP ) + { + if ( L == 256 || L == 512 ) + { + copy_win( left_win, R1_25 - 4 * R2_25 / 7, small_overlap_25, R2_25 / 7, 3 * R2_25 / 7, 1 ); + } + else + { + copy_win( left_win, R1_48 - 4 * R2_48 / 7, small_overlap_48, R2_48 / 7, 3 * R2_48 / 7, 1 ); + copy_win( left_win_int, R1_16 - 4 * R2_16 / 7, small_overlap_int, R2_16 / 7, 3 * R2_16 / 7, 1 ); + } + } + else if ( left_mode == HALF_OVERLAP ) + { + if ( L == 256 || L == 512 ) + { + copy_win( left_win, R1_25 - 5 * R2_25 / 7, half_overlap_25, 3 * R2_25 / 7, 2 * R2_25 / 7, 1 ); + } + else + { + copy_win( left_win, R1_48 - 5 * R2_48 / 7, half_overlap_48, 3 * R2_48 / 7, 2 * R2_48 / 7, 1 ); + copy_win( left_win_int, R1_16 - 5 * R2_16 / 7, half_overlap_int, 3 * R2_16 / 7, 2 * R2_16 / 7, 1 ); + } + } + else if ( left_mode == ALDO_WINDOW ) + { + /* ALDO */ + if ( L == 256 || L == 512 ) + { + mvr2r( window_256kHz, left_win, R1_25 ); + } + else + { + mvr2r( window_48kHz, left_win, R1_48 ); + mvr2r( window_8_16_32kHz, left_win_int, R1_16 ); + } + } + else + { + assert( !"Window not supported" ); + } + + /* Right part */ + if ( right_mode == MIN_OVERLAP || right_mode == TRANSITION_OVERLAP ) + { + + if ( L == 256 || L == 512 ) + { + copy_win( right_win, 3 * R2_25 / 7, small_overlap_25, R2_25 / 7, 3 * R2_25 / 7, -1 ); + } + else + { + copy_win( right_win, 3 * R2_48 / 7, small_overlap_48, R2_48 / 7, 3 * R2_48 / 7, -1 ); + copy_win( right_win_int, 3 * R2_16 / 7, small_overlap_int, R2_16 / 7, 3 * R2_16 / 7, -1 ); + } + } + else if ( right_mode == HALF_OVERLAP ) + { + + if ( L == 256 || L == 512 ) + { + copy_win( right_win, 2 * R2_25 / 7, half_overlap_25, 3 * R2_25 / 7, 2 * R2_25 / 7, -1 ); + } + else + { + copy_win( right_win, 2 * R2_48 / 7, half_overlap_48, 3 * R2_48 / 7, 2 * R2_48 / 7, -1 ); + copy_win( right_win_int, 2 * R2_16 / 7, half_overlap_int, 3 * R2_16 / 7, 2 * R2_16 / 7, -1 ); + } + } + else if ( right_mode == ALDO_WINDOW ) + { + if ( L == 256 || L == 512 ) + { + mvr2r( window_256kHz + R1_25, right_win, R2_25 ); + } + else + { + mvr2r( window_48kHz + R1_48, right_win, R2_48 ); + mvr2r( window_8_16_32kHz + R1_16, right_win_int, R2_16 ); + } + } + else + { + assert( !"Window not supported" ); + } + + return; +} + + +/*--------------------------------------------------------------------------* + * wtda() + * + * Windowing and time-domain aliasing + *--------------------------------------------------------------------------*/ + +void wtda( + const float *new_audio, /* i : input audio */ + float *wtda_audio, /* o : windowed audio */ + float *old_wtda, /* i/o: windowed audio from previous frame */ + const int16_t left_mode, /* i : window overlap of previous frame (0: full, 2: none, or 3: half) */ + const int16_t right_mode, /* i : window overlap of current frame (0: full, 2: none, or 3: half) */ + const int16_t L /* i : length */ +) +{ + int16_t i, decimate, decay; + int16_t n, windecay48, windecay16; + const float *allsig_l, *allsig_r; + float win_right[R2_48]; + float win_int_left[R1_16]; + float win_left[R1_48]; + float win_int_right[R2_16]; + + tcx_get_windows_mode1( left_mode, right_mode, win_left, win_right, win_int_left, win_int_right, L ); + + decimate = 1; /* L_FRAME 48k */ + decay = 0; + windecay48 = (int16_t) ( 2 * ( (float) L_FRAME48k * N_ZERO_MDCT_NS / FRAME_SIZE_NS ) ) + R1_48; + + if ( L == L_FRAME32k || L == L_FRAME16k ) + { + decimate = 3; + decay = 1; + } + else if ( L == L_FRAME8k ) + { + decimate = 6; + decay = 2; + } + + n = (int16_t) ( (float) L * N_ZERO_MDCT_NS / FRAME_SIZE_NS ); + + windecay16 = (int16_t) ( 2 * ( (float) L_FRAME16k * N_ZERO_MDCT_NS / FRAME_SIZE_NS ) ) + R1_16; + + /* algorithmic delay reduction */ + i = 0; + + if ( old_wtda == NULL ) + { + allsig_r = new_audio + n; + allsig_l = new_audio + n - L; + } + else + { + allsig_r = new_audio + n; + allsig_l = old_wtda + n; + } + + if ( L == L_FRAME32k ) + { + for ( i = 0; i < L / 2 - n; i += 2 ) + { + wtda_audio[i] = -allsig_r[L / 2 - i - 1] * win_int_right[3 * L_FRAME16k / 2 - i / 2 - 1 - windecay16] - allsig_r[L / 2 + i] * win_int_right[3 * L_FRAME16k / 2 + i / 2 - windecay16]; + wtda_audio[i + 1] = -allsig_r[L / 2 - ( i + 1 ) - 1] * win_right[( 3 * L_FRAME16k / 2 - i / 2 - 1 ) * decimate + decay - windecay48] - allsig_r[L / 2 + i + 1] * win_right[( 3 * L_FRAME16k / 2 + 1 + i / 2 ) * decimate - decay - 1 - windecay48]; + } + + for ( i = L / 2 - n; i < L / 2; i += 2 ) + { + wtda_audio[i] = -allsig_r[L / 2 - i - 1]; + wtda_audio[i + 1] = -allsig_r[L / 2 - ( i + 1 ) - 1]; + } + for ( i = 0; i < n; i += 2 ) + { + wtda_audio[i + L / 2] = allsig_l[i] * win_left[( i / 2 ) * decimate + decay] - new_audio[n - i - 1]; + wtda_audio[i + L / 2 + 1] = allsig_l[i + 1] * win_int_left[i / 2] - new_audio[n - ( i + 1 ) - 1]; + } + + for ( i = n; i < L / 2; i += 2 ) + { + wtda_audio[i + L / 2] = allsig_l[i] * win_left[( i / 2 ) * decimate + decay] - allsig_l[L - i - 1] * win_left[( L / 2 - i / 2 ) * decimate - 1 - decay]; + wtda_audio[i + L / 2 + 1] = allsig_l[i + 1] * win_int_left[i / 2] - allsig_l[L - ( i + 1 ) - 1] * win_int_left[L / 2 - i / 2 - 1]; + } + } + else + { + for ( i = 0; i < L / 2 - n; i++ ) + { + wtda_audio[i] = -allsig_r[L / 2 - i - 1] * win_right[3 * L / 2 * decimate - ( i + 1 ) * decimate + decay - windecay48] - allsig_r[L / 2 + i] * win_right[3 * L / 2 * decimate - 1 + ( i + 1 ) * decimate - decay - windecay48]; + } + + for ( i = L / 2 - n; i < L / 2; i++ ) + { + wtda_audio[i] = -allsig_r[L / 2 - i - 1]; + } + + for ( i = 0; i < n; i++ ) + { + wtda_audio[i + L / 2] = allsig_l[i] * win_left[i * decimate + decay] - new_audio[n - i - 1]; + } + + for ( i = n; i < L / 2; i++ ) + { + wtda_audio[i + L / 2] = allsig_l[i] * win_left[i * decimate + decay] - allsig_l[L - i - 1] * win_left[L * decimate - i * decimate - 1 - decay]; + } + } + + if ( old_wtda != NULL ) + { + mvr2r( new_audio, old_wtda, L ); + } + + return; +} + +void wtda_ext( + const float *new_audio, /* i : input audio */ + float *wtda_audio, /* o : windowed audio */ + const int16_t left_mode, /* i : window overlap of previous frame (0: full, 2: none, or 3: half) */ + const int16_t right_mode, /* i : window overlap of current frame (0: full, 2: none, or 3: half) */ + const int16_t L, /* i : length */ + const uint16_t kernel_type /* i : transform kernel type (0 - 3) */ +) +{ + const float sign_left = ( kernel_type >= 2 ? -1.f : 1.f ); + const float sign_right = ( kernel_type & 1 ? 1.f : -1.f ); + int16_t i, decimate, decay; + int16_t n, windecay48, windecay16; + const float *allsig_l, *allsig_r; + float win_right[R2_48]; + float win_int_left[R1_16]; + float win_left[R1_48]; + float win_int_right[R2_16]; + + tcx_get_windows_mode1( left_mode, right_mode, win_left, win_right, win_int_left, win_int_right, L ); + + decimate = 1; /* L_FRAME 48k */ + decay = 0; + windecay48 = (int16_t) ( 2 * ( (float) L_FRAME48k * N_ZERO_MDCT_NS / FRAME_SIZE_NS ) ) + R1_48; + + if ( L == L_FRAME32k || L == L_FRAME16k ) + { + decimate = 3; + decay = 1; + } + else if ( L == L_FRAME8k ) + { + decimate = 6; + decay = 2; + } + + n = (int16_t) ( (float) L * N_ZERO_MDCT_NS / FRAME_SIZE_NS ); + + windecay16 = (int16_t) ( 2 * ( (float) L_FRAME16k * N_ZERO_MDCT_NS / FRAME_SIZE_NS ) ) + R1_16; + + allsig_r = new_audio + n; + allsig_l = new_audio + n - L; + + if ( L == L_FRAME32k ) + { + for ( i = 0; i < L / 2 - n; i += 2 ) + { + wtda_audio[i] = -allsig_r[L / 2 - i - 1] * win_int_right[3 * L_FRAME16k / 2 - i / 2 - 1 - windecay16] + sign_right * allsig_r[L / 2 + i] * win_int_right[3 * L_FRAME16k / 2 + i / 2 - windecay16]; + wtda_audio[i + 1] = -allsig_r[L / 2 - ( i + 1 ) - 1] * win_right[( 3 * L_FRAME16k / 2 - i / 2 - 1 ) * decimate + decay - windecay48] + sign_right * allsig_r[L / 2 + i + 1] * win_right[( 3 * L_FRAME16k / 2 + 1 + i / 2 ) * decimate - decay - 1 - windecay48]; + } + + for ( i = L / 2 - n; i < L / 2; i += 2 ) + { + wtda_audio[i] = -allsig_r[L / 2 - i - 1]; + wtda_audio[i + 1] = -allsig_r[L / 2 - ( i + 1 ) - 1]; + } + for ( i = 0; i < n; i += 2 ) + { + wtda_audio[i + L / 2] = sign_left * allsig_l[i] * win_left[( i / 2 ) * decimate + decay] - new_audio[n - i - 1]; + wtda_audio[i + L / 2 + 1] = sign_left * allsig_l[i + 1] * win_int_left[i / 2] - new_audio[n - ( i + 1 ) - 1]; + } + + for ( i = n; i < L / 2; i += 2 ) + { + wtda_audio[i + L / 2] = sign_left * allsig_l[i] * win_left[( i / 2 ) * decimate + decay] - allsig_l[L - i - 1] * win_left[( L / 2 - i / 2 ) * decimate - 1 - decay]; + wtda_audio[i + L / 2 + 1] = sign_left * allsig_l[i + 1] * win_int_left[i / 2] - allsig_l[L - ( i + 1 ) - 1] * win_int_left[L / 2 - i / 2 - 1]; + } + } + else + { + for ( i = 0; i < L / 2 - n; i++ ) + { + wtda_audio[i] = -allsig_r[L / 2 - i - 1] * win_right[3 * L / 2 * decimate - ( i + 1 ) * decimate + decay - windecay48] + sign_right * allsig_r[L / 2 + i] * win_right[3 * L / 2 * decimate - 1 + ( i + 1 ) * decimate - decay - windecay48]; + } + + for ( i = L / 2 - n; i < L / 2; i++ ) + { + wtda_audio[i] = -allsig_r[L / 2 - i - 1]; + } + + for ( i = 0; i < n; i++ ) + { + wtda_audio[i + L / 2] = sign_left * allsig_l[i] * win_left[i * decimate + decay] - new_audio[n - i - 1]; + } + + for ( i = n; i < L / 2; i++ ) + { + wtda_audio[i + L / 2] = sign_left * allsig_l[i] * win_left[i * decimate + decay] - allsig_l[L - i - 1] * win_left[L * decimate - i * decimate - 1 - decay]; + } + } + + return; +} diff --git a/lib_debug/wmc_auto.c b/lib_debug/wmc_auto.c new file mode 100644 index 0000000000000000000000000000000000000000..029640a1dba8bce33cafd82907ef5bb5e5d5dabe --- /dev/null +++ b/lib_debug/wmc_auto.c @@ -0,0 +1,1926 @@ +/* + * (C) 2022 copyright VoiceAge Corporation. All Rights Reserved. + * + * This software is protected by copyright law and by international treaties. The source code, and all of its derivations, + * is provided by VoiceAge Corporation under the "ITU-T Software Tools' General Public License". Please, read the license file + * or refer to ITU-T Recommendation G.191 on "SOFTWARE TOOLS FOR SPEECH AND AUDIO CODING STANDARDS". + * + * Any use of this software is permitted provided that this notice is not removed and that neither the authors nor + * VoiceAge Corporation are deemed to have made any representations as to the suitability of this software + * for any purpose nor are held responsible for any defects of this software. THERE IS NO WARRANTY FOR THIS SOFTWARE. + * + * Authors: Guy Richard, Vladimir Malenovsky (Vladimir.Malenovsky@USherbrooke.ca) + */ + +#include +#include +#include +#include +#include + +#ifndef _MSC_VER +#include +#include +#else +#include +#endif + +#include "options.h" +#include "wmc_auto.h" + + +#define WMC_TOOL_SKIP /* Skip the instrumentation of this file, if invoked by accident */ + +#ifdef WMOPS + +/*-------------------------------------------------------------------* + * Complexity counting tool + *--------------------------------------------------------------------*/ + +#define MAX_RECORDS 1024 +#define MAX_CHAR 64 +#define MAX_STACK 64 +#define DOUBLE_MAX 0x80000000 + +struct wmops_record +{ + char label[MAX_CHAR]; + long call_number; + long update_cnt; + int call_tree[MAX_RECORDS]; + double start_selfcnt; + double current_selfcnt; + double max_selfcnt; + double min_selfcnt; + double tot_selfcnt; + double start_cnt; /* The following take into account the decendants */ + double current_cnt; + double max_cnt; + double min_cnt; + double tot_cnt; +#ifdef WMOPS_WC_FRAME_ANALYSIS + int32_t current_call_number; + double wc_cnt; + double wc_selfcnt; + int32_t wc_call_number; +#endif +}; + +double ops_cnt; +double prom_cnt; +double inst_cnt[NUM_INST]; + +static struct wmops_record wmops[MAX_RECORDS]; +static int stack[MAX_STACK]; +static int sptr; +static int num_records; +static int current_record; +static long update_cnt; +static double start_cnt; +static double max_cnt; +static double min_cnt; +static double inst_cnt_wc[NUM_INST]; +static long fnum_cnt_wc; + +static int *heap_allocation_call_tree = NULL, heap_allocation_call_tree_size = 0, heap_allocation_call_tree_max_size = 0; + + +void reset_wmops( void ) +{ + int i, j; + + for ( i = 0; i < MAX_RECORDS; i++ ) + { + strcpy( &wmops[i].label[0], "\0" ); + wmops[i].call_number = 0; + wmops[i].update_cnt = 0; + for ( j = 0; j < MAX_RECORDS; j++ ) + { + wmops[i].call_tree[j] = -1; + } + wmops[i].start_selfcnt = 0.0; + wmops[i].current_selfcnt = 0.0; + wmops[i].max_selfcnt = 0.0; + wmops[i].min_selfcnt = DOUBLE_MAX; + wmops[i].tot_selfcnt = 0.0; + wmops[i].start_cnt = 0.0; + wmops[i].current_cnt = 0.0; + wmops[i].max_cnt = 0.0; + wmops[i].min_cnt = DOUBLE_MAX; + wmops[i].tot_cnt = 0.0; +#ifdef WMOPS_WC_FRAME_ANALYSIS + wmops[i].wc_cnt = 0.0; + wmops[i].wc_selfcnt = 0.0; + wmops[i].current_call_number = 0; +#endif + } + + for ( i = 0; i < MAX_STACK; i++ ) + { + stack[i] = -1; + } + sptr = 0; + num_records = 0; + current_record = -1; + update_cnt = 0; + + max_cnt = 0.0; + min_cnt = DOUBLE_MAX; + start_cnt = 0.0; + ops_cnt = 0.0; +} + + +void push_wmops( const char *label ) +{ + int new_flag; + int i, j; + + /* Check if new function record label */ + new_flag = 1; + for ( i = 0; i < num_records; i++ ) + { + if ( strcmp( wmops[i].label, label ) == 0 ) + { + new_flag = 0; + break; + } + } + + /* Configure new record */ + if ( new_flag ) + { + if ( num_records >= MAX_RECORDS ) + { + fprintf( stdout, "push_wmops(): exceeded MAX_RECORDS count.\n\n" ); + exit( -1 ); + } + strcpy( wmops[i].label, label ); + num_records++; + } + + /* Push current context onto stack */ + if ( current_record >= 0 ) + { + if ( sptr >= MAX_STACK ) + { + fprintf( stdout, "\r push_wmops(): stack exceeded, try inreasing MAX_STACK\n" ); + exit( -1 ); + } + stack[sptr++] = current_record; + + /* accumulate op counts */ + wmops[current_record].current_selfcnt += ops_cnt - wmops[current_record].start_selfcnt; + + /* update call tree */ + for ( j = 0; j < MAX_RECORDS; j++ ) + { + if ( wmops[i].call_tree[j] == current_record ) + { + break; + } + else if ( wmops[i].call_tree[j] == -1 ) + { + wmops[i].call_tree[j] = current_record; + break; + } + } + } + + /* init current record */ + current_record = i; + wmops[current_record].start_selfcnt = ops_cnt; + wmops[current_record].start_cnt = ops_cnt; + wmops[current_record].call_number++; +#ifdef WMOPS_WC_FRAME_ANALYSIS + wmops[current_record].current_call_number++; +#endif + + return; +} + + +void pop_wmops( void ) +{ + + /* Check for underflow */ + if ( current_record < 0 ) + { + fprintf( stdout, "\r pop_wmops(): stack underflow, too many calls to pop_wmops()\n" ); + exit( -1 ); + } + + /* update count of current record */ + wmops[current_record].current_selfcnt += ops_cnt - wmops[current_record].start_selfcnt; + wmops[current_record].current_cnt += ops_cnt - wmops[current_record].start_cnt; + + /* Get back previous context from stack */ + if ( sptr > 0 ) + { + current_record = stack[--sptr]; + wmops[current_record].start_selfcnt = ops_cnt; + } + else + { + current_record = -1; + } + + return; +} + + +void update_wmops( void ) +{ + int i; + double current_cnt; +#ifdef WMOPS_PER_FRAME + static FILE *fid = NULL; + const char filename[] = "wmops_analysis"; + float tmpF; +#endif + + if ( sptr != 0 ) + { + fprintf( stdout, "update_wmops(): Stack must be empty!\n" ); + exit( -1 ); + } + +#ifdef WMOPS_PER_FRAME + /* Check, if the output file has already been opened */ + if ( fid == NULL ) + { + fid = fopen( filename, "wb" ); + + if ( fid == NULL ) + { + fprintf( stderr, "\nCannot open %s!\n\n", filename ); + exit( -1 ); + } + } + + /* Write current complexity to the external file */ + tmpF = (float) ( FAC * wmops[0].current_cnt ); + fwrite( &tmpF, sizeof( float ), 1, fid ); +#endif + +#ifdef WMOPS_WC_FRAME_ANALYSIS + if ( ops_cnt - start_cnt > max_cnt ) + { + for ( i = 0; i < num_records; i++ ) + { + wmops[i].wc_cnt = wmops[i].current_cnt; + wmops[i].wc_selfcnt = wmops[i].current_selfcnt; + wmops[i].wc_call_number = wmops[i].current_call_number; + } + } +#endif + + for ( i = 0; i < num_records; i++ ) + { + wmops[i].tot_selfcnt += wmops[i].current_selfcnt; + wmops[i].tot_cnt += wmops[i].current_cnt; + + if ( wmops[i].current_selfcnt > 0 ) + { + if ( wmops[i].current_selfcnt > wmops[i].max_selfcnt ) + { + wmops[i].max_selfcnt = wmops[i].current_selfcnt; + } + + if ( wmops[i].current_selfcnt < wmops[i].min_selfcnt ) + { + wmops[i].min_selfcnt = wmops[i].current_selfcnt; + } + } + + wmops[i].current_selfcnt = 0; + + if ( wmops[i].current_cnt > 0 ) + { + if ( wmops[i].current_cnt > wmops[i].max_cnt ) + { + wmops[i].max_cnt = wmops[i].current_cnt; + } + + if ( wmops[i].current_cnt < wmops[i].min_cnt ) + { + wmops[i].min_cnt = wmops[i].current_cnt; + } + + wmops[i].update_cnt++; + } + + wmops[i].current_cnt = 0; +#ifdef WMOPS_WC_FRAME_ANALYSIS + wmops[i].current_call_number = 0; +#endif + } + + current_cnt = ops_cnt - start_cnt; + if ( current_cnt > max_cnt ) + { + max_cnt = current_cnt; + + for ( i = 0; i < NUM_INST; i++ ) + { + inst_cnt_wc[i] = inst_cnt[i]; + } + + fnum_cnt_wc = update_cnt + 1; + } + + if ( current_cnt < min_cnt ) + { + min_cnt = current_cnt; + } + + for ( i = 0; i < NUM_INST; i++ ) + { + inst_cnt[i] = 0.0; + } + + start_cnt = ops_cnt; + + /* increment frame counter */ + update_cnt++; + + return; +} + + +void print_wmops( void ) +{ + int i; + + char *sfmts = "%20s %8s %8s %7s %7s\n"; + char *dfmts = "%20s %8.2f %8.3f %7.3f %7.3f\n"; + char *sfmt = "%20s %8s %8s %7s %7s %7s %7s %7s\n"; + char *dfmt = "%20s %8.2f %8.3f %7.3f %7.3f %7.3f %7.3f %7.3f\n"; + +#ifdef WMOPS_WC_FRAME_ANALYSIS + int j, label_len, max_label_len; + char *sfmtt = "%20s %4s %15s\n"; + char *dfmtt = "%20s %4d "; +#endif + + fprintf( stdout, "\n\n --- Complexity analysis [WMOPS] --- \n\n" ); + + fprintf( stdout, "%54s %23s\n", "|------ SELF ------|", "|--- CUMULATIVE ---|" ); + fprintf( stdout, sfmt, " routine", " calls", " min ", " max ", " avg ", " min ", " max ", " avg " ); + fprintf( stdout, sfmt, "---------------", "------", "------", "------", "------", "------", "------", "------" ); + + for ( i = 0; i < num_records; i++ ) + { + fprintf( stdout, dfmt, wmops[i].label, update_cnt == 0 ? 0 : (float) wmops[i].call_number / update_cnt, + wmops[i].min_selfcnt == DOUBLE_MAX ? 0 : FAC * wmops[i].min_selfcnt, + FAC * wmops[i].max_selfcnt, + wmops[i].update_cnt == 0 ? 0 : FAC * wmops[i].tot_selfcnt / wmops[i].update_cnt, + wmops[i].min_cnt == DOUBLE_MAX ? 0 : FAC * wmops[i].min_cnt, + FAC * wmops[i].max_cnt, + wmops[i].update_cnt == 0 ? 0 : FAC * wmops[i].tot_cnt / wmops[i].update_cnt ); + } + + fprintf( stdout, sfmts, "---------------", "------", "------", "------", "------" ); + fprintf( stdout, dfmts, "total", (float) update_cnt, update_cnt == 0 ? 0 : FAC * min_cnt, FAC * max_cnt, update_cnt == 0 ? 0 : FAC * ops_cnt / update_cnt ); + fprintf( stdout, "\n" ); + +#ifdef WMOPS_WC_FRAME_ANALYSIS + /* calculate maximum label length for compact prinout */ + max_label_len = 0; + for ( i = 0; i < num_records; i++ ) + { + label_len = strlen( wmops[i].label ); + if ( label_len > max_label_len ) + { + max_label_len = label_len; + } + } + max_label_len += 4; + + fprintf( stdout, "\nComplexity analysis for the worst-case frame %ld:\n", fnum_cnt_wc ); + fprintf( stdout, "%*s %8s %10s %12s\n", max_label_len, " routine", " calls", " SELF", " CUMULATIVE" ); + fprintf( stdout, "%*s %8s %10s %10s\n", max_label_len, "---------------", "------", "------", "----------" ); + + for ( i = 0; i < num_records; i++ ) + { + fprintf( stdout, "%*s %8d %10.3f %12.3f\n", max_label_len, wmops[i].label, wmops[i].wc_call_number, FAC * wmops[i].wc_selfcnt, FAC * wmops[i].wc_cnt ); + } + + fprintf( stdout, "\nCall Tree:\n\n" ); + fprintf( stdout, sfmtt, " function", "num", "called by: " ); + fprintf( stdout, sfmtt, "---------------", "---", "--------------" ); + + for ( i = 0; i < num_records; i++ ) + { + fprintf( stdout, dfmtt, wmops[i].label, i ); + for ( j = 0; wmops[i].call_tree[j] != -1; j++ ) + { + if ( j != 0 ) + { + fprintf( stdout, ", " ); + } + fprintf( stdout, "%d", wmops[i].call_tree[j] ); + } + fprintf( stdout, "\n" ); + } + + fprintf( stdout, sfmtt, "---------------", "---", "--------------" ); + fprintf( stdout, "\n\n" ); + + fprintf( stdout, "\nInstruction type analysis for the worst-case frame %ld:\n\n", fnum_cnt_wc ); /* added -- JPA */ + for ( i = 0; i < NUM_INST; i++ ) + { + switch ( (enum instructions) i ) + { + case _ADD: + fprintf( stdout, "\tAdds: %12.1f\n", inst_cnt_wc[i] ); + break; + case _ABS: + fprintf( stdout, "\tAbsolutes: %12.1f\n", inst_cnt_wc[i] ); + break; + case _MULT: + fprintf( stdout, "\tMultiplies: %12.1f\n", inst_cnt_wc[i] ); + break; + case _MAC: + fprintf( stdout, "\tMACs: %12.1f\n", inst_cnt_wc[i] ); + break; + case _MOVE: + fprintf( stdout, "\tMoves: %12.1f\n", inst_cnt_wc[i] ); + break; + case _STORE: + fprintf( stdout, "\tStores: %12.1f\n", inst_cnt_wc[i] ); + break; + case _LOGIC: + fprintf( stdout, "\tLogicals: %12.1f\n", inst_cnt_wc[i] ); + break; + case _SHIFT: + fprintf( stdout, "\tShifts: %12.1f\n", inst_cnt_wc[i] ); + break; + case _BRANCH: + fprintf( stdout, "\tBranches: %12.1f\n", inst_cnt_wc[i] ); + break; + case _DIV: + fprintf( stdout, "\tDivisions: %12.1f\n", inst_cnt_wc[i] ); + break; + case _SQRT: + fprintf( stdout, "\tSquare Root: %12.1f\n", inst_cnt_wc[i] ); + break; + case _TRANS: + fprintf( stdout, "\tTrans: %12.1f\n", inst_cnt_wc[i] ); + break; + case _FUNC: + fprintf( stdout, "\tFunc Call: %12.1f\n", inst_cnt_wc[i] ); + break; + case _LOOP: + fprintf( stdout, "\tLoop Init: %12.1f\n", inst_cnt_wc[i] ); + break; + case _INDIRECT: + fprintf( stdout, "\tIndirect Addr: %12.1f\n", inst_cnt_wc[i] ); + break; + case _PTR_INIT: + fprintf( stdout, "\tPointer Init: %12.1f\n", inst_cnt_wc[i] ); + break; + case _TEST: + fprintf( stdout, "\tExtra condit.: %12.1f\n", inst_cnt_wc[i] ); + break; + case _POWER: + fprintf( stdout, "\tExponential: %12.1f\n", inst_cnt_wc[i] ); + break; + case _LOG: + fprintf( stdout, "\tLogarithm: %12.1f\n", inst_cnt_wc[i] ); + break; + case _MISC: + fprintf( stdout, "\tAll other op.: %12.1f\n", inst_cnt_wc[i] ); + break; + default: + fprintf( stdout, "\tERROR: Invalid instruction type: %d\n\n", i ); + } + } +#endif + + return; +} + + +/*-------------------------------------------------------------------* + * Memory counting tool measuring RAM usage (stack and heap) + * + * Maximum RAM is measured by monitoring the total allocated memory (stack and heap) in each frame. + * + * Maximum stack is measured by monitoring the difference between the 'top' and 'bottom' of the stack. The 'bottom' of the stack is updated in each function + * with a macro 'func_start_' which is inserted automatically to all functions during the instrumentation process. + * + * Maximum heap is measured by summing the sizes of all memory blocks allocated by malloc() or calloc() and deallocated by free(). The maximum heap size is + * updated each time when the macros malloc_() or calloc_() is invoked. The macros 'malloc_ and calloc_' are inserted automatically during the instrumentation process. + * As part of heap measurements, intra-frame heap and inter-frame heap are measured separately. Intra-frame heap refers to heap memory which is allocated and deallocated + * within a single frame. Inter-frame heap, on the contrary, refers to heap memory which is reserved for more than one frame. + * + * In order to run the memory counting tool the function reset_mem(cnt_size) must be called at the beginning of the encoding/decoding process. + * The unit in which memory consumption is reported is set via the parameter 'cnt_size'. It can be set to 0 (bytes), 1 (32b words) or 2 (64b words). + * At the end of the encoding/decoding process, 'print_mem()' function may be called to print basic information about memory consumption. If the macro 'MEM_COUNT_DETAILS' + * is activated, detailed information is printed + * + * The macro 'WMOPS' needs to be activated to enable memory counting. To avoid the instrumentation of malloc()/calloc()/free() calls, use + * #define WMC_TOOL_SKIP ... #undef WMC_TOOL_SKIP macro pair around the malloc(), calloc() and free(). + *--------------------------------------------------------------------*/ + +#define MAX_RECORDABLE_CALLS 100 +#define MAX_FUNCTION_NAME_LENGTH 35 /* Maximum length that the function string will be truncated to */ +#define MAX_PARAMS_LENGTH 50 /* Maximum length that the parameter string will be truncated to */ +#define MAX_NUM_RECORDS 300 /* Initial maximum number of memory records -> mightb be increased during runtime, if needed */ +#define MAX_NUM_RECORDS_REALLOC_STEP 50 /* When re-allocating the list of memory records, increase the number of records by this number */ + +/* This is the value (in bytes) towards which the block size is rounded. For example, a block of 123 bytes, when using + a 32 bits system, will end up taking 124 bytes since the last unused byte cannot be used for another block. */ +#ifdef MEM_ALIGN_64BITS +#define BLOCK_ROUNDING 8 /* Align on 64 Bits */ +#else +#define BLOCK_ROUNDING 4 /* Align on 32 Bits */ +#endif + +#define N_32BITS_BLOCKS ( BLOCK_ROUNDING / sizeof( int32_t ) ) + +#define MAGIC_VALUE_OOB 0x12A534F0 /* Signature value which is inserted before and after each allocated memory block, used to detect out-of-bound access */ +#define MAGIC_VALUE_USED ( ~MAGIC_VALUE_OOB ) /* Value used to pre-fill allocated memory blocks, used to calculate actual memory usage */ +#define OOB_START 0x1 /* Flag indicating out-of-bounds access before memory block */ +#define OOB_END 0x2 /* Flag indicating out-of-bounds access after memory block */ + +#define ROUND_BLOCK_SIZE( n ) ( ( ( n ) + BLOCK_ROUNDING - 1 ) & ~( BLOCK_ROUNDING - 1 ) ) +#define IS_CALLOC( str ) ( str[0] == 'c' ) + +#ifdef MEM_COUNT_DETAILS +const char *csv_filename = "mem_analysis.csv"; +static FILE *fid_csv_filename = NULL; +#endif + +typedef struct +{ + char function_name[MAX_FUNCTION_NAME_LENGTH + 1]; + int16_t *stack_ptr; +} caller_info; + +caller_info stack_callers[2][MAX_RECORDABLE_CALLS]; + +typedef struct +{ + char name[MAX_FUNCTION_NAME_LENGTH + 1]; /* +1 for NUL */ + char params[1 + MAX_PARAMS_LENGTH + 1]; /* +1 for 'm'/'c' alloc & +1 for NUL */ + unsigned long hash; + int lineno; + void *block_ptr; + int block_size; + unsigned long total_block_size; /* Cumulative sum of the allocated size in the session */ + unsigned long total_used_size; /* Cumulative sum of the used size in the session */ + int wc_heap_size_intra_frame; /* Worst-Case Intra-Frame Heap Size */ + int wc_heap_size_inter_frame; /* Worst-Case Inter-Frame Heap Size */ + int frame_allocated; /* Frame number in which the Memory Block has been allocated (-1 if not allocated at the moment) */ + int OOB_Flag; + int noccurances; /* Number of times that the memory block has been allocated in a frame */ +} allocator_record; + +allocator_record *allocation_list = NULL; + +static int16_t *ptr_base_stack = 0; /* Pointer to the bottom of stack (base pointer). Stack grows up. */ +static int16_t *ptr_current_stack = 0; /* Pointer to the current stack pointer */ +static int16_t *ptr_max_stack = 0; /* Pointer to the maximum stack pointer (the farest point from the bottom of stack) */ +static int32_t wc_stack_frame = 0; /* Frame corresponding to the worst-case stack usage */ +static int32_t wc_ram_size, wc_ram_frame; +static int32_t current_heap_size; +static int current_calls = 0; +static char location_max_stack[256] = "undefined"; +static int Num_Records, Max_Num_Records; +static size_t Stat_Cnt_Size = USE_BYTES; +static const char *Count_Unit[] = { "bytes", "words", "words" }; + +static int *list_wc_intra_frame_heap, n_items_wc_intra_frame_heap, max_items_wc_intra_frame_heap, size_wc_intra_frame_heap, location_wc_intra_frame_heap; +static int *list_current_inter_frame_heap, n_items_current_inter_frame_heap, max_items_current_inter_frame_heap, size_current_inter_frame_heap; +static int *list_wc_inter_frame_heap, n_items_wc_inter_frame_heap, max_items_wc_inter_frame_heap, size_wc_inter_frame_heap, location_wc_inter_frame_heap; + +/* Local Functions */ +static unsigned long malloc_hash( const char *func_name, int func_lineno, char *size_str ); +allocator_record *get_mem_record( unsigned long *hash, const char *func_name, int func_lineno, char *size_str, int *index_record ); +static void *mem_alloc_block( size_t size, const char *size_str ); + +/*-------------------------------------------------------------------* + * reset_mem() + * + * Initialize/reset memory counting tool (stack and heap) + *--------------------------------------------------------------------*/ + +void reset_mem( Counting_Size cnt_size ) +{ + int16_t something; + size_t tmp_size; + + /* initialize stack pointers */ + ptr_base_stack = &something; + ptr_max_stack = ptr_base_stack; + ptr_current_stack = ptr_base_stack; + + Stat_Cnt_Size = cnt_size; + + /* Check, if sizeof(int32_t) is 4 bytes */ + tmp_size = sizeof( int32_t ); + if ( tmp_size != 4 ) + { + fprintf( stderr, "Error: Expecting 'int32_t' to be a 32 Bits Integer!" ); + exit( -1 ); + } + + /* create allocation list for malloc() memory blocks */ + if ( allocation_list == NULL ) + { + allocation_list = malloc( MAX_NUM_RECORDS * sizeof( allocator_record ) ); + } + + if ( allocation_list == NULL ) + { + fprintf( stderr, "Error: Unable to Create List of Memory Blocks!" ); + exit( -1 ); + } + + Num_Records = 0; + Max_Num_Records = MAX_NUM_RECORDS; + + wc_ram_size = 0; + wc_ram_frame = -1; + current_heap_size = 0; + + /* heap allocation tree */ + heap_allocation_call_tree_max_size = MAX_NUM_RECORDS; + if ( heap_allocation_call_tree == NULL ) + { + heap_allocation_call_tree = (int *) malloc( heap_allocation_call_tree_max_size * sizeof( int ) ); + memset( heap_allocation_call_tree, -1, heap_allocation_call_tree_max_size * sizeof( int ) ); + } + heap_allocation_call_tree_size = 0; + + /* wc intra-frame heap */ + max_items_wc_intra_frame_heap = MAX_NUM_RECORDS; + if ( list_wc_intra_frame_heap == NULL ) + { + list_wc_intra_frame_heap = (int *) malloc( max_items_wc_intra_frame_heap * sizeof( int ) ); + memset( list_wc_intra_frame_heap, -1, max_items_wc_intra_frame_heap * sizeof( int ) ); + } + n_items_wc_intra_frame_heap = 0; + size_wc_intra_frame_heap = 0; + location_wc_intra_frame_heap = -1; + + /* current inter-frame heap */ + max_items_current_inter_frame_heap = MAX_NUM_RECORDS; + if ( list_current_inter_frame_heap == NULL ) + { + list_current_inter_frame_heap = (int *) malloc( max_items_current_inter_frame_heap * sizeof( int ) ); + memset( list_current_inter_frame_heap, -1, max_items_current_inter_frame_heap * sizeof( int ) ); + } + n_items_current_inter_frame_heap = 0; + size_current_inter_frame_heap = 0; + + /* wc inter-frame heap */ + max_items_wc_inter_frame_heap = MAX_NUM_RECORDS; + if ( list_wc_inter_frame_heap == NULL ) + { + list_wc_inter_frame_heap = (int *) malloc( max_items_wc_inter_frame_heap * sizeof( int ) ); + memset( list_wc_inter_frame_heap, -1, max_items_wc_inter_frame_heap * sizeof( int ) ); + } + n_items_wc_inter_frame_heap = 0; + size_wc_inter_frame_heap = 0; + location_wc_inter_frame_heap = -1; + +#ifdef MEM_COUNT_DETAILS + /* Check, if the .csv file has already been opened */ + if ( fid_csv_filename == NULL ) + { + fid_csv_filename = fopen( csv_filename, "wb" ); + + if ( fid_csv_filename == NULL ) + { + fprintf( stderr, "\nCannot open %s!\n\n", csv_filename ); + exit( -1 ); + } + } + else + { + /* reset file */ + rewind( fid_csv_filename ); + } +#endif + + return; +} + +/*-------------------------------------------------------------------* + * reset_stack() + * + * Reset stack pointer + *--------------------------------------------------------------------*/ + +void reset_stack( void ) +{ + int16_t something; + + /* initialize/reset stack pointers */ + ptr_base_stack = &something; + ptr_max_stack = ptr_base_stack; + ptr_current_stack = ptr_base_stack; + + return; +} + +/*-------------------------------------------------------------------* + * push_stack() + * + * Check the current stack pointer and update the maximum stack pointer, if new maximum found. + *--------------------------------------------------------------------*/ + +int push_stack( const char *filename, const char *fctname ) +{ + int16_t something; + int32_t current_stack_size; + + ptr_current_stack = &something; + + (void) *filename; /* to avoid compilation warning */ + + /* Is there room to save the caller's information? */ + if ( current_calls >= MAX_RECORDABLE_CALLS ) + { /* No */ + fprintf( stderr, "No more room to store call stack info. Please increase MAX_RECORDABLE_CALLS" ); + exit( -1 ); + } + + /* Valid Function Name? */ + if ( fctname[0] == 0 ) + { /* No */ + fprintf( stderr, "Invalid function name for call stack info." ); + exit( -1 ); + } + + /* Save the Name of the Calling Function in the Table */ + strncpy( stack_callers[0][current_calls].function_name, fctname, MAX_FUNCTION_NAME_LENGTH ); + stack_callers[0][current_calls].function_name[MAX_FUNCTION_NAME_LENGTH] = 0; /* Nul Terminate */ + + /* Save the Stack Pointer */ + stack_callers[0][current_calls].stack_ptr = ptr_current_stack; + + /* Increase Stack Calling Tree Level */ + current_calls++; + + /* Is this the First Time or the Worst Case? */ + if ( ptr_current_stack < ptr_max_stack || ptr_max_stack == NULL ) + { /* Yes */ + /* Save Info about it */ + ptr_max_stack = ptr_current_stack; + + wc_stack_frame = update_cnt; /* current frame number is stored in the variable update_cnt and updated in the function update_wmops() */ + strncpy( location_max_stack, fctname, sizeof( location_max_stack ) - 1 ); + location_max_stack[sizeof( location_max_stack ) - 1] = '\0'; + + /* Save Call Tree */ + memmove( stack_callers[1], stack_callers[0], sizeof( caller_info ) * current_calls ); + + /* Terminate the List (Unless Full) */ + if ( current_calls < MAX_RECORDABLE_CALLS ) + { + stack_callers[1][current_calls].function_name[0] = 0; + } + } + + /* Check, if This is the New Worst-Case RAM (stack + heap) */ + current_stack_size = (int32_t) ( ( ( ptr_base_stack - ptr_current_stack ) * sizeof( int16_t ) ) ); + + if ( current_stack_size < 0 ) + { + /* prevent negative stack size */ + current_stack_size = 0; + } + + if ( current_stack_size + current_heap_size > wc_ram_size ) + { + wc_ram_size = current_stack_size + current_heap_size; + wc_ram_frame = update_cnt; + } + + return 0 /* for Now */; +} + +/*-------------------------------------------------------------------* + * pop_stack() + * + * Remove stack caller entry from the list + *--------------------------------------------------------------------*/ + +int pop_stack( const char *filename, const char *fctname ) +{ + caller_info *caller_info_ptr; + + (void) *filename; /* to avoid compilation warning */ + + /* Decrease Stack Calling */ + current_calls--; + + /* Get Pointer to Caller Information */ + caller_info_ptr = &stack_callers[0][current_calls]; + + /* Check, if Names Match */ + if ( strncmp( caller_info_ptr->function_name, fctname, MAX_FUNCTION_NAME_LENGTH ) != 0 ) + { + fprintf( stderr, "Invalid usage of pop_stack()" ); + exit( -1 ); + } + + /* Erase Entry */ + caller_info_ptr->function_name[0] = 0; + + /* Retrieve previous stack pointer */ + if ( current_calls == 0 ) + { + ptr_current_stack = ptr_base_stack; + } + else + { + ptr_current_stack = stack_callers[0][current_calls - 1].stack_ptr; + } + + return 0 /* for Now */; +} + +#ifdef MEM_COUNT_DETAILS +/*-------------------------------------------------------------------* + * print_stack_call_tree() + * + * Print detailed information about worst-case stack usage + *--------------------------------------------------------------------*/ + +static void print_stack_call_tree( void ) +{ + caller_info *caller_info_ptr; + int call_level; + char fctname[MAX_FUNCTION_NAME_LENGTH + 1]; + + fprintf( stdout, "\nList of functions when maximum stack size is reached:\n\n" ); + + caller_info_ptr = &stack_callers[1][0]; + for ( call_level = 0; call_level < MAX_RECORDABLE_CALLS; call_level++ ) + { + /* Done? */ + if ( caller_info_ptr->function_name[0] == 0 ) + { + break; + } + + /* Print Name */ + strncpy( fctname, caller_info_ptr->function_name, MAX_FUNCTION_NAME_LENGTH ); + strcat( fctname, "()" ); + fprintf( stdout, "%-42s", fctname ); + + /* Print Stack Usage (Based on Difference) */ + if ( call_level != 0 ) + { + fprintf( stdout, "%lu %s\n", ( ( ( caller_info_ptr - 1 )->stack_ptr - caller_info_ptr->stack_ptr ) * sizeof( int16_t ) ) >> Stat_Cnt_Size, Count_Unit[Stat_Cnt_Size] ); + } + else + { + fprintf( stdout, "%lu %s\n", ( ( ptr_base_stack - caller_info_ptr->stack_ptr ) * sizeof( int16_t ) ) >> Stat_Cnt_Size, Count_Unit[Stat_Cnt_Size] ); + } + + /* Advance */ + caller_info_ptr++; + } + + fprintf( stdout, "\n" ); + + return; +} +#endif + + +/*-------------------------------------------------------------------* + * mem_alloc() + * + * Creates new record, stores auxiliary information about which function allocated the memory, line number, parameters, etc. + * Finally, it allocates physical memory using malloc() + * The function also updates worst-case heap size and worst-case RAM size + *--------------------------------------------------------------------*/ + +void *mem_alloc( + const char *func_name, + int func_lineno, + size_t size, + char *size_str /* the first char indicates m-alloc or c-alloc */ ) +{ + int index_record; + int32_t current_stack_size; + unsigned long hash; + allocator_record *ptr_record; + + if ( size == 0 ) + { + fprintf( stderr, "Fct=%s, Ln=%i: %s!\n", func_name, func_lineno, "Size of Zero not Supported" ); + exit( -1 ); + } + + /* Search for an existing record (that has been de-allocated before) */ + index_record = 0; + while ( ( ptr_record = get_mem_record( &hash, func_name, func_lineno, size_str, &index_record ) ) != NULL ) + { + if ( ptr_record->frame_allocated == -1 ) + { + break; + } + else + { + index_record++; + } + } + + /* Create new record */ + if ( ptr_record == NULL ) + { + if ( Num_Records >= Max_Num_Records ) + { + /* There is no room for a new record -> reallocate memory */ + Max_Num_Records += MAX_NUM_RECORDS_REALLOC_STEP; + allocation_list = realloc( allocation_list, Max_Num_Records * sizeof( allocator_record ) ); + } + + ptr_record = &( allocation_list[Num_Records] ); + + /* Initialize new record */ + ptr_record->hash = hash; + ptr_record->noccurances = 0; + ptr_record->total_block_size = 0; + ptr_record->total_used_size = 0; + ptr_record->frame_allocated = -1; + ptr_record->OOB_Flag = 0; + ptr_record->wc_heap_size_intra_frame = -1; + ptr_record->wc_heap_size_inter_frame = -1; + + index_record = Num_Records; + Num_Records++; + } + + /* Allocate memory block for the new record, add signature before the beginning and after the memory block and fill it with magic value */ + ptr_record->block_ptr = mem_alloc_block( size, size_str ); + + if ( ptr_record->block_ptr == NULL ) + { + fprintf( stderr, "Fct=%s, Ln=%i: %s!\n", func_name, func_lineno, "Error: Cannot Allocate Memory!" ); + exit( -1 ); + } + + /* Save all auxiliary information about the memory block */ + strncpy( ptr_record->name, func_name, MAX_FUNCTION_NAME_LENGTH ); + ptr_record->name[MAX_FUNCTION_NAME_LENGTH] = '\0'; + strncpy( ptr_record->params, size_str, MAX_PARAMS_LENGTH ); /* Note: The size string starts with either 'm' or 'c' to indicate 'm'alloc or 'c'alloc */ + ptr_record->params[MAX_PARAMS_LENGTH] = '\0'; + ptr_record->lineno = func_lineno; + ptr_record->block_size = size; + ptr_record->total_block_size += size; + +#ifdef MEM_COUNT_DETAILS + /* Export heap memory allocation record to the .csv file */ + fprintf( fid_csv_filename, "A,%d,%s,%d,%d\n", update_cnt, ptr_record->name, ptr_record->lineno, ptr_record->block_size ); +#endif + + if ( ptr_record->frame_allocated != -1 ) + { + fprintf( stderr, "Fct=%s, Ln=%i: %s!\n", func_name, func_lineno, "Error: Attempt to Allocate the Same Memory Block with Freeing it First!" ); + exit( -1 ); + } + + ptr_record->frame_allocated = update_cnt; /* Store the current frame number -> later it will be used to determine the total duration */ + + /* Update Heap Size in the current frame */ + current_heap_size += ptr_record->block_size; + + /* Check, if this is the new Worst-Case RAM (stack + heap) */ + current_stack_size = (int32_t) ( ( ( ptr_base_stack - ptr_current_stack ) * sizeof( int16_t ) ) ); + if ( current_stack_size + current_heap_size > wc_ram_size ) + { + wc_ram_size = current_stack_size + current_heap_size; + wc_ram_frame = update_cnt; + } + + /* Add new entry to the heap allocation call tree */ + if ( heap_allocation_call_tree == NULL ) + { + fprintf( stderr, "Error: Heap allocation call tree not created!" ); + exit( -1 ); + } + + /* check, if the maximum size of the call tree has been reached -> resize if so */ + if ( heap_allocation_call_tree_size >= heap_allocation_call_tree_max_size ) + { + heap_allocation_call_tree_max_size += MAX_NUM_RECORDS_REALLOC_STEP; + heap_allocation_call_tree = (int *) realloc( heap_allocation_call_tree, heap_allocation_call_tree_max_size * sizeof( int ) ); + } + + /* push new entry (positive number means push op, neagtive number means pop op; zero index must be converted to 0.01 :-) */ + heap_allocation_call_tree[heap_allocation_call_tree_size++] = index_record; + + return ptr_record->block_ptr; +} + +/*-------------------------------------------------------------------* + * mem_alloc_block() + * + * Physical allocation of memory using malloc(). Appends 'signature' before and after the block, + * pre-fills memory block with magic value + *--------------------------------------------------------------------*/ + +static void *mem_alloc_block( size_t size, const char *size_str ) +{ + size_t rounded_size; + void *block_ptr; + char *tmp_ptr; + size_t n, f; + int32_t fill_value; + int32_t *ptr32; + int32_t mask, temp; + + /* Round Up Block Size */ + rounded_size = ROUND_BLOCK_SIZE( size ); + + /* Allocate memory using the standard malloc() by adding room for Signature Values */ + block_ptr = malloc( rounded_size + BLOCK_ROUNDING * 2 ); + + if ( block_ptr == NULL ) + { + return NULL; + } + + /* Add Signature Before the Start of the Block */ + ptr32 = (int32_t *) block_ptr; + n = N_32BITS_BLOCKS; + do + { + *ptr32++ = MAGIC_VALUE_OOB; + } while ( --n ); + + /* Fill Memory Block with Magic Value or 0 */ + fill_value = MAGIC_VALUE_USED; + if ( IS_CALLOC( size_str ) ) + { + fill_value = 0x00000000; + } + n = size / sizeof( int32_t ); + while ( n-- ) + { + *ptr32++ = fill_value; + } + + /* Fill the Reminder of the Memory Block - After Rounding */ + n = rounded_size - size; + f = n % sizeof( int32_t ); + if ( f != 0 ) + { + /* when filling with '0' need to adapt the magic value */ + /* shift by [1->24, 2->16, 3->8] */ + mask = 0xFFFFFFFF << ( ( sizeof( int32_t ) - f ) * 8 ); /* (1) */ + temp = MAGIC_VALUE_OOB & mask; + if ( fill_value != 0x0 ) + { /* for malloc merge fill value */ + temp += ( ~mask ) & MAGIC_VALUE_USED; + } /* for calloc the code in (1) above already introduces zeros */ + *ptr32++ = temp; + } + n /= sizeof( int32_t ); + n += N_32BITS_BLOCKS; + + /* Add Signature After the End of Block */ + do + { + *ptr32++ = MAGIC_VALUE_OOB; + } while ( --n ); + + /* Adjust the Memory Block Pointer (Magic Value Before and After the Memory Block Requested) */ + tmp_ptr = (char *) block_ptr; + tmp_ptr += BLOCK_ROUNDING; + block_ptr = (void *) tmp_ptr; + + return block_ptr; +} + +/*-------------------------------------------------------------------* + * mem_set_usage() + * + * Calculates actual usage of memory block by checking the magic value that was used to pre-fill + * each memory block during its allocation + *--------------------------------------------------------------------*/ + +static int mem_set_usage( allocator_record *record_ptr ) +{ + int total_bytes_used; + + size_t n; + int32_t *ptr32; + char *ptr8; + size_t total_bytes; + int32_t fill_value; + + fill_value = MAGIC_VALUE_USED; + if ( ( record_ptr->params[0] ) == 'c' ) + { + fill_value = 0x00000000; + } + + total_bytes = record_ptr->block_size; + + /* Check 4 bytes at a time */ + ptr32 = (int32_t *) record_ptr->block_ptr; + total_bytes_used = 0; + for ( n = total_bytes / sizeof( int32_t ); n > 0; n-- ) + { + if ( *ptr32++ != fill_value ) + { + total_bytes_used += sizeof( int32_t ); + } + } + + /* Check remaining bytes (If Applicable) 1 byte at a time */ + ptr8 = (char *) ptr32; + for ( n = total_bytes % sizeof( int32_t ); n > 0; n-- ) + { + if ( *ptr8++ != (char) fill_value ) + { + total_bytes_used++; + } + + /* Update Value */ + fill_value >>= 8; + } + + return total_bytes_used; +} + +/*-------------------------------------------------------------------* + * mem_check_OOB() + * + * Checks, if out-of-bounds access has occured. This is done by inspecting the 'signature' value + * taht has been added before and after the memory block during its allocation + *--------------------------------------------------------------------*/ + +static unsigned int mem_check_OOB( allocator_record *record_ptr ) +{ + int32_t *ptr32; + unsigned int OOB_Flag = 0x0; + int32_t mask; + size_t i; + int f; + + ptr32 = (int32_t *) record_ptr->block_ptr - N_32BITS_BLOCKS; + + /* Check the Signature at the Beginning of Memory Block */ + i = N_32BITS_BLOCKS; + do + { + if ( *ptr32++ ^ MAGIC_VALUE_OOB ) + { + OOB_Flag |= OOB_START; + } + } while ( --i ); + + /* Advance to End (Snap to lowest 32 Bits) */ + ptr32 += record_ptr->block_size / sizeof( int32_t ); + + /* Calculate Unused Space That has been added to get to the rounded Block Size */ + i = ROUND_BLOCK_SIZE( record_ptr->block_size ) - record_ptr->block_size; + + /* Partial Check of Signature at the End of Memory Block (for block size that has been rounded) */ + f = i % sizeof( int32_t ); + if ( f != 0 ) + { + mask = 0xFFFFFFFF << ( ( sizeof( int32_t ) - f ) * 8 ); + if ( ( *ptr32++ ^ MAGIC_VALUE_OOB ) & mask ) + { + OOB_Flag |= OOB_END; + } + } + + /* Full Check of Signature at the End of Memory Block, i.e. all 32 Bits (for the remainder after rounding) */ + i /= sizeof( int32_t ); + i += N_32BITS_BLOCKS; + do + { + if ( *ptr32++ ^ MAGIC_VALUE_OOB ) + { + OOB_Flag |= OOB_END; + } + } while ( --i ); + + return OOB_Flag; +} + +/*-------------------------------------------------------------------* + * malloc_hash() + * + * Calculate hash from function name, line number and malloc size + *--------------------------------------------------------------------*/ + +static unsigned long malloc_hash( const char *func_name, int func_lineno, char *size_str ) +{ + unsigned long hash = 5381; + const char *ptr_str; + + ptr_str = func_name; + while ( ptr_str != NULL && *ptr_str != '\0' ) + { + hash = ( ( hash << 5 ) + hash ) + *ptr_str++; /* hash * 33 + char */ + } + + hash = ( ( hash << 5 ) + hash ) + func_lineno; /* hash * 33 + func_lineno */ + + ptr_str = size_str; + while ( ptr_str != NULL && *ptr_str != '\0' ) + { + hash = ( ( hash << 5 ) + hash ) + *ptr_str++; /* hash * 33 + char */ + } + + return hash; +} + +/*-------------------------------------------------------------------* + * get_mem_record() + * + * Search for memory record in the internal list, return NULL if not found + * Start from index_record + *--------------------------------------------------------------------*/ + +allocator_record *get_mem_record( unsigned long *hash, const char *func_name, int func_lineno, char *size_str, int *index_record ) +{ + int i; + + if ( *index_record < 0 || *index_record > Num_Records ) + { + return NULL; + } + + /* calculate hash */ + *hash = malloc_hash( func_name, func_lineno, size_str ); + + for ( i = *index_record; i < Num_Records; i++ ) + { + /* check, if memory block is not allocated at the moment and the hash matches */ + if ( allocation_list[i].block_ptr == NULL && *hash == allocation_list[i].hash ) + { + *index_record = i; + return &( allocation_list[i] ); + } + } + + /* not found */ + *index_record = -1; + return NULL; +} + + +/*-------------------------------------------------------------------* + * mem_free() + * + * This function de-allocatesd the memory block and frees the mphysical memory with free(). + * It also updates actual and average usage of the memory block. + * + * Note: The record is not removed from the list and may be reused later on in mem_alloc()! + *--------------------------------------------------------------------*/ + +void mem_free( const char *func_name, int func_lineno, void *ptr ) +{ + int i, index_record; + char *tmp_ptr; + allocator_record *ptr_record; + + /* Search for the Block Pointer in the List */ + ptr_record = NULL; + index_record = -1; + for ( i = 0; i < Num_Records; i++ ) + { + if ( ptr == allocation_list[i].block_ptr ) + { /* Yes, Found it */ + ptr_record = &( allocation_list[i] ); + index_record = i; + break; + } + } + + if ( ptr_record == NULL ) + { + fprintf( stderr, "Fct=%s, Ln=%i: %s!\n", func_name, func_lineno, "Error: Unable to Find Record Corresponding to the Allocated Memory Block!" ); + exit( -1 ); + } + + /* Update the Heap Size */ + current_heap_size -= ptr_record->block_size; + + /* Calculate the Actual Usage of the Memory Block (Look for Signature) */ + ptr_record->total_used_size += mem_set_usage( ptr_record ); + + /* Check, if Out-Of-Bounds Access has been Detected */ + ptr_record->OOB_Flag = mem_check_OOB( ptr_record ); + +#ifdef MEM_COUNT_DETAILS + /* Export heap memory de-allocation record to the .csv file */ + fprintf( fid_csv_filename, "D,%d,%s,%d,%d\n", update_cnt, ptr_record->name, ptr_record->lineno, ptr_record->block_size ); +#endif + + /* De-Allocate Memory Block */ + tmp_ptr = (char *) ptr; + tmp_ptr -= BLOCK_ROUNDING; + ptr = (void *) tmp_ptr; + free( ptr ); + + /* Add new entry to the heap allocation call tree */ + if ( heap_allocation_call_tree == NULL ) + { + fprintf( stderr, "Error: Heap allocation call tree not created!" ); + exit( -1 ); + } + + /* check, if the maximum size of the call tree has been reached -> resize if so */ + if ( heap_allocation_call_tree_size >= heap_allocation_call_tree_max_size ) + { + heap_allocation_call_tree_max_size += MAX_NUM_RECORDS_REALLOC_STEP; + heap_allocation_call_tree = (int *) realloc( heap_allocation_call_tree, heap_allocation_call_tree_max_size * sizeof( int ) ); + } + + heap_allocation_call_tree[heap_allocation_call_tree_size++] = -index_record; + + /* Reset memory block pointer (this is checked when updating wc intra-frame and inter-frame memory) */ + ptr_record->block_ptr = NULL; + + return; +} + + +/*-------------------------------------------------------------------* + * update_mem() + * + * This function updates the worst-case intra-frame memory and the worst-case inter-frame memory. + *--------------------------------------------------------------------*/ + +void update_mem( void ) +{ + int i, j, flag_alloc = -1, i_record; + int size_current_intra_frame_heap; + int *list_current_intra_frame_heap = NULL, n_items_current_intra_frame_heap; + allocator_record *ptr_record; + + /* process the heap allocation call tree and prepare lists of intra-frame and inter-frame heap memory blocks for this frame */ + n_items_current_intra_frame_heap = 0; + size_current_intra_frame_heap = 0; + for ( i = 0; i < heap_allocation_call_tree_size; i++ ) + { + /* get the record */ + i_record = heap_allocation_call_tree[i]; + + if ( i_record > 0 ) + { + flag_alloc = 1; + } + else if ( i_record < 0 ) + { + flag_alloc = 0; + i_record = -i_record; + } + ptr_record = &( allocation_list[i_record] ); + + if ( ptr_record->frame_allocated == update_cnt && ptr_record->block_ptr == NULL ) + { + /* intra-frame heap memory */ + if ( list_current_intra_frame_heap == NULL ) + { + list_current_intra_frame_heap = (int *) malloc( heap_allocation_call_tree_size * sizeof( int ) ); + memset( list_current_intra_frame_heap, -1, heap_allocation_call_tree_size * sizeof( int ) ); + } + + /* zero index doesn't have sign to determine whether it's allocated or de-allocated -> we need to search the list */ + if ( i_record == 0 ) + { + flag_alloc = 1; + for ( j = 0; j < n_items_current_intra_frame_heap; j++ ) + { + if ( list_current_intra_frame_heap[j] == i_record ) + { + flag_alloc = 0; + break; + } + } + } + + if ( flag_alloc ) + { + /* add to list */ + list_current_intra_frame_heap[n_items_current_intra_frame_heap++] = i_record; + size_current_intra_frame_heap += ptr_record->block_size; + + /* no need to re-size the list -> the initially allocated size should be large enough */ + } + else + { + /* remove from list */ + for ( j = 0; j < n_items_current_intra_frame_heap; j++ ) + { + if ( list_current_intra_frame_heap[j] == i_record ) + { + break; + } + } + memmove( &list_current_intra_frame_heap[j], &list_current_intra_frame_heap[j + 1], ( n_items_current_intra_frame_heap - j ) * sizeof( int ) ); + n_items_current_intra_frame_heap--; + size_current_intra_frame_heap -= ptr_record->block_size; + + /* reset block size */ + ptr_record->frame_allocated = -1; + ptr_record->block_size = 0; + } + } + else + { + /* inter-frame heap memory */ + + /* zero index doesn't have sign to determine whether it's allocated or de-allocated -> we need to search the list */ + if ( i_record == 0 ) + { + flag_alloc = 1; + for ( j = 0; j < n_items_current_inter_frame_heap; j++ ) + { + if ( list_current_inter_frame_heap[j] == i_record ) + { + flag_alloc = 0; + break; + } + } + } + + if ( flag_alloc ) + { + /* add to list */ + if ( n_items_current_inter_frame_heap >= max_items_current_inter_frame_heap ) + { + /* resize list, if needed */ + max_items_current_inter_frame_heap = n_items_current_inter_frame_heap + MAX_NUM_RECORDS_REALLOC_STEP; + list_current_inter_frame_heap = realloc( list_current_inter_frame_heap, max_items_current_inter_frame_heap * sizeof( int ) ); + } + + list_current_inter_frame_heap[n_items_current_inter_frame_heap++] = i_record; + size_current_inter_frame_heap += ptr_record->block_size; + } + else + { + /* remove from list */ + for ( j = 0; j < n_items_current_inter_frame_heap; j++ ) + { + if ( list_current_inter_frame_heap[j] == i_record ) + { + break; + } + } + memmove( &list_current_inter_frame_heap[j], &list_current_inter_frame_heap[j + 1], ( n_items_current_inter_frame_heap - j ) * sizeof( int ) ); + n_items_current_inter_frame_heap--; + size_current_inter_frame_heap -= ptr_record->block_size; + + /* reset block size */ + ptr_record->frame_allocated = -1; + ptr_record->block_size = 0; + } + } + } + + /* check, if this is the new worst-case for intra-frame heap memory */ + if ( size_current_intra_frame_heap > size_wc_intra_frame_heap ) + { + if ( n_items_current_intra_frame_heap >= max_items_wc_intra_frame_heap ) + { + /* resize the list, if needed */ + max_items_wc_intra_frame_heap = n_items_current_intra_frame_heap + MAX_NUM_RECORDS_REALLOC_STEP; + list_wc_intra_frame_heap = realloc( list_wc_intra_frame_heap, max_items_wc_intra_frame_heap * sizeof( int ) ); + } + + /* copy current-frame list to worst-case list */ + memmove( list_wc_intra_frame_heap, list_current_intra_frame_heap, n_items_current_intra_frame_heap * sizeof( int ) ); + n_items_wc_intra_frame_heap = n_items_current_intra_frame_heap; + size_wc_intra_frame_heap = size_current_intra_frame_heap; + location_wc_intra_frame_heap = update_cnt; + + /* update the wc numbers in all individual records */ + for ( i = 0; i < n_items_wc_intra_frame_heap; i++ ) + { + i_record = list_wc_intra_frame_heap[i]; + ptr_record = &( allocation_list[i_record] ); + ptr_record->wc_heap_size_intra_frame = ptr_record->block_size; + } + } + + /* check, if this is the new worst-case for inter-frame heap memory */ + if ( size_current_inter_frame_heap > size_wc_inter_frame_heap ) + { + if ( n_items_current_inter_frame_heap >= max_items_wc_inter_frame_heap ) + { + /* resize list, if needed */ + max_items_wc_inter_frame_heap = n_items_current_inter_frame_heap + MAX_NUM_RECORDS_REALLOC_STEP; + list_wc_inter_frame_heap = realloc( list_wc_inter_frame_heap, max_items_wc_inter_frame_heap * sizeof( int ) ); + } + + /* copy current-frame list to worst-case list */ + memmove( list_wc_inter_frame_heap, list_current_inter_frame_heap, n_items_current_inter_frame_heap * sizeof( int ) ); + n_items_wc_inter_frame_heap = n_items_current_inter_frame_heap; + size_wc_inter_frame_heap = size_current_inter_frame_heap; + location_wc_inter_frame_heap = update_cnt; + + /* update the wc numbers in all individual records */ + for ( i = 0; i < n_items_wc_inter_frame_heap; i++ ) + { + i_record = list_wc_inter_frame_heap[i]; + ptr_record = &( allocation_list[i_record] ); + ptr_record->wc_heap_size_inter_frame = ptr_record->block_size; + } + } + + /* reset heap allocation call tree */ + heap_allocation_call_tree_size = 0; + + /* de-allocate list of intra-frame heap memory blocks in the current fraeme - it's needed only inside this function */ + if ( list_current_intra_frame_heap ) + { + free( list_current_intra_frame_heap ); + } + + return; +} + +#ifdef MEM_COUNT_DETAILS +/*-------------------------------------------------------------------* + * subst() + * + * Substitute character in string + *--------------------------------------------------------------------*/ + +static void subst( char *s, char from, char to ) +{ + while ( *s == from ) + { + *s++ = to; + } + + return; +} + + +/*-------------------------------------------------------------------* + * mem_count_summary() + * + * Print detailed (per-item) information about heap memory usage + *--------------------------------------------------------------------*/ + +static void mem_count_summary( void ) +{ + int i, j, index, index_record; + size_t length; + char buf[300], format_str[50], name_str[MAX_FUNCTION_NAME_LENGTH + 3], parms_str[MAX_PARAMS_LENGTH + 1], type_str[10], usage_str[20], size_str[20], line_str[10]; + allocator_record *ptr_record, *ptr; + + /* Prepare format string */ + sprintf( format_str, "%%-%ds %%5s %%6s %%-%ds %%20s %%6s ", MAX_FUNCTION_NAME_LENGTH, MAX_PARAMS_LENGTH ); + + if ( n_items_wc_intra_frame_heap > 0 ) + { + /* Intra-Frame Heap Size */ + fprintf( stdout, "\nList of memory blocks when maximum intra-frame heap size is reached:\n\n" ); + + /* Find duplicate records (same hash and worst-case heap size) */ + for ( i = 0; i < n_items_wc_intra_frame_heap; i++ ) + { + index_record = list_wc_intra_frame_heap[i]; + if ( index_record == -1 ) + { + continue; + } + + ptr_record = &( allocation_list[index_record] ); + for ( j = i + 1; j < n_items_wc_intra_frame_heap; j++ ) + { + index = list_wc_intra_frame_heap[j]; + if ( index == -1 ) + { + continue; + } + ptr = &( allocation_list[index] ); + + if ( ptr->hash == ptr_record->hash && ptr->wc_heap_size_intra_frame == ptr_record->wc_heap_size_intra_frame ) + { + ptr_record->noccurances++; + list_wc_intra_frame_heap[j] = -1; + } + } + } + + /* Print Header */ + sprintf( buf, format_str, "Function Name", "Line", "Type", "Function Parameters", "Maximum Size", "Usage" ); + puts( buf ); + length = strlen( buf ); + sprintf( buf, "%0*d\n", (int) length - 1, 0 ); + subst( buf, '0', '-' ); + puts( buf ); + + for ( i = 0; i < n_items_wc_intra_frame_heap; i++ ) + { + index_record = list_wc_intra_frame_heap[i]; + + if ( index_record != -1 ) + { + /* get the record */ + ptr_record = &( allocation_list[index_record] ); + + /* prepare information strings */ + strncpy( name_str, ptr_record->name, MAX_FUNCTION_NAME_LENGTH ); + strcat( name_str, "()" ); + name_str[MAX_FUNCTION_NAME_LENGTH] = '\0'; + strncpy( parms_str, &( ptr_record->params[2] ), MAX_PARAMS_LENGTH ); + parms_str[MAX_PARAMS_LENGTH] = '\0'; + + if ( ptr_record->params[0] == 'm' ) + { + strcpy( type_str, "malloc" ); + } + else + { + strcpy( type_str, "calloc" ); + } + + sprintf( line_str, "%d", ptr_record->lineno ); + + /* prepare average usage & memory size strings */ + sprintf( usage_str, "%d%%", (int) ( ( (float) ptr_record->total_used_size / ( ptr_record->total_block_size + 1 ) ) * 100.0f ) ); + + if ( ptr_record->noccurances > 1 ) + { + sprintf( size_str, "%dx%d %s", ptr_record->noccurances, (int) ( ptr_record->wc_heap_size_intra_frame >> Stat_Cnt_Size ), Count_Unit[Stat_Cnt_Size] ); + } + else + { + sprintf( size_str, "%d %s", (int) ( ptr_record->wc_heap_size_intra_frame >> Stat_Cnt_Size ), Count_Unit[Stat_Cnt_Size] ); + } + + sprintf( buf, format_str, name_str, line_str, type_str, parms_str, size_str, usage_str ); + puts( buf ); + } + } + + fprintf( stdout, "\n" ); + } + + if ( n_items_wc_inter_frame_heap > 0 ) + { + /* Inter-Frame Heap Size */ + fprintf( stdout, "\nList of memory blocks when maximum inter-frame heap size is reached:\n\n" ); + + /* Find duplicate records (same hash and worst-case heap size) */ + for ( i = 0; i < n_items_wc_inter_frame_heap; i++ ) + { + index_record = list_wc_inter_frame_heap[i]; + if ( index_record == -1 ) + { + continue; + } + ptr_record = &( allocation_list[index_record] ); + ptr_record->noccurances = 1; /* reset the counter as some blocks may have been both, intra-frame and inter-frame */ + for ( j = i + 1; j < n_items_wc_inter_frame_heap; j++ ) + { + index = list_wc_inter_frame_heap[j]; + if ( index == -1 ) + { + continue; + } + ptr = &( allocation_list[index] ); + + if ( ptr->hash == ptr_record->hash && ptr->wc_heap_size_inter_frame == ptr_record->wc_heap_size_inter_frame ) + { + ptr_record->noccurances++; + list_wc_inter_frame_heap[j] = -1; + } + } + } + + /* Print Header */ + sprintf( buf, format_str, "Function Name", "Line", "Type", "Function Parameters", "Memory Size", "Usage" ); + puts( buf ); + length = strlen( buf ); + sprintf( buf, "%0*d\n", (int) length - 1, 0 ); + subst( buf, '0', '-' ); + puts( buf ); + + for ( i = 0; i < n_items_wc_inter_frame_heap; i++ ) + { + index_record = list_wc_inter_frame_heap[i]; + + if ( index_record != -1 ) + { + /* get the record */ + ptr_record = &( allocation_list[index_record] ); + + /* prepare information strings */ + strncpy( name_str, ptr_record->name, MAX_FUNCTION_NAME_LENGTH ); + strcat( name_str, "()" ); + name_str[MAX_FUNCTION_NAME_LENGTH] = '\0'; + strncpy( parms_str, &( ptr_record->params[2] ), MAX_PARAMS_LENGTH ); + parms_str[MAX_PARAMS_LENGTH] = '\0'; + + if ( ptr_record->params[0] == 'm' ) + { + strcpy( type_str, "malloc" ); + } + else + { + strcpy( type_str, "calloc" ); + } + + sprintf( line_str, "%d", ptr_record->lineno ); + + /* prepare average usage & memory size strings */ + sprintf( usage_str, "%d%%", (int) ( ( (float) ptr_record->total_used_size / ( ptr_record->total_block_size + 0.1f ) ) * 100.0f + 0.5f ) ); + + if ( ptr_record->noccurances > 1 ) + { + sprintf( size_str, "%dx%d %s", ptr_record->noccurances, (int) ( ptr_record->wc_heap_size_inter_frame >> Stat_Cnt_Size ), Count_Unit[Stat_Cnt_Size] ); + } + else + { + sprintf( size_str, "%d %s", (int) ( ptr_record->wc_heap_size_inter_frame >> Stat_Cnt_Size ), Count_Unit[Stat_Cnt_Size] ); + } + + sprintf( buf, format_str, name_str, line_str, type_str, parms_str, size_str, usage_str ); + puts( buf ); + } + } + + fprintf( stdout, "\n" ); + } + + return; +} + +#endif + +/*-------------------------------------------------------------------* + * print_mem() + * + * Print information about ROM and RAM memory usage + *--------------------------------------------------------------------*/ + +void print_mem( ROM_Size_Lookup_Table Const_Data_PROM_Table[] ) +{ + int i, nElem; + + fprintf( stdout, "\n\n --- Memory usage --- \n\n" ); + + if ( Const_Data_PROM_Table != NULL ) + { + nElem = 0; + while ( strcmp( Const_Data_PROM_Table[nElem].file_spec, "" ) != 0 ) + nElem++; + + for ( i = 0; i < nElem; i++ ) + { + fprintf( stdout, "Program ROM size (%s): %d instruction words\n", Const_Data_PROM_Table[i].file_spec, Const_Data_PROM_Table[i].PROM_size ); + } + + for ( i = 0; i < nElem; i++ ) + { + if ( Const_Data_PROM_Table[i].Get_Const_Data_Size_Func == NULL ) + { + fprintf( stdout, "Error: Cannot retrieve or calculate Table ROM size of (%s)!\n", Const_Data_PROM_Table[i].file_spec ); + } + + fprintf( stdout, "Table ROM (const data) size (%s): %d %s\n", Const_Data_PROM_Table[i].file_spec, Const_Data_PROM_Table[i].Get_Const_Data_Size_Func() >> Stat_Cnt_Size, Count_Unit[Stat_Cnt_Size] ); + } + } + else + { + fprintf( stdout, "Program ROM size: not available\n" ); + fprintf( stdout, "Table ROM (const data) size: not available\n" ); + } + + if ( wc_ram_size > 0 ) + { + fprintf( stdout, "Maximum RAM (stack + heap) size: %d %s in frame %d\n", wc_ram_size >> Stat_Cnt_Size, Count_Unit[Stat_Cnt_Size], wc_ram_frame ); + } + else + { + fprintf( stdout, "Maximum RAM (stack + heap) size: not available\n" ); + } + + /* check, if the stack is empty */ + if ( ptr_current_stack != ptr_base_stack ) + { + fprintf( stderr, "Warning: Stack is not empty.\n" ); + } + + if ( ptr_base_stack - ptr_max_stack > 0 ) + { + fprintf( stdout, "Maximum stack size: %lu %s in frame %d\n", ( ( ptr_base_stack - ptr_max_stack ) * sizeof( int16_t ) ) >> Stat_Cnt_Size, Count_Unit[Stat_Cnt_Size], + wc_stack_frame ); + } + else + { + fprintf( stdout, "Maximum stack size: not available\n" ); + } + + /* last update of intra-frame memory and inter-frame memory, if needed */ + if ( heap_allocation_call_tree_size > 0 ) + { + update_mem(); + } + + /* check, if all memory blocks have been deallocated (freed) */ + for ( i = 0; i < Num_Records; i++ ) + { + if ( allocation_list[i].block_ptr != NULL ) + { + fprintf( stderr, "Fct=%s, Ln=%i: %s!\n", allocation_list[i].name, allocation_list[i].lineno, "Error: Memory Block has not been De-Allocated with free()!" ); + exit( -1 ); + } + } + + if ( n_items_wc_intra_frame_heap > 0 ) + { + fprintf( stdout, "Maximum intra-frame heap size: %d %s in frame %d\n", size_wc_intra_frame_heap >> Stat_Cnt_Size, Count_Unit[Stat_Cnt_Size], location_wc_intra_frame_heap ); + } + else + { + fprintf( stdout, "Maximum intra-frame heap size: 0\n" ); + } + + if ( n_items_wc_inter_frame_heap > 0 ) + { + fprintf( stdout, "Maximum inter-frame heap size: %d %s in frame %d\n", size_wc_inter_frame_heap >> Stat_Cnt_Size, Count_Unit[Stat_Cnt_Size], location_wc_inter_frame_heap ); + } + else + { + fprintf( stdout, "Maximum inter-frame heap size: 0\n" ); + } + +#ifdef MEM_COUNT_DETAILS + /* Print detailed information about worst-case stack usage */ + if ( ptr_base_stack - ptr_max_stack > 0 ) + { + print_stack_call_tree(); + } + + /* Print detailed information about worst-case heap usage */ + mem_count_summary(); +#endif + + if ( Stat_Cnt_Size > 0 ) + { + fprintf( stdout, "\nNote: 1 word = %d bits\n", 8 << Stat_Cnt_Size ); + fprintf( stdout, "This is an optimistic estimate of memory consumption assuming that each variable type is stored with sizeof(type) bits\n" ); + } + + if ( n_items_wc_intra_frame_heap > 0 ) + { + fprintf( stdout, "Intra-frame heap memory is allocated and de-allocated in the same frame\n" ); + } + + /* De-allocate list of heap memory blocks */ + if ( allocation_list != NULL ) + { + free( allocation_list ); + } + + /* De-allocate heap allocation call tree */ + if ( heap_allocation_call_tree != NULL ) + { + free( heap_allocation_call_tree ); + } + + /* De-allocate intra-frame and inter-frame heap lists */ + if ( list_wc_intra_frame_heap != NULL ) + { + free( list_wc_intra_frame_heap ); + } + + if ( list_current_inter_frame_heap != NULL ) + { + free( list_current_inter_frame_heap ); + } + + if ( list_wc_inter_frame_heap != NULL ) + { + free( list_wc_inter_frame_heap ); + } + +#ifdef MEM_COUNT_DETAILS + if ( fid_csv_filename != NULL ) + { + fclose( fid_csv_filename ); + } +#endif + + return; +} + +#endif /* WMOPS */ + +#ifndef WMOPS +int cntr_push_pop = 0; /* global counter for checking balanced push_wmops()/pop_wmops() pairs when WMOPS is not activated */ +#endif diff --git a/lib_debug/wmc_auto.h b/lib_debug/wmc_auto.h new file mode 100644 index 0000000000000000000000000000000000000000..9e20a4c7c8162126ead7cf45fbc8aab5f506c435 --- /dev/null +++ b/lib_debug/wmc_auto.h @@ -0,0 +1,1039 @@ +/* + * (C) 2022 copyright VoiceAge Corporation. All Rights Reserved. + * + * This software is protected by copyright law and by international treaties. The source code, and all of its derivations, + * is provided by VoiceAge Corporation under the "ITU-T Software Tools' General Public License". Please, read the license file + * or refer to ITU-T Recommendation G.191 on "SOFTWARE TOOLS FOR SPEECH AND AUDIO CODING STANDARDS". + * + * Any use of this software is permitted provided that this notice is not removed and that neither the authors nor + * VoiceAge Corporation are deemed to have made any representations as to the suitability of this software + * for any purpose nor are held responsible for any defects of this software. THERE IS NO WARRANTY FOR THIS SOFTWARE. + * + * Authors: Guy Richard, Vladimir Malenovsky (Vladimir.Malenovsky@USherbrooke.ca) + */ + +#ifndef WMOPS_H +#define WMOPS_H + +#ifndef EXIT_FAILURE +#include /* stdlib is needed for exit() */ +#endif + +#ifndef EOF +#include /* stdio is needed for fprintf() */ +#endif + + +/* To Prevent "warning: '$' in identifier or number" message under GCC */ +#ifdef __GNUC__ +#pragma GCC system_header +#endif + +/* Real-time relationships */ +#define FRAMES_PER_SECOND 50.0 +#define MILLION_CYCLES 1e6 +#define WMOPS_BOOST_FAC ( 1.0f ) /* scaling factor for equalizing the difference between automatic and manual instrumentation */ +#define FAC ( FRAMES_PER_SECOND / MILLION_CYCLES * WMOPS_BOOST_FAC ) +#define NUM_INST 20 /* Total number of instruction types (in enum below) */ + + +#ifdef WMOPS +enum instructions +{ + _ADD, + _ABS, + _MULT, + _MAC, + _MOVE, + _STORE, + _LOGIC, + _SHIFT, + _BRANCH, + _DIV, + _SQRT, + _TRANS, + _FUNC, + _LOOP, + _INDIRECT, + _PTR_INIT, + _TEST, + _POWER, + _LOG, + _MISC +}; + +#define _ADD_C 1 +#define _ABS_C 1 +#define _MULT_C 1 +#define _MAC_C 1 +#define _MOVE_C 1 +#define _STORE_C 1 +#define _LOGIC_C 1 +#define _SHIFT_C 1 +#define _BRANCH_C 4 +#define _DIV_C 18 +#define _SQRT_C 10 +#define _TRANS_C 25 +#define _FUNC_C 2 /* need to add number of arguments */ +#define _LOOP_C 3 +#define _INDIRECT_C 2 +#define _PTR_INIT_C 1 +#define _TEST_C 2 +#define _POWER_C 25 +#define _LOG_C 25 +#define _MISC_C 1 + +#define _ADD_P 1 +#define _ABS_P 1 +#define _MULT_P 1 +#define _MAC_P 1 +#define _MOVE_P 1 +#define _STORE_P 0 +#define _LOGIC_P 1 +#define _SHIFT_P 1 +#define _BRANCH_P 2 +#define _DIV_P 2 +#define _SQRT_P 2 +#define _TRANS_P 2 +#define _FUNC_P 2 /* need to add number of arguments */ +#define _LOOP_P 1 +#define _INDIRECT_P 2 +#define _PTR_INIT_P 1 +#define _TEST_P 1 +#define _POWER_P 2 +#define _LOG_P 2 +#define _MISC_P 1 + +#define ADD( x ) \ + { \ + { \ + ops_cnt += ( _ADD_C * ( x ) ); \ + inst_cnt[_ADD] += ( x ); \ + { \ + static int pcnt; \ + if ( !pcnt ) \ + { \ + pcnt = 1; \ + prom_cnt += ( _ADD_P * ( x ) ); \ + } \ + } \ + } \ + } +#define ABS( x ) \ + { \ + { \ + ops_cnt += ( _ABS_C * ( x ) ); \ + inst_cnt[_ABS] += ( x ); \ + { \ + static int pcnt; \ + if ( !pcnt ) \ + { \ + pcnt = 1; \ + prom_cnt += ( _ABS_P * ( x ) ); \ + } \ + } \ + } \ + } +#define MULT( x ) \ + { \ + { \ + ops_cnt += ( _MULT_C * ( x ) ); \ + inst_cnt[_MULT] += ( x ); \ + { \ + static int pcnt; \ + if ( !pcnt ) \ + { \ + pcnt = 1; \ + prom_cnt += ( _MULT_P * ( x ) ); \ + } \ + } \ + } \ + } +#define MAC( x ) \ + { \ + { \ + ops_cnt += ( _MAC_C * ( x ) ); \ + inst_cnt[_MAC] += ( x ); \ + { \ + static int pcnt; \ + if ( !pcnt ) \ + { \ + pcnt = 1; \ + prom_cnt += ( _MAC_P * ( x ) ); \ + } \ + } \ + } \ + } +#define MOVE( x ) \ + { \ + { \ + ops_cnt += ( _MOVE_C * ( x ) ); \ + inst_cnt[_MOVE] += ( x ); \ + { \ + static int pcnt; \ + if ( !pcnt ) \ + { \ + pcnt = 1; \ + prom_cnt += ( _MOVE_P * ( x ) ); \ + } \ + } \ + } \ + } +#define STORE( x ) \ + { \ + { \ + ops_cnt += ( _STORE_C * ( x ) ); \ + inst_cnt[_STORE] += ( x ); \ + { \ + static int pcnt; \ + if ( !pcnt ) \ + { \ + pcnt = 1; \ + prom_cnt += ( _STORE_P * ( x ) ); \ + } \ + } \ + } \ + } +#define LOGIC( x ) \ + { \ + { \ + ops_cnt += ( _LOGIC_C * ( x ) ); \ + inst_cnt[_LOGIC] += ( x ); \ + { \ + static int pcnt; \ + if ( !pcnt ) \ + { \ + pcnt = 1; \ + prom_cnt += ( _LOGIC_P * ( x ) ); \ + } \ + } \ + } \ + } +#define SHIFT( x ) \ + { \ + { \ + ops_cnt += ( _SHIFT_C * ( x ) ); \ + inst_cnt[_SHIFT] += ( x ); \ + { \ + static int pcnt; \ + if ( !pcnt ) \ + { \ + pcnt = 1; \ + prom_cnt += ( _SHIFT_P * ( x ) ); \ + } \ + } \ + } \ + } +#define BRANCH( x ) \ + { \ + { \ + ops_cnt += ( _BRANCH_C * ( x ) ); \ + inst_cnt[_BRANCH] += ( x ); \ + { \ + static int pcnt; \ + if ( !pcnt ) \ + { \ + pcnt = 1; \ + prom_cnt += ( _BRANCH_P * ( x ) ); \ + } \ + } \ + } \ + } +#define DIV( x ) \ + { \ + { \ + ops_cnt += ( _DIV_C * ( x ) ); \ + inst_cnt[_DIV] += ( x ); \ + { \ + static int pcnt; \ + if ( !pcnt ) \ + { \ + pcnt = 1; \ + prom_cnt += ( _DIV_P * ( x ) ); \ + } \ + } \ + } \ + } +#define SQRT( x ) \ + { \ + { \ + ops_cnt += ( _SQRT_C * ( x ) ); \ + inst_cnt[_SQRT] += ( x ); \ + { \ + static int pcnt; \ + if ( !pcnt ) \ + { \ + pcnt = 1; \ + prom_cnt += ( _SQRT_P * ( x ) ); \ + } \ + } \ + } \ + } +#define TRANS( x ) \ + { \ + { \ + ops_cnt += ( _TRANS_C * ( x ) ); \ + inst_cnt[_TRANS] += ( x ); \ + { \ + static int pcnt; \ + if ( !pcnt ) \ + { \ + pcnt = 1; \ + prom_cnt += ( _TRANS_P * ( x ) ); \ + } \ + } \ + } \ + } +#define LOOP( x ) \ + { \ + { \ + ops_cnt += ( _LOOP_C * ( x ) ); \ + inst_cnt[_LOOP] += ( x ); \ + { \ + static int pcnt; \ + if ( !pcnt ) \ + { \ + pcnt = 1; \ + prom_cnt += ( _LOOP_P * ( x ) ); \ + } \ + } \ + } \ + } +#define INDIRECT( x ) \ + { \ + { \ + ops_cnt += ( _INDIRECT_C * ( x ) ); \ + inst_cnt[_INDIRECT] += ( x ); \ + { \ + static int pcnt; \ + if ( !pcnt ) \ + { \ + pcnt = 1; \ + prom_cnt += ( _INDIRECT_P * ( x ) ); \ + } \ + } \ + } \ + } +#define PTR_INIT( x ) \ + { \ + { \ + ops_cnt += ( _PTR_INIT_C * ( x ) ); \ + inst_cnt[_PTR_INIT] += ( x ); \ + { \ + static int pcnt; \ + if ( !pcnt ) \ + { \ + pcnt = 1; \ + prom_cnt += ( _PTR_INIT_P * ( x ) ); \ + } \ + } \ + } \ + } +#define TEST( x ) \ + { \ + { \ + ops_cnt += ( _TEST_C * ( x ) ); \ + inst_cnt[_TEST] += ( x ); \ + { \ + static int pcnt; \ + if ( !pcnt ) \ + { \ + pcnt = 1; \ + prom_cnt += ( _TEST_P * ( x ) ); \ + } \ + } \ + } \ + } +#define POWER( x ) \ + { \ + { \ + ops_cnt += ( _POWER_C * ( x ) ); \ + inst_cnt[_POWER] += ( x ); \ + { \ + static int pcnt; \ + if ( !pcnt ) \ + { \ + pcnt = 1; \ + prom_cnt += ( _POWER_P * ( x ) ); \ + } \ + } \ + } \ + } +#define LOG( x ) \ + { \ + { \ + ops_cnt += ( _LOG_C * ( x ) ); \ + inst_cnt[_LOG] += ( x ); \ + { \ + static int pcnt; \ + if ( !pcnt ) \ + { \ + pcnt = 1; \ + prom_cnt += ( _LOG_P * ( x ) ); \ + } \ + } \ + } \ + } +#define MISC( x ) \ + { \ + { \ + ops_cnt += ( _MISC_C * ( x ) ); \ + inst_cnt[_MISC] += ( x ); \ + { \ + static int pcnt; \ + if ( !pcnt ) \ + { \ + pcnt = 1; \ + prom_cnt += ( _MISC_P * ( x ) ); \ + } \ + } \ + } \ + } + +#define FUNC( x ) \ + { \ + { \ + ops_cnt += ( _FUNC_C + _MOVE_C * ( x ) ); \ + inst_cnt[_FUNC]++; \ + inst_cnt[_MOVE] += ( x ); \ + { \ + static int pcnt; \ + if ( !pcnt ) \ + { \ + pcnt = 1; \ + prom_cnt += ( _FUNC_P + _MOVE_P * ( x ) ); \ + } \ + } \ + } \ + } + +#define DADD( x ) \ + { \ + { \ + ops_cnt += ( 2 * _ADD_C * ( x ) ); \ + inst_cnt[_ADD] += ( x ); \ + { \ + static int pcnt; \ + if ( !pcnt ) \ + { \ + pcnt = 1; \ + prom_cnt += ( _ADD_P * ( x ) ); \ + } \ + } \ + } \ + } +#define DMULT( x ) \ + { \ + { \ + ops_cnt += ( 2 * _MULT_C * ( x ) ); \ + inst_cnt[_MULT] += ( x ); \ + { \ + static int pcnt; \ + if ( !pcnt ) \ + { \ + pcnt = 1; \ + prom_cnt += ( _MULT_P * ( x ) ); \ + } \ + } \ + } \ + } +#define DMAC( x ) \ + { \ + { \ + ops_cnt += ( 2 * _MAC_C * ( x ) ); \ + inst_cnt[_MAC] += ( x ); \ + { \ + static int pcnt; \ + if ( !pcnt ) \ + { \ + pcnt = 1; \ + prom_cnt += ( _MAC_P * ( x ) ); \ + } \ + } \ + } \ + } +#define DMOVE( x ) \ + { \ + { \ + ops_cnt += ( 2 * _MOVE_C * ( x ) ); \ + inst_cnt[_MOVE] += ( x ); \ + { \ + static int pcnt; \ + if ( !pcnt ) \ + { \ + pcnt = 1; \ + prom_cnt += ( _MOVE_P * ( x ) ); \ + } \ + } \ + } \ + } +#define DSTORE( x ) \ + { \ + { \ + ops_cnt += ( 2 * _STORE_C * ( x ) ); \ + inst_cnt[_STORE] += ( x ); \ + { \ + static int pcnt; \ + if ( !pcnt ) \ + { \ + pcnt = 1; \ + prom_cnt += ( _STORE_P * ( x ) ); \ + } \ + } \ + } \ + } +#define DLOGIC( x ) \ + { \ + { \ + ops_cnt += ( 2 * _LOGIC_C * ( x ) ); \ + inst_cnt[_LOGIC] += ( x ); \ + { \ + static int pcnt; \ + if ( !pcnt ) \ + { \ + pcnt = 1; \ + prom_cnt += ( _LOGIC_P * ( x ) ); \ + } \ + } \ + } \ + } +#define DSHIFT( x ) \ + { \ + { \ + ops_cnt += ( 2 * _SHIFT_C * ( x ) ); \ + inst_cnt[_SHIFT] += ( x ); \ + { \ + static int pcnt; \ + if ( !pcnt ) \ + { \ + pcnt = 1; \ + prom_cnt += ( _SHIFT_P * ( x ) ); \ + } \ + } \ + } \ + } +#define DDIV( x ) \ + { \ + { \ + ops_cnt += ( 2 * _DIV_C * ( x ) ); \ + inst_cnt[_DIV] += ( x ); \ + { \ + static int pcnt; \ + if ( !pcnt ) \ + { \ + pcnt = 1; \ + prom_cnt += ( _DIV_P * ( x ) ); \ + } \ + } \ + } \ + } +#define DSQRT( x ) \ + { \ + { \ + ops_cnt += ( 2 * _SQRT_C * ( x ) ); \ + inst_cnt[_SQRT] += ( x ); \ + { \ + static int pcnt; \ + if ( !pcnt ) \ + { \ + pcnt = 1; \ + prom_cnt += ( _SQRT_P * ( x ) ); \ + } \ + } \ + } \ + } +#define DTRANS( x ) \ + { \ + { \ + ops_cnt += ( 2 * _TRANS_C * ( x ) ); \ + inst_cnt[_TRANS] += ( x ); \ + { \ + static int pcnt; \ + if ( !pcnt ) \ + { \ + pcnt = 1; \ + prom_cnt += ( _TRANS_P * ( x ) ); \ + } \ + } \ + } \ + } + +extern double ops_cnt; +extern double prom_cnt; +extern double inst_cnt[NUM_INST]; +extern int ops_cnt_activ; + +void reset_wmops( void ); +void push_wmops( const char *label ); +void pop_wmops( void ); +void update_wmops( void ); +void update_mem( void ); +void print_wmops( void ); + +#else /* WMOPS counting disabled */ + +#define reset_wmops() +extern int cntr_push_pop; +#define push_wmops( x ) ( cntr_push_pop++ ) +#define pop_wmops() ( cntr_push_pop-- ) +#define update_wmops() ( assert( cntr_push_pop == 0 ) ) +#define update_mem() +#define print_wmops() + +#define ADD( x ) +#define ABS( x ) +#define MULT( x ) +#define MAC( x ) +#define MOVE( x ) +#define STORE( x ) +#define LOGIC( x ) +#define SHIFT( x ) +#define BRANCH( x ) +#define DIV( x ) +#define SQRT( x ) +#define TRANS( x ) +#define FUNC( x ) +#define LOOP( x ) +#define INDIRECT( x ) +#define PTR_INIT( x ) +#define TEST( x ) +#define POWER( x ) +#define LOG( x ) +#define MISC( x ) + +#define DADD( x ) +#define DMULT( x ) +#define DMAC( x ) +#define DMOVE( x ) +#define DSTORE( x ) +#define DLOGIC( x ) +#define DSHIFT( x ) +#define DDIV( x ) +#define DSQRT( x ) +#define DTRANS( x ) + +#endif + +/* mac & msu (Non Instrumented Versions) */ +#ifndef mac +#define mac( a, b, c ) ( ( a ) + ( b ) * ( c ) ) +#endif +#ifndef mac +#define msu( a, b, c ) ( ( a ) - ( b ) * ( c ) ) +#endif + +#ifndef WMOPS +/* DESACTIVATE the Counting Mechanism */ +#define OP_COUNT_( op, n ) + +/* DESACTIVATE Operation Counter Wrappers */ +#define OP_COUNT_WRAPPER1_( op, val ) ( val ) +#define OP_COUNT_WRAPPER2_( expr ) +#define OP_COUNT_WRAPPER3_( op, expr ) expr + +/* DESACTIVATE Logical & Ternary Operators */ +#define __ +#define _ + +#else + +/* '*ops_cnt_ptr' is Used to Avoid: "warning: operation on 'ops_cnt' may be undefined" with Cygwin gcc Compiler */ +static double *ops_cnt_ptr = &ops_cnt; +#define OP_COUNT_( op, x ) ( *ops_cnt_ptr += ( op##_C * ( x ) ), inst_cnt[op] += ( x ) ) + +/******************************************************************/ +/* NOTES: */ +/* The 'wmc_flag_' flag is global to avoid declaration in every */ +/* function and 'static' to avoid clashing with other modules */ +/* that include this header file. */ +/* */ +/* The declarations of 'wmc_flag_' and 'wops_' in this header */ +/* file prevent the addition of a 'C' file to the Project. */ +/******************************************************************/ + +/* General Purpose Global Flag */ +static int wmc_flag_ = 0; + +/* Operation Counter Wrappers */ +#define OP_COUNT_WRAPPER1_( op, val ) ( op, val ) +#define OP_COUNT_WRAPPER2_( expr ) \ + if ( expr, 0 ) \ + ; \ + else +#define OP_COUNT_WRAPPER3_( op, expr ) \ + if ( op, 0 ) \ + ; \ + else \ + expr + +#endif + +/* Define all Macros without '{' & '}' (None of these should be called externally!) */ +#define ABS_( x ) OP_COUNT_( _ABS, ( x ) / WMOPS_BOOST_FAC ) +#define ADD_( x ) OP_COUNT_( _ADD, ( x ) / WMOPS_BOOST_FAC ) +#define MULT_( x ) OP_COUNT_( _MULT, ( x ) / WMOPS_BOOST_FAC ) +#define MAC_( x ) OP_COUNT_( _MAC, ( x ) / WMOPS_BOOST_FAC ) +#define MOVE_( x ) OP_COUNT_( _MOVE, ( x ) / WMOPS_BOOST_FAC ) +#define STORE_( x ) OP_COUNT_( _STORE, ( x ) / WMOPS_BOOST_FAC ) +#define LOGIC_( x ) OP_COUNT_( _LOGIC, ( x ) / WMOPS_BOOST_FAC ) +#define SHIFT_( x ) OP_COUNT_( _SHIFT, ( x ) / WMOPS_BOOST_FAC ) +#define BRANCH_( x ) OP_COUNT_( _BRANCH, ( x ) / WMOPS_BOOST_FAC ) +#define DIV_( x ) OP_COUNT_( _DIV, ( x ) / WMOPS_BOOST_FAC ) +#define SQRT_( x ) OP_COUNT_( _SQRT, ( x ) / WMOPS_BOOST_FAC ) +#define TRANS_( x ) OP_COUNT_( _TRANS, ( x ) / WMOPS_BOOST_FAC ) +#define POWER_( x ) TRANS_( x ) +#define LOG_( x ) TRANS_( x ) +#define LOOP_( x ) OP_COUNT_( _LOOP, ( x ) / WMOPS_BOOST_FAC ) +#define INDIRECT_( x ) OP_COUNT_( _INDIRECT, ( x ) / WMOPS_BOOST_FAC ) +#define PTR_INIT_( x ) OP_COUNT_( _PTR_INIT, ( x ) / WMOPS_BOOST_FAC ) +#define FUNC_( x ) ( OP_COUNT_( _MOVE, ( x ) / WMOPS_BOOST_FAC ), OP_COUNT_( _FUNC, 1 ) ) +#define MISC_( x ) ABS_( x ) + +/* Math Operations */ +#define abs_ OP_COUNT_WRAPPER1_( ABS_( 1 ), abs ) +#define fabs_ OP_COUNT_WRAPPER1_( ABS_( 1 ), fabs ) +#define labs_ OP_COUNT_WRAPPER1_( ABS_( 1 ), labs ) +#define floor_ OP_COUNT_WRAPPER1_( MISC_( 1 ), floor ) +#define sqrt_ OP_COUNT_WRAPPER1_( SQRT_( 1 ), sqrt ) +#define pow_ OP_COUNT_WRAPPER1_( POWER_( 1 ), pow ) +#define exp_ OP_COUNT_WRAPPER1_( POWER_( 1 ), exp ) +#define log_ OP_COUNT_WRAPPER1_( LOG_( 1 ), log ) +#define log10_ OP_COUNT_WRAPPER1_( LOG_( 1 ), log10 ) +#define cos_ OP_COUNT_WRAPPER1_( TRANS_( 1 ), cos ) +#define sin_ OP_COUNT_WRAPPER1_( TRANS_( 1 ), sin ) +#define tan_ OP_COUNT_WRAPPER1_( TRANS_( 1 ), tan ) +#define acos_ OP_COUNT_WRAPPER1_( TRANS_( 1 ), acos ) +#define asin_ OP_COUNT_WRAPPER1_( TRANS_( 1 ), asin ) +#define atan_ OP_COUNT_WRAPPER1_( TRANS_( 1 ), atan ) +#define atan2_ OP_COUNT_WRAPPER1_( TRANS_( 1 ), atan2 ) +#define cosh_ OP_COUNT_WRAPPER1_( TRANS_( 1 ), cosh ) +#define sinh_ OP_COUNT_WRAPPER1_( TRANS_( 1 ), sinh ) +#define tanh_ OP_COUNT_WRAPPER1_( TRANS_( 1 ), tanh ) +#define fmod_ OP_COUNT_WRAPPER1_( DIV_( 1 ), fmod ) +/* these macros use any local macros already defined */ +/* min/max and their Variants */ +#define min_( a, b ) OP_COUNT_WRAPPER1_( MISC_( 1 ), min( ( a ), ( b ) ) ) +#define max_( a, b ) OP_COUNT_WRAPPER1_( MISC_( 1 ), max( ( a ), ( b ) ) ) +#define MIN_( a, b ) OP_COUNT_WRAPPER1_( MISC_( 1 ), MIN( ( a ), ( b ) ) ) +#define MAX_( a, b ) OP_COUNT_WRAPPER1_( MISC_( 1 ), MAX( ( a ), ( b ) ) ) +#define Min_( a, b ) OP_COUNT_WRAPPER1_( MISC_( 1 ), Min( ( a ), ( b ) ) ) +#define Max_( a, b ) OP_COUNT_WRAPPER1_( MISC_( 1 ), Max( ( a ), ( b ) ) ) +/* Square and its Variants */ +#define sqr_( x ) OP_COUNT_WRAPPER1_( MULT_( 1 ), sqr( ( x ) ) ) +#define Sqr_( x ) OP_COUNT_WRAPPER1_( MULT_( 1 ), Sqr( ( x ) ) ) +#define SQR_( x ) OP_COUNT_WRAPPER1_( MULT_( 1 ), SQR( ( x ) ) ) +#define square_( x ) OP_COUNT_WRAPPER1_( MULT_( 1 ), square( ( x ) ) ) +#define Square_( x ) OP_COUNT_WRAPPER1_( MULT_( 1 ), Square( ( x ) ) ) +#define SQUARE_( x ) OP_COUNT_WRAPPER1_( MULT_( 1 ), SQUARE( ( x ) ) ) +/* Sign and its Variants */ +#define sign_( x ) OP_COUNT_WRAPPER1_( MOVE_( 1 ), sign( ( x ) ) ) +#define Sign_( x ) OP_COUNT_WRAPPER1_( MOVE_( 1 ), Sign( ( x ) ) ) +#define SIGN_( x ) OP_COUNT_WRAPPER1_( MOVE_( 1 ), SIGN( ( x ) ) ) +/* Square Root and its Variants */ +#define sqrtf_( x ) OP_COUNT_WRAPPER1_( SQRT_( 1 ), sqrtf( ( x ) ) ) +/* Invert Square Root and its Variants */ +#define inv_sqrt_( x ) OP_COUNT_WRAPPER1_( SQRT_( 1 ), inv_sqrt( ( x ) ) ) +/* Others */ +#define log_base_2_( x ) OP_COUNT_WRAPPER1_( ( LOG_( 1 ), MULT_( 1 ) ), log_base_2( ( x ) ) ) +#define log2_f_( x ) OP_COUNT_WRAPPER1_( ( LOG_( 1 ), MULT_( 1 ) ), log2_f( ( x ) ) ) +/* The 'wmc_flag_=wmc_flag_' is Used to Avoid: "warning: left-hand operand of comma expression has no effect" + with Cygwin gcc Compiler */ +#define _round_( x ) OP_COUNT_WRAPPER1_( wmc_flag_ = wmc_flag_, _round( ( x ) ) ) +#define round_f_( x ) OP_COUNT_WRAPPER1_( wmc_flag_ = wmc_flag_, round_f( ( x ) ) ) +#define _squant_( x ) OP_COUNT_WRAPPER1_( wmc_flag_ = wmc_flag_, _squant( ( x ) ) ) +/* Set Min/Max */ +#define set_min_( a, b ) OP_COUNT_WRAPPER3_( ( ADD_( 1 ), BRANCH_( 1 ), MOVE_( 1 ) ), set_min( ( a ), ( b ) ) ) +#define set_max_( a, b ) OP_COUNT_WRAPPER3_( ( ADD_( 1 ), BRANCH_( 1 ), MOVE_( 1 ) ), set_max( ( a ), ( b ) ) ) +/* mac & msu (Instrumented Versions) */ +#define mac_( a, b, c ) OP_COUNT_WRAPPER1_( MAC_( 1 ), mac( a, b, c ) ) +#define msu_( a, b, c ) OP_COUNT_WRAPPER1_( MAC_( 1 ), msu( a, b, c ) ) + +/* Functions */ +#define func_( name, x ) OP_COUNT_WRAPPER1_( FUNC_( x ), name ) + +/* Logical Operators */ +#ifndef __ +#define __ ( BRANCH_( 1 ), 1 ) && +#endif + +/* Ternary Operators (? and :) */ +#ifndef _ +#define _ ( BRANCH_( 1 ), 0 ) ? 0: +#endif + +/* Flow Control keywords */ +#define if_ \ + OP_COUNT_WRAPPER2_( BRANCH_( 1 ) ) \ + if +#define for_ OP_COUNT_WRAPPER2_( LOOP_(1)) for +#define while_( c ) \ + while \ + OP_COUNT_WRAPPER1_( BRANCH_( 1 ), ( c ) ) /* needs extra "()" if ',' encountered */ +#define do_ \ + do \ + { +#define _while \ + BRANCH_( 1 ); \ + } \ + while + +#define goto_ \ + OP_COUNT_WRAPPER2_( BRANCH_( 1 ) ) \ + goto +#define break_ \ + OP_COUNT_WRAPPER2_( BRANCH_( 1 ) ) \ + break +#define continue_ \ + OP_COUNT_WRAPPER2_( BRANCH_( 1 ) ) \ + continue +#define return_ \ + OP_COUNT_WRAPPER2_( ( wmc_flag_ = stack_tree_level_, STACK_DEPTH_FCT_RETURN ) ) \ + return + +#define switch_ \ + OP_COUNT_WRAPPER2_( ( BRANCH_( 1 ), wmc_flag_ = 1 ) ) \ + switch +#define cost_( n ) OP_COUNT_WRAPPER2_( wmc_flag_ ? ( ADD_( n ), BRANCH_( n ), wmc_flag_ = 0 ) : 0 ); + +#ifdef WMOPS + +#define ACC 2 +#define MUL 1 + +/* Counting Function (should not be called externally!) */ +static void wops_( const char *ops ) +{ + char lm = 0; /* lm: Last Operation is Math */ + static char lo = 0; /* Last Operation */ + + void ( *fct )( const char *ops ) = wops_; + +st: + while ( *ops != '\0' ) + { + switch ( *ops++ ) + { + int cnt; + case '-': + for ( cnt = 0; ops[cnt] == '>'; cnt++ ) + ; + if ( cnt & 1 ) + goto ind; + case '+': + lm = 2; + if ( lo & MUL ) + { + MULT_( -1 ); + MAC_( 1 ); + break; + } + lo = ACC << 2; + case 'U': + case 'D': + ADD_( 1 ); + break; + case '*': + lm = 2; + if ( lo & ACC ) + { + ADD_( -1 ); + MAC_( 1 ); + break; + } + lo = MUL << 2; + MULT_( 1 ); + break; + case '/': + case '%': + lm = 2; + DIV_( 1 ); + break; + case '&': + case '|': + case '^': + lm = 2; + case '~': + LOGIC_( 1 ); + break; + case '<': + case '>': + if ( *ops != ops[-1] ) + goto error; + ops++; + case -85: + case -69: + lm = 2; + SHIFT_( 1 ); + break; + case 'L': + case 'G': + if ( *ops == 't' ) + goto comp; + case 'E': + case 'N': + if ( *ops != 'e' ) + goto error; + comp: + ops++; + ADD_( 1 ); + break; + case '!': + MISC_( 2 ); + break; + case 'M': + MOVE_( 1 ); + break; + case 'S': + STORE_( 1 ); + break; + case 'P': + PTR_INIT_( 1 ); + break; + case '[': + case ']': + goto st; + ind: + ops++; + case 'I': + case '.': + INDIRECT_( 1 ); + break; + case '=': + if ( lm ) + goto st; + case '\0': + /* This Shouldn't Happen */ + /* These are Used to Avoid: "warning: 'name' defined but not used" with Cygwin gcc Compiler */ + wmc_flag_ = wmc_flag_; + ops_cnt_ptr = ops_cnt_ptr; + fct( "" ); + error: + default: + fprintf( stderr, "\r wops: Invalid Counting Operation '%s'\n", ops - 1 ); + exit( -1 ); + } + lm >>= 1; + lo >>= 2; + } + + return; +} + +#endif + +/* All Other Operations */ +#define $( str ) OP_COUNT_WRAPPER2_( wops_( str ) ) + + +/*-------------------------------------------------------------------* + * Memory counting tool + *-------------------------------------------------------------------*/ + +/* Enhanced Const Data Size Counting (Rounding Up to the Nearest 'Integer' Size) */ +#define rsize( item ) ( ( sizeof( item ) + sizeof( int ) - 1 ) / sizeof( int ) * sizeof( int ) ) + +#ifdef _MSC_VER +/* Disable "warning C4210: nonstandard extension used : function given file scope" with Visual Studio Compiler */ +#pragma warning( disable : 4210 ) +#endif + +/* Const Data Size and PROM Size Wrapper Functions */ +#define Const_Data_Size_Func( file ) Const_Data_Size_##file( void ) +#define Get_Const_Data_Size( file, val_ptr ) \ + { \ + extern int Const_Data_Size_##file( void ); \ + *( val_ptr ) = Const_Data_Size_##file(); \ + } +#define PROM_Size_Func( file ) PROM_Size_##file( void ) +#define Get_PROM_Size( file, val_ptr ) \ + { \ + int PROM_Size_##file( void ); \ + *( val_ptr ) = PROM_Size_##file(); \ + } + +/* ROM Size Lookup Table - contains information about PROM size and Const Data Size in all source files */ +/* The print_mem() function looks for this table to print the results of Const Data usage and PROM usage */ +typedef struct ROM_Size_Lookup_Table +{ + const char file_spec[255]; + int PROM_size; + int ( *Get_Const_Data_Size_Func )( void ); +} ROM_Size_Lookup_Table; + +/* The WMC tool inserts the following declaration during the innstrumentation process in the .c file where the function print_mem() is located */ +/* and modifies it to print_mem(Const_Data_PROM_Table) */ + +/* #ifdef WMOPS + * ROM_Size_Lookup_Table Const_Data_PROM_Table[] = + * { + * {"../lib_enc/rom_enc.c", 0, NULL}, + * {"../lib_com/*.c", 0, NULL}, + * {"", -1, NULL} + * }; + * #endif + */ + +/*#define MEM_ALIGN_64BITS */ /* Define this when using 64 Bits values in the code (ex: double), otherwise it will align on 32 Bits */ +/*#define MEM_COUNT_DETAILS*/ + +typedef enum +{ + USE_BYTES = 0, + USE_16BITS = 1, + USE_32BITS = 2 +} Counting_Size; + +#if ( defined( _WIN32 ) && ( _MSC_VER <= 1800 ) && ( _MSC_VER >= 1300 ) ) +#define __func__ __FUNCTION__ +#elif defined( __STDC_VERSION__ ) && __STDC_VERSION__ < 199901L +#if ( __GNUC__ >= 2 ) +#define __func__ __FUNCTION__ +#else +#define __func__ "" +#endif +#elif defined( __GNUC__ ) +#define __func__ __extension__ __FUNCTION__ +#endif + + +#ifdef WMOPS + +void *mem_alloc( const char *func_name, int func_lineno, size_t size, char *alloc_str ); +void mem_free( const char *func_name, int func_lineno, void *ptr ); + +#define malloc_( size ) mem_alloc( __func__, __LINE__, size, "m:" #size ) +#define calloc_( n, size ) mem_alloc( __func__, __LINE__, ( n ) * ( size ), "c:" #n ", " #size ) +#define free_( ptr ) mem_free( __func__, __LINE__, ptr ) + +void reset_mem( Counting_Size cnt_size ); +void print_mem( ROM_Size_Lookup_Table Const_Data_PROM_Table[] ); + +int push_stack( const char *filename, const char *fctname ); +int pop_stack( const char *filename, const char *fctname ); + +#ifdef WMOPS_DETAIL +#define STACK_DEPTH_FCT_CALL ( push_wmops( __FUNCTION__ ), push_stack( __FILE__, __FUNCTION__ ) ) /* add push_wmops() in all function calls */ +#define STACK_DEPTH_FCT_RETURN ( pop_wmops(), pop_stack( __FILE__, __FUNCTION__ ) ) /* add pop_wmops() in all function returns */ +#else +#define STACK_DEPTH_FCT_CALL push_stack( __FILE__, __FUNCTION__ ) +#define STACK_DEPTH_FCT_RETURN pop_stack( __FILE__, __FUNCTION__ ) +#endif + +void reset_stack( void ); +#define func_start_ int stack_tree_level_ = STACK_DEPTH_FCT_CALL; + +#else +#define malloc_( n1 ) malloc( n1 ) +#define calloc_( n1, n2 ) calloc( n1, n2 ) +#define free_( ptr ) free( ptr ) +#define reset_mem( cnt_size ) +#define print_mem( Const_Data_PROM_Table ) + +#define push_stack( file, fct ) +#define pop_stack( file, fct ) +#define reset_stack() +#define func_start_ + +#endif + +#endif /* WMOPS_H */ diff --git a/lib_dec/ACcontextMapping_dec.c b/lib_dec/ACcontextMapping_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..cabbef7c2609ad3d6e8bc4f9135b6c3b2a45a817 --- /dev/null +++ b/lib_dec/ACcontextMapping_dec.c @@ -0,0 +1,672 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "rom_com.h" +#include "ivas_rom_com.h" +#include "prot.h" +#include "wmc_auto.h" +#include "ivas_prot.h" /* Range coder header file */ +#include + +/*-------------------------------------------------------------------* + * ACcontextMapping_decode2_no_mem_s17_LC() + * + * Arithmetic decoder + *-------------------------------------------------------------------*/ + +/*! r: resQBits */ +int16_t ACcontextMapping_decode2_no_mem_s17_LC( + Decoder_State *st, /* i/o: decoder state */ + int16_t *x, /* o : decoded spectrum */ + int16_t nt, /* i : size of spectrum */ + int16_t nbbits, /* i : bit budget */ + int16_t resQMaxBits, /* i : residual coding maximum bits */ + CONTEXT_HM_CONFIG *hm_cfg /* i : context-based harmonic model configuration*/ +) +{ + Tastat as; + int16_t start_bit_pos, lsbs_bit_pos, overflow_bit_pos; + int16_t a, b, a1, b1, a1_i, b1_i, k; + uint16_t t; + int16_t lev, pki, esc_nb; + int16_t rateFlag; + int16_t lastnz, n; + uint16_t r; + int16_t resQBits; + int16_t rest_bits, rest_bits_overflow; + int16_t nt_half; + int32_t c[2], *ctx; + int32_t p1, p2; + int16_t ii[2]; + int16_t idx1, idx2, idx; + int16_t numPeakIndicesOrig, numHoleIndices; + int16_t nbbits_m2; + + set_s( x, 0, nt ); + + /* Rate flag */ + if ( nbbits > 400 ) + { + rateFlag = 2 << NBITS_CONTEXT; + } + else + { + rateFlag = 0; + } + + /*Decode number of ntuples*/ + start_bit_pos = st->next_bit_pos; + lsbs_bit_pos = start_bit_pos + nbbits - 1; + + n = 0; + k = 1; + nt_half = nt >> 1; + + while ( k < nt_half ) + { + ++n; + k = k << 1; + } + n = get_next_indice( st, n ) + 1; + + /* Init */ + c[0] = c[1] = 0; + + t = 0; + + lastnz = n << 1; + + if ( lastnz > nt || st->BER_detect ) + { + st->BER_detect = 1; + return 0; + } + + if ( hm_cfg ) + { + /* mapped domain */ + numPeakIndicesOrig = hm_cfg->numPeakIndices; + hm_cfg->numPeakIndices = min( hm_cfg->numPeakIndices, lastnz ); + numHoleIndices = lastnz - hm_cfg->numPeakIndices; + + /* Mark hole indices beyond lastnz as pruned */ + for ( k = numHoleIndices; k < hm_cfg->numHoleIndices; ++k ) + { + hm_cfg->holeIndices[k] = hm_cfg->holeIndices[k] + nt; + } + + ii[0] = numPeakIndicesOrig; + ii[1] = 0; + + p1 = p2 = 0; /* to avoid compilation warnings */ + } + else + { + /* unmapped domain */ + ii[0] = 0; + p1 = p2 = 0; + } + + /* Start Decoding */ + + ari_start_decoding_14bits( st, &as ); + overflow_bit_pos = st->next_bit_pos; + + nbbits_m2 = nbbits + cbitsnew - 2; + rest_bits_overflow = rest_bits = -nbbits_m2; + + /* Main Loop through the 2-tuples */ + for ( k = 0; k < lastnz; k += 2 ) + { + if ( hm_cfg ) + { + a1_i = get_next_coeff_mapped( ii, &p1, &idx1, hm_cfg ); + b1_i = get_next_coeff_mapped( ii, &p2, &idx2, hm_cfg ); + } + else + { + a1_i = get_next_coeff_unmapped( ii, &idx1 ); + b1_i = get_next_coeff_unmapped( ii, &idx2 ); + } + + idx = min( idx1, idx2 ); + + /* Get context */ + ctx = &c[p1 | p2]; + + t = (uint16_t) ( *ctx + rateFlag ); + t += ( nt_half >= idx ) ? 0 : ( 1 << NBITS_CONTEXT ); + + esc_nb = 0; + r = 0; + /* BER detection: Check max value of context t leading to out-of-bound access to ari_lookup_s17_LC[]*/ + if ( ( t >= ( 1 << ( NBITS_CONTEXT + NBITS_RATEQ ) ) ) || lsbs_bit_pos <= 0 ) + { + st->BER_detect = 1; + return 0; + } + + a = b = 0; + /* MSBs decoding */ + for ( lev = 0; lev < 15 && lsbs_bit_pos > 0; ++lev ) + { + esc_nb = min( lev, 3 ); + pki = ari_lookup_s17_LC[t + ( esc_nb << ( NBITS_CONTEXT + NBITS_RATEQ ) )]; + ari_decode_14bits_s17_ext( st, &r, &as, ari_pk_s17_LC_ext[pki] ); + + if ( r < VAL_ESC ) + { + break; + } + + /* LSBs decoding */ + a += get_indice_1( st, lsbs_bit_pos-- ) << lev; + b += get_indice_1( st, lsbs_bit_pos-- ) << lev; + } + + if ( ( lsbs_bit_pos < -1 && r >= VAL_ESC ) || ( lev > 14 ) ) + { + x[a1_i] = 0; + x[b1_i] = 0; + st->BER_detect = 1; + return 0; + } + + /* MSBs contributions */ + b1 = r >> 2; + a1 = r & 0x3; + a += a1 << lev; + b += b1 << lev; + + /* lsbs bits sign bits */ + rest_bits += 2 * lev; + + rest_bits += min( a, 1 ); + rest_bits += min( b, 1 ); + + /* Dectect overflow */ + + if ( st->next_bit_pos - start_bit_pos + rest_bits > 0 ) + { + /* Roll back bitstream position to overflow_bit_pos */ + get_next_indice_tmp( st, overflow_bit_pos - st->next_bit_pos ); + rest_bits = rest_bits_overflow; + x[a1_i] = 0; + x[b1_i] = 0; + break; + } + + overflow_bit_pos = st->next_bit_pos; + rest_bits_overflow = rest_bits; + + /* Store decoded data */ + x[a1_i] = a; + x[b1_i] = b; + + /* Update context for next 2-tuple */ + if ( p1 == p2 ) + { + /* peak-peak or hole-hole context */ + lev = esc_nb - 1; + + if ( lev <= 0 ) + { + t = 1 + ( a1 + b1 ) * ( lev + 2 ); + } + else + { + t = 13 + lev; + } + + *ctx = ( *ctx & 0xf ) * 16 + t; + } + else + { + /* mixed context */ + + if ( idx1 & 1 ) + { + /* update first context */ + c[p1] = update_mixed_context( c[p1], a ); + } + + if ( idx2 & 1 ) + { + /* update second context */ + c[p2] = update_mixed_context( c[p2], b ); + } + } + } + + /* Total number of decoded AC bits */ + get_next_indice_tmp( st, -( cbitsnew - 2 ) ); + + /* detect overflow */ + + if ( k != lastnz ) + { + rest_bits += nbbits_m2; + /* Set bitstream position to (start_bit_pos+nbbits-rest_bits) */ + get_next_indice_tmp( st, ( start_bit_pos + nbbits - rest_bits ) - st->next_bit_pos ); + } + + /* Decode signs */ + if ( hm_cfg ) + { + n = nt; + } + else + { + n = lastnz; + } + + for ( k = 0; k < n; k++ ) + { + if ( x[k] > 0 ) + { + x[k] *= 1 - 2 * get_next_indice_1( st ); + } + } + + /* Decode Residual Q */ + resQBits = min( resQMaxBits, lsbs_bit_pos + 1 - st->next_bit_pos ); + + for ( k = 0; k < resQBits; ++k ) + { + x[nt + k] = get_indice_1( st, lsbs_bit_pos - k ); + } + + /* Set bitstream pointer to end of buffer */ + get_next_indice_tmp( st, ( start_bit_pos + nbbits ) - st->next_bit_pos ); + + + return resQBits; +} + + +/*-------------------------------------------------------------------* + * RCcontextMapping_decode2_no_mem_s17_LCS() + * + * Range decoder + *-------------------------------------------------------------------*/ + +/*! r: resQBits */ +int16_t RCcontextMapping_decode2_no_mem_s17_LCS( + Decoder_State *st, /* i/o: decoder state */ + int16_t *x, /* o : decoded spectrum */ + const int16_t nt, /* i : size of spectrum */ + const int16_t nbbits, /* i : bit budget */ + const int16_t resQMaxBits, /* i : residual coding maximum bits */ + CONTEXT_HM_CONFIG *hm_cfg /* i : context-based harmonic model configuration*/ +) +{ + RangeUniDecState rc_st_dec; /* State of the range decoder */ + int16_t start_bit_pos, lsbs_bit_pos; + int16_t a, b, a1, b1, k; + uint16_t t; + int16_t lev, pki, esc_nb; + int16_t rateFlag; + int16_t lastnz, n; + uint16_t r; + int16_t resQBits; + int16_t rest_bits; + int16_t nt_half; + int16_t nbbits_m2; + int16_t bits_tups; /* No. of bits for coding the no. of tuples */ + + set_s( x, 0, nt ); + + /*Decode number of ntuples*/ + start_bit_pos = st->next_bit_pos; + lsbs_bit_pos = start_bit_pos + nbbits - 1; + n = 0; + k = 1; + nt_half = nt >> 1; + + while ( k < nt_half ) + { + ++n; + k = k << 1; + } + + bits_tups = n; + + n = get_next_indice( st, n ) + 1; + + t = 0; + + lastnz = n << 1; + + if ( lastnz > nt ) + { + st->BER_detect = 1; + return 0; + } + + if ( hm_cfg ) + { + int16_t a1_i, b1_i; + int32_t c[2], *ctx; + int32_t p1, p2; + int16_t ii[2]; + int16_t idx1, idx2, idx; + int16_t numPeakIndicesOrig, numHoleIndices; + + /* Rate flag */ + if ( nbbits > 400 ) + { + rateFlag = 2 << NBITS_CONTEXT; + } + else + { + rateFlag = 0; + } + + /* Init */ + c[0] = c[1] = 0; + + /* mapped domain */ + numPeakIndicesOrig = hm_cfg->numPeakIndices; + hm_cfg->numPeakIndices = min( hm_cfg->numPeakIndices, lastnz ); + numHoleIndices = lastnz - hm_cfg->numPeakIndices; + + /* Mark hole indices beyond lastnz as pruned */ + for ( k = numHoleIndices; k < hm_cfg->numHoleIndices; ++k ) + { + hm_cfg->holeIndices[k] = hm_cfg->holeIndices[k] + nt; + } + + ii[0] = numPeakIndicesOrig; + ii[1] = 0; + + p1 = p2 = 0; /* to avoid compilation warnings */ + + /* Start Decoding */ + /* Initialize range decoder */ + rc_uni_dec_init( &rc_st_dec, &st->bit_stream[st->next_bit_pos], nbbits ); /* (nbbits + 30) entries are read by the decoder */ + + nbbits_m2 = nbbits; + rest_bits = -nbbits_m2; + + /* Main Loop through the 2-tuples */ + for ( k = 0; k < lastnz; k += 2 ) + { + a1_i = get_next_coeff_mapped( ii, &p1, &idx1, hm_cfg ); + b1_i = get_next_coeff_mapped( ii, &p2, &idx2, hm_cfg ); + idx = min( idx1, idx2 ); + + /* Get context */ + ctx = &c[p1 | p2]; + + t = (uint16_t) ( *ctx + rateFlag ); + t += ( nt_half >= idx ) ? 0 : ( 1 << NBITS_CONTEXT ); + + esc_nb = 0; + r = 0; + + /* BER detection: Check max value of context t leading to out-of-bound access to ari_lookup_s17_LC[]*/ + if ( ( t >= ( 1 << ( NBITS_CONTEXT + NBITS_RATEQ ) ) ) || lsbs_bit_pos <= 0 ) + { + st->BER_detect = 1; + return 0; + } + + a = b = 0; + + /* MSBs decoding */ + for ( lev = 0; lev < 15 && lsbs_bit_pos > 0; ++lev ) + { + esc_nb = min( lev, 3 ); + pki = ari_lookup_s17_LC[t + ( esc_nb << ( NBITS_CONTEXT + NBITS_RATEQ ) )]; + r = rc_uni_dec_read_symbol_fastS( &rc_st_dec, cum_freq_ari_pk_s17_LC_ext[pki], sym_freq_ari_pk_s17_LC_ext[pki], 17, 14 ); /*Alphabet size = 17 (2^4 = 16 MSB symbols + 1 ESC symbol) */ + /* r is the symbol read, the possible values are {0,1,....alphabet_size - 1} */ + + if ( r < VAL_ESC ) /* If symbol read corresponds to MSB */ + { + break; + } + + /* LSBs decoding */ + a += get_indice_1( st, lsbs_bit_pos-- ) << lev; + b += get_indice_1( st, lsbs_bit_pos-- ) << lev; + } + + if ( ( lsbs_bit_pos < -1 && r >= VAL_ESC ) || ( lev > 14 ) ) + { + x[a1_i] = 0; + x[b1_i] = 0; + st->BER_detect = 1; + return 0; + } + + /* MSBs contributions */ + b1 = r >> 2; + a1 = r & 0x3; + a += a1 << lev; + b += b1 << lev; + + /* Add 2 LSB bits per bit-plane */ + rest_bits += 2 * lev; + /* Sign bits */ + rest_bits += min( a, 1 ); + rest_bits += min( b, 1 ); + + /* Update bitstream pointer */ + st->next_bit_pos = start_bit_pos + bits_tups + rc_uni_dec_virtual_finish( &rc_st_dec ); + + /* Confirm that there is no overflow */ + + /* Store decoded data */ + x[a1_i] = a; + x[b1_i] = b; + + /* Update context for next 2-tuple */ + if ( p1 == p2 ) + { + /* peak-peak or hole-hole context */ + lev = esc_nb - 1; + + if ( lev <= 0 ) + { + t = 1 + ( a1 + b1 ) * ( lev + 2 ); + } + else + { + t = 13 + lev; + } + + *ctx = ( *ctx & 0xf ) * 16 + t; + } + else + { + /* mixed context */ + + if ( idx1 & 1 ) + { + /* update first context */ + c[p1] = update_mixed_context( c[p1], a ); + } + + if ( idx2 & 1 ) + { + /* update second context */ + c[p2] = update_mixed_context( c[p2], b ); + } + } + } + + /* We don't need to finish because virtual_finish() already does the same */ + /*st->next_bit_pos = rc_uni_dec_finish(&rc_st_dec);*/ + + /* Check for bitstream errors */ + assert( rc_st_dec.bit_error_detected == 0 ); + + /* Cross-check: No overflow */ + + /* Decode signs */ + n = nt; + } + else /* if(!hm_cfg) */ + { + int16_t c, rateQ; + uint16_t s; + + /* Rate flag */ + if ( nbbits > 400 ) + { + rateFlag = 2; + } + else + { + rateFlag = 0; + } + + /* Start Decoding */ + /* Initialize range decoder */ + rc_uni_dec_init( &rc_st_dec, &st->bit_stream[st->next_bit_pos], nbbits ); /* (nbbits + 30) entries are read by the decoder */ + + nbbits_m2 = nbbits; + rest_bits = -nbbits_m2; + + t = 0; + s = 0; + + /* Main Loop through the 2-tuples */ + for ( k = 0; k < lastnz; k += 2 ) + { + rateQ = rateFlag + ( k > ( nt_half ) ); + + /* BER detection: Check max value of context t leading to out-of-bound access to ari_lookup_s17_LC[]*/ + if ( ( t >= ( 1 << ( NBITS_CONTEXT ) ) ) || lsbs_bit_pos <= 0 ) + { + st->BER_detect = 1; + return 0; + } + + a = b = 0; + esc_nb = 0; + r = 0; + + /* MSBs decoding */ + for ( lev = 0; lev < 15 && lsbs_bit_pos > 0; ++lev ) + { + esc_nb = min( lev, 3 ); + pki = ari_lookup_s17_LC[t + ( ( rateQ ) << NBITS_CONTEXT ) + ( esc_nb << ( NBITS_CONTEXT + NBITS_RATEQ ) )]; + r = rc_uni_dec_read_symbol_fastS( &rc_st_dec, cum_freq_ari_pk_s17_LC_ext[pki], sym_freq_ari_pk_s17_LC_ext[pki], 17, 14 ); /*Alphabet size = 17 (2^4 = 16 MSB symbols + 1 ESC symbol) */ + /* r is the symbol read, the possible values are {0,1,....alphabet_size - 1} */ + + if ( r < VAL_ESC ) /* If symbol read corresponds to MSB */ + { + break; + } + + /* LSBs decoding */ + a += get_indice_1( st, lsbs_bit_pos-- ) << lev; + b += get_indice_1( st, lsbs_bit_pos-- ) << lev; + } + + if ( ( lsbs_bit_pos < -1 && r >= VAL_ESC ) || ( lev > 14 ) ) + { + x[k + 0] = 0; + x[k + 1] = 0; + st->BER_detect = 1; + return 0; + } + + /* MSBs contributions */ + b1 = r >> 2; + a1 = r & 0x3; + a += a1 << lev; + b += b1 << lev; + + /* Add 2 LSB bits per bit-plane */ + rest_bits += 2 * lev; + /* Sign bits */ + rest_bits += min( a, 1 ); + rest_bits += min( b, 1 ); + + /* Update bitstream pointer */ + st->next_bit_pos = start_bit_pos + bits_tups + rc_uni_dec_virtual_finish( &rc_st_dec ); + + /* Confirm that there is no overflow */ + + /* Store decoded data */ + x[k + 0] = a; + x[k + 1] = b; + + /* Update context for next 2-tuple */ + if ( esc_nb < 2 ) + { + c = 1 + ( ( a1 + b1 ) * ( esc_nb + 1 ) ); + } + else + { + c = 12 + esc_nb; + } + + s = s << 4; /*Shift old 4 bits*/ + s = s + c; /*replace last 4 bits*/ + t = s & 0xFF; + } + + /* Decode signs */ + n = lastnz; + } /* end of if(hm_cfg) */ + + for ( k = 0; k < n; k++ ) + { + if ( x[k] > 0 ) + { + x[k] *= 1 - 2 * get_next_indice_1( st ); + } + } + + /* Decode Residual Q */ + resQBits = min( resQMaxBits, lsbs_bit_pos + 1 - st->next_bit_pos ); + + for ( k = 0; k < resQBits; ++k ) + { + x[nt + k] = get_indice_1( st, lsbs_bit_pos - k ); + } + + /* Set bitstream pointer to end of buffer */ + get_next_indice_tmp( st, ( start_bit_pos + nbbits ) - st->next_bit_pos ); + + return resQBits; +} diff --git a/lib_dec/FEC.c b/lib_dec/FEC.c new file mode 100644 index 0000000000000000000000000000000000000000..31b05b390fca0010e2952dd51ce62be826b9d4b1 --- /dev/null +++ b/lib_dec/FEC.c @@ -0,0 +1,577 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "rom_com.h" +#include "rom_dec.h" +#include "prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * Local function prototypes + *-------------------------------------------------------------------*/ + +static void gain_dec_bfi( float *past_qua_en ); + +static void pulseRes_preCalc( Word16 *cond1, Word16 *cond2, Word32 *cond3, Word16 new_pit, Word16 Tc, Word16 L_frame ); + + +/*-------------------------------------------------------------------* + * FEC_exc_estim() + * + * Calculation of excitation signal + *-------------------------------------------------------------------*/ + +void FEC_exc_estim( + Decoder_State *st, /* i/o: Decoder static memory */ + const int16_t L_frame, /* i : length of the frame */ + float *exc, /* o : pointer to excitation buffer (with past) */ + float *exc2, /* o : total excitation (for synthesis) */ + float *exc_dct_in, /* o : GSC excitation in DCT domain */ + float *pitch_buf, /* o : pitch buffer for each subframe */ + float *voice_factors, /* o : voicing factors */ + float *tmp_tc, /* o : FEC pitch */ + float *bwe_exc, /* o : excitation for SWB TBE */ + float *lsf_new, /* i : ISFs at the end of the frame */ + float *tmp_noise /* o : long-term noise energy */ +) +{ + int16_t i, Tc, new_pit; + float exc2_buf[L_FRAME16k + MODE1_L_FIR_FER - 1]; + float *pt_exc, *pt1_exc, alpha, step, gain_inov, gain, gainCNG, hp_filt[5]; + float fT0, delta, ftmp; + int16_t Diff_len; + int16_t Len, max_len; + int16_t last_bin; + int16_t extrapolationFailed = 1; + float predPitchLag; + Word16 cond1, cond2; + Word32 cond3; + + /*-----------------------------------------------------------------* + * Initializations + *-----------------------------------------------------------------*/ + + gainCNG = (float) sqrt( st->lp_ener ); + + ftmp = 2.0f * st->lp_gainc; + if ( gainCNG > ftmp ) + { + gainCNG = ftmp; + } + + Diff_len = 0; + set_f( exc_dct_in, 0.0f, L_FRAME16k ); + + /*-----------------------------------------------------------------* + * Pitch extrapolation + *-----------------------------------------------------------------*/ + + /* pitch extrapolation */ + pitch_pred_linear_fit( st->nbLostCmpt, st->last_good, st->old_pitch_buf, L_frame == L_FRAME ? &st->old_pitch_buf[2 * NB_SUBFR - 1] : &st->old_pitch_buf[2 * NB_SUBFR16k - 1], &predPitchLag, L_frame == L_FRAME ? PIT_MIN_DOUBLEEXTEND : PIT16k_MIN_EXTEND, L_frame == L_FRAME ? PIT_MAX : PIT16k_MAX, st->mem_pitch_gain, 0, 0, &extrapolationFailed, L_frame / L_SUBFR ); + + new_pit = (int16_t) ( predPitchLag + 0.5f ); + + /* initialize FEC pitch to the long-term pitch */ + *tmp_tc = st->bfi_pitch; + if ( L_frame == L_FRAME ) + { + if ( ( ( st->old_pitch_buf[2 * NB_SUBFR - 1] < 1.8f * st->bfi_pitch ) && + ( st->old_pitch_buf[2 * NB_SUBFR - 1] > 0.6f * st->bfi_pitch ) ) || /* last pitch coherent with the past */ + ( st->upd_cnt >= MAX_UPD_CNT ) ) /* or last update too far in the past */ + { + /* take the pitch value of last subframe of the previous frame */ + *tmp_tc = st->old_pitch_buf[2 * NB_SUBFR - 1]; + } + } + else /* L_frame == L_FRAME16k */ + { + if ( ( ( st->old_pitch_buf[2 * NB_SUBFR16k - 1] < 1.8f * st->bfi_pitch ) && + ( st->old_pitch_buf[2 * NB_SUBFR16k - 1] > 0.6f * st->bfi_pitch ) ) || /* last pitch coherent with the past */ + ( st->upd_cnt >= MAX_UPD_CNT ) ) /* or last update too far in the past */ + { + /* take the pitch value of last subframe of the previous frame */ + *tmp_tc = st->old_pitch_buf[2 * NB_SUBFR16k - 1]; + } + } + /* convert pitch period */ + Tc = (int16_t) ( *tmp_tc + 0.5f ); + + pulseRes_preCalc( &cond1, &cond2, &cond3, (Word16) new_pit, (Word16) Tc, (Word16) L_frame ); + + if ( ( cond1 < 0 ) && ( new_pit > 0 ) && ( cond2 != 0 ) && ( cond3 > 0 ) && extrapolationFailed == 0 ) + { + fT0 = *tmp_tc; + delta = (float) ( new_pit - fT0 ) / ( L_frame / L_SUBFR ); /* # of subframes */ + for ( i = 0; i < L_frame / L_SUBFR; i++ ) /* subframe pitch values */ + { + fT0 += delta; + pitch_buf[i] = (int16_t) ( fT0 + 0.5f ); + } + } + else + { + for ( i = 0; i < L_frame / L_SUBFR; i++ ) + { + pitch_buf[i] = *tmp_tc; + } + } + + /*-----------------------------------------------------------------* + * Estimate gain damping factor + *-----------------------------------------------------------------*/ + + alpha = ALPHA_VT; /* rapid convergence to 0 */ + if ( st->last_coder_type == UNVOICED && st->nbLostCmpt <= 3 ) + { + /* last good frame was clearly unvoiced */ + alpha = ALPHA_UU; + } + else if ( st->last_coder_type == AUDIO || st->last_good == INACTIVE_CLAS ) + { + if ( st->hGSCDec->Last_GSC_pit_band_idx > 0 && st->nbLostCmpt > 1 ) + { + alpha = 0.8f; + } + else if ( st->nbLostCmpt <= 5 ) + { + alpha = 0.995f; + } + else + { + alpha = 0.95f; + } + } + else if ( st->last_good == UNVOICED_CLAS ) + { + if ( st->nbLostCmpt <= 1 ) + { + /* If stable, do not decrease the energy, pitch gain = 0 */ + alpha = st->stab_fac * ( 1.0f - 2.0f * ALPHA_U ) + 2.0f * ALPHA_U; /* [0.8, 1.0] */ + } + else if ( st->nbLostCmpt == 2 ) + { + alpha = ALPHA_U * 1.5f; /* 0.6 */ + } + else + { + alpha = ALPHA_U; /* 0.4 go rapidly to CNG gain, pitch gain = 0 */ + } + } + else if ( st->last_good == UNVOICED_TRANSITION ) + { + alpha = ALPHA_UT; + } + else if ( st->last_good == ONSET && st->nbLostCmpt <= 3 && ( st->last_coder_type == GENERIC || st->last_coder_type == TRANSITION ) ) + { + alpha = 0.8f; /* mild convergence to 0 for the first 3 erased frames */ + } + else if ( ( st->last_good == VOICED_CLAS || st->last_good == ONSET ) && st->nbLostCmpt <= 3 ) + { + alpha = ALPHA_V; /* constant for the first 3 erased frames */ + } + else if ( st->last_good == SIN_ONSET ) + { + alpha = ALPHA_S; + } + + if ( st->last_good >= VOICED_CLAS && st->last_good < INACTIVE_CLAS && st->last_coder_type != AUDIO ) + { + if ( st->nbLostCmpt == 1 ) + { + /* if this is the first erased frame, move pitch gain towards 1 for voiced to remove energy fluctuations */ + gain = (float) sqrt( st->lp_gainp ); + if ( gain > 0.98f ) + { + gain = 0.98f; + } + else if ( gain < 0.85f ) + { + gain = 0.85f; + } + + alpha *= gain; + } + else + { + alpha = st->lp_gainp; + } + } + + /*-----------------------------------------------------------------* + * Extrapolate past excitation signal using estimated pitch period + *-----------------------------------------------------------------*/ + + if ( ( st->last_good >= UNVOICED_TRANSITION && st->last_good < INACTIVE_CLAS ) || + ( ( st->last_coder_type == AUDIO || st->last_good == INACTIVE_CLAS ) && st->hGSCDec->Last_GSC_pit_band_idx > 0 ) ) + { + /* Do pitch-based extrapolation only for stable voiced and audio signals */ + + pt_exc = exc; + pt1_exc = pt_exc - Tc; + + if ( st->nbLostCmpt == 1 ) + { + /* first pitch cycle is low-pass filtered */ + for ( i = 0; i < Tc; i++ ) + { + *pt_exc++ = ( 0.18f * pt1_exc[-1] + 0.64f * pt1_exc[0] + 0.18f * pt1_exc[1] ); + pt1_exc++; + } + } + + /* last pitch cycle of the previous frame is repeatedly copied up to an extra subframe */ + while ( pt_exc < exc + L_frame + L_SUBFR ) + { + *pt_exc++ = *pt1_exc++; + } + + /* resynchronization of excitation based on glottal pulse locations in the last good frame */ + if ( new_pit > 0 ) + { + if ( ( cond1 < 0 ) && ( new_pit > 0 ) && ( cond2 != 0 ) && ( cond3 > 0 ) && extrapolationFailed == 0 ) + { + mvr2r( exc, exc - L_frame - L_SUBFR, L_frame + L_SUBFR ); + PulseResynchronization( exc - L_frame - L_SUBFR, exc, L_frame, L_frame / L_SUBFR, Tc, new_pit ); + } + } + + if ( st->last_good == UNVOICED_TRANSITION && ( st->last_coder_type == GENERIC || st->last_coder_type == TRANSITION ) ) + { + /* start of the frame gain */ + gain = 0.0f; + + /* end of the frame gain */ + st->lp_gainp = 0.0f; + + step = 0.0f; + } + else + { + /* start of the frame gain */ + gain = 1.0f; + + /* end of the frame gain */ + st->lp_gainp = alpha; + + /* linearly attenuate the gain throughout the frame */ + step = ( 1.0f / L_frame ) * ( gain - st->lp_gainp ); + } + + /* scaling of the harmonic part of excitation */ + for ( i = 0; i < L_frame; i++ ) + { + exc[i] *= gain; + gain -= step; + } + + if ( ( st->last_coder_type == AUDIO || st->last_good == INACTIVE_CLAS ) && st->hGSCDec->Last_GSC_pit_band_idx > 0 ) + { + /* in case the last frame was coded by GSC, convert the excitation signal to frequency domain */ + edct( exc, exc_dct_in, st->L_frame, st->element_mode ); + + /* Reset unvaluable part of the adaptive (pitch) excitation contribution */ + Diff_len = (int16_t) ( mfreq_loc[st->hGSCDec->Last_GSC_pit_band_idx] / BIN_SIZE ); + max_len = st->L_frame - Diff_len; + Len = min( max_len, 80 ); + + for ( i = 0; i < Len; i++ ) + { + exc_dct_in[i + Diff_len] *= sm_table[i]; + } + + for ( ; i < max_len; i++ ) + { + exc_dct_in[i + Diff_len] = 0.0f; + } + + Diff_len++; + } + } + + /*-----------------------------------------------------------------* + * Replicate the last spectrum in case the last good frame was coded by GSC + *-----------------------------------------------------------------*/ + + if ( ( st->last_coder_type == AUDIO || st->last_good == INACTIVE_CLAS ) && st->total_brate <= MAX_GSC_INACTIVE_BRATE && !st->Opt_AMR_WB ) + { + /* Replication of the last spectrum, with a slight downscaling of its dynamic */ + st->GSC_noisy_speech = st->Last_GSC_noisy_speech_flag; + gsc_dec( st, exc_dct_in, st->hGSCDec->Last_GSC_pit_band_idx, Diff_len, 0, st->L_frame / L_SUBFR, st->last_coder_type, &last_bin, lsf_new, NULL, tmp_noise ); + + /* Transform back to time domain */ + edct( exc_dct_in, exc, st->L_frame, st->element_mode ); + } + + /*-----------------------------------------------------------------* + * Construct the random part of excitation + *-----------------------------------------------------------------*/ + + else + { + /* generate the random part of the excitation */ + for ( i = 0; i < L_frame + MODE1_L_FIR_FER - 1; i++ ) + { + exc2_buf[i] = (float) own_random( &st->seed ); + } + + /* start of the frame gain */ + gain = st->lp_gainc; + + /* end of the frame gain */ + st->lp_gainc = alpha * st->lp_gainc + ( 1.0f - alpha ) * gainCNG; + + if ( st->last_good == UNVOICED_TRANSITION && ( st->last_coder_type == GENERIC || st->last_coder_type == TRANSITION ) && gainCNG > 0 ) + { + st->lp_gainc = gainCNG; + } + + /* linearly attenuate the gain throughout the frame */ + step = ( 1.0f / L_frame ) * ( gain - st->lp_gainc ); + + /* calculate gain to normalize energy */ + pt_exc = exc2_buf + MODE1_L_FIR_FER / 2; + + gain_inov = 1.0f / (float) sqrt( dotp( pt_exc, pt_exc, L_frame ) / L_frame + 0.01f ); + + /* attenuate somewhat on unstable unvoiced */ + if ( ( st->last_good == UNVOICED_CLAS || st->last_good == INACTIVE_CLAS ) && st->last_coder_type != UNVOICED ) + { + gain_inov *= 0.8f; + } + + /* scaling of the random part of excitation */ + pt_exc = exc2_buf; + for ( i = 0; i < MODE1_L_FIR_FER / 2; i++ ) + { + /* non-causal ringing of the FIR filter */ + *pt_exc++ *= ( gain_inov * gain ); + } + + for ( i = 0; i < L_frame; i++ ) + { + /* the inner part of the FIR filter */ + *pt_exc++ *= ( gain_inov * gain ); + gain -= step; + } + + for ( i = 0; i < MODE1_L_FIR_FER / 2; i++ ) + { + /* causal ringing of the FIR filter */ + *pt_exc++ *= ( gain_inov * gain ); + } + } + + /*-----------------------------------------------------------------* + * Total excitation + *-----------------------------------------------------------------*/ + + if ( ( st->last_coder_type == AUDIO || st->last_good == INACTIVE_CLAS ) && st->total_brate <= MAX_GSC_INACTIVE_BRATE && !st->Opt_AMR_WB ) + { + /* For GSC - the excitation is already computed */ + mvr2r( exc, exc2, st->L_frame ); + } + else if ( st->last_good >= UNVOICED_TRANSITION && st->last_good < INACTIVE_CLAS ) + { + /* For voiced and generic signals - prepare a HP filter for the random part of excitation */ + for ( i = 0; i < MODE1_L_FIR_FER; i++ ) + { + hp_filt[i] = ( 1.0f - st->tilt_code ) * h_high[i]; + } + + /* HP filter the random part of the excitation and add the adaptive part */ + for ( i = 0; i < L_frame; i++ ) + { + exc2[i] = exc[i] + dotp( &exc2_buf[i], hp_filt, MODE1_L_FIR_FER ); + } + } + else + { + /* For purely unvoiced signals - just copy the unfiltered random part of the excitation */ + mvr2r( exc2_buf + MODE1_L_FIR_FER / 2, exc, L_frame ); + mvr2r( exc2_buf + MODE1_L_FIR_FER / 2, exc2, L_frame ); + } + + if ( st->hBWE_TD != NULL ) + { + if ( L_frame == L_FRAME ) + { + interp_code_5over2( exc, bwe_exc, L_frame ); + } + else + { + interp_code_4over2( exc, bwe_exc, L_frame ); + } + } + + /*-----------------------------------------------------------------* + * Updates + *-----------------------------------------------------------------*/ + + /* Update voicing factors of TBE */ + if ( st->last_coder_type == AUDIO || st->last_good == INACTIVE_CLAS ) + { + if ( st->L_frame == L_FRAME ) + { + set_f( voice_factors, 1.0f, NB_SUBFR ); + } + else + { + set_f( voice_factors, 1.0f, NB_SUBFR16k ); + } + } + else + { + if ( st->L_frame == L_FRAME ) + { + set_f( voice_factors, st->last_voice_factor, NB_SUBFR ); + } + else + { + set_f( voice_factors, st->last_voice_factor, NB_SUBFR16k ); + } + } + + if ( st->Opt_AMR_WB ) + { + /* update buffer of gains for the next frame */ + gain_dec_bfi( st->hAmrwb_IO->past_qua_en ); + } + + st->bfi_pitch = pitch_buf[L_frame / L_SUBFR - 1]; + st->bfi_pitch_frame = st->L_frame; + + return; +} + + +/*-------------------------------------------------------------------* + * gain_dec_bfi() + * + * Estimate past quantized gain prediction residual to be used in + * next frame + *-------------------------------------------------------------------*/ + +static void gain_dec_bfi( + float *past_qua_en /* i/o: gain quantization memory (4 words) */ +) +{ + int16_t i; + float av_pred_en; + + av_pred_en = 0.0f; + for ( i = 0; i < GAIN_PRED_ORDER; i++ ) + { + av_pred_en += past_qua_en[i]; + } + + av_pred_en = (float) ( av_pred_en * ( 1.0f / (float) GAIN_PRED_ORDER ) - 3.0f ); + + if ( av_pred_en < -14.0f ) + { + av_pred_en = -14.0f; + } + + for ( i = GAIN_PRED_ORDER - 1; i > 0; i-- ) + { + past_qua_en[i] = past_qua_en[i - 1]; + } + + past_qua_en[0] = av_pred_en; + + return; +} + + +#define WMC_TOOL_SKIP +/*-------------------------------------------------------------------* + * pulseRes_preCalc() + * + * calculates some conditions for Pulse resynchronization to take place + *-------------------------------------------------------------------*/ + +static void pulseRes_preCalc( + Word16 *cond1, + Word16 *cond2, + Word32 *cond3, + Word16 new_pit, + Word16 Tc, + Word16 L_frame ) +{ + Word16 tmp_pit, tmp_pit_e, tmp_frame, tmp_frame_e; + Word32 tmp_pit2; +#ifdef BASOP_NOGLOB + Flag Overflow; +#endif /* BASOP_NOGLOB */ + + tmp_pit = BASOP_Util_Divide1616_Scale( new_pit /*Q0*/, Tc /*Q0*/, &tmp_pit_e ) /*Q15*/; + tmp_frame = add( extract_l( L_mult0( L_frame, 64 /*1.f/L_SUBFR Q12*/ ) /*Q12*/ ), 4096 /*1.f Q12*/ ); /*Q12*/ + tmp_frame = BASOP_Util_Divide1616_Scale( 4096 /*1.f Q12*/, tmp_frame, &tmp_frame_e ); /*Q15*/ + tmp_frame = shl( tmp_frame, add( tmp_frame_e, 1 ) ); + tmp_frame = sub( 32767 /*1.f Q15*/, tmp_frame ); /*Q15*/ + +#ifndef BASOP_NOGLOB + BASOP_SATURATE_WARNING_OFF +#endif /* ! BASOP_NOGLOB */ + /*To calc Q15 threshold, overflow may happen - do negation and compare with negated value to check also highest possible value*/ +#ifndef BASOP_NOGLOB + tmp_pit = shl( negate( tmp_pit ), tmp_pit_e ); + BASOP_SATURATE_WARNING_ON +#else /* BASOP_NOGLOB */ + tmp_pit = shl_o( negate( tmp_pit ), tmp_pit_e, &Overflow ); +#endif /* BASOP_NOGLOB */ + + *cond1 = sub( tmp_pit, negate( tmp_frame ) ); + + *cond2 = sub( Tc, new_pit ); + + tmp_pit_e = BASOP_Util_Add_MantExp( new_pit, 15 - 0, negate( Tc ), 15 - 0, &tmp_pit ); /*Q15*/ + tmp_pit = abs_s( tmp_pit ); + tmp_pit2 = L_mult( Tc, 4915 /*0.15f Q15*/ ); /*Q16*/ + + BASOP_SATURATE_WARNING_OFF + /*To calc Q15 threshold, overflow may happen - do negation and compare with negated value to check also highest possible value*/ + tmp_pit2 = L_shl( L_negate( tmp_pit2 ), sub( 15 - 16, tmp_pit_e ) ); + BASOP_SATURATE_WARNING_ON + + *cond3 = L_sub( L_mult0( -1, tmp_pit ), tmp_pit2 ); + + return; +} +#undef WMC_TOOL_SKIP diff --git a/lib_dec/FEC_HQ_core.c b/lib_dec/FEC_HQ_core.c new file mode 100644 index 0000000000000000000000000000000000000000..edc1c2490b5a9288e6017b5246f143c040de1a4e --- /dev/null +++ b/lib_dec/FEC_HQ_core.c @@ -0,0 +1,1532 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "rom_dec.h" +#include "rom_com.h" +#include "prot.h" +#include "wmc_auto.h" + +/*---------------------------------------------------------------------* + * Local prototypes + *---------------------------------------------------------------------*/ + +static int16_t FEC_phase_matching( HQ_NBFEC_HANDLE st, float *ImdctOut, float *auOut, float *OldauOut, float OldauOut_pha[2][N_LEAD_NB] ); + +static void FEC_phase_matching_nextgood( const float *ImdctOut, float *auOut, float *OldauOut, float OldauOut_pha[2][N_LEAD_NB], float mean_en_high ); + +static void FEC_phase_matching_burst( const float *ImdctOut, float *auOut, float *OldauOut, float OldauOut_pha[2][N_LEAD_NB], float *prev_oldauOut ); + +static void Repetition_smoothing_nextgood( const float *ImdctOut, float *auOut, float *OldImdctOut, float *OldauOut, int16_t cur_data_use_flag, int16_t overlap_time ); + +static int16_t Repetition_smoothing( const float *ImdctOut, float *auOut, float *OldImdctOut, float *OldauOut, const int16_t L, float *prev_oldauOut, int16_t overlap_time ); + +static void Windowing_1st_NB( float *ImdctOutWin, const float *ImdctOut, const float *win, const float *smoothingWin, const int16_t smoothing_flag ); + +static void Windowing_2nd_NB( float *ImdctOutWin, const float *ImdctOut, const float *win ); + +static void common_overlapping( float *auOut, float *ImdctOutWin, float *OldauOut, const int16_t end1, const int16_t offset1, const int16_t start2, const int16_t end2, const int16_t offset_i2, const int16_t offset2 ); + +static void Smoothing_vector_NB( const float OldauOutnoWin[], const float ImdctOutWin[], const float SmoothingWin[], float auOut[], const int16_t ol_size ); + +static void Smoothing_vector_scaledown_NB( const float OldauOutnoWin[], const float ImdctOutWin[], const float SmoothingWin[], float auOut[], const int16_t ol_size ); + + +/*--------------------------------------------------------------------------* + * Regression_Anal() + * + * + *--------------------------------------------------------------------------*/ + +static void Regression_Anal( + const float *values, /* i : Previous values */ + float *r_p, /* o : Output r[a b] array : y=ax+b */ + const int16_t num_pgf /* i : Number of previous good frame */ +) +{ + int16_t i; + float aindex[MAX_PGF + 1], b_p[MAX_PGF + 1]; + + /* Initialize */ + for ( i = 0; i < num_pgf + 1; i++ ) + { + aindex[i] = 0.f; + b_p[i] = 0.f; + } + + /* [aindex[0] aindex[1]][r[0]]=[b[0]]*/ + /* [aindex[1] aindex[2]][r[1]] [b[1]]*/ + /* r[0] is the y-intercept(initial value). r[1] is slope*/ + + /* r[0] = (b[0]a[2]-a[1]b[1])/(a[0]a[2]-a[1]a[1]) + r[1] = (b[0]a[1]-a[0]b[1])/(a[1]a[1]-a[0]a[2]) */ + + aindex[0] = num_pgf; + for ( i = 1; i < num_pgf + 1; i++ ) + { + aindex[1] += (float) i; + aindex[2] += ( (float) i * (float) i ); + } + /* Calculate b[] */ + for ( i = 0; i < num_pgf; i++ ) + { + b_p[0] += ( values[i] ); + b_p[1] += ( (float) ( num_pgf - i ) * values[i] ); + } + r_p[0] = ( b_p[0] * aindex[2] - aindex[1] * b_p[1] ) / ( aindex[0] * aindex[2] - aindex[1] * aindex[1] ); + r_p[1] = ( b_p[0] * aindex[1] - aindex[0] * b_p[1] ) / ( aindex[1] * aindex[1] - aindex[0] * aindex[2] ); + + return; +} + + +/*--------------------------------------------------------------------------* + * FEC_scaling() + * + * + *--------------------------------------------------------------------------*/ +static void FEC_scaling( + float *old_coeffs, /* i/o: Pointer to old MDCT coeffs. */ + float *t_audio_q, /* o : MDCT coeffs. (for synthesis) */ + float *Norm_gain, /* i : Gain for Norm of each band */ + int16_t *HQ_FEC_seed, /* i/o: Seed for Ransom number Generator */ + int16_t nb_sfm, /* i : Number of sub-band */ + const int16_t *start_band, + const int16_t *end_band ) +{ + int16_t i, j; + + for ( i = 0; i < RANDOM_START; i++ ) + { + for ( j = start_band[i]; j < end_band[i]; j++ ) + { + t_audio_q[j] = Norm_gain[i] * old_coeffs[j]; + } + } + + for ( i = RANDOM_START; i < nb_sfm; i++ ) + { + for ( j = start_band[i]; j < end_band[i]; j++ ) + { + if ( (float) own_random( HQ_FEC_seed ) < 0.f ) + { + t_audio_q[j] = Norm_gain[i] * ( -old_coeffs[j] ); + } + else + { + t_audio_q[j] = Norm_gain[i] * old_coeffs[j]; + } + } + } + return; +} + + +/*--------------------------------------------------------------------------* + * HQ_FEC_processing() + * + * + *--------------------------------------------------------------------------*/ + +void HQ_FEC_processing( + Decoder_State *st, /* i/o: decoder state structure */ + float *t_audio_q, /* o : MDCT coeffs. (for synthesis) */ + int16_t is_transient, /* i : Old flag for transient */ + float ynrm_values[][MAX_PGF], /* i : Old average Norm values for each group of bands */ + float r_p_values[][MAX_ROW], /* i : Computed y-intercept and slope by Regression */ + int16_t num_Sb, /* i : Number of sub-band group */ + int16_t nb_sfm, /* i : Number of sub-band */ + int16_t *Num_bands_p, /* i : Number of coeffs. for each sub-band */ + int16_t output_frame, /* i : Frame size */ + const int16_t *sfm_start, /* i : Start of bands */ + const int16_t *sfm_end /* i : End of bands */ +) +{ + int16_t i, j, k; + float energy_diff; + int16_t mute_start, num_pgf; + int16_t Num_sb_bwe; + float tmp, norm_p[MAX_SB_NB]; + float *norm_values; + float *r_p; + int16_t sfm; + + HQ_DEC_HANDLE hHQ_core = st->hHQ_core; + HQ_NBFEC_HANDLE hHQ_nbfec = st->hHQ_nbfec; + + + /* Make sure 'energy_MA_Curr[0]' is not zero to prevent a 'div by 0' error. */ + if ( hHQ_nbfec->energy_MA_Curr[0] < 1.0f ) + { + hHQ_nbfec->energy_MA_Curr[0] = 1.0f; /*It seems to be in Q0 the FxP*/ + } + /* Decide the start frame number for adaptive muting */ + /* Normalized energy difference between the current frame and the moving average */ + energy_diff = (float) fabs( ( hHQ_nbfec->energy_MA_Curr[1] - hHQ_nbfec->energy_MA_Curr[0] ) / hHQ_nbfec->energy_MA_Curr[0] ); + + if ( ( energy_diff < ED_THRES ) && ( is_transient == 0 ) ) /* First erasure frame */ + { + mute_start = 5; + } + else + { + mute_start = 2; + } + + if ( st->prev_old_bfi == 1 && st->nbLostCmpt == 1 && output_frame == L_FRAME8k ) + { + st->nbLostCmpt++; + } + + /* Frequency-domain FEC */ + if ( st->nbLostCmpt == 1 ) /* First erasure frame */ + { + if ( is_transient == 0 ) + { + if ( energy_diff < ED_THRES ) + { + for ( i = 0; i < output_frame; i++ ) + { + t_audio_q[i] = hHQ_nbfec->old_coeffs[i]; + } + } + else + { + for ( i = 0; i < output_frame; i++ ) + { + hHQ_nbfec->old_coeffs[i] *= SCALE_DOWN_3dB; + t_audio_q[i] = hHQ_nbfec->old_coeffs[i]; + } + } + + /* Sign prediction in 4-dim bands up to 1.6 kHz*/ + if ( hHQ_core->old_is_transient[1] == 0 ) + { + if ( hHQ_core->old_is_transient[2] == 0 ) + { + for ( sfm = 0; sfm < HQ_FEC_SIGN_SFM; sfm++ ) + { + if ( hHQ_nbfec->prev_sign_switch[sfm] >= HQ_FEC_SIGN_THRES ) + { + for ( i = 0; i < HQ_FEC_BAND_SIZE; i++ ) + { + t_audio_q[i + sfm * HQ_FEC_BAND_SIZE] *= -1.0f; + } + } + } + } + else + { + for ( sfm = 0; sfm < HQ_FEC_SIGN_SFM; sfm++ ) + { + if ( hHQ_nbfec->prev_sign_switch[sfm] >= HQ_FEC_SIGN_THRES_TRANS ) + { + for ( i = 0; i < HQ_FEC_BAND_SIZE; i++ ) + { + t_audio_q[i + sfm * HQ_FEC_BAND_SIZE] *= -1.0f; + } + } + } + } + } + else + { + for ( i = RANDOM_START * 8; i < output_frame; i++ ) + { + if ( (float) own_random( &hHQ_nbfec->HQ_FEC_seed ) < 0.0f ) + { + t_audio_q[i] *= -1.0f; + } + } + } + } + else + { + if ( hHQ_core->old_is_transient[1] ) /* hangover */ + { + for ( i = 0; i < output_frame; i++ ) + { + hHQ_nbfec->old_coeffs[i] *= SCALE_DOWN_3dB; + t_audio_q[i] = hHQ_nbfec->old_coeffs[i]; + } + } + else + { + for ( i = 0; i < RANDOM_START * 8; i++ ) + { + hHQ_nbfec->old_coeffs[i] *= SCALE_DOWN_3dB; + t_audio_q[i] = hHQ_nbfec->old_coeffs[i]; + } + + for ( i = RANDOM_START * 8; i < output_frame; i++ ) + { + hHQ_nbfec->old_coeffs[i] *= SCALE_DOWN_3dB; + if ( (float) own_random( &hHQ_nbfec->HQ_FEC_seed ) < 0.0f ) + { + t_audio_q[i] = ( -hHQ_nbfec->old_coeffs[i] ); + } + else + { + t_audio_q[i] = hHQ_nbfec->old_coeffs[i]; + } + } + } + } + } + else /* st->nbLostCmpt > 1 */ + { + if ( energy_diff < ED_THRES && is_transient == 0 ) + { + num_pgf = 4; + } + else + { + num_pgf = 2; + } + + Num_sb_bwe = num_Sb; + if ( st->nbLostCmpt == 2 ) + { + for ( i = 0; i < Num_sb_bwe; i++ ) + { + norm_values = &ynrm_values[i][0]; + r_p = &r_p_values[i][0]; + Regression_Anal( norm_values, r_p, num_pgf ); + } + } + + /* Fade-out Norm by the result of Regression */ + if ( st->nbLostCmpt >= mute_start ) + { + /* Scaling */ + for ( i = 0; i < output_frame; i++ ) + { + hHQ_nbfec->old_coeffs[i] *= SCALE_DOWN_3dB; + } + } + + k = 0; + for ( i = 0; i < Num_sb_bwe; i++ ) + { + norm_values = &ynrm_values[i][0]; + r_p = &r_p_values[i][0]; + + /* Predict the average energy of each sub-band using Regression */ + /* Linear Regression */ + if ( r_p[1] > MAX_TILT ) + { + r_p[1] = MAX_TILT; + norm_p[i] = (float) ( norm_values[0] + r_p[1] * (float) ( st->nbLostCmpt - 1 ) ); + } + else + { + norm_p[i] = (float) ( r_p[0] + r_p[1] * (float) ( st->nbLostCmpt - 1 + num_pgf ) ); + } + + if ( norm_values[0] != 0.0f && norm_p[i] > 0.0f ) /* Avoid negative value of the predicted energy */ + { + tmp = norm_p[i] / norm_values[0]; /* Pred_new / Old */ + + if ( tmp > 1.0f ) + { + tmp = 1.f; + } + + for ( j = 0; j < Num_bands_p[i]; j++ ) + { + hHQ_nbfec->Norm_gain[k++] = tmp; + } + } + else + { + /* Scale down the last gain with the fixed gain(-3dB) */ + for ( j = 0; j < Num_bands_p[i]; j++ ) + { + hHQ_nbfec->Norm_gain[k++] *= SCALE_DOWN_3dB; + } + } + } + + /* Scaling for core band */ + FEC_scaling( hHQ_nbfec->old_coeffs, t_audio_q, hHQ_nbfec->Norm_gain, &hHQ_nbfec->HQ_FEC_seed, nb_sfm, sfm_start, sfm_end ); + } + + return; +} + + +/*--------------------------------------------------------------------------* + * HQ_FEC_Mem_update() + * + * + *--------------------------------------------------------------------------*/ + +void HQ_FEC_Mem_update( + Decoder_State *st, /* i/o: decoder state structure */ + const float *t_audio_q, + float *normq, + int16_t *ynrm, + const int16_t *Num_bands_p, + const int16_t is_transient, + const int16_t hqswb_clas, + const int16_t c_switching_flag, + const int16_t nb_sfm, + const int16_t num_Sb, + float *mean_en_high, + const int16_t hq_core_type, /* i : normal or low-rate MDCT(HQ) core */ + const int16_t output_frame /* i : Frame size */ +) +{ + int16_t i, j, k; + float tmp; + float tmp_energy = 0; + float *norm_values; + int16_t offset; + int16_t Min_ind; + int16_t Min_value; + float Max_coeff; + int16_t Max_ind; + int16_t stat_mode_curr; + float en_high[MAX_SB_NB]; + + HQ_DEC_HANDLE hHQ_core = st->hHQ_core; + HQ_NBFEC_HANDLE hHQ_nbfec = st->hHQ_nbfec; + + if ( output_frame == L_FRAME8k ) + { + if ( is_transient ) + { + set_s( hHQ_nbfec->prev_sign_switch_2, 0, HQ_FEC_SIGN_SFM ); + set_s( hHQ_nbfec->prev_sign_switch, 0, HQ_FEC_SIGN_SFM ); + } + else + { + for ( j = 0; j < HQ_FEC_SIGN_SFM; j++ ) + { + hHQ_nbfec->prev_sign_switch[j] = hHQ_nbfec->prev_sign_switch_2[j]; + hHQ_nbfec->prev_sign_switch_2[j] = 0; + + for ( i = 0; i < HQ_FEC_BAND_SIZE; i++ ) + { + tmp = hHQ_nbfec->old_coeffs[i + j * HQ_FEC_BAND_SIZE] * t_audio_q[i + j * HQ_FEC_BAND_SIZE]; + if ( tmp < 0 ) + { + hHQ_nbfec->prev_sign_switch[j]++; + hHQ_nbfec->prev_sign_switch_2[j]++; + } + } + } + } + + /* if LR MDCT core is used, recalculate norms from decoded MDCT spectrum (using code from hq_hr_enc()) */ + if ( ( hqswb_clas == HQ_HVQ ) || ( hq_core_type == LOW_RATE_HQ_CORE ) ) + { + /* First group */ + logqnorm( t_audio_q, ynrm, 32, WID_G1, thren_HQ ); + j = ynrm[0]; + offset = WID_G1; + + for ( i = 1; i < SFM_G1; i++ ) + { + logqnorm( &t_audio_q[offset], &ynrm[i], 40, WID_G1, thren_HQ ); + offset += WID_G1; + } + + /* Second group */ + for ( i = SFM_G1; i < SFM_G1 + 2; i++ ) + { + logqnorm( &t_audio_q[offset], &ynrm[i], 40, WID_G2, thren_HQ ); + offset += WID_G2; + } + } + + /* Memory update for the LGF log2 Norm */ + for ( i = 0; i < nb_sfm; i++ ) + { + normq[i] = dicn[ynrm[i]]; + } + + k = 0; + for ( i = 0; i < num_Sb; i++ ) + { + norm_values = &hHQ_nbfec->ynrm_values[i][0]; + mvr2r( norm_values, &norm_values[1], MAX_PGF - 1 ); + + tmp = 0.f; + for ( j = 0; j < Num_bands_p[i]; j++ ) + { + tmp += (float) normq[k++]; + } + norm_values[0] = tmp / (float) Num_bands_p[i]; + tmp_energy += tmp; + } + + if ( ( c_switching_flag ) || ( ( st->last_core == ACELP_CORE ) && ( st->core == HQ_CORE ) ) ) + { + for ( i = 0; i < MAX_SB_NB; i++ ) + { + for ( j = 1; j < MAX_PGF; j++ ) + { + hHQ_nbfec->ynrm_values[i][j] = hHQ_nbfec->ynrm_values[i][0]; + } + } + } + set_f( hHQ_nbfec->Norm_gain, 1.f, SFM_N_NB ); + + /* hHQ_nbfec->energy_MA_Curr[1]=Energy of the current frame */ + hHQ_nbfec->energy_MA_Curr[1] = tmp_energy / (float) nb_sfm; + + /* Moving Average */ + hHQ_nbfec->energy_MA_Curr[0] = 0.8f * hHQ_nbfec->energy_MA_Curr[0] + 0.2f * hHQ_nbfec->energy_MA_Curr[1]; + + hHQ_nbfec->diff_energy = (float) fabs( ( hHQ_nbfec->energy_MA_Curr[1] - hHQ_nbfec->energy_MA_Curr[0] ) / hHQ_nbfec->energy_MA_Curr[0] ); + /* Classify the stationary mode : 12% */ + if ( ( hHQ_nbfec->diff_energy < ED_THRES_12P ) ) + { + stat_mode_curr = 1; + } + else + { + stat_mode_curr = 0; + } + + /* Apply Hysteresis to prevent frequent mode changing */ + if ( hHQ_nbfec->stat_mode_old == stat_mode_curr ) + { + hHQ_nbfec->stat_mode_out = stat_mode_curr; + } + + hHQ_nbfec->stat_mode_old = stat_mode_curr; + + + /* Find max. band index (Minimum value means maximum energy) */ + Min_ind = 0; + Min_value = 100; + for ( i = 0; i < num_Sb; i++ ) + { + if ( Min_value > ynrm[i] ) + { + Min_value = ynrm[i]; + Min_ind = i; + } + } + + /* Find max. coeff in band 0 */ + Max_ind = 0; + if ( Min_ind == 0 ) + { + Max_coeff = 0.f; + for ( i = 0; i < 8; i++ ) + { + tmp = (float) fabs( t_audio_q[i] ); + if ( Max_coeff < tmp ) + { + Max_coeff = tmp; + Max_ind = i; + } + } + } + + /* Find energy difference from band 16 */ + k = 1; + + for ( i = k; i < num_Sb; i++ ) + { + en_high[i] = 0.f; + for ( j = 0; j < 2; j++ ) + { + en_high[i] += 0.5f * hHQ_nbfec->ynrm_values[i][j + 1]; + } + } + + *mean_en_high = 0.f; + for ( i = k; i < num_Sb; i++ ) + { + *mean_en_high += (float) ( en_high[i] / hHQ_nbfec->ynrm_values[i][0] ); + } + *mean_en_high /= (float) ( num_Sb - k ); + + if ( ( Min_ind < 5 ) && ( abs( Min_ind - hHQ_nbfec->old_Min_ind ) < 2 ) && ( hHQ_nbfec->diff_energy < ED_THRES_90P ) && ( !st->bfi ) && ( !st->prev_bfi ) && ( !st->prev_old_bfi ) && ( !is_transient ) && ( !hHQ_core->old_is_transient[1] ) && ( hHQ_nbfec->prev_last_core == HQ_CORE ) && ( st->last_core == HQ_CORE ) ) + { + if ( ( Min_ind == 0 ) && ( Max_ind < 3 ) ) + { + hHQ_nbfec->phase_mat_flag = 0; + } + else + { + hHQ_nbfec->phase_mat_flag = 1; + } + } + else + { + hHQ_nbfec->phase_mat_flag = 0; + } + + hHQ_nbfec->old_Min_ind = Min_ind; + + for ( i = 0; i < L_FRAME8k; i++ ) + { + hHQ_nbfec->old_coeffs[i] = t_audio_q[i]; + } + } + + hHQ_core->old_is_transient[2] = hHQ_core->old_is_transient[1]; + hHQ_core->old_is_transient[1] = hHQ_core->old_is_transient[0]; + hHQ_core->old_is_transient[0] = is_transient; + + return; +} + +/*--------------------------------------------------------------------------* + * find_best_delay() + * + * + *--------------------------------------------------------------------------*/ + +static int16_t find_best_delay( + float *mu_o, + float *in, + int16_t mind1, + int16_t maxd1, + int16_t lin, + int16_t delta, + int16_t *false_flag + +) +{ + int16_t i, d1, k; + int16_t d1m = 0; + float min_sq_cross, min_corr; + float accA, accB; + float Rxy[MAXDELAY_FEC], Ryy[MAXDELAY_FEC]; + + for ( k = 0, d1 = mind1; k < ( maxd1 - mind1 ) / delta; d1 += delta, k++ ) + { + accA = accB = 0; + for ( i = 0; i < lin; i += delta ) + { + accA += mu_o[d1 + i] * mu_o[d1 + i]; + accB += mu_o[d1 + i] * in[i]; + } + + Rxy[k] = accB; + Ryy[k] = accA; + } + + /* Obtain the best delay values */ + min_sq_cross = -FLT_MAX; + min_corr = 0; + + for ( d1 = 0; d1 < ( maxd1 - mind1 ) / delta; d1++ ) + { + if ( Rxy[d1] * min_corr >= min_sq_cross * Ryy[d1] ) + { + d1m = d1; + min_corr = Ryy[d1]; + min_sq_cross = Rxy[d1]; + } + } + d1m *= delta; + + if ( min_sq_cross <= 0.f || min_corr <= 0.f ) + { + accA = 0.f; + } + else + { + accA = min_sq_cross / min_corr; + } + if ( accA < 0.5 || accA > 1.5 ) + { + *false_flag = 1; + } + else + { + *false_flag = 0; + } + + return d1m; +} + +/*--------------------------------------------------------------------------* + * Search_Max_Corr() + * + * + *--------------------------------------------------------------------------*/ + +static int16_t Search_Max_Corr( + float *mu_o, /* i : *old_auOut_2fr */ + int16_t old_Min_ind, /* i : * Old Minimum index */ + const int16_t L /* i : L/2 */ +) +{ + int16_t pos; + int16_t pos2, delta2; + int16_t lin, delta; + int16_t mind1, maxd1; + float *in; + int16_t false_flag; + int16_t min_d1, max_d1; + + if ( old_Min_ind == 0 ) + { + lin = 8 * L / 20; /* Basic size of the block for phase matching */ + + mind1 = 0; /* min value of delay d1 to search for */ + maxd1 = 12 * L / 20; /* max value of delay d1 to search for */ + + in = mu_o + 2 * L - lin; + + /* generate correlation */ + delta = 2; + delta2 = 1; + + pos = find_best_delay( mu_o, in, mind1, maxd1, lin, delta, &false_flag ); + + if ( false_flag ) + { + return 0; + } + min_d1 = max( mind1, mind1 + pos - delta + 1 ); + max_d1 = min( maxd1, mind1 + pos + delta ); + pos2 = find_best_delay( mu_o, in, min_d1, max_d1, lin, delta2, &false_flag ); + + if ( mind1 > ( mind1 + pos - delta + 1 ) ) + { + pos = pos2; + } + else + { + pos = pos + pos2 - delta + 1; + } + pos = pos + lin + mind1; + } + else + { + lin = 6 * L / 20; + + mind1 = 9 * L / 20; /* min value of delay d1 to search for */ + maxd1 = 14 * L / 20; /* max value of delay d1 to search for */ + + in = mu_o + 2 * L - lin; + + /* generate correlation */ + delta = 2; + delta2 = 1; + + pos = find_best_delay( mu_o, in, mind1, maxd1, lin, delta, &false_flag ); + + if ( false_flag ) + { + return 0; + } + + min_d1 = max( mind1, mind1 + pos - delta + 1 ); + max_d1 = min( maxd1, mind1 + pos + delta ); + pos2 = find_best_delay( mu_o, in, min_d1, max_d1, lin, delta2, &false_flag ); + + if ( mind1 > ( mind1 + pos - delta + 1 ) ) + { + pos = pos2; + } + else + { + pos = pos + pos2 - delta + 1; + } + + pos = pos + lin + mind1; + } + + return pos; +} + +/*--------------------------------------------------------------------------* + * FEC_phase_matching() + * + * + *--------------------------------------------------------------------------*/ + +static int16_t FEC_phase_matching( + HQ_NBFEC_HANDLE st, /* i/o: HQ NB FEC handle */ + float *ImdctOut, /* i : input */ + float *auOut, /* o : output audio */ + float *OldauOut, + float OldauOut_pha[2][N_LEAD_NB] ) +{ + int16_t i; + float ImdctOutWin[2 * L_FRAME8k]; + int16_t pos, remain; + int16_t ol_size; + float OldauOutnoWin[L_FRAME8k]; + int16_t L_overlap, L; + float OldauOut2[L_FRAME8k]; + float pow1 = 0, pow22 = 0; + float win_NB[L_FRAME8k + 25]; + float SmoothingWin_NB3[24]; + + L = L_FRAME8k; + + for ( i = 0; i < 3 * L / 20; i++ ) + { + SmoothingWin_NB3[i] = SmoothingWin_NB875[i * 3]; + } + + for ( i = 0; i < L + 25; i++ ) + { + win_NB[i] = window_48kHz[i * 6 + 3]; + } + + set_f( ImdctOutWin, 0.0, 2 * L ); + + /* OLA */ + ol_size = 2 * L / 20; + pos = Search_Max_Corr( st->old_auOut_2fr, st->old_Min_ind, L ); + + if ( pos == 0 ) + { + return 1; + } + + /* Repetition */ + remain = L + N_Z_L_NB - ( ( 2 * L ) - pos ); + mvr2r( &st->old_auOut_2fr[pos], &ImdctOutWin[N_ZERO_NB], ( 2 * L ) - pos ); + + /* OldauOut without windowing */ + for ( i = N_ZERO_NB; i < L / 2; i++ ) + { + OldauOutnoWin[i - N_ZERO_NB] = -st->oldIMDCTout[L / 2 - 1 - i]; + } + for ( i = 0; i < L / 2; i++ ) + { + OldauOutnoWin[i + N_ZERO_O_NB] = -st->oldIMDCTout[i]; + } + + mvr2r( OldauOutnoWin, &ImdctOutWin[N_ZERO_NB + ( 2 * L ) - pos], remain ); + + for ( i = 0; i < L; i++ ) + { + pow1 += (float) fabs( st->old_auOut_2fr[L + i] ); + pow22 += (float) fabs( ImdctOutWin[N_ZERO_NB + i] ); + } + if ( pow22 != 0 ) + { + pow1 /= pow22; + for ( i = N_ZERO_NB; i < 2 * L; i++ ) + { + ImdctOutWin[i] *= pow1; + } + } + Smoothing_vector_NB( OldauOutnoWin, &ImdctOutWin[N_ZERO_NB], SmoothingWin_NB2, auOut, ol_size ); + + for ( i = 0; i < L / 2; i++ ) + { + ImdctOutWin[3 * L / 2 + i] *= win_NB[L / 2 - i - 1]; + } + + for ( i = N_ZERO_NB; i < L / 2; i++ ) + { + ImdctOutWin[L + i] *= win_NB[( L - 1 - i )]; + } + mvr2r( &ImdctOutWin[N_Z_L_O_NB], &OldauOut_pha[0][0], N_LEAD_NB ); + mvr2r( &ImdctOutWin[ol_size + N_ZERO_NB], &auOut[ol_size], N_Z_L_NB - ol_size ); + mvr2r( &ImdctOutWin[L], &auOut[N_Z_L_NB], N_ZERO_NB ); + mvr2r( &ImdctOutWin[L], OldauOut, L ); + + for ( i = 0; i < L / 2; i++ ) + { + OldauOut2[i] = -ImdctOut[L / 2 - 1 - i]; + OldauOut2[L / 2 + i] = -ImdctOut[i]; + } + + L_overlap = 3 * L / 20; + Smoothing_vector_NB( &ImdctOutWin[N_Z_L_O_NB], &OldauOut2[N_ZERO_NB], SmoothingWin_NB3, &OldauOut_pha[1][0], L_overlap ); + + for ( i = L_overlap; i < N_LEAD_NB; i++ ) + { + OldauOut_pha[1][i] = OldauOut2[i + N_ZERO_NB]; + } + + return 0; +} + +/*--------------------------------------------------------------------------* + * FEC_phase_matching_nextgood() + * + * + *--------------------------------------------------------------------------*/ + +void FEC_phase_matching_nextgood( + const float *ImdctOut, /* i : input */ + float *auOut, /* o : output audio */ + float *OldauOut, /* i/o: audio from previous frame */ + float OldauOut_pha[2][N_LEAD_NB], + float mean_en_high ) +{ + int16_t i; + float ImdctOutWin[2 * L_FRAME8k]; + int16_t L_overlap, L; + int16_t oldout_pha_idx; + float *OldOut_pha; + float win_NB[L_FRAME8k + 25]; + + L = L_FRAME8k; + for ( i = 0; i < L + 25; i++ ) + { + win_NB[i] = window_48kHz[i * 6 + 3]; + } + + if ( ( mean_en_high > 2.f ) || ( mean_en_high < 0.5f ) ) + { + oldout_pha_idx = 1; + } + else + { + oldout_pha_idx = 0; + } + + /* Overlapping with next good frame : Overlapping to remove the discontinuity */ + L_overlap = N_LEAD_NB; + OldOut_pha = OldauOut_pha[oldout_pha_idx]; + for ( i = 0; i < N_LEAD_NB; i++ ) + { + OldOut_pha[i] *= SmoothingWin_NB875[L_overlap - i - 1]; + } + + if ( oldout_pha_idx == 1 ) + { + /* Use phase matching and overlapping with the Oldauout*/ + /* Windowing */ + Windowing_1st_NB( ImdctOutWin, ImdctOut, win_NB, NULL, 0 ); + Windowing_2nd_NB( ImdctOutWin, ImdctOut, win_NB ); + } + else + { + /* Only use phase matching */ + /* Windowing */ + Windowing_1st_NB( ImdctOutWin, ImdctOut, win_NB, SmoothingWin_NB875, 1 ); + Windowing_2nd_NB( ImdctOutWin, ImdctOut, win_NB ); + } + + common_overlapping( auOut, ImdctOutWin, OldOut_pha, N_LEAD_NB, 0, N_LEAD_NB, L, N_ZERO_NB, 0 ); + mvr2r( &ImdctOutWin[L], OldauOut, L ); + + return; +} + +/*--------------------------------------------------------------------------* + * FEC_phase_matching_burst() + * + * + *--------------------------------------------------------------------------*/ + +static void FEC_phase_matching_burst( + const float *ImdctOut, /* i : input */ + float *auOut, /* o : output audio */ + float *OldauOut, /* i/o: audio from previous frame */ + float OldauOut_pha[2][N_LEAD_NB], + float *prev_oldauOut /* i : OldauOut from previous frame */ +) +{ + int16_t i; + int16_t L_overlap; + float OldauOut2[L_FRAME8k]; + float ImdctOutWin[2 * L_FRAME8k]; + int16_t L; + float win_NB[L_FRAME8k + 25]; + float SmoothingWin_NB3[24]; + + L = L_FRAME8k; + + for ( i = 0; i < 3 * L / 20; i++ ) + { + SmoothingWin_NB3[i] = SmoothingWin_NB875[i * 3]; + } + + for ( i = 0; i < L + 25; i++ ) + { + win_NB[i] = window_48kHz[i * 6 + 3]; + } + + /* Windowing */ + Windowing_1st_NB( ImdctOutWin, ImdctOut, win_NB, NULL, 0 ); + Windowing_2nd_NB( ImdctOutWin, ImdctOut, win_NB ); + + /* Repetition with old frame to reserve energy */ + common_overlapping( auOut, ImdctOutWin, prev_oldauOut, N_Z_L_NB, 0, N_Z_L_NB, L, N_ZERO_NB, 0 ); + + /* data transition from OldauOut to auOut using smoothing win*/ + Smoothing_vector_NB( OldauOut_pha[0], auOut, SmoothingWin_NB875, auOut, N_LEAD_NB ); + + /* Update the OldauOut array for next overlapping */ + mvr2r( &ImdctOutWin[N_Z_L_O_NB], &OldauOut_pha[0][0], N_LEAD_NB ); + mvr2r( &ImdctOutWin[L], OldauOut, L ); + v_multc( prev_oldauOut, SCALE_DOWN_3dB, prev_oldauOut, L ); + + for ( i = 0; i < L / 2; i++ ) + { + OldauOut2[i] = -ImdctOut[L / 2 - 1 - i]; + OldauOut2[L / 2 + i] = -ImdctOut[i]; + } + + L_overlap = 3 * L / 20; + Smoothing_vector_NB( &ImdctOutWin[N_Z_L_O_NB], &OldauOut2[N_ZERO_NB], SmoothingWin_NB3, &OldauOut_pha[1][0], L_overlap ); + + for ( i = L_overlap; i < N_LEAD_NB; i++ ) + { + OldauOut_pha[1][i] = OldauOut2[i + N_ZERO_NB]; + } + + return; +} + + +/*--------------------------------------------------------------------------* + * Repetition_smoothing_nextgood() + * + * + *--------------------------------------------------------------------------*/ + +static void Repetition_smoothing_nextgood( + const float *ImdctOut, /* i : input */ + float *auOut, /* o : output audio */ + float *OldImdctOut, /* i : input */ + float *OldauOut, /* i/o: audio from previous frame */ + int16_t cur_data_use_flag, /* i : current imdct data use flag */ + int16_t overlap_time ) +{ + int16_t i; + float ImdctOutWin[2 * L_FRAME8k]; + float win_NB[L_FRAME8k + 25]; + int16_t L_overlap; + int16_t ol_size; + int16_t L; + + L = L_FRAME8k; + + for ( i = 0; i < L_FRAME8k + 25; i++ ) + { + win_NB[i] = window_48kHz[i * 6 + 3]; + } + + for ( i = N_ZERO_NB; i < L / 2; i++ ) + { + OldauOut[i - N_ZERO_NB] = -OldImdctOut[L / 2 - 1 - i]; + } + for ( i = 0; i < L / 2; i++ ) + { + OldauOut[i + N_ZERO_O_NB] = -OldImdctOut[i]; + } + + /* Overlapping with next good frame : Overlapping to remove the discontinuity */ + if ( cur_data_use_flag ) + { + ol_size = N_LEAD_NB; + + for ( i = N_ZERO_NB; i < L / 2; i++ ) + { + ImdctOutWin[i + L] = -ImdctOut[L / 2 - 1 - i]; + } + for ( i = 0; i < L / 2; i++ ) + { + ImdctOutWin[i + 3 * L / 2] = -ImdctOut[i]; + } + + /*a = (float)(1./(float)(ol_size)); y = ax */ + Smoothing_vector_scaledown_NB( OldauOut, &ImdctOutWin[N_Z_L_O_NB], SmoothingWin_NB875, OldauOut, ol_size ); + + /* Scale down the overlapped signal */ + v_multc( &ImdctOutWin[ol_size + N_Z_L_O_NB], SCALE_DOWN_3dB, &OldauOut[ol_size], N_Z_L_NB - ol_size ); + } + + L_overlap = overlap_time; + for ( i = 0; i < L_overlap; i++ ) + { + OldauOut[i] *= SmoothingWin_NB875[L_overlap - i - 1]; + } + for ( i = L_overlap; i < L; i++ ) + { + OldauOut[i] = 0.f; + } + + /* Windowing */ + Windowing_1st_NB( ImdctOutWin, ImdctOut, win_NB, SmoothingWin_NB875, 1 ); + Windowing_2nd_NB( ImdctOutWin, ImdctOut, win_NB ); + + v_add( &ImdctOutWin[N_ZERO_NB], OldauOut, auOut, L ); + mvr2r( &ImdctOutWin[L], OldauOut, L ); + + return; +} + +/*--------------------------------------------------------------------------* + * Repetition_smoothing() + * + * + *--------------------------------------------------------------------------*/ + +static int16_t Repetition_smoothing( + const float *ImdctOut, /* i : input */ + float *auOut, /* o : output audio */ + float *OldImdctOut, /* i : input */ + float *OldauOut, /* i/o: audio from previous frame */ + const int16_t L, /* i : length */ + float *prev_oldauOut, /* i : OldauOut from previous frame */ + int16_t overlap_time /* i : overlap time */ +) +{ + int16_t i; + float ImdctOutWin[2 * L_FRAME8k]; + float pow1 = 0.f; + float pow22 = 0.f; + float OldauOutnoWin[L_FRAME8k]; + float win_NB[L_FRAME8k + 25]; + + for ( i = 0; i < L_FRAME8k + 25; i++ ) + { + win_NB[i] = window_48kHz[i * 6 + 3]; + } + + /* Windowing */ + Windowing_1st_NB( ImdctOutWin, ImdctOut, win_NB, NULL, 0 ); + Windowing_2nd_NB( ImdctOutWin, ImdctOut, win_NB ); + + /* Repetition with old frame to reserve energy */ + common_overlapping( auOut, ImdctOutWin, prev_oldauOut, N_Z_L_NB, 0, N_Z_L_NB, L, N_ZERO_NB, 0 ); + + /* OldauOut without windowing */ + for ( i = N_ZERO_NB; i < L / 2; i++ ) + { + OldauOutnoWin[i - N_ZERO_NB] = -OldImdctOut[L / 2 - 1 - i]; + } + for ( i = 0; i < L / 2; i++ ) + { + OldauOutnoWin[i + N_ZERO_O_NB] = -OldImdctOut[i]; + } + + /* data transition from OldauOut to auOut using smoothing win*/ + Smoothing_vector_NB( OldauOutnoWin, auOut, SmoothingWin_NB875, auOut, overlap_time ); + + pow1 = sum2_f( &auOut[1 * L / 20], 4 * L / 20 ); + pow22 = sum2_f( &auOut[N_LEAD_NB], 4 * L / 20 ); + + + if ( pow22 > pow1 * 3 ) + { + return 1; + } + + /* Update the OldauOut array for next overlapping */ + mvr2r( &ImdctOutWin[L], OldauOut, L ); + v_multc( prev_oldauOut, SCALE_DOWN_3dB, prev_oldauOut, L ); + + return 0; +} + + +/*--------------------------------------------------------------------------* + * Windowing_1st() + * + * + *--------------------------------------------------------------------------*/ + +static void Windowing_1st_NB( + float *ImdctOutWin, /* o : Output */ + const float *ImdctOut, /* i : Input */ + const float *win, /* i : Window */ + const float *smoothingWin, /* i : Smoothing Window */ + const int16_t smoothing_flag /* i : 1=Smoothing window, 0=Original window */ +) +{ + int16_t i; + int16_t L; + + L = L_FRAME8k; + if ( smoothing_flag == 0 ) + { + for ( i = N_ZERO_NB; i < L / 2; i++ ) + { + ImdctOutWin[i] = ImdctOut[L / 2 + i] * win[( 2 * L - 1 - i ) - N_LEAD_O_NB]; + } + + for ( i = 0; i < N_ZERO_O_NB; i++ ) + { + ImdctOutWin[L / 2 + i] = -ImdctOut[L - 1 - i] * win[( 3 * L / 2 - 1 - i ) - N_LEAD_O_NB]; + ImdctOutWin[3 * L / 2 + i] = -ImdctOut[i] * win[( L / 2 - i - 1 )]; + } + } + else + { + for ( i = N_ZERO_NB; i < L / 2; i++ ) + { + ImdctOutWin[i] = ImdctOut[L / 2 + i] * smoothingWin[( i - N_ZERO_NB )]; /*win[(2*L-i)*decimate-1-decay-14*L_FRAME48k/20];*/ + } + + for ( i = 0; i < N_ZERO_O_NB; i++ ) + { + ImdctOutWin[L / 2 + i] = -ImdctOut[L - 1 - i] * smoothingWin[( i + N_ZERO_O_NB )]; /*win[(3*L/2-1-i)*decimate+decay-L_FRAME48k*14/20];*/ + ImdctOutWin[3 * L / 2 + i] = -ImdctOut[i] * win[( L / 2 - i - 1 )]; + } + } + + return; +} + +/*--------------------------------------------------------------------------* + * Windowing_2nd() + * + * + *--------------------------------------------------------------------------*/ + +static void Windowing_2nd_NB( + float *ImdctOutWin, /* o : Output */ + const float *ImdctOut, /* i : Input */ + const float *win /* i : Window */ +) +{ + int16_t i; + int16_t L; + + L = L_FRAME8k; + for ( i = N_ZERO_O_NB; i < L / 2; i++ ) + { + ImdctOutWin[L / 2 + i] = -ImdctOut[L - 1 - i]; + ImdctOutWin[3 * L / 2 + i] = -ImdctOut[i] * win[L / 2 - i - 1]; + } + + for ( i = 0; i < N_ZERO_NB; i++ ) + { + ImdctOutWin[L + i] = -ImdctOut[L / 2 - 1 - i]; + } + + for ( i = N_ZERO_NB; i < L / 2; i++ ) + { + ImdctOutWin[L + i] = -ImdctOut[L / 2 - 1 - i] * win[L - 1 - i]; + } + + return; +} + +/*--------------------------------------------------------------------------* + * common_overlapping() + * + * + *--------------------------------------------------------------------------*/ + +static void common_overlapping( + float *auOut, /* i : Input */ + float *ImdctOutWin, /* o : Output */ + float *OldauOut, /* i : Window */ + const int16_t end1, /* i : Decay */ + const int16_t offset1, + const int16_t start2, + const int16_t end2, + const int16_t offset_i2, + const int16_t offset2 ) +{ + int16_t i; + + /* Common Overlapping */ + for ( i = 0; i < end1; i++ ) + { + auOut[i] = ImdctOutWin[i + N_ZERO_NB] + OldauOut[i + offset1]; + } + for ( i = start2; i < end2; i++ ) + { + auOut[i + offset2] = ImdctOutWin[i + offset_i2]; + } + + return; +} + + +/*--------------------------------------------------------------------------* + * Smoothing_vector() + * + * + *--------------------------------------------------------------------------*/ + +static void Smoothing_vector_NB( + const float OldauOutnoWin[], /* i : Input vector 1 */ + const float ImdctOutWin[], /* i : Input vector 2 */ + const float SmoothingWin[], /* i : Smoothing window */ + float auOut[], /* o : Output vector that contains vector 1 .* vector 2 */ + const int16_t ol_size /* i : Overlap size */ +) +{ + int16_t i; + float weight; + + for ( i = 0; i < ol_size; i++ ) + { + weight = SmoothingWin[i]; + auOut[i] = ( OldauOutnoWin[i] * ( 1.f - weight ) ) + ( ImdctOutWin[i] * weight ); + } + + return; +} + +/*--------------------------------------------------------------------------* + * Smoothing_vector_scaledown() + * + * + *--------------------------------------------------------------------------*/ + +static void Smoothing_vector_scaledown_NB( + const float OldauOutnoWin[], /* i : Input vector 1 */ + const float ImdctOutWin[], /* i : Input vector 2 */ + const float SmoothingWin[], /* i : Smoothing window */ + float auOut[], /* o : Output vector that contains vector 1 .* vector 2 */ + const int16_t ol_size /* i : Overlap size */ +) +{ + int16_t i; + float weight; + + for ( i = 0; i < ol_size; i++ ) + { + weight = SmoothingWin[i]; + auOut[i] = ( OldauOutnoWin[i] * ( 1.f - weight ) ) + ( ImdctOutWin[i] * SCALE_DOWN_3dB * weight ); + } + + return; +} + + +/*--------------------------------------------------------------------------* + * time_domain_FEC_HQ() + * + * + *--------------------------------------------------------------------------*/ + +void time_domain_FEC_HQ( + Decoder_State *st, /* i : Decoder State */ + float *wtda_audio, /* i : input */ + float *out, /* o : output audio */ + const float mean_en_high, /* i : transient flag */ + const int16_t output_frame /* i : Frame size */ +) +{ + HQ_DEC_HANDLE hHQ_core = st->hHQ_core; + HQ_NBFEC_HANDLE hHQ_nbfec = st->hHQ_nbfec; + + if ( ( st->nbLostCmpt == 1 ) && ( hHQ_nbfec->phase_mat_flag == 1 ) && ( hHQ_nbfec->phase_mat_next == 0 ) ) + { + if ( FEC_phase_matching( hHQ_nbfec, wtda_audio, out, hHQ_core->old_out, hHQ_nbfec->old_out_pha ) ) + { + window_ola( wtda_audio, out, hHQ_core->old_out, output_frame, st->hTcxCfg->tcx_last_overlap_mode, st->hTcxCfg->tcx_curr_overlap_mode, st->prev_bfi, hHQ_core->oldHqVoicing, hHQ_core->oldgapsynth ); + hHQ_nbfec->phase_mat_next = 0; + } + else + { + hHQ_nbfec->phase_mat_next = 1; + } + } + else if ( ( st->prev_bfi == 1 ) && ( st->bfi == 0 ) && ( hHQ_nbfec->phase_mat_next == 1 ) ) + { + FEC_phase_matching_nextgood( wtda_audio, out, hHQ_core->old_out, hHQ_nbfec->old_out_pha, mean_en_high ); + hHQ_nbfec->phase_mat_next = 0; + } + else if ( ( st->prev_bfi == 1 ) && ( st->bfi == 1 ) && ( hHQ_nbfec->phase_mat_next == 1 ) ) + { + FEC_phase_matching_burst( wtda_audio, out, hHQ_core->old_out, hHQ_nbfec->old_out_pha, hHQ_nbfec->prev_oldauOut ); + hHQ_nbfec->phase_mat_next = 1; + } + else + { + if ( st->bfi == 0 && st->prev_bfi == 1 ) + { + if ( ( hHQ_nbfec->stat_mode_out == 1 ) || ( hHQ_nbfec->diff_energy < ED_THRES_50P ) ) /* hHQ_nbfec->diff_energyoldIMDCTout, hHQ_core->old_out, st->old_bfi_cnt > 1 ? 1 : 0, N_LEAD_NB ); + } + else if ( st->old_bfi_cnt > 1 ) + { + Next_good_after_burst_erasures( wtda_audio, out, hHQ_core->old_out, N_LEAD_NB ); + } + else + { + window_ola( wtda_audio, out, hHQ_core->old_out, output_frame, st->hTcxCfg->tcx_last_overlap_mode, st->hTcxCfg->tcx_curr_overlap_mode, st->prev_bfi, hHQ_core->oldHqVoicing, hHQ_core->oldgapsynth ); + } + } + else /* if(st->bfi == 1) */ + { + if ( ( hHQ_nbfec->stat_mode_out == 1 ) || ( hHQ_nbfec->diff_energy < ED_THRES_50P ) ) + { + if ( Repetition_smoothing( wtda_audio, out, hHQ_nbfec->oldIMDCTout, hHQ_core->old_out, output_frame, hHQ_nbfec->prev_oldauOut, N_LEAD_NB ) ) + { + window_ola( wtda_audio, out, hHQ_core->old_out, output_frame, st->hTcxCfg->tcx_last_overlap_mode, st->hTcxCfg->tcx_curr_overlap_mode, st->prev_bfi, hHQ_core->oldHqVoicing, hHQ_core->oldgapsynth ); + } + } + else + { + window_ola( wtda_audio, out, hHQ_core->old_out, output_frame, st->hTcxCfg->tcx_last_overlap_mode, st->hTcxCfg->tcx_curr_overlap_mode, st->prev_bfi, hHQ_core->oldHqVoicing, hHQ_core->oldgapsynth ); + } + } + + hHQ_nbfec->phase_mat_next = 0; + } + + return; +} + + +/*--------------------------------------------------------------------------* + * Next_good_after_burst_erasures() + * + * Windowing, Overlap and Add + *--------------------------------------------------------------------------*/ + +void Next_good_after_burst_erasures( + const float *ImdctOut, /* i : input */ + float *auOut, /* o : output audio */ + float *OldauOut, /* i/o: audio from previous frame */ + const int16_t ol_size /* i : overlap size */ +) +{ + float ImdctOutWin[2 * L_FRAME8k]; + int16_t i, L; + float win_NB[L_FRAME8k + 25]; + + L = L_FRAME8k; + for ( i = 0; i < L + 25; i++ ) + { + win_NB[i] = window_48kHz[i * 6 + 3]; + } + + /* Windowing */ + Windowing_1st_NB( ImdctOutWin, ImdctOut, win_NB, NULL, 0 ); + Windowing_2nd_NB( ImdctOutWin, ImdctOut, win_NB ); + + /* Overlapping with next good frame : Overlapping to remove the discontinuity */ + Smoothing_vector_scaledown_NB( &OldauOut[N_ZERO_NB], &ImdctOutWin[N_Z_L_O_NB], SmoothingWin_NB875, &OldauOut[N_ZERO_NB], ol_size ); + + /* Scale down the overlapped signal */ + v_multc( &ImdctOutWin[ol_size + N_Z_L_O_NB], SCALE_DOWN_3dB, &OldauOut[ol_size + N_ZERO_NB], N_Z_L_NB - ol_size ); + + /* Common Overlapping */ + common_overlapping( auOut, ImdctOutWin, OldauOut, N_Z_L_NB, N_ZERO_NB, 0, N_ZERO_NB, L, N_Z_L_NB ); + mvr2r( &ImdctOutWin[L], OldauOut, L ); + + return; +} + +/*-------------------------------------------------------------------------- + * save_synthesis_hq_fec() + * + * Save synthesis for HQ FEC + *-------------------------------------------------------------------------*/ + +void save_synthesis_hq_fec( + Decoder_State *st, /* i/o: decoder state structure */ + const float *output, /* i : decoded synthesis */ + const int16_t output_frame, /* i : decoded synthesis */ + CPE_DEC_HANDLE hCPE /* i : CPE decoder structure */ +) +{ + int16_t post_hq_delay; + + switch ( st->element_mode ) + { + case EVS_MONO: + post_hq_delay = NS2SA( st->output_Fs, POST_HQ_DELAY_NS ); + break; + case IVAS_SCE: + post_hq_delay = NS2SA( st->output_Fs, DELAY_CLDFB_NS ); + break; + case IVAS_CPE_DFT: + if ( hCPE->nchan_out == 1 && hCPE->hStereoDft->hConfig->res_cod_mode == STEREO_DFT_RES_COD_OFF ) + { + post_hq_delay = NS2SA( st->output_Fs, DELAY_CLDFB_NS ); + } + else + { + post_hq_delay = 0; + } + break; + default: + post_hq_delay = 0; + break; + } + + + if ( ( st->codec_mode == MODE1 && st->hTcxDec != NULL ) && ( ( st->core == ACELP_CORE && !( st->bfi == 1 && st->con_tcx == 1 ) ) || st->core == HQ_CORE ) ) + { + mvr2r( st->hTcxDec->synth_history + output_frame, st->hTcxDec->synth_history, output_frame - post_hq_delay + NS2SA( st->output_Fs, PH_ECU_MEM_NS ) ); + mvr2r( output, st->hTcxDec->old_synthFB + output_frame - post_hq_delay, output_frame ); + + if ( st->element_mode == EVS_MONO ) + { + /* reset the remaining buffer, which is read in TCX concealment the necessary samples to fill + this buffer are not available for all cases, the impact on the output is limited */ + set_f( st->hTcxDec->old_synthFB + 2 * output_frame - post_hq_delay, 0.f, post_hq_delay ); + if ( output_frame >= L_FRAME16k ) + { + mvr2r( st->prev_synth_buffer, st->hTcxDec->old_synthFB + 2 * output_frame - NS2SA( st->output_Fs, DELAY_BWE_TOTAL_NS ), NS2SA( st->output_Fs, DELAY_BWE_TOTAL_NS - DELAY_CLDFB_NS ) ); + } + else + { + mvr2r( st->hHQ_core->old_out + NS2SA( st->output_Fs, N_ZERO_MDCT_NS ), st->hTcxDec->old_synthFB + 2 * output_frame, NS2SA( st->output_Fs, PH_ECU_LOOKAHEAD_NS ) ); + } + + if ( st->core != ACELP_CORE ) + { + if ( output_frame >= L_FRAME16k ) + { + mvr2r( st->delay_buf_out, st->hTcxDec->old_synthFB + 2 * output_frame - NS2SA( st->output_Fs, DELAY_CLDFB_NS ), NS2SA( st->output_Fs, DELAY_CLDFB_NS ) ); + mvr2r( st->hHQ_core->old_out + NS2SA( st->output_Fs, N_ZERO_MDCT_NS ), st->hTcxDec->old_synthFB + 2 * output_frame, NS2SA( st->output_Fs, PH_ECU_LOOKAHEAD_NS ) ); + } + else + { + mvr2r( st->delay_buf_out, st->hTcxDec->old_synthFB + 2 * output_frame - NS2SA( st->output_Fs, DELAY_BWE_TOTAL_NS ), NS2SA( st->output_Fs, DELAY_CLDFB_NS ) ); + mvr2r( st->hHQ_core->old_out + NS2SA( st->output_Fs, N_ZERO_MDCT_NS ), st->hTcxDec->old_synthFB + 2 * output_frame - NS2SA( st->output_Fs, DELAY_BWE_TOTAL_NS - DELAY_CLDFB_NS ), NS2SA( st->output_Fs, PH_ECU_LOOKAHEAD_NS ) ); + } + } + } + else + { + if ( st->core != ACELP_CORE ) + { + mvr2r( st->delay_buf_out, st->hTcxDec->old_synthFB + 2 * output_frame - post_hq_delay, post_hq_delay ); + mvr2r( st->hHQ_core->old_out + NS2SA( st->output_Fs, N_ZERO_MDCT_NS ), st->hTcxDec->old_synthFB + 2 * output_frame, NS2SA( st->output_Fs, PH_ECU_LOOKAHEAD_NS ) ); + } + } + } + + return; +} diff --git a/lib_dec/FEC_HQ_phase_ecu.c b/lib_dec/FEC_HQ_phase_ecu.c new file mode 100644 index 0000000000000000000000000000000000000000..49e3636087e0bbcc53fa4037473b2ad50591a1f2 --- /dev/null +++ b/lib_dec/FEC_HQ_phase_ecu.c @@ -0,0 +1,2218 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "rom_dec.h" +#include "rom_com.h" +#include "cnst.h" +#include "prot.h" +#include "wmc_auto.h" + +/*---------------------------------------------------------------------* + * Local constants + *---------------------------------------------------------------------*/ + +#define FEC_MAX 512 +#define FEC_NB_PULSE_MAX 20 +#define FEC_FFT_MAX_SIZE 512 +#define FEC_DCIM_FILT_SIZE_MAX 60 + +#define PHASE_DITH ( PI2 ) + +#define DELTA_CORR 6 /* Range for phase correction around peak */ +#define THRESH_TR_dB 10.0f +#define THRESH_TR_LIN (float) pow( 10.0f, THRESH_TR_dB / 10.0f ) +#define THRESH_TR_LIN_INV (float) pow( 10.0f, -THRESH_TR_dB / 10.0f ) +#define MAX_INCREASE_GRPOW 0.0f /* maximum amplification in case of transients */ +#define MAX_INCREASE_GRPOW_LIN (float) pow( 10.0f, MAX_INCREASE_GRPOW / 10.0f ) + +#define PHASE_DITH_SCALE (float) pow( 2.0, -16.0 ) /* for scaling random short values to +/- pi */ + +#define BURST_PHDITH_THRESH ( 4 - 1 ) /* speech start phase dither with losses in a row */ +#define BURST_PHDITH_RAMPUP_LEN 2 /* speech ramp up degree of phase dither over a length of frames */ +#define BURST_ATT_THRESH ( 3 - 1 ) /* speech start attenuate with losses in a row */ +#define ATT_PER_FRAME 4 /* speech attenuation in dB */ +#define BETA_MUTE_THR 10 /* time threshold to start beta-noise attenuation */ +#define BETA_MUTE_FAC 0.5f /* attenuation factor per additional bad frame */ + +#define LGW32k 7 +#define LGW16k 6 +#define LGW48k LGW32k + 1 /* Use the same frequency groups as for SWB + 1 */ + +#define L_TRANA_LOG32k 8 +#define L_TRANA_LOG16k 7 + +#define DELTA_CORR_F0_INT 2 /* Constant controls the bin range where Jacobsen is used */ +#define ST_PFIND_SENS 0.93f /* peakfinder sensitivity */ +#define L_PROT_NS 32000000L /* Prototype frame length in nanoseconds (32 ms) */ +#define PH_ECU_CORR_LIMIT 0.85f /* Correlation limit for IVAS Phase ECU activation */ +#define PH_ECU_N_LIMIT 56 /* fec_alg analysis frame limit for IVAS Phase ECU activation */ +#define PFIND_SENS 0.97f /* peakfinder sensitivity */ + +/*---------------------------------------------------------------------* + * Local functions + *---------------------------------------------------------------------*/ + +static int16_t rand_phase( const int16_t seed, float *sin_F, float *cos_F ); +static float imax2_jacobsen_mag( const float *y_re, const float *y_im ); + +/*-------------------------------------------------------------------* + * mult_rev2() + * + * Multiplication of two vectors second vector is multiplied in reverse order + *-------------------------------------------------------------------*/ + +static void mult_rev2( + const float x1[], /* i : Input vector 1 */ + const float x2[], /* i : Input vector 2 */ + float y[], /* o : Output vector that contains vector 1 .* vector 2 */ + const int16_t N /* i : Vector length */ +) +{ + int16_t i, j; + + for ( i = 0, j = N - 1; i < N; i++, j-- ) + { + y[i] = x1[i] * x2[j]; + } + + return; +} + + +/*-------------------------------------------------------------------* + * fft_spec2() + * + * Square magnitude of fft spectrum + *-------------------------------------------------------------------*/ + +static void fft_spec2( + float x[], /* i/o: Input vector: complex spectrum -> square magnitude spectrum */ + const int16_t N /* i : Vector length */ +) +{ + int16_t i, j; + + for ( i = 1, j = N - 1; i < N / 2; i++, j-- ) + { + x[i] = x[i] * x[i] + x[j] * x[j]; + } + + x[0] *= x[0]; + x[N / 2] *= x[N / 2]; + + return; +} + +/*------------------------------------------------------------------* + * rand_phase() + * + * randomized phase in form of sin and cos components + *------------------------------------------------------------------*/ + +/*! r: Updated seed from RNG */ +static int16_t rand_phase( + const int16_t seed, /* i : RNG seed */ + float *sin_F, /* o : random phase sin value */ + float *cos_F /* o : random phase cos value */ +) +{ + const float *sincos = sincos_t_ext + 128; + int16_t seed2 = seed; + own_random( &seed2 ); + + if ( seed2 & 0x40 ) + { + *sin_F = sincos[seed2 >> 8]; + } + else + { + *sin_F = -sincos[seed2 >> 8]; + } + + if ( seed2 & 0x80 ) + { + *cos_F = sincos[-( seed2 >> 8 )]; + } + else + { + *cos_F = -sincos[-( seed2 >> 8 )]; + } + + return seed2; +} + +/*----------------------------------------------------------------------------- + * imax2_jacobsen_mag() + * + * refine peak interpolation using jacobsen and periodic speca ana windows + *----------------------------------------------------------------------------*/ + +/*! r: The location, relative to the middle of the 3 given data point, of the maximum. (Q15)*/ +float imax2_jacobsen_mag( + const float *y_re, /* i : The 3 given data points. real part order -1 0 1 */ + const float *y_im /* i : The 3 given data points. imag part order 1 0 -1 (from FFT) */ +) +{ + float posi; + const float *pY; + float y_m1_re, y_0_re, y_p1_re; + float y_m1_im, y_0_im, y_p1_im; + float N_re, N_im; + float D_re, D_im; + float numer, denom; + +/* Jacobsen estimates peak offset relative y_0 using + * X_m1 - X_p1 + * d = REAL ( ------------------- ) * c_jacob + * 2*X_0 - X_m1 -Xp1 + * + * Where c_jacob is a window dependent constant + */ +#define C_JACOB 1.1453f /* % assume 0.1875 hammrect window 'symmetric' */ + + /* Get the bin parameters into variables */ + pY = y_re; + y_m1_re = *pY++; + y_0_re = *pY++; + y_p1_re = *pY++; + + /* Same for imaginary parts - note reverse order from FFT */ + pY = y_im; + y_p1_im = *pY++; + y_0_im = *pY++; + y_m1_im = *pY++; + + /* prepare numerator real and imaginary parts*/ + N_re = y_m1_re - y_p1_re; + N_im = y_m1_im - y_p1_im; + + /* prepare denominator real and imaginary parts */ + + D_re = 2 * y_0_re - y_m1_re - y_p1_re; + D_im = 2 * y_0_im - y_m1_im - y_p1_im; + + /* REAL part of complex division */ + numer = N_re * D_re + N_im * D_im; + denom = D_re * D_re + D_im * D_im; + + test(); + if ( numer != 0 && denom != 0 ) + { + posi = numer / denom * C_JACOB; + } + else + { + posi = 0; /* flat top, division is not possible choose center freq */ + } + + return posi; +} + + +/*------------------------------------------------------------------* + * trans_ana() + * + * Transient analysis + *------------------------------------------------------------------*/ + +static void trans_ana( + const float *xfp, /* i : Input signal */ + float *mag_chg, /* i/o: Magnitude modification */ + float *ph_dith, /* i/o: Phase dither */ + float *mag_chg_1st, /* i/o: per band magnitude modifier for transients */ + const int16_t output_frame, /* i : Frame length */ + const int16_t time_offs, /* i : Time offset */ + const float est_mus_content, /* i : 0.0=speech_like ... 1.0=Music (==st->env_stab ) */ + const int16_t last_fec, /* i : signal that previous frame was concealed with fec_alg*/ + float *alpha, /* o : Magnitude modification factors for fade to average */ + float *beta, /* o : Magnitude modification factors for fade to average */ + float *beta_mute, /* o : Factor for long-term mute */ + float Xavg[LGW_MAX] /* o : Frequency group average gain to fade to */ +) +{ + const float *w_hamm; + float grp_pow_chg, att_val, att_degree; + float xfp_left[L_TRANA48k], xfp_right[L_TRANA48k]; + float gr_pow_left[LGW_MAX], gr_pow_right[LGW_MAX]; + const float *xfp_; + int16_t Ltrana, Ltrana_2, Lprot, LtranaLog = 0, Lgw, k, burst_len; + int16_t att_always[LGW_MAX]; /* fixed attenuation per frequency group if set to 1*/ + int16_t burst_phdith_thresh; + int16_t burst_att_thresh; + float att_per_frame; + int16_t tr_dec[LGW_MAX]; + + /* check burst error */ + burst_len = time_offs / output_frame + 1; + + set_s( att_always, 0, LGW_MAX ); + *ph_dith = 0.0f; + + /* softly shift attenuation just a bit later for estimated "stable" music_content */ + burst_phdith_thresh = BURST_PHDITH_THRESH + (int16_t) ( est_mus_content * 1.0f + 0.5f ); + burst_att_thresh = BURST_ATT_THRESH + (int16_t) ( est_mus_content * 1.0f + 0.5f ); + att_per_frame = (float) ( ATT_PER_FRAME - (int16_t) ( est_mus_content * 1.0f + 0.5f ) ); /* only slighty less att for music */ + att_per_frame *= 0.1f; + + if ( burst_len > burst_phdith_thresh ) + { + /* increase degree of dither */ + *ph_dith = PHASE_DITH * min( 1.0f, ( (float) burst_len - (float) burst_phdith_thresh ) / (float) BURST_PHDITH_RAMPUP_LEN ); + } + + att_degree = 0; + if ( burst_len > burst_att_thresh ) + { + set_s( att_always, 1, LGW_MAX ); + + /* increase degree of attenuation */ + if ( burst_len - burst_att_thresh <= PH_ECU_MUTE_START ) + { + att_degree = (float) ( burst_len - burst_att_thresh ) * att_per_frame; + } + else + { + att_degree = (float) PH_ECU_MUTE_START * att_per_frame + ( burst_len - burst_att_thresh - PH_ECU_MUTE_START ) * 6.0206f; + } + } + + Lprot = ( 2 * output_frame * 4 ) / 5; /* 4/5==1024/1280, keep mult within short */ + Ltrana = Lprot / QUOT_LPR_LTR; + Ltrana_2 = Ltrana / 2; + + if ( output_frame == L_FRAME48k ) + { + w_hamm = w_hamm48k_2; + Lgw = LGW48k; + } + else if ( output_frame == L_FRAME32k ) + { + w_hamm = w_hamm32k_2; + LtranaLog = L_TRANA_LOG32k; + Lgw = LGW32k; + } + else + { + w_hamm = w_hamm16k_2; + LtranaLog = L_TRANA_LOG16k; + Lgw = LGW16k; + } + + if ( burst_len <= 1 || ( burst_len == 2 && last_fec ) ) + { + set_f( alpha, 1.0f, LGW_MAX ); + set_f( beta, 0.0f, LGW_MAX ); + *beta_mute = BETA_MUTE_FAC_INI; + + /* apply hamming window */ + v_mult( xfp, w_hamm, xfp_left, Ltrana_2 ); + mult_rev2( xfp + Ltrana_2, w_hamm, xfp_left + Ltrana_2, Ltrana_2 ); + + xfp_ = xfp + Lprot - Ltrana; + v_mult( xfp_, w_hamm, xfp_right, Ltrana_2 ); + mult_rev2( xfp_ + Ltrana_2, w_hamm, xfp_right + Ltrana_2, Ltrana_2 ); + + /* spectrum */ + if ( output_frame == L_FRAME48k ) + { + fft3( xfp_left, xfp_left, Ltrana ); + fft3( xfp_right, xfp_right, Ltrana ); + } + else + { + fft_rel( xfp_left, Ltrana, LtranaLog ); + fft_rel( xfp_right, Ltrana, LtranaLog ); + } + + /* square representation */ + fft_spec2( xfp_left, Ltrana ); + fft_spec2( xfp_right, Ltrana ); + + /* band powers in frequency groups + exclude bin at 0 and at EVS_PI from calculation */ + xfp_left[Ltrana_2] = 0.0f; + xfp_right[Ltrana_2] = 0.0f; + } + + for ( k = 0; k < Lgw; k++ ) + { + if ( burst_len <= 1 || ( burst_len == 2 && last_fec ) ) + { + gr_pow_left[k] = sum_f( xfp_left + gw[k], gw[k + 1] - gw[k] ); + gr_pow_right[k] = sum_f( xfp_right + gw[k], gw[k + 1] - gw[k] ); + + /* check if transient in any of the bands */ + gr_pow_left[k] += FLT_MIN; /* otherwise div by zero may occur */ + gr_pow_right[k] += FLT_MIN; + + Xavg[k] = (float) ( sqrt( 0.5f * ( gr_pow_left[k] + gr_pow_right[k] ) / (float) ( gw[k + 1] - gw[k] ) ) ); + + grp_pow_chg = gr_pow_right[k] / gr_pow_left[k]; + + /* dither phase in case of transient */ + /* separate transition detection and application of forced burst dithering */ + tr_dec[k] = ( grp_pow_chg > THRESH_TR_LIN ) || ( grp_pow_chg < THRESH_TR_LIN_INV ); + + /* magnitude modification */ + if ( tr_dec[k] || att_always[k] ) + { + att_val = min( MAX_INCREASE_GRPOW_LIN, grp_pow_chg ); + att_val = (float) sqrt( att_val ); + mag_chg_1st[k] = att_val; + mag_chg[k] = att_val; + } + else + { + mag_chg_1st[k] = 1.0f; + mag_chg[k] = 1.0f; + } + } + else + { + if ( burst_len < OFF_FRAMES_LIMIT ) + { + mag_chg[k] = mag_chg_1st[k] * (float) pow( 10.0, -att_degree / 20.0 ); + } + else + { + mag_chg[k] = 0; + } + if ( burst_len > BETA_MUTE_THR ) + { + *beta_mute *= BETA_MUTE_FAC; + } + alpha[k] = mag_chg[k]; + beta[k] = (float) ( sqrt( 1.0f - SQR( alpha[k] ) ) * *beta_mute ); + if ( k >= LGW32k - 1 ) + { + beta[k] *= 0.1f; + } + else if ( k >= LGW16k - 1 ) + { + beta[k] *= 0.5f; + } + } + } + + return; +} + + +/*------------------------------------------------------------------* + * peakfinder() + * + * Peak-picking algorithm + *------------------------------------------------------------------*/ + +void peakfinder( + const float *x0, /* i : vector from which the maxima will be found */ + const int16_t len0, /* i : length of input vector */ + int16_t *plocs, /* o : the indicies of the identified peaks in x0 */ + int16_t *cInd, /* o : number of identified peaks */ + const float sel, /* i : The amount above surrounding data for a peak to be identified */ + const int16_t endpoints /* i : Flag to include endpoints in peak search */ +) +{ + float minMag, tempMag, leftMin; + float dx0[L_PROT48k_2], x[L_PROT48k_2 + 1], peakMag[MAX_PLOCS]; + int16_t k, i, len, tempLoc = 0, foundPeak, ii, xInd; + int16_t *ind, indarr[L_PROT48k_2 + 1], peakLoc[MAX_PLOCS]; + + ind = indarr; + + /* Find derivative */ + v_sub( x0 + 1, x0, dx0, len0 - 1 ); + + /* This is so we find the first of repeated values */ + for ( i = 0; i < len0 - 1; i++ ) + { + if ( dx0[i] == 0.0f ) + { + dx0[i] = -1.0e-12f; + } + } + + /* Find where the derivative changes sign + Include endpoints in potential peaks and valleys */ + k = 0; + + if ( endpoints ) + { + x[k] = x0[0]; + ind[k++] = 0; + } + + for ( i = 1; i < len0 - 1; i++ ) + { + if ( dx0[i - 1] * dx0[i] < 0 ) + { + ind[k] = i; + x[k++] = x0[i]; + } + } + + if ( endpoints ) + { + ind[k] = len0 - 1; + x[k++] = x0[len0 - 1]; + } + /* x only has the peaks, valleys, and endpoints */ + len = k; + minimum( x, len, &minMag ); + + if ( ( len > 2 ) || ( !endpoints && ( len > 0 ) ) ) + { + /* Set initial parameters for loop */ + tempMag = minMag; + foundPeak = 0; + leftMin = minMag; + + if ( endpoints ) + { + /* Deal with first point a little differently since tacked it on + Calculate the sign of the derivative since we taked the first point + on it does not necessarily alternate like the rest. */ + + /* The first point is larger or equal to the second */ + if ( x[0] >= x[1] ) + { + ii = -1; + if ( x[1] >= x[2] ) /* x[1] is not extremum -> overwrite with x[0] */ + { + x[1] = x[0]; + ind[1] = ind[0]; + ind++; + len--; + } + } + else /* First point is smaller than the second */ + { + ii = 0; + if ( x[1] < x[2] ) /* x[1] is not extremum -> overwrite with x[0] */ + { + x[1] = x[0]; + ind[1] = ind[0]; + ind++; + len--; + } + } + } + else + { + ii = -1; /* First point is a peak */ + if ( len >= 2 ) + { + if ( x[1] >= x[0] ) + { + ii = 0; /* First point is a valley, skip it */ + } + } + } + *cInd = 0; + + /* Loop through extrema which should be peaks and then valleys */ + while ( ii < len - 1 ) + { + ii++; /* This is a peak */ + + /*Reset peak finding if we had a peak and the next peak is bigger + than the last or the left min was small enough to reset.*/ + if ( foundPeak ) + { + tempMag = minMag; + foundPeak = 0; + } + + /* Make sure we don't iterate past the length of our vector */ + if ( ii == len - 1 ) + { + break; /* We assign the last point differently out of the loop */ + } + + /* Found new peak that was larger than temp mag and selectivity larger + than the minimum to its left. */ + if ( ( x[ii] > tempMag ) && ( x[ii] > leftMin + sel ) ) + { + tempLoc = ii; + tempMag = x[ii]; + } + + ii++; /* Move onto the valley */ + + /* Come down at least sel from peak */ + if ( !foundPeak && ( tempMag > sel + x[ii] ) ) + { + foundPeak = 1; /* We have found a peak */ + leftMin = x[ii]; + peakLoc[*cInd] = tempLoc; /* Add peak to index */ + peakMag[*cInd] = tempMag; + ( *cInd )++; + } + else if ( x[ii] < leftMin ) /* New left minimum */ + { + leftMin = x[ii]; + } + } + + /* Check end point */ + if ( x[len - 1] > tempMag && x[len - 1] > leftMin + sel ) + { + peakLoc[*cInd] = len - 1; + peakMag[*cInd] = x[len - 1]; + ( *cInd )++; + } + else if ( !foundPeak && tempMag > minMag ) /* Check if we still need to add the last point */ + { + peakLoc[*cInd] = tempLoc; + peakMag[*cInd] = tempMag; + ( *cInd )++; + } + + /* Create output */ + for ( i = 0; i < *cInd; i++ ) + { + plocs[i] = ind[peakLoc[i]]; + } + } + else + { + if ( endpoints ) + { + /* This is a monotone function where an endpoint is the only peak */ + xInd = ( x[0] > x[1] ) ? 0 : 1; + peakMag[0] = x[xInd]; + if ( peakMag[0] > minMag + sel ) + { + plocs[0] = ind[xInd]; + *cInd = 1; + } + else + { + *cInd = 0; + } + } + else + { + /* Input constant or all zeros -- no peaks found */ + *cInd = 0; + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * imax_pos() + * + * Get interpolated maximum position + *-------------------------------------------------------------------*/ + +/*! r: interpolated maximum position */ +float imax_pos( + const float *y /* i : Input vector for peak interpolation */ +) +{ + float posi, y1, y2, y3, y3_y1, y2i; + float ftmp_den1, ftmp_den2; + /* Seek the extrema of the parabola P(x) defined by 3 consecutive points so that P([-1 0 1]) = [y1 y2 y3] */ + y1 = y[0]; + y2 = y[1]; + y3 = y[2]; + y3_y1 = y3 - y1; + ftmp_den1 = ( y1 + y3 - 2 * y2 ); + ftmp_den2 = ( 4 * y2 - 2 * y1 - 2 * y3 ); + + if ( ftmp_den2 == 0.0f || ftmp_den1 == 0.0f ) + { + return ( 0.0f ); /* early exit with left-most value */ + } + + y2i = -0.125f * SQR( y3_y1 ) / ( ftmp_den1 ) + y2; + /* their corresponding normalized locations */ + posi = y3_y1 / ( ftmp_den2 ); + /* Interpolated maxima if locations are not within [-1,1], calculated extrema are ignored */ + if ( posi >= 1.0f || posi <= -1.0f ) + { + posi = y3 > y1 ? 1.0f : -1.0f; + } + else + { + if ( y1 >= y2i ) + { + posi = ( y1 > y3 ) ? -1.0f : 1.0f; + } + else if ( y3 >= y2i ) + { + posi = 1.0f; + } + } + + return posi + 1.0f; +} + + +/*-------------------------------------------------------------------* + * spec_ana() + * + * Spectral analysis + *-------------------------------------------------------------------*/ + +static void spec_ana( + const float *prevsynth, /* i : Input signal */ + int16_t *plocs, /* o : The indicies of the identified peaks */ + float *plocsi, /* o : Interpolated positions of the identified peaks */ + int16_t *num_plocs, /* o : Number of identified peaks */ + float *X_sav, /* o : Stored fft spectrum */ + const int16_t output_frame, /* i : Frame length */ + const int16_t bwidth, /* i : Encoded bandwidth */ + const int16_t element_mode, /* i : IVAS element mode */ + float *noise_fac, /* o : for few peaks zeroing valleys decision making */ + const float pcorr ) +{ + int16_t i, Lprot, LprotLog2 = 0, hamm_len2 = 0, Lprot2_1, m; + float *pPlocsi; + int16_t *pPlocs; + int16_t currPlocs, endPlocs, Lprot2p1, nJacob; + int16_t n, k; + int16_t st_point; + int16_t end_point; + + float sig, noise, nsr; + float window_corr_step, window_corr; + const float *w_hamm = NULL; + float xfp[L_PROT48k]; + float Xmax, Xmin, sel; + int16_t stop_band_start; + int16_t stop_band_length; + + Lprot = 2 * output_frame * L_PROT32k / 1280; + Lprot2_1 = Lprot / 2 + 1; + + if ( output_frame == L_FRAME48k ) + { + w_hamm = w_hamm_sana48k_2; + hamm_len2 = L_PROT_HAMM_LEN2_48k; + } + else if ( output_frame == L_FRAME32k ) + { + w_hamm = w_hamm_sana32k_2; + hamm_len2 = L_PROT_HAMM_LEN2_32k; + LprotLog2 = 10; + } + else + { + w_hamm = w_hamm_sana16k_2; + hamm_len2 = L_PROT_HAMM_LEN2_16k; + LprotLog2 = 9; + } + + /* Apply hamming-rect window */ + mvr2r( prevsynth + hamm_len2, xfp + hamm_len2, Lprot - 2 * hamm_len2 ); + if ( element_mode == EVS_MONO ) + { + v_mult( prevsynth, w_hamm, xfp, hamm_len2 ); + mult_rev2( prevsynth + Lprot - hamm_len2, w_hamm, xfp + Lprot - hamm_len2, hamm_len2 ); + } + else + { + window_corr = w_hamm[0]; + window_corr_step = w_hamm[0] / hamm_len2; + for ( i = 0; i < hamm_len2; i++ ) + { + xfp[i] = prevsynth[i] * ( w_hamm[i] - window_corr ); + xfp[Lprot - i - 1] = prevsynth[Lprot - i - 1] * ( w_hamm[i] - window_corr ); + window_corr -= window_corr_step; + } + } + + /* Spectrum */ + if ( output_frame == L_FRAME48k ) + { + fft3( xfp, xfp, Lprot ); + } + else + { + fft_rel( xfp, Lprot, LprotLog2 ); + } + + /* Apply zeroing of non-coded FFT spectrum */ + if ( output_frame > inner_frame_tbl[bwidth] ) + { + stop_band_start = 128 << bwidth; + stop_band_length = Lprot - ( stop_band_start << 1 ); + stop_band_start = stop_band_start + 1; + set_f( xfp + stop_band_start, 0, stop_band_length ); + } + + mvr2r( xfp, X_sav, Lprot ); + + /* Magnitude representation */ + fft_spec2( xfp, Lprot ); + + for ( i = 0; i < Lprot2_1; i++ ) + { + xfp[i] = (float) sqrt( (double) xfp[i] ); + } + + /* Find maxima */ + maximum( xfp, Lprot2_1, &Xmax ); + minimum( xfp, Lprot2_1, &Xmin ); + if ( element_mode == EVS_MONO ) + { + sel = ( Xmax - Xmin ) * ( 1.0f - PFIND_SENS ); + } + else + { + sel = ( Xmax - Xmin ) * ( 1.0f - ST_PFIND_SENS ); + } + + peakfinder( xfp, Lprot2_1, plocs, num_plocs, sel, TRUE ); /* NB peak at xfp[0] and xfp Lprot2_1-1 may occur */ + + /* Currently not the pitch correlation but some LF correlation */ + if ( element_mode != EVS_MONO && *num_plocs > 50 && pcorr < 0.6f ) + { + *num_plocs = 0; + } + + if ( element_mode == EVS_MONO ) + { + /* Refine peaks */ + for ( m = 0; m < *num_plocs; m++ ) + { + if ( plocs[m] == 0 ) + { + plocsi[m] = plocs[m] + imax_pos( &xfp[plocs[m]] ); + } + else if ( plocs[m] == Lprot / 2 ) + { + plocsi[m] = plocs[m] - 2 + imax_pos( &xfp[plocs[m] - 2] ); + } + else + { + plocsi[m] = plocs[m] - 1 + imax_pos( &xfp[plocs[m] - 1] ); + } + } + } + else + { + + Lprot2p1 = Lprot / 2 + 1; + + /* Refine peaks */ + pPlocsi = plocsi; + pPlocs = plocs; + n = *num_plocs; /* number of peaks to process */ + + /* Special case-- The very 1st peak if it is at 0 index position (DC) */ + /* With DELTA_CORR_F0_INT == 2 one needs to handle both *pPlocs==0 and *pPlocs==1 */ + if ( n > 0 && *pPlocs == 0 ) /* Very 1st peak position possible to have a peak at 0/DC index position. */ + { + *pPlocsi++ = *pPlocs + imax_pos( &xfp[*pPlocs] ); + pPlocs++; + n = n - 1; + } + + if ( n > 0 && *pPlocs == 1 ) /* Also 2nd peak position uses DC which makes jacobsen unsuitable. */ + { + *pPlocsi++ = *pPlocs - 1 + imax_pos( &xfp[*pPlocs - 1] ); + currPlocs = *pPlocs++; + n = n - 1; + } + + /* All remaining peaks except the very last two possible integer positions */ + currPlocs = *pPlocs++; + endPlocs = Lprot2p1 - DELTA_CORR_F0_INT; /* last *pPlocs position for Jacobsen */ + + /* precompute number of turns based on endpoint integer location and make into a proper for loop */ + if ( n > 0 ) + { + nJacob = n; + if ( sub( endPlocs, plocs[sub( *num_plocs, 1 )] ) <= 0 ) + { + nJacob = sub( nJacob, 1 ); + } + + for ( k = 0; k < nJacob; k++ ) + { + *pPlocsi++ = currPlocs + imax2_jacobsen_mag( &( X_sav[currPlocs - 1] ), &( X_sav[Lprot - 1 - currPlocs] ) ); + currPlocs = *pPlocs++; + } + n = n - nJacob; + } + + /* At this point there should at most two plocs left to process */ + /* the position before fs/2 and fs/2 both use the same magnitude points */ + if ( n > 0 ) + { + /* [ . . . . . . . ] Lprot/2+1 positions */ + /* | | | */ + /* 0 (Lprot/2-2) (Lprot/2) */ + + if ( currPlocs == ( Lprot2p1 - DELTA_CORR_F0_INT ) ) /* Also 2nd last peak position uses fs/2 which makes jacobsen less suitable. */ + { + *pPlocsi++ = currPlocs - 1 + imax_pos( &xfp[currPlocs - 1] ); + currPlocs = *pPlocs++; + n = n - 1; + } + + /* Here the only remaining point would be a fs/2 plocs */ + /* pXfp = xfp + sub(Lprot2,1); already set just a reminder where it + * whould point */ + if ( n > 0 ) /* fs/2 which makes special case . */ + { + *pPlocsi++ = currPlocs - 2 + imax_pos( &xfp[currPlocs - 2] ); + currPlocs = *pPlocs++; + n = n - 1; + } + } + + /* For few peaks decide noise floor attenuation */ + if ( *num_plocs < 3 && *num_plocs > 0 ) + { + sig = sum_f( xfp, Lprot2_1 ) + EPSILON; + + /*excluding peaks and neighboring bins*/ + for ( i = 0; i < *num_plocs; i++ ) + { + st_point = max( 0, plocs[i] - DELTA_CORR ); + end_point = min( Lprot2_1 - 1, plocs[i] + DELTA_CORR ); + set_f( &xfp[st_point], 0.0f, end_point - st_point + 1 ); + } + noise = sum_f( xfp, Lprot2_1 ) + EPSILON; + nsr = noise / sig; + + if ( nsr < 0.03f ) + { + *noise_fac = 0.5f; + } + else + { + *noise_fac = 1.0f; + } + } + } + + return; +} + +/*-------------------------------------------------------------------* + * subst_spec() + * + * Substitution spectrum calculation + *-------------------------------------------------------------------*/ + +static void subst_spec( + const int16_t *plocs, /* i : The indicies of the identified peaks */ + const float *plocsi, /* i : Interpolated positions of the identified peaks */ + int16_t *num_plocs, /* i/o: Number of identified peaks */ + const int16_t time_offs, /* i : Time offset */ + float *X, /* i/o: FFT spectrum */ + const float *mag_chg, /* i : Magnitude modification */ + const float ph_dith, /* i : Phase dither */ + const int16_t *is_trans, /* i : Transient flags */ + const int16_t output_frame, /* i : Frame length */ + int16_t *seed, /* i/o: Random seed */ + const float *alpha, /* i : Magnitude modification factors for fade to average */ + const float *beta, /* i : Magnitude modification factors for fade to average */ + float beta_mute, /* i : Factor for long-term mute */ + const float Xavg[LGW_MAX], /* i : Frequency group averages to fade to */ + const int16_t element_mode, /* i : IVAS element mode */ + const int16_t ph_ecu_lookahead, /* i : Phase ECU lookahead */ + const float noise_fac /* i : noise factor */ + +) +{ + const float *sincos; + int16_t Xph_short; + float corr_phase[MAX_PLOCS], Xph; + float Lprot_1, cos_F, sin_F, tmp; + int16_t Lprot, Lecu, m, i, e, im_ind, delta_corr_up, delta_corr_dn, delta_tmp; + float mag_chg_local; /* for peak attenuation in burst */ + int16_t k; + float one_peak_flag_mask; + float alpha_local; + float beta_local; + + + sincos = sincos_t_ext + 128; + Lprot = (int16_t) ( L_PROT32k * output_frame / 640 ); + Lprot_1 = 1.0f / Lprot; + Lecu = output_frame * 2; + + /* Correction phase of the identified peaks */ + if ( is_trans[0] || is_trans[1] ) + { + *num_plocs = 0; + } + else + { + tmp = PI2 * ( Lecu - ( Lecu - Lprot ) / 2 + NS2SA( output_frame * FRAMES_PER_SEC, PH_ECU_ALDO_OLP2_NS ) - ph_ecu_lookahead - output_frame / 2 + time_offs ) * Lprot_1; + for ( m = 0; m < *num_plocs; m++ ) + { + corr_phase[m] = plocsi[m] * tmp; + } + } + one_peak_flag_mask = 1; /* all ones mask -> keep */ + if ( element_mode != EVS_MONO ) + { + if ( ( *num_plocs > 0 ) && sub( *num_plocs, 3 ) < 0 ) + { + one_peak_flag_mask = noise_fac; /* all zeroes mask -> zero */ + } + if ( *num_plocs == 0 ) + { + X[0] = 0; /* reset DC if there are no peaks */ + X[shr( Lprot, 1 )] = 0; /* also reset fs/2 if there are no peaks */ + } + } + + i = 1; + k = 0; + im_ind = Lprot - 1; + for ( m = 0; m < *num_plocs; m++ ) + { + delta_corr_dn = DELTA_CORR; + delta_corr_up = DELTA_CORR; + + if ( m > 0 ) + { + delta_tmp = ( plocs[m] - plocs[m - 1] - 1 ) / 2; + if ( delta_tmp < DELTA_CORR ) + { + delta_corr_dn = delta_tmp; + } + } + + if ( m < *num_plocs - 1 ) + { + delta_tmp = ( plocs[m + 1] - plocs[m] - 1 ) / 2; + if ( delta_tmp < DELTA_CORR ) + { + delta_corr_up = delta_tmp; + } + } + + /* Input Xph */ + while ( i < plocs[m] - delta_corr_dn ) + { + *seed = own_random( seed ); + + if ( *seed & 0x40 ) + { + sin_F = sincos[*seed >> 8]; + } + else + { + sin_F = -sincos[*seed >> 8]; + } + + if ( *seed & 0x80 ) + { + cos_F = sincos[-( *seed >> 8 )]; + } + else + { + cos_F = -sincos[-( *seed >> 8 )]; + } + + if ( element_mode == EVS_MONO ) + { + tmp = ( X[i] * cos_F - X[im_ind] * sin_F ); + X[im_ind] = ( X[i] * sin_F + X[im_ind] * cos_F ); + } + else + { + tmp = one_peak_flag_mask * ( X[i] * cos_F - X[im_ind] * sin_F ); + X[im_ind] = one_peak_flag_mask * ( X[i] * sin_F + X[im_ind] * cos_F ); + } + + if ( alpha[k] < 1.0f ) + { + *seed = rand_phase( *seed, &sin_F, &cos_F ); + X[i] = alpha[k] * tmp + beta[k] * Xavg[k] * cos_F; + X[im_ind] = alpha[k] * X[im_ind] + beta[k] * Xavg[k] * sin_F; + } + else + { + X[i] = mag_chg[k] * tmp; + X[im_ind] *= mag_chg[k]; + } + i++; + im_ind--; + if ( i >= ivas_gwlpr[k + 1] ) + { + k++; + } + } + + e = plocs[m] + delta_corr_up; + if ( e > Lprot / 2 - 1 ) + { + e = Lprot / 2 - 1; + } + + Xph = corr_phase[m]; + Xph_short = (int16_t) ( ( (int32_t) ( Xph * 512 / EVS_PI ) ) % 32768 ) & 0x03ff; + if ( Xph_short >= 512 ) + { + sin_F = -sincos_t_ext[Xph_short - 512]; + if ( Xph_short < 768 ) + { + cos_F = -sincos_t_ext[Xph_short - 512 + 256]; + } + else + { + cos_F = sincos_t_ext[-Xph_short + 1024 + 256]; + } + } + else + { + sin_F = sincos_t_ext[Xph_short]; + if ( Xph_short < 256 ) + { + cos_F = sincos_t_ext[Xph_short + 256]; + } + else + { + cos_F = -sincos_t_ext[-Xph_short + 256 + 512]; + } + } + + while ( i <= e ) + { + mag_chg_local = mag_chg[k]; + + if ( ph_dith != 0.0f ) + { + /* Call phase randomization only when needed */ + Xph = corr_phase[m]; + *seed = own_random( seed ); + Xph += *seed * ph_dith * PHASE_DITH_SCALE; /* where ph_dith is 0..2PI, or -2PI (in transient), bin phase scaling factor from trans_ana */ + + if ( ph_dith > 0.0f ) + { + /* up to 6 dB additional att of peaks in non_transient longer bursts, (when peak phase is randomized) */ + /* 0.5~= sqrt((float)pow(10.0,-6/10.0)); ph_dith= 0..2pi,--> scale=1.0 ...5 */ + mag_chg_local *= 0.5f + ( 1.0f - ( 1.0f / PHASE_DITH ) * ph_dith ) * 0.5f; + } + + Xph_short = (int16_t) ( Xph * 512 / EVS_PI ) & 0x03ff; + + if ( Xph_short >= 512 ) + { + sin_F = -sincos_t_ext[Xph_short - 512]; + if ( Xph_short < 768 ) + { + cos_F = -sincos_t_ext[Xph_short - 512 + 256]; + } + else + { + cos_F = sincos_t_ext[-Xph_short + 1024 + 256]; + } + } + else + { + sin_F = sincos_t_ext[Xph_short]; + if ( Xph_short < 256 ) + { + cos_F = sincos_t_ext[Xph_short + 256]; + } + else + { + cos_F = -sincos_t_ext[-Xph_short + 256 + 512]; + } + } + } + + tmp = ( X[i] * cos_F - X[im_ind] * sin_F ); + X[im_ind] = ( X[i] * sin_F + X[im_ind] * cos_F ); + if ( alpha[k] < 1.0f ) + { + alpha_local = mag_chg_local; + beta_local = (float) ( beta_mute * sqrt( 1.0f - SQR( alpha_local ) ) ); + if ( k >= LGW32k - 1 ) + { + beta_local *= 0.1f; + } + else if ( k >= LGW16k - 1 ) + { + beta_local *= 0.5f; + } + + *seed = rand_phase( *seed, &sin_F, &cos_F ); + X[i] = alpha_local * tmp + beta_local * Xavg[k] * cos_F; + X[im_ind] = alpha_local * X[im_ind] + beta_local * Xavg[k] * sin_F; + } + else + { + X[i] = mag_chg_local * tmp; + X[im_ind] *= mag_chg_local; + } + + i++; + im_ind--; + if ( i >= ivas_gwlpr[k + 1] ) + { + k++; + } + } + } + + while ( i < Lprot / 2 ) + { + *seed = own_random( seed ); + + if ( *seed & 0x40 ) + { + sin_F = sincos[*seed >> 8]; + } + else + { + sin_F = -sincos[*seed >> 8]; + } + + if ( *seed & 0x80 ) + { + cos_F = sincos[-( *seed >> 8 )]; + } + else + { + cos_F = -sincos[-( *seed >> 8 )]; + } + + + if ( element_mode == EVS_MONO ) + { + tmp = ( X[i] * cos_F - X[im_ind] * sin_F ); + X[im_ind] = ( X[i] * sin_F + X[im_ind] * cos_F ); + } + else + { + tmp = one_peak_flag_mask * ( X[i] * cos_F - X[im_ind] * sin_F ); + X[im_ind] = one_peak_flag_mask * ( X[i] * sin_F + X[im_ind] * cos_F ); + } + + if ( alpha[k] < 1.0f ) + { + *seed = rand_phase( *seed, &sin_F, &cos_F ); + X[i] = alpha[k] * tmp + beta[k] * Xavg[k] * cos_F; + X[im_ind] = alpha[k] * X[im_ind] + beta[k] * Xavg[k] * sin_F; + im_ind--; + } + else + { + X[i] = mag_chg[k] * tmp; + X[im_ind--] *= mag_chg[k]; + } + i++; + + if ( i >= ivas_gwlpr[k + 1] ) + { + k++; + } + } + + return; +} + +/*-------------------------------------------------------------------------- + * rec_wtda() + * + * Windowing and TDA of reconstructed frame + *--------------------------------------------------------------------------*/ + +static void rec_wtda( + float *X, /* i/o: ECU frame / unwindowed ECU frame */ + float *ecu_rec, /* o : Reconstructed frame in tda domain */ + const int16_t output_frame, /* i : Frame length */ + const int16_t Lprot, /* i : Prototype frame length */ + const float old_dec[270], /* i : end of last decoded for OLA before tda and itda */ + const int16_t element_mode, /* i : IVAS element mode */ + const int16_t *num_p, /* i : Number of peaks */ + const int16_t *plocs /* i : Peak locations */ +) +{ + int16_t timesh; + int16_t xf_len; + int16_t i; + float *p_ecu; + float g; + float tbl_delta; + float xsubst_[2 * L_FRAME48k]; + const float *w_hamm; + float *pX_start, *pX_end; + float tmp; + int16_t hamm_len2; + float *pNew; + const float *pOldW, *pNewW; + float xfwin[NS2SA( L_FRAME48k * FRAMES_PER_SEC, N_ZERO_MDCT_NS - ( 2 * FRAME_SIZE_NS - L_PROT_NS ) / 2 )]; + const float *pOld; + int16_t copy_len; + int16_t ola_len; + + copy_len = NS2SA( output_frame * FRAMES_PER_SEC, ( 2 * FRAME_SIZE_NS - L_PROT_NS ) / 2 ); /* prototype fill on each side of xsubst to fill MDCT Frame */ + ola_len = NS2SA( output_frame * FRAMES_PER_SEC, N_ZERO_MDCT_NS - ( 2 * FRAME_SIZE_NS - L_PROT_NS ) / 2 ); /* remaining lengt of LA_ZEROS to overlap add decoded with xsubst */ + + if ( output_frame == L_FRAME48k ) + { + w_hamm = w_hamm_sana48k_2; + hamm_len2 = L_PROT_HAMM_LEN2_48k; + } + else if ( output_frame == L_FRAME32k ) + { + w_hamm = w_hamm_sana32k_2; + hamm_len2 = L_PROT_HAMM_LEN2_32k; + } + else + { + w_hamm = w_hamm_sana16k_2; + hamm_len2 = L_PROT_HAMM_LEN2_16k; + } + + if ( element_mode != EVS_MONO && *num_p > 0 && plocs[0] > 3 ) + { + /* Perform inverse windowing of hammrect */ + pX_start = X; + pX_end = X + Lprot - 1; + for ( i = 0; i < hamm_len2; i++ ) + { + tmp = 1.0f / *w_hamm; + *pX_start *= tmp; + *pX_end *= tmp; + pX_start++; + pX_end--; + w_hamm++; + } + } + + /* extract reconstructed frame with aldo window */ + timesh = NS2SA( output_frame * FRAMES_PER_SEC, N_ZERO_MDCT_NS ) - ( 2 * output_frame - Lprot ) / 2; + + set_f( xsubst_, 0.0f, 2 * output_frame - Lprot + timesh ); + mvr2r( X, xsubst_ + 2 * output_frame - Lprot + timesh, Lprot - timesh ); + + /* Copy and OLA look ahead zero part of MDCT window from decoded signal */ + if ( element_mode != EVS_MONO ) + { + mvr2r( old_dec, xsubst_ + NS2SA( output_frame * FRAMES_PER_SEC, N_ZERO_MDCT_NS ), copy_len ); /* also need to scale to Q0 ?? */ + pOld = old_dec + copy_len; + pNew = xsubst_ + copy_len + NS2SA( output_frame * FRAMES_PER_SEC, N_ZERO_MDCT_NS ); + sinq( EVS_PI / ( ola_len * 2 ), 0.0f, ola_len, xfwin ); + v_mult( xfwin, xfwin, xfwin, ola_len ); /* xfwin = sin^2 of 0..pi/4 */ + pOldW = xfwin + ola_len - 1; + pNewW = xfwin; + for ( i = 0; i < ola_len; i++ ) + { + *pNew = *pOld * *pOldW + *pNew * *pNewW; + pOld += 1; + pNew += 1; + pOldW -= 1; + pNewW += 1; + } + } + else + { + /* Smoothen onset of ECU frame */ + xf_len = (int16_t) ( (float) output_frame * N_ZERO_MDCT_NS / FRAME_SIZE_NS ) - ( output_frame - Lprot / 2 ); + p_ecu = xsubst_ + 2 * output_frame - Lprot + timesh; + tbl_delta = 64.f / xf_len; /* 64 samples = 1/4 cycle in sincos_t */ + for ( i = 0; i < xf_len; i++, p_ecu++ ) + { + g = sincos_t[( (int16_t) ( i * tbl_delta ) )]; + g *= g; + *p_ecu = g * ( *p_ecu ); + } + } + + /* Apply TDA and windowing to ECU frame */ + wtda( xsubst_ + output_frame, ecu_rec, NULL, ALDO_WINDOW, ALDO_WINDOW, output_frame ); + + return; +} + + +/*-------------------------------------------------------------------------- + * rec_frame() + * + * Frame reconstruction + *--------------------------------------------------------------------------*/ + +static void rec_frame( + float *X, /* i/o: FFT spectrum / IFFT of spectrum */ + float *ecu_rec, /* o : Reconstructed frame in tda domain */ + const int16_t output_frame, /* i : Frame length */ + const float *old_dec, /* i : end of last decoded for OLA before tda and itda */ + const int16_t element_mode, /* i : IVAS element mode */ + const int16_t *num_p, /* i : Number of peaks */ + const int16_t *plocs /* i : Peak locations */ +) +{ + int16_t Lprot, LprotLog2 = 0; + + Lprot = 2 * output_frame * L_PROT32k / 1280; + + if ( output_frame == L_FRAME48k ) + { + LprotLog2 = 9; + } + else if ( output_frame == L_FRAME32k ) + { + LprotLog2 = 10; + } + else + { + LprotLog2 = 9; + } + + /* extend spectrum and IDFT */ + if ( output_frame == L_FRAME48k ) + { + ifft3( X, X, Lprot ); + } + else + { + ifft_rel( X, Lprot, LprotLog2 ); + } + + rec_wtda( X, ecu_rec, output_frame, Lprot, old_dec, element_mode, num_p, plocs ); + + return; +} + + +/*-------------------------------------------------------------------------- + * fir_dwn() + * + * FIR downsampling filter + *--------------------------------------------------------------------------*/ + +static void fir_dwn( + const float x[], /* i : input vector */ + const float h[], /* i : impulse response of the FIR filter */ + float y[], /* o : output vector (result of filtering) */ + const int16_t L, /* i : input vector size */ + const int16_t K, /* i : order of the FIR filter (K+1 coefs.) */ + const int16_t decimation /* i : decimation */ +) +{ + float s; + int16_t i, j, k, mmax; + + k = 0; + + /* do the filtering */ + for ( i = K / 2; i < L; i += decimation ) + { + s = x[i] * h[0]; + + if ( i < K ) + { + mmax = i; + } + else + { + mmax = K; + } + + for ( j = 1; j <= mmax; j++ ) + { + s += h[j] * x[i - j]; + } + + y[k] = s; + k++; + } + + for ( ; i < L + K / 2; i += decimation ) + { + s = 0; + + for ( j = i - L + 1; j <= K; j++ ) + { + s += h[j] * x[i - j]; + } + + y[k] = s; + k++; + } + + return; +} + + +/*-------------------------------------------------------------------------- + * fec_ecu_pitch() + * + * Pitch/correlation analysis and adaptive analysis frame length calculation + *--------------------------------------------------------------------------*/ + +static void fec_ecu_pitch( + const float *prevsynth, /* i : previous synthesis */ + float *prevsynth_LP, /* o : down-sampled synthesis */ + const int16_t L, /* i : Output frame length */ + int16_t *N, /* o : Analysis frame length in 8kHz */ + float *min_corr, /* o : correlation */ + int16_t *decimatefator, /* o : Decimation factor */ + const int16_t HqVoicing /* i : Hq voicing flag */ +) +{ + int16_t i, filt_size; + float accA, accB, accC, Ryy; + int16_t delay_ind, k, cb_start, cb_end, tmp_short, Lon20; + float Asr_LP[FEC_DCIM_FILT_SIZE_MAX + 1]; + + switch ( L ) + { + case L_FRAME48k: + *decimatefator = 6; + filt_size = 60; + mvr2r( Asr_LP48, Asr_LP, filt_size + 1 ); + break; + case L_FRAME32k: + *decimatefator = 4; + filt_size = 40; + mvr2r( Asr_LP32, Asr_LP, filt_size + 1 ); + break; + case L_FRAME16k: + *decimatefator = 2; + filt_size = 20; + mvr2r( Asr_LP16, Asr_LP, filt_size + 1 ); + break; + default: + *decimatefator = 2; + filt_size = 40; + mvr2r( Asr_LP16, Asr_LP, filt_size + 1 ); + break; + } + + /* We need to inverse the ALDO window */ + + /* Resampling to work at 8Khz */ + fir_dwn( prevsynth, Asr_LP, prevsynth_LP, 2 * L, filt_size, *decimatefator ); /* resampling without delay */ + + Lon20 = (int16_t) ( ( L / 20 ) / *decimatefator ); + + /* Correlation analysis */ + *min_corr = 0; + accC = 0; + for ( k = 0; k < 6 * Lon20; k++ ) + { + accC += prevsynth_LP[34 * Lon20 + k] * prevsynth_LP[34 * Lon20 + k]; + } + + if ( HqVoicing == 1 ) + { + cb_start = 0; + cb_end = 33 * Lon20; + } + else + { + cb_start = 0; + cb_end = 28 * Lon20; + } + + tmp_short = 34 * Lon20; + accB = 0; + delay_ind = cb_start; + for ( i = cb_start; i < cb_end; i++ ) /* cb_end = 35 let 6 ms min of loop size */ + { + accA = 0; + if ( i == cb_start ) + { + accB = 0; + for ( k = 0; k < 6 * Lon20; k++ ) + { + accA += prevsynth_LP[i + k] * prevsynth_LP[tmp_short + k]; + accB += prevsynth_LP[i + k] * prevsynth_LP[i + k]; + } + } + else + { + accB = accB - prevsynth_LP[i - 1] * prevsynth_LP[i - 1] + prevsynth_LP[i + 6 * Lon20 - 1] * prevsynth_LP[i + 6 * Lon20 - 1]; + for ( k = 0; k < 6 * Lon20; k++ ) + { + accA += prevsynth_LP[i + k] * prevsynth_LP[tmp_short + k]; + } + } + + /* tests to avoid division by zero */ + if ( accB <= 0 ) + { + accB = 1.0f; + } + + if ( accC <= 0 ) + { + accC = 1.0f; + } + + if ( accB * accC <= 0 ) + { + Ryy = accA; + } + else + { + Ryy = accA / (float) sqrt( ( accB * accC ) ); + } + + if ( Ryy > *min_corr ) + { + *min_corr = Ryy; + delay_ind = i; + } + + if ( HqVoicing == 0 && *min_corr > 0.95f ) + { + break; + } + } + + *N = 40 * Lon20 - delay_ind - 6 * Lon20; + + return; +} + + +/*-------------------------------------------------------------------------- + * fec_ecu_dft() + * + * DFT analysis on adaptive frame length. Analysis frame stretched to + * next power of 2 using linear interpolation. + *--------------------------------------------------------------------------*/ + +static void fec_ecu_dft( + const float *prevsynth_LP, /* i : Downsampled past synthesis (2*160 samples) */ + const int16_t N, /* i : Analysis frame length in 8 kHz (corr. max) */ + float *Tfr, /* o : DFT coefficients, real part */ + float *Tfi, /* o : DFT coefficients, imag part */ + float *sum_Tf_abs, /* o : Sum of magnitude spectrum */ + float *Tf_abs, /* o : Magnitude spectrum */ + int16_t *Nfft, /* o : DFT analysis length 2^(nextpow2(N)) */ + const int16_t element_mode /* i : IVAS element mode */ +) +{ + float target[2 * L_FRAME8k], tmp; + int16_t i, Lon20, tmp_short, N_LP, k; + int16_t alignment_point; + + Lon20 = (int16_t) 160 / 20; + if ( element_mode == EVS_MONO ) + { + alignment_point = 2 * 160 - 3 * Lon20; + } + else + { + alignment_point = 2 * 160; + } + + + for ( i = 0; i < N; i++ ) + { + target[i] = prevsynth_LP[alignment_point - N + i]; + } + + /* DFT */ + *sum_Tf_abs = 0; + *Nfft = (int16_t) pow( 2, (int16_t) ceil( log( N ) / log( 2 ) ) ); + tmp = ( (float) N - 1.0f ) / ( (float) *Nfft - 1.0f ); + + set_f( Tfr, 0.0f, *Nfft ); + set_f( Tfi, 0.0f, *Nfft ); + Tfr[0] = target[0]; + Tfr[*Nfft - 1] = target[N - 1]; + for ( i = 1; i < *Nfft - 1; i++ ) /* interpolation for FFT */ + { + tmp_short = (int16_t) floor( i * tmp ); + Tfr[i] = target[tmp_short] + ( (float) i * tmp - ( (float) tmp_short ) ) * ( target[tmp_short + 1] - target[tmp_short] ); + } + + DoRTFTn( Tfr, Tfi, *Nfft ); + N_LP = (int16_t) ceil( *Nfft / 2 ); + + for ( k = 0; k < N_LP; k++ ) + { + Tf_abs[k] = (float) sqrt( Tfr[k] * Tfr[k] + Tfi[k] * Tfi[k] ); + *sum_Tf_abs += Tf_abs[k]; + } + + return; +} + +/*--------------------------------------------------------------------------* + * singenerator() + * + * fast cosinus generator Amp*cos(2*pi*freq+phi) + *--------------------------------------------------------------------------*/ + + +static void singenerator( + const int16_t L, /* i : size of output */ + const float cosfreq, /* i : cosine of 1-sample dephasing at the given frequency */ + const float sinfreq, /* i : sine of 1-sample dephasing at the given frequency */ + const float a_re, /* i : real part of complex spectral coefficient at the given frequency */ + const float a_im, /* i : imag part of complex spectral coefficient at the given frequency */ + float xx[] /* o : output vector */ +) +{ + + float *ptr, L_C0, L_S0, L_C1, L_S1; + float C0, S0, C1, S1; + int16_t i; + + L_C0 = a_re; + S0 = a_im; + + ptr = xx; + + *ptr = *ptr + L_C0; + ptr++; + + for ( i = 0; i < L / 2 - 1; i++ ) + { + C0 = L_C0; + L_C1 = C0 * cosfreq; + L_C1 = L_C1 - S0 * sinfreq; + L_S1 = C0 * sinfreq; + S1 = L_S1 + S0 * cosfreq; + *ptr = *ptr + L_C1; + ptr++; + + C1 = L_C1; + L_C0 = C1 * cosfreq; + L_C0 = L_C0 - S1 * sinfreq; + L_S0 = C1 * sinfreq; + S0 = L_S0 + S1 * cosfreq; + *ptr = *ptr + L_C0; + ptr++; + } + + C0 = L_C0; + L_C1 = C0 * cosfreq; + L_C1 = L_C1 - S0 * sinfreq; + *ptr = *ptr + L_C1; + ptr++; + + return; +} + + +/*-------------------------------------------------------------------------- + * sinusoidal_synthesis() + * + * ECU frame sinusoid generation + *--------------------------------------------------------------------------*/ + +static void sinusoidal_synthesis( + const float *Tfr, /* i : DFT coefficients, real part */ + const float *Tfi, /* i : DFT coefficients, imag part */ + float *Tf_abs, /* i : Magnitude spectrum */ + const int16_t N, /* i : Analysis frame length in 8 kHz (corr. max) */ + const int16_t L, /* i : Output frame length */ + const int16_t decimate_factor, /* i : Downsampling factor */ + const int16_t Nfft, /* i : DFT analysis length 2^(nextpow2(N)) */ + const float sum_Tf_abs, /* i : Sum of magnitude spectrum */ + float *synthesis, /* o : ECU sinusoidal synthesis */ + const int16_t HqVoicing /* i : HQ voicing flag */ +) +{ + int16_t i, k, nb_pulses, indmax = 0, nb_pulses_final; + int16_t pulses[FEC_MAX / 2]; + float a_re[FEC_NB_PULSE_MAX], a_im[FEC_NB_PULSE_MAX], cosfreq, sinfreq; + float freq[FEC_NB_PULSE_MAX], tmp; + float mmax, cumsum; + int16_t Lon20 = 8; + + /* peak selection */ + int16_t PL, cpt; + float old, new_s; + int16_t *p_pulses; + int16_t glued; + + p_pulses = pulses; + nb_pulses = 0; + new_s = Tf_abs[1]; + glued = 1; + cpt = 0; + old = 0; + + PL = 0; + if ( N > Lon20 * 10 || HqVoicing ) + { + PL = 1; + } + while ( cpt <= N / 2 - 1 - 2 ) + { + if ( Tf_abs[cpt] > old && Tf_abs[cpt] > new_s ) + { + glued = cpt; + + for ( i = glued; i < cpt + PL + 1; i++ ) + { + *p_pulses++ = i; + nb_pulses++; + } + old = Tf_abs[cpt + PL]; + new_s = Tf_abs[cpt + 2 + PL]; + cpt = cpt + PL + 1; + glued = 1; + } + else + { + old = Tf_abs[cpt]; + new_s = Tf_abs[cpt + 2]; + cpt++; + glued = 0; + } + } + + + nb_pulses_final = 0; + + /* peak selection : keep the more energetics (max 20) */ + tmp = 1.0f / (float) ( Nfft / 2 ); + cumsum = 0; + for ( i = 0; i < min( FEC_NB_PULSE_MAX, nb_pulses ); i++ ) + { + mmax = 0; + for ( k = 0; k < nb_pulses; k++ ) + { + if ( Tf_abs[pulses[k]] > mmax ) + { + mmax = Tf_abs[pulses[k]]; + indmax = pulses[k]; + } + } + cumsum += Tf_abs[indmax]; + + if ( HqVoicing || cumsum < sum_Tf_abs * 0.7f ) + { + a_re[i] = Tfr[indmax] * tmp; + a_im[i] = Tfi[indmax] * tmp; + freq[i] = (float) indmax * 2 / ( (float) N ); + nb_pulses_final++; + Tf_abs[indmax] = -1; + } + else + { + a_re[i] = Tfr[indmax] * tmp; + a_im[i] = Tfi[indmax] * tmp; + freq[i] = (float) indmax * 2 / ( (float) N ); + nb_pulses_final++; + break; + } + } + + nb_pulses = nb_pulses_final; + + /* sinusoidal synthesis */ + set_f( synthesis, 0.0f, 40 * L / 20 ); + + if ( HqVoicing ) + { + k = 40 * L / 20; + } + else + { + k = 40 * L / 20; + } + + for ( i = 0; i < nb_pulses; i++ ) + { + cosfreq = (float) cos( EVS_PI * freq[i] / (float) decimate_factor ); + sinfreq = (float) sin( EVS_PI * freq[i] / (float) decimate_factor ); + singenerator( k, cosfreq, sinfreq, a_re[i], a_im[i], synthesis ); + } + + return; +} + +/*-------------------------------------------------------------------------- + * fec_noise_filling() + * + * Adds noise component to ECU frame by + * - subtracting the sinusoidal synthesis from the analysis frame + * - copying noise segments at random indices and adding them together + * with an overlap-add operation + * Copying the beginning of the frame from the past synthesis and aligning + * it to be inserted into wtda + *--------------------------------------------------------------------------*/ + +static void fec_noise_filling( + const float *prevsynth, /* i : Past synthesis buffer (length 2*L) */ + float *synthesis, /* i/o: Sinusoidal ECU / Sinusoidal ECU + noise */ + const int16_t L, /* i : Output frame length */ + const int16_t N, /* i : Analysis frame length in 8 kHz (corr. max) */ + const int16_t HqVoicing, /* i : HQ voicing flag */ + float *gapsynth, /* o : Buffer for crossfade to good frame */ + int16_t *ni_seed_forfec, /* i/o: Random seed for picking noise segments */ + const int16_t element_mode, /* i : IVAS element mode */ + const float *old_out ) +{ + float SS[L_FRAME48k / 2], tmp; + int16_t Rnd_N_noise; + int16_t k, kk, i; + int16_t N_noise; + float noisevect[34 * L_FRAME48k / 20]; + const float *p_mdct_ola; + int16_t alignment_point; + + if ( element_mode == EVS_MONO ) + { + alignment_point = 2 * L - 3 * L / 20; + } + else + { + alignment_point = 2 * L; + } + mvr2r( prevsynth + alignment_point - N, noisevect, N ); + + + /* Noise addition on full band */ + /* residual */ + if ( N < L ) + { + N_noise = ( N / 2 ); + for ( k = 0; k < N; k++ ) + { + noisevect[k] = ( noisevect[k] - synthesis[k] ); + } + } + else + { + N_noise = L / 2; + for ( k = 0; k < L; k++ ) + { + noisevect[k] = ( noisevect[N - L + k] - synthesis[N - L + k] ); + } + } + + if ( HqVoicing ) + { + for ( i = 0; i < N; i++ ) + { + noisevect[i] *= 0.25f; + } + } + + kk = 0; + k = 0; + Rnd_N_noise = N_noise; + + while ( k < 2 * L ) + { + if ( kk == 0 ) + { + tmp = ( ( own_random( ni_seed_forfec ) / (PCM16_TO_FLT_FAC) *0.2f ) + 0.5f ); + kk = 1; + } + else + { + tmp = ( ( own_random( ni_seed_forfec ) / (PCM16_TO_FLT_FAC) *0.3f ) + 0.7f ); + kk = 0; + } + + Rnd_N_noise = (int16_t) ( (float) N_noise * tmp ); + + sinq( (const float) EVS_PI / ( 2.0f * (float) Rnd_N_noise ), (const float) EVS_PI / ( 4.0f * (float) Rnd_N_noise ), (const int16_t) Rnd_N_noise, SS ); + + for ( i = 0; i < Rnd_N_noise; i++ ) + { + if ( k < 2 * L ) + { + synthesis[k] += ( noisevect[N_noise - Rnd_N_noise + i] * SS[i] + noisevect[N_noise + i] * SS[Rnd_N_noise - i - 1] ); /* *noisefact; */ + } + k++; + } + } + + if ( element_mode == EVS_MONO ) + { + kk = 7 * L / 20; + p_mdct_ola = prevsynth + 37 * L / 20; + } + else + { + kk = NS2SA( L * FRAMES_PER_SEC, N_ZERO_MDCT_NS ); + p_mdct_ola = old_out + kk; + } + + /* overlappadd with the ms of valid mdct of the last frame */ + sinq( EVS_PI / ( 6.0f * L / 20.0f ), EVS_PI / ( 12.0f * L / 20.0f ), 3 * L / 20, SS ); + + for ( k = 0; k < 3 * L / 20; k++ ) + { + tmp = SS[k] * SS[k]; + synthesis[k] = p_mdct_ola[k] * ( 1 - tmp ) + synthesis[k] * tmp; + } + + mvr2r( synthesis, synthesis + kk, 2 * L - kk ); + mvr2r( synthesis + L, gapsynth, L ); + + mvr2r( prevsynth + alignment_point - kk, synthesis, kk ); + + return; +} + + +/*-------------------------------------------------------------------------- + * fec_alg() + * + * Pitch based error-concealment algorithm with adaptive analysis frame + * length + *--------------------------------------------------------------------------*/ + +static void fec_alg( + const float *prevsynth, /* i : previous synthesis */ + const float *prevsynth_LP, /* i : down-sampled synthesis */ + float *ecu_rec, /* o : ECU frame with Windowing/TDA */ + const int16_t output_frame, /* i : Output frame length */ + const int16_t N, /* i : Analysis frame length in 8 kHz (corr. max) */ + const int16_t decimatefactor, /* i : Downsampling factor */ + const int16_t HqVoicing, /* i : HQ voicing flag */ + float *gapsynth, /* o : Buffer for crossfade to good frame */ + int16_t *ni_seed_forfec, /* i/o: Random seed for picking noise segments */ + const int16_t element_mode, /* i : IVAS element mode */ + const float *old_out + +) +{ + int16_t n, Nfft; + float sum_Tf_abs; + float Tfr[FEC_FFT_MAX_SIZE]; + float Tfi[FEC_FFT_MAX_SIZE]; + float Tf_abs[FEC_FFT_MAX_SIZE / 2]; + float synthesis[2 * L_FRAME48k]; + + fec_ecu_dft( prevsynth_LP, N, Tfr, Tfi, &sum_Tf_abs, Tf_abs, &Nfft, element_mode ); + + sinusoidal_synthesis( Tfr, Tfi, Tf_abs, N, output_frame, decimatefactor, Nfft, sum_Tf_abs, synthesis, HqVoicing ); + + fec_noise_filling( prevsynth, synthesis, output_frame, N * decimatefactor, HqVoicing, gapsynth, ni_seed_forfec, element_mode, old_out ); + + n = (int16_t) ( (float) output_frame * N_ZERO_MDCT_NS / FRAME_SIZE_NS ); + wtda( synthesis + ( output_frame - n ), ecu_rec, NULL, ALDO_WINDOW, ALDO_WINDOW, output_frame ); + + return; +} + + +/*-------------------------------------------------------------------------- + * hq_phase_ecu() + * + * Main routine for HQ phase ECU + *--------------------------------------------------------------------------*/ + +static void hq_phase_ecu( + const float *prevsynth, /* i : buffer of previously synthesized signal */ + float *ecu_rec, /* o : reconstructed frame in tda domain */ + int16_t *time_offs, /* i/o: Sample offset for consecutive frame losses*/ + float *X_sav, /* i/o: Stored spectrum of prototype frame */ + int16_t *num_p, /* i/o: Number of identified peaks */ + int16_t *plocs, /* i/o: Peak locations */ + float *plocsi, /* i/o: Interpolated peak locations */ + const float env_stab, /* i : Envelope stability parameter */ + int16_t *last_fec, /* i/o: Flag for usage of pitch dependent ECU */ + const int16_t prev_bfi, /* i : indicating burst frame error */ + const int16_t old_is_transient[2], /* i : flags indicating previous transient frames*/ + float *mag_chg_1st, /* i/o: per band magnitude modifier for transients*/ + float Xavg[LGW_MAX], /* i/o: Frequency group average gain to fade to */ + float *beta_mute, /* o : Factor for long-term mute */ + const int16_t bwidth, /* i : Encoded bandwidth */ + const int16_t output_frame, /* i : frame length */ + const float pcorr, /* i : pitch correlation */ + const int16_t element_mode /* i : IVAS element mode */ +) +{ + int16_t Lprot; + float mag_chg[LGW_MAX], ph_dith, X[L_PROT48k]; + int16_t seed; + float alpha[LGW_MAX], beta[LGW_MAX]; + const float *old_dec; + float noise_fac; + int16_t ph_ecu_lookahead; + + noise_fac = 1.0f; + + if ( element_mode == EVS_MONO ) + { + ph_ecu_lookahead = NS2SA( output_frame * FRAMES_PER_SEC, PH_ECU_LOOKAHEAD_NS ); + } + else + { + ph_ecu_lookahead = 0; + } + + + Lprot = ( 2 * output_frame * 4 ) / 5; + + if ( !prev_bfi || ( prev_bfi && *last_fec && ( *time_offs == output_frame ) ) ) + { + if ( prev_bfi && *last_fec && element_mode == EVS_MONO ) + { + *time_offs += 0; + } + else + { + *time_offs = 0; + } + + trans_ana( prevsynth + 2 * output_frame - Lprot - *time_offs + ph_ecu_lookahead, mag_chg, &ph_dith, mag_chg_1st, output_frame, *time_offs, env_stab, *last_fec, alpha, beta, beta_mute, Xavg ); + spec_ana( prevsynth + 2 * output_frame - Lprot - *time_offs + ph_ecu_lookahead, plocs, plocsi, num_p, X_sav, output_frame, bwidth, element_mode, &noise_fac, pcorr ); + + if ( prev_bfi && *last_fec ) + { + *time_offs += output_frame; + } + } + else + { + *time_offs += output_frame; + if ( *time_offs <= 0 ) + { + /* detect wrap around of st->time_offs */ + *time_offs = MAX16B; /* continued muting will ensure that the now fixed seeds are not creating tones */ + } + + trans_ana( prevsynth + 2 * output_frame - Lprot, mag_chg, &ph_dith, mag_chg_1st, output_frame, *time_offs, env_stab, 0, alpha, beta, beta_mute, Xavg ); /* 1.0 stable-music, 0.0 speech-like */ + } + + mvr2r( X_sav, X, Lprot ); + + /* seed for own_rand2 */ + seed = *time_offs; + if ( *num_p > 0 ) + { + seed += plocs[*num_p - 1]; + } + + subst_spec( plocs, plocsi, num_p, *time_offs, X, mag_chg, ph_dith, old_is_transient, output_frame, &seed, alpha, beta, *beta_mute, Xavg, element_mode, ph_ecu_lookahead, noise_fac ); + + /* reconstructed frame in tda domain */ + old_dec = prevsynth + 2 * output_frame - NS2SA( output_frame * FRAMES_PER_SEC, N_ZERO_MDCT_NS ); + rec_frame( X, ecu_rec, output_frame, old_dec, element_mode, num_p, plocs ); + + return; +} + + +/*-------------------------------------------------------------------------- + * hq_ecu() + * + * Main routine for HQ ECU + *--------------------------------------------------------------------------*/ + +void hq_ecu( + const float *prevsynth, /* i : buffer of previously synthesized signal */ + float *ecu_rec, /* o : reconstructed frame in tda domain */ + int16_t *time_offs, /* i/o: Sample offset for consecutive frame losses*/ + float *X_sav, /* i/o: Stored spectrum of prototype frame */ + int16_t *num_p, /* i/o: Number of identified peaks */ + int16_t *plocs, /* i/o: Peak locations */ + float *plocsi, /* i/o: Interpolated peak locations */ + const float env_stab, /* i : Envelope stability parameter */ + int16_t *last_fec, /* i/o: Flag for usage of pitch dependent ECU */ + const int16_t ph_ecu_HqVoicing, /* i : HQ Voicing flag */ + int16_t *ph_ecu_active, /* i : Phase ECU active flag */ + float *gapsynth, /* o : Gap synthesis for crossfade to good frame */ + const int16_t prev_bfi, /* i : indicating burst frame error */ + const int16_t old_is_transient[2], /* i : flags indicating previous transient frames*/ + float *mag_chg_1st, /* i/o: per band magnitude modifier for transients*/ + float Xavg[LGW_MAX], /* i/o: Frequency group average gain to fade to */ + float *beta_mute, /* o : Factor for long-term mute */ + const int16_t output_frame, /* i : frame length */ + Decoder_State *st /* i/o: decoder state structure */ +) +{ + int16_t N; + float corr = 0.0f; + int16_t decimatefactor; + float prevsynth_LP[2 * L_FRAME8k]; + HQ_DEC_HANDLE hHQ_core; + const float *fec_alg_input; + int16_t evs_mode_selection; + int16_t ivas_mode_selection; + + hHQ_core = st->hHQ_core; + if ( st->element_mode == EVS_MONO ) + { + fec_alg_input = prevsynth + NS2SA( output_frame * FRAMES_PER_SEC, ACELP_LOOK_NS / 2 - PH_ECU_LOOKAHEAD_NS ); + } + else + { + fec_alg_input = prevsynth - NS2SA( output_frame * FRAMES_PER_SEC, PH_ECU_LOOKAHEAD_NS ); + } + + /* find pitch and R value */ + if ( !( output_frame < L_FRAME16k ) ) + { + fec_ecu_pitch( fec_alg_input, prevsynth_LP, output_frame, &N, &corr, &decimatefactor, ph_ecu_HqVoicing ); + } + else + { + corr = 0.0f; + decimatefactor = 4; + N = output_frame / 4; + } + + evs_mode_selection = ( st->total_brate >= 48000 && ( output_frame >= L_FRAME16k && !prev_bfi && ( !old_is_transient[0] || old_is_transient[1] ) && + ( ph_ecu_HqVoicing || ( ( ( hHQ_core->env_stab_plc > 0.5 ) && ( corr < 0.6 ) ) || ( hHQ_core->env_stab_plc < 0.5 && ( corr > 0.85 ) ) ) ) ) ) || + ( st->total_brate < 48000 && ( ( ph_ecu_HqVoicing || corr > 0.85 ) && !prev_bfi && ( !old_is_transient[0] || old_is_transient[1] ) ) ); + + ivas_mode_selection = ( N < PH_ECU_N_LIMIT ) || ( corr < PH_ECU_CORR_LIMIT ); + + if ( ( ( st->element_mode == EVS_MONO ) && evs_mode_selection ) || + ( ( st->element_mode != EVS_MONO ) && evs_mode_selection && ivas_mode_selection ) ) + + { + fec_alg( fec_alg_input, prevsynth_LP, ecu_rec, output_frame, N, decimatefactor, ph_ecu_HqVoicing, gapsynth, &hHQ_core->ni_seed_forfec, st->element_mode, st->hHQ_core->old_out ); + *last_fec = 1; + *ph_ecu_active = 0; + *time_offs = output_frame; + } + else + { + hq_phase_ecu( prevsynth - NS2SA( output_frame * FRAMES_PER_SEC, PH_ECU_LOOKAHEAD_NS ), ecu_rec, time_offs, X_sav, num_p, plocs, plocsi, env_stab, last_fec, prev_bfi, old_is_transient, mag_chg_1st, Xavg, beta_mute, st->bwidth, output_frame, corr, st->element_mode ); + + *last_fec = 0; + *ph_ecu_active = 1; + } + + return; +} diff --git a/lib_dec/FEC_adapt_codebook.c b/lib_dec/FEC_adapt_codebook.c new file mode 100644 index 0000000000000000000000000000000000000000..3ef001909bf712190533129cc68597f84c6e42e5 --- /dev/null +++ b/lib_dec/FEC_adapt_codebook.c @@ -0,0 +1,493 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "rom_dec.h" +#include "prot.h" +#include "wmc_auto.h" + +/*------------------------------------------------------------------------- + * FEC_synchro_exc() + * + * Perform resynchronisation of the last glottal pulse in voiced frame lost + *------------------------------------------------------------------------*/ + +/*! r: do_WI flag */ +static int16_t FEC_synchro_exc( + const int16_t L_frame, /* i : length of the frame */ + float *exc, /* i/o: exc vector to modify */ + const int16_t desire_puls_pos, /* i : Pulse position send by the encoder */ + const int16_t true_puls_pos, /* i : Present pulse location */ + const int16_t Old_pitch /* i : Pitch use to create temporary adaptive codebook */ +) +{ + float exc_tmp[L_FRAME16k + L_SUBFR], min_energy, *pt_exc, *pt_exc1, ftmp, fact; + int16_t i, j, point_to_remove, point_to_add = -1, nb_min; + int16_t min_pos[L_FRAME16k / PIT_MIN_DOUBLEEXTEND], points_by_pos[L_FRAME16k / PIT_MIN_DOUBLEEXTEND], total_point, tmp_len; + int16_t *pt_pos, pos, start_search, tmp16; + int16_t remaining_len; + + /* Init */ + for ( i = 0; i < L_FRAME16k / PIT_MIN_DOUBLEEXTEND; i++ ) + { + min_pos[i] = 10000; + points_by_pos[i] = 0; + } + + /* Find number of point to remove and number of minimum */ + point_to_remove = true_puls_pos - desire_puls_pos; /* if it is negative it means remove point else it means add point */ + + pos = L_frame - true_puls_pos; + nb_min = pos / Old_pitch; + + /* if Old pitch < 128, must have at least 2 min */ + if ( Old_pitch <= 128 && nb_min < 2 ) + { + nb_min = 2; + } + + /* Must have at least 1 min */ + if ( nb_min == 0 ) + { + /* Safety check, should be very rare but still needed*/ + nb_min = 1; + } + + pt_exc = exc + pos; + + /* Find start_search for minimum energy search*/ + start_search = -3 * Old_pitch / 4; + + if ( start_search + pos < 0 ) + { + /* This case is rare but still need to be taken care*/ + start_search = -pos; + + if ( abs( start_search ) < Old_pitch / 8 ) + { + /* it's not safe to remove/add point inside 1/8 of the pulse position */ + return 0; + } + } + + /* Find min energy in the first pitch section */ + min_energy = 65536 * 65536.0f; + + /* -------------------------------------------------------------------- + * The minimum energy regions are determined by the computing the energy + * using a sliding 5-sample window. The minimum energy position is set + * at the middle of the window at which the energy is at minimum + * --------------------------------------------------------------------*/ + + ftmp = ( pt_exc[start_search] * pt_exc[start_search] ); + ftmp += ( pt_exc[start_search + 1] * pt_exc[start_search + 1] ); + ftmp += ( pt_exc[start_search + 2] * pt_exc[start_search + 2] ); + ftmp += ( pt_exc[start_search + 3] * pt_exc[start_search + 3] ); + ftmp += ( pt_exc[start_search + 4] * pt_exc[start_search + 4] ); + + if ( ftmp < min_energy ) + { + min_energy = ftmp; + min_pos[0] = ( pos + start_search + 2 ); + } + + for ( i = start_search; i < -5; i++ ) + { + ftmp -= pt_exc[i] * pt_exc[i]; + ftmp += pt_exc[i + 5] * pt_exc[i + 5]; + if ( ftmp < min_energy ) + { + min_energy = ftmp; + min_pos[0] = pos + i + 2; + } + } + + for ( j = 1; j < nb_min; j++ ) + { + min_pos[j] = min_pos[j - 1] - Old_pitch; + /* If the first minimum is in the past, forget this minimum */ + if ( min_pos[j] < 0 ) + { + /* Safety check */ + min_pos[j] = -10000; + nb_min = nb_min - 1; + } + } + + /* safety-measure against not properly initialized min_pos[] */ + if ( min_energy >= 65536 * 65536.0f ) + { + return 0; + } + + /*-------------------------------------------------------------------- + * Determine the number of samples to be added or removed at each pitch + * cycle whereby less samples are added/removed at the beginning and + * more towards the end of the frame + * --------------------------------------------------------------------*/ + + if ( nb_min == 1 || abs( point_to_remove ) == 1 ) + { + nb_min = 1; + points_by_pos[0] = (int16_t) abs( point_to_remove ); + } + else + { + /* First position */ + fact = (float) abs( point_to_remove ) / ( nb_min * nb_min ); + + total_point = (int16_t) ( fact + 0.5 ); + points_by_pos[0] = total_point; + + for ( i = 2; i <= nb_min; i++ ) + { + points_by_pos[i - 1] = (int16_t) ( fact * ( i * i ) - total_point + 0.5 ); + total_point += points_by_pos[i - 1]; + + /* ensure a constant increase */ + if ( points_by_pos[i - 1] < points_by_pos[i - 2] ) + { + tmp16 = points_by_pos[i - 2]; + points_by_pos[i - 2] = points_by_pos[i - 1]; + points_by_pos[i - 1] = tmp16; + } + } + } + + /* -------------------------------------------------------------------- + * Sample deletion or insertion is performed in minimum energy regions. + * At the end of this section the last maximum pulse in the concealed + * excitation is forced to align to the actual maximum pulse position + * at the end of the frame which is transmitted in the future frame. + * --------------------------------------------------------------------*/ + + if ( point_to_remove > 0 ) + { + point_to_add = point_to_remove; + } + + pt_exc = exc_tmp; + pt_exc1 = exc; + + i = 0; + pt_pos = min_pos + nb_min - 1; + if ( point_to_add > 0 ) /* add some points */ + { + remaining_len = L_frame; + + for ( i = 0; i < nb_min; i++ ) + { + /* Copy section */ + if ( i == 0 ) + { + /* Compute len to copy */ + tmp_len = *pt_pos; + } + else + { + /* Compute len to copy */ + tmp_len = *pt_pos - *( pt_pos + 1 ) - points_by_pos[i - 1]; + } + + mvr2r( pt_exc1, pt_exc, tmp_len ); + remaining_len -= tmp_len; + pt_exc1 += tmp_len; + pt_exc += tmp_len; + + /* add some points */ + ftmp = -( *pt_exc1 / 20 ); + for ( j = 0; j < points_by_pos[i]; j++ ) + { + *pt_exc++ = ftmp; + ftmp = -ftmp; + } + + remaining_len -= points_by_pos[i]; + pt_pos--; + } + + /* Copy remaining length */ + remaining_len = max( 0, remaining_len ); + mvr2r( pt_exc1, pt_exc, remaining_len ); + + /* Update true excitation buffer*/ + mvr2r( exc_tmp, exc, L_frame ); + } + else /* Remove points */ + { + remaining_len = L_frame; + + for ( i = 0; i < nb_min; i++ ) + { + if ( i == 0 ) + { + /* Compute len to copy */ + tmp_len = *pt_pos; + } + else + { + /* Compute len to copy */ + tmp_len = *pt_pos - *( pt_pos + 1 ) - points_by_pos[i - 1]; + } + + mvr2r( pt_exc1, pt_exc, tmp_len ); + remaining_len -= tmp_len; + pt_exc1 += tmp_len; + pt_exc += tmp_len; + + /* Remove points */ + for ( j = 0; j < points_by_pos[i]; j++ ) + { + pt_exc1++; + } + pt_pos--; + } + + /* Copy remaining length */ + remaining_len = max( 0, remaining_len ); + mvr2r( pt_exc1, pt_exc, remaining_len ); + + /* Update true excitation buffer*/ + mvr2r( exc_tmp, exc, L_frame ); + } + + return 1; +} + + +/*---------------------------------------------------------------------* + * FEC_SinOnset() + * + * Create an artificial onset when it is lost + *---------------------------------------------------------------------*/ + +void FEC_SinOnset( + float *exc, /* i/o: exc vector to modify */ + int16_t puls_pos, /* i : last pulse position desired */ + int16_t T0, + float enr_q, /* i : energy provided by the encoder */ + float *Aq, /* i : A(z) filter */ + const int16_t L_frame /* i : frame length */ +) +{ + int16_t P0, onset_len, sign = 0, i, len, L_subfr; + float h1[L_SUBFR16k], mem[M], exc_tmp[L_FRAME16k + MODE1_L_FIR_FER]; + float *pt_end, *pt_exc, enr_LP, gain; + + L_subfr = L_SUBFR; + if ( L_frame == L_FRAME16k ) + { + L_subfr = L_SUBFR16k; + } + + if ( T0 < 2 * L_subfr ) + { + onset_len = 2 * L_subfr; + } + else + { + onset_len = T0; + } + + + P0 = puls_pos; + + if ( P0 < 0 ) + { + sign = 1; + P0 = -P0; + } + + if ( P0 > PIT_MAX && L_frame == L_FRAME ) + { + P0 = PIT_MAX; /* Should never be the case, however... */ + } + else if ( P0 > PIT16k_MAX && L_frame == L_FRAME16k ) + { + P0 = PIT16k_MAX; /* Should never be the case, however... */ + } + set_f( exc_tmp, 0, L_frame + MODE1_L_FIR_FER ); /* Reset excitation vector */ + + /*--------------------------------------------* + * Find LP filter impulse response energy + *--------------------------------------------*/ + + set_f( h1, 0, L_subfr ); /* Find the impulse response */ + set_f( mem, 0, M ); + h1[0] = 1.0f; + syn_filt( Aq, M, h1, h1, L_subfr, mem, 0 ); + enr_LP = dotp( h1, h1, L_subfr ) + 0.01f; /* Find the impulse response energy */ + + /*------------------------------------------------------------------------------------------* + * Construct the harmonic part as a train of low-pass filtered pulses + *------------------------------------------------------------------------------------------*/ + + pt_exc = exc_tmp + L_frame - 1 - MODE1_L_FIR_FER / 2 - P0; /* beginning of the 1st pulse */ + pt_end = exc_tmp + onset_len; + + len = (int16_t) ( pt_exc - pt_end ); + if ( len > MODE1_L_FIR_FER ) + { + len = MODE1_L_FIR_FER; + } + if ( !sign ) + { + for ( i = 0; i < len; i++ ) + { + /* The filter response would have E=1 in full band. */ + pt_exc[i] += h_low[i]; /* As it is lp filtered, the E is somewhat lower */ + } + } + else + { + for ( i = 0; i < len; i++ ) + { + /* The filter response would have E=1 in full band. */ + pt_exc[i] -= h_low[i]; /* As it is lp filtered, the E is somewhat lower */ + } + } + + gain = (float) sqrt( 1.5 * enr_q / enr_LP ); /* divide by LP filter E, scale by transmitted E */ + gain *= 0.96f; + for ( i = 0; i < L_frame; i++ ) + { + exc_tmp[i] *= gain; + } + + mvr2r( &exc_tmp[L_frame - L_EXC_MEM], exc, L_EXC_MEM ); + + return; +} + +int16_t FEC_enhACB( + const int16_t L_frame, /* i : frame length */ + const int16_t last_L_frame, /* i : frame length of last frame */ + float *exc_io, /* i/o: adaptive codebook memory */ + const int16_t new_pit, /* i : decoded first frame pitch */ + const int16_t puls_pos, /* i : decoder position of the last glottal pulses decoded in the previous frame */ + const float bfi_pitch /* i : pitch used for concealment */ +) +{ + int16_t Tc, P0, sign, pit_search; + int16_t Tlist[10], Terr, diff_pit, dist_Plast; + float ftmp; + float exc[L_FRAME16k + L_SUBFR]; + int16_t do_WI = 1; + + set_f( exc, 0.0f, L_FRAME16k - L_EXC_MEM ); + set_f( exc + L_FRAME16k, 0.0f, L_SUBFR ); + mvr2r( exc_io, exc + L_FRAME16k - L_EXC_MEM, L_EXC_MEM ); + + Tc = (int16_t) bfi_pitch; + mvr2r( exc + L_FRAME16k - Tc, exc + L_FRAME16k, L_SUBFR ); + + /*------------------------------------------------------------ + * Decode phase information transmitted in the bitstream + * (The position of the absolute maximum glottal pulse from + * the end of the frame and its sign) + *------------------------------------------------------------*/ + + P0 = puls_pos; + sign = 0; + if ( P0 < 0 ) + { + sign = 1; + P0 = -P0; + } + + if ( L_frame == L_FRAME ) + { + if ( P0 > PIT_MAX ) + { + P0 = PIT_MAX; /* Should never be the case, however... */ + } + } + else /* L_frame == L_FRAME16k */ + { + if ( P0 > PIT16k_MAX ) + { + P0 = PIT16k_MAX; /* Should never be the case, however... */ + } + } + + /*---------------------------------------------------------------------------------- + * Find the position of the first the maximum(minimum) lp_filtered pulse + * <----- Mem --->|<--------------------- L_frame ------------>|<----- L_SUBFR --->| + * |<-------pit_search----> | | + *----------------------------------------------------------------------------------*/ + + pit_search = Tc; + + Tlist[0] = findpulse( L_frame, exc + L_frame - pit_search, pit_search, DEC, &sign ); + + Terr = (int16_t) abs( pit_search - Tlist[0] - P0 ); + + dist_Plast = Tc - Tlist[0]; + + Tlist[1] = findpulse( L_frame, exc + L_frame - pit_search, pit_search + L_SUBFR, DEC, &sign ); + + if ( Terr > abs( Tlist[1] - Tc + P0 ) ) + { + dist_Plast = Tc - Tlist[1]; + Terr = (int16_t) abs( Tlist[1] - Tc + P0 ); + } + + diff_pit = (int16_t) abs( new_pit - Tc ); + ftmp = (float) (int16_t) ( (float) L_frame / (float) Tc + 0.5 ); + + if ( Terr <= ftmp * diff_pit && Terr != 0 /* If Terr = 0, no resynchronization required */ + && Terr < L_SUBFR ) /* prevent catastrophy search */ + { + /* perform excitation resynchronization here */ + do_WI = FEC_synchro_exc( L_frame, exc, P0, dist_Plast, Tc ); + mvr2r( exc + L_FRAME16k - L_EXC_MEM, exc_io, L_EXC_MEM ); + } + else + { + do_WI = 0; + } + + if ( last_L_frame != L_FRAME16k ) + { + /* This is essential in case of bitrate switching + FEC*/ + do_WI = 0; + } + + return do_WI; +} diff --git a/lib_dec/FEC_clas_estim.c b/lib_dec/FEC_clas_estim.c new file mode 100644 index 0000000000000000000000000000000000000000..e514326be3abbe89de0209011db6386818f92a7c --- /dev/null +++ b/lib_dec/FEC_clas_estim.c @@ -0,0 +1,801 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include "cnst.h" +#include +#include "options.h" +#include +#include "prot.h" +#include "rom_com.h" +#include "stat_dec.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * Local constants + *-------------------------------------------------------------------*/ + +#define K_COR_DEC 0.8547f /* <-0.29, 0.88> */ +#define C_COR_DEC 0.2479f + +#define K_TILT_DEC 0.8333f /* <-0.35, 0.85> */ +#define C_TILT_DEC 0.2917f + +#define K_ZC_DEC -0.04f /* <63, 38> */ +#define C_ZC_DEC 2.52f + +#define K_ENR_DEC 0.04f /* <-14, 11> */ +#define C_ENR_DEC 0.56f + +#define K_PC_DEC -0.0357f /* <45, 17> */ +#define C_PC_DEC 1.6071f + +/*-------------------------------------------------------------------* + * Local function prototypes + *-------------------------------------------------------------------*/ + +static float calculate_zero_crossings( const float *synth, const int16_t L_frame ); + +static float calculate_pitch_synchr_norm_correlation( const float *pitch, const float *synth, const int16_t L_frame, const int16_t L_subfr ); + +static float calculate_spectral_tilt( const float *synth, const int16_t nbSubfr, const int16_t L_subfr ); + +static int16_t calculate_classification_result( const int16_t last_good, float fmerit1, const float ener, const int16_t codec_mode ); + +static void FEC_ClassifierCore( const float *synth, const float *pitch, const int16_t L_frame, const int16_t codec_mode, int16_t *clas, float *lp_speech, float *frame_ener, float *ener, float *enern, float *class_para, const float LTP_Gain, const int16_t narrowBand, const SIGNAL_CLASSIFIER_MODE mode ); + +static int16_t FEC_dec_class( Decoder_State *st, float *enr_q ); + +static void FEC_classificationMusic( const int16_t coder_type, int16_t *decision_hyst, int16_t *clas ); + + +/*------------------------------------------------------------------------* + * calculate_zero_crossings() + * + * + *------------------------------------------------------------------------*/ + +static float calculate_zero_crossings( + const float *synth, + const int16_t L_frame ) +{ + int16_t i; + float zc_frame; + + zc_frame = 0.f; + + for ( i = 0; i < L_frame; ++i ) + { + if ( ( synth[i] <= 0.0f ) && ( synth[i - 1] > 0.0f ) ) + { + zc_frame += 1.0f; + } + } + + /* Renormalization for 12.8kHz core*/ + zc_frame *= 256.0f / (float) L_frame; + + return zc_frame; +} + +/*------------------------------------------------------------------------* + * calculate_pitch_synchr_norm_correlation() + * + * + *------------------------------------------------------------------------*/ + +static float calculate_pitch_synchr_norm_correlation( + const float *pitch, + const float *synth, + const int16_t L_frame, + const int16_t L_subfr ) +{ + int16_t T0, pos; + int16_t j, i; + float cor_max[16]; + float enr1t, enr2t, voicing; + + T0 = (int16_t) pitch[3]; + set_zero( cor_max, 16 ); + + if ( T0 > ( 3 * ( L_subfr / 2 ) ) ) + { + T0 = (int16_t) ( 0.5f * ( pitch[2] + pitch[3] ) + 0.5f ); + } + + pos = L_frame; + j = 0; + + while ( pos > ( L_frame / L_subfr == 4 ? 3 * L_subfr : 4 * L_subfr ) ) + { + pos -= T0; + + cor_max[j] = dotp( &synth[pos], &synth[pos - T0], T0 ); + enr1t = dotp( &synth[pos - T0], &synth[pos - T0], T0 ); + enr2t = dotp( &synth[pos], &synth[pos], T0 ); + + cor_max[j] *= inv_sqrt( enr1t * enr2t + 0.1f ); + + + if ( ( pos - T0 ) < ( L_frame - L_subfr ) ) + { + T0 = (int16_t) ( 0.5f * ( pitch[2] + pitch[3] ) + 0.5f ); + } + j++; + } + + voicing = cor_max[0]; + + for ( i = 1; i < j; ++i ) + { + voicing += cor_max[i]; + } + + if ( j > 1 ) + { + voicing /= j; + } + + return voicing; +} + + +/*------------------------------------------------------------------------* + * calculate_spectral_tilt() + * + * + *------------------------------------------------------------------------*/ + +static float calculate_spectral_tilt( + const float *synth, + const int16_t nbSubfr, + const int16_t L_subfr ) +{ + int16_t i; + float tilt; + + float enr1t = 0.0f; + float enr2t = 0.0f; + const float *pt1 = synth + L_subfr; + const float *pt2 = synth + L_subfr - 1; + + for ( i = 0; i < nbSubfr - 1; ++i ) + { + enr1t += dotp( pt1, pt1, L_subfr ); + enr2t += dotp( pt1, pt2, L_subfr ); + + pt1 += L_subfr; + pt2 += L_subfr; + } + + tilt = enr2t / ( enr1t + 0.1f ); + + return tilt; +} + +/*------------------------------------------------------------------------* + * calculate_classification_result() + * + * + *------------------------------------------------------------------------*/ + +static int16_t calculate_classification_result( + const int16_t last_good, + float fmerit1, + const float ener, + const int16_t codec_mode ) +{ + int16_t result = UNVOICED_CLAS; + + switch ( last_good ) + { + case VOICED_CLAS: + case ONSET: + case SIN_ONSET: + case VOICED_TRANSITION: + + if ( fmerit1 < 0.39f ) + { + result = UNVOICED_CLAS; + } + else if ( fmerit1 < 0.63f && ( codec_mode == MODE2 || ener < -15.0f ) ) + { + result = VOICED_TRANSITION; + } + else + { + result = VOICED_CLAS; + } + break; + + case UNVOICED_CLAS: + case UNVOICED_TRANSITION: + case INACTIVE_CLAS: /* relevant for MODE2 only */ + + if ( fmerit1 > 0.56f ) + { + result = ONSET; + } + else if ( fmerit1 > 0.45f ) + { + result = UNVOICED_TRANSITION; + } + else + { + result = UNVOICED_CLAS; + } + break; + } + + return result; +} + + +/*------------------------------------------------------------------------* + * FEC_ClassifierCore() + * + * + *------------------------------------------------------------------------*/ + +static void FEC_ClassifierCore( + const float *synth, + const float *pitch, /* i : pitch values for each subframe */ + const int16_t L_frame, /* i : length of the frame */ + const int16_t codec_mode, /* i : codec mode */ + int16_t *clas, /* i/o: frame classification */ + float *lp_speech, /* i/o: long term active speech energy average */ + float *frame_ener, /* o : */ + float *ener, /* o : */ + float *enern, /* o : */ + float *class_para, /* o : classification para. fmerit1 */ + const float LTP_Gain, /* i : */ + const int16_t narrowBand, /* i : */ + const SIGNAL_CLASSIFIER_MODE mode /* i : */ +) +{ + float zc_frame; + float tiltn, corn, zcn, pcn, fmerit1, tilt; + float voicing; + float pc = 0.0f; + + /*------------------------------------------------------------------------* + * Compute the zero crossing rate for all subframes + *------------------------------------------------------------------------*/ + + zc_frame = calculate_zero_crossings( synth, L_frame ); + + /*------------------------------------------------------------------------* + * Compute the normalized correlation pitch-synch at the end of the frame + *------------------------------------------------------------------------*/ + + voicing = calculate_pitch_synchr_norm_correlation( pitch, synth, L_frame, L_SUBFR ); + + /*------------------------------------------------------------------------* + * Compute pitch coherence + *------------------------------------------------------------------------*/ + + pc = 0; /* just to remove MSVC warnings */ + if ( codec_mode == MODE1 || !( LTP_Gain != -1.0f && mode == CLASSIFIER_TCX ) ) + { + pc = (float) fabs( pitch[3] + pitch[2] - pitch[1] - pitch[0] ) * 256.0f / (float) L_frame; + } + + /*------------------------------------------------------------------------* + * Compute spectral tilt + *------------------------------------------------------------------------*/ + + tilt = calculate_spectral_tilt( synth, L_frame / L_SUBFR, L_SUBFR ); + + /*------------------------------------------------------------------------* + * Compute pitch-synchronous energy at the frame end + *------------------------------------------------------------------------*/ + + *ener = frame_energy( L_frame, pitch, synth, *lp_speech, frame_ener ); + + /*------------------------------------------------------------------------* + * transform parameters between 0 & 1 + * find unique merit function + *------------------------------------------------------------------------*/ + + *enern = K_ENR_DEC * *ener + C_ENR_DEC; + tiltn = K_TILT_DEC * tilt + C_TILT_DEC; + corn = K_COR_DEC * voicing + C_COR_DEC; + zcn = K_ZC_DEC * zc_frame + C_ZC_DEC; + + if ( codec_mode == MODE2 && LTP_Gain != -1.0f && mode == CLASSIFIER_TCX ) + { + pcn = LTP_Gain * C_PC_DEC; + } + else + { + pcn = K_PC_DEC * pc + C_PC_DEC; + } + + if ( pcn > 1.0f ) + { + pcn = 1.0f; + } + else if ( pcn < 0.0f ) + { + pcn = 0.0f; + } + + fmerit1 = ( 1.0f / 6.0f ) * ( tiltn + 2.0f * corn + zcn + pcn + *enern ); + + if ( codec_mode == MODE2 && narrowBand ) + { + fmerit1 *= 0.9f; + } + + /*------------------------------------------------------------------------* + * frame classification + *------------------------------------------------------------------------*/ + + if ( codec_mode == MODE1 ) + { + *class_para = fmerit1; + } + *clas = calculate_classification_result( *clas, fmerit1, *ener, codec_mode ); + + return; +} + + +/*------------------------------------------------------------------------* + * FEC_clas_estim() + * + * Estimation of frame class, if not available in the bitstream + *------------------------------------------------------------------------*/ + +void FEC_clas_estim( + const float *syn, + const float *pitch, /* i : pitch values for each subframe */ + const int16_t L_frame, /* i : length of the frame */ + const int16_t coder_type, /* i : coder type */ + const int16_t codec_mode, /* i : codec mode */ + float *mem_syn_clas_estim, /* i/o: memory of the synthesis signal for frame class estimation */ + int16_t *clas, /* i/o: frame classification */ + float *lp_speech, /* i/o: long term active speech energy average */ + const int16_t Opt_AMR_WB, /* i : flag indicating AMR-WB IO mode */ + int16_t *decision_hyst, /* i/o: hysteresis of the music/speech decision */ + int16_t *locattack, /* i/o: detection of attack (mainly to localized speech burst) */ + int16_t *UV_cnt, /* i/o: number of consecutives frames classified as UV */ + float *LT_UV_cnt, /* i/o: long term consecutives frames classified as UV */ + float *Last_ener, /* i/o: last_energy frame */ + int16_t *amr_io_class, /* i/o: classification for AMR-WB IO mode */ + float *lt_diff_etot, /* i/o: long-term total energy variation */ + float *class_para, /* o : classification para. fmerit1 */ + const float LTP_Gain, /* i : */ + const int16_t narrowBand, /* i : */ + const SIGNAL_CLASSIFIER_MODE mode, /* i : */ + const int16_t bfi, /* i : */ + const float preemph_fac, /* i : */ + const int16_t tcxonly, /* i : */ + const int32_t last_core_brate, /* i : last core bitrate */ + const int16_t FEC_mode /* i : ACELP FEC mode */ +) +{ + float diff_ener; + float mean_diff; + int16_t i; + float ftmp_c, fcorr, dev; + float frame_ener = 0.0f; + float ener = 0.0f; + float enern = 0.0f; + float tmp; + float old_synth[L_SYN_CLAS_ESTIM], *synth; + + /* After Rate Switching st->last_core is reset to 0. Check for last_core_brate is needed */ + if ( ( last_core_brate == SID_1k75 || last_core_brate == ACELP_6k60 || last_core_brate == ACELP_8k85 || last_core_brate == ACELP_12k65 || last_core_brate == ACELP_14k25 || last_core_brate == ACELP_15k85 || last_core_brate == ACELP_18k25 || last_core_brate == ACELP_19k85 || last_core_brate == ACELP_23k05 || last_core_brate == ACELP_23k85 ) && !Opt_AMR_WB && codec_mode == MODE2 && L_frame > L_FRAME ) + { + int16_t oldLenClasBuff, newLenClasBuff; + oldLenClasBuff = (int16_t) ( L_SYN_MEM_CLAS_ESTIM * L_FRAME / L_frame ); + newLenClasBuff = L_SYN_MEM_CLAS_ESTIM; + lerp( &mem_syn_clas_estim[L_SYN_MEM_CLAS_ESTIM - oldLenClasBuff], &mem_syn_clas_estim[L_SYN_MEM_CLAS_ESTIM - newLenClasBuff], newLenClasBuff, oldLenClasBuff ); + } + + synth = old_synth + L_SYN_MEM_CLAS_ESTIM; /* Set pointer to current frame */ + mvr2r( mem_syn_clas_estim, old_synth, L_SYN_MEM_CLAS_ESTIM ); /* Copy old synthesis into local buffer */ + mvr2r( syn, synth, L_frame ); /* Copy current synthesis into local buffer */ + + /* TCX outputs non-pre-speech */ + if ( codec_mode == MODE2 && mode == CLASSIFIER_TCX ) + { + tmp = syn[-1]; + preemph( synth, preemph_fac, L_frame, &tmp ); + } + + /* Do the classification only + - MODE1: when the class is not transmitted in the bitstream + - MODE2: on good frames (classifier is also called for bfi=1) */ + if ( ( codec_mode == MODE1 && ( FEC_mode == 0 || coder_type <= UNVOICED || Opt_AMR_WB ) ) || ( codec_mode == MODE2 && bfi != 1 && !tcxonly ) ) + { + + /*------------------------------------------------------------------------* + * classification decision depending on coder_type information + *------------------------------------------------------------------------*/ + + if ( coder_type == UNVOICED ) + { + *clas = UNVOICED_CLAS; + } + else if ( coder_type == VOICED ) + { + *clas = VOICED_CLAS; + } + else if ( coder_type == INACTIVE && !Opt_AMR_WB ) + { + *clas = INACTIVE_CLAS; + } + else + { + /*------------------------------------------------------------------------* + * GC, TC and AC frames + *------------------------------------------------------------------------*/ + + FEC_ClassifierCore( synth, pitch, L_frame, codec_mode, clas, lp_speech, &frame_ener, &ener, &enern, class_para, LTP_Gain, narrowBand, mode ); + } + + /*------------------------------------------------------------------------* + * Overwrite classification decision in case of music + *------------------------------------------------------------------------*/ + + if ( codec_mode == MODE1 ) + { + FEC_classificationMusic( coder_type, decision_hyst, clas ); + } + + /*---------------------------------------------------------------------------------* + * Measure energy on active voice frames (to improve FEC performance) + *---------------------------------------------------------------------------------*/ + + if ( *clas == VOICED_CLAS ) + { + if ( ( codec_mode == MODE2 && coder_type == VOICED ) || + ( codec_mode == MODE1 && ( Opt_AMR_WB || ( coder_type != GENERIC && coder_type != TRANSITION ) ) ) ) + { + enern = frame_energy( L_frame, pitch, synth, *lp_speech, &frame_ener ); + } + + *lp_speech = 0.99f * *lp_speech + 0.01f * frame_ener; + } + + if ( codec_mode == MODE1 ) + { + /*---------------------------------------------------------------------------------* + * Overwrite classification decision to UNVOICED_CLAS in case of INACTIVE frame + *---------------------------------------------------------------------------------*/ + + if ( coder_type == INACTIVE && *clas != INACTIVE_CLAS ) + { + *clas = UNVOICED_CLAS; + } + + /*---------------------------------------------------------------------------------* + * Classification refinement to improve noise coding (only in AMR-WB IO mode) + *---------------------------------------------------------------------------------*/ + + if ( Opt_AMR_WB ) + { + *locattack = 0; + + if ( *clas == UNVOICED_CLAS && coder_type != INACTIVE ) + { + /* unvoiced signal but not silence */ + if ( *lp_speech <= 40 ) + { + *UV_cnt = 16; + } + else + { + *UV_cnt -= 8; + } + } + else if ( coder_type != INACTIVE ) + { + /* neither unvoiced nor clean silence */ + ( *UV_cnt )++; + } + + if ( *UV_cnt > 300 ) + { + *UV_cnt = 300; + } + else if ( *UV_cnt < 0 ) + { + *UV_cnt = 0; + } + + /* Update long-term average number of frames between UNVOICED */ + if ( coder_type == INACTIVE ) + { + /* tends to speech if no activity */ + *LT_UV_cnt = 0.95f * *LT_UV_cnt; + + if ( *UV_cnt > 125 ) + { + *UV_cnt = 125; + } + } + else + { + *LT_UV_cnt = 0.9f * *LT_UV_cnt + 0.1f * *UV_cnt; + } + + /*-----------------------------------------------------------------------------* + * Compute frame energy difference + * IF long-term average is high and energy difference is relatively low + * classification is overwritten to AUDIO + * IF energy difference > 6.0dB + * consider an attack + *-----------------------------------------------------------------------------*/ + + diff_ener = ener - *Last_ener; + *Last_ener = ener; + *amr_io_class = *clas; + + if ( *LT_UV_cnt > LT_UV_THR && diff_ener < 12.0f ) + { + *amr_io_class = AUDIO_CLAS; + } + + if ( ( diff_ener > 6.0f && *clas == AUDIO_CLAS ) || ( diff_ener > 9.0f ) ) + { + *locattack = 1; + } + + /*------------------------------------------------------------------------* + * Compute statistical deviation of long-term energy variation and + * overwrite classification, if needed + *------------------------------------------------------------------------*/ + + if ( coder_type != INACTIVE ) + { + /* calculate mean energy variation of past MAX_LT frames */ + mean_diff = 0.0f; + for ( i = 1; i < MAX_LT; i++ ) + { + mean_diff += lt_diff_etot[i - 1] * INV_MAX_LT; + lt_diff_etot[i - 1] = lt_diff_etot[i]; + } + mean_diff += lt_diff_etot[i - 1] * INV_MAX_LT; + + /* find statistical deviation of the energy variation history against the last 15 frames */ + fcorr = 0.0f; + for ( i = MAX_LT - 15; i < MAX_LT; i++ ) + { + ftmp_c = lt_diff_etot[i] - mean_diff; + fcorr += ftmp_c * ftmp_c; + } + lt_diff_etot[i - 1] = diff_ener; + + /* compute statistical deviation */ + dev = (float) sqrt( fcorr / ( MAX_LT - 15 ) ); + + /* overwrite classification, if needed */ + if ( *amr_io_class == AUDIO_CLAS && dev > 5.0f ) + { + *amr_io_class = *clas; + *UV_cnt = (int16_t) ( 80 + *UV_cnt * 0.2f ); + } + } + } + } + } + + /* update the memory of synthesis for frame class estimation */ + mvr2r( old_synth + L_frame, mem_syn_clas_estim, L_SYN_MEM_CLAS_ESTIM ); + + return; +} + + +/*------------------------------------------------------------------------* + * FEC_dec_class() + * + * Decode class and energy information + *------------------------------------------------------------------------*/ + +static int16_t FEC_dec_class( + Decoder_State *st, /* i/o: decoder state structure */ + float *enr_q /* i : decoded energy */ +) +{ + int16_t clas, tmpS; + + clas = ONSET; + + if ( st->coder_type != VOICED ) + { + /* decode the class */ + tmpS = get_next_indice( st, FEC_BITS_CLS ); + + if ( tmpS == 0 ) + { + clas = UNVOICED_CLAS; + } + else if ( tmpS == 1 ) + { + if ( st->last_good >= VOICED_TRANSITION ) + { + clas = VOICED_TRANSITION; + } + else + { + clas = UNVOICED_TRANSITION; + } + } + else if ( tmpS == 2 ) + { + clas = VOICED_CLAS; + } + } + else + { + clas = VOICED_CLAS; + } + + /* decode the energy */ + if ( st->acelp_cfg.FEC_mode > 1 ) + { + tmpS = get_next_indice( st, FEC_BITS_ENR ); + + /* convert from logarithmic to linear domain (the range is 0 : 1.55 : 96 dB) */ + *enr_q = (float) pow( 10.0f, ( (float) tmpS * FEC_ENR_STEP ) / 10.0f ); + } + + return clas; +} + + +/*------------------------------------------------------------------------* + * FEC_classificationMusic() + * + * + *------------------------------------------------------------------------*/ + +static void FEC_classificationMusic( + const int16_t coder_type, /* i : coder type */ + int16_t *decision_hyst, /* i/o: hysteresis of the music/speech decision */ + int16_t *clas /* i/o: frame classification */ +) +{ + if ( coder_type == AUDIO ) + { + ( *decision_hyst ) += 4; + } + else + { + ( *decision_hyst )--; + } + + if ( coder_type == INACTIVE ) + { + *decision_hyst -= 10; + } + + if ( *decision_hyst > 200 ) + { + *decision_hyst = 200; + } + else if ( *decision_hyst < 0 ) + { + *decision_hyst = 0; + } + + if ( *decision_hyst > 16 && *clas < VOICED_CLAS && coder_type == AUDIO ) + { + *clas = VOICED_CLAS; + } + + return; +} + + +/*------------------------------------------------------------------------* + * FEC_pos_dec() + * + * Decode class, energy and last glottal pulse position at higher bitrates + * ( last glottal pulse position is encoded only in GENERIC frames ) + *------------------------------------------------------------------------*/ + +int16_t FEC_pos_dec( + Decoder_State *st, /* i/o: decoder state structure */ + int16_t *last_pulse_pos, /* o : last glottal pulse position in the lost ACB */ + float *enr_q, /* o : decoded energy */ + const int16_t nBits_es_Pred /* i : number of bits for Es_pred Q */ + +) +{ + int16_t pitch_index, T0, T0_frac, T0_min, T0_max; + int16_t bit_pos_pitch_index, nBits; + + T0 = 0; + if ( st->coder_type > UNVOICED ) + { + /* decode the clas and energy information */ + if ( st->coder_type < AUDIO ) + { + st->clas_dec = FEC_dec_class( st, enr_q ); + + if ( st->coder_type == GENERIC && st->clas_dec == VOICED_CLAS && ( st->last_good <= UNVOICED_CLAS || st->last_good == INACTIVE_CLAS ) ) + { + st->clas_dec = SIN_ONSET; + } + } + + if ( st->coder_type == GENERIC && st->acelp_cfg.FEC_mode > 2 ) + { + nBits = st->acelp_cfg.pitch_bits[0]; + + /* The first pitch index is located right after the actual position + the last pulse position index + predicted innovation energy index */ + bit_pos_pitch_index = st->next_bit_pos + FEC_BITS_POS + nBits_es_Pred; + if ( st->core_brate >= MIN_BRATE_AVQ_EXC && st->core_brate <= MAX_BRATE_AVQ_EXC_TD && st->coder_type == GENERIC ) + { + /* Harmonic flag is present */ + bit_pos_pitch_index++; + } + + /* retrieve the pitch index */ + pitch_index = get_indice( st, bit_pos_pitch_index, nBits ); + + /* decode pitch period */ + T0_min = PIT_MIN; + T0_max = PIT_MAX; + pit16k_Q_dec( pitch_index, 10, 1, &T0, &T0_frac, &T0_min, &T0_max, &st->BER_detect ); + + /* decode last pulse position */ + *last_pulse_pos = get_next_indice( st, FEC_BITS_POS ); + + /* respect the sign */ + if ( *last_pulse_pos >= 128 ) + { + *last_pulse_pos = -( *last_pulse_pos & 0x7F ); + } + + if ( T0 >= 128 ) + { + *last_pulse_pos *= 2; + } + + if ( st->BER_detect ) + { + *last_pulse_pos = 0; + } + } + } + + return T0; +} diff --git a/lib_dec/FEC_lsf_estim.c b/lib_dec/FEC_lsf_estim.c new file mode 100644 index 0000000000000000000000000000000000000000..e8e16599149c57723c6432fa0149abad1639b566 --- /dev/null +++ b/lib_dec/FEC_lsf_estim.c @@ -0,0 +1,90 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * FEC_lsf_estim() + * + * - LSP calculation + * - A(z) calculation + *-------------------------------------------------------------------*/ + +void FEC_lsf2lsp_interp( + Decoder_State *st, /* i/o: Decoder static memory */ + const int16_t L_frame, /* i : length of the frame */ + float *Aq, /* o : calculated A(z) for 4 subframes */ + float *lsf, /* o : estimated LSF vector */ + float *lsp /* o : estimated LSP vector */ +) +{ + /* convert LSFs to LSPs */ + if ( st->Opt_AMR_WB ) + { + isf2isp( lsf, lsp, M, INT_FS_12k8 ); + } + else + { + if ( L_frame == L_FRAME ) + { + lsf2lsp( lsf, lsp, M, INT_FS_12k8 ); + } + else /* L_frame == L_FRAME16k */ + { + lsf2lsp( lsf, lsp, M, INT_FS_16k ); + } + } + + /*----------------------------------------------------------------------* + * Interpolate LSP vector and find A(z) + *----------------------------------------------------------------------*/ + + if ( st->Opt_AMR_WB ) + { + int_lsp( L_frame, st->lsp_old, lsp, Aq, M, interpol_isp_amr_wb, 1 ); + } + else + { + int_lsp( L_frame, st->lsp_old, lsp, Aq, M, interpol_frac_12k8, 0 ); + } + + return; +} diff --git a/lib_dec/FEC_pitch_estim.c b/lib_dec/FEC_pitch_estim.c new file mode 100644 index 0000000000000000000000000000000000000000..738000a4d55c24ff0c85c5573fe103fe4872fb91 --- /dev/null +++ b/lib_dec/FEC_pitch_estim.c @@ -0,0 +1,89 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + + +#include +#include "options.h" +#include "cnst.h" +#include "prot.h" +#include "wmc_auto.h" + +/*------------------------------------------------------------------------* + * FEC_pitch_estim() + * + * Estimation of pitch for FEC + *------------------------------------------------------------------------*/ + +void FEC_pitch_estim( + const int16_t Opt_AMR_WB, /* i : flag indicating AMR-WB IO mode */ + const int16_t last_core, /* i : last core */ + const int16_t L_frame, /* i : length of the frame */ + const int16_t clas, /* i : current frame classification */ + const int16_t last_good, /* i : last good clas information */ + const float pitch_buf[], /* i : Floating pitch for each subframe */ + const float old_pitch_buf[], /* i : buffer of old subframe pitch values */ + float *bfi_pitch, /* i/o: update of the estimated pitch for FEC */ + int16_t *bfi_pitch_frame, /* o : frame length when pitch was updated */ + int16_t *upd_cnt, /* i/o: update counter */ + const int16_t coder_type /* i : coder_type */ +) +{ + if ( last_core == HQ_CORE || last_core == TCX_20_CORE || last_core == TCX_10_CORE ) + { + *bfi_pitch = pitch_buf[( L_frame / L_SUBFR ) - 1]; + *bfi_pitch_frame = L_frame; + *upd_cnt = MAX_UPD_CNT; + } + + if ( ( clas == VOICED_CLAS && last_good >= VOICED_TRANSITION ) || ( Opt_AMR_WB && clas == VOICED_CLAS ) ) + { + /* update pitch for FEC if pitch is coherent */ + if ( ( ( pitch_buf[3] < 1.4f * pitch_buf[1] ) && ( pitch_buf[3] > 0.7f * pitch_buf[1] ) && + ( pitch_buf[1] < 1.4f * old_pitch_buf[2 * NB_SUBFR - 1] ) && ( pitch_buf[1] > 0.7f * old_pitch_buf[2 * NB_SUBFR - 1] ) && + ( L_frame == L_FRAME ) ) || + ( ( pitch_buf[3] < 1.4f * pitch_buf[1] ) && ( pitch_buf[3] > 0.7f * pitch_buf[1] ) && + ( pitch_buf[1] < 1.4f * old_pitch_buf[2 * NB_SUBFR16k - 1] ) && ( pitch_buf[1] > 0.7f * old_pitch_buf[2 * NB_SUBFR16k - 1] ) && + ( L_frame == L_FRAME16k ) ) || + ( coder_type == TRANSITION ) ) + { + *bfi_pitch = pitch_buf[( L_frame / L_SUBFR ) - 1]; + *bfi_pitch_frame = L_frame; + *upd_cnt = 0; + } + } + + return; +} diff --git a/lib_dec/FEC_scale_syn.c b/lib_dec/FEC_scale_syn.c new file mode 100644 index 0000000000000000000000000000000000000000..5ac57bb9125f580c6bc10aa2c175e4848293824b --- /dev/null +++ b/lib_dec/FEC_scale_syn.c @@ -0,0 +1,441 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "wmc_auto.h" + +#define SCLSYN_LAMBDA 0.3f + +/*-------------------------------------------------------------------* + * FEC_scale_syn() + * + * Smooth speech energy evolution when recovering after erasure(s) + *-------------------------------------------------------------------*/ + +void FEC_scale_syn( + const int16_t L_frame, /* i : length of the frame */ + int16_t clas, /* i/o: frame classification */ + const int16_t last_good, /* i : last good frame classification */ + float *synth, /* i/o: synthesized speech at Fs = 12k8 Hz */ + const float *pitch, /* i : pitch values for each subframe */ + float enr_old, /* i : energy at the end of previous frame */ + float enr_q, /* i : transmitted energy for current frame */ + const int16_t coder_type, /* i : coder type */ + const int16_t LSF_Q_prediction, /* i : LSF prediction mode */ + int16_t *scaling_flag, /* i/o: flag to indicate energy control of syn */ + float *lp_ener_FEC_av, /* i/o: averaged voiced signal energy */ + float *lp_ener_FEC_max, /* i/o: averaged voiced signal energy */ + const int16_t bfi, /* i : current frame BFI */ + const int32_t total_brate, /* i : total bitrate */ + const int16_t prev_bfi, /* i : previous frame BFI */ + const int32_t last_core_brate, /* i : previous frame core bitrate */ + float *exc, /* i/o: excitation signal without enhancement */ + float *exc2, /* i/o: excitation signal with enhancement */ + const float Aq[], /* i : LP filter coefs */ + float *old_enr_LP, /* i/o: LP filter E of last good voiced frame */ + const float *mem_tmp, /* i : temp. initial synthesis filter states */ + float *mem_syn, /* o : initial synthesis filter states */ + const int16_t avoid_lpc_burst_on_recovery, /* i : if true the excitation energy is limited if LP has big gain */ + const int16_t force_scaling /* i : force scaling */ +) +{ + int16_t i; + float enr1, enr2, gain1, gain2; + float scaling, ener_max, enr2_av, enr2_max; + float enr_LP; + float h1[L_FRAME / 2], tilt, rr0, rr1, pitch_dist, mean_pitch; + int16_t k; + + gain2 = 0.0f; + gain1 = 0.0f; + scaling = 1.0f; + enr_LP = 0.0f; + + /*-----------------------------------------------------------------* + * Find the synthesis filter impulse response on voiced + *-----------------------------------------------------------------*/ + + if ( clas >= VOICED_TRANSITION && clas < INACTIVE_CLAS ) + { + if ( L_frame == L_FRAME ) + { + enr_LP = enr_1_Az( Aq + ( NB_SUBFR - 1 ) * ( M + 1 ), L_SUBFR ); + } + else /* L_frame == L_FRAME16k */ + { + enr_LP = enr_1_Az( Aq + ( NB_SUBFR16k - 1 ) * ( M + 1 ), L_SUBFR ); + } + } + + /*-----------------------------------------------------------------* + * Define when to scale the synthesis + *-----------------------------------------------------------------*/ + + if ( bfi ) + { + *scaling_flag = 1; /* Always check synthesis on bad frames */ + } + else if ( prev_bfi ) + { + if ( ( LSF_Q_prediction == AUTO_REGRESSIVE ) || ( LSF_Q_prediction == MOVING_AVERAGE ) ) + { + *scaling_flag = 2; /* Decoded LSFs affected */ + } + else if ( coder_type != TRANSITION ) + { + *scaling_flag = 1; /* SN, but not TC mode - LSF still affected by the interpolation */ + } + else + { + *scaling_flag = 0; /* LSF still possibly affected due to interpolation */ + } + scaling = 1.5f; + } + else + { + if ( ( LSF_Q_prediction == AUTO_REGRESSIVE ) && ( *scaling_flag == 2 ) ) + { + *scaling_flag = 2; /* Continue with energy control till the end of AR prediction */ + } + else if ( *scaling_flag > 0 ) + { + ( *scaling_flag )--; /* If scaling flag was equal to 2, add one control frame to account for the LSF interpolation */ + } + scaling = 2.0f; + } + + /*-----------------------------------------------------------------* + * Find the energy/gain at the end of the frame + *-----------------------------------------------------------------*/ + + fer_energy( L_frame, clas, synth, pitch[( L_frame >> 6 ) - 1], &enr2, L_frame ); + + if ( bfi || ( total_brate == ACELP_7k20 ) || ( total_brate == ACELP_8k00 ) ) + { + /* previous frame erased and no TC frame */ + if ( *scaling_flag > 0 ) + { + enr2 += 0.01f; + + if ( bfi ) /* In all bad frames, limit the gain to 1 */ + { + gain2 = (float) sqrt( enr_old / enr2 ); + if ( gain2 > 1.0f ) + { + gain2 = 1.0f; + } + + /* find the energy/gain at the beginning of the frame */ + fer_energy( L_frame, clas, synth, pitch[0], &enr1, 0 ); + + enr1 += 0.1f; + gain1 = (float) sqrt( enr_old / enr1 ); + if ( gain1 > 1.0f ) + { + gain1 = 1.0f; + } + } + else /* good frame */ + { + if ( enr_q == 0 ) /* If E info (FEC protection bits) is not available in the bitstream */ + { + enr_q = enr2; + + set_f( h1, 0.0f, L_FRAME / 2 ); + h1[0] = 1.0f; + syn_filt( Aq + ( 3 * ( M + 1 ) ), M, h1, h1, L_FRAME / 2, h1 + ( M + 1 ), 0 ); + rr0 = dotp( h1, h1, L_FRAME / 2 - 1 ) + 0.001f; + rr1 = dotp( h1, h1 + 1, L_FRAME / 2 - 1 ); + tilt = rr1 / rr0; + + pitch_dist = 0.0f; + mean_pitch = pitch[0]; + for ( k = 0; k < ( NB_SUBFR - 1 ); k++ ) + { + pitch_dist += abs( (int16_t) ( pitch[k + 1] + 0.5f ) - (int16_t) ( pitch[k] + 0.5f ) ); + mean_pitch += pitch[k + 1]; + } + pitch_dist /= (float) ( NB_SUBFR - 1 ); + mean_pitch /= (float) ( NB_SUBFR ); + + if ( ( tilt > 0.7f ) && /* HF resonnant filter */ + ( ( pitch_dist > 8.0f ) || ( mean_pitch < PIT_MIN ) ) && /* pitch unstable or very short */ + ( ( prev_bfi ) || ( ( coder_type == GENERIC ) && ( LSF_Q_prediction == AUTO_REGRESSIVE ) ) ) ) + { + if ( enr_q > scaling * enr_old ) + { + enr_q = scaling * enr_old; + } + } + else + { + if ( ( clas <= VOICED_TRANSITION ) || ( clas >= INACTIVE_CLAS ) ) + { + ener_max = *lp_ener_FEC_av; + } + else + { + ener_max = *lp_ener_FEC_max; + } + + if ( enr_old > ener_max ) + { + ener_max = enr_old; + } + if ( enr_q > scaling * ener_max ) + { + enr_q = scaling * ener_max; + } + } + } + + gain2 = (float) sqrt( enr_q / enr2 ); + + + /*-----------------------------------------------------------------* + * Find the energy/gain at the beginning of the frame to ensure smooth transition after erasure(s) + *-----------------------------------------------------------------*/ + + if ( ( ( last_good >= VOICED_TRANSITION && last_good < INACTIVE_CLAS && ( clas == UNVOICED_CLAS || clas == INACTIVE_CLAS ) ) || + last_core_brate == SID_1k75 || last_core_brate == SID_2k40 || last_core_brate == FRAME_NO_DATA ) && + prev_bfi ) + { + /* voiced -> unvoiced signal transition */ + /* CNG -> active signal transition */ + gain1 = gain2; + } + else + { + /* find the energy at the beginning of the frame */ + fer_energy( L_frame, clas, synth, pitch[0], &enr1, 0 ); + + enr1 += 0.1f; + gain1 = (float) sqrt( enr_old / enr1 ); + if ( gain1 > 1.2f ) + { + /* prevent clipping */ + gain1 = 1.2f; + } + + /* prevent amplifying the unvoiced or inactive part of the frame in case an offset is followed by an onset */ + if ( clas == ONSET && gain1 > gain2 && prev_bfi ) + { + gain1 = gain2; + } + } + + enr2 = enr_q; /* Set the end frame energy to the scaled energy, to be used in the lp_ener_FEC */ + } + + /*------------------------------------------------------------------------------* + * Smooth the energy evolution by exponentially evolving from gain1 to gain2 + *------------------------------------------------------------------------------*/ + + gain2 *= ( 1.0f - AGC ); + for ( i = 0; i < L_frame; i++ ) + { + gain1 = gain1 * AGC + gain2; + exc[i] *= gain1; + exc2[i] *= gain1; + } + + /* smoothing is done in excitation domain, so redo synthesis */ + mvr2r( mem_tmp, mem_syn, M ); + syn_12k8( L_frame, Aq, exc2, synth, mem_syn, 1 ); + } + } + else + { + /* previous frame erased and no TC frame */ + if ( prev_bfi && coder_type != TRANSITION ) + { + enr2 += 0.01f; + if ( enr_q == 0 ) /* If E info (FEC protection bits) is not available in the bitstream */ + { + enr_q = enr2; + + set_f( h1, 0.0f, L_FRAME / 2 ); + h1[0] = 1.0f; + syn_filt( Aq + ( 3 * ( M + 1 ) ), M, h1, h1, L_FRAME / 2, h1 + ( M + 1 ), 0 ); + rr0 = dotp( h1, h1, L_FRAME / 2 - 1 ) + 0.001f; + rr1 = dotp( h1, h1 + 1, L_FRAME / 2 - 1 ); + tilt = rr1 / rr0; + + if ( ( ( ( total_brate == ACELP_13k20 ) || ( total_brate == ACELP_12k85 ) || ( total_brate == ACELP_12k15 ) || ( total_brate == ACELP_11k60 ) || + ( total_brate == ACELP_9k60 ) ) && + ( tilt > 0.7f ) && /* HF resonnant filter */ + ( ( clas == UNVOICED_CLAS ) || ( clas == INACTIVE_CLAS ) ) ) ) /* unvoiced classification */ + { + if ( enr_q > scaling * enr_old ) + { + enr_q = scaling * enr_old; + } + } + else if ( last_good >= VOICED_TRANSITION && last_good < INACTIVE_CLAS && clas >= VOICED_TRANSITION && clas < INACTIVE_CLAS ) + { + /* voiced -> voiced recovery */ + if ( ( *old_enr_LP != 0.0f ) && ( enr_LP > 2 * *old_enr_LP ) ) + { + enr_q /= enr_LP; + enr_q *= 2 * *old_enr_LP; + } + else if ( avoid_lpc_burst_on_recovery && enr_LP > 20.0f ) + { + enr_q = (float) ( enr_q * sqrt( 20.0f / enr_LP ) ); + } + } + + if ( ( last_good >= VOICED_TRANSITION && last_good < INACTIVE_CLAS && clas >= VOICED_TRANSITION && clas < INACTIVE_CLAS ) || force_scaling ) + { + if ( enr_q > enr_old ) + { + enr_q = ( 1 - SCLSYN_LAMBDA ) * enr_old + SCLSYN_LAMBDA * enr_q; + } + } + } + + gain2 = (float) sqrt( enr_q / enr2 ); + + /* do not allow E increase if enr_q index == 0 (lower end Q clipping) */ + if ( enr_q < 1.1f ) + { + if ( gain2 > 1.0f ) + { + gain2 = 1.0f; + } + } + else + { + if ( gain2 > 1.2f ) + { + gain2 = 1.2f; + } + } + + /*-----------------------------------------------------------------* + * Find the energy/gain at the beginning of the frame to ensure smooth transition after erasure(s) + *-----------------------------------------------------------------*/ + + if ( clas == SIN_ONSET ) + { + /* allow only slow increase */ + gain1 = 0.5f * gain2; + } + else if ( ( last_good >= VOICED_TRANSITION && last_good < INACTIVE_CLAS && ( clas == UNVOICED_CLAS || clas == INACTIVE_CLAS ) ) || last_core_brate == SID_1k75 || last_core_brate == SID_2k40 || last_core_brate == FRAME_NO_DATA ) + { + /* voiced -> unvoiced signal transition */ + /* CNG -> active signal transition */ + gain1 = gain2; + } + else + { + /* find the energy at the beginning of the frame */ + fer_energy( L_frame, clas, synth, pitch[0], &enr1, 0 ); + + enr1 += 0.1f; + gain1 = (float) sqrt( enr_old / enr1 ); + if ( gain1 > 1.2f ) + { + /* prevent clipping */ + gain1 = 1.2f; + } + if ( avoid_lpc_burst_on_recovery && ( enr_LP > 20.0f ) && ( enr_LP <= 2 * *old_enr_LP ) && ( gain1 > 1.0f ) ) + { + gain1 = 1.0f; + } + + /* prevent amplifying the unvoiced or inactive part of the frame in case an offset is followed by an onset */ + if ( clas == ONSET && gain1 > gain2 ) + { + gain1 = gain2; + } + } + + /*-----------------------------------------------------------------* + * Smooth the energy evolution by exponentially evolving from gain1 to gain2 + *-----------------------------------------------------------------*/ + + gain2 *= ( 1.0f - AGC ); + for ( i = 0; i < L_frame; i++ ) + { + gain1 = gain1 * AGC + gain2; + exc[i] *= gain1; + exc2[i] *= gain1; + } + + /* smoothing is done in excitation domain, so redo synthesis */ + mvr2r( mem_tmp, mem_syn, M ); + syn_12k8( L_frame, Aq, exc2, synth, mem_syn, 1 ); + } + } + + /*-----------------------------------------------------------------* + * Update low-pass filtered energy for voiced frames + *-----------------------------------------------------------------*/ + + if ( !bfi && ( clas >= VOICED_TRANSITION && clas < INACTIVE_CLAS ) ) + { + if ( clas == VOICED_TRANSITION ) + { + enr2_av = enr2; + fer_energy( L_frame, VOICED_CLAS, synth, pitch[( L_frame >> 6 ) - 1], &enr2_max, L_frame ); + } + else + { + enr2_max = enr2; + fer_energy( L_frame, UNVOICED_CLAS, synth, pitch[( L_frame >> 6 ) - 1], &enr2_av, L_frame ); + } + + *lp_ener_FEC_av = 0.05f * enr2_av + 0.95f * *lp_ener_FEC_av; + *lp_ener_FEC_max = 0.05f * enr2_max + 0.95f * *lp_ener_FEC_max; + } + + /*-----------------------------------------------------------------* + * Update the LP filter energy for voiced frames + *-----------------------------------------------------------------*/ + + if ( clas >= VOICED_TRANSITION && clas < INACTIVE_CLAS ) + { + *old_enr_LP = enr_LP; + } + + + return; +} diff --git a/lib_dec/LD_music_post_filter.c b/lib_dec/LD_music_post_filter.c new file mode 100644 index 0000000000000000000000000000000000000000..dd2493b0e687d78d082bee8a3617e225ff83ba12 --- /dev/null +++ b/lib_dec/LD_music_post_filter.c @@ -0,0 +1,764 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * Local constants + *-------------------------------------------------------------------*/ + +#define MAX_SNR1 45.0f +#define INV_MAX_SNR ( 1.f / ( MAX_SNR1 - 1.0f ) ) /* max. SNR considered for noise subtraction in voiced segments */ +#define MAX_SNR_SNR1 ( MAX_SNR1 * INV_MAX_SNR ) /* 45 * (1 / (MAX_SNR1-1)) */ + + +#define BIN_1KHZ ( int16_t )( 1000.f / BIN_16kdct ) +#define BIN_2KHZ ( int16_t )( 2000.f / BIN_16kdct ) +#define BIN_4KHZ ( int16_t )( 4000.f / BIN_16kdct ) + +#define MAX_GN_R 0.2f +#define ALPH 1.00f +#define BET ( 1.925f - ALPH ) +#define MAXX 5 + +/*-------------------------------------------------------------------* + * Local function prototypes + *-------------------------------------------------------------------*/ + +static void spectrum_mod_dct( float data[], const float lf_E[], float lf_EO[], const float noiseE[], const float minGain, float lp_gbin[], const int16_t music_flag, int16_t min_band, const float MAX_GN, const int16_t max_band ); + +static void analy_sp_dct( const float dct_in[], float dct_buf[], float *fr_bands, float *lf_E, float *etot ); + +static void find_enr_dct( const float data[], float band[], float *ptE, float *Etot, const int16_t min_band, const int16_t max_band, float *Bin_E, const float bin_freq ); + + +/*------------------------------------------------------------------------* + * LD_music_post_filter() + * + * Music post-filter + *------------------------------------------------------------------------*/ + +void LD_music_post_filter( + MUSIC_POSTFILT_HANDLE hMusicPF, /* i/o: LD music postfilter handle */ + const float dtc_in[], /* i : input synthesis */ + float dtc_out[], /* o : output synthesis */ + const int32_t core_brate, /* i : core bitrate */ + const int16_t coder_type, /* i : Coder type : -1 in case of IO */ + const int16_t Last_coder_type /* i : last Coder type */ +) +{ + float DCT_buf[DCT_L_POST]; + float fr_bands[MBANDS_GN_LD]; + float lf_E[VOIC_BINS_HR]; + float etot, ftmp; + int16_t i, j, k; + int16_t min_band = 0; + float local_min_gain = hMusicPF->LDm_enh_min_ns_gain; + int16_t music_flag2 = 0; + float max_val; + float max_ovf_2k, max_ovf_4k, max_ovf_6k; + float min_g_2k, min_g_4k, min_g_6k; + float m_ave, old_ftmp; + float old_ftmp_1; + float tmp_lfE[DCT_L_POST]; + float MAX_GN = MAX_GN_R; + int16_t MAX_band = MBANDS_GN_LD; + + /*------------------------------------------------------------------------* + * Frequency analysis + *------------------------------------------------------------------------*/ + + analy_sp_dct( dtc_in, DCT_buf, fr_bands, lf_E, &etot ); + + /*------------------------------------------------------------------------* + * Find signal classification + *------------------------------------------------------------------------*/ + + music_flag2 = stab_est( etot, hMusicPF->LDm_lt_diff_etot, &hMusicPF->LDm_mem_etot, &hMusicPF->LDm_nb_thr_3, &hMusicPF->LDm_nb_thr_1, hMusicPF->LDm_thres, &hMusicPF->LDm_last_music_flag, 1 ); + + if ( core_brate < ACELP_6k60 || Last_coder_type != AUDIO ) + { + /* do not perform music improvement on SID frames */ + music_flag2 = 0; + } + + if ( music_flag2 < 4 ) + { + hMusicPF->last_nonfull_music = 0; + } + else + { + ( hMusicPF->last_nonfull_music )++; + } + + hMusicPF->last_nonfull_music = min( 51, hMusicPF->last_nonfull_music ); + + /*------------------------------------------------------------------------* + * Remapping of bands + * Section to "remap" the minimal band and the minimum gain for our needs + *------------------------------------------------------------------------*/ + + if ( music_flag2 > 3 ) + { + min_band = 2; + local_min_gain = 0.25119f; + } + else if ( music_flag2 == 3 ) + { + min_band = 3; + local_min_gain = 0.25119f; + } + else if ( music_flag2 == 2 ) + { + min_band = 4; + local_min_gain = 0.35481f; + } + else if ( music_flag2 == 1 ) + { + min_band = 4; + local_min_gain = 0.50119f; + } + + min_band += 4; + + MAX_GN = 0.1f; + if ( core_brate > ACELP_9k60 ) + { + /* overshoot not allowed, since GSC already matches the energy */ + MAX_GN = 0.0f; + } + + if ( coder_type == AUDIO ) + { + /* with GSC we know for sure that we are in music */ + min_band = min( min_band, 3 ); + } + + /*------------------------------------------------------------------------* + * Approximation of the inter-harmonic noise level + * - sort the bin energy + * - compupte the average energy per band excluding the maximum energy bin + *------------------------------------------------------------------------*/ + + j = 0; + for ( i = 0; i < MBANDS_GN_LD; i++ ) + { + m_ave = 0.0f; + max_val = 0.0f; + + for ( k = j; k < mfreq_bindiv_LD[i] + j; k++ ) + { + m_ave += lf_E[k]; + max_val = max( max_val, lf_E[k] ); + } + + m_ave -= max_val; + m_ave /= mfreq_bindiv_LD[i] - 1; + + hMusicPF->LDm_bckr_noise[i] = m_ave * sc_qnoise[i]; + j += mfreq_bindiv_LD[i]; + } + + i = maximum( lf_E, DCT_L_POST, &m_ave ); + + /*------------------------------------------------------------------------* + * - Normalisation of the energy vector between [0.72, 5], with the form of pow(x,4) + * - Simple LP filtering along the frequency domain + * - LT averaging with the past and in function of the stability factor + *------------------------------------------------------------------------*/ + + m_ave = ALPH / lf_E[i]; + + ftmp = lf_E[0] * m_ave + BET; + ftmp *= ftmp; + ftmp *= ftmp; + ftmp *= ftmp; + ftmp = min( ftmp, MAXX ); + old_ftmp = ftmp; + + ftmp = lf_E[1] * m_ave + BET; + ftmp *= ftmp; + ftmp *= ftmp; + ftmp *= ftmp; + ftmp = min( ftmp, MAXX ); + old_ftmp_1 = ftmp; + tmp_lfE[0] = 0.5f * old_ftmp + 0.5f * ftmp; + + for ( i = 1; i < DCT_L_POST - 1; i++ ) + { + tmp_lfE[i] = 0.333f * old_ftmp + 0.333f * old_ftmp_1; + old_ftmp = old_ftmp_1; + ftmp = lf_E[i + 1] * m_ave + BET; + ftmp *= ftmp; + ftmp *= ftmp; + ftmp *= ftmp; + old_ftmp_1 = min( ftmp, MAXX ); + tmp_lfE[i] += 0.333f * old_ftmp_1; + } + + ftmp = lf_E[i] * m_ave + BET; + ftmp *= ftmp; + ftmp *= ftmp; + ftmp *= ftmp; + ftmp = min( ftmp, MAXX ); + tmp_lfE[i] = 0.5f * old_ftmp + 0.5f * ftmp; + + for ( i = 0; i < BIN_4KHZ; i++ ) + { + hMusicPF->filt_lfE[i] = tmp_lfE[i] * 0.05f + 0.95f * hMusicPF->filt_lfE[i]; + } + + for ( ; i < DCT_L_POST; i++ ) + { + hMusicPF->filt_lfE[i] = tmp_lfE[i] * 0.15f + 0.85f * hMusicPF->filt_lfE[i]; + } + + /*------------------------------------------------------------------------* + * Reduce inter-harmonic noise with SNR based method + * Second stage of spectral shaping modification based on the pow(x,4) energy spectrum + *------------------------------------------------------------------------*/ + + if ( coder_type == AUDIO ) + { + MAX_band = 16; + } + + spectrum_mod_dct( DCT_buf, lf_E, hMusicPF->LDm_enh_lf_EO, hMusicPF->LDm_bckr_noise, local_min_gain, hMusicPF->LDm_enh_lp_gbin, music_flag2, min_band, MAX_GN, MAX_band ); + + i = 0; + if ( music_flag2 >= 1 ) + { + for ( i = 0; i < BIN_1KHZ; i++ ) + { + ftmp = min( 1.0f, hMusicPF->filt_lfE[i] ); + DCT_buf[i] *= ftmp; + } + } + + if ( hMusicPF->last_nonfull_music > 40 ) + { + max_ovf_2k = 1.25f; + max_ovf_4k = 1.5f; + max_ovf_6k = 1.5f; + + min_g_2k = 0.0f; + min_g_4k = 0.0f; + min_g_6k = 0.0f; + + if ( coder_type == AUDIO ) + { + max_ovf_2k = 1.0f; + max_ovf_4k = 1.1f; + max_ovf_6k = 1.25f; + + min_g_2k = 0.75f; + min_g_4k = 0.5f; + min_g_6k = 0.5f; + + if ( core_brate > ACELP_9k60 ) + { + max_ovf_4k = 1.0f; + max_ovf_6k = 1.15f; + + min_g_2k = 0.925f; + min_g_4k = 0.825f; + min_g_6k = 0.75f; + } + } + else if ( core_brate >= ACELP_12k65 ) + { + max_ovf_2k = 1.0f; + max_ovf_4k = 1.25f; + + if ( core_brate > ACELP_15k85 ) + { + max_ovf_4k = 1.0f; + max_ovf_6k = 1.25f; + + min_g_2k = 0.75f; + min_g_4k = 0.5f; + min_g_6k = 0.5f; + } + } + + for ( ; i < BIN_2KHZ; i++ ) + { + ftmp = min( max_ovf_2k, hMusicPF->filt_lfE[i] ); + ftmp = max( min_g_2k, ftmp ); + DCT_buf[i] *= ftmp; + } + + for ( ; i < BIN_4KHZ; i++ ) + { + ftmp = min( max_ovf_4k, hMusicPF->filt_lfE[i] ); + ftmp = max( min_g_4k, ftmp ); + DCT_buf[i] *= ftmp; + } + + if ( coder_type != AUDIO || core_brate > ACELP_8k85 ) + { + /* Do not modify HF when coded with GSC at LR, because the spectrum is just noise */ + for ( ; i < DCT_L_POST; i++ ) + { + ftmp = min( max_ovf_6k, hMusicPF->filt_lfE[i] ); + ftmp = max( min_g_6k, ftmp ); + DCT_buf[i] *= ftmp; + } + } + } + else if ( hMusicPF->last_nonfull_music > 25 ) + { + /* When unsure on content type only slight clean-up allowed, no overshoot allowed */ + for ( ; i < DCT_L_POST; i++ ) + { + ftmp = min( 1.f, hMusicPF->filt_lfE[i] ); + DCT_buf[i] *= ftmp; + } + } + + /* reconstruction of the enhanced synthesis */ + mvr2r( DCT_buf, dtc_out, DCT_L_POST ); +} + +/*---------------------------------------------------------------------------* + * spectrum_mod_dct() + * + * spectrum enhancement according to the output of signal_type_clas() + *---------------------------------------------------------------------------*/ + +static void spectrum_mod_dct( + float data[], /* i/o: DCT spectrum */ + const float lf_E[], /* i : per bin E for first 46 bins (without DC) */ + float lf_EO[], /* i/o: old per bin E for previous half frame */ + const float noiseE[], /* i : per band background noise energy estimate */ + const float minGain, /* i : minimum suppression gain */ + float lp_gbin[], /* i/o: Smoothed suppression gain, per FFT bin */ + const int16_t music_flag, /* i : music ? 1:0 */ + int16_t min_band, + const float MAX_GN, + const int16_t MAX_band ) +{ + float maxNoise; + float binE[VOIC_BINS_HR]; + float gain, minE; + float freq; + float slope; + float inv_noise[MBANDS_GN_LD]; + float *pt_gbin, alpha, tmpN; + int16_t i; + float *pt; + float tmp, shift; + const float *pt2; + + gain = 0.0f; + + /*-----------------------------------------------------------------* + * Compute the inverse of noise + *-----------------------------------------------------------------*/ + + for ( i = 0; i <= MBANDS_GN_LD - 1; i++ ) + { + inv_noise[i] = 1.0f / noiseE[i]; + } + + /*----------------------------------------------------------------------* + * Perform noise reduction for 1 frames + *----------------------------------------------------------------------*/ + + for ( i = 0; i < VOIC_BINS_HR; i++ ) + { + binE[i] = 0.3f * lf_EO[i] + 0.7f * lf_E[i]; + } + mvr2r( lf_E, lf_EO, VOIC_BINS_HR ); /* update */ + + /*----------------------------------------------------------------------* + * Find the maximum noise in a critical band + *----------------------------------------------------------------------*/ + + maxNoise = 0.0f; + for ( i = 0; i <= MBANDS_GN_LD - 1; i++ ) + { + set_max( &maxNoise, noiseE[i] ); + } + + /* pointer initialization */ + pt = &data[0]; + + /*-----------------------------------------------------------------* + * Initialization for active speech frames or VAD hangover frames, + * (exclude Clean speech) + *-----------------------------------------------------------------*/ + + if ( music_flag != 0 ) /* prevent subtraction on clean speech */ + { + if ( maxNoise <= 10.0f ) + { + minE = .5625f; + } + else + { + minE = minGain * minGain; + } + + pt2 = binE; + freq = 0; + + pt_gbin = lp_gbin; + tmp = INV_MAX_SNR; + slope = tmp - tmp * minE; + shift = MAX_SNR_SNR1 * minE - tmp; + for ( i = 0; i < min_band; i++ ) + { + for ( ; freq <= mfreq_loc_LD[i]; freq += BIN_16kdct ) + { + pt2++; + pt++; + *pt_gbin++ = 1.0f; + } + } + + /*-----------------------------------------------------------------* + * Per Frequency MODE1_BIN processing + * For highly voiced and highly pitched speech, use per bin + * subtraction in low frequencies (maximum up to 3700 Hz, + * first 17 critical bands) + *-----------------------------------------------------------------*/ + + for ( ; i < MAX_band /*MBANDS_GN_LD*/; i++ ) + { + + tmp = INV_MAX_SNR_tab[i]; + slope = tmp - tmp * minE; + shift = MAX_SNR_SNR1_tab[i] * minE - tmp; + + tmpN = slope * inv_noise[i]; + tmp = 0.0f; + while ( freq <= mfreq_loc_LD[i] ) + { + gain = 1.0f; + + if ( noiseE[i] >= 0.5f ) /* Do not alter if noise E very low */ + { + gain = tmpN * *pt2 + shift; /* limits: [x,y] = {[1, minE], [MAX_SNR1, 1]}, */ + } + + pt2++; + + if ( gain < minE ) + { + gain = minE; + } + + if ( gain > 1.0f + MAX_GN ) + { + gain = 1.0f + MAX_GN; + } + + /* the gain smoothing control: stronger lp filtering for lower gains */ + alpha = 1.0f - (float) sqrt( gain ); + + *pt_gbin = gain + alpha * *pt_gbin; + *pt++ *= *pt_gbin; + freq += BIN_16kdct; + pt_gbin++; + } + } + } + else + { + freq = BIN_16kdct; + pt_gbin = lp_gbin; + for ( i = 0; i < MBANDS_GN_LD; i++ ) + { + for ( ; freq <= mfreq_loc_LD[i]; freq += BIN_16kdct ) + { + *pt_gbin = 0.9f * *pt_gbin + 0.1f; + pt_gbin++; + } + } + } + + return; +} + +/*----------------------------------------------------------------------------------* + * analy_sp_dct() + * + * Spectral analysis of the current synthesized frame + *----------------------------------------------------------------------------------*/ + +static void analy_sp_dct( + const float dct_in[], /* i : input DCT spectrum */ + float dct_buf[], /* i : output DCT spectrum */ + float *fr_bands, /* o : energy in critical frequency bands */ + float *lf_E, /* o : per bin E for first... */ + float *etot /* o : total input energy */ +) +{ + float Bin_E[DCT_L_POST]; + + *etot = 0.0f; + mvr2r( dct_in, dct_buf, DCT_L_POST ); + + /*-----------------------------------------------------------------* + * Windowing + * Compute spectrum + * find energy per critical frequency band and total energy in dB + *-----------------------------------------------------------------*/ + + find_enr_dct( dct_buf, fr_bands, lf_E, etot, 0, MBANDS_GN_LD, Bin_E, BIN_16kdct ); + + /* find average log total energy over both half-frames */ + *etot = 10.0f * (float) log10( *etot ) - 3.0103f; + + return; +} + +/*------------------------------------------------------------------------* + * find_enr_dct) + * + * find input signal energy for each critical band and first 74 LF bins + * The energy is normalized by the number of frequency bins in a channel + *------------------------------------------------------------------------*/ + +void find_enr_dct( + const float data[], /* i : fft result, for the format see fft_rel.c */ + float band[], /* o : per band energy */ + float *ptE, /* o : per bin energy for low frequencies */ + float *Etot, /* o : total energy */ + const int16_t min_band, /* i : minimum critical band */ + const int16_t max_band, /* i : maximum critical band */ + float *Bin_E, /* o : Per bin energy */ + const float bin_freq /* i : Number of frequency bins */ +) +{ + int16_t i, cnt; + float freq, tmp; + const float *ptR; + + ptR = &data[0]; /* pointer to first real coefficient */ + freq = 0; + for ( i = 0; i < max_band; i++ ) + { + band[i] = 0.0f; + cnt = 0; + while ( freq <= mfreq_loc_LD[i] ) + { + /* energy */ + *ptE = *ptR * *ptR; + + /* normalization - corresponds to FFT normalization by 2/L_FFT */ + *ptE *= 1.0f / ( DCT_L_POST ); + + *Bin_E = *ptE; + Bin_E++; + band[i] += *ptE++; + ptR++; + + freq += bin_freq; + cnt++; + } + + /* normalization per frequency bin */ + band[i] /= cnt; + + if ( band[i] < E_MIN ) + { + band[i] = E_MIN; + } + } + + /*-----------------------------------------------------------------* + * Find the total energy over the input bandwidth + *-----------------------------------------------------------------*/ + + tmp = *Etot; + for ( i = min_band; i <= NB_LIMIT_BAND; i++ ) + { + /* total channel energy */ + tmp += band[i]; + } + + *Etot = tmp; + + return; +} + +/*------------------------------------------------------------------------* + * Prep_music_postP() + * + * Performs the steps needed to do the music post processing + *------------------------------------------------------------------------*/ + +void Prep_music_postP( + float exc_buffer_in[], /* i/o: excitation buffer */ + float dct_buffer_out[], /* o : DCT output buffer */ + float filt_lfE[], /* i/o: long term spectrum energy */ + const int16_t last_core, /* i : last core */ + const float *pitch_buf, /* i : current frame pitch information */ + float *LDm_enh_lp_gbin /* o : smoothed suppression gain, per bin FFT */ +) +{ + int16_t i; + float *pt1; + const float *pt2; + int16_t s_pit, fr_pit; + int16_t offset2; + + offset2 = OFFSET2; + + s_pit = (int16_t) ( pitch_buf[3] ); + fr_pit = (int16_t) ( ( pitch_buf[3] - s_pit ) * 4.0f ); + + /*------------------------------------------------------------* + * Extrapolation of the last future part and windowing + *------------------------------------------------------------*/ + + if ( last_core == HQ_CORE || last_core == TCX_20_CORE || last_core == TCX_10_CORE ) + { + set_f( filt_lfE, 1.0f, DCT_L_POST ); + set_f( LDm_enh_lp_gbin, 1.0f, VOIC_BINS_HR ); + pt1 = exc_buffer_in + offset2 - 1; + pt2 = pt1 + (int16_t) ( pitch_buf[0] + 0.5f ); + for ( i = 0; i < offset2; i++ ) + { + *pt1 = *pt2; + pt1--; + pt2--; + } + } + + pt1 = exc_buffer_in + DCT_L_POST - offset2; + pred_lt4( pt1, pt1, s_pit, fr_pit, offset2, inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + + pt2 = post_dct_wind; + for ( i = 0; i < offset2; i++ ) + { + *pt1 *= *pt2; + pt1++; + pt2++; + } + + pt1 = exc_buffer_in; + pt2--; + for ( i = 0; i < offset2; i++ ) + { + *pt1 *= *pt2; + pt1++; + pt2--; + } + + edct( exc_buffer_in, dct_buffer_out, DCT_L_POST, EVS_MONO ); + + return; +} + +/*------------------------------------------------------------------------* + * Post_music_postP() + * + * Going back from frequency to time domain from the enhanced spectrum + * to retreive the aligned excitation and redo the synthesis + *------------------------------------------------------------------------*/ + +void Post_music_postP( + float dct_buffer_in[], /* i/o: excitation buffer */ + float exc_buffer_out[], /* o : DCT output buffer */ + float *exc2, /* i/o: Current excitation to be overwriten */ + const float *mem_tmp, /* i : previous frame synthesis memory */ + float *st_mem_syn2, /* i/o: current frame synthesis memory */ + const float *Aq, /* i : LPC filter coefficients */ + float *syn /* i/o: 12k8 synthesis */ + +) +{ + edct( dct_buffer_in, exc_buffer_out, DCT_L_POST, EVS_MONO ); + + mvr2r( exc_buffer_out + OFFSET2, exc2, L_FRAME ); + mvr2r( mem_tmp, st_mem_syn2, M ); + + syn_12k8( L_FRAME, Aq, exc2, syn, st_mem_syn2, 1 ); + + return; +} + + +/*-------------------------------------------------------------------* + * music_postfilt_init() + * + * Initialize LD music postfilter state structure + *-------------------------------------------------------------------*/ + +void music_postfilt_init( + MUSIC_POSTFILT_HANDLE hMusicPF /* i/o: LD music postfilter handle */ +) +{ + int16_t i; + + set_f( hMusicPF->dct_post_old_exc, 0, DCT_L_POST - OFFSET2 ); + + hMusicPF->LDm_enh_min_ns_gain = (float) pow( 10.0f, -12 / 20.0f ); + hMusicPF->LDm_last_music_flag = 0; + set_f( hMusicPF->LDm_lt_diff_etot, 0, MAX_LT ); + hMusicPF->LDm_thres[0] = TH_0_MIN; + hMusicPF->LDm_thres[1] = TH_1_MIN; + hMusicPF->LDm_thres[2] = TH_2_MIN; + hMusicPF->LDm_thres[3] = TH_3_MIN; + hMusicPF->LDm_nb_thr_1 = 0; + hMusicPF->LDm_nb_thr_3 = 0; + hMusicPF->LDm_mem_etot = 0.0f; + + for ( i = 0; i < VOIC_BINS_HR; i++ ) + { + hMusicPF->LDm_enh_lp_gbin[i] = 1.0f; + hMusicPF->LDm_enh_lf_EO[i] = 0.01f; + } + + for ( i = 0; i < MBANDS_GN_LD; i++ ) + { + hMusicPF->LDm_bckr_noise[i] = E_MIN; + } + + set_f( hMusicPF->filt_lfE, 1.0f, DCT_L_POST ); + hMusicPF->last_nonfull_music = 0; + + return; +} diff --git a/lib_dec/TonalComponentDetection.c b/lib_dec/TonalComponentDetection.c new file mode 100644 index 0000000000000000000000000000000000000000..f3b73bf8ccba82a478155d0fd4efa2d201c3f43a --- /dev/null +++ b/lib_dec/TonalComponentDetection.c @@ -0,0 +1,846 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#define _USE_MATH_DEFINES + +#include +#include +#include "options.h" +#include +#include "prot.h" +#include "cnst.h" +#include "stat_com.h" +#include "wmc_auto.h" +#include "ivas_prot.h" + + +/*---------------------------------------------------------------------* + * Local function prototypes + *---------------------------------------------------------------------*/ + +static void findStrongestHarmonics( const uint16_t nSamples, const float *powerSpectrum, const float F0, const uint16_t nTotalHarmonics, uint16_t *pHarmonicIndexes, int16_t *pnHarmonics ); +static void CorrectF0( const uint16_t *pHarmonicIndexes, const uint16_t nHarmonics, float *pF0 ); +static void findCandidates( const uint16_t nSamples, const float *MDCTSpectrum, float *thresholdModificationNew, float floorPowerSpectrum ); +static void RefineThresholdsUsingPitch( const uint16_t nSamples, const uint16_t nSamplesCore, const float *powerSpectrum, const float lastPitchLag, const float currentPitchLag, float *pF0, float *thresholdModification ); +static void findTonalComponents( uint16_t *indexOfTonalPeak, uint16_t *lowerIndex, uint16_t *upperIndex, uint16_t *numIndexes, const uint16_t nSamples, const float *powerSpectrum, const float F0, const float *thresholdModification ); + + +/*-------------------------------------------------------------------* + * DetectTonalComponents() + * + * Detect tonal components in the lastMDCTSpectrum, use + * secondLastPowerSpectrum for the precise location of the peaks and + * store them in indexOfTonalPeak. Updates lowerIndex, upperIndex, + * pNumIndexes accordingly. + *-------------------------------------------------------------------*/ + +void DetectTonalComponents( + uint16_t indexOfTonalPeak[], + uint16_t lowerIndex[], + uint16_t upperIndex[], + uint16_t *pNumIndexes, + const float lastPitchLag, + const float currentPitchLag, + const float lastMDCTSpectrum[], + const float scaleFactors[], + const float secondLastPowerSpectrum[], + const uint16_t nSamples, + const uint16_t nSamplesCore, + float floorPowerSpectrum, /* i : lower limit for power spectrum bins */ + const PsychoacousticParameters *psychParamsCurrent ) +{ + float F0; + float thresholdModification[L_FRAME_MAX]; + float *pScaledMdctSpectrum = thresholdModification; + int16_t nBands; + + /* Convert from 16 bit to 32 bit */ + mvr2r( lastMDCTSpectrum, pScaledMdctSpectrum, nSamples ); + if ( psychParamsCurrent == NULL ) + { + nBands = FDNS_NPTS; + mdct_noiseShaping( pScaledMdctSpectrum, nSamplesCore, scaleFactors, nBands ); + } + else + { + sns_shape_spectrum( pScaledMdctSpectrum, psychParamsCurrent, scaleFactors, nSamplesCore ); + nBands = psychParamsCurrent->nBands; + } + + v_multc( pScaledMdctSpectrum + nSamplesCore, scaleFactors[nBands - 1], pScaledMdctSpectrum + nSamplesCore, nSamples - nSamplesCore ); + + /* Find peak candidates in the last frame. */ + findCandidates( nSamples, pScaledMdctSpectrum, thresholdModification, floorPowerSpectrum ); + + /* Refine peak candidates using the pitch information */ + RefineThresholdsUsingPitch( nSamples, nSamplesCore, secondLastPowerSpectrum, lastPitchLag, currentPitchLag, &F0, thresholdModification ); + + /* Find peaks in the second last frame */ + findTonalComponents( indexOfTonalPeak, lowerIndex, upperIndex, pNumIndexes, nSamples, secondLastPowerSpectrum, F0, thresholdModification ); + + return; +} + + +/*-------------------------------------------------------------------* + * RefineTonalComponents() + * + *-------------------------------------------------------------------*/ + +/* When called, the tonal components are already stored in + * indexOfTonalPeak. Detect tonal components in the lastMDCTSpectrum, + * use secondLastPowerSpectrum for the precise location of the peaks and + * then keep in indexOfTonalPeak only the tonal components that are + * again detected Updates indexOfTonalPeak, lowerIndex, upperIndex, + * phaseDiff, phases, pNumIndexes accordingly. */ +void RefineTonalComponents( + uint16_t indexOfTonalPeak[], + uint16_t lowerIndex[], + uint16_t upperIndex[], + float phaseDiff[], + float phases[], + uint16_t *pNumIndexes, + const float lastPitchLag, + const float currentPitchLag, + const float lastMDCTSpectrum[], + const float scaleFactors[], + const float secondLastPowerSpectrum[], + const uint16_t nSamples, + const uint16_t nSamplesCore, + float floorPowerSpectrum, /* i : lower limit for power spectrum bins */ + const PsychoacousticParameters *psychParamsCurrent ) +{ + uint16_t newIndexOfTonalPeak[MAX_NUMBER_OF_IDX]; + uint16_t newLowerIndex[MAX_NUMBER_OF_IDX]; + uint16_t newUpperIndex[MAX_NUMBER_OF_IDX]; + uint16_t newNumIndexes, nPreservedPeaks; + uint16_t iNew, iOld, j; + float *pOldPhase, *pNewPhase; + + DetectTonalComponents( newIndexOfTonalPeak, newLowerIndex, newUpperIndex, &newNumIndexes, lastPitchLag, currentPitchLag, lastMDCTSpectrum, scaleFactors, secondLastPowerSpectrum, + nSamples, nSamplesCore, floorPowerSpectrum, psychParamsCurrent ); + + nPreservedPeaks = 0; + iNew = 0; + pOldPhase = phases; + pNewPhase = phases; + for ( iOld = 0; iOld < *pNumIndexes; iOld++ ) + { + /* We don't want that the old peak index is at the border of the new peak region, that is why >= newUpperIndex and > newLowerIndex */ + while ( ( iNew < newNumIndexes ) && ( indexOfTonalPeak[iOld] >= newUpperIndex[iNew] ) ) + { + ++iNew; + } + + if ( ( iNew < newNumIndexes ) && ( indexOfTonalPeak[iOld] > newLowerIndex[iNew] ) ) + { + newIndexOfTonalPeak[nPreservedPeaks] = indexOfTonalPeak[iOld]; + newLowerIndex[nPreservedPeaks] = lowerIndex[iOld]; + newUpperIndex[nPreservedPeaks] = upperIndex[iOld]; + phaseDiff[nPreservedPeaks] = phaseDiff[iOld]; + + for ( j = lowerIndex[iOld]; j <= upperIndex[iOld]; j++ ) + { + *pNewPhase++ = *pOldPhase++; + } + + ++nPreservedPeaks; + } + else + { + pOldPhase += upperIndex[iOld] - lowerIndex[iOld] + 1; + } + } + + for ( iNew = 0; iNew < nPreservedPeaks; iNew++ ) + { + indexOfTonalPeak[iNew] = newIndexOfTonalPeak[iNew]; + lowerIndex[iNew] = newLowerIndex[iNew]; + upperIndex[iNew] = newUpperIndex[iNew]; + } + + *pNumIndexes = nPreservedPeaks; + + return; +} + + +/*-------------------------------------------------------------------* + * Local functions + *-------------------------------------------------------------------*/ + +static void calcPseudoSpec( + const float *mdctSpec, + const uint16_t nSamples, + float floorPowerSpectrum, + float *powerSpec ) +{ + int16_t k; + float x; + + for ( k = 1; k <= nSamples - 2; k++ ) + { + x = ( mdctSpec[k + 1] - mdctSpec[k - 1] ); /* An MDST estimate */ + x = mdctSpec[k] * mdctSpec[k] + x * x; + powerSpec[k] = max( floorPowerSpectrum, x ); + } + + powerSpec[0] = 0.5f * powerSpec[1]; + powerSpec[nSamples - 1] = 0.5f * powerSpec[nSamples - 2]; + + return; +} + +static void getEnvelope( + const int16_t nSamples, + const float *powerSpec, + float F0, + float *envelope, + float *smoothedSpectrum ) +{ + int16_t nFilterLength, nHalfFilterLength, nSecondHalfFilterLength, n1, n2; + int16_t i; + double sum; /* double is required to avoid precision problems in the optimized version. */ + + if ( F0 == 0 ) + { + nFilterLength = 15; + } + else if ( F0 <= 10.0f ) + { + nFilterLength = 11; + } + else if ( F0 >= 22.0f ) + { + /* For F0 >= 22 peak is isolated well enough with the filter length of 23. + This case is however not triggered due to the limit of pit_min, + but the line is left for security reasons. */ + nFilterLength = 23; + } + else + { + nFilterLength = 1 + 2 * (int16_t) ( F0 / 2 ); + } + + nHalfFilterLength = nFilterLength / 2; + n1 = nHalfFilterLength + 1; + nSecondHalfFilterLength = nFilterLength - nHalfFilterLength; + n2 = nSecondHalfFilterLength - 1; + + assert( ( nFilterLength >= 7 ) && ( nFilterLength <= 23 ) && ( nFilterLength % 2 == 1 ) ); + + sum = 0; + for ( i = 0; i < n2; i++ ) + { + sum += LEVEL_ABOVE_ENVELOPE * powerSpec[i]; + } + + /* No need for PTR_INIT for powerSpec[i+n2] as we continue from the previous loop */ + for ( i = 0; i < n1; i++ ) + { + sum += LEVEL_ABOVE_ENVELOPE * powerSpec[i + n2]; + /* 1/(i+nSecondHalfFilterLength) needs to be stored in a table for each filter length */ + envelope[i] = (float) sum / ( i + nSecondHalfFilterLength ); + } + sum /= nFilterLength; /* 1/nFilterLength is from a table */ + + /* No need for PTR_INIT for powerSpec[i+n2] as we continue from the previous loop */ + for ( i = n1; i < nSamples - n2; i++ ) + { + sum += LEVEL_ABOVE_ENVELOPE * ( powerSpec[i + n2] - powerSpec[i - n1] ) / nFilterLength; /* LEVEL_ABOVE_ENVELOPE/nFilterLength is from a table */ + envelope[i] = (float) sum; + } + sum *= nFilterLength; + + /* No need for PTR_INIT for powerSpec[i-n1] as we continue from the previous loop */ + for ( i = nSamples - n2; i < nSamples; i++ ) + { + sum -= LEVEL_ABOVE_ENVELOPE * powerSpec[i - n1]; + /* 1/(nSamples-(i-nHalfFilterLength)) needs to be stored in a table for each filter length */ + envelope[i] = (float) sum / ( nSamples - ( i - nHalfFilterLength ) ); + } + + for ( i = 1; i < nSamples - 1; i++ ) + { + smoothedSpectrum[i] = 0.75f * powerSpec[i - 1] + powerSpec[i] + 0.75f * powerSpec[i + 1]; + } + + smoothedSpectrum[0] = powerSpec[0] + 0.75f * powerSpec[1]; + smoothedSpectrum[nSamples - 1] = 0.75f * powerSpec[nSamples - 2] + powerSpec[nSamples - 1]; + + return; +} + +static void GetF0( + const uint16_t nSamples, /* i*/ + const uint16_t nSamplesCore, /* i*/ + const float *powerSpectrum, /* i*/ + const float pitchLag, /* i*/ + float *pOrigF0, /* i/o*/ + float *pF0 /* i/o*/ +) +{ + float halfPitchLag; + uint16_t rgiStrongHarmonics[MAX_PEAKS_FROM_PITCH]; + int16_t nTotalHarmonics, nStrongHarmonics; + + assert( LAST_HARMONIC_POS_TO_CHECK <= nSamplesCore ); + + /* Use only F0 >= 100 Hz */ + if ( ( pitchLag > 0 ) && ( pitchLag <= 0.5f * nSamplesCore ) ) + { + halfPitchLag = 0.5f * pitchLag; + *pF0 = nSamplesCore / halfPitchLag; + *pOrigF0 = *pF0; + if ( nSamples < 2 * LAST_HARMONIC_POS_TO_CHECK ) + { + nTotalHarmonics = (int16_t) ( nSamples / ( *pF0 ) ); + } + else + { + nTotalHarmonics = (int16_t) ( 2 * LAST_HARMONIC_POS_TO_CHECK / ( *pF0 ) ); /* For correcting F0 we go 2 times the last harmonic position that will be used */ + } + + /* Get in rgiStrongHarmonics all i for which i*F0 are the strongest harmonics */ + findStrongestHarmonics( nSamples, powerSpectrum, *pF0, nTotalHarmonics, rgiStrongHarmonics, &nStrongHarmonics ); + CorrectF0( rgiStrongHarmonics, nStrongHarmonics, pF0 ); + } + else + { + *pF0 = 0; + *pOrigF0 = 0; + } + + return; +} + +static void findStrongestHarmonics( + const uint16_t nSamples, + const float *powerSpectrum, + const float F0, + const uint16_t nTotalHarmonics, + uint16_t *pHarmonicIndexes, + int16_t *pnHarmonics ) +{ + float peaks[MAX_PEAKS_FROM_PITCH], smallestPeak; + uint16_t nPeaksToCheck, nPeaks, iSmallestPeak; + int16_t i, l, k; + + nPeaks = 0; + iSmallestPeak = 0; + smallestPeak = FLT_MAX; + nPeaksToCheck = min( nTotalHarmonics, MAX_PEAKS_FROM_PITCH + 1 ); + + for ( i = 1; i < nPeaksToCheck; i++ ) + { + float newPeak; + + k = (int16_t) ( i * F0 ); + assert( k > 0 && k < 2 * LAST_HARMONIC_POS_TO_CHECK && k < nSamples ); + + newPeak = powerSpectrum[k]; + peaks[nPeaks] = newPeak; + pHarmonicIndexes[nPeaks] = i; + if ( newPeak <= smallestPeak ) + { + iSmallestPeak = nPeaks; + smallestPeak = newPeak; + } + ++nPeaks; + } + + for ( ; i < nTotalHarmonics; i++ ) + { + float newPeak; + + k = (int16_t) ( i * F0 ); + assert( k > 0 && k < 2 * LAST_HARMONIC_POS_TO_CHECK && k < nSamples ); + newPeak = powerSpectrum[k]; + + if ( newPeak > smallestPeak ) + { + peaks[iSmallestPeak] = newPeak; + pHarmonicIndexes[iSmallestPeak] = i; + smallestPeak = newPeak; + for ( l = 0; l < MAX_PEAKS_FROM_PITCH; l++ ) + { + if ( peaks[l] <= smallestPeak ) + { + iSmallestPeak = l; + smallestPeak = peaks[l]; + } + } + } + } + sort( pHarmonicIndexes, nPeaks ); + *pnHarmonics = nPeaks; + + return; +} + +/* Use new F0, for which harmonics are most common in pHarmonicIndexes */ +static void CorrectF0( + const uint16_t *pHarmonicIndexes, + const uint16_t nHarmonics, + float *pF0 ) +{ + int16_t i; + float F0; + uint16_t diff[MAX_PEAKS_FROM_PITCH - 1], sortedDiff[MAX_PEAKS_FROM_PITCH - 1]; + uint16_t iMostCommonDiff, nMostCommonDiff, nSameDiff, iMult; + + for ( i = 0; i < MAX_PEAKS_FROM_PITCH - 1; i++ ) + { + diff[i] = 0; + sortedDiff[i] = 0; + } + + F0 = *pF0; + if ( F0 > 0 && nHarmonics > 0 ) + { + for ( i = 0; i < nHarmonics - 1; i++ ) + { + diff[i] = pHarmonicIndexes[i + 1] - pHarmonicIndexes[i]; + sortedDiff[i] = diff[i]; + } + sort( sortedDiff, nHarmonics - 1 ); + iMostCommonDiff = sortedDiff[0]; + nSameDiff = 1; + i = 1; + if ( sortedDiff[0] * pHarmonicIndexes[0] == 1 ) + { + /* Find how many distances between peaks have length 1 */ + for ( ; i < nHarmonics - 1; i++ ) + { + if ( sortedDiff[i] == 1 ) + { + ++nSameDiff; + } + } + } + nMostCommonDiff = nSameDiff; + + /* If there are at least 3 distances between peaks with length 1 and if the 1st harmonic is in pHarmonicIndexes then keep the original F0 */ + /* Otherwise find the most common distance between peaks */ + if ( nSameDiff < 3 ) + { + /* Find the most common difference */ + for ( i = nSameDiff; i < nHarmonics - 1; i++ ) + { + if ( sortedDiff[i] == sortedDiff[i - 1] ) + { + ++nSameDiff; + } + else + { + if ( nSameDiff > nMostCommonDiff ) + { + nMostCommonDiff = nSameDiff; + iMostCommonDiff = sortedDiff[i - 1]; + } + else + { + if ( ( nSameDiff == nMostCommonDiff ) && ( abs( (int16_t) iMostCommonDiff - (int16_t) pHarmonicIndexes[0] ) > abs( (int16_t) sortedDiff[i - 1] - (int16_t) pHarmonicIndexes[0] ) ) ) + { + nMostCommonDiff = nSameDiff; + iMostCommonDiff = sortedDiff[i - 1]; + } + } + nSameDiff = 1; + } + } + + if ( nSameDiff > nMostCommonDiff ) + { + nMostCommonDiff = nSameDiff; + iMostCommonDiff = sortedDiff[nHarmonics - 2]; + } + } + + /* If there are enough peaks at the same distance */ + if ( nMostCommonDiff >= MAX_PEAKS_FROM_PITCH / 2 ) + { + iMult = 1; + for ( i = 0; i < nHarmonics - 1; i++ ) + { + if ( diff[i] == iMostCommonDiff ) + { + iMult = pHarmonicIndexes[i]; + break; + } + + /* for rare cases of octave mismatch or missing harmonics */ + if ( ( i < nHarmonics - 2 ) && ( diff[i] == diff[i + 1] ) && ( diff[i] + diff[i + 1] == iMostCommonDiff ) ) + { + iMult = pHarmonicIndexes[i]; + break; + } + } + + /* If the real F0 is much higher than the original F0 from the pitch */ + if ( iMult <= 3 ) + { + /* Use iMostCommonDiff, because the lowest pHarmonicIndexes[i] (which is equal to iMult) may not correspond to the new F0, but to it's multiple */ + F0 = iMostCommonDiff * F0; + } + else + { + F0 = 0; + } + } + /* Otherwise if there are at least 3 distances between peaks with length 1 and if the 1st harmonic is in pHarmonicIndexes then keep the original F0 */ + /* Otherwise don't use F0 */ + else if ( ( iMostCommonDiff > 1 ) || ( nMostCommonDiff < 3 ) ) + { + /* Not enough peaks at the same distance => don't use the pitch. */ + F0 = 0; + } + *pF0 = F0; + } + + return; +} + +static void modifyThreshold( + const int16_t i, + float F0, + float threshold, + float *thresholdModification ) +{ + float harmonic, fractional, twoTimesFract; + int16_t k; + + harmonic = i * F0; + k = (int16_t) harmonic; + fractional = harmonic - k; /* Fractional part of the i*F0 */ + twoTimesFract = 2.0f * fractional; /* threshold if the centar of the peek is between k-1 and k, threshold+2 if the centar of the peek is between k and k+1 */ + thresholdModification[k] = threshold; + thresholdModification[k - 1] = threshold + twoTimesFract; + thresholdModification[k + 1] = threshold + 2.0f - twoTimesFract; + + return; +} + +static void modifyThresholds( + float F0, + float origF0, + float *thresholdModification ) +{ + int16_t i, nHarmonics; + + if ( ( F0 == 0 ) && ( origF0 > 0 ) ) + { + nHarmonics = min( MAX_PEAKS_FROM_PITCH, (int16_t) ( LAST_HARMONIC_POS_TO_CHECK / origF0 ) ); + for ( i = 1; i <= nHarmonics; i++ ) + { + modifyThreshold( i, origF0, 0.7f, thresholdModification ); + } + } + else if ( ( F0 > 0 ) && ( origF0 > 0 ) ) + { + nHarmonics = min( MAX_PEAKS_FROM_PITCH, (int16_t) ( LAST_HARMONIC_POS_TO_CHECK / F0 ) ); + + for ( i = (int16_t) ( F0 / origF0 + 0.5f ); i > 0; i-- ) + { + modifyThreshold( i, origF0, 0.35f, thresholdModification ); + } + for ( i = 1; i <= nHarmonics; i++ ) + { + modifyThreshold( i, F0, 0.35f, thresholdModification ); + } + } + + return; +} + +static void findCandidates( + const uint16_t nSamples, + const float *MDCTSpectrum, + float *thresholdModificationNew, + float floorPowerSpectrum /* i : lower limit for power spectrum bins */ +) +{ + float powerSpectrum[L_FRAME_MAX]; + float envelope[L_FRAME_MAX]; + float smoothedSpectrum[L_FRAME_MAX]; + uint16_t upperIdx, lowerIdx; + int16_t k, j; + + calcPseudoSpec( MDCTSpectrum, nSamples, floorPowerSpectrum, powerSpectrum ); + getEnvelope( nSamples, powerSpectrum, 0, envelope, smoothedSpectrum ); + + set_f( thresholdModificationNew, UNREACHABLE_THRESHOLD, nSamples ); + for ( k = GROUP_LENGTH / 2; k <= nSamples - ( GROUP_LENGTH - GROUP_LENGTH / 2 ); k++ ) + { + if ( smoothedSpectrum[k] > envelope[k] ) + { + /* The check that bin at k is bigger than bins at k-1 and k+1 is needed to avoid deadlocks when the thresholds are low. */ + /* It removes some true peaks, especially if non weighted sum is used for the smoothed spectrum. */ + float biggerNeighbor; + biggerNeighbor = max( powerSpectrum[k - 1], powerSpectrum[k + 1] ); + if ( powerSpectrum[k] >= biggerNeighbor ) + { + /* Find the right foot */ + for ( upperIdx = k + 1; upperIdx < nSamples - 1; upperIdx++ ) + { + if ( powerSpectrum[upperIdx] < powerSpectrum[upperIdx + 1] ) + { + /* Side lobes may increase for certain ammount */ + if ( ALLOWED_SIDE_LOBE_FLUCTUATION * powerSpectrum[upperIdx] < powerSpectrum[upperIdx + 1] ) + { + break; + } + /* Check for further decrease after a side lobe increase */ + for ( j = upperIdx + 1; j < nSamples - 1; j++ ) + { + if ( powerSpectrum[j] < ALLOWED_SIDE_LOBE_FLUCTUATION * powerSpectrum[j + 1] ) + { + break; + } + } + /* Side lobe increase must be 2 times smaller than the decrease to the foot */ + /* Eq. to 2.0f*powerSpectrum[lowerIdx-1]/powerSpectrum[lowerIdx] > powerSpectrum[lowerIdx]/powerSpectrum[j] */ + if ( 2.0f * powerSpectrum[upperIdx + 1] * powerSpectrum[j] > powerSpectrum[upperIdx] * powerSpectrum[upperIdx] ) + { + break; + } + upperIdx = j - 1; /* Reinitialize pointers due to the change of upperIdx */ + } + } + /* left foot */ + for ( lowerIdx = k - 1; lowerIdx > 0; lowerIdx-- ) + { + if ( powerSpectrum[lowerIdx] < powerSpectrum[lowerIdx - 1] ) + { + /* Side lobes may increase for certain ammount */ + if ( ALLOWED_SIDE_LOBE_FLUCTUATION * powerSpectrum[lowerIdx] < powerSpectrum[lowerIdx - 1] ) + { + break; + } + /* Check for further decrease after a side lobe increase */ + for ( j = lowerIdx - 1; j > 0; j-- ) + { + if ( powerSpectrum[j] < ALLOWED_SIDE_LOBE_FLUCTUATION * powerSpectrum[j - 1] ) + { + break; + } + } + /* Side lobe increase must be 2 times smaller than the decrease to the foot */ + /* Eq. to 2.0f*powerSpectrum[lowerIdx-1]/powerSpectrum[lowerIdx] > powerSpectrum[lowerIdx]/powerSpectrum[j] */ + if ( 2.0f * powerSpectrum[lowerIdx - 1] * powerSpectrum[j] > powerSpectrum[lowerIdx] * powerSpectrum[lowerIdx] ) + { + break; + } + lowerIdx = j + 1; /* Reinitialize pointers due to the change of lowerIdx */ + } + } + + /* Check if there is a bigger peak up to the next peak foot */ + for ( j = max( GROUP_LENGTH / 2, lowerIdx ); j <= min( upperIdx, nSamples - ( GROUP_LENGTH - GROUP_LENGTH / 2 ) ); j++ ) + { + if ( powerSpectrum[j] > powerSpectrum[k] ) + { + k = j; /* PTR_INIT for powerSpectrum[k] */ + } + } + + /* Modify thresholds for the following frame */ + for ( j = k - 1; j < k + 2; j++ ) + { + if ( smoothedSpectrum[j] > envelope[j] ) + { + thresholdModificationNew[j] = SMALL_THRESHOLD; + } + else + { + thresholdModificationNew[j] = BIG_THRESHOLD; + } + } + /* Jump to the next foot of the peak. */ + k = upperIdx; /* Reinitialize pointers due to the change of k */ + } + } + } + + return; +} + +static void RefineThresholdsUsingPitch( + const uint16_t nSamples, + const uint16_t nSamplesCore, + const float *powerSpectrum, + const float lastPitchLag, + const float currentPitchLag, + float *pF0, + float *thresholdModification ) +{ + int16_t pitchIsStable; + float origF0; + + pitchIsStable = ( fabs( lastPitchLag - currentPitchLag ) < 0.25f ); + if ( pitchIsStable ) + { + GetF0( nSamples, nSamplesCore, powerSpectrum, lastPitchLag, &origF0, pF0 ); + + modifyThresholds( *pF0, origF0, thresholdModification ); + } + else + { + *pF0 = 0; + } + + return; +} + +static void findTonalComponents( + uint16_t *indexOfTonalPeak, /* OUT */ + uint16_t *lowerIndex, /* OUT */ + uint16_t *upperIndex, /* OUT */ + uint16_t *numIndexes, /* OUT */ + const uint16_t nSamples, /* IN */ + const float *powerSpectrum, /* IN */ + const float F0, /* IN */ + const float *thresholdModification /* IN */ +) +{ + float envelope[L_FRAME_MAX]; + float smoothedSpectrum[L_FRAME_MAX]; + + uint16_t nrOfFIS; + uint16_t upperIdx, lowerIdx, lowerBound; + int16_t k, j; + + getEnvelope( nSamples, powerSpectrum, F0, envelope, smoothedSpectrum ); + nrOfFIS = 0; + lowerBound = 0; + for ( k = GROUP_LENGTH / 2; k <= nSamples - ( GROUP_LENGTH - GROUP_LENGTH / 2 ); k++ ) + { + if ( smoothedSpectrum[k] > envelope[k] * thresholdModification[k] ) + { + /* The check that bin at k is bigger than bins at k-1 and k+1 is needed to avoid deadlocks when the thresholds are low. */ + /* It removes some true peaks, especially if non weighted sum is used for the smoothed spectrum. */ + float biggerNeighbor; + biggerNeighbor = max( powerSpectrum[k - 1], powerSpectrum[k + 1] ); + if ( powerSpectrum[k] >= biggerNeighbor ) + { + /* Find the right foot */ + for ( upperIdx = k + 1; upperIdx < nSamples - 1; upperIdx++ ) + { + if ( powerSpectrum[upperIdx] < powerSpectrum[upperIdx + 1] ) + { + /* Side lobes may increase for certain ammount */ + if ( ALLOWED_SIDE_LOBE_FLUCTUATION * powerSpectrum[upperIdx] < powerSpectrum[upperIdx + 1] ) + { + break; + } + /* Check for further decrease after a side lobe increase */ + for ( j = upperIdx + 1; j < nSamples - 1; j++ ) + { + if ( powerSpectrum[j] < ALLOWED_SIDE_LOBE_FLUCTUATION * powerSpectrum[j + 1] ) + { + break; + } + } + /* Side lobe increase must be 2 times smaller than the decrease to the foot */ + /* Eq. to 2.0f*powerSpectrum[lowerIdx-1]/powerSpectrum[lowerIdx] > powerSpectrum[lowerIdx]/powerSpectrum[j] */ + if ( 2.0f * powerSpectrum[upperIdx + 1] * powerSpectrum[j] > powerSpectrum[upperIdx] * powerSpectrum[upperIdx] ) + { + break; + } + upperIdx = j - 1; /* Reinitialize pointers due to the change of upperIdx */ + } + } + /* left foot */ + for ( lowerIdx = k - 1; lowerIdx > lowerBound; lowerIdx-- ) + { + if ( powerSpectrum[lowerIdx] < powerSpectrum[lowerIdx - 1] ) + { + /* Side lobes may increase for certain ammount */ + if ( ALLOWED_SIDE_LOBE_FLUCTUATION * powerSpectrum[lowerIdx] < powerSpectrum[lowerIdx - 1] ) + { + break; + } + /* Check for further decrease after a side lobe increase */ + for ( j = lowerIdx - 1; j > 0; j-- ) + { + if ( powerSpectrum[j] < ALLOWED_SIDE_LOBE_FLUCTUATION * powerSpectrum[j - 1] ) + { + break; + } + } + /* Side lobe increase must be 2 times smaller than the decrease to the foot */ + /* Eq. to 2.0f*powerSpectrum[lowerIdx-1]/powerSpectrum[lowerIdx] > powerSpectrum[lowerIdx]/powerSpectrum[j] */ + if ( 2.0f * powerSpectrum[lowerIdx - 1] * powerSpectrum[j] > powerSpectrum[lowerIdx] * powerSpectrum[lowerIdx] ) + { + break; + } + lowerIdx = j + 1; /* Reinitialize pointers due to the change of lowerIdx */ + } + } + lowerBound = upperIdx; + + /* Check if there is a bigger peak up to the next peak foot */ + for ( j = max( GROUP_LENGTH / 2, lowerIdx ); j <= min( upperIdx, nSamples - ( GROUP_LENGTH - GROUP_LENGTH / 2 ) ); j++ ) + { + if ( powerSpectrum[j] > powerSpectrum[k] ) + { + k = j; /* PTR_INIT for powerSpectrum[k] */ + } + } + + assert( ( nrOfFIS == 0 ) || ( indexOfTonalPeak[nrOfFIS - 1] < k ) ); + lowerIndex[nrOfFIS] = k - GROUP_LENGTH / 2; + upperIndex[nrOfFIS] = k + ( GROUP_LENGTH - GROUP_LENGTH / 2 - 1 ); + if ( ( nrOfFIS > 0 ) && ( lowerIndex[nrOfFIS] <= upperIndex[nrOfFIS - 1] ) ) + { + int16_t m = ( k + indexOfTonalPeak[nrOfFIS - 1] ) / 2; + upperIndex[nrOfFIS - 1] = m; + lowerIndex[nrOfFIS] = m + 1; + } + indexOfTonalPeak[nrOfFIS++] = k; + if ( nrOfFIS == MAX_NUMBER_OF_IDX ) + { + break; + } + /* Jump to the next foot of the peak. */ + k = upperIdx; /* Reinitialize pointers due to the change of k */ + } + } + } + *numIndexes = nrOfFIS; + + return; +} diff --git a/lib_dec/acelp_core_dec.c b/lib_dec/acelp_core_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..5218f6010504360954058637a1a2eaf745f4b725 --- /dev/null +++ b/lib_dec/acelp_core_dec.c @@ -0,0 +1,1436 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include "options.h" +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "ivas_cnst.h" +#include "ivas_prot.h" +#include "ivas_rom_com.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * acelp_core_dec() + * + * ACELP core decoder + *-------------------------------------------------------------------*/ + +ivas_error acelp_core_dec( + Decoder_State *st, /* i/o: decoder state structure */ + float output[], /* o : synthesis @internal Fs */ + float synth[], /* o : synthesis */ + float save_hb_synth[], /* o : HB synthesis */ + float bwe_exc_extended[], /* i/o: bandwidth extended excitation */ + float *voice_factors, /* o : voicing factors */ + float old_syn_12k8_16k[], /* o : intermediate ACELP synthesis at 12.8kHz or 16kHz to be used by SWB BWE */ + const int16_t sharpFlag, /* i : formant sharpening flag */ + float pitch_buf[NB_SUBFR16k], /* o : floating pitch for each subframe */ + int16_t *unbits, /* o : number of unused bits */ + int16_t *sid_bw, /* o : 0-NB/WB, 1-SWB SID */ + STEREO_TD_DEC_DATA_HANDLE hStereoTD, /* i/o: TD stereo decoder handle */ + const float tdm_lspQ_PCh[M], /* i : Q LSPs for primary channel */ + const float tdm_lsfQ_PCh[M], /* i : Q LSFs for primary channel */ + const int16_t use_cldfb_for_dft, /* i : flag to use of CLDFB for DFT Stereo */ + const int16_t last_element_mode, /* i : last element mode */ + const int32_t last_element_brate, /* i : last element bitrate */ + const int16_t flag_sec_CNA, /* i : CNA flag for secondary channel */ + const int16_t nchan_out, /* i : number of output channels */ + STEREO_CNG_DEC_HANDLE hStereoCng, /* i : stereo CNG handle */ + const int16_t read_sid_info /* i : read SID info flag */ +) +{ + float old_exc[L_EXC_DEC], *exc; /* excitation signal buffer */ + float syn_tmp[L_FRAME16k + L_SUBFR], *syn; /* synthesis signal buffer */ + int16_t output_frame; /* frame length at output sampling freq. */ + float lsf_new[M]; /* LSFs at the end of the frame */ + float lsp_new[M]; /* LSPs at the end of the frame */ + float lsp_mid[M]; /* LSPs in the middle of the frame */ + float Aq[NB_SUBFR16k * ( M + 1 )]; /* A(q) quantized for the 4 subframes */ + float old_exc2[L_FRAME16k + L_EXC_MEM], *exc2; /* total excitation buffer */ + float mem_tmp[M]; /* temporary synthesis filter memory */ + float enr_q; /* E information for FER protection */ + float tmp_noise; /* Long term temporary noise energy */ + float Es_pred; /* predicted scaled innov. energy */ + float FEC_pitch; /* FEC pitch */ + float old_bwe_exc[( ( PIT16k_MAX + ( L_FRAME16k + 1 ) + L_SUBFR16k ) * 2 )]; /* excitation buffer */ + float *bwe_exc; /* Excitation for SWB TBE */ + int16_t i, int_fs; + int16_t tc_subfr; + int16_t allow_cn_step; + float temp_buf[L_FRAME16k + L_SYN_MEM]; + int16_t last_pulse_pos; + int16_t T0_tmp; + int16_t do_WI; + float dct_buffer[DCT_L_POST]; + float exc_buffer[DCT_L_POST]; + float dct_exc_tmp[L_FRAME16k]; + float bpf_error_signal[L_FRAME16k]; + int16_t nb_bits; /* number of bits */ + int16_t indice; /* parameter indices to write */ + float gain_buf[NB_SUBFR16k]; + float q_env[20]; + float exc3[L_FRAME16k]; + float syn1_tmp[L_FRAME16k + 2], *syn1; + float *realBuffer[CLDFB_NO_COL_MAX], *imagBuffer[CLDFB_NO_COL_MAX]; + float realBufferTmp[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + float imagBufferTmp[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + int16_t LSF_Q_prediction; /* LSF prediction mode */ + float tmpF; + int16_t uc_two_stage_flag; + int16_t tdm_lp_reuse_flag, tdm_low_rate_mode, tdm_Pitch_reuse_flag; + float *old_exc_s; /* Start of last excitation frame */ + float *p_tdm_Pri_pitch_buf; + int16_t local_element_mode; + ivas_error error; + + error = IVAS_ERR_OK; + + if ( st->element_mode == IVAS_CPE_MDCT && nchan_out == 1 && st->idchan == 1 && last_element_brate <= IVAS_SID_5k2 ) + { + /* In MDCT-Stereo DTX with mono output, we can skip CNG for the second channel, except for the first inactive frame following an active period */ + return error; + } + + push_wmops( "acelp_core_dec" ); + + output_frame = (int16_t) ( st->output_Fs / FRAMES_PER_SEC ); + + /*----------------------------------------------------------------* + * stereo SID and CNG frames processing + *----------------------------------------------------------------*/ + + if ( st->core_brate <= SID_2k40 && st->element_mode == IVAS_CPE_DFT && nchan_out == 2 ) + { + if ( st->cng_type == FD_CNG ) + { + configureFdCngDec( st->hFdCngDec, st->bwidth, ACELP_14k25, st->L_frame, st->last_L_frame, st->element_mode ); + + /* Only run parameter decoding in SID frames */ + if ( st->core_brate == SID_2k40 ) + { + FdCng_decodeSID( st ); + } + + for ( i = 0; i < NPART; i++ ) + { + st->hFdCngDec->hFdCngCom->sidNoiseEstLp[i] = STEREO_DFT_FD_FILT * st->hFdCngDec->hFdCngCom->sidNoiseEstLp[i] + ( 1 - STEREO_DFT_FD_FILT ) * st->hFdCngDec->hFdCngCom->sidNoiseEst[i]; + } + + ApplyFdCng( NULL, NULL, NULL, NULL, st, 0, 0 ); + } + else + { + configureFdCngDec( st->hFdCngDec, st->bwidth, ACELP_14k25, st->L_frame, st->last_L_frame, st->element_mode ); + + /* decode CNG parameters */ + CNG_dec( st, last_element_mode, Aq, lsp_new, lsf_new, &allow_cn_step, sid_bw, q_env ); + + /* comfort noise generation */ + CNG_exc( st->core_brate, st->L_frame, &st->hTdCngDec->Enew, &st->hTdCngDec->cng_seed, NULL, NULL, &st->lp_ener, st->last_core_brate, &st->first_CNG, &( st->hTdCngDec->cng_ener_seed ), NULL, allow_cn_step, &st->hTdCngDec->last_allow_cn_step, st->hTdCngDec->num_ho, q_env, st->hTdCngDec->lp_env, st->hTdCngDec->old_env, st->hTdCngDec->exc_mem, st->hTdCngDec->exc_mem1, sid_bw, &st->hTdCngDec->cng_ener_seed1, NULL, st->Opt_AMR_WB, st->element_mode ); + + mvr2r( Aq, st->Aq_cng, M + 1 ); + + /* update old LSP and LSF vector */ + mvr2r( lsf_new, st->lsf_old, M ); + mvr2r( lsp_new, st->lsp_old, M ); + } + + set_f( output, 0, output_frame ); /* output and synth are not used in DFT domain CNG generation and the decoder output is unaffected if they are left uninitalized */ + set_f( synth, 0, output_frame ); /* They are however read in a few places which causes errors in the valgrind tests. Simplest solution from a code perspective was to set them to zero. */ + + /* CN generation done in DFT domain */ + pop_wmops(); + return error; + } + + /*----------------------------------------------------------------* + * Active frames processing + *----------------------------------------------------------------*/ + + /* open CLDFB buffer up to CLDFB_NO_CHANNELS_MAX bands for 48kHz */ + for ( i = 0; i < CLDFB_NO_COL_MAX; i++ ) + { + set_f( realBufferTmp[i], 0, CLDFB_NO_CHANNELS_MAX ); + set_f( imagBufferTmp[i], 0, CLDFB_NO_CHANNELS_MAX ); + realBuffer[i] = realBufferTmp[i]; + imagBuffer[i] = imagBufferTmp[i]; + } + + /*----------------------------------------------------------------* + * Initialization + *----------------------------------------------------------------*/ + + LSF_Q_prediction = -1; + set_f( syn_tmp, 0, L_SUBFR ); + syn = syn_tmp + L_SUBFR; + syn1_tmp[0] = 0; + syn1_tmp[1] = 0; + syn1 = syn1_tmp + 2; + st->bpf_off = 0; + + if ( st->last_core == HQ_CORE || st->last_core == TCX_20_CORE || st->last_core == TCX_10_CORE || ( st->element_mode == IVAS_CPE_DFT && st->last_core_brate <= SID_2k40 ) || ( st->element_mode == IVAS_CPE_MDCT && st->last_core_brate <= SID_2k40 ) ) + { + /* in case of HQ->ACELP switching, do not apply BPF */ + st->bpf_off = 1; + + if ( st->hPFstat != NULL ) + { + /* in case of core switching, reset post-filter memories */ + st->hPFstat->on = 0; + } + + if ( st->hGSCDec != NULL ) + { + /* reset the GSC pre echo energy threshold in case of switching */ + st->hGSCDec->Last_frame_ener = (float) MAX_32; + } + } + + if ( st->hGSCDec != NULL && st->prev_bfi > 0 ) + { + /* reset the GSC pre echo energy threshold in case of FEC */ + st->hGSCDec->Last_frame_ener = (float) MAX_32; + } + + if ( ( st->element_mode == IVAS_CPE_DFT || st->element_mode == IVAS_CPE_TD ) && ( st->last_core_brate == SID_2k40 || st->last_core_brate == FRAME_NO_DATA ) ) + { + set_zero( st->hFdCngDec->hFdCngCom->olapBufferSynth2, FFTLEN ); + set_zero( hStereoCng->olapBufferSynth22, FFTLEN ); + } + + st->clas_dec = st->last_good; + enr_q = 0.0f; + Es_pred = 0.0f; + tmp_noise = 0.0f; + + mvr2r( st->old_exc, old_exc, L_EXC_MEM_DEC ); + exc = old_exc + L_EXC_MEM_DEC; + if ( st->hWIDec != NULL ) + { + mvr2r( st->hWIDec->old_exc2, old_exc2, L_EXC_MEM ); + } + else + { + set_f( old_exc2, 0, L_EXC_MEM ); + } + exc2 = old_exc2 + L_EXC_MEM; + if ( st->hBWE_TD != NULL ) + { + mvr2r( st->hBWE_TD->old_bwe_exc, old_bwe_exc, PIT16k_MAX * 2 ); + bwe_exc = old_bwe_exc + PIT16k_MAX * 2; + } + else + { + bwe_exc = NULL; + } + + last_pulse_pos = 0; + do_WI = 0; + st->GSC_noisy_speech = 0; + st->relax_prev_lsf_interp = 0; + set_zero( gain_buf, NB_SUBFR16k ); + + if ( st->L_frame == L_FRAME ) + { + st->gamma = GAMMA1; + st->preemph_fac = PREEMPH_FAC; + int_fs = INT_FS_12k8; + } + else + { + st->gamma = GAMMA16k; + st->preemph_fac = PREEMPH_FAC_16k; + int_fs = INT_FS_16k; + } + + /* reset post-filter in case of switching */ + if ( st->hPFstat != NULL && st->hPFstat->on == 0 ) + { + st->hPFstat->reset = 1; + } + + /* TD stereo parameters */ + if ( st->element_mode == IVAS_CPE_TD && st->idchan == 1 ) + { + tdm_lp_reuse_flag = hStereoTD->tdm_lp_reuse_flag; + tdm_low_rate_mode = hStereoTD->tdm_low_rate_mode; + tdm_Pitch_reuse_flag = hStereoTD->tdm_Pitch_reuse_flag; + p_tdm_Pri_pitch_buf = hStereoTD->tdm_Pri_pitch_buf; + } + else + { + tdm_lp_reuse_flag = 0; + tdm_low_rate_mode = 0; + if ( st->element_mode == IVAS_SCE && st->low_rate_mode ) + { + tdm_low_rate_mode = 1; + } + tdm_Pitch_reuse_flag = 0; + p_tdm_Pri_pitch_buf = NULL; + } + + /*----------------------------------------------------------------* + * Updates in case of internal sampling rate switching + *----------------------------------------------------------------*/ + + if ( st->last_L_frame != st->L_frame && ( st->last_core == ACELP_CORE || st->last_core == AMR_WB_CORE ) ) + { + int16_t dec; + + if ( st->hPFstat->on != 0 ) + { + int16_t mem_syn_r_size_old, mem_syn_r_size_new; + + mem_syn_r_size_old = (int16_t) ( 1.25 * st->last_L_frame / 20.f ); + mem_syn_r_size_new = (int16_t) ( 1.25 * st->L_frame / 20.f ); + lerp( st->hPFstat->mem_stp + L_SYN_MEM - mem_syn_r_size_old, st->hPFstat->mem_stp + L_SYN_MEM - mem_syn_r_size_new, mem_syn_r_size_new, mem_syn_r_size_old ); + lerp( st->hPFstat->mem_pf_in + L_SYN_MEM - mem_syn_r_size_old, st->hPFstat->mem_pf_in + L_SYN_MEM - mem_syn_r_size_new, mem_syn_r_size_new, mem_syn_r_size_old ); + } + + /* convert quantized LSP vector */ + st->rate_switching_reset = lsp_convert_poly( st->lsp_old, st->L_frame, 0 ); + + /* convert old quantized LSF vector */ + lsp2lsf( st->lsp_old, st->lsf_old, M, int_fs ); + + /* FEC - update adaptive LSF mean vector */ + mvr2r( st->lsf_old, st->lsfoldbfi1, M ); + mvr2r( st->lsf_old, st->lsfoldbfi0, M ); + mvr2r( st->lsf_old, st->lsf_adaptive_mean, M ); + + /* Reset LPC mem */ + if ( st->sr_core == INT_FS_16k ) + { + mvr2r( GEWB2_Ave, st->mem_AR, M ); + } + else + { + mvr2r( GEWB_Ave, st->mem_AR, M ); + } + set_zero( st->mem_MA, M ); + + /* update synthesis filter memories */ + dec = DEC; + if ( st->element_mode != EVS_MONO ) + { + dec = DEC_IVAS; + } + synth_mem_updt2( st->L_frame, st->last_L_frame, st->old_exc, st->mem_syn_r, st->mem_syn2, NULL, dec ); + mvr2r( st->old_exc, old_exc, L_EXC_MEM_DEC ); + mvr2r( st->mem_syn2, st->mem_syn1, M ); + mvr2r( st->mem_syn2, st->mem_syn3, M ); + } + + /* update buffer of old subframe pitch values */ + if ( st->last_L_frame != st->L_frame ) + { + if ( st->L_frame == L_FRAME ) + { + if ( st->last_L_frame == L_FRAME32k ) + { + tmpF = (float) 12800 / (float) 32000; + } + else if ( st->last_L_frame == 512 ) + { + tmpF = (float) 12800 / (float) 25600; + } + else /* st->last_L_frame == L_FRAME16k */ + { + tmpF = (float) 12800 / (float) 16000; + } + + for ( i = NB_SUBFR16k - NB_SUBFR; i < NB_SUBFR16k; i++ ) + { + st->old_pitch_buf[i - 1] = tmpF * st->old_pitch_buf[i]; + } + + for ( i = 2 * NB_SUBFR16k - NB_SUBFR; i < 2 * NB_SUBFR16k; i++ ) + { + st->old_pitch_buf[i - 2] = tmpF * st->old_pitch_buf[i]; + } + } + else + { + if ( st->last_L_frame == L_FRAME32k ) + { + tmpF = (float) 16000 / (float) 32000; + } + else if ( st->last_L_frame == 512 ) + { + tmpF = (float) 16000 / (float) 25600; + } + else /* st->last_L_frame == L_FRAME12k8 */ + { + tmpF = (float) 16000 / (float) 12800; + } + + for ( i = 2 * NB_SUBFR - 1; i >= NB_SUBFR; i-- ) + { + st->old_pitch_buf[i + 2] = tmpF * st->old_pitch_buf[i]; + } + st->old_pitch_buf[NB_SUBFR + 1] = st->old_pitch_buf[NB_SUBFR + 2]; + + for ( i = NB_SUBFR - 1; i >= 0; i-- ) + { + st->old_pitch_buf[i + 1] = tmpF * st->old_pitch_buf[i]; + } + st->old_pitch_buf[0] = st->old_pitch_buf[1]; + } + } + + if ( st->bfi_pitch_frame != st->L_frame ) + { + if ( st->L_frame == L_FRAME ) + { + if ( st->bfi_pitch_frame == L_FRAME32k ) + { + tmpF = (float) 12800 / (float) 32000; + } + else if ( st->bfi_pitch_frame == 512 ) + { + tmpF = (float) 12800 / (float) 25600; + } + else /* st->bfi_pitch_frame == L_FRAME16k */ + { + tmpF = (float) 12800 / (float) 16000; + } + st->bfi_pitch *= tmpF; + st->bfi_pitch_frame = L_FRAME; + } + else + { + if ( st->bfi_pitch_frame == L_FRAME32k ) + { + tmpF = (float) 16000 / (float) 32000; + } + else if ( st->bfi_pitch_frame == 512 ) + { + tmpF = (float) 16000 / (float) 25600; + } + else /* st->bfi_pitch_frame == L_FRAME12k8 */ + { + tmpF = (float) 16000 / (float) 12800; + } + st->bfi_pitch *= tmpF; + st->bfi_pitch_frame = L_FRAME16k; + } + } + + if ( st->last_bwidth == NB && st->bwidth != NB && st->ini_frame != 0 ) + { + st->rate_switching_reset = 1; + } + + /*----------------------------------------------------------------------* + * GOOD frame + *----------------------------------------------------------------------*/ + + if ( !st->bfi ) + { + + /*----------------------------------------------------------------* + * Decoding of TC subframe classification + *----------------------------------------------------------------*/ + + tc_subfr = -1; + if ( st->coder_type == TRANSITION ) + { + tc_subfr = tc_classif( st ); + } + + /*----------------------------------------------------------------* + * Decoding of GSC IVAS mode + *----------------------------------------------------------------*/ + + if ( st->element_mode > EVS_MONO && st->idchan == 0 && !( st->core_brate == FRAME_NO_DATA || st->core_brate == SID_2k40 ) && !tdm_low_rate_mode ) + { + if ( st->coder_type == AUDIO || ( st->coder_type == INACTIVE && st->total_brate <= MAX_GSC_INACTIVE_BRATE ) ) + { + st->GSC_IVAS_mode = get_next_indice( st, 2 ); + } + } + + /*----------------------------------------------------------------* + * Decoding of inactive CNG frames + *----------------------------------------------------------------*/ + + if ( st->core_brate == FRAME_NO_DATA || st->core_brate == SID_2k40 ) + { + /* decode CNG parameters */ + if ( st->cng_type == LP_CNG ) + { + CNG_dec( st, last_element_mode, Aq, lsp_new, lsf_new, &allow_cn_step, sid_bw, q_env ); + + /* comfort noise generation */ + local_element_mode = st->element_mode; + if ( ( nchan_out == 1 && st->element_mode == IVAS_CPE_DFT ) || ( st->masa_sid_format == 1 ) ) + { + local_element_mode = IVAS_SCE; /* For DFT Stereo mono decoding, run CNG_exc as in SCE */ + } + CNG_exc( st->core_brate, st->L_frame, &st->hTdCngDec->Enew, &st->hTdCngDec->cng_seed, exc, exc2, &st->lp_ener, st->last_core_brate, &st->first_CNG, &( st->hTdCngDec->cng_ener_seed ), bwe_exc, allow_cn_step, &st->hTdCngDec->last_allow_cn_step, st->hTdCngDec->num_ho, q_env, st->hTdCngDec->lp_env, st->hTdCngDec->old_env, st->hTdCngDec->exc_mem, st->hTdCngDec->exc_mem1, sid_bw, &st->hTdCngDec->cng_ener_seed1, exc3, st->Opt_AMR_WB, local_element_mode ); + mvr2r( Aq, st->Aq_cng, M + 1 ); + } + else + { + if ( st->core_brate == SID_2k40 && st->element_mode != IVAS_CPE_MDCT ) + { + FdCng_decodeSID( st ); + *sid_bw = 0; + } + + if ( st->element_mode == IVAS_CPE_DFT ) + { + assert( nchan_out == 1 ); + + for ( i = 0; i < NPART; i++ ) + { + st->hFdCngDec->hFdCngCom->sidNoiseEstLp[i] = STEREO_DFT_FD_FILT * st->hFdCngDec->hFdCngCom->sidNoiseEstLp[i] + ( 1 - STEREO_DFT_FD_FILT ) * st->hFdCngDec->hFdCngCom->sidNoiseEst[i]; + } + ApplyFdCng( syn, NULL, realBuffer, imagBuffer, st, 0, ( st->coder_type == AUDIO && !st->GSC_noisy_speech ) ); + } + + if ( !read_sid_info ) + { + float noise_lvl_highest; + + noise_lvl_highest = st->hFdCngDec->hFdCngCom->cngNoiseLevel[st->hFdCngDec->hFdCngCom->stopFFTbin - st->hFdCngDec->hFdCngCom->startBand - 1]; + for ( int16_t b = st->hFdCngDec->hFdCngCom->stopFFTbin - st->hFdCngDec->hFdCngCom->startBand; b < st->hFdCngDec->hFdCngCom->stopBand; b++ ) + { + st->hFdCngDec->hFdCngCom->cngNoiseLevel[b] = noise_lvl_highest; + } + } + + generate_comfort_noise_dec( NULL, NULL, st, nchan_out ); + + FdCng_exc( st->hFdCngDec->hFdCngCom, &st->CNG_mode, st->L_frame, st->lsp_old, st->first_CNG, st->lspCNG, Aq, lsp_new, lsf_new, exc, exc2, bwe_exc ); + + mvr2r( exc2, exc3, st->L_frame ); + } + + /* update past excitation signals for LD music post-filter */ + if ( st->hMusicPF != NULL ) + { + mvr2r( st->hMusicPF->dct_post_old_exc + L_FRAME, st->hMusicPF->dct_post_old_exc, DCT_L_POST - L_FRAME - OFFSET2 ); + mvr2r( exc2, st->hMusicPF->dct_post_old_exc + ( DCT_L_POST - L_FRAME - OFFSET2 ), L_FRAME ); + + /* Update music post processing values */ + /* Filter energies update */ + for ( i = 0; i < DCT_L_POST; i++ ) + { + st->hMusicPF->filt_lfE[i] = 0.3f + 0.7f * st->hMusicPF->filt_lfE[i]; + } + } + + + /* synthesis at 12.8kHz sampling rate */ + syn_12k8( st->L_frame, Aq, exc2, syn, st->mem_syn2, 1 ); + syn_12k8( st->L_frame, Aq, exc3, syn1, st->mem_syn3, 1 ); + + /* reset the decoder */ + CNG_reset_dec( st, pitch_buf, voice_factors ); + + /* update st->mem_syn1 for ACELP core switching */ + mvr2r( st->mem_syn3, st->mem_syn1, M ); + + /* update old synthesis for classification */ + mvr2r( syn1 + st->L_frame - L_SYN_MEM_CLAS_ESTIM, st->mem_syn_clas_estim, L_SYN_MEM_CLAS_ESTIM ); + + /* save and delay synthesis to be used by SWB BWE */ + if ( st->hBWE_FD != NULL ) + { + save_old_syn( st->L_frame, syn1, old_syn_12k8_16k, st->hBWE_FD->old_syn_12k8_16k, st->preemph_fac, &st->hBWE_FD->mem_deemph_old_syn ); + } + } + + /*----------------------------------------------------------------* + * Decoding of all other frames + *----------------------------------------------------------------*/ + + else + { + /*-----------------------------------------------------------------* + * Configure ACELP bit allocation + *-----------------------------------------------------------------*/ + + nb_bits = 0; + st->acelp_cfg.FEC_mode = 0; + uc_two_stage_flag = 0; + + if ( !st->nelp_mode_dec && !st->ppp_mode_dec ) + { + int16_t tc_subfr_tmp; + + tc_subfr_tmp = tc_subfr; + if ( tc_subfr_tmp < L_SUBFR ) + { + tc_subfr_tmp = 0; + } + + if ( tc_subfr == TC_0_192 ) + { + nb_bits = -1; + } + + config_acelp1( DEC, st->total_brate, st->core_brate, st->core, st->extl_orig, st->extl_brate_orig, st->L_frame, st->GSC_noisy_speech, &( st->acelp_cfg ), st->next_bit_pos, st->coder_type, tc_subfr_tmp, 1, &nb_bits, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); + + if ( st->coder_type == TRANSITION && tc_subfr < L_SUBFR && st->L_frame == L_FRAME ) + { + config_acelp1( DEC, st->total_brate, st->core_brate, st->core, st->extl_orig, st->extl_brate_orig, st->L_frame, -1, &( st->acelp_cfg ), st->next_bit_pos, st->coder_type, tc_subfr, 2, &nb_bits, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); + } + } + + /*-----------------------------------------------------------------* + * After CNG period, use the most up-to-date LSPs + *-----------------------------------------------------------------*/ + + if ( st->hTdCngDec != NULL && ( st->last_core_brate == FRAME_NO_DATA || st->last_core_brate == SID_2k40 ) ) + { + mvr2r( st->lspCNG, st->lsp_old, M ); + lsp2lsf( st->lspCNG, st->lsf_old, M, int_fs ); + } + + /*-----------------------------------------------------------------* + * Reset higher ACELP pre-quantizer in case of switching + *-----------------------------------------------------------------*/ + + if ( !st->use_acelp_preq ) + { + st->mem_preemp_preQ = 0.0f; + st->last_nq_preQ = 0; + st->last_code_preq = 0; + } + st->use_acelp_preq = 0; + + /*-----------------------------------------------------------------* + * LSF de-quantization and interpolation + *-----------------------------------------------------------------*/ + + if ( !tdm_lp_reuse_flag ) + { + lsf_dec( st, tc_subfr, Aq, &LSF_Q_prediction, lsf_new, lsp_new, lsp_mid, tdm_low_rate_mode, tdm_lsfQ_PCh ); + } + else + { + const float *pt_interp_2; + + if ( st->active_cnt != 1 ) + { + int16_t beta_index; + + beta_index = get_next_indice( st, TDM_IC_LSF_PRED_BITS ); + tdm_SCh_lsf_reuse( DEC, st->element_brate, lsf_new, lsp_new, tdm_lsfQ_PCh, NULL, &beta_index ); + } + else + { + mvr2r( tdm_lspQ_PCh, lsp_new, M ); + mvr2r( tdm_lsfQ_PCh, lsf_new, M ); + } + + if ( st->rate_switching_reset ) + { + /* extrapolation in case of unstable LSF convert */ + mvr2r( lsp_new, st->lsp_old, M ); + mvr2r( lsf_new, st->lsf_old, M ); + } + + pt_interp_2 = interpol_frac_12k8; + if ( tdm_low_rate_mode == 1 && st->coder_type > UNVOICED ) + { + pt_interp_2 = interpol_frac2; + } + + if ( st->active_cnt == 1 ) + { + mvr2r( lsp_new, st->lsp_old, M ); + lsp2lsf( lsp_new, st->lsf_old, M, st->sr_core ); + } + + /* LSP interpolation and conversion of LSPs to A(z) */ + int_lsp( st->L_frame, st->lsp_old, lsp_new, Aq, M, pt_interp_2, 0 ); + /* Check LSF stability (distance between old LSFs and current LSFs) */ + st->stab_fac = lsf_stab( lsf_new, st->lsf_old, 0, st->L_frame ); + } + + if ( st->last_core == HQ_CORE && st->element_mode > EVS_MONO ) + { + /* Prepare ACB memory from last HQ frame */ + old_exc_s = st->old_exc + L_EXC_MEM_DEC - st->L_frame; + tmpF = *old_exc_s; + st->mem_deemph = old_exc_s[st->L_frame - 1]; + preemph( old_exc_s, st->preemph_fac, L_FRAME16k, &tmpF ); + mvr2r( old_exc_s + st->L_frame - M, st->mem_syn2, M ); + residu( Aq, M, old_exc_s, old_exc + L_EXC_MEM_DEC - st->L_frame, st->L_frame ); + } + + if ( st->last_core != ACELP_CORE && st->element_mode > EVS_MONO ) + { + /* Prepare ACB memory of old_bwe_exc */ + if ( st->L_frame == L_FRAME ) + { + lerp( old_exc, old_bwe_exc, L_EXC_MEM_DEC * HIBND_ACB_L_FAC, L_EXC_MEM_DEC ); + } + else + { + lerp( old_exc, old_bwe_exc, L_EXC_MEM_DEC * 2, L_EXC_MEM_DEC ); + } + } + + /*-----------------------------------------------------------------* + * FEC - first good frame after lost frame(s) (possibility to correct the ACB) + *-----------------------------------------------------------------*/ + + if ( st->acelp_cfg.FEC_mode > 0 ) + { + last_pulse_pos = 0; + + /* decode the last glottal pulse position */ + T0_tmp = FEC_pos_dec( st, &last_pulse_pos, &enr_q, nb_bits ); + + if ( st->last_core != HQ_CORE || ( st->last_core == HQ_CORE && st->last_con_tcx ) ) + { + if ( st->clas_dec == SIN_ONSET && last_pulse_pos != 0 && st->prev_bfi == 1 ) + { + FEC_SinOnset( old_exc + L_EXC_MEM_DEC - L_EXC_MEM, last_pulse_pos, T0_tmp, enr_q, Aq, st->L_frame ); + } + else if ( ( st->coder_type == GENERIC || st->coder_type == VOICED ) && last_pulse_pos != 0 && st->old_bfi_cnt == 1 && st->hWIDec != NULL ) + { + do_WI = FEC_enhACB( st->L_frame, st->last_L_frame, old_exc + L_EXC_MEM_DEC - L_EXC_MEM, T0_tmp, last_pulse_pos, st->bfi_pitch ); + } + } + } + + /*------------------------------------------------------------* + * In case of first frame after an erasure and transition from voiced to unvoiced or inactive + * redo the LPC interpolation + *------------------------------------------------------------*/ + + if ( st->stab_fac == 0 && st->old_bfi_cnt > 0 && st->clas_dec != VOICED_CLAS && st->clas_dec != ONSET && st->relax_prev_lsf_interp == 0 && !( st->element_mode == IVAS_CPE_TD && st->idchan == 1 ) ) + { + int_lsp4( st->L_frame, st->lsp_old, lsp_mid, lsp_new, Aq, M, 2 ); + } + + /*---------------------------------------------------------------* + * Decoding of the scaled predicted innovation energy + *---------------------------------------------------------------*/ + + if ( nb_bits > 0 ) + { + indice = get_next_indice( st, nb_bits ); + Es_pred_dec( &Es_pred, indice, nb_bits, uc_two_stage_flag ); + } + + /*------------------------------------------------------------* + * Decode excitation according to coding type + *------------------------------------------------------------*/ + + if ( tdm_low_rate_mode ) /* tdm stereo low rate mode */ + { + if ( st->coder_type <= UNVOICED ) + { + tdm_low_rate_dec( st, dct_exc_tmp, &tmp_noise, pitch_buf, voice_factors, exc, exc2, bwe_exc, lsf_new ); + } + else /* GENERIC */ + { + decod_gen_2sbfr( st, sharpFlag, Aq, pitch_buf, voice_factors, exc, exc2, bwe_exc, gain_buf, tdm_Pitch_reuse_flag, p_tdm_Pri_pitch_buf ); + + if ( st->element_mode == IVAS_CPE_TD ) + { + tmp_noise = st->lp_gainc; + } + } + } + else if ( st->nelp_mode_dec ) + { + /* SC-VBR - NELP frames */ + decod_nelp( st, &tmp_noise, pitch_buf, exc, exc2, voice_factors, bwe_exc, st->bfi, gain_buf ); + } + else if ( st->coder_type == UNVOICED ) + { + /* UNVOICED frames */ + decod_unvoiced( st, Aq, Es_pred, uc_two_stage_flag, &tmp_noise, pitch_buf, voice_factors, exc, exc2, bwe_exc, gain_buf ); + } + else if ( st->ppp_mode_dec ) + { + /* SC-VBR - PPP frames */ + if ( ( error = decod_ppp( st, Aq, pitch_buf, exc, exc2, voice_factors, bwe_exc, gain_buf, st->bfi ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st->coder_type == TRANSITION ) + { + decod_tran( st, st->L_frame, tc_subfr, Aq, Es_pred, pitch_buf, voice_factors, exc, exc2, bwe_exc, unbits, sharpFlag, gain_buf ); + } + else if ( st->coder_type == AUDIO || ( st->coder_type == INACTIVE && st->inactive_coder_type_flag ) ) + { + /* AUDIO and INACTIVE frames (coded by GSC technology) */ + decod_audio( st, dct_exc_tmp, Aq, &tmp_noise, pitch_buf, voice_factors, exc, exc2, bwe_exc, lsf_new, gain_buf, tdm_lp_reuse_flag, tdm_low_rate_mode, tdm_Pitch_reuse_flag, p_tdm_Pri_pitch_buf ); + } + else + { + /* GENERIC, VOICED and INACTIVE frames (coded by AVQ technology) */ + if ( ( error = decod_gen_voic( st, st->L_frame, sharpFlag, Aq, Es_pred, do_WI, pitch_buf, voice_factors, exc, exc2, bwe_exc, unbits, gain_buf, tdm_Pitch_reuse_flag, p_tdm_Pri_pitch_buf ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( st->element_mode == IVAS_CPE_TD ) + { + tmp_noise = st->lp_gainc; + } + } + + + /* synthesis for ACELP core switching and SWB BWE */ + syn_12k8( st->L_frame, Aq, exc, temp_buf, st->mem_syn1, 1 ); + + /* save and delay synthesis to be used by SWB BWE */ + if ( st->hBWE_FD != NULL ) + { + save_old_syn( st->L_frame, temp_buf, old_syn_12k8_16k, st->hBWE_FD->old_syn_12k8_16k, st->preemph_fac, &st->hBWE_FD->mem_deemph_old_syn ); + } + + /*-----------------------------------------------------------------* + * Apply energy matching when switching to inactive frames + *-----------------------------------------------------------------*/ + + inact_switch_ematch( exc2, dct_exc_tmp, st->hGSCDec->lt_ener_per_band, st->coder_type, st->L_frame, st->total_brate, st->bfi, st->last_core, st->last_codec_mode, tdm_low_rate_mode, st->element_mode ); + + /*------------------------------------------------------------* + * Decode information and modify the excitation signal of stationary unvoiced frames + *------------------------------------------------------------*/ + + if ( !( st->idchan == 1 && st->element_mode == IVAS_CPE_TD ) && st->nelp_mode_dec != 1 && !( st->element_mode == IVAS_SCE && tdm_low_rate_mode ) ) + { + stat_noise_uv_dec( st, lsp_new, lsp_mid, Aq, exc2, uc_two_stage_flag ); + } + + /*------------------------------------------------------------* + * Save filter memory in case the synthesis is redone after scaling + * Synthesis at 12k8 Hz sampling rate + *------------------------------------------------------------*/ + + /* update past excitation signals for LD music post-filter */ + if ( st->hMusicPF != NULL ) + { + mvr2r( st->hMusicPF->dct_post_old_exc + L_FRAME, st->hMusicPF->dct_post_old_exc, DCT_L_POST - L_FRAME - OFFSET2 ); + mvr2r( exc2, st->hMusicPF->dct_post_old_exc + ( DCT_L_POST - L_FRAME - OFFSET2 ), L_FRAME ); + mvr2r( st->hMusicPF->dct_post_old_exc, exc_buffer, DCT_L_POST - OFFSET2 ); + } + + if ( ( st->coder_type == AUDIO && !st->GSC_noisy_speech ) || ( st->GSC_IVAS_mode >= 1 && st->L_frame == L_FRAME ) ) + { + int16_t last_coder_type = st->last_coder_type; + + if ( ( st->idchan == 1 && st->element_mode == IVAS_CPE_TD ) || ( st->GSC_IVAS_mode >= 1 && st->GSC_noisy_speech == 0 ) ) + { + last_coder_type = AUDIO; + } + + /* Extrapolation of the last future part, windowing and high resolution DCT transform */ + Prep_music_postP( exc_buffer, dct_buffer, st->hMusicPF->filt_lfE, st->last_core, pitch_buf, st->hMusicPF->LDm_enh_lp_gbin ); + + /* LD music post-filter */ + LD_music_post_filter( st->hMusicPF, dct_buffer, dct_buffer, st->core_brate, AUDIO, last_coder_type ); + + /* Inverse DCT transform, retrieval of the aligned excitation, re-synthesis */ + mvr2r( st->mem_syn2, mem_tmp, M ); + Post_music_postP( dct_buffer, exc_buffer, exc2, st->mem_syn2, st->mem_syn2, Aq, syn ); + } + else + { + /* Core synthesis at 12.8kHz or 16kHz */ + mvr2r( st->mem_syn2, mem_tmp, M ); + syn_12k8( st->L_frame, Aq, exc2, syn, st->mem_syn2, 1 ); + + if ( st->hMusicPF != NULL ) + { + for ( i = 0; i < DCT_L_POST; i++ ) + { + st->hMusicPF->filt_lfE[i] = 0.3f + 0.7f * st->hMusicPF->filt_lfE[i]; + } + } + } + + /*------------------------------------------------------------* + * FEC - Estimate the classification information + *------------------------------------------------------------*/ + + FEC_clas_estim( syn, pitch_buf, st->L_frame, st->coder_type, st->codec_mode, st->mem_syn_clas_estim, &st->clas_dec, &st->lp_ener_bfi, st->Opt_AMR_WB, &st->decision_hyst, NULL, NULL, NULL, NULL, NULL, NULL, temp_buf, 0, 0, 0, 0, 0, 0, st->last_core_brate, st->acelp_cfg.FEC_mode ); + + /*------------------------------------------------------------* + * FEC - Estimate pitch + *------------------------------------------------------------*/ + + FEC_pitch_estim( st->Opt_AMR_WB, st->last_core, st->L_frame, st->clas_dec, st->last_good, pitch_buf, st->old_pitch_buf, &st->bfi_pitch, &st->bfi_pitch_frame, &st->upd_cnt, st->coder_type ); + + /*------------------------------------------------------------* + * FEC - Smooth the speech energy evolution when recovering after a BAD frame + * (smoothing is performed in the excitation domain and signal is resynthesized after) + *------------------------------------------------------------*/ + + FEC_scale_syn( st->L_frame, st->clas_dec, st->last_good, syn, pitch_buf, st->enr_old, enr_q, st->coder_type, LSF_Q_prediction, &st->scaling_flag, &st->lp_ener_FEC_av, &st->lp_ener_FEC_max, st->bfi, st->total_brate, st->prev_bfi, st->last_core_brate, exc, exc2, Aq, &st->old_enr_LP, mem_tmp, st->mem_syn2, st->last_con_tcx && ( st->L_frameTCX_past != st->L_frame ) && ( st->last_core != ACELP_CORE ), 0 ); + + /* estimate the pitch-synchronous speech energy per sample to be used when normal operation recovers */ + if ( ( st->idchan == 1 && st->element_mode == IVAS_CPE_TD && st->total_brate <= ACELP_7k20 ) || ( st->total_brate == ACELP_7k20 ) || ( st->total_brate == ACELP_8k00 ) ) + { + fer_energy( st->L_frame, st->clas_dec, syn, pitch_buf[( ( st->L_frame ) >> 6 ) - 1], &st->enr_old, st->L_frame ); + } + } + + } /* End of GOOD FRAME */ + + /*----------------------------------------------------------------* + * BAD frame + *----------------------------------------------------------------*/ + + else + { + /* SC-VBR */ + if ( st->last_nelp_mode_dec == 1 ) + { + st->nelp_mode_dec = 1; + } + + /* long burst frame erasures */ + if ( st->nbLostCmpt > 5 && st->clas_dec >= VOICED_CLAS && st->clas_dec < INACTIVE_CLAS ) + { + st->last_good = VOICED_TRANSITION; + } + + /* LSF estimation and A(z) calculation */ + lsf_dec_bfi( MODE1, lsf_new, st->lsf_old, st->lsf_adaptive_mean, NULL, st->mem_MA, st->mem_AR, st->stab_fac, st->last_coder_type, st->L_frame, st->last_good, st->nbLostCmpt, 0, NULL, NULL, NULL, st->hGSCDec->Last_GSC_pit_band_idx, st->Opt_AMR_WB, st->bwidth ); + + FEC_lsf2lsp_interp( st, st->L_frame, Aq, lsf_new, lsp_new ); + + if ( st->nelp_mode_dec == 1 ) + { + /* SC-VBR */ + decod_nelp( st, &tmp_noise, pitch_buf, exc, exc2, voice_factors, bwe_exc, st->bfi, gain_buf ); + FEC_pitch = pitch_buf[3]; + } + else + { + /* calculation of excitation signal */ + FEC_exc_estim( st, st->L_frame, exc, exc2, dct_exc_tmp, pitch_buf, voice_factors, &FEC_pitch, bwe_exc, lsf_new, &tmp_noise ); + + tmp_noise = st->lp_gainc; + + /* SC-VBR */ + st->prev_gain_pit_dec = st->lp_gainp; + } + + /* synthesis for ACELP core switching and SWB BWE */ + syn_12k8( st->L_frame, Aq, exc, temp_buf, st->mem_syn1, 1 ); + + /* save and delay synthesis to be used by SWB BWE */ + if ( st->hBWE_FD != NULL ) + { + save_old_syn( st->L_frame, temp_buf, old_syn_12k8_16k, st->hBWE_FD->old_syn_12k8_16k, st->preemph_fac, &st->hBWE_FD->mem_deemph_old_syn ); + } + + /* Apply energy matching when switching to inactive frames */ + inact_switch_ematch( exc2, dct_exc_tmp, st->hGSCDec->lt_ener_per_band, st->coder_type, st->L_frame, st->total_brate, st->bfi, st->last_core, st->last_codec_mode, tdm_low_rate_mode, st->element_mode ); + + /* update past excitation signals for LD music post-filter */ + if ( st->hMusicPF != NULL ) + { + mvr2r( st->hMusicPF->dct_post_old_exc + L_FRAME, st->hMusicPF->dct_post_old_exc, DCT_L_POST - L_FRAME - OFFSET2 ); + mvr2r( exc2, st->hMusicPF->dct_post_old_exc + ( DCT_L_POST - L_FRAME - OFFSET2 ), L_FRAME ); + + /* Update music post processing values */ + /* Filter energies update */ + for ( i = 0; i < DCT_L_POST; i++ ) + { + st->hMusicPF->filt_lfE[i] = 0.3f + 0.7f * st->hMusicPF->filt_lfE[i]; + } + /* Update circular buffer, keep last energy difference unchanged */ + for ( i = 1; i < MAX_LT; i++ ) + { + st->hMusicPF->LDm_lt_diff_etot[i - 1] = st->hMusicPF->LDm_lt_diff_etot[i]; + } + } + + /* synthesis at 12k8 Hz sampling rate */ + if ( ( st->total_brate == ACELP_7k20 ) || ( st->total_brate == ACELP_8k00 ) ) + { + mvr2r( st->mem_syn2, mem_tmp, M ); + } + syn_12k8( st->L_frame, Aq, exc2, syn, st->mem_syn2, 1 ); + + /* update buffer for classifier */ + if ( st->hWIDec != NULL ) + { + mvr2r( exc2 + st->L_frame - L_EXC_MEM, st->hWIDec->old_exc2, L_EXC_MEM ); + mvr2r( syn + st->L_frame - L_EXC_MEM, st->hWIDec->old_syn2, L_EXC_MEM ); + } + mvr2r( syn + st->L_frame - L_SYN_MEM_CLAS_ESTIM, st->mem_syn_clas_estim, L_SYN_MEM_CLAS_ESTIM ); + + /*------------------------------------------------------------* + * FEC - Smooth the speech energy evolution when recovering after a BAD frame + * (smoothing is performed in the excitation domain and signal is resynthesized after) + *------------------------------------------------------------*/ + + if ( ( st->total_brate == ACELP_7k20 ) || ( st->total_brate == ACELP_8k00 ) ) + { + FEC_scale_syn( st->L_frame, st->clas_dec, st->last_good, syn, pitch_buf, st->enr_old, enr_q, st->coder_type, LSF_Q_prediction, &st->scaling_flag, &st->lp_ener_FEC_av, &st->lp_ener_FEC_max, st->bfi, st->total_brate, st->prev_bfi, st->last_core_brate, exc, exc2, Aq, &st->old_enr_LP, mem_tmp, st->mem_syn2, st->last_con_tcx && ( st->L_frameTCX_past != st->L_frame ) && ( st->last_core != ACELP_CORE ), 0 ); + } + + /* estimate the pitch-synchronous speech energy per sample to be used when normal operation recovers */ + fer_energy( st->L_frame, st->last_good, syn, FEC_pitch, &st->enr_old, st->L_frame ); + + if ( st->nelp_mode_dec != 1 ) + { + /* modify the excitation signal of stationary unvoiced frames */ + stat_noise_uv_mod( st->coder_type, 0, st->lsp_old, lsp_new, lsp_new, Aq, exc2, 1, &st->ge_sm, &st->uv_count, &st->act_count, st->lspold_s, &st->noimix_seed, &st->min_alpha, &st->exc_pe, st->core_brate, st->bwidth ); + } + } + + if ( st->hBWE_TD != NULL ) + { + if ( st->L_frame == L_FRAME ) + { + mvr2r( Aq + 2 * ( M + 1 ), st->hBWE_TD->cur_sub_Aq, ( M + 1 ) ); + } + else + { + mvr2r( Aq + 3 * ( M + 1 ), st->hBWE_TD->cur_sub_Aq, ( M + 1 ) ); + } + } + + /*--------------------------------------------------------* + * Apply NB postfilter in case of 8kHz output + *--------------------------------------------------------*/ + + if ( st->last_bwidth == NB && st->hPFstat != NULL ) + { + if ( st->bwidth == NB ) + { + st->hPFstat->on = 1; + nb_post_filt( st->L_frame, L_SUBFR, st->hPFstat, &st->psf_lp_noise, tmp_noise, syn, Aq, pitch_buf, st->coder_type, st->BER_detect, 0 ); + } + else + { + st->hPFstat->on = 0; + nb_post_filt( st->L_frame, L_SUBFR, st->hPFstat, &st->psf_lp_noise, tmp_noise, syn, Aq, pitch_buf, AUDIO, st->BER_detect, 0 ); + } + } + else + { + st->psf_lp_noise = st->lp_noise; + } + + /*------------------------------------------------------------------* + * Perform fixed deemphasis through 1/(1 - g*z^-1) + *-----------------------------------------------------------------*/ + + /* update old synthesis buffer - needed for ACELP internal sampling rate switching */ + mvr2r( syn + st->L_frame - L_SYN_MEM, st->mem_syn_r, L_SYN_MEM ); + deemph( syn, st->preemph_fac, st->L_frame, &( st->mem_deemph ) ); + + AGC_dec( syn, st->agc_mem2, st->L_frame ); + + if ( st->hTcxDec != NULL ) + { + mvr2r( syn + st->L_frame / 2, st->hTcxDec->old_syn_Overl, st->L_frame / 2 ); + } + mvr2r( syn + st->L_frame - M - 1, st->syn, M + 1 ); + + /*------------------------------------------------------------------* + * Formant post-filter + *-----------------------------------------------------------------*/ + + if ( st->hPFstat != NULL && st->last_bwidth >= WB && ( st->core_brate > ACELP_24k40 || st->element_mode > EVS_MONO ) && st->core_brate <= ACELP_32k ) + { + mvr2r( syn, temp_buf + L_SYN_MEM, L_FRAME16k ); + + st->hPFstat->on = 1; + formant_post_filt( st->hPFstat, temp_buf + L_SYN_MEM, Aq, syn, st->L_frame, L_SUBFR, st->lp_noise, st->total_brate, 0 ); + } + else if ( st->hPFstat != NULL && st->last_bwidth >= WB ) + { + if ( st->hPFstat->on ) + { + mvr2r( st->hPFstat->mem_pf_in + L_SYN_MEM - M, temp_buf, M ); + mvr2r( syn, temp_buf + M, L_SUBFR ); + residu( Aq, M, temp_buf + M, temp_buf + M + L_SUBFR, L_SUBFR ); + syn_filt( Aq, M, temp_buf + M + L_SUBFR, temp_buf, L_SUBFR, st->hPFstat->mem_stp + L_SYN_MEM - M, 0 ); + scale_st( syn, temp_buf, &st->hPFstat->gain_prec, L_SUBFR, -1 ); + mvr2r( temp_buf, syn, L_SUBFR / 2 ); + blend_subfr2( temp_buf + L_SUBFR / 2, syn + L_SUBFR / 2, syn + L_SUBFR / 2 ); + } + st->hPFstat->on = 0; + } + + /*----------------------------------------------------------------* + * Comfort noise addition + *----------------------------------------------------------------*/ + + if ( ( st->hFdCngDec != NULL || st->idchan == 1 ) && st->element_mode != IVAS_CPE_MDCT ) + { + if ( st->element_mode == IVAS_CPE_TD || st->flag_cna || ( st->cng_type == FD_CNG && st->total_brate <= ACELP_32k ) || ( st->cng_type == LP_CNG && st->core_brate <= SID_2k40 ) ) + { + /*VAD only for non inactive frame*/ + st->VAD = st->VAD && ( st->coder_type != INACTIVE ); + + if ( st->idchan == 0 && ( st->flag_cna || ( st->cng_type == FD_CNG && st->total_brate <= ACELP_32k ) || ( st->cng_type == LP_CNG && st->core_brate <= SID_2k40 ) ) ) + { + /*Noisy speech detector*/ + noisy_speech_detection( st->hFdCngDec, st->VAD, syn ); + + st->hFdCngDec->hFdCngCom->likelihood_noisy_speech = 0.99f * st->hFdCngDec->hFdCngCom->likelihood_noisy_speech + 0.01f * (float) st->hFdCngDec->hFdCngCom->flag_noisy_speech; + } + + if ( st->idchan == 0 ) + { + st->lp_noise = st->hFdCngDec->lp_noise; + } + + if ( st->element_mode != IVAS_CPE_TD && !st->cng_ism_flag ) + { + /*Noise estimate*/ + ApplyFdCng( syn, NULL, realBuffer, imagBuffer, st, 0, ( st->coder_type == AUDIO && !st->GSC_noisy_speech ) ); + } + + if ( !st->cna_dirac_flag ) + { + /* CNA: Generate additional comfort noise to mask potential coding artefacts */ + if ( st->flag_cna && !( st->coder_type == AUDIO && !( st->element_mode > EVS_MONO && st->GSC_noisy_speech ) ) ) + { + if ( st->element_mode == IVAS_CPE_TD && nchan_out == 2 ) + { + if ( hStereoCng->flag_cna_fade ) + { + generate_stereo_masking_noise( syn, st, hStereoTD, flag_sec_CNA, 1, hStereoCng, nchan_out ); + hStereoCng->flag_cna_fade = 0; + } + else + { + if ( st->element_mode != last_element_mode && st->idchan == 0 ) + { + /* Clear memory for secondary channel CNA */ + set_f( hStereoCng->olapBufferSynth22, 0.0f, st->hFdCngDec->hFdCngCom->frameSize / 2 ); + } + + generate_stereo_masking_noise( syn, st, hStereoTD, flag_sec_CNA, 0, hStereoCng, nchan_out ); + } + } + else if ( st->element_mode != IVAS_CPE_DFT ) + { + if ( st->idchan == 0 ) + { + if ( st->element_mode != last_element_mode ) + { + set_f( st->hFdCngDec->hFdCngCom->olapBufferSynth2, 0.0f, st->hFdCngDec->hFdCngCom->fftlen ); + } + generate_masking_noise( syn, st->hFdCngDec->hFdCngCom, st->hFdCngDec->hFdCngCom->frameSize, 0, 0, 0, st->element_mode, hStereoCng, nchan_out ); + } + } + } + else if ( st->flag_cna && st->coder_type == AUDIO && ( ( st->last_core == ACELP_CORE && !( st->last_coder_type == AUDIO && !( st->element_mode > EVS_MONO && st->Last_GSC_noisy_speech_flag ) ) ) || st->last_core == TCX_20_CORE ) ) + { + if ( st->element_mode == IVAS_CPE_TD && nchan_out == 2 ) + { + generate_stereo_masking_noise( syn, st, hStereoTD, flag_sec_CNA, 1, hStereoCng, nchan_out ); + hStereoCng->flag_cna_fade = 1; + } + else + { + v_multc( st->hFdCngDec->hFdCngCom->olapBufferSynth2 + 5 * st->hFdCngDec->hFdCngCom->frameSize / 4, (float) ( st->hFdCngDec->hFdCngCom->fftlen / 2 ), temp_buf, st->hFdCngDec->hFdCngCom->frameSize / 2 ); + v_add( temp_buf, syn, syn, st->hFdCngDec->hFdCngCom->frameSize / 2 ); + } + } + else + { + if ( hStereoCng != NULL ) + { + hStereoCng->flag_cna_fade = 1; + hStereoCng->enableSecCNA = 0; + } + } + + if ( st->element_mode == IVAS_CPE_TD ) + { + /*Noise estimate*/ + if ( st->idchan == 0 && ( nchan_out == 2 || ( st->core_brate != FRAME_NO_DATA && st->core_brate != SID_2k40 ) ) ) + { + ApplyFdCng( syn, NULL, realBuffer, imagBuffer, st, 0, ( st->coder_type == AUDIO && !st->GSC_noisy_speech ) ); + } + } + } + } + + if ( !st->cna_dirac_flag ) + { + if ( st->flag_cna == 0 && st->L_frame == L_FRAME16k && st->last_flag_cna == 1 && ( ( st->last_core == ACELP_CORE && !( st->last_coder_type == AUDIO && !( st->element_mode > EVS_MONO && st->Last_GSC_noisy_speech_flag ) ) ) || st->last_core == AMR_WB_CORE ) ) + { + v_multc( st->hFdCngDec->hFdCngCom->olapBufferSynth2 + 5 * st->L_frame / 4, 256.f, temp_buf, st->L_frame / 2 ); + v_add( temp_buf, syn, syn, st->L_frame / 2 ); + } + + if ( st->flag_cna == 0 || ( st->coder_type == AUDIO && !( st->element_mode > EVS_MONO && st->GSC_noisy_speech ) ) ) + { + if ( st->idchan == 0 ) + { + set_f( st->hFdCngDec->hFdCngCom->olapBufferSynth2, 0.f, st->hFdCngDec->hFdCngCom->fftlen ); + } + if ( hStereoCng != NULL && st->idchan == 0 ) + { + set_f( hStereoCng->olapBufferSynth22, 0.f, st->hFdCngDec->hFdCngCom->fftlen ); + } + } + } + } + + + /*----------------------------------------------------------------* + * Resample to the output sampling rate (8/16/32/48 kHz) + * Bass post-filter + *----------------------------------------------------------------*/ + + /* check if the CLDFB works on the right sample rate */ + if ( ( st->cldfbAna->no_channels * st->cldfbAna->no_col ) != st->L_frame ) + { + resampleCldfb( st->cldfbAna, st->L_frame * FRAMES_PER_SEC ); + resampleCldfb( st->cldfbBPF, st->L_frame * FRAMES_PER_SEC ); + + if ( st->ini_frame > 0 ) + { + st->cldfbSyn->bandsToZero = st->cldfbSyn->no_channels - st->cldfbAna->no_channels; + } + } + + /* analyze pitch coherence for bass post-filter */ + bpf_pitch_coherence( st, pitch_buf ); + + if ( !( st->element_mode == IVAS_CPE_MDCT && st->bpf_off ) ) + { + if ( st->L_frame != st->last_L_frame && st->last_codec_mode != MODE2 ) + { + if ( st->L_frame == L_FRAME ) + { + retro_interp5_4( st->hBPF->pst_old_syn ); + } + else if ( st->L_frame == L_FRAME16k ) + { + retro_interp4_5( syn, st->hBPF->pst_old_syn ); + } + } + + /* bass post-filter */ + bass_psfilter( st->hBPF, st->Opt_AMR_WB, syn, st->L_frame, pitch_buf, st->bpf_off, st->stab_fac, &st->stab_fac_smooth, st->coder_type, bpf_error_signal ); + } + + if ( st->element_mode != IVAS_CPE_DFT || use_cldfb_for_dft ) + { + float realBufferSave[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + float imagBufferSave[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + float *pRealSave[CLDFB_NO_COL_MAX], *pImagSave[CLDFB_NO_COL_MAX]; + for ( i = 0; i < CLDFB_NO_COL_MAX; i++ ) + { + pRealSave[i] = realBufferSave[i]; + pImagSave[i] = imagBufferSave[i]; + } + if ( st->p_bpf_noise_buf ) + { + mvr2r( bpf_error_signal, st->p_bpf_noise_buf, st->L_frame ); + } + + /* analysis of the synthesis at internal sampling rate */ + cldfbAnalysis( syn, realBuffer, imagBuffer, -1, st->cldfbAna ); + + /* analysis and add the BPF error signal */ + addBassPostFilter( bpf_error_signal, st->bpf_off ? 0 : -1, realBuffer, imagBuffer, st->cldfbBPF ); + + /* set output mask for upsampling */ + if ( st->bwidth == NB ) + { + /* set NB mask for upsampling */ + st->cldfbSyn->bandsToZero = st->cldfbSyn->no_channels - 10; + } + else if ( st->cldfbSyn->bandsToZero != st->cldfbSyn->no_channels - st->cldfbAna->no_channels ) + { + /* in case of BW switching, re-init to default */ + st->cldfbSyn->bandsToZero = st->cldfbSyn->no_channels - st->cldfbAna->no_channels; + } + + if ( !st->cng_sba_flag || st->element_mode == IVAS_CPE_MDCT ) + { + /*WB/SWB-FD_CNG*/ + if ( ( st->core_brate == FRAME_NO_DATA || st->core_brate == SID_2k40 ) && ( st->cng_type == FD_CNG ) && ( st->hFdCngDec->hFdCngCom->numCoreBands < st->cldfbSyn->no_channels ) ) + { + generate_comfort_noise_dec_hf( realBuffer, imagBuffer, st->hFdCngDec->hFdCngCom, st->cng_ism_flag ); + + if ( st->hFdCngDec->hFdCngCom->regularStopBand < st->cldfbSyn->no_channels ) + { + st->cldfbSyn->bandsToZero = st->cldfbSyn->no_channels - st->hFdCngDec->hFdCngCom->regularStopBand; + } + else + { + st->cldfbSyn->bandsToZero = 0; + } + } + } + + if ( save_hb_synth != NULL ) + { + /* save and then zero-out lowband */ + for ( int16_t j = 0; j < CLDFB_NO_CHANNELS_MAX; j++ ) + { + for ( i = 0; i < CLDFB_NO_COL_MAX; i++ ) + { + realBufferSave[i][j] = realBuffer[i][j]; + imagBufferSave[i][j] = imagBuffer[i][j]; + if ( j < st->hFdCngDec->hFdCngCom->numCoreBands && i < st->hFdCngDec->hFdCngCom->numSlots ) + { + realBuffer[i][j] = 0.0f; + imagBuffer[i][j] = 0.0f; + } + } + } + + cldfbSynthesis( realBuffer, imagBuffer, save_hb_synth, -1, st->cldfbSynHB ); + + /* restore lowband */ + for ( int16_t j = 0; j < CLDFB_NO_CHANNELS_MAX; j++ ) + { + for ( i = 0; i < CLDFB_NO_COL_MAX; i++ ) + { + realBuffer[i][j] = realBufferSave[i][j]; + imagBuffer[i][j] = imagBufferSave[i][j]; + } + } + + cldfbSynthesis( pRealSave, pImagSave, synth, -1, st->cldfbSyn ); + } + else + { + /* synthesis of the combined signal */ + cldfbSynthesis( realBuffer, imagBuffer, synth, -1, st->cldfbSyn ); + } + + /* save synthesis - needed in case of core switching */ + mvr2r( synth, st->previoussynth, output_frame ); + + } + else + { + int16_t nSamples = NS2SA( st->L_frame * FRAMES_PER_SEC, FRAME_SIZE_NS /*DELAY_CLDFB_NS*/ ); /* IVAS-64: optimization is likely possible here (don't resample the whole frame) */ + + /* analysis of the synthesis at internal sampling rate - needed for DFT stereo -> TD stereo switching */ + cldfbAnalysis( syn + st->L_frame - nSamples, realBuffer, imagBuffer, nSamples, st->cldfbAna ); + + /* analysis and add the BPF error signal - needed for DFT stereo -> TD stereo switching */ + addBassPostFilter( bpf_error_signal + st->L_frame - nSamples, st->bpf_off ? 0 : nSamples, realBuffer, imagBuffer, st->cldfbBPF ); + + /* synthesis of the combined signal - needed for DFT stereo -> TD stereo switching */ + cldfbSynthesis( realBuffer, imagBuffer, synth /*dummy*/, NS2SA( st->output_Fs, FRAME_SIZE_NS /*DELAY_CLDFB_NS*/ ), st->cldfbSyn ); + + if ( st->p_bpf_noise_buf ) + { + mvr2r( bpf_error_signal, st->p_bpf_noise_buf, st->L_frame ); + } + + set_f( synth, 0.0f, output_frame ); + } + + /* Copy output signal */ + if ( st->element_mode > EVS_MONO ) + { + mvr2r( syn, output, st->L_frame ); + } + + /*-----------------------------------------------------------------* + * Bandwidth extension 6kHz-7kHz + *-----------------------------------------------------------------*/ + + if ( st->hBWE_zero != NULL ) + { + if ( ( st->L_frame == L_FRAME && st->bwidth != NB && output_frame >= L_FRAME16k && + ( st->extl == -1 || st->extl == SWB_CNG || ( st->extl == WB_BWE && st->extl_brate == 0 && st->coder_type != AUDIO ) ) ) ) + { + hf_synth( st->hBWE_zero, st->core_brate, output_frame, Aq, exc2, syn, synth ); + } + else + { + hf_synth_reset( st->hBWE_zero ); + } + } + + /*-----------------------------------------------------------------* + * Populate parameters for SWB TBE + *-----------------------------------------------------------------*/ + + if ( st->hBWE_TD != NULL ) + { + if ( ( !st->bfi && st->prev_bfi ) || ( st->last_vbr_hw_BWE_disable_dec == 1 && st->vbr_hw_BWE_disable_dec == 0 ) || ( ( st->extl == SWB_TBE || st->extl == WB_TBE || st->extl == FB_TBE ) && st->last_extl != SWB_TBE && st->last_extl != WB_TBE && st->last_extl != FB_TBE ) || ( st->idchan == 1 && st->element_mode == IVAS_CPE_TD && !st->tdm_LRTD_flag ) ) + { + st->hBWE_TD->bwe_non_lin_prev_scale = 0.0f; + set_f( st->hBWE_TD->old_bwe_exc_extended, 0.0f, NL_BUFF_OFFSET ); + } + + if ( !st->ppp_mode_dec && ( st->idchan == 0 || st->element_mode != IVAS_CPE_TD || ( st->idchan == 1 && st->element_mode == IVAS_CPE_TD && st->tdm_LRTD_flag ) ) ) + { + non_linearity( bwe_exc, bwe_exc_extended, st->hBWE_TD->old_bwe_exc_extended, L_FRAME32k, &st->hBWE_TD->bwe_non_lin_prev_scale, st->coder_type, voice_factors, st->L_frame ); + } + + if ( st->core_brate == FRAME_NO_DATA || st->core_brate == SID_2k40 ) + { + st->hBWE_TD->bwe_non_lin_prev_scale = 0.0f; + } + } + + /*----------------------------------------------------------------------* + * Updates + *----------------------------------------------------------------------*/ + + updt_dec( st, old_exc, pitch_buf, Es_pred, Aq, lsf_new, lsp_new, voice_factors, old_bwe_exc, gain_buf ); + + if ( st->core_brate > SID_2k40 && st->hTdCngDec != NULL && st->hFdCngDec != NULL ) + { + /* update CNG parameters in active frames */ + cng_params_upd( lsp_new, exc, st->L_frame, &st->hTdCngDec->ho_circ_ptr, st->hTdCngDec->ho_ener_circ, &st->hTdCngDec->ho_circ_size, st->hTdCngDec->ho_lsp_circ, DEC, st->hTdCngDec->ho_env_circ, NULL, NULL, NULL, st->last_active_brate, st->element_mode, st->hFdCngDec->hFdCngCom->CngBandwidth ); + + /* Set 16k LSP flag for CNG buffer */ + st->hTdCngDec->ho_16k_lsp[st->hTdCngDec->ho_circ_ptr] = ( st->L_frame == L_FRAME ? 0 : 1 ); + } + + pop_wmops(); + return error; +} diff --git a/lib_dec/acelp_core_switch_dec.c b/lib_dec/acelp_core_switch_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..96e6bec4ef9cf560374a5e12fce7d28044dc81fe --- /dev/null +++ b/lib_dec/acelp_core_switch_dec.c @@ -0,0 +1,636 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "wmc_auto.h" + +/*---------------------------------------------------------------------* + * Local function prototypes + *---------------------------------------------------------------------*/ + +static void decod_gen_voic_core_switch( Decoder_State *st, const int16_t L_frame, const int16_t sharpFlag, const float *Aq, float *exc, const int32_t core_brate ); + + +/*-------------------------------------------------------------------* + * acelp_core_switch_dec() + * + * ACELP core decoder in the first ACELP->HQ switching frame + *-------------------------------------------------------------------*/ + +ivas_error acelp_core_switch_dec( + Decoder_State *st, /* i/o: decoder state structure */ + float *synth_subfr_out, /* o : synthesized ACELP subframe */ + float *tmp_synth_bwe, /* o : synthesized ACELP subframe BWE */ + const int16_t output_frame, /* i : input frame legth */ + const int16_t core_switching_flag, /* i : core switching flag */ + float *mem_synth, /* o : synthesis to overlap */ + const int16_t nchan_out /* i : number of output channels */ +) +{ + int16_t i, delta, L_frame_for_cs, decode_bwe; + int16_t d1m, ind1, fdelay, gapsize; + int32_t cbrate; + float synth_intFreq[2 * L_SUBFR]; + float old_exc[L_EXC_DEC], *exc; + float tmp_mem2[2 * L_FILT48k], gain; + float hb_synth_tmp[NS2SA( 48000, 10000000L )]; + const float *hp_filter; + float Aq[2 * ( M + 1 )]; + float bpf_error_signal[2 * L_SUBFR]; + float *realBuffer[CLDFB_NO_COL_MAX_SWITCH], *imagBuffer[CLDFB_NO_COL_MAX_SWITCH]; + float realBufferTmp[CLDFB_NO_COL_MAX_SWITCH][CLDFB_NO_CHANNELS_MAX], imagBufferTmp[CLDFB_NO_COL_MAX_SWITCH][CLDFB_NO_CHANNELS_MAX]; + ivas_error error; + + error = IVAS_ERR_OK; + + /*----------------------------------------------------------------* + * Initializations + *----------------------------------------------------------------*/ + + /* open CLDFB buffer up to CLDFB_NO_CHANNELS_MAX bands for 48kHz */ + for ( i = 0; i < CLDFB_NO_COL_MAX_SWITCH; i++ ) + { + set_f( realBufferTmp[i], 0, CLDFB_NO_CHANNELS_MAX ); + set_f( imagBufferTmp[i], 0, CLDFB_NO_CHANNELS_MAX ); + realBuffer[i] = realBufferTmp[i]; + imagBuffer[i] = imagBufferTmp[i]; + } + + d1m = 0; + gain = 0; + + mvr2r( st->old_Aq_12_8, Aq, M + 1 ); + mvr2r( st->old_Aq_12_8, Aq + ( M + 1 ), M + 1 ); + + set_f( mem_synth, 0, NS2SA( 16000, DELAY_CLDFB_NS ) + 2 ); + + /* set multiplication factor according to the sampling rate */ + delta = 1; + if ( output_frame == L_FRAME32k ) + { + delta = 2; + } + else if ( output_frame == L_FRAME48k ) + { + delta = 3; + } + + /*----------------------------------------------------------------* + * set switching frame bitrate + *----------------------------------------------------------------*/ + + if ( core_switching_flag && st->last_L_frame == st->last_L_frame_ori && ( st->last_core == ACELP_CORE || st->last_core == AMR_WB_CORE ) ) + { + exc = old_exc + L_EXC_MEM_DEC; + mvr2r( st->old_exc, old_exc, L_EXC_MEM_DEC ); + + if ( st->last_L_frame == L_FRAME ) + { + if ( st->core_brate > ACELP_24k40 ) + { + cbrate = ACELP_24k40; + } + else + { + cbrate = st->core_brate; + } + L_frame_for_cs = L_FRAME; + } + else + { + if ( st->core_brate <= ACELP_8k00 ) + { + cbrate = ACELP_8k00; + } + else if ( st->core_brate <= ACELP_14k80 ) + { + cbrate = ACELP_14k80; + } + else + { + cbrate = min( st->core_brate, ACELP_22k60 ); + } + + L_frame_for_cs = L_FRAME16k; + } + + /*----------------------------------------------------------------* + * Excitation decoding + *----------------------------------------------------------------*/ + + config_acelp1( DEC, st->total_brate, cbrate, st->core, -1, -1, st->last_L_frame, -1, &( st->acelp_cfg ), st->next_bit_pos, GENERIC, -1, -1, &decode_bwe /* dummy */, &i, st->element_mode, &i /*dummy*/, 0, 0, st->idchan, st->active_cnt, 0, 0, 0 /*st->GSC_IVAS_mode*/ ); + + decod_gen_voic_core_switch( st, L_frame_for_cs, 0, Aq, exc, cbrate ); + + /*----------------------------------------------------------------* + * synthesis, deemphasis, postprocessing and resampling + *----------------------------------------------------------------*/ + + /* synthesis and deemphasis */ + syn_12k8( 2 * L_SUBFR, Aq, exc, synth_intFreq, st->mem_syn2, 1 ); + + if ( st->hPFstat->on && st->last_bwidth == NB ) + { + float tmp_noise, pitch_buf_tmp[2]; + tmp_noise = 0; + + for ( i = 0; i < 2; i++ ) + { + pitch_buf_tmp[i] = L_SUBFR; + } + + nb_post_filt( 2 * L_SUBFR, L_SUBFR, st->hPFstat, &tmp_noise, 0, synth_intFreq, Aq, pitch_buf_tmp, AUDIO, st->BER_detect, 0 ); + } + + if ( L_frame_for_cs == L_FRAME ) + { + deemph( synth_intFreq, PREEMPH_FAC, 2 * L_SUBFR, &st->mem_deemph ); + } + else + { + deemph( synth_intFreq, PREEMPH_FAC_16k, 2 * L_SUBFR, &st->mem_deemph ); + } + + AGC_dec( synth_intFreq, st->agc_mem2, 2 * L_SUBFR ); + + if ( st->hPFstat->on && st->last_bwidth != NB ) + { + mvr2r( st->hPFstat->mem_pf_in + L_SYN_MEM - M, bpf_error_signal, M ); /*bpf_error_signal used as temporary buffer*/ + mvr2r( synth_intFreq, bpf_error_signal + M, L_SUBFR ); + residu( Aq, M, bpf_error_signal + M, old_exc, L_SUBFR ); + syn_filt( Aq, M, old_exc, bpf_error_signal, L_SUBFR, st->hPFstat->mem_stp + L_SYN_MEM - M, 0 ); + scale_st( synth_intFreq, bpf_error_signal, &st->hPFstat->gain_prec, L_SUBFR, -1 ); + mvr2r( bpf_error_signal, synth_intFreq, L_SUBFR / 2 ); + blend_subfr2( bpf_error_signal + L_SUBFR / 2, synth_intFreq + L_SUBFR / 2, synth_intFreq + L_SUBFR / 2 ); + } + st->hPFstat->on = 0; + + if ( st->flag_cna ) + { + generate_masking_noise( synth_intFreq, st->hFdCngDec->hFdCngCom, 2 * L_SUBFR, 0, 0, 0, st->element_mode, NULL, nchan_out ); + } + + /*----------------------------------------------------------------* + * Resample to the output sampling rate (8/16/32/48 kHz) + * Bass post-filter + *----------------------------------------------------------------*/ + + /* bass post-filter */ + bass_psfilter( st->hBPF, st->Opt_AMR_WB, synth_intFreq, 2 * L_SUBFR, NULL, st->bpf_off, st->stab_fac, &st->stab_fac_smooth, GENERIC, bpf_error_signal ); + + /* CLDFB analysis of the synthesis at internal sampling rate */ + if ( ( error = cldfb_save_memory( st->cldfbAna ) ) != IVAS_ERR_OK ) + { + return error; + } + + cldfbAnalysis( synth_intFreq, realBuffer, imagBuffer, NS2SA( L_frame_for_cs * FRAMES_PER_SEC, SWITCH_GAP_LENGTH_NS + DELAY_CLDFB_NS ), st->cldfbAna ); + cldfb_restore_memory( st->cldfbAna ); + + /* CLDFB analysis and add the BPF error signal */ + if ( ( error = cldfb_save_memory( st->cldfbBPF ) ) != IVAS_ERR_OK ) + { + return error; + } + + addBassPostFilter( bpf_error_signal, st->bpf_off ? 0 : NS2SA( L_frame_for_cs * FRAMES_PER_SEC, SWITCH_GAP_LENGTH_NS + DELAY_CLDFB_NS ), realBuffer, imagBuffer, st->cldfbBPF ); + cldfb_restore_memory( st->cldfbBPF ); + + /* CLDFB synthesis of the combined signal */ + if ( ( error = cldfb_save_memory( st->cldfbSyn ) ) != IVAS_ERR_OK ) + { + return error; + } + + cldfbSynthesis( realBuffer, imagBuffer, synth_subfr_out, NS2SA( st->output_Fs, SWITCH_GAP_LENGTH_NS + DELAY_CLDFB_NS ), st->cldfbSyn ); + cldfb_restore_memory( st->cldfbSyn ); + + mvr2r( synth_intFreq + NS2SA( L_frame_for_cs * FRAMES_PER_SEC, SWITCH_GAP_LENGTH_NS - DELAY_CLDFB_NS ) - 2, mem_synth, NS2SA( L_frame_for_cs * FRAMES_PER_SEC, DELAY_CLDFB_NS ) + 2 ); /* need for switching (-2 is due to 0 delay filtering) */ + + /*----------------------------------------------------------------* + * BWE decoding + *----------------------------------------------------------------*/ + + decode_bwe = 0; + if ( !( ( inner_frame_tbl[st->bwidth] == L_FRAME16k && st->last_L_frame == L_FRAME16k ) || inner_frame_tbl[st->bwidth] == L_FRAME8k ) ) + { + /* Decoding of BWE */ + d1m = get_next_indice( st, AUDIODELAYBITS ); + ind1 = get_next_indice( st, NOOFGAINBITS1 ); + gain = usdequant( ind1, MINVALUEOFFIRSTGAIN, DELTAOFFIRSTGAIN ); + decode_bwe = 1; + } + + + if ( decode_bwe && !( ( output_frame == L_FRAME16k && st->last_L_frame == L_FRAME16k ) || output_frame == L_FRAME8k ) ) + { + set_f( tmp_mem2, 0, 2 * L_FILT48k ); + + hp_filter = hp16000_48000; + fdelay = 48; + if ( st->output_Fs == 16000 ) + { + if ( st->last_L_frame == L_FRAME ) + { + hp_filter = hp12800_16000; + fdelay = 20; + } + } + else if ( st->output_Fs == 32000 ) + { + + if ( st->last_L_frame == L_FRAME ) + { + hp_filter = hp12800_32000; + fdelay = 40; + } + else + { + hp_filter = hp16000_32000; + fdelay = 32; + } + } + else if ( st->last_L_frame == L_FRAME ) + { + hp_filter = hp12800_48000; + fdelay = 60; + } + + /* safety check in case of bit errors */ + i = MAX_D1M_16k; + if ( st->last_L_frame == L_FRAME ) + { + i = MAX_D1M_12k8; + } + + if ( d1m >= i ) + { + d1m = i - 1; + gain = 0; /* force muting */ + st->BER_detect = 1; + } + + i = NS2SA( st->output_Fs, FRAME_SIZE_NS - ACELP_LOOK_NS - DELAY_BWE_TOTAL_NS ); + mvr2r( st->old_synth_sw, hb_synth_tmp, i ); + set_f( hb_synth_tmp + i, 0, NS2SA( st->output_Fs, 10000000L ) - i ); + fir( hb_synth_tmp, hp_filter, hb_synth_tmp, tmp_mem2, output_frame >> 1, fdelay, 0 ); /* put the 40 past samples into the memory */ + set_f( tmp_synth_bwe, 0, SWITCH_MAX_GAP ); + + gapsize = delta * ( NS2SA( 16000, SWITCH_GAP_LENGTH_NS ) ); + for ( i = 0; i < gapsize; i++ ) + { + tmp_synth_bwe[i] = hb_synth_tmp[i + d1m * delta + fdelay] * gain; + } + } + else + { + set_f( tmp_synth_bwe, 0, SWITCH_MAX_GAP ); + } + } + + return error; +} + + +/*-------------------------------------------------------------------* + * acelp_core_switch_dec_bfi() + * + * ACELP core decoder in the first ACELP->HQ switching frame in case of BAD frame + *-------------------------------------------------------------------*/ + +ivas_error acelp_core_switch_dec_bfi( + Decoder_State *st /* i/o: decoder state structure */ +) +{ + int16_t i; + float old_exc[L_EXC_DEC], *exc; /* excitation signal buffer */ + float syn[L_FRAME16k]; /* synthesis signal buffer */ + float lsf_new[M]; /* LSFs at the end of the frame */ + float lsp_new[M]; /* LSPs at the end of the frame */ + float Aq[NB_SUBFR16k * ( M + 1 )]; /* A(q) quantized for the 4 subframes */ + float old_exc2[L_FRAME16k + L_EXC_MEM], *exc2; /* total excitation buffer */ + float tmp_noise; /* Long term temporary noise energy */ + float FEC_pitch; /* FEC pitch */ + float old_bwe_exc[( ( PIT16k_MAX + ( L_FRAME16k + 1 ) + L_SUBFR16k ) * 2 )]; /* excitation buffer */ + float *bwe_exc; /* Excitation for SWB TBE */ + float tmp_float[NBPSF_PIT_MAX]; + float tmp_float2[M]; + float tmp_float3; + float tmp_float4[L_TRACK_HIST]; + int16_t tmp_float5[L_TRACK_HIST]; + int16_t tmp_float6[L_TRACK_HIST]; + float tmp_float7; + + float voice_factors[NB_SUBFR16k]; + float pitch_buf[NB_SUBFR16k]; + float *realBuffer[CLDFB_NO_COL_MAX_SWITCH_BFI], *imagBuffer[CLDFB_NO_COL_MAX_SWITCH_BFI]; + float realBufferTmp[CLDFB_NO_COL_MAX_SWITCH_BFI][CLDFB_NO_CHANNELS_MAX], imagBufferTmp[CLDFB_NO_COL_MAX_SWITCH_BFI][CLDFB_NO_CHANNELS_MAX]; + ivas_error error; + + error = IVAS_ERR_OK; + + /*----------------------------------------------------------------* + * Initialization + *----------------------------------------------------------------*/ + + /* initialize CLDFB buffer up to CLDFB_NO_CHANNELS_MAX bands for 48kHz */ + for ( i = 0; i < CLDFB_NO_COL_MAX_SWITCH_BFI; i++ ) + { + set_f( realBufferTmp[i], 0, CLDFB_NO_CHANNELS_MAX ); + set_f( imagBufferTmp[i], 0, CLDFB_NO_CHANNELS_MAX ); + realBuffer[i] = realBufferTmp[i]; + imagBuffer[i] = imagBufferTmp[i]; + } + + st->bpf_off = 1; + st->clas_dec = st->last_good; + tmp_noise = 0.0f; + + mvr2r( st->old_exc, old_exc, L_EXC_MEM_DEC ); + exc = old_exc + L_EXC_MEM_DEC; + + if ( st->hWIDec != NULL ) + { + mvr2r( st->hWIDec->old_exc2, old_exc2, L_EXC_MEM ); + } + else + { + set_f( old_exc2, 0, L_EXC_MEM ); + } + exc2 = old_exc2 + L_EXC_MEM; + + if ( st->hBWE_TD != NULL ) + { + mvr2r( st->hBWE_TD->old_bwe_exc, old_bwe_exc, PIT16k_MAX * 2 ); + bwe_exc = old_bwe_exc + PIT16k_MAX * 2; + } + else + { + bwe_exc = NULL; + } + + st->GSC_noisy_speech = 0; + st->relax_prev_lsf_interp = 0; + + /* SC-VBR */ + if ( st->last_nelp_mode_dec == 1 ) + { + st->nelp_mode_dec = 1; + } + + mvr2r( st->mem_AR, tmp_float, M ); + mvr2r( st->mem_MA, tmp_float2, M ); + + /* LSF estimation and A(z) calculation */ + lsf_dec_bfi( MODE1, lsf_new, st->lsf_old, st->lsf_adaptive_mean, NULL, st->mem_MA, st->mem_AR, st->stab_fac, st->last_coder_type, st->L_frame, st->last_good, st->nbLostCmpt, 0, NULL, NULL, NULL, st->hGSCDec->Last_GSC_pit_band_idx, st->Opt_AMR_WB, st->bwidth ); + + FEC_lsf2lsp_interp( st, st->L_frame, Aq, lsf_new, lsp_new ); + + mvr2r( tmp_float, st->mem_AR, M ); + mvr2r( tmp_float2, st->mem_MA, M ); + + /*----------------------------------------------------------------* + * Excitation decoding + *----------------------------------------------------------------*/ + + if ( st->nelp_mode_dec == 1 ) + { + /* SC-VBR */ + decod_nelp( st, &tmp_noise, pitch_buf, exc, exc2, voice_factors, bwe_exc, st->bfi, tmp_float2 ); + FEC_pitch = pitch_buf[3]; + } + else + { + tmp_float[0] = st->bfi_pitch; + tmp_float[1] = (float) st->bfi_pitch_frame; + tmp_float[2] = st->lp_gainp; + tmp_float[3] = st->lp_gainc; + tmp_float[4] = st->upd_cnt; + tmp_float[5] = st->seed; + + /* calculation of excitation signal */ + FEC_exc_estim( st, st->L_frame, exc, exc2, syn /* dummy buffer */, pitch_buf, voice_factors, &FEC_pitch, bwe_exc, lsf_new, &tmp_noise ); + + st->seed = (int16_t) tmp_float[5]; + st->bfi_pitch = tmp_float[0]; + st->bfi_pitch_frame = (int16_t) tmp_float[1]; + st->lp_gainp = tmp_float[2]; + st->lp_gainc = tmp_float[3]; + st->upd_cnt = (int16_t) tmp_float[4]; + } + + /*------------------------------------------------------------------* + * Synthesis + *-----------------------------------------------------------------*/ + + mvr2r( st->mem_syn2, tmp_float, M ); + syn_12k8( st->L_frame, Aq, exc2, syn, tmp_float, 1 ); + + tmp_float[0] = st->enr_old; + fer_energy( st->L_frame, st->last_good, syn, FEC_pitch, tmp_float, st->L_frame ); + + /*------------------------------------------------------------------* + * Perform fixed deemphasis through 1/(1 - g*z^-1) + *-----------------------------------------------------------------*/ + + mvr2r( &( st->mem_deemph ), tmp_float, 1 ); + if ( st->L_frame == L_FRAME ) + { + deemph( syn, PREEMPH_FAC, L_FRAME, tmp_float ); + } + else + { + deemph( syn, PREEMPH_FAC_16k, L_FRAME16k, tmp_float ); + } + + /*----------------------------------------------------------------* + * Bass post-filter + *----------------------------------------------------------------*/ + + st->bpf_off = 1; + mvr2r( st->hBPF->pst_old_syn, tmp_float, NBPSF_PIT_MAX ); + tmp_float3 = st->stab_fac_smooth; + mvr2r( st->hBPF->mem_mean_pit, tmp_float4, L_TRACK_HIST ); + mvs2s( st->hBPF->Track_on_hist, tmp_float5, L_TRACK_HIST ); + mvs2s( st->hBPF->vibrato_hist, tmp_float6, L_TRACK_HIST ); + tmp_float7 = st->hBPF->psf_att; + + /* apply bass post-filter */ + bass_psfilter( st->hBPF, st->Opt_AMR_WB, syn, st->L_frame, pitch_buf, st->bpf_off, st->stab_fac, &tmp_float3, st->coder_type, old_exc /* tmp buffer */ ); + + mvr2r( tmp_float, st->hBPF->pst_old_syn, NBPSF_PIT_MAX ); + mvr2r( tmp_float4, st->hBPF->mem_mean_pit, L_TRACK_HIST ); + mvs2s( tmp_float5, st->hBPF->Track_on_hist, L_TRACK_HIST ); + mvs2s( tmp_float6, st->hBPF->vibrato_hist, L_TRACK_HIST ); + st->hBPF->psf_att = tmp_float7; + + /*----------------------------------------------------------------* + * Resampling to the output sampling frequency + *----------------------------------------------------------------*/ + + /* CLDFB analysis of the synthesis at internal sampling rate */ + if ( ( error = cldfb_save_memory( st->cldfbAna ) ) != IVAS_ERR_OK ) + { + return error; + } + + cldfbAnalysis( syn, realBuffer, imagBuffer, st->L_frame / 2, st->cldfbAna ); + cldfb_restore_memory( st->cldfbAna ); + + /* CLDFB synthesis of the combined signal */ + if ( ( error = cldfb_save_memory( st->cldfbSyn ) ) != IVAS_ERR_OK ) + { + return error; + } + + cldfbSynthesis( realBuffer, imagBuffer, st->hHQ_core->fer_samples, (int16_t) ( st->output_Fs * 0.01f ), st->cldfbSyn ); + cldfb_restore_memory( st->cldfbSyn ); + + return error; +} + + +/*-------------------------------------------------------------------* + * decod_gen_voic_core_switch() + * + * Decode excitation signal in the first ACELP->HQ switching frame + *-------------------------------------------------------------------*/ + +static void decod_gen_voic_core_switch( + Decoder_State *st, /* i/o: decoder static memory */ + const int16_t L_frame, /* i : length of the frame */ + const int16_t sharpFlag, /* i : flag for formant sharpening */ + const float *Aq, /* i : LP filter coefficient */ + float *exc, /* i/o: adapt. excitation exc */ + const int32_t core_brate /* i : switching frame bitrate */ +) +{ + int16_t T0, T0_frac, T0_min, T0_max; /* integer pitch variables */ + float gain_pit; /* pitch gain */ + float gain_code; /* gain/normalized gain of the algebraic excitation */ + float norm_gain_code; /* normalized gain of the algebraic excitation */ + float gain_inov; /* Innovation gain */ + float voice_fac; /* voicing factor */ + float code[L_SUBFR]; /* algebraic codevector */ + float pitch; /* pointer to floating pitch */ + int16_t i; /* tmp variables */ + int16_t pitch_limit_flag; + float tmpF; + + /* initializations */ + if ( L_frame == L_FRAME ) + { + T0_max = PIT_MAX; + T0_min = PIT_MIN; + } + else /* L_frame == L_FRAME16k */ + { + T0_max = PIT16k_MAX; + T0_min = PIT16k_MIN; + } + + /*----------------------------------------------------------------------* + * Decode pitch lag + *----------------------------------------------------------------------*/ + + pitch = pit_decode( st, core_brate, 0, L_frame, 0, GENERIC, &pitch_limit_flag, &T0, &T0_frac, &T0_min, &T0_max, L_SUBFR, 0, NULL ); + + /*--------------------------------------------------------------* + * Find the adaptive codebook vector. + *--------------------------------------------------------------*/ + + pred_lt4( &exc[0], &exc[0], T0, T0_frac, L_SUBFR + 1, inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + + /*--------------------------------------------------------------* + * LP filtering of the adaptive excitation + *--------------------------------------------------------------*/ + + lp_filt_exc_dec( st, MODE1, 0, L_SUBFR, L_frame, st->acelp_cfg.ltf_mode, exc ); + + /*--------------------------------------------------------------* + * Innovation decoding + *--------------------------------------------------------------*/ + + inov_decode( st, core_brate, 0, L_frame, sharpFlag, 0, Aq, st->tilt_code, pitch, code, L_SUBFR ); + + /*--------------------------------------------------------------* + * Gain decoding + * Estimate spectrum tilt and voicing + *--------------------------------------------------------------*/ + + if ( L_frame == L_FRAME ) + { + gain_dec_mless( st, L_frame, TRANSITION, 0, -1, code, st->old_Es_pred, &gain_pit, &gain_code, &gain_inov, &norm_gain_code ); + } + else + { + gain_dec_mless( st, L_frame, GENERIC, 0, -1, code, st->old_Es_pred, &gain_pit, &gain_code, &gain_inov, &norm_gain_code ); + } + + st->tilt_code = est_tilt( exc, gain_pit, code, gain_code, &voice_fac, L_SUBFR, 0 ); + + /*----------------------------------------------------------------------* + * Find the total excitation + *----------------------------------------------------------------------*/ + + if ( st->prev_bfi ) + { + gain_code = min( gain_code, 0.5f * gain_code + 0.5f * st->lp_gainc ); + } + + for ( i = 0; i < L_SUBFR; i++ ) + { + tmpF = gain_pit * exc[i]; + exc[i] = tmpF + gain_code * code[i]; + } + + /*-----------------------------------------------------------------* + * long term prediction on the 2nd sub frame + *-----------------------------------------------------------------*/ + + pred_lt4( &exc[L_SUBFR], &exc[L_SUBFR], T0, T0_frac, L_SUBFR + 1, inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + + for ( i = 0; i < L_SUBFR; i++ ) + { + exc[i + L_SUBFR] *= gain_pit; + } + + return; +} diff --git a/lib_dec/amr_wb_dec.c b/lib_dec/amr_wb_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..b585eecf99e815fe242033de9f7d57b84bcda36a --- /dev/null +++ b/lib_dec/amr_wb_dec.c @@ -0,0 +1,842 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "wmc_auto.h" + +/*------------------------------------------------------------------* + * amr_wb_dec() + * + * AMR-WB decoder + *------------------------------------------------------------------*/ + +ivas_error amr_wb_dec( + Decoder_State *st, /* i/o: decoder state structure */ + float mem_hp20_out[L_HP20_MEM], /* i/o: HP filter memory for synthesis */ + float *output /* o : synthesis output */ +) +{ + int16_t i; + int16_t vad_flag; + float ftmp; + float old_exc[L_EXC_DEC], *exc; /* excitation signal buffer */ + float syn_tmp[L_FRAME + 2], *syn; /* synthesis signal buffer */ + float synth_out[L_FRAME48k]; /* synthesis output */ + int16_t output_frame; /* frame length at output sampling freq. */ + float lsf_new[M]; /* LSFs at the end of the frame */ + float lsp_new[M]; /* LSPs at the end of the frame */ + float Aq[NB_SUBFR * ( M + 1 )]; /* A(q) quantized for the 4 subframes */ + float exc2[L_FRAME]; /* total excitation buffer */ + float mem_tmp[M]; /* temporary synthesis filter memory */ + float pitch_buf[NB_SUBFR]; /* floating pitch for each subframe */ + float enr_q; /* E information for FER protection */ + float tmp_noise; /* Long term temporary noise energy */ + float FEC_pitch; /* FEC pitch */ + float dummy_buf[L_FRAME32k]; /* dummy buffer - no usage */ + int16_t allow_cn_step; + int16_t locattack, amr_io_class; + int16_t tmps; + float xsp_tmp[M]; + float tmp_buffer[L_FRAME48k]; + float dct_buffer[DCT_L_POST]; + float frame_e; + float exc_buffer[DCT_L_POST]; + float class_para; + float voice_factors[NB_SUBFR]; + int16_t hf_gain[NB_SUBFR]; + int16_t delay_comp; + int16_t nZeros; + float tmp; + int16_t last_core_ori; + int16_t sid_bw = 0; + float bpf_error_signal[L_FRAME]; + float ng_ener; + float gain_buf[NB_SUBFR16k]; + float q_env[20]; + float exc3[L_FRAME]; + float *realBuffer[CLDFB_NO_COL_MAX], *imagBuffer[CLDFB_NO_COL_MAX]; + float realBufferTmp[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], imagBufferTmp[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + int16_t flag_cna; + int16_t waveadj_rec = 0; + TCX_LTP_DEC_HANDLE hTcxLtpDec = st->hTcxLtpDec; + ivas_error error; + + error = IVAS_ERR_OK; + + /*------------------------------------------------------------------* + * Initialization + *------------------------------------------------------------------*/ + + st->idchan = 0; + + syn_tmp[0] = 0; + syn_tmp[1] = 0; + syn = syn_tmp + 2; + + for ( i = 0; i < CLDFB_NO_COL_MAX; i++ ) + { + set_f( realBufferTmp[i], 0, CLDFB_NO_CHANNELS_MAX ); + set_f( imagBufferTmp[i], 0, CLDFB_NO_CHANNELS_MAX ); + realBuffer[i] = realBufferTmp[i]; + imagBuffer[i] = imagBufferTmp[i]; + } + + set_f( gain_buf, 0, NB_SUBFR16k ); + + st->use_partial_copy = 0; + st->rf_frame_type = RF_NO_DATA; + st->rf_flag = 0; + st->rf_flag_last = 0; + + st->L_frame = L_FRAME; + st->nb_subfr = NB_SUBFR; + st->core = AMR_WB_CORE; + st->core_brate = st->total_brate; + st->extl = -1; + st->bwidth = WB; + st->coder_type = GENERIC; + output_frame = (int16_t) ( st->output_Fs / FRAMES_PER_SEC ); /* frame length of the input signal */ + + st->bpf_off = 0; + if ( st->last_core == HQ_CORE ) + { + st->bpf_off = 1; + st->hPFstat->on = 0; + } + st->igf = 0; + + st->sr_core = st->L_frame * FRAMES_PER_SEC; + st->fscale_old = st->fscale; + st->fscale = sr2fscale( st->sr_core ); + + /* Initialization in case that the first frame is the good received AMR-WB (IO) frame */ + if ( st->ini_frame == 0 ) + { + st->last_core = AMR_WB_CORE; + mvr2r( mean_isf_amr_wb, st->lsf_old, M ); + isf2isp( st->lsf_old, st->lsp_old, M, INT_FS_12k8 ); + } + + /* Updates in case of EVS primary mode -> AMR-WB IO mode switching */ + if ( st->last_core != AMR_WB_CORE ) + { + updt_IO_switch_dec( output_frame, st ); + } + + /* Updates in case of HQ -> AMR-WB IO switching */ + if ( ( error = core_switching_pre_dec( st, output_frame, -1, -1, EVS_MONO, -1 ) ) != IVAS_ERR_OK ) + { + return error; + } + + + last_core_ori = st->last_core; + set_s( hf_gain, 0, NB_SUBFR ); + + enr_q = 0.0f; + tmp_noise = 0.0f; + amr_io_class = UNVOICED_CLAS; + + mvr2r( st->old_exc, old_exc, L_EXC_MEM_DEC ); + exc = old_exc + L_EXC_MEM_DEC; + + /* reset post-filter in case of switching */ + if ( st->hPFstat->on == 0 ) + { + st->hPFstat->reset = 1; + } + + if ( st->bfi ) + { + st->nbLostCmpt++; + } + else + { + st->nbLostCmpt = 0; + } + + /* PLC: [TCX: Fade-out-recovery] + * PLC: overlapping part needs to be attenuated for first good frame */ + if ( !st->bfi && st->prev_bfi && ( st->last_codec_mode == MODE2 ) && ( st->last_core_bfi == TCX_20_CORE || st->last_core_bfi == TCX_10_CORE ) ) + { + v_multc( st->hHQ_core->old_out, st->hPlcInfo->recovery_gain, st->hHQ_core->old_out, st->hTcxDec->L_frameTCX ); + } + + /*-----------------------------------------------------------------* + * switching from ACELP@16k core to AMR-WB IO mode + *-----------------------------------------------------------------*/ + + st->rate_switching_reset = 0; + + if ( st->last_core != AMR_WB_CORE && st->last_L_frame == L_FRAME16k && st->last_core != HQ_CORE ) + { + /* in case of switching, do not apply BPF */ + st->bpf_off = 1; + if ( st->hPFstat->on != 0 ) + { + int16_t mem_syn_r_size_old, mem_syn_r_size_new; + + mem_syn_r_size_old = (int16_t) ( 1.25 * st->last_L_frame / 20.f ); + mem_syn_r_size_new = (int16_t) ( 1.25 * st->L_frame / 20.f ); + lerp( st->hPFstat->mem_stp + L_SYN_MEM - mem_syn_r_size_old, st->hPFstat->mem_stp + L_SYN_MEM - mem_syn_r_size_new, mem_syn_r_size_new, mem_syn_r_size_old ); + lerp( st->hPFstat->mem_pf_in + L_SYN_MEM - mem_syn_r_size_old, st->hPFstat->mem_pf_in + L_SYN_MEM - mem_syn_r_size_new, mem_syn_r_size_new, mem_syn_r_size_old ); + } + + /* convert old quantized LSP vector */ + st->rate_switching_reset = lsp_convert_poly( st->lsp_old, L_FRAME, 1 ); + + /* convert old quantized LSF vector */ + lsp2lsf( st->lsp_old, st->lsf_old, M, INT_FS_12k8 ); + + /* FEC - update adaptive LSF mean vector */ + mvr2r( st->lsf_old, st->lsfoldbfi1, M ); + mvr2r( st->lsf_old, st->lsfoldbfi0, M ); + mvr2r( st->lsf_old, st->lsf_adaptive_mean, M ); + + /* Reset LPC mem */ + mvr2r( GEWB_Ave, st->mem_AR, M ); + set_zero( st->mem_MA, M ); + + /* update synthesis filter memories */ + synth_mem_updt2( L_FRAME, st->last_L_frame, st->old_exc, st->mem_syn_r, st->mem_syn2, NULL, DEC ); + mvr2r( st->old_exc, old_exc, L_EXC_MEM_DEC ); + mvr2r( st->mem_syn2, st->mem_syn1, M ); + mvr2r( st->mem_syn2, st->mem_syn3, M ); + + /* LSP -> ISP */ + mvr2r( stable_ISP, xsp_tmp, M ); + lsp2isp( st->lsp_old, st->lsp_old, xsp_tmp, M ); + } + + /* update buffer of old subframe pitch values */ + if ( st->last_L_frame != L_FRAME ) + { + if ( st->last_L_frame == L_FRAME32k ) + { + tmp = (float) 12800 / (float) 32000; + } + else if ( st->last_L_frame == 512 ) + { + tmp = (float) 12800 / (float) 25600; + } + else /* st->last_L_frame == L_FRAME16k */ + { + tmp = (float) 12800 / (float) 16000; + } + + for ( i = NB_SUBFR16k - NB_SUBFR; i < NB_SUBFR16k; i++ ) + { + st->old_pitch_buf[i - 1] = tmp * st->old_pitch_buf[i]; + } + + for ( i = 2 * NB_SUBFR16k - NB_SUBFR; i < 2 * NB_SUBFR16k; i++ ) + { + st->old_pitch_buf[i - 2] = tmp * st->old_pitch_buf[i]; + } + } + + if ( st->bfi_pitch_frame != L_FRAME ) + { + if ( st->bfi_pitch_frame == L_FRAME32k ) + { + tmp = (float) 12800 / (float) 32000; + } + else if ( st->bfi_pitch_frame == 512 ) + { + tmp = (float) 12800 / (float) 25600; + } + else /* st->bfi_pitch_frame == L_FRAME16k */ + { + tmp = (float) 12800 / (float) 16000; + } + + st->bfi_pitch *= tmp; + st->bfi_pitch_frame = L_FRAME; + } + + if ( st->last_bwidth == NB && st->ini_frame != 0 ) + { + st->rate_switching_reset = 1; + } + + /*----------------------------------------------------------------------* + * GOOD frame + *----------------------------------------------------------------------*/ + + if ( !st->bfi ) + { + /*----------------------------------------------------------------* + * Processing of FRAME_NO_DATA frames + * Decoding of SID frames + *----------------------------------------------------------------*/ + + if ( st->core_brate == FRAME_NO_DATA || st->core_brate == SID_1k75 ) + { + /* decode CNG parameters */ + CNG_dec( st, EVS_MONO, Aq, lsp_new, lsf_new, &allow_cn_step, &sid_bw, q_env ); + + /* comfort noise generation */ + CNG_exc( st->core_brate, L_FRAME, &st->hTdCngDec->Enew, &st->hTdCngDec->cng_seed, exc, exc2, &st->lp_ener, st->last_core_brate, &st->first_CNG, &st->hTdCngDec->cng_ener_seed, dummy_buf, allow_cn_step, &st->hTdCngDec->last_allow_cn_step, st->hTdCngDec->num_ho, q_env, st->hTdCngDec->lp_env, st->hTdCngDec->old_env, st->hTdCngDec->exc_mem, st->hTdCngDec->exc_mem1, &sid_bw, &st->hTdCngDec->cng_ener_seed1, exc3, st->Opt_AMR_WB, EVS_MONO ); + set_f( voice_factors, 1.0f, NB_SUBFR ); + class_para = 0.0f; + + /* update past excitation signals for LD music post-filter */ + mvr2r( st->hMusicPF->dct_post_old_exc + L_FRAME, st->hMusicPF->dct_post_old_exc, DCT_L_POST - L_FRAME - OFFSET2 ); + mvr2r( exc2, st->hMusicPF->dct_post_old_exc + ( DCT_L_POST - L_FRAME - OFFSET2 ), L_FRAME ); + + /* synthesis at 12k8 Hz sampling rate */ + syn_12k8( L_FRAME, Aq, exc2, syn, st->mem_syn2, 1 ); + syn_12k8( st->L_frame, Aq, exc2, dummy_buf, st->mem_syn3, 1 ); + + /* reset the decoder */ + CNG_reset_dec( st, pitch_buf, dummy_buf + L_FRAME ); + + /* update st->mem_syn1 for ACELP core switching */ + mvr2r( st->mem_syn3, st->mem_syn1, M ); + if ( output_frame != L_FRAME8k ) + { + frame_e = 10.0f * (float) log10( dotp( syn, syn, L_FRAME ) / (float) L_FRAME ); + st->psf_lp_noise = 0.99f * st->psf_lp_noise + 0.01f * frame_e; + } + + /* update old synthesis for classification */ + mvr2r( syn + L_FRAME - L_SYN_MEM_CLAS_ESTIM, st->mem_syn_clas_estim, L_SYN_MEM_CLAS_ESTIM ); + + /* Update music post processing values */ + /* Filter energies update */ + for ( i = 0; i < DCT_L_POST; i++ ) + { + st->hMusicPF->filt_lfE[i] = 0.3f + 0.7f * st->hMusicPF->filt_lfE[i]; + } + + vad_flag = 0; + } + + /*----------------------------------------------------------------* + * Decoding of all other frames + *----------------------------------------------------------------*/ + + else + { + /*-----------------------------------------------------------------* + * After CNG period, use the most up-to-date ISPs + *-----------------------------------------------------------------*/ + + if ( st->last_core_brate == FRAME_NO_DATA || st->last_core_brate == SID_1k75 ) + { + mvr2r( st->lspCNG, st->lsp_old, M ); + isp2isf( st->lspCNG, st->lsf_old, M, INT_FS_12k8 ); + set_f( old_exc, 0, L_EXC_MEM_DEC ); + } + + /*------------------------------------------------------------* + * Extracts VAD information from the bitstream in AMR-WB IO mode + *------------------------------------------------------------*/ + + vad_flag = get_next_indice( st, 1 ); + + if ( vad_flag == 0 ) + { + st->coder_type = INACTIVE; + } + else + { + st->coder_type = GENERIC; + } + + /*-----------------------------------------------------------------* + * ISF de-quantization and interpolation + *-----------------------------------------------------------------*/ + + isf_dec_amr_wb( st, Aq, lsf_new, lsp_new ); + + /*------------------------------------------------------------* + * Decode excitation + *------------------------------------------------------------*/ + + decod_amr_wb( st, Aq, pitch_buf, exc, exc2, hf_gain, voice_factors, gain_buf ); + + /* synthesis for ACELP core switching and SWB BWE */ + syn_12k8( L_FRAME, Aq, exc, tmp_buffer, st->mem_syn1, 1 ); + + /*------------------------------------------------------------* + * Update long-term energies for FEC + * Update ISP vector for CNG + *------------------------------------------------------------*/ + + if ( st->coder_type == INACTIVE ) + { + if ( st->unv_cnt > 20 ) + { + ftmp = st->lp_gainc * st->lp_gainc; + st->lp_ener = 0.7f * st->lp_ener + 0.3f * ftmp; + for ( i = 0; i < M; i++ ) + { + st->lspCNG[i] = (float) ( 0.9f * st->lspCNG[i] + 0.1f * lsp_new[i] ); + } + } + else + { + st->unv_cnt++; + } + } + else + { + st->unv_cnt = 0; + } + + /*------------------------------------------------------------* + * Save filter memory in case the synthesis is redone after scaling + * Core synthesis at 12k8 Hz + *------------------------------------------------------------*/ + + mvr2r( st->mem_syn2, mem_tmp, M ); + syn_12k8( L_FRAME, Aq, exc2, syn, st->mem_syn2, 1 ); + + /*------------------------------------------------------------* + * FEC - Estimate the classification information + *------------------------------------------------------------*/ + + FEC_clas_estim( syn, pitch_buf, st->L_frame, st->coder_type, st->codec_mode, st->mem_syn_clas_estim, &st->clas_dec, &st->lp_ener_bfi, st->Opt_AMR_WB, &st->decision_hyst, &locattack, &st->hAmrwb_IO->UV_cnt, &st->hAmrwb_IO->LT_UV_cnt, &st->hAmrwb_IO->Last_ener, &amr_io_class, st->hAmrwb_IO->lt_diff_etot, &class_para, 0, 0, CLASSIFIER_ACELP, 0, 0, 0, st->last_core_brate, -1 ); + + /* update past excitation signals for LD music post-filter */ + mvr2r( st->hMusicPF->dct_post_old_exc + L_FRAME, st->hMusicPF->dct_post_old_exc, DCT_L_POST - L_FRAME - OFFSET2 ); + mvr2r( exc2, st->hMusicPF->dct_post_old_exc + ( DCT_L_POST - L_FRAME - OFFSET2 ), L_FRAME ); + mvr2r( st->hMusicPF->dct_post_old_exc, exc_buffer, DCT_L_POST - OFFSET2 ); + + if ( output_frame != L_FRAME8k ) + { + if ( st->coder_type == INACTIVE ) + { + frame_energy( L_FRAME, pitch_buf, syn, 0.0f, &frame_e ); + st->psf_lp_noise = 0.99f * st->psf_lp_noise + 0.01f * frame_e; + } + } + + if ( amr_io_class != UNVOICED_CLAS && st->coder_type != INACTIVE && st->psf_lp_noise < 15.0f ) + { + int16_t tmp_coder_type = AUDIO; + if ( st->last_coder_type == INACTIVE || st->last_coder_type == UNVOICED ) + { + tmp_coder_type = INACTIVE; + } + /* Extrapolation of the last future part, windowing and high resolution DCT transform */ + Prep_music_postP( exc_buffer, dct_buffer, st->hMusicPF->filt_lfE, st->last_core, pitch_buf, st->hMusicPF->LDm_enh_lp_gbin ); + + /* LD music post-filter */ + LD_music_post_filter( st->hMusicPF, dct_buffer, dct_buffer, st->core_brate, -1, tmp_coder_type ); + + /* Inverse DCT transform, retrieval of the aligned excitation, re-synthesis */ + Post_music_postP( dct_buffer, exc_buffer, exc2, mem_tmp, st->mem_syn2, Aq, syn ); + } + else + { + /*------------------------------------------------------------* + * Improvement for unvoiced and audio signals + *------------------------------------------------------------*/ + + improv_amr_wb_gs( amr_io_class, st->coder_type, st->core_brate, &st->hGSCDec->seed_tcx, st->hAmrwb_IO->old_Aq, st->mem_syn2, st->hAmrwb_IO->lt_voice_fac, locattack, Aq, exc2, mem_tmp, syn, pitch_buf, st->hAmrwb_IO->Last_ener, st->rate_switching_reset, st->last_coder_type, 0 ); + + for ( i = 0; i < DCT_L_POST; i++ ) + { + st->hMusicPF->filt_lfE[i] = 0.3f + 0.7f * st->hMusicPF->filt_lfE[i]; + } + } + + /*------------------------------------------------------------* + * FEC - Estimate pitch + *------------------------------------------------------------*/ + + FEC_pitch_estim( 1, st->last_core, L_FRAME, st->clas_dec, st->last_good, pitch_buf, st->old_pitch_buf, &st->bfi_pitch, &st->bfi_pitch_frame, &st->upd_cnt, GENERIC ); + + /*------------------------------------------------------------* + * FEC - Smooth the speech energy evolution when recovering after a BAD frame + * (smoothing is performed in the excitation domain and signal is resynthesized after) + *------------------------------------------------------------*/ + + FEC_scale_syn( L_FRAME, st->clas_dec, st->last_good, syn, pitch_buf, st->enr_old, enr_q, -1, MOVING_AVERAGE, &st->scaling_flag, &st->lp_ener_FEC_av, &st->lp_ener_FEC_max, st->bfi, st->total_brate, st->prev_bfi, st->last_core_brate, exc, exc2, Aq, &st->old_enr_LP, mem_tmp, st->mem_syn2, st->last_con_tcx && ( st->L_frameTCX_past != st->L_frame ) && ( st->last_core != ACELP_CORE ), 0 ); + + /* estimate the pitch-synchronous speech energy per sample to be used when normal operation recovers */ + fer_energy( L_FRAME, st->clas_dec, syn, pitch_buf[3], &st->enr_old, L_FRAME ); + } + + } /* End of GOOD FRAME */ + + /*----------------------------------------------------------------* + * BAD frame + *----------------------------------------------------------------*/ + + else + { + /* long burst frame erasures */ + if ( st->nbLostCmpt > 5 && st->clas_dec >= VOICED_CLAS ) + { + st->last_good = VOICED_TRANSITION; + } + + vad_flag = st->last_vad; + amr_io_class = st->last_good; + class_para = 0.0f; + + /* LSF estimation and A(z) calculation */ + lsf_dec_bfi( MODE1, lsf_new, st->lsf_old, st->lsf_adaptive_mean, NULL, st->mem_MA, st->mem_AR, st->stab_fac, st->last_coder_type, L_FRAME, st->last_good, st->nbLostCmpt, 0, NULL, NULL, NULL, st->hGSCDec->Last_GSC_pit_band_idx, st->Opt_AMR_WB, st->bwidth ); + + FEC_lsf2lsp_interp( st, L_FRAME, Aq, lsf_new, lsp_new ); + + /* calculation of excitation signal */ + FEC_exc_estim( st, L_FRAME, exc, exc2, tmp_buffer, pitch_buf, voice_factors, &FEC_pitch, dummy_buf, lsf_new, &tmp_noise ); + + /* synthesis for ACELP core switching and SWB BWE */ + syn_12k8( L_FRAME, Aq, exc, tmp_buffer, st->mem_syn1, 1 ); + + /* update past excitation signals */ + mvr2r( st->hMusicPF->dct_post_old_exc + L_FRAME, st->hMusicPF->dct_post_old_exc, DCT_L_POST - L_FRAME - OFFSET2 ); + mvr2r( exc2, st->hMusicPF->dct_post_old_exc + ( DCT_L_POST - L_FRAME - OFFSET2 ), L_FRAME ); + + /* Update music post processing values */ + /* Update circular buffer, keep last energy difference unchanged */ + for ( i = 1; i < MAX_LT; i++ ) + { + st->hMusicPF->LDm_lt_diff_etot[i - 1] = st->hMusicPF->LDm_lt_diff_etot[i]; + } + /* Filter energies update */ + for ( i = 0; i < DCT_L_POST; i++ ) + { + st->hMusicPF->filt_lfE[i] = 0.3f + 0.7f * st->hMusicPF->filt_lfE[i]; + } + + /* synthesis at 12k8 Hz sampling rate */ + mvr2r( st->mem_syn2, mem_tmp, M ); + syn_12k8( L_FRAME, Aq, exc2, syn, st->mem_syn2, 1 ); + + /* update old synthesis for classification */ + mvr2r( syn + L_FRAME - L_SYN_MEM_CLAS_ESTIM, st->mem_syn_clas_estim, L_SYN_MEM_CLAS_ESTIM ); + + + /*------------------------------------------------------------* + * FEC - Smooth the speech energy evolution when recovering after a BAD frame + * (smoothing is performed in the excitation domain and signal is resynthesized after) + *------------------------------------------------------------*/ + + FEC_scale_syn( L_FRAME, st->clas_dec, st->last_good, syn, pitch_buf, st->enr_old, enr_q, -1, MOVING_AVERAGE, &st->scaling_flag, &st->lp_ener_FEC_av, &st->lp_ener_FEC_max, st->bfi, st->total_brate, st->prev_bfi, st->last_core_brate, exc, exc2, Aq, &st->old_enr_LP, mem_tmp, st->mem_syn2, 0, 0 ); + + /* estimate the pitch-synchronous speech energy per sample to be used when normal operation recovers */ + fer_energy( L_FRAME, st->last_good, syn, FEC_pitch, &st->enr_old, L_FRAME ); + } + + /*--------------------------------------------------------* + * NB post-filter + *--------------------------------------------------------*/ + + if ( output_frame == L_FRAME8k || st->last_bwidth == NB ) + { + if ( output_frame == L_FRAME8k ) + { + st->hPFstat->on = 1; + nb_post_filt( L_FRAME, L_SUBFR, st->hPFstat, &st->psf_lp_noise, tmp_noise, syn, Aq, pitch_buf, st->coder_type, st->BER_detect, 0 ); + } + else + { + st->hPFstat->on = 0; + nb_post_filt( L_FRAME, L_SUBFR, st->hPFstat, &st->psf_lp_noise, tmp_noise, syn, Aq, pitch_buf, AUDIO, st->BER_detect, 0 ); + } + } + + /*------------------------------------------------------------------* + * Perform fixed deemphasis through 1/(1 - g*z^-1) + *-----------------------------------------------------------------*/ + + /* update old synthesis buffer - needed for ACELP internal sampling rate switching */ + mvr2r( syn + L_FRAME - L_SYN_MEM, st->mem_syn_r, L_SYN_MEM ); + + + deemph( syn, PREEMPH_FAC, L_FRAME, &( st->mem_deemph ) ); + AGC_dec( syn, st->agc_mem2, L_FRAME ); + if ( st->hTcxDec != NULL ) + { + mvr2r( syn + L_FRAME / 2, st->hTcxDec->old_syn_Overl, L_FRAME / 2 ); + } + mvr2r( syn + L_FRAME - M - 1, st->syn, M + 1 ); + + /*------------------------------------------------------------------* + * Formant post-filter + *-----------------------------------------------------------------*/ + + mvr2r( syn, tmp_buffer + L_SYN_MEM, L_FRAME ); + + if ( output_frame != L_FRAME8k && st->last_bwidth != NB ) + { + st->hPFstat->on = 1; + formant_post_filt( st->hPFstat, tmp_buffer + L_SYN_MEM, Aq, syn, L_FRAME, L_SUBFR, st->psf_lp_noise, st->total_brate, amr_io_class == AUDIO_CLAS ); + } + + /*----------------------------------------------------------------* + * Comfort Noise Addition + *----------------------------------------------------------------*/ + + flag_cna = 0; + if ( st->psf_lp_noise >= 15.f || st->coder_type == INACTIVE ) + { + /*VAD only for non inactive frame*/ + st->VAD = ( st->VAD && ( st->coder_type != INACTIVE ) ); + + ApplyFdCng( syn, NULL, NULL, NULL, st, 0, 0 ); + + st->hFdCngDec->hFdCngCom->frame_type_previous = st->m_frame_type; + + /*Noisy speech detector*/ + noisy_speech_detection( st->hFdCngDec, st->VAD, syn ); + + st->hFdCngDec->hFdCngCom->likelihood_noisy_speech = 0.99f * st->hFdCngDec->hFdCngCom->likelihood_noisy_speech + 0.01f * (float) st->hFdCngDec->hFdCngCom->flag_noisy_speech; + st->lp_noise = st->hFdCngDec->lp_noise; + + if ( st->flag_cna && ( st->psf_lp_noise >= 15.f ) ) + { + flag_cna = 1; + generate_masking_noise( syn, st->hFdCngDec->hFdCngCom, st->hFdCngDec->hFdCngCom->frameSize, AMR_WB_CORE, 0, 0, st->element_mode, NULL, -1 ); + } + else if ( st->flag_cna ) + { + generate_masking_noise_update_seed( st->hFdCngDec->hFdCngCom ); + } + } + else if ( st->flag_cna ) + { + generate_masking_noise_update_seed( st->hFdCngDec->hFdCngCom ); + } + + if ( flag_cna == 0 ) + { + if ( st->last_flag_cna == 1 && ( ( st->last_core == ACELP_CORE && st->last_coder_type != AUDIO ) || st->last_core == AMR_WB_CORE ) ) + { + v_multc( st->hFdCngDec->hFdCngCom->olapBufferSynth2 + 5 * L_FRAME / 4, 256.f, tmp_buffer, L_FRAME / 2 ); + v_add( tmp_buffer, syn, syn, L_FRAME / 2 ); + } + set_f( st->hFdCngDec->hFdCngCom->olapBufferSynth2, 0.f, L_FRAME * 2 ); + } + + /*----------------------------------------------------------------* + * Change the sampling frequency to 8/16/32 kHz + * Bass post-filter + *----------------------------------------------------------------*/ + + /* check if the cldfb works on the right sample rate */ + if ( ( st->cldfbAna->no_channels * st->cldfbAna->no_col ) != L_FRAME ) + { + /* resample to ACELP internal sampling rate */ + resampleCldfb( st->cldfbAna, INT_FS_12k8 ); + resampleCldfb( st->cldfbBPF, INT_FS_12k8 ); + + if ( st->ini_frame > 0 ) + { + st->cldfbSyn->bandsToZero = st->cldfbSyn->no_channels - st->cldfbAna->no_channels; + } + } + + /* bass post-filter */ + bass_psfilter( st->hBPF, st->Opt_AMR_WB, syn, L_FRAME, pitch_buf, st->bpf_off, st->stab_fac, &st->stab_fac_smooth, GENERIC, bpf_error_signal ); + + /* analysis of the synthesis at internal sampling rate */ + cldfbAnalysis( syn, realBuffer, imagBuffer, -1, st->cldfbAna ); + + /* analysis and add the BPF error signal */ + addBassPostFilter( bpf_error_signal, st->bpf_off ? 0 : -1, realBuffer, imagBuffer, st->cldfbBPF ); + + if ( st->cldfbSyn->bandsToZero != st->cldfbSyn->no_channels - st->cldfbAna->no_channels ) + { + /* in case of BW switching, re-init to default */ + st->cldfbSyn->bandsToZero = st->cldfbSyn->no_channels - st->cldfbAna->no_channels; + } + + cldfb_synth_set_bandsToZero( st, realBuffer, imagBuffer, CLDFB_NO_COL_MAX ); + + /* synthesis of the combined signal */ + cldfbSynthesis( realBuffer, imagBuffer, synth_out, -1, st->cldfbSyn ); + + /* save synthesis - needed in case of core switching */ + mvr2r( synth_out, st->previoussynth, output_frame ); + + /*--------------------------------------------------------* + * calculate the average frame energy + *--------------------------------------------------------*/ + + fer_energy( L_FRAME, st->clas_dec, syn, pitch_buf[3], &ng_ener, L_FRAME ); + + /*--------------------------------------------------------* + * optimized for NO_S@-26dBov with street noise @ SNR=25dB + *--------------------------------------------------------*/ + + ng_ener = 10.0f * (float) log10( ng_ener + 0.01f ) - 90.3087f + 15; + st->ng_ener_ST = 0.7f * st->ng_ener_ST + 0.3f * ng_ener; + + /*-----------------------------------------------------------------* + * Bandwidth extension 6kHz-8kHz + *-----------------------------------------------------------------*/ + + if ( output_frame >= L_FRAME16k && ( ( st->cldfbSyn->bandsToZero - st->cldfbSyn->no_channels + 10 ) != 0 || st->last_flag_filter_NB != 1 ) ) + { + hf_synth_amr_wb( st->hAmrwb_IO, st->hBWE_zero, st->core_brate, output_frame, Aq, exc2, syn, &amr_io_class, synth_out, class_para, hf_gain, voice_factors, pitch_buf, st->ng_ener_ST, lsf_new ); + } + else + { + hf_synth_amr_wb_reset( st->hAmrwb_IO, st->hBWE_zero ); + } + + /*----------------------------------------------------------------------* + * Updates + *----------------------------------------------------------------------*/ + + updt_dec( st, old_exc, pitch_buf, 0, Aq, lsf_new, lsp_new, voice_factors, dummy_buf, gain_buf ); + + /* update old_Aq[] - needed in improv_amr_wb_gs_fx() */ + mvr2r( Aq, st->hAmrwb_IO->old_Aq, NB_SUBFR * ( M + 1 ) ); + + if ( !st->bfi && st->prev_bfi && st->last_total_brate >= HQ_48k && st->last_codec_mode == MODE2 && ( st->last_core_bfi == TCX_20_CORE || st->last_core_bfi == TCX_10_CORE ) && st->hPlcInfo->concealment_method == TCX_NONTONAL && st->hPlcInfo->nbLostCmpt < 4 ) + { + waveadj_rec = 1; + } + + st->last_vad = vad_flag; + + /* Update main codec parameters */ + updt_dec_common( st, -1, -1, NULL ); + + /*----------------------------------------------------------------* + * Overlap of ACELP synthesis with old MDCT memory + *----------------------------------------------------------------*/ + + if ( st->bfi ) + { + /* calculate another loss frame to fill gap in case of switching frame loss */ + if ( ( error = acelp_core_switch_dec_bfi( st ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + delay_comp = NS2SA( st->output_Fs, DELAY_CLDFB_NS ); + if ( last_core_ori == HQ_CORE ) + { + nZeros = (int16_t) ( NS2SA( st->output_Fs, N_ZERO_MDCT_NS ) ); + + if ( st->prev_bfi && st->hHQ_core->HqVoicing ) + { + mvr2r( st->hHQ_core->fer_samples, st->hHQ_core->old_out + nZeros, NS2SA( st->output_Fs, 6000000 ) ); + } + + /* copy the HQ/ACELP delay synchroniation buffer to the beginning of ACELP frame */ + mvr2r( st->delay_buf_out, synth_out, delay_comp ); + + tmp = 1.0f / (float) NS2SA( st->output_Fs, 6000000 ); + for ( i = 0; i < NS2SA( st->output_Fs, 6000000 ); i++ ) + { + synth_out[i + delay_comp] = ( 1 - tmp * (float) i ) * st->hHQ_core->old_out[i + nZeros] + tmp * (float) i * synth_out[i + delay_comp]; + } + } + + /*----------------------------------------------------------------* + * HP filtering + * Final synthesis output + *----------------------------------------------------------------*/ + + /* Delay ACELP synthesis by DELAY_BWE_TOTAL_NS - DELAY_CLDFB_NS delay */ + if ( output_frame >= L_FRAME16k ) + { + tmps = NS2SA( st->output_Fs, DELAY_BWE_TOTAL_NS - DELAY_CLDFB_NS ); + delay_signal( synth_out, output_frame, st->prev_synth_buffer, tmps ); + } + + if ( waveadj_rec ) + { + tmps = 0; + if ( output_frame >= L_FRAME16k ) + { + tmps = NS2SA( st->output_Fs, DELAY_BWE_TOTAL_NS ); + } + waveform_adj2( st->hPlcInfo, st->hTonalMDCTConc->secondLastPcmOut, synth_out + tmps, tmps, st->hPlcInfo->nbLostCmpt + 1, st->bfi ); + } + + /* HP filter */ + hp20( synth_out, output_frame, mem_hp20_out, st->output_Fs ); + + /* save synthesis for core switching */ + mvr2r( synth_out + NS2SA( st->output_Fs, ACELP_LOOK_NS + DELAY_BWE_TOTAL_NS ), st->old_synth_sw, NS2SA( st->output_Fs, FRAME_SIZE_NS - ACELP_LOOK_NS - DELAY_BWE_TOTAL_NS ) ); + + /* TCX-LTP Postfilter: used in AMR-WB IO to update memories and to avoid discontinuities when the past frame was TCX */ + tcx_ltp_post( st, hTcxLtpDec, ACELP_CORE, output_frame, 0, synth_out, NULL ); + + /* final output of synthesis signal */ + mvr2r( synth_out, output, output_frame ); + + + return error; +} + + +/*------------------------------------------------------------------* + * amr_wb_dec_init() + * + * AMR-WB decoder initialization + *------------------------------------------------------------------*/ + +void amr_wb_dec_init( + AMRWB_IO_DEC_HANDLE hAmrwb_IO /* i/o: AMR-WB IO data handle */ +) +{ + /* gain quantization memory (used in AMR-WB IO mode) */ + set_f( hAmrwb_IO->past_qua_en, -14.0f, GAIN_PRED_ORDER ); + + /* Improvement of unvoiced and audio signals in AMR-WB IO mode */ + hAmrwb_IO->UV_cnt = 30; + hAmrwb_IO->LT_UV_cnt = 60.0f; + set_f( hAmrwb_IO->lt_diff_etot, 0, MAX_LT ); + hAmrwb_IO->Last_ener = 0.0f; + + set_f( hAmrwb_IO->old_Aq, 0, NB_SUBFR * ( M + 1 ) ); + hAmrwb_IO->old_Aq[0] = 1.0f; + hAmrwb_IO->old_Aq[M + 1] = 1.0f; + hAmrwb_IO->old_Aq[2 * ( M + 1 )] = 1.0f; + hAmrwb_IO->old_Aq[3 * ( M + 1 )] = 1.0f; + + hAmrwb_IO->lt_voice_fac = 0.0f; + + return; +} diff --git a/lib_dec/ari_dec.c b/lib_dec/ari_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..31df466f009d2106ae5d5356b9e2351c26af812f --- /dev/null +++ b/lib_dec/ari_dec.c @@ -0,0 +1,666 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include "options.h" +#include "cnst.h" +#include "prot.h" +#include "stat_com.h" +#include "basop_util.h" +#include "wmc_auto.h" + + +/*--------------------------------------------------------------- + * Ari decode 14 bits routines + -------------------------------------------------------------*/ + +/*--------------------------------------------------------------- + * ari_start_decoding_14bits() + * + * Start ArCo decoding + *-------------------------------------------------------------*/ + +void ari_start_decoding_14bits( + Decoder_State *st, + Tastat *s ) +{ + uint32_t val; + + val = get_next_indice( st, cbitsnew ); + + s->low = 0; + s->high = ari_q4new; + s->value = val; + + return; +} + +/*--------------------------------------------------------------- + * ari_start_decoding_14bits_prm() + * + * Start ArCo decoding + *-------------------------------------------------------------*/ + +int16_t ari_start_decoding_14bits_prm( + const int16_t *ptr, + int16_t bp, + Tastat *s ) +{ + int32_t val; + int16_t i; + const int16_t *p; + + val = 0; + p = ptr + bp; + for ( i = 0; i < cbitsnew; i++ ) + { + val = ( val << 1 ) | *( p + i ); + } + + s->low = 0; + s->high = ari_q4new; + s->value = val; + + bp = bp + i; + + return bp; +} + +/*--------------------------------------------------------------- + * ari_decode_14bits_s17_ext() + * + * Only for 17 symbols with new extended Tables: + * based on tri's optimization + * based on extended Tables which need less branches for coding + *-------------------------------------------------------------*/ + +void ari_decode_14bits_s17_ext( + Decoder_State *st, + uint16_t *res, + Tastat *s, + const uint16_t *cum_freq ) +{ + uint16_t symbol; + int32_t low, high; + uint32_t range, value, cum; + const uint16_t *p; + + /* read s->low,high,value sequentially */ + low = s->low; + high = s->high; + value = s->value; + + range = high - low + 1; /* keep: tmp=low-1 */ + cum = ( ( ( (uint32_t) ( value - low + 1 ) ) << stat_bitsnew ) - ( (uint32_t) 1 ) ); + + p = cum_freq; + + /* Note: For each indirect addressing p[i], we assume a tmp pointer init followed by a costfree reading the value */ + /* If the value multiplied by range is greater than cum, the pointer p is set to the tmp pointer */ + /* tmp_p = p+8; if (tmp_p[0]*range>cum) p = tmp_p; */ + + if ( p[8] * range > cum ) + { + p += 8; + } + /* */ + if ( p[4] * range > cum ) + { + p += 4; + } + /* */ + if ( p[2] * range > cum ) + { + p += 2; + } + /* */ + if ( p[1] * range > cum ) + { + p += 1; + if ( ( p == cum_freq + 15 ) && ( p[1] * range > cum ) ) + { + p += 1; + } + } + + symbol = (uint16_t) ( p - cum_freq ); + + high = low + mul_sbc_14bits( range, cum_freq[symbol] ) - 1; + low += mul_sbc_14bits( range, cum_freq[symbol + 1] ); + + for ( ;; ) + { + if ( high >= ari_q2new ) + { + if ( low >= ari_q2new ) + { + value -= ari_q2new; + low -= ari_q2new; + high -= ari_q2new; + } + else + { + if ( low >= ari_q1new && high < ari_q3new ) + { + value -= ari_q1new; + low -= ari_q1new; + high -= ari_q1new; + } + else + { + break; + } + } + } + low += low; + high += high + 1; + + value = ( value << 1 ) | get_next_indice_1( st ); + } + + s->low = low; + s->high = high; + s->value = value; + + *res = symbol; + + return; +} + + +/*--------------------------------------------------------------- + * ari_decode_14bits_s27_ext() + * + * Only for 17 symbols with new extended Tables: + * based on tri's optimization + * based on extended Tables which need less branches for coding + * copied from ari_decode_14bits_s17_ext, with changes marked + *-------------------------------------------------------------*/ + +void ari_decode_14bits_s27_ext( + Decoder_State *st, + uint16_t *res, + Tastat *s, + const uint16_t *cum_freq ) +{ + uint16_t symbol; + int32_t low, high; + uint32_t range, value, cum; + uint16_t il, ih, im; + + /* read s->low,high,value sequentially */ + low = s->low; + high = s->high; + value = s->value; + + range = high - low + 1; /* keep: tmp=low-1 */ + cum = ( ( ( (uint32_t) ( value - low + 1 ) ) << stat_bitsnew ) - ( (uint32_t) 1 ) ); + + + /* Note: For each indirect addressing p[i], we assume a tmp pointer init followed by a costfree reading the value */ + /* If the value multiplied by range is greater than cum, the pointer p is set to the tmp pointer */ + /* tmp_p = p+8; if (tmp_p[0]*range>cum) p = tmp_p; */ + + /* begin change when compared with ari_decode_14bits_s17_ext, + starting with line: if (p[8] * range > cum) { */ + il = 0; + ih = 27; + + /* do a five step binary search, using the interval [il, ih) */ + im = 13; /* (il + ih) >> 1 */ + if ( cum_freq[im] * range > cum ) + { + il = im; + } + else + { + ih = im; + } + + im = ( il + ih ) >> 1; + if ( cum_freq[im] * range > cum ) + { + il = im; + } + else + { + ih = im; + } + + im = ( il + ih ) >> 1; + if ( cum_freq[im] * range > cum ) + { + il = im; + } + else + { + ih = im; + } + + im = ( il + ih ) >> 1; + if ( cum_freq[im] * range > cum ) + { + il = im; + } + else + { + ih = im; + } + + if ( ih - il > 1 ) /* if the interval has more than one symbol */ + { + /* here, only ih == il + 2 is possible, which means two symbols in the interval */ + im = il + 1; /* (il + ih) >> 1 */ + if ( cum_freq[im] * range > cum ) + { + il = im; + } + } + + symbol = il; + /* end change when compared with ari_decode_14bits_s17_ext, + ending with line: symbol = p - cum_freq; */ + + high = low + mul_sbc_14bits( range, cum_freq[symbol] ) - 1; + low += mul_sbc_14bits( range, cum_freq[symbol + 1] ); + + for ( ;; ) + { + if ( high >= ari_q2new ) + { + if ( low >= ari_q2new ) + { + value -= ari_q2new; + low -= ari_q2new; + high -= ari_q2new; + } + else + { + if ( low >= ari_q1new && high < ari_q3new ) + { + value -= ari_q1new; + low -= ari_q1new; + high -= ari_q1new; + } + else + { + break; + } + } + } + low += low; + high += high + 1; + + value = ( value << 1 ) | get_next_indice_1( st ); + } + + s->low = low; + s->high = high; + s->value = value; + + *res = symbol; + + return; +} + + +/*--------------------------------------------------------------- + * ari_decode_14bits_bit_ext() + * + * Only for decoding one bit with uniform probability: + * based on tri's optimization + * copied from ari_decode_14bits_s17_ext, with changes marked + * the equivalent cum_freq table used is {16384, 8192, 0} + *-------------------------------------------------------------*/ + +void ari_decode_14bits_bit_ext( + Decoder_State *st, + uint16_t *res, + Tastat *s ) +{ + uint16_t symbol; + int32_t low, high; + uint32_t range, value, cum; + + /* read s->low,high,value sequentially */ + low = s->low; + high = s->high; + value = s->value; + + range = high - low + 1; /* keep: tmp=low-1 */ + cum = ( ( ( (uint32_t) ( value - low + 1 ) ) << stat_bitsnew ) - ( (uint32_t) 1 ) ); + + + /* Note: For each indirect addressing p[i], we assume a tmp pointer init followed by a costfree reading the value */ + /* If the value multiplied by range is greater than cum, the pointer p is set to the tmp pointer */ + /* tmp_p = p+8; if (tmp_p[0]*range>cum) p = tmp_p; */ + + /* begin change when compared with ari_decode_14bits_s17_ext, + starting with line: if (p[8] * range > cum) { */ + symbol = 0; + + if ( ( range << 13 ) > cum ) + { + symbol = 1; + } + + if ( symbol == 0 ) + { + /* high is unchanged */ + low = low + ( range >> 1 ); + } + else + { + high = low + ( range >> 1 ) - 1; + /* low is unchanged */ + } + /* end change when compared with ari_decode_14bits_s17_ext, + ending with line: low += mul_sbc_14bits(range, cum_freq[symbol + 1]); */ + + + for ( ;; ) + { + if ( high >= ari_q2new ) + { + if ( low >= ari_q2new ) + { + value -= ari_q2new; + low -= ari_q2new; + high -= ari_q2new; + } + else + { + if ( low >= ari_q1new && high < ari_q3new ) + { + value -= ari_q1new; + low -= ari_q1new; + high -= ari_q1new; + } + else + { + break; + } + } + } + low += low; + high += high + 1; + + value = ( value << 1 ) | get_next_indice_1( st ); + } + + s->low = low; + s->high = high; + s->value = value; + + *res = symbol; + + return; +} + +/*------------------------------------------------------------------------ + * Function: ari_decode_14bits_pow() + * + * Decode a symbol which follows the exponential distribution. That is, + * symbols are in the following intervals + * + * p(x = 0) = 1 - exp(- 0.5 * base * 2) + * p(x = q>0) = exp(- (q-0.5)*base* 2) - exp(- (q+0.5)*base*2 ) + * + *-------------------------------------------------------------------------*/ + +int16_t ari_decode_14bits_pow( + const int16_t *ptr, + int16_t bp, + int16_t bits, + int16_t *res, + Tastat *s, + uint16_t base ) +{ + uint16_t symbol; + int32_t low, high; + uint32_t range, value, cum; + Word16 pows[12]; /* "base" to the power of 2, 4, 8,... 2^12 */ + Word16 lowlim, highlim = 0, testval; + int16_t k; + + low = s->low; + high = s->high + 1; + value = s->value; + lowlim = 0; + symbol = 0; + + range = high - low; + + /* the value read from bitstream */ + assert( value >= (uint32_t) low ); + cum = ( ( ( (uint32_t) ( value - low ) ) << stat_bitsnew ) + ( 1 << stat_bitsnew ) - 1 ); + + /* search for the interval where "cum" fits */ + if ( ( ( base >> 1 ) * range ) > cum ) /* below pow-1 */ + { + pows[0] = testval = base; + /* increase exponent until it is smaller than "cum" */ + for ( k = 1; k < 12; k++ ) + { + highlim = testval; + pows[k] = mult_r( pows[k - 1], pows[k - 1] ); + move16(); + testval = mult_r( pows[k], base ); + if ( ( ( testval >> 1 ) * range ) <= cum ) /* found! big range is [lowlim,testval], (now narrow it down) */ + { + lowlim = testval; + k--; + symbol = 1 << k; + break; + } + } + assert( k < 12 ); /* maximum 2^10-1*/ + /* narrow the range down */ + for ( k--; k > 0; k-- ) + { + testval = mult_r( highlim, pows[k] ); + if ( ( ( testval >> 1 ) * range ) <= cum ) + { + lowlim = testval; + symbol -= 1 << ( k - 1 ); + } + else + { + highlim = testval; + } + } + highlim >>= 1; + lowlim >>= 1; + } + else /* trivial case, above pow-1, that is, first symbol */ + { + symbol = 0; + lowlim = base >> 1; + highlim = 16384; + } + + + high = low + mul_sbc_14bits( range, highlim ); + + low += mul_sbc_14bits( range, lowlim ); + + /*ptr init for ptr*/ + for ( ; bp < bits; ) + { + if ( high > ari_q2new ) + { + if ( low >= ari_q2new ) + { + value -= ari_q2new; + low -= ari_q2new; + high -= ari_q2new; + } + else + { + if ( low >= ari_q1new && high <= ari_q3new ) + { + value -= ari_q1new; + low -= ari_q1new; + high -= ari_q1new; + } + else + { + break; + } + } + } + low += low; + high += high; + + assert( abs( ptr[bp] ) <= 1 && "AC expects reading binary values!!!" ); + + value = ( value << 1 ) | ptr[bp++]; + } + + if ( !( bp != bits || !( ( s->low == low ) && ( s->high == high ) && ( s->value == value ) ) ) ) + { + /* This should not happen except of bit errors. */ + s->high = s->low = 0; + *res = 0; + return -1; + } + + s->low = low; + s->high = high - 1; + s->value = value; + + *res = symbol; + + return bp; +} + + +/*------------------------------------------------------------------------ + * Function: ari_decode_14bits_sign() + * + * Decode a sign with equal probabilities. + *-------------------------------------------------------------------------*/ + +int16_t ari_decode_14bits_sign( + const int16_t *ptr, + int16_t bp, + int16_t bits, + uint16_t *res, + Tastat *s ) +{ + uint16_t symbol; + int32_t low, high; + uint32_t range, value, cum; + + low = s->low; + high = s->high + 1; + value = s->value; + + range = high - low; + + if ( bp < bits ) + { + assert( value >= (uint32_t) low ); + cum = ( ( ( (uint32_t) ( value - low ) ) << stat_bitsnew ) + ( 1 << stat_bitsnew ) - 1 ); + if ( 8192 * range > cum ) + { + symbol = 2; + high = low + ( range >> 1 ); + } + else + { + symbol = 1; + low += range >> 1; + } + + /*ptr init for ptr*/ + for ( ; bp < bits; ) + { + if ( high > ari_q2new ) + { + if ( low >= ari_q2new ) + { + value -= ari_q2new; + low -= ari_q2new; + high -= ari_q2new; + } + else + { + if ( low >= ari_q1new && high <= ari_q3new ) + { + value -= ari_q1new; + low -= ari_q1new; + high -= ari_q1new; + } + else + { + break; + } + } + } + low += low; + high += high; + + assert( abs( ptr[bp] ) <= 1 && "AC expects reading binary values!!!" ); + + value = ( value << 1 ) | ptr[bp++]; + } + } + else + { + cum = value - low; + range >>= 1; + if ( range > cum ) + { + symbol = 2; + high = low + range; + } + else + { + symbol = 1; + low += range; + } + } + + s->low = low; + s->high = high - 1; + s->value = value; + + *res = symbol; + + return bp; +} diff --git a/lib_dec/ari_hm_dec.c b/lib_dec/ari_hm_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..3ba6a886fb4468278c9b4809bdcb585c2f50070f --- /dev/null +++ b/lib_dec/ari_hm_dec.c @@ -0,0 +1,168 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include "options.h" +#include "cnst.h" +#include "stl.h" +#include "basop_util.h" +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * DecodeIndex() + * + * + *-------------------------------------------------------------------*/ + +int16_t DecodeIndex( + Decoder_State *st, + const int16_t Bandwidth, + int16_t *PeriodicityIndex ) +{ + TCX_LTP_DEC_HANDLE hTcxLtpDec = st->hTcxLtpDec; + TCX_DEC_HANDLE hTcxDec = st->hTcxDec; + + if ( ( hTcxDec->tcx_hm_LtpPitchLag > 0 ) && ( hTcxLtpDec->tcxltp_gain > kLtpHmGainThr ) ) + { + int16_t LtpPitchIndex = ( ( hTcxDec->tcx_hm_LtpPitchLag + ( 1 << ( kLtpHmFractionalResolution - 1 ) ) ) >> kLtpHmFractionalResolution ) - 2; + *PeriodicityIndex = kLtpHmFlag; + *PeriodicityIndex |= get_next_indice( st, NumRatioBits[Bandwidth][LtpPitchIndex] ); + ++*PeriodicityIndex; + *PeriodicityIndex |= LtpPitchIndex << 9; + + return NumRatioBits[Bandwidth][LtpPitchIndex]; + } + else + { + *PeriodicityIndex = get_next_indice( st, 8 ); + + return 8; + } +} + + +/*-------------------------------------------------------------------* + * tcx_hm_dequantize_gain() + * + * + *-------------------------------------------------------------------*/ + +static int16_t tcx_hm_dequantize_gain( + const int16_t coder_type, /* i : GC/VC coder type */ + const int16_t gain_idx, /* i : quantization index */ + Word16 *gain /* o : dequantized gain (Q11) */ +) +{ + assert( 0 <= coder_type && coder_type <= UNVOICED ); + + /* safety check in case of bit errors */ + if ( !( 0 <= gain_idx && gain_idx < ( 1 << kTcxHmNumGainBits ) ) ) + { + *gain = 0; + return 1; + } + + *gain = qGains[coder_type][gain_idx]; + + return 0; +} + + +/*-------------------------------------------------------------------* + * tcx_hm_decode() + * + * + *-------------------------------------------------------------------*/ + +void tcx_hm_decode( + const int16_t L_frame, /* i : number of spectral lines */ + Word32 env[], /* i/o: envelope shape (Q16) */ + const int16_t targetBits, /* i : target bit budget */ + const int16_t coder_type, /* i : GC/VC coder type */ + const int16_t prm_hm[], /* i : HM parameters */ + const int16_t LtpPitchLag, /* i : LTP pitch lag or -1 if none */ + int16_t *hm_bits /* o : bit consumption */ +) +{ + int16_t lag; + int32_t tmpL; + int16_t NumTargetBits, fract_res; + Word16 p[2 * kTcxHmParabolaHalfWidth + 1], gain; + + *hm_bits = 0; + + if ( !( coder_type == VOICED || coder_type == GENERIC ) ) + { + /* A bit error was encountered */ + *hm_bits = -1; + return; + } + + NumTargetBits = CountIndexBits( L_frame >= 256, prm_hm[1] ) + targetBits; + + if ( coder_type == VOICED ) + { + NumTargetBits += kTcxHmNumGainBits; + } + *hm_bits = NumTargetBits - targetBits + 1; + + /* Convert the index to lag */ + UnmapIndex( prm_hm[1], L_frame >= 256, LtpPitchLag, ( NumTargetBits <= kSmallerLagsTargetBitsThreshold ) || ( L_frame < 256 ), &fract_res, &tmpL ); + lag = (int16_t) tmpL; + + /* Render the harmonic model */ + if ( tcx_hm_render( lag, fract_res, p ) ) + { + /* A bit error was encountered */ + *hm_bits = -1; + return; + } + + /* Dequantize gain */ + + if ( tcx_hm_dequantize_gain( coder_type == VOICED, prm_hm[2], &gain ) ) + { + /* A bit error was encountered */ + *hm_bits = -1; + return; + } + tcx_hm_modify_envelope( gain, lag, fract_res, p, env, L_frame ); + + return; +} diff --git a/lib_dec/arith_coder_dec.c b/lib_dec/arith_coder_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..82f35846c076109b6ede8c92e99b8a41802199db --- /dev/null +++ b/lib_dec/arith_coder_dec.c @@ -0,0 +1,221 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include "options.h" +#include "cnst.h" +#include "prot.h" +#include "rom_com.h" +#include "basop_util.h" +#include "basop_proto_func.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------* + * tcx_arith_decode() + * + * + *-------------------------------------------------------*/ + +/*! r: number of bits consumed */ +static int16_t tcx_arith_decode( + const int16_t L_frame, /* i : number of spectral lines */ + const Word16 envelope[], /* i : scaled envelope (Q15-e) */ + Word16 envelope_e, /* i : scaled envelope exponent (Q0) */ + const int16_t target_bits, /* i : target bit budget */ + const int16_t prm[], /* i : bitstream parameters */ + float q_spectrum[] /* o : scalar quantized spectrum */ +) +{ + int16_t bp, k, q; + uint16_t s; + Tastat as; + uint16_t exp_k; + Word16 tmp; + + bp = ari_start_decoding_14bits_prm( prm, 0, &as ); + tmp = sub( envelope_e, 1 ); + + for ( k = 0; k < L_frame; ++k ) + { + if ( envelope[k] == 0 ) /* safety check in case of bit errors */ + { + set_zero( q_spectrum, L_frame ); + + return -1; + } + else + { + exp_k = expfp( negate( envelope[k] ), tmp ); + } + + /* decode line magnitude */ + bp = ari_decode_14bits_pow( prm, bp, target_bits, &q, &as, exp_k ); + + if ( q ) + { + /* line is non-zero, decode sign */ + bp = ari_decode_14bits_sign( prm, bp, target_bits, &s, &as ); + q_spectrum[k] = (float) q * ( 3 - 2 * s ); + } + else + { + /* line is zero, no sign needed */ + q_spectrum[k] = 0.0f; + } + + if ( as.high <= as.low ) + { + if ( bp < target_bits ) /* safety check in case of bit errors */ + { + bp = -1; + } + break; /* no bits left, so exit loop */ + } + } + for ( ; k < L_frame; k++ ) + { + q_spectrum[k] = 0.0f; + } + + return bp; +} + + +/*-------------------------------------------------------* + * tcx_arith_decode_envelope() + * + * + *-------------------------------------------------------*/ + +void tcx_arith_decode_envelope( + Decoder_State *st, /* i/o: coder state */ + float q_spectrum[], /* o : quantised MDCT coefficients */ + const int16_t L_frame, /* i : frame or MDCT length */ + int16_t L_spec, /* i : length w/o BW limitation */ + const Word16 A_ind[], /* i : quantised LPC coefficients */ + const int16_t target_bits, /* i : number of available bits */ + const int16_t prm[], /* i : bitstream parameters */ + const int16_t use_hm, /* i : use HM in current frame? */ + const int16_t prm_hm[], /* i : HM parameter area */ + int16_t tcxltp_pitch, /* i : TCX LTP pitch in FD, -1 if n/a*/ + int16_t *arith_bits, /* o : bits used for ari. coding */ + int16_t *signaling_bits, /* o : bits used for signaling */ + const int16_t low_complexity /* i : low-complexity flag */ +) +{ + Word32 env[N_MAX_ARI]; /* unscaled envelope (Q16) */ + Word16 *envelope; /* scaled envelope (Q15-e) */ + Word16 envelope_e; + int16_t L_spec_core; + TCX_CONFIG_HANDLE hTcxCfg; + TCX_DEC_HANDLE hTcxDec; + int16_t k; + float gamma_w, gamma_uw; + int16_t hm_bits; + + if ( L_spec > N_MAX_ARI || ( st->element_mode == EVS_MONO && ( target_bits > ( ACELP_13k20 / FRAMES_PER_SEC ) ) ) || ( st->element_mode == IVAS_SCE && ( st->bits_frame_nominal > ( LPC_SHAPED_ARI_MAX_RATE / FRAMES_PER_SEC ) ) ) || ( st->element_mode > IVAS_SCE && ( st->bits_frame_nominal > ( LPC_SHAPED_ARI_MAX_RATE_CPE / FRAMES_PER_SEC ) ) ) || ( target_bits <= 0 ) ) + { + /* this could happen in case of bit errors */ + st->BER_detect = 1; + L_spec = N_MAX_ARI; + *signaling_bits = 0; + *arith_bits = 0; + set_zero( q_spectrum, L_frame ); + + return; + } + + hTcxCfg = st->hTcxCfg; + hTcxDec = st->hTcxDec; + *signaling_bits = 0; + + assert( hTcxDec->enableTcxLpc ); + gamma_w = 1.0f; + gamma_uw = 1.0f / st->gamma; + +#define WMC_TOOL_SKIP + tcx_arith_render_envelope( A_ind, L_frame, L_spec, FL2WORD16( hTcxCfg->preemph_fac ), FL2WORD16( gamma_w ), FL2WORD16( 0.5f * gamma_uw ), env ); +#undef WMC_TOOL_SKIP + + if ( use_hm ) + { + if ( prm_hm[0] ) + { + tcx_hm_decode( L_spec, env, target_bits, st->coder_type, prm_hm, tcxltp_pitch, &hm_bits ); + + if ( hm_bits < 0 ) + { + st->BER_detect = 1; + *signaling_bits = 0; + *arith_bits = 0; + set_zero( q_spectrum, L_frame ); + + return; + } + } + else + { + hm_bits = 1; + } + *signaling_bits += hm_bits; + } + + L_spec_core = L_spec; + if ( st->igf ) + { + L_spec_core = min( L_spec_core, st->hIGFDec->infoIGFStartLine ); + } + + envelope = (Word16 *) env; + tcx_arith_scale_envelope( L_spec, L_spec_core, env, target_bits, low_complexity, envelope, &envelope_e ); + + *arith_bits = tcx_arith_decode( L_spec, envelope, envelope_e, target_bits, prm, q_spectrum ); + + /* safety check in case of bit errors */ + if ( *arith_bits < 0 ) + { + st->BER_detect = 1; + set_zero( q_spectrum, L_frame ); + } + + for ( k = L_spec; k < L_frame; ++k ) + { + q_spectrum[k] = 0; + } + + return; +} diff --git a/lib_dec/avq_dec.c b/lib_dec/avq_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..6a7245d9d1e1e2eb2907a1fe18ae0b65393ae163 --- /dev/null +++ b/lib_dec/avq_dec.c @@ -0,0 +1,424 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "prot.h" +#include "cnst.h" +#include "wmc_auto.h" +#include + +/*-------------------------------------------------------------------* + * Local prototypes + *-------------------------------------------------------------------*/ + +static void read_cv( Decoder_State *st, uint16_t *I, int16_t *kv, int16_t nq, int16_t *nbits ); + +/*-----------------------------------------------------------------* + * AVQ_demuxdec() + * + * Demultiplex and decode subvectors using + * split algebraic vector dequantizer based on RE8 latice. + *-----------------------------------------------------------------*/ + +void AVQ_demuxdec( + Decoder_State *st, /* i/o: decoder state structure */ + int16_t xriq[], /* o : decoded subvectors [0..8*Nsv-1]*/ + int16_t *nb_bits, /* i/o: number of allocated bits */ + const int16_t Nsv, /* i : number of subvectors */ + int16_t nq[], /* i/o: AVQ nq index */ + int16_t avq_bit_sFlag, /* i : flag for AVQ bit saving solution */ + int16_t trgtSvPos /* i : target SV for AVQ bit savings */ +) +{ + int16_t i, j, bits; + uint16_t I[NSV_MAX]; + int16_t code[8]; + int16_t *kv; + int16_t nq_est, unused_bits_idx; + int16_t bitsMod; + int16_t underflow; + int16_t unusedbitsFlag; + int16_t svOrder[NSV_MAX], k, nullVec, dummy_bits; + + kv = xriq; /* reuse vector to save memory */ + bits = *nb_bits; + bitsMod = 0; + underflow = 0; + unusedbitsFlag = 0; + nullVec = 0; + dummy_bits = 0; + svOrder[Nsv - 1] = trgtSvPos; + svOrder[0] = 0; + svOrder[1] = 1; + i = 2; + j = i; + if ( avq_bit_sFlag == 2 ) + { + j = i + 1; + } + + while ( i < Nsv - 1 ) + { + svOrder[i] = j; + i++; + j++; + } + + for ( i = 0; i < NSV_MAX; i++ ) + { + I[i] = (uint16_t) -1; + } + + for ( i = 0; i < Nsv; i++ ) + { + k = svOrder[i]; + if ( avq_bit_sFlag == 2 && bits % 5 == 4 && bits > 8 && bits < 30 && k >= trgtSvPos && i < Nsv - 1 ) + { + ordr_esti( Nsv - i, &trgtSvPos, &svOrder[i], Nsv ); + k = svOrder[i]; + avq_bit_sFlag = 1; + } + + if ( k == trgtSvPos && avq_bit_sFlag > 0 ) + { + if ( ( *nb_bits - bits ) == 7 || bits < BIT_SAVING_LOW_THR || bits >= BIT_SAVING_HIGH_THR ) + { + avq_bit_sFlag = 0; + } + else + { + break; + } + } + + nq[k] = 0; /* initialization and also forced if the budget is exceeded */ + + if ( bits > 8 ) + { + /* read the unary code including the stop bit for nq[i] */ + nq[k] = -1; + do + { + ( nq[k] )++; + + if ( 5 * nq[k] + 4 == bits ) + { + break; + } + } while ( get_next_indice_1( st ) ); + + if ( 5 * nq[k] + 4 == bits ) /* check the overflow */ + { + bits++; /* overflow stop bit */ + } + + /* check for potential bit errors */ + if ( nq[k] > NB_SPHERE ) + { + st->BER_detect = 1; + set_s( xriq, 0, Nsv * 8 ); + set_s( nq, 0, Nsv ); + *nb_bits = 0; + + return; + } + + bits -= nq[k]; + bits--; /* count the stop bit */ + + if ( nq[k] > 0 ) + { + nq[k]++; + } + + /* read codebook indices (rank I and event. Voronoi index kv) */ + read_cv( st, &I[k], &kv[k * 8], nq[k], &bits ); + } + } /* for */ + + /* Bit Saving Solution */ + if ( avq_bit_sFlag > 0 && bits > 8 ) + { + i = svOrder[Nsv - 1]; + nq[i] = 0; + bitsMod = bits % 5; + if ( i != Nsv - 1 ) + { + nullVec = 0; + for ( j = i; j < Nsv - 1; j++ ) + { + if ( nq[svOrder[j]] == 0 ) + { + nullVec++; + } + } + nq_est = bits / 5; + if ( ( bitsMod > 0 || ( nullVec == 4 && nq_est == 5 ) ) && bitsMod != 4 && ( bits + nullVec ) >= 5 * nq_est + 4 && nq[svOrder[Nsv - 2]] == 0 ) /* dummy bits */ + { + dummy_bits = 5 - bitsMod; + bits = bits + dummy_bits; /* add dummy bits */ + bitsMod = 0; + } + else if ( nq_est > 4 && ( ( bitsMod == 0 && nullVec > 3 && nullVec < 6 ) || ( bitsMod == 4 && nullVec == 5 ) ) && nq[svOrder[Nsv - 2]] == 0 ) /* wasted bits 4, 5 for nq 6,7..*/ + { + underflow = 0; + if ( ( bitsMod + nullVec ) % 5 != 0 ) + { + underflow = 1; + } + dummy_bits = nullVec + underflow; + bits = bits + dummy_bits; /* add dummy bits */ + bitsMod = 0; + } + } + underflow = 1; + if ( bitsMod != 4 ) + { + underflow = 0; + bits -= bitsMod; + } + bits += underflow; + + /* read the unary code for unused bit*/ + unused_bits_idx = -1; + do + { + ( unused_bits_idx )++; + if ( 5 * unused_bits_idx + 4 == bits - 1 ) + { + break; + } + } while ( get_next_indice_1( st ) ); + + unusedbitsFlag = 0; + + if ( dummy_bits == 0 ) + { + if ( unused_bits_idx == 0 && bits > BIT_SAVING_LOW_THR ) + { + unusedbitsFlag = 1; + } + else if ( unused_bits_idx == 1 && bits > BIT_SAVING_LOW_THR ) + { + unusedbitsFlag = -1; + } + } + + /*Compute AVQ code book number from unused Bits */ + nq_est = (int16_t) ceil( 0.2f * ( bits - 5 * ( unusedbitsFlag + unused_bits_idx ) ) ); + + if ( nq_est == 1 ) + { + nq_est = 0; + } + bits -= underflow; + + bits -= unused_bits_idx; + + if ( nq_est != 0 ) + { + bits--; + } + + nq[i] = nq_est; + /* read codebook indices (rank I and event. Voronoi index kv) */ + read_cv( st, &I[i], &kv[i * 8], nq[i], &bits ); + + bits -= dummy_bits; + + if ( bitsMod != 4 ) + { + bits += bitsMod; + } + } + + /* decode all subvectors */ + for ( i = 0; i < Nsv; i++ ) + { + /* multi-rate RE8 decoder */ + re8_dec( nq[i], I[i], &kv[8 * i], code ); + + /* write decoded RE8 vector to decoded subvector #i */ + for ( j = 0; j < 8; j++ ) + { + xriq[i * 8 + j] = code[j]; + } + } + + *nb_bits = bits; + + return; +} + + +/*-----------------------------------------------------------------* + * AVQ_dec_lpc() + * + * Demultiplex and decode subvectors for LPC dequantization + * using split algebraic vector dequantizer + *-----------------------------------------------------------------*/ + +void AVQ_dec_lpc( + const int16_t indx[], /* i : index[] (4 bits per words) */ + int16_t nvecq[], /* o : vector quantized */ + const int16_t Nsv /* i : number of subvectors (lg=Nsv*8) */ +) +{ + int16_t i, l, n, nq, nk, pos, ival, c[8], kv[8]; + int32_t I; + + /* last index word */ + pos = Nsv - 1; + + for ( l = 0; l < Nsv; l++ ) + { + pos += indx[l]; + } + + /* decode all subvectors */ + for ( l = Nsv - 1; l >= 0; l-- ) + { + nq = indx[l]; /* quantizer number (0,2,3..n) */ + + nk = 0; + n = nq; + + if ( nq > 4 ) + { + nk = ( nq - 3 ) >> 1; + n = nq - nk * 2; + } + + /* read n groups of 4-bit for Voronoi index (k[]) */ + for ( i = 0; i < 8; i++ ) + { + kv[i] = 0; + } + + while ( nk-- > 0 ) + { + ival = ( indx[pos--] & 0x0F ); + ival <<= 4; + ival += ( indx[pos--] & 0x0F ); + + for ( i = 7; i >= 0; i-- ) + { + kv[i] <<= 1; + kv[i] += ( ival & 0x01 ); + ival >>= 1; + } + } + + /* read n groups of 4-bit for base codebook index (I) */ + I = 0; + while ( n-- > 0 ) + { + I <<= 4; + I += ( indx[pos--] & 0x0F ); + } + + /* multi-rate RE8 decoder */ + re8_dec( nq, (int16_t) I, kv, c ); + + /* write decoded RE8 vector */ + for ( i = 0; i < 8; i++ ) + { + nvecq[( l * 8 ) + i] = c[i]; + } + } + + return; +} + + +/*-----------------------------------------------------------------* + * read_cv() + * + * read codebook indices (rank I and event. Voronoi index kv) + *-----------------------------------------------------------------*/ + +static void read_cv( + Decoder_State *st, /* i/o: decoder state structure */ + uint16_t *I, /* o : rank I code book index */ + int16_t *kv, /* o : Voronoi index kv */ + int16_t nq, /* i : AVQ nq index */ + int16_t *nbits /* i/o: bits available */ +) + +{ + int16_t j, bits, order_v; + + bits = *nbits; + + /* read codebook indices (rank I and event. Voronoi index kv) */ + if ( nq == 0 ) /* Q0 */ + { + /* nothing to read */ + } + else if ( nq < 5 ) /* Q2, Q3, Q4 */ + { + *I = get_next_indice( st, 4 * nq ); + bits -= ( 4 * nq ); + } + else if ( nq % 2 == 0 ) /* Q4 + Voronoi extensions r=1,2,3,... */ + { + *I = get_next_indice( st, 4 * 4 ); + bits -= 4 * 4; + order_v = (int16_t) ( nq / 2 ) - 2; + + for ( j = 0; j < 8; j++ ) + { + kv[j] = get_next_indice( st, order_v ); + } + bits -= 8 * order_v; + } + else /* Q3 + Voronoi extensions r=1,2,3,... */ + { + *I = get_next_indice( st, 4 * 3 ); + bits -= 4 * 3; + order_v = (int16_t) ( nq / 2 ) - 1; + + for ( j = 0; j < 8; j++ ) + { + kv[j] = get_next_indice( st, order_v ); + } + bits -= 8 * order_v; + } + *nbits = bits; + + return; +} diff --git a/lib_dec/bass_psfilter.c b/lib_dec/bass_psfilter.c new file mode 100644 index 0000000000000000000000000000000000000000..74ab927479dd8d6c39d18cb2cde8e30b6c1c3da9 --- /dev/null +++ b/lib_dec/bass_psfilter.c @@ -0,0 +1,613 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "prot.h" +#include "ivas_prot.h" +#include "cnst.h" +#include "stat_dec.h" +#include "rom_com.h" +#include +#include "wmc_auto.h" + +/*---------------------------------------------------------------------* + * Local constants + *---------------------------------------------------------------------*/ + +#define NBPSF_L_EXTRA 120 +#define BPF_STOP_STOPBAND_16 16 + +#define K_PC_DEC -0.0357f /* <45, 17> */ +#define C_PC_DEC 1.6071f + +/*---------------------------------------------------------------------* + * Local function prototypes + *---------------------------------------------------------------------*/ + +static int16_t Pit_track( const float syn[], int16_t T ); + +/*---------------------------------------------------------------------* + * bass_psfilter_init() + * + * Initialisation of postfiltering variables + *---------------------------------------------------------------------*/ + +void bass_psfilter_init( + BPF_DEC_HANDLE hBPF /* o : BPF data handle */ +) +{ + /* post-filter memories */ + hBPF->pst_mem_deemp_err = 0.0f; + hBPF->pst_lp_ener = 0.0f; + set_f( hBPF->pst_old_syn, 0, NBPSF_PIT_MAX ); + + set_s( hBPF->Track_on_hist, 0, L_TRACK_HIST ); + set_s( hBPF->vibrato_hist, 0, L_TRACK_HIST ); + set_f( hBPF->mem_mean_pit, 80, L_TRACK_HIST ); + hBPF->psf_att = 1.0f; + + return; +} + +/*---------------------------------------------------------------------* + * bass_psfilter() + * + * Perform low-frequency postfiltering + *---------------------------------------------------------------------*/ + +void bass_psfilter( + BPF_DEC_HANDLE hBPF, /* o : BPF data handle */ + const int16_t Opt_AMR_WB, /* i : AMR-WB IO flag */ + const float synth_in[], /* i : input synthesis (at 16kHz) */ + const int16_t L_frame, /* i : length of the last frame */ + const float pitch_buf[], /* i : pitch for every subfr [0,1,2,3] */ + const int16_t bpf_off, /* i : do not use BPF when set to 1 */ + float v_stab, /* i : stability factor */ + float *v_stab_smooth, /* i/o: smoothed stability factor */ + const int16_t coder_type, /* i : coder_type */ + float bpf_noise_buf[] /* o : BPF error signal (at int_fs) */ +) +{ + int16_t i, i_subfr, T; + float gain, alpha, corr, ener; + float syn_buf[NBPSF_PIT_MAX + L_FRAME16k + NBPSF_PIT_MAX], *syn; + float syn2_buf[L_FRAME16k], *syn2; + float err[L_HALFR16k]; + int16_t T_sf[NB_SUBFR16k]; + int16_t nb_subfr, T_update; + float delta_v_stab; + int16_t dist_pit_diff, idx_pit_min, idx_pit_max, vibrato, Track_on; + float loc_pit_max, loc_pit_min, diff_pit; + float TrackOnR, vibratR, alp_tmp; + int16_t subfr_len; + int16_t nbpsf_pit_max; + + subfr_len = ( L_frame == L_FRAME8k ) ? STEREO_DFT_L_SUBFR_8k : L_SUBFR; + nbpsf_pit_max = ( L_frame == L_FRAME8k ) ? STEREO_DFT_NBPSF_PIT_MAX_8k : NBPSF_PIT_MAX; + + Track_on = 0; + T_update = 01; + vibrato = 0; + nb_subfr = L_frame / subfr_len; + + /*------------------------------------------------------- + * Initialize pointers to various synthesis buffers + * + * |--------------------syn_buf--------------------------------| + * |-----old_syn-----|-------synth_in--------|----extrapol---- | + * |--NBPSF_PIT_MAX--| sf1 | sf2 | sf3 | sf4 |--NBPSF_PIT_MAX--| + * |------syn2_buf---------| + * |------L_frame----------| + * |----bpf_noise_buf------| + * + *-------------------------------------------------------*/ + + mvr2r( hBPF->pst_old_syn, syn_buf, nbpsf_pit_max ); + mvr2r( synth_in, syn_buf + nbpsf_pit_max, L_frame ); + + if ( !( pitch_buf == NULL || bpf_off ) ) + { + for ( i = L_TRACK_HIST - 1; i > 0; i-- ) + { + hBPF->mem_mean_pit[i] = hBPF->mem_mean_pit[i - 1]; + } + + hBPF->mem_mean_pit[i] = mean( pitch_buf, nb_subfr ); + } + + idx_pit_min = minimum( hBPF->mem_mean_pit, L_TRACK_HIST, &loc_pit_min ); + idx_pit_max = maximum( hBPF->mem_mean_pit, L_TRACK_HIST, &loc_pit_max ); + + dist_pit_diff = (int16_t) abs( idx_pit_max - idx_pit_min ); + diff_pit = loc_pit_max - loc_pit_min; + + if ( L_frame == L_FRAME16k || L_frame == L_FRAME8k ) + { + diff_pit *= 0.8f; + } + + if ( coder_type != INACTIVE && diff_pit >= 2.0f && diff_pit < 10 && dist_pit_diff >= 3 ) + { + vibrato = 1; + } + + TrackOnR = (float) sum_s( hBPF->Track_on_hist, L_TRACK_HIST ) / L_TRACK_HIST; + vibratR = (float) sum_s( hBPF->vibrato_hist, L_TRACK_HIST ); + alp_tmp = 1.0f - TrackOnR; + + if ( vibrato ) + { + vibratR = vibratR * vibratR * -0.009f + 1.0f; + alp_tmp *= vibratR; + } + + alp_tmp = max( 0.1f, alp_tmp ); + + if ( alp_tmp > hBPF->psf_att ) + { + hBPF->psf_att = 0.05f * alp_tmp + 0.95f * hBPF->psf_att; + } + else + { + hBPF->psf_att = 0.4f * alp_tmp + 0.6f * hBPF->psf_att; + } + + if ( pitch_buf == NULL || bpf_off ) + { + /* do not use BPF for HQ core */ + T_update = L_frame == L_FRAME8k ? 40 : 80; + set_s( T_sf, 0, 5 ); + syn = &syn_buf[nbpsf_pit_max + L_frame]; + for ( i = 0; i < nbpsf_pit_max; i++ ) + { + syn[i] = syn[i - T_update]; + } + } + else + { + /* extrapolation of synth_in */ + for ( i = 0; i < nb_subfr; i++ ) + { + /* copy subframe pitch values [1,2,3,4] of the current frame */ + T_sf[i] = ( L_frame == L_FRAME8k ) ? (int16_t) ( pitch_buf[i] / 2 + 0.5f ) : (int16_t) ( pitch_buf[i] + 0.5f ); + + if ( L_frame == L_FRAME16k || L_frame == L_FRAME8k ) + { + /* Safety check, should be very rare */ + if ( T_sf[i] > nbpsf_pit_max ) + { + T_sf[i] = nbpsf_pit_max; + } + } + else + { + if ( T_sf[i] > PIT_MAX ) + { + T_sf[i] = PIT_MAX; + } + } + } + + T = T_sf[nb_subfr - 1]; + syn = &syn_buf[nbpsf_pit_max + L_frame]; + for ( i = 0; i < nbpsf_pit_max; i++ ) + { + syn[i] = syn[i - T]; + } + } + + for ( i_subfr = 0; i_subfr < L_frame; i_subfr += subfr_len ) + { + T = T_sf[i_subfr / subfr_len]; + + /* Pitch limitation already done in the previous loop */ + syn = &syn_buf[nbpsf_pit_max + i_subfr]; + syn2 = &syn2_buf[i_subfr]; + + if ( T != 0 ) + { + if ( T >= PIT_MIN && Opt_AMR_WB ) + { + T = Pit_track( syn, T ); + + if ( T != T_sf[i_subfr / L_SUBFR] ) + { + Track_on = 1; + } + } + + /* symetric pitch prediction : phase is opposite between harmonic */ + for ( i = 0; i < subfr_len; i++ ) + { + syn2[i] = 0.5f * ( syn[i - T] + syn[i + T] ); + } + + /* gain of prediction */ + corr = 0.0001f; + for ( i = 0; i < subfr_len; i++ ) + { + corr += syn[i] * syn2[i]; + } + + ener = 0.0001f; + for ( i = 0; i < subfr_len; i++ ) + { + ener += syn2[i] * syn2[i]; + } + gain = corr / ener; + + /* error of prediction for noise estimator */ + for ( i = 0; i < subfr_len; i++ ) + { + err[i] = syn[i] - ( gain * syn2[i] ); + } + + /* alpha = post-filtering factor (0=OFF, 1=100%) */ + ener = (float) ( ener + pow( 10.0, 0.1 * hBPF->pst_lp_ener ) ); /* limit alpha (post-filtering) when noise is high */ + alpha = corr / ener; + if ( alpha > 0.5f ) + { + alpha = 0.5f; + } + + alpha *= ( hBPF->psf_att ); + if ( alpha > 0.3f && Track_on ) + { + alpha = 0.3f; + } + else if ( alpha > 0.4f && vibrato ) + { + alpha = 0.4f; + } + + if ( alpha < 0.0f ) + { + alpha = 0.0f; + } + + *v_stab_smooth = 0.8f * v_stab + 0.2f * ( *v_stab_smooth ); + delta_v_stab = (float) fabs( *v_stab_smooth - v_stab ); + v_stab = (float) pow( v_stab, 0.5f ); + alpha = ( 1.0f + 0.15f * v_stab - 2.0f * delta_v_stab ) * alpha; + + for ( i = 0; i < subfr_len; i++ ) + { + syn2[i] = alpha * ( syn[i] - syn2[i] ); + } + } + + else + { + /* symetric pitch prediction : phase is opposite between harmonic */ + for ( i = 0; i < subfr_len; i++ ) + { + syn2[i] = 0.5f * ( syn[i - T_update] + syn[i + T_update] ); + } + + if ( coder_type == AUDIO ) /* GSC mode without temporal component */ + { + Track_on = 1; + } + else + { + Track_on = 0; + } + + /* gain of prediction */ + corr = 0.0001f; + for ( i = 0; i < subfr_len; i++ ) + { + corr += syn[i] * syn2[i]; + } + ener = 0.0001f; + for ( i = 0; i < subfr_len; i++ ) + { + ener += syn2[i] * syn2[i]; + } + + gain = corr / ener; + + /* error of prediction for noise estimator */ + for ( i = 0; i < subfr_len; i++ ) + { + err[i] = syn[i] - ( gain * syn2[i] ); + } + + /* alpha = post-filtering factor (0=OFF, 1=100%) */ + alpha = 0.0f; + + *v_stab_smooth = 0.8f * v_stab + 0.2f * ( *v_stab_smooth ); + + set_f( syn2, 0.0f, subfr_len ); + } + + /* low-frequency noise estimator (lp_ener is average in dB) */ + deemph( err, 0.9f, subfr_len, &( hBPF->pst_mem_deemp_err ) ); /* +20dB at 50Hz */ + + ener = 0.0001f; + for ( i = 0; i < subfr_len; i++ ) + { + ener += err[i] * err[i]; + } + ener = (float) ( 10.0 * log10( ener ) ); + hBPF->pst_lp_ener = (float) ( 0.99f * hBPF->pst_lp_ener + 0.01f * ener ); + + /* just write out the error signal */ + mvr2r( syn2, bpf_noise_buf + i_subfr, subfr_len ); + } + + /*-------------------------------------------------------* + * update memory for next frame + *-------------------------------------------------------*/ + + for ( i = L_TRACK_HIST - 1; i > 0; i-- ) + { + hBPF->Track_on_hist[i] = hBPF->Track_on_hist[i - 1]; + hBPF->vibrato_hist[i] = hBPF->vibrato_hist[i - 1]; + } + + hBPF->Track_on_hist[i] = Track_on; + hBPF->vibrato_hist[i] = vibrato; + + mvr2r( syn_buf + L_frame, hBPF->pst_old_syn, nbpsf_pit_max ); + + return; +} + + +/*---------------------------------------------------------------------* + * Pit_track() + * + * Perform pitch tracking and test pitch/2 to avoid continuous pitch doubling + *---------------------------------------------------------------------*/ + +/*! r: Pitch */ +static int16_t Pit_track( + const float syn[], /* i : synthesis [-NBPSF_PIT_MAX..L_HALFR16k] */ + int16_t T /* i : pitch period (>= PIT_MIN) */ +) +{ + int16_t i, T2; + float tmp, corr, ener, cn; + const float *v1, *v2; + + /*----------------------------------------------------------------* + * Test pitch/2 to avoid continuous pitch doubling + * (short pitch is limited to PIT_MIN (34 = 376Hz) by the encoder + *----------------------------------------------------------------*/ + + T2 = T >> 1; + + v1 = &syn[-NBPSF_L_EXTRA]; + v2 = &syn[-T2 - NBPSF_L_EXTRA]; + + ener = 0.01f; + for ( i = 0; i < L_HALFR16k + NBPSF_L_EXTRA; i++ ) + { + ener += v1[i] * v1[i]; + } + corr = 0.01f; + for ( i = 0; i < L_HALFR16k + NBPSF_L_EXTRA; i++ ) + { + corr += v1[i] * v2[i]; + } + tmp = 0.01f; + for ( i = 0; i < L_HALFR16k + NBPSF_L_EXTRA; i++ ) + { + tmp += v2[i] * v2[i]; + } + + /* cn = normalized correlation of pitch/2 */ + cn = corr / (float) sqrt( ener * tmp ); + if ( cn > 0.95f ) + { + T = T2; + } + + return ( T ); +} + + +/*---------------------------------------------------------------------* + * addBassPostFilter() + * + * Add BPF component in cldfb domain + *---------------------------------------------------------------------*/ + +void addBassPostFilter( + const float *harm_timeIn, + const int16_t samplesToProcess, + float **rAnalysis, + float **iAnalysis, + HANDLE_CLDFB_FILTER_BANK cldfb ) +{ + float *tmp_R[CLDFB_NO_COL_MAX]; + float *tmp_I[CLDFB_NO_COL_MAX]; + float cldfbBufferReal[CLDFB_NO_COL_MAX][20]; + float cldfbBufferImag[CLDFB_NO_COL_MAX][20]; + int16_t i, b; + int16_t maxBand; + const float *weights; + int16_t nCol = cldfb->no_col; + int16_t nColToProcess = nCol; + int16_t nChan = cldfb->no_channels; + + if ( samplesToProcess > -1 ) + { + nColToProcess = ( ( samplesToProcess + cldfb->no_channels - 1 ) / cldfb->no_channels ); + } + + assert( nCol == 16 ); + + weights = bpf_weights_16; + + if ( nChan > BPF_STOP_STOPBAND_16 ) + { + maxBand = BPF_STOP_STOPBAND_16; + } + else + { + maxBand = nChan; + } + + for ( i = 0; i < nColToProcess; i++ ) + { + tmp_R[i] = cldfbBufferReal[i]; + tmp_I[i] = cldfbBufferImag[i]; + } + + /* do the analysis of filtered signal */ + cldfbAnalysis( harm_timeIn, tmp_R, tmp_I, samplesToProcess, cldfb ); + + /* now do the subtraction */ + for ( i = 0; i < nColToProcess; i++ ) + { + /* loop over low frequency bands */ + for ( b = 0; b < maxBand; b++ ) + { + rAnalysis[i][b] -= weights[b] * tmp_R[i][b]; + iAnalysis[i][b] -= weights[b] * tmp_I[i][b]; + } + } + + return; +} + +/*---------------------------------------------------------------------* + * res_bpf_adapt() + * + * Analyze BPF output and decide if it should be applied on DFT stereo + * residual signal + *---------------------------------------------------------------------*/ + +/*! r: Decision to enable or disable BPF on DFT stereo residual */ +int16_t res_bpf_adapt( + STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: DFT stereo decoder handle */ + const float *bpf_error_signal_8k, /* i : BPF modification signal */ + float res_buf[STEREO_DFT_BUF_MAX] /* i : residual buffer */ +) +{ + float error_nrg; + float tmp; + float res_hb_nrg; + float bpf_error_ratio; + int16_t res_bpf_flag; + int16_t i; + int16_t i_start; + int16_t i_end; + float bw_inv; + + if ( hStereoDft->res_cod_band_max == 6 ) + { + i_start = 39; + i_end = 64; + bw_inv = 0.04f; /* 1/(64 - 39) */ + } + else + { + i_start = 28; + i_end = 40; + bw_inv = 0.083f; /* 1/(40 - 28) */ + } + + /* Measure energy of high frequency band in MDCT domain */ + res_hb_nrg = EPSILON; + for ( i = i_start; i < i_end; i++ ) + { + res_hb_nrg += res_buf[i] * res_buf[i]; + } + res_hb_nrg *= bw_inv; + res_hb_nrg = STEREO_DFT_BPF_ADAPT_ALPHA * res_hb_nrg + ( 1 - STEREO_DFT_BPF_ADAPT_ALPHA ) * hStereoDft->res_hb_nrg_mem; + hStereoDft->res_hb_nrg_mem = res_hb_nrg; + + /* Measure energy of discontinuities at subframe boundaries */ + error_nrg = 0; + for ( i = 0; i < L_FRAME8k; i += STEREO_DFT_L_SUBFR_8k ) + { + tmp = bpf_error_signal_8k[i] - hStereoDft->bpf_error_signal_last; + error_nrg += tmp * tmp; + hStereoDft->bpf_error_signal_last = bpf_error_signal_8k[i + STEREO_DFT_L_SUBFR_8k - 1]; + } + error_nrg *= 0.2f; /* Division by 5 for average value */ + bpf_error_ratio = min( 2, error_nrg / res_hb_nrg ); /* Form decision variable and apply limit */ + bpf_error_ratio = STEREO_DFT_BPF_ADAPT_BETA * bpf_error_ratio + ( 1 - STEREO_DFT_BPF_ADAPT_BETA ) * hStereoDft->bpf_error_ratio_mem; + hStereoDft->bpf_error_ratio_mem = bpf_error_ratio; + + res_bpf_flag = bpf_error_ratio < 1; + + return res_bpf_flag; +} + +/*---------------------------------------------------------------------* + * bpf_pitch_coherence() + * + * Analyse pitch coherence + *---------------------------------------------------------------------*/ +void bpf_pitch_coherence( + Decoder_State *st, /* i/o: decoder state structure */ + const float pitch_buf[] /* i : pitch for every subfr [0,1,2,3] */ +) +{ + int16_t nb_subfr; + float pc, pcn1, pcn2, pcn3; + + nb_subfr = st->L_frame / L_SUBFR; + + if ( st->clas_dec > UNVOICED_CLAS && st->element_mode != EVS_MONO ) + { + pc = (float) fabs( st->old_pitch_buf[nb_subfr + 3] + st->old_pitch_buf[nb_subfr + 2] - st->old_pitch_buf[nb_subfr] - st->old_pitch_buf[nb_subfr + 1] ) * 256.0f / (float) st->L_frame; + pcn1 = K_PC_DEC * pc + C_PC_DEC; + pcn1 = max( min( pcn1, 1.0f ), 0.0f ); + + pc = (float) fabs( pitch_buf[nb_subfr - 1] + pitch_buf[nb_subfr - 2] - pitch_buf[1] - pitch_buf[0] ) * 256.0f / (float) st->L_frame; + pcn2 = K_PC_DEC * pc + C_PC_DEC; + pcn2 = max( min( pcn2, 1.0f ), 0.0f ); + + pc = (float) fabs( st->old_pitch_buf[nb_subfr + 3] + st->old_pitch_buf[nb_subfr + 2] - pitch_buf[1] - pitch_buf[0] ) * 256.0f / (float) st->L_frame; + pcn3 = K_PC_DEC * pc + C_PC_DEC; + pcn3 = max( min( pcn3, 1.0f ), 0.0f ); + + if ( pcn1 + pcn2 + pcn3 < 2.5f ) + { + st->hBPF->psf_att = 0.4f; + set_s( &st->hBPF->Track_on_hist[L_TRACK_HIST - nb_subfr], 1, nb_subfr ); + } + } + + return; +} diff --git a/lib_dec/cng_dec.c b/lib_dec/cng_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..486d2d85700b9cc6389c223b479837118a64878d --- /dev/null +++ b/lib_dec/cng_dec.c @@ -0,0 +1,840 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*---------------------------------------------------------------------* + * Local function prototypes + *---------------------------------------------------------------------*/ + +static void shb_CNG_decod( Decoder_State *st, const float *synth, float *shb_synth, const int16_t sid_bw ); + + +/*---------------------------------------------------------------------* + * CNG_dec() + * + * Decoding of CNG parameters + *---------------------------------------------------------------------*/ + +void CNG_dec( + Decoder_State *st, /* i/o: State structure */ + const int16_t last_element_mode, /* i : last element mode */ + float Aq[], /* o : LP coefficients */ + float *lsp_new, /* i/o: current frame LSPs */ + float *lsf_new, /* i/o: current frame LSFs */ + int16_t *allow_cn_step, /* o : allow CN step */ + int16_t *sid_bw, /* i : 0-NB/WB, 1-SWB SID */ + float *q_env ) +{ + int16_t i, enr_index, num_bits; + TD_CNG_DEC_HANDLE hTdCngDec; + float step; + float enr, weights; + int16_t m = 0; + int16_t ptr, j, k; + int16_t m1; + float tmp[HO_HIST_SIZE * M]; + int16_t burst_ho_cnt = 0; + int16_t ll, s_ptr; + float lsf_tmp[M]; + float C[M]; + float max_val[2]; + int16_t max_idx[2]; + float ftmp; + float lsp_tmp[M]; + float dev; + float max_dev; + float dist; + int16_t env_idx[2]; + float enr1; + float env[NUM_ENV_CNG]; + float tmp_env[HO_HIST_SIZE * NUM_ENV_CNG]; + int16_t LSF_Q_prediction; /* o : LSF prediction mode - just temporary variable in CNG */ + int16_t tmp1; + + hTdCngDec = st->hTdCngDec; + + /*-----------------------------------------------------------------* + * Decode CNG spectral envelope (only in SID frame) + *-----------------------------------------------------------------*/ + + if ( st->core_brate == SID_1k75 || st->core_brate == SID_2k40 ) + { + /* de-quantize the LSF vector */ + if ( st->Opt_AMR_WB ) + { + isf_dec_amr_wb( st, Aq, lsf_new, lsp_new ); + } + else + { + lsf_dec( st, 0, Aq, &LSF_Q_prediction, lsf_new, lsp_new, 0, 0, NULL ); + } + } + else + { + /* Use old LSP vector */ + mvr2r( st->lsp_old, lsp_new, M ); + mvr2r( st->lsf_old, lsf_new, M ); + } + + /* Initialize the CNG spectral envelope in case of the very first CNG frame */ + if ( st->first_CNG == 0 ) + { + mvr2r( st->lsp_old, st->lspCNG, M ); + } + + /*-----------------------------------------------------------------* + * Decode residual signal energy + *-----------------------------------------------------------------*/ + + *allow_cn_step = 0; + if ( st->core_brate == SID_1k75 || st->core_brate == SID_2k40 ) + { + if ( st->core_brate == SID_2k40 ) + { + step = STEP_SID; + } + else + { + step = STEP_AMR_WB_SID; + } + + /* intialize the energy quantization parameters */ + if ( !st->Opt_AMR_WB ) + { + num_bits = 7; + } + else + { + num_bits = 6; + } + + /* decode the energy index */ + enr_index = get_next_indice( st, num_bits ); + + if ( st->last_core_brate <= SID_2k40 || st->prev_bfi == 1 ) + { + tmp1 = hTdCngDec->old_enr_index + 20; + } + else + { + tmp1 = hTdCngDec->old_enr_index + 40; + } + if ( ( enr_index > tmp1 ) && ( hTdCngDec->old_enr_index >= 0 ) ) /* Likely bit error , and not startup */ + { + enr_index = tmp1; + enr_index = min( enr_index, 127 ); + if ( st->Opt_AMR_WB != 0 ) + { + enr_index = min( enr_index, 63 ); + } + } + + if ( st->last_core_brate > SID_2k40 && + st->first_CNG != 0 && + hTdCngDec->old_enr_index >= 0 && + enr_index > hTdCngDec->old_enr_index + 1 ) + { + *allow_cn_step = 1; + } + hTdCngDec->old_enr_index = enr_index; + if ( enr_index == 0 ) + { + enr_index = -5; + } + hTdCngDec->Enew = enr_index / step - 2.0f; + + /* find the new energy value */ + hTdCngDec->Enew = (float) ( pow( 2.0, hTdCngDec->Enew ) ); + + /* decode SID type */ + if ( st->core_brate == SID_2k40 ) + { + burst_ho_cnt = get_next_indice( st, 3 ); + + *sid_bw = get_next_indice( st, 1 ); + + if ( *sid_bw == 0 ) + { + env_idx[0] = get_next_indice( st, 6 ); + + /* get quantized res_env_details */ + for ( i = 0; i < NUM_ENV_CNG; i++ ) + { + q_env[i] = CNG_details_codebook[env_idx[0]][i]; + } + } + } + + /* Reset CNG history if CNG frame length is changed */ + if ( st->bwidth == WB && st->first_CNG && st->L_frame != st->last_CNG_L_frame ) + { + hTdCngDec->ho_hist_size = 0; + } + } + + /*---------------------------------------------------------------------* + * CNG spectral envelope update + * Find A(z) coefficients + *---------------------------------------------------------------------*/ + + if ( st->last_core_brate == FRAME_NO_DATA || st->last_core_brate == SID_1k75 || st->last_core_brate == SID_2k40 ) + { + /* Reset hangover counter if not first SID period */ + if ( st->core_brate > FRAME_NO_DATA ) + { + hTdCngDec->num_ho = 0; + } + + /* Update LSPs if last SID energy not outlier or insufficient number of hangover frames */ + if ( hTdCngDec->num_ho < 3 || hTdCngDec->Enew < 1.5f * st->lp_ener ) + { + for ( i = 0; i < M; i++ ) + { + /* AR low-pass filter */ + st->lspCNG[i] = CNG_ISF_FACT * st->lspCNG[i] + ( 1 - CNG_ISF_FACT ) * lsp_new[i]; + } + } + } + else + { + /* Update CNG_mode, if allowed */ + if ( ( st->Opt_AMR_WB || st->bwidth == WB ) && ( !st->first_CNG || hTdCngDec->act_cnt2 >= MIN_ACT_CNG_UPD ) ) + { + if ( st->last_active_brate > ACELP_16k40 ) + { + st->CNG_mode = -1; + } + else + { + st->CNG_mode = get_cng_mode( st->last_active_brate ); + } + } + + /* If first sid after active burst update LSF history from circ buffer */ + burst_ho_cnt = min( burst_ho_cnt, hTdCngDec->ho_circ_size ); + hTdCngDec->act_cnt = 0; + s_ptr = hTdCngDec->ho_circ_ptr - burst_ho_cnt + 1; + if ( s_ptr < 0 ) + { + s_ptr += hTdCngDec->ho_circ_size; + } + + for ( ll = burst_ho_cnt; ll > 0; ll-- ) + { + if ( ++( hTdCngDec->ho_hist_ptr ) == HO_HIST_SIZE ) + { + hTdCngDec->ho_hist_ptr = 0; + } + /* Conversion between 12.8k and 16k LSPs */ + if ( ( st->L_frame == L_FRAME16k && hTdCngDec->ho_16k_lsp[s_ptr] == 0 ) || ( st->L_frame == L_FRAME && hTdCngDec->ho_16k_lsp[s_ptr] == 1 ) ) + { + lsp_convert_poly( &hTdCngDec->ho_lsp_circ[s_ptr * M], st->L_frame, 0 ); + } + + /* update circular buffers */ + mvr2r( &( hTdCngDec->ho_lsp_circ[s_ptr * M] ), &( hTdCngDec->ho_lsp_hist[hTdCngDec->ho_hist_ptr * M] ), M ); + mvr2r( &( hTdCngDec->ho_ener_circ[s_ptr] ), &( hTdCngDec->ho_ener_hist[hTdCngDec->ho_hist_ptr] ), 1 ); + hTdCngDec->ho_sid_bw = ( hTdCngDec->ho_sid_bw & 0x3fffffffL ) << 1; + mvr2r( &( hTdCngDec->ho_env_circ[s_ptr * NUM_ENV_CNG] ), &( hTdCngDec->ho_env_hist[hTdCngDec->ho_hist_ptr * NUM_ENV_CNG] ), NUM_ENV_CNG ); + + hTdCngDec->ho_hist_size++; + if ( hTdCngDec->ho_hist_size > HO_HIST_SIZE ) + { + hTdCngDec->ho_hist_size = HO_HIST_SIZE; + } + + s_ptr++; + + if ( s_ptr == hTdCngDec->ho_circ_size ) + { + s_ptr = 0; + } + } + + if ( hTdCngDec->ho_hist_size > 0 ) + { + *allow_cn_step |= ( st->first_CNG || st->element_mode == EVS_MONO ) && ( hTdCngDec->ho_ener_hist[hTdCngDec->ho_hist_ptr] > 4.0f * st->lp_ener ); + } + + if ( last_element_mode == IVAS_CPE_TD ) + { + *allow_cn_step = 1; + } + + if ( !*allow_cn_step && hTdCngDec->ho_hist_size > 0 ) + { + ptr = hTdCngDec->ho_hist_ptr; + mvr2r( &( hTdCngDec->ho_lsp_hist[ptr * M] ), tmp, M ); + m1 = 0; + if ( ( hTdCngDec->ho_sid_bw & 0x1L ) == 0 ) + { + mvr2r( &hTdCngDec->ho_env_hist[ptr * NUM_ENV_CNG], tmp_env, NUM_ENV_CNG ); + m1 = 1; + } + enr = W_DTX_HO[0] * hTdCngDec->ho_ener_hist[ptr]; + weights = W_DTX_HO[0]; + m = 1; + for ( k = 1; k < hTdCngDec->ho_hist_size; k++ ) + { + ptr--; + if ( ptr < 0 ) + { + ptr = HO_HIST_SIZE - 1; + } + + if ( hTdCngDec->ho_ener_hist[ptr] < hTdCngDec->ho_ener_hist[hTdCngDec->ho_hist_ptr] * BUF_H_NRG && + hTdCngDec->ho_ener_hist[ptr] > hTdCngDec->ho_ener_hist[hTdCngDec->ho_hist_ptr] * BUF_L_NRG ) + { + enr += W_DTX_HO[k] * hTdCngDec->ho_ener_hist[ptr]; + weights += W_DTX_HO[k]; + mvr2r( &hTdCngDec->ho_lsp_hist[ptr * M], &tmp[m * M], M ); + if ( ( hTdCngDec->ho_sid_bw & ( 0x1L << k ) ) == 0 ) + { + mvr2r( &hTdCngDec->ho_env_hist[ptr * NUM_ENV_CNG], &tmp_env[m1 * NUM_ENV_CNG], NUM_ENV_CNG ); + m1++; + } + m++; + } + } + + enr /= weights; + st->lp_ener = enr; + + set_f( max_val, 0.0f, 2 ); + set_s( max_idx, 0, 2 ); + + for ( i = 0; i < m; i++ ) + { + if ( st->L_frame == L_FRAME ) + { + lsp2lsf( &tmp[i * M], lsf_tmp, M, INT_FS_12k8 ); + ftmp = 6400.0f / ( M + 1 ); + C[i] = ( 6400.0f - lsf_tmp[M - 1] - ftmp ) * ( 6400.0f - lsf_tmp[M - 1] - ftmp ); + } + else + { + lsp2lsf( &tmp[i * M], lsf_tmp, M, INT_FS_16k ); + ftmp = 8000.0f / ( M + 1 ); + C[i] = ( 8000.0f - lsf_tmp[M - 1] - ftmp ) * ( 8000.0f - lsf_tmp[M - 1] - ftmp ); + } + + C[i] += ( lsf_tmp[0] - ftmp ) * ( lsf_tmp[0] - ftmp ); + + for ( j = 0; j < M - 1; j++ ) + { + C[i] += ( lsf_tmp[j + 1] - lsf_tmp[j] - ftmp ) * ( lsf_tmp[j + 1] - lsf_tmp[j] - ftmp ); + } + + C[i] *= 0.0588235f; /* 1/M+1 */ + + if ( C[i] > max_val[0] ) + { + max_val[1] = max_val[0]; + max_idx[1] = max_idx[0]; + max_val[0] = C[i]; + max_idx[0] = i; + } + else if ( C[i] > max_val[1] ) + { + max_val[1] = C[i]; + max_idx[1] = i; + } + } + + if ( m == 1 ) + { + mvr2r( tmp, lsp_tmp, M ); + } + else if ( m < 4 ) + { + for ( i = 0; i < M; i++ ) + { + lsp_tmp[i] = 0.0f; + for ( j = 0; j < m; j++ ) + { + lsp_tmp[i] += tmp[j * M + i]; + } + + lsp_tmp[i] -= tmp[max_idx[0] * M + i]; + lsp_tmp[i] /= (float) ( m - 1 ); + } + } + else + { + for ( i = 0; i < M; i++ ) + { + lsp_tmp[i] = 0.0f; + for ( j = 0; j < m; j++ ) + { + lsp_tmp[i] += tmp[j * M + i]; + } + + lsp_tmp[i] -= ( tmp[max_idx[0] * M + i] + tmp[max_idx[1] * M + i] ); + lsp_tmp[i] /= (float) ( m - 2 ); + } + } + + dist = 0.0f; + max_dev = 0.0f; + for ( i = 0; i < M; i++ ) + { + dev = (float) fabs( lsp_tmp[i] - lsp_new[i] ); + dist += dev; + if ( dev > max_dev ) + { + max_dev = dev; + } + } + + if ( dist > 0.4f || max_dev > 0.1f ) + { + for ( i = 0; i < M; i++ ) + { + st->lspCNG[i] = lsp_tmp[i]; + } + } + else + { + for ( i = 0; i < M; i++ ) + { + /* AR low-pass filter */ + st->lspCNG[i] = 0.8f * lsp_tmp[i] + ( 1 - 0.8f ) * lsp_new[i]; + } + } + if ( m1 > 0 ) + { + for ( i = 0; i < NUM_ENV_CNG; i++ ) + { + env[i] = 0; + for ( j = 0; j < m1; j++ ) + { + env[i] += tmp_env[j * NUM_ENV_CNG + i]; + } + + env[i] /= (float) m1; + env[i] = env[i] - 2 * st->lp_ener; + } + mvr2r( env, hTdCngDec->lp_env, NUM_ENV_CNG ); + } + } + else + { + mvr2r( lsp_new, st->lspCNG, M ); /* use newly analyzed parameters */ + } + } + + if ( st->core_brate == SID_1k75 || st->core_brate == SID_2k40 ) + { + /* Update hangover memory during CNG */ + if ( !*allow_cn_step && ( hTdCngDec->Enew < 1.5f * st->lp_ener ) ) + { + /* update the pointer to circular buffer of old LSP vectors */ + if ( ++( hTdCngDec->ho_hist_ptr ) == HO_HIST_SIZE ) + { + hTdCngDec->ho_hist_ptr = 0; + } + + /* update the circular buffer of old LSP vectors with the new LSP vector */ + mvr2r( lsp_new, &( hTdCngDec->ho_lsp_hist[( hTdCngDec->ho_hist_ptr ) * M] ), M ); + + /* update the hangover energy buffer */ + hTdCngDec->ho_ener_hist[hTdCngDec->ho_hist_ptr] = hTdCngDec->Enew; + + if ( st->core_brate == SID_2k40 && *sid_bw == 0 ) + { + enr1 = (float) log10( hTdCngDec->Enew * st->L_frame + 0.1f ) / (float) log10( 2.0f ); + for ( i = 0; i < NUM_ENV_CNG; i++ ) + { + /* get quantized envelope */ + env[i] = (float) ( pow( 2.0f, ( enr1 - q_env[i] ) ) + 2 * hTdCngDec->Enew ); + } + hTdCngDec->ho_sid_bw = ( hTdCngDec->ho_sid_bw & 0x3fffffffL ) << 1; + mvr2r( env, &( hTdCngDec->ho_env_hist[( hTdCngDec->ho_hist_ptr ) * NUM_ENV_CNG] ), NUM_ENV_CNG ); + } + else if ( *sid_bw != 0 ) + { + hTdCngDec->ho_sid_bw = ( hTdCngDec->ho_sid_bw & 0x3fffffffL ) << 1; + hTdCngDec->ho_sid_bw |= 0x1L; + } + if ( ++( hTdCngDec->ho_hist_size ) > HO_HIST_SIZE ) + { + hTdCngDec->ho_hist_size = HO_HIST_SIZE; + } + } + + /* Update the frame length memory */ + st->last_CNG_L_frame = st->L_frame; + + if ( st->core_brate != SID_1k75 ) + { + hTdCngDec->num_ho = m; + } + } + + if ( st->Opt_AMR_WB ) + { + isp2a( st->lspCNG, Aq, M ); + } + else + { + lsp2a_stab( st->lspCNG, Aq, M ); + } + + for ( i = 1; i < st->L_frame / L_SUBFR; i++ ) + { + mvr2r( Aq, &Aq[i * ( M + 1 )], M + 1 ); + } + + return; +} + + +/*---------------------------------------------------------------------* + * swb_CNG_dec() + * + * Comfort noise generation for SHB signal + *---------------------------------------------------------------------*/ + +void swb_CNG_dec( + Decoder_State *st, /* i/o: State structure */ + const float *synth, /* i : ACELP core synthesis at 32kHz */ + float *shb_synth, /* o : high-band CNG synthesis */ + const int16_t sid_bw /* i : 0-NB/WB, 1-SWB SID */ +) +{ + if ( st->core_brate == FRAME_NO_DATA || st->core_brate == SID_2k40 ) + { + /* SHB SID decoding and CNG */ + if ( st->cng_type == LP_CNG && st->extl == SWB_CNG ) + { + shb_CNG_decod( st, synth, shb_synth, sid_bw ); + } + st->last_vad = 0; + st->hTdCngDec->burst_cnt = 0; + } + else + { + st->last_vad = 1; + st->hTdCngDec->burst_cnt++; + if ( st->hTdCngDec->burst_cnt > 10 ) + { + st->hTdCngDec->burst_cnt = 0; + } + } + + return; +} + +/*---------------------------------------------------------------------* + * shb_CNG_decod() + * + * Main routine of SHB SID decoding and CNG + *---------------------------------------------------------------------*/ + +static void shb_CNG_decod( + Decoder_State *st, /* i/o: State structure */ + const float *synth, /* i : ACELP core synthesis at 32kHz */ + float *shb_synth, /* o : high-band CNG synthesis */ + const int16_t sid_bw /* i : 0-NB/WB, 1-SWB SID */ +) +{ + int16_t i; + int16_t idx_ener; + TD_CNG_DEC_HANDLE hTdCngDec; + float shb_lpcCNG[LPC_SHB_ORDER + 1]; + float shb_lspCNG[LPC_SHB_ORDER]; + float excTmp[L_FRAME16k]; + float excSHB[L_FRAME16k]; + float ener_excSHB; + float wb_ener; + float gain; + float shb_syn16k[L_FRAME16k]; + float ftmp; + float step; + float interp; + float ener; + int16_t allow_cn_step = 0; + + hTdCngDec = st->hTdCngDec; + + if ( !st->bfi ) + { + if ( st->core_brate == SID_2k40 && sid_bw == 1 ) + { + idx_ener = get_next_indice( st, 4 ); + + if ( idx_ener == 0 ) + { + idx_ener = -15; + } + + /* de-quantization of SHB CNG parameters */ + if ( st->element_mode == EVS_MONO ) + { + hTdCngDec->last_shb_cng_ener = ( (float) idx_ener / 0.9f - 6.0f ) * (float) log10( 2.0f ) * 10.0f; + } + else + { + hTdCngDec->last_shb_cng_ener = ( (float) idx_ener / 0.7f - 6.0f ) * (float) log10( 2.0f ) * 10.0f; + } + } + } + + /* SHB spectrum estimation */ + interp = ( (float) hTdCngDec->shb_dtx_count ) / 32; + interp = min( interp, 1.0f ); + for ( i = 0; i < LPC_SHB_ORDER; i++ ) + { + shb_lspCNG[i] = interp * hTdCngDec->lsp_shb_prev[i]; + shb_lspCNG[i] += ( 1 - interp ) * hTdCngDec->lsp_shb_prev_prev[i]; + } + + if ( hTdCngDec->shb_dtx_count < 1000 ) + { + hTdCngDec->shb_dtx_count++; + } + + lsp2a( shb_lpcCNG, shb_lspCNG, LPC_SHB_ORDER ); + shb_lpcCNG[0] = 1.0f; + + mvr2r( shb_lpcCNG, st->hTdCngDec->shb_lpcCNG, LPC_SHB_ORDER + 1 ); + + /* SHB energy estimation */ + wb_ener = 0.001f; + + if ( st->element_mode != IVAS_CPE_DFT ) + { + for ( i = 0; i < L_FRAME32k; i++ ) + { + wb_ener += synth[i] * synth[i]; + } + } + + wb_ener /= L_FRAME32k; + wb_ener = 10 * (float) log10( wb_ener ); + + if ( st->first_CNG == 0 ) + { + hTdCngDec->wb_cng_ener = wb_ener; + } + if ( fabs( wb_ener - hTdCngDec->wb_cng_ener ) > 12.0f ) + { + allow_cn_step = 1; + } + + if ( allow_cn_step == 1 ) + { + hTdCngDec->wb_cng_ener = wb_ener; + } + else + { + ftmp = wb_ener - hTdCngDec->wb_cng_ener; + hTdCngDec->wb_cng_ener += 0.9f * ftmp; + } + if ( st->core_brate == SID_2k40 && sid_bw == 1 && !st->bfi ) + { + hTdCngDec->last_wb_cng_ener = hTdCngDec->wb_cng_ener; + + if ( st->first_CNG == 0 ) + { + hTdCngDec->shb_cng_ener = hTdCngDec->last_shb_cng_ener; + } + } + + gain = hTdCngDec->wb_cng_ener - hTdCngDec->last_wb_cng_ener; + if ( gain > 15 ) + { + gain = 15; + } + step = gain + hTdCngDec->last_shb_cng_ener - hTdCngDec->shb_cng_ener; + if ( allow_cn_step == 1 || st->last_core_brate > SID_2k40 ) + { + hTdCngDec->shb_cng_ener += step; + } + else + { + hTdCngDec->shb_cng_ener += 0.25f * step; + } + /* generate white noise excitation */ + for ( i = 0; i < L_FRAME16k; i++ ) + { + excTmp[i] = (float) own_random( &hTdCngDec->swb_cng_seed ); + } + + /* synthesis filtering */ + syn_filt( shb_lpcCNG, LPC_SHB_ORDER, excTmp, excSHB, L_FRAME16k, st->hBWE_TD->state_lpc_syn, 1 ); + + /* synthesis signal gain shaping */ + ener_excSHB = 0.001f; + for ( i = 0; i < L_FRAME16k; i++ ) + { + ener_excSHB += excSHB[i] * excSHB[i]; + } + + if ( st->last_vad == 1 ) + { + if ( hTdCngDec->burst_cnt > 3 && st->last_core != HQ_CORE ) + { + hTdCngDec->trans_cnt = 5; + } + else + { + hTdCngDec->trans_cnt = 0; + } + } + + if ( hTdCngDec->trans_cnt > 0 ) + { + i = (int16_t) ( (float) hTdCngDec->trans_cnt / 15.0f * 255 ); + ener = hTdCngDec->shb_cng_ener + sin_table256[i] * ( hTdCngDec->last_shb_ener - hTdCngDec->shb_cng_ener ); + hTdCngDec->trans_cnt--; + } + else + { + ener = hTdCngDec->shb_cng_ener; + } + + + gain = (float) sqrt( pow( 10, 0.1f * ener ) * L_FRAME16k / ener_excSHB ); + + st->hTdCngDec->shb_cng_gain = ener; + + for ( i = 0; i < L_FRAME16k; i++ ) + { + shb_syn16k[i] = gain * excSHB[i]; + } + + /* generate 32kHz SHB signal (12.8 - 14.4kHz) from 12.8kHz signal */ + GenSHBSynth( shb_syn16k, shb_synth, st->hBWE_TD->genSHBsynth_Hilbert_Mem, st->hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local, st->L_frame, &( st->hBWE_TD->syn_dm_phase ) ); + + if ( st->output_Fs == 48000 ) + { + interpolate_3_over_2_allpass( shb_synth, L_FRAME32k, shb_synth, hTdCngDec->interpol_3_2_cng_dec ); + } + + ResetSHBbuffer_Dec( st->hBWE_TD, st->extl ); + + return; +} + + +/*-------------------------------------------------------------------* + * td_cng_dec_init() + * + * + *-------------------------------------------------------------------*/ + +void td_cng_dec_init( + DEC_CORE_HANDLE st /* i/o: decoder state structure */ +) +{ + int16_t i; + TD_CNG_DEC_HANDLE hTdCngDec; + + hTdCngDec = st->hTdCngDec; + + hTdCngDec->cng_seed = RANDOM_INITSEED; + hTdCngDec->cng_ener_seed = RANDOM_INITSEED; + hTdCngDec->cng_ener_seed1 = RANDOM_INITSEED; + hTdCngDec->old_enr_index = -1; + hTdCngDec->Enew = 0.0f; + mvr2r( st->lsp_old, st->lspCNG, M ); + hTdCngDec->last_allow_cn_step = 0; + hTdCngDec->shb_cng_ener = -6.02f; + if ( st->element_mode != EVS_MONO ) + { + set_f( hTdCngDec->shb_lpcCNG, 0.0f, LPC_SHB_ORDER + 1 ); + hTdCngDec->shb_lpcCNG[0] = 1.0f; + hTdCngDec->shb_cng_gain = -82.0; /* a dB value approximately corresponding to shb index 0(used as index -15) */ + } + + hTdCngDec->wb_cng_ener = -6.02f; + hTdCngDec->last_wb_cng_ener = -6.02f; + hTdCngDec->last_shb_cng_ener = -6.02f; + hTdCngDec->swb_cng_seed = RANDOM_INITSEED; + hTdCngDec->ho_hist_ptr = -1; + hTdCngDec->ho_sid_bw = 0; + set_f( hTdCngDec->ho_lsp_hist, 0, HO_HIST_SIZE * M ); + set_f( hTdCngDec->ho_ener_hist, 0, HO_HIST_SIZE ); + set_f( hTdCngDec->ho_env_hist, 0, HO_HIST_SIZE * NUM_ENV_CNG ); + hTdCngDec->ho_hist_size = 0; + hTdCngDec->act_cnt = 0; + hTdCngDec->ho_circ_ptr = -1; + set_f( hTdCngDec->ho_lsp_circ, 0, HO_HIST_SIZE * M ); + set_f( hTdCngDec->ho_ener_circ, 0, HO_HIST_SIZE ); + set_f( hTdCngDec->ho_env_circ, 0, HO_HIST_SIZE * NUM_ENV_CNG ); + hTdCngDec->ho_circ_size = 0; + + set_s( hTdCngDec->ho_16k_lsp, 0, HO_HIST_SIZE ); + st->CNG_mode = -1; + hTdCngDec->act_cnt2 = 0; + hTdCngDec->num_ho = 0; + set_f( hTdCngDec->lp_env, 0.0f, NUM_ENV_CNG ); + set_f( hTdCngDec->exc_mem, 0.0f, 24 ); + set_f( hTdCngDec->exc_mem1, 0.0f, 30 ); + set_f( hTdCngDec->old_env, 0.0f, NUM_ENV_CNG ); + + for ( i = 0; i < LPC_SHB_ORDER; i++ ) + { + if ( st->element_mode != EVS_MONO ) + { + hTdCngDec->lsp_shb_prev[i] = 0.5f * ( (float) ( i + 1 ) ) / ( (float) ( LPC_SHB_ORDER + 1 ) ); + } + else + { + hTdCngDec->lsp_shb_prev[i] = 0.5f * ( (float) i ) / ( (float) LPC_SHB_ORDER ); + } + hTdCngDec->lsp_shb_prev_prev[i] = hTdCngDec->lsp_shb_prev[i]; + } + + hTdCngDec->shb_dtx_count = 0; + hTdCngDec->trans_cnt = 0; + hTdCngDec->burst_cnt = 0; + + hTdCngDec->last_shb_ener = 0.001f; + + + set_f( hTdCngDec->interpol_3_2_cng_dec, 0.0f, INTERP_3_2_MEM_LEN ); + + return; +} diff --git a/lib_dec/core_dec_init.c b/lib_dec/core_dec_init.c new file mode 100644 index 0000000000000000000000000000000000000000..eed6fc8c0f93887bb08668142ed37a78d12ff0cd --- /dev/null +++ b/lib_dec/core_dec_init.c @@ -0,0 +1,812 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "stat_com.h" +#include "cnst.h" +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*-----------------------------------------------------------------------* + * open_decoder_LPD() + * + * Initialization of state variables + *-----------------------------------------------------------------------*/ + +void open_decoder_LPD( + Decoder_State *st, /* i/o: decoder state structure */ + const int32_t total_brate, /* i : total bitrate */ + const int32_t last_total_brate, /* i : last total bitrate */ + const int16_t bwidth, /* i : audio bandwidth */ + const int16_t MCT_flag, /* i : hMCT handle allocated (1) or not (0) */ + const int16_t last_element_mode, /* i : last element mode */ + const int16_t is_init /* i : indicate call during initialization */ +) +{ + int16_t i; + int16_t mem_syn_r_size_old; + int16_t mem_syn_r_size_new; + int16_t fscaleFB; + int16_t encoderLookahead, encoderLookaheadFB; + TCX_LTP_DEC_HANDLE hTcxLtpDec = st->hTcxLtpDec; + TCX_DEC_HANDLE hTcxDec = st->hTcxDec; + + if ( st->codec_mode != MODE1 ) /*already updated in MODE1*/ + { + st->fscale_old = st->fscale; + } + + st->sr_core = getCoreSamplerateMode2( st->element_mode, total_brate, bwidth, st->flag_ACELP16k, st->rf_flag, st->is_ism_format ); + st->fscale = sr2fscale( st->sr_core ); + fscaleFB = sr2fscale( st->output_Fs ); + + /* initializing variables for frame lengths etc. right in the beginning */ + st->L_frame = (int16_t) ( st->sr_core / FRAMES_PER_SEC ); + if ( st->ini_frame == 0 ) + { + st->last_L_frame = st->L_frame_past = st->L_frame; + } + if ( st->hTcxDec != NULL ) + { + st->hTcxDec->L_frameTCX = (int16_t) ( st->output_Fs / FRAMES_PER_SEC ); + if ( st->ini_frame == 0 ) + { + st->L_frameTCX_past = st->hTcxDec->L_frameTCX; + } + } + + st->tcxonly = getTcxonly( st->element_mode, total_brate, MCT_flag, st->is_ism_format ); + + /* the TD TCX PLC in MODE1 still runs with 80ms subframes */ + if ( ( st->element_mode == EVS_MONO && st->L_frame == L_FRAME16k && total_brate <= ACELP_32k ) || ( st->element_mode > EVS_MONO && st->L_frame == L_FRAME16k && total_brate <= MAX_ACELP_BRATE ) || ( st->tcxonly && ( st->sr_core == 32000 || st->sr_core == 16000 ) ) ) + { + st->nb_subfr = NB_SUBFR16k; + } + else + { + st->nb_subfr = NB_SUBFR; + } + st->bits_frame = (int16_t) ( ( (float) st->L_frame / (float) st->fscale ) * (float) FSCALE_DENOM / 128.0f * (float) total_brate / 100.0f + 0.49f ); + + st->TcxBandwidth = getTcxBandwidth( bwidth ); + st->narrowBand = ( bwidth == NB ) ? 1 : 0; + encoderLookahead = ( L_LOOK_12k8 * st->fscale ) / FSCALE_DENOM; + encoderLookaheadFB = ( L_LOOK_12k8 * fscaleFB ) / FSCALE_DENOM; + + if ( st->element_mode == IVAS_CPE_MDCT ) + { + st->pit_res_max = initPitchLagParameters( 12800, &st->pit_min, &st->pit_fr1, &st->pit_fr1b, &st->pit_fr2, &st->pit_max ); + hTcxDec->pit_max_TCX = (int16_t) ( st->pit_max * st->output_Fs / 12800 ); + hTcxDec->pit_min_TCX = (int16_t) ( st->pit_min * st->output_Fs / 12800 ); + } + else + { + st->pit_res_max = initPitchLagParameters( st->sr_core, &st->pit_min, &st->pit_fr1, &st->pit_fr1b, &st->pit_fr2, &st->pit_max ); + if ( hTcxDec != NULL ) + { + hTcxDec->pit_max_TCX = (int16_t) ( st->pit_max * st->output_Fs / st->sr_core ); + hTcxDec->pit_min_TCX = (int16_t) ( st->pit_min * st->output_Fs / st->sr_core ); + } + } + + if ( st->ini_frame == 0 ) + { + st->pit_res_max_past = st->pit_res_max; + } + + /*Preemphasis param*/ + if ( st->fscale < ( 16000 * FSCALE_DENOM ) / 12800 ) + { + st->preemph_fac = PREEMPH_FAC; /*NB*/ + } + else if ( st->fscale < ( 24000 * FSCALE_DENOM ) / 12800 ) + { + st->preemph_fac = PREEMPH_FAC_16k; /*WB*/ + } + else + { + st->preemph_fac = PREEMPH_FAC_SWB; /*SWB*/ + } + + if ( st->sr_core == INT_FS_16k ) + { + st->gamma = GAMMA16k; + } + else if ( st->sr_core > INT_FS_16k && st->element_mode == IVAS_CPE_MDCT ) + { + st->gamma = GAMMA16k; + } + else + { + st->gamma = GAMMA1; + } + + /* LPC quantization */ + if ( st->sr_core <= INT_FS_16k && st->tcxonly == 0 ) + { + st->lpcQuantization = 1; + } + else + { + st->lpcQuantization = 0; + } + + if ( st->tcxonly == 0 ) + { + st->numlpc = 1; + } + else + { + st->numlpc = 2; + } + + /* Initialize TBE */ + st->prev_coder_type = GENERIC; + if ( st->hBWE_TD != NULL ) + { + set_f( st->hBWE_TD->prev_lsf_diff, 0.5f, LPC_SHB_ORDER - 2 ); + st->hBWE_TD->prev_tilt_para = 0.0f; + set_zero( st->hBWE_TD->cur_sub_Aq, M + 1 ); + } + + if ( st->hIGFDec != NULL ) + { + if ( !is_init || st->element_mode != IVAS_CPE_MDCT ) + { + init_tcx_cfg( st->hTcxCfg, total_brate, st->sr_core, st->output_Fs, st->L_frame, st->bwidth, st->hTcxDec->L_frameTCX, st->fscale, encoderLookahead, encoderLookaheadFB, st->preemph_fac, st->tcxonly, st->rf_flag, st->igf, st->hIGFDec->infoIGFStopFreq, st->element_mode, st->ini_frame, MCT_flag ); + } + else + { + st->hTcxCfg->tcx_curr_overlap_mode = st->hTcxCfg->tcx_last_overlap_mode = ALDO_WINDOW; + st->hTcxCfg->last_aldo = 1; + } + } + + if ( st->hTECDec != NULL ) + { + resetTecDec( st->hTECDec ); + } + + if ( st->element_mode != IVAS_SCE ) + { + st->flag_cna = 0; + } + if ( st->ini_frame == 0 ) + { + st->flag_cna = 0; + st->last_flag_cna = 0; + } + + /* Static vectors to zero */ + if ( st->ini_frame == 0 ) + { + st->last_is_cng = 0; + + st->rate_switching_reset = 0; + + if ( st->hTcxDec != NULL ) + { + reset_tcx_overl_buf( st->hTcxDec ); + + set_zero( st->hTcxDec->syn_OverlFB, L_FRAME_MAX / 2 ); + set_zero( st->hTcxDec->old_synth, OLD_SYNTH_INTERNAL_DEC ); + + set_zero( st->hTcxDec->synth_history, L_PROT48k + L_FRAME_MAX ); + } + + set_zero( st->syn, M + 1 ); + + set_zero( st->mem_syn_r, L_SYN_MEM ); + + mem_syn_r_size_old = 0; /* just to avoid MSVC warnings */ + mem_syn_r_size_new = 0; /* just to avoid MSVC warnings */ + + st->con_tcx = 0; + } + else + { + /* Reset old_synth in case of core sampling rate switching and Mode 1/2 switching*/ + if ( st->hTcxDec != NULL && ( ( st->L_frame != st->last_L_frame ) || ( st->last_codec_mode == MODE1 && st->element_mode == EVS_MONO ) ) ) + { + set_zero( st->hTcxDec->old_synth, OLD_SYNTH_INTERNAL_DEC ); + } + + /*Compute size of old and new memories*/ + mem_syn_r_size_old = (int16_t) ( 1.25 * st->last_L_frame / 20.f ); + mem_syn_r_size_new = (int16_t) ( 1.25 * st->L_frame / 20.f ); + + /*Reset LPC mem*/ + if ( ( st->L_frame != st->last_L_frame ) || ( st->last_core == AMR_WB_CORE ) || ( st->last_core == HQ_CORE ) ) + { + set_zero( st->mem_MA, M ); + if ( st->sr_core == INT_FS_16k ) + { + mvr2r( GEWB2_Ave, st->mem_AR, M ); + } + else + { + mvr2r( GEWB_Ave, st->mem_AR, M ); + } + } + + /*Mode 1/2 switching*/ + if ( st->last_codec_mode == MODE1 && st->element_mode == EVS_MONO ) + { + mvr2r( st->lsp_old, st->lspold_uw, M ); + mvr2r( st->lsf_old, st->lsfold_uw, M ); + set_zero( st->syn, M ); + } + if ( st->last_core == AMR_WB_CORE ) + { + st->last_core = ACELP_CORE; + st->last_core_bfi = ACELP_CORE; + } + + if ( ( ( st->element_mode != IVAS_CPE_DFT ) || ( st->element_mode == IVAS_CPE_DFT && st->prev_bfi ) ) && st->last_codec_mode == MODE1 && st->last_core == ACELP_CORE ) + { + /* Switching from Mode 1 ACELP */ + st->last_core_bfi = ACELP_CORE; + acelp_plc_mdct_transition( st ); + } + + if ( st->last_codec_mode == MODE2 && + st->L_frame != st->last_L_frame && + ( ( st->m_frame_type == SID_FRAME && st->last_core > ACELP_CORE ) || + ( st->last_core > ACELP_CORE && st->core > ACELP_CORE ) || st->prev_bfi ) ) + { + lerp( st->hHQ_core->old_outLB, st->hHQ_core->old_outLB, st->L_frame, st->last_L_frame ); + } + + /* Rate switching */ + if ( st->last_codec_mode == MODE1 && st->last_core == HQ_CORE ) + { + /* Switching from MDCT */ + + /*Reset of ACELP memories*/ + st->rate_switching_reset = 1; + st->tilt_code = TILT_CODE; + set_zero( st->old_exc, L_EXC_MEM_DEC ); + set_zero( st->syn, 1 + M ); + set_zero( st->mem_syn2, M ); + + /*OLA -> zero */ + if ( st->hTcxDec != NULL ) + { + reset_tcx_overl_buf( st->hTcxDec ); + } + + if ( st->hTcxCfg != NULL ) + { + mvr2r( st->hHQ_core->old_out + NS2SA( st->output_Fs, N_ZERO_MDCT_NS ), st->hTcxDec->syn_OverlFB, st->hTcxCfg->tcx_mdct_window_lengthFB ); + st->hTcxCfg->last_aldo = 1; /*It was previously ALDO*/ + st->hTcxCfg->tcx_curr_overlap_mode = ALDO_WINDOW; + } + + /*OLA for Mode 2 TCX always reset in Mode switching cases*/ + if ( st->hHQ_core != NULL ) + { + set_f( st->hHQ_core->old_outLB, 0, st->L_frame ); + } + + st->last_core_bfi = TCX_20_CORE; + + if ( st->hPFstat != NULL ) + { + st->hPFstat->on = 0; + } + + /* reset CLDFB memories */ + cldfb_reset_memory( st->cldfbAna ); + cldfb_reset_memory( st->cldfbBPF ); + cldfb_reset_memory( st->cldfbSyn ); + if ( st->cldfbSynHB != NULL ) + { + cldfb_reset_memory( st->cldfbSynHB ); + } + } + else if ( ( st->L_frame != st->last_L_frame ) && ( st->L_frame <= L_FRAME16k ) && ( st->last_L_frame <= L_FRAME16k ) ) /* Rate switching between 12.8 and 16 kHz*/ + { + /*Interpolation of ACELP memories*/ + + /* convert quantized LSP vector */ + st->rate_switching_reset = lsp_convert_poly( st->lsp_old, st->L_frame, 0 ); + lsp2a_stab( st->lsp_old, st->old_Aq_12_8, M ); + + lsp2lsf( st->lsp_old, st->lsf_old, M, st->sr_core ); + mvr2r( st->lsp_old, st->lspold_uw, M ); + mvr2r( st->lsf_old, st->lsfold_uw, M ); + + if ( !st->last_con_tcx ) + { + synth_mem_updt2( st->L_frame, st->last_L_frame, st->old_exc, st->mem_syn_r, st->mem_syn2, NULL, DEC ); + } + + /*mem of deemphasis stayed unchanged.*/ + } + else if ( st->L_frame != st->last_L_frame ) /* Rate switching involving TCX only modes */ + { + /*Partial reset of ACELP memories*/ + st->rate_switching_reset = 1; + + /*reset partly some memories*/ + st->tilt_code = TILT_CODE; + if ( !st->last_con_tcx ) + { + set_zero( st->old_exc, L_EXC_MEM_DEC ); + } + set_zero( st->old_Aq_12_8, M + 1 ); + + /*Resamp others memories*/ + /*Size of LPC syn memory*/ + lerp( st->mem_syn_r + L_SYN_MEM - mem_syn_r_size_old, st->mem_syn_r + L_SYN_MEM - mem_syn_r_size_new, mem_syn_r_size_new, mem_syn_r_size_old ); + mvr2r( st->mem_syn_r + L_SYN_MEM - M, st->mem_syn2, M ); + } + /* update of lsf_old only needed in BASOP */ + /* else if( !st->tcxonly && (st->L_frame == L_FRAME16k) && (st->last_total_brate > ACELP_32k) ) */ + /* { */ + /* lsp2lsf( st->lsp_old, st->lsf_old, M, st->sr_core ); */ + /* } */ + } + + if ( st->last_bwidth == NB && st->bwidth != NB && st->ini_frame != 0 ) + { + st->rate_switching_reset = 1; + } + + if ( st->hTcxDec != NULL ) + { + st->hTcxDec->old_synth_len = 2 * st->L_frame; + st->hTcxDec->old_synth_lenFB = 2 * st->hTcxDec->L_frameTCX; + } + + /* bass pf reset */ + st->bpf_gain_param = 0; + if ( st->hBPF != NULL ) + { + set_f( st->hBPF->pst_old_syn, 0, NBPSF_PIT_MAX ); + } + + /* Formant postfilter */ + if ( st->ini_frame == 0 ) + { + /* do nothing */ + } + else if ( st->last_codec_mode == MODE2 ) + { + if ( !st->tcxonly ) + { + if ( st->hPFstat->on ) + { + lerp( st->hPFstat->mem_stp + L_SYN_MEM - mem_syn_r_size_old, st->hPFstat->mem_stp + L_SYN_MEM - mem_syn_r_size_new, mem_syn_r_size_new, mem_syn_r_size_old ); + lerp( st->hPFstat->mem_pf_in + L_SYN_MEM - mem_syn_r_size_old, st->hPFstat->mem_pf_in + L_SYN_MEM - mem_syn_r_size_new, mem_syn_r_size_new, mem_syn_r_size_old ); + } + else + { + set_zero( st->hPFstat->mem_stp, L_SYN_MEM ); + set_zero( st->hPFstat->mem_pf_in, L_SYN_MEM ); + st->hPFstat->reset = 1; + st->hPFstat->gain_prec = 1.f; + } + } + else if ( st->hPFstat->on ) + { + lerp( st->hPFstat->mem_stp + L_SYN_MEM - mem_syn_r_size_old, st->hPFstat->mem_stp + L_SYN_MEM - mem_syn_r_size_new, mem_syn_r_size_new, mem_syn_r_size_old ); + lerp( st->hPFstat->mem_pf_in + L_SYN_MEM - mem_syn_r_size_old, st->hPFstat->mem_pf_in + L_SYN_MEM - mem_syn_r_size_new, mem_syn_r_size_new, mem_syn_r_size_old ); + } + } + else + { + /*codec mode switching*/ + + /*reset post-filter except for Narrowband*/ + if ( ( (int16_t) ( st->output_Fs / FRAMES_PER_SEC ) ) != L_FRAME8k ) + { + if ( st->hPFstat != NULL ) + { + st->hPFstat->reset = 1; + if ( st->hPFstat->on != 0 ) + { + st->hPFstat->reset = 0; + lerp( st->hPFstat->mem_stp + L_SYN_MEM - mem_syn_r_size_old, st->hPFstat->mem_stp + L_SYN_MEM - mem_syn_r_size_new, mem_syn_r_size_new, mem_syn_r_size_old ); + lerp( st->hPFstat->mem_pf_in + L_SYN_MEM - mem_syn_r_size_old, st->hPFstat->mem_pf_in + L_SYN_MEM - mem_syn_r_size_new, mem_syn_r_size_new, mem_syn_r_size_old ); + } + } + } + else + { + /*feed last value old_synth as it is used for pre-emphasis mem*/ + if ( st->hTcxDec != NULL ) + { + st->hTcxDec->old_synth[st->hTcxDec->old_synth_len - 1] = st->syn[M]; + } + if ( st->hBPF != NULL ) + { + st->hBPF->pst_old_syn[NBPSF_PIT_MAX - 1] = st->syn[M]; + } + } + } + + /* lsf and lsp initialization */ + if ( st->ini_frame == 0 ) + { + mvr2r( st->lsp_old, st->lspold_uw, M ); + mvr2r( st->lsf_old, st->lsfold_uw, M ); + + set_zero( st->lsf_cng, M ); + } + + st->seed_tcx_plc = RANDOM_INITSEED; + st->past_gpit = 0.0f; + st->past_gcode = 0.0f; + st->gc_threshold = 0.0f; + + lsf2lsp( st->lsf_cng, st->lspold_cng, M, INT_FS_12k8 ); + lsp2a_stab( st->lspold_cng, st->Aq_cng, M ); + st->plcBackgroundNoiseUpdated = 0; + mvr2r( st->lsf_old, st->lsf_q_cng, M ); + mvr2r( st->lsf_old, st->old_lsf_q_cng, M ); + mvr2r( st->lsp_old, st->lsp_q_cng, M ); + mvr2r( st->lsp_old, st->old_lsp_q_cng, M ); + set_zero( st->mem_syn_unv_back, M ); + st->last_gain_syn_deemph = 1.f; + + if ( st->last_codec_mode == MODE1 || st->ini_frame == 0 ) + { + /* this assumes that MODE1 fades out in the frequency domain - + otherwise some data from MODE1 would be needed here */ + st->last_concealed_gain_syn_deemph = 1.f; + if ( hTcxDec != NULL ) + { + hTcxDec->conceal_eof_gain = 1.0f; + } + } + /* Post processing */ + set_zero( st->mem_Aq, NB_SUBFR16k * ( M + 1 ) ); + + st->lp_ener_bfi = 60.0f; + if ( st->ini_frame == 0 ) + { + st->prev_bfi = 0; + st->last_core_bfi = -1; + if ( st->hTcxDec != NULL ) + { + hTcxDec->tcxConceal_recalc_exc = 0; + } + } + st->prev_old_bfi = 0; + + if ( st->hTcxDec != NULL ) + { + st->hTcxDec->noise_filling_index[0] = st->hTcxDec->noise_filling_index[1] = 0; + st->hTcxDec->tnsActive[0] = st->hTcxDec->tnsActive[1] = 0; + set_f( st->hTcxDec->ltpGainMemory, 0.0f, N_LTP_GAIN_MEMS ); + } + + mvr2r( st->lsf_old, st->lsf_adaptive_mean, M ); + mvr2r( st->lsf_old, st->lsfoldbfi0, M ); + mvr2r( st->lsf_old, st->lsfoldbfi1, M ); + + st->clas_dec = UNVOICED_CLAS; + + if ( !st->last_con_tcx ) + { + st->old_enr_LP = 0.0f; /* LP filter E of last good voiced frame or local LP filter E in TD TCX PLC */ + } + + if ( st->prev_bfi ) + { + /* calculate energy at the end of the previous frame */ + if ( st->core == ACELP_CORE && st->last_core == HQ_CORE ) + { + fer_energy( st->hTcxDec->L_frameTCX, UNVOICED_CLAS, st->previoussynth, -1, &st->enr_old, 1 ); + } + } + else + { + st->last_good = UNVOICED_CLAS; /* last good received frame for concealment */ + st->enr_old = 0.0f; /* energy at the end of the previous frame */ + } + st->lp_gainc = 0.0f; + st->lp_gainp = 0.0f; + + if ( st->hTcxDec != NULL ) + { + st->hTcxDec->prev_widow_left_rect = 0; + + if ( is_init || MCT_flag || !( st->element_mode == IVAS_CPE_MDCT && st->element_mode == last_element_mode ) ) + { + st->hTcxDec->CngLevelBackgroundTrace_bfi = PLC_MIN_CNG_LEV; + st->hTcxDec->NoiseLevelIndex_bfi = PLC_MIN_STAT_BUFF_SIZE - 1; + st->hTcxDec->CurrLevelIndex_bfi = 0; + st->hTcxDec->LastFrameLevel_bfi = PLC_MIN_CNG_LEV; + set_f( st->hTcxDec->NoiseLevelMemory_bfi, PLC_MIN_CNG_LEV, PLC_MIN_STAT_BUFF_SIZE ); + + st->hTcxDec->cummulative_damping_tcx = 1.0f; + } + } + + st->cummulative_damping = 1.0f; + + for ( i = 0; i < 2 * NB_SUBFR16k + 2; i++ ) + { + st->old_pitch_buf[i] = (float) st->pit_min; + } + + for ( i = 0; i < 2 * NB_SUBFR16k + 2; i++ ) + { + st->mem_pitch_gain[i] = 1.f; + } + + st->old_fpitch = (float) st->pit_min; + + st->rate_switching_init = 1; + + st->reset_mem_AR = 0; + + /* For phase dispersion */ + set_zero( st->dispMem, 8 ); + + st->voice_fac = -1; /* purely unvoiced */ + + /* TCX-LTP */ + if ( hTcxLtpDec != NULL ) + { + tcxltp_dec_init( hTcxLtpDec, st->ini_frame, st->last_codec_mode, st->element_mode, st->pit_max, st->sr_core ); + } + + /* TCX */ + if ( hTcxDec != NULL ) + { + st->old_fpitchFB = (float) hTcxDec->pit_min_TCX; + + if ( st->ini_frame == 0 || ( st->last_codec_mode == MODE1 && st->element_mode == EVS_MONO ) ) + { + hTcxDec->tcxltp_last_gain_unmodified = 0.f; + } + + /* TCX */ + hTcxDec->tcx_lpc_shaped_ari = getTcxLpcShapedAri( total_brate, st->rf_flag, st->element_mode ); + + hTcxDec->envWeighted = 0; + } + + if ( st->hBPF != NULL ) + { + st->hBPF->pst_mem_deemp_err = 0.0f; + } + + if ( st->tcxonly ) + { + st->p_bpf_noise_buf = NULL; + } + else + { + st->p_bpf_noise_buf = st->bpf_noise_buf; + } + + if ( bwidth == SWB && ( total_brate == ACELP_16k40 || total_brate == ACELP_24k40 ) && st->element_mode == EVS_MONO ) + { + st->tec_tfa = 1; + } + else + { + st->tec_tfa = 0; + } + + st->tec_flag = 0; + st->tfa_flag = 0; + + /* needed in decoder to read the bitstream */ + st->enableGplc = 0; + + st->flagGuidedAcelp = 0; + st->tonal_mdct_plc_active = 0; + st->T0_4th = L_SUBFR; + st->guidedT0 = st->T0_4th; + + if ( st->hPlcInfo != NULL && total_brate >= HQ_48k && st->element_mode == EVS_MONO ) + { + st->enablePlcWaveadjust = 1; + + if ( st->hTcxDec != NULL && ( st->ini_frame == 0 || last_total_brate < HQ_48k || st->last_codec_mode == MODE1 || st->force_lpd_reset ) ) + { + concealment_init( st->hTcxDec->L_frameTCX, st->hPlcInfo ); + } + } + else + { + st->enablePlcWaveadjust = 0; + } + + /* PLC: [TCX: Tonal Concealment] */ + if ( st->hTonalMDCTConc != NULL && !( st->element_mode > EVS_MONO && st->ini_frame != 0 && st->hTonalMDCTConc->nSamples == st->hTcxDec->L_frameTCX ) ) + { + st->hTonalMDCTConc->nScaleFactors = 0; + st->hTonalMDCTConc->nSamples = 0; + st->hTonalMDCTConc->lastPcmOut = 0x0; + st->hTonalMDCTConc->lastBlockData.tonalConcealmentActive = 0; + st->hTonalMDCTConc->lastBlockData.nSamples = 0; + + TonalMDCTConceal_Init( st->hTonalMDCTConc, st->hTcxDec->L_frameTCX, st->L_frame, FDNS_NPTS, st->hTcxCfg ); + } + + st->last_tns_active = 0; + st->second_last_tns_active = 0; + st->second_last_core = -1; + + if ( st->hTcxCfg != NULL && + st->element_mode != EVS_MONO ) + { + st->hTcxCfg->fIsTNSAllowed = getTnsAllowed( is_init ? total_brate : st->bits_frame_nominal * FRAMES_PER_SEC, st->igf, st->element_mode ); + } + if ( hTcxDec != NULL ) + { + hTcxDec->tcxltp_second_last_pitch = st->old_fpitch; + hTcxDec->tcxltp_third_last_pitch = st->old_fpitch; + } + + if ( ( total_brate == ACELP_9k60 || total_brate == ACELP_16k40 || total_brate == ACELP_24k40 ) && st->element_mode == EVS_MONO ) + { + st->dec_glr = 1; + } + else + { + st->dec_glr = 0; + } + + st->dec_glr_idx = 0; + + st->VAD = 0; + if ( hTcxDec != NULL ) + { + hTcxDec->enableTcxLpc = 1; + + hTcxDec->old_gaintcx_bfi = 0.0f; + + hTcxDec->tcx_hm_LtpPitchLag = -1; + } + + if ( st->hTcxCfg != NULL ) + { + st->hTcxCfg->na_scale = 1.f; + } + + return; +} + +/*-----------------------------------------------------------------------* + * tcxltp_dec_init() + * + * Initialization TCX-LTP handle + *-----------------------------------------------------------------------*/ + +void tcxltp_dec_init( + TCX_LTP_DEC_HANDLE hTcxLtpDec, + const int16_t ini_frame, + const int16_t last_codec_mode, + const int16_t element_mode, + const int16_t pit_max, + const int32_t sr_core ) +{ + hTcxLtpDec->tcxltp_gain = 0.0f; + + hTcxLtpDec->tcxltp = getTcxLtp( sr_core ); + + if ( ini_frame == 0 || ( last_codec_mode == MODE1 && element_mode == EVS_MONO ) ) + { + + hTcxLtpDec->tcxltp_pitch_int = pit_max; + hTcxLtpDec->tcxltp_pitch_fr = 0; + + if ( ini_frame == 0 ) + { + set_f( hTcxLtpDec->tcxltp_mem_in, 0.0f, TCXLTP_MAX_DELAY ); + set_f( hTcxLtpDec->tcxltp_mem_out, 0.0f, L_FRAME48k ); + hTcxLtpDec->tcxltp_pitch_int_post_prev = 0; + hTcxLtpDec->tcxltp_pitch_fr_post_prev = 0; + hTcxLtpDec->tcxltp_gain_post_prev = 0.f; + hTcxLtpDec->tcxltp_filt_idx_prev = -1; + } + } + + return; +} + +/*-----------------------------------------------------------------------* + * reset_tcx_overl_buf() + * + * Reset TCX core overlap buffers + *-----------------------------------------------------------------------*/ + +void reset_tcx_overl_buf( + TCX_DEC_HANDLE hTcxDec /* i/o: TCX decoder handle */ +) +{ + set_zero( hTcxDec->old_syn_Overl, L_FRAME32k / 2 ); + set_zero( hTcxDec->syn_Overl_TDAC, L_FRAME32k / 2 ); + set_zero( hTcxDec->syn_Overl, L_FRAME32k / 2 ); + set_zero( hTcxDec->syn_Overl_TDACFB, L_FRAME_MAX / 2 ); + + return; +} + + +/*-----------------------------------------------------------------------* + * acelp_plc_mdct_transition() + * + * Prepare MDCT OLA memories in TCX/HQ after ACELP PLC + *-----------------------------------------------------------------------*/ + +void acelp_plc_mdct_transition( + Decoder_State *st /* i/o: Decoder state */ +) +{ + float *w; + int16_t W1, nz, delay_comp; + int16_t i; + + /*PLC*/ + if ( st->prev_bfi != 0 && st->hTcxCfg != NULL ) + { + W1 = st->hTcxCfg->tcx_mdct_window_lengthFB; + w = st->hTcxCfg->tcx_mdct_windowFB; + + nz = NS2SA( st->output_Fs, N_ZERO_MDCT_NS ); + delay_comp = NS2SA( st->output_Fs, DELAY_CLDFB_NS ); /*CLDFB delay*/ + + mvr2r( st->hHQ_core->fer_samples + delay_comp, st->hTcxDec->syn_OverlFB, st->hTcxDec->L_frameTCX / 2 ); + lerp( st->hHQ_core->fer_samples + delay_comp, st->hTcxDec->syn_Overl, st->L_frame / 2, st->hTcxDec->L_frameTCX / 2 ); /*ACELP(bfi)->TCX(rect)*/ + /*old_out needed for MODE1 routine and syn_Overl_TDAC for MODE2 routine*/ + set_f( st->hHQ_core->old_out, 0, nz ); + mvr2r( st->hHQ_core->fer_samples + delay_comp, st->hHQ_core->old_out + nz, W1 ); + + for ( i = 0; i < W1; i++ ) + { + st->hHQ_core->old_out[i + nz] *= w[W1 - 1 - i] * w[W1 - 1 - i]; + } + set_f( &st->hHQ_core->old_out[W1 + nz], 0, nz ); + + lerp( st->hHQ_core->old_out, st->hHQ_core->old_outLB, st->L_frame, st->hTcxDec->L_frameTCX ); + + mvr2r( st->hHQ_core->old_out + nz, st->hTcxDec->syn_Overl_TDACFB, st->hTcxDec->L_frameTCX / 2 ); + nz = NS2SA( st->sr_core, N_ZERO_MDCT_NS ); + mvr2r( st->hHQ_core->old_outLB + nz, st->hTcxDec->syn_Overl_TDAC, st->L_frame / 2 ); + } + + return; +} diff --git a/lib_dec/core_dec_reconf.c b/lib_dec/core_dec_reconf.c new file mode 100644 index 0000000000000000000000000000000000000000..ffbcfca95f167083aae90d3f3bb288587da28987 --- /dev/null +++ b/lib_dec/core_dec_reconf.c @@ -0,0 +1,192 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "prot.h" +#include "rom_com.h" +#include "rom_dec.h" +#include "wmc_auto.h" + +/*---------------------------------------------------------------------* + * reconfig_decoder_LPD() + * + * + *---------------------------------------------------------------------*/ + +void reconfig_decoder_LPD( + Decoder_State *st, /* i/o: decoder state structure */ + const int16_t bits_frame, /* i : bit budget */ + const int16_t bwidth, /* i : audio bandwidth */ + const int32_t total_brate, /* i : total bitrate */ + const int16_t L_frame_old /* i : frame length */ +) +{ + int16_t i; + uint16_t newLen, oldLen; + TCX_LTP_DEC_HANDLE hTcxLtpDec = st->hTcxLtpDec; + TCX_DEC_HANDLE hTcxDec = st->hTcxDec; + + st->bits_frame = bits_frame; + + if ( bwidth == NB ) + { + st->narrowBand = 1; + } + else if ( bwidth > NB ) + { + st->narrowBand = 0; + } + + BITS_ALLOC_init_config_acelp( st->total_brate, st->narrowBand, st->nb_subfr, &( st->acelp_cfg ) ); + + /*Configuration of partial copy*/ + st->acelp_cfg_rf.mode_index = 1; + st->acelp_cfg_rf.midLpc = 0; + st->acelp_cfg_rf.midLpc_enable = 0; + st->acelp_cfg_rf.pre_emphasis = 0; + st->acelp_cfg_rf.formant_enh = 1; + st->acelp_cfg_rf.formant_tilt = 1; + st->acelp_cfg_rf.voice_tilt = 1; + st->acelp_cfg_rf.formant_enh_num = FORMANT_SHARPENING_G1; + st->acelp_cfg_rf.formant_enh_den = FORMANT_SHARPENING_G2; + + if ( st->element_mode != IVAS_SCE ) + { + st->flag_cna = getCnaPresent( st->element_mode, st->element_brate, total_brate, bwidth ); + } + + /* TCX-LTP */ + if ( hTcxLtpDec != NULL ) + { + hTcxLtpDec->tcxltp = getTcxLtp( st->sr_core ); + } + + /*Scale TCX for non-active frames to adjust loudness with ACELP*/ + if ( st->hTcxCfg != NULL ) + { + st->hTcxCfg->na_scale = 1.f; + + if ( bwidth < SWB && !( st->tcxonly ) ) + { + for ( i = 0; i < SIZE_SCALE_TABLE_TCX; i++ ) + { + if ( ( bwidth == scaleTcxTable[i].bwmode ) && + ( total_brate >= scaleTcxTable[i].bitrateFrom ) && + ( total_brate < scaleTcxTable[i].bitrateTo ) ) + { + if ( st->rf_flag ) + { + i--; + } + st->hTcxCfg->na_scale = scaleTcxTable[i].scale; + break; + } + } + } + } + + /*if its not the first frame resample overlap buffer to new sampling rate */ + if ( st->ini_frame != 0 ) + { + if ( st->hTcxCfg != NULL && st->fscale != st->fscale_old && !( st->element_mode == EVS_MONO && st->last_codec_mode == MODE1 && st->last_core == ACELP_CORE && st->prev_bfi != 0 ) ) + /* no resempling is needed here when recovering from mode 1 + ACELP PLC, since the buffers are already sampled with the + correct sampling rate in open_decoder_LPD() */ + { + newLen = st->hTcxCfg->tcx_mdct_window_length; + oldLen = st->hTcxCfg->tcx_mdct_window_length_old; + + if ( ( st->prev_bfi && st->last_core_bfi == ACELP_CORE ) || st->last_core == ACELP_CORE ) + { + newLen = st->L_frame / 2; + oldLen = L_frame_old / 2; + } + + if ( st->hTcxDec != NULL ) + { + lerp( st->hTcxDec->old_syn_Overl, st->hTcxDec->old_syn_Overl, newLen, oldLen ); + lerp( st->hTcxDec->syn_Overl, st->hTcxDec->syn_Overl, newLen, oldLen ); + + if ( st->prev_bfi && st->last_core_bfi == ACELP_CORE ) + { + lerp( st->hTcxDec->syn_Overl_TDAC, st->hTcxDec->syn_Overl_TDAC, newLen, oldLen ); + } + } + } + + if ( st->L_frame <= L_FRAME16k ) + { + if ( st->last_L_frame <= L_FRAME16k ) + { + if ( st->L_frame != st->last_L_frame ) + { + if ( st->L_frame > st->last_L_frame ) + { + oldLen = L_SYN_MEM_CLAS_ESTIM * st->last_L_frame / st->L_frame; + newLen = L_SYN_MEM_CLAS_ESTIM; + } + else + { + oldLen = L_SYN_MEM_CLAS_ESTIM; + newLen = L_SYN_MEM_CLAS_ESTIM * st->L_frame / st->last_L_frame; + } + lerp( &st->mem_syn_clas_estim[L_SYN_MEM_CLAS_ESTIM - oldLen], &st->mem_syn_clas_estim[L_SYN_MEM_CLAS_ESTIM - newLen], newLen, oldLen ); + } + } + else + { + set_zero( st->mem_syn_clas_estim, L_SYN_MEM_CLAS_ESTIM ); + } + } + } + + if ( st->element_mode > IVAS_SCE ) + { + hTcxDec->enableTcxLpc = ( st->numlpc == 1 ) && ( st->lpcQuantization == 1 ) && ( total_brate <= LOWRATE_TCXLPC_MAX_BR_CPE || st->rf_flag ); + } + else + { + hTcxDec->enableTcxLpc = ( st->numlpc == 1 ) && ( st->lpcQuantization == 1 ) && ( total_brate <= LOWRATE_TCXLPC_MAX_BR || st->rf_flag ); + } + + if ( st->ini_frame == 0 ) + { + hTcxDec->envWeighted = 0; + } + + return; +} diff --git a/lib_dec/core_dec_switch.c b/lib_dec/core_dec_switch.c new file mode 100644 index 0000000000000000000000000000000000000000..d093afc3dac3e7333651688e12a8dd80f25c4883 --- /dev/null +++ b/lib_dec/core_dec_switch.c @@ -0,0 +1,223 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include "options.h" +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------* + * mode_switch_decoder_LPD() + * + * + *-------------------------------------------------------------*/ + +void mode_switch_decoder_LPD( + Decoder_State *st, /* i/o: decoder state structure */ + const int16_t bwidth, /* i : audio bandwidth */ + const int32_t total_brate, /* i : total bitrate */ + const int32_t last_total_brate, /* i : last frame total bitrate */ + const int16_t frame_size_index, /* i : index determining the frame size */ + const int16_t MCT_flag, /* i : hMCT handle allocated (1) or not (0)*/ + const int16_t last_element_mode /* i : last element mode */ +) +{ + int16_t fscale, switchWB; + int32_t sr_core; + int16_t bSwitchFromAmrwbIO; + int16_t frame_size; + TCX_DEC_HANDLE hTcxDec = st->hTcxDec; + + switchWB = 0; + bSwitchFromAmrwbIO = 0; + if ( st->last_core == AMR_WB_CORE ) + { + bSwitchFromAmrwbIO = 1; + } + sr_core = getCoreSamplerateMode2( st->element_mode, total_brate, bwidth, st->flag_ACELP16k, st->rf_flag, st->is_ism_format ); + fscale = sr2fscale( sr_core ); + + /* set number of coded lines */ + st->hTcxCfg->tcx_coded_lines = getNumTcxCodedLines( bwidth ); + + if ( ( bwidth >= WB ) && ( fscale == ( FSCALE_DENOM * 16000 ) / 12800 ) && ( fscale == st->fscale ) ) + { + if ( ( ( total_brate > ACELP_32k ) && ( st->tcxonly == 0 ) ) || ( ( total_brate <= ACELP_32k ) && ( st->tcxonly == 1 ) ) ) + { + switchWB = 1; + } + } + + if ( st->last_L_frame > L_FRAME16k && total_brate <= ACELP_32k ) + { + switchWB = 1; /*force init when coming from MODE1*/ + } + + st->igf = getIgfPresent( st->element_mode, total_brate, bwidth, st->rf_flag ); + + if ( st->hIGFDec != NULL ) + { + st->hIGFDec->infoIGFStopFreq = -1; + } + + if ( st->igf && ( st->idchan == 0 || st->element_mode == IVAS_CPE_MDCT ) ) + { + /* switch IGF configuration */ + IGFDecSetMode( st->hIGFDec, total_brate, bwidth, st->element_mode, -1, -1, st->rf_flag ); + } + + if ( fscale != st->fscale || switchWB || bSwitchFromAmrwbIO || st->last_codec_mode == MODE1 || st->force_lpd_reset ) + { + open_decoder_LPD( st, total_brate, last_total_brate, bwidth, MCT_flag, last_element_mode, 0 ); + } + else + { + assert( fscale > ( FSCALE_DENOM / 2 ) ); + st->fscale_old = st->fscale; + st->fscale = fscale; + st->L_frame = (int16_t) ( st->sr_core / FRAMES_PER_SEC ); + if ( st->hTcxDec != NULL ) + { + st->hTcxDec->L_frameTCX = (int16_t) ( st->output_Fs / FRAMES_PER_SEC ); + } + + if ( st->hTcxCfg != NULL ) + { + st->hTcxCfg->ctx_hm = getCtxHm( st->element_mode, total_brate, st->rf_flag ); + st->hTcxCfg->resq = getResq( total_brate ); + } + + hTcxDec->tcx_lpc_shaped_ari = getTcxLpcShapedAri( total_brate, st->rf_flag, st->element_mode ); + + if ( bwidth == NB ) + { + st->narrowBand = 1; + } + else + { + st->narrowBand = 0; + } + st->TcxBandwidth = getTcxBandwidth( bwidth ); + + if ( st->hTcxCfg != NULL ) + { + st->hTcxCfg->pCurrentTnsConfig = NULL; + st->hTcxCfg->fIsTNSAllowed = getTnsAllowed( total_brate, st->igf, st->element_mode ); + } + + if ( st->hTcxCfg->fIsTNSAllowed && st->hIGFDec != NULL && st->hTcxCfg != NULL ) + { + InitTnsConfigs( bwidth, st->hTcxCfg->tcx_coded_lines, st->hTcxCfg->tnsConfig, st->hIGFDec->infoIGFStopFreq, total_brate, st->element_mode, MCT_flag ); + + SetAllowTnsOnWhite( st->hTcxCfg->tnsConfig, st->element_mode == IVAS_CPE_MDCT ); + } + } + + frame_size = FrameSizeConfig[frame_size_index].frame_net_bits; + reconfig_decoder_LPD( st, frame_size, bwidth, total_brate, st->last_L_frame ); + + if ( hTcxDec->envWeighted && !hTcxDec->enableTcxLpc ) + { + mvr2r( st->lspold_uw, st->lsp_old, M ); + mvr2r( st->lsfold_uw, st->lsf_old, M ); + hTcxDec->envWeighted = 0; + } + + /* update PLC LSF memories */ + lsp2lsf( st->lsp_old, st->lsfoldbfi1, M, st->sr_core ); + mvr2r( st->lsfoldbfi1, st->lsfoldbfi0, M ); + mvr2r( st->lsfoldbfi1, st->lsf_adaptive_mean, M ); + + if ( st->igf && st->hBWE_TD != NULL ) + { + /* reset TBE */ + if ( ( st->bwidth == WB && st->last_extl != WB_TBE ) || + ( st->bwidth == SWB && st->last_extl != SWB_TBE ) || + ( st->bwidth == FB && st->last_extl != FB_TBE ) ) + { + TBEreset_dec( st ); + } + else + { + set_f( st->hBWE_TD->state_lpc_syn, 0.0f, LPC_SHB_ORDER ); + set_f( st->hBWE_TD->state_syn_shbexc, 0.0f, L_SHB_LAHEAD ); + set_f( st->hBWE_TD->mem_stp_swb, 0.0f, LPC_SHB_ORDER ); + set_f( st->hBWE_TD->mem_zero_swb, 0, LPC_SHB_ORDER ); + st->hBWE_TD->gain_prec_swb = 1.0f; + } + } + + if ( bwidth == SWB && ( total_brate == ACELP_16k40 || total_brate == ACELP_24k40 ) && st->element_mode == EVS_MONO ) + { + if ( st->tec_tfa == 0 && st->hTECDec != NULL ) + { + set_zero( st->hTECDec->loBuffer, MAX_TEC_SMOOTHING_DEG ); + } + st->tec_tfa = 1; + } + else + { + st->tec_tfa = 0; + } + + st->tec_flag = 0; + st->tfa_flag = 0; + + /* needed in decoder to read the bitstream */ + if ( bwidth >= WB && total_brate == ACELP_24k40 && st->element_mode == EVS_MONO ) + { + st->enableGplc = 1; + } + else + { + st->enableGplc = 0; + } + + if ( ( total_brate == ACELP_9k60 || total_brate == ACELP_16k40 || total_brate == ACELP_24k40 ) && st->element_mode == EVS_MONO ) + { + st->dec_glr = 1; + } + else + { + st->dec_glr = 0; + } + + st->dec_glr_idx = 0; + + return; +} diff --git a/lib_dec/core_switching_dec.c b/lib_dec/core_switching_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..2625d59a63fc4f7e12dee257e97646653d936c13 --- /dev/null +++ b/lib_dec/core_switching_dec.c @@ -0,0 +1,1309 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "ivas_cnst.h" +#include "wmc_auto.h" + +/*---------------------------------------------------------------------* + * Local prototypes + *---------------------------------------------------------------------*/ + +static void core_switch_lb_upsamp( Decoder_State *st, float *output ); +static void smoothTransitionDtxToTcx( float synth[], const int16_t output_frame, const int16_t delay_comp ); + +/*---------------------------------------------------------------------* + * core_switching_pre_dec() + * + * Preprocessing/preparation for ACELP/HQ core switching + *---------------------------------------------------------------------*/ + +ivas_error core_switching_pre_dec( + Decoder_State *st, /* i/o: decoder state structure */ + const int16_t output_frame, /* i : frame length */ + const int32_t last_core_brate_st0, /* i : channel 0 last core bitrate */ + const int16_t nchan_out, /* i : number of output channels */ + const int16_t last_element_mode, /* i : last_element_mode */ + const int32_t last_element_brate /* i : last element bitrate */ +) +{ + int16_t i, oldLenClasBuff, newLenClasBuff; + ivas_error error; + float tmp; + + error = IVAS_ERR_OK; + + /* Codec mode switching */ + if ( st->last_codec_mode == MODE2 || ( ( st->last_core == TCX_20_CORE || st->last_core == TCX_10_CORE ) && st->element_mode > EVS_MONO ) ) + { + mvr2r( st->mem_syn2, st->mem_syn1, M ); + set_f( st->agc_mem2, 0, 2 ); + st->mem_deemph = st->syn[M]; + st->bpf_off = 1; + if ( st->hBPF != NULL ) + { + set_f( st->hBPF->pst_old_syn, 0, NBPSF_PIT_MAX ); + st->hBPF->pst_mem_deemp_err = 0; + } + st->psf_lp_noise = st->lp_noise; + + /* reset old HB synthesis buffer */ + if ( st->last_L_frame == L_FRAME ) + { + st->old_bwe_delay = NS2SA( st->output_Fs, MAX_DELAY_TBE_NS - DELAY_SWB_TBE_12k8_NS ); + } + else + { + st->old_bwe_delay = NS2SA( st->output_Fs, MAX_DELAY_TBE_NS - DELAY_SWB_TBE_16k_NS ); + } + set_f( st->hb_prev_synth_buffer, 0, NS2SA( 48000, DELAY_BWE_TOTAL_NS ) ); + + if ( st->hBWE_TD != NULL && st->last_core != ACELP_CORE ) + { + /* reset BWE memories */ + set_f( st->hBWE_TD->old_bwe_exc, 0, PIT16k_MAX * 2 ); + st->hBWE_TD->bwe_non_lin_prev_scale = 0.0f; + } + + /* reset upd_cnt */ + st->upd_cnt = MAX_UPD_CNT; + + st->igf = 0; + + if ( st->output_Fs >= 16000 && st->hBWE_zero != NULL ) + { + hf_synth_reset( st->hBWE_zero ); + } + + if ( st->hBWE_FD != NULL ) + { + set_f( st->hBWE_FD->old_syn_12k8_16k, 0, NS2SA( 16000, DELAY_FD_BWE_ENC_NS ) ); + } + + if ( st->hHQ_core != NULL ) + { + set_f( st->hHQ_core->prev_env, 0, SFM_N_WB ); + set_f( st->hHQ_core->prev_normq, 0, SFM_N_WB ); + + set_f( st->hHQ_core->last_ni_gain, 0, BANDS_MAX ); + set_f( st->hHQ_core->last_env, 0, BANDS_MAX ); + st->hHQ_core->last_max_pos_pulse = 0; + + if ( st->output_Fs > 16000 ) + { + set_f( st->hHQ_core->prev_coeff_out, 0, L_HQ_WB_BWE ); + } + + /* pre-echo */ + st->hHQ_core->pastpre = 0; + } + + /* reset the GSC pre echo energy threshold in case of switching */ + if ( st->hGSCDec != NULL ) + { + st->hGSCDec->Last_frame_ener = (float) MAX_32; + } + + if ( st->last_core == TCX_20_CORE || st->last_core == TCX_10_CORE ) + { + if ( st->element_mode == EVS_MONO ) + { + st->last_core = HQ_CORE; + mvr2r( st->hTcxDec->FBTCXdelayBuf, st->prev_synth_buffer, NS2SA( st->output_Fs, DELAY_BWE_TOTAL_NS - DELAY_CLDFB_NS ) ); + } + + if ( st->hHQ_core != NULL ) + { + set_f( st->hHQ_core->last_ni_gain, 0, BANDS_MAX ); + set_f( st->hHQ_core->last_env, 0, BANDS_MAX ); + st->hHQ_core->last_max_pos_pulse = 0; + + set_s( st->hHQ_core->prev_SWB_peak_pos, 0, SPT_SHORTEN_SBNUM ); + st->hHQ_core->prev_frm_hfe2 = 0; + st->hHQ_core->prev_stab_hfe2 = 0; + } + } + + if ( st->prev_bfi != 0 ) + { + int16_t delay_comp; + + /*switch off Hq Voicing as it was not updated in MODE2*/ + if ( st->hHQ_core != NULL ) + { + st->hHQ_core->oldHqVoicing = 0; + st->hHQ_core->HqVoicing = 0; + } + + delay_comp = NS2SA( st->output_Fs, DELAY_CLDFB_NS ); + + if ( !st->last_con_tcx && st->last_core_bfi == ACELP_CORE && st->core == HQ_CORE ) + { + float *realBuffer[CLDFB_NO_COL_MAX_SWITCH], *imagBuffer[CLDFB_NO_COL_MAX_SWITCH]; + float realBufferTmp[CLDFB_NO_COL_MAX_SWITCH][CLDFB_NO_CHANNELS_MAX], imagBufferTmp[CLDFB_NO_COL_MAX_SWITCH][CLDFB_NO_CHANNELS_MAX]; + + for ( i = 0; i < CLDFB_NO_COL_MAX_SWITCH; i++ ) + { + set_f( realBufferTmp[i], 0, CLDFB_NO_CHANNELS_MAX ); + set_f( imagBufferTmp[i], 0, CLDFB_NO_CHANNELS_MAX ); + realBuffer[i] = realBufferTmp[i]; + imagBuffer[i] = imagBufferTmp[i]; + } + + /* CLDFB analysis of the synthesis at internal sampling rate */ + if ( ( error = cldfb_save_memory( st->cldfbAna ) ) != IVAS_ERR_OK ) + { + return error; + } + + cldfbAnalysis( st->hTcxDec->syn_Overl, realBuffer, imagBuffer, delay_comp, st->cldfbAna ); + cldfb_restore_memory( st->cldfbAna ); + + /* CLDFB synthesis of the combined signal */ + if ( ( error = cldfb_save_memory( st->cldfbSyn ) ) != IVAS_ERR_OK ) + { + return error; + } + + cldfbSynthesis( realBuffer, imagBuffer, st->hHQ_core->fer_samples, delay_comp, st->cldfbSyn ); + cldfb_restore_memory( st->cldfbSyn ); + } + + if ( !st->last_con_tcx && st->last_core_bfi == ACELP_CORE && st->core == HQ_CORE ) + { + lerp( st->hTcxDec->syn_Overl, st->hHQ_core->fer_samples + delay_comp, output_frame / 2, st->last_L_frame / 2 ); + /*Set to zero the remaining part*/ + set_f( st->hHQ_core->fer_samples + delay_comp + output_frame / 2, 0, ( output_frame / 2 ) - delay_comp ); + } + } + + st->use_acelp_preq = 0; + st->reset_mem_AR = 0; + } + + /*FEC*/ + if ( st->L_frame <= L_FRAME16k ) + { + if ( st->last_L_frame <= L_FRAME16k && st->core != HQ_CORE ) + { + if ( st->L_frame != st->last_L_frame ) + { + if ( st->L_frame > st->last_L_frame ) + { + oldLenClasBuff = L_SYN_MEM_CLAS_ESTIM * st->last_L_frame / st->L_frame; + newLenClasBuff = L_SYN_MEM_CLAS_ESTIM; + } + else + { + oldLenClasBuff = L_SYN_MEM_CLAS_ESTIM; + newLenClasBuff = L_SYN_MEM_CLAS_ESTIM * st->L_frame / st->last_L_frame; + } + lerp( &st->mem_syn_clas_estim[L_SYN_MEM_CLAS_ESTIM - oldLenClasBuff], &st->mem_syn_clas_estim[L_SYN_MEM_CLAS_ESTIM - newLenClasBuff], newLenClasBuff, oldLenClasBuff ); + } + } + else + { + set_zero( st->mem_syn_clas_estim, L_SYN_MEM_CLAS_ESTIM ); + } + } + + /* Here we only handle cases where last_ppp and last_nelp not updated when coming from CodecB or other cores + within ACELP_CORE if switching from another bitarate to vbr, last_ppp and last_nelp is always updated in the previous frame */ + if ( st->core == ACELP_CORE && ( st->last_core != ACELP_CORE || st->last_codec_mode == MODE2 ) ) + { + st->last_ppp_mode_dec = 0; + st->last_nelp_mode_dec = 0; + } + + /* Handle state reset of stat_noise_uv_mod memory */ + if ( st->core == ACELP_CORE && ( st->last_core != ACELP_CORE || st->last_codec_mode == MODE2 || st->last_total_brate <= PPP_NELP_2k80 ) ) + { + st->act_count = 3; + st->uv_count = 0; + } + + if ( ( ( st->core == ACELP_CORE || st->core == AMR_WB_CORE ) && st->last_core == HQ_CORE ) || ( ( st->element_mode == IVAS_CPE_DFT || st->element_mode == IVAS_CPE_TD || ( st->element_mode == IVAS_CPE_MDCT && last_element_mode == IVAS_CPE_DFT ) ) && nchan_out == 2 && + st->core_brate != SID_2k40 && st->core_brate != FRAME_NO_DATA && ( last_core_brate_st0 == FRAME_NO_DATA || last_core_brate_st0 == SID_2k40 ) ) ) + { + if ( st->element_mode == IVAS_CPE_DFT || st->element_mode == IVAS_CPE_TD ) + { + st->hPFstat->reset = 1; + } + + if ( st->L_frame == L_FRAME16k ) + { + mvr2r( TRWB2_Ave, st->lsf_old, M ); /* init of LSP */ + mvr2r( TRWB2_Ave, st->lsfoldbfi1, M ); + mvr2r( TRWB2_Ave, st->lsfoldbfi0, M ); + mvr2r( TRWB2_Ave, st->lsf_adaptive_mean, M ); + lsf2lsp( st->lsf_old, st->lsp_old, M, INT_FS_16k ); + } + else + { + mvr2r( TRWB_Ave, st->lsf_old, M ); /* init of LSP */ + mvr2r( TRWB_Ave, st->lsfoldbfi1, M ); + mvr2r( TRWB_Ave, st->lsfoldbfi0, M ); + mvr2r( TRWB_Ave, st->lsf_adaptive_mean, M ); + lsf2lsp( st->lsf_old, st->lsp_old, M, INT_FS_12k8 ); + } + + if ( ( st->element_mode == IVAS_CPE_DFT || st->element_mode == IVAS_CPE_TD ) && nchan_out == 2 && st->core_brate > SID_2k40 && ( last_core_brate_st0 == FRAME_NO_DATA || last_core_brate_st0 == SID_2k40 ) && st->hTcxDec != NULL ) + { + /* Last frame was Stereo CNG and the synthesis memory is outdated -- reset */ + set_f( st->hTcxDec->old_syn_Overl, 0.0f, L_FRAME32k / 2 ); + set_f( st->hFdCngDec->hFdCngCom->olapBufferAna, 0.0f, FFTLEN ); + } + + set_f( st->agc_mem2, 0, 2 ); + st->mem_deemph = 0; + if ( !st->last_con_tcx ) + { + set_f( st->mem_syn2, 0.0f, M ); + } + set_f( st->mem_syn1, 0.0f, M ); + if ( st->hBWE_TD != NULL ) + { + st->hBWE_TD->bwe_non_lin_prev_scale = 0.0f; + } + + /* Reset ACELP parameters */ + set_zero( st->mem_MA, M ); + if ( st->sr_core == INT_FS_16k ) + { + mvr2r( GEWB2_Ave, st->mem_AR, M ); + } + else + { + mvr2r( GEWB_Ave, st->mem_AR, M ); + } + st->tilt_code = 0.0f; + st->gc_threshold = 0.0f; + set_f( st->dispMem, 0, 8 ); + + st->last_coder_type = GENERIC; + + fer_energy( output_frame, UNVOICED_CLAS, st->previoussynth, -1, &st->enr_old, 1 ); + st->lp_gainp = 0.0f; + st->lp_gainc = (float) sqrt( st->lp_ener ); + + st->last_voice_factor = 0; + st->Last_GSC_noisy_speech_flag = 0; + + /* reset CLDFB memories */ + cldfb_reset_memory( st->cldfbAna ); + cldfb_reset_memory( st->cldfbBPF ); + cldfb_reset_memory( st->cldfbSyn ); + + /* reset TBE memories */ + if ( !st->last_con_tcx && !( ( st->last_core == HQ_CORE ) && st->element_mode > EVS_MONO ) ) + { + set_f( st->old_exc, 0, L_EXC_MEM_DEC ); + } + else if ( st->L_frame < L_FRAME16k ) + { + /* resample from 16kHz to 12.8kHZ */ + synth_mem_updt2( st->L_frame, L_FRAME16k, st->old_exc, st->mem_syn_r, st->mem_syn2, NULL, DEC ); + } + + if ( st->hBWE_TD != NULL ) + { + set_f( st->hBWE_TD->old_bwe_exc, 0, PIT16k_MAX * 2 ); + } + + if ( st->output_Fs >= 16000 && st->hBWE_zero != NULL ) + { + hf_synth_reset( st->hBWE_zero ); + } + + if ( st->hBWE_FD != NULL ) + { + set_f( st->hBWE_FD->old_syn_12k8_16k, 0, NS2SA( 16000, DELAY_FD_BWE_ENC_NS ) ); + } + } + + if ( ( st->core == ACELP_CORE || st->core == AMR_WB_CORE ) && ( st->last_core == TCX_20_CORE || st->last_core == TCX_10_CORE ) ) + { + if ( st->hBWE_TD != NULL ) + { + st->hBWE_TD->bwe_non_lin_prev_scale = 0.0f; + set_f( st->hBWE_TD->old_bwe_exc, 0, PIT16k_MAX * 2 ); + } + + st->tilt_code = 0.0f; + st->gc_threshold = 0.0f; + set_f( st->dispMem, 0, 8 ); + + st->last_coder_type = GENERIC; + + fer_energy( output_frame, UNVOICED_CLAS, st->previoussynth, -1, &st->enr_old, 1 ); + st->lp_gainp = 0.0f; + st->lp_gainc = (float) sqrt( st->lp_ener ); + + st->last_voice_factor = 0; + st->Last_GSC_noisy_speech_flag = 0; + + if ( st->output_Fs >= 16000 && st->hBWE_zero != NULL ) + { + hf_synth_reset( st->hBWE_zero ); + } + + if ( st->hBWE_FD != NULL ) + { + set_f( st->hBWE_FD->old_syn_12k8_16k, 0, NS2SA( 16000, DELAY_FD_BWE_ENC_NS ) ); + } + + if ( nchan_out == 1 && st->element_mode == IVAS_CPE_DFT && st->element_brate <= IVAS_24k4 && last_element_brate > IVAS_24k4 ) + { + /* update cldbf state with previous frame TCX synthesis when going from a bitrate with residual coding to a bitrate without it */ + int16_t offset; + offset = st->cldfbAna->p_filter_length - st->cldfbAna->no_channels; + mvr2r( st->hTcxDec->old_synthFB + st->hTcxDec->old_synth_lenFB - offset, st->cldfbAna->cldfb_state, offset ); + } + } + + if ( st->core == HQ_CORE && ( st->last_core == ACELP_CORE || st->last_core == AMR_WB_CORE || ( ( st->element_mode != EVS_MONO ) && ( st->last_core != HQ_CORE ) ) ) ) + { + set_f( st->hHQ_core->prev_env, 0, SFM_N_WB ); + set_f( st->hHQ_core->prev_normq, 0, SFM_N_WB ); + + set_f( st->hHQ_core->last_ni_gain, 0, BANDS_MAX ); + set_f( st->hHQ_core->last_env, 0, BANDS_MAX ); + st->hHQ_core->last_max_pos_pulse = 0; + + set_s( st->hHQ_core->prev_SWB_peak_pos, 0, SPT_SHORTEN_SBNUM ); + st->hHQ_core->prev_frm_hfe2 = 0; + st->hHQ_core->prev_stab_hfe2 = 0; + if ( st->output_Fs > 16000 ) + { + set_f( st->hHQ_core->prev_coeff_out, 0, L_HQ_WB_BWE ); + } + + if ( st->element_mode != EVS_MONO ) + { + /* Estimate mem_env_delta to reinit env_stab */ + tmp = max( 0, ENV_STAB_EST1 + ( ENV_STAB_EST2 * st->stab_fac_smooth_lt ) + ( ENV_STAB_EST3 * st->log_energy_diff_lt ) ); + st->hHQ_core->mem_env_delta = (int16_t) min( MAX16B, (int32_t) ( tmp * ( 1 << 12 ) ) ); /* Convert to Q12 and handle saturation */ + + if ( st->last_core != TCX_20_CORE && st->last_core != TCX_10_CORE ) + { + set_f( st->hHQ_core->old_out, 0, output_frame ); + set_f( st->hHQ_core->old_outLB, 0, L_FRAME16k ); + } + + st->hHQ_core->no_att_hangover = 0; + st->hHQ_core->energy_lt = 300.0f; + + set_s( st->hHQ_core->old_is_transient, 0, 3 ); + set_f( st->hHQ_core->prev_noise_level, 0.0f, 2 ); + st->hHQ_core->prev_R = 0; + set_s( st->hHQ_core->mem_norm + 1, 39, SFM_N_ENV_STAB - 1 ); + st->hHQ_core->prev_hqswb_clas = HQ_NORMAL; + st->hHQ_core->prev_ni_ratio = 0.5f; + set_f( st->hHQ_core->prev_En_sb, 0.0f, NB_SWB_SUBBANDS ); + } + else + { + set_f( st->hHQ_core->old_out, 0, output_frame ); + set_f( st->hHQ_core->old_outLB, 0, L_FRAME16k ); + } + } + + /* handle switching cases where preecho_sb was not called in the last frame (memory not up to date) */ + if ( st->hHQ_core != NULL ) + { + st->hHQ_core->pastpre--; + if ( st->hHQ_core->pastpre <= 0 ) + { + reset_preecho_dec( st->hHQ_core ); + } + } + + if ( st->core_brate == FRAME_NO_DATA ) + { + st->VAD = 0; + st->m_frame_type = ZERO_FRAME; + } + else if ( st->core_brate == SID_2k40 || st->core_brate == SID_1k75 ) + { + st->VAD = 0; + st->m_frame_type = SID_FRAME; + } + else + { + st->VAD = 1; + st->m_frame_type = ACTIVE_FRAME; + } + + /*switch on CNA on active frames*/ + if ( st->element_mode == EVS_MONO ) /* for IVAS modes, st->flag_cna is set earlier */ + { + if ( st->VAD && ( ( st->core != AMR_WB_CORE && st->total_brate <= CNA_MAX_BRATE ) || ( st->core == AMR_WB_CORE && st->total_brate <= ACELP_8k85 ) ) ) + { + st->flag_cna = 1; + } + else if ( st->VAD || ( ( st->cng_type == FD_CNG ) && ( st->L_frame == L_FRAME16k ) ) ) + { + st->flag_cna = 0; + } + } + + if ( st->core == AMR_WB_CORE ) + { + st->cng_type = LP_CNG; + } + + /* Reconfigure CNG */ + if ( st->hFdCngDec && ( ( st->last_L_frame != st->L_frame ) || ( st->hFdCngDec->hFdCngCom->frameSize != st->L_frame ) || st->ini_frame == 0 || st->bwidth != st->last_bwidth ) ) + { + /* || st->last_core == AMR_WB_CORE || st->last_codec_mode == MODE2)){*/ + if ( st->core != AMR_WB_CORE ) + { + configureFdCngDec( st->hFdCngDec, st->bwidth, st->rf_flag == 1 && st->total_brate == ACELP_13k20 ? ACELP_9k60 : st->total_brate, st->L_frame, st->last_L_frame, st->element_mode ); + } + else + { + configureFdCngDec( st->hFdCngDec, WB, ACELP_8k00, st->L_frame, st->last_L_frame, st->element_mode ); + + if ( st->VAD ) + { + st->hFdCngDec->hFdCngCom->CngBitrate = st->total_brate; + } + } + if ( st->last_L_frame != st->L_frame && st->L_frame <= L_FRAME16k && st->last_L_frame <= L_FRAME16k ) + { + if ( st->element_mode == IVAS_CPE_DFT || st->element_mode == IVAS_CPE_TD ) + { + lerp( st->hFdCngDec->hFdCngCom->olapBufferAna + st->last_L_frame, st->hFdCngDec->hFdCngCom->olapBufferAna + st->L_frame, st->L_frame, st->last_L_frame ); + } + + lerp( st->hFdCngDec->hFdCngCom->olapBufferSynth2, st->hFdCngDec->hFdCngCom->olapBufferSynth2, st->L_frame * 2, st->last_L_frame * 2 ); + + if ( st->total_brate <= SID_2k40 && st->last_total_brate <= SID_2k40 ) + { + lerp( st->hFdCngDec->hFdCngCom->olapBufferSynth, st->hFdCngDec->hFdCngCom->olapBufferSynth, st->L_frame * 2, st->last_L_frame * 2 ); + + if ( st->L_frame == L_FRAME ) + { + for ( i = 0; i < st->L_frame * 2; i++ ) + { + st->hFdCngDec->hFdCngCom->olapBufferSynth[i] = st->hFdCngDec->hFdCngCom->olapBufferSynth[i] * 0.6250f; + } + } + else + { + for ( i = 0; i < st->L_frame * 2; i++ ) + { + st->hFdCngDec->hFdCngCom->olapBufferSynth[i] = st->hFdCngDec->hFdCngCom->olapBufferSynth[i] * 1.6f; + } + } + } + } + } + + return error; +} + + +/*---------------------------------------------------------------------* + * core_switching_post_dec() + * + * Postprocessing for ACELP/HQ core switching + *---------------------------------------------------------------------*/ + +ivas_error core_switching_post_dec( + Decoder_State *st, /* i/o: decoder state structure */ + float *synth, /* i/o: output synthesis */ + float *output, /* i/o: LB synth/upsampled LB synth */ + float output_mem[], /* i : OLA memory from last TCX/HQ frame */ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const int16_t use_cldfb_for_dft, /* i : flag to use of CLDFB for DFT Stereo */ + const int16_t output_frame, /* i : frame length */ + const int16_t core_switching_flag, /* i : ACELP->HQ switching flag */ + const int16_t sba_dirac_stereo_flag, /* i : signal stereo output for SBA DirAC */ + const int16_t nchan_out, /* i : number of output channels */ + const int16_t last_element_mode /* i : element mode of previous frame */ +) +{ + int16_t i, delay_comp, delta; + float tmpF; + float tmpDelta; + float synth_subfr_out[SWITCH_MAX_GAP], synth_subfr_bwe[SWITCH_MAX_GAP]; + float mem_synth[NS2SA( 16000, DELAY_CLDFB_NS ) + 2]; + int16_t nZeros; + int16_t offset; + ivas_error error; + + error = IVAS_ERR_OK; + + if ( st->core == ACELP_CORE && st->bfi && st->hHQ_core != NULL && !st->con_tcx ) + { + if ( ( error = acelp_core_switch_dec_bfi( st ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* set multiplication factor according to the sampling rate */ + delta = 1; + if ( output_frame == L_FRAME16k ) + { + delta = 2; + } + else if ( output_frame == L_FRAME32k ) + { + delta = 4; + } + else if ( output_frame == L_FRAME48k ) + { + delta = 6; + } + + /* set delay compensation between HQ synthesis and ACELP synthesis */ + delay_comp = delta * HQ_DELAY_COMP; + + /* Core switching done in DFT domain afterward*/ + if ( ( st->element_mode != IVAS_CPE_DFT || use_cldfb_for_dft ) && ( !sba_dirac_stereo_flag || ( sba_dirac_stereo_flag && st->core_brate == SID_2k40 && st->cng_type == FD_CNG ) ) ) + { + if ( st->core == HQ_CORE || st->core == TCX_20_CORE || st->core == TCX_10_CORE || ( st->core == ACELP_CORE && st->bfi == 1 && st->con_tcx == 1 ) ) + { + st->use_acelp_preq = 0; + if ( st->hBWE_FD != NULL ) + { + st->hBWE_FD->mem_deemph_old_syn = 0.0f; + } + + if ( st->element_mode == EVS_MONO && st->core == HQ_CORE ) /* ACELP->HQ-CORE */ + { + if ( core_switching_flag && st->last_L_frame == st->last_L_frame_ori && ( st->last_core == ACELP_CORE || st->last_core == AMR_WB_CORE ) ) + { + if ( ( error = acelp_core_switch_dec( st, synth_subfr_out, synth_subfr_bwe, output_frame, core_switching_flag, mem_synth, nchan_out ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( core_switching_flag && st->last_core == HQ_CORE && st->prev_bfi ) + { + mvr2r( st->delay_buf_out, synth_subfr_out, delay_comp ); + } + } + + /* delay HQ synthesis to synchronize with ACELP synthesis */ + delay_signal( synth, output_frame, st->delay_buf_out, delay_comp ); + + if ( st->element_mode == EVS_MONO && st->core == HQ_CORE ) /* ACELP->HQ-CORE */ + { + if ( core_switching_flag && st->last_L_frame == st->last_L_frame_ori && ( st->last_core == ACELP_CORE || st->last_core == AMR_WB_CORE ) ) + { + core_switching_OLA( mem_synth, st->last_L_frame, st->output_Fs, synth, synth_subfr_out, synth_subfr_bwe, output_frame, st->bwidth ); + } + else if ( core_switching_flag && st->last_core == HQ_CORE && st->prev_bfi ) /* HQ | ACELP | TRANSITION with ACELP frame lost */ + { + /* Overlap between old->out[] (stocked in st->fer_samples[]) and good HQ frame on L/2 */ + nZeros = (int16_t) ( NS2SA( st->output_Fs, N_ZERO_MDCT_NS ) ); + tmpDelta = 1.0f / (float) ( output_frame >> 1 ); + for ( i = 0; i < ( output_frame >> 1 ); i++ ) + { + tmpF = (float) i * tmpDelta; + synth[i + delay_comp] = ( 1 - tmpF ) * st->hHQ_core->fer_samples[i + nZeros] + synth[i + delay_comp] * tmpF; + } + } + else if ( ( !core_switching_flag && st->core == HQ_CORE && ( st->last_core == ACELP_CORE || st->last_core == AMR_WB_CORE ) ) || /* ACELP | TRANSITION | HQ with TRANSITION lost */ + ( core_switching_flag && st->prev_bfi && st->last_L_frame != st->last_L_frame_ori ) ) /* ACELP@12k8 | ACELP@16k | TRANSITION with ACELP@16k lost */ + { + /* Overlap between CELP estimation (BFI) and good HQ frame on L/2 */ + tmpDelta = 1.0f / (float) ( output_frame >> 1 ); + for ( i = 0; i < ( output_frame >> 1 ); i++ ) + { + tmpF = (float) i * tmpDelta; + synth[i] = synth[i] * tmpF + ( 1 - tmpF ) * st->hHQ_core->fer_samples[i]; + } + } + } + else if ( ( ( st->last_core == ACELP_CORE || st->last_core_bfi == ACELP_CORE ) && !( st->prev_bfi == 1 && st->last_con_tcx == 1 ) ) || st->last_core == AMR_WB_CORE ) /*ACELP->TCX/HQ*/ + { + /* if this is first active MDCT-Stereo frame after a CNG frame and output format is mono DMX, this should only be done for the zero-th channel, the other one will simply be copied over after this function */ + if ( ( ( st->last_core_brate != SID_2k40 && st->last_core_brate != FRAME_NO_DATA ) || ( st->element_mode != IVAS_CPE_DFT && st->element_mode != IVAS_CPE_TD ) || nchan_out == 1 ) && !( st->element_mode == IVAS_CPE_MDCT && st->idchan == 1 && ( nchan_out == 1 || last_element_mode == IVAS_CPE_DFT ) ) ) + { + core_switch_lb_upsamp( st, output ); + } + + mvr2r( st->previoussynth, synth, delay_comp ); + + /* Overlap between TCX-LB and TCX-FB*/ + tmpDelta = NS2SA( st->output_Fs, DELAY_BWE_TOTAL_NS ); + for ( i = 0; i < tmpDelta; i++ ) + { + synth[i + delay_comp] = ( synth[i + delay_comp] * i + ( tmpDelta - i ) * st->previoussynth[i + delay_comp] ) / tmpDelta; + } + + if ( ( st->element_mode == IVAS_CPE_MDCT || ( ivas_format == ISM_FORMAT && st->core == TCX_20_CORE /* <- means TCX in general, TCX10 is forbidden after ACELP */ ) ) && st->last_core_brate <= SID_2k40 && st->core_brate > SID_2k40 ) + { + /* smooth transitions to avoid pops in car noise items */ + smoothTransitionDtxToTcx( synth, output_frame, delay_comp ); + } + + /* Reset memories of CLDFBs */ + if ( st->cldfbAna != NULL ) + { + if ( st->cldfbAna->no_channels * st->cldfbAna->no_col != st->L_frame ) + { + configureCldfb( st->cldfbAna, st->L_frame * FRAMES_PER_SEC ); + configureCldfb( st->cldfbBPF, min( 16000, st->L_frame * FRAMES_PER_SEC ) ); + } + + cldfb_reset_memory( st->cldfbAna ); + cldfb_reset_memory( st->cldfbBPF ); + } + cldfb_reset_memory( st->cldfbSyn ); + + /* Update memories for CLDFB ana for eventual next ACELP frame */ + if ( st->cldfbAna != NULL ) + { + delta = st->cldfbAna->no_channels; + offset = st->cldfbAna->p_filter_length - st->cldfbAna->no_channels; + for ( i = 0; i < delta; i++ ) + { + st->cldfbAna->cldfb_state[offset - delta + i] = + output[st->L_frame - delta + i] * ( (float) ( i + 1 ) ) / ( (float) delta ); + } + } + } + else if ( st->element_mode != EVS_MONO ) + { + /* Reset memories of CLDFBs */ + if ( st->cldfbAna != NULL ) + { + if ( st->cldfbAna->no_channels * st->cldfbAna->no_col != st->L_frame ) + { + configureCldfb( st->cldfbAna, st->L_frame * FRAMES_PER_SEC ); + configureCldfb( st->cldfbBPF, min( 16000, st->L_frame * FRAMES_PER_SEC ) ); + } + + cldfb_reset_memory( st->cldfbAna ); + cldfb_reset_memory( st->cldfbBPF ); + } + + if ( st->cldfbSyn != NULL ) + { + cldfb_reset_memory( st->cldfbSyn ); + } + + /* Update memories for CLDFB ana for eventual next ACELP frame */ + /* Analysis CLDF memory is fed with ramped signal for last slot */ + if ( st->cldfbAna != NULL ) + { + delta = st->cldfbAna->no_channels; + offset = st->cldfbAna->p_filter_length - st->cldfbAna->no_channels; + for ( i = 0; i < delta; i++ ) + { + st->cldfbAna->cldfb_state[offset - delta + i] = + output[st->L_frame - delta + i] * ( (float) ( i + 1 ) ) / ( (float) delta ); + } + } + } + + if ( st->hBWE_TD != NULL ) + { + st->hBWE_TD->bwe_non_lin_prev_scale = 0.0; + } + + if ( st->hHQ_core != NULL && !( inner_frame_tbl[st->bwidth] == L_FRAME16k && st->core_brate <= HQ_32k ) ) + { + set_f( st->hHQ_core->prev_env, 0, SFM_N_WB ); + set_f( st->hHQ_core->prev_normq, 0, SFM_N_WB ); + } + + mvr2r( synth, st->previoussynth, output_frame ); + + /*Set post-filtering flag to zero*/ + if ( st->hBPF != NULL ) + { + st->hPFstat->on = 0; + } + } + else + { + /* MDCT to ACELP transition */ + if ( st->last_core == HQ_CORE || st->last_core == TCX_20_CORE || st->last_core == TCX_10_CORE ) + { + nZeros = (int16_t) ( NS2SA( st->output_Fs, N_ZERO_MDCT_NS ) ); + mvr2r( st->delay_buf_out, synth, delay_comp ); /* copy the HQ/ACELP delay synchronization buffer at the beginning of ACELP frame */ + + if ( st->prev_bfi && st->hHQ_core != NULL && st->hHQ_core->HqVoicing && st->last_core == HQ_CORE ) + { + mvr2r( st->hHQ_core->fer_samples, st->hHQ_core->old_out + nZeros, NS2SA( st->output_Fs, 3000000 ) ); + } + + tmpF = 1.0f / (float) NS2SA( st->output_Fs, 3000000 ); + + if ( st->element_mode == IVAS_CPE_TD && st->hHQ_core == NULL ) + { + for ( i = 0; i < NS2SA( st->output_Fs, 3000000 ); i++ ) + { + synth[i + delay_comp] = ( 1 - tmpF * (float) i ) * output_mem[i] + tmpF * (float) i * synth[i + delay_comp]; + } + } + else if ( st->element_mode == IVAS_CPE_MDCT && st->core_brate <= SID_2k40 && st->prev_bfi ) + { + for ( i = 0; i < NS2SA( st->output_Fs, 3000000 ); i++ ) + { + synth[i + delay_comp] = ( 1 - tmpF * (float) i ) * st->hHQ_core->old_out[i + nZeros] * st->hTcxDec->conceal_eof_gain + tmpF * (float) i * synth[i + delay_comp]; + } + } + else + { + for ( i = 0; i < NS2SA( st->output_Fs, 3000000 ); i++ ) + { + synth[i + delay_comp] = ( 1 - tmpF * (float) i ) * st->hHQ_core->old_out[i + nZeros] + tmpF * (float) i * synth[i + delay_comp]; + } + } + } + + set_f( st->delay_buf_out, 0, HQ_DELTA_MAX * HQ_DELAY_COMP ); + if ( st->hHQ_core != NULL ) + { + st->hHQ_core->oldHqVoicing = 0; + } + } + } + else + { + /* memory update needed for DFT stereo -> TD stereo switching */ + mvr2r( synth + output_frame - delay_comp, st->delay_buf_out, delay_comp ); + } + + /* reset SWB BWE buffers */ + if ( st->bws_cnt == 0 || ( st->bws_cnt > 0 && st->coder_type != INACTIVE && st->coder_type != AUDIO ) ) + { + st->attenu1 = 0.1f; + } + + if ( st->hBWE_FD != NULL && + ( ( st->last_extl != SWB_BWE && st->extl == SWB_BWE ) || ( st->last_extl != FB_BWE && st->extl == FB_BWE ) || + ( ( st->last_core == HQ_CORE || st->last_core == TCX_20_CORE || st->last_core == TCX_10_CORE || st->last_extl == SWB_TBE ) && st->extl < 0 && st->core == ACELP_CORE ) || ( st->last_core == ACELP_CORE && st->core == ACELP_CORE && ( ( st->prev_coder_type != INACTIVE && st->coder_type != INACTIVE ) || ( st->prev_coder_type != AUDIO && st->coder_type == AUDIO ) ) && st->bws_cnt > 0 ) ) ) + { + set_f( st->hBWE_FD->old_wtda_swb, 0, output_frame ); + + if ( st->last_extl != WB_BWE ) + { + st->hBWE_FD->prev_mode = NORMAL; + } + + st->hBWE_FD->prev_Energy = 0.0f; + st->hBWE_FD->prev_L_swb_norm = 8; + st->hBWE_FD->prev_frica_flag = 0; + set_f( st->hBWE_FD->mem_imdct, 0, L_FRAME48k ); + st->hBWE_FD->prev_td_energy = 0.0f; + st->hBWE_FD->prev_weight = 0.2f; + st->hBWE_FD->prev_fb_ener_adjust = 0.0f; + } + + /* reset WB BWE buffers */ + if ( st->last_extl != WB_BWE && st->extl == WB_BWE && st->hBWE_FD != NULL ) + { + set_f( st->hBWE_FD->old_wtda_swb, 0, output_frame ); + + if ( st->last_extl != SWB_BWE && st->last_extl != FB_BWE ) + { + st->hBWE_FD->prev_mode = NORMAL; + } + + st->hBWE_FD->prev_Energy_wb = 0.0f; + st->hBWE_FD->prev_L_swb_norm = 8; + set_f( st->hBWE_FD->mem_imdct, 0, L_FRAME48k ); + st->hBWE_FD->prev_flag = 0; + } + + /* reset TBE buffers */ + if ( st->hBWE_TD != NULL ) + { + /* reset SWB TBE buffers */ + if ( ( ( st->extl == SWB_TBE || st->extl == FB_TBE || st->extl == SWB_CNG ) && + ( st->L_frame != st->last_L_frame || ( st->last_extl != SWB_TBE && st->last_extl != FB_TBE && st->last_core != TCX_20_CORE && st->last_core != TCX_10_CORE ) || st->last_core == HQ_CORE ) ) || + ( st->bwidth < st->last_bwidth && st->last_extl != SWB_TBE ) || st->old_ppp_mode || ( ( st->prev_coder_type == AUDIO || st->prev_coder_type == INACTIVE ) && st->bws_cnt > 0 ) || ( st->bws_cnt == 0 && st->prev_bws_cnt == N_WS2N_FRAMES ) ) + { + swb_tbe_reset( st->hBWE_TD->mem_csfilt, st->hBWE_TD->mem_genSHBexc_filt_down_shb, st->hBWE_TD->state_lpc_syn, st->hBWE_TD->syn_overlap, st->hBWE_TD->state_syn_shbexc, &( st->hBWE_TD->tbe_demph ), &( st->hBWE_TD->tbe_premph ), st->hBWE_TD->mem_stp_swb, &( st->hBWE_TD->gain_prec_swb ) ); + + /* reset GainShape delay for SWB TBE FEC */ + set_f( st->hBWE_TD->GainShape_Delay, 0, NUM_SHB_SUBFR / 2 ); + + swb_tbe_reset_synth( st->hBWE_TD->genSHBsynth_Hilbert_Mem, st->hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local ); + + if ( output_frame == L_FRAME16k ) + { + set_f( st->hBWE_TD->mem_resamp_HB_32k, 0, 2 * ALLPASSSECTIONS_STEEP + 1 ); /* reset in case that SWB TBE layer is transmitted, but the output is 16kHz sampled */ + } + + set_f( st->hBWE_TD->int_3_over_2_tbemem_dec, 0.0f, INTERP_3_2_MEM_LEN ); + st->hBWE_TD->prev_pow_exc16kWhtnd = 1.0f; + st->hBWE_TD->prev_mix_factor = 1.0f; + } + else if ( ( st->extl == SWB_TBE || st->extl == FB_TBE ) && ( ( st->element_mode == IVAS_CPE_TD && st->last_extl != SWB_TBE && st->last_extl != FB_TBE ) || ( st->element_mode != IVAS_CPE_TD && st->last_total_brate != st->total_brate ) || ( st->last_bwidth != st->bwidth ) || ( st->last_codec_mode != MODE1 ) || ( st->rf_flag != st->rf_flag_last ) ) ) + { + set_f( st->hBWE_TD->state_lpc_syn, 0.0f, LPC_SHB_ORDER ); + set_f( st->hBWE_TD->state_syn_shbexc, 0.0f, L_SHB_LAHEAD ); + set_f( st->hBWE_TD->mem_stp_swb, 0.0f, LPC_SHB_ORDER ); + set_f( st->hBWE_TD->mem_zero_swb, 0, LPC_SHB_ORDER ); + st->hBWE_TD->gain_prec_swb = 1.0f; + } + else if ( st->hBWE_TD != NULL && ( st->last_core == TCX_20_CORE || st->last_core == TCX_10_CORE ) ) + { + TBEreset_dec( st ); + } + + /* reset FB TBE buffers */ + if ( ( st->L_frame != st->last_L_frame || st->last_extl != FB_TBE ) && st->extl == FB_TBE ) + { + set_f( st->hBWE_TD->fb_state_lpc_syn, 0, LPC_SHB_ORDER ); + st->hBWE_TD->fb_tbe_demph = 0; + fb_tbe_reset_synth( st->hBWE_TD->fbbwe_hpf_mem, &st->hBWE_TD->prev_fbbwe_ratio ); + } + + /* reset WB TBE buffers */ + if ( st->last_extl != WB_TBE && st->extl == WB_TBE && st->last_core != TCX_20_CORE && st->last_core != TCX_10_CORE ) + { + wb_tbe_extras_reset( st->hBWE_TD->mem_genSHBexc_filt_down_wb2, st->hBWE_TD->mem_genSHBexc_filt_down_wb3 ); + wb_tbe_extras_reset_synth( st->hBWE_TD->state_lsyn_filt_shb, st->hBWE_TD->state_lsyn_filt_dwn_shb, st->hBWE_TD->mem_resamp_HB ); + + set_f( st->hBWE_TD->state_syn_shbexc, 0, L_SHB_LAHEAD / 4 ); + set_f( st->hBWE_TD->syn_overlap, 0, L_SHB_LAHEAD ); + set_f( st->hBWE_TD->mem_csfilt, 0, 2 ); + } + } + + /* Interp_3_2 CNG buffers reset */ + if ( st->hTdCngDec != NULL && st->output_Fs == 48000 && ( st->last_core_brate > SID_2k40 ) && ( st->core_brate == FRAME_NO_DATA || st->core_brate == SID_2k40 ) && st->hTdCngDec != NULL ) + { + set_f( st->hTdCngDec->interpol_3_2_cng_dec, 0.0f, INTERP_3_2_MEM_LEN ); + } + + return error; +} + + +/*---------------------------------------------------------------------* + * core_switching_hq_prepare_dec() + * + * Preprocessing in the first HQ frame after ACELP frame + * Modify bit allocation for HQ core by removing ACELP subframe budget + *---------------------------------------------------------------------*/ + +void core_switching_hq_prepare_dec( + Decoder_State *st, /* i/o: decoder state structure */ + int16_t *num_bits, /* i/o: bit budget update */ + const int16_t output_frame /* i : output frame length */ +) +{ + int32_t cbrate; + + if ( st->last_core == HQ_CORE && st->prev_bfi ) + { + mvr2r( st->hHQ_core->old_out, st->hHQ_core->fer_samples, output_frame ); + } + + /* set switching frame bitrate */ + if ( st->last_L_frame == L_FRAME ) + { + if ( st->core_brate > ACELP_24k40 ) + { + cbrate = ACELP_24k40; + } + else + { + cbrate = st->core_brate; + } + + /* subtract ACELP switching frame bits */ + if ( st->core_brate >= ACELP_11k60 ) + { + ( *num_bits )--; /* LP_FLAG bit */ + } + + *num_bits -= ACB_bits_tbl[BIT_ALLOC_IDX( cbrate, GENERIC, 0, 0 )]; /* pitch bits*/ + *num_bits -= gain_bits_tbl[BIT_ALLOC_IDX( cbrate, TRANSITION, 0, 0 )]; /* gain bits */ + *num_bits -= FCB_bits_tbl[BIT_ALLOC_IDX( cbrate, GENERIC, 0, 0 )]; /* FCB bits */ + } + else /* L_frame == L_FRAME16k */ + { + if ( st->core_brate <= ACELP_8k00 ) + { + cbrate = ACELP_8k00; + } + else if ( st->core_brate <= ACELP_14k80 ) + { + cbrate = ACELP_14k80; + } + else + { + cbrate = min( st->core_brate, ACELP_22k60 ); + } + + /* subtract ACELP switching frame bits */ + if ( st->core_brate >= ACELP_11k60 ) + { + /* subtract one bit for LP filtering flag */ + ( *num_bits )--; + } + *num_bits -= ACB_bits_16kHz_tbl[BIT_ALLOC_IDX_16KHZ( cbrate, GENERIC, 0, 0 )]; /* pitch bits*/ + *num_bits -= gain_bits_16kHz_tbl[BIT_ALLOC_IDX_16KHZ( cbrate, GENERIC, 0, 0 )]; /* gain bits */ + *num_bits -= FCB_bits_16kHz_tbl[BIT_ALLOC_IDX_16KHZ( cbrate, GENERIC, 0, 0 )]; /* FCB bits */ + } + + /* subtract BWE bits */ + if ( !( ( inner_frame_tbl[st->bwidth] == L_FRAME16k && st->last_L_frame == L_FRAME16k ) || inner_frame_tbl[st->bwidth] == L_FRAME8k ) ) + { + *num_bits -= ( NOOFGAINBITS1 + AUDIODELAYBITS ); + } + + /* reset state of old_out if switching */ + set_f( st->hHQ_core->old_out, 0.0f, output_frame ); + + return; +} + + +/*---------------------------------------------------------------------* + * bandwidth_switching_detect() + * + * Classification for band-width switching + *---------------------------------------------------------------------*/ + +void bandwidth_switching_detect( + Decoder_State *st /* i/o: decoder state structure */ +) +{ + if ( ( st->element_mode == IVAS_CPE_TD && st->idchan == 1 ) || st->element_mode == IVAS_CPE_MDCT ) + { + /* there is no BWE in TD stereo secondary channel and in MDCT stereo, IGF is part of the core decoding -> no BW switching -> reset BWS counters */ + st->prev_bws_cnt = 0; + st->bws_cnt = 0; + st->bws_cnt1 = 0; + + return; + } + + /* update band-width switching counter */ + if ( st->bws_cnt1 >= N_NS2W_FRAMES ) + { + st->bws_cnt1 = 0; + } + else if ( st->total_brate > ACELP_9k60 && st->last_core_brate < ACELP_9k60 && st->bwidth == SWB && st->last_bwidth == WB && st->last_low_rate_mode == 0 ) + { + st->bws_cnt1++; + } + else if ( st->bws_cnt1 > 0 ) + { + st->bws_cnt = st->bwidth < st->last_bwidth ? 2 * ( N_NS2W_FRAMES - st->bws_cnt1 ) - 1 : 0; + st->bws_cnt1 = st->bwidth < st->last_bwidth ? 0 : ( ( st->bwidth == SWB ) ? st->bws_cnt1 + 1 : 0 ); + } + + /* update band-width switching counter */ + if ( st->bws_cnt >= N_WS2N_FRAMES ) + { + st->bws_cnt = 0; + } + else if ( st->total_brate < ACELP_9k60 && st->last_core_brate > ACELP_9k60 && st->bwidth < st->last_bwidth && st->bwidth == WB ) + { + st->bws_cnt++; + } + else if ( st->bws_cnt > 0 ) + { + st->bws_cnt1 = st->bwidth > st->last_bwidth ? ( ( N_WS2N_FRAMES - st->bws_cnt ) >> 1 ) : 0; + st->bws_cnt = st->bwidth > st->last_bwidth ? 0 : ( ( st->bwidth == WB ) ? st->bws_cnt + 1 : 0 ); + } + + return; +} + + +/*---------------------------------------------------------------------* + * bw_switching_pre_proc() + * + * Band-width switching pre-processing + *---------------------------------------------------------------------*/ + +void bw_switching_pre_proc( + Decoder_State *st, /* i/o: decoder state structure */ + const float *old_syn_12k8_16k, /* i : ACELP core synthesis at 12.8kHz or 16kHz */ + const int32_t last_element_brate, /* i : last element bitrate */ + const int16_t nchan_out /* i : number of output channels */ +) +{ + int16_t i; + float syn_dct[L_FRAME]; + + if ( st->element_mode > EVS_MONO ) + { + if ( st->core == ACELP_CORE && !( st->bfi == 1 && st->con_tcx == 1 ) && st->hBWE_FD != NULL && !( st->core_brate <= SID_2k40 && st->element_mode == IVAS_CPE_DFT && nchan_out == 2 ) && !( st->element_mode == IVAS_CPE_MDCT && nchan_out == 1 && st->idchan == 1 && last_element_brate <= IVAS_SID_5k2 ) ) + { + /* Calculate tilt of the ACELP core synthesis - needed in SWB BWE decoding */ + calc_tilt_bwe( old_syn_12k8_16k, &st->tilt_wb, st->L_frame ); + } + + return; + } + + if ( st->core == ACELP_CORE && !( st->bfi == 1 && st->con_tcx == 1 ) ) + { + /*----------------------------------------------------------------------* + * Calculate tilt of the ACELP core synthesis + *----------------------------------------------------------------------*/ + + calc_tilt_bwe( old_syn_12k8_16k, &st->tilt_wb, st->L_frame ); + + /*-------------------------------------------------------------------------------* + * Calculate frequency energy of 0~3.2kHz and 3.2~6.4kHz the ACELP core synthesis + *-------------------------------------------------------------------------------*/ + + edct( old_syn_12k8_16k, syn_dct, L_FRAME, st->element_mode ); + + st->enerLL = EPSILON; + for ( i = 0; i < L_FRAME / 2; i++ ) + { + st->enerLL += syn_dct[i] * syn_dct[i]; + } + st->enerLL = (float) sqrt( st->enerLL / 128 ); + + st->enerLH = EPSILON; + for ( ; i < L_FRAME; i++ ) + { + st->enerLH += syn_dct[i] * syn_dct[i]; + } + st->enerLH = (float) sqrt( st->enerLH / 128 ); + } + else + { + if ( st->hHQ_core->old_is_transient[0] ) + { + st->enerLL = EPSILON; + for ( i = 0; i < 32; i++ ) + { + st->enerLL += st->t_audio_q[i] * st->t_audio_q[i]; + } + st->enerLL = (float) sqrt( st->enerLL / 32 ); + + st->enerLH = EPSILON; + for ( ; i < 64; i++ ) + { + st->enerLH += st->t_audio_q[i] * st->t_audio_q[i]; + } + st->enerLH = (float) sqrt( st->enerLH / 32 ); + } + else + { + st->enerLL = EPSILON; + for ( i = 0; i < L_FRAME / 2; i++ ) + { + st->enerLL += st->t_audio_q[i] * st->t_audio_q[i]; + } + st->enerLL = (float) sqrt( st->enerLL / 128 ); + + st->enerLH = EPSILON; + for ( ; i < L_FRAME; i++ ) + { + st->enerLH += st->t_audio_q[i] * st->t_audio_q[i]; + } + st->enerLH = (float) sqrt( st->enerLH / 128 ); + } + } + + if ( st->last_bwidth == 0 && st->extl <= SWB_CNG ) + { + st->prev_ener_shb = 0.0f; + if ( st->hBWE_FD != NULL ) + { + set_f( st->hBWE_FD->prev_SWB_fenv, 0, SWB_FENV ); + } + } + else if ( ( ( st->core == ACELP_CORE && ( st->last_core == HQ_CORE || st->last_core == TCX_10_CORE || st->last_core == TCX_20_CORE ) ) || ( st->core == st->last_core && st->extl != st->last_extl ) ) && st->last_bwidth >= SWB ) + { + st->attenu1 = 0.1f; + } + + if ( st->last_core == HQ_CORE || ( st->last_core == ACELP_CORE && !( st->last_extl == WB_TBE || st->last_extl == SWB_TBE || st->last_extl == FB_TBE ) && st->core_brate > ACELP_8k00 ) ) + { + st->prev_fractive = 0; + } + + return; +} + + +/*---------------------------------------------------------------------* + * core_switch_lb_upsamp() + * + * Resample HQ/TCX-LB to the output sampling rate (8/16/32/48 kHz) + *---------------------------------------------------------------------*/ + +static void core_switch_lb_upsamp( + Decoder_State *st, /* i/o: Decoder state */ + float *output /* i/o: LB synth/upsampled LB synth */ +) +{ + int16_t i; + float *realBuffer[CLDFB_OVRLP_MIN_SLOTS], *imagBuffer[CLDFB_OVRLP_MIN_SLOTS]; + float realBufferTmp[CLDFB_OVRLP_MIN_SLOTS][CLDFB_NO_CHANNELS_MAX]; + float imagBufferTmp[CLDFB_OVRLP_MIN_SLOTS][CLDFB_NO_CHANNELS_MAX]; + + /* open CLDFB buffer up to CLDFB_NO_CHANNELS_MAX bands for 48kHz */ + for ( i = 0; i < CLDFB_OVRLP_MIN_SLOTS; i++ ) + { + set_f( realBufferTmp[i], 0, CLDFB_NO_CHANNELS_MAX ); + set_f( imagBufferTmp[i], 0, CLDFB_NO_CHANNELS_MAX ); + realBuffer[i] = realBufferTmp[i]; + imagBuffer[i] = imagBufferTmp[i]; + } + + /* check if the CLDFB works on the right sample rate */ + if ( ( st->cldfbAna->no_channels * st->cldfbAna->no_col ) != st->L_frame ) + { + resampleCldfb( st->cldfbAna, st->L_frame * FRAMES_PER_SEC ); + + if ( st->cldfbBPF != NULL && st->L_frame <= L_FRAME16k ) + { + resampleCldfb( st->cldfbBPF, st->L_frame * FRAMES_PER_SEC ); + } + + if ( st->ini_frame > 0 ) + { + st->cldfbSyn->bandsToZero = st->cldfbSyn->no_channels - st->cldfbAna->no_channels; + } + } + + /* analysis of the synthesis at internal sampling rate */ + cldfbAnalysis( output, realBuffer, imagBuffer, CLDFB_OVRLP_MIN_SLOTS * st->cldfbAna->no_channels, st->cldfbAna ); + + /* analysis and add the BPF error signal */ + if ( st->p_bpf_noise_buf ) + { + addBassPostFilter( st->p_bpf_noise_buf, st->bpf_off ? 0 : CLDFB_OVRLP_MIN_SLOTS * st->cldfbBPF->no_channels, realBuffer, imagBuffer, st->cldfbBPF ); + } + + /* set output mask for upsampling */ + if ( st->bwidth == NB ) + { + /* set NB mask for upsampling */ + st->cldfbSyn->bandsToZero = st->cldfbSyn->no_channels - 10; + } + else if ( st->cldfbSyn->bandsToZero != st->cldfbSyn->no_channels - st->cldfbAna->no_channels ) + { + /* in case of BW switching, re-init to default */ + st->cldfbSyn->bandsToZero = st->cldfbSyn->no_channels - st->cldfbAna->no_channels; + } + + /* synthesis of the combined signal */ + cldfbSynthesis( realBuffer, imagBuffer, output, CLDFB_OVRLP_MIN_SLOTS * st->cldfbSyn->no_channels, st->cldfbSyn ); + + /* save synthesis - needed in case of core switching */ + if ( st->hTcxDec != NULL ) + { + mvr2r( output, st->previoussynth, st->hTcxDec->L_frameTCX ); + } + + return; +} + +/*---------------------------------------------------------------------* + * smoothTransitionDtxToTcx() + * + * apply smoothing to the transition part for inactive to active transitions in DTX + *---------------------------------------------------------------------*/ + +#define TRANSITION_SMOOTHING_LEN_16k 15 +#define TRANSITION_SMOOTHING_LEN_32k 31 +#define TRANSITION_SMOOTHING_LEN_48k 47 + +static void smoothTransitionDtxToTcx( + float synth[], /* i/o: synthesis */ + const int16_t output_frame, /* i : output frame length */ + const int16_t delay_comp /* i : delay compensation in samples */ +) +{ + int16_t i, filter_len; + float w, mem, step, fade_in; + float smoothing_input_buffer[2 * NS2SA( 48000, DELAY_CLDFB_NS ) + TRANSITION_SMOOTHING_LEN_48k]; + float smoothing_out_buffer[2 * NS2SA( 48000, DELAY_CLDFB_NS ) + TRANSITION_SMOOTHING_LEN_48k]; + + filter_len = TRANSITION_SMOOTHING_LEN_16k; + if ( output_frame == L_FRAME32k ) + { + filter_len = TRANSITION_SMOOTHING_LEN_32k; + } + else if ( output_frame == L_FRAME48k ) + { + filter_len = TRANSITION_SMOOTHING_LEN_48k; + } + + /* prepare buffer */ + for ( i = 0; i < filter_len / 2; i++ ) + { + smoothing_input_buffer[i] = synth[0]; + } + mvr2r( synth, smoothing_input_buffer + filter_len / 2, 2 * delay_comp + filter_len / 2 ); + + /* apply Mean filter */ + w = 1.f / filter_len; + mem = sum_f( smoothing_input_buffer, filter_len ); + for ( i = 0; i < 2 * delay_comp; i++ ) + { + smoothing_out_buffer[i] = w * mem; + mem = mem - smoothing_input_buffer[i] + smoothing_input_buffer[i + filter_len]; + } + + /* apply fades around transition */ + step = 1.f / delay_comp; + fade_in = 0.f; + for ( i = 0; i < delay_comp; i++ ) + { + synth[i] = smoothing_out_buffer[i] * fade_in + synth[i] * ( 1 - fade_in ); + fade_in += step; + } + + fade_in = 0.f; + for ( ; i < 2 * delay_comp; i++ ) + { + synth[i] = synth[i] * fade_in + smoothing_out_buffer[i] * ( 1 - fade_in ); + fade_in += step; + } + + return; +} diff --git a/lib_dec/d_gain2p.c b/lib_dec/d_gain2p.c new file mode 100644 index 0000000000000000000000000000000000000000..826208b9a2a87df187743f99870ef51f625fee23 --- /dev/null +++ b/lib_dec/d_gain2p.c @@ -0,0 +1,288 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "prot.h" +#include "cnst.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*--------------------------------------------------------------------------* + * Mode2_gain_dec_mless + * + * Decoding of pitch and codebook gains without updating long term energies + *-------------------------------------------------------------------------*/ + +static void Mode2_gain_dec_mless( + const int16_t index, /* i : index of quantizer */ + const float code[], /* i : Innovative code vector */ + const int16_t lcode, /* i : Subframe size */ + float *gain_pit, /* o : Quantized pitch gain */ + float *gain_code, /* o : Quantized codebook gain */ + float mean_ener, /* i : mean_ener defined in open-loop (2 bits) */ + float *past_gpit, /* i/o: past gain of pitch */ + float *past_gcode, /* i/o: past energy of code */ + float *gain_inov, /* o : un-scaled innovation gain */ + const int16_t coder_type /* i : coder type for number of bits */ +) +{ + int16_t i; + float ener_code, gcode0; + const Word16 *t_qua_gain; + + ener_code = 0.0f; + + if ( coder_type == 0 ) + { + *gain_inov = 1.0f / (float) sqrt( ( dotp( code, code, lcode ) + 0.01f ) / lcode ); + } + else + { + ener_code = 0.01f; + + for ( i = 0; i < lcode; i++ ) + { + ener_code += code[i] * code[i]; + } + *gain_inov = (float) sqrt( (float) lcode / ener_code ); + } + + /*-----------------------------------------------------------------* + * Select the gains quantization table + *-----------------------------------------------------------------*/ + + if ( coder_type == 0 ) + { + t_qua_gain = E_ROM_qua_gain5b_const; + } + else if ( coder_type == 1 ) + { + t_qua_gain = E_ROM_qua_gain6b_const; + } + else + { + t_qua_gain = E_ROM_qua_gain7b_const; + } + + /*-----------------------------------------------------------------* + * decode pitch gain + *-----------------------------------------------------------------*/ + + *gain_pit = (float) ( t_qua_gain[index * 2] ) / ( 1 << 14 ); + + /*-----------------------------------------------------------------* + * calculate the predicted gain code + *-----------------------------------------------------------------*/ + + if ( coder_type == 0 ) + { + ener_code = 10 * (float) log10( ( dotp( code, code, lcode ) + 0.01f ) / lcode ); + gcode0 = (float) pow( 10, 0.05 * ( mean_ener - ener_code ) ); + } + else + { + ener_code = (float) ( -10.0 * log10( (float) lcode / ener_code ) ); + gcode0 = mean_ener - ener_code; + gcode0 = (float) pow( 10.0, gcode0 / 20.0 ); /* predicted gain */ + } + + /*-----------------------------------------------------------------* + * decode normalized codebook gain + *-----------------------------------------------------------------*/ + + *gain_code = (float) ( t_qua_gain[index * 2 + 1] ) / ( 1 << 11 ) * gcode0; + + *past_gpit = *gain_pit; + *past_gcode = *gain_code / *gain_inov; + + return; +} + + +/*---------------------------------------------------------------------* + * gain_dec_uv + * + * Decoding of pitch and codebook gains for Unvoiced mode + *---------------------------------------------------------------------*/ + +static void gain_dec_uv( + const int16_t index, /* i/o: Quantization index vector */ + const float *code, /* i : algebraic code excitation */ + const int16_t lcode, /* i : Subframe size */ + float *gain_pit, /* o : Quantized pitch gain */ + float *gain_code, /* o : Quantized codebook gain */ + float *past_gpit, /* i/o: past gain of pitch */ + float *past_gcode, /* i/o: past energy of code */ + float *gain_inov /* o : unscaled innovation gain */ +) +{ + /*-----------------------------------------------------------------* + * Innovation energy (without gain) + *-----------------------------------------------------------------*/ + + *gain_inov = 1.0f / (float) sqrt( ( dotp( code, code, lcode ) + 0.01f ) / lcode ); + + /*-----------------------------------------------------------------* + * Decode pitch gain + *-----------------------------------------------------------------*/ + *gain_pit = 0.0f; + + /*-----------------------------------------------------------------* + * Decode codebook gain + *-----------------------------------------------------------------*/ + + *gain_code = (float) pow( 10.f, ( ( ( index * 1.9f ) - 30.f ) / 20.f ) ); + + /*-----------------------------------------------------------------* + * past gains for error concealment + *-----------------------------------------------------------------*/ + + *past_gpit = *gain_pit; + *past_gcode = *gain_code; + *gain_code *= *gain_inov; + + return; +} + + +/*---------------------------------------------------------------------* + * gain_dec_gacelp_uv + * + * Decoding of pitch and codebook gains for Unvoiced mode + *---------------------------------------------------------------------*/ + +void gain_dec_gacelp_uv( + int16_t index, /* i/o: Quantization index vector */ + const float *code, /* i : algebraic code excitation */ + const float *code2, /* i : algebraic code excitation */ + const float mean_ener, /* i : mean energy */ + const int16_t lcode, /* i : Subframe size */ + float *gain_pit, /* o : Quantized pitch gain */ + float *gain_code, /* o : Quantized codebook gain */ + float *gain_code2, /* o : Quantized codebook gain */ + float *past_gpit, /* i/o: past gain of pitch */ + float *past_gcode, /* i/o: past energy of code */ + float *gain_inov /* o : unscaled innovation gain */ +) +{ + float pred_nrg_frame, norm_code2; + float gcode, gcode2; + int16_t index2; + + pred_nrg_frame = (float) pow( 10.0, mean_ener / 20.0 ); + + /*-----------------------------------------------------------------* + * Prediction gains + *-----------------------------------------------------------------*/ + + *gain_inov = 1.0f / (float) sqrt( ( dotp( code, code, lcode ) + 0.01f ) / lcode ); + gcode = pred_nrg_frame * ( *gain_inov ); + + norm_code2 = 1.0f / (float) sqrt( ( dotp( code2, code2, lcode ) + 0.01f ) / lcode ); + gcode2 = pred_nrg_frame * ( norm_code2 ); + + /*-----------------------------------------------------------------* + * Decode pitch gain + *-----------------------------------------------------------------*/ + + *gain_pit = 0.0f; + *past_gpit = *gain_pit; + + /*-----------------------------------------------------------------* + * past gains for error concealment + *-----------------------------------------------------------------*/ + + index2 = index >> 5; + index = index & 0x1F; + + *gain_code = (float) pow( 10.f, ( ( ( index * 1.25f ) - 20.f ) / 20.f ) ) * gcode; + *gain_code2 = (float) ( index2 * 0.25f + 0.25f ) * ( *gain_code * ( gcode2 / gcode ) ); + + *past_gcode = *gain_code / *gain_inov; /*unscaled gain*/ + + return; +} + + +/*---------------------------------------------------------------------* + * decode_acelp_gains + * + * + *---------------------------------------------------------------------*/ + +void decode_acelp_gains( + const float *code, + const int16_t gains_mode, + const float mean_ener_code, + float *gain_pit, + float *gain_code, + int16_t **pt_indice, + float *past_gpit, + float *past_gcode, + float *gain_inov, + const int16_t L_subfr, + float *code2, + float *gain_code2 ) +{ + int16_t index = 0; + + index = **pt_indice; + ( *pt_indice )++; + + if ( ( ( gains_mode > 0 ) && ( gains_mode < 4 ) ) ) + { + /* EVS gains quantizer (5bits/subfr) */ + Mode2_gain_dec_mless( index, code, L_subfr, gain_pit, gain_code, mean_ener_code, past_gpit, past_gcode, gain_inov, gains_mode - 1 ); + } + else if ( gains_mode == 6 ) + { + /* UV gains quantizer (6bits/subfr) */ + gain_dec_uv( index, code, L_subfr, gain_pit, gain_code, past_gpit, past_gcode, gain_inov ); + } + else if ( gains_mode == 7 ) + { + /* GACELP_UV gains quantizer (7=5-2bits/subfr) */ + gain_dec_gacelp_uv( index, code, code2, mean_ener_code, L_subfr, gain_pit, gain_code, gain_code2, past_gpit, past_gcode, gain_inov ); + } + else + { + IVAS_ERROR( IVAS_ERR_INTERNAL, "invalid gains coding for acelp!" ); + } + + return; +} diff --git a/lib_dec/dec2t32.c b/lib_dec/dec2t32.c new file mode 100644 index 0000000000000000000000000000000000000000..57ad88f2fa33559a0b7f8eec1196db21ab721dbf --- /dev/null +++ b/lib_dec/dec2t32.c @@ -0,0 +1,131 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "prot.h" +#include "wmc_auto.h" + +/*----------------------------------------------------------------------------------* + * dec_acelp_2t32() + * + * 12 bits algebraic codebook decoder. + * 2 track x 32 positions per track = 64 samples. + * + * 12 bits --> 2 pulses in a frame of 64 samples. + * + * All pulses can have two (2) possible amplitudes: +1 or -1. + * Each pulse can have 32 possible positions. + * + * See cod2t32.c for more details of the algebraic code. + *----------------------------------------------------------------------------------*/ + +void dec_acelp_2t32( + Decoder_State *st, /* i/o: decoder state structure */ + float code[] /* o : algebraic (fixed) codebook excitation */ +) +{ + int16_t index, i0, i1; + + index = get_next_indice( st, 12 ); + + set_f( code, 0.0f, L_SUBFR ); + + /*-----------------------------------------------------------------* + * decode the positions and signs of pulses and build the codeword + *-----------------------------------------------------------------*/ + + i0 = ( ( index >> 6 ) & ( NB_POS_FCB_2T - 1 ) ) * NB_TRACK_FCB_2T; + i1 = ( ( index & ( NB_POS_FCB_2T - 1 ) ) * NB_TRACK_FCB_2T ) + 1; + code[i0] = -1.0f; + if ( ( index & 0x800 ) == 0 ) + { + code[i0] = 1.0f; + } + + code[i1] = -1.0f; + if ( ( index & 0x20 ) == 0 ) + { + code[i1] = 1.0f; + } + + return; +} + + +/*----------------------------------------------------------------------------------* + * dec_acelp_1t64() + * + * 7 bits algebraic codebook. + * 1 track x 64 positions per track = 64 samples. + * + * The pulse can have 64 possible positions and two (2) possible amplitudes: +1 or -1. + *----------------------------------------------------------------------------------*/ + +void dec_acelp_1t64( + Decoder_State *st, /* i/o: decoder state structure */ + float code[], /* o : algebraic (fixed) codebook excitation */ + const int16_t L_subfr /* i : subframe length */ +) +{ + int16_t pos, sgn; + + /*-----------------------------------------------------------------* + * decode the positions and signs of pulses and build the codeword + *-----------------------------------------------------------------*/ + + if ( L_subfr == L_SUBFR ) + { + pos = get_next_indice( st, 7 ); + } + else /* L_subfr == 2*L_SUBFR */ + { + pos = get_next_indice( st, 8 ); + } + + sgn = -1; + if ( pos >= L_subfr ) + { + pos -= L_subfr; + sgn = 1; + } + + set_f( code, 0.0f, L_subfr ); + code[pos] = sgn; + + return; +} diff --git a/lib_dec/dec4t64.c b/lib_dec/dec4t64.c new file mode 100644 index 0000000000000000000000000000000000000000..a0e969b1b097d7fc8ead8e7e66535ff51898d84c --- /dev/null +++ b/lib_dec/dec4t64.c @@ -0,0 +1,1011 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "prot.h" +#include "ivas_prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * Local function prototypes + *-------------------------------------------------------------------*/ + +static void add_pulses( const int16_t pos[], const int16_t nb_pulse, const int16_t track, float code[] ); +static void dec_1p_N1( const int32_t index, const int16_t N, const int16_t offset, int16_t pos[] ); +static void dec_2p_2N1( const int32_t index, const int16_t N, const int16_t offset, int16_t pos[] ); +static void dec_3p_3N1( const int32_t index, const int16_t N, const int16_t offset, int16_t pos[] ); +static void dec_4p_4N1( const int32_t index, const int16_t N, const int16_t offset, int16_t pos[] ); +static void dec_4p_4N( const int32_t index, const int16_t N, const int16_t offset, int16_t pos[] ); +static void dec_5p_5N( const int32_t index, const int16_t N, const int16_t offset, int16_t pos[] ); +static void dec_6p_6N2( const int32_t index, const int16_t N, const int16_t offset, int16_t pos[] ); +static void fcb_decode_PI( int32_t code_index, int16_t sector_6p[], const int16_t pulse_num ); + + +/*----------------------------------------------------------------------------------* + * dec_acelp_4t64() + * + * 20, 36 bits algebraic codebook decoder. + * 4 tracks x 16 positions per track = 64 samples. + * + * 20 bits --> 4 pulses in a frame of 64 samples. + * 36 bits --> 8 pulses in a frame of 64 samples. + * + * All pulses can have two (2) possible amplitudes: +1 or -1. + * Each pulse can have sixteen (16) possible positions. + * + * See cod4t64.c for more details of the algebraic code. + *----------------------------------------------------------------------------------*/ + +void dec_acelp_4t64( + Decoder_State *st, /* i/o: decoder state structure */ + int16_t nbbits, /* i : number of bits per codebook */ + float code[], /* o : algebraic (fixed) codebook excitation */ + const int16_t Opt_AMR_WB /* i : flag indicating AMR-WB IO mode */ +) +{ + int16_t i, k, pos[7]; + int32_t L_index; + int16_t ind1[NB_TRACK_FCB_4T], ind2[NB_TRACK_FCB_4T]; + PulseConfig config; + int16_t indexing_indices[6], wordcnt, bitcnt; + + if ( !Opt_AMR_WB ) + { + switch ( nbbits ) + { + case 20: + config.nb_pulse = 4; + break; + + case 28: + config.nb_pulse = 6; + break; + + case 36: + config.nb_pulse = 8; + break; + + case 43: + config.nb_pulse = 10; + break; + + case 50: + config.nb_pulse = 12; + break; + + case 62: + config.nb_pulse = 16; + break; + + + case 87: + config.nb_pulse = 26; + break; + } + config.bits = nbbits; + config.codetrackpos = TRACKPOS_FIXED_FIRST; + + + wordcnt = nbbits >> 4; + bitcnt = nbbits & 15; + for ( i = 0; i < wordcnt; i++ ) + { + indexing_indices[i] = get_next_indice( st, 16 ); + } + if ( bitcnt ) + { + indexing_indices[i] = get_next_indice( st, bitcnt ); + } + D_ACELP_indexing( code, config, NB_TRACK_FCB_4T, indexing_indices, &st->BER_detect ); + } + else + { + for ( i = 0; i < L_SUBFR; i++ ) + { + code[i] = 0.0f; + } + + if ( nbbits == 20 ) + { + for ( k = 0; k < NB_TRACK_FCB_4T; k++ ) + { + L_index = get_next_indice( st, 5 ); + dec_1p_N1( L_index, 4, 0, pos ); + add_pulses( pos, 1, k, code ); + } + } + else if ( nbbits == 36 ) + { + for ( k = 0; k < NB_TRACK_FCB_4T; k++ ) + { + L_index = get_next_indice( st, 9 ); + dec_2p_2N1( L_index, 4, 0, pos ); + add_pulses( pos, 2, k, code ); + } + } + else if ( nbbits == 44 ) /* AMR-WB pulse indexing */ + { + for ( k = 0; k < NB_TRACK_FCB_4T - 2; k++ ) + { + L_index = get_next_indice( st, 13 ); + dec_3p_3N1( L_index, 4, 0, pos ); + add_pulses( pos, 3, k, code ); + } + + for ( k = 2; k < NB_TRACK_FCB_4T; k++ ) + { + L_index = get_next_indice( st, 9 ); + dec_2p_2N1( L_index, 4, 0, pos ); + add_pulses( pos, 2, k, code ); + } + } + else if ( nbbits == 52 ) /* AMR-WB pulse indexing */ + { + for ( k = 0; k < NB_TRACK_FCB_4T; k++ ) + { + L_index = get_next_indice( st, 13 ); + dec_3p_3N1( L_index, 4, 0, pos ); + add_pulses( pos, 3, k, code ); + } + } + else if ( nbbits == 64 ) /* AMR-WB pulse indexing */ + { + for ( k = 0; k < NB_TRACK_FCB_4T; k++ ) + { + ind1[k] = get_next_indice( st, 2 ); + } + + for ( k = 0; k < NB_TRACK_FCB_4T; k++ ) + { + ind2[k] = get_next_indice( st, 14 ); + } + + for ( k = 0; k < NB_TRACK_FCB_4T; k++ ) + { + L_index = ( ( ind1[k] << 14 ) + ind2[k] ); + dec_4p_4N( L_index, 4, 0, pos ); + add_pulses( pos, 4, k, code ); + } + } + else if ( nbbits == 72 ) + { + for ( k = 0; k < NB_TRACK_FCB_4T - 2; k++ ) + { + ind1[k] = get_next_indice( st, 10 ); + } + + for ( k = 2; k < NB_TRACK_FCB_4T; k++ ) + { + ind1[k] = get_next_indice( st, 2 ); + } + + for ( k = 0; k < NB_TRACK_FCB_4T - 2; k++ ) + { + ind2[k] = get_next_indice( st, 10 ); + } + + for ( k = 2; k < NB_TRACK_FCB_4T; k++ ) + { + ind2[k] = get_next_indice( st, 14 ); + } + + for ( k = 0; k < NB_TRACK_FCB_4T - 2; k++ ) + { + L_index = ( ( ind1[k] << 10 ) + ind2[k] ); + dec_5p_5N( L_index, 4, 0, pos ); + add_pulses( pos, 5, k, code ); + } + + for ( k = 2; k < NB_TRACK_FCB_4T; k++ ) + { + L_index = ( ( ind1[k] << 14 ) + ind2[k] ); + dec_4p_4N( L_index, 4, 0, pos ); + add_pulses( pos, 4, k, code ); + } + } + else if ( nbbits == 88 ) + { + for ( k = 0; k < NB_TRACK_FCB_4T; k++ ) + { + ind1[k] = get_next_indice( st, 11 ); + } + + for ( k = 0; k < NB_TRACK_FCB_4T; k++ ) + { + ind2[k] = get_next_indice( st, 11 ); + } + + for ( k = 0; k < NB_TRACK_FCB_4T; k++ ) + { + L_index = ( ( ind1[k] << 11 ) + ind2[k] ); + dec_6p_6N2( L_index, 4, 0, pos ); + add_pulses( pos, 6, k, code ); + } + } + } + + return; +} + +/*-------------------------------------------------------* + * add_pulses() + * + * Add decoded pulses to the codeword + *-------------------------------------------------------*/ + +static void add_pulses( + const int16_t pos[], /* i : pulse position */ + const int16_t nb_pulse, /* i : nb. of pulses */ + const int16_t track, /* i : no. of the tracks */ + float code[] /* i/o: decoded codevector */ +) +{ + int16_t i, k; + + for ( k = 0; k < nb_pulse; k++ ) + { + i = ( ( pos[k] & ( NB_POS_FCB_4T - 1 ) ) * NB_TRACK_FCB_4T ) + track; + if ( ( pos[k] & NB_POS_FCB_4T ) == 0 ) + { + code[i] += 1.0f; + } + else + { + code[i] -= 1.0f; + } + } + + return; +} + +/*-------------------------------------------------------* + * dec_1p_N1() + * + * Decode 1 pulse with N+1 bits + *-------------------------------------------------------*/ + +void dec_1p_N1( + const int32_t index, /* i : quantization index */ + const int16_t N, /* i : nb. of bits */ + const int16_t offset, /* i : pulse position offset */ + int16_t pos[] /* o : pulse position */ +) +{ + int16_t i, pos1; + int32_t mask; + + mask = ( ( 1 << N ) - 1 ); + + pos1 = (int16_t) ( index & mask ) + offset; + + i = (int16_t) ( index >> N ) & 1; + + if ( i == 1 ) + { + pos1 += NB_POS_FCB_4T; + } + + pos[0] = pos1; + + return; +} + +/*-------------------------------------------------------* + * dec_2p_2N1() + * + * Decode 2 pulses with 2*N+1 bits: + *-------------------------------------------------------*/ + +void dec_2p_2N1( + const int32_t index, /* i : quantization index */ + const int16_t N, /* i : nb. of bits */ + const int16_t offset, /* i : pulse position offset */ + int16_t pos[] /* o : pulse position */ +) +{ + int16_t i, pos1, pos2; + int32_t mask; + + mask = ( ( 1 << N ) - 1 ); + + pos1 = (int16_t) ( ( index >> N ) & mask ) + offset; + i = (int16_t) ( index >> ( 2 * N ) ) & 1; + pos2 = (int16_t) ( index & mask ) + offset; + if ( ( pos2 - pos1 ) < 0 ) + { + if ( i == 1 ) + { + pos1 += NB_POS_FCB_4T; + } + else + { + pos2 += NB_POS_FCB_4T; + } + } + else + { + if ( i == 1 ) + { + pos1 += NB_POS_FCB_4T; + pos2 += NB_POS_FCB_4T; + } + } + + pos[0] = pos1; + pos[1] = pos2; + + return; +} + +/*-------------------------------------------------------* + * dec_3p_3N1() + * + * Decode 3 pulses with 3*N+1 bits: + *-------------------------------------------------------*/ + +static void dec_3p_3N1( + const int32_t index, /* i : quantization index */ + const int16_t N, /* i : nb. of bits */ + const int16_t offset, /* i : pulse position offset */ + int16_t pos[] /* o : pulse position */ +) +{ + int16_t j; + int32_t idx, mask; + + mask = ( ( 1 << ( ( 2 * N ) - 1 ) ) - 1 ); + idx = index & mask; + j = offset; + + if ( ( ( index >> ( ( 2 * N ) - 1 ) ) & 1 ) == 1 ) + { + j += ( 1 << ( N - 1 ) ); + } + + dec_2p_2N1( idx, N - 1, j, pos ); + mask = ( ( 1 << ( N + 1 ) ) - 1 ); + idx = ( index >> ( 2 * N ) ) & mask; + dec_1p_N1( idx, N, offset, pos + 2 ); + + return; +} + +/*-------------------------------------------------------* + * dec_4p_4N1() + * + * Decode 4 pulses with 4*N+1 bits: + *-------------------------------------------------------*/ + +static void dec_4p_4N1( + const int32_t index, /* i : quantization index */ + const int16_t N, /* i : nb. of bits */ + const int16_t offset, /* i : pulse position offset */ + int16_t pos[] /* o : pulse position */ +) +{ + int16_t j; + int32_t mask, idx; + + mask = ( ( 1 << ( ( 2 * N ) - 1 ) ) - 1 ); + idx = index & mask; + j = offset; + + if ( ( ( index >> ( ( 2 * N ) - 1 ) ) & 1 ) == 1 ) + { + j += ( 1 << ( N - 1 ) ); + } + + dec_2p_2N1( idx, N - 1, j, pos ); + mask = ( ( 1 << ( ( 2 * N ) + 1 ) ) - 1 ); + idx = ( index >> ( 2 * N ) ) & mask; + dec_2p_2N1( idx, N, offset, pos + 2 ); + + return; +} + +/*-------------------------------------------------------* + * dec_4p_4N() + * + * Decode 4 pulses with 4*N bits: + *-------------------------------------------------------*/ + +static void dec_4p_4N( + const int32_t index, /* i : quantization index */ + const int16_t N, /* i : nb. of bits */ + const int16_t offset, /* i : pulse position offset */ + int16_t pos[] /* o : pulse position */ +) +{ + int16_t j, n_1; + + n_1 = N - 1; + j = offset + ( 1 << n_1 ); + switch ( ( index >> ( ( 4 * N ) - 2 ) ) & 3 ) + { + case 0: + { + if ( ( ( index >> ( ( 4 * n_1 ) + 1 ) ) & 1 ) == 0 ) + { + dec_4p_4N1( index, n_1, offset, pos ); + } + else + { + dec_4p_4N1( index, n_1, j, pos ); + } + break; + } + case 1: + { + dec_1p_N1( ( index >> ( ( 3 * n_1 ) + 1 ) ), n_1, offset, pos ); + dec_3p_3N1( index, n_1, j, pos + 1 ); + break; + } + case 2: + { + dec_2p_2N1( ( index >> ( ( 2 * n_1 ) + 1 ) ), n_1, offset, pos ); + dec_2p_2N1( index, n_1, j, pos + 2 ); + break; + } + case 3: + { + dec_3p_3N1( ( index >> ( n_1 + 1 ) ), n_1, offset, pos ); + dec_1p_N1( index, n_1, j, pos + 3 ); + break; + } + } + + return; +} + +/*-------------------------------------------------------* + * dec_5p_5N() + * + * Decode 5 pulses with 5*N bits: + *-------------------------------------------------------*/ + +static void dec_5p_5N( + const int32_t index, /* i : quantization index */ + const int16_t N, /* i : nb. of bits */ + const int16_t offset, /* i : pulse position offset */ + int16_t pos[] /* o : pulse position */ +) +{ + int16_t j, n_1; + int32_t idx; + + n_1 = N - 1; + j = offset + ( 1 << n_1 ); + idx = ( index >> ( ( 2 * N ) + 1 ) ); + + if ( ( ( index >> ( ( 5 * N ) - 1 ) ) & 1 ) == 0 ) + { + dec_3p_3N1( idx, n_1, offset, pos ); + dec_2p_2N1( index, N, offset, pos + 3 ); + } + else + { + dec_3p_3N1( idx, n_1, j, pos ); + dec_2p_2N1( index, N, offset, pos + 3 ); + } + + return; +} + +/*-------------------------------------------------------* + * dec_6p_6N2() + * + * Decode 6 pulses with 6*N+2 bits: + *-------------------------------------------------------*/ + +static void dec_6p_6N2( + const int32_t index, /* i : quantization index */ + const int16_t N, /* i : nb. of bits */ + const int16_t offset, /* i : pulse position offset */ + int16_t pos[] /* o : pulse position */ +) +{ + int16_t j, n_1, offsetA, offsetB; + + n_1 = N - 1; + j = offset + ( 1 << n_1 ); + offsetA = offsetB = j; + if ( ( ( index >> ( ( 6 * N ) - 5 ) ) & 1 ) == 0 ) + { + offsetA = offset; + } + else + { + offsetB = offset; + } + + switch ( ( index >> ( ( 6 * N ) - 4 ) ) & 3 ) + { + case 0: + { + dec_5p_5N( index >> N, n_1, offsetA, pos ); + dec_1p_N1( index, n_1, offsetA, pos + 5 ); + break; + } + + case 1: + { + dec_5p_5N( index >> N, n_1, offsetA, pos ); + dec_1p_N1( index, n_1, offsetB, pos + 5 ); + break; + } + + case 2: + { + dec_4p_4N( index >> ( ( 2 * n_1 ) + 1 ), n_1, offsetA, pos ); + dec_2p_2N1( index, n_1, offsetB, pos + 4 ); + break; + } + + case 3: + { + dec_3p_3N1( index >> ( ( 3 * n_1 ) + 1 ), n_1, offset, pos ); + dec_3p_3N1( index, n_1, j, pos + 3 ); + break; + } + } + + return; +} + +/*---------------------------------------------------------------------* + * fcb_decode_class_all_p() + * + * Get the position number and the pulse number on every position + *---------------------------------------------------------------------*/ + +/*! r: The index of pulse positions */ +static int32_t fcb_decode_class_all_p( + int32_t *code_index, /* i : fcb index information */ + int16_t sector_6p_num[], /* o : Number of pulses for each position */ + const int16_t pulse_num, /* i : Number of pulses on a track. */ + int16_t *pos_num /* o : Number of positions which have pulses on the track.*/ +) +{ + int16_t i, j, k; + int32_t mn9; + int16_t pulse_pos_num; + for ( i = 1; i <= pulse_num; i++ ) + { + if ( ( *code_index ) < PI_offset[pulse_num][i] ) + { + break; + } + } + + ( *code_index ) -= PI_offset[pulse_num][i - 1]; + + pulse_pos_num = pulse_num - i + 2; + j = (int16_t) ( ( *code_index ) >> pulse_pos_num ); + + k = (int16_t) ( j / PI_select_table[16][pulse_pos_num] ); + mn9 = j - k * PI_select_table[16][pulse_pos_num]; + if ( ( pulse_pos_num < pulse_num ) && ( pulse_pos_num > 1 ) ) + { + for ( i = 0; i < pulse_pos_num; i++ ) + { + sector_6p_num[i] = 1; + } + sector_6p_num[k]++; + } + else + { + if ( pulse_pos_num == 1 ) + { + sector_6p_num[0] = (int16_t) pulse_num; + } + else + { + for ( i = 0; i < pulse_num; i++ ) + { + sector_6p_num[i] = 1; + } + } + } + + *pos_num = pulse_pos_num; + + return mn9; +} + +/*---------------------------------------------------------------------* + * fcb_decode_position() + * + * Decode the pulse position not same to the others + *---------------------------------------------------------------------*/ + +static void fcb_decode_position( + int32_t index, /* i : position index information */ + int16_t pos_vector[], /* o : the positon vector */ + const int16_t pos_num /* i : number of positions */ +) +{ + int16_t i, l; + int32_t k; + int16_t temp; + + k = index; + l = 0; + temp = pos_num; + for ( i = 0; i < pos_num - 1; i++ ) + { + k = PI_select_table[16 - l][temp] - k; + + for ( ; PI_select_table[16 - l][temp] >= k; l += 2 ) + { + ; + } + + if ( k > PI_select_table[17 - l][temp] ) + { + l--; + } + + k = PI_select_table[17 - l][temp--] - k; + pos_vector[i] = (int16_t) ( l - 1 ); + } + pos_vector[i] = (int16_t) ( l + k ); + + return; +} + +/*---------------------------------------------------------------------* + * fcb_decode_PI() + * + * decode fcb pulse index + *---------------------------------------------------------------------*/ + +/*! r: return pulse position number */ +static void fcb_decode_PI( + int32_t code_index, /* i : fcb index information */ + int16_t sector_6p[], /* o : decoded pulse position */ + const int16_t pulse_num /* i : pulse number for the track */ +) +{ + int16_t i, l; + int32_t mn9; + int16_t pulse_pos_num; + int16_t sector_6p_temp[7], sector_6p_num_temp[7]; + int16_t *sector_6p_ptr0; + int16_t *sector_6p_ptr1; + + /*get the position number and the pulse number on every position */ + mn9 = fcb_decode_class_all_p( &code_index, sector_6p_num_temp, pulse_num, &pulse_pos_num ); + + /* rebuild the vector*/ + /* decode the pulse position not same to the others*/ + fcb_decode_position( mn9, sector_6p_temp, pulse_pos_num ); + for ( i = pulse_pos_num - 1; i >= 0; i-- ) + { + sector_6p_temp[i] += ( ( code_index & 0x1 ) << 4 ); + code_index = code_index >> 1; + } + + /* decode the pulse position maybe some pulse position same to other pulse */ + sector_6p_ptr0 = §or_6p[pulse_num]; + sector_6p_ptr1 = §or_6p_temp[pulse_pos_num]; + for ( i = 0; i < pulse_pos_num; i++ ) + { + sector_6p_ptr1--; + for ( l = 0; l < sector_6p_num_temp[pulse_pos_num - 1 - i]; l++ ) + { + *--sector_6p_ptr0 = *sector_6p_ptr1; + } + } + + return; +} + +/*---------------------------------------------------------------------* + * Read FCB index * + *---------------------------------------------------------------------*/ + +void D_ACELP_decode_43bit( + uint16_t idxs[], + float code[], + int16_t *pulsestrack ) +{ + int32_t ps[8]; + int16_t pos[7]; + int32_t joint_index; + int32_t joint_offset = 3611648; /*offset for 3 pulses per track*/ + + set_f( code, 0.0f, L_SUBFR ); + + ps[3] = idxs[0] & 0x1ff; + ps[2] = ( ( idxs[1] & 3 ) << 7 ) + ( idxs[0] >> 9 ); + joint_index = ( ( idxs[2] << 16 ) + idxs[1] ) >> 2; + + if ( joint_index >= joint_offset ) + { + joint_index = joint_index - joint_offset; + } + + ps[0] = joint_index / 5472; + ps[1] = joint_index - ps[0] * 5472; + fcb_decode_PI( ps[0], pos, 3 ); + add_pulses( pos, pulsestrack[0], 0, code ); + fcb_decode_PI( ps[1], pos, 3 ); + add_pulses( pos, pulsestrack[1], 1, code ); + + dec_2p_2N1( ps[2], 4, 0, pos ); + add_pulses( pos, pulsestrack[2], 2, code ); + dec_2p_2N1( ps[3], 4, 0, pos ); + add_pulses( pos, pulsestrack[3], 3, code ); + + return; +} + +/*-------------------------------------------------------* + * dec_1p_N1() + * + * Decode 1 pulse with N+1 bits + *-------------------------------------------------------*/ + +static void dec_1p_N1_L_subfr( + const int32_t index, /* i : quantization index */ + const int16_t nb_pos, /* i : number of positions */ + const int16_t N, /* i : nb. of bits */ + int16_t pos[] /* o : pulse position */ +) +{ + int16_t i, pos1; + int32_t mask; + + mask = ( ( 1 << N ) - 1 ); + pos1 = (int16_t) ( index & mask ); + i = (int16_t) ( index >> N ) & 1; + + if ( i == 1 ) + { + pos1 += nb_pos; + } + + pos[0] = pos1; + + return; +} + +/*-------------------------------------------------------* + * add_pulses() + * + * Add decoded pulses to the codeword + *-------------------------------------------------------*/ + +static void add_pulses_L_subfr( + const int16_t nb_pos, /* i : number of positions */ + const int16_t pos[], /* i : pulse position */ + const int16_t nb_pulse, /* i : nb. of pulses */ + const int16_t track, /* i : no. of the tracks */ + float code[] /* i/o: decoded codevector */ +) +{ + int16_t i, k; + + for ( k = 0; k < nb_pulse; k++ ) + { + i = ( ( pos[k] & ( nb_pos - 1 ) ) * NB_TRACK_FCB_4T ) + track; + if ( ( pos[k] & nb_pos ) == 0 ) + { + code[i] += 1.0f; + } + else + { + code[i] -= 1.0f; + } + } + + return; +} + +/*----------------------------------------------------------------------------------* + * dec_acelp_fast() + * + * fast algebraic codebook decoder + *----------------------------------------------------------------------------------*/ + +void dec_acelp_fast( + Decoder_State *st, /* i/o: decoder state structure */ + const int16_t cdk_index, /* i : codebook index */ + float code[], /* o : algebraic (fixed) codebook excitation */ + const int16_t L_subfr /* i : subframe length */ +) +{ + int16_t k, pos[7], skip_track; + int32_t L_index; + PulseConfig config; + + skip_track = -1; + set_f( code, 0.0f, L_subfr ); + + if ( L_subfr == L_SUBFR ) + { + config = PulseConfTable[cdk_index]; + + if ( cdk_index == 2 ) + { + dec_acelp_2t32( st, code ); + } + else if ( config.nb_pulse == 2 ) + { + /* 10 bits, 2 pulses, 4 tracks 1010 (used only even tracks) */ + for ( k = 0; k < NB_TRACK_FCB_4T - 1; k += 2 ) + { + L_index = get_next_indice( st, 5 ); + dec_1p_N1( L_index, 4, 0, pos ); + add_pulses( pos, 1, k, code ); + } + } + else if ( config.nb_pulse == 3 ) + { + if ( config.codetrackpos == TRACKPOS_FIXED_FIRST ) + { + /* 15 bits, 3 pulses, 4 tracks 1110 fixed track to first ? */ + for ( k = 0; k < NB_TRACK_FCB_4T - 1; k++ ) + { + L_index = get_next_indice( st, 5 ); + dec_1p_N1( L_index, 4, 0, pos ); + add_pulses( pos, 1, k, code ); + } + } + else if ( config.codetrackpos == TRACKPOS_FREE_THREE ) + { + /* 17 bits, 3 pulses, 4 tracks (used all tracks) - 1110, 1101, 1011, 0111 */ + skip_track = get_next_indice( st, 2 ); + for ( k = 0; k < NB_TRACK_FCB_4T; k++ ) + { + if ( k != skip_track ) + { + L_index = get_next_indice( st, 5 ); + dec_1p_N1( L_index, 4, 0, pos ); + add_pulses( pos, 1, k, code ); + } + } + } + } + else + { + if ( config.bits == 20 ) + { + skip_track = -1; + } + else if ( config.codetrackpos == TRACKPOS_FIXED_FIRST ) + { + skip_track = 0; + } + else if ( config.codetrackpos == TRACKPOS_FREE_ONE ) + { + skip_track = get_next_indice( st, 2 ); + } + + for ( k = 0; k < NB_TRACK_FCB_4T; k++ ) + { + if ( k == skip_track ) + { + L_index = get_next_indice( st, 9 ); + dec_2p_2N1( L_index, 4, 0, pos ); + add_pulses( pos, 2, k, code ); + } + else + { + L_index = get_next_indice( st, 5 ); + dec_1p_N1( L_index, 4, 0, pos ); + add_pulses( pos, 1, k, code ); + } + } + } + } + else /* L_subfr == 2*L_SUBFR */ + { + config.bits = cdk_index; + + if ( cdk_index == 14 ) + { + /* 14 bits, 2 pulses, 2 tracks: 11 (used all tracks) */ + int16_t index, i0, i1; + + index = get_next_indice( st, 14 ); + + i0 = ( ( index >> 7 ) & ( NB_POS_FCB_2T_128 - 1 ) ) * NB_TRACK_FCB_2T; + i1 = ( ( index & ( NB_POS_FCB_2T_128 - 1 ) ) * NB_TRACK_FCB_2T ) + 1; + + code[i0] = -1.0f; + if ( ( index & 0x2000 ) == 0 ) + { + code[i0] = 1.0f; + } + + code[i1] = -1.0f; + if ( ( index & 0x40 ) == 0 ) + { + code[i1] = 1.0f; + } + } + else if ( cdk_index == 12 ) + { + /* 12 bits, 2 pulses, 4 tracks: 1010 (used only even tracks) */ + for ( k = 0; k < NB_TRACK_FCB_4T - 1; k += 2 ) + { + L_index = get_next_indice( st, 6 ); + dec_1p_N1_L_subfr( L_index, NB_POS_FCB_4T_128, 5, pos ); + add_pulses_L_subfr( NB_POS_FCB_4T_128, pos, 1, k, code ); + } + } + else if ( cdk_index == 18 ) + { + /* 18 bits, 3 pulses, 4 tracks: 1110 (used first three tracks) */ + for ( k = 0; k < NB_TRACK_FCB_4T - 1; k++ ) + { + L_index = get_next_indice( st, 6 ); + dec_1p_N1_L_subfr( L_index, NB_POS_FCB_4T_128, 5, pos ); + add_pulses_L_subfr( NB_POS_FCB_4T_128, pos, 1, k, code ); + } + } + else if ( cdk_index == 20 ) + { + /* 20 bits, 3 pulses, 4 tracks (used all tracks): 1110, 1101, 1011, 0111 */ + skip_track = get_next_indice( st, 2 ); + for ( k = 0; k < NB_TRACK_FCB_4T; k++ ) + { + if ( k != skip_track ) + { + L_index = get_next_indice( st, 6 ); + dec_1p_N1_L_subfr( L_index, NB_POS_FCB_4T_128, 5, pos ); + add_pulses_L_subfr( NB_POS_FCB_4T_128, pos, 1, k, code ); + } + } + } + else if ( cdk_index == 24 ) + { + /* 24 bits, 4 pulses, 4 tracks: 1111 */ + for ( k = 0; k < NB_TRACK_FCB_4T; k++ ) + { + L_index = get_next_indice( st, 6 ); + dec_1p_N1_L_subfr( L_index, NB_POS_FCB_4T_128, 5, pos ); + add_pulses_L_subfr( NB_POS_FCB_4T_128, pos, 1, k, code ); + } + } + } + + return; +} diff --git a/lib_dec/dec_LPD.c b/lib_dec/dec_LPD.c new file mode 100644 index 0000000000000000000000000000000000000000..e3d0561c21a4731cc57b21ffff23378d9c6f472a --- /dev/null +++ b/lib_dec/dec_LPD.c @@ -0,0 +1,788 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include "options.h" +#include +#include "prot.h" +#include "rom_com.h" +#include "cnst.h" +#include "basop_proto_func.h" +#include "stat_com.h" +#include "wmc_auto.h" + + +/*-------------------------------------------------------------------* + * decoder_LPD() + * + * Core decoder MODE2 + *--------------------------------------------------------------------*/ + +void decoder_LPD( + Decoder_State *st, /* i/o: decoder memory state pointer */ + float signal_out[], /* o : signal with LPD delay (7 subfrs) */ + float signal_outFB[], /* o : synthesis @output_FS */ + int16_t *total_nbbits, /* i/o: number of bits / decoded bits */ + float *bpf_noise_buf, /* i/o: BPF noise buffer */ + int16_t bfi, /* i : BFI flag */ + int16_t *bitsRead, /* o : number of read bits */ + int16_t param[], /* o : buffer of parameters */ + float *pitch_buf, /* i/o: floating pitch values for each subfr*/ + float *voice_factors, /* o : voicing factors */ + float *ptr_bwe_exc /* o : excitation for SWB TBE */ +) +{ + int16_t *prm; + int16_t param_lpc[NPRM_LPC_NEW]; + float synth_buf[OLD_SYNTH_SIZE_DEC + L_FRAME_PLUS + M]; + float *synth; + float synth_bufFB[OLD_SYNTH_SIZE_DEC + L_FRAME_PLUS + M]; + float *synthFB; + float lsf[( NB_DIV + 1 ) * M], lsp[( NB_DIV + 1 ) * M], lspmid[M], lsfmid[M]; + float Aq[( NB_SUBFR16k + 1 ) * ( M + 1 )]; + int16_t pitch[NB_SUBFR16k]; + float pit_gain[NB_SUBFR16k]; + int16_t i, k; + int16_t past_core_mode, offset; + int16_t L_frame, nb_subfr, L_frameTCX; + Word16 Aind[M + 1], lspind[M]; + float tmp_old[M + 1], tmp_new[M + 1], enr_old, enr_new; + float lspnew_uw[NB_DIV * M], lsfnew_uw[NB_DIV * M]; + float lsf_q_1st_rf[M], lsf_q_rf[M], lsp_q_rf[M]; + float lsp_diff; + int16_t LSF_Q_prediction; /* o : LSF prediction mode */ + int16_t tcx_last_overlap_mode, tcx_current_overlap_mode; + TCX_LTP_DEC_HANDLE hTcxLtpDec = st->hTcxLtpDec; + TCX_DEC_HANDLE hTcxDec = st->hTcxDec; + + /*--------------------------------------------------------------------------------* + * Initializations + *--------------------------------------------------------------------------------*/ + + prm = param; /* to avoid compilation warnings */ + LSF_Q_prediction = -1; /* to avoid compilation warnings */ + enr_old = 0.0f; + enr_new = 0.0f; + + if ( st->use_partial_copy && st->rf_frame_type >= RF_TCXFD && st->rf_frame_type <= RF_TCXTD2 ) + { + bfi = st->bfi; + } + + past_core_mode = st->last_core_bfi; + + /*Adjust bit per frame*/ + if ( !bfi ) + { + st->bits_frame_core = st->bits_frame - ( *bitsRead ); + } + + /* Framing parameters */ + L_frame = st->L_frame; + L_frameTCX = st->hTcxDec->L_frameTCX; + nb_subfr = st->nb_subfr; + + /* Initialize pointers */ + synth = synth_buf + st->hTcxDec->old_synth_len; + synthFB = synth_bufFB + st->hTcxDec->old_synth_lenFB; + mvr2r( st->hTcxDec->old_synth, synth_buf, st->hTcxDec->old_synth_len ); + mvr2r( st->hTcxDec->old_synthFB, synth_bufFB, st->hTcxDec->old_synth_lenFB ); + set_zero( synth, L_FRAME_PLUS + M ); + set_zero( synthFB, L_FRAME_PLUS + M ); + + + /*For post-processing (post-filtering+blind BWE)*/ + if ( st->tcxonly == 0 ) + { + /* for bass postfilter */ + set_s( pitch, L_SUBFR, nb_subfr ); + set_zero( pit_gain, nb_subfr ); + } + + /* PLC: [Common: Memory update] + * PLC: Update the number of lost frames */ + if ( bfi ) + { + st->nbLostCmpt++; + } + + /*--------------------------------------------------------------------------------* + * BITSTREAM DECODING + *--------------------------------------------------------------------------------*/ + + if ( !bfi ) + { + st->second_last_core = st->last_core; + tcx_last_overlap_mode = st->hTcxCfg->tcx_last_overlap_mode; + tcx_current_overlap_mode = st->hTcxCfg->tcx_curr_overlap_mode; + + dec_prm( st, param, param_lpc, total_nbbits, bitsRead ); + + if ( !st->rate_switching_init && ( st->last_codec_mode ) == MODE2 && st->BER_detect ) + { + st->coder_type = st->last_coder_type; + st->last_core = st->second_last_core; + st->hTcxCfg->tcx_last_overlap_mode = tcx_last_overlap_mode; + st->hTcxCfg->tcx_curr_overlap_mode = tcx_current_overlap_mode; + st->bfi = 1; + bfi = 1; + st->flagGuidedAcelp = 0; + st->nbLostCmpt++; + st->core_brate = st->last_core_brate; + st->core = GetPLCModeDecision( st ); + } + } + else + { + if ( st->use_partial_copy && st->rf_frame_type >= RF_TCXFD && st->rf_frame_type <= RF_TCXTD2 ) + { + dec_prm( st, param, param_lpc, total_nbbits, bitsRead ); + } + + if ( st->nbLostCmpt > 1 ) + { + st->flagGuidedAcelp = 0; + } + /* PLC: [Common: mode decision] + * PLC: Decide which Concealment to use. Update pitch lags if needed */ + st->core = GetPLCModeDecision( st ); + } + + /* PLC: [Common: Memory update] + * PLC: Update the number of lost frames */ + if ( !bfi ) + { + if ( st->prev_bfi == 1 ) + { + st->prev_nbLostCmpt = st->nbLostCmpt; + } + else + { + st->prev_nbLostCmpt = 0; + } + + st->nbLostCmpt = 0; + } + + /*--------------------------------------------------------------------------------* + * LPC PARAMETERS + *--------------------------------------------------------------------------------*/ + + if ( ( bfi == 0 ) || ( bfi == 1 && st->use_partial_copy && st->rf_frame_type == RF_TCXFD ) ) + { + if ( st->use_partial_copy && ( st->rf_frame_type < RF_TCXFD || st->rf_frame_type > RF_TCXTD2 ) ) + { + if ( hTcxDec->envWeighted ) + { + mvr2r( st->lspold_uw, st->lsp_old, M ); + mvr2r( st->lsfold_uw, st->lsf_old, M ); + hTcxDec->envWeighted = 0; + } + + /* first stage VQ, 8 bits; reuse TCX high rate codebook */ + set_f( lsf_q_1st_rf, 0.0f, M ); + vlpc_1st_dec( param_lpc[0], lsf_q_1st_rf, st->sr_core ); + + /* second stage vq */ + /* quantized lsf from two stages */ + v_add( lsf_q_1st_rf, lsf_q_diff_cb_8b_rf + M * param_lpc[1], lsf_q_rf, M ); + + v_sort( lsf_q_rf, 0, M - 1 ); + reorder_lsf( lsf_q_rf, LSF_GAP, M, st->sr_core ); + + /* current n-th ACELP frame and its corresponding partial copy */ + lsf2lsp( lsf_q_rf, lsp_q_rf, M, st->sr_core ); + + /* copy the old and current lsfs and lsps into the lsf[] and lsp[] buffer for interpolation */ + mvr2r( st->lsf_old, &lsf[0], M ); + mvr2r( st->lsp_old, &lsp[0], M ); + mvr2r( lsf_q_rf, &lsf[M], M ); + mvr2r( lsp_q_rf, &lsp[M], M ); + lsp_diff = 0.0f; + + for ( i = 0; i < M; i++ ) + { + lsp_diff += (float) fabs( lsp[i + M] - lsp[i] ); + } + + if ( st->core == ACELP_CORE && st->last_core == ACELP_CORE && lsp_diff < 1.6f && lsp_diff > 0.12f && st->next_coder_type == GENERIC && !st->prev_use_partial_copy && st->last_coder_type == UNVOICED && st->rf_frame_type >= RF_GENPRED ) + { + mvr2r( &lsp[0], &lsp[M], M ); + } + + /* update mem_MA and mem_AR memories */ + lsf_update_memory( st->narrowBand, &lsf[M], st->mem_MA, st->mem_MA ); + mvr2r( &lsf[M], st->mem_AR, M ); + + for ( k = 0; k < st->numlpc; ++k ) + { + mvr2r( &lsp[( k + 1 ) * M], &lspnew_uw[k * M], M ); + mvr2r( &lsf[( k + 1 ) * M], &lsfnew_uw[k * M], M ); + } + } + else if ( ( hTcxDec->enableTcxLpc && st->core != ACELP_CORE ) || ( bfi && st->use_partial_copy && st->rf_frame_type == RF_TCXFD ) ) + { + int16_t tcx_lpc_cdk; + + if ( bfi && st->use_partial_copy && st->rf_frame_type == RF_TCXFD ) + { + tcx_lpc_cdk = tcxlpc_get_cdk( GENERIC ); + } + else + { + tcx_lpc_cdk = tcxlpc_get_cdk( st->coder_type ); + } + + mvr2r( st->lsf_old, &lsf[0], M ); + mvr2r( st->lsp_old, &lsp[0], M ); + + D_lsf_tcxlpc( param_lpc, &lsf[M], lspind, st->narrowBand, tcx_lpc_cdk, st->mem_MA ); + + lsf2lsp( &lsf[M], &lsp[M], M, st->sr_core ); + + lsf_update_memory( st->narrowBand, &lsf[M], st->mem_MA, st->mem_MA ); + mvr2r( &lsf[M], st->mem_AR, M ); + hTcxDec->envWeighted = 1; + + E_LPC_lsp_unweight( &lsp[M], lspnew_uw, lsfnew_uw, 1.0f / st->gamma ); + } + else + { + if ( hTcxDec->envWeighted ) + { + mvr2r( st->lspold_uw, st->lsp_old, M ); + mvr2r( st->lsfold_uw, st->lsf_old, M ); + hTcxDec->envWeighted = 0; + } + + /* Unquantize LPC */ + if ( st->core == TCX_20_CORE ) + { + lpc_unquantize( st, lsf, lsp, param_lpc, lspmid, lsfmid, AUDIO, &LSF_Q_prediction ); + } + else + { + lpc_unquantize( st, lsf, lsp, param_lpc, lspmid, lsfmid, st->coder_type, &LSF_Q_prediction ); + + if ( st->prev_use_partial_copy && st->last_core == ACELP_CORE && st->core == ACELP_CORE && st->prev_rf_frame_type >= RF_GENPRED && st->coder_type == UNVOICED ) + { + if ( st->lpcQuantization && st->acelp_cfg.midLpc ) + { + mvr2r( lspmid, &lsp[0], M ); + mvr2r( &lsp[M], lspmid, M ); + } + } + } + + for ( k = 0; k < st->numlpc; ++k ) + { + mvr2r( &lsp[( k + 1 ) * M], &lspnew_uw[k * M], M ); + mvr2r( &lsf[( k + 1 ) * M], &lsfnew_uw[k * M], M ); + } + } + + /* PLC: [LPD: LPC concealment] built the moving average for the LPC concealment */ + for ( k = 0; k < st->numlpc; k++ ) + { + for ( i = 0; i < M; i++ ) + { + st->lsf_adaptive_mean[i] = ( st->lsfoldbfi1[i] + st->lsfoldbfi0[i] + lsfnew_uw[k * M + i] ) / 3; + st->lsfoldbfi1[i] = st->lsfoldbfi0[i]; + st->lsfoldbfi0[i] = lsfnew_uw[k * M + i]; + } + } + } + else + { + /* PLC: [LPD: LPC concealment] Conceal the LPC from the lost frame */ + const float *lsfBase; /* base for differential lsf coding */ + + if ( st->tcxonly == 0 || st->core < TCX_10_CORE ) + { + st->numlpc = 1; + } + else + { + st->numlpc = 2; + } + + if ( st->nbLostCmpt == 1 ) + { + mvr2r( st->lsf_old, st->old_lsf_q_cng, M ); + mvr2r( st->lsp_old, st->old_lsp_q_cng, M ); + } + + + lsfBase = PlcGetlsfBase( st->lpcQuantization, st->narrowBand, st->sr_core ); + + dlpc_bfi( st->L_frame, lsfnew_uw, st->lsfold_uw, st->last_good, st->nbLostCmpt, st->mem_MA, st->mem_AR, &( st->stab_fac ), st->lsf_adaptive_mean, st->numlpc, st->lsf_cng, st->plcBackgroundNoiseUpdated, st->lsf_q_cng, st->old_lsf_q_cng, lsfBase ); + + hTcxDec->envWeighted = 0; + + mvr2r( st->lspold_uw, lsp, M ); + mvr2r( st->lsfold_uw, lsf, M ); + + for ( k = 0; k < st->numlpc; k++ ) + { + mvr2r( &lsfnew_uw[k * M], &lsf[( k + 1 ) * M], M ); + + lsf2lsp( &lsf[( k + 1 ) * M], &lsp[( k + 1 ) * M], M, st->sr_core ); + lsf2lsp( st->lsf_q_cng, st->lsp_q_cng, M, st->sr_core ); + + mvr2r( &lsp[( k + 1 ) * M], &lspnew_uw[k * M], M ); + } + } + + /*--------------------------------------------------------------* + * Rate switching + *---------------------------------------------------------------*/ + + if ( st->rate_switching_reset ) + { + mvr2r( &( lsf[M] ), &( lsf[0] ), M ); + mvr2r( &( lsp[M] ), &( lsp[0] ), M ); + mvr2r( &( lsf[M] ), st->lsf_old, M ); + mvr2r( &( lsp[M] ), st->lsp_old, M ); + mvr2r( &( lsf[M] ), lsfmid, M ); + mvr2r( &( lsp[M] ), lspmid, M ); + lsp2a_stab( st->lsp_old, st->old_Aq_12_8, M ); + } + + if ( st->enablePlcWaveadjust ) + { + if ( st->core == ACELP_CORE ) + { + st->tonality_flag = 0; + } + + if ( bfi ) + { + st->hPlcInfo->nbLostCmpt++; + } + } + + /*--------------------------------------------------------------------------------* + * ACELP + *--------------------------------------------------------------------------------*/ + + if ( st->prev_bfi != 0 && bfi == 0 && st->coder_type == VOICED && st->prev_nbLostCmpt > 4 ) + { + st->dec_glr_idx = 1; + st->reset_mem_AR = 1; + } + + if ( st->core == ACELP_CORE ) + { + if ( !st->tcxonly ) + { + /* Set pointer to parameters */ + prm = param; + + /* Stability Factor */ + if ( !bfi ) + { + st->stab_fac = lsf_stab( &lsf[M], &lsf[0], 0, st->L_frame ); + } + + if ( !bfi && st->prev_bfi ) + { + /* check if LSP interpolation can be relaxed or if LPC power can be diffused*/ + lsp2a_stab( &lsp[0], tmp_old, M ); + enr_old = enr_1_Az( tmp_old, 2 * L_SUBFR ); + + lsp2a_stab( &lsp[M], tmp_new, M ); + enr_new = enr_1_Az( tmp_new, 2 * L_SUBFR ); + } + + if ( !bfi && ( st->dec_glr_idx == 1 || ( !( st->safety_net ) && enr_new >= 256.f && enr_new > 2 * enr_old ) ) && st->prev_bfi ) + { + RecLpcSpecPowDiffuseLc( &lsp[M], &lsp[0], &lsf[M], st, st->dec_glr_idx == 1 ? 1 : 0 ); + int_lsp( L_frame, &lsp[0], &lsp[M], Aq, M, interpol_frac_12k8, 0 ); + mvr2r( &lsf[M], lsfnew_uw, M ); + } + else + { + /* LPC Interpolation for ACELP */ + if ( !bfi && st->acelp_cfg.midLpc ) + { + st->relax_prev_lsf_interp = 0; + + if ( st->prev_bfi ) + { + /* check if LSP interpolation can be relaxed */ + if ( enr_new < ( 0.25f * enr_old ) ) + { + /* don't use safety_net as this is getting impacted with lsf_restruct */ + if ( st->clas_dec == UNVOICED_CLAS || st->clas_dec == SIN_ONSET || st->clas_dec == INACTIVE_CLAS || st->coder_type == GENERIC || st->coder_type == TRANSITION ) + { + st->relax_prev_lsf_interp = 1; + } + else + { + st->relax_prev_lsf_interp = -1; + } + } + } + + if ( st->stab_fac == 0 && st->old_bfi_cnt > 0 && st->clas_dec != VOICED_CLAS && st->clas_dec != ONSET && st->relax_prev_lsf_interp == 0 ) + { + st->relax_prev_lsf_interp = 2; + } + int_lsp4( L_frame, &lsp[0], lspmid, &lsp[M], Aq, M, st->relax_prev_lsf_interp ); + } + else + { + int_lsp( L_frame, &lsp[0], &lsp[M], Aq, M, interpol_frac_12k8, 0 ); + int_lsp( L_frame, st->old_lsp_q_cng, st->lsp_q_cng, st->Aq_cng, M, interpol_frac_12k8, 0 ); + } + } + } + + if ( bfi && st->last_core != ACELP_CORE ) + { + /* PLC: [TCX: TD PLC] */ + con_tcx( st, &synthFB[0], -1.f, NULL, 0, NULL ); + lerp( synthFB, synth, st->L_frame, st->hTcxDec->L_frameTCX ); + st->con_tcx = 1; + set_f( &st->mem_pitch_gain[2], st->lp_gainp, st->nb_subfr ); + } + else + { + /* ACELP decoder */ + if ( st->hBWE_TD != NULL ) + { + if ( st->L_frame == L_FRAME ) + { + mvr2r( Aq + 2 * ( M + 1 ), st->hBWE_TD->cur_sub_Aq, ( M + 1 ) ); + } + else + { + mvr2r( Aq + 3 * ( M + 1 ), st->hBWE_TD->cur_sub_Aq, ( M + 1 ) ); + } + } + + if ( bfi ) + { + /* PLC: [ACELP: general] + * PLC: Use the ACELP like concealment */ + con_acelp( Aq, st->core_ext_mode, &synth[0], pitch, pit_gain, st->stab_fac, st, pitch_buf, voice_factors, ptr_bwe_exc ); + mvr2r( &st->mem_pitch_gain[2], &st->mem_pitch_gain[st->nb_subfr + 2], st->nb_subfr ); + set_zero( &st->mem_pitch_gain[2], st->nb_subfr ); + } + else + { + decoder_acelp( st, prm, Aq, st->acelp_cfg, &synth[0], pitch, pit_gain, st->stab_fac, pitch_buf, voice_factors, LSF_Q_prediction, ptr_bwe_exc ); + + if ( st->flagGuidedAcelp > 0 ) + { + st->guidedT0 = max( min( st->T0_4th + st->guidedT0, NBPSF_PIT_MAX ), PIT_MIN_16k ); + } + + for ( i = 0; i < st->nb_subfr; i++ ) + { + st->mem_pitch_gain[2 + ( 2 * st->nb_subfr - 1 ) - i] = st->mem_pitch_gain[2 + ( st->nb_subfr - 1 ) - i]; + st->mem_pitch_gain[2 + ( st->nb_subfr - 1 ) - i] = pit_gain[i]; + } + } + } + + /* LPC for ACELP/BWE */ + if ( st->narrowBand || st->sr_core == INT_FS_12k8 || st->sr_core == INT_FS_16k ) + { + mvr2r( Aq, st->mem_Aq, nb_subfr * ( M + 1 ) ); + } + + /* PLC: [TCX: Tonal Concealment] */ + /* Signal that this frame is not TCX */ + TonalMDCTConceal_UpdateState( st->hTonalMDCTConc, 0, 0, 0, 0 ); + + if ( !bfi ) + { + st->second_last_tns_active = st->last_tns_active; + st->last_tns_active = 0; + hTcxDec->tcxltp_last_gain_unmodified = 0.0f; + } + } + + + /*--------------------------------------------------------------------------------* + * TCX20 + *--------------------------------------------------------------------------------*/ + + if ( st->core == TCX_20_CORE ) + { + /* Set pointer to parameters */ + prm = param; + + /* Stability Factor */ + if ( !bfi ) + { + st->stab_fac = lsf_stab( &lsf[M], &lsf[0], 0, st->L_frame ); + } + + if ( hTcxDec->enableTcxLpc ) + { + /* Convert quantized lsp to A */ + lsp2a_stab( &lsp[M], Aq, M ); + } + else + { + if ( !st->tcxonly ) + { + if ( !bfi && st->prev_bfi && !( st->safety_net ) && st->rate_switching_reset ) + { + /* diffuse LPC power on rate switching*/ + RecLpcSpecPowDiffuseLc( &lsp[M], &lsp[0], &lsf[M], st, 0 ); + int_lsp( L_frame, &lsp[0], &lsp[M], Aq, M, interpol_frac_12k8, 0 ); + mvr2r( &lsf[M], lsfnew_uw, M ); + } + else + { + /* LPC Interpolation for TCX */ + E_LPC_int_lpc_tcx( &lsp[0], &lsp[M], Aq ); + } + } + else + { + lsp2a_stab( &lsp[M], Aq, M ); + } + } + + if ( !bfi && hTcxDec->tcx_lpc_shaped_ari ) + { + basop_E_LPC_f_lsp_a_conversion( lspind, Aind, M ); + } + + /* TCX decoder */ + decoder_tcx( st, prm, Aq, Aind, &synth[0], &synthFB[0], bfi, 0, 0 ); + } + + /*--------------------------------------------------------------------------------* + * TCX10 + *--------------------------------------------------------------------------------*/ + + if ( st->core == TCX_10_CORE ) + { + prm = NULL; /* just to avoid MSVC warnings */ + + for ( k = 0; k < 2; k++ ) + { + /* Set pointer to parameters */ + prm = param + ( k * DEC_NPRM_DIV ); + + /* Stability Factor */ + if ( !bfi ) + { + st->stab_fac = lsf_stab( &lsf[( k + 1 ) * M], &lsf[k * M], 0, st->L_frame ); + } + + lsp2a_stab( &lsp[( k + 1 ) * M], Aq, M ); + IGFDecRestoreTCX10SubFrameData( st->hIGFDec, k ); + + /* TCX decoder */ + decoder_tcx( st, prm, Aq, Aind, &synth[k * L_frame / 2], &synthFB[k * L_frameTCX / 2], bfi, k, 0 ); + } + } + + if ( st->core == TCX_10_CORE || st->core == TCX_20_CORE ) + { + if ( st->enablePlcWaveadjust || /* bfi */ + ( st->last_total_brate >= HQ_48k && /* recovery */ + st->last_codec_mode == MODE2 ) ) + { + /* waveform adjustment */ + concealment_signal_tuning( st, bfi, synthFB, past_core_mode ); + + if ( ( bfi || st->prev_bfi ) && st->hPlcInfo->Pitch && st->hPlcInfo->concealment_method == TCX_NONTONAL ) + { + lerp( synthFB, synth, L_frame, L_frameTCX ); + + if ( !bfi && st->prev_bfi ) + { + st->hPlcInfo->Pitch = 0; + } + } + } + + if ( !bfi ) + { + TonalMDCTConceal_SaveTimeSignal( st->hTonalMDCTConc, synthFB, L_frameTCX ); + } + + decoder_tcx_post( st, synth, synthFB, Aq, bfi, 0 ); + + if ( st->core == TCX_20_CORE ) + { + /* LPC Interpolation for BWE/post-processing */ + if ( st->narrowBand || st->sr_core == INT_FS_12k8 || st->sr_core == INT_FS_16k ) + { + int_lsp( L_frame, st->lspold_uw, lspnew_uw, Aq, M, interpol_frac_12k8, 0 ); + mvr2r( Aq, st->mem_Aq, nb_subfr * ( M + 1 ) ); + } + } + } + + + /* PLC: [Common: Classification] */ + /* the classifier buffer is always updated if the sr is at + 16000 or below - the classification itself is just performed if(!st->tcxonly ) */ + if ( st->sr_core <= INT_FS_16k ) + { + if ( st->core == TCX_20_CORE || st->core == TCX_10_CORE || ( st->tcxonly && st->bfi ) ) + { + float pitch_C[4]; + + /* note: the classifier needs the pitch only for tcx_only == 0, i.e. not for TCX10 */ + pitch_C[0] = pitch_C[1] = pitch_C[2] = pitch_C[3] = (float) floor( st->old_fpitch + 0.5f ); + + FEC_clas_estim( synth, pitch_C, st->L_frame, st->tcxonly ? GENERIC : st->core_ext_mode, st->codec_mode, st->mem_syn_clas_estim, &st->clas_dec, &st->lp_ener_bfi, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, hTcxLtpDec->tcxltp ? hTcxDec->tcxltp_last_gain_unmodified : -1.0f, st->narrowBand, CLASSIFIER_TCX, bfi, st->preemph_fac, st->tcxonly, st->last_core_brate, -1 ); + } + } + + /*--------------------------------------------------------------------------------* + * Updates + *--------------------------------------------------------------------------------*/ + + if ( bfi && st->last_core != ACELP_CORE ) + { + /* Update FEC_scale_syn parameters */ + if ( hTcxLtpDec->tcxltp_gain == 0 ) + { + fer_energy( L_frame, UNVOICED, synth, (float) ( L_frame / 2 ), &st->enr_old, L_frame ); + } + else + { + fer_energy( L_frame, st->clas_dec, synth, st->old_fpitch, &st->enr_old, L_frame ); + } + } + + if ( !bfi && st->clas_dec >= VOICED_TRANSITION && st->clas_dec < INACTIVE_CLAS ) + { + if ( st->core == ACELP_CORE ) + { + offset = ( st->nb_subfr - 1 ) * ( M + 1 ); + } + else + { + /* TCX */ + offset = 0; + } + + /* use latest LPC set */ + st->old_enr_LP = enr_1_Az( Aq + offset, L_SUBFR ); + } + + + /* Update */ + mvr2r( synth_buf + L_frame, st->hTcxDec->old_synth, st->hTcxDec->old_synth_len ); + mvr2r( st->hTcxDec->old_synthFB + L_frameTCX - NS2SA( st->output_Fs, PH_ECU_MEM_NS ), st->hTcxDec->synth_history, NS2SA( st->output_Fs, PH_ECU_MEM_NS ) ); + mvr2r( synth_bufFB + L_frameTCX, st->hTcxDec->old_synthFB, st->hTcxDec->old_synth_lenFB ); + mvr2r( st->hHQ_core->old_out + NS2SA( st->output_Fs, N_ZERO_MDCT_NS ), st->hTcxDec->old_synthFB + st->hTcxDec->old_synth_lenFB, NS2SA( st->output_Fs, PH_ECU_LOOKAHEAD_NS ) ); + + mvr2r( &lspnew_uw[( st->numlpc - 1 ) * M], st->lspold_uw, M ); + mvr2r( &lsfnew_uw[( st->numlpc - 1 ) * M], st->lsfold_uw, M ); + + if ( bfi == 1 ) + { + mvr2r( st->lspold_uw, st->lsp_old, M ); /* for recovery */ + mvr2r( st->lsfold_uw, st->lsf_old, M ); /* for recovery */ + } + else + { + mvr2r( &lsp[st->numlpc * M], st->lsp_old, M ); + mvr2r( &lsf[st->numlpc * M], st->lsf_old, M ); + } + mvr2r( st->lsp_q_cng, st->old_lsp_q_cng, M ); + mvr2r( st->lsf_q_cng, st->old_lsf_q_cng, M ); + + /* Update MODE1 CNG parameters */ + if ( !st->tcxonly && st->hTdCngDec != NULL ) + { + /* update CNG parameters in active frames */ + if ( st->bwidth == NB && hTcxDec->enableTcxLpc && st->core != ACELP_CORE ) + { + float buf[L_LP], res[L_FRAME], A[M + 1], r[M + 1], tmp, lsptmp[M]; + assert( st->L_frame == L_FRAME ); + mvr2r( synth + L_FRAME - L_LP, buf, L_LP ); + tmp = synth[L_FRAME - L_LP - 1]; + preemph( buf, st->preemph_fac, L_LP, &tmp ); + autocorr( buf, r, M, L_LP, LP_assym_window, 0, 0, 0 ); + lag_wind( r, M, INT_FS_12k8, LAGW_WEAK ); + lev_dur( A, r, M, NULL ); + a2lsp_stab( A, lsptmp, &lspnew_uw[0] ); + residu( A, M, buf + L_LP - L_FRAME, res, L_FRAME ); + + if ( st->hTdCngDec != NULL ) + { + cng_params_upd( lsptmp, res, st->L_frame, &st->hTdCngDec->ho_circ_ptr, st->hTdCngDec->ho_ener_circ, &st->hTdCngDec->ho_circ_size, st->hTdCngDec->ho_lsp_circ, DEC, st->hTdCngDec->ho_env_circ, NULL, NULL, NULL, st->last_active_brate, st->element_mode, st->hFdCngDec->hFdCngCom->CngBandwidth ); + } + } + else if ( st->hTdCngDec != NULL ) + { + cng_params_upd( &lsp[M], st->old_exc + L_EXC_MEM_DEC - st->L_frame, st->L_frame, &st->hTdCngDec->ho_circ_ptr, st->hTdCngDec->ho_ener_circ, &st->hTdCngDec->ho_circ_size, st->hTdCngDec->ho_lsp_circ, DEC, st->hTdCngDec->ho_env_circ, NULL, NULL, NULL, st->last_active_brate, st->element_mode, st->hFdCngDec->hFdCngCom->CngBandwidth ); + } + + /* Set 16k LSP flag for CNG buffer */ + st->hTdCngDec->ho_16k_lsp[st->hTdCngDec->ho_circ_ptr] = ( st->L_frame == L_FRAME ? 0 : 1 ); + } + + st->last_is_cng = 0; + + /* Postfiltering */ + post_decoder( st, synth_buf, pit_gain, pitch, signal_out, bpf_noise_buf ); + + if ( signal_outFB ) + { + mvr2r( synthFB, signal_outFB, L_frameTCX ); + } + + if ( st->enablePlcWaveadjust ) + { + if ( !bfi ) + { + st->hPlcInfo->nbLostCmpt = 0; + } + + if ( st->core == ACELP_CORE ) /* may happen only if bfi==1 */ + { + set_state( st->hPlcInfo->Transient, st->core, MAX_POST_LEN ); + } + } + + + return; +} diff --git a/lib_dec/dec_ace.c b/lib_dec/dec_ace.c new file mode 100644 index 0000000000000000000000000000000000000000..1012b8e77d53c71206526a55a658def0fd3d6f50 --- /dev/null +++ b/lib_dec/dec_ace.c @@ -0,0 +1,542 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "prot.h" +#include +#include "rom_com.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * decoder_acelp() + * + * Decode ACELP frame MODE2 + *-------------------------------------------------------------------*/ + +void decoder_acelp( + Decoder_State *st, /* i/o: coder memory state */ + int16_t prm[], /* i : parameters */ + const float A[], /* i : coefficients NxAz[M+1] */ + ACELP_config acelp_cfg, /* i : ACELP config */ + float synth[], /* i/o: synthesis */ + int16_t *pT, /* o : pitch for all subframe */ + float *pgainT, /* o : pitch gain for all subfr */ + const float stab_fac, /* i : stability of isf */ + float *pitch_buffer, /* i/o: pitch values for each subfr.*/ + float *voice_factors, /* o : voicing factors */ + const int16_t LSF_Q_prediction, /* i : LSF prediction mode */ + float *bwe_exc /* o : excitation for SWB TBE */ +) +{ + int16_t i, i_subfr, L_frame; + int16_t T0, T0_frac, T0_min, T0_min_frac, T0_max, T0_max_frac, T0_res; + float tmp, gain_pit, gain_code, Es_pred; + float code[L_SUBFR]; + float mem_syn[M], *syn, syn_buf[M + L_FRAME16k + L_FRAME16k / 2]; + float *exc, exc_buf[L_EXC_MEM_DEC + L_FRAME16k + 1]; + float exc2[L_FRAME16k]; + const float *p_A; + float *pt_pitch, pitch_buf[NB_SUBFR16k]; + float gain_inov; + float mem_back[M]; + float h1[L_FRAME16k / 4 + 1]; + float mem[M]; + const float *pA; + float gain_code2; + float code2[L_SUBFR]; + int16_t lp_flag; + float error = 0.0f; + float gain_preQ = 0; /* Gain of prequantizer excitation */ + float code_preQ[L_SUBFR]; /* Prequantizer excitation */ + PulseConfig config; + float weights[5]; + + float prev_gain_pit; + float tmp_noise; /* Long term temporary noise energy */ + + float gain_code_tmp; + float gain_pit_tmp; + float gain_code_pre; + + TCX_DEC_HANDLE hTcxDec = st->hTcxDec; + + gain_inov = 0; /* to avoid compilation warnings */ + T0 = 0; /* to avoid compilation warnings */ + T0_frac = 0; /* to avoid compilation warnings */ + T0_res = 0; /* to avoid compilation warnings */ + + /*------------------------------------------------------------------------* + * Initializations * + *------------------------------------------------------------------------*/ + + gain_code_pre = 0; + set_f( code_preQ, 0.f, L_SUBFR ); + + gain_pit = 0; + gain_code = 0; + gain_code2 = 0.f; + + prev_gain_pit = 0; + tmp_noise = 0; + + if ( st->nb_subfr == NB_SUBFR ) + { + weights[0] = 0.1f; + weights[1] = 0.2f; + weights[2] = 0.3f; + weights[3] = 0.4f; + } + else /*nb_subfr == NB_SUBFR16k */ + { + weights[0] = (float) 1 / 15; + weights[1] = (float) 2 / 15; + weights[2] = (float) 3 / 15; + weights[3] = (float) 4 / 15; + weights[4] = (float) 5 / 15; + } + + st->lp_gainp = 0; + st->lp_gainc = 0; + + + /* Framing parameters */ + L_frame = st->L_frame; + + /*------------------------------------------------------------------------* + * Previous frame is TCX * + *------------------------------------------------------------------------*/ + /* Reset phase dispersion */ + + if ( st->last_core_bfi > ACELP_CORE ) + { + set_zero( st->dispMem, 8 ); + } + + /* Update of synthesis filter memories in case of 12k8 core */ + if ( st->prev_bfi && st->last_con_tcx && st->L_frame < L_FRAME16k ) + { + synth_mem_updt2( st->L_frame, L_FRAME16k, st->old_exc, st->mem_syn_r, st->mem_syn2, NULL, DEC ); + } + + if ( st->last_con_tcx && st->old_enr_LP ) + { + float enr_LP, ratio; + + /* rescale excitation buffer if LPC energies differs too much */ + enr_LP = enr_1_Az( A, L_SUBFR ); + + ratio = st->old_enr_LP / enr_LP; + if ( ratio < 0.8 ) + { + v_multc( st->old_exc, ratio, st->old_exc, L_EXC_MEM_DEC ); + } + } + + /*------------------------------------------------------------------------* + * Initialize buffers * + *------------------------------------------------------------------------*/ + + mvr2r( st->mem_syn2, mem_back, M ); + + /* set ACELP synthesis memory */ + mvr2r( st->mem_syn2, mem_syn, M ); + + /* set excitation memory*/ + exc = exc_buf + L_EXC_MEM_DEC; + mvr2r( st->old_exc, exc_buf, L_EXC_MEM_DEC ); + *( exc + L_frame ) = 0.f; + + /* Init syn buffer */ + syn = syn_buf + M; + mvr2r( st->mem_syn2, syn_buf, M ); + + /*------------------------------------------------------------------------* + * Fast recovery flag + *------------------------------------------------------------------------*/ + + if ( st->prev_bfi && st->coder_type == VOICED ) + { + /*Force BPF to be applied fully*/ + st->bpf_gain_param = 3; + } + + /*------------------------------------------------------------------------* + * - decode mean_ener_code for gain decoder (d_gain2.c) * + *------------------------------------------------------------------------*/ + + if ( acelp_cfg.nrg_mode > 0 ) + { + Es_pred_dec( &Es_pred, prm[0], acelp_cfg.nrg_bits, acelp_cfg.nrg_mode > 1 ); + prm++; + } + else + { + Es_pred = 0.f; + } + + /*------------------------------------------------------------------------* + * Loop for every subframe in the analysis frame * + *------------------------------------------------------------------------* + * To find the pitch and innovation parameters. The subframe size is * + * L_SUBFR and the loop is repeated L_frame/L_SUBFR times. * + * - compute impulse response of weighted synthesis filter (h1[]) * + * - compute the target signal for pitch search * + * - find the closed-loop pitch parameters * + * - encode the pitch delay * + * - update the impulse response h1[] by including fixed-gain pitch * + * - find target vector for codebook search * + * - correlation between target vector and impulse response * + * - codebook search * + * - encode codebook address * + * - VQ of pitch and codebook gains * + * - find synthesis speech * + * - update states of weighting filter * + *------------------------------------------------------------------------*/ + + p_A = A; + pt_pitch = pitch_buf; + + for ( i_subfr = 0; i_subfr < L_frame; i_subfr += L_SUBFR ) + { + if ( st->use_partial_copy && st->rf_frame_type == RF_NELP ) + { + if ( i_subfr == 0 ) + { + decod_nelp( st, &tmp_noise, pt_pitch, exc, exc2, voice_factors, bwe_exc, 0 /*st->bfi*/, pgainT ); + set_f( pitch_buffer, L_SUBFR, NB_SUBFR ); + } + } + else + { + /*-------------------------------------------------------* + * - Decode adaptive codebook. * + *-------------------------------------------------------*/ + + if ( st->use_partial_copy && st->acelp_cfg.gains_mode[i_subfr / L_SUBFR] == 0 ) + { + gain_pit = prev_gain_pit; + } + + if ( acelp_cfg.ltp_bits != 0 ) + { + /* pitch lag decoding */ + *pt_pitch = Mode2_pit_decode( acelp_cfg.ltp_mode, i_subfr, L_SUBFR, &prm, &T0, &T0_frac, &T0_res, &T0_min, &T0_min_frac, &T0_max, &T0_max_frac, st->pit_min, st->pit_fr1, st->pit_fr1b, st->pit_fr2, st->pit_max, st->pit_res_max ); + + /* find pitch excitation */ + if ( st->pit_res_max == 6 && !( st->use_partial_copy ) ) + { + if ( T0_res == ( st->pit_res_max >> 1 ) ) + { + pred_lt4( &exc[i_subfr], &exc[i_subfr], T0, T0_frac << 1, L_SUBFR + 1, inter6_2, PIT_L_INTERPOL6_2, PIT_UP_SAMP6 ); + } + else + { + pred_lt4( &exc[i_subfr], &exc[i_subfr], T0, T0_frac, L_SUBFR + 1, inter6_2, PIT_L_INTERPOL6_2, PIT_UP_SAMP6 ); + } + } + else + { + if ( T0_res == ( st->pit_res_max >> 1 ) ) + { + pred_lt4( &exc[i_subfr], &exc[i_subfr], T0, T0_frac << 1, L_SUBFR + 1, inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + } + else + { + pred_lt4( &exc[i_subfr], &exc[i_subfr], T0, T0_frac, L_SUBFR + 1, inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + } + } + + /* LP filtering of the adaptive excitation*/ + lp_flag = acelp_cfg.ltf_mode; + + if ( acelp_cfg.ltf_mode == NORMAL_OPERATION ) + { + lp_flag = *prm; + prm++; + } + + lp_filt_exc_dec( st, MODE2, i_subfr, L_SUBFR, L_frame, lp_flag, exc ); + } + else + { + /* No adaptive codebook (UC) */ + set_zero( exc + i_subfr, L_SUBFR ); + + T0 = L_SUBFR; + T0_frac = 0; + T0_res = 1; + pitch_buf[i_subfr / L_SUBFR] = (float) L_SUBFR; + } + + if ( st->igf ) + { + tbe_celp_exc( st->element_mode, st->idchan, bwe_exc, L_frame, L_SUBFR, i_subfr, T0, T0_frac, &error, 0 ); + } + + pitch_buffer[i_subfr / L_SUBFR] = (float) T0 + (float) T0_frac / (float) T0_res; + + /*-------------------------------------------------------* + * - Decode innovative codebook. * + *-------------------------------------------------------*/ + + if ( st->use_partial_copy && ( st->rf_frame_type == RF_ALLPRED || ( st->rf_frame_type == RF_GENPRED && ( i_subfr == L_SUBFR || i_subfr == 3 * L_SUBFR ) ) ) ) + { + set_f( code, 0.0f, L_SUBFR ); + } + else + { + config = PulseConfTable[acelp_cfg.fixed_cdk_index[i_subfr / L_SUBFR]]; + D_ACELP_indexing( code, config, NB_TRACK_FCB_4T, prm, &st->BER_detect ); + ( prm ) += 8; + + /*-------------------------------------------------------* + * - Add the fixed-gain pitch contribution to code[]. * + *-------------------------------------------------------*/ + + cb_shape( acelp_cfg.pre_emphasis, acelp_cfg.pitch_sharpening, acelp_cfg.phase_scrambling, acelp_cfg.formant_enh, acelp_cfg.formant_tilt, acelp_cfg.formant_enh_num, acelp_cfg.formant_enh_den, p_A, code, st->tilt_code, pitch_buf[i_subfr / L_SUBFR], L_SUBFR ); + } + + /*-------------------------------------------------------* + * - Generate Gaussian excitation * + *-------------------------------------------------------*/ + + if ( acelp_cfg.gains_mode[i_subfr / L_SUBFR] == 7 && !st->use_partial_copy ) + { + gaus_L2_dec( code2, st->tilt_code, p_A, acelp_cfg.formant_enh_num, &( st->seed_acelp ) ); + } + else + { + gain_code2 = 0.f; + set_zero( code2, L_SUBFR ); + } + + /*-------------------------------------------------* + * - Decode codebooks gains. * + *-------------------------------------------------*/ + + if ( st->acelp_cfg.gains_mode[i_subfr / L_SUBFR] != 0 ) + { + decode_acelp_gains( code, acelp_cfg.gains_mode[i_subfr / L_SUBFR], Es_pred, &gain_pit, &gain_code, &prm, &( st->past_gpit ), &( st->past_gcode ), &gain_inov, L_SUBFR, code2, &gain_code2 ); + } + + if ( st->use_partial_copy && st->rf_frame_type == RF_ALLPRED ) + { + st->past_gcode = 0.0f; + } + + if ( st->use_partial_copy && st->rf_frame_type == RF_NOPRED ) + { + st->past_gpit = 0.004089f; + } + + /*----------------------------------------------------------* + * Update parameters for the next subframe. * + * - tilt of code: 0.0 (unvoiced) to 0.5 (voiced) * + *----------------------------------------------------------*/ + + st->tilt_code = est_tilt( exc + i_subfr, gain_pit, code, gain_code, &( st->voice_fac ), L_SUBFR, acelp_cfg.voice_tilt ); + + pgainT[i_subfr / L_SUBFR] = gain_pit; + + /*-------------------------------------------------------* + * - Find the total excitation. * + *-------------------------------------------------------*/ + + gain_code_tmp = gain_code; + gain_pit_tmp = gain_pit; + if ( st->core == ACELP_CORE && st->last_core == ACELP_CORE && ( st->use_partial_copy || st->prev_use_partial_copy ) ) + { + if ( i_subfr > 0 && gain_pit > 1.23f && st->prev_tilt_code_dec > 0.2f && st->next_coder_type == VOICED && ( st->use_partial_copy || st->prev_use_partial_copy ) ) + { + gain_pit *= ( 0.8f - i_subfr / 640.0f ); + } + + else if ( !st->prev_use_partial_copy && st->last_coder_type == UNVOICED && st->next_coder_type != UNVOICED && gain_code < gain_code_pre ) + { + gain_code = 0.0f; + } + } + + gain_code_pre = gain_code; + st->tilt_code_dec[i_subfr / L_SUBFR] = st->tilt_code; + + for ( i = 0; i < L_SUBFR; i++ ) + { + exc2[i + i_subfr] = gain_pit * exc[i + i_subfr]; + exc2[i + i_subfr] += gain_code2 * code2[i]; + exc[i + i_subfr] = exc2[i + i_subfr] + gain_code * code[i]; + } + + /*-----------------------------------------------------------------* + * Prepare TBE excitation + *-----------------------------------------------------------------*/ + + gain_code = gain_code_tmp; + gain_pit = gain_pit_tmp; + + if ( st->igf != 0 ) + { + prep_tbe_exc( L_frame, L_SUBFR, i_subfr, gain_pit, gain_code, code, st->voice_fac, &voice_factors[i_subfr / L_SUBFR], bwe_exc, gain_preQ, code_preQ, T0, st->coder_type, st->core_brate, st->element_mode, st->idchan, st->hBWE_TD != NULL, 0 ); + } + + /*---------------------------------------------------------* + * Enhance the excitation * + *---------------------------------------------------------*/ + + enhancer( MODE2, -1, acelp_cfg.fixed_cdk_index[i_subfr / L_SUBFR], 0, st->coder_type, L_frame, st->voice_fac, stab_fac, st->past_gcode, gain_inov, &( st->gc_threshold ), code, &exc2[i_subfr], gain_pit, st->dispMem ); + + } /* !RF_NELP frame partial copy */ + + /*----------------------------------------------------------* + * - compute the synthesis speech * + *----------------------------------------------------------*/ + + syn_filt( p_A, M, &exc2[i_subfr], &syn[i_subfr], L_SUBFR, mem_syn, 1 ); + + /*-----------------------------------------------------------------* + * update lp_filtered gains for the case of frame erasure + *-----------------------------------------------------------------*/ + + st->lp_gainp += weights[i_subfr / L_SUBFR] * st->past_gpit; + st->lp_gainc += weights[i_subfr / L_SUBFR] * st->past_gcode; + + /*----------------------------------------------------------* + * - update pitch lag for guided ACELP * + *----------------------------------------------------------*/ + + if ( st->enableGplc && ( i_subfr / L_SUBFR ) == ( L_frame / L_SUBFR ) - 1 ) + { + st->T0_4th = T0; + } + + /*----------------------------------------------------------* + * - Update LPC coeffs * + *----------------------------------------------------------*/ + + p_A += ( M + 1 ); + pt_pitch++; + /* copy current gain for next subframe use, in case there is no explicit encoding */ + prev_gain_pit = gain_pit; + + } /* end of subframe loop */ + + if ( st->BER_detect ) + { + for ( i = 0; i < L_frame; i++ ) + { + exc[i] = 0.0f; + } + int_lsp( L_frame, st->old_lsp_q_cng, st->lsp_q_cng, st->Aq_cng, M, interpol_frac_12k8, 0 ); + + p_A = st->Aq_cng; + if ( st->last_good < UNVOICED_TRANSITION ) + { + mvr2r( st->mem_syn2, mem_syn, M ); + } + else + { + set_zero( mem_syn, M ); + } + + for ( i_subfr = 0; i_subfr < L_frame; i_subfr += L_SUBFR ) + { + syn_filt( p_A, M, &exc[i_subfr], &syn[i_subfr], L_SUBFR, mem_syn, 1 ); + p_A += ( M + 1 ); + } + } + + tmp = 0; + pA = A + ( st->nb_subfr - 1 ) * ( M + 1 ); + set_zero( h1, L_SUBFR + 1 ); + set_zero( mem, M ); + h1[0] = 1.0f; + syn_filt( pA, M, h1, h1, L_SUBFR, mem, 0 ); /* impulse response of LPC */ + deemph( h1, st->preemph_fac, L_SUBFR, &tmp ); /* impulse response of deemph */ + /* impulse response level = gain introduced by synthesis+deemphasis */ + st->last_gain_syn_deemph = (float) sqrt( dotp( h1, h1, L_SUBFR ) ); + + /*-----------------------------------------------------------* + * PLC: [ACELP: Fade-out] + * PLC: update the background level + *-----------------------------------------------------------*/ + + /* Do the classification */ + FEC_clas_estim( syn, pitch_buf, st->L_frame, st->core_ext_mode, st->codec_mode, st->mem_syn_clas_estim, &st->clas_dec, &st->lp_ener_bfi, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, -1.0f, st->narrowBand, CLASSIFIER_ACELP, 0, st->preemph_fac, st->tcxonly, st->last_core_brate, -1 ); + + /* Update Pitch Lag memory */ + mvr2r( &st->old_pitch_buf[L_frame / L_SUBFR], st->old_pitch_buf, L_frame / L_SUBFR ); + mvr2r( pitch_buf, &st->old_pitch_buf[L_frame / L_SUBFR], L_frame / L_SUBFR ); + + FEC_scale_syn( st->L_frame, st->clas_dec, st->last_good, syn, pitch_buf, st->enr_old, 0, st->coder_type, LSF_Q_prediction, &st->scaling_flag, &st->lp_ener_FEC_av, &st->lp_ener_FEC_max, st->bfi, st->total_brate, st->prev_bfi, st->last_core_brate, exc, exc2, A, &st->old_enr_LP, mem_back, mem_syn, st->last_con_tcx && ( st->L_frameTCX_past != st->L_frame ) && ( st->last_core != ACELP_CORE ), ( st->clas_dec == ONSET || ( st->last_good >= VOICED_TRANSITION && st->last_good < INACTIVE_CLAS ) ) ); + + /* update ACELP synthesis memory */ + mvr2r( mem_syn, st->mem_syn2, M ); + mvr2r( syn + L_frame - L_SYN_MEM, st->mem_syn_r, L_SYN_MEM ); + + tmp = st->syn[M]; + deemph( syn, st->preemph_fac, L_frame, &tmp ); + mvr2r( syn + L_frame - ( L_frame / 2 ), st->hTcxDec->old_syn_Overl, L_frame / 2 ); + mvr2r( syn + L_frame - M - 1, st->syn, M + 1 ); + mvr2r( syn, synth, L_frame ); + + if ( st->hBWE_TD != NULL ) + { + mvr2r( syn, st->hBWE_TD->old_core_synth, L_frame ); + } + + /* update old_exc */ + mvr2r( exc_buf + L_frame, st->old_exc, L_EXC_MEM_DEC ); + + /* Output pitch parameters for bass post-filter */ + for ( i_subfr = 0; i_subfr < L_frame; i_subfr += L_SUBFR ) + { + *pT++ = (int16_t) ( pitch_buf[i_subfr / L_SUBFR] + 0.5f ); + } + + /* Update TCX-LTP */ + hTcxDec->tcxltp_last_gain_unmodified = 0.f; + + /*Update MODE1*/ + mvr2r( p_A - ( M + 1 ), st->old_Aq_12_8, M + 1 ); + st->old_Es_pred = Es_pred; + + hTcxDec->tcxltp_third_last_pitch = hTcxDec->tcxltp_second_last_pitch; + hTcxDec->tcxltp_second_last_pitch = st->old_fpitch; + st->old_fpitch = pitch_buf[( L_frame / L_SUBFR ) - 1]; + + return; +} diff --git a/lib_dec/dec_acelp.c b/lib_dec/dec_acelp.c new file mode 100644 index 0000000000000000000000000000000000000000..615fa8eae1a0e14a0e2788a2cc61e897b3ca9178 --- /dev/null +++ b/lib_dec/dec_acelp.c @@ -0,0 +1,367 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include "options.h" +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*---------------------------------------------------------------------* + * Local function prototypes + *---------------------------------------------------------------------*/ + +static void D_ACELP_decode_arithtrack( float v[], uint32_t s, int16_t p, const int16_t trackstep, const int16_t tracklen ); + +/*---------------------------------------------------------------------* + * Function D_ACELP_indexing() + * + *---------------------------------------------------------------------*/ + +void D_ACELP_indexing( + float code[], + PulseConfig config, + const int16_t num_tracks, + int16_t index[], + int16_t *BER_detect ) +{ + int16_t track, pulses, k, pulsestrack[NB_TRACK_FCB_4T]; + uint32_t s; + uint32_t index_n[NB_TRACK_FCB_4T]; + uint16_t trackpos, idxs[MAX_IDX_LEN]; + int16_t restpulses, wordcnt; + + assert( num_tracks == NB_TRACK_FCB_4T ); + + wordcnt = ( config.bits + 15 ) >> 4; /* ceil(bits/16) */ + + /* check if some tracks have more pulses */ + restpulses = config.nb_pulse & ( num_tracks - 1 ); + + /* cast to short */ + for ( k = 0; k < wordcnt; k++ ) + { + idxs[k] = (uint16_t) index[k]; + } + + if ( restpulses ) + { + /* check if we need to code track positions */ + switch ( config.codetrackpos ) + { + case TRACKPOS_FREE_THREE: + /* Find track with less pulses */ + trackpos = idxs[0] & 3; + longshiftright( idxs, 2, idxs, wordcnt, wordcnt ); + + /* set number of pulses per track */ + set_s( pulsestrack, ( config.nb_pulse >> 2 ) + 1, 4 ); + pulsestrack[trackpos]--; /* this one has less pulses */ + break; + case TRACKPOS_FREE_ONE: + /* Find track with more pulses */ + trackpos = idxs[0] & 3; + longshiftright( idxs, 2, idxs, wordcnt, wordcnt ); + + /* set number of pulses per track */ + set_s( pulsestrack, ( config.nb_pulse >> 2 ), 4 ); + pulsestrack[trackpos]++; /* this one has more pulses */ + break; + case TRACKPOS_FIXED_EVEN: + /* Pulses on even tracks */ + pulsestrack[0] = ( config.nb_pulse + 1 ) >> 1; + pulsestrack[1] = 0; + pulsestrack[2] = config.nb_pulse >> 1; + pulsestrack[3] = 0; + break; + case TRACKPOS_FIXED_FIRST: + /* set number of pulses per track */ + set_s( pulsestrack, config.nb_pulse / num_tracks, 4 ); + for ( k = 0; k < restpulses; k++ ) + { + pulsestrack[k]++; + } + break; + case TRACKPOS_FIXED_TWO: + /* 1100, 0110, 0011, 1001 */ + /* Find track with less pulses */ + trackpos = idxs[0] & 3; + longshiftright( idxs, 2, idxs, wordcnt, wordcnt ); + + /* set number of pulses per track */ + set_s( pulsestrack, ( config.nb_pulse >> 2 ), 4 ); + pulsestrack[trackpos]++; + trackpos++; + trackpos &= 3; + pulsestrack[trackpos]++; + break; + default: + assert( 0 ); + break; + } + } + else + { + /* set number of pulses per track */ + set_s( pulsestrack, ( config.nb_pulse / num_tracks ), num_tracks ); + } + + if ( config.bits == 43 ) + { + D_ACELP_decode_43bit( idxs, code, pulsestrack ); + } + else + { + fcb_pulse_track_joint_decode( idxs, wordcnt, index_n, pulsestrack, num_tracks ); + + for ( track = num_tracks - 1; track >= 1; track-- ) + { + pulses = pulsestrack[track]; + + if ( pulses ) + { + s = index_n[track]; + + /* decode state to actual pulse positions on track */ + /*D_ACELP_decode_arithtrack_old(code+track, s, pulses, 4); */ + D_ACELP_decode_arithtrack( code + track, s, pulses, num_tracks, 16 ); + } + else + { + /* track is empty */ + for ( k = track; k < 16 * num_tracks; k += num_tracks ) + { + code[k] = 0.0f; + } + } + } + s = index_n[0]; + pulses = pulsestrack[0]; + /* safety check in case of bit errors */ + if ( s >= pulsestostates[16][pulses - 1] ) + { + set_f( code, 0.0f, L_SUBFR ); + *BER_detect = 1; + return; + } + if ( pulses ) + { + D_ACELP_decode_arithtrack( code, s, pulses, num_tracks, 16 ); + } + else + { + /* track is empty */ + for ( k = 0; k < 16 * num_tracks; k += num_tracks ) + { + code[k] = 0.0f; + } + } + } + + return; +} + + +static void D_ACELP_decode_arithtrack( + float v[], + uint32_t s, + int16_t p, + const int16_t trackstep, + const int16_t tracklen ) +{ + int16_t k; + + for ( k = (tracklen) -1; k >= 0; k-- ) + { + v[k * trackstep] = 0.0f; /* default: there is no pulse here */ + while ( ( p ) && ( s >= pulsestostates[k][p - 1] ) ) + { + s -= pulsestostates[k][p - 1]; + if ( v[k * trackstep] ) + { + /* there is a pulse here already = sign is known */ + if ( v[k * trackstep] > 0.0f ) + { + v[k * trackstep]++; /* place one more pulse here */ + } + else + { + v[k * trackstep]--; /* place one more pulse here */ + } + } + else + { + /* this is the first pulse here -> determine sign */ + if ( s & 1 ) + { + v[k * trackstep] = -1.0f; /* place a negative pulse here */ + } + else + { + v[k * trackstep] = +1.0f; /* place a negative pulse here */ + } + s >>= 1; + } + p--; /* one pulse placed, so one less left */ + } + } + + return; +} + + +void fcb_pulse_track_joint_decode( + uint16_t *idxs, + const int16_t wordcnt, + uint32_t *index_n, + const int16_t *pulse_num, + const int16_t track_num ) +{ + int16_t hi_to_low[10] = { 0, 0, 0, 3, 9, 5, 3, 1, 8, 8 }; + + uint64_t index; + int16_t indx_flag, indx_flag_1; + int16_t track, track_num1, pulse_num0, pulse_num1; + int64_t indx_tmp, div_tmp; /* must be long */ + int16_t indx_flag_2; + + indx_flag = 0; + indx_flag_1 = 0; + indx_flag_2 = 0; + for ( track = 0; track < track_num; track++ ) + { + indx_flag += ( pulse_num[track] >> 2 ); + indx_flag_1 += ( pulse_num[track] >> 1 ); + indx_flag_2 += ( pulse_num[track] >> 3 ); + } + + if ( indx_flag >= track_num ) + { + hi_to_low[4] = 9; + } + else + { + hi_to_low[4] = 1; + } + + if ( indx_flag_2 >= 1 ) + { + hi_to_low[7] = 9; + } + else + { + hi_to_low[7] = 1; + } + + if ( indx_flag_1 >= track_num ) + { + if ( indx_flag >= track_num ) + { + index = 0; + if ( indx_flag_2 >= 1 ) + { + for ( track = ( wordcnt - 1 ); track >= 6; track-- ) + { + index = ( index << 16 ) + idxs[track]; + } + index_n[3] = ( ( (uint32_t) idxs[5] ) << 8 ) + ( ( idxs[4] >> 8 ) & 0xff ); + index_n[2] = ( ( ( (uint32_t) idxs[4] ) << 16 ) + idxs[3] ) & 0xffffffUL; + index_n[1] = ( ( (uint32_t) idxs[2] ) << 8 ) + ( ( idxs[1] >> 8 ) & 0xff ); + index_n[0] = ( ( ( (uint32_t) idxs[1] ) << 16 ) + idxs[0] ) & 0xffffffUL; + } + else + { + for ( track = ( wordcnt - 1 ); track >= track_num; track-- ) + { + index = ( index << 16 ) + idxs[track]; + } + for ( track = 0; track < track_num; track++ ) + { + index_n[track] = idxs[track]; + } + } + } + else + { + index = 0; + for ( track = ( wordcnt - 1 ); track >= 2; track-- ) + { + index = ( index << 16 ) + idxs[track]; + } + + index_n[3] = idxs[1] & 0xff; + index_n[2] = idxs[1] >> 8; + index_n[1] = idxs[0] & 0xff; + index_n[0] = idxs[0] >> 8; + } + + track_num1 = track_num - 1; + pulse_num1 = pulse_num[track_num1]; + index = ( index << hi_to_low[pulse_num1] ) + ( index_n[track_num1] >> low_len[pulse_num1] ); + for ( track = ( track_num - 1 ); track > 0; track-- ) + { + track_num1 = track - 1; + pulse_num0 = pulse_num[track_num1]; + pulse_num1 = pulse_num[track]; + index = ( index << hi_to_low[pulse_num0] ) + ( index_n[track_num1] >> low_len[pulse_num0] ); + + div_tmp = index / indx_fact[pulse_num1]; + indx_tmp = index - div_tmp * indx_fact[pulse_num1]; + index_n[track] = (uint32_t) ( ( index_n[track] & low_mask[pulse_num1] ) + ( indx_tmp << low_len[pulse_num1] ) ); + index = div_tmp; + } + pulse_num1 = pulse_num[0]; + index_n[0] = (uint32_t) ( ( index_n[0] & low_mask[pulse_num1] ) + ( index << low_len[pulse_num1] ) ); + } + else + { + index = 0; + for ( track = ( wordcnt - 1 ); track >= 0; track-- ) + { + index = ( index << 16 ) + idxs[track]; + } + for ( track = 3; track > 0; track-- ) + { + pulse_num1 = pulse_num[track]; + index_n[track] = index & index_mask_ACELP[pulse_num1]; + index = index >> index_len[pulse_num1]; + } + index_n[0] = (uint32_t) index; + } + + return; +} diff --git a/lib_dec/dec_acelp_tcx_main.c b/lib_dec/dec_acelp_tcx_main.c new file mode 100644 index 0000000000000000000000000000000000000000..98e641563d5a0d69af1cd7ebd757edf006433244 --- /dev/null +++ b/lib_dec/dec_acelp_tcx_main.c @@ -0,0 +1,481 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "prot.h" +#include "rom_com.h" +#include +#include "options.h" +#include "stat_dec.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * decode_frame_type() + * + * + *--------------------------------------------------------------------*/ + +static void decode_frame_type( + Decoder_State *st, /* i/o: decoder state structure */ + STEREO_CNG_DEC_HANDLE hStereoCng /* i/o: Stereo CNG data structure */ +) +{ + int16_t frame_size_index, n; + int32_t total_brate; + + frame_size_index = 0; + total_brate = st->total_brate; + + /* Get Frame Type (NULL,SID,ACTIVE) and Frame Mode (2kbps, 4kbps,...) */ + + if ( st->mdct_sw == MODE1 ) + { + st->m_frame_type = ACTIVE_FRAME; + + for ( n = 0; n < FRAME_SIZE_NB; n++ ) + { + if ( FrameSizeConfig[n].frame_bits == st->total_brate / FRAMES_PER_SEC ) + { + frame_size_index = n; + break; + } + } + } + else + { + /* ZERO Frame */ + if ( st->total_brate == FRAME_NO_DATA ) + { + st->bwidth = st->last_bwidth; + st->m_frame_type = ZERO_FRAME; + } + + /* SID frame */ + else if ( st->total_brate == SID_2k40 ) + { + uint16_t frame_len_indicator; + + st->cng_type = get_next_indice( st, 1 ); + + if ( st->cng_type != FD_CNG ) + { + st->BER_detect = 1; + st->cng_type = FD_CNG; + } + st->m_frame_type = SID_FRAME; + frame_size_index = 1; + st->bwidth = get_next_indice( st, 2 ); + + frame_len_indicator = get_next_indice( st, 1 ); + if ( st->bwidth == NB ) + { + if ( frame_len_indicator ) + { + st->BER_detect = 1; + } + frame_len_indicator = 0; + } + if ( frame_len_indicator == 0 ) + { + st->L_frame = L_FRAME; + st->total_brate = ACELP_9k60; + } + else + { + st->L_frame = L_FRAME16k; + if ( st->last_total_brate == ACELP_16k40 || st->last_total_brate == ACELP_24k40 ) + { + st->total_brate = st->last_total_brate; + } + else + { + st->total_brate = 16400; + } + } + + for ( n = 0; n < FRAME_SIZE_NB; n++ ) + { + if ( FrameSizeConfig[n].frame_bits == st->total_brate / FRAMES_PER_SEC ) + { + frame_size_index = n; + break; + } + } + } + /* EVS MODES */ + else + { + /* Get Frame mode */ + st->m_frame_type = ACTIVE_FRAME; + + for ( n = 0; n < FRAME_SIZE_NB; n++ ) + { + if ( FrameSizeConfig[n].frame_bits == st->total_brate / FRAMES_PER_SEC ) + { + frame_size_index = n; + break; + } + } + + if ( st->rf_flag == 0 ) + { + /* Get bandwidth info */ + st->bwidth = get_next_indice( st, FrameSizeConfig[frame_size_index].bandwidth_bits ); + st->bwidth += FrameSizeConfig[frame_size_index].bandwidth_min; + } + else + { + st->bwidth += FrameSizeConfig[frame_size_index].bandwidth_min; + } + + if ( st->bwidth > FB ) + { + st->bwidth = FB; + st->BER_detect = 1; + } + + if ( st->bwidth > SWB && st->total_brate < ACELP_16k40 ) + { + st->bwidth = SWB; + st->BER_detect = 1; + } + + /* Get reserved bit */ + if ( FrameSizeConfig[frame_size_index].reserved_bits && st->rf_flag == 0 ) + { + if ( get_next_indice( st, 1 ) != 0 ) + { + st->BER_detect = 1; + } + assert( FrameSizeConfig[frame_size_index].reserved_bits == 1 ); + } + } + } + + st->rate_switching_init = 0; + + if ( st->last_codec_mode != MODE2 || !st->BER_detect ) + { + /* Mode or Rate Change */ + if ( ( st->m_frame_type == ACTIVE_FRAME || st->m_frame_type == SID_FRAME ) && ( ( st->total_brate != st->last_total_brate ) || ( st->bwidth != st->last_bwidth ) || ( st->last_codec_mode == MODE1 ) || ( st->rf_flag != st->rf_flag_last ) || st->force_lpd_reset ) ) + { + st->rate_switching_init = 1; + + /* Reconf Core */ + mode_switch_decoder_LPD( st, st->bwidth, st->total_brate, st->last_total_brate, frame_size_index, 0, st->element_mode ); + + /* Reconf. CLDFB: check if the CLDFB works on the right sample rate */ + if ( ( st->cldfbAna->no_channels * st->cldfbAna->no_col ) != st->L_frame ) + { + resampleCldfb( st->cldfbAna, ( st->L_frame * FRAMES_PER_SEC ) ); + if ( st->L_frame <= L_FRAME16k ) + { + resampleCldfb( st->cldfbBPF, ( st->L_frame * FRAMES_PER_SEC ) ); + } + } + if ( st->bwidth == NB ) + { + int16_t nBand_nb = (int16_t) ( 8000 * st->cldfbSyn->no_channels / st->output_Fs ); + st->cldfbSyn->bandsToZero = st->cldfbSyn->no_channels - nBand_nb; + } + else + { + st->cldfbSyn->bandsToZero = 0; + } + + /*Reconf Frequency-domain based CNG*/ + configureFdCngDec( st->hFdCngDec, st->bwidth, st->rf_flag == 1 && st->total_brate == ACELP_13k20 ? ACELP_9k60 : st->total_brate, st->L_frame, st->last_L_frame, st->element_mode ); + if ( st->last_L_frame != st->L_frame && st->L_frame <= L_FRAME16k && st->last_L_frame <= L_FRAME16k ) + { + lerp( st->hFdCngDec->hFdCngCom->olapBufferSynth2, st->hFdCngDec->hFdCngCom->olapBufferSynth2, st->L_frame * 2, st->last_L_frame * 2 ); + if ( st->m_frame_type == SID_FRAME && st->hFdCngDec->hFdCngCom->frame_type_previous != ACTIVE_FRAME ) + { + lerp( st->hFdCngDec->hFdCngCom->olapBufferSynth, st->hFdCngDec->hFdCngCom->olapBufferSynth, st->L_frame * 2, st->last_L_frame * 2 ); + lerp( hStereoCng->olapBufferSynth22, hStereoCng->olapBufferSynth22, st->L_frame * 2, st->last_L_frame * 2 ); + + if ( st->L_frame == L_FRAME ) + { + for ( n = 0; n < st->L_frame * 2; n++ ) + { + st->hFdCngDec->hFdCngCom->olapBufferSynth[n] = st->hFdCngDec->hFdCngCom->olapBufferSynth[n] * 1.25f; + } + } + else + { + for ( n = 0; n < st->L_frame * 2; n++ ) + { + st->hFdCngDec->hFdCngCom->olapBufferSynth[n] = st->hFdCngDec->hFdCngCom->olapBufferSynth[n] / 1.25f; + } + } + } + } + + if ( st->bwidth != st->last_bwidth ) + { + st->hFdCngDec->hFdCngCom->msFrCnt_init_counter = 0; + st->hFdCngDec->hFdCngCom->init_old = FLT_MAX; + } + + if ( st->tcxonly ) + { + st->p_bpf_noise_buf = NULL; + } + else + { + st->p_bpf_noise_buf = st->bpf_noise_buf; + } + } + } + + st->total_brate = total_brate; + + return; +} + + +/*-------------------------------------------------------------------* + * dec_acelp_tcx_frame() + * + * Main decoding function + *--------------------------------------------------------------------*/ + +void dec_acelp_tcx_frame( + Decoder_State *st, /* i/o: decoder state structure */ + int16_t *concealWholeFrame, /* i/o: concealment flag */ + float *output, /* o : synthesis */ + float *bpf_noise_buf, /* i/o: BPF noise buffer */ + float *pcmbufFB, /* o : synthesis @output_FS */ + float bwe_exc_extended[], /* i/o: bandwidth extended excitation */ + float *voice_factors, /* o : voicing factors */ + float pitch_buf[], /* o : floating pitch for each subframe */ + STEREO_CNG_DEC_HANDLE hStereoCng /* i : stereo CNG handle */ +) +{ + int16_t i; + int16_t start_bit_pos; + int16_t tmp; + int16_t bitsRead; + int16_t param[DEC_NPRM_DIV * NB_DIV]; + float old_bwe_exc[( PIT16k_MAX + ( L_FRAME16k + 1 ) + L_SUBFR16k ) * 2]; /* excitation buffer */ + float *ptr_bwe_exc; /* pointer to BWE excitation signal in the current frame */ + + push_wmops( "dec_acelp_tcx_frame" ); + + start_bit_pos = st->next_bit_pos; + if ( st->rf_flag == 1 ) + { + start_bit_pos -= 2; + } + + /* -------------------------------------------------------------- */ + /* IDENTIFY FRAME TYPE */ + /* -------------------------------------------------------------- */ + + st->m_old_frame_type = st->m_frame_type; + + if ( *concealWholeFrame == 0 ) + { + uint8_t m_frame_type = st->m_frame_type; + int16_t bwidth = st->bwidth; + int16_t cng_type = st->cng_type; + int16_t L_frame = st->L_frame; + int32_t total_brate = st->last_total_brate; + + decode_frame_type( st, hStereoCng ); + + st->force_lpd_reset = 0; + + if ( ( st->last_codec_mode ) == MODE2 && ( st->BER_detect || ( st->prev_bfi && st->m_frame_type == ZERO_FRAME && st->m_old_frame_type == ACTIVE_FRAME ) ) ) + { + /* Copy back parameters from previous frame, because there is a high risk they are corrupt + * Do concealment with configuration used in previous frame */ + st->m_frame_type = m_frame_type; + st->bwidth = bwidth; + st->cng_type = cng_type; + st->L_frame = L_frame; + if ( st->ini_frame != 0 ) + { + st->total_brate = total_brate; + } + + *concealWholeFrame = 1; + st->m_decodeMode = DEC_CONCEALMENT_EXT; + st->BER_detect = 0; + + if ( ( st->bwidth != st->last_bwidth ) || ( st->rf_flag != st->rf_flag_last ) || ( st->total_brate != st->last_total_brate ) ) + { + st->force_lpd_reset = 1; + } + + st->core_brate = st->last_core_brate; + st->bfi = 1; + if ( st->ini_frame == 0 && st->hTcxCfg != NULL ) + { + st->hTcxCfg->tcx_coded_lines = getNumTcxCodedLines( SWB ); + } + } + else + { + st->core_brate = st->total_brate; + bpf_noise_buf = st->p_bpf_noise_buf; + } + } + + if ( *concealWholeFrame != 0 ) + { + /* add two zero bytes for arithmetic coder flush */ + for ( i = 0; i < 8 * 2; i++ ) + { + st->bit_stream[i] = 0; + } + } + + if ( !( st->m_frame_type == SID_FRAME || st->m_frame_type == ZERO_FRAME ) ) + { + + /* -------------------------------------------------------------- */ + /* DECODE CORE */ + /* -------------------------------------------------------------- */ + int32_t nbits_total; + nbits_total = st->total_brate / FRAMES_PER_SEC; + if ( *concealWholeFrame ) + { + + tmp = 0; /*to avoid empty counting */ + } + + + tmp = (int16_t) ( nbits_total - ( st->next_bit_pos - start_bit_pos ) ); + + bitsRead = 0; + + /* update old BWE excitation buffer */ + if ( st->hBWE_TD != NULL ) + { + set_f( old_bwe_exc + PIT16k_MAX * 2, 0.f, ( ( L_FRAME16k + 1 ) + L_SUBFR16k ) * 2 ); + ptr_bwe_exc = old_bwe_exc + PIT16k_MAX * 2; + mvr2r( st->hBWE_TD->old_bwe_exc, old_bwe_exc, PIT16k_MAX * 2 ); + } + else + { + ptr_bwe_exc = NULL; + } + + /* Decode the LPD data */ + if ( st->m_decodeMode == DEC_NO_FRAM_LOSS ) + { + decoder_LPD( st, output, pcmbufFB, &tmp, bpf_noise_buf, 0, &bitsRead, param, pitch_buf, voice_factors, ptr_bwe_exc ); + + if ( !st->rate_switching_init && ( st->last_codec_mode ) == MODE2 && !( st->use_partial_copy && st->rf_frame_type >= RF_TCXFD && st->rf_frame_type <= RF_TCXTD2 ) && st->bfi ) + { + *concealWholeFrame = 1; + st->m_decodeMode = DEC_CONCEALMENT_EXT; + st->BER_detect = 0; + } + } + else if ( st->m_decodeMode == DEC_CONCEALMENT_EXT ) + { + decoder_LPD( st, output, pcmbufFB, NULL, bpf_noise_buf, 1, /* bfi - st->bfi can be 0 here - MODE2 stays in PLC when DTX appears after a loss */ + &bitsRead, NULL, pitch_buf, voice_factors, ptr_bwe_exc ); + } + + if ( st->hBWE_TD != NULL ) + { + if ( ( !st->bfi && ( st->prev_bfi || st->prev_use_partial_copy ) ) || ( ( st->last_vbr_hw_BWE_disable_dec == 1 ) && ( st->vbr_hw_BWE_disable_dec == 0 ) ) ) + { + st->hBWE_TD->bwe_non_lin_prev_scale = 0.0f; + set_f( st->hBWE_TD->old_bwe_exc_extended, 0.0f, NL_BUFF_OFFSET ); + } + + if ( st->core == ACELP_CORE && st->igf && st->con_tcx == 0 ) + { + non_linearity( ptr_bwe_exc, bwe_exc_extended, st->hBWE_TD->old_bwe_exc_extended, L_FRAME32k, &st->hBWE_TD->bwe_non_lin_prev_scale, st->coder_type, voice_factors, st->L_frame ); + + /* update the old BWE exe memory */ + mvr2r( &old_bwe_exc[L_FRAME32k], st->hBWE_TD->old_bwe_exc, PIT16k_MAX * 2 ); + } + else + { + set_f( st->hBWE_TD->old_bwe_exc_extended, 0, NL_BUFF_OFFSET ); + set_f( st->hBWE_TD->old_bwe_exc, 0, PIT16k_MAX * 2 ); /* reset old non_linear exc during igf frames */ + st->hBWE_TD->bwe_non_lin_prev_scale = 0.0f; + } + } + + /* for ACELP mode, skip core data to read TD-BWE side info */ + if ( ( !st->bfi ) && st->core == ACELP_CORE && st->total_brate > 0 ) + { + nbits_total = st->total_brate / FRAMES_PER_SEC; + /* target bs-position "-2", because of earlier "start_bit_pos -= 2;", which are included in "st->rf_target_bits"*/ + /* from "-2" to "-3" as flag-bit not considered in rf_target_bits */ + if ( st->rf_flag ) + { + get_next_indice_tmp( st, (int16_t) ( start_bit_pos + nbits_total - st->rf_target_bits - 3 - get_tbe_bits( st->total_brate, st->bwidth, st->rf_flag ) - st->next_bit_pos ) ); + } + else + { + get_next_indice_tmp( st, (int16_t) ( start_bit_pos + nbits_total - st->rf_target_bits - get_tbe_bits( st->total_brate, st->bwidth, st->rf_flag ) - st->next_bit_pos ) ); + } + tbe_read_bitstream( st ); + } + + if ( *concealWholeFrame ) + { + /*"LPD dec - All BFI"*/ + + tmp = 0; /*to avoid empty counting */ + } + + /* updates */ + st->last_voice_factor = voice_factors[st->nb_subfr - 1]; + st->last_coder_type = st->coder_type; + } + else + { + if ( st->m_frame_type == SID_FRAME ) + { + /* Decode the FD-CNG bitstream */ + FdCng_decodeSID( st ); + } + + /* updates */ + st->last_voice_factor = 0; + st->last_coder_type = INACTIVE; + } + + pop_wmops(); + return; +} diff --git a/lib_dec/dec_amr_wb.c b/lib_dec/dec_amr_wb.c new file mode 100644 index 0000000000000000000000000000000000000000..88605c5ba9d274eab54217eb2faedb3ac28554f9 --- /dev/null +++ b/lib_dec/dec_amr_wb.c @@ -0,0 +1,170 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "wmc_auto.h" + +/*---------------------------------------------------------------------* + * decod_amr_wb() + * + * Decode excitation signal in AMR-WB IO mode + *---------------------------------------------------------------------*/ + +void decod_amr_wb( + Decoder_State *st, /* i/o: decoder static memory */ + const float *Aq, /* i : LP filter coefficients */ + float *pitch_buf, /* o : floating pitch values for each subframe */ + float *exc, /* i/o: adapt. excitation exc */ + float *exc2, /* i/o: adapt. excitation/total exc */ + int16_t hf_gain[NB_SUBFR], /* o : decoded HF gain */ + float *voice_factors, /* o : voicing factors */ + float *gain_buf /* o : floating pitch gain for each subframe */ +) +{ + int16_t T0, T0_frac, T0_min, T0_max; /* integer pitch variables */ + float gain_pit; /* pitch gain */ + float gain_code; /* gain/normalized gain of the algebraic excitation */ + float norm_gain_code; /* normalized gain of the algebraic excitation */ + float gain_inov; /* Innovation gain */ + float voice_fac; /* voicing factor */ + float code[L_SUBFR]; /* algebraic codevector */ + const float *p_Aq; /* Pointer to frame LP coefficient */ + float *pt_pitch; /* pointer to floating pitch */ + int16_t i_subfr, i; /* tmp variables */ + int16_t pitch_limit_flag; + int16_t lp_flag; + + /*-----------------------------------------------------------------* + * Select LP filtering flag + *-----------------------------------------------------------------*/ + + if ( st->core_brate < ACELP_11k60 ) + { + lp_flag = LOW_PASS; + } + else + { + lp_flag = NORMAL_OPERATION; + } + + /*------------------------------------------------------------------* + * ACELP subframe loop + *------------------------------------------------------------------*/ + + p_Aq = Aq; /* pointer to interpolated LPC parameters */ + pt_pitch = pitch_buf; /* pointer to the pitch buffer */ + st->hAmrwb_IO->lt_voice_fac = 0.0f; + pitch_limit_flag = 0; /* always restrained pitch Q range in IO mode */ + + for ( i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR ) + { + /*----------------------------------------------------------------------* + * Decode pitch lag + *----------------------------------------------------------------------*/ + + *pt_pitch = pit_decode( st, st->core_brate, 1, L_FRAME, i_subfr, -1, &pitch_limit_flag, &T0, &T0_frac, &T0_min, &T0_max, L_SUBFR, 0, NULL ); + + /*--------------------------------------------------------------* + * Find the adaptive codebook vector + *--------------------------------------------------------------*/ + + pred_lt4( &exc[i_subfr], &exc[i_subfr], T0, T0_frac, L_SUBFR + 1, inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + + /*--------------------------------------------------------------* + * LP filtering of the adaptive excitation + *--------------------------------------------------------------*/ + + lp_filt_exc_dec( st, MODE1, i_subfr, L_SUBFR, L_FRAME, lp_flag, exc ); + + /*--------------------------------------------------------------* + * Innovation decoding + *--------------------------------------------------------------*/ + + inov_decode( st, st->core_brate, 1, L_FRAME, 0, i_subfr, p_Aq, st->tilt_code, *pt_pitch, code, L_SUBFR ); + + /*--------------------------------------------------------------* + * Gain decoding + * Estimate spectrum tilt and voicing + *--------------------------------------------------------------*/ + + gain_dec_amr_wb( st, st->core_brate, &gain_pit, &gain_code, st->hAmrwb_IO->past_qua_en, &gain_inov, code, &norm_gain_code ); + + /* update LP filtered gains for the case of frame erasures */ + lp_gain_updt( i_subfr, gain_pit, norm_gain_code, &st->lp_gainp, &st->lp_gainc, L_FRAME ); + + st->tilt_code = est_tilt( exc + i_subfr, gain_pit, code, gain_code, &voice_fac, L_SUBFR, 0 ); + + /*----------------------------------------------------------------------* + * Find the total excitation + *----------------------------------------------------------------------*/ + + for ( i = 0; i < L_SUBFR; i++ ) + { + exc2[i + i_subfr] = gain_pit * exc[i + i_subfr]; + exc[i + i_subfr] = exc2[i + i_subfr] + gain_code * code[i]; + } + + /*----------------------------------------------------------------* + * Excitation enhancements + *----------------------------------------------------------------*/ + + enhancer( MODE1, st->core_brate, -1, 1, -1, L_FRAME, voice_fac, st->stab_fac, norm_gain_code, gain_inov, &st->gc_threshold, code, exc2 + i_subfr, gain_pit, st->dispMem ); + + /*-----------------------------------------------------------------* + * HF gain modification factors at 23.85 kbps + *-----------------------------------------------------------------*/ + + if ( st->core_brate == ACELP_23k85 ) + { + hf_gain[i_subfr / L_SUBFR] = get_next_indice( st, 4 ); + } + + voice_fac = VF_0th_PARAM + VF_1st_PARAM * voice_fac + VF_2nd_PARAM * voice_fac * voice_fac; + voice_factors[i_subfr / L_SUBFR] = min( max( 0.0f, voice_fac ), 1.0f ); + + p_Aq += ( M + 1 ); + pt_pitch++; + + st->hAmrwb_IO->lt_voice_fac += 0.25f * voice_fac; + gain_buf[i_subfr / L_SUBFR] = gain_pit; + } + + return; +} diff --git a/lib_dec/dec_gen_voic.c b/lib_dec/dec_gen_voic.c new file mode 100644 index 0000000000000000000000000000000000000000..9f9e7cec8d5bf72c1e085028ac95dec355a01ab0 --- /dev/null +++ b/lib_dec/dec_gen_voic.c @@ -0,0 +1,294 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "wmc_auto.h" + +/*---------------------------------------------------------------------* + * decod_gen_voic() + * + * Decode generic (GC), voiced (VC) and AMR-WB IO frames + *---------------------------------------------------------------------*/ + +ivas_error decod_gen_voic( + Decoder_State *st, /* i/o: decoder static memory */ + const int16_t L_frame, /* i : length of the frame */ + const int16_t sharpFlag, /* i : formant sharpening flag */ + const float *Aq, /* i : LP filter coefficient */ + const float Es_pred, /* i : predicted scaled innov. energy */ + const int16_t do_WI, /* i : FEC fast recovery flag */ + float *pitch_buf, /* o : floating pitch values for each subframe */ + float *voice_factors, /* o : voicing factors */ + float *exc, /* i/o: adapt. excitation exc */ + float *exc2, /* i/o: adapt. excitation/total exc */ + float *bwe_exc, /* o : excitation for SWB TBE */ + int16_t *unbits, /* number of unused bits */ + float *gain_buf, /* o : floating pitch gain for each subframe */ + const int16_t tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag */ + const float tdm_Pri_pitch_buf[] /* i : primary channel pitch buffer */ +) +{ + int16_t T0 = PIT_MIN, T0_frac = 0, T0_min, T0_max; /* integer pitch variables */ + float gain_pit = 0.0f; /* pitch gain */ + float gain_code = 0.0f; /* gain/normalized gain of the algebraic excitation */ + float norm_gain_code = 0.0f; /* normalized gain of the algebraic excitation */ + float gain_inov = 0; /* Innovation gain */ + float gains_mem[2 * ( NB_SUBFR - 1 )]; /* pitch gain and code gain from previous subframes */ + float voice_fac; /* voicing factor */ + float code[L_SUBFR]; /* algebraic codevector */ + + const float *p_Aq; /* Pointer to frame LP coefficient */ + float *pt_pitch; /* pointer to floating pitch */ + int16_t i_subfr, i; /* tmp variables */ + float error_flag = 0.0f; + float gain_preQ = 0; /* Gain of prequantizer excitation */ + float code_preQ[L_SUBFR]; /* Prequantizer excitation */ + float norm_gain_preQ; + int16_t pitch_limit_flag; + + DTFS_STRUCTURE *PREVP, *CURRP; + int16_t shft_prev = 0, shft_curr = 0; + float ph_offset, dummy2[2], out[L_FRAME16k], enratio = 0.0f; + float sp_enratio, curr_spch_nrg, prev_spch_nrg, curr_res_nrg, prev_res_nrg, syn_tmp[L_FRAME16k], mem_tmp[M]; + int16_t harm_flag_acelp; + ivas_error error; + + error = IVAS_ERR_OK; + + /* read harmonicity flag */ + harm_flag_acelp = 0; + if ( st->core_brate >= MIN_BRATE_AVQ_EXC && st->core_brate <= MAX_BRATE_AVQ_EXC_TD && st->coder_type == GENERIC ) + { + harm_flag_acelp = get_next_indice( st, 1 ); + } + + /*------------------------------------------------------------------* + * ACELP subframe loop + *------------------------------------------------------------------*/ + + p_Aq = Aq; /* pointer to interpolated LPC parameters */ + pt_pitch = pitch_buf; /* pointer to the pitch buffer */ + norm_gain_preQ = 0.0f; + gain_preQ = 0; + set_f( code_preQ, 0, L_SUBFR ); + + for ( i_subfr = 0; i_subfr < L_frame; i_subfr += L_SUBFR ) + { + /*----------------------------------------------------------------------* + * Decode pitch lag + *----------------------------------------------------------------------*/ + + *pt_pitch = pit_decode( st, st->core_brate, 0, L_frame, i_subfr, st->coder_type, &pitch_limit_flag, &T0, &T0_frac, &T0_min, &T0_max, L_SUBFR, tdm_Pitch_reuse_flag, tdm_Pri_pitch_buf ); + + /*--------------------------------------------------------------* + * Find the adaptive codebook vector + *--------------------------------------------------------------*/ + + pred_lt4( &exc[i_subfr], &exc[i_subfr], T0, T0_frac, L_SUBFR + 1, inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + + tbe_celp_exc( st->element_mode, st->idchan, bwe_exc, L_frame, L_SUBFR, i_subfr, T0, T0_frac, &error_flag, st->tdm_LRTD_flag ); + + /*--------------------------------------------------------------* + * LP filtering of the adaptive excitation + *--------------------------------------------------------------*/ + + lp_filt_exc_dec( st, MODE1, i_subfr, L_SUBFR, L_frame, st->acelp_cfg.ltf_mode, exc ); + + /*-----------------------------------------------------------------* + * Transform-domain contribution decoding (active frames) + *-----------------------------------------------------------------*/ + + if ( st->core_brate >= MIN_BRATE_AVQ_EXC && st->coder_type != INACTIVE ) + { + gain_code = 0.0f; + transf_cdbk_dec( st, harm_flag_acelp, i_subfr, Es_pred, gain_code, &gain_preQ, &norm_gain_preQ, code_preQ, unbits ); + } + + /*--------------------------------------------------------------* + * Innovation decoding + *--------------------------------------------------------------*/ + + inov_decode( st, st->core_brate, 0, L_frame, sharpFlag, i_subfr, p_Aq, st->tilt_code, *pt_pitch, code, L_SUBFR ); + + /*--------------------------------------------------------------* + * Gain decoding + * Estimate spectrum tilt and voicing + *--------------------------------------------------------------*/ + + if ( st->core_brate <= ACELP_8k00 ) + { + gain_dec_lbr( st, st->coder_type, i_subfr, code, &gain_pit, &gain_code, &gain_inov, &norm_gain_code, gains_mem, L_SUBFR ); + } + else if ( st->core_brate > ACELP_32k ) + { + gain_dec_SQ( st, i_subfr, code, Es_pred, &gain_pit, &gain_code, &gain_inov, &norm_gain_code ); + } + else + { + gain_dec_mless( st, L_frame, st->coder_type, i_subfr, -1, code, Es_pred, &gain_pit, &gain_code, &gain_inov, &norm_gain_code ); + } + + st->tilt_code = est_tilt( exc + i_subfr, gain_pit, code, gain_code, &voice_fac, L_SUBFR, 0 ); + + /*-----------------------------------------------------------------* + * Transform-domain contribution decoding (inactive frames) + *-----------------------------------------------------------------*/ + + if ( st->total_brate >= MAX_GSC_INACTIVE_BRATE && st->coder_type == INACTIVE ) + { + transf_cdbk_dec( st, 0, i_subfr, Es_pred, gain_code, &gain_preQ, &norm_gain_preQ, code_preQ, unbits ); + } + + /* update LP filtered gains for the case of frame erasures */ + lp_gain_updt( i_subfr, gain_pit, norm_gain_code + norm_gain_preQ, &st->lp_gainp, &st->lp_gainc, L_frame ); + + /*----------------------------------------------------------------------* + * Find the total excitation + *----------------------------------------------------------------------*/ + + for ( i = 0; i < L_SUBFR; i++ ) + { + exc2[i + i_subfr] = gain_pit * exc[i + i_subfr]; + exc[i + i_subfr] = exc2[i + i_subfr] + gain_code * code[i]; + } + + /*-----------------------------------------------------------------* + * Add the ACELP pre-quantizer contribution + *-----------------------------------------------------------------*/ + + /* if( (coder_type == GENERIC && st->core_brate >= MIN_BRATE_AVQ_EXC) || (coder_type == INACTIVE && st->total_brate > MAX_GSC_INACTIVE_BRATE) ) */ + if ( gain_preQ != 0 ) + { + for ( i = 0; i < L_SUBFR; i++ ) + { + exc2[i + i_subfr] += gain_preQ * code_preQ[i]; + exc[i + i_subfr] += gain_preQ * code_preQ[i]; + } + } + + /*-----------------------------------------------------------------* + * Prepare TBE excitation + *-----------------------------------------------------------------*/ + + prep_tbe_exc( L_frame, L_SUBFR, i_subfr, gain_pit, gain_code, code, voice_fac, &voice_factors[i_subfr / L_SUBFR], bwe_exc, gain_preQ, code_preQ, T0, st->coder_type, st->core_brate, st->element_mode, st->idchan, st->hBWE_TD != NULL, st->tdm_LRTD_flag ); + + /*----------------------------------------------------------------* + * Excitation enhancements (update of total excitation signal) + *----------------------------------------------------------------*/ + + if ( st->core_brate > ACELP_32k || st->coder_type == INACTIVE ) + { + mvr2r( exc + i_subfr, exc2 + i_subfr, L_SUBFR ); + } + else + { + enhancer( MODE1, st->core_brate, -1, 0, st->coder_type, L_frame, voice_fac, st->stab_fac, norm_gain_code, gain_inov, &st->gc_threshold, code, exc2 + i_subfr, gain_pit, st->dispMem ); + } + + p_Aq += ( M + 1 ); + pt_pitch++; + gain_buf[i_subfr / L_SUBFR] = gain_pit; + st->tilt_code_dec[i_subfr / L_SUBFR] = st->tilt_code; + } + + /* FEC fast recovery */ + if ( do_WI ) + { + shft_prev = L_EXC_MEM - (int16_t) rint_new( st->bfi_pitch ); + prev_res_nrg = sum2_f( st->hWIDec->old_exc2 + shft_prev, (int16_t) rint_new( st->bfi_pitch ) ) + 1e-6f; + prev_spch_nrg = sum2_f( st->hWIDec->old_syn2 + shft_prev, (int16_t) rint_new( st->bfi_pitch ) ) + 1e-6f; + + mvr2r( st->mem_syn2, mem_tmp, M ); + syn_12k8( st->L_frame, Aq, exc2, syn_tmp, mem_tmp, 1 ); + + shft_curr = st->L_frame - (int16_t) rint_new( pitch_buf[NB_SUBFR16k - 1] ); + curr_res_nrg = sum2_f( exc2 + shft_curr, (int16_t) rint_new( pitch_buf[NB_SUBFR16k - 1] ) ); + curr_spch_nrg = sum2_f( syn_tmp + shft_curr, (int16_t) rint_new( pitch_buf[NB_SUBFR16k - 1] ) ); + + enratio = curr_res_nrg / prev_res_nrg; + sp_enratio = curr_spch_nrg / prev_spch_nrg; + + if ( enratio > 0.25f && + enratio < 15.0f && + sp_enratio > 0.15f && + st->bfi_pitch < 150 && + pitch_buf[NB_SUBFR16k - 1] < 150 ) + { + if ( ( error = DTFS_new( &PREVP ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = DTFS_new( &CURRP ) ) != IVAS_ERR_OK ) + { + return error; + } + + DTFS_to_fs( st->hWIDec->old_exc2 + shft_prev, (int16_t) rint_new( st->bfi_pitch ), PREVP, (int16_t) st->output_Fs, do_WI ); + DTFS_to_fs( exc2 + shft_curr, (int16_t) rint_new( pitch_buf[NB_SUBFR16k - 1] ), CURRP, (int16_t) st->output_Fs, do_WI ); + + ph_offset = 0.0f; + if ( ( error = WIsyn( *PREVP, CURRP, dummy2, &ph_offset, out, st->L_frame, 1 ) ) != IVAS_ERR_OK ) + { + return error; + } + + mvr2r( out, exc2, st->L_frame ); + mvr2r( exc2, exc, st->L_frame ); + + /* update bwe_exc for SWB-TBE */ + if ( st->hBWE_TD != NULL ) + { + for ( i_subfr = 0; i_subfr < L_frame; i_subfr += L_SUBFR ) + { + interp_code_4over2( exc + i_subfr, bwe_exc + ( i_subfr * 2 ), L_SUBFR ); + } + } + + free( PREVP ); + free( CURRP ); + } + } + + /* SC-VBR */ + st->prev_gain_pit_dec = gain_pit; + + return error; +} diff --git a/lib_dec/dec_higher_acelp.c b/lib_dec/dec_higher_acelp.c new file mode 100644 index 0000000000000000000000000000000000000000..5ae6b8b7c92b568ebec73e01698aba31d589f386 --- /dev/null +++ b/lib_dec/dec_higher_acelp.c @@ -0,0 +1,229 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*-----------------------------------------------------------------* + * transf_cdbk_dec() + * + * Transform domain contribution decoding + *-----------------------------------------------------------------*/ + +void transf_cdbk_dec( + Decoder_State *st, /* i/o: decoder state structure */ + const int16_t harm_flag_acelp, /* i : harmonic flag for higher rates ACELP */ + const int16_t i_subfr, /* i : subframe index */ + const float Es_pred, /* i : predicited scaled innovation energy */ + const float gain_code, /* i : innovative excitation gain */ + float *gain_preQ, /* o : prequantizer excitation gain */ + float *norm_gain_preQ, /* o : normalized prequantizer excitation gain */ + float code_preQ[], /* o : prequantizer excitation */ + int16_t *unbits /* o : number of AVQ unused bits */ +) +{ + int16_t i, index, nBits, Nsv; + int16_t x_norm[L_SUBFR]; + float Ecode; + int16_t nq[L_SUBFR / WIDTH_BAND]; + int16_t avq_bit_sFlag; + int16_t trgtSvPos; + + avq_bit_sFlag = 0; + if ( st->element_mode > EVS_MONO ) + { + avq_bit_sFlag = 1; + } + + /*--------------------------------------------------------------* + * Set bit-allocation + *--------------------------------------------------------------*/ + + Nsv = 8; + nBits = st->acelp_cfg.AVQ_cdk_bits[i_subfr / L_SUBFR]; + + /* increase # of AVQ allocated bits by unused bits from the previous subframe */ + nBits += ( *unbits ); + + /*--------------------------------------------------------------* + * Dequantize prequantizer excitation gain + *--------------------------------------------------------------*/ + + index = get_next_indice( st, G_AVQ_BITS ); + + if ( st->coder_type == INACTIVE ) + { + if ( st->core_brate > 56000 ) + { + *gain_preQ = usdequant( index, G_AVQ_MIN_INACT_64k, G_AVQ_DELTA_INACT_64k ); + } + else if ( st->core_brate > 42000 ) + { + *gain_preQ = usdequant( index, G_AVQ_MIN_INACT_48k, G_AVQ_DELTA_INACT_48k ); + } + else + { + *gain_preQ = usdequant( index, G_AVQ_MIN_INACT, G_AVQ_DELTA_INACT ); + } + + *gain_preQ *= gain_code; + } + else + { + if ( st->core_brate > ACELP_24k40 && st->core_brate <= 42000 ) + { + *gain_preQ = gain_dequant( index, 0.1f * G_AVQ_MIN, G_AVQ_MAX, G_AVQ_BITS ); + } + else + { + *gain_preQ = gain_dequant( index, G_AVQ_MIN, G_AVQ_MAX, G_AVQ_BITS ); + } + if ( Es_pred < 0 ) + { + *gain_preQ *= (float) ( 0.25f * fabs( Es_pred ) ); + } + else + { + *gain_preQ *= Es_pred; + } + } + + trgtSvPos = Nsv - 1; + if ( avq_bit_sFlag && nBits > 85 && !harm_flag_acelp && ( st->coder_type == GENERIC || st->coder_type == TRANSITION || st->coder_type == INACTIVE ) ) + { + trgtSvPos = 2; + avq_bit_sFlag = 2; + } + + /*--------------------------------------------------------------* + * Encode and multiplex subvectors into bitstream + *--------------------------------------------------------------*/ + + AVQ_demuxdec( st, x_norm, &nBits, Nsv, nq, avq_bit_sFlag, trgtSvPos ); + + /* save # of AVQ unused bits for next subframe */ + *unbits = nBits; + + /*--------------------------------------------------------------* + * iDCT transform + *--------------------------------------------------------------*/ + + set_f( code_preQ, 0.0f, L_SUBFR ); + for ( i = 0; i < Nsv * WIDTH_BAND; i++ ) + { + code_preQ[i] = (float) ( x_norm[i] ); + } + + if ( st->coder_type == INACTIVE || st->core_brate > MAX_BRATE_AVQ_EXC_TD || harm_flag_acelp ) + { + edct2( L_SUBFR, 1, code_preQ, code_preQ, ip_edct2_64, w_edct2_64 ); + } + + /*--------------------------------------------------------------* + * Preemphasise + *--------------------------------------------------------------*/ + + /* in extreme cases at subframe boundaries, lower the preemphasis memory to avoid a saturation */ + if ( ( nq[7] != 0 ) && ( st->last_nq_preQ - nq[0] > 7 ) ) + { + st->mem_preemp_preQ /= 16; + } + + st->last_nq_preQ = nq[7]; + + /* TD pre-quantizer: in extreme cases at subframe boundaries, lower the preemphasis memory to avoid a saturation */ + if ( st->element_mode > EVS_MONO && st->coder_type != INACTIVE && st->core_brate >= MIN_BRATE_AVQ_EXC && st->core_brate <= MAX_BRATE_AVQ_EXC_TD && !harm_flag_acelp && code_preQ[0] != 0 ) + { + if ( fabs( (float) ( st->last_code_preq ) ) > 16.0f * (float) fabs( code_preQ[0] ) ) + { + st->mem_preemp_preQ /= 16; + } + else if ( fabs( (float) ( st->last_code_preq ) ) > 8.0f * (float) fabs( code_preQ[0] ) ) + { + st->mem_preemp_preQ /= 8; + } + } + + st->last_code_preq = (int16_t) code_preQ[L_SUBFR - 1]; + + preemph( code_preQ, FAC_PRE_AVQ, L_SUBFR, &st->mem_preemp_preQ ); + + /*--------------------------------------------------------------* + * Compute normalized prequantizer excitation gain for FEC + *--------------------------------------------------------------*/ + + Ecode = ( sum2_f( code_preQ, L_SUBFR ) + 0.01f ) / L_SUBFR; + + /* somewhat attenuate pre-quantizer normalized gain for FEC */ + *norm_gain_preQ = 0.8f * ( *gain_preQ ) * (float) sqrt( Ecode ); + + st->use_acelp_preq = 1; + + return; +} + +/*-----------------------------------------------------------* + * gain_dequant() + * + * Returns decoded gain quantized between the specified + * range using the specified number of levels. + *-----------------------------------------------------------*/ + +/*! r: decoded gain */ +float gain_dequant( + int16_t index, /* i : quantization index */ + const float min_val, /* i : value of lower limit */ + const float max_val, /* i : value of upper limit */ + const int16_t bits /* i : number of bits to dequantize */ +) +{ + float gain, c_min, c_mult; + int16_t levels; + + levels = 1 << bits; + + c_min = (float) log10( min_val ); + c_mult = (float) ( ( levels - 1 ) / ( log10( max_val ) - c_min ) ); + + gain = (float) pow( 10.0, ( ( (float) index ) / c_mult ) + c_min ); + + return ( gain ); +} diff --git a/lib_dec/dec_nelp.c b/lib_dec/dec_nelp.c new file mode 100644 index 0000000000000000000000000000000000000000..3c2688d41dd3e33b8f7a8590d60c8b881c33dc5c --- /dev/null +++ b/lib_dec/dec_nelp.c @@ -0,0 +1,101 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * decod_nelp() + * + * Decode unvoiced NELP + *-------------------------------------------------------------------*/ + +void decod_nelp( + Decoder_State *st, /* i/o: decoder static memory */ + float *tmp_noise, /* o : long term temporary noise energy */ + float *pitch_buf, /* o : floating pitch values for each subframe */ + float *exc, /* o : adapt. excitation exc */ + float *exc2, /* o : adapt. excitation/total exc */ + float *voice_factors, /* o : voicing factors */ + float *bwe_exc, /* o : excitation for SWB TBE */ + const int16_t bfi, /* i : bad frame indicator */ + float *gain_buf /* o : floating pitch gain for each subframe */ +) +{ + int16_t i, coder_type; + float exc_nelp[L_FRAME]; + + *tmp_noise = 0; + + if ( st->use_partial_copy && st->rf_frame_type == RF_NELP ) + { + coder_type = UNVOICED; + } + else + { + coder_type = st->coder_type; + } + + nelp_decoder( st, exc_nelp, exc, bfi, coder_type, gain_buf ); + + mvr2r( exc_nelp, exc, L_FRAME ); + mvr2r( exc_nelp, exc2, L_FRAME ); + + st->tilt_code = 0.0f; /* purely unvoiced */ + set_f( st->tilt_code_dec, 0, NB_SUBFR16k ); + st->prev_tilt_code_dec = st->tilt_code; + + st->dispMem[0] = 0; + st->prev_gain_pit_dec = 0.0; + st->dispMem[2] = st->prev_gain_pit_dec; + + for ( i = 3; i < 7; i++ ) + { + st->dispMem[i] = st->dispMem[i - 1]; + } + + set_f( pitch_buf, L_SUBFR, NB_SUBFR ); + if ( st->hBWE_TD != NULL ) + { + interp_code_5over2( exc2, bwe_exc, L_FRAME ); + } + set_f( voice_factors, 0.0f, NB_SUBFR16k ); + + return; +} diff --git a/lib_dec/dec_pit_exc.c b/lib_dec/dec_pit_exc.c new file mode 100644 index 0000000000000000000000000000000000000000..27e49a6ef9f180a962f05d74e4a39ef6d3acf5d4 --- /dev/null +++ b/lib_dec/dec_pit_exc.c @@ -0,0 +1,341 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * dec_pit_exc() + * + * Decode pitch-only contribution (used by the GSC technology) + *-------------------------------------------------------------------*/ + +void dec_pit_exc( + Decoder_State *st, /* i/o: decoder static memory */ + const int16_t L_frame, /* i : length of the frame */ + const float *Aq, /* i : LP filter coefficient */ + const float Es_pred, /* i : predicted scaled innov. energy */ + float *pitch_buf, /* o : floating pitch values for each subframe */ + float *code, /* o : innovation */ + float *exc, /* i/o: adapt. excitation exc */ + const int16_t nb_subfr, /* i : Number of subframe considered */ + float *gain_buf, /* o : floating pitch gain for each subframe */ + const int16_t tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag */ + const float tdm_Pri_pitch_buf[] /* i : primary channel pitch buffer */ +) +{ + int16_t T0, T0_frac, T0_min, T0_max; /* integer pitch variables */ + float gain_pit; /* pitch gain */ + float gain_code; /* gain/normalized gain of the algebraic excitation */ + float norm_gain_code; /* normalized gain of the algebraic excitation */ + float gain_inov; /* Innovation gain */ + float voice_fac; /* voicing factor */ + int16_t L_subfr, pit_idx; + const float *p_Aq; /* Pointer to frame LP coefficient */ + float *pt_pitch; /* pointer to floating pitch */ + int16_t i_subfr, i; /* tmp variables */ + int32_t Local_BR, Pitch_BR; + int16_t Pitch_CT, pitch_limit_flag; + int16_t nbits; + float *pt_gain; /* Pointer to floating gain values for each subframe */ + int16_t use_fcb; + float gains_mem[2 * ( NB_SUBFR - 1 )]; /* pitch gain and code gain from previous subframes */ + + /*------------------------------------------------------------------* + * Initialization + *------------------------------------------------------------------*/ + + use_fcb = 0; + if ( st->GSC_IVAS_mode > 0 && ( st->GSC_noisy_speech || st->core_brate > GSC_H_RATE_STG ) ) + { + Local_BR = ACELP_8k00; + Pitch_CT = GENERIC; + Pitch_BR = ACELP_8k00; + if ( st->L_frame == L_FRAME16k ) + { + Local_BR = ACELP_14k80; + if ( st->GSC_IVAS_mode > 0 ) + { + Local_BR = ACELP_9k60; + } + Pitch_BR = st->core_brate; + } + } + else if ( st->GSC_noisy_speech ) + { + Local_BR = ACELP_7k20; + Pitch_CT = GENERIC; + Pitch_BR = ACELP_7k20; + if ( L_frame == L_FRAME16k ) + { + Pitch_BR = st->core_brate; + } + } + else + { + Local_BR = ACELP_7k20; + Pitch_CT = AUDIO; + Pitch_BR = st->core_brate; + + if ( L_frame == L_FRAME16k ) + { + Local_BR = ACELP_13k20; + Pitch_CT = GENERIC; + } + } + + gain_code = 0; + pitch_limit_flag = 1; /* always extended pitch Q range */ + + /*------------------------------------------------------------------* + * ACELP subframe loop + *------------------------------------------------------------------*/ + + L_subfr = st->L_frame / nb_subfr; + p_Aq = Aq; /* pointer to interpolated LPC parameters */ + pt_pitch = pitch_buf; /* pointer to the pitch buffer */ + pt_gain = gain_buf; /* pointer to the gain buffer */ + + if ( ( ( st->core_brate >= MIN_RATE_FCB || ( st->GSC_noisy_speech == 1 && ( ( st->L_frame == L_FRAME && st->core_brate >= ACELP_13k20 ) || ( st->L_frame == L_FRAME16k && st->core_brate >= GSC_H_RATE_STG ) || st->GSC_IVAS_mode == 0 ) ) ) && L_subfr == L_SUBFR ) ) + { + use_fcb = 1; + } + else if ( st->GSC_IVAS_mode > 0 && L_subfr == 2 * L_SUBFR && st->GSC_IVAS_mode < 3 ) + { + use_fcb = 2; + st->acelp_cfg.fcb_mode = 1; + set_s( st->acelp_cfg.gains_mode, 6, 4 ); + set_s( st->acelp_cfg.pitch_bits, 9, 4 ); + set_s( st->acelp_cfg.fixed_cdk_index, 14, 5 ); + } + + for ( i_subfr = 0; i_subfr < L_frame; i_subfr += L_subfr ) + { + /*----------------------------------------------------------------------* + * Decode pitch lag + *----------------------------------------------------------------------*/ + + *pt_pitch = pit_decode( st, Pitch_BR, 0, L_frame, i_subfr, Pitch_CT, &pitch_limit_flag, &T0, &T0_frac, &T0_min, &T0_max, L_subfr, tdm_Pitch_reuse_flag, tdm_Pri_pitch_buf ); + + /*--------------------------------------------------------------* + * Find the adaptive codebook vector. + *--------------------------------------------------------------*/ + + pred_lt4( &exc[i_subfr], &exc[i_subfr], T0, T0_frac, L_subfr + 1, inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + + /*--------------------------------------------------------------* + * Innovation decoding + *--------------------------------------------------------------*/ + + if ( use_fcb == 1 ) + { + inov_decode( st, Local_BR, 0, L_frame, 1, i_subfr, p_Aq, st->tilt_code, *pt_pitch, code, L_SUBFR ); + + /*--------------------------------------------------------------* + * Gain decoding + * Estimate spectrum tilt and voicing + *--------------------------------------------------------------*/ + + gain_dec_mless( st, L_frame, LOCAL_CT, i_subfr, -1, code, Es_pred, &gain_pit, &gain_code, &gain_inov, &norm_gain_code ); + + st->tilt_code = est_tilt( exc + i_subfr, gain_pit, code, gain_code, &voice_fac, L_SUBFR, 0 ); + } + else if ( use_fcb == 2 ) + { + /*--------------------------------------------------------------* + * Innovation decoding + *--------------------------------------------------------------*/ + + inov_decode( st, st->core_brate, 0, L_FRAME, 0, i_subfr, p_Aq, st->tilt_code, *pt_pitch, code, 2 * L_SUBFR ); + + /*--------------------------------------------------------------* + * Gain decoding + * Estimate spectrum tilt and voicing + *--------------------------------------------------------------*/ + + gain_dec_lbr( st, GENERIC, i_subfr, code, &gain_pit, &gain_code, &gain_inov, &norm_gain_code, gains_mem, 2 * L_SUBFR ); + st->tilt_code = est_tilt( exc + i_subfr, gain_pit, code, gain_code, &voice_fac, 2 * L_SUBFR, 0 ); + } + else + { + nbits = 5; + if ( st->core_brate < MIN_RATE_FCB ) + { + nbits = 4; + } + + set_f( code, 0, L_SUBFR ); + gain_code = 0.0f; + st->tilt_code = 0.0f; + + pit_idx = get_next_indice( st, nbits ); + + gain_pit = 0.5853f + dic_gp[pit_idx]; + + if ( st->BER_detect ) /* Bitstream is corrupted, use the past pitch gain */ + { + gain_pit = st->lp_gainp; + } + } + + /*----------------------------------------------------------------------* + * Find the total excitation + *----------------------------------------------------------------------*/ + + if ( use_fcb != 0 ) + { + for ( i = 0; i < L_subfr; i++ ) + { + exc[i + i_subfr] = gain_pit * exc[i + i_subfr] + gain_code * code[i]; + } + } + else + { + for ( i = 0; i < L_subfr; i++ ) + { + exc[i + i_subfr] = gain_pit * exc[i + i_subfr]; + } + } + + if ( L_subfr == 5 * L_SUBFR ) + { + /* update gains for FEC - equivalent to lp_gain_updt() */ + st->lp_gainp = gain_pit; + st->lp_gainc = 0; + + pt_pitch++; + *pt_pitch = *( pt_pitch - 1 ); + pt_pitch++; + *pt_pitch = *( pt_pitch - 1 ); + pt_pitch++; + *pt_pitch = *( pt_pitch - 1 ); + pt_pitch++; + *pt_pitch = *( pt_pitch - 1 ); + pt_pitch++; + + p_Aq += 5 * ( M + 1 ); + } + else if ( L_subfr == 5 * L_SUBFR / 2 ) + { + if ( i_subfr == 0 ) + { + pt_pitch++; + *pt_pitch = *( pt_pitch - 1 ); + pt_pitch++; + p_Aq += 2 * ( M + 1 ); + + /* update gains for FEC - equivalent to lp_gain_updt() */ + st->lp_gainp = ( 3.0f / 15.0f ) * gain_pit; + st->lp_gainc = 0; + } + else + { + pt_pitch++; + *pt_pitch = *( pt_pitch - 1 ); + pt_pitch++; + *pt_pitch = *( pt_pitch - 1 ); + pt_pitch++; + p_Aq += 3 * ( M + 1 ); + + /* update gains for FEC - equivalent to lp_gain_updt() */ + st->lp_gainp = ( 12.0f / 15.0f ) * gain_pit; + st->lp_gainc = 0; + } + } + else if ( L_subfr == 2 * L_SUBFR ) + { + p_Aq += 2 * ( M + 1 ); + pt_pitch++; + *pt_pitch = *( pt_pitch - 1 ); + pt_pitch++; + *pt_gain = gain_pit; + pt_gain++; + *pt_gain = *( pt_gain - 1 ); + pt_gain++; + + if ( i_subfr == 0 ) + { + /* update gains for FEC - equivalent to lp_gain_updt() */ + st->lp_gainp = ( 3.0f / 10.0f ) * gain_pit; + st->lp_gainc = 0; + } + else + { + /* update gains for FEC - equivalent to lp_gain_updt() */ + st->lp_gainp = ( 7.0f / 10.0f ) * gain_pit; + st->lp_gainc = 0; + } + } + else if ( L_subfr == 4 * L_SUBFR ) + { + pt_pitch++; + *pt_pitch = *( pt_pitch - 1 ); + pt_pitch++; + *pt_pitch = *( pt_pitch - 1 ); + pt_pitch++; + *pt_pitch = *( pt_pitch - 1 ); + pt_pitch++; + *pt_gain = gain_pit; + pt_gain++; + *pt_gain = *( pt_gain - 1 ); + pt_gain++; + *pt_gain = *( pt_gain - 1 ); + pt_gain++; + *pt_gain = *( pt_gain - 1 ); + pt_gain++; + p_Aq += 4 * ( M + 1 ); + + /* update gains for FEC - equivalent to lp_gain_updt() */ + st->lp_gainp = gain_pit; + st->lp_gainc = 0; + } + else + { + p_Aq += ( M + 1 ); + pt_pitch++; + *pt_gain = gain_pit; + pt_gain++; + + lp_gain_updt( i_subfr, gain_pit, 0, &st->lp_gainp, &st->lp_gainc, L_frame ); + } + } + + return; +} diff --git a/lib_dec/dec_post.c b/lib_dec/dec_post.c new file mode 100644 index 0000000000000000000000000000000000000000..6116539e97e742065429694201b618d6b0a22eb4 --- /dev/null +++ b/lib_dec/dec_post.c @@ -0,0 +1,996 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "wmc_auto.h" + +/*---------------------------------------------------------------------* + * Local constants + *---------------------------------------------------------------------*/ + +#define FORMAT_POST_FILT_G1 0.75f /*0.75f*/ /*denominator 0.9,0.75,0.15,0.9*/ + + +/*-------------------------------------------------------------------------- + * Local function prototypes + *--------------------------------------------------------------------------*/ + +static void Dec_postfilt( const int16_t L_subfr, PFSTAT *pfstat, const int16_t t0, const float *signal_ptr, const float *coeff, float *sig_out, const float gamma1, const float gamma2, const float gain_factor, const int16_t disable_hpf ); + +static void pst_ltp( const int16_t t0, const float *ptr_sig_in, float *ptr_sig_pst0, float gain_factor, const int16_t L_subfr ); + +static void search_del( const int16_t t0, const float *ptr_sig_in, int16_t *ltpdel, int16_t *phase, float *num_gltp, float *den_gltp, float *y_up, int16_t *off_yup, const int16_t L_subfr ); + +static void filt_plt( const float *s_in, const float *s_ltp, float *s_out, const float gain_plt, const int16_t L_subfr ); + +static void compute_ltp_l( const float *s_in, const int16_t ltpdel, const int16_t phase, float *y_up, float *num, float *den, const int16_t L_subfr ); + +static int16_t select_ltp( const float num1, const float den1, const float num2, const float den2 ); + +static void modify_pst_param( const float psf_lp_noise, float *g1, float *g2, const int16_t coder_type, float *gain_factor ); + +static void Dec_formant_postfilt( PFSTAT *pfstat, const float *signal_ptr, const float *coeff, float *sig_out, const float gamma1, const float gamma2, const int16_t l_subfr ); + + +/*--------------------------------------------------------------------------* + * Function Init_post_filter() + * + * Post-filter initialization + *--------------------------------------------------------------------------*/ + +void Init_post_filter( + PFSTAT_HANDLE hPFstat /* i/o: post-filter state memories handle */ +) +{ + /* It is off by default */ + hPFstat->on = 0; + + /* Reset */ + hPFstat->reset = 0; + + /* Initialize arrays and pointers */ + set_zero( hPFstat->mem_pf_in, L_SUBFR ); + + /* res2 = A(gamma2) residual */ + set_zero( hPFstat->mem_res2, DECMEM_RES2 ); + + /* 1/A(gamma1) memory */ + set_zero( hPFstat->mem_stp, L_SUBFR ); + + /* null memory to compute i.r. of A(gamma2)/A(gamma1) */ + set_zero( hPFstat->mem_zero, M ); + + /* for gain adjustment */ + hPFstat->gain_prec = 1.0f; + + return; +} + + +/*-------------------------------------------------------------------------- + * nb_post_filt() + * + * Main routine to perform post filtering of NB signals + *--------------------------------------------------------------------------*/ + +void nb_post_filt( + const int16_t L_frame, /* i : frame length */ + const int16_t L_subfr, /* i : sub-frame length */ + PFSTAT_HANDLE hPFstat, /* i/o: Post filter related memories */ + float *psf_lp_noise, /* i/o: long term noise energy */ + const float tmp_noise, /* i : noise energy */ + float *synth, /* i/o: synthesis */ + const float *Aq, /* i : LP filter coefficient */ + const float *pitch_buf, /* i : floating pitch for each subframe */ + const int16_t coder_type, /* i : coder_type */ + const int16_t BER_detect, /* i : BER detect flag */ + const int16_t disable_hpf /* i : flag to disabled HPF */ +) +{ + int16_t t0_first, i, j; + const float *p_Aq; + float *pf_in, post_G1, post_G2, gain_factor; + float pf_in_buffer[M + L_FRAME16k]; + + if ( !BER_detect ) + { + /* update long-term background noise energy during inactive frames */ + if ( coder_type == INACTIVE ) + { + *psf_lp_noise = 0.95f * *psf_lp_noise + 0.05f * tmp_noise; + } + } + + /* set post-filter input */ + modify_pst_param( *psf_lp_noise, &post_G1, &post_G2, coder_type, &gain_factor ); + + if ( hPFstat->reset ) + { + set_zero( hPFstat->mem_res2, DECMEM_RES2 ); + mvr2r( &synth[L_frame - L_SYN_MEM], hPFstat->mem_pf_in, L_SYN_MEM ); + mvr2r( &synth[L_frame - L_SYN_MEM], hPFstat->mem_stp, L_SYN_MEM ); + hPFstat->gain_prec = 1.0f; + hPFstat->reset = 0; + return; + } + + pf_in = &pf_in_buffer[M]; + mvr2r( hPFstat->mem_pf_in + L_SYN_MEM - M, &pf_in[-M], M ); + mvr2r( synth, pf_in, L_frame ); + mvr2r( &synth[L_frame - L_SYN_MEM], hPFstat->mem_pf_in, L_SYN_MEM ); + + /* deactivation of the post filter in case of AUDIO because it causes problems to singing sequences */ + if ( coder_type == AUDIO ) + { + post_G1 = 1.f; + post_G2 = 1.f; + gain_factor = 1.f; + } + + /* run the post filter */ + p_Aq = Aq; + for ( i = 0, j = 0; i < L_frame; i += L_subfr, j++ ) + { + t0_first = (int16_t) ( pitch_buf[j] + 0.5f ); + + Dec_postfilt( L_subfr, hPFstat, t0_first, &pf_in[i], p_Aq, &synth[i], post_G1, post_G2, gain_factor, disable_hpf ); + + p_Aq += ( M + 1 ); + } + + return; +} + + +/*-------------------------------------------------------------------------- + * formant_post_filt: + * + * WB and SWB formant post-filtering + *--------------------------------------------------------------------------*/ + +void formant_post_filt( + PFSTAT_HANDLE hPFstat, /* i/o: Post filter related memories */ + float *synth_in, /* i : 12k8 synthesis */ + const float *Aq, /* i : LP filter coefficient */ + float *synth_out, /* i/o: input signal */ + const int16_t L_frame, /* i : frame length */ + const int16_t L_subfr, /* i : sub-frame length */ + const float lp_noise, /* i : background noise energy */ + const int32_t brate, /* i : bitrate */ + const int16_t off_flag /* i : off flag */ +) +{ + int16_t i_subfr; + const float *p_Aq; + float post_G1, post_G2; + + /*default parameter for noisy speech and high bitrates*/ + if ( L_frame == L_FRAME ) + { + post_G2 = 0.7f; + if ( lp_noise < LP_NOISE_THRESH ) /* Clean speech */ + { + if ( brate < ACELP_13k20 ) /*Low rates*/ + { + post_G1 = 0.8f; + } + else if ( brate < ACELP_24k40 ) + { + post_G1 = 0.75f; + } + else + { + post_G1 = 0.72f; + } + } + else /*Noisy speech*/ + { + if ( brate < ACELP_15k85 ) /*Low rates*/ + { + post_G1 = 0.75f; + } + else /*High rates*/ + { + post_G1 = 0.7f; + } + } + } + else + { + post_G2 = 0.76f; + if ( lp_noise >= LP_NOISE_THRESH ) + { + post_G1 = 0.76f; + } + else if ( brate == ACELP_13k20 ) + { + post_G1 = 0.82f; + } + else if ( brate == ACELP_16k40 ) + { + post_G1 = 0.80f; + } + else if ( brate == ACELP_24k40 || brate == ACELP_32k ) + { + post_G1 = 0.78f; + } + else + { + post_G1 = 0.76f; + } + } + + /* Switch off post-filter*/ + if ( off_flag ) + { + post_G1 = post_G2; + } + + /* Reset post filter */ + if ( hPFstat->reset ) + { + hPFstat->reset = 0; + mvr2r( &synth_in[L_frame - L_SYN_MEM], hPFstat->mem_pf_in, L_SYN_MEM ); + mvr2r( &synth_in[L_frame - L_SYN_MEM], hPFstat->mem_stp, L_SYN_MEM ); + hPFstat->gain_prec = 1.f; + mvr2r( synth_in, synth_out, L_frame ); + + return; + } + + /* input memory*/ + mvr2r( hPFstat->mem_pf_in, synth_in - L_SYN_MEM, L_SYN_MEM ); + mvr2r( &synth_in[L_frame - L_SYN_MEM], hPFstat->mem_pf_in, L_SYN_MEM ); + + /* run the post filter */ + p_Aq = Aq; + for ( i_subfr = 0; i_subfr < L_frame; i_subfr += L_subfr ) + { + Dec_formant_postfilt( hPFstat, &synth_in[i_subfr], p_Aq, &synth_out[i_subfr], post_G1, post_G2, L_subfr ); + + p_Aq += ( M + 1 ); + } + + return; +} + + +/*---------------------------------------------------------------------------- + * Dec_postfilt() + * + * Adaptive postfilter main function + * Short-term postfilter : + * Hst(z) = Hst0(z) Hst1(z) + * Hst0(z) = 1/g0 A(gamma2)(z) / A(gamma1)(z) + * if {hi} = i.r. filter A(gamma2)/A(gamma1) (truncated) + * g0 = SUM(|hi|) if > 1 + * g0 = 1. else + * Hst1(z) = 1/(1 - |mu|) (1 + mu z-1) + * with mu = k1 * gamma3 + * k1 = 1st parcor calculated on {hi} + * gamma3 = gamma3_minus if k1<0, gamma3_plus if k1>0 + * Long-term postfilter : + * harmonic postfilter : H0(z) = gl * (1 + b * z-p) + * b = gamma_g * gain_ltp + * gl = 1 / 1 + b + * computation of delay p on A(gamma2)(z) s(z) + * sub optimal search + * 1. search around 1st subframe delay (3 integer values) + * 2. search around best integer with fract. delays (1/8) + *----------------------------------------------------------------------------*/ + +static void Dec_postfilt( + const int16_t L_subfr, /* i : sub-frame length */ + PFSTAT *pfstat, /* i/o: Post filter related memories */ + const int16_t t0, /* i : pitch delay given by coder */ + const float *signal_ptr, /* i : input signal (pointer to current subframe */ + const float *coeff, /* i : LPC coefficients for current subframe */ + float *sig_out, /* o : postfiltered output */ + const float gamma1, /* i : short term postfilt. den. weighting factor*/ + const float gamma2, /* i : short term postfilt. num. weighting factor*/ + const float gain_factor, /* i : Gain Factor */ + const int16_t disable_hpf /* i : flag to disable HPF */ +) +{ + float apond1[M + 1]; /* s.t. denominator coeff. */ + float apond2[LONG_H_ST]; + float sig_ltp[L_SUBFR + 1]; /* H0 output signal */ + float res2[SIZ_RES2]; + float *sig_ltp_ptr; + float *res2_ptr; + float *ptr_mem_stp; + float parcor0; + + /* Init pointers and restore memories */ + res2_ptr = res2 + DECMEM_RES2; + ptr_mem_stp = pfstat->mem_stp + L_SYN_MEM - 1; + mvr2r( pfstat->mem_res2, res2, DECMEM_RES2 ); + + /* Compute weighted LPC coefficients */ + weight_a( coeff, apond1, gamma1, M ); + weight_a( coeff, apond2, gamma2, M ); + set_f( &apond2[M + 1], 0, LONG_H_ST - ( M + 1 ) ); + + /* Compute A(gamma2) residual */ + residu( apond2, M, signal_ptr, res2_ptr, L_subfr ); + + /* Harmonic filtering */ + sig_ltp_ptr = sig_ltp + 1; + + if ( !disable_hpf ) + { + pst_ltp( t0, res2_ptr, sig_ltp_ptr, gain_factor, L_subfr ); + } + else + { + mvr2r( res2_ptr, sig_ltp_ptr, L_subfr ); + } + + /* Save last output of 1/A(gamma1) */ + /* (from preceding subframe) */ + sig_ltp[0] = *ptr_mem_stp; + + /* Controls short term pst filter gain and compute parcor0 */ + calc_st_filt( apond2, apond1, &parcor0, sig_ltp_ptr, pfstat->mem_zero, L_subfr, -1 ); + + syn_filt( apond1, M, sig_ltp_ptr, sig_ltp_ptr, L_subfr, pfstat->mem_stp + L_SYN_MEM - M, 0 ); + mvr2r( sig_ltp_ptr + L_SUBFR - L_SYN_MEM, pfstat->mem_stp, L_SYN_MEM ); + + /* Tilt filtering */ + filt_mu( sig_ltp, sig_out, parcor0, L_subfr, -1 ); + + /* Gain control */ + scale_st( signal_ptr, sig_out, &( pfstat->gain_prec ), L_subfr, -1 ); + + /* Update for next subframe */ + mvr2r( &res2[L_subfr], pfstat->mem_res2, DECMEM_RES2 ); + + return; +} + + +/*---------------------------------------------------------------------------- + * Dec_formant_postfilt + * + * Post - adaptive postfilter main function + * Short term postfilter : + * Hst(z) = Hst0(z) Hst1(z) + * Hst0(z) = 1/g0 A(gamma2)(z) / A(gamma1)(z) + * if {hi} = i.r. filter A(gamma2)/A(gamma1) (truncated) + * g0 = SUM(|hi|) if > 1 + * g0 = 1. else + * Hst1(z) = 1/(1 - |mu|) (1 + mu z-1) + * with mu = k1 * gamma3 + * k1 = 1st parcor calculated on {hi} + * gamma3 = gamma3_minus if k1<0, gamma3_plus if k1>0 + *----------------------------------------------------------------------------*/ + +static void Dec_formant_postfilt( + PFSTAT_HANDLE hPFstat, /* i/o: states strucure */ + const float *signal_ptr, /* i : input signal (pointer to current subframe */ + const float *coeff, /* i : LPC coefficients for current subframe */ + float *sig_out, /* o : postfiltered output */ + const float gamma1, /* i : short term postfilt. den. weighting factor*/ + const float gamma2, /* i : short term postfilt. num. weighting factor*/ + const int16_t l_subfr /* i : subframe length */ +) +{ + /* Local variables and arrays */ + float apond1[M + 1]; /* s.t. denominator coeff. */ + float apond2[LONG_H_ST]; + float res2[L_SUBFR]; + float resynth[L_SUBFR + 1]; + float parcor0; + + /* Compute weighted LPC coefficients */ + weight_a( coeff, apond1, gamma1, M ); + weight_a( coeff, apond2, gamma2, M ); + + set_zero( &apond2[M + 1], LONG_H_ST - ( M + 1 ) ); + + /* Compute A(gamma2) residual */ + residu( apond2, M, signal_ptr, res2, l_subfr ); + + /* Controls short term pst filter gain and compute parcor0 */ + calc_st_filt( apond2, apond1, &parcor0, res2, hPFstat->mem_zero, l_subfr, -1 ); + + /* 1/A(gamma1) filtering, mem_stp is updated */ + resynth[0] = *( hPFstat->mem_stp + L_SYN_MEM - 1 ); + + syn_filt( apond1, M, res2, &( resynth[1] ), l_subfr, hPFstat->mem_stp + L_SYN_MEM - M, 0 ); + + mvr2r( &( resynth[1] ) + l_subfr - L_SYN_MEM, hPFstat->mem_stp, L_SYN_MEM ); + + /* Tilt filtering */ + filt_mu( resynth, sig_out, parcor0, l_subfr, -1 ); + + /* Gain control */ + scale_st( signal_ptr, sig_out, &hPFstat->gain_prec, l_subfr, -1 ); + + return; +} + + +/*---------------------------------------------------------------------------- + * pst_ltp() + * + * Perform harmonic postfilter + *----------------------------------------------------------------------------*/ + +static void pst_ltp( + const int16_t t0, /* i : pitch delay given by coder */ + const float *ptr_sig_in, /* i : postfilter input filter (residu2) */ + float *ptr_sig_pst0, /* o : harmonic postfilter output */ + float gain_factor, /* i : gain factor */ + const int16_t L_subfr /* i : sub-frame length */ +) +{ + int16_t ltpdel, phase; + float num_gltp, den_gltp; + float num2_gltp, den2_gltp; + float gain_plt; + float y_up[SIZ_Y_UP]; + const float *ptr_y_up; + int16_t off_yup; + + /* Suboptimal delay search */ + search_del( t0, ptr_sig_in, <pdel, &phase, &num_gltp, &den_gltp, y_up, &off_yup, L_subfr ); + + if ( num_gltp == 0.0f ) + { + mvr2r( ptr_sig_in, ptr_sig_pst0, L_subfr ); + } + else + { + if ( phase == 0 ) + { + ptr_y_up = ptr_sig_in - ltpdel; + } + else + { + /* filtering with long filter */ + compute_ltp_l( ptr_sig_in, ltpdel, phase, ptr_sig_pst0, &num2_gltp, &den2_gltp, L_subfr ); + + if ( select_ltp( num_gltp, den_gltp, num2_gltp, den2_gltp ) == 1 ) + { + /* select short filter */ + ptr_y_up = y_up + ( ( phase - 1 ) * ( L_subfr + 1 ) + off_yup ); + } + else + { + /* select long filter */ + num_gltp = num2_gltp; + den_gltp = den2_gltp; + ptr_y_up = ptr_sig_pst0; + } + } + + if ( num_gltp >= den_gltp ) + { + /* beta bounded to 1 */ + gain_plt = MIN_GPLT; + } + else + { + gain_plt = den_gltp / ( den_gltp + ( (float) 0.5 ) * num_gltp ); + } + + /* decrease gain in noisy condition */ + gain_plt += ( ( 1.0f - gain_plt ) * gain_factor ); + + /* filtering by H0(z) = harmonic filter */ + filt_plt( ptr_sig_in, ptr_y_up, ptr_sig_pst0, gain_plt, L_subfr ); + } + + return; +} + +/*---------------------------------------------------------------------------- + * search_del() + * + * Computes best (shortest) integer LTP delay + fine search + *---------------------------------------------------------------------------*/ + +static void search_del( + const int16_t t0, /* i : pitch delay given by coder */ + const float *ptr_sig_in, /* i : input signal (with delay line) */ + int16_t *ltpdel, /* o : delay = *ltpdel - *phase / f_up */ + int16_t *phase, /* o : phase */ + float *num_gltp, /* o : numerator of LTP gain */ + float *den_gltp, /* o : denominator of LTP gain */ + float *y_up, /* o : LT delayed signal if fract. delay*/ + int16_t *off_yup, /* o : offset in y_up */ + const int16_t L_subfr /* i : sub-frame length */ +) +{ + const float *ptr_h; + float tab_den0[F_UP_PST - 1], tab_den1[F_UP_PST - 1]; + float *ptr_den0, *ptr_den1; + const float *ptr_sig_past, *ptr_sig_past0; + const float *ptr1; + int16_t i, n, ioff, i_max; + float ener, num, numsq, den0, den1; + float den_int, num_int; + float den_max, num_max, numsq_max; + int16_t phi_max; + int16_t lambda, phi; + float temp0, temp1; + float *ptr_y_up; + + /*------------------------------------- + * Computes energy of current signal + *-------------------------------------*/ + + ener = 0.0f; + for ( i = 0; i < L_subfr; i++ ) + { + ener += ptr_sig_in[i] * ptr_sig_in[i]; + } + + if ( ener < 0.1f ) + { + *num_gltp = 0.0f; + *den_gltp = 1.0f; + *ltpdel = 0; + *phase = 0; + + return; + } + + /*------------------------------------- + * Selects best of 3 integer delays + * Maximum of 3 numerators around t0 + *-------------------------------------*/ + + lambda = t0 - 1; + ptr_sig_past = ptr_sig_in - lambda; + num_int = -1.0e30f; + i_max = 0; + + for ( i = 0; i < 3; i++ ) + { + num = 0.0f; + for ( n = 0; n < L_subfr; n++ ) + { + num += ptr_sig_in[n] * ptr_sig_past[n]; + } + if ( num > num_int ) + { + i_max = i; + num_int = num; + } + ptr_sig_past--; + } + + if ( num_int <= 0.0f ) + { + *num_gltp = 0.0f; + *den_gltp = 1.0f; + *ltpdel = 0; + *phase = 0; + + return; + } + + /* Calculates denominator for i_max */ + lambda += i_max; + ptr_sig_past = ptr_sig_in - lambda; + den_int = (float) 0.; + for ( n = 0; n < L_subfr; n++ ) + { + den_int += ptr_sig_past[n] * ptr_sig_past[n]; + } + + if ( den_int < (float) 0.1 ) + { + *num_gltp = (float) 0.; + *den_gltp = (float) 1.; + *ltpdel = 0; + *phase = 0; + return; + } + + /*---------------------------------- + * Select best phase around lambda + * Compute y_up & denominators + *----------------------------------*/ + + ptr_y_up = y_up; + den_max = den_int; + ptr_den0 = tab_den0; + ptr_den1 = tab_den1; + ptr_h = tab_hup_s; + ptr_sig_past0 = ptr_sig_in + LH_UP_S - 1 - lambda; /* points on lambda_max+1 */ + + /* loop on phase */ + for ( phi = 1; phi < F_UP_PST; phi++ ) + { + /* Computes criterion for (lambda+1) - phi/F_UP_PST */ + /* and lambda - phi/F_UP_PST */ + ptr_sig_past = ptr_sig_past0; + /* computes y_up[n] */ + for ( n = 0; n <= L_subfr; n++ ) + { + ptr1 = ptr_sig_past++; + temp0 = (float) 0.; + for ( i = 0; i < LH2_S; i++ ) + { + temp0 += ptr_h[i] * ptr1[-i]; + } + ptr_y_up[n] = temp0; + } + + /* compute den0 (lambda+1) and den1 (lambda) */ + /* part common to den0 and den1 */ + temp0 = (float) 0.; + for ( n = 1; n < L_subfr; n++ ) + { + temp0 += ptr_y_up[n] * ptr_y_up[n]; + } + + /* den0 */ + den0 = temp0 + ptr_y_up[0] * ptr_y_up[0]; + *ptr_den0++ = den0; + + /* den1 */ + den1 = temp0 + ptr_y_up[L_subfr] * ptr_y_up[L_subfr]; + *ptr_den1++ = den1; + if ( fabs( ptr_y_up[0] ) > fabs( ptr_y_up[L_subfr] ) ) + { + if ( den0 > den_max ) + { + den_max = den0; + } + } + else + { + if ( den1 > den_max ) + { + den_max = den1; + } + } + ptr_y_up += ( L_subfr + 1 ); + ptr_h += LH2_S; + } + if ( den_max < 0.1f ) + { + *num_gltp = 0.0f; + *den_gltp = 1.0f; + *ltpdel = 0; + *phase = 0; + return; + } + + /* Computation of the numerators */ + /* and selection of best num*num/den */ + /* for non null phases */ + + /* Initialize with null phase */ + num_max = num_int; + den_max = den_int; + numsq_max = num_max * num_max; + phi_max = 0; + ioff = 1; + + ptr_den0 = tab_den0; + ptr_den1 = tab_den1; + ptr_y_up = y_up; + + /* if den_max = 0 : will be selected and declared unvoiced */ + /* if num!=0 & den=0 : will be selected and declared unvoiced */ + /* degenerated seldom cases, switch off LT is OK */ + + /* Loop on phase */ + for ( phi = 1; phi < F_UP_PST; phi++ ) + { + + /* computes num for lambda+1 - phi/F_UP_PST */ + num = 0.0f; + for ( n = 0; n < L_subfr; n++ ) + { + num += ptr_sig_in[n] * ptr_y_up[n]; + } + if ( num < 0.0f ) + { + num = 0.0f; + } + numsq = num * num; + + /* selection if num/sqrt(den0) max */ + den0 = *ptr_den0++; + temp0 = numsq * den_max; + temp1 = numsq_max * den0; + if ( temp0 > temp1 ) + { + num_max = num; + numsq_max = numsq; + den_max = den0; + ioff = 0; + phi_max = phi; + } + + /* computes num for lambda_max - phi/F_UP_PST */ + ptr_y_up++; + num = (float) 0.; + for ( n = 0; n < L_subfr; n++ ) + { + num += ptr_sig_in[n] * ptr_y_up[n]; + } + if ( num < (float) 0. ) + { + num = (float) 0.; + } + numsq = num * num; + + /* selection if num/sqrt(den1) max */ + den1 = *ptr_den1++; + temp0 = numsq * den_max; + temp1 = numsq_max * den1; + if ( temp0 > temp1 ) + { + num_max = num; + numsq_max = numsq; + den_max = den1; + ioff = 1; + phi_max = phi; + } + ptr_y_up += L_subfr; + } + + /*--------------------------------------------------- + * test if normalized crit0[iopt] > THRESHCRIT + *--------------------------------------------------*/ + + if ( ( num_max == 0.0f ) || ( den_max <= 0.1f ) ) + { + *num_gltp = 0.0f; + *den_gltp = 1.0f; + *ltpdel = 0; + *phase = 0; + return; + } + + /* comparison num * num */ + /* with ener * den x THRESCRIT */ + temp1 = den_max * ener * THRESCRIT; + if ( numsq_max >= temp1 ) + { + *ltpdel = lambda + 1 - ioff; + *off_yup = ioff; + *phase = phi_max; + *num_gltp = num_max; + *den_gltp = den_max; + } + else + { + *num_gltp = 0.0f; + *den_gltp = 1.0f; + *ltpdel = 0; + *phase = 0; + } + + return; +} + +/*---------------------------------------------------------------------------- + * filt_plt() + * + * Perform long term postfilter + *----------------------------------------------------------------------------*/ + +static void filt_plt( + const float *s_in, /* i : input signal with past */ + const float *s_ltp, /* i : filtered signal with gain 1 */ + float *s_out, /* o : output signal */ + const float gain_plt, /* i : filter gain */ + const int16_t L_subfr /* i : the length of subframe */ +) +{ + int16_t n; + float gain_plt_1; + + gain_plt_1 = (float) 1. - gain_plt; + + for ( n = 0; n < L_subfr; n++ ) + { + s_out[n] = gain_plt * s_in[n] + gain_plt_1 * s_ltp[n]; + } + + return; +} + +/*---------------------------------------------------------------------------- + * compute_ltp_l() + * + * compute delayed signal, num & den of gain for fractional delay + * with long interpolation filter + *----------------------------------------------------------------------------*/ + +static void compute_ltp_l( + const float *s_in, /* i : input signal with past */ + const int16_t ltpdel, /* i : delay factor */ + const int16_t phase, /* i : phase factor */ + float *y_up, /* o : delayed signal */ + float *num, /* o : numerator of LTP gain */ + float *den, /* o : denominator of LTP gain */ + const int16_t L_subfr /* i : the length of subframe */ +) +{ + const float *ptr_h; + int16_t n, i; + const float *ptr2; + float temp; + + /* Filtering with long filter */ + ptr_h = tab_hup_l + ( phase - 1 ) * LH2_L; + ptr2 = s_in - ltpdel + LH_UP_L; + + /* Compute y_up */ + for ( n = 0; n < L_subfr; n++ ) + { + temp = 0.0f; + for ( i = 0; i < LH2_L; i++ ) + { + temp += ptr_h[i] * *ptr2--; + } + y_up[n] = temp; + ptr2 += LH2_L_P1; + } + + /* Compute num */ + *num = 0.0f; + for ( n = 0; n < L_subfr; n++ ) + { + *num += y_up[n] * s_in[n]; + } + + if ( *num < 0.0f ) + { + *num = 0.0f; + } + + /* Compute den */ + *den = 0.0f; + for ( n = 0; n < L_subfr; n++ ) + { + *den += y_up[n] * y_up[n]; + } + + return; +} + +/*---------------------------------------------------------------------------- + * select_ltp() + * + * selects best of (gain1, gain2) + * with gain1 = num1 * 2** sh_num1 / den1 * 2** sh_den1 + * and gain2 = num2 * 2** sh_num2 / den2 * 2** sh_den2 + *----------------------------------------------------------------------------*/ + +/*! r: 1 = 1st gain, 2 = 2nd gain */ +static int16_t select_ltp( + const float num1, /* i : numerator of gain1 */ + const float den1, /* i : denominator of gain1 */ + const float num2, /* i : numerator of gain2 */ + const float den2 /* i : denominator of gain2 */ +) +{ + if ( den2 == (float) 0. ) + { + return ( 1 ); + } + + if ( num2 * num2 * den1 > num1 * num1 * den2 ) + { + return ( 2 ); + } + else + { + return ( 1 ); + } +} + + +/*------------------------------------------------------------------------------------ + * modify_pst_param() + * + * Modify gamma1 and gamma2 values in function of the long-term noise level + *-----------------------------------------------------------------------------------*/ + +static void modify_pst_param( + const float psf_lp_noise, /* i : Long term noise energy */ + float *g1, /* o : Gamma1 used in post filter */ + float *g2, /* o : Gamma2 used in post filter */ + const int16_t coder_type, /* i : coder type */ + float *gain_factor /* o : Gain factor applied in post filtering */ +) +{ + float ftmp; + + if ( coder_type != INACTIVE && psf_lp_noise < LP_NOISE_THR ) + { + ftmp = psf_lp_noise * BG1 + CG1; + if ( ftmp > POST_G1 ) + { + ftmp = POST_G1; + } + else if ( ftmp < POST_G1_MIN ) + { + ftmp = POST_G1_MIN; + } + *g1 = ftmp; + + ftmp = psf_lp_noise * BG2 + CG2; + if ( ftmp > POST_G2 ) + { + ftmp = POST_G2; + } + else if ( ftmp < POST_G2_MIN ) + { + ftmp = POST_G2_MIN; + } + *g2 = ftmp; + } + else + { + *g1 = POST_G1_NOIS; + *g2 = POST_G2_NOIS; + } + + /* Set gain_factor of the harmonic filtering */ + ftmp = ( psf_lp_noise - K_LP_NOISE ) * C_LP_NOISE; + + if ( ftmp >= 0.25f ) + { + /* the noise is really high */ + *gain_factor = 0.25f; + } + else if ( ftmp < 0 ) + { + *gain_factor = 0.0f; + } + else + { + *gain_factor = ftmp; + } + + return; +} diff --git a/lib_dec/dec_ppp.c b/lib_dec/dec_ppp.c new file mode 100644 index 0000000000000000000000000000000000000000..aa20b31943c4de164013c7b54a51f0859451d14b --- /dev/null +++ b/lib_dec/dec_ppp.c @@ -0,0 +1,108 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "prot.h" +#include "wmc_auto.h" + +/*------------------------------------------------------------------- + * decod_ppp() + * + * PPP decoder + *-------------------------------------------------------------------*/ + +ivas_error decod_ppp( + Decoder_State *st, /* i/o: state structure */ + const float Aq[], /* i : 12k8 Lp coefficient */ + float *pitch_buf, /* i/o: floating pitch values for each subframe */ + float *exc, /* i/o: current non-enhanced excitation */ + float *exc2, /* i/o: current enhanced excitation */ + float *voice_factors, /* o : voicing factors */ + float *bwe_exc, /* o : excitation for SWB TBE */ + float *gain_buf, /* o : floating pitch gain for each subframe */ + const int16_t bfi /* i : BFI flag */ +) +{ + int16_t k; + float p_Aq_old[M + 1], excQ_ppp[L_FRAME], p_Aq_curr[M], LPC_de_old[M + 1]; + float LPC_de_curr[M + 1], pitch[NB_SUBFR]; + ivas_error error; + + error = IVAS_ERR_OK; + + /* call voiced decoder at this point */ + for ( k = 0; k < M; k++ ) + { + p_Aq_curr[k] = Aq[k + ( 3 * ( M + 1 ) ) + 1]; + } + + lsp2a_stab( st->lsp_old, p_Aq_old, M ); + + deemph_lpc( p_Aq_curr, p_Aq_old, LPC_de_curr, LPC_de_old, 0 ); + + /* last frame-end lpc and curr frame-end lpc */ + if ( ( error = ppp_voiced_decoder( st, excQ_ppp, LPC_de_curr, exc, pitch, bfi ) ) != IVAS_ERR_OK ) + { + return error; + } + + + st->tilt_code = st->prev_tilt_code_dec; + + mvr2r( excQ_ppp, exc, L_FRAME ); + mvr2r( exc, exc2, L_FRAME ); + + st->dispMem[0] = 2; + st->dispMem[2] = st->prev_gain_pit_dec; + + for ( k = 3; k < 7; k++ ) + { + st->dispMem[k] = st->dispMem[k - 1]; + } + + mvr2r( pitch, pitch_buf, NB_SUBFR ); + + if ( st->hBWE_TD != NULL ) + { + interp_code_5over2( exc2, bwe_exc, L_FRAME ); + } + set_f( voice_factors, 0.0f, NB_SUBFR16k ); + set_f( gain_buf, 0, NB_SUBFR16k ); + + return error; +} diff --git a/lib_dec/dec_prm.c b/lib_dec/dec_prm.c new file mode 100644 index 0000000000000000000000000000000000000000..347abd25e5423b4c83bd79fa9af5b4e3728c9cd1 --- /dev/null +++ b/lib_dec/dec_prm.c @@ -0,0 +1,1112 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include "options.h" +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "wmc_auto.h" + + +/*-------------------------------------------------------------------* + * getTCXMode() + * + * get TCX mode + *--------------------------------------------------------------------*/ + +void getTCXMode( + Decoder_State *st, /* i/o: decoder memory state */ + Decoder_State *st0, /* i : bitstream */ + const int16_t MCT_flag /* i : hMCT handle allocated (1) or not (0) */ +) +{ + uint16_t ind; + + if ( st->tcxonly ) + { + /* get core */ + ind = get_next_indice( st0, 1 ); + st->core = ind + TCX_20_CORE; + + /* get class */ + ind = get_next_indice( st0, 2 ); + + st->clas_dec = ONSET; + if ( ind == 0 ) + { + st->clas_dec = UNVOICED_CLAS; + } + else if ( ind == 1 ) + { + if ( st->last_good >= VOICED_TRANSITION ) + { + st->clas_dec = VOICED_TRANSITION; + } + else + { + st->clas_dec = UNVOICED_TRANSITION; + } + } + else if ( ind == 2 ) + { + st->clas_dec = VOICED_CLAS; + } + + st->coder_type = INACTIVE; + if ( st->element_mode == IVAS_CPE_MDCT && !MCT_flag ) + { + st->VAD = get_next_indice( st0, 1 ); + } + else + { + st->VAD = 0; + } + } + else + { + if ( st->mdct_sw == MODE1 ) + { + /* 2 bits instead of 3 as TCX is already signaled */ + st->core = TCX_20_CORE; + st->hTcxCfg->coder_type = get_next_indice( st0, 2 ); + st->coder_type = st->hTcxCfg->coder_type; + } + else + { + if ( st->mdct_sw_enable == MODE2 ) + { + if ( get_next_indice_1( st0 ) ) /* TCX */ + { + ind = get_next_indice( st0, 3 ); + assert( !( ind & 4 ) || !"HQ_CORE encountered in dec_prm" ); + st->core = TCX_20_CORE; + st->hTcxCfg->coder_type = ind; + st->coder_type = st->hTcxCfg->coder_type; + } + else /* ACELP */ + { + st->core = ACELP_CORE; + st->coder_type = get_next_indice( st0, 2 ); + } + } + else + { + if ( st->rf_flag == 1 ) + { + if ( !st->use_partial_copy ) + { + ind = get_next_indice( st0, 1 ); + if ( ind == 0 ) + { + st->core = ACELP_CORE; + } + else + { + st->core = TCX_20_CORE; + st->hTcxCfg->coder_type = st->coder_type; + } + } + } + else + { + ind = get_next_indice( st, 3 ); + if ( ind < ACELP_MODE_MAX ) + { + st->core = ACELP_CORE; + st->coder_type = ind; + } + else + { + st->core = TCX_20_CORE; + st->hTcxCfg->coder_type = ind - ACELP_MODE_MAX; + st->coder_type = st->hTcxCfg->coder_type; + } + } + } + } + + if ( st->element_mode == EVS_MONO ) + { + if ( st->igf && st->core == ACELP_CORE ) + { + st->bits_frame_core -= get_tbe_bits( st->total_brate, st->bwidth, st->rf_flag ); + } + + if ( st->rf_flag ) + { + st->bits_frame_core -= ( st->rf_target_bits + 1 ); /* +1 as flag-bit not considered in rf_target_bits */ + } + } + + /* Inactive frame detection on non-DTX mode */ + if ( st->coder_type == INACTIVE ) + { + st->VAD = 0; + } + else + { + st->VAD = 1; + } + } + + /*Core extended mode mapping for correct PLC classification*/ + st->core_ext_mode = st->coder_type; + if ( st->coder_type == INACTIVE ) + { + st->core_ext_mode = UNVOICED; + } + + return; +} + + +/*-------------------------------------------------------------------* + * getTCXWindowing() + * + * get TCX transform type for each subframe + *--------------------------------------------------------------------*/ + +void getTCXWindowing( + const int16_t core, /* i : current core */ + const int16_t last_core, /* i : last frame core */ + const int16_t element_mode, /* i : element mode */ + TCX_CONFIG_HANDLE hTcxCfg, /* i/o: TCX configuration handle */ + Decoder_State *st0 /* i : bitstream */ +) +{ + int16_t overlap_code; + + /* Set the last overlap mode based on the previous and current frame type and coded overlap mode */ + if ( last_core == ACELP_CORE || last_core == AMR_WB_CORE ) + { + hTcxCfg->tcx_last_overlap_mode = TRANSITION_OVERLAP; + } + else if ( core == TCX_10_CORE && hTcxCfg->tcx_curr_overlap_mode == ALDO_WINDOW ) + { + hTcxCfg->tcx_last_overlap_mode = FULL_OVERLAP; + } + else if ( core != TCX_10_CORE && hTcxCfg->tcx_curr_overlap_mode == FULL_OVERLAP ) + { + hTcxCfg->tcx_last_overlap_mode = ALDO_WINDOW; + } + else + { + hTcxCfg->tcx_last_overlap_mode = hTcxCfg->tcx_curr_overlap_mode; + } + + /* Set the current overlap mode based on the current frame type and coded overlap mode */ + hTcxCfg->tcx_curr_overlap_mode = ALDO_WINDOW; + + if ( core != ACELP_CORE ) + { + overlap_code = 0; + if ( get_next_indice( st0, 1 ) ) + { + overlap_code = 2 + get_next_indice( st0, 1 ); + } + + assert( MIN_OVERLAP == 2 && HALF_OVERLAP == 3 ); + hTcxCfg->tcx_curr_overlap_mode = overlap_code; + + /*TCX10 : always symmetric windows*/ + if ( core == TCX_20_CORE && overlap_code == 0 && last_core != ACELP_CORE && last_core != AMR_WB_CORE ) + { + hTcxCfg->tcx_curr_overlap_mode = ALDO_WINDOW; + } + } + + if ( element_mode != EVS_MONO && core == TCX_10_CORE ) + { + /* also read last overlap */ + overlap_code = 0; + + if ( get_next_indice( st0, 1 ) ) + { + overlap_code = 2 + get_next_indice( st0, 1 ); + } + + hTcxCfg->tcx_last_overlap_mode = overlap_code; + } + + return; +} + + +/*-------------------------------------------------------------------* + * getLPCparam() + * + * get LPC parameters + *--------------------------------------------------------------------*/ + +void getLPCparam( + Decoder_State *st, /* i/o: decoder memory state */ + int16_t param_lpc[], /* o : LTP parameters */ + Decoder_State *st0, /* i : bitstream */ + const int16_t ch, /* i : channel */ + const int16_t sns_low_br_mode /* i : SNS low-bitrate mode */ +) +{ + if ( st->use_partial_copy == 0 ) + { + /* Number of sets of LPC parameters (does not include mid-lpc) */ + if ( st->tcxonly == 0 || st->core < TCX_10_CORE ) + { + st->numlpc = 1; + } + else + { + st->numlpc = 2; + } + + /* Decode LPC parameters */ + if ( st->hTcxDec->enableTcxLpc && st->core != ACELP_CORE ) + { + int16_t tcx_lpc_cdk; + tcx_lpc_cdk = tcxlpc_get_cdk( st->coder_type ); + dec_lsf_tcxlpc( st0, ¶m_lpc, st->narrowBand, tcx_lpc_cdk ); + } + else + { + if ( st->lpcQuantization == 0 ) + { + decode_lpc_avq( st0, st->numlpc, param_lpc, ch, st->element_mode, sns_low_br_mode ); + } + else if ( st->lpcQuantization == 1 ) + { + if ( st->sr_core == INT_FS_16k && st->coder_type == VOICED && st->core == ACELP_CORE ) + { + assert( st->element_mode == EVS_MONO ); + + lsf_bctcvq_decprm( st0, param_lpc ); + } + else + { + lsf_msvq_ma_decprm( st0, param_lpc ); + } + } + else + { + assert( 0 ); + } + } + } + else + { + st->numlpc = 1; + + if ( st->rf_frame_type == RF_TCXFD ) + { + param_lpc[0] = 0; + param_lpc[1] = get_next_indice( st0, lsf_numbits[0] ); /* VQ 1 */ + param_lpc[2] = get_next_indice( st0, lsf_numbits[1] ); /* VQ 2 */ + param_lpc[3] = get_next_indice( st0, lsf_numbits[2] ); /* VQ 3 */ + } + else if ( st->rf_frame_type >= RF_ALLPRED && st->rf_frame_type <= RF_NELP ) + { + /* LSF indices */ + param_lpc[0] = get_next_indice( st0, 8 ); /* VQ 1 */ + param_lpc[1] = get_next_indice( st0, 8 ); /* VQ 2 */ + } + } + + return; +} + +/*-------------------------------------------------------------------* + * getTCXparam() + * + * get TCX core parameters + *-------------------------------------------------------------------*/ + +void getTCXparam( + Decoder_State *st, /* i/o: Decoder State handle */ + Decoder_State *st0, /* i : bitstream */ + CONTEXT_HM_CONFIG hm_cfg, /* i/o: HM config */ + int16_t param[], /* o : decoded parameters */ + const int16_t bits_common, /* i : number of common bits */ + const int16_t start_bit_pos, /* i : position of the start bit */ + const int16_t *no_param_tns, /* i : number of TNS parameters per subframe */ + int16_t p_param[2], /* o : pointer to parameters for next round of bs reading*/ + int16_t nTnsBitsTCX10[2], + const int16_t pre_past_flag ) +{ + int16_t ix, j, k, core, last_core, nSubframes; + int16_t lg, lgFB, flag_ctx_hm, hm_size; + int16_t PeriodicityIndex, useHarmonicModel; + int16_t tcxltp_prm_0, tcxltp_prm_1, tcxltp_prm_2, nbits_igf, nbits_tcx; + int16_t *prm, *prms; + int16_t nTnsParams, nTnsBits; + int16_t pre_part, post_part; + TCX_LTP_DEC_HANDLE hTcxLtpDec = st->hTcxLtpDec; + TCX_DEC_HANDLE hTcxDec = st->hTcxDec; + + + if ( pre_past_flag == 0 ) + { + pre_part = 1; + post_part = 0; + } + else if ( pre_past_flag == 1 ) + { + pre_part = 0; + post_part = 1; + } + else + { + pre_part = 1; + post_part = 1; + } + + /* initialization */ + tcxltp_prm_0 = 0; + tcxltp_prm_1 = 0; + tcxltp_prm_2 = 0; + nbits_igf = 0; + + PeriodicityIndex = 0; + useHarmonicModel = 0; + + core = st->core; + last_core = st->last_core; + + nSubframes = 1; + if ( core == TCX_10_CORE ) + { + nSubframes = 2; + } + + if ( st->element_mode < IVAS_CPE_MDCT && st->igf && core == TCX_10_CORE ) + { + /* get IGF */ + for ( k = 0; k < nSubframes; k++ ) + { + ix = st->next_bit_pos; + + IGFDecReadLevel( st->hIGFDec, st0, IGF_GRID_LB_SHORT, 1 - k ); + + IGFDecReadData( st->hIGFDec, st0, IGF_GRID_LB_SHORT, 1 - k ); + + IGFDecStoreTCX10SubFrameData( st->hIGFDec, k ); + + nbits_igf += st0->next_bit_pos - ix; + } + } + + /* loop over subframes */ + for ( k = 0; k < nSubframes; k++ ) + { + flag_ctx_hm = 0; + + prm = param + ( k * DEC_NPRM_DIV ); + j = 0; + + nbits_tcx = st0->next_bit_pos - start_bit_pos; + + if ( pre_part && st->enablePlcWaveadjust && k == ( nSubframes - 1 ) ) + { + st->tonality_flag = get_next_indice( st0, 1 ); + } + + if ( post_part ) + { + /* TCX Gain */ + prm[j++] = get_next_indice( st0, NBITS_TCX_GAIN ); + + /* TCX Noise Filling = NBITS_NOISE_FILL_LEVEL bits */ + prm[j++] = get_next_indice( st0, NBITS_NOISE_FILL_LEVEL ); + } + else + { + j += 1 + NOISE_FILL_RANGES; + } + + /* LTP data */ + if ( pre_part ) + { + if ( ( k == 0 ) && ( hTcxLtpDec->tcxltp || ( st->sr_core > 25600 ) ) ) /* PLC pitch info for HB */ + { + prm[j] = get_next_indice( st0, 1 ); + + if ( prm[j] ) + { + prm[j + 1] = get_next_indice( st0, 9 ); + prm[j + 2] = get_next_indice( st0, 2 ); + + tcxltp_prm_0 = prm[j]; + tcxltp_prm_1 = prm[j + 1]; + tcxltp_prm_2 = prm[j + 2]; + } + st->BER_detect = st->BER_detect | tcx_ltp_decode_params( &prm[j], &( hTcxLtpDec->tcxltp_pitch_int ), &( hTcxLtpDec->tcxltp_pitch_fr ), &( hTcxLtpDec->tcxltp_gain ), st->pit_min, st->pit_fr1, st->pit_fr2, st->pit_max, st->pit_res_max ); + + hTcxDec->tcxltp_last_gain_unmodified = hTcxLtpDec->tcxltp_gain; + + if ( core == TCX_20_CORE && !st->tcxonly && hTcxLtpDec->tcxltp_pitch_int < st->L_frame ) + { + hTcxDec->tcx_hm_LtpPitchLag = ( ( 2 * st->L_frame * st->pit_res_max ) << kLtpHmFractionalResolution ) / ( hTcxLtpDec->tcxltp_pitch_int * st->pit_res_max + hTcxLtpDec->tcxltp_pitch_fr ); + } + else + { + hTcxDec->tcx_hm_LtpPitchLag = -1; + } + j += 3; + } + else + { + prm[j++] = tcxltp_prm_0; + prm[j++] = tcxltp_prm_1; + prm[j++] = tcxltp_prm_2; + } + } + + /* TCX spectral data */ + lg = st->L_frame >> ( nSubframes - 1 ); + lgFB = st->hTcxCfg->tcx_coded_lines >> ( nSubframes - 1 ); + + if ( post_part && k == 0 && st->last_core_from_bs == ACELP_CORE ) + { + /* ACE->TCX transition */ + lg += st->hTcxCfg->tcx_offset; + lgFB += lgFB >> ( 3 - nSubframes ); + + if ( st->hTcxCfg->lfacNext < 0 ) + { + lg -= st->hTcxCfg->lfacNext; + } + } + + if ( pre_part ) + { + /* TNS data */ + nTnsParams = 0; + nTnsBits = 0; + + if ( st->hTcxCfg->fIsTNSAllowed ) + { + if ( core == TCX_10_CORE && last_core == ACELP_CORE && k == 0 ) + { + st0->BER_detect = 1; + last_core = TCX_20_CORE; + } + + SetTnsConfig( st->hTcxCfg, core == TCX_20_CORE, ( st->last_core_from_bs == ACELP_CORE ) && ( k == 0 ) ); + ix = 0; + if ( no_param_tns ) + { + ix = get_next_indice( st0, 1 ); /* common_tns_data[] for subframe k */ + } + if ( ix ) + { + prm[j] = no_param_tns[k] * -1; /* - signals common TNS and its size */ + nTnsParams = no_param_tns[k]; + } + else + { + ReadTnsData( st->hTcxCfg->pCurrentTnsConfig, st0, &nTnsBits, prm + j, &nTnsParams ); + } + hTcxDec->tnsActive[k] = ( prm[j] != 0 ? 1 : 0 ) * nTnsParams; + if ( nTnsBitsTCX10 != NULL ) + { + nTnsBitsTCX10[k] = nTnsBits + ( no_param_tns ? 1 : 0 ); + } + + j += nTnsParams; + } + + if ( post_part ) + { + if ( core == TCX_20_CORE ) + { + hm_size = (int16_t) ( 2.0f * st->TcxBandwidth * (float) lg ); + + if ( hTcxDec->tcx_lpc_shaped_ari && st->last_core_from_bs != ACELP_CORE ) + { + dec_prm_hm( st0, &prm[j], hm_size ); + } + + nbits_tcx = st->bits_frame_core - ( st0->next_bit_pos - start_bit_pos ); + } + else + { + hm_size = (int16_t) ( 2.0f * st->TcxBandwidth * (float) lgFB ); + + nbits_tcx = ( ( st->bits_frame_core - bits_common - nbits_igf + 1 - k ) >> 1 ) - ( ( st0->next_bit_pos - start_bit_pos ) - nbits_tcx ); + } + + /*Context HM flag*/ + if ( st->hTcxCfg->ctx_hm && !( st->last_core_from_bs == ACELP_CORE && k == 0 ) ) + { + useHarmonicModel = get_next_indice( st0, 1 ); + prm[j] = useHarmonicModel; + nbits_tcx--; + + if ( useHarmonicModel ) + { + ix = DecodeIndex( st0, hm_size >= 256, prm + j + 1 ); + flag_ctx_hm = 1; + + PeriodicityIndex = *( prm + j + 1 ); + if ( st->element_mode == EVS_MONO ) + { + ConfigureContextHm( lgFB, nbits_tcx, PeriodicityIndex, hTcxDec->tcx_hm_LtpPitchLag, &hm_cfg ); + } + nbits_tcx -= ix; + } + } + } + j += NPRM_CTX_HM; + + /* read IGF payload */ + if ( post_part && core == TCX_20_CORE ) + { + if ( st->igf ) + { + ix = st->next_bit_pos; + IGFDecReadLevel( st->hIGFDec, st0, ( st->last_core_from_bs == ACELP_CORE ) ? IGF_GRID_LB_TRAN : IGF_GRID_LB_NORM, 1 ); + + IGFDecReadData( st->hIGFDec, st0, ( st->last_core_from_bs == ACELP_CORE ) ? IGF_GRID_LB_TRAN : IGF_GRID_LB_NORM, 1 ); + + nbits_tcx -= ( st0->next_bit_pos - ix ); + } + nbits_tcx = st->bits_frame_core - ( st0->next_bit_pos - start_bit_pos ); + } + else if ( p_param != NULL ) + { + p_param[k] = j; + } + } + else + { + j = p_param[k]; + + nbits_tcx = st->bits_frame_channel; + if ( st->core == TCX_10_CORE ) + { + nbits_tcx = nTnsBitsTCX10[k] - NBITS_TCX_GAIN - NOISE_FILL_RANGES * NBITS_NOISE_FILL_LEVEL; + } + } + + if ( post_part ) + { + if ( hTcxDec->tcx_lpc_shaped_ari && core == TCX_20_CORE ) + { + prm[j++] = nbits_tcx; /* store length of buffer */ + prms = &prm[j]; + for ( ix = 0; ix < nbits_tcx; ix++ ) + { + prms[ix] = get_next_indice_1( st0 ); + } + for ( ix = 0; ix < 32; ix++ ) + { + prms[ix + nbits_tcx] = 1; + } + j += nbits_tcx; + } + else + { + if ( st->element_mode > EVS_MONO ) + { + if ( useHarmonicModel ) + { + ConfigureContextHm( lgFB, nbits_tcx, PeriodicityIndex, hTcxDec->tcx_hm_LtpPitchLag, &hm_cfg ); + } + hTcxDec->resQBits[k] = RCcontextMapping_decode2_no_mem_s17_LCS( st0, prm + j, lgFB, nbits_tcx, NPRM_RESQ * st->hTcxCfg->resq, flag_ctx_hm ? &hm_cfg : NULL ); + } + else + { + hTcxDec->resQBits[k] = ACcontextMapping_decode2_no_mem_s17_LC( st0, prm + j, lgFB, nbits_tcx, NPRM_RESQ * st->hTcxCfg->resq, flag_ctx_hm ? &hm_cfg : NULL ); + } + } + } + } + + return; +} + + +/*-----------------------------------------------------------------* + * dec_prm_hm() + * + * + *-----------------------------------------------------------------*/ + +void dec_prm_hm( + Decoder_State *st, + int16_t *prm_hm, + const int16_t hm_size ) +{ + /* Disable HM for non-GC,VC modes */ + if ( st->hTcxCfg->coder_type != VOICED && st->hTcxCfg->coder_type != GENERIC ) + { + prm_hm[0] = 0; + + return; + } + + prm_hm[1] = -1; + prm_hm[2] = 0; + + /* Flag */ + prm_hm[0] = get_next_indice( st, 1 ); + + if ( prm_hm[0] ) + { + /* Periodicity index */ + DecodeIndex( st, hm_size >= 256, &prm_hm[1] ); + + /* Gain index */ + if ( st->hTcxCfg->coder_type == VOICED ) + { + prm_hm[2] = get_next_indice( st, kTcxHmNumGainBits ); + } + } + + return; +} + + +/*-----------------------------------------------------------------* + * Function dec_prm() * + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * + * + * SQ is used for TCX modes + * + * decode parameters according to selected mode * + *-----------------------------------------------------------------*/ + +void dec_prm( + Decoder_State *st, /* i/o: decoder memory state */ + int16_t param[], /* o : decoded parameters */ + int16_t param_lpc[], /* o : LPC parameters */ + int16_t *total_nbbits, /* i/o: number of bits / decoded bits */ + int16_t *bitsRead ) +{ + int16_t j, n, sfr, core, nb_subfr; + int16_t *prm; + int16_t start_bit_pos, bits_common, acelp_target_bits; + int16_t ix, j_old, wordcnt, bitcnt; + CONTEXT_HM_CONFIG hm_cfg; + int16_t indexBuffer[N_MAX + 1]; + int16_t ind; + int16_t ltp_mode, gains_mode; + int16_t prm_ltp[LTPSIZE]; + TCX_LTP_DEC_HANDLE hTcxLtpDec = st->hTcxLtpDec; + TCX_DEC_HANDLE hTcxDec = st->hTcxDec; + + /*--------------------------------------------------------------------------------* + * INIT + *--------------------------------------------------------------------------------*/ + + hm_cfg.indexBuffer = indexBuffer; + + core = st->core; + + if ( st->mdct_sw == MODE1 ) + { + start_bit_pos = 0; /* count from frame start */ + + /* Adjust st->bits_frame_core not to subtract MODE2 bandwidth signaling */ + for ( n = 0; n < FRAME_SIZE_NB; n++ ) + { + if ( FrameSizeConfig[n].frame_bits == st->total_brate / FRAMES_PER_SEC ) + { + st->bits_frame_core += FrameSizeConfig[n].bandwidth_bits; + break; + } + } + } + else + { + if ( st->rf_flag == 1 ) + { + /*Inherent adjustment to accommodate the compact packing used in the RF mode*/ + start_bit_pos = st->next_bit_pos - 2; + } + else + { + start_bit_pos = st->next_bit_pos; + } + } + + /* Framing parameters */ + nb_subfr = st->nb_subfr; + + /* Initialize pointers */ + prm = param; + + /* Init counters */ + j = 0; + + /* Init LTP data */ + if ( hTcxDec != NULL ) + { + hTcxDec->tcx_hm_LtpPitchLag = -1; + hTcxLtpDec->tcxltp_gain = 0.0f; + } + + /*--------------------------------------------------------------------------------* + * core-coder header + *--------------------------------------------------------------------------------*/ + + /* Modes (ACE_GC, ACE_UC, TCX20, TCX10...) */ + getTCXMode( st, st, 0 /* <- MCT_flag */ ); + core = st->core; + + /* Decode last_core for error concealment */ + if ( !( core == ACELP_CORE && st->hTcxCfg->lfacNext <= 0 ) && !st->use_partial_copy ) + { + + st->last_core_from_bs = get_next_indice( st, 1 ); + /* + need to introduce special error handling for lost transition frames from CNG: + in such cases, the bitstream reader continues with CNG, setting bfi = 0, total_brate = 0 + this might result in a not matching last_core transmitted in the BS - we should use this + only for interpreting the bitstream and re-use the internal state for the proper + transition handling; still, for voiced onsets rather stick to wrong windowing... + */ + if ( ( !( ( st->last_total_brate == 0 ) && ( st->clas_dec != VOICED_CLAS ) ) ) && ( st->last_core_from_bs != st->last_core ) ) + { + st->last_core = st->last_core_from_bs; + } + + /*for TCX 10 force last_core to be TCX since ACELP as previous core is forbidden*/ + if ( core == TCX_10_CORE ) + { + st->last_core = TCX_20_CORE; + st->last_core_from_bs = TCX_20_CORE; + } + } + + if ( st->rf_flag && st->use_partial_copy && !st->tcxonly ) + { + int32_t nbits_total; + nbits_total = st->total_brate / FRAMES_PER_SEC; + st->bits_frame_core = st->rf_target_bits; + /* offset the indices to read the acelp partial copy */ + get_next_indice_tmp( st, (int16_t) ( start_bit_pos + nbits_total - st->rf_target_bits - 3 - st->next_bit_pos ) ); + } + + if ( !st->use_partial_copy ) + { + getTCXWindowing( st->core, st->last_core, st->element_mode, st->hTcxCfg, st ); + + if ( st->enableGplc ) /* SIDE INFO. DECODING */ + { + int16_t pitchDiff; + int16_t bits_per_subfr, search_range; + bits_per_subfr = 4; + search_range = 8; + st->flagGuidedAcelp = get_next_indice( st, 1 ); + + pitchDiff = 0; + if ( st->flagGuidedAcelp ) + { + pitchDiff = get_next_indice( st, bits_per_subfr ); + st->guidedT0 = ( pitchDiff - search_range ); + } + if ( pitchDiff == 0 && st->flagGuidedAcelp ) + { + st->flagGuidedAcelp = 0; + } + } + else + { + st->flagGuidedAcelp = 0; + } + + if ( st->dec_glr ) + { + if ( core == ACELP_CORE ) + { + st->dec_glr_idx = get_next_indice( st, G_LPC_RECOVERY_BITS ); + } + else + { + st->dec_glr_idx = -1; + } + } + } + + /*--------------------------------------------------------------------------------* + * LPC parameters + *--------------------------------------------------------------------------------*/ + + /*Initialization of LPC Mid flag*/ + if ( ( st->lpcQuantization == 1 && st->coder_type == VOICED ) || ( st->use_partial_copy ) ) + { + ( &( st->acelp_cfg ) )->midLpc = 0; + } + else + { + ( &( st->acelp_cfg ) )->midLpc = st->acelp_cfg.midLpc_enable; + } + + getLPCparam( st, param_lpc, st, -1, 0 ); + + bits_common = st->next_bit_pos - start_bit_pos; + + /*--------------------------------------------------------------------------------* + * ACELP parameters + *--------------------------------------------------------------------------------*/ + + if ( core == ACELP_CORE && st->use_partial_copy == 0 ) + { + int16_t tmp; + + /* Target Bits */ + + /* needed in decoder to read the bitstream */ + acelp_target_bits = st->bits_frame_core - bits_common; + + /* Configure ACELP */ + tmp = BITS_ALLOC_config_acelp( acelp_target_bits, st->coder_type, &( st->acelp_cfg ), st->narrowBand, st->nb_subfr ); + if ( tmp < 0 ) + { + /* erroneous configuration, resulting from a corrupt bitstream */ + st->BER_detect = 1; + } + + /* Adaptive BPF (2 bits)*/ + n = ACELP_BPF_BITS[st->acelp_cfg.bpf_mode]; + if ( n != 0 ) + { + st->bpf_gain_param = get_next_indice( st, n ); + } + else + { + st->bpf_gain_param = ( st->acelp_cfg.bpf_mode ) * 2; + } + + /* Mean energy (2 or 3 bits) */ + n = ACELP_NRG_BITS[st->acelp_cfg.nrg_mode]; + if ( n != 0 ) + { + prm[j++] = get_next_indice( st, n ); + } + + /* Subframe parameters */ + for ( sfr = 0; sfr < nb_subfr; sfr++ ) + { + /* Pitch lag (4, 5, 6, 8 or 9 bits) */ + n = ACELP_LTP_BITS_SFR[st->acelp_cfg.ltp_mode][sfr]; + + if ( n != 0 ) + { + prm[j] = get_next_indice( st, n ); + j++; + } + + /* Adaptive codebook filtering (1 bit) */ + if ( st->acelp_cfg.ltf_mode == 2 ) + { + prm[j] = get_next_indice( st, 1 ); + j++; + } + + /* Innovative codebook */ + { + /* Decode pulse positions. */ + j_old = j; + + wordcnt = ACELP_FIXED_CDK_BITS( st->acelp_cfg.fixed_cdk_index[sfr] ) / 16; + bitcnt = ACELP_FIXED_CDK_BITS( st->acelp_cfg.fixed_cdk_index[sfr] ) & 15; + + /* sanity check - can happen in case of bit errors */ + if ( ( st->acelp_cfg.fixed_cdk_index[sfr] >= ACELP_FIXED_CDK_NB ) || ( st->acelp_cfg.fixed_cdk_index[sfr] < 0 ) ) + { + st->acelp_cfg.fixed_cdk_index[sfr] = 0; + st->BER_detect = 1; + } + + for ( ix = 0; ix < wordcnt; ix++ ) + { + prm[j] = get_next_indice( st, 16 ); + j++; + } + + if ( bitcnt ) + { + prm[j] = get_next_indice( st, bitcnt ); + } + j = j_old + 8; + } + + /* Gains (5b, 6b or 7b / subfr) */ + n = ACELP_GAINS_BITS[st->acelp_cfg.gains_mode[sfr]]; + prm[j++] = get_next_indice( st, n ); + } /*end of subfr loop*/ + } + else if ( st->rf_frame_type >= RF_ALLPRED && st->use_partial_copy ) + { + int16_t tmp = BITS_ALLOC_config_acelp( st->rf_target_bits, /* target bits ranges from 56 to 72 depending on rf_type */ + st->rf_frame_type, /* already offset by 4 to parse the config elements for partial copy */ + &( st->acelp_cfg ), /* acelp_cfg_rf*/ + 0, /* is narrowBand */ + st->nb_subfr ); + if ( tmp < 0 ) + { + /* erroneous configuration, resulting from a corrupt bitstream */ + st->BER_detect = 1; + } + + /* rf_frame_type NELP: 7 */ + if ( st->rf_frame_type == RF_NELP ) + { + /* NELP gain indices */ + st->rf_indx_nelp_iG1 = get_next_indice( st, 5 ); + st->rf_indx_nelp_iG2[0] = get_next_indice( st, 6 ); + st->rf_indx_nelp_iG2[1] = get_next_indice( st, 6 ); + + /* NELP filter selection index */ + st->rf_indx_nelp_fid = get_next_indice( st, 2 ); + + /* tbe gainFr */ + st->rf_indx_tbeGainFr = get_next_indice( st, 5 ); + } + else + { + /* rf_frame_type ALL_PRED: 4, NO_PRED: 5, GEN_PRED: 6*/ + /* ES pred */ + prm[j++] = get_next_indice( st, 3 ); + + ltp_mode = ACELP_LTP_MODE[1][1][st->rf_frame_type]; + gains_mode = ACELP_GAINS_MODE[1][1][st->rf_frame_type]; + + /* Subframe parameters */ + for ( sfr = 0; sfr < nb_subfr; sfr++ ) + { + /* Pitch lag (5, or 8 bits) */ + n = ACELP_LTP_BITS_SFR[ltp_mode][sfr]; + if ( n != 0 ) + { + prm[j++] = get_next_indice( st, n ); + } + + + /*Innovative codebook*/ + if ( ( st->rf_frame_type == RF_NOPRED ) || ( st->rf_frame_type == RF_GENPRED && ( sfr == 0 || sfr == 2 ) ) ) + { + /* NOTE: FCB actual bits need to be backed up as well */ + /*n = ACELP_FIXED_CDK_BITS(st->rf_indx_fcb[fec_offset][sfr]) & 15;*/ + prm[j] = get_next_indice( st, 7 ); + j = j + 8; + } + + /* Gains (5b, 6b or 7b / subfr) */ + if ( sfr == 0 || sfr == 2 ) + { + n = ACELP_GAINS_BITS[gains_mode]; + prm[j++] = get_next_indice( st, n ); + } + } + st->rf_indx_tbeGainFr = get_next_indice( st, 2 ); + } + } + + /*--------------------------------------------------------------------------------* + * TCX20/10 parameters + *--------------------------------------------------------------------------------*/ + + if ( ( core == TCX_20_CORE || core == TCX_10_CORE ) && st->use_partial_copy == 0 ) + { + getTCXparam( st, st, hm_cfg, param, bits_common, start_bit_pos, NULL, NULL, NULL, -1 ); + } + + if ( st->rf_frame_type >= RF_TCXFD && st->rf_frame_type <= RF_TCXTD2 && st->use_partial_copy == 1 ) + { + /* classification */ + ind = get_next_indice( st, 2 ); + st->clas_dec = ONSET; + if ( ind == 0 ) + { + st->clas_dec = UNVOICED_CLAS; + } + else if ( ind == 1 ) + { + if ( st->last_good >= VOICED_TRANSITION ) + { + st->clas_dec = VOICED_TRANSITION; + } + else + { + st->clas_dec = UNVOICED_TRANSITION; + } + } + else if ( ind == 2 ) + { + st->clas_dec = VOICED_CLAS; + } + + if ( st->rf_frame_type == RF_TCXFD ) + { + /* TCX Gain */ + hTcxDec->old_gaintcx_bfi = get_next_indice( st, NBITS_TCX_GAIN ); + } + else + { + /* LTP data */ + if ( hTcxLtpDec->tcxltp ) + { + if ( st->rf_frame_type == RF_TCXTD2 || st->rf_frame_type == RF_TCXTD1 ) + { + prm_ltp[0] = 1; /* LTP active*/ + prm_ltp[1] = get_next_indice( st, 9 ); + prm_ltp[2] = 3; /* max ampl. quantizer output (2bits), anyway not used later*/ + + if ( !st->prev_bfi ) + { + st->BER_detect = st->BER_detect | + tcx_ltp_decode_params( &prm_ltp[0], &( hTcxLtpDec->tcxltp_pitch_int ), &( hTcxLtpDec->tcxltp_pitch_fr ), &( hTcxLtpDec->tcxltp_gain ), st->pit_min, st->pit_fr1, st->pit_fr2, st->pit_max, st->pit_res_max ); + + hTcxDec->tcxltp_last_gain_unmodified = hTcxLtpDec->tcxltp_gain; + } + } + } + } + } + + if ( !st->use_partial_copy ) + { + if ( *total_nbbits - bitsRead[0] < ( st->next_bit_pos - start_bit_pos ) ) + { + st->BER_detect = 1; + st->next_bit_pos = start_bit_pos + *total_nbbits - bitsRead[0]; + } + bitsRead[0] = st->next_bit_pos - start_bit_pos; + } + return; +} diff --git a/lib_dec/dec_tcx.c b/lib_dec/dec_tcx.c new file mode 100644 index 0000000000000000000000000000000000000000..2e131391ea84f3a2ada542e72c2a5114a3385dd3 --- /dev/null +++ b/lib_dec/dec_tcx.c @@ -0,0 +1,1972 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "prot.h" +#include "ivas_prot.h" +#include +#include "options.h" +#include +#include "stat_com.h" +#include "cnst.h" +#include "wmc_auto.h" +#include "ivas_rom_com.h" + + +/*-----------------------------------------------------------------* + * decoder_tcx() + * + * + *-----------------------------------------------------------------*/ + +void decoder_tcx( + Decoder_State *st, /* i/o: coder memory state */ + int16_t prm[], /* i : parameters */ + float A[], /* i : coefficients NxAz[M+1] */ + Word16 Aind[], /* i : frame-independent coefficients Az[M+1] */ + float synth[], /* i/o: synthesis @internal_FS */ + float synthFB[], /* i/o: synthesis @output_FS */ + const int16_t bfi, /* i : Bad frame indicator */ + const int16_t frame_cnt, /* i : frame counter in the super frame */ + const int16_t sba_dirac_stereo_flag /* i : signal stereo output for SBA DirAC */ +) +{ + float x[N_MAX]; + float gainlpc2[FDNS_NPTS]; + float gain_tcx; + int16_t fUseTns, L_frame_glob, L_frameTCX_glob; + STnsData tnsData; + int16_t tcx_offset, tcx_offsetFB, L_frame, L_frameTCX; + int16_t left_rect, L_spec, tmp_concealment_method, nf_seed; + const int16_t *prm_sqQ; + float xn_buf[L_MDCT_OVLP_MAX + L_FRAME_PLUS + L_MDCT_OVLP_MAX]; + + L_spec = st->hTcxCfg->tcx_coded_lines; + L_frame_glob = st->L_frame; + L_frameTCX_glob = st->hTcxDec->L_frameTCX; + if ( st->core == TCX_10_CORE ) + { + L_spec /= 2; + L_frame_glob /= 2; + L_frameTCX_glob /= 2; + } + + tmp_concealment_method = 0; + nf_seed = 0; + fUseTns = 0; /* flag that is set if TNS data is present */ + + set_f( xn_buf, 0, L_MDCT_OVLP_MAX + L_FRAME_PLUS + L_MDCT_OVLP_MAX ); + + init_tcx_info( st, L_frame_glob, L_frameTCX_glob, frame_cnt, bfi, &tcx_offset, &tcx_offsetFB, &L_frame, &L_frameTCX, &left_rect, &L_spec ); + + decoder_tcx_invQ( st, prm, A, Aind, L_spec, L_frame, L_frameTCX, &x[0], &gainlpc2[0], &xn_buf[0], &fUseTns, &tnsData, &gain_tcx, &prm_sqQ, &nf_seed, bfi, frame_cnt ); + + decoder_tcx_noisefilling( st, NULL, A, L_frameTCX_glob, L_spec, L_frame, L_frameTCX, &x[0], &gainlpc2[0], &tmp_concealment_method, gain_tcx, prm_sqQ, nf_seed, bfi, 0, frame_cnt ); + + decoder_tcx_noiseshaping_igf( st, L_spec, L_frame, L_frameTCX, left_rect, &x[0], &gainlpc2[0], &tmp_concealment_method, bfi ); + + decoder_tcx_tns( st, L_frame_glob, L_spec, L_frame, L_frameTCX, &x[0], fUseTns, &tnsData, bfi, frame_cnt, 0 ); + + decoder_tcx_imdct( st, L_frame_glob, L_frameTCX_glob, L_spec, tcx_offset, tcx_offsetFB, L_frame, L_frameTCX, left_rect, &x[0], &xn_buf[0], MDCT_IV, + fUseTns, &synth[0], &synthFB[0], bfi, frame_cnt, sba_dirac_stereo_flag ); + + return; +} + + +/*-------------------------------------------------------------------* + * decoder_tcx_post() + * + * + *-------------------------------------------------------------------*/ + +void decoder_tcx_post( + Decoder_State *st, /* i/o: decoder memory state */ + float *synth, /* i/o: synthesis */ + float *synthFB, /* i/o: FB synthesis */ + float *A, /* i : A(z) filter coefficients */ + const int16_t bfi, /* i : Bad frame indicator */ + const int16_t MCT_flag /* i : hMCT handle allocated (1) or not (0) */ +) +{ + int16_t i; + float level_syn, gainCNG = 0.0f, step; + float xn_buf[L_FRAME_MAX]; + TCX_DEC_HANDLE hTcxDec = st->hTcxDec; + + /* TCX output */ + mvr2r( synth, xn_buf, st->L_frame ); + + /* first TCX frame after ACELP; overwrite ltp initialization done during acelp PLC */ + if ( !bfi && st->prev_bfi && !st->last_core ) + { + hTcxDec->tcxltp_last_gain_unmodified = 0.0f; + } + + if ( st->hTcxLtpDec != NULL && st->element_mode > EVS_MONO && ( st->clas_dec == UNVOICED_CLAS || st->clas_dec == INACTIVE_CLAS ) ) + { + /* deactivate TCX LTP for non-voiced frames */ + st->hTcxLtpDec->tcxltp = 0; + st->hTcxLtpDec->tcxltp_gain = 0.0f; + } + + if ( bfi && !st->use_partial_copy ) + { + /* run lpc gain compensation not for waveform adjustment */ + if ( !st->enablePlcWaveadjust || ( st->hPlcInfo != NULL && st->hPlcInfo->concealment_method == TCX_TONAL ) ) + { + float gainHelperFB = hTcxDec->gainHelper; + float stepCompensateFB = hTcxDec->stepCompensate * st->L_frame / hTcxDec->L_frameTCX; + + for ( i = 0; i < hTcxDec->L_frameTCX; i++ ) + { + synthFB[i] *= gainHelperFB; + gainHelperFB -= stepCompensateFB; + } + } + + for ( i = 0; i < st->L_frame; i++ ) + { + xn_buf[i] *= hTcxDec->gainHelper; + hTcxDec->gainHelper -= hTcxDec->stepCompensate; + } + } + + /* PLC: [TCX: Fade-out] + * PLC: estimate and update CNG energy */ + level_syn = (float) sqrt( ( dotp( synthFB, synthFB, hTcxDec->L_frameTCX ) ) / hTcxDec->L_frameTCX ); + + /* PLC: [TCX: Fade-out] + * PLC: update or retrieve the background level */ + if ( bfi == 0 && st->tcxonly && ( st->element_mode != IVAS_CPE_MDCT || MCT_flag ) && st->clas_dec == UNVOICED_CLAS ) + { + minimumStatistics( hTcxDec->NoiseLevelMemory_bfi, &hTcxDec->NoiseLevelIndex_bfi, &hTcxDec->CurrLevelIndex_bfi, &hTcxDec->CngLevelBackgroundTrace_bfi, &hTcxDec->LastFrameLevel_bfi, level_syn, PLC_MIN_CNG_LEV, PLC_MIN_STAT_BUFF_SIZE ); + } + + /* PLC: [TCX: Fade-out] + * PLC: fade-out in time domain */ + if ( bfi ) + { + float conceal_eof_gainFB; + + if ( st->tcxonly ) + { + gainCNG = hTcxDec->CngLevelBackgroundTrace_bfi / ( level_syn + 0.01f ); + + if ( st->element_mode == IVAS_CPE_MDCT && !MCT_flag ) + { + if ( st->nbLostCmpt > MDCT_ST_PLC_FADEOUT_MAX_CONC_FRAME + MDCT_ST_PLC_FADEOUT_TO_ZERO_LEN ) + { + gainCNG = 0.f; + } + else if ( st->nbLostCmpt > MDCT_ST_PLC_FADEOUT_MAX_CONC_FRAME ) + { + gainCNG *= 1.f - (float) ( st->nbLostCmpt - MDCT_ST_PLC_FADEOUT_MAX_CONC_FRAME ) / MDCT_ST_PLC_FADEOUT_TO_ZERO_LEN; + } + } + } + else + { + gainCNG = st->cngTDLevel / ( level_syn + 0.01f ); + } + if ( st->nbLostCmpt == 1 ) + { + hTcxDec->conceal_eof_gain = 1.0f; + } + + step = ( hTcxDec->conceal_eof_gain - ( hTcxDec->conceal_eof_gain * hTcxDec->damping + gainCNG * ( 1 - hTcxDec->damping ) ) ) / st->L_frame; + { + float stepFB = step * st->L_frame / hTcxDec->L_frameTCX; + conceal_eof_gainFB = hTcxDec->conceal_eof_gain; + + for ( i = 0; i < hTcxDec->L_frameTCX; i++ ) + { + synthFB[i] *= conceal_eof_gainFB; + conceal_eof_gainFB -= stepFB; + } + } + + for ( i = 0; i < st->L_frame; i++ ) + { + xn_buf[i] *= hTcxDec->conceal_eof_gain; + hTcxDec->conceal_eof_gain -= step; + } + + /* run lpc gain compensation not for waveform adjustment */ + if ( st->hPlcInfo != NULL ) + { + if ( ( !st->enablePlcWaveadjust || st->hPlcInfo->concealment_method == TCX_TONAL ) && !st->use_partial_copy ) + { + st->hPlcInfo->recovery_gain = conceal_eof_gainFB * st->last_concealed_gain_syn_deemph; + } + else + { + st->hPlcInfo->recovery_gain = conceal_eof_gainFB; + } + st->hPlcInfo->step_concealgain = step * st->L_frame / hTcxDec->L_frameTCX; + } + } + + + /*-----------------------------------------------------------* + * Memory update * + *-----------------------------------------------------------*/ + + /* Update synth, exc and old_Aq */ + tcx_decoder_memory_update( st, xn_buf, synth, A ); + + + /* PLC: [TCX: Memory update] */ + st->old_pitch_buf[0] = st->old_pitch_buf[st->nb_subfr]; + st->old_pitch_buf[1] = st->old_pitch_buf[st->nb_subfr + 1]; + mvr2r( &st->old_pitch_buf[st->nb_subfr + 2], &st->old_pitch_buf[2], st->nb_subfr ); + set_f( &st->old_pitch_buf[st->nb_subfr + 2], st->old_fpitch, st->nb_subfr ); + st->bfi_pitch = st->old_fpitch; + st->bfi_pitch_frame = st->L_frame; + + st->mem_pitch_gain[2 * st->nb_subfr + 1] = st->mem_pitch_gain[st->nb_subfr + 1]; + st->mem_pitch_gain[2 * st->nb_subfr] = st->mem_pitch_gain[st->nb_subfr]; + + for ( i = 0; i < st->nb_subfr; i++ ) + { + st->mem_pitch_gain[2 * st->nb_subfr - 1 - i] = st->mem_pitch_gain[st->nb_subfr - 1 - i]; + st->mem_pitch_gain[st->nb_subfr - 1 - i] = hTcxDec->tcxltp_last_gain_unmodified; + } + + return; +} + + +/*-------------------------------------------------------------------* + * IMDCT() + * + * + *-------------------------------------------------------------------*/ + +void IMDCT( + float *x, + float *old_syn_overl, + float *syn_Overl_TDAC, + float *xn_buf, + const float *tcx_aldo_window_1_trunc, + const float *tcx_aldo_window_2, + const float *tcx_mdct_window_half, + const float *tcx_mdct_window_minimum, + const float *tcx_mdct_window_trans, + const int16_t tcx_mdct_window_half_length, + const int16_t tcx_mdct_window_min_length, + int16_t index, + const uint16_t kernel_type, /* i : TCX transform kernel type */ + const int16_t left_rect, + const int16_t tcx_offset, + const int16_t overlap, + const int16_t L_frame, + const int16_t L_frameTCX, + const int16_t L_spec_TCX5, + const int16_t L_frame_glob, + const int16_t frame_cnt, + const int16_t bfi, + float *old_out, + const int16_t FB_flag, + Decoder_State *st, + const int16_t fullbandScale, + float *acelp_zir ) +{ + int16_t i, nz, aldo, w, L_win, L_ola; + float win[( L_FRAME_PLUS + L_MDCT_OVLP_MAX ) / 2]; + TCX_DEC_HANDLE hTcxDec = st->hTcxDec; + TCX_CONFIG_HANDLE hTcxCfg = st->hTcxCfg; + + aldo = 0; + + /* number of zero for ALDO windows*/ + nz = NS2SA( st->output_Fs, N_ZERO_MDCT_NS ) * L_frame / L_frameTCX; + + if ( st->element_mode != EVS_MONO && frame_cnt == 0 && !bfi && st->prev_bfi && ( st->last_core_bfi == TCX_20_CORE || st->last_core_bfi == TCX_10_CORE ) && !hTcxCfg->last_aldo ) + { + v_multc( old_syn_overl, hTcxDec->conceal_eof_gain * st->last_concealed_gain_syn_deemph, old_syn_overl, overlap ); + } + + if ( ( L_frameTCX == hTcxDec->L_frameTCX >> 1 ) && st->tcxonly ) + { + /* Mode decision in PLC + + last OL curr OL left TCX-10 right TCX-10 + ------------------------------------------------------------- + 0 0 2x TCX-5* 1x TCX-10 + 0 2 1x TCX-10 1x TCX-10 + 0 3 1x TCX-10 1x TCX-10 + 2 0 2x TCX-5 1x TCX-10 + 2 2 2x TCX-5 2x TCX-5 + 2 3 2x TCX-5 2x TCX-5 + 3 0 2x TCX-5 1x TCX-10 + 3 2 2x TCX-5 2x TCX-5 + 3 3 2x TCX-5 2x TCX-5 + */ + + if ( ( !bfi && hTcxCfg->tcx_last_overlap_mode != FULL_OVERLAP ) || ( bfi && ( hTcxCfg->tcx_last_overlap_mode != FULL_OVERLAP ) && ( hTcxCfg->tcx_curr_overlap_mode != FULL_OVERLAP ) ) ) + { + /* minimum or half overlap, two transforms, grouping into one window */ + L_win = L_frame >> 1; + L_ola = ( hTcxCfg->tcx_last_overlap_mode == MIN_OVERLAP ) ? tcx_mdct_window_min_length : tcx_mdct_window_half_length; + + set_f( win, 0, ( L_FRAME_PLUS + L_MDCT_OVLP_MAX ) / 2 ); + set_zero( xn_buf, tcx_offset + ( L_ola >> 1 ) ); /* zero left end of buffer */ + + for ( w = 0; w < 2; w++ ) + { + if ( kernel_type == MDST_IV || ( kernel_type & w ) ) + { + TCX_MDST_Inverse( x + w * L_spec_TCX5, win, L_ola, L_win - L_ola, L_ola, st->element_mode ); + } + else if ( kernel_type != 0 && w == 0 ) /* type 1 or 2 */ + { + TCX_MDXT_Inverse( x + w * L_spec_TCX5, win, L_ola, L_win - L_ola, L_ola, kernel_type ); + } + else + { + TCX_MDCT_Inverse( x + w * L_spec_TCX5, win, L_ola, L_win - L_ola, L_ola, st->element_mode ); + } + + tcx_windowing_synthesis_current_frame( win, tcx_aldo_window_2, tcx_mdct_window_half, tcx_mdct_window_minimum, L_ola, tcx_mdct_window_half_length, tcx_mdct_window_min_length, ( w > 0 ) ? 0 : left_rect, ( w > 0 ) || ( w == 0 && index == 2 ) ? MIN_OVERLAP : hTcxCfg->tcx_last_overlap_mode, acelp_zir, hTcxDec->old_syn_Overl, syn_Overl_TDAC, st->old_Aq_12_8, tcx_mdct_window_trans, L_win, tcx_offset < 0 ? -tcx_offset : 0, ( w > 0 ) || ( frame_cnt > 0 ) ? 1 : st->last_core, ( w > 0 ) || ( frame_cnt > 0 ) ? 0 : st->last_is_cng, fullbandScale ); + + if ( w > 0 ) + { + tcx_windowing_synthesis_past_frame( xn_buf + tcx_offset - ( L_ola >> 1 ) + w * L_win, tcx_aldo_window_1_trunc, tcx_mdct_window_half, tcx_mdct_window_minimum, L_ola, tcx_mdct_window_half_length, tcx_mdct_window_min_length, MIN_OVERLAP ); + } + + /* add part of current sub-window overlapping with previous window */ + v_add( win, xn_buf + tcx_offset - ( L_ola >> 1 ) + w * L_win, xn_buf + tcx_offset - ( L_ola >> 1 ) + w * L_win, L_ola ); + + /* copy new sub-window region not overlapping with previous window */ + mvr2r( win + L_ola, xn_buf + tcx_offset + ( L_ola >> 1 ) + w * L_win, L_win ); + } + + /* To assure that no garbage values are passed to overlap */ + set_zero( xn_buf + L_frame + tcx_offset + ( L_ola >> 1 ), overlap - tcx_offset - ( L_ola >> 1 ) ); + + if ( st->prev_bfi && frame_cnt == 0 && st->last_core != st->last_core_bfi && st->last_core_bfi == ACELP_CORE ) + { + tcx_windowing_synthesis_past_frame( old_syn_overl, tcx_aldo_window_1_trunc, tcx_mdct_window_half, tcx_mdct_window_minimum, overlap, tcx_mdct_window_half_length, tcx_mdct_window_min_length, hTcxCfg->tcx_last_overlap_mode ); + v_add( xn_buf, old_syn_overl, xn_buf, overlap ); + } + } + else if ( !bfi && ( frame_cnt == 0 ) && ( hTcxCfg->tcx_curr_overlap_mode == FULL_OVERLAP ) ) + + { + /* special overlap attempt, two transforms, grouping into one window */ + L_win = L_frame >> 1; + L_ola = tcx_mdct_window_min_length; + + set_f( win, 0, ( L_FRAME_PLUS + L_MDCT_OVLP_MAX ) / 2 ); + + /* 1st TCX-5 window, special MDCT with minimum overlap on right side */ + if ( kernel_type == MDST_IV ) + { + TCX_MDST_Inverse( x, win + L_win, 0, L_win - ( L_ola >> 1 ), L_ola, st->element_mode ); + } + else if ( kernel_type != MDCT_IV ) /* type 1 or 2 */ + { + TCX_MDXT_Inverse( x, win + L_win, 0, L_win - ( L_ola >> 1 ), L_ola, kernel_type ); + } + else + { + TCX_MDCT_Inverse( x, win + L_win, 0, L_win - ( L_ola >> 1 ), L_ola, st->element_mode ); + } + + set_zero( xn_buf, ( overlap >> 1 ) ); + + /* copy new sub-window region not overlapping with previous window */ + mvr2r( win + L_win, xn_buf + ( overlap >> 1 ), L_win + ( L_ola >> 1 ) ); + + /* 2nd TCX-5 window, regular MDCT with minimum overlap on both sides */ + if ( kernel_type & 1 ) + { + TCX_MDST_Inverse( x + L_spec_TCX5, win, L_ola, L_win - L_ola, L_ola, st->element_mode ); + } + else + { + TCX_MDCT_Inverse( x + L_spec_TCX5, win, L_ola, L_win - L_ola, L_ola, st->element_mode ); + } + + tcx_windowing_synthesis_current_frame( win, tcx_aldo_window_2, tcx_mdct_window_half, tcx_mdct_window_minimum, L_ola, tcx_mdct_window_half_length, tcx_mdct_window_min_length, 0, + /* left_rect */ MIN_OVERLAP, /* left_mode */ acelp_zir, hTcxDec->old_syn_Overl, syn_Overl_TDAC, st->old_Aq_12_8, tcx_mdct_window_trans, L_win, tcx_offset < 0 ? -tcx_offset : 0, 1, /* st->last_mode_bfi */ 0, /* st->last_is_cng */ fullbandScale ); + + tcx_windowing_synthesis_past_frame( xn_buf + ( overlap >> 1 ) + L_win - ( L_ola >> 1 ), tcx_aldo_window_1_trunc, tcx_mdct_window_half, tcx_mdct_window_minimum, L_ola, tcx_mdct_window_half_length, tcx_mdct_window_min_length, 2 ); + + /* add part of current sub-window overlapping with previous window */ + v_add( win, xn_buf + ( overlap >> 1 ) + L_win - ( L_ola >> 1 ), xn_buf + ( overlap >> 1 ) + L_win - ( L_ola >> 1 ), L_ola ); + + /* copy new sub-window region not overlapping with previous window */ + mvr2r( win + L_ola, xn_buf + ( overlap >> 1 ) + L_win + ( L_ola >> 1 ), L_win ); + + /* extra folding-out on left side of win, for perfect reconstruction */ + if ( kernel_type >= MDCT_II ) + { + for ( w = ( overlap >> 1 ); w < overlap; w++ ) + { + xn_buf[overlap - 1 - w] = xn_buf[w]; + } + } + else + { + for ( w = ( overlap >> 1 ); w < overlap; w++ ) + { + xn_buf[overlap - 1 - w] = -1.0f * xn_buf[w]; + } + } + tcx_windowing_synthesis_current_frame( xn_buf, tcx_aldo_window_2, tcx_mdct_window_half, tcx_mdct_window_minimum, overlap, tcx_mdct_window_half_length, tcx_mdct_window_min_length, left_rect, 0, /* left_mode */ acelp_zir, hTcxDec->old_syn_Overl, syn_Overl_TDAC, st->old_Aq_12_8, tcx_mdct_window_trans, 2 * L_win, tcx_offset < 0 ? -tcx_offset : 0, st->last_core_bfi, st->last_is_cng, fullbandScale ); + } + else + { + /* default, i.e. maximum overlap, single transform, no grouping */ + if ( kernel_type == MDST_IV ) + { + TCX_MDST_Inverse( x, xn_buf, overlap, L_frame - overlap, overlap, st->element_mode ); + } + else if ( kernel_type != MDCT_IV ) /* type 1 or 2 */ + { + TCX_MDXT_Inverse( x, xn_buf, overlap, L_frame - overlap, overlap, kernel_type ); + } + else + { + TCX_MDCT_Inverse( x, xn_buf, overlap, L_frame - overlap, overlap, st->element_mode ); + } + + tcx_windowing_synthesis_current_frame( xn_buf, tcx_aldo_window_2, tcx_mdct_window_half, tcx_mdct_window_minimum, overlap, tcx_mdct_window_half_length, tcx_mdct_window_min_length, left_rect, !bfi && ( frame_cnt > 0 ) && ( index == 0 ) && ( st->last_core != ACELP_CORE ) ? MIN_OVERLAP : index, acelp_zir, hTcxDec->old_syn_Overl, syn_Overl_TDAC, st->old_Aq_12_8, tcx_mdct_window_trans, L_frame_glob >> 1, tcx_offset < 0 ? -tcx_offset : 0, ( frame_cnt > 0 /*|| (st->last_con_tcx )*/ ) ? 1 : st->last_core_bfi, ( frame_cnt > 0 ) ? 0 : st->last_is_cng, fullbandScale ); + + } /* tcx_last_overlap_mode != FULL_OVERLAP */ + } + else + { + /* frame is TCX-20 or not TCX-only */ + assert( frame_cnt == 0 ); + if ( hTcxCfg->tcx_last_overlap_mode != TRANSITION_OVERLAP ) + { + float tmp[L_FRAME_PLUS]; + if ( kernel_type != MDCT_IV ) /* inverse transform */ + { + if ( kernel_type == MDST_IV ) + { + edst( x, xn_buf + overlap / 2 + nz, L_frame, st->element_mode ); + } + else /* type 1 or 2 */ + { + edxt( x, xn_buf + overlap / 2 + nz, L_frame, kernel_type, TRUE ); + } + v_multc( xn_buf + overlap / 2 + nz, (float) sqrt( (float) L_frame / NORM_MDCT_FACTOR ), tmp, L_frame ); + window_ola_ext( tmp, xn_buf, old_out, L_frame, hTcxCfg->tcx_last_overlap_mode, hTcxCfg->tcx_curr_overlap_mode, kernel_type ); + } + else + { + edct( x, xn_buf + overlap / 2 + nz, L_frame, st->element_mode ); + + v_multc( xn_buf + overlap / 2 + nz, (float) sqrt( (float) L_frame / NORM_MDCT_FACTOR ), tmp, L_frame ); + window_ola( tmp, xn_buf, old_out, L_frame, hTcxCfg->tcx_last_overlap_mode, hTcxCfg->tcx_curr_overlap_mode, 0, 0, NULL ); + } + aldo = 1; + } + else + { + int16_t acelp_mem_len = tcx_offset < 0 ? -tcx_offset : 0; + + if ( kernel_type == MDST_IV ) + { + TCX_MDST_Inverse( x, xn_buf, overlap, L_frame - overlap, overlap, st->element_mode ); + } + else if ( kernel_type != MDCT_IV ) /* type 1 or 2 */ + { + TCX_MDXT_Inverse( x, xn_buf, overlap, L_frame - overlap, overlap, kernel_type ); + } + else + { + TCX_MDCT_Inverse( x, xn_buf, overlap, L_frame - overlap, overlap, st->element_mode ); + } + + /*-----------------------------------------------------------* + * Windowing, overlap and add * + *-----------------------------------------------------------*/ + + if ( st->element_mode == IVAS_CPE_MDCT && ( st->last_core_brate <= SID_2k40 || st->last_core == ACELP_CORE ) && !fullbandScale ) + { + float buf[L_FRAME_MAX / 4]; + float window_buf[L_FRAME_MAX / 4]; + float r[M + 1]; + const int16_t analysis_len = L_frame_glob / 4; + + /* get the first 5 ms of non-aliased TCX syntesis */ + mvr2r( xn_buf + overlap / 2 + 2 * acelp_mem_len, &buf[0], analysis_len ); + + /* get LPC from that signal part to use for acelp zir smoothing */ + ham_cos_window( &window_buf[0], analysis_len / 2, analysis_len / 2 ); + autocorr( &buf[0], &r[0], M, analysis_len, &window_buf[0], 0, 0, 0 ); + lag_wind( r, M, L_frame_glob * FRAMES_PER_SEC, LAGW_STRONG ); + lev_dur( &st->old_Aq_12_8[0], &r[0], M, NULL ); + } + + /* Window current frame */ + tcx_windowing_synthesis_current_frame( xn_buf, tcx_aldo_window_2, tcx_mdct_window_half, tcx_mdct_window_minimum, overlap, tcx_mdct_window_half_length, tcx_mdct_window_min_length, left_rect, hTcxCfg->tcx_last_overlap_mode, acelp_zir, hTcxDec->old_syn_Overl, syn_Overl_TDAC, st->old_Aq_12_8, tcx_mdct_window_trans, L_frame_glob >> 1, acelp_mem_len, st->last_core_bfi, st->last_is_cng, fullbandScale ); + } + } /* TCX-20 and TCX-only */ + + /* Window and overlap-add past frame if past frame is TCX */ + if ( ( frame_cnt != 0 ) || ( st->last_core_bfi > ACELP_CORE ) ) + { + if ( ( ( L_frameTCX == hTcxDec->L_frameTCX >> 1 ) && ( st->tcxonly ) ) || + ( hTcxCfg->tcx_last_overlap_mode == TRANSITION_OVERLAP ) ) + { + if ( !bfi && ( frame_cnt > 0 ) && ( index == 0 ) && ( hTcxCfg->tcx_curr_overlap_mode == FULL_OVERLAP ) && ( st->last_core != ACELP_CORE ) ) + { + index = MIN_OVERLAP; /* use minimum overlap between the two TCX-10 windows */ + } + + if ( hTcxCfg->last_aldo ) + { + for ( i = 0; i < overlap - tcx_mdct_window_min_length; i++ ) + { + xn_buf[i + overlap / 2 - tcx_offset] += old_out[i + nz]; + } + + /* fade truncated ALDO window */ + if ( L_frameTCX == hTcxDec->L_frameTCX >> 1 && st->element_mode == IVAS_CPE_MDCT && frame_cnt == 0 && hTcxCfg->tcx_last_overlap_mode == FULL_OVERLAP ) + { + for ( ; i < overlap; i++ ) /* perfectly reconstructing ALDO shortening */ + { + xn_buf[i + overlap / 2 - tcx_offset] += old_out[i + nz]; + } + for ( i = 0; i < tcx_mdct_window_min_length; i++ ) + { + xn_buf[i + overlap / 2 - tcx_offset + overlap] += old_out[i + nz + overlap] * tcx_mdct_window_minimum[tcx_mdct_window_min_length - 1 - i]; + } + } + else + { + for ( ; i < overlap; i++ ) + { + xn_buf[i + overlap / 2 - tcx_offset] += old_out[i + nz] * tcx_mdct_window_minimum[overlap - 1 - i]; + } + } + } + else + { + tcx_windowing_synthesis_past_frame( old_syn_overl, tcx_aldo_window_1_trunc, tcx_mdct_window_half, tcx_mdct_window_minimum, overlap, tcx_mdct_window_half_length, tcx_mdct_window_min_length, ( index == 0 || hTcxCfg->tcx_last_overlap_mode == MIN_OVERLAP ) ? hTcxCfg->tcx_last_overlap_mode : index ); + + if ( bfi ) + { + for ( i = 0; i < tcx_mdct_window_half_length; i++ ) + { + xn_buf[i + overlap / 2 - tcx_offset] += old_syn_overl[i] * tcx_mdct_window_half[tcx_mdct_window_half_length - 1 - i]; + } + } + else if ( !left_rect ) + { + for ( i = 0; i < overlap; i++ ) + { + xn_buf[i] += old_syn_overl[i]; + } + } + else + { + for ( i = 0; i < overlap; i++ ) + { + xn_buf[i + ( overlap >> 1 )] += old_syn_overl[i]; + } + } + } + } + } + + if ( !aldo && ( ( ( L_frameTCX == hTcxDec->L_frameTCX >> 1 ) && frame_cnt > 0 ) || L_frameTCX != ( hTcxDec->L_frameTCX >> 1 ) ) ) + { + /* Compute windowed synthesis in case of switching to ALDO windows in next frame */ + mvr2r( xn_buf + L_frame - nz, old_out, nz + overlap ); + set_zero( old_out + nz + overlap, nz ); + + tcx_windowing_synthesis_past_frame( old_out + nz, tcx_aldo_window_1_trunc, tcx_mdct_window_half, tcx_mdct_window_minimum, overlap, tcx_mdct_window_half_length, tcx_mdct_window_min_length, hTcxCfg->tcx_curr_overlap_mode ); + + /* If current overlap mode = FULL_OVERLAP -> ALDO_WINDOW */ + if ( hTcxCfg->tcx_curr_overlap_mode == FULL_OVERLAP ) + { + if ( kernel_type & 1 ) + { + for ( i = 0; i < nz; i++ ) + { + old_out[nz + overlap + i] = -1.0f * xn_buf[L_frame - 1 - i] * tcx_aldo_window_1_trunc[-1 - i]; + } + } + else + { + for ( i = 0; i < nz; i++ ) + { + old_out[nz + overlap + i] = xn_buf[L_frame - 1 - i] * tcx_aldo_window_1_trunc[-1 - i]; + } + } + aldo = 1; + } + } + + if ( FB_flag ) + { + hTcxCfg->last_aldo = aldo; + } + + /* Smoothing between the ACELP PLC and TCX Transition frame. Using the shape of the half overlap window for the crossfading. */ + if ( left_rect && ( frame_cnt == 0 ) && ( st->last_core_bfi == ACELP_CORE ) && st->prev_bfi ) + { + if ( FB_flag ) + { + for ( i = 0; i < tcx_mdct_window_half_length; i++ ) + { + xn_buf[i + overlap / 2 - tcx_offset] *= tcx_mdct_window_half[i]; + xn_buf[i + overlap / 2 - tcx_offset] += hTcxDec->syn_OverlFB[i] * tcx_mdct_window_half[tcx_mdct_window_half_length - 1 - i] * tcx_mdct_window_half[tcx_mdct_window_half_length - 1 - i]; + } + } + else + { + for ( i = 0; i < tcx_mdct_window_half_length; i++ ) + { + xn_buf[i + overlap / 2 - tcx_offset] *= tcx_mdct_window_half[i]; + xn_buf[i + overlap / 2 - tcx_offset] += hTcxDec->syn_Overl[i] * tcx_mdct_window_half[tcx_mdct_window_half_length - 1 - i] * tcx_mdct_window_half[tcx_mdct_window_half_length - 1 - i]; + } + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * decoder_tcx_invQ + * + * TCX: inverse quantization + *-------------------------------------------------------------------*/ + +void decoder_tcx_invQ( + Decoder_State *st, /* i/o: coder memory state */ + int16_t prm[], /* i : parameters */ + float A[], /* i : coefficients NxAz[M+1] */ + Word16 Aind[], /* i : frame-independent coefficients Az[M+1] */ + const int16_t L_spec, + const int16_t L_frame, + const int16_t L_frameTCX, + float x[], + float gainlpc2[], + float xn_buf[], + int16_t *fUseTns, /* o : flag that is set if TNS data is present */ + STnsData *tnsData, + float *gain_tcx, + const int16_t **prm_sqQ1, + int16_t *nf_seed, + const int16_t bfi, /* i : Bad frame indicator */ + const int16_t frame_cnt /* i : frame counter in the super frame */ +) +{ + int16_t i, index; + int16_t start_zeroing; + float Ap[M + 2]; + + int16_t noiseFillingSize; + int16_t tnsSize; /* number of tns parameters put into prm */ + + float gamma1; + float gamma; + float gainCompensate = 1.f; + float h1[L_FRAME_MAX / 4 + 1]; + float mem[M]; + float tmp2; + int16_t arith_bits, signaling_bits; + const int16_t *prm_ltp, *prm_tns, *prm_hm, *prm_sqQ, *prm_target; + TCX_LTP_DEC_HANDLE hTcxLtpDec = st->hTcxLtpDec; + TCX_DEC_HANDLE hTcxDec = st->hTcxDec; + TCX_CONFIG_HANDLE hTcxCfg = st->hTcxCfg; + + tnsSize = 0; + prm_target = NULL; /* just to suppress MSVC warnigs */ + + /*-----------------------------------------------------------------* + * Initializations + *-----------------------------------------------------------------*/ + + /* Init lengths */ + gamma1 = st->gamma; + + if ( hTcxDec->enableTcxLpc ) + { + gamma1 = 1.0f; + } + + noiseFillingSize = L_spec; + if ( st->igf ) + { + noiseFillingSize = st->hIGFDec->infoIGFStartLine; + } + + prm_ltp = &prm[1 + NOISE_FILL_RANGES]; + prm_tns = prm_ltp + LTPSIZE; + + /*-----------------------------------------------------------* + * Read TCX parameters * + *-----------------------------------------------------------*/ + + index = 0; + + if ( !bfi ) + { + index = prm[0]; + + /* read noise level (fac_ns) */ + st->hTcxDec->noise_filling_index[frame_cnt] = prm[1]; + } + + /* read TNS data */ + if ( !bfi && hTcxCfg->fIsTNSAllowed ) + { + *fUseTns = DecodeTnsData( hTcxCfg->pCurrentTnsConfig, prm_tns, &tnsSize, tnsData ); + } + else + { + *fUseTns = 0; + } + + prm_hm = prm_tns + tnsSize; + prm_sqQ = prm_hm + NPRM_CTX_HM; + *prm_sqQ1 = prm_sqQ; + + /*-----------------------------------------------------------* + * Spectrum data * + *-----------------------------------------------------------*/ + + if ( !bfi ) + { + /*-----------------------------------------------------------* + * Context HM * + *-----------------------------------------------------------*/ + + if ( hTcxCfg->ctx_hm && ( ( st->last_core_from_bs != ACELP_CORE ) || ( frame_cnt > 0 ) ) ) + { + st->last_ctx_hm_enabled = prm_hm[0]; + + for ( i = 0; i < L_spec; i++ ) + { + /* no context harmonic model, copy MDCT coefficients to x */ + x[i] = (float) prm_sqQ[i]; + } + } + else /* hTcxCfg->ctx_hm == 0 */ + { + if ( hTcxDec->tcx_lpc_shaped_ari ) /* low rates: envelope based arithmetic coder */ + { + prm_target = prm_sqQ; + prm_sqQ = prm_target + 1; + + tcx_arith_decode_envelope( st, x, L_frame, L_spec, Aind, *prm_target, prm_sqQ, st->last_core_from_bs != ACELP_CORE, prm_hm, /* HM parameter area */ hTcxDec->tcx_hm_LtpPitchLag, &arith_bits, &signaling_bits, ( st->bwidth > WB ) ? 1 : 0 ); + + hTcxDec->resQBits[frame_cnt] = *prm_target - arith_bits; + + /* Noise filling seed */ + for ( i = 0; i < noiseFillingSize; ++i ) + { + *nf_seed += (int16_t) ( abs( (int16_t) x[i] ) * i * 2 ); + } + } + else /* TCX-only: context based arithmetic coder */ + { + for ( i = 0; i < L_spec; i++ ) + { + x[i] = (float) prm_sqQ[i]; + } + + for ( i = L_spec; i < L_frameTCX; i++ ) + { + x[i] = 0.0f; + } + } + + } /* else of if hTcxCfg->ctx_hm */ + + start_zeroing = ( st->last_core != st->last_core_from_bs ) ? min( L_spec, L_frame ) : L_spec; + + if ( frame_cnt == 0 && st->last_core == ACELP_CORE && st->last_core_from_bs != ACELP_CORE ) + { + int16_t L_spec_con = L_spec + ( st->hTcxCfg->tcx_coded_lines >> 2 ); + + for ( i = start_zeroing; i < L_spec_con; i++ ) + { + x[i] = 0.0f; + } + + start_zeroing = L_spec_con; + } + + for ( i = start_zeroing; i < max( L_frame, L_frameTCX ); i++ ) + { + x[i] = 0.0f; + } + + /*-----------------------------------------------------------* + * adaptive low frequency deemphasis. * + *-----------------------------------------------------------*/ + + if ( st->element_mode != IVAS_CPE_MDCT ) + { + weight_a( A, Ap, gamma1, M ); + lpc2mdct( Ap, M, gainlpc2, FDNS_NPTS, 0 ); + } + + /* initialize LF deemphasis factors in xn_buf */ + if ( !st->tcxonly || ( hTcxCfg->resq && hTcxDec->tcx_lpc_shaped_ari ) ) + { + for ( i = 0; i < max( L_spec, L_frameTCX ); i++ ) + { + xn_buf[i] = 1.0f; + } + } + + if ( !st->tcxonly ) + { + AdaptLowFreqDeemph( x, hTcxDec->tcx_lpc_shaped_ari, gainlpc2, L_frame, xn_buf /* LF deemphasis factors */ ); + } + } + + hTcxDec->damping = 0.f; + + if ( bfi == 0 ) + { + /*-----------------------------------------------------------* + * Compute global gain * + *-----------------------------------------------------------*/ + + if ( st->element_mode > EVS_MONO ) + { + float ener; + + /*To be in sync with encoder gain computating*/ + ener = (float) sqrt( (float) L_spec / (float) NORM_MDCT_FACTOR ); + *gain_tcx = (float) pow( 10.0f, ( (float) index ) / 28.0f ) / ener; + } + else + { + *gain_tcx = (float) pow( 10.0f, index / 28.0f ) * (float) sqrt( (float) NORM_MDCT_FACTOR / (float) L_spec ); + } + + hTcxDec->old_gaintcx_bfi = *gain_tcx; + + hTcxDec->cummulative_damping_tcx = 1.0f; + } + else /* bfi = 1 */ + { + /* PLC: [TCX: Fade-out] + * derivation of damping factor */ + if ( st->use_partial_copy ) + { + if ( st->rf_frame_type == RF_TCXFD ) + { + *gain_tcx = (float) pow( 10.0f, (int16_t) hTcxDec->old_gaintcx_bfi / 28.0f ) * (float) sqrt( (float) NORM_MDCT_FACTOR / (float) L_spec ); + hTcxDec->old_gaintcx_bfi = *gain_tcx; + } + else + { + *gain_tcx = hTcxDec->old_gaintcx_bfi; + } + + hTcxDec->damping = 1; + } + else + { + *gain_tcx = hTcxDec->old_gaintcx_bfi; + hTcxDec->damping = Damping_fact( st->coder_type, st->nbLostCmpt, st->last_good, st->stab_fac, &( st->lp_gainp ), st->last_core ); + } + + hTcxDec->cummulative_damping_tcx *= hTcxDec->damping; + } + + if ( bfi ) + { + if ( hTcxDec->envWeighted ) + { + gamma = st->gamma; + } + else + { + gamma = gamma1; + } + + /* PLC: [TCX: Fade-out] + * PLC: invert LPC weighting in case of PLC */ + + if ( hTcxDec->enableTcxLpc ) + { + gamma = hTcxDec->cummulative_damping_tcx * ( st->gamma - 1 ) + 1; + } + else + { + gamma = hTcxDec->cummulative_damping_tcx * ( gamma1 - 1 ) + 1; + } + + if ( st->element_mode != IVAS_CPE_MDCT ) + { + weight_a( A, Ap, gamma, M ); + lpc2mdct( Ap, M, gainlpc2, FDNS_NPTS, 0 ); + } + } + + if ( st->element_mode != IVAS_CPE_MDCT ) + { + tmp2 = 0; + set_zero( h1, L_SUBFR + 1 ); + set_zero( mem, M ); + h1[0] = 1.0f; + syn_filt( Ap, M, h1, h1, L_SUBFR, mem, 0 ); /* impulse response of LPC */ + deemph( h1, st->preemph_fac, L_SUBFR, &tmp2 ); /* impulse response of deemph */ + } + + /* impulse response level = gain introduced by synthesis+deemphasis */ + if ( !bfi ) + { + if ( st->element_mode == IVAS_CPE_MDCT ) + { + st->last_gain_syn_deemph = 0.0; + } + else + { + st->last_gain_syn_deemph = (float) sqrt( dotp( h1, h1, L_SUBFR ) ); + } + + /*for avoiding compiler warnings*/ + hTcxDec->gainHelper = 1.f; + hTcxDec->stepCompensate = 0.f; + } + else if ( st->core == TCX_20_CORE || frame_cnt == 1 ) + { + if ( st->element_mode == IVAS_CPE_MDCT ) + { + gainCompensate = 1.0f; + } + else + { + gainCompensate = st->last_gain_syn_deemph / (float) sqrt( dotp( h1, h1, L_SUBFR ) ); + } + + if ( st->nbLostCmpt == 1 ) + { + hTcxDec->stepCompensate = ( 1.f - gainCompensate ) / st->L_frame; + hTcxDec->gainHelper = 1.f; + } + else + { + hTcxDec->stepCompensate = ( st->last_concealed_gain_syn_deemph - gainCompensate ) / st->L_frame; + hTcxDec->gainHelper = st->last_concealed_gain_syn_deemph; + } + st->last_concealed_gain_syn_deemph = gainCompensate; + } + + /*-----------------------------------------------------------* + * Residual inv. Q. * + *-----------------------------------------------------------*/ + + if ( !bfi && hTcxCfg->resq ) + { + if ( hTcxDec->tcx_lpc_shaped_ari ) + { + /* envelope based arithmetic coder */ + const int16_t *prm_resq; + prm_resq = prm_sqQ + *prm_target /* = targetBits */ - hTcxDec->resQBits[frame_cnt]; + i = tcx_ari_res_invQ_spec( x, L_spec, prm_resq, hTcxDec->resQBits[frame_cnt], 0, hTcxCfg->sq_rounding, xn_buf /* LF deemphasis factors */ ); + } + else + { + /* context based arithmetic coder */ + i = tcx_res_invQ_gain( gain_tcx, &prm_sqQ[L_spec], hTcxDec->resQBits[frame_cnt] ); + tcx_res_invQ_spec( x, L_spec, &prm_sqQ[L_spec], hTcxDec->resQBits[frame_cnt], i, hTcxCfg->sq_rounding, st->tcxonly ? NULL : xn_buf /* LF deemphasis factors */ ); + } + } + + if ( !bfi && st->tcxonly && st->element_mode != IVAS_CPE_MDCT ) + { + if ( hTcxLtpDec->tcxltp && ( hTcxLtpDec->tcxltp_gain > 0.0f ) && !( *fUseTns ) ) + { + PsychAdaptLowFreqDeemph( x, gainlpc2, NULL ); + } + } + + if ( !bfi && !st->tcxonly ) + { + /* Replication of ACELP formant enhancement for low rates */ + if ( st->total_brate < ACELP_13k20 ) + { + if ( st->element_mode == IVAS_CPE_MDCT ) + { + assert( !"Not adapted to warped scale" ); + } + tcxFormantEnhancement( xn_buf, gainlpc2, x, L_frame ); + } + } + + /*-----------------------------------------------------------* + * Add gain to the lpc gains * + *-----------------------------------------------------------*/ + + if ( st->VAD == 0 ) + { + *gain_tcx *= hTcxCfg->na_scale; + } + + if ( st->element_mode != IVAS_CPE_MDCT ) + { + v_multc( gainlpc2, *gain_tcx, gainlpc2, FDNS_NPTS ); + } + + return; +} + + +/*-------------------------------------------------------------------* + * decoder_tcx_noisefilling() + * + * TCX: core noise filling, IGF updates + *-------------------------------------------------------------------*/ + +void decoder_tcx_noisefilling( + Decoder_State *st, /* i/o: coder memory state */ + float concealment_noise[L_FRAME48k], + const float A[], /* i : coefficients NxAz[M+1] */ + const int16_t L_frameTCX_glob, + const int16_t L_spec, + const int16_t L_frame, + const int16_t L_frameTCX, + float x[], + float gainlpc2[], + int16_t *temp_concealment_method, + const float gain_tcx, + const int16_t *prm_sqQ, + int16_t nf_seed, + const int16_t bfi, /* i : Bad frame indicator */ + const int16_t MCT_flag, + const int16_t frame_cnt /* i : frame counter in the super frame*/ +) +{ + int16_t i; + int16_t firstLine; + float fac_ns; + int16_t noiseFillingSize; + int16_t noiseTransWidth = MIN_NOISE_FILLING_HOLE; + float tmp2; + int32_t sum_word32; + int16_t infoIGFStartLine; + float f, noiseTiltFactor, smooth_gain; + float E_2ndlast, E_last; + TCX_LTP_DEC_HANDLE hTcxLtpDec = st->hTcxLtpDec; + TCX_DEC_HANDLE hTcxDec = st->hTcxDec; + TCX_CONFIG_HANDLE hTcxCfg = st->hTcxCfg; + int32_t total_brate = ( st->element_mode == IVAS_CPE_MDCT ? st->element_brate : st->total_brate ); + + /*-----------------------------------------------------------------* + * Initializations + *-----------------------------------------------------------------*/ + + /* Init lengths */ + infoIGFStartLine = get_igf_startline( st, L_frame, L_frameTCX ); + + noiseFillingSize = L_spec; + if ( st->igf ) + { + noiseFillingSize = st->hIGFDec->infoIGFStartLine; + } + + fac_ns = (float) hTcxDec->noise_filling_index[frame_cnt] * 0.75f / ( 1 << NBITS_NOISE_FILL_LEVEL ); + + /*-----------------------------------------------------------* + * Noise filling. * + *-----------------------------------------------------------*/ + + if ( !bfi && ( fac_ns > 0.0f ) ) + { + firstLine = tcxGetNoiseFillingTilt( A, L_frame, ( total_brate >= ACELP_13k20 && !st->rf_flag ), &noiseTiltFactor ); + + if ( st->tcxonly ) + { + if ( st->element_mode == IVAS_CPE_MDCT ) + { + if ( frame_cnt == 0 ) + { + mvr2r( hTcxDec->ltpGainMemory, &hTcxDec->ltpGainMemory[1], N_LTP_GAIN_MEMS - 1 ); + hTcxDec->ltpGainMemory[0] = hTcxLtpDec->tcxltp_gain; + } + + smooth_gain = dotp( hTcxDec->ltpGainMemory, nf_tw_smoothing_coeffs, N_LTP_GAIN_MEMS ); + noiseTransWidth = HOLE_SIZE_FROM_LTP( max( smooth_gain, ( hTcxCfg->ctx_hm && st->last_core != ACELP_CORE ) ? 0.3125f * st->last_ctx_hm_enabled : 0 ) ); + } + else + { + noiseTransWidth = HOLE_SIZE_FROM_LTP( max( hTcxLtpDec->tcxltp_gain, ( hTcxCfg->ctx_hm && st->last_core != ACELP_CORE ) ? 0.3125f * st->last_ctx_hm_enabled : 0 ) ); + } + + if ( L_frame == st->L_frame >> 1 ) + { + noiseTransWidth = 3; /* minimum transition fading for noise filling in TCX-10 */ + } + } + + if ( !hTcxDec->tcx_lpc_shaped_ari ) + { + for ( i = 0; i < L_spec; i++ ) + { + nf_seed += (int16_t) ( abs( prm_sqQ[i] ) * i * 2 ); + } + } + tcx_noise_filling( x, nf_seed, firstLine, noiseFillingSize, noiseTransWidth, L_frame, noiseTiltFactor, fac_ns, st->igf ? st->hIGFDec->infoTCXNoise : NULL, st->element_mode ); + + st->seed_tcx_plc = nf_seed; + } + + if ( st->enablePlcWaveadjust ) + { + if ( bfi ) + { + if ( st->nbLostCmpt == 1 ) + { + st->hPlcInfo->concealment_method = TCX_NONTONAL; + + /* tonal/non-tonal decision */ + if ( st->hPlcInfo->Transient[0] == 1 && st->hPlcInfo->Transient[1] == 1 && st->hPlcInfo->Transient[2] == 1 ) + { + sum_word32 = 0; + + for ( i = 9; i >= 0; i-- ) + { + sum_word32 += st->hPlcInfo->TCX_Tonality[i]; + } + + if ( sum_word32 >= 6 ) + { + st->hPlcInfo->concealment_method = TCX_TONAL; + } + } + + if ( st->tonal_mdct_plc_active ) + { + st->hPlcInfo->concealment_method = TCX_TONAL; + } + } + + if ( L_frameTCX > hTcxDec->L_frameTCX ) + { + st->hPlcInfo->concealment_method = TCX_TONAL; + } + + *temp_concealment_method = st->hPlcInfo->concealment_method; + + if ( st->core == TCX_10_CORE ) + { + *temp_concealment_method = TCX_TONAL; + } + } + + /* get the starting location of the subframe in the frame */ + if ( st->core == TCX_10_CORE ) + { + st->hPlcInfo->subframe = frame_cnt * L_frameTCX_glob; + } + } + + /* PLC: [TCX: Tonal Concealment] */ + /* PLC: [TCX: Fade-out] + * PLC: Fade out to white noise */ + if ( st->hTonalMDCTConc != NULL ) + { + if ( !bfi && st->element_mode != IVAS_CPE_MDCT ) + { + TonalMDCTConceal_SaveFreqSignal( st->hTonalMDCTConc, x, L_frameTCX, L_frame, gainlpc2, infoIGFStartLine ); + } + else if ( bfi ) + { + + if ( !st->enablePlcWaveadjust || ( *temp_concealment_method == TCX_TONAL ) ) + { + /* set f to 1 to not fade out */ + /* set f to 0 to immediately switch to white noise */ + if ( st->tcxonly && ( st->element_mode != IVAS_CPE_MDCT || MCT_flag ) ) + { + f = 1.0f; + } + else + { + f = hTcxDec->cummulative_damping_tcx; + } + + if ( ( frame_cnt == 0 ) && ( L_frameTCX == hTcxDec->L_frameTCX >> 1 ) && ( st->tcxonly ) && ( !st->tonal_mdct_plc_active ) && ( st->nbLostCmpt == 1 ) && ( hTcxCfg->tcx_last_overlap_mode != FULL_OVERLAP ) && ( hTcxCfg->tcx_curr_overlap_mode != FULL_OVERLAP ) ) + { + E_2ndlast = E_last = EPSILON; + if ( st->element_mode > EVS_MONO ) + { + for ( i = 0; i < L_frameTCX; i = i + 2 ) + { + E_2ndlast += st->hTonalMDCTConc->lastBlockData.spectralData[i] * st->hTonalMDCTConc->lastBlockData.spectralData[i]; + E_last += st->hTonalMDCTConc->lastBlockData.spectralData[i + 1] * st->hTonalMDCTConc->lastBlockData.spectralData[i + 1]; + } + } + else + { + for ( i = 0; i < infoIGFStartLine; i = i + 2 ) + { + E_2ndlast += st->hTonalMDCTConc->lastBlockData.spectralData[i] * st->hTonalMDCTConc->lastBlockData.spectralData[i]; + E_last += st->hTonalMDCTConc->lastBlockData.spectralData[i + 1] * st->hTonalMDCTConc->lastBlockData.spectralData[i + 1]; + } + } + tmp2 = E_2ndlast / E_last; + + /* replace higher energy TCX5 frame by lower one to avoid energy fluctuation */ + if ( tmp2 > 2 ) + { + if ( st->element_mode > EVS_MONO ) + { + for ( i = 0; i < L_frameTCX; i = i + 2 ) + { + st->hTonalMDCTConc->lastBlockData.spectralData[i] = st->hTonalMDCTConc->lastBlockData.spectralData[i + 1]; + } + } + else + { + for ( i = 0; i < infoIGFStartLine; i = i + 2 ) + { + st->hTonalMDCTConc->lastBlockData.spectralData[i] = st->hTonalMDCTConc->lastBlockData.spectralData[i + 1]; + } + } + } + else if ( tmp2 < 0.5 ) + { + if ( st->element_mode > EVS_MONO ) + { + for ( i = 0; i < L_frameTCX; i = i + 2 ) + { + st->hTonalMDCTConc->lastBlockData.spectralData[i + 1] = st->hTonalMDCTConc->lastBlockData.spectralData[i]; + } + } + else + { + for ( i = 0; i < infoIGFStartLine; i = i + 2 ) + { + st->hTonalMDCTConc->lastBlockData.spectralData[i + 1] = st->hTonalMDCTConc->lastBlockData.spectralData[i]; + } + } + } + } + + noiseTiltFactor = 1.0f; + tcxGetNoiseFillingTilt( A, L_frame, ( total_brate >= ACELP_13k20 && !st->rf_flag ), &noiseTiltFactor ); + + if ( st->element_mode == IVAS_CPE_MDCT && !MCT_flag ) + { + TonalMDCTConceal_InsertNoise( st->hTonalMDCTConc, x, st->tonal_mdct_plc_active, &st->seed_tcx_plc, noiseTiltFactor, f, concealment_noise, hTcxDec->CngLevelBackgroundTrace_bfi, infoIGFStartLine ); + } + else + { + TonalMDCTConceal_InsertNoise( st->hTonalMDCTConc, x, st->tonal_mdct_plc_active, &st->seed_tcx_plc, noiseTiltFactor, f, NULL, hTcxDec->CngLevelBackgroundTrace_bfi, infoIGFStartLine ); + } + } + } + } + + /*------------------------- SPLIT 2 noise filling ------------------------*/ + if ( !bfi ) + { + if ( st->element_mode == IVAS_CPE_MDCT ) + { + v_multc( x, gain_tcx, x, L_spec ); + } + } + + if ( L_spec < L_frame ) + { + set_zero( x + L_spec, L_frame - L_spec ); + } + else if ( L_spec > L_frameTCX ) + { + set_zero( x + L_frameTCX, L_spec - L_frameTCX ); + } + + if ( bfi && ( !st->enablePlcWaveadjust || ( *temp_concealment_method == TCX_TONAL ) ) && st->igf && ( frame_cnt == 0 ) && ( L_frameTCX == hTcxDec->L_frameTCX >> 1 ) && ( st->tcxonly ) && ( !st->tonal_mdct_plc_active ) && ( st->nbLostCmpt == 1 ) && ( hTcxCfg->tcx_last_overlap_mode != FULL_OVERLAP ) && ( hTcxCfg->tcx_curr_overlap_mode != FULL_OVERLAP ) ) + { + IGFDecCopyLPCFlatSpectrum( st->hIGFDec, x, IGF_GRID_LB_SHORT ); + /* also replace flat spectrum for the second TCX10 sub frame */ + IGFDecUpdateInfo( st->hIGFDec, 1, IGF_GRID_LB_SHORT ); + IGFDecCopyLPCFlatSpectrum( st->hIGFDec, x, IGF_GRID_LB_SHORT ); + IGFDecUpdateInfo( st->hIGFDec, 0, IGF_GRID_LB_SHORT ); + mvs2s( st->hIGFDec->igfData.igf_curr_subframe[0][0], st->hIGFDec->igfData.igf_curr_subframe[1][0], IGF_MAX_SFB ); + } + else if ( bfi && st->igf && ( frame_cnt == 0 ) && ( L_frameTCX == hTcxDec->L_frameTCX >> 1 ) ) + { + /* copy second to first subframe */ + IGFDecReplicateTCX10State( st->hIGFDec ); + } + + if ( st->element_mode != EVS_MONO ) + { + if ( bfi ) + { + nf_seed = st->seed_tcx_plc; + } + else if ( nf_seed == 0 ) + { + nf_seed = *st->hIGFDec->igfData.igfInfo.nfSeed; + } + } + + if ( st->igf ) + { + *st->hIGFDec->igfData.igfInfo.nfSeed = (int16_t) ( nf_seed * 31821L + 13849L ); + } + + return; +} + + +/*-------------------------------------------------------------------* + * decoder_tcx_noiseshaping_igf() + * + * TCX: FDNS and IGF application + *-------------------------------------------------------------------*/ + +void decoder_tcx_noiseshaping_igf( + Decoder_State *st, /* i/o: coder memory state */ + const int16_t L_spec, + const int16_t L_frame, + const int16_t L_frameTCX, + const int16_t left_rect, + float x[], + const float gainlpc2[], + int16_t *temp_concealment_method, + const int16_t bfi /* i : Bad frame indicator */ +) +{ + TCX_DEC_HANDLE hTcxDec = st->hTcxDec; + + /*-----------------------------------------------------------* + * Noise shaping in frequency domain (1/Wz) * + *-----------------------------------------------------------*/ + + if ( st->igf && ( !bfi || ( st->element_mode == IVAS_CPE_MDCT && st->prev_bfi ) ) ) + { + if ( ( L_frame == st->L_frame >> 1 ) && ( st->tcxonly ) ) + { + IGFDecCopyLPCFlatSpectrum( st->hIGFDec, x, IGF_GRID_LB_SHORT ); + } + else + { + IGFDecCopyLPCFlatSpectrum( st->hIGFDec, x, ( st->last_core == ACELP_CORE ) ? IGF_GRID_LB_TRAN : IGF_GRID_LB_NORM ); + } + } + /* LPC gains already available */ + + if ( st->element_mode != IVAS_CPE_MDCT && ( !st->enablePlcWaveadjust || !bfi || ( *temp_concealment_method == TCX_TONAL ) ) ) + { + mdct_noiseShaping( x, L_frame, gainlpc2, FDNS_NPTS ); + + if ( !bfi ) + { + v_multc( x + L_frame, gainlpc2[FDNS_NPTS - 1], x + L_frame, L_spec - L_frame ); + } + + set_zero( x + L_spec, L_frameTCX - L_spec ); + } + + /* PLC: [TCX: Tonal Concealment] */ + if ( bfi && st->tonal_mdct_plc_active && st->element_mode != IVAS_CPE_MDCT ) + { + TonalMDCTConceal_Apply( st->hTonalMDCTConc, x, st->hTcxCfg->psychParamsCurrent ); + } + + if ( st->hTonalMDCTConc != NULL && st->element_mode != IVAS_CPE_MDCT ) + { + TonalMDCTConceal_UpdateState( st->hTonalMDCTConc, L_frameTCX, ( hTcxDec->tcxltp_last_gain_unmodified > 0 ) ? st->old_fpitch : 0, bfi, bfi && st->tonal_mdct_plc_active ); + } + + if ( st->enablePlcWaveadjust ) + { + /* spectrum concealment */ + if ( bfi && *temp_concealment_method == TCX_NONTONAL ) + { + concealment_decode( st->core, x, st->hPlcInfo ); + } + + /* update spectrum buffer, tonality flag, etc. */ + concealment_update( bfi, st->core, st->tonality_flag, x, st->hPlcInfo ); + } + + /*-----------------------------------------------------------* + * IGF * + *-----------------------------------------------------------*/ + + if ( st->igf && !( ( L_frame == st->L_frame >> 1 ) && st->tcxonly ) ) + { + if ( st->element_mode != IVAS_CPE_MDCT ) + { + IGFDecApplyMono( st->hIGFDec, x, ( st->last_core == ACELP_CORE || ( left_rect && bfi ) ) ? IGF_GRID_LB_TRAN : IGF_GRID_LB_NORM, bfi, st->element_mode ); + } + } + + if ( st->igf && ( ( L_frame == st->L_frame >> 1 ) && st->tcxonly ) ) + { + if ( st->element_mode != IVAS_CPE_MDCT ) + { + IGFDecApplyMono( st->hIGFDec, x, IGF_GRID_LB_SHORT, bfi, st->element_mode ); + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * decoder_tcx_tns() + * + * TCX: TNS application + *-------------------------------------------------------------------*/ + +void decoder_tcx_tns( + Decoder_State *st, /* i/o: coder memory state */ + const int16_t L_frame_glob, /* i : frame length */ + const int16_t L_spec, + const int16_t L_frame, + const int16_t L_frameTCX, + float x[N_MAX], + const int16_t fUseTns, /* i : flag that is set if TNS data is present */ + STnsData *tnsData, + const int16_t bfi, /* i : Bad frame indicator */ + const int16_t frame_cnt, /* i : frame counter in the super frame */ + const int16_t whitenedDomain ) +{ + int16_t index, isTCX5, L; + TCX_CONFIG_HANDLE hTcxCfg = st->hTcxCfg; + + index = hTcxCfg->tcx_last_overlap_mode; /* backup last TCX overlap mode */ + + isTCX5 = 0; + L = L_frameTCX; + + if ( ( L_frame == st->L_frame >> 1 ) && st->tcxonly ) + { + if ( frame_cnt && !bfi && st->last_core != ACELP_CORE ) + { + /* fix sub-window overlap */ + hTcxCfg->tcx_last_overlap_mode = hTcxCfg->tcx_curr_overlap_mode; + } + + if ( ( hTcxCfg->fIsTNSAllowed && fUseTns != 0 && bfi != 1 ) || ( L_spec > L_frameTCX ) ) + { + L = L_spec; + } + + if ( ( ( !bfi ) && ( ( hTcxCfg->tcx_last_overlap_mode != FULL_OVERLAP ) || + ( ( hTcxCfg->tcx_curr_overlap_mode == FULL_OVERLAP ) && ( frame_cnt == 0 ) && ( index == 0 ) ) ) ) || + ( ( bfi ) && ( ( hTcxCfg->tcx_last_overlap_mode != FULL_OVERLAP ) && + !( hTcxCfg->tcx_curr_overlap_mode == FULL_OVERLAP ) ) ) ) + { + isTCX5 = 1; + + tcx5SpectrumDeinterleaving( L >> 1, x ); + } + } + + + /*-----------------------------------------------------------* + * Temporal Noise Shaping Synthesis * + *-----------------------------------------------------------*/ + + if ( hTcxCfg->fIsTNSAllowed && fUseTns != 0 && bfi != 1 && tnsData->tnsOnWhitenedSpectra == whitenedDomain ) + { + /* Apply TNS to get the reconstructed signal */ + SetTnsConfig( hTcxCfg, L_frame_glob == st->L_frame, ( st->last_core == ACELP_CORE ) && ( frame_cnt == 0 ) ); + + if ( ( L_frame == st->L_frame >> 1 ) && st->tcxonly && isTCX5 ) + { + tcx5TnsGrouping( L >> 1, hTcxCfg->tnsConfig[0][0].iFilterBorders[0] >> 1, x ); + } + + ApplyTnsFilter( hTcxCfg->pCurrentTnsConfig, tnsData, x, 0 ); + + if ( ( L_frame == st->L_frame >> 1 ) && st->tcxonly && isTCX5 ) + { + if ( st->element_mode == EVS_MONO || L_spec < L_frameTCX ) /* todo: this is temporary to maintain EVS BE, this is a bug and should be fixed also for EVS (see issue 13) */ + { + tcx5TnsUngrouping( L_frameTCX >> 1, hTcxCfg->tnsConfig[0][0].iFilterBorders[0] >> 1, x, DEC ); + } + else + { + tcx5TnsUngrouping( L >> 1, hTcxCfg->tnsConfig[0][0].iFilterBorders[0] >> 1, x, DEC ); + } + } + } + + if ( whitenedDomain && isTCX5 ) + { + tcx5SpectrumInterleaving( L >> 1, x ); + } + + /* restore index */ + if ( ( L_frame == st->L_frame >> 1 ) && st->tcxonly && frame_cnt && !bfi && st->last_core != ACELP_CORE ) + { + /* restore sub-window overlap */ + hTcxCfg->tcx_last_overlap_mode = index; + } + + return; +} + + +/*-------------------------------------------------------------------* + * decoder_tcx_imdct() + * + * TCX: ITF and IMDCT + *-------------------------------------------------------------------*/ + +void decoder_tcx_imdct( + Decoder_State *st, /* i/o: coder memory state */ + const int16_t L_frame_glob, /* i : frame length */ + const int16_t L_frameTCX_glob, + const int16_t L_spec, + const int16_t tcx_offset, + const int16_t tcx_offsetFB, + const int16_t L_frame, + const int16_t L_frameTCX, + const int16_t left_rect, + float x[N_MAX], + float xn_buf[], + const uint16_t kernelType, /* i : TCX transform kernel type */ + const int16_t fUseTns, /* i : flag that is set if TNS data is present */ + float synth[], /* i/o: synth[-M..L_frame] */ + float synthFB[], + const int16_t bfi, /* i : Bad frame indicator */ + const int16_t frame_cnt, /* i : frame counter in the super frame */ + const int16_t sba_dirac_stereo_flag /* i : signal stereo output for SBA DirAC */ +) +{ + int16_t j, L, overlap, curr_order, startLine, endLine, isTCX5; + int16_t overlapFB; + float x_tmp[L_FRAME_PLUS]; + float xn_bufFB[L_MDCT_OVLP_MAX + L_FRAME_PLUS + L_MDCT_OVLP_MAX]; + float acelp_zir[L_FRAME_MAX / 2]; + float x_itf[N_MAX_TCX - IGF_START_MN]; + float A_itf[ITF_MAX_FILTER_ORDER + 1]; + float predictionGain; + int16_t index, proc; + TCX_LTP_DEC_HANDLE hTcxLtpDec = st->hTcxLtpDec; + TCX_DEC_HANDLE hTcxDec = st->hTcxDec; + TCX_CONFIG_HANDLE hTcxCfg = st->hTcxCfg; + + /*-----------------------------------------------------------------* + * Initializations + *-----------------------------------------------------------------*/ + + /* Init lengths */ + overlap = hTcxCfg->tcx_mdct_window_length; + overlapFB = hTcxCfg->tcx_mdct_window_lengthFB; + + index = hTcxCfg->tcx_last_overlap_mode; /* backup last TCX overlap mode */ + if ( ( L_frame == st->L_frame >> 1 ) && st->tcxonly && frame_cnt && !bfi && st->last_core != ACELP_CORE ) + { + /* fix sub-window overlap */ + hTcxCfg->tcx_last_overlap_mode = hTcxCfg->tcx_curr_overlap_mode; + } + + if ( st->igf ) + { + proc = st->hIGFDec->flatteningTrigger; + + if ( proc && fUseTns != 0 ) + { + proc = 0; + } + + if ( proc ) + { + startLine = st->hIGFDec->infoIGFStartLine; + endLine = st->hIGFDec->infoIGFStopLine; + curr_order = 0; + predictionGain = 0; + L = L_frameTCX; + isTCX5 = 0; + + /* interleave again for ITF */ + if ( ( L_frame == st->L_frame >> 1 ) && st->tcxonly ) + { + if ( ( hTcxCfg->fIsTNSAllowed && fUseTns != 0 && bfi != 1 ) || ( L_spec > L_frameTCX ) ) + { + L = L_spec; + } + + if ( ( ( !bfi ) && ( ( hTcxCfg->tcx_last_overlap_mode != FULL_OVERLAP ) || + ( ( hTcxCfg->tcx_curr_overlap_mode == FULL_OVERLAP ) && ( frame_cnt == 0 ) && ( index == 0 ) ) ) ) || + ( ( bfi ) && ( ( hTcxCfg->tcx_last_overlap_mode != FULL_OVERLAP ) && + !( hTcxCfg->tcx_curr_overlap_mode == FULL_OVERLAP ) ) ) ) + { + isTCX5 = 1; + + tcx5SpectrumInterleaving( L >> 1, x ); + } + } + + for ( j = startLine; j < endLine; j++ ) + { + if ( st->hIGFDec->flag_sparse[j - IGF_START_MN] == 2 ) + { + x_itf[j - IGF_START_MN] = x[j]; + x[j] = st->hIGFDec->virtualSpec[j - IGF_START_MN]; + } + } + + ITF_Detect( x + IGF_START_MN, startLine, endLine, 8 /*maxOrder*/, A_itf, &predictionGain, &curr_order ); + + ITF_Apply( x, startLine, endLine, A_itf, curr_order ); + + for ( j = startLine; j < endLine; j++ ) + { + if ( st->hIGFDec->flag_sparse[j - IGF_START_MN] == 2 ) + { + x[j] = x_itf[j - IGF_START_MN]; + } + } + + /* deinterleave */ + if ( isTCX5 ) + { + tcx5SpectrumDeinterleaving( L >> 1, x ); + } + } + } + + /*-----------------------------------------------------------* + * Prepare OLA buffer after waveadjustment. * + * Compute inverse MDCT of x[]. * + *-----------------------------------------------------------*/ + + + if ( st->element_mode == IVAS_CPE_MDCT ) + { + set_f( x_tmp, 0.0f, L_FRAME_PLUS ); + mvr2r( x, x_tmp, min( L_FRAME48k, max( L_spec, max( L_frame, L_frameTCX ) ) ) ); + mvr2r( x, xn_bufFB, min( L_FRAME48k, max( L_spec, max( L_frame, L_frameTCX ) ) ) ); + } + else if ( st->element_mode == EVS_MONO ) + { + mvr2r( x, xn_bufFB, max( L_spec, max( L_frame, L_frameTCX ) ) ); + } + else + { + mvr2r( x, x_tmp, max( L_spec, max( L_frame, L_frameTCX ) ) ); + mvr2r( x, xn_bufFB, max( L_spec, max( L_frame, L_frameTCX ) ) ); + } + + if ( st->igf ) + { + set_zero( xn_bufFB + st->hIGFDec->infoIGFStartLine, L_frameTCX - st->hIGFDec->infoIGFStartLine ); + } + + if ( st->element_mode != IVAS_CPE_DFT && !sba_dirac_stereo_flag ) + { + IMDCT( xn_bufFB, hTcxDec->syn_Overl, hTcxDec->syn_Overl_TDAC, xn_buf, hTcxCfg->tcx_aldo_window_1_trunc, hTcxCfg->tcx_aldo_window_2, + hTcxCfg->tcx_mdct_window_half, hTcxCfg->tcx_mdct_window_minimum, hTcxCfg->tcx_mdct_window_trans, hTcxCfg->tcx_mdct_window_half_length, hTcxCfg->tcx_mdct_window_min_length, index, + kernelType, left_rect, tcx_offset, overlap, L_frame, L_frameTCX, max( L_frameTCX, L_spec ) >> 1, L_frame_glob, frame_cnt, bfi, st->hHQ_core->old_outLB, 0, st, 0, acelp_zir ); + } + + /* Generate additional comfort noise to mask potential coding artefacts */ + if ( st->flag_cna && st->element_mode != IVAS_CPE_TD && st->element_mode != IVAS_CPE_DFT && !st->cna_dirac_flag ) + { + generate_masking_noise_mdct( x, st->hFdCngDec->hFdCngCom ); + } + + if ( st->element_mode == IVAS_CPE_DFT || sba_dirac_stereo_flag ) + { + mvr2r( x, xn_bufFB, max( L_spec, max( L_frame, L_frameTCX ) ) ); + + IMDCT( xn_bufFB, hTcxDec->syn_Overl, hTcxDec->syn_Overl_TDAC, xn_buf, hTcxCfg->tcx_aldo_window_1_trunc, hTcxCfg->tcx_aldo_window_2, hTcxCfg->tcx_mdct_window_half, hTcxCfg->tcx_mdct_window_minimum, hTcxCfg->tcx_mdct_window_trans, hTcxCfg->tcx_mdct_window_half_length, hTcxCfg->tcx_mdct_window_min_length, index, + kernelType, left_rect, tcx_offset, overlap, L_frame, L_frameTCX, max( L_frameTCX, L_spec ) >> 1, L_frame_glob, frame_cnt, bfi, st->hHQ_core->old_outLB, 0, st, 0, acelp_zir ); + } + + if ( st->element_mode != EVS_MONO ) + { + IMDCT( x_tmp, hTcxDec->syn_OverlFB, hTcxDec->syn_Overl_TDACFB, xn_bufFB, hTcxCfg->tcx_aldo_window_1_FB_trunc, hTcxCfg->tcx_aldo_window_2_FB, + hTcxCfg->tcx_mdct_window_halfFB, hTcxCfg->tcx_mdct_window_minimumFB, hTcxCfg->tcx_mdct_window_transFB, hTcxCfg->tcx_mdct_window_half_lengthFB, hTcxCfg->tcx_mdct_window_min_lengthFB, index, + kernelType, left_rect, tcx_offsetFB, overlapFB, L_frameTCX, L_frameTCX, max( L_frameTCX, L_spec ) >> 1, L_frameTCX_glob, frame_cnt, bfi, st->hHQ_core->old_out, 1, st, FSCALE_DENOM * L_frameTCX_glob / L_frame_glob, acelp_zir ); + } + else + { + IMDCT( x, hTcxDec->syn_OverlFB, hTcxDec->syn_Overl_TDACFB, xn_bufFB, hTcxCfg->tcx_aldo_window_1_FB_trunc, hTcxCfg->tcx_aldo_window_2_FB, hTcxCfg->tcx_mdct_window_halfFB, hTcxCfg->tcx_mdct_window_minimumFB, hTcxCfg->tcx_mdct_window_transFB, hTcxCfg->tcx_mdct_window_half_lengthFB, hTcxCfg->tcx_mdct_window_min_lengthFB, index, + kernelType, left_rect, tcx_offsetFB, overlapFB, L_frameTCX, L_frameTCX, max( L_frameTCX, L_spec ) >> 1, L_frameTCX_glob, frame_cnt, bfi, st->hHQ_core->old_out, 1, st, FSCALE_DENOM * L_frameTCX_glob / L_frame_glob, acelp_zir ); + } + + /* PLC: [TCX: Tonal Concealment] */ + if ( !bfi ) + { + st->second_last_tns_active = st->last_tns_active; + st->last_tns_active = hTcxCfg->fIsTNSAllowed & fUseTns; + hTcxDec->tcxltp_third_last_pitch = hTcxDec->tcxltp_second_last_pitch; + hTcxDec->tcxltp_second_last_pitch = st->old_fpitch; + st->old_fpitch = hTcxLtpDec->tcxltp_pitch_int + hTcxLtpDec->tcxltp_pitch_fr / (float) st->pit_res_max; + + if ( st->element_mode == IVAS_CPE_MDCT ) + { + st->old_fpitch *= (float) L_frame_glob / (float) L_FRAME; + } + + if ( st->element_mode > EVS_MONO ) + { + st->old_fpitchFB = st->old_fpitch * (float) L_frameTCX_glob / (float) L_frame_glob; + } + else + { + st->old_fpitchFB = st->old_fpitch * (float) L_frameTCX / (float) L_frame; + } + } + + /* Update old_syn_overl */ + if ( !hTcxCfg->last_aldo ) + { + mvr2r( xn_buf + L_frame, hTcxDec->syn_Overl, overlap ); + mvr2r( xn_bufFB + L_frameTCX, hTcxDec->syn_OverlFB, overlapFB ); + } + + /* Output */ + mvr2r( xn_buf + ( overlap >> 1 ) - tcx_offset, synth, L_frame_glob ); + mvr2r( xn_bufFB + ( overlapFB >> 1 ) - tcx_offsetFB, synthFB, L_frameTCX_glob ); + + return; +} + + +/*-------------------------------------------------------------------* + * init_tcx_info() + * + * Initialize lengths for TCX processing, update IGF subframe info + *-------------------------------------------------------------------*/ + +void init_tcx_info( + Decoder_State *st, /* i/o: coder memory state */ + const int16_t L_frame_glob, /* i : global frame length */ + const int16_t L_frameTCX_glob, /* i : FB global frame length */ + const int16_t frame_cnt, /* i : frame counter in the super_frame */ + const int16_t bfi, /* i : bad frame indicator */ + int16_t *tcx_offset, /* o : folding point offset relative to the end of the previous frame */ + int16_t *tcx_offsetFB, /* o : FB folding point offset relative to the end of the previous frame*/ + int16_t *L_frame, /* o : frame length */ + int16_t *L_frameTCX, /* o : TCX frame length */ + int16_t *left_rect, /* o : left part is rectangular */ + int16_t *L_spec /* o : spectrum length */ +) +{ + TCX_DEC_HANDLE hTcxDec = st->hTcxDec; + TCX_CONFIG_HANDLE hTcxCfg = st->hTcxCfg; + + /* Init lengths */ + *tcx_offset = hTcxCfg->tcx_offset; + *tcx_offsetFB = hTcxCfg->tcx_offsetFB; + + if ( bfi ) + { + /* PLC: [TCX: Memory update] + * PLC: Init buffers */ + + assert( st->L_frame_past > 0 ); + *L_frame = st->L_frame_past; + *L_frameTCX = st->L_frameTCX_past; + + *left_rect = hTcxDec->prev_widow_left_rect; + + if ( *left_rect ) + { + *tcx_offset = hTcxCfg->lfacNext; + *tcx_offsetFB = hTcxCfg->lfacNextFB; + *L_spec += st->hTcxCfg->tcx_coded_lines >> 2; + } + } + else + { + if ( frame_cnt == 0 && st->last_core == ACELP_CORE ) + { + if ( !st->prev_bfi ) + { + hTcxCfg->last_aldo = 0; + } + + /* if past frame is ACELP */ + *L_frame = L_frame_glob + *tcx_offset; + *L_frameTCX = L_frameTCX_glob + *tcx_offsetFB; + if ( st->last_core == st->last_core_from_bs ) + { + /* case: last frame was lost and concealed as CNG */ + /* using the longer transition spec length causes reading of uninitialized data */ + *L_spec += st->hTcxCfg->tcx_coded_lines >> 2; + } + + assert( hTcxCfg->lfacNext <= 0 ); + *L_frame -= hTcxCfg->lfacNext; + *L_frameTCX -= hTcxCfg->lfacNextFB; + *tcx_offset = hTcxCfg->lfacNext; + *tcx_offsetFB = hTcxCfg->lfacNextFB; + + *left_rect = 1; + hTcxDec->prev_widow_left_rect = 1; + } + else + { + *L_frame = L_frame_glob; + *L_frameTCX = L_frameTCX_glob; + *left_rect = 0; + hTcxDec->prev_widow_left_rect = 0; + } + + st->L_frame_past = *L_frame; + st->L_frameTCX_past = *L_frameTCX; + } + + if ( st->igf ) + { + if ( ( *L_frame == st->L_frame >> 1 ) && ( st->tcxonly ) ) + { + IGFDecUpdateInfo( st->hIGFDec, frame_cnt, IGF_GRID_LB_SHORT ); + } + else + { + IGFDecUpdateInfo( st->hIGFDec, frame_cnt, ( st->last_core == ACELP_CORE || ( *left_rect && st->bfi ) ) ? IGF_GRID_LB_TRAN : IGF_GRID_LB_NORM ); + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * decoder_tcx_IGF_mono() + * + * TCX: apply mono IGF + *-------------------------------------------------------------------*/ + +void decoder_tcx_IGF_mono( + Decoder_State *st, /* i/o: coder memory state */ + float x[], /* o : de-quatized coefficients */ + const int16_t L_frame, /* i : frame length */ + const int16_t left_rect, /* i : left part is rectangular */ + const int16_t bfi, /* i : bad frame indicator */ + const int16_t frame_cnt /* i : frame counter in the super_frame */ +) +{ + int16_t igfGridIdx; + + IGFDecUpdateInfo( st->hIGFDec, frame_cnt, ( L_frame == st->L_frame >> 1 ) && ( st->tcxonly ) ? IGF_GRID_LB_SHORT : ( st->last_core == ACELP_CORE || left_rect ) ? IGF_GRID_LB_TRAN + : IGF_GRID_LB_NORM ); + + if ( st->igf ) + { + igfGridIdx = IGF_GRID_LB_SHORT; + /*st->hIGFDec.igfData.igfInfo.nfSeed = (int16_t)(*nf_seed * 31821L + 13849L);*/ + if ( !( L_frame == st->L_frame >> 1 ) && st->tcxonly ) + { + igfGridIdx = ( st->last_core == ACELP_CORE || ( left_rect && bfi ) ) ? IGF_GRID_LB_TRAN : IGF_GRID_LB_NORM; + } + + IGFDecApplyMono( st->hIGFDec, x, igfGridIdx, bfi, st->element_mode ); + } + + return; +} + + +/*-------------------------------------------------------------------* + * decoder_tcx_IGF_stereo() + * + * TCX: apply stereo IGF processing + *-------------------------------------------------------------------*/ + +void decoder_tcx_IGF_stereo( + Decoder_State **sts, /* i/o: coder memory states */ + STEREO_MDCT_DEC_DATA_HANDLE hStereoMdct, /* i/o: MDCT stereo structure */ + int16_t ms_mask[NB_DIV][MAX_SFB], /* i : bandwise MS mask */ + float *x[CPE_CHANNELS][NB_DIV], /* o : de-quatized coefficients */ + const int16_t L_frame, /* i : frame length */ + const int16_t left_rect, /* i : left part is rectangular */ + const int16_t k, /* i : Subframe index */ + const int16_t bfi, /* i : bad frame indicator */ + const int16_t MCT_flag /* i : hMCT handle allocated (1) or not (0) */ +) +{ + int16_t coreMsMask[N_MAX]; + STEREO_MDCT_BAND_PARAMETERS *sfbConf; + int16_t core, sfb, igfGridIdx; + + core = sts[0]->core; + + /* assumptions: stereo filling was already done on the flattened spectra + * IGF region is always coded M/S, never L/R (to be done in the encoder) + * for residual bands with stereo filling infoTcxNoise is set to zero + * both channels have the same IGF configuration + */ + + + /* initialization */ + sfbConf = ( core == TCX_20_CORE ) ? &hStereoMdct->stbParamsTCX20 : &hStereoMdct->stbParamsTCX10; + + if ( sts[0]->last_core == ACELP_CORE ) + { + sfbConf = &hStereoMdct->stbParamsTCX20afterACELP; + } + + /* create line wise ms mask for the core bands */ + set_s( coreMsMask, 0, N_MAX ); + + for ( sfb = 0; sfb < sfbConf->sfbCnt; sfb++ ) + { + set_s( &coreMsMask[sfbConf->sfbOffset[sfb]], ms_mask[k][sfb], sfbConf->sfbOffset[sfb + 1] - sfbConf->sfbOffset[sfb] ); + } + + IGFDecUpdateInfo( sts[0]->hIGFDec, k, ( L_frame == sts[0]->L_frame >> 1 ) && ( sts[0]->tcxonly ) ? IGF_GRID_LB_SHORT : ( sts[0]->last_core == ACELP_CORE || left_rect ) ? IGF_GRID_LB_TRAN + : IGF_GRID_LB_NORM ); + + IGFDecUpdateInfo( sts[1]->hIGFDec, k, ( L_frame == sts[1]->L_frame >> 1 ) && ( sts[1]->tcxonly ) ? IGF_GRID_LB_SHORT : ( sts[1]->last_core == ACELP_CORE || left_rect ) ? IGF_GRID_LB_TRAN + : IGF_GRID_LB_NORM ); + + if ( sts[0]->igf ) + { + igfGridIdx = IGF_GRID_LB_SHORT; + if ( !( L_frame == sts[0]->L_frame >> 1 ) && ( sts[0]->tcxonly ) ) + { + igfGridIdx = ( sts[0]->last_core == ACELP_CORE || ( left_rect && bfi ) ) ? IGF_GRID_LB_TRAN : IGF_GRID_LB_NORM; + } + + IGFDecApplyStereo( sts[0]->hIGFDec, sts[1]->hIGFDec, x[0][k], x[1][k], igfGridIdx, coreMsMask, hStereoMdct->IGFStereoMode[k] == SMDCT_BW_MS, bfi, MCT_flag ); + } + + return; +} diff --git a/lib_dec/dec_tran.c b/lib_dec/dec_tran.c new file mode 100644 index 0000000000000000000000000000000000000000..0e105703e28b2cdd8c64b58a008495edc5c9c448 --- /dev/null +++ b/lib_dec/dec_tran.c @@ -0,0 +1,197 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * decod_tran() + * + * Decode transition (TC) frames + *-------------------------------------------------------------------*/ + +void decod_tran( + Decoder_State *st, /* i/o: decoder static memory */ + const int16_t L_frame, /* i : length of the frame */ + const int16_t tc_subfr, /* i : TC subframe index */ + const float *Aq, /* i : LP filter coefficient */ + const float Es_pred, /* i : predicted scaled innov. energy */ + float *pitch_buf, /* o : floating pitch values for each subframe*/ + float *voice_factors, /* o : voicing factors */ + float *exc, /* i/o: adapt. excitation exc */ + float *exc2, /* i/o: adapt. excitation/total exc */ + float *bwe_exc, /* i/o: excitation for SWB TBE */ + int16_t *unbits, /* i/o: number of unused bits */ + const int16_t sharpFlag, /* i : formant sharpening flag */ + float *gain_buf /* o : floating pitch gain for each subframe */ +) +{ + int16_t T0, T0_frac, T0_min, T0_max; /* integer pitch variables */ + float gain_code; /* Quantized algebraic codeebook gain */ + float norm_gain_code; /* normalized algebraic codeebook gain */ + float gain_pit = 0; /* Quantized pitch gain */ + float voice_fac; /* Voicing factor */ + float gain_inov; /* inovation gain */ + float code[L_SUBFR]; /* algebraic codevector */ + const float *p_Aq; /* pointer to lp filter coefficient */ + float *pt_pitch; /* pointer to floating pitch */ + int16_t i_subfr, i; /* tmp variables */ + int16_t position; /* TC related flag */ + float gain_preQ = 0; /* Gain of prequantizer excitation */ + float code_preQ[L_SUBFR]; /* Prequantizer excitation */ + int16_t Jopt_flag; /* flag indicating zero adaptive contribtuion */ + float norm_gain_preQ; + + gain_preQ = 0; + set_f( code_preQ, 0, L_SUBFR ); + + /*----------------------------------------------------------------* + * ACELP subframe loop + *----------------------------------------------------------------*/ + + p_Aq = Aq; + pt_pitch = pitch_buf; + Jopt_flag = 0; + norm_gain_preQ = 0.0f; + + for ( i_subfr = 0; i_subfr < L_frame; i_subfr += L_SUBFR ) + { + /*------------------------------------------------------------* + * TC : subframe determination & + * adaptive/glottal part of excitation construction + *------------------------------------------------------------*/ + + transition_dec( st, L_frame, i_subfr, tc_subfr, &Jopt_flag, exc, &T0, &T0_frac, &T0_min, &T0_max, &pt_pitch, &position, bwe_exc ); + + /*-----------------------------------------------------------------* + * Transform domain contribution decoding - active frames + *-----------------------------------------------------------------*/ + + if ( st->core_brate >= MIN_BRATE_AVQ_EXC ) + { + transf_cdbk_dec( st, 0, i_subfr, Es_pred, 0, &gain_preQ, &norm_gain_preQ, code_preQ, unbits ); + } + + /*-----------------------------------------------------------------* + * ACELP codebook search + pitch sharpening + *-----------------------------------------------------------------*/ + + inov_decode( st, st->core_brate, 0, L_frame, sharpFlag, i_subfr, p_Aq, st->tilt_code, *pt_pitch, code, L_SUBFR ); + + /*-----------------------------------------------------------------* + * De-quantize the gains + * Update tilt of code: 0.0 (unvoiced) to 0.5 (voiced) + *-----------------------------------------------------------------*/ + + if ( Jopt_flag == 0 ) + { + /* 2/3-bit decoding */ + gain_dec_tc( st, i_subfr, Es_pred, code, &gain_pit, &gain_code, &gain_inov, &norm_gain_code ); + } + else + { + /* 5-bit decoding */ + if ( st->core_brate > ACELP_32k ) + { + gain_dec_SQ( st, i_subfr, code, Es_pred, &gain_pit, &gain_code, &gain_inov, &norm_gain_code ); + } + else + { + gain_dec_mless( st, L_frame, st->coder_type, i_subfr, tc_subfr, code, Es_pred, &gain_pit, &gain_code, &gain_inov, &norm_gain_code ); + } + } + + /* update LP filtered gains for the case of frame erasures */ + lp_gain_updt( i_subfr, gain_pit, norm_gain_code + norm_gain_preQ, &st->lp_gainp, &st->lp_gainc, L_frame ); + + st->tilt_code = est_tilt( exc + i_subfr, gain_pit, code, gain_code, &voice_fac, L_SUBFR, 0 ); + + /*----------------------------------------------------------------------* + * Find the total excitation + *----------------------------------------------------------------------*/ + + for ( i = 0; i < L_SUBFR; i++ ) + { + exc2[i + i_subfr] = gain_pit * exc[i + i_subfr]; + exc[i + i_subfr] = exc2[i + i_subfr] + gain_code * code[i]; + } + + /*-----------------------------------------------------------------* + * Add the ACELP pre-quantizer contribution + *-----------------------------------------------------------------*/ + + if ( st->core_brate >= MIN_BRATE_AVQ_EXC ) + { + for ( i = 0; i < L_SUBFR; i++ ) + { + exc2[i + i_subfr] += gain_preQ * code_preQ[i]; + exc[i + i_subfr] += gain_preQ * code_preQ[i]; + } + } + + /*-----------------------------------------------------------------* + * Prepare TBE excitation + *-----------------------------------------------------------------*/ + + prep_tbe_exc( L_frame, L_SUBFR, i_subfr, gain_pit, gain_code, code, voice_fac, &voice_factors[i_subfr / L_SUBFR], bwe_exc, gain_preQ, code_preQ, T0, st->coder_type, st->core_brate, st->element_mode, st->idchan, st->hBWE_TD != NULL, st->tdm_LRTD_flag ); + + /*----------------------------------------------------------------* + * Excitation enhancements (update of total excitation signal) + *----------------------------------------------------------------*/ + + if ( st->core_brate > ACELP_32k ) + { + mvr2r( exc + i_subfr, exc2 + i_subfr, L_SUBFR ); + } + else + { + enhancer( MODE1, st->core_brate, -1, 0, st->coder_type, L_frame, voice_fac, st->stab_fac, norm_gain_code, gain_inov, &st->gc_threshold, code, exc2 + i_subfr, gain_pit, st->dispMem ); + } + + p_Aq += ( M + 1 ); + pt_pitch++; + st->tilt_code_dec[i_subfr / L_SUBFR] = st->tilt_code; + gain_buf[i_subfr / L_SUBFR] = gain_pit; + } + + /* SC-VBR */ + st->prev_gain_pit_dec = gain_pit; + + return; +} diff --git a/lib_dec/dec_uv.c b/lib_dec/dec_uv.c new file mode 100644 index 0000000000000000000000000000000000000000..63c4b1d3bdcffbb529c280865e84b629e68a5399 --- /dev/null +++ b/lib_dec/dec_uv.c @@ -0,0 +1,168 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * decod_unvoiced() + * + * Decode unvoiced (UC) frames + *-------------------------------------------------------------------*/ + +void decod_unvoiced( + Decoder_State *st, /* i/o: decoder static memory */ + const float *Aq, /* i : LP filter coefficient */ + const float Es_pred, /* i : predicted scaled innov. energy */ + const int16_t uc_two_stage_flag, /* i : flag indicating two-stage UC */ + float *tmp_noise, /* o : long term temporary noise energy */ + float *pitch_buf, /* o : floating pitch values for each subframe */ + float *voice_factors, /* o : voicing factors */ + float *exc, /* o : adapt. excitation exc */ + float *exc2, /* o : adapt. excitation/total exc */ + float *bwe_exc, /* i/o: excitation for SWB TBE */ + float *gain_buf /* o : floating pitch gain for each subframe */ +) +{ + float gain_pit = 0; /* Quantized pitch gain */ + float gain_code; /* Quantized algebraic codeebook gain */ + float gain_inov; /* inovation gain */ + float norm_gain_code; /* normalized algebraic codeebook gain */ + float voice_fac; /* Voicing factor */ + float code[L_SUBFR]; /* algebraic codevector */ + int16_t i_subfr; + float *pt_pitch; + const float *p_Aq; + int16_t i; + int16_t index; + float gain_code2; + float code2[L_SUBFR]; + + if ( st->last_ppp_mode_dec == 1 || st->last_nelp_mode_dec == 1 ) + { + /* SC_VBR - reset the decoder, to avoid memory not updated issue for this unrealistic case */ + CNG_reset_dec( st, pitch_buf, voice_factors ); + } + + p_Aq = Aq; /* pointer to interpolated LPC parameters */ + pt_pitch = pitch_buf; /* pointer to the pitch buffer */ + + for ( i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR ) + { + if ( !uc_two_stage_flag ) + { + /*----------------------------------------------------------------* + * Unvoiced subframe processing + *----------------------------------------------------------------*/ + + gaus_dec( st, i_subfr, code, &norm_gain_code, &st->lp_gainp, &st->lp_gainc, &gain_inov, &st->tilt_code, &voice_fac, &gain_pit, pt_pitch, exc, &gain_code, exc2 ); + } + else + { + /*----------------------------------------------------------------* + * Unvoiced subframe processing in two stages + *----------------------------------------------------------------*/ + + /* No adaptive codebook (UC) */ + set_zero( exc + i_subfr, L_SUBFR ); + + *pt_pitch = (float) L_SUBFR; + + /*--------------------------------------------------------------* + * Innovation decoding + *--------------------------------------------------------------*/ + + inov_decode( st, st->core_brate, 0, L_FRAME, 1, i_subfr, p_Aq, st->tilt_code, *pt_pitch, code, L_SUBFR ); + + /*-------------------------------------------------------* + * Generate Gaussian excitation * + *-------------------------------------------------------*/ + + gaus_L2_dec( code2, st->tilt_code, p_Aq, FORMANT_SHARPENING_G1, &( st->seed_acelp ) ); + + /*-----------------------------------------------------------------* + * Gain encoding + *-----------------------------------------------------------------*/ + + index = get_next_indice( st, st->acelp_cfg.gains_mode[i_subfr / L_SUBFR] ); + gain_dec_gacelp_uv( index, code, code2, Es_pred, L_SUBFR, &gain_pit, &gain_code, &gain_code2, &( st->past_gpit ), &norm_gain_code, &gain_inov ); + + st->tilt_code = est_tilt( exc + i_subfr, gain_pit, code, gain_code, &voice_fac, L_SUBFR, 0 ); + + /* update LP filtered gains for the case of frame erasures */ + lp_gain_updt( i_subfr, gain_pit, norm_gain_code, &st->lp_gainp, &st->lp_gainc, L_FRAME ); + + /*-------------------------------------------------------* + * - Find the total excitation. * + *-------------------------------------------------------*/ + + for ( i = 0; i < L_SUBFR; i++ ) + { + exc2[i + i_subfr] = gain_pit * exc[i + i_subfr]; + exc2[i + i_subfr] += gain_code2 * code2[i]; + exc[i + i_subfr] = exc2[i + i_subfr] + gain_code * code[i]; + } + } + + *tmp_noise = norm_gain_code; + + /*----------------------------------------------------------------* + * Excitation enhancements (update of total excitation signal) + *----------------------------------------------------------------*/ + + enhancer( MODE1, st->core_brate, uc_two_stage_flag, 0, UNVOICED, L_FRAME, voice_fac, st->stab_fac, norm_gain_code, gain_inov, &st->gc_threshold, code, exc2 + i_subfr, gain_pit, st->dispMem ); + + voice_factors[i_subfr / L_SUBFR] = 0.0f; + + if ( st->hBWE_TD != NULL ) + { + interp_code_5over2( &exc[i_subfr], &bwe_exc[i_subfr * HIBND_ACB_L_FAC], L_SUBFR ); + } + + p_Aq += ( M + 1 ); + pt_pitch++; + st->tilt_code_dec[i_subfr / L_SUBFR] = st->tilt_code; + } + + /* SC-VBR */ + st->prev_gain_pit_dec = gain_pit; + + set_f( gain_buf, 0, NB_SUBFR ); + + return; +} diff --git a/lib_dec/decision_matrix_dec.c b/lib_dec/decision_matrix_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..e6378ed0a8457187b2e66386128e39e593e809af --- /dev/null +++ b/lib_dec/decision_matrix_dec.c @@ -0,0 +1,569 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "stat_dec.h" +#include "rom_com.h" +#include "prot.h" +#include "wmc_auto.h" + +/*-----------------------------------------------------------------* + * decision_matrix_dec() + * + * ACELP/HQ core selection + * Read ACELP signaling bits from the bitstream + * Set extension layers + *-----------------------------------------------------------------*/ + +void decision_matrix_dec( + Decoder_State *st, /* i/o: decoder state structure */ + int16_t *sharpFlag, /* o : formant sharpening flag */ + int16_t *hq_core_type, /* o : HQ core type */ + int16_t *core_switching_flag /* o : ACELP->HQ switching frame flag */ +) +{ + int16_t start_idx; + int16_t ppp_nelp_mode; + int32_t ind; + int16_t nBits; + int16_t tmp; + + /* init */ + st->core = -1; + st->core_brate = 0; + st->extl = -1; + st->extl_brate = 0; + st->ppp_mode_dec = 0; + st->nelp_mode_dec = 0; + st->igf = 0; + + if ( st->total_brate > ACELP_8k00 ) + { + st->vbr_hw_BWE_disable_dec = 0; + } + + if ( st->mdct_sw == MODE2 ) + { + st->core = HQ_CORE; + } + else + { + if ( st->total_brate == FRAME_NO_DATA || st->total_brate == SID_2k40 ) + { + st->core = ACELP_CORE; + st->core_brate = st->total_brate; + + if ( st->total_brate != FRAME_NO_DATA ) + { + st->cng_type = get_next_indice( st, 1 ); + + if ( st->cng_type == LP_CNG ) + { + st->L_frame = L_FRAME; + + if ( get_next_indice( st, 1 ) == 1 ) + { + st->L_frame = L_FRAME16k; + } + } + else + { + st->bwidth = get_next_indice( st, 2 ); + + if ( get_next_indice( st, 1 ) == 0 ) + { + st->L_frame = L_FRAME; + } + else + { + st->L_frame = L_FRAME16k; + } + } + } + + if ( st->output_Fs >= 32000 && st->bwidth >= SWB ) + { + st->extl = SWB_CNG; + } + + if ( st->total_brate == FRAME_NO_DATA && st->prev_bfi && !st->bfi && st->L_frame > L_FRAME16k ) + { + st->L_frame = st->last_CNG_L_frame; + } + + return; + } + + /* SC-VBR */ + else if ( st->total_brate == PPP_NELP_2k80 ) + { + st->core = ACELP_CORE; + st->core_brate = PPP_NELP_2k80; + st->L_frame = L_FRAME; + st->fscale = sr2fscale( INT_FS_12k8 ); + + if ( st->ini_frame == 0 ) + { + /* avoid switching of internal ACELP Fs in the very first frame */ + st->last_L_frame = st->L_frame; + st->last_core = st->core; + st->last_core_brate = st->core_brate; + st->last_extl = st->extl; + } + + st->vbr_hw_BWE_disable_dec = 1; + + get_next_indice( st, 1 ); + + ppp_nelp_mode = get_next_indice( st, 2 ); + + /* 0 - PPP_NB, 1 - PPP_WB, 2 - NELP_NB, 3 - NELP_WB */ + if ( ppp_nelp_mode == 0 ) + { + st->ppp_mode_dec = 1; + st->coder_type = VOICED; + st->bwidth = NB; + } + else if ( ppp_nelp_mode == 1 ) + { + st->ppp_mode_dec = 1; + st->coder_type = VOICED; + st->bwidth = WB; + } + else if ( ppp_nelp_mode == 2 ) + { + st->nelp_mode_dec = 1; + st->coder_type = UNVOICED; + st->bwidth = NB; + } + else if ( ppp_nelp_mode == 3 ) + { + st->nelp_mode_dec = 1; + st->coder_type = UNVOICED; + st->bwidth = WB; + } + + return; + } + + /*---------------------------------------------------------------------* + * ACELP/HQ core selection + *---------------------------------------------------------------------*/ + + if ( st->total_brate < ACELP_24k40 ) + { + st->core = ACELP_CORE; + } + else if ( st->total_brate >= ACELP_24k40 && st->total_brate <= ACELP_64k ) + { + /* read the ACELP/HQ core selection bit */ + tmp = get_next_indice( st, 1 ); + + if ( tmp == 0 ) + { + st->core = ACELP_CORE; + } + else + { + st->core = HQ_CORE; + } + } + } + + /*-----------------------------------------------------------------* + * Read ACELP signaling bits from the bitstream + *-----------------------------------------------------------------*/ + + if ( st->core == ACELP_CORE ) + { + /* find the section in the ACELP signaling table corresponding to bitrate */ + start_idx = 0; + while ( acelp_sig_tbl[start_idx] != st->total_brate ) + { + start_idx++; + if ( start_idx >= MAX_ACELP_SIG ) + { + st->BER_detect = 1; + start_idx = 0; + break; + } + } + + /* skip the bitrate */ + start_idx += 1; + + /* retrieve the number of bits */ + nBits = (int16_t) acelp_sig_tbl[start_idx++]; + + start_idx += get_next_indice( st, nBits ); + if ( start_idx >= MAX_ACELP_SIG ) + { + ind = 0; + st->BER_detect = 1; + } + else + { + /* retrieve the signaling indice */ + ind = acelp_sig_tbl[start_idx]; + + /* convert signaling indice into signaling information */ + st->coder_type = ind & 0x7; + if ( st->coder_type == LR_MDCT ) + { + st->core = HQ_CORE; + st->bwidth = ( ind >> 3 ) & 0x7; + } + else + { + st->bwidth = ( ind >> 3 ) & 0x7; + *sharpFlag = ( ind >> 6 ) & 0x1; + } + } + + /* detect corrupted signaling (due to bit errors) */ + if ( ( st->BER_detect ) || + ( ind >= 1 << 7 ) || + ( st->total_brate <= ACELP_13k20 && st->bwidth == FB ) || + ( st->total_brate >= ACELP_32k && st->bwidth == NB ) || + ( st->total_brate >= ACELP_32k && !( st->coder_type == GENERIC || st->coder_type == TRANSITION || st->coder_type == INACTIVE ) ) || + ( st->total_brate < ACELP_13k20 && st->bwidth != NB && st->coder_type == LR_MDCT ) || + ( st->total_brate >= ACELP_13k20 && st->coder_type == UNVOICED ) || + ( st->total_brate >= ACELP_13k20 && st->coder_type == AUDIO && st->bwidth == NB ) ) + { + st->BER_detect = 0; + st->bfi = 1; + if ( st->ini_frame == 0 ) + { + st->core = ACELP_CORE; + st->L_frame = L_FRAME; + st->last_core = st->core; + st->last_core_brate = st->core_brate; + } + else if ( st->last_total_brate == -1 ) /* can happen in case of BER when no good frame was received before */ + { + st->coder_type = st->last_coder_type; + st->bwidth = st->last_bwidth; + st->total_brate = st->last_total_brate_ber; + if ( st->last_core == AMR_WB_CORE ) + { + st->core = ACELP_CORE; + st->codec_mode = MODE1; + } + else if ( st->last_core_bfi == TCX_20_CORE || st->last_core_bfi == TCX_10_CORE ) + { + st->core = st->last_core_bfi; + st->codec_mode = MODE2; + } + else + { + st->core = st->last_core; + st->codec_mode = MODE1; + } + st->core_brate = st->last_core_brate; + st->extl = st->last_extl; + st->extl_brate = st->total_brate - st->core_brate; + } + else + { + st->coder_type = st->last_coder_type; + st->bwidth = st->last_bwidth; + st->total_brate = st->last_total_brate; + if ( st->last_core == AMR_WB_CORE ) + { + st->core = ACELP_CORE; + st->codec_mode = MODE1; + } + else if ( st->last_core == TCX_20_CORE || st->last_core == TCX_10_CORE ) + { + st->core = st->last_core; + st->codec_mode = MODE2; + } + else + { + st->core = st->last_core; + st->codec_mode = MODE1; + } + st->core_brate = st->last_core_brate; + st->extl = st->last_extl; + st->extl_brate = st->total_brate - st->core_brate; + } + return; + } + } + + /*-----------------------------------------------------------------* + * Set extension layers + *-----------------------------------------------------------------*/ + + if ( st->core == ACELP_CORE && st->bwidth == WB && st->total_brate < ACELP_9k60 ) + { + if ( st->vbr_hw_BWE_disable_dec == 0 ) + { + st->extl = WB_BWE; + } + } + else if ( st->core == ACELP_CORE && st->bwidth == WB && st->total_brate >= ACELP_9k60 && st->total_brate <= ACELP_16k40 ) + { + /* read the WB TBE/BWE selection bit */ + if ( get_next_indice( st, 1 ) ) + { + st->extl = WB_BWE; + st->extl_brate = WB_BWE_0k35; + } + else + { + st->extl = WB_TBE; + st->extl_brate = WB_TBE_1k05; + } + } + else if ( st->core == ACELP_CORE && ( st->bwidth == SWB || st->bwidth == FB ) && st->total_brate >= ACELP_13k20 ) + { + if ( st->total_brate >= ACELP_48k ) + { + st->extl = SWB_BWE_HIGHRATE; + if ( st->bwidth == FB ) + { + st->extl = FB_BWE_HIGHRATE; + } + + st->extl_brate = SWB_BWE_16k; + } + + /* read the SWB TBE/BWE selection bit */ + else + { + tmp = get_next_indice( st, 1 ); + + if ( tmp ) + { + st->extl = SWB_BWE; + st->extl_brate = SWB_BWE_1k6; + } + else + { + st->extl = SWB_TBE; + st->extl_brate = SWB_TBE_1k6; + if ( st->total_brate >= ACELP_24k40 ) + { + st->extl_brate = SWB_TBE_2k8; + } + } + } + + /* set FB TBE and FB BWE extension layers */ + if ( st->bwidth == FB && st->total_brate >= ACELP_24k40 ) + { + if ( st->extl == SWB_BWE ) + { + st->extl = FB_BWE; + st->extl_brate = FB_BWE_1k8; + } + else if ( st->extl == SWB_TBE ) + { + st->extl = FB_TBE; + st->extl_brate = FB_TBE_3k0; + } + } + } + + /* set core bitrate */ + st->core_brate = st->total_brate - st->extl_brate; + + /*-----------------------------------------------------------------* + * Read HQ signaling bits from the bitstream + * Set HQ core type + *-----------------------------------------------------------------*/ + + if ( st->core == HQ_CORE ) + { + if ( st->mdct_sw != MODE2 ) + { + /* skip the HQ/TCX core switching flag */ + get_next_indice_tmp( st, 1 ); + } + + /* read ACELP->HQ core switching flag */ + *core_switching_flag = get_next_indice( st, 1 ); + + if ( *core_switching_flag == 1 ) + { + st->last_L_frame_ori = st->last_L_frame; + + /* read ACELP L_frame info */ + if ( get_next_indice( st, 1 ) == 0 ) + { + st->last_L_frame = L_FRAME; + } + else + { + st->last_L_frame = L_FRAME16k; + } + } + + if ( st->mdct_sw != MODE2 ) + { + /* read/set band-width (needed for different I/O sampling rate support) */ + if ( st->total_brate > ACELP_16k40 ) + { + ind = get_next_indice( st, 2 ); + + if ( ind == 0 ) + { + st->bwidth = NB; + } + else if ( ind == 1 ) + { + st->bwidth = WB; + } + else if ( ind == 2 ) + { + st->bwidth = SWB; + } + else + { + st->bwidth = FB; + } + } + } + + /* detect bit errors in signaling */ + if ( ( ( st->total_brate >= ACELP_24k40 && st->bwidth == NB ) || + ( st->core == HQ_CORE && st->total_brate <= LRMDCT_CROSSOVER_POINT && st->bwidth == FB ) ) ) + { + st->bfi = 1; + + st->core_brate = st->total_brate; + st->extl = -1; + st->extl_brate = 0; + if ( st->last_core == AMR_WB_CORE ) + { + st->core = ACELP_CORE; + st->L_frame = L_FRAME; + st->codec_mode = MODE1; + st->last_L_frame = L_FRAME; + + if ( st->total_brate >= ACELP_16k40 ) + { + st->total_brate = ACELP_13k20; + st->core_brate = st->total_brate; + } + } + else + { + /* make sure, we are in a valid configuration wrt to bandwidth */ + st->bwidth = WB; + } + } + + /* set HQ core type */ + *hq_core_type = NORMAL_HQ_CORE; + if ( ( st->bwidth == SWB || st->bwidth == WB ) && st->total_brate <= LRMDCT_CROSSOVER_POINT ) + { + *hq_core_type = LOW_RATE_HQ_CORE; + } + else if ( st->bwidth == NB ) + { + *hq_core_type = LOW_RATE_HQ_CORE; + } + } + + /*-----------------------------------------------------------------* + * Set ACELP frame length + *-----------------------------------------------------------------*/ + + if ( st->core_brate == FRAME_NO_DATA ) + { + /* prevent "L_frame" changes in CNG segments */ + st->L_frame = st->last_L_frame; + } + else if ( st->core_brate == SID_2k40 && st->bwidth == WB && st->first_CNG && st->hTdCngDec->act_cnt2 < MIN_ACT_CNG_UPD ) + { + /* prevent "L_frame" changes in SID frame after short segment of active frames */ + st->L_frame = st->last_CNG_L_frame; + } + else if ( ( st->core_brate == SID_2k40 && st->total_brate >= ACELP_9k60 && st->bwidth == WB ) || ( st->total_brate >= ACELP_32k && st->total_brate < HQ_96k ) || ( st->total_brate == ACELP_24k40 && st->bwidth >= WB ) ) + { + st->L_frame = L_FRAME16k; + } + else + { + st->L_frame = L_FRAME; + } + + if ( st->L_frame == L_FRAME16k ) + { + st->nb_subfr = NB_SUBFR16k; + } + else + { + st->nb_subfr = NB_SUBFR; + } + + st->extl_orig = st->extl; + st->extl_brate_orig = st->extl_brate; + + if ( st->output_Fs == 8000 ) + { + st->extl = -1; + } + else if ( st->output_Fs == 16000 && st->L_frame == L_FRAME16k ) + { + st->extl = -1; + st->extl_brate = 0; + } + + if ( st->ini_frame == 0 ) + { + /* avoid switching of internal ACELP Fs in the very first frame */ + st->last_L_frame = st->L_frame; + st->last_core = st->core; + st->last_core_brate = st->core_brate; + st->last_extl = st->extl; + } + + /*-----------------------------------------------------------------* + * set inactive coder_type flag in ACELP core + *-----------------------------------------------------------------*/ + + st->inactive_coder_type_flag = 0; /* AVQ by default */ + if ( st->total_brate <= MAX_GSC_INACTIVE_BRATE ) + { + st->inactive_coder_type_flag = 1; /* GSC */ + } + + return; +} diff --git a/lib_dec/dlpc_avq.c b/lib_dec/dlpc_avq.c new file mode 100644 index 0000000000000000000000000000000000000000..b4a95fd74d5369d449c1386a2fa889a9cf95d3a9 --- /dev/null +++ b/lib_dec/dlpc_avq.c @@ -0,0 +1,323 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "prot.h" +#include "ivas_prot.h" +#include "wmc_auto.h" + +/*------------------------------------------------------------------* + * dlpc_avq() + * + * Variable bitrate multiple LPC un-quantizer + *------------------------------------------------------------------*/ + +int16_t dlpc_avq( + int16_t *index, /* i : Quantization indices */ + float *LSF_Q, /* o : Quantized LSF vectors */ + const int16_t numlpc, /* i : Number of sets of lpc */ + const int32_t sr_core /* i : internal sampling rate */ +) +{ + int16_t i, nbi, last; + int16_t *p_index, q_type; + + /* Last LPC index */ + if ( numlpc == 1 ) + { + last = 0; + } + else + { + last = M; + } + + p_index = index; + + /* Decode last LPC */ + for ( i = 0; i < M; i++ ) + { + LSF_Q[last + i] = 0.0f; + } + + vlpc_1st_dec( p_index[0], &LSF_Q[last], sr_core ); + p_index++; + vlpc_2st_dec( &LSF_Q[last], &p_index[0], 0, sr_core ); + nbi = 2 + p_index[0] + p_index[1]; + p_index += nbi; + + /* Decode intermediate LPC (512 framing) */ + + if ( numlpc == 2 ) + { + q_type = p_index[0]; + p_index++; + + if ( q_type == 0 ) + { + + for ( i = 0; i < M; i++ ) + { + LSF_Q[i] = 0.0f; + } + vlpc_1st_dec( p_index[0], &LSF_Q[0], sr_core ); + p_index++; + vlpc_2st_dec( &LSF_Q[0], &p_index[0], 0, sr_core ); + } + else if ( q_type == 1 ) + { + for ( i = 0; i < M; i++ ) + { + LSF_Q[i] = LSF_Q[M + i]; + } + + vlpc_2st_dec( &LSF_Q[0], &p_index[0], 3, sr_core ); + } + + nbi = 2 + p_index[0] + p_index[1]; + p_index += nbi; + } + + return (int16_t) ( p_index - index ); +} + +/*------------------------------------------------------------------* + * unary_decode() + * + * + *------------------------------------------------------------------*/ + +static int16_t unary_decode( + Decoder_State *st, + int16_t *ind ) +{ + int16_t start_bit_pos; + + start_bit_pos = st->next_bit_pos; + + /* Index bits */ + *ind = 0; + + while ( get_next_indice_1( st ) && !st->BER_detect ) + { + *ind += 1; + } + + if ( *ind != 0 ) + { + *ind += 1; + } + + return st->next_bit_pos - start_bit_pos; +} + + +/*------------------------------------------------------------------* + * pack4bits() + * + * + *------------------------------------------------------------------*/ + +static int16_t pack4bits( + int16_t nbits, + Decoder_State *st, + int16_t *prm ) +{ + int16_t i; + + i = 0; + + while ( nbits > 4 ) + { + prm[i] = get_next_indice( st, 4 ); + nbits -= 4; + i++; + } + prm[i] = get_next_indice( st, nbits ); + i++; + + return ( i ); +} + + +/*------------------------------------------------------------------* + * decode_lpc_avq() + * + * + *------------------------------------------------------------------*/ + +int16_t decode_lpc_avq( + Decoder_State *st, /* i/o: decoder state structure */ + const int16_t numlpc, /* i : Number of sets of lpc */ + int16_t *param_lpc, /* o : lpc parameters */ + const int16_t ch, /* i : channel */ + const int16_t element_mode, /* i : element mode */ + const int16_t sns_low_br_mode /* i : SNS low-bitrate mode */ +) +{ + int16_t k, j; + int16_t nb, qn1, qn2, avqBits, q_type; + int16_t start_bit_pos; + int16_t stereo_mode = 0; + + j = 0; + start_bit_pos = st->next_bit_pos; + + for ( k = 0; k < numlpc; k++ ) + { + /* Decode quantizer type */ + + if ( k == 0 ) + { + q_type = 0; + nb = 0; + } + else + { + nb = 1; + q_type = get_next_indice( st, nb ); + param_lpc[j++] = q_type; + } + + if ( element_mode == IVAS_CPE_MDCT && k == 0 ) + { + if ( ch == 0 ) + { + stereo_mode = param_lpc[j]; + } + else + { + stereo_mode = ch; + } + param_lpc[j++] = stereo_mode; + } + + /* Decode quantization indices */ + + if ( q_type == 0 ) + { + /* Absolute quantizer with 1st stage stochastic codebook */ + if ( element_mode == IVAS_CPE_MDCT ) + { + if ( stereo_mode != 3 ) + { + param_lpc[j++] = get_next_indice( st, SNS_ABS_QUANT_BITS ); + } + else + { + param_lpc[j++] = get_next_indice( st, 1 ) - 2; + } + } + else + { + param_lpc[j++] = get_next_indice( st, LPC_ABS_QUANT_BITS ); + } + } + + /* + * 2nd stage decoding is skipped if: + * - we are in low bitrate mode and no joint SNS coding is used + * - OR the side-SNS-is-zero flag is set for joint SNS + */ + if ( element_mode != IVAS_CPE_MDCT || ( !( sns_low_br_mode && ( stereo_mode == 0 || stereo_mode == 1 ) ) && !( q_type == 0 && param_lpc[j - 1] == -2 ) ) ) + { + /* 2 bits to specify Q2,Q3,Q4,ext */ + qn1 = 2 + get_next_indice( st, 2 ); + qn2 = 2 + get_next_indice( st, 2 ); + + /* Unary code */ + /* Q5 = 0, Q6=10, Q0=110, Q7=1110, ... */ + + if ( qn1 > 4 ) + { + nb = unary_decode( st, &qn1 ); + + if ( nb == 1 ) + qn1 += 5; + else if ( nb == 2 ) + qn1 += 4; + else if ( nb == 3 ) + qn1 = 0; + else + qn1 += 3; + } + + if ( qn2 > 4 ) + { + nb = unary_decode( st, &qn2 ); + + if ( nb == 1 ) + qn2 += 5; + else if ( nb == 2 ) + qn2 += 4; + else if ( nb == 3 ) + qn2 = 0; + else + qn2 += 3; + } + + /* check for potential bit errors */ + if ( qn1 > NB_SPHERE || qn2 > NB_SPHERE ) + { + qn1 = 0; + qn2 = 0; + st->BER_detect = 1; + } + + param_lpc[j] = qn1; + j++; + param_lpc[j] = qn2; + j++; + + /* Decode Split-by-2 algebraic VQ */ + avqBits = 4 * qn1; + pack4bits( avqBits, st, ¶m_lpc[j] ); + j += qn1; + + avqBits = 4 * qn2; + pack4bits( avqBits, st, ¶m_lpc[j] ); + j += qn2; + } + else + { + param_lpc[j++] = 0; + param_lpc[j++] = 0; + } + } + + return st->next_bit_pos - start_bit_pos; +} diff --git a/lib_dec/dlpc_stoch.c b/lib_dec/dlpc_stoch.c new file mode 100644 index 0000000000000000000000000000000000000000..c033c5bb054afe1eff12fcf28234d826a20c8f72 --- /dev/null +++ b/lib_dec/dlpc_stoch.c @@ -0,0 +1,120 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include "options.h" +#include "prot.h" +#include "rom_com.h" +#include "basop_proto_func.h" +#include "wmc_auto.h" + +/*------------------------------------------------------------------* + * lpc_unquantize() + * + * + *------------------------------------------------------------------*/ + +void lpc_unquantize( + Decoder_State *st, + float *lsf, + float *lsp, + int16_t *param_lpc, + float *lspmid, + float *lsfmid, + const int16_t coder_type, + int16_t *LSF_Q_prediction /* o : LSF prediction mode */ +) +{ + int16_t nb_indices, k; + + mvr2r( st->lsf_old, &lsf[0], M ); + mvr2r( st->lsp_old, &lsp[0], M ); + + nb_indices = 0; + if ( st->lpcQuantization == 0 ) + { + nb_indices = dlpc_avq( param_lpc, &lsf[M], st->numlpc, st->sr_core ); + + for ( k = 0; k < st->numlpc; k++ ) + { + lsf2lsp( &lsf[( k + 1 ) * M], &lsp[( k + 1 ) * M], M, st->sr_core ); + } + } + else if ( st->lpcQuantization == 1 ) + { + if ( st->sr_core == INT_FS_16k && coder_type == UNVOICED ) + { + lsf_end_dec( st, GENERIC, 1 - st->narrowBand /* st->bwidth */, ENDLSF_NBITS, &lsf[M], param_lpc, LSF_Q_prediction, &nb_indices, NULL ); + } + else + { + if ( st->core == TCX_20_CORE ) + { + lsf_end_dec( st, AUDIO, 1 - st->narrowBand /* st->bwidth */, ENDLSF_NBITS, &lsf[M], param_lpc, LSF_Q_prediction, &nb_indices, NULL ); + } + else + { + lsf_end_dec( st, coder_type, 1 - st->narrowBand /* st->bwidth */, ENDLSF_NBITS, &lsf[M], param_lpc, LSF_Q_prediction, &nb_indices, NULL ); + } + } + + lsf2lsp( &lsf[M], &lsp[M], M, st->sr_core ); + } + else + { + assert( 0 ); + } + + st->seed_acelp = 0; + for ( k = nb_indices - 1; k >= 0; k-- ) + { + /* rightshift before *seed_acelp+param_lpc[i] to avoid overflows*/ + st->seed_acelp = (int16_t) ( ( ( ( st->seed_acelp ) >> 1 ) + param_lpc[k] ) * 31821L + 13849L ); + } + + /* Decoded mid-frame lsf */ + if ( st->lpcQuantization && st->acelp_cfg.midLpc && st->core == ACELP_CORE && st->rate_switching_reset == 0 ) + { + midlsf_dec( &lsf[0], &lsf[M], param_lpc[nb_indices], lsfmid, M, coder_type, &( st->mid_lsf_int ), st->prev_bfi, st->safety_net ); + + reorder_lsf( lsfmid, LSF_GAP_MID, M, st->sr_core ); + lsf2lsp( lsfmid, lspmid, M, st->sr_core ); + } + + + return; +} diff --git a/lib_dec/er_dec_acelp.c b/lib_dec/er_dec_acelp.c new file mode 100644 index 0000000000000000000000000000000000000000..5fdce177345b444eec4f2f321d88ce80d4ab96fe --- /dev/null +++ b/lib_dec/er_dec_acelp.c @@ -0,0 +1,723 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include "options.h" +#include +#include "prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * con_acelp() + * + * Concealment function for ACELP and TD-TCX + *--------------------------------------------------------------------*/ + +void con_acelp( + float A[], /* i : coefficients NxAz[M+1] */ + const int16_t coder_type, /* i : ACELP coder type */ + float synth[], /* i/o: synthesis */ + int16_t *pT, /* o : pitch for all subframe */ + float *pgainT, /* o : pitch gain for all subfr */ + float stab_fac, /* i : stability of isf */ + Decoder_State *st, /* i/o: coder memory state */ + float pitch_buffer[], /* i/o: floating pitch values for each subframe */ + float *voice_factors, /* o : voicing factors */ + float *bwe_exc /* o : excitation for SWB TBE */ +) +{ + int16_t i, i_subfr, L_frame, T0; + float tmp_deemph; + float mem_syn[M], mem_syn2[M], mem[M], *syn; + float *noise_buf; + float *exc, *harmonic_exc_buf, buf[L_EXC_MEM_DEC + M + L_FRAME16k + L_FRAME16k / 2], *p_A; + float pitch_buf[NB_SUBFR16k]; + float alpha = 0.0f; + float step, gain, gainCNG, gain_inov, ftmp; + float *pt_exc, tmp_tc, predPitchLag; + float pc = 0.f; + int16_t extrapolationFailed, tmpSeed, Tc; + float *pt1_exc; + float *w = st->hTcxCfg->tcx_mdct_window; + int16_t W1, W2, j; + int16_t l_fir_fer = L_FIR_FER; + float lpFiltAdapt[3]; + float hp_filt[3]; + int16_t nSubframes; + float exc_unv[L_FRAME16k + L_FRAME16k / 2]; + float syn_unv[L_FRAME16k + L_FRAME16k / 2]; + float mem_syn_unv[M]; + float gain_lpc[NB_SUBFR16k]; + float h1[L_SUBFR + 1]; + float gainSynthDeemph; + float tmp = 0.f; + int16_t fUseExtrapolatedPitch; + + /* Framing parameters */ + + L_frame = st->L_frame; + + fUseExtrapolatedPitch = 0; + extrapolationFailed = 1; + + /*------------------------------------------------------------------------* + * Initialize buffers * + *------------------------------------------------------------------------*/ + + /* set ACELP synthesis memory */ + mvr2r( st->mem_syn2, mem_syn, M ); + + /* set excitation memory*/ + harmonic_exc_buf = buf + M; + exc = harmonic_exc_buf + L_EXC_MEM_DEC; + mvr2r( st->old_exc, harmonic_exc_buf, L_EXC_MEM_DEC ); + exc[L_frame] = 0.0f; + + /*------------------------------------------------------------------------* + * PLC: [ACELP:Extrapolate Pitch Lag] + *------------------------------------------------------------------------*/ + + if ( st->flagGuidedAcelp == 1 ) + { + T0 = st->guidedT0; + } + + pitch_pred_linear_fit( st->nbLostCmpt, st->last_good, st->old_pitch_buf, &st->old_fpitch, &predPitchLag, st->pit_min, st->pit_max, st->mem_pitch_gain, 0, st->plc_use_future_lag, &extrapolationFailed, st->nb_subfr ); + T0 = (int16_t) ( predPitchLag + 0.5f ); + + if ( extrapolationFailed ) + { + /*------------------------------------------------------------------------* + * - Construct adaptive codebook from side information * + *------------------------------------------------------------------------*/ + + if ( st->flagGuidedAcelp == 0 ) + { + nSubframes = 0; + } + else + { + nSubframes = 2; + /* Construct adaptive codebook with T0, T0_frac, T0_res, gain_pit for 2 sub-frames */ + for ( i = 0; i < 2 * L_SUBFR; i++ ) + { + exc[i] = exc[i - st->guidedT0]; + } + } + } + else + { + nSubframes = 0; + } + + + if ( nSubframes > 0 ) + { + tmp_tc = (float) st->guidedT0; /* take the transmit pitch*/ + } + else + { + tmp_tc = st->old_fpitch; /* take the previous frame last pitch*/ + } + + /* PLC: [ACELP: Fade-out] + * PLC: calculate damping factor */ + alpha = Damping_fact( coder_type, st->nbLostCmpt, st->last_good, stab_fac, &( st->lp_gainp ), 0 ); + + if ( st->nbLostCmpt == 1 ) + { + st->cummulative_damping = 1.0f; + } + else + { + st->cummulative_damping *= alpha; + } + + /*-----------------------------------------------------------------* + * PLC: [ACELP: adaptive codebook] + * PLC: Construct the harmonic part of excitation + *-----------------------------------------------------------------*/ + + if ( st->last_good >= UNVOICED_TRANSITION ) + { + + /*---------------------------------------------------------------* + * Last pitch cycle of the previous frame is repeatedly copied. * + *---------------------------------------------------------------*/ + + Tc = (int16_t) ( tmp_tc + 0.5f ); + + if ( ( T0 > 0 ) && ( T0 != Tc ) && ( abs( T0 - Tc ) < 0.15f * Tc ) && extrapolationFailed == 0 ) + { + fUseExtrapolatedPitch = 1; + } + + if ( st->enableGplc ) + { + pt_exc = &exc[nSubframes * L_SUBFR]; + } + else + { + pt_exc = exc; + } + pt1_exc = pt_exc - Tc; + + if ( fUseExtrapolatedPitch != 0 ) + { + /* Required because later pt1_exc[1] used in filtering points to exc[0]. To make it safe also for GPL pt_exc is used instead of exc */ + pt_exc[0] = 0; + pt_exc = harmonic_exc_buf; + assert( pt_exc < pt1_exc - 1 ); + } + + if ( st->nbLostCmpt == 1 ) + { + /* pitch cycle is first low-pass filtered */ + /*get filter coefficients*/ + genPlcFiltBWAdap( st->sr_core, &lpFiltAdapt[0], 0, st->cummulative_damping ); + for ( i = 0; i < Tc; i++ ) + { + *pt_exc++ = ( lpFiltAdapt[0] * pt1_exc[-1] + lpFiltAdapt[1] * pt1_exc[0] + lpFiltAdapt[2] * pt1_exc[1] ); + pt1_exc++; + } + } + else + { + /* copy the first pitch cycle without low-pass filtering */ + for ( i = 0; i < Tc; i++ ) + { + *pt_exc++ = *pt1_exc++; + } + } + + if ( fUseExtrapolatedPitch != 0 ) + { + pt1_exc = harmonic_exc_buf; + } + + for ( i = 0; i < L_frame + ( 1 - nSubframes ) * L_SUBFR - Tc; i++ ) + { + *pt_exc++ = *pt1_exc++; + } + + /*-------------------------------------------------------* + * PLC: [ACELP: adaptive codebook] + * PLC: Resync pulse positions. + *-------------------------------------------------------*/ + + if ( nSubframes > 0 ) + { + pitch_buf[0] = (float) st->guidedT0; + pitch_buf[1] = (float) st->guidedT0; + } + + if ( nSubframes > 0 ) + { + pitch_buf[3] = pitch_buf[2] = pitch_buf[1]; /* do not resync on second half of frame */ + if ( st->nb_subfr == 5 ) + { + /* for guidedacelp cases and nSubframes=2, set pitch_buf[4] to avoid memory_access issues in post_decoder() */ + pitch_buf[4] = pitch_buf[3]; + } + } + else + { + if ( fUseExtrapolatedPitch != 0 ) + { + get_subframe_pitch( st->nb_subfr, st->old_fpitch, predPitchLag, pitch_buf ); + + PulseResynchronization( harmonic_exc_buf, exc, L_frame, st->nb_subfr, st->old_fpitch, predPitchLag ); + } + else + { + set_f( pitch_buf, st->old_fpitch, st->nb_subfr ); + } + } + + /*------------------------------------------------------------* + * PLC: [ACELP: adaptive codebook] + * PLC: Create the harmonic part needed for the overlap-add. + *------------------------------------------------------------*/ + + pt_exc = exc + L_frame; + pt1_exc = pt_exc - ( ( T0 == 0 ) ? Tc : T0 ); + + for ( i = 0; i < L_frame / 2; i++ ) + { + *pt_exc++ = *pt1_exc++; + } + + /*-------------------------------------------------------* + * PLC: [ACELP: adaptive codebook] + * PLC: update the floating point pitch for consecutive loss + *-------------------------------------------------------*/ + + if ( fUseExtrapolatedPitch != 0 ) + { + + if ( st->flagGuidedAcelp == 1 ) + { + st->old_fpitch = (float) T0; + } + else + { + st->old_fpitch = predPitchLag; + } + } + + /*-------------------------------------------------------* + * PLC: [ACELP: adaptive BPF] + * PLC: Accommodate the BPF + *-------------------------------------------------------*/ + + st->bpf_gain_param = 3; /*full BPF*/ + + /*-------------------------------------------------------* + * PLC: [ACELP: adaptive codebook] + * PLC: Calculate the initial gain and fade out step. + *-------------------------------------------------------*/ + + pc = (float) fabs( pitch_buf[3] + pitch_buf[2] - pitch_buf[1] - pitch_buf[0] ) * 256.0f / (float) L_frame; + + if ( ( st->last_good <= UNVOICED_TRANSITION ) && ( coder_type == GENERIC ) && ( pc > 6 ) ) + { + gain = 0.0f; + st->lp_gainp = 0.0f; + } + else + { + gain = 1.0f; /* start-of-the-frame gain */ + st->lp_gainp = alpha; + } + + step = ( 1.0f / L_frame ) * ( gain - st->lp_gainp ); + + /*-------------------------------------------------------* + * PLC: [ACELP: Fade-out] + * Apply fade out + *-------------------------------------------------------*/ + + for ( i_subfr = 0; i_subfr < st->nb_subfr; i_subfr++ ) + { + pgainT[i_subfr] = gain; + + for ( i = i_subfr * L_SUBFR; i < ( i_subfr + 1 ) * L_SUBFR; i++ ) + { + exc[i] *= gain; + gain -= step; + } + } + + for ( ; i < L_frame + ( L_frame / 2 ); i++ ) + { + exc[i] *= gain; + gain -= step; + } + + for ( i = 0; i < st->nb_subfr; i++ ) + { + pT[i] = (int16_t) ( pitch_buf[i] + 0.5f ); + pitch_buffer[i] = pitch_buf[i]; + } + + /* update old exc without random part*/ + mvr2r( harmonic_exc_buf + L_frame, st->old_exc, L_EXC_MEM_DEC ); + } + else + { + /* No harmonic part */ + set_zero( &exc[0], L_frame + L_frame / 2 ); + + for ( i = 0; i < st->nb_subfr; i++ ) + { + pitch_buf[i] = st->pit_max; + pgainT[i] = 0.f; + pT[i] = L_SUBFR; + pitch_buffer[i] = L_SUBFR; + } + + st->bpf_gain_param = 0; /*no BPF*/ + } + + /*-----------------------------------------------------------------* + * Construct the random part of excitation + *-----------------------------------------------------------------*/ + noise_buf = buf; + tmpSeed = st->seed_acelp; + + for ( i = 0; i < L_frame + l_fir_fer - 1; i++ ) + { + noise_buf[i] = (float) own_random( &tmpSeed ); + } + st->seed_acelp = tmpSeed; + + for ( ; i < L_frame + ( L_frame / 2 ) + l_fir_fer - 1; i++ ) + { + noise_buf[i] = (float) own_random( &tmpSeed ); + } + + /*get filter coefficients*/ + genPlcFiltBWAdap( st->sr_core, &hp_filt[0], 1, st->cummulative_damping ); + + /* PLC: [ACELP: Fade-out] + * PLC: retrieve background level */ + tmp = 1.0f; + gainSynthDeemph = getLevelSynDeemph( &( tmp ), A, L_SUBFR, st->preemph_fac, L_frame / L_SUBFR ); + gainCNG = st->cngTDLevel / gainSynthDeemph; + + gain = st->lp_gainc; /* start-of-the-frame gain */ + + ftmp = 2.0f * gain; + + if ( gainCNG > ftmp ) + { + gainCNG = ftmp; + } + + st->lp_gainc = alpha * st->lp_gainc + ( 1.0f - alpha ) * gainCNG; /* end-of-the-frame gain */ + + if ( ( st->last_good == UNVOICED_TRANSITION ) && ( coder_type == GENERIC ) ) + { + st->lp_gainc = gainCNG; + } + + highPassFiltering( st->last_good, L_frame + l_fir_fer / 2, noise_buf, hp_filt, l_fir_fer ); + + /* Find energy normalization factor */ + pt_exc = noise_buf + l_fir_fer / 2; + gain_inov = 1.0f / (float) sqrt( dotp( pt_exc, pt_exc, L_frame ) / L_frame + 0.01f ); + + /* PLC: [ACELP: Fade-out] + * PLC: Linearly attenuate the gain through the frame */ + step = ( 1.0f / L_frame ) * ( gain - st->lp_gainc ); + + if ( ( st->last_good == UNVOICED_CLAS ) && ( coder_type != UNVOICED ) ) /* Attenuate somewhat on unstable unvoiced */ + { + gain_inov *= 0.8f; + } + + if ( st->last_good >= UNVOICED_TRANSITION ) + { + float tilt_code; + + tilt_code = (float) ( 0.10f * ( 1.0f + st->voice_fac ) ); + gain_inov *= ( 1.f - tilt_code ); + } + + pt_exc = noise_buf; + + /* non-causal ringing of the FIR filter */ + + for ( i = 0; i < l_fir_fer / 2; i++ ) + { + *pt_exc++ *= ( gain_inov * gain ); + } + + /* Actual filtered random part of excitation */ + + for ( i = 0; i < L_frame; i++ ) + { + *pt_exc++ *= ( gain_inov * gain ); + gain -= step; + } + + for ( i = 0; i < ( L_frame / 2 ) + l_fir_fer / 2; i++ ) + { + *pt_exc++ *= ( gain_inov * gain ); + } + + st->past_gcode = gain; + + if ( st->last_good < UNVOICED_TRANSITION ) + { + mvr2r( noise_buf + l_fir_fer / 2, exc, L_frame + L_frame / 2 ); + mvr2r( harmonic_exc_buf + L_frame, st->old_exc, L_EXC_MEM_DEC ); + mvr2r( exc, exc_unv, L_frame + ( L_frame / 2 ) ); /* Update exc_unv */ + } + else + { + mvr2r( noise_buf + l_fir_fer / 2, exc_unv, L_frame + ( L_frame / 2 ) ); /* Update exc_unv */ + } + + /* Compute total excitation in noisebuffer to save memories */ + if ( st->last_good >= UNVOICED_TRANSITION ) + { + for ( i = 0; i < L_frame + 1; i++ ) + { + noise_buf[i] = exc[i] + exc_unv[i]; + } + } + else + { + noise_buf = exc_unv; + } + + if ( st->hBWE_TD != NULL ) + { + if ( L_frame == L_FRAME ) + { + interp_code_5over2( noise_buf, bwe_exc, L_frame ); + set_f( voice_factors, st->last_voice_factor, NB_SUBFR ); + } + else + { + interp_code_4over2( noise_buf, bwe_exc, L_frame ); + set_f( voice_factors, st->last_voice_factor, NB_SUBFR16k ); + } + } + + /*----------------------------------------------------------* + * - compute the synthesis speech * + *----------------------------------------------------------*/ + + /* Init syn buffer */ + syn = buf + M; + mvr2r( st->mem_syn2, buf, M ); + + if ( st->nbLostCmpt == 1 ) + { + + if ( st->last_good < UNVOICED_TRANSITION ) + { + mvr2r( st->mem_syn2, mem_syn_unv, M ); + } + else + { + set_zero( mem_syn_unv, M ); + } + } + else + { + mvr2r( st->mem_syn_unv_back, mem_syn_unv, M ); + } + + /* voiced synth */ + + if ( st->last_good >= UNVOICED_TRANSITION ) + { + p_A = A; + + for ( i_subfr = 0; i_subfr < L_frame; i_subfr += L_SUBFR ) + { + tmp = 0; + set_zero( h1, L_SUBFR + 1 ); + set_zero( mem, M ); + h1[0] = 1.0f; + syn_filt( p_A, M, h1, h1, L_SUBFR, mem, 0 ); /* impulse response of LPC */ + deemph( h1, st->preemph_fac, L_SUBFR, &tmp ); /* impulse response of deemph */ + /* impulse response level = gain introduced by synthesis+deemphasis */ + gain_lpc[i_subfr / L_SUBFR] = 1.f / (float) sqrt( dotp( h1, h1, L_SUBFR ) ); + p_A += ( M + 1 ); + } + + j = 0; + for ( i_subfr = 0; i_subfr < L_frame; i_subfr += L_SUBFR ) + { + + for ( i = 0; i < L_SUBFR; i++ ) + { + exc[i_subfr + i] *= st->last_gain_syn_deemph * gain_lpc[j]; + } + j++; + } + + for ( i = L_frame; i < L_frame + L_frame / 2; i++ ) + { + exc[i] *= st->last_gain_syn_deemph * gain_lpc[3]; + } + p_A = A; + + for ( i_subfr = 0; i_subfr < L_frame; i_subfr += L_SUBFR ) + { + syn_filt( p_A, M, &exc[i_subfr], &syn[i_subfr], L_SUBFR, mem_syn, 1 ); + p_A += ( M + 1 ); + } + + mvr2r( mem_syn, mem_syn2, M ); + + /* synthesize ola*/ + syn_filt( p_A - ( M + 1 ), M, &exc[L_frame], &syn[L_frame], ( L_frame / 2 ), mem_syn2, 0 ); + } + + /* unvoiced synth */ + tmp = 0; + p_A = st->Aq_cng; + + for ( i_subfr = 0; i_subfr < L_frame; i_subfr += L_SUBFR ) + { + set_zero( h1, L_SUBFR + 1 ); + set_zero( mem, M ); + h1[0] = 1.0f; + syn_filt( p_A, M, h1, h1, L_SUBFR, mem, 0 ); /* impulse response of LPC */ + deemph( h1, st->preemph_fac, L_SUBFR, &tmp ); /* impulse response of deemph */ + /* impulse response level = gain introduced by synthesis+deemphasis */ + gain_lpc[i_subfr / L_SUBFR] = 1.f / (float) sqrt( dotp( h1, h1, L_SUBFR ) ); + p_A += ( M + 1 ); + } + + j = 0; + for ( i_subfr = 0; i_subfr < L_frame; i_subfr += L_SUBFR ) + { + + for ( i = 0; i < L_SUBFR; i++ ) + { + exc_unv[i_subfr + i] *= st->last_gain_syn_deemph * gain_lpc[j]; + } + j++; + } + + for ( i = L_frame; i < L_frame + L_frame / 2; i++ ) + { + exc_unv[i] *= st->last_gain_syn_deemph * gain_lpc[j - 1]; + } + p_A = st->Aq_cng; + + for ( i_subfr = 0; i_subfr < L_frame; i_subfr += L_SUBFR ) + { + syn_filt( p_A, M, &exc_unv[i_subfr], &syn_unv[i_subfr], L_SUBFR, mem_syn_unv, 1 ); + p_A += ( M + 1 ); + } + + mvr2r( mem_syn_unv, st->mem_syn_unv_back, M ); + + if ( st->last_good < UNVOICED_TRANSITION ) + { + mvr2r( mem_syn_unv, mem_syn, M ); + } + + /* unvoiced for ola */ + syn_filt( p_A - ( M + 1 ), M, &exc_unv[i_subfr], &syn_unv[i_subfr], ( L_frame / 2 ), mem_syn_unv, 0 ); + + /* add separate synthesis buffers */ + if ( st->last_good >= UNVOICED_TRANSITION ) + { + for ( i = 0; i < L_frame; i++ ) + { + syn[i] += syn_unv[i]; + } + } + else + { + mvr2r( syn_unv, syn, L_frame + L_frame / 2 ); + } + + + /* update buffer for the classification */ + FEC_clas_estim( syn, pitch_buf, st->L_frame, coder_type, st->codec_mode, st->mem_syn_clas_estim, &( st->clas_dec ), &st->lp_ener_bfi, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, -1.0f, st->narrowBand, 0, 1, st->preemph_fac, st->tcxonly, st->last_core_brate, -1 ); + + /* Update Pitch Lag memory */ + mvr2r( &st->old_pitch_buf[L_frame / L_SUBFR], st->old_pitch_buf, L_frame / L_SUBFR ); + mvr2r( pitch_buf, &st->old_pitch_buf[L_frame / L_SUBFR], L_frame / L_SUBFR ); + + /*updating enr_old parameters*/ + fer_energy( L_frame, st->last_good, syn, tmp_tc, &( st->enr_old ), 1 ); + + /* update ACELP synthesis memory */ + mvr2r( mem_syn, st->mem_syn2, M ); + mvr2r( syn + L_frame - L_SYN_MEM, st->mem_syn_r, L_SYN_MEM ); + + /* Deemphasis and output synth */ + tmp_deemph = st->syn[M]; + deemph( syn, st->preemph_fac, L_frame + L_frame / 2, &tmp_deemph ); + + mvr2r( syn, synth, L_frame ); + mvr2r( syn + L_frame - L_frame / 2, st->hTcxDec->old_syn_Overl, L_frame / 2 ); + + + /* save last half frame if next frame is TCX */ + mvr2r( syn + L_frame, st->hTcxDec->syn_Overl_TDAC, L_frame / 2 ); + mvr2r( syn + L_frame - M - 1, st->syn, 1 + M ); + + /* update old_Aq */ + mvr2r( p_A - ( M + 1 ), st->old_Aq_12_8, M + 1 ); + + mvr2r( syn + L_frame, st->hTcxDec->syn_Overl, L_frame / 2 ); + + W1 = st->hTcxCfg->tcx_mdct_window_length; + W2 = st->hTcxCfg->tcx_mdct_window_length / 2; + + st->hTcxCfg->tcx_curr_overlap_mode = FULL_OVERLAP; + { + int16_t n = (int16_t) ( (float) L_frame * N_ZERO_MDCT_NS / FRAME_SIZE_NS ); + + mvr2r( syn + L_frame - n, st->hHQ_core->old_outLB, L_frame - n ); + + for ( i = 0; i < W1; i++ ) + { + st->hHQ_core->old_outLB[i + n] *= w[W1 - 1 - i] * w[W1 - 1 - i]; + } + set_zero( &st->hHQ_core->old_outLB[W1 + n], n ); + } + + /* create aliasing and windowing */ + + for ( i = 0; i < W1; i++ ) + { + buf[i] = st->hTcxDec->syn_Overl_TDAC[i] * w[W1 - 1 - i]; + } + + for ( i = 0; i < W2; i++ ) + { + st->hTcxDec->syn_Overl_TDAC[i] = buf[i] + buf[W1 - 1 - i]; /* A-D */ + } + + for ( i = 0; i < W2; i++ ) + { + st->hTcxDec->syn_Overl_TDAC[W2 + i] = buf[W2 + i] + buf[W1 - 1 - W2 - i]; /* B-C */ + } + + for ( i = 0; i < W1; i++ ) + { + st->hTcxDec->syn_Overl_TDAC[i] *= w[W1 - 1 - i]; + } + + /* update memory for full band */ + lerp( st->hTcxDec->syn_Overl_TDAC, st->hTcxDec->syn_Overl_TDACFB, st->hTcxDec->L_frameTCX / 2, L_frame / 2 ); + lerp( st->hTcxDec->syn_Overl, st->hTcxDec->syn_OverlFB, st->hTcxDec->L_frameTCX / 2, L_frame / 2 ); + lerp( st->hHQ_core->old_outLB, st->hHQ_core->old_out, st->hTcxDec->L_frameTCX, L_frame ); + + /* copy total excitation exc2 as 16kHz for acelp mode1 decoding */ + if ( st->hWIDec != NULL ) + { + lerp( exc, st->hWIDec->old_exc2, L_EXC_MEM, L_frame ); + lerp( syn, st->hWIDec->old_syn2, L_EXC_MEM, L_frame ); + } + st->bfi_pitch = pitch_buf[st->nb_subfr - 1]; + st->bfi_pitch_frame = L_frame; + + return; +} diff --git a/lib_dec/er_dec_tcx.c b/lib_dec/er_dec_tcx.c new file mode 100644 index 0000000000000000000000000000000000000000..bf2fbe9c2d3c212cf007c50bd64ddddef38aeb1a --- /dev/null +++ b/lib_dec/er_dec_tcx.c @@ -0,0 +1,652 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include "cnst.h" +#include "ivas_cnst.h" +#include +#include +#include "options.h" +#include +#include "prot.h" +#include "rom_dec.h" +#include "wmc_auto.h" + +/*-----------------------------------------------------------------* + * con_tcx() + * + * + *-----------------------------------------------------------------*/ + +void con_tcx( + Decoder_State *st, /* i/o: coder memory state */ + float synth[], /* i/o: synth[] */ + const float coh, /* i : coherence of stereo signal */ + int16_t *noise_seed, /* i/o: noise seed for stereo */ + const int16_t only_left, /* i : TD-PLC only in left channel */ + const float A_cng[] /* i : CNG LP filter coefficients */ +) +{ + int16_t i, n, L_frame, L_subfr, fLowPassFilter, T0; + int16_t offset = 0; + int16_t mem_syn_r_size_old, mem_syn_r_size_new; + float *noise; + float mem_syn[M], *syn; + float *exc, buf[OLD_EXC_SIZE_DEC + L_FRAME_MAX + L_FRAME_MAX / NB_SUBFR + 1 + L_FRAME_MAX / 2]; + float pre_emph_buf; + float pitch_buf[NB_SUBFR16k], hp_filt[L_FIR_FER2]; + float predPitchLag, alpha = 0.0f; + float tmp_deemph, step, gain, gainCNG, gain_inov, ftmp; + float *pt_exc, *pt1_exc; + int16_t Tc, tmpSeed; + int16_t fUseExtrapolatedPitch = 0; + float *ana_window; + float r[M + 1], A_local[M + 1], mem; + float *w; + int16_t W1, W2; + int16_t extrapolationFailed = 1; + float gainSynthDeemph; + float tmp = 0.f; + float old_pitch_buf[2 * NB_SUBFR16k + 2]; + TCX_LTP_DEC_HANDLE hTcxLtpDec = st->hTcxLtpDec; + TCX_DEC_HANDLE hTcxDec = st->hTcxDec; + + /* Framing parameters */ + L_frame = hTcxDec->L_frameTCX; + L_subfr = hTcxDec->L_frameTCX / st->nb_subfr; + w = st->hTcxCfg->tcx_mdct_windowFB; + W1 = st->hTcxCfg->tcx_mdct_window_lengthFB; + W2 = st->hTcxCfg->tcx_mdct_window_lengthFB / 2; + + /* take the previous frame last pitch */ + Tc = (int16_t) ( st->old_fpitchFB + 0.5f ); + + set_zero( buf, OLD_EXC_SIZE_DEC + L_FRAME_MAX + L_FRAME_MAX / NB_SUBFR + 1 + L_FRAME_MAX / 2 ); + + v_multc( st->old_pitch_buf, (float) L_frame / st->L_frame, old_pitch_buf, 2 * NB_SUBFR16k + 2 ); + + /* set excitation memory*/ + exc = buf + OLD_EXC_SIZE_DEC; + + tmp_deemph = synth[-1]; + pre_emph_buf = synth[-1]; + + if ( st->nbLostCmpt == 1 || hTcxDec->tcxConceal_recalc_exc ) + { + /* apply pre-emphasis to the signal */ + mem = synth[-( L_frame / 2 + hTcxDec->pit_max_TCX + 2 * M ) - 1]; + + preemph( &synth[-( L_frame / 2 + hTcxDec->pit_max_TCX + 2 * M )], st->preemph_fac, L_frame / 2 + hTcxDec->pit_max_TCX + 2 * M, &mem ); + st->lp_gainc = 0.0f; + + st->lp_gainp = get_gain( synth - 2 * L_subfr, synth - 2 * L_subfr - Tc, 2 * L_subfr, NULL ); + + if ( st->lp_gainp < 0.0f ) + { + st->lp_gainp = 0.0f; + } + + if ( st->lp_gainp > 1.0f ) + { + st->lp_gainp = 1.0f; + } + ana_window = buf; + ham_cos_window( ana_window, 3 * L_frame / 4, L_frame / 4 ); + + /* Autocorrelation */ + autocorr( &( synth[-L_frame - 1] ), r, M, L_frame, ana_window, 0, 0, 0 ); + + /* Lag windowing */ + lag_wind( r, M, st->output_Fs, LAGW_STRONG ); + + /* Levinson Durbin */ + lev_dur( A_local, r, M, NULL ); + + /* copy for multiple frame loss */ + mvr2r( A_local, st->old_Aq_12_8, M + 1 ); + + /* Residu */ + assert( ( 2 * L_subfr + Tc + 1 + M ) <= st->hTcxDec->old_synth_lenFB ); + residu( A_local, M, &( synth[-( 2 * L_subfr + Tc + 1 + M )] ), &( exc[-( 2 * L_subfr + Tc + 1 + M )] ), 2 * L_subfr + Tc + 1 + M ); + } + else + { + /* apply pre-emphasis to the signal */ + mem = synth[-L_frame - 1]; + + preemph( &synth[-L_frame], st->preemph_fac, L_frame, &mem ); + mvr2r( st->old_Aq_12_8, A_local, M + 1 ); + offset = L_frame / 2; + + if ( st->last_good >= UNVOICED_TRANSITION ) + { + i = max( Tc - L_frame / 2, 0 ); + mvr2r( st->hTcxDec->old_excFB, &( exc[-i] ), offset + i ); + } + else + { + mvr2r( st->hTcxDec->old_excFB, &( exc[-2 * L_subfr] ), 2 * L_subfr + offset ); + } + } + + /*-----------------------------------------------------------------* + * PLC: Construct the harmonic part of excitation + *-----------------------------------------------------------------*/ + + if ( st->last_good != UNVOICED_CLAS && !( ( st->last_good == UNVOICED_TRANSITION ) && ( st->core_ext_mode == GENERIC ) ) ) + { + if ( st->nbLostCmpt == 1 || hTcxDec->tcxConceal_recalc_exc ) + { + st->lp_gainc = 0.0f; + + for ( i = 0; i < 2 * L_subfr; i++ ) + { + st->lp_gainc += ( exc[i - 2 * L_subfr] - st->lp_gainp * exc[i - 2 * L_subfr - Tc] ) * ( exc[i - 2 * L_subfr] - st->lp_gainp * exc[i - 2 * L_subfr - Tc] ); + } + st->lp_gainc = (float) sqrt( st->lp_gainc / ( 2.0f * L_subfr ) ); + } + if ( ( st->nbLostCmpt == 1 ) && st->rf_frame_type >= RF_TCXFD && st->rf_frame_type <= RF_TCXTD2 && st->use_partial_copy ) + { + predPitchLag = ( hTcxLtpDec->tcxltp_pitch_int + hTcxLtpDec->tcxltp_pitch_fr / (float) st->pit_res_max ) * (float) hTcxDec->L_frameTCX / (float) st->L_frame; + T0 = (int16_t) ( predPitchLag + 0.5f ); + + if ( ( T0 > 0 ) && ( T0 != Tc ) && ( (float) abs( T0 - Tc ) < 0.15f * Tc ) ) + { + fUseExtrapolatedPitch = 1; + } + } + else + { + pitch_pred_linear_fit( st->nbLostCmpt, st->last_good, old_pitch_buf, &( st->old_fpitchFB ), &predPitchLag, hTcxDec->pit_min_TCX, hTcxDec->pit_max_TCX, st->mem_pitch_gain, st->output_Fs > 25600, st->plc_use_future_lag, &extrapolationFailed, st->nb_subfr ); + + T0 = (int16_t) ( predPitchLag + 0.5f ); + + if ( ( T0 > 0 ) && ( T0 != Tc ) && ( (float) abs( T0 - Tc ) < 0.15f * Tc ) && extrapolationFailed == 0 ) + { + fUseExtrapolatedPitch = 1; + } + } + + fLowPassFilter = 0; + pt_exc = exc + offset; + + pt1_exc = pt_exc - Tc; + + if ( fUseExtrapolatedPitch != 0 ) + { + pt_exc = buf; + } + + if ( st->stab_fac < 1 && st->nbLostCmpt == 1 ) + { + /* pitch cycle is first low-pass filtered */ + for ( i = 0; i < Tc; i++ ) + { + if ( st->output_Fs <= 16000 ) + { + *pt_exc++ = ( 0.0053f * pt1_exc[-5] + 0.0000f * pt1_exc[-4] + -0.0440f * pt1_exc[-3] + 0.0000f * pt1_exc[-2] + 0.2637f * pt1_exc[-1] + 0.5500f * pt1_exc[0] + 0.2637f * pt1_exc[1] + 0.0000f * pt1_exc[2] + -0.0440f * pt1_exc[3] + 0.0000f * pt1_exc[4] + 0.0053f * pt1_exc[5] ); + } + else /*(st->output_Fs >= 32000)*/ + { + *pt_exc++ = ( -0.0053f * pt1_exc[-5] + -0.0037f * pt1_exc[-4] + -0.0140f * pt1_exc[-3] + 0.0180f * pt1_exc[-2] + 0.2668f * pt1_exc[-1] + 0.4991f * pt1_exc[0] + 0.2668f * pt1_exc[1] + 0.0180f * pt1_exc[2] + -0.0140f * pt1_exc[3] + -0.0037f * pt1_exc[4] + -0.0053f * pt1_exc[5] ); + } + pt1_exc++; + } + fLowPassFilter = 1; + } + else + { + /* copy the first pitch cycle without low-pass filtering */ + for ( i = 0; i < Tc; i++ ) + { + *pt_exc++ = *pt1_exc++; + } + fLowPassFilter = 1; + } + + if ( fUseExtrapolatedPitch != 0 ) + { + pt1_exc = buf; + } + + for ( i = 0; i < L_frame - fLowPassFilter * Tc + L_subfr; i++ ) + { + *pt_exc++ = *pt1_exc++; + } + + if ( fUseExtrapolatedPitch != 0 ) + { + get_subframe_pitch( st->nb_subfr, st->old_fpitch, predPitchLag * st->L_frame / L_frame, pitch_buf ); + + PulseResynchronization( buf, exc, L_frame, st->nb_subfr, st->old_fpitchFB, predPitchLag ); + } + else + { + set_f( pitch_buf, st->old_fpitch, st->nb_subfr ); + } + + if ( st->nbLostCmpt == 1 ) + { + pt_exc = exc + L_frame; + pt1_exc = pt_exc - ( ( T0 == 0 ) ? Tc : T0 ); + + for ( i = 0; i < L_frame / 2; i++ ) + { + *pt_exc++ = *pt1_exc++; + } + } + + if ( fUseExtrapolatedPitch != 0 ) + { + st->old_fpitchFB = predPitchLag; + } + st->bpf_gain_param = 0; + + /* PLC: calculate damping factor */ + alpha = Damping_fact( st->core_ext_mode, st->nbLostCmpt, st->last_good, st->stab_fac, &( st->lp_gainp ), ACELP_CORE ); + + if ( st->nbLostCmpt == 1 ) + { + st->cummulative_damping = 1; + } + else + { + st->cummulative_damping *= alpha; + } + + gain = 1.0f; + if ( st->rf_frame_type == RF_TCXTD1 && st->use_partial_copy == 1 ) + { + gain = 0.5f; + } + + step = ( 1.0f / ( L_frame + ( L_frame / 2 ) ) ) * ( gain - alpha ); + + /* PLC: Apply fade out */ + for ( i = offset; i < L_frame + ( L_frame / 2 ); i++ ) + { + exc[i] *= gain; + gain -= step; + } + + offset = max( ( (int16_t) ( st->old_fpitchFB + 0.5f ) ) - L_frame / 2, 0 ); + mvr2r( exc + L_frame - offset, st->hTcxDec->old_excFB, L_frame / 2 + offset ); + + /* copy old_exc as 16kHz for acelp decoding */ + if ( st->nbLostCmpt == 1 ) + { + lerp( exc - L_frame / 2, st->old_exc, L_EXC_MEM_DEC, L_frame + L_frame / 2 ); + } + else + { + mvr2r( st->old_exc + L_FRAME16k, st->old_exc, L_FRAME16k / 2 ); + lerp( exc, st->old_exc + L_FRAME16k / 2, L_FRAME16k, L_frame ); + } + } + else + { + /* No harmonic part */ + set_zero( &exc[0], L_frame + L_frame / 2 ); + + if ( st->nbLostCmpt == 1 ) + { + st->lp_gainc = 0.0f; + + for ( i = 0; i < 2 * L_subfr; i++ ) + { + st->lp_gainc += ( exc[i - 2 * L_subfr] ) * ( exc[i - 2 * L_subfr] ); + } + st->lp_gainc = (float) sqrt( st->lp_gainc / ( 2.0f * L_subfr ) ); + } + + set_f( pitch_buf, (float) L_SUBFR, st->nb_subfr ); + + /* PLC: calculate damping factor */ + alpha = Damping_fact( st->core_ext_mode, st->nbLostCmpt, st->last_good, st->stab_fac, &( st->lp_gainp ), ACELP_CORE ); + } + + /*-----------------------------------------------------------------* + * Construct the random part of excitation + *-----------------------------------------------------------------*/ + + if ( coh != -1.f ) + { + int16_t tmpSeed1; + float alpha_coh; + float random1, random2; + + tmpSeed1 = *noise_seed; + noise = buf; + + alpha_coh = sqrtf( ( 1 - coh ) / ( 1 + coh ) ); + if ( st->idchan == 1 ) + { + alpha_coh = -alpha_coh; + } + + for ( i = 0; i < L_frame + L_FIR_FER2 - 1; i++ ) + { + random1 = (float) own_random( &tmpSeed1 ); + random2 = (float) own_random( &tmpSeed1 ); + noise[i] = random1 + alpha_coh * random2; + } + + if ( st->idchan == 1 || only_left ) + { + *noise_seed = tmpSeed1; + } + + for ( ; i < L_frame + ( L_frame / 2 ) + 2 * L_FIR_FER2; i++ ) + { + random1 = (float) own_random( &tmpSeed1 ); + random2 = (float) own_random( &tmpSeed1 ); + noise[i] = random1 + alpha_coh * random2; + } + } + else + { + tmpSeed = st->seed_acelp; + noise = buf; + + for ( i = 0; i < L_frame + L_FIR_FER2 - 1; i++ ) + { + noise[i] = (float) own_random( &tmpSeed ); + } + st->seed_acelp = tmpSeed; + + for ( ; i < L_frame + ( L_frame / 2 ) + 2 * L_FIR_FER2; i++ ) + { + noise[i] = (float) own_random( &tmpSeed ); + } + } + + if ( st->last_good == VOICED_CLAS || st->last_good == ONSET ) + { + mem = noise[0]; + preemph( &noise[1], st->output_Fs <= 16000 ? 0.2f : 0.6f, L_frame + ( L_frame / 2 ) + L_FIR_FER2, &mem ); + } + + /* high rate filter tuning */ + if ( st->output_Fs <= 16000 ) + { + for ( i = 0; i < L_FIR_FER2; i++ ) + { + hp_filt[i] = h_high3_16[i]; + } + } + else /*(st->output_Fs==32000)*/ + { + for ( i = 0; i < L_FIR_FER2; i++ ) + { + hp_filt[i] = h_high3_32[i]; + } + } + + if ( st->nbLostCmpt == 1 ) + { + highPassFiltering( st->last_good, L_frame + L_frame / 2 + L_FIR_FER2, noise, hp_filt, L_FIR_FER2 ); + } + else + { + if ( st->last_good > UNVOICED_TRANSITION ) + { + for ( i = 0; i < L_frame + L_frame / 2 + L_FIR_FER2; i++ ) + { + noise[i] = ( 1 - st->cummulative_damping ) * noise[i] + st->cummulative_damping * dotp( &noise[i], hp_filt, L_FIR_FER2 ); + } + } + } + + /* PLC: [TCX: Fade-out] retrieve background level */ + tmp = 1.0f; + if ( A_cng != NULL ) + { + gainSynthDeemph = getLevelSynDeemph( &( tmp ), A_cng, L_frame / 4, st->preemph_fac, 1 ) / 4.f; + } + else + { + gainSynthDeemph = getLevelSynDeemph( &( tmp ), A_local, L_frame / 4, st->preemph_fac, 1 ); + } + if ( st->tcxonly ) + { + gainCNG = hTcxDec->CngLevelBackgroundTrace_bfi / gainSynthDeemph; + + if ( st->element_mode == IVAS_CPE_MDCT && A_cng != NULL ) + { + if ( st->nbLostCmpt > MDCT_ST_PLC_FADEOUT_MAX_CONC_FRAME + MDCT_ST_PLC_FADEOUT_TO_ZERO_LEN ) + { + gainCNG = 0.f; + } + else if ( st->nbLostCmpt > MDCT_ST_PLC_FADEOUT_MAX_CONC_FRAME ) + { + gainCNG *= 1.f - (float) ( st->nbLostCmpt - MDCT_ST_PLC_FADEOUT_MAX_CONC_FRAME ) / MDCT_ST_PLC_FADEOUT_TO_ZERO_LEN; + } + } + } + else + { + gainCNG = st->cngTDLevel / gainSynthDeemph; + } + gain = st->lp_gainc; /* start-of-the-frame gain */ + + if ( st->rf_frame_type == RF_TCXTD1 && st->use_partial_copy == 1 ) + { + gain *= 0.7f; + } + + ftmp = 2.0f * gain; + + if ( gainCNG > ftmp ) + { + gainCNG = ftmp; + } + + st->lp_gainc = alpha * st->lp_gainc + ( 1.0f - alpha ) * gainCNG; /* end-of-the-frame gain */ + + /* PLC: [TCX: Fade-out] Linearly attenuate the gain through the frame */ + step = ( 1.0f / L_frame ) * ( gain - st->lp_gainc ); + pt_exc = noise + L_FIR_FER2 / 2; + + gain_inov = 1.0f / (float) sqrt( dotp( pt_exc, pt_exc, L_frame ) / L_frame + 0.01f ); /* normalize energy */ + + if ( ( st->last_good == UNVOICED_CLAS ) && ( st->core_ext_mode != UNVOICED ) ) + { + gain_inov *= 0.8f; + } + else if ( !( ( st->last_good == UNVOICED_CLAS ) || ( st->last_good == UNVOICED_TRANSITION ) ) ) + { + gain_inov *= ( 1.1f - 0.75f * st->lp_gainp ); + } + st->lp_gainp = alpha; + pt_exc = noise; /* non-causal ringing of the FIR filter */ + + for ( i = 0; i < L_FIR_FER2 / 2; i++ ) + { + *pt_exc++ *= ( gain_inov * gain ); + } + + for ( i = 0; i < L_frame + L_FIR_FER2 / 2; i++ ) /* Actual filtered random part of excitation */ + { + *pt_exc++ *= ( gain_inov * gain ); + gain -= step; + } + + for ( i = 0; i < ( L_frame / 2 ); i++ ) /* causal ringing of the FIR filter */ + { + *pt_exc++ *= ( gain_inov * gain ); + } + + /*-----------------------------------------------------------------* + * Construct the total excitation + *-----------------------------------------------------------------*/ + + if ( st->last_good >= UNVOICED_TRANSITION ) + { + for ( i = 0; i < ( L_frame + L_frame / 2 ); i++ ) + { + exc[i] += noise[i + ( L_FIR_FER2 / 2 )]; + } + } + else + { + mvr2r( noise + L_FIR_FER2 / 2, exc, L_frame + L_frame / 2 ); + mvr2r( exc + L_frame - 2 * L_subfr, st->hTcxDec->old_excFB, 2 * L_subfr + L_frame / 2 ); + + /* copy old_exc as 16kHz for acelp decoding */ + if ( st->nbLostCmpt == 1 ) + { + lerp( exc, st->old_exc, L_EXC_MEM_DEC, L_frame + L_frame / 2 ); + } + else + { + mvr2r( st->old_exc + L_FRAME16k, st->old_exc, L_FRAME16k / 2 ); + lerp( exc, st->old_exc + L_FRAME16k / 2, L_FRAME16k, L_frame ); + } + } + + /* Update Pitch Lag memory */ + mvr2r( &st->old_pitch_buf[st->nb_subfr], st->old_pitch_buf, st->nb_subfr ); + mvr2r( pitch_buf, &st->old_pitch_buf[st->nb_subfr], st->nb_subfr ); + + /*----------------------------------------------------------* + * - compute the synthesis speech * + *----------------------------------------------------------*/ + + syn = buf + M; + mvr2r( synth - M, buf, M ); + mvr2r( buf, mem_syn, M ); + + if ( A_cng != NULL ) + { + float alpha_delayed; + + alpha_delayed = 1.0f; + if ( st->nbLostCmpt > MDCT_ST_PLC_FADEOUT_DELAY_4_LSP_FADE ) + { + alpha_delayed = Damping_fact( st->core_ext_mode, st->nbLostCmpt - MDCT_ST_PLC_FADEOUT_DELAY_4_LSP_FADE, st->last_good, st->stab_fac, &( st->lp_gainp ), ACELP_CORE ); + } + + if ( st->plcBackgroundNoiseUpdated && alpha_delayed != 1.0f ) + { + float lsp_local[M], lsp_fade[M], alpha_inv; + + alpha_inv = 1.0f - alpha_delayed; + + a2lsp_stab( A_local, lsp_local, lsp_local ); + + for ( i = 0; i < M; i++ ) + { + lsp_fade[i] = alpha_delayed * lsp_local[i] + alpha_inv * st->lspold_cng[i]; + } + + lsp2a_stab( lsp_fade, A_local, M ); + } + } + + syn_filt( A_local, M, &exc[0], &syn[0], L_frame + ( L_frame / 2 ), mem_syn, 1 ); + + n = (int16_t) ( (float) L_frame * N_ZERO_MDCT_NS / FRAME_SIZE_NS ); + + /* update ACELP synthesis memory */ + mem_syn_r_size_old = (int16_t) ( 1.25 * L_frame / 20.f ); + + /* copy mem_syn as 16kHz */ + mem_syn_r_size_new = (int16_t) ( 1.25 * L_FRAME16k / 20.f ); + mvr2r( syn + L_frame - L_SYN_MEM, st->mem_syn_r, L_SYN_MEM ); + lerp( st->mem_syn_r + L_SYN_MEM - mem_syn_r_size_old, st->mem_syn_r + L_SYN_MEM - mem_syn_r_size_new, mem_syn_r_size_new, mem_syn_r_size_old ); + mvr2r( st->mem_syn_r + L_SYN_MEM - M, st->mem_syn2, M ); + + /* Deemphasis and output synth and ZIR */ + deemph( syn, st->preemph_fac, L_frame + L_frame / 2, &tmp_deemph ); + mvr2r( syn + L_frame - M - 1, st->syn, 1 + M ); + + + lerp( syn + L_frame - L_frame / 2, st->hTcxDec->old_syn_Overl, st->L_frame / 2, L_frame / 2 ); + mvr2r( syn + L_frame - n, st->hHQ_core->old_out, L_frame - n ); + + for ( i = 0; i < W1; i++ ) + { + st->hHQ_core->old_out[i + n] *= w[W1 - 1 - i] * w[W1 - 1 - i]; + } + set_zero( &st->hHQ_core->old_out[W1 + n], n ); + + mvr2r( syn, synth, L_frame ); + + mvr2r( syn + L_frame, st->hTcxDec->syn_OverlFB, L_frame / 2 ); + + /* copy total excitation exc2 as 16kHz for ACELP MODE1 decoding */ + if ( st->hWIDec != NULL ) + { + lerp( exc, st->hWIDec->old_exc2, L_EXC_MEM, L_frame ); + lerp( syn, st->hWIDec->old_syn2, L_EXC_MEM, L_frame ); + } + st->bfi_pitch = pitch_buf[st->nb_subfr - 1]; + st->bfi_pitch_frame = st->L_frame; + + /* create aliasing and windowing need for transition to TCX10/5 */ + mvr2r( syn + L_frame, st->hTcxDec->syn_Overl_TDACFB, L_frame / 2 ); + + for ( i = 0; i < W1; i++ ) + { + buf[i] = st->hTcxDec->syn_Overl_TDACFB[i] * w[W1 - 1 - i]; + } + + for ( i = 0; i < W2; i++ ) + { + st->hTcxDec->syn_Overl_TDACFB[i] = buf[i] + buf[W1 - 1 - i]; /* A-D */ + } + + for ( i = 0; i < W2; i++ ) + { + st->hTcxDec->syn_Overl_TDACFB[W2 + i] = buf[W2 + i] + buf[W1 - 1 - W2 - i]; /* B-C */ + } + + for ( i = 0; i < W1; i++ ) + { + st->hTcxDec->syn_Overl_TDACFB[i] *= w[W1 - 1 - i]; + } + + st->hTcxCfg->tcx_curr_overlap_mode = FULL_OVERLAP; + synth[-1] = pre_emph_buf; + + /* update memory for low band */ + lerp( st->hTcxDec->syn_OverlFB, st->hTcxDec->syn_Overl, st->L_frame / 2, L_frame / 2 ); + lerp( st->hTcxDec->syn_Overl_TDACFB, st->hTcxDec->syn_Overl_TDAC, st->L_frame / 2, L_frame / 2 ); + lerp( st->hHQ_core->old_out, st->hHQ_core->old_outLB, st->L_frame, L_frame ); + + st->old_enr_LP = enr_1_Az( A_local, L_SUBFR ); + + return; +} diff --git a/lib_dec/er_scale_syn.c b/lib_dec/er_scale_syn.c new file mode 100644 index 0000000000000000000000000000000000000000..d6d048b234a115a4ddf10b64725d5e6bd44ce045 --- /dev/null +++ b/lib_dec/er_scale_syn.c @@ -0,0 +1,140 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "prot.h" +#include "cnst.h" +#include "wmc_auto.h" + + +/*----------------------------------------------------------------------------------* + * Damping_fact() + * + * Estimate damping factor + *----------------------------------------------------------------------------------*/ + +float Damping_fact( + const int16_t coder_type, + const int16_t nbLostCmpt, + int16_t last_good, + float stab_fac, + float *lp_gainp, + const int16_t core ) +{ + float alpha, gain; + + if ( core == ACELP_CORE ) + { + alpha = ALPHA_VT; /* rapid convergence to 0 */ + if ( ( coder_type == UNVOICED ) && ( nbLostCmpt <= 3 ) ) /* Clear unvoiced last good frame */ + { + alpha = ALPHA_UU; + } + else if ( last_good == UNVOICED_CLAS ) + { + if ( nbLostCmpt == 1 ) + { + /* If stable, do not decrease the energy, pitch gain = 0 */ + alpha = stab_fac * ( 1.0f - 2.0f * ALPHA_U ) + 2.0f * ALPHA_U; /* [0.8, 1.0] */ + } + else if ( nbLostCmpt == 2 ) + { + alpha = ALPHA_U * 1.5f; /* 0.6 */ + } + else + { + alpha = ALPHA_U; /* 0.4 go rapidly to CNG gain, pitch gain = 0 */ + } + } + else if ( last_good == UNVOICED_TRANSITION ) + { + alpha = ALPHA_UT; + } + else if ( ( last_good == ONSET ) && ( nbLostCmpt <= 3 ) && ( coder_type == GENERIC ) ) + { + alpha = 0.8f; + } + else if ( ( ( last_good == VOICED_CLAS ) || ( last_good == ONSET ) ) && ( nbLostCmpt <= 3 ) ) + { + alpha = ALPHA_V; /* constant for the first 3 erased frames */ + } + if ( last_good >= VOICED_CLAS ) + { + if ( nbLostCmpt == 1 ) /* if first erased frame in a block, reset harmonic gain */ + { + gain = (float) sqrt( *lp_gainp ); /* move pitch gain towards 1 for voiced to remove energy fluctuations */ + + if ( gain > 0.98f ) + { + gain = 0.98f; + } + else if ( gain < 0.85f ) + { + gain = 0.85f; + } + alpha *= gain; + } + else if ( nbLostCmpt == 2 ) + { + alpha = ( 0.6f + 0.35f * stab_fac ) * *lp_gainp; + } + else + { + *lp_gainp *= ( 0.7f + 0.2f * stab_fac ); + alpha = *lp_gainp; + } + } + } + else + { + if ( nbLostCmpt < 2 ) + { + alpha = ( 0.7f + 0.3f * stab_fac ); + } + else if ( nbLostCmpt == 2 ) + { + alpha = ( 0.45f + 0.4f * stab_fac ); + } + else + { + alpha = 0.35f + 0.4f * stab_fac; + } + } + + return alpha; +} diff --git a/lib_dec/er_sync_exc.c b/lib_dec/er_sync_exc.c new file mode 100644 index 0000000000000000000000000000000000000000..b28a172715875c93696b27547bbf4e2efd86bd6a --- /dev/null +++ b/lib_dec/er_sync_exc.c @@ -0,0 +1,335 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include "options.h" +#include +#include "prot.h" +#include "cnst.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * Local constants + *--------------------------------------------------------------------*/ + +#define NB_PULSES_MAX 15 + + +/*-------------------------------------------------------------------* + * GetMinimumPosition() + * + * Get the location of the minimum energy in the given signal. + *--------------------------------------------------------------------*/ + +/*! r: Index of the position of the minimum energy, that is the position i where filter(x[i-filterLength/2],...,x[i+(filterLength-filterLength/2)-1]) is at maximum. */ +static int16_t GetMinimumPosition( + const float *x, /* i : input signal */ + const int16_t length, /* i : length of the filter length used for the energy calculation */ + int16_t filterLength /* i : length of the filter length used for the energy calculation */ +) +{ + int16_t iMinEnergyPos, center, i; + float energy; + + filterLength = min( filterLength, length ); + center = filterLength / 2; + iMinEnergyPos = center; + if ( filterLength > 0 ) + { + energy = 0; + center += 1; /* To avoid adding 1 in the loop */ + for ( i = 0; i < length - filterLength; i++ ) + { + energy -= x[i] * x[i]; + energy += x[i + filterLength] * x[i + filterLength]; + if ( energy < 0 ) + { + energy = 0; + iMinEnergyPos = i + center; + } + } + } + + return iMinEnergyPos; +} + + +static void AddSamples( + const float *old_exc, + float *new_exc, + const int16_t L_frame, + const int16_t n_samples_to_add, + const int16_t min_pos[], + const int16_t points_by_pos[], + const int16_t nb_min ) +{ + float *pt_dest; + const float *pt_src; + int16_t last_min_pos, i, j; + + pt_dest = new_exc; + pt_src = old_exc; + last_min_pos = 0; + for ( i = 0; i < nb_min; i++ ) + { + float ftmp; + + /* Copy section */ + for ( j = min_pos[i] - last_min_pos; j > 0; j-- ) + { + *pt_dest++ = *pt_src++; + } + + /* Add some samples */ + ftmp = -( *pt_src / 20 ); + for ( j = 0; j < points_by_pos[i]; j++ ) + { + *pt_dest++ = ftmp; + ftmp = -ftmp; + } + + /* Prepare for the next loop iteration */ + last_min_pos = min_pos[i]; + } + + /* Copy remaining length */ + for ( j = L_frame - n_samples_to_add - last_min_pos; j > 0; j-- ) + { + *pt_dest++ = *pt_src++; + } + + return; +} + + +static void RemoveSamples( + const float *old_exc, + float *new_exc, + const int16_t L_frame, + const int16_t n_samples_to_add, + const int16_t min_pos[], + const int16_t points_by_pos[], + const int16_t nb_min ) +{ + float *pt_dest; + const float *pt_src; + int16_t last_min_pos, i, j; + + pt_dest = new_exc + L_frame; + last_min_pos = L_frame - n_samples_to_add; + for ( i = nb_min - 1; i >= 0; i-- ) + { + /* Compute len to copy */ + /* Copy section, removing some samples */ + pt_src = old_exc + last_min_pos; + for ( j = last_min_pos - ( min_pos[i] + points_by_pos[i] ); j > 0; j-- ) + { + *--pt_dest = *--pt_src; + } + + /* Prepare for the next loop iteration */ + last_min_pos = min_pos[i]; + } + + /* Copy remaining length */ + pt_src = old_exc + last_min_pos; + for ( j = last_min_pos; j > 0; j-- ) + { + *--pt_dest = *--pt_src; + } + + return; +} + + +/*-------------------------------------------------------------------* + * PulseResynchronization() + * + * Resynchronize glottal pulse positions of the signal in src_exc and store it in dst_exc + *--------------------------------------------------------------------*/ + +void PulseResynchronization( + const float *src_exc, /* i : Input excitation buffer */ + float *dst_exc, /* o : output excitation buffer */ + const int16_t nFrameLength, /* i : frame length */ + const int16_t nSubframes, /* i : Number of subframes */ + const float pitchStart, /* i : Pitch at the end of the last frame */ + const float pitchEnd /* i : Pitch at the end of the current frame */ +) +{ + int16_t T0, i, k; + float pitchDelta, samplesDelta, perCycleDeltaDelta, cycleDelta, freqStart, fractionalLeft, absPitchDiff; + int16_t roundedPitchStart, nSamplesDelta, nSamplesDeltaRemain, iMinPos1, iMinPos[NB_PULSES_MAX + 1], iDeltaSamples[NB_PULSES_MAX + 1], maxDeltaSamples, roundedCycleDelta; + + assert( ( nFrameLength > 0 ) && ( nFrameLength > pitchStart ) && ( nSubframes > 1 ) && ( nSubframes <= 5 ) && ( nFrameLength % nSubframes == 0 ) && ( pitchStart > 0 ) && ( pitchEnd > 0 ) && ( pitchEnd / pitchStart > 1 - 2.0f / ( nSubframes + 1 ) ) && ( src_exc != NULL ) && ( dst_exc != NULL ) && ( src_exc < dst_exc ) ); + + pitchDelta = ( pitchEnd - pitchStart ) / nSubframes; + roundedPitchStart = (int16_t) ( pitchStart + 0.5f ); + freqStart = 1.0f / roundedPitchStart; + + /* Calculate number of samples to be removed (if negative) or added (if positive) */ + samplesDelta = 0.5f * pitchDelta * nFrameLength * ( nSubframes + 1 ) * freqStart; + samplesDelta -= nFrameLength * ( 1.0f - pitchStart * freqStart ); + + /* To have enough samples in the buffer of length nFrameLength*(nSubframes+1)/nSubframes, pitchEnd/pitchEnd must be bigger than (nSubframes-1)/(nSubframes+1)=1-2/(nSubframes+1) */ + /* Thus nSubframes must be bigger than 1 */ + nSamplesDelta = (int16_t) floor( samplesDelta + 0.5f ); + nSamplesDeltaRemain = (int16_t) abs( nSamplesDelta ); + + /* Find the location of the glottal pulse */ + T0 = maximumAbs( src_exc, roundedPitchStart, NULL ); + + /* Get the index of the last pulse in the resynchronized frame */ + k = (int16_t) ceil( ( nFrameLength - nSamplesDelta - T0 ) * freqStart - 1 ); + if ( ( k >= 0 ) && ( k + 1 <= NB_PULSES_MAX ) ) + { + absPitchDiff = (float) fabs( roundedPitchStart - pitchEnd ); + + /* Calculate the delta of the samples to be added/removed between consecutive cycles */ + perCycleDeltaDelta = ( absPitchDiff * ( nFrameLength - samplesDelta ) - (float) fabs( samplesDelta ) * roundedPitchStart ) / ( ( k + 1 ) * ( T0 + 0.5f * k * roundedPitchStart ) ); + + /* Calculate the integer number of samples to be added/removed in each pitch cycle */ + cycleDelta = max( 0, ( absPitchDiff - ( k + 1 ) * perCycleDeltaDelta ) * T0 * freqStart ); + roundedCycleDelta = (int16_t) ( cycleDelta ); + iDeltaSamples[0] = roundedCycleDelta; + fractionalLeft = cycleDelta - roundedCycleDelta; + nSamplesDeltaRemain -= roundedCycleDelta; + for ( i = 1; i <= k; i++ ) + { + cycleDelta = ( absPitchDiff - ( k + 1 - i ) * perCycleDeltaDelta ) + fractionalLeft; + cycleDelta = max( 0, cycleDelta ); + + /* Make sure that the number of samples increases */ + if ( roundedCycleDelta > cycleDelta ) + { + iDeltaSamples[i] = roundedCycleDelta; + roundedCycleDelta = (int16_t) ( cycleDelta ); + iDeltaSamples[i - 1] = roundedCycleDelta; + } + else + { + roundedCycleDelta = (int16_t) ( cycleDelta ); + iDeltaSamples[i] = roundedCycleDelta; + } + fractionalLeft = cycleDelta - roundedCycleDelta; + nSamplesDeltaRemain -= roundedCycleDelta; + } + + iDeltaSamples[k + 1] = max( 0, nSamplesDeltaRemain ); + maxDeltaSamples = max( iDeltaSamples[k], iDeltaSamples[k + 1] ); + + /* Find the location of the minimum energy between the first two pulses */ + iMinPos1 = T0 + GetMinimumPosition( src_exc + T0, min( roundedPitchStart, ( nSubframes + 1 ) * nFrameLength / nSubframes - T0 ), maxDeltaSamples ); + if ( nSamplesDelta < 0 ) + { + /* Find the location of the minimum energy before the first pulse */ + if ( iMinPos1 > roundedPitchStart + iDeltaSamples[0] / 2 ) + { + iMinPos[0] = iMinPos1 - roundedPitchStart - iDeltaSamples[0] / 2; + } + else + { + iMinPos[0] = GetMinimumPosition( src_exc, T0, iDeltaSamples[0] ) - iDeltaSamples[0] / 2; + } + + /* Find the location of the minimum energy between the pulses */ + for ( i = 1; i <= k; i++ ) + { + iMinPos[i] = iMinPos1 + ( i - 1 ) * roundedPitchStart - iDeltaSamples[i] / 2; + } + + /* Find the location of the minimum energy after the last pulse */ + if ( iMinPos1 + k * roundedPitchStart + iDeltaSamples[k + 1] - iDeltaSamples[k + 1] / 2 < nFrameLength - nSamplesDelta ) + { + iMinPos[k + 1] = iMinPos1 + k * roundedPitchStart - iDeltaSamples[k + 1] / 2; + } + else + { + iMinPos[k + 1] = T0 + k * roundedPitchStart + GetMinimumPosition( src_exc + T0 + k * roundedPitchStart, nFrameLength - nSamplesDelta - ( T0 + k * roundedPitchStart ), iDeltaSamples[k + 1] ) - iDeltaSamples[k + 1] / 2; + } + + if ( iMinPos[k + 1] + iDeltaSamples[k + 1] > nFrameLength - nSamplesDelta ) + { + iDeltaSamples[k] += iMinPos[k + 1] + iDeltaSamples[k + 1] - ( nFrameLength - nSamplesDelta ); + iDeltaSamples[k + 1] = nFrameLength - nSamplesDelta - iMinPos[k + 1]; + } + + /* Remove samples at the given positions */ + RemoveSamples( src_exc, dst_exc, nFrameLength, nSamplesDelta, iMinPos, iDeltaSamples, k + 2 ); + } + else + { + /* Find the location of the minimum energy before the first pulse */ + if ( iMinPos1 > roundedPitchStart ) + { + iMinPos[0] = iMinPos1 - roundedPitchStart; + } + else + { + iMinPos[0] = GetMinimumPosition( src_exc, T0, iDeltaSamples[0] ); + } + + /* Find the location of the minimum energy between the pulses */ + for ( i = 1; i <= k; i++ ) + { + iMinPos[i] = iMinPos1; + iMinPos1 += roundedPitchStart; + } + + /* Find the location of the minimum energy after the last pulse */ + if ( iMinPos1 < nFrameLength - nSamplesDelta ) + { + iMinPos[k + 1] = iMinPos1; + } + else + { + iMinPos[k + 1] = T0 + k * roundedPitchStart + GetMinimumPosition( src_exc + T0 + k * roundedPitchStart, nFrameLength - nSamplesDelta - ( T0 + k * roundedPitchStart ), iDeltaSamples[k + 1] ); + } + + if ( iMinPos[k + 1] + iDeltaSamples[k + 1] > nFrameLength - nSamplesDelta ) + { + iDeltaSamples[k] += iMinPos[k + 1] + iDeltaSamples[k + 1] - ( nFrameLength - nSamplesDelta ); + iDeltaSamples[k + 1] = nFrameLength - nSamplesDelta - iMinPos[k + 1]; + } + + /* Add samples at the given positions */ + AddSamples( src_exc, dst_exc, nFrameLength, nSamplesDelta, iMinPos, iDeltaSamples, k + 2 ); + } + } + + return; +} diff --git a/lib_dec/er_util.c b/lib_dec/er_util.c new file mode 100644 index 0000000000000000000000000000000000000000..965b527a7d2b97be001719d95f70e5b825f35f5e --- /dev/null +++ b/lib_dec/er_util.c @@ -0,0 +1,338 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "prot.h" +#include "cnst.h" +#include "stat_com.h" +#include "wmc_auto.h" + + +/*---------------------------------------------------------------------* + * minimumStatistics() + * + * + *---------------------------------------------------------------------*/ + +void minimumStatistics( + float *noiseLevelMemory, + int16_t *noiseLevelIndex, + int16_t *currLevelIndex, + float *noiseEstimate, + float *lastFrameLevel, + float currentFrameLevel, + const float minLev, + const int16_t buffSize ) +{ + float aOpt, f; + int16_t p, i; + + if ( currentFrameLevel < minLev ) + { + currentFrameLevel = minLev; + } + /* compute optimal factor aOpt for recursive smoothing of frame minima */ + if ( *lastFrameLevel >= *noiseEstimate ) + { + aOpt = *noiseEstimate / *lastFrameLevel; + } + else + { + aOpt = *lastFrameLevel / *noiseEstimate; + } + aOpt *= aOpt; + *lastFrameLevel = currentFrameLevel; + /* recursively compute smoothed frame minima using optimal factor aOpt */ + f = currentFrameLevel * ( 1.0f - aOpt ); + f += aOpt * noiseLevelMemory[( *currLevelIndex ? *currLevelIndex : buffSize ) - 1]; + /* if current frame min is a new local min, set index to current index */ + p = *noiseLevelIndex; + if ( noiseLevelMemory[p] >= f ) + { + noiseLevelMemory[*currLevelIndex] = f; + p = *currLevelIndex; + } + else + { + noiseLevelMemory[*currLevelIndex] = f; + /* current min is not a new min, so check if min must be re-searched */ + if ( p != *currLevelIndex ) + { + f = noiseLevelMemory[p]; /* min is still in memory, so return it */ + } + else + { + /* p == currLevelIndex; min was removed from memory, re-search min */ + for ( i = *currLevelIndex + 1; i < buffSize; i++ ) + { + if ( f >= noiseLevelMemory[i] ) + { + f = noiseLevelMemory[i]; + p = i; + } + } + for ( i = 0; i <= *currLevelIndex; i++ ) + { + if ( f >= noiseLevelMemory[i] ) + { + f = noiseLevelMemory[i]; + p = i; + } + } + } + } + /* update local-minimum-value index and current circular-buffer index */ + *noiseLevelIndex = p; + p = *currLevelIndex + 1; + *currLevelIndex = ( p == buffSize ) ? 0 : p; + + *noiseEstimate = f; + + return; +} + +/*---------------------------------------------------------------------* + * getLevelSynDeemph() + * + * PLC: [ACELP: Fade-out] + * PLC: getLevelSynDeemph: derives on frame or subframe basis the level + * of LPC synthesis and deeemphasis based on the given input + *----------------------------------------------------------------------*/ + +float getLevelSynDeemph( + const float h1Init[], /* i : input value or vector to be processed */ + const float A[], /* i : LPC coefficients */ + const int16_t lenLpcExc, /* i : length of the LPC excitation buffer */ + const float preemph_fac, /* i : preemphasis factor */ + const int16_t numLoops /* i : number of loops */ +) +{ + float levelSynDeemphSub; + float levelSynDeemph = 0; + float h1[L_FRAME_PLUS / 4]; + float mem[M]; + float tmp = 0; + int16_t loop; + + for ( loop = 0; loop < numLoops; loop++ ) + { + set_zero( h1, lenLpcExc ); + set_zero( mem, M ); + + h1[0] = *h1Init; + + syn_filt( A, M, h1, h1, lenLpcExc, mem, 0 ); + deemph( h1, preemph_fac, lenLpcExc, &tmp ); + A += ( M + 1 ); + + /* gain introduced by synthesis+deemphasis */ + levelSynDeemphSub = (float) sqrt( dotp( h1, h1, lenLpcExc ) ); + + /* mean of the above across all subframes */ + levelSynDeemph += ( 1.0f / (float) numLoops ) * levelSynDeemphSub; + } + + return levelSynDeemph; +} + + +/*--------------------------------------------------------------------- + * genPlcFiltBWAdap() + * + * + *---------------------------------------------------------------------*/ + +void genPlcFiltBWAdap( + const int32_t sr_core, /* i : core sampling rate */ + float *lpFiltAdapt, /* o : filter coefficients for filtering codebooks in case of flc */ + const int16_t type, /* i : type of filter, either 0 : lowpass or 1 : highpass */ + const float alpha /* i : fade out factor [0 1) used decrease filter tilt */ +) +{ + float a; + + switch ( sr_core ) + { + case INT_FS_16k: + a = 0.4000f; + break; + default: + a = 0.2813f; /*sr_core = INT_FS_12k8 */ + break; + } + + switch ( type ) + { + case 0: + *lpFiltAdapt++ = a / ( 2.f * a + 1.f ); + *lpFiltAdapt++ = 1.f / ( 2.f * a + 1.f ); + *lpFiltAdapt = a / ( 2.f * a + 1.f ); + break; + case 1: + a *= alpha; + *lpFiltAdapt++ = -a / ( 2.f * a + 1.f ); + *lpFiltAdapt++ = 1.f / ( 2.f * a + 1.f ); + *lpFiltAdapt = -a / ( 2.f * a + 1.f ); + break; + default: + IVAS_ERROR( IVAS_ERR_INTERNAL, "PLC: Filter type neither lowpass nor highpass." ); + break; + } + + return; +} + +/*------------------------------------------------------------------ + * highPassFiltering() + * + * PLC: [ACELP: general] + * PLC: high pass filtering + *-----------------------------------------------------------------*/ + +void highPassFiltering( + const int16_t last_good, /* i : last classification type */ + const int16_t L_buffer, /* i : buffer length */ + float exc2[], /* i/o: unvoiced excitation before the high pass filtering */ + const float hp_filt[], /* i : high pass filter coefficients */ + const int16_t l_fir_fer /* i : high pass filter length */ +) +{ + int16_t i; + + if ( last_good > UNVOICED_TRANSITION ) + { + for ( i = 0; i < L_buffer; i++ ) + { + exc2[i] = dotp( &exc2[i], hp_filt, l_fir_fer ); + } + } + + return; +} + +/*--------------------------------------------------------------------- + * GetPLCModeDecision() + * + * PLC: [Common: mode decision] + * PLC: Decide which Concealment to use. Update pitch lags if needed + *--------------------------------------------------------------------*/ + +int16_t GetPLCModeDecision( + Decoder_State *st /* i/o: decoder memory state pointer */ +) +{ + int16_t core; + int16_t numIndices = 0; + TCX_DEC_HANDLE hTcxDec = st->hTcxDec; + + if ( st->flagGuidedAcelp == 1 ) + { + /* update mem_lag according to info available on future frame */ + st->old_pitch_buf[2 * st->nb_subfr] = (float) st->guidedT0; + st->old_pitch_buf[2 * st->nb_subfr + 1] = (float) st->guidedT0; + st->mem_pitch_gain[0] = st->mem_pitch_gain[1] = 1.f; + } + if ( ( st->last_core > ACELP_CORE && hTcxDec->tcxltp_last_gain_unmodified != 0 ) || ( st->flagGuidedAcelp == 1 ) ) + { + /* no updates needed here, because already updated in last good frame */ + st->plc_use_future_lag = 1; + } + else + { + st->plc_use_future_lag = 0; + } + if ( st->last_core == -1 ) + { + if ( st->Opt_AMR_WB ) + { + core = ACELP_CORE; + } + else + { + core = TCX_20_CORE; + } + st->last_core = ACELP_CORE; + st->tonal_mdct_plc_active = 0; + } + else + { + core = ACELP_CORE; + if ( st->nbLostCmpt > 1 ) + { + core = st->last_core_bfi; + } + + /* no FD TCX PLC after a TCX transition frame: the appropriate framing is not implemented */ + if ( st->nbLostCmpt == 1 ) + { + st->tonal_mdct_plc_active = 0; + if ( !( st->rf_flag && st->use_partial_copy && ( st->rf_frame_type == RF_TCXTD1 || st->rf_frame_type == RF_TCXTD2 ) ) ) + { + if ( st->hTonalMDCTConc != NULL && st->last_core == TCX_20_CORE && st->second_last_core == TCX_20_CORE && ( ( st->old_fpitch <= 0.5f * st->L_frame ) || ( hTcxDec->tcxltp_last_gain_unmodified <= 0.4f ) ) + /* it is fine to call the detection even if no ltp information + is available, meaning that st->old_fpitch == + st->tcxltp_second_last_pitch == st->L_frame */ + && ( st->old_fpitch == hTcxDec->tcxltp_second_last_pitch ) && !st->last_tns_active && !st->second_last_tns_active ) + { + + TonalMDCTConceal_Detect( st->hTonalMDCTConc, ( hTcxDec->tcxltp_last_gain_unmodified > 0 ) ? st->old_fpitch : 0, &numIndices, + ( st->element_mode == IVAS_CPE_MDCT ? &( st->hTcxCfg->psychParamsTCX20 ) : st->hTcxCfg->psychParamsCurrent ) ); + + if ( ( numIndices > 10 ) || ( ( numIndices > 5 ) && ( fabs( hTcxDec->tcxltp_third_last_pitch - hTcxDec->tcxltp_second_last_pitch ) < 0.5f ) ) || ( ( numIndices > 0 ) && ( ( st->last_good <= UNVOICED_TRANSITION ) || ( hTcxDec->tcxltp_last_gain_unmodified <= 0.4f ) ) && ( fabs( hTcxDec->tcxltp_third_last_pitch - hTcxDec->tcxltp_second_last_pitch ) < 0.5f ) ) ) + { + core = TCX_20_CORE; + st->tonal_mdct_plc_active = 1; + } + else if ( st->last_good <= UNVOICED_TRANSITION || hTcxDec->tcxltp_last_gain_unmodified <= 0.4f ) + { + core = TCX_20_CORE; + } + } + else if ( st->last_core != ACELP_CORE ) + { + if ( st->last_good <= UNVOICED_TRANSITION || hTcxDec->tcxltp_last_gain_unmodified <= 0.4f ) + { + core = st->last_core; + } + } + } + } + } + + return core; +} diff --git a/lib_dec/evs_dec.c b/lib_dec/evs_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..7b6dc2b9d811f95baf4241ae93ffc871b8d1f7dd --- /dev/null +++ b/lib_dec/evs_dec.c @@ -0,0 +1,944 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "wmc_auto.h" + +/*--------------------------------------------------------------------------* + * evs_dec() + * + * Principal decoder routine + *--------------------------------------------------------------------------*/ + +ivas_error evs_dec( + Decoder_State *st, /* i/o: Decoder state structure */ + float mem_hp20_out[L_HP20_MEM], /* i/o: HP filter memory for synthesis */ + float *output, /* o : output synthesis signal */ + FRAME_MODE frameMode /* i : Decoder frame mode */ +) +{ + int16_t i, output_frame; + int16_t sharpFlag; + float synth[L_FRAME48k]; + float hb_synth[L_FRAME48k]; + float tmp_buffer[L_FRAME48k]; + int16_t tmps, incr; + float bwe_exc_extended[L_FRAME32k + NL_BUFF_OFFSET]; + float voice_factors[NB_SUBFR16k]; + float fb_exc[L_FRAME16k]; + int16_t core_switching_flag; + float old_syn_12k8_16k[L_FRAME16k]; + float tmp, tmpF; + float pitch_buf[NB_SUBFR16k]; + int16_t unbits; + int16_t hq_core_type; + int16_t sid_bw; + int16_t delay_comp, delta, delay_tdbwe; + int16_t concealWholeFrame; /* status after decoding */ + int16_t concealWholeFrameTmp; + float pcmbufFB[L_FRAME_MAX]; + TCX_LTP_DEC_HANDLE hTcxLtpDec = st->hTcxLtpDec; + ivas_error error; + + error = IVAS_ERR_OK; + + push_wmops( "evs_dec" ); + /*------------------------------------------------------------------* + * Initialization + *-----------------------------------------------------------------*/ + + st->idchan = 0; + st->flag_ACELP16k = set_ACELP_flag( EVS_MONO, -1, st->total_brate, 0, 0, -1, -1 ); + + tmps = 0; + delay_tdbwe = 0; + sid_bw = -1; + concealWholeFrameTmp = -1; + if ( !st->bfi ) + { + st->extl = -1; + } + + output_frame = (int16_t) ( st->output_Fs / FRAMES_PER_SEC ); + + core_switching_flag = 0; + sharpFlag = 0; + unbits = 0; + + st->use_partial_copy = 0; + st->rf_flag = 0; + + if ( st->bfi == 1 ) + { + hq_core_type = st->hHQ_core->last_hq_core_type; + st->coder_type = st->last_coder_type; + } + else + { + hq_core_type = -1; + st->coder_type = INACTIVE; + } + + /* PLC: [TCX: Fade-out-recovery] + * PLC: overlapping part needs to be attenuated for first good frame */ + if ( !st->bfi && st->prev_bfi && ( st->last_codec_mode == MODE2 ) && ( st->last_core_bfi == TCX_20_CORE || st->last_core_bfi == TCX_10_CORE ) ) + { + v_multc( st->hHQ_core->old_out, st->hPlcInfo->recovery_gain, st->hHQ_core->old_out, st->hTcxDec->L_frameTCX ); + v_multc( st->hHQ_core->old_outLB, st->hPlcInfo->recovery_gain, st->hHQ_core->old_outLB, st->L_frame ); + + if ( !st->hTcxCfg->last_aldo ) + { + v_multc( st->hTcxDec->syn_OverlFB, st->hPlcInfo->recovery_gain, st->hTcxDec->syn_OverlFB, st->hTcxCfg->tcx_mdct_window_lengthFB ); + v_multc( st->hTcxDec->syn_Overl, st->hPlcInfo->recovery_gain, st->hTcxDec->syn_Overl, st->hTcxCfg->tcx_mdct_window_length ); + } + } + + set_f( voice_factors, 0.f, NB_SUBFR16k ); + + set_f( hb_synth, 0.0f, L_FRAME48k ); + + st->rate_switching_reset = 0; + + if ( !st->bfi ) + { + st->flagGuidedAcelp = 0; + } + + /*----------------------------------------------------------------* + * Updates in case of AMR-WB IO mode -> EVS primary mode switching + *----------------------------------------------------------------*/ + + if ( st->last_core == AMR_WB_CORE ) + { + updt_IO_switch_dec( output_frame, st ); + } + + if ( frameMode != FRAMEMODE_MISSING ) /* frame mode normal or future frame */ + { + getPartialCopyInfo( st, &sharpFlag ); + frameMode = st->bfi; + } + + if ( st->rf_frame_type == RF_NO_DATA && st->use_partial_copy ) + { + /* the partial copy is a RF FRAME_NO_DATA frame and should follow the concealment path*/ + st->bfi = 1; + st->codec_mode = st->last_codec_mode; + frameMode = FRAMEMODE_MISSING; + st->use_partial_copy = 0; + } + + /* if previous frame was concealed via ACELP, drop TCX partial copy info and continue ACELP concealment */ + if ( st->use_partial_copy && st->core == TCX_20_CORE && st->prev_bfi && st->last_core == ACELP_CORE ) + { + st->bfi = 1; + st->codec_mode = st->last_codec_mode; + frameMode = FRAMEMODE_MISSING; + st->use_partial_copy = 0; + st->core = ACELP_CORE; + } + + /* if previous frame was HQ Core/TCX10/TCX20 (high bitrate), drop partial copy info and continue HQ Core/TCX10/TCX20 concealment */ + if ( st->use_partial_copy && ( st->last_core == HQ_CORE || st->last_core == TCX_10_CORE || ( st->last_core == TCX_20_CORE && getTcxonly( EVS_MONO, st->last_total_brate, 0, 0 ) ) ) ) + { + st->bfi = 1; + st->codec_mode = st->last_codec_mode; + frameMode = FRAMEMODE_MISSING; + st->use_partial_copy = 0; + st->core = st->last_core; + } + + /*------------------------------------------------------------------* + * Decoding + *-----------------------------------------------------------------*/ + + if ( st->codec_mode == MODE1 ) + { + /*------------------------------------------------------------------* + * Decision matrix (selection of technologies) + *-----------------------------------------------------------------*/ + + /* decision matrix (selection of technologies) */ + if ( st->bfi != 1 ) + { + decision_matrix_dec( st, &sharpFlag, &hq_core_type, &core_switching_flag ); + + if ( st->bfi != 1 ) + { + st->sr_core = st->L_frame * FRAMES_PER_SEC; + st->fscale_old = st->fscale; + st->fscale = sr2fscale( st->sr_core ); + } + else + { + frameMode = FRAMEMODE_MISSING; + } + } + } + + if ( st->codec_mode == MODE1 ) + { + /*------------------------------------------------------------------* + * Initialization + *-----------------------------------------------------------------*/ + + if ( st->bfi == 1 ) + { + st->nbLostCmpt++; + } + else + { + st->nbLostCmpt = 0; + } + st->enablePlcWaveadjust = 0; + + /*---------------------------------------------------------------------* + * Detect bandwidth switching + *---------------------------------------------------------------------*/ + + bandwidth_switching_detect( st ); + + /*---------------------------------------------------------------------* + * Preprocessing (preparing) for ACELP/HQ core switching + *---------------------------------------------------------------------*/ + + if ( ( error = core_switching_pre_dec( st, output_frame, -1, -1, EVS_MONO, -1 ) ) != IVAS_ERR_OK ) + { + return error; + } + + /*---------------------------------------------------------------------* + * ACELP core decoding + * HQ core decoding + *---------------------------------------------------------------------*/ + + if ( st->core == ACELP_CORE ) + { + /* ACELP core decoder */ + if ( ( error = acelp_core_dec( st, NULL, synth, NULL, bwe_exc_extended, voice_factors, old_syn_12k8_16k, sharpFlag, pitch_buf, &unbits, &sid_bw, NULL, NULL, NULL, 0, EVS_MONO, 0, 0, 1, NULL, 1 ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + /* HQ core decoder */ + hq_core_dec( st, synth, output_frame, hq_core_type, core_switching_flag, NULL ); + } + + /*---------------------------------------------------------------------* + * Postprocessing for ACELP/MDCT core switching + *---------------------------------------------------------------------*/ + + if ( ( error = core_switching_post_dec( st, synth, NULL, NULL, 0, MONO_FORMAT, output_frame, core_switching_flag, 0, -1, EVS_MONO ) ) != IVAS_ERR_OK ) + { + return error; + } + + + /*---------------------------------------------------------------------* + * Pre-processing for bandwidth switching + *---------------------------------------------------------------------*/ + push_wmops( "BWE_decoding" ); + + bw_switching_pre_proc( st, old_syn_12k8_16k, -1, 1 ); + + /*---------------------------------------------------------------------* + * WB TBE decoding + * WB BWE decoding + *---------------------------------------------------------------------*/ + + if ( st->extl == WB_TBE ) + { + /* WB TBE decoder */ + wb_tbe_dec( st, bwe_exc_extended, voice_factors, hb_synth ); + } + + if ( st->extl == WB_BWE && st->bws_cnt == 0 ) + { + /* WB BWE decoder */ + wb_bwe_dec( st, NULL, synth, hb_synth, 0, output_frame, voice_factors, pitch_buf ); + } + + /*---------------------------------------------------------------------* + * SWB(FB) TBE decoding + * SWB(FB) BWE decoding + *---------------------------------------------------------------------*/ + + if ( st->extl == SWB_TBE || st->extl == FB_TBE || ( st->coder_type != AUDIO && st->coder_type != INACTIVE && st->core_brate >= SID_2k40 && st->core == ACELP_CORE && st->output_Fs >= 32000 && st->bwidth > NB && st->bws_cnt > 0 && !st->ppp_mode_dec && !( st->nelp_mode_dec == 1 && st->bfi == 1 ) ) ) + { + /* SWB TBE decoder */ + swb_tbe_dec( st, NULL, bwe_exc_extended, voice_factors, old_syn_12k8_16k, fb_exc, hb_synth, pitch_buf ); + + /* FB TBE decoder */ + if ( output_frame == L_FRAME48k && st->extl == FB_TBE ) + { + fb_tbe_dec( st, fb_exc, hb_synth, NULL, L_FRAME48k ); + } + } + else if ( st->extl == SWB_BWE || st->extl == FB_BWE || ( st->output_Fs >= 32000 && st->core == ACELP_CORE && st->bwidth > NB && st->bws_cnt > 0 && !st->ppp_mode_dec && !( st->nelp_mode_dec == 1 && st->bfi == 1 ) ) ) + { + /* SWB BWE decoder */ + swb_bwe_dec( st, NULL, synth, hb_synth, 0, output_frame ); + } + else if ( st->extl == SWB_BWE_HIGHRATE || st->extl == FB_BWE_HIGHRATE ) + { + swb_bwe_dec_hr( st, old_syn_12k8_16k, hb_synth, output_frame, unbits, pitch_buf ); + } + + /*---------------------------------------------------------------------* + * FEC - recovery after lost HQ core (smoothing of the BWE component) + *---------------------------------------------------------------------*/ + + if ( st->prev_bfi && st->last_core == HQ_CORE && st->extl != -1 ) + { + tmp = FRAC_BWE_SMOOTH / output_frame; + + for ( i = 0; i < output_frame / FRAC_BWE_SMOOTH; i++ ) + { + hb_synth[i] *= ( i * tmp ); + } + } + + /*---------------------------------------------------------------------* + * SWB CNG + *---------------------------------------------------------------------*/ + + if ( output_frame >= L_FRAME32k ) + { + /* SHB CNG decoder */ + swb_CNG_dec( st, synth, hb_synth, sid_bw ); + } + + pop_wmops(); + + /*----------------------------------------------------------------* + * Delay ACELP core synthesis to be synchronized with the components of bandwidth extension layers + *----------------------------------------------------------------*/ + + if ( output_frame >= L_FRAME16k ) + { + tmps = NS2SA( st->output_Fs, DELAY_BWE_TOTAL_NS - DELAY_CLDFB_NS ); + delay_signal( synth, output_frame, st->prev_synth_buffer, tmps ); + } + + if ( st->core == ACELP_CORE && !st->bfi && st->prev_bfi && st->last_total_brate >= HQ_48k && st->last_codec_mode == MODE2 && ( st->last_core_bfi == TCX_20_CORE || st->last_core_bfi == TCX_10_CORE ) && st->hPlcInfo->concealment_method == TCX_NONTONAL && st->hPlcInfo->nbLostCmpt < 4 ) + { + tmps = 0; + if ( output_frame >= L_FRAME16k ) + { + tmps = NS2SA( st->output_Fs, DELAY_BWE_TOTAL_NS ); + } + + waveform_adj2( st->hPlcInfo, st->hTonalMDCTConc->secondLastPcmOut, synth + tmps, tmps, st->hPlcInfo->nbLostCmpt + 1, st->bfi ); + st->hPlcInfo->Pitch = 0; + } + + /*----------------------------------------------------------------* + * Addition of BWE components to the ACELP core synthesis + *----------------------------------------------------------------*/ + + if ( st->extl != -1 || ( st->bws_cnt > 0 && st->core == ACELP_CORE ) ) + { + /* Calculate an additional delay of extension layer components to be synchronized with ACELP synthesis */ + if ( st->L_frame == L_FRAME ) + { + /* TBE on top of ACELP@12.8kHz */ + tmps = NS2SA( st->output_Fs, MAX_DELAY_TBE_NS - DELAY_SWB_TBE_12k8_NS ); + } + else + { + if ( st->extl == SWB_BWE_HIGHRATE || st->extl == FB_BWE_HIGHRATE ) + { + /* HR SWB BWE on top of ACELP@16kHz */ + tmps = NS2SA( st->output_Fs, DELAY_BWE_TOTAL_NS ); + } + else + { + /* TBE on top of ACELP@16kHz */ + tmps = NS2SA( st->output_Fs, MAX_DELAY_TBE_NS - DELAY_SWB_TBE_16k_NS ); + } + } + + /* Smooth transitions when switching between different technologies */ + if ( ( st->extl != st->last_extl || ( st->extl == st->last_extl && ( st->core ^ st->last_core ) == HQ_CORE ) ) && !( st->extl == SWB_CNG && st->last_extl == SWB_TBE ) ) + { + /* switching between BWE and TBE technologies */ + incr = (int16_t) ( L_FRAME / ( tmps + 0.5f ) ); + for ( i = 0; i < tmps; i++ ) + { + hb_synth[i] *= sin_table256[i * incr]; + } + + set_f( st->hb_prev_synth_buffer, 0.0f, tmps ); + } + else if ( tmps < st->old_bwe_delay ) + { + /* the previous frame was TBE on top of ACELP@16kHz and the current frame is TBE on top of ACELP@12.8kHz */ + incr = (int16_t) ( L_FRAME / ( tmps + 0.5f ) ); + for ( i = 0; i < tmps; i++ ) + { + tmp_buffer[i] = st->hb_prev_synth_buffer[i] * sin_table256[255 - i * incr] + + st->hb_prev_synth_buffer[st->old_bwe_delay - 1 - i] * sin_table256[i * incr]; + } + + mvr2r( tmp_buffer, st->hb_prev_synth_buffer, tmps ); + } + else if ( tmps > st->old_bwe_delay ) + { + /* the previous frame was TBE on top of ACELP@12.8kHz and the current frame is TBE on top of ACELP@16kHz */ + incr = (int16_t) ( L_FRAME / ( st->old_bwe_delay + 0.5f ) ); + for ( i = 0; i < st->old_bwe_delay; i++ ) + { + tmp_buffer[i] = st->hb_prev_synth_buffer[i] * sin_table256[255 - i * incr]; + } + + for ( ; i < tmps; i++ ) + { + tmp_buffer[i] = 0.0f; + } + + for ( i = 0; i < st->old_bwe_delay; i++ ) + { + tmp_buffer[tmps - 1 - i] += st->hb_prev_synth_buffer[st->old_bwe_delay - 1 - i] * sin_table256[i * incr]; + } + + mvr2r( tmp_buffer, st->hb_prev_synth_buffer, tmps ); + } + + /* Delay hb_synth */ + delay_signal( hb_synth, output_frame, st->hb_prev_synth_buffer, tmps ); + + st->old_bwe_delay = tmps; + if ( ( st->ppp_mode_dec || ( st->nelp_mode_dec == 1 && st->bfi == 1 ) ) && st->L_frame == st->last_L_frame && ( st->bws_cnt > 1 || st->last_extl != -1 ) ) + { + mvr2r( st->hBWE_TD->old_hb_synth, hb_synth, output_frame ); + } + else + { + mvr2r( hb_synth, st->hBWE_TD->old_hb_synth, output_frame ); + } + + /* Add the delayed hb_synth component to the delayed ACELP synthesis */ + v_add( synth, hb_synth, synth, output_frame ); + + /* SWB CNG/DTX - calculate SHB energy */ + if ( output_frame >= L_FRAME32k && st->extl > SWB_CNG && st->hTdCngDec != NULL ) + { + st->hTdCngDec->last_shb_ener = 0.001f; + for ( i = 0; i < output_frame; i++ ) + { + st->hTdCngDec->last_shb_ener += hb_synth[i] * hb_synth[i]; + } + st->hTdCngDec->last_shb_ener /= (float) output_frame; + st->hTdCngDec->last_shb_ener = 10 * (float) log10( st->hTdCngDec->last_shb_ener ); + } + } + + /* TCX-LTP Postfilter: used in Mode 1 to update memories and to avoid discontinuities when the past frame was TCX */ + tcx_ltp_post( st, hTcxLtpDec, ACELP_CORE, output_frame, 0, synth, NULL ); + + /* final output of synthesis signal */ + mvr2r( synth, output, output_frame ); + } + else /* Mode 2 */ + { + + /* -------------------------------------------------------------- * + * Mode 2 concealment + * -------------------------------------------------------------- */ + + concealWholeFrame = 0; + + if ( frameMode == FRAMEMODE_NORMAL ) + { + st->m_decodeMode = DEC_NO_FRAM_LOSS; + } + + if ( frameMode == FRAMEMODE_MISSING ) + { + if ( st->use_partial_copy && st->rf_frame_type >= RF_TCXFD && st->rf_frame_type <= RF_TCXTD2 ) + { + st->m_decodeMode = DEC_NO_FRAM_LOSS; + } + else + { + st->m_decodeMode = DEC_CONCEALMENT_EXT; + } + } + + if ( st->m_decodeMode == DEC_CONCEALMENT_EXT ) + { + concealWholeFrame = 1; + } + + /* -------------------------------------------------------------- * + * Decode core + * -------------------------------------------------------------- */ + + dec_acelp_tcx_frame( st, &concealWholeFrame, output, st->p_bpf_noise_buf, pcmbufFB, bwe_exc_extended, voice_factors, pitch_buf, NULL ); + + concealWholeFrameTmp = concealWholeFrame; + if ( st->bfi ) + { + frameMode = FRAMEMODE_MISSING; + } + + if ( st->igf ) + { + /* TBE for Mode 2 interface */ + if ( ( st->bfi == 0 || st->last_core == ACELP_CORE ) && st->core == ACELP_CORE ) + { + switch ( st->bwidth ) + { + case WB: + st->extl = WB_TBE; + st->extl_brate = WB_TBE_0k35; + break; + case SWB: + st->extl = SWB_TBE; + st->extl_brate = SWB_TBE_1k6; + + if ( st->total_brate < ACELP_13k20 ) + { + st->extl_brate = SWB_TBE_0k95; + } + else if ( st->total_brate >= ACELP_24k40 ) + { + st->extl_brate = SWB_TBE_2k8; + } + + break; + + case FB: + st->extl = FB_TBE; + st->extl_brate = FB_TBE_1k8; + + if ( st->total_brate >= ACELP_24k40 ) + { + st->extl_brate = FB_TBE_3k0; + } + + break; + } + } + else + { + st->extl = IGF_BWE; + st->extl_brate = 0; + } + + if ( st->output_Fs == 8000 || ( st->output_Fs == 16000 && st->L_frame == L_FRAME16k ) ) + { + st->extl = -1; + } + + st->core_brate = st->total_brate - st->extl_brate; + + st->bws_cnt = 0; + st->bws_cnt1 = 0; + st->tilt_wb = 0; + + if ( st->m_frame_type == ACTIVE_FRAME ) + { + if ( ( st->bfi == 0 || st->last_core == ACELP_CORE ) && st->core == ACELP_CORE ) + { + if ( st->extl == WB_TBE ) + { + wb_tbe_dec( st, bwe_exc_extended, voice_factors, hb_synth ); + } + else if ( st->extl == SWB_TBE || st->extl == FB_TBE ) + { + /* SWB TBE decoder */ + swb_tbe_dec( st, NULL, bwe_exc_extended, voice_factors, st->hBWE_TD->old_core_synth, fb_exc, hb_synth, pitch_buf ); + + if ( st->extl == FB_TBE && output_frame == L_FRAME48k ) + { + fb_tbe_dec( st, fb_exc, hb_synth, NULL, L_FRAME48k ); + } + } + mvr2r( hb_synth, st->hBWE_TD->old_hb_synth, output_frame ); + } + else + { + if ( st->last_core == ACELP_CORE ) + { + if ( ( st->bwidth == SWB || st->bwidth == FB ) && + ( ( st->last_extl == SWB_TBE || st->last_extl == FB_TBE ) && st->last_codec_mode == MODE2 ) ) + { + GenTransition( st->hBWE_TD, hb_synth, st->output_Fs, EVS_MONO, st->L_frame, st->rf_flag, st->total_brate ); + } + else if ( st->bwidth == WB && st->last_extl == WB_TBE ) + { + GenTransition_WB( st->hBWE_TD, hb_synth, st->output_Fs ); + } + + TBEreset_dec( st ); + } + else if ( st->last_codec_mode == MODE1 ) + { + swb_tbe_reset( st->hBWE_TD->mem_csfilt, st->hBWE_TD->mem_genSHBexc_filt_down_shb, st->hBWE_TD->state_lpc_syn, st->hBWE_TD->syn_overlap, st->hBWE_TD->state_syn_shbexc, &( st->hBWE_TD->tbe_demph ), &( st->hBWE_TD->tbe_premph ), st->hBWE_TD->mem_stp_swb, &( st->hBWE_TD->gain_prec_swb ) ); + + if ( st->extl == FB_TBE ) + { + set_f( st->hBWE_TD->fb_state_lpc_syn, 0, LPC_SHB_ORDER ); + st->hBWE_TD->fb_tbe_demph = 0; + fb_tbe_reset_synth( st->hBWE_TD->fbbwe_hpf_mem, &st->hBWE_TD->prev_fbbwe_ratio ); + } + swb_tbe_reset_synth( st->hBWE_TD->genSHBsynth_Hilbert_Mem, st->hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local ); + } + } + } + } + + + if ( st->m_frame_type != ACTIVE_FRAME ) + { + st->extl = -1; + st->extl_brate = 0; + } + + /* -------------------------------------------------------------- * + * Postprocessing + * -------------------------------------------------------------- */ + { + float *realBuffer[CLDFB_NO_COL_MAX], *imagBuffer[CLDFB_NO_COL_MAX]; + float realBufferTmp[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], imagBufferTmp[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + + for ( i = 0; i < CLDFB_NO_COL_MAX; i++ ) + { + set_f( realBufferTmp[i], 0, CLDFB_NO_CHANNELS_MAX ); + set_f( imagBufferTmp[i], 0, CLDFB_NO_CHANNELS_MAX ); + realBuffer[i] = realBufferTmp[i]; + imagBuffer[i] = imagBufferTmp[i]; + } + + st->cldfbSyn->nab = min( st->cldfbAna->no_channels, st->cldfbSyn->no_channels ); + st->cldfbAna->nab = 0; + + if ( st->hFdCngDec != NULL && ( st->sr_core == 8000 || st->sr_core == INT_FS_12k8 || st->sr_core == INT_FS_16k ) && st->total_brate <= ACELP_32k ) + { + /* -------------------------------------------------------------- * + * In CLDFB domain: + * - perform noise estimation during active frames + * - do CNG during inactive frames + * -------------------------------------------------------------- */ + + noisy_speech_detection( st->hFdCngDec, st->VAD && st->m_frame_type == ACTIVE_FRAME, output ); + + st->hFdCngDec->hFdCngCom->likelihood_noisy_speech = 0.99f * st->hFdCngDec->hFdCngCom->likelihood_noisy_speech + 0.01f * (float) st->hFdCngDec->hFdCngCom->flag_noisy_speech; + + st->lp_noise = st->hFdCngDec->lp_noise; + + ApplyFdCng( output, NULL, realBuffer, imagBuffer, st, concealWholeFrame, 0 ); + + /* Generate additional comfort noise to mask potential coding artefacts */ + if ( st->m_frame_type == ACTIVE_FRAME && st->flag_cna ) + { + generate_masking_noise( output, st->hFdCngDec->hFdCngCom, st->hFdCngDec->hFdCngCom->frameSize, 0, 0, 0, st->element_mode, NULL, -1 ); + } + } + + if ( st->flag_cna == 0 && st->L_frame == L_FRAME16k && st->last_flag_cna == 1 && ( ( st->last_core == ACELP_CORE && st->last_coder_type != AUDIO ) || st->last_core == TCX_20_CORE || st->last_core == AMR_WB_CORE ) ) + { + v_multc( st->hFdCngDec->hFdCngCom->olapBufferSynth2 + 5 * st->L_frame / 4, 256.f, tmp_buffer, st->L_frame / 2 ); + v_add( tmp_buffer, output, output, st->L_frame / 2 ); + } + + if ( st->m_frame_type == ACTIVE_FRAME ) + { + cldfbAnalysis( output, realBuffer, imagBuffer, -1, st->cldfbAna ); + } + else + { + float timeDomainBuffer[L_FRAME16k]; + float A[M + 1]; + + mvr2r( st->hFdCngDec->hFdCngCom->timeDomainBuffer, timeDomainBuffer, st->L_frame ); + mvr2r( st->hFdCngDec->hFdCngCom->A_cng, A, M + 1 ); + + update_decoder_LPD_cng( st, timeDomainBuffer, A, st->p_bpf_noise_buf ); + + /* Generate additional comfort noise to mask potential coding artefacts */ + if ( st->flag_cna ) + { + generate_masking_noise( timeDomainBuffer, st->hFdCngDec->hFdCngCom, st->hFdCngDec->hFdCngCom->frameSize, 0, 0, 0, st->element_mode, NULL, -1 ); + } + else if ( st->L_frame == L_FRAME16k && st->last_flag_cna == 1 && ( ( st->last_core == ACELP_CORE && st->last_coder_type != AUDIO ) || st->last_core == TCX_20_CORE || st->last_core == AMR_WB_CORE ) ) + { + v_multc( st->hFdCngDec->hFdCngCom->olapBufferSynth2 + 5 * st->L_frame / 4, 256.f, tmp_buffer, st->L_frame / 2 ); + v_add( tmp_buffer, timeDomainBuffer, timeDomainBuffer, st->L_frame / 2 ); + } + + /* check if the CLDFB works on the right sample rate */ + if ( ( st->cldfbAna->no_channels * st->cldfbAna->no_col ) != st->L_frame ) + { + resampleCldfb( st->cldfbAna, ( st->L_frame * FRAMES_PER_SEC ) ); + resampleCldfb( st->cldfbBPF, ( st->L_frame * FRAMES_PER_SEC ) ); + } + + st->cldfbSyn->bandsToZero = 0; + if ( st->bwidth == NB && st->cldfbSyn->no_channels > 10 ) + { + st->cldfbSyn->bandsToZero = st->cldfbSyn->no_channels - 10; + } + else if ( st->hFdCngDec->hFdCngCom->regularStopBand < st->cldfbSyn->no_channels ) + { + st->cldfbSyn->bandsToZero = st->cldfbSyn->no_channels - st->hFdCngDec->hFdCngCom->regularStopBand; + } + cldfbAnalysis( timeDomainBuffer, realBuffer, imagBuffer, -1, st->cldfbAna ); + } + + if ( st->flag_cna == 0 ) + { + set_f( st->hFdCngDec->hFdCngCom->olapBufferSynth2, 0.f, st->hFdCngDec->hFdCngCom->fftlen ); + } + + if ( st->p_bpf_noise_buf ) + { + addBassPostFilter( st->p_bpf_noise_buf, -1, realBuffer, imagBuffer, st->cldfbBPF ); + } + + if ( st->output_Fs > 8000 && st->hTECDec != NULL ) + { + calcGainTemp_TBE( realBuffer, imagBuffer, st->hTECDec->loBuffer, 0, st->cldfbAna->no_col, st->cldfbAna->no_channels, st->hTECDec->pGainTemp, st->tec_flag ); + } + + /* set high band buffers to zero. Covering the current frame and the overlap area. */ + if ( st->m_frame_type == ACTIVE_FRAME ) + { + for ( i = 0; i < CLDFB_NO_COL_MAX; i++ ) + { + set_f( &realBuffer[i][st->cldfbSyn->nab], 0.f, st->cldfbSyn->no_channels - st->cldfbSyn->nab ); + set_f( &imagBuffer[i][st->cldfbSyn->nab], 0.f, st->cldfbSyn->no_channels - st->cldfbSyn->nab ); + } + } + + cldfbSynthesis( realBuffer, imagBuffer, output, -1, st->cldfbSyn ); + + /* set multiplication factor according to the sampling rate */ + delay_comp = NS2SA( st->output_Fs, DELAY_CLDFB_NS ); + delay_tdbwe = NS2SA( st->output_Fs, DELAY_BWE_TOTAL_NS - DELAY_CLDFB_NS ); + + /* MODE1 MDCT to ACELP 2 transition */ + if ( st->last_codec_mode == MODE1 && st->last_core_bfi > ACELP_CORE ) + { + mvr2r( st->delay_buf_out, output, delay_comp ); /* copy the HQ/ACELP delay synchronization buffer at the beginning of ACELP frame */ + + if ( st->core == ACELP_CORE ) + { + tmpF = 1.0f / (float) NS2SA( st->output_Fs, 3000000 ); + if ( st->prev_bfi && st->hHQ_core->HqVoicing ) + { + mvr2r( st->hHQ_core->fer_samples, st->hHQ_core->old_out + NS2SA( st->output_Fs, N_ZERO_MDCT_NS ), NS2SA( st->output_Fs, 3000000 ) ); + } + for ( i = 0; i < NS2SA( st->output_Fs, 3000000 ); i++ ) + { + output[i + delay_comp] = ( 1 - tmpF * (float) i ) * st->hHQ_core->old_out[i + NS2SA( st->output_Fs, N_ZERO_MDCT_NS )] + tmpF * (float) i * output[i + delay_comp]; + } + } + else + { + if ( st->output_Fs == 8000 ) + { + mvr2r( st->delay_buf_out, st->hTcxDec->FBTCXdelayBuf, delay_comp ); + } + else + { + mvr2r( st->prev_synth_buffer, st->hTcxDec->FBTCXdelayBuf, delay_tdbwe ); + mvr2r( st->delay_buf_out, st->hTcxDec->FBTCXdelayBuf + delay_tdbwe, delay_comp ); + } + } + } + + /* set delay compensation between HQ synthesis and ACELP synthesis */ + if ( st->core == ACELP_CORE && !st->con_tcx ) + { + set_f( st->delay_buf_out, 0, delay_comp ); + mvr2r( output, st->previoussynth, output_frame ); + } + else + { + mvr2r( st->hTcxDec->old_synthFB + st->hTcxDec->old_synth_lenFB - delay_comp, st->delay_buf_out, delay_comp ); + + if ( st->output_Fs == 8000 ) + { + mvr2r( st->hTcxDec->FBTCXdelayBuf, st->previoussynth, delay_comp ); + } + else + { + mvr2r( st->hTcxDec->FBTCXdelayBuf + delay_tdbwe, st->previoussynth, delay_comp ); + } + + mvr2r( pcmbufFB, st->previoussynth + delay_comp, output_frame - delay_comp ); + } + + /* Delay compensation for TBE */ + if ( output_frame >= L_FRAME16k ) + { + delay_signal( output, output_frame, st->prev_synth_buffer, delay_tdbwe ); + } + + if ( st->igf && st->m_frame_type == ACTIVE_FRAME ) + { + if ( !st->bfi && st->core == ACELP_CORE && ( st->tec_flag || st->tfa_flag ) && st->output_Fs > 8000 && st->hTECDec != NULL ) + { + procTecTfa_TBE( hb_synth, st->hTECDec->pGainTemp, st->tfa_flag, st->last_core, (int16_t) ( output_frame / N_TEC_TFA_SUBFR ), st->tec_flag == 2 ? 1 : 0 ); + } + + if ( ( ( ( !st->bfi || st->last_core == ACELP_CORE ) && st->core == ACELP_CORE ) || + ( st->last_core == ACELP_CORE && st->bwidth != NB && st->last_codec_mode == MODE2 ) ) && + ( st->output_Fs > 8000 ) ) + { + /* Add the delayed hb_synth component to the delayed core synthesis */ + v_add( output, hb_synth, output, output_frame ); + } + } + } + + /* set delay */ + if ( st->output_Fs == 8000 ) + { + tmps = NS2SA( st->output_Fs, DELAY_CLDFB_NS ); + } + else + { + tmps = NS2SA( st->output_Fs, DELAY_BWE_TOTAL_NS ); + } + delta = NS2SA( st->output_Fs, TCXLTP_DELAY_NS ); + + /* TCX/ACELP/HQ-CORE->TCX */ + if ( ( st->bfi && st->last_core > ACELP_CORE ) || st->core > ACELP_CORE ) + { + /* TCX / HQ-CORE / TD-TCX-PLC -> TCX / TD-TCX-PLC */ + if ( st->last_core_bfi > ACELP_CORE || ( st->bfi && st->last_core > ACELP_CORE ) || ( st->prev_bfi && st->last_con_tcx ) ) + { + mvr2r( st->hTcxDec->FBTCXdelayBuf, output, tmps ); + mvr2r( pcmbufFB, output + tmps, st->hTcxDec->L_frameTCX - tmps ); + } + /* ACELP -> TCX */ + else + { + /*cross-fading between LB-TCX and FB-TCX over 2.3125ms*/ + for ( i = 0; i < tmps; i++ ) + { + output[i + tmps] = ( output[i + tmps] * ( tmps - i ) + pcmbufFB[i] * i ) / tmps; + } + mvr2r( pcmbufFB + tmps, output + 2 * tmps, st->hTcxDec->L_frameTCX - 2 * tmps ); + } + + mvr2r( pcmbufFB + st->hTcxDec->L_frameTCX - tmps, st->hTcxDec->FBTCXdelayBuf, tmps ); + + if ( st->bfi && st->last_core > ACELP_CORE ) + { + if ( st->output_Fs == 8000 ) + { + mvr2r( st->hTcxDec->FBTCXdelayBuf, st->delay_buf_out, NS2SA( st->output_Fs, DELAY_CLDFB_NS ) ); + } + else + { + mvr2r( st->hTcxDec->FBTCXdelayBuf, st->prev_synth_buffer, NS2SA( st->output_Fs, DELAY_BWE_TOTAL_NS - DELAY_CLDFB_NS ) ); + mvr2r( st->hTcxDec->FBTCXdelayBuf + NS2SA( st->output_Fs, DELAY_BWE_TOTAL_NS - DELAY_CLDFB_NS ), st->delay_buf_out, NS2SA( st->output_Fs, DELAY_CLDFB_NS ) ); + } + } + } + /* TCX/TD TCX PLC->ACELP */ + else if ( st->last_codec_mode == MODE2 && st->last_core > ACELP_CORE ) + { + mvr2r( st->hTcxDec->FBTCXdelayBuf, output, delta ); + for ( i = delta; i < tmps; i++ ) + { + output[i] = ( output[i] * ( i - delta ) + st->hTcxDec->FBTCXdelayBuf[i] * ( tmps - i ) ) / ( tmps - delta ); + } + } + + tcx_ltp_post( st, hTcxLtpDec, st->core, output_frame, NS2SA( st->output_Fs, ACELP_LOOK_NS ) + tmps, output, st->hTcxDec->FBTCXdelayBuf ); + + } /* end of Mode 2 */ + + /*----------------------------------------------------------------* + * Save synthesis for HQ FEC + *----------------------------------------------------------------*/ + + save_synthesis_hq_fec( st, output, output_frame, NULL ); + + /*----------------------------------------------------------------* + * HP filtering + *----------------------------------------------------------------*/ + + hp20( output, output_frame, mem_hp20_out, st->output_Fs ); + + /*--------------------------------------------------------* + * Updates + *--------------------------------------------------------*/ + + if ( st->last_is_cng == 0 && st->codec_mode == MODE2 ) + { + st->bfi = 0; + if ( st->use_partial_copy && st->rf_frame_type >= RF_TCXFD && st->rf_frame_type <= RF_TCXTD2 ) + { + if ( frameMode == FRAMEMODE_MISSING ) + { + st->bfi = 1; + } + } + else if ( st->m_decodeMode == DEC_CONCEALMENT_EXT ) + { + st->bfi = 1; + } + + updt_dec_common( st, -1, concealWholeFrameTmp, output ); + } + else + { + if ( st->codec_mode == MODE2 ) + { + st->bfi = 0; + } + + updt_dec_common( st, hq_core_type, concealWholeFrameTmp, output ); + } + + + + pop_wmops(); + return error; +} diff --git a/lib_dec/fd_cng_dec.c b/lib_dec/fd_cng_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..c736e2462dbab90874df635b1df43375652b5f87 --- /dev/null +++ b/lib_dec/fd_cng_dec.c @@ -0,0 +1,2215 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include "options.h" +#include +#include "prot.h" +#include "ivas_prot.h" +#include "rom_com.h" +#include "wmc_auto.h" +#include "ivas_prot.h" +#include "ivas_rom_dec.h" + +/*------------------------------------------------------------------- + * Local constants + *-------------------------------------------------------------------*/ + +#define DELTA_MASKING_NOISE 1e-20f +#define CNA_ACT_DN_LARGE_PARTITION 50 /* index of the first larger partition */ +#define ST_PERIODOG_FACT 0.9 /* short-term filter factor for periodogram */ +#define CNA_ACT_DN_FACT 0.7 /* downward updating factor for CNA during active frames */ +#define FIRST_CNA_NOISE_UPD_FRAMES 5 /* minimum number of CN initialization frames */ + + +/*------------------------------------------------------------------- + * Local fucntions declarations + *-------------------------------------------------------------------*/ + +static void perform_noise_estimation_dec( const float *timeDomainInput, float *power_spectrum, HANDLE_FD_CNG_DEC hFdCngDec, const int16_t element_mode, const int16_t bwidth, const int16_t L_frame, const int16_t last_L_frame, const int32_t last_core_brate, const int16_t VAD ); + + +/*------------------------------------------------------------------- + * createFdCngDec() + * + * Create an instance of type FD_CNG + *-------------------------------------------------------------------*/ + +ivas_error createFdCngDec( + HANDLE_FD_CNG_DEC *hFdCngDec ) +{ + HANDLE_FD_CNG_DEC hs; + ivas_error error; + error = IVAS_ERR_OK; + + /* Set output to NULL in case of errors and early return */ + *hFdCngDec = NULL; + + /* Allocate memory */ + if ( ( hs = (HANDLE_FD_CNG_DEC) malloc( sizeof( FD_CNG_DEC ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for FD CNG DEC structure" ); + } + + if ( ( error = createFdCngCom( &( hs->hFdCngCom ) ) ) != IVAS_ERR_OK ) + { + return error; + } + + *hFdCngDec = hs; + + return error; +} + + +/*------------------------------------------------------------------- + * initFdCngDec() + * + * Initialize an instance of type FD_CNG + *-------------------------------------------------------------------*/ + +void initFdCngDec( + DEC_CORE_HANDLE st /* i/o: decoder state structure */ +) +{ + HANDLE_FD_CNG_DEC hFdCngDec; + + hFdCngDec = st->hFdCngDec; + + /* Initialize common */ + initFdCngCom( hFdCngDec->hFdCngCom, st->cldfbSyn->scale ); + + /* Set some counters and flags */ + hFdCngDec->flag_dtx_mode = 0; + hFdCngDec->lp_noise = -20.f; + hFdCngDec->lp_speech = 25.f; + + /* Initialize noise estimation algorithm */ + set_f( hFdCngDec->bandNoiseShape, 0.0f, FFTLEN2 ); + set_f( hFdCngDec->partNoiseShape, 0.0f, NPART ); + set_f( hFdCngDec->msPeriodog, 0.0f, NPART_SHAPING ); + set_f( hFdCngDec->msAlpha, 0.0f, NPART_SHAPING ); + set_f( hFdCngDec->msBminWin, 0.0f, NPART_SHAPING ); + set_f( hFdCngDec->msBminSubWin, 0.0f, NPART_SHAPING ); + set_f( hFdCngDec->msPsd, 0.0f, NPART_SHAPING ); + set_f( hFdCngDec->msNoiseFloor, 0.0f, NPART_SHAPING ); + set_f( hFdCngDec->msNoiseEst, 0.0f, NPART_SHAPING ); + set_f( hFdCngDec->msMinBuf, FLT_MAX, MSNUMSUBFR * NPART_SHAPING ); + set_f( hFdCngDec->msCurrentMin, FLT_MAX, NPART_SHAPING ); + set_f( hFdCngDec->msCurrentMinOut, FLT_MAX, NPART_SHAPING ); + set_f( hFdCngDec->msCurrentMinSubWindow, FLT_MAX, NPART_SHAPING ); + set_s( hFdCngDec->msLocalMinFlag, 0, NPART_SHAPING ); + set_s( hFdCngDec->msNewMinFlag, 0, NPART_SHAPING ); + set_f( hFdCngDec->msPsdFirstMoment, 0.0f, NPART_SHAPING ); + set_f( hFdCngDec->msPsdSecondMoment, 0.0f, NPART_SHAPING ); + hFdCngDec->msPeriodogBufPtr = 0; + set_f( hFdCngDec->msPeriodogBuf, 0.0f, MSBUFLEN * NPART_SHAPING ); + set_f( hFdCngDec->msLogPeriodog, 0.0f, NPART_SHAPING ); + set_f( hFdCngDec->msLogNoiseEst, 0.0f, NPART_SHAPING ); + set_f( hFdCngDec->psize_shaping, 0.0f, NPART_SHAPING ); + hFdCngDec->nFFTpart_shaping = 0; + + set_f( hFdCngDec->hFdCngCom->sidNoiseEstLp, 0.0f, NPART ); + + set_f( hFdCngDec->smoothed_psd, 0.0f, L_FRAME16k ); + set_f( hFdCngDec->msPeriodog_ST, 0.0f, NPART_SHAPING ); + + hFdCngDec->ms_last_inactive_bwidth = NB; + hFdCngDec->ms_cnt_bw_up = 0; + + hFdCngDec->cna_LR_LT = 0.5f; + hFdCngDec->cna_ILD_LT = 0.0f; + hFdCngDec->first_cna_noise_updated = 0; + hFdCngDec->first_cna_noise_update_cnt = 0; + hFdCngDec->cna_nbands = CNA_INIT_NBANDS; + mvs2s( cna_init_bands, hFdCngDec->cna_band_limits, CNA_INIT_NBANDS + 1 ); + hFdCngDec->cna_act_fact = 1.0f; + hFdCngDec->cna_rescale_fact = 0.0f; + hFdCngDec->cna_seed = 5687; + set_zero( hFdCngDec->cna_cm, STEREO_DFT_BAND_MAX ); + set_zero( hFdCngDec->cna_g_state, STEREO_DFT_BAND_MAX ); + + st->CNG_mode = -1; + mvr2r( st->lsp_old, st->lspCNG, M ); + + return; +} + + +/*------------------------------------------------------------------- + * configureFdCngDec() + * + * Configure an instance of type FD_CNG + *-------------------------------------------------------------------*/ + +void configureFdCngDec( + HANDLE_FD_CNG_DEC hFdCngDec, /* i/o: Contains the variables related to the FD-based CNG process */ + const int16_t bwidth, + const int32_t total_brate, + const int16_t L_frame, + const int16_t last_L_frame, + const int16_t element_mode ) +{ + int16_t j, stopBandFR; + HANDLE_FD_CNG_COM hsCom = hFdCngDec->hFdCngCom; + + hsCom->CngBandwidth = bwidth; + if ( hsCom->CngBandwidth == FB ) + { + hsCom->CngBandwidth = SWB; + } + if ( total_brate != FRAME_NO_DATA && total_brate != SID_2k40 ) + { + hsCom->CngBitrate = total_brate; + } + else if ( hsCom->CngBitrate == -1 ) + { + /* set minimum active CBR bitrate if CngBitrate is uninitialized */ + if ( element_mode > EVS_MONO ) + { + hsCom->CngBitrate = IVAS_13k2; + } + else + { + hsCom->CngBitrate = ACELP_7k20; + } + } + + /* FD-CNG config for MDCT-Stereo is always the same (since for > 48 kbps only) */ + /* This may need adjustment in the future if 2TC DTX for some mode uses MDCT-Stereo DTX for lower bitrates too */ + if ( element_mode == IVAS_CPE_MDCT ) + { + hsCom->CngBitrate = IVAS_48k; + } + hsCom->numSlots = 16; + + /* NB configuration */ + if ( bwidth == NB ) + { + hsCom->FdCngSetup = FdCngSetup_nb; + hsCom->numCoreBands = 16; + hsCom->regularStopBand = 16; + } + + /* WB configuration */ + else if ( bwidth == WB ) + { + /* FFT 6.4kHz, no CLDFB */ + if ( hsCom->CngBitrate <= ACELP_8k00 && L_frame == L_FRAME ) + { + hsCom->FdCngSetup = FdCngSetup_wb1; + hsCom->numCoreBands = 16; + hsCom->regularStopBand = 16; + } + /* FFT 6.4kHz, CLDFB 8.0kHz */ + else if ( hsCom->CngBitrate <= ACELP_13k20 || L_frame == L_FRAME ) + { + hsCom->FdCngSetup = FdCngSetup_wb2; + hsCom->numCoreBands = 16; + hsCom->regularStopBand = 20; + if ( L_frame == L_FRAME16k ) + { + hsCom->FdCngSetup = FdCngSetup_wb2; + hsCom->numCoreBands = 20; + hsCom->regularStopBand = 20; + hsCom->FdCngSetup.fftlen = 640; + hsCom->FdCngSetup.stopFFTbin = 256; + } + } + /* FFT 8.0kHz, no CLDFB */ + else + { + hsCom->FdCngSetup = FdCngSetup_wb3; + hsCom->numCoreBands = 20; + hsCom->regularStopBand = 20; + } + } + + /* SWB/FB configuration */ + else + { + /* FFT 6.4kHz, CLDFB 14kHz */ + if ( L_frame == L_FRAME ) + { + hsCom->FdCngSetup = FdCngSetup_swb1; + hsCom->numCoreBands = 16; + hsCom->regularStopBand = 35; + } + /* FFT 8.0kHz, CLDFB 16kHz */ + else + { + hsCom->FdCngSetup = FdCngSetup_swb2; + hsCom->numCoreBands = 20; + hsCom->regularStopBand = 40; + if ( last_L_frame == L_FRAME && element_mode == IVAS_CPE_DFT ) + { + hsCom->regularStopBand = 35; + } + } + } + + + hsCom->fftlen = hsCom->FdCngSetup.fftlen; + hsCom->stopFFTbin = hsCom->FdCngSetup.stopFFTbin; + + /* Configure the SID quantizer and the Comfort Noise Generator */ + + hsCom->startBand = 2; + hsCom->stopBand = hsCom->FdCngSetup.sidPartitions[hsCom->FdCngSetup.numPartitions - 1] + 1; + initPartitions( hsCom->FdCngSetup.sidPartitions, hsCom->FdCngSetup.numPartitions, hsCom->startBand, hsCom->stopBand, hsCom->part, &hsCom->npart, hsCom->midband, hsCom->psize, hsCom->psize_inv, 0 ); + if ( hsCom->stopFFTbin == 160 ) + { + hsCom->nFFTpart = 17; + } + else if ( hsCom->stopFFTbin == 256 ) + { + hsCom->nFFTpart = 20; + } + else + { + hsCom->nFFTpart = 21; + } + hsCom->nCLDFBpart = hsCom->npart - hsCom->nFFTpart; + for ( j = 0; j < hsCom->nCLDFBpart; j++ ) + { + hsCom->CLDFBpart[j] = hsCom->part[j + hsCom->nFFTpart] - ( hsCom->stopFFTbin - hsCom->startBand ); + hsCom->CLDFBpsize_inv[j] = hsCom->psize_inv[j + hsCom->nFFTpart]; + } + + stopBandFR = (int16_t) floor( 1000.f /*Hz*/ / 25.f /*Hz/Bin*/ ); + if ( stopBandFR > hsCom->stopFFTbin ) + { + stopBandFR = hsCom->stopFFTbin; + } + initPartitions( hsCom->FdCngSetup.shapingPartitions, hsCom->FdCngSetup.numShapingPartitions, hsCom->startBand, hsCom->stopFFTbin, hFdCngDec->part_shaping, &hFdCngDec->npart_shaping, hFdCngDec->midband_shaping, hFdCngDec->psize_shaping, hFdCngDec->psize_inv_shaping, stopBandFR ); + + hFdCngDec->nFFTpart_shaping = hFdCngDec->npart_shaping; + + switch ( hsCom->fftlen ) + { + case 512: + hsCom->fftSineTab = NULL; + hsCom->olapWinAna = olapWinAna512; + hsCom->olapWinSyn = olapWinSyn256; + break; + case 640: + hsCom->fftSineTab = fftSineTab640; + hsCom->olapWinAna = olapWinAna640; + hsCom->olapWinSyn = olapWinSyn320; + break; + default: + assert( !"Unsupported FFT length for FD-based CNG" ); + break; + } + hsCom->frameSize = hsCom->fftlen >> 1; + + return; +} + + +/*------------------------------------------------------------------- + * deleteFdCngDec() + * + * Delete the instance of type FD_CNG + *-------------------------------------------------------------------*/ + +void deleteFdCngDec( + HANDLE_FD_CNG_DEC *hFdCngDec ) +{ + HANDLE_FD_CNG_DEC hsDec = *hFdCngDec; + + if ( hsDec != NULL ) + { + deleteFdCngCom( &( hsDec->hFdCngCom ) ); + free( hsDec ); + *hFdCngDec = NULL; + } + + return; +} + + +/*------------------------------------------------------------------- + * ApplyFdCng() + * + * Apply the CLDFB-based CNG at the decoder + *-------------------------------------------------------------------*/ + +void ApplyFdCng( + float *timeDomainInput, + float *powerSpectrum, + float **realBuffer, /* i/o: Real part of the buffer */ + float **imagBuffer, /* i/o: Imaginary part of the buffer */ + Decoder_State *st, + const int16_t concealWholeFrame, + const int16_t is_music ) +{ + HANDLE_FD_CNG_DEC hFdCngDec = st->hFdCngDec; + HANDLE_FD_CNG_COM hFdCngCom = hFdCngDec->hFdCngCom; + float *cngNoiseLevel = hFdCngCom->cngNoiseLevel; + float *sidNoiseEst = hFdCngCom->sidNoiseEst; + int16_t j, k; + float factor; + float lsp_cng[M]; + int16_t L_frame, last_L_frame; + int32_t sr_core; + + push_wmops( "ApplyFdCng" ); + + /* limit L_frame and core Fs values for MDCT-Stereo modes which can have higher core sampling than 16kHz, but use a downsampled buffer */ + L_frame = min( st->L_frame, L_FRAME16k ); + last_L_frame = min( st->last_L_frame, L_FRAME16k ); + sr_core = min( st->sr_core, INT_FS_16k ); + + if ( hFdCngCom->frame_type_previous == ACTIVE_FRAME ) + { + hFdCngCom->inactive_frame_counter = 0; + } + + if ( st->element_mode == IVAS_CPE_TD ) + { + hFdCngDec->flag_dtx_mode = hFdCngDec->flag_dtx_mode || st->first_CNG; + } + + switch ( st->m_frame_type ) + { + + case ACTIVE_FRAME: + /************************** + * ACTIVE_FRAME at DECODER * + **************************/ + + hFdCngCom->inactive_frame_counter = 0; + hFdCngCom->sid_frame_counter = 0; + /* set noise estimation inactive during concealment, as no update with noise generated by concealment should be performed. */ + /* set noise estimation inactive when we have bit errors, as no update with noise generated by corrupt frame (biterror) should be performed. */ + if ( concealWholeFrame == 0 && + ( timeDomainInput == NULL || + ( *timeDomainInput( -FLT_MAX ) && + *( timeDomainInput + hFdCngCom->frameSize - 1 ) < FLT_MAX && + *( timeDomainInput + hFdCngCom->frameSize - 1 ) > ( -FLT_MAX ) ) ) && + ( ( ( ( st->element_mode != IVAS_CPE_TD && st->element_mode != IVAS_CPE_DFT && hFdCngDec->flag_dtx_mode ) || !st->VAD || ( st->ini_frame < 100 && st->is_ism_format ) ) && + !( st->cng_type == LP_CNG && hFdCngDec->flag_dtx_mode ) && ( is_music == 0 ) ) || + ( st->element_mode == IVAS_CPE_TD ) ) && + ( !st->BER_detect ) ) + { + /* Perform noise estimation at the decoder */ + perform_noise_estimation_dec( timeDomainInput, powerSpectrum, hFdCngDec, st->element_mode, st->bwidth, L_frame, last_L_frame, st->last_core_brate, st->VAD ); + + if ( st->element_mode != IVAS_CPE_TD && st->element_mode != IVAS_CPE_DFT ) + { + /* Update the shaping parameters */ + scalebands( hFdCngDec->msNoiseEst, hFdCngDec->part_shaping, hFdCngDec->nFFTpart_shaping, hFdCngDec->midband_shaping, hFdCngDec->nFFTpart_shaping, hFdCngCom->stopFFTbin - hFdCngCom->startBand, hFdCngDec->bandNoiseShape, 1 ); + } + + /* Update CNG levels */ + if ( hFdCngDec->flag_dtx_mode && st->cng_type == FD_CNG ) + { + bandcombinepow( hFdCngDec->bandNoiseShape, hFdCngCom->stopFFTbin - hFdCngCom->startBand, hFdCngCom->part, hFdCngCom->nFFTpart, hFdCngCom->psize_inv, hFdCngDec->partNoiseShape ); /* This needs to be done only once per inactive phase */ + + j = 0; + for ( k = 0; k < hFdCngCom->nFFTpart; k++ ) + { + factor = ( hFdCngCom->sidNoiseEst[k] + DELTA ) / ( hFdCngDec->partNoiseShape[k] + DELTA ); + for ( ; j <= hFdCngCom->part[k]; j++ ) + { + cngNoiseLevel[j] = hFdCngDec->bandNoiseShape[j] * factor; + } + } + } + else + { + /* This sets the new CNG levels until a SID update overwrites it */ + if ( !( st->element_mode == IVAS_CPE_TD ) || ( st->element_mode == IVAS_CPE_TD && !hFdCngDec->flag_dtx_mode && !st->VAD ) ) + { + mvr2r( hFdCngDec->bandNoiseShape, cngNoiseLevel, hFdCngCom->stopFFTbin - hFdCngCom->startBand ); /* This sets the new CNG levels until a SID update overwrites it */ + } + } + + if ( st->element_mode == IVAS_CPE_MDCT && timeDomainInput == NULL ) + { + st->hTcxDec->CngLevelBackgroundTrace_bfi = sqrtf( sum_f( cngNoiseLevel, hFdCngCom->stopFFTbin - hFdCngCom->startBand ) / NORM_MDCT_FACTOR ); + } + else + { + st->hTcxDec->CngLevelBackgroundTrace_bfi = (float) sqrt( ( sum_f( cngNoiseLevel, hFdCngCom->stopFFTbin - hFdCngCom->startBand ) / 2 * hFdCngCom->fftlen ) / L_frame ); + } + st->cngTDLevel = (float) sqrt( ( sum_f( cngNoiseLevel, hFdCngCom->stopFFTbin - hFdCngCom->startBand ) / 2 * hFdCngCom->fftlen ) / st->L_frame ); + } + else if ( st->element_mode == IVAS_CPE_TD || st->element_mode == IVAS_CPE_DFT ) + { + if ( hFdCngCom->active_frame_counter > 0 ) + { + /* Perform noise estimation in active frames in the decoder for downward updates */ + perform_noise_estimation_dec( timeDomainInput, powerSpectrum, hFdCngDec, st->element_mode, st->bwidth, L_frame, last_L_frame, st->last_core_brate, st->VAD ); + } + } + + if ( ( concealWholeFrame == 1 ) && ( st->nbLostCmpt == 1 ) ) + { + /* update lsf cng estimate for concealment. Do that during concealment, in order to avoid addition clean channel complexity*/ + + /* always set psychParameters for MDCT-Stereo ... */ + if ( st->element_mode == IVAS_CPE_MDCT && st->hTonalMDCTConc != NULL ) + { + st->hTonalMDCTConc->psychParams = ( st->core == TCX_20_CORE ) ? &st->hTonalMDCTConc->psychParamsTCX20 : &st->hTonalMDCTConc->psychParamsTCX10; + } + + /* ... but do actual computations only if sufficient energy in noise shape */ + if ( sum_f( cngNoiseLevel + hFdCngCom->startBand, hFdCngCom->stopFFTbin - hFdCngCom->startBand ) > 0.01f ) + { + if ( st->element_mode == IVAS_CPE_MDCT && st->core != ACELP_CORE ) + { + TonalMdctConceal_whiten_noise_shape( st, L_frame, ON_FIRST_LOST_FRAME ); + } + else if ( st->element_mode != IVAS_CPE_MDCT || st->core == ACELP_CORE ) + { + lpc_from_spectrum( hFdCngCom, hFdCngCom->startBand, hFdCngCom->stopFFTbin, 0.f ); + a2lsp_stab( hFdCngCom->A_cng, lsp_cng, st->lspold_cng ); + mvr2r( lsp_cng, st->lspold_cng, M ); + lsp2lsf( lsp_cng, st->lsf_cng, M, sr_core ); + } + st->plcBackgroundNoiseUpdated = 1; + } + } + break; + + case SID_FRAME: + hFdCngDec->flag_dtx_mode = 1; + /* FALLTHRU */ + + case ZERO_FRAME: + + if ( st != NULL && st->cng_type == LP_CNG ) + { + /* Perform noise estimation on inactive phase at the decoder */ + perform_noise_estimation_dec( timeDomainInput, powerSpectrum, hFdCngDec, st->element_mode, st->bwidth, L_frame, last_L_frame, st->last_core_brate, st->VAD ); + + if ( st->element_mode != IVAS_CPE_TD && st->element_mode != IVAS_CPE_DFT ) + { + /* Update the shaping parameters */ + scalebands( hFdCngDec->msNoiseEst, hFdCngDec->part_shaping, hFdCngDec->nFFTpart_shaping, hFdCngDec->midband_shaping, hFdCngDec->nFFTpart_shaping, hFdCngCom->stopFFTbin - hFdCngCom->startBand, hFdCngDec->bandNoiseShape, 1 ); + } + + /* This sets the new CNG levels until a SID update overwrites it */ + mvr2r( hFdCngDec->bandNoiseShape, cngNoiseLevel, hFdCngCom->stopFFTbin - hFdCngCom->startBand ); /* This sets the new CNG levels until a SID update overwrites it */ + + st->cngTDLevel = (float) sqrt( ( sum_f( cngNoiseLevel, hFdCngCom->stopFFTbin - hFdCngCom->startBand ) / 2 * hFdCngCom->fftlen ) / L_frame ); + break; + } + + hFdCngCom->inactive_frame_counter++; + + /************************************* + * SID_FRAME or ZERO_FRAME at DECODER * + *************************************/ + + /* Detect first non-active frame */ + if ( hFdCngCom->inactive_frame_counter == 1 ) + { + /* Compute the fine spectral structure of the comfort noise shape using the decoder-side noise estimates */ + bandcombinepow( hFdCngDec->bandNoiseShape, hFdCngCom->stopFFTbin - hFdCngCom->startBand, hFdCngCom->part, hFdCngCom->nFFTpart, hFdCngCom->psize_inv, hFdCngDec->partNoiseShape ); + + if ( st->element_mode == IVAS_CPE_DFT ) + { + mvr2r( st->hFdCngDec->hFdCngCom->sidNoiseEst, st->hFdCngDec->hFdCngCom->sidNoiseEstLp, NPART ); + } + } + + if ( st->m_frame_type == SID_FRAME ) + { + if ( hFdCngCom->msFrCnt_init_counter < hFdCngCom->msFrCnt_init_thresh ) + { + /* At initialization, interpolate the bin/band-wise levels from the partition levels */ + scalebands( sidNoiseEst, hFdCngCom->part, hFdCngCom->npart, hFdCngCom->midband, hFdCngCom->nFFTpart, hFdCngCom->stopBand - hFdCngCom->startBand, cngNoiseLevel, 1 ); + } + else + { + if ( st->element_mode == IVAS_CPE_DFT ) + { + sidNoiseEst = hFdCngCom->sidNoiseEstLp; + } + + /* Interpolate the CLDFB band levels from the SID (partition) levels */ + if ( hFdCngCom->regularStopBand > hFdCngCom->numCoreBands ) + { + scalebands( sidNoiseEst, hFdCngCom->part, hFdCngCom->npart, hFdCngCom->midband, hFdCngCom->nFFTpart, hFdCngCom->stopBand - hFdCngCom->startBand, cngNoiseLevel, 0 ); + } + + + /* Shape the SID noise levels in each FFT bin */ + j = 0; + for ( k = 0; k < hFdCngCom->nFFTpart; k++ ) + { + factor = ( sidNoiseEst[k] + DELTA ) / ( hFdCngDec->partNoiseShape[k] + DELTA ); + for ( ; j <= hFdCngCom->part[k]; j++ ) + { + cngNoiseLevel[j] = hFdCngDec->bandNoiseShape[j] * factor; + } + } + } + } + else if ( st->element_mode == IVAS_CPE_DFT ) + { + if ( !( hFdCngCom->msFrCnt_init_counter < hFdCngCom->msFrCnt_init_thresh ) ) + { + sidNoiseEst = hFdCngCom->sidNoiseEstLp; + j = 0; + for ( k = 0; k < hFdCngCom->nFFTpart; k++ ) + { + factor = ( sidNoiseEst[k] + DELTA ) / ( hFdCngDec->partNoiseShape[k] + DELTA ); + for ( ; j <= hFdCngCom->part[k]; j++ ) + { + cngNoiseLevel[j] = hFdCngDec->bandNoiseShape[j] * factor; + } + } + } + } + if ( st->codec_mode == MODE2 ) + { + /* Generate comfort noise during SID or zero frames */ + generate_comfort_noise_dec( realBuffer, imagBuffer, st, -1 ); + } + + break; + + default: + break; + } + + pop_wmops(); + + return; +} + + +/*------------------------------------------------------------------- + * perform_noise_estimation_dec() + * + * Perform noise estimation at the decoder + *-------------------------------------------------------------------*/ + +static void perform_noise_estimation_dec( + const float *timeDomainInput, + float *power_spectrum, + HANDLE_FD_CNG_DEC hFdCngDec, /* i/o: FD_CNG structure containing all buffers and variables */ + const int16_t element_mode, /* i : element mode */ + const int16_t bwidth, /* i : audio bandwidth */ + const int16_t L_frame, /* i : frame length at internal Fs */ + const int16_t last_L_frame, /* i : frame length of the last frame at internal Fs */ + const int32_t last_core_brate, /* i : previous frame core bitrate */ + const int16_t VAD /* i : VAD flag in the decoder */ +) +{ + float *ptr_r; + float *ptr_i; + int16_t startBand = hFdCngDec->hFdCngCom->startBand; + int16_t stopFFTbin = hFdCngDec->hFdCngCom->stopFFTbin; + float *fftBuffer = hFdCngDec->hFdCngCom->fftBuffer; + float *periodog = hFdCngDec->hFdCngCom->periodog; + float *ptr_per = periodog; + float *msPeriodog = hFdCngDec->msPeriodog; + float *msNoiseEst = hFdCngDec->msNoiseEst; + + int16_t *part = hFdCngDec->part_shaping; + int16_t npart = hFdCngDec->npart_shaping; + int16_t nFFTpart = hFdCngDec->nFFTpart_shaping; + float *psize_inv = hFdCngDec->psize_inv_shaping; + float *psize = hFdCngDec->psize_shaping; + float *msLogPeriodog = hFdCngDec->msLogPeriodog; + float *msLogNoiseEst = hFdCngDec->msLogNoiseEst; + int16_t i; + float enr, enr_tot, enr_tot0, enr_ratio, alpha; + int16_t p; + float temp, ftemp, delta; + float wght; + + if ( !( element_mode == IVAS_CPE_MDCT && power_spectrum != NULL ) ) + { + /* Perform STFT analysis */ + AnalysisSTFT( timeDomainInput, fftBuffer, hFdCngDec->hFdCngCom ); + } + + if ( element_mode == IVAS_CPE_TD || element_mode == IVAS_CPE_DFT ) + { + /* Calculate periodogram (squared magnitude in each FFT bin) */ + if ( startBand == 0 ) + { + ( *ptr_per ) = fftBuffer[0] * fftBuffer[0]; + ptr_per++; + ptr_r = fftBuffer + 2; + } + else + { + ptr_r = fftBuffer + 2 * startBand; + } + + ptr_i = ptr_r + 1; + + for ( ; ptr_per < periodog + stopFFTbin - startBand; ptr_per++ ) + { + ( *ptr_per ) = ( *ptr_r ) * ( *ptr_r ) + ( *ptr_i ) * ( *ptr_i ); + ptr_r += 2; + ptr_i += 2; + } + + /* Rescale to get energy/sample: it should be 2*(1/N)*(2/N), parseval relation with 1/N,*2 for nrg computed till Nyquist only, 2/N as windowed samples correspond to half a frame*/ + v_multc( periodog, 4.f / (float) ( hFdCngDec->hFdCngCom->fftlen * hFdCngDec->hFdCngCom->fftlen ), periodog, stopFFTbin - startBand ); + + /* Combine bins of power spectrum into partitions */ + i = 0; + for ( p = 0; p < npart; p++ ) + { + + /* calculate mean over all bins in power partition */ + temp = 0; + for ( ; i <= part[p]; i++ ) + { + temp += periodog[i]; + } + msPeriodog[p] = temp * psize_inv[p]; + } + + /* compensate for the loss of variance - don't do when first noise update is not completed yet due to risk of msPeriodog[p] < 0 */ + if ( hFdCngDec->first_cna_noise_updated ) + { + i = 0; + for ( p = 0; p < npart; p++ ) + { + /* calculate variance over all bins in power partition */ + temp = 0; + for ( ; i <= part[p]; i++ ) + { + delta = periodog[i] - msPeriodog[p]; + temp += delta * delta; + } + temp *= psize_inv[p]; + + /* compensate for the loss of variance */ + msPeriodog[p] = (float) ( msPeriodog[p] + sqrt( temp ) * rand_gauss( &ftemp, &hFdCngDec->cna_seed ) ); + + if ( msPeriodog[p] < 1e-5f ) + { + msPeriodog[p] = 1e-5f; + } + } + } + + /* calculate total energy (short-term and long-term) */ + enr_tot = sum_f( msPeriodog, npart ) + EPSILON; + enr_tot0 = sum_f( msNoiseEst, npart ) + EPSILON; + + /* update short-term periodogram on larger partitions */ + for ( p = CNA_ACT_DN_LARGE_PARTITION; p < npart; p++ ) + { + if ( L_frame != last_L_frame || last_core_brate <= SID_2k40 ) + { + /* core Fs has changed or last frame was SID/NO_DATA -> re-initialize short-term periodogram */ + hFdCngDec->msPeriodog_ST[p] = msPeriodog[p]; + } + else + { + hFdCngDec->msPeriodog_ST[p] = (float) ( ST_PERIODOG_FACT * hFdCngDec->msPeriodog_ST[p] + ( 1 - ST_PERIODOG_FACT ) * msPeriodog[p] ); + } + } + + /* core Fs has changed -> partitions have changed -> re-calculate long-term periodogram */ + /* part L_FRAME16k L_FRAME */ + /* ... */ + /* [55] 146 146 */ + /* [56] 174 160 */ + /* [57] 210 174 */ + /* [58] 254 190 */ + /* [59] 306 210 */ + /* [60] 317 230 */ + /* [61] 253 */ + + if ( last_L_frame == L_FRAME16k && L_frame == L_FRAME ) + { + msNoiseEst[61] = msNoiseEst[58]; + msNoiseEst[60] = min( msNoiseEst[58], msNoiseEst[57] ); + msNoiseEst[59] = msNoiseEst[57]; + msNoiseEst[58] = msNoiseEst[56]; + msNoiseEst[57] = msNoiseEst[56]; + msNoiseEst[56] = min( msNoiseEst[56], msNoiseEst[55] ); + } + else if ( last_L_frame == L_FRAME && L_frame == L_FRAME16k ) + { + msNoiseEst[56] = min( msNoiseEst[56], msNoiseEst[57] ); + msNoiseEst[57] = min( msNoiseEst[58], msNoiseEst[59] ); + msNoiseEst[58] = min( msNoiseEst[60], msNoiseEst[61] ); + msNoiseEst[59] = 0.0f; + msNoiseEst[60] = 0.0f; + msNoiseEst[61] = 0.0f; + + hFdCngDec->ms_cnt_bw_up = FIRST_CNA_NOISE_UPD_FRAMES; + } + + /* Smooth with IIR filter */ + if ( !hFdCngDec->first_cna_noise_updated ) + { + if ( !VAD ) + { + /* background noise update with moving average */ + alpha = 1.0f / ( hFdCngDec->first_cna_noise_update_cnt + 1 ); + for ( p = 0; p < npart; p++ ) + { + msNoiseEst[p] = ( 1 - alpha ) * msNoiseEst[p] + alpha * msPeriodog[p]; + } + + /* check, if we reached the required number of first CNA noise update frames */ + if ( hFdCngDec->first_cna_noise_update_cnt < FIRST_CNA_NOISE_UPD_FRAMES - 1 ) + { + hFdCngDec->first_cna_noise_update_cnt++; + } + else + { + hFdCngDec->first_cna_noise_updated = 1; + if ( hFdCngDec->hFdCngCom->msFrCnt_init_counter == 0 ) + { + hFdCngDec->hFdCngCom->msFrCnt_init_counter = 1; + } + } + } + else + { + hFdCngDec->first_cna_noise_update_cnt = 0; + } + } + else + { + hFdCngDec->hFdCngCom->msFrCnt_init_counter = 1; + if ( VAD ) + { + /* no updates during active frames except for significant energy drops */ + enr_ratio = enr_tot / enr_tot0; + if ( enr_ratio < 0.5f ) + { + /* total energy significantly decreases during active frames -> downward update */ + wght = lin_interp( enr_ratio, 0.0f, 0.8f, 0.5f, 0.95f, 1 ); + for ( p = 0; p < npart; p++ ) + { + if ( msPeriodog[p] < msNoiseEst[p] ) + { + msNoiseEst[p] = wght * msNoiseEst[p] + ( 1 - wght ) * msPeriodog[p]; + } + } + } + else + { + /* energy significantly decreases in one of the larger partitions during active frames -> downward update */ + for ( p = CNA_ACT_DN_LARGE_PARTITION; p < npart; p++ ) + { + if ( hFdCngDec->msPeriodog_ST[p] < msNoiseEst[p] ) + { + msNoiseEst[p] = (float) ( CNA_ACT_DN_FACT * msNoiseEst[p] + ( 1 - CNA_ACT_DN_FACT ) * hFdCngDec->msPeriodog_ST[p] ); + } + } + } + } + else + { + + if ( bwidth >= WB && hFdCngDec->ms_last_inactive_bwidth == NB ) + { + /* bandwidth increased -> set counter for fast initilization */ + hFdCngDec->ms_cnt_bw_up = FIRST_CNA_NOISE_UPD_FRAMES; + } + hFdCngDec->ms_last_inactive_bwidth = bwidth; + /* update background noise during inactive frames */ + ptr_per = msNoiseEst; + for ( p = 0; p < npart; p++ ) + { + enr = msPeriodog[p]; + alpha = 0.95f; + /* bandwidth increased -> do fast re-initilization */ + if ( hFdCngDec->ms_cnt_bw_up > 0 && p > 55 ) + { + alpha = 1.0f / ( hFdCngDec->ms_cnt_bw_up + 1 ); + } + else if ( enr < *ptr_per && part[p] == 1 ) + { + /* faster downward update for single-bin partitions */ + alpha = 0.8f; + } + else if ( enr > 2.0f * ( *ptr_per ) ) + { + /* prevent abrupt upward updates */ + enr = 2.0f * ( *ptr_per ); + } + + /* IIR smoothing */ + *ptr_per *= alpha; + *ptr_per += ( 1 - alpha ) * enr; + ptr_per++; + } + + if ( hFdCngDec->ms_cnt_bw_up > 0 ) + { + hFdCngDec->ms_cnt_bw_up--; + } + } + } + + mvr2r( msNoiseEst, hFdCngDec->msPsd, npart ); + + /* Expand partitions into bins of power spectrum */ + scalebands( msNoiseEst, part, nFFTpart, hFdCngDec->midband_shaping, nFFTpart, stopFFTbin - startBand, hFdCngDec->bandNoiseShape, 1 ); + + mvr2r( hFdCngDec->bandNoiseShape, &hFdCngDec->smoothed_psd[startBand], stopFFTbin - startBand ); + set_zero( &hFdCngDec->smoothed_psd[stopFFTbin], L_FRAME16k - stopFFTbin ); + } + else + { + if ( element_mode == IVAS_CPE_MDCT && power_spectrum != NULL ) + { + /* use power spectrum calculated in the MDCT-domain instead of calculating new power spectrum */ + periodog = power_spectrum; + } + else + { + /* Compute the squared magnitude in each FFT bin */ + if ( startBand == 0 ) + { + ( *ptr_per ) = fftBuffer[0] * fftBuffer[0]; /* DC component */ + ptr_per++; + ptr_r = fftBuffer + 2; + } + else + { + ptr_r = fftBuffer + 2 * startBand; + } + + ptr_i = ptr_r + 1; + + for ( ; ptr_per < periodog + stopFFTbin - startBand; ptr_per++ ) + { + ( *ptr_per ) = ( *ptr_r ) * ( *ptr_r ) + ( *ptr_i ) * ( *ptr_i ); + ptr_r += 2; + ptr_i += 2; + } + /* Nyquist frequency is discarded */ + + /* Rescale to get energy/sample: it should be 2*(1/N)*(2/N), parseval relation with 1/N,*2 for nrg computed till Nyquist only, 2/N as windowed samples correspond to half a frame*/ + v_multc( periodog, 4.f / (float) ( hFdCngDec->hFdCngCom->fftlen * hFdCngDec->hFdCngCom->fftlen ), periodog, stopFFTbin - startBand ); + } + + /* Adjust to the desired frequency resolution by averaging over spectral partitions for SID transmission */ + bandcombinepow( periodog, stopFFTbin - startBand, part, npart, psize_inv, msPeriodog ); + + /* Compress MS inputs */ + compress_range( msPeriodog, msLogPeriodog, npart ); + + /* Call the minimum statistics routine for noise estimation */ + minimum_statistics( npart, nFFTpart, psize, msLogPeriodog, hFdCngDec->msNoiseFloor, msLogNoiseEst, hFdCngDec->msAlpha, hFdCngDec->msPsd, hFdCngDec->msPsdFirstMoment, hFdCngDec->msPsdSecondMoment, hFdCngDec->msMinBuf, hFdCngDec->msBminWin, hFdCngDec->msBminSubWin, hFdCngDec->msCurrentMin, hFdCngDec->msCurrentMinOut, hFdCngDec->msCurrentMinSubWindow, hFdCngDec->msLocalMinFlag, hFdCngDec->msNewMinFlag, hFdCngDec->msPeriodogBuf, &( hFdCngDec->msPeriodogBufPtr ), hFdCngDec->hFdCngCom, + DEC, element_mode ); + + /* Expand MS outputs */ + expand_range( msLogNoiseEst, msNoiseEst, npart ); + } + + return; +} + + +/*------------------------------------------------------------------- + * FdCng_decodeSID() + * + * Decode the FD-CNG bitstream + *-------------------------------------------------------------------*/ + +void FdCng_decodeSID( + Decoder_State *st /* i/o: decoder state structure */ +) +{ + int16_t N; + float *sidNoiseEst; + float gain; + int16_t i, index; + float v[32]; + int16_t indices[32]; + HANDLE_FD_CNG_COM hFdCngCom; + float *invTrfMatrix; + float tmpRAM[FDCNG_VQ_MAX_LEN][FDCNG_VQ_DCT_MAXTRUNC]; + + const float gain_q_offset = ( st->element_mode == EVS_MONO ) ? GAIN_Q_OFFSET_EVS : GAIN_Q_OFFSET_IVAS; + + invTrfMatrix = (float *) tmpRAM; + + hFdCngCom = ( st->hFdCngDec )->hFdCngCom; + + sidNoiseEst = hFdCngCom->sidNoiseEst; + + N = hFdCngCom->npart; + gain = 0.0f; + hFdCngCom->sid_frame_counter++; + + /* Read bitstream */ + for ( i = 0; i < FD_CNG_stages_37bits; i++ ) + { + indices[i] = get_next_indice( st, bits_37bits[i] ); + } + + index = get_next_indice( st, 7 ); + + /* MSVQ decoder */ + + if ( st->element_mode != EVS_MONO ) + { + create_IDCT_N_Matrix( invTrfMatrix, FDCNG_VQ_MAX_LEN, FDCNG_VQ_DCT_MAXTRUNC, sizeof( tmpRAM ) / ( sizeof( float ) ) ); + msvq_dec( cdk_37bits_ivas, NULL, NULL, FD_CNG_stages_37bits, N, FD_CNG_maxN_37bits, indices, 1, invTrfMatrix, v, NULL ); + } + else + { /* Legacy EVS_MONO MSVQ tables */ + msvq_dec( cdk_37bits, NULL, NULL, FD_CNG_stages_37bits, N, FD_CNG_maxN_37bits, indices, 0, NULL, v, NULL ); + } + + + /* Decode gain */ + gain = ( (float) index - gain_q_offset ) / 1.5f; + + /* Apply gain and undo log */ + for ( i = 0; i < N; i++ ) + { + sidNoiseEst[i] = (float) pow( 10.f, ( v[i] + gain ) / 10.f ); + } + + /* NB last band energy compensation */ + + if ( hFdCngCom->CngBandwidth == NB ) + { + sidNoiseEst[N - 1] *= NB_LAST_BAND_SCALE; + } + + if ( hFdCngCom->CngBandwidth == SWB && hFdCngCom->CngBitrate <= ACELP_13k20 ) + { + sidNoiseEst[N - 1] *= SWB_13k2_LAST_BAND_SCALE; + } + + scalebands( sidNoiseEst, hFdCngCom->part, hFdCngCom->npart, hFdCngCom->midband, hFdCngCom->nFFTpart, hFdCngCom->stopBand - hFdCngCom->startBand, hFdCngCom->cngNoiseLevel, 1 ); + + lpc_from_spectrum( hFdCngCom, hFdCngCom->startBand, hFdCngCom->stopFFTbin, st->preemph_fac ); + + return; +} + + +/*------------------------------------------------------------------- + * noisy_speech_detection() + * + * + *-------------------------------------------------------------------*/ + +void noisy_speech_detection( + HANDLE_FD_CNG_DEC hFdCngDec, /* i/o: FD_CNG structure */ + const int16_t vad, /* i : VAD flag */ + const float syn[] /* i : input time-domain frame */ +) +{ + float tmp; + + if ( vad == 0 ) + { + tmp = dotp( hFdCngDec->msNoiseEst, hFdCngDec->psize_shaping, hFdCngDec->nFFTpart_shaping ); + hFdCngDec->lp_noise = 0.995f * hFdCngDec->lp_noise + 0.005f * 10.f * (float) log10( tmp + DELTA ); + } + else + { + tmp = dotp( syn, syn, hFdCngDec->hFdCngCom->frameSize ) * 2.f / hFdCngDec->hFdCngCom->frameSize; + hFdCngDec->lp_speech = 0.995f * hFdCngDec->lp_speech + 0.005f * 10.f * (float) log10( tmp + DELTA ); + } + + tmp = hFdCngDec->lp_speech - 45.f; + if ( hFdCngDec->lp_noise < tmp ) + { + hFdCngDec->lp_noise = tmp; + } + + hFdCngDec->hFdCngCom->flag_noisy_speech = ( hFdCngDec->lp_speech - hFdCngDec->lp_noise ) < 28.f; + + return; +} + + +/*------------------------------------------------------------------- + * generate_comfort_noise_dec() + * + * Generate the comfort noise based on the target noise level + *-------------------------------------------------------------------*/ + +void generate_comfort_noise_dec( + float **bufferReal, /* o : Real part of input bands */ + float **bufferImag, /* o : Imaginary part of input bands */ + Decoder_State *st, /* i/o: decoder state structure */ + const int16_t nchan_out /* i : number of output channels */ +) +{ + int16_t i, j; + float *ptr_r, *ptr_i; + HANDLE_FD_CNG_DEC hFdCngDec = st->hFdCngDec; + HANDLE_FD_CNG_COM hFdCngCom = hFdCngDec->hFdCngCom; + float *cngNoiseLevel = hFdCngCom->cngNoiseLevel; + float *ptr_level = cngNoiseLevel; + int16_t *seed = &( hFdCngCom->seed ); + int16_t *seed2; + float c1, c2; + float tmp1, tmp2; + float scale, scaleCldfb; + float *fftBuffer = hFdCngCom->fftBuffer; + float *timeDomainOutput = hFdCngCom->timeDomainBuffer; + int16_t tcx_transition; + float enr, att; + + scale = 1.f; + scaleCldfb = CLDFB_SCALING / hFdCngCom->scalingFactor; + + c1 = (float) sqrt( hFdCngCom->coherence ); + c2 = (float) sqrt( 1 - hFdCngCom->coherence ); + + seed2 = &( hFdCngCom->seed2 ); + if ( ( st->element_mode == IVAS_CPE_MDCT && st->idchan == 1 ) || ( st->element_mode == IVAS_SCE && st->cng_ism_flag ) ) + { + seed2 = &( hFdCngCom->seed3 ); + } + + /* Generate Gaussian random noise in real and imaginary parts of the FFT bins + Amplitudes are adjusted to the estimated noise level cngNoiseLevel in each bin */ + + if ( hFdCngCom->startBand == 0 ) + { + if ( st->element_mode == IVAS_CPE_MDCT || ( st->element_mode == IVAS_SCE && st->cng_ism_flag ) ) + { + rand_gauss( &tmp1, seed ); + rand_gauss( &tmp2, seed2 ); + fftBuffer[0] = tmp1 * c1 + tmp2 * c2; + } + else + { + rand_gauss( &fftBuffer[0], seed ); + } + fftBuffer[0] *= (float) sqrt( scale * *ptr_level ); /* DC component in FFT */ + ptr_level++; + ptr_r = fftBuffer + 2; + } + else + { + fftBuffer[0] = 0.f; + set_f( fftBuffer + 2, 0.0f, 2 * ( hFdCngCom->startBand - 1 ) ); + ptr_r = fftBuffer + 2 * hFdCngCom->startBand; + } + + ptr_i = ptr_r + 1; + for ( ; ptr_level < cngNoiseLevel + hFdCngCom->stopFFTbin - hFdCngCom->startBand; ptr_level++ ) + { + /* Real part in FFT bins */ + if ( st->element_mode == IVAS_CPE_MDCT || ( st->element_mode == IVAS_SCE && st->cng_ism_flag ) ) + { + rand_gauss( &tmp1, seed ); + rand_gauss( &tmp2, seed2 ); + *ptr_r = tmp1 * c1 + tmp2 * c2; + } + else + { + rand_gauss( ptr_r, seed ); + } + ( *ptr_r ) *= (float) sqrt( ( scale * *ptr_level ) * 0.5f ); + ptr_r += 2; + + /* Imaginary part in FFT bins */ + if ( st->element_mode == IVAS_CPE_MDCT || ( st->element_mode == IVAS_SCE && st->cng_ism_flag ) ) + { + rand_gauss( &tmp1, seed ); + rand_gauss( &tmp2, seed2 ); + *ptr_i = tmp1 * c1 + tmp2 * c2; + } + else + { + rand_gauss( ptr_i, seed ); + } + ( *ptr_i ) *= (float) sqrt( ( scale * *ptr_level ) * 0.5f ); + ptr_i += 2; + } + + /* Remaining FFT bins are set to zero */ + set_f( fftBuffer + 2 * hFdCngCom->stopFFTbin, 0.0f, hFdCngCom->fftlen - 2 * hFdCngCom->stopFFTbin ); + + /* Nyquist frequency is discarded */ + fftBuffer[1] = 0.f; + + /* If previous frame is active, reset the overlap-add buffer */ + tcx_transition = 0; + if ( hFdCngCom->frame_type_previous == ACTIVE_FRAME ) + { + set_f( hFdCngCom->olapBufferSynth, 0.0f, hFdCngCom->fftlen ); + if ( ( st->core > ACELP_CORE && st->codec_mode == MODE2 ) || st->codec_mode == MODE1 ) + { + tcx_transition = 1; + } + } + + /* Perform STFT synthesis */ + SynthesisSTFT( fftBuffer, timeDomainOutput, hFdCngCom->olapBufferSynth, hFdCngCom->olapWinSyn, tcx_transition, hFdCngCom, st->element_mode, nchan_out ); + + /* update CNG excitation energy for LP_CNG */ + + /* calculate the residual signal energy */ + enr = dotp( hFdCngCom->exc_cng, hFdCngCom->exc_cng, hFdCngCom->frameSize ) / hFdCngCom->frameSize; + + /* convert log2 of residual signal energy */ + enr = (float) log10( enr + 0.1f ) / (float) log10( 2.0f ); + + /* decrease the energy in case of WB input */ + if ( st->bwidth != NB ) + { + if ( st->bwidth == WB ) + { + if ( st->CNG_mode >= 0 ) + { + /* Bitrate adapted attenuation */ + att = ENR_ATT[st->CNG_mode]; + } + else + { + /* Use least attenuation for higher bitrates */ + att = ENR_ATT[4]; + } + } + else + { + att = 1.5f; + } + + enr -= att; + } + + st->lp_ener = (float) ( 0.8f * st->lp_ener + 0.2f * pow( 2.0f, enr ) ); + + /* Generate Gaussian random noise in real and imaginary parts of the CLDFB bands + Amplitudes are adjusted to the estimated noise level cngNoiseLevel in each band */ + + if ( bufferReal != NULL && hFdCngCom->numCoreBands < hFdCngCom->regularStopBand ) + { + for ( j = hFdCngCom->numCoreBands; j < hFdCngCom->regularStopBand; j++ ) + { + for ( i = 0; i < hFdCngCom->numSlots; i++ ) + { + /* Real part in CLDFB band */ + if ( st->element_mode == IVAS_CPE_MDCT || ( st->element_mode == IVAS_SCE && st->cng_ism_flag ) ) + { + rand_gauss( &tmp1, seed ); + rand_gauss( &tmp2, seed2 ); + bufferReal[i][j] = tmp1 * c1 + tmp2 * c2; + } + else + { + rand_gauss( &bufferReal[i][j], seed ); + } + bufferReal[i][j] *= (float) sqrt( ( scaleCldfb * *ptr_level ) * 0.5f ); + + /* Imaginary part in CLDFB band */ + if ( st->element_mode == IVAS_CPE_MDCT || ( st->element_mode == IVAS_SCE && st->cng_ism_flag ) ) + { + rand_gauss( &tmp1, seed ); + rand_gauss( &tmp2, seed2 ); + bufferImag[i][j] = tmp1 * c1 + tmp2 * c2; + } + else + { + rand_gauss( &bufferImag[i][j], seed ); + } + bufferImag[i][j] *= (float) sqrt( ( scaleCldfb * *ptr_level ) * 0.5f ); + } + ptr_level++; + } + } + + /* Overlap-add when previous frame is active */ + if ( hFdCngCom->frame_type_previous == ACTIVE_FRAME && st->codec_mode == MODE2 ) + { + float noise[2048], old_exc_ener = 0.f, gain = 0.f, tmp; + int16_t N = hFdCngCom->frameSize; + int16_t seed_loc = hFdCngCom->seed; + float *old_exc, old_Aq[M + 1], *old_syn_pe, old_syn; + + if ( st->core > ACELP_CORE ) + { + tcx_windowing_synthesis_current_frame( timeDomainOutput, st->hTcxCfg->tcx_mdct_window, /*Keep sine windows for limiting Time modulation*/ + st->hTcxCfg->tcx_mdct_window_half, st->hTcxCfg->tcx_mdct_window_minimum, st->hTcxCfg->tcx_mdct_window_length, st->hTcxCfg->tcx_mdct_window_half_length, st->hTcxCfg->tcx_mdct_window_min_length, 0, st->hTcxCfg->tcx_last_overlap_mode == ALDO_WINDOW ? FULL_OVERLAP : st->hTcxCfg->tcx_last_overlap_mode, NULL, NULL, NULL, NULL, NULL, N / 2, st->hTcxCfg->tcx_offset < 0 ? -st->hTcxCfg->tcx_offset : 0, 1, 0, 0 ); + + if ( st->hTcxCfg->last_aldo ) + { + for ( i = 0; i < ( hFdCngCom->frameSize - NS2SA( st->sr_core, N_ZERO_MDCT_NS ) ); i++ ) + { + timeDomainOutput[i] += st->hHQ_core->old_outLB[i + NS2SA( st->sr_core, N_ZERO_MDCT_NS )]; + } + } + else + { + tcx_windowing_synthesis_past_frame( st->hTcxDec->syn_Overl, st->hTcxCfg->tcx_mdct_window, st->hTcxCfg->tcx_mdct_window_half, st->hTcxCfg->tcx_mdct_window_minimum, st->hTcxCfg->tcx_mdct_window_length, st->hTcxCfg->tcx_mdct_window_half_length, st->hTcxCfg->tcx_mdct_window_min_length, st->hTcxCfg->tcx_last_overlap_mode ); + + for ( i = 0; i < st->hTcxCfg->tcx_mdct_window_length; i++ ) + { + timeDomainOutput[i] += st->hTcxDec->syn_Overl[i]; + } + } + } + else + { + mvr2r( st->old_Aq_12_8, old_Aq, M + 1 ); + old_exc = st->old_exc + L_EXC_MEM_DEC - ( N / 2 ); + old_syn_pe = st->mem_syn2; + old_syn = st->syn[M]; + + for ( i = 0; i < N / 2; i++ ) + { + old_exc_ener += old_exc[i] * old_exc[i]; + } + + old_exc_ener = (float) sqrt( old_exc_ener / (float) ( N / 2 ) ); + + for ( i = 0; i < N; i++ ) + { + rand_gauss( &( noise[i] ), &( seed_loc ) ); + gain += noise[i] * noise[i]; + } + + gain = old_exc_ener / (float) sqrt( gain / (float) N ); + + for ( i = 0; i < N; i++ ) + { + noise[i] *= gain; + } + + syn_filt( old_Aq, M, noise, noise, N, old_syn_pe, 0 ); + + tmp = old_syn; + + deemph( noise, st->preemph_fac, N, &tmp ); + + for ( i = 0; i < N / 2; i++ ) + { + timeDomainOutput[i] += noise[i] * hFdCngCom->olapWinSyn[N / 2 + i]; + } + } + } + + return; +} + + +/*------------------------------------------------------------------- + * generate_comfort_noise_dec_hf() + * + * Generate the comfort noise based on the target noise level for the CLDFB part + *-------------------------------------------------------------------*/ + +void generate_comfort_noise_dec_hf( + float **bufferReal, /* o : Real part of input bands */ + float **bufferImag, /* o : Imaginary part of input bands */ + HANDLE_FD_CNG_COM hFdCngCom, /* i/o: FD_CNG structure containing all buffers and variables */ + const int16_t cng_coh_flag /* i : CNG Flag for coherence handling */ +) +{ + int16_t i, j; + float *ptr_level; + + int16_t *seed = &( hFdCngCom->seed ); + float scale = CLDFB_SCALING / hFdCngCom->scalingFactor; + + int16_t *seed2 = &( hFdCngCom->seed ); + float tmp1, tmp2, c1 = 0.f, c2 = 0.f; + + if ( cng_coh_flag ) + { + seed2 = &( hFdCngCom->seed3 ); + + c1 = (float) sqrt( hFdCngCom->coherence ); + c2 = (float) sqrt( 1 - hFdCngCom->coherence ); + } + + ptr_level = hFdCngCom->cngNoiseLevel + hFdCngCom->stopFFTbin - hFdCngCom->startBand; + /* + Generate Gaussian random noise in real and imaginary parts of the CLDFB bands + Amplitudes are adjusted to the estimated noise level cngNoiseLevel in each band + */ + if ( hFdCngCom->numCoreBands < hFdCngCom->regularStopBand ) + { + for ( j = hFdCngCom->numCoreBands; j < hFdCngCom->regularStopBand; j++ ) + { + for ( i = 0; i < hFdCngCom->numSlots; i++ ) + { + if ( cng_coh_flag ) + { + /* Real part in CLDFB band */ + rand_gauss( &tmp1, seed ); + rand_gauss( &tmp2, seed2 ); + bufferReal[i][j] = tmp1 * c1 + tmp2 * c2; + bufferReal[i][j] *= (float) sqrt( ( scale * *ptr_level ) * 0.5f ); + + /* Imaginary part in CLDFB band */ + rand_gauss( &tmp1, seed ); + rand_gauss( &tmp2, seed2 ); + bufferImag[i][j] = tmp1 * c1 + tmp2 * c2; + bufferImag[i][j] *= (float) sqrt( ( scale * *ptr_level ) * 0.5f ); + } + else + { + /* Real part in CLDFB band */ + rand_gauss( &bufferReal[i][j], seed ); + bufferReal[i][j] *= (float) sqrt( ( scale * *ptr_level ) * 0.5f ); + /* Imaginary part in CLDFB band */ + rand_gauss( &bufferImag[i][j], seed ); + bufferImag[i][j] *= (float) sqrt( ( scale * *ptr_level ) * 0.5f ); + } + } + ptr_level++; + } + } + + return; +} + + +/*------------------------------------------------------------------- + * generate_masking_noise() + * + * Generate additional comfort noise (kind of noise filling) + *-------------------------------------------------------------------*/ + +void generate_masking_noise( + float *timeDomainBuffer, /* i/o: time-domain signal */ + HANDLE_FD_CNG_COM hFdCngCom, /* i/o: FD_CNG structure containing all buffers and variables */ + const int16_t length, /* i : frame size */ + const int16_t core, /* i : core */ + const int16_t return_noise, /* i : noise is returned instead of added */ + const int16_t secondary, /* i : flag to indicate secondary noise generation */ + const int16_t element_mode, /* i : element mode */ + STEREO_CNG_DEC_HANDLE hStereoCng, /* i : stereo CNG handle */ + const int16_t nchan_out /* i : number of output channels */ +) +{ + float *cngNoiseLevel = hFdCngCom->cngNoiseLevel; + float *ptr_level = cngNoiseLevel; + float *fftBuffer = hFdCngCom->fftBuffer; + int16_t i; + float maskingNoise[L_FRAME16k]; + float *ptr_r; + float *ptr_i; + int16_t startBand = hFdCngCom->startBand; + int16_t *seed = &( hFdCngCom->seed ); + float scale = 1.f; + + /* skip noise generating if level is very low, to avoid problems with possibly running into denormals */ + if ( hFdCngCom->likelihood_noisy_speech > DELTA_MASKING_NOISE ) + { + if ( core != AMR_WB_CORE ) + { + /* Compute additional CN level */ + for ( i = 0; i < SIZE_SCALE_TABLE_CN; i++ ) + { + if ( ( hFdCngCom->CngBandwidth == scaleTable_cn_only[i].bwmode ) && + ( hFdCngCom->CngBitrate >= scaleTable_cn_only[i].bitrateFrom ) && + ( hFdCngCom->CngBitrate < scaleTable_cn_only[i].bitrateTo ) ) + { + break; + } + } + + scale *= (float) pow( 10.f, -scaleTable_cn_only[i].scale / 10.f ) - 1.f; + } + else + { + /* Compute additional CN level */ + for ( i = 0; i < SIZE_SCALE_TABLE_CN_AMRWB; i++ ) + { + if ( hFdCngCom->CngBitrate >= scaleTable_cn_only_amrwbio[i][0] ) + { + break; + } + } + + if ( i < SIZE_SCALE_TABLE_CN_AMRWB ) + { + scale *= (float) pow( 10.f, -scaleTable_cn_only_amrwbio[i][1] / 10.f ) - 1.f; + } + else + { + scale = 0.f; + } + } + + /* Exclude clean speech */ + scale *= hFdCngCom->likelihood_noisy_speech; + + /* Generate Gaussian random noise in real and imaginary parts of the FFT bins + Amplitudes are adjusted to the estimated noise level cngNoiseLevel in each bin */ + if ( startBand == 0 ) + { + rand_gauss( &fftBuffer[0], seed ); + ptr_r = fftBuffer + 2; + fftBuffer[0] *= (float) sqrt( scale * *ptr_level ); /* DC component in FFT */ + ptr_level++; + } + else + { + fftBuffer[0] = 0.f; + set_f( fftBuffer + 2, 0.0f, 2 * ( startBand - 1 ) ); + ptr_r = fftBuffer + 2 * startBand; + } + ptr_i = ptr_r + 1; + for ( ; ptr_level < cngNoiseLevel + hFdCngCom->stopFFTbin - startBand; ptr_level++ ) + { + /* Real part in FFT bins */ + rand_gauss( ptr_r, seed ); + ( *ptr_r ) *= (float) sqrt( ( scale * *ptr_level ) * 0.5f ); + ptr_r += 2; + /* Imaginary part in FFT bins */ + rand_gauss( ptr_i, seed ); + ( *ptr_i ) *= (float) sqrt( ( scale * *ptr_level ) * 0.5f ); + ptr_i += 2; + } + + /* Remaining FFT bins are set to zero */ + set_f( fftBuffer + 2 * hFdCngCom->stopFFTbin, 0.0f, hFdCngCom->fftlen - 2 * hFdCngCom->stopFFTbin ); + /* Nyquist frequency is discarded */ + fftBuffer[1] = 0.f; + } + else + { + /* very low level case - update random seeds and reset FFT buffer; don't fully skip SynthesisSTFT(), because of the buffer updates done there... */ + generate_masking_noise_update_seed( hFdCngCom ); + + set_f( fftBuffer, 0.f, hFdCngCom->fftlen ); + } + + /* Perform STFT synthesis */ + if ( secondary ) + { + SynthesisSTFT( fftBuffer, maskingNoise, hStereoCng->olapBufferSynth22, hFdCngCom->olapWinSyn, 0, hFdCngCom, element_mode, nchan_out ); + } + else + { + SynthesisSTFT( fftBuffer, maskingNoise, hFdCngCom->olapBufferSynth2, hFdCngCom->olapWinSyn, 0, hFdCngCom, element_mode, nchan_out ); + } + + /* Add some comfort noise on top of decoded signal */ + if ( return_noise ) + { + mvr2r( maskingNoise, timeDomainBuffer, min( hFdCngCom->frameSize, length ) ); + } + else + { + v_add( maskingNoise, timeDomainBuffer, timeDomainBuffer, min( hFdCngCom->frameSize, length ) ); + } + + return; +} + + +/*------------------------------------------------------------------- + * generate_masking_noise_update_seed() + * + * Update seed for scenarios where generate_masking_noise() is + * not called based on signal statistics + *-------------------------------------------------------------------*/ + +void generate_masking_noise_update_seed( + HANDLE_FD_CNG_COM hFdCngCom /* i/o: FD_CNG structure containing all buffers and variables */ +) +{ + float *cngNoiseLevel = hFdCngCom->cngNoiseLevel; + float *ptr_level = cngNoiseLevel; + int16_t startBand = hFdCngCom->startBand; + int16_t *seed = &( hFdCngCom->seed ); + float tmp = 0; + + /* + Generate Gaussian random noise in real and imaginary parts of the FFT bins + Amplitudes are adjusted to the estimated noise level cngNoiseLevel in each bin + */ + if ( startBand == 0 ) + { + rand_gauss( &tmp, seed ); + ptr_level++; + } + + for ( ; ptr_level < cngNoiseLevel + hFdCngCom->stopFFTbin - startBand; ptr_level++ ) + { + /* Real part in FFT bins */ + rand_gauss( &tmp, seed ); + rand_gauss( &tmp, seed ); + } + + return; +} + + +/*------------------------------------------------------------------- + * generate_masking_noise_mdct() + * + * Generate additional comfort noise (kind of noise filling) + *-------------------------------------------------------------------*/ + +void generate_masking_noise_mdct( + float *mdctBuffer, /* i/o: time-domain signal */ + HANDLE_FD_CNG_COM hFdCngCom /* i/o: FD_CNG structure containing all buffers and variables */ +) +{ + float *cngNoiseLevel = hFdCngCom->cngNoiseLevel; + int16_t i; + float maskingNoise[2 * L_FRAME16k]; + float *ptr_r; + float *ptr_level = cngNoiseLevel; + int16_t startBand = hFdCngCom->startBand; + int16_t *seed = &( hFdCngCom->seed ); + float scale = 1.f; + + /* skip noise generating if level is very low, to avoid problems with possibly running into denormals */ + if ( hFdCngCom->likelihood_noisy_speech > DELTA_MASKING_NOISE ) + { + for ( i = 0; i < SIZE_SCALE_TABLE_CN; i++ ) + { + if ( ( hFdCngCom->CngBandwidth == scaleTable_cn_only[i].bwmode ) && + ( hFdCngCom->CngBitrate >= scaleTable_cn_only[i].bitrateFrom ) && + ( hFdCngCom->CngBitrate < scaleTable_cn_only[i].bitrateTo ) ) + { + break; + } + } + + scale *= (float) pow( 10.f, -scaleTable_cn_only[i].scale / 10.f ) - 1.f; + + /* Exclude clean speech */ + scale *= hFdCngCom->likelihood_noisy_speech; + + /* + Generate Gaussian random noise in real and imaginary parts of the FFT bins + Amplitudes are adjusted to the estimated noise level cngNoiseLevel in each bin + */ + if ( startBand == 0 ) + { + rand_gauss( &maskingNoise[0], seed ); + maskingNoise[0] *= (float) sqrt( scale * *ptr_level * 0.5f ); /* DC component in FFT */ + ptr_level++; + ptr_r = maskingNoise + 1; + } + else + { + maskingNoise[0] = 0.f; + set_f( maskingNoise + 1, 0.0f, ( startBand - 1 ) ); + ptr_r = maskingNoise + startBand; + } + + for ( ; ptr_level < cngNoiseLevel + hFdCngCom->stopFFTbin - startBand; ptr_level++ ) + { + /* MDCT bins */ + rand_gauss( ptr_r, seed ); + ( *ptr_r ) *= (float) sqrt( scale * *ptr_level * 0.5f ); + ptr_r += 1; + } + + /*re-normalization of energy level: M/sqrt(2)*/ + v_multc( maskingNoise, (float) sqrt( NORM_MDCT_FACTOR ), maskingNoise, hFdCngCom->stopFFTbin ); + + /* Add some comfort noise on top of decoded signal */ + v_add( maskingNoise, mdctBuffer, mdctBuffer, hFdCngCom->stopFFTbin ); + } + else + { + /* very low level case - just update random seeds */ + if ( startBand == 0 ) + { + rand_gauss( &maskingNoise[0], seed ); + ptr_level++; + } + + for ( ; ptr_level < cngNoiseLevel + hFdCngCom->stopFFTbin - startBand; ptr_level++ ) + { + rand_gauss( &maskingNoise[0], seed ); + } + } + + return; +} + +/*------------------------------------------------------------------- + * generate_stereo_masking_noise() + * + * Generate additional comfort noise (kind of noise filling) + *-------------------------------------------------------------------*/ + +void generate_stereo_masking_noise( + float *syn, /* i/o: time-domain signal */ + Decoder_State *st, /* i/o: decoder state structure */ + STEREO_TD_DEC_DATA_HANDLE hStereoTD, /* i : TD stereo structure */ + const int16_t flag_sec_CNA, /* i : CNA flag for secondary channel */ + const int16_t fadeOut, /* i : only fade out of previous state */ + STEREO_CNG_DEC_HANDLE hStereoCng, /* i : Stereo CNG handle */ + const int16_t nchan_out /* i : number of output channels */ +) +{ + HANDLE_FD_CNG_COM hFdCngCom; + float gamma, scale, SP_ratio; + float Np[L_FRAME16k]; + float Ns[L_FRAME16k]; + float N1[L_FRAME16k]; + float N2[L_FRAME16k]; + int16_t i; + + if ( st->idchan == 0 ) + { + hFdCngCom = st->hFdCngDec->hFdCngCom; + mvr2r( hFdCngCom->olapBufferSynth2, Np, hFdCngCom->frameSize / 2 ); + mvr2r( hStereoCng->olapBufferSynth22, Ns, hFdCngCom->frameSize / 2 ); + set_f( &Np[hFdCngCom->frameSize / 2], 0.0f, hFdCngCom->frameSize / 2 ); + set_f( &Ns[hFdCngCom->frameSize / 2], 0.0f, hFdCngCom->frameSize / 2 ); + + if ( !fadeOut ) + { + generate_masking_noise( N1, hFdCngCom, hFdCngCom->frameSize, 0, 1, 0, st->element_mode, hStereoCng, nchan_out ); + /* Generate masking noise for secondary channel */ + if ( flag_sec_CNA ) + { + generate_masking_noise( N2, hFdCngCom, hFdCngCom->frameSize, 0, 1, 1, st->element_mode, hStereoCng, nchan_out ); + gamma = hStereoCng->c_PS_LT * hStereoCng->c_PS_LT; + scale = 1.0f; + if ( gamma < 0.9f ) + { + gamma = gamma / ( 1 - gamma ); + gamma = (float) sqrt( gamma + 1 ) - (float) sqrt( gamma ); + scale = 1.0f / (float) sqrt( 1 + gamma * gamma ); + } + else + { + gamma = 0.0f; + } + + for ( i = 0; i < 2 * hFdCngCom->frameSize / 4; i++ ) + { + Np[i] += scale * ( N1[i] + gamma * N2[i] ); + Ns[i] += scale * sign( hStereoCng->c_PS_LT ) * ( N1[i] - gamma * N2[i] ); + } + for ( ; i < hFdCngCom->frameSize; i++ ) + { + Np[i] = scale * ( N1[i] + gamma * N2[i] ); + Ns[i] = scale * sign( hStereoCng->c_PS_LT ) * ( N1[i] - gamma * N2[i] ); + } + scale *= (float) ( hFdCngCom->fftlen / 2 ); + for ( i = 0; i < hFdCngCom->frameSize / 2; i++ ) + { + hFdCngCom->olapBufferSynth2[i] = scale * ( hFdCngCom->olapBufferSynth2[i + 5 * hFdCngCom->frameSize / 4] + gamma * hStereoCng->olapBufferSynth22[i + 5 * hFdCngCom->frameSize / 4] ); + hStereoCng->olapBufferSynth22[i] = sign( hStereoCng->c_PS_LT ) * scale * ( hFdCngCom->olapBufferSynth2[i + 5 * hFdCngCom->frameSize / 4] - gamma * hStereoCng->olapBufferSynth22[i + 5 * hFdCngCom->frameSize / 4] ); + } + } + else + { + for ( i = 0; i < hFdCngCom->frameSize / 2; i++ ) + { + Np[i] += N1[i]; + } + mvr2r( &N1[hFdCngCom->frameSize / 2], &Np[hFdCngCom->frameSize / 2], hFdCngCom->frameSize / 2 ); + scale = (float) ( hFdCngCom->fftlen / 2 ); + for ( i = 0; i < hFdCngCom->frameSize; i++ ) + { + hFdCngCom->olapBufferSynth2[i] = scale * hFdCngCom->olapBufferSynth2[i + 5 * hFdCngCom->frameSize / 4]; + } + } + } + else + { + set_f( hFdCngCom->olapBufferSynth2, 0.0f, hFdCngCom->frameSize / 2 ); + set_f( hStereoCng->olapBufferSynth22, 0.0f, hFdCngCom->frameSize / 2 ); + } + if ( flag_sec_CNA ) + { + mvr2r( Ns, hStereoCng->maskingNoiseS, hFdCngCom->frameSize ); + hStereoCng->enableSecCNA = 1; + } + else + { + set_f( hStereoCng->olapBufferSynth22, 0.0f, hFdCngCom->frameSize ); + } + + /* add masking noise */ + v_add( Np, syn, syn, hFdCngCom->frameSize ); + } + else if ( hStereoCng->enableSecCNA ) + { + SP_ratio = hStereoTD->SP_ratio_LT; /* Use long-term SP ratio based on L/R synthesis */ + /* scale and add masking noise */ + for ( i = 0; i < *hStereoCng->frameSize / 4; i++ ) + { + scale = ( ( hStereoTD->prevSP_ratio * ( *hStereoCng->frameSize / 4 - (float) i ) + SP_ratio * (float) i ) / ( *hStereoCng->frameSize / 4 ) ); + syn[i] += scale * hStereoCng->maskingNoiseS[i]; + } + for ( ; i < *hStereoCng->frameSize / 2; i++ ) + { + syn[i] += SP_ratio * hStereoCng->maskingNoiseS[i]; + } + for ( ; i < *hStereoCng->frameSize; i++ ) + { + syn[i] += SP_ratio * hStereoCng->maskingNoiseS[i]; + } + hStereoTD->prevSP_ratio = SP_ratio; + } + + return; +} + + +/*------------------------------------------------------------------- + * generate_masking_noise_hf_cldfb() + * + * Generate additional comfort noise (kind of noise filling) + *-------------------------------------------------------------------*/ + +void generate_masking_noise_lb_dirac( + HANDLE_FD_CNG_COM hFdCngCom, /* i/o: FD_CNG structure containing all buffers and variables */ + float *tdBuffer, /* i/o: time-domain signal, if NULL no LB-CNA */ + const int16_t nCldfbTs, /* i : number of CLDFB slots that will be rendered */ + const int16_t cna_flag /* i : CNA flag for LB and HB */ +) +{ + int16_t i; + float *cngNoiseLevel = hFdCngCom->cngNoiseLevel; + float *fftBuffer = hFdCngCom->fftBuffer; + float *ptr_r; + float *ptr_i; + float *ptr_level; + int16_t *seed = &( hFdCngCom->seed ); + float scale; + int16_t n_samples_out, n_samples_start, n_samples_out_loop; + + push_wmops( "fd_cng_dirac" ); + + /* Init */ + scale = 0.f; + n_samples_out = hFdCngCom->frameSize / DEFAULT_JBM_CLDFB_TIMESLOTS * nCldfbTs; + n_samples_start = 0; + + /*LB CLDFB - CNA from STFT*/ + if ( cna_flag ) + { + /* skip noise generating if level is very low, to avoid problems with possibly running into denormals */ + if ( hFdCngCom->likelihood_noisy_speech > DELTA_MASKING_NOISE ) + { + /* Compute additional CN level */ + for ( i = 0; i < 15; i++ ) + { + if ( ( hFdCngCom->CngBandwidth == scaleTable_cn_dirac[i].bwmode ) && + ( hFdCngCom->CngBitrate >= scaleTable_cn_dirac[i].bitrateFrom ) && + ( hFdCngCom->CngBitrate < scaleTable_cn_dirac[i].bitrateTo ) ) + { + break; + } + } + + scale = (float) pow( 10.f, -scaleTable_cn_dirac[i].scale / 10.f ) - 1.f; + scale *= hFdCngCom->likelihood_noisy_speech; + } + } + + /* LB CLDFB - CNA from STFT: CNA applied only in channel 0*/ + if ( cna_flag && tdBuffer != NULL ) + { + while ( n_samples_out > 0 ) + { + n_samples_out_loop = min( hFdCngCom->frameSize, n_samples_out ); + if ( scale != 0 ) + { + /*Generate LF comfort noise only at first slot, for the whole frame*/ + ptr_level = cngNoiseLevel; + + /* Generate Gaussian random noise in real and imaginary parts of the FFT bins + Amplitudes are adjusted to the estimated noise level cngNoiseLevel in each bin */ + if ( hFdCngCom->startBand == 0 ) + { + rand_gauss( &fftBuffer[0], seed ); + ptr_r = fftBuffer + 2; + fftBuffer[0] *= (float) sqrt( scale * *ptr_level ); /* DC component in FFT */ + ptr_level++; + } + else + { + fftBuffer[0] = 0.f; + set_f( fftBuffer + 2, 0.0f, 2 * ( hFdCngCom->startBand - 1 ) ); + ptr_r = fftBuffer + 2 * hFdCngCom->startBand; + } + ptr_i = ptr_r + 1; + + for ( ; ptr_level < cngNoiseLevel + hFdCngCom->stopFFTbin - hFdCngCom->startBand; ptr_level++ ) + { + /* Real part in FFT bins */ + rand_gauss( ptr_r, seed ); + ( *ptr_r ) *= (float) sqrt( ( scale * *ptr_level ) * 0.5f ); + ptr_r += 2; + /* Imaginary part in FFT bins */ + rand_gauss( ptr_i, seed ); + ( *ptr_i ) *= (float) sqrt( ( scale * *ptr_level ) * 0.5f ); + ptr_i += 2; + } + + /* Remaining FFT bins are set to zero */ + set_f( fftBuffer + 2 * hFdCngCom->stopFFTbin, 0.0f, hFdCngCom->fftlen - 2 * hFdCngCom->stopFFTbin ); + /* Nyquist frequency is discarded */ + fftBuffer[1] = 0.f; + + /* Perform STFT synthesis */ + SynthesisSTFT_dirac( fftBuffer, tdBuffer + n_samples_start, hFdCngCom->olapBufferSynth2, hFdCngCom->olapWinSyn, n_samples_out_loop, hFdCngCom ); + + } + + else + { + /* very low level case - update random seeds */ + generate_masking_noise_update_seed( hFdCngCom ); + + set_f( fftBuffer, 0.f, hFdCngCom->fftlen ); + + /* Perform STFT synthesis */ + SynthesisSTFT_dirac( fftBuffer, tdBuffer + n_samples_start, hFdCngCom->olapBufferSynth2, hFdCngCom->olapWinSyn, n_samples_out_loop, hFdCngCom ); + + } + n_samples_out -= hFdCngCom->frameSize; + n_samples_start += hFdCngCom->frameSize; + } + } + + pop_wmops(); + + return; +} + + +/*------------------------------------------------------------------- + * generate_masking_noise_hf_cldfb() + * + * Generate additional comfort noise (kind of noise filling) + *-------------------------------------------------------------------*/ + +void generate_masking_noise_dirac( + HANDLE_FD_CNG_COM hFdCngCom, /* i/o: FD_CNG structure containing all buffers and variables */ + HANDLE_CLDFB_FILTER_BANK h_cldfb, /* i : filterbank state */ + float *tdBuffer, /* i/o: time-domain signal, if NULL no LB-CNA */ + float *Cldfb_RealBuffer, /* o : CLDFD real buffer */ + float *Cldfb_ImagBuffer, /* o : CLDFD imaginary buffer */ + const int16_t slot_index, /* i : CLDFB slot index */ + const int16_t cna_flag, /* i : CNA flag for LB and HB */ + const int16_t fd_cng_flag /* i : FD-CNG flag for HB */ +) +{ + int16_t i; + float *ptr_level; + int16_t *seed = &( hFdCngCom->seed ); + float scale; + + push_wmops( "fd_cng_dirac" ); + + /* Init */ + scale = 0.f; + + /* Resample CLDFB memories if necessary*/ + if ( ( h_cldfb->no_channels * h_cldfb->no_col ) != hFdCngCom->frameSize ) + { + resampleCldfb( h_cldfb, hFdCngCom->frameSize * FRAMES_PER_SEC ); + } + + set_zero( Cldfb_RealBuffer, CLDFB_NO_CHANNELS_MAX ); + set_zero( Cldfb_ImagBuffer, CLDFB_NO_CHANNELS_MAX ); + + /*LB CLDFB - CNA from STFT*/ + if ( cna_flag ) + { + /* skip noise generating if level is very low, to avoid problems with possibly running into denormals */ + if ( hFdCngCom->likelihood_noisy_speech > DELTA_MASKING_NOISE ) + { + /* Compute additional CN level */ + for ( i = 0; i < 15; i++ ) + { + if ( ( hFdCngCom->CngBandwidth == scaleTable_cn_dirac[i].bwmode ) && + ( hFdCngCom->CngBitrate >= scaleTable_cn_dirac[i].bitrateFrom ) && + ( hFdCngCom->CngBitrate < scaleTable_cn_dirac[i].bitrateTo ) ) + { + break; + } + } + + scale = (float) pow( 10.f, -scaleTable_cn_dirac[i].scale / 10.f ) - 1.f; + scale *= hFdCngCom->likelihood_noisy_speech; + } + } + /* LB CLDFB - CNA from STFT: CNA applied only in channel 0*/ + if ( cna_flag && tdBuffer != NULL ) + { + if ( scale != 0 ) + { + /* LF CLDFB*/ + cldfbAnalysis_ts( &( tdBuffer[hFdCngCom->numCoreBands * slot_index] ), Cldfb_RealBuffer, Cldfb_ImagBuffer, hFdCngCom->numCoreBands, h_cldfb ); + } + else + { + /* LB ana CLDFB*/ + cldfbAnalysis_ts( &( tdBuffer[hFdCngCom->numCoreBands * slot_index] ), Cldfb_RealBuffer, Cldfb_ImagBuffer, hFdCngCom->numCoreBands, h_cldfb ); + } + } + + /*HF CLDFB - CNA and/or FD-CNG*/ + if ( fd_cng_flag ) + { + scale += 1.f; + } + if ( scale != 0 ) + { + scale *= CLDFB_SCALING * ( h_cldfb->scale * h_cldfb->scale * 8.f ); + ptr_level = hFdCngCom->cngNoiseLevel + hFdCngCom->stopFFTbin - hFdCngCom->startBand; + + for ( i = hFdCngCom->numCoreBands; i < hFdCngCom->regularStopBand; i++ ) + { + /* Real part in CLDFB band */ + rand_gauss( &Cldfb_RealBuffer[i], seed ); + Cldfb_RealBuffer[i] *= (float) sqrt( ( scale * *ptr_level ) * 0.5f ); + /* Imaginary part in CLDFB band */ + rand_gauss( &Cldfb_ImagBuffer[i], seed ); + Cldfb_ImagBuffer[i] *= (float) sqrt( ( scale * *ptr_level ) * 0.5f ); + + ptr_level++; + } + } + + pop_wmops(); + + return; +} + + +/*------------------------------------------------------------------- + * FdCngDecodeMDCTStereoSID() + * + * Decode FD-Cng parameters for CNG in MDCT-Stereo mode from the bitstream + * + *-------------------------------------------------------------------*/ + +void FdCngDecodeMDCTStereoSID( + CPE_DEC_HANDLE hCPE /* i/o: CPE decoder state structure */ +) +{ + DEC_CORE_HANDLE sts[CPE_CHANNELS]; + HANDLE_FD_CNG_COM hFdCngCom; + float *ms_ptr[CPE_CHANNELS]; + float *lr_ptr[CPE_CHANNELS]; + float logNoiseEst[CPE_CHANNELS][NPART]; + float gain[CPE_CHANNELS]; + int16_t indices[FD_CNG_stages_37bits]; + int16_t N, i, ch, p, stages; + int16_t is_out_ms; + float *invTrfMatrix; + float tmpRAM[FDCNG_VQ_MAX_LEN][FDCNG_VQ_DCT_MAXTRUNC]; + + + invTrfMatrix = (float *) tmpRAM; + create_IDCT_N_Matrix( invTrfMatrix, FDCNG_VQ_MAX_LEN, FDCNG_VQ_DCT_MAXTRUNC, sizeof( tmpRAM ) / ( sizeof( float ) ) ); + + is_out_ms = 0; + if ( hCPE->hCoreCoder[0]->cng_sba_flag ) + { + is_out_ms = 1; + } + + N = 0; /* to avoid compilation warning */ + + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + sts[ch] = hCPE->hCoreCoder[ch]; + ms_ptr[ch] = &logNoiseEst[ch][0]; + lr_ptr[ch] = &sts[ch]->hFdCngDec->hFdCngCom->sidNoiseEst[0]; + } + + /* decode noise shapes and gains */ + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + sts[ch] = hCPE->hCoreCoder[ch]; + hFdCngCom = ( sts[ch]->hFdCngDec )->hFdCngCom; + N = hFdCngCom->npart; + hFdCngCom->sid_frame_counter++; + + if ( ch ) + { + stages = FD_CNG_JOINT_stages_25bits; + } + else + { + stages = FD_CNG_stages_37bits; + } + + /* read bitstream */ + for ( i = 0; i < stages; i++ ) + { + indices[i] = get_next_indice( sts[ch], bits_37bits[i] ); + } + { + gain[ch] = ( (float) get_next_indice( sts[ch], 7 ) - GAIN_Q_OFFSET_IVAS ) / 1.5f; + } + + /* MSVQ decoder */ + msvq_dec( cdk_37bits_ivas, NULL, NULL, stages, N, FD_CNG_maxN_37bits, indices, 1, invTrfMatrix, ms_ptr[ch], NULL ); + } + + dtx_read_padding_bits( sts[1], ( IVAS_SID_5k2 - 4400 ) / FRAMES_PER_SEC ); + + if ( sts[0]->hFdCngDec->hFdCngCom->no_side_flag ) + { + set_zero( ms_ptr[1], NPART ); + } + + if ( is_out_ms == 0 ) + { + inverseMS( N, ms_ptr[0], ms_ptr[1], 1.f ); + } + + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + hFdCngCom = sts[ch]->hFdCngDec->hFdCngCom; + for ( p = 0; p < N; p++ ) + { + lr_ptr[ch][p] = powf( 10.f, ( ms_ptr[ch][p] + gain[ch] ) / 10.f ); + } + + scalebands( hFdCngCom->sidNoiseEst, hFdCngCom->part, hFdCngCom->npart, hFdCngCom->midband, hFdCngCom->nFFTpart, hFdCngCom->stopBand - hFdCngCom->startBand, hFdCngCom->cngNoiseLevel, 1 ); + + lpc_from_spectrum( hFdCngCom, hFdCngCom->startBand, hFdCngCom->stopFFTbin, sts[ch]->preemph_fac ); + } + + if ( hCPE->nchan_out == 1 && hCPE->last_element_brate <= IVAS_SID_5k2 ) + { + /* create proper M noise shape in channel zero after gains have been applied */ + for ( p = 0; p < N; p++ ) + { + sts[0]->hFdCngDec->hFdCngCom->sidNoiseEst[p] = 0.5f * ( sts[0]->hFdCngDec->hFdCngCom->sidNoiseEst[p] + sts[1]->hFdCngDec->hFdCngCom->sidNoiseEst[p] ); + } + } + + return; +} + + +/*------------------------------------------------------------------- + * FdCngDecodeDiracMDCTStereoSID() + * + * Decode FD-CNG parameters for CNG in 2TC DirAC mode from the bitstream + *-------------------------------------------------------------------*/ + +void FdCngDecodeDiracMDCTStereoSID( + CPE_DEC_HANDLE hCPE /* i/o: CPE decoder state structure */ +) +{ + DEC_CORE_HANDLE sts[CPE_CHANNELS]; + HANDLE_FD_CNG_COM hFdCngCom; + float *ms_ptr[CPE_CHANNELS]; + float *lr_ptr[CPE_CHANNELS]; + float logNoiseEst[CPE_CHANNELS][NPART]; + float gain[CPE_CHANNELS]; + int16_t indices[FD_CNG_stages_37bits]; + int16_t N, i, ch, p; + float *invTrfMatrix; + float tmpRAM[FDCNG_VQ_MAX_LEN][FDCNG_VQ_DCT_MAXTRUNC]; + + + invTrfMatrix = (float *) tmpRAM; /* dynamically filled */ + create_IDCT_N_Matrix( invTrfMatrix, FDCNG_VQ_MAX_LEN, FDCNG_VQ_DCT_MAXTRUNC, sizeof( tmpRAM ) / ( sizeof( float ) ) ); + + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + sts[ch] = hCPE->hCoreCoder[ch]; + ms_ptr[ch] = &logNoiseEst[ch][0]; + lr_ptr[ch] = &sts[ch]->hFdCngDec->hFdCngCom->sidNoiseEst[0]; + ( sts[ch]->hFdCngDec )->hFdCngCom->sid_frame_counter++; + } + + /* decode noise shapes and gains */ + hFdCngCom = ( sts[0]->hFdCngDec )->hFdCngCom; + N = hFdCngCom->npart; + + /* read bitstream */ + for ( i = 0; i < FD_CNG_stages_37bits; i++ ) + { + indices[i] = get_next_indice( sts[0], bits_37bits[i] ); + } + gain[0] = ( (float) get_next_indice( sts[0], 7 ) - GAIN_Q_OFFSET_IVAS ) / 1.5f; + gain[1] = gain[0]; + + /* MSVQ decoder */ + msvq_dec( cdk_37bits_ivas, NULL, NULL, FD_CNG_stages_37bits, N, FD_CNG_maxN_37bits, indices, 1, invTrfMatrix, ms_ptr[0], NULL ); + mvr2r( ms_ptr[0], ms_ptr[1], N ); + + /*inverseMS( N, ms_ptr[0], ms_ptr[1], 1.f );*/ + + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + hFdCngCom = sts[ch]->hFdCngDec->hFdCngCom; + for ( p = 0; p < N; p++ ) + { + lr_ptr[ch][p] = powf( 10.f, ( ms_ptr[ch][p] + gain[ch] ) / 10.f ); + } + + /* NB last band energy compensation */ + if ( hFdCngCom->CngBandwidth == NB ) + { + lr_ptr[ch][N - 1] *= NB_LAST_BAND_SCALE; + } + else if ( hFdCngCom->CngBandwidth == SWB && hFdCngCom->CngBitrate <= ACELP_13k20 ) + { + lr_ptr[ch][N - 1] *= SWB_13k2_LAST_BAND_SCALE; + } + + scalebands( hFdCngCom->sidNoiseEst, hFdCngCom->part, hFdCngCom->npart, hFdCngCom->midband, hFdCngCom->nFFTpart, hFdCngCom->stopBand - hFdCngCom->startBand, hFdCngCom->cngNoiseLevel, 1 ); + + lpc_from_spectrum( hFdCngCom, hFdCngCom->startBand, hFdCngCom->stopFFTbin, sts[ch]->preemph_fac ); + } + sts[0]->hFdCngDec->hFdCngCom->coherence = 0.0f; + sts[1]->hFdCngDec->hFdCngCom->coherence = 0.0f; + + if ( hCPE->nchan_out == 1 ) + { + /* create proper M noise shape in channel zero after gains have been applied */ + for ( p = 0; p < N; p++ ) + { + sts[0]->hFdCngDec->hFdCngCom->sidNoiseEst[p] = 0.5f * ( sts[0]->hFdCngDec->hFdCngCom->sidNoiseEst[p] + sts[1]->hFdCngDec->hFdCngCom->sidNoiseEst[p] ); + } + } + + return; +} diff --git a/lib_dec/gain_dec.c b/lib_dec/gain_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..2717abe0fd4945257e67bda8bdbafa9199ac9e92 --- /dev/null +++ b/lib_dec/gain_dec.c @@ -0,0 +1,696 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "wmc_auto.h" + +/*---------------------------------------------------------------------* + * Es_pred_dec() + * + * Decoding of scaled predicted innovation energy to be used in all subframes + *---------------------------------------------------------------------*/ + +void Es_pred_dec( + float *Es_pred, /* o : predicted scaled innovation energy */ + const int16_t enr_idx, /* i : indice */ + const int16_t nb_bits, /* i : number of bits */ + const int16_t no_ltp /* i : no LTP flag */ +) +{ + if ( !no_ltp ) + { + switch ( nb_bits ) + { + case 5: + *Es_pred = Es_pred_qua_5b[enr_idx]; + break; + case 4: + *Es_pred = Es_pred_qua_4b[enr_idx]; + break; + case 3: + *Es_pred = Es_pred_qua_3b[enr_idx]; + break; + default: + *Es_pred = Es_pred_qua_5b[enr_idx]; + break; + } + } + else + { + *Es_pred = Es_pred_qua_4b_no_ltp[enr_idx]; + } + + return; +} + + +/*--------------------------------------------------------------------------* + * lp_gain_updt() + * + * Update of LP pitch and code gains (FEC) + *-------------------------------------------------------------------------*/ + +void lp_gain_updt( + const int16_t i_subfr, /* i : subframe number */ + const float gain_pit, /* i : Decoded gain pitch */ + const float norm_gain_code, /* i : Normalised gain code */ + float *lp_gainp, /* i/o: LP-filtered pitch gain(FEC) */ + float *lp_gainc, /* i/o: LP-filtered code gain (FEC) */ + const int16_t L_frame /* i : length of the frame */ +) +{ + if ( L_frame == L_FRAME ) + { + if ( i_subfr == 0 ) + { + *lp_gainp = 0.1f * gain_pit; + *lp_gainc = 0.1f * norm_gain_code; + } + else if ( i_subfr == L_SUBFR ) + { + *lp_gainp += 0.2f * gain_pit; + *lp_gainc += 0.2f * norm_gain_code; + } + else if ( i_subfr == 2 * L_SUBFR ) + { + *lp_gainp += 0.3f * gain_pit; + *lp_gainc += 0.3f * norm_gain_code; + } + else /* i_subfr == 3*L_SUBFR */ + { + *lp_gainp += 0.4f * gain_pit; + *lp_gainc += 0.4f * norm_gain_code; + } + } + else + { + if ( i_subfr == 0 ) + { + *lp_gainp = ( 1.0f / 15.0f ) * gain_pit; + *lp_gainc = ( 1.0f / 15.0f ) * norm_gain_code; + } + else if ( i_subfr == L_SUBFR ) + { + *lp_gainp += ( 2.0f / 15.0f ) * gain_pit; + *lp_gainc += ( 2.0f / 15.0f ) * norm_gain_code; + } + else if ( i_subfr == 2 * L_SUBFR ) + { + *lp_gainp += ( 3.0f / 15.0f ) * gain_pit; + *lp_gainc += ( 3.0f / 15.0f ) * norm_gain_code; + } + else if ( i_subfr == 3 * L_SUBFR ) + { + *lp_gainp += ( 4.0f / 15.0f ) * gain_pit; + *lp_gainc += ( 4.0f / 15.0f ) * norm_gain_code; + } + else /* i_subfr == 4*L_SUBFR */ + { + *lp_gainp += ( 5.0f / 15.0f ) * gain_pit; + *lp_gainc += ( 5.0f / 15.0f ) * norm_gain_code; + } + } + + return; +} + + +/*---------------------------------------------------------------------* + * gain_dec_tc() + * + * Decoding of pitch and codebook gains and updating long term energies + *---------------------------------------------------------------------*/ + +void gain_dec_tc( + Decoder_State *st, /* i/o: decoder state structure */ + const int16_t i_subfr, /* i : subframe number */ + const float Es_pred, /* i : predicted scaled innov. energy */ + const float *code, /* i : algebraic code excitation */ + float *gain_pit, /* o : pitch gain */ + float *gain_code, /* o : Quantized codeebook gain */ + float *gain_inov, /* o : unscaled innovation gain */ + float *norm_gain_code /* o : norm. gain of the codebook excit. */ +) +{ + int16_t index, nBits; + float Ecode, gcode0; + float Ei; + + *gain_pit = 0; + + /*----------------------------------------------------------------* + * find number of bits for gain dequantization + *----------------------------------------------------------------*/ + + nBits = st->acelp_cfg.gains_mode[i_subfr / L_SUBFR]; + + /*-----------------------------------------------------------------* + * calculate the predicted gain code + *-----------------------------------------------------------------*/ + + Ecode = ( dotp( code, code, L_SUBFR ) + 0.01f ) / L_SUBFR; + *gain_inov = 1.0f / (float) sqrt( Ecode ); + Ei = 10 * (float) log10( Ecode ); + gcode0 = (float) pow( 10, 0.05 * ( Es_pred - Ei ) ); + + /*------------------------------------------------------------------------------------------* + * Select the gain quantization table and dequantize the gain + *------------------------------------------------------------------------------------------*/ + + index = get_next_indice( st, nBits ); + + if ( nBits > 3 ) + { + *gain_code = gain_dequant( index, G_CODE_MIN, G_CODE_MAX, nBits ); + } + else /* nBits == 3 */ + { + *gain_code = tbl_gain_code_tc[index]; + } + + /*-----------------------------------------------------------------* + * decode normalized codebook gain + *-----------------------------------------------------------------*/ + + *gain_code *= gcode0; + *norm_gain_code = *gain_code / *gain_inov; + + return; +} + +/*---------------------------------------------------------------------* + * gain_dec_amr_wb() + * + * Decoding of pitch and fixed codebook gains (used also in AMR-WB IO mode) + *---------------------------------------------------------------------*/ + +void gain_dec_amr_wb( + Decoder_State *st, /* i/o: decoder state structure */ + const int32_t core_brate, /* i : core bitrate */ + float *gain_pit, /* o : Quantized pitch gain */ + float *gain_code, /* o : Quantized codeebook gain */ + float *past_qua_en, /* i/o: gain quantization memory (4 words) */ + float *gain_inov, /* o : unscaled innovation gain */ + const float *code, /* i : algebraic code excitation */ + float *norm_gain_code /* o : norm. gain of the codebook excitation */ +) +{ + int16_t i, index; + int16_t nbits; + float gcode0, qua_en; + const float *t_qua_gain; + + *gain_inov = 1.0f / (float) sqrt( ( dotp( code, code, L_SUBFR ) + 0.01f ) / L_SUBFR ); + + /*-----------------------------------------------------------------* + * Select the gain quantization table + *-----------------------------------------------------------------*/ + + if ( core_brate < ACELP_12k65 ) + { + nbits = 6; + t_qua_gain = t_qua_gain6b; + } + else + { + nbits = 7; + t_qua_gain = t_qua_gain7b; + } + + /*-----------------------------------------------------------------* + * predicted code gain + *-----------------------------------------------------------------*/ + + /* start with predicting code energy in dB */ + gcode0 = MEAN_ENER; + for ( i = 0; i < GAIN_PRED_ORDER; i++ ) + { + gcode0 += pred_gain[i] * past_qua_en[i]; + } + gcode0 += (float) ( 20.0 * log10( *gain_inov ) ); + + /* convert from energy in dB to gain */ + gcode0 = (float) pow( 10.0, gcode0 / 20.0 ); + + /*-----------------------------------------------------------------* + * Decode pitch gain + *-----------------------------------------------------------------*/ + + index = get_next_indice( st, nbits ); + *gain_pit = t_qua_gain[index * 2]; + + /*-----------------------------------------------------------------* + * Decode code gain + *-----------------------------------------------------------------*/ + + qua_en = t_qua_gain[index * 2 + 1]; + *gain_code = qua_en * gcode0; + + /*-----------------------------------------------------------------* + * update table of past quantized energies + *-----------------------------------------------------------------*/ + + for ( i = GAIN_PRED_ORDER - 1; i > 0; i-- ) + { + past_qua_en[i] = past_qua_en[i - 1]; + } + past_qua_en[0] = (float) ( 20.0 * log10( qua_en ) ); + + /*-----------------------------------------------------------------* + * Normalized code gain + *-----------------------------------------------------------------*/ + + *norm_gain_code = *gain_code / *gain_inov; + + return; +} + +/*--------------------------------------------------------------------------* + * gain_dec_mless() + * + * Decoding of pitch and codebook gains without updating long term energies + *-------------------------------------------------------------------------*/ + +void gain_dec_mless( + Decoder_State *st, /* i/o: decoder state structure */ + const int16_t L_frame, /* i : length of the frame */ + const int16_t coder_type, /* i : coding type */ + const int16_t i_subfr, /* i : subframe number */ + const int16_t tc_subfr, /* i : TC subframe index */ + const float *code, /* i : algebraic code excitation */ + const float Es_pred, /* i : predicted scaled innov. energy */ + float *gain_pit, /* o : Quantized pitch gain */ + float *gain_code, /* o : Quantized codeebook gain */ + float *gain_inov, /* o : unscaled innovation gain */ + float *norm_gain_code /* o : norm. gain of the codebook excitation */ +) +{ + int16_t index, nBits; + float gcode0, Ei, Ecode; + const float *qua_table; + + /*-----------------------------------------------------------------* + * decode pitch gain + *-----------------------------------------------------------------*/ + + nBits = st->acelp_cfg.gains_mode[i_subfr / L_SUBFR]; + + if ( ( tc_subfr == 3 * L_SUBFR && i_subfr == 3 * L_SUBFR && L_frame == L_FRAME ) || + ( tc_subfr == 4 * L_SUBFR && i_subfr == 4 * L_SUBFR && L_frame == L_FRAME16k ) ) + { + /* decode pitch gain */ + index = get_next_indice( st, nBits >> 1 ); + Ei = ( G_PITCH_MAX_TC192 - G_PITCH_MIN_TC192 ) / ( ( 1 << ( nBits >> 1 ) ) - 1 ); /* set quantization step */ + *gain_pit = usdequant( index, G_PITCH_MIN_TC192, Ei ); + + /* calculate the predicted gain code */ + Ecode = ( dotp( code, code, L_SUBFR ) + 0.01f ) / L_SUBFR; + *gain_inov = 1.0f / (float) sqrt( Ecode ); + Ei = 10 * (float) log10( Ecode ); + gcode0 = (float) pow( 10, 0.05 * ( Es_pred - Ei ) ); + + /* decode normalized codebook gain */ + index = get_next_indice( st, ( nBits + 1 ) >> 1 ); + *gain_code = gain_dequant( index, G_CODE_MIN_TC192, G_CODE_MAX_TC192, ( nBits + 1 ) >> 1 ); + *gain_code *= gcode0; + } + else + { + switch ( nBits ) + { + case 7: + { + qua_table = gain_qua_mless_7b; + break; + } + case 6: + { + qua_table = gain_qua_mless_6b; + + if ( st->element_mode > EVS_MONO ) + { + qua_table = gain_qua_mless_6b_stereo; + } + + break; + } + case 5: + { + qua_table = gain_qua_mless_5b; + break; + } + default: + { + qua_table = gain_qua_mless_6b; + break; + } + } + + if ( coder_type == INACTIVE && nBits == 6 ) + { + nBits--; + } + + index = get_next_indice( st, nBits ); + + *gain_pit = qua_table[index * 2]; + Ecode = ( dotp( code, code, L_SUBFR ) + 0.01f ) / L_SUBFR; + *gain_inov = 1.0f / (float) sqrt( Ecode ); + Ei = 10 * (float) log10( Ecode ); + + /*-----------------------------------------------------------------* + * calculate the predicted gain code + *-----------------------------------------------------------------*/ + + gcode0 = (float) pow( 10, 0.05 * ( Es_pred - Ei ) ); + + /*-----------------------------------------------------------------* + * decode normalized codebook gain + *-----------------------------------------------------------------*/ + + *gain_code = qua_table[index * 2 + 1] * gcode0; + } + + *norm_gain_code = *gain_code / *gain_inov; + + return; +} + +/*--------------------------------------------------------------------------* + * gain_dec_lbr() + * + * Decoding of pitch and codebook gains in ACELP at 6.6 and 7.5 kbps + *-------------------------------------------------------------------------*/ + +void gain_dec_lbr( + Decoder_State *st, /* i/o: decoder state structure */ + const int16_t coder_type, /* i : coding type */ + const int16_t i_subfr, /* i : subframe index */ + const float *code, /* i : algebraic excitation */ + float *gain_pit, /* o : quantized pitch gain */ + float *gain_code, /* o : quantized codebook gain */ + float *gain_inov, /* o : gain of the innovation (used for normalization) */ + float *norm_gain_code, /* o : norm. gain of the codebook excitation */ + float gains_mem[], /* i/o: pitch gain and code gain from previous subframes */ + const int16_t L_subfr /* i : subframe length */ +) +{ + int16_t index, nBits, n_pred, ctype; + float gcode0, aux[10], Ecode; + const float *b, *cdbk = 0; + + Ecode = ( dotp( code, code, L_subfr ) + 0.01f ) / L_subfr; + *gain_inov = 1.0f / (float) sqrt( Ecode ); + + /*-----------------------------------------------------------------* + * select the codebook, size and number of bits + * set the gains searching range + *-----------------------------------------------------------------*/ + + nBits = st->acelp_cfg.gains_mode[i_subfr / L_subfr]; + + ctype = 2 * ( coder_type - 1 ); + + /*-----------------------------------------------------------------* + * calculate prediction of gcode + * search for the best codeword + *-----------------------------------------------------------------*/ + + if ( i_subfr == 0 ) + { + b = b_1sfr; + n_pred = 2; + + switch ( nBits ) + { + case 8: + { + cdbk = gp_gamma_1sfr_8b; + break; + } + case 7: + { + cdbk = gp_gamma_1sfr_7b; + break; + } + case 6: + { + cdbk = gp_gamma_1sfr_6b; + break; + } + } + + /* calculate predicted gain */ + aux[0] = 1.0f; + aux[1] = ctype; + gcode0 = (float) pow( 10, dotp( b, aux, n_pred ) - 0.5f * (float) log10( Ecode ) ); + + /* retrieve the codebook index and calculate both gains */ + index = get_next_indice( st, nBits ); + *gain_pit = cdbk[index * 2]; + *gain_code = cdbk[index * 2 + 1] * gcode0; + gains_mem[0] = *gain_code; + gains_mem[3] = *gain_pit; + } + else if ( i_subfr == L_SUBFR || L_subfr == 2 * L_SUBFR ) + { + b = b_2sfr; + n_pred = 4; + + switch ( nBits ) + { + case 7: + { + cdbk = gp_gamma_2sfr_7b; + break; + } + case 6: + { + cdbk = gp_gamma_2sfr_6b; + break; + } + } + + /* calculate predicted gain */ + aux[0] = 1.0f; + aux[1] = ctype; + aux[2] = (float) log10( gains_mem[0] ); + aux[3] = gains_mem[3]; + gcode0 = (float) pow( 10, dotp( b, aux, n_pred ) ); + + /* retrieve the codebook index and calculate both gains */ + index = get_next_indice( st, nBits ); + *gain_pit = cdbk[index * 2]; + *gain_code = cdbk[index * 2 + 1] * gcode0; + gains_mem[1] = *gain_code; + gains_mem[4] = *gain_pit; + } + else if ( i_subfr == 2 * L_SUBFR ) + { + b = b_3sfr; + n_pred = 6; + + switch ( nBits ) + { + case 7: + { + cdbk = gp_gamma_3sfr_7b; + break; + } + case 6: + { + cdbk = gp_gamma_3sfr_6b; + break; + } + } + + /* calculate predicted gain */ + aux[0] = 1.0f; + aux[1] = ctype; + aux[2] = (float) log10( gains_mem[0] ); + aux[3] = (float) log10( gains_mem[1] ); + aux[4] = gains_mem[3]; + aux[5] = gains_mem[4]; + gcode0 = (float) pow( 10, dotp( b, aux, n_pred ) ); + + /* retrieve the codebook index and calculate both gains */ + index = get_next_indice( st, nBits ); + *gain_pit = cdbk[index * 2]; + *gain_code = cdbk[index * 2 + 1] * gcode0; + + gains_mem[2] = *gain_code; + gains_mem[5] = *gain_pit; + } + else if ( i_subfr == 3 * L_SUBFR ) + { + b = b_4sfr; + n_pred = 8; + + switch ( nBits ) + { + case 7: + { + cdbk = gp_gamma_4sfr_7b; + break; + } + case 6: + { + cdbk = gp_gamma_4sfr_6b; + break; + } + } + + /* calculate predicted gain */ + aux[0] = 1.0f; + aux[1] = ctype; + aux[2] = (float) log10( gains_mem[0] ); + aux[3] = (float) log10( gains_mem[1] ); + aux[4] = (float) log10( gains_mem[2] ); + aux[5] = gains_mem[3]; + aux[6] = gains_mem[4]; + aux[7] = gains_mem[5]; + gcode0 = (float) pow( 10, dotp( b, aux, n_pred ) ); + + /* retrieve the codebook index and calculate both gains */ + index = get_next_indice( st, nBits ); + *gain_pit = cdbk[index * 2]; + *gain_code = cdbk[index * 2 + 1] * gcode0; + } + + *norm_gain_code = *gain_code / *gain_inov; + + return; +} + +/*--------------------------------------------------------------------------* + * gain_dec_SQ() + * + * Decoding of pitch and codebook gains using scalar quantizers + *-------------------------------------------------------------------------*/ + +void gain_dec_SQ( + Decoder_State *st, /* i/o: decoder state structure */ + const int16_t i_subfr, /* i : subframe number */ + const float *code, /* i : algebraic code excitation */ + const float Es_pred, /* i : predicted scaled innov. energy */ + float *gain_pit, /* o : Quantized pitch gain */ + float *gain_code, /* o : Quantized codeebook gain */ + float *gain_inov, /* o : unscaled innovation gain */ + float *norm_gain_code /* o : norm. gain of the codebook excitation */ +) +{ + int16_t index, nBits; + float gcode0, Ei, Ecode; + int16_t tmp16; + /*-----------------------------------------------------------------* + * get number of bits + *-----------------------------------------------------------------*/ + + nBits = st->acelp_cfg.gains_mode[i_subfr / L_SUBFR]; + + /*-----------------------------------------------------------------* + * decode pitch gain + *-----------------------------------------------------------------*/ + + index = get_next_indice( st, nBits >> 1 ); + /*Ei = (G_PITCH_MAX - G_PITCH_MIN) / ((1 << (nBits>>1)) - 1);*/ /* set quantization step */ + tmp16 = div_s( 1, ( ( 1 << ( nBits >> 1 ) ) - 1 ) ); /* Q15*/ + Ei = (float) mult_r( (int16_t) ( G_PITCH_MAX * 8192.0f + 0.5f ), tmp16 ) / 8192.0f; + + *gain_pit = usdequant( index, G_PITCH_MIN, Ei ); + + /*-----------------------------------------------------------------* + * calculate the predicted gain code + *-----------------------------------------------------------------*/ + + Ecode = ( dotp( code, code, L_SUBFR ) + 0.01f ) / L_SUBFR; + *gain_inov = 1.0f / (float) sqrt( Ecode ); + Ei = 10 * (float) log10( Ecode ); + gcode0 = (float) pow( 10, 0.05 * ( Es_pred - Ei ) ); + + /*-----------------------------------------------------------------* + * decode normalized codebook gain + *-----------------------------------------------------------------*/ + + index = get_next_indice( st, ( nBits + 1 ) >> 1 ); + *gain_code = gain_dequant( index, G_CODE_MIN, G_CODE_MAX, ( nBits + 1 ) >> 1 ); + *gain_code *= gcode0; + *norm_gain_code = *gain_code / *gain_inov; + + return; +} + + +/*-------------------------------------------------* + * gain_dec_gaus() + * + * Decoding of gains for Gaussian codebook + *-------------------------------------------------*/ + +/*! r: quantized codebook gain */ +float gain_dec_gaus( + const int16_t index, /* i : quantization index */ + const int16_t bits, /* i : number of bits to quantize */ + const float lowBound, /* i : lower bound of quantizer (dB) */ + const float topBound, /* i : upper bound of quantizer (dB) */ + const float gain_inov, /* i : unscaled innovation gain */ + float *norm_gain_code /* o : gain of normalized gaus. excit. */ +) +{ + float gain, enr, stepSize; + + /*-----------------------------------------------------------------* + * quantize linearly the log E + *-----------------------------------------------------------------*/ + + stepSize = ( topBound - lowBound ) / ( (float) ( 1 << bits ) ); + + /*-----------------------------------------------------------------* + * Gaussian codebook gain + *-----------------------------------------------------------------*/ + + enr = (float) index * stepSize + lowBound; /* quantized codebook gain in dB */ + gain = (float) pow( 10.0f, enr / 20.0f ); + + *norm_gain_code = gain / gain_inov; + + return gain; +} diff --git a/lib_dec/gaus_dec.c b/lib_dec/gaus_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..141812b3097d509ab0294795d39b6bb0bed6bf81 --- /dev/null +++ b/lib_dec/gaus_dec.c @@ -0,0 +1,265 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "wmc_auto.h" + +/*---------------------------------------------------------------------* + * Local function prototypes + *---------------------------------------------------------------------*/ + +static void gaus_dec2v( Decoder_State *st, float *code, const int16_t lg, const int16_t nb_bits ); + +static void dec_2pos( int16_t index, int16_t *ind1, int16_t *ind2, float *sign1, float *sign2, const int16_t n ); + + +/*---------------------------------------------------------------------* + * gaus_dec() + * + * no adaptive excitation constructed + * - decode the codebook indices, + * - find the excitation + *---------------------------------------------------------------------*/ + +void gaus_dec( + Decoder_State *st, /* i/o: decoder state structure */ + const int16_t i_subfr, /* i : subframe index */ + float *code, /* o : unvoiced excitation */ + float *norm_gain_code, /* o : gain of the normalized gaussian excitation*/ + float *lp_gainp, /* i/o: LP-filtered pitch gain (FEC) */ + float *lp_gainc, /* i/o: LP-filtered code gain (FEC) */ + float *gain_inov, /* o : unscaled innovation gain */ + float *tilt_code, /* o : synthesis excitation spectrum tilt */ + float *voice_fac, /* o : estimated voicing factor */ + float *gain_pit, /* o : pitch gain */ + float *pt_pitch, /* o : floating pitch buffer */ + float *exc, /* o : excitation signal frame */ + float *gain_code, /* o : gain of the gaussian excitation */ + float *exc2 /* o : Scaled excitation signal frame */ +) +{ + int16_t i, idx, nb_bits; + + /*----------------------------------------------------------------* + * Decode Gaussian excitation + *----------------------------------------------------------------*/ + + nb_bits = st->acelp_cfg.fixed_cdk_index[i_subfr / L_SUBFR]; + + gaus_dec2v( st, code, L_SUBFR, nb_bits >> 1 ); + + /*-----------------------------------------------------------------* + * Decode gain of Gaussian excitation and normalized Gaussian excitation + *-----------------------------------------------------------------*/ + + *gain_inov = 1.0f / (float) sqrt( ( dotp( code, code, L_SUBFR ) + 0.01f ) / L_SUBFR ); + + nb_bits = st->acelp_cfg.gains_mode[i_subfr / L_SUBFR]; + idx = get_next_indice( st, nb_bits ); + + /* safety check in case of bit errors */ + if ( idx > 78 && st->element_mode == EVS_MONO ) + { + idx = 78; + st->BER_detect = 1; + } + + *gain_code = gain_dec_gaus( idx, nb_bits, -30.0f, 190.0f, *gain_inov, norm_gain_code ); + + /* update LP filtered gains for the case of frame erasures */ + lp_gain_updt( i_subfr, 0.0f, *norm_gain_code, lp_gainp, lp_gainc, L_FRAME ); /* supposes that gain_dec_gaus() is used for ACELP@12k8 only */ + + /*-----------------------------------------------------------------* + * Updates + *-----------------------------------------------------------------*/ + + *tilt_code = 0.0f; + *voice_fac = -1.0f; /* only unvoiced */ + *gain_pit = 0.0f; /* needed for BASS postfitler */ + *pt_pitch = (float) L_SUBFR; /* floating pitch buffer */ + + /*-----------------------------------------------------------------* + * Construct scaled excitation + *-----------------------------------------------------------------*/ + + set_f( &exc2[i_subfr], 0, L_SUBFR ); + for ( i = 0; i < L_SUBFR; i++ ) + { + exc[i + i_subfr] = *gain_code * code[i]; + } + + return; +} + +/*-----------------------------------------------------* + * gaus_dec2v() + * + * decoder of Gaussian Codebook for unvoiced + * consisting of addition of 2 Gaussian vectors + * + * One Gaussian vector of 190 values + *-----------------------------------------------------*/ + +static void gaus_dec2v( + Decoder_State *st, /* i/o: decoder state structure */ + float *code, /* o : decoded gaussian codevector */ + const int16_t lg, /* i : codevector length */ + const int16_t nb_bits /* i : nb ob bits per track (max 6)*/ +) +{ + int16_t i, ind1, ind2, idx, index_delta; + int16_t nvec, step; + float sign1, sign2; + float *pt1, *pt2; + float gaus_dico2[190]; + float delta; + + nvec = 1 << nb_bits; + step = 0x80 >> nb_bits; + + idx = get_next_indice( st, 2 * nb_bits + 1 ); + index_delta = get_next_indice( st, 3 ); + + dec_2pos( idx, &ind1, &ind2, &sign1, &sign2, nvec ); + + delta = STEP_DELTA * (float) ( index_delta ); + if ( delta > 0.0f ) + { + gaus_dico2[0] = gaus_dico[0]; + for ( i = 1; i < 190; i++ ) + { + gaus_dico2[i] = ( gaus_dico[i] - delta * gaus_dico[i - 1] ) / ( 1 + delta * delta ); + } + } + else + { + for ( i = 0; i < 190; i++ ) + { + gaus_dico2[i] = gaus_dico[i]; + } + } + + pt1 = &gaus_dico2[ind1 * step]; + pt2 = &gaus_dico2[ind2 * step]; + + for ( i = 0; i < lg; i++ ) + { + code[i] = pt1[i] * sign1 + pt2[i] * sign2; + } + + return; +} + +/*-----------------------------------------------------* + * dec_2pos() + * + * Decode the codevectors positions and signs + *-----------------------------------------------------*/ + +static void dec_2pos( + int16_t index, /* i : quantization index */ + int16_t *ind1, /* o : 1st vector index */ + int16_t *ind2, /* o : 2nd vector index */ + float *sign1, /* o : 1st vector sign */ + float *sign2, /* o : 2nd vector sign */ + const int16_t n /* i : nb. of vectors in cb. */ +) +{ + int16_t i; + + i = index & 1; + if ( i == 0 ) + { + *sign1 = 1.0f; + } + else + { + *sign1 = -1.0f; + } + + index = index >> 1; + + *ind1 = index / n; + *ind2 = index - ( *ind1 * n ); + if ( *ind1 > *ind2 ) + { + *sign2 = -*sign1; + } + else + { + *sign2 = *sign1; + } + + return; +} + + +/*-----------------------------------------------------* + * gaus_L2_dec : + * + * decoder of Gaussian Codebook for unvoiced as Layer 2 + * + * One Gaussian vector + *-----------------------------------------------------*/ + +void gaus_L2_dec( + float *code, /* o : decoded gaussian codevector */ + float tilt_code, + const float *Aq, + float formant_enh_num, + int16_t *seed_acelp /* i/o: random seed */ +) +{ + int16_t i; + + /*Generate white gaussian noise using central limit theorem method (N only 4 as E_util_random is not purely uniform)*/ + for ( i = 0; i < L_SUBFR; i++ ) + { + code[i] = (float) ( own_random( seed_acelp ) ) / ( 1 << 15 ); + code[i] += (float) ( own_random( seed_acelp ) ) / ( 1 << 15 ); + code[i] += (float) ( own_random( seed_acelp ) ) / ( 1 << 15 ); + } + + /*Shape the gaussian excitation*/ + cb_shape( 1, 0, 0, 1, 0, formant_enh_num, FORMANT_SHARPENING_G2, Aq, code, tilt_code, 0, L_SUBFR ); + + return; +} diff --git a/lib_dec/gs_dec.c b/lib_dec/gs_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..ba9c574afdb3e1601033678cb6165a2226a4cc0f --- /dev/null +++ b/lib_dec/gs_dec.c @@ -0,0 +1,727 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include "options.h" +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "ivas_prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * decod_audio() + * + * Decode audio (AC) frames + *-------------------------------------------------------------------*/ + +void decod_audio( + Decoder_State *st, /* i/o: decoder static memory */ + float dct_epit[], /* o : GSC excitation in DCT domain */ + const float *Aq, /* i : LP filter coefficient */ + float *tmp_noise, /* o : long term temporary noise energy */ + float *pitch_buf, /* o : floating pitch values for each subframe */ + float *voice_factors, /* o : voicing factors */ + float *exc, /* i/o: adapt. excitation exc */ + float *exc2, /* i/o: adapt. excitation/total exc */ + float *bwe_exc, /* o : excitation for SWB TBE */ + float *lsf_new, /* i : ISFs at the end of the frame */ + float *gain_buf, /* o : floating pitch gain for each subframe */ + const int16_t tdm_lp_reuse_flag, /* i : LPC reuse flag */ + const int16_t tdm_low_rate_mode, /* i : secondary channel low rate mode flag */ + const int16_t tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag */ + const float tdm_Pri_pitch_buf[] /* i : primary channel pitch buffer */ +) +{ + int16_t tmp_nb_bits_tot, pit_band_idx; + GSC_DEC_HANDLE hGSCDec; + float code[4 * L_SUBFR]; + int16_t Diff_len, nb_subfr, i; + int16_t nb_frame_flg; + float Es_pred = 0.0f; + int16_t Len, max_len; + int16_t attack_flag; + float low_pit; + int16_t last_bin; + int16_t nbits; + float exc_wo_nf[L_FRAME16k]; + int16_t nb_bits; /* number of bits */ + int16_t indice; /* parameter indices to read */ + + hGSCDec = st->hGSCDec; + + /*---------------------------------------------------------------* + * Initialization + *---------------------------------------------------------------*/ + + Diff_len = 0; + + /* decode GSC attack flag (used to reduce possible pre-echo) */ + attack_flag = get_next_indice( st, 1 ); + + /* decode GSC SWB speech flag */ + if ( st->GSC_IVAS_mode >= 1 || ( st->coder_type != INACTIVE && ( ( st->element_mode == EVS_MONO && st->total_brate >= ACELP_13k20 ) || + ( st->element_mode > EVS_MONO && st->total_brate > MIN_BRATE_GSC_NOISY_FLAG && st->bwidth >= SWB && !st->flag_ACELP16k ) ) ) ) + { + st->GSC_noisy_speech = get_next_indice( st, 1 ); + } + + /* safety check in case of bit errors */ + if ( st->GSC_noisy_speech && st->bwidth < SWB && st->GSC_IVAS_mode == 0 ) + { + st->BER_detect = 1; + st->GSC_noisy_speech = 0; + } + + /* set bit-allocation */ + config_acelp1( DEC, st->total_brate, st->core_brate, st->core, st->extl_orig, st->extl_brate_orig, st->L_frame, st->GSC_noisy_speech, &( st->acelp_cfg ), st->next_bit_pos, st->coder_type, -1, 1, &nb_bits, NULL, st->element_mode, &nbits /*dummy*/, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); + + /*---------------------------------------------------------------* + * Decode energy dynamics + *---------------------------------------------------------------*/ + + if ( st->GSC_IVAS_mode >= 1 || ( st->GSC_noisy_speech == 1 && st->GSC_IVAS_mode == 0 ) ) + { + nb_subfr = NB_SUBFR; + hGSCDec->cor_strong_limit = 0; + hGSCDec->noise_lev = NOISE_LEVEL_SP3; + + if ( st->GSC_IVAS_mode >= 1 ) + { + if ( st->core_brate < GSC_L_RATE_STG && st->GSC_IVAS_mode < 3 ) + { + nb_subfr = 2; + } + hGSCDec->noise_lev = NOISE_LEVEL_SP2; + + if ( st->GSC_IVAS_mode == 3 ) /* Music like */ + { + hGSCDec->noise_lev = NOISE_LEVEL_SP0; + } + else if ( st->GSC_noisy_speech == 0 ) /* speech like but not noisy */ + { + hGSCDec->noise_lev = NOISE_LEVEL_SP3; + } + } + } + else + { + if ( st->core_brate <= ACELP_8k00 ) + { + hGSCDec->noise_lev = get_next_indice( st, 2 ) + NOISE_LEVEL_SP2; + } + else + { + hGSCDec->noise_lev = get_next_indice( st, 3 ) + NOISE_LEVEL_SP0; + } + + /*---------------------------------------------------------------* + * Decode number of subframes + *---------------------------------------------------------------*/ + + if ( st->L_frame == L_FRAME16k && ( st->core_brate <= ACELP_13k20 || st->coder_type == INACTIVE ) ) + { + hGSCDec->cor_strong_limit = 0; + nb_subfr = 1; + } + else + { + hGSCDec->cor_strong_limit = 1; + nb_subfr = SWNB_SUBFR; + if ( st->core_brate >= ACELP_9k60 ) + { + nbits = 1; + + if ( st->L_frame == L_FRAME16k && st->core_brate >= MIN_RATE_4SBFR ) + { + nbits = 2; + } + + nb_frame_flg = get_next_indice( st, nbits ); + + if ( ( nb_frame_flg & 0x1 ) == 0 ) + { + nb_subfr = 2 * SWNB_SUBFR; + hGSCDec->cor_strong_limit = 0; + } + else if ( st->L_frame == L_FRAME16k && st->core_brate >= MIN_RATE_4SBFR ) + { + nb_subfr = 2 * SWNB_SUBFR; /* cor_strong already set to 1 */ + } + + if ( ( nb_frame_flg >> 1 ) == 1 ) + { + nb_subfr *= 2; + } + } + } + } + + if ( st->L_frame == L_FRAME16k && nb_subfr == NB_SUBFR ) + { + nb_subfr = NB_SUBFR16k; + } + + /*---------------------------------------------------------------* + * Decode the last band where the adaptive (pitch) contribution is significant + *---------------------------------------------------------------*/ + + if ( st->core_brate < CFREQ_BITRATE ) + { + if ( st->core_brate < ACELP_9k60 && st->coder_type == INACTIVE ) + { + nbits = 1; + } + else + { + nbits = 3; + } + } + else + { + nbits = 4; + } + + if ( st->core_brate < ACELP_9k60 && st->coder_type != INACTIVE ) + { + pit_band_idx = 1; + } + else + { + pit_band_idx = get_next_indice( st, nbits ); + } + + if ( pit_band_idx != 0 ) + { + if ( st->core_brate < ACELP_9k60 ) + { + pit_band_idx = 7 + BAND1k2; /* At low rate, if pitch model is chosen, then for to be use on extented and constant frequency range */ + } + else + { + pit_band_idx += BAND1k2; + } + + /* detect bit errors in the bitstream */ + if ( pit_band_idx > 13 ) /* The maximum decodable index is 10 + BAND1k2 (3) = 13 */ + { + pit_band_idx = 13; + st->BER_detect = 1; + } + + Diff_len = (int16_t) ( mfreq_loc[pit_band_idx] / BIN_SIZE ); + } + + hGSCDec->Last_GSC_pit_band_idx = pit_band_idx; + + /*--------------------------------------------------------------------------------------* + * Decode adaptive (pitch) excitation contribution + * Reset unvaluable part of the adaptive (pitch) excitation contribution + *--------------------------------------------------------------------------------------*/ + + if ( pit_band_idx > BAND1k2 ) + { + /*---------------------------------------------------------------* + * Decode adaptive (pitch) excitation contribution + *---------------------------------------------------------------*/ + + if ( !( st->GSC_IVAS_mode > 0 && st->L_frame / nb_subfr == 2 * L_SUBFR && st->GSC_IVAS_mode < 3 ) && + ( ( st->core_brate >= MIN_RATE_FCB || st->GSC_noisy_speech ) && + ( ( nb_subfr == NB_SUBFR && st->L_frame == L_FRAME ) || ( nb_subfr == NB_SUBFR16k && st->L_frame == L_FRAME16k ) ) ) ) + { + if ( st->element_mode > EVS_MONO ) + { + nb_bits = 5; + } + else + { + nb_bits = Es_pred_bits_tbl[BIT_ALLOC_IDX( st->core_brate, GENERIC, -1, -1 )]; + } + + indice = get_next_indice( st, nb_bits ); + Es_pred_dec( &Es_pred, indice, nb_bits, 0 ); + } + + dec_pit_exc( st, st->L_frame, Aq, Es_pred, pitch_buf, code, exc, nb_subfr, gain_buf, tdm_Pitch_reuse_flag, tdm_Pri_pitch_buf ); + + if ( st->core_brate < ACELP_9k60 ) + { + minimum( pitch_buf, st->L_frame >> 6, &low_pit ); + + if ( low_pit < 64 ) + { + pit_band_idx = 9 + BAND1k2; + if ( st->bwidth == NB ) + { + pit_band_idx = 7 + BAND1k2; + } + } + else if ( low_pit < 128 ) + { + pit_band_idx = 5 + BAND1k2; + } + else + { + pit_band_idx = 3 + BAND1k2; + } + Diff_len = (int16_t) ( mfreq_loc[pit_band_idx] / BIN_SIZE ); + hGSCDec->Last_GSC_pit_band_idx = pit_band_idx; + } + + /*---------------------------------------------------------------* + * DCT transform + *---------------------------------------------------------------*/ + + edct( exc, dct_epit, st->L_frame, st->element_mode ); + + /*---------------------------------------------------------------* + * Reset unvaluable part of the adaptive (pitch) excitation contribution + *---------------------------------------------------------------*/ + + max_len = st->L_frame - Diff_len; + + if ( st->bwidth == NB ) + { + max_len = 160 - Diff_len; + } + + Len = 80; + if ( max_len < 80 ) + { + Len = max_len; + } + + if ( st->core_brate == ACELP_8k00 && st->bwidth != NB ) + { + for ( i = 0; i < max_len; i++ ) + { + dct_epit[i + Diff_len] = 0.0f; + } + } + else + { + for ( i = 0; i < Len; i++ ) + { + dct_epit[i + Diff_len] *= sm_table[i]; + } + for ( ; i < max_len; i++ ) + { + dct_epit[i + Diff_len] = 0.0f; + } + } + + st->bfi_pitch = (int16_t) ( mean( pitch_buf, nb_subfr ) + 0.5f ); + st->bfi_pitch_frame = st->L_frame; + Diff_len++; + st->bpf_off = 0; + } + else + { + /* No adaptive (pitch) excitation contribution */ + st->bpf_off = 1; + + set_f( dct_epit, 0.0f, st->L_frame ); + + if ( st->L_frame == L_FRAME16k ) + { + set_f( pitch_buf, (float) L_SUBFR16k, NB_SUBFR16k ); + } + else + { + set_f( pitch_buf, (float) L_SUBFR, NB_SUBFR ); + } + + set_f( gain_buf, 0.f, NB_SUBFR16k ); + + st->bfi_pitch = L_SUBFR; + st->bfi_pitch_frame = st->L_frame; + st->lp_gainp = 0.0f; + st->lp_gainc = 0.0f; + st->tilt_code = 0; + pit_band_idx = 0; + Diff_len = 0; + } + + /*--------------------------------------------------------------------------------------* + * GSC decoder + *--------------------------------------------------------------------------------------*/ + + /* find the current total number of bits used */ + tmp_nb_bits_tot = st->next_bit_pos; + + if ( st->extl_brate_orig > 0 ) + { + /* subtract 1 bit for TBE/BWE BWE flag (bit counted in extl_brate) */ + tmp_nb_bits_tot--; + } + + if ( st->coder_type == INACTIVE && st->core_brate <= ACELP_9k60 && st->idchan == 0 ) + { + tmp_nb_bits_tot += 5; /* for noisiness */ + } + + if ( st->idchan == 1 ) + { + tmp_nb_bits_tot += TDM_SIGNAL_BITS_READ_FROM_THE_END_OF_BS; + if ( st->tdm_LRTD_flag == 1 ) + { + tmp_nb_bits_tot -= STEREO_BITS_TCA; + } + } + + gsc_dec( st, dct_epit, pit_band_idx, Diff_len, tmp_nb_bits_tot, nb_subfr, st->coder_type, &last_bin, lsf_new, exc_wo_nf, tmp_noise ); + + /*--------------------------------------------------------------------------------------* + * iDCT transform + *--------------------------------------------------------------------------------------*/ + + edct( dct_epit, exc, st->L_frame, st->element_mode ); + + edct( exc_wo_nf, exc_wo_nf, st->L_frame, st->element_mode ); + + /*----------------------------------------------------------------------* + * Remove potential pre-echo in case an onset has been detected + *----------------------------------------------------------------------*/ + + pre_echo_att( &hGSCDec->Last_frame_ener, exc, attack_flag, st->last_coder_type, st->L_frame ); + + /*--------------------------------------------------------------------------------------* + * Update BWE excitation + *--------------------------------------------------------------------------------------*/ + + if ( st->hBWE_TD != NULL ) + { + if ( st->L_frame == L_FRAME16k ) + { + set_f( voice_factors, 0.0f, NB_SUBFR16k ); + interp_code_4over2( exc, bwe_exc, st->L_frame ); + } + else + { + set_f( voice_factors, 0.0f, NB_SUBFR16k ); + interp_code_5over2( exc, bwe_exc, L_FRAME ); + } + } + + /*--------------------------------------------------------------------------------------* + * Updates + *--------------------------------------------------------------------------------------*/ + + mvr2r( exc, exc2, st->L_frame ); + mvr2r( exc_wo_nf, exc, st->L_frame ); + + /*--------------------------------------------------------------------------------------* + * Channel aware mode parameters + *--------------------------------------------------------------------------------------*/ + + set_f( st->tilt_code_dec, 0, NB_SUBFR16k ); + + return; +} + + +/*-------------------------------------------------------------------* + * gsc_dec() + * + * Generic audio signal decoder + *-------------------------------------------------------------------*/ + +void gsc_dec( + Decoder_State *st, /* i/o: State structure */ + float exc_dct_in[], /* i/o: dct of pitch-only excitation / total excitation */ + const int16_t pit_band_idx, /* i : bin position of the cut-off frequency */ + const int16_t Diff_len, /* i : Lenght of the difference signal (before pure spectral)*/ + const int16_t bits_used, /* i : Number of bit used before frequency Q */ + const int16_t nb_subfr, /* i : Number of subframe considered */ + const int16_t coder_type, /* i : coding type */ + int16_t *last_bin, /* i : last bin of bit allocation */ + const float *lsf_new, /* i : ISFs at the end of the frame */ + float *exc_wo_nf, /* o : excitation (in f domain) without noisefill */ + float *tmp_noise /* o : long-term noise energy */ +) +{ + int16_t i, j, bit, nb_subbands, pvq_len; + GSC_DEC_HANDLE hGSCDec; + int16_t bitallocation_band[MBANDS_GN_BITALLOC16k]; + int16_t bitallocation_exc[2]; + float Ener_per_bd_iQ[MBANDS_GN16k]; + int16_t max_ener_band[MBANDS_GN_BITALLOC16k]; + float exc_diffQ[L_FRAME16k]; + int16_t bits_per_bands[MBANDS_GN_BITALLOC16k]; /*Q3*/ + float concat_out[L_FRAME16k]; + int16_t npulses[NB_SFM]; + int16_t maxpulse[NB_SFM]; + float mean_gain; + int16_t Mbands_gn = 16; + int16_t seed_init; + float max_eq, max_eq_val; + + hGSCDec = st->hGSCDec; + + /*--------------------------------------------------------------------------------------* + * Initialization + *--------------------------------------------------------------------------------------*/ + + bit = bits_used; + if ( coder_type == INACTIVE && ( st->tdm_LRTD_flag == 1 || st->element_mode == IVAS_SCE ) && st->core_brate <= GSC_LRES_GAINQ_LIMIT ) + { + bit += GSC_LRES_NB_NITS; + } + + if ( st->L_frame == L_FRAME16k ) + { + Mbands_gn = MBANDS_GN16k; + } + + set_f( exc_diffQ, 0.0f, st->L_frame ); + set_f( Ener_per_bd_iQ, 0.0f, Mbands_gn ); + + /*--------------------------------------------------------------------------------------* + * Gain decoding + *--------------------------------------------------------------------------------------*/ + + if ( st->bfi || st->BER_detect ) + { + /* copy old gain */ + mvr2r( hGSCDec->old_y_gain, Ener_per_bd_iQ, Mbands_gn ); + mean_gain = st->lp_gainc / 10.0f; + for ( i = 0; i < Mbands_gn; i++ ) + { + Ener_per_bd_iQ[i] += mean_gain; + } + + st->lp_gainc *= 0.98f; + } + else + { + i = 0; + while ( i < SIZE_BRATE_INTERMED_TBL ) + { + if ( st->core_brate <= brate_intermed_tbl[i] ) + { + break; + } + i++; + } + + if ( st->element_mode > EVS_MONO && coder_type == AUDIO && st->core_brate <= STEREO_GSC_BIT_RATE_ALLOC && brate_intermed_tbl[i] == ACELP_9k60 ) /* Bit allocation is mapped to 8 kb/s instead of 9.6 kb/s in this case */ + { + i--; + } + mean_gain = gsc_gaindec( st, Ener_per_bd_iQ, brate_intermed_tbl[i], hGSCDec->old_y_gain, coder_type, st->bwidth ); + + st->lp_gainc = 10.0f * mean_gain; + } + + *tmp_noise = st->lp_gainc; + + *last_bin = 0; + if ( st->core_brate == ACELP_8k00 && st->bwidth != NB ) + { + bitallocation_exc[0] = 0; + bitallocation_exc[1] = 0; + } + + set_s( bitallocation_band, 0, MBANDS_GN ); + + if ( st->bfi || st->BER_detect ) + { + max_eq = 1.0f; + + /*--------------------------------------------------------------------------------------* + * Copy old spectrum + * reduce spectral dynamic + * save spectrum + *--------------------------------------------------------------------------------------*/ + + if ( st->last_good == INACTIVE_CLAS || st->Last_GSC_noisy_speech_flag == 1 ) + { + for ( i = 0; i < st->L_frame; i++ ) + { + hGSCDec->Last_GSC_spectrum[i] = 0.8f * own_random( &hGSCDec->seed_tcx ) / PCM16_TO_FLT_FAC + 0.2f * hGSCDec->Last_GSC_spectrum[i]; + } + + mvr2r( hGSCDec->Last_GSC_spectrum, exc_diffQ, st->L_frame ); + } + + mvr2r( hGSCDec->Last_GSC_spectrum, exc_diffQ, st->L_frame ); + + for ( i = 0; i < st->L_frame; i++ ) + { + hGSCDec->Last_GSC_spectrum[i] *= 0.75f; + } + } + else + { + /*--------------------------------------------------------------------------------------* + * PVQ decoder + *--------------------------------------------------------------------------------------*/ + + bands_and_bit_alloc( hGSCDec->cor_strong_limit, hGSCDec->noise_lev, st->core_brate, Diff_len, bit, &bit, Ener_per_bd_iQ, max_ener_band, bits_per_bands, &nb_subbands, NULL, NULL, &pvq_len, coder_type, st->bwidth, st->GSC_noisy_speech, st->L_frame, st->element_mode, st->GSC_IVAS_mode ); + + set_s( npulses, 0, NB_SFM ); + + if ( bit == 0 ) + { + set_zero( concat_out, L_FRAME16k ); + } + else + { + pvq_core_dec( st, gsc_sfm_start, gsc_sfm_end, gsc_sfm_size, concat_out, bit, nb_subbands, bits_per_bands, NULL, npulses, maxpulse, ACELP_CORE ); + } + + max_eq = 0.0f; + max_eq_val = 1.0f; + + if ( ( ( st->core_brate < ACELP_7k20 && st->GSC_noisy_speech == 1 ) || st->core_brate < 6000 ) && coder_type <= UNVOICED ) + { + j = emaximum( concat_out, nb_subbands * 16, &max_eq ); + max_eq = (float) ( max_eq_val / ( fabs( concat_out[j] ) + 0.01f ) ); + max_eq = min( max_eq_val, max_eq ); + } + + seed_init = 0; + for ( j = 0; j < nb_subbands; j++ ) + { + mvr2r( concat_out + j * 16, exc_diffQ + max_ener_band[j] * 16, 16 ); + + if ( max_ener_band[j] > *last_bin ) + { + *last_bin = max_ener_band[j]; + } + + bitallocation_band[max_ener_band[j]] = 1; + + seed_init += npulses[j]; + } + + if ( st->last_coder_type != AUDIO /* First audio frame */ + && st->last_coder_type != UNVOICED ) /* last_coder_type == INACTIVE is overwritten in update_dec to UNVOICED */ + { + for ( j = 0; j < nb_subbands * 16; j++ ) + { + if ( concat_out[j] > 0 ) + { + seed_init = (int16_t) ( (int32_t) seed_init * 8 ); + } + if ( concat_out[j] < 0 ) + { + seed_init += 3; + } + } + + hGSCDec->seed_tcx = seed_init; + } + + if ( st->core_brate == ACELP_8k00 && st->bwidth != NB ) + { + if ( exc_diffQ[L_FRAME8k - 2] != 0 ) + { + bitallocation_exc[0] = 1; + } + + if ( exc_diffQ[L_FRAME8k - 1] != 0 ) + { + bitallocation_exc[1] = 1; + } + } + + mvr2r( exc_diffQ, hGSCDec->Last_GSC_spectrum, st->L_frame ); + + /*--------------------------------------------------------------------------------------* + * Skip adaptive (pitch) contribution frequency band (no noise added over the time contribution) + * Find x pulses between 1.6-3.2kHz to code in the spectrum of the residual signal + * Gain is based on the inter-correlation gain between the pulses found and residual signal + *--------------------------------------------------------------------------------------*/ + + if ( st->GSC_IVAS_mode >= 1 && st->GSC_noisy_speech == 1 ) + { + for ( i = 64; i < st->L_frame; i++ ) + { + exc_diffQ[i] *= max_eq; + } + } + else if ( ( ( st->core_brate < ACELP_7k20 && st->GSC_noisy_speech == 1 ) || st->core_brate < 6000 ) && coder_type <= UNVOICED ) + { + for ( i = 0; i < L_FRAME; i++ ) + { + exc_diffQ[i] *= max_eq; + } + } + else + { + freq_dnw_scaling( hGSCDec->cor_strong_limit, coder_type, hGSCDec->noise_lev, st->core_brate, exc_diffQ, st->L_frame ); + } + } + + /*--------------------------------------------------------------------------------------* + * Estimate noise level + *--------------------------------------------------------------------------------------*/ + + highband_exc_dct_in( st->core_brate, mfreq_bindiv_loc, *last_bin, Diff_len, hGSCDec->noise_lev, pit_band_idx, exc_diffQ, &hGSCDec->seed_tcx, Ener_per_bd_iQ, nb_subfr, exc_dct_in, st->last_coder_type, bitallocation_band, lsf_new, hGSCDec->last_exc_dct_in, &hGSCDec->last_ener, hGSCDec->last_bitallocation_band, bitallocation_exc, st->bfi, coder_type, st->bwidth, exc_wo_nf, st->GSC_noisy_speech, hGSCDec->lt_ener_per_band, st->L_frame, st->element_mode, st->GSC_IVAS_mode ); + + exc_dct_in[0] = 0; + + return; +} + +/*-------------------------------------------------------------------* + * GSC_dec_init() + * + * Initialize GSC decoder state structure + *-------------------------------------------------------------------*/ + +void GSC_dec_init( + GSC_DEC_HANDLE hGSCDec /* i/o: GSC data handle */ +) +{ + hGSCDec->seed_tcx = 15687; + hGSCDec->cor_strong_limit = 1; + set_f( hGSCDec->old_y_gain, 0, MBANDS_GN ); + hGSCDec->noise_lev = NOISE_LEVEL_SP0; + set_f( hGSCDec->Last_GSC_spectrum, 0.0f, L_FRAME16k ); + hGSCDec->Last_GSC_pit_band_idx = 0; + + set_f( hGSCDec->lt_ener_per_band, 1.0f, MBANDS_GN16k ); + set_f( hGSCDec->last_exc_dct_in, 0, L_FRAME16k ); + hGSCDec->last_ener = 0.0f; + set_s( hGSCDec->last_bitallocation_band, 0, 6 ); + + hGSCDec->Last_frame_ener = (float) MAX_32; + + return; +} diff --git a/lib_dec/gs_dec_amr_wb.c b/lib_dec/gs_dec_amr_wb.c new file mode 100644 index 0000000000000000000000000000000000000000..b0950b3500d28f7d63c66785a60d09c4396a30e9 --- /dev/null +++ b/lib_dec/gs_dec_amr_wb.c @@ -0,0 +1,430 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * Local constants + *-------------------------------------------------------------------*/ + +#define BAND3k 15 +#define BIN_1k2 48 +#define BAND_2k 12 +#define BAND_0k4 4 +#define ALP 0.7f +#define MALP ( 1.0f - ALP ) +#define ALPMY ( 0.86f ) +#define ALPY 1.5f + +#define CONTR_LIMIT 3012 /* Threshold to allow an increase in the contribution length */ + + +/*-------------------------------------------------------------------* + * NoiseFill() + * + * noise fill function for unvoiced/inactive frames (used only in AMR-WB IO mode) + *-------------------------------------------------------------------*/ + +static void NoiseFill( + float *exc_diffQ, /* i/o: Noise per band */ + int16_t *seed_tcx, /* i : Seed for noise */ + const int16_t Mbands_gn /* i : number of bands */ +) +{ + int16_t StartBin, NB_Qbins, i_band, k; + StartBin = 0; + NB_Qbins = 0; + + for ( i_band = 0; i_band < Mbands_gn; i_band++ ) + { + StartBin += NB_Qbins; + NB_Qbins = crit_bins[i_band]; + for ( k = StartBin; k < NB_Qbins + StartBin; k++ ) + { + exc_diffQ[k] += 0.75f * ( (float) own_random( seed_tcx ) / PCM16_TO_FLT_FAC ); + } + } + + return; +} + +/*-------------------------------------------------------------------* + * Ener_per_band() + * + * Computed the energy per band (used only in AMR-WB IO mode) + *-------------------------------------------------------------------*/ + +static void Ener_per_band( + const float exc_diff[], /* i : target signal */ + float y_gain4[] /* o : Energy per band to quantize */ +) +{ + float etmp; + const float *pt; + int16_t i, j; + + pt = exc_diff; + for ( j = 0; j < CRIT_NOIS_BAND; j++ ) + { + etmp = 0.01f; + for ( i = 0; i < crit_bins[j]; i++ ) + { + etmp += ( *pt * *pt ); + pt++; + } + etmp = max( etmp, .01f ); + y_gain4[j] = (float) sqrt( etmp ); + } + + return; +} + + +/*-------------------------------------------------------------------* + * Apply_gain() + * + * Rescaling of the modified excitation vector (used only in AMR-WB IO mode) + *-------------------------------------------------------------------*/ + +static void Apply_gain( + float exc_diffQ[], /* i/o: Quantized excitation */ + float Ener_per_bd_iQ[], /* o : Target ener per band */ + float Ener_per_bd_yQ[] /* o : Ener per band for norm vector */ +) +{ + int16_t i, i_band; + int16_t StartBin, NB_Qbins; + float y_gain; + + /*------------------------------------------------------------------ + * For all the bands + * Find the energy ratio between modified vector and original vector + *------------------------------------------------------------------*/ + + StartBin = 0; + NB_Qbins = 0; + for ( i_band = 0; i_band < CRIT_NOIS_BAND; i_band++ ) + { + StartBin += NB_Qbins; + NB_Qbins = crit_bins[i_band]; + y_gain = (float) ( Ener_per_bd_iQ[i_band] / Ener_per_bd_yQ[i_band] ); + + /*------------------------------------------------------------------ + * For bands below 400 Hz or for unvoiced/inactive frames + * only apply the energy ratio + *------------------------------------------------------------------*/ + + for ( i = StartBin; i < NB_Qbins + StartBin; i++ ) + { + exc_diffQ[i] *= y_gain; + } + } + + return; +} + +/*-------------------------------------------------------------------* + * normalize_spec() + * + * Spectrum normalization (zeroed of bins below a certain threshold) (used only in AMR-WB IO mode) + *-------------------------------------------------------------------*/ + +static void normalize_spec( + float fac_up, /* i : Core bitrate */ + float fy_norm[], /* i/o: Frequency quantized parameter */ + const int16_t L_frame /* i : Section length */ +) +{ + float max_val; + int16_t idx, j; + + idx = emaximum( fy_norm, L_frame, &max_val ); + + if ( fy_norm[idx] == 0 ) /* we can't use max(fy_norm[idx],1) because fy_norm[idx] can be negative */ + { + fy_norm[idx] = 1; + } + max_val = (float) fabs( fac_up / fy_norm[idx] ); + for ( j = 0; j < L_frame; j++ ) + { + fy_norm[j] *= max_val; + } + + return; +} + +/*-------------------------------------------------------------------* + * gs_dec_amr_wb() + * + * Modification of decoded excitation vector depending of the content type (used only in AMR-WB IO mode) + *-------------------------------------------------------------------*/ + +static void gs_dec_amr_wb( + const int32_t core_brate, /* i : bitrate allocated to the core */ + int16_t *seed_tcx, /* i/o: seed used for noise generation */ + const float dct_in[], /* i : cdt of residual signal */ + float dct_out[], /* i/o: dct of pitch only excitation */ + const float pitch[], /* i : pitch buffer */ + const float voice_fac, /* i : gain pitch */ + const int16_t clas, /* i : signal frame class */ + const int16_t coder_type, /* i : coder type */ + const int16_t VeryLowRateSTflag /* i : Enable the noise enhancement for very low rate stereo generic mode */ +) +{ + int16_t i, mDiff_len; + float exc_diffQ[L_FRAME16k]; + int16_t j; + float etmp14; + float ftmp, ftmp1; + float Ener_per_bd_iQ[CRIT_NOIS_BAND]; + float Ener_per_bd_yQ[CRIT_NOIS_BAND]; + + /*--------------------------------------------------------------------------------------* + * compute the energy per band for the decoded excitation (in frequency domain) + *--------------------------------------------------------------------------------------*/ + + Ener_per_band( dct_in, Ener_per_bd_iQ ); + + /*--------------------------------------------------------------------------------------* + * adjust quantization noise for the low level to compensate for the poor 6 bit gainQ + *--------------------------------------------------------------------------------------*/ + + if ( core_brate < ACELP_12k65 ) + { + ftmp = 0; + for ( i = 0; i < CRIT_NOIS_BAND; i++ ) + { + ftmp = max( Ener_per_bd_iQ[i], ftmp ); + } + + if ( ( coder_type == INACTIVE || clas == VOICED_TRANSITION ) && ftmp < 20.0f ) + { + for ( i = 0; i < CRIT_NOIS_BAND; i++ ) + { + Ener_per_bd_iQ[i] *= crit_bins_corr[i]; + } + } + } + + /*--------------------------------------------------------------------------------------* + * Find the length of the temporal contribution, with a minimum contribution of 1.2kHz + *--------------------------------------------------------------------------------------*/ + + minimum( pitch, NB_SUBFR, &etmp14 ); + etmp14 = 12800.0f / etmp14; + etmp14 *= 8.0f; + + if ( etmp14 <= CONTR_LIMIT && ( VeryLowRateSTflag || core_brate >= ACELP_12k65 ) ) + { + etmp14 *= 2; + } + + mDiff_len = (int16_t) ( etmp14 + 0.5f ); + etmp14 = PCM16_TO_FLT_FAC; + j = 0; + for ( i = 0; i < CRIT_NOIS_BAND; i++ ) + { + if ( fabs( crit_bands_loc[i] - mDiff_len ) < etmp14 ) + { + etmp14 = (float) fabs( crit_bands_loc[i] - mDiff_len ); + j += crit_bins[i]; + } + } + + mDiff_len = j; + + if ( mDiff_len < BIN_1k2 ) + { + mDiff_len = BIN_1k2; + } + + if ( ( VeryLowRateSTflag && ( clas == VOICED_CLAS || clas == AUDIO_CLAS ) ) ) /* Do not apply normalization on VOICED signal in case of stereo */ + { + mvr2r( dct_in, exc_diffQ, L_FRAME ); + + /* normalization of the spectrum and noise fill */ + normalize_spec( 1.0f, exc_diffQ + mDiff_len, L_FRAME - mDiff_len ); + } + else + { + mvr2r( dct_in, exc_diffQ, mDiff_len ); + set_f( exc_diffQ + mDiff_len, 0, L_FRAME - mDiff_len ); + + /* normalization of the spectrum and noise fill */ + normalize_spec( 4, exc_diffQ, mDiff_len ); + } + NoiseFill( exc_diffQ, seed_tcx, CRIT_NOIS_BAND ); + + + /*--------------------------------------------------------------------------------------* + * Recompute energy per band of the modified excitation vector (in frequency domain) + *--------------------------------------------------------------------------------------*/ + + Ener_per_band( exc_diffQ, Ener_per_bd_yQ ); + + /*--------------------------------------------------------------------------------------* + * Compute tilt factor and amplify HF accordingly + *--------------------------------------------------------------------------------------*/ + + ftmp = ( 0.5f * ( 1.0f - voice_fac ) ); /* 1=unvoiced, 0=voiced */ + + for ( i = 240; i < L_FRAME; i++ ) + { + ftmp1 = ftmp * ( 0.067f * i - 15.0f ); + ftmp1 = max( 1.0f, ftmp1 ); + exc_diffQ[i] *= ftmp1; + } + + /*--------------------------------------------------------------------------------------* + * Match the energy of the modified excitation vector to the decoded excitation + *--------------------------------------------------------------------------------------*/ + + Apply_gain( exc_diffQ, Ener_per_bd_iQ, Ener_per_bd_yQ ); + + /*--------------------------------------------------------------------------------------* + * Copy to the output vector + *--------------------------------------------------------------------------------------*/ + + mvr2r( exc_diffQ, dct_out, L_FRAME ); + + return; +} + +/*-------------------------------------------------------------------* + * improv_amr_wb_gs() + * + * Modify the decoded excitation to increase quality of + * unvoiced and audio signals (used only in AMR-WB IO mode) + *-------------------------------------------------------------------*/ + +void improv_amr_wb_gs( + const int16_t clas, /* i : signal frame class */ + const int16_t coder_type, /* i : coder type */ + const int32_t core_brate, /* i : bitrate allocated to the core */ + int16_t *seed_tcx, /* i/o: Seed used for noise generation */ + float *old_Aq, /* i/o: old LPC filter coefficient */ + float *mem_syn2, /* i/o: synthesis memory */ + const float lt_voice_fac, /* i/o: long term voice factor */ + const int16_t locattack, /* i : Flag for a detected attack */ + float *Aq, /* i/o: Decoded LP filter coefficient */ + float *exc2, /* i/o: Decoded complete excitation */ + float *mem_tmp, /* i/o: synthesis temporary memory */ + float *syn, /* i/o: Decoded synthesis to be updated */ + const float *pitch_buf, /* i : Decoded pitch buffer */ + const float Last_ener, /* i : Last energy */ + const int16_t rate_switching_reset, /* i : rate switching reset flag */ + const int16_t last_coder_type, /* i : Last coder_type */ + const int16_t VeryLowRateSTflag /* i : Enable the noise enhancement for very low rate stereo generic mode */ +) +{ + int16_t i; + float dct_exc_in[L_FRAME], dct_exc_out[L_FRAME]; + float Aq_orig[NB_SUBFR * ( M + 1 )], enr_LP_old, enr_LP_new; + + /*------------------------------------------------------------* + * Condition to enter the section on excitation modification + *------------------------------------------------------------*/ + + /* Enter the modification for all inactive frames and also for unvoiced frames if bitrate is below 8k85 */ + if ( VeryLowRateSTflag || + ( ( locattack == 0 && core_brate <= ACELP_12k65 ) && + ( ( core_brate < ACELP_8k85 && clas != AUDIO_CLAS && ( clas == UNVOICED_CLAS || clas == VOICED_TRANSITION ) ) || coder_type == INACTIVE ) ) ) + { + /*------------------------------------------------------------* + * two differents paths: + * unvoiced or inactive + * generic audio sound + * LP filter smoothing for inactive parts + *------------------------------------------------------------*/ + *seed_tcx = (int16_t) ( (int16_t) ( pitch_buf[0] * 64.0f ) * (int16_t) ( pitch_buf[3] * 64.0f ) ); + + if ( coder_type == INACTIVE && Last_ener > -3.0f && last_coder_type == UNVOICED && rate_switching_reset == 0 ) + { + mvr2r( Aq, Aq_orig, NB_SUBFR * ( M + 1 ) ); + + for ( i = 0; i < NB_SUBFR * ( M + 1 ); i++ ) + { + Aq[i] = ALP * old_Aq[i] + MALP * Aq[i]; + } + + /* check the smoothed LP filter stability */ + enr_LP_old = enr_1_Az( old_Aq, L_SUBFR ); + for ( i = 0; i < NB_SUBFR; i++ ) + { + enr_LP_new = enr_1_Az( Aq + i * ( M + 1 ), L_SUBFR ); + + if ( enr_LP_new > 128 * enr_LP_old ) + { + /* filter is unstable, do not modify the excitation */ + mvr2r( Aq_orig, Aq, NB_SUBFR * ( M + 1 ) ); + return; + } + + enr_LP_old = enr_LP_new; + } + } + + /*------------------------------------------------------------* + * Find frequency representation of the excitation + * Do the excitation modification according to the content + * Go back to time domain -> Overwrite excitation + *------------------------------------------------------------*/ + + edct( exc2, dct_exc_in, L_FRAME, EVS_MONO ); + + set_f( exc2, 0, L_FRAME ); + set_f( dct_exc_out, 0, L_FRAME ); + + gs_dec_amr_wb( core_brate, seed_tcx, dct_exc_in, dct_exc_out, pitch_buf, lt_voice_fac, clas, coder_type, VeryLowRateSTflag ); + + edct( dct_exc_out, exc2, L_FRAME, EVS_MONO ); + + /*------------------------------------------------------------* + * Redo core synthesis at 12k8 Hz with the modified excitation + *------------------------------------------------------------*/ + + mvr2r( mem_tmp, mem_syn2, M ); + syn_12k8( L_FRAME, Aq, exc2, syn, mem_syn2, 1 ); + } + + return; +} diff --git a/lib_dec/hdecnrm.c b/lib_dec/hdecnrm.c new file mode 100644 index 0000000000000000000000000000000000000000..21584099628abf66fc431b968715b5866e0873b9 --- /dev/null +++ b/lib_dec/hdecnrm.c @@ -0,0 +1,400 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "prot.h" +#include "rom_com.h" +#include "rom_dec.h" +#include "wmc_auto.h" + + +/*--------------------------------------------------------------------------*/ +/* Function decode_huff_context() */ +/* */ +/* Context based Huffman decoding for indices of quantized norms */ +/*--------------------------------------------------------------------------*/ + +/*! r: decoded index */ +static int16_t decode_huff_context( + Decoder_State *st, /* i/o: decoder state structure */ + const int16_t *hufftab, /* i : Huffman table */ + int16_t *rbits /* i/o: the number of read bits */ +) +{ + while ( *hufftab > 0 ) + { + *rbits += ( *hufftab & 0xf ); + hufftab += ( *hufftab >> 4 ) + get_next_indice( st, *hufftab & 0xf ); + } + + return ( -*hufftab ); +} + + +/*--------------------------------------------------------------------------*/ +/* Function hdecnrm() */ +/* */ +/* Huffman decoding for indices of quantized norms */ +/*--------------------------------------------------------------------------*/ + +void hdecnrm( + Decoder_State *st, /* i/o: decoder state structure */ + const int16_t N, /* i : number of norms */ + int16_t *index /* o : indices of quantized norms */ +) +{ + int16_t i, j, k, n, m; + int16_t temp; + int16_t *pidx; + + pidx = index; + + m = N - 1; + for ( i = 0; i < m; i++ ) + { + j = 0; + k = 0; + if ( get_next_indice_1( st ) ) + { + j = 1; + } + + if ( get_next_indice_1( st ) ) + { + k = 1; + } + n = j * 2 + k; + j = j * 4; + temp = 16 + n - j; + + if ( get_next_indice_1( st ) ) + { + temp = 12 + n + j; + + if ( get_next_indice_1( st ) ) + { + j = 0; + if ( get_next_indice_1( st ) ) + { + j = 1; + } + + temp = 8 + n; + + if ( j != 0 ) + { + temp += 12; + } + + if ( get_next_indice_1( st ) ) + { + temp = n; + + if ( get_next_indice_1( st ) ) + { + temp = n + 4; + } + + if ( j != 0 ) + { + temp += 24; + } + } + } + } + + *pidx++ = temp; + } + + return; +} + +/*-------------------------------------------------------------------------- + * huff_dec() + * + * Huffman decoding + *--------------------------------------------------------------------------*/ + +void huff_dec( + Decoder_State *st, /* i/o: decoder state structure */ + const int16_t N, /* i : Number of codewords to decode */ + const int16_t buffer_len, /* i : Number of bits to read */ + const int16_t num_lengths, /* i : Number of different huffman codeword lengths */ + const int16_t *thres, /* i : Threshold of first codeword of each length */ + const int16_t *offset, /* i : Offset for first codeword */ + const int16_t *huff_tab, /* i : Huffman table order by codeword lengths */ + int16_t *index /* o : Decoded index */ +) +{ + int16_t i, j, k; + uint16_t val; + int16_t last_bits = buffer_len; + + val = 0; + j = 0; + for ( i = 0; i < N; i++ ) + { + last_bits = buffer_len - j; + val <<= last_bits; + val &= ( 1 << buffer_len ) - 1; /* 0xFFF; */ + val |= get_next_indice( st, last_bits ); + + /* Find codeword length */ + j = num_lengths - 1; + while ( val < thres[j] ) + { + j--; + } + k = ( val - thres[j] ) >> j; + *index++ = huff_tab[offset[j] + k]; + } + + /* Put back unused bits */ + st->next_bit_pos -= j; + + return; +} + + +/*-------------------------------------------------------------------------- + * hdecnrm_context() + * + * Huffman decoding for indices of quantized norms + *--------------------------------------------------------------------------*/ + +void hdecnrm_context( + Decoder_State *st, /* i/o: decoder state structure */ + const int16_t N, /* i : number of norms */ + int16_t *index, /* o : indices of quantized norms */ + int16_t *n_length /* o : decoded stream length */ +) +{ + int16_t i, prevj; + + prevj = index[0] + OFFSET_NORM; + for ( i = 1; i < N; i++ ) + { + if ( prevj > HTH_NORM ) + { + /* above */ + index[i] = decode_huff_context( st, hntable, n_length ); + index[i] = 31 - index[i]; + } + else + { + if ( prevj < LTH_NORM ) + { + /* less */ + index[i] = decode_huff_context( st, hntable, n_length ); + } + else + { + /* equal */ + index[i] = decode_huff_context( st, hetable, n_length ); + } + } + prevj = index[i]; + } + + return; +} + + +/*-------------------------------------------------------------------------- + * hdecnrm_resize() + * + * + *--------------------------------------------------------------------------*/ + +void hdecnrm_resize( + Decoder_State *st, /* i/o: decoder state structure */ + const int16_t N, /* i : number of SFMs */ + int16_t *index /* o : norm quantization index vector */ +) +{ + int16_t i, j, k, m; + int16_t temp; + int16_t *pidx; + + pidx = index; + + m = N - 1; + for ( i = 0; i < m; i++ ) + { + j = 0; + k = 0; + + for ( j = 0; j < 11; j++ ) + { + if ( get_next_indice_1( st ) ) + { + k++; + } + else + { + break; + } + } + + if ( k == 11 ) + { + temp = 25; + } + else if ( k == 10 ) + { + temp = 5; + } + else if ( k == 9 ) + { + temp = 6; + } + else + { + if ( get_next_indice_1( st ) ) + { + temp = 16 + k; + } + else + { + temp = 15 - k; + } + } + + *pidx++ = temp; + } + + return; +} + + +/*-------------------------------------------------------------------------- + * hdecnrm_trans() + * + * Huffman decoding for indices of quantized norms + *--------------------------------------------------------------------------*/ + +void hdecnrm_tran( + Decoder_State *st, /* i/o: decoder state structure */ + const int16_t N, /* i : number of norms */ + int16_t *index /* o : indices of quantized norms */ +) +{ + int16_t i, j, k, n, m; + int16_t temp; + int16_t *pidx; + int16_t l; + + pidx = index; + + m = N - 1; + for ( i = 0; i < m; i++ ) + { + j = 0; + k = 0; + if ( get_next_indice_1( st ) ) + { + j = 1; + } + + if ( get_next_indice_1( st ) ) + { + k = 1; + } + + n = k * 2 + j; + l = k * 4; + if ( ( j == 0 && k == 0 ) || ( j == 1 && k == 0 ) || ( j == 1 && k == 1 ) ) + { + temp = 15 + l - n; + } + else + { + if ( get_next_indice_1( st ) ) + { + temp = 15 + n - l; + } + else + { + temp = 15 + l - n; + if ( get_next_indice_1( st ) ) + { + for ( k = 0; k < 3; ) + { + if ( get_next_indice_1( st ) ) + { + k++; + } + else + { + break; + } + } + + if ( k == 0 || k == 3 ) + { + temp -= 5; + if ( k == 3 ) + { + temp--; + } + } + else if ( k == 1 ) + { + temp++; + } + else + { + temp += 2; + if ( get_next_indice_1( st ) ) + { + temp++; + if ( get_next_indice_1( st ) ) + { + temp++; + } + } + } + } + } + } + + *pidx++ = temp; + } + + return; +} diff --git a/lib_dec/hf_synth.c b/lib_dec/hf_synth.c new file mode 100644 index 0000000000000000000000000000000000000000..5be0404f8dcadb003494a16c41609c3e61ad9fbd --- /dev/null +++ b/lib_dec/hf_synth.c @@ -0,0 +1,1171 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*---------------------------------------------------------------------* + * Local function prototypes + *---------------------------------------------------------------------*/ + +static void hp400_12k8( float signal[], const int16_t lg, float mem[] ); + +static void filt_6k_7k( float signal[], const int16_t lg, float mem[] ); + +static void hf_synthesis( ZERO_BWE_DEC_HANDLE hBWE_zero, const int32_t core_brate, const int16_t output_frame, const float Aq[], const float exc[], float synth[], float synth16k[] ); + +static void hf_synthesis_amr_wb( const int32_t core_brate, const int16_t output_subfr, const float Ap[], float exc16k[], float synth_out[], float *mem_syn_hf, float *delay_syn_hf, float *mem_hp_interp, float p_r, float hf_gain_i, float til, float voice_factors, const float exc[] ); + +static void envelope( AMRWB_IO_DEC_HANDLE hAmrwb_IO, const int32_t core_brate, const float Aq[], float Ap[], float *r, float tilt0, float tilt, float voice_factor ); + +static void AdaptiveStartBand( int16_t *start_band, const int32_t core_brate, const float *lsf, const float voicing_fac, const int16_t clas, int16_t *voicing_flag, int16_t *start_band_old, float *OptCrit_old ); + + +/*-------------------------------------------------------------------* + * hf_synth_init() + * + * hf synthesis filters initialization + * - initialization of 400 Hz high pass filter + * - initialization of band pass 6kHz to 7kHz FIR filter + *-------------------------------------------------------------------*/ + +void hf_synth_init( + ZERO_BWE_DEC_HANDLE hBWE_zero /* o : zero BWE decoder handle */ +) +{ + hBWE_zero->seed2 = RANDOM_INITSEED; + + set_f( hBWE_zero->mem_hp400, 0, 4 ); + set_f( hBWE_zero->mem_hf, 0, ( L_FIR - 1 ) ); + + set_f( hBWE_zero->mem_syn_hf, 0.0f, M ); + set_f( hBWE_zero->mem_hp_interp, 0, INTERP_3_1_MEM_LEN ); + set_f( hBWE_zero->delay_syn_hf, 0, NS2SA( 16000, DELAY_CLDFB_NS ) ); + + + return; +} + +/*-------------------------------------------------------------------* + * hf_synth_amr_wb_init() + * + * hf synthesis filters initialization + * - initialization of 1600 Hz low pass filter + * - initialization of band pass 6kHz to 8kHz FIR filter for noise and line resampled signals + *-------------------------------------------------------------------*/ + +void hf_synth_amr_wb_init( + AMRWB_IO_DEC_HANDLE hAmrwb_IO /* i/o: AMR-WB IO data handle */ +) +{ + hAmrwb_IO->prev_r = 0.0f; + hAmrwb_IO->fmerit_w_sm = 0.0f; + hAmrwb_IO->frame_count = 0; + hAmrwb_IO->ne_min = -30.0f; + hAmrwb_IO->fmerit_m_sm = 0.0f; + hAmrwb_IO->voice_fac_amr_wb_hf = 0.0f; + hAmrwb_IO->unvoicing = 0.0f; + hAmrwb_IO->unvoicing_sm = 1.0f; + hAmrwb_IO->unvoicing_flag = 0; + hAmrwb_IO->voicing_flag = 0; + hAmrwb_IO->start_band_old = 160; + hAmrwb_IO->OptCrit_old = 1.0f; + + return; +} + +/*-------------------------------------------------------------------* + * hf_synth_amr_wb_reset() + * + * reset of HF synthesis filters + * - needed in switching scenarios + *-------------------------------------------------------------------*/ + +void hf_synth_amr_wb_reset( + AMRWB_IO_DEC_HANDLE hAmrwb_IO, /* i/o: AMR-WB IO data handle */ + ZERO_BWE_DEC_HANDLE hBWE_zero /* o : zero BWE decoder handle */ +) +{ + int16_t i; + + for ( i = 0; i < L_FRAME16k; i++ ) + { + own_random( &( hBWE_zero->seed2 ) ); + } + + set_f( hBWE_zero->mem_syn_hf, 0.0f, M ); + set_f( hBWE_zero->delay_syn_hf, 0.0, NS2SA( 16000, DELAY_CLDFB_NS ) ); + set_f( hBWE_zero->mem_hp_interp, 0, INTERP_3_1_MEM_LEN ); + + hAmrwb_IO->prev_r = 0.0f; + hAmrwb_IO->fmerit_w_sm = 0.0f; + hAmrwb_IO->frame_count = 0; + hAmrwb_IO->ne_min = -30.0f; + hAmrwb_IO->fmerit_m_sm = 0.0f; + hAmrwb_IO->voice_fac_amr_wb_hf = 0.0f; + hAmrwb_IO->unvoicing = 0.0f; + hAmrwb_IO->unvoicing_sm = 1.0f; + hAmrwb_IO->unvoicing_flag = 0; + hAmrwb_IO->voicing_flag = 0; + hAmrwb_IO->start_band_old = 160; + hAmrwb_IO->OptCrit_old = 1.0f; + + return; +} + +/*-------------------------------------------------------------------* + * hf_synth_amr_wb() + * + * HF synthesis in AMR-WB IO + *-------------------------------------------------------------------*/ + +void hf_synth_amr_wb( + AMRWB_IO_DEC_HANDLE hAmrwb_IO, /* i/o: AMR-WB IO data handle */ + ZERO_BWE_DEC_HANDLE hBWE_zero, /* o : zero BWE decoder handle */ + const int32_t core_brate, /* i : core bitrate */ + const int16_t output_frame, /* i : output frame length */ + const float *Aq, /* i : quantized Az */ + const float *exc, /* i : excitation at 12.8 kHz */ + float *synth, /* i/o: synthesis signal at 12.8k */ + int16_t *amr_io_class, /* i : signal class (determined by FEC algorithm) */ + float *synth_out, /* i/o: output signal at output Fs */ + float fmerit, /* i : classify parameter from FEC */ + const int16_t *hf_gain, /* i : decoded HF gain */ + const float *voice_factors, /* i : voicing factors */ + const float pitch_buf[], /* i : pitch buffer */ + const float ng_ener_ST, /* i : Noise gate - short-term energy */ + const float *lsf_new /* i : ISF vector */ +) +{ + const float *p_Aq; + float *p_Ap; + int16_t i, j, i_subfr, output_subfr; + float Ap[( M16k + 1 ) * NB_SUBFR]; + float exc16k[L_FRAME16k], dct_exc[L_FRAME], dct_hb[L_FRAME16k]; + float ener, tmp, scale; + float alpha, beta, sub_gain[NB_SUBFR]; + int16_t core_type = 1; + float pitch_var_cur, voice_fac, fmerit_m, fmerit_w; + int16_t start_band; + float til[NB_SUBFR], til0[NB_SUBFR]; + float enr1, enr2; + float *pt1, *pt2; + float e_subfr1[NB_SUBFR], e_subfr2[NB_SUBFR], e_subfr3[NB_SUBFR]; + float HF_corr_gain[NB_SUBFR]; + float filt_weight[80]; + int16_t filt_weight_coeff; + float gamma; + float hb_ener, g, hb_tonal[80], tonal_ener, hb_amb[80], inv_g; + int16_t fb, fn, signum[80]; + + pt1 = (float *) synth + 1; + pt2 = (float *) synth; + for ( i = 0; i < NB_SUBFR; i++ ) + { + enr1 = 0.0f; + enr2 = 0.0f; + enr1 = dotp( pt2, pt2, L_SUBFR ); + enr2 = dotp( pt1, pt2, ( L_SUBFR - 1 ) ); + til[i] = enr2 / ( enr1 + 0.1f ); + til0[i] = til[i]; + pt1 += L_SUBFR; + pt2 += L_SUBFR; + } + + output_subfr = output_frame / NB_SUBFR; + + if ( *amr_io_class != 7 ) + { + core_type = 0; + } + + /* modify LF parameters for excitation weighting or sub-frame gains calculating */ + pitch_var_cur = (float) ( fabs( pitch_buf[0] - pitch_buf[1] ) + fabs( pitch_buf[1] - pitch_buf[2] ) + fabs( pitch_buf[2] - pitch_buf[3] ) ); + + if ( hAmrwb_IO->frame_count > FRAME_COUNT_HF_SYNTH && *amr_io_class == UNVOICED_CLAS ) + { + hAmrwb_IO->frame_count = 0; + hAmrwb_IO->ne_min = -30.0f; + } + else + { + if ( hAmrwb_IO->frame_count > 2 * FRAME_COUNT_HF_SYNTH ) + { + hAmrwb_IO->frame_count = 2 * FRAME_COUNT_HF_SYNTH; + } + else + { + ( hAmrwb_IO->frame_count )++; + } + + if ( ng_ener_ST < hAmrwb_IO->ne_min ) + { + hAmrwb_IO->ne_min = ng_ener_ST; + } + } + + voice_fac = 0.0f; + for ( i = 0; i < NB_SUBFR; i++ ) + { + voice_fac += voice_factors[i]; + } + voice_fac *= 0.25f; + + fmerit_w = fmerit > 0.35f ? 0.35f : ( fmerit < 0.15f ? 0.15f : fmerit ); + if ( core_type == 1 ) + { + fmerit_w *= 0.5f; + } + + fmerit_w *= ( 1.0f + voice_fac ); + hAmrwb_IO->fmerit_w_sm = 0.9f * ( hAmrwb_IO->fmerit_w_sm ) + 0.1f * fmerit_w; + fmerit_w = hAmrwb_IO->fmerit_w_sm; + + fmerit_m = ( 2.0f - ( fmerit < 0.5f ? 1.0f : fmerit ) ); + hAmrwb_IO->fmerit_m_sm = 0.5f * ( hAmrwb_IO->fmerit_m_sm ) + 0.5f * fmerit_m; + fmerit_m = hAmrwb_IO->fmerit_m_sm; + + for ( i = 0; i < NB_SUBFR; i++ ) + { + if ( pitch_var_cur < 10 && ( til[i] ) < 0 ) + { + til[i] = 0.2f; + } + + til[i] = ( 1.0f - ( til[i] ) ) < 0.8f ? 0.8f : ( 1.0f - ( til[i] ) ); + til[i] += ( 30.0f + hAmrwb_IO->ne_min ) * 0.007f; + til[i] *= fmerit_m; + } + + /* predict LPC coefficients and calculate sub-frame gains */ + p_Aq = Aq; + p_Ap = Ap; + for ( i = 0; i < NB_SUBFR; i++ ) + { + envelope( hAmrwb_IO, core_brate, p_Aq, p_Ap, &sub_gain[i], til0[i], til[i], voice_factors[i] ); + + p_Aq += ( M + 1 ); + p_Ap += ( M + 1 ); + } + + /* rate dependent adaptive start band */ + AdaptiveStartBand( &start_band, core_brate, lsf_new, voice_fac, *amr_io_class, &hAmrwb_IO->voicing_flag, &hAmrwb_IO->start_band_old, &hAmrwb_IO->OptCrit_old ); + + /* DCT transform of LF excitation */ + edct( exc, dct_exc, L_FRAME, EVS_MONO ); + + set_f( dct_hb, 0.0f, L_FRAME16k ); + + /* copy excitation from LF */ + for ( i = 200; i < 240; i++ ) + { + dct_hb[i] = dct_exc[i]; + } + + hb_ener = 0.01f; + for ( i = 240; i < L_FRAME16k; i++ ) + { + dct_hb[i] = dct_exc[i + start_band - 240]; + signum[i - 240] = 1; + if ( dct_hb[i] < 0 ) + { + signum[i - 240] = -1; + } + dct_hb[i] *= signum[i - 240]; + hb_ener += dct_hb[i] * dct_hb[i]; + } + + fmerit_w *= ( 1.1f - start_band * 0.00625f ); + alpha = (float) sqrt( fmerit_w ); + beta = 1.0f - fmerit_w; + gamma = max( 0.3f, min( 1.0f, ( 1.05f - alpha * 0.95f ) ) ); + tonal_ener = 0.01f; + for ( i = 0; i < 8; i++ ) + { + fb = 0; + fn = i + 8; + tmp = 0; + for ( j = 0; j < fn; j++ ) + { + tmp += dct_hb[j + 240]; + } + hb_amb[i] = tmp / fn; + hb_tonal[i] = dct_hb[i + 240] - hb_amb[i]; + if ( hb_tonal[i] > 0 ) + { + tonal_ener += hb_tonal[i] * hb_tonal[i]; + } + } + for ( ; i < L_SUBFR16k - 8; i++ ) + { + fb = i - 7; + tmp = 0; + for ( j = fb; j < fb + 15; j++ ) + { + tmp += dct_hb[j + 240]; + } + hb_amb[i] = tmp / 15; + hb_tonal[i] = dct_hb[i + 240] - hb_amb[i]; + if ( hb_tonal[i] > 0 ) + { + tonal_ener += hb_tonal[i] * hb_tonal[i]; + } + } + for ( ; i < L_SUBFR16k; i++ ) + { + fb = i - 7; + fn = L_SUBFR16k - i + 7; + tmp = 0; + for ( j = fb; j < L_SUBFR16k; j++ ) + { + tmp += dct_hb[j + 240]; + } + hb_amb[i] = tmp / fn; + hb_tonal[i] = dct_hb[i + 240] - hb_amb[i]; + if ( hb_tonal[i] > 0 ) + { + tonal_ener += hb_tonal[i] * hb_tonal[i]; + } + } + g = beta * ( hb_ener - tonal_ener ) / ( hb_ener - beta * tonal_ener ); + if ( g < 0.01f && g > -0.01f ) + { + inv_g = sign( g ) * 100; + } + else + { + inv_g = 1 / g; + } + ener = 0.01f; + for ( i = 0; i < L_SUBFR16k; i++ ) + { + if ( hb_tonal[i] > 0 ) + { + hb_tonal[i] *= g; + } + hb_amb[i] *= inv_g; + dct_hb[i + 240] = hb_tonal[i] + hb_amb[i]; + dct_hb[i + 240] *= signum[i]; + ener += dct_hb[i + 240] * dct_hb[i + 240]; + } + scale = (float) ( gamma * sqrt( hb_ener / ener ) ); + + if ( core_brate == ACELP_6k60 ) + { + filt_weight_coeff = 60; + } + else if ( core_brate == ACELP_8k85 ) + { + filt_weight_coeff = 40; + } + else + { + filt_weight_coeff = 20; + } + + for ( i = 0; i < filt_weight_coeff; i++ ) + { + filt_weight[i] = (float) ( -0.999 / ( filt_weight_coeff - 1 ) ) * i + 1.0f; + } + + for ( i = 240; i < L_FRAME16k; i++ ) + { + dct_hb[i] *= scale; + + if ( core_brate < ACELP_23k85 && i > 255 ) + { + dct_hb[i] *= 0.59525f; + } + + if ( i >= L_FRAME16k - filt_weight_coeff ) + { + dct_hb[i] *= filt_weight[i - L_FRAME16k + filt_weight_coeff]; + } + } + + for ( i = 200; i < 256; i++ ) + { + dct_hb[i] *= filt_hp[i - 200]; + + if ( core_brate < ACELP_23k85 ) + { + dct_hb[i] *= deem_tab[i - 200]; + } + } + + if ( core_brate == ACELP_23k85 ) + { + for ( i = 0; i < NB_SUBFR; i++ ) + { + HF_corr_gain[i] = 2 * HP_gain[hf_gain[i]]; + } + } + + /* inverse DCT transform of HF excitation */ + set_f( exc16k, 0.0f, L_FRAME16k ); + edct( dct_hb, exc16k, L_FRAME16k, EVS_MONO ); + + /* energy weighting in consecutive subframes */ + ener = sum2_f( exc, L_FRAME ) + 0.01f; + tmp = sum2_f( exc16k, L_FRAME16k ) + 0.01f; + + for ( i = 0; i < NB_SUBFR; i++ ) + { + e_subfr1[i] = sum2_f( &exc[i * L_SUBFR], L_SUBFR ) + 0.01f; + e_subfr2[i] = sum2_f( &exc16k[i * L_SUBFR16k], L_SUBFR16k ) + 0.01f; + e_subfr3[i] = ( e_subfr1[i] / ener ) * tmp; + + for ( j = i * L_SUBFR16k; j < ( i + 1 ) * L_SUBFR16k; j++ ) + { + exc16k[j] *= (float) sqrt( e_subfr3[i] / e_subfr2[i] ); + } + } + + p_Ap = Ap; + i = 0; + for ( i_subfr = 0; i_subfr < L_FRAME16k; i_subfr += L_SUBFR16k ) + { + /* synthesis of the HF signal */ + hf_synthesis_amr_wb( core_brate, output_subfr, p_Ap, &exc16k[i_subfr], &synth_out[i * output_subfr], hBWE_zero->mem_syn_hf, hBWE_zero->delay_syn_hf, hBWE_zero->mem_hp_interp, sub_gain[i], HF_corr_gain[i], til0[i], voice_factors[i], &exc[i * L_SUBFR] ); + + p_Ap += ( M + 1 ); + i++; + } + + return; +} + +/*-----------------------------------------------------------------------------------* + * hf_synthesis_amr_wb() + * + * HF noise synthesis + * - Generate HF noise between 6 and 8 kHz, mix it with signal obtained by linear resampling. + * - Set energy of high band + *-----------------------------------------------------------------------------------*/ + +static void hf_synthesis_amr_wb( + const int32_t core_brate, /* i : core bitrate */ + const int16_t output_subfr, /* i : output sub-frame length */ + const float Ap[], /* i : quantized Aq */ + float exc16k[], /* i : excitation at 12.8 kHz */ + float synth_out[], /* i/o: synthesis signal at output Fs */ + float *mem_syn_hf, /* i/o: HF synthesis memory */ + float *delay_syn_hf, /* i/o: HF synthesis memory */ + float *mem_hp_interp, /* i/o: interpol. memory */ + float p_r, /* i : sub-frame gain */ + float HF_corr_gain, /* i : HF gain index */ + float til0, + float voice_factors, + const float exc[] ) +{ + int16_t i; + float HF_syn[L_SUBFR16k], upsampled_HF_syn[L_FRAME48k / NB_SUBFR]; + float ener, tmp, scale, exc2385[L_SUBFR16k]; + + if ( core_brate == ACELP_23k85 ) + { + ener = ( sum2_f( exc, L_SUBFR ) + 0.01f ) / 5; + tmp = sum2_f( exc16k, L_SUBFR16k ) + 0.01f; + scale = (float) sqrt( ener / tmp ); + + for ( i = 0; i < L_SUBFR16k; i++ ) + { + exc2385[i] = exc16k[i] * scale * HF_corr_gain; + } + } + + for ( i = 0; i < L_SUBFR16k; i++ ) + { + exc16k[i] *= p_r; + } + + if ( core_brate == ACELP_23k85 ) + { + ener = ( sum2_f( exc16k, L_SUBFR16k ) + 0.01f ) * 0.3f; + tmp = sum2_f( exc2385, L_SUBFR16k ) + 0.01f; + scale = (float) sqrt( ener / tmp ); + + if ( scale > 1.0f || til0 < 0.0f ) + { + mvr2r( exc2385, exc16k, L_SUBFR16k ); + } + else + { + for ( i = 0; i < L_SUBFR16k; i++ ) + { + exc16k[i] = exc2385[i] * max( min( 1.0f, ( 1 - til0 ) * ( 1.6f - voice_factors ) ), scale ); + } + } + } + + syn_filt( Ap, M, exc16k, HF_syn, L_SUBFR16k, mem_syn_hf, 1 ); + + /*-----------------------------------------------------------------* + * Resample to output sampling rate + * Synchronize LB and HB components (delay componsation) + * Add synthesised high band to speech synthesis + *-----------------------------------------------------------------*/ + + /* compensate CLDFB resampling delay */ + delay_signal( HF_syn, L_SUBFR16k, delay_syn_hf, NS2SA( 16000, DELAY_CLDFB_NS ) ); + + /* interpolate the HF synthesis */ + if ( output_subfr == L_FRAME48k / NB_SUBFR ) /* 48kHz sampled output */ + { + interpolate_3_over_1_allpass( HF_syn, L_SUBFR16k, upsampled_HF_syn, mem_hp_interp ); + } + else if ( output_subfr == L_FRAME32k / NB_SUBFR ) /* 32kHz sampled output */ + { + Interpolate_allpass_steep( HF_syn, mem_hp_interp, L_SUBFR16k, upsampled_HF_syn ); + } + else /* 16kHz sampled output */ + { + mvr2r( HF_syn, upsampled_HF_syn, L_SUBFR16k ); + } + + v_add( synth_out, upsampled_HF_syn, synth_out, output_subfr ); + + return; +} + + +/*-----------------------------------------------------------------------------------* + * EnhanceClass() + * + * + *-----------------------------------------------------------------------------------*/ + +static int16_t EnhanceClass( + const float qq, + const float pp, + const float tilt0, /* i : spectrum tilt */ + const float tilt, /* i : spectrum tilt */ + const float voice_factor, /* i : voice factor */ + float *voice_fac, /* i/o: smoothed voiced parameter */ + float *unvoicing, /* i/o: unvoiced parameter */ + float *unvoicing_sm, /* i/o: smoothed unvoiced parameter */ + int16_t *unvoicing_flag /* i/o: unvoiced flag */ +) +{ + float unvoicing_tmp; + + /* Decide (*unvoicing_flag) to allow BWE enhancement when qq>pp */ + *voice_fac = 0.75f * ( *voice_fac ) + 0.25f * voice_factor; + unvoicing_tmp = ( ( 1.0f - tilt0 ) / 2.0f ) * ( 1 - *voice_fac ) * min( tilt / 1.5f, 1.0f ); + *unvoicing = 0.5f * ( *unvoicing ) + 0.5f * unvoicing_tmp; + + if ( *unvoicing_sm > *unvoicing ) + { + *unvoicing_sm = 0.9f * ( *unvoicing_sm ) + 0.1f * ( *unvoicing ); + } + else + { + *unvoicing_sm = 0.99f * ( *unvoicing_sm ) + 0.01f * ( *unvoicing ); + } + + if ( *unvoicing - *unvoicing_sm > 0.1f ) + { + *unvoicing_flag = 1; + } + + if ( *unvoicing - *unvoicing_sm < 0.05f ) + { + *unvoicing_flag = 0; + } + + return ( *unvoicing_flag && qq > pp ); +} + +/*-----------------------------------------------------------------------------------* + * envelope() + * + * + *-----------------------------------------------------------------------------------*/ + +static void envelope( + AMRWB_IO_DEC_HANDLE hAmrwb_IO, + const int32_t core_brate, /* i : core bitrate */ + const float Aq[], /* i : de-quant. LPC coefficents */ + float Ap[], /* o : extended LPC coefficents */ + float *sub_gain, /* o : sub-frame gain */ + float tilt0, /* i : spectrum tilt */ + float tilt, /* i : spectrum tilt */ + float voice_factor /* i : voice factor */ +) +{ + float px, py, rx, ry, pp, rr; + int16_t i, Unvoicing_flag; + float alpha; + float est_level1, est_level2, qx, qy, qq, env_level[3]; + float As[3], k1, k2; + + /* LPC envelope weighting */ + if ( core_brate == ACELP_6k60 ) + { + weight_a( Aq, Ap, 0.9f, M ); + } + else + { + weight_a( Aq, Ap, 0.6f, M ); + } + + /* LPC envelope level estimate */ + pp = 0.0f; + px = 0.0f; + py = 0.0f; + rr = 0.0f; + rx = 0.0f; + ry = 0.0f; + for ( i = 0; i < 17; i++ ) + { + px += Ap[i] * exp_tab_p[i]; + py += Ap[i] * exp_tab_p[33 - i]; + rx += Aq[i] * exp_tab_q[i]; + ry += Aq[i] * exp_tab_q[33 - i]; + } + + pp = 1.0f / ( (float) sqrt( px * px + py * py ) ); + rr = 1.0f / ( (float) sqrt( rx * rx + ry * ry ) ); + + for ( i = 0; i < 3; i++ ) + { + As[i] = Aq[i]; + } + + if ( As[2] == -1 ) + { + k2 = -0.6f; + k1 = 0.99f; + if ( As[1] < 0 ) + { + k1 = -k1; + } + } + else + { + k1 = As[1] / ( 1 + As[2] ); + k2 = As[2]; + if ( k2 > 0.6f ) + { + k2 = 0.6f; + } + if ( k2 < -0.6f ) + { + k2 = -0.6f; + } + if ( k1 > 0.99f ) + { + k1 = 0.99f; + } + if ( k1 < -0.99f ) + { + k1 = -0.99f; + } + } + + As[1] = ( 1 + k2 ) * k1; + As[2] = k2; + + qq = 0.0f; + qx = 0.0f; + qy = 0.0f; + for ( i = 0; i < 3; i++ ) + { + qx += As[i] * exp_tab_q[i]; + qy += As[i] * exp_tab_q[33 - i]; + } + + qq = 1.0f / ( (float) sqrt( qx * qx + qy * qy ) ); + + Unvoicing_flag = EnhanceClass( rr, pp, tilt0, tilt, voice_factor, &hAmrwb_IO->voice_fac_amr_wb_hf, &hAmrwb_IO->unvoicing, &hAmrwb_IO->unvoicing_sm, &hAmrwb_IO->unvoicing_flag ); + + alpha = 0.0f; + if ( Unvoicing_flag ) + { + if ( rr > ( hAmrwb_IO->prev_r ) ) + { + rr = 0.5f * rr + 0.5f * ( hAmrwb_IO->prev_r ); + } + + hAmrwb_IO->prev_r = rr; + rr *= min( 1.0f, tilt * ( 1.6f - voice_factor ) ); + qq *= max( 1.0f, tilt * ( 1.6f - voice_factor ) ); + rr = min( rr, qq ); + rr = max( rr, pp ); + } + else + { + if ( rr < 1.0f && ( hAmrwb_IO->prev_r ) < 1.0f ) + { + alpha = ( 1 - rr * rr ); + } + + rr = alpha * ( hAmrwb_IO->prev_r ) + ( 1 - alpha ) * rr; + hAmrwb_IO->prev_r = rr; + + est_level1 = qq * min( 1.0f, tilt * ( 1.6f - voice_factor ) ); + env_level[0] = pp; + env_level[1] = qq; + env_level[2] = rr; + v_sort( env_level, 0, 2 ); + rr = env_level[0]; + est_level2 = rr * ( 1.0f + (float) fabs( tilt - 1 ) * ( 1.6f - voice_factor ) ); + rr = min( est_level1, est_level2 ); + } + + *sub_gain = min( 5.0f, rr / pp ); + + return; +} + +/*---------------------------------------------------------------------* + * AdaptiveStartBand() + * + * adaptively select the start band of bandwidth extension + *---------------------------------------------------------------------*/ + +static void AdaptiveStartBand( + int16_t *start_band, /* o : start point of copied band */ + const int32_t core_brate, /* i : core bitrate */ + const float *lsf, /* i : lsf frequency */ + const float voicing_fac, /* i : voicing factors */ + const int16_t clas, /* i : signal class (determined by FEC algorithm)*/ + int16_t *voicing_flag, + int16_t *start_band_old, + float *OptCrit_old ) +{ + float lsf_diff[M], Crit, OptCrit = 1.0f, W; + int16_t i, pos, M2, voicing_flag_old; + int16_t tmp1, tmp2; + + /*voicing switching flag : to avoid switching start band frequently in VOICED or AUDIO area*/ + voicing_flag_old = *voicing_flag; + if ( voicing_fac > 0.4f || ( voicing_fac > 0.3f && clas >= VOICED_CLAS ) || clas == AUDIO_CLAS ) + { + *voicing_flag = 1; + } + + if ( voicing_fac < 0.2f && clas < VOICED_CLAS ) + { + *voicing_flag = 0; + } + + /* rate adaptive start band */ + *start_band = 160; + if ( core_brate < ACELP_23k05 ) + { + for ( i = 1; i < ( M - 1 ); i++ ) + { + lsf_diff[i] = lsf[i] - lsf[i - 1]; + } + + W = SQR( 1.0f * core_brate / ACELP_19k85 ) / 6000.0f; + + if ( clas == AUDIO_CLAS ) + { + W *= 0.75f; + } + + pos = 2; + M2 = M - 2; + if ( *voicing_flag == 1 ) + { + if ( core_brate <= ACELP_8k85 ) + { + M2 = M - 8; + } + else if ( core_brate <= ACELP_12k65 ) + { + M2 = M - 6; + } + else if ( core_brate <= ACELP_15k85 ) + { + M2 = M - 4; + } + } + + for ( i = 2; i < M2; i++ ) + { + Crit = lsf_diff[i] * max( 1.0f - lsf[i] * W, 0.001f ); + if ( Crit <= OptCrit || i == 2 ) + { + OptCrit = Crit; + pos = i; + } + } + /* *start_band = (int16_t)( (0.5f*(lsf[pos]+lsf[pos-1])*40/1000.0f - 40) + 0.5f ); */ + /* emulate BASOP precision: */ + tmp1 = (int16_t) ( ( 0.02f * lsf[pos] ) + 0.5f ); + tmp2 = (int16_t) ( ( 0.02f * lsf[pos - 1] ) + 0.5f ); + *start_band = tmp1 + tmp2 - 40; + *start_band = min( max( *start_band, 40 ), 160 ); + + if ( voicing_flag_old != *voicing_flag || ( *voicing_flag == 0 && OptCrit < *OptCrit_old ) || + ( OptCrit < 0.7f * ( *OptCrit_old ) && *OptCrit_old > 64 ) ) + { + *OptCrit_old = OptCrit; + if ( abs( ( *start_band ) - ( *start_band_old ) ) < 20 && *voicing_flag == 1 && voicing_flag_old == 1 ) + { + *start_band = *start_band_old; + } + } + else + { + if ( OptCrit < ( *OptCrit_old ) && ( *voicing_flag ) == 1 ) + { + *OptCrit_old = OptCrit; + } + + *start_band = *start_band_old; + } + + if ( clas == AUDIO_CLAS ) + { + *start_band = min( *start_band, 120 ); + } + + if ( *start_band % 2 != 0 ) + { + *start_band -= 1; + } + } + + *start_band_old = *start_band; + + return; +} + + +/*-------------------------------------------------------------------* + * hf_synth_reset() + * + * Reset of HF synthesis filters (needed in switching scenarios) + *-------------------------------------------------------------------*/ + +void hf_synth_reset( + ZERO_BWE_DEC_HANDLE hBWE_zero /* o : zero BWE decoder handle */ +) +{ + int16_t i; + + for ( i = 0; i < L_FRAME16k; i++ ) + { + own_random( &( hBWE_zero->seed2 ) ); + } + + set_f( hBWE_zero->mem_hf, 0.0f, ( L_FIR - 1 ) ); + set_f( hBWE_zero->mem_syn_hf, 0.0f, M ); + set_f( hBWE_zero->mem_hp400, 0.0f, 4 ); + set_f( hBWE_zero->delay_syn_hf, 0.0f, NS2SA( 16000, DELAY_CLDFB_NS ) ); + set_f( hBWE_zero->mem_hp_interp, 0, INTERP_3_1_MEM_LEN ); + + return; +} + + +/*---------------------------------------------------------------------* + * hf_synth() + * + * High frequency regeneration + *---------------------------------------------------------------------*/ + +void hf_synth( + ZERO_BWE_DEC_HANDLE hBWE_zero, /* o : zero BWE decoder handle */ + const int32_t core_brate, /* i : core bitrate */ + const int16_t output_frame, /* i : output frame length */ + const float *Aq, /* i : quantized Az */ + const float *exc, /* i : excitation at 12.8 kHz */ + float *synth, /* i/o: 12.8kHz synthesis signal */ + float *synth16k /* i/o: 16kHz synthesis signal */ +) +{ + const float *p_Aq; + int16_t i_subfr, output_subfr; + + output_subfr = output_frame / NB_SUBFR; + + p_Aq = Aq; + for ( i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR ) + { + hf_synthesis( hBWE_zero, core_brate, output_subfr, p_Aq, &exc[i_subfr], &synth[i_subfr], &synth16k[i_subfr * output_subfr / L_SUBFR] ); + p_Aq += ( M + 1 ); + } + + return; +} + + +/*-----------------------------------------------------------------------------------* + * hf_synthesis() + * + * HF noise synthesis + * - Generate HF noise between 6 and 7 kHz. + * - Set energy of noise according to synthesis tilt. + * tilt > 0.8 ==> - 14 dB (voiced) + * tilt 0.5 ==> - 6 dB (voiced or noise) + * tilt < 0.0 ==> 0 dB (noise) + *-----------------------------------------------------------------------------------*/ + +static void hf_synthesis( + ZERO_BWE_DEC_HANDLE hBWE_zero, /* o : zero BWE decoder handle */ + const int32_t core_brate, /* i : core bitrate */ + const int16_t output_subfr, /* i : output sub-frame length */ + const float Aq[], /* i : quantized Aq */ + const float exc[], /* i : excitation at 12.8 kHz */ + float synth[], /* i/o: 12.8kHz synthesis signal */ + float synth16k[] /* i/o: 16kHz synthesis signal */ +) +{ + int16_t i; + float tmp, ener, fac, scale; + float HF_exc[L_SUBFR16k], HF_syn[L_SUBFR16k], upsampled_HF_syn[L_FRAME48k / NB_SUBFR]; + float Ap[M16k + 1]; + + /*-----------------------------------------------------------------* + * generate white noise vector + *-----------------------------------------------------------------*/ + + for ( i = 0; i < L_SUBFR16k; i++ ) + { + HF_exc[i] = (float) own_random( &( hBWE_zero->seed2 ) ); + } + + /*-----------------------------------------------------------------* + * calculate energy scaling factor so that white noise would have the + * same energy as exc12k8 + * note: the scaling factor should be multiplied by L_SUBFR16k / L_SUBFR for + * correctness but it will have only negligible impact so it has been left like this + *-----------------------------------------------------------------*/ + + ener = sum2_f( exc, L_SUBFR ) + 0.01f; + tmp = sum2_f( HF_exc, L_SUBFR16k ) + 0.01f; + scale = (float) ( sqrt( ener / tmp ) ); + + /*-----------------------------------------------------------------* + * calculate energy scaling factor to respect tilt of synth12k8 + * (tilt: 1=voiced, -1=unvoiced) + *-----------------------------------------------------------------*/ + + hp400_12k8( synth, L_SUBFR, hBWE_zero->mem_hp400 ); + + ener = 0.001f; + tmp = 0.001f; + + for ( i = 1; i < L_SUBFR; i++ ) + { + ener += synth[i] * synth[i]; + tmp += synth[i] * synth[i - 1]; + } + + fac = tmp / ener; + fac = (float) ( 1.0f - fac ); + + if ( core_brate == SID_2k40 || core_brate == FRAME_NO_DATA ) + { + /* emphasize HF noise in CNG */ + fac *= 2.0f; + } + + if ( fac < 0.1f ) + { + fac = 0.1f; + } + + if ( fac > 1.0f ) + { + fac = 1.0f; + } + + scale *= fac; + /*-----------------------------------------------------------------* + * modify HF excitation according to both calculated scaling factors + *-----------------------------------------------------------------*/ + + for ( i = 0; i < L_SUBFR16k; i++ ) + { + HF_exc[i] *= scale; + } + + /*-----------------------------------------------------------------* + * high pass filtering (0.94ms of delay) + *-----------------------------------------------------------------*/ + + filt_6k_7k( HF_exc, L_SUBFR16k, hBWE_zero->mem_hf ); + + /*-----------------------------------------------------------------* + * synthesis of noise: 4.8kHz..5.6kHz --> 6kHz..7kHz + *-----------------------------------------------------------------*/ + + weight_a( Aq, Ap, 0.6f, M ); + syn_filt( Ap, M, HF_exc, HF_syn, L_SUBFR16k, hBWE_zero->mem_syn_hf, 1 ); + + /*-----------------------------------------------------------------* + * Add filtered HF noise to speech synthesis + *-----------------------------------------------------------------*/ + + /* delay by 5 samples @16kHz to compensate CLDFB resampling delay (20samples) and HP filtering delay (roughly 15 samples) */ + delay_signal( HF_syn, L_SUBFR16k, hBWE_zero->delay_syn_hf, NS2SA( 16000, DELAY_CLDFB_NS ) - 15 ); + + /* interpolate the HF synthesis */ + if ( output_subfr == L_FRAME48k / NB_SUBFR ) /* 48kHz sampled output */ + { + interpolate_3_over_1_allpass( HF_syn, L_SUBFR16k, upsampled_HF_syn, hBWE_zero->mem_hp_interp ); + } + else if ( output_subfr == L_FRAME32k / NB_SUBFR ) /* 32kHz sampled output */ + { + Interpolate_allpass_steep( HF_syn, hBWE_zero->mem_hp_interp, L_SUBFR16k, upsampled_HF_syn ); + } + else /* 16kHz sampled output */ + { + mvr2r( HF_syn, upsampled_HF_syn, L_SUBFR16k ); + } + + v_add( synth16k, upsampled_HF_syn, synth16k, output_subfr ); + + return; +} + + +/*-----------------------------------------------------------------------* + * hp400_12k8() + * + * 2nd order Cheb2 high pass filter with cut off frequency at 400 Hz. + * Optimized for fixed-point to get the following frequency response: + * + * frequency : 0Hz 100Hz 200Hz 300Hz 400Hz 630Hz 1.5kHz 3kHz + * dB loss : -infdB -30dB -20dB -10dB -3dB +6dB +1dB 0dB + * + * Algorithm : + * + * y[i] = b[0]*x[i] + b[1]*x[i-1] + b[2]*x[i-2] + * + a[1]*y[i-1] + a[2]*y[i-2]; + * + * short b[3] = {3660, -7320, 3660}; in Q12 + * short a[3] = {4096, 7320, -3540}; in Q12 + * + * float b[3] = {0.893554687, -1.787109375, 0.893554687}; + * float a[3] = {1.000000000, 1.787109375, -0.864257812}; + *-----------------------------------------------------------------------*/ + +static void hp400_12k8( + float signal[], /* i/o: signal */ + const int16_t lg, /* i : length of signal */ + float mem[] /* i/o: filter memory [4] */ +) +{ + int16_t i; + float x0, x1, x2; + float yy0, yy1, y2; + + + yy1 = mem[0]; + y2 = mem[1]; + x0 = mem[2]; + x1 = mem[3]; + + for ( i = 0; i < lg; i++ ) + { + x2 = x1; + x1 = x0; + x0 = signal[i]; + yy0 = yy1 * a_hp400[1] + y2 * a_hp400[2] + x0 * b_hp400[0] + x1 * b_hp400[1] + x2 * b_hp400[2]; + + signal[i] = yy0; + y2 = yy1; + yy1 = yy0; + } + + mem[0] = yy1; + mem[1] = y2; + mem[2] = x0; + mem[3] = x1; + + return; +} + +/*-------------------------------------------------------------------* + * filt_6k_7k() + * + * 15th order band pass 6kHz to 7kHz FIR filter + * + * frequency :4kHz 5kHz 5.5kHz 6kHz 6.5kHz 7kHz 7.5kHz 8kHz + * dB loss : -60dB -45dB -13dB -3dB 0dB -3dB -13dB -45dB + * (gain = 4.0) + *-------------------------------------------------------------------*/ + +static void filt_6k_7k( + float signal[], /* i/o: signal */ + const int16_t lg, /* i : signal length */ + float mem[] /* i/o: filter memory */ +) +{ + int16_t i, j; + float s, x[L_FRAME48k / NB_SUBFR + ( L_FIR - 1 )]; + + for ( i = 0; i < ( L_FIR - 1 ); i++ ) + { + x[i] = mem[i]; + } + + for ( i = 0; i < lg; i++ ) + { + x[i + ( L_FIR - 1 )] = signal[i]; + } + + for ( i = 0; i < lg; i++ ) + { + s = 0.0; + for ( j = 0; j < L_FIR; j++ ) + { + s += x[i + j] * fir_6k_7k[j]; + } + + /* gain of coef = 4.0 */ + signal[i] = (float) ( s * 0.25 ); + } + + for ( i = 0; i < L_FIR - 1; i++ ) + { + mem[i] = x[i + lg]; + } + + return; +} diff --git a/lib_dec/hq_classifier_dec.c b/lib_dec/hq_classifier_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..920554280983b16af3a13f6a8d8c7bc19079a9a6 --- /dev/null +++ b/lib_dec/hq_classifier_dec.c @@ -0,0 +1,103 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*--------------------------------------------------------------------------* + * hq_classifier_dec() + * + * HQ mode selector (decision_matrix) + *--------------------------------------------------------------------------*/ + +/*! r: Consumed bits */ +int16_t hq_classifier_dec( + Decoder_State *st, /* i/o: decoder state structure */ + const int32_t core_brate, /* i : Core bitrate */ + const int16_t length, /* i : Frame length */ + int16_t *is_transient, /* o : Transient flag */ + int16_t *hqswb_clas /* o : HQ class */ +) +{ + int16_t bits; + int32_t max_brate; + + max_brate = HQ_32k; + if ( st->element_mode > EVS_MONO ) + { + max_brate = HQ_48k; + } + + if ( ( ( length == L_SPEC32k ) || ( length == L_SPEC48k ) ) && core_brate <= max_brate ) + { + *hqswb_clas = get_next_indice( st, 2 ); + bits = 2; + } + else if ( length == L_SPEC16k_EXT || length == L_SPEC48k_EXT ) + { + *hqswb_clas = HQ_NORMAL; + bits = 0; + } + else + { + *hqswb_clas = get_next_indice( st, 1 ); + bits = 1; + } + + *is_transient = 0; + if ( *hqswb_clas == HQ_TRANSIENT ) + { + *is_transient = 1; + } + + if ( st->core_brate <= HQ_32k && *hqswb_clas == HQ_NORMAL ) + { + if ( length == L_SPEC32k ) + { + *hqswb_clas = HQ_GEN_SWB; + } + else if ( length == L_SPEC48k ) + { + *hqswb_clas = HQ_GEN_FB; + } + } + + return bits; +} diff --git a/lib_dec/hq_conf_fec.c b/lib_dec/hq_conf_fec.c new file mode 100644 index 0000000000000000000000000000000000000000..a35206441c93aa2d265807d715be3798082e5300 --- /dev/null +++ b/lib_dec/hq_conf_fec.c @@ -0,0 +1,67 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "wmc_auto.h" + +/*--------------------------------------------------------------------------* + * hq_configure_bfi() + * + * Initialization of HQ bands and subframes + *--------------------------------------------------------------------------*/ + +void hq_configure_bfi( + int16_t *nb_sfm, /* o : Number of sub bands */ + int16_t *num_Sb, /* o : Number of FEC sub bands ? */ + int16_t *num_bands_p, /* o : FEC sub bands */ + const int16_t **sfmsize, /* o : Subband bandwidths */ + const int16_t **sfm_start, /* o : Subband start coefficients */ + const int16_t **sfm_end /* o : Subband end coefficients */ +) +{ + *num_Sb = MAX_SB_NB; + *nb_sfm = SFM_N_NB; + mvs2s( Num_bands_NB, num_bands_p, *num_Sb ); + *sfmsize = band_len_wb; + *sfm_start = band_start_wb; + *sfm_end = band_end_wb; + + return; +} diff --git a/lib_dec/hq_core_dec.c b/lib_dec/hq_core_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..99d74c63b1a7f9a0bfca5271ffc35faf1ef7df80 --- /dev/null +++ b/lib_dec/hq_core_dec.c @@ -0,0 +1,626 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" +#include "ivas_prot.h" + + +/*-------------------------------------------------------------------------- + * hq_core_dec() + * + * HQ core decoder + *--------------------------------------------------------------------------*/ + +void hq_core_dec( + Decoder_State *st, /* i/o: decoder state structure */ + float synth[], /* o : output synthesis */ + const int16_t output_frame, /* i : output frame length */ + const int16_t hq_core_type, /* i : HQ core type */ + const int16_t core_switching_flag, /* i : ACELP->HQ switching frame flag */ + float *output /* o : LB synthesis in case of ACELP-HQ switch */ +) +{ + int16_t num_bits, is_transient, hqswb_clas, inner_frame; + int16_t i, j, flag_uv, num_Sb, nb_sfm; + int16_t ynrm[NB_SFM], num_bands_p[MAX_SB_NB]; + float ener_match, mean_en_high; + float t_audio_q[L_FRAME48k_EXT], wtda_audio[2 * L_FRAME48k]; + float wtda_audio_LB[2 * L_FRAME16k]; + int16_t delay_comp; + float normq[NB_SFM], SWB_fenv[SWB_FENV + DIM_FB]; + const int16_t *sfmsize, *sfm_start, *sfm_end; + float gapsynth[L_FRAME48k]; + + HQ_DEC_HANDLE hHQ_core; + HQ_NBFEC_HANDLE hHQ_nbfec; + + TCX_DEC_HANDLE hTcxDec; + TCX_CONFIG_HANDLE tcx_cfg; + int16_t index, left_rect, tcx_offsetFB, overlapFB, L_frameTCX; + int16_t tcx_offset, overlap, L_frame, L_spec, fscaleFB; + int16_t L_frameTCX_glob, L_frame_glob; + float acelp_zir[L_FRAME_MAX / 2]; + int16_t encoderLookahead, encoderLookaheadFB; + int16_t hq_recovery_flag; + int16_t mdctWindowLength; + int16_t mdctWindowLengthFB; + + push_wmops( "hq_core_dec" ); + /*-------------------------------------------------------------------------- + * Initializations + *--------------------------------------------------------------------------*/ + + hHQ_core = st->hHQ_core; + hHQ_nbfec = st->hHQ_nbfec; + + set_f( t_audio_q, 0.0f, L_FRAME48k_EXT ); + set_f( gapsynth, 0.0f, L_FRAME48k ); + set_s( num_bands_p, 0, MAX_SB_NB ); + set_s( ynrm, 39, NB_SFM ); /* Initialize to the smallest value */ + mean_en_high = 0.0f; + sfm_start = sfm_end = NULL; + num_Sb = nb_sfm = 0; + + hTcxDec = st->hTcxDec; + + if ( st->hTcxCfg->tcx_curr_overlap_mode == FULL_OVERLAP ) + { + st->hTcxCfg->tcx_last_overlap_mode = ALDO_WINDOW; + } + else + { + st->hTcxCfg->tcx_last_overlap_mode = st->hTcxCfg->tcx_curr_overlap_mode; + } + st->hTcxCfg->tcx_curr_overlap_mode = ALDO_WINDOW; + + hq_recovery_flag = ( st->last_core == ACELP_CORE ) && st->prev_bfi && ( st->element_mode > EVS_MONO ); /* ACELP -> HQtrans -> HQ; with HQtrans lost */ + + /*-------------------------------------------------------------------------- + * Find the number of bits for transform-domain coding + *--------------------------------------------------------------------------*/ + + /* set the total bit-budget */ + num_bits = (int16_t) ( st->total_brate / FRAMES_PER_SEC ); + + /* Set default spectrum length */ + L_spec = l_spec_tbl[st->bwidth]; + + if ( !st->bfi ) + { + if ( core_switching_flag ) + { + if ( st->element_mode != EVS_MONO ) + { + L_spec = l_spec_ext_tbl[st->bwidth]; + } + else + { + /* Preprocessing in the first HQ frame after ACELP frame */ + core_switching_hq_prepare_dec( st, &num_bits, output_frame ); + + /* During ACELP->HQ core switching, limit the HQ core bitrate to 48kbps */ + if ( num_bits > HQ_48k / FRAMES_PER_SEC ) + { + num_bits = (int16_t) ( HQ_48k / FRAMES_PER_SEC ); + } + } + } + + if ( hq_recovery_flag ) + { + acelp_plc_mdct_transition( st ); + } + + /* subtract signaling bits */ + num_bits -= st->next_bit_pos; + + /* set FEC parameters */ + flag_uv = 1 - hHQ_core->HqVoicing; + + /* subtract the number of bits for pitch & gain at higher bitrates */ + if ( !( core_switching_flag ) && st->core_brate > MINIMUM_RATE_TO_ENCODE_VOICING_FLAG ) + { + hHQ_core->HqVoicing = get_next_indice( st, 1 ); + num_bits -= 1; + } + else + { + hHQ_core->HqVoicing = 0; + if ( st->core_brate > MINIMUM_RATE_TO_ENCODE_VOICING_FLAG ) + { + hHQ_core->HqVoicing = 1; + } + } + } + else + { + flag_uv = 0; + } + + /* set inner frame (== coded bandwidth) length */ + inner_frame = inner_frame_tbl[st->bwidth]; + + if ( st->bfi == 0 ) + { + if ( output_frame >= L_FRAME16k ) + { + hHQ_core->ph_ecu_HqVoicing = hHQ_core->HqVoicing; + } + else + { + hHQ_core->ph_ecu_HqVoicing = 0; + } + } + + if ( output_frame == L_FRAME8k ) + { + hq_configure_bfi( &nb_sfm, &num_Sb, num_bands_p, &sfmsize, &sfm_start, &sfm_end ); + } + + /*-------------------------------------------------------------------------- + * transform-domain decoding + *--------------------------------------------------------------------------*/ + + if ( st->bfi ) + { + is_transient = hHQ_core->old_is_transient[0]; + if ( output_frame >= L_FRAME16k ) + { + hq_ecu( st->hTcxDec->prev_good_synth, t_audio_q, &hHQ_core->time_offs, hHQ_core->X_sav, &hHQ_core->num_p, hHQ_core->plocs, hHQ_core->plocsi, hHQ_core->env_stab, &hHQ_core->last_fec, hHQ_core->ph_ecu_HqVoicing, &hHQ_core->ph_ecu_active, gapsynth, st->prev_bfi, hHQ_core->old_is_transient, hHQ_core->mag_chg_1st, hHQ_core->Xavg, &hHQ_core->beta_mute, output_frame, st ); + } + else + { + HQ_FEC_processing( st, t_audio_q, is_transient, hHQ_nbfec->ynrm_values, hHQ_nbfec->r_p_values, num_Sb, nb_sfm, num_bands_p, output_frame, sfm_start, sfm_end ); + } + + hHQ_core->old_is_transient[2] = hHQ_core->old_is_transient[1]; + hHQ_core->old_is_transient[1] = hHQ_core->old_is_transient[0]; + + if ( output_frame >= L_FRAME16k ) + { + /* keep st->previoussynth updated as in FEC_HQ_pitch_analysis but no LP analysis */ + delay_comp = NS2SA( st->output_Fs, DELAY_CLDFB_NS ); + mvr2r( st->previoussynth + delay_comp, st->previoussynth, output_frame - delay_comp ); + mvr2r( st->delay_buf_out, st->previoussynth + output_frame - delay_comp, delay_comp ); + + flag_uv = 1; /* disable costly pitch out synthesis in bfi frame */ + hHQ_core->HqVoicing = 1 - flag_uv; /* safety setting for HQ->ACELP switch logic */ + set_f( hHQ_core->fer_samples, 0.0f, L_FRAME48k ); /* safety, create a known signal state for HQ->ACELP switch logic */ + } + } + else + { + if ( hq_core_type == LOW_RATE_HQ_CORE ) + { + if ( st->prev_bfi == 1 ) + { + set_f( hHQ_core->last_ni_gain, 0, BANDS_MAX ); + set_f( hHQ_core->last_env, 0, BANDS_MAX ); + hHQ_core->last_max_pos_pulse = 0; + } + + /* HQ low rate decoder */ + hq_lr_dec( st, t_audio_q, inner_frame, num_bits, &is_transient ); + + hqswb_clas = is_transient; + } + else + { + /* HQ high rate decoder */ + hq_hr_dec( st, t_audio_q, L_spec, num_bits, ynrm, &is_transient, &hqswb_clas, SWB_fenv, core_switching_flag ); + } + + if ( st->element_mode == EVS_MONO || ( !core_switching_flag && !hq_recovery_flag ) ) + { + /* scaling (coefficients are in nominal level) */ + if ( output_frame != NORM_MDCT_FACTOR ) + { + ener_match = (float) sqrt( (float) output_frame / (float) NORM_MDCT_FACTOR ); + + for ( i = 0; i < inner_frame; i++ ) + { + t_audio_q[i] *= ener_match; + } + } + } + + HQ_FEC_Mem_update( st, t_audio_q, normq, ynrm, num_bands_p, is_transient, hqswb_clas, core_switching_flag, nb_sfm, num_Sb, &mean_en_high, hq_core_type, output_frame ); + } + + /*-------------------------------------------------------------------------- + * Attenuate HFs in case of band-width switching (from higher BW to lower BW) + *--------------------------------------------------------------------------*/ + + /* attenuate HFs in case of band-width switching */ + if ( st->bws_cnt1 > 0 ) + { + ener_match = (float) st->bws_cnt1 / (float) N_NS2W_FRAMES; + + if ( is_transient ) + { + for ( i = 0; i < NUM_TIME_SWITCHING_BLOCKS; i++ ) + { + for ( j = inner_frame_tbl[st->bwidth - 1] / NUM_TIME_SWITCHING_BLOCKS; j < inner_frame / NUM_TIME_SWITCHING_BLOCKS; j++ ) + { + t_audio_q[i * inner_frame / NUM_TIME_SWITCHING_BLOCKS + j] *= ener_match; + } + } + } + else + { + for ( i = inner_frame_tbl[st->bwidth - 1]; i < inner_frame; i++ ) + { + t_audio_q[i] *= ener_match; + } + } + } + + /* WB/SWB bandwidth switching */ + if ( is_transient ) + { + mvr2r( t_audio_q + 240, st->t_audio_q, 80 ); + } + else + { + mvr2r( t_audio_q, st->t_audio_q, L_FRAME ); + } + + /*-------------------------------------------------------------------------- + * Inverse transform + * Overlap-add + * Pre-echo reduction + *--------------------------------------------------------------------------*/ + + if ( st->element_mode > EVS_MONO && ( core_switching_flag || hq_recovery_flag ) ) + { + /* Initializations for TCX MDCT framework, to be used for switching frame */ + tcx_cfg = st->hTcxCfg; + L_frameTCX_glob = hTcxDec->L_frameTCX; + L_frame_glob = st->L_frame; + L_spec = hTcxDec->L_frameTCX; + st->fscale = sr2fscale( st->sr_core ); + fscaleFB = sr2fscale( st->output_Fs ); + encoderLookahead = ( L_LOOK_12k8 * st->fscale ) / FSCALE_DENOM; + encoderLookaheadFB = ( L_LOOK_12k8 * fscaleFB ) / FSCALE_DENOM; + mdctWindowLength = getMdctWindowLength( st->fscale ); + mdctWindowLengthFB = (int16_t) ( mdctWindowLength * st->output_Fs / st->sr_core ); + if ( core_switching_flag ) + { + tcx_cfg->tcx_last_overlap_mode = TRANSITION_OVERLAP; + tcx_cfg->tcx_curr_overlap_mode = FULL_OVERLAP; + } + else + { + tcx_cfg->tcx_last_overlap_mode = ALDO_WINDOW; + tcx_cfg->tcx_curr_overlap_mode = ALDO_WINDOW; + st->last_core = HQ_CORE; /* Needed to decode non-transition frame */ + } + + init_tcx_window_cfg( tcx_cfg, st->sr_core, st->output_Fs, st->L_frame, hTcxDec->L_frameTCX, encoderLookahead, encoderLookaheadFB, mdctWindowLength, mdctWindowLengthFB, st->element_mode ); + + init_tcx_info( st, L_frame_glob, L_frameTCX_glob, 0, st->bfi, &tcx_offset, &tcx_offsetFB, &L_frame, &L_frameTCX, &left_rect, &L_spec ); + + overlap = tcx_cfg->tcx_mdct_window_length; + overlapFB = tcx_cfg->tcx_mdct_window_lengthFB; + index = tcx_cfg->tcx_last_overlap_mode; + + /* LB synthesis */ + IMDCT( t_audio_q, hTcxDec->syn_Overl, hTcxDec->syn_Overl_TDAC, wtda_audio, tcx_cfg->tcx_aldo_window_1_trunc, tcx_cfg->tcx_aldo_window_2, tcx_cfg->tcx_mdct_window_half, tcx_cfg->tcx_mdct_window_minimum, tcx_cfg->tcx_mdct_window_trans, tcx_cfg->tcx_mdct_window_half_length, tcx_cfg->tcx_mdct_window_min_length, index, + MDCT_IV, left_rect, tcx_offset, overlap, L_frame, L_frameTCX, max( L_frameTCX, L_spec ) >> 1, L_frame_glob, 0, st->bfi, hHQ_core->old_outLB, 0, st, 0, acelp_zir ); + + mvr2r( wtda_audio + ( overlap >> 1 ) - tcx_offset, output, L_frame_glob ); + + /* FB synthesis */ + IMDCT( t_audio_q, hTcxDec->syn_OverlFB, hTcxDec->syn_Overl_TDACFB, wtda_audio, tcx_cfg->tcx_aldo_window_1_FB_trunc, tcx_cfg->tcx_aldo_window_2_FB, tcx_cfg->tcx_mdct_window_halfFB, tcx_cfg->tcx_mdct_window_minimumFB, tcx_cfg->tcx_mdct_window_transFB, tcx_cfg->tcx_mdct_window_half_lengthFB, tcx_cfg->tcx_mdct_window_min_lengthFB, index, + MDCT_IV, left_rect, tcx_offsetFB, overlapFB, L_frameTCX, L_frameTCX, max( L_frameTCX, L_spec ) >> 1, L_frameTCX_glob, 0, st->bfi, hHQ_core->old_out, 1, st, FSCALE_DENOM * L_frameTCX_glob / L_frame_glob, acelp_zir ); + + mvr2r( wtda_audio + ( overlapFB >> 1 ) - tcx_offsetFB, synth, L_frameTCX_glob ); + + if ( !core_switching_flag ) + { + st->last_core = ACELP_CORE; /* Restore last core */ + } + } + else + { + if ( output_frame == L_FRAME8k || st->bfi == 0 ) + { + if ( ( output_frame != inner_frame ) && ( st->bfi == 1 ) ) + { + inverse_transform( t_audio_q, wtda_audio, is_transient, output_frame, output_frame, st->element_mode ); + } + else + { + inverse_transform( t_audio_q, wtda_audio, is_transient, output_frame, inner_frame, st->element_mode ); + } + } + + if ( st->element_mode > EVS_MONO ) + { + if ( st->bfi ) + { + /* Rough resampling, but reduces energy loss in case of switch to ACELP in first good frame */ + lerp( t_audio_q, wtda_audio_LB, st->L_frame, inner_frame ); + v_multc( t_audio_q, 0.5f, wtda_audio_LB, st->L_frame ); + } + else + { + /* LB synthesis for potential switch to ACELP */ + ener_match = (float) sqrt( (float) st->L_frame / (float) output_frame ); + v_multc( t_audio_q, ener_match, t_audio_q, inner_frame ); + inverse_transform( t_audio_q, wtda_audio_LB, is_transient, st->L_frame, inner_frame, st->element_mode ); + } + } + + if ( output_frame == L_FRAME8k ) + { + if ( st->bfi == 0 && st->prev_bfi == 0 ) + { + mvr2r( hHQ_core->old_out + (int16_t) ( N_ZERO_MDCT_NS * output_frame / FRAME_SIZE_NS ), hHQ_nbfec->prev_oldauOut, output_frame - (int16_t) ( N_ZERO_MDCT_NS * output_frame / FRAME_SIZE_NS ) ); + } + else if ( st->prev_bfi == 1 ) + { + set_f( hHQ_nbfec->prev_oldauOut, 0.0f, output_frame ); + } + + if ( ( st->prev_bfi == 1 || st->bfi == 1 ) && !hHQ_core->old_is_transient[2] && st->last_core == HQ_CORE && st->last_codec_mode == MODE1 ) + { + time_domain_FEC_HQ( st, wtda_audio, synth, mean_en_high, output_frame ); + } + else + { + window_ola( wtda_audio, synth, hHQ_core->old_out, output_frame, st->hTcxCfg->tcx_last_overlap_mode, st->hTcxCfg->tcx_curr_overlap_mode, st->prev_bfi, hHQ_core->oldHqVoicing, hHQ_core->oldgapsynth ); + hHQ_nbfec->phase_mat_next = 0; + } + + if ( ( !st->bfi && !st->prev_bfi ) || ( !( output_frame >= L_FRAME16k ) ) ) + { + preecho_sb( st->core_brate, wtda_audio, synth, output_frame, &hHQ_core->memfilt_lb, &hHQ_core->mean_prev_hb, &hHQ_core->smoothmem, &hHQ_core->mean_prev, &hHQ_core->mean_prev_nc, &hHQ_core->wmold_hb, &hHQ_core->prevflag, &hHQ_core->pastpre, st->bwidth ); + } + } + else + { + if ( st->bfi && output_frame >= L_FRAME16k ) + { + window_ola( t_audio_q, synth, hHQ_core->old_out, output_frame, ALDO_WINDOW, ALDO_WINDOW, st->prev_bfi && !hHQ_core->ph_ecu_active, hHQ_core->oldHqVoicing, hHQ_core->oldgapsynth ); + } + else + { + window_ola( wtda_audio, synth, hHQ_core->old_out, output_frame, st->hTcxCfg->tcx_last_overlap_mode, st->hTcxCfg->tcx_curr_overlap_mode, st->prev_bfi && !hHQ_core->ph_ecu_active, hHQ_core->oldHqVoicing, hHQ_core->oldgapsynth ); + } + + if ( st->element_mode > EVS_MONO ) + { + /* LB synthesis for potential switch to ACELP */ + window_ola( wtda_audio_LB, output, hHQ_core->old_outLB, L_FRAME16k, st->hTcxCfg->tcx_last_overlap_mode, st->hTcxCfg->tcx_curr_overlap_mode, st->prev_bfi && !hHQ_core->ph_ecu_active, hHQ_core->oldHqVoicing, hHQ_core->oldgapsynth ); + } + + if ( ( !st->bfi && !st->prev_bfi ) || ( !( output_frame >= L_FRAME16k ) ) ) + { + preecho_sb( st->core_brate, wtda_audio, synth, output_frame, &hHQ_core->memfilt_lb, &hHQ_core->mean_prev_hb, &hHQ_core->smoothmem, &hHQ_core->mean_prev, &hHQ_core->mean_prev_nc, &hHQ_core->wmold_hb, &hHQ_core->prevflag, &hHQ_core->pastpre, st->bwidth ); + } + } + } + + if ( !st->bfi && st->prev_bfi && st->last_total_brate >= HQ_48k && st->last_codec_mode == MODE2 && ( st->last_core_bfi == TCX_20_CORE || st->last_core_bfi == TCX_10_CORE ) && st->hPlcInfo->concealment_method == TCX_NONTONAL && st->hPlcInfo->nbLostCmpt < 4 ) + { + waveform_adj2( st->hPlcInfo, st->hTonalMDCTConc->secondLastPcmOut, synth, 0, st->hPlcInfo->nbLostCmpt + 1, st->bfi ); + } + + if ( output_frame >= L_FRAME16k ) + { + if ( hHQ_core->ph_ecu_HqVoicing ) + { + hHQ_core->oldHqVoicing = 1; + mvr2r( gapsynth, hHQ_core->oldgapsynth, L_FRAME48k ); + } + else + { + hHQ_core->oldHqVoicing = 0; + } + } + else + { + hHQ_core->oldHqVoicing = 0; + } + + if ( st->nbLostCmpt == FRAMECTTOSTART_MDCT ) + { + hHQ_core->HqVoicing = 0; + } + + if ( output_frame == L_FRAME8k ) + { + mvr2r( wtda_audio, hHQ_nbfec->oldIMDCTout, L_FRAME8k / 2 ); + mvr2r( hHQ_nbfec->old_auOut_2fr + output_frame, hHQ_nbfec->old_auOut_2fr, output_frame ); + mvr2r( synth, hHQ_nbfec->old_auOut_2fr + output_frame, output_frame ); + } + + + /* update buffer of old subframe pitch values */ + if ( st->last_core == HQ_CORE && st->L_frame != st->last_L_frame ) + { + set_f( &st->old_pitch_buf[st->L_frame / L_SUBFR], (float) L_SUBFR, st->L_frame / L_SUBFR ); + } + mvr2r( &st->old_pitch_buf[st->L_frame / L_SUBFR], st->old_pitch_buf, st->L_frame / L_SUBFR ); + set_f( &st->old_pitch_buf[st->L_frame / L_SUBFR], (float) L_SUBFR, st->L_frame / L_SUBFR ); + mvr2r( &st->mem_pitch_gain[2], &st->mem_pitch_gain[st->L_frame / L_SUBFR + 2], st->L_frame / L_SUBFR ); + set_zero( &st->mem_pitch_gain[2], st->L_frame / L_SUBFR ); + + /* Move LB excitation to old_exc memory in case of switch HQ->ACELP */ + if ( st->element_mode > EVS_MONO ) + { + mvr2r( output, st->old_exc + L_EXC_MEM_DEC - st->L_frame, st->L_frame ); + } + + pop_wmops(); + return; +} + + +/*-------------------------------------------------------------------* + * hq_core_dec_init() + * + * Initialize HQ core state structure + *-------------------------------------------------------------------*/ + +void HQ_core_dec_init( + HQ_DEC_HANDLE hHQ_core /* i/o: HQ core data handle */ +) +{ + + set_f( hHQ_core->old_out, 0, L_FRAME48k ); + set_f( hHQ_core->old_outLB, 0, L_FRAME32k ); + set_s( hHQ_core->old_is_transient, 0, 3 ); + + hHQ_core->oldHqVoicing = 0; + + set_f( hHQ_core->prev_noise_level, 0.0f, 2 ); + hHQ_core->prev_R = 0; + set_f( hHQ_core->prev_coeff_out, 0, L_HQ_WB_BWE ); + set_s( hHQ_core->prev_SWB_peak_pos, 0, SPT_SHORTEN_SBNUM ); + + /* HQ GENERIC */ + hHQ_core->hq_generic_seed = RANDOM_INITSEED; + + hHQ_core->mem_norm[0] = 31; + set_s( hHQ_core->mem_norm + 1, 39, SFM_N_ENV_STAB - 1 ); + hHQ_core->mem_env_delta = 0; + hHQ_core->no_att_hangover = 0; + hHQ_core->energy_lt = 300.0f; + + hHQ_core->HqVoicing = 0; + set_f( hHQ_core->fer_samples, 0, L_FRAME48k ); + set_f( hHQ_core->prev_env, 0, SFM_N_WB ); + set_f( hHQ_core->prev_normq, 0, SFM_N_WB ); + hHQ_core->prev_hqswb_clas = HQ_NORMAL; + + set_f( hHQ_core->last_ni_gain, 0, BANDS_MAX ); + set_f( hHQ_core->last_env, 0, BANDS_MAX ); + hHQ_core->last_max_pos_pulse = 0; + hHQ_core->prev_frm_hfe2 = 0; + hHQ_core->prev_stab_hfe2 = 0; + hHQ_core->prev_ni_ratio = 0.5f; + set_f( hHQ_core->prev_En_sb, 0.0f, NB_SWB_SUBBANDS ); + + + /*----------------------------------------------------------------------------------* + * HQ FEC + *----------------------------------------------------------------------------------*/ + + set_f( hHQ_core->X_sav, 0.0f, PH_ECU_SPEC_SIZE ); + hHQ_core->num_p = 0; + hHQ_core->ph_ecu_active = 0; + hHQ_core->ni_seed_forfec = 0; + hHQ_core->last_fec = 0; + hHQ_core->ph_ecu_HqVoicing = 0; + set_f( hHQ_core->oldgapsynth, 0.0f, L_FRAME48k ); + hHQ_core->env_stab = 0.75f; + hHQ_core->mem_norm_hqfec[0] = 31; + set_s( hHQ_core->mem_norm_hqfec + 1, 39, SFM_N_ENV_STAB - 1 ); + hHQ_core->mem_env_delta_hqfec = 0; + hHQ_core->env_stab_plc = 0.0f; + set_f( hHQ_core->env_stab_state_p, 1.0f / NUM_ENV_STAB_PLC_STATES, NUM_ENV_STAB_PLC_STATES ); + hHQ_core->envstabplc_hocnt = 0; + + set_f( hHQ_core->mag_chg_1st, 1.0f, LGW_MAX ); + set_f( hHQ_core->Xavg, 0.0f, LGW_MAX ); + hHQ_core->beta_mute = BETA_MUTE_FAC_INI; + + hHQ_core->time_offs = 0; + hHQ_core->ber_occured_in_pvq = 0; + + hHQ_core->last_hq_core_type = -1; + + reset_preecho_dec( hHQ_core ); + + return; +} + +/*-------------------------------------------------------------------* + * HQ_nbfec_init() + * + * Initialize HQ NB FEC state structure + *-------------------------------------------------------------------*/ + +void HQ_nbfec_init( + HQ_NBFEC_HANDLE hHQ_nbfec /* i/o: HQ NB FEC data handle */ +) +{ + int16_t i, j; + + hHQ_nbfec->prev_last_core = -1; + + set_f( hHQ_nbfec->old_coeffs, 0, L_FRAME8k ); + set_f( hHQ_nbfec->old_auOut_2fr, 0, L_FRAME8k * 2 ); + set_f( hHQ_nbfec->old_out_pha[0], 0, N_LEAD_NB ); + set_f( hHQ_nbfec->old_out_pha[1], 0, N_LEAD_NB ); + + hHQ_nbfec->phase_mat_flag = 0; + hHQ_nbfec->phase_mat_next = 0; + hHQ_nbfec->old_Min_ind = 0; + hHQ_nbfec->diff_energy = 0.f; + set_f( hHQ_nbfec->oldIMDCTout, 0.f, L_FRAME8k / 2 ); + set_f( hHQ_nbfec->prev_oldauOut, 0.f, L_FRAME8k ); + hHQ_nbfec->stat_mode_out = 0; + hHQ_nbfec->stat_mode_old = 0; + + for ( i = 0; i < MAX_SB_NB; i++ ) + { + for ( j = 0; j < MAX_PGF; j++ ) + { + hHQ_nbfec->ynrm_values[i][j] = 0.f; + } + for ( j = 0; j < MAX_ROW; j++ ) + { + hHQ_nbfec->r_p_values[i][j] = 0.f; + } + } + set_f( hHQ_nbfec->Norm_gain, 1.f, SFM_N_NB ); + set_f( hHQ_nbfec->energy_MA_Curr, 100.f, 2 ); + hHQ_nbfec->HQ_FEC_seed = RANDOM_INITSEED; + + set_s( hHQ_nbfec->prev_sign_switch, 0, HQ_FEC_SIGN_SFM ); + set_s( hHQ_nbfec->prev_sign_switch_2, 0, HQ_FEC_SIGN_SFM ); + + return; +} diff --git a/lib_dec/hq_env_dec.c b/lib_dec/hq_env_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..74309410c9030c845e8994e78972dd53d279a4c3 --- /dev/null +++ b/lib_dec/hq_env_dec.c @@ -0,0 +1,199 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*------------------------------------------------------------------------* + * decode_envelope_indices() + * + * Decode envelope indices + *------------------------------------------------------------------------*/ + +/*! r: Number of bits */ +int16_t decode_envelope_indices( + Decoder_State *st, /* i/o: decoder state structure */ + const int16_t start_norm, /* i : starting band index */ + const int16_t num_sfm, /* i : Number of subbands */ + const int16_t numnrmibits, /* i : Bitrate of fall-back coding mode */ + int16_t *difidx, /* o : Diff indices/encoded diff indices */ + const int16_t flag_HQ2, /* i : indicator of HQ2 core */ + const int16_t is_transient /* i : transient flag */ +) +{ + int16_t hcode_l; + int16_t i; + int16_t LCmode; + + if ( flag_HQ2 == LOW_RATE_HQ_CORE || flag_HQ2 == LOW_RATE_HQ_CORE_TRAN ) + { + LCmode = get_next_indice( st, BITS_DE_HMODE ); + difidx[start_norm] = get_next_indice( st, BITS_DE_FCOMP ); + } + else + { + LCmode = get_next_indice( st, 2 ); + difidx[start_norm] = get_next_indice( st, NORM0_BITS ); + } + + if ( is_transient && flag_HQ2 == LOW_RATE_HQ_CORE_TRAN ) + { + hcode_l = 0; + if ( LCmode == 1 ) + { + hdecnrm_tran( st, num_sfm, &difidx[start_norm + 1] ); + for ( i = start_norm + 1; i < start_norm + num_sfm; i++ ) + { + hcode_l += huffsizn_tran[difidx[i]]; + } + } + else + { + hdecnrm_context( st, num_sfm, &difidx[start_norm], &hcode_l ); + } + } + else + { + hcode_l = 0; + if ( LCmode == 0 ) + { + hdecnrm_context( st, num_sfm, &difidx[start_norm], &hcode_l ); + } + else if ( LCmode == 1 ) + { + hdecnrm_resize( st, num_sfm, &difidx[start_norm + 1] ); + + for ( i = start_norm + 1; i < start_norm + num_sfm; i++ ) + { + hcode_l += resize_huffsizn[difidx[i]]; + } + + for ( i = start_norm + 2; i < start_norm + num_sfm; i++ ) + { + if ( difidx[i - 1] > 17 ) + { + difidx[i] = difidx[i] - min( difidx[i - 1] - 17, 3 ); + } + + if ( difidx[i - 1] < 13 ) + { + difidx[i] = difidx[i] - max( difidx[i - 1] - 13, -3 ); + } + } + } + else if ( LCmode == 2 ) + { + hdecnrm( st, num_sfm, &difidx[start_norm + 1] ); + for ( i = start_norm + 1; i < start_norm + num_sfm; i++ ) + { + hcode_l += huffsizn[difidx[i]]; + } + } + else + { + for ( i = start_norm + 1; i < start_norm + num_sfm; i++ ) + { + difidx[i] = get_next_indice( st, NORMI_BITS ); + } + hcode_l = numnrmibits; + } + } + + return hcode_l; +} + +/*------------------------------------------------------------------------* + * dequantize_norms() + * + * De-quantization of norms + *------------------------------------------------------------------------*/ + +/*! r: Number of bits */ +void dequantize_norms( + Decoder_State *st, /* i/o: decoder state structure */ + const int16_t start_norm, /* i : First SDE encoded norm */ + const int16_t num_sfm, /* i : Number of norms */ + const int16_t is_transient, /* i : Transient flag */ + int16_t *ynrm, /* o : Decoded norm indices */ + int16_t *normqlg2 /* o : Log2 of decoded norms */ +) +{ + int16_t i, j, k; + int16_t idxbuf[NB_SFM]; + + /* First sub-frame */ + normqlg2[start_norm] = dicnlg2[ynrm[start_norm]]; + + /* Other sub-frames */ + if ( is_transient ) + { + /* Recover quantization indices and quantized norms */ + idxbuf[0] = ynrm[0]; + for ( i = 1; i < num_sfm; i++ ) + { + idxbuf[i] = ynrm[i] + idxbuf[i - 1] - 15; + /* safety check in case of bit errors */ + if ( idxbuf[i] < 0 || idxbuf[i] > 39 ) + { + idxbuf[i] = 39; + st->BER_detect = 1; + } + } + + recovernorm( idxbuf, ynrm, normqlg2, num_sfm ); + } + else + { + for ( i = start_norm + 1; i < start_norm + num_sfm; i++ ) + { + j = i - 1; + k = ynrm[j] - 15; + ynrm[i] = ynrm[i] + k; + /* safety check in case of bit errors */ + if ( ynrm[i] < 0 || ynrm[i] > 39 ) + { + ynrm[i] = 39; + st->BER_detect = 1; + } + normqlg2[i] = dicnlg2[ynrm[i]]; + } + } + + return; +} diff --git a/lib_dec/hq_hr_dec.c b/lib_dec/hq_hr_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..923d3b05ef917c14ffdf92d1b72d510c6189493c --- /dev/null +++ b/lib_dec/hq_hr_dec.c @@ -0,0 +1,300 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "wmc_auto.h" + +/*--------------------------------------------------------------------------* + * hq_pred_hb_bws() + * + * HQ core HB band-width switching handling + *--------------------------------------------------------------------------*/ + +static void hq_pred_hb_bws( + Decoder_State *st, /* i/o: decoder state structure */ + const int16_t *ynrm, /* i : norm quantization index vector */ + const int16_t length, /* i : frame length */ + const int16_t hqswb_clas, /* i : HQ SWB class */ + const float *SWB_fenv /* i : SWB frequency envelopes */ +) +{ + int16_t i; + + /* SWB switching to WB */ + if ( length >= L_FRAME32k ) /* wb switch to swb */ + { + /* calculate the switching parameters */ + if ( ( hqswb_clas != HQ_GEN_SWB && st->core_brate <= HQ_32k ) || st->core_brate > HQ_32k ) + { + st->prev_ener_shb = 0.0f; + for ( i = 25; i < SFM_N_HARM; i++ ) + { + st->prev_ener_shb += dicn[ynrm[i]]; + } + st->prev_ener_shb /= 6; + } + else + { + st->prev_ener_shb = 0.0f; + for ( i = 0; i < SWB_FENV - 3; i++ ) + { + st->prev_ener_shb += SWB_fenv[i]; + } + st->prev_ener_shb /= ( SWB_FENV - 3 ); + } + } + + if ( st->last_inner_frame >= L_FRAME32k && st->hBWE_FD != NULL ) + { + set_f( st->hBWE_FD->prev_SWB_fenv, st->prev_ener_shb, SWB_FENV ); + } + + return; +} + + +/*--------------------------------------------------------------------------* + * hq_hr_dec() + * + * HQ high rate decoding routine + *--------------------------------------------------------------------------*/ + +void hq_hr_dec( + Decoder_State *st, /* i/o: decoder state structure */ + float *t_audio_q, /* o : transform-domain coefficients */ + const int16_t length, /* i : frame length */ + const int16_t num_bits, /* i : number of available bits */ + int16_t *ynrm, /* o : norm quantization index vector */ + int16_t *is_transient, /* o : transient flag */ + int16_t *hqswb_clas, /* o : HQ SWB class */ + float *SWB_fenv, /* o : SWB frequency envelopes */ + const int16_t core_switching_flag /* i : Core switching flag */ +) +{ + int16_t nb_sfm; + int16_t sum, hcode_l; + int16_t sfmsize[NB_SFM], sfm_start[NB_SFM], sfm_end[NB_SFM]; + int16_t num_sfm, numnrmibits; + int16_t nf_idx; + int16_t normqlg2[NB_SFM], R[NB_SFM]; + int16_t pulses[NB_SFM], maxpulse[NB_SFM]; + float env_stab; + int16_t Rsubband[NB_SFM]; /*Q3*/ + int16_t start_norm, Npeaks = 0; + float noise_level[HVQ_BWE_NOISE_BANDS]; + int16_t peak_idx[HVQ_MAX_PEAKS]; + int16_t hq_generic_offset; + int16_t num_env_bands; + int16_t hq_generic_exc_clas = 0; + int16_t core_sfm; + int16_t har_freq_est1, har_freq_est2; + int16_t flag_dis; + const int16_t *subband_search_offset; + int16_t wBands[2]; + int16_t b_delta_env; + int16_t n_band; + int16_t bits_left; + + HQ_DEC_HANDLE hHQ_core = st->hHQ_core; + bits_left = num_bits; + + /*------------------------------------------------------------------* + * Initializations + *------------------------------------------------------------------*/ + set_s( pulses, 0, NB_SFM ); + set_s( maxpulse, 0, NB_SFM ); + flag_dis = 1; + har_freq_est1 = 0; + har_freq_est2 = 0; + set_s( peak_idx, 0, HVQ_MAX_PEAKS_32k ); + + /*------------------------------------------------------------------* + * Decode classification + *------------------------------------------------------------------*/ + bits_left -= hq_classifier_dec( st, st->core_brate, length, is_transient, hqswb_clas ); + + /*------------------------------------------------------------------* + * set quantization parameters + *------------------------------------------------------------------*/ + + hq_configure( length, *hqswb_clas, st->core_brate, &num_sfm, &nb_sfm, &start_norm, &num_env_bands, &numnrmibits, &hq_generic_offset, sfmsize, sfm_start, sfm_end ); + + /*------------------------------------------------------------------* + * Unpacking bitstream + *------------------------------------------------------------------*/ + + nf_idx = 0; + if ( !*is_transient && *hqswb_clas != HQ_HVQ && !( length == L_FRAME16k && st->core_brate <= HQ_32k ) ) + { + nf_idx = get_next_indice( st, 2 ); + } + + + /*------------------------------------------------------------------* + * Decode envelope + *------------------------------------------------------------------*/ + + hcode_l = decode_envelope_indices( st, start_norm, num_env_bands, numnrmibits, ynrm, NORMAL_HQ_CORE, *is_transient ); + bits_left -= hcode_l + NORM0_BITS + FLAGS_BITS; + + dequantize_norms( st, start_norm, num_env_bands, *is_transient, ynrm, normqlg2 ); + + if ( *hqswb_clas == HQ_GEN_SWB || *hqswb_clas == HQ_GEN_FB ) + { + hq_generic_exc_clas = swb_bwe_gain_deq( st, HQ_CORE, NULL, SWB_fenv, st->core_brate >= HQ_32k, *hqswb_clas ); /* Use (st->core_brate >= HQ_32k) to be consistent with hq_configure */ + if ( hq_generic_exc_clas == HQ_GENERIC_SP_EXC ) + { + bits_left++; /* conditional 1 bit saving for representing FD3 BWE excitation class */ + } + map_hq_generic_fenv_norm( *hqswb_clas, SWB_fenv, ynrm, normqlg2, num_env_bands, nb_sfm, hq_generic_offset ); + } + + env_stab = 0; + if ( *hqswb_clas == HQ_HVQ ) + { + hHQ_core->mem_env_delta = 0; + } + else if ( length == L_FRAME32k || ( core_switching_flag && ( st->element_mode != EVS_MONO ) && length == L_SPEC32k_EXT ) ) + { + env_stab = env_stability( ynrm, SFM_N_ENV_STAB, hHQ_core->mem_norm, &hHQ_core->mem_env_delta, core_switching_flag && ( st->element_mode != EVS_MONO ) ); + } + else + { + hHQ_core->mem_norm[0] = 31; + hHQ_core->mem_env_delta = 0; + } + + if ( *hqswb_clas == HQ_HVQ ) + { + hHQ_core->env_stab = 1.0f; /* stable by definition */ + } + else + { + if ( length == L_FRAME32k || ( core_switching_flag && ( st->element_mode != EVS_MONO ) && length == L_SPEC32k_EXT ) ) + { + hHQ_core->env_stab = env_stab; /* calculated stability */ + } + else + { + hHQ_core->env_stab = env_stability( ynrm, SFM_N_ENV_STAB_WB, hHQ_core->mem_norm_hqfec, &hHQ_core->mem_env_delta_hqfec, core_switching_flag && ( st->element_mode != EVS_MONO ) ); + } + } + hHQ_core->env_stab_plc = env_stab_smo( min( hHQ_core->env_stab, 1.0f - stab_trans[L_STAB_TBL - 1] ), hHQ_core->env_stab_state_p, &hHQ_core->envstabplc_hocnt ); + + /*------------------------------------------------------------------* + * Bit allocation + *------------------------------------------------------------------*/ + + hq_bit_allocation( st->core_brate, length, *hqswb_clas, &bits_left, normqlg2, nb_sfm, sfmsize, noise_level, R, Rsubband, &sum, &core_sfm, num_env_bands ); + + if ( st->bws_cnt1 > 0 && *hqswb_clas == HQ_GEN_SWB && st->core_brate < HQ_32k ) + { + if ( st->L_frame == L_FRAME16k ) + { + for ( n_band = 0; n_band < 4; n_band++ ) + { + SWB_fenv[n_band] *= (float) st->bws_cnt1 / (float) N_NS2W_FRAMES; + } + } + + for ( n_band = 4; n_band < SWB_FENV; n_band++ ) + { + SWB_fenv[n_band] *= (float) st->bws_cnt1 / (float) N_NS2W_FRAMES; + } + } + + if ( *hqswb_clas == HQ_GEN_SWB || *hqswb_clas == HQ_GEN_FB ) + { + b_delta_env = get_nor_delta_hf( st, ynrm, Rsubband, num_env_bands, nb_sfm, core_sfm ); + sum -= b_delta_env; + } + + /*------------------------------------------------------------------* + * Decode spectral fine structure using HVQ/PVQ + *------------------------------------------------------------------*/ + + if ( *hqswb_clas == HQ_HVQ ) + { + hvq_dec( st, bits_left, st->core_brate, ynrm, R, noise_level, peak_idx, &Npeaks, t_audio_q, st->core ); + } + else + { + pvq_core_dec( st, sfm_start, sfm_end, sfmsize, t_audio_q, sum, nb_sfm, Rsubband, R, pulses, maxpulse, HQ_CORE ); + } + + if ( *hqswb_clas == HQ_HVQ || *hqswb_clas == HQ_HARMONIC ) + { + subband_search_offset = subband_search_offsets_13p2kbps_Har; + wBands[0] = SWB_SB_BW_LEN0_16KBPS_HAR; + wBands[1] = SWB_SB_BW_LEN1_16KBPS_HAR; + + har_est( t_audio_q, 300, &har_freq_est1, &har_freq_est2, &flag_dis, &hHQ_core->prev_frm_hfe2, subband_search_offset, wBands, &hHQ_core->prev_stab_hfe2 ); + + hHQ_core->prev_frm_hfe2 = har_freq_est2; + } + + /* reset LR-HQ memories */ + hHQ_core->prev_frm_hfe2 = 0; + hHQ_core->prev_stab_hfe2 = 0; + + /*------------------------------------------------------------------* + * Spectral filling + *------------------------------------------------------------------*/ + + fill_spectrum( t_audio_q, R, *is_transient, ynrm, SWB_fenv, hq_generic_offset, nf_idx, length, env_stab, &hHQ_core->no_att_hangover, &hHQ_core->energy_lt, &hHQ_core->hq_generic_seed, hq_generic_exc_clas, core_sfm, *hqswb_clas, noise_level, st->core_brate, hHQ_core->prev_noise_level, &( hHQ_core->prev_R ), hHQ_core->prev_coeff_out, peak_idx, Npeaks, pulses, hHQ_core->old_is_transient[0], hHQ_core->prev_normq, hHQ_core->prev_env, st->prev_bfi, sfmsize, sfm_start, sfm_end, &st->hBWE_FD->prev_L_swb_norm, hHQ_core->prev_hqswb_clas, num_sfm, num_env_bands, st->element_mode ); + + enforce_zero_for_min_envelope( *hqswb_clas, ynrm, t_audio_q, nb_sfm, sfm_start, sfm_end ); + + if ( *is_transient ) + { + de_interleave_spectrum( t_audio_q, length ); + } + + /*------------------------------------------------------------------* + * WB/SWB bandwidth switching + *------------------------------------------------------------------*/ + + hq_pred_hb_bws( st, ynrm, length, *hqswb_clas, SWB_fenv ); + + /* update */ + hHQ_core->prev_hqswb_clas = *hqswb_clas; + + return; +} diff --git a/lib_dec/hq_lr_dec.c b/lib_dec/hq_lr_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..2d1ab780963549c02965acce6af12de916623846 --- /dev/null +++ b/lib_dec/hq_lr_dec.c @@ -0,0 +1,1392 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "rom_com.h" +#include "rom_dec.h" +#include "prot.h" +#include "stl.h" +#include "basop_util.h" +#include "wmc_auto.h" + +/*--------------------------------------------------------------------------* + * Local function prototypes + *--------------------------------------------------------------------------*/ + +static int16_t p2a_threshold_dequant( Decoder_State *st, int16_t *p2a_flags, const int16_t bands, const int16_t p2a_bands ); + +static void mdct_spectrum_fine_gain_dec( Decoder_State *st, float y2[], const int16_t band_start[], const int16_t band_end[], const int16_t k_sort[], const int16_t bands, const Word32 L_qint, const int16_t Ngq, const int16_t gqlevs, const int16_t gqbits ); + +static float band_energy_dequant( Decoder_State *st, float band_energy[], const int16_t bands, const Word32 L_qint, const Word16 eref_fx, const int16_t is_transient ); + +static void spt_shorten_domain_set_dec( Decoder_State *st, const int16_t p2a_flags[], const int16_t new_band_start[], const int16_t new_band_end[], const int16_t new_band_width[], const int16_t bands, int16_t band_start[], int16_t band_end[], int16_t band_width[], int16_t *bit_budget ); + + +/*-------------------------------------------------------------------* + * hq_lr_dec() + * + * HQ low rate decoding routine + *-------------------------------------------------------------------*/ + +void hq_lr_dec( + Decoder_State *st, /* i/o: decoder state structure */ + float yout[], /* o : transform-domain output coefs. */ + const int16_t inner_frame, /* i : inner frame length */ + int16_t num_bits, /* i : number of available bits */ + int16_t *is_transient /* o : transient flag */ +) +{ + int16_t i, k1, pbits, p2a_flags[BANDS_MAX], bit_budget, bands, length, gqlevs, gqbits, Ngq, p2a_bands, ni_seed; + int16_t band_start[BANDS_MAX], band_end[BANDS_MAX], band_width[BANDS_MAX]; + int16_t k_sort[BANDS_MAX], npulses[BANDS_MAX]; + int32_t inp_vector[L_FRAME48k]; + float ni_coef, ni_pd_th, pd_thresh, ld_slope; + float ebits, Rk[BANDS_MAX], band_energy[BANDS_MAX], y2[L_FRAME48k], p2a_th; + Word32 Rk_fx[BANDS_MAX]; + Word32 L_qint; /* Q29 */ + Word16 eref_fx; /* Q10 */ + Word16 bit_alloc_weight_fx; /* Q13 */ + float y2_ni[L_FRAME48k], y2_org[L_FRAME48k]; + int16_t hqswb_clas = 0; + int16_t lowlength, highlength, har_bands = 0; + float m[L_FRAME32k]; + float Ep[BANDS_MAX], enerH = 0.0f, enerL = 0.0f; + int16_t lowband, highband, bw_low = 0, bw_high = 20; + float Ep_tmp[BANDS_MAX]; + float band_energy_tmp[BANDS_MAX]; + int16_t last_bitalloc_max_band[2]; + int32_t bwe_br; + int16_t trans_bit, p2a_flags_tmp[BANDS_MAX]; + int16_t adjustFlag = 0; + int16_t prev_SWB_peak_pos_tmp[SPT_SHORTEN_SBNUM]; + int16_t j, k; + int16_t flag_spt; + int16_t org_band_start[SPT_SHORTEN_SBNUM]; + int16_t org_band_end[SPT_SHORTEN_SBNUM]; + int16_t org_band_width[SPT_SHORTEN_SBNUM]; + int16_t new_band_start[SPT_SHORTEN_SBNUM]; + int16_t new_band_end[SPT_SHORTEN_SBNUM]; + int16_t new_band_width[SPT_SHORTEN_SBNUM]; + Word32 L_tmp, L_tmp2, L_tmp3; + Word16 exp, tmp, exp2, tmp1, tmp2, tmp3, alpha_fx, frac1; + Word32 enerH_fx; + Word32 enerL_fx; + Word32 Ep_fx[BANDS_MAX]; + Word32 Ep_avrg_fx, Ep_vari_fx; + Word32 Ep_avrgL_fx; + Word32 Ep_peak_fx; + Word32 Ep_tmp_fx[BANDS_MAX]; + Word16 gama_fx; /*Q15 0.85f; */ + Word16 beta_fx; /*Q14 1.05f; */ + Word32 L_band_energy[BANDS_MAX], L_band_energy_tmp[BANDS_MAX]; + UWord16 lo; + Word16 Q_band_energy; +#ifdef BASOP_NOGLOB + Flag Overflow; +#endif /* BASOP_NOGLOB */ + + HQ_DEC_HANDLE hHQ_core = st->hHQ_core; + + set_s( last_bitalloc_max_band, 0, 2 ); + set_f( y2, 0.0f, L_FRAME48k ); + set_l( inp_vector, 0, inner_frame ); + flag_spt = 0; + set_s( prev_SWB_peak_pos_tmp, 0, SPT_SHORTEN_SBNUM ); + bwe_br = st->core_brate; + + + if ( st->bwidth == SWB && ( bwe_br == HQ_16k40 || bwe_br == HQ_13k20 ) ) + { + hqswb_clas = get_next_indice( st, 2 ); + num_bits -= 2; + + *is_transient = 0; + if ( hqswb_clas == HQ_TRANSIENT ) + { + *is_transient = 1; + } + } + else + { + /* decode transient flag */ + *is_transient = get_next_indice( st, 1 ); + num_bits--; + } + + + /* Configure decoder for different bandwidths, bitrates, etc. */ + hq2_core_configure( inner_frame, num_bits, *is_transient, &bands, &length, band_width, band_start, band_end, &L_qint, &eref_fx, &bit_alloc_weight_fx, &gqlevs, &Ngq, &p2a_bands, &p2a_th, &pd_thresh, &ld_slope, &ni_coef, &ni_pd_th, bwe_br ); + + highlength = band_end[bands - 1]; + har_bands = bands; + + if ( st->bwidth == SWB && *is_transient == 0 && ( bwe_br == HQ_16k40 || bwe_br == HQ_13k20 ) ) + { + /* reserve bits for HQ_NORMAL and HQ_HARMONIC */ + if ( hqswb_clas == HQ_NORMAL || hqswb_clas == HQ_HARMONIC ) + { + num_bits -= get_usebit_npswb( hqswb_clas ); + } + + if ( hqswb_clas == HQ_NORMAL ) + { + flag_spt = 1; + } + } + + if ( ( bwe_br == HQ_16k40 || bwe_br == HQ_13k20 ) && st->bwidth == SWB ) + { + if ( hHQ_core->prev_hqswb_clas != HQ_NORMAL ) + { + j = 0; + for ( k = bands - SPT_SHORTEN_SBNUM; k < bands; k++ ) + { + hHQ_core->prev_SWB_peak_pos[j] = 0; + j++; + } + } + } + + /* Spectral energy calculation/quantization */ + ebits = band_energy_dequant( st, band_energy, bands, L_qint, eref_fx, *is_transient ); + + /* simple check: band_energy is too large, Abnormal Situation of bit errors */ + for ( k = 0; k < bands; k++ ) + { + /* Max: 45.0(737279,Q14) at 32kHz, highest band, Min: -6.600037(-108135,Q14) at 8kHz(NB),8kbps, is_transient (-6.7f is safty-threshold) */ + if ( band_energy[k] > 45.0f || band_energy[k] < -6.7f ) + { + st->BER_detect = 1; + set_f( yout, 0, inner_frame ); + return; + } + } + + for ( i = 0; i < bands; i++ ) + { + L_band_energy[i] = (Word32) ( band_energy[i] * pow( 2.0f, SWB_BWE_LR_Qbe ) ); + } + + /* First pass bit budget for TCQ of spectral band information */ + gqbits = (int16_t) log2_f( (float) gqlevs ); + bit_budget = num_bits - (int16_t) ceil( ebits ) - Ngq * gqbits; + + pbits = 0; + if ( st->bwidth == SWB && ( bwe_br == HQ_16k40 || bwe_br == HQ_13k20 ) ) + { + if ( hqswb_clas == HQ_HARMONIC ) + { + set_s( p2a_flags, 1, har_bands ); + } + else + { + /* High band tonality detector based on per band peak-to-average ratio */ + pbits = p2a_threshold_dequant( st, p2a_flags, bands, p2a_bands ); + bit_budget -= pbits; + + if ( hqswb_clas == HQ_NORMAL ) + { + return_bits_normal2( &bit_budget, p2a_flags, bands, bits_lagIndices_modeNormal ); + } + } + } + else + { + /* High band tonality detector based on per band peak-to-average ratio */ + pbits = p2a_threshold_dequant( st, p2a_flags, bands, p2a_bands ); + bit_budget -= pbits; + } + + if ( flag_spt == 1 ) + { + /* initialize the desired parameters for SPT */ + spt_shorten_domain_band_save( bands, band_start, band_end, band_width, org_band_start, org_band_end, org_band_width ); + spt_shorten_domain_pre( band_start, band_end, hHQ_core->prev_SWB_peak_pos, bands, bwe_br, new_band_start, new_band_end, new_band_width ); + spt_shorten_domain_set_dec( st, p2a_flags, new_band_start, new_band_end, new_band_width, bands, band_start, band_end, band_width, &bit_budget ); + } + + /* safety check in case of bit errors */ + if ( bit_budget < 2 ) + { + st->BER_detect = 1; + set_f( yout, 0, inner_frame ); + return; + } + +#define WMC_TOOL_SKIP + /* Estimate number of bits per sub-band */ + Q_band_energy = SWB_BWE_LR_Qbe; + FOR( i = 0; i < bands; i++ ) + { + L_tmp = L_shl( L_band_energy[i], sub( 16, Q_band_energy ) ); /*Q16 */ + + frac1 = L_Extract_lc( L_tmp, &exp ); /* Extract exponent of L_tmp */ + L_tmp = Pow2( 30, frac1 ); + exp = sub( exp, 30 ); + Ep_fx[i] = L_shl( L_tmp, sub( exp, 6 ) ); /* Q -6 */ + Ep[i] = (float) ( Ep_fx[i] / pow( 2.0, -6 ) ); + } + + FOR( i = 0; i < bands; i++ ) + { + L_tmp2 = Ep_fx[i]; + L_tmp = L_max( 1, L_tmp2 ); + exp = norm_l( L_tmp ); + tmp = extract_h( L_shl( L_tmp, exp ) ); + + L_tmp3 = (Word32) band_width[i]; + exp2 = norm_l( L_tmp3 ); + tmp2 = extract_h( L_shl( L_tmp3, exp2 ) ); + + exp2 = sub( exp, exp2 ); /* Denormalize and substract */ + + tmp3 = sub( tmp2, tmp ); + IF( tmp3 > 0 ) + { + tmp2 = shr( tmp2, 1 ); + } + IF( tmp3 > 0 ) + { + exp2 = add( exp2, 1 ); + } + tmp = div_s( tmp2, tmp ); + L_tmp = L_deposit_h( tmp ); + L_tmp = Isqrt_lc1( L_tmp, &exp2 ); + move32(); /*Q(31-exp2) */ + Ep_tmp_fx[i] = L_shr( L_tmp, sub( 15, exp2 ) ); /*Q13 */ + Ep_tmp[i] = (float) ( Ep_tmp_fx[i] / pow( 2.0, 13 ) ); + } +#undef WMC_TOOL_SKIP + + if ( *is_transient == 0 && inner_frame == L_FRAME8k && st->core_brate <= ACELP_13k20 ) + { + /* decode the last p2a_bands-1 subbands bit-allocation index of the previous frame */ + j = 0; + for ( i = 0; i < 2; i++ ) + { + last_bitalloc_max_band[i] = get_next_indice( st, 1 ); + } + +#define WMC_TOOL_SKIP + lowband = 6; + move16(); + trans_bit = 2; + move16(); + bit_budget = sub( bit_budget, trans_bit ); + gama_fx = 27852; /*Q15 0.85f;*/ + beta_fx = 17203; + move16(); /*Q14 1.05f; */ + set_s( &p2a_flags_tmp[bands - trans_bit], 0, 2 ); + + IF( st->core_brate == ACELP_13k20 ) + { + beta_fx = 13107; + move16(); /*14 1.25f; */ + gama_fx = 31130; + move16(); /*0.95f; */ + mvs2s( &p2a_flags[sub( bands, trans_bit )], &p2a_flags_tmp[sub( bands, trans_bit )], trans_bit ); + } + + /* calculate the the low band/high band energy and the variance/avrage of the envelopes */ + Ep_vari_fx = 0; + move32(); + Ep_avrg_fx = 0; + move32(); + Ep_avrgL_fx = 0; + move32(); + Ep_peak_fx = 0; + move32(); + FOR( i = 0; i < bands; i++ ) + { + IF( sub( i, lowband ) >= 0 ) + { + Ep_vari_fx = L_add( Ep_vari_fx, L_abs( L_sub( Ep_tmp_fx[i], Ep_tmp_fx[sub( i, 1 )] ) ) ); /*Q15 */ + Ep_avrg_fx = L_add( Ep_avrg_fx, Ep_tmp_fx[i] ); /*Q15 */ + } + ELSE + { + Ep_avrgL_fx = L_add( Ep_avrgL_fx, Ep_tmp_fx[i] ); /*Q15 */ + IF( L_sub( Ep_tmp_fx[i], Ep_peak_fx ) > 0 ) + { + Ep_peak_fx = Ep_tmp_fx[i]; + move32(); /*Q15 */ + } + } + } + /* modify the last p2a_bands subbands band_energies */ + k = bands; + mvl2l( L_band_energy, L_band_energy_tmp, k ); /*Q_band_energy */ + Mpy_32_16_ss( Ep_peak_fx, 24576, &L_tmp, &lo ); + Mpy_32_16_ss( Ep_peak_fx, shl( sub( bands, lowband ), 9 ), &L_tmp2, &lo ); + Mpy_32_16_ss( Ep_avrg_fx, 1126, &L_tmp3, &lo ); + + IF( ( ( L_sub( L_tmp, L_shr( Ep_avrgL_fx, 1 ) ) < 0 && st->core_brate == ACELP_13k20 ) || st->core_brate < ACELP_13k20 ) && + L_sub( L_tmp2, L_tmp3 ) < 0 && L_sub( L_tmp2, L_shr( Ep_avrg_fx, 7 ) ) > 0 ) + { + FOR( i = lowband; i < bands; i++ ) + { + Mpy_32_16_ss( Ep_avrg_fx, 24576, &L_tmp, &lo ); + IF( L_sub( L_shr( Ep_tmp_fx[i], 1 ), L_tmp ) < 0 ) + { + Mpy_32_16_ss( Ep_peak_fx, sub( bands, lowband ), &L_tmp, &lo ); + tmp = extract_h( L_shl( L_tmp, 14 ) ); /*Q-4 */ + IF( tmp != 0 ) + { + exp = norm_s( tmp ); + tmp = shl( tmp, exp ); /*Q(exp) */ + tmp = div_s( 16384, tmp ); /*Q(15+14-exp=29-exp) */ + exp = sub( 29, exp ); + } + ELSE + { + tmp = 0x7fff; + move16(); + exp = 0; + move16(); + } + Mpy_32_16_ss( Ep_avrg_fx, tmp, &L_tmp, &lo ); + L_tmp = L_shl( L_tmp, sub( 13, exp ) ); /*Q(13+exp-15 +13-exp +4 = 15) */ + L_tmp2 = L_add( L_tmp, 13107 ); /*15 */ + tmp2 = extract_l( L_min( L_max( L_tmp2, 16384 ), gama_fx ) ); /*15 = 15 */ + Mpy_32_16_ss( L_band_energy_tmp[i], tmp2, &L_band_energy_tmp[i], &lo ); + } + } + } + ELSE + { + FOR( i = sub( bands, trans_bit ); i < bands; i++ ) + { + alpha_fx = 16384; + move16(); /*Q14 */ + IF( sub( p2a_flags_tmp[i], 1 ) == 0 ) + { + Mpy_32_16_ss( Ep_tmp_fx[i], sub( bands, lowband ), &L_tmp, &lo ); + tmp = extract_h( L_shl( L_tmp, 14 ) ); /*Q-4 */ + IF( tmp != 0 ) + { + exp = norm_s( tmp ); + tmp = shl( tmp, exp ); /*Q(exp) */ + tmp = div_s( 16384, tmp ); /*Q(15+14-exp=29-exp) */ + exp = sub( 29, exp ); + } + ELSE + { + tmp = 0x7fff; + move16(); + exp = 0; + move16(); + } + Mpy_32_16_ss( Ep_vari_fx, 3277, &L_tmp, &lo ); + Mpy_32_16_ss( L_tmp, tmp, &L_tmp, &lo ); + L_tmp = L_shl( L_tmp, sub( 12, exp ) ); /*Q(13+exp-15 +12-exp +4 = 14) */ + + tmp2 = extract_h( Ep_avrg_fx ); /*Q13-16=-3 */ + IF( tmp2 != 0 ) + { + exp = norm_s( tmp2 ); + tmp2 = shl( tmp2, exp ); /*Q(exp) */ + tmp2 = div_s( 16384, tmp2 ); /*Q(15+14-exp=29-exp) */ + exp = sub( 29, exp ); + } + ELSE + { + /*when the divisor is zero, happens rarely*/ + tmp2 = 0x7fff; + move16(); + exp = 0; + move16(); + } + Mpy_32_16_ss( Ep_vari_fx, 6554, &L_tmp2, &lo ); + Mpy_32_16_ss( L_tmp2, tmp2, &L_tmp2, &lo ); + L_tmp2 = L_shl( L_tmp2, sub( 13, exp ) ); /*Q(13+exp-15 +13-exp +3 = 14) */ + L_tmp = L_min( L_tmp, L_tmp2 ); /*14 */ + tmp = extract_l( L_min( L_tmp, 13107 ) ); /*14 */ + alpha_fx = add( 16384, tmp ); + } + IF( sub( last_bitalloc_max_band[j++], 1 ) == 0 ) + { + Mpy_32_16_ss( Ep_tmp_fx[i], sub( bands, lowband ), &L_tmp, &lo ); + tmp = extract_h( L_shl( L_tmp, 14 ) ); /*Q-2 */ + IF( tmp != 0 ) + { + exp = norm_s( tmp ); + tmp = shl( tmp, exp ); /*Q(exp) */ + tmp = div_s( 16384, tmp ); /*Q(15+14-exp=29-exp) */ + exp = sub( 29, exp ); + } + ELSE + { + tmp = 0x7fff; + move16(); + exp = 0; + move16(); + } + Mpy_32_16_ss( Ep_avrg_fx, tmp, &L_tmp, &lo ); +#ifndef BASOP_NOGLOB + L_tmp = L_shl( L_tmp, sub( 14, exp ) ); /*Q(13+exp-15 +14-exp+2 = 14) */ + L_tmp = L_max( L_tmp, 16384 ); /*14 */ + tmp = extract_l( L_min( L_tmp, beta_fx ) ); /*14 */ + alpha_fx = shl( mult( alpha_fx, tmp ), 1 ); /*14+14-15 +1=14 */ +#else /* BASOP_NOGLOB */ + L_tmp = L_shl_o( L_tmp, sub( 14, exp ), &Overflow ); /*Q(13+exp-15 +14-exp+2 = 14) */ + L_tmp = L_max( L_tmp, 16384 ); /*14 */ + tmp = extract_l( L_min( L_tmp, beta_fx ) ); /*14 */ + alpha_fx = shl( mult( alpha_fx, tmp ), 1 ); /*14+14-15 +1=14 */ +#endif /* BASOP_NOGLOB */ + } + ELSE + { + tmp2 = extract_h( Ep_avrg_fx ); /*13 -16 =-3 */ + IF( tmp2 != 0 ) + { + exp = norm_s( tmp2 ); + tmp2 = shl( tmp2, exp ); /*Q(exp) */ + tmp2 = div_s( 16384, tmp2 ); /*Q(15+14-exp=29-exp) */ + exp = sub( 29, exp ); + } + ELSE + { + /*when the divisor is zero, happens rarely*/ + tmp2 = 0x7fff; + move16(); + exp = 0; + move16(); + } + Mpy_32_16_ss( Ep_tmp_fx[i], tmp2, &L_tmp, &lo ); + L_tmp = L_shl( L_tmp, sub( 19, exp ) ); /*Q(13+exp-15 +19-exp +3 = 20) */ + Mpy_32_16_ss( L_tmp, shl( sub( bands, lowband ), 9 ), &L_tmp, &lo ); + L_tmp = L_max( L_tmp, 13926 ); /*14 */ + tmp2 = extract_l( L_min( L_tmp, 16384 ) ); /*14 */ + alpha_fx = shl( mult( alpha_fx, tmp2 ), 1 ); /*14+14-15+1 =14 */ + } + Mpy_32_16_ss( L_band_energy_tmp[i], alpha_fx, &L_tmp, &lo ); + L_band_energy_tmp[i] = L_shl( L_tmp, 1 ); /*Q(Q_band_energy+14-15 +1= Q_band_energy) */ + } + } + lowband = 3; + move16(); + Ep_avrg_fx = 0; + move32(); + Ep_avrgL_fx = 0; + move32(); + Ep_peak_fx = 0; + move32(); + FOR( i = 0; i < bands; i++ ) + { + IF( sub( i, lowband ) >= 0 ) + { + Ep_avrg_fx = L_add( Ep_avrg_fx, Ep_tmp_fx[i] ); /*Q15 */ + } + ELSE + { + Ep_avrgL_fx = L_add( Ep_avrgL_fx, L_shr( Ep_tmp_fx[i], 1 ) ); /*Q12 */ + IF( L_sub( Ep_tmp_fx[i], Ep_peak_fx ) > 0 ) + { + Ep_peak_fx = Ep_tmp_fx[i]; + move32(); /*Q13 */ + } + } + } + Mpy_32_16_ss( Ep_peak_fx, 28262, &L_tmp, &lo ); + Mpy_32_16_ss( Ep_avrgL_fx, 24576, &L_tmp2, &lo ); + IF( L_sub( L_shr( Ep_avrg_fx, 2 ), L_tmp2 ) > 0 && L_sub( L_shr( Ep_avrg_fx, 4 ), L_tmp2 ) < 0 && L_sub( L_tmp, Ep_avrgL_fx ) > 0 ) + { + adjustFlag = 1; + move16(); + FOR( i = 0; i < lowband; i++ ) + { + tmp = extract_h( Ep_avrgL_fx ); /*Q-4 */ + IF( tmp != 0 ) + { + exp = norm_s( tmp ); + tmp = shl( tmp, exp ); /*Q(exp) */ + tmp = div_s( 16384, tmp ); /*Q(15+14-exp=29-exp) */ + exp = sub( 29, exp ); + } + ELSE + { + tmp = 0x7fff; + move16(); + exp = 0; + move16(); + } + Mpy_32_16_ss( Ep_peak_fx, tmp, &L_tmp, &lo ); + Mpy_32_16_ss( L_tmp, lowband, &L_tmp, &lo ); + Mpy_32_16_ss( L_tmp, 18842, &L_tmp, &lo ); +#ifndef BASOP_NOGLOB + L_tmp = L_shl( L_tmp, sub( 27, exp ) ); /*Q14 0.5 */ + tmp2 = extract_l( L_min( L_tmp, 19661 ) ); /*14 */ +#else /* BASOP_NOGLOB */ + L_tmp = L_shl_o( L_tmp, sub( 27, exp ), &Overflow ); /*Q14 0.5 */ + tmp2 = extract_l( L_min( L_tmp, 19661 ) ); /*14 */ +#endif /* BASOP_NOGLOB */ + Mpy_32_16_ss( L_band_energy_tmp[i], tmp2, &L_tmp, &lo ); +#ifndef BASOP_NOGLOB + L_band_energy_tmp[i] = L_shl( L_tmp, 1 ); /*Q_band_energy */ +#else /* BASOP_NOGLOB */ + L_band_energy_tmp[i] = L_shl_o( L_tmp, 1, &Overflow ); /*Q_band_energy */ +#endif /* BASOP_NOGLOB */ + } + } +#undef WMC_TOOL_SKIP + + for ( i = 0; i < bands; i++ ) + { + band_energy_tmp[i] = (float) ( L_band_energy_tmp[i] / pow( 2.0f, SWB_BWE_LR_Qbe ) ); + } + + hq2_bit_alloc( band_energy_tmp, bands, Rk_fx, &bit_budget, p2a_flags, bit_alloc_weight_fx, band_width, num_bits, hqswb_clas, st->bwidth, *is_transient ); + } + else if ( *is_transient == 0 && inner_frame == L_FRAME16k ) + { +#define WMC_TOOL_SKIP + bit_budget = sub( bit_budget, 2 ); /* bits in high bands to indicate the last 2 subbands is allocated bits or not */ + /* decode the last p2a_bands-1 subbands bit-allocation index of the previous frame */ + for ( i = 0; i < 2; i++ ) + { + last_bitalloc_max_band[i] = get_next_indice( st, 1 ); + } + FOR( i = 0; i < bands; i++ ) + { +#ifndef BASOP_NOGLOB + Ep_tmp_fx[i] = L_shl( Ep_tmp_fx[i], 2 ); +#else /* BASOP_NOGLOB */ + Ep_tmp_fx[i] = L_shl_o( Ep_tmp_fx[i], 2, &Overflow ); +#endif /* BASOP_NOGLOB */ + } + IF( st->core_brate == ACELP_13k20 ) + { + lowband = 8; + move16(); + highband = 15; + move16(); + bw_low = sub( band_start[highband], band_start[lowband] ); + bw_high = sub( add( band_end[sub( bands, 1 )], 1 ), band_start[highband] ); + } + ELSE + { + lowband = 8; + move16(); + highband = 16; + move16(); + bw_low = sub( band_start[highband], band_start[lowband] ); + bw_high = sub( add( band_end[sub( bands, 1 )], 1 ), band_start[highband] ); + } + /* calculate the the low band/high band energy and the variance/avrage of the envelopes */ + enerL_fx = 0; + move32(); + enerH_fx = 0; + move32(); + Ep_vari_fx = 0; + move32(); + Ep_avrg_fx = 0; + move32(); + FOR( i = 0; i < bands; i++ ) + { + IF( sub( i, lowband ) >= 0 && add( sub( i, bands ), p2a_bands ) < 0 ) + { +#ifndef BASOP_NOGLOB + Ep_vari_fx = L_add( Ep_vari_fx, L_abs( L_sub( Ep_tmp_fx[i], Ep_tmp_fx[sub( i, 1 )] ) ) ); /*Q15 */ + Ep_avrg_fx = L_add( Ep_avrg_fx, Ep_tmp_fx[i] ); /*Q15 */ +#else /* BASOP_NOGLOB */ + Ep_vari_fx = L_add_o( Ep_vari_fx, L_abs( L_sub( Ep_tmp_fx[i], Ep_tmp_fx[sub( i, 1 )] ) ), &Overflow ); /*Q15 */ + Ep_avrg_fx = L_add_o( Ep_avrg_fx, Ep_tmp_fx[i], &Overflow ); /*Q15 */ +#endif /* BASOP_NOGLOB */ + } + + IF( sub( i, highband ) >= 0 ) + { + enerH_fx = L_add( enerH_fx, L_shl( Ep_fx[i], 2 ) ); /*Q0 */ + } + ELSE IF( sub( i, lowband ) >= 0 ) + { + enerL_fx = L_add( enerL_fx, L_shl( Ep_fx[i], 2 ) ); /*Q0 */ + } + } + + enerL = (float) ( enerL_fx / pow( 2.0, -4 ) ); + enerH = (float) ( enerH_fx / pow( 2.0, -4 ) ); + /* modify the last p2a_bands subbands band_energies */ + k = bands; + mvl2l( L_band_energy, L_band_energy_tmp, k ); /*Q_band_energy */ + + L_tmp = L_max( enerH_fx, enerL_fx ); + tmp = s_max( bw_low, bw_high ); + i = norm_l( L_tmp ); + j = norm_s( tmp ); + Mpy_32_16_ss( L_shl( enerH_fx, i ), shl( bw_low, j ), &L_tmp, &lo ); + Mpy_32_16_ss( L_shl( enerL_fx, i ), shl( bw_high, j ), &L_tmp2, &lo ); + L_tmp2 = L_sub( L_tmp, L_tmp2 ); + + FOR( i = sub( bands, p2a_bands ); i < bands; i++ ) + { + IF( sub( p2a_flags[i], 1 ) == 0 || L_tmp2 > 0 ) + { + tmp = sub( bands, p2a_bands ); + tmp = sub( tmp, lowband ); /*Q0 */ + +#ifndef BASOP_NOGLOB + tmp1 = extract_h( L_shl( Ep_avrg_fx, 1 ) ); /*Q0 */ +#else + tmp1 = extract_h( L_shl_o( Ep_avrg_fx, 1, &Overflow ) ); /*Q0 */ +#endif + IF( tmp1 != 0 ) + { + exp = norm_s( tmp1 ); + tmp1 = shl( tmp1, exp ); /*Q(exp) */ + tmp1 = div_s( 16384, tmp1 ); /*Q(15+14-exp = 29-exp) */ + exp = sub( 29, exp ); + } + ELSE + { + /*when the divisor is zero, happens rarely*/ + tmp1 = 0x7fff; + move16(); + exp = 0; + move16(); + } + Mpy_32_16_ss( Ep_tmp_fx[i], tmp1, &L_tmp, &lo ); + Mpy_32_16_ss( L_tmp, tmp, &L_tmp, &lo ); + Mpy_32_16_ss( L_tmp, 16384, &L_tmp, &lo ); + L_tmp = L_shl( L_tmp, sub( 32, exp ) ); /*Q15 */ + tmp = extract_l( L_min( L_tmp, 6554 ) ); /*Q15 */ + Mpy_32_16_ss( Ep_vari_fx, tmp1, &L_tmp, &lo ); + Mpy_32_16_ss( L_tmp, tmp, &L_tmp, &lo ); + L_tmp = L_shl( L_tmp, sub( 15, exp ) ); /*Q15 */ + tmp = extract_l( L_shr( L_min( L_tmp, 13107 ), 1 ) ); /*Q14 */ + alpha_fx = add( tmp, 16384 ); /*Q14 */ + } + ELSE + { + alpha_fx = 16384; + move16(); /*Q14 */ + } + + IF( add( sub( i, bands ), p2a_bands ) > 0 ) + { + tmp = sub( bands, p2a_bands ); + IF( sub( last_bitalloc_max_band[sub( i, add( tmp, 1 ) )], 1 ) == 0 ) + { + tmp = sub( tmp, lowband ); + Mpy_32_16_ss( Ep_tmp_fx[i], tmp, &L_tmp, &lo ); +#ifndef BASOP_NOGLOB + tmp = extract_h( L_shl( L_tmp, 16 ) ); /*Q0 */ +#else + tmp = extract_h( L_shl_o( L_tmp, 16, &Overflow ) ); /*Q0 */ +#endif + IF( tmp != 0 ) + { + exp = norm_s( tmp ); + tmp = shl( tmp, exp ); /*Q(exp) */ + tmp = div_s( 16384, tmp ); /*Q(15+14-exp=29-exp) */ + exp = sub( 29, exp ); + } + ELSE + { + tmp = 0x7fff; + move16(); + exp = 0; + move16(); + } + Mpy_32_16_ss( Ep_avrg_fx, tmp, &L_tmp, &lo ); + L_tmp = L_shl( L_tmp, sub( 14, exp ) ); /*Q14 */ + tmp = extract_l( L_min( L_max( L_tmp, 16384 ), 20480 ) ); /*Q14 */ + L_tmp = L_mult( alpha_fx, tmp ); /*Q(14+14+1=29) */ + alpha_fx = extract_l( L_shr( L_tmp, 15 ) ); /*Q14 */ + } + ELSE + { + tmp = sub( tmp, lowband ); + +#ifndef BASOP_NOGLOB + tmp1 = extract_h( L_shl( Ep_avrg_fx, 1 ) ); /*Q0 */ +#else + tmp1 = extract_h( L_shl_o( Ep_avrg_fx, 1, &Overflow ) ); /*Q0 */ +#endif + IF( tmp1 != 0 ) + { + exp = norm_s( tmp1 ); + tmp1 = shl( tmp1, exp ); /*Q(exp) */ + tmp1 = div_s( 16384, tmp1 ); /*Q(15+14-exp=29-exp) */ + exp = sub( 29, exp ); + } + ELSE + { + /*when the divisor is zero, happens rarely*/ + tmp1 = 0x7fff; + move16(); + exp = 0; + move16(); + } + Mpy_32_16_ss( Ep_tmp_fx[i], tmp1, &L_tmp, &lo ); + Mpy_32_16_ss( L_tmp, tmp, &L_tmp, &lo ); + L_tmp = L_shl( L_tmp, sub( 29, exp ) ); /*Q14 */ + tmp = extract_l( L_min( L_max( L_tmp, 13926 ), 16384 ) ); /*Q14 */ + L_tmp = L_mult( alpha_fx, tmp ); /*Q(14+14+1=29) */ + alpha_fx = extract_l( L_shr( L_tmp, 15 ) ); /*Q14 */ + } + } + Mpy_32_16_ss( L_band_energy_tmp[i], alpha_fx, &L_tmp, &lo ); + L_band_energy_tmp[i] = L_shl( L_tmp, 1 ); /*Q Q_band_energy */ + } + lowband = 6; + move16(); + Ep_avrg_fx = 0; + move32(); + Ep_avrgL_fx = 0; + move32(); + Ep_peak_fx = 0; + move32(); + FOR( i = 0; i < bands; i++ ) + { + IF( sub( i, lowband ) >= 0 ) + { +#ifndef BASOP_NOGLOB + Ep_avrg_fx = L_add( Ep_avrg_fx, Ep_tmp_fx[i] ); /*Q15 */ +#else /* BASOP_NOGLOB */ + Ep_avrg_fx = L_add_o( Ep_avrg_fx, Ep_tmp_fx[i], &Overflow ); /*Q15 */ +#endif /* BASOP_NOGLOB */ + } + ELSE + { +#ifndef BASOP_NOGLOB + Ep_avrgL_fx = L_add( Ep_avrgL_fx, Ep_tmp_fx[i] ); /*Q15 */ +#else /* BASOP_NOGLOB */ + Ep_avrgL_fx = L_add_o( Ep_avrgL_fx, Ep_tmp_fx[i], &Overflow ); /*Q15 */ +#endif /* BASOP_NOGLOB */ + IF( L_sub( Ep_tmp_fx[i], Ep_peak_fx ) > 0 ) + { + Ep_peak_fx = Ep_tmp_fx[i]; + move32(); /*Q15 */ + } + } + } + + Mpy_32_16_ss( Ep_peak_fx, 24576, &L_tmp, &lo ); + Mpy_32_16_ss( Ep_peak_fx, 19661, &L_tmp2, &lo ); + Mpy_32_16_ss( Ep_avrgL_fx, 24576, &L_tmp3, &lo ); + + IF( ( L_sub( L_shr( Ep_avrgL_fx, 1 ), Ep_avrg_fx ) > 0 && L_sub( L_tmp, L_shr( Ep_avrgL_fx, 2 ) ) > 0 && L_sub( L_shr( Ep_avrgL_fx, 1 ), L_tmp2 ) < 0 ) || + ( L_sub( L_shr( Ep_avrg_fx, 1 ), Ep_avrgL_fx ) > 0 && L_sub( L_shr( Ep_avrg_fx, 3 ), L_tmp3 ) < 0 && L_sub( L_tmp, L_shr( Ep_avrgL_fx, 2 ) ) > 0 ) ) + { + adjustFlag = 1; + move16(); + FOR( i = 0; i < lowband; i++ ) + { +#ifndef BASOP_NOGLOB + tmp = extract_h( L_shl( Ep_avrgL_fx, 1 ) ); /*Q0 */ +#else + tmp = extract_h( L_shl_o( Ep_avrgL_fx, 1, &Overflow ) ); /*Q0 */ +#endif + IF( tmp != 0 ) + { + exp = norm_s( tmp ); + tmp = shl( tmp, exp ); /*Q(exp) */ + tmp = div_s( 16384, tmp ); /*Q(15+14-exp=29-exp) */ + exp = sub( 29, exp ); + } + ELSE + { + tmp = 0x7fff; + move16(); + exp = 0; + move16(); + } + Mpy_32_16_ss( Ep_peak_fx, tmp, &L_tmp, &lo ); + Mpy_32_16_ss( L_tmp, lowband, &L_tmp, &lo ); + L_tmp = L_shl( L_tmp, sub( 28, exp ) ); /*Q14 0.5 */ + tmp = extract_l( L_min( L_tmp, 19661 ) ); /* Q14 */ + Mpy_32_16_ss( L_band_energy_tmp[i], tmp, &L_tmp, &lo ); + L_band_energy_tmp[i] = L_shl( L_tmp, 1 ); /*Q_band_energy */ + } + } +#undef WMC_TOOL_SKIP + + for ( i = 0; i < bands; i++ ) + { + band_energy_tmp[i] = (float) ( L_band_energy_tmp[i] / pow( 2.0f, SWB_BWE_LR_Qbe ) ); + } + + hq2_bit_alloc( band_energy_tmp, bands, Rk_fx, &bit_budget, p2a_flags, bit_alloc_weight_fx, band_width, num_bits, hqswb_clas, st->bwidth, *is_transient ); + } + else if ( st->bwidth == SWB && hqswb_clas == HQ_HARMONIC && ( bwe_br == HQ_16k40 || bwe_br == HQ_13k20 ) ) + { + hq2_bit_alloc_har( band_energy, bit_budget, bands, Rk_fx, p2a_bands, bwe_br, p2a_flags, band_width ); + } + else + { + hq2_bit_alloc( band_energy, bands, Rk_fx, &bit_budget, p2a_flags, bit_alloc_weight_fx, band_width, num_bits, hqswb_clas, st->bwidth, *is_transient ); + } + + if ( bit_budget < 0 ) + { + st->BER_detect = 1; + bit_budget = 0; + } + + tcq_core_LR_dec( st, inp_vector, bit_budget, bands, band_start, band_width, Rk_fx, npulses, k_sort, p2a_flags, p2a_bands, last_bitalloc_max_band, inner_frame, adjustFlag, is_transient ); + + /* Prepare floating Rk for next modules */ + for ( k = 0; k < bands; k++ ) + { + Rk[k] = WORD322FL_SCALE( Rk_fx[k], SWB_BWE_LR_QRk - 1 ); + } + + /* Denormalize the coded MDCT spectrum */ + mdct_spectrum_denorm( inp_vector, y2, band_start, band_end, band_width, band_energy, npulses, bands, ld_slope, pd_thresh ); + + /* Apply fine gain to denormalized coded spectrum */ + mdct_spectrum_fine_gain_dec( st, y2, band_start, band_end, k_sort, bands, L_qint, Ngq, gqlevs, gqbits ); + + /*restore the band information */ + if ( flag_spt == 1 ) + { + spt_shorten_domain_band_restore( bands, band_start, band_end, band_width, org_band_start, org_band_end, org_band_width ); + } + + mvr2r( y2, y2_org, L_FRAME32k ); + + /* Inject noise into components having relatively low pulse energy per band */ + ni_seed = npulses[0] + npulses[1] + npulses[2] + npulses[3]; + + for ( i = 0; i < band_end[bands - 1] + 1; i++ ) + y2_ni[i] = y2[i]; + hq2_noise_inject( y2_ni, band_start, band_end, band_width, Ep, Rk, npulses, ni_seed, bands, 0, bw_low, bw_high, enerL, enerH, hHQ_core->last_ni_gain, hHQ_core->last_env, &hHQ_core->last_max_pos_pulse, p2a_flags, p2a_bands, hqswb_clas, st->bwidth, bwe_br ); + + if ( st->bwidth == SWB && ( bwe_br == HQ_16k40 || bwe_br == HQ_13k20 ) ) + { + if ( hqswb_clas == HQ_NORMAL || hqswb_clas == HQ_HARMONIC ) + { + preset_hq2_swb( hqswb_clas, band_end, &har_bands, p2a_bands, length, bands, &lowlength, &highlength, m ); + + /*Gap filling for the core coder*/ + swb_bwe_dec_lr( st, y2, m, bwe_br, bands, band_start, band_end, band_energy, p2a_flags, hqswb_clas, lowlength, highlength, har_bands, &hHQ_core->prev_frm_hfe2, &hHQ_core->prev_stab_hfe2, band_width, y2_ni, &ni_seed ); + + post_hq2_swb( m, lowlength, highlength, hqswb_clas, har_bands, bands, p2a_flags, band_start, band_end, y2, npulses ); + + if ( hqswb_clas == HQ_NORMAL ) + { + spt_swb_peakpos_tmp_save( y2, bands, band_start, band_end, prev_SWB_peak_pos_tmp ); + for ( k = 0; k < SPT_SHORTEN_SBNUM; k++ ) + { + if ( p2a_flags[bands - SPT_SHORTEN_SBNUM + k] == 0 || npulses[bands - SPT_SHORTEN_SBNUM + k] == 0 ) + { + prev_SWB_peak_pos_tmp[k] = 0; + } + } + } + + mvr2r( y2_ni, y2, lowlength ); + } + else + { + mvr2r( y2_ni, y2, band_end[bands - 1] + 1 ); /* HQ_TRANSIENT */ + } + } + else + { + mvr2r( y2_ni, y2, band_end[bands - 1] + 1 ); /* NB, WB */ + } + + + /* bandwidth switching */ + if ( !( st->last_inner_frame >= L_FRAME16k && st->bws_cnt > 0 ) ) + { + k1 = *is_transient ? bands - 2 : bands - 6; + st->prev_ener_shb = 0.0f; + + for ( i = k1; i < bands; i++ ) + { + st->prev_ener_shb += Ep_tmp[i] / ( bands - k1 ); + } + } + + if ( st->last_inner_frame >= L_FRAME32k && st->hBWE_FD != NULL ) + { + set_f( st->hBWE_FD->prev_SWB_fenv, st->prev_ener_shb, SWB_FENV ); + } + + updat_prev_frm( y2, yout, bwe_br, length, inner_frame, bands, st->bwidth, *is_transient, hqswb_clas, &hHQ_core->prev_hqswb_clas, hHQ_core->prev_SWB_peak_pos, prev_SWB_peak_pos_tmp, &hHQ_core->prev_frm_hfe2, &hHQ_core->prev_stab_hfe2, st->bws_cnt ); + + return; +} + + +/*------------------------------------------------------------------------------------ + * small_symbol_dec_tran() + * + * Huffman decoding of differential energies + *--------------------------------------------------------------------------------------*/ + +/*! r: bits */ +static int16_t small_symbol_dec_tran( + Decoder_State *st, /* i/o: decoder state structure */ + int16_t *qbidx, /* o : output of dequantized differential energy */ + const int16_t bands, /* i : number of bands */ + const int16_t is_transient /* i : transient flag */ +) +{ + int16_t i, bits; + int16_t difidx[BANDS_MAX]; + + /* Decoding differential energies*/ + bits = decode_envelope_indices( st, 0, bands, 0, difidx, LOW_RATE_HQ_CORE_TRAN, is_transient ); + bits += BITS_DE_FCOMP; + + /* counting 1 bit for band_energy_huff_coding_mode */ + bits += BITS_DE_HMODE; + + /* converting to original values */ + for ( i = 0; i < bands; i++ ) + { + qbidx[i] = difidx[i] - LRMDCT_BE_OFFSET; + } + + return ( bits ); +} + + +/*-------------------------------------------------------------------------- + * small_symbol_dec() + * + * Huffman decoding of differential energies (MSB and LSB) + *--------------------------------------------------------------------------*/ + +/*! r: bits */ +static int16_t small_symbol_dec( + Decoder_State *st, /* i/o: decoder state structure */ + int16_t *qbidx, /* o : output of dequantized differential energy */ + const int16_t bands, /* i : number of bands */ + const int16_t is_transient ) +{ + int16_t i, LSB, bits; + int16_t difidx[BANDS_MAX]; + + /* Decoding MSB bits */ + bits = decode_envelope_indices( st, 0, bands, 0, difidx, LOW_RATE_HQ_CORE, is_transient ); + bits += BITS_DE_FCOMP; + + /* counting 1 bit for band_energy_huff_coding_mode */ + bits += BITS_DE_HMODE; + + /* Decoding LSB bit packing */ + for ( i = 0; i < bands; ++i ) + { + LSB = get_next_indice( st, BITS_DE_LSB ); + difidx[i] = ( difidx[i] << 1 ) | LSB; + } + + /* counting bits for LSB */ + bits += bands; + + /* converting to original values */ + for ( i = 1; i < bands; ++i ) + { + qbidx[i] = difidx[i] - DE_OFFSET1; + } + + qbidx[0] = difidx[0] - DE_OFFSET0; + + return ( bits ); +} + +/*-------------------------------------------------------------------------- + * decode_huff_8s() + * + * + *--------------------------------------------------------------------------*/ + +static int16_t decode_huff_8s( + Decoder_State *st, + const int16_t *hufftab, + int16_t *rbits ) +{ + int16_t bit; + + while ( *hufftab > 0 ) + { + *rbits += ( *hufftab & 0xf ); + bit = get_next_indice( st, *hufftab & 0xf ); + hufftab += ( *hufftab >> 4 ) + bit; + } + + return ( -*hufftab ); +} + + +/*-------------------------------------------------------------------------- + * large_symbol_dec() + * + * + *--------------------------------------------------------------------------*/ + +/*! r: bits */ +static int16_t large_symbol_dec( + Decoder_State *st, /* i/o: decoder state structure */ + int16_t *qbidx, /* o : output of dequantized differential energy */ + const int16_t bands /* i : number of bands */ +) +{ + int16_t i, bits; + int16_t LSB[BANDS_MAX]; + int16_t basic_shift, cntbits, ns2mode; + int16_t pos_outlyer; + int16_t ns2mode0, ns2mode1; + + cntbits = BITS_DE_8SMODE; + ns2mode = get_next_indice( st, BITS_DE_8SMODE ); + + if ( ns2mode == 0 ) + { + ns2mode0 = get_next_indice( st, BITS_DE_8SMODE_N0 ); + ns2mode1 = get_next_indice( st, BITS_DE_8SMODE_N1 ); + cntbits += BITS_DE_8SMODE_N0 + BITS_DE_8SMODE_N1; + + if ( ns2mode0 == 0 ) + { + if ( ns2mode1 == 1 ) + { + pos_outlyer = get_next_indice( st, BITS_DE_8SPOS ); + cntbits += BITS_DE_8SPOS; + qbidx[pos_outlyer] = get_next_indice( st, BITS_ABS_ENG ) - ABS_ENG_OFFSET; + cntbits += BITS_ABS_ENG; + } + else + { + pos_outlyer = -1; + } + + for ( i = 0; i < pos_outlyer; ++i ) + { + bits = 0; + qbidx[i] = decode_huff_8s( st, hestable, &bits ) - 4; + cntbits += bits; + } + + for ( i = pos_outlyer + 1; i < bands; ++i ) + { + bits = 0; + qbidx[i] = decode_huff_8s( st, hestable, &bits ) - 4; + cntbits += bits; + } + } + else + { + if ( ns2mode1 == 1 ) + { + pos_outlyer = get_next_indice( st, BITS_DE_8SPOS ); + cntbits += BITS_DE_8SPOS; + qbidx[0] = get_next_indice( st, BITS_ABS_ENG ) - ABS_ENG_OFFSET; + cntbits += BITS_ABS_ENG; + qbidx[pos_outlyer] = get_next_indice( st, BITS_ABS_ENG ) - ABS_ENG_OFFSET; + cntbits += BITS_ABS_ENG; + } + else + { + pos_outlyer = 0; + qbidx[0] = get_next_indice( st, BITS_ABS_ENG ) - ABS_ENG_OFFSET; + cntbits += BITS_ABS_ENG; + } + + for ( i = 1; i < pos_outlyer; ++i ) + { + bits = 0; + qbidx[i] = decode_huff_8s( st, hestable, &bits ) - 4; + cntbits += bits; + } + + for ( i = pos_outlyer + 1; i < bands; ++i ) + { + bits = 0; + qbidx[i] = ( decode_huff_8s( st, hestable, &bits ) - 4 ); + cntbits += bits; + } + } + } + else + { + basic_shift = get_next_indice( st, BITS_MAX_DEPTH ); + cntbits += BITS_MAX_DEPTH; + + for ( i = 0; i < bands; ++i ) + { + bits = 0; + qbidx[i] = decode_huff_8s( st, hestable, &bits ) - 4; + qbidx[i] = qbidx[i] << basic_shift; + cntbits += bits; + } + + for ( i = 0; i < bands; ++i ) + { + LSB[0] = get_next_indice( st, basic_shift ); + qbidx[i] += LSB[0]; + cntbits += basic_shift; + } + } + + return cntbits; /* xx bits for diff. energies + 1 bit for LC coding mode */ +} + + +/*--------------------------------------------------------------------------* + * band_energy_dequant() + * + * + *--------------------------------------------------------------------------*/ + +static float band_energy_dequant( + Decoder_State *st, /* i/o: decoder state structure */ + float band_energy[], + const int16_t bands, + const Word32 L_qint, /* Q29 */ + const Word16 eref_fx, /* Q10 */ + const int16_t is_transient ) +{ + int16_t k; + int16_t deng_cmode; + int16_t bq0; + int16_t bq1[BANDS_MAX], bq2[BANDS_MAX]; + float deng_bits; + Word32 L_band_energy[BANDS_MAX]; /* SWB_BWE_LR_Qbe */ + Word16 exp_normd; + Word16 rev_qint_fx; + Word16 Qrev_qint; + + /* parsing energy difference coding mode */ + deng_cmode = get_next_indice( st, BITS_DE_CMODE ); + + if ( deng_cmode == 0 ) + { + deng_bits = (float) large_symbol_dec( st, bq2, bands ); + + /* counting 1 bit for deng coding mode */ + deng_bits += BITS_DE_CMODE; + } + else + { + if ( is_transient ) + { + deng_bits = (float) small_symbol_dec_tran( st, bq2, bands, is_transient ); + } + else + { + deng_bits = (float) small_symbol_dec( st, bq2, bands, is_transient ); + } + + /* counting 1 bit for deng coding mode */ + deng_bits += BITS_DE_CMODE; + } + +#define WMC_TOOL_SKIP + /* Get the reference energy */ + exp_normd = norm_l( L_qint ); + rev_qint_fx = div_s( 0x4000, round_fx( L_shl( L_qint, exp_normd ) ) ); /* Q14-(29+exp_normd-16)+15 */ + Qrev_qint = sub( 14 - ( 29 - 16 ) + 15, exp_normd ); + + bq0 = (int16_t) round_fx( L_shl( L_mult( eref_fx, rev_qint_fx ), sub( 5, Qrev_qint ) ) ); /* 16-(10+Qrev_qint+1) */ +#undef WMC_TOOL_SKIP + + /* Reconstruct quantized spectrum */ + bq1[0] = bq2[0] + bq0; + for ( k = 1; k < bands; k++ ) + { + bq1[k] = bq2[k] + bq1[k - 1]; + } + + for ( k = 0; k < bands; k++ ) + { +#define WMC_TOOL_SKIP + L_band_energy[k] = L_mls( L_qint, bq1[k] ); + move32(); /* 29+0-15 -> Qbe(Q14) */ + band_energy[k] = (float) ( L_band_energy[k] / pow( 2.0f, SWB_BWE_LR_Qbe ) ); +#undef WMC_TOOL_SKIP + } + + if ( is_transient ) + { + reverse_transient_frame_energies( band_energy, bands ); + } + + return ( deng_bits ); +} + + +/*--------------------------------------------------------------------------* + * p2a_threshold_dequant() + * + * + *--------------------------------------------------------------------------*/ + +static int16_t p2a_threshold_dequant( + Decoder_State *st, /* i/o: decoder state structure */ + int16_t *p2a_flags, + const int16_t bands, + const int16_t p2a_bands ) +{ + int16_t j, k; + + for ( k = 0; k < bands - p2a_bands; k++ ) + { + p2a_flags[k] = 1; + } + + j = 0; + for ( k = bands - p2a_bands; k < bands; k++ ) + { + p2a_flags[k] = get_next_indice( st, 1 ); + j++; + } + + return ( j ); +} + + +/*--------------------------------------------------------------------------* + * mdct_spectrum_fine_gain_dec() + * + * + *--------------------------------------------------------------------------*/ + +static void mdct_spectrum_fine_gain_dec( + Decoder_State *st, /* i/o: decoder state structure */ + float y2[], + const int16_t band_start[], + const int16_t band_end[], + const int16_t k_sort[], + const int16_t bands, + const Word32 L_qint, + const int16_t Ngq, + const int16_t gqlevs, + const int16_t gqbits ) +{ + int16_t i, k, imin; + float gamma; + float gain_table[MAX_GQLEVS]; + Word16 exp_normn, exp_normd; + Word16 delta_fx, Qdelta; + Word32 L_delta, L_q; + Word32 L_temp; + Word16 gain_table_fx[MAX_GQLEVS]; + Word16 Qgt; + Word16 temp_lo_fx, temp_hi_fx; + +#define WMC_TOOL_SKIP + /* Fine gain quantization on only the most significant energy bands */ + /*delta = qint / gqlevs; */ + exp_normn = norm_l( L_qint ); + exp_normn = sub( exp_normn, 1 ); + exp_normd = norm_s( gqlevs ); + delta_fx = div_l( L_shl( L_qint, exp_normn ), shl( gqlevs, exp_normd ) ); + Qdelta = add( sub( exp_normn, exp_normd ), 28 ); /* 29+exp_normn-(exp_normd)-1; */ + L_delta = L_shl( L_deposit_h( delta_fx ), sub( 13, Qdelta ) ); + /*q = (-qint + delta) / 2.0f; */ + L_q = L_shr( L_sub( L_delta, L_qint ), 1 ); + + FOR( i = 0; i < gqlevs; i++ ) + { + /*gain_table[i] = (float) pow (2.0f, q * 0.5f); */ + L_temp = L_shr( L_shr( L_q, 1 ), sub( 29, 16 ) ); + temp_lo_fx = L_Extract_lc( L_temp, &temp_hi_fx ); + Qgt = sub( 14, temp_hi_fx ); + gain_table_fx[i] = extract_l( Pow2( 14, temp_lo_fx ) ); /* Qgt */ + + /*q += delta; */ + L_q = L_add( L_q, L_delta ); + gain_table_fx[i] = shl( gain_table_fx[i], sub( 14, Qgt ) ); /* Qgt -> Q14 */ + gain_table[i] = (float) ( gain_table_fx[i] / pow( 2.0f, 14 ) ); + } +#undef WMC_TOOL_SKIP + + for ( k = bands - Ngq; k < bands; k++ ) + { + imin = get_next_indice( st, gqbits ); + gamma = gain_table[imin]; + + for ( i = band_start[k_sort[k]]; i <= band_end[k_sort[k]]; i++ ) + { + y2[i] *= gamma; + } + } + + return; +} + +/*--------------------------------------------------------------------------* + * spt_shorten_domain_set_dec() + * + * update the shorten band information based on p2a analysis + *--------------------------------------------------------------------------*/ + +static void spt_shorten_domain_set_dec( + Decoder_State *st, /* i : decoder state structure */ + const int16_t p2a_flags[], /* i : p2a anlysis information */ + const int16_t new_band_start[], /* i : new band start position */ + const int16_t new_band_end[], /* i : new band end position */ + const int16_t new_band_width[], /* i : new subband band width */ + const int16_t bands, /* i : total number of subbands */ + int16_t band_start[], /* o : band start position */ + int16_t band_end[], /* o : band end position */ + int16_t band_width[], /* o : sub band band width */ + int16_t *bit_budget /* i/o: bit budget */ +) +{ + int16_t j, k; + int16_t spt_shorten_flag[SPT_SHORTEN_SBNUM]; + + j = 0; + for ( k = bands - SPT_SHORTEN_SBNUM; k < bands; k++ ) + { + spt_shorten_flag[j] = 0; + if ( p2a_flags[k] == 1 ) + { + spt_shorten_flag[j] = get_next_indice( st, 1 ); + *bit_budget -= 1; + if ( spt_shorten_flag[j] == 1 ) + { + band_start[k] = new_band_start[j]; + band_end[k] = new_band_end[j]; + band_width[k] = new_band_width[j]; + } + } + + j++; + } + + return; +} diff --git a/lib_dec/igf_dec.c b/lib_dec/igf_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..e5903902e00398ee9d8f3e5f49ecbe0a100d879e --- /dev/null +++ b/lib_dec/igf_dec.c @@ -0,0 +1,1621 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include "options.h" +#include +#include "prot.h" +#include "cnst.h" +#include "stat_dec.h" +#include "ivas_prot.h" +#include "wmc_auto.h" + + +/*-------------------------------------------------------------------* + * IGF_replaceTCXNoise_1() + * + * measures TCX noise + *-------------------------------------------------------------------*/ + +/*! r: number of noise bands */ +static int16_t IGF_replaceTCXNoise_1( + const float *in, /* i : MDCT spectrum */ + const uint8_t *TCXNoise, /* i : tcx noise indicator vector */ + const int16_t start, /* i : start MDCT subband index */ + const int16_t stop, /* i : stop MDCT subband index */ + float *totalNoiseNrg /* o : measured noise energy */ +) +{ + int16_t sb; + int16_t noise; + float nE; + float val; + + noise = 0; + nE = FLT_MIN; + + for ( sb = start; sb < stop; sb++ ) + { + val = in[sb] * TCXNoise[sb]; + nE += val * val; + noise += TCXNoise[sb]; + } + + *totalNoiseNrg = nE; + + return noise; +} + + +/*-------------------------------------------------------------------* + * IGF_replaceTCXNoise_2() + * + * replaces TCX noise + *-------------------------------------------------------------------*/ + +static void IGF_replaceTCXNoise_2( + float *in, /* i/o: MDCT spectrum */ + const uint8_t *TCXNoise, /* i : tcx noise indicator vector */ + const int16_t start, /* i : start MDCT subband index */ + const int16_t stop, /* i : stop MDCT subband index */ + float totalNoiseNrg, /* i : measured noise energy */ + int16_t *nfSeed /* i/o: random generator noise seed */ +) +{ + int16_t sb; + float rE; + float g; + float val; + + rE = FLT_MIN; + for ( sb = start; sb < stop; sb++ ) + { + if ( TCXNoise[sb] ) + { + val = (float) own_random( nfSeed ); + in[sb] = val; + rE += val * val; + } + } + + g = (float) sqrt( totalNoiseNrg / rE ); + + for ( sb = start; sb < stop; sb++ ) + { + if ( TCXNoise[sb] ) + { + in[sb] *= g; + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * IGF_replaceTCXNoise_2_new() + * + * + *-------------------------------------------------------------------*/ + +static void IGF_replaceTCXNoise_2_new( + float *in, /* i/o: MDCT spectrum */ + const uint8_t *TCXNoise, /* i : tcx noise indicator vector */ + const int16_t start, /* i : start MDCT subband index */ + const int16_t stop, /* i : stop MDCT subband index */ + float totalNoiseNrg, /* i : measured noise energy */ + int16_t n_noise_bands, /* i : number of noise bands in src */ + int16_t *nfSeed /* i/o: random generator noise seed */ +) +{ + int16_t sb; + float rE; + float g; + float val; + int16_t n_noise_bands_tile; + float noise_band_ratio; + + rE = FLT_MIN; + n_noise_bands_tile = 0; + for ( sb = start; sb < stop; sb++ ) + { + if ( TCXNoise[sb] ) + { + val = (float) own_random( nfSeed ); + in[sb] = val; + rE += val * val; + n_noise_bands_tile++; + } + } + + rE = max( rE, 1.f ); + + if ( n_noise_bands_tile ) + { + noise_band_ratio = (float) n_noise_bands_tile / n_noise_bands; + g = (float) sqrt( totalNoiseNrg * noise_band_ratio / rE ); + + for ( sb = start; sb < stop; sb++ ) + { + if ( TCXNoise[sb] ) + { + in[sb] *= g; + } + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * IGF_decode_whitening_level() + * + * reads whitening levels + *-------------------------------------------------------------------*/ + +static void IGF_decode_whitening_level( + Decoder_State *st, /* i : decoder state */ + IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData, /* i/o: instance handle of IGF Deccoder */ + const int16_t p /* i : tile index, p = [0, 3] */ +) +{ + int16_t tmp; + + tmp = get_next_indice( st, 1 ); + + if ( tmp == 1 ) + { + tmp = get_next_indice( st, 1 ); + if ( tmp == 1 ) + { + hPrivateData->currWhiteningLevel[p] = IGF_WHITENING_STRONG; + } + else + { + hPrivateData->currWhiteningLevel[p] = IGF_WHITENING_OFF; + } + } + else + { + hPrivateData->currWhiteningLevel[p] = IGF_WHITENING_MID; + } + + return; +} + + +/*-------------------------------------------------------------------* + * IGF_getMDCTSquare() + * + * square the MDCT spectrum + *-------------------------------------------------------------------*/ + +static void IGF_getMDCTSquare( + const int16_t startLine, /* i : start MDCT subband index */ + const int16_t stopLine, /* i : stop MDCT subband index */ + const float *pSpectralData, /* i : MDCT spectrum */ + float *pSpecDataSqaure /* o : Squared MDCT spectrum */ +) +{ + int16_t i; + + for ( i = startLine; i < stopLine; i++ ) + { + pSpecDataSqaure[i] = pSpectralData[i] * pSpectralData[i]; + } + + return; +} + + +/*-------------------------------------------------------------------* + * IGF_calcSfbEnergy() + * + * calculate energy per SFB + *-------------------------------------------------------------------*/ + +static void IGF_calcSfbEnergy( + const int16_t startSfb, /* i : start sfb index */ + const int16_t stopSfb, /* i : stop sfb index */ + const int16_t *swb_offset, /* i : IGF swb offset table */ + const float *pPowerSpectrum, /* i : power spectrum */ + float *sfbEnergy /* o : SFB energies, will be initialized inside this function */ +) +{ + int16_t sfb; + int16_t line; + + for ( sfb = startSfb; sfb < stopSfb; sfb++ ) + { + sfbEnergy[sfb] = 0.f; + + for ( line = swb_offset[sfb]; line < swb_offset[sfb + 1]; line++ ) + { + sfbEnergy[sfb] += pPowerSpectrum[line]; + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * IGF_setLinesToZero() + * + * set power spectrum values to zero, needed for energy calculation + *-------------------------------------------------------------------*/ + +static void IGF_setLinesToZero( + const int16_t startLine, /* i : start MDCT subband index */ + const int16_t stopLine, /* i : stop MDCT subband index */ + const float *pSpectralData, /* i : original MDCT spectrum */ + float *squareSpecIGF /* i/o: prepared IGF energy spectrum */ +) +{ + int16_t i; + + for ( i = startLine; i < stopLine; i++ ) + { + if ( pSpectralData[i] != 0.f ) + { + squareSpecIGF[i] = 0.f; + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * IGF_prep() + * + * prepare IGF spectrum + *-------------------------------------------------------------------*/ + +static void IGF_prep( + IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData, /* i : IGF private data handle */ + const int16_t igfGridIdx, /* i : in case of CELP->TCX switching, use 1.25 framelength */ + const uint8_t *TCXNoise, /* i : TCX noise vector */ + float *igf_spec, /* o : prepared IGF spectrum */ + float *src_spec, /* i : source spectrum */ + const int16_t element_mode /* i : IVAS element mode */ +) +{ + H_IGF_GRID hGrid; + H_IGF_INFO hInfo; + int16_t i, tb, sfb, strt_cpy, tile_idx; + int16_t *swb_offset; + float *sel_spec; + + hInfo = &hPrivateData->igfInfo; + hGrid = &hPrivateData->igfInfo.grid[igfGridIdx]; + swb_offset = hGrid->swb_offset; + + for ( tile_idx = 0; tile_idx < hGrid->nTiles; tile_idx++ ) + { + int16_t tile_width, stop; + + strt_cpy = hGrid->sbWrap[tile_idx]; + + if ( element_mode > EVS_MONO ) + { + tile_width = swb_offset[hGrid->sfbWrap[tile_idx + 1]] - swb_offset[hGrid->sfbWrap[tile_idx]]; + stop = strt_cpy + tile_width; + } + else + { + stop = hGrid->startLine; + } + + if ( IGF_WHITENING_STRONG == hPrivateData->currWhiteningLevel[tile_idx] ) + { + float abs_sum; + abs_sum = 0.f; + + for ( i = strt_cpy; i < stop; i++ ) + { + abs_sum += (float) fabs( src_spec[i] ); + } + + tb = swb_offset[hGrid->sfbWrap[tile_idx]]; + + if ( abs_sum > 0.f ) + { + for ( i = strt_cpy; i < stop; i++ ) + { + igf_spec[tb++] = own_random( hInfo->nfSeed ); + } + } + else + { + for ( i = strt_cpy; i < stop; i++ ) + { + igf_spec[tb++] = 0.f; + } + } + } + else + { + if ( IGF_WHITENING_MID == hPrivateData->currWhiteningLevel[tile_idx] ) + { + if ( element_mode > EVS_MONO ) + { + if ( hPrivateData->n_noise_bands ) + { + IGF_replaceTCXNoise_2_new( igf_spec, TCXNoise, strt_cpy, stop, hPrivateData->totalNoiseNrg, hPrivateData->n_noise_bands, hInfo->nfSeed ); + } + } + else + { + if ( hPrivateData->n_noise_bands ) + { + IGF_replaceTCXNoise_2( igf_spec, TCXNoise, hGrid->minSrcSubband, hGrid->startLine, hPrivateData->totalNoiseNrg, hInfo->nfSeed ); + } + } + + sel_spec = igf_spec; + } + else + { + if ( element_mode > EVS_MONO ) + { + if ( hPrivateData->n_noise_bands_off ) + { + IGF_replaceTCXNoise_2_new( src_spec, TCXNoise, strt_cpy, stop, hPrivateData->totalNoiseNrg_off, hPrivateData->n_noise_bands_off, hInfo->nfSeed ); + } + } + else + { + if ( hPrivateData->n_noise_bands_off ) + { + IGF_replaceTCXNoise_2( src_spec, TCXNoise, hGrid->minSrcSubband, hGrid->startLine, hPrivateData->totalNoiseNrg_off, hInfo->nfSeed ); + } + } + + sel_spec = src_spec; + } + for ( sfb = hGrid->sfbWrap[tile_idx]; sfb < hGrid->sfbWrap[tile_idx + 1]; sfb++ ) + { + for ( tb = swb_offset[sfb]; tb < swb_offset[sfb + 1]; tb++ ) + { + igf_spec[tb] = sel_spec[strt_cpy]; + strt_cpy++; + } + } + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * IGF_prepStereo() + * + * + *-------------------------------------------------------------------*/ + +static void IGF_prepStereo( + IGF_DEC_PRIVATE_DATA_HANDLE hPrivateDataL, /* i : IGF private data handle */ + IGF_DEC_PRIVATE_DATA_HANDLE hPrivateDataR, /* i : IGF private data handle */ + const int16_t igfGridIdx, /* i : in case of CELP->TCX switching, use 1.25 framelength */ + const uint8_t *TCXNoiseL, /* i : TCX noise vector */ + const uint8_t *TCXNoiseR, /* i : TCX noise vector */ + float *igf_specL, /* o : prepared IGF spectrum */ + float *igf_specR, /* o : prepared IGF spectrum */ + float *src_specL, /* i : source spectrum */ + float *src_specR, /* i : source spectrum */ + const int16_t *coreMsMask /* i : line wise ms Mask */ +) +{ + H_IGF_GRID hGrid; + H_IGF_INFO hInfoL, hInfoR; + int16_t tb, sfb, strt_cpy, tile_idx; + int16_t *swb_offset; + float *sel_specL = NULL; + float *sel_specR = NULL; + const float c = SQRT2_OVER_2; /* M/S scaling factor */ + + hInfoL = &hPrivateDataL->igfInfo; + hInfoR = &hPrivateDataR->igfInfo; + hGrid = &hPrivateDataL->igfInfo.grid[igfGridIdx]; + swb_offset = hGrid->swb_offset; + + for ( tile_idx = 0; tile_idx < hGrid->nTiles; tile_idx++ ) + { + int16_t tile_width, stop; + strt_cpy = hGrid->sbWrap[tile_idx]; + + tile_width = swb_offset[hGrid->sfbWrap[tile_idx + 1]] - swb_offset[hGrid->sfbWrap[tile_idx]]; + stop = strt_cpy + tile_width; + + if ( IGF_WHITENING_STRONG == hPrivateDataL->currWhiteningLevel[tile_idx] ) + { + tb = swb_offset[hGrid->sfbWrap[tile_idx]]; + + for ( tb = swb_offset[hGrid->sfbWrap[tile_idx]]; tb < swb_offset[hGrid->sfbWrap[tile_idx + 1]]; tb++ ) + { + igf_specL[tb] = own_random( hInfoL->nfSeed ); + } + } + else + { + if ( IGF_WHITENING_MID == hPrivateDataL->currWhiteningLevel[tile_idx] ) + { + if ( hPrivateDataL->n_noise_bands ) + { + IGF_replaceTCXNoise_2_new( igf_specL, TCXNoiseL, strt_cpy, stop, hPrivateDataL->totalNoiseNrg, hPrivateDataL->n_noise_bands, hInfoL->nfSeed ); + } + sel_specL = igf_specL; + } + else + { + if ( hPrivateDataL->n_noise_bands_off ) + { + IGF_replaceTCXNoise_2_new( igf_specL, TCXNoiseL, strt_cpy, stop, hPrivateDataL->totalNoiseNrg_off, hPrivateDataL->n_noise_bands_off, hInfoL->nfSeed ); + } + sel_specL = src_specL; + } + + if ( IGF_WHITENING_MID == hPrivateDataL->currWhiteningLevel[tile_idx] ) + { + if ( hPrivateDataR->n_noise_bands ) + { + IGF_replaceTCXNoise_2_new( igf_specR, TCXNoiseR, strt_cpy, stop, hPrivateDataR->totalNoiseNrg, hPrivateDataR->n_noise_bands, hInfoR->nfSeed ); + } + sel_specR = igf_specR; + } + else + { + if ( hPrivateDataR->n_noise_bands_off ) + { + IGF_replaceTCXNoise_2_new( igf_specR, TCXNoiseR, strt_cpy, stop, hPrivateDataR->totalNoiseNrg_off, hPrivateDataR->n_noise_bands_off, hInfoR->nfSeed ); + } + sel_specR = src_specR; + } + + for ( sfb = hGrid->sfbWrap[tile_idx]; sfb < hGrid->sfbWrap[tile_idx + 1]; sfb++ ) + { + for ( tb = swb_offset[sfb]; tb < swb_offset[sfb + 1]; tb++ ) + { + + if ( coreMsMask[tb] == 0 ) + { + if ( coreMsMask[strt_cpy] == 0 ) /* LR->LR */ + { + igf_specL[tb] = sel_specL[strt_cpy]; + } + else /* MS/DR -> LR */ + { + igf_specL[tb] = ( sel_specL[strt_cpy] + sel_specR[strt_cpy] ) * c; + } + } + else + { + if ( coreMsMask[strt_cpy] == 0 ) /* LR->MS/DR */ + { + igf_specL[tb] = ( sel_specL[strt_cpy] + sel_specR[strt_cpy] ) * c; + } + else /* MS/DR -> MS/DR */ + { + igf_specL[tb] = sel_specL[strt_cpy]; + } + } + strt_cpy++; + } + } + } + + strt_cpy = hGrid->sbWrap[tile_idx]; + + if ( IGF_WHITENING_STRONG == hPrivateDataR->currWhiteningLevel[tile_idx] ) + { + tb = swb_offset[hGrid->sfbWrap[tile_idx]]; + + for ( tb = swb_offset[hGrid->sfbWrap[tile_idx]]; tb < swb_offset[hGrid->sfbWrap[tile_idx + 1]]; tb++ ) + { + igf_specR[tb] = own_random( hInfoR->nfSeed ); + } + } + else + { + if ( hPrivateDataR->currWhiteningLevel[tile_idx] != hPrivateDataL->currWhiteningLevel[tile_idx] ) + { + if ( IGF_WHITENING_MID == hPrivateDataR->currWhiteningLevel[tile_idx] ) + { + if ( hPrivateDataL->n_noise_bands ) + { + IGF_replaceTCXNoise_2_new( igf_specL, TCXNoiseL, strt_cpy, stop, hPrivateDataL->totalNoiseNrg, hPrivateDataL->n_noise_bands, hInfoL->nfSeed ); + } + sel_specL = igf_specL; + } + else + { + if ( hPrivateDataL->n_noise_bands_off ) + { + IGF_replaceTCXNoise_2_new( igf_specL, TCXNoiseL, strt_cpy, stop, hPrivateDataL->totalNoiseNrg_off, hPrivateDataL->n_noise_bands_off, hInfoL->nfSeed ); + } + sel_specL = src_specL; + } + + if ( IGF_WHITENING_MID == hPrivateDataR->currWhiteningLevel[tile_idx] ) + { + if ( hPrivateDataR->n_noise_bands ) + { + IGF_replaceTCXNoise_2_new( igf_specR, TCXNoiseR, strt_cpy, stop, hPrivateDataR->totalNoiseNrg, hPrivateDataR->n_noise_bands, hInfoR->nfSeed ); + } + sel_specR = igf_specR; + } + else + { + if ( hPrivateDataR->n_noise_bands_off ) + { + IGF_replaceTCXNoise_2_new( igf_specR, TCXNoiseR, strt_cpy, stop, hPrivateDataR->totalNoiseNrg_off, hPrivateDataR->n_noise_bands_off, hInfoR->nfSeed ); + } + sel_specR = src_specR; + } + } + + for ( sfb = hGrid->sfbWrap[tile_idx]; sfb < hGrid->sfbWrap[tile_idx + 1]; sfb++ ) + { + for ( tb = swb_offset[sfb]; tb < swb_offset[sfb + 1]; tb++ ) + { + + if ( coreMsMask[tb] == 0 ) + { + if ( coreMsMask[strt_cpy] == 0 ) /* LR->LR */ + { + igf_specR[tb] = sel_specR[strt_cpy]; + } + else /* MS/DR -> LR */ + { + igf_specR[tb] = ( sel_specL[strt_cpy] - sel_specR[strt_cpy] ) * c; + } + } + else + { + if ( coreMsMask[strt_cpy] == 0 ) /* LR->MS/DR */ + { + igf_specR[tb] = ( sel_specL[strt_cpy] - sel_specR[strt_cpy] ) * c; + } + else /* MS/DR -> MS/DR */ + { + igf_specR[tb] = sel_specR[strt_cpy]; + } + } + strt_cpy++; + } + } + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * IGF_calc() + * + * calculates IGF energies + *-------------------------------------------------------------------*/ + +static void IGF_calc( + const IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData, /* i/o: IGF private data handle */ + const int16_t igfGridIdx, /* i : in case of CELP->TCX switching, use 1.25 framelength */ + const float *spectrum, /* i : MDCT spectrum */ + const float *igf_spec /* i : prepared IGF spectrum */ +) +{ + H_IGF_GRID hGrid; + float *igf_pN; + float *igf_sN; + float tmp[N_MAX_TCX]; + + set_zero( tmp, N_MAX_TCX ); + + hGrid = &hPrivateData->igfInfo.grid[igfGridIdx]; + igf_pN = hPrivateData->igf_pN; + igf_sN = hPrivateData->igf_sN; + + IGF_getMDCTSquare( hGrid->startLine, hGrid->stopLine, spectrum, tmp ); + IGF_calcSfbEnergy( hGrid->startSfb, hGrid->stopSfb, hGrid->swb_offset, tmp, igf_sN ); + IGF_getMDCTSquare( hGrid->startLine, hGrid->stopLine, igf_spec, tmp ); + IGF_setLinesToZero( hGrid->startLine, hGrid->stopLine, spectrum, tmp ); + IGF_calcSfbEnergy( hGrid->startSfb, hGrid->stopSfb, hGrid->swb_offset, tmp, igf_pN ); + + return; +} + + +/*-------------------------------------------------------------------* + * IGF_appl() + * + * apply IGF + *-------------------------------------------------------------------*/ + +static void IGF_appl( + IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData, /* i : IGF private data handle */ + const int16_t igfGridIdx, /* i : in case of ACELP->TCX switching, use 1.25 framelength*/ + float *pSpectralData, /* i/o: Q31 | MDCT spectrum */ + const float *igf_spec, /* i : Q31 | prepared IGF spectrum */ + float *virtualSpec, /* o : Q31 | virtual IGF spectrum, used for temp flattening */ + int16_t *flag_sparse, /* o : Q0 | temp flattening indicator */ + const int16_t bfi_apply_damping /* i : flag to indicate if damping for lost frames should be applied */ +) +{ + H_IGF_GRID hGrid; + int16_t tb; /* target subband */ + int16_t sfb, s_sfb, start_sfb, stop_sfb; + int16_t *swb_offset; + int16_t hopsize; + float tmp, dE; + float dN[IGF_MAX_SFB + 1]; + float gain[IGF_MAX_SFB]; + float dS[IGF_MAX_SFB]; + float width; + float sNlocal; + float E, sum, val; + float w0, w1, w2; + float *sN, *pN; + float gFactor; /* general SCF adaption */ + float fFactor; /* first SCF adaption */ + float lFactor; /* last SCF adaption */ + int16_t idx, idx1; + + /* initialize variables */ + w0 = 0.201f; + w1 = 0.389f; + w2 = 0.410f; + dE = 0.f; + + + /* more inits */ + hGrid = &hPrivateData->igfInfo.grid[igfGridIdx]; + sN = hPrivateData->igf_sN; + pN = hPrivateData->igf_pN; + start_sfb = hGrid->startSfb; + stop_sfb = hGrid->stopSfb; + gFactor = hGrid->gFactor; + fFactor = hGrid->fFactor; + lFactor = hGrid->lFactor; + swb_offset = hGrid->swb_offset; + + + /* collect energy below hGrid->startLine: */ + for ( tb = hGrid->startLine - 24; tb < hGrid->startLine; tb++ ) + { + dE += pSpectralData[tb] * pSpectralData[tb]; + } + dE = (float) sqrt( dE / 24. ); + + hopsize = 2; + hopsize = ( hPrivateData->currWhiteningLevel[0] == IGF_WHITENING_OFF ) ? 4 : hopsize; + hopsize = ( hPrivateData->currWhiteningLevel[0] == IGF_WHITENING_MID ) ? 2 : hopsize; + hopsize = ( hPrivateData->currWhiteningLevel[0] == IGF_WHITENING_STRONG ) ? 1 : hopsize; + hopsize = min( hopsize, hPrivateData->igfInfo.maxHopsize ); + + if ( hPrivateData->restrict_hopsize ) + { + hopsize = min( hopsize, 2 ); + } + + if ( hopsize > 1 ) + { + for ( sfb = start_sfb; sfb < stop_sfb; sfb += hopsize ) + { + for ( tb = sfb + 1; tb < min( ( sfb + hopsize ), stop_sfb ); tb++ ) + { + sN[sfb] += sN[tb]; + pN[sfb] += pN[tb]; + sN[tb] = 0.f; + pN[tb] = 0.f; + } + } + } + + /* IGF_rescale_SCF */ + if ( hGrid->infoIsRefined ) + { + for ( sfb = start_sfb; sfb < stop_sfb; sfb += 2 ) + { + width = (float) ( swb_offset[sfb + 2] - swb_offset[sfb] ); + + tmp = (float) hPrivateData->igf_curr[sfb >> 1]; + tmp = (float) pow( 2.0, 0.25 * tmp - 4.0 ); + tmp = tmp * tmp; + + sNlocal = sN[sfb] + sN[sfb + 1]; + sNlocal /= width; + + tmp = (float) max( 0.001 * sNlocal, tmp - sNlocal ); + dN[sfb] = (float) sqrt( tmp ); + dN[sfb + 1] = dN[sfb]; + } + } + else + { + for ( sfb = start_sfb; sfb < stop_sfb; sfb++ ) + { + width = (float) ( swb_offset[sfb + 1] - swb_offset[sfb] ); + + tmp = (float) hPrivateData->igf_curr[sfb]; + tmp = (float) pow( 2.0, 0.25 * tmp - 4.0 ); + tmp = tmp * tmp; + + sNlocal = sN[sfb]; + sNlocal /= width; + + tmp = (float) max( 0.001 * sNlocal, tmp - sNlocal ); + dN[sfb] = (float) sqrt( tmp ); + } + } + + dS[start_sfb] = dN[start_sfb]; + /* first value with adaption to core energy: */ + if ( dE < dN[start_sfb] ) + { + dS[start_sfb] = dN[start_sfb] + fFactor * ( dE - dN[start_sfb] ); + } + /* last value with less energy: */ + dS[stop_sfb - 1] = lFactor * dN[stop_sfb - 1]; + + if ( hGrid->infoIsRefined && hopsize == 1 ) + { + /* apply filter to absolute energy values: */ + for ( sfb = start_sfb + 1; sfb < stop_sfb - 1; sfb++ ) + { + dS[sfb] = w0 * dN[sfb - 1] + w1 * dN[sfb] + w2 * dN[sfb + 1]; + } + } + else + { + for ( sfb = start_sfb + 1; sfb < stop_sfb - 1; sfb++ ) + { + dS[sfb] = dN[sfb]; + } + } + + for ( sfb = start_sfb; sfb < stop_sfb; sfb += hopsize ) + { + E = 0.f; + sum = 0; + for ( tb = 0; tb < hopsize; tb++ ) + { + idx1 = min( sfb + tb + 1, stop_sfb ); + idx = min( sfb + tb, stop_sfb ); + width = (float) ( swb_offset[idx1] - swb_offset[idx] ); + idx = min( sfb + tb, stop_sfb - 1 ); + val = dS[idx]; + E += val * val * width; + sum += width; + } + + dS[sfb] = (float) sqrt( ( E * hopsize ) / sum ); + dN[sfb] = gFactor * dS[sfb]; + + width = (float) ( swb_offset[sfb + 1] - swb_offset[sfb] ); + dN[sfb] = dN[sfb] * dN[sfb] * width; + gain[sfb] = 0.f; + + if ( pN[sfb] > 1.e-20f ) + { + gain[sfb] = (float) sqrt( dN[sfb] / pN[sfb] ); + } + + for ( s_sfb = sfb + 1; s_sfb < min( sfb + hopsize, stop_sfb ); s_sfb++ ) + { + gain[s_sfb] = gain[sfb]; + } + } + + /* tiling */ + for ( sfb = start_sfb; sfb < stop_sfb; sfb++ ) + { + + if ( bfi_apply_damping && hPrivateData->frameLossCounter > 0 ) + { + gain[sfb] = min( gain[sfb], 12.f ); + + if ( hPrivateData->frameLossCounter < 5 ) + { + gain[sfb] -= gain[sfb] / 8 * hPrivateData->frameLossCounter; + } + else + { + gain[sfb] /= 2; + } + } + + for ( tb = swb_offset[sfb]; tb < swb_offset[sfb + 1]; tb++ ) + { + if ( pSpectralData[tb] == 0.f ) + { + pSpectralData[tb] = igf_spec[tb] * gain[sfb]; + flag_sparse[tb - IGF_START_MN] = 1; + } + else + { + virtualSpec[tb - IGF_START_MN] = igf_spec[tb] * gain[sfb]; + flag_sparse[tb - IGF_START_MN] = 2; + } + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * IGF_getWhiteSpectralData() + * + * spectral whitening + *-------------------------------------------------------------------*/ + +static void IGF_getWhiteSpectralData( + const float *in, /* i : MDCT spectrum */ + float *out, /* o : whitened spectrum */ + const int16_t start, /* i : start MDCT subband index */ + const int16_t stop, /* i : stop MDCT subband index */ + const int16_t level /* i : whitening strength */ +) +{ + int16_t i; + int16_t n; + int16_t j; + float div; + float ak; + + /* inits */ + div = 0.0f; + + for ( i = start; i < stop - level; i++ ) + { + ak = 1e-3f; + for ( j = i - level; j < i + level + 1; j++ ) + { + ak += in[j] * in[j]; + } + ak /= (float) ( level * 2 + 1 ); + + + n = (int16_t) max( 0.f, ( log( ak ) * INV_LOG_2 ) ); /* INV_LOG_2 = 1 / (float)log(2.0f)) */ + n >>= 1; /* sqrt() */ + div = (float) ( pow( 2.0f, (float) ( 21 - n ) ) ); + + + out[i] = in[i] * div; /* same as shift */ + } + + for ( ; i < stop; i++ ) + { + ak = 1e-3f; + + for ( j = i - level; j < stop; j++ ) + { + ak += in[j] * in[j]; + } + ak /= (float) ( stop - ( i - level ) ); + + + n = (int16_t) max( 0.f, ( log( ak ) * INV_LOG_2 ) ); /* INV_LOG_2 = 1 / (float)log(2.0f)) */ + n >>= 1; /* sqrt() */ + div = (float) ( pow( 2.0f, (float) ( 21 - n ) ) ); + + + out[i] = in[i] * div; /* same as shift */ + } + + return; +} + + +/*-------------------------------------------------------------------* + * IGF_RefineGrid() + * + * refines the IGF grid + *-------------------------------------------------------------------*/ + +static void IGF_RefineGrid( + H_IGF_GRID hGrid /* i/o: IGF grid handle */ +) +{ + int16_t a[IGF_MAX_SFB + 1]; /* +1: because in for-loop one value too much will be extrapolated */ + int16_t sfb; + + set_s( a, 0, IGF_MAX_SFB + 1 ); + + + hGrid->infoIsRefined = 1; + for ( sfb = 0; sfb < hGrid->swb_offset_len; sfb++ ) + { + a[sfb * 2 + 0] = hGrid->swb_offset[sfb]; + a[sfb * 2 + 1] = (int16_t) round_f( hGrid->swb_offset[sfb] + 0.45f * ( hGrid->swb_offset[sfb + 1] - hGrid->swb_offset[sfb] ) ); + if ( a[sfb * 2 + 1] & 1 ) + { + a[sfb * 2 + 1]--; + } + } + hGrid->stopSfb = hGrid->stopSfb * 2; + for ( sfb = 0; sfb <= hGrid->stopSfb; sfb++ ) + { + hGrid->swb_offset[sfb] = a[sfb]; + } + + for ( sfb = 0; sfb <= hGrid->nTiles; sfb++ ) + { + hGrid->sfbWrap[sfb] *= 2; + } + + return; +} + + +/*-------------------------------------------------------------------* + * IGFDecReadData() + * + * reads whitening information from the bitstream + *-------------------------------------------------------------------*/ + +void IGFDecReadData( + const IGF_DEC_INSTANCE_HANDLE hIGFDec, /* i/o: instance handle of IGF Deccoder */ + Decoder_State *st, /* i : decoder state */ + const int16_t igfGridIdx, /* i : in case of CELP->TCX switching, use 1.25 framelength */ + const int16_t isIndepFrame /* i : if 1: arith dec force reset, if 0: no reset */ +) +{ + IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData; + H_IGF_GRID hGrid; + int16_t p; + int16_t nT; + int16_t tmp; + + if ( hIGFDec != NULL ) + { + hPrivateData = &hIGFDec->igfData; + hGrid = &hPrivateData->igfInfo.grid[igfGridIdx]; + nT = hGrid->nTiles; + tmp = -1; + + for ( p = 0; p < IGF_MAX_TILES; p++ ) + { + hPrivateData->currWhiteningLevel[p] = IGF_WHITENING_OFF; + } + + if ( isIndepFrame ) + { + tmp = 0; + } + else + { + tmp = get_next_indice( st, 1 ); + } + if ( tmp == 1 ) + { + for ( p = 0; p < nT; p++ ) + { + hPrivateData->currWhiteningLevel[p] = hPrivateData->prevWhiteningLevel[p]; + } + } + else + { + IGF_decode_whitening_level( st, hPrivateData, 0 ); + if ( hPrivateData->igfInfo.bitRateIndex == IGF_BITRATE_SWB_48000_CPE || hPrivateData->igfInfo.bitRateIndex == IGF_BITRATE_FB_48000_CPE ) + { + tmp = 0; + } + else + { + tmp = get_next_indice( st, 1 ); + } + + if ( tmp == 1 ) + { + for ( p = 1; p < nT; p++ ) + { + IGF_decode_whitening_level( st, hPrivateData, p ); + } + } + else + { + for ( p = 1; p < nT; p++ ) + { + hPrivateData->currWhiteningLevel[p] = hPrivateData->currWhiteningLevel[0]; + } + } + } + for ( p = 0; p < IGF_MAX_TILES; p++ ) + { + hPrivateData->prevWhiteningLevel[p] = hPrivateData->currWhiteningLevel[p]; + } + + /* IGF_decode_temp_flattening_trigger()*/ + hIGFDec->flatteningTrigger = get_next_indice( st, 1 ); + } + + return; +} + + +/*-------------------------------------------------------------------* + * IGFDecReadLevel() + * + * read the IGF level information from the bitstream + *-------------------------------------------------------------------*/ + +/*! r: return igfAllZero flag indicating if no envelope is transmitted */ +int16_t IGFDecReadLevel( + const IGF_DEC_INSTANCE_HANDLE hIGFDec, /* i/o: instance handle of IGF Deccoder */ + Decoder_State *st, /* i : decoder state */ + const int16_t igfGridIdx, /* i : in case of CELP->TCX switching, use 1.25 framelength */ + const int16_t isIndepFrame /* i : if 1: arith dec force reset, if 0: no reset */ +) +{ + IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData; + H_IGF_GRID hGrid; + int16_t m_igfSfbStart; + int16_t IGFAllZero; + + IGFAllZero = 1; + + if ( hIGFDec != NULL ) + { + hPrivateData = &hIGFDec->igfData; + hGrid = &hPrivateData->igfInfo.grid[igfGridIdx]; + m_igfSfbStart = hGrid->startSfb; + IGFAllZero = get_next_indice( st, 1 ); + + if ( IGFAllZero == 0 ) + { + mvs2s( hPrivateData->igf_curr, hPrivateData->igf_prev, hGrid->stopSfb ); + + IGFSCFDecoderDecode( &hPrivateData->hArithSCFdec, st, &hPrivateData->igf_curr[m_igfSfbStart], igfGridIdx, isIndepFrame ); + } + else + { + IGFSCFDecoderReset( &hPrivateData->hArithSCFdec ); + + set_s( &hPrivateData->igf_curr[m_igfSfbStart], 0, hGrid->stopSfb - m_igfSfbStart ); + } + } + + hIGFDec->infoIGFAllZero = IGFAllZero; + + return IGFAllZero; +} + + +/*-------------------------------------------------------------------* + * IGFDecApplyMono() + * + * apply the IGF decoder in mono + *-------------------------------------------------------------------*/ + +void IGFDecApplyMono( + const IGF_DEC_INSTANCE_HANDLE hIGFDec, /* i/o: instance handle of IGF Decoder */ + float *spectrum, /* i/o: MDCT spectrum */ + const int16_t igfGridIdx, /* i : in case of CELP->TCX switching, use 1.25 framelength */ + const int16_t bfi, /* i : frame loss == 1, frame good == 0 */ + const int16_t element_mode /* i : IVAS element mode */ +) +{ + IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData; + H_IGF_GRID hGrid; + int16_t i, whiteningLevel, nLinesToReset; + float igf_spec[IGF_MAX_GRANULE_LEN]; + int16_t nShift; + + set_zero( igf_spec, IGF_MAX_GRANULE_LEN ); + + /* initialize variables */ + if ( element_mode > EVS_MONO ) + { + whiteningLevel = IGF_MID_WHITENING_LEVEL2; + } + else + { + whiteningLevel = IGF_MID_WHITENING_LEVEL; + } + + nShift = igfGridIdx == IGF_GRID_LB_SHORT ? 2 : 1; + set_s( hIGFDec->flag_sparse, 0, ( N_MAX_TCX - IGF_START_MN ) / nShift ); + set_f( hIGFDec->virtualSpec, 0.f, ( N_MAX_TCX - IGF_START_MN ) / nShift ); + + hPrivateData = &hIGFDec->igfData; + hGrid = &hPrivateData->igfInfo.grid[igfGridIdx]; + hPrivateData->totalNoiseNrg = 0.f; + hPrivateData->n_noise_bands = 0; + hPrivateData->totalNoiseNrg_off = 0.f; + hPrivateData->n_noise_bands_off = 0; + hPrivateData->restrict_hopsize = 0; + + /* concealment counter */ + if ( bfi ) + { + hPrivateData->frameLossCounter++; + } + else + { + hPrivateData->frameLossCounter = 0; + } + + /* skip IGF processing if all IGF levels are zero */ + if ( !hIGFDec->infoIGFAllZero ) + { + for ( i = 0; i < hGrid->nTiles; i++ ) + { + if ( hPrivateData->currWhiteningLevel[i] == IGF_WHITENING_MID ) + { + if ( element_mode == EVS_MONO || !bfi ) + { + IGF_getWhiteSpectralData( hPrivateData->pSpecFlat, igf_spec, hGrid->minSrcSubband, hGrid->startLine, whiteningLevel ); + } + else + { + mvr2r( hPrivateData->pSpecFlat, igf_spec, hGrid->startLine ); + } + + hPrivateData->n_noise_bands = IGF_replaceTCXNoise_1( igf_spec, hIGFDec->infoTCXNoise, hGrid->minSrcSubband, hGrid->startLine, &hPrivateData->totalNoiseNrg ); + break; + } + } + + for ( i = 0; i < hGrid->nTiles; i++ ) + { + if ( hPrivateData->currWhiteningLevel[i] == IGF_WHITENING_OFF ) + { + hPrivateData->n_noise_bands_off = IGF_replaceTCXNoise_1( hPrivateData->pSpecFlat, hIGFDec->infoTCXNoise, hGrid->minSrcSubband, hGrid->startLine, &hPrivateData->totalNoiseNrg_off ); + break; + } + } + + /* apply IGF in three steps: */ + IGF_prep( hPrivateData, igfGridIdx, hIGFDec->infoTCXNoise, igf_spec, hPrivateData->pSpecFlat, element_mode ); + IGF_calc( hPrivateData, igfGridIdx, spectrum, igf_spec ); + IGF_appl( hPrivateData, igfGridIdx, spectrum, igf_spec, hIGFDec->virtualSpec, hIGFDec->flag_sparse, 1 ); + } + + /* reset TCX noise indicator vector */ + nLinesToReset = igfGridIdx == IGF_GRID_LB_SHORT ? 2 : 1; + nLinesToReset = IGF_START_MX / nLinesToReset; + set_c( (int8_t *) ( hIGFDec->infoTCXNoise ), 0, nLinesToReset ); + + return; +} + + +/*-------------------------------------------------------------------* + * IGFDecApplyStereo() + * + * apply the IGF decoder in stereo + *-------------------------------------------------------------------*/ + +void IGFDecApplyStereo( + const IGF_DEC_INSTANCE_HANDLE hIGFDecL, /* i : instance handle of IGF Decoder */ + const IGF_DEC_INSTANCE_HANDLE hIGFDecR, /* i : instance handle of IGF Decoder */ + float *spectrumL, /* i/o: L MDCT spectrum */ + float *spectrumR, /* i/o: R MDCT spectrum */ + const int16_t igfGridIdx, /* i : in case of CELP->TCX switching, use 1.25 framelength */ + const int16_t *coreMsMask, + const int16_t restrict_hopsize, + const int16_t bfi, /* i : frame loss == 1, frame good == 0 */ + const int16_t bfi_apply_damping ) +{ + IGF_DEC_PRIVATE_DATA_HANDLE hPrivateDataL, hPrivateDataR; + H_IGF_GRID hGrid; + int16_t i, whiteningLevel, nLinesToReset; + float igf_specL[IGF_MAX_GRANULE_LEN], igf_specR[IGF_MAX_GRANULE_LEN]; + int16_t nShift; + + set_f( igf_specL, 0.f, IGF_MAX_GRANULE_LEN ); + set_f( igf_specR, 0.f, IGF_MAX_GRANULE_LEN ); + + /* initialize variables */ + whiteningLevel = IGF_MID_WHITENING_LEVEL2; + + nShift = igfGridIdx == IGF_GRID_LB_SHORT ? 2 : 1; + set_s( hIGFDecL->flag_sparse, 0, ( N_MAX_TCX - IGF_START_MN ) / nShift ); + set_s( hIGFDecR->flag_sparse, 0, ( N_MAX_TCX - IGF_START_MN ) / nShift ); + set_f( hIGFDecL->virtualSpec, 0.f, ( N_MAX_TCX - IGF_START_MN ) / nShift ); + set_f( hIGFDecR->virtualSpec, 0.f, ( N_MAX_TCX - IGF_START_MN ) / nShift ); + + hPrivateDataL = &hIGFDecL->igfData; + hGrid = &hPrivateDataL->igfInfo.grid[igfGridIdx]; + hPrivateDataL->totalNoiseNrg = 0.f; + hPrivateDataL->n_noise_bands = 0; + hPrivateDataL->totalNoiseNrg_off = 0.f; + hPrivateDataL->n_noise_bands_off = 0; + hPrivateDataL->restrict_hopsize = restrict_hopsize; + + hPrivateDataR = &hIGFDecR->igfData; + hPrivateDataR->totalNoiseNrg = 0.f; + hPrivateDataR->n_noise_bands = 0; + hPrivateDataR->totalNoiseNrg_off = 0.f; + hPrivateDataR->n_noise_bands_off = 0; + hPrivateDataR->restrict_hopsize = restrict_hopsize; + + /* concealment counter */ + if ( bfi ) + { + hPrivateDataL->frameLossCounter++; + hPrivateDataR->frameLossCounter++; + } + else + { + hPrivateDataL->frameLossCounter = 0; + hPrivateDataR->frameLossCounter = 0; + } + + /* skip IGF processing if all IGF levels are zero */ + if ( !hIGFDecL->infoIGFAllZero || !hIGFDecR->infoIGFAllZero ) + { + for ( i = 0; i < hGrid->nTiles; i++ ) + { + if ( hPrivateDataL->currWhiteningLevel[i] == IGF_WHITENING_MID || hPrivateDataR->currWhiteningLevel[i] == IGF_WHITENING_MID ) + { + if ( !bfi ) + { + IGF_getWhiteSpectralData( hPrivateDataL->pSpecFlat, igf_specL, hGrid->minSrcSubband, hGrid->startLine, whiteningLevel ); + } + else + { + mvr2r( hPrivateDataL->pSpecFlat, igf_specL, hGrid->startLine ); + } + + hPrivateDataL->n_noise_bands = IGF_replaceTCXNoise_1( igf_specL, hIGFDecL->infoTCXNoise, hGrid->minSrcSubband, hGrid->startLine, &hPrivateDataL->totalNoiseNrg ); + + if ( !bfi ) + { + IGF_getWhiteSpectralData( hPrivateDataR->pSpecFlat, igf_specR, hGrid->minSrcSubband, hGrid->startLine, whiteningLevel ); + } + else + { + mvr2r( hPrivateDataR->pSpecFlat, igf_specR, hGrid->startLine ); + } + + hPrivateDataR->n_noise_bands = IGF_replaceTCXNoise_1( igf_specR, hIGFDecR->infoTCXNoise, hGrid->minSrcSubband, hGrid->startLine, &hPrivateDataR->totalNoiseNrg ); + + break; + } + } + + for ( i = 0; i < hGrid->nTiles; i++ ) + { + if ( hPrivateDataL->currWhiteningLevel[i] == IGF_WHITENING_OFF || hPrivateDataR->currWhiteningLevel[i] == IGF_WHITENING_OFF ) + { + hPrivateDataL->n_noise_bands_off = IGF_replaceTCXNoise_1( hPrivateDataL->pSpecFlat, hIGFDecL->infoTCXNoise, hGrid->minSrcSubband, hGrid->startLine, &hPrivateDataL->totalNoiseNrg_off ); + + hPrivateDataR->n_noise_bands_off = IGF_replaceTCXNoise_1( hPrivateDataR->pSpecFlat, hIGFDecR->infoTCXNoise, hGrid->minSrcSubband, hGrid->startLine, &hPrivateDataR->totalNoiseNrg_off ); + break; + } + } + + /* apply IGF in three steps: */ + IGF_prepStereo( hPrivateDataL, hPrivateDataR, igfGridIdx, hIGFDecL->infoTCXNoise, hIGFDecR->infoTCXNoise, igf_specL, igf_specR, hPrivateDataL->pSpecFlat, hPrivateDataR->pSpecFlat, coreMsMask ); + + IGF_calc( hPrivateDataL, igfGridIdx, spectrumL, igf_specL ); + IGF_calc( hPrivateDataR, igfGridIdx, spectrumR, igf_specR ); + IGF_appl( hPrivateDataL, igfGridIdx, spectrumL, igf_specL, hIGFDecL->virtualSpec, hIGFDecL->flag_sparse, bfi_apply_damping ); + IGF_appl( hPrivateDataR, igfGridIdx, spectrumR, igf_specR, hIGFDecR->virtualSpec, hIGFDecR->flag_sparse, bfi_apply_damping ); + } + + /* reset TCX noise indicator vector */ + nLinesToReset = ( igfGridIdx == IGF_GRID_LB_SHORT ) ? 2 : 1; + nLinesToReset = IGF_START_MX / nLinesToReset; + set_c( (int8_t *) ( hIGFDecL->infoTCXNoise ), 0, nLinesToReset ); + set_c( (int8_t *) ( hIGFDecR->infoTCXNoise ), 0, nLinesToReset ); + + return; +} + + +/*-------------------------------------------------------------------* + * IGFDecSetMode() + * + * set mode is used to init the IGF dec with a new bitrate + *-------------------------------------------------------------------*/ + +void IGFDecSetMode( + const IGF_DEC_INSTANCE_HANDLE hIGFDec, /* i : instance handle of IGF Decoder */ + const int32_t total_brate, /* i : bitrate */ + const int16_t bwidth, /* i : audio bandwidth */ + const int16_t element_mode, /* i : IVAS element mode */ + const int16_t defaultStartLine, /* i : default start subband index */ + const int16_t defaultStopLine, /* i : default stop subband index */ + const int16_t rf_mode /* i : flag to signal the RF mode */ +) +{ + IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData; + + hPrivateData = &hIGFDec->igfData; + hIGFDec->isIGFActive = 0; + + if ( IGFCommonFuncsIGFConfiguration( total_brate, bwidth, element_mode, &hPrivateData->igfInfo, rf_mode ) ) + { + IGFSCFDecoderOpen( &hPrivateData->hArithSCFdec, &hPrivateData->igfInfo, total_brate, bwidth, element_mode, rf_mode ); + + hIGFDec->infoIGFAllZero = 0; + hIGFDec->isIGFActive = 1; + hIGFDec->infoIGFStopLine = hPrivateData->igfInfo.grid[0].stopLine; + hIGFDec->infoIGFStartLine = hPrivateData->igfInfo.grid[0].startLine; + hIGFDec->infoIGFStopFreq = hPrivateData->igfInfo.grid[0].stopFrequency; + hIGFDec->infoIGFStartFreq = hPrivateData->igfInfo.grid[0].startFrequency; + + /* no refinement if maxHopsize is 1 */ + if ( hPrivateData->igfInfo.bitRateIndex != IGF_BITRATE_FB_96000 && hPrivateData->igfInfo.bitRateIndex != IGF_BITRATE_FB_96000_CPE && + hPrivateData->igfInfo.bitRateIndex != IGF_BITRATE_FB_128000 && hPrivateData->igfInfo.bitRateIndex != IGF_BITRATE_FB_128000_CPE ) + { + IGF_RefineGrid( &hPrivateData->igfInfo.grid[IGF_GRID_LB_NORM] ); + IGF_RefineGrid( &hPrivateData->igfInfo.grid[IGF_GRID_LB_TRAN] ); + IGF_RefineGrid( &hPrivateData->igfInfo.grid[IGF_GRID_LB_SHORT] ); + } + /* IGFDecOutInformation(hIGFDec); */ + } + else + { + hIGFDec->infoIGFStopLine = defaultStopLine; + hIGFDec->infoIGFStartLine = defaultStartLine; + hIGFDec->infoIGFStopFreq = -1; + hIGFDec->infoIGFStartFreq = -1; + IVAS_ERROR( IVAS_ERR_INTERNAL, "IGFDecSetMode: initialization error!" ); + } + + hIGFDec->flag_sparse = &hIGFDec->flag_sparseBuf[0]; + hIGFDec->infoTCXNoise = &hIGFDec->infoTCXNoiseBuf[0]; + hIGFDec->virtualSpec = &hIGFDec->virtualSpecBuf[0]; + hIGFDec->igfData.pSpecFlat = &hIGFDec->igfData.pSpecFlatBuf[0]; + hIGFDec->igfData.igfInfo.nfSeed = &hIGFDec->igfData.igfInfo.nfSeedBuf[0]; + + return; +} + + +/*-------------------------------------------------------------------* + * IGFDecUpdateInfo() + * + * updates the start/stop frequency of IGF according to igfGridIdx + *-------------------------------------------------------------------*/ + +void IGFDecUpdateInfo( + const IGF_DEC_INSTANCE_HANDLE hIGFDec, /* i/o: instance handle of IGF Decoder */ + const int16_t subFrameIdx, /* i : index of subframe */ + const int16_t igfGridIdx /* i : IGF grid index */ +) +{ + IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData; + H_IGF_GRID hGrid; + + hIGFDec->flag_sparse = &hIGFDec->flag_sparseBuf[0]; + hIGFDec->infoTCXNoise = &hIGFDec->infoTCXNoiseBuf[0]; + hIGFDec->virtualSpec = &hIGFDec->virtualSpecBuf[0]; + hIGFDec->igfData.pSpecFlat = &hIGFDec->igfData.pSpecFlatBuf[0]; + hIGFDec->igfData.igfInfo.nfSeed = &hIGFDec->igfData.igfInfo.nfSeedBuf[0]; + + if ( igfGridIdx == IGF_GRID_LB_SHORT ) + { + IGFDecRestoreTCX10SubFrameData( hIGFDec, subFrameIdx ); + } + + hPrivateData = &hIGFDec->igfData; + if ( hIGFDec->isIGFActive ) + { + hGrid = &hPrivateData->igfInfo.grid[igfGridIdx]; + hIGFDec->infoIGFStartFreq = hGrid->startFrequency; + hIGFDec->infoIGFStopFreq = hGrid->stopFrequency; + hIGFDec->infoIGFStartLine = hGrid->startLine; + hIGFDec->infoIGFStopLine = hGrid->stopLine; + } + + return; +} + + +/*-------------------------------------------------------------------* + * IGFDecReplicateTCX10State() + * + * + *-------------------------------------------------------------------*/ + +void IGFDecReplicateTCX10State( + IGF_DEC_INSTANCE_HANDLE hIGFDec /* i/o: instance handle of IGF Decoder */ +) +{ + mvs2s( &hIGFDec->flag_sparseBuf[( N_MAX_TCX - IGF_START_MN ) / 2], &hIGFDec->flag_sparseBuf[0], ( N_MAX_TCX - IGF_START_MN ) / 2 ); + mvc2c( &hIGFDec->infoTCXNoiseBuf[( IGF_START_MX ) / 2], &hIGFDec->infoTCXNoiseBuf[0], ( IGF_START_MX ) / 2 ); + mvr2r( &hIGFDec->virtualSpecBuf[( N_MAX_TCX - IGF_START_MN ) / 2], &hIGFDec->virtualSpecBuf[0], ( N_MAX_TCX - IGF_START_MN ) / 2 ); + mvr2r( &hIGFDec->igfData.pSpecFlatBuf[IGF_START_MX / 2], &hIGFDec->igfData.pSpecFlatBuf[0], IGF_START_MX / 2 ); + + hIGFDec->igfData.igfInfo.nfSeedBuf[0] = hIGFDec->igfData.igfInfo.nfSeedBuf[1]; + + return; +} + + +/*-------------------------------------------------------------------* + * IGFDecCopyLPCFlatSpectrum() + * + * copy the LPC flat spectrum to IGF buffer + *-------------------------------------------------------------------*/ + +void IGFDecCopyLPCFlatSpectrum( + const IGF_DEC_INSTANCE_HANDLE hIGFDec, /* i/o: instance handle of IGF Decoder */ + const float *pSpectrumFlat, /* i : LPC flattend spectrum from TCX dec */ + const int16_t igfGridIdx /* i : IGF grid index */ +) +{ + IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData; + H_IGF_GRID hGrid; + int16_t i; + + if ( hIGFDec ) + { + hPrivateData = &hIGFDec->igfData; + hGrid = &hPrivateData->igfInfo.grid[igfGridIdx]; + + for ( i = hGrid->minSrcSubband - IGF_MID_WHITENING_LEVEL2; i < hGrid->startLine; i++ ) + { + hPrivateData->pSpecFlat[i] = pSpectrumFlat[i] * 1024.f; + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * IGFDecStoreTCX10SubFrameData() + * + * store the IGF bitstream information for TCX10 subframes + *-------------------------------------------------------------------*/ + +void IGFDecStoreTCX10SubFrameData( + const IGF_DEC_INSTANCE_HANDLE hIGFDec, /* i/o: instance handle of IGF Decoder */ + const int16_t subFrameIdx /* i : index of subframe */ +) +{ + IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData; + + hPrivateData = &hIGFDec->igfData; + + /* store igf energies for subframe*/ + mvs2s( hPrivateData->igf_curr, hPrivateData->igf_curr_subframe[subFrameIdx][0], IGF_MAX_SFB ); + mvs2s( hPrivateData->igf_prev, hPrivateData->igf_prev_subframe[subFrameIdx], IGF_MAX_SFB ); + + /* store spectral whitening information for current subframe */ + mvs2s( hPrivateData->currWhiteningLevel, hPrivateData->currWhiteningLevel_subframe[subFrameIdx], IGF_MAX_TILES ); + mvs2s( hPrivateData->prevWhiteningLevel, hPrivateData->prevWhiteningLevel_subframe[subFrameIdx], IGF_MAX_TILES ); + + /* store flattening trigger for current subframe */ + hPrivateData->igf_flatteningTrigger_subframe[subFrameIdx] = hIGFDec->flatteningTrigger; + + return; +} + + +/*-------------------------------------------------------------------* + * IGFDecRestoreTCX10SubFrameData() + * + * restore the IGF bitstream information for TCX10 subframes + *-------------------------------------------------------------------*/ + +void IGFDecRestoreTCX10SubFrameData( + const IGF_DEC_INSTANCE_HANDLE hIGFDec, /* i/o: instance handle of IGF Decoder */ + const int16_t subFrameIdx /* i : index of subframe */ +) +{ + IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData; + + hPrivateData = &hIGFDec->igfData; + + /* store igf energies for subframe*/ + mvs2s( hPrivateData->igf_curr_subframe[subFrameIdx][0], hPrivateData->igf_curr, IGF_MAX_SFB ); + mvs2s( hPrivateData->igf_prev_subframe[subFrameIdx], hPrivateData->igf_prev, IGF_MAX_SFB ); + + /* store spectral whitening information for current subframe */ + mvs2s( hPrivateData->currWhiteningLevel_subframe[subFrameIdx], hPrivateData->currWhiteningLevel, IGF_MAX_TILES ); + mvs2s( hPrivateData->prevWhiteningLevel_subframe[subFrameIdx], hPrivateData->prevWhiteningLevel, IGF_MAX_TILES ); + + /* restore flattening trigger for current subframe */ + hIGFDec->flatteningTrigger = hPrivateData->igf_flatteningTrigger_subframe[subFrameIdx]; + hIGFDec->flag_sparse = &hIGFDec->flag_sparseBuf[subFrameIdx * ( N_MAX_TCX - IGF_START_MN ) / 2]; + hIGFDec->infoTCXNoise = &hIGFDec->infoTCXNoiseBuf[subFrameIdx * ( IGF_START_MX ) / 2]; + hIGFDec->virtualSpec = &hIGFDec->virtualSpecBuf[subFrameIdx * ( N_MAX_TCX - IGF_START_MN ) / 2]; + hIGFDec->igfData.pSpecFlat = &hIGFDec->igfData.pSpecFlatBuf[subFrameIdx * IGF_START_MX / 2]; + hIGFDec->igfData.igfInfo.nfSeed = &hIGFDec->igfData.igfInfo.nfSeedBuf[subFrameIdx]; + + return; +} + +/*-----------------------------------------------------------------------* + * init_igf_dec() + * + * Initialize IGF decoder parameters + *-----------------------------------------------------------------------*/ + +void init_igf_dec( + IGF_DEC_INSTANCE_HANDLE hIGFDec /* i/o: IGF decoder handle */ +) +{ + set_c( (int8_t *) ( hIGFDec->infoTCXNoiseBuf ), 0, IGF_START_MX ); + set_f( hIGFDec->igfData.pSpecFlatBuf, 0, IGF_START_MX ); + hIGFDec->igfData.igfInfo.nfSeedBuf[0] = 9733; + hIGFDec->igfData.igfInfo.nfSeedBuf[1] = 9733; + hIGFDec->igfData.igfInfo.nfSeed = &hIGFDec->igfData.igfInfo.nfSeedBuf[0]; + hIGFDec->igfData.pSpecFlat = &hIGFDec->igfData.pSpecFlatBuf[0]; + hIGFDec->flag_sparse = &hIGFDec->flag_sparseBuf[0]; + hIGFDec->infoTCXNoise = &hIGFDec->infoTCXNoiseBuf[0]; + hIGFDec->virtualSpec = &hIGFDec->virtualSpecBuf[0]; + + return; +} + + +/*-----------------------------------------------------------------------* + * get_igf_startline() + * + * + *-----------------------------------------------------------------------*/ + +/*! r: IGF start line */ +int16_t get_igf_startline( + Decoder_State *st, /* i : decoder state */ + const int16_t L_frame, /* i : length of the frame */ + const int16_t L_frameTCX /* i : full band frame length */ +) +{ + int16_t igf_startline; + + if ( st->igf == 0 ) + { + if ( st->narrowBand == 0 ) + { + /* minimum needed for output with sampling rates lower then the + nominal sampling rate */ + igf_startline = min( L_frameTCX, L_frame ); + } + else + { + igf_startline = L_frameTCX; + } + } + else + { + igf_startline = min( st->hIGFDec->infoIGFStartLine, L_frameTCX ); + } + + return igf_startline; +} diff --git a/lib_dec/igf_scf_dec.c b/lib_dec/igf_scf_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..11c6f0845bc76b0e0b164226d4825eee34e50167 --- /dev/null +++ b/lib_dec/igf_scf_dec.c @@ -0,0 +1,327 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "prot.h" +#include "stat_dec.h" +#include "wmc_auto.h" + + +/*---------------------------------------------------------------------* + * IGFSCFDecoderOpen() + * + * initialization of an instance of this module, pass a ptr to a hPublicData + *---------------------------------------------------------------------*/ + +void IGFSCFDecoderOpen( + IGFSCFDEC_INSTANCE_HANDLE hPublicData, /* i/o: handle to public data */ + H_IGF_INFO hIgfInfo, /* i : IGF info handle */ + const int32_t total_brate, + const int16_t bwidth, + const int16_t element_mode, + const int16_t rf_mode /* i : flag to signal the RF mode */ +) +{ + + hPublicData->scfCountLongBlock[0] = hIgfInfo->grid[0].swb_offset_len - 1; + hPublicData->scfCountLongBlock[1] = hIgfInfo->grid[1].swb_offset_len - 1; + hPublicData->scfCountLongBlock[2] = hIgfInfo->grid[2].swb_offset_len - 1; + hPublicData->t = 0; /* protect against the invalid request of starting decoding with a dependent block */ + + IGFCommonFuncsIGFGetCFTables( total_brate, bwidth, element_mode, rf_mode, &hPublicData->cf_se00, &hPublicData->cf_se01, &hPublicData->cf_off_se01, &hPublicData->cf_se02, &hPublicData->cf_off_se02, &hPublicData->cf_se10, &hPublicData->cf_off_se10, &hPublicData->cf_se11, &hPublicData->cf_off_se11 ); + + return; +} + +/*---------------------------------------------------------------------* + * quant_ctx() + * + * + *---------------------------------------------------------------------*/ + +static int16_t quant_ctx( + const int16_t ctx ) +{ + /* + ctx ... -5 -4 -3 -2 -1 0 1 2 3 4 5 ... + Q(ctx)... -3 -3 -3 -2 -1 0 1 2 3 3 3 ... + */ + if ( abs( ctx ) <= 3 ) + { + return ctx; + } + else if ( ctx > 3 ) + { + return 3; + } + else + { + /* ctx < -3 */ + return -3; + } +} + +/*---------------------------------------------------------------------* + * arith_decode_bits() + * + * + *---------------------------------------------------------------------*/ + +static int16_t arith_decode_bits( + Tastat *ac_state, /* i/o: arith coding state */ + Decoder_State *st, /* i : pointer to decoder state */ + const int16_t nBits /* i : number of bits to decode */ +) +{ + int16_t i, x; + uint16_t bit; + + x = 0; + for ( i = 0; i < nBits; ++i ) + { + /* decode one bit using the new raw AC function */ + ari_decode_14bits_bit_ext( st, &bit, ac_state ); + x = ( x << 1 ) | bit; + } + + return x; +} + + +/*---------------------------------------------------------------------* + * arith_decode_residual() + * + * + *---------------------------------------------------------------------*/ + +static int16_t arith_decode_residual( + Tastat *ac_state, /* i/o: arith coding state */ + Decoder_State *st, /* i : pointer to decoder state */ + const uint16_t *cumulativeFrequencyTable, /* i : cumulative frequency table to be used */ + const int16_t tableOffset /* i : offset used to align the table */ +) +{ + uint16_t val; + int16_t x, extra, extra_tmp; + + /* decode one of the IGF_SYMBOLS_IN_TABLE == 27 alphabet symbols using the new raw AC function */ + ari_decode_14bits_s27_ext( st, &val, ac_state, cumulativeFrequencyTable ); + + /* meaning of the values of val: */ + /* esc_{0} IGF_MIN_ENC_SEPARATE ... IGF_MAX_ENC_SEPARATE esc_{IGF_SYMBOLS_IN_TABLE - 1} */ + if ( ( val != 0 ) && ( val != IGF_SYMBOLS_IN_TABLE - 1 ) ) + { + x = ( val - 1 ) + IGF_MIN_ENC_SEPARATE; + + + x -= tableOffset; + return x; + } + + /* decode one of the tails of the distribution */ + /* decode extra with 4 bits */ + extra = arith_decode_bits( ac_state, st, 4 ); + if ( extra == 15 ) + { + /* escape code 15 to indicate extra >= 15 */ + /* decode addtional extra with 6 bits */ + extra_tmp = arith_decode_bits( ac_state, st, 6 ); + if ( extra_tmp == 63 ) + { + /* escape code 63 to indicate extra_tmp >= 63 */ + /* decode safety extra with 7 bits */ + extra_tmp = 63 + arith_decode_bits( ac_state, st, 7 ); + } + extra = 15 + extra_tmp; + } + + if ( val == 0 ) + { + /* escape code 0 to indicate x <= IGF_MIN_ENC_SEPARATE - 1 */ + x = ( IGF_MIN_ENC_SEPARATE - 1 ) - extra; + } + else + { + /* escape code (IGF_SYMBOLS_IN_TABLE - 1) to indicate x >= IGF_MAX_ENC_SEPARATE + 1 */ + x = ( IGF_MAX_ENC_SEPARATE + 1 ) + extra; + } + + x -= tableOffset; + + return x; +} + + +/*---------------------------------------------------------------------* + * decode_sfe_vector() + * + * + *---------------------------------------------------------------------*/ + +static void decode_sfe_vector( + IGFSCFDEC_INSTANCE_HANDLE hPrivateData, /* i/o: instance handle */ + Decoder_State *st, /* i : pointer to decoder state */ + const int16_t t, /* i : frame counter reset to 0 at each independent frame */ + const int16_t *prev_x, /* i : previous vector */ + int16_t *x, /* i/o: current vector to decode */ + const int16_t length /* i : number of elements to decode */ +) +{ + /* + f + ^ + | d a x + | c b + | e --> t + */ + uint16_t pred; + int16_t f, ctx, ctx_f, ctx_t; + + for ( f = 0; f < length; f++ ) + { + if ( t == 0 ) + { + if ( f == 0 ) + { + /* decode one of the IGF_SYMBOLS_IN_TABLE == 27 alphabet symbols using the new raw AC function */ + ari_decode_14bits_s27_ext( st, &pred, &hPrivateData->acState, hPrivateData->cf_se00 ); + x[f] = pred << 2; + x[f] += arith_decode_bits( &hPrivateData->acState, st, 2 ); /* LSBs as 2 bit raw */ + } + else if ( f == 1 ) + { + pred = x[f - 1]; /* pred = b */ + x[f] = pred + arith_decode_residual( &hPrivateData->acState, st, hPrivateData->cf_se01, hPrivateData->cf_off_se01 ); + } + else + { + /* f >= 2 */ + pred = x[f - 1]; /* pred = b */ + ctx = quant_ctx( x[f - 1] - x[f - 2] ); /* Q(b - e) */ + x[f] = pred + arith_decode_residual( &hPrivateData->acState, st, &hPrivateData->cf_se02[( IGF_SYMBOLS_IN_TABLE + 1 ) * ( IGF_CTX_OFFSET + ctx )], hPrivateData->cf_off_se02[IGF_CTX_OFFSET + ctx] ); + } + } + else + { + /* t == 1 */ + if ( f == 0 ) + { + pred = prev_x[f]; /* pred = a */ + x[f] = pred + arith_decode_residual( &hPrivateData->acState, st, hPrivateData->cf_se10, hPrivateData->cf_off_se10 ); + } + else + { + /* (t == 1) && (f >= 1) */ + pred = prev_x[f] + x[f - 1] - prev_x[f - 1]; /* pred = a + b - c */ + ctx_f = quant_ctx( prev_x[f] - prev_x[f - 1] ); /* Q(a - c) */ + ctx_t = quant_ctx( x[f - 1] - prev_x[f - 1] ); /* Q(b - c) */ + x[f] = pred + arith_decode_residual( &hPrivateData->acState, st, &hPrivateData->cf_se11[( IGF_SYMBOLS_IN_TABLE + 1 ) * IGF_CTX_COUNT * ( IGF_CTX_OFFSET + ctx_t ) + ( IGF_SYMBOLS_IN_TABLE + 1 ) * ( IGF_CTX_OFFSET + ctx_f )], hPrivateData->cf_off_se11[IGF_CTX_COUNT * ( IGF_CTX_OFFSET + ctx_t ) + ( IGF_CTX_OFFSET + ctx_f )] ); + } + } + if ( x[f] < 0 ) + { + x[f] = 0; + st->BER_detect = 1; + } + if ( x[f] > 91 ) + { + x[f] = 91; + st->BER_detect = 1; + } + } + + return; +} + + +/*---------------------------------------------------------------------* + * IGFSCFDecoderReset() + * + * resets the internal decoder memory (context memory) + *---------------------------------------------------------------------*/ + +void IGFSCFDecoderReset( + IGFSCFDEC_INSTANCE_HANDLE hPublicData /* i/o: handle to public data or NULL in case there was no instance created */ +) +{ + /* reset of coder */ + hPublicData->t = 0; + + /* we do not need to fill hPublicData->prev with zeros, because when t = 0 no previous information is used */ + + return; +} + + +/*---------------------------------------------------------------------* + * IGFSCFDecoderDecode() + * + * main IGF decoder function + *---------------------------------------------------------------------*/ + +void IGFSCFDecoderDecode( + IGFSCFDEC_INSTANCE_HANDLE hPublicData, /* i/o: handle to public data or NULL in case there was no instance created */ + Decoder_State *st, /* i/o: pointer to decoder state */ + int16_t *sfe, /* o : ptr to an array which will contain the decoded quantized coefficients */ + const int16_t igfGridIdx, /* i : igf grid index see declaration of IGF_GRID_IDX for details */ + const int16_t indepFlag /* i : if 1 on input the decoder will be forced to reset, + if 0 on input the decoder will be forced to encode without a reset */ +) +{ + /* insert data */ + hPublicData->bitsRead = st->next_bit_pos; + ari_start_decoding_14bits( st, &hPublicData->acState ); /* start AC decoding */ + + /* check if coder needs a reset and do it if neccessary */ + if ( indepFlag ) + { + /* reset of coder */ + IGFSCFDecoderReset( hPublicData ); + } + + decode_sfe_vector( hPublicData, st, hPublicData->t, hPublicData->prev, sfe, hPublicData->scfCountLongBlock[igfGridIdx] ); + + get_next_indice_tmp( st, -14 ); /* finish decoding (arith_decode_flush) return back the least significant 14 bits to the bitstream */ + + /* advance history */ + mvs2s( sfe, hPublicData->prev, hPublicData->scfCountLongBlock[igfGridIdx] ); + hPublicData->t++; + + hPublicData->bitsRead = st->next_bit_pos - hPublicData->bitsRead; + + return; +} diff --git a/lib_dec/init_dec.c b/lib_dec/init_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..6d28498413c7639250ee5e0f8ebcdde202afd332 --- /dev/null +++ b/lib_dec/init_dec.c @@ -0,0 +1,775 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "ivas_cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "wmc_auto.h" + +/*----------------------------------------------------------------------* + * init_decoder() + * + * Initialization of static variables for the decoder + *----------------------------------------------------------------------*/ + +ivas_error init_decoder( + Decoder_State *st, /* o : Decoder static variables structure */ + const int16_t idchan, /* i : channel ID */ + const MC_MODE mc_mode /* i : MC mode */ +) +{ + int16_t i; + ivas_error error; + + error = IVAS_ERR_OK; + + /*-----------------------------------------------------------------* + * General parameters + *-----------------------------------------------------------------*/ + + st->codec_mode = MODE1; + st->last_codec_mode = MODE1; + st->core = ACELP_CORE; + st->L_frame = L_FRAME; + st->extl = -1; + st->extl_orig = -1; + st->extl_brate_orig = 0; + st->last_bits_frame_nominal = -1; + st->total_brate = ACELP_8k00; + st->last_total_brate = -1; + st->last_total_brate_ber = -1; + st->core_brate = ACELP_8k00; + st->ini_frame = 0; + st->bwidth = NB; + st->last_bwidth = NB; + st->extl_brate = 0; + + st->coder_type = GENERIC; + st->last_coder_type = GENERIC; + st->inactive_coder_type_flag = 0; + st->last_L_frame = st->L_frame; + st->last_core_brate = st->core_brate; + st->last_core = -1; + st->last_extl = st->extl; + + st->flag_ACELP16k = set_ACELP_flag( st->element_mode, st->total_brate, st->total_brate, idchan, 0, -1, -1 ); + + /*-----------------------------------------------------------------* + * ACELP core parameters + *-----------------------------------------------------------------*/ + + /* LSF initilalizations */ + mvr2r( GEWB_Ave, st->mem_AR, M ); + + set_f( st->mem_MA, 0, M ); + set_f( st->dispMem, 0, 8 ); + + st->tilt_code = 0.0f; + st->gc_threshold = 0.0f; + st->last_good = UNVOICED_CLAS; + st->clas_dec = UNVOICED_CLAS; + st->low_rate_mode = 0; + st->last_low_rate_mode = 0; + + st->lp_gainp = 0.0f; + st->lp_gainc = 0.0f; + + set_f( st->old_exc, 0, L_EXC_MEM_DEC ); + + /* AVQ pre-quantizer memory */ + st->mem_preemp_preQ = 0.0f; + st->last_nq_preQ = 0; + st->last_code_preq = 0; + st->use_acelp_preq = 0; + + st->mem_deemph = 0.0f; + + set_f( st->mem_syn1, 0, M ); + set_f( st->mem_syn2, 0, M ); + st->stab_fac = 0.0f; + st->stab_fac_smooth = 0.0f; + set_f( st->agc_mem2, 0, 2 ); + set_f( st->mem_syn3, 0, M ); + st->stab_fac_smooth_lt = 0.0f; + st->log_energy_diff_lt = 0.0f; + st->log_energy_old = 0.0f; + + mvr2r( GEWB_Ave, st->lsf_old, M ); + lsf2lsp( st->lsf_old, st->lsp_old, M, INT_FS_12k8 ); + + st->mid_lsf_int = 0; + st->safety_net = 0; + + /* FEC */ + st->scaling_flag = 0; + st->lp_ener_FEC_av = 5.0e5f; + st->lp_ener_FEC_max = 5.0e5f; + st->prev_bfi = 0; + st->lp_ener_bfi = 60.0f; + st->old_enr_LP = 0.0f; + st->lp_ener = 0.0f; + st->enr_old = 0.0f; + st->bfi_pitch = (float) L_SUBFR; + st->bfi_pitch_frame = L_FRAME; + set_f( st->mem_syn_clas_estim, 0.0f, L_SYN_MEM_CLAS_ESTIM ); + st->last_con_tcx = 0; + + for ( i = 0; i < 2 * NB_SUBFR16k; i++ ) + { + st->old_pitch_buf[i] = (float) L_SUBFR; + } + + st->upd_cnt = MAX_UPD_CNT; + + mvr2r( GEWB_Ave, st->lsfoldbfi0, M ); + mvr2r( GEWB_Ave, st->lsfoldbfi1, M ); + mvr2r( GEWB_Ave, st->lsf_adaptive_mean, M ); + + st->seed_acelp = RANDOM_INITSEED; + st->seed = RANDOM_INITSEED; + st->nbLostCmpt = 0; + st->decision_hyst = 0; + + /* Stationary noise UV modification */ + st->unv_cnt = 0; + st->ge_sm = 10; + st->uv_count = 0; + st->act_count = 3; + mvr2r( st->lsp_old, st->lspold_s, M ); + st->noimix_seed = RANDOM_INITSEED; + st->min_alpha = 1; + st->exc_pe = 0; + + st->prev_coder_type = GENERIC; + st->tilt_wb = 0.0f; + + st->last_voice_factor = 0.0f; + set_f( st->prev_synth_buffer, 0, NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_CLDFB_NS ) ); + + st->old_bfi_cnt = 0; + + /*-----------------------------------------------------------------* + * parameters for AC mode (GSC) + *-----------------------------------------------------------------*/ + + st->GSC_noisy_speech = 0; + st->GSC_IVAS_mode = 0; + st->Last_GSC_noisy_speech_flag = 0; + + if ( ( idchan == 0 && st->element_mode != IVAS_CPE_MDCT ) || st->element_mode == IVAS_CPE_TD ) + { + if ( ( st->hGSCDec = (GSC_DEC_HANDLE) malloc( sizeof( GSC_DEC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for GSC\n" ) ); + } + + GSC_dec_init( st->hGSCDec ); + } + else + { + st->hGSCDec = NULL; + } + + /*-----------------------------------------------------------------* + * parameters for fast recovery (WI) + *-----------------------------------------------------------------*/ + + if ( st->output_Fs == 16000 && st->element_mode == EVS_MONO ) + { + if ( ( st->hWIDec = (WI_DEC_HANDLE) malloc( sizeof( WI_DEC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for FEC WI\n" ) ); + } + + set_f( st->hWIDec->old_exc2, 0, L_EXC_MEM ); + set_f( st->hWIDec->old_syn2, 0, L_EXC_MEM ); + } + else + { + st->hWIDec = NULL; + } + + /*-----------------------------------------------------------------* + * NB/formant post-filter + *-----------------------------------------------------------------*/ + + if ( ( idchan == 0 && st->element_mode != IVAS_CPE_MDCT ) || st->element_mode == IVAS_CPE_TD ) + { + if ( ( st->hPFstat = (PFSTAT_HANDLE) malloc( sizeof( PFSTAT ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for NB/formant postflter\n" ) ); + } + + Init_post_filter( st->hPFstat ); + st->psf_lp_noise = 0.0f; + } + else + { + st->hPFstat = NULL; + } + + /*-----------------------------------------------------------------* + * HF (6-7kHz) (zero) BWE parameters + *-----------------------------------------------------------------*/ + + if ( ( idchan == 0 && st->element_mode != IVAS_CPE_MDCT ) || st->element_mode == IVAS_CPE_TD ) + { + if ( ( st->hBWE_zero = (ZERO_BWE_DEC_HANDLE) malloc( sizeof( ZERO_BWE_DEC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for zero BWE\n" ) ); + } + + hf_synth_init( st->hBWE_zero ); + } + else + { + st->hBWE_zero = NULL; + } + + + /*-----------------------------------------------------------------* + * LD music post-filter + *-----------------------------------------------------------------*/ + + if ( ( idchan == 0 && st->element_mode != IVAS_CPE_MDCT ) || st->element_mode == IVAS_CPE_TD ) + { + if ( ( st->hMusicPF = (MUSIC_POSTFILT_HANDLE) malloc( sizeof( MUSIC_POSTFILT_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LD music postflter\n" ) ); + } + + music_postfilt_init( st->hMusicPF ); + } + else + { + st->hMusicPF = NULL; + } + + /*-----------------------------------------------------------------* + * CNG and DTX + *-----------------------------------------------------------------*/ + + st->first_CNG = 0; + st->cng_type = -1; + st->last_vad = 0; + st->last_active_brate = ACELP_7k20; + st->last_CNG_L_frame = L_FRAME; + + st->active_cnt = 20; + + if ( idchan == 0 && ( st->element_mode == EVS_MONO || st->element_mode == IVAS_CPE_DFT || st->element_mode == IVAS_CPE_TD ) ) + { + if ( ( st->hTdCngDec = (TD_CNG_DEC_HANDLE) malloc( sizeof( TD_CNG_DEC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DTX/TD CNG\n" ) ); + } + + td_cng_dec_init( st ); + } + else + { + st->hTdCngDec = NULL; + } + + st->masa_sid_format = 0; + + /*-----------------------------------------------------------------* + * HQ core parameters + *-----------------------------------------------------------------*/ + + st->prev_old_bfi = 0; + set_f( st->delay_buf_out, 0, HQ_DELTA_MAX * HQ_DELAY_COMP ); + set_f( st->previoussynth, 0, L_FRAME48k ); + + if ( st->element_mode == EVS_MONO ) + { + set_f( st->old_synth_sw, 0.0f, NS2SA( 48000, FRAME_SIZE_NS - ACELP_LOOK_NS - DELAY_BWE_TOTAL_NS ) ); + } + + if ( ( idchan == 0 || st->element_mode == IVAS_CPE_MDCT || st->element_mode == IVAS_SCE || st->element_mode == EVS_MONO ) ) + { + if ( ( st->hHQ_core = (HQ_DEC_HANDLE) malloc( sizeof( HQ_DEC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HQ core\n" ) ); + } + + /* HQ core initialization */ + HQ_core_dec_init( st->hHQ_core ); + + if ( st->element_mode == EVS_MONO ) + { + /* HQ NB FEC initialization */ + if ( ( st->hHQ_nbfec = (HQ_NBFEC_HANDLE) malloc( sizeof( HQ_NBFEC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HQ NB FEC\n" ) ); + } + HQ_nbfec_init( st->hHQ_nbfec ); + } + else + { + st->hHQ_nbfec = NULL; + } + } + else + { + st->hHQ_core = NULL; + st->hHQ_nbfec = NULL; + } + + /*-----------------------------------------------------------------* + * TBE parameters + *-----------------------------------------------------------------*/ + + if ( idchan == 0 && st->element_mode != IVAS_CPE_MDCT ) + { + if ( ( st->hBWE_TD = (TD_BWE_DEC_HANDLE) malloc( sizeof( TD_BWE_DEC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD BWE\n" ) ); + } + + td_bwe_dec_init( st->hBWE_TD, st->extl, st->output_Fs ); + } + else + { + st->hBWE_TD = NULL; + } + + st->old_bwe_delay = -1; + set_f( st->hb_prev_synth_buffer, 0, NS2SA( 48000, DELAY_BWE_TOTAL_NS ) ); + + /*-----------------------------------------------------------------* + * SWB BWE parameters + *-----------------------------------------------------------------*/ + + if ( idchan == 0 && st->element_mode != IVAS_CPE_MDCT ) + { + if ( ( st->hBWE_FD = (FD_BWE_DEC_HANDLE) malloc( sizeof( FD_BWE_DEC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for FD BWE\n" ) ); + } + + fd_bwe_dec_init( st->hBWE_FD ); + } + else + { + st->hBWE_FD = NULL; + } + + /*-----------------------------------------------------------------* + * WB/SWB bandwidth switching parameters + *-----------------------------------------------------------------*/ + + st->tilt_swb = 0.0f; + st->prev_ener_shb = 0.0f; + st->prev_enerLH = 0.0f; + st->enerLH = 0.0f; + st->enerLL = 0.0f; + st->prev_enerLL = 0.0f; + st->prev_fractive = 0; + st->prev_bws_cnt = 0; + st->bws_cnt = N_WS2N_FRAMES; + st->bws_cnt1 = N_NS2W_FRAMES; + st->attenu1 = 0.1f; + st->last_inner_frame = L_FRAME8k; + + /*-----------------------------------------------------------------* + * HR SWB BWE parameters + *-----------------------------------------------------------------*/ + + if ( st->element_mode == EVS_MONO ) + { + if ( ( st->hBWE_FD_HR = (HR_BWE_DEC_HANDLE) malloc( sizeof( HR_BWE_DEC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HR BWE\n" ) ); + } + + hr_bwe_dec_init( st->hBWE_FD_HR ); + } + else + { + st->hBWE_FD_HR = NULL; + } + + /*----------------------------------------------------------------------------------* + * AMR-WB IO mode parameters + *----------------------------------------------------------------------------------*/ + + if ( st->Opt_AMR_WB || st->element_mode == EVS_MONO ) + { + if ( ( st->hAmrwb_IO = (AMRWB_IO_DEC_HANDLE) malloc( sizeof( AMRWB_IO_DEC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for AMR-WB IO\n" ) ); + } + + /* AMR-WB IO init */ + amr_wb_dec_init( st->hAmrwb_IO ); + + /* AMR-WB IO HF synth init */ + hf_synth_amr_wb_init( st->hAmrwb_IO ); + } + else + { + st->hAmrwb_IO = NULL; + } + + /*-----------------------------------------------------------------* + * channel-aware mode parameters + *-----------------------------------------------------------------*/ + + set_f( st->tilt_code_dec, 0.0f, NB_SUBFR16k ); + + st->use_partial_copy = 0; + st->prev_use_partial_copy = 0; + st->rf_flag = 0; + st->rf_flag_last = 0; + st->prev_rf_frame_type = 0; + st->next_coder_type = 0; + + st->rf_target_bits = 0; + + st->rf_indx_nelp_fid = 0; + st->rf_indx_nelp_iG1 = 0; + st->rf_indx_nelp_iG2[0] = 0; + st->rf_indx_nelp_iG2[1] = 0; + st->rf_indx_tbeGainFr = 0; + + /*-----------------------------------------------------------------* + * Bass post-filter parameters + *-----------------------------------------------------------------*/ + + st->bpf_off = 0; + + if ( ( idchan == 0 && st->element_mode != IVAS_CPE_MDCT ) || st->element_mode == IVAS_CPE_TD ) + { + if ( ( st->hBPF = (BPF_DEC_HANDLE) malloc( sizeof( BPF_DEC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for BPF\n" ) ); + } + + bass_psfilter_init( st->hBPF ); + } + else + { + st->hBPF = NULL; + } + + /*-----------------------------------------------------------------* + * FD BPF & resampling tools parameters + *-----------------------------------------------------------------*/ + + if ( ( idchan == 0 && st->element_mode != IVAS_CPE_MDCT ) || st->element_mode == IVAS_CPE_TD ) + { + /* open analysis for max. sampling rate 48kHz */ + if ( ( error = openCldfb( &st->cldfbAna, CLDFB_ANALYSIS, 48000, CLDFB_PROTOTYPE_1_25MS ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* open analysis BPF for max. internal sampling rate 16kHz */ + if ( ( error = openCldfb( &st->cldfbBPF, CLDFB_ANALYSIS, 16000, CLDFB_PROTOTYPE_1_25MS ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + st->cldfbAna = NULL; + st->cldfbBPF = NULL; + } + + /* open synthesis for output sampling rate */ + if ( ( error = openCldfb( &st->cldfbSyn, CLDFB_SYNTHESIS, st->output_Fs, CLDFB_PROTOTYPE_1_25MS ) ) != IVAS_ERR_OK ) + { + return error; + } + + st->cldfbSynHB = NULL; + + st->last_active_bandsToZero_bwdec = 0; + st->perc_bwddec = 0.0f; + st->last_flag_filter_NB = 0; + st->active_frame_cnt_bwddec = 0; + st->total_frame_cnt_bwddec = 0; + set_s( st->flag_buffer, 0, 20 ); + st->avg_nrg_LT = 0.0f; + + /*-----------------------------------------------------------------* + * Noise gate parameters + *-----------------------------------------------------------------*/ + + st->ng_ener_ST = -51.0f; + + st->old_Es_pred = 0; + set_f( st->old_Aq_12_8 + 1, 0, M ); + st->old_Aq_12_8[0] = 1; + + /*-----------------------------------------------------------------* + * SC-VBR parameters + *-----------------------------------------------------------------*/ + + if ( st->element_mode == EVS_MONO ) + { + if ( ( st->hSC_VBR = (SC_VBR_DEC_HANDLE) malloc( sizeof( SC_VBR_DEC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SC-VBR\n" ) ); + } + + sc_vbr_dec_init( st->hSC_VBR ); + } + else + { + st->hSC_VBR = NULL; + } + + st->last_ppp_mode_dec = 0; + st->old_ppp_mode = 0; + st->ppp_mode_dec = 0; + st->last_nelp_mode_dec = 0; + st->nelp_mode_dec = 0; + st->prev_gain_pit_dec = 0.0f; + st->prev_tilt_code_dec = 0.0f; + st->vbr_hw_BWE_disable_dec = 0; + st->last_vbr_hw_BWE_disable_dec = 0; + + + /*-----------------------------------------------------------------* + * TCX core + *-----------------------------------------------------------------*/ + + /* TCX-LTP */ + if ( ( idchan == 0 || st->element_mode == IVAS_CPE_MDCT ) ) + { + if ( ( st->hTcxLtpDec = (TCX_LTP_DEC_HANDLE) malloc( sizeof( TCX_LTP_DEC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TCX-LTP handle\n" ) ); + } + } + else + { + st->hTcxLtpDec = NULL; + } + + /* TCX core */ + + if ( idchan == 0 || st->element_mode == IVAS_CPE_MDCT ) + { + if ( ( st->hTcxDec = (TCX_DEC_HANDLE) malloc( sizeof( TCX_DEC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for hTcxDec\n" ) ); + } + + set_f( st->hTcxDec->FBTCXdelayBuf, 0.0f, 111 ); + + st->hTcxDec->old_synthFB = st->hTcxDec->synth_history + NS2SA( st->output_Fs, PH_ECU_MEM_NS ); + st->hTcxDec->prev_good_synth = st->hTcxDec->old_synthFB + NS2SA( st->output_Fs, PH_ECU_LOOKAHEAD_NS ); + } + else + { + st->hTcxDec = NULL; + } + + /* TCX config. data structure */ + if ( ( idchan == 0 || st->element_mode == IVAS_CPE_MDCT ) ) + { + if ( ( st->hTcxCfg = (TCX_CONFIG_HANDLE) malloc( sizeof( TCX_config ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for hTcxCfg\n" ) ); + } + } + else + { + st->hTcxCfg = NULL; + } + + /* Tonal MDCT concealment data structure */ + if ( ( idchan == 0 || st->element_mode == IVAS_CPE_MDCT ) ) + { + if ( ( st->hTonalMDCTConc = (TonalMDCTConcealPtr) malloc( sizeof( TonalMDCTConceal_INSTANCE ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TonalMDCTConcealment\n" ) ); + } + } + else + { + st->hTonalMDCTConc = NULL; + } + + /*-----------------------------------------------------------------* + * IGF + *-----------------------------------------------------------------*/ + + if ( ( idchan == 0 || st->element_mode == IVAS_CPE_MDCT ) ) + { + if ( ( st->hIGFDec = (IGF_DEC_INSTANCE_HANDLE) malloc( sizeof( IGFDEC_INSTANCE ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for IGF\n" ) ); + } + + st->igf = 0; + init_igf_dec( st->hIGFDec ); + } + else + { + st->hIGFDec = NULL; + } + + /*-----------------------------------------------------------------* + * Mode 2 initialization + *-----------------------------------------------------------------*/ + + if ( st->element_mode == EVS_MONO ) + { + if ( ( st->hPlcInfo = (T_PLCInfo_HANDLE) malloc( sizeof( T_PLCInfo ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for PLC handle\n" ) ); + } + } + else + { + st->hPlcInfo = NULL; + } + + if ( st->element_mode == EVS_MONO ) + { + if ( ( st->hTECDec = (TEC_DEC_HANDLE) malloc( sizeof( TEC_DEC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TEC\n" ) ); + } + } + else + { + st->hTECDec = NULL; + } + + /* Init Core Decoder */ + open_decoder_LPD( st, st->total_brate, st->last_total_brate, st->bwidth, 0, st->element_mode, 1 ); + + /* PLC mode initialization */ + st->m_decodeMode = DEC_NO_FRAM_LOSS; + + /* Init bandwidth / frame_type */ + st->m_frame_type = ACTIVE_FRAME; + st->m_old_frame_type = ACTIVE_FRAME; + + if ( ( idchan == 0 && st->element_mode != IVAS_CPE_MDCT ) ) + { + resampleCldfb( st->cldfbAna, st->L_frame * FRAMES_PER_SEC ); + resampleCldfb( st->cldfbBPF, st->L_frame * FRAMES_PER_SEC ); + } + + /*-----------------------------------------------------------------* + * FD-CNG decoder + *-----------------------------------------------------------------*/ + + if ( ( st->element_mode == IVAS_CPE_MDCT || idchan == 0 ) && mc_mode != MC_MODE_MCT && mc_mode != MC_MODE_PARAMUPMIX ) + { + /* Create FD_CNG instance */ + if ( ( error = createFdCngDec( &st->hFdCngDec ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Init FD-CNG */ + initFdCngDec( st ); + } + else + { + st->hFdCngDec = NULL; + } + + st->cngTDLevel = 0.f; + st->lp_noise = -20.0f; + st->force_lpd_reset = 0; + + /*-----------------------------------------------------------------* + * IVAS parameters + *-----------------------------------------------------------------*/ + + st->tdm_LRTD_flag = 0; + st->cna_dirac_flag = 0; + st->cng_sba_flag = 0; + st->cng_ism_flag = 0; + + return error; +} + + +/*----------------------------------------------------------------------* + * reset_preecho_dec() + * + * Initialization of static variables for pre-echo + *----------------------------------------------------------------------*/ + +void reset_preecho_dec( + HQ_DEC_HANDLE hHQ_core /* i/o: HQ decoder handle */ +) +{ + hHQ_core->memfilt_lb = 0; + hHQ_core->mean_prev_hb = 0; + hHQ_core->smoothmem = 1; + hHQ_core->mean_prev = 0; + hHQ_core->mean_prev_nc = 0; + hHQ_core->wmold_hb = 1; + hHQ_core->prevflag = 0; + hHQ_core->pastpre = 0; + + return; +} + + +/*----------------------------------------------------------------------* + * destroy_cldfb_decoder() + * + * Free memory which was allocated in init_decoder() + *----------------------------------------------------------------------*/ + +void destroy_cldfb_decoder( + Decoder_State *st /* o : Decoder static variables structure */ +) +{ + /* CLDFB BPF & resampling tools */ + deleteCldfb( &st->cldfbAna ); /* delete analysis at max. sampling rate 48kHz */ + deleteCldfb( &st->cldfbBPF ); /* delete analysis BPF at max. internal sampling rate 16kHz */ + deleteCldfb( &st->cldfbSyn ); /* delete synthesis at output sampling rate */ + deleteCldfb( &st->cldfbSynHB ); + + deleteFdCngDec( &st->hFdCngDec ); + + return; +} diff --git a/lib_dec/inov_dec.c b/lib_dec/inov_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..adbbb4fd3783c4ad5113e41b06118d1c9197ea46 --- /dev/null +++ b/lib_dec/inov_dec.c @@ -0,0 +1,192 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "prot.h" +#include "ivas_prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*----------------------------------------------------------------------* + * inov_decode() + * + * Decode the algebraic innovation and do pitch sharpening + *----------------------------------------------------------------------*/ + +void inov_decode( + Decoder_State *st, /* i/o: decoder state structure */ + const int32_t core_brate, /* i : core bitrate */ + const int16_t Opt_AMR_WB, /* i : flag indicating AMR-WB IO mode */ + const int16_t L_frame, /* i : length of the frame */ + const int16_t sharpFlag, /* i : formant sharpening flag */ + const int16_t i_subfr, /* i : subframe index */ + const float *p_Aq, /* i : LP filter coefficients */ + const float tilt_code, /* i : tilt of the excitation of previous subframe */ + const float pt_pitch, /* i : pointer to current subframe fractional pitch*/ + float *code, /* o : algebraic excitation */ + const int16_t L_subfr /* i : subframe length */ +) +{ + int16_t nBits; + float g1, g2; + + if ( L_frame == L_FRAME ) + { + g1 = FORMANT_SHARPENING_G1; + g2 = FORMANT_SHARPENING_G2; + } + else + { + g1 = FORMANT_SHARPENING_G1_16k; + g2 = FORMANT_SHARPENING_G2_16k; + } + + if ( !Opt_AMR_WB ) + { + if ( st->acelp_cfg.fcb_mode ) + { + int16_t i; + int16_t indexing_indices[8], wordcnt, bitcnt; + PulseConfig config; + + if ( st->acelp_cfg.fixed_cdk_index[i_subfr / L_subfr] >= 0 ) + { + if ( L_subfr == 2 * L_SUBFR ) + { + nBits = st->acelp_cfg.fixed_cdk_index[i_subfr / L_subfr]; + + if ( nBits == 8 ) + { + dec_acelp_1t64( st, code, L_subfr ); + } + else + { + dec_acelp_fast( st, nBits, code, L_subfr ); + } + } + else if ( ( st->idchan == 1 && st->acelp_cfg.fixed_cdk_index[i_subfr / L_SUBFR] <= 7 ) || ( st->idchan == 0 && st->acelp_cfg.fixed_cdk_index[i_subfr / L_SUBFR] <= 3 ) ) + { + if ( st->acelp_cfg.fixed_cdk_index[i_subfr / L_SUBFR] == 0 ) + { + dec_acelp_1t64( st, code, L_SUBFR ); + } + else + { + dec_acelp_fast( st, st->acelp_cfg.fixed_cdk_index[i_subfr / L_SUBFR], code, L_SUBFR ); + } + } + else + { + wordcnt = ACELP_FIXED_CDK_BITS( st->acelp_cfg.fixed_cdk_index[i_subfr / L_SUBFR] ) >> 4; + bitcnt = ACELP_FIXED_CDK_BITS( st->acelp_cfg.fixed_cdk_index[i_subfr / L_SUBFR] ) & 15; + + for ( i = 0; i < wordcnt; i++ ) + { + indexing_indices[i] = get_next_indice( st, 16 ); + } + if ( bitcnt ) + { + indexing_indices[i] = get_next_indice( st, bitcnt ); + } + config = PulseConfTable[st->acelp_cfg.fixed_cdk_index[i_subfr / L_SUBFR]]; + D_ACELP_indexing( code, config, NB_TRACK_FCB_4T, indexing_indices, &st->BER_detect ); + } + } + else + { + set_f( code, 0.0f, L_SUBFR ); + } + } + else + { + nBits = st->acelp_cfg.fixed_cdk_index[i_subfr / L_SUBFR]; + + if ( nBits == 7 ) + { + dec_acelp_1t64( st, code, L_SUBFR ); + } + else if ( nBits == 12 ) + { + dec_acelp_2t32( st, code ); + } + else + { + dec_acelp_4t64( st, nBits, code, Opt_AMR_WB ); + } + } + } + else + { + if ( core_brate == ACELP_6k60 ) + { + dec_acelp_2t32( st, code ); + } + else if ( core_brate == ACELP_8k85 ) + { + dec_acelp_4t64( st, 20, code, Opt_AMR_WB ); + } + else if ( core_brate == ACELP_12k65 ) + { + dec_acelp_4t64( st, 36, code, Opt_AMR_WB ); + } + else if ( core_brate == ACELP_14k25 ) + { + dec_acelp_4t64( st, 44, code, Opt_AMR_WB ); + } + else if ( core_brate == ACELP_15k85 ) + { + dec_acelp_4t64( st, 52, code, Opt_AMR_WB ); + } + else if ( core_brate == ACELP_18k25 ) + { + dec_acelp_4t64( st, 64, code, Opt_AMR_WB ); + } + else if ( core_brate == ACELP_19k85 ) + { + dec_acelp_4t64( st, 72, code, Opt_AMR_WB ); + } + else + { + dec_acelp_4t64( st, 88, code, Opt_AMR_WB ); + } + } + + cb_shape( 1, 1, 0, sharpFlag, 0, g1, g2, p_Aq, code, tilt_code, pt_pitch, L_subfr ); + + return; +} diff --git a/lib_dec/ivas_agc_dec.c b/lib_dec/ivas_agc_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..c41dedf21e016aa885a8e89e28ee8432ad30733f --- /dev/null +++ b/lib_dec/ivas_agc_dec.c @@ -0,0 +1,277 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "prot.h" +#include "ivas_prot.h" +#include +#include +#include "wmc_auto.h" + + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_agc_dec_init() + * + * AGC decoder initialization call + * + *-----------------------------------------------------------------------------------------*/ + +static void ivas_agc_dec_init( + ivas_agc_dec_state_t *hAgcDec, /* i/o: AGC decoder handle */ + const int16_t output_frame, + const int16_t delay ) +{ + int16_t i; + ivas_agc_dec_chan_state_t *ptrG = hAgcDec->gain_state; + ivas_agc_chan_data_t *ptr = hAgcDec->gain_data; + + hAgcDec->agc_com.in_delay = delay; + hAgcDec->agc_com.num_coeff = IVAS_SPAR_MAX_DMX_CHS; + ivas_agc_calcGainParams( &hAgcDec->agc_com.absEmin, &hAgcDec->agc_com.betaE, &hAgcDec->agc_com.maxAttExp, hAgcDec->agc_com.num_coeff ); + + ivas_agc_initWindowFunc( hAgcDec->agc_com.winFunc, output_frame - hAgcDec->agc_com.in_delay ); + + for ( i = 0; i < IVAS_SPAR_MAX_DMX_CHS; i++ ) + { + /* gain_state */ + ptrG->lastGain = 1.f; + ptrG->gainExpVal = 0; + ptrG++; + + /* gain_data */ + ptr->absGainExp = hAgcDec->agc_com.absEmin; + ptr->absGainExpCurr = hAgcDec->agc_com.absEmin; + ptr++; + } + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_spar_agc_dec_open() + * + * Allocate and initialize SPAR AGC decoder handle + *------------------------------------------------------------------------*/ + +ivas_error ivas_spar_agc_dec_open( + ivas_agc_dec_state_t **hAgcDec, /* i/o: SPAR AGC decoder handle */ + const int32_t output_Fs /* i : output sampling rate */ +) +{ + ivas_agc_dec_state_t *hAgc; + int16_t output_frame, delay; + + if ( ( hAgc = (ivas_agc_dec_state_t *) malloc( sizeof( ivas_agc_dec_state_t ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for AGC decoder" ); + } + + output_frame = (int16_t) ( output_Fs / FRAMES_PER_SEC ); + delay = NS2SA( output_Fs, ( IVAS_ENC_DELAY_NS + IVAS_DEC_DELAY_NS ) ); + + if ( ( hAgc->agc_com.winFunc = (float *) malloc( sizeof( float ) * ( output_frame - delay ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for AGC decoder" ); + } + + if ( ( hAgc->gain_state = (ivas_agc_dec_chan_state_t *) malloc( sizeof( ivas_agc_dec_chan_state_t ) * FOA_CHANNELS ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for AGC decoder" ); + } + + if ( ( hAgc->gain_data = (ivas_agc_chan_data_t *) malloc( sizeof( ivas_agc_chan_data_t ) * FOA_CHANNELS ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for AGC decoder" ); + } + + ivas_agc_dec_init( hAgc, output_frame, delay ); + + *hAgcDec = hAgc; + + return IVAS_ERR_OK; +} + + +/*------------------------------------------------------------------------- + * ivas_spar_agc_dec_close() + * + * Deallocate SPAR AGC decoder handle + *------------------------------------------------------------------------*/ + +void ivas_spar_agc_dec_close( + ivas_agc_dec_state_t **hAgcDec /* i/o: SPAR AGC decoder handle */ +) +{ + ivas_agc_dec_state_t *hAgc; + + if ( hAgcDec == NULL || *hAgcDec == NULL ) + { + return; + } + + hAgc = *hAgcDec; + + free( hAgc->agc_com.winFunc ); + hAgc->agc_com.winFunc = NULL; + + free( hAgc->gain_state ); + hAgc->gain_state = NULL; + + free( hAgc->gain_data ); + hAgc->gain_data = NULL; + + free( *hAgcDec ); + *hAgcDec = NULL; + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_agc_dec_process() + * + * AGC decoder + *-----------------------------------------------------------------------------------------*/ + +void ivas_agc_dec_process( + ivas_agc_dec_state_t *hAgcDec, /* i/o: AGC decoder handle */ + float *pcm_in[], /* i : input audio channels */ + float *pcm_out[], /* o : output audio channels */ + const int16_t n_channels, /* i : number of channels */ + const int16_t output_frame /* i : output frame length */ +) +{ + int16_t i, idx; + uint16_t offset; + float gainLast, gain; + ivas_agc_dec_state_t *pState = hAgcDec; + + offset = output_frame - pState->agc_com.in_delay; + + for ( i = 0; i < n_channels; i++ ) + { + pState->gain_state[i].gainExpVal = pState->gain_data[i].absGainExp - pState->gain_data[i].absGainExpCurr; + + if ( ( pState->gain_state[i].gainExpVal > (int32_t) ( pState->agc_com.maxAttExp + 1 ) ) || ( pState->gain_state[i].gainExpVal < -1 ) ) + { + /* Such conditions indicate packet loss, better reset and do nothing*/ + pState->gain_data[i].absGainExp = pState->agc_com.absEmin; + pState->gain_state[i].gainExpVal = 0; + } + + pState->gain_state[i].lastGain = powf( pState->agc_com.winFunc[offset - 1], ( -1.f * (float) ( pState->gain_data[i].absGainExp - pState->agc_com.absEmin ) ) ); + gainLast = 1.f / pState->gain_state[i].lastGain; + + if ( pState->gain_state[i].gainExpVal != 0 ) + { + for ( idx = 0; idx < output_frame; idx++ ) + { + if ( idx >= pState->agc_com.in_delay ) + { + gain = powf( pState->agc_com.winFunc[idx - pState->agc_com.in_delay], (float) ( -1 * pState->gain_state[i].gainExpVal ) ) * gainLast; + } + else + { + gain = gainLast; + } + + pcm_out[i][idx] = pcm_in[i][idx] * gain; + } + + pState->gain_state[i].lastGain *= powf( pState->agc_com.winFunc[offset - 1], (float) pState->gain_state[i].gainExpVal ); + } + else + { + gain = gainLast; + for ( idx = 0; idx < output_frame; idx++ ) + { + pcm_out[i][idx] = pcm_in[i][idx] * gain; + } + } + pState->gain_data[i].absGainExp = pState->gain_data[i].absGainExpCurr; + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * ivas_agc_read_bits() + * + * decode AGC parameters + *-----------------------------------------------------------------------------------------*/ + +void ivas_agc_read_bits( + ivas_agc_dec_state_t *hAgcDec, /* i/o: AGC decoder handle */ + Decoder_State *st0, /* i/o: decoder state structure - for bitstream handling */ + const int16_t n_channels, /* i : number of channels */ + const int16_t AGC_flag /* i : AGC on/off flag */ +) +{ + int16_t i; + int16_t per_ch_bit[FOA_CHANNELS]; + ivas_agc_dec_state_t *pState = hAgcDec; + + set_s( per_ch_bit, 0, FOA_CHANNELS ); + + /* read AGC parameters */ + if ( AGC_flag == 1 ) + { + per_ch_bit[0] = 1; + + assert( AGC_BITS_PER_CH == ( pState->agc_com.betaE + 1 ) ); + for ( i = 0; i < n_channels; i++ ) + { + if ( per_ch_bit[i] == 1 ) + { + pState->gain_data[i].absGainExpCurr = get_next_indice( st0, (int16_t) pState->agc_com.betaE ); + } + else + { + pState->gain_data[i].absGainExpCurr = (int32_t) pState->agc_com.absEmin; + } + } + } + else + { + for ( i = 0; i < n_channels; i++ ) + { + pState->gain_data[i].absGainExpCurr = (int32_t) pState->agc_com.absEmin; + } + } + + + return; +} diff --git a/lib_dec/ivas_binRenderer_internal.c b/lib_dec/ivas_binRenderer_internal.c new file mode 100644 index 0000000000000000000000000000000000000000..b74191070efc78f2cbf854d699811d8f17df634e --- /dev/null +++ b/lib_dec/ivas_binRenderer_internal.c @@ -0,0 +1,1412 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_prot_rend.h" +#include "cnst.h" +#include "ivas_cnst.h" +#include "ivas_rom_rend.h" +#include "ivas_rom_dec.h" +#include "ivas_rom_com.h" +#include "ivas_rom_binauralRenderer.h" +#include "wmc_auto.h" + + +/*------------------------------------------------------------------------- + * ivas_binRenderer_filterModule() + * + * + *-------------------------------------------------------------------------*/ + +static void ivas_binRenderer_filterModule( + float out_Conv_CLDFB_real[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : real part of Binaural signals */ + float out_Conv_CLDFB_imag[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : imag part of Binaural signals */ + float CLDFB_real[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : real part of LS signals */ + float CLDFB_imag[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : imag part of LS signals */ + const int16_t numTimeSlots, /* i : number of time slots to process */ + BINAURAL_RENDERER_HANDLE hBinRenderer /* i/o: fastconv binaural renderer handle */ +) +{ + int16_t bandIdx, k, chIdx, tapIdx; + float *filterStatesLeftRealPtr, *filterStatesLeftImagPtr; + const float *filterTapsLeftRealPtr, *filterTapsLeftImagPtr, *filterTapsRightRealPtr, *filterTapsRightImagPtr; + + for ( bandIdx = 0; bandIdx < hBinRenderer->conv_band; bandIdx++ ) + { + for ( chIdx = 0; chIdx < hBinRenderer->nInChannels; chIdx++ ) + { + filterStatesLeftRealPtr = (float *) &( hBinRenderer->hBinRenConvModule->filterStatesLeftReal[bandIdx][chIdx][0] ); + filterStatesLeftImagPtr = (float *) &( hBinRenderer->hBinRenConvModule->filterStatesLeftImag[bandIdx][chIdx][0] ); + + filterTapsLeftRealPtr = hBinRenderer->hBinRenConvModule->filterTapsLeftReal[bandIdx][chIdx]; + filterTapsLeftImagPtr = hBinRenderer->hBinRenConvModule->filterTapsLeftImag[bandIdx][chIdx]; + filterTapsRightRealPtr = hBinRenderer->hBinRenConvModule->filterTapsRightReal[bandIdx][chIdx]; + filterTapsRightImagPtr = hBinRenderer->hBinRenConvModule->filterTapsRightImag[bandIdx][chIdx]; + + for ( k = 0; k < numTimeSlots; k++ ) + { + float outRealLeft = 0.0f, outRealRight = 0.0f, outImagLeft = 0.0f, outImagRight = 0.0f; + + for ( tapIdx = hBinRenderer->hBinRenConvModule->numTapsArray[bandIdx] - 1; tapIdx > 0; tapIdx-- ) + { + filterStatesLeftRealPtr[tapIdx] = filterStatesLeftRealPtr[tapIdx - 1]; + filterStatesLeftImagPtr[tapIdx] = filterStatesLeftImagPtr[tapIdx - 1]; + + /* Left Real and Imag */ + outRealLeft += ( filterStatesLeftRealPtr[tapIdx] * filterTapsLeftRealPtr[tapIdx] ) - ( filterStatesLeftImagPtr[tapIdx] * filterTapsLeftImagPtr[tapIdx] ); + outImagLeft += ( filterStatesLeftRealPtr[tapIdx] * filterTapsLeftImagPtr[tapIdx] ) + ( filterStatesLeftImagPtr[tapIdx] * filterTapsLeftRealPtr[tapIdx] ); + + /* Right Real and Imag*/ + outRealRight += ( filterStatesLeftRealPtr[tapIdx] * filterTapsRightRealPtr[tapIdx] ) - ( filterStatesLeftImagPtr[tapIdx] * filterTapsRightImagPtr[tapIdx] ); + outImagRight += ( filterStatesLeftRealPtr[tapIdx] * filterTapsRightImagPtr[tapIdx] ) + ( filterStatesLeftImagPtr[tapIdx] * filterTapsRightRealPtr[tapIdx] ); + } + + filterStatesLeftRealPtr[0] = CLDFB_real[chIdx][k][bandIdx]; + filterStatesLeftImagPtr[0] = CLDFB_imag[chIdx][k][bandIdx]; + + + /* Left Real and Imag */ + out_Conv_CLDFB_real[0][k][bandIdx] += outRealLeft + ( filterStatesLeftRealPtr[0] * filterTapsLeftRealPtr[0] ) - ( filterStatesLeftImagPtr[0] * filterTapsLeftImagPtr[0] ); + out_Conv_CLDFB_imag[0][k][bandIdx] += outImagLeft + ( filterStatesLeftRealPtr[0] * filterTapsLeftImagPtr[0] ) + ( filterStatesLeftImagPtr[0] * filterTapsLeftRealPtr[0] ); + + /* Right Real and Imag */ + out_Conv_CLDFB_real[1][k][bandIdx] += outRealRight + ( filterStatesLeftRealPtr[0] * filterTapsRightRealPtr[0] ) - ( filterStatesLeftImagPtr[0] * filterTapsRightImagPtr[0] ); + out_Conv_CLDFB_imag[1][k][bandIdx] += outImagRight + ( filterStatesLeftRealPtr[0] * filterTapsRightImagPtr[0] ) + ( filterStatesLeftImagPtr[0] * filterTapsRightRealPtr[0] ); + } + } + } + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_binRenderer_convModuleOpen() + * + * Open convolution module handle of fastconv binaural renderer + *-------------------------------------------------------------------------*/ + +static ivas_error ivas_binRenderer_convModuleOpen( + BINAURAL_RENDERER_HANDLE hBinRenderer, + const int16_t renderer_type, + const int16_t isLoudspeaker, + const AUDIO_CONFIG input_config, + const HRTFS_FASTCONV_HANDLE hHrtf +) +{ + int16_t bandIdx, chIdx; + BINRENDERER_CONV_MODULE_HANDLE hBinRenConvModule; + + /*-----------------------------------------------------------------* + * prepare library opening + *-----------------------------------------------------------------*/ + + if ( ( hBinRenConvModule = (BINRENDERER_CONV_MODULE_HANDLE) malloc( sizeof( BINRENDERER_CONV_MODULE ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Convolution Module \n" ) ); + } + + if ( !isLoudspeaker ) + { + hBinRenderer->nInChannels = audioCfg2channels( input_config ); + } + else + { + /* Note: needs to be revisited if multiple LFE support is required */ + hBinRenderer->nInChannels = ( audioCfg2channels( input_config ) - isLoudspeaker ); + } + + if ( renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) + { + hBinRenConvModule->numTaps = BINAURAL_NTAPS_MAX; + + /* Use variable order filtering */ + bandIdx = 0; + for ( ; bandIdx < 5; bandIdx++ ) + { + hBinRenConvModule->numTapsArray[bandIdx] = hBinRenConvModule->numTaps; + } + for ( ; bandIdx < 10; bandIdx++ ) + { + hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ceil( 0.6f * hBinRenConvModule->numTaps ); + } + for ( ; bandIdx < 20; bandIdx++ ) + { + hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ceil( 0.5f * hBinRenConvModule->numTaps ); + } + for ( ; bandIdx < 30; bandIdx++ ) + { + hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ceil( 0.4f * hBinRenConvModule->numTaps ); + } + for ( ; bandIdx < hBinRenderer->conv_band; bandIdx++ ) + { + hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ceil( 0.3f * hBinRenConvModule->numTaps ); + } + } + else + { + if ( hBinRenderer->ivas_format == SBA_FORMAT ) + { + hBinRenConvModule->numTaps = BINAURAL_NTAPS_SBA; + } + else + { + hBinRenConvModule->numTaps = BINAURAL_NTAPS; + } + + /* Use fixed order filtering */ + bandIdx = 0; + for ( ; bandIdx < hBinRenderer->conv_band; bandIdx++ ) + { + hBinRenConvModule->numTapsArray[bandIdx] = hBinRenConvModule->numTaps; + } + } + + /* allocate memory for filter states */ + if ( ( hBinRenConvModule->filterTapsLeftReal = (float ***) malloc( hBinRenderer->conv_band * sizeof( float ** ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Convolution Module \n" ) ); + } + + if ( ( hBinRenConvModule->filterTapsLeftImag = (float ***) malloc( hBinRenderer->conv_band * sizeof( float ** ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Convolution Module \n" ) ); + } + + if ( ( hBinRenConvModule->filterTapsRightReal = (float ***) malloc( hBinRenderer->conv_band * sizeof( float ** ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Convolution Module \n" ) ); + } + + if ( ( hBinRenConvModule->filterTapsRightImag = (float ***) malloc( hBinRenderer->conv_band * sizeof( float ** ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Convolution Module \n" ) ); + } + + for ( bandIdx = 0; bandIdx < hBinRenderer->conv_band; bandIdx++ ) + { + if ( ( hBinRenConvModule->filterTapsLeftReal[bandIdx] = (float **) malloc( hBinRenderer->nInChannels * sizeof( float * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Convolution Module \n" ) ); + } + + if ( ( hBinRenConvModule->filterTapsLeftImag[bandIdx] = (float **) malloc( hBinRenderer->nInChannels * sizeof( float * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Convolution Module \n" ) ); + } + + if ( ( hBinRenConvModule->filterTapsRightReal[bandIdx] = (float **) malloc( hBinRenderer->nInChannels * sizeof( float * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Convolution Module \n" ) ); + } + + if ( ( hBinRenConvModule->filterTapsRightImag[bandIdx] = (float **) malloc( hBinRenderer->nInChannels * sizeof( float * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Convolution Module \n" ) ); + } + } + + + if ( ( hBinRenConvModule->filterStatesLeftReal = (float ***) malloc( hBinRenderer->conv_band * sizeof( float ** ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Convolution Module \n" ) ); + } + + if ( ( hBinRenConvModule->filterStatesLeftImag = (float ***) malloc( hBinRenderer->conv_band * sizeof( float ** ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Convolution Module \n" ) ); + } + + for ( bandIdx = 0; bandIdx < hBinRenderer->conv_band; bandIdx++ ) + { + if ( ( hBinRenConvModule->filterStatesLeftReal[bandIdx] = (float **) malloc( hBinRenderer->nInChannels * sizeof( float * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Convolution Module \n" ) ); + } + + if ( ( hBinRenConvModule->filterStatesLeftImag[bandIdx] = (float **) malloc( hBinRenderer->nInChannels * sizeof( float * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Convolution Module \n" ) ); + } + + for ( chIdx = 0; chIdx < hBinRenderer->nInChannels; chIdx++ ) + { + if ( ( hBinRenConvModule->filterStatesLeftReal[bandIdx][chIdx] = (float *) malloc( hBinRenConvModule->numTapsArray[bandIdx] * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Convolution Module \n" ) ); + } + + if ( ( hBinRenConvModule->filterStatesLeftImag[bandIdx][chIdx] = (float *) malloc( hBinRenConvModule->numTapsArray[bandIdx] * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Convolution Module \n" ) ); + } + } + } + + /* set memories */ + for ( bandIdx = 0; bandIdx < hBinRenderer->conv_band; bandIdx++ ) + { + for ( chIdx = 0; chIdx < hBinRenderer->nInChannels; chIdx++ ) + { + int16_t tmp = 0; + + if ( isLoudspeaker ) + { + if ( input_config == IVAS_AUDIO_CONFIG_5_1 ) + { + tmp = channelIndex_CICP6[chIdx]; + } + else if ( input_config == IVAS_AUDIO_CONFIG_7_1 ) + { + tmp = channelIndex_CICP12[chIdx]; + } + else if ( input_config == IVAS_AUDIO_CONFIG_5_1_2 ) + { + tmp = channelIndex_CICP14[chIdx]; + } + else if ( input_config == IVAS_AUDIO_CONFIG_5_1_4 ) + { + tmp = channelIndex_CICP16[chIdx]; + } + else if ( input_config == IVAS_AUDIO_CONFIG_7_1_4 ) + { + tmp = channelIndex_CICP19[chIdx]; + } + } + + if ( renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) + { + /* set the memories to zero */ + set_zero( hBinRenConvModule->filterStatesLeftReal[bandIdx][chIdx], hBinRenConvModule->numTapsArray[bandIdx] ); + set_zero( hBinRenConvModule->filterStatesLeftImag[bandIdx][chIdx], hBinRenConvModule->numTapsArray[bandIdx] ); + if ( isLoudspeaker ) + { + hBinRenConvModule->filterTapsLeftReal[bandIdx][chIdx] = hHrtf->leftBRIRReal[bandIdx][tmp]; + hBinRenConvModule->filterTapsLeftImag[bandIdx][chIdx] = hHrtf->leftBRIRImag[bandIdx][tmp]; + hBinRenConvModule->filterTapsRightReal[bandIdx][chIdx] = hHrtf->rightBRIRReal[bandIdx][tmp]; + hBinRenConvModule->filterTapsRightImag[bandIdx][chIdx] = hHrtf->rightBRIRImag[bandIdx][tmp]; + } + } + else + { + /* set the memories to zero */ + set_zero( hBinRenConvModule->filterStatesLeftReal[bandIdx][chIdx], hBinRenConvModule->numTaps ); + set_zero( hBinRenConvModule->filterStatesLeftImag[bandIdx][chIdx], hBinRenConvModule->numTaps ); + if ( isLoudspeaker ) + { + hBinRenConvModule->filterTapsLeftReal[bandIdx][chIdx] = hHrtf->leftHRIRReal[bandIdx][tmp]; + hBinRenConvModule->filterTapsLeftImag[bandIdx][chIdx] = hHrtf->leftHRIRImag[bandIdx][tmp]; + hBinRenConvModule->filterTapsRightReal[bandIdx][chIdx] = hHrtf->rightHRIRReal[bandIdx][tmp]; + hBinRenConvModule->filterTapsRightImag[bandIdx][chIdx] = hHrtf->rightHRIRImag[bandIdx][tmp]; + } + else + { + if ( input_config == IVAS_AUDIO_CONFIG_HOA3 ) + { + /* HOA3 filter coefficients */ + hBinRenConvModule->filterTapsLeftReal[bandIdx][chIdx] = hHrtf->leftHRIRReal_HOA3[bandIdx][chIdx]; + hBinRenConvModule->filterTapsLeftImag[bandIdx][chIdx] = hHrtf->leftHRIRImag_HOA3[bandIdx][chIdx]; + hBinRenConvModule->filterTapsRightReal[bandIdx][chIdx] = hHrtf->rightHRIRReal_HOA3[bandIdx][chIdx]; + hBinRenConvModule->filterTapsRightImag[bandIdx][chIdx] = hHrtf->rightHRIRImag_HOA3[bandIdx][chIdx]; + } + else if ( input_config == IVAS_AUDIO_CONFIG_HOA2 ) + { + /* HOA2 filter coefficients */ + hBinRenConvModule->filterTapsLeftReal[bandIdx][chIdx] = hHrtf->leftHRIRReal_HOA2[bandIdx][chIdx]; + hBinRenConvModule->filterTapsLeftImag[bandIdx][chIdx] = hHrtf->leftHRIRImag_HOA2[bandIdx][chIdx]; + hBinRenConvModule->filterTapsRightReal[bandIdx][chIdx] = hHrtf->rightHRIRReal_HOA2[bandIdx][chIdx]; + hBinRenConvModule->filterTapsRightImag[bandIdx][chIdx] = hHrtf->rightHRIRImag_HOA2[bandIdx][chIdx]; + } + else if ( input_config == IVAS_AUDIO_CONFIG_FOA ) + { + /* FOA filter coefficients */ + hBinRenConvModule->filterTapsLeftReal[bandIdx][chIdx] = hHrtf->leftHRIRReal_FOA[bandIdx][chIdx]; + hBinRenConvModule->filterTapsLeftImag[bandIdx][chIdx] = hHrtf->leftHRIRImag_FOA[bandIdx][chIdx]; + hBinRenConvModule->filterTapsRightReal[bandIdx][chIdx] = hHrtf->rightHRIRReal_FOA[bandIdx][chIdx]; + hBinRenConvModule->filterTapsRightImag[bandIdx][chIdx] = hHrtf->rightHRIRImag_FOA[bandIdx][chIdx]; + } + else + { + return IVAS_ERR_INVALID_INPUT_FORMAT; + } + } + } + } + } + + + hBinRenderer->hBinRenConvModule = hBinRenConvModule; + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------------* + * ivas_init_binaural_hrtf() + * + * initialize memory for HrtfFastConv structure elements + *-------------------------------------------------------------------------*/ + +void ivas_init_binaural_hrtf( + HRTFS_FASTCONV *HrtfFastConv /* i/o: FASTCONV HRTF structure */ +) +{ + int16_t i; + + HrtfFastConv->leftHRIRReal_HOA3 = NULL; + HrtfFastConv->leftHRIRImag_HOA3 = NULL; + HrtfFastConv->rightHRIRReal_HOA3 = NULL; + HrtfFastConv->rightHRIRImag_HOA3 = NULL; + HrtfFastConv->FASTCONV_HOA3_latency_s = 0x00; + + HrtfFastConv->leftHRIRReal = NULL; + HrtfFastConv->leftHRIRImag = NULL; + HrtfFastConv->rightHRIRReal = NULL; + HrtfFastConv->rightHRIRImag = NULL; + HrtfFastConv->FASTCONV_HRIR_latency_s = 0x00; + + HrtfFastConv->leftBRIRReal = NULL; + HrtfFastConv->leftBRIRImag = NULL; + HrtfFastConv->rightBRIRReal = NULL; + HrtfFastConv->rightBRIRImag = NULL; + HrtfFastConv->FASTCONV_BRIR_latency_s = 0x00; + + HrtfFastConv->leftHRIRReal_HOA2 = NULL; + HrtfFastConv->leftHRIRImag_HOA2 = NULL; + HrtfFastConv->rightHRIRReal_HOA2 = NULL; + HrtfFastConv->rightHRIRImag_HOA2 = NULL; + HrtfFastConv->FASTCONV_HOA2_latency_s = 0x00; + + HrtfFastConv->leftHRIRReal_FOA = NULL; + HrtfFastConv->leftHRIRImag_FOA = NULL; + HrtfFastConv->rightHRIRReal_FOA = NULL; + HrtfFastConv->rightHRIRImag_FOA = NULL; + HrtfFastConv->FASTCONV_FOA_latency_s = 0x00; + + HrtfFastConv->allocate_init_flag = 0x00; + + for ( i = 0; i < CLDFB_NO_CHANNELS_MAX; i++ ) + { + HrtfFastConv->fastconvReverberationEneCorrections[i] = 0x00; + HrtfFastConv->fastconvReverberationEneCorrections[i] = 0x00; + } + + return; +} + + +/*-------------------------------------------------------------------------* + * ivas_alloc_pppMem() + * + * Allocate memory for tripple pointer elements + *-------------------------------------------------------------------------*/ + +static ivas_error ivas_alloc_pppMem( + float ****pppMem, + const int16_t dim1, + const int16_t dim2, + const int16_t dim3, + const int16_t allocate_init_flag ) +{ + int16_t i, j; + float ***localMem = NULL; + + if ( ( localMem = (float ***) malloc( dim1 * sizeof( float ** ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HRTF memory" ); + } + + for ( i = 0; i < dim1; i++ ) + { + if ( ( localMem[i] = (float **) malloc( dim2 * sizeof( float * ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HRTF memory" ); + } + if ( allocate_init_flag == 0 ) + { + for ( j = 0; j < dim2; j++ ) + { + if ( ( localMem[i][j] = (float *) malloc( dim3 * sizeof( float ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HRTF memory" ); + } + } + } + } + + *pppMem = localMem; + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------------* + * ivas_allocate_binaural_hrtf() + * + * Allocate memory for HrtfFastConv structure elements + *-------------------------------------------------------------------------*/ + +ivas_error ivas_allocate_binaural_hrtf( + HRTFS_FASTCONV *HrtfFastConv, /* i/o: FASTCONV HRTF structure */ + const AUDIO_CONFIG input_config, /* i : input audio configuration */ + const BINAURAL_INPUT_AUDIO_CONFIG bin_input_config, /* i : binaural input audio config */ + const RENDERER_TYPE renderer_type, /* i : renderer type */ + const int16_t allocate_init_flag /* i : Memory allocation flag */ +) +{ + if ( input_config == IVAS_AUDIO_CONFIG_HOA3 || bin_input_config == BINAURAL_INPUT_AUDIO_CONFIG_HOA3 ) + { + if ( ( HrtfFastConv->leftHRIRReal_HOA3 != NULL ) && ( HrtfFastConv->leftHRIRImag_HOA3 != NULL ) && ( HrtfFastConv->rightHRIRReal_HOA3 != NULL ) && ( HrtfFastConv->rightHRIRImag_HOA3 != NULL ) ) + { + return IVAS_ERR_OK; + } + else + { + if ( IVAS_ERR_OK != ivas_alloc_pppMem( &HrtfFastConv->leftHRIRReal_HOA3, BINAURAL_CONVBANDS, HOA3_CHANNELS, BINAURAL_NTAPS_SBA, allocate_init_flag ) ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for leftHRIRReal_HOA3" ); + } + if ( IVAS_ERR_OK != ivas_alloc_pppMem( &HrtfFastConv->leftHRIRImag_HOA3, BINAURAL_CONVBANDS, HOA3_CHANNELS, BINAURAL_NTAPS_SBA, allocate_init_flag ) ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for leftHRIRImag_HOA3" ); + } + if ( IVAS_ERR_OK != ivas_alloc_pppMem( &HrtfFastConv->rightHRIRReal_HOA3, BINAURAL_CONVBANDS, HOA3_CHANNELS, BINAURAL_NTAPS_SBA, allocate_init_flag ) ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for rightHRIRReal_HOA3" ); + } + if ( IVAS_ERR_OK != ivas_alloc_pppMem( &HrtfFastConv->rightHRIRImag_HOA3, BINAURAL_CONVBANDS, HOA3_CHANNELS, BINAURAL_NTAPS_SBA, allocate_init_flag ) ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for rightHRIRImag_HOA3" ); + } + } + } + + if ( input_config == IVAS_AUDIO_CONFIG_HOA2 || bin_input_config == BINAURAL_INPUT_AUDIO_CONFIG_HOA2 ) + { + if ( ( HrtfFastConv->leftHRIRReal_HOA2 != NULL ) && ( HrtfFastConv->leftHRIRImag_HOA2 != NULL ) && ( HrtfFastConv->rightHRIRReal_HOA2 != NULL ) && ( HrtfFastConv->rightHRIRImag_HOA2 != NULL ) ) + { + return IVAS_ERR_OK; + } + else + { + if ( IVAS_ERR_OK != ivas_alloc_pppMem( &HrtfFastConv->leftHRIRReal_HOA2, BINAURAL_CONVBANDS, HOA2_CHANNELS, BINAURAL_NTAPS_SBA, allocate_init_flag ) ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for leftHRIRReal_HOA2" ); + } + if ( IVAS_ERR_OK != ivas_alloc_pppMem( &HrtfFastConv->leftHRIRImag_HOA2, BINAURAL_CONVBANDS, HOA2_CHANNELS, BINAURAL_NTAPS_SBA, allocate_init_flag ) ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for leftHRIRImag_HOA2" ); + } + if ( IVAS_ERR_OK != ivas_alloc_pppMem( &HrtfFastConv->rightHRIRReal_HOA2, BINAURAL_CONVBANDS, HOA2_CHANNELS, BINAURAL_NTAPS_SBA, allocate_init_flag ) ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for rightHRIRReal_HOA2" ); + } + if ( IVAS_ERR_OK != ivas_alloc_pppMem( &HrtfFastConv->rightHRIRImag_HOA2, BINAURAL_CONVBANDS, HOA2_CHANNELS, BINAURAL_NTAPS_SBA, allocate_init_flag ) ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for rightHRIRImag_HOA2" ); + } + } + } + + if ( input_config == IVAS_AUDIO_CONFIG_FOA || bin_input_config == BINAURAL_INPUT_AUDIO_CONFIG_FOA ) + { + if ( ( HrtfFastConv->leftHRIRReal_FOA != NULL ) && ( HrtfFastConv->leftHRIRImag_FOA != NULL ) && ( HrtfFastConv->rightHRIRReal_FOA != NULL ) && ( HrtfFastConv->rightHRIRImag_FOA != NULL ) ) + { + return IVAS_ERR_OK; + } + else + { + if ( IVAS_ERR_OK != ivas_alloc_pppMem( &HrtfFastConv->leftHRIRReal_FOA, BINAURAL_CONVBANDS, FOA_CHANNELS, BINAURAL_NTAPS_SBA, allocate_init_flag ) ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for leftHRIRReal_FOA" ); + } + if ( IVAS_ERR_OK != ivas_alloc_pppMem( &HrtfFastConv->leftHRIRImag_FOA, BINAURAL_CONVBANDS, FOA_CHANNELS, BINAURAL_NTAPS_SBA, allocate_init_flag ) ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for leftHRIRImag_FOA" ); + } + if ( IVAS_ERR_OK != ivas_alloc_pppMem( &HrtfFastConv->rightHRIRReal_FOA, BINAURAL_CONVBANDS, FOA_CHANNELS, BINAURAL_NTAPS_SBA, allocate_init_flag ) ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for rightHRIRReal_FOA" ); + } + if ( IVAS_ERR_OK != ivas_alloc_pppMem( &HrtfFastConv->rightHRIRImag_FOA, BINAURAL_CONVBANDS, FOA_CHANNELS, BINAURAL_NTAPS_SBA, allocate_init_flag ) ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for rightHRIRImag_FOA" ); + } + } + } + + if ( renderer_type == RENDERER_BINAURAL_FASTCONV || bin_input_config == BINAURAL_INPUT_AUDIO_CONFIG_COMBINED ) + { + if ( ( HrtfFastConv->leftHRIRReal != NULL ) && ( HrtfFastConv->leftHRIRImag != NULL ) && ( HrtfFastConv->rightHRIRReal != NULL ) && ( HrtfFastConv->rightHRIRImag != NULL ) ) + { + return IVAS_ERR_OK; + } + else + { + + if ( IVAS_ERR_OK != ivas_alloc_pppMem( &HrtfFastConv->leftHRIRReal, BINAURAL_CONVBANDS, HRTF_LS_CHANNELS, BINAURAL_NTAPS, allocate_init_flag ) ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for leftHRIRReal" ); + } + if ( IVAS_ERR_OK != ivas_alloc_pppMem( &HrtfFastConv->leftHRIRImag, BINAURAL_CONVBANDS, HRTF_LS_CHANNELS, BINAURAL_NTAPS, allocate_init_flag ) ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for leftHRIRImag" ); + } + if ( IVAS_ERR_OK != ivas_alloc_pppMem( &HrtfFastConv->rightHRIRReal, BINAURAL_CONVBANDS, HRTF_LS_CHANNELS, BINAURAL_NTAPS, allocate_init_flag ) ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for rightHRIRReal" ); + } + if ( IVAS_ERR_OK != ivas_alloc_pppMem( &HrtfFastConv->rightHRIRImag, BINAURAL_CONVBANDS, HRTF_LS_CHANNELS, BINAURAL_NTAPS, allocate_init_flag ) ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for rightHRIRImag" ); + } + } + } + + if ( renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM || bin_input_config == BINAURAL_INPUT_AUDIO_CONFIG_COMBINED ) + { + if ( ( HrtfFastConv->leftBRIRReal != NULL ) && ( HrtfFastConv->leftBRIRImag != NULL ) && ( HrtfFastConv->rightBRIRReal != NULL ) && ( HrtfFastConv->rightBRIRImag != NULL ) ) + { + return IVAS_ERR_OK; + } + else + { + if ( IVAS_ERR_OK != ivas_alloc_pppMem( &HrtfFastConv->leftBRIRReal, BINAURAL_CONVBANDS, HRTF_LS_CHANNELS, BINAURAL_NTAPS_MAX, allocate_init_flag ) ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for leftBRIRReal" ); + } + if ( IVAS_ERR_OK != ivas_alloc_pppMem( &HrtfFastConv->leftBRIRImag, BINAURAL_CONVBANDS, HRTF_LS_CHANNELS, BINAURAL_NTAPS_MAX, allocate_init_flag ) ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for leftBRIRImag" ); + } + if ( IVAS_ERR_OK != ivas_alloc_pppMem( &HrtfFastConv->rightBRIRReal, BINAURAL_CONVBANDS, HRTF_LS_CHANNELS, BINAURAL_NTAPS_MAX, allocate_init_flag ) ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for rightBRIRReal" ); + } + if ( IVAS_ERR_OK != ivas_alloc_pppMem( &HrtfFastConv->rightBRIRImag, BINAURAL_CONVBANDS, HRTF_LS_CHANNELS, BINAURAL_NTAPS_MAX, allocate_init_flag ) ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for rightBRIRImag" ); + } + } + } + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------------* + * ivas_binaural_HRTF_open() + * + * + *-------------------------------------------------------------------------*/ + +static ivas_error ivas_binaural_hrtf_open( + HRTFS_FASTCONV_HANDLE *hHrtfFastConv, /* i : fastconv HRTF handle */ + const AUDIO_CONFIG input_config, /* i : output configuration */ + const RENDERER_TYPE renderer_type /* i : renderer type */ +) +{ + int16_t i, j; + ivas_error error; + + if ( hHrtfFastConv != NULL && *hHrtfFastConv != NULL ) + { + /* Tables already loaded from file */ + return IVAS_ERR_OK; + } + else + { + /* Initialise tables from ROM */ + HRTFS_FASTCONV *HrtfFastConv; + + if ( ( HrtfFastConv = (HRTFS_FASTCONV *) malloc( sizeof( HRTFS_FASTCONV ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for FastConv HRTF tables" ); + } + + ivas_init_binaural_hrtf( HrtfFastConv ); + + if ( input_config == IVAS_AUDIO_CONFIG_BINAURAL || renderer_type == RENDERER_BINAURAL_FASTCONV ) + { + HrtfFastConv->FASTCONV_HRIR_latency_s = FASTCONV_HRIR_latency_s; + } + if ( input_config == IVAS_AUDIO_CONFIG_HOA2 ) + { + HrtfFastConv->FASTCONV_HOA2_latency_s = FASTCONV_HOA2_latency_s; + } + if ( input_config == IVAS_AUDIO_CONFIG_HOA3 ) + { + HrtfFastConv->FASTCONV_HOA3_latency_s = FASTCONV_HOA3_latency_s; + } + if ( input_config == IVAS_AUDIO_CONFIG_FOA ) + { + HrtfFastConv->FASTCONV_FOA_latency_s = FASTCONV_FOA_latency_s; + } + if ( input_config == IVAS_AUDIO_CONFIG_BINAURAL || renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) + { + HrtfFastConv->FASTCONV_BRIR_latency_s = FASTCONV_BRIR_latency_s; + } + + HrtfFastConv->allocate_init_flag = 1; + + if ( ( error = ivas_allocate_binaural_hrtf( HrtfFastConv, input_config, BINAURAL_INPUT_AUDIO_CONFIG_INVALID, renderer_type, HrtfFastConv->allocate_init_flag ) ) != IVAS_ERR_OK ) + { + return error; + } + for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + { + if ( renderer_type == RENDERER_BINAURAL_FASTCONV ) + { + for ( j = 0; j < HRTF_LS_CHANNELS; j++ ) + { + HrtfFastConv->leftHRIRReal[i][j] = leftHRIRReal[i][j]; + HrtfFastConv->leftHRIRImag[i][j] = leftHRIRImag[i][j]; + HrtfFastConv->rightHRIRReal[i][j] = rightHRIRReal[i][j]; + HrtfFastConv->rightHRIRImag[i][j] = rightHRIRImag[i][j]; + } + } + else if ( renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) + { + for ( j = 0; j < HRTF_LS_CHANNELS; j++ ) + { + HrtfFastConv->leftBRIRReal[i][j] = leftBRIRReal[i][j]; + HrtfFastConv->leftBRIRImag[i][j] = leftBRIRImag[i][j]; + HrtfFastConv->rightBRIRReal[i][j] = rightBRIRReal[i][j]; + HrtfFastConv->rightBRIRImag[i][j] = rightBRIRImag[i][j]; + } + } + if ( input_config == IVAS_AUDIO_CONFIG_HOA3 ) + { + for ( j = 0; j < HOA3_CHANNELS; j++ ) + { + HrtfFastConv->leftHRIRReal_HOA3[i][j] = leftHRIRReal_HOA3[i][j]; + HrtfFastConv->leftHRIRImag_HOA3[i][j] = leftHRIRImag_HOA3[i][j]; + HrtfFastConv->rightHRIRReal_HOA3[i][j] = rightHRIRReal_HOA3[i][j]; + HrtfFastConv->rightHRIRImag_HOA3[i][j] = rightHRIRImag_HOA3[i][j]; + } + } + if ( input_config == IVAS_AUDIO_CONFIG_HOA2 ) + { + for ( j = 0; j < HOA2_CHANNELS; j++ ) + { + HrtfFastConv->leftHRIRReal_HOA2[i][j] = leftHRIRReal_HOA2[i][j]; + HrtfFastConv->leftHRIRImag_HOA2[i][j] = leftHRIRImag_HOA2[i][j]; + HrtfFastConv->rightHRIRReal_HOA2[i][j] = rightHRIRReal_HOA2[i][j]; + HrtfFastConv->rightHRIRImag_HOA2[i][j] = rightHRIRImag_HOA2[i][j]; + } + } + if ( input_config == IVAS_AUDIO_CONFIG_FOA ) + { + for ( j = 0; j < FOA_CHANNELS; j++ ) + { + HrtfFastConv->leftHRIRReal_FOA[i][j] = leftHRIRReal_FOA[i][j]; + HrtfFastConv->leftHRIRImag_FOA[i][j] = leftHRIRImag_FOA[i][j]; + HrtfFastConv->rightHRIRReal_FOA[i][j] = rightHRIRReal_FOA[i][j]; + HrtfFastConv->rightHRIRImag_FOA[i][j] = rightHRIRImag_FOA[i][j]; + } + } + } + mvr2r( fastconvReverberationTimes, HrtfFastConv->fastconvReverberationTimes, CLDFB_NO_CHANNELS_MAX ); + mvr2r( fastconvReverberationEneCorrections, HrtfFastConv->fastconvReverberationEneCorrections, CLDFB_NO_CHANNELS_MAX ); + + *hHrtfFastConv = HrtfFastConv; + } + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------------* + * ivas_binaural_obtain_DMX() + * + * + *-------------------------------------------------------------------------*/ + +static void ivas_binaural_obtain_DMX( + const int16_t numTimeSlots, + BINAURAL_RENDERER_HANDLE hBinRenderer, /* i/o: fastconv binaural renderer handle */ + float RealBuffer[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Contains the LS signals */ + float ImagBuffer[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Contains the LS signals */ + float realDMX[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + float imagDMX[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX] ) +{ + int16_t chIdx, bandIdx, k; + +#ifdef FIX_785_REMOVE_DEAD_CODE + if ( hBinRenderer->ivas_format == MC_FORMAT ) +#else + // ToDo: hBinRenderer->ivas_format is never set to ISM_FORMAT + if ( hBinRenderer->ivas_format == MC_FORMAT || hBinRenderer->ivas_format == ISM_FORMAT ) +#endif + { + /* Obtain the downmix */ + float P_in[CLDFB_NO_CHANNELS_MAX]; + float P_out, factEQ; + int16_t chOutIdx; + float temp1, temp2; + + for ( k = 0; k < numTimeSlots; k++ ) + { + for ( chOutIdx = 0; chOutIdx < BINAURAL_CHANNELS; chOutIdx++ ) + { + set_zero( realDMX[chOutIdx][k], CLDFB_NO_CHANNELS_MAX ); + set_zero( imagDMX[chOutIdx][k], CLDFB_NO_CHANNELS_MAX ); + } + } + + for ( chOutIdx = 0; chOutIdx < BINAURAL_CHANNELS; chOutIdx++ ) + { + set_zero( P_in, hBinRenderer->conv_band ); + + for ( chIdx = 0; chIdx < hBinRenderer->nInChannels; chIdx++ ) + { + float dmxConst = hBinRenderer->hReverb->dmxmtx[chOutIdx][chIdx]; + + for ( bandIdx = 0; bandIdx < hBinRenderer->conv_band; bandIdx++ ) + { + for ( k = 0; k < numTimeSlots; k++ ) + { + temp1 = RealBuffer[chIdx][k][bandIdx] * dmxConst; + temp2 = ImagBuffer[chIdx][k][bandIdx] * dmxConst; + realDMX[chOutIdx][k][bandIdx] += temp1; + imagDMX[chOutIdx][k][bandIdx] += temp2; + + P_in[bandIdx] += temp1 * temp1 + temp2 * temp2; + } + } + } + + for ( bandIdx = 0; bandIdx < hBinRenderer->conv_band; bandIdx++ ) + { + P_out = 0.f; + for ( k = 0; k < numTimeSlots; k++ ) + { + temp1 = realDMX[chOutIdx][k][bandIdx]; + temp2 = imagDMX[chOutIdx][k][bandIdx]; + P_out += temp1 * temp1 + temp2 * temp2; + } + factEQ = sqrtf( P_in[bandIdx] / ( P_out + 1e-20f ) ); + if ( ( factEQ <= 1e-20f ) || ( P_in[bandIdx] <= 1e-20f ) || ( P_out <= 1e-20f ) ) + { + factEQ = 1.0f; + } + + factEQ = max( min( factEQ, 2.0f ), 0.5f ); + for ( k = 0; k < numTimeSlots; k++ ) + { + realDMX[chOutIdx][k][bandIdx] *= factEQ; + imagDMX[chOutIdx][k][bandIdx] *= factEQ; + } + } + } + } + else if ( hBinRenderer->ivas_format == SBA_FORMAT || hBinRenderer->ivas_format == MASA_FORMAT ) + { + float *outRealLeftPtr, *outImagLeftPtr, *outRealRightPtr, *outImagRightPtr; + float *inRealPtr, *inImagPtr; + + /*compute DMX */ + for ( k = 0; k < numTimeSlots; k++ ) + { + outRealLeftPtr = realDMX[0][k]; + outImagLeftPtr = imagDMX[0][k]; + outRealRightPtr = realDMX[1][k]; + outImagRightPtr = imagDMX[1][k]; + set_zero( outRealLeftPtr, CLDFB_NO_CHANNELS_MAX ); + set_zero( outImagLeftPtr, CLDFB_NO_CHANNELS_MAX ); + set_zero( outRealRightPtr, CLDFB_NO_CHANNELS_MAX ); + set_zero( outImagRightPtr, CLDFB_NO_CHANNELS_MAX ); + + for ( chIdx = 0; chIdx < hBinRenderer->nInChannels; chIdx++ ) + { + float foa_const = hBinRenderer->hReverb->foa_enc[chIdx][1]; + + inRealPtr = (float *) &( RealBuffer[chIdx][k][0] ); + inImagPtr = (float *) &( ImagBuffer[chIdx][k][0] ); + + for ( bandIdx = 0; bandIdx < hBinRenderer->conv_band; bandIdx++ ) + { + outRealLeftPtr[bandIdx] += inRealPtr[bandIdx] * ( 1.f + foa_const ); + outImagLeftPtr[bandIdx] += inImagPtr[bandIdx] * ( 1.f + foa_const ); + + outRealRightPtr[bandIdx] += inRealPtr[bandIdx] * ( 1.f - foa_const ); + outImagRightPtr[bandIdx] += inImagPtr[bandIdx] * ( 1.f - foa_const ); + } + } + } + } + + return; +} + + + + +/*------------------------------------------------------------------------- + * ivas_binRenderer_open() + * + * Open fastconv binaural renderer handle + *-------------------------------------------------------------------------*/ + +ivas_error ivas_binRenderer_open( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +) +{ + BINAURAL_RENDERER_HANDLE hBinRenderer; + int16_t convBand, chIdx, k; + ivas_error error; + + error = IVAS_ERR_OK; + + /*-----------------------------------------------------------------* + * prepare library opening + *-----------------------------------------------------------------*/ + + if ( ( hBinRenderer = (BINAURAL_RENDERER_HANDLE) malloc( sizeof( BINAURAL_RENDERER ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Binaural Renderer\n" ) ); + } + + hBinRenderer->hInputSetup = &st_ivas->hIntSetup; + + /* Define of head rotation has to be done in binRendeder in CLDFB*/ + hBinRenderer->rotInCldfb = 0; + if ( st_ivas->ivas_format == MC_FORMAT || st_ivas->ivas_format == SBA_FORMAT ) + { + hBinRenderer->rotInCldfb = 1; + } + + + /* Declare some common variables needed for renderer */ + /* Which format used for binaural rendering (needed for late reverb) ? MC or SBA */ + if ( st_ivas->hIntSetup.is_loudspeaker_setup ) + { + hBinRenderer->ivas_format = MC_FORMAT; + } + else + { + hBinRenderer->ivas_format = SBA_FORMAT; + } + hBinRenderer->max_band = (int16_t) ( ( BINAURAL_MAXBANDS * st_ivas->hDecoderConfig->output_Fs ) / 48000 ); + convBand = hBinRenderer->max_band; + + hBinRenderer->timeSlots = MAX_PARAM_SPATIAL_SUBFRAMES; /* Corresponds to 5 msec sound to motion latency */ + + if ( convBand > BINAURAL_CONVBANDS ) + { + hBinRenderer->conv_band = BINAURAL_CONVBANDS; + } + else + { + hBinRenderer->conv_band = convBand; + } + + /*LFE rendering switched off by default*/ + hBinRenderer->render_lfe = 0; + + if ( st_ivas->ivas_format != ISM_FORMAT && st_ivas->hIntSetup.is_loudspeaker_setup ) + { + hBinRenderer->render_lfe = 1; + } + + /* Load HRTF tables */ + if ( ( error = ivas_binaural_hrtf_open( &st_ivas->hHrtfFastConv, st_ivas->hIntSetup.output_config, st_ivas->renderer_type ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM && ( st_ivas->hIntSetup.is_loudspeaker_setup == 0 ) ) + { + IVAS_OUTPUT_SETUP out_setup; + + /* Allocate memories and buffers needed for convolutional module in CICP19 */ + if ( ( error = ivas_binRenderer_convModuleOpen( hBinRenderer, st_ivas->renderer_type, 1, IVAS_AUDIO_CONFIG_7_1_4, st_ivas->hHrtfFastConv ) ) != IVAS_ERR_OK ) + { + return error; + } + + ivas_output_init( &out_setup, IVAS_AUDIO_CONFIG_7_1_4 ); + + if ( st_ivas->hoa_dec_mtx == NULL ) + { + if ( ( error = ivas_sba_get_hoa_dec_matrix( out_setup, &st_ivas->hoa_dec_mtx, st_ivas->hIntSetup.ambisonics_order ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + hBinRenderer->hoa_dec_mtx = st_ivas->hoa_dec_mtx; + st_ivas->binaural_latency_ns = (int32_t) ( st_ivas->hHrtfFastConv->FASTCONV_BRIR_latency_s * 1000000000.f ); + } + else + { + /* Allocate memories and buffers needed for convolutional module */ + if ( ( error = ivas_binRenderer_convModuleOpen( hBinRenderer, st_ivas->renderer_type, st_ivas->hIntSetup.is_loudspeaker_setup, st_ivas->hIntSetup.output_config, st_ivas->hHrtfFastConv ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV ) + { + if ( hBinRenderer->ivas_format == MC_FORMAT ) + { + st_ivas->binaural_latency_ns = (int32_t) ( st_ivas->hHrtfFastConv->FASTCONV_HRIR_latency_s * 1000000000.f ); + } + else + { + if ( hBinRenderer->nInChannels == 16 ) + { + st_ivas->binaural_latency_ns = (int32_t) ( st_ivas->hHrtfFastConv->FASTCONV_HOA3_latency_s * 1000000000.f ); + } + else if ( hBinRenderer->nInChannels == 9 ) + { + st_ivas->binaural_latency_ns = (int32_t) ( st_ivas->hHrtfFastConv->FASTCONV_HOA2_latency_s * 1000000000.f ); + } + else if ( hBinRenderer->nInChannels == 4 ) + { + st_ivas->binaural_latency_ns = (int32_t) ( st_ivas->hHrtfFastConv->FASTCONV_FOA_latency_s * 1000000000.f ); + } + else + { + return IVAS_ERR_INVALID_INPUT_FORMAT; + } + } + } + else + { + /* same value for MC or HOA both use MC BRIR*/ + st_ivas->binaural_latency_ns = (int32_t) ( st_ivas->hHrtfFastConv->FASTCONV_BRIR_latency_s * 1000000000.f ); + } + } + + /* Allocate memories needed for reverb module */ + if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV && st_ivas->hIntSetup.output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) + { + if ( ( error = ivas_binaural_reverb_open_fastconv( &( hBinRenderer->hReverb ), hBinRenderer->conv_band, hBinRenderer->timeSlots, &( st_ivas->hRenderConfig->roomAcoustics ), st_ivas->hIntSetup.output_config, st_ivas->hDecoderConfig->output_Fs, st_ivas->hHrtfFastConv ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* initialize the dmx matrix */ + for ( chIdx = 0; chIdx < BINAURAL_CHANNELS; chIdx++ ) + { + for ( k = 0; k < hBinRenderer->nInChannels; k++ ) + { + hBinRenderer->hReverb->dmxmtx[chIdx][k] = dmxmtx_table[chIdx][k]; + } + } + } + else + { + hBinRenderer->hReverb = NULL; + } + + hBinRenderer->hEFAPdata = NULL; + + if ( hBinRenderer->hReverb != NULL ) + { + if ( hBinRenderer->hInputSetup->is_loudspeaker_setup == 0 ) + { + for ( k = 0; k < 11; k++ ) + { + ivas_dirac_dec_get_response( (int16_t) ls_azimuth_CICP19[k], (int16_t) ls_elevation_CICP19[k], hBinRenderer->hReverb->foa_enc[k], 1 ); + } + } + else if ( st_ivas->ivas_format == MC_FORMAT && ( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation ) ) + { + if ( ( error = efap_init_data( &( st_ivas->hEFAPdata ), st_ivas->hIntSetup.ls_azimuth, st_ivas->hIntSetup.ls_elevation, st_ivas->hIntSetup.nchan_out_woLFE, EFAP_MODE_EFAP ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Copy handles to bin renderer handle*/ + hBinRenderer->hEFAPdata = st_ivas->hEFAPdata; + } + } + + /* Copy the handles to main handle */ + st_ivas->hBinRenderer = hBinRenderer; + + return error; +} + + +/*------------------------------------------------------------------------- + * ivas_binRenderer_convModuleClose() + * + * Close convolution module handle of fastconv binaural renderer + *------------------------------------------------------------------------*/ + +static void ivas_binRenderer_convModuleClose( + BINAURAL_RENDERER_HANDLE *hBinRenderer /* i/o: fastconv binaural renderer handle */ +) +{ + int16_t bandIdx, chIdx; + BINRENDERER_CONV_MODULE_HANDLE hBinRenConvModule; + + hBinRenConvModule = ( *hBinRenderer )->hBinRenConvModule; + + if ( hBinRenConvModule == NULL ) + { + return; + } + + for ( bandIdx = 0; bandIdx < ( *hBinRenderer )->conv_band; bandIdx++ ) + { + free( hBinRenConvModule->filterTapsLeftReal[bandIdx] ); + hBinRenConvModule->filterTapsLeftReal[bandIdx] = NULL; + + free( hBinRenConvModule->filterTapsLeftImag[bandIdx] ); + hBinRenConvModule->filterTapsLeftImag[bandIdx] = NULL; + + free( hBinRenConvModule->filterTapsRightReal[bandIdx] ); + hBinRenConvModule->filterTapsRightReal[bandIdx] = NULL; + + free( hBinRenConvModule->filterTapsRightImag[bandIdx] ); + hBinRenConvModule->filterTapsRightImag[bandIdx] = NULL; + } + + free( hBinRenConvModule->filterTapsLeftReal ); + hBinRenConvModule->filterTapsLeftReal = NULL; + + free( hBinRenConvModule->filterTapsLeftImag ); + hBinRenConvModule->filterTapsLeftImag = NULL; + + free( hBinRenConvModule->filterTapsRightReal ); + hBinRenConvModule->filterTapsRightReal = NULL; + + free( hBinRenConvModule->filterTapsRightImag ); + hBinRenConvModule->filterTapsRightImag = NULL; + + for ( bandIdx = 0; bandIdx < ( *hBinRenderer )->conv_band; bandIdx++ ) + { + for ( chIdx = 0; chIdx < ( *hBinRenderer )->nInChannels; chIdx++ ) + { + free( hBinRenConvModule->filterStatesLeftReal[bandIdx][chIdx] ); + hBinRenConvModule->filterStatesLeftReal[bandIdx][chIdx] = NULL; + + free( hBinRenConvModule->filterStatesLeftImag[bandIdx][chIdx] ); + hBinRenConvModule->filterStatesLeftImag[bandIdx][chIdx] = NULL; + } + + free( hBinRenConvModule->filterStatesLeftReal[bandIdx] ); + hBinRenConvModule->filterStatesLeftReal[bandIdx] = NULL; + + free( hBinRenConvModule->filterStatesLeftImag[bandIdx] ); + hBinRenConvModule->filterStatesLeftImag[bandIdx] = NULL; + } + + free( hBinRenConvModule->filterStatesLeftReal ); + hBinRenConvModule->filterStatesLeftReal = NULL; + + free( hBinRenConvModule->filterStatesLeftImag ); + hBinRenConvModule->filterStatesLeftImag = NULL; + + free( ( *hBinRenderer )->hBinRenConvModule ); + ( *hBinRenderer )->hBinRenConvModule = NULL; + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_binRenderer_close() + * + * Close fastconv binaural renderer memories + *------------------------------------------------------------------------*/ + +void ivas_binRenderer_close( + BINAURAL_RENDERER_HANDLE *hBinRenderer /* i/o: fastconv binaural renderer handle */ +) +{ + if ( hBinRenderer == NULL || *hBinRenderer == NULL ) + { + return; + } + + if ( ( *hBinRenderer )->hBinRenConvModule != NULL ) + { + ivas_binRenderer_convModuleClose( hBinRenderer ); + } + + if ( ( *hBinRenderer )->hReverb != NULL ) + { + ivas_binaural_reverb_close( &( ( *hBinRenderer )->hReverb ) ); + } + + free( *hBinRenderer ); + *hBinRenderer = NULL; + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_free_pppHrtfMem() + * + * Free fastconv binaural renderer hrtf memories + *------------------------------------------------------------------------*/ + +static void ivas_free_pppHrtfMem( + float ****ppppHRIR, + const int16_t dim, + const int16_t alloc_init ) +{ + int16_t i, j; + + if ( *ppppHRIR != NULL ) + { + for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + { + if ( alloc_init == 0 ) + { + for ( j = 0; j < dim; j++ ) + { + free( ( *ppppHRIR )[i][j] ); + ( *ppppHRIR )[i][j] = NULL; + } + } + free( ( *ppppHRIR )[i] ); + ( *ppppHRIR )[i] = NULL; + } + free( *ppppHRIR ); + *ppppHRIR = NULL; + } + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_binaural_hrtf_close() + * + * Close fastconv binaural renderer hrtf memories + *------------------------------------------------------------------------*/ + +void ivas_binaural_hrtf_close( + HRTFS_FASTCONV_HANDLE *hHrtfFastConv /* i : fastconv HRTF handle */ +) +{ + int16_t allocate_init_flag; + + if ( hHrtfFastConv == NULL || *hHrtfFastConv == NULL ) + { + return; + } + + allocate_init_flag = ( *hHrtfFastConv )->allocate_init_flag; + + ivas_free_pppHrtfMem( &( *hHrtfFastConv )->leftHRIRReal, HRTF_LS_CHANNELS, allocate_init_flag ); + ivas_free_pppHrtfMem( &( *hHrtfFastConv )->leftHRIRImag, HRTF_LS_CHANNELS, allocate_init_flag ); + ivas_free_pppHrtfMem( &( *hHrtfFastConv )->rightHRIRReal, HRTF_LS_CHANNELS, allocate_init_flag ); + ivas_free_pppHrtfMem( &( *hHrtfFastConv )->rightHRIRImag, HRTF_LS_CHANNELS, allocate_init_flag ); + + ivas_free_pppHrtfMem( &( *hHrtfFastConv )->leftBRIRReal, HRTF_LS_CHANNELS, allocate_init_flag ); + ivas_free_pppHrtfMem( &( *hHrtfFastConv )->leftBRIRImag, HRTF_LS_CHANNELS, allocate_init_flag ); + ivas_free_pppHrtfMem( &( *hHrtfFastConv )->rightBRIRReal, HRTF_LS_CHANNELS, allocate_init_flag ); + ivas_free_pppHrtfMem( &( *hHrtfFastConv )->rightBRIRImag, HRTF_LS_CHANNELS, allocate_init_flag ); + + ivas_free_pppHrtfMem( &( *hHrtfFastConv )->leftHRIRReal_HOA3, HOA3_CHANNELS, allocate_init_flag ); + ivas_free_pppHrtfMem( &( *hHrtfFastConv )->leftHRIRImag_HOA3, HOA3_CHANNELS, allocate_init_flag ); + ivas_free_pppHrtfMem( &( *hHrtfFastConv )->rightHRIRReal_HOA3, HOA3_CHANNELS, allocate_init_flag ); + ivas_free_pppHrtfMem( &( *hHrtfFastConv )->rightHRIRImag_HOA3, HOA3_CHANNELS, allocate_init_flag ); + + ivas_free_pppHrtfMem( &( *hHrtfFastConv )->leftHRIRReal_HOA2, HOA2_CHANNELS, allocate_init_flag ); + ivas_free_pppHrtfMem( &( *hHrtfFastConv )->leftHRIRImag_HOA2, HOA2_CHANNELS, allocate_init_flag ); + ivas_free_pppHrtfMem( &( *hHrtfFastConv )->rightHRIRReal_HOA2, HOA2_CHANNELS, allocate_init_flag ); + ivas_free_pppHrtfMem( &( *hHrtfFastConv )->rightHRIRImag_HOA2, HOA2_CHANNELS, allocate_init_flag ); + + ivas_free_pppHrtfMem( &( *hHrtfFastConv )->leftHRIRReal_FOA, FOA_CHANNELS, allocate_init_flag ); + ivas_free_pppHrtfMem( &( *hHrtfFastConv )->leftHRIRImag_FOA, FOA_CHANNELS, allocate_init_flag ); + ivas_free_pppHrtfMem( &( *hHrtfFastConv )->rightHRIRReal_FOA, FOA_CHANNELS, allocate_init_flag ); + ivas_free_pppHrtfMem( &( *hHrtfFastConv )->rightHRIRImag_FOA, FOA_CHANNELS, allocate_init_flag ); + + return; +} + + +/*-------------------------------------------------------------------------* + * ivas_binaural_add_LFE() + * + * The functions adds the LFE to the left and right channels after binaural rendering + *-------------------------------------------------------------------------*/ + +void ivas_binaural_add_LFE( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + int16_t output_frame, /* i : length of input frame */ + float *input_f[], /* i : transport channels */ + float *output_f[] /* o : synthesized core-coder transport channels/DirAC output */ +) +{ + int16_t render_lfe, idx_lfe; + float gain; + + if ( st_ivas->hBinRenderer != NULL ) + { + render_lfe = st_ivas->hBinRenderer->render_lfe; + } + else + { + render_lfe = TRUE; + } + + if ( render_lfe ) + { + if ( st_ivas->renderer_type == RENDERER_BINAURAL_OBJECTS_TD ) + { + gain = GAIN_LFE; + } + else + { + gain = ( ( st_ivas->hCrendWrapper != NULL ) && ( st_ivas->hCrendWrapper->hHrtfCrend != NULL ) ) ? st_ivas->hCrendWrapper->hHrtfCrend->gain_lfe : GAIN_LFE; + } + + for ( idx_lfe = 0; idx_lfe < st_ivas->hIntSetup.num_lfe; idx_lfe++ ) + { + v_multc( input_f[st_ivas->hIntSetup.index_lfe[idx_lfe]], gain, input_f[st_ivas->hIntSetup.index_lfe[idx_lfe]], output_frame ); + /* copy LFE to left and right channels */ + v_add( output_f[0], input_f[st_ivas->hIntSetup.index_lfe[idx_lfe]], output_f[0], output_frame ); + v_add( output_f[1], input_f[st_ivas->hIntSetup.index_lfe[idx_lfe]], output_f[1], output_frame ); + } + } + + return; +} + + + + +/*------------------------------------------------------------------------- + * ivas_binRenderer() + * + * Fastconv binaural renderer main function + *-------------------------------------------------------------------------*/ + +void ivas_binRenderer( + BINAURAL_RENDERER_HANDLE hBinRenderer, /* i/o: binaural renderer handle */ + COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i : combined head and external orientation handle*/ + int16_t subframe_idx, /* i : subframe index */ + const int16_t numTimeSlots, /* i : number of time slots to render */ + float Cldfb_RealBuffer_Binaural[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : Binaural signals */ + float Cldfb_ImagBuffer_Binaural[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : Binaural signals */ + float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : LS signals */ + float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX] /* i : LS signals */ +) +{ + int16_t chIdx, k; + + push_wmops( "fastconv_binaural_rendering" ); + + /* Compute Convolution */ + /* memory reset for the binaural output */ + for ( chIdx = 0; chIdx < BINAURAL_CHANNELS; chIdx++ ) + { + for ( k = 0; k < numTimeSlots; k++ ) + { + set_zero( Cldfb_RealBuffer_Binaural[chIdx][k], CLDFB_NO_CHANNELS_MAX ); + set_zero( Cldfb_ImagBuffer_Binaural[chIdx][k], CLDFB_NO_CHANNELS_MAX ); + } + } + + /* Head rotation in HOA3 or CICPx */ + if ( hCombinedOrientationData != NULL && hCombinedOrientationData->enableCombinedOrientation[subframe_idx] && hBinRenderer->rotInCldfb ) + { + if ( hBinRenderer->hInputSetup->is_loudspeaker_setup == 0 ) + { + /* Rotation in SHD (HOA3) */ + if ( hCombinedOrientationData->shd_rot_max_order == -1 ) + { + rotateFrame_shd_cldfb( RealBuffer, ImagBuffer, hCombinedOrientationData->Rmat[subframe_idx], hBinRenderer->hInputSetup->nchan_out_woLFE, numTimeSlots, 3 ); + } + else if ( hCombinedOrientationData->shd_rot_max_order > 0 ) + { + rotateFrame_shd_cldfb( RealBuffer, ImagBuffer, hCombinedOrientationData->Rmat[subframe_idx], hBinRenderer->hInputSetup->nchan_out_woLFE, numTimeSlots, hCombinedOrientationData->shd_rot_max_order ); + } + } + else + { + /* Rotation in SD (CICPx) */ + rotateFrame_sd_cldfb( hCombinedOrientationData->Rmat[subframe_idx], RealBuffer, ImagBuffer, hBinRenderer->hInputSetup, hBinRenderer->hEFAPdata, numTimeSlots, hBinRenderer->conv_band ); + } + } + + /* HOA decoding to CICP19 if needed*/ + if ( hBinRenderer->hInputSetup->is_loudspeaker_setup == 0 && hBinRenderer->nInChannels != 16 ) + { + ivas_sba2mc_cldfb( *( hBinRenderer->hInputSetup ), RealBuffer, ImagBuffer, hBinRenderer->nInChannels, hBinRenderer->conv_band, numTimeSlots, hBinRenderer->hoa_dec_mtx ); + } + + ivas_binRenderer_filterModule( Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, RealBuffer, ImagBuffer, numTimeSlots, hBinRenderer ); + + + /* Obtain the binaural dmx and compute the reverb */ + if ( hBinRenderer->hReverb != NULL ) + { + float reverbRe[BINAURAL_CHANNELS][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + float reverbIm[BINAURAL_CHANNELS][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + float inRe[BINAURAL_CHANNELS][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + float inIm[BINAURAL_CHANNELS][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + + ivas_binaural_obtain_DMX( numTimeSlots, hBinRenderer, RealBuffer, ImagBuffer, inRe, inIm ); + + for ( chIdx = 0; chIdx < BINAURAL_CHANNELS; chIdx++ ) + { + for ( k = 0; k < numTimeSlots; k++ ) + { + set_zero( reverbRe[chIdx][k], hBinRenderer->max_band ); + set_zero( reverbIm[chIdx][k], hBinRenderer->max_band ); + } + } + + ivas_binaural_reverb_processSubframe( hBinRenderer->hReverb, BINAURAL_CHANNELS, numTimeSlots, inRe, inIm, reverbRe, reverbIm ); + + /* Add the conv module and reverb module output */ + for ( chIdx = 0; chIdx < BINAURAL_CHANNELS; chIdx++ ) + { + for ( k = 0; k < numTimeSlots; k++ ) + { + /* Combine first and second parts to generate binaural output signal with room effect */ + v_add( Cldfb_RealBuffer_Binaural[chIdx][k], reverbRe[chIdx][k], Cldfb_RealBuffer_Binaural[chIdx][k], hBinRenderer->conv_band ); + v_add( Cldfb_ImagBuffer_Binaural[chIdx][k], reverbIm[chIdx][k], Cldfb_ImagBuffer_Binaural[chIdx][k], hBinRenderer->conv_band ); + } + } + } + + pop_wmops(); + return; +} + + diff --git a/lib_dec/ivas_core_dec.c b/lib_dec/ivas_core_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..7ad9082fb491c9fef751813795de6a210d85d592 --- /dev/null +++ b/lib_dec/ivas_core_dec.c @@ -0,0 +1,735 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include +#include +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_rom_com.h" +#include "wmc_auto.h" + + +/*-------------------------------------------------------------------* + * ivas_core_dec() + * + * Principal IVAS core decoder routine, where number of core channels is 1 or 2 + *-------------------------------------------------------------------*/ + +ivas_error ivas_core_dec( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + SCE_DEC_HANDLE hSCE, /* i/o: SCE decoder structure */ + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + MCT_DEC_HANDLE hMCT, /* i/o: MCT decoder structure */ + const int16_t n_channels, /* i : number of channels to be decoded */ +#ifdef FIX_854_ARRAY_SIZE_MISMATCH + float *output[], /* o : output synthesis signal */ + float hb_synth[][L_FRAME48k], /* o : output HB synthesis signal */ +#else + float *output[L_FRAME48k], /* o : output synthesis signal */ + float hb_synth[CPE_CHANNELS][L_FRAME48k], /* o : output HB synthesis signal */ +#endif + float DFT[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* o : DFT buffers */ + const int16_t sba_dirac_stereo_flag /* i : signal stereo output for SBA DirAC */ +) +{ + int16_t i, n, output_frame; + Decoder_State **sts, *st; + STEREO_ICBWE_DEC_HANDLE hStereoICBWE; + STEREO_TD_DEC_DATA_HANDLE hStereoTD; + int16_t sharpFlag[CPE_CHANNELS]; + float synth[CPE_CHANNELS][L_FRAME48k]; + float tmp_buffer[L_FRAME48k]; + int16_t tmps, incr; + float bwe_exc_extended[CPE_CHANNELS][L_FRAME32k + NL_BUFF_OFFSET]; + float voice_factors[CPE_CHANNELS][NB_SUBFR16k]; + int16_t core_switching_flag[CPE_CHANNELS]; + float old_syn_12k8_16k[CPE_CHANNELS][L_FRAME16k]; + float tmp; + float pitch_buf[CPE_CHANNELS][NB_SUBFR16k]; + int16_t unbits[CPE_CHANNELS]; + int16_t sid_bw[CPE_CHANNELS]; + FRAME_MODE frameMode[CPE_CHANNELS]; + float tdm_lspQ_PCh[M], tdm_lsfQ_PCh[M]; + int16_t tdm_LRTD_flag; + int32_t element_brate, output_Fs; + int32_t last_element_brate; + int16_t use_cldfb_for_dft; + float *p_output_mem; + int16_t flag_sec_CNA; + int16_t read_sid_info; + int16_t last_element_mode; + int16_t nchan_out; + float *save_hb_synth; + ivas_error error; + + error = IVAS_ERR_OK; + push_wmops( "ivas_core_dec" ); + + /*------------------------------------------------------------------* + * General initialization + *-----------------------------------------------------------------*/ + + use_cldfb_for_dft = 0; + tdm_LRTD_flag = -1; + read_sid_info = 1; /* read SID by default */ + + if ( hSCE != NULL ) + { + sts = hSCE->hCoreCoder; + hStereoICBWE = NULL; + element_brate = hSCE->element_brate; + last_element_brate = hSCE->element_brate; /* hack - the past parameter is not really needed */ + last_element_mode = IVAS_SCE; + hStereoTD = NULL; + p_output_mem = NULL; + nchan_out = 1; + if ( st_ivas != NULL && st_ivas->ivas_format == ISM_FORMAT ) + { + if ( st_ivas->hISMDTX.sce_id_dtx != hSCE->sce_id ) + { + read_sid_info = 0; + } + } + } + else + { + sts = hCPE->hCoreCoder; + element_brate = hCPE->element_brate; + last_element_brate = hCPE->last_element_brate; + last_element_mode = hCPE->last_element_mode; + hStereoICBWE = hCPE->hStereoICBWE; + hStereoTD = hCPE->hStereoTD; + p_output_mem = hCPE->output_mem[1]; + nchan_out = hCPE->nchan_out; + + if ( hCPE->hStereoTD != NULL ) + { + tdm_LRTD_flag = hCPE->hCoreCoder[0]->tdm_LRTD_flag; + } + + if ( sts[0]->element_mode == IVAS_CPE_DFT ) + { + use_cldfb_for_dft = ( hCPE->nchan_out == 1 && hCPE->hStereoDft->hConfig->res_cod_mode == STEREO_DFT_RES_COD_OFF ) ? 1 : 0; + } + } + + output_Fs = sts[0]->output_Fs; + output_frame = (int16_t) ( output_Fs / FRAMES_PER_SEC ); + + for ( n = 0; n < n_channels; n++ ) + { + st = sts[n]; + + /*------------------------------------------------------------------* + * Initialization per core-decoder channel + *-----------------------------------------------------------------*/ + + frameMode[n] = FRAMEMODE_NORMAL; + st->rate_switching_reset = 0; + + st->mdct_sw = MODE1; + + sid_bw[n] = -1; + core_switching_flag[n] = 0; + sharpFlag[n] = 0; + unbits[n] = 0; + st->GSC_IVAS_mode = 0; + st->element_brate = element_brate; + + st->use_partial_copy = 0; + st->rf_flag = 0; + st->rf_frame_type = RF_NO_DATA; + + if ( st->bfi == 1 ) + { + frameMode[n] = FRAMEMODE_MISSING; + st->coder_type = st->last_coder_type; + } + else + { + if ( !( st->element_mode == IVAS_CPE_TD && n == 1 ) ) /* coder_type for SCh in TD stereo is already read in tdm_configure_dec() */ + { + st->coder_type = INACTIVE; + } + st->extl = -1; + st->flagGuidedAcelp = 0; + } + + if ( !st->bfi && st->prev_bfi && ( st->last_core_bfi == TCX_20_CORE || st->last_core_bfi == TCX_10_CORE ) && st->hTcxDec != NULL ) + { + v_multc( st->hHQ_core->old_out, st->hTcxDec->conceal_eof_gain * st->last_concealed_gain_syn_deemph, st->hHQ_core->old_out, st->hTcxDec->L_frameTCX ); + v_multc( st->hHQ_core->old_outLB, st->hTcxDec->conceal_eof_gain * st->last_concealed_gain_syn_deemph, st->hHQ_core->old_outLB, st->L_frame ); + } + + set_f( voice_factors[n], 0.f, NB_SUBFR16k ); + set_f( hb_synth[n], 0.0f, L_FRAME48k ); + + /*------------------------------------------------------------------* + * Decision matrix (selection of technologies) + *-----------------------------------------------------------------*/ + + if ( st->bfi != 1 ) + { + ivas_decision_matrix_dec( st, &sharpFlag[n], &core_switching_flag[n], element_brate, nchan_out ); + + synchonize_channels_mdct_sid( sts, n ); + + if ( st->bfi != 1 ) /* note: st->bfi can be changed from 0 to 1 in ivas_decision_matrix_dec() when BER is detected */ + { + st->sr_core = st->L_frame * FRAMES_PER_SEC; + st->fscale_old = st->fscale; + st->fscale = sr2fscale( st->sr_core ); + } + else + { + frameMode[n] = FRAMEMODE_MISSING; + } + } + else if ( st->element_mode >= IVAS_SCE && st->prev_bfi == 1 && st->last_con_tcx == 1 ) + { + st->core = TCX_20_CORE; + } + } /* n_channels loop */ + + /* MDCT stereo -> DFT stereo switching */ + if ( hCPE != NULL && hCPE->last_element_mode == IVAS_CPE_MDCT && hCPE->element_mode == IVAS_CPE_DFT ) + { + int16_t ovl, fade_len; + if ( sts[0]->L_frame != sts[0]->last_L_frame ) + { + lerp( sts[0]->hHQ_core->old_outLB, sts[0]->hHQ_core->old_outLB, sts[0]->L_frame, sts[0]->last_L_frame ); + } + if ( sts[0]->L_frame != L_FRAME16k ) + { + ovl = (int16_t) ( STEREO_DFT32MS_OVL_16k * ( (float) sts[0]->L_frame / L_FRAME16k ) ); + lerp( hCPE->input_mem_LB[0], hCPE->input_mem_LB[0], ovl, STEREO_DFT32MS_OVL_16k ); + + fade_len = (int16_t) ( STEREO_MDCT2DFT_FADE_LEN_48k * ( (float) sts[0]->L_frame / L_FRAME16k ) ); + lerp( hCPE->old_outLB_mdct, hCPE->old_outLB_mdct, fade_len, STEREO_MDCT2DFT_FADE_LEN_48k ); + } + } + + if ( hCPE != NULL && hCPE->hStereoCng != NULL ) + { + hCPE->hStereoCng->flag_cna_fade = 0; + } + + if ( sba_dirac_stereo_flag && hSCE && sts[0]->total_brate <= SID_2k40 && sts[0]->cng_type == FD_CNG ) + { + save_hb_synth = hSCE->save_hb_synth; + } + else + { + save_hb_synth = NULL; + } + + /*------------------------------------------------------------------* + * Decode SID for MDCT-Stereo DTX mode + *-----------------------------------------------------------------*/ + + if ( sts[0]->element_mode == IVAS_CPE_MDCT && sts[0]->total_brate == SID_2k40 ) + { + if ( sts[0]->cng_sba_flag ) + { + FdCngDecodeDiracMDCTStereoSID( hCPE ); + } + else + { + FdCngDecodeMDCTStereoSID( hCPE ); + } + } + + /*------------------------------------------------------------------* + * Sanity check in combined format coding + *-----------------------------------------------------------------*/ + + if ( hCPE != NULL && hCPE->element_mode == IVAS_CPE_DFT && hCPE->brate_surplus > 0 ) + { + ivas_combined_format_brate_sanity( hCPE->element_brate, sts[0]->core, sts[0]->total_brate, &( sts[0]->core_brate ), &( sts[0]->inactive_coder_type_flag ), &tmps ); + } + + /*------------------------------------------------------------------* + * Core Decoding + *-----------------------------------------------------------------*/ + + for ( n = 0; n < n_channels; n++ ) + { + st = sts[n]; + + /*------------------------------------------------------------------* + * Initialization + *-----------------------------------------------------------------*/ + + if ( st->bfi == 1 ) + { + st->nbLostCmpt++; + } + else + { + if ( st->prev_bfi == 1 ) + { + st->prev_nbLostCmpt = st->nbLostCmpt; + } + else + { + st->prev_nbLostCmpt = 0; + } + + st->nbLostCmpt = 0; + } + st->enablePlcWaveadjust = 0; + + if ( n == 1 ) + { + sts[1]->BER_detect |= sts[0]->BER_detect; + } + + /*---------------------------------------------------------------------* + * Detect bandwidth switching + *---------------------------------------------------------------------*/ + + bandwidth_switching_detect( st ); + + /*---------------------------------------------------------------------* + * Preprocessing (preparing) for ACELP/HQ core switching + *---------------------------------------------------------------------*/ + + if ( ( error = core_switching_pre_dec( st, output_frame, sts[0]->last_core_brate, nchan_out, last_element_mode, last_element_brate ) ) != IVAS_ERR_OK ) + { + return error; + } + + flag_sec_CNA = -1; + if ( hCPE != NULL ) + { + flag_sec_CNA = sts[1]->flag_cna; + } + + /*---------------------------------------------------------------------* + * ACELP core decoding + * TCX core decoding + * HQ core decoding + *---------------------------------------------------------------------*/ + + if ( st->core == ACELP_CORE ) + { + /* ACELP core decoder */ + if ( ( error = acelp_core_dec( st, output[n], synth[n], save_hb_synth, bwe_exc_extended[n], voice_factors[n], old_syn_12k8_16k[n], sharpFlag[n], pitch_buf[n], &unbits[n], &sid_bw[n], hStereoTD, tdm_lspQ_PCh, tdm_lsfQ_PCh, use_cldfb_for_dft, last_element_mode, last_element_brate, flag_sec_CNA, nchan_out, hCPE == NULL ? NULL : hCPE->hStereoCng, read_sid_info ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( ( st->core == TCX_20_CORE || st->core == TCX_10_CORE ) && st->element_mode != IVAS_CPE_MDCT ) + { + /* TCX decoder */ + stereo_tcx_core_dec( st, frameMode[n], output[n], synth[n], pitch_buf[n], sba_dirac_stereo_flag, hStereoTD, last_element_mode, flag_sec_CNA, hCPE == NULL ? NULL : hCPE->hStereoCng, nchan_out, st_ivas == NULL ? 0 : st_ivas->ivas_format ); + } + + if ( st->core == HQ_CORE ) + { + /* HQ core decoder */ + hq_core_dec( st, synth[n], output_frame, NORMAL_HQ_CORE, core_switching_flag[n], output[n] ); + } + + /*---------------------------------------------------------------------* + * TD stereo updates + *---------------------------------------------------------------------*/ + + if ( st->element_mode == IVAS_CPE_TD && n == 0 ) + { + td_stereo_param_updt( st->lsp_old, st->lsf_old, st->old_pitch_buf + st->nb_subfr, tdm_lspQ_PCh, tdm_lsfQ_PCh, hStereoTD->tdm_Pri_pitch_buf, st->flag_ACELP16k, hStereoTD->tdm_use_IAWB_Ave_lpc ); + } + + } /* n_channels loop */ + + /*---------------------------------------------------------------------* + * MDCT stereo: joint TCX Core Decoding + *---------------------------------------------------------------------*/ + + if ( sts[0]->element_mode == IVAS_CPE_MDCT ) + { + /* active-frame decoding */ + if ( sts[0]->core_brate > SID_2k40 ) + { + if ( hMCT ) + { + pop_wmops(); + + return error; + } + else + { + stereo_mdct_core_dec( st_ivas, hCPE, output, synth ); + } + } + /* for inactive frames with mono output, copy and (if necessary) downmix buffers */ + else if ( hCPE->nchan_out == 1 ) + { + updateBuffersForDmxMdctStereo( hCPE, output_frame, output, synth ); + } + + if ( sts[0]->bfi == 0 && sts[0]->prev_bfi == 1 ) + { + /* On first good frame after frameloss undo the whitening of the bg noise shape */ + for ( n = 0; n < n_channels; ++n ) + { + if ( sts[n]->last_core_bfi != ACELP_CORE ) + { + TonalMdctConceal_whiten_noise_shape( sts[n], L_FRAME16k, ON_FIRST_GOOD_FRAME ); + } + } + } + } + + /*---------------------------------------------------------------------* + * Stereo CNG updates + *---------------------------------------------------------------------*/ + + if ( sts[0]->element_mode == IVAS_CPE_TD && hCPE->hStereoCng != NULL ) + { + stereo_cng_compute_PScorr( output, &hCPE->hStereoCng->c_PS_LT, sts[0]->L_frame, sts[1]->L_frame ); + } + + /*---------------------------------------------------------------------* + * Postprocessing, BWEs and updates + *---------------------------------------------------------------------*/ + + for ( n = 0; n < n_channels; n++ ) + { + st = sts[n]; + + /*---------------------------------------------------------------------* + * TD-BWE for ACELP to TCX transitions + *---------------------------------------------------------------------*/ + + if ( st->last_core == ACELP_CORE && ( st->core == TCX_20_CORE || st->core == TCX_10_CORE || st->core == HQ_CORE ) && st->hBWE_TD != NULL ) + { + if ( ( st->bwidth == SWB || st->bwidth == FB ) && ( st->last_extl == SWB_TBE || st->last_extl == FB_TBE ) ) + { + GenTransition( st->hBWE_TD, hb_synth[n], output_Fs, st->element_mode, st->L_frame, st->rf_flag, st->total_brate ); + } + else if ( st->bwidth == WB && st->last_extl == WB_TBE ) + { + GenTransition_WB( st->hBWE_TD, hb_synth[n], output_Fs ); + } + } + + /*---------------------------------------------------------------------* + * Postprocessing for ACELP/MDCT core switching + *---------------------------------------------------------------------*/ + + /* save synth and output in case of SBA DirAC stereo output as core switching is done outside of core decoder */ + if ( sba_dirac_stereo_flag && st->element_mode != IVAS_CPE_MDCT && !( st->core_brate == SID_2k40 && st->cng_type == FD_CNG ) ) + { + mvr2r( synth[n], hSCE->save_synth, output_frame ); + } + + if ( ( error = core_switching_post_dec( st, synth[n], output[n], p_output_mem, ( st_ivas != NULL ) ? st_ivas->ivas_format : UNDEFINED_FORMAT, use_cldfb_for_dft, output_frame, 0 /*core_switching_flag*/, sba_dirac_stereo_flag, nchan_out, ( hCPE != NULL ) ? hCPE->last_element_mode : IVAS_SCE ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* for FD-CNG we need the delay compensation in the synth, so do this afterwards */ + if ( sba_dirac_stereo_flag && hSCE && st->core_brate == SID_2k40 && st->cng_type == FD_CNG ) + { + mvr2r( synth[n], hSCE->save_synth, output_frame ); + } + + /* if we transition from inactive to active coding in MDCT-Stereo DTX and the output format is mono DMX, we need to sync the upsampled buffer between channels here */ + if ( n == 0 && st->element_mode == IVAS_CPE_MDCT && st->last_core == ACELP_CORE && st->core != ACELP_CORE && ( nchan_out == 1 || ( hCPE != NULL && hCPE->last_element_mode == IVAS_CPE_DFT ) ) ) + { + mvr2r( sts[0]->previoussynth, sts[1]->previoussynth, st->hTcxDec->L_frameTCX ); + } + + /*---------------------------------------------------------------------* + * Pre-processing for bandwidth switching + *---------------------------------------------------------------------*/ + + bw_switching_pre_proc( st, old_syn_12k8_16k[n], last_element_brate, nchan_out ); + + /*---------------------------------------------------------------------* + * WB TBE decoding + * WB BWE decoding + *---------------------------------------------------------------------*/ + + if ( st->extl == WB_TBE ) + { + /* WB TBE decoder */ + wb_tbe_dec( st, bwe_exc_extended[n], voice_factors[n], hb_synth[n] ); + } + else if ( st->element_mode == IVAS_CPE_TD && n == 1 && !tdm_LRTD_flag && st->extl != -1 && st->bws_cnt == 0 && st->extl_brate == 0 ) + { + /* do nothing */ + } + else if ( st->extl == WB_BWE && st->bws_cnt == 0 ) + { + /* WB BWE decoder */ + wb_bwe_dec( st, output[n], synth[n], hb_synth[n], use_cldfb_for_dft, output_frame, voice_factors[n], pitch_buf[n] ); + } + + /*---------------------------------------------------------------------* + * SWB(FB) TBE decoding + * SWB(FB) BWE decoding + *---------------------------------------------------------------------*/ + + if ( st->extl == SWB_TBE || st->extl == FB_TBE || ( st->coder_type != AUDIO && st->coder_type != INACTIVE && st->core_brate >= SID_2k40 && st->core == ACELP_CORE && !st->con_tcx && output_Fs >= 32000 && st->bwidth > NB && st->bws_cnt > 0 ) ) + { + /* SWB TBE decoder */ + swb_tbe_dec( st, hStereoICBWE, bwe_exc_extended[n], voice_factors[n], old_syn_12k8_16k[n], tmp_buffer /*fb_exc*/, hb_synth[n], pitch_buf[n] ); + + /* FB TBE decoder */ + if ( st->extl == FB_TBE ) + { + fb_tbe_dec( st, tmp_buffer /*fb_exc*/, hb_synth[n], tmp_buffer /*fb_synth_ref*/, output_frame ); + } + } + else if ( st->extl == SWB_BWE || st->extl == FB_BWE || ( output_Fs >= 32000 && st->core == ACELP_CORE && st->bwidth > NB && st->bws_cnt > 0 && !st->ppp_mode_dec && !( st->nelp_mode_dec == 1 && st->bfi == 1 ) ) ) + { + /* SWB BWE decoder */ + swb_bwe_dec( st, output[n], synth[n], hb_synth[n], use_cldfb_for_dft, output_frame ); + } + + /*---------------------------------------------------------------------* + * FEC - recovery after lost HQ core (smoothing of the BWE component) + *---------------------------------------------------------------------*/ + + if ( st->prev_bfi && st->last_core == HQ_CORE && st->extl != -1 ) + { + tmp = FRAC_BWE_SMOOTH / output_frame; + + for ( i = 0; i < output_frame / FRAC_BWE_SMOOTH; i++ ) + { + hb_synth[n][i] *= ( i * tmp ); + } + } + + /*---------------------------------------------------------------------* + * SWB CNG + *---------------------------------------------------------------------*/ + + if ( ( output_frame >= L_FRAME32k && st->hTdCngDec != NULL ) || ( st->element_mode == IVAS_CPE_DFT && st->bwidth >= SWB && st->hTdCngDec != NULL ) ) + { + /* SHB CNG decoder */ + swb_CNG_dec( st, synth[n], hb_synth[n], sid_bw[n] ); + } + + /*-------------------------------------------------------------------* + * Inter-channel BWE decoding + *-------------------------------------------------------------------*/ + + if ( n == 0 && st->element_mode >= IVAS_CPE_DFT ) + { + stereo_icBWE_dec( hCPE, hb_synth[0], hb_synth[1], tmp_buffer /*fb_synth_ref*/, voice_factors[0], output_frame ); + } + + if ( st->element_mode == EVS_MONO ) + { + /*----------------------------------------------------------------* + * BFI waveform adjustment + *----------------------------------------------------------------*/ + + if ( st->core == ACELP_CORE && !st->bfi && st->prev_bfi && st->last_total_brate >= HQ_48k && st->last_codec_mode == MODE2 && ( st->last_core_bfi == TCX_20_CORE || st->last_core_bfi == TCX_10_CORE ) && st->hPlcInfo->concealment_method == TCX_NONTONAL && st->hPlcInfo->nbLostCmpt < 4 ) + { + tmps = NS2SA( output_Fs, DELAY_CLDFB_NS ); + + waveform_adj2( st->hPlcInfo, st->hTonalMDCTConc->secondLastPcmOut, synth[n] + tmps, tmps, st->hPlcInfo->nbLostCmpt + 1, st->bfi ); + + st->hPlcInfo->Pitch = 0; + } + } + + /*----------------------------------------------------------------* + * Transition and synchronization of BWE components + *----------------------------------------------------------------*/ + + if ( ( st->extl != -1 && ( st->extl != IGF_BWE || st->last_core == ACELP_CORE ) ) || ( st->bws_cnt > 0 && st->core == ACELP_CORE ) ) + { + /* Calculate an additional delay of extension layer components to be synchronized with ACELP synthesis */ + if ( st->L_frame == L_FRAME ) + { + /* TBE on top of ACELP@12.8kHz */ + tmps = NS2SA( output_Fs, MAX_DELAY_TBE_NS - DELAY_SWB_TBE_12k8_NS ); + } + else + { + if ( st->extl == SWB_BWE_HIGHRATE || st->extl == FB_BWE_HIGHRATE ) + { + /* HR SWB BWE on top of ACELP@16kHz */ + tmps = NS2SA( output_Fs, DELAY_BWE_TOTAL_NS ); + } + else + { + /* TBE on top of ACELP@16kHz */ + tmps = NS2SA( output_Fs, MAX_DELAY_TBE_NS - DELAY_SWB_TBE_16k_NS ); + } + } + + /* Smooth transitions when switching between different technologies */ + if ( !( ( st->core == TCX_20_CORE || st->core == TCX_10_CORE || st->core == HQ_CORE ) && st->last_core == ACELP_CORE ) && + ( st->extl != st->last_extl || ( st->extl == st->last_extl && ( st->core ^ st->last_core ) == HQ_CORE ) ) && !( st->extl == SWB_CNG && st->last_extl == SWB_TBE ) && ( st->element_mode != IVAS_CPE_TD || ( hCPE->element_mode == IVAS_CPE_TD && tdm_LRTD_flag ) ) ) + { + /* switching between BWE and TBE technologies */ + incr = (int16_t) ( L_FRAME / ( tmps + 0.5f ) ); + for ( i = 0; i < tmps; i++ ) + { + hb_synth[n][i] *= sin_table256[i * incr]; + } + + set_f( st->hb_prev_synth_buffer, 0.0f, tmps ); + } + else if ( tmps < st->old_bwe_delay ) + { + /* the previous frame was TBE on top of ACELP@16kHz and the current frame is TBE on top of ACELP@12.8kHz */ + incr = (int16_t) ( L_FRAME / ( tmps + 0.5f ) ); + for ( i = 0; i < tmps; i++ ) + { + tmp_buffer[i] = st->hb_prev_synth_buffer[i] * sin_table256[255 - i * incr] + + st->hb_prev_synth_buffer[st->old_bwe_delay - 1 - i] * sin_table256[i * incr]; + } + + mvr2r( tmp_buffer, st->hb_prev_synth_buffer, tmps ); + } + else if ( tmps > st->old_bwe_delay ) + { + /* the previous frame was TBE on top of ACELP@12.8kHz and the current frame is TBE on top of ACELP@16kHz */ + incr = (int16_t) ( L_FRAME / ( st->old_bwe_delay + 0.5f ) ); + for ( i = 0; i < st->old_bwe_delay; i++ ) + { + tmp_buffer[i] = st->hb_prev_synth_buffer[i] * sin_table256[255 - i * incr]; + } + + for ( ; i < tmps; i++ ) + { + tmp_buffer[i] = 0.0f; + } + + for ( i = 0; i < st->old_bwe_delay; i++ ) + { + tmp_buffer[tmps - 1 - i] += st->hb_prev_synth_buffer[st->old_bwe_delay - 1 - i] * sin_table256[i * incr]; + } + + mvr2r( tmp_buffer, st->hb_prev_synth_buffer, tmps ); + } + + if ( ( st->element_mode != IVAS_CPE_TD && !use_cldfb_for_dft ) || ( hCPE->element_mode == IVAS_CPE_TD && tdm_LRTD_flag ) ) + { + /* Delay hb_synth */ + delay_signal( hb_synth[n], output_frame, st->hb_prev_synth_buffer, tmps ); + } + else + { + mvr2r( hb_synth[n] + output_frame - tmps, st->hb_prev_synth_buffer, tmps ); + } + + st->old_bwe_delay = tmps; + if ( st->hBWE_TD != NULL ) + { + mvr2r( hb_synth[n], st->hBWE_TD->old_hb_synth, output_frame ); + } + + /* SWB CNG/DTX - calculate SHB energy */ + if ( output_frame >= L_FRAME32k && st->extl > SWB_CNG && st->core == ACELP_CORE && st->hTdCngDec != NULL ) + { + st->hTdCngDec->last_shb_ener = sum2_f( hb_synth[n], output_frame ) + 0.001f; + st->hTdCngDec->last_shb_ener /= (float) output_frame; + st->hTdCngDec->last_shb_ener = 10 * log10f( st->hTdCngDec->last_shb_ener ); + } + } + + if ( sba_dirac_stereo_flag && st->element_mode != IVAS_CPE_MDCT ) + { + /* for SBA DirAC stereo output DFT Stereo core switching and updates are done in ivas_sba_dirac_stereo_dec() as hCPE is not available at this point */ + break; + } + + /*----------------------------------------------------------------* + * Post-processing + * - TCX-LTP Postfilter (except DFT stereo) + * - core switching in DFT stereo + * - updates for potential TD->DFT stereo switching + *----------------------------------------------------------------*/ + + if ( st->element_mode != IVAS_CPE_DFT ) + { + if ( st->element_mode != IVAS_CPE_MDCT || sba_dirac_stereo_flag ) + { + ivas_post_proc( hSCE, hCPE, n, synth[n], NULL, output_frame, sba_dirac_stereo_flag ); + } + + /* update OLA buffers - needed for switching to DFT stereo */ + if ( !sba_dirac_stereo_flag ) + { + stereo_td2dft_update( hCPE, n, output[n], synth[n], hb_synth[n], output_frame ); + } + } + else /* IVAS_CPE_DFT */ + { + if ( hCPE->last_element_mode == IVAS_CPE_MDCT ) + { + stereo_mdct2dft_update( hCPE, output[0], synth[0] ); + } + + stereo_dft_dec_core_switching( hCPE, output[0], synth[0], hb_synth[0], DFT, output_frame, use_cldfb_for_dft, 0 ); + + if ( hCPE->nchan_out == 1 && hCPE->hStereoDft->hConfig->res_cod_mode == STEREO_DFT_RES_COD_OFF ) + { + /* mono output for non-residual coding modes uses CLDFB instead of DFT - requires DFT buffer update in case of bitrate switching */ + stereo_td2dft_update( hCPE, n, output[n], synth[n], hb_synth[n], output_frame ); + } + } + + mvr2r( synth[n], output[n], output_frame ); + + /*--------------------------------------------------------* + * Common updates + *--------------------------------------------------------*/ + + /* Save synthesis for HQ FEC */ + save_synthesis_hq_fec( st, output[n], output_frame, hCPE ); + + /* Updates */ + updt_dec_common( st, NORMAL_HQ_CORE, -1, output[n] ); + + } /* n_channels loop */ + + + + pop_wmops(); + return error; +} + + diff --git a/lib_dec/ivas_corecoder_dec_reconfig.c b/lib_dec/ivas_corecoder_dec_reconfig.c new file mode 100644 index 0000000000000000000000000000000000000000..824597314cc8790d06b8a20fe88a82d2724b5b0c --- /dev/null +++ b/lib_dec/ivas_corecoder_dec_reconfig.c @@ -0,0 +1,533 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include "options.h" +#include "ivas_cnst.h" +#include "ivas_prot.h" +#include "prot.h" +#include +#include "wmc_auto.h" + + +/*-------------------------------------------------------------------* + * ivas_corecoder_dec_reconfig() + * + * Allocate, initialize, and configure SCE/CPE/MCT handles in case of bitrate switching + *-------------------------------------------------------------------*/ + +ivas_error ivas_corecoder_dec_reconfig( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const int16_t nSCE_old, /* i : number of SCEs in previous frame */ + int16_t nCPE_old, /* i : number of CPEs in previous frame */ + const int16_t nchan_transport_old, /* i : number of TCs in previous frame */ + const int16_t sba_dirac_stereo_flag_old, /* i : signal stereo rendering using DFT upmix in previous frame */ + const int32_t brate_SCE, /* i : bitrate to be set for the SCEs */ + const int32_t brate_CPE /* i : bitrate to be set for the CPEs */ +) +{ + int16_t n, sce_id, cpe_id, output_frame; + int16_t nSCE_existing, nCPE_existing; + int32_t ivas_total_brate; + int16_t nchan_transport_real; + MC_MODE last_mc_mode; + DECODER_CONFIG_HANDLE hDecoderConfig; + ivas_error error; + + /*-----------------------------------------------------------------* + * Initialization + *-----------------------------------------------------------------*/ + + hDecoderConfig = st_ivas->hDecoderConfig; + ivas_total_brate = hDecoderConfig->ivas_total_brate; + output_frame = (int16_t) ( hDecoderConfig->output_Fs / FRAMES_PER_SEC ); + error = IVAS_ERR_OK; + + if ( st_ivas->ivas_format == MC_FORMAT ) + { + last_mc_mode = ivas_mc_mode_select( ivas_mc_map_output_config_to_mc_ls_setup( st_ivas->transport_config ), st_ivas->hDecoderConfig->last_ivas_total_brate ); /* NB: this assumes that LS config remains the same between frames */ + } + else + { + last_mc_mode = MC_MODE_NONE; + } + + nchan_transport_real = st_ivas->nchan_transport; + + if ( st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + { + nchan_transport_real += st_ivas->nchan_ism; + } + /*-----------------------------------------------------------------* + * Allocate, initialize, and configure SCE/CPE/MCT handles + *-----------------------------------------------------------------*/ + + /* remove dummy CPE element for DFT stereo-like upmix */ + if ( ( st_ivas->ivas_format == SBA_FORMAT && sba_dirac_stereo_flag_old && nchan_transport_old == 1 && ( !st_ivas->sba_dirac_stereo_flag || st_ivas->nchan_transport > 1 ) ) || + ( st_ivas->ivas_format == MC_FORMAT && last_mc_mode == MC_MODE_MCMASA && sba_dirac_stereo_flag_old && nchan_transport_old == 1 && ( !st_ivas->sba_dirac_stereo_flag || st_ivas->nchan_transport > 1 ) ) ) + { + st_ivas->hCPE[0]->hCoreCoder[0] = NULL; + st_ivas->hCPE[0]->hCoreCoder[1] = NULL; + destroy_cpe_dec( st_ivas->hCPE[0] ); + st_ivas->hCPE[0] = NULL; + + if ( st_ivas->hSCE[0] != NULL ) + { + free( st_ivas->hSCE[0]->save_synth ); + st_ivas->hSCE[0]->save_synth = NULL; + + free( st_ivas->hSCE[0]->save_hb_synth ); + st_ivas->hSCE[0]->save_hb_synth = NULL; + } + } + + if ( nchan_transport_real == nchan_transport_old && st_ivas->nSCE == nSCE_old && st_ivas->nCPE == nCPE_old ) + { + for ( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) + { + st_ivas->hSCE[sce_id]->element_brate = brate_SCE; + st_ivas->hSCE[sce_id]->hCoreCoder[0]->total_brate = st_ivas->hSCE[sce_id]->element_brate; /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */ + } + + for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) + { + st_ivas->hCPE[cpe_id]->element_brate = brate_CPE; + + /* prepare bitstream buffers */ + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + st_ivas->hCPE[cpe_id]->hCoreCoder[n]->total_brate = st_ivas->hCPE[cpe_id]->element_brate / ( st_ivas->nCPE > 1 ? 1 : CPE_CHANNELS ); /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */ + } + } + + if ( st_ivas->nCPE > 1 ) + { + if ( ( error = mct_dec_reconfigure( st_ivas, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + else + { + nSCE_existing = min( nSCE_old, st_ivas->nSCE ); + nCPE_existing = min( nCPE_old, st_ivas->nCPE ); + + /* destroy superfluous core coder elements */ + for ( sce_id = st_ivas->nSCE; sce_id < nSCE_old; sce_id++ ) + { + destroy_sce_dec( st_ivas->hSCE[sce_id] ); + st_ivas->hSCE[sce_id] = NULL; + } + + if ( sba_dirac_stereo_flag_old && nCPE_old == 0 && st_ivas->hCPE[0] ) + { + st_ivas->hCPE[0]->hCoreCoder[0] = 0; /* this has been deallocated as part of the SCE it actually belongs to */ + destroy_cpe_dec( st_ivas->hCPE[0] ); + st_ivas->hCPE[0] = NULL; + } + + for ( cpe_id = st_ivas->nCPE; cpe_id < nCPE_old; cpe_id++ ) + { + /* don't deallocate first CPE in case of mono/stereo output of 1 TC SBA, only deallocate core coder */ + if ( cpe_id == 0 && st_ivas->sba_dirac_stereo_flag && sba_dirac_stereo_flag_old ) + { + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + if ( st_ivas->hCPE[cpe_id]->hCoreCoder[n] != NULL ) + { + destroy_core_dec( st_ivas->hCPE[cpe_id]->hCoreCoder[n] ); + + free( st_ivas->hCPE[cpe_id]->hCoreCoder[n] ); + st_ivas->hCPE[cpe_id]->hCoreCoder[n] = NULL; + } + } + continue; + } + destroy_cpe_dec( st_ivas->hCPE[cpe_id] ); + st_ivas->hCPE[cpe_id] = NULL; + } + + /* the CPE-internal settings depend from ivas_format and mc_mode, so clean-up when switching between mc_modes */ + if ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode != last_mc_mode && ( st_ivas->mc_mode == MC_MODE_MCMASA || last_mc_mode == MC_MODE_MCMASA ) ) + { + for ( cpe_id = 0; cpe_id < nCPE_existing; cpe_id++ ) + { + destroy_cpe_dec( st_ivas->hCPE[cpe_id] ); + st_ivas->hCPE[cpe_id] = NULL; + } + nCPE_old = 0; + nCPE_existing = min( nCPE_old, st_ivas->nCPE ); + } + if ( st_ivas->nCPE <= 1 && st_ivas->hMCT != NULL ) + { + ivas_mct_dec_close( &st_ivas->hMCT ); + } + + /* special case, if we have MCT now and had a single CPE before, remove the MDCT Stereo handles from the first CPE*/ + if ( st_ivas->nCPE > 1 && nCPE_old == 1 ) + { + free( st_ivas->hCPE[0]->hStereoMdct ); + st_ivas->hCPE[0]->hStereoMdct = NULL; + } + + for ( sce_id = 0; sce_id < nSCE_existing; sce_id++ ) + { + st_ivas->hSCE[sce_id]->element_brate = brate_SCE; + st_ivas->hSCE[sce_id]->hCoreCoder[0]->total_brate = st_ivas->hSCE[sce_id]->element_brate; /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */ + } + for ( ; sce_id < st_ivas->nSCE; sce_id++ ) + { + if ( ( error = create_sce_dec( st_ivas, sce_id, brate_SCE ) ) != IVAS_ERR_OK ) + { + return error; + } + } + if ( st_ivas->sba_dirac_stereo_flag && sba_dirac_stereo_flag_old && st_ivas->nchan_transport == 1 && nSCE_old == 0 ) + { + st_ivas->hCPE[0]->hCoreCoder[0] = st_ivas->hSCE[0]->hCoreCoder[0]; /* don't allocate unnecessary core coder, simply point to core coder of SCE element */ + st_ivas->hCPE[0]->hCoreCoder[1] = NULL; + } + + for ( cpe_id = 0; cpe_id < nCPE_existing; cpe_id++ ) + { + st_ivas->hCPE[cpe_id]->element_brate = brate_CPE; + + /* prepare bitstream buffers */ + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + st_ivas->hCPE[cpe_id]->hCoreCoder[n]->total_brate = st_ivas->hCPE[cpe_id]->element_brate / ( st_ivas->nCPE > 1 ? 1 : CPE_CHANNELS ); /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */ + } + } + for ( ; cpe_id < st_ivas->nCPE; cpe_id++ ) + { + if ( st_ivas->mc_mode == MC_MODE_MCMASA && st_ivas->hOutSetup.separateChannelEnabled ) + { + st_ivas->element_mode_init = IVAS_CPE_MDCT; + } + + if ( ( error = create_cpe_dec( st_ivas, cpe_id, brate_CPE ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( st_ivas->nCPE > 1 && nCPE_old <= 1 ) + { + if ( nCPE_old == 1 ) + { + /* set correct nominal bitrates and igf config already here, needed for the correct init of the MDCT Stereo handles for MCT */ + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + st_ivas->hCPE[0]->hCoreCoder[n]->total_brate = st_ivas->hCPE[0]->element_brate; + st_ivas->hCPE[0]->hCoreCoder[n]->bits_frame_nominal = (int16_t) ( st_ivas->hCPE[0]->element_brate / FRAMES_PER_SEC ); + st_ivas->hCPE[0]->hCoreCoder[n]->igf = 0; + } + } + + if ( ( error = create_mct_dec( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->hMCT != NULL && st_ivas->nCPE > 1 ) + { + if ( ( error = mct_dec_reconfigure( st_ivas, st_ivas->nchan_transport != nchan_transport_old ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* special case, if we have a single CPE and had MCT before we need to init the MDCT stereo handles here */ + if ( st_ivas->nCPE == 1 && nCPE_old > 1 ) + { + if ( ( st_ivas->hCPE[st_ivas->nCPE - 1]->hStereoMdct = (STEREO_MDCT_DEC_DATA_HANDLE) malloc( sizeof( STEREO_MDCT_DEC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MDCT Stereo \n" ) ); + } + + st_ivas->hCPE[st_ivas->nCPE - 1]->hStereoMdct->use_itd = 0; + st_ivas->hCPE[st_ivas->nCPE - 1]->hStereoMdct->reverse_dmx = 0; + st_ivas->hCPE[st_ivas->nCPE - 1]->hStereoMdct->smooth_ratio = 1.f; + set_s( st_ivas->hCPE[st_ivas->nCPE - 1]->hStereoMdct->prev_ms_mask[0], 0, MAX_SFB ); + set_s( st_ivas->hCPE[st_ivas->nCPE - 1]->hStereoMdct->prev_ms_mask[1], 0, MAX_SFB ); + st_ivas->hCPE[st_ivas->nCPE - 1]->hStereoMdct->lastCoh = 1.f; + st_ivas->hCPE[st_ivas->nCPE - 1]->hStereoMdct->mdct_stereo_mode[0] = SMDCT_DUAL_MONO; + st_ivas->hCPE[st_ivas->nCPE - 1]->hStereoMdct->mdct_stereo_mode[1] = SMDCT_DUAL_MONO; + st_ivas->hCPE[st_ivas->nCPE - 1]->hStereoMdct->IGFStereoMode[0] = -1; + st_ivas->hCPE[st_ivas->nCPE - 1]->hStereoMdct->IGFStereoMode[1] = -1; + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + /* reset mct_chan_mode */ + st_ivas->hCPE[0]->hCoreCoder[n]->mct_chan_mode = MCT_CHAN_MODE_REGULAR; + } + } + } + + /* create dummy CPE element for DFT stereo-like upmix */ + if ( ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_dirac_stereo_flag && !sba_dirac_stereo_flag_old ) || + ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCMASA && st_ivas->sba_dirac_stereo_flag && !sba_dirac_stereo_flag_old ) ) + { + /* if at least one CPE is already available, only allocate DFT Stereo struct */ + if ( st_ivas->nCPE > 0 ) + { + if ( ( error = stereo_dft_dec_create( &( st_ivas->hCPE[0]->hStereoDft ), st_ivas->hCPE[0]->element_brate, st_ivas->hDecoderConfig->output_Fs, st_ivas->sba_dirac_stereo_flag, st_ivas->nchan_transport ) ) != IVAS_ERR_OK ) + { + return error; + } + } + /* otherwise create extra dummy CPE */ + else + { + if ( ( error = create_cpe_dec( st_ivas, 0, ivas_total_brate / ( st_ivas->nSCE + st_ivas->nCPE ) ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + set_f( st_ivas->hCPE[0]->hStereoDft->buff_LBTCX_mem, 0, NS2SA( 16000, STEREO_DFT32MS_OVL_NS ) ); + + st_ivas->hCPE[0]->hCoreCoder[0] = st_ivas->hSCE[0]->hCoreCoder[0]; /* don't allocate unnecessary core coder, simply point to core coder of SCE element */ + st_ivas->hCPE[0]->hCoreCoder[1] = NULL; + + if ( st_ivas->hSCE[0]->save_synth == NULL ) + { + if ( ( st_ivas->hSCE[0]->save_synth = (float *) malloc( sizeof( float ) * output_frame ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for stereo output\n" ) ); + } + set_zero( st_ivas->hSCE[0]->save_synth, output_frame ); + } + + if ( st_ivas->hSCE[0]->save_hb_synth == NULL ) + { + if ( ( st_ivas->hSCE[0]->save_hb_synth = (float *) malloc( sizeof( float ) * output_frame ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate HB memory for stereo output\n" ) ); + } + set_zero( st_ivas->hSCE[0]->save_hb_synth, output_frame ); + } + } + + /*-----------------------------------------------------------------* + * Set CNA/CNG flags + *-----------------------------------------------------------------*/ + + if ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == MASA_FORMAT ) + { + ivas_sba_set_cna_cng_flag( st_ivas ); + } + + /* special case, if the decoder goes from 1TC DTX to 2TC active frame (in case the bitstream started with an SBA SID frame), allocate DTX memories */ + if ( hDecoderConfig->last_ivas_total_brate <= IVAS_SID_5k2 && st_ivas->nCPE >= 1 ) + { + if ( ( error = initMdctStereoDtxData( st_ivas->hCPE[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + return error; +} + + +/*-------------------------------------------------------------------* + * ivas_hp20_dec_reconfig() + * + * Allocate, initialize, and configure HP20 memory handles in case of bitrate switching + *-------------------------------------------------------------------*/ + +ivas_error ivas_hp20_dec_reconfig( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const int16_t nchan_hp20_old /* i : number of HP20 filters in previous frame */ +) +{ + int16_t i, nchan_hp20; + float **old_mem_hp20_out; + ivas_error error; + + error = IVAS_ERR_OK; + + /*-----------------------------------------------------------------* + * HP20 memories + *-----------------------------------------------------------------*/ + + nchan_hp20 = getNumChanSynthesis( st_ivas ); + + if ( nchan_hp20 > nchan_hp20_old ) + { + /* save old mem_hp_20 pointer */ + old_mem_hp20_out = st_ivas->mem_hp20_out; + st_ivas->mem_hp20_out = NULL; + + if ( ( st_ivas->mem_hp20_out = (float **) malloc( nchan_hp20 * sizeof( float * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HP20 filter memory\n" ) ); + } + + for ( i = 0; i < nchan_hp20_old; i++ ) + { + st_ivas->mem_hp20_out[i] = old_mem_hp20_out[i]; + old_mem_hp20_out[i] = NULL; + } + /* create additional hp20 memories */ + for ( ; i < nchan_hp20; i++ ) + { + if ( ( st_ivas->mem_hp20_out[i] = (float *) malloc( L_HP20_MEM * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HP20 filter memory\n" ) ); + } + + set_f( st_ivas->mem_hp20_out[i], 0.0f, L_HP20_MEM ); + } + + free( old_mem_hp20_out ); + old_mem_hp20_out = NULL; + } + else if ( nchan_hp20 < nchan_hp20_old ) + { + /* save old mem_hp_20 pointer */ + old_mem_hp20_out = st_ivas->mem_hp20_out; + st_ivas->mem_hp20_out = NULL; + + if ( ( st_ivas->mem_hp20_out = (float **) malloc( nchan_hp20 * sizeof( float * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HP20 filter memory\n" ) ); + } + + for ( i = 0; i < nchan_hp20; i++ ) + { + st_ivas->mem_hp20_out[i] = old_mem_hp20_out[i]; + old_mem_hp20_out[i] = NULL; + } + /* remove superfluous hp20 memories */ + for ( ; i < nchan_hp20_old; i++ ) + { + free( old_mem_hp20_out[i] ); + old_mem_hp20_out[i] = NULL; + } + + free( old_mem_hp20_out ); + old_mem_hp20_out = NULL; + } + + return error; +} + + +/*-------------------------------------------------------------------* + * ivas_cldfb_dec_reconfig() + * + * Allocate, initialize, and configure CLDFB handles in case of bitrate switching + *-------------------------------------------------------------------*/ + +ivas_error ivas_cldfb_dec_reconfig( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const int16_t nchan_transport_old, /* i : number of TCs in previous frame */ + int16_t numCldfbAnalyses_old, /* i : number of CLDFB analysis instances in previous frame */ + const int16_t numCldfbSyntheses_old /* i : number of CLDFB synthesis instances in previous frame */ +) +{ + int16_t i, numCldfbAnalyses, numCldfbSyntheses; + DECODER_CONFIG_HANDLE hDecoderConfig; + ivas_error error; + + hDecoderConfig = st_ivas->hDecoderConfig; + + ivas_init_dec_get_num_cldfb_instances( st_ivas, &numCldfbAnalyses, &numCldfbSyntheses ); + + /* special case, if there was one transport channel in the previous frame and more than one in the current frame, + remove the second CLDFB here, it was for CNA/CNG */ + if ( st_ivas->ivas_format == SBA_FORMAT && nchan_transport_old == 1 && numCldfbAnalyses_old == 2 && st_ivas->nchan_transport > 1 ) + { + deleteCldfb( &( st_ivas->cldfbAnaDec[1] ) ); + numCldfbAnalyses_old--; + } + + /* resample CLDFB analysis instances */ + for ( i = 0; i < min( numCldfbAnalyses, numCldfbAnalyses_old ); i++ ) + { + if ( ( st_ivas->cldfbAnaDec[i]->no_channels * st_ivas->cldfbAnaDec[i]->no_col ) != ( hDecoderConfig->output_Fs / FRAMES_PER_SEC ) ) + { + resampleCldfb( st_ivas->cldfbAnaDec[i], hDecoderConfig->output_Fs ); + } + } + + /* Analysis*/ + if ( numCldfbAnalyses_old > numCldfbAnalyses ) + { + /* delete superfluous CLDFB synthesis instances */ + for ( i = numCldfbAnalyses; i < numCldfbAnalyses_old; i++ ) + { + deleteCldfb( &( st_ivas->cldfbAnaDec[i] ) ); + } + } + else if ( numCldfbAnalyses_old < numCldfbAnalyses ) + { + /* create additional CLDFB synthesis instances */ + for ( i = numCldfbAnalyses_old; i < numCldfbAnalyses; i++ ) + { + if ( ( error = openCldfb( &( st_ivas->cldfbAnaDec[i] ), CLDFB_ANALYSIS, hDecoderConfig->output_Fs, CLDFB_PROTOTYPE_5_00MS ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + + /* Synthesis */ + if ( numCldfbSyntheses_old > numCldfbSyntheses ) + { + /* delete superfluous CLDFB synthesis instances */ + for ( i = numCldfbSyntheses; i < numCldfbSyntheses_old; i++ ) + { + deleteCldfb( &( st_ivas->cldfbSynDec[i] ) ); + } + } + else if ( numCldfbSyntheses_old < numCldfbSyntheses ) + { + /* create additional CLDFB synthesis instances */ + for ( i = numCldfbSyntheses_old; i < numCldfbSyntheses; i++ ) + { + if ( ( error = openCldfb( &( st_ivas->cldfbSynDec[i] ), CLDFB_SYNTHESIS, hDecoderConfig->output_Fs, CLDFB_PROTOTYPE_5_00MS ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + + /* CLDFB Interpolation weights */ + if ( st_ivas->ivas_format == SBA_FORMAT && ( numCldfbAnalyses_old != numCldfbAnalyses || numCldfbSyntheses_old != numCldfbSyntheses || nchan_transport_old != st_ivas->nchan_transport ) && numCldfbAnalyses != 0 && numCldfbSyntheses != 0 ) + { + ivas_spar_get_cldfb_gains( st_ivas->hSpar, st_ivas->cldfbAnaDec[0], st_ivas->cldfbSynDec[0], hDecoderConfig ); + } + + return IVAS_ERR_OK; +} diff --git a/lib_dec/ivas_cpe_dec.c b/lib_dec/ivas_cpe_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..8b7b8ce131ebb014898e168201946bf790a9fa60 --- /dev/null +++ b/lib_dec/ivas_cpe_dec.c @@ -0,0 +1,1103 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include "options.h" +#include "cnst.h" +#include "ivas_cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_rom_com.h" +#include "wmc_auto.h" +#include + + +/*--------------------------------------------------------------------------* + * Local function prototypes + *--------------------------------------------------------------------------*/ + +static void read_stereo_mode_and_bwidth( CPE_DEC_HANDLE hCPE, const Decoder_Struct *st_ivas ); + +static void stereo_mode_combined_format_dec( const Decoder_Struct *st_ivas, CPE_DEC_HANDLE hCPE ); + + +/*--------------------------------------------------------------------------* + * ivas_cpe_dec() + * + * Channel Pair Element (CPE) decoding routine + *--------------------------------------------------------------------------*/ + +ivas_error ivas_cpe_dec( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const int16_t cpe_id, /* i : CPE # identifier */ + float *output[CPE_CHANNELS], /* o : output synthesis signal */ + const int16_t output_frame, /* i : output frame length per channel */ + const int16_t nb_bits_metadata /* i : number of metadata bits */ +) +{ + int16_t i, n, n_channels; + int16_t nb_bits, last_core; + int16_t last_bwidth; + int16_t tdm_ratio_idx; + float outputHB[CPE_CHANNELS][L_FRAME48k]; /* 'float' buffer for output HB synthesis, both channels */ + float res_buf[STEREO_DFT_N_8k]; + CPE_DEC_HANDLE hCPE; + Decoder_State **sts; + int32_t ivas_total_brate; + ivas_error error; + int32_t cpe_brate; + int32_t element_brate_ref; + + error = IVAS_ERR_OK; + + push_wmops( "ivas_cpe_dec" ); + + ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; + + hCPE = st_ivas->hCPE[cpe_id]; + sts = hCPE->hCoreCoder; + + last_core = sts[0]->last_core; + last_bwidth = sts[0]->last_bwidth; + + sts[0]->BER_detect |= st_ivas->BER_detect; + sts[1]->BER_detect |= st_ivas->BER_detect; + + element_brate_ref = hCPE->element_brate; + + /*------------------------------------------------------------------* + * Read stereo technology info & audio bandwidth + *-----------------------------------------------------------------*/ + + stereo_mode_combined_format_dec( st_ivas, hCPE ); + + read_stereo_mode_and_bwidth( hCPE, st_ivas ); + + /*----------------------------------------------------------------* + * dynamically allocate data structures depending on the actual stereo mode + *----------------------------------------------------------------*/ + + if ( ( error = stereo_memory_dec( ivas_total_brate, hCPE, nb_bits_metadata, st_ivas->hDecoderConfig->output_Fs, st_ivas->ivas_format, st_ivas->mc_mode, st_ivas->nchan_transport ) ) != IVAS_ERR_OK ) + { + return error; + } + + /*------------------------------------------------------------------* + * Initialization + *-----------------------------------------------------------------*/ + + n_channels = CPE_CHANNELS; + if ( hCPE->element_mode == IVAS_CPE_DFT ) + { + n_channels = 1; /* in DFT stereo, only M channel is coded */ + } + + tdm_ratio_idx = LRTD_STEREO_RIGHT_IS_PRIM; + + for ( n = 0; n < n_channels; n++ ) + { + sts[n]->idchan = n; + sts[n]->element_mode = hCPE->element_mode; + + if ( !st_ivas->bfi ) + { + sts[n]->tdm_LRTD_flag = 0; + } + + /* TD stereo parameters */ + if ( hCPE->hStereoTD != NULL ) + { + hCPE->hStereoTD->tdm_lp_reuse_flag = 0; + hCPE->hStereoTD->tdm_low_rate_mode = 0; + hCPE->hStereoTD->tdm_Pitch_reuse_flag = 0; + } + } + + /*----------------------------------------------------------------* + * Resets/updates in case of stereo switching + *----------------------------------------------------------------*/ + + stereo_switching_dec( hCPE, ivas_total_brate ); + + /*----------------------------------------------------------------* + * Configuration of stereo decoder + *----------------------------------------------------------------*/ + + /* Force to MODE1 in IVAS */ + for ( n = 0; n < n_channels; n++ ) + { + sts[n]->codec_mode = MODE1; + } + + if ( hCPE->element_mode != IVAS_CPE_MDCT && ( hCPE->element_brate != hCPE->last_element_brate || hCPE->last_element_mode != hCPE->element_mode || sts[0]->ini_frame == 0 || ( ivas_total_brate != st_ivas->hDecoderConfig->last_ivas_total_brate ) ) ) + { + if ( st_ivas->hQMetaData != NULL && ivas_total_brate > IVAS_SID_5k2 ) + { + if ( st_ivas->ivas_format == MASA_ISM_FORMAT ) + { + stereo_dft_config( hCPE->hStereoDft == NULL ? NULL : hCPE->hStereoDft->hConfig, (int32_t) ( 0.7f * st_ivas->hQMetaData->bits_frame_nominal * FRAMES_PER_SEC ), &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); + } + else + { + stereo_dft_config( hCPE->hStereoDft == NULL ? NULL : hCPE->hStereoDft->hConfig, st_ivas->hQMetaData->bits_frame_nominal * FRAMES_PER_SEC, &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); + } + } + else + { + /* Note: This only works for stereo operation. If DTX would be applied for multiple CPEs a different bitrate signaling is needed */ + if ( ivas_total_brate <= IVAS_SID_5k2 ) + { + stereo_dft_config( hCPE->hStereoDft == NULL ? NULL : hCPE->hStereoDft->hConfig, ivas_total_brate, &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); + } + else + { + stereo_dft_config( hCPE->hStereoDft == NULL ? NULL : hCPE->hStereoDft->hConfig, hCPE->element_brate, &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); + } + } + } + + if ( hCPE->element_mode == IVAS_CPE_TD ) + { + if ( hCPE->hStereoTD->tdm_LRTD_flag ) + { + sts[0]->bits_frame_nominal = (int16_t) ( ( hCPE->element_brate >> 1 ) / FRAMES_PER_SEC ); + sts[1]->bits_frame_nominal = (int16_t) ( ( hCPE->element_brate >> 1 ) / FRAMES_PER_SEC ); + } + else + { + stereo_dft_config( NULL, hCPE->element_brate, &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); + } + } + + /*----------------------------------------------------------------* + * Set bitrates per channel + * Set bitstream buffers per channel + *----------------------------------------------------------------*/ + + if ( hCPE->element_mode == IVAS_CPE_DFT ) + { + if ( !st_ivas->bfi ) + { + /* Update DFT Stereo memories */ + stereo_dft_dec_update( hCPE->hStereoDft, output_frame, 0 ); + + if ( st_ivas->ivas_format == MASA_FORMAT && ivas_total_brate <= IVAS_SID_5k2 ) + { + if ( ivas_total_brate == FRAME_NO_DATA ) + { + hCPE->hCoreCoder[n]->core_brate = ivas_total_brate; + hCPE->hCoreCoder[0]->total_brate = ivas_total_brate; + } + else + { + hCPE->hCoreCoder[n]->core_brate = SID_2k40; + } + } + + /* read DFT Stereo side info */ + nb_bits = (int16_t) ( ( hCPE->element_brate ) / FRAMES_PER_SEC - 0.8f * sts[0]->bits_frame_nominal ); + cpe_brate = st_ivas->hCPE[0]->element_brate; + if ( st_ivas->ivas_format == MASA_ISM_FORMAT ) + { + sts[1]->bit_stream = sts[0]->bit_stream + cpe_brate / FRAMES_PER_SEC - 1 - nb_bits_metadata; + sts[1]->bit_stream += hCPE->brate_surplus / FRAMES_PER_SEC; + } + else + { + sts[1]->bit_stream = sts[0]->bit_stream + ivas_total_brate / FRAMES_PER_SEC - 1 - nb_bits_metadata; + } + + if ( ivas_total_brate == IVAS_SID_5k2 ) + { + nb_bits -= SID_FORMAT_NBITS; + sts[1]->bit_stream -= SID_FORMAT_NBITS; + } + + if ( ( ( st_ivas->ivas_format == MASA_FORMAT && ivas_total_brate < MASA_STEREO_MIN_BITRATE ) || ( st_ivas->ivas_format == MASA_ISM_FORMAT && cpe_brate < MASA_STEREO_MIN_BITRATE ) ) && ivas_total_brate > IVAS_SID_5k2 ) + { + sts[0]->total_brate = hCPE->element_brate; /* Only mono downmix was transmitted in this case */ + } + else + { + stereo_dft_dec_read_BS( ivas_total_brate, hCPE->element_brate, &sts[0]->total_brate, sts[1], hCPE->hStereoDft, sts[0]->bwidth, output_frame, res_buf, &nb_bits, hCPE->hStereoCng->coh, st_ivas->ivas_format ); + } + + /* subtract metadata bitbudget */ + sts[0]->total_brate -= ( nb_bits_metadata * FRAMES_PER_SEC ); + + /* subtract bit-rate for combined format coding */ + if ( st_ivas->ivas_format == MASA_ISM_FORMAT && ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_DISC ) ) + { + sts[0]->total_brate += hCPE->brate_surplus; + } + } + else + { + hCPE->hStereoDft->sg_mem_corrupt = 1; + } + } + else if ( hCPE->element_mode == IVAS_CPE_TD ) + { + /* signal bitrate for BW selection in the SCh */ + sts[0]->bits_frame_channel = 0; + sts[1]->bits_frame_channel = (int16_t) ( hCPE->element_brate / FRAMES_PER_SEC ); + sts[1]->bits_frame_channel += (int16_t) ( hCPE->brate_surplus / FRAMES_PER_SEC ); + if ( st_ivas->hQMetaData != NULL ) + { + sts[1]->bits_frame_channel -= st_ivas->hQMetaData->metadata_max_bits; + } + } + else if ( hCPE->element_mode == IVAS_CPE_MDCT ) + { + /* compute bit-rate surplus per channel in combined format coding */ + int32_t brate_surplus[CPE_CHANNELS]; + if ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_DISC ) + { + brate_surplus[0] = ( ( hCPE->brate_surplus / FRAMES_PER_SEC ) >> 1 ) * FRAMES_PER_SEC; + brate_surplus[1] = hCPE->brate_surplus - brate_surplus[0]; + } + + if ( is_DTXrate( ivas_total_brate ) == 1 && ( sts[0]->first_CNG == 0 || sts[1]->first_CNG == 0 ) ) + { + if ( ( error = initMdctStereoDtxData( hCPE ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* this is just for initialization, the true values of "total_brate" and "bits_frame_channel" are set later */ + for ( n = 0; n < n_channels; n++ ) + { + if ( ivas_total_brate == IVAS_SID_5k2 ) + + { + sts[n]->total_brate = SID_2k40; + sts[1]->bit_stream = sts[0]->bit_stream + SID_2k40 / FRAMES_PER_SEC; + } + else + { + /*total bitrate must be set to the element bitrate to avoid false BER if bits read are larger than half the bitrate*/ + sts[n]->total_brate = hCPE->element_brate; + } + sts[n]->bits_frame_nominal = (int16_t) ( sts[n]->total_brate / FRAMES_PER_SEC ); + sts[n]->bits_frame_channel = (int16_t) ( ( hCPE->element_brate / FRAMES_PER_SEC ) / n_channels ); + + /* subtract bit-rate for combined format coding */ + if ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_DISC ) + { + sts[n]->bits_frame_channel += (int16_t) ( brate_surplus[n] / FRAMES_PER_SEC ); + sts[n]->total_brate += brate_surplus[n]; + } + } + + if ( !st_ivas->hMCT ) + { + if ( st_ivas->ivas_format == SBA_FORMAT && ivas_total_brate == IVAS_SID_5k2 ) + { + for ( n = 0; n < n_channels; n++ ) + { + sts[n]->bits_frame_channel -= nb_bits_metadata / n_channels; + } + } + else + { + /* subtract metadata bitbudget */ + sts[0]->bits_frame_channel -= nb_bits_metadata; + } + } + } + + /*----------------------------------------------------------------* + * Core codec configuration + *----------------------------------------------------------------*/ + + for ( n = 0; n < n_channels; n++ ) + { + /* set ACELP12k8 / ACELP16k flag for flexible ACELP core */ + sts[n]->flag_ACELP16k = set_ACELP_flag( hCPE->element_mode, hCPE->element_brate, sts[n]->total_brate, n, ( hCPE->hStereoTD != NULL ? hCPE->hStereoTD->tdm_LRTD_flag : 0 ), sts[n]->bwidth, sts[n]->cng_type ); + } + + for ( n = 0; n < n_channels; n++ ) + { + /* set VAD flag */ + if ( is_DTXrate( ivas_total_brate ) == 1 ) + { + sts[n]->VAD = 0; + sts[n]->active_cnt = 0; + if ( sts[1] != NULL ) + { + sts[1]->active_cnt = 0; + } + } + else + { + sts[n]->VAD = 1; + sts[n]->active_cnt++; + sts[n]->active_cnt = min( sts[n]->active_cnt, 100 ); + } + + /* set CNA flag */ + if ( ( hCPE->element_mode == IVAS_CPE_DFT && hCPE->element_brate <= CNA_MAX_BRATE_DFT_STEREO ) || hCPE->element_brate <= CNA_MAX_BRATE_STEREO ) + { + sts[n]->flag_cna = 1; + } + else + { + sts[n]->flag_cna = 0; + } + } + + /* configure TD stereo decoder */ + if ( hCPE->element_mode == IVAS_CPE_TD ) + { + if ( !st_ivas->bfi ) + { + tdm_configure_dec( st_ivas->ivas_format, st_ivas->ism_mode, hCPE, &tdm_ratio_idx, nb_bits_metadata ); + + sts[1]->bit_stream = sts[0]->bit_stream + ( sts[0]->total_brate / FRAMES_PER_SEC ); + } + else + { + sts[1]->coder_type = sts[1]->last_coder_type; + tdm_ratio_idx = hCPE->hStereoTD->tdm_last_ratio_idx; + } + } + + /*----------------------------------------------------------------* + * Core Decoder + *----------------------------------------------------------------*/ + + if ( hCPE->element_mode != IVAS_CPE_DFT || ( hCPE->nchan_out == 1 && hCPE->hStereoDft->hConfig->res_cod_mode == STEREO_DFT_RES_COD_OFF ) ) + { + if ( ( error = ivas_core_dec( st_ivas, NULL, hCPE, st_ivas->hMCT, n_channels, output, outputHB, NULL, st_ivas->sba_dirac_stereo_flag ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( st_ivas->hMCT ) + { + pop_wmops(); + + return error; + } + + /*----------------------------------------------------------------* + * Stereo decoder & upmixing + *----------------------------------------------------------------*/ + + if ( hCPE->element_mode == IVAS_CPE_DFT && !( hCPE->nchan_out == 1 && hCPE->hStereoDft->hConfig->res_cod_mode == STEREO_DFT_RES_COD_OFF ) ) + { + float DFT[CPE_CHANNELS][STEREO_DFT_BUF_MAX]; + + /* core decoder */ + if ( ( error = ivas_core_dec( NULL, NULL, hCPE, st_ivas->hMCT, n_channels, output, outputHB, DFT, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* DFT Stereo residual decoding */ + if ( hCPE->hStereoDft->res_cod_band_max > 0 && !st_ivas->bfi ) + { + stereo_dft_dec_res( hCPE, res_buf, output[1] ); + + stereo_dft_dec_analyze( hCPE, output[1], DFT, 1, L_FRAME8k, output_frame, DFT_STEREO_DEC_ANA_LB, 0, 0 ); + } + + /* DFT stereo CNG */ + stereo_dtf_cng( hCPE, ivas_total_brate, DFT, output_frame ); + + /* decoding */ + if ( hCPE->nchan_out == 1 ) + { + stereo_dft_unify_dmx( hCPE->hStereoDft, sts[0], DFT, hCPE->input_mem[1], hCPE->hStereoCng->prev_sid_nodata ); + } + else + { + stereo_dft_dec( hCPE->hStereoDft, sts[0], DFT, hCPE->input_mem[1], hCPE->hStereoCng, 0, 0, 0, 0, 0, 0, MAX_PARAM_SPATIAL_SUBFRAMES ); + } + + /* synthesis iFFT */ + for ( n = 0; n < hCPE->nchan_out; n++ ) + { + stereo_dft_dec_synthesize( hCPE, DFT, n, output[n], output_frame ); + } + } + else if ( hCPE->element_mode == IVAS_CPE_TD ) + { + if ( hCPE->last_element_mode != IVAS_CPE_TD && sts[0]->tdm_LRTD_flag ) + { + hCPE->hStereoTD->tdm_last_ratio_idx = tdm_ratio_idx; + } + + /* TD stereo upmixing */ + stereo_tdm_combine( hCPE, output[0], output[1], output_frame, 0, tdm_ratio_idx ); + if ( sts[0]->tdm_LRTD_flag ) + { + stereo_tdm_combine( hCPE, outputHB[0], outputHB[1], output_frame, 1, tdm_ratio_idx ); + } + + hCPE->hStereoCng->last_tdm_idx = hCPE->hStereoTD->tdm_last_ratio_idx; + hCPE->hStereoTD->tdm_last_ratio_idx = tdm_ratio_idx; + + if ( hCPE->nchan_out == 1 ) + { + /* Scale the Right channel with the gain */ + stereo_tca_scale_R_channel( hCPE, output[1], output_frame ); + + /* stereo to mono downmix */ + for ( i = 0; i < output_frame; i++ ) + { + output[0][i] = ( output[0][i] + output[1][i] ) * 0.5f; + } + } + } + + /*----------------------------------------------------------------* + * Update parameters for stereo CNA + *----------------------------------------------------------------*/ + + stereo_cna_update_params( hCPE, output, output_frame, tdm_ratio_idx ); + + /*----------------------------------------------------------------* + * Synthesis synchronization between CPE modes + *----------------------------------------------------------------*/ + + if ( !st_ivas->sba_dirac_stereo_flag ) + { + synchro_synthesis( ivas_total_brate, hCPE, output, output_frame, 0 ); + } + + if ( hCPE->element_mode == IVAS_CPE_MDCT && hCPE->nchan_out == 1 && ( is_DTXrate( ivas_total_brate ) == 0 || ( is_DTXrate( ivas_total_brate ) == 1 && is_DTXrate( st_ivas->hDecoderConfig->last_ivas_total_brate ) == 0 ) ) ) + { + applyDmxMdctStereo( hCPE, output, output_frame ); + } + + /*----------------------------------------------------------------* + * IC-BWE: output LB and HB mix in ACELP mode + *----------------------------------------------------------------*/ + + stereo_icBWE_decproc( hCPE, output, outputHB, last_core, last_bwidth, output_frame ); + + smooth_dft2td_transition( hCPE, output, output_frame ); + + /*----------------------------------------------------------------* + * Temporal ICA, stereo adjustment and upmix + *----------------------------------------------------------------*/ + + stereo_tca_dec( hCPE, output, output_frame ); + + /*----------------------------------------------------------------* + * Common Stereo updates + *----------------------------------------------------------------*/ + + hCPE->last_element_brate = hCPE->element_brate; + hCPE->last_element_mode = hCPE->element_mode; + + if ( st_ivas->ivas_format == MASA_ISM_FORMAT ) + { + hCPE->element_brate = element_brate_ref; + } + + if ( hCPE->element_mode == IVAS_CPE_DFT || hCPE->element_mode == IVAS_CPE_TD ) + { + stereo_cng_dec_update( hCPE, ivas_total_brate ); + } + + st_ivas->BER_detect |= sts[0]->BER_detect; + st_ivas->BER_detect |= sts[1]->BER_detect; + + + pop_wmops(); + return error; +} + + +/*------------------------------------------------------------------------- + * create_cpe_dec() + * + * Create, allocate and initialize IVAS decoder CPE handle + *-------------------------------------------------------------------------*/ + +ivas_error create_cpe_dec( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const int16_t cpe_id, /* i : CPE # identifier */ + const int32_t element_brate /* i : element bitrate */ +) +{ + int16_t i, n; + CPE_DEC_HANDLE hCPE; + Decoder_State *st; + int32_t output_Fs; + ivas_error error; + int32_t cpe_brate; + + error = IVAS_ERR_OK; + + /*-----------------------------------------------------------------* + * Allocate CPE handle + *-----------------------------------------------------------------*/ + + if ( ( hCPE = (CPE_DEC_HANDLE) malloc( sizeof( CPE_DEC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for CPE\n" ) ); + } + + /*-----------------------------------------------------------------* + * Initialization - general parameters + *-----------------------------------------------------------------*/ + + output_Fs = st_ivas->hDecoderConfig->output_Fs; + + hCPE->cpe_id = cpe_id; + + hCPE->element_brate = element_brate; + hCPE->last_element_brate = hCPE->element_brate; + hCPE->element_mode = st_ivas->element_mode_init; + hCPE->last_element_mode = st_ivas->element_mode_init; + + hCPE->hStereoDft = NULL; + hCPE->hStereoDftDmx = NULL; + hCPE->hStereoTD = NULL; + hCPE->hStereoMdct = NULL; + hCPE->hStereoTCA = NULL; + hCPE->hStereoICBWE = NULL; + hCPE->hStereoCng = NULL; + + hCPE->stereo_switching_counter = 10; + hCPE->NbFrameMod = 7; + hCPE->lt_es_em = 0.0f; + + /* Note: nchan_out is considered to be related to the structure. This is nchan_out for CPE and for MASA_format is always 2. */ + if ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == MASA_FORMAT || st_ivas->ivas_format == MASA_ISM_FORMAT || st_ivas->ivas_format == MC_FORMAT ) + { + hCPE->nchan_out = CPE_CHANNELS; + } + else + { + hCPE->nchan_out = min( CPE_CHANNELS, st_ivas->hDecoderConfig->nchan_out ); + } + + if ( st_ivas->ivas_format == MASA_ISM_FORMAT && ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_DISC ) ) + { + cpe_brate = element_brate; + } + else + { + cpe_brate = st_ivas->hDecoderConfig->ivas_total_brate; + } + + if ( ( ( st_ivas->ivas_format == MASA_FORMAT && st_ivas->hDecoderConfig->ivas_total_brate < MASA_STEREO_MIN_BITRATE ) || + ( st_ivas->ivas_format == MASA_ISM_FORMAT && cpe_brate < MASA_STEREO_MIN_BITRATE ) ) && + st_ivas->hDecoderConfig->ivas_total_brate > IVAS_SID_5k2 ) + { + hCPE->nchan_out = 1; + } + + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + set_f( hCPE->prev_hb_synth[n], 0, NS2SA( output_Fs, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ) ); + set_f( hCPE->prev_synth[n], 0, NS2SA( output_Fs, IVAS_DEC_DELAY_NS - STEREO_DFT32MS_OVL_NS ) ); + } + + hCPE->brate_surplus = 0; + + /*-----------------------------------------------------------------* + * DFT stereo I/O Buffers: allocate and initialize + *-----------------------------------------------------------------*/ + + for ( i = 0; i < CPE_CHANNELS; i++ ) + { + if ( st_ivas->ivas_format == STEREO_FORMAT || st_ivas->ivas_format == MASA_FORMAT || st_ivas->ivas_format == MASA_ISM_FORMAT || + ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCMASA ) || st_ivas->sba_dirac_stereo_flag ) + { + if ( ( hCPE->input_mem[i] = (float *) malloc( sizeof( float ) * NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DFT stereo memory\n" ) ); + } + set_zero( hCPE->input_mem[i], NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) ); + + if ( ( hCPE->input_mem_LB[i] = (float *) malloc( sizeof( float ) * STEREO_DFT32MS_OVL_16k ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DFT stereo memory\n" ) ); + } + set_zero( hCPE->input_mem_LB[i], STEREO_DFT32MS_OVL_16k ); + + if ( i == 0 ) + { + if ( ( hCPE->input_mem_BPF[0] = (float *) malloc( sizeof( float ) * STEREO_DFT32MS_OVL_16k ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DFT stereo memory\n" ) ); + } + set_zero( hCPE->input_mem_BPF[0], STEREO_DFT32MS_OVL_16k ); + } + + if ( ( hCPE->output_mem[i] = (float *) malloc( sizeof( float ) * NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DFT stereo memory\n" ) ); + } + set_zero( hCPE->output_mem[i], NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) ); + + if ( i < hCPE->nchan_out ) + { + if ( ( hCPE->prev_synth_chs[i] = (float *) malloc( sizeof( float ) * NS2SA( output_Fs, FRAME_SIZE_NS ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DFT stereo memory\n" ) ); + } + set_zero( hCPE->prev_synth_chs[i], NS2SA( output_Fs, FRAME_SIZE_NS ) ); + } + else + { + hCPE->prev_synth_chs[i] = NULL; + } + } + else + { + hCPE->input_mem[i] = NULL; + hCPE->input_mem_LB[i] = NULL; + if ( i == 0 ) + { + hCPE->input_mem_BPF[0] = NULL; + } + hCPE->output_mem[i] = NULL; + hCPE->prev_synth_chs[i] = NULL; + } + } + + /*-----------------------------------------------------------------* + * CoreCoder, 2 instances: allocate and initialize + *-----------------------------------------------------------------*/ + + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + if ( st_ivas->sba_dirac_stereo_flag && st_ivas->nchan_transport == 1 ) + { + /* for SBA DirAC stereo output CPE element is only used for upmix, core coder is found in SCE element used for core decoding */ + break; + } + + if ( ( st = (DEC_CORE_HANDLE) malloc( sizeof( Decoder_State ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for CoreCoder structure\n" ) ); + } + + copy_decoder_config( st_ivas, st ); + + st->total_brate = hCPE->element_brate / ( CPE_CHANNELS ); /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */ + st->mct_chan_mode = MCT_CHAN_MODE_REGULAR; + st->is_ism_format = 0; + + if ( ( error = init_decoder( st, n, st_ivas->mc_mode ) ) != IVAS_ERR_OK ) + { + return error; + } + + hCPE->hCoreCoder[n] = st; + } + + /*-----------------------------------------------------------------* + * DFT stereo initialization + *-----------------------------------------------------------------*/ + + if ( hCPE->element_mode == IVAS_CPE_DFT || ( st_ivas->sba_dirac_stereo_flag && hCPE->cpe_id == 0 ) ) + { + if ( ( error = stereo_dft_dec_create( &( hCPE->hStereoDft ), hCPE->element_brate, output_Fs, st_ivas->sba_dirac_stereo_flag, st_ivas->nchan_transport ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /*-----------------------------------------------------------------* + * DFT stereo mono DMX initialization + *-----------------------------------------------------------------*/ + + if ( hCPE->element_mode != IVAS_CPE_MDCT && hCPE->nchan_out == 1 ) + { + if ( ( hCPE->hStereoDftDmx = (STEREO_DFT_DMX_DATA_HANDLE) malloc( sizeof( STEREO_DFT_DMX_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Stereo DFT mono output\n" ) ); + } + + stereo_dft_dmx_out_reset( hCPE->hStereoDftDmx ); + } + + /*-----------------------------------------------------------------* + * Temporal inter-channel alignment initialization + *-----------------------------------------------------------------*/ + + if ( ( hCPE->element_mode != IVAS_CPE_MDCT || ( st_ivas->ivas_format == STEREO_FORMAT && hCPE->element_brate <= MAX_MDCT_ITD_BRATE ) ) && hCPE->nchan_out != 1 ) + { + if ( ( hCPE->hStereoTCA = (STEREO_TCA_DEC_HANDLE) malloc( sizeof( STEREO_TCA_DEC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Stereo TCA\n" ) ); + } + + stereo_tca_init_dec( hCPE->hStereoTCA ); + } + + /*-----------------------------------------------------------------* + * Stereo IC BWE initialization + *-----------------------------------------------------------------*/ + + if ( hCPE->element_mode != IVAS_CPE_MDCT && !( hCPE->element_mode == IVAS_CPE_DFT && hCPE->nchan_out == 1 ) ) + { + if ( ( hCPE->hStereoICBWE = (STEREO_ICBWE_DEC_HANDLE) malloc( sizeof( STEREO_ICBWE_DEC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Stereo ICBWE\n" ) ); + } + + stereo_icBWE_init_dec( hCPE->hStereoICBWE ); + } + + /*-----------------------------------------------------------------* + * TD stereo initialization + *-----------------------------------------------------------------*/ + + if ( hCPE->element_mode == IVAS_CPE_TD ) + { + if ( ( hCPE->hStereoTD = (STEREO_TD_DEC_DATA_HANDLE) malloc( sizeof( STEREO_TD_DEC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD Stereo\n" ) ); + } + + stereo_td_init_dec( hCPE->hStereoTD, hCPE->last_element_mode ); + } + + /*-----------------------------------------------------------------* + * MDCT stereo initialization + *-----------------------------------------------------------------*/ + + if ( hCPE->element_mode == IVAS_CPE_MDCT && st_ivas->nCPE == 1 ) + { + if ( ( hCPE->hStereoMdct = (STEREO_MDCT_DEC_DATA_HANDLE) malloc( sizeof( STEREO_MDCT_DEC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Stereo MDCT\n" ) ); + } + + if ( st_ivas->ivas_format == STEREO_FORMAT && hCPE->element_brate <= MAX_MDCT_ITD_BRATE ) + { + hCPE->hStereoMdct->use_itd = 1; + } + else + { + hCPE->hStereoMdct->use_itd = 0; + } + + hCPE->hStereoMdct->reverse_dmx = 0; + hCPE->hStereoMdct->smooth_ratio = 1.f; + set_s( hCPE->hStereoMdct->prev_ms_mask[0], 0, MAX_SFB ); + set_s( hCPE->hStereoMdct->prev_ms_mask[1], 0, MAX_SFB ); + hCPE->hStereoMdct->lastCoh = 1.f; + hCPE->hStereoMdct->mdct_stereo_mode[0] = SMDCT_DUAL_MONO; + hCPE->hStereoMdct->mdct_stereo_mode[1] = SMDCT_DUAL_MONO; + hCPE->hStereoMdct->IGFStereoMode[0] = -1; + hCPE->hStereoMdct->IGFStereoMode[1] = -1; + } + + /*-----------------------------------------------------------------* + * Stereo CNG initialization + *-----------------------------------------------------------------*/ + + if ( hCPE->element_mode == IVAS_CPE_TD || hCPE->element_mode == IVAS_CPE_DFT ) + { + if ( ( hCPE->hStereoCng = (STEREO_CNG_DEC_HANDLE) malloc( sizeof( STEREO_CNG_DEC ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Stereo CNG\n" ) ); + } + stereo_cng_init_dec( hCPE->hStereoCng, &hCPE->hCoreCoder[0]->hFdCngDec->hFdCngCom->frameSize ); + } + + st_ivas->hCPE[cpe_id] = hCPE; + + return error; +} + + +/*------------------------------------------------------------------------- + * destroy_cpe_dec() + * + * Destroy and deallocate IVAS decoder CPE handle + *-------------------------------------------------------------------------*/ + +void destroy_cpe_dec( + CPE_DEC_HANDLE hCPE /* i/o: CPE decoder structure */ +) +{ + int16_t n; + Decoder_State *st; + + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + st = hCPE->hCoreCoder[n]; + + if ( st != NULL ) + { + destroy_core_dec( st ); + + free( st ); + st = NULL; + } + } + + if ( hCPE->hStereoDft != NULL ) + { + stereo_dft_dec_destroy( &( hCPE->hStereoDft ) ); + hCPE->hStereoDft = NULL; + } + + if ( hCPE->hStereoDftDmx != NULL ) + { + free( hCPE->hStereoDftDmx ); + hCPE->hStereoDftDmx = NULL; + } + + if ( hCPE->hStereoTD != NULL ) + { + free( hCPE->hStereoTD ); + hCPE->hStereoTD = NULL; + } + + if ( hCPE->hStereoMdct != NULL ) + { + free( hCPE->hStereoMdct ); + hCPE->hStereoMdct = NULL; + } + + if ( hCPE->hStereoTCA != NULL ) + { + free( hCPE->hStereoTCA ); + hCPE->hStereoTCA = NULL; + } + + if ( hCPE->hStereoICBWE != NULL ) + { + free( hCPE->hStereoICBWE ); + hCPE->hStereoICBWE = NULL; + } + + if ( hCPE->input_mem_LB[0] != NULL ) + { + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + free( hCPE->input_mem_LB[n] ); + hCPE->input_mem_LB[n] = NULL; + free( hCPE->input_mem[n] ); + hCPE->input_mem[n] = NULL; + free( hCPE->output_mem[n] ); + hCPE->output_mem[n] = NULL; + if ( hCPE->prev_synth_chs[n] != NULL ) + { + free( hCPE->prev_synth_chs[n] ); + hCPE->prev_synth_chs[n] = NULL; + } + } + free( hCPE->input_mem_BPF[0] ); + hCPE->input_mem_BPF[0] = NULL; + } + + if ( hCPE->hStereoCng != NULL ) + { + free( hCPE->hStereoCng ); + hCPE->hStereoCng = NULL; + } + + free( hCPE ); + + return; +} + + +/*------------------------------------------------------------------------- + * read_stereo_mode_and_bwidth() + * + * Read stereo technology info & audio bandwidth + *-------------------------------------------------------------------------*/ + +static void read_stereo_mode_and_bwidth( + CPE_DEC_HANDLE hCPE, /* i/o: CPE handle */ + const Decoder_Struct *st_ivas /* i : decoder main structure */ +) +{ + Decoder_State **sts; + + /*-----------------------------------------------------------------* + * BFI or NO_DATA frame: Use stereo parameters from last (active) frame + *-----------------------------------------------------------------*/ + + if ( st_ivas->bfi || st_ivas->hDecoderConfig->ivas_total_brate < IVAS_SID_5k2 ) + { + hCPE->element_mode = hCPE->last_element_mode; + } + + /*-----------------------------------------------------------------* + * SID frame: get element mode from SID side info + *-----------------------------------------------------------------*/ + + else if ( st_ivas->hDecoderConfig->ivas_total_brate == IVAS_SID_5k2 ) + { + switch ( st_ivas->sid_format ) + { + case SID_DFT_STEREO: + hCPE->element_mode = IVAS_CPE_DFT; + /* Read CNG type */ + hCPE->hCoreCoder[0]->cng_type = get_next_indice( hCPE->hCoreCoder[0], 1 ); + + /* Read BW information in SID */ + hCPE->hCoreCoder[0]->bwidth = get_next_indice( hCPE->hCoreCoder[0], 2 ); + break; + case SID_MDCT_STEREO: + /* 2TC SBA DTX also uses MDCT-Stereo DTX */ + case SID_SBA_2TC: + hCPE->element_mode = IVAS_CPE_MDCT; + break; + case SID_SBA_1TC: + assert( !"Forbidden value for SID format in CPE (SBA 1TC), should have already been adressed earlier" ); + break; + case SID_MASA_1TC: + hCPE->element_mode = IVAS_SCE; + break; + case SID_MASA_2TC: + /* 2TC MASA DTX uses MDCT or DFT based core */ + if ( hCPE->element_mode == IVAS_CPE_TD ) + { + hCPE->element_mode = IVAS_CPE_DFT; + } + if ( hCPE->element_mode == IVAS_CPE_DFT ) + { + /* Read CNG type */ + hCPE->hCoreCoder[0]->cng_type = get_next_indice( hCPE->hCoreCoder[0], 1 ); + + /* Read BW information in SID */ + hCPE->hCoreCoder[0]->bwidth = get_next_indice( hCPE->hCoreCoder[0], 2 ); + } + break; + default: + /* this is what has been done for all modes previously, may need adaptation in the future */ + hCPE->element_mode = hCPE->last_element_mode; + break; + } + } + + /*-----------------------------------------------------------------* + * active frame: read element mode and audio bandwidth info + *-----------------------------------------------------------------*/ + + else + { + sts = hCPE->hCoreCoder; + if ( st_ivas->hMCT && hCPE->cpe_id != 0 ) + { + sts[0]->bwidth = st_ivas->hCPE[0]->hCoreCoder[0]->bwidth; + sts[1]->bwidth = st_ivas->hCPE[0]->hCoreCoder[0]->bwidth; + } + else + { + /* read stereo technology info */ + if ( hCPE->element_brate < MIN_BRATE_MDCT_STEREO && st_ivas->hMCT == NULL ) + { + hCPE->element_mode = get_next_indice( sts[0], NBITS_ELEMENT_MODE ) + IVAS_CPE_DFT; + } + else + { + hCPE->element_mode = IVAS_CPE_MDCT; + } + + /* read the bandwidth */ + if ( hCPE->element_brate < MIN_BRATE_FB_STEREO ) + { + /* WB and SWB are supported */ + sts[0]->bwidth = get_next_indice( sts[0], 1 ) + WB; + sts[1]->bwidth = sts[0]->bwidth; + } + else + { + /* WB, SWB and FB are supported */ + sts[0]->bwidth = get_next_indice( sts[0], NBITS_BWIDTH ); + sts[1]->bwidth = sts[0]->bwidth; + } + } + } + + return; +} + + +/*------------------------------------------------------------------------- + * stereo_mode_combined_format_dec() + * + * Set stereo format in a combined format + *-------------------------------------------------------------------------*/ + +static void stereo_mode_combined_format_dec( + const Decoder_Struct *st_ivas, /* i : decoder main structure */ + CPE_DEC_HANDLE hCPE /* i/o: CPE handle */ +) +{ + int32_t element_brate_ref; + + if ( st_ivas->ivas_format == MASA_ISM_FORMAT ) + { + element_brate_ref = hCPE->element_brate; + + if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC && + ( ( st_ivas->nchan_ism == 3 && st_ivas->hDecoderConfig->ivas_total_brate == IVAS_96k ) || + ( st_ivas->nchan_ism == 4 && st_ivas->hDecoderConfig->ivas_total_brate == IVAS_128k ) ) ) + { +#ifdef NONBE_FIX_849_OMASA_BFI_CRASH + if ( !st_ivas->bfi ) + { +#endif + /* read OMASA stereo mode signalling */ + if ( get_next_indice( hCPE->hCoreCoder[0], NBITS_ELEMENT_MODE ) ) + { + hCPE->element_mode = IVAS_CPE_MDCT; + } + else + { + hCPE->element_mode = IVAS_CPE_DFT; + } +#ifdef NONBE_FIX_849_OMASA_BFI_CRASH + } +#endif + + if ( hCPE->element_mode == IVAS_CPE_MDCT ) + { + hCPE->element_brate = IVAS_64k; + hCPE->brate_surplus -= ( hCPE->element_brate - element_brate_ref ); + } + } + } + + return; +} diff --git a/lib_dec/ivas_dec.c b/lib_dec/ivas_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..48d9012b1d834f554f3b638b89e4bdd745154baf --- /dev/null +++ b/lib_dec/ivas_dec.c @@ -0,0 +1,973 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "cnst.h" +#include "ivas_cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_prot_rend.h" +#include "ivas_rom_com.h" +#include "wmc_auto.h" + + +/*--------------------------------------------------------------------------* + * ivas_dec() + * + * Principal IVAS decoder routine + *--------------------------------------------------------------------------*/ + +ivas_error ivas_dec( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + int16_t *data /* o : output synthesis signal */ +) +{ + int16_t n, output_frame, nchan_out; + Decoder_State *st; /* used for bitstream handling */ + float *p_output[MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS]; /* 'float' buffer for output synthesis */ + int16_t nchan_remapped; + int16_t nb_bits_metadata[MAX_SCE + 1]; + int32_t output_Fs, ivas_total_brate; + AUDIO_CONFIG output_config; + ivas_error error; + int16_t num_md_sub_frames; + int32_t ism_total_brate; + + push_wmops( "ivas_dec" ); + + /*----------------------------------------------------------------* + * Initialization of local vars after struct has been set + *----------------------------------------------------------------*/ + + output_Fs = st_ivas->hDecoderConfig->output_Fs; + nchan_out = st_ivas->hDecoderConfig->nchan_out; + output_config = st_ivas->hDecoderConfig->output_config; + ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; + + output_frame = (int16_t) ( output_Fs / FRAMES_PER_SEC ); + + for ( n = 0; n < MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS; n++ ) + { + p_output[n] = st_ivas->p_output_f[n]; + } + + /*----------------------------------------------------------------* + * Combine orientations + *----------------------------------------------------------------*/ + + if ( ( error = combine_external_and_head_orientations_dec( st_ivas->hHeadTrackData, st_ivas->hExtOrientationData, st_ivas->hCombinedOrientationData ) ) != IVAS_ERR_OK ) + { + return error; + } + + + /*----------------------------------------------------------------* + * Decoding + Rendering + *----------------------------------------------------------------*/ + + if ( st_ivas->bfi && st_ivas->ini_frame == 0 ) + { + for ( n = 0; n < nchan_out; n++ ) + { + /* note: these are intra-frame heap memories */ + if ( ( st_ivas->p_output_f[n] = (float *) malloc( ( 48000 / FRAMES_PER_SEC ) * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for floating-point output audio buffer!\n" ) ); + } + p_output[n] = st_ivas->p_output_f[n]; + } + + /* zero output when first frame(s) is lost */ + for ( n = 0; n < nchan_out; n++ ) + { + set_f( p_output[n], 0.0f, output_frame ); + } + + } + else if ( st_ivas->ivas_format == STEREO_FORMAT ) + { + st_ivas->hCPE[0]->element_brate = ivas_total_brate; + + if ( ( error = ivas_cpe_dec( st_ivas, 0, p_output, output_frame, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* HP filtering */ + for ( n = 0; n < min( nchan_out, st_ivas->nchan_transport ); n++ ) + { + hp20( p_output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs ); + } + + /* Rendering */ + if ( st_ivas->renderer_type == RENDERER_MC ) + { + ivas_ls_setup_conversion( st_ivas, st_ivas->nchan_transport, output_frame, p_output, p_output ); + } + } + else if ( st_ivas->ivas_format == ISM_FORMAT ) + { + /* Metadata decoding and configuration */ + if ( ivas_total_brate == IVAS_SID_5k2 || ivas_total_brate == FRAME_NO_DATA ) + { + if ( ( error = ivas_ism_dtx_dec( st_ivas, nb_bits_metadata ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* decode dominant object first so the noise energy of the other objects can be limited */ + if ( ( error = ivas_sce_dec( st_ivas, st_ivas->hISMDTX.sce_id_dtx, &p_output[st_ivas->hISMDTX.sce_id_dtx], output_frame, nb_bits_metadata[st_ivas->hISMDTX.sce_id_dtx] ) ) != IVAS_ERR_OK ) + { + return error; + } + + ivas_ism_dtx_limit_noise_energy_for_near_silence( st_ivas->hSCE, st_ivas->hISMDTX.sce_id_dtx, st_ivas->nchan_transport ); + } + else if ( st_ivas->ism_mode == ISM_MODE_PARAM ) + { + if ( ( error = ivas_ism_metadata_dec( ivas_total_brate, st_ivas->nchan_ism, &( st_ivas->nchan_transport ), st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->bfi, nb_bits_metadata, st_ivas->ism_mode, st_ivas->hISMDTX, st_ivas->hParamIsmDec->hParamIsm, &st_ivas->ism_extmeta_active, &st_ivas->ism_extmeta_cnt, st_ivas->hSCE[0]->hCoreCoder[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else /* ISM_MODE_DISC */ + { + if ( ( error = ivas_ism_metadata_dec( ivas_total_brate, st_ivas->nchan_ism, &( st_ivas->nchan_transport ), st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->bfi, nb_bits_metadata, st_ivas->ism_mode, st_ivas->hISMDTX, NULL, &st_ivas->ism_extmeta_active, &st_ivas->ism_extmeta_cnt, st_ivas->hSCE[0]->hCoreCoder[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + for ( n = 0; n < st_ivas->nchan_transport; n++ ) + { + /* for DTX frames, dominant object has already been decoded before */ + if ( !( ( ivas_total_brate == IVAS_SID_5k2 || ivas_total_brate == FRAME_NO_DATA ) && n == st_ivas->hISMDTX.sce_id_dtx ) ) + { + if ( ( error = ivas_sce_dec( st_ivas, n, &p_output[n], output_frame, nb_bits_metadata[n] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* HP filtering */ + hp20( p_output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs ); + } + + /* Rendering */ + if ( st_ivas->ism_mode == ISM_MODE_PARAM ) + { + if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) + { + /* loudness correction */ + ivas_dirac_dec_binaural_sba_gain( p_output, st_ivas->nchan_transport, output_frame ); + + ivas_param_ism_params_to_masa_param_mapping( st_ivas ); + + ivas_dirac_dec_binaural( st_ivas, st_ivas->hCombinedOrientationData, p_output, st_ivas->nchan_transport, MAX_PARAM_SPATIAL_SUBFRAMES ); + } + else if ( st_ivas->renderer_type == RENDERER_MONO_DOWNMIX ) + { + ivas_mono_downmix_render_passive( st_ivas, p_output, output_frame ); + } + else if ( st_ivas->renderer_type == RENDERER_NON_DIEGETIC_DOWNMIX ) + { + ivas_apply_non_diegetic_panning( p_output, st_ivas->hDecoderConfig->non_diegetic_pan_gain, output_frame ); + } + else if ( st_ivas->renderer_type == RENDERER_PARAM_ISM || st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) + { + ivas_param_ism_dec( st_ivas, p_output ); + + if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) + { + /* Convert CICP19 -> Ambisonics */ + ivas_mc2sba( st_ivas->hIntSetup, p_output, p_output, output_frame, st_ivas->hOutSetup.ambisonics_order, 0.f ); + } + } + } + else /* ISM_MODE_DISC */ + { + /* Loudspeaker or Ambisonics rendering */ + if ( st_ivas->renderer_type == RENDERER_MONO_DOWNMIX ) + { + ivas_mono_downmix_render_passive( st_ivas, p_output, output_frame ); + } + else if ( st_ivas->renderer_type == RENDERER_NON_DIEGETIC_DOWNMIX ) + { + ivas_apply_non_diegetic_panning( p_output, st_ivas->hDecoderConfig->non_diegetic_pan_gain, output_frame ); + } + else if ( st_ivas->renderer_type == RENDERER_TD_PANNING || st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) + { + /* Convert to CICPxx; used also for ISM->CICP19->binaural_room rendering */ + ivas_ism_render( st_ivas, p_output, output_frame ); + } + else if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) + { + /* Convert to Ambisonics; used also for ISM->HOA3->binaural rendering */ + ivas_ism2sba( p_output, st_ivas->hIsmRendererData, st_ivas->hIsmMetaData, st_ivas->nchan_ism, output_frame, st_ivas->hIntSetup.ambisonics_order ); + } + + /* Binaural rendering */ + if ( st_ivas->renderer_type == RENDERER_BINAURAL_OBJECTS_TD ) + { + if ( ( error = ivas_td_binaural_renderer( st_ivas, p_output, output_frame ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) + { + if ( ( error = ivas_rend_crendProcess( st_ivas->hCrendWrapper, IVAS_AUDIO_CONFIG_7_1_4, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR, NULL, NULL, NULL, NULL, p_output, output_Fs, MAX_PARAM_SPATIAL_SUBFRAMES ) ) != IVAS_ERR_OK ) + { + return error; + } + + ivas_binaural_add_LFE( st_ivas, output_frame, p_output, p_output ); + } + } + } + else if ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == MASA_FORMAT ) + { + set_s( nb_bits_metadata, 0, MAX_SCE ); + + /* read parameters from the bitstream */ + if ( st_ivas->ivas_format == MASA_FORMAT && st_ivas->hQMetaData != NULL ) + { + st = ( st_ivas->nSCE > 0 ) ? st_ivas->hSCE[0]->hCoreCoder[0] : st_ivas->hCPE[0]->hCoreCoder[0]; + + if ( ( error = ivas_masa_decode( st_ivas, st, &nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->ivas_format == SBA_FORMAT ) + { + if ( ( error = ivas_spar_dec( st_ivas, nb_bits_metadata ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( st_ivas->nchan_transport == CPE_CHANNELS && st_ivas->nCPE >= 1 ) + { + st_ivas->hCPE[0]->element_brate = ivas_total_brate; + } + + /* core-decoding of transport channels */ + if ( st_ivas->nSCE == 1 ) + { + if ( ( error = ivas_sce_dec( st_ivas, 0, &p_output[0], output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->nCPE == 1 ) + { + if ( ( error = ivas_cpe_dec( st_ivas, 0, p_output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->nCPE > 1 ) + { + if ( ( error = ivas_mct_dec( st_ivas, p_output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* TCs remapping */ + nchan_remapped = st_ivas->nchan_transport; + if ( st_ivas->sba_dirac_stereo_flag ) + { + nchan_remapped = nchan_out; + + if ( st_ivas->ivas_format == SBA_FORMAT ) + { + ivas_agc_dec_process( st_ivas->hSpar->hAgcDec, p_output, p_output, st_ivas->hSpar->hMdDec->spar_md_cfg.nchan_transport, output_frame ); + + if ( st_ivas->hSpar->hPCA != NULL ) + { + ivas_pca_dec( st_ivas->hSpar->hPCA, output_frame, st_ivas->hSpar->hMdDec->spar_md_cfg.nchan_transport, ivas_total_brate, st_ivas->hDecoderConfig->last_ivas_total_brate, st_ivas->bfi, p_output ); + } + + ivas_spar_dec_gen_umx_mat( st_ivas->hSpar->hMdDec, st_ivas->nchan_transport, IVAS_MAX_NUM_BANDS, st_ivas->bfi, ivas_get_spar_dec_md_num_subframes( st_ivas->sba_order, ivas_total_brate, st_ivas->last_active_ivas_total_brate ) ); + } + + ivas_sba_dirac_stereo_dec( st_ivas, p_output, output_frame, st_ivas->ivas_format == MC_FORMAT ); + } + else if ( st_ivas->ivas_format == MASA_FORMAT && ivas_total_brate < MASA_STEREO_MIN_BITRATE && ( ivas_total_brate > IVAS_SID_5k2 || ( ivas_total_brate <= IVAS_SID_5k2 && st_ivas->nCPE > 0 && st_ivas->hCPE[0]->nchan_out == 1 ) ) ) + { + nchan_remapped = 1; /* Only one channel transported */ + } + + /* HP filtering */ + for ( n = 0; n < nchan_remapped; n++ ) + { + hp20( p_output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs ); + } + if ( st_ivas->ivas_format == SBA_FORMAT ) + { + nchan_remapped = ivas_sba_remapTCs( p_output, st_ivas, output_frame ); + + if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) + { + num_md_sub_frames = ivas_get_spar_dec_md_num_subframes( st_ivas->sba_analysis_order, ivas_total_brate, st_ivas->last_active_ivas_total_brate ); + ivas_sba_mix_matrix_determiner( st_ivas->hSpar, p_output, st_ivas->bfi, nchan_remapped, output_frame, num_md_sub_frames ); + } + else if ( st_ivas->renderer_type != RENDERER_DISABLE ) + { + ivas_spar_dec_agc_pca( st_ivas, p_output, output_frame ); + } + } + + if ( st_ivas->ivas_format == MASA_FORMAT ) + { + ivas_masa_prerender( st_ivas, p_output, output_frame, nchan_remapped ); + } + else if ( st_ivas->ivas_format == SBA_FORMAT && ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) + { + /* loudness correction */ + ivas_dirac_dec_binaural_sba_gain( p_output, nchan_remapped, output_frame ); + } + + /* Loudspeakers, Ambisonics or Binaural rendering */ + if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) + { + ivas_dirac_dec_binaural( st_ivas, st_ivas->hCombinedOrientationData, p_output, nchan_remapped, MAX_PARAM_SPATIAL_SUBFRAMES ); + } + else if ( st_ivas->ivas_format == MASA_FORMAT ) + { + if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_DEC ) + { + if ( ( error = ivas_sba_linear_renderer( p_output, output_frame, nchan_remapped, 0, output_config, st_ivas->hOutSetup ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->renderer_type == RENDERER_DIRAC ) + { + ivas_dirac_dec( st_ivas, p_output, nchan_remapped, MAX_PARAM_SPATIAL_SUBFRAMES ); + } + } + else if ( !st_ivas->sba_dirac_stereo_flag && nchan_out != 1 ) + { + if ( ( error = ivas_sba_upmixer_renderer( st_ivas, p_output, output_frame ) ) != IVAS_ERR_OK ) /* Note: ivas_sba_linear_renderer() or ivas_dirac_dec() are called internally */ + { + return error; + } + } + } + else if ( st_ivas->ivas_format == MASA_ISM_FORMAT ) + { + int16_t nchan_ism, nchan_transport_ism; + int16_t dirac_bs_md_write_idx; + + set_s( nb_bits_metadata, 0, MAX_SCE + 1 ); + + /* Set the number of objects for the parametric rendering */ + dirac_bs_md_write_idx = 0; + if ( st_ivas->hSpatParamRendCom != NULL ) + { + st_ivas->hSpatParamRendCom->numIsmDirections = 0; + if ( st_ivas->ism_mode != ISM_MASA_MODE_DISC && st_ivas->ism_mode != ISM_MASA_MODE_MASA_ONE_OBJ ) + { + st_ivas->hSpatParamRendCom->numIsmDirections = st_ivas->nchan_ism; + } + + dirac_bs_md_write_idx = st_ivas->hSpatParamRendCom->dirac_bs_md_write_idx; /* Store the write-index for this frame */ + } + + /* MASA metadata decoding */ + if ( ( error = ivas_masa_decode( st_ivas, st_ivas->hCPE[0]->hCoreCoder[0], &nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Configuration of combined-format bit-budget distribution */ + ivas_set_surplus_brate_dec( st_ivas, &ism_total_brate ); + + st_ivas->hCPE[0]->hCoreCoder[0]->bit_stream = &( st_ivas->bit_stream[( ism_total_brate / FRAMES_PER_SEC )] ); + + /* set ISM parameters and decode ISM metadata in OMASA format */ + if ( ( error = ivas_omasa_ism_metadata_dec( st_ivas, ism_total_brate, &nchan_ism, &nchan_transport_ism, dirac_bs_md_write_idx, &nb_bits_metadata[1] ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* decode ISM channels */ + for ( n = 0; n < nchan_transport_ism; n++ ) + { + if ( ( error = ivas_sce_dec( st_ivas, n, &p_output[st_ivas->nchan_transport + n], output_frame, nb_bits_metadata[1] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* decode MASA channels */ + if ( ( error = ivas_cpe_dec( st_ivas, 0, p_output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( st_ivas->hCPE[0]->nchan_out == 1 ) + { + mvr2r( p_output[0], p_output[1], output_frame ); /* Copy mono signal to stereo output channels */ + } + + /* HP filtering */ + for ( n = 0; n < getNumChanSynthesis( st_ivas ); n++ ) + { + hp20( p_output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs ); + } + + /* Rendering */ + if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) + { + if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC && st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC ) + { + if ( ( error = ivas_omasa_dirac_td_binaural( st_ivas, p_output, output_frame ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + ivas_dirac_dec_binaural( st_ivas, st_ivas->hCombinedOrientationData, p_output, st_ivas->nchan_transport, MAX_PARAM_SPATIAL_SUBFRAMES ); + } + } + else if ( st_ivas->renderer_type == RENDERER_MONO_DOWNMIX ) + { + ivas_mono_downmix_render_passive( st_ivas, p_output, output_frame ); + } + else if ( st_ivas->renderer_type == RENDERER_DIRAC ) + { + ivas_omasa_dirac_rend( st_ivas, p_output, output_frame ); + } + + /* external output */ + if ( output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) + { + /* sanity check in case of bitrate switching */ + if ( st_ivas->ism_mode != ISM_MASA_MODE_DISC ) + { + return IVAS_ERROR( IVAS_ERR_INVALID_OUTPUT_FORMAT, "Incorrect output configuration specified for combined MASA and ISM format" ); + } + + ivas_omasa_rearrange_channels( p_output, nchan_transport_ism, output_frame ); + } + } + else if ( st_ivas->ivas_format == SBA_ISM_FORMAT ) + { + int16_t nchan_ism, sba_ch_idx; + + set_s( nb_bits_metadata, 0, MAX_SCE + 1 ); + nchan_ism = st_ivas->nchan_ism; + if ( st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + { + /* set ISM parameters and decode ISM metadata in OSBA format */ + if ( ( error = ivas_osba_ism_metadata_dec( st_ivas, ivas_total_brate, &nchan_ism, &nb_bits_metadata[1] ) ) != IVAS_ERR_OK ) + { + return error; + } + sba_ch_idx = st_ivas->nchan_ism; + } + else + { + nb_bits_metadata[1] += NO_BITS_MASA_ISM_NO_OBJ; + sba_ch_idx = 0; + } + + /* SBA metadata decoding */ + if ( ( error = ivas_spar_dec( st_ivas, nb_bits_metadata ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( st_ivas->nchan_transport == CPE_CHANNELS && st_ivas->nCPE >= 1 ) + { + st_ivas->hCPE[0]->element_brate = ivas_total_brate; + } + + /* core-decoding of transport channels */ + if ( st_ivas->nSCE == 1 ) + { + if ( ( error = ivas_sce_dec( st_ivas, 0, &p_output[0], output_frame, nb_bits_metadata[0] + nb_bits_metadata[1] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->nCPE == 1 ) + { + if ( ( error = ivas_cpe_dec( st_ivas, 0, p_output, output_frame, nb_bits_metadata[0] + nb_bits_metadata[1] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->nCPE > 1 ) + { + if ( ( error = ivas_mct_dec( st_ivas, p_output, output_frame, nb_bits_metadata[0] + nb_bits_metadata[1] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( st_ivas->sba_dirac_stereo_flag ) + { + ivas_agc_dec_process( st_ivas->hSpar->hAgcDec, &p_output[sba_ch_idx], &p_output[sba_ch_idx], st_ivas->hSpar->hMdDec->spar_md_cfg.nchan_transport, output_frame ); + + if ( st_ivas->hSpar->hPCA != NULL ) + { + ivas_pca_dec( st_ivas->hSpar->hPCA, output_frame, st_ivas->hSpar->hMdDec->spar_md_cfg.nchan_transport, ivas_total_brate, st_ivas->hDecoderConfig->last_ivas_total_brate, st_ivas->bfi, &p_output[sba_ch_idx] ); + } + + ivas_spar_dec_gen_umx_mat( st_ivas->hSpar->hMdDec, st_ivas->nchan_transport, IVAS_MAX_NUM_BANDS, st_ivas->bfi, ivas_get_spar_dec_md_num_subframes( st_ivas->sba_order, ivas_total_brate, st_ivas->last_active_ivas_total_brate ) ); + + ivas_sba_dirac_stereo_dec( st_ivas, &p_output[sba_ch_idx], output_frame, 0 ); + } + + /* HP filtering */ + for ( n = 0; n < getNumChanSynthesis( st_ivas ); n++ ) + { + hp20( p_output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs ); + } + + nchan_remapped = ivas_sba_remapTCs( &p_output[sba_ch_idx], st_ivas, output_frame ); + + if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) + { + num_md_sub_frames = ivas_get_spar_dec_md_num_subframes( st_ivas->sba_analysis_order, ivas_total_brate, st_ivas->last_active_ivas_total_brate ); + ivas_sba_mix_matrix_determiner( st_ivas->hSpar, &p_output[sba_ch_idx], st_ivas->bfi, nchan_remapped, output_frame, num_md_sub_frames ); + } + else if ( st_ivas->renderer_type != RENDERER_DISABLE ) + { + ivas_spar_dec_agc_pca( st_ivas, &p_output[sba_ch_idx], output_frame ); + } + + if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) + { + /* loudness correction */ + ivas_dirac_dec_binaural_sba_gain( &p_output[sba_ch_idx], nchan_remapped, output_frame ); + } + + /* Loudspeakers, Ambisonics or Binaural rendering */ + if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || + st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || + st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) + { + ivas_dirac_dec_binaural( st_ivas, st_ivas->hCombinedOrientationData, &p_output[sba_ch_idx], nchan_remapped, MAX_PARAM_SPATIAL_SUBFRAMES ); + } + else if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV ) + { + if ( st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + { + if ( ( error = ivas_osba_dirac_td_binaural( st_ivas, p_output, output_frame ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + ivas_sba_upmixer_renderer( st_ivas, &p_output[sba_ch_idx], output_frame ); + } + } + else if ( st_ivas->ism_mode == ISM_SBA_MODE_DISC && ( st_ivas->renderer_type == RENDERER_OSBA_STEREO || st_ivas->renderer_type == RENDERER_MONO_DOWNMIX ) ) + { + if ( st_ivas->renderer_type == RENDERER_MONO_DOWNMIX ) + { + ivas_mono_downmix_render_passive( st_ivas, p_output, output_frame ); + } + else /* stereo output */ + { + /* shift SBA channels to avoid overwrite by ISM upmix in 1 object case */ + if ( nchan_ism == 1 ) + { + mvr2r( p_output[2], p_output[3], output_frame ); + mvr2r( p_output[1], p_output[2], output_frame ); + } + + ivas_ism_render( st_ivas, p_output, output_frame ); + } + + for ( n = 0; n < nchan_out; n++ ) + { + v_add( p_output[n], p_output[n + max( nchan_out, nchan_ism )], p_output[n], output_frame ); + } + } + else if ( st_ivas->renderer_type == RENDERER_OSBA_AMBI || st_ivas->renderer_type == RENDERER_OSBA_LS ) + { + if ( ( error = ivas_osba_render( st_ivas, p_output, output_frame ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( output_config != IVAS_AUDIO_CONFIG_EXTERNAL && !st_ivas->sba_dirac_stereo_flag && nchan_out != 1 ) + { + if ( ( error = ivas_sba_upmixer_renderer( st_ivas, p_output, output_frame ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) /*EXT output = individual objects + HOA3*/ + { + if ( st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + { + for ( n = 0; n < nchan_ism; n++ ) + { + delay_signal( p_output[n], output_frame, st_ivas->hSbaIsmData->delayBuffer[n], st_ivas->hSbaIsmData->delayBuffer_size ); + } + } + + if ( ( error = ivas_sba_upmixer_renderer( st_ivas, p_output, output_frame ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( st_ivas->ism_mode == ISM_MODE_NONE ) + { + for ( n = st_ivas->hIntSetup.nchan_out_woLFE - 1; n >= 0; n-- ) + { + mvr2r( p_output[n], p_output[n + nchan_ism], output_frame ); + } + + for ( n = 0; n < nchan_ism; n++ ) + { + set_zero( p_output[n], output_frame ); + } + } + } + } + else if ( st_ivas->ivas_format == MC_FORMAT ) + { + st = ( st_ivas->nSCE > 0 ) ? st_ivas->hSCE[0]->hCoreCoder[0] : st_ivas->hCPE[0]->hCoreCoder[0]; + + if ( st_ivas->mc_mode == MC_MODE_MCT ) + { + /* LFE channel decoder */ + ivas_lfe_dec( st_ivas->hLFE, st, output_frame, st_ivas->bfi, p_output[LFE_CHANNEL] ); + + if ( ( error = ivas_mct_dec( st_ivas, p_output, output_frame, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* HP filtering */ + for ( n = 0; n < st_ivas->nchan_transport; n++ ) + { + if ( n != LFE_CHANNEL ) + { + hp20( p_output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs ); + } + } + + if ( st_ivas->transport_config != st_ivas->intern_config && ( st_ivas->intern_config == IVAS_AUDIO_CONFIG_FOA || st_ivas->intern_config == IVAS_AUDIO_CONFIG_HOA2 || st_ivas->intern_config == IVAS_AUDIO_CONFIG_HOA3 ) ) + { + ivas_mc2sba( st_ivas->hTransSetup, p_output, p_output, output_frame, st_ivas->hIntSetup.ambisonics_order, GAIN_LFE ); + } + + /* Rendering */ + if ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV || st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) + { + if ( ( error = ivas_rend_crendProcess( st_ivas->hCrendWrapper, st_ivas->intern_config, st_ivas->hOutSetup.output_config, st_ivas->hDecoderConfig, + st_ivas->hCombinedOrientationData, &st_ivas->hIntSetup, st_ivas->hEFAPdata, p_output, output_Fs, MAX_PARAM_SPATIAL_SUBFRAMES ) ) != IVAS_ERR_OK ) + { + return error; + } + + ivas_binaural_add_LFE( st_ivas, output_frame, p_output, p_output ); + } + else if ( st_ivas->renderer_type == RENDERER_MC ) + { + ivas_ls_setup_conversion( st_ivas, st_ivas->nchan_transport, output_frame, p_output, p_output ); + } + else if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) + { + ivas_mc2sba( st_ivas->hIntSetup, p_output, p_output, output_frame, st_ivas->hOutSetup.ambisonics_order, 0.f ); + } + else if ( st_ivas->renderer_type == RENDERER_BINAURAL_OBJECTS_TD ) + { + if ( ( ivas_td_binaural_renderer( st_ivas, p_output, output_frame ) ) != IVAS_ERR_OK ) + { + return error; + } + + ivas_binaural_add_LFE( st_ivas, output_frame, p_output, p_output ); + } + } + else if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) + { + ivas_lfe_dec( st_ivas->hLFE, st, output_frame, st_ivas->bfi, p_output[LFE_CHANNEL] ); + + ivas_mc_paramupmix_dec_read_BS( st_ivas, st, st_ivas->hMCParamUpmix, &nb_bits_metadata[0] ); + + if ( ( error = ivas_mct_dec( st_ivas, p_output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* HP filtering */ + for ( n = 0; n < st_ivas->nchan_transport; n++ ) + { + if ( n != LFE_CHANNEL ) + { + hp20( p_output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs ); + } + } + + ivas_mc_paramupmix_dec( st_ivas, p_output ); + + if ( st_ivas->transport_config != st_ivas->intern_config && ( st_ivas->intern_config == IVAS_AUDIO_CONFIG_FOA || st_ivas->intern_config == IVAS_AUDIO_CONFIG_HOA2 || st_ivas->intern_config == IVAS_AUDIO_CONFIG_HOA3 ) ) + { + ivas_mc2sba( st_ivas->hTransSetup, p_output, p_output, output_frame, st_ivas->hIntSetup.ambisonics_order, GAIN_LFE ); + } + + /* Rendering */ + if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) + { + { + ivas_binaural_add_LFE( st_ivas, output_frame, p_output, p_output ); + } + } + else if ( st_ivas->renderer_type == RENDERER_MC ) + { + if ( output_config == IVAS_AUDIO_CONFIG_MONO || output_config == IVAS_AUDIO_CONFIG_STEREO ) + { + ivas_ls_setup_conversion( st_ivas, audioCfg2channels( IVAS_AUDIO_CONFIG_5_1_2 ), output_frame, p_output, p_output ); + } + else + { + ivas_ls_setup_conversion( st_ivas, MC_PARAMUPMIX_MAX_INPUT_CHANS, output_frame, p_output, p_output ); + } + } + else if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) + { + ivas_mc2sba( st_ivas->hIntSetup, p_output, p_output, output_frame, st_ivas->hOutSetup.ambisonics_order, 0.f ); + } + else if ( st_ivas->renderer_type == RENDERER_BINAURAL_OBJECTS_TD ) + { + if ( ( error = ivas_td_binaural_renderer( st_ivas, p_output, output_frame ) ) != IVAS_ERR_OK ) + { + return error; + } + + ivas_binaural_add_LFE( st_ivas, output_frame, p_output, p_output ); + } + } + else if ( st_ivas->mc_mode == MC_MODE_PARAMMC ) + { + /* read Parametric MC parameters from the bitstream */ + ivas_param_mc_dec_read_BS( ivas_total_brate, st, st_ivas->hParamMC, &nb_bits_metadata[0] ); + + if ( st_ivas->nCPE == 1 ) + { + if ( ( error = ivas_cpe_dec( st_ivas, 0, p_output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->nCPE > 1 ) + { + if ( ( error = ivas_mct_dec( st_ivas, p_output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* HP filtering */ + for ( n = 0; n < st_ivas->nchan_transport; n++ ) + { + hp20( p_output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs ); + } + + /* Rendering */ + if ( output_config == IVAS_AUDIO_CONFIG_MONO || output_config == IVAS_AUDIO_CONFIG_STEREO ) + { + ivas_ls_setup_conversion( st_ivas, st_ivas->nchan_transport, output_frame, p_output, p_output ); + } + else + { + ivas_param_mc_dec( st_ivas, p_output ); + } + } + else if ( st_ivas->mc_mode == MC_MODE_MCMASA ) + { + if ( st_ivas->hOutSetup.separateChannelEnabled ) + { + st = st_ivas->hCPE[0]->hCoreCoder[0]; /* Metadata is always with CPE in the case of separated channel */ + } + + /* read McMASA parameters from the bitstream */ + if ( ( error = ivas_masa_decode( st_ivas, st, &nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( st_ivas->hOutSetup.separateChannelEnabled ) + { + /* Decode the transport audio signals */ + if ( ( error = ivas_cpe_dec( st_ivas, 0, p_output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Identify the index of the separated channel */ + n = st_ivas->hOutSetup.separateChannelIndex; + + /* Decode the separated channel to output[n] to be combined with the synthesized channels */ + if ( ( error = ivas_sce_dec( st_ivas, 0, &p_output[n], output_frame, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Delay the separated channel to sync with CLDFB delay of the DirAC synthesis, and synthesize the LFE signal. */ + if ( output_config == IVAS_AUDIO_CONFIG_5_1 || output_config == IVAS_AUDIO_CONFIG_7_1 || + output_config == IVAS_AUDIO_CONFIG_5_1_4 || output_config == IVAS_AUDIO_CONFIG_7_1_4 || + output_config == IVAS_AUDIO_CONFIG_5_1_2 || ( output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM && st_ivas->hOutSetup.num_lfe > 0 ) ) + { + ivas_lfe_synth_with_filters( st_ivas->hMasa->hMasaLfeSynth, p_output, output_frame, n, LFE_CHANNEL ); + } + else if ( output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM && st_ivas->hOutSetup.num_lfe == 0 ) + { + /* Delay the separated channel to sync with the DirAC rendering */ + delay_signal( p_output[n], output_frame, st_ivas->hMasa->hMasaLfeSynth->delayBuffer_syncDirAC, st_ivas->hMasa->hMasaLfeSynth->delayBuffer_syncDirAC_size ); + } + } + else + { + if ( st_ivas->nSCE == 1 ) + { + if ( ( error = ivas_sce_dec( st_ivas, 0, p_output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->nCPE == 1 ) + { + if ( ( error = ivas_cpe_dec( st_ivas, 0, p_output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + + if ( st_ivas->sba_dirac_stereo_flag ) /* use the flag to trigger the DFT upmix */ + { + ivas_sba_dirac_stereo_dec( st_ivas, p_output, output_frame, 1 ); + } + + /* HP filtering */ + for ( n = 0; n < getNumChanSynthesis( st_ivas ); n++ ) + { + hp20( p_output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs ); + } + + /* Rendering */ + if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) + { + ivas_dirac_dec_binaural( st_ivas, st_ivas->hCombinedOrientationData, p_output, st_ivas->nchan_transport, MAX_PARAM_SPATIAL_SUBFRAMES ); + } + else if ( st_ivas->renderer_type == RENDERER_DIRAC || st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) /* rendering to CICPxx and Ambisonics */ + { + ivas_dirac_dec( st_ivas, p_output, st_ivas->nchan_transport, MAX_PARAM_SPATIAL_SUBFRAMES ); + + if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) + { + ivas_mc2sba( st_ivas->hIntSetup, p_output, p_output, output_frame, st_ivas->hOutSetup.ambisonics_order, 0.f ); + } + else if ( st_ivas->intern_config == IVAS_AUDIO_CONFIG_5_1 && ( output_config == IVAS_AUDIO_CONFIG_5_1_2 || output_config == IVAS_AUDIO_CONFIG_5_1_4 || output_config == IVAS_AUDIO_CONFIG_7_1 ) ) + { + for ( n = st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe; n < st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe; n++ ) + { + set_zero( p_output[n], output_frame ); + } + } + } + else if ( st_ivas->renderer_type == RENDERER_MCMASA_MONO_STEREO ) + { + ivas_mono_stereo_downmix_mcmasa( st_ivas, p_output, output_frame ); + } + } + } + + + /*----------------------------------------------------------------* + * Write IVAS output channels + * - compensation for saturation + * - float to integer conversion + *----------------------------------------------------------------*/ + + { +#ifndef DISABLE_LIMITER + ivas_limiter_dec( st_ivas->hLimiter, p_output, nchan_out, output_frame, st_ivas->BER_detect ); +#endif + } + + ivas_syn_output( p_output, output_frame, nchan_out, data ); + + + /*----------------------------------------------------------------* + * Common updates + *----------------------------------------------------------------*/ + + if ( !st_ivas->bfi ) /* do not update if first frame(s) are lost or NO_DATA */ + { + st_ivas->hDecoderConfig->last_ivas_total_brate = ivas_total_brate; + st_ivas->last_active_ivas_total_brate = ( ivas_total_brate <= IVAS_SID_5k2 ) ? st_ivas->last_active_ivas_total_brate : ivas_total_brate; + } + + if ( st_ivas->ini_frame < MAX_FRAME_COUNTER && !( st_ivas->bfi && st_ivas->ini_frame == 0 ) ) /* keep "st_ivas->ini_frame = 0" until first good received frame */ + { + st_ivas->ini_frame++; + } + + if ( st_ivas->ini_active_frame < MAX_FRAME_COUNTER && !( st_ivas->bfi && st_ivas->ini_frame == 0 ) && ivas_total_brate > IVAS_SID_5k2 ) /* needed in MASA decoder in case the first active frame is BFI, and there were SID-frames decoded before */ + { + st_ivas->ini_active_frame++; + } + + st_ivas->last_ivas_format = st_ivas->ivas_format; + + /* in case first frame(s) was/were lost, deallocate output buffers */ + if ( st_ivas->bfi && st_ivas->ini_frame == 0 ) + { + for ( n = 0; n < nchan_out; n++ ) + { + free( st_ivas->p_output_f[n] ); + st_ivas->p_output_f[n] = NULL; + } + } + + + pop_wmops(); + return IVAS_ERR_OK; +} diff --git a/lib_dec/ivas_decision_matrix_dec.c b/lib_dec/ivas_decision_matrix_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..0134e2ef666de734768456f18007c8ba3659d314 --- /dev/null +++ b/lib_dec/ivas_decision_matrix_dec.c @@ -0,0 +1,466 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "stat_dec.h" +#include "rom_com.h" +#include "ivas_prot.h" +#include "prot.h" +#include "ivas_cnst.h" +#include "wmc_auto.h" + +/*-----------------------------------------------------------------* + * ivas_decision_matrix_dec() + * + * ACELP/TCX/HQ core selection + * Read ACELP signaling bits from the bitstream + * Set extension layers + *-----------------------------------------------------------------*/ + +void ivas_decision_matrix_dec( + Decoder_State *st, /* i/o: decoder state structure */ + int16_t *sharpFlag, /* o : formant sharpening flag */ + int16_t *core_switching_flag, /* o : ACELP->HQ switching frame flag */ + const int32_t element_brate, /* i : element bitrate */ + const int16_t nchan_out /* i : Number of output channels */ +) +{ + int16_t tmp; + int32_t icbwe_brate; + + /* init */ + icbwe_brate = 0; + st->core = -1; + st->core_brate = 0; + st->extl = -1; + st->extl_brate = 0; + st->ppp_mode_dec = 0; + st->nelp_mode_dec = 0; + st->igf = 0; + st->vbr_hw_BWE_disable_dec = 0; + + /*-----------------------------------------------------------------* + * Read SID signaling bits from the bitstream + *-----------------------------------------------------------------*/ + + if ( ( st->idchan == 0 && ( st->total_brate == FRAME_NO_DATA || st->total_brate == SID_2k40 ) ) || ( st->element_mode == IVAS_CPE_MDCT && st->total_brate <= SID_2k40 ) ) + { + st->core = ACELP_CORE; + st->core_brate = st->total_brate; + + if ( st->total_brate == SID_2k40 && !( st->idchan == 1 && st->element_mode == IVAS_CPE_MDCT ) ) + { + if ( st->element_mode != IVAS_CPE_DFT ) + { + st->cng_type = get_next_indice( st, 1 ); + + if ( st->cng_type == FD_CNG ) + { + st->bwidth = get_next_indice( st, 2 ); + } + } + if ( get_next_indice( st, 1 ) ) + { + st->L_frame = L_FRAME16k; + } + else + { + st->L_frame = L_FRAME; + } + } + else if ( st->total_brate == SID_2k40 && st->idchan == 1 && st->element_mode == IVAS_CPE_MDCT && st->cng_sba_flag == 0 ) + { + /* read channel coherence */ + st->hFdCngDec->hFdCngCom->coherence = (float) get_next_indice( st, 4 ) / 15.f; + + /* read flag for no side noise shape */ + st->hFdCngDec->hFdCngCom->no_side_flag = get_next_indice( st, 1 ); + } + + if ( ( st->output_Fs >= 32000 && st->bwidth >= SWB ) || ( st->element_mode == IVAS_CPE_DFT && st->bwidth >= SWB && nchan_out == 2 && st->L_frame < L_FRAME16k ) ) + { + st->extl = SWB_CNG; + } + + if ( st->total_brate == FRAME_NO_DATA && st->prev_bfi && !st->bfi && st->L_frame > L_FRAME16k ) + { + st->L_frame = st->last_CNG_L_frame; + } + + return; + } + + /*---------------------------------------------------------------------* + * ACELP/HQ core selection + *---------------------------------------------------------------------*/ + + if ( st->element_mode == IVAS_CPE_TD && st->idchan == 1 ) + { + /* minimal signaling for the secondary channel, most of the parameters are deduced from the primary channel */ + st->core = ACELP_CORE; + } + else if ( st->element_mode == IVAS_SCE && st->low_rate_mode ) + { + /* ISM Low-rate mode -> always WB, ACELP core, IC coder_type */ + st->core = ACELP_CORE; + } + else if ( st->element_mode == IVAS_CPE_MDCT ) + { + st->core = TCX_20_CORE; + } + else + { + st->core = ACELP_CORE; + + if ( st->element_mode == IVAS_CPE_TD || st->total_brate >= STEREO_TCX_MIN_RATE ) + { + /* ACELP/transform core selection bit */ + if ( get_next_indice( st, 1 ) ) + { + st->core = HQ_CORE; + } + else + { + st->core = ACELP_CORE; + } + } + } + + /*-----------------------------------------------------------------* + * Read ACELP signaling bits from the bitstream + *-----------------------------------------------------------------*/ + + if ( st->core == ACELP_CORE ) + { + if ( st->element_mode == IVAS_SCE && st->low_rate_mode ) + { + /* ISM Low-rate mode */ + st->bwidth = WB; + st->coder_type = INACTIVE; + *sharpFlag = 0; + } + else if ( st->idchan == 1 && st->element_mode == IVAS_CPE_TD ) + { + *sharpFlag = 0; + if ( st->coder_type == GENERIC || st->coder_type == VOICED ) + { + *sharpFlag = 1; + } + + st->core_brate = st->total_brate; + st->codec_mode = MODE1; + + if ( st->idchan == 1 && ( st->tdm_LRTD_flag == 0 || st->bits_frame_channel < IVAS_16k4 / FRAMES_PER_SEC ) ) + { + st->bwidth = WB; /* only WB in the secondary channel */ + } + } + else + { + if ( element_brate < FRMT_SHP_MIN_BRATE_IVAS ) + { + st->coder_type = get_next_indice( st, 3 ); + *sharpFlag = 0; + + if ( element_brate < IVAS_24k4 && ( st->coder_type == VOICED || st->coder_type == GENERIC || st->coder_type == TRANSITION ) ) + { + *sharpFlag = 1; + } + } + else + { + /* get coder_type info */ + st->coder_type = get_next_indice( st, 3 ); + + /* get sharpening flag */ + *sharpFlag = get_next_indice( st, 1 ); + } + } + } + + /*-----------------------------------------------------------------* + * Set extension layers + *-----------------------------------------------------------------*/ + + if ( st->core == ACELP_CORE ) + { + if ( st->bwidth == WB && st->low_rate_mode ) + { + st->extl = WB_BWE; + if ( st->total_brate >= MIN_BRATE_WB_BWE ) + { + st->extl_brate = WB_BWE_0k35; + } + } + else if ( st->bwidth == WB && ( st->total_brate < MIN_BRATE_WB_BWE || ( st->idchan == 1 && st->element_mode == IVAS_CPE_TD ) ) ) + { + if ( st->vbr_hw_BWE_disable_dec == 0 ) + { + st->extl = WB_BWE; + } + } + else if ( st->bwidth == WB && st->total_brate >= MIN_BRATE_WB_BWE && !st->flag_ACELP16k ) + { + /* read the WB TBE/BWE selection bit */ + if ( get_next_indice( st, 1 ) ) + { + st->extl = WB_BWE; + st->extl_brate = WB_BWE_0k35; + } + else + { + st->extl = WB_TBE; + if ( st->total_brate < MIN_BRATE_WB_TBE_1k05 || ( st->element_mode == IVAS_CPE_TD && st->total_brate < MIN_TDM_BRATE_WB_TBE_1k05 ) ) + { + st->extl_brate = WB_TBE_0k35; + } + else + { + st->extl_brate = WB_TBE_1k05; + } + } + } + else if ( st->bwidth == SWB || st->bwidth == FB ) + { + if ( st->total_brate >= MIN_BRATE_SWB_BWE || ( st->total_brate >= MIN_MIN_BRATE_LRTD_SWB_BWE && st->element_mode == IVAS_CPE_TD && st->bwidth == SWB && st->tdm_LRTD_flag ) || ( element_brate < IVAS_16k4 && st->total_brate >= MIN_MIN_BRATE_LRTD_SWB_BWE && st->element_mode == IVAS_CPE_TD && st->bwidth == SWB ) ) + { + /* read the SWB TBE/BWE selection bit */ + tmp = get_next_indice( st, 1 ); + + if ( tmp ) + { + st->extl = SWB_BWE; + st->extl_brate = SWB_BWE_1k6; + } + else + { + st->extl = SWB_TBE; + st->extl_brate = SWB_TBE_1k6; + if ( st->total_brate >= MIN_BRATE_SWB_TBE_2k80 && st->flag_ACELP16k && st->element_mode == IVAS_SCE ) + { + st->extl_brate = SWB_TBE_2k8; + } + else if ( st->tdm_LRTD_flag == 1 && st->element_mode == IVAS_CPE_TD ) + { + if ( st->element_brate < IVAS_24k4 ) + { + st->extl_brate = SWB_TBE_1k10; + } + else + { + st->extl_brate = SWB_TBE_1k75; + } + } + else if ( st->total_brate < MIN_BRATE_SWB_TBE_1k60 ) + { + st->extl_brate = SWB_TBE_0k95; + } + } + } + else + { + st->extl = WB_BWE; + st->extl_brate = 0; + } + + /* set FB TBE and FB BWE extension layers */ + if ( st->bwidth == FB ) + { + if ( st->extl == SWB_BWE ) + { + st->extl = FB_BWE; + st->extl_brate = FB_BWE_1k8; + } + else if ( st->extl == SWB_TBE ) + { + st->extl = FB_TBE; + st->extl_brate = FB_TBE_1k8; + if ( st->total_brate >= MIN_BRATE_SWB_TBE_2k80 && st->flag_ACELP16k && st->element_mode == IVAS_SCE ) + { + st->extl_brate = FB_TBE_3k0; + } + } + } + + /* set IC-BWE bitrate */ + if ( st->element_mode == IVAS_CPE_TD && !( st->bwidth >= SWB && st->tdm_LRTD_flag ) ) + { + icbwe_brate = STEREO_BITS_ICBWE * FRAMES_PER_SEC; + if ( st->flag_ACELP16k == 0 ) + { + icbwe_brate = ( STEREO_BITS_ICBWE - STEREO_ICBWE_SPBITS ) * FRAMES_PER_SEC; + } + } + else if ( st->element_mode == IVAS_CPE_DFT ) + { + icbwe_brate = STEREO_BITS_ICBWE_DFT * FRAMES_PER_SEC; + if ( st->flag_ACELP16k == 0 ) + { + icbwe_brate = ( STEREO_BITS_ICBWE_DFT - STEREO_ICBWE_SPBITS ) * FRAMES_PER_SEC; + } + } + + if ( st->element_mode >= IVAS_CPE_DFT && st->core == ACELP_CORE && ( st->extl == SWB_TBE || st->extl == FB_TBE ) && !( st->element_mode == IVAS_CPE_TD && st->tdm_LRTD_flag ) ) + { + icbwe_brate += STEREO_ICBWE_MSFLAG_BITS * FRAMES_PER_SEC; + } + } + } + + /* set core bitrate */ + st->core_brate = st->total_brate - st->extl_brate - icbwe_brate; + + /*-----------------------------------------------------------------* + * Read transform core (TCX vs. HQ) signaling bit from the bitstream + *-----------------------------------------------------------------*/ + + if ( st->element_mode != IVAS_CPE_MDCT && !( st->idchan == 1 && st->element_mode == IVAS_CPE_TD ) && st->core == HQ_CORE ) + { + if ( get_next_indice( st, 1 ) ) + { + st->core = TCX_20_CORE; + } + else + { + st->core = HQ_CORE; + } + } + + if ( st->element_mode != IVAS_CPE_MDCT && st->core == TCX_20_CORE ) + { + st->extl = IGF_BWE; + st->extl_brate = 0; + } + + /*-----------------------------------------------------------------* + * Read ACELP->HQ core switching flag + *-----------------------------------------------------------------*/ + + if ( st->core == HQ_CORE || st->core == TCX_20_CORE ) + { + if ( st->core == HQ_CORE ) + { + /* read ACELP->HQ core switching flag */ + *core_switching_flag = get_next_indice( st, 1 ); + } + else + { + *core_switching_flag = 0; + } + + if ( *core_switching_flag == 1 ) + { + st->last_core_from_bs = ACELP_CORE; + + if ( st->core == st->last_core ) + { + /* A mismatch between the core_switching_flag and the st->core/st->last_core + indicates a frame was lost. If prev_bfi is not set the frame loss + occured during CNG and the prev_bfi needs to be set. */ + st->prev_bfi = 1; + } + } + else + { + st->last_core_from_bs = HQ_CORE; /* Could also be TCX, but it does not make any difference */ + } + + st->last_L_frame_ori = st->last_L_frame; + } + + /*-----------------------------------------------------------------* + * Set ACELP frame length + *-----------------------------------------------------------------*/ + + if ( st->core_brate == FRAME_NO_DATA ) + { + /* prevent "L_frame" changes in CNG segments */ + st->L_frame = st->last_L_frame; + } + else if ( st->core_brate == SID_2k40 && st->bwidth == WB && st->first_CNG && st->hTdCngDec->act_cnt2 < MIN_ACT_CNG_UPD ) + { + /* prevent "L_frame" changes in SID frame after short segment of active frames */ + st->L_frame = st->last_CNG_L_frame; + } + else if ( ( st->core_brate == SID_2k40 && st->total_brate >= ACELP_9k60 && st->bwidth == WB ) || st->flag_ACELP16k ) + { + st->L_frame = L_FRAME16k; + } + else + { + st->L_frame = L_FRAME; + } + + if ( st->L_frame == L_FRAME16k ) + { + st->nb_subfr = NB_SUBFR16k; + } + else + { + st->nb_subfr = NB_SUBFR; + } + + /*-----------------------------------------------------------------* + * set inactive coder_type flag in ACELP core + *-----------------------------------------------------------------*/ + + st->inactive_coder_type_flag = 0; /* AVQ by default */ + if ( st->total_brate <= MAX_GSC_INACTIVE_BRATE ) + { + st->inactive_coder_type_flag = 1; /* GSC */ + } + + /*-----------------------------------------------------------------* + * Reconfigure in case when output_Fs < input_Fs + *-----------------------------------------------------------------*/ + + st->extl_orig = st->extl; + st->extl_brate_orig = st->extl_brate; + + if ( st->output_Fs == 16000 && st->L_frame == L_FRAME16k && st->extl != IGF_BWE ) + { + st->extl = -1; + st->extl_brate = 0; + } + + if ( st->ini_frame == 0 ) + { + /* avoid switching of internal ACELP Fs in the very first frame */ + st->last_L_frame = st->L_frame; + st->last_core = st->core; + st->last_core_brate = st->core_brate; + st->last_extl = st->extl; + } + + return; +} diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..e8c9c80d1679e3d1424658c13d72fb53d6c8d596 --- /dev/null +++ b/lib_dec/ivas_dirac_dec.c @@ -0,0 +1,2487 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_prot_rend.h" +#include "ivas_cnst.h" +#include "ivas_rom_com.h" +#include "ivas_rom_dec.h" +#include "wmc_auto.h" + + +/*-----------------------------------------------------------------------* + * Local function prototypes + *-----------------------------------------------------------------------*/ + +static ivas_error ivas_dirac_dec_config_internal( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const DIRAC_CONFIG_FLAG flag_config_inp /* i/ : Flag determining if we open or reconfigure the DirAC decoder */ +) +{ + DIRAC_DEC_HANDLE hDirAC; + ivas_error error; + DIRAC_CONFIG_FLAG flag_config; + + flag_config = ( flag_config_inp == DIRAC_RECONFIGURE_MODE ) ? DIRAC_RECONFIGURE : flag_config_inp; + error = IVAS_ERR_OK; + + hDirAC = NULL; + + if ( flag_config == DIRAC_RECONFIGURE ) + { + hDirAC = st_ivas->hDirAC; + } + else if ( flag_config == DIRAC_OPEN ) + { + /*-----------------------------------------------------------------* + * prepare library opening + *-----------------------------------------------------------------*/ + + if ( ( hDirAC = (DIRAC_DEC_HANDLE) malloc( sizeof( DIRAC_DEC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + + if ( ( hDirAC->hConfig = (DIRAC_CONFIG_DATA_HANDLE) malloc( sizeof( DIRAC_CONFIG_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC Config\n" ) ); + } + + st_ivas->hDirAC = hDirAC; + } + + /*-----------------------------------------------------------------* + * DirAC main configuration + *-----------------------------------------------------------------*/ + + if ( ( error = ivas_dirac_config( (void *) st_ivas, DEC ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( flag_config == DIRAC_OPEN ) + { + hDirAC->spar_to_dirac_write_idx = ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT ) ? DELAY_DIRAC_PARAM_DEC_SFR : 0; + hDirAC->dithering_seed = DIRAC_DITH_SEED; + st_ivas->hDirAC = hDirAC; + } + + return error; +} + + +static ivas_error ivas_dirac_rend_config( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const DIRAC_CONFIG_FLAG flag_config_inp, /* i/ : Flag determining if we open or reconfigure the DirAC decoder */ + const int16_t dec_param_estim_old ) +{ + DIRAC_DEC_HANDLE hDirAC; + int16_t nchan_out_woLFE; + int16_t nchan_transport; + int16_t nchan_transport_old; + int16_t num_outputs_dir_old; + int16_t num_outputs_diff_old; + int16_t num_protos_diff_old; + float *proto_frame_f_old; + int16_t proto_signal_decorr_on_old; + uint16_t i, j, k; + float ls_azimuth[MAX_OUTPUT_CHANNELS]; + float ls_elevation[MAX_OUTPUT_CHANNELS]; + int32_t output_Fs, ivas_total_brate; + ivas_error error; + int16_t nchan_transport_orig; + int16_t hodirac_flag; + DIRAC_CONFIG_FLAG flag_config; + DIRAC_REND_HANDLE hDirACRend; + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom; + + flag_config = ( flag_config_inp == DIRAC_RECONFIGURE_MODE ) ? DIRAC_RECONFIGURE : flag_config_inp; + error = IVAS_ERR_OK; + + hDirACRend = NULL; + output_Fs = st_ivas->hDecoderConfig->output_Fs; + ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; + hodirac_flag = ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ); + + hDirAC = st_ivas->hDirAC; + hSpatParamRendCom = st_ivas->hSpatParamRendCom; + + if ( flag_config == DIRAC_RECONFIGURE ) + { + hDirACRend = st_ivas->hDirACRend; + } + else if ( flag_config == DIRAC_OPEN ) + { + /*-----------------------------------------------------------------* + * prepare library opening + *-----------------------------------------------------------------*/ + + if ( ( hDirACRend = (DIRAC_REND_HANDLE) malloc( sizeof( DIRAC_REND_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC renderer\n" ) ); + } + + nchan_transport_old = 0; + } + + nchan_transport_old = 0; + num_outputs_dir_old = 0; + num_outputs_diff_old = 0; + num_protos_diff_old = 0; + + nchan_transport_orig = st_ivas->nchan_transport; + if ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT ) + { + st_ivas->nchan_transport = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); + } + + nchan_transport = st_ivas->nchan_transport; + if ( st_ivas->ivas_format == MASA_FORMAT && ivas_total_brate < MASA_STEREO_MIN_BITRATE && ivas_total_brate > IVAS_SID_5k2 ) + { + nchan_transport = 1; + } + if ( flag_config == DIRAC_RECONFIGURE && ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT ) ) + { + int16_t tmp1, tmp2, tmp3; + ivas_sba_config( ivas_total_brate, st_ivas->sba_analysis_order, -1, &nchan_transport_old, st_ivas->sba_planar, &tmp1, &tmp2, &tmp3 ); + } + + /*-----------------------------------------------------------------* + * output setup: for parametric binaural renderer, use output setup, otherwise internal setup + *-----------------------------------------------------------------*/ + + hDirACRend->hOutSetup = st_ivas->hIntSetup; + nchan_out_woLFE = hDirACRend->hOutSetup.nchan_out_woLFE; + + if ( hDirACRend->hOutSetup.ls_azimuth != NULL && hDirACRend->hOutSetup.ls_elevation != NULL ) + { + mvr2r( hDirACRend->hOutSetup.ls_azimuth, ls_azimuth, nchan_out_woLFE ); + mvr2r( hDirACRend->hOutSetup.ls_elevation, ls_elevation, nchan_out_woLFE ); + } + + if ( hDirACRend->hOutSetup.ambisonics_order == -1 ) + { + hDirACRend->hOutSetup.ambisonics_order = SBA_HOA3_ORDER; /* Order 3 is used by default in DirAC for SHD processing */ + if ( hDirACRend->hOutSetup.output_config == IVAS_AUDIO_CONFIG_MONO || hDirACRend->hOutSetup.output_config == IVAS_AUDIO_CONFIG_STEREO ) + { + hDirACRend->hOutSetup.ambisonics_order = SBA_FOA_ORDER; + } + } + else if ( hDirACRend->hOutSetup.ambisonics_order >= SBA_FOA_ORDER ) + { + mvr2r( ls_azimuth_4d4, ls_azimuth, DIRAC_HOA_RENDERING_NUM_VIRT_DECORR_LS ); + mvr2r( ls_elevation_4d4, ls_elevation, DIRAC_HOA_RENDERING_NUM_VIRT_DECORR_LS ); + } + + if ( hDirACRend->hOutSetup.separateChannelEnabled && ( hDirACRend->hOutSetup.output_config == IVAS_AUDIO_CONFIG_5_1 || hDirACRend->hOutSetup.output_config == IVAS_AUDIO_CONFIG_7_1 || hDirACRend->hOutSetup.output_config == IVAS_AUDIO_CONFIG_5_1_2 || hDirACRend->hOutSetup.output_config == IVAS_AUDIO_CONFIG_5_1_4 || hDirACRend->hOutSetup.output_config == IVAS_AUDIO_CONFIG_7_1_4 || ( hDirACRend->hOutSetup.output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM && st_ivas->hLsSetupCustom->separate_ch_found ) ) ) + { + /* Remove the channel of the separated signal from the output setup of the spatial synthesis */ + hDirACRend->hOutSetup.nchan_out_woLFE--; + nchan_out_woLFE = hDirACRend->hOutSetup.nchan_out_woLFE; + mvr2r( &ls_azimuth[hDirACRend->hOutSetup.separateChannelIndex + 1], &ls_azimuth[hDirACRend->hOutSetup.separateChannelIndex], nchan_out_woLFE - hDirACRend->hOutSetup.separateChannelIndex ); + mvr2r( &ls_elevation[hDirACRend->hOutSetup.separateChannelIndex + 1], &ls_elevation[hDirACRend->hOutSetup.separateChannelIndex], nchan_out_woLFE - hDirACRend->hOutSetup.separateChannelIndex ); + } + + /*-----------------------------------------------------------------* + * set input parameters + *-----------------------------------------------------------------*/ + + st_ivas->nchan_transport = nchan_transport_orig; + + if ( nchan_transport_orig > 2 && hDirACRend->hOutSetup.is_loudspeaker_setup && st_ivas->renderer_type == RENDERER_DIRAC && !hodirac_flag ) + { + hDirACRend->synthesisConf = DIRAC_SYNTHESIS_PSD_LS; + hDirACRend->panningConf = DIRAC_PANNING_VBAP; + } + else if ( ( st_ivas->ivas_format == MASA_FORMAT || st_ivas->mc_mode == MC_MODE_MCMASA ) && hDirACRend->hOutSetup.output_config == IVAS_AUDIO_CONFIG_MONO ) + { + hDirACRend->synthesisConf = DIRAC_SYNTHESIS_MONO; + hDirACRend->panningConf = DIRAC_PANNING_HOA3; + nchan_out_woLFE = 1; + } + else if ( ( st_ivas->ivas_format == MASA_FORMAT || st_ivas->ivas_format == MASA_ISM_FORMAT || st_ivas->mc_mode == MC_MODE_MCMASA ) && hDirACRend->hOutSetup.is_loudspeaker_setup ) + { + hDirACRend->synthesisConf = DIRAC_SYNTHESIS_PSD_LS; + hDirACRend->panningConf = DIRAC_PANNING_VBAP; + } + else if ( ( st_ivas->ivas_format == MASA_FORMAT || st_ivas->ivas_format == MASA_ISM_FORMAT ) && !hDirACRend->hOutSetup.is_loudspeaker_setup && st_ivas->nchan_transport > 1 ) + { + hDirACRend->synthesisConf = DIRAC_SYNTHESIS_PSD_SHD; + hDirACRend->panningConf = DIRAC_PANNING_HOA3; + } + else + { + hDirACRend->synthesisConf = DIRAC_SYNTHESIS_GAIN_SHD; + hDirACRend->panningConf = DIRAC_PANNING_HOA3; + } + + if ( flag_config == DIRAC_OPEN ) + { + if ( ( hDirACRend->frequency_axis = (float *) malloc( hSpatParamRendCom->num_freq_bands * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + set_f( hDirACRend->frequency_axis, 0.0f, hSpatParamRendCom->num_freq_bands ); + + ivas_dirac_dec_get_frequency_axis( hDirACRend->frequency_axis, output_Fs, hSpatParamRendCom->num_freq_bands ); + } + + if ( ( st_ivas->ivas_format == MASA_FORMAT || st_ivas->mc_mode == MC_MODE_MCMASA ) && hDirACRend->panningConf == DIRAC_PANNING_HOA3 && nchan_transport == 2 ) + { + if ( ( flag_config == DIRAC_RECONFIGURE && hDirACRend->masa_stereo_type_detect == NULL ) || flag_config == DIRAC_OPEN ) + { + if ( ( hDirACRend->masa_stereo_type_detect = (MASA_STEREO_TYPE_DETECT *) malloc( sizeof( MASA_STEREO_TYPE_DETECT ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + } + ivas_masa_init_stereotype_detection( hDirACRend->masa_stereo_type_detect ); + } + else + { + if ( flag_config == DIRAC_RECONFIGURE && hDirACRend->masa_stereo_type_detect != NULL ) + { + free( hDirACRend->masa_stereo_type_detect ); + } + hDirACRend->masa_stereo_type_detect = NULL; + } + + hSpatParamRendCom->numIsmDirections = 0; /* By default, no ism directions, set correct number runtime when needed */ + + /*-----------------------------------------------------------------* + * (re)configure sub-modules + *-----------------------------------------------------------------*/ + + /* prototype signal computation */ + if ( flag_config == DIRAC_RECONFIGURE ) + { + num_outputs_dir_old = hDirACRend->num_outputs_dir; + num_outputs_diff_old = hDirACRend->num_outputs_diff; + num_protos_diff_old = hDirACRend->num_protos_diff; + } + + /* allocate output setup related arrays */ + if ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_PSD_LS ) + { + /* Directional and diffuses components in output LS format */ + hDirACRend->num_outputs_diff = nchan_out_woLFE; + hDirACRend->num_outputs_dir = nchan_out_woLFE; + } + else if ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) + { + /* Directional and diffuses components in SHD */ + /* Diffuseness components up to 1st order */ + hDirACRend->num_outputs_diff = ( min( hDirACRend->hOutSetup.ambisonics_order, 1 ) + 1 ) * ( min( hDirACRend->hOutSetup.ambisonics_order, 1 ) + 1 ); + hDirACRend->num_outputs_dir = ivas_sba_get_nchan( hDirACRend->hOutSetup.ambisonics_order, 0 ); + } + else if ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_PSD_SHD ) + { + hDirACRend->num_outputs_diff = DIRAC_HOA_RENDERING_NUM_VIRT_DECORR_LS; + hDirACRend->num_outputs_dir = nchan_out_woLFE; + } + else if ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_MONO ) + { + hDirACRend->num_outputs_diff = 1; /* There is one output channel in mono */ + hDirACRend->num_outputs_dir = 2; /* Two channels are pre-rendered for stereo type detection */ + } + else + { + assert( 0 && "DirAC: not existing synthesis methods!" ); + } + + if ( flag_config == DIRAC_OPEN ) + { + num_outputs_dir_old = hDirACRend->num_outputs_dir; + if ( ( hDirACRend->proto_index_dir = (int16_t *) malloc( sizeof( int16_t ) * hDirACRend->num_outputs_dir ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + num_outputs_diff_old = hDirACRend->num_outputs_diff; + if ( ( hDirACRend->proto_index_diff = (int16_t *) malloc( sizeof( int16_t ) * hDirACRend->num_outputs_diff ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + } + + if ( hDirACRend->num_outputs_dir != num_outputs_dir_old && flag_config == DIRAC_RECONFIGURE ) + { + free( hDirACRend->proto_index_dir ); + if ( ( hDirACRend->proto_index_dir = (int16_t *) malloc( sizeof( int16_t ) * hDirACRend->num_outputs_dir ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + } + set_s( hDirACRend->proto_index_dir, 0, hDirACRend->num_outputs_dir ); + + if ( hDirACRend->num_outputs_diff != num_outputs_diff_old && flag_config == DIRAC_RECONFIGURE ) + { + free( hDirACRend->proto_index_diff ); + if ( ( hDirACRend->proto_index_diff = (int16_t *) malloc( sizeof( int16_t ) * hDirACRend->num_outputs_diff ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + } + set_s( hDirACRend->proto_index_diff, 0, hDirACRend->num_outputs_diff ); + + hDirACRend->sba_map_tc = sba_map_tc; + + if ( ( st_ivas->ivas_format == SBA_FORMAT ) || ( st_ivas->ivas_format == SBA_ISM_FORMAT ) ) + { + if ( st_ivas->sba_order > SBA_FOA_ORDER && ivas_total_brate >= IVAS_512k ) + { + hDirACRend->sba_map_tc = sba_map_tc_512; + } + } + + if ( nchan_transport == 1 ) + { + hDirACRend->num_protos_ambi = 1; + hDirACRend->num_protos_dir = 1; + hDirACRend->num_protos_diff = 1; + } + else if ( nchan_transport == 2 ) + { + if ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) + { + hDirACRend->num_protos_ambi = 2; + hDirACRend->num_protos_diff = 1; + hDirACRend->num_protos_dir = 2; + hDirACRend->proto_index_dir[1] = 1; + } + else if ( hDirACRend->hOutSetup.output_config == IVAS_AUDIO_CONFIG_MONO ) + { + /* Following the foa rendering for code compatibility */ + hDirACRend->num_protos_ambi = 2; + hDirACRend->num_protos_dir = 2; + hDirACRend->num_protos_diff = 3; + hDirACRend->proto_index_dir[0] = 0; + hDirACRend->proto_index_diff[0] = 0; + } + else + { + hDirACRend->num_protos_ambi = 2; + hDirACRend->num_protos_diff = 3; + + for ( k = 0; k < hDirACRend->num_outputs_diff; k++ ) + { + if ( ls_azimuth[k] > 0.0f ) + { + hDirACRend->proto_index_diff[k] = 1; + } + else if ( ls_azimuth[k] < 0.0f ) + { + hDirACRend->proto_index_diff[k] = 2; + } + else + { + hDirACRend->proto_index_diff[k] = 0; + } + } + + if ( hDirACRend->hOutSetup.is_loudspeaker_setup ) + { + hDirACRend->num_protos_dir = 3; + mvs2s( hDirACRend->proto_index_diff, hDirACRend->proto_index_dir, nchan_out_woLFE ); + } + else + { + hDirACRend->num_protos_dir = 2; + hDirACRend->proto_index_dir[1] = 1; + } + } + } + else /* nchan_transport > 2 */ + { + hDirACRend->num_protos_ambi = 4; + if ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_PSD_LS ) + { + hDirACRend->num_protos_diff = hDirACRend->num_outputs_diff; + for ( k = 0; k < hDirACRend->num_outputs_diff; k++ ) + { + hDirACRend->proto_index_diff[k] = k; + } + + hDirACRend->num_protos_dir = hDirACRend->num_outputs_dir; + for ( k = 0; k < hDirACRend->num_outputs_dir; k++ ) + { + hDirACRend->proto_index_dir[k] = k; + } + } + else + { + hDirACRend->num_protos_diff = 1; + hDirACRend->num_protos_dir = nchan_transport; + + for ( k = 0; k < min( hDirACRend->num_outputs_dir, hDirACRend->num_protos_dir ); k++ ) + { + if ( hDirACRend->sba_map_tc[k] < hDirACRend->num_outputs_dir ) + { + hDirACRend->proto_index_dir[hDirACRend->sba_map_tc[k]] = k; + } + } + } + } + + /* direct/diffuse responses */ + if ( flag_config == DIRAC_OPEN ) + { + if ( ( hDirACRend->diffuse_response_function = (float *) malloc( sizeof( float ) * hDirACRend->num_outputs_dir ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + } + /* reallocate static memory */ + else if ( flag_config == DIRAC_RECONFIGURE && hDirACRend->num_outputs_dir != num_outputs_dir_old ) + { + free( hDirACRend->diffuse_response_function ); + hDirACRend->diffuse_response_function = NULL; + if ( ( hDirACRend->diffuse_response_function = (float *) malloc( sizeof( float ) * hDirACRend->num_outputs_dir ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + } + + if ( ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_PSD_LS ) || ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_PSD_SHD ) || ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_MONO ) ) + { + initDiffuseResponses( hDirACRend->diffuse_response_function, nchan_out_woLFE, hDirACRend->hOutSetup.output_config, + hDirACRend->hOutSetup, hDirACRend->hOutSetup.ambisonics_order, st_ivas->ivas_format, &hDirACRend->num_ele_spk_no_diffuse_rendering, st_ivas->transport_config ); + } + else + { + initDiffuseResponses( hDirACRend->diffuse_response_function, hDirACRend->num_outputs_dir, IVAS_AUDIO_CONFIG_FOA, + hDirACRend->hOutSetup, hDirACRend->hOutSetup.ambisonics_order, st_ivas->ivas_format, &hDirACRend->num_ele_spk_no_diffuse_rendering, IVAS_AUDIO_CONFIG_INVALID ); + } + + if ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_PSD_SHD ) + { + if ( flag_config == DIRAC_OPEN ) + { + if ( ( hDirACRend->hoa_encoder = (float *) malloc( nchan_out_woLFE * hDirACRend->num_outputs_diff * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + } + else if ( flag_config == DIRAC_RECONFIGURE && hDirACRend->hoa_encoder && ( hDirACRend->num_outputs_diff != num_outputs_diff_old ) ) + { + free( hDirACRend->hoa_encoder ); + hDirACRend->hoa_encoder = NULL; + if ( ( hDirACRend->hoa_encoder = (float *) malloc( nchan_out_woLFE * hDirACRend->num_outputs_diff * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + } + set_f( hDirACRend->hoa_encoder, 0.0f, nchan_out_woLFE * hDirACRend->num_outputs_diff ); + compute_hoa_encoder_mtx( ls_azimuth, ls_elevation, hDirACRend->hoa_encoder, hDirACRend->num_outputs_diff, hDirACRend->hOutSetup.ambisonics_order ); + } + else + { + if ( flag_config == DIRAC_RECONFIGURE && hDirACRend->hoa_encoder ) + { + free( hDirACRend->hoa_encoder ); + } + hDirACRend->hoa_encoder = NULL; + } + + /* VBAP */ + if ( flag_config == DIRAC_OPEN ) + { + st_ivas->hVBAPdata = NULL; + } + + if ( hDirACRend->panningConf == DIRAC_PANNING_VBAP ) + { + if ( flag_config == DIRAC_RECONFIGURE && st_ivas->hVBAPdata != NULL ) + { + vbap_free_data( &( st_ivas->hVBAPdata ) ); + } + + if ( ( error = vbap_init_data( &( st_ivas->hVBAPdata ), ls_azimuth, ls_elevation, nchan_out_woLFE, st_ivas->ivas_format ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_MONO ) + { + if ( flag_config == DIRAC_RECONFIGURE && st_ivas->hVBAPdata != NULL ) + { + vbap_free_data( &( st_ivas->hVBAPdata ) ); + } + hDirACRend->hoa_decoder = NULL; + } + else if ( flag_config == DIRAC_RECONFIGURE && st_ivas->hVBAPdata != NULL ) + { + vbap_free_data( &( st_ivas->hVBAPdata ) ); + } + + /* HOA panning/dec */ + if ( flag_config == DIRAC_OPEN ) + { + hDirACRend->hoa_decoder = NULL; + if ( ( hDirACRend->panningConf == DIRAC_PANNING_HOA3 ) || st_ivas->ivas_format == SBA_FORMAT || ( nchan_transport > 2 ) ) + { + if ( hDirACRend->hOutSetup.is_loudspeaker_setup ) + { + if ( st_ivas->hoa_dec_mtx != NULL ) + { + free( st_ivas->hoa_dec_mtx ); + st_ivas->hoa_dec_mtx = NULL; + } + if ( ( error = ivas_sba_get_hoa_dec_matrix( hDirACRend->hOutSetup, &st_ivas->hoa_dec_mtx, hDirACRend->hOutSetup.ambisonics_order ) ) != IVAS_ERR_OK ) + { + return error; + } + + hDirACRend->hoa_decoder = st_ivas->hoa_dec_mtx; + } + } + } + + /* decorrelation */ + proto_signal_decorr_on_old = ( flag_config == DIRAC_RECONFIGURE ) ? hDirACRend->proto_signal_decorr_on : 0; + hDirACRend->proto_signal_decorr_on = 1; + if ( ( nchan_transport > 2 ) && ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_PSD_LS ) ) + { + /*switch off decorrelation for 4 transport channels*/ + hDirACRend->proto_signal_decorr_on = 0; + } + if ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_MONO ) + { + hDirACRend->proto_signal_decorr_on = 0; + } + + if ( ( flag_config == DIRAC_OPEN && hDirACRend->proto_signal_decorr_on ) || ( flag_config == DIRAC_RECONFIGURE && ( hDirACRend->proto_signal_decorr_on && !proto_signal_decorr_on_old ) ) ) + { + if ( ( error = ivas_dirac_dec_decorr_open( &( hDirACRend->h_freq_domain_decorr_ap_params ), &( hDirACRend->h_freq_domain_decorr_ap_state ), hSpatParamRendCom->num_freq_bands, hDirACRend->num_outputs_diff, + hDirACRend->num_protos_diff, hDirACRend->synthesisConf, hDirACRend->frequency_axis, nchan_transport > 2 ? 4 : nchan_transport, output_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( flag_config == DIRAC_RECONFIGURE && ( !hDirACRend->proto_signal_decorr_on && proto_signal_decorr_on_old ) ) + { + ivas_dirac_dec_decorr_close( &hDirACRend->h_freq_domain_decorr_ap_params, &hDirACRend->h_freq_domain_decorr_ap_state ); + } + else if ( flag_config == DIRAC_RECONFIGURE && hDirACRend->proto_signal_decorr_on && proto_signal_decorr_on_old ) + { + if ( nchan_transport != nchan_transport_old || hDirACRend->num_outputs_diff != num_outputs_diff_old || flag_config_inp == DIRAC_RECONFIGURE_MODE ) + { + /* close and reopen the decorrelator */ + ivas_dirac_dec_decorr_close( &hDirACRend->h_freq_domain_decorr_ap_params, &hDirACRend->h_freq_domain_decorr_ap_state ); + + if ( ( error = ivas_dirac_dec_decorr_open( &( hDirACRend->h_freq_domain_decorr_ap_params ), &( hDirACRend->h_freq_domain_decorr_ap_state ), hSpatParamRendCom->num_freq_bands, hDirACRend->num_outputs_diff, + hDirACRend->num_protos_diff, hDirACRend->synthesisConf, hDirACRend->frequency_axis, nchan_transport > 2 ? 4 : nchan_transport, output_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + + /* output synthesis */ + if ( flag_config == DIRAC_OPEN ) + { + if ( ( ivas_dirac_dec_output_synthesis_open( hSpatParamRendCom, hDirACRend, st_ivas->renderer_type, nchan_transport, output_Fs, hodirac_flag ) ) != IVAS_ERR_OK ) + { + return error; + } + hDirACRend->h_output_synthesis_psd_params.use_onset_filters = hDirACRend->proto_signal_decorr_on; + } + else if ( ( flag_config == DIRAC_RECONFIGURE ) && ( ( nchan_transport != nchan_transport_old ) || ( hDirACRend->num_outputs_diff != num_outputs_diff_old ) ) ) + { + ivas_dirac_dec_output_synthesis_close( hDirACRend ); + + if ( ( ivas_dirac_dec_output_synthesis_open( hSpatParamRendCom, hDirACRend, st_ivas->renderer_type, nchan_transport, output_Fs, hodirac_flag ) ) != IVAS_ERR_OK ) + { + return error; + } + hDirACRend->h_output_synthesis_psd_params.use_onset_filters = hDirACRend->proto_signal_decorr_on; + } + + if ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_PSD_SHD || hDirACRend->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) + { + hDirACRend->h_output_synthesis_psd_params.use_onset_filters = 0; + } + + /*-----------------------------------------------------------------* + * memory allocation + *-----------------------------------------------------------------*/ + + if ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) + { + if ( flag_config == DIRAC_RECONFIGURE && hDirACRend->proto_frame_f ) + { + free( hDirACRend->proto_frame_f ); + } + hDirACRend->proto_frame_f = NULL; + } + else + { + if ( flag_config == DIRAC_OPEN || ( flag_config == DIRAC_RECONFIGURE && hDirACRend->proto_frame_f == NULL ) ) + { + if ( ( hDirACRend->proto_frame_f = (float *) malloc( sizeof( float ) * 2 * hDirACRend->num_protos_diff * hSpatParamRendCom->num_freq_bands ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + } + else if ( flag_config == DIRAC_RECONFIGURE && ( hDirACRend->num_protos_diff != num_protos_diff_old ) ) + { + proto_frame_f_old = hDirACRend->proto_frame_f; + free( proto_frame_f_old ); + if ( ( hDirACRend->proto_frame_f = (float *) malloc( sizeof( float ) * 2 * hDirACRend->num_protos_diff * hSpatParamRendCom->num_freq_bands ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + } + } + + if ( flag_config == DIRAC_OPEN ) + { + hDirACRend->buffer_energy = NULL; + } + + if ( ( flag_config == DIRAC_OPEN && hDirAC->hConfig->dec_param_estim == TRUE ) || ( flag_config == DIRAC_RECONFIGURE && ( hDirAC->hConfig->dec_param_estim == TRUE && dec_param_estim_old == FALSE ) ) ) + { + hDirACRend->index_buffer_intensity = 0; + + for ( i = 0; i < DIRAC_NUM_DIMS; i++ ) + { + for ( j = 0; j < DIRAC_NO_COL_AVG_DIFF; j++ ) + { + if ( ( hDirACRend->buffer_intensity_real[i][j] = (float *) malloc( CLDFB_NO_CHANNELS_MAX * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + set_f( hDirACRend->buffer_intensity_real[i][j], 0.0f, CLDFB_NO_CHANNELS_MAX ); + } + } + if ( hDirACRend->buffer_energy == NULL ) + { + if ( ( hDirACRend->buffer_energy = (float *) malloc( DIRAC_NO_COL_AVG_DIFF * CLDFB_NO_CHANNELS_MAX * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + } + set_f( hDirACRend->buffer_energy, 0.0f, DIRAC_NO_COL_AVG_DIFF * CLDFB_NO_CHANNELS_MAX ); + } + else if ( ( flag_config == DIRAC_OPEN && hDirAC->hConfig->dec_param_estim == FALSE ) || ( flag_config == DIRAC_RECONFIGURE && ( hDirAC->hConfig->dec_param_estim == FALSE && dec_param_estim_old == TRUE ) ) ) + { + for ( i = 0; i < DIRAC_NUM_DIMS; i++ ) + { + for ( j = 0; j < DIRAC_NO_COL_AVG_DIFF; j++ ) + { + if ( flag_config == DIRAC_RECONFIGURE && hDirACRend->buffer_intensity_real[i][j] ) + { + free( hDirACRend->buffer_intensity_real[i][j] ); + } + hDirACRend->buffer_intensity_real[i][j] = NULL; + } + } + if ( hDirACRend->buffer_energy != NULL ) + { + free( hDirACRend->buffer_energy ); + hDirACRend->buffer_energy = NULL; + } + } + + /* output synthesis */ + ivas_dirac_dec_output_synthesis_init( hSpatParamRendCom, hDirACRend, nchan_out_woLFE, hodirac_flag ); + + /* Allocate stack memory */ + if ( flag_config != DIRAC_OPEN ) + { + ivas_dirac_free_mem( &( hDirACRend->stack_mem ) ); + } + if ( ( error = ivas_dirac_alloc_mem( hDirACRend, st_ivas->renderer_type, hSpatParamRendCom->num_freq_bands, &( hDirACRend->stack_mem ), hodirac_flag ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( flag_config == DIRAC_OPEN ) + { + st_ivas->hDirACRend = hDirACRend; + } + + return error; +} + + +/*------------------------------------------------------------------------- + * ivas_dirac_dec_config() + * + * Open or reconfigure decoder DirAC/MASA handle + *-------------------------------------------------------------------------*/ + +ivas_error ivas_dirac_dec_config( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const DIRAC_CONFIG_FLAG flag_config_inp /* i/ : Flag determining if we open or reconfigure the DirAC decoder */ +) +{ + ivas_error error; + int32_t output_Fs; + int16_t hodirac_flag; + int16_t sparfoa_flag; + DIRAC_CONFIG_FLAG dec_config_flag; + DIRAC_CONFIG_FLAG rend_config_flag; + DIRAC_CONFIG_FLAG common_rend_config_flag; + int16_t need_dirac_rend; + int16_t need_parambin; + int16_t dec_param_estim_old; + int16_t dec_param_estim_new; + + error = IVAS_ERR_OK; + + /* Solve and setup flags for inits */ + dec_config_flag = ( flag_config_inp == DIRAC_RECONFIGURE_MODE ) ? DIRAC_RECONFIGURE : flag_config_inp; + + output_Fs = st_ivas->hDecoderConfig->output_Fs; + hodirac_flag = ivas_get_hodirac_flag( st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->sba_analysis_order ); + dec_param_estim_old = ( dec_config_flag == DIRAC_RECONFIGURE ) ? st_ivas->hDirAC->hConfig->dec_param_estim : FALSE; + + sparfoa_flag = 0; + if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_FOA && st_ivas->ivas_format == SBA_FORMAT && !hodirac_flag ) + { + sparfoa_flag = 1; + } + + if ( ( error = ivas_dirac_dec_config_internal( st_ivas, dec_config_flag ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* This is required for parambin */ + if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) + { + st_ivas->hDirAC->hConfig->dec_param_estim = FALSE; + } + + dec_param_estim_new = st_ivas->hDirAC->hConfig->dec_param_estim; + + /* Setup renderers and meta */ + /* First, free everything if in reconfig and not the active renderer */ + need_parambin = 0; + switch ( st_ivas->renderer_type ) + { + case RENDERER_BINAURAL_PARAMETRIC: + case RENDERER_BINAURAL_PARAMETRIC_ROOM: + case RENDERER_STEREO_PARAMETRIC: + need_parambin = 1; + break; + default: + need_parambin = 0; + } + + if ( !need_parambin ) + { + ivas_dirac_dec_close_binaural_data( &st_ivas->hDiracDecBin ); + } + + need_dirac_rend = 0; + switch ( st_ivas->renderer_type ) + { + case RENDERER_DIRAC: + case RENDERER_BINAURAL_FASTCONV: + case RENDERER_BINAURAL_FASTCONV_ROOM: + case RENDERER_SBA_LINEAR_ENC: + case RENDERER_SBA_LINEAR_DEC: + case RENDERER_OSBA_AMBI: + case RENDERER_OSBA_LS: + need_dirac_rend = 1; + break; + default: + need_dirac_rend = 0; + } + + if ( !need_dirac_rend ) + { + ivas_dirac_rend_close( &st_ivas->hDirACRend ); + } + + if ( !sparfoa_flag ) + { + common_rend_config_flag = st_ivas->hSpatParamRendCom == NULL ? DIRAC_OPEN : flag_config_inp; + if ( ( error = ivas_spat_hSpatParamRendCom_config( &st_ivas->hSpatParamRendCom, common_rend_config_flag, dec_param_estim_new, + st_ivas->ivas_format, st_ivas->mc_mode, output_Fs, hodirac_flag ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( need_dirac_rend ) + { + rend_config_flag = st_ivas->hDirACRend == NULL ? DIRAC_OPEN : flag_config_inp; + if ( ( error = ivas_dirac_rend_config( st_ivas, rend_config_flag, dec_param_estim_old ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( need_parambin ) + { + if ( st_ivas->renderer_type != RENDERER_STEREO_PARAMETRIC ) + { + if ( ( error = ivas_dirac_dec_binaural_copy_hrtfs( &st_ivas->hHrtfParambin ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( st_ivas->hDiracDecBin == NULL ) + { + if ( ( error = ivas_dirac_dec_init_binaural_data( st_ivas, st_ivas->hHrtfParambin ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + /* This is required to keep BE in rate switching. This probably means that 1TC and 2TC MASA perform differently. */ + if ( st_ivas->hDiracDecBin->h_freq_domain_decorr_ap_params != NULL && !( st_ivas->ivas_format == MASA_FORMAT && st_ivas->nSCE > 0 ) ) + { + ivas_dirac_dec_decorr_close( &st_ivas->hDiracDecBin->h_freq_domain_decorr_ap_params, &st_ivas->hDiracDecBin->h_freq_domain_decorr_ap_state ); + } + + if ( ( error = ivas_td_decorr_reconfig_dec( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hDecoderConfig->output_Fs, &( st_ivas->hDiracDecBin->hTdDecorr ), &( st_ivas->hDiracDecBin->useTdDecorr ) ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( !st_ivas->hDiracDecBin->useTdDecorr ) + + { + if ( st_ivas->hDiracDecBin->h_freq_domain_decorr_ap_params == NULL ) + { + float frequency_axis[CLDFB_NO_CHANNELS_MAX]; + + ivas_dirac_dec_get_frequency_axis( frequency_axis, st_ivas->hDecoderConfig->output_Fs, st_ivas->hSpatParamRendCom->num_freq_bands ); + + if ( ( error = ivas_dirac_dec_decorr_open( &( st_ivas->hDiracDecBin->h_freq_domain_decorr_ap_params ), &( st_ivas->hDiracDecBin->h_freq_domain_decorr_ap_state ), st_ivas->hSpatParamRendCom->num_freq_bands, BINAURAL_CHANNELS, BINAURAL_CHANNELS, + DIRAC_SYNTHESIS_PSD_LS, frequency_axis, BINAURAL_CHANNELS, st_ivas->hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + + st_ivas->hDiracDecBin->reqularizationFactor = configure_reqularization_factor( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate ); + } + } + } + + /* Allocate transport channel buffers for SBA format when in JBM */ + if ( dec_config_flag == DIRAC_OPEN ) + { + if ( + st_ivas->hDecoderConfig->Opt_5ms && + st_ivas->hTcBuffer == NULL ) + { + if ( st_ivas->ivas_format == SBA_FORMAT ) + { + int16_t nchan_to_allocate; + int16_t nchan_transport; + + nchan_transport = st_ivas->nchan_transport; + + nchan_to_allocate = nchan_transport; + if ( st_ivas->nchan_transport == 1 && ( ( st_ivas->renderer_type == RENDERER_DIRAC && st_ivas->hDirACRend->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) || ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) ) + { + nchan_to_allocate++; /* we need a channel for the CNG in this case*/ + } + if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) + { + nchan_to_allocate = 2 * BINAURAL_CHANNELS; + } + if ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, TC_BUFFER_MODE_RENDERER, nchan_transport, nchan_to_allocate, nchan_to_allocate, st_ivas->hSpatParamRendCom->slot_size ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + } + + return error; +} + + +/*------------------------------------------------------------------------- + * ivas_dirac_dec_close() + * + * Close DirAC memories + *------------------------------------------------------------------------*/ + +void ivas_dirac_dec_close( + DIRAC_DEC_HANDLE *hDirAC_out ) +{ + DIRAC_DEC_HANDLE hDirAC; + + if ( hDirAC_out == NULL || *hDirAC_out == NULL ) + { + return; + } + + hDirAC = *hDirAC_out; + + /* Config & CLDFB */ + if ( hDirAC->hConfig != NULL ) + { + free( hDirAC->hConfig ); + hDirAC->hConfig = NULL; + } + + free( *hDirAC_out ); + *hDirAC_out = NULL; + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_dirac_dec_read_BS() + * + * Read DirAC parameters from the bitstream + *------------------------------------------------------------------------*/ + +void ivas_dirac_dec_read_BS( + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + Decoder_State *st, /* i/o: decoder state structure */ + DIRAC_DEC_HANDLE hDirAC, /* i/o: decoder DirAC handle */ + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, /* i/o: common spatial rendering data handle */ + IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata */ + int16_t *nb_bits, /* o : number of bits read */ + const int16_t last_bit_pos, /* i : last read bitstream position */ + const int16_t hodirac_flag, /* i : flag to indicate HO-DirAC mode */ + int16_t *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ +) +{ + int16_t i, j, b, dir, orig_dirac_bands; + int16_t next_bit_pos_orig; + if ( !st->bfi && ivas_total_brate > IVAS_SID_5k2 ) + { + next_bit_pos_orig = st->next_bit_pos; + st->next_bit_pos = (int16_t) ( ivas_total_brate / FRAMES_PER_SEC - 1 ); + if ( last_bit_pos > 0 ) + { + st->next_bit_pos = last_bit_pos; + } + /* 1 bit flag for signaling metadata to read */ + b = st->bit_stream[( st->next_bit_pos )--]; + ( *nb_bits )++; + + if ( b == 1 ) /* WB 4TCs condition, no other metadata to read*/ + { + orig_dirac_bands = hQMetaData->q_direction[0].cfg.nbands; + + hQMetaData->sba_inactive_mode = 1; + + /* if we start with a SID frame, we need to init the azi/ele arrays.*/ + if ( st->ini_frame == 0 ) + { + for ( b = 0; b < hQMetaData->q_direction[0].cfg.nbands; b++ ) + { + set_zero( hQMetaData->q_direction[0].band_data[b].azimuth, MAX_PARAM_SPATIAL_SUBFRAMES ); + set_zero( hQMetaData->q_direction[0].band_data[b].elevation, MAX_PARAM_SPATIAL_SUBFRAMES ); + } + } + + *nb_bits += ivas_qmetadata_dec_sid_decode( hQMetaData, st->bit_stream, &( st->next_bit_pos ), 0, NULL, SBA_FORMAT ); + for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + { + hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].azimuth[i] = hQMetaData->q_direction[0].band_data[1].azimuth[0]; + hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].elevation[i] = hQMetaData->q_direction[0].band_data[1].elevation[0]; + hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].energy_ratio[i] = hQMetaData->q_direction[0].band_data[1].energy_ratio[0]; + hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].energy_ratio_index[i] = hQMetaData->q_direction[0].band_data[1].energy_ratio_index[0]; + } + for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + { + for ( j = orig_dirac_bands - 2; j >= 0; j-- ) + { + hQMetaData->q_direction[0].band_data[j].azimuth[i] = hQMetaData->q_direction[0].band_data[0].azimuth[0]; + hQMetaData->q_direction[0].band_data[j].elevation[i] = hQMetaData->q_direction[0].band_data[0].elevation[0]; + hQMetaData->q_direction[0].band_data[j].energy_ratio[i] = hQMetaData->q_direction[0].band_data[0].energy_ratio[0]; + hQMetaData->q_direction[0].band_data[j].energy_ratio_index[i] = hQMetaData->q_direction[0].band_data[0].energy_ratio_index[0]; + } + } + + hQMetaData->q_direction->cfg.nbands = orig_dirac_bands; + } + else + { + hQMetaData->sba_inactive_mode = 0; + hQMetaData->is_masa_ivas_format = 0; + if ( hQMetaData->useLowerRes ) + { + hQMetaData->q_direction[0].cfg.nblocks = 1; + } + else + { + hQMetaData->q_direction[0].cfg.nblocks = MAX_PARAM_SPATIAL_SUBFRAMES; + } + + *nb_bits += ivas_qmetadata_dec_decode( hQMetaData, st->bit_stream, &( st->next_bit_pos ), hodirac_flag ); + } + + + st->next_bit_pos = next_bit_pos_orig; + } + else if ( !st->bfi && ivas_total_brate == IVAS_SID_5k2 ) + { + next_bit_pos_orig = st->next_bit_pos; + + /* subtract mode signaling bits, since bitstream was moved after mode reading */ + st->next_bit_pos = (int16_t) ( ivas_total_brate / FRAMES_PER_SEC - 1 - SID_FORMAT_NBITS ); + /* 1 bit flag for signaling metadata to read */ + b = st->bit_stream[( st->next_bit_pos )--]; + ( *nb_bits )++; + hQMetaData->sba_inactive_mode = 1; + orig_dirac_bands = hQMetaData->q_direction[0].cfg.nbands; + + /* if we start with a SID frame, we need to init the azi/ele arrays.*/ + if ( st->ini_frame == 0 ) + { + for ( dir = 0; dir < hQMetaData->no_directions; dir++ ) + { + for ( b = 0; b < hQMetaData->q_direction[dir].cfg.nbands; b++ ) + { + set_zero( hQMetaData->q_direction[dir].band_data[b].azimuth, MAX_PARAM_SPATIAL_SUBFRAMES ); + set_zero( hQMetaData->q_direction[dir].band_data[b].elevation, MAX_PARAM_SPATIAL_SUBFRAMES ); + } + } + } + + *nb_bits += ivas_qmetadata_dec_sid_decode( hQMetaData, st->bit_stream, &( st->next_bit_pos ), 0, NULL, SBA_FORMAT ); + for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + { + hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].azimuth[i] = hQMetaData->q_direction[0].band_data[1].azimuth[0]; + hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].elevation[i] = hQMetaData->q_direction[0].band_data[1].elevation[0]; + hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].energy_ratio[i] = hQMetaData->q_direction[0].band_data[1].energy_ratio[0]; + hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].energy_ratio_index[i] = hQMetaData->q_direction[0].band_data[1].energy_ratio_index[0]; + } + for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + { + for ( j = orig_dirac_bands - 2; j >= 0; j-- ) + { + hQMetaData->q_direction[0].band_data[j].azimuth[i] = hQMetaData->q_direction[0].band_data[0].azimuth[0]; + hQMetaData->q_direction[0].band_data[j].elevation[i] = hQMetaData->q_direction[0].band_data[0].elevation[0]; + hQMetaData->q_direction[0].band_data[j].energy_ratio[i] = hQMetaData->q_direction[0].band_data[0].energy_ratio[0]; + hQMetaData->q_direction[0].band_data[j].energy_ratio_index[i] = hQMetaData->q_direction[0].band_data[0].energy_ratio_index[0]; + } + } + + hQMetaData->q_direction->cfg.nbands = orig_dirac_bands; + + st->next_bit_pos = next_bit_pos_orig; + } + + if ( hDirAC != NULL && hSpatParamRendCom != NULL ) + { + ivas_qmetadata_to_dirac( hQMetaData, hDirAC, NULL, hSpatParamRendCom, ivas_total_brate, SBA_FORMAT, hodirac_flag, dirac_to_spar_md_bands ); + } + + return; +} + + +/*-----------------------------------------------------------------------* + * ivas_qmetadata_to_dirac() + * + * Copy qmetedata to DirAC parameters for rendering + *-----------------------------------------------------------------------*/ + +void ivas_qmetadata_to_dirac( + const IVAS_QMETADATA_HANDLE hQMetaData, /* i : frame of MASA q_metadata */ + DIRAC_DEC_HANDLE hDirAC, /* i : DirAC decoder structure */ + MASA_DECODER_HANDLE hMasa, /* i : MASA decoder structure */ + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, /* i/o: common spatial renderer data handle */ + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const int16_t hodirac_flag, /* i : flag to indicate HO-DirAC mode */ + int16_t *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ +) +{ + int16_t block, band; + int16_t *seed_ptr; + int16_t band_start, band_end, diff_idx; + float diffuseness; + int16_t b, ele, azi; + float azimuth, elevation; + IVAS_QDIRECTION *q_direction; + int16_t *band_mapping; + int16_t *band_grouping; + int16_t start_band; + int16_t nbands = 0; + int16_t nblocks = 0; + int16_t qBand_idx; + int16_t idx_sec = 0; + int16_t no_secs = 1; + + q_direction = &( hQMetaData->q_direction[0] ); + hSpatParamRendCom->numParametricDirections = hQMetaData->no_directions; + hSpatParamRendCom->numSimultaneousDirections = hSpatParamRendCom->numParametricDirections + hSpatParamRendCom->numIsmDirections; + + if ( hMasa != NULL && ivas_total_brate > IVAS_SID_5k2 ) + { + int16_t meta_write_index; + band_mapping = hMasa->data.band_mapping; + + for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; ++block ) + { + meta_write_index = ( hSpatParamRendCom->dirac_bs_md_write_idx + block ) % hSpatParamRendCom->dirac_md_buffer_length; + + for ( band = 0; band < hMasa->config.numCodingBands; ++band ) + { + for ( b = MASA_band_grouping_24[band_mapping[band]]; b < MASA_band_grouping_24[band_mapping[band + 1]]; ++b ) + { + hSpatParamRendCom->azimuth[meta_write_index][b] = (int16_t) q_direction->band_data[band].azimuth[block]; + hSpatParamRendCom->elevation[meta_write_index][b] = (int16_t) q_direction->band_data[band].elevation[block]; + hSpatParamRendCom->energy_ratio1[meta_write_index][b] = q_direction->band_data[band].energy_ratio[block]; + hSpatParamRendCom->diffuseness_vector[meta_write_index][b] = 1.0f - q_direction->band_data[band].energy_ratio[block]; + + if ( q_direction->coherence_band_data != NULL ) + { + hSpatParamRendCom->spreadCoherence[meta_write_index][b] = q_direction->coherence_band_data[band].spread_coherence[block] / 255.0f; + } + else + { + hSpatParamRendCom->spreadCoherence[meta_write_index][b] = 0.0f; + } + + if ( hQMetaData->surcoh_band_data != NULL ) + { + hSpatParamRendCom->surroundingCoherence[meta_write_index][b] = hQMetaData->surcoh_band_data[band].surround_coherence[block] / 255.0f; + } + else + { + hSpatParamRendCom->surroundingCoherence[meta_write_index][b] = 0.0f; + } + } + } + } + + if ( hQMetaData->no_directions == 2 ) + { + q_direction = &( hQMetaData->q_direction[1] ); + for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; ++block ) + { + meta_write_index = ( hSpatParamRendCom->dirac_bs_md_write_idx + block ) % hSpatParamRendCom->dirac_md_buffer_length; + + for ( band = 0; band < hMasa->config.numCodingBands; ++band ) + { + for ( b = MASA_band_grouping_24[band_mapping[band]]; b < MASA_band_grouping_24[band_mapping[band + 1]]; ++b ) + { + hSpatParamRendCom->azimuth2[meta_write_index][b] = (int16_t) q_direction->band_data[band].azimuth[block]; + hSpatParamRendCom->elevation2[meta_write_index][b] = (int16_t) q_direction->band_data[band].elevation[block]; + hSpatParamRendCom->energy_ratio2[meta_write_index][b] = q_direction->band_data[band].energy_ratio[block]; + hSpatParamRendCom->diffuseness_vector[meta_write_index][b] -= q_direction->band_data[band].energy_ratio[block]; + + if ( q_direction->coherence_band_data != NULL ) + { + hSpatParamRendCom->spreadCoherence2[meta_write_index][b] = q_direction->coherence_band_data[band].spread_coherence[block] / 255.0f; + } + else + { + hSpatParamRendCom->spreadCoherence2[meta_write_index][b] = 0.0f; + } + } + } + } + } + else if ( hSpatParamRendCom->azimuth2 != NULL && hSpatParamRendCom->elevation2 != NULL && hSpatParamRendCom->energy_ratio2 != NULL && hSpatParamRendCom->spreadCoherence2 != NULL ) + { + /* zero out old dir2 data */ + for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; ++block ) + { + meta_write_index = ( hSpatParamRendCom->dirac_bs_md_write_idx + block ) % hSpatParamRendCom->dirac_md_buffer_length; + set_s( hSpatParamRendCom->azimuth2[meta_write_index], 0, hSpatParamRendCom->num_freq_bands ); + set_s( hSpatParamRendCom->elevation2[meta_write_index], 0, hSpatParamRendCom->num_freq_bands ); + set_zero( hSpatParamRendCom->energy_ratio2[meta_write_index], hSpatParamRendCom->num_freq_bands ); + set_zero( hSpatParamRendCom->spreadCoherence2[meta_write_index], hSpatParamRendCom->num_freq_bands ); + } + } + } + else /* SBA mode/SID/Zero frame*/ + { + int16_t tmp_write_idx_param_band; + int16_t tmp_write_idx_band; + float diffuseness_sec = 0.f; + + /* ungroup */ + seed_ptr = &hDirAC->dithering_seed; + nblocks = q_direction->cfg.nblocks; + nbands = hDirAC->band_grouping[hDirAC->hConfig->nbands]; + band_grouping = hDirAC->band_grouping; + + if ( ivas_total_brate <= IVAS_SID_5k2 && ivas_format != SBA_FORMAT ) + { + /* SID/zero-frame: 1 direction, 5 bands, nblocks re-generated out of SID decoder*/ + start_band = 0; + hDirAC->hConfig->nbands = 5; + ivas_dirac_config_bands( hDirAC->band_grouping, hDirAC->hConfig->nbands, nbands, NULL, 0, 0, NULL ); + nbands = 5; + } + else + { + start_band = hDirAC->hConfig->enc_param_start_band; + if ( ivas_format == SBA_FORMAT ) + { + hDirAC->hConfig->nbands = IVAS_MAX_NUM_BANDS; + } + else + { + hDirAC->hConfig->nbands = q_direction->cfg.nbands; + } + + ivas_dirac_config_bands( hDirAC->band_grouping, hDirAC->hConfig->nbands, nbands, dirac_to_spar_md_bands, hQMetaData->useLowerBandRes, hDirAC->hConfig->enc_param_start_band, hDirAC->hFbMdft ); + + nbands = hDirAC->hConfig->nbands; + if ( hQMetaData->q_direction[0].cfg.nblocks == 0 ) + { + /* No transmission -> no copy from qmetadata buffers*/ + nbands = start_band; + } + } + + /* Low-Bands with no spatial data transmitted, analysis at decoder side */ + for ( band = 0; band < start_band; band++ ) + { + band_start = band_grouping[band]; + band_end = band_grouping[band + 1]; + tmp_write_idx_param_band = hSpatParamRendCom->dirac_bs_md_write_idx; + + for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ ) + { + for ( b = band_start; b < band_end; b++ ) + { + tmp_write_idx_band = tmp_write_idx_param_band; + hSpatParamRendCom->spreadCoherence[block][b] = 0.0f; + hSpatParamRendCom->surroundingCoherence[block][b] = 0.0f; + + hSpatParamRendCom->elevation[tmp_write_idx_band][b] = 0; + hSpatParamRendCom->azimuth[tmp_write_idx_band][b] = 0; + hSpatParamRendCom->diffuseness_vector[tmp_write_idx_band][b] = 0.f; + + hSpatParamRendCom->spreadCoherence[tmp_write_idx_band][b] = 0.0f; + hSpatParamRendCom->surroundingCoherence[tmp_write_idx_band][b] = 0.0f; + hSpatParamRendCom->energy_ratio1[tmp_write_idx_band][b] = 0; + tmp_write_idx_band = ( tmp_write_idx_band + 1 ) % hSpatParamRendCom->dirac_md_buffer_length; + } + } + } + + /* Bands with spatial data transmitted */ + if ( hodirac_flag ) + { + no_secs = DIRAC_HO_NUMSECTORS; + } + + for ( idx_sec = 0; idx_sec < no_secs; idx_sec++ ) + { + for ( band = start_band; band < nbands; band++ ) + { + band_start = band_grouping[band]; + band_end = band_grouping[band + 1]; + tmp_write_idx_param_band = hSpatParamRendCom->dirac_bs_md_write_idx; + + if ( ivas_format == SBA_FORMAT ) + { + qBand_idx = dirac_to_spar_md_bands[band] - start_band; + } + else + { + qBand_idx = band; + } + diffuseness = 1.0f - q_direction->band_data[qBand_idx].energy_ratio[0]; + diff_idx = q_direction->band_data[qBand_idx].energy_ratio_index[0]; + + for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ ) + { + int16_t block_qmetadata; + + block_qmetadata = min( block, nblocks - 1 ); + block_qmetadata = max( block_qmetadata, 0 ); + + if ( q_direction[idx_sec].band_data[qBand_idx].azimuth[block_qmetadata] < 0.f ) + { + q_direction[idx_sec].band_data[qBand_idx].azimuth[block_qmetadata] += 360.f; + } + + if ( hMasa == NULL && hodirac_flag ) + { + azimuth = q_direction[idx_sec].band_data[qBand_idx].azimuth[block_qmetadata]; + elevation = q_direction[idx_sec].band_data[qBand_idx].elevation[block_qmetadata]; + diffuseness = 1.f - q_direction[0].band_data[qBand_idx].energy_ratio[block_qmetadata]; + diffuseness_sec = q_direction[1].band_data[qBand_idx].energy_ratio[block_qmetadata]; + assert( diffuseness_sec < 1.0001f && diffuseness_sec > -0.0001f ); + } + else + { + azimuth = q_direction->band_data[qBand_idx].azimuth[block_qmetadata]; + elevation = q_direction->band_data[qBand_idx].elevation[block_qmetadata]; + } + + for ( b = band_start; b < band_end; b++ ) + { + tmp_write_idx_band = tmp_write_idx_param_band; + + if ( hodirac_flag ) + { + azi = (int16_t) ( azimuth + 0.5f ); + ele = (int16_t) ( elevation + 0.5f ); + } + else + { + azi = (int16_t) ( azimuth + rand_triangular_signed( seed_ptr ) * dirac_dithering_azi_scale[diff_idx] + 0.5f ); + ele = (int16_t) ( elevation + rand_triangular_signed( seed_ptr ) * dirac_dithering_ele_scale[diff_idx] + 0.5f ); + /* limit the elevation to [-90, 90] */ + ele = min( 90, ele ); + ele = max( -90, ele ); + } + + if ( ivas_total_brate > IVAS_SID_5k2 && q_direction->coherence_band_data != NULL ) + { + hSpatParamRendCom->spreadCoherence[tmp_write_idx_band][b] = q_direction->coherence_band_data[qBand_idx].spread_coherence[block] / 255.0f; + } + else + { + hSpatParamRendCom->spreadCoherence[tmp_write_idx_band][b] = 0.0f; + } + + if ( ivas_total_brate > IVAS_SID_5k2 && q_direction->coherence_band_data != NULL ) + { + hSpatParamRendCom->surroundingCoherence[tmp_write_idx_band][b] = hQMetaData->surcoh_band_data[qBand_idx].surround_coherence[0] / 255.0f; + } + else + { + hSpatParamRendCom->surroundingCoherence[tmp_write_idx_band][b] = 0.0f; + } + + hSpatParamRendCom->energy_ratio1[tmp_write_idx_band][b] = q_direction->band_data[qBand_idx].energy_ratio[0]; + + hSpatParamRendCom->diffuseness_vector[tmp_write_idx_band][b] = diffuseness; + + if ( hodirac_flag ) + { + if ( idx_sec == 0 ) + { + hSpatParamRendCom->elevation[tmp_write_idx_band][b] = ele; + hSpatParamRendCom->azimuth[tmp_write_idx_band][b] = azi; + hSpatParamRendCom->energy_ratio1[tmp_write_idx_band][b] = 0.f; // not in use + } + else + { + assert( idx_sec == 1 ); + hSpatParamRendCom->elevation2[tmp_write_idx_band][b] = ele; + hSpatParamRendCom->azimuth2[tmp_write_idx_band][b] = azi; + hSpatParamRendCom->energy_ratio2[tmp_write_idx_band][b] = 1.f - diffuseness_sec; + } + } + else + { + hSpatParamRendCom->elevation[tmp_write_idx_band][b] = ele; + hSpatParamRendCom->azimuth[tmp_write_idx_band][b] = azi; + } + } + tmp_write_idx_param_band = ( tmp_write_idx_param_band + 1 ) % hSpatParamRendCom->dirac_md_buffer_length; + + } /* for ( block =...) */ + } /* for ( band = ...) */ + } /* for ( idx_sec = ...)*/ + + /* Bands not transmitted -> zeroed*/ + for ( b = band_grouping[band]; b < hSpatParamRendCom->num_freq_bands; b++ ) + { + tmp_write_idx_band = hSpatParamRendCom->dirac_bs_md_write_idx; + + for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ ) + { + + hSpatParamRendCom->spreadCoherence[block][b] = 0.0f; + hSpatParamRendCom->surroundingCoherence[block][b] = 0.0f; + hSpatParamRendCom->energy_ratio1[block][b] = 0; + + hSpatParamRendCom->elevation[tmp_write_idx_band][b] = 0; + hSpatParamRendCom->azimuth[tmp_write_idx_band][b] = 0; + hSpatParamRendCom->diffuseness_vector[tmp_write_idx_band][b] = 0.f; + hSpatParamRendCom->spreadCoherence[tmp_write_idx_band][b] = 0.0f; + hSpatParamRendCom->surroundingCoherence[tmp_write_idx_band][b] = 0.0f; + hSpatParamRendCom->energy_ratio1[tmp_write_idx_band][b] = 0; + tmp_write_idx_band = ( tmp_write_idx_band + 1 ) % hSpatParamRendCom->dirac_md_buffer_length; + } + } + } + + /* update buffer write index */ + hSpatParamRendCom->dirac_bs_md_write_idx = ( hSpatParamRendCom->dirac_bs_md_write_idx + MAX_PARAM_SPATIAL_SUBFRAMES ) % hSpatParamRendCom->dirac_md_buffer_length; + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_dirac_dec_set_md_map() + * + * Set metadata index mapping for DirAC + *------------------------------------------------------------------------*/ + +void ivas_dirac_dec_set_md_map( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const int16_t nCldfbTs /* i : number of CLDFB time slots */ +) +{ + int16_t num_slots_in_subfr; + DIRAC_DEC_HANDLE hDirAC; + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom; + + hDirAC = st_ivas->hDirAC; + hSpatParamRendCom = st_ivas->hSpatParamRendCom; + + /* adapt subframes */ + hSpatParamRendCom->num_slots = nCldfbTs; + hSpatParamRendCom->slots_rendered = 0; + num_slots_in_subfr = CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES; + hSpatParamRendCom->subframes_rendered = 0; + + ivas_jbm_dec_get_adapted_subframes( nCldfbTs, hSpatParamRendCom->subframe_nbslots, &hSpatParamRendCom->nb_subframes ); + + /* copy also to tc buffer */ + /* only for non-combined formats and combinded formats w/o discrete objects */ + if ( ( st_ivas->ivas_format != MASA_ISM_FORMAT || st_ivas->ism_mode != ISM_MASA_MODE_DISC ) && !( st_ivas->ivas_format == SBA_ISM_FORMAT && st_ivas->ism_mode == ISM_SBA_MODE_DISC ) ) + { + st_ivas->hTcBuffer->nb_subframes = hSpatParamRendCom->nb_subframes; + mvs2s( hSpatParamRendCom->subframe_nbslots, st_ivas->hTcBuffer->subframe_nbslots, hSpatParamRendCom->nb_subframes ); + } + + /* set mapping according to dirac_read_idx */ + + set_s( hSpatParamRendCom->render_to_md_map, 0, MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME ); + + if ( st_ivas->ivas_format == MASA_FORMAT ) + { + ivas_jbm_dec_get_md_map_even_spacing( nCldfbTs, num_slots_in_subfr, 0, hSpatParamRendCom->dirac_md_buffer_length, hSpatParamRendCom->render_to_md_map ); + } + else if ( hDirAC == NULL || hDirAC->hConfig == NULL || hDirAC->hConfig->dec_param_estim == 0 ) + { + ivas_jbm_dec_get_md_map( DEFAULT_JBM_CLDFB_TIMESLOTS, nCldfbTs, num_slots_in_subfr, 0, hSpatParamRendCom->dirac_md_buffer_length, hSpatParamRendCom->render_to_md_map ); + } + else + { + ivas_jbm_dec_get_md_map( DEFAULT_JBM_CLDFB_TIMESLOTS, nCldfbTs, num_slots_in_subfr, hSpatParamRendCom->dirac_read_idx, hSpatParamRendCom->dirac_md_buffer_length, hSpatParamRendCom->render_to_md_map ); + } + + if ( hDirAC == NULL || hDirAC->hConfig == NULL || hDirAC->hConfig->dec_param_estim == 0 ) + { + float tmp; + int16_t sf_idx, slot_idx, slot_idx_abs; + + slot_idx_abs = 0; + for ( sf_idx = 0; sf_idx < hSpatParamRendCom->nb_subframes; sf_idx++ ) + { + tmp = 0.0f; + for ( slot_idx = 0; slot_idx < hSpatParamRendCom->subframe_nbslots[sf_idx]; slot_idx++ ) + { + tmp += (float) hSpatParamRendCom->render_to_md_map[slot_idx_abs]; + slot_idx_abs++; + } + hSpatParamRendCom->render_to_md_map[sf_idx] = ( (int16_t) roundf( tmp / (float) hSpatParamRendCom->subframe_nbslots[sf_idx] ) + hSpatParamRendCom->dirac_read_idx ) % hSpatParamRendCom->dirac_md_buffer_length; + } + + set_s( &hSpatParamRendCom->render_to_md_map[hSpatParamRendCom->nb_subframes], 0, MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME - hSpatParamRendCom->nb_subframes ); + } + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_dirac_dec() + * + * DirAC decoding process + *------------------------------------------------------------------------*/ + +void ivas_dirac_dec( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float *output_f[], /* i/o: synthesized core-coder transport channels/DirAC output */ + const int16_t nchan_transport, /* i : number of transport channels */ + const int16_t num_subframes /* i : number of subframes to render */ +) +{ + int16_t subframe_idx; + float *output_f_local[MAX_OUTPUT_CHANNELS]; + float cng_td_buffer[L_FRAME16k]; + int16_t nchan_out, n, n_samples_sf; + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom; + + hSpatParamRendCom = st_ivas->hSpatParamRendCom; + nchan_out = st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe; + + n_samples_sf = JBM_CLDFB_SLOTS_IN_SUBFRAME * hSpatParamRendCom->slot_size; + + for ( n = 0; n < nchan_out; n++ ) + { + output_f_local[n] = output_f[n]; + } + + for ( n = 0; n < nchan_transport; n++ ) + { + st_ivas->hTcBuffer->tc[n] = output_f[n]; + } + + if ( st_ivas->nchan_transport == 1 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag && st_ivas->ivas_format != SBA_FORMAT ) + { + Decoder_State *st = st_ivas->hSCE[0]->hCoreCoder[0]; + st_ivas->hTcBuffer->tc[nchan_transport] = &cng_td_buffer[0]; + generate_masking_noise_lb_dirac( st->hFdCngDec->hFdCngCom, st_ivas->hTcBuffer->tc[1], DEFAULT_JBM_CLDFB_TIMESLOTS, st->cna_dirac_flag && st->flag_cna ); + } + + ivas_dirac_dec_set_md_map( st_ivas, DEFAULT_JBM_CLDFB_TIMESLOTS ); + + for ( subframe_idx = 0; subframe_idx < num_subframes; subframe_idx++ ) + { + ivas_dirac_dec_render_sf( st_ivas, output_f_local, nchan_transport, NULL, NULL ); + for ( n = 0; n < nchan_out; n++ ) + { + output_f_local[n] += n_samples_sf; + } + } + + if ( st_ivas->hDirAC->hConfig->dec_param_estim == 1 ) + { + hSpatParamRendCom->dirac_read_idx = ( hSpatParamRendCom->dirac_read_idx + DEFAULT_JBM_CLDFB_TIMESLOTS ) % hSpatParamRendCom->dirac_md_buffer_length; + } + else + { + hSpatParamRendCom->dirac_read_idx = ( hSpatParamRendCom->dirac_read_idx + DEFAULT_JBM_SUBFRAMES_5MS ) % hSpatParamRendCom->dirac_md_buffer_length; + } + + for ( n = 0; n < nchan_transport; n++ ) + { + st_ivas->hTcBuffer->tc[n] = NULL; + } + + if ( st_ivas->nchan_transport == 1 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag && st_ivas->ivas_format != SBA_FORMAT ) + { + st_ivas->hTcBuffer->tc[nchan_transport] = NULL; + } + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_dirac_dec_render() + * + * DirAC decoding renderer process + *------------------------------------------------------------------------*/ + +void ivas_dirac_dec_render( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const int16_t nchan_transport, /* i : number of transport channels */ + const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */ + uint16_t *nSamplesRendered, /* o : number of CLDFB slots rendered */ + uint16_t *nSamplesAvailableNext, /* o : number of CLDFB slots still to render */ + float *output_f[] /* o : rendered time signal */ +) +{ + int16_t slots_to_render, first_sf, last_sf, subframe_idx; + uint16_t slot_size, n_samples_sf, ch, nchan_intern; + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom; + float *output_f_local[MAX_OUTPUT_CHANNELS]; + + hSpatParamRendCom = st_ivas->hSpatParamRendCom; + + nchan_intern = st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe; + for ( ch = 0; ch < nchan_intern; ch++ ) + { + output_f_local[ch] = output_f[ch]; + } + slot_size = NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ); + + /* loop for synthesis, assume we always have to render in multiples of 5ms subframes with spills */ + slots_to_render = min( hSpatParamRendCom->num_slots - hSpatParamRendCom->slots_rendered, nSamplesAsked / slot_size ); + *nSamplesRendered = slots_to_render * slot_size; + first_sf = hSpatParamRendCom->subframes_rendered; + last_sf = first_sf; + + while ( slots_to_render > 0 ) + { + slots_to_render -= hSpatParamRendCom->subframe_nbslots[last_sf]; + last_sf++; + } + + for ( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ ) + { + ivas_dirac_dec_render_sf( st_ivas, output_f_local, nchan_transport, NULL, NULL ); + n_samples_sf = hSpatParamRendCom->subframe_nbslots[subframe_idx] * hSpatParamRendCom->slot_size; + for ( ch = 0; ch < nchan_intern; ch++ ) + { + output_f_local[ch] += n_samples_sf; + } + } + + if ( hSpatParamRendCom->slots_rendered == hSpatParamRendCom->num_slots ) + { + if ( st_ivas->hDirAC->hConfig->dec_param_estim == 1 ) + { + hSpatParamRendCom->dirac_read_idx = ( hSpatParamRendCom->dirac_read_idx + DEFAULT_JBM_CLDFB_TIMESLOTS ) % hSpatParamRendCom->dirac_md_buffer_length; + } + else + { + hSpatParamRendCom->dirac_read_idx = ( hSpatParamRendCom->dirac_read_idx + DEFAULT_JBM_SUBFRAMES_5MS ) % hSpatParamRendCom->dirac_md_buffer_length; + } + } + + *nSamplesAvailableNext = ( hSpatParamRendCom->num_slots - hSpatParamRendCom->slots_rendered ) * slot_size; + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_dirac_dec() + * + * DirAC decoding process + *------------------------------------------------------------------------*/ + +void ivas_dirac_dec_render_sf( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float *output_f[], /* i/o: synthesized core-coder transport channels/DirAC output */ + const int16_t nchan_transport, /* i : number of transport channels */ + float *pppQMfFrame_ts_re[IVAS_MAX_FB_MIXER_IN_CH][CLDFB_NO_COL_MAX], + float *pppQMfFrame_ts_im[IVAS_MAX_FB_MIXER_IN_CH][CLDFB_NO_COL_MAX] ) +{ + int16_t i, ch, idx_in, idx_lfe; + DIRAC_DEC_HANDLE hDirAC; + DIRAC_REND_HANDLE hDirACRend; + float dirEne; + float surCohEner; + float surCohRatio[CLDFB_NO_CHANNELS_MAX]; + int16_t subframe_idx; + int16_t slot_idx, index_slot; + int16_t hodirac_flag; + float *p_Rmat; + int16_t slot_idx_start, slot_idx_start_cldfb_synth, md_idx; + + /*CLDFB: last output channels reserved to LFT for CICPx*/ + float Cldfb_RealBuffer[MAX_OUTPUT_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; + float Cldfb_ImagBuffer[MAX_OUTPUT_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; + float Cldfb_RealBuffer_Binaural[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; + float Cldfb_ImagBuffer_Binaural[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; + float Cldfb_RealBuffer_Temp[2][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + float Cldfb_ImagBuffer_Temp[2][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + int16_t index, num_freq_bands; + + /* local copies of azi, ele, diffuseness */ + int16_t azimuth[CLDFB_NO_CHANNELS_MAX]; + int16_t elevation[CLDFB_NO_CHANNELS_MAX]; + float diffuseness_vector[CLDFB_NO_CHANNELS_MAX]; + + DIRAC_DEC_STACK_MEM DirAC_mem; + float *reference_power, *reference_power_smooth; + float *onset_filter, *onset_filter_subframe, *p_onset_filter = NULL; + uint16_t coherence_flag; + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom; + + push_wmops( "ivas_dirac_dec_render" ); + + /* Initialize aux buffers */ + hDirAC = st_ivas->hDirAC; + hDirACRend = st_ivas->hDirACRend; + hSpatParamRendCom = st_ivas->hSpatParamRendCom; + + DirAC_mem = hDirACRend->stack_mem; + + reference_power = DirAC_mem.reference_power; + reference_power_smooth = DirAC_mem.reference_power + hSpatParamRendCom->num_freq_bands; + onset_filter = DirAC_mem.onset_filter; + onset_filter_subframe = ( DirAC_mem.onset_filter == NULL ) ? NULL : DirAC_mem.onset_filter + hSpatParamRendCom->num_freq_bands; + + hodirac_flag = ivas_get_hodirac_flag( st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->sba_analysis_order ); + if ( st_ivas->hQMetaData != NULL && st_ivas->ivas_format != SBA_FORMAT && st_ivas->ivas_format != SBA_ISM_FORMAT ) + { + coherence_flag = st_ivas->hQMetaData->coherence_flag; + } + else + { + coherence_flag = 0; + } + + + /* Subframe loop */ + slot_idx_start = hSpatParamRendCom->slots_rendered; + slot_idx_start_cldfb_synth = 0; + + subframe_idx = hSpatParamRendCom->subframes_rendered; + if ( hDirAC->hConfig->dec_param_estim == FALSE ) + { + md_idx = hSpatParamRendCom->render_to_md_map[subframe_idx]; + } + else + { + md_idx = hSpatParamRendCom->render_to_md_map[slot_idx_start]; + } + + /* copy parameters into local buffers*/ + if ( hDirAC->hConfig->dec_param_estim == FALSE ) + { + mvs2s( hSpatParamRendCom->azimuth[hSpatParamRendCom->render_to_md_map[subframe_idx]], azimuth, hSpatParamRendCom->num_freq_bands ); + mvs2s( hSpatParamRendCom->elevation[hSpatParamRendCom->render_to_md_map[subframe_idx]], elevation, hSpatParamRendCom->num_freq_bands ); + mvr2r( hSpatParamRendCom->diffuseness_vector[hSpatParamRendCom->render_to_md_map[subframe_idx]], diffuseness_vector, hSpatParamRendCom->num_freq_bands ); + } + else + { + set_zero( diffuseness_vector, hSpatParamRendCom->num_freq_bands ); + } + + if ( hDirACRend->synthesisConf != DIRAC_SYNTHESIS_GAIN_SHD ) + { + set_zero( reference_power_smooth, hSpatParamRendCom->num_freq_bands ); + } + else + { + set_zero( onset_filter_subframe, hSpatParamRendCom->num_freq_bands ); + } + + if ( st_ivas->hCombinedOrientationData && st_ivas->hCombinedOrientationData->enableCombinedOrientation[subframe_idx] ) + { + p_Rmat = &st_ivas->hCombinedOrientationData->Rmat[subframe_idx][0][0]; + if ( st_ivas->hCombinedOrientationData->shd_rot_max_order == 0 ) + { + num_freq_bands = hDirAC->band_grouping[hDirAC->hConfig->enc_param_start_band]; + if ( hDirAC->hConfig->dec_param_estim == FALSE ) + { + rotateAziEle_DirAC( azimuth, elevation, num_freq_bands, hSpatParamRendCom->num_freq_bands, p_Rmat ); + } + } + } + else + { + p_Rmat = 0; + } + + if ( hDirAC->hConfig->dec_param_estim == FALSE ) + { + /* compute response */ + if ( hDirACRend->synthesisConf != DIRAC_SYNTHESIS_GAIN_SHD ) + { + ivas_dirac_dec_compute_power_factors( hSpatParamRendCom->num_freq_bands, + diffuseness_vector, + hDirACRend->h_output_synthesis_psd_params.max_band_decorr, + hDirACRend->h_output_synthesis_psd_state.direct_power_factor, + hDirACRend->h_output_synthesis_psd_state.diffuse_power_factor ); + + if ( coherence_flag ) + { + for ( i = 0; i < hSpatParamRendCom->num_freq_bands; i++ ) + { + dirEne = hDirACRend->h_output_synthesis_psd_state.direct_power_factor[i]; + surCohEner = hDirACRend->h_output_synthesis_psd_state.diffuse_power_factor[i] * hSpatParamRendCom->surroundingCoherence[md_idx][i]; + hDirACRend->h_output_synthesis_psd_state.diffuse_power_factor[i] -= surCohEner; + hDirACRend->h_output_synthesis_psd_state.direct_power_factor[i] += surCohEner; + + surCohRatio[i] = surCohEner / ( 1e-12f + dirEne + surCohEner ); + } + } + else + { + set_zero( surCohRatio, hSpatParamRendCom->num_freq_bands ); + } + } + else + { + ivas_dirac_dec_compute_gain_factors( hSpatParamRendCom->num_freq_bands, + hSpatParamRendCom->diffuseness_vector[md_idx], + hDirACRend->h_output_synthesis_psd_params.max_band_decorr, + hDirACRend->h_output_synthesis_psd_state.direct_power_factor, + hDirACRend->h_output_synthesis_psd_state.diffuse_power_factor ); + + if ( coherence_flag ) + { + for ( i = 0; i < hSpatParamRendCom->num_freq_bands; i++ ) + { + surCohRatio[i] = hSpatParamRendCom->surroundingCoherence[md_idx][i]; + } + } + else + { + set_zero( surCohRatio, hSpatParamRendCom->num_freq_bands ); + } + } + + if ( st_ivas->hCombinedOrientationData && st_ivas->hCombinedOrientationData->enableCombinedOrientation[subframe_idx] && st_ivas->hCombinedOrientationData->shd_rot_max_order == 1 ) + { + ivas_dirac_dec_compute_directional_responses( hSpatParamRendCom, + hDirACRend, + st_ivas->hVBAPdata, + st_ivas->hMasa, + st_ivas->hMasaIsmData, + azimuth, + elevation, + md_idx, + surCohRatio, + st_ivas->hCombinedOrientationData->shd_rot_max_order, + p_Rmat, + hodirac_flag ); + } + else + { + ivas_dirac_dec_compute_directional_responses( hSpatParamRendCom, + hDirACRend, + st_ivas->hVBAPdata, + st_ivas->hMasa, + st_ivas->hMasaIsmData, + azimuth, + elevation, + md_idx, + surCohRatio, + 0, + NULL, + hodirac_flag ); + } + } + + if ( st_ivas->ivas_format == MASA_ISM_FORMAT && nchan_transport == 2 ) + { + for ( slot_idx = 0; slot_idx < hSpatParamRendCom->subframe_nbslots[subframe_idx]; slot_idx++ ) + { + index_slot = slot_idx_start + slot_idx; + + /* CLDFB Analysis*/ + for ( ch = 0; ch < nchan_transport; ch++ ) + { + cldfbAnalysis_ts( &( st_ivas->hTcBuffer->tc[hDirACRend->sba_map_tc[ch]][hSpatParamRendCom->num_freq_bands * index_slot] ), + Cldfb_RealBuffer_Temp[ch][slot_idx], + Cldfb_ImagBuffer_Temp[ch][slot_idx], + hSpatParamRendCom->num_freq_bands, + st_ivas->cldfbAnaDec[ch] ); + } + } + + if ( st_ivas->ism_mode != ISM_MASA_MODE_DISC && st_ivas->ism_mode != ISM_MASA_MODE_MASA_ONE_OBJ ) + { + ivas_omasa_preProcessStereoTransportsForMovedObjects( st_ivas, Cldfb_RealBuffer_Temp, Cldfb_ImagBuffer_Temp, hSpatParamRendCom->num_freq_bands, subframe_idx ); + } + } + + for ( slot_idx = 0; slot_idx < hSpatParamRendCom->subframe_nbslots[subframe_idx]; slot_idx++ ) + { + index_slot = slot_idx_start + slot_idx; + if ( hDirAC->hConfig->dec_param_estim == TRUE ) + { + md_idx = hSpatParamRendCom->render_to_md_map[index_slot]; + } + else + { + md_idx = hSpatParamRendCom->render_to_md_map[subframe_idx]; + } + if ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT ) + { + for ( ch = 0; ch < nchan_transport; ch++ ) + { + mvr2r( pppQMfFrame_ts_re[ch][slot_idx], Cldfb_RealBuffer[ch][0], hSpatParamRendCom->num_freq_bands ); + mvr2r( pppQMfFrame_ts_im[ch][slot_idx], Cldfb_ImagBuffer[ch][0], hSpatParamRendCom->num_freq_bands ); + } + } + else if ( st_ivas->ivas_format == MASA_ISM_FORMAT && nchan_transport == 2 ) + { + for ( ch = 0; ch < nchan_transport; ch++ ) + { + mvr2r( Cldfb_RealBuffer_Temp[ch][slot_idx], Cldfb_RealBuffer[ch][0], hSpatParamRendCom->num_freq_bands ); + mvr2r( Cldfb_ImagBuffer_Temp[ch][slot_idx], Cldfb_ImagBuffer[ch][0], hSpatParamRendCom->num_freq_bands ); + } + } + else + { + /* CLDFB Analysis*/ + for ( ch = 0; ch < nchan_transport; ch++ ) + { + cldfbAnalysis_ts( &( st_ivas->hTcBuffer->tc[hDirACRend->sba_map_tc[ch]][hSpatParamRendCom->num_freq_bands * index_slot] ), + Cldfb_RealBuffer[ch][0], + Cldfb_ImagBuffer[ch][0], + hSpatParamRendCom->num_freq_bands, + st_ivas->cldfbAnaDec[ch] ); + } + } + + /* CNG in DirAC, extra CLDFB ana for CNA*/ + if ( st_ivas->nchan_transport == 1 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag && !( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT ) ) + { + Decoder_State *st = st_ivas->hSCE[0]->hCoreCoder[0]; + + generate_masking_noise_dirac( st->hFdCngDec->hFdCngCom, + st_ivas->cldfbAnaDec[1], + st_ivas->hTcBuffer->tc[1], + Cldfb_RealBuffer[1][0], + Cldfb_ImagBuffer[1][0], + index_slot, + st->cna_dirac_flag && st->flag_cna, + ( st->core_brate == FRAME_NO_DATA || st->core_brate == SID_2k40 ) && st->cng_type == FD_CNG && st->cng_sba_flag ); + } + + /* LFE synthesis */ + if ( st_ivas->mc_mode == MC_MODE_MCMASA && !hDirACRend->hOutSetup.separateChannelEnabled && !( hDirACRend->hOutSetup.output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM && hDirACRend->hOutSetup.num_lfe == 0 ) ) + { + ivas_lfe_synth_with_cldfb( st_ivas->hMasa->hMasaLfeSynth, + Cldfb_RealBuffer, Cldfb_ImagBuffer, + Cldfb_RealBuffer[MAX_OUTPUT_CHANNELS - 1], Cldfb_ImagBuffer[MAX_OUTPUT_CHANNELS - 1], + slot_idx, + md_idx, + nchan_transport ); + } + + /*-----------------------------------------------------------------* + * protoype signal computation + *-----------------------------------------------------------------*/ + + if ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) + { + if ( st_ivas->hCombinedOrientationData && st_ivas->hCombinedOrientationData->enableCombinedOrientation[subframe_idx] && st_ivas->hCombinedOrientationData->shd_rot_max_order == 0 ) + { + protoSignalComputation_shd( Cldfb_RealBuffer, Cldfb_ImagBuffer, + hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f, + hDirACRend->h_output_synthesis_psd_state.proto_diffuse_buffer_f, + reference_power, slot_idx, nchan_transport, + hDirACRend->num_outputs_diff, + hSpatParamRendCom->num_freq_bands, + p_Rmat ); + } + else + { + protoSignalComputation_shd( Cldfb_RealBuffer, Cldfb_ImagBuffer, + hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f, + hDirACRend->h_output_synthesis_psd_state.proto_diffuse_buffer_f, + reference_power, slot_idx, nchan_transport, + hDirACRend->num_outputs_diff, + hSpatParamRendCom->num_freq_bands, + 0 ); + } + } + else if ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_MONO ) + { + protoSignalComputation2( Cldfb_RealBuffer, Cldfb_ImagBuffer, hDirACRend->proto_frame_f, + hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f, + reference_power, hDirACRend->h_output_synthesis_psd_state.proto_power_smooth, + 0, slot_idx, hSpatParamRendCom->num_freq_bands, hDirACRend->masa_stereo_type_detect ); + } + else + { + switch ( nchan_transport ) + { + case 11: + case 8: + case 6: + case 4: + protoSignalComputation4( Cldfb_RealBuffer, Cldfb_ImagBuffer, + hDirACRend->proto_frame_f, + hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f, + reference_power, + hDirACRend->h_output_synthesis_psd_state.proto_power_smooth, + slot_idx, hDirACRend->num_outputs_diff, + hSpatParamRendCom->num_freq_bands, + hDirACRend->hoa_decoder, + nchan_transport, + hDirACRend->sba_map_tc ); + break; + case 2: + protoSignalComputation2( Cldfb_RealBuffer, Cldfb_ImagBuffer, + hDirACRend->proto_frame_f, + hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f, + reference_power, + hDirACRend->h_output_synthesis_psd_state.proto_power_smooth, + hDirACRend->hOutSetup.is_loudspeaker_setup, + slot_idx, + hSpatParamRendCom->num_freq_bands, + hDirACRend->masa_stereo_type_detect ); + break; + case 1: + protoSignalComputation1( Cldfb_RealBuffer, Cldfb_ImagBuffer, + hDirACRend->proto_frame_f, + hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f, + reference_power, + hDirACRend->h_output_synthesis_psd_state.proto_power_smooth, + slot_idx, + hDirACRend->num_protos_diff, + hSpatParamRendCom->num_freq_bands ); + break; + default: + return; + } + } + + + /*-----------------------------------------------------------------* + * Compute DirAC parameters at decoder side + *-----------------------------------------------------------------*/ + + if ( hDirAC->hConfig->dec_param_estim == TRUE ) + { + mvs2s( &hSpatParamRendCom->azimuth[md_idx][hDirAC->hConfig->enc_param_start_band], &azimuth[hDirAC->hConfig->enc_param_start_band], hSpatParamRendCom->num_freq_bands - hDirAC->hConfig->enc_param_start_band ); + mvs2s( &hSpatParamRendCom->elevation[md_idx][hDirAC->hConfig->enc_param_start_band], &elevation[hDirAC->hConfig->enc_param_start_band], hSpatParamRendCom->num_freq_bands - hDirAC->hConfig->enc_param_start_band ); + if ( ( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation ) && st_ivas->hCombinedOrientationData->shd_rot_max_order == 0 ) + { + num_freq_bands = hDirAC->band_grouping[hDirAC->hConfig->enc_param_start_band]; + rotateAziEle_DirAC( azimuth, elevation, num_freq_bands, hSpatParamRendCom->num_freq_bands, p_Rmat ); + } + + hDirACRend->index_buffer_intensity = ( hDirACRend->index_buffer_intensity % DIRAC_NO_COL_AVG_DIFF ) + 1; /* averaging_length = 32 */ + + index = hDirACRend->index_buffer_intensity; + + num_freq_bands = hDirAC->band_grouping[hDirAC->hConfig->enc_param_start_band]; + + computeIntensityVector_dec( Cldfb_RealBuffer, + Cldfb_ImagBuffer, + num_freq_bands, + hDirACRend->buffer_intensity_real[0][index - 1], + hDirACRend->buffer_intensity_real[1][index - 1], + hDirACRend->buffer_intensity_real[2][index - 1] ); + + computeDirectionAngles( hDirACRend->buffer_intensity_real[0][index - 1], + hDirACRend->buffer_intensity_real[1][index - 1], + hDirACRend->buffer_intensity_real[2][index - 1], + num_freq_bands, + azimuth, + elevation ); + + mvr2r( reference_power, &( hDirACRend->buffer_energy[( index - 1 ) * num_freq_bands] ), num_freq_bands ); + + computeDiffuseness( hDirACRend->buffer_intensity_real, hDirACRend->buffer_energy, num_freq_bands, hSpatParamRendCom->diffuseness_vector[md_idx] ); + } + + + /*-----------------------------------------------------------------* + * frequency domain decorrelation + *-----------------------------------------------------------------*/ + + if ( hDirACRend->proto_signal_decorr_on == 1 ) + { + /* decorrelate prototype frame */ + if ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) + { + ivas_dirac_dec_decorr_process( hSpatParamRendCom->num_freq_bands, + hDirACRend->num_outputs_diff, + hDirACRend->num_protos_diff, + hDirACRend->synthesisConf, + nchan_transport, + hDirACRend->h_output_synthesis_psd_state.proto_diffuse_buffer_f + slot_idx * 2 * hSpatParamRendCom->num_freq_bands * hDirACRend->num_outputs_diff, + hDirACRend->num_protos_diff, + hDirACRend->proto_index_diff, + hDirACRend->h_output_synthesis_psd_state.proto_diffuse_buffer_f + slot_idx * 2 * hSpatParamRendCom->num_freq_bands * hDirACRend->num_outputs_diff + 2 * hSpatParamRendCom->num_freq_bands * min( 4, nchan_transport ), + onset_filter, + hDirACRend->h_freq_domain_decorr_ap_params, + hDirACRend->h_freq_domain_decorr_ap_state ); + + v_multc( onset_filter, 0.25f, onset_filter, hSpatParamRendCom->num_freq_bands ); + v_add( onset_filter, onset_filter_subframe, onset_filter_subframe, hSpatParamRendCom->num_freq_bands ); + p_onset_filter = onset_filter_subframe; + } + else + { + ivas_dirac_dec_decorr_process( hSpatParamRendCom->num_freq_bands, + hDirACRend->num_outputs_diff, + hDirACRend->num_protos_diff, + hDirACRend->synthesisConf, + nchan_transport, + hDirACRend->proto_frame_f, + hDirACRend->num_protos_diff, + hDirACRend->proto_index_diff, + DirAC_mem.frame_dec_f, + onset_filter, + hDirACRend->h_freq_domain_decorr_ap_params, + hDirACRend->h_freq_domain_decorr_ap_state ); + + hDirACRend->proto_frame_dec_f = DirAC_mem.frame_dec_f; + p_onset_filter = onset_filter; + } + } + else + { + if ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) + { + set_f( onset_filter_subframe, 1.f, hSpatParamRendCom->num_freq_bands ); + p_onset_filter = onset_filter_subframe; + } + else + { + /* no frequency domain decorrelation: use prototype frame */ + hDirACRend->proto_frame_dec_f = hDirACRend->proto_frame_f; + p_onset_filter = NULL; + } + } + + /*-----------------------------------------------------------------* + * output synthesis + *-----------------------------------------------------------------*/ + + if ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_PSD_LS || hDirACRend->synthesisConf == DIRAC_SYNTHESIS_PSD_SHD ) + { + /*Compute diffuse prototypes*/ + ivas_dirac_dec_compute_diffuse_proto( hDirACRend, hSpatParamRendCom->num_freq_bands, slot_idx ); + } + + /*Compute PSDs*/ + if ( st_ivas->hCombinedOrientationData && st_ivas->hCombinedOrientationData->enableCombinedOrientation[subframe_idx] && st_ivas->hCombinedOrientationData->shd_rot_max_order > 0 ) + { + ivas_dirac_dec_output_synthesis_process_slot( reference_power, + p_onset_filter, + azimuth, + elevation, + hSpatParamRendCom->diffuseness_vector[md_idx], + hSpatParamRendCom, + hDirACRend, + st_ivas->hCombinedOrientationData->shd_rot_max_order, + p_Rmat, + st_ivas->hVBAPdata, + hDirACRend->hOutSetup, + nchan_transport, + md_idx, + hodirac_flag, + hDirAC->hConfig->dec_param_estim ); + } + else + { + ivas_dirac_dec_output_synthesis_process_slot( reference_power, + p_onset_filter, + azimuth, + elevation, + hSpatParamRendCom->diffuseness_vector[md_idx], + hSpatParamRendCom, + hDirACRend, + 0, + 0, + st_ivas->hVBAPdata, + hDirACRend->hOutSetup, + nchan_transport, + md_idx, + hodirac_flag, + hDirAC->hConfig->dec_param_estim ); + } + + if ( hDirAC->hConfig->dec_param_estim ) + { + float fac = 1.0f / (float) hSpatParamRendCom->subframe_nbslots[subframe_idx]; + v_multc_acc( hSpatParamRendCom->diffuseness_vector[md_idx], fac, diffuseness_vector, hSpatParamRendCom->num_freq_bands ); + } + + if ( hDirACRend->synthesisConf != DIRAC_SYNTHESIS_GAIN_SHD ) + { + v_add( reference_power, reference_power_smooth, reference_power_smooth, hSpatParamRendCom->num_freq_bands ); + } + } + + ivas_dirac_dec_output_synthesis_get_interpolator( &hDirACRend->h_output_synthesis_psd_params, hSpatParamRendCom->subframe_nbslots[subframe_idx] ); + + + if ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) + { + ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( Cldfb_RealBuffer, + Cldfb_ImagBuffer, + hSpatParamRendCom, + hDirACRend, + nchan_transport, + hSpatParamRendCom->subframe_nbslots[subframe_idx], + p_onset_filter, + diffuseness_vector, + hodirac_flag, + hDirAC->hConfig->dec_param_estim ); + } + else + { + /* Determine encoding quality based additional smoothing factor */ + float qualityBasedSmFactor = 1.0f; + + if ( st_ivas->hMasa != NULL ) + { + qualityBasedSmFactor = st_ivas->hMasa->data.dir_decode_quality; + qualityBasedSmFactor *= qualityBasedSmFactor; + } + + ivas_dirac_dec_output_synthesis_process_subframe_psd_ls( Cldfb_RealBuffer, + Cldfb_ImagBuffer, + hSpatParamRendCom, + hDirACRend, + hSpatParamRendCom->subframe_nbslots[subframe_idx], + diffuseness_vector, + reference_power_smooth, + qualityBasedSmFactor, + hDirAC->hConfig->enc_param_start_band ); + } + + /*-----------------------------------------------------------------* + * CLDFB synthesis (and binaural rendering) + *-----------------------------------------------------------------*/ + + index_slot = slot_idx_start_cldfb_synth; + + if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) + { + /* render objects in combined format onto the CICP19 channels for BINAURAL_ROOM_IR */ + if ( st_ivas->ivas_format == SBA_ISM_FORMAT && st_ivas->ism_mode == ISM_SBA_MODE_DISC && st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) + { + int16_t in_ch; + for ( in_ch = 0; in_ch < st_ivas->nchan_ism; in_ch++ ) + { + int16_t j, k, j2, l; + int16_t num_objects, nchan_out_woLFE, lfe_index; + int16_t az1, el1; + int16_t n_slots_to_render; + int16_t n_samples_to_render; + int16_t interp_offset; + float gain, prev_gain; + + num_objects = st_ivas->nchan_ism; + nchan_out_woLFE = st_ivas->hIntSetup.nchan_out_woLFE; + n_slots_to_render = st_ivas->hSpar->subframe_nbslots[st_ivas->hSpar->subframes_rendered]; + n_samples_to_render = hSpatParamRendCom->num_freq_bands * n_slots_to_render; + interp_offset = st_ivas->hTcBuffer->n_samples_rendered; + + if ( st_ivas->hCombinedOrientationData && st_ivas->hCombinedOrientationData->enableCombinedOrientation[0] ) + { + ivas_jbm_dec_get_adapted_linear_interpolator( n_samples_to_render, n_samples_to_render, st_ivas->hIsmRendererData->interpolator ); + interp_offset = 0; + } + + for ( i = 0; i < num_objects; i++ ) + { + /* Combined rotation: rotate the object positions depending the head and external orientations */ + if ( st_ivas->hCombinedOrientationData != NULL && st_ivas->hCombinedOrientationData->enableCombinedOrientation[0] == 1 ) + { + rotateAziEle( st_ivas->hIsmMetaData[i]->azimuth, st_ivas->hIsmMetaData[i]->elevation, &az1, &el1, st_ivas->hCombinedOrientationData->Rmat[0], st_ivas->hIntSetup.is_planar_setup ); + if ( st_ivas->hEFAPdata != NULL ) + { + efap_determine_gains( st_ivas->hEFAPdata, st_ivas->hIsmRendererData->gains[i], az1, el1, EFAP_MODE_EFAP ); + } + } + + lfe_index = 0; + for ( j = 0, j2 = 0; j < nchan_out_woLFE; j++, j2++ ) + { + if ( ( st_ivas->hIntSetup.num_lfe > 0 ) && ( st_ivas->hIntSetup.index_lfe[lfe_index] == j ) ) + { + ( lfe_index < ( st_ivas->hIntSetup.num_lfe - 1 ) ) ? ( lfe_index++, j2++ ) : j2++; + } + + gain = st_ivas->hIsmRendererData->gains[i][j]; + prev_gain = st_ivas->hIsmRendererData->prev_gains[i][j]; + if ( fabsf( gain ) > 0.0f || fabsf( prev_gain ) > 0.0f ) + { + float *tc_re, *tc_im; + float *w1, w2; + + w1 = &st_ivas->hIsmRendererData->interpolator[interp_offset]; + tc_re = pppQMfFrame_ts_re[nchan_transport + i][0]; + tc_im = pppQMfFrame_ts_im[nchan_transport + i][0]; + + for ( k = 0; k < n_slots_to_render; k++ ) + { + float g; + + w2 = 1.0f - *w1; + g = ( *w1 * gain + w2 * prev_gain ); + + for ( l = 0; l < hSpatParamRendCom->num_freq_bands; l++ ) + { + Cldfb_RealBuffer[j2][0][k * hSpatParamRendCom->num_freq_bands + l] += g * *( tc_re++ ); + Cldfb_ImagBuffer[j2][0][k * hSpatParamRendCom->num_freq_bands + l] += g * *( tc_im++ ); + } + w1 += hSpatParamRendCom->num_freq_bands; + } + } + + /* update here only in case of head rotation */ + if ( st_ivas->hCombinedOrientationData != NULL && st_ivas->hCombinedOrientationData->enableCombinedOrientation[0] == 1 ) + { + st_ivas->hIsmRendererData->prev_gains[i][j] = gain; + } + } + } + } + } + + + /* Perform binaural rendering */ + ivas_binRenderer( st_ivas->hBinRenderer, st_ivas->hCombinedOrientationData, subframe_idx, hSpatParamRendCom->subframe_nbslots[subframe_idx], Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, Cldfb_ImagBuffer ); + + + /* Inverse CLDFB*/ + for ( ch = 0; ch < st_ivas->hDecoderConfig->nchan_out; ch++ ) + { + /* open CLDFB buffer up to CLDFB_NO_CHANNELS_MAX bands for 48kHz */ + float *RealBuffer[MAX_PARAM_SPATIAL_SUBFRAMES]; + float *ImagBuffer[MAX_PARAM_SPATIAL_SUBFRAMES]; + + for ( i = 0; i < hSpatParamRendCom->subframe_nbslots[subframe_idx]; i++ ) + { + RealBuffer[i] = Cldfb_RealBuffer_Binaural[ch][i]; + ImagBuffer[i] = Cldfb_ImagBuffer_Binaural[ch][i]; + } + + cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][index_slot * hSpatParamRendCom->num_freq_bands] ), hSpatParamRendCom->num_freq_bands * hSpatParamRendCom->subframe_nbslots[subframe_idx], st_ivas->cldfbSynDec[ch] ); + } + } + else if ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT ) + { + for ( ch = 0; ch < hDirACRend->hOutSetup.nchan_out_woLFE; ch++ ) + { + for ( slot_idx = 0; slot_idx < hSpatParamRendCom->subframe_nbslots[subframe_idx]; slot_idx++ ) + { + mvr2r( Cldfb_RealBuffer[ch][slot_idx], pppQMfFrame_ts_re[ch][slot_idx], hSpatParamRendCom->num_freq_bands ); + mvr2r( Cldfb_ImagBuffer[ch][slot_idx], pppQMfFrame_ts_im[ch][slot_idx], hSpatParamRendCom->num_freq_bands ); + } + } + } + else + { + float *RealBuffer[MAX_PARAM_SPATIAL_SUBFRAMES]; + float *ImagBuffer[MAX_PARAM_SPATIAL_SUBFRAMES]; + int16_t outchannels; + + idx_in = 0; + idx_lfe = 0; + + outchannels = hDirACRend->hOutSetup.nchan_out_woLFE + hDirACRend->hOutSetup.num_lfe; + if ( hDirACRend->hOutSetup.separateChannelEnabled && ( hDirACRend->hOutSetup.output_config == IVAS_AUDIO_CONFIG_5_1 || + hDirACRend->hOutSetup.output_config == IVAS_AUDIO_CONFIG_7_1 || + hDirACRend->hOutSetup.output_config == IVAS_AUDIO_CONFIG_5_1_2 || + hDirACRend->hOutSetup.output_config == IVAS_AUDIO_CONFIG_5_1_4 || + hDirACRend->hOutSetup.output_config == IVAS_AUDIO_CONFIG_7_1_4 || + ( hDirACRend->hOutSetup.output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM && st_ivas->hLsSetupCustom->separate_ch_found ) ) ) + { + outchannels++; + } + + if ( hDirACRend->hOutSetup.separateChannelEnabled && hDirACRend->hOutSetup.output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM ) + { + float tmp_separated[L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES]; + float tmp_lfe[L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES]; + const int16_t subframe_start_sample = index_slot * hSpatParamRendCom->num_freq_bands; + const int16_t num_samples_subframe = hSpatParamRendCom->num_freq_bands * hSpatParamRendCom->subframe_nbslots[subframe_idx]; + + /* Move the separated and the LFE channels to temporary variables as spatial synthesis may overwrite current channels */ + mvr2r( &( output_f[st_ivas->hOutSetup.separateChannelIndex][subframe_start_sample] ), tmp_separated, num_samples_subframe ); + mvr2r( &( output_f[LFE_CHANNEL][subframe_start_sample] ), tmp_lfe, num_samples_subframe ); + + for ( ch = 0; ch < outchannels; ch++ ) + { + if ( ( hDirACRend->hOutSetup.num_lfe > 0 ) && ( hDirACRend->hOutSetup.index_lfe[idx_lfe] == ch ) ) + { + /* Move the LFE channel to the correct place */ + mvr2r( tmp_lfe, &( output_f[ch][subframe_start_sample] ), num_samples_subframe ); + + if ( idx_lfe < ( hDirACRend->hOutSetup.num_lfe - 1 ) ) + { + idx_lfe++; + } + } + else if ( ( st_ivas->hLsSetupCustom->separate_ch_found ) && ( hDirACRend->hOutSetup.separateChannelIndex == ch ) ) + { + /* Move the separated channel to the correct place. Thus, the separated channel is + * combined with the synthesized channels here when there is a matching channel. */ + mvr2r( tmp_separated, &( output_f[ch][subframe_start_sample] ), num_samples_subframe ); + } + else + { + /* open CLDFB buffer up to CLDFB_NO_CHANNELS_MAX bands for 48kHz */ + for ( i = 0; i < hSpatParamRendCom->subframe_nbslots[subframe_idx]; i++ ) + { + RealBuffer[i] = Cldfb_RealBuffer[idx_in][i]; + ImagBuffer[i] = Cldfb_ImagBuffer[idx_in][i]; + } + cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][subframe_start_sample] ), num_samples_subframe, st_ivas->cldfbSynDec[idx_in] ); + + if ( !st_ivas->hLsSetupCustom->separate_ch_found ) + { + /* Pan the separated channel and mix with the synthesized channels. Thus, the separated channel + * is combined with the synthesized channels here when there is no matching channel. */ + v_multc_acc( tmp_separated, st_ivas->hLsSetupCustom->separate_ch_gains[idx_in], &( output_f[ch][subframe_start_sample] ), num_samples_subframe ); + } + + idx_in++; + } + } + } + else + { + for ( ch = 0; ch < outchannels; ch++ ) + { + if ( ( hDirACRend->hOutSetup.num_lfe > 0 ) && ( hDirACRend->hOutSetup.index_lfe[idx_lfe] == ch ) ) + { + if ( st_ivas->mc_mode == MC_MODE_MCMASA && !hDirACRend->hOutSetup.separateChannelEnabled ) + { + for ( i = 0; i < hSpatParamRendCom->subframe_nbslots[subframe_idx]; i++ ) + { + RealBuffer[i] = Cldfb_RealBuffer[MAX_OUTPUT_CHANNELS - 1][i]; + ImagBuffer[i] = Cldfb_ImagBuffer[MAX_OUTPUT_CHANNELS - 1][i]; + } + cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][index_slot * hSpatParamRendCom->num_freq_bands] ), hSpatParamRendCom->num_freq_bands * hSpatParamRendCom->subframe_nbslots[subframe_idx], st_ivas->cldfbSynDec[hDirACRend->hOutSetup.nchan_out_woLFE + idx_lfe] ); + } + else if ( st_ivas->mc_mode == MC_MODE_MCMASA && hDirACRend->hOutSetup.separateChannelEnabled ) + { + /* LFE has been synthesized in the time domain, do nothing. */ + } + else + { + set_zero( &( output_f[ch][index_slot * hSpatParamRendCom->num_freq_bands] ), hSpatParamRendCom->subframe_nbslots[subframe_idx] * hSpatParamRendCom->num_freq_bands ); + } + + if ( idx_lfe < ( hDirACRend->hOutSetup.num_lfe - 1 ) ) + { + idx_lfe++; + } + } + else if ( ( hDirACRend->hOutSetup.separateChannelEnabled ) && ( hDirACRend->hOutSetup.separateChannelIndex == ch ) ) + { + /* The separated channel is already set to output_f[hOutSetup.separateChannelIndex]. Thus, the separated + * channel is combined with the synthesized channels here. */ + } + else + { + /* open CLDFB buffer up to CLDFB_NO_CHANNELS_MAX bands for 48kHz */ + for ( i = 0; i < hSpatParamRendCom->subframe_nbslots[subframe_idx]; i++ ) + { + RealBuffer[i] = Cldfb_RealBuffer[idx_in][i]; + ImagBuffer[i] = Cldfb_ImagBuffer[idx_in][i]; + } + cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][index_slot * hSpatParamRendCom->num_freq_bands] ), hSpatParamRendCom->num_freq_bands * hSpatParamRendCom->subframe_nbslots[subframe_idx], st_ivas->cldfbSynDec[idx_in] ); + idx_in++; + } + } + } + } + hSpatParamRendCom->slots_rendered += hSpatParamRendCom->subframe_nbslots[subframe_idx]; + hSpatParamRendCom->subframes_rendered++; + + pop_wmops(); + + return; +} diff --git a/lib_dec/ivas_dirac_output_synthesis_cov.c b/lib_dec/ivas_dirac_output_synthesis_cov.c new file mode 100644 index 0000000000000000000000000000000000000000..092ffe4116b4af18add8be2cde87c260389740ba --- /dev/null +++ b/lib_dec/ivas_dirac_output_synthesis_cov.c @@ -0,0 +1,1118 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include +#include +#include +#include "options.h" +#include "cnst.h" +#include "rom_enc.h" +#include "rom_com.h" +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_stat_dec.h" +#include "ivas_cnst.h" +#include "ivas_rom_com.h" +#include "ivas_rom_dec.h" +#include "wmc_auto.h" +#include "rom_dec.h" + + +/*-------------------------------------------------------------------* + * ivas_dirac_dec_output_synthesis_cov_open() + * + * Sets up the state and parameters for the Covariance Synthesis + *-------------------------------------------------------------------*/ + +ivas_error ivas_dirac_dec_output_synthesis_cov_open( + DIRAC_OUTPUT_SYNTHESIS_PARAMS *h_dirac_output_synthesis_params, /* i/o: handle for the covariance synthesis parameters */ + DIRAC_OUTPUT_SYNTHESIS_COV_STATE *h_dirac_output_synthesis_state, /* i/o: hanlde for the covariance synthesis state */ + const int16_t max_band_decorr, /* i : uppermost frequency band where decorrelation is applied */ + const int16_t interp_length, /* i : length for interpolating the mixing matrices in time slots */ + const int16_t num_param_bands, /* i : number of parameter bands */ + const int16_t num_param_bands_residual, /* i : number of parameter bands with a residual mixing matrix (i.e. decorrelation */ + const int16_t nchan_in, /* i : number of input (transport) channels */ + const int16_t nchan_out, /* i : number of output channels */ + const float *proto_matrix /* i : the prototype (upmix) matrix (only used if mode == 1) */ +) +{ + int16_t idx; + + h_dirac_output_synthesis_params->max_band_decorr = max_band_decorr; + + /*-----------------------------------------------------------------* + * memory allocation + *-----------------------------------------------------------------*/ + + /* buffer length and interpolator */ + h_dirac_output_synthesis_params->alpha_synthesis = NULL; + if ( ( h_dirac_output_synthesis_params->proto_matrix = (float *) malloc( nchan_out * nchan_in * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis covariance\n" ) ); + } + + /* cov buffers */ + for ( idx = 0; idx < num_param_bands; idx++ ) + { + + if ( ( h_dirac_output_synthesis_state->cx_old[idx] = (float *) malloc( nchan_in * nchan_in * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis covariance\n" ) ); + } + if ( ( h_dirac_output_synthesis_state->cy_old[idx] = (float *) malloc( nchan_out * nchan_out * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis covariance\n" ) ); + } + if ( ( h_dirac_output_synthesis_state->mixing_matrix_old[idx] = (float *) malloc( nchan_out * nchan_in * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis covariance\n" ) ); + } + set_zero( h_dirac_output_synthesis_state->cx_old[idx], nchan_in * nchan_in ); + set_zero( h_dirac_output_synthesis_state->cy_old[idx], nchan_out * nchan_out ); + set_zero( h_dirac_output_synthesis_state->mixing_matrix_old[idx], nchan_out * nchan_in ); + + if ( ( h_dirac_output_synthesis_state->mixing_matrix[idx] = (float *) malloc( nchan_out * nchan_in * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis matrix\n" ) ); + } + set_zero( h_dirac_output_synthesis_state->mixing_matrix[idx], nchan_out * nchan_in ); + } + for ( ; idx < CLDFB_NO_CHANNELS_MAX; idx++ ) + { + h_dirac_output_synthesis_state->cx_old[idx] = NULL; + h_dirac_output_synthesis_state->cy_old[idx] = NULL; + h_dirac_output_synthesis_state->mixing_matrix_old[idx] = NULL; + h_dirac_output_synthesis_state->mixing_matrix[idx] = NULL; + } + + for ( idx = 0; idx < num_param_bands_residual; idx++ ) + { + if ( ( h_dirac_output_synthesis_state->mixing_matrix_res_old[idx] = (float *) malloc( nchan_out * nchan_out * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis covariance\n" ) ); + } + set_zero( h_dirac_output_synthesis_state->mixing_matrix_res_old[idx], nchan_out * nchan_out ); + + if ( ( h_dirac_output_synthesis_state->mixing_matrix_res[idx] = (float *) malloc( nchan_out * nchan_out * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis matrix\n" ) ); + } + set_zero( h_dirac_output_synthesis_state->mixing_matrix_res[idx], nchan_out * nchan_out ); + } + for ( ; idx < CLDFB_NO_CHANNELS_MAX; idx++ ) + { + h_dirac_output_synthesis_state->mixing_matrix_res_old[idx] = NULL; + h_dirac_output_synthesis_state->mixing_matrix_res[idx] = NULL; + } + + /*-----------------------------------------------------------------* + * prepare processing parameters + *-----------------------------------------------------------------*/ + + /* compute interpolator */ + if ( ( h_dirac_output_synthesis_params->interpolator = (float *) malloc( interp_length * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis covariance\n" ) ); + } + + for ( idx = 1; idx <= interp_length; ++idx ) + { + h_dirac_output_synthesis_params->interpolator[idx - 1] = (float) idx / (float) interp_length; + } + + mvr2r( proto_matrix, h_dirac_output_synthesis_params->proto_matrix, nchan_in * nchan_out ); + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * ivas_dirac_dec_output_synthesis_get_interpolator() + * + * + *-------------------------------------------------------------------*/ + +void ivas_dirac_dec_output_synthesis_get_interpolator( + DIRAC_OUTPUT_SYNTHESIS_PARAMS *h_dirac_output_synthesis_params, /* i/o: handle for the covariance synthesis parameters */ + const uint16_t interp_length /* i : interpolator length */ +) +{ + int16_t idx; + + for ( idx = 1; idx <= interp_length; ++idx ) + { + h_dirac_output_synthesis_params->interpolator[idx - 1] = (float) idx / (float) interp_length; + } + + return; +} + + +/*-------------------------------------------------------------------* + * ivas_dirac_dec_output_synthesis_cov_init() + * + * initialize the states for the covariance synthesis + *-------------------------------------------------------------------*/ + +void ivas_dirac_dec_output_synthesis_cov_init( + DIRAC_OUTPUT_SYNTHESIS_COV_STATE *h_dirac_output_synthesis_state, /* i/o: pointer to the state of the covariance synthesis */ + const int16_t nchan_in, /* i : number of input (tranport) channels */ + const int16_t nchan_out, /* i : number of output channels */ + const int16_t n_param_bands, /* i : number of total parameter bands */ + const int16_t n_param_bands_res /* i : number of parameter bands with a residual mixing matrix (i.e. decorrelation */ +) +{ + + int16_t idx; + + /* initialize buffers */ + for ( idx = 0; idx < n_param_bands; idx++ ) + { + set_zero( h_dirac_output_synthesis_state->cx_old[idx], nchan_in * nchan_in ); + set_zero( h_dirac_output_synthesis_state->cy_old[idx], nchan_out * nchan_out ); + set_zero( h_dirac_output_synthesis_state->mixing_matrix_old[idx], nchan_out * nchan_in ); + set_zero( h_dirac_output_synthesis_state->mixing_matrix[idx], nchan_out * nchan_in ); + } + + for ( idx = 0; idx < n_param_bands_res; idx++ ) + { + set_zero( h_dirac_output_synthesis_state->mixing_matrix_res_old[idx], nchan_out * nchan_out ); + set_zero( h_dirac_output_synthesis_state->mixing_matrix_res[idx], nchan_out * nchan_out ); + } + + return; +} + + +/*-------------------------------------------------------------------* + * ivas_dirac_dec_output_synthesis_cov_close() + * + * deallocate dynamic memory in the covariance synthesis state + *-------------------------------------------------------------------*/ + +void ivas_dirac_dec_output_synthesis_cov_close( + DIRAC_OUTPUT_SYNTHESIS_PARAMS *h_dirac_output_synthesis_params, /* i : handle for the covariance synthesis parameters */ + DIRAC_OUTPUT_SYNTHESIS_COV_STATE *h_dirac_output_synthesis_state /* i/o: handle for the covariance synthesis state */ +) +{ + int16_t idx; + + /*-----------------------------------------------------------------* + * memory deallocation + *-----------------------------------------------------------------*/ + + /* free interpolator */ + if ( h_dirac_output_synthesis_params->interpolator != NULL ) + { + free( h_dirac_output_synthesis_params->interpolator ); + h_dirac_output_synthesis_params->interpolator = NULL; + } + + /* free alpha */ + if ( h_dirac_output_synthesis_params->alpha_synthesis != NULL ) + { + free( h_dirac_output_synthesis_params->alpha_synthesis ); + h_dirac_output_synthesis_params->alpha_synthesis = NULL; + } + + /* free proto_matrix */ + if ( h_dirac_output_synthesis_params->proto_matrix != NULL ) + { + free( h_dirac_output_synthesis_params->proto_matrix ); + h_dirac_output_synthesis_params->proto_matrix = NULL; + } + + /* free cov buffers */ + for ( idx = 0; idx < CLDFB_NO_CHANNELS_MAX; idx++ ) + { + if ( h_dirac_output_synthesis_state->cx_old[idx] != NULL ) + { + free( h_dirac_output_synthesis_state->cx_old[idx] ); + h_dirac_output_synthesis_state->cx_old[idx] = NULL; + } + + if ( h_dirac_output_synthesis_state->cy_old[idx] != NULL ) + { + free( h_dirac_output_synthesis_state->cy_old[idx] ); + h_dirac_output_synthesis_state->cy_old[idx] = NULL; + } + + if ( h_dirac_output_synthesis_state->mixing_matrix_old[idx] != NULL ) + { + free( h_dirac_output_synthesis_state->mixing_matrix_old[idx] ); + h_dirac_output_synthesis_state->mixing_matrix_old[idx] = NULL; + } + + if ( h_dirac_output_synthesis_state->mixing_matrix_res_old[idx] != NULL ) + { + free( h_dirac_output_synthesis_state->mixing_matrix_res_old[idx] ); + h_dirac_output_synthesis_state->mixing_matrix_res_old[idx] = NULL; + } + + if ( h_dirac_output_synthesis_state->mixing_matrix[idx] != NULL ) + { + free( h_dirac_output_synthesis_state->mixing_matrix[idx] ); + h_dirac_output_synthesis_state->mixing_matrix[idx] = NULL; + } + + if ( h_dirac_output_synthesis_state->mixing_matrix_res[idx] != NULL ) + { + free( h_dirac_output_synthesis_state->mixing_matrix_res[idx] ); + h_dirac_output_synthesis_state->mixing_matrix_res[idx] = NULL; + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * ivas_dirac_dec_output_synthesis_cov_param_mc_collect_slot() + * + * collect the multi channel input covariance for one filter bank time slot + *-------------------------------------------------------------------*/ + +void ivas_dirac_dec_output_synthesis_cov_param_mc_collect_slot( + float *RealBuffer, /* i : input channel filter bank samples (real part) */ + float *ImagBuffer, /* i : input channel filter bank samples (imaginary part */ + float cx[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS], /* o : accumulated input covariance (real part) */ + float cx_imag[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS], /* o : accumulated input covariance (imaginary part) */ + PARAM_MC_DEC_HANDLE hParamMC, /* i : handle to Parametric MC state */ + const int16_t nchan_in /* i : number of input channels */ +) +{ + int16_t param_band, band_idx, ch_idx; + int16_t brange[2]; + float real_in_buffer[PARAM_MC_MAX_BANDS_IN_PARAMETER_BAND * MAX_TRANSPORT_CHANNELS]; + float imag_in_buffer[PARAM_MC_MAX_BANDS_IN_PARAMETER_BAND * MAX_TRANSPORT_CHANNELS]; + float real_buffer[PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS]; + float imag_buffer[PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS]; + + /* estimate input covariance */ + for ( param_band = 0; param_band < hParamMC->num_param_bands_synth; param_band++ ) + { + /* Already stack here instead of in the process_subframe */ + + /* collect input frame */ + int16_t num_bands; + brange[0] = hParamMC->band_grouping[param_band]; + brange[1] = hParamMC->band_grouping[param_band + 1]; + num_bands = brange[1] - brange[0]; + + for ( band_idx = 0; band_idx < num_bands; band_idx++ ) + { + int16_t band = brange[0] + band_idx; + for ( ch_idx = 0; ch_idx < nchan_in; ch_idx++ ) + { + real_in_buffer[band_idx + num_bands * ch_idx] = RealBuffer[ch_idx * hParamMC->num_freq_bands + band]; + imag_in_buffer[band_idx + num_bands * ch_idx] = ImagBuffer[ch_idx * hParamMC->num_freq_bands + band]; + } + } + + cmplx_matrix_square( real_in_buffer, imag_in_buffer, num_bands, nchan_in, real_buffer, imag_buffer ); + + v_add( cx[param_band], real_buffer, cx[param_band], nchan_in * nchan_in ); + + v_add( cx_imag[param_band], imag_buffer, cx_imag[param_band], nchan_in * nchan_in ); + } + + return; +} + + +/*-------------------------------------------------------------------* + * ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot() + * + * synthesize one filter bank slot of multi channel output filter bank + * samples with the covariance synthesis + *-------------------------------------------------------------------*/ + +void ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot( + float *Cldfb_RealBuffer_in, /* i : input channel filter bank samples (real part) */ + float *Cldfb_ImagBuffer_in, /* i : input channel filter bank samples (imaginary part) */ + float Cldfb_RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : output channel filter bank samples (real part) */ + float Cldfb_ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : output channel filter bank samples (imaginary part) */ + float *mixing_matrix[], /* i : parameter band wise mixing matrices (direct part) */ + float *mixing_matrix_res[], /* i : parameter band wise mixing matrices (residual part) */ + const uint16_t slot_idx_sfr, /* i : time slot index for the current slot within the current subframe */ + const uint16_t slot_idx_tot, /* i : time slot index for the current slot within the frame */ + const int16_t nX, /* i : number of input channels */ + const int16_t nY, /* i : number of output channels */ + PARAM_MC_DEC_HANDLE hParamMC /* i : handle to the Parametric MC decoder state */ +) +{ + int16_t param_band_idx, band, ch_idx; + float mixing_matrix_smooth[MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS]; + float mixing_matrix_res_smooth[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; + float mixing_matrix_buffer[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; + int16_t have_residual; + float input_f_real[PARAM_MC_MAX_TRANSPORT_CHANS]; + float input_f_imag[PARAM_MC_MAX_TRANSPORT_CHANS]; + float output_f_real[MAX_CICP_CHANNELS]; + float output_f_imag[MAX_CICP_CHANNELS]; + float diff_f_real[MAX_CICP_CHANNELS]; + float diff_f_imag[MAX_CICP_CHANNELS]; + int16_t brange[2]; + DIRAC_OUTPUT_SYNTHESIS_COV_STATE h_synthesis_state = hParamMC->h_output_synthesis_cov_state; + + set_zero( input_f_real, PARAM_MC_MAX_TRANSPORT_CHANS ); + set_zero( input_f_imag, PARAM_MC_MAX_TRANSPORT_CHANS ); + set_zero( output_f_real, MAX_CICP_CHANNELS ); + set_zero( output_f_imag, MAX_CICP_CHANNELS ); + set_zero( diff_f_real, MAX_CICP_CHANNELS ); + set_zero( diff_f_imag, MAX_CICP_CHANNELS ); + + for ( param_band_idx = 0; param_band_idx < hParamMC->num_param_bands_synth; param_band_idx++ ) + { + /* final mixing */ + have_residual = 0; + brange[0] = hParamMC->band_grouping[param_band_idx]; + brange[1] = hParamMC->band_grouping[param_band_idx + 1]; + + if ( brange[0] < hParamMC->h_output_synthesis_params.max_band_decorr ) + { + have_residual = 1; + } + + /* mixing matrix interpolation*/ + v_multc( mixing_matrix[param_band_idx], hParamMC->h_output_synthesis_params.interpolator[slot_idx_tot], mixing_matrix_smooth, nY * nX ); + v_multc( h_synthesis_state.mixing_matrix_old[param_band_idx], 1.0f - hParamMC->h_output_synthesis_params.interpolator[slot_idx_tot], mixing_matrix_buffer, nY * nX ); + v_add( mixing_matrix_smooth, mixing_matrix_buffer, mixing_matrix_smooth, nY * nX ); + + if ( have_residual ) + { + /* residual mixing matrix interpolation*/ + v_multc( mixing_matrix_res[param_band_idx], hParamMC->h_output_synthesis_params.interpolator[slot_idx_tot], mixing_matrix_res_smooth, nY * nY ); + v_multc( h_synthesis_state.mixing_matrix_res_old[param_band_idx], 1.0f - hParamMC->h_output_synthesis_params.interpolator[slot_idx_tot], mixing_matrix_buffer, nY * nY ); + v_add( mixing_matrix_res_smooth, mixing_matrix_buffer, mixing_matrix_res_smooth, nY * nY ); + } + + for ( band = brange[0]; band < brange[1]; band++ ) + { + assert( band >= 0 ); + + if ( have_residual ) + { + /* collect diffuse prototypes */ + assert( band < hParamMC->h_output_synthesis_params.max_band_decorr ); + for ( ch_idx = 0; ch_idx < nY; ch_idx++ ) + { + diff_f_real[ch_idx] = Cldfb_RealBuffer[ch_idx][slot_idx_sfr][band]; + diff_f_imag[ch_idx] = Cldfb_ImagBuffer[ch_idx][slot_idx_sfr][band]; + } + + /* apply residual mixing */ + matrix_product( mixing_matrix_res_smooth, nY, nY, 0, diff_f_real, nY, 1, 0, output_f_real ); + matrix_product( mixing_matrix_res_smooth, nY, nY, 0, diff_f_imag, nY, 1, 0, output_f_imag ); + + for ( ch_idx = 0; ch_idx < nY; ch_idx++ ) + { + Cldfb_RealBuffer[ch_idx][slot_idx_sfr][band] = output_f_real[ch_idx]; + Cldfb_ImagBuffer[ch_idx][slot_idx_sfr][band] = output_f_imag[ch_idx]; + } + } + else + { + for ( ch_idx = 0; ch_idx < nY; ch_idx++ ) + { + Cldfb_RealBuffer[ch_idx][slot_idx_sfr][band] = 0.0f; + Cldfb_ImagBuffer[ch_idx][slot_idx_sfr][band] = 0.0f; + } + } + + /* collect input signals, still in cldfb buffers */ + for ( ch_idx = 0; ch_idx < nX; ch_idx++ ) + { + input_f_real[ch_idx] = Cldfb_RealBuffer_in[ch_idx * hParamMC->num_freq_bands + band]; + input_f_imag[ch_idx] = Cldfb_ImagBuffer_in[ch_idx * hParamMC->num_freq_bands + band]; + } + + /* apply mixing matrix */ + matrix_product( mixing_matrix_smooth, nY, nX, 0, input_f_real, nX, 1, 0, output_f_real ); + matrix_product( mixing_matrix_smooth, nY, nX, 0, input_f_imag, nX, 1, 0, output_f_imag ); + + /* collect output */ + for ( ch_idx = 0; ch_idx < nY; ch_idx++ ) + { + Cldfb_RealBuffer[ch_idx][slot_idx_sfr][band] += output_f_real[ch_idx]; + Cldfb_ImagBuffer[ch_idx][slot_idx_sfr][band] += output_f_imag[ch_idx]; + } + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * computeMixingMatrices() + * + * compute a mixing matrix using the convariance synthesis approach + *-------------------------------------------------------------------*/ + +int16_t computeMixingMatrices( + const int16_t num_inputs, /* i : number of input channels */ + const int16_t num_outputs, /* i : number of output channels */ + const float *Cx, /* i : input channel covariance matrix */ + const float *Cy, /* i : target covariance matrix */ + const float *Q, /* i : prototype matrix (usually a upmix matrix) */ + const int16_t energy_compensation_flag, /* i : flag indicating that the energy compensation should be performed (i.e. no residual mixing matrix will follow) */ + const float reg_Sx, /* i : regularization factor for the input channel singular values */ + const float reg_ghat, /* i : regularization factor for the normalization matrix */ + float *mixing_matrix, /* o : resulting mixing matrix */ + float *Cr /* o : residual covariance matrix */ +) +{ + int16_t i, j; + int16_t out = EXIT_SUCCESS; + int16_t nL, nC; + int16_t lengthCx = num_inputs; + int16_t lengthCy = num_outputs; + float *Cr_p, *Cy_tilde_p; + const float *Cy_p; + float *adj; + float limit; + float svd_in_buffer[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; + float svd_u_buffer[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; + float svd_s_buffer[MAX_OUTPUT_CHANNELS]; + float svd_v_buffer[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; + float Kx[MAX_TRANSPORT_CHANNELS * MAX_TRANSPORT_CHANNELS]; + float Ky[MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS]; + float Kx_reg_inv[MAX_TRANSPORT_CHANNELS * MAX_TRANSPORT_CHANNELS]; + float Q_Cx[MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS]; + float Cy_hat_diag[MAX_OUTPUT_CHANNELS]; + float G_hat[MAX_OUTPUT_CHANNELS]; + float mat_mult_buffer1[MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS]; + float mat_mult_buffer2[MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS]; + float mat_mult_buffer3[MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS]; + + push_wmops( "dirac_cov_mix_mat" ); + + set_zero( svd_s_buffer, MAX_OUTPUT_CHANNELS ); + for ( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) + { + set_zero( svd_in_buffer[i], MAX_OUTPUT_CHANNELS ); + set_zero( svd_u_buffer[i], MAX_OUTPUT_CHANNELS ); + set_zero( svd_v_buffer[i], MAX_OUTPUT_CHANNELS ); + } + + /*-----------------------------------------------------------------* + * Decomposition of Cy + *-----------------------------------------------------------------*/ + + /* Processing the SVD */ + mat2svdMat( Cy, svd_in_buffer, lengthCy, lengthCy, 0 ); + + svd( svd_in_buffer, svd_u_buffer, svd_s_buffer, svd_v_buffer, lengthCy, lengthCy ); + + /* Computing Ky */ + for ( i = 0; i < lengthCy; ++i ) + { + for ( j = 0; j < lengthCy; ++j ) + { + Ky[i + j * lengthCy] = svd_u_buffer[i][j] * sqrtf( svd_s_buffer[j] ); + } + } + + /*-----------------------------------------------------------------* + * Decomposition of Cx + *-----------------------------------------------------------------*/ + + /* Processing the SVD */ + mat2svdMat( Cx, svd_in_buffer, lengthCx, lengthCx, 0 ); + + svd( svd_in_buffer, svd_u_buffer, svd_s_buffer, svd_v_buffer, lengthCx, lengthCx ); + + /* Computing Kx */ + for ( i = 0; i < lengthCx; ++i ) + { + for ( j = 0; j < lengthCx; ++j ) + { + Kx[i + j * lengthCx] = svd_u_buffer[i][j] * sqrtf( svd_s_buffer[j] ); + } + } + + /* Sx = sqrt(Sx) */ + for ( i = 0; i < lengthCx; ++i ) + { + svd_s_buffer[i] = sqrtf( svd_s_buffer[i] ); + } + + /*-----------------------------------------------------------------* + * Regularization of Sx + *-----------------------------------------------------------------*/ + + maximum( svd_s_buffer, lengthCx, &limit ); + limit = limit * reg_Sx + EPSILON; + + for ( i = 0; i < lengthCx; ++i ) + { + svd_s_buffer[i] = ( ( svd_s_buffer[i] > limit ) ? svd_s_buffer[i] : limit ); + } + + limit = 0.0f; + + /*-----------------------------------------------------------------* + * regularized Kx-1 + *-----------------------------------------------------------------*/ + + for ( i = 0; i < lengthCx; ++i ) + { + float reg_fac = ( 1.0f / svd_s_buffer[i] ); + + for ( j = 0; j < lengthCx; ++j ) + { + Kx_reg_inv[i + j * lengthCx] = reg_fac * svd_u_buffer[j][i]; + } + } + + /*-----------------------------------------------------------------* + * normalization matrix G hat + *-----------------------------------------------------------------*/ + + /* Computing Q*Cx*Q' */ + matrix_product( Q, lengthCy, lengthCx, 0, Cx, lengthCx, lengthCx, 0, Q_Cx ); + + matrix_product_diag( Q_Cx, lengthCy, lengthCx, 0, Q, lengthCy, lengthCx, 1, Cy_hat_diag ); + + /* Computing Cy_hat_diag */ + for ( i = 0; i < lengthCy; ++i ) + { + if ( Cy_hat_diag[i] > limit ) + { + limit = Cy_hat_diag[i]; + } + } + + limit = limit * reg_ghat + EPSILON; + + /* Computing G_hat */ + for ( i = 0; i < lengthCy; ++i ) + { + if ( limit > Cy_hat_diag[i] ) /* Computing Cy_hat_diag = max(Cy_hat_diag,limit) */ + { + Cy_hat_diag[i] = limit; + } + + G_hat[i] = sqrtf( Cy[i + i * lengthCy] / Cy_hat_diag[i] ); + } + + /*-----------------------------------------------------------------* + * Formulate optimal P + *-----------------------------------------------------------------*/ + + /* Computing the input matrix Kx'*Q'*G_hat'*Ky */ + matrix_product( Kx, lengthCx, lengthCx, 1, Q, lengthCy, lengthCx, 1, mat_mult_buffer1 ); + matrix_diag_product( mat_mult_buffer1, lengthCx, lengthCy, 0, G_hat, lengthCy, mat_mult_buffer2 ); + matrix_product( mat_mult_buffer2, lengthCx, lengthCy, 0, Ky, lengthCy, lengthCy, 0, mat_mult_buffer1 ); + + if ( lengthCx < lengthCy ) + { + mat2svdMat( mat_mult_buffer1, svd_in_buffer, lengthCx, lengthCy, 1 ); + + nL = lengthCy; + nC = lengthCx; + + svd( svd_in_buffer, svd_v_buffer, svd_s_buffer, svd_u_buffer, nL, nC ); + } + else + { + mat2svdMat( mat_mult_buffer1, svd_in_buffer, lengthCx, lengthCy, 0 ); + + nL = lengthCx; + nC = lengthCy; + + svd( svd_in_buffer, svd_u_buffer, svd_s_buffer, svd_v_buffer, nL, nC ); + } + + /* Actually Processing P */ + + /* can be skipped: lambda is always column-truncated identity matrix, so this operation just + truncates V to num_input_channel columns */ + + svdMat2mat( svd_v_buffer, mat_mult_buffer1, lengthCy, lengthCx ); + svdMat2mat( svd_u_buffer, mat_mult_buffer2, lengthCx, lengthCx ); + + matrix_product( mat_mult_buffer1, lengthCy, lengthCx, 0, + mat_mult_buffer2, lengthCx, lengthCx, 1, + mat_mult_buffer3 ); + + /************************ Formulate M **********************/ + + matrix_product( Ky, lengthCy, lengthCy, 0, mat_mult_buffer3, lengthCy, lengthCx, 0, mat_mult_buffer1 ); + matrix_product( mat_mult_buffer1, lengthCy, lengthCx, 0, Kx_reg_inv, lengthCx, lengthCx, 0, mixing_matrix ); + + /*-----------------------------------------------------------------* + * Formulate Cr + *-----------------------------------------------------------------*/ + + /* Compute Cy_tilde = M*Cx*M' */ + matrix_product( mixing_matrix, lengthCy, lengthCx, 0, Cx, lengthCx, lengthCx, 0, mat_mult_buffer1 ); + matrix_product( mat_mult_buffer1, lengthCy, lengthCx, 0, mixing_matrix, lengthCy, lengthCx, 1, mat_mult_buffer2 ); + + /* Compute Cr = Cy - Cy_tilde */ + Cr_p = Cr; + Cy_p = Cy; + Cy_tilde_p = mat_mult_buffer2; + for ( i = 0; i < lengthCy; ++i ) + { + for ( j = 0; j < lengthCy; ++j ) + { + *( Cr_p++ ) = *( Cy_p++ ) - *( Cy_tilde_p++ ); + } + + /* Avoid Meaningless negative main diagonal elements */ + if ( Cr[i + i * lengthCy] < 0.0f ) + { + Cr[i + i * lengthCy] = 0.0f; + } + } + + /*-----------------------------------------------------------------* + * Energy Compensation + *-----------------------------------------------------------------*/ + + if ( energy_compensation_flag == 1 ) + { + adj = svd_s_buffer; + Cy_tilde_p = mat_mult_buffer2; + for ( i = 0; i < lengthCy; ++i ) + { + /* Avoid correction for very small energies, + main diagonal elements of Cy_tilde_p may be negative */ + if ( Cy_tilde_p[i + i * lengthCy] < 0.0f ) + { + adj[i] = 1.0f; + } + else + { + adj[i] = sqrtf( Cy[i + lengthCy * i] / ( Cy_tilde_p[i + i * lengthCy] + EPSILON ) ); + } + + if ( adj[i] > 4.0f ) + { + adj[i] = 4.0f; + } + } + + diag_matrix_product( adj, lengthCy, mixing_matrix, lengthCy, lengthCx, 0, mat_mult_buffer3 ); + + mvr2r( mat_mult_buffer3, mixing_matrix, lengthCy * lengthCx ); + } + pop_wmops(); + + return out; +} + + +/*-------------------------------------------------------------------* + * computeMixingMatricesResidual() + * + * compute a residual mixing matrix using the covariance synthesis approach + *-------------------------------------------------------------------*/ + +int16_t computeMixingMatricesResidual( + const int16_t num_outputs, /* i : number of output channels */ + const float *Cx, /* i : vector containing the diagonal diffuse prototype covariance */ + const float *Cy, /* i : matrix containing the missing cov (Cr from computeMixingMatrices()) */ + const float reg_Sx, /* i : regularization factor for the input channel singular values */ + const float reg_ghat, /* i : regularization factor for the normalization matrix */ + float *mixing_matrix /* o : resulting residual mixing matrix */ +) +{ + int16_t i, j; + int16_t out = EXIT_SUCCESS; + int16_t lengthCx = num_outputs; + int16_t lengthCy = num_outputs; + float *adj; + float limit; + float svd_in_buffer[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; + float svd_u_buffer[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; + float svd_s_buffer[MAX_OUTPUT_CHANNELS]; + float svd_v_buffer[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; + float Kx[MAX_OUTPUT_CHANNELS]; + float Ky[MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS]; + float Kx_reg_inv[MAX_OUTPUT_CHANNELS]; + float Cy_hat_diag[MAX_OUTPUT_CHANNELS]; + float G_hat[MAX_OUTPUT_CHANNELS]; + float Cy_tilde[MAX_OUTPUT_CHANNELS]; + float mat_mult_buffer1[MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS]; + float mat_mult_buffer2[MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS]; + float mat_mult_buffer3[MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS]; + + push_wmops( "dirac_cov_mix_mat_r" ); + + /*-----------------------------------------------------------------* + * Decomposition of Cy + *-----------------------------------------------------------------*/ + + /* Processing the SVD */ + + /* linear array to svd buffer */ + mat2svdMat( Cy, svd_in_buffer, lengthCy, lengthCy, 0 ); + + svd( svd_in_buffer, svd_u_buffer, svd_s_buffer, svd_v_buffer, lengthCy, lengthCy ); + + /* Computing Ky */ + for ( i = 0; i < lengthCy; ++i ) + { + for ( j = 0; j < lengthCy; ++j ) + { + Ky[i + j * lengthCy] = svd_u_buffer[i][j] * sqrtf( svd_s_buffer[j] ); + } + } + + /*-----------------------------------------------------------------* + * Decomposition of Cx + *-----------------------------------------------------------------*/ + + /* Processing the SVD of Cx*/ + /* Cx is a diagonal matrix, so SVD would lead to the sorted diagonal as S and u + * would be just indicating the sorting index, so go straight to Kx as the + * square root of the diagonal of Cx */ + + /* Computing Kx */ + for ( i = 0; i < lengthCx; ++i ) + { + Kx[i] = sqrtf( Cx[i] ); + } + + /*-----------------------------------------------------------------* + * Regularization of Sx + *-----------------------------------------------------------------*/ + + maximum( Kx, lengthCx, &limit ); + limit = limit * reg_Sx + EPSILON; + + for ( i = 0; i < lengthCx; ++i ) + { + float reg_fac = ( 1.0f / ( ( Kx[i] > limit ) ? Kx[i] : limit ) ); + Kx_reg_inv[i] = reg_fac; + } + + limit = 0.0f; + + /*-----------------------------------------------------------------* + * regularized Kx-1 + *-----------------------------------------------------------------*/ + + /*-----------------------------------------------------------------* + * normalization matrix G hat + *-----------------------------------------------------------------*/ + + /* Computing Cy_hat_diag */ + mvr2r( Cx, Cy_hat_diag, num_outputs ); + + for ( i = 0; i < lengthCy; ++i ) + { + if ( Cy_hat_diag[i] > limit ) + { + limit = Cy_hat_diag[i]; + } + } + + limit = limit * reg_ghat + EPSILON; + + /* Computing G_hat */ + for ( i = 0; i < lengthCy; ++i ) + { + if ( limit > Cy_hat_diag[i] ) /* Computing Cy_hat_diag = max(Cy_hat_diag,limit) */ + { + Cy_hat_diag[i] = limit; + } + G_hat[i] = sqrtf( Cy[i + i * lengthCy] / Cy_hat_diag[i] ); + } + + /*-----------------------------------------------------------------* + * Formulate optimal P + *-----------------------------------------------------------------*/ + + for ( i = 0; i < num_outputs; i++ ) + { + Kx[i] *= G_hat[i]; + } + + for ( i = 0; i < num_outputs; i++ ) + { + float fac = Kx[i]; + + for ( j = 0; j < num_outputs; j++ ) + { + mat_mult_buffer1[i + j * num_outputs] = Ky[i + j * num_outputs] * fac; + } + } + + mat2svdMat( mat_mult_buffer1, svd_in_buffer, lengthCx, lengthCy, 0 ); + + svd( svd_in_buffer, svd_u_buffer, svd_s_buffer, svd_v_buffer, lengthCx, lengthCy ); + + /* Actually Processing P */ + svdMat2mat( svd_v_buffer, mat_mult_buffer1, lengthCy, lengthCx ); + svdMat2mat( svd_u_buffer, mat_mult_buffer2, lengthCx, lengthCx ); + + matrix_product( mat_mult_buffer1, lengthCy, lengthCx, 0, + mat_mult_buffer2, lengthCx, lengthCx, 1, + mat_mult_buffer3 ); + + /*-----------------------------------------------------------------* + * Formulate M + *-----------------------------------------------------------------*/ + + matrix_product( Ky, lengthCy, lengthCy, 0, mat_mult_buffer3, lengthCy, lengthCx, 0, mat_mult_buffer1 ); + + for ( i = 0; i < num_outputs; i++ ) + { + float fac = Kx_reg_inv[i]; + + for ( j = 0; j < num_outputs; j++ ) + { + mixing_matrix[j + i * num_outputs] = mat_mult_buffer1[j + i * num_outputs] * fac; + } + } + + /*-----------------------------------------------------------------* + * Formulate Cr + *-----------------------------------------------------------------*/ + + /* Compute Cy_tilde = M*Cx*M' */ + matrix_diag_product( mixing_matrix, lengthCy, lengthCx, 0, Cx, lengthCx, mat_mult_buffer1 ); + + matrix_product_diag( mat_mult_buffer1, lengthCy, lengthCx, 0, mixing_matrix, lengthCy, lengthCx, 1, Cy_tilde ); + + /*-----------------------------------------------------------------* + * Energy Compensation + *-----------------------------------------------------------------*/ + + adj = svd_s_buffer; + + for ( i = 0; i < lengthCy; ++i ) + { + adj[i] = sqrtf( Cy[i + lengthCy * i] / ( Cy_tilde[i] + EPSILON ) ); + if ( adj[i] > 4.0f ) + { + adj[i] = 4.0f; + } + } + + diag_matrix_product( adj, lengthCy, mixing_matrix, lengthCy, lengthCx, 0, mat_mult_buffer3 ); + + mvr2r( mat_mult_buffer3, mixing_matrix, lengthCy * lengthCx ); + + pop_wmops(); + + return out; +} + + +/*-------------------------------------------------------------------* + * computeMixingMatricesISM() + * + * + *-------------------------------------------------------------------*/ + +int16_t computeMixingMatricesISM( + const int16_t num_inputs, + const int16_t num_responses, + const int16_t num_outputs, + const float *responses, + const float *ener, + const float *Cx_diag, + const float *Cy_diag, + const float *Q, + const int16_t energy_compensation_flag, + const float reg_Sx, + const float reg_ghat, + float *mixing_matrix ) +{ + int16_t i, out; + int16_t lengthCx, lengthCy; + float *Cy_tilde_p; + float *adj; + float limit; + float svd_in_buffer[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; + float svd_u_buffer[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; + float svd_s_buffer[MAX_OUTPUT_CHANNELS]; + float svd_v_buffer[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; + float Kx[MAX_TRANSPORT_CHANNELS]; + float Ky[MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS]; + float Kx_reg_inv[MAX_TRANSPORT_CHANNELS]; + float Q_Cx[MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS]; + float Cy_hat_diag[MAX_OUTPUT_CHANNELS]; + float G_hat[MAX_OUTPUT_CHANNELS]; + float mat_mult_buffer1[MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS]; + float mat_mult_buffer2[MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS]; + float mat_mult_buffer3[MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS]; + int16_t nL, nC; + + push_wmops( "dirac_cov_mix_mat" ); + + out = EXIT_SUCCESS; + lengthCx = num_inputs; + lengthCy = num_outputs; + + set_zero( svd_s_buffer, MAX_OUTPUT_CHANNELS ); + for ( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) + { + set_zero( svd_in_buffer[i], MAX_OUTPUT_CHANNELS ); + set_zero( svd_u_buffer[i], MAX_OUTPUT_CHANNELS ); + set_zero( svd_v_buffer[i], MAX_OUTPUT_CHANNELS ); + } + + /* Decomposition of Cy = Ky*Ky' */ + /* Ky = responses*diag(ener) */ + matrix_diag_product( responses, lengthCy, num_responses, 0, ener, num_responses, Ky ); + + /* Decomposition of Cx -> Computing Kx */ + v_sqrt( Cx_diag, Kx, lengthCx ); + + /* Regularization of Sx */ + maximum( Kx, lengthCx, &limit ); + limit = limit * reg_Sx + EPSILON; + + for ( i = 0; i < lengthCx; ++i ) + { + svd_s_buffer[i] = ( ( Kx[i] > limit ) ? Kx[i] : limit ); + } + + limit = 0.0f; + + /* regularized Kx-1 */ + + for ( i = 0; i < lengthCx; ++i ) + { + float reg_fac = ( 1.0f / svd_s_buffer[i] ); + Kx_reg_inv[i] = reg_fac; + } + + /************************ normalization matrix G hat **********************/ + + /* Computing Q*Cx*Q' */ + matrix_diag_product( Q, lengthCy, lengthCx, 0, Cx_diag, lengthCx, Q_Cx ); + matrix_product_diag( Q_Cx, lengthCy, lengthCx, 0, Q, lengthCy, lengthCx, 1, Cy_hat_diag ); + + /* Computing Cy_hat_diag */ + for ( i = 0; i < lengthCy; ++i ) + { + if ( Cy_hat_diag[i] > limit ) + { + limit = Cy_hat_diag[i]; + } + } + + + limit = limit * reg_ghat + EPSILON; + + /* Computing G_hat */ + for ( i = 0; i < lengthCy; ++i ) + { + if ( limit > Cy_hat_diag[i] ) /* Computing Cy_hat_diag = max(Cy_hat_diag,limit) */ + { + Cy_hat_diag[i] = limit; + } + G_hat[i] = sqrtf( Cy_diag[i] / Cy_hat_diag[i] ); + } + + /************************ Formulate optimal P **********************/ + + /* Computing the input matrix Kx'*Q'*G_hat'*Ky */ + diag_matrix_product( Kx, lengthCx, Q, lengthCy, lengthCx, 1, mat_mult_buffer1 ); + matrix_diag_product( mat_mult_buffer1, lengthCx, lengthCy, 0, G_hat, lengthCy, mat_mult_buffer2 ); + matrix_product( mat_mult_buffer2, lengthCx, lengthCy, 0, Ky, lengthCy, num_responses, 0, mat_mult_buffer1 ); + + if ( lengthCx < num_responses ) + { + mat2svdMat( mat_mult_buffer1, svd_in_buffer, lengthCx, num_responses, 1 ); + nL = num_responses; + nC = lengthCx; + svd( svd_in_buffer, svd_v_buffer, svd_s_buffer, svd_u_buffer, nL, nC ); + } + else + { + mat2svdMat( mat_mult_buffer1, svd_in_buffer, lengthCx, num_responses, 0 ); + nL = lengthCx; + nC = num_responses; + svd( svd_in_buffer, svd_u_buffer, svd_s_buffer, svd_v_buffer, nL, nC ); + } + + /* Actually Processing P */ + + /* can be skipped: lambda is always column-truncated identity matrix, so this operation just truncates V to num_input_channel columns */ + svdMat2mat( svd_v_buffer, mat_mult_buffer1, num_responses, lengthCx ); + svdMat2mat( svd_u_buffer, mat_mult_buffer2, lengthCx, lengthCx ); + + matrix_product( mat_mult_buffer1, num_responses, lengthCx, 0, mat_mult_buffer2, lengthCx, lengthCx, 1, mat_mult_buffer3 ); + + /************************ Formulate M **********************/ + + matrix_product( Ky, lengthCy, num_responses, 0, mat_mult_buffer3, num_responses, lengthCx, 0, mat_mult_buffer1 ); + + matrix_diag_product( mat_mult_buffer1, lengthCy, lengthCx, 0, Kx_reg_inv, lengthCx, mixing_matrix ); + + /*********************** Energy Compensation ****************/ + + /* Compute Cy_tilde = M*Cx*M' */ + matrix_diag_product( mixing_matrix, lengthCy, lengthCx, 0, Cx_diag, lengthCx, mat_mult_buffer1 ); + matrix_product( mat_mult_buffer1, lengthCy, lengthCx, 0, mixing_matrix, lengthCy, lengthCx, 1, mat_mult_buffer2 ); + + if ( energy_compensation_flag == 1 ) + { + adj = svd_s_buffer; + Cy_tilde_p = mat_mult_buffer2; + for ( i = 0; i < lengthCy; ++i ) + { + /* Avoid correction for very small energies, main diagonal elements of Cy_tilde_p may be negative */ + if ( Cy_tilde_p[i + i * lengthCy] < 0.0f ) + { + adj[i] = 1.0f; + } + else + { + adj[i] = sqrtf( Cy_diag[i] / ( Cy_tilde_p[i + i * lengthCy] + EPSILON ) ); + } + + if ( adj[i] > 4.0f ) + { + adj[i] = 4.0f; + } + } + + diag_matrix_product( adj, lengthCy, mixing_matrix, lengthCy, lengthCx, 0, mat_mult_buffer3 ); + + mvr2r( mat_mult_buffer3, mixing_matrix, lengthCy * lengthCx ); + } + + pop_wmops(); + + return out; +} diff --git a/lib_dec/ivas_entropy_decoder.c b/lib_dec/ivas_entropy_decoder.c new file mode 100644 index 0000000000000000000000000000000000000000..360dfbe8708ea9fa8b82fd16e1ae15da2ae4b881 --- /dev/null +++ b/lib_dec/ivas_entropy_decoder.c @@ -0,0 +1,383 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_cnst.h" +#include "ivas_rom_com.h" +#include +#include "wmc_auto.h" + + +/*------------------------------------------------------------------------------------------* + * Static function declarations + *------------------------------------------------------------------------------------------*/ + +static int16_t ivas_huffman_code_bits_present( const int16_t *codebook, const int16_t code, const int16_t bits, const int16_t len ); + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_arith_decode_array() + * + * Arith decoding of an array + *-----------------------------------------------------------------------------------------*/ + +static void ivas_arith_decode_array( + ivas_arith_t *pArith, + Decoder_State *st0, /* i/o: decoder state structure - for bitstream handling*/ + const int16_t in_len, + int16_t *pSymbols ) +{ + int16_t i, ind, model_idx; + int16_t *pCum_freq = NULL; + Tastat as; + int16_t extra_bits_read = 0; + + if ( in_len > 0 && pArith->range > 1 ) + { + if ( pArith->dyn_model_bits > 0 ) + { + model_idx = get_next_indice( st0, pArith->dyn_model_bits ); + + if ( model_idx > 0 ) + { + pCum_freq = pArith->cum_freq[model_idx]; + } + else + { + pCum_freq = pArith->cum_freq[0]; + } + } + else + { + pCum_freq = pArith->cum_freq[0]; + } + + ivas_ari_start_decoding_14bits_ext_1_lfe( st0, &as, &extra_bits_read ); + + for ( i = 0; i < in_len; i++ ) + { + ind = ivas_ari_decode_14bits_bit_ext_1_lfe( st0, &as, (const uint16_t *) pCum_freq, &extra_bits_read ); + + pSymbols[i] = pArith->vals[ind]; + } + + ivas_ari_done_decoding_14bits_ext_1_lfe( st0, extra_bits_read ); + } + else + { + for ( i = 0; i < in_len; i++ ) + { + pSymbols[i] = 0; + } + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function description ivas_arithCoder_decode_array_diff() + * + * Diffrential arith decoding + *-----------------------------------------------------------------------------------------*/ + +static void ivas_arithCoder_decode_array_diff( + ivas_arith_t *pArith, + ivas_arith_t *pArith_diff, + int16_t *pSymbol_old, + const int16_t length, + Decoder_State *st0, /* i/o: decoder state structure - for bitstream handling*/ + int16_t *pOutput_arr ) +{ + int16_t n; + int16_t offset = pArith->vals[0]; + + if ( length > 0 ) + { + ivas_arith_decode_array( pArith_diff, st0, length, pOutput_arr ); + } + + for ( n = 0; n < length; n++ ) + { + pOutput_arr[n] = pSymbol_old[n] - offset + pOutput_arr[n]; + } + + ivas_wrap_arround( pOutput_arr, 0, pArith_diff->range - 1, length ); + + for ( n = 0; n < length; n++ ) + { + pOutput_arr[n] = pArith->vals[pOutput_arr[n]]; + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_huffman_code_bits_present() + * + * Huffman code bits present + *-----------------------------------------------------------------------------------------*/ + +static int16_t ivas_huffman_code_bits_present( + const int16_t *codebook, + const int16_t code, + const int16_t bits, + const int16_t len ) +{ + int16_t index = len + 1; + int16_t i = 0; + int16_t ind_t, code_t, bits_t; + + while ( i < len ) + { + ind_t = codebook[0]; + bits_t = codebook[1]; + code_t = codebook[2]; + if ( ( code == code_t ) && ( bits == bits_t ) ) + { + return ind_t; + } + codebook = codebook + 3; + i++; + } + + return index; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_huffman_decode() + * + * Huffman decoding on the encoded stream + *-----------------------------------------------------------------------------------------*/ + +ivas_error ivas_huffman_decode( + ivas_huffman_cfg_t *huff_cfg, + Decoder_State *st0, /* i/o: decoder state structure - for bitstream handling*/ + int16_t *dec_out ) +{ + int16_t code, num_bits_read, ind, bit; + + code = get_next_indice( st0, huff_cfg->min_len ); + num_bits_read = huff_cfg->min_len; + + ind = ivas_huffman_code_bits_present( huff_cfg->codebook, code, num_bits_read, huff_cfg->sym_len ); + + while ( ind > huff_cfg->sym_len ) + { + bit = get_next_indice( st0, 1 ); + num_bits_read += 1; + code = code << 1 | bit; + ind = ivas_huffman_code_bits_present( huff_cfg->codebook, code, num_bits_read, huff_cfg->sym_len ); + if ( num_bits_read > huff_cfg->max_len ) + { + return IVAS_ERR_INTERNAL; + } + } + *dec_out = ind; + + return IVAS_ERR_OK; +} + + +/*-----------------------------------------------------------------------------------------* + * Function arith_decode_cell_array() + * + * Arithman decoding of cell array + *-----------------------------------------------------------------------------------------*/ + +static void arith_decode_cell_array( + ivas_cell_dim_t *pCell_dims, + Decoder_State *st0, /* i/o: decoder state structure - for bitstream handling*/ + int16_t num_bands, + ivas_arith_t *pArith, + int16_t *pSymbol ) +{ + int16_t total_symbol_len = 0; + int16_t i; + + for ( i = 0; i < num_bands; i++ ) + { + total_symbol_len += ( pCell_dims[i].dim1 * pCell_dims[i].dim2 ); + } + + assert( total_symbol_len <= IVAS_MAX_INPUT_LEN ); + + ivas_arith_decode_array( pArith, st0, total_symbol_len, pSymbol ); + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function arith_decode_cell_array_diff() + * + * Arithman decoding of differential cell array + *-----------------------------------------------------------------------------------------*/ + +static void arith_decode_cell_array_diff( + ivas_cell_dim_t *pCell_dims, + Decoder_State *st0, /* i/o: decoder state structure - for bitstream handling*/ + int16_t num_bands, + ivas_arith_t *pArith, + ivas_arith_t *pArith_diff, + int16_t *pSymbol, + int16_t *pSymbol_old ) +{ + int16_t total_symbol_len = 0; + int16_t i; + + for ( i = 0; i < num_bands; i++ ) + { + total_symbol_len += ( pCell_dims[i].dim1 * pCell_dims[i].dim2 ); + } + + assert( total_symbol_len <= IVAS_MAX_INPUT_LEN ); + + ivas_arithCoder_decode_array_diff( pArith, pArith_diff, pSymbol_old, total_symbol_len, st0, pSymbol ); + + return; +} + +/*-----------------------------------------------------------------------------------------* + * Function ivas_arith_decode_cmplx_cell_array() + * + * Arithman decoding of complex cell array + *-----------------------------------------------------------------------------------------*/ + +void ivas_arith_decode_cmplx_cell_array( + ivas_arith_t *pArith_re, + ivas_arith_t *pArith_re_diff, + Decoder_State *st0, /* i/o: decoder state structure - for bitstream handling*/ + ivas_cell_dim_t *pCell_dims, + int16_t *pDo_diff, + const int16_t num_bands, + int16_t *pSymbol_re, + int16_t *pSymbol_re_old ) +{ + int16_t i, j, len, all_diff = 1, any_diff = 0; + int16_t cell_arr_diff[IVAS_MAX_INPUT_LEN]; + int16_t cell_arr_no_diff[IVAS_MAX_INPUT_LEN]; + int16_t cell_arr_diff_out[IVAS_MAX_INPUT_LEN]; + int16_t idx2 = 0; + + for ( i = 0; i < num_bands; i++ ) + { + if ( pDo_diff[i] != 0 ) + { + any_diff = 1; + } + else + { + all_diff = 0; + } + } + + if ( any_diff == 1 ) + { + if ( all_diff == 1 ) + { + arith_decode_cell_array_diff( pCell_dims, st0, num_bands, pArith_re, pArith_re_diff, pSymbol_re, pSymbol_re_old ); + } + else + { + ivas_cell_dim_t cell_dims[IVAS_MAX_NUM_BANDS]; + ivas_cell_dim_t cell_dims_diff[IVAS_MAX_NUM_BANDS]; + int16_t idx1 = 0, idx = 0; + + for ( i = 0; i < num_bands; i++ ) + { + len = pCell_dims[i].dim1 * pCell_dims[i].dim2; + if ( pDo_diff[i] != 0 ) + { + cell_dims[i].dim1 = 0; + cell_dims[i].dim2 = 0; + + for ( j = 0; j < len; j++ ) + { + cell_arr_diff[idx++] = pSymbol_re_old[idx1++]; + } + + cell_dims_diff[i].dim1 = pCell_dims[i].dim1; + cell_dims_diff[i].dim2 = pCell_dims[i].dim2; + } + else + { + for ( j = 0; j < len; j++ ) + { + cell_arr_diff[idx] = 0; + idx1++; + } + + cell_dims[i].dim1 = pCell_dims[i].dim1; + cell_dims[i].dim2 = pCell_dims[i].dim2; + cell_dims_diff[i].dim1 = 0; + cell_dims_diff[i].dim2 = 0; + } + } + + arith_decode_cell_array( cell_dims, st0, num_bands, pArith_re, cell_arr_no_diff ); + + arith_decode_cell_array_diff( cell_dims_diff, st0, num_bands, pArith_re, pArith_re_diff, cell_arr_diff_out, cell_arr_diff ); + + idx = 0; + idx1 = 0; + for ( i = 0; i < num_bands; i++ ) + { + if ( pDo_diff[i] != 0 ) + { + for ( j = 0; j < cell_dims_diff[i].dim1 * cell_dims_diff[i].dim2; j++ ) + { + pSymbol_re[idx++] = cell_arr_diff_out[idx2++]; + } + } + else + { + for ( j = 0; j < cell_dims[i].dim1 * cell_dims[i].dim2; j++ ) + { + pSymbol_re[idx++] = cell_arr_no_diff[idx1++]; + } + } + } + } + } + else + { + arith_decode_cell_array( pCell_dims, st0, num_bands, pArith_re, pSymbol_re ); + } + + return; +} diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..86643b6462c64b6e3a55e7ce6b8cfcd88b6ea98a --- /dev/null +++ b/lib_dec/ivas_init_dec.c @@ -0,0 +1,2723 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include "options.h" +#include "ivas_cnst.h" +#include "ivas_prot.h" +#include "ivas_prot_rend.h" +#include "ivas_rom_com.h" +#include "ivas_stat_enc.h" +#include "prot.h" +#include +#include +#include +#include "wmc_auto.h" + + +/*-------------------------------------------------------------------* + * Local function prototypes + *-------------------------------------------------------------------*/ + +static ivas_error ivas_read_format( Decoder_Struct *st_ivas, int16_t *num_bits_read ); + +static ivas_error doSanityChecks_IVAS( Decoder_Struct *st_ivas ); + + + +/*-------------------------------------------------------------------* + * ivas_dec_setup() + * + * IVAS decoder setup + *-------------------------------------------------------------------*/ + +ivas_error ivas_dec_setup( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + uint16_t *nSamplesRendered, /* o : number of samples flushed from the previous frame (JBM) */ + int16_t *data /* o : output synthesis signal */ +) +{ + int16_t k, idx, num_bits_read; + int16_t nchan_ism, element_mode_flag; + Decoder_State *st; + int32_t ivas_total_brate; + ivas_error error; + + error = IVAS_ERR_OK; + + num_bits_read = 0; + element_mode_flag = 0; + + ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; + + /*-------------------------------------------------------------------* + * Read IVAS format + *-------------------------------------------------------------------*/ + + ivas_read_format( st_ivas, &num_bits_read ); + + /*-------------------------------------------------------------------* + * Read other signling (ISM/MC mode, number of channels, etc.) + *-------------------------------------------------------------------*/ + + if ( is_DTXrate( ivas_total_brate ) == 0 ) + { + /*-------------------------------------------------------------------* + * Read IVAS format related signaling: + * - in ISM : read number of objects + * - in SBA : read SBA planar flag and SBA order + * - in MASA : read number of TC + * - in MC : read LS setup + *-------------------------------------------------------------------*/ + + if ( st_ivas->ivas_format == STEREO_FORMAT ) + { + element_mode_flag = 1; + } + else if ( st_ivas->ivas_format == ISM_FORMAT ) + { + /* read the number of objects */ + st_ivas->nchan_transport = 1; + nchan_ism = 1; + k = (int16_t) ( ( ivas_total_brate / FRAMES_PER_SEC ) - 1 ); + while ( st_ivas->bit_stream[k] && nchan_ism < MAX_NUM_OBJECTS ) + { + nchan_ism++; + k--; + } + + st_ivas->nchan_ism = nchan_ism; + + if ( ( error = ivas_ism_dec_config( st_ivas, st_ivas->ism_mode, nSamplesRendered, data ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->ivas_format == SBA_FORMAT ) + { + /* read Ambisonic (SBA) planar flag */ + st_ivas->sba_planar = st_ivas->bit_stream[num_bits_read]; + num_bits_read += SBA_PLANAR_BITS; + + /* read Ambisonic (SBA) order */ + st_ivas->sba_order = st_ivas->bit_stream[num_bits_read + 1]; + st_ivas->sba_order += 2 * st_ivas->bit_stream[num_bits_read]; + + /* set Ambisonic (SBA) order used for analysis and coding */ + st_ivas->sba_analysis_order = ivas_sba_get_analysis_order( ivas_total_brate, st_ivas->sba_order ); + + num_bits_read += SBA_ORDER_BITS; + if ( st_ivas->ini_frame > 0 && ivas_total_brate != st_ivas->last_active_ivas_total_brate && ivas_total_brate > IVAS_SID_5k2 ) + { + if ( ( error = ivas_sba_dec_reconfigure( st_ivas, nSamplesRendered, data ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + ivas_sba_config( ivas_total_brate, st_ivas->sba_analysis_order, -1, &( st_ivas->nchan_transport ), st_ivas->sba_planar, &st_ivas->nSCE, &st_ivas->nCPE, &st_ivas->element_mode_init ); + } + } + else if ( st_ivas->ivas_format == MASA_FORMAT ) + { + /* read number of MASA transport channels */ + if ( st_ivas->bit_stream[( ivas_total_brate / FRAMES_PER_SEC ) - 1] ) + { + st_ivas->nchan_transport = 2; + element_mode_flag = 1; + } + else + { + st_ivas->nchan_transport = 1; + } + + if ( st_ivas->ini_frame > 0 ) + { + /* reconfigure in case a change of operation mode is detected */ + if ( ( ivas_total_brate > IVAS_SID_5k2 && ivas_total_brate != st_ivas->hDecoderConfig->last_ivas_total_brate ) || ( st_ivas->ini_active_frame == 0 ) ) + { + if ( st_ivas->last_ivas_format == MASA_FORMAT ) + { + if ( st_ivas->ini_active_frame == 0 && ivas_total_brate != FRAME_NO_DATA && ivas_total_brate < MASA_STEREO_MIN_BITRATE && st_ivas->nCPE == 1 ) + { + st_ivas->hCPE[0]->nchan_out = 1; + } + else + { + + if ( ( error = ivas_masa_dec_reconfigure( st_ivas, nSamplesRendered, data ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + else + { + if ( ( error = ivas_omasa_dec_config( st_ivas, nSamplesRendered, data ) ) != IVAS_ERR_OK ) + + { + return error; + } + } + } + } + } + else if ( st_ivas->ivas_format == MASA_ISM_FORMAT ) + { + st_ivas->nchan_transport = 2; /* always 2 MASA transport channels */ + + /* for the DISC mode the number of objects are written at the end of the bitstream, in the MASA metadata */ + st_ivas->nchan_ism = 2 * st_ivas->bit_stream[ivas_total_brate / FRAMES_PER_SEC - 1] + st_ivas->bit_stream[ivas_total_brate / FRAMES_PER_SEC - 2] + 1; + st_ivas->ism_mode = ivas_omasa_ism_mode_select( ivas_total_brate, st_ivas->nchan_ism ); + + if ( st_ivas->ini_frame > 0 ) + { + /* reconfigure in case a change of operation mode is detected */ + if ( ( ivas_total_brate > IVAS_SID_5k2 && ivas_total_brate != st_ivas->hDecoderConfig->last_ivas_total_brate ) || ( st_ivas->ini_active_frame == 0 ) ) + { + if ( ( error = ivas_omasa_dec_config( st_ivas, nSamplesRendered, data ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + } + else if ( st_ivas->ivas_format == SBA_ISM_FORMAT ) + { + /* the number of objects is written at the end of the bitstream, in the SBA metadata */ + st_ivas->nchan_ism = 2 * st_ivas->bit_stream[ivas_total_brate / FRAMES_PER_SEC - 1] + st_ivas->bit_stream[ivas_total_brate / FRAMES_PER_SEC - 2] + 1; + + if ( ivas_total_brate < IVAS_24k4 || ivas_total_brate >= IVAS_256k ) + { + /* read Ambisonic (SBA) planar flag */ + st_ivas->sba_planar = st_ivas->bit_stream[num_bits_read]; + num_bits_read += SBA_PLANAR_BITS; + } + + st_ivas->sba_order = st_ivas->bit_stream[num_bits_read + 1]; + st_ivas->sba_order += 2 * st_ivas->bit_stream[num_bits_read]; + num_bits_read += SBA_ORDER_BITS; + + /* read Ambisonic (SBA) order */ + if ( ivas_total_brate < IVAS_256k ) + { + st_ivas->sba_order = 3; + } + + if ( st_ivas->ini_frame > 0 && ivas_total_brate != st_ivas->last_active_ivas_total_brate ) + { + if ( ( error = ivas_sba_dec_reconfigure( st_ivas, nSamplesRendered, data ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + /* set Ambisonic (SBA) order used for analysis and coding */ + st_ivas->sba_analysis_order = ivas_sba_get_analysis_order( ivas_total_brate, st_ivas->sba_order ); + + ivas_sba_config( ivas_total_brate, st_ivas->sba_analysis_order, -1, &( st_ivas->nchan_transport ), st_ivas->sba_planar, &st_ivas->nSCE, &st_ivas->nCPE, &st_ivas->element_mode_init ); + + /*correct number of CPEs for discrete ISM coding*/ + if ( st_ivas->ini_frame > 0 && st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + { + st_ivas->nCPE += ( st_ivas->nchan_ism + 1 ) >> 1; + } + } + + if ( ivas_total_brate >= IVAS_256k ) + { + st_ivas->ism_mode = ISM_SBA_MODE_DISC; + } + else + { + st_ivas->ism_mode = ISM_MODE_NONE; + } + } + else if ( st_ivas->ivas_format == MC_FORMAT ) + { + /* read MC configuration */ + idx = 0; + for ( k = 0; k < MC_LS_SETUP_BITS; k++ ) + { + if ( st_ivas->bit_stream[num_bits_read + k] ) + { + idx += 1 << ( MC_LS_SETUP_BITS - 1 - k ); + } + } + num_bits_read += MC_LS_SETUP_BITS; + + /* select MC format mode; reconfigure the MC format decoder */ + if ( ( error = ivas_mc_dec_config( st_ivas, idx, nSamplesRendered, data ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /*-------------------------------------------------------------------* + * Read element mode + *-------------------------------------------------------------------*/ + + if ( st_ivas->ini_frame == 0 && element_mode_flag ) + { + /* read stereo technology info */ + if ( ivas_total_brate < MIN_BRATE_MDCT_STEREO ) + { + /* 1 bit */ + if ( st_ivas->bit_stream[num_bits_read] ) + { + st_ivas->element_mode_init = 1 + IVAS_CPE_DFT; + } + else + { + st_ivas->element_mode_init = 0 + IVAS_CPE_DFT; + } + } + else + { + st_ivas->element_mode_init = IVAS_CPE_MDCT; + } + } + } + else if ( ivas_total_brate == IVAS_SID_5k2 ) + { + switch ( st_ivas->sid_format ) + { + case SID_DFT_STEREO: + st_ivas->element_mode_init = IVAS_CPE_DFT; + break; + case SID_MDCT_STEREO: + st_ivas->element_mode_init = IVAS_CPE_MDCT; + break; + case SID_ISM: + st_ivas->element_mode_init = IVAS_SCE; + break; + case SID_MASA_1TC: + st_ivas->element_mode_init = IVAS_SCE; + st_ivas->nchan_transport = 1; + break; + case SID_MASA_2TC: + if ( st_ivas->bit_stream[ivas_total_brate / FRAMES_PER_SEC - 1 - SID_FORMAT_NBITS] == 1 ) + { + st_ivas->element_mode_init = IVAS_CPE_MDCT; + } + else + { + st_ivas->element_mode_init = IVAS_CPE_DFT; + } + st_ivas->nchan_transport = 2; + break; + case SID_SBA_1TC: + st_ivas->element_mode_init = IVAS_SCE; + break; + case SID_SBA_2TC: + st_ivas->element_mode_init = IVAS_CPE_MDCT; + break; + } + + if ( st_ivas->ini_frame > 0 && st_ivas->ivas_format == SBA_FORMAT ) + { + int16_t nchan_transport_old, nchan_transport; + nchan_transport_old = st_ivas->nchan_transport; + nchan_transport = ( st_ivas->sid_format == SID_SBA_2TC ) ? 2 : 1; + + if ( ( nchan_transport_old != nchan_transport ) ) + { + /*Setting the default bitrate for the reconfig function*/ + if ( st_ivas->sid_format == SID_SBA_2TC ) + { + st_ivas->hDecoderConfig->ivas_total_brate = IVAS_48k; + } + else + { + st_ivas->hDecoderConfig->ivas_total_brate = IVAS_24k4; + } + + if ( ( error = ivas_sba_dec_reconfigure( st_ivas, nSamplesRendered, data ) ) != IVAS_ERR_OK ) + { + return error; + } + + st_ivas->last_active_ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; + st_ivas->hDecoderConfig->ivas_total_brate = ivas_total_brate; + } + } + + if ( st_ivas->ini_frame == 0 && st_ivas->ivas_format == ISM_FORMAT ) + { + /* read the number of objects */ + st_ivas->nchan_transport = 1; + nchan_ism = 1; + k = (int16_t) ( ( ivas_total_brate / FRAMES_PER_SEC ) - 1 ) - SID_FORMAT_NBITS; + while ( st_ivas->bit_stream[k] && nchan_ism < MAX_NUM_OBJECTS ) + { + nchan_ism++; + k--; + } + k--; + + st_ivas->nchan_ism = nchan_ism; + + /* read ism_mode */ + st_ivas->ism_mode = ISM_MODE_DISC; + if ( nchan_ism > 2 ) + { + k -= nchan_ism; /* SID metadata flags */ + idx = st_ivas->bit_stream[k]; + st_ivas->ism_mode = (ISM_MODE) ( idx + 1 ); + } + + if ( ( error = ivas_ism_dec_config( st_ivas, st_ivas->ism_mode, nSamplesRendered, data ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + + /*-------------------------------------------------------------------* + * Initialize decoder in the first good frame based on IVAS format + * and number of transport channels + *-------------------------------------------------------------------*/ + + if ( st_ivas->ini_frame == 0 && st_ivas->ivas_format != UNDEFINED_FORMAT ) + { + if ( ( error = doSanityChecks_IVAS( st_ivas ) ) != IVAS_ERR_OK ) + { + return IVAS_ERROR( error, "Sanity checks failed" ); + } + + if ( ( error = ivas_init_decoder( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + + /*----------------------------------------------------------------* + * Reset bitstream pointers + *----------------------------------------------------------------*/ + + ivas_set_bitstream_pointers( st_ivas ); + + reset_elements( st_ivas ); + + /* update bitstream buffer pointer -> take into account already read bits */ + if ( ( st_ivas->nSCE > 0 ) || ( st_ivas->nCPE > 0 ) ) + { + st = ( st_ivas->nSCE > 0 ) ? st_ivas->hSCE[0]->hCoreCoder[0] : st_ivas->hCPE[0]->hCoreCoder[0]; + st->next_bit_pos = num_bits_read; + st->total_brate = ACELP_8k00; /* only temporary initialization - this is needed for get_next_indice() in the frame following NO_DATA frame */ + } + + return error; +} + + +/*-------------------------------------------------------------------* + * ivas_read_format() + * + * Read IVAS format signaling + *-------------------------------------------------------------------*/ + +static ivas_error ivas_read_format( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + int16_t *num_bits_read /* o : number of IVAS signaling bits read from the bitstream */ +) +{ + int16_t k, idx; + int32_t ivas_total_brate; + ivas_error error; + + error = IVAS_ERR_OK; + + ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; + + *num_bits_read = 0; + + if ( !st_ivas->bfi && is_DTXrate( ivas_total_brate ) == 0 ) + { + /* read IVAS format */ + k = 0; + if ( st_ivas->bit_stream[*num_bits_read] ) + { + k = 1; + } + k <<= 1; + ( *num_bits_read )++; + + if ( st_ivas->bit_stream[*num_bits_read] ) + { + k += 1; + } + ( *num_bits_read )++; + + switch ( k ) + { + case 0: + st_ivas->ivas_format = STEREO_FORMAT; + break; + case 1: + st_ivas->ivas_format = MC_FORMAT; + break; + case 2: + st_ivas->ivas_format = ISM_FORMAT; + + if ( ivas_total_brate >= IVAS_24k4 ) + { + if ( st_ivas->bit_stream[*num_bits_read] ) + { + ( *num_bits_read )++; + if ( st_ivas->bit_stream[*num_bits_read] ) + { + st_ivas->ivas_format = SBA_ISM_FORMAT; + } + else + { + st_ivas->ivas_format = MASA_ISM_FORMAT; + } + } + + ( *num_bits_read )++; + } + break; + case 3: + if ( st_ivas->bit_stream[*num_bits_read] ) + { + st_ivas->ivas_format = MASA_FORMAT; + } + else + { + st_ivas->ivas_format = SBA_FORMAT; + /* read Ambisonic (SBA) planar flag */ + st_ivas->sba_planar = st_ivas->bit_stream[( *num_bits_read ) + 1]; + + /* read Ambisonic (SBA) order */ + st_ivas->sba_order = st_ivas->bit_stream[( *num_bits_read ) + 2 + SBA_PLANAR_BITS]; + st_ivas->sba_order += 2 * st_ivas->bit_stream[( *num_bits_read ) + 1 + SBA_PLANAR_BITS]; + if ( st_ivas->sba_order == 0 ) + { + st_ivas->ivas_format = SBA_ISM_FORMAT; + } + } + ( *num_bits_read )++; + + break; + } + } + else if ( !st_ivas->bfi && ivas_total_brate == IVAS_SID_5k2 ) + { + /* read IVAS format in SID frame */ + idx = 0; + for ( k = 0; k < SID_FORMAT_NBITS; k++ ) + { + idx += st_ivas->bit_stream[k] << ( SID_FORMAT_NBITS - 1 - k ); + } + + ( *num_bits_read ) += SID_FORMAT_NBITS; + st_ivas->sid_format = idx; + + switch ( idx ) + { + case SID_DFT_STEREO: + case SID_MDCT_STEREO: + st_ivas->ivas_format = STEREO_FORMAT; + break; + case SID_ISM: + st_ivas->ivas_format = ISM_FORMAT; + + break; + case SID_MULTICHANNEL: + st_ivas->ivas_format = MC_FORMAT; + break; + case SID_SBA_1TC: + st_ivas->ivas_format = SBA_FORMAT; + st_ivas->element_mode_init = IVAS_SCE; + break; + case SID_SBA_2TC: + st_ivas->ivas_format = SBA_FORMAT; + st_ivas->element_mode_init = IVAS_CPE_MDCT; + break; + case SID_MASA_1TC: + st_ivas->ivas_format = MASA_FORMAT; + st_ivas->element_mode_init = IVAS_SCE; + break; + case SID_MASA_2TC: + st_ivas->ivas_format = MASA_FORMAT; + if ( st_ivas->bit_stream[ivas_total_brate / FRAMES_PER_SEC - 1] == 1 ) + { + st_ivas->element_mode_init = IVAS_CPE_MDCT; + } + else + { + st_ivas->element_mode_init = IVAS_CPE_DFT; + } + break; + default: + /* This should actually be impossible, since only 3 bits are read, so if this happens something is broken */ + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Invalid value %c found in SID format field.", st_ivas->sid_format ); + } + + if ( st_ivas->ivas_format == SBA_FORMAT ) + { + if ( st_ivas->sba_analysis_order == 0 ) + { + st_ivas->sba_analysis_order = SBA_FOA_ORDER; + } + } + + /* reset bitstream handle to avoid BER detection after reading the 2400 kbps for ch0 */ + st_ivas->bit_stream += ( *num_bits_read ); + ( *num_bits_read ) = 0; + } + else + { + /* In SID/NO_DATA frames, use the previous frame IVAS format */ + } + + return error; +} + + +/*-------------------------------------------------------------------* + * getNumChanSynthesis() + * + * get number of output channels used for synthesis/decoding + * (often different from number of output channels!) + *-------------------------------------------------------------------*/ + +/*! r: number of channels to be synthesised */ +int16_t getNumChanSynthesis( + Decoder_Struct *st_ivas /* i : IVAS decoder structure */ +) +{ + int16_t n; + + n = st_ivas->nSCE + CPE_CHANNELS * st_ivas->nCPE; + + if ( st_ivas->sba_dirac_stereo_flag ) + { + n = CPE_CHANNELS; +#if 0 + /* TODO wkr: this is actually a correct bugfix for OSBA, it is disabled for now to pass the pipelines in the OSBA JBM branch */ + if ( st_ivas->ivas_format == SBA_ISM_FORMAT && st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + { + n += st_ivas->nchan_ism; + } +#endif + } + else if ( ( st_ivas->hMCT != NULL || st_ivas->ivas_format == SBA_FORMAT ) && st_ivas->ivas_format != SBA_ISM_FORMAT ) + { + n = st_ivas->nchan_transport; + } + else if ( st_ivas->ivas_format == SBA_ISM_FORMAT ) + { + if ( st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + { + n = st_ivas->nchan_transport + st_ivas->nchan_ism; + } + else + { + n = st_ivas->nchan_transport; + } + } + + return n; +} + + +/*-------------------------------------------------------------------* + * copy_decoder_config() + * + * Copy IVAS configuration structure to the CoreCoder state structure + *-------------------------------------------------------------------*/ + +void copy_decoder_config( + Decoder_Struct *st_ivas, /* i : IVAS decoder structure */ + Decoder_State *st /* o : decoder state structure */ +) +{ + st->output_Fs = st_ivas->hDecoderConfig->output_Fs; + st->Opt_AMR_WB = st_ivas->hDecoderConfig->Opt_AMR_WB; + st->codec_mode = st_ivas->codec_mode; + st->ini_frame = st_ivas->ini_frame; + + st->bfi = st_ivas->bfi; + + st->writeFECoffset = st_ivas->writeFECoffset; + + st->element_mode = st_ivas->element_mode_init; + + return; +} + + +/*-------------------------------------------------------------------* + * ivas_init_decoder_front() + * + * Set decoder parameters to initial values + *-------------------------------------------------------------------*/ + +ivas_error ivas_init_decoder_front( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +) +{ + ivas_error error; + + error = IVAS_ERR_OK; + + /*-----------------------------------------------------------------* + * Resets + *-----------------------------------------------------------------*/ + + st_ivas->nSCE = 0; + st_ivas->nCPE = 0; + st_ivas->nchan_transport = -1; + + st_ivas->ism_mode = ISM_MODE_NONE; + st_ivas->mc_mode = MC_MODE_NONE; + + st_ivas->sba_dirac_stereo_flag = 0; + + /* HRTF binauralization latency in ns */ + st_ivas->binaural_latency_ns = 0; + + /*-------------------------------------------------------------------* + * Allocate and initialize Custom loudspeaker layout handle + *--------------------------------------------------------------------*/ + + if ( st_ivas->hDecoderConfig->Opt_LsCustom ) + { + if ( ( error = ivas_ls_custom_open( &( st_ivas->hLsSetupCustom ) ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /*-------------------------------------------------------------------* + * Allocate and initialize Head-Tracking handle + *--------------------------------------------------------------------*/ + + if ( st_ivas->hDecoderConfig->Opt_Headrotation ) + { + if ( ( error = ivas_headTrack_open( &( st_ivas->hHeadTrackData ) ) ) != IVAS_ERR_OK ) + { + return error; + } + if ( ( error = ivas_orient_trk_SetTrackingType( st_ivas->hHeadTrackData->OrientationTracker, st_ivas->hDecoderConfig->orientation_tracking ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /*-------------------------------------------------------------------* + * Allocate and initialize external orientation handle + *--------------------------------------------------------------------*/ + + if ( st_ivas->hDecoderConfig->Opt_ExternalOrientation ) + { + if ( ( error = ivas_external_orientation_open( &( st_ivas->hExtOrientationData ), ( st_ivas->hDecoderConfig->Opt_5ms ) ? 1 : MAX_PARAM_SPATIAL_SUBFRAMES ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /*-------------------------------------------------------------------* + * Allocate and initialize combined orientation handle + *--------------------------------------------------------------------*/ + + if ( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation ) + { + if ( ( error = ivas_combined_orientation_open( &( st_ivas->hCombinedOrientationData ), ( st_ivas->hDecoderConfig->Opt_5ms ) ? 1 : MAX_PARAM_SPATIAL_SUBFRAMES ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /*-------------------------------------------------------------------* + * Allocate HRTF binary handle + *--------------------------------------------------------------------*/ + + if ( st_ivas->hDecoderConfig->Opt_HRTF_binary ) + { + if ( ( error = ivas_HRTF_binary_open( &( st_ivas->hHrtfTD ) ) ) != IVAS_ERR_OK ) + { + return error; + } + if ( ( error = ivas_HRTF_CRend_binary_open( &( st_ivas->hSetOfHRTF ) ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = ivas_HRTF_fastconv_binary_open( &st_ivas->hHrtfFastConv ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = ivas_HRTF_parambin_binary_open( &st_ivas->hHrtfParambin ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /*-------------------------------------------------------------------* + * Allocate and initialize Binaural Renderer configuration handle + *--------------------------------------------------------------------*/ + + if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL || st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR || st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB + ) + { + if ( ( error = ivas_render_config_open( &( st_ivas->hRenderConfig ) ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = ivas_render_config_init_from_rom( &st_ivas->hRenderConfig ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + return error; +} + + +/*-------------------------------------------------------------------* + * ivas_init_decoder() + * + * Initialize IVAS decoder state structure + *-------------------------------------------------------------------*/ + +ivas_error ivas_init_decoder( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +) +{ + int16_t i, n, k; + int16_t sce_id, cpe_id; + int16_t numCldfbAnalyses, numCldfbSyntheses; + int16_t granularity, n_channels_transport_jbm; + int32_t output_Fs, ivas_total_brate; + int32_t binauralization_delay_ns; + AUDIO_CONFIG output_config; + DECODER_CONFIG_HANDLE hDecoderConfig; + ivas_error error; + int32_t ism_total_brate; + + error = IVAS_ERR_OK; + + output_Fs = st_ivas->hDecoderConfig->output_Fs; + hDecoderConfig = st_ivas->hDecoderConfig; + output_config = hDecoderConfig->output_config; + ivas_total_brate = hDecoderConfig->ivas_total_brate; + + hDecoderConfig->last_ivas_total_brate = ivas_total_brate; + st_ivas->last_active_ivas_total_brate = ivas_total_brate; + + /*-----------------------------------------------------------------* + * Set number of output channels for EXTERNAL output config. + *-----------------------------------------------------------------*/ + + if ( output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) + { + if ( st_ivas->ivas_format == SBA_ISM_FORMAT ) + { + hDecoderConfig->nchan_out = audioCfg2channels( IVAS_AUDIO_CONFIG_HOA3 ); + hDecoderConfig->nchan_out += st_ivas->nchan_ism; + } + else if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC ) + { + hDecoderConfig->nchan_out = st_ivas->nchan_transport + st_ivas->nchan_ism; + } + else if ( !( st_ivas->ism_mode == ISM_MODE_PARAM ) ) + { + hDecoderConfig->nchan_out = st_ivas->nchan_transport; + } + + st_ivas->hOutSetup.nchan_out_woLFE = hDecoderConfig->nchan_out; + } + + /*-----------------------------------------------------------------* + * Set output and intern setup & renderer selection + *-----------------------------------------------------------------*/ + + st_ivas->intern_config = output_config; + + ivas_output_init( &( st_ivas->hOutSetup ), output_config ); + + if ( st_ivas->ivas_format == SBA_ISM_FORMAT && output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) + { + st_ivas->hOutSetup.ambisonics_order = SBA_HOA3_ORDER; + st_ivas->intern_config = IVAS_AUDIO_CONFIG_7_1_4; + st_ivas->hOutSetup.output_config = st_ivas->intern_config; + st_ivas->hOutSetup.nchan_out_woLFE = audioCfg2channels( st_ivas->intern_config ); + } + + if ( st_ivas->ivas_format == SBA_ISM_FORMAT && output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) + { + st_ivas->hOutSetup.ambisonics_order = SBA_HOA3_ORDER; + st_ivas->intern_config = IVAS_AUDIO_CONFIG_HOA3; + st_ivas->hOutSetup.output_config = IVAS_AUDIO_CONFIG_HOA3; + st_ivas->hOutSetup.nchan_out_woLFE = audioCfg2channels( IVAS_AUDIO_CONFIG_HOA3 ); + } + + /* Only initialize transport setup if it is used */ + if ( st_ivas->transport_config != IVAS_AUDIO_CONFIG_INVALID ) + { + ivas_output_init( &( st_ivas->hTransSetup ), st_ivas->transport_config ); + } + + if ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCMASA ) + { + ivas_mcmasa_setNumTransportChannels( &( st_ivas->nchan_transport ), &( st_ivas->element_mode_init ), ivas_total_brate ); + + ivas_mcmasa_set_separate_channel_mode( &( st_ivas->hOutSetup.separateChannelEnabled ), &( st_ivas->hOutSetup.separateChannelIndex ), ivas_total_brate ); + } + + ivas_renderer_select( st_ivas ); + + if ( output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM ) + { + if ( ( error = ivas_ls_custom_output_init( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + ivas_output_init( &( st_ivas->hIntSetup ), st_ivas->intern_config ); + + if ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCMASA ) + { + ivas_mcmasa_set_separate_channel_mode( &( st_ivas->hIntSetup.separateChannelEnabled ), &( st_ivas->hIntSetup.separateChannelIndex ), ivas_total_brate ); + + if ( st_ivas->hOutSetup.output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM && st_ivas->hOutSetup.separateChannelEnabled ) + { + st_ivas->hLsSetupCustom->separate_ch_found = 0; + if ( st_ivas->hOutSetup.nchan_out_woLFE >= MCMASA_MIN_SPEAKERS_SEPARATE_CENTER ) + { + /* check for a speaker at (0, 0) if minimum speaker count is available */ + for ( i = 0; i < st_ivas->hOutSetup.nchan_out_woLFE; i++ ) + { + if ( st_ivas->hOutSetup.ls_azimuth[i] == 0.0f && st_ivas->hOutSetup.ls_elevation[i] == 0.0f ) + { + st_ivas->hIntSetup.separateChannelIndex = i; + st_ivas->hLsSetupCustom->separate_ch_found = 1; + break; + } + } + } + } + } + + + /*-----------------------------------------------------------------* + * Allocate and initialize SCE/CPE and other handles + *-----------------------------------------------------------------*/ + + if ( st_ivas->ivas_format == MONO_FORMAT ) + { + st_ivas->nSCE = 1; /* in mono, there is always only one SCE */ + st_ivas->nCPE = 0; + st_ivas->nchan_transport = 1; + sce_id = 0; + + if ( ( error = create_sce_dec( st_ivas, sce_id, ivas_total_brate ) ) != IVAS_ERR_OK ) + { + return error; + } + + reset_indices_dec( st_ivas->hSCE[sce_id]->hCoreCoder[0] ); + } + else if ( st_ivas->ivas_format == STEREO_FORMAT ) + { + st_ivas->nchan_transport = CPE_CHANNELS; + st_ivas->intern_config = IVAS_AUDIO_CONFIG_STEREO; + + st_ivas->nSCE = 0; + st_ivas->nCPE = 1; /* in stereo, there is always only one CPE */ + cpe_id = 0; + + if ( ( error = create_cpe_dec( st_ivas, cpe_id, ivas_total_brate ) ) != IVAS_ERR_OK ) + { + return error; + } + + for ( n = 0; n < st_ivas->nchan_transport; n++ ) + { + reset_indices_dec( st_ivas->hCPE[cpe_id]->hCoreCoder[n] ); + } + + /* init EFAP for custom LS output and set hTransSetup */ + if ( output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM ) + { + if ( ( error = efap_init_data( &( st_ivas->hEFAPdata ), st_ivas->hOutSetup.ls_azimuth, st_ivas->hOutSetup.ls_elevation, st_ivas->hOutSetup.nchan_out_woLFE, EFAP_MODE_EFAP ) ) != IVAS_ERR_OK ) + { + return error; + } + + ivas_output_init( &( st_ivas->hTransSetup ), IVAS_AUDIO_CONFIG_STEREO ); + } + } + else if ( st_ivas->ivas_format == ISM_FORMAT ) + { + int32_t element_brate_tmp[MAX_NUM_OBJECTS]; + + st_ivas->nSCE = st_ivas->nchan_transport; /* "st_ivas->nchan_transport" is known from ivas_dec_setup */ + st_ivas->nCPE = 0; + st_ivas->ism_extmeta_active = -1; + st_ivas->ism_extmeta_cnt = 0; + + if ( st_ivas->ism_mode == ISM_MODE_PARAM ) + { + st_ivas->nchan_transport = MAX_PARAM_ISM_WAVE; + st_ivas->nSCE = MAX_PARAM_ISM_WAVE; + + if ( ( error = ivas_param_ism_dec_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( ( error = ivas_ism_metadata_dec_create( st_ivas, st_ivas->nSCE, element_brate_tmp ) ) != IVAS_ERR_OK ) + { + return error; + } + + for ( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) + { + if ( ( error = create_sce_dec( st_ivas, sce_id, element_brate_tmp[sce_id] ) ) != IVAS_ERR_OK ) + { + return error; + } + + reset_indices_dec( st_ivas->hSCE[sce_id]->hCoreCoder[0] ); + + st_ivas->hSCE[sce_id]->hCoreCoder[0]->is_ism_format = 1; + } + + st_ivas->hISMDTX.sce_id_dtx = 0; + + if ( st_ivas->ism_mode == ISM_MODE_PARAM ) + { + st_ivas->hSCE[1]->hCoreCoder[0]->hFdCngDec->hFdCngCom->seed3 = st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->seed2; + } + } + else if ( st_ivas->ivas_format == SBA_FORMAT ) + { + if ( ( error = ivas_qmetadata_open( &( st_ivas->hQMetaData ) ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = ivas_spar_dec_open( st_ivas, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_DEC && st_ivas->hOutSetup.is_loudspeaker_setup ) + { + if ( ( error = ivas_sba_get_hoa_dec_matrix( st_ivas->hOutSetup, &st_ivas->hoa_dec_mtx, st_ivas->hIntSetup.ambisonics_order ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( ( error = ivas_dirac_sba_config( st_ivas->hQMetaData, &st_ivas->element_mode_init, ivas_total_brate, st_ivas->sba_analysis_order, ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ) ? IVAS_MAX_NUM_BANDS : ( IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND ) ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( hDecoderConfig->output_config != IVAS_AUDIO_CONFIG_FOA && st_ivas->hDecoderConfig->output_config != IVAS_AUDIO_CONFIG_STEREO && st_ivas->hDecoderConfig->output_config != IVAS_AUDIO_CONFIG_MONO ) + { + if ( ( error = ivas_dirac_dec_config( st_ivas, DIRAC_OPEN ) ) != IVAS_ERR_OK ) + { + return error; + } + + st_ivas->hSpar->enc_param_start_band = st_ivas->hDirAC->hConfig->enc_param_start_band; + } + else + { + int16_t band_grouping[IVAS_MAX_NUM_BANDS + 1]; + + st_ivas->hSpar->enc_param_start_band = min( IVAS_MAX_NUM_BANDS, SPAR_DIRAC_SPLIT_START_BAND ); + if ( ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ) ) + { + st_ivas->hSpar->enc_param_start_band = 0; + + set_c( (int8_t *) st_ivas->hQMetaData->twoDirBands, (int8_t) 1, st_ivas->hQMetaData->q_direction[0].cfg.nbands ); + st_ivas->hQMetaData->numTwoDirBands = (uint8_t) st_ivas->hQMetaData->q_direction[0].cfg.nbands; + } + + ivas_dirac_config_bands( band_grouping, IVAS_MAX_NUM_BANDS, (int16_t) ( st_ivas->hDecoderConfig->output_Fs * INV_CLDFB_BANDWIDTH + 0.5f ), + st_ivas->hSpar->dirac_to_spar_md_bands, st_ivas->hQMetaData->useLowerBandRes, st_ivas->hSpar->enc_param_start_band, 0 ); + } + st_ivas->sba_dirac_stereo_flag = ivas_get_sba_dirac_stereo_flag( st_ivas ); + + for ( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) + { + if ( ( error = create_sce_dec( st_ivas, sce_id, ivas_total_brate / st_ivas->nchan_transport ) ) != IVAS_ERR_OK ) + { + return error; + } + + reset_indices_dec( st_ivas->hSCE[sce_id]->hCoreCoder[0] ); + } + + for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) + { + if ( ( error = create_cpe_dec( st_ivas, cpe_id, ( ivas_total_brate / st_ivas->nchan_transport ) * CPE_CHANNELS ) ) != IVAS_ERR_OK ) + { + return error; + } + + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + reset_indices_dec( st_ivas->hCPE[cpe_id]->hCoreCoder[n] ); + } + } + + /* create CPE element for DFT Stereo like upmix */ + if ( st_ivas->sba_dirac_stereo_flag && st_ivas->nCPE == 0 ) + { + if ( ( error = create_cpe_dec( st_ivas, cpe_id, ivas_total_brate / ( st_ivas->nSCE + st_ivas->nCPE ) ) ) != IVAS_ERR_OK ) + { + return error; + } + + st_ivas->hCPE[0]->hCoreCoder[0] = st_ivas->hSCE[0]->hCoreCoder[0]; /* don't allocate unnecessary core coder, simply point to core coder of SCE element */ + st_ivas->hCPE[0]->hCoreCoder[1] = NULL; + } + + if ( st_ivas->nCPE > 1 ) + { + if ( ( error = create_mct_dec( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* set CNA/CNG flags */ + ivas_sba_set_cna_cng_flag( st_ivas ); + } + else if ( st_ivas->ivas_format == MASA_FORMAT ) + { + /* if we start in ISM_MODE_NONE in MASA_ISM, that appears as normal MASA, but we may change to a mode with ISMs */ + st_ivas->ism_extmeta_active = -1; + st_ivas->ism_extmeta_cnt = 0; + if ( ( error = ivas_qmetadata_open( &( st_ivas->hQMetaData ) ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = ivas_masa_dec_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( st_ivas->renderer_type == RENDERER_DIRAC || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) + { + if ( ( error = ivas_dirac_dec_config( st_ivas, DIRAC_OPEN ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + for ( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) + { + if ( ( error = create_sce_dec( st_ivas, sce_id, ivas_total_brate / st_ivas->nchan_transport ) ) != IVAS_ERR_OK ) + { + return error; + } + + reset_indices_dec( st_ivas->hSCE[sce_id]->hCoreCoder[0] ); + } + + for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) + { + if ( ( error = create_cpe_dec( st_ivas, cpe_id, ( ivas_total_brate / st_ivas->nchan_transport ) * CPE_CHANNELS ) ) != IVAS_ERR_OK ) + { + return error; + } + + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + reset_indices_dec( st_ivas->hCPE[cpe_id]->hCoreCoder[n] ); + } + } + + /* set CNA/CNG flags */ + ivas_sba_set_cna_cng_flag( st_ivas ); + } + else if ( st_ivas->ivas_format == SBA_ISM_FORMAT ) + { + int32_t temp_brate[MAX_SCE]; + st_ivas->ism_extmeta_active = -1; + st_ivas->ism_extmeta_cnt = 0; + + st_ivas->sba_dirac_stereo_flag = ivas_get_sba_dirac_stereo_flag( st_ivas ); + + if ( ( error = ivas_qmetadata_open( &( st_ivas->hQMetaData ) ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = ivas_spar_dec_open( st_ivas, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_DEC && st_ivas->hOutSetup.is_loudspeaker_setup ) + { + if ( ( error = ivas_sba_get_hoa_dec_matrix( st_ivas->hOutSetup, &st_ivas->hoa_dec_mtx, st_ivas->hIntSetup.ambisonics_order ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( ( error = ivas_dirac_sba_config( st_ivas->hQMetaData, &st_ivas->element_mode_init, ivas_total_brate, st_ivas->sba_analysis_order, ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ) ? IVAS_MAX_NUM_BANDS : ( IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND ) ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( hDecoderConfig->output_config != IVAS_AUDIO_CONFIG_FOA && st_ivas->hDecoderConfig->output_config != IVAS_AUDIO_CONFIG_STEREO && st_ivas->hDecoderConfig->output_config != IVAS_AUDIO_CONFIG_MONO ) + { + if ( ( error = ivas_dirac_dec_config( st_ivas, DIRAC_OPEN ) ) != IVAS_ERR_OK ) + { + return error; + } + + st_ivas->hSpar->enc_param_start_band = st_ivas->hDirAC->hConfig->enc_param_start_band; + } + else + { + int16_t band_grouping[IVAS_MAX_NUM_BANDS + 1]; + + st_ivas->hSpar->enc_param_start_band = min( IVAS_MAX_NUM_BANDS, SPAR_DIRAC_SPLIT_START_BAND ); + if ( ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ) ) + { + st_ivas->hSpar->enc_param_start_band = 0; + + set_c( (int8_t *) st_ivas->hQMetaData->twoDirBands, (int8_t) 1, st_ivas->hQMetaData->q_direction[0].cfg.nbands ); + st_ivas->hQMetaData->numTwoDirBands = (uint8_t) st_ivas->hQMetaData->q_direction[0].cfg.nbands; + } + + ivas_dirac_config_bands( band_grouping, IVAS_MAX_NUM_BANDS, (int16_t) ( st_ivas->hDecoderConfig->output_Fs * INV_CLDFB_BANDWIDTH + 0.5f ), + st_ivas->hSpar->dirac_to_spar_md_bands, st_ivas->hQMetaData->useLowerBandRes, st_ivas->hSpar->enc_param_start_band, 0 ); + } + + for ( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) + { + if ( ( error = create_sce_dec( st_ivas, sce_id, ivas_total_brate / st_ivas->nchan_transport ) ) != IVAS_ERR_OK ) + { + return error; + } + + reset_indices_dec( st_ivas->hSCE[sce_id]->hCoreCoder[0] ); + } + + if ( st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + { + st_ivas->nCPE += ( st_ivas->nchan_ism + 1 ) >> 1; + st_ivas->element_mode_init = IVAS_CPE_MDCT; + } + + for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) + { + if ( ( error = create_cpe_dec( st_ivas, cpe_id, ( ivas_total_brate / st_ivas->nchan_transport ) * CPE_CHANNELS ) ) != IVAS_ERR_OK ) + { + return error; + } + + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + reset_indices_dec( st_ivas->hCPE[cpe_id]->hCoreCoder[n] ); + } + } + + /* create CPE element for DFT Stereo like upmix */ + if ( st_ivas->sba_dirac_stereo_flag && st_ivas->nCPE == 0 ) + { + if ( ( error = create_cpe_dec( st_ivas, cpe_id, ivas_total_brate / ( st_ivas->nSCE + st_ivas->nCPE ) ) ) != IVAS_ERR_OK ) + { + return error; + } + + st_ivas->hCPE[0]->hCoreCoder[0] = st_ivas->hSCE[0]->hCoreCoder[0]; /* don't allocate unnecessary core coder, simply point to core coder of SCE element */ + st_ivas->hCPE[0]->hCoreCoder[1] = NULL; + } + + if ( st_ivas->nCPE > 1 ) + { + if ( ( error = create_mct_dec( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + { + if ( ( error = ivas_ism_metadata_dec_create( st_ivas, st_ivas->nchan_ism, temp_brate ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = ivas_osba_data_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* set CNA/CNG flags */ + ivas_sba_set_cna_cng_flag( st_ivas ); + } + else if ( st_ivas->ivas_format == MASA_ISM_FORMAT ) + { + st_ivas->ism_extmeta_active = -1; + st_ivas->ism_extmeta_cnt = 0; + + if ( ( error = ivas_qmetadata_open( &( st_ivas->hQMetaData ) ) ) != IVAS_ERR_OK ) + { + return error; + } + + k = 0; + ism_total_brate = 0; + while ( k < SIZE_IVAS_BRATE_TBL && ivas_total_brate != ivas_brate_tbl[k] ) + { + k++; + } + + if ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) + { + /* one separated object */ + st_ivas->nSCE = 1; + + ism_total_brate = sep_object_brate[k - 2][0]; + if ( ( error = create_sce_dec( st_ivas, 0, ism_total_brate ) ) != IVAS_ERR_OK ) + { + return error; + } + + reset_indices_dec( st_ivas->hSCE[0]->hCoreCoder[0] ); + + if ( ( error = ivas_ism_metadata_dec_create( st_ivas, 1, NULL ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC ) + { + int32_t temp_brate[MAX_SCE]; + st_ivas->nSCE = st_ivas->nchan_ism; /* number of objects */ + + for ( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) + { + temp_brate[sce_id] = sep_object_brate[k - 2][st_ivas->nSCE - 1]; + ism_total_brate += temp_brate[sce_id]; + + if ( ( error = create_sce_dec( st_ivas, sce_id, temp_brate[sce_id] ) ) != IVAS_ERR_OK ) + { + return error; + } + + reset_indices_dec( st_ivas->hSCE[sce_id]->hCoreCoder[0] ); + } + + if ( ( error = ivas_ism_metadata_dec_create( st_ivas, st_ivas->nchan_ism, temp_brate ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( ( error = ivas_masa_dec_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = ivas_omasa_data_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( st_ivas->renderer_type == RENDERER_DIRAC || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) + { + if ( ( error = ivas_dirac_dec_config( st_ivas, DIRAC_OPEN ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( ( error = create_cpe_dec( st_ivas, 0, ivas_total_brate - ism_total_brate ) ) != IVAS_ERR_OK ) + { + return error; + } + + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + reset_indices_dec( st_ivas->hCPE[0]->hCoreCoder[n] ); + } + } + else if ( st_ivas->ivas_format == MC_FORMAT ) + { + if ( st_ivas->mc_mode == MC_MODE_MCT ) + { + /* init EFAP for custom LS setup */ + if ( output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM ) + { + if ( ( error = efap_init_data( &( st_ivas->hEFAPdata ), st_ivas->hLsSetupCustom->ls_azimuth, st_ivas->hLsSetupCustom->ls_elevation, st_ivas->hLsSetupCustom->num_spk, EFAP_MODE_EFAP ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + st_ivas->nchan_transport = ivas_mc_ls_setup_get_num_channels( ivas_mc_map_output_config_to_mc_ls_setup( st_ivas->transport_config ) ); + st_ivas->nSCE = 0; + st_ivas->nCPE = st_ivas->nchan_transport / CPE_CHANNELS; + + st_ivas->element_mode_init = IVAS_CPE_MDCT; + + for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) + { + if ( ( error = create_cpe_dec( st_ivas, cpe_id, ( ivas_total_brate / ( st_ivas->nchan_transport - 1 ) * CPE_CHANNELS ) ) ) != IVAS_ERR_OK ) + { + return error; + } + + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + reset_indices_dec( st_ivas->hCPE[cpe_id]->hCoreCoder[n] ); + } + } + + if ( ( error = create_mct_dec( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) + { + /* init EFAP for custom LS setup */ + if ( output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM ) + { + if ( ( error = efap_init_data( &( st_ivas->hEFAPdata ), st_ivas->hLsSetupCustom->ls_azimuth, st_ivas->hLsSetupCustom->ls_elevation, st_ivas->hLsSetupCustom->num_spk, EFAP_MODE_EFAP ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + st_ivas->nSCE = 0; + st_ivas->nCPE = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS / CPE_CHANNELS; + st_ivas->nchan_transport = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS; + + if ( ( error = ivas_mc_paramupmix_dec_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + + st_ivas->element_mode_init = IVAS_CPE_MDCT; + + for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) + { + if ( ( error = create_cpe_dec( st_ivas, cpe_id, ( ivas_total_brate / ( st_ivas->nchan_transport - 1 ) * CPE_CHANNELS ) ) ) != IVAS_ERR_OK ) + { + return error; + } + + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + reset_indices_dec( st_ivas->hCPE[cpe_id]->hCoreCoder[n] ); + } + } + + if ( ( error = create_mct_dec( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->mc_mode == MC_MODE_PARAMMC ) + { + /* init EFAP for custom LS setup */ + if ( output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM ) + { + if ( ( error = efap_init_data( &( st_ivas->hEFAPdata ), st_ivas->hLsSetupCustom->ls_azimuth, st_ivas->hLsSetupCustom->ls_elevation, st_ivas->hLsSetupCustom->num_spk, EFAP_MODE_EFAP ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( ( error = ivas_param_mc_dec_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + + for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) + { + if ( ( error = create_cpe_dec( st_ivas, cpe_id, ivas_total_brate / ( st_ivas->nSCE + st_ivas->nCPE ) ) ) != IVAS_ERR_OK ) + { + return error; + } + + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + reset_indices_dec( st_ivas->hCPE[cpe_id]->hCoreCoder[n] ); + } + } + + if ( st_ivas->nCPE > 1 ) + { + if ( ( error = create_mct_dec( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + else if ( st_ivas->mc_mode == MC_MODE_MCMASA ) + { + int32_t brate_sce, brate_cpe; + + ivas_mcmasa_setNumTransportChannels( &( st_ivas->nchan_transport ), &( st_ivas->element_mode_init ), ivas_total_brate ); + + if ( ( error = ivas_qmetadata_open( &( st_ivas->hQMetaData ) ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = ivas_masa_dec_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + + st_ivas->sba_dirac_stereo_flag = ivas_get_sba_dirac_stereo_flag( st_ivas ); + + if ( st_ivas->renderer_type != RENDERER_DISABLE && st_ivas->renderer_type != RENDERER_MCMASA_MONO_STEREO ) + { + if ( ( error = ivas_dirac_dec_config( st_ivas, DIRAC_OPEN ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( st_ivas->hOutSetup.output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM && st_ivas->hOutSetup.separateChannelEnabled && !st_ivas->hLsSetupCustom->separate_ch_found ) + { + /* If no speaker matching the separated channel, compute panning gains for the separated channel. */ + if ( st_ivas->hVBAPdata == NULL ) + { + /* Distribute signal to all channels if VBAP is not properly initialized. */ + set_f( st_ivas->hLsSetupCustom->separate_ch_gains, inv_sqrt( st_ivas->hLsSetupCustom->num_spk ), st_ivas->hLsSetupCustom->num_spk ); + } + else + { + vbap_determine_gains( st_ivas->hVBAPdata, st_ivas->hLsSetupCustom->separate_ch_gains, 0, 0, 0 ); + } + } + + ivas_mcmasa_split_brate( st_ivas->hOutSetup.separateChannelEnabled, ivas_total_brate, st_ivas->nSCE, st_ivas->nCPE, &brate_sce, &brate_cpe ); + + for ( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) + { + if ( ( error = create_sce_dec( st_ivas, sce_id, brate_sce ) ) != IVAS_ERR_OK ) + { + return error; + } + + reset_indices_dec( st_ivas->hSCE[sce_id]->hCoreCoder[0] ); + } + + for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) + { + st_ivas->element_mode_init = IVAS_CPE_MDCT; /* element_mode_init was IVAS_SCE for SCE initialization */ + + if ( ( error = create_cpe_dec( st_ivas, cpe_id, brate_cpe ) ) != IVAS_ERR_OK ) + { + return error; + } + + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + reset_indices_dec( st_ivas->hCPE[cpe_id]->hCoreCoder[n] ); + } + } + + /* create CPE element for DFT Stereo like upmix */ + if ( st_ivas->sba_dirac_stereo_flag ) + { + if ( ( error = create_cpe_dec( st_ivas, cpe_id, ivas_total_brate / ( st_ivas->nSCE + st_ivas->nCPE ) ) ) != IVAS_ERR_OK ) + { + return error; + } + + st_ivas->hCPE[0]->hCoreCoder[0] = st_ivas->hSCE[0]->hCoreCoder[0]; /* don't allocate unnecessary core coder, simply point to core coder of SCE element */ + st_ivas->hCPE[0]->hCoreCoder[1] = NULL; + } + + /* set CNA/CNG flags */ + if ( st_ivas->nchan_transport == 1 && ( ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) ) + { + st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag = 1; + st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag = 1; + } + } + } + + + /*-----------------------------------------------------------------* + * Allocate and initialize HP20 filter memories + *-----------------------------------------------------------------*/ + + /* set number of output channels used for synthesis/decoding */ + n = getNumChanSynthesis( st_ivas ); + + if ( n > 0 ) + { + if ( ( st_ivas->mem_hp20_out = (float **) malloc( n * sizeof( float * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HP20 filter memory\n" ) ); + } + } + else + { + st_ivas->mem_hp20_out = NULL; + } + + for ( i = 0; i < n; i++ ) + { + if ( ( st_ivas->mem_hp20_out[i] = (float *) malloc( L_HP20_MEM * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HP20 filter memory\n" ) ); + } + + set_f( st_ivas->mem_hp20_out[i], 0.0f, L_HP20_MEM ); + } + + /*-------------------------------------------------------------------* + * Allocate and initialize rendering handles + *--------------------------------------------------------------------*/ + + if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) + { + + if ( ( error = ivas_binRenderer_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* ParamISM is handled separately from other common config */ + else if ( st_ivas->ivas_format == ISM_FORMAT && st_ivas->ism_mode == ISM_MODE_PARAM && ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) ) + { + if ( st_ivas->renderer_type != RENDERER_STEREO_PARAMETRIC ) + { + if ( ( error = ivas_dirac_dec_binaural_copy_hrtfs( &st_ivas->hHrtfParambin ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( ( error = ivas_dirac_dec_init_binaural_data( st_ivas, st_ivas->hHrtfParambin ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->renderer_type == RENDERER_BINAURAL_OBJECTS_TD ) + { + if ( ( error = ivas_td_binaural_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( st_ivas->hIntSetup.output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) + { + if ( ( error = ivas_reverb_open( &st_ivas->hReverb, st_ivas->hDecoderConfig->output_config, NULL, st_ivas->hBinRendererTd->HrFiltSet_p->lr_energy_and_iac, st_ivas->hRenderConfig, st_ivas->hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( st_ivas->hDecoderConfig->Opt_5ms ) + { + granularity = NS2SA( st_ivas->hDecoderConfig->output_Fs, FRAME_SIZE_NS / MAX_PARAM_SPATIAL_SUBFRAMES ); + n_channels_transport_jbm = ivas_jbm_dec_get_num_tc_channels( st_ivas ); + + if ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, TC_BUFFER_MODE_RENDERER, n_channels_transport_jbm, n_channels_transport_jbm, n_channels_transport_jbm, granularity ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + else if ( st_ivas->renderer_type == RENDERER_MC ) + { + if ( ( error = ivas_ls_setup_conversion_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->renderer_type == RENDERER_MONO_DOWNMIX ) + { + if ( ( error = ivas_mono_dmx_renderer_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV || st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) + { + if ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM && st_ivas->ivas_format == MC_FORMAT && ( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation ) ) + { + if ( ( error = efap_init_data( &( st_ivas->hEFAPdata ), st_ivas->hIntSetup.ls_azimuth, st_ivas->hIntSetup.ls_elevation, st_ivas->hIntSetup.nchan_out_woLFE, EFAP_MODE_EFAP ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hDecoderConfig->output_config, + st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } + + st_ivas->binaural_latency_ns = st_ivas->hCrendWrapper->binaural_latency_ns; + + if ( st_ivas->hDecoderConfig->Opt_5ms ) + { + if ( ( st_ivas->ivas_format == MC_FORMAT ) && ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) ) + { + granularity = NS2SA( output_Fs, CLDFB_SLOT_NS ); + + n_channels_transport_jbm = ivas_jbm_dec_get_num_tc_channels( st_ivas ); + + if ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, TC_BUFFER_MODE_RENDERER, n_channels_transport_jbm, MC_PARAMUPMIX_MAX_INPUT_CHANS, MC_PARAMUPMIX_MAX_INPUT_CHANS, granularity ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + granularity = NS2SA( st_ivas->hDecoderConfig->output_Fs, FRAME_SIZE_NS / MAX_PARAM_SPATIAL_SUBFRAMES ); + + n_channels_transport_jbm = ivas_jbm_dec_get_num_tc_channels( st_ivas ); + + if ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, TC_BUFFER_MODE_RENDERER, n_channels_transport_jbm, n_channels_transport_jbm, n_channels_transport_jbm, granularity ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + } + + if ( st_ivas->ivas_format == MASA_ISM_FORMAT ) + { + if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC && st_ivas->ism_mode == ISM_MASA_MODE_DISC ) + { + /* Allocate TD renderer for the objects in DISC mode */ + if ( ( error = ivas_td_binaural_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Allocate 'hIsmRendererData' handle and memory for delay buffer within 'hMasaIsmData' */ + if ( ( error = ivas_omasa_separate_object_renderer_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( st_ivas->renderer_type == RENDERER_DIRAC && ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_DISC ) ) + { + /* Allocate 'hIsmRendererData' handle and memory for delay buffer within 'hMasaIsmData' */ + if ( ( error = ivas_omasa_separate_object_renderer_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + + if ( ( st_ivas->ivas_format == ISM_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT ) && + ( st_ivas->ism_mode == ISM_MODE_DISC || st_ivas->ism_mode == ISM_SBA_MODE_DISC ) && + ( st_ivas->renderer_type == RENDERER_TD_PANNING || + st_ivas->renderer_type == RENDERER_NON_DIEGETIC_DOWNMIX || + st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC || + st_ivas->renderer_type == RENDERER_OSBA_STEREO || + st_ivas->renderer_type == RENDERER_OSBA_AMBI || + st_ivas->renderer_type == RENDERER_OSBA_LS || + st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || + st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM || + st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) ) + { + if ( ( error = ivas_ism_renderer_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( st_ivas->ivas_format == SBA_ISM_FORMAT ) + { + if ( ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV ) && st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + { + /* Allocate TD renderer for the objects in DISC mode */ + if ( ( error = ivas_td_binaural_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + + /*-----------------------------------------------------------------* + * LFE handles for rendering after rendering to adjust LFE delay to binaural filter delay + *-----------------------------------------------------------------*/ + + if ( st_ivas->mc_mode == MC_MODE_MCT || st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) + { + binauralization_delay_ns = st_ivas->binaural_latency_ns; + if ( st_ivas->hBinRenderer != NULL ) + { + if ( st_ivas->hBinRenderer->render_lfe ) + { + { + /* Account for filterbank delay */ + binauralization_delay_ns += IVAS_FB_DEC_DELAY_NS; + } + } + else + { + binauralization_delay_ns = 0; + } + } + + if ( ( error = ivas_create_lfe_dec( &st_ivas->hLFE, output_Fs, binauralization_delay_ns ) ) != IVAS_ERR_OK ) + { + return error; + } + + set_zero( st_ivas->hLFE->prevsynth_buf, LFE_PLC_BUFLEN ); + set_zero( st_ivas->hLFE->prior_out_buffer, L_FRAME48k ); + } + + /*-----------------------------------------------------------------* + * CLDFB handles for rendering + *-----------------------------------------------------------------*/ + + ivas_init_dec_get_num_cldfb_instances( st_ivas, &numCldfbAnalyses, &numCldfbSyntheses ); + + for ( i = 0; i < numCldfbAnalyses; i++ ) + { + if ( ( error = openCldfb( &( st_ivas->cldfbAnaDec[i] ), CLDFB_ANALYSIS, output_Fs, CLDFB_PROTOTYPE_5_00MS ) ) != IVAS_ERR_OK ) + { + return error; + } + } + for ( ; i < MAX_INTERN_CHANNELS; i++ ) + { + st_ivas->cldfbAnaDec[i] = NULL; + } + + for ( i = 0; i < numCldfbSyntheses; i++ ) + { + if ( ( error = openCldfb( &( st_ivas->cldfbSynDec[i] ), CLDFB_SYNTHESIS, output_Fs, CLDFB_PROTOTYPE_5_00MS ) ) != IVAS_ERR_OK ) + { + return error; + } + } + for ( ; i < MAX_OUTPUT_CHANNELS; i++ ) + { + st_ivas->cldfbSynDec[i] = NULL; + } + + /* CLDFB Interpolation weights */ + if ( ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT ) && !st_ivas->sba_dirac_stereo_flag && st_ivas->hDecoderConfig->nchan_out != 1 ) + { + ivas_spar_get_cldfb_gains( st_ivas->hSpar, st_ivas->cldfbAnaDec[0], st_ivas->cldfbSynDec[0], hDecoderConfig ); + } + + /*-----------------------------------------------------------------* + * Allocate and initialize limiter struct + *-----------------------------------------------------------------*/ + + if ( ( error = ivas_limiter_open( &st_ivas->hLimiter, hDecoderConfig->nchan_out, output_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } + + /*-----------------------------------------------------------------* + * Allocate and initialize JBM struct + buffer + *-----------------------------------------------------------------*/ + + if ( st_ivas->hDecoderConfig->Opt_5ms && st_ivas->hTcBuffer == NULL ) + { + /* no module has yet open the TC buffer, open a default one */ + n_channels_transport_jbm = ivas_jbm_dec_get_num_tc_channels( st_ivas ); + + if ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, ivas_jbm_dec_get_tc_buffer_mode( st_ivas ), n_channels_transport_jbm, n_channels_transport_jbm, n_channels_transport_jbm, NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( st_ivas->hTcBuffer == NULL ) + { + /* we need the handle anyway, but without the buffer*/ + if ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, TC_BUFFER_MODE_NONE, 0, 0, 0, 1 ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( st_ivas->hJbmMetadata == NULL ) + { + if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) + { + if ( ( error = ivas_jbm_dec_metadata_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + + /*-----------------------------------------------------------------* + * Allocate floating-point output audio buffers + *-----------------------------------------------------------------*/ + + if ( !st_ivas->hDecoderConfig->Opt_5ms ) + { + for ( n = 0; n < ivas_get_nchan_buffers_dec( st_ivas, st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); n++ ) + { + /* note: these are intra-frame heap memories */ + if ( ( st_ivas->p_output_f[n] = (float *) malloc( ( 48000 / FRAMES_PER_SEC ) * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for floating-point output audio buffer!\n" ) ); + } + } + } + else + { + n = 0; + } + + for ( ; n < MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS; n++ ) + { + st_ivas->p_output_f[n] = NULL; + } + + return error; +} + + +/*------------------------------------------------------------------------- + * destroy_core_dec() + * + * Close core decoder handles + *-------------------------------------------------------------------------*/ + +void destroy_core_dec( + DEC_CORE_HANDLE hCoreCoder /* i/o: core decoder structure */ +) +{ + destroy_cldfb_decoder( hCoreCoder ); + + if ( hCoreCoder->hGSCDec != NULL ) + { + free( hCoreCoder->hGSCDec ); + hCoreCoder->hGSCDec = NULL; + } + + if ( hCoreCoder->hPFstat != NULL ) + { + free( hCoreCoder->hPFstat ); + hCoreCoder->hPFstat = NULL; + } + + if ( hCoreCoder->hMusicPF != NULL ) + { + free( hCoreCoder->hMusicPF ); + hCoreCoder->hMusicPF = NULL; + } + + if ( hCoreCoder->hBPF != NULL ) + { + free( hCoreCoder->hBPF ); + hCoreCoder->hBPF = NULL; + } + + if ( hCoreCoder->hBWE_zero != NULL ) + { + free( hCoreCoder->hBWE_zero ); + hCoreCoder->hBWE_zero = NULL; + } + + if ( hCoreCoder->hTdCngDec != NULL ) + { + free( hCoreCoder->hTdCngDec ); + hCoreCoder->hTdCngDec = NULL; + } + + if ( hCoreCoder->hSC_VBR != NULL ) + { + free( hCoreCoder->hSC_VBR ); + hCoreCoder->hSC_VBR = NULL; + } + + if ( hCoreCoder->hAmrwb_IO != NULL ) + { + free( hCoreCoder->hAmrwb_IO ); + hCoreCoder->hAmrwb_IO = NULL; + } + + if ( hCoreCoder->hBWE_TD != NULL ) + { + free( hCoreCoder->hBWE_TD ); + hCoreCoder->hBWE_TD = NULL; + } + + if ( hCoreCoder->hBWE_FD != NULL ) + { + free( hCoreCoder->hBWE_FD ); + hCoreCoder->hBWE_FD = NULL; + } + + if ( hCoreCoder->hBWE_FD_HR != NULL ) + { + free( hCoreCoder->hBWE_FD_HR ); + hCoreCoder->hBWE_FD_HR = NULL; + } + + if ( hCoreCoder->hWIDec != NULL ) + { + free( hCoreCoder->hWIDec ); + hCoreCoder->hWIDec = NULL; + } + + if ( hCoreCoder->hTECDec != NULL ) + { + free( hCoreCoder->hTECDec ); + hCoreCoder->hTECDec = NULL; + } + + if ( hCoreCoder->hTcxLtpDec != NULL ) + { + free( hCoreCoder->hTcxLtpDec ); + hCoreCoder->hTcxLtpDec = NULL; + } + + if ( hCoreCoder->hTcxDec != NULL ) + { + free( hCoreCoder->hTcxDec ); + hCoreCoder->hTcxDec = NULL; + } + + if ( hCoreCoder->hTcxCfg != NULL ) + { + free( hCoreCoder->hTcxCfg ); + hCoreCoder->hTcxCfg = NULL; + } + + if ( hCoreCoder->hTonalMDCTConc != NULL ) + { + free( hCoreCoder->hTonalMDCTConc ); + hCoreCoder->hTonalMDCTConc = NULL; + } + + if ( hCoreCoder->hIGFDec != NULL ) + { + free( hCoreCoder->hIGFDec ); + hCoreCoder->hIGFDec = NULL; + } + + if ( hCoreCoder->hPlcInfo != NULL ) + { + free( hCoreCoder->hPlcInfo ); + hCoreCoder->hPlcInfo = NULL; + } + + if ( hCoreCoder->hHQ_core != NULL ) + { + free( hCoreCoder->hHQ_core ); + hCoreCoder->hHQ_core = NULL; + } + + if ( hCoreCoder->hHQ_nbfec != NULL ) + { + free( hCoreCoder->hHQ_nbfec ); + hCoreCoder->hHQ_nbfec = NULL; + } + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_initialize_handles_dec() + * + * NULL initialization of handles + *-------------------------------------------------------------------------*/ + +void ivas_initialize_handles_dec( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +) +{ + int16_t i; + + for ( i = 0; i < MAX_INTERN_CHANNELS; i++ ) + { + st_ivas->cldfbAnaDec[i] = NULL; + } + + for ( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) + { + st_ivas->cldfbSynDec[i] = NULL; + } + + /* SCE handles */ + for ( i = 0; i < MAX_SCE; i++ ) + { + st_ivas->hSCE[i] = NULL; + } + + /* CPE handles */ + for ( i = 0; i < MAX_CPE; i++ ) + { + st_ivas->hCPE[i] = NULL; + } + + st_ivas->bit_stream = NULL; + st_ivas->mem_hp20_out = NULL; + st_ivas->hLimiter = NULL; + + /* ISM metadata handles */ + for ( i = 0; i < MAX_NUM_OBJECTS; i++ ) + { + st_ivas->hIsmMetaData[i] = NULL; + } + + /* spatial coding handles */ + st_ivas->hDirAC = NULL; + st_ivas->hParamIsmDec = NULL; + st_ivas->hSpar = NULL; + st_ivas->hMasa = NULL; + st_ivas->hQMetaData = NULL; + st_ivas->hMCT = NULL; + st_ivas->hMCParamUpmix = NULL; + st_ivas->hParamMC = NULL; + st_ivas->hLFE = NULL; + + /* rendering handles */ + st_ivas->hBinRenderer = NULL; + st_ivas->hDiracDecBin = NULL; + st_ivas->hDirACRend = NULL; + st_ivas->hSpatParamRendCom = NULL; + st_ivas->hLsSetUpConversion = NULL; + st_ivas->hEFAPdata = NULL; + st_ivas->hVBAPdata = NULL; + st_ivas->hIsmRendererData = NULL; + st_ivas->hBinRendererTd = NULL; + st_ivas->hMonoDmxRenderer = NULL; + st_ivas->hCrendWrapper = NULL; + st_ivas->hReverb = NULL; + st_ivas->hSetOfHRTF = NULL; + st_ivas->hHrtfFastConv = NULL; + st_ivas->hHrtfParambin = NULL; + st_ivas->hoa_dec_mtx = NULL; + st_ivas->hMasaIsmData = NULL; + st_ivas->hSbaIsmData = NULL; + + st_ivas->hHeadTrackData = NULL; + st_ivas->hHrtfTD = NULL; + st_ivas->hLsSetupCustom = NULL; + st_ivas->hRenderConfig = NULL; + st_ivas->hExtOrientationData = NULL; + st_ivas->hCombinedOrientationData = NULL; + + + /* JBM handles */ + st_ivas->hTcBuffer = NULL; + st_ivas->hJbmMetadata = NULL; + + /* floating-point output audio buffers */ + for ( i = 0; i < MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS; i++ ) + { + st_ivas->p_output_f[i] = NULL; + } + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_destroy_dec() + * + * Close IVAS decoder handles + *-------------------------------------------------------------------------*/ + +void ivas_destroy_dec( + Decoder_Struct *st_ivas /* i/o: IVAS decoder handle */ +) +{ + int16_t i; + + /* CLDFB handles */ + for ( i = 0; i < MAX_INTERN_CHANNELS; i++ ) + { + if ( st_ivas->cldfbAnaDec[i] != NULL ) + { + deleteCldfb( &( st_ivas->cldfbAnaDec[i] ) ); + } + } + + for ( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) + { + if ( st_ivas->cldfbSynDec[i] != NULL ) + { + deleteCldfb( &( st_ivas->cldfbSynDec[i] ) ); + } + } + + /* SCE handles */ + for ( i = 0; i < MAX_SCE; i++ ) + { + if ( st_ivas->hSCE[i] != NULL ) + { + destroy_sce_dec( st_ivas->hSCE[i] ); + st_ivas->hSCE[i] = NULL; + } + } + + /* CPE handles */ + for ( i = 0; i < MAX_CPE; i++ ) + { + if ( st_ivas->hCPE[i] != NULL ) + { + /* set pointer to NULL as core coder already deallocated in destroy_sce_dec() */ + if ( st_ivas->sba_dirac_stereo_flag && st_ivas->nchan_transport == 1 ) + { + st_ivas->hCPE[i]->hCoreCoder[0] = NULL; + st_ivas->hCPE[i]->hCoreCoder[1] = NULL; + } + destroy_cpe_dec( st_ivas->hCPE[i] ); + st_ivas->hCPE[i] = NULL; + } + } + + /* HP20 filter handles */ + if ( st_ivas->mem_hp20_out != NULL ) + { + for ( i = 0; i < getNumChanSynthesis( st_ivas ); i++ ) + { + free( st_ivas->mem_hp20_out[i] ); + st_ivas->mem_hp20_out[i] = NULL; + } + free( st_ivas->mem_hp20_out ); + st_ivas->mem_hp20_out = NULL; + } + + /* ISM metadata handles */ + ivas_ism_metadata_close( st_ivas->hIsmMetaData, 0 ); + + /* ISM renderer handle */ + ivas_ism_renderer_close( &( st_ivas->hIsmRendererData ) ); + + /* DirAC handle */ + if ( st_ivas->ivas_format == ISM_FORMAT ) + { + ivas_param_ism_dec_close( &( st_ivas->hParamIsmDec ), &( st_ivas->hSpatParamRendCom ), st_ivas->hDecoderConfig->output_config ); + } + else + { + ivas_dirac_rend_close( &( st_ivas->hDirACRend ) ); + ivas_spat_hSpatParamRendCom_close( &( st_ivas->hSpatParamRendCom ) ); + ivas_dirac_dec_close( &( st_ivas->hDirAC ) ); + } + + /* SPAR handle */ + ivas_spar_dec_close( &( st_ivas->hSpar ), st_ivas->hDecoderConfig->output_Fs, 0 ); + + /* HOA decoder matrix */ + if ( st_ivas->hoa_dec_mtx != NULL ) + { + free( st_ivas->hoa_dec_mtx ); + st_ivas->hoa_dec_mtx = NULL; + } + + /* MASA decoder structure */ + ivas_masa_dec_close( &( st_ivas->hMasa ) ); + + /* Qmetadata handle */ + ivas_qmetadata_close( &st_ivas->hQMetaData ); + + /* MCT handle */ + ivas_mct_dec_close( &st_ivas->hMCT ); + + /* LFE handle */ + ivas_lfe_dec_close( &( st_ivas->hLFE ) ); + + /* Param-Upmix MC handle */ + ivas_mc_paramupmix_dec_close( &( st_ivas->hMCParamUpmix ) ); + + /* Parametric MC handle */ + ivas_param_mc_dec_close( &st_ivas->hParamMC ); + + /* EFAP handle */ + efap_free_data( &st_ivas->hEFAPdata ); + + /* VBAP handle */ + vbap_free_data( &( st_ivas->hVBAPdata ) ); + + /* Fastconv binaural renderer handle */ + ivas_binRenderer_close( &st_ivas->hBinRenderer ); + + + /* Parametric binaural renderer handle */ + ivas_dirac_dec_close_binaural_data( &st_ivas->hDiracDecBin ); + + /* Crend handle */ + + ivas_rend_closeCrend( &( st_ivas->hCrendWrapper ) ); + + /* Reverb handle */ + ivas_reverb_close( &st_ivas->hReverb ); + + /* LS config converter handle */ + ivas_ls_setup_conversion_close( &st_ivas->hLsSetUpConversion ); + + /* Custom LS configuration handle */ + if ( st_ivas->hLsSetupCustom != NULL ) + { + free( st_ivas->hLsSetupCustom ); + st_ivas->hLsSetupCustom = NULL; + } + + /* Mono downmix structure */ + ivas_mono_dmx_renderer_close( &st_ivas->hMonoDmxRenderer ); + + /* OSBA structure */ + ivas_osba_data_close( &st_ivas->hSbaIsmData ); + + /* OMASA structure */ + ivas_omasa_data_close( &st_ivas->hMasaIsmData ); + + /* Head track data handle */ + ivas_headTrack_close( &st_ivas->hHeadTrackData ); + + /* External orientation data handle */ + ivas_external_orientation_close( &st_ivas->hExtOrientationData ); + + /* Combined orientation data handle */ + ivas_combined_orientation_close( &st_ivas->hCombinedOrientationData ); + + /* Time Domain binaural renderer handle */ + if ( st_ivas->hBinRendererTd != NULL ) + { + ivas_td_binaural_close( &st_ivas->hBinRendererTd ); + } + else if ( st_ivas->hHrtfTD != NULL ) + { + BSplineModelEvalDealloc( &st_ivas->hHrtfTD->ModelParams, &st_ivas->hHrtfTD->ModelEval ); + + ivas_HRTF_binary_close( &st_ivas->hHrtfTD ); + } + + /* CRend binaural renderer handle */ + ivas_HRTF_CRend_binary_close( &st_ivas->hSetOfHRTF ); + + /* Fastconv HRTF memories */ + ivas_binaural_hrtf_close( &st_ivas->hHrtfFastConv ); + + /* Fastconv HRTF filters */ + ivas_HRTF_fastconv_binary_close( &st_ivas->hHrtfFastConv ); + + /* Parametric binauralizer HRTF filters */ + ivas_HRTF_parambin_binary_close( &st_ivas->hHrtfParambin ); + + /* Config. Renderer */ + ivas_render_config_close( &( st_ivas->hRenderConfig ) ); + + /* Limiter struct */ + ivas_limiter_close( &( st_ivas->hLimiter ) ); + + if ( st_ivas->hDecoderConfig != NULL ) + { + free( st_ivas->hDecoderConfig ); + st_ivas->hDecoderConfig = NULL; + } + + ivas_jbm_dec_tc_buffer_close( &st_ivas->hTcBuffer ); + + if ( st_ivas->hJbmMetadata != NULL ) + { + free( st_ivas->hJbmMetadata ); + st_ivas->hJbmMetadata = NULL; + } + + /* floating-point output audio buffers */ + for ( i = 0; i < MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS; i++ ) + { + if ( st_ivas->p_output_f[i] != NULL ) + { + free( st_ivas->p_output_f[i] ); + st_ivas->p_output_f[i] = NULL; + } + } + + /* main IVAS handle */ + free( st_ivas ); + + return; +} + + +/*-------------------------------------------------------------------* + * ivas_init_dec_get_num_cldfb_instances() + * + * Return number of CLDFB analysis & synthesis instances + *-------------------------------------------------------------------*/ + +/*! r: number of cldfb instances */ +void ivas_init_dec_get_num_cldfb_instances( + Decoder_Struct *st_ivas, /* i : IVAS decoder structure */ + int16_t *numCldfbAnalyses, /* o : number of needed CLDFB analysis instances */ + int16_t *numCldfbSyntheses /* o : number of needed CLDFB synthesis instances */ +) +{ + IVAS_FORMAT ivas_format; + *numCldfbAnalyses = st_ivas->nchan_transport; + *numCldfbSyntheses = st_ivas->hDecoderConfig->nchan_out; + + ivas_format = ( st_ivas->ivas_format == SBA_ISM_FORMAT && st_ivas->ism_mode == ISM_MODE_NONE ) ? SBA_FORMAT : st_ivas->ivas_format; /* treat ISM_SBA_MODE_NONE just like SBA_FORMAT */ + + switch ( st_ivas->renderer_type ) + { + case RENDERER_BINAURAL_PARAMETRIC: + case RENDERER_BINAURAL_PARAMETRIC_ROOM: + case RENDERER_STEREO_PARAMETRIC: + if ( st_ivas->nchan_transport == 1 ) + { + *numCldfbAnalyses = st_ivas->nchan_transport + 1; + } + + if ( st_ivas->mc_mode == MC_MODE_MCMASA && st_ivas->hOutSetup.separateChannelEnabled ) + { + *numCldfbAnalyses = st_ivas->nchan_transport + 1; + } + + if ( ivas_format == SBA_ISM_FORMAT ) + { + if ( st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + { + *numCldfbAnalyses += st_ivas->nchan_ism; + } + } + + if ( ivas_format == MASA_ISM_FORMAT ) + { + if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC ) + { + *numCldfbAnalyses += st_ivas->nchan_ism; + } + else if ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) + { + *numCldfbAnalyses = st_ivas->nchan_transport + 1; + } + } + if ( st_ivas->hDiracDecBin->useTdDecorr ) + { + *numCldfbAnalyses += 2; + } + break; + case RENDERER_NON_DIEGETIC_DOWNMIX: + case RENDERER_MONO_DOWNMIX: + if ( ivas_format == ISM_FORMAT || ivas_format == MASA_ISM_FORMAT || ivas_format == SBA_ISM_FORMAT ) + { + /* CLDFB not used in rendering */ + *numCldfbAnalyses = 0; + *numCldfbSyntheses = 0; + } + break; + case RENDERER_DIRAC: + if ( ivas_format == SBA_FORMAT ) + { + *numCldfbAnalyses = st_ivas->hSpar->hFbMixer->fb_cfg->num_in_chans; + + if ( st_ivas->hOutSetup.is_loudspeaker_setup && st_ivas->renderer_type == RENDERER_DIRAC ) + { + *numCldfbSyntheses = st_ivas->hOutSetup.nchan_out_woLFE; + } + else if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_FOA ) + { + *numCldfbSyntheses = st_ivas->hSpar->hFbMixer->fb_cfg->num_out_chans; + } + else + { + *numCldfbSyntheses = MAX_OUTPUT_CHANNELS; + } + } + if ( ivas_format != SBA_FORMAT ) + { + if ( st_ivas->nchan_transport > 2 && st_ivas->sba_planar ) + { + *numCldfbAnalyses = st_ivas->nchan_transport + 1; + } + else if ( st_ivas->nchan_transport == 1 && st_ivas->hDirACRend->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) + { + *numCldfbAnalyses = st_ivas->nchan_transport + 1; + } + } + break; + case RENDERER_MC_PARAMMC: + if ( st_ivas->hDecoderConfig->nchan_out <= 2 ) + { + /* CLDFB not used in rendering */ + *numCldfbAnalyses = 0; + *numCldfbSyntheses = 0; + } + else + { + *numCldfbSyntheses = param_mc_get_num_cldfb_syntheses( st_ivas ); + } + break; + case RENDERER_PARAM_ISM: + /* Already correct with no exception */ + break; + case RENDERER_DISABLE: + /* CLDFB not used */ + *numCldfbAnalyses = 0; + *numCldfbSyntheses = 0; + break; + case RENDERER_MC: + case RENDERER_SBA_LINEAR_DEC: + case RENDERER_TD_PANNING: + case RENDERER_BINAURAL_OBJECTS_TD: + case RENDERER_MCMASA_MONO_STEREO: + case RENDERER_BINAURAL_MIXER_CONV: + case RENDERER_BINAURAL_MIXER_CONV_ROOM: + case RENDERER_BINAURAL_FASTCONV: + case RENDERER_BINAURAL_FASTCONV_ROOM: + case RENDERER_OSBA_STEREO: + case RENDERER_OSBA_AMBI: + case RENDERER_OSBA_LS: + if ( ivas_format == SBA_FORMAT || ivas_format == SBA_ISM_FORMAT ) + { + if ( st_ivas->sba_dirac_stereo_flag ) + { + *numCldfbAnalyses = 0; + *numCldfbSyntheses = 0; + } + else + { + *numCldfbAnalyses = st_ivas->hSpar->hFbMixer->fb_cfg->num_in_chans; + + if ( st_ivas->hOutSetup.is_loudspeaker_setup && st_ivas->renderer_type == RENDERER_DIRAC ) + { + *numCldfbSyntheses = st_ivas->hOutSetup.nchan_out_woLFE; + } + else if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_FOA ) + { + *numCldfbSyntheses = st_ivas->hSpar->hFbMixer->fb_cfg->num_out_chans; + } + else + { + *numCldfbSyntheses = MAX_OUTPUT_CHANNELS; + } + + if ( st_ivas->ivas_format == SBA_ISM_FORMAT && st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) + { + *numCldfbAnalyses = st_ivas->nchan_ism + st_ivas->hSpar->hFbMixer->fb_cfg->num_in_chans; + } + } + } + else if ( st_ivas->mc_mode == MC_MODE_PARAMMC ) + { + /* do nothing for ParamMC */ + } + else + { + /* CLDFB not used in rendering */ + *numCldfbAnalyses = 0; + *numCldfbSyntheses = 0; + } + break; + case RENDERER_SBA_LINEAR_ENC: + if ( st_ivas->mc_mode == MC_MODE_PARAMMC ) + { + *numCldfbSyntheses = param_mc_get_num_cldfb_syntheses( st_ivas ); + } + else if ( st_ivas->ism_mode == ISM_MODE_PARAM ) + { + *numCldfbSyntheses = st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe; + } + else if ( st_ivas->mc_mode == MC_MODE_MCMASA ) + { + *numCldfbAnalyses = st_ivas->nchan_transport; + *numCldfbSyntheses = st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe; + } + else + { + /* CLDFB not used in rendering */ + *numCldfbAnalyses = 0; + *numCldfbSyntheses = 0; + } + break; + default: + assert( 0 && "Renderer not handled for CLDFB reservation." ); + } + + if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX && st_ivas->hDecoderConfig->output_config != IVAS_AUDIO_CONFIG_MONO && st_ivas->hDecoderConfig->output_config != IVAS_AUDIO_CONFIG_STEREO ) + { + if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) + { + *numCldfbAnalyses = max( MC_PARAMUPMIX_MAX_INPUT_CHANS, *numCldfbAnalyses ); + } + else + { + *numCldfbAnalyses = max( MC_PARAMUPMIX_MIN_CLDFB, *numCldfbAnalyses ); + } + *numCldfbSyntheses = max( MC_PARAMUPMIX_MIN_CLDFB, *numCldfbSyntheses ); + } + + return; +} + + +/*---------------------------------------------------------------------* + * doSanityChecks_IVAS() + * + * Sanity checks - verify if the decoder set-up parameters are + * not in conflict with the IVAS format + *---------------------------------------------------------------------*/ + +static ivas_error doSanityChecks_IVAS( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +) +{ + int32_t output_Fs; + AUDIO_CONFIG output_config; + + output_Fs = st_ivas->hDecoderConfig->output_Fs; + output_config = st_ivas->hDecoderConfig->output_config; + + /*-----------------------------------------------------------------* + * Sanity checks + *-----------------------------------------------------------------*/ + + if ( output_Fs == 8000 ) + { + return IVAS_ERROR( IVAS_ERR_INVALID_SAMPLING_RATE, "8kHz output sampling rate is not supported in IVAS." ); + } + + assert( st_ivas->ivas_format != UNDEFINED_FORMAT && "\n IVAS format undefined" ); + assert( st_ivas->ivas_format != MONO_FORMAT && "\n Wrong IVAS format: MONO" ); + + /* Verify output configuration compatible with non-diegetic panning */ + if ( st_ivas->hDecoderConfig->Opt_non_diegetic_pan && ( st_ivas->ivas_format != MONO_FORMAT ) && ( st_ivas->transport_config != IVAS_AUDIO_CONFIG_ISM1 ) ) + { + return IVAS_ERROR( IVAS_ERR_INVALID_OUTPUT_FORMAT, "Error: Non-diegetic panning not supported in this IVAS format" ); + } + + /* Verify stereo output configuration */ + if ( st_ivas->ivas_format == STEREO_FORMAT ) + { + if ( output_config != IVAS_AUDIO_CONFIG_MONO && output_config != IVAS_AUDIO_CONFIG_STEREO && output_config != IVAS_AUDIO_CONFIG_5_1 && output_config != IVAS_AUDIO_CONFIG_7_1 && output_config != IVAS_AUDIO_CONFIG_5_1_2 && output_config != IVAS_AUDIO_CONFIG_5_1_4 && output_config != IVAS_AUDIO_CONFIG_7_1_4 && output_config != IVAS_AUDIO_CONFIG_LS_CUSTOM ) + { + return IVAS_ERROR( IVAS_ERR_INVALID_OUTPUT_FORMAT, "Wrong output configuration specified for Stereo!" ); + } + } + else if ( st_ivas->ivas_format == ISM_FORMAT ) + { + /* Verify ISM output configuration */ + if ( output_config == IVAS_AUDIO_CONFIG_INVALID ) + { + return IVAS_ERROR( IVAS_ERR_INVALID_OUTPUT_FORMAT, "Incorrect output configuration specified for ISM" ); + } + } + else if ( st_ivas->ivas_format == SBA_FORMAT ) + { + /* Verify SBA output coniguration */ + if ( output_config == IVAS_AUDIO_CONFIG_INVALID ) + { + return IVAS_ERROR( IVAS_ERR_INVALID_OUTPUT_FORMAT, "Incorrect output configuration specified for SBA" ); + } + } + else if ( st_ivas->ivas_format == MASA_FORMAT ) + { + if ( output_config == IVAS_AUDIO_CONFIG_INVALID ) + { + return IVAS_ERROR( IVAS_ERR_INVALID_OUTPUT_FORMAT, "Incorrect output configuration specified for MASA!" ); + } + } + else if ( st_ivas->ivas_format == MC_FORMAT ) + { + /* Verify MC output configuration */ + if ( output_config == IVAS_AUDIO_CONFIG_INVALID || output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) + { + return IVAS_ERROR( IVAS_ERR_INVALID_OUTPUT_FORMAT, "Incorrect output configuration specified for Multi-channel" ); + } + } + + + if ( st_ivas->hDecoderConfig->Opt_Headrotation ) + { + if ( !( output_config == IVAS_AUDIO_CONFIG_BINAURAL || output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR || output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB + ) ) + { + return IVAS_ERROR( IVAS_ERR_HEAD_ROTATION_NOT_SUPPORTED, "Wrong set-up: Head-rotation not supported in this configuration" ); + } + } + + if ( st_ivas->hDecoderConfig->Opt_ExternalOrientation ) + { + if ( !( output_config == IVAS_AUDIO_CONFIG_BINAURAL || output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR || output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) + { + return IVAS_ERROR( IVAS_ERR_EXT_ORIENTATION_NOT_SUPPORTED, "Wrong set-up: External orientation not supported in this configuration" ); + } + } + + if ( st_ivas->hDecoderConfig->Opt_dpid_on ) + { + if ( !( output_config == IVAS_AUDIO_CONFIG_BINAURAL || output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) + { + return IVAS_ERROR( IVAS_ERR_DIRECTIVITY_NOT_SUPPORTED, "Wrong set-up: Directivity is not supported in this output configuration." ); + } + } + + if ( st_ivas->hDecoderConfig->Opt_aeid_on ) + { + if ( output_config != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) + { + return IVAS_ERROR( IVAS_ERR_ACOUSTIC_ENVIRONMENT_NOT_SUPPORTED, "Wrong set-up: Acoustic environment is not supported in this output configuration." ); + } + } + + if ( st_ivas->ivas_format == MASA_ISM_FORMAT ) + { + if ( st_ivas->ism_mode != ISM_MASA_MODE_DISC && output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) + { + return IVAS_ERROR( IVAS_ERR_INVALID_OUTPUT_FORMAT, "Incorrect output configuration specified for combined MASA and ISM format" ); + } + } + + + return IVAS_ERR_OK; +} diff --git a/lib_dec/ivas_ism_dec.c b/lib_dec/ivas_ism_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..4decf5fc59cf28bc2ea5caf465ba63ad5fc570d0 --- /dev/null +++ b/lib_dec/ivas_ism_dec.c @@ -0,0 +1,487 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_prot_rend.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------------* + * ivas_ism_bitrate_switching_dec() + * + * + *-------------------------------------------------------------------------*/ + +static ivas_error ivas_ism_bitrate_switching_dec( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const int16_t nchan_transport_old, /* i : last number of transport channels */ + const ISM_MODE last_ism_mode, /* i : last ISM mode */ + uint16_t *nSamplesRendered, /* o : number of samples rendered */ + int16_t *data /* o : output synthesis signal */ +) +{ + ivas_error error; + int32_t element_brate_tmp[MAX_NUM_OBJECTS]; + int16_t nSCE_old, nCPE_old; + int16_t numCldfbAnalyses_old, numCldfbSyntheses_old, ism_mode; + TC_BUFFER_MODE tc_buffer_mode_new; + int16_t tc_nchan_tc_new; + int16_t tc_nchan_allocate_new; + int16_t tc_granularity_new; +#ifdef NONBE_FIX_839_MC_RS_CHANNEL_ALLOC + int16_t nchan_out_buff, nchan_out_buff_old; +#else + int16_t ch, nchan_out_buff, nchan_out_buff_old; +#endif + AUDIO_CONFIG intern_config_old; + IVAS_OUTPUT_SETUP hIntSetupOld; + RENDERER_TYPE renderer_type_old; + + error = IVAS_ERR_OK; + nCPE_old = st_ivas->nCPE; + nSCE_old = st_ivas->nSCE; + + /* we have to temporarily set the ism mode back to the old one, otherwise this can give wrong results*/ + ism_mode = st_ivas->ism_mode; + st_ivas->ism_mode = last_ism_mode; + ivas_init_dec_get_num_cldfb_instances( st_ivas, &numCldfbAnalyses_old, &numCldfbSyntheses_old ); + st_ivas->ism_mode = ism_mode; +#ifdef NONBE_FIX_839_MC_RS_CHANNEL_ALLOC + nchan_out_buff_old = ivas_get_nchan_buffers_dec( st_ivas, -1, -1 ); +#else + nchan_out_buff_old = ivas_get_nchan_buffers_dec( st_ivas, st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); +#endif + + if ( ( error = ivas_ism_config( st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->nchan_ism, NULL, 0, NULL, NULL, element_brate_tmp, NULL, NULL, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + + st_ivas->nSCE = st_ivas->nchan_transport; + + /*-----------------------------------------------------------------* + * Allocate, initialize, and configure SCE/CPE/MCT handles + *-----------------------------------------------------------------*/ + + if ( ( error = ivas_corecoder_dec_reconfig( st_ivas, nSCE_old, nCPE_old, nchan_transport_old, 0, st_ivas->hDecoderConfig->ivas_total_brate / st_ivas->nchan_transport, ( st_ivas->hDecoderConfig->ivas_total_brate / st_ivas->nchan_transport ) * CPE_CHANNELS ) ) != IVAS_ERR_OK ) + { + return error; + } + + /*-----------------------------------------------------------------* + * HP20 memories + *-----------------------------------------------------------------*/ + + if ( ( error = ivas_hp20_dec_reconfig( st_ivas, nchan_transport_old ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* save old IntSetup, might be needed for JBM flushing...*/ + intern_config_old = st_ivas->intern_config; + hIntSetupOld = st_ivas->hIntSetup; + tc_granularity_new = 1; + renderer_type_old = st_ivas->renderer_type; + + /*-----------------------------------------------------------------* + * Initialize the needed renderer struct and destroy the unnecessary renderer struct + *-----------------------------------------------------------------*/ + + /* select the renderer */ + ivas_renderer_select( st_ivas ); + + ivas_output_init( &( st_ivas->hIntSetup ), st_ivas->intern_config ); + + if ( ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) && ( st_ivas->ism_mode == ISM_MODE_DISC ) ) + { + ivas_output_init( &( st_ivas->hIntSetup ), st_ivas->hDecoderConfig->output_config ); + } + + if ( st_ivas->hDecoderConfig->Opt_5ms ) + { + /* transfer subframe info from DirAC or ParamMC to central tc buffer */ + if ( last_ism_mode == ISM_MODE_PARAM && st_ivas->hSpatParamRendCom != NULL && ( st_ivas->renderer_type != RENDERER_MONO_DOWNMIX && st_ivas->renderer_type != RENDERER_DISABLE ) ) + { + st_ivas->hTcBuffer->nb_subframes = st_ivas->hSpatParamRendCom->nb_subframes; + st_ivas->hTcBuffer->subframes_rendered = st_ivas->hSpatParamRendCom->subframes_rendered; + st_ivas->hTcBuffer->num_slots = st_ivas->hSpatParamRendCom->num_slots; + st_ivas->hTcBuffer->slots_rendered = st_ivas->hSpatParamRendCom->slots_rendered; + mvs2s( st_ivas->hSpatParamRendCom->subframe_nbslots, st_ivas->hTcBuffer->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); + } + + /* JBM: when granularity goes down (e.g. Discrete ISM with TD Obj Renderer -> ParamISM with binaural fastconv + render what still fits in the new granularity */ + tc_granularity_new = ivas_jbm_dec_get_render_granularity( st_ivas->renderer_type, st_ivas->ivas_format, st_ivas->mc_mode, st_ivas->hDecoderConfig->output_Fs ); + + if ( tc_granularity_new < st_ivas->hTcBuffer->n_samples_granularity ) + { + if ( ( error = ivas_jbm_dec_flush_renderer( st_ivas, tc_granularity_new, renderer_type_old, intern_config_old, &hIntSetupOld, MC_MODE_NONE, last_ism_mode, nSamplesRendered, data ) ) != IVAS_ERR_OK ) + { + return error; + } + } + /* JBM: when granularity goes up set samples to discard at the beginning of the frame */ + else if ( tc_granularity_new > st_ivas->hTcBuffer->n_samples_granularity ) + { + if ( ( error = ivas_jbm_dec_set_discard_samples( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + + if ( st_ivas->ism_mode != last_ism_mode ) + { + /* EFAP handle */ + efap_free_data( &st_ivas->hEFAPdata ); + } + + /*-----------------------------------------------------------------* + * Switching between ParamISM and DiscISM + *-----------------------------------------------------------------*/ + + /* switching from ParamISM to DiscISM */ + if ( st_ivas->ism_mode == ISM_MODE_DISC && last_ism_mode == ISM_MODE_PARAM ) + { + /* Deallocate the ParamISM struct */ + ivas_param_ism_dec_close( &( st_ivas->hParamIsmDec ), &( st_ivas->hSpatParamRendCom ), st_ivas->hDecoderConfig->output_config ); + + if ( st_ivas->hOutSetup.output_config == IVAS_AUDIO_CONFIG_BINAURAL || st_ivas->hOutSetup.output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB + ) + { + /* close the parametric binaural renderer */ + ivas_dirac_dec_close_binaural_data( &st_ivas->hDiracDecBin ); + /* Open the TD Binaural renderer */ + if ( st_ivas->hHrtfTD == NULL || st_ivas->hBinRendererTd == NULL ) + { + if ( ( error = ivas_td_binaural_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + if ( st_ivas->hIntSetup.output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) + { + if ( ( error = ivas_reverb_open( &st_ivas->hReverb, st_ivas->hDecoderConfig->output_config, NULL, st_ivas->hBinRendererTd->HrFiltSet_p->lr_energy_and_iac, st_ivas->hRenderConfig, st_ivas->hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + } + else + { + /* close the ISM renderer and reinitialize */ + ivas_ism_renderer_close( &st_ivas->hIsmRendererData ); + + if ( ( error = ivas_ism_renderer_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( st_ivas->hOutSetup.output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) + { + /* close the parametric binaural renderer */ + ivas_dirac_dec_close_binaural_data( &st_ivas->hDiracDecBin ); + + /* Open Crend Binaural renderer */ + if ( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hOutSetup.output_config, st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } + + st_ivas->binaural_latency_ns = st_ivas->hCrendWrapper->binaural_latency_ns; + } + } + + /* switching from Discrete ISM to ParamISM */ + if ( st_ivas->ism_mode == ISM_MODE_PARAM && last_ism_mode == ISM_MODE_DISC ) + { + /* Allocate and initialize the ParamISM struct */ + if ( ( error = ivas_param_ism_dec_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( st_ivas->hOutSetup.output_config == IVAS_AUDIO_CONFIG_BINAURAL || st_ivas->hOutSetup.output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB + ) + { + /* open the parametric binaural renderer */ + if ( ( error = ivas_dirac_dec_binaural_copy_hrtfs( &st_ivas->hHrtfParambin ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = ivas_dirac_dec_init_binaural_data( st_ivas, st_ivas->hHrtfParambin ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Close the TD Binaural renderer */ + if ( st_ivas->hBinRendererTd->HrFiltSet_p->ModelParams.modelROM == TRUE ) + { + ivas_td_binaural_close( &st_ivas->hBinRendererTd ); + st_ivas->hHrtfTD = NULL; + + if ( st_ivas->hOutSetup.output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) + { + ivas_reverb_close( &st_ivas->hReverb ); + } + } + } + else + { + /* Close the ISM renderer */ + ivas_ism_renderer_close( &st_ivas->hIsmRendererData ); + } + + if ( st_ivas->hOutSetup.output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) + { + /* open the parametric binaural renderer */ + if ( ( error = ivas_dirac_dec_binaural_copy_hrtfs( &st_ivas->hHrtfParambin ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = ivas_dirac_dec_init_binaural_data( st_ivas, st_ivas->hHrtfParambin ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* close the crend binaural renderer */ + ivas_rend_closeCrend( &( st_ivas->hCrendWrapper ) ); + } + } + + /*-----------------------------------------------------------------* + * CLDFB instances + *-----------------------------------------------------------------*/ + + if ( ( error = ivas_cldfb_dec_reconfig( st_ivas, nchan_transport_old, numCldfbAnalyses_old, numCldfbSyntheses_old ) ) != IVAS_ERR_OK ) + { + return error; + } + + /*-----------------------------------------------------------------* + * floating-point output audio buffers + *-----------------------------------------------------------------*/ + + if ( !st_ivas->hDecoderConfig->Opt_5ms ) + { +#ifdef NONBE_FIX_839_MC_RS_CHANNEL_ALLOC + nchan_out_buff = ivas_get_nchan_buffers_dec( st_ivas, -1, -1 ); + + if ( ( error = ivas_output_buff_dec( st_ivas->p_output_f, nchan_out_buff_old, nchan_out_buff ) ) != IVAS_ERR_OK ) + { + return error; + } +#else + nchan_out_buff = ivas_get_nchan_buffers_dec( st_ivas, st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); + + if ( nchan_out_buff > nchan_out_buff_old ) + { + for ( ch = nchan_out_buff_old; ch < nchan_out_buff; ch++ ) + { + /* note: these are intra-frame heap memories */ + if ( ( st_ivas->p_output_f[ch] = (float *) malloc( ( 48000 / FRAMES_PER_SEC ) * sizeof( float ) ) ) == NULL ) /* note: 32000 == max internal sampling rate */ + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for floating-point output audio buffer!\n" ) ); + } + } + } + else + { + for ( ch = nchan_out_buff; ch < nchan_out_buff_old; ch++ ) + { + free( st_ivas->p_output_f[ch] ); + st_ivas->p_output_f[ch] = NULL; + } + } +#endif + } + + /*-----------------------------------------------------------------* + * JBM TC buffers + *-----------------------------------------------------------------*/ + + if ( st_ivas->hDecoderConfig->Opt_5ms ) + { + int16_t tc_nchan_full_new; + DECODER_TC_BUFFER_HANDLE hTcBuffer; + + hTcBuffer = st_ivas->hTcBuffer; + tc_buffer_mode_new = ivas_jbm_dec_get_tc_buffer_mode( st_ivas ); + tc_nchan_tc_new = ivas_jbm_dec_get_num_tc_channels( st_ivas ); + tc_nchan_allocate_new = tc_nchan_tc_new; + tc_nchan_full_new = tc_nchan_tc_new; + + if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) + { + tc_nchan_allocate_new = 2 * BINAURAL_CHANNELS; + tc_nchan_full_new = tc_nchan_allocate_new; + } + + if ( st_ivas->ism_mode == ISM_MODE_PARAM && ( st_ivas->renderer_type != RENDERER_MONO_DOWNMIX && st_ivas->renderer_type != RENDERER_DISABLE && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) + { + tc_nchan_full_new = 0; + } + + /* reconfigure buffer */ + if ( hTcBuffer->tc_buffer_mode != tc_buffer_mode_new || hTcBuffer->nchan_transport_jbm != tc_nchan_tc_new || + hTcBuffer->nchan_buffer_full != tc_nchan_full_new || hTcBuffer->nchan_transport_internal != tc_nchan_allocate_new ) + { + if ( ( error = ivas_jbm_dec_tc_buffer_reconfigure( st_ivas, tc_buffer_mode_new, tc_nchan_tc_new, tc_nchan_allocate_new, tc_nchan_full_new, tc_granularity_new ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* transfer subframe info from central tc buffer to ParamMC or McMASA (DirAC) */ + if ( st_ivas->hSpatParamRendCom != NULL ) + { + st_ivas->hSpatParamRendCom->nb_subframes = st_ivas->hTcBuffer->nb_subframes; + st_ivas->hSpatParamRendCom->subframes_rendered = st_ivas->hTcBuffer->subframes_rendered; + st_ivas->hSpatParamRendCom->num_slots = st_ivas->hTcBuffer->num_slots; + st_ivas->hSpatParamRendCom->slots_rendered = st_ivas->hTcBuffer->slots_rendered; + + mvs2s( st_ivas->hTcBuffer->subframe_nbslots, st_ivas->hSpatParamRendCom->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); + } + } + + return error; +} + + +/*------------------------------------------------------------------------- + * ivas_ism_dec_config() + * + * - select ISM format mode + * - reconfigure the ISM format decoder + *-------------------------------------------------------------------------*/ + +ivas_error ivas_ism_dec_config( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const ISM_MODE last_ism_mode, /* i/o: last ISM mode */ + uint16_t *nSamplesRendered, /* o : number of samples flushed when the renderer granularity changes */ + int16_t *data /* o : output synthesis signal */ +) +{ + int32_t ivas_total_brate; + ivas_error error; + int16_t nchan_transport_old; + + error = IVAS_ERR_OK; + ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; + + /* Assumes that num of input objects are constant */ + nchan_transport_old = st_ivas->nchan_ism; + + if ( last_ism_mode == ISM_MODE_PARAM ) + { + nchan_transport_old = MAX_PARAM_ISM_WAVE; + } + + if ( !st_ivas->bfi && ivas_total_brate != IVAS_SID_5k2 && ivas_total_brate != FRAME_NO_DATA ) + { + /* select ISM format mode */ + st_ivas->ism_mode = ivas_ism_mode_select( st_ivas->nchan_ism, ivas_total_brate ); + + st_ivas->nchan_transport = st_ivas->nchan_ism; + if ( st_ivas->ism_mode == ISM_MODE_PARAM ) + { + st_ivas->nchan_transport = MAX_PARAM_ISM_WAVE; + if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) + { + st_ivas->hDecoderConfig->nchan_out = st_ivas->nchan_ism; + } + } + + if ( st_ivas->ini_active_frame != 0 ) + { + /* ISM bit-rate switching */ + { + if ( ( st_ivas->ism_mode != last_ism_mode ) || ( st_ivas->hDecoderConfig->ivas_total_brate != st_ivas->hDecoderConfig->last_ivas_total_brate ) ) + { + if ( ( error = ivas_ism_bitrate_switching_dec( st_ivas, nchan_transport_old, last_ism_mode, nSamplesRendered, + data ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + } + } + else if ( !st_ivas->bfi && ivas_total_brate == IVAS_SID_5k2 ) + { + st_ivas->nchan_transport = st_ivas->nchan_ism; + if ( st_ivas->ism_mode == ISM_MODE_PARAM ) + { + st_ivas->nchan_transport = MAX_PARAM_ISM_WAVE; + if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) + { + st_ivas->hDecoderConfig->nchan_out = st_ivas->nchan_ism; + } + } + + /* ISM mode switching */ + if ( st_ivas->ism_mode != last_ism_mode ) + { + if ( ( error = ivas_ism_bitrate_switching_dec( st_ivas, nchan_transport_old, last_ism_mode, nSamplesRendered, + data ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + + switch ( st_ivas->nchan_ism ) + { + case 1: + st_ivas->transport_config = IVAS_AUDIO_CONFIG_ISM1; + break; + case 2: + st_ivas->transport_config = IVAS_AUDIO_CONFIG_ISM2; + break; + case 3: + st_ivas->transport_config = IVAS_AUDIO_CONFIG_ISM3; + break; + case 4: + st_ivas->transport_config = IVAS_AUDIO_CONFIG_ISM4; + break; + default: + st_ivas->transport_config = IVAS_AUDIO_CONFIG_INVALID; + break; + } + + return error; +} diff --git a/lib_dec/ivas_ism_dtx_dec.c b/lib_dec/ivas_ism_dtx_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..1ff155e93abdf1a874a2bc0ad8c37e3563c3e26b --- /dev/null +++ b/lib_dec/ivas_ism_dtx_dec.c @@ -0,0 +1,202 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include "options.h" +#include "ivas_prot.h" +#include "prot.h" +#include "wmc_auto.h" + + +/*-------------------------------------------------------------------* + * ivas_ism_dtx_dec() + * + * ISM DTX Metadata decoding routine + *-------------------------------------------------------------------*/ + +ivas_error ivas_ism_dtx_dec( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + int16_t *nb_bits_metadata /* o : number of metadata bits */ +) +{ + int16_t ch, pos, nchan_ism, nchan_ism_prev; + int32_t ivas_total_brate; + int16_t md_diff_flag[MAX_NUM_OBJECTS]; + int16_t idx, flag_noisy_speech, sce_id_dtx; + ISM_MODE last_ism_mode, ism_mode_bstr; + ivas_error error; + Decoder_State *st; + + ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; + + + nchan_ism_prev = st_ivas->nchan_ism; + + if ( !st_ivas->bfi && ivas_total_brate == IVAS_SID_5k2 ) + { + /* read number of objects */ + nchan_ism = 1; + pos = (int16_t) ( ( ivas_total_brate / FRAMES_PER_SEC ) - 1 - SID_FORMAT_NBITS ); + + while ( get_indice( st_ivas->hSCE[0]->hCoreCoder[0], pos, 1 ) == 1 && nchan_ism < MAX_NUM_OBJECTS ) + { + ( nchan_ism )++; + pos--; + } + st_ivas->nchan_ism = nchan_ism; + pos--; + + if ( nchan_ism != nchan_ism_prev ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "wrong number of objects signalled!" ); + } + + last_ism_mode = st_ivas->ism_mode; + + /* read ism_mode */ + if ( nchan_ism > 2 ) + { + pos -= nchan_ism; /* SID metadata flags */ + + idx = get_indice( st_ivas->hSCE[0]->hCoreCoder[0], pos, 1 ); + ism_mode_bstr = (ISM_MODE) ( idx + 1 ); + st_ivas->ism_mode = ism_mode_bstr; + } + + if ( ( error = ivas_ism_dec_config( st_ivas, last_ism_mode, NULL, NULL ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + nchan_ism = nchan_ism_prev; + } + + /* Metadata decoding and dequantization */ + ivas_ism_metadata_sid_dec( st_ivas->hSCE, ivas_total_brate, st_ivas->bfi, nchan_ism, st_ivas->nchan_transport, st_ivas->ism_mode, + &flag_noisy_speech, &sce_id_dtx, st_ivas->hIsmMetaData, nb_bits_metadata ); + + if ( ivas_total_brate == IVAS_SID_5k2 && !st_ivas->bfi ) + { + if ( st_ivas->hParamIsmDec != NULL ) + { + st_ivas->hParamIsmDec->hParamIsm->flag_noisy_speech = flag_noisy_speech; + } + + st_ivas->hISMDTX.sce_id_dtx = sce_id_dtx; + } + + set_s( md_diff_flag, 1, nchan_ism ); + + if ( st_ivas->ism_mode == ISM_MODE_PARAM ) + { + for ( ch = 0; ch < nchan_ism; ch++ ) + { + st_ivas->hParamIsmDec->azimuth_values[ch] = st_ivas->hIsmMetaData[ch]->azimuth; + st_ivas->hParamIsmDec->elevation_values[ch] = st_ivas->hIsmMetaData[ch]->elevation; + } + } + + update_last_metadata( nchan_ism, st_ivas->hIsmMetaData, md_diff_flag ); + + st_ivas->hISMDTX.ism_dtx_hangover_cnt = 0; + + if ( ivas_total_brate == IVAS_SID_5k2 && !st_ivas->bfi ) + { + for ( ch = 0; ch < st_ivas->nchan_transport; ch++ ) + { + nb_bits_metadata[ch] = nb_bits_metadata[sce_id_dtx]; + } + } + + if ( !st_ivas->bfi ) + { + for ( ch = 0; ch < st_ivas->nchan_transport; ch++ ) + { + st = st_ivas->hSCE[ch]->hCoreCoder[0]; + st->bit_stream = st_ivas->hSCE[0]->hCoreCoder[0]->bit_stream; + st->next_bit_pos = 0; /* note: needed in paramISM -> discISM switching */ + st->cng_ism_flag = 1; + st->L_frame = min( st->L_frame, L_FRAME16k ); /* note: needed for switching from active frame with L_frame=640 to CNG in object with no SID */ + } + } + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * ivs_ism_dtx_limit_noise_energy_for_near_silence() + * + * for DTX frames where the energy of the sent noise estimate of the dominant object + * is near silence, limit the other objects CNG energies to the same level + *-------------------------------------------------------------------*/ + +void ivas_ism_dtx_limit_noise_energy_for_near_silence( + SCE_DEC_HANDLE hSCE[], /* i/o: SCE decoder structures */ + const int16_t sce_id_dtx, /* i : SCE DTX ID */ + const int16_t nchan_transport /* i : number of transport channels */ +) +{ + float fac, cng_noise_nrg_obj, cng_noise_nrg_dominant; + int16_t ch, cng_noise_level_len; + HANDLE_FD_CNG_COM hFdCngCom; + + hFdCngCom = hSCE[sce_id_dtx]->hCoreCoder[0]->hFdCngDec->hFdCngCom; + cng_noise_level_len = hFdCngCom->stopFFTbin - hFdCngCom->startBand; + cng_noise_nrg_dominant = dotp( hFdCngCom->cngNoiseLevel, hFdCngCom->cngNoiseLevel, cng_noise_level_len ); + + if ( cng_noise_nrg_dominant < 1.f ) + { + for ( ch = 0; ch < nchan_transport; ch++ ) + { + if ( ch == sce_id_dtx ) + { + continue; + } + + hFdCngCom = hSCE[ch]->hCoreCoder[0]->hFdCngDec->hFdCngCom; + cng_noise_level_len = hFdCngCom->stopFFTbin - hFdCngCom->startBand; + cng_noise_nrg_obj = dotp( hFdCngCom->cngNoiseLevel, hFdCngCom->cngNoiseLevel, cng_noise_level_len ); + + if ( cng_noise_nrg_obj > cng_noise_nrg_dominant ) + { + fac = sqrtf( cng_noise_nrg_dominant / cng_noise_nrg_obj ); + v_multc( hFdCngCom->cngNoiseLevel, fac, hFdCngCom->cngNoiseLevel, cng_noise_level_len ); + } + } + } + + return; +} diff --git a/lib_dec/ivas_ism_metadata_dec.c b/lib_dec/ivas_ism_metadata_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..c4b07078dc0d303b6f16665629b5455bb9b9e948 --- /dev/null +++ b/lib_dec/ivas_ism_metadata_dec.c @@ -0,0 +1,1089 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "ivas_cnst.h" +#include "ivas_prot.h" +#include "ivas_rom_com.h" +#include "prot.h" +#include "ivas_stat_enc.h" +#include +#include "wmc_auto.h" + + +/*-----------------------------------------------------------------------* + * Local functions + *-----------------------------------------------------------------------*/ + +static void decode_angle_indices( DEC_CORE_HANDLE st0, ISM_METADATA_ANGLE_HANDLE angle, const int16_t non_diegetic_flag, int16_t *flag_abs_azimuth ); + +static int16_t decode_radius( DEC_CORE_HANDLE st0, int16_t *last_radius_idx, int16_t *flag_abs_radius ); + + +/*-------------------------------------------------------------------------* + * Local constants + *-------------------------------------------------------------------------*/ + +#define IVAS_ISM_DTX_HO_MAX 5 + +#define CNG_MD_MAX_DIFF_AZIMUTH 5 +#define CNG_MD_MAX_DIFF_ELEVATION 5 + +#define MAX_BITS_ISM_METADATA ( 2 * ISM_EXTENDED_METADATA_BITS + MAX_NUM_OBJECTS * ( 1 /*number of objects*/ + ISM_METADATA_MD_FLAG_BITS + 2 * ISM_METADATA_FLAG_BITS + ISM_METADATA_IS_NDP_BITS + 1 /*abs.flag*/ + ISM_AZIMUTH_NBITS + ISM_ELEVATION_NBITS + 1 /*abs.flag*/ + ISM_RADIUS_NBITS + 1 /*abs.flag*/ + ISM_AZIMUTH_NBITS + ISM_ELEVATION_NBITS ) + 10 /* margin */ ) /* max. bit-budget of ISM metadata */ + + +/*-------------------------------------------------------------------* + * ism_metadata_smooth() + * + * Smooth the metadata evolution + *-------------------------------------------------------------------*/ + +static void ism_metadata_smooth( + ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ + const int32_t ism_total_brate, /* i : ISms total bitrate */ + const int16_t nchan_ism /* i : number of objects */ +) +{ + ISM_METADATA_HANDLE hIsmMetaData; + int16_t ch; + float diff; + + for ( ch = 0; ch < nchan_ism; ch++ ) + { + hIsmMetaData = hIsmMeta[ch]; + + /* smooth azimuth */ + diff = hIsmMetaData->last_true_azimuth - hIsmMetaData->last_azimuth; + + if ( diff > ISM_AZIMUTH_MAX ) + { + diff -= ( ISM_AZIMUTH_MAX - ISM_AZIMUTH_MIN ); + hIsmMetaData->last_azimuth += ( ISM_AZIMUTH_MAX - ISM_AZIMUTH_MIN ); + } + else if ( diff < ISM_AZIMUTH_MIN ) + { + diff += ( ISM_AZIMUTH_MAX - ISM_AZIMUTH_MIN ); + } + + if ( ism_total_brate > IVAS_SID_5k2 && fabsf( diff ) > IVAS_ISM_DTX_HO_MAX * CNG_MD_MAX_DIFF_AZIMUTH ) + { + /* skip the smoothing */ + } + else if ( fabsf( diff ) > CNG_MD_MAX_DIFF_AZIMUTH ) + { + hIsmMetaData->azimuth = hIsmMetaData->last_azimuth + sign( diff ) * CNG_MD_MAX_DIFF_AZIMUTH; + } + else if ( diff != 0 ) + { + hIsmMetaData->azimuth = hIsmMetaData->last_true_azimuth; + } + + if ( hIsmMetaData->azimuth > ISM_AZIMUTH_MAX ) + { + hIsmMetaData->azimuth -= ( ISM_AZIMUTH_MAX - ISM_AZIMUTH_MIN ); + } + + /* smooth elevation */ + diff = hIsmMetaData->last_true_elevation - hIsmMetaData->last_elevation; + + if ( ism_total_brate > IVAS_SID_5k2 && diff > IVAS_ISM_DTX_HO_MAX * CNG_MD_MAX_DIFF_ELEVATION ) + { + /* skip the smoothing */ + } + else if ( fabsf( diff ) > CNG_MD_MAX_DIFF_ELEVATION ) + { + hIsmMetaData->elevation = hIsmMetaData->last_elevation + sign( diff ) * CNG_MD_MAX_DIFF_ELEVATION; + } + } + + return; +} + + +/*-------------------------------------------------------------------------* + * ivas_ism_metadata_dec() + * + * decode and dequantize ISM metadata + *-------------------------------------------------------------------------*/ + +ivas_error ivas_ism_metadata_dec( + const int32_t ism_total_brate, /* i : ISM total bitrate */ + const int16_t nchan_ism, /* i : number of ISM channels */ + int16_t *nchan_transport, /* o : number of transport channels */ + ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ + SCE_DEC_HANDLE hSCE[], /* i/o: SCE decoder handles */ + const int16_t bfi, /* i : bfi flag */ + int16_t nb_bits_metadata[], /* o : number of metadata bits */ + ISM_MODE ism_mode, /* i : ISM mode */ + ISM_DTX_DATA_DEC hISMDTX, /* i/o: ISM DTX structure */ + const PARAM_ISM_CONFIG_HANDLE hParamIsm, /* i : Param ISM Config Handle */ + int16_t *ism_extmeta_active, /* i/o: Extended metadata active in renderer */ + int16_t *ism_extmeta_cnt, /* i/o: Number of change frames observed */ + DEC_CORE_HANDLE st0 /* i : core-coder handle */ +) +{ + int16_t ch, nb_bits_start = 0, last_bit_pos; + int16_t idx_radius; + int32_t element_brate[MAX_NUM_OBJECTS], total_brate[MAX_NUM_OBJECTS]; + int16_t ism_extmeta_bitstream; + int16_t non_diegetic_flag_global; + float yaw, pitch, radius; + int16_t flag_abs_radius; + int16_t flag_abs_orientation; + int16_t flag_abs_position; + int16_t idx_angle1; + int16_t idx_angle2; + int16_t next_bit_pos_orig; + uint16_t i, bstr_meta[MAX_BITS_ISM_METADATA], *bstr_orig; + ISM_METADATA_HANDLE hIsmMetaData; + int16_t nchan_transport_prev, ism_metadata_flag_global; + int16_t null_metadata_flag[MAX_NUM_OBJECTS]; + int16_t lowrate_metadata_flag[MAX_NUM_OBJECTS]; + int16_t ism_imp[MAX_NUM_OBJECTS]; + int16_t nbands, nblocks; + int16_t md_diff_flag[MAX_NUM_OBJECTS]; + ivas_error error; + + push_wmops( "ism_meta_dec" ); + + /* initialization */ + ism_metadata_flag_global = 0; + nchan_transport_prev = *nchan_transport; + + last_bit_pos = (int16_t) ( ( ism_total_brate / FRAMES_PER_SEC ) - 1 ); + bstr_orig = st0->bit_stream; + next_bit_pos_orig = st0->next_bit_pos; + st0->next_bit_pos = 0; + ism_extmeta_bitstream = 0; + non_diegetic_flag_global = 0; + set_s( null_metadata_flag, 0, nchan_ism ); + set_s( lowrate_metadata_flag, 0, nchan_ism ); + + /* reverse the bitstream for easier reading of indices */ + for ( i = 0; i < min( MAX_BITS_ISM_METADATA, last_bit_pos ); i++ ) + { + bstr_meta[i] = st0->bit_stream[last_bit_pos - i]; + } + st0->bit_stream = bstr_meta; + st0->total_brate = ism_total_brate; /* needed for BER detection in get_next_indice() */ + + if ( !bfi ) + { + /*----------------------------------------------------------------* + * Read ISM common signaling + *----------------------------------------------------------------*/ + if ( ism_mode == ISM_SBA_MODE_DISC ) + { + /* number of objects was read in ivas_dec_setup() */ + st0->next_bit_pos += NO_BITS_MASA_ISM_NO_OBJ; + } + else if ( ism_mode != ISM_MASA_MODE_DISC && ism_mode != ISM_MASA_MODE_MASA_ONE_OBJ ) + { + /* number of objects was read in ivas_dec_setup() */ + st0->next_bit_pos += nchan_ism; + + ism_mode = ivas_ism_mode_select( nchan_ism, ism_total_brate ); + } + + if ( ism_mode == ISM_MODE_PARAM ) + { + *nchan_transport = MAX_PARAM_ISM_WAVE; + } + else if ( ism_mode == ISM_MODE_DISC ) + { + *nchan_transport = nchan_ism; + } + + if ( *nchan_transport != nchan_transport_prev ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "wrong number of objects signalled!" ); + } + + /* read extended metadata presence flag */ + if ( ( ism_mode == ISM_MODE_DISC || ism_mode == ISM_SBA_MODE_DISC ) && ism_total_brate >= ISM_EXTENDED_METADATA_BRATE ) + { + ism_extmeta_bitstream = get_next_indice( st0, ISM_EXTENDED_METADATA_BITS ); + + /* read global non-diegetic object flag */ + if ( ism_extmeta_bitstream ) + { + non_diegetic_flag_global = get_next_indice( st0, ISM_METADATA_IS_NDP_BITS ); + } + } + + /* Apply hysteresis in case rate switching causes fluctuation in presence of extended metadata */ + if ( *ism_extmeta_active == -1 || *ism_extmeta_active == ism_extmeta_bitstream ) /* If first frame or bitstream matches internal state */ + { + *ism_extmeta_active = ism_extmeta_bitstream; + *ism_extmeta_cnt = 0; + } + else + { + ( *ism_extmeta_cnt )++; + if ( *ism_extmeta_cnt == ISM_METADATA_RS_MAX_FRAMES ) /* ISM_METADATA_RS_MAX_FRAMES change frames observed - update state */ + { + *ism_extmeta_active = ism_extmeta_bitstream; + *ism_extmeta_cnt = 0; + } + } + + /* Read ISM metadata flags (one per object) */ + for ( ch = 0; ch < *nchan_transport; ch++ ) + { + if ( ism_mode == ISM_SBA_MODE_DISC ) + { + ism_imp[ch] = get_next_indice( st0, 1 ); + } + else if ( ism_mode == ISM_MASA_MODE_DISC || ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) + { + /* ISM importance flag is already read in ivas_masa_decode() */ + ism_imp[ch] = hIsmMeta[ch]->ism_imp; + } + else + { + ism_imp[ch] = get_next_indice( st0, ISM_METADATA_FLAG_BITS ); + } + + if ( ism_imp[ch] > ISM_NO_META ) + { + hIsmMeta[ch]->ism_metadata_flag = 1; + } + else + { + hIsmMeta[ch]->ism_metadata_flag = 0; + } + + ism_metadata_flag_global |= hIsmMeta[ch]->ism_metadata_flag; + } + + for ( ; ch < nchan_ism; ch++ ) + { + hIsmMeta[ch]->ism_metadata_flag = 1; + ism_metadata_flag_global |= hIsmMeta[ch]->ism_metadata_flag; + } + + /* read ISM_NO_META class signalling */ + if ( ism_mode == ISM_MODE_DISC || ism_mode == ISM_SBA_MODE_DISC ) + { + for ( ch = 0; ch < *nchan_transport; ch++ ) + { + if ( ism_imp[ch] == ISM_NO_META ) + { + /* low-rate ISM_NO_META frame */ + if ( ism_mode == ISM_MASA_MODE_DISC || ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) + { + null_metadata_flag[ch] = hIsmMeta[ch]->ism_md_null_flag; + } + else + { + null_metadata_flag[ch] = get_next_indice( st0, ISM_METADATA_INACTIVE_FLAG_BITS ); + } + } + } + + for ( ch = 0; ch < *nchan_transport; ch++ ) + { + if ( ism_imp[ch] == ISM_NO_META ) + { + if ( ism_mode == ISM_MASA_MODE_DISC || ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) + { + lowrate_metadata_flag[ch] = hIsmMeta[ch]->ism_md_lowrate_flag; + + if ( null_metadata_flag[ch] == 0 ) + { + ism_metadata_flag_global |= lowrate_metadata_flag[ch]; + } + } + else if ( ism_mode != ISM_SBA_MODE_DISC ) + { + if ( null_metadata_flag[ch] ) + { + /* read the true ISM class */ + ism_imp[ch] = get_next_indice( st0, ISM_METADATA_FLAG_BITS ); + } + else + { + /* read presence of MD in low-rate ISM_NO_META frame flag */ + lowrate_metadata_flag[ch] = get_next_indice( st0, ISM_METADATA_INACTIVE_FLAG_BITS ); + + ism_metadata_flag_global |= lowrate_metadata_flag[ch]; + } + } + } + } + } + + if ( ism_metadata_flag_global ) + { + /*----------------------------------------------------------------* + * Metadata decoding and dequantization, loop over all objects + *----------------------------------------------------------------*/ + + int16_t total_bits_metadata = 0, bits_metadata_ism = 0; + int16_t nb_bits_objcod_read; + + if ( ism_mode == ISM_MODE_PARAM ) + { + nb_bits_start = st0->next_bit_pos; + } + + for ( ch = 0; ch < nchan_ism; ch++ ) + { + hIsmMetaData = hIsmMeta[ch]; + if ( ism_mode == ISM_MODE_DISC || ism_mode == ISM_SBA_MODE_DISC || ism_mode == ISM_MASA_MODE_DISC || ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) + { + nb_bits_start = st0->next_bit_pos; + } + flag_abs_position = 0; + flag_abs_orientation = 0; + flag_abs_radius = 0; + + if ( hIsmMeta[ch]->ism_metadata_flag || lowrate_metadata_flag[ch] ) + { + if ( non_diegetic_flag_global ) + { + /* read non-diegetic flag for each object */ + hIsmMetaData->non_diegetic_flag = get_next_indice( st0, ISM_METADATA_IS_NDP_BITS ); + } + else + { + hIsmMetaData->non_diegetic_flag = 0; + } + + if ( hIsmMetaData->non_diegetic_flag ) + { + /* Panning gain decoding */ + decode_angle_indices( st0, &( hIsmMetaData->position_angle ), hIsmMetaData->non_diegetic_flag, &flag_abs_position ); + idx_angle1 = hIsmMetaData->position_angle.last_angle1_idx; + idx_angle2 = 1 << ( ISM_ELEVATION_NBITS - 1 ); + + /* Panning gain dequantization */ + hIsmMetaData->azimuth = ism_dequant_meta( idx_angle1, ism_azimuth_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_AZIMUTH_NBITS ); + hIsmMetaData->elevation = 0.0f; + + /* save for smoothing metadata evolution */ + hIsmMetaData->last_true_azimuth = hIsmMetaData->azimuth; + hIsmMetaData->last_true_elevation = hIsmMetaData->elevation; + } + else + { + decode_angle_indices( st0, &( hIsmMetaData->position_angle ), hIsmMeta[ch]->non_diegetic_flag, &flag_abs_position ); + idx_angle1 = hIsmMetaData->position_angle.last_angle1_idx; + idx_angle2 = hIsmMetaData->position_angle.last_angle2_idx; + + /* Azimuth/Elevation dequantization */ + if ( ism_mode == ISM_MODE_PARAM ) + { + hParamIsm->azi_index[ch] = idx_angle1; + hParamIsm->ele_index[ch] = idx_angle2; + } + else /* ISM_MODE_DISC */ + { + hIsmMetaData->azimuth = ism_dequant_meta( idx_angle1, ism_azimuth_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_AZIMUTH_NBITS ); + hIsmMetaData->elevation = ism_dequant_meta( idx_angle2, ism_elevation_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_ELEVATION_NBITS ); + + /* radius/raw/pitch dequantization */ + if ( ism_extmeta_bitstream ) + { + decode_angle_indices( st0, &( hIsmMetaData->orientation_angle ), hIsmMeta[ch]->non_diegetic_flag, &flag_abs_orientation ); + idx_angle1 = hIsmMetaData->orientation_angle.last_angle1_idx; + idx_angle2 = hIsmMetaData->orientation_angle.last_angle2_idx; + yaw = ism_dequant_meta( idx_angle1, ism_azimuth_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_AZIMUTH_NBITS ); + pitch = ism_dequant_meta( idx_angle2, ism_elevation_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_ELEVATION_NBITS ); + + idx_radius = decode_radius( st0, &hIsmMetaData->last_radius_idx, &flag_abs_radius ); + radius = usdequant( idx_radius, ISM_RADIUS_MIN, ISM_RADIUS_DELTA ); + if ( *ism_extmeta_active == 1 ) + { + hIsmMetaData->yaw = yaw; + hIsmMetaData->pitch = pitch; + hIsmMetaData->radius = radius; + } + } + else + { + if ( *ism_extmeta_active == 0 ) + { + hIsmMetaData->yaw = 0.0f; + hIsmMetaData->pitch = 0.0f; + hIsmMetaData->radius = 1.0f; + } + } + } + /* save for smoothing metadata evolution */ + hIsmMetaData->last_true_azimuth = hIsmMetaData->azimuth; + hIsmMetaData->last_true_elevation = hIsmMetaData->elevation; + } + } + /* save number of metadata bits read */ + if ( ism_mode == ISM_MODE_DISC || ism_mode == ISM_SBA_MODE_DISC || ism_mode == ISM_MASA_MODE_DISC || ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) + { + nb_bits_metadata[ch] = st0->next_bit_pos - nb_bits_start; + } + } + + if ( ism_mode == ISM_MODE_PARAM ) + { + hParamIsm->flag_noisy_speech = get_next_indice( st0, 1 ); + + /* Loop over multiwave to read the object indices from bitstream */ + for ( ch = 0; ch < MAX_PARAM_ISM_WAVE; ch++ ) + { + for ( nbands = 0; nbands < hParamIsm->nbands; nbands++ ) + { + for ( nblocks = 0; nblocks < hParamIsm->nblocks[nbands]; nblocks++ ) + { + hParamIsm->obj_indices[nbands][nblocks][ch] = get_next_indice( st0, PARAM_ISM_OBJ_IND_NBITS ); + } + } + } + + /* Loop over all bands to read power ratio's from bitstream */ + for ( nbands = 0; nbands < hParamIsm->nbands; nbands++ ) + { + for ( nblocks = 0; nblocks < hParamIsm->nblocks[nbands]; nblocks++ ) + { + hParamIsm->power_ratios_idx[nbands][nblocks] = get_next_indice( st0, PARAM_ISM_POW_RATIO_NBITS ); + } + } + + /* save number of metadata bits read */ + total_bits_metadata = st0->next_bit_pos - nb_bits_start; + + /* bits per ISM*/ + bits_metadata_ism = (int16_t) ( total_bits_metadata / *nchan_transport ); + + nb_bits_objcod_read = 0; + for ( ch = 0; ch < *nchan_transport; ch++ ) + { + if ( ch == *nchan_transport - 1 ) + { + nb_bits_metadata[ch] = total_bits_metadata - nb_bits_objcod_read; + } + else + { + nb_bits_metadata[ch] = bits_metadata_ism; + nb_bits_objcod_read += bits_metadata_ism; + } + } + } + } + else + { + set_s( nb_bits_metadata, 0, *nchan_transport ); + } + } + else /* BFI */ + { + for ( ch = 0; ch < nchan_ism; ch++ ) + { + hIsmMeta[ch]->last_ism_metadata_flag = hIsmMeta[ch]->ism_metadata_flag; + } + + set_s( nb_bits_metadata, 0, *nchan_transport ); + + if ( ism_mode == ISM_MODE_PARAM ) + { + for ( ch = 0; ch < nchan_ism; ch++ ) + { + hParamIsm->azi_index[ch] = hParamIsm->azi_index[ch] + hParamIsm->last_az_sgn[ch] * hParamIsm->last_az_diff[ch]; + hParamIsm->ele_index[ch] = hParamIsm->ele_index[ch] + hParamIsm->last_el_sgn[ch] * hParamIsm->last_el_diff[ch]; + hIsmMeta[ch]->position_angle.last_angle1_idx = hParamIsm->azi_index[ch]; + hIsmMeta[ch]->position_angle.last_angle2_idx = hParamIsm->ele_index[ch]; + } + } + } + + if ( hISMDTX.ism_dtx_hangover_cnt < IVAS_ISM_DTX_HO_MAX ) + { + ism_metadata_smooth( hIsmMeta, ism_total_brate, nchan_ism ); + hISMDTX.ism_dtx_hangover_cnt += 1; + } + + if ( ism_mode == ISM_SBA_MODE_DISC ) + { + /* set the bitstream pointer to its original position */ + nb_bits_metadata[0] = st0->next_bit_pos; + st0->bit_stream = bstr_orig; + st0->next_bit_pos = next_bit_pos_orig; + + /* updates*/ + set_s( md_diff_flag, 1, nchan_ism ); + + update_last_metadata( nchan_ism, hIsmMeta, md_diff_flag ); + pop_wmops(); + return IVAS_ERR_OK; + } + + if ( ism_mode == ISM_MASA_MODE_DISC || ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) + { + ism_metadata_flag_global = 1; + } + + /*----------------------------------------------------------------* + * Configuration and decision about bitrates per channel + *----------------------------------------------------------------*/ + + if ( !bfi ) + { + int16_t masa_ism_flag = 0; + if ( ism_mode == ISM_MASA_MODE_DISC || ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) + { + masa_ism_flag = 1; + + for ( ch = 0; ch < *nchan_transport; ch++ ) + { + element_brate[ch] = hSCE[ch]->element_brate; + } + } + + if ( ( error = ivas_ism_config( ism_total_brate, *nchan_transport, nchan_ism, hIsmMeta, ism_extmeta_bitstream, null_metadata_flag, ism_imp, element_brate, total_brate, nb_bits_metadata, masa_ism_flag ) ) != IVAS_ERR_OK ) + { + return error; + } + + for ( ch = 0; ch < *nchan_transport; ch++ ) + { + hIsmMeta[ch]->last_ism_metadata_flag = hIsmMeta[ch]->ism_metadata_flag; + + hSCE[ch]->hCoreCoder[0]->low_rate_mode = 0; + if ( ism_mode == ISM_MODE_DISC || ism_mode == ISM_MASA_MODE_DISC || ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) + { + if ( ism_imp[ch] == ISM_NO_META && ( ( total_brate[ch] < ACELP_8k00 && element_brate[ch] < SCE_CORE_16k_LOW_LIMIT ) || + ( total_brate[ch] <= ACELP_16k_LOW_LIMIT && element_brate[ch] >= SCE_CORE_16k_LOW_LIMIT ) ) ) + { + hSCE[ch]->hCoreCoder[0]->low_rate_mode = 1; + } + } + + if ( ism_mode != ISM_MASA_MODE_DISC && ism_mode != ISM_MASA_MODE_MASA_ONE_OBJ ) + { + hSCE[ch]->element_brate = element_brate[ch]; + } + hSCE[ch]->hCoreCoder[0]->total_brate = total_brate[ch]; + } + + for ( ; ch < nchan_ism; ch++ ) + { + hIsmMeta[ch]->last_ism_metadata_flag = hIsmMeta[ch]->ism_metadata_flag; + } + } + else + { + for ( ch = 0; ch < *nchan_transport; ch++ ) + { + hSCE[ch]->element_brate = hSCE[ch]->last_element_brate; + hSCE[ch]->hCoreCoder[0]->total_brate = hSCE[ch]->hCoreCoder[0]->last_total_brate; + } + } + + /*----------------------------------------------------------------* + * Set bitsream pointers + *----------------------------------------------------------------*/ + + /* set the bitstream pointer to its original position */ + st0->bit_stream = bstr_orig; + st0->next_bit_pos = next_bit_pos_orig; + + /* set bitstream pointers for each ISM */ + for ( ch = 1; ch < *nchan_transport; ch++ ) + { + hSCE[ch]->hCoreCoder[0]->bit_stream = hSCE[ch - 1]->hCoreCoder[0]->bit_stream + ( hSCE[ch - 1]->hCoreCoder[0]->total_brate / FRAMES_PER_SEC ); + } + + /*----------------------------------------------------------------* + * Updates + *----------------------------------------------------------------*/ + + set_s( md_diff_flag, 1, nchan_ism ); + + update_last_metadata( nchan_ism, hIsmMeta, md_diff_flag ); + + for ( ch = 0; ch < *nchan_transport; ch++ ) + { + hSCE[ch]->hCoreCoder[0]->cng_ism_flag = 0; + } + + pop_wmops(); + + return IVAS_ERR_OK; +} + + +/*------------------------------------------------------------------------- + * ivas_ism_metadata_dec_create() + * + * Create, allocate, initialize and configure IVAS decoder ISM metadata handles + *-------------------------------------------------------------------------*/ + +ivas_error ivas_ism_metadata_dec_create( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const int16_t n_ISms, /* i : number of objects */ + int32_t element_brate_tmp[] /* o : element bitrate per object */ +) +{ + int16_t ch; + ivas_error error; + + /* allocate ISM metadata handles */ + for ( ch = 0; ch < MAX_NUM_OBJECTS; ch++ ) + { + if ( ( st_ivas->hIsmMetaData[ch] = (ISM_METADATA_HANDLE) malloc( sizeof( ISM_METADATA_FRAME ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for ISM MetaData\n" ) ); + } + + st_ivas->hIsmMetaData[ch]->last_ism_metadata_flag = 0; + st_ivas->hIsmMetaData[ch]->position_angle.last_angle1_idx = 0; + st_ivas->hIsmMetaData[ch]->position_angle.last_angle2_idx = 1 << ( ISM_ELEVATION_NBITS - 1 ); + st_ivas->hIsmMetaData[ch]->orientation_angle.last_angle1_idx = 0; + st_ivas->hIsmMetaData[ch]->orientation_angle.last_angle2_idx = 1 << ( ISM_ELEVATION_NBITS - 1 ); + st_ivas->hIsmMetaData[ch]->last_radius_idx = 8; /* Init to radius 1.0 */ + + st_ivas->hIsmMetaData[ch]->last_true_azimuth = 0; + st_ivas->hIsmMetaData[ch]->last_true_elevation = 0; + st_ivas->hIsmMetaData[ch]->last_azimuth = 0; + st_ivas->hIsmMetaData[ch]->last_elevation = 0; + + st_ivas->hIsmMetaData[ch]->ism_imp = -1; + st_ivas->hIsmMetaData[ch]->ism_md_null_flag = 0; + st_ivas->hIsmMetaData[ch]->ism_md_lowrate_flag = 0; + + ivas_ism_reset_metadata( st_ivas->hIsmMetaData[ch] ); + } + + if ( element_brate_tmp != NULL ) + { + if ( ( error = ivas_ism_config( st_ivas->hDecoderConfig->ivas_total_brate, n_ISms, n_ISms, NULL, 0, NULL, NULL, element_brate_tmp, NULL, NULL, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + st_ivas->hISMDTX.ism_dtx_hangover_cnt = IVAS_ISM_DTX_HO_MAX; + + return IVAS_ERR_OK; +} + + +/*------------------------------------------------------------------------- + * decode_angle_indices() + * + * Decoding of a position/orientation angle + *-------------------------------------------------------------------------*/ + +static void decode_angle_indices( + DEC_CORE_HANDLE st0, /* i/o: bitstream handle */ + ISM_METADATA_ANGLE_HANDLE angle, /* i/o: angle handle */ + const int16_t non_diegetic_flag, /* i : Non diegetic flag */ + int16_t *flag_abs_angle1 /* o : Azimuth/yaw encoding mode */ +) +{ + int16_t idx_angle1, nbits_diff_angle1, diff, sgn; + int16_t idx_angle2, nbits_diff_angle2; + + /*----------------------------------------------------------------* + * Azimuth/yaw decoding and dequantization + *----------------------------------------------------------------*/ + + /* Decode azimuth/yaw index */ + if ( get_next_indice( st0, 1 ) == 1 ) /* azimuth_abs_flag */ + { + idx_angle1 = get_next_indice( st0, ISM_AZIMUTH_NBITS ); + *flag_abs_angle1 = 1; + } + else + { + diff = 0; + sgn = 1; + + if ( get_next_indice( st0, 1 ) == 0 ) + { + nbits_diff_angle1 = 1; + } + else + { + nbits_diff_angle1 = 1; + + if ( get_next_indice( st0, 1 ) == 1 ) /* negative sign */ + { + sgn = -1; + } + + nbits_diff_angle1++; + + /* read until the stop bit */ + while ( ( nbits_diff_angle1 < ISM_AZIMUTH_NBITS - 1 ) && ( get_next_indice( st0, 1 ) == 1 ) ) + { + diff++; + nbits_diff_angle1++; + } + + if ( nbits_diff_angle1 < ISM_AZIMUTH_NBITS - 1 ) + { + /* count stop bit */ + nbits_diff_angle1++; + } + } + idx_angle1 = angle->last_angle1_idx + sgn * diff; + } + + /* azimuth/yaw is on a circle - check for diff coding for -180° -> 180° and vice versa changes */ + if ( idx_angle1 > ( 1 << ISM_AZIMUTH_NBITS ) - 1 ) + { + idx_angle1 -= ( 1 << ISM_AZIMUTH_NBITS ) - 1; /* +180° -> -180° */ + } + else if ( idx_angle1 < 0 ) + { + idx_angle1 += ( 1 << ISM_AZIMUTH_NBITS ) - 1; /* -180° -> +180° */ + } + + /* +180° == -180° */ + if ( idx_angle1 == ( 1 << ISM_AZIMUTH_NBITS ) - 1 ) + { + idx_angle1 = 0; + } + + /* sanity check in case of FER or BER */ + if ( idx_angle1 < 0 || idx_angle1 > ( 1 << ISM_AZIMUTH_NBITS ) - 1 ) + { + idx_angle1 = angle->last_angle1_idx; + } + + /*----------------------------------------------------------------* + * Elevation/pitch decoding and dequantization + *----------------------------------------------------------------*/ + + if ( non_diegetic_flag == 0 ) + { + /* Decode elevation/pitch index */ + if ( *flag_abs_angle1 == 0 && get_next_indice( st0, 1 ) == 1 ) /* elevation_abs_flag */ + { + idx_angle2 = get_next_indice( st0, ISM_ELEVATION_NBITS ); + } + else + { + diff = 0; + sgn = 1; + + if ( get_next_indice( st0, 1 ) == 0 ) + { + nbits_diff_angle2 = 1; + } + else + { + nbits_diff_angle2 = 1; + + if ( get_next_indice( st0, 1 ) == 1 ) /* negative sign */ + { + sgn = -1; + } + + nbits_diff_angle2++; + + /* read until the stop bit */ + while ( ( nbits_diff_angle2 < ISM_ELEVATION_NBITS ) && ( get_next_indice( st0, 1 ) == 1 ) ) + { + diff++; + nbits_diff_angle2++; + } + + if ( nbits_diff_angle2 < ISM_ELEVATION_NBITS ) + { + /* count stop bit */ + nbits_diff_angle2++; + } + } + + idx_angle2 = angle->last_angle2_idx + sgn * diff; + } + + /* sanity check in case of FER or BER */ + if ( idx_angle2 < 0 || idx_angle2 > ( 1 << ISM_ELEVATION_NBITS ) - 1 ) + { + idx_angle2 = angle->last_angle2_idx; + } + } + else + { + idx_angle2 = angle->last_angle2_idx; /* second MD parameter is not transmitted for non-diegetic object */ + } + + /*----------------------------------------------------------------* + * Final updates + *----------------------------------------------------------------*/ + + angle->last_angle2_idx = idx_angle2; + angle->last_angle1_idx = idx_angle1; + + return; +} + + +/*------------------------------------------------------------------------- + * decode_radius() + * + * Radius decoding and dequantization + *-------------------------------------------------------------------------*/ + +static int16_t decode_radius( + DEC_CORE_HANDLE st0, /* i/o: bitstream handle */ + int16_t *last_radius_idx, /* i/o: last radius index */ + int16_t *flag_abs_radius /* o : Radius encoding mode */ +) +{ + int16_t idx_radius, nbits_diff_radius, diff, sgn; + + /* Decode radius index */ + if ( get_next_indice( st0, 1 ) == 1 ) /* elevation_abs_flag */ + { + *flag_abs_radius = 1; + idx_radius = get_next_indice( st0, ISM_RADIUS_NBITS ); + } + else + { + diff = 0; + sgn = 1; + + if ( get_next_indice( st0, 1 ) == 0 ) + { + nbits_diff_radius = 1; + } + else + { + nbits_diff_radius = 1; + + if ( get_next_indice( st0, 1 ) == 1 ) /* negative sign */ + { + sgn = -1; + } + + nbits_diff_radius++; + + /* read until the stop bit */ + while ( ( nbits_diff_radius < ISM_RADIUS_NBITS ) && ( get_next_indice( st0, 1 ) == 1 ) ) + { + diff++; + nbits_diff_radius++; + } + + if ( nbits_diff_radius < ISM_RADIUS_NBITS ) + { + /* count stop bit */ + nbits_diff_radius++; + } + } + idx_radius = *last_radius_idx + sgn * diff; + } + + /* sanity check in case of FER or BER */ + if ( idx_radius < 0 || idx_radius > ( 1 << ISM_RADIUS_NBITS ) - 1 ) + { + idx_radius = *last_radius_idx; + } + + /* Final updates */ + *last_radius_idx = idx_radius; + + return idx_radius; +} + +/*-------------------------------------------------------------------* + * ivas_ism_metadata_sid_dec() + * + * Decode ISM metadata in SID frame + *-------------------------------------------------------------------*/ + +void ivas_ism_metadata_sid_dec( + SCE_DEC_HANDLE hSCE[MAX_SCE], /* i/o: SCE decoder structure */ + const int32_t ism_total_brate, /* i : ISM total bitrate */ + const int16_t bfi, /* i : bfi flag */ + const int16_t nchan_ism, /* i : number of objects */ + const int16_t nchan_transport, /* i : number of transport channels*/ + const ISM_MODE ism_mode, /* i : ISM mode */ + int16_t *flag_noisy_speech, /* o : noisy speech flag */ + int16_t *sce_id_dtx, /* o : SCE DTX ID */ + ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ + int16_t nb_bits_metadata[] /* o : number of metadata bits */ +) +{ + int16_t i, ch, last_bit_pos; + float q_step, q_step_border; + int16_t idx, idx_azimuth, idx_elevation; + int16_t nBits_azimuth, nBits_elevation, nBits_coh, nBits_sce_id; + int16_t md_diff_flag[MAX_NUM_OBJECTS]; + ISM_MODE ism_mode_bstr; + DEC_CORE_HANDLE st0; + ISM_METADATA_HANDLE hIsmMetaData; + int16_t next_bit_pos_orig; + uint16_t bstr_meta[IVAS_SID_5k2 / FRAMES_PER_SEC], *bstr_orig; + + if ( ism_total_brate == FRAME_NO_DATA ) + { + ism_metadata_smooth( hIsmMeta, ism_total_brate, nchan_ism ); + + return; + } + + /* initialization */ + st0 = hSCE[0]->hCoreCoder[0]; + + last_bit_pos = (int16_t) ( ( ism_total_brate / FRAMES_PER_SEC ) - 1 - SID_FORMAT_NBITS ); + bstr_orig = st0->bit_stream; + next_bit_pos_orig = st0->next_bit_pos; + st0->next_bit_pos = 0; + + /* reverse the bitstream for easier reading of indices */ + for ( i = 0; i < min( MAX_BITS_ISM_METADATA, last_bit_pos ); i++ ) + { + bstr_meta[i] = st0->bit_stream[last_bit_pos - i]; + } + st0->bit_stream = bstr_meta; + st0->total_brate = ism_total_brate; /* needed for BER detection in get_next_indice() */ + + if ( !bfi ) + { + /*----------------------------------------------------------------* + * ISm common signaling + *----------------------------------------------------------------*/ + + /* number of objects was already read in ivas_ism_get_dtx_dec() */ + /* update the position in the bitstream */ + st0->next_bit_pos += nchan_ism; + + /* read SID metadata flag( one per object ) */ + for ( ch = 0; ch < nchan_ism; ch++ ) + { + md_diff_flag[ch] = get_next_indice( st0, 1 ); + } + + /*----------------------------------------------------------------* + * Set quantization bits based on the number of coded objects + *----------------------------------------------------------------*/ + + ivas_get_ism_sid_quan_bitbudget( nchan_ism, &nBits_azimuth, &nBits_elevation, &q_step, &q_step_border, &nBits_coh, &nBits_sce_id ); + + /*----------------------------------------------------------------* + * Spatial parameters, loop over TCs - 1 + *----------------------------------------------------------------*/ + + *flag_noisy_speech = 0; + *sce_id_dtx = 0; + + /* read ISM mode flag to explicitly signal number of spatial parameters */ + if ( nchan_ism > 2 ) + { + idx = get_next_indice( st0, 1 ); + ism_mode_bstr = (ISM_MODE) ( idx + 1 ); + /* note: ISM mode was already read and used for configuration in in ivas_ism_dtx_dec() */ + + if ( ism_mode_bstr == ISM_MODE_PARAM ) + { + /* read noisy speech flag */ + *flag_noisy_speech = get_next_indice( st0, 1 ); + nBits_sce_id = 1; + } + } + + if ( nchan_transport > 1 ) + { + /* read sce id */ + *sce_id_dtx = get_next_indice( st0, nBits_sce_id ); + + /* decode the coherence */ + for ( ch = 0; ch < nchan_transport; ch++ ) + { + if ( ch == *sce_id_dtx ) + { + hSCE[ch]->hCoreCoder[0]->hFdCngDec->hFdCngCom->coherence = 1.0f; + continue; + } + + idx = get_next_indice( st0, nBits_coh ); + hSCE[ch]->hCoreCoder[0]->hFdCngDec->hFdCngCom->coherence = (float) ( idx ) / (float) ( ( 1 << nBits_coh ) - 1 ); + } + } + + if ( ism_mode == ISM_MODE_PARAM ) + { + hSCE[*sce_id_dtx]->hCoreCoder[0]->hFdCngDec->hFdCngCom->coherence = hSCE[!*sce_id_dtx]->hCoreCoder[0]->hFdCngDec->hFdCngCom->coherence; + } + + /*----------------------------------------------------------------* + * Metadata decoding and dequantization, loop over all objects + *----------------------------------------------------------------*/ + + for ( ch = 0; ch < nchan_ism; ch++ ) + { + hIsmMetaData = hIsmMeta[ch]; + if ( md_diff_flag[ch] == 1 ) + { + /* Azimuth decoding */ + idx_azimuth = get_next_indice( st0, nBits_azimuth ); + hIsmMetaData->azimuth = ism_dequant_meta( idx_azimuth, ism_azimuth_borders, q_step, q_step_border, 1 << nBits_azimuth ); + + /* Elevation decoding */ + idx_elevation = get_next_indice( st0, nBits_elevation ); + hIsmMetaData->elevation = ism_dequant_meta( idx_elevation, ism_elevation_borders, q_step, q_step_border, 1 << nBits_elevation ); + + /* update last indexes to correspond to active frames coding */ + if ( nBits_azimuth > ISM_AZIMUTH_NBITS ) + { + hIsmMetaData->position_angle.last_angle1_idx = idx_azimuth >> ( nBits_azimuth - ISM_AZIMUTH_NBITS ); + hIsmMetaData->position_angle.last_angle2_idx = idx_elevation >> ( nBits_elevation - ISM_ELEVATION_NBITS ); + } + else + { + hIsmMetaData->position_angle.last_angle1_idx = idx_azimuth << ( ISM_AZIMUTH_NBITS - nBits_azimuth ); + hIsmMetaData->position_angle.last_angle2_idx = idx_elevation << ( ISM_ELEVATION_NBITS - nBits_elevation ); + } + + /* save for smoothing metadata evolution */ + hIsmMetaData->last_true_azimuth = hIsmMetaData->azimuth; + hIsmMetaData->last_true_elevation = hIsmMetaData->elevation; + } + } + + /* take into account padding bits as metadata bits to keep later bitrate checks valid */ + nb_bits_metadata[*sce_id_dtx] = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC; + + /* set the bitstream pointer to its original position */ + st0->bit_stream = bstr_orig; + st0->next_bit_pos = next_bit_pos_orig; + } + + /* smooth the metadata evolution */ + ism_metadata_smooth( hIsmMeta, ism_total_brate, nchan_ism ); + + return; +} diff --git a/lib_dec/ivas_ism_param_dec.c b/lib_dec/ivas_ism_param_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..e875ef816a70e62537bf0657a14bb17d16f109e3 --- /dev/null +++ b/lib_dec/ivas_ism_param_dec.c @@ -0,0 +1,1606 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include +#include "options.h" +#include "ivas_prot.h" +#include "ivas_prot_rend.h" +#include "prot.h" +#include "ivas_rom_com.h" +#include "ivas_rom_dec.h" +#include "wmc_auto.h" + + +/*-----------------------------------------------------------------------* + * Local function definitions + *-----------------------------------------------------------------------*/ + +static void ivas_param_ism_dec_dequant_DOA( + PARAM_ISM_DEC_HANDLE hParamIsmDec, /* i/o: decoder ParamISM handle */ + const int16_t nchan_ism /* i : number of ISM channels */ +) +{ + int16_t i; + PARAM_ISM_CONFIG_HANDLE hParamIsm; + + hParamIsm = hParamIsmDec->hParamIsm; + + assert( nchan_ism <= MAX_NUM_OBJECTS ); + + /* Get the azimuth and elevation values */ + for ( i = 0; i < nchan_ism; i++ ) + { + hParamIsmDec->azimuth_values[i] = ism_dequant_meta( hParamIsm->azi_index[i], ism_azimuth_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_AZIMUTH_NBITS ); + hParamIsmDec->elevation_values[i] = ism_dequant_meta( hParamIsm->ele_index[i], ism_elevation_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_ELEVATION_NBITS ); + } + + return; +} + + +static void ivas_param_ism_dec_dequant_powrat( + PARAM_ISM_DEC_HANDLE hParamIsmDec /* i/o: decoder ParamISM handle */ +) +{ + int16_t band_idx, slot_idx; + PARAM_ISM_CONFIG_HANDLE hParamIsm; + + hParamIsm = hParamIsmDec->hParamIsm; + + /* Get the power ratio values */ + for ( band_idx = 0; band_idx < hParamIsm->nbands; band_idx++ ) + { + for ( slot_idx = 0; slot_idx < hParamIsm->nblocks[band_idx]; slot_idx++ ) + { + hParamIsmDec->power_ratios[band_idx][slot_idx][0] = (float) ( hParamIsm->power_ratios_idx[band_idx][slot_idx] ) / (float) ( ( 1 << PARAM_ISM_POW_RATIO_NBITS ) - 1 ) / 2.0f + 0.5f; + hParamIsmDec->power_ratios[band_idx][slot_idx][1] = 1.0f - hParamIsmDec->power_ratios[band_idx][slot_idx][0]; + } + } + + return; +} + + +static void ivas_ism_get_interpolator( + const int16_t subframe_nbslots, + float *interpolator ) +{ + int16_t interp_idx = 0; + + for ( interp_idx = 0; interp_idx < subframe_nbslots; interp_idx++ ) + { + interpolator[interp_idx] = (float) ( interp_idx + 1 ) / (float) subframe_nbslots; + } + + return; +} + + +static void ivas_ism_get_proto_matrix( + IVAS_OUTPUT_SETUP hOutSetup, + const int16_t nchan_transport, + float *proto_matrix ) +{ + int16_t idx; + + /* compute proto_matrix */ + switch ( nchan_transport ) + { + case 2: + { + if ( hOutSetup.nchan_out_woLFE ) + { + for ( idx = 0; idx < hOutSetup.nchan_out_woLFE; idx++ ) + { + if ( hOutSetup.ls_azimuth[idx] > 0.0f ) + { + proto_matrix[idx] = 1.0f; + proto_matrix[idx + hOutSetup.nchan_out_woLFE] = 0.0f; + } + else if ( hOutSetup.ls_azimuth[idx] < 0.0f ) + { + proto_matrix[idx] = 0.0f; + proto_matrix[idx + hOutSetup.nchan_out_woLFE] = 1.0f; + } + else + { + proto_matrix[idx] = 0.5f; + proto_matrix[idx + hOutSetup.nchan_out_woLFE] = 0.5f; + } + } + } + else + { + assert( 0 && "Error: number of output channels not supported" ); + } + break; + } + + default: + assert( 0 && "Error: number of transport channels not supported" ); + } + + return; +} + + +static void ivas_param_ism_collect_slot( + PARAM_ISM_DEC_HANDLE hParamIsmDec, /* i/o: decoder ParamISM handle */ + float *Cldfb_RealBuffer_in, + float *Cldfb_ImagBuffer_in, + const int16_t ch, + float ref_power[], + float cx_diag[][PARAM_ISM_MAX_DMX] ) +{ + + int16_t band_idx, bin_idx; + int16_t brange[2]; + float tmp; + + /* loop over parameter bands to collect transport channel energies */ + for ( band_idx = 0; band_idx < hParamIsmDec->hParamIsm->nbands; band_idx++ ) + { + brange[0] = hParamIsmDec->hParamIsm->band_grouping[band_idx]; + brange[1] = hParamIsmDec->hParamIsm->band_grouping[band_idx + 1]; + for ( bin_idx = brange[0]; bin_idx < brange[1]; bin_idx++ ) + { + tmp = 0.0f; + tmp += ( Cldfb_RealBuffer_in[bin_idx] * Cldfb_RealBuffer_in[bin_idx] ); + tmp += ( Cldfb_ImagBuffer_in[bin_idx] * Cldfb_ImagBuffer_in[bin_idx] ); + cx_diag[bin_idx][ch] += tmp; + ref_power[bin_idx] += tmp; + } + } + + return; +} + + +static void ivas_param_ism_compute_mixing_matrix( + const int16_t nchan_ism, /* i : number of ISM channels */ + PARAM_ISM_DEC_HANDLE hParamIsmDec, /* i/o: decoder ParamISM handle */ + ISM_DTX_DATA_DEC hISMDTX, /* i : ISM DTX handle */ + float direct_response[MAX_NUM_OBJECTS][PARAM_ISM_MAX_CHAN], + const int16_t nchan_transport, + const int16_t nchan_out_woLFE, + float cx_diag[][PARAM_ISM_MAX_DMX], + float ref_power[], + float mixing_matrix[CLDFB_NO_CHANNELS_MAX][PARAM_ISM_MAX_CHAN * PARAM_ISM_MAX_DMX] ) +{ + int16_t band_idx, bin_idx; + int16_t i, w, obj_indx; + int16_t brange[2]; + float direct_power[MAX_NUM_OBJECTS]; + float cy_diag[PARAM_ISM_MAX_CHAN]; + float cy_diag_tmp[MAX_NUM_OBJECTS][PARAM_ISM_MAX_CHAN]; + float *dir_res_ptr; + float *proto_matrix; + float response_matrix[PARAM_ISM_MAX_CHAN * MAX_NUM_OBJECTS]; + int16_t num_wave; + + proto_matrix = hParamIsmDec->hParamIsmRendering->proto_matrix; + + assert( ( nchan_ism == 3 ) || ( nchan_ism == 4 ) ); + assert( nchan_transport == 2 ); + + if ( hParamIsmDec->hParamIsm->flag_noisy_speech || hISMDTX.dtx_flag ) + { + num_wave = nchan_ism; + } + else + { + num_wave = MAX_PARAM_ISM_WAVE; + } + set_zero( response_matrix, PARAM_ISM_MAX_CHAN * MAX_NUM_OBJECTS ); + + /* loop over parameter bands to compute the mixing matrix */ + for ( band_idx = 0; band_idx < hParamIsmDec->hParamIsm->nbands; band_idx++ ) + { + brange[0] = hParamIsmDec->hParamIsm->band_grouping[band_idx]; + brange[1] = hParamIsmDec->hParamIsm->band_grouping[band_idx + 1]; + + /* Compute covaraince matrix from direct response*/ + for ( w = 0; w < num_wave; w++ ) + { + set_zero( cy_diag_tmp[w], nchan_out_woLFE ); + + if ( hParamIsmDec->hParamIsm->flag_noisy_speech || hISMDTX.dtx_flag ) + { + dir_res_ptr = direct_response[w]; + } + else + { + obj_indx = hParamIsmDec->hParamIsm->obj_indices[band_idx][0][w]; + dir_res_ptr = direct_response[obj_indx]; + } + mvr2r( dir_res_ptr, response_matrix + w * nchan_out_woLFE, nchan_out_woLFE ); + /* we only need the diagonal of Cy*/ + matrix_product_diag( dir_res_ptr, nchan_out_woLFE, 1, 0, dir_res_ptr, 1, nchan_out_woLFE, 0, cy_diag_tmp[w] ); + } + + for ( bin_idx = brange[0]; bin_idx < brange[1]; bin_idx++ ) + { + + set_zero( cy_diag, nchan_out_woLFE ); + for ( w = 0; w < num_wave; w++ ) + { + if ( hParamIsmDec->hParamIsm->flag_noisy_speech || hISMDTX.dtx_flag ) + { + direct_power[w] = ( 1.0f / nchan_ism ) * ref_power[bin_idx]; + } + else + { + direct_power[w] = hParamIsmDec->power_ratios[band_idx][0][w] * ref_power[bin_idx]; + } + + if ( direct_power[w] != 0.f ) + { + for ( i = 0; i < nchan_out_woLFE; i++ ) + { + cy_diag[i] += direct_power[w] * cy_diag_tmp[w][i]; + } + } + direct_power[w] = sqrtf( direct_power[w] ); + } + + /* Compute mixing matrix */ + computeMixingMatricesISM( nchan_transport, num_wave, nchan_out_woLFE, response_matrix, direct_power, cx_diag[bin_idx], cy_diag, proto_matrix, 1, + PARAM_MC_REG_SX, PARAM_MC_REG_GHAT, mixing_matrix[bin_idx] ); + } + } + + return; +} + + +static void ivas_param_ism_render_slot( + PARAM_ISM_DEC_HANDLE hParamIsmDec, + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, + float *Cldfb_RealBuffer_in[PARAM_ISM_MAX_DMX], + float *Cldfb_ImagBuffer_in[PARAM_ISM_MAX_DMX], + float Cldfb_RealBuffer[PARAM_ISM_MAX_CHAN][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + float Cldfb_ImagBuffer[PARAM_ISM_MAX_CHAN][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + float mixing_matrix[CLDFB_NO_CHANNELS_MAX][PARAM_ISM_MAX_CHAN * PARAM_ISM_MAX_DMX], + const int16_t interpolator_idx, + const int16_t out_slot_idx, + const int16_t num_ch_LS, + const int16_t nchan_transport ) +{ + int16_t outchIdx, inchIdx, bin_idx; + float tmp_1, mixing_matrix_smooth; + + tmp_1 = hParamIsmDec->hParamIsmRendering->interpolator[interpolator_idx]; + + for ( bin_idx = 0; bin_idx < hSpatParamRendCom->num_freq_bands; bin_idx++ ) + { + /* smooth the mixing matrix */ + for ( outchIdx = 0; outchIdx < num_ch_LS; outchIdx++ ) + { + for ( inchIdx = 0; inchIdx < nchan_transport; inchIdx++ ) + { + mixing_matrix_smooth = tmp_1 * mixing_matrix[bin_idx][outchIdx + inchIdx * num_ch_LS] + + ( 1 - tmp_1 ) * hParamIsmDec->hParamIsmRendering->mixing_matrix_lin_old[bin_idx][outchIdx + inchIdx * num_ch_LS]; + + Cldfb_RealBuffer[outchIdx][out_slot_idx][bin_idx] += mixing_matrix_smooth * Cldfb_RealBuffer_in[inchIdx][bin_idx]; + Cldfb_ImagBuffer[outchIdx][out_slot_idx][bin_idx] += mixing_matrix_smooth * Cldfb_ImagBuffer_in[inchIdx][bin_idx]; + } + } + } + + return; +} + + +static void ivas_param_ism_rendering( + PARAM_ISM_DEC_HANDLE hParamIsmDec, + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, + float Cldfb_RealBuffer_in[PARAM_ISM_MAX_DMX][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], + float Cldfb_ImagBuffer_in[PARAM_ISM_MAX_DMX][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], + float Cldfb_RealBuffer[PARAM_ISM_MAX_CHAN][4][CLDFB_NO_CHANNELS_MAX], + float Cldfb_ImagBuffer[PARAM_ISM_MAX_CHAN][4][CLDFB_NO_CHANNELS_MAX], + float mixing_matrix[CLDFB_NO_CHANNELS_MAX][PARAM_ISM_MAX_CHAN * PARAM_ISM_MAX_DMX], + const int16_t out_slot_idx, + const int16_t slot_idx, + const int16_t num_ch_LS, + const int16_t nchan_transport ) +{ + int16_t outchIdx, inchIdx, bin_idx; + float tmp_1, mixing_matrix_smooth; + + tmp_1 = hParamIsmDec->hParamIsmRendering->interpolator[slot_idx]; + + for ( bin_idx = 0; bin_idx < hSpatParamRendCom->num_freq_bands; bin_idx++ ) + { + /* smooth the mixing matrix */ + for ( outchIdx = 0; outchIdx < num_ch_LS; outchIdx++ ) + { + for ( inchIdx = 0; inchIdx < nchan_transport; inchIdx++ ) + { + mixing_matrix_smooth = tmp_1 * mixing_matrix[bin_idx][outchIdx + inchIdx * num_ch_LS] + + ( 1 - tmp_1 ) * hParamIsmDec->hParamIsmRendering->mixing_matrix_lin_old[bin_idx][outchIdx + inchIdx * num_ch_LS]; + + Cldfb_RealBuffer[outchIdx][out_slot_idx][bin_idx] += mixing_matrix_smooth * Cldfb_RealBuffer_in[inchIdx][slot_idx][bin_idx]; + Cldfb_ImagBuffer[outchIdx][out_slot_idx][bin_idx] += mixing_matrix_smooth * Cldfb_ImagBuffer_in[inchIdx][slot_idx][bin_idx]; + } + } + } + + return; +} + + +static ivas_error ivas_param_ism_rendering_init( + PARAM_ISM_RENDERING_HANDLE hParamIsmRendering, + IVAS_OUTPUT_SETUP hOutSetup, + const int16_t nchan_transport, + const int16_t subframe_nbslots, + AUDIO_CONFIG output_config ) +{ + int16_t bin_idx; + + /* initialization of mixing matrix buffer for smoothing */ + for ( bin_idx = 0; bin_idx < CLDFB_NO_CHANNELS_MAX; bin_idx++ ) + { + set_zero( hParamIsmRendering->mixing_matrix_lin_old[bin_idx], PARAM_ISM_MAX_CHAN * PARAM_ISM_MAX_DMX ); + } + + /* memory allocation for proto matrix and interpolator */ + if ( ( hParamIsmRendering->proto_matrix = (float *) malloc( hOutSetup.nchan_out_woLFE * nchan_transport * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for proto matrix\n" ) ); + } + if ( ( hParamIsmRendering->interpolator = (float *) malloc( subframe_nbslots * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for interpolator\n" ) ); + } + + if ( !( output_config == IVAS_AUDIO_CONFIG_EXTERNAL || output_config == IVAS_AUDIO_CONFIG_BINAURAL || output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR || output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) + { + /* computation of proto matrix */ + ivas_ism_get_proto_matrix( hOutSetup, nchan_transport, hParamIsmRendering->proto_matrix ); + } + + /* computation of interpolator*/ + ivas_ism_get_interpolator( subframe_nbslots, hParamIsmRendering->interpolator ); + + return IVAS_ERR_OK; +} + + +static void ivas_param_ism_update_mixing_matrix( + PARAM_ISM_DEC_HANDLE hParamIsmDec, + float mixing_matrix[CLDFB_NO_CHANNELS_MAX][PARAM_ISM_MAX_CHAN * PARAM_ISM_MAX_DMX], + const int16_t nchan_in, + const int16_t nchan_out ) +{ + int16_t inchIdx, outchIdx, bin_idx, band_idx; + int16_t brange[2]; + + for ( band_idx = 0; band_idx < hParamIsmDec->hParamIsm->nbands; band_idx++ ) + { + brange[0] = hParamIsmDec->hParamIsm->band_grouping[band_idx]; + brange[1] = hParamIsmDec->hParamIsm->band_grouping[band_idx + 1]; + + for ( bin_idx = brange[0]; bin_idx < brange[1]; bin_idx++ ) + { + for ( inchIdx = 0; inchIdx < nchan_in; inchIdx++ ) + { + for ( outchIdx = 0; outchIdx < nchan_out; outchIdx++ ) + { + hParamIsmDec->hParamIsmRendering->mixing_matrix_lin_old[bin_idx][outchIdx + inchIdx * nchan_out] = mixing_matrix[bin_idx][outchIdx + inchIdx * nchan_out]; + } + } + } + } + + return; +} + + +/*-------------------------------------------------------------------------* + * ivas_param_ism_dec_open() + * + * Open Param ISM handle + *-------------------------------------------------------------------------*/ + +ivas_error ivas_param_ism_dec_open( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +) +{ + int16_t i; + PARAM_ISM_DEC_HANDLE hParamIsmDec; + IVAS_OUTPUT_SETUP hOutSetup; + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom; + AUDIO_CONFIG output_config; + int32_t output_Fs; + ivas_error error; + + error = IVAS_ERR_OK; + + push_wmops( "ivas_param_ism_dec_open" ); + + /*-----------------------------------------------------------------* + * prepare library opening + *-----------------------------------------------------------------*/ + + if ( ( hParamIsmDec = (PARAM_ISM_DEC_HANDLE) malloc( sizeof( PARAM_ISM_DEC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for ParamISM\n" ) ); + } + + if ( ( hSpatParamRendCom = (SPAT_PARAM_REND_COMMON_DATA_HANDLE) malloc( sizeof( SPAT_PARAM_REND_COMMON_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + + /* Assign memory to Param Object handle */ + if ( ( hParamIsmDec->hParamIsm = (PARAM_ISM_CONFIG_HANDLE) malloc( sizeof( PARAM_ISM_CONFIG_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for ParamISM\n" ) ); + } + + if ( ( hParamIsmDec->hParamIsmRendering = (PARAM_ISM_RENDERING_HANDLE) malloc( sizeof( PARAM_ISM_RENDERING_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for ParamISM Rendering handle\n" ) ); + } + + output_Fs = st_ivas->hDecoderConfig->output_Fs; + output_config = st_ivas->hDecoderConfig->output_config; + + ivas_param_ism_config( hParamIsmDec->hParamIsm, st_ivas->nchan_ism ); + + /*-----------------------------------------------------------------* + * set input parameters + *-----------------------------------------------------------------*/ + + hSpatParamRendCom->slot_size = (int16_t) ( ( output_Fs / FRAMES_PER_SEC ) / CLDFB_NO_COL_MAX ); + set_s( hSpatParamRendCom->subframe_nbslots, 0, MAX_JBM_SUBFRAMES_5MS ); + set_s( hSpatParamRendCom->subframe_nbslots, JBM_CLDFB_SLOTS_IN_SUBFRAME, DEFAULT_JBM_SUBFRAMES_5MS ); + hSpatParamRendCom->nb_subframes = DEFAULT_JBM_SUBFRAMES_5MS; + hSpatParamRendCom->subframes_rendered = 0; + hSpatParamRendCom->slots_rendered = 0; + hSpatParamRendCom->num_slots = DEFAULT_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME; + hSpatParamRendCom->num_freq_bands = (int16_t) ( output_Fs * INV_CLDFB_BANDWIDTH + 0.5f ); + + hParamIsmDec->hParamIsm->nbands = MAX_PARAM_ISM_NBANDS; + + for ( i = 0; i < ( hParamIsmDec->hParamIsm->nbands + 1 ); i++ ) + { + hParamIsmDec->hParamIsm->band_grouping[i] = Param_ISM_band_grouping[i]; + + if ( hParamIsmDec->hParamIsm->band_grouping[i] > hSpatParamRendCom->num_freq_bands ) + { + hParamIsmDec->hParamIsm->band_grouping[i] = hSpatParamRendCom->num_freq_bands; + } + } + + /*-----------------------------------------------------------------* + * output setup + *-----------------------------------------------------------------*/ + + /* hIntSetup and hOutSetup differs only for Binaural rendering */ + if ( output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) + { + /* nchan_out is essential for memory initialization for CLDFB Synthesis */ + st_ivas->hIntSetup.nchan_out_woLFE = st_ivas->nchan_ism; + st_ivas->hIntSetup.is_loudspeaker_setup = 1; + } + + hOutSetup = st_ivas->hIntSetup; + + if ( !( output_config == IVAS_AUDIO_CONFIG_MONO || output_config == IVAS_AUDIO_CONFIG_STEREO ) ) + { + /* Initialize Param ISM Rendering handle */ + if ( st_ivas->hDecoderConfig->Opt_tsm ) + { + if ( ( error = ivas_param_ism_rendering_init( hParamIsmDec->hParamIsmRendering, hOutSetup, st_ivas->nchan_transport, MAX_JBM_CLDFB_TIMESLOTS, output_config ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + if ( ( error = ivas_param_ism_rendering_init( hParamIsmDec->hParamIsmRendering, hOutSetup, st_ivas->nchan_transport, CLDFB_NO_COL_MAX, output_config ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + + if ( !( output_config == IVAS_AUDIO_CONFIG_EXTERNAL || output_config == IVAS_AUDIO_CONFIG_BINAURAL || output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR || output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB || + output_config == IVAS_AUDIO_CONFIG_MONO || output_config == IVAS_AUDIO_CONFIG_STEREO ) ) + { + /* Initialize efap handle */ + if ( ( error = efap_init_data( &( st_ivas->hEFAPdata ), hOutSetup.ls_azimuth, hOutSetup.ls_elevation, hOutSetup.nchan_out_woLFE, EFAP_MODE_EFAP ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* Azi and Ele values are transmitted once per frame per object */ + set_zero( hParamIsmDec->azimuth_values, MAX_NUM_OBJECTS ); + set_zero( hParamIsmDec->elevation_values, MAX_NUM_OBJECTS ); + + hSpatParamRendCom->dirac_md_buffer_length = MAX_PARAM_SPATIAL_SUBFRAMES; + hSpatParamRendCom->dirac_bs_md_write_idx = 0; + hSpatParamRendCom->dirac_read_idx = 0; + + if ( output_config == IVAS_AUDIO_CONFIG_BINAURAL || output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR || output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) + { + if ( ( error = ivas_dirac_allocate_parameters( hSpatParamRendCom, 1 ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = ivas_dirac_allocate_parameters( hSpatParamRendCom, 2 ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + st_ivas->hISMDTX.dtx_flag = 0; + + st_ivas->hParamIsmDec = hParamIsmDec; + st_ivas->hSpatParamRendCom = hSpatParamRendCom; + + if ( st_ivas->hDecoderConfig->Opt_5ms ) + { + if ( st_ivas->renderer_type != RENDERER_MONO_DOWNMIX && st_ivas->renderer_type != RENDERER_DISABLE ) + { + int16_t nchan_transport = st_ivas->nchan_transport; + int16_t nchan_full = 0; + if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) + { + nchan_full = nchan_transport; + hParamIsmDec->hParamIsmRendering->Cldfb_RealBuffer_tc = NULL; + hParamIsmDec->hParamIsmRendering->Cldfb_ImagBuffer_tc = NULL; + } + else + { + int16_t n_slots_to_alloc; + if ( st_ivas->hDecoderConfig->Opt_tsm == 1 ) + { + n_slots_to_alloc = MAX_JBM_CLDFB_TIMESLOTS; + } + else + { + n_slots_to_alloc = CLDFB_SLOTS_PER_SUBFRAME * MAX_PARAM_SPATIAL_SUBFRAMES; + } + if ( ( hParamIsmDec->hParamIsmRendering->Cldfb_RealBuffer_tc = (float *) malloc( n_slots_to_alloc * nchan_transport * hSpatParamRendCom->num_freq_bands * sizeof( float ) ) ) == NULL ) + + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param ISM JBM Rendering handle\n" ) ); + } + set_zero( hParamIsmDec->hParamIsmRendering->Cldfb_RealBuffer_tc, n_slots_to_alloc * nchan_transport * hSpatParamRendCom->num_freq_bands ); + + if ( ( hParamIsmDec->hParamIsmRendering->Cldfb_ImagBuffer_tc = (float *) malloc( n_slots_to_alloc * nchan_transport * hSpatParamRendCom->num_freq_bands * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param ISM JBM Rendering handle\n" ) ); + } + set_zero( hParamIsmDec->hParamIsmRendering->Cldfb_ImagBuffer_tc, n_slots_to_alloc * nchan_transport * hSpatParamRendCom->num_freq_bands ); + } + + if ( st_ivas->hTcBuffer == NULL ) + { + if ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, TC_BUFFER_MODE_RENDERER, nchan_transport, nchan_transport, nchan_full, NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + else + { + hParamIsmDec->hParamIsmRendering->Cldfb_RealBuffer_tc = NULL; + hParamIsmDec->hParamIsmRendering->Cldfb_ImagBuffer_tc = NULL; + if ( st_ivas->hTcBuffer == NULL ) + { + int16_t nchan_to_allocate = st_ivas->hDecoderConfig->nchan_out; + if ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, TC_BUFFER_MODE_BUFFER, nchan_to_allocate, nchan_to_allocate, nchan_to_allocate, NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + } + else + { + hParamIsmDec->hParamIsmRendering->Cldfb_RealBuffer_tc = NULL; + hParamIsmDec->hParamIsmRendering->Cldfb_ImagBuffer_tc = NULL; + } + + pop_wmops(); + return error; +} + + +/*-------------------------------------------------------------------------* + * ivas_param_ism_dec_close() + * + * Close Param ISM handle + *-------------------------------------------------------------------------*/ + +void ivas_param_ism_dec_close( + PARAM_ISM_DEC_HANDLE *hParamIsmDec_out, /* i/o: decoder DirAC handle */ + SPAT_PARAM_REND_COMMON_DATA_HANDLE *hSpatParamRendCom_out, /* i/o: common spatial renderer data */ + AUDIO_CONFIG output_config /* i : output audio configuration */ +) +{ + if ( hParamIsmDec_out != NULL && *hParamIsmDec_out != NULL ) + { + PARAM_ISM_DEC_HANDLE hParamIsmDec; + hParamIsmDec = *hParamIsmDec_out; + + /* Config & CLDFB */ + if ( hParamIsmDec->hParamIsm != NULL ) + { + free( hParamIsmDec->hParamIsm ); + hParamIsmDec->hParamIsm = NULL; + } + + if ( !( output_config == IVAS_AUDIO_CONFIG_MONO || output_config == IVAS_AUDIO_CONFIG_STEREO ) ) + { + /* Param ISM Rendering */ + if ( hParamIsmDec->hParamIsmRendering->interpolator != NULL ) + { + free( hParamIsmDec->hParamIsmRendering->interpolator ); + hParamIsmDec->hParamIsmRendering->interpolator = NULL; + } + if ( hParamIsmDec->hParamIsmRendering->proto_matrix != NULL ) + { + free( hParamIsmDec->hParamIsmRendering->proto_matrix ); + hParamIsmDec->hParamIsmRendering->proto_matrix = NULL; + } + } + + if ( hParamIsmDec->hParamIsmRendering->Cldfb_RealBuffer_tc != NULL ) + { + free( hParamIsmDec->hParamIsmRendering->Cldfb_RealBuffer_tc ); + hParamIsmDec->hParamIsmRendering->Cldfb_RealBuffer_tc = NULL; + } + if ( hParamIsmDec->hParamIsmRendering->Cldfb_ImagBuffer_tc != NULL ) + { + free( hParamIsmDec->hParamIsmRendering->Cldfb_ImagBuffer_tc ); + hParamIsmDec->hParamIsmRendering->Cldfb_ImagBuffer_tc = NULL; + } + + if ( hParamIsmDec->hParamIsmRendering != NULL ) + { + free( hParamIsmDec->hParamIsmRendering ); + hParamIsmDec->hParamIsmRendering = NULL; + } + + free( *hParamIsmDec_out ); + *hParamIsmDec_out = NULL; + } + + if ( hSpatParamRendCom_out != NULL && *hSpatParamRendCom_out != NULL ) + { + if ( output_config == IVAS_AUDIO_CONFIG_BINAURAL || output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR || output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) + { + ivas_dirac_deallocate_parameters( *hSpatParamRendCom_out, 1 ); + ivas_dirac_deallocate_parameters( *hSpatParamRendCom_out, 2 ); + } + + free( *hSpatParamRendCom_out ); + *hSpatParamRendCom_out = NULL; + } + + return; +} + + +/*-------------------------------------------------------------------------* + * ivas_param_ism_dec() + * + * Param ISM decoder + *-------------------------------------------------------------------------*/ + +void ivas_param_ism_dec( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float *output_f[] /* i/o: synthesized core-coder transport channels/DirAC output*/ +) +{ + int16_t ch, nchan_transport, nchan_out, nchan_out_woLFE, i; + int16_t subframe_idx, slot_idx, index_slot, bin_idx; + int32_t ivas_total_brate; + int16_t output_frame; + float *p_tc[PARAM_ISM_MAX_DMX]; + float ref_power[CLDFB_NO_CHANNELS_MAX]; + float cx_diag[CLDFB_NO_CHANNELS_MAX][PARAM_ISM_MAX_DMX]; + /* CLDFB Input Buffers */ + float Cldfb_RealBuffer_in[PARAM_ISM_MAX_DMX][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + float Cldfb_ImagBuffer_in[PARAM_ISM_MAX_DMX][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + + /* CLDFB Output Buffers */ + float Cldfb_RealBuffer[PARAM_ISM_MAX_CHAN][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; + float Cldfb_ImagBuffer[PARAM_ISM_MAX_CHAN][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; + + /* Direct Response/EFAP Gains */ + float direct_response[MAX_NUM_OBJECTS][PARAM_ISM_MAX_CHAN]; + + /* Covariance Rendering */ + float mixing_matrix[CLDFB_NO_CHANNELS_MAX][PARAM_ISM_MAX_CHAN * PARAM_ISM_MAX_DMX]; + + PARAM_ISM_DEC_HANDLE hParamIsmDec; + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom; + + IVAS_OUTPUT_SETUP hSetup; + + /* Initialization */ + hParamIsmDec = st_ivas->hParamIsmDec; + assert( hParamIsmDec ); + hSpatParamRendCom = st_ivas->hSpatParamRendCom; + assert( hSpatParamRendCom ); + for ( i = 0; i < PARAM_ISM_MAX_DMX; i++ ) + { + p_tc[i] = output_f[i]; + } + output_frame = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); + + nchan_transport = st_ivas->nchan_transport; + if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) + { + nchan_out = st_ivas->nchan_ism; + nchan_out_woLFE = nchan_out; + st_ivas->hDecoderConfig->nchan_out = nchan_out; + } + else + { + nchan_out = st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe; + nchan_out_woLFE = st_ivas->hIntSetup.nchan_out_woLFE; + } + + ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; + + hSetup = st_ivas->hIntSetup; + + push_wmops( "ivas_param_ism_dec" ); + + /* set buffers to zero */ + for ( bin_idx = 0; bin_idx < CLDFB_NO_CHANNELS_MAX; bin_idx++ ) + { + set_zero( cx_diag[bin_idx], PARAM_ISM_MAX_DMX ); + } + set_zero( ref_power, CLDFB_NO_CHANNELS_MAX ); + + /* Frame-level Processing */ + /* De-quantization */ + if ( !( ivas_total_brate == IVAS_SID_5k2 || ivas_total_brate == FRAME_NO_DATA ) ) + { + ivas_param_ism_dec_dequant_DOA( hParamIsmDec, st_ivas->nchan_ism ); + ivas_param_ism_dec_dequant_powrat( hParamIsmDec ); + st_ivas->hISMDTX.dtx_flag = 0; + } + else + { + st_ivas->hISMDTX.dtx_flag = 1; + } + + /* obtain the direct response using EFAP */ + if ( !( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) ) + { + for ( i = 0; i < st_ivas->nchan_ism; i++ ) + { + efap_determine_gains( st_ivas->hEFAPdata, direct_response[i], hParamIsmDec->azimuth_values[i], hParamIsmDec->elevation_values[i], EFAP_MODE_EFAP ); + } + } + else + { + int16_t j; + + for ( i = 0; i < st_ivas->nchan_ism; i++ ) + { + for ( j = 0; j < nchan_out_woLFE; j++ ) + { + if ( i == j ) + { + direct_response[i][j] = 1.0f; + } + else + { + direct_response[i][j] = 0.0f; + } + } + } + + for ( j = 0; j < nchan_out_woLFE; j++ ) + { + if ( hParamIsmDec->azimuth_values[j] > 0.0f ) + { + hParamIsmDec->hParamIsmRendering->proto_matrix[j] = 1.0f; + hParamIsmDec->hParamIsmRendering->proto_matrix[nchan_out_woLFE + j] = 0.0f; + } + else + { + if ( hParamIsmDec->azimuth_values[j] < 0.0f ) + { + hParamIsmDec->hParamIsmRendering->proto_matrix[j] = 0.0f; + hParamIsmDec->hParamIsmRendering->proto_matrix[nchan_out_woLFE + j] = 1.0f; + } + else /* == 0.0f */ + { + hParamIsmDec->hParamIsmRendering->proto_matrix[j] = 0.5f; + hParamIsmDec->hParamIsmRendering->proto_matrix[nchan_out_woLFE + j] = 0.5f; + } + } + } + } + + ivas_ism_param_dec_tc_gain_ajust( st_ivas, output_frame, output_frame / 2, p_tc ); + + for ( ch = 0; ch < nchan_transport; ch++ ) + { + /* CLDFB Analysis */ + for ( slot_idx = 0; slot_idx < CLDFB_NO_COL_MAX; slot_idx++ ) + { + cldfbAnalysis_ts( &( output_f[ch][hSpatParamRendCom->num_freq_bands * slot_idx] ), Cldfb_RealBuffer_in[ch][slot_idx], Cldfb_ImagBuffer_in[ch][slot_idx], hSpatParamRendCom->num_freq_bands, st_ivas->cldfbAnaDec[ch] ); + + ivas_param_ism_collect_slot( hParamIsmDec, Cldfb_RealBuffer_in[ch][slot_idx], Cldfb_ImagBuffer_in[ch][slot_idx], ch, ref_power, cx_diag ); + } + } + + /* Obtain Mixing Matrix on a frame-level */ + for ( bin_idx = 0; bin_idx < hSpatParamRendCom->num_freq_bands; bin_idx++ ) + { + set_f( mixing_matrix[bin_idx], 0.0f, nchan_transport * nchan_out_woLFE ); + } + + /* Compute mixing matrix */ + ivas_param_ism_compute_mixing_matrix( st_ivas->nchan_ism, hParamIsmDec, st_ivas->hISMDTX, direct_response, nchan_transport, nchan_out_woLFE, cx_diag, ref_power, mixing_matrix ); + + /* subframe loop for synthesis*/ + for ( subframe_idx = 0; subframe_idx < hSpatParamRendCom->nb_subframes; subframe_idx++ ) + { + uint16_t slot_idx_start = subframe_idx * hSpatParamRendCom->subframe_nbslots[subframe_idx]; + uint16_t idx_in; + uint16_t idx_lfe; + + /* Set some memories to zero */ + for ( ch = 0; ch < nchan_out_woLFE; ch++ ) + { + for ( slot_idx = 0; slot_idx < hSpatParamRendCom->subframe_nbslots[subframe_idx]; slot_idx++ ) + { + set_f( Cldfb_RealBuffer[ch][slot_idx], 0.0f, hSpatParamRendCom->num_freq_bands ); + set_f( Cldfb_ImagBuffer[ch][slot_idx], 0.0f, hSpatParamRendCom->num_freq_bands ); + } + } + + for ( slot_idx = 0; slot_idx < hSpatParamRendCom->subframe_nbslots[subframe_idx]; slot_idx++ ) + { + index_slot = slot_idx_start + slot_idx; + + /* Compute bandwise rendering to target LS using covariance rendering */ + ivas_param_ism_rendering( hParamIsmDec, hSpatParamRendCom, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, + Cldfb_RealBuffer, Cldfb_ImagBuffer, mixing_matrix, slot_idx, index_slot, + nchan_out_woLFE, nchan_transport ); + } + + /* CLDFB Synthesis */ + idx_in = 0; + idx_lfe = 0; + + for ( ch = 0; ch < nchan_out; ch++ ) + { + if ( ( hSetup.num_lfe > 0 ) && ( hSetup.index_lfe[idx_lfe] == ch ) ) + { + set_zero( &( output_f[ch][slot_idx_start * hSpatParamRendCom->num_freq_bands] ), hSpatParamRendCom->subframe_nbslots[subframe_idx] * hSpatParamRendCom->num_freq_bands ); + if ( idx_lfe < ( hSetup.num_lfe - 1 ) ) + { + idx_lfe++; + } + } + else + { + float *RealBuffer[16]; + float *ImagBuffer[16]; + + /* open CLDFB buffer up to CLDFB_NO_CHANNELS_MAX bands for 48kHz */ + for ( i = 0; i < hSpatParamRendCom->subframe_nbslots[subframe_idx]; i++ ) + { + RealBuffer[i] = Cldfb_RealBuffer[idx_in][i]; + ImagBuffer[i] = Cldfb_ImagBuffer[idx_in][i]; + } + + cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][slot_idx_start * hSpatParamRendCom->num_freq_bands] ), + hSpatParamRendCom->num_freq_bands * hSpatParamRendCom->subframe_nbslots[subframe_idx], st_ivas->cldfbSynDec[ch] ); + + idx_in++; + } + } + } + + /* copy the memories */ + /* store mixing matrix for next subframe */ + ivas_param_ism_update_mixing_matrix( hParamIsmDec, mixing_matrix, nchan_transport, nchan_out_woLFE ); + + /* store MetaData parameters */ + for ( ch = 0; ch < st_ivas->nchan_ism; ch++ ) + { + if ( st_ivas->hParamIsmDec->azimuth_values[ch] > 180.0f ) + { + st_ivas->hIsmMetaData[ch]->azimuth = st_ivas->hParamIsmDec->azimuth_values[ch] - 360.0f; + } + else + { + st_ivas->hIsmMetaData[ch]->azimuth = st_ivas->hParamIsmDec->azimuth_values[ch]; + } + + st_ivas->hIsmMetaData[ch]->elevation = st_ivas->hParamIsmDec->elevation_values[ch]; + } + + pop_wmops(); + + return; +} + + +/*-------------------------------------------------------------------------* + * ivas_ism_dec_digest_tc() + * + * + *-------------------------------------------------------------------------*/ + +void ivas_ism_dec_digest_tc( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +) +{ + ivas_jbm_dec_td_renderers_adapt_subframes( st_ivas ); + + if ( st_ivas->renderer_type == RENDERER_TD_PANNING || + st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC || + st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || + st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM || + st_ivas->renderer_type == RENDERER_OSBA_AMBI || + st_ivas->renderer_type == RENDERER_OSBA_LS || + st_ivas->renderer_type == RENDERER_OSBA_STEREO || + ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM && st_ivas->hDecoderConfig->Opt_Headrotation == 0 ) ) + { + int16_t i, num_objects; + int16_t azimuth, elevation; + + /* we have a full frame interpolator, adapt it */ + /* for BE testing */ + if ( ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ) == st_ivas->hTcBuffer->n_samples_available ) + { + int16_t interpolator_length = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); + + if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC || + st_ivas->renderer_type == RENDERER_OSBA_AMBI || + st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV ) + { + st_ivas->hIsmRendererData->interpolator[0] = 0.0f; + for ( i = 1; i < interpolator_length; i++ ) + { + st_ivas->hIsmRendererData->interpolator[i] = st_ivas->hIsmRendererData->interpolator[i - 1] + 1.f / ( interpolator_length - 1 ); + } + } + else + { + for ( i = 0; i < interpolator_length; i++ ) + { + st_ivas->hIsmRendererData->interpolator[i] = (float) i / ( (float) interpolator_length - 1 ); + } + } + } + else + { + ivas_jbm_dec_get_adapted_linear_interpolator( (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ), st_ivas->hTcBuffer->n_samples_available, st_ivas->hIsmRendererData->interpolator ); + } + + /* also get the gains here */ + num_objects = st_ivas->nchan_transport; + for ( i = 0; i < num_objects; i++ ) + { + mvr2r( st_ivas->hIsmRendererData->gains[i], st_ivas->hIsmRendererData->prev_gains[i], MAX_OUTPUT_CHANNELS ); + + if ( st_ivas->intern_config == IVAS_AUDIO_CONFIG_STEREO ) + { + ivas_ism_get_stereo_gains( st_ivas->hIsmMetaData[i]->azimuth, st_ivas->hIsmMetaData[i]->elevation, &st_ivas->hIsmRendererData->gains[i][0], &st_ivas->hIsmRendererData->gains[i][1] ); + } + else + { + // TODO tmu review when #215 is resolved + azimuth = (int16_t) floorf( st_ivas->hIsmMetaData[i]->azimuth + 0.5f ); + elevation = (int16_t) floorf( st_ivas->hIsmMetaData[i]->elevation + 0.5f ); + + if ( ( st_ivas->renderer_type == RENDERER_TD_PANNING || + st_ivas->renderer_type == RENDERER_OSBA_LS || + st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) && + st_ivas->hCombinedOrientationData == NULL ) + { + if ( st_ivas->hIntSetup.is_planar_setup ) + { + /* If no elevation support in output format, then rendering should be done with zero elevation */ + elevation = 0; + } + + if ( st_ivas->hEFAPdata != NULL ) + { + efap_determine_gains( st_ivas->hEFAPdata, st_ivas->hIsmRendererData->gains[i], azimuth, elevation, EFAP_MODE_EFAP ); + } + } + else if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC || + st_ivas->renderer_type == RENDERER_OSBA_AMBI || + st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV ) + { + /*get HOA gets for direction (ACN/SN3D)*/ + ivas_dirac_dec_get_response( azimuth, elevation, st_ivas->hIsmRendererData->gains[i], st_ivas->hIntSetup.ambisonics_order ); + } + } + } + } + + return; +} + + +/*-------------------------------------------------------------------------* + * ivas_param_ism_dec_digest_tc() + * + * + *-------------------------------------------------------------------------*/ + +void ivas_param_ism_dec_digest_tc( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const uint16_t nCldfbSlots, /* i : number of CLFBS slots in the transport channels */ + float *transport_channels_f[] /* i : synthesized core-coder transport channels/DirAC output */ +) +{ + int16_t ch, nchan_transport, nchan_out, nchan_out_woLFE, i; + int16_t slot_idx, bin_idx; + int32_t ivas_total_brate; + int16_t output_frame; + float ref_power[CLDFB_NO_CHANNELS_MAX]; + float cx_diag[CLDFB_NO_CHANNELS_MAX][PARAM_ISM_MAX_DMX]; + /* Direct Response/EFAP Gains */ + float direct_response[MAX_NUM_OBJECTS][PARAM_ISM_MAX_CHAN]; + PARAM_ISM_DEC_HANDLE hParamIsmDec; + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom; + int16_t fade_len; + + /* Initialization */ + hParamIsmDec = st_ivas->hParamIsmDec; + assert( hParamIsmDec ); + hSpatParamRendCom = st_ivas->hSpatParamRendCom; + assert( hSpatParamRendCom ); + output_frame = nCldfbSlots * hSpatParamRendCom->num_freq_bands; + fade_len = output_frame / 2; + + nchan_transport = st_ivas->nchan_transport; + ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; + + if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) + { + nchan_out = st_ivas->nchan_ism; + nchan_out_woLFE = nchan_out; + st_ivas->hDecoderConfig->nchan_out = nchan_out; + } + else + { + nchan_out = st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe; + nchan_out_woLFE = st_ivas->hIntSetup.nchan_out_woLFE; + } + + push_wmops( "ivas_param_ism_dec" ); + + /* general setup */ + ivas_jbm_dec_get_adapted_linear_interpolator( DEFAULT_JBM_CLDFB_TIMESLOTS, nCldfbSlots, hParamIsmDec->hParamIsmRendering->interpolator ); + + ivas_dirac_dec_set_md_map( st_ivas, nCldfbSlots ); + + /* set buffers to zero */ + for ( bin_idx = 0; bin_idx < CLDFB_NO_CHANNELS_MAX; bin_idx++ ) + { + set_zero( cx_diag[bin_idx], PARAM_ISM_MAX_DMX ); + } + set_zero( ref_power, CLDFB_NO_CHANNELS_MAX ); + + /* Frame-level Processing */ + /* De-quantization */ + if ( !( ivas_total_brate == IVAS_SID_5k2 || ivas_total_brate == FRAME_NO_DATA ) ) + { + ivas_param_ism_dec_dequant_DOA( hParamIsmDec, st_ivas->nchan_ism ); + ivas_param_ism_dec_dequant_powrat( hParamIsmDec ); + st_ivas->hISMDTX.dtx_flag = 0; + } + else + { + st_ivas->hISMDTX.dtx_flag = 1; + } + + /* obtain the direct response using EFAP */ + if ( !( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) ) + { + for ( i = 0; i < st_ivas->nchan_ism; i++ ) + { + efap_determine_gains( st_ivas->hEFAPdata, direct_response[i], hParamIsmDec->azimuth_values[i], hParamIsmDec->elevation_values[i], EFAP_MODE_EFAP ); + } + } + else + { + int16_t j; + + for ( i = 0; i < st_ivas->nchan_ism; i++ ) + { + for ( j = 0; j < nchan_out_woLFE; j++ ) + { + if ( i == j ) + { + direct_response[i][j] = 1.0f; + } + else + { + direct_response[i][j] = 0.0f; + } + } + } + + for ( j = 0; j < nchan_out_woLFE; j++ ) + { + if ( hParamIsmDec->azimuth_values[j] > 0.0f ) + { + hParamIsmDec->hParamIsmRendering->proto_matrix[j] = 1.0f; + hParamIsmDec->hParamIsmRendering->proto_matrix[nchan_out_woLFE + j] = 0.0f; + } + else + { + if ( hParamIsmDec->azimuth_values[j] < 0.0f ) + { + hParamIsmDec->hParamIsmRendering->proto_matrix[j] = 0.0f; + hParamIsmDec->hParamIsmRendering->proto_matrix[nchan_out_woLFE + j] = 1.0f; + } + else /* == 0.0f */ + { + hParamIsmDec->hParamIsmRendering->proto_matrix[j] = 0.5f; + hParamIsmDec->hParamIsmRendering->proto_matrix[nchan_out_woLFE + j] = 0.5f; + } + } + } + } + + if ( st_ivas->hDecoderConfig->Opt_tsm || !st_ivas->hDecoderConfig->Opt_5ms ) + { + /*TODO : FhG to check*/ + ivas_ism_param_dec_tc_gain_ajust( st_ivas, output_frame, fade_len, transport_channels_f ); + } + + for ( ch = 0; ch < nchan_transport; ch++ ) + { + /* CLDFB Analysis */ + for ( slot_idx = 0; slot_idx < nCldfbSlots; slot_idx++ ) + { + if ( st_ivas->hDecoderConfig->Opt_tsm || !st_ivas->hDecoderConfig->Opt_5ms ) + { + + float RealBuffer[CLDFB_NO_CHANNELS_MAX]; + float ImagBuffer[CLDFB_NO_CHANNELS_MAX]; + + cldfbAnalysis_ts( &( transport_channels_f[ch][hSpatParamRendCom->num_freq_bands * slot_idx] ), RealBuffer, ImagBuffer, hSpatParamRendCom->num_freq_bands, st_ivas->cldfbAnaDec[ch] ); + mvr2r( RealBuffer, &hParamIsmDec->hParamIsmRendering->Cldfb_RealBuffer_tc[slot_idx * hSpatParamRendCom->num_freq_bands * nchan_transport + ch * hSpatParamRendCom->num_freq_bands], hSpatParamRendCom->num_freq_bands ); + mvr2r( ImagBuffer, &hParamIsmDec->hParamIsmRendering->Cldfb_ImagBuffer_tc[slot_idx * hSpatParamRendCom->num_freq_bands * nchan_transport + ch * hSpatParamRendCom->num_freq_bands], hSpatParamRendCom->num_freq_bands ); + } + + ivas_param_ism_collect_slot( hParamIsmDec, &hParamIsmDec->hParamIsmRendering->Cldfb_RealBuffer_tc[slot_idx * hSpatParamRendCom->num_freq_bands * nchan_transport + ch * hSpatParamRendCom->num_freq_bands], &hParamIsmDec->hParamIsmRendering->Cldfb_ImagBuffer_tc[slot_idx * hSpatParamRendCom->num_freq_bands * nchan_transport + ch * hSpatParamRendCom->num_freq_bands], ch, ref_power, cx_diag ); + } + } + + /* Obtain Mixing Matrix on a frame-level */ + for ( bin_idx = 0; bin_idx < hSpatParamRendCom->num_freq_bands; bin_idx++ ) + { + set_f( hParamIsmDec->hParamIsmRendering->mixing_matrix_lin[bin_idx], 0.0f, nchan_transport * nchan_out_woLFE ); + } + + /* Compute mixing matrix */ + ivas_param_ism_compute_mixing_matrix( st_ivas->nchan_ism, hParamIsmDec, st_ivas->hISMDTX, direct_response, nchan_transport, nchan_out_woLFE, cx_diag, ref_power, hParamIsmDec->hParamIsmRendering->mixing_matrix_lin ); + + pop_wmops(); + + return; +} + + +/*-------------------------------------------------------------------------* + * ivas_ism_param_dec_tc_gain_ajust() + * + * + *-------------------------------------------------------------------------*/ + +void ivas_ism_param_dec_tc_gain_ajust( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const uint16_t nSamples, /* i : number of samples to be compensate */ + const uint16_t nFadeLength, /* i : length of the crossfade in samples */ + float *transport_channels_f[] /* i : synthesized core-coder transport channels/DirAC output*/ +) + +{ + int16_t i; + float gain, ene_tc, ene_sum, grad; + float last_gain; + + ene_tc = 0.0f; + ene_sum = 0.0f; + last_gain = st_ivas->hParamIsmDec->hParamIsm->last_dmx_gain; + + for ( i = 0; i < nSamples; i++ ) + { + ene_tc += transport_channels_f[0][i] * transport_channels_f[0][i] + transport_channels_f[1][i] * transport_channels_f[1][i]; /* L*L + R*R */ + ene_sum += ( transport_channels_f[0][i] + transport_channels_f[1][i] ) * ( transport_channels_f[0][i] + transport_channels_f[1][i] ); /* (L+R)*(L+R) */ + } + gain = sqrtf( ene_tc / ( ene_sum + EPSILON ) ); + if ( st_ivas->hSCE[0]->hCoreCoder[0]->ini_frame > 1 ) + { + /* Smoothing */ + gain = 0.75f * gain + 0.25f * last_gain; + /* 10ms ramp */ + grad = ( gain - last_gain ) / (float) nFadeLength; /* slope between two consecutive gains, 480 samples length */ + for ( i = 0; i < ( nFadeLength ); i++ ) + { + transport_channels_f[0][i] *= ( last_gain + i * grad ); + transport_channels_f[1][i] *= ( last_gain + i * grad ); + } + for ( ; i < nSamples; i++ ) + { + transport_channels_f[0][i] *= gain; + transport_channels_f[1][i] *= gain; + } + } + else + { + for ( i = 0; i < nSamples; i++ ) + { + transport_channels_f[0][i] *= gain; + transport_channels_f[1][i] *= gain; + } + } + + st_ivas->hParamIsmDec->hParamIsm->last_dmx_gain = gain; + + return; +} + + +/*-------------------------------------------------------------------------* + * ivas_ism_param_dec_render_sf() + * + * + *-------------------------------------------------------------------------*/ + +static void ivas_ism_param_dec_render_sf( + Decoder_Struct *st_ivas, + IVAS_OUTPUT_SETUP hSetup, + const int16_t nchan_transport, + const int16_t nchan_out, + const int16_t nchan_out_woLFE, + float *output_f[] /* o : rendered time signal */ +) +{ + int16_t ch, slot_idx, i, index_slot; + /* CLDFB Output Buffers */ + float Cldfb_RealBuffer[PARAM_ISM_MAX_CHAN][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + float Cldfb_ImagBuffer[PARAM_ISM_MAX_CHAN][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + float *Cldfb_RealBuffer_in[PARAM_ISM_MAX_DMX]; + float *Cldfb_ImagBuffer_in[PARAM_ISM_MAX_DMX]; + PARAM_ISM_DEC_HANDLE hParamIsmDec; + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom; + int16_t slot_idx_start; + int16_t idx_in; + int16_t idx_lfe; + int16_t subframe_idx; + + hParamIsmDec = st_ivas->hParamIsmDec; + hSpatParamRendCom = st_ivas->hSpatParamRendCom; + slot_idx_start = hSpatParamRendCom->slots_rendered; + subframe_idx = hSpatParamRendCom->subframes_rendered; + + /* Set some memories to zero */ + for ( ch = 0; ch < nchan_out_woLFE; ch++ ) + { + for ( slot_idx = 0; slot_idx < hSpatParamRendCom->subframe_nbslots[subframe_idx]; slot_idx++ ) + { + set_f( Cldfb_RealBuffer[ch][slot_idx], 0.0f, hSpatParamRendCom->num_freq_bands ); + set_f( Cldfb_ImagBuffer[ch][slot_idx], 0.0f, hSpatParamRendCom->num_freq_bands ); + } + } + + for ( slot_idx = 0; slot_idx < hSpatParamRendCom->subframe_nbslots[subframe_idx]; slot_idx++ ) + { + index_slot = slot_idx_start + slot_idx; + + for ( ch = 0; ch < nchan_transport; ch++ ) + { + Cldfb_RealBuffer_in[ch] = &hParamIsmDec->hParamIsmRendering->Cldfb_RealBuffer_tc[index_slot * hSpatParamRendCom->num_freq_bands * nchan_transport + ch * hSpatParamRendCom->num_freq_bands]; + Cldfb_ImagBuffer_in[ch] = &hParamIsmDec->hParamIsmRendering->Cldfb_ImagBuffer_tc[index_slot * hSpatParamRendCom->num_freq_bands * nchan_transport + ch * hSpatParamRendCom->num_freq_bands]; + } + + /* Compute bandwise rendering to target LS using covariance rendering */ + ivas_param_ism_render_slot( hParamIsmDec, hSpatParamRendCom, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, + Cldfb_RealBuffer, Cldfb_ImagBuffer, hParamIsmDec->hParamIsmRendering->mixing_matrix_lin, index_slot, slot_idx, nchan_out_woLFE, nchan_transport ); + } + + /* CLDFB Synthesis */ + idx_in = 0; + idx_lfe = 0; + + for ( ch = 0; ch < nchan_out; ch++ ) + { + if ( ( hSetup.num_lfe > 0 ) && ( hSetup.index_lfe[idx_lfe] == ch ) ) + { + set_zero( output_f[ch], hSpatParamRendCom->subframe_nbslots[subframe_idx] * hSpatParamRendCom->num_freq_bands ); + if ( idx_lfe < ( hSetup.num_lfe - 1 ) ) + { + idx_lfe++; + } + } + else + { + float *RealBuffer[16]; + float *ImagBuffer[16]; + + /* open CLDFB buffer up to CLDFB_NO_CHANNELS_MAX bands for 48kHz */ + for ( i = 0; i < hSpatParamRendCom->subframe_nbslots[subframe_idx]; i++ ) + { + RealBuffer[i] = Cldfb_RealBuffer[idx_in][i]; + ImagBuffer[i] = Cldfb_ImagBuffer[idx_in][i]; + } + + cldfbSynthesis( RealBuffer, ImagBuffer, output_f[ch], hSpatParamRendCom->num_freq_bands * hSpatParamRendCom->subframe_nbslots[subframe_idx], st_ivas->cldfbSynDec[ch] ); + idx_in++; + } + } + + hSpatParamRendCom->slots_rendered += hSpatParamRendCom->subframe_nbslots[subframe_idx]; + hSpatParamRendCom->subframes_rendered++; + + return; +} + + +/*-------------------------------------------------------------------------* + * ivas_param_ism_dec_render() + * + * + *-------------------------------------------------------------------------*/ + +void ivas_param_ism_dec_render( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */ + uint16_t *nSamplesRendered, /* o : number of CLDFB slots rendered */ + uint16_t *nSamplesAvailableNext, /* o : number of CLDFB slots still to render */ + float *output_f[] /* o : rendered time signal */ +) +{ + int16_t ch, slots_to_render, first_sf, last_sf, subframe_idx; + uint16_t slot_size, n_samples_sf; + PARAM_ISM_DEC_HANDLE hParamIsmDec; + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom; + IVAS_OUTPUT_SETUP hSetup; + int16_t nchan_transport, nchan_out, nchan_out_woLFE; + float *output_f_local[MAX_OUTPUT_CHANNELS]; + + hParamIsmDec = st_ivas->hParamIsmDec; + hSpatParamRendCom = st_ivas->hSpatParamRendCom; + hSetup = st_ivas->hIntSetup; + nchan_transport = st_ivas->nchan_transport; + if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) + { + nchan_out = st_ivas->nchan_ism; + nchan_out_woLFE = nchan_out; + st_ivas->hDecoderConfig->nchan_out = nchan_out; + } + else + { + nchan_out = st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe; + nchan_out_woLFE = st_ivas->hIntSetup.nchan_out_woLFE; + } + slot_size = NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ); + + /* loop for synthesis, assume we always have to render in multiples of 5ms subframes with spills */ + slots_to_render = min( hSpatParamRendCom->num_slots - hSpatParamRendCom->slots_rendered, nSamplesAsked / slot_size ); + *nSamplesRendered = slots_to_render * slot_size; + first_sf = hSpatParamRendCom->subframes_rendered; + last_sf = first_sf; + + while ( slots_to_render > 0 ) + { + slots_to_render -= hSpatParamRendCom->subframe_nbslots[last_sf]; + last_sf++; + } + + for ( ch = 0; ch < nchan_out; ch++ ) + { + output_f_local[ch] = &output_f[ch][0]; + } + + for ( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ ) + { + ivas_ism_param_dec_render_sf( st_ivas, hSetup, nchan_transport, nchan_out, nchan_out_woLFE, output_f_local ); + n_samples_sf = hSpatParamRendCom->subframe_nbslots[subframe_idx] * hSpatParamRendCom->slot_size; + for ( ch = 0; ch < nchan_out; ch++ ) + { + output_f_local[ch] += n_samples_sf; + } + } + + if ( hSpatParamRendCom->slots_rendered == hSpatParamRendCom->num_slots ) + { + /* copy the memories */ + /* store mixing matrix for next subframe */ + ivas_param_ism_update_mixing_matrix( hParamIsmDec, hParamIsmDec->hParamIsmRendering->mixing_matrix_lin, nchan_transport, nchan_out_woLFE ); + + /* store MetaData parameters */ + for ( ch = 0; ch < st_ivas->nchan_ism; ch++ ) + { + if ( st_ivas->hParamIsmDec->azimuth_values[ch] > 180.0f ) + { + st_ivas->hIsmMetaData[ch]->azimuth = st_ivas->hParamIsmDec->azimuth_values[ch] - 360.0f; + } + else + { + st_ivas->hIsmMetaData[ch]->azimuth = st_ivas->hParamIsmDec->azimuth_values[ch]; + } + + st_ivas->hIsmMetaData[ch]->elevation = st_ivas->hParamIsmDec->elevation_values[ch]; + } + } + + *nSamplesAvailableNext = ( hSpatParamRendCom->num_slots - hSpatParamRendCom->slots_rendered ) * slot_size; + + return; +} + + +/*-------------------------------------------------------------------------* + * ivas_param_ism_params_to_masa_param_mapping() + * + * + *-------------------------------------------------------------------------*/ + +void ivas_param_ism_params_to_masa_param_mapping( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +) +{ + PARAM_ISM_DEC_HANDLE hParamIsmDec; + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom; + int16_t nBins; + int16_t band_idx, bin_idx, sf_idx; + int16_t brange[2]; + int16_t azimuth[2]; + int16_t elevation[2]; + float power_ratio[2]; + int32_t ivas_total_brate; + + hParamIsmDec = st_ivas->hParamIsmDec; + hSpatParamRendCom = st_ivas->hSpatParamRendCom; + nBins = hSpatParamRendCom->num_freq_bands; + + ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; + + if ( !( ivas_total_brate == IVAS_SID_5k2 || ivas_total_brate == FRAME_NO_DATA ) ) + { + ivas_param_ism_dec_dequant_DOA( hParamIsmDec, st_ivas->nchan_ism ); + ivas_param_ism_dec_dequant_powrat( hParamIsmDec ); + st_ivas->hISMDTX.dtx_flag = 0; + } + else + { + st_ivas->hISMDTX.dtx_flag = 1; + } + + if ( st_ivas->nchan_ism > 1 ) + { + if ( st_ivas->hISMDTX.dtx_flag ) + { + float energy_ratio; + energy_ratio = powf( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->coherence, 2.0f ); + + hSpatParamRendCom->numSimultaneousDirections = 1; + azimuth[0] = (int16_t) roundf( hParamIsmDec->azimuth_values[0] ); + elevation[0] = (int16_t) roundf( hParamIsmDec->elevation_values[0] ); + + for ( sf_idx = 0; sf_idx < MAX_PARAM_SPATIAL_SUBFRAMES; sf_idx++ ) + { + for ( bin_idx = 0; bin_idx < nBins; bin_idx++ ) + { + hSpatParamRendCom->azimuth[sf_idx][bin_idx] = azimuth[0]; + hSpatParamRendCom->elevation[sf_idx][bin_idx] = elevation[0]; + + hSpatParamRendCom->energy_ratio1[sf_idx][bin_idx] = energy_ratio; + + hSpatParamRendCom->spreadCoherence[sf_idx][bin_idx] = 0.0f; + hSpatParamRendCom->surroundingCoherence[sf_idx][bin_idx] = 0.0; + } + } + } + else + { + hSpatParamRendCom->numSimultaneousDirections = 2; + for ( band_idx = 0; band_idx < hParamIsmDec->hParamIsm->nbands; band_idx++ ) + { + brange[0] = hParamIsmDec->hParamIsm->band_grouping[band_idx]; + brange[1] = hParamIsmDec->hParamIsm->band_grouping[band_idx + 1]; + + azimuth[0] = (int16_t) roundf( hParamIsmDec->azimuth_values[hParamIsmDec->hParamIsm->obj_indices[band_idx][0][0]] ); + elevation[0] = (int16_t) roundf( hParamIsmDec->elevation_values[hParamIsmDec->hParamIsm->obj_indices[band_idx][0][0]] ); + power_ratio[0] = hParamIsmDec->power_ratios[band_idx][0][0]; + + azimuth[1] = (int16_t) roundf( hParamIsmDec->azimuth_values[hParamIsmDec->hParamIsm->obj_indices[band_idx][0][1]] ); + elevation[1] = (int16_t) roundf( hParamIsmDec->elevation_values[hParamIsmDec->hParamIsm->obj_indices[band_idx][0][1]] ); + power_ratio[1] = hParamIsmDec->power_ratios[band_idx][0][1]; + + for ( sf_idx = 0; sf_idx < MAX_PARAM_SPATIAL_SUBFRAMES; sf_idx++ ) + { + for ( bin_idx = brange[0]; bin_idx < brange[1]; bin_idx++ ) + { + hSpatParamRendCom->azimuth[sf_idx][bin_idx] = azimuth[0]; + hSpatParamRendCom->elevation[sf_idx][bin_idx] = elevation[0]; + hSpatParamRendCom->energy_ratio1[sf_idx][bin_idx] = power_ratio[0]; + hSpatParamRendCom->azimuth2[sf_idx][bin_idx] = azimuth[1]; + hSpatParamRendCom->elevation2[sf_idx][bin_idx] = elevation[1]; + hSpatParamRendCom->energy_ratio2[sf_idx][bin_idx] = power_ratio[1]; + } + } + } + + for ( sf_idx = 0; sf_idx < MAX_PARAM_SPATIAL_SUBFRAMES; sf_idx++ ) + { + for ( bin_idx = 0; bin_idx < nBins; bin_idx++ ) + { + hSpatParamRendCom->spreadCoherence[sf_idx][bin_idx] = 0.0f; + hSpatParamRendCom->spreadCoherence2[sf_idx][bin_idx] = 0.0f; + hSpatParamRendCom->surroundingCoherence[sf_idx][bin_idx] = 0.0; + } + } + } + } + else + { + hSpatParamRendCom->numSimultaneousDirections = 1; + azimuth[0] = (int16_t) roundf( hParamIsmDec->azimuth_values[0] ); + elevation[0] = (int16_t) roundf( hParamIsmDec->elevation_values[0] ); + + for ( sf_idx = 0; sf_idx < MAX_PARAM_SPATIAL_SUBFRAMES; sf_idx++ ) + { + for ( bin_idx = 0; bin_idx < nBins; bin_idx++ ) + { + hSpatParamRendCom->azimuth[sf_idx][bin_idx] = azimuth[0]; + hSpatParamRendCom->elevation[sf_idx][bin_idx] = elevation[0]; + hSpatParamRendCom->energy_ratio1[sf_idx][bin_idx] = 1.0f; + hSpatParamRendCom->spreadCoherence[sf_idx][bin_idx] = 0.0f; + hSpatParamRendCom->surroundingCoherence[sf_idx][bin_idx] = 0.0; + } + } + } + + return; +} diff --git a/lib_dec/ivas_ism_renderer.c b/lib_dec/ivas_ism_renderer.c new file mode 100644 index 0000000000000000000000000000000000000000..ee99ce067379a19cd4a09478bc77e933ce113e50 --- /dev/null +++ b/lib_dec/ivas_ism_renderer.c @@ -0,0 +1,740 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "ivas_cnst.h" +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_prot_rend.h" +#include "ivas_stat_com.h" +#include "ivas_rom_com.h" +#include "ivas_rom_dec.h" +#include +#include "wmc_auto.h" + + +/*-------------------------------------------------------------------------* + * ivas_ism_renderer_open() + * + * Open struct for object rendering, reserve memory, and init values. + *-------------------------------------------------------------------------*/ + +ivas_error ivas_ism_renderer_open( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +) +{ + int16_t i; + uint16_t interpolator_length; + uint16_t init_interpolator_length; + ivas_error error; + + if ( ( st_ivas->hIsmRendererData = (ISM_RENDERER_HANDLE) malloc( sizeof( ISM_RENDERER_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for ISM renderer\n" ) ); + } + +#ifdef BE_FIX_832_ASAN_ERROR_EFAP_OSBA + if ( st_ivas->hIntSetup.is_loudspeaker_setup && st_ivas->hIntSetup.ls_azimuth != NULL && st_ivas->hIntSetup.ls_elevation != NULL && st_ivas->hEFAPdata == NULL ) +#else + if ( st_ivas->hIntSetup.is_loudspeaker_setup && st_ivas->hIntSetup.ls_azimuth != NULL && st_ivas->hIntSetup.ls_elevation != NULL ) +#endif + { + if ( ( error = efap_init_data( &( st_ivas->hEFAPdata ), st_ivas->hIntSetup.ls_azimuth, st_ivas->hIntSetup.ls_elevation, st_ivas->hIntSetup.nchan_out_woLFE, EFAP_MODE_EFAP ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + for ( i = 0; i < MAX_NUM_OBJECTS; i++ ) + { + set_f( st_ivas->hIsmRendererData->prev_gains[i], 0.0f, MAX_OUTPUT_CHANNELS ); + set_f( st_ivas->hIsmRendererData->gains[i], 0.0f, MAX_OUTPUT_CHANNELS ); + } + + if ( st_ivas->hDecoderConfig->Opt_tsm ) + { + init_interpolator_length = NS2SA( st_ivas->hDecoderConfig->output_Fs, MAX_JBM_CLDFB_TIMESLOTS * CLDFB_SLOT_NS ); + interpolator_length = (uint16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); + } + else + { + init_interpolator_length = (uint16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); + interpolator_length = init_interpolator_length; + } + + if ( ( st_ivas->hIsmRendererData->interpolator = (float *) malloc( sizeof( float ) * init_interpolator_length ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for ISM renderer interpolator\n" ) ); + } + + for ( i = 0; i < interpolator_length; i++ ) + { + st_ivas->hIsmRendererData->interpolator[i] = (float) i / ( (float) interpolator_length - 1 ); + } + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------------* + * ivas_ism_renderer_close() + * + * Close struct for object rendering. + *-------------------------------------------------------------------------*/ + +void ivas_ism_renderer_close( + ISM_RENDERER_HANDLE *hIsmRendererData /* i/o: ISM renderer handle */ +) +{ + if ( hIsmRendererData == NULL || *hIsmRendererData == NULL ) + { + return; + } + + if ( ( *hIsmRendererData )->interpolator != NULL ) + { + free( ( *hIsmRendererData )->interpolator ); + ( *hIsmRendererData )->interpolator = NULL; + } + + free( *hIsmRendererData ); + *hIsmRendererData = NULL; + + return; +} + + +/*-------------------------------------------------------------------------* + * ivas_ism_render() + * + * Object rendering process. + *-------------------------------------------------------------------------*/ + +void ivas_ism_render( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float *output_f[], /* i/o: core-coder transport channels/object output */ + const int16_t output_frame /* i : output frame length per channel */ +) +{ + int16_t i, j, k, j2; + float input_f[MAX_NUM_OBJECTS][L_FRAME48k]; + float tmp_output_f[MAX_OUTPUT_CHANNELS][L_FRAME48k]; + float gains[MAX_NUM_OBJECTS][MAX_OUTPUT_CHANNELS]; + float g1, g2; + int16_t nchan_ism, nchan_out_woLFE, lfe_index; + int16_t azimuth, elevation; + + nchan_ism = st_ivas->nchan_ism; + nchan_out_woLFE = st_ivas->hIntSetup.nchan_out_woLFE; + + lfe_index = 0; + + for ( j = 0; j < nchan_out_woLFE; j++ ) + { + set_f( tmp_output_f[j], 0.0f, output_frame ); + } + + for ( i = 0; i < nchan_ism; i++ ) + { + mvr2r( output_f[i], input_f[i], output_frame ); + } + + for ( i = 0; i < nchan_out_woLFE + st_ivas->hIntSetup.num_lfe; i++ ) + { + set_f( output_f[i], 0.0f, output_frame ); + } + + for ( i = 0; i < nchan_ism; i++ ) + { + if ( st_ivas->intern_config == IVAS_AUDIO_CONFIG_STEREO ) + { + ivas_ism_get_stereo_gains( st_ivas->hIsmMetaData[i]->azimuth, st_ivas->hIsmMetaData[i]->elevation, &gains[i][0], &gains[i][1] ); + } + else + { + /* Combined rotation: rotate the object positions depending the head and external orientations */ + if ( st_ivas->hCombinedOrientationData != NULL && st_ivas->hCombinedOrientationData->enableCombinedOrientation[0] == 1 ) + { + rotateAziEle( st_ivas->hIsmMetaData[i]->azimuth, st_ivas->hIsmMetaData[i]->elevation, &azimuth, &elevation, st_ivas->hCombinedOrientationData->Rmat[0], st_ivas->hIntSetup.is_planar_setup ); + } + else + { + // TODO tmu review when #215 is resolved + azimuth = (int16_t) floorf( st_ivas->hIsmMetaData[i]->azimuth + 0.5f ); + elevation = (int16_t) floorf( st_ivas->hIsmMetaData[i]->elevation + 0.5f ); + + if ( st_ivas->hIntSetup.is_planar_setup ) + { + /* If no elevation support in output format, then rendering should be done with zero elevation */ + elevation = 0; + } + } + + if ( st_ivas->hEFAPdata != NULL ) + { + efap_determine_gains( st_ivas->hEFAPdata, gains[i], azimuth, elevation, EFAP_MODE_EFAP ); + } + } + + for ( j = 0; j < nchan_out_woLFE; j++ ) + { + if ( fabsf( gains[i][j] ) > 0.0f || fabsf( st_ivas->hIsmRendererData->prev_gains[i][j] ) > 0.0f ) + { + for ( k = 0; k < output_frame; k++ ) + { + g1 = st_ivas->hIsmRendererData->interpolator[k]; + g2 = 1.0f - g1; + tmp_output_f[j][k] += ( g1 * gains[i][j] + g2 * st_ivas->hIsmRendererData->prev_gains[i][j] ) * input_f[i][k]; + } + } + + st_ivas->hIsmRendererData->prev_gains[i][j] = gains[i][j]; + } + } + + /* Move to output skipping LFE */ + for ( j = 0, j2 = 0; j < nchan_out_woLFE; j++, j2++ ) + { + if ( ( st_ivas->hIntSetup.num_lfe > 0 ) && ( st_ivas->hIntSetup.index_lfe[lfe_index] == j ) ) + { + ( lfe_index < ( st_ivas->hIntSetup.num_lfe - 1 ) ) ? ( lfe_index++, j2++ ) : j2++; + } + mvr2r( tmp_output_f[j], output_f[j2], output_frame ); + } + + return; +} + + +/*-------------------------------------------------------------------------* + * ivas_ism_render_sf() + * + * Object rendering process + *-------------------------------------------------------------------------*/ + +void ivas_ism_render_sf( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float *output_f[], /* i/o: core-coder transport channels/object output */ + const int16_t n_samples_to_render /* i : output frame length per channel */ +) +{ + int16_t i, j, k, j2; + float *g1, g2, *tc; + int16_t num_objects, nchan_out_woLFE, lfe_index; + int16_t azimuth, elevation; + int16_t tc_offset; + int16_t interp_offset; + float gain, prev_gain; + + num_objects = st_ivas->nchan_transport; + if ( st_ivas->ivas_format == SBA_ISM_FORMAT ) + { + num_objects = st_ivas->nchan_ism; + } + + nchan_out_woLFE = st_ivas->hIntSetup.nchan_out_woLFE; + + tc_offset = st_ivas->hTcBuffer->n_samples_rendered; + interp_offset = st_ivas->hTcBuffer->n_samples_rendered; + + for ( i = 0; i < nchan_out_woLFE + st_ivas->hIntSetup.num_lfe; i++ ) + { + set_f( output_f[i], 0.0f, n_samples_to_render ); + } + + if ( st_ivas->hCombinedOrientationData && st_ivas->hCombinedOrientationData->enableCombinedOrientation[0] ) + { + ivas_jbm_dec_get_adapted_linear_interpolator( n_samples_to_render, n_samples_to_render, st_ivas->hIsmRendererData->interpolator ); + interp_offset = 0; + } + + for ( i = 0; i < num_objects; i++ ) + { + /* Combined rotation: rotate the object positions depending the head and external orientations */ + if ( st_ivas->hCombinedOrientationData != NULL && st_ivas->hCombinedOrientationData->enableCombinedOrientation[0] == 1 ) + { + rotateAziEle( st_ivas->hIsmMetaData[i]->azimuth, st_ivas->hIsmMetaData[i]->elevation, &azimuth, &elevation, st_ivas->hCombinedOrientationData->Rmat[0], st_ivas->hIntSetup.is_planar_setup ); + if ( st_ivas->hEFAPdata != NULL ) + { + efap_determine_gains( st_ivas->hEFAPdata, st_ivas->hIsmRendererData->gains[i], azimuth, elevation, EFAP_MODE_EFAP ); + } + } + + lfe_index = 0; + for ( j = 0, j2 = 0; j < nchan_out_woLFE; j++, j2++ ) + { + if ( ( st_ivas->hIntSetup.num_lfe > 0 ) && ( st_ivas->hIntSetup.index_lfe[lfe_index] == j ) ) + { + ( lfe_index < ( st_ivas->hIntSetup.num_lfe - 1 ) ) ? ( lfe_index++, j2++ ) : j2++; + } + + gain = st_ivas->hIsmRendererData->gains[i][j]; + prev_gain = st_ivas->hIsmRendererData->prev_gains[i][j]; + if ( fabsf( gain ) > 0.0f || fabsf( prev_gain ) > 0.0f ) + { + g1 = &st_ivas->hIsmRendererData->interpolator[interp_offset]; + tc = &st_ivas->hTcBuffer->tc[i][tc_offset]; + for ( k = 0; k < n_samples_to_render; k++ ) + { + g2 = 1.0f - *g1; + output_f[j2][k] += ( *( g1++ ) * gain + g2 * prev_gain ) * *( tc++ ); + } + } + + /* update here only in case of head rotation */ + if ( st_ivas->hCombinedOrientationData != NULL && st_ivas->hCombinedOrientationData->enableCombinedOrientation[0] == 1 ) + { + st_ivas->hIsmRendererData->prev_gains[i][j] = gain; + } + } + } + + return; +} + + +/*-------------------------------------------------------------------------* + * ivas_ism_get_stereo_gains() + * + * + *-------------------------------------------------------------------------*/ + +void ivas_ism_get_stereo_gains( + const float azimuth, /* i : object azimuth */ + const float elevation, /* i : object elevation */ + float *left_gain, /* o : left channel gain */ + float *right_gain /* o : right channel gain */ +) +{ + float aziRad, eleRad; + float y, mappedX, aziRadMapped, A, A2, A3; + const float LsAngleRad = 30.0f * PI_OVER_180; + + /* Convert azi and ele to an azi value of the cone of confusion */ + aziRad = azimuth * PI_OVER_180; + eleRad = elevation * PI_OVER_180; + y = ( sinf( aziRad ) * cosf( eleRad ) ); + mappedX = sqrtf( max( 0.0f, 1.0f - ( y * y ) ) ); + aziRadMapped = atan2f( y, mappedX ); + + /* Determine the amplitude panning gains */ + if ( aziRadMapped >= LsAngleRad ) + { /* Left side */ + *left_gain = 1.0f; + *right_gain = 0.0f; + } + else if ( aziRadMapped <= -LsAngleRad ) + { /* Right side */ + *left_gain = 0.0f; + *right_gain = 1.0f; + } + else /* Tangent panning law */ + { + A = tanf( aziRadMapped ) / tanf( LsAngleRad ); + A2 = ( A - 1.0f ) / max( 0.001f, A + 1.0f ); + A3 = 1.0f / ( A2 * A2 + 1.0f ); + *left_gain = sqrtf( A3 ); + *right_gain = sqrtf( 1.0f - A3 ); + } + + return; +} + + +/*-------------------------------------------------------------------------* + * ivas_masa_oism_separate_object_renderer_open() + * + * Open structures, reserve memory, and init values. + *-------------------------------------------------------------------------*/ + +ivas_error ivas_omasa_separate_object_renderer_open( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +) +{ + int16_t interpolator_length; + int16_t i; + int16_t init_interpolator_length; + + if ( ( st_ivas->hIsmRendererData = (ISM_RENDERER_HANDLE) malloc( sizeof( ISM_RENDERER_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for MASA ISM renderer \n" ) ); + } + + for ( i = 0; i < MAX_NUM_OBJECTS; i++ ) + { + set_f( st_ivas->hIsmRendererData->prev_gains[i], 0.0f, MAX_OUTPUT_CHANNELS ); + } + + init_interpolator_length = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC / MAX_PARAM_SPATIAL_SUBFRAMES ); + interpolator_length = init_interpolator_length; + st_ivas->hIsmRendererData->interpolator = (float *) malloc( sizeof( float ) * init_interpolator_length ); + + for ( i = 0; i < interpolator_length; i++ ) + { + st_ivas->hIsmRendererData->interpolator[i] = (float) i / ( (float) interpolator_length ); + } + st_ivas->hIsmRendererData->interpolator_length = interpolator_length; + + st_ivas->hMasaIsmData->delayBuffer_size = (int16_t) ( ( st_ivas->hDecoderConfig->output_Fs / 50 ) / MAX_PARAM_SPATIAL_SUBFRAMES ); + + if ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) + { + st_ivas->hMasaIsmData->delayBuffer_nchan = 1; + } + else + { + st_ivas->hMasaIsmData->delayBuffer_nchan = st_ivas->nchan_ism; + } + + if ( ( st_ivas->hMasaIsmData->delayBuffer = (float **) malloc( st_ivas->hMasaIsmData->delayBuffer_nchan * sizeof( float * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for MASA ISM delay buffer \n" ) ); + } + + for ( i = 0; i < st_ivas->hMasaIsmData->delayBuffer_nchan; i++ ) + { + if ( ( st_ivas->hMasaIsmData->delayBuffer[i] = (float *) malloc( st_ivas->hMasaIsmData->delayBuffer_size * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for MASA ISM delay buffer \n" ) ); + } + set_zero( st_ivas->hMasaIsmData->delayBuffer[i], st_ivas->hMasaIsmData->delayBuffer_size ); + } + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------------* + * ivas_omasa_separate_object_renderer_close() + * + * Close structures, free memory. + *-------------------------------------------------------------------------*/ + +void ivas_omasa_separate_object_renderer_close( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +) +{ + int16_t i; + + if ( st_ivas->hMasaIsmData != NULL ) + { + if ( st_ivas->hMasaIsmData->delayBuffer != NULL ) + { + for ( i = 0; i < st_ivas->hMasaIsmData->delayBuffer_nchan; i++ ) + { + if ( st_ivas->hMasaIsmData->delayBuffer[i] != NULL ) + { + free( st_ivas->hMasaIsmData->delayBuffer[i] ); + st_ivas->hMasaIsmData->delayBuffer[i] = NULL; + } + } + + free( st_ivas->hMasaIsmData->delayBuffer ); + st_ivas->hMasaIsmData->delayBuffer = NULL; + } + } + + ivas_ism_renderer_close( &st_ivas->hIsmRendererData ); + + return; +} + + +/*-------------------------------------------------------------------------* + * ivas_omasa_separate_object_render() + * + * Rendering separated objects and mixing them to the parametrically rendered signals + *-------------------------------------------------------------------------*/ + +void ivas_omasa_separate_object_render( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float input_f[][L_FRAME48k], /* i : separated object signal */ + float *output_f[], /* i/o: output signals */ + const int16_t output_frame /* i : output frame length per channel */ +) +{ + VBAP_HANDLE hVBAPdata; + int16_t nchan_out_woLFE; + ISM_RENDERER_HANDLE hRendererData; + int16_t j, k, j2; + int16_t obj; + float gains[MAX_OUTPUT_CHANNELS]; + float g1, g2; + int16_t lfe_index; + int16_t azimuth, elevation; + int16_t num_objects; + uint8_t single_separated; + int16_t block; + int16_t subframe_len; + int16_t idx_offset; + int16_t dirac_read_idx; + + hVBAPdata = st_ivas->hVBAPdata; + nchan_out_woLFE = st_ivas->hIntSetup.nchan_out_woLFE; + hRendererData = st_ivas->hIsmRendererData; + lfe_index = st_ivas->hDirACRend->hOutSetup.index_lfe[0]; + subframe_len = output_frame / MAX_PARAM_SPATIAL_SUBFRAMES; + + if ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) + { + single_separated = 1; + num_objects = 1; + } + else + { + single_separated = 0; + num_objects = st_ivas->nchan_ism; + } + + for ( obj = 0; obj < num_objects; obj++ ) + { + delay_signal( input_f[obj], output_frame, st_ivas->hMasaIsmData->delayBuffer[obj], st_ivas->hMasaIsmData->delayBuffer_size ); /* Delay the signal to match CLDFB delay */ + + for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ ) + { + idx_offset = block * subframe_len; + dirac_read_idx = ( st_ivas->hSpatParamRendCom->dirac_read_idx + block ) % st_ivas->hSpatParamRendCom->dirac_md_buffer_length; + + if ( single_separated ) + { + azimuth = st_ivas->hMasaIsmData->azimuth_separated_ism[dirac_read_idx]; + elevation = st_ivas->hMasaIsmData->elevation_separated_ism[dirac_read_idx]; + } + else + { + azimuth = st_ivas->hMasaIsmData->azimuth_ism[obj][dirac_read_idx]; + elevation = st_ivas->hMasaIsmData->elevation_ism[obj][dirac_read_idx]; + } + + if ( st_ivas->hOutSetup.is_planar_setup ) + { + /* If no elevation support in output format, then rendering should be done with zero elevation */ + elevation = 0; + } + + if ( hVBAPdata != NULL ) + { + vbap_determine_gains( hVBAPdata, gains, azimuth, elevation, 1 ); + } + else + { + ivas_dirac_dec_get_response( azimuth, elevation, gains, st_ivas->hDirACRend->hOutSetup.ambisonics_order ); + } + + for ( j = 0; j < nchan_out_woLFE; j++ ) + { + if ( st_ivas->hDirACRend->hOutSetup.num_lfe > 0 ) + { + j2 = j + ( j >= lfe_index ); + } + else + { + j2 = j; + } + + if ( fabsf( gains[j] ) > 0.0f || fabsf( hRendererData->prev_gains[obj][j] ) > 0.0f ) + { + for ( k = 0; k < subframe_len; k++ ) + { + g1 = hRendererData->interpolator[k]; + g2 = 1.0f - g1; + output_f[j2][k + idx_offset] += ( g1 * gains[j] + g2 * hRendererData->prev_gains[obj][j] ) * input_f[obj][k + idx_offset]; + } + } + hRendererData->prev_gains[obj][j] = gains[j]; + } + } + } + + st_ivas->hSpatParamRendCom->dirac_read_idx = ( st_ivas->hSpatParamRendCom->dirac_read_idx + MAX_PARAM_SPATIAL_SUBFRAMES ) % st_ivas->hSpatParamRendCom->dirac_md_buffer_length; + + return; +} + + +/*-------------------------------------------------------------------------* + * ivas_omasa_separate_object_render_jbm() + * + * Rendering separated objects and mixing them to the parametrically rendered signals for JBM + *-------------------------------------------------------------------------*/ + +void ivas_omasa_separate_object_render_jbm( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const uint16_t nSamplesRendered, /* i : number of samples rendered */ + float *output_f[], /* o : rendered time signal */ + const int16_t subframes_rendered, /* i : number of subframes rendered */ + const int16_t slots_rendered /* i : number of CLDFB slots rendered */ +) +{ + VBAP_HANDLE hVBAPdata; + DIRAC_REND_HANDLE hDirACRend; + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom; + int16_t nchan_out_woLFE, num_lfe; + ISM_RENDERER_HANDLE hRendererData; + int16_t j, k, j2; + int16_t obj; + float gains[MAX_OUTPUT_CHANNELS]; + float g1, g2; + int16_t lfe_index; + int16_t azimuth, elevation; + int16_t num_objects; + uint8_t single_separated; + float *input_f[MAX_TRANSPORT_CHANNELS]; + float *output_f_local[MAX_OUTPUT_CHANNELS]; + int16_t offsetSamples; + int16_t n_samples_sf, md_idx; + int16_t slots_to_render, first_sf, last_sf, subframe_idx; + + hVBAPdata = st_ivas->hVBAPdata; + hDirACRend = st_ivas->hDirACRend; + hSpatParamRendCom = st_ivas->hSpatParamRendCom; + nchan_out_woLFE = st_ivas->hIntSetup.nchan_out_woLFE; + num_lfe = st_ivas->hIntSetup.num_lfe; + hRendererData = st_ivas->hIsmRendererData; + lfe_index = hDirACRend->hOutSetup.index_lfe[0]; + + if ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) + { + single_separated = 1; + num_objects = 1; + } + else + { + single_separated = 0; + num_objects = st_ivas->nchan_ism; + } + + offsetSamples = slots_rendered * hSpatParamRendCom->slot_size; + + for ( j = 0; j < nchan_out_woLFE + num_lfe; j++ ) + { + output_f_local[j] = output_f[j]; + } + + for ( obj = 0; obj < num_objects; obj++ ) + { + input_f[obj] = &st_ivas->hTcBuffer->tc[obj + 2][offsetSamples]; + } + + slots_to_render = nSamplesRendered / hSpatParamRendCom->slot_size; + first_sf = subframes_rendered; + last_sf = first_sf; + + while ( slots_to_render > 0 ) + { + slots_to_render -= hSpatParamRendCom->subframe_nbslots[last_sf]; + last_sf++; + } + + for ( obj = 0; obj < num_objects; obj++ ) + { + /* Delay the signal to match CLDFB delay. Delay the whole buffer with the first rendering call of the stretched buffer. */ + if ( slots_rendered == 0 ) + { + int16_t tcBufferSize; + + tcBufferSize = hSpatParamRendCom->num_slots * hSpatParamRendCom->slot_size; + delay_signal( input_f[obj], tcBufferSize, st_ivas->hMasaIsmData->delayBuffer[obj], st_ivas->hMasaIsmData->delayBuffer_size ); + } + + offsetSamples = 0; + + for ( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ ) + { + n_samples_sf = hSpatParamRendCom->subframe_nbslots[subframe_idx] * hSpatParamRendCom->slot_size; + if ( n_samples_sf != hRendererData->interpolator_length ) + { + for ( k = 0; k < n_samples_sf; k++ ) + { + hRendererData->interpolator[k] = (float) k / ( (float) n_samples_sf ); + } + hRendererData->interpolator_length = n_samples_sf; + } + + md_idx = hSpatParamRendCom->render_to_md_map[subframe_idx]; + + if ( single_separated ) + { + azimuth = st_ivas->hMasaIsmData->azimuth_separated_ism[md_idx]; + elevation = st_ivas->hMasaIsmData->elevation_separated_ism[md_idx]; + } + else + { + azimuth = st_ivas->hMasaIsmData->azimuth_ism[obj][md_idx]; + elevation = st_ivas->hMasaIsmData->elevation_ism[obj][md_idx]; + } + + if ( st_ivas->hOutSetup.is_planar_setup ) + { + /* If no elevation support in output format, then rendering should be done with zero elevation */ + elevation = 0; + } + + if ( hVBAPdata != NULL ) + { + vbap_determine_gains( hVBAPdata, gains, azimuth, elevation, 1 ); + } + else + { + ivas_dirac_dec_get_response( azimuth, elevation, gains, hDirACRend->hOutSetup.ambisonics_order ); + } + + for ( j = 0; j < nchan_out_woLFE; j++ ) + { + if ( hDirACRend->hOutSetup.num_lfe > 0 ) + { + j2 = j + ( j >= lfe_index ); + } + else + { + j2 = j; + } + + if ( fabsf( gains[j] ) > 0.0f || fabsf( hRendererData->prev_gains[obj][j] ) > 0.0f ) + { + for ( k = 0; k < n_samples_sf; k++ ) + { + g1 = hRendererData->interpolator[k]; + g2 = 1.0f - g1; + output_f_local[j2][k + offsetSamples] += ( g1 * gains[j] + g2 * hRendererData->prev_gains[obj][j] ) * input_f[obj][k + offsetSamples]; + } + } + hRendererData->prev_gains[obj][j] = gains[j]; + } + + offsetSamples += n_samples_sf; + } + } + + return; +} diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..88f6e04686f07bf9fcb404f03ad73ce7fee39158 --- /dev/null +++ b/lib_dec/ivas_jbm_dec.c @@ -0,0 +1,2693 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "cnst.h" +#include "ivas_cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_prot_rend.h" +#include "ivas_rom_com.h" +#include +#include "wmc_auto.h" + + +/*-----------------------------------------------------------------------* + * Local function prototypes + *-----------------------------------------------------------------------*/ + +static void ivas_jbm_dec_copy_tc( Decoder_Struct *st_ivas, const int16_t nSamplesForRendering, int16_t *nSamplesResidual, float *data, float *tc_digest_f[] ); + +static void ivas_jbm_dec_tc_buffer_playout( Decoder_Struct *st_ivas, const uint16_t nSamplesAsked, uint16_t *nSamplesRendered, float *output[] ); + +static void ivas_jbm_dec_copy_masa_meta_to_buffer( Decoder_Struct *st_ivas ); + +static void ivas_jbm_masa_sf_to_slot_map( Decoder_Struct *st_ivas, const int16_t nCldfbTs ); + + +/*--------------------------------------------------------------------------* + * ivas_jbm_dec_tc() + * + * Principal IVAS JBM decoder routine, decoding of metadata and transport channels + *--------------------------------------------------------------------------*/ + +ivas_error ivas_jbm_dec_tc( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float *data /* o : transport channel signals */ +) +{ + int16_t n, output_frame, nchan_out; + Decoder_State *st; /* used for bitstream handling */ + float *p_output[MAX_TRANSPORT_CHANNELS]; /* 'float' buffer for output synthesis */ + float output_f[MAX_TRANSPORT_CHANNELS][L_FRAME48k]; /* TODO: can be allocated dynamically using st_ivas->p_output_f */ + int16_t nchan_remapped; + int16_t nb_bits_metadata[MAX_SCE + 1]; + int32_t output_Fs, ivas_total_brate; + AUDIO_CONFIG output_config; + ivas_error error; + int16_t num_md_sub_frames; + int32_t ism_total_brate; + + push_wmops( "ivas_jbm_dec_tc" ); + + /*----------------------------------------------------------------* + * Initialization of local vars after struct has been set + *----------------------------------------------------------------*/ + + output_Fs = st_ivas->hDecoderConfig->output_Fs; + nchan_out = st_ivas->hTcBuffer->nchan_transport_jbm; + output_config = st_ivas->hDecoderConfig->output_config; + ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; + + output_frame = (int16_t) ( output_Fs / FRAMES_PER_SEC ); + + for ( n = 0; n < MAX_TRANSPORT_CHANNELS; n++ ) + { + p_output[n] = output_f[n]; + } + + /*----------------------------------------------------------------* + * Decoding + pre-rendering + *----------------------------------------------------------------*/ + + if ( st_ivas->bfi && st_ivas->ini_frame == 0 ) + { + /* zero output when first frame(s) is lost */ + for ( n = 0; n < nchan_out; n++ ) + { + set_f( p_output[n], 0.0f, output_frame ); + } + + } + else if ( st_ivas->ivas_format == STEREO_FORMAT ) + { + st_ivas->hCPE[0]->element_brate = ivas_total_brate; + if ( ( error = ivas_cpe_dec( st_ivas, 0, p_output, output_frame, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* HP filtering */ + for ( n = 0; n < min( nchan_out, st_ivas->nchan_transport ); n++ ) + { + hp20( p_output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs ); + } + + if ( st_ivas->renderer_type == RENDERER_MC && st_ivas->hDecoderConfig->nchan_out == 1 ) + { + ivas_ls_setup_conversion( st_ivas, st_ivas->nchan_transport, output_frame, p_output, p_output ); + } + } + else if ( st_ivas->ivas_format == ISM_FORMAT ) + { + /* Metadata decoding and configuration */ + if ( ivas_total_brate == IVAS_SID_5k2 || ivas_total_brate == FRAME_NO_DATA ) + { + if ( ( error = ivas_ism_dtx_dec( st_ivas, nb_bits_metadata ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* decode dominant object first so the noise energy of the other objects can be limited */ + if ( ( error = ivas_sce_dec( st_ivas, st_ivas->hISMDTX.sce_id_dtx, &p_output[st_ivas->hISMDTX.sce_id_dtx], output_frame, nb_bits_metadata[st_ivas->hISMDTX.sce_id_dtx] ) ) != IVAS_ERR_OK ) + { + return error; + } + + ivas_ism_dtx_limit_noise_energy_for_near_silence( st_ivas->hSCE, st_ivas->hISMDTX.sce_id_dtx, st_ivas->nchan_transport ); + } + else if ( st_ivas->ism_mode == ISM_MODE_PARAM ) + { + if ( ( error = ivas_ism_metadata_dec( ivas_total_brate, st_ivas->nchan_ism, &( st_ivas->nchan_transport ), st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->bfi, nb_bits_metadata, st_ivas->ism_mode, st_ivas->hISMDTX, st_ivas->hParamIsmDec->hParamIsm, &st_ivas->ism_extmeta_active, &st_ivas->ism_extmeta_cnt, st_ivas->hSCE[0]->hCoreCoder[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else /* ISM_MODE_DISC */ + { + if ( ( error = ivas_ism_metadata_dec( ivas_total_brate, st_ivas->nchan_ism, &( st_ivas->nchan_transport ), st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->bfi, nb_bits_metadata, st_ivas->ism_mode, st_ivas->hISMDTX, NULL, &st_ivas->ism_extmeta_active, &st_ivas->ism_extmeta_cnt, st_ivas->hSCE[0]->hCoreCoder[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + for ( n = 0; n < st_ivas->nchan_transport; n++ ) + { + /* for DTX frames, dominant object has already been decoded before */ + if ( !( ( ivas_total_brate == IVAS_SID_5k2 || ivas_total_brate == FRAME_NO_DATA ) && n == st_ivas->hISMDTX.sce_id_dtx ) ) + { + if ( ( error = ivas_sce_dec( st_ivas, n, &p_output[n], output_frame, nb_bits_metadata[n] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* HP filtering */ + hp20( p_output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs ); + } + + if ( st_ivas->renderer_type == RENDERER_MONO_DOWNMIX ) + { + ivas_mono_downmix_render_passive( st_ivas, p_output, output_frame ); + } + else if ( st_ivas->ism_mode == ISM_MODE_PARAM && ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) ) + { + /* loudness correction */ + ivas_dirac_dec_binaural_sba_gain( p_output, st_ivas->nchan_transport, output_frame ); + } + } + else if ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == MASA_FORMAT ) + { + set_s( nb_bits_metadata, 0, MAX_SCE ); + + /* read parameters from the bitstream */ + if ( st_ivas->ivas_format == MASA_FORMAT && st_ivas->hQMetaData != NULL ) + { + st = ( st_ivas->nSCE > 0 ) ? st_ivas->hSCE[0]->hCoreCoder[0] : st_ivas->hCPE[0]->hCoreCoder[0]; + + if ( ( error = ivas_masa_decode( st_ivas, st, &nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) + { + ivas_jbm_dec_copy_masa_meta_to_buffer( st_ivas ); + } + } + else if ( st_ivas->ivas_format == SBA_FORMAT ) + { + if ( ( error = ivas_spar_dec( st_ivas, nb_bits_metadata ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( st_ivas->nchan_transport == CPE_CHANNELS && st_ivas->nCPE >= 1 ) + { + st_ivas->hCPE[0]->element_brate = ivas_total_brate; + } + + /* core-decoding of transport channels */ + if ( st_ivas->nSCE == 1 ) + { + if ( ( error = ivas_sce_dec( st_ivas, 0, p_output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->nCPE == 1 ) + { + if ( ( error = ivas_cpe_dec( st_ivas, 0, p_output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->nCPE > 1 ) + { + if ( ( error = ivas_mct_dec( st_ivas, p_output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* TCs remapping */ + nchan_remapped = st_ivas->nchan_transport; + if ( st_ivas->sba_dirac_stereo_flag ) + { + nchan_remapped = nchan_out; + + if ( st_ivas->ivas_format == SBA_FORMAT ) + { + ivas_agc_dec_process( st_ivas->hSpar->hAgcDec, p_output, p_output, st_ivas->hSpar->hMdDec->spar_md_cfg.nchan_transport, output_frame ); + + if ( st_ivas->hSpar->hPCA != NULL ) + { + ivas_pca_dec( st_ivas->hSpar->hPCA, output_frame, st_ivas->hSpar->hMdDec->spar_md_cfg.nchan_transport, ivas_total_brate, st_ivas->hDecoderConfig->last_ivas_total_brate, st_ivas->bfi, p_output ); + } + + ivas_spar_dec_gen_umx_mat( st_ivas->hSpar->hMdDec, st_ivas->nchan_transport, IVAS_MAX_NUM_BANDS, st_ivas->bfi, ivas_get_spar_dec_md_num_subframes( st_ivas->sba_order, ivas_total_brate, st_ivas->last_active_ivas_total_brate ) ); + } + + ivas_sba_dirac_stereo_dec( st_ivas, p_output, output_frame, st_ivas->ivas_format == MC_FORMAT ); + } + else if ( st_ivas->ivas_format == MASA_FORMAT && ivas_total_brate < MASA_STEREO_MIN_BITRATE && ( ivas_total_brate > IVAS_SID_5k2 || ( ivas_total_brate <= IVAS_SID_5k2 && st_ivas->nCPE > 0 && st_ivas->hCPE[0]->nchan_out == 1 ) ) ) + { + nchan_remapped = 1; /* Only one channel transported */ + } + + /* HP filtering */ + for ( n = 0; n < nchan_remapped; n++ ) + { + hp20( p_output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs ); + } + + if ( st_ivas->ivas_format == SBA_FORMAT ) + { + nchan_remapped = ivas_sba_remapTCs( p_output, st_ivas, output_frame ); + + if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) + { + num_md_sub_frames = ivas_get_spar_dec_md_num_subframes( st_ivas->sba_analysis_order, ivas_total_brate, st_ivas->last_active_ivas_total_brate ); + ivas_sba_mix_matrix_determiner( st_ivas->hSpar, p_output, st_ivas->bfi, nchan_remapped, output_frame, num_md_sub_frames ); + } + else if ( st_ivas->renderer_type != RENDERER_DISABLE ) + { + ivas_spar_dec_agc_pca( st_ivas, p_output, output_frame ); + } + } + + if ( st_ivas->ivas_format == MASA_FORMAT ) + { + ivas_masa_prerender( st_ivas, p_output, output_frame, nchan_remapped ); + } + else if ( st_ivas->ivas_format == SBA_FORMAT && ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) + { + /* loudness correction */ + ivas_dirac_dec_binaural_sba_gain( p_output, nchan_remapped, output_frame ); + } + } + else if ( st_ivas->ivas_format == MASA_ISM_FORMAT ) + { + int16_t nchan_ism, nchan_transport_ism; + int16_t dirac_bs_md_write_idx; + + set_s( nb_bits_metadata, 0, MAX_SCE + 1 ); + + /* Set the number of objects for the parametric rendering */ + dirac_bs_md_write_idx = 0; + if ( st_ivas->hSpatParamRendCom != NULL ) + { + st_ivas->hSpatParamRendCom->numIsmDirections = 0; + if ( st_ivas->ism_mode != ISM_MASA_MODE_DISC && st_ivas->ism_mode != ISM_MASA_MODE_MASA_ONE_OBJ ) + { + st_ivas->hSpatParamRendCom->numIsmDirections = st_ivas->nchan_ism; + } + + dirac_bs_md_write_idx = st_ivas->hSpatParamRendCom->dirac_bs_md_write_idx; /* Store the write-index for this frame */ + } + + /* MASA metadata decoding */ + if ( ( error = ivas_masa_decode( st_ivas, st_ivas->hCPE[0]->hCoreCoder[0], &nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Configuration of combined-format bit-budget distribution */ + ivas_set_surplus_brate_dec( st_ivas, &ism_total_brate ); + + st_ivas->hCPE[0]->hCoreCoder[0]->bit_stream = &( st_ivas->bit_stream[( ism_total_brate / FRAMES_PER_SEC )] ); + + /* set ISM parameters and decode ISM metadata in OMASA format */ + if ( ( error = ivas_omasa_ism_metadata_dec( st_ivas, ism_total_brate, &nchan_ism, &nchan_transport_ism, dirac_bs_md_write_idx, &nb_bits_metadata[1] ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* decode ISM channels */ + for ( n = 0; n < nchan_transport_ism; n++ ) + { + if ( ( error = ivas_sce_dec( st_ivas, n, &p_output[st_ivas->nchan_transport + n], output_frame, nb_bits_metadata[1] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* decode MASA channels */ + if ( ( error = ivas_cpe_dec( st_ivas, 0, p_output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( st_ivas->hCPE[0]->nchan_out == 1 ) + { + mvr2r( p_output[0], p_output[1], output_frame ); /* Copy mono signal to stereo output channels */ + } + + /* HP filtering */ + for ( n = 0; n < getNumChanSynthesis( st_ivas ); n++ ) + { + hp20( p_output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs ); + } + + if ( st_ivas->renderer_type == RENDERER_MONO_DOWNMIX ) + { + ivas_mono_downmix_render_passive( st_ivas, p_output, output_frame ); + } + else if ( output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) + { + /* sanity check in case of bitrate switching */ + if ( st_ivas->ism_mode != ISM_MASA_MODE_DISC ) + { + return IVAS_ERROR( IVAS_ERR_INVALID_OUTPUT_FORMAT, "Incorrect output configuration specified for combined MASA and ISM format" ); + } + + ivas_omasa_rearrange_channels( p_output, nchan_transport_ism, output_frame ); + + ivas_jbm_dec_copy_masa_meta_to_buffer( st_ivas ); + } + } + else if ( st_ivas->ivas_format == SBA_ISM_FORMAT ) + { + int16_t nchan_ism, sba_ch_idx; + + set_s( nb_bits_metadata, 0, MAX_SCE + 1 ); + nchan_ism = st_ivas->nchan_ism; + if ( st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + { + /* set ISM parameters and decode ISM metadata in OSBA format */ + if ( ( error = ivas_osba_ism_metadata_dec( st_ivas, ivas_total_brate, &nchan_ism, &nb_bits_metadata[1] ) ) != IVAS_ERR_OK ) + { + return error; + } + sba_ch_idx = st_ivas->nchan_ism; + } + else + { + nb_bits_metadata[1] += NO_BITS_MASA_ISM_NO_OBJ; + sba_ch_idx = 0; + } + + /* SBA metadata decoding */ + if ( ( error = ivas_spar_dec( st_ivas, nb_bits_metadata ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( st_ivas->nchan_transport == CPE_CHANNELS && st_ivas->nCPE >= 1 ) + { + st_ivas->hCPE[0]->element_brate = ivas_total_brate; + } + + /* core-decoding of transport channels */ + if ( st_ivas->nSCE == 1 ) + { + if ( ( error = ivas_sce_dec( st_ivas, 0, p_output, output_frame, nb_bits_metadata[0] + nb_bits_metadata[1] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->nCPE == 1 ) + { + if ( ( error = ivas_cpe_dec( st_ivas, 0, p_output, output_frame, nb_bits_metadata[0] + nb_bits_metadata[1] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->nCPE > 1 ) + { + if ( ( error = ivas_mct_dec( st_ivas, p_output, output_frame, nb_bits_metadata[0] + nb_bits_metadata[1] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( st_ivas->sba_dirac_stereo_flag ) + { + ivas_agc_dec_process( st_ivas->hSpar->hAgcDec, &p_output[sba_ch_idx], &p_output[sba_ch_idx], st_ivas->hSpar->hMdDec->spar_md_cfg.nchan_transport, output_frame ); + + if ( st_ivas->hSpar->hPCA != NULL ) + { + ivas_pca_dec( st_ivas->hSpar->hPCA, output_frame, st_ivas->hSpar->hMdDec->spar_md_cfg.nchan_transport, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->hDecoderConfig->last_ivas_total_brate, st_ivas->bfi, &p_output[sba_ch_idx] ); + } + + ivas_spar_dec_gen_umx_mat( st_ivas->hSpar->hMdDec, st_ivas->nchan_transport, IVAS_MAX_NUM_BANDS, st_ivas->bfi, ivas_get_spar_dec_md_num_subframes( st_ivas->sba_order, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->last_active_ivas_total_brate ) ); + + ivas_sba_dirac_stereo_dec( st_ivas, &p_output[sba_ch_idx], output_frame, 0 ); + } + + /* HP filtering */ + for ( n = 0; n < getNumChanSynthesis( st_ivas ); n++ ) + { + hp20( p_output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs ); + } + + nchan_remapped = ivas_sba_remapTCs( &p_output[sba_ch_idx], st_ivas, output_frame ); + + if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) + { + num_md_sub_frames = ivas_get_spar_dec_md_num_subframes( st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->last_active_ivas_total_brate ); + + ivas_sba_mix_matrix_determiner( st_ivas->hSpar, &p_output[sba_ch_idx], st_ivas->bfi, nchan_remapped, output_frame, num_md_sub_frames ); + } + else if ( st_ivas->renderer_type != RENDERER_DISABLE && !st_ivas->sba_dirac_stereo_flag ) + { + ivas_spar_dec_agc_pca( st_ivas, &p_output[sba_ch_idx], output_frame ); + } + + if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) + { + /* loudness correction */ + ivas_dirac_dec_binaural_sba_gain( &p_output[sba_ch_idx], nchan_remapped, output_frame ); + } + else if ( st_ivas->renderer_type == RENDERER_MONO_DOWNMIX && st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + { + ivas_mono_downmix_render_passive( st_ivas, p_output, output_frame ); + + /* add W */ + for ( n = 0; n < nchan_out; n++ ) + { + v_add( p_output[n], p_output[n + max( nchan_out, nchan_ism )], p_output[n], output_frame ); + } + } + } + else if ( st_ivas->ivas_format == MC_FORMAT ) + { + st = ( st_ivas->nSCE > 0 ) ? st_ivas->hSCE[0]->hCoreCoder[0] : st_ivas->hCPE[0]->hCoreCoder[0]; + + if ( st_ivas->mc_mode == MC_MODE_MCT ) + { + /* LFE channel decoder */ + ivas_lfe_dec( st_ivas->hLFE, st, output_frame, st_ivas->bfi, p_output[LFE_CHANNEL] ); + + if ( ( error = ivas_mct_dec( st_ivas, p_output, output_frame, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* HP filtering */ + for ( n = 0; n < st_ivas->nchan_transport; n++ ) + { + if ( n != LFE_CHANNEL ) + { + hp20( p_output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs ); + } + } + + if ( st_ivas->transport_config != st_ivas->intern_config && ( st_ivas->intern_config == IVAS_AUDIO_CONFIG_FOA || st_ivas->intern_config == IVAS_AUDIO_CONFIG_HOA2 || st_ivas->intern_config == IVAS_AUDIO_CONFIG_HOA3 ) ) + { + if ( ( st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe ) >= ( st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe ) ) + { + ivas_mc2sba( st_ivas->hTransSetup, p_output, p_output, output_frame, st_ivas->hIntSetup.ambisonics_order, GAIN_LFE ); + } + } + + if ( ( st_ivas->renderer_type == RENDERER_MC || st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) && ( st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe ) >= ( st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe ) ) + { + if ( st_ivas->renderer_type == RENDERER_MC ) + { + ivas_ls_setup_conversion( st_ivas, st_ivas->nchan_transport, output_frame, p_output, p_output ); + } + else if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) + { + ivas_mc2sba( st_ivas->hIntSetup, p_output, p_output, output_frame, st_ivas->hOutSetup.ambisonics_order, 0.f ); + } + } + } + else if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) + { + /* LFE channel decoder */ + ivas_lfe_dec( st_ivas->hLFE, st, output_frame, st_ivas->bfi, p_output[LFE_CHANNEL] ); + + ivas_mc_paramupmix_dec_read_BS( st_ivas, st, st_ivas->hMCParamUpmix, &nb_bits_metadata[0] ); + + if ( ( error = ivas_mct_dec( st_ivas, p_output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* HP filtering */ + for ( n = 0; n < st_ivas->nchan_transport; n++ ) + { + if ( n != LFE_CHANNEL ) + { + hp20( p_output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs ); + } + } + + /* Rendering */ + if ( st_ivas->renderer_type == RENDERER_MC && ( output_config == IVAS_AUDIO_CONFIG_MONO || output_config == IVAS_AUDIO_CONFIG_STEREO ) ) + { + /* Compensate loudness for not doing full upmix */ + for ( n = 4; n < 8; n++ ) + { + v_multc( p_output[n], 2.0f, p_output[n], output_frame ); + } + + if ( output_config == IVAS_AUDIO_CONFIG_MONO || output_config == IVAS_AUDIO_CONFIG_STEREO ) + { + ivas_ls_setup_conversion( st_ivas, audioCfg2channels( IVAS_AUDIO_CONFIG_5_1_2 ), output_frame, p_output, p_output ); + } + } + } + else if ( st_ivas->mc_mode == MC_MODE_PARAMMC ) + { + /* read Parametric MC parameters from the bitstream */ + ivas_param_mc_dec_read_BS( ivas_total_brate, st, st_ivas->hParamMC, &nb_bits_metadata[0] ); + + if ( st_ivas->nCPE == 1 ) + { + if ( ( error = ivas_cpe_dec( st_ivas, 0, p_output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->nCPE > 1 ) + { + if ( ( error = ivas_mct_dec( st_ivas, p_output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* HP filtering */ + for ( n = 0; n < st_ivas->nchan_transport; n++ ) + { + hp20( p_output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs ); + } + + /* Rendering */ + if ( output_config == IVAS_AUDIO_CONFIG_MONO || output_config == IVAS_AUDIO_CONFIG_STEREO ) + { + ivas_ls_setup_conversion( st_ivas, st_ivas->nchan_transport, output_frame, p_output, p_output ); + } + } + else if ( st_ivas->mc_mode == MC_MODE_MCMASA ) + { + if ( st_ivas->hOutSetup.separateChannelEnabled ) + { + st = st_ivas->hCPE[0]->hCoreCoder[0]; /* Metadata is always with CPE in the case of separated channel */ + } + + /* read McMASA parameters from the bitstream */ + if ( ( error = ivas_masa_decode( st_ivas, st, &nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( st_ivas->hOutSetup.separateChannelEnabled ) + { + /* Decode the transport audio signals */ + if ( ( error = ivas_cpe_dec( st_ivas, 0, p_output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Identify the index of the separated channel, always LFE_CHANNEL-1 here */ + n = LFE_CHANNEL - 1; + + /* Decode the separated channel to output[n] to be combined with the synthesized channels */ + if ( ( error = ivas_sce_dec( st_ivas, 0, &p_output[n], output_frame, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Delay the separated channel to sync with CLDFB delay of the DirAC synthesis, and synthesize the LFE signal. */ + if ( output_config == IVAS_AUDIO_CONFIG_5_1 || output_config == IVAS_AUDIO_CONFIG_7_1 || + output_config == IVAS_AUDIO_CONFIG_5_1_4 || output_config == IVAS_AUDIO_CONFIG_7_1_4 || + output_config == IVAS_AUDIO_CONFIG_5_1_2 || ( output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM && st_ivas->hOutSetup.num_lfe > 0 ) ) + { + ivas_lfe_synth_with_filters( st_ivas->hMasa->hMasaLfeSynth, p_output, output_frame, n, LFE_CHANNEL ); + } + else if ( output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM && st_ivas->hOutSetup.num_lfe == 0 ) + { + /* Delay the separated channel to sync with the DirAC rendering */ + delay_signal( p_output[n], output_frame, st_ivas->hMasa->hMasaLfeSynth->delayBuffer_syncDirAC, st_ivas->hMasa->hMasaLfeSynth->delayBuffer_syncDirAC_size ); + } + } + else + { + if ( st_ivas->nSCE == 1 ) + { + if ( ( error = ivas_sce_dec( st_ivas, 0, p_output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->nCPE == 1 ) + { + if ( ( error = ivas_cpe_dec( st_ivas, 0, p_output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + + if ( st_ivas->sba_dirac_stereo_flag ) /* use the flag to trigger the DFT upmix */ + { + ivas_sba_dirac_stereo_dec( st_ivas, p_output, output_frame, 1 ); + } + + /* HP filtering */ + for ( n = 0; n < getNumChanSynthesis( st_ivas ); n++ ) + { + hp20( p_output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs ); + } + + if ( st_ivas->renderer_type == RENDERER_MCMASA_MONO_STEREO ) + { + ivas_mono_stereo_downmix_mcmasa( st_ivas, p_output, output_frame ); + } + } + } + + /*----------------------------------------------------------------* + * Write IVAS transport channels + *----------------------------------------------------------------*/ + + if ( st_ivas->hDecoderConfig->Opt_tsm == 1 || !st_ivas->hDecoderConfig->Opt_5ms ) + { + ivas_syn_output_f( p_output, output_frame, st_ivas->hTcBuffer->nchan_transport_jbm, data ); + } + else + { + /* directly copy to tc buffers */ + ivas_jbm_dec_copy_tc_no_tsm( st_ivas, p_output, output_frame ); + } + + /*----------------------------------------------------------------* + * Common updates + *----------------------------------------------------------------*/ + + if ( !st_ivas->bfi ) /* do not update if first frame(s) are lost or NO_DATA */ + { + st_ivas->hDecoderConfig->last_ivas_total_brate = ivas_total_brate; + st_ivas->last_active_ivas_total_brate = ( ivas_total_brate <= IVAS_SID_5k2 ) ? st_ivas->last_active_ivas_total_brate : ivas_total_brate; + } + + if ( st_ivas->ini_frame < MAX_FRAME_COUNTER && !( st_ivas->bfi && st_ivas->ini_frame == 0 ) ) /* keep "st_ivas->ini_frame = 0" until first good received frame */ + { + st_ivas->ini_frame++; + } + + if ( st_ivas->ini_active_frame < MAX_FRAME_COUNTER && !( st_ivas->bfi && st_ivas->ini_frame == 0 ) && ivas_total_brate > IVAS_SID_5k2 ) /* needed in MASA decoder in case the first active frame is BFI, and there were SID-frames decoded before */ + { + st_ivas->ini_active_frame++; + } + + st_ivas->last_ivas_format = st_ivas->ivas_format; + + + pop_wmops(); + return IVAS_ERR_OK; +} + + +/*--------------------------------------------------------------------------* + * ivas_jbm_dec_feed_tc_to_renderer() + * + * Feed decoded transport channels and metadata to the IVAS JBM renderer routine + *--------------------------------------------------------------------------*/ + +void ivas_jbm_dec_feed_tc_to_renderer( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const int16_t nSamplesForRendering, /* i : number of TC samples available for rendering */ + int16_t *nSamplesResidual, /* o : number of samples not fitting into the renderer grid and buffer for the next call*/ + float *data /* i : transport channels */ +) +{ + float data_f[MAX_CLDFB_DIGEST_CHANNELS][MAX_JBM_L_FRAME48k]; /* 'float' buffer for transport channels that will be directly converted with the CLDFB */ + float *p_data_f[MAX_CLDFB_DIGEST_CHANNELS]; + int16_t n, n_render_timeslots; + + push_wmops( "ivas_jbm_dec_feed_tc_to_rendererer" ); + for ( n = 0; n < MAX_CLDFB_DIGEST_CHANNELS; n++ ) + { + p_data_f[n] = &data_f[n][0]; + } + + if ( st_ivas->hDecoderConfig->Opt_tsm || !st_ivas->hDecoderConfig->Opt_5ms ) + { + ivas_jbm_dec_copy_tc( st_ivas, nSamplesForRendering, nSamplesResidual, data, p_data_f ); + } + else + { + *nSamplesResidual = 0; + } + n_render_timeslots = st_ivas->hTcBuffer->n_samples_available / st_ivas->hTcBuffer->n_samples_granularity; + + if ( st_ivas->hTcBuffer->tc_buffer_mode == TC_BUFFER_MODE_BUFFER ) + { + ivas_jbm_dec_td_renderers_adapt_subframes( st_ivas ); + + if ( ( st_ivas->ivas_format == MASA_FORMAT || st_ivas->ivas_format == MASA_ISM_FORMAT ) && st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) + { + ivas_jbm_masa_sf_to_slot_map( st_ivas, n_render_timeslots ); + } + } + else if ( st_ivas->ivas_format == STEREO_FORMAT ) + { + ivas_jbm_dec_td_renderers_adapt_subframes( st_ivas ); + } + else if ( st_ivas->ivas_format == ISM_FORMAT ) + { + /* Rendering */ + if ( st_ivas->ism_mode == ISM_MODE_PARAM ) + { + if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) + { + ivas_dirac_dec_set_md_map( st_ivas, n_render_timeslots ); + + ivas_param_ism_params_to_masa_param_mapping( st_ivas ); + } + else if ( st_ivas->renderer_type == RENDERER_PARAM_ISM || st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) + { + ivas_param_ism_dec_digest_tc( st_ivas, n_render_timeslots, p_data_f ); + } + } + else /* ISM_MODE_DISC */ + { + ivas_ism_dec_digest_tc( st_ivas ); + } + } + else if ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == MASA_FORMAT ) + { + ivas_sba_dec_digest_tc( st_ivas, n_render_timeslots, st_ivas->hTcBuffer->n_samples_available ); + } + else if ( st_ivas->ivas_format == SBA_ISM_FORMAT ) + { + + if ( st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + { + ivas_ism_dec_digest_tc( st_ivas ); + + /* delay the objects here for all renderers where it is needed */ + if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || + st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM || + st_ivas->renderer_type == RENDERER_OSBA_AMBI || + st_ivas->renderer_type == RENDERER_OSBA_LS || + st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) + { + for ( n = 0; n < st_ivas->nchan_ism; n++ ) + { + delay_signal( st_ivas->hTcBuffer->tc[n], st_ivas->hTcBuffer->n_samples_available, st_ivas->hSbaIsmData->delayBuffer[n], st_ivas->hSbaIsmData->delayBuffer_size ); + } + } + + if ( !st_ivas->sba_dirac_stereo_flag ) + { + if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV ) + { + n_render_timeslots *= ( st_ivas->hTcBuffer->n_samples_granularity / st_ivas->hSpatParamRendCom->slot_size ); + } + + ivas_sba_dec_digest_tc( st_ivas, n_render_timeslots, st_ivas->hTcBuffer->n_samples_available ); + } + } + else + { + ivas_sba_dec_digest_tc( st_ivas, n_render_timeslots, st_ivas->hTcBuffer->n_samples_available ); + } + } + else if ( st_ivas->ivas_format == MASA_ISM_FORMAT ) + { + if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC && st_ivas->ism_mode == ISM_MASA_MODE_DISC ) + { + n_render_timeslots *= ( st_ivas->hTcBuffer->n_samples_granularity / st_ivas->hSpatParamRendCom->slot_size ); + } + + ivas_sba_dec_digest_tc( st_ivas, n_render_timeslots, st_ivas->hTcBuffer->n_samples_available ); + + if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC ) + { + ivas_ism_dec_digest_tc( st_ivas ); + } + } + else if ( st_ivas->ivas_format == MC_FORMAT ) + { + if ( st_ivas->mc_mode == MC_MODE_MCT ) + { + ivas_jbm_dec_td_renderers_adapt_subframes( st_ivas ); + } + else if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) + { + ivas_mc_paramupmix_dec_digest_tc( st_ivas, (uint8_t) n_render_timeslots, st_ivas->hTcBuffer->n_samples_available ); + } + else if ( st_ivas->mc_mode == MC_MODE_PARAMMC ) + { + ivas_param_mc_dec_digest_tc( st_ivas, (uint8_t) n_render_timeslots, p_data_f ); + } + else if ( st_ivas->mc_mode == MC_MODE_MCMASA ) + { + ivas_sba_dec_digest_tc( st_ivas, n_render_timeslots, st_ivas->hTcBuffer->n_samples_available ); + } + } + + pop_wmops(); + return; +} + + +/*--------------------------------------------------------------------------* + * ivas_dec_render() + * + * Principal IVAS JBM rendering routine + *--------------------------------------------------------------------------*/ + +ivas_error ivas_jbm_dec_render( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const uint16_t nSamplesAsked, /* i : number of samples wanted */ + uint16_t *nSamplesRendered, /* o : number of samples rendered */ + uint16_t *nSamplesAvailableNext, /* o : number of samples still available in the rendering pipeline */ + int16_t *data /* o : output synthesis signal */ +) +{ + int16_t n, nchan_out; + int16_t nchan_transport; + float output[MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS][L_FRAME48k]; /* 'float' buffer for output synthesis */ + int16_t nchan_remapped; + int32_t output_Fs; + AUDIO_CONFIG output_config; + int16_t nSamplesAskedLocal; + ivas_error error; + float *p_output[MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS]; + float *p_tc[MAX_TRANSPORT_CHANNELS + MAX_NUM_OBJECTS]; + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom; + + push_wmops( "ivas_dec_render" ); + /*----------------------------------------------------------------* + * Initialization of local vars after struct has been set + *----------------------------------------------------------------*/ + + hSpatParamRendCom = st_ivas->hSpatParamRendCom; + output_Fs = st_ivas->hDecoderConfig->output_Fs; + nchan_out = st_ivas->hDecoderConfig->nchan_out; + nchan_transport = st_ivas->hTcBuffer->nchan_transport_jbm; + output_config = st_ivas->hDecoderConfig->output_config; + nSamplesAskedLocal = nSamplesAsked + st_ivas->hTcBuffer->n_samples_discard; + + for ( n = 0; n < MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS; n++ ) + { + p_output[n] = &output[n][0]; + } + + for ( n = 0; n < st_ivas->hTcBuffer->nchan_buffer_full; n++ ) + { + p_tc[n] = &st_ivas->hTcBuffer->tc[n][st_ivas->hTcBuffer->n_samples_rendered]; + } + + /*----------------------------------------------------------------* + * Combine orientations + *----------------------------------------------------------------*/ + + if ( ( error = combine_external_and_head_orientations_dec( st_ivas->hHeadTrackData, st_ivas->hExtOrientationData, st_ivas->hCombinedOrientationData ) ) != IVAS_ERR_OK ) + { + return error; + } + + /*----------------------------------------------------------------* + * Rendering + *----------------------------------------------------------------*/ + + if ( st_ivas->ivas_format == UNDEFINED_FORMAT ) + { + assert( 0 ); + } + else if ( st_ivas->hTcBuffer->tc_buffer_mode == TC_BUFFER_MODE_BUFFER ) + { + ivas_jbm_dec_tc_buffer_playout( st_ivas, nSamplesAskedLocal, nSamplesRendered, p_output ); + } + else if ( st_ivas->ivas_format == STEREO_FORMAT ) + { + /* Rendering */ + if ( st_ivas->renderer_type == RENDERER_MC ) + { + *nSamplesRendered = min( st_ivas->hTcBuffer->n_samples_available, nSamplesAskedLocal ); + ivas_ls_setup_conversion( st_ivas, st_ivas->nchan_transport, *nSamplesRendered, p_tc, p_output ); + } + } + else if ( st_ivas->ivas_format == ISM_FORMAT ) + { + /* Rendering */ + if ( st_ivas->ism_mode == ISM_MODE_PARAM ) + { + if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) + { + ivas_dirac_dec_binaural_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, st_ivas->nchan_transport, p_output ); + } + else if ( st_ivas->renderer_type == RENDERER_NON_DIEGETIC_DOWNMIX ) + { + *nSamplesRendered = min( st_ivas->hTcBuffer->n_samples_available, nSamplesAskedLocal ); + ivas_apply_non_diegetic_panning( p_output, st_ivas->hDecoderConfig->non_diegetic_pan_gain, *nSamplesRendered ); + } + else if ( st_ivas->renderer_type == RENDERER_PARAM_ISM || st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) + { + ivas_param_ism_dec_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output ); + + if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) + { + /* Convert CICP19 -> Ambisonics */ + ivas_mc2sba( st_ivas->hIntSetup, p_output, p_output, *nSamplesRendered, st_ivas->hOutSetup.ambisonics_order, 0.f ); + } + } + } + else /* ISM_MODE_DISC */ + { + *nSamplesRendered = min( st_ivas->hTcBuffer->n_samples_available, nSamplesAskedLocal ); + + /* Loudspeaker or Ambisonics rendering */ + if ( st_ivas->renderer_type == RENDERER_TD_PANNING || st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) + { + /* Convert to CICPxx; used also for ISM->CICP19->binaural_room rendering */ + ivas_ism_render_sf( st_ivas, p_output, *nSamplesRendered ); + } + else if ( st_ivas->renderer_type == RENDERER_NON_DIEGETIC_DOWNMIX ) + { + ivas_apply_non_diegetic_panning( p_output, st_ivas->hDecoderConfig->non_diegetic_pan_gain, *nSamplesRendered ); + } + else if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV ) + { + /* Convert to Ambisonics; used also for ISM->HOA3->binaural rendering */ + ivas_ism2sba_sf( st_ivas->hTcBuffer->tc, p_output, st_ivas->hIsmRendererData, st_ivas->nchan_transport, *nSamplesRendered, st_ivas->hTcBuffer->n_samples_rendered, st_ivas->hIntSetup.ambisonics_order ); + } + + /* Binaural rendering */ + if ( st_ivas->renderer_type == RENDERER_BINAURAL_OBJECTS_TD ) + { + if ( ( ivas_td_binaural_renderer_sf( st_ivas, p_output, *nSamplesRendered ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) + { + if ( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, IVAS_AUDIO_CONFIG_7_1_4, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR, st_ivas->hDecoderConfig, NULL, NULL, NULL, st_ivas->hTcBuffer, p_output, p_output, *nSamplesRendered, output_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } + + ivas_binaural_add_LFE( st_ivas, *nSamplesRendered, p_output, p_output ); + } + } + } + else if ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == MASA_FORMAT ) + { + nchan_remapped = nchan_transport; + + /* Loudspeakers, Ambisonics or Binaural rendering */ + if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) + { + ivas_dirac_dec_binaural_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, nchan_remapped, p_output ); + } + else if ( st_ivas->ivas_format == MASA_FORMAT ) + { + if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_DEC ) + { + *nSamplesRendered = min( st_ivas->hTcBuffer->n_samples_available, nSamplesAskedLocal ); + for ( n = 0; n < nchan_remapped; n++ ) + { + mvr2r( st_ivas->hTcBuffer->tc[n] + st_ivas->hTcBuffer->n_samples_rendered, p_output[n], *nSamplesRendered ); + } + + if ( ( error = ivas_sba_linear_renderer( p_output, *nSamplesRendered, nchan_remapped, 0, output_config, st_ivas->hOutSetup ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->renderer_type == RENDERER_DIRAC ) + { + ivas_dirac_dec_render( st_ivas, nchan_remapped, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output ); + } + } + else /* SBA_MODE_SPAR */ + { + if ( ( error = ivas_sba_dec_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + else if ( st_ivas->ivas_format == MASA_ISM_FORMAT ) + { + nchan_remapped = st_ivas->nchan_transport; + + if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) + { + if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC && st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC ) + { + if ( ( error = ivas_omasa_dirac_td_binaural_jbm( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, nchan_remapped, p_output ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + ivas_dirac_dec_binaural_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, nchan_remapped, p_output ); + } + } + else if ( st_ivas->renderer_type == RENDERER_DIRAC ) + { + ivas_omasa_dirac_rend_jbm( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, nchan_remapped, p_output ); + } + } + else if ( st_ivas->ivas_format == SBA_ISM_FORMAT ) + { + nchan_remapped = nchan_transport; + + /* Loudspeakers, Ambisonics or Binaural rendering */ + if ( st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + { + if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV ) + { + if ( ( error = ivas_osba_dirac_td_binaural_jbm( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->renderer_type == RENDERER_OSBA_STEREO ) + { + *nSamplesRendered = min( st_ivas->hTcBuffer->n_samples_available, nSamplesAskedLocal ); + + /* render objects */ + ivas_ism_render_sf( st_ivas, p_output, *nSamplesRendered ); + + /* add already rendererd SBA part */ + for ( n = 0; n < nchan_out; n++ ) + { + v_add( p_output[n], p_tc[n + st_ivas->nchan_ism], p_output[n], *nSamplesRendered ); + } + } + else if ( st_ivas->renderer_type == RENDERER_OSBA_AMBI || st_ivas->renderer_type == RENDERER_OSBA_LS || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) + { + float output_ism[MAX_OUTPUT_CHANNELS][L_FRAME48k]; + float *p_output_ism[MAX_OUTPUT_CHANNELS]; + + for ( n = 0; n < MAX_OUTPUT_CHANNELS; n++ ) + { + p_output_ism[n] = &output_ism[n][0]; + } + + if ( ( error = ivas_sba_dec_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( st_ivas->renderer_type != RENDERER_BINAURAL_FASTCONV_ROOM ) + { + ivas_ism_render_sf( st_ivas, p_output_ism, *nSamplesRendered ); + } + + for ( n = 0; n < nchan_out; n++ ) + { + if ( st_ivas->renderer_type != RENDERER_BINAURAL_FASTCONV_ROOM ) + { + v_add( p_output[n], p_output_ism[n], p_output[n], *nSamplesRendered ); + } + v_multc( p_output[n], 0.5f, p_output[n], *nSamplesRendered ); + } + } + else if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) /*EXT output = individual objects + HOA3*/ + { + if ( ( error = ivas_sba_dec_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, &p_output[st_ivas->nchan_ism] ) ) != IVAS_ERR_OK ) + { + return error; + } + + for ( n = 0; n < st_ivas->nchan_ism; n++ ) + { + mvr2r( st_ivas->hTcBuffer->tc[n] + st_ivas->hTcBuffer->n_samples_rendered, p_output[n], *nSamplesRendered ); + } + } + else + { + if ( ( error = ivas_sba_dec_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + else if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) + { + ivas_dirac_dec_binaural_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, nchan_remapped, p_output ); + } + else /* SBA_MODE_SPAR */ + { + if ( ( error = ivas_sba_dec_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) + { + for ( n = st_ivas->hIntSetup.nchan_out_woLFE - 1; n >= 0; n-- ) + { + mvr2r( output[n], output[n + st_ivas->nchan_ism], *nSamplesRendered ); + } + for ( n = 0; n < st_ivas->nchan_ism; n++ ) + { + set_zero( output[n], *nSamplesRendered ); + } + } + } + } + else if ( st_ivas->ivas_format == MC_FORMAT ) + { + if ( st_ivas->mc_mode == MC_MODE_MCT ) + { + int16_t crendInPlaceRotation = FALSE; + *nSamplesRendered = min( st_ivas->hTcBuffer->n_samples_available, nSamplesAskedLocal ); + if ( st_ivas->transport_config != st_ivas->intern_config && ( st_ivas->intern_config == IVAS_AUDIO_CONFIG_FOA || st_ivas->intern_config == IVAS_AUDIO_CONFIG_HOA2 || st_ivas->intern_config == IVAS_AUDIO_CONFIG_HOA3 ) ) + { + if ( ( st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe ) < ( st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe ) ) + { + crendInPlaceRotation = TRUE; + ivas_mc2sba( st_ivas->hTransSetup, p_tc, p_output, *nSamplesRendered, st_ivas->hIntSetup.ambisonics_order, GAIN_LFE ); + } + } + + /* Rendering */ + if ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV || st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) + { + if ( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, st_ivas->intern_config, st_ivas->hOutSetup.output_config, st_ivas->hDecoderConfig, st_ivas->hCombinedOrientationData, + &st_ivas->hIntSetup, st_ivas->hEFAPdata, st_ivas->hTcBuffer, crendInPlaceRotation ? p_output : p_tc, p_output, *nSamplesRendered, output_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } + + ivas_binaural_add_LFE( st_ivas, *nSamplesRendered, p_tc, p_output ); + } + else if ( st_ivas->renderer_type == RENDERER_MC ) + { + *nSamplesRendered = min( st_ivas->hTcBuffer->n_samples_available, nSamplesAskedLocal ); + ivas_ls_setup_conversion( st_ivas, st_ivas->nchan_transport, *nSamplesRendered, p_tc, p_output ); + } + else if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) + { + ivas_mc2sba( st_ivas->hIntSetup, p_tc, p_output, *nSamplesRendered, st_ivas->hOutSetup.ambisonics_order, 0.f ); + } + else if ( st_ivas->renderer_type == RENDERER_BINAURAL_OBJECTS_TD ) + { + if ( ( ivas_td_binaural_renderer_sf( st_ivas, p_output, *nSamplesRendered ) ) != IVAS_ERR_OK ) + { + return error; + } + + ivas_binaural_add_LFE( st_ivas, *nSamplesRendered, p_tc, p_output ); + } + } + else if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) + { + ivas_mc_paramupmix_dec_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_tc, p_output ); + + if ( st_ivas->transport_config != st_ivas->intern_config && ( st_ivas->intern_config == IVAS_AUDIO_CONFIG_FOA || st_ivas->intern_config == IVAS_AUDIO_CONFIG_HOA2 || st_ivas->intern_config == IVAS_AUDIO_CONFIG_HOA3 ) ) + { + ivas_mc2sba( st_ivas->hTransSetup, p_output, p_output, *nSamplesRendered, st_ivas->hIntSetup.ambisonics_order, GAIN_LFE ); + } + + /* Rendering */ + if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) + { + { + ivas_binaural_add_LFE( st_ivas, *nSamplesRendered, p_output, p_output ); + } + } + else if ( st_ivas->renderer_type == RENDERER_MC ) + { + ivas_ls_setup_conversion( st_ivas, MC_PARAMUPMIX_MAX_INPUT_CHANS, *nSamplesRendered, p_output, p_output ); + } + else if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) + { + ivas_mc2sba( st_ivas->hIntSetup, p_output, p_output, *nSamplesRendered, st_ivas->hOutSetup.ambisonics_order, 0.f ); + } + else if ( st_ivas->renderer_type == RENDERER_BINAURAL_OBJECTS_TD ) + { + if ( ( ivas_td_binaural_renderer( st_ivas, p_output, *nSamplesRendered ) ) != IVAS_ERR_OK ) + { + return error; + } + + ivas_binaural_add_LFE( st_ivas, *nSamplesRendered, p_output, p_output ); + } + } + else if ( st_ivas->mc_mode == MC_MODE_PARAMMC ) + { + ivas_param_mc_dec_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output ); + } + else if ( st_ivas->mc_mode == MC_MODE_MCMASA ) + { + int16_t offset = hSpatParamRendCom->slots_rendered * hSpatParamRendCom->slot_size; + nchan_remapped = st_ivas->nchan_transport; + + if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) + { + ivas_dirac_dec_binaural_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, nchan_remapped, p_output ); + } + else if ( st_ivas->renderer_type == RENDERER_DIRAC || st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) /* rendering to CICPxx and Ambisonics */ + { + ivas_dirac_dec_render( st_ivas, nchan_remapped, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output ); + + if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) + { + /* we still need to copy the separate channel if available */ + if ( st_ivas->hOutSetup.separateChannelEnabled ) + { + mvr2r( st_ivas->hTcBuffer->tc[LFE_CHANNEL - 1] + offset, output[st_ivas->hOutSetup.separateChannelIndex], *nSamplesRendered ); + } + ivas_mc2sba( st_ivas->hIntSetup, p_output, p_output, *nSamplesRendered, st_ivas->hOutSetup.ambisonics_order, 0.f ); + } + else if ( st_ivas->intern_config == IVAS_AUDIO_CONFIG_5_1 && ( output_config == IVAS_AUDIO_CONFIG_5_1_2 || output_config == IVAS_AUDIO_CONFIG_5_1_4 || output_config == IVAS_AUDIO_CONFIG_7_1 ) ) + { + for ( n = st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe; n < st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe; n++ ) + { + set_zero( output[n], *nSamplesRendered ); + } + } + } + + /* copy discrete C and TD LFE from internal TC to output */ + if ( st_ivas->hOutSetup.separateChannelEnabled ) + { + if ( output_config == IVAS_AUDIO_CONFIG_5_1 || output_config == IVAS_AUDIO_CONFIG_7_1 || + output_config == IVAS_AUDIO_CONFIG_5_1_4 || output_config == IVAS_AUDIO_CONFIG_7_1_4 || + output_config == IVAS_AUDIO_CONFIG_5_1_2 || ( output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM && st_ivas->hOutSetup.num_lfe > 0 ) ) + { + mvr2r( st_ivas->hTcBuffer->tc[LFE_CHANNEL] + offset, output[LFE_CHANNEL], *nSamplesRendered ); + mvr2r( st_ivas->hTcBuffer->tc[LFE_CHANNEL - 1] + offset, output[st_ivas->hOutSetup.separateChannelIndex], *nSamplesRendered ); + } + else if ( output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM && st_ivas->hOutSetup.num_lfe == 0 ) + { + /* Delay the separated channel to sync with the DirAC rendering */ + mvr2r( st_ivas->hTcBuffer->tc[LFE_CHANNEL - 1] + offset, output[st_ivas->hOutSetup.separateChannelIndex], *nSamplesRendered ); + } + } + } + } + + /*----------------------------------------------------------------* + * Write IVAS output channels + * - compensation for saturation + * - float to integer conversion + *----------------------------------------------------------------*/ + + st_ivas->hTcBuffer->n_samples_available -= *nSamplesRendered; + st_ivas->hTcBuffer->n_samples_rendered += *nSamplesRendered; + + if ( st_ivas->hTcBuffer->n_samples_discard > 0 ) + { + for ( n = 0; n < MAX_OUTPUT_CHANNELS; n++ ) + { + p_output[n] += st_ivas->hTcBuffer->n_samples_discard; + } + *nSamplesRendered -= st_ivas->hTcBuffer->n_samples_discard; + st_ivas->hTcBuffer->n_samples_discard = 0; + } + + { + if ( st_ivas->ivas_format != MONO_FORMAT ) + { +#ifndef DISABLE_LIMITER + ivas_limiter_dec( st_ivas->hLimiter, p_output, nchan_out, *nSamplesRendered, st_ivas->BER_detect ); +#endif + } + } + + ivas_syn_output( p_output, *nSamplesRendered, nchan_out, data ); + + + *nSamplesAvailableNext = st_ivas->hTcBuffer->n_samples_available; + + pop_wmops(); + return IVAS_ERR_OK; +} + + +/*--------------------------------------------------------------------------* + * ivas_jbm_dec_dec_flush_renderer() + * + * Flush samples if renderer granularity changes on a bitrate change + *--------------------------------------------------------------------------*/ + +ivas_error ivas_jbm_dec_flush_renderer( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const int16_t tc_granularity_new, /* i : new renderer granularity */ + const RENDERER_TYPE renderer_type_old, /* i : old renderer type */ + const AUDIO_CONFIG intern_config_old, /* i : old internal config */ + const IVAS_OUTPUT_SETUP_HANDLE hIntSetupOld, /* i : old internal output setup */ + const MC_MODE mc_mode_old, /* i : old MC mode */ + const ISM_MODE ism_mode_old, /* i : old ISM mode */ + uint16_t *nSamplesRendered, /* o : number of samples flushed */ + int16_t *data /* o : output synthesis signal */ +) +{ + ivas_error error; + int16_t n_samples_still_available; + int16_t n_slots_still_available; + int16_t n_samples_to_render; + DECODER_TC_BUFFER_HANDLE hTcBuffer; + float output[MAX_CICP_CHANNELS][L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES]; + float *p_output[MAX_CICP_CHANNELS]; + + *nSamplesRendered = 0; + hTcBuffer = st_ivas->hTcBuffer; + + /* get number of possible slots in new granularity */ + n_samples_still_available = hTcBuffer->n_samples_buffered - hTcBuffer->n_samples_rendered; + n_slots_still_available = n_samples_still_available / tc_granularity_new; + *nSamplesRendered = n_slots_still_available * tc_granularity_new; + n_samples_to_render = *nSamplesRendered; + n_samples_still_available -= n_samples_to_render; + assert( n_samples_still_available < tc_granularity_new ); + + if ( n_slots_still_available ) + { + int16_t ch_idx; + + /* render what is still there with zero padding */ + for ( ch_idx = 0; ch_idx < hTcBuffer->nchan_buffer_full; ch_idx++ ) + { + /* move it at the beginning of the TC buffer with zero padding */ + mvr2r( hTcBuffer->tc[ch_idx] + hTcBuffer->n_samples_rendered, hTcBuffer->tc[ch_idx], n_samples_to_render ); + set_zero( hTcBuffer->tc[ch_idx] + n_samples_to_render, hTcBuffer->n_samples_granularity - n_samples_to_render ); + mvr2r( hTcBuffer->tc[ch_idx] + hTcBuffer->n_samples_rendered + n_samples_to_render, hTcBuffer->tc[ch_idx] + hTcBuffer->n_samples_granularity, n_samples_still_available ); + } + + /* simple change of the slot info */ + hTcBuffer->num_slots = 1; + hTcBuffer->nb_subframes = 1; + hTcBuffer->subframes_rendered = 0; + hTcBuffer->slots_rendered = 0; + hTcBuffer->subframe_nbslots[0] = 1; + hTcBuffer->n_samples_buffered = hTcBuffer->n_samples_granularity + n_samples_still_available; + hTcBuffer->n_samples_available = 0; + hTcBuffer->n_samples_flushed = n_samples_to_render; +#ifdef CR_FIX_JBM_FLUSH_OFFSET + hTcBuffer->n_samples_rendered = 0; +#else + hTcBuffer->n_samples_rendered = hTcBuffer->n_samples_granularity; +#endif + + for ( ch_idx = 0; ch_idx < MAX_CICP_CHANNELS; ch_idx++ ) + { + p_output[ch_idx] = output[ch_idx]; + } + + if ( st_ivas->ivas_format == ISM_FORMAT ) + { + if ( ism_mode_old == ISM_MODE_DISC ) + { + /* Binaural rendering */ + if ( renderer_type_old == RENDERER_BINAURAL_OBJECTS_TD ) + { + if ( ( error = ivas_td_binaural_renderer_sf( st_ivas, p_output, hTcBuffer->n_samples_granularity ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( renderer_type_old == RENDERER_BINAURAL_MIXER_CONV_ROOM ) + { + /* Convert to CICPxx; used also for ISM->CICP19->binaural_room rendering */ + set_f( st_ivas->hIsmRendererData->interpolator, 1.0f, hTcBuffer->n_samples_granularity ); + + ivas_ism_render_sf( st_ivas, p_output, hTcBuffer->n_samples_granularity ); + + if ( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, IVAS_AUDIO_CONFIG_7_1_4, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR, st_ivas->hDecoderConfig, NULL, NULL, + NULL, st_ivas->hTcBuffer, p_output, p_output, hTcBuffer->n_samples_granularity, st_ivas->hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } + + ivas_binaural_add_LFE( st_ivas, hTcBuffer->n_samples_granularity, p_output, p_output ); + } + } + else + { + return IVAS_ERROR( IVAS_ERR_WRONG_MODE, "Wrong ISM_MODE in VoIP renderer flushing!" ); + } + } + else if ( st_ivas->ivas_format == MC_FORMAT ) + { + if ( mc_mode_old == MC_MODE_MCT ) + { + if ( renderer_type_old == RENDERER_BINAURAL_MIXER_CONV || renderer_type_old == RENDERER_BINAURAL_MIXER_CONV_ROOM ) + { + if ( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, intern_config_old, st_ivas->hOutSetup.output_config, st_ivas->hDecoderConfig, st_ivas->hCombinedOrientationData, + hIntSetupOld, st_ivas->hEFAPdata, st_ivas->hTcBuffer, hTcBuffer->tc, p_output, hTcBuffer->n_samples_granularity, st_ivas->hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } + + ivas_binaural_add_LFE( st_ivas, hTcBuffer->n_samples_granularity, st_ivas->hTcBuffer->tc, p_output ); + } + else if ( st_ivas->renderer_type == RENDERER_BINAURAL_OBJECTS_TD ) + { + if ( ( error = ivas_td_binaural_renderer_sf( st_ivas, p_output, hTcBuffer->n_samples_granularity ) ) != IVAS_ERR_OK ) + { + return error; + } + + ivas_binaural_add_LFE( st_ivas, hTcBuffer->n_samples_granularity, st_ivas->hTcBuffer->tc, p_output ); + } + } + else + { + return IVAS_ERROR( IVAS_ERR_WRONG_MODE, "Wrong MC_MODE in VoIP renderer flushing!" ); + } + } + else if ( st_ivas->ivas_format == MASA_ISM_FORMAT || st_ivas->ivas_format == MASA_FORMAT ) + { + if ( ism_mode_old == ISM_MASA_MODE_DISC ) + { + float *tc_local[MAX_TRANSPORT_CHANNELS]; + + for ( ch_idx = 0; ch_idx < st_ivas->nchan_ism; ch_idx++ ) + { + tc_local[ch_idx] = &st_ivas->hTcBuffer->tc[ch_idx + 2][hTcBuffer->n_samples_rendered]; + mvr2r( st_ivas->hMasaIsmData->delayBuffer[ch_idx], tc_local[ch_idx], st_ivas->hMasaIsmData->delayBuffer_size ); + } + + if ( st_ivas->nchan_ism > 0 ) + { + if ( ( error = ivas_td_binaural_renderer_sf( st_ivas, p_output, hTcBuffer->n_samples_granularity ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + for ( ch_idx = 0; ch_idx < st_ivas->hDecoderConfig->nchan_out; ch_idx++ ) + { + set_zero( p_output[ch_idx], (int16_t) ( *nSamplesRendered ) ); + } + st_ivas->hTcBuffer->slots_rendered += 1; + st_ivas->hTcBuffer->subframes_rendered += 1; + } + } + } + else if ( st_ivas->ivas_format == SBA_ISM_FORMAT ) + { + float *tc_local[MAX_TRANSPORT_CHANNELS]; + int16_t last_spar_md_idx; + int16_t last_dirac_md_idx; + uint16_t nSamplesAvailableNext; + + last_spar_md_idx = st_ivas->hSpar->render_to_md_map[st_ivas->hSpar->slots_rendered - 1]; + last_dirac_md_idx = st_ivas->hSpatParamRendCom->render_to_md_map[st_ivas->hSpatParamRendCom->slots_rendered - 1]; + /* copy from ISM delay buffer to the correct place in tcs */ + for ( ch_idx = 0; ch_idx < st_ivas->nchan_ism; ch_idx++ ) + { + tc_local[ch_idx] = &st_ivas->hTcBuffer->tc[ch_idx + 2][hTcBuffer->n_samples_rendered]; + mvr2r( st_ivas->hSbaIsmData->delayBuffer[ch_idx], tc_local[ch_idx], st_ivas->hSbaIsmData->delayBuffer_size ); + } + + /* transfer adapted sf info from hTcBuffer to SPAR and DirAC */ + st_ivas->hSpar->nb_subframes = 1; + st_ivas->hSpar->subframes_rendered = 0; + st_ivas->hSpar->subframe_nbslots[0] = JBM_CLDFB_SLOTS_IN_SUBFRAME; + st_ivas->hSpar->slots_rendered = 0; + st_ivas->hSpar->num_slots = JBM_CLDFB_SLOTS_IN_SUBFRAME; + st_ivas->hSpatParamRendCom->nb_subframes = 1; + st_ivas->hSpatParamRendCom->subframes_rendered = 0; + st_ivas->hSpatParamRendCom->subframe_nbslots[0] = JBM_CLDFB_SLOTS_IN_SUBFRAME; + st_ivas->hSpatParamRendCom->slots_rendered = 0; + st_ivas->hSpatParamRendCom->num_slots = JBM_CLDFB_SLOTS_IN_SUBFRAME; + + /* also adapt md maps, just use the last index */ + set_s( st_ivas->hSpar->render_to_md_map, last_spar_md_idx, n_slots_still_available ); + set_s( st_ivas->hSpatParamRendCom->render_to_md_map, last_dirac_md_idx, n_slots_still_available ); + + /* render the last subframe */ + if ( ( error = ivas_osba_dirac_td_binaural_jbm( st_ivas, (uint16_t) hTcBuffer->n_samples_granularity, nSamplesRendered, &nSamplesAvailableNext, p_output ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + return IVAS_ERROR( IVAS_ERR_WRONG_MODE, "Wrong IVAS format in VoIP renderer flushing!" ); + } +#ifdef CR_FIX_JBM_FLUSH_OFFSET + hTcBuffer->n_samples_rendered = hTcBuffer->n_samples_granularity; +#endif + } + + *nSamplesRendered = n_samples_to_render; + + /* Only write out the valid data*/ + { + if ( st_ivas->ivas_format != MONO_FORMAT ) + { +#ifndef DISABLE_LIMITER + ivas_limiter_dec( st_ivas->hLimiter, p_output, st_ivas->hDecoderConfig->nchan_out, *nSamplesRendered, st_ivas->BER_detect ); +#endif + } + } + + ivas_syn_output( p_output, *nSamplesRendered, st_ivas->hDecoderConfig->nchan_out, + data ); + + + return IVAS_ERR_OK; +} + + +/*--------------------------------------------------------------------------* + * ivas_jbm_dec_set_discard_samples() + * + * Set number of samples to discard in the first subframe if the renderer granularity changes on a bitrate change + *--------------------------------------------------------------------------*/ + +ivas_error ivas_jbm_dec_set_discard_samples( + Decoder_Struct *st_ivas /* i/o: main IVAS decoder structre */ +) +{ + int16_t nMaxSlotsPerSubframe, nSlotsInFirstSubframe; + + /* render first frame with front zero padding and discarding those samples */ + nMaxSlotsPerSubframe = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / ( FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES ) ) / st_ivas->hTcBuffer->n_samples_granularity; + nSlotsInFirstSubframe = nMaxSlotsPerSubframe - st_ivas->hTcBuffer->subframe_nbslots[st_ivas->hTcBuffer->nb_subframes - 1]; + if ( nSlotsInFirstSubframe > 0 ) + { + st_ivas->hTcBuffer->n_samples_discard = ( nMaxSlotsPerSubframe - nSlotsInFirstSubframe ) * st_ivas->hTcBuffer->n_samples_granularity; + /* set last subframes number to max to ensure correct continuation */ + st_ivas->hTcBuffer->subframe_nbslots[st_ivas->hTcBuffer->nb_subframes - 1] = nMaxSlotsPerSubframe; + } + + return IVAS_ERR_OK; +} + + +/*--------------------------------------------------------------------------* + * ivas_jbm_dec_get_adapted_linear_interpolator() + * + * Get an interpolator that is adapted to time scale modified IVAS frame + *--------------------------------------------------------------------------*/ + +void ivas_jbm_dec_get_adapted_linear_interpolator( + const int16_t default_interp_length, /* i : default length of the (full-frame) interpolator */ + const int16_t interp_length, /* i : length of the interpolator to be created */ + float *interpolator /* o : the interpolator */ +) +{ + int16_t jbm_segment_len, idx; + float dec; + + jbm_segment_len = ( default_interp_length >> 1 ); + dec = 1.0f / default_interp_length; + + interpolator[interp_length - 1] = 1.0f; + for ( idx = interp_length - 2; idx >= jbm_segment_len; idx-- ) + { + interpolator[idx] = max( 0.0f, interpolator[idx + 1] - dec ); + } + + if ( interpolator[idx + 1] > 0.0f ) + { + dec = interpolator[idx + 1] / ( jbm_segment_len + 1 ); + for ( ; idx >= 0; idx-- ) + { + interpolator[idx] = interpolator[idx + 1] - dec; + } + } + else + { + set_f( interpolator, 0.0f, idx + 1 ); + } + + return; +} + + +/*--------------------------------------------------------------------------* + * ivas_jbm_dec_get_adapted_subframes() + * + * Get an interpolator that is adapted to time scale modified IVAS frame + *--------------------------------------------------------------------------*/ + +void ivas_jbm_dec_get_adapted_subframes( + const int16_t nCldfbTs, /* i : number of time slots in the current frame */ + int16_t *subframe_nbslots, /* i/o: subframe grid */ + int16_t *nb_subframes /* i/o: number of subframes in the frame */ +) +{ + uint16_t nSlotsInLastSubframe, nSlotsInFirstSubframe; + uint16_t nCldfbSlotsLocal = nCldfbTs; + + /* get last subframe size from previous frame, determine how many slots have to be processed + in the first subframe (i.e. potential leftover of a 5ms subframe) */ + nSlotsInFirstSubframe = ( PARAM_MC_MAX_NSLOTS_IN_SUBFRAME - subframe_nbslots[*nb_subframes - 1] ); + *nb_subframes = 0; + if ( nSlotsInFirstSubframe > 0 ) + { + *nb_subframes = 1; + nCldfbSlotsLocal -= nSlotsInFirstSubframe; + } + + *nb_subframes += (int16_t) ceilf( (float) nCldfbSlotsLocal / (float) PARAM_MC_MAX_NSLOTS_IN_SUBFRAME ); + nSlotsInLastSubframe = nCldfbSlotsLocal % PARAM_MC_MAX_NSLOTS_IN_SUBFRAME; + + set_s( subframe_nbslots, 0, MAX_JBM_SUBFRAMES_5MS ); + set_s( subframe_nbslots, PARAM_MC_MAX_NSLOTS_IN_SUBFRAME, *nb_subframes ); + + if ( nSlotsInFirstSubframe > 0 ) + { + subframe_nbslots[0] = nSlotsInFirstSubframe; + } + + if ( nSlotsInLastSubframe > 0 ) + { + subframe_nbslots[*nb_subframes - 1] = nSlotsInLastSubframe; + } + + return; +} + + +/*--------------------------------------------------------------------------* + * ivas_jbm_dec_get_adapted_linear_interpolator() + * + * Get an meta data map adapted to a time scale modified IVAS frame + *--------------------------------------------------------------------------*/ + +void ivas_jbm_dec_get_md_map( + const int16_t default_len, /* i : default frame length in metadata slots */ + const int16_t len, /* i : length of the modfied frames in metadata slots */ + const int16_t subframe_len, /* i : default length of a subframe */ + const int16_t offset, /* i : current read offset into the md buffer */ + const int16_t buf_len, /* i : length of the metadata buffer */ + int16_t *map /* o : metadata index map */ +) +{ + int16_t jbm_segment_len, map_idx, src_idx, src_idx_map; + float dec, src_idx_f; + + jbm_segment_len = ( default_len >> 1 ); + dec = 1.0f / default_len; + + for ( map_idx = len - 1, src_idx = default_len - 1; map_idx >= jbm_segment_len; map_idx--, src_idx-- ) + { + src_idx_map = max( 0, src_idx / subframe_len ); + map[map_idx] = ( offset + src_idx_map ) % buf_len; + } + + /* changed part (first segment), interpolate index to parameters + (we do not want to interpolate and smooth acutal direction/diffuseness values even more) */ + if ( src_idx >= 0 ) + { + dec = ( (float) ( src_idx + 1 ) ) / ( (float) jbm_segment_len ); + src_idx_f = (float) ( src_idx + 1 ) - dec; + for ( ; map_idx >= 0; map_idx-- ) + { + src_idx = max( 0, ( (int16_t) round_f( src_idx_f ) ) / subframe_len ); + map[map_idx] = ( offset + src_idx ) % buf_len; + src_idx_f -= dec; + } + } + else + { + set_s( map, offset, map_idx + 1 ); + } + + return; +} + + +/*--------------------------------------------------------------------------* + * ivas_jbm_dec_get_md_map_even_spacing() + * + * Get an meta data map adapted to a time scale modified IVAS frame. Distribute slots evenly across the modified frame. + *--------------------------------------------------------------------------*/ + +void ivas_jbm_dec_get_md_map_even_spacing( + const int16_t len, /* i : length of the modfied frames in metadata slots */ + const int16_t subframe_len, /* i : default length of a subframe */ + const int16_t offset, /* i : current read offset into the md buffer */ + const int16_t buf_len, /* i : length of the metadata buffer */ + int16_t *map /* o : metadata index map */ +) +{ + int16_t map_idx, sf_idx, sf_length, increment, subframes_written; + float decimal, decimal_sum, eps; + int16_t subframe_map_length[MAX_PARAM_SPATIAL_SUBFRAMES]; + + /* subframe map length */ + sf_length = len / subframe_len; + if ( len % subframe_len == 0 ) + { + /* even subframes */ + for ( sf_idx = 0; sf_idx < MAX_PARAM_SPATIAL_SUBFRAMES; sf_idx++ ) + { + subframe_map_length[sf_idx] = sf_length; + } + } + else + { + /* uneven subframes */ + decimal = ( (float) len / (float) subframe_len ) - (float) sf_length; + decimal_sum = decimal; + eps = 0.001f; + for ( sf_idx = 0; sf_idx < MAX_PARAM_SPATIAL_SUBFRAMES; sf_idx++ ) + { + increment = (int16_t) floorf( decimal_sum + eps ); + subframe_map_length[sf_idx] = sf_length + increment; + if ( increment > 0 ) + { + decimal_sum -= 1.0f; + } + decimal_sum += decimal; + } + } + + /* map slots to subframes */ + sf_idx = 0; + subframes_written = 0; + for ( map_idx = 0; map_idx < len; map_idx++ ) + { + map[map_idx] = ( offset + sf_idx ) % buf_len; + if ( map_idx - subframes_written >= subframe_map_length[sf_idx] - 1 ) + { + subframes_written += subframe_map_length[sf_idx]; + ++sf_idx; + } + } + + return; +} + + +/*--------------------------------------------------------------------------* + * ivas_jbm_dec_get_num_tc_channels() + * + * Get the number of transport channels provided by the JBM transport channel decode function + *--------------------------------------------------------------------------*/ + +int16_t ivas_jbm_dec_get_num_tc_channels( + Decoder_Struct *st_ivas /* i : IVAS decoder handle */ +) +{ + int16_t num_tc; + int32_t ivas_total_brate; + AUDIO_CONFIG output_config; + + if ( st_ivas->renderer_type == RENDERER_DISABLE ) + { + num_tc = st_ivas->hDecoderConfig->nchan_out; + } + else + { + num_tc = st_ivas->nchan_transport; + } + output_config = st_ivas->hDecoderConfig->output_config; + + ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; + if ( st_ivas->ivas_format == STEREO_FORMAT && st_ivas->hDecoderConfig->nchan_out == 1 ) + { + num_tc = 1; + } + else if ( st_ivas->ivas_format == ISM_FORMAT ) + { + if ( st_ivas->renderer_type == RENDERER_MONO_DOWNMIX ) + { + num_tc = 1; + } + } + else if ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == MASA_FORMAT ) + { + if ( st_ivas->sba_dirac_stereo_flag ) + { + num_tc = CPE_CHANNELS; + } + else if ( st_ivas->ivas_format == MASA_FORMAT && ivas_total_brate < MASA_STEREO_MIN_BITRATE && ( ivas_total_brate > IVAS_SID_5k2 || ( ivas_total_brate <= IVAS_SID_5k2 && st_ivas->nCPE > 0 && st_ivas->hCPE[0] != NULL && st_ivas->hCPE[0]->nchan_out == 1 ) ) ) + { + num_tc = 1; /* Only one channel transported */ + } + + if ( st_ivas->ivas_format == MASA_FORMAT && st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL && st_ivas->nchan_transport == 2 && st_ivas->hDecoderConfig->ivas_total_brate < MASA_STEREO_MIN_BITRATE && st_ivas->hDecoderConfig->ivas_total_brate > IVAS_SID_5k2 ) + { + num_tc = CPE_CHANNELS; + } + if ( st_ivas->ivas_format == SBA_FORMAT ) + { + + if ( num_tc == 3 ) + { + num_tc++; + } + } + } + else if ( st_ivas->ivas_format == MASA_ISM_FORMAT ) + { + if ( st_ivas->hDecoderConfig->output_config != IVAS_AUDIO_CONFIG_EXTERNAL ) + { + if ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) + { + num_tc++; + } + else if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC ) + { + num_tc += st_ivas->nchan_ism; + } + } + } + else if ( st_ivas->ivas_format == SBA_ISM_FORMAT ) + { + if ( st_ivas->sba_dirac_stereo_flag ) + { + num_tc = CPE_CHANNELS; + } + if ( ( st_ivas->sba_planar && num_tc >= 3 ) || ( num_tc == 3 ) ) + { + num_tc++; + } + if ( st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + { + num_tc += st_ivas->nchan_ism; + } + } + else if ( st_ivas->ivas_format == MC_FORMAT ) + { + if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_MONO ) + { + num_tc = 1; + } + else if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_STEREO ) + { + num_tc = 2; + } + else if ( st_ivas->mc_mode == MC_MODE_MCT ) + { + /* do all static dmx already in the TC decoder if less channels than transported... */ + if ( st_ivas->transport_config != st_ivas->intern_config && ( st_ivas->intern_config == IVAS_AUDIO_CONFIG_FOA || st_ivas->intern_config == IVAS_AUDIO_CONFIG_HOA2 || st_ivas->intern_config == IVAS_AUDIO_CONFIG_HOA3 ) ) + { + if ( ( st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe ) >= ( st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe ) ) + { + num_tc = st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe; + } + } + else if ( ( st_ivas->renderer_type == RENDERER_MC || st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) && ( st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe ) >= ( st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe ) ) + { + num_tc = st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe; + } + } + else if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) + { + num_tc = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS; + } + else if ( st_ivas->mc_mode == MC_MODE_MCMASA ) + { + if ( st_ivas->hOutSetup.separateChannelEnabled ) + { + num_tc++; + } + if ( st_ivas->hOutSetup.separateChannelEnabled && ( output_config == IVAS_AUDIO_CONFIG_5_1 || output_config == IVAS_AUDIO_CONFIG_7_1 || + output_config == IVAS_AUDIO_CONFIG_5_1_4 || output_config == IVAS_AUDIO_CONFIG_7_1_4 || + output_config == IVAS_AUDIO_CONFIG_5_1_2 || ( output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM && st_ivas->hOutSetup.num_lfe > 0 ) ) ) + { + /* LFE is synthesized in TD with the TCs*/ + num_tc++; + } + } + } + else if ( st_ivas->ivas_format == MONO_FORMAT && st_ivas->renderer_type == RENDERER_NON_DIEGETIC_DOWNMIX ) + { + num_tc = MAX_OUTPUT_CHANNELS_IN_DIEGETIC_PAN; + } + + return num_tc; +} + + +/*--------------------------------------------------------------------------* + * ivas_jbm_dec_copy_tc() + * + * Copy interleaved transport chnannels to the correct buffers, update the TC + * buffer handle + *--------------------------------------------------------------------------*/ + +static void ivas_jbm_dec_copy_tc( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const int16_t nSamplesForRendering, /* i : number of samples to digest */ + int16_t *nSamplesResidual, /* o : number of samples that will be left for the next frame */ + float *data, /* i : (interleaved) transport channel samples */ + float *tc_digest_f[] /* o : samples that will be directly digested (e.g. by CLDFB) */ +) +{ + int16_t ch; + DECODER_TC_BUFFER_HANDLE hTcBuffer; + int16_t n_samples_still_available, m; + int16_t n_ch_full_copy; + int16_t n_ch_res_copy; + + hTcBuffer = st_ivas->hTcBuffer; + n_samples_still_available = hTcBuffer->n_samples_buffered - hTcBuffer->n_samples_rendered; + hTcBuffer->n_samples_buffered = n_samples_still_available + nSamplesForRendering + hTcBuffer->n_samples_discard; + hTcBuffer->n_samples_available = hTcBuffer->n_samples_granularity * ( hTcBuffer->n_samples_buffered / hTcBuffer->n_samples_granularity ); + *nSamplesResidual = hTcBuffer->n_samples_buffered - hTcBuffer->n_samples_available; + n_ch_full_copy = min( hTcBuffer->nchan_transport_jbm, hTcBuffer->nchan_buffer_full ); + n_ch_res_copy = hTcBuffer->nchan_transport_jbm - hTcBuffer->nchan_buffer_full; + + for ( ch = 0; ch < n_ch_full_copy; ch++ ) + { + set_zero( hTcBuffer->tc[ch], hTcBuffer->n_samples_discard ); + mvr2r( hTcBuffer->tc[ch] + hTcBuffer->n_samples_rendered, hTcBuffer->tc[ch] + hTcBuffer->n_samples_discard, n_samples_still_available ); + for ( m = 0; m < nSamplesForRendering; m++ ) + { + hTcBuffer->tc[ch][n_samples_still_available + hTcBuffer->n_samples_discard + m] = data[m * st_ivas->hTcBuffer->nchan_transport_jbm + ch]; + } + } + + if ( n_ch_res_copy > 0 ) + { + for ( ; ch < hTcBuffer->nchan_transport_jbm; ch++ ) + { + mvr2r( hTcBuffer->tc[ch], tc_digest_f[ch], n_samples_still_available ); + for ( m = 0; m < nSamplesForRendering; m++ ) + { + tc_digest_f[ch][n_samples_still_available + m] = data[m * st_ivas->hTcBuffer->nchan_transport_jbm + ch]; + } + mvr2r( tc_digest_f[ch] + hTcBuffer->n_samples_available, hTcBuffer->tc[ch], *nSamplesResidual ); + } + } + + hTcBuffer->n_samples_rendered = 0; + hTcBuffer->subframes_rendered = 0; + + return; +} + + +/*--------------------------------------------------------------------------* + * ivas_jbm_dec_get_render_granularity() + * + * + *--------------------------------------------------------------------------*/ + +/*! r: render granularity */ +int16_t ivas_jbm_dec_get_render_granularity( + const RENDERER_TYPE rendererType, /* i : renderer type */ + const IVAS_FORMAT ivas_format, /* i : ivas format */ + const MC_MODE mc_mode, /* i : MC mode */ + const int32_t output_Fs /* i : sampling rate */ +) +{ + int16_t render_granularity; + + if ( rendererType == RENDERER_BINAURAL_OBJECTS_TD || rendererType == RENDERER_BINAURAL_MIXER_CONV || rendererType == RENDERER_BINAURAL_MIXER_CONV_ROOM ) + { + if ( ( ivas_format == MC_FORMAT ) && ( mc_mode == MC_MODE_PARAMUPMIX ) ) + { + render_granularity = NS2SA( output_Fs, CLDFB_SLOT_NS ); + } + else + { + render_granularity = NS2SA( output_Fs, FRAME_SIZE_NS / MAX_PARAM_SPATIAL_SUBFRAMES ); + } + } + else + { + render_granularity = NS2SA( output_Fs, CLDFB_SLOT_NS ); + } + + return render_granularity; +} + + +/*--------------------------------------------------------------------------* + * ivas_jbm_dec_tc_buffer_open() + * + * open and initialize JBM transport channel buffer + *--------------------------------------------------------------------------*/ + +ivas_error ivas_jbm_dec_tc_buffer_open( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const TC_BUFFER_MODE tc_buffer_mode, /* i : buffer mode */ + const int16_t nchan_transport_jbm, /* i : number of real transport channels */ + const int16_t nchan_transport_internal, /* i : number of totally buffered channels */ + const int16_t nchan_full, /* i : number of channels to fully store */ + const int16_t n_samples_granularity /* i : granularity of the renderer/buffer */ +) +{ + int16_t nsamp_to_allocate; + DECODER_TC_BUFFER_HANDLE hTcBuffer; + int16_t nMaxSlotsPerSubframe; + int16_t nchan_residual; + int16_t ch_idx; + + /*-----------------------------------------------------------------* + * prepare library opening + *-----------------------------------------------------------------*/ + + if ( ( hTcBuffer = (DECODER_TC_BUFFER_HANDLE) malloc( sizeof( DECODER_TC_BUFFER ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for JBM TC Buffer\n" ) ); + } + + hTcBuffer->tc_buffer_mode = tc_buffer_mode; + hTcBuffer->nchan_transport_jbm = nchan_transport_jbm; + hTcBuffer->nchan_transport_internal = nchan_transport_internal; + hTcBuffer->nchan_buffer_full = nchan_full; + nchan_residual = nchan_transport_internal - nchan_full; + hTcBuffer->n_samples_granularity = n_samples_granularity; + hTcBuffer->n_samples_available = 0; + hTcBuffer->n_samples_buffered = 0; + hTcBuffer->n_samples_rendered = 0; + hTcBuffer->slots_rendered = 0; + hTcBuffer->subframes_rendered = 0; + hTcBuffer->n_samples_discard = 0; + hTcBuffer->n_samples_flushed = 0; + hTcBuffer->nb_subframes = MAX_PARAM_SPATIAL_SUBFRAMES; + nsamp_to_allocate = 0; + nMaxSlotsPerSubframe = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / ( FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES ) ) / hTcBuffer->n_samples_granularity; + hTcBuffer->num_slots = nMaxSlotsPerSubframe * MAX_PARAM_SPATIAL_SUBFRAMES; + set_s( hTcBuffer->subframe_nbslots, 0, MAX_JBM_SUBFRAMES_5MS ); + set_s( hTcBuffer->subframe_nbslots, nMaxSlotsPerSubframe, MAX_PARAM_SPATIAL_SUBFRAMES ); + + if ( hTcBuffer->tc_buffer_mode == TC_BUFFER_MODE_NONE ) + { + hTcBuffer->tc_buffer = NULL; + + for ( ch_idx = 0; ch_idx < MAX_TRANSPORT_CHANNELS + MAX_NUM_OBJECTS; ch_idx++ ) + { + hTcBuffer->tc[ch_idx] = NULL; + } + } + else + { + int16_t n_samp_full, n_samp_residual; + int32_t offset; + if ( st_ivas->hDecoderConfig->Opt_tsm ) + { + n_samp_full = ( NS2SA( st_ivas->hDecoderConfig->output_Fs, MAX_JBM_L_FRAME_NS ) + hTcBuffer->n_samples_granularity - 1 ); + n_samp_residual = hTcBuffer->n_samples_granularity - 1; + } + else + { + n_samp_full = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); + n_samp_residual = 0; + } + + nsamp_to_allocate = hTcBuffer->nchan_buffer_full * n_samp_full; + nsamp_to_allocate += nchan_residual * n_samp_residual; + + if ( nsamp_to_allocate == 0 ) + { + hTcBuffer->tc_buffer = NULL; + + for ( ch_idx = 0; ch_idx < MAX_TRANSPORT_CHANNELS + MAX_NUM_OBJECTS; ch_idx++ ) + { + hTcBuffer->tc[ch_idx] = NULL; + } + } + else + { + if ( ( hTcBuffer->tc_buffer = (float *) malloc( nsamp_to_allocate * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for JBM TC Buffer\n" ) ); + } + set_zero( hTcBuffer->tc_buffer, nsamp_to_allocate ); + + offset = 0; + for ( ch_idx = 0; ch_idx < hTcBuffer->nchan_buffer_full; ch_idx++ ) + { + hTcBuffer->tc[ch_idx] = &hTcBuffer->tc_buffer[offset]; + offset += n_samp_full; + } + for ( ; ch_idx < hTcBuffer->nchan_transport_internal; ch_idx++ ) + { + hTcBuffer->tc[ch_idx] = &hTcBuffer->tc_buffer[offset]; + offset += n_samp_residual; + } + for ( ; ch_idx < MAX_TRANSPORT_CHANNELS + MAX_NUM_OBJECTS; ch_idx++ ) + { + hTcBuffer->tc[ch_idx] = NULL; + } + } + } + + st_ivas->hTcBuffer = hTcBuffer; + + return IVAS_ERR_OK; +} + + +/*--------------------------------------------------------------------------* + * ivas_jbm_dec_tc_buffer_reconfigure() + * + * open and initialize JBM transport channel buffer + *--------------------------------------------------------------------------*/ + +ivas_error ivas_jbm_dec_tc_buffer_reconfigure( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const TC_BUFFER_MODE tc_buffer_mode, /* i : new buffer mode */ + const int16_t nchan_transport_jbm, /* i : new number of real transport channels */ + const int16_t nchan_transport_internal, /* i : new number of totally buffered channels */ + const int16_t nchan_full, /* i : new number of channels to fully store */ + const int16_t n_samples_granularity /* i : new granularity of the renderer/buffer */ +) +{ + int16_t nsamp_to_allocate, n_samp_full, n_samp_residual, offset, nchan_residual; + int16_t ch_idx; + DECODER_TC_BUFFER_HANDLE hTcBuffer; + + hTcBuffer = st_ivas->hTcBuffer; + + /* if granularity changes, adapt subframe_nb_slots */ + if ( n_samples_granularity != hTcBuffer->n_samples_granularity ) + { + int16_t nMaxSlotsPerSubframeNew; + + nMaxSlotsPerSubframeNew = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / ( FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES ) ) / n_samples_granularity; + /* if samples were flushed, take that into account here */ + if ( n_samples_granularity < hTcBuffer->n_samples_granularity && hTcBuffer->n_samples_flushed > 0 ) + { + hTcBuffer->subframe_nbslots[hTcBuffer->subframes_rendered - 1] = hTcBuffer->n_samples_flushed / n_samples_granularity; + hTcBuffer->n_samples_flushed = 0; + } + else + { + hTcBuffer->subframe_nbslots[hTcBuffer->subframes_rendered - 1] = nMaxSlotsPerSubframeNew; + } + } + + hTcBuffer->tc_buffer_mode = tc_buffer_mode; + hTcBuffer->nchan_transport_jbm = nchan_transport_jbm; + hTcBuffer->nchan_transport_internal = nchan_transport_internal; + hTcBuffer->nchan_buffer_full = nchan_full; + nchan_residual = nchan_transport_internal - nchan_full; + hTcBuffer->n_samples_granularity = n_samples_granularity; + + /* realloc buffers */ + if ( hTcBuffer->tc_buffer ) + { + free( hTcBuffer->tc_buffer ); + } + if ( st_ivas->hDecoderConfig->Opt_tsm ) + { + n_samp_full = ( NS2SA( st_ivas->hDecoderConfig->output_Fs, MAX_JBM_L_FRAME_NS ) + hTcBuffer->n_samples_granularity - 1 ); + n_samp_residual = hTcBuffer->n_samples_granularity - 1; + } + else + { + n_samp_full = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); + n_samp_residual = 0; + } + nsamp_to_allocate = hTcBuffer->nchan_buffer_full * n_samp_full; + nsamp_to_allocate += nchan_residual * n_samp_residual; + + if ( ( hTcBuffer->tc_buffer = (float *) malloc( nsamp_to_allocate * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for JBM TC Buffer\n" ) ); + } + set_zero( hTcBuffer->tc_buffer, nsamp_to_allocate ); + + offset = 0; + for ( ch_idx = 0; ch_idx < hTcBuffer->nchan_buffer_full; ch_idx++ ) + { + hTcBuffer->tc[ch_idx] = &hTcBuffer->tc_buffer[offset]; + offset += n_samp_full; + } + for ( ; ch_idx < hTcBuffer->nchan_transport_internal; ch_idx++ ) + { + hTcBuffer->tc[ch_idx] = &hTcBuffer->tc_buffer[offset]; + offset += n_samp_residual; + } + + for ( ; ch_idx < MAX_TRANSPORT_CHANNELS + MAX_NUM_OBJECTS; ch_idx++ ) + { + hTcBuffer->tc[ch_idx] = NULL; + } + + return IVAS_ERR_OK; +} + + +/*--------------------------------------------------------------------------* + * ivas_jbm_dec_tc_buffer_playout() + * + * + *--------------------------------------------------------------------------*/ + +static void ivas_jbm_dec_tc_buffer_playout( + Decoder_Struct *st_ivas, + const uint16_t nSamplesAsked, + uint16_t *nSamplesRendered, + float *output[] ) +{ + int16_t ch_idx, slot_size, slots_to_render, first_sf, last_sf; + + slot_size = st_ivas->hTcBuffer->n_samples_granularity; + + /* loop for synthesis, assume we always have to render in multiples of 5ms subframes with spills */ + slots_to_render = min( st_ivas->hTcBuffer->num_slots - st_ivas->hTcBuffer->slots_rendered, nSamplesAsked / slot_size ); + st_ivas->hTcBuffer->slots_rendered += slots_to_render; + *nSamplesRendered = (uint16_t) slots_to_render * slot_size; + first_sf = st_ivas->hTcBuffer->subframes_rendered; + last_sf = first_sf; + + while ( slots_to_render > 0 ) + { + slots_to_render -= st_ivas->hTcBuffer->subframe_nbslots[last_sf]; + last_sf++; + } + + for ( ch_idx = 0; ch_idx < st_ivas->hTcBuffer->nchan_transport_jbm; ch_idx++ ) + { + mvr2r( st_ivas->hTcBuffer->tc[ch_idx] + st_ivas->hTcBuffer->n_samples_rendered, output[ch_idx], *nSamplesRendered ); + } + + st_ivas->hTcBuffer->subframes_rendered = last_sf; + + return; +} + + +/*--------------------------------------------------------------------------* + * ivas_jbm_dec_tc_buffer_close() + * + * Close JBM transport channel buffer + *--------------------------------------------------------------------------*/ + +void ivas_jbm_dec_tc_buffer_close( + DECODER_TC_BUFFER_HANDLE *phTcBuffer /* i/o: TC buffer handle */ +) +{ + int16_t i; + + if ( *phTcBuffer != NULL ) + { + for ( i = 0; i < MAX_TRANSPORT_CHANNELS + MAX_NUM_OBJECTS; i++ ) + { + ( *phTcBuffer )->tc[i] = NULL; + } + + if ( ( *phTcBuffer )->tc_buffer != NULL ) + { + free( ( *phTcBuffer )->tc_buffer ); + ( *phTcBuffer )->tc_buffer = NULL; + } + + free( *phTcBuffer ); + *phTcBuffer = NULL; + } + + return; +} + + +/*--------------------------------------------------------------------------* + * ivas_jbm_dec_td_renderers_adapt_subframes() + * + * Close JBM transport channel buffer + *--------------------------------------------------------------------------*/ + +void ivas_jbm_dec_td_renderers_adapt_subframes( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +) +{ + int16_t nMaxSlotsPerSubframe, nSlotsAvailable; + uint16_t nSlotsInLastSubframe, nSlotsInFirstSubframe; + + nMaxSlotsPerSubframe = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / ( FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES ) ) / st_ivas->hTcBuffer->n_samples_granularity; + nSlotsAvailable = st_ivas->hTcBuffer->n_samples_available / st_ivas->hTcBuffer->n_samples_granularity; + st_ivas->hTcBuffer->num_slots = nSlotsAvailable; + st_ivas->hTcBuffer->n_samples_available = nSlotsAvailable * st_ivas->hTcBuffer->n_samples_granularity; + nSlotsInFirstSubframe = nMaxSlotsPerSubframe - st_ivas->hTcBuffer->subframe_nbslots[st_ivas->hTcBuffer->nb_subframes - 1]; + st_ivas->hTcBuffer->nb_subframes = 0; + + if ( nSlotsInFirstSubframe > 0 ) + { + st_ivas->hTcBuffer->nb_subframes = 1; + nSlotsAvailable -= nSlotsInFirstSubframe; + } + st_ivas->hTcBuffer->nb_subframes += (int16_t) ceilf( (float) nSlotsAvailable / (float) nMaxSlotsPerSubframe ); + nSlotsInLastSubframe = nSlotsAvailable % nMaxSlotsPerSubframe; + set_s( st_ivas->hTcBuffer->subframe_nbslots, 0, MAX_JBM_SUBFRAMES_5MS ); + set_s( st_ivas->hTcBuffer->subframe_nbslots, nMaxSlotsPerSubframe, st_ivas->hTcBuffer->nb_subframes ); + + if ( nSlotsInFirstSubframe > 0 ) + { + st_ivas->hTcBuffer->subframe_nbslots[0] = nSlotsInFirstSubframe; + } + + if ( nSlotsInLastSubframe > 0 ) + { + st_ivas->hTcBuffer->subframe_nbslots[st_ivas->hTcBuffer->nb_subframes - 1] = nSlotsInLastSubframe; + } + + st_ivas->hTcBuffer->slots_rendered = 0; + st_ivas->hTcBuffer->subframes_rendered = 0; + + return; +} + + +/*--------------------------------------------------------------------------* + * ivas_jbm_dec_get_tc_buffer_mode() + * + * + *--------------------------------------------------------------------------*/ + +TC_BUFFER_MODE ivas_jbm_dec_get_tc_buffer_mode( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +) +{ + TC_BUFFER_MODE buffer_mode; + buffer_mode = TC_BUFFER_MODE_BUFFER; + + switch ( st_ivas->renderer_type ) + { + /* all renderers where we are done after TC decoding (might include DMX to mono/stereo */ + case RENDERER_DISABLE: + case RENDERER_MCMASA_MONO_STEREO: + case RENDERER_OSBA_STEREO: + case RENDERER_MONO_DOWNMIX: + buffer_mode = TC_BUFFER_MODE_BUFFER; + break; + case RENDERER_TD_PANNING: + case RENDERER_BINAURAL_OBJECTS_TD: + case RENDERER_BINAURAL_FASTCONV: + case RENDERER_BINAURAL_FASTCONV_ROOM: + case RENDERER_BINAURAL_PARAMETRIC: + case RENDERER_BINAURAL_PARAMETRIC_ROOM: + case RENDERER_STEREO_PARAMETRIC: + case RENDERER_DIRAC: + case RENDERER_PARAM_ISM: + case RENDERER_BINAURAL_MIXER_CONV: + case RENDERER_BINAURAL_MIXER_CONV_ROOM: + case RENDERER_OSBA_AMBI: + case RENDERER_OSBA_LS: + buffer_mode = TC_BUFFER_MODE_RENDERER; + break; + case RENDERER_NON_DIEGETIC_DOWNMIX: + if ( st_ivas->ivas_format == MONO_FORMAT ) + { + buffer_mode = TC_BUFFER_MODE_BUFFER; + } + else + { + buffer_mode = TC_BUFFER_MODE_RENDERER; + } + break; + case RENDERER_MC_PARAMMC: + if ( st_ivas->hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) + { + buffer_mode = TC_BUFFER_MODE_BUFFER; /* TCs are already the DMX to mono or stereo */ + } + else + { + buffer_mode = TC_BUFFER_MODE_RENDERER; + } + break; + case RENDERER_MC: + if ( ivas_jbm_dec_get_num_tc_channels( st_ivas ) != st_ivas->hDecoderConfig->nchan_out ) + { + buffer_mode = TC_BUFFER_MODE_RENDERER; + } + break; + case RENDERER_SBA_LINEAR_ENC: + if ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCT && ( st_ivas->renderer_type == RENDERER_MC || st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) && ( st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe ) >= ( st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe ) ) + { + buffer_mode = TC_BUFFER_MODE_BUFFER; + } + else + { + buffer_mode = TC_BUFFER_MODE_RENDERER; + } + break; + case RENDERER_SBA_LINEAR_DEC: + if ( st_ivas->ivas_format == SBA_FORMAT && ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_MONO || st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_STEREO ) ) + { + buffer_mode = TC_BUFFER_MODE_BUFFER; + } + else + { + buffer_mode = TC_BUFFER_MODE_RENDERER; + } + break; + } + + return buffer_mode; +} + + +/*--------------------------------------------------------------------------* + * ivas_jbm_dec_copy_tc_no_tsm() + * + * + *--------------------------------------------------------------------------*/ + +void ivas_jbm_dec_copy_tc_no_tsm( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + float *tc[], /* i : transport channels */ + const int16_t output_frame /* i : output frame size */ +) +{ + int16_t n_ch_full_copy; + int16_t n_ch_cldfb; + int16_t ch_idx; + DECODER_TC_BUFFER_HANDLE hTcBuffer; + + hTcBuffer = st_ivas->hTcBuffer; + hTcBuffer->n_samples_buffered = output_frame; + hTcBuffer->n_samples_available = hTcBuffer->n_samples_buffered; + n_ch_full_copy = min( hTcBuffer->nchan_transport_jbm, hTcBuffer->nchan_buffer_full ); + n_ch_cldfb = hTcBuffer->nchan_transport_jbm - hTcBuffer->nchan_buffer_full; + /* copy full tcs*/ + for ( ch_idx = 0; ch_idx < n_ch_full_copy; ch_idx++ ) + { + mvr2r( tc[ch_idx], st_ivas->hTcBuffer->tc[ch_idx], hTcBuffer->n_samples_buffered ); + } + + /* CLDFB ana for ParamMC/ParamISM */ + if ( n_ch_cldfb > 0 ) + { + float *cldfb_real_buffer; + float *cldfb_imag_buffer; + int16_t cldfb_ch, slot_idx, num_freq_bands; + + cldfb_real_buffer = NULL; + cldfb_imag_buffer = NULL; + num_freq_bands = 0; + + if ( st_ivas->ivas_format == ISM_FORMAT ) + { + cldfb_real_buffer = st_ivas->hParamIsmDec->hParamIsmRendering->Cldfb_RealBuffer_tc; + cldfb_imag_buffer = st_ivas->hParamIsmDec->hParamIsmRendering->Cldfb_ImagBuffer_tc; + num_freq_bands = st_ivas->hSpatParamRendCom->num_freq_bands; + ivas_ism_param_dec_tc_gain_ajust( st_ivas, output_frame, output_frame / 2, tc ); + } + else if ( st_ivas->ivas_format == MC_FORMAT ) + { + cldfb_real_buffer = st_ivas->hParamMC->Cldfb_RealBuffer_tc; + cldfb_imag_buffer = st_ivas->hParamMC->Cldfb_ImagBuffer_tc; + num_freq_bands = st_ivas->hParamMC->num_freq_bands; + } + /* CLDFB Analysis*/ + + for ( cldfb_ch = 0; cldfb_ch < n_ch_cldfb; cldfb_ch++, ch_idx++ ) + { + for ( slot_idx = 0; slot_idx < DEFAULT_JBM_CLDFB_TIMESLOTS; slot_idx++ ) + { + cldfbAnalysis_ts( &( tc[ch_idx][num_freq_bands * slot_idx] ), + &cldfb_real_buffer[slot_idx * num_freq_bands * n_ch_cldfb + cldfb_ch * num_freq_bands], + &cldfb_imag_buffer[slot_idx * num_freq_bands * n_ch_cldfb + cldfb_ch * num_freq_bands], + num_freq_bands, st_ivas->cldfbAnaDec[cldfb_ch] ); + } + } + } + hTcBuffer->n_samples_rendered = 0; + hTcBuffer->subframes_rendered = 0; + + return; +} + + +/*--------------------------------------------------------------------------* + * ivas_jbm_dec_metadata_open() + * + * Open structure for metadata buffering in JBM + *--------------------------------------------------------------------------*/ + +ivas_error ivas_jbm_dec_metadata_open( + Decoder_Struct *st_ivas ) +{ + JBM_METADATA_HANDLE hJbmMetadata; + if ( ( hJbmMetadata = (JBM_METADATA_HANDLE) malloc( sizeof( JBM_METADATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for JBM metadata handle\n" ) ); + } + hJbmMetadata->sf_write_idx = 0; + hJbmMetadata->sf_md_buffer_length = MASA_JBM_RINGBUFFER_FRAMES * MAX_PARAM_SPATIAL_SUBFRAMES; + + hJbmMetadata->slot_write_idx = 0; + hJbmMetadata->slot_read_idx = 0; + hJbmMetadata->slot_md_buffer_length = MASA_JBM_RINGBUFFER_FRAMES * MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME; + + st_ivas->hJbmMetadata = hJbmMetadata; + + return IVAS_ERR_OK; +} + + +/*--------------------------------------------------------------------------* + * ivas_jbm_dec_copy_masa_meta_to_buffer() + * + * Copy decoded MASA metadata to a ring buffer + *--------------------------------------------------------------------------*/ + +static void ivas_jbm_dec_copy_masa_meta_to_buffer( + Decoder_Struct *st_ivas ) +{ + int16_t sf, dir, band; + JBM_METADATA_HANDLE hJbmMetadata; + MASA_DECODER_EXT_OUT_META *extOutMeta; + int16_t write_idx; + + hJbmMetadata = st_ivas->hJbmMetadata; + extOutMeta = st_ivas->hMasa->data.extOutMeta; + + for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) + { + write_idx = ( hJbmMetadata->sf_write_idx + sf ) % hJbmMetadata->sf_md_buffer_length; + + for ( dir = 0; dir < MASA_MAXIMUM_DIRECTIONS; dir++ ) + { + for ( band = 0; band < MASA_FREQUENCY_BANDS; band++ ) + { + hJbmMetadata->directionIndexBuffer[dir][write_idx][band] = extOutMeta->directionIndex[dir][sf][band]; + hJbmMetadata->directToTotalRatioBuffer[dir][write_idx][band] = extOutMeta->directToTotalRatio[dir][sf][band]; + hJbmMetadata->spreadCoherenceBuffer[dir][write_idx][band] = extOutMeta->spreadCoherence[dir][sf][band]; + } + } + + for ( band = 0; band < MASA_FREQUENCY_BANDS; band++ ) + { + hJbmMetadata->diffuseToTotalRatioBuffer[write_idx][band] = extOutMeta->diffuseToTotalRatio[sf][band]; + hJbmMetadata->surroundCoherenceBuffer[write_idx][band] = extOutMeta->surroundCoherence[sf][band]; + } + + hJbmMetadata->numberOfDirections[write_idx] = extOutMeta->descriptiveMeta.numberOfDirections; + } + + return; +} + + +/*--------------------------------------------------------------------------* + * ivas_jbm_masa_sf_to_slot_map() + * + * Map input MASA metadata subframes to slots in JBM processing + *--------------------------------------------------------------------------*/ + +static void ivas_jbm_masa_sf_to_slot_map( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const int16_t nCldfbTs /* i : number of CLDFB time slots */ +) +{ + int16_t sf_to_slot_map[MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME]; + int16_t num_slots_in_subfr; + JBM_METADATA_HANDLE hJbmMetadata; + int16_t slot_idx; + int16_t write_idx, sf_index; + + /* Set values */ + hJbmMetadata = st_ivas->hJbmMetadata; + num_slots_in_subfr = CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES; + + /* Map input subframes to slots */ + ivas_jbm_dec_get_md_map_even_spacing( nCldfbTs, num_slots_in_subfr, 0, MAX_PARAM_SPATIAL_SUBFRAMES, sf_to_slot_map ); + + for ( slot_idx = 0; slot_idx < nCldfbTs; slot_idx++ ) + { + write_idx = ( hJbmMetadata->slot_write_idx + slot_idx ) % hJbmMetadata->slot_md_buffer_length; + sf_index = ( hJbmMetadata->sf_write_idx + sf_to_slot_map[slot_idx] ) % hJbmMetadata->sf_md_buffer_length; + + hJbmMetadata->sf_to_slot_map[write_idx] = sf_index; + } + + hJbmMetadata->sf_write_idx = ( hJbmMetadata->sf_write_idx + MAX_PARAM_SPATIAL_SUBFRAMES ) % hJbmMetadata->sf_md_buffer_length; + hJbmMetadata->slot_write_idx = ( hJbmMetadata->slot_write_idx + nCldfbTs ) % hJbmMetadata->slot_md_buffer_length; + + return; +} + + +/*--------------------------------------------------------------------------* + * ivas_jbm_masa_sf_to_sf_map() + * + * Map input MASA metadata subframes to output subframes in JBM processing + *--------------------------------------------------------------------------*/ + +void ivas_jbm_masa_sf_to_sf_map( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +) +{ + int16_t sf_to_sf_map[MAX_PARAM_SPATIAL_SUBFRAMES]; + JBM_METADATA_HANDLE hJbmMetadata; + MASA_DECODER_EXT_OUT_META *extOutMeta; + int16_t slot_read_idx, sf_read_idx; + int16_t sf_idx; + int16_t dir, band; + uint8_t numberOfDirections; + + /* Set values */ + hJbmMetadata = st_ivas->hJbmMetadata; + extOutMeta = st_ivas->hMasa->data.extOutMeta; + + /* Map slots to subframes */ + for ( sf_idx = 0; sf_idx < MAX_PARAM_SPATIAL_SUBFRAMES; sf_idx++ ) + { + slot_read_idx = ( hJbmMetadata->slot_read_idx + 2 ) % hJbmMetadata->slot_md_buffer_length; /* Take the latter one of the middle slots of the output subframe */ + sf_to_sf_map[sf_idx] = hJbmMetadata->sf_to_slot_map[slot_read_idx]; + hJbmMetadata->slot_read_idx = ( hJbmMetadata->slot_read_idx + CLDFB_SLOTS_PER_SUBFRAME ) % hJbmMetadata->slot_md_buffer_length; + } + + /* Copy mapped metadata to the EXT meta buffer for writing */ + for ( sf_idx = 0; sf_idx < MAX_PARAM_SPATIAL_SUBFRAMES; sf_idx++ ) + { + sf_read_idx = sf_to_sf_map[sf_idx]; + + for ( dir = 0; dir < MASA_MAXIMUM_DIRECTIONS; dir++ ) + { + for ( band = 0; band < MASA_FREQUENCY_BANDS; band++ ) + { + extOutMeta->directionIndex[dir][sf_idx][band] = hJbmMetadata->directionIndexBuffer[dir][sf_read_idx][band]; + extOutMeta->directToTotalRatio[dir][sf_idx][band] = hJbmMetadata->directToTotalRatioBuffer[dir][sf_read_idx][band]; + extOutMeta->spreadCoherence[dir][sf_idx][band] = hJbmMetadata->spreadCoherenceBuffer[dir][sf_read_idx][band]; + } + } + + for ( band = 0; band < MASA_FREQUENCY_BANDS; band++ ) + { + extOutMeta->diffuseToTotalRatio[sf_idx][band] = hJbmMetadata->diffuseToTotalRatioBuffer[sf_read_idx][band]; + extOutMeta->surroundCoherence[sf_idx][band] = hJbmMetadata->surroundCoherenceBuffer[sf_read_idx][band]; + } + } + + /* Determine the number of directions for the frame to be written */ + numberOfDirections = 0; + for ( sf_idx = 0; sf_idx < MAX_PARAM_SPATIAL_SUBFRAMES; sf_idx++ ) + { + sf_read_idx = sf_to_sf_map[sf_idx]; + + if ( hJbmMetadata->numberOfDirections[sf_read_idx] == 1 ) + { + numberOfDirections = 1; + break; + } + } + + extOutMeta->descriptiveMeta.numberOfDirections = numberOfDirections; + + return; +} diff --git a/lib_dec/ivas_lfe_dec.c b/lib_dec/ivas_lfe_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..441b33356a8480d9674224d178b89eabadf81d82 --- /dev/null +++ b/lib_dec/ivas_lfe_dec.c @@ -0,0 +1,472 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_rom_com.h" +#include "math.h" +#include "wmc_auto.h" + + +/*------------------------------------------------------------------------------------------* + * Local constants + *------------------------------------------------------------------------------------------*/ + +/* Delay handling of LFE: overall_lfe_delay = max(11.5, BLOCK_OFFSET_MS); */ +#define BLOCK_OFFSET_MS 12 + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_lfe_dec_delay_adjust() + * + * Adjusts the input to be passed to filtering block taking into consideration + * LFE delay calculated during initialization time + *-----------------------------------------------------------------------------------------*/ + +static void ivas_lfe_dec_delay_adjust( + LFE_DEC_HANDLE hLFE, + float *pInbuf, + float output_lfe_ch[] ) +{ + int16_t i, diff, loop_counter; + int16_t fade_len, dct_len, zero_pad_len; + float tmp_buffer[L_FRAME48k]; + + diff = hLFE->lfe_prior_buf_len - hLFE->pWindow_state->fade_len; + loop_counter = diff < 0 ? 0 : diff; + fade_len = hLFE->pWindow_state->fade_len; + dct_len = hLFE->pWindow_state->dct_len; + zero_pad_len = hLFE->pWindow_state->zero_pad_len; + + for ( i = 0; i < loop_counter; i++ ) + { + tmp_buffer[i] = hLFE->prior_out_buffer[i]; + } + + for ( i = 0; i < fade_len; i++ ) + { + tmp_buffer[i + loop_counter] = hLFE->prior_out_buffer[i + loop_counter] + pInbuf[i]; + } + loop_counter += fade_len; + + for ( i = 0; i < fade_len + ( zero_pad_len << 1 ); i++ ) + { + tmp_buffer[i + loop_counter] = pInbuf[i + fade_len]; + } + + for ( i = 0; i < hLFE->lfe_prior_buf_len; i++ ) + { + hLFE->prior_out_buffer[i] = tmp_buffer[i + dct_len]; + } + + for ( i = 0; i < dct_len; i++ ) + { + output_lfe_ch[i] = tmp_buffer[i]; + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_lfe_dec_windowing() + * + * LFE windowing block, input is passed through Fielder window + *-----------------------------------------------------------------------------------------*/ + +static void ivas_lfe_dec_windowing( + LFE_DEC_HANDLE hLFE, + float *pInbuf ) +{ + int16_t i; + int16_t fade_len; + int16_t zero_pad_len; + const float *pWindow_coeffs; + + fade_len = hLFE->pWindow_state->fade_len; + zero_pad_len = hLFE->pWindow_state->zero_pad_len; + pWindow_coeffs = hLFE->pWindow_state->pWindow_coeffs; + + for ( i = 0; i < fade_len; i++ ) + { + pInbuf[i] = pInbuf[zero_pad_len + i] * pWindow_coeffs[i]; + } + + for ( i = 0; i < zero_pad_len * 2; i++ ) + { + pInbuf[fade_len + i] = pInbuf[zero_pad_len + fade_len + i]; + } + + for ( i = 0; i < fade_len; i++ ) + { + pInbuf[zero_pad_len * 2 + fade_len + i] = pInbuf[zero_pad_len * 3 + fade_len + i] * pWindow_coeffs[fade_len - i - 1]; + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_lfe_dec_dequant() + * + * LDE de-quatization block, calls arithmetic deccoding block inside + *-----------------------------------------------------------------------------------------*/ + +static int16_t ivas_lfe_dec_dequant( + LFE_DEC_HANDLE hLFE, + Decoder_State *st0, + float *pOut_buf, + int16_t *num_dct_pass_bins ) +{ + int16_t shift_bits, i; + int16_t quant_strategy; + int16_t coding_strategy; + int16_t base2_bit_size; + int16_t lfe_bits; + int16_t all_zeros_dct; + int16_t min_shift_bits; + int16_t shift; + int16_t sign_bits[IVAS_LFE_MAX_NUM_DCT_COEFFS]; + int16_t abs_values[IVAS_LFE_MAX_NUM_DCT_COEFFS]; + int16_t values[IVAS_LFE_MAX_NUM_DCT_COEFFS]; + int16_t num_dct_coeffs, num_groups; + + all_zeros_dct = get_next_indice( st0, 1 ); + lfe_bits = st0->next_bit_pos; + shift_bits = IVAS_LFE_SHIFT_BITS; + min_shift_bits = 0; + shift = 0; + + if ( all_zeros_dct == 1 ) + { + for ( i = 0; i < IVAS_LFE_MAX_NUM_DCT_COEFFS; i++ ) + { + pOut_buf[i] = 0.0f; + } + } + else + { + float two_pow_shift_by_4; + Tastat as; + int16_t iii, extra_bits_read; + + extra_bits_read = 0; + quant_strategy = get_next_indice( st0, 1 ); + *num_dct_pass_bins = ivas_lfe_num_dct_pass_bins_tbl[quant_strategy]; + num_dct_coeffs = (int16_t) ( *num_dct_pass_bins * IVAS_LFE_NUM_COEFFS_IN_SUBGRP ); + num_groups = ( num_dct_coeffs / ( 2 * IVAS_LFE_NUM_COEFFS_IN_SUBGRP ) ); + min_shift_bits = ivas_lfe_min_shift_tbl[quant_strategy]; + shift = get_next_indice( st0, shift_bits ) + min_shift_bits * IVAS_LFE_SHIFTS_PER_DOUBLE; + + for ( i = 0; i < num_dct_coeffs; i++ ) + { + sign_bits[i] = get_next_indice( st0, 1 ); + } + + coding_strategy = get_next_indice( st0, 1 ); + + if ( coding_strategy ) + { + for ( iii = 0; iii < num_groups; iii++ ) + { + base2_bit_size = hLFE->lfe_dec_indices_coeffs_tbl[quant_strategy][iii]; + for ( i = 0; i < 4; i++ ) + { + abs_values[iii * 4 + i] = get_next_indice( st0, base2_bit_size ); + } + } + } + else + { + for ( iii = 0; iii < num_groups; iii++ ) + { + extra_bits_read = 0; + ivas_ari_start_decoding_14bits_ext_1_lfe( st0, &as, &extra_bits_read ); + + for ( i = 0; i < 4; i++ ) + { + abs_values[iii * 4 + i] = ivas_ari_decode_14bits_bit_ext_1_lfe( st0, &as, hLFE->cum_freq_models[quant_strategy][iii], &extra_bits_read ); + } + ivas_ari_done_decoding_14bits_ext_1_lfe( st0, extra_bits_read ); + } + } + + for ( i = 0; i < num_dct_coeffs; i++ ) + { + values[i] = abs_values[i]; + if ( sign_bits[i] > 0 ) + { + values[i] = -abs_values[i] - 1; + } + } + + two_pow_shift_by_4 = powf( 2, ( -shift / (float) IVAS_LFE_SHIFTS_PER_DOUBLE ) ); + + for ( i = 0; i < num_groups; i++ ) + { + pOut_buf[2 * i] = values[4 * i] * two_pow_shift_by_4; + pOut_buf[2 * i + 1] = values[4 * i + 1] * two_pow_shift_by_4; + + pOut_buf[2 * i + *num_dct_pass_bins] = values[4 * i + 2] * two_pow_shift_by_4; + pOut_buf[2 * i + *num_dct_pass_bins + 1] = values[4 * i + 3] * two_pow_shift_by_4; + } + } + + lfe_bits = st0->next_bit_pos - lfe_bits; + + return lfe_bits; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_lfe_dec() + * + * LFE channel decoder + *-----------------------------------------------------------------------------------------*/ + +void ivas_lfe_dec( + LFE_DEC_HANDLE hLFE, /* i/o: LFE decoder handle */ + Decoder_State *st0, /* i/o: decoder state structure - for bitstream handling*/ + const int16_t output_frame, /* i : output frame length per channel */ + const int16_t bfi, /* i : BFI flag */ + float output_lfe_ch[] /* o : output LFE synthesis */ +) +{ + int16_t num_dct_pass_bins; + int16_t i, j, dct_len; + float out[L_FRAME48k]; + float t_audio[L_FRAME48k]; + float lfe_dct[IVAS_LFE_MAX_NUM_DCT_COEFFS]; + + dct_len = hLFE->pWindow_state->dct_len; + num_dct_pass_bins = IVAS_LFE_MAX_NUM_DCT_PASS_BINS; + + if ( bfi == 0 ) + { + ivas_lfe_dec_dequant( hLFE, st0, lfe_dct, &num_dct_pass_bins ); + + set_zero( t_audio, dct_len ); + mvr2r( lfe_dct, t_audio, num_dct_pass_bins ); + ivas_imdct( t_audio, out, dct_len ); + ivas_lfe_dec_windowing( hLFE, out ); + ivas_lfe_dec_delay_adjust( hLFE, out, output_lfe_ch ); + + set_zero( t_audio, dct_len ); + mvr2r( &lfe_dct[num_dct_pass_bins], t_audio, num_dct_pass_bins ); + + ivas_imdct( t_audio, out, dct_len ); + ivas_lfe_dec_windowing( hLFE, out ); + ivas_lfe_dec_delay_adjust( hLFE, out, output_lfe_ch + dct_len ); + + mvr2r( hLFE->prevsynth_buf + L_FRAME_1k6, hLFE->prevsynth_buf, LFE_PLC_BUFLEN - L_FRAME_1k6 ); + + j = 0; + for ( i = 0; i < L_FRAME_1k6; i++ ) + { + hLFE->prevsynth_buf[i + LFE_PLC_BUFLEN - L_FRAME_1k6] = output_lfe_ch[j]; + j += output_frame / L_FRAME_1k6; + } + + hLFE->bfi_count = 0; + } + else + { + /* note: in BFI branch, buffer 't_audio' is in time-domain ('wtda' signal) */ + hLFE->bfi_count++; + ivas_lfe_tdplc( hLFE, hLFE->prevsynth_buf, t_audio, output_frame ); + + ivas_itda( t_audio, out, dct_len ); + ivas_lfe_dec_windowing( hLFE, out ); + ivas_lfe_dec_delay_adjust( hLFE, out, output_lfe_ch ); + + ivas_itda( t_audio + dct_len, out, dct_len ); + ivas_lfe_dec_windowing( hLFE, out ); + ivas_lfe_dec_delay_adjust( hLFE, out, output_lfe_ch + dct_len ); + + mvr2r( hLFE->prevsynth_buf + L_FRAME_1k6, hLFE->prevsynth_buf, LFE_PLC_BUFLEN - L_FRAME_1k6 ); + + j = 0; + for ( i = 0; i < L_FRAME_1k6; i++ ) + { + hLFE->prevsynth_buf[i + LFE_PLC_BUFLEN - L_FRAME_1k6] = output_lfe_ch[j]; + j += output_frame / L_FRAME_1k6; + } + } + + if ( hLFE->filter_state.order > 0 ) + { + /* Low Pass Filter */ + ivas_filter_process( &hLFE->filter_state, output_lfe_ch, output_frame ); + } + + /* add delay to make overall max(block_offset, 11.5) */ + if ( hLFE->lfe_addl_delay > 0 ) + { + delay_signal( output_lfe_ch, output_frame, hLFE->lfe_delay_buf, hLFE->lfe_addl_delay ); + } + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_create_lfe_dec() + * + * Create, allocate and initialize IVAS decoder LFE handle + *-------------------------------------------------------------------------*/ + +ivas_error ivas_create_lfe_dec( + LFE_DEC_HANDLE *hLFE_out, /* o : IVAS LFE decoder structure */ + const int32_t output_Fs, /* i : output sampling rate */ + const int32_t binauralization_delay_ns /* i : additional LFE delay to sync with binaural renderer */ +) +{ + float low_pass_delay_dec_out, block_offset_s; + int16_t filt_order, output_frame; + LFE_DEC_HANDLE hLFE; + float lfe_addl_delay_s; + int16_t i, j; + int16_t add_delay_sa; + + low_pass_delay_dec_out = 0; + block_offset_s = 0; + + output_frame = (int16_t) ( output_Fs / FRAMES_PER_SEC ); + + /*-----------------------------------------------------------------* + * Allocate LFE handle + *-----------------------------------------------------------------*/ + + if ( ( hLFE = (LFE_DEC_HANDLE) malloc( sizeof( LFE_DEC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LFE\n" ) ); + } + + /*-----------------------------------------------------------------* + * LFE Window: allocate and initialize + *-----------------------------------------------------------------*/ + + if ( ( hLFE->pWindow_state = (LFE_WINDOW_HANDLE) malloc( sizeof( LFE_WINDOW_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LFE window structure\n" ) ); + } + + ivas_lfe_window_init( hLFE->pWindow_state, output_Fs, output_frame ); + + /* Initialization for entropy coding */ + hLFE->cum_freq_models[0][0] = ivas_str_lfe_freq_models.entropy_coder_model_fine_sg1; + hLFE->cum_freq_models[0][1] = ivas_str_lfe_freq_models.entropy_coder_model_fine_sg2; + hLFE->cum_freq_models[0][2] = ivas_str_lfe_freq_models.entropy_coder_model_fine_sg3; + hLFE->cum_freq_models[0][3] = ivas_str_lfe_freq_models.entropy_coder_model_fine_sg4; + hLFE->cum_freq_models[1][0] = ivas_str_lfe_freq_models.entropy_coder_model_coarse_sg1; + hLFE->cum_freq_models[1][1] = ivas_str_lfe_freq_models.entropy_coder_model_coarse_sg2; + hLFE->cum_freq_models[1][2] = ivas_str_lfe_freq_models.entropy_coder_model_coarse_sg3; + hLFE->cum_freq_models[1][3] = &ivas_str_lfe_freq_models.entropy_coder_model_coarse_sg4; + + /* delay calculation */ + hLFE->lfe_block_delay_s = ( IVAS_LFE_FADE_NS / 1000000000.f ) + ivas_lfe_lpf_delay[IVAS_FILTER_ORDER_4 - 3]; + + block_offset_s = BLOCK_OFFSET_MS * 0.001f; + filt_order = 0; + low_pass_delay_dec_out = 0; + hLFE->filter_state.order = filt_order; + hLFE->lfe_block_delay_s = hLFE->lfe_block_delay_s + low_pass_delay_dec_out; + hLFE->lfe_prior_buf_len = NS2SA( output_Fs, IVAS_LFE_FADE_NS ); + + hLFE->bfi_count = 0; + + lfe_addl_delay_s = block_offset_s - hLFE->lfe_block_delay_s; + lfe_addl_delay_s = max( 0.0f, lfe_addl_delay_s ); + add_delay_sa = (int16_t) roundf( (float) binauralization_delay_ns * output_Fs / 1000000000.f ); + hLFE->lfe_addl_delay = (int16_t) ( lfe_addl_delay_s * output_Fs ) + add_delay_sa; + hLFE->lfe_block_delay_s += lfe_addl_delay_s + add_delay_sa / output_Fs; + + if ( hLFE->lfe_addl_delay > 0 ) + { + if ( ( hLFE->lfe_delay_buf = (float *) malloc( hLFE->lfe_addl_delay * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LFE additional delay buffer\n" ) ); + } + set_zero( (float *) hLFE->lfe_delay_buf, hLFE->lfe_addl_delay ); + } + else + { + hLFE->lfe_delay_buf = NULL; + } + + /* Initialization base2 bits for each subgroup for no entropy coding */ + for ( i = 0; i < IVAS_MAX_NUM_QUANT_STRATS; i++ ) + { + for ( j = 0; j < IVAS_MAX_NUM_DCT_COEF_GROUPS; j++ ) + { + hLFE->lfe_dec_indices_coeffs_tbl[i][j] = + (int16_t) ceilf( log2f( (float) ( ivas_lfe_num_ele_in_coder_models[i][j] + 1 ) ) ); + } + } + + *hLFE_out = hLFE; + + return IVAS_ERR_OK; +} + + +/*------------------------------------------------------------------------- + * ivas_lfe_dec_close() + * + * Destroy IVAS decoder LFE handle + *-------------------------------------------------------------------------*/ + +void ivas_lfe_dec_close( + LFE_DEC_HANDLE *hLFE /* i/o: LFE decoder handle */ +) +{ + if ( hLFE == NULL || *hLFE == NULL ) + { + return; + } + + free( ( *hLFE )->pWindow_state ); + ( *hLFE )->pWindow_state = NULL; + + if ( ( *hLFE )->lfe_delay_buf != NULL ) + { + free( ( *hLFE )->lfe_delay_buf ); + ( *hLFE )->lfe_delay_buf = NULL; + } + + free( ( *hLFE ) ); + ( *hLFE ) = NULL; + + return; +} diff --git a/lib_dec/ivas_lfe_plc.c b/lib_dec/ivas_lfe_plc.c new file mode 100644 index 0000000000000000000000000000000000000000..d973dc4a01d10b54e6f269fdeeb994f2870d847f --- /dev/null +++ b/lib_dec/ivas_lfe_plc.c @@ -0,0 +1,537 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_rom_com.h" +#include +#include "wmc_auto.h" + +/*------------------------------------------------------------------------------------------* + * Local constants + *------------------------------------------------------------------------------------------*/ + +#define LFE_PLC_DSF ( 48000 / LFE_PLC_FS ) +#define LFE_PLC_LPCORD ( 20 ) +#define LFE_PLC_MAXITER ( 10 ) +#define POW_THR ( 1.0e-8f ) +#define LFE_PLC_RECLEN_48K ( ( IVAS_LFE_NUM_COEFFS_IN_SUBGRP + 1 ) * L_FRAME48k / IVAS_LFE_NUM_COEFFS_IN_SUBGRP + LFE_PLC_FDEL ) +#define LFE_PLC_RECLEN ( ( LFE_PLC_RECLEN_48K / LFE_PLC_DSF ) ) +#define LFE_PLC_MUTE_THR ( 10 ) +#define LFE_PLC_BURST_ATT ( pow( pow( 10.0, -3.0 / 20.0 ), 1.0 / ( LFE_PLC_FS * 0.02 ) ) ) /* attenuate 3dB per frame starting with 10th consecutive loss */ + +#define MAX_LEN_LP 960 + +#define EPS_STOP 1e-5 + +/*------------------------------------------------------------------------------------------* + * Static function declarations + * + * Note (DLB): the local double precision functions defined below are replica of corresponding + * float functions defined in tools.c, lpc_tools.c and syn_filt.c. + * Double precision arithmetic is required for proper functioning of the lfe_plc. + *------------------------------------------------------------------------------------------*/ + +static void mvr2d( + const float x[], /* i : input vector */ + double y[], /* o : output vector */ + const int16_t n /* i : vector size */ +) +{ + int16_t i; + + if ( n <= 0 ) + { + /* cannot transfer vectors with size 0 */ + return; + } + + for ( i = n - 1; i >= 0; i-- ) + { + y[i] = x[i]; + } + + return; +} + + +/*---------------------------------------------------------------------* + * autocorr() + * + * Compute autocorrelations of input signal + *---------------------------------------------------------------------*/ + +static void d_autocorr( + const double *x, /* i : input signal */ + double *r, /* o : autocorrelations vector */ + const int16_t m, /* i : order of LP filter */ + const int16_t len, /* i : window size */ + const double *wind, /* i : window */ + const int16_t rev_flag, /* i : flag to reverse window */ + const int16_t sym_flag, /* i : symmetric window flag */ + const int16_t no_thr /* i : flag to avoid thresholding */ +) +{ + double t[MAX_LEN_LP]; + double s; + int16_t i, j; + + /* Windowing of signal */ + if ( rev_flag == 1 ) + { + /* time reversed window */ + for ( i = 0; i < len; i++ ) + { + t[i] = x[i] * wind[len - i - 1]; + } + } + else if ( sym_flag == 1 ) + { + /* symmetric window of even length */ + for ( i = 0; i < len / 2; i++ ) + { + t[i] = x[i] * wind[i]; + } + + for ( ; i < len; i++ ) + { + t[i] = x[i] * wind[len - 1 - i]; + } + } + else /* assymetric window */ + { + for ( i = 0; i < len; i++ ) + { + t[i] = x[i] * wind[i]; + } + } + + /* Compute r[1] to r[m] */ + for ( i = 0; i <= m; i++ ) + { + s = t[0] * t[i]; + for ( j = 1; j < len - i; j++ ) + { + s += t[j] * t[i + j]; + } + r[i] = s; + } + + if ( r[0] < 100.0f && no_thr == 0 ) + { + r[0] = 100.0f; + } + + return; +} + + +/*---------------------------------------------------------------------* + * lev_dur() + * + * Wiener-Levinson-Durbin algorithm to compute LP parameters from the autocorrelations + * of input signal + *---------------------------------------------------------------------*/ + +/*! r: energy of prediction error */ +static int16_t d_lev_dur( + double *a, /* o : LP coefficients (a[0] = 1.0) */ + const double *r, /* i : vector of autocorrelations */ + const int16_t m, /* i : order of LP filter */ + double epsP[] /* o : prediction error energy */ +) +{ + int16_t i, j, l; + double buf[TCXLTP_LTP_ORDER]; + double *rc; /* reflection coefficients 0,...,m-1 */ + double s, at, err; + int16_t flag = 0; + + rc = &buf[0]; + rc[0] = ( -r[1] ) / r[0]; + a[0] = 1.0; + a[1] = rc[0]; + err = r[0] + r[1] * rc[0]; + + if ( epsP != NULL ) + { + epsP[0] = r[0]; + epsP[1] = err; + } + + for ( i = 2; i <= m; i++ ) + { + s = 0.0; + for ( j = 0; j < i; j++ ) + { + s += r[i - j] * a[j]; + } + + rc[i - 1] = ( -s ) / err; + if ( fabs( rc[i - 1] ) > 0.99945f ) + { + flag = 1; /* Test for unstable filter. If unstable keep old A(z) */ + } + for ( j = 1; j <= i / 2; j++ ) + { + l = i - j; + at = a[j] + rc[i - 1] * a[l]; + a[l] += rc[i - 1] * a[j]; + a[j] = at; + } + + a[i] = rc[i - 1]; + + err += rc[i - 1] * s; + + if ( err <= 0.0f ) + { + err = 0.01f; + } + + if ( epsP != NULL ) + { + epsP[i] = err; + } + } + + return ( flag ); +} + +/*-------------------------------------------------------------------* + * a2rc() + * + * Convert from LPC to reflection coeff + *-------------------------------------------------------------------*/ + +static uint16_t d_a2rc( + const double *a, /* i : LPC coefficients */ + double *refl, /* o : Reflection co-efficients */ + const int16_t lpcorder /* i : LPC order */ +) +{ + double ff[LFE_PLC_LPCORD]; + int16_t m, j, n; + double km, denom, x; + + for ( m = 0; m < lpcorder; m++ ) + { + ff[m] = -a[m]; + } + + /* Initialization */ + for ( m = lpcorder - 1; m >= 0; m-- ) + { + km = ff[m]; + if ( km <= -1.0 || km >= 1.0 ) + { + for ( j = 0; j < lpcorder; j++ ) + { + refl[j] = 0.0; + } + + return 0; + } + + refl[m] = -km; + denom = 1.0 / ( 1.0 - km * km ); + for ( j = 0; j < m / 2; j++ ) + { + n = m - 1 - j; + x = denom * ff[j] + km * denom * ff[n]; + ff[n] = denom * ff[n] + km * denom * ff[j]; + ff[j] = x; + } + + if ( m & 1 ) + { + ff[j] = denom * ff[j] + km * denom * ff[j]; + } + } + + return 1; +} + + +static void d_syn_filt( + const double a[], /* i : LP filter coefficients */ + const int16_t m, /* i : order of LP filter */ + const float x[], /* i : input signal */ + float y[], /* o : output signal */ + const int16_t l, /* i : size of filtering */ + const float mem[] /* i : initial filter states */ +) +{ + int16_t i, j; + double buf[LFE_PLC_LPCORD + LFE_PLC_RECLEN]; /* temporary synthesis buffer */ + double s, *yy; + + yy = &buf[0]; + + /*------------------------------------------------------------------* + * copy initial filter states into synthesis buffer and do synthesis + *------------------------------------------------------------------*/ + for ( i = 0; i < m; i++ ) + { + *yy++ = mem[i]; + } + + /*-----------------------------------------------------------------------* + * Do the filtering + *-----------------------------------------------------------------------*/ + + for ( i = 0; i < l; i++ ) + { + s = x[i]; + for ( j = 1; j <= m; j++ ) + { + s -= a[j] * yy[i - j]; + } + + yy[i] = s; + y[i] = (float) s; + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function check_stab() + * + * LPC filter stability check applying given sharpening value delta + *-----------------------------------------------------------------------------------------*/ + +static uint16_t check_stab( + const double *a, + double delta ) +{ + double amod[LFE_PLC_LPCORD], refl[LFE_PLC_LPCORD]; + int16_t i; + double fac; + double fac1; + uint16_t stable; + + fac = 1.0 + delta; + fac1 = fac; + + for ( i = 0; i < LFE_PLC_LPCORD; i++ ) + { + amod[i] = a[i] * fac; + fac *= fac1; + } + stable = d_a2rc( amod, refl, LFE_PLC_LPCORD ); + + return stable; +} + + +/*-----------------------------------------------------------------------------------------* + * Function find_max_delta() + * + * Find maximum LPC filter sharpening by iteration to get a filter that is almost instable + *-----------------------------------------------------------------------------------------*/ + +static double find_max_delta( + double *a ) +{ + double delta; + double eps; + uint16_t stable; + double fac; + + delta = 0.0; + eps = 0.01; + fac = 2; + stable = FALSE; + + while ( check_stab( a, eps ) ) + { + + eps *= fac; + stable = TRUE; + } + fac = 0.5; + + if ( stable ) + { + eps *= fac; + } + + while ( !stable ) + { + eps *= fac; + stable = check_stab( a, eps ); + } + + /* must be stable with current eps */ + delta = eps; + eps *= fac; + + while ( 1 ) + { + delta += eps; + stable = check_stab( a, delta ); + + if ( !stable ) + { + if ( fabs( eps ) > EPS_STOP ) + { + eps = -fabs( eps ) * fac; + } + else + { + eps = -fabs( eps ); + } + } + else + { + if ( fabs( eps ) < EPS_STOP ) + { + break; + } + eps = fabs( eps ) * fac; + } + } + + return delta; +} + + +/*-----------------------------------------------------------------------------------------* + * Function recover_samples() + * + * recover lost samples by extrapolation of signal buffer + *-----------------------------------------------------------------------------------------*/ + +static void recover_samples( + const int16_t bfi_count, + const float *outbuf, + float *rec_frame ) +{ + int16_t i; + float zeroes[LFE_PLC_RECLEN]; + double delta, fac, att; + double d_outbuf[LFE_PLC_BUFLEN], d_r[LFE_PLC_LPCORD + 1], d_a[LFE_PLC_LPCORD + 1], d_pee[LFE_PLC_LPCORD + 1]; + + mvr2d( outbuf, d_outbuf, LFE_PLC_BUFLEN ); + d_autocorr( d_outbuf, d_r, LFE_PLC_LPCORD, LFE_PLC_BUFLEN, d_hamm_lfe_plc, 0, 1, 1 ); + + if ( d_r[0] < POW_THR * LFE_PLC_BUFLEN ) + { + set_zero( rec_frame, LFE_PLC_RECLEN ); + return; + } + d_lev_dur( d_a, d_r, LFE_PLC_LPCORD, d_pee ); + + delta = find_max_delta( d_a + 1 ); + + fac = 1.0 + delta; + att = 1.0; + + if ( bfi_count >= LFE_PLC_MUTE_THR ) + { + att = LFE_PLC_BURST_ATT; + fac *= att; + } + + for ( i = 1; i <= LFE_PLC_LPCORD; i++ ) + { + d_a[i] = d_a[i] * fac; + fac *= att * ( 1.0 + delta ); + } + + set_zero( zeroes, LFE_PLC_RECLEN ); + d_syn_filt( d_a, LFE_PLC_LPCORD, zeroes, rec_frame, LFE_PLC_RECLEN, outbuf + LFE_PLC_BUFLEN - LFE_PLC_LPCORD ); + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_lfe_tdplc() + * + * MDCT interface recover lost samples by extrapolation of signal buffer + *-----------------------------------------------------------------------------------------*/ + +void ivas_lfe_tdplc( + LFE_DEC_HANDLE hLFE, /* i/o: LFE decoder handle */ + const float *prevsynth, /* i : previous frame synthesis */ + float *ytda, /* o : output time-domain buffer */ + const int16_t output_frame /* i : output frame length */ +) +{ + float rec_frame_us[LFE_PLC_RECLEN_48K], input_tda[L_FRAME48k]; + float rec_frame[LFE_PLC_RECLEN], mem[2 * LFE_PLC_FDEL / LFE_PLC_DSF]; + int32_t output_Fs; + int16_t i, fade_len, full_len, dct_len, zero_pad_len, plc_fdel, rec_frame_len; + const float *pWindow_coeffs; + + output_Fs = output_frame * FRAMES_PER_SEC; + fade_len = hLFE->pWindow_state->fade_len; + full_len = hLFE->pWindow_state->full_len; + dct_len = hLFE->pWindow_state->dct_len; + zero_pad_len = hLFE->pWindow_state->zero_pad_len; + pWindow_coeffs = hLFE->pWindow_state->pWindow_coeffs; + + plc_fdel = (int16_t) ( LFE_PLC_FDEL * output_Fs / 48000 ); + rec_frame_len = (int16_t) ( LFE_PLC_RECLEN_48K * output_Fs / 48000 ); + recover_samples( hLFE->bfi_count, prevsynth, rec_frame ); + + set_zero( mem, 2 * LFE_PLC_FDEL / LFE_PLC_DSF ); + + modify_Fs( prevsynth + LFE_PLC_BUFLEN - LFE_PLC_FDEL / LFE_PLC_DSF, LFE_PLC_FDEL / LFE_PLC_DSF, LFE_PLC_FS, rec_frame_us, 48000, mem, 0 ); + modify_Fs( rec_frame, LFE_PLC_RECLEN, LFE_PLC_FS, rec_frame_us, 48000, mem, 0 ); + + /*samples are generated with 48k sampling rate + and then converted to required sampling rate by simple decimation + as signal is already bandlimited*/ + + /*decimation to correct sampling rate*/ + if ( output_Fs != 48000 ) + { + for ( i = 0; i < rec_frame_len; i++ ) + { + rec_frame_us[i] = rec_frame_us[( i * 48000 ) / output_Fs]; + } + } + + for ( i = 0; i < 2; i++ ) + { + ivas_dct_windowing( fade_len, full_len, dct_len, zero_pad_len, pWindow_coeffs, output_frame, input_tda, rec_frame_us + plc_fdel, rec_frame_us + plc_fdel + fade_len + i * dct_len ); + ivas_tda( input_tda, ytda + i * dct_len, dct_len ); + } + + return; +} diff --git a/lib_dec/ivas_ls_custom_dec.c b/lib_dec/ivas_ls_custom_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..e926b1fbe8c13e65d72cfb872f87b3abe03e936f --- /dev/null +++ b/lib_dec/ivas_ls_custom_dec.c @@ -0,0 +1,118 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ +#include +#include "options.h" +#include "ivas_prot.h" +#include "prot.h" +#include "wmc_auto.h" + + +/*-----------------------------------------------------------------------* + * ivas_ls_custom_open() + * + * Allocate Custom LS layout handle + *-----------------------------------------------------------------------*/ + +ivas_error ivas_ls_custom_open( + LSSETUP_CUSTOM_HANDLE *hLsSetupCustom /* o : Custom loudspeaker setup handle */ +) +{ + /* Allocate handle */ + if ( ( *hLsSetupCustom = (LSSETUP_CUSTOM_HANDLE) malloc( sizeof( LSSETUP_CUSTOM_STRUCT ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Custom LS layout memory\n" ) ); + } + + ( *hLsSetupCustom )->num_spk = -1; + ( *hLsSetupCustom )->is_planar_setup = -1; + + set_zero( ( *hLsSetupCustom )->ls_azimuth, MAX_OUTPUT_CHANNELS ); + set_zero( ( *hLsSetupCustom )->ls_elevation, MAX_OUTPUT_CHANNELS ); + + ( *hLsSetupCustom )->num_lfe = -1; + set_s( ( *hLsSetupCustom )->lfe_idx, -1, MAX_OUTPUT_CHANNELS ); + + ( *hLsSetupCustom )->separate_ch_found = -1; + set_f( ( *hLsSetupCustom )->separate_ch_gains, 0.0f, MAX_OUTPUT_CHANNELS ); + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------------* + * ivas_output_init_ls_custom() + * + * Setup an IVAS_OUTPUT_SETUP_HANDLE from a custom loudspeaker setup + *-------------------------------------------------------------------------*/ + +void ivas_ls_custom_setup( + IVAS_OUTPUT_SETUP_HANDLE hOutSetup, /* o : IVAS output setup handle */ + const LSSETUP_CUSTOM_STRUCT *hLsSetupCustom /* i : Custom loudspeaker setup handle */ +) +{ + hOutSetup->output_config = IVAS_AUDIO_CONFIG_LS_CUSTOM; + + hOutSetup->nchan_out_woLFE = hLsSetupCustom->num_spk; + hOutSetup->ls_azimuth = hLsSetupCustom->ls_azimuth; + hOutSetup->ls_elevation = hLsSetupCustom->ls_elevation; + + hOutSetup->num_lfe = hLsSetupCustom->num_lfe; + hOutSetup->index_lfe[0] = hLsSetupCustom->lfe_idx[0]; /* IVAS_OUTPUT_SETUP only supports 1 LFE */ + + hOutSetup->is_loudspeaker_setup = TRUE; + hOutSetup->is_planar_setup = (int8_t) hLsSetupCustom->is_planar_setup; + + return; +} + +/*-----------------------------------------------------------------------* + * ivas_ls_custom_output_init() + * + * Initialize decoder output handles + *-----------------------------------------------------------------------*/ + +ivas_error ivas_ls_custom_output_init( + Decoder_Struct *st_ivas /* i/o: IVAS decoder handle */ +) +{ + if ( st_ivas->hLsSetupCustom == NULL ) + { + return IVAS_ERR_WRONG_PARAMS; + } + + st_ivas->hDecoderConfig->nchan_out = st_ivas->hLsSetupCustom->num_spk + st_ivas->hLsSetupCustom->num_lfe; + + ivas_ls_custom_setup( &( st_ivas->hOutSetup ), st_ivas->hLsSetupCustom ); + ivas_ls_custom_setup( &( st_ivas->hIntSetup ), st_ivas->hLsSetupCustom ); + + return IVAS_ERR_OK; +} diff --git a/lib_dec/ivas_masa_dec.c b/lib_dec/ivas_masa_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..73fca37fd8e77d5d884e1e7d609c2f5c2a37f6ac --- /dev/null +++ b/lib_dec/ivas_masa_dec.c @@ -0,0 +1,2428 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include +#include "ivas_cnst.h" +#include "ivas_prot.h" +#include "ivas_prot_rend.h" +#include "ivas_rom_com.h" +#include "ivas_stat_dec.h" +#include "prot.h" +#include +#include "wmc_auto.h" + +/*-----------------------------------------------------------------------* + * Local constants + *-----------------------------------------------------------------------*/ + +#define SPAR_META_DELAY_SUBFRAMES 2 /* Number of subframes to delay the SPAR metadata */ +#define SPH_IDX_FRONT ( MASA_NO_POINTS_EQUATOR / 2 ) /* Spherical index corresponding to front direction for setting as default value */ + + +/*-----------------------------------------------------------------------* + * Local function prototypes + *-----------------------------------------------------------------------*/ + +static void index_16bits( IVAS_QMETADATA_HANDLE hQMetaData, SPHERICAL_GRID_DATA *Sph_Grid16 ); + +static void create_masa_ext_out_meta( MASA_DECODER *hMasa, IVAS_QMETADATA_HANDLE hQMetaData, const int16_t nchan_transport ); + +static void replicate_subframes( IVAS_QMETADATA_HANDLE hQMetaData ); + +static void restore_lowbitrate_masa( IVAS_QMETADATA_HANDLE hQMetaData, const int16_t low_bitrate_mode, const int16_t numCodingBands ); + +static ivas_error init_lfe_synth_data( Decoder_Struct *st_ivas, MASA_DECODER_HANDLE hMasa ); + +static void compute_foa_cov_matrix( float foaCov[FOA_CHANNELS][FOA_CHANNELS], float inCov[FOA_CHANNELS][FOA_CHANNELS], float mixMtx[FOA_CHANNELS][FOA_CHANNELS] ); + +static int16_t decode_lfe_to_total_energy_ratio( MCMASA_LFE_SYNTH_DATA_HANDLE hMasaLfeSynth, uint16_t *bitstream, int16_t *index, const int32_t ivas_total_brate ); + +static ivas_error ivas_masa_dec_config( Decoder_Struct *st_ivas ); + +static int16_t ivas_decode_masaism_metadata( IVAS_QMETADATA_HANDLE hQMetaData, MASA_DECODER_HANDLE hMasa, MASA_ISM_DATA_HANDLE hMasaIsmData, const int16_t nchan_ism, uint16_t *bit_stream, int16_t *next_bit_pos, const int16_t idx_separated_object, const int16_t ism_imp, const int16_t dirac_bs_md_write_idx, const int16_t dirac_md_buffer_length ); + +static void decode_index_slice( int16_t index, int16_t *ratio_idx_ism, const int16_t nchan_ism, const int16_t K ); + +static void decode_ism_ratios( uint16_t *bit_stream, int16_t *next_bit_pos, float masa_to_total_energy_ratio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], float ratio_ism[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS][MAX_NUM_OBJECTS], const int16_t nchan_ism, const int16_t nbands, const int16_t nblocks, const int16_t idx_separated_object ); + +static void read_ism_ratio_index( int16_t ratio_ism_idx[MASA_FREQUENCY_BANDS][MAX_NUM_OBJECTS], const int16_t nchan_ism, const int16_t numCodingBands, const int16_t sf, int16_t ratio_ism_idx_prev_sf[MASA_FREQUENCY_BANDS][MAX_NUM_OBJECTS], uint16_t *bit_stream, int16_t *next_bit_pos, float *masa_to_total_energy_ratio, const int16_t idx_sep_obj, int16_t *num_zeros ); + + +/*-----------------------------------------------------------------------* + * ivas_masa_decode() + * + * MASA metadata decoder + *-----------------------------------------------------------------------*/ + +ivas_error ivas_masa_decode( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */ + Decoder_State *st, /* i/o: decoder state structure with bitstream */ + int16_t *nb_bits_read /* o : number of bits read */ +) +{ + uint16_t byteBuffer; + int16_t next_bit_pos_orig; + int32_t masa_brate, ivas_total_brate; + MASA_DECODER_HANDLE hMasa; + IVAS_QMETADATA_HANDLE hQMetaData; + IVAS_FORMAT ivas_format; + int16_t low_bitrate_mode, tmp_elem_mode; + ivas_error error; + int16_t obj; + int16_t i, ch, ism_imp; + int16_t dirac_bs_md_write_idx; + int32_t masa_total_brate; + + dirac_bs_md_write_idx = 0; + ism_imp = 0; + + error = IVAS_ERR_OK; + ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; + + low_bitrate_mode = -1; /* This means that LBR mode is not used. */ + + if ( st_ivas->hOutSetup.separateChannelEnabled || st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_DISC ) + { + masa_brate = st_ivas->hCPE[0]->element_brate; + } + else + { + masa_brate = ivas_total_brate; + } + + hMasa = st_ivas->hMasa; + hQMetaData = st_ivas->hQMetaData; + ivas_format = st_ivas->ivas_format; + + hMasa->data.dir_decode_quality = 1.0f; /* Set to default of max quality */ + hQMetaData->is_masa_ivas_format = 1; + + *nb_bits_read = 0; + next_bit_pos_orig = st->next_bit_pos; + if ( masa_brate == IVAS_SID_5k2 ) + { + st->next_bit_pos = (int16_t) ( ( masa_brate / FRAMES_PER_SEC ) - 1 - SID_FORMAT_NBITS ); + } + else + { + st->next_bit_pos = (int16_t) ( ( masa_brate / FRAMES_PER_SEC ) - 1 ); + } + + if ( !st->bfi && ivas_total_brate > IVAS_SID_5k2 ) + { + if ( !( ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCMASA ) ) + { + if ( ivas_format != MASA_ISM_FORMAT ) + { + /* number of transport channels is always 2 for MASA_ISM format */ + /* the number of MASA transport channels was read in ivas_dec_setup() */ + st->next_bit_pos -= MASA_TRANSP_BITS; + *nb_bits_read += MASA_TRANSP_BITS; + } + + if ( ivas_format == MASA_ISM_FORMAT && st_ivas->ism_mode != ISM_MODE_NONE ) + { + /* the number of objects was read */ + st->next_bit_pos -= NO_BITS_MASA_ISM_NO_OBJ; + *nb_bits_read += NO_BITS_MASA_ISM_NO_OBJ; + + if ( st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) + { + /* read index of separated object */ + /* nchan_ism should be > 1*/ + byteBuffer = st->bit_stream[( st->next_bit_pos )--]; + ( *nb_bits_read )++; + st_ivas->hMasaIsmData->idx_separated_ism = 2 * byteBuffer + st->bit_stream[( st->next_bit_pos )--]; + ( *nb_bits_read )++; + } + else + { + st_ivas->hMasaIsmData->idx_separated_ism = -1; + } + + /* read ISM importance flag (one per object) */ + if ( st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) + { + ism_imp = 0; + for ( i = 0; i < ISM_METADATA_FLAG_BITS; i++ ) + { + byteBuffer = st->bit_stream[( st->next_bit_pos )--]; + ( *nb_bits_read )++; + ism_imp = ( ism_imp << 1 ) + byteBuffer; + } + st_ivas->hIsmMetaData[0]->ism_imp = ism_imp; + } + + if ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) + { + ism_imp = 0; + for ( i = 0; i < ISM_METADATA_FLAG_BITS; i++ ) + { + byteBuffer = st->bit_stream[( st->next_bit_pos )--]; + ( *nb_bits_read )++; + ism_imp = ( ism_imp << 1 ) + byteBuffer; + } + st_ivas->hIsmMetaData[0]->ism_imp = ism_imp; + + /* reset */ + st_ivas->hIsmMetaData[0]->ism_md_null_flag = 0; + st_ivas->hIsmMetaData[0]->ism_md_lowrate_flag = 0; + if ( st_ivas->hIsmMetaData[0]->ism_imp == ISM_NO_META ) + { + /* read flags */ + st_ivas->hIsmMetaData[0]->ism_md_null_flag = st->bit_stream[( st->next_bit_pos )--]; + ( *nb_bits_read ) += ISM_METADATA_MD_FLAG_BITS; + st_ivas->hIsmMetaData[0]->ism_md_lowrate_flag = st->bit_stream[( st->next_bit_pos )--]; + ( *nb_bits_read ) += ISM_METADATA_INACTIVE_FLAG_BITS; + } + } + else if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC ) + { + for ( ch = 0; ch < st_ivas->nchan_ism; ch++ ) + { + ism_imp = 0; + for ( i = 0; i < ISM_METADATA_FLAG_BITS; i++ ) + { + byteBuffer = st->bit_stream[( st->next_bit_pos )--]; + ( *nb_bits_read )++; + ism_imp = ( ism_imp << 1 ) + byteBuffer; + } + st_ivas->hIsmMetaData[ch]->ism_imp = ism_imp; + + /* reset */ + st_ivas->hIsmMetaData[ch]->ism_md_null_flag = 0; + st_ivas->hIsmMetaData[ch]->ism_md_lowrate_flag = 0; + if ( st_ivas->hIsmMetaData[ch]->ism_imp == ISM_NO_META ) + { + /* read flags */ + st_ivas->hIsmMetaData[ch]->ism_md_null_flag = st->bit_stream[( st->next_bit_pos )--]; + ( *nb_bits_read ) += ISM_METADATA_MD_FLAG_BITS; + st_ivas->hIsmMetaData[ch]->ism_md_lowrate_flag = st->bit_stream[( st->next_bit_pos )--]; + ( *nb_bits_read ) += ISM_METADATA_INACTIVE_FLAG_BITS; + } + } + st_ivas->flag_omasa_brate = 0; + if ( st_ivas->nchan_ism >= 3 && ivas_total_brate == IVAS_128k ) + { + st_ivas->flag_omasa_brate = st->bit_stream[( st->next_bit_pos )--]; + ( *nb_bits_read ) += 1; + } + } + } + + /* read the MASA_ISM_FORMAT bit */ + byteBuffer = st->bit_stream[( st->next_bit_pos )--]; + if ( byteBuffer == 1 ) + { + hMasa->config.input_ivas_format = MASA_ISM_FORMAT; + } + else + { + hMasa->config.input_ivas_format = MASA_FORMAT; + } + /* reserved bit */ + byteBuffer = st->bit_stream[( st->next_bit_pos )--]; + *nb_bits_read += MASA_HEADER_BITS; + + /* read number of directions */ + byteBuffer = st->bit_stream[( st->next_bit_pos )--]; + ( *nb_bits_read )++; + hMasa->config.numberOfDirections = (uint8_t) ( byteBuffer + 1 ); + } + else + { + hMasa->config.numberOfDirections = 1; + } + + if ( !( ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCMASA ) ) + { + /* read subframe mode */ + byteBuffer = st->bit_stream[( st->next_bit_pos )--]; + ( *nb_bits_read )++; + hMasa->config.joinedSubframes = (uint8_t) byteBuffer; + } + else + { + hMasa->config.joinedSubframes = FALSE; + } + + if ( st_ivas->mc_mode == MC_MODE_MCMASA ) + { + *nb_bits_read += decode_lfe_to_total_energy_ratio( hMasa->hMasaLfeSynth, st->bit_stream, &st->next_bit_pos, ivas_total_brate ); + } + + /* Once we know incoming configuration, we can config decoder further based on bitrate etc. */ + if ( ( error = ivas_masa_dec_config( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* If we are under metadata bit budget limit and joined subframes is not signalled, then read LBR mode. */ + if ( hMasa->config.max_metadata_bits < MINIMUM_BIT_BUDGET_NORMAL_META && hMasa->config.joinedSubframes == FALSE ) + { + /* read low bitrate mode */ + byteBuffer = st->bit_stream[( st->next_bit_pos )--]; + ( *nb_bits_read )++; + low_bitrate_mode = byteBuffer; + + if ( low_bitrate_mode == 1 ) + { + hQMetaData->q_direction[0].cfg.nblocks = 1; + } + else + { + hQMetaData->q_direction[0].cfg.nbands = 1; + } + } + + /* Remove already read bits from the bit budget */ + hQMetaData->metadata_max_bits -= *nb_bits_read; + + if ( st_ivas->ivas_format == MASA_ISM_FORMAT ) + { + if ( st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) + { + if ( st_ivas->hDirAC != NULL ) + { + *nb_bits_read += ivas_decode_masaism_metadata( hQMetaData, st_ivas->hMasa, st_ivas->hMasaIsmData, st_ivas->nchan_ism, st->bit_stream, &st->next_bit_pos, + st_ivas->hMasaIsmData->idx_separated_ism, ism_imp, st_ivas->hSpatParamRendCom->dirac_bs_md_write_idx, st_ivas->hSpatParamRendCom->dirac_md_buffer_length ); + + for ( obj = 0; obj <= st_ivas->nchan_ism; obj++ ) + { + if ( st_ivas->hMasaIsmData->idx_separated_ism == obj ) + { + int16_t sf; + int16_t meta_write_index; + + for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) + { + meta_write_index = ( st_ivas->hSpatParamRendCom->dirac_bs_md_write_idx + sf ) % st_ivas->hSpatParamRendCom->dirac_md_buffer_length; + st_ivas->hMasaIsmData->azimuth_separated_ism[meta_write_index] = st_ivas->hMasaIsmData->azimuth_ism[obj][meta_write_index]; + st_ivas->hMasaIsmData->elevation_separated_ism[meta_write_index] = st_ivas->hMasaIsmData->elevation_ism[obj][meta_write_index]; + } + } + } + } + else + { + *nb_bits_read += ivas_decode_masaism_metadata( hQMetaData, st_ivas->hMasa, st_ivas->hMasaIsmData, st_ivas->nchan_ism, st->bit_stream, &st->next_bit_pos, + st_ivas->hMasaIsmData->idx_separated_ism, ism_imp, 0, MAX_PARAM_SPATIAL_SUBFRAMES ); + } + } + } + + masa_total_brate = ivas_total_brate; + if ( ivas_format == MASA_ISM_FORMAT && st_ivas->ism_mode == ISM_MASA_MODE_DISC ) + { + masa_total_brate = calculate_cpe_brate_MASA_ISM( st_ivas->ism_mode, ivas_total_brate, st_ivas->nchan_ism ); + } + + if ( masa_total_brate >= IVAS_384k ) + { + if ( masa_total_brate >= IVAS_512k ) + { + *nb_bits_read += ivas_qmetadata_dec_decode_hr_384_512( hQMetaData, st->bit_stream, &st->next_bit_pos, hMasa->data.sph_grid16, 16, 4, hMasa->config.numCodingBands ); + } + else + { + *nb_bits_read += ivas_qmetadata_dec_decode_hr_384_512( hQMetaData, st->bit_stream, &st->next_bit_pos, hMasa->data.sph_grid16, 11, 3, hMasa->config.numCodingBands ); + } + } + else + { + *nb_bits_read += ivas_qmetadata_dec_decode( hQMetaData, st->bit_stream, &st->next_bit_pos, 0 ); + } + + if ( st_ivas->ivas_format == MASA_ISM_FORMAT && st_ivas->ism_mode != ISM_MASA_MODE_DISC && st_ivas->ism_mode != ISM_MASA_MODE_MASA_ONE_OBJ ) + { + /* Modify spatial metadata based on the MASA-to-total energy ratios */ + ivas_omasa_modify_masa_energy_ratios( hQMetaData, st_ivas->hMasaIsmData->masa_to_total_energy_ratio ); + } + + /* Get direction decoding quality. EC 1 and 2 are handled by the default value. */ + if ( hQMetaData->ec_flag == 2 ) + { + hMasa->data.dir_decode_quality = hQMetaData->dir_comp_ratio; + } + + hMasa->config.coherencePresent = !hQMetaData->all_coherence_zero; + + if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) + { + index_16bits( hQMetaData, hMasa->data.sph_grid16 ); + } + + /* If LBR mode is not disabled, then we restore metadata to 5 bands and 4 subframes based on the LBR mode. */ + if ( low_bitrate_mode != -1 ) + { + restore_lowbitrate_masa( hQMetaData, low_bitrate_mode, hMasa->config.numCodingBands ); + } + else if ( hMasa->config.joinedSubframes == TRUE ) + { + replicate_subframes( hQMetaData ); + } + } + else if ( !st->bfi && ivas_format == MASA_FORMAT && ivas_total_brate == IVAS_SID_5k2 ) + { + if ( hQMetaData->q_direction == NULL ) + { + /* replicate ivas_masa_dec_config() in case that first good received frame is SID frame */ + if ( ( error = ivas_masa_dec_config( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + + ivas_masa_set_elements( ivas_total_brate, st_ivas->mc_mode, st_ivas->nchan_transport, hQMetaData, &st_ivas->element_mode_init, &st_ivas->nSCE, &st_ivas->nCPE, st_ivas->ivas_format, st_ivas->ism_mode, 0 ); + + hQMetaData->metadata_max_bits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC; + + if ( ( error = ivas_qmetadata_allocate_memory( hQMetaData, 5, 1, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + + hQMetaData->numTwoDirBands = hMasa->config.numTwoDirBands; + hQMetaData->useLowerRes = 0; + + hQMetaData->q_direction->cfg.nbands = 5; + hQMetaData->q_direction->cfg.nblocks = 4; + + if ( ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCMASA ) + { + hQMetaData->q_direction->cfg.mc_ls_setup = ivas_mc_map_output_config_to_mc_ls_setup( st_ivas->transport_config ); + } + else + { + hQMetaData->q_direction->cfg.mc_ls_setup = MC_LS_SETUP_INVALID; + } + } + + tmp_elem_mode = -1; + *nb_bits_read += ivas_qmetadata_dec_sid_decode( hQMetaData, st->bit_stream, &( st->next_bit_pos ), st_ivas->nchan_transport, &tmp_elem_mode, ivas_format ); + if ( st_ivas->nchan_transport == 2 ) + { + assert( st_ivas->nCPE > 0 ); + st_ivas->hCPE[0]->element_mode = tmp_elem_mode; + } + *nb_bits_read += SID_FORMAT_NBITS; + } + else if ( !st->bfi && ivas_format == MASA_FORMAT && ivas_total_brate == FRAME_NO_DATA ) + { + if ( hQMetaData->q_direction == NULL ) + { + if ( ( error = ivas_masa_dec_config( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + + if ( st_ivas->hDirAC != NULL ) + { + dirac_bs_md_write_idx = st_ivas->hSpatParamRendCom->dirac_bs_md_write_idx; /* Store the write-index for this frame */ + ivas_qmetadata_to_dirac( hQMetaData, st_ivas->hDirAC, hMasa, st_ivas->hSpatParamRendCom, ivas_total_brate, ivas_format, 0, 0 ); + } + + if ( st_ivas->ivas_format == MASA_ISM_FORMAT ) + { + if ( hQMetaData->q_direction == NULL ) + { + if ( ( error = ivas_masa_dec_config( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( st_ivas->hDirAC != NULL ) + { + int16_t b; + int16_t block; + int16_t meta_write_index; + + for ( i = 0; i < st_ivas->hSpatParamRendCom->numIsmDirections; i++ ) + { + for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ ) + { + meta_write_index = ( dirac_bs_md_write_idx + block ) % st_ivas->hSpatParamRendCom->dirac_md_buffer_length; + + for ( b = 0; b < st_ivas->hSpatParamRendCom->num_freq_bands; b++ ) + { + st_ivas->hSpatParamRendCom->diffuseness_vector[meta_write_index][b] -= st_ivas->hMasaIsmData->energy_ratio_ism[i][meta_write_index][b]; + } + } + } + + for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ ) + { + meta_write_index = ( dirac_bs_md_write_idx + block ) % st_ivas->hSpatParamRendCom->dirac_md_buffer_length; + + for ( b = 0; b < st_ivas->hSpatParamRendCom->num_freq_bands; b++ ) + { + st_ivas->hSpatParamRendCom->diffuseness_vector[meta_write_index][b] = max( 0.0f, st_ivas->hSpatParamRendCom->diffuseness_vector[meta_write_index][b] ); + } + } + } + } + + st->next_bit_pos = next_bit_pos_orig; + + if ( ivas_format == MASA_ISM_FORMAT ) + { + int32_t cpe_brate; + cpe_brate = calculate_cpe_brate_MASA_ISM( st_ivas->ism_mode, ivas_total_brate, st_ivas->nchan_ism ); + + if ( st_ivas->nCPE == 1 && st_ivas->hCPE[0]->hStereoDft != NULL && st_ivas->hCPE[0]->hStereoDft->hConfig != NULL ) + { + st_ivas->hCPE[0]->hStereoDft->hConfig->force_mono_transmission = cpe_brate < MASA_STEREO_MIN_BITRATE ? 1 : 0; + + if ( ivas_total_brate <= IVAS_SID_5k2 ) + { + st_ivas->hCPE[0]->hStereoDft->hConfig->force_mono_transmission = 0; + } + } + } + else + { + if ( ivas_format == MASA_FORMAT && st_ivas->nCPE == 1 && st_ivas->hCPE[0]->hStereoDft != NULL && st_ivas->hCPE[0]->hStereoDft->hConfig != NULL ) + { + st_ivas->hCPE[0]->hStereoDft->hConfig->force_mono_transmission = ivas_total_brate < MASA_STEREO_MIN_BITRATE ? 1 : 0; + + if ( ivas_total_brate <= IVAS_SID_5k2 ) + { + st_ivas->hCPE[0]->hStereoDft->hConfig->force_mono_transmission = 0; + } + } + } + + if ( ivas_format == MASA_FORMAT && st_ivas->nCPE == 1 ) + { + st_ivas->hCPE[0]->hCoreCoder[0]->masa_sid_format = 0; + + if ( st_ivas->hDecoderConfig->last_ivas_total_brate <= IVAS_SID_5k2 ) + { + st_ivas->hCPE[0]->hCoreCoder[0]->masa_sid_format = 1; + + if ( ivas_total_brate >= IVAS_SID_5k2 ) + { + st_ivas->hCPE[0]->element_brate = ivas_total_brate; + } + } + } + + if ( ( st_ivas->ivas_format == MASA_FORMAT || st_ivas->ivas_format == MASA_ISM_FORMAT ) && st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) + { + create_masa_ext_out_meta( hMasa, hQMetaData, st_ivas->nchan_transport ); + } + + return error /* *nb_bits_read*/; +} + + +/*-------------------------------------------------------------------* + * ivas_masa_dec_open() + * + * + *-------------------------------------------------------------------*/ + +ivas_error ivas_masa_dec_open( + Decoder_Struct *st_ivas /* i/o: IVAS decoder handle */ +) +{ + MASA_DECODER_HANDLE hMasa; + ivas_error error; + int16_t i; + int32_t ism_total_brate; + + error = IVAS_ERR_OK; + + if ( ( hMasa = (MASA_DECODER_HANDLE) malloc( sizeof( MASA_DECODER ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA decoder\n" ) ); + } + + ism_total_brate = 0; + if ( st_ivas->ivas_format == MASA_ISM_FORMAT && st_ivas->nSCE > 0 && ( st_ivas->ism_mode == ISM_MASA_MODE_DISC || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) ) + { + for ( i = 0; i < st_ivas->nSCE; i++ ) + { + ism_total_brate += st_ivas->hSCE[i]->element_brate; + } + } + + ivas_masa_set_elements( st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->mc_mode, st_ivas->nchan_transport, st_ivas->hQMetaData, &st_ivas->element_mode_init, &st_ivas->nSCE, &st_ivas->nCPE, st_ivas->ivas_format, st_ivas->ism_mode, ism_total_brate ); + + mvs2s( DirAC_block_grouping, hMasa->config.block_grouping, MAX_PARAM_SPATIAL_SUBFRAMES + 1 ); + mvs2s( MASA_band_grouping_24, hMasa->config.band_grouping, MASA_FREQUENCY_BANDS + 1 ); + hMasa->config.numberOfDirections = 1; + hMasa->config.joinedSubframes = FALSE; + + /* Create spherical grid only for external output */ + if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) + { + if ( ( hMasa->data.sph_grid16 = (SPHERICAL_GRID_DATA *) malloc( sizeof( SPHERICAL_GRID_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA decoder\n" ) ); + } + + generate_gridEq( hMasa->data.sph_grid16 ); + if ( ( hMasa->data.extOutMeta = (MASA_DECODER_EXT_OUT_META *) malloc( sizeof( MASA_DECODER_EXT_OUT_META ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA decoder\n" ) ); + } + } + else + { + hMasa->data.sph_grid16 = NULL; + hMasa->data.extOutMeta = NULL; + } + + if ( st_ivas->mc_mode == MC_MODE_MCMASA ) + { + error = init_lfe_synth_data( st_ivas, hMasa ); + } + else + { + hMasa->hMasaLfeSynth = NULL; + } + + st_ivas->hMasa = hMasa; + + /* allocate transport channels*/ + if ( st_ivas->hDecoderConfig->Opt_5ms && st_ivas->hTcBuffer == NULL && st_ivas->renderer_type != RENDERER_DISABLE && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC_ROOM && st_ivas->renderer_type != RENDERER_STEREO_PARAMETRIC ) + { + int16_t nchan_to_allocate, nchan_transport; + TC_BUFFER_MODE buffer_mode; + + buffer_mode = TC_BUFFER_MODE_RENDERER; + if ( st_ivas->mc_mode == MC_MODE_MCMASA && ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_STEREO || st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_MONO ) ) + { + buffer_mode = TC_BUFFER_MODE_BUFFER; + } + else if ( st_ivas->ivas_format == MASA_ISM_FORMAT && st_ivas->renderer_type == RENDERER_MONO_DOWNMIX ) + { + buffer_mode = TC_BUFFER_MODE_BUFFER; + } + + nchan_transport = ivas_jbm_dec_get_num_tc_channels( st_ivas ); + nchan_to_allocate = nchan_transport; + + if ( st_ivas->ivas_format == MASA_ISM_FORMAT && st_ivas->renderer_type == RENDERER_MONO_DOWNMIX ) + { + nchan_transport = 1; + nchan_to_allocate = 1; + } + else if ( st_ivas->nchan_transport == 1 && ( st_ivas->renderer_type == RENDERER_DIRAC ) ) + { + /* addtl channel for CNG */ + nchan_to_allocate++; + } + + if ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, buffer_mode, nchan_transport, nchan_to_allocate, nchan_to_allocate, NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + return error; +} + + +/*-----------------------------------------------------------------------* + * ivas_masa_dec_close() + * + * close MASA decoder + *-----------------------------------------------------------------------*/ + +void ivas_masa_dec_close( + MASA_DECODER_HANDLE *hMasa_out /* i/o: MASA metadata structure */ +) +{ + MASA_DECODER_HANDLE hMasa; + + if ( hMasa_out == NULL || *hMasa_out == NULL ) + { + return; + } + + hMasa = *hMasa_out; + + /* Free spherical grid memory if in use */ + if ( hMasa->data.sph_grid16 != NULL ) + { + free( hMasa->data.sph_grid16 ); + hMasa->data.sph_grid16 = NULL; + } + + if ( hMasa->data.extOutMeta != NULL ) + { + free( hMasa->data.extOutMeta ); + hMasa->data.extOutMeta = NULL; + } + + if ( hMasa->hMasaLfeSynth != NULL ) + { + if ( hMasa->hMasaLfeSynth->lfeSynthRingBuffer != NULL ) + { + free( hMasa->hMasaLfeSynth->lfeSynthRingBuffer ); + hMasa->hMasaLfeSynth->lfeSynthRingBuffer = NULL; + } + if ( hMasa->hMasaLfeSynth->lfeSynthRingBuffer2 != NULL ) + { + free( hMasa->hMasaLfeSynth->lfeSynthRingBuffer2 ); + hMasa->hMasaLfeSynth->lfeSynthRingBuffer2 = NULL; + } + if ( hMasa->hMasaLfeSynth->delayBuffer_syncLp != NULL ) + { + free( hMasa->hMasaLfeSynth->delayBuffer_syncLp ); + hMasa->hMasaLfeSynth->delayBuffer_syncLp = NULL; + } + if ( hMasa->hMasaLfeSynth->delayBuffer_syncDirAC != NULL ) + { + free( hMasa->hMasaLfeSynth->delayBuffer_syncDirAC ); + hMasa->hMasaLfeSynth->delayBuffer_syncDirAC = NULL; + } + free( hMasa->hMasaLfeSynth ); + hMasa->hMasaLfeSynth = NULL; + } + + free( *hMasa_out ); + *hMasa_out = NULL; + + return; +} + + +/*-------------------------------------------------------------------* + * ivas_masa_dec_config() + * + * Frame-by-frame configuration of MASA decoder + *-------------------------------------------------------------------*/ + +static ivas_error ivas_masa_dec_config( + Decoder_Struct *st_ivas /* i/o: IVAS decoder handle */ +) +{ + int16_t i; + MASA_DECODER_HANDLE hMasa; + uint8_t maxBand; + int16_t maxBin; + ivas_error error; + int32_t ivas_total_brate; + int32_t ism_total_brate; + error = IVAS_ERR_OK; + hMasa = st_ivas->hMasa; + + ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; + ism_total_brate = 0; + if ( st_ivas->ivas_format == MASA_ISM_FORMAT && st_ivas->nSCE > 0 && ( st_ivas->ism_mode == ISM_MASA_MODE_DISC || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) ) + { + for ( i = 0; i < st_ivas->nSCE; i++ ) + { + ism_total_brate += st_ivas->hSCE[i]->element_brate; + } + } + + ivas_masa_set_elements( ivas_total_brate, st_ivas->mc_mode, st_ivas->nchan_transport, st_ivas->hQMetaData, &st_ivas->element_mode_init, &st_ivas->nSCE, &st_ivas->nCPE, st_ivas->ivas_format, st_ivas->ism_mode, ism_total_brate ); + + if ( st_ivas->ivas_format == MASA_ISM_FORMAT ) + { + ivas_masa_set_coding_config( &( hMasa->config ), hMasa->data.band_mapping, st_ivas->hCPE[0]->element_brate, st_ivas->nchan_transport, MC_MODE_NONE ); + } + else + { + ivas_masa_set_coding_config( &( hMasa->config ), hMasa->data.band_mapping, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCMASA ) ); + } + + if ( ( st_ivas->ivas_format == MASA_FORMAT || st_ivas->ivas_format == MASA_ISM_FORMAT ) && st_ivas->hDecoderConfig->ivas_total_brate == IVAS_512k ) + { + hMasa->config.mergeRatiosOverSubframes = 0; + + /* initialize spherical grid */ + if ( hMasa->data.sph_grid16 == NULL ) + { + if ( ( hMasa->data.sph_grid16 = (SPHERICAL_GRID_DATA *) malloc( sizeof( SPHERICAL_GRID_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA data handle\n" ) ); + } + generate_gridEq( hMasa->data.sph_grid16 ); + } + } + st_ivas->hQMetaData->metadata_max_bits = hMasa->config.max_metadata_bits; + st_ivas->hQMetaData->bandMap = hMasa->data.band_mapping; + st_ivas->hQMetaData->nchan_transport = st_ivas->nchan_transport; + + if ( ( error = ivas_qmetadata_allocate_memory( st_ivas->hQMetaData, hMasa->config.numCodingBands, hMasa->config.numberOfDirections, hMasa->config.useCoherence ) ) != IVAS_ERR_OK ) + { + return error; + } + + st_ivas->hQMetaData->numTwoDirBands = st_ivas->hMasa->config.numTwoDirBands; + st_ivas->hQMetaData->useLowerRes = 0; + + for ( i = 0; i < st_ivas->hQMetaData->no_directions; i++ ) + { + st_ivas->hQMetaData->q_direction[i].cfg.nbands = hMasa->config.numCodingBands; + st_ivas->hQMetaData->q_direction[i].cfg.nblocks = hMasa->config.joinedSubframes == TRUE ? 1 : 4; + + if ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCMASA ) + { + st_ivas->hQMetaData->q_direction[i].cfg.mc_ls_setup = ivas_mc_map_output_config_to_mc_ls_setup( st_ivas->transport_config ); + } + else + { + st_ivas->hQMetaData->q_direction[i].cfg.mc_ls_setup = MC_LS_SETUP_INVALID; + } + } + + ivas_set_qmetadata_maxbit_req( st_ivas->hQMetaData, st_ivas->ivas_format ); + + /* Find maximum band usable */ + maxBin = (int16_t) ( st_ivas->hDecoderConfig->output_Fs * INV_CLDFB_BANDWIDTH ); + maxBand = 0; + while ( maxBand <= MASA_FREQUENCY_BANDS && MASA_band_grouping_24[maxBand] <= maxBin ) + { + maxBand++; + } + maxBand--; + + if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) + { + /* need to apply the sampling rate correction also for the EXT output MASA meta buffer */ + masa_sample_rate_band_correction( &( hMasa->config ), hMasa->data.band_mapping, st_ivas->hQMetaData, maxBand, 0, hMasa->data.extOutMeta ); + } + else + { + masa_sample_rate_band_correction( &( hMasa->config ), hMasa->data.band_mapping, st_ivas->hQMetaData, maxBand, 0, NULL ); + } + + return error; +} + + +/*-------------------------------------------------------------------* + * ivas_masa_prerender() + * + * Apply gaining and copying of transport signals when needed + *-------------------------------------------------------------------*/ + +void ivas_masa_prerender( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + float *output[], /* i/o: synthesized core-coder transport channels */ + const int16_t output_frame, /* i : output frame length per channel */ + const int16_t nchan_remapped /* i : number of transports used in core */ +) +{ + if ( st_ivas->ivas_format == MASA_FORMAT && st_ivas->nchan_transport == 2 && nchan_remapped == 1 ) + { + if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) + { + mvr2r( output[0], output[1], output_frame ); /* Copy mono signal to stereo output channels */ + } + else + { + if ( st_ivas->renderer_type == RENDERER_DIRAC || st_ivas->renderer_type == RENDERER_DISABLE ) + { + v_multc( output[0], SQRT2, output[0], output_frame ); /* Gain transport signal when transmitting mono with cpe in order to match loudness */ + } + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * Local functions + *-------------------------------------------------------------------*/ + +static void index_16bits( + IVAS_QMETADATA_HANDLE hQMetaData, + SPHERICAL_GRID_DATA *Sph_Grid16 ) +{ + int16_t d, band, block; + + for ( d = 0; d < hQMetaData->no_directions; d++ ) + { + /* Note: The band information is read from the first direction as it contains the full information. */ + for ( band = 0; band < hQMetaData->q_direction[0].cfg.nbands; band++ ) + { + for ( block = 0; block < hQMetaData->q_direction[0].cfg.nblocks; block++ ) + { + hQMetaData->q_direction[d].band_data[band].spherical_index[block] = index_theta_phi_16( &( hQMetaData->q_direction[d].band_data[band].elevation[block] ), + &( hQMetaData->q_direction[d].band_data[band].azimuth[block] ), Sph_Grid16 ); + } + } + } + + return; +} + + +/* Replicate subframe data when there is only one subframe sent */ +static void replicate_subframes( + IVAS_QMETADATA_HANDLE hQMetaData ) +{ + int16_t sf, band, dir, nbands, ndirs; + + nbands = hQMetaData->q_direction->cfg.nbands; + ndirs = hQMetaData->no_directions; + + for ( sf = 1; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) + { + for ( band = 0; band < nbands; band++ ) + { + for ( dir = 0; dir < ndirs; dir++ ) + { + hQMetaData->q_direction[dir].band_data[band].azimuth[sf] = hQMetaData->q_direction[dir].band_data[band].azimuth[0]; + hQMetaData->q_direction[dir].band_data[band].elevation[sf] = hQMetaData->q_direction[dir].band_data[band].elevation[0]; + hQMetaData->q_direction[dir].band_data[band].spherical_index[sf] = hQMetaData->q_direction[dir].band_data[band].spherical_index[0]; + hQMetaData->q_direction[dir].band_data[band].energy_ratio[sf] = hQMetaData->q_direction[dir].band_data[band].energy_ratio[0]; + + if ( hQMetaData->q_direction[dir].coherence_band_data != NULL ) + { + hQMetaData->q_direction[dir].coherence_band_data[band].spread_coherence[sf] = hQMetaData->q_direction[dir].coherence_band_data[band].spread_coherence[0]; + } + } + + if ( hQMetaData->surcoh_band_data != NULL ) + { + hQMetaData->surcoh_band_data[band].surround_coherence[sf] = hQMetaData->surcoh_band_data[band].surround_coherence[0]; + } + } + } + + return; +} + + +static void restore_lowbitrate_masa( + IVAS_QMETADATA_HANDLE hQMetaData, + const int16_t low_bitrate_mode, + const int16_t numCodingBands ) +{ + int16_t sf, band; + + if ( low_bitrate_mode == 1 ) + { + /* With signal 1, we are in 5 frequency bands, 1 subframe mode. */ + /* Replicate data to all subframes */ + for ( sf = 1; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) + { + for ( band = 0; band < numCodingBands; band++ ) + { + hQMetaData->q_direction[0].band_data[band].azimuth[sf] = hQMetaData->q_direction[0].band_data[band].azimuth[0]; + hQMetaData->q_direction[0].band_data[band].elevation[sf] = hQMetaData->q_direction[0].band_data[band].elevation[0]; + hQMetaData->q_direction[0].band_data[band].spherical_index[sf] = hQMetaData->q_direction[0].band_data[band].spherical_index[0]; + hQMetaData->q_direction[0].band_data[band].energy_ratio[sf] = hQMetaData->q_direction[0].band_data[band].energy_ratio[0]; + if ( hQMetaData->q_direction[0].coherence_band_data != NULL ) + { + hQMetaData->q_direction[0].coherence_band_data[band].spread_coherence[sf] = hQMetaData->q_direction[0].coherence_band_data[band].spread_coherence[0]; + } + if ( hQMetaData->surcoh_band_data != NULL ) + { + hQMetaData->surcoh_band_data[band].surround_coherence[sf] = hQMetaData->surcoh_band_data[band].surround_coherence[0]; + } + } + } + hQMetaData->q_direction->cfg.nblocks = 4; + } + else + { + /* With signal 0, we are in 1 frequency bands, 4 subframes mode. */ + /* Replicate data to all bands */ + for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) + { + for ( band = 1; band < numCodingBands; band++ ) + { + hQMetaData->q_direction[0].band_data[band].azimuth[sf] = hQMetaData->q_direction[0].band_data[0].azimuth[sf]; + hQMetaData->q_direction[0].band_data[band].elevation[sf] = hQMetaData->q_direction[0].band_data[0].elevation[sf]; + hQMetaData->q_direction[0].band_data[band].spherical_index[sf] = hQMetaData->q_direction[0].band_data[0].spherical_index[sf]; + hQMetaData->q_direction[0].band_data[band].energy_ratio[sf] = hQMetaData->q_direction[0].band_data[0].energy_ratio[sf]; + if ( hQMetaData->q_direction[0].coherence_band_data != NULL ) + { + hQMetaData->q_direction[0].coherence_band_data[band].spread_coherence[sf] = hQMetaData->q_direction[0].coherence_band_data[0].spread_coherence[sf]; + } + if ( hQMetaData->surcoh_band_data != NULL ) + { + hQMetaData->surcoh_band_data[band].surround_coherence[sf] = hQMetaData->surcoh_band_data[0].surround_coherence[sf]; + } + } + } + hQMetaData->q_direction->cfg.nbands = numCodingBands; + } + + return; +} + + +static ivas_error init_lfe_synth_data( + Decoder_Struct *st_ivas, /* i : IVAS decoder struct */ + MASA_DECODER_HANDLE hMasa /* i/o: MASA decoder structure */ +) +{ + int32_t output_Fs; + AUDIO_CONFIG output_config; + + output_Fs = st_ivas->hDecoderConfig->output_Fs; + output_config = st_ivas->hDecoderConfig->output_config; + + if ( ( hMasa->hMasaLfeSynth = (MCMASA_LFE_SYNTH_DATA_HANDLE) malloc( sizeof( MCMASA_LFE_SYNTH_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA decoder\n" ) ); + } + + hMasa->hMasaLfeSynth->transportEneSmooth = 0.0f; + hMasa->hMasaLfeSynth->protoLfeEneSmooth = 0.0f; + hMasa->hMasaLfeSynth->targetEneLfeSmooth = 0.0f; + hMasa->hMasaLfeSynth->targetEneTransSmooth = 0.0f; + + set_zero( hMasa->hMasaLfeSynth->lfeToTotalEnergyRatio, MAX_PARAM_SPATIAL_SUBFRAMES ); + hMasa->hMasaLfeSynth->lfeGainPrevIndex = 0; + + if ( st_ivas->hOutSetup.separateChannelEnabled && + ( output_config == IVAS_AUDIO_CONFIG_5_1 || output_config == IVAS_AUDIO_CONFIG_7_1 || + output_config == IVAS_AUDIO_CONFIG_5_1_2 || + output_config == IVAS_AUDIO_CONFIG_5_1_4 || output_config == IVAS_AUDIO_CONFIG_7_1_4 || + output_config == IVAS_AUDIO_CONFIG_FOA || output_config == IVAS_AUDIO_CONFIG_HOA2 || + output_config == IVAS_AUDIO_CONFIG_HOA3 || + ( output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM && st_ivas->hOutSetup.num_lfe > 0 ) ) ) + { + int16_t bufferSize; + int16_t i; + int16_t slot_size; + + /* Ring buffer for the filterbank of the LFE synthesis. + * The filterbank is using moving average lowpass filter with the crossover of 120 Hz. */ + bufferSize = (int16_t) ( ( output_Fs / FRAMES_PER_SEC ) / MAX_PARAM_SPATIAL_SUBFRAMES ); + if ( ( hMasa->hMasaLfeSynth->lfeSynthRingBuffer = (float *) malloc( bufferSize * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA decoder\n" ) ); + } + set_zero( hMasa->hMasaLfeSynth->lfeSynthRingBuffer, bufferSize ); + hMasa->hMasaLfeSynth->ringBufferLoPointer = 0; + hMasa->hMasaLfeSynth->ringBufferHiPointer = bufferSize / 2; + hMasa->hMasaLfeSynth->lowpassSum = 0.0f; + hMasa->hMasaLfeSynth->ringBufferSize = bufferSize; + + /* Ring buffer for additional lowpass filter for the LFE signal. + * Moving average lowpass filter with the crossover of 240 Hz. */ + bufferSize /= 2; + if ( ( hMasa->hMasaLfeSynth->lfeSynthRingBuffer2 = (float *) malloc( bufferSize * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA decoder\n" ) ); + } + set_zero( hMasa->hMasaLfeSynth->lfeSynthRingBuffer2, bufferSize ); + hMasa->hMasaLfeSynth->ringBufferLoPointer2 = 0; + hMasa->hMasaLfeSynth->lowpassSum2 = 0.0f; + hMasa->hMasaLfeSynth->ringBufferSize2 = bufferSize; + + /* Delay buffer for matching the delay of the lowpass filter */ + bufferSize /= 2; /* The delay of the moving average lowpass filter is bufferSize / 2 */ + if ( ( hMasa->hMasaLfeSynth->delayBuffer_syncLp = (float *) malloc( bufferSize * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA decoder\n" ) ); + } + set_zero( hMasa->hMasaLfeSynth->delayBuffer_syncLp, bufferSize ); + hMasa->hMasaLfeSynth->delayBuffer_syncLp_size = bufferSize; + + /* Delay buffer for syncing with DirAC rendering */ + bufferSize = NS2SA( output_Fs, IVAS_FB_DEC_DELAY_NS ) - hMasa->hMasaLfeSynth->ringBufferSize / 2 - hMasa->hMasaLfeSynth->ringBufferSize2 / 2; + if ( ( hMasa->hMasaLfeSynth->delayBuffer_syncDirAC = (float *) malloc( bufferSize * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA decoder\n" ) ); + } + set_zero( hMasa->hMasaLfeSynth->delayBuffer_syncDirAC, bufferSize ); + hMasa->hMasaLfeSynth->delayBuffer_syncDirAC_size = bufferSize; + + /* Interpolation between slots */ + hMasa->hMasaLfeSynth->lfeGainPrev = 0.0f; + hMasa->hMasaLfeSynth->transportGainPrev = 1.0f; + slot_size = (int16_t) ( ( output_Fs / FRAMES_PER_SEC ) / CLDFB_NO_COL_MAX ); + for ( i = 0; i < slot_size; i++ ) + { + hMasa->hMasaLfeSynth->interpolator[i] = ( (float) ( i + 1 ) ) / ( (float) slot_size ); + } + } + else if ( st_ivas->hOutSetup.separateChannelEnabled && output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM && st_ivas->hOutSetup.num_lfe == 0 ) + { + int16_t bufferSize; + + /* Delay buffer for syncing with DirAC rendering */ + bufferSize = NS2SA( output_Fs, IVAS_FB_DEC_DELAY_NS ); + if ( ( hMasa->hMasaLfeSynth->delayBuffer_syncDirAC = (float *) malloc( bufferSize * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA decoder\n" ) ); + } + set_zero( hMasa->hMasaLfeSynth->delayBuffer_syncDirAC, bufferSize ); + hMasa->hMasaLfeSynth->delayBuffer_syncDirAC_size = bufferSize; + + hMasa->hMasaLfeSynth->lfeSynthRingBuffer = NULL; + hMasa->hMasaLfeSynth->lfeSynthRingBuffer2 = NULL; + hMasa->hMasaLfeSynth->delayBuffer_syncLp = NULL; + } + else + { + hMasa->hMasaLfeSynth->lfeSynthRingBuffer = NULL; + hMasa->hMasaLfeSynth->lfeSynthRingBuffer2 = NULL; + hMasa->hMasaLfeSynth->delayBuffer_syncLp = NULL; + hMasa->hMasaLfeSynth->delayBuffer_syncDirAC = NULL; + } + + return IVAS_ERR_OK; +} + + +/*! r: Number of bits read */ +static int16_t decode_lfe_to_total_energy_ratio( + MCMASA_LFE_SYNTH_DATA_HANDLE hMasaLfeSynth, /* i/o: McMASA LFE structure */ + uint16_t *bitstream, /* i : bitstream */ + int16_t *index, /* i/o: bitstream position */ + const int32_t ivas_total_brate /* i : total bitrate */ +) +{ + int16_t i; + int16_t lfeToTotalEnergyRatioIndices[3]; + int16_t VQBits; + float log2LFEaverage; + float lfeToTotalEnergyRatioTemp; + uint16_t byteBuffer; + int16_t lfeBitsRead; + + lfeBitsRead = 0; + byteBuffer = bitstream[( *index )--]; + lfeBitsRead += 1; + lfeToTotalEnergyRatioIndices[0] = byteBuffer; /* First LFE index */ + + if ( ivas_total_brate == IVAS_13k2 ) /* 1-bit adaptive LFE gain quantizer at 13.2 kbps */ + { + lfeToTotalEnergyRatioTemp = hMasaLfeSynth->lfeToTotalEnergyRatio[3]; /* Take memory from the last subframe */ + if ( lfeToTotalEnergyRatioIndices[0] == 1 ) + { + if ( hMasaLfeSynth->lfeGainPrevIndex == 1 ) + { + lfeToTotalEnergyRatioTemp = lfeToTotalEnergyRatioTemp + MCMASA_LFE_THETA * MCMASA_LFE_BETA; /* larger "bump-up" energy */ + } + else + { + lfeToTotalEnergyRatioTemp = lfeToTotalEnergyRatioTemp + MCMASA_LFE_BETA; /* "bump-up" energy */ + } + } + else + { + lfeToTotalEnergyRatioTemp = MCMASA_LFE_ALPHA * lfeToTotalEnergyRatioTemp; /* exponential decay */ + } + if ( lfeToTotalEnergyRatioTemp > 1.0f ) + { + lfeToTotalEnergyRatioTemp = 1.0f; + } + hMasaLfeSynth->lfeGainPrevIndex = lfeToTotalEnergyRatioIndices[0]; + for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + { + hMasaLfeSynth->lfeToTotalEnergyRatio[i] = lfeToTotalEnergyRatioTemp; + } + } + else /* Bitrates >= 16.4 kbps */ + { + if ( lfeToTotalEnergyRatioIndices[0] == 0 ) + { + for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + { + hMasaLfeSynth->lfeToTotalEnergyRatio[i] = 0.0f; + } + } + else + { + byteBuffer = bitstream[( *index )--] << 2; + byteBuffer += bitstream[( *index )--] << 1; + byteBuffer += bitstream[( *index )--]; + lfeBitsRead += 3; + lfeToTotalEnergyRatioIndices[1] = byteBuffer; /* Scalar index */ + log2LFEaverage = usdequant( lfeToTotalEnergyRatioIndices[1], MCMASA_LFE_QLOW, MCMASA_LFE_DELTA ); + + /* 16.4 kbps sends only scalar gain, above it VQ is used */ + if ( ivas_total_brate >= IVAS_24k4 ) + { + /* Depending on average (scalar) gain more bits are sent for VQ LFE gain */ + switch ( lfeToTotalEnergyRatioIndices[1] ) + { + case 0: + case 1: + VQBits = 0; + break; + case 2: + VQBits = 1; + break; + case 3: + VQBits = 2; + break; + case 4: + VQBits = 3; + break; + default: + VQBits = 4; + } + byteBuffer = 0; + for ( i = 0; i < VQBits; i++ ) + { + byteBuffer += bitstream[( *index )--] << ( VQBits - 1 - i ); + lfeBitsRead += 1; + } + lfeToTotalEnergyRatioIndices[2] = byteBuffer; /* VQ index */ + } + + for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + { + if ( ivas_total_brate == IVAS_16k4 ) + { + hMasaLfeSynth->lfeToTotalEnergyRatio[i] = exp2f( log2LFEaverage ); + } + else + { + hMasaLfeSynth->lfeToTotalEnergyRatio[i] = exp2f( log2LFEaverage + McMASA_LFEGain_vectors[4 * lfeToTotalEnergyRatioIndices[2] + i] ); + } + hMasaLfeSynth->lfeToTotalEnergyRatio[i] = min( hMasaLfeSynth->lfeToTotalEnergyRatio[i], 1.0f ); + hMasaLfeSynth->lfeToTotalEnergyRatio[i] = max( hMasaLfeSynth->lfeToTotalEnergyRatio[i], 0.0f ); + } + } + } + + return lfeBitsRead; +} + + +/*-------------------------------------------------------------------* + * ivas_masa_dec_reconfigure() + * + * Reconfigure IVAS MASA decoder + *-------------------------------------------------------------------*/ + +ivas_error ivas_masa_dec_reconfigure( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + uint16_t *nSamplesRendered, /* o : number of samples flushed from the previous frame (JBM) */ + int16_t *data /* o : output synthesis signal */ +) +{ + int16_t n, tmp, num_bits; + int16_t sce_id, cpe_id; + uint16_t *bit_stream; + Decoder_State **sts; + int32_t ivas_total_brate, last_ivas_total_brate; + int16_t numCldfbAnalyses_old, numCldfbSyntheses_old; + ivas_error error; + int32_t ism_total_brate; + + error = IVAS_ERR_OK; + + ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; + last_ivas_total_brate = st_ivas->hDecoderConfig->last_ivas_total_brate; + + if ( st_ivas->hDecoderConfig->Opt_5ms == 1 ) + { + if ( st_ivas->hSpatParamRendCom != NULL && st_ivas->hSpatParamRendCom->slot_size == st_ivas->hTcBuffer->n_samples_granularity ) + { + mvs2s( st_ivas->hSpatParamRendCom->subframe_nbslots, st_ivas->hTcBuffer->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); + st_ivas->hTcBuffer->nb_subframes = st_ivas->hSpatParamRendCom->nb_subframes; + st_ivas->hTcBuffer->subframes_rendered = st_ivas->hSpatParamRendCom->subframes_rendered; + } + } + + ivas_init_dec_get_num_cldfb_instances( st_ivas, &numCldfbAnalyses_old, &numCldfbSyntheses_old ); + + /* renderer might have changed, reselect */ + ivas_renderer_select( st_ivas ); + + if ( ( st_ivas->renderer_type == RENDERER_DIRAC && st_ivas->hDirACRend == NULL ) || + ( ( st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) && st_ivas->hDiracDecBin == NULL ) ) + { + /* init a new DirAC dec */ + if ( ( error = ivas_dirac_dec_config( st_ivas, DIRAC_OPEN ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->renderer_type == RENDERER_DISABLE || st_ivas->renderer_type == RENDERER_MONO_DOWNMIX ) + { + if ( st_ivas->hDirAC != NULL ) + { + /* close all unnecessary parametric decoding and rendering */ + ivas_dirac_dec_close_binaural_data( &st_ivas->hDiracDecBin ); + ivas_dirac_rend_close( &( st_ivas->hDirACRend ) ); + ivas_spat_hSpatParamRendCom_close( &( st_ivas->hSpatParamRendCom ) ); + ivas_dirac_dec_close( &( st_ivas->hDirAC ) ); + } + } + /* possible reconfigure is done later */ + + /*-----------------------------------------------------------------* + * Allocate and initialize SCE/CPE and other handles + *-----------------------------------------------------------------*/ + + bit_stream = st_ivas->hSCE[0] != NULL ? st_ivas->hSCE[0]->hCoreCoder[0]->bit_stream : st_ivas->hCPE[0]->hCoreCoder[0]->bit_stream; + + num_bits = 0; + + for ( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) + { + st_ivas->hSCE[sce_id]->element_brate = ivas_total_brate / st_ivas->nchan_transport; + st_ivas->hSCE[sce_id]->hCoreCoder[0]->total_brate = st_ivas->hSCE[sce_id]->element_brate; /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */ + sts = st_ivas->hSCE[sce_id]->hCoreCoder; + sts[0]->bit_stream = bit_stream + num_bits; + num_bits += (int16_t) ( st_ivas->hSCE[sce_id]->element_brate / FRAMES_PER_SEC ); + + if ( ( st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) && st_ivas->hDiracDecBin != NULL ) + { + if ( ( error = ivas_dirac_dec_config( st_ivas, DIRAC_RECONFIGURE ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + + for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) + { + st_ivas->hCPE[cpe_id]->element_brate = ( ivas_total_brate / st_ivas->nchan_transport ) * CPE_CHANNELS; + + /* prepare bitstream buffers */ + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + st_ivas->hCPE[cpe_id]->hCoreCoder[n]->total_brate = st_ivas->hCPE[cpe_id]->element_brate / ( st_ivas->nCPE > 1 ? 1 : CPE_CHANNELS ); /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */ + } + sts = st_ivas->hCPE[cpe_id]->hCoreCoder; + sts[0]->bit_stream = bit_stream + num_bits; + num_bits += (int16_t) ( st_ivas->hCPE[cpe_id]->element_brate / FRAMES_PER_SEC ); + if ( ( ivas_total_brate < MASA_STEREO_MIN_BITRATE && last_ivas_total_brate >= MASA_STEREO_MIN_BITRATE ) || + ( ivas_total_brate < MASA_STEREO_MIN_BITRATE && last_ivas_total_brate == FRAME_NO_DATA ) ) + { + st_ivas->hCPE[cpe_id]->nchan_out = 1; + + if ( ( st_ivas->renderer_type == RENDERER_DIRAC && st_ivas->hDirACRend != NULL ) || ( ( st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) && st_ivas->hDiracDecBin != NULL ) ) + { + if ( ( error = ivas_dirac_dec_config( st_ivas, DIRAC_RECONFIGURE ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + else if ( ivas_total_brate >= MASA_STEREO_MIN_BITRATE && last_ivas_total_brate < MASA_STEREO_MIN_BITRATE ) + { + st_ivas->hCPE[cpe_id]->nchan_out = CPE_CHANNELS; + + if ( ( st_ivas->renderer_type == RENDERER_DIRAC && st_ivas->hDirACRend != NULL ) || ( ( st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) && st_ivas->hDiracDecBin != NULL ) ) + { + if ( ( error = ivas_dirac_dec_config( st_ivas, DIRAC_RECONFIGURE ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + } + + if ( st_ivas->hDiracDecBin != NULL ) + { + /* regularization factor is bitrate-dependent */ + st_ivas->hDiracDecBin->reqularizationFactor = configure_reqularization_factor( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate ); + } + + if ( st_ivas->ivas_format == MASA_FORMAT && st_ivas->last_ivas_format == MASA_FORMAT ) /* note: switching within OMASA is handled in ivas_omasa_dec_config() */ + { + /*-----------------------------------------------------------------* + * TD Decorrelator + *-----------------------------------------------------------------*/ + if ( st_ivas->hDiracDecBin != NULL ) + { + if ( ( error = ivas_td_decorr_reconfig_dec( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hDecoderConfig->output_Fs, &( st_ivas->hDiracDecBin->hTdDecorr ), &( st_ivas->hDiracDecBin->useTdDecorr ) ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /*-----------------------------------------------------------------* + * CLDFB instances + *-----------------------------------------------------------------*/ + + if ( ( error = ivas_cldfb_dec_reconfig( st_ivas, st_ivas->nchan_transport, numCldfbAnalyses_old, numCldfbSyntheses_old ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /*-----------------------------------------------------------------* + * Set-up MASA coding elements and bitrates + *-----------------------------------------------------------------*/ + + ism_total_brate = 0; + if ( st_ivas->ivas_format == MASA_ISM_FORMAT && st_ivas->nSCE > 0 && ( st_ivas->ism_mode == ISM_MASA_MODE_DISC || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) ) + { + for ( n = 0; n < st_ivas->nSCE; n++ ) + { + ism_total_brate += st_ivas->hSCE[n]->element_brate; + } + } + + ivas_masa_set_elements( ivas_total_brate, st_ivas->mc_mode, st_ivas->nchan_transport, st_ivas->hQMetaData, &tmp, &tmp, &tmp, st_ivas->ivas_format, st_ivas->ism_mode, ism_total_brate ); + + if ( st_ivas->ivas_format == MASA_FORMAT ) + { + st_ivas->nchan_ism = 0; + st_ivas->ism_mode = ISM_MODE_NONE; + } + + if ( st_ivas->hDecoderConfig->Opt_5ms == 1 ) + { + int16_t tc_nchan_to_allocate; + int16_t tc_nchan_transport; + TC_BUFFER_MODE buffer_mode_new; + int16_t n_samples_granularity; + + n_samples_granularity = NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ); + buffer_mode_new = ivas_jbm_dec_get_tc_buffer_mode( st_ivas ); + tc_nchan_transport = ivas_jbm_dec_get_num_tc_channels( st_ivas ); + + tc_nchan_to_allocate = tc_nchan_transport; + if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) + { + if ( st_ivas->ivas_format == MASA_ISM_FORMAT ) + { + tc_nchan_to_allocate = 2 * BINAURAL_CHANNELS + 2; + } + else + { + tc_nchan_to_allocate = 2 * BINAURAL_CHANNELS; + } + + if ( st_ivas->ivas_format == MASA_ISM_FORMAT && st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC && st_ivas->ism_mode == ISM_MASA_MODE_DISC ) + { + n_samples_granularity = NS2SA( st_ivas->hDecoderConfig->output_Fs, FRAME_SIZE_NS / MAX_PARAM_SPATIAL_SUBFRAMES ); /* Use the same granularity as tdrend */ + + if ( n_samples_granularity > st_ivas->hTcBuffer->n_samples_granularity ) + { + if ( ( error = ivas_jbm_dec_set_discard_samples( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + else if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC && st_ivas->ism_mode != ISM_MASA_MODE_DISC ) + { + if ( n_samples_granularity < st_ivas->hTcBuffer->n_samples_granularity ) + { + if ( ( error = ivas_jbm_dec_flush_renderer( st_ivas, n_samples_granularity, st_ivas->renderer_type, st_ivas->intern_config, &st_ivas->hIntSetup, MC_MODE_NONE, ISM_MASA_MODE_DISC, nSamplesRendered, data ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + } + else if ( st_ivas->nchan_transport == 1 && ( st_ivas->renderer_type == RENDERER_DIRAC && st_ivas->hDirACRend->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) ) + { + /* addtl channel for CNG */ + tc_nchan_to_allocate++; + } + + if ( tc_nchan_transport != st_ivas->hTcBuffer->nchan_transport_jbm || tc_nchan_to_allocate != st_ivas->hTcBuffer->nchan_transport_internal || buffer_mode_new != st_ivas->hTcBuffer->tc_buffer_mode ) + { + if ( ( error = ivas_jbm_dec_tc_buffer_reconfigure( st_ivas, buffer_mode_new, tc_nchan_transport, tc_nchan_to_allocate, tc_nchan_to_allocate, n_samples_granularity ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( st_ivas->hSpatParamRendCom != NULL && st_ivas->hSpatParamRendCom->slot_size == st_ivas->hTcBuffer->n_samples_granularity ) + { + mvs2s( st_ivas->hTcBuffer->subframe_nbslots, st_ivas->hSpatParamRendCom->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); + st_ivas->hSpatParamRendCom->nb_subframes = st_ivas->hTcBuffer->nb_subframes; + st_ivas->hSpatParamRendCom->subframes_rendered = st_ivas->hTcBuffer->subframes_rendered; + } + + if ( st_ivas->ivas_format == MASA_ISM_FORMAT && st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC && st_ivas->ism_mode == ISM_MASA_MODE_DISC ) + { + int16_t granularityMultiplier = st_ivas->hTcBuffer->n_samples_granularity / st_ivas->hSpatParamRendCom->slot_size; + + for ( n = 0; n < MAX_JBM_SUBFRAMES_5MS; n++ ) + { + st_ivas->hSpatParamRendCom->subframe_nbslots[n] = st_ivas->hTcBuffer->subframe_nbslots[n] * granularityMultiplier; + } + } + } + + return error; +} + + +/*-------------------------------------------------------------------* + * ivas_spar_param_to_masa_param_mapping() + * + * Determine MASA metadata from the SPAR metadata + *-------------------------------------------------------------------*/ + +void ivas_spar_param_to_masa_param_mapping( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */ + float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, real */ + float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, imag */ + const int16_t subframe /* i : Subframe to map */ +) +{ + int16_t i, j, band, bin, slot, ch, nBins, nchan_transport; + int16_t mixer_mat_index; + int16_t dirac_write_idx; + DIRAC_DEC_HANDLE hDirAC; + DIFFUSE_DISTRIBUTION_HANDLE hDiffuseDist; + float mixer_mat_sf_bands_real[SPAR_DIRAC_SPLIT_START_BAND][FOA_CHANNELS][FOA_CHANNELS]; + float mixer_mat_sf_bins_real[CLDFB_NO_CHANNELS_MAX][FOA_CHANNELS][FOA_CHANNELS]; + int16_t *band_grouping; + int16_t band_start, band_end; + float transportSignalEnergies[2][CLDFB_NO_CHANNELS_MAX]; + float transportSignalCrossCorrelation[CLDFB_NO_CHANNELS_MAX]; + float instEne; + float inCovarianceMtx[FOA_CHANNELS][FOA_CHANNELS]; + float foaCovarianceMtx[FOA_CHANNELS][FOA_CHANNELS]; + float Iy, Iz, Ix, E, azi, ele, I, ratio; + float diffuseGainX, diffuseGainY, diffuseGainZ, diffuseGainSum; + int16_t slot_idx, slot_idx_start, sf; + SPAR_DEC_HANDLE hSpar; + float slot_fac; + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom; + + /* Set values */ + hDirAC = st_ivas->hDirAC; + hSpatParamRendCom = st_ivas->hSpatParamRendCom; + hSpatParamRendCom->numParametricDirections = 1; + hSpatParamRendCom->numSimultaneousDirections = 1; + hDiffuseDist = st_ivas->hDiracDecBin->hDiffuseDist; + nchan_transport = st_ivas->nchan_transport; + band_grouping = hDirAC->band_grouping; + hSpar = st_ivas->hSpar; + dirac_write_idx = hSpatParamRendCom->render_to_md_map[subframe]; + + /* Init arrays */ + for ( i = 0; i < FOA_CHANNELS; i++ ) + { + set_zero( inCovarianceMtx[i], FOA_CHANNELS ); + } + + /* Delay the SPAR mixing matrices to have them synced with the audio */ + slot_idx_start = hSpar->slots_rendered; + slot_fac = 1.0f / (float) hSpar->subframe_nbslots[subframe]; + + for ( slot_idx = 0; slot_idx < hSpar->subframe_nbslots[subframe]; slot_idx++ ) + { + sf = hSpar->render_to_md_map[slot_idx + slot_idx_start] / JBM_CLDFB_SLOTS_IN_SUBFRAME; + + if ( ( sf < SPAR_META_DELAY_SUBFRAMES ) ) + { + mixer_mat_index = sf + MAX_PARAM_SPATIAL_SUBFRAMES - SPAR_META_DELAY_SUBFRAMES + 1; + for ( band = 0; band < SPAR_DIRAC_SPLIT_START_BAND; band++ ) + { + for ( i = 0; i < FOA_CHANNELS; i++ ) + { + for ( j = 0; j < FOA_CHANNELS; j++ ) + { + mixer_mat_sf_bands_real[band][i][j] = slot_fac * st_ivas->hSpar->hMdDec->mixer_mat_prev[mixer_mat_index][i][j][band]; + } + } + } + } + else + { + mixer_mat_index = ( ivas_get_spar_dec_md_num_subframes( st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->last_active_ivas_total_brate ) == 1 ) ? 0 : ( sf - SPAR_META_DELAY_SUBFRAMES ); + for ( band = 0; band < SPAR_DIRAC_SPLIT_START_BAND; band++ ) + { + for ( i = 0; i < FOA_CHANNELS; i++ ) + { + for ( j = 0; j < FOA_CHANNELS; j++ ) + { + mixer_mat_sf_bands_real[band][i][j] = slot_fac * st_ivas->hSpar->hMdDec->mixer_mat[i][j][band + mixer_mat_index * IVAS_MAX_NUM_BANDS]; + } + } + } + } + } + + /* Map the mixing matrices from the frequency bands to frequency bins */ + bin = 0; + for ( band = 0; band < SPAR_DIRAC_SPLIT_START_BAND; band++ ) + { + band_start = band_grouping[band]; + band_end = band_grouping[band + 1]; + for ( bin = band_start; bin < band_end; bin++ ) + { + for ( i = 0; i < FOA_CHANNELS; i++ ) + { + for ( j = 0; j < FOA_CHANNELS; j++ ) + { + mixer_mat_sf_bins_real[bin][i][j] = mixer_mat_sf_bands_real[band][i][j]; + } + } + } + } + nBins = bin; + + /* Determine MASA metadata */ + /* Determine transport signal energies and cross correlations when more than 1 TC */ + if ( nchan_transport == 2 ) + { + set_zero( transportSignalEnergies[0], nBins ); + set_zero( transportSignalEnergies[1], nBins ); + set_zero( transportSignalCrossCorrelation, nBins ); + + for ( slot = 0; slot < hSpatParamRendCom->subframe_nbslots[subframe]; slot++ ) + { + for ( bin = 0; bin < nBins; bin++ ) + { + for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + instEne = ( inRe[ch][slot][bin] * inRe[ch][slot][bin] ); + instEne += ( inIm[ch][slot][bin] * inIm[ch][slot][bin] ); + transportSignalEnergies[ch][bin] += instEne; + } + transportSignalCrossCorrelation[bin] += inRe[0][slot][bin] * inRe[1][slot][bin]; + transportSignalCrossCorrelation[bin] += inIm[0][slot][bin] * inIm[1][slot][bin]; + } + } + } + + if ( hDiffuseDist != NULL ) + { + set_zero( hDiffuseDist->diffuseRatioX, CLDFB_NO_CHANNELS_MAX ); + set_zero( hDiffuseDist->diffuseRatioY, CLDFB_NO_CHANNELS_MAX ); + set_zero( hDiffuseDist->diffuseRatioZ, CLDFB_NO_CHANNELS_MAX ); + } + + for ( bin = 0; bin < nBins; bin++ ) + { + /* Set the energy of the first transport signal */ + if ( nchan_transport == 1 ) + { + inCovarianceMtx[0][0] = 1.0f; /* In case of 1TC, fixed value can be used */ + } + else + { + inCovarianceMtx[0][0] = transportSignalEnergies[0][bin]; /* In case of 2TC, use actual energies */ + } + + /* Decorrelated channels assumed to have the same energy as the source channel */ + inCovarianceMtx[1][1] = inCovarianceMtx[0][0]; + inCovarianceMtx[2][2] = inCovarianceMtx[0][0]; + inCovarianceMtx[3][3] = inCovarianceMtx[0][0]; + + /* In case residuals were transmitted, use their actual energies and cross correlations */ + if ( nchan_transport == 2 ) + { + inCovarianceMtx[1][1] = transportSignalEnergies[1][bin]; + inCovarianceMtx[0][1] = transportSignalCrossCorrelation[bin]; + inCovarianceMtx[1][0] = inCovarianceMtx[0][1]; + } + + compute_foa_cov_matrix( foaCovarianceMtx, inCovarianceMtx, mixer_mat_sf_bins_real[bin] ); + + /* Estimate MASA metadata */ + Iy = foaCovarianceMtx[0][1]; /* Intensity in Y direction */ + Iz = foaCovarianceMtx[0][2]; /* Intensity in Z direction */ + Ix = foaCovarianceMtx[0][3]; /* Intensity in X direction */ + I = sqrtf( Ix * Ix + Iy * Iy + Iz * Iz ); /* Intensity vector length */ + E = ( foaCovarianceMtx[0][0] + foaCovarianceMtx[1][1] + foaCovarianceMtx[2][2] + foaCovarianceMtx[3][3] ) / 2.0f; /* Overall energy */ + azi = atan2f( Iy, Ix ); /* Azimuth */ + ele = atan2f( Iz, sqrtf( Ix * Ix + Iy * Iy ) ); /* Elevation */ + ratio = I / fmaxf( 1e-12f, E ); /* Energy ratio */ + ratio = fmaxf( 0.0f, fminf( 1.0f, ratio ) ); + + hSpatParamRendCom->azimuth[dirac_write_idx][bin] = (int16_t) roundf( azi / PI_OVER_180 ); + hSpatParamRendCom->elevation[dirac_write_idx][bin] = (int16_t) roundf( ele / PI_OVER_180 ); + hSpatParamRendCom->energy_ratio1[dirac_write_idx][bin] = ratio; + hSpatParamRendCom->diffuseness_vector[dirac_write_idx][bin] = 1.0f - ratio; + + hSpatParamRendCom->spreadCoherence[dirac_write_idx][bin] = 0.0f; + hSpatParamRendCom->surroundingCoherence[dirac_write_idx][bin] = 0.0f; + + /* Determine directional distribution of the indirect audio based on the SPAR mixing matrices (and the transport audio signals when 2 TC) */ + if ( hDiffuseDist != NULL ) + { + if ( nchan_transport == 1 ) + { + diffuseGainY = fabsf( mixer_mat_sf_bins_real[bin][1][1] ); + diffuseGainX = fabsf( mixer_mat_sf_bins_real[bin][3][2] ); + diffuseGainZ = fabsf( mixer_mat_sf_bins_real[bin][2][3] ); + } + else if ( nchan_transport == 2 ) + { + diffuseGainY = fabsf( mixer_mat_sf_bins_real[bin][1][1] * transportSignalEnergies[1][bin] ); + diffuseGainX = fabsf( mixer_mat_sf_bins_real[bin][3][2] * transportSignalEnergies[0][bin] ) + fabsf( mixer_mat_sf_bins_real[bin][3][1] * transportSignalEnergies[1][bin] ); + diffuseGainZ = fabsf( mixer_mat_sf_bins_real[bin][2][3] * transportSignalEnergies[0][bin] ) + fabsf( mixer_mat_sf_bins_real[bin][2][1] * transportSignalEnergies[1][bin] ); + } + else + { + diffuseGainY = 1.0f; + diffuseGainX = 1.0f; + diffuseGainZ = 1.0f; + } + + diffuseGainSum = diffuseGainY + diffuseGainX + diffuseGainZ; + + if ( diffuseGainSum == 0.0f ) + { + hDiffuseDist->diffuseRatioX[bin] = 1.0f / 3.0f; + hDiffuseDist->diffuseRatioY[bin] = 1.0f / 3.0f; + hDiffuseDist->diffuseRatioZ[bin] = 1.0f / 3.0f; + } + else + { + hDiffuseDist->diffuseRatioX[bin] = diffuseGainX / ( diffuseGainSum + EPSILON ); + hDiffuseDist->diffuseRatioY[bin] = diffuseGainY / ( diffuseGainSum + EPSILON ); + hDiffuseDist->diffuseRatioZ[bin] = diffuseGainZ / ( diffuseGainSum + EPSILON ); + } + } + } + + return; +} + + +/* Estimate FOA properties: foaCov = mixMtx * inCov * mixMtx' */ +static void compute_foa_cov_matrix( + float foaCov[FOA_CHANNELS][FOA_CHANNELS], /* o : Estimated FOA covariance matrix */ + float inCov[FOA_CHANNELS][FOA_CHANNELS], /* i : Input covariance matrix */ + float mixMtx[FOA_CHANNELS][FOA_CHANNELS] /* i : Mixing matrix */ +) +{ + float tmpMtx[FOA_CHANNELS][FOA_CHANNELS]; + int16_t i, j, k; + + /* tmpMtx = mixMtx * inCov */ + for ( i = 0; i < FOA_CHANNELS; i++ ) + { + for ( j = 0; j < FOA_CHANNELS; j++ ) + { + tmpMtx[i][j] = 0.0f; + for ( k = 0; k < FOA_CHANNELS; k++ ) + { + tmpMtx[i][j] += mixMtx[i][k] * inCov[k][j]; + } + } + } + + /* foaCov = inCov * mixMtx' */ + for ( i = 0; i < FOA_CHANNELS; i++ ) + { + for ( j = 0; j < FOA_CHANNELS; j++ ) + { + foaCov[i][j] = 0.0f; + for ( k = 0; k < FOA_CHANNELS; k++ ) + { + foaCov[i][j] += tmpMtx[i][k] * mixMtx[j][k]; + } + } + } + + return; +} + +static void create_masa_ext_out_meta( + MASA_DECODER *hMasa, + IVAS_QMETADATA_HANDLE hQMetaData, + const int16_t nchan_transport ) +{ + const uint8_t ivasmasaFormatDescriptor[8] = { 0x49, 0x56, 0x41, 0x53, 0x4D, 0x41, 0x53, 0x41 }; /* "IVASMASA" */ + int16_t i, sf, b_old, b_new, dir; + MASA_DECRIPTIVE_META *descMeta; + int16_t *bandMap; + uint8_t numCodingBands; + uint8_t numDirections; + MASA_DECODER_EXT_OUT_META *extOutMeta; + + numDirections = hMasa->config.numberOfDirections; + numCodingBands = hMasa->config.numCodingBands; + bandMap = hMasa->data.band_mapping; + extOutMeta = hMasa->data.extOutMeta; + descMeta = &hMasa->data.extOutMeta->descriptiveMeta; + + /* Construct descriptive meta */ + for ( i = 0; i < 8; i++ ) + { + descMeta->formatDescriptor[i] = ivasmasaFormatDescriptor[i]; + } + descMeta->numberOfDirections = numDirections - 1; + descMeta->numberOfChannels = (uint8_t) ( nchan_transport - 1 ); + /* Following correspond to "unknown" values until transmission is implemented */ + descMeta->sourceFormat = 0x0u; + descMeta->transportDefinition = 0x0u; + descMeta->channelAngle = 0x0u; + descMeta->channelDistance = 0x0u; + descMeta->channelLayout = 0x0u; + + /* Construct spatial metadata from qmetadata */ + for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) + { + for ( dir = 0; dir < numDirections; dir++ ) + { + /* Spherical index */ + for ( b_old = 0; b_old < numCodingBands; b_old++ ) + { + for ( b_new = bandMap[b_old]; b_new < bandMap[b_old + 1]; b_new++ ) + { + extOutMeta->directionIndex[dir][sf][b_new] = hQMetaData->q_direction[dir].band_data[b_old].spherical_index[sf]; + } + } + + /* Direct-to-total ratio */ + for ( b_old = 0; b_old < numCodingBands; b_old++ ) + { + for ( b_new = bandMap[b_old]; b_new < bandMap[b_old + 1]; b_new++ ) + { + extOutMeta->directToTotalRatio[dir][sf][b_new] = (uint8_t) floorf( hQMetaData->q_direction[dir].band_data[b_old].energy_ratio[sf] * UINT8_MAX ); + } + } + + /* Spread coherence */ + if ( hQMetaData->q_direction[dir].coherence_band_data != NULL ) + { + for ( b_old = 0; b_old < numCodingBands; b_old++ ) + { + for ( b_new = bandMap[b_old]; b_new < bandMap[b_old + 1]; b_new++ ) + { + extOutMeta->spreadCoherence[dir][sf][b_new] = hQMetaData->q_direction[dir].coherence_band_data[b_old].spread_coherence[sf]; + } + } + } + else + { + for ( i = 0; i < MASA_FREQUENCY_BANDS; i++ ) + { + extOutMeta->spreadCoherence[dir][sf][i] = 0; + } + } + } + + /* Fill second direction with zero energy data for EXT output */ + if ( numDirections == 1 ) + { + for ( i = 0; i < MASA_FREQUENCY_BANDS; i++ ) + { + extOutMeta->directionIndex[1][sf][i] = SPH_IDX_FRONT; + } + + for ( i = 0; i < MASA_FREQUENCY_BANDS; i++ ) + { + extOutMeta->directToTotalRatio[1][sf][i] = 0; + } + + for ( i = 0; i < MASA_FREQUENCY_BANDS; i++ ) + { + extOutMeta->spreadCoherence[1][sf][i] = 0; + } + } + + /* Common spatial meta */ + /* Diffuse-to-total ratio = 1 - sum(direct-to-total ratios) */ + for ( b_old = 0; b_old < numCodingBands; b_old++ ) + { + for ( b_new = bandMap[b_old]; b_new < bandMap[b_old + 1]; b_new++ ) + { + extOutMeta->diffuseToTotalRatio[sf][b_new] = UINT8_MAX; + for ( dir = 0; dir < numDirections; dir++ ) + { + extOutMeta->diffuseToTotalRatio[sf][b_new] -= (uint8_t) floorf( hQMetaData->q_direction[dir].band_data[b_old].energy_ratio[sf] * UINT8_MAX ); + } + } + } + + /* Surround coherence */ + if ( hQMetaData->surcoh_band_data != NULL ) + { + for ( b_old = 0; b_old < numCodingBands; b_old++ ) + { + for ( b_new = bandMap[b_old]; b_new < bandMap[b_old + 1]; b_new++ ) + { + extOutMeta->surroundCoherence[sf][b_new] = hQMetaData->surcoh_band_data[b_old].surround_coherence[sf]; + } + } + } + else + { + for ( i = 0; i < MASA_FREQUENCY_BANDS; i++ ) + { + extOutMeta->surroundCoherence[sf][i] = 0; + } + } + } + + return; +} + +static void decode_index_slice( + int16_t index, /* i : index to decode */ + int16_t *ratio_idx_ism, /* o : decodec array of integers */ + const int16_t nchan_ism, /* i : number of elements in array (objects) */ + const int16_t K /* i : sum of array elements */ +) +{ + int16_t i, j, sum, elem; + int16_t base[MAX_NUM_OBJECTS]; + + switch ( nchan_ism ) + { + case 2: + ratio_idx_ism[0] = index; + ratio_idx_ism[1] = K - ratio_idx_ism[0]; + break; + case 3: + case 4: + { + j = 0; + while ( index >= 0 ) + { + if ( valid_ratio_index( j, K, nchan_ism - 1 ) ) + { + index--; + } + j++; + } + j--; + base[0] = 1; + for ( i = 1; i < nchan_ism - 1; i++ ) + { + base[i] = base[i - 1] * 10; + } + sum = 0; + for ( i = nchan_ism - 2; i >= 0; i-- ) + { + elem = j / base[i]; + ratio_idx_ism[nchan_ism - i - 2] = elem; + sum += elem; + j -= elem * base[i]; + } + ratio_idx_ism[nchan_ism - 1] = K - sum; + } + + default: + break; + } + + return; +} + + +static void read_ism_ratio_index( + int16_t ratio_ism_idx[MASA_FREQUENCY_BANDS][MAX_NUM_OBJECTS], /* o : ISM read ratio indexes */ + const int16_t nchan_ism, /* i : number of objects */ + const int16_t numCodingBands, /* i : number of subbands */ + const int16_t sf, /* i : index of subframe */ + int16_t ratio_ism_idx_prev_sf[MASA_FREQUENCY_BANDS][MAX_NUM_OBJECTS], /* i : previous subframe ISM ratio indexes */ + uint16_t *bit_stream, /* i : bitstream */ + int16_t *next_bit_pos, /* i/o: position in bitstream */ + float *masa_to_total_energy_ratio, /* i : masa to total ratios */ + const int16_t idx_sep_obj, /* i : index of separated index, -1 if none */ + int16_t *num_zeros /* i/o: number of zero values in first subframe for separated object */ +) +{ + int16_t b, i, b_signif; + int16_t index; + int16_t GR_order, differential_subframe; + int16_t buf; + int16_t no_levels_ratio_ism; + int16_t bits_index; + int16_t ratio_ism_idx_ref[MAX_NUM_OBJECTS]; + int16_t idx_sep_obj_local, shift_one; + + idx_sep_obj_local = idx_sep_obj; + if ( idx_sep_obj > -1 ) + { + if ( idx_sep_obj == nchan_ism - 1 && nchan_ism > 2 ) + { + idx_sep_obj_local = 0; + } + } + + b_signif = 0; + no_levels_ratio_ism = ( ( 1 << PARAM_ISM_POW_RATIO_NBITS ) - 1 ); + while ( ( b_signif < numCodingBands ) && ( masa_to_total_energy_ratio[b_signif] >= MASA2TOTAL_THR ) ) + { + /* distribute evenly the objects */ + distribute_evenly_ism( ratio_ism_idx[b_signif], no_levels_ratio_ism, nchan_ism ); + b_signif++; + } + + if ( b_signif == numCodingBands ) + { + return; + } + else + { + + if ( sf == 0 ) + { + bits_index = bits_index_ism_ratio( nchan_ism ); + + /* read coding type */ + if ( bit_stream[( *next_bit_pos )--] == 1 ) + { + /* independent coding*/ + for ( b = 0; b < numCodingBands; b++ ) + { + if ( masa_to_total_energy_ratio[b] < MASA2TOTAL_THR ) + { + index = 0; + for ( i = 0; i < bits_index; i++ ) + { + index = ( index << 1 ) + bit_stream[( *next_bit_pos )--]; + } + decode_index_slice( index, ratio_ism_idx[b], nchan_ism, no_levels_ratio_ism ); + if ( idx_sep_obj > -1 && ratio_ism_idx[b][idx_sep_obj_local] == 0 ) + { + ( *num_zeros )++; + } + } + else + { + /* distribute evenly the objects */ + distribute_evenly_ism( ratio_ism_idx[b], no_levels_ratio_ism, nchan_ism ); + } + } + } + else + { + /* differential coding */ + index = 0; + for ( i = 0; i < bits_index; i++ ) + { + index = ( index << 1 ) + bit_stream[( *next_bit_pos )--]; + } + decode_index_slice( index, ratio_ism_idx[b_signif], nchan_ism, no_levels_ratio_ism ); + if ( idx_sep_obj > -1 && ratio_ism_idx[b_signif][idx_sep_obj_local] == 0 ) + { + ( *num_zeros )++; + } + mvs2s( ratio_ism_idx[b_signif], ratio_ism_idx_ref, nchan_ism ); + for ( b = b_signif + 1; b < numCodingBands; b++ ) + { + if ( masa_to_total_energy_ratio[b] < MASA2TOTAL_THR ) + { + ratio_ism_idx[b][nchan_ism - 1] = no_levels_ratio_ism; + for ( i = 0; i < nchan_ism - 1; i++ ) + { + buf = ivas_qmetadata_DecodeExtendedGR( bit_stream, next_bit_pos, 100, 0 ); + if ( ( buf % 2 ) == 0 ) + { + ratio_ism_idx[b][i] = -( buf >> 1 ); + } + else + { + ratio_ism_idx[b][i] = ( ( buf + 1 ) >> 1 ); + } + ratio_ism_idx[b][i] = ratio_ism_idx[b][i] + ratio_ism_idx_ref[i]; + ratio_ism_idx[b][nchan_ism - 1] -= ratio_ism_idx[b][i]; + } + mvs2s( ratio_ism_idx[b], ratio_ism_idx_ref, nchan_ism ); + if ( idx_sep_obj > -1 && ratio_ism_idx[b][idx_sep_obj_local] == 0 ) + { + ( *num_zeros )++; + } + } + else + { + /* distribute evenly the objects */ + distribute_evenly_ism( ratio_ism_idx[b], no_levels_ratio_ism, nchan_ism ); + } + } + } + } + else + { + if ( numCodingBands > 1 ) + { + /* read prediction type */ + differential_subframe = bit_stream[( *next_bit_pos )--]; + } + else + { + differential_subframe = 1; + } + + if ( *num_zeros == numCodingBands ) + { + shift_one = 1; + } + else + { + shift_one = 0; + } + + if ( shift_one == 1 && nchan_ism == 2 ) + { + /* nothing has been sent ; values can be inferred */ + for ( b = b_signif; b < numCodingBands; b++ ) + { + if ( masa_to_total_energy_ratio[b] < MASA2TOTAL_THR ) + { + if ( idx_sep_obj_local == 0 ) + { + ratio_ism_idx[b][0] = 0; + ratio_ism_idx[b][1] = 7; + } + else + { + ratio_ism_idx[b][0] = 7; + ratio_ism_idx[b][1] = 0; + } + } + } + } + else + { + /* read GR order */ + GR_order = bit_stream[( *next_bit_pos )--]; + for ( b = b_signif; b < numCodingBands; b++ ) + { + if ( masa_to_total_energy_ratio[b] < MASA2TOTAL_THR ) + { + for ( i = 0; i < nchan_ism - 1 - shift_one; i++ ) + { + buf = ivas_qmetadata_DecodeExtendedGR( bit_stream, next_bit_pos, 100, GR_order ); + if ( ( buf % 2 ) == 0 ) + { + ratio_ism_idx[b][i] = -( buf >> 1 ); + } + else + { + ratio_ism_idx[b][i] = ( ( buf + 1 ) >> 1 ); + } + } + + /* insert separated obj */ + if ( shift_one ) + { + for ( i = nchan_ism - 1; i > idx_sep_obj_local; i-- ) + { + ratio_ism_idx[b][i] = ratio_ism_idx[b][i - 1]; + } + ratio_ism_idx[b][idx_sep_obj_local] = 0; /* this is only difference; need to pdate later as well */ + } + } + } + if ( differential_subframe ) + { + /* differential to previous subframe */ + for ( b = b_signif; b < numCodingBands; b++ ) + { + if ( masa_to_total_energy_ratio[b] < MASA2TOTAL_THR ) + { + ratio_ism_idx[b][nchan_ism - 1] = no_levels_ratio_ism; + for ( i = 0; i < nchan_ism - 1; i++ ) + { + ratio_ism_idx[b][i] = ratio_ism_idx[b][i] + ratio_ism_idx_prev_sf[b][i]; + if ( shift_one && i == idx_sep_obj_local ) + { + ratio_ism_idx[b][i] = 0; + } + ratio_ism_idx[b][nchan_ism - 1] -= ratio_ism_idx[b][i]; + } + } + else + { + /* distribute evenly the objects */ + distribute_evenly_ism( ratio_ism_idx[b], no_levels_ratio_ism, nchan_ism ); + } + } + } + else + { + /* difference to previous subband */ + ratio_ism_idx[b_signif][nchan_ism - 1] = no_levels_ratio_ism; + + /* first significant subband - differential to previous subframe */ + for ( i = 0; i < nchan_ism - 1; i++ ) + { + ratio_ism_idx[b_signif][i] = ratio_ism_idx[b_signif][i] + ratio_ism_idx_prev_sf[b_signif][i]; + if ( shift_one && i == idx_sep_obj_local ) + { + ratio_ism_idx[b_signif][i] = 0; + } + ratio_ism_idx[b_signif][nchan_ism - 1] -= ratio_ism_idx[b_signif][i]; + } + + /* rest of subbands differential to previous subband */ + mvs2s( ratio_ism_idx[b_signif], ratio_ism_idx_ref, nchan_ism ); + for ( b = b_signif + 1; b < numCodingBands; b++ ) + { + if ( masa_to_total_energy_ratio[b] < MASA2TOTAL_THR ) + { + ratio_ism_idx[b][nchan_ism - 1] = no_levels_ratio_ism; + for ( i = 0; i < nchan_ism - 1; i++ ) + { + ratio_ism_idx[b][i] = ratio_ism_idx[b][i] + ratio_ism_idx_ref[i]; + if ( shift_one && i == idx_sep_obj_local ) + { + ratio_ism_idx[b][i] = 0; + } + ratio_ism_idx[b][nchan_ism - 1] -= ratio_ism_idx[b][i]; + } + mvs2s( ratio_ism_idx[b], ratio_ism_idx_ref, nchan_ism ); + } + else + { + /* distribute evenly the objects */ + distribute_evenly_ism( ratio_ism_idx[b], no_levels_ratio_ism, nchan_ism ); + } + } + } + } + } + + return; + } +} + + +static void decode_ism_ratios( + uint16_t *bit_stream, /* i : bitstream */ + int16_t *next_bit_pos, /* i/o: position in bitstream */ + float masa_to_total_energy_ratio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i : masa_to_total energy ratios */ + float ratio_ism[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS][MAX_NUM_OBJECTS], /* o : ISM ratios */ + const int16_t n_ism, /* i : number of objects */ + const int16_t nbands, /* i : number of subbands */ + const int16_t numSf, /* i : number of subframes */ + const int16_t idx_separated_object /* i : index of separated object */ +) +{ + int16_t sf, band; + int16_t ratio_ism_idx[MASA_FREQUENCY_BANDS][MAX_NUM_OBJECTS]; + int16_t ratio_ism_idx_prev_sf[MASA_FREQUENCY_BANDS][MAX_NUM_OBJECTS]; + float tmp; + int16_t num_zeros; + num_zeros = 0; + + /* hQMetaData->q_direction->cfg.nblocks; */ + for ( sf = 0; sf < numSf; sf++ ) + { + /* read ism ratio indexes */ + read_ism_ratio_index( ratio_ism_idx, n_ism, nbands, sf, ratio_ism_idx_prev_sf, bit_stream, next_bit_pos, masa_to_total_energy_ratio[sf], idx_separated_object, &num_zeros ); + /* save previous subframe index values */ + if ( sf < numSf - 1 ) + { + for ( band = 0; band < nbands; band++ ) + { + mvs2s( ratio_ism_idx[band], ratio_ism_idx_prev_sf[band], n_ism ); + } + } + + /* reconstructed values */ + for ( band = 0; band < nbands; band++ ) + { + reconstruct_ism_ratios( ratio_ism_idx[band], n_ism, 1.0f / (float) ( ( 1 << PARAM_ISM_POW_RATIO_NBITS ) - 1 ), ratio_ism[sf][band] ); + } + + if ( ( n_ism > 2 ) && ( idx_separated_object == n_ism - 1 ) ) + { + /* rotate */ + for ( band = 0; band < nbands; band++ ) + { + if ( masa_to_total_energy_ratio[sf][band] < MASA2TOTAL_THR ) + { + tmp = ratio_ism[sf][band][n_ism - 1]; + ratio_ism[sf][band][n_ism - 1] = ratio_ism[sf][band][0]; + ratio_ism[sf][band][0] = tmp; + } + } + } + + if ( nbands == 1 ) + { + for ( band = 1; band < 5; band++ ) + { + mvr2r( ratio_ism[sf][0], ratio_ism[sf][band], n_ism ); + } + } + } + + if ( numSf == 1 ) + { + for ( sf = 1; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) + { + for ( band = 0; band < nbands; band++ ) + { + mvr2r( ratio_ism[0][band], ratio_ism[sf][band], n_ism ); + } + } + } + + return; +} + + +static int16_t ivas_decode_masaism_metadata( + IVAS_QMETADATA_HANDLE hQMetaData, + MASA_DECODER_HANDLE hMasa, + MASA_ISM_DATA_HANDLE hMasaIsmData, + const int16_t nchan_ism, + uint16_t *bit_stream, + int16_t *next_bit_pos, + const int16_t idx_separated_object, + const int16_t ism_imp, + const int16_t dirac_bs_md_write_idx, + const int16_t dirac_md_buffer_length ) +{ + int16_t sf, band, dir, nbands, nblocks, obj, i; + float energy_ratio_ism[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS][MAX_NUM_OBJECTS]; + int16_t *band_mapping; + int16_t b; + int16_t bits_ism[MAX_NUM_OBJECTS], index; + uint16_t idx_el, idx_az; + float azimuth, elevation; + int16_t nb_bits_read; + float delta_phi; + int16_t meta_write_index; + + nb_bits_read = *next_bit_pos; + nbands = hQMetaData->q_direction->cfg.nbands; + nblocks = hQMetaData->q_direction->cfg.nblocks; + + /* Read MASA-to-total energy ratios */ + ivas_omasa_decode_masa_to_total( bit_stream, next_bit_pos, hMasaIsmData->masa_to_total_energy_ratio, nbands, nblocks ); + if ( nchan_ism > 1 ) + { + /* read ISM ratios */ + decode_ism_ratios( bit_stream, next_bit_pos, hMasaIsmData->masa_to_total_energy_ratio, energy_ratio_ism, nchan_ism, nbands, nblocks, idx_separated_object ); + } + else + { + for ( sf = 0; sf < nblocks; sf++ ) + { + for ( band = 0; band < nbands; band++ ) + { + energy_ratio_ism[sf][band][0] = 1.0f; + } + } + } + + /* read ISM metadata */ + calculate_nbits_meta( nchan_ism, energy_ratio_ism, hMasaIsmData->masa_to_total_energy_ratio, nblocks, nbands, bits_ism, idx_separated_object, ism_imp ); + + for ( obj = 0; obj < nchan_ism; obj++ ) + { + index = 0; + if ( bits_ism[obj] < 8 ) /* if low resolution, can look to the past */ + { + /* read if same as previous */ + if ( bit_stream[( *next_bit_pos )--] ) + { + azimuth = hMasaIsmData->q_azimuth_old[obj]; + elevation = hMasaIsmData->q_elevation_old[obj]; + } + else + { + for ( i = 0; i < bits_ism[obj]; i++ ) + { + index = ( index << 1 ) + bit_stream[( *next_bit_pos )--]; + } + deindex_spherical_component( index, &azimuth, &elevation, &idx_az, &idx_el, bits_ism[obj], MC_LS_SETUP_INVALID ); + + if ( azimuth * hMasaIsmData->q_azimuth_old[obj] > 0 ) + { + delta_phi = 180.0f / (float) ( no_phi_masa[bits_ism[obj] - 1][idx_el] ); /* 360/2*/ + if ( azimuth - hMasaIsmData->q_azimuth_old[obj] > delta_phi ) + { + azimuth -= delta_phi; + } + else + { + if ( hMasaIsmData->q_azimuth_old[obj] - azimuth > delta_phi ) + { + azimuth += delta_phi; + } + } + } + + hMasaIsmData->q_azimuth_old[obj] = azimuth; + hMasaIsmData->q_elevation_old[obj] = elevation; + } + } + else + { + for ( i = 0; i < bits_ism[obj]; i++ ) + { + index = ( index << 1 ) + bit_stream[( *next_bit_pos )--]; + } + deindex_spherical_component( index, &azimuth, &elevation, &idx_az, &idx_el, bits_ism[obj], MC_LS_SETUP_INVALID ); + hMasaIsmData->q_azimuth_old[obj] = azimuth; + hMasaIsmData->q_elevation_old[obj] = elevation; + } + + for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) + { + meta_write_index = ( dirac_bs_md_write_idx + sf ) % dirac_md_buffer_length; + hMasaIsmData->azimuth_ism[obj][meta_write_index] = (int16_t) rint( azimuth ); + hMasaIsmData->elevation_ism[obj][meta_write_index] = (int16_t) rint( elevation ); + } + } + + /* Modify ISM metadata based on the MASA-to-total energy ratios */ + for ( sf = 0; sf < nblocks; sf++ ) + { + for ( band = 0; band < nbands; band++ ) + { + for ( dir = 0; dir < nchan_ism; dir++ ) + { + energy_ratio_ism[sf][band][dir] *= ( 1.0f - hMasaIsmData->masa_to_total_energy_ratio[sf][band] ); + } + } + } + + /* Set data to struct in bins */ + band_mapping = hMasa->data.band_mapping; + for ( band = 0; band < hMasa->config.numCodingBands; ++band ) + { + for ( b = MASA_band_grouping_24[band_mapping[band]]; b < MASA_band_grouping_24[band_mapping[band + 1]]; ++b ) + { + for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; ++sf ) + { + if ( nblocks == 1 ) + { + i = 0; + } + else + { + i = sf; + } + + meta_write_index = ( dirac_bs_md_write_idx + sf ) % dirac_md_buffer_length; + + for ( dir = 0; dir < nchan_ism; dir++ ) + { + hMasaIsmData->energy_ratio_ism[dir][meta_write_index][b] = energy_ratio_ism[i][band][dir]; + } + } + } + } + + return ( nb_bits_read - *next_bit_pos ); +} diff --git a/lib_dec/ivas_mc_param_dec.c b/lib_dec/ivas_mc_param_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..0f84823e5d3c4ac38c84227621138bf8fa353559 --- /dev/null +++ b/lib_dec/ivas_mc_param_dec.c @@ -0,0 +1,3011 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "rom_enc.h" +#include "rom_com.h" +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_prot_rend.h" +#include "ivas_cnst.h" +#include "ivas_rom_com.h" +#include "ivas_rom_dec.h" +#include "math.h" +#include "wmc_auto.h" +#include "rom_dec.h" + +/*-----------------------------------------------------------------------* + * Local constants + *-----------------------------------------------------------------------*/ + +#define PARAM_MC_LOCAL_SZ_LFE_MAP 5 + +/*-----------------------------------------------------------------------* + * Local typedefs + *-----------------------------------------------------------------------*/ + +typedef struct parameter_band_mapping_struct +{ + int16_t n_source_bands[20]; + int16_t source_band_idx[20][4]; + float source_band_factor[20][4]; + +} PARAM_MC_PARAMETER_BAND_MAPPING; + +/*-----------------------------------------------------------------------* + * Local function prototypes + *-----------------------------------------------------------------------*/ + +static void ivas_param_mc_dec_init( PARAM_MC_DEC_HANDLE hParamMC, const int16_t nchan_in, const int16_t nchan_out ); + +static void param_mc_protoSignalComputation( float *RealBuffer, float *ImagBuffer, float *proto_frame_f, const PARAM_MC_DIFF_PROTO_INFO *diff_proto_info, const int16_t num_freq_bands ); + +static void ivas_param_mc_dec_copy_diffuse_proto( PARAM_MC_DEC_HANDLE hParamMC, float Cldfb_buffer_real[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float Cldfb_buffer_imag[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t nY, const int16_t slot_idx ); + +static int16_t ivas_param_mc_range_decoder_LC( uint16_t *bit_buffer, int16_t *x, int16_t *BER_detect, const int16_t sz_seq, const int16_t sz_alphabet, const uint16_t *cft, const uint16_t *sft, const int16_t tot_shift, const int16_t nbbits ); + +static int16_t ivas_param_mc_uniform_decoder( float *seq, const int16_t sz_seq, const float *alphabet, const int16_t N, uint16_t bit_buffer[PARAM_MC_MAX_BITS] ); + +static void ivas_param_mc_dequantize_cov( PARAM_MC_DEC_HANDLE hDirAC, float *ild_q, float *icc_q, const int16_t param_band_index, const int16_t nY_int, const PARAM_MC_SYNTHESIS_CONF synth_conf, const int16_t nY, const int16_t nX, float *Cx_state, float *Cproto, float *Cy_state ); + +static void ivas_param_mc_get_mixing_matrices( PARAM_MC_DEC_HANDLE hParamMC, IVAS_OUTPUT_SETUP *hSynthesisOutputSetup, float Cx_in[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS], float *mixing_matrix[], float *mixing_matrix_res[], const int16_t nY_int, const PARAM_MC_SYNTHESIS_CONF synth_conf, const int16_t nX, const int16_t nY ); + +static void ivas_param_mc_get_mono_stereo_mixing_matrices( PARAM_MC_DEC_HANDLE hParamMC, float Cx_in[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS], float *mixing_matrix[], float *mixing_matrix_res[], const int16_t nY_intern, const int16_t nX, const int16_t nY_cov ); + +static void param_mc_update_mixing_matrices( PARAM_MC_DEC_HANDLE hParamMC, float *mixing_matrix[], float *mixing_matrix_res[], const uint16_t nX, const uint16_t nY ); + +static void ivas_param_mc_dec_compute_interpolator( const uint16_t bAttackPresent, const uint16_t attackPos, const uint16_t interp_length, float *interpolator ); + +static void param_mc_set_num_synth_bands( const int32_t output_Fs, PARAM_MC_DEC_HANDLE hParamMC ); + +static ivas_error param_mc_get_diff_proto_info( const float *proto_mtx, const uint16_t nchan_transport, const uint16_t nchan_out_cov, PARAM_MC_DIFF_PROTO_INFO *p_diff_proto_info ); + +static void ivas_param_mc_get_param_band_mapping( const int16_t n_target_bands, const int16_t *target_band_grouping, const int16_t n_source_bands, const int16_t *source_band_grouping, PARAM_MC_PARAMETER_BAND_MAPPING *parameter_band_mapping ); + +static void ivas_param_mc_bs_decode_parameter_values( uint16_t bit_buffer[], int16_t *bit_pos, const int16_t max_bits, int16_t *BER_detect, HANDLE_IVAS_PARAM_MC_METADATA hMetadataPMC, HANDLE_PARAM_MC_PARAMETER_CODING_INFO hParamCodingInfo, const int16_t map_size_wo_lfe, const int16_t map_size, const int16_t num_lfe_bands, const int16_t band_step, const int16_t num_param_bands, float *value_buffer ); + +/*------------------------------------------------------------------------- + * ivas_param_mc_dec_open() + * + * Open Parametric MC decoder handle + *-------------------------------------------------------------------------*/ + +ivas_error ivas_param_mc_dec_open( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +) +{ + int16_t k, nchan_transport; + PARAM_MC_DEC_HANDLE hParamMC; + IVAS_OUTPUT_SETUP hTransportSetup; + int16_t nchan_out_transport; + int16_t nchan_out_cov; + float proto_matrix[MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS]; + float proto_mtx_norm; + int16_t max_param_band_residual; + uint16_t config_index; + MC_LS_SETUP mc_ls_setup; + float frequency_axis[CLDFB_NO_CHANNELS_MAX]; + AUDIO_CONFIG output_config; + int32_t output_Fs, ivas_total_brate; + ivas_error error; + + error = IVAS_ERR_OK; + + /*-----------------------------------------------------------------* + * prepare library opening + *-----------------------------------------------------------------*/ + + if ( ( hParamMC = (PARAM_MC_DEC_HANDLE) malloc( sizeof( PARAM_MC_DEC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); + } + + if ( ( hParamMC->hMetadataPMC = (HANDLE_IVAS_PARAM_MC_METADATA) malloc( sizeof( IVAS_PARAM_MC_METADATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC metadata \n" ) ); + } + + output_Fs = st_ivas->hDecoderConfig->output_Fs; + output_config = st_ivas->hDecoderConfig->output_config; + ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; + + hTransportSetup = st_ivas->hTransSetup; + mc_ls_setup = ivas_mc_map_output_config_to_mc_ls_setup( st_ivas->transport_config ); + nchan_out_transport = st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe; + hParamMC->hoa_encoder = NULL; + + /* determine the synthesis config */ + if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM || st_ivas->renderer_type == RENDERER_BINAURAL_OBJECTS_TD || st_ivas->transport_config == output_config ) + { + hParamMC->synthesis_conf = PARAM_MC_SYNTH_DIRECT; + } + else if ( output_config == IVAS_AUDIO_CONFIG_MONO || output_config == IVAS_AUDIO_CONFIG_STEREO ) + { + hParamMC->synthesis_conf = PARAM_MC_SYNTH_MONO_STEREO; + } + else if ( st_ivas->transport_config != output_config ) + { + if ( ( output_config != IVAS_AUDIO_CONFIG_LS_CUSTOM && nchan_out_transport > audioCfg2channels( output_config ) ) || ( output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM && nchan_out_transport > st_ivas->hOutSetup.nchan_out_woLFE ) ) + { + hParamMC->synthesis_conf = PARAM_MC_SYNTH_LS_CONV_COV; + /* need to reset the intern config */ + st_ivas->intern_config = output_config; + ivas_output_init( &( st_ivas->hIntSetup ), st_ivas->intern_config ); + if ( output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM ) + { + st_ivas->hIntSetup.nchan_out_woLFE = st_ivas->hLsSetupCustom->num_spk; + st_ivas->hIntSetup.ls_azimuth = st_ivas->hLsSetupCustom->ls_azimuth; + st_ivas->hIntSetup.ls_elevation = st_ivas->hLsSetupCustom->ls_elevation; + } + } + else + { + hParamMC->synthesis_conf = PARAM_MC_SYNTH_LS_CONV_CLDFB; + } + } + + hParamMC->ls_conv_dmx_matrix = NULL; + + if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_COV || hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) + { + nchan_out_cov = st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe; + } + else + { + nchan_out_cov = nchan_out_transport; + } + + st_ivas->nchan_transport = ivas_param_mc_getNumTransportChannels( ivas_total_brate, mc_ls_setup ); + config_index = ivas_param_mc_get_configuration_index( mc_ls_setup, ivas_total_brate ); + nchan_transport = st_ivas->nchan_transport; + + switch ( nchan_transport ) + { + case 4: + case 3: + st_ivas->nCPE = 2; + st_ivas->nSCE = 0; + st_ivas->element_mode_init = IVAS_CPE_MDCT; + break; + case 2: + st_ivas->nCPE = 1; + st_ivas->nSCE = 0; + st_ivas->element_mode_init = IVAS_CPE_MDCT; + + break; + } + + /*-----------------------------------------------------------------* + * set input parameters + *-----------------------------------------------------------------*/ + + hParamMC->slot_size = (int16_t) ( output_Fs / FRAMES_PER_SEC ) / CLDFB_NO_COL_MAX; + set_s( hParamMC->subframe_nbslots, 0, MAX_JBM_SUBFRAMES_5MS ); + set_s( hParamMC->subframe_nbslots, PARAM_MC_MAX_NSLOTS_IN_SUBFRAME, DEFAULT_JBM_SUBFRAMES_5MS ); + hParamMC->nb_subframes = DEFAULT_JBM_SUBFRAMES_5MS; + + hParamMC->num_freq_bands = (int16_t) ( output_Fs * INV_CLDFB_BANDWIDTH + 0.5f ); + hParamMC->max_band_energy_compensation = hParamMC->num_freq_bands; + ivas_param_mc_metadata_open( mc_ls_setup, hTransportSetup.index_lfe[0], ivas_total_brate, hParamMC->hMetadataPMC ); + + /* init arrays for quantized parameters */ + if ( ( hParamMC->icc_q = (float *) malloc( hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->icc_mapping_conf->icc_map_size_lfe * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); + } + if ( ( hParamMC->icld_q = (float *) malloc( hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->ild_mapping_conf->ild_map_size_lfe * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); + } + set_f( hParamMC->icld_q, PARAM_MC_DEFAULT_MIN_ILD, hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->ild_mapping_conf->ild_map_size_lfe ); + set_f( hParamMC->icc_q, 0.0f, hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->icc_mapping_conf->icc_map_size_lfe ); + + param_mc_set_num_synth_bands( output_Fs, hParamMC ); + + /* Band Grouping */ + if ( hParamMC->hMetadataPMC->num_parameter_bands == 20 ) + { + mvs2s( param_mc_band_grouping_20, hParamMC->band_grouping, 20 + 1 ); + } + else if ( hParamMC->hMetadataPMC->num_parameter_bands == 14 ) + { + mvs2s( param_mc_band_grouping_14, hParamMC->band_grouping, 14 + 1 ); + } + else if ( hParamMC->hMetadataPMC->num_parameter_bands == 10 ) + { + mvs2s( param_mc_band_grouping_10, hParamMC->band_grouping, 10 + 1 ); + } + else + { + assert( 0 && "nbands must be 20, 14, or 10!" ); + } + + /* set max parameter band for abs cov */ + k = 0; + while ( hParamMC->band_grouping[k] <= PARAM_MC_MAX_BAND_ABS_COV_DEC ) + { + hParamMC->max_param_band_abs_cov = ( k++ ); + } + + /*-----------------------------------------------------------------* + * open sub-modules + *-----------------------------------------------------------------*/ + + /* prototype signal computation */ + + if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_CLDFB || hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_COV || hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) + { + if ( ( error = ivas_ls_setup_conversion_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* convert the ls conv dmx matrix into column order matrix format (nchan_out_cldfb x nchan_out) */ + if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_COV || hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) + { + if ( ( hParamMC->ls_conv_dmx_matrix = (float *) malloc( nchan_out_transport * nchan_out_cov * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); + } + + for ( k = 0; k < nchan_out_transport; k++ ) + { + mvr2r( st_ivas->hLsSetUpConversion->dmxMtx[k], &hParamMC->ls_conv_dmx_matrix[k * nchan_out_cov], nchan_out_cov ); + } + + /* convert ParamMC parameter bands to SFB */ + if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) + { + st_ivas->hLsSetUpConversion->sfbCnt = hParamMC->num_param_bands_synth; + for ( k = 0; k <= hParamMC->num_param_bands_synth; k++ ) + { + st_ivas->hLsSetUpConversion->sfbOffset[k] = PARAM_MC_BAND_TO_MDCT_BAND_RATIO * hParamMC->band_grouping[k]; + } + } + else + { + /* close the ls conversion handle immediately, it was only needed to get the DMX matrix in case of DMX in the covariance domain */ + ivas_ls_setup_conversion_close( &st_ivas->hLsSetUpConversion ); + } + } + } + + if ( ( hParamMC->proto_matrix_int = (float *) malloc( nchan_out_transport * nchan_transport * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); + } + mvr2r( ivas_param_mc_conf[config_index].dmx_fac, hParamMC->proto_matrix_int, nchan_transport * nchan_out_transport ); + + if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_COV || hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) + { + matrix_product( hParamMC->ls_conv_dmx_matrix, nchan_out_cov, nchan_out_transport, 0, ivas_param_mc_conf[config_index].dmx_fac, nchan_out_transport, nchan_transport, 0, proto_matrix ); + + if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) + { + proto_mtx_norm = 1.f; + for ( k = 0; k < nchan_transport * nchan_out_cov; k++ ) + { + proto_mtx_norm = max( fabsf( proto_mtx_norm ), fabsf( proto_matrix[k] ) ); + } + proto_mtx_norm = 1.f / proto_mtx_norm; + + /* transfer flattened proto_matrix to 2D in hLsSetupConversion->dmxMtx */ + for ( k = 0; k < nchan_transport; k++ ) + { + for ( int16_t i = 0; i < nchan_out_cov; i++ ) + { + st_ivas->hLsSetUpConversion->dmxMtx[k][i] = proto_matrix[k * nchan_out_cov + i] * proto_mtx_norm; + } + } + } + } + else + { + mvr2r( ivas_param_mc_conf[config_index].dmx_fac, proto_matrix, nchan_out_transport * nchan_transport ); + } + + if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) + { + hParamMC->num_outputs_diff = 0; + hParamMC->diff_proto_info = NULL; + hParamMC->h_output_synthesis_params.use_onset_filters = 0; + hParamMC->max_band_decorr = 0; + hParamMC->h_freq_domain_decorr_ap_params = NULL; + hParamMC->h_freq_domain_decorr_ap_state = NULL; + } + else + { + hParamMC->num_outputs_diff = nchan_out_cov; + if ( ( hParamMC->diff_proto_info = (PARAM_MC_DIFF_PROTO_INFO *) malloc( sizeof( PARAM_MC_DIFF_PROTO_INFO ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); + } + + if ( ( error = param_mc_get_diff_proto_info( proto_matrix, nchan_transport, nchan_out_cov, hParamMC->diff_proto_info ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* decorrelation */ + hParamMC->h_freq_domain_decorr_ap_params = NULL; + hParamMC->h_freq_domain_decorr_ap_state = NULL; + + ivas_dirac_dec_get_frequency_axis( frequency_axis, output_Fs, hParamMC->num_freq_bands ); + + if ( ( error = ivas_dirac_dec_decorr_open( &( hParamMC->h_freq_domain_decorr_ap_params ), &( hParamMC->h_freq_domain_decorr_ap_state ), hParamMC->num_freq_bands, hParamMC->num_outputs_diff, hParamMC->diff_proto_info->num_protos_diff, + DIRAC_SYNTHESIS_COV_MC_LS, frequency_axis, nchan_transport, output_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } + + hParamMC->h_output_synthesis_params.use_onset_filters = 0; + hParamMC->max_band_decorr = hParamMC->h_freq_domain_decorr_ap_params->max_band_decorr; + } + hParamMC->max_band_energy_compensation = hParamMC->band_grouping[hParamMC->hMetadataPMC->nbands_coded]; + max_param_band_residual = 0; + + for ( k = hParamMC->hMetadataPMC->num_parameter_bands; k >= 0; k-- ) + { + if ( hParamMC->band_grouping[k] <= hParamMC->max_band_decorr ) + { + max_param_band_residual = k; + assert( hParamMC->band_grouping[k] == hParamMC->max_band_decorr ); + break; + } + } + + /* output synthesis */ + if ( ( error = ivas_dirac_dec_output_synthesis_cov_open( &( hParamMC->h_output_synthesis_params ), &( hParamMC->h_output_synthesis_cov_state ), hParamMC->max_band_decorr, PARAM_MC_MAX_NSLOTS, + hParamMC->hMetadataPMC->num_parameter_bands, max_param_band_residual, nchan_transport, nchan_out_cov, proto_matrix ) ) != IVAS_ERR_OK ) + { + return error; + } + + ivas_param_mc_dec_compute_interpolator( 0, 0, DEFAULT_JBM_CLDFB_TIMESLOTS, hParamMC->h_output_synthesis_params.interpolator ); + + /* Head or external rotation */ + if ( ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) && ( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation ) ) + { + if ( ( hParamMC->hoa_encoder = (float *) malloc( st_ivas->hTransSetup.nchan_out_woLFE * MAX_INTERN_CHANNELS * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); + } + compute_hoa_encoder_mtx( st_ivas->hTransSetup.ls_azimuth, st_ivas->hTransSetup.ls_elevation, hParamMC->hoa_encoder, st_ivas->hTransSetup.nchan_out_woLFE, HEAD_ROTATION_HOA_ORDER ); + } + + /*-----------------------------------------------------------------* + * memory allocation + *-----------------------------------------------------------------*/ + + if ( hParamMC->max_band_decorr > 0 ) + { + if ( ( hParamMC->proto_frame_f = (float *) malloc( 2 * hParamMC->diff_proto_info->num_protos_diff * hParamMC->num_freq_bands * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); + } + + if ( ( hParamMC->proto_frame_dec_f = (float *) malloc( 2 * nchan_out_cov * hParamMC->num_freq_bands * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); + } + } + else + { + hParamMC->proto_frame_f = NULL; + hParamMC->proto_frame_dec_f = NULL; + } + + ivas_param_mc_dec_init( hParamMC, nchan_transport, nchan_out_cov ); + + if ( st_ivas->hDecoderConfig->Opt_5ms && hParamMC->synthesis_conf != PARAM_MC_SYNTH_MONO_STEREO ) + { + int16_t n_cldfb_slots; + + n_cldfb_slots = DEFAULT_JBM_CLDFB_TIMESLOTS; + if ( st_ivas->hDecoderConfig->Opt_tsm ) + { + n_cldfb_slots = MAX_JBM_CLDFB_TIMESLOTS; + } + if ( ( hParamMC->Cldfb_RealBuffer_tc = (float *) malloc( n_cldfb_slots * nchan_transport * hParamMC->num_freq_bands * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC JBM\n" ) ); + } + set_zero( hParamMC->Cldfb_RealBuffer_tc, n_cldfb_slots * nchan_transport * hParamMC->num_freq_bands ); + + if ( ( hParamMC->Cldfb_ImagBuffer_tc = (float *) malloc( n_cldfb_slots * nchan_transport * hParamMC->num_freq_bands * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC JBM\n" ) ); + } + set_zero( hParamMC->Cldfb_ImagBuffer_tc, n_cldfb_slots * nchan_transport * hParamMC->num_freq_bands ); + + if ( st_ivas->hTcBuffer == NULL ) + { + if ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, TC_BUFFER_MODE_RENDERER, nchan_transport, nchan_transport, 0, NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + else + { + hParamMC->Cldfb_RealBuffer_tc = NULL; + hParamMC->Cldfb_ImagBuffer_tc = NULL; + } + + hParamMC->subframes_rendered = 0; + hParamMC->slots_rendered = 0; + + st_ivas->hParamMC = hParamMC; + + return error; +} + + +/*------------------------------------------------------------------------- + * ivas_param_mc_get_param_band_mapping() + * + * + *-------------------------------------------------------------------------*/ + +static void ivas_param_mc_get_param_band_mapping( + const int16_t n_target_bands, + const int16_t *target_band_grouping, + const int16_t n_source_bands, + const int16_t *source_band_grouping, + PARAM_MC_PARAMETER_BAND_MAPPING *parameter_band_mapping ) +{ + int16_t target_band_idx; + int16_t source_band_idx = 0; + int16_t source_band_cnt_total; + + for ( target_band_idx = 0; target_band_idx < n_target_bands; target_band_idx++ ) + { + int16_t upper = target_band_grouping[target_band_idx + 1]; + int16_t lower = target_band_grouping[target_band_idx]; + int16_t source_band_in_target_band_cnt = 0; + float norm_fac = 1.0f; + source_band_cnt_total = 0; + for ( source_band_idx = 0; source_band_idx < n_source_bands; source_band_idx++ ) + { + /* find lowest corresponding source band*/ + if ( source_band_grouping[source_band_idx] <= lower && source_band_grouping[source_band_idx + 1] >= lower ) + { + do + { + int16_t source_bands_in_target_band = min( source_band_grouping[source_band_idx + 1], upper ) - max( source_band_grouping[source_band_idx], lower ); + if ( source_bands_in_target_band ) + { + source_band_cnt_total += source_bands_in_target_band; + parameter_band_mapping->source_band_idx[target_band_idx][source_band_in_target_band_cnt] = source_band_idx; + parameter_band_mapping->source_band_factor[target_band_idx][source_band_in_target_band_cnt++] = (float) source_bands_in_target_band; + } + source_band_idx++; + } while ( source_band_grouping[source_band_idx] <= upper && source_band_idx < n_source_bands ); + break; + } + } + norm_fac = 1.0f / ( (float) source_band_cnt_total ); + for ( source_band_idx = 0; source_band_idx < source_band_in_target_band_cnt; source_band_idx++ ) + { + + parameter_band_mapping->source_band_factor[target_band_idx][source_band_idx] *= norm_fac; + } + parameter_band_mapping->n_source_bands[target_band_idx] = source_band_in_target_band_cnt; + } + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_param_mc_dec_reconfig() + * + * Reconfiguration of ParamMC decoder + *-------------------------------------------------------------------------*/ + +ivas_error ivas_param_mc_dec_reconfig( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +) +{ + int16_t k, nchan_transport; + PARAM_MC_DEC_HANDLE hParamMC; + IVAS_OUTPUT_SETUP hTransportSetup; + int16_t nchan_out_transport; + int16_t nchan_out_cov; + float proto_matrix[MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS]; + float proto_mtx_norm; + int16_t max_param_band_residual; + uint16_t config_index; + MC_LS_SETUP mc_ls_setup; + float frequency_axis[CLDFB_NO_CHANNELS_MAX]; + int32_t output_Fs, ivas_total_brate; + ivas_error error; + int16_t nchan_transport_old; + int16_t num_param_bands_old; + PARAM_MC_PARAMETER_BAND_MAPPING parameter_band_mapping; + int16_t band_grouping_old[20 + 1]; + + error = IVAS_ERR_OK; + hParamMC = st_ivas->hParamMC; + + /* save important config information from the previous state */ + nchan_transport_old = st_ivas->nchan_transport; + num_param_bands_old = hParamMC->hMetadataPMC->num_parameter_bands; + + /*-----------------------------------------------------------------* + * prepare library opening + *-----------------------------------------------------------------*/ + + output_Fs = st_ivas->hDecoderConfig->output_Fs; + ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; + + hTransportSetup = st_ivas->hTransSetup; + mc_ls_setup = ivas_mc_map_output_config_to_mc_ls_setup( st_ivas->transport_config ); + nchan_out_transport = st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe; + + if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_COV || hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) + { + nchan_out_cov = st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe; + } + else + { + nchan_out_cov = nchan_out_transport; + } + + st_ivas->nchan_transport = ivas_param_mc_getNumTransportChannels( ivas_total_brate, mc_ls_setup ); + config_index = ivas_param_mc_get_configuration_index( mc_ls_setup, ivas_total_brate ); + nchan_transport = st_ivas->nchan_transport; + + switch ( nchan_transport ) + { + case 4: + case 3: + st_ivas->nCPE = 2; + st_ivas->nSCE = 0; + st_ivas->element_mode_init = IVAS_CPE_MDCT; + break; + case 2: + st_ivas->nCPE = 1; + st_ivas->nSCE = 0; + st_ivas->element_mode_init = IVAS_CPE_MDCT; + + break; + } + + /*-----------------------------------------------------------------* + * set input parameters + *-----------------------------------------------------------------*/ + + hParamMC->num_freq_bands = (int16_t) ( output_Fs * INV_CLDFB_BANDWIDTH + 0.5f ); + hParamMC->max_band_energy_compensation = hParamMC->num_freq_bands; + + /* deallocate the full icc map, gets newly allocated in the metadata open function */ + + for ( k = 0; k < 2; k++ ) + { + if ( hParamMC->hMetadataPMC->icc_map_full[k] != NULL ) + { + free( hParamMC->hMetadataPMC->icc_map_full[k] ); + hParamMC->hMetadataPMC->icc_map_full[k] = NULL; + } + } + + mvs2s( hParamMC->band_grouping, band_grouping_old, hParamMC->hMetadataPMC->num_parameter_bands + 1 ); + + ivas_param_mc_metadata_open( mc_ls_setup, hTransportSetup.index_lfe[0], ivas_total_brate, hParamMC->hMetadataPMC ); + + /* Band Grouping */ + if ( hParamMC->hMetadataPMC->num_parameter_bands == 20 ) + { + mvs2s( param_mc_band_grouping_20, hParamMC->band_grouping, 20 + 1 ); + } + else if ( hParamMC->hMetadataPMC->num_parameter_bands == 14 ) + { + mvs2s( param_mc_band_grouping_14, hParamMC->band_grouping, 14 + 1 ); + } + else if ( hParamMC->hMetadataPMC->num_parameter_bands == 10 ) + { + mvs2s( param_mc_band_grouping_10, hParamMC->band_grouping, 10 + 1 ); + } + else + { + assert( 0 && "nbands must be 20, 14, or 10!" ); + } + + ivas_param_mc_get_param_band_mapping( hParamMC->hMetadataPMC->num_parameter_bands, hParamMC->band_grouping, num_param_bands_old, band_grouping_old, ¶meter_band_mapping ); + + if ( nchan_transport_old != nchan_transport || num_param_bands_old != hParamMC->hMetadataPMC->num_parameter_bands ) + { + float *ild_q_old = hParamMC->icld_q; + float *icc_q_old = hParamMC->icc_q; + + + /* init arrays for the quantized parameters */ + if ( ( hParamMC->icc_q = (float *) malloc( hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->icc_mapping_conf->icc_map_size_lfe * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); + } + if ( ( hParamMC->icld_q = (float *) malloc( hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->ild_mapping_conf->ild_map_size_lfe * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); + } + set_f( hParamMC->icld_q, PARAM_MC_DEFAULT_MIN_ILD, hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->ild_mapping_conf->ild_map_size_lfe ); + set_f( hParamMC->icc_q, 0.0f, hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->icc_mapping_conf->icc_map_size_lfe ); + + /* map old to new parameter banding, only for same number of TCs, needs some more thought for a changing number of TCs */ + if ( num_param_bands_old != hParamMC->hMetadataPMC->num_parameter_bands && nchan_transport_old == nchan_transport ) + { + int16_t new_param_band_idx, param_idx, source_param_idx; + int16_t num_param_lfe; + float *p_icc_new = hParamMC->icc_q; + float *p_ild_new = hParamMC->icld_q; + + /* ICC */ + num_param_lfe = hParamMC->hMetadataPMC->icc_mapping_conf->icc_map_size_lfe; + for ( new_param_band_idx = 0; new_param_band_idx < hParamMC->hMetadataPMC->num_parameter_bands; new_param_band_idx++ ) + { + for ( param_idx = 0; param_idx < num_param_lfe; param_idx++ ) + { + *p_icc_new = 0.0f; + for ( source_param_idx = 0; source_param_idx < parameter_band_mapping.n_source_bands[new_param_band_idx]; source_param_idx++ ) + { + *p_icc_new += icc_q_old[parameter_band_mapping.source_band_idx[new_param_band_idx][source_param_idx] * num_param_lfe + param_idx] * parameter_band_mapping.source_band_factor[new_param_band_idx][source_param_idx]; + } + p_icc_new++; + } + } + + /* ILD */ + num_param_lfe = hParamMC->hMetadataPMC->ild_mapping_conf->ild_map_size_lfe; + for ( new_param_band_idx = 0; new_param_band_idx < hParamMC->hMetadataPMC->num_parameter_bands; new_param_band_idx++ ) + { + for ( param_idx = 0; param_idx < num_param_lfe; param_idx++ ) + { + *p_ild_new = 0.0f; + for ( source_param_idx = 0; source_param_idx < parameter_band_mapping.n_source_bands[new_param_band_idx]; source_param_idx++ ) + { + *p_ild_new += powf( 10.0f, ild_q_old[parameter_band_mapping.source_band_idx[new_param_band_idx][source_param_idx] * num_param_lfe + param_idx] / 10.0f ) * parameter_band_mapping.source_band_factor[new_param_band_idx][source_param_idx]; + } + *p_ild_new = 10.0f * log10f( *p_ild_new ); + p_ild_new++; + } + } + } + free( ild_q_old ); + free( icc_q_old ); + } + + param_mc_set_num_synth_bands( output_Fs, hParamMC ); + + /* set max parameter band for abs cov */ + k = 0; + while ( hParamMC->band_grouping[k] <= PARAM_MC_MAX_BAND_ABS_COV_DEC ) + { + hParamMC->max_param_band_abs_cov = ( k++ ); + } + + /*-----------------------------------------------------------------* + * open sub-modules + *-----------------------------------------------------------------*/ + + /* prototype signal computation */ + + if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) + { + if ( nchan_transport_old != nchan_transport ) + { + if ( st_ivas->hLsSetUpConversion != NULL ) + { + ivas_ls_setup_conversion_close( &st_ivas->hLsSetUpConversion ); + } + + if ( ( error = ivas_ls_setup_conversion_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* convert the ls conv dmx matrix into column order matrix format (nchan_out_cldfb x nchan_out) */ + free( hParamMC->ls_conv_dmx_matrix ); + if ( ( hParamMC->ls_conv_dmx_matrix = (float *) malloc( nchan_out_transport * nchan_out_cov * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); + } + for ( k = 0; k < nchan_out_transport; k++ ) + { + mvr2r( st_ivas->hLsSetUpConversion->dmxMtx[k], &hParamMC->ls_conv_dmx_matrix[k * nchan_out_cov], nchan_out_cov ); + } + } + /* convert ParamMC parameter bands to SFB */ + + st_ivas->hLsSetUpConversion->sfbCnt = hParamMC->num_param_bands_synth; + for ( k = 0; k <= hParamMC->num_param_bands_synth; k++ ) + { + st_ivas->hLsSetUpConversion->sfbOffset[k] = PARAM_MC_BAND_TO_MDCT_BAND_RATIO * hParamMC->band_grouping[k]; + } + for ( ; k < MAX_SFB + 2; k++ ) + { + st_ivas->hLsSetUpConversion->sfbOffset[k] = 0; + } + } + + if ( nchan_transport_old != nchan_transport ) + { + free( hParamMC->proto_matrix_int ); + if ( ( hParamMC->proto_matrix_int = (float *) malloc( nchan_out_transport * nchan_transport * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); + } + mvr2r( ivas_param_mc_conf[config_index].dmx_fac, hParamMC->proto_matrix_int, nchan_transport * nchan_out_transport ); + } + + if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_COV || hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) + { + matrix_product( hParamMC->ls_conv_dmx_matrix, nchan_out_cov, nchan_out_transport, 0, + ivas_param_mc_conf[config_index].dmx_fac, nchan_out_transport, nchan_transport, 0, + proto_matrix ); + + if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) + { + proto_mtx_norm = 1.f; + for ( k = 0; k < nchan_transport * nchan_out_cov; k++ ) + { + proto_mtx_norm = max( fabsf( proto_mtx_norm ), fabsf( proto_matrix[k] ) ); + } + proto_mtx_norm = 1.f / proto_mtx_norm; + + /* transfer flattened proto_matrix to 2D in hLsSetupConversion->dmxMtx */ + for ( k = 0; k < nchan_transport; k++ ) + { + for ( int16_t i = 0; i < nchan_out_cov; i++ ) + { + st_ivas->hLsSetUpConversion->dmxMtx[k][i] = proto_matrix[k * nchan_out_cov + i] * proto_mtx_norm; + } + } + } + } + else + { + mvr2r( ivas_param_mc_conf[config_index].dmx_fac, proto_matrix, nchan_out_transport * nchan_transport ); + } + + if ( nchan_transport_old != nchan_transport && hParamMC->synthesis_conf != PARAM_MC_SYNTH_MONO_STEREO ) + { + int16_t i; + int16_t len; + + /* close decorrelator */ + ivas_dirac_dec_decorr_close( &hParamMC->h_freq_domain_decorr_ap_params, &hParamMC->h_freq_domain_decorr_ap_state ); + + /* deallocate diffuse prototype info */ + if ( hParamMC->diff_proto_info ) + { + for ( i = 0; i < hParamMC->diff_proto_info->num_protos_diff; i++ ) + { + free( hParamMC->diff_proto_info->source_chan_idx[i] ); + hParamMC->diff_proto_info->source_chan_idx[i] = NULL; + + free( hParamMC->diff_proto_info->proto_fac[i] ); + hParamMC->diff_proto_info->proto_fac[i] = NULL; + } + + free( hParamMC->diff_proto_info->source_chan_idx ); + hParamMC->diff_proto_info->source_chan_idx = NULL; + + free( hParamMC->diff_proto_info->proto_fac ); + hParamMC->diff_proto_info->proto_fac = NULL; + + free( hParamMC->diff_proto_info->proto_index_diff ); + hParamMC->diff_proto_info->proto_index_diff = NULL; + + free( hParamMC->diff_proto_info->num_source_chan_diff ); + hParamMC->diff_proto_info->num_source_chan_diff = NULL; + + free( hParamMC->diff_proto_info ); + hParamMC->diff_proto_info = NULL; + } + + hParamMC->num_outputs_diff = nchan_out_cov; + if ( ( hParamMC->diff_proto_info = (PARAM_MC_DIFF_PROTO_INFO *) malloc( sizeof( PARAM_MC_DIFF_PROTO_INFO ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); + } + + if ( ( param_mc_get_diff_proto_info( proto_matrix, nchan_transport, nchan_out_cov, hParamMC->diff_proto_info ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* decorrelation */ + hParamMC->h_freq_domain_decorr_ap_params = NULL; + hParamMC->h_freq_domain_decorr_ap_state = NULL; + + ivas_dirac_dec_get_frequency_axis( frequency_axis, output_Fs, hParamMC->num_freq_bands ); + + if ( ( error = ivas_dirac_dec_decorr_open( &( hParamMC->h_freq_domain_decorr_ap_params ), &( hParamMC->h_freq_domain_decorr_ap_state ), hParamMC->num_freq_bands, hParamMC->num_outputs_diff, + hParamMC->diff_proto_info->num_protos_diff, DIRAC_SYNTHESIS_COV_MC_LS, frequency_axis, nchan_transport, output_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } + + hParamMC->h_output_synthesis_params.use_onset_filters = 0; + hParamMC->max_band_decorr = hParamMC->h_freq_domain_decorr_ap_params->max_band_decorr; + /* init decorrelation */ + if ( hParamMC->max_band_decorr > 0 ) + { + + len = hParamMC->diff_proto_info->num_protos_diff * hParamMC->h_freq_domain_decorr_ap_params->h_onset_detection_power_params.max_band_decorr; + + /* init onsetDetectionPower */ + set_zero( hParamMC->h_freq_domain_decorr_ap_state->h_onset_detection_power_state.onset_detector_1, len ); + set_zero( hParamMC->h_freq_domain_decorr_ap_state->h_onset_detection_power_state.onset_detector_2, len ); + } + } + hParamMC->max_band_energy_compensation = hParamMC->band_grouping[hParamMC->hMetadataPMC->nbands_coded]; + max_param_band_residual = 0; + + for ( k = hParamMC->hMetadataPMC->num_parameter_bands; k >= 0; k-- ) + { + if ( hParamMC->band_grouping[k] <= hParamMC->max_band_decorr ) + { + max_param_band_residual = k; + assert( hParamMC->band_grouping[k] == hParamMC->max_band_decorr ); + break; + } + } + + if ( nchan_transport_old != nchan_transport || num_param_bands_old != hParamMC->hMetadataPMC->num_parameter_bands ) + { + DIRAC_OUTPUT_SYNTHESIS_COV_STATE cov_state_old = hParamMC->h_output_synthesis_cov_state; + DIRAC_OUTPUT_SYNTHESIS_PARAMS params_old = hParamMC->h_output_synthesis_params; + float tmp_buf[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; + + set_zero( tmp_buf, MAX_CICP_CHANNELS * MAX_CICP_CHANNELS ); + + /* output synthesis */ + if ( ( error = ivas_dirac_dec_output_synthesis_cov_open( &( hParamMC->h_output_synthesis_params ), &( hParamMC->h_output_synthesis_cov_state ), hParamMC->max_band_decorr, PARAM_MC_MAX_NSLOTS, + hParamMC->hMetadataPMC->num_parameter_bands, max_param_band_residual, nchan_transport, nchan_out_cov, proto_matrix ) ) != IVAS_ERR_OK ) + { + return error; + } + + ivas_param_mc_dec_compute_interpolator( 0, 0, DEFAULT_JBM_CLDFB_TIMESLOTS, hParamMC->h_output_synthesis_params.interpolator ); + + ivas_dirac_dec_output_synthesis_cov_init( &( hParamMC->h_output_synthesis_cov_state ), nchan_transport, nchan_out_cov, hParamMC->hMetadataPMC->num_parameter_bands, max_param_band_residual ); + + /* map old to new parameter banding, only for same number of TCs, needs some more thought for changing number of TCs */ + if ( num_param_bands_old != hParamMC->hMetadataPMC->num_parameter_bands && nchan_transport_old == nchan_transport ) + { + int16_t new_param_band_idx, source_param_idx; + + + for ( new_param_band_idx = 0; new_param_band_idx < hParamMC->hMetadataPMC->num_parameter_bands; new_param_band_idx++ ) + { + for ( source_param_idx = 0; source_param_idx < parameter_band_mapping.n_source_bands[new_param_band_idx]; source_param_idx++ ) + { + /* Cx */ + v_multc( cov_state_old.cx_old[parameter_band_mapping.source_band_idx[new_param_band_idx][source_param_idx]], parameter_band_mapping.source_band_factor[new_param_band_idx][source_param_idx], tmp_buf, nchan_transport_old * nchan_transport_old ); + v_add( tmp_buf, hParamMC->h_output_synthesis_cov_state.cx_old[new_param_band_idx], hParamMC->h_output_synthesis_cov_state.cx_old[new_param_band_idx], nchan_transport_old * nchan_transport_old ); + /* Cy */ + v_multc( cov_state_old.cy_old[parameter_band_mapping.source_band_idx[new_param_band_idx][source_param_idx]], parameter_band_mapping.source_band_factor[new_param_band_idx][source_param_idx], tmp_buf, nchan_out_cov * nchan_out_cov ); + v_add( tmp_buf, hParamMC->h_output_synthesis_cov_state.cy_old[new_param_band_idx], hParamMC->h_output_synthesis_cov_state.cy_old[new_param_band_idx], nchan_out_cov * nchan_out_cov ); + /* mixing matrix*/ + v_multc( cov_state_old.mixing_matrix_old[parameter_band_mapping.source_band_idx[new_param_band_idx][source_param_idx]], parameter_band_mapping.source_band_factor[new_param_band_idx][source_param_idx], tmp_buf, nchan_transport_old * nchan_out_cov ); + v_add( tmp_buf, hParamMC->h_output_synthesis_cov_state.mixing_matrix_old[new_param_band_idx], hParamMC->h_output_synthesis_cov_state.mixing_matrix_old[new_param_band_idx], nchan_transport_old * nchan_out_cov ); + } + } + for ( new_param_band_idx = 0; new_param_band_idx < max_param_band_residual; new_param_band_idx++ ) + { + for ( source_param_idx = 0; source_param_idx < parameter_band_mapping.n_source_bands[new_param_band_idx]; source_param_idx++ ) + { + /* residual mixing matrix*/ + v_multc( cov_state_old.mixing_matrix_res_old[parameter_band_mapping.source_band_idx[new_param_band_idx][source_param_idx]], parameter_band_mapping.source_band_factor[new_param_band_idx][source_param_idx], tmp_buf, nchan_out_cov * nchan_out_cov ); + v_add( tmp_buf, hParamMC->h_output_synthesis_cov_state.mixing_matrix_res_old[new_param_band_idx], hParamMC->h_output_synthesis_cov_state.mixing_matrix_res_old[new_param_band_idx], nchan_out_cov * nchan_out_cov ); + } + } + } + + ivas_dirac_dec_output_synthesis_cov_close( ¶ms_old, &cov_state_old ); + } + + /*-----------------------------------------------------------------* + * memory allocation + *-----------------------------------------------------------------*/ + + if ( hParamMC->max_band_decorr > 0 && nchan_transport_old != nchan_transport ) + { + free( hParamMC->proto_frame_f ); + if ( ( hParamMC->proto_frame_f = (float *) malloc( 2 * hParamMC->diff_proto_info->num_protos_diff * hParamMC->num_freq_bands * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); + } + set_zero( hParamMC->proto_frame_f, 2 * hParamMC->diff_proto_info->num_protos_diff * hParamMC->num_freq_bands ); + } + + return error; +} + + +/*------------------------------------------------------------------------- + * param_mc_get_num_cldfb_syntheses() + * + * calculate the necessary number of CLDFB synthesis instances + *------------------------------------------------------------------------*/ + +/*! r: number of cldfb synthesis instances */ +int16_t param_mc_get_num_cldfb_syntheses( + Decoder_Struct *st_ivas /* i : Parametric MC handle */ +) +{ + int16_t num_cldfb_syntheses; + + num_cldfb_syntheses = 0; + + /* sanity check*/ + if ( st_ivas->hParamMC == NULL ) + { + assert( 0 && "ParamMC handle does not exist!\n" ); + } + + if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) + { + num_cldfb_syntheses = 2; + } + else if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) + { + num_cldfb_syntheses = st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe; + } + else if ( st_ivas->renderer_type == RENDERER_MC_PARAMMC ) + { + num_cldfb_syntheses = st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe; + } + + return num_cldfb_syntheses; +} + + +/*------------------------------------------------------------------------- + * ivas_param_mc_dec_close() + * + * Close Parametric MC memories + *------------------------------------------------------------------------*/ + +void ivas_param_mc_dec_close( + PARAM_MC_DEC_HANDLE *hParamMC_out /* i/o: Parametric MC decoder handle */ +) +{ + uint16_t i; + PARAM_MC_DEC_HANDLE hParamMC; + + if ( hParamMC_out == NULL || *hParamMC_out == NULL ) + { + return; + } + + hParamMC = *hParamMC_out; + + /* close sub-modules */ + ivas_dirac_dec_output_synthesis_cov_close( &hParamMC->h_output_synthesis_params, &hParamMC->h_output_synthesis_cov_state ); + + if ( hParamMC->h_freq_domain_decorr_ap_params != NULL || hParamMC->h_freq_domain_decorr_ap_state != NULL ) + { + ivas_dirac_dec_decorr_close( &hParamMC->h_freq_domain_decorr_ap_params, &hParamMC->h_freq_domain_decorr_ap_state ); + } + + /* parameter decoding */ + if ( hParamMC->hMetadataPMC != NULL ) + { + ivas_param_mc_metadata_close( hParamMC->hMetadataPMC ); + + free( hParamMC->hMetadataPMC ); + hParamMC->hMetadataPMC = NULL; + } + + if ( hParamMC->icc_q != NULL ) + { + free( hParamMC->icc_q ); + hParamMC->icc_q = NULL; + } + + if ( hParamMC->icld_q != NULL ) + { + free( hParamMC->icld_q ); + hParamMC->icld_q = NULL; + } + + /* diffuse prototype info */ + if ( hParamMC->diff_proto_info ) + { + for ( i = 0; i < hParamMC->diff_proto_info->num_protos_diff; i++ ) + { + free( hParamMC->diff_proto_info->source_chan_idx[i] ); + hParamMC->diff_proto_info->source_chan_idx[i] = NULL; + + free( hParamMC->diff_proto_info->proto_fac[i] ); + hParamMC->diff_proto_info->proto_fac[i] = NULL; + } + + free( hParamMC->diff_proto_info->source_chan_idx ); + hParamMC->diff_proto_info->source_chan_idx = NULL; + + free( hParamMC->diff_proto_info->proto_fac ); + hParamMC->diff_proto_info->proto_fac = NULL; + + free( hParamMC->diff_proto_info->proto_index_diff ); + hParamMC->diff_proto_info->proto_index_diff = NULL; + + free( hParamMC->diff_proto_info->num_source_chan_diff ); + hParamMC->diff_proto_info->num_source_chan_diff = NULL; + + free( hParamMC->diff_proto_info ); + hParamMC->diff_proto_info = NULL; + } + + /* States */ + /* free prototype signal buffers */ + if ( hParamMC->proto_frame_f != NULL ) + { + free( hParamMC->proto_frame_f ); + hParamMC->proto_frame_f = NULL; + } + + if ( hParamMC->proto_frame_dec_f != NULL ) + { + free( hParamMC->proto_frame_dec_f ); + hParamMC->proto_frame_dec_f = NULL; + } + + if ( hParamMC->ls_conv_dmx_matrix != NULL ) + { + free( hParamMC->ls_conv_dmx_matrix ); + hParamMC->ls_conv_dmx_matrix = NULL; + } + + if ( hParamMC->proto_matrix_int != NULL ) + { + free( hParamMC->proto_matrix_int ); + hParamMC->proto_matrix_int = NULL; + } + + if ( hParamMC->hoa_encoder != NULL ) + { + free( hParamMC->hoa_encoder ); + hParamMC->hoa_encoder = NULL; + } + + if ( hParamMC->Cldfb_RealBuffer_tc != NULL ) + { + free( hParamMC->Cldfb_RealBuffer_tc ); + hParamMC->Cldfb_RealBuffer_tc = NULL; + } + if ( hParamMC->Cldfb_ImagBuffer_tc != NULL ) + { + free( hParamMC->Cldfb_ImagBuffer_tc ); + hParamMC->Cldfb_ImagBuffer_tc = NULL; + } + + free( *hParamMC_out ); + *hParamMC_out = NULL; + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_param_mc_dec_read_BS() + * + * Read the Parametric MC metadata + *------------------------------------------------------------------------*/ + +void ivas_param_mc_dec_read_BS( + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + Decoder_State *st, /* i/o: decoder state structure */ + PARAM_MC_DEC_HANDLE hParamMC, /* i/o: decoder ParamMC handle */ + int16_t *nb_bits /* o : number of bits written */ +) +{ + int16_t param_frame_idx; + int16_t band_step; + uint16_t bit_buffer[PARAM_MC_MAX_BITS]; + int16_t bits_to_copy; + int16_t bit_pos; + int16_t num_lfe_bands; + int16_t num_param_bands; + int16_t metadata_bit_pos; + int16_t i, j, k, l; + int16_t icc_map_size; + int16_t icc_map_size_wo_lfe; + int16_t ild_map_size; + int16_t ild_map_size_wo_lfe; + HANDLE_IVAS_PARAM_MC_METADATA hMetadataPMC; + + push_wmops( "param_mc_read_bs" ); + + /* Inits */ + *nb_bits = 0; + hMetadataPMC = hParamMC->hMetadataPMC; + icc_map_size = hMetadataPMC->icc_mapping_conf->icc_map_size_lfe; + icc_map_size_wo_lfe = hMetadataPMC->icc_mapping_conf->icc_map_size_wo_lfe; + ild_map_size = hMetadataPMC->ild_mapping_conf->ild_map_size_lfe; + ild_map_size_wo_lfe = hMetadataPMC->ild_mapping_conf->ild_map_size_wo_lfe; + + if ( !st->bfi ) + { + metadata_bit_pos = (int16_t) ( ivas_total_brate / FRAMES_PER_SEC - 1 ); + bits_to_copy = (int16_t) min( ivas_total_brate / FRAMES_PER_SEC, PARAM_MC_MAX_BITS ); + + /* copy and reverse metadata */ + for ( bit_pos = 0; bit_pos < bits_to_copy; bit_pos++ ) + { + bit_buffer[bit_pos] = st->bit_stream[metadata_bit_pos--]; + } + + bit_pos = 0; + + /* read reserved bit */ + hMetadataPMC->lfe_on = bit_buffer[bit_pos++]; + + /* get coded bwidth */ + { + int16_t pos; + int16_t bw = 0; + for ( pos = 0; pos < 2; pos++ ) + { + bw += ( bit_buffer[bit_pos++] << pos ); + } + hMetadataPMC->coded_bwidth = bw; + } + + /* set tables if coded band width differs from last frame */ + if ( hMetadataPMC->coded_bwidth != hMetadataPMC->last_coded_bwidth ) + { + ivas_param_mc_set_coded_bands( hMetadataPMC ); + param_mc_set_num_synth_bands( st->output_Fs, hParamMC ); + hParamMC->max_band_energy_compensation = hParamMC->band_grouping[hParamMC->num_param_bands_synth]; + } + + param_frame_idx = bit_buffer[bit_pos++]; + hMetadataPMC->param_frame_idx = param_frame_idx; + num_param_bands = hMetadataPMC->nbands_in_param_frame[param_frame_idx]; + + hMetadataPMC->bAttackPresent = bit_buffer[bit_pos++]; + hMetadataPMC->attackIndex = 0; + band_step = 1; + num_lfe_bands = 0; + + if ( hMetadataPMC->bAttackPresent ) + { + for ( i = 2; i >= 0; i-- ) + { + hMetadataPMC->attackIndex += ( bit_buffer[bit_pos++] << i ); + } + + band_step = PARAM_MC_TRANSIENT_BAND_STEP; + num_lfe_bands = PARAM_MC_MAX_BAND_LFE / band_step + ( PARAM_MC_MAX_BAND_LFE % band_step ) ? 1 : 0; + num_param_bands = hMetadataPMC->nbands_coded / band_step + ( ( hMetadataPMC->nbands_coded % band_step ) ? 1 : 0 ); + } + else + { + for ( j = 0; j < PARAM_MC_MAX_BAND_LFE; j += band_step ) + { + if ( param_frame_idx == hMetadataPMC->coding_band_mapping[j] ) + { + /* LFE ICC is always the last ICC in coding band 0 */ + num_lfe_bands++; + } + } + } + + if ( !hMetadataPMC->lfe_on ) + { + num_lfe_bands = 0; + } + + if ( hMetadataPMC->flag_use_adaptive_icc_map == 1 ) + { + int16_t icc_mapping_index[PARAM_MC_SZ_ICC_MAP]; + + k = 0; + for ( i = 0; i < hMetadataPMC->icc_map_size_full - 1; i++ ) + { + if ( bit_buffer[bit_pos++] == 1 ) + { + icc_mapping_index[k++] = i; + } + } + + /* last one is always C/LFE */ + icc_mapping_index[k] = hMetadataPMC->icc_map_size_full - 1; + + /* save icc mapping of the previous frame*/ + /* build icc map for the current frame */ + for ( k = 0; k < icc_map_size; k++ ) + { + hMetadataPMC->icc_mapping[param_frame_idx][k][0] = hMetadataPMC->icc_map_full[0][icc_mapping_index[k]]; + hMetadataPMC->icc_mapping[param_frame_idx][k][1] = hMetadataPMC->icc_map_full[1][icc_mapping_index[k]]; + } + + if ( hMetadataPMC->bAttackPresent ) + { + for ( k = 0; k < icc_map_size; k++ ) + { + for ( l = 0; l < PARAM_MC_PARAMETER_FRAMES; l++ ) + { + hMetadataPMC->icc_mapping[l][k][0] = hMetadataPMC->icc_map_full[0][icc_mapping_index[k]]; + hMetadataPMC->icc_mapping[l][k][1] = hMetadataPMC->icc_map_full[1][icc_mapping_index[k]]; + } + } + } + else + { + for ( k = 0; k < icc_map_size; k++ ) + { + hMetadataPMC->icc_mapping[hMetadataPMC->param_frame_idx][k][0] = hMetadataPMC->icc_map_full[0][icc_mapping_index[k]]; + hMetadataPMC->icc_mapping[hMetadataPMC->param_frame_idx][k][1] = hMetadataPMC->icc_map_full[1][icc_mapping_index[k]]; + } + } + } + else + { + if ( hMetadataPMC->bAttackPresent ) + { + for ( l = 0; l < PARAM_MC_PARAMETER_FRAMES; l++ ) + { + ivas_param_mc_default_icc_map( hMetadataPMC->icc_mapping_conf, hMetadataPMC->icc_mapping[param_frame_idx] ); + } + } + else + { + ivas_param_mc_default_icc_map( hMetadataPMC->icc_mapping_conf, hMetadataPMC->icc_mapping[hMetadataPMC->param_frame_idx] ); + } + } + + ivas_param_mc_bs_decode_parameter_values( bit_buffer, &bit_pos, bits_to_copy, &st->BER_detect, hMetadataPMC, &hMetadataPMC->icc_coding, + icc_map_size_wo_lfe, icc_map_size, num_lfe_bands, band_step, num_param_bands, hParamMC->icc_q ); + if ( !st->BER_detect ) + { + ivas_param_mc_bs_decode_parameter_values( bit_buffer, &bit_pos, bits_to_copy, &st->BER_detect, hMetadataPMC, &hMetadataPMC->ild_coding, + ild_map_size_wo_lfe, ild_map_size, num_lfe_bands, band_step, num_param_bands, hParamMC->icld_q ); + } + /* set LFE ILD and ICC to zero above PARAM_MC_MAX_BAND_LFE for attack frames */ + if ( hMetadataPMC->bAttackPresent ) + { + for ( k = PARAM_MC_MAX_BAND_LFE; k < band_step * num_lfe_bands; k++ ) + { + hParamMC->icc_q[( k + 1 ) * icc_map_size - 1] = 1.0f; + hParamMC->icld_q[( k + 1 ) * ild_map_size - 1] = PARAM_MC_DEFAULT_MIN_ILD; + } + } + + *nb_bits = bit_pos; + + } /* if ( !st->bfi ) */ + + if ( st->bfi ) + { + /* for PLC, use the saved ILDs and ICCs from the past and set the transient flag and transient position to zero */ + hMetadataPMC->bAttackPresent = 0; + hMetadataPMC->attackIndex = 0; + } + + pop_wmops(); + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_param_mc_dec_digest_tc() + * + * + *------------------------------------------------------------------------*/ + +void ivas_param_mc_dec_digest_tc( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const uint8_t nCldfbSlots, /* i : number of CLFBS slots in the transport channels */ + float *transport_channels_f[] /* i : synthesized core-coder transport channels/DirAC output */ +) +{ + PARAM_MC_DEC_HANDLE hParamMC; + int16_t i, ch; + int16_t slot_idx, param_band_idx; + int16_t nchan_transport, nchan_out_transport, nchan_out_cldfb; + int16_t nchan_out_cov; + /*CLDFB*/ + float cx[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS]; + float cx_imag[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS]; + float real_part, imag_part; + /* format converter */ + int16_t channel_active[MAX_OUTPUT_CHANNELS]; + IVAS_OUTPUT_SETUP *hSynthesisOutputSetup; + + hParamMC = st_ivas->hParamMC; + assert( hParamMC ); + + push_wmops( "param_mc_dec_digest_tc" ); + + set_s( channel_active, 0, MAX_CICP_CHANNELS ); + nchan_transport = st_ivas->nchan_transport; + nchan_out_transport = st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe; + + if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) + { + nchan_out_cldfb = BINAURAL_CHANNELS; + set_s( channel_active, 1, nchan_out_cldfb ); + nchan_out_cov = st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe; + hSynthesisOutputSetup = &st_ivas->hTransSetup; + } + else if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_CLDFB ) + { + nchan_out_cov = nchan_out_transport; + nchan_out_cldfb = st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe; + hSynthesisOutputSetup = &st_ivas->hTransSetup; + } + else if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_COV || hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) + { + nchan_out_cov = st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe; + nchan_out_cldfb = nchan_out_cov; + set_s( channel_active, 1, nchan_out_cov ); + hSynthesisOutputSetup = &st_ivas->hOutSetup; + } + else + { + nchan_out_cov = nchan_out_transport; + nchan_out_cldfb = nchan_out_transport; + set_s( channel_active, 1, nchan_out_cov ); + hSynthesisOutputSetup = &st_ivas->hTransSetup; + } + + /* adapt transient position */ + if ( hParamMC->hMetadataPMC->bAttackPresent ) + { + hParamMC->hMetadataPMC->attackIndex = (int16_t) max( 0, hParamMC->hMetadataPMC->attackIndex + ( ( nCldfbSlots - DEFAULT_JBM_CLDFB_TIMESLOTS ) / 2 ) ); + } + /* adapt subframes */ + hParamMC->num_slots = nCldfbSlots; + hParamMC->slots_rendered = 0; + hParamMC->subframes_rendered = 0; + ivas_jbm_dec_get_adapted_subframes( nCldfbSlots, hParamMC->subframe_nbslots, &hParamMC->nb_subframes ); + st_ivas->hTcBuffer->nb_subframes = hParamMC->nb_subframes; + mvs2s( hParamMC->subframe_nbslots, st_ivas->hTcBuffer->subframe_nbslots, hParamMC->nb_subframes ); + + ivas_param_mc_dec_compute_interpolator( hParamMC->hMetadataPMC->bAttackPresent, hParamMC->hMetadataPMC->attackIndex, nCldfbSlots, hParamMC->h_output_synthesis_params.interpolator ); + + for ( param_band_idx = 0; param_band_idx < PARAM_MC_MAX_PARAMETER_BANDS; param_band_idx++ ) + { + set_zero( cx[param_band_idx], PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS ); + set_zero( cx_imag[param_band_idx], PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS ); + } + + /* slot loop for gathering the input data */ + for ( slot_idx = 0; slot_idx < nCldfbSlots; slot_idx++ ) + { + if ( st_ivas->hDecoderConfig->Opt_tsm || !st_ivas->hDecoderConfig->Opt_5ms ) + { + float RealBuffer[CLDFB_NO_CHANNELS_MAX]; + float ImagBuffer[CLDFB_NO_CHANNELS_MAX]; + + /* CLDFB Analysis*/ + for ( ch = 0; ch < nchan_transport; ch++ ) + { + cldfbAnalysis_ts( &( transport_channels_f[ch][hParamMC->num_freq_bands * slot_idx] ), RealBuffer, ImagBuffer, hParamMC->num_freq_bands, st_ivas->cldfbAnaDec[ch] ); + + mvr2r( RealBuffer, &hParamMC->Cldfb_RealBuffer_tc[slot_idx * hParamMC->num_freq_bands * nchan_transport + ch * hParamMC->num_freq_bands], hParamMC->num_freq_bands ); + mvr2r( ImagBuffer, &hParamMC->Cldfb_ImagBuffer_tc[slot_idx * hParamMC->num_freq_bands * nchan_transport + ch * hParamMC->num_freq_bands], hParamMC->num_freq_bands ); + } + } + if ( slot_idx >= 2 * hParamMC->hMetadataPMC->attackIndex ) + { + ivas_dirac_dec_output_synthesis_cov_param_mc_collect_slot( &hParamMC->Cldfb_RealBuffer_tc[slot_idx * hParamMC->num_freq_bands * nchan_transport], &hParamMC->Cldfb_ImagBuffer_tc[slot_idx * hParamMC->num_freq_bands * nchan_transport], cx, cx_imag, hParamMC, nchan_transport ); + } + } + + /* map from complex input covariance to real values */ + for ( param_band_idx = 0; param_band_idx < hParamMC->num_param_bands_synth; param_band_idx++ ) + { + /* Cx for transport channels */ + for ( i = 0; i < nchan_transport * nchan_transport; i++ ) + { + real_part = cx[param_band_idx][i]; + imag_part = cx_imag[param_band_idx][i]; + + /* (a-ib)(c+id) = ac + bd + i(ad-bc) */ + if ( param_band_idx < hParamMC->max_param_band_abs_cov ) + { + cx[param_band_idx][i] = sqrtf( real_part * real_part + imag_part * imag_part ); + } + else + { + cx[param_band_idx][i] = real_part; + } + } + } + + /* we have to do it similar to the encoder in case of attacks (i.e. accumulate two bands) to ensure correct DMX of the target covariance*/ + if ( hParamMC->hMetadataPMC->bAttackPresent && ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_COV || hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) ) + { + for ( param_band_idx = 0; param_band_idx < hParamMC->num_param_bands_synth; param_band_idx += 2 ) + { + v_add( cx[param_band_idx], cx[param_band_idx + 1], cx[param_band_idx], nchan_transport * nchan_transport ); + mvr2r( cx[param_band_idx], cx[param_band_idx + 1], nchan_transport * nchan_transport ); + } + } + + + if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) + { + ivas_param_mc_get_mono_stereo_mixing_matrices( hParamMC, cx, hParamMC->h_output_synthesis_cov_state.mixing_matrix, hParamMC->h_output_synthesis_cov_state.mixing_matrix_res, nchan_out_transport, nchan_transport, nchan_out_cov ); + } + else + { + /* generate mixing matrices */ + ivas_param_mc_get_mixing_matrices( hParamMC, hSynthesisOutputSetup, cx, hParamMC->h_output_synthesis_cov_state.mixing_matrix, hParamMC->h_output_synthesis_cov_state.mixing_matrix_res, nchan_out_transport, hParamMC->synthesis_conf, nchan_transport, nchan_out_cov ); + } + + pop_wmops(); + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_param_mc_dec() + * + * Parametric MC decoding process + *------------------------------------------------------------------------*/ + +void ivas_param_mc_dec_render( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */ + uint16_t *nSamplesRendered, /* o : number of CLDFB slots rendered */ + uint16_t *nSamplesAvailableNext, /* o : number of CLDFB slots still to render */ + float *output_f[] /* o : rendered time signal */ +) +{ + PARAM_MC_DEC_HANDLE hParamMC; + int16_t i, ch; + int16_t subframe_idx; + int16_t slot_idx, slot_idx_start, slot_idx_start_cldfb_synth, first_sf, last_sf, slots_to_render; + int16_t nchan_transport, nchan_out_transport, nchan_out_cldfb; + int16_t nchan_out_cov; + /*CLDFB*/ + float Cldfb_RealBuffer[MAX_INTERN_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + float Cldfb_ImagBuffer[MAX_INTERN_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + float Cldfb_RealBuffer_Binaural[BINAURAL_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + float Cldfb_ImagBuffer_Binaural[BINAURAL_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + /*Decorrelator*/ + float onset_filter[MAX_CICP_CHANNELS * CLDFB_NO_CHANNELS_MAX]; + /* format converter */ + int16_t channel_active[MAX_OUTPUT_CHANNELS]; + uint16_t nband_synth, nbands_to_zero; + uint16_t nchan_out_init; + uint32_t output_Fs; + + hParamMC = st_ivas->hParamMC; + assert( hParamMC ); + + push_wmops( "param_mc_dec_render" ); + + set_s( channel_active, 0, MAX_CICP_CHANNELS ); + nchan_transport = st_ivas->nchan_transport; + nchan_out_transport = st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe; + nchan_out_init = nchan_out_transport; + output_Fs = st_ivas->hDecoderConfig->output_Fs; + + if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) + { + nchan_out_cldfb = BINAURAL_CHANNELS; + set_s( channel_active, 1, nchan_out_cldfb ); + if ( st_ivas->hCombinedOrientationData ) + { + nchan_out_init = MAX_INTERN_CHANNELS; + } + nchan_out_cov = st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe; + } + else if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_CLDFB ) + { + nchan_out_cov = nchan_out_transport; + nchan_out_cldfb = st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe; + } + else if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_COV || hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) + { + nchan_out_cov = st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe; + nchan_out_cldfb = nchan_out_cov; + set_s( channel_active, 1, nchan_out_cov ); + } + else + { + nchan_out_cov = nchan_out_transport; + nchan_out_cldfb = nchan_out_transport; + set_s( channel_active, 1, nchan_out_cov ); + } + + /* set everything to zero that will not be decoded */ + nband_synth = hParamMC->band_grouping[hParamMC->num_param_bands_synth]; + nbands_to_zero = hParamMC->num_freq_bands - nband_synth; + for ( ch = 0; ch < nchan_out_init; ch++ ) + { + for ( slot_idx = 0; slot_idx < JBM_CLDFB_SLOTS_IN_SUBFRAME; slot_idx++ ) + { + set_zero( &( Cldfb_RealBuffer[ch][slot_idx][nband_synth] ), nbands_to_zero ); + set_zero( &( Cldfb_ImagBuffer[ch][slot_idx][nband_synth] ), nbands_to_zero ); + } + } + + /* loop for synthesis, assume we always have to render in multiples of 5ms subframes with spills */ + slots_to_render = min( hParamMC->num_slots - hParamMC->slots_rendered, nSamplesAsked / NS2SA( output_Fs, CLDFB_SLOT_NS ) ); + *nSamplesRendered = slots_to_render * NS2SA( output_Fs, CLDFB_SLOT_NS ); + first_sf = hParamMC->subframes_rendered; + last_sf = first_sf; + while ( slots_to_render > 0 ) + { + slots_to_render -= hParamMC->subframe_nbslots[last_sf]; + last_sf++; + } + if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) + { + for ( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ ) + { + slots_to_render += hParamMC->subframe_nbslots[subframe_idx]; + } + } + slot_idx_start = hParamMC->slots_rendered; + slot_idx_start_cldfb_synth = 0; + for ( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ ) + { + for ( slot_idx = 0; slot_idx < hParamMC->subframe_nbslots[subframe_idx]; slot_idx++, hParamMC->slots_rendered++ ) + { + + if ( hParamMC->max_band_decorr > 0 ) + { + /*-----------------------------------------------------------------* + * protoype signal computation + *-----------------------------------------------------------------*/ + + param_mc_protoSignalComputation( &hParamMC->Cldfb_RealBuffer_tc[hParamMC->slots_rendered * nchan_transport * hParamMC->num_freq_bands], + &hParamMC->Cldfb_ImagBuffer_tc[hParamMC->slots_rendered * nchan_transport * hParamMC->num_freq_bands], + hParamMC->proto_frame_f, hParamMC->diff_proto_info, + hParamMC->num_freq_bands ); + + /*-----------------------------------------------------------------* + * frequency domain decorrelation + *-----------------------------------------------------------------*/ + + /* decorrelate prototype frame */ + ivas_dirac_dec_decorr_process( hParamMC->num_freq_bands, + hParamMC->num_outputs_diff, + hParamMC->diff_proto_info->num_protos_diff, + DIRAC_SYNTHESIS_COV_MC_LS, + nchan_transport, + hParamMC->proto_frame_f, + hParamMC->diff_proto_info->num_protos_diff, + hParamMC->diff_proto_info->proto_index_diff, + hParamMC->proto_frame_dec_f, + onset_filter, + hParamMC->h_freq_domain_decorr_ap_params, + hParamMC->h_freq_domain_decorr_ap_state ); + + /* copy decorrelated frame directly to output CLDFB buffer, acts also as intermediate */ + /* memory for the decorrelated signal */ + ivas_param_mc_dec_copy_diffuse_proto( hParamMC, Cldfb_RealBuffer, Cldfb_ImagBuffer, nchan_out_cov, slot_idx ); + } + + /*-----------------------------------------------------------------* + * output synthesis + *-----------------------------------------------------------------*/ + + ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot( &hParamMC->Cldfb_RealBuffer_tc[hParamMC->slots_rendered * nchan_transport * hParamMC->num_freq_bands], + &hParamMC->Cldfb_ImagBuffer_tc[hParamMC->slots_rendered * nchan_transport * hParamMC->num_freq_bands], + Cldfb_RealBuffer, Cldfb_ImagBuffer, + hParamMC->h_output_synthesis_cov_state.mixing_matrix, hParamMC->h_output_synthesis_cov_state.mixing_matrix_res, slot_idx, slot_idx + slot_idx_start, + nchan_transport, nchan_out_cov, hParamMC ); + + if ( ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) ) + { + if ( + st_ivas->hCombinedOrientationData && st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV ) + { + ivas_param_mc_mc2sba_cldfb( st_ivas->hTransSetup, hParamMC->hoa_encoder, slot_idx, Cldfb_RealBuffer, Cldfb_ImagBuffer, nband_synth, GAIN_LFE ); + } + else + { + /* remove LFE */ + uint16_t idx_out; + uint16_t idx_lfe; + IVAS_OUTPUT_SETUP hLsSetup; + + hLsSetup = st_ivas->hTransSetup; + + /* If LFE should be rendered, add it to other channels before removing */ + if ( st_ivas->hBinRenderer->render_lfe ) + { + for ( idx_lfe = 0; idx_lfe < hLsSetup.num_lfe; idx_lfe++ ) + { + /* Copy just the first band of LFE*/ + v_multc( Cldfb_RealBuffer[hLsSetup.index_lfe[idx_lfe]][slot_idx], ( GAIN_LFE / hLsSetup.nchan_out_woLFE ), Cldfb_RealBuffer[hLsSetup.index_lfe[idx_lfe]][slot_idx], 1 ); + v_multc( Cldfb_ImagBuffer[hLsSetup.index_lfe[idx_lfe]][slot_idx], ( GAIN_LFE / hLsSetup.nchan_out_woLFE ), Cldfb_ImagBuffer[hLsSetup.index_lfe[idx_lfe]][slot_idx], 1 ); + + for ( ch = 0; ch < ( hLsSetup.nchan_out_woLFE + hLsSetup.num_lfe ); ch++ ) + { + if ( hLsSetup.index_lfe[idx_lfe] != ch ) + { + v_add( Cldfb_RealBuffer[ch][slot_idx], Cldfb_RealBuffer[hLsSetup.index_lfe[idx_lfe]][slot_idx], Cldfb_RealBuffer[ch][slot_idx], 1 ); + v_add( Cldfb_ImagBuffer[ch][slot_idx], Cldfb_ImagBuffer[hLsSetup.index_lfe[idx_lfe]][slot_idx], Cldfb_ImagBuffer[ch][slot_idx], 1 ); + } + } + } + } + + idx_out = 0; + idx_lfe = 0; + + for ( ch = 0; ch < ( hLsSetup.nchan_out_woLFE + hLsSetup.num_lfe ); ch++ ) + { + if ( ( hLsSetup.num_lfe > 0 ) && ( hLsSetup.index_lfe[idx_lfe] == ch ) ) + { + if ( idx_lfe < ( hLsSetup.num_lfe - 1 ) ) + { + idx_lfe++; + } + } + else if ( ch != idx_out ) + { + mvr2r( Cldfb_RealBuffer[ch][slot_idx], Cldfb_RealBuffer[idx_out][slot_idx], nband_synth ); + mvr2r( Cldfb_ImagBuffer[ch][slot_idx], Cldfb_ImagBuffer[idx_out][slot_idx], nband_synth ); + idx_out++; + } + else + { + idx_out++; + } + } + } + } + } + + if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) + { + + ivas_binRenderer( st_ivas->hBinRenderer, + st_ivas->hCombinedOrientationData, subframe_idx, hParamMC->subframe_nbslots[subframe_idx], Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, Cldfb_ImagBuffer ); + + } + else if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_CLDFB ) + { + /* format conversion*/ + ivas_lssetupconversion_process_param_mc( st_ivas, hParamMC->subframe_nbslots[subframe_idx], Cldfb_RealBuffer, Cldfb_ImagBuffer, channel_active ); + } + + /* CLDFB synthesis */ + for ( ch = 0; ch < nchan_out_cldfb; ch++ ) + { + float *RealBuffer[16]; + float *ImagBuffer[16]; + + if ( channel_active[ch] ) + { + /* open CLDFB buffer up to CLDFB_NO_CHANNELS_MAX bands for 48kHz */ + for ( i = 0; i < hParamMC->subframe_nbslots[subframe_idx]; i++ ) + { + if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) + { + RealBuffer[i] = Cldfb_RealBuffer_Binaural[ch][i]; + ImagBuffer[i] = Cldfb_ImagBuffer_Binaural[ch][i]; + } + else + { + RealBuffer[i] = Cldfb_RealBuffer[ch][i]; + ImagBuffer[i] = Cldfb_ImagBuffer[ch][i]; + } + } + + cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][slot_idx_start_cldfb_synth * hParamMC->num_freq_bands] ), + hParamMC->num_freq_bands * hParamMC->subframe_nbslots[subframe_idx], st_ivas->cldfbSynDec[ch] ); + } + else + { + set_f( &( output_f[ch][slot_idx_start_cldfb_synth * hParamMC->num_freq_bands] ), 0.0f, hParamMC->num_freq_bands * hParamMC->subframe_nbslots[subframe_idx] ); + } + } + slot_idx_start += hParamMC->subframe_nbslots[subframe_idx]; + slot_idx_start_cldfb_synth += hParamMC->subframe_nbslots[subframe_idx]; + } + + if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) + { + ivas_mc2sba( st_ivas->hIntSetup, output_f, output_f, hParamMC->num_freq_bands * slots_to_render, st_ivas->hOutSetup.ambisonics_order, 0.f ); + } + + /* update */ + if ( hParamMC->slots_rendered == hParamMC->num_slots ) + { + hParamMC->hMetadataPMC->last_coded_bwidth = hParamMC->hMetadataPMC->coded_bwidth; + param_mc_update_mixing_matrices( hParamMC, hParamMC->h_output_synthesis_cov_state.mixing_matrix, hParamMC->h_output_synthesis_cov_state.mixing_matrix_res, nchan_transport, nchan_out_cov ); + } + hParamMC->subframes_rendered = last_sf; + *nSamplesAvailableNext = ( hParamMC->num_slots - hParamMC->slots_rendered ) * NS2SA( output_Fs, CLDFB_SLOT_NS ); + pop_wmops(); + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_param_mc_dec() + * + * Parametric MC decoding process + *------------------------------------------------------------------------*/ + +void ivas_param_mc_dec( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + float *output_f[] /* i/o: synthesized core-coder transport channels/DirAC output */ +) +{ + PARAM_MC_DEC_HANDLE hParamMC; + float Cldfb_RealBuffer_in[PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_NSLOTS * CLDFB_NO_CHANNELS_MAX]; + float Cldfb_ImagBuffer_in[PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_NSLOTS * CLDFB_NO_CHANNELS_MAX]; + uint16_t nSamplesAsked, nSamplesAvailableNext, nSamplesRendered; + + hParamMC = st_ivas->hParamMC; + assert( hParamMC ); + push_wmops( "param_mc_dec" ); + + /* set some handle pointers to the stack buffers */ + hParamMC->Cldfb_RealBuffer_tc = Cldfb_RealBuffer_in; + hParamMC->Cldfb_ImagBuffer_tc = Cldfb_ImagBuffer_in; + + nSamplesAsked = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); + ivas_param_mc_dec_digest_tc( st_ivas, DEFAULT_JBM_CLDFB_TIMESLOTS, output_f ); + ivas_param_mc_dec_render( st_ivas, nSamplesAsked, &nSamplesRendered, &nSamplesAvailableNext, output_f ); + + /* set handle pointers back to NULL */ + hParamMC->Cldfb_RealBuffer_tc = NULL; + hParamMC->Cldfb_ImagBuffer_tc = NULL; + + pop_wmops(); + return; +} + + +/*------------------------------------------------------------------------- + * param_mc_dec_init() + * + * Parametric MC decoding initialization + *------------------------------------------------------------------------*/ + +static void ivas_param_mc_dec_init( + PARAM_MC_DEC_HANDLE hParamMC, /* i/o: decoder DirAC handle */ + const int16_t nchan_transport, /* i : number of input (transport) channels */ + const int16_t nchan_cov ) /* i : number of cov synthesis channels */ +{ + int16_t k; + uint16_t max_param_band_residual; + int16_t len; + + /*-----------------------------------------------------------------* + * init sub-modules + *-----------------------------------------------------------------*/ + + /* decorrelation */ + if ( hParamMC->max_band_decorr > 0 ) + { + len = hParamMC->diff_proto_info->num_protos_diff * hParamMC->h_freq_domain_decorr_ap_params->h_onset_detection_power_params.max_band_decorr; + + /* init onsetDetectionPower */ + set_zero( hParamMC->h_freq_domain_decorr_ap_state->h_onset_detection_power_state.onset_detector_1, len ); + set_zero( hParamMC->h_freq_domain_decorr_ap_state->h_onset_detection_power_state.onset_detector_2, len ); + } + + max_param_band_residual = 0; + + /* output synthesis */ + for ( k = hParamMC->hMetadataPMC->num_parameter_bands; k >= 0; k-- ) + { + if ( hParamMC->band_grouping[k] <= hParamMC->max_band_decorr ) + { + max_param_band_residual = k; + break; + } + } + + ivas_dirac_dec_output_synthesis_cov_init( &( hParamMC->h_output_synthesis_cov_state ), nchan_transport, nchan_cov, hParamMC->hMetadataPMC->num_parameter_bands, max_param_band_residual ); + + /*-----------------------------------------------------------------* + * init proto frames + *-----------------------------------------------------------------*/ + + if ( hParamMC->max_band_decorr > 0 ) + { + set_zero( hParamMC->proto_frame_f, 2 * hParamMC->diff_proto_info->num_protos_diff * hParamMC->num_freq_bands ); + set_zero( hParamMC->proto_frame_dec_f, 2 * nchan_cov * hParamMC->num_freq_bands ); + } + + return; +} + + +/*------------------------------------------------------------------------- + * Local functions + *-------------------------------------------------------------------------*/ + + +/*------------------------------------------------------------------------- + * ivas_param_mc_dec_compute_diffuse_proto() + * + * Compute prototypes for decorrelation + *------------------------------------------------------------------------*/ + +static void param_mc_protoSignalComputation( + float *RealBuffer, /* i : CLDFB samples of the transport channels (real part) */ + float *ImagBuffer, /* i : CLDFB samples of the transport channels (imaginary part) */ + float *proto_frame_f, /* o : interleaved complex prototype CLDFB samples */ + const PARAM_MC_DIFF_PROTO_INFO *diff_proto_info, /* i : prototype generation information */ + const int16_t num_freq_bands /* i : number of frequency bands for the prototypes */ +) +{ + int16_t band; + int16_t proto_ch_idx, source_ch_cnt; + float *p_proto_frame; + float *p_real_buffer; + float *p_imag_buffer; + + set_zero( proto_frame_f, 2 * num_freq_bands * diff_proto_info->num_protos_diff ); + + for ( proto_ch_idx = 0; proto_ch_idx < diff_proto_info->num_protos_diff; proto_ch_idx++ ) + { + int16_t num_source_ch = diff_proto_info->num_source_chan_diff[proto_ch_idx]; + + for ( source_ch_cnt = 0; source_ch_cnt < num_source_ch; source_ch_cnt++ ) + { + float fac = diff_proto_info->proto_fac[proto_ch_idx][source_ch_cnt]; + int16_t source_ch_idx = diff_proto_info->source_chan_idx[proto_ch_idx][source_ch_cnt]; + + p_proto_frame = &proto_frame_f[proto_ch_idx * num_freq_bands * 2]; + p_real_buffer = &RealBuffer[source_ch_idx * num_freq_bands]; + p_imag_buffer = &ImagBuffer[source_ch_idx * num_freq_bands]; + + for ( band = 0; band < num_freq_bands; band++ ) + { + *( p_proto_frame++ ) += fac * ( *( p_real_buffer++ ) ); + *( p_proto_frame++ ) += fac * ( *( p_imag_buffer++ ) ); + } + } + } + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_param_mc_dec_compute_diffuse_proto() + * + * Transfer decorrelated signals back from the decorrelator buffer to + * the buffers used in the final synthesis + *------------------------------------------------------------------------*/ + +static void ivas_param_mc_dec_copy_diffuse_proto( + PARAM_MC_DEC_HANDLE hParamMC, /* i : Parametric MC handle */ + float Cldfb_buffer_real[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* o : CLDFB buffer used in the final synthesis (real part) */ + float Cldfb_buffer_imag[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* o : CLDFB buffer used in the final synthesis (imaginary part) */ + const int16_t nY, /* i : number of decorrelated channels */ + const int16_t slot_idx /* i : current time slot index */ +) +{ + int16_t k, l; + int16_t num_freq_bands, num_freq_bands_diff; + float *p_proto_diff; + + num_freq_bands = hParamMC->num_freq_bands; + num_freq_bands_diff = hParamMC->h_output_synthesis_params.max_band_decorr; + + for ( k = 0; k < nY; k++ ) + { + p_proto_diff = hParamMC->proto_frame_dec_f + k * 2 * num_freq_bands; + for ( l = 0; l < num_freq_bands_diff; l++ ) + { + Cldfb_buffer_real[k][slot_idx][l] = *( p_proto_diff++ ); + Cldfb_buffer_imag[k][slot_idx][l] = *( p_proto_diff++ ); + } + } + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_param_mc_bin2dec() + * + * decode a number of bits to an integer + *------------------------------------------------------------------------*/ +/* r : decoded integer */ +static int16_t ivas_param_mc_bin2dec( + uint16_t bits[PARAM_MC_MAX_BITS], /* i : bit buffer */ + const int16_t N /* i : number of bits to decode */ +) +{ + int16_t i; + int16_t out; + + assert( N <= 16 ); + out = 0; + for ( i = 0; i < N; i++ ) + { + out += ( bits[i] << ( N - 1 - i ) ); + } + + return out; +} + + +/*------------------------------------------------------------------------- + * ivas_param_mc_uniform_decoder() + * + * decode a uniformily coded sequence of float values + *------------------------------------------------------------------------*/ + +static int16_t ivas_param_mc_uniform_decoder( + float *seq, /* o : decoded sequence of float values */ + const int16_t sz_seq, /* i : number of values to decode */ + const float *alphabet, /* i : codebook */ + const int16_t N, /* i : number of bits per coded index */ + uint16_t bit_buffer[PARAM_MC_MAX_BITS] /* i : bit buffer to decode */ +) +{ + int16_t i; + int16_t idx; + int16_t n_bits; + + n_bits = 0; + assert( N * sz_seq < PARAM_MC_MAX_BITS ); + + for ( i = 0; i < sz_seq; ++i ) + { + idx = ivas_param_mc_bin2dec( &bit_buffer[i * N], N ); + seq[i] = alphabet[idx]; + } + + n_bits = N * sz_seq; + + return n_bits; +} + + +/*------------------------------------------------------------------------- + * ivas_param_mc_range_decoder_LC() + * + * decode a sequency of inidices coded with a range coder + *------------------------------------------------------------------------*/ + +static int16_t ivas_param_mc_range_decoder_LC( + uint16_t *bit_buffer, /* i : bit buffer to read from */ + int16_t *x, /* o : decoded indices */ + int16_t *BER_detect, /* o : flag for indicating a bit error */ + const int16_t sz_seq, /* i : size of the sequence to be decoded */ + const int16_t sz_alphabet, /* i : size of the alphabet */ + const uint16_t *cft, /* i : cumulative frequency table */ + const uint16_t *sft, /* i : symbol frequency table */ + const int16_t tot_shift, /* i : total frequency as a power of 2 */ + const int16_t nbbits /* i : maximum bit budget */ +) +{ + RangeUniDecState rc_st_dec; /* State of the range decoder */ + int16_t cur_bit_pos; + int16_t k; + int16_t r; + + /* Start Decoding */ + /* Initialize range decoder */ + cur_bit_pos = 0; + rc_uni_dec_init( &rc_st_dec, bit_buffer, nbbits - 32 ); /* (nbbits + 30) entries are read by the decoder */ + + /* Main Loop through the indices */ + for ( k = 0; k < sz_seq; k++ ) + { + r = rc_uni_dec_read_symbol_fastS( &rc_st_dec, cft, sft, sz_alphabet, tot_shift ); /*Alphabet size = 17 (2^4 = 16 MSB symbols + 1 ESC symbol) */ + /* r is the symbol read, the possible values are {0,1,....alphabet_size - 1} */ + + /* Update bitstream pointer */ + cur_bit_pos = rc_uni_dec_virtual_finish( &rc_st_dec ); + + /* Confirm that there is no overflow */ + if ( cur_bit_pos > nbbits ) + { + *BER_detect |= 1; + } + + x[k] = r; + } + + /* We don't need to finish because virtual_finish() already does the same */ + /*st->next_bit_pos = rc_uni_dec_finish(&rc_st_dec);*/ + + /* Check for bitstream errors */ + if ( rc_st_dec.bit_error_detected != 0 ) + { + *BER_detect |= 1; + } + + return cur_bit_pos; +} + + +/*------------------------------------------------------------------------- + * param_mc_compute_interpolator() + * + * compute the interpolator used in the final synthesis + *------------------------------------------------------------------------*/ + +static void ivas_param_mc_dec_compute_interpolator( + const uint16_t bAttackPresent, /* i : flag indicating if we have a transient in the current frame */ + const uint16_t attackPos, /* i : position of the transient */ + const uint16_t interp_length, /* i : number of interpolation values to be calculated */ + float *interpolator /* o : interpolator */ +) +{ + int16_t idx; + + if ( bAttackPresent ) + { + for ( idx = 0; idx < 2 * attackPos; idx++ ) + { + interpolator[idx] = 0.0f; + } + for ( ; idx < interp_length; idx++ ) + { + interpolator[idx] = 1.0f; + } + } + else + { + ivas_jbm_dec_get_adapted_linear_interpolator( DEFAULT_JBM_CLDFB_TIMESLOTS, interp_length, interpolator ); + } + + return; +} + + +/*------------------------------------------------------------------------- + * remove_lfe_from_cy() + * + * remove all LFE related values from a covariance matrix + *------------------------------------------------------------------------*/ + +static void remove_lfe_from_cy( + const int16_t nY, /* i : dimension of the covariance matrix */ + int16_t lfe_indices[PARAM_MC_LOCAL_SZ_LFE_MAP], /* i : LFE index */ + int16_t num_lfe, /* i : number of LFEs */ + float *cy, /* i : covariance matrix */ + float *cy_woLFE ) /* o : covariance matrix with LFE removed */ +{ + int16_t ch_idx1, ch_idx2; + int16_t lfe_idx1, lfe_idx2; + float *ptrCy; + float *ptrCy_out; + + ptrCy = cy; + ptrCy_out = cy_woLFE; + + for ( lfe_idx1 = 0; lfe_idx1 < num_lfe + 1; lfe_idx1++ ) + { + for ( ch_idx1 = lfe_indices[lfe_idx1] + 1; ch_idx1 < lfe_indices[lfe_idx1 + 1]; ch_idx1++ ) + { + for ( lfe_idx2 = 0; lfe_idx2 < num_lfe + 1; lfe_idx2++ ) + { + for ( ch_idx2 = lfe_indices[lfe_idx2] + 1; ch_idx2 < lfe_indices[lfe_idx2 + 1]; ch_idx2++ ) + { + *( ptrCy_out++ ) = *( ptrCy++ ); + } + ptrCy++; + } + ptrCy--; + } + ptrCy += nY; + } + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_param_mc_get_mixing_matrices() + * + * calculate the direct and residual mixing matrices + * using the covariance method + *------------------------------------------------------------------------*/ + +static void ivas_param_mc_get_mixing_matrices( + PARAM_MC_DEC_HANDLE hParamMC, /* i : Parametric MC handle */ + IVAS_OUTPUT_SETUP *hSynthesisOutputSetup, + float Cx_in[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS], /* i : input covariance for all parameter bands */ + float *mixing_matrix[], /* o : direct mixing matrices for all parameter bands */ + float *mixing_matrix_res[], /* o : residual mixing matrices for all parameter bands */ + const int16_t nY_intern, /* i : number of channels in the transported format */ + const PARAM_MC_SYNTHESIS_CONF synth_config, /* i : Parametric MC synthesis config */ + const int16_t nX, /* i : number of transport channels */ + const int16_t nY_cov /* i : number of covariance synthesis output channels */ +) +{ + int16_t param_band_idx; + float Cx[PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS]; + float Cy[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; + float Cy_diag[MAX_CICP_CHANNELS]; + float Cr[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; + float Cproto_diag[MAX_CICP_CHANNELS]; + float Cproto[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; + float mat_mult_buffer1[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; + float *Cx_state; + float *Cx_old_state; + float Cy_state[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; + float *Cy_old_state; + int16_t nY_band; + float proto_matrix_noLFE[PARAM_MC_MAX_TRANSPORT_CHANS * MAX_CICP_CHANNELS]; + float *proto_matrix_ptr; + int16_t num_lfe_bands; + int16_t brange[2]; + uint16_t i; + int16_t ch_idx1, ch_idx2, lfe_idx1, lfe_idx2; + float *ptrMM; + float *ptrMM_out; + float Cy_full[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; + float mixing_matrix_local[MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS]; + float mixing_matrix_res_local[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; + int16_t remove_lfe; + int16_t lfe_indices[PARAM_MC_LOCAL_SZ_LFE_MAP]; + + set_zero( Cproto, MAX_CICP_CHANNELS * MAX_CICP_CHANNELS ); + set_zero( mat_mult_buffer1, MAX_CICP_CHANNELS * MAX_CICP_CHANNELS ); + set_zero( proto_matrix_noLFE, PARAM_MC_MAX_TRANSPORT_CHANS * MAX_CICP_CHANNELS ); + + nY_band = nY_cov; + num_lfe_bands = 0; + remove_lfe = 0; + + set_s( lfe_indices, -1, PARAM_MC_LOCAL_SZ_LFE_MAP ); + if ( hSynthesisOutputSetup->num_lfe ) + { + float *proto_matrix_ptr_in; + for ( lfe_idx1 = 0; lfe_idx1 < hSynthesisOutputSetup->num_lfe; lfe_idx1++ ) + { + lfe_indices[lfe_idx1 + 1] = hSynthesisOutputSetup->index_lfe[lfe_idx1]; + } + lfe_indices[hSynthesisOutputSetup->num_lfe + 1] = nY_cov; + proto_matrix_ptr = &proto_matrix_noLFE[0]; + proto_matrix_ptr_in = &hParamMC->h_output_synthesis_params.proto_matrix[0]; + set_zero( proto_matrix_noLFE, PARAM_MC_MAX_TRANSPORT_CHANS * MAX_CICP_CHANNELS ); + + for ( ch_idx1 = 0; ch_idx1 < nX; ch_idx1++ ) + { + for ( lfe_idx1 = 0; lfe_idx1 < hSynthesisOutputSetup->num_lfe + 1; lfe_idx1++ ) + { + for ( ch_idx2 = lfe_indices[lfe_idx1] + 1; ch_idx2 < lfe_indices[lfe_idx1 + 1]; ch_idx2++ ) + { + *( proto_matrix_ptr++ ) = *( proto_matrix_ptr_in++ ); + } + proto_matrix_ptr_in++; + } + proto_matrix_ptr_in--; + } + } + + if ( hParamMC->hMetadataPMC->lfe_on ) + { + num_lfe_bands = PARAM_MC_MAX_BAND_LFE; + } + + for ( param_band_idx = 0; param_band_idx < hParamMC->num_param_bands_synth; param_band_idx++ ) + { + if ( hSynthesisOutputSetup->num_lfe > 0 && param_band_idx >= num_lfe_bands ) + { + remove_lfe = 1; + nY_band = nY_cov - hSynthesisOutputSetup->num_lfe; + proto_matrix_ptr = proto_matrix_noLFE; + } + else + { + proto_matrix_ptr = hParamMC->h_output_synthesis_params.proto_matrix; + } + + brange[0] = hParamMC->band_grouping[param_band_idx]; + brange[1] = hParamMC->band_grouping[param_band_idx + 1]; + + Cx_state = Cx_in[param_band_idx]; + Cx_old_state = hParamMC->h_output_synthesis_cov_state.cx_old[param_band_idx]; + Cy_old_state = hParamMC->h_output_synthesis_cov_state.cy_old[param_band_idx]; + + /* Getting mixing mtx */ + /* estimate target cov from input cov and proto_matrix */ + matrix_product( hParamMC->proto_matrix_int, nY_intern, nX, 0, Cx_state, nX, nX, 0, mat_mult_buffer1 ); + + matrix_product( mat_mult_buffer1, nY_intern, nX, 0, hParamMC->proto_matrix_int, nY_intern, nX, 1, Cproto ); + + for ( ch_idx1 = 0; ch_idx1 < nY_intern; ch_idx1++ ) + { + if ( Cproto[ch_idx1 + ch_idx1 * nY_intern] < 0.0f ) + { + Cproto[ch_idx1 + ch_idx1 * nY_intern] = 0.0f; + } + } + + ivas_param_mc_dequantize_cov( hParamMC, + hParamMC->icld_q + param_band_idx * hParamMC->hMetadataPMC->ild_mapping_conf->ild_map_size_lfe, + hParamMC->icc_q + param_band_idx * hParamMC->hMetadataPMC->icc_mapping_conf->icc_map_size_lfe, + param_band_idx, nY_cov, + synth_config, + nY_intern, + nX, Cx_state, Cproto, Cy_state ); + + /* Smoothing: Sum over two buffers */ + if ( hParamMC->hMetadataPMC->bAttackPresent ) + { + /* no smoothing on attacks */ + mvr2r( Cx_state, Cx, nX * nX ); + mvr2r( Cy_state, Cy_full, nY_cov * nY_cov ); + } + else + { + /* smoothing gains are now identical to one, simply add up */ + v_add( Cx_state, Cx_old_state, Cx, nX * nX ); + v_add( Cy_state, Cy_old_state, Cy_full, nY_cov * nY_cov ); + } + + /* cov buffer update */ + mvr2r( Cx_state, Cx_old_state, nX * nX ); + mvr2r( Cy_state, Cy_old_state, nY_cov * nY_cov ); + + /* remove LFE if necessary */ + if ( remove_lfe ) + { + remove_lfe_from_cy( nY_cov, lfe_indices, hSynthesisOutputSetup->num_lfe, Cy_full, Cy ); + } + else + { + mvr2r( Cy_full, Cy, nY_band * nY_band ); + } + + matrix_product( proto_matrix_ptr, nY_band, nX, 0, Cx, nX, nX, 0, mat_mult_buffer1 ); + + matrix_product_diag( mat_mult_buffer1, nY_band, nX, 0, proto_matrix_ptr, nY_band, nX, 1, Cproto_diag ); + + /* make sure we have no negative entries in Cproto_diag due to rounding errors */ + for ( ch_idx1 = 0; ch_idx1 < nY_band; ch_idx1++ ) + { + if ( Cproto_diag[ch_idx1] < 0.0f ) + { + Cproto_diag[ch_idx1] = 0.0f; + } + } + + /* Computing the mixing matrices */ + + /* bands with decorr */ + if ( brange[0] < hParamMC->h_output_synthesis_params.max_band_decorr ) + { + computeMixingMatrices( nX, nY_band, Cx, Cy, proto_matrix_ptr, 0, PARAM_MC_REG_SX, PARAM_MC_REG_GHAT, mixing_matrix_local, Cr ); + + /* Compute mixing matrix for residual */ + computeMixingMatricesResidual( nY_band, Cproto_diag, Cr, PARAM_MC_REG_SX, PARAM_MC_REG_GHAT, mixing_matrix_res_local ); + + if ( remove_lfe ) + { + set_zero( mixing_matrix_res[param_band_idx], nY_cov * nY_cov ); + + ptrMM = mixing_matrix_res_local; + ptrMM_out = mixing_matrix_res[param_band_idx]; + for ( lfe_idx1 = 0; lfe_idx1 < hSynthesisOutputSetup->num_lfe + 1; lfe_idx1++ ) + { + for ( ch_idx1 = lfe_indices[lfe_idx1] + 1; ch_idx1 < lfe_indices[lfe_idx1 + 1]; ch_idx1++ ) + { + for ( lfe_idx2 = 0; lfe_idx2 < hSynthesisOutputSetup->num_lfe + 1; lfe_idx2++ ) + { + for ( ch_idx2 = lfe_indices[lfe_idx2] + 1; ch_idx2 < lfe_indices[lfe_idx2 + 1]; ch_idx2++ ) + { + *( ptrMM_out++ ) = *( ptrMM++ ); + } + ptrMM_out++; + } + ptrMM_out--; + } + ptrMM_out += nY_cov; + } + } + else + { + mvr2r( mixing_matrix_res_local, mixing_matrix_res[param_band_idx], nY_cov * nY_cov ); + } + } + else if ( brange[0] < hParamMC->max_band_energy_compensation ) + { + /* Compute mixing matrices (energy compensation only) */ + computeMixingMatrices( nX, nY_band, Cx, Cy, proto_matrix_ptr, 1, PARAM_MC_REG_SX, PARAM_MC_REG_GHAT, mixing_matrix_local, Cr ); + } + else + { + /*if neither decorrelation nor energy compensation is applied*/ + for ( i = 0; i < nY_band; i++ ) + { + Cy_diag[i] = Cy[i + nY_band * i]; + Cy_diag[i] = sqrtf( Cy_diag[i] / ( Cproto_diag[i] + EPSILON ) ); + } + + diag_matrix_product( Cy_diag, nY_band, proto_matrix_ptr, nY_band, nX, 0, mixing_matrix_local ); + } + if ( remove_lfe ) + { + set_zero( mixing_matrix[param_band_idx], nX * nY_cov ); + + ptrMM = mixing_matrix_local; + ptrMM_out = mixing_matrix[param_band_idx]; + for ( ch_idx1 = 0; ch_idx1 < nX; ch_idx1++ ) + { + for ( lfe_idx1 = 0; lfe_idx1 < hSynthesisOutputSetup->num_lfe + 1; lfe_idx1++ ) + { + for ( ch_idx2 = lfe_indices[lfe_idx1] + 1; ch_idx2 < lfe_indices[lfe_idx1 + 1]; ch_idx2++ ) + { + *( ptrMM_out++ ) = *( ptrMM++ ); + } + ptrMM_out++; + } + ptrMM_out--; + } + } + else + { + mvr2r( mixing_matrix_local, mixing_matrix[param_band_idx], nY_cov * nX ); + } + } + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_param_mc_get_mono_stereo_mixing_matrices() + * + * calculate the direct and residual mixing matrices + * for mono and stereo output + *------------------------------------------------------------------------*/ + +static void ivas_param_mc_get_mono_stereo_mixing_matrices( + PARAM_MC_DEC_HANDLE hParamMC, /* i : Parametric MC handle */ + float Cx_in[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS], /* i : transport channel covariance for all parameter bands */ + float *mixing_matrix[], /* o : direct mixing matrices for all parameter bands */ + float *mixing_matrix_res[], /* o : residual mixing matrices for all parameter bands */ + const int16_t nY_intern, /* i : number of channels of the transport format */ + const int16_t nX, /* i : number of transport channels */ + const int16_t nY_cov ) /* i : number of output channels */ +{ + int16_t param_band_idx; + float Cx[PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS]; + float Cy_diag[MAX_CICP_CHANNELS]; + float Cproto_diag[MAX_CICP_CHANNELS]; + float Cproto[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; + float mat_mult_buffer1[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; + float *Cx_state; + float *Cx_old_state; + float Cy_state[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; + float *Cy_old_state; + int16_t nY_band; + float proto_matrix[PARAM_MC_MAX_TRANSPORT_CHANS * MAX_CICP_CHANNELS]; + uint16_t i; + + set_zero( Cproto, MAX_CICP_CHANNELS * MAX_CICP_CHANNELS ); + set_zero( mat_mult_buffer1, MAX_CICP_CHANNELS * MAX_CICP_CHANNELS ); + set_zero( proto_matrix, PARAM_MC_MAX_TRANSPORT_CHANS * MAX_CICP_CHANNELS ); + + mvr2r( hParamMC->h_output_synthesis_params.proto_matrix, proto_matrix, nY_cov * nX ); + nY_band = nY_cov; + + for ( param_band_idx = 0; param_band_idx < hParamMC->num_param_bands_synth; param_band_idx++ ) + { + float Cy_full[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; + float mixing_matrix_woLFE[MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS]; + float Nrqq[MAX_OUTPUT_CHANNELS]; + float target_ch_ener[MAX_OUTPUT_CHANNELS]; + int16_t k, l; + float *ild_q; + + Cx_state = Cx_in[param_band_idx]; + Cx_old_state = hParamMC->h_output_synthesis_cov_state.cx_old[param_band_idx]; + Cy_old_state = hParamMC->h_output_synthesis_cov_state.cy_old[param_band_idx]; + set_zero( Nrqq, MAX_OUTPUT_CHANNELS ); + set_zero( target_ch_ener, MAX_OUTPUT_CHANNELS ); + set_zero( Cy_full, MAX_CICP_CHANNELS * MAX_CICP_CHANNELS ); + set_zero( Cy_state, MAX_CICP_CHANNELS * MAX_CICP_CHANNELS ); + set_zero( Cproto_diag, MAX_CICP_CHANNELS ); + ild_q = hParamMC->icld_q + param_band_idx * hParamMC->hMetadataPMC->ild_mapping_conf->ild_map_size_lfe; + + /*get back Nrg*/ + for ( k = 0; k < nY_intern; k++ ) + { + float ref_ener = 0.0f; + int16_t ref_channel_cnt; + int16_t ref_channel_idx; + + for ( ref_channel_cnt = 0; ref_channel_cnt < hParamMC->hMetadataPMC->ild_mapping_conf->num_ref_channels[k]; ref_channel_cnt++ ) + { + ref_channel_idx = hParamMC->hMetadataPMC->ild_mapping_conf->ref_channel_idx[k][ref_channel_cnt]; + ref_ener += Cx_state[ref_channel_idx + ref_channel_idx * nX]; + } + Nrqq[hParamMC->hMetadataPMC->ild_mapping_conf->ild_index[k]] = powf( 10.0f, ild_q[k] / 10.0f ) * hParamMC->hMetadataPMC->ild_factors[k] * ref_ener; + } + for ( k = 0; k < nY_cov; k++ ) + { + for ( l = 0; l < nY_intern; l++ ) + { + target_ch_ener[k] += hParamMC->ls_conv_dmx_matrix[k + l * nY_cov] * Nrqq[l]; + } + Cy_state[k + nY_cov * k] = target_ch_ener[k]; + } + + /* Smoothing: Sum over two buffers */ + if ( hParamMC->hMetadataPMC->bAttackPresent ) + { + /* no smoothing on attacks */ + mvr2r( Cx_state, Cx, nX * nX ); + mvr2r( Cy_state, Cy_full, nY_cov * nY_cov ); + } + else + { + /* smoothing gains are now identical to one, simply add up */ + v_add( Cx_state, Cx_old_state, Cx, nX * nX ); + v_add( Cy_state, Cy_old_state, Cy_full, nY_cov * nY_cov ); + } + + /* cov buffer update */ + mvr2r( Cx_state, Cx_old_state, nX * nX ); + mvr2r( Cy_state, Cy_old_state, nY_cov * nY_cov ); + + + matrix_product( proto_matrix, nY_band, nX, 0, Cx, nX, nX, 0, mat_mult_buffer1 ); + + matrix_product_diag( mat_mult_buffer1, nY_band, nX, 0, proto_matrix, nY_band, nX, 1, Cproto_diag ); + + /* Computing the mixing matrices */ + for ( i = 0; i < nY_band; i++ ) + { + Cy_diag[i] = Cy_full[i + nY_band * i]; + Cy_diag[i] = sqrtf( Cy_diag[i] / ( Cproto_diag[i] + EPSILON ) ); + } + + diag_matrix_product( Cy_diag, nY_band, proto_matrix, nY_band, nX, 0, mixing_matrix_woLFE ); + + mvr2r( mixing_matrix_woLFE, mixing_matrix[param_band_idx], nY_cov * nX ); + if ( hParamMC->band_grouping[param_band_idx] < hParamMC->h_output_synthesis_params.max_band_decorr ) + { + set_zero( mixing_matrix_res[param_band_idx], nY_cov * nY_cov ); + } + } + + return; +} + + +/*------------------------------------------------------------------------- + * param_mc_update_mixing_matrices() + * + * update mixing matrix buffers + *------------------------------------------------------------------------*/ + +static void param_mc_update_mixing_matrices( + PARAM_MC_DEC_HANDLE hParamMC, /* i/o: Parametric MC handle */ + float *mixing_matrix[], /* i : direct mixing matrices for the frame just processed */ + float *mixing_matrix_res[], /* i : residual mixing matrices for the frame just processed */ + const uint16_t nX, /* i : number of transport channels */ + const uint16_t nY ) /* i : number of synthesis channels */ +{ + uint16_t param_band_idx; + + for ( param_band_idx = 0; param_band_idx < hParamMC->hMetadataPMC->nbands_coded; param_band_idx++ ) + { + int16_t brange[2]; + + brange[0] = hParamMC->band_grouping[param_band_idx]; + brange[1] = hParamMC->band_grouping[param_band_idx + 1]; + + mvr2r( mixing_matrix[param_band_idx], hParamMC->h_output_synthesis_cov_state.mixing_matrix_old[param_band_idx], nX * nY ); + + if ( brange[0] < hParamMC->h_output_synthesis_params.max_band_decorr ) + { + mvr2r( mixing_matrix_res[param_band_idx], hParamMC->h_output_synthesis_cov_state.mixing_matrix_res_old[param_band_idx], nY * nY ); + } + } + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_param_mc_dequantize_cov() + * + * generate the target covariance matrix + *------------------------------------------------------------------------*/ + +static void ivas_param_mc_dequantize_cov( + PARAM_MC_DEC_HANDLE hParamMC, /* i : Parametric MC handle */ + float *ild_q, /* i : sequence of dequantized ILD values */ + float *icc_q, /* i : sequence of dequantized ICC values */ + const int16_t param_band_index, /* i : current parameter band */ + const int16_t nY_cov, /* i : number of output channels in the covariance synthesis */ + const PARAM_MC_SYNTHESIS_CONF synth_conf, /* i : Parametric MC synthesis configuration */ + const int16_t nY_int, /* i : number of channels in the transported format */ + const int16_t nX, /* i : number of transport channels */ + float *Cx_state, /* i : transport channel covariance matrix */ + float *Cproto, /* i : prototype matrix */ + float *Cy_state /* o : target covariance matrix */ +) +{ + float Nrqq[MAX_OUTPUT_CHANNELS]; + float a[MAX_OUTPUT_CHANNELS]; + int16_t k; + int16_t l; + float *Cyp; + float ap; + int16_t param_frame_idx; + const PARAM_MC_ILD_MAPPING *h_ild_mapping; + float Cy_state_int[MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS]; + + param_frame_idx = hParamMC->hMetadataPMC->param_frame_idx; + set_zero( Nrqq, MAX_OUTPUT_CHANNELS ); + h_ild_mapping = hParamMC->hMetadataPMC->ild_mapping_conf; + + /*get back Nrg*/ + for ( k = 0; k < nY_int; k++ ) + { + float ref_ener = 0.0f; + int16_t ref_channel_cnt; + int16_t ref_channel_idx; + + for ( ref_channel_cnt = 0; ref_channel_cnt < h_ild_mapping->num_ref_channels[k]; ref_channel_cnt++ ) + { + ref_channel_idx = h_ild_mapping->ref_channel_idx[k][ref_channel_cnt]; + ref_ener += Cx_state[ref_channel_idx + ref_channel_idx * nX]; + } + Nrqq[h_ild_mapping->ild_index[k]] = powf( 10.0f, ild_q[k] / 10.0f ) * hParamMC->hMetadataPMC->ild_factors[k] * ref_ener; + } + + /* estimate ICCs from estimated Cproto */ + for ( k = 0; k < nY_int; k++ ) + { + a[k] = 1.f / ( sqrtf( Cproto[k + nY_int * k] ) + EPSILON ); + + v_multc( Cproto + k * nY_int, a[k], Cy_state_int + k * nY_int, nY_int ); + } + + for ( k = 0; k < nY_int; k++ ) + { + Cyp = Cy_state_int + k; + ap = a[k]; + for ( l = 0; l < nY_int; l++ ) + { + ( *Cyp ) *= ap; + Cyp += nY_int; + } + } + + /* replace some estimated ICCs with transmitted values */ + for ( k = 0; k < hParamMC->hMetadataPMC->icc_mapping_conf->icc_map_size_lfe; k++ ) + { + Cy_state_int[hParamMC->hMetadataPMC->icc_mapping[param_frame_idx][k][0] + nY_int * hParamMC->hMetadataPMC->icc_mapping[param_frame_idx][k][1]] = icc_q[k]; + Cy_state_int[hParamMC->hMetadataPMC->icc_mapping[param_frame_idx][k][1] + nY_int * hParamMC->hMetadataPMC->icc_mapping[param_frame_idx][k][0]] = icc_q[k]; + } + + if ( param_band_index >= PARAM_MC_MAX_BAND_LFE || !hParamMC->hMetadataPMC->lfe_on ) + { + for ( k = 0; k < nY_int; k++ ) + { + Cy_state_int[k + 3 * nY_int] = 1.0f; + Cy_state_int[3 + k * nY_int] = 1.0f; + } + Nrqq[3] = 0.0f; + } + + /* Generate back Covariance Mtx */ + for ( k = 0; k < nY_int; k++ ) + { + a[k] = sqrtf( Nrqq[k] ); + v_multc( Cy_state_int + k * nY_int, a[k], Cy_state_int + k * nY_int, nY_int ); + } + + for ( k = 0; k < nY_int; k++ ) + { + Cyp = Cy_state_int + k; + ap = a[k]; + + for ( l = 0; l < nY_int; l++ ) + { + ( *Cyp ) *= ap; + Cyp += nY_int; + } + } + + if ( synth_conf == PARAM_MC_SYNTH_LS_CONV_COV ) + { + /* Cy = dmx*Cy*dmx' */ + float mat_mult_buffer1[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; + float target_ch_ener[MAX_CICP_CHANNELS]; + float dmx_ch_ener[MAX_CICP_CHANNELS]; + + set_zero( target_ch_ener, MAX_CICP_CHANNELS ); + set_zero( dmx_ch_ener, MAX_CICP_CHANNELS ); + + matrix_product( hParamMC->ls_conv_dmx_matrix, nY_cov, nY_int, 0, + Cy_state_int, nY_int, nY_int, 0, + mat_mult_buffer1 ); + + matrix_product( mat_mult_buffer1, nY_cov, nY_int, 0, + hParamMC->ls_conv_dmx_matrix, nY_cov, nY_int, 1, + Cy_state ); + + for ( k = 0; k < nY_cov; k++ ) + { + for ( l = 0; l < nY_int; l++ ) + { + target_ch_ener[k] += hParamMC->ls_conv_dmx_matrix[k + l * nY_cov] * Nrqq[l]; + } + + dmx_ch_ener[k] = Cy_state[k + nY_cov * k]; + + if ( dmx_ch_ener[k] < 0.0f ) + { + Cy_state[k + nY_cov * k] *= -1.0f; + dmx_ch_ener[k] *= -1.0f; + } + + target_ch_ener[k] = sqrtf( target_ch_ener[k] / ( dmx_ch_ener[k] + EPSILON ) ); + + v_multc( Cy_state + k * nY_cov, target_ch_ener[k], Cy_state + k * nY_cov, nY_cov ); + + Cyp = Cy_state + k; + ap = target_ch_ener[k]; + for ( l = 0; l < nY_cov; l++ ) + { + ( *Cyp ) *= ap; + Cyp += nY_cov; + } + } + } + else + { + mvr2r( Cy_state_int, Cy_state, nY_int * nY_int ); + } + + return; +} + + +/*-------------------------------------------------------------------------* + * param_mc_set_num_synth_bands() + * + * set the number of frequency bands to be synthesized + *-------------------------------------------------------------------------*/ + +static void param_mc_set_num_synth_bands( + const int32_t output_Fs, /* i : output sampling frequency */ + PARAM_MC_DEC_HANDLE hParamMC /* i/o: Parametric MC handle */ +) +{ + uint16_t max_param_band_synth; + const int16_t *param_mc_bands_coded; + + switch ( hParamMC->hMetadataPMC->num_parameter_bands ) + { + case 20: + param_mc_bands_coded = param_mc_bands_coded_20; + break; + case 10: + param_mc_bands_coded = param_mc_bands_coded_10; + break; + case 14: + default: + param_mc_bands_coded = param_mc_bands_coded_14; + break; + } + + switch ( output_Fs ) + { + case 8000: + max_param_band_synth = param_mc_bands_coded[NB]; + break; + case 16000: + max_param_band_synth = param_mc_bands_coded[WB]; + break; + case 32000: + max_param_band_synth = param_mc_bands_coded[SWB]; + break; + case 48000: + default: + max_param_band_synth = param_mc_bands_coded[FB]; + break; + } + + hParamMC->num_param_bands_synth = min( hParamMC->hMetadataPMC->nbands_coded, max_param_band_synth ); + + return; +} + + +/*-------------------------------------------------------------------------* + * param_mc_get_diff_proto_info() + * + * calculated the diffuse prototype information + *-------------------------------------------------------------------------*/ + +static ivas_error param_mc_get_diff_proto_info( + const float *proto_mtx, /* i : protoype matrix for the synthesis */ + const uint16_t nchan_transport, /* i : number of transport channels */ + const uint16_t nchan_out_cov, /* i : number if output channels of the covariance synthesis */ + PARAM_MC_DIFF_PROTO_INFO *p_diff_proto_info /* o : generated diffuse prototype info */ +) +{ + float proto_fac[MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS]; + uint16_t cur_out_ch; + uint16_t cur_diff_proto; + uint16_t cur_transport_ch; + uint16_t max_num_src_chan; + + /* Initializations */ + max_num_src_chan = 0; + set_zero( proto_fac, MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS ); + if ( ( p_diff_proto_info->proto_index_diff = (int16_t *) malloc( nchan_out_cov * sizeof( int16_t ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); + } + set_s( p_diff_proto_info->proto_index_diff, 0, nchan_out_cov ); + + if ( ( p_diff_proto_info->num_source_chan_diff = (int16_t *) malloc( nchan_out_cov * sizeof( int16_t ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); + } + set_s( p_diff_proto_info->num_source_chan_diff, 0, nchan_out_cov ); + + /* we have at least one prototype, copy the first one */ + p_diff_proto_info->num_protos_diff = 1; + mvr2r_inc( proto_mtx, nchan_out_cov, proto_fac, nchan_out_cov, nchan_transport ); + p_diff_proto_info->proto_index_diff[0] = 0; + + /* search for distinct prototypes */ + for ( cur_out_ch = 1; cur_out_ch < nchan_out_cov; cur_out_ch++ ) + { + uint16_t found = 0; + + for ( cur_diff_proto = 0; cur_diff_proto < p_diff_proto_info->num_protos_diff; cur_diff_proto++ ) + { + float diff = 0; + float *proto_fac_ptr = proto_fac + cur_diff_proto; + const float *proto_mtx_ptr = proto_mtx + cur_out_ch; + + for ( cur_transport_ch = 0; cur_transport_ch < nchan_transport; cur_transport_ch++ ) + { + diff += fabsf( *proto_fac_ptr - *proto_mtx_ptr ); + proto_fac_ptr += nchan_out_cov; + proto_mtx_ptr += nchan_out_cov; + } + + /* we already have this prototype, save the index */ + if ( diff < 0.1f ) + { + found = 1; + p_diff_proto_info->proto_index_diff[cur_out_ch] = cur_diff_proto; + break; + } + } + + /* new distinct prototype, add it */ + if ( found == 0 ) + { + const float *proto_mtx_ptr = proto_mtx + cur_out_ch; + int16_t cur_num_src_chan; + + cur_num_src_chan = 0; + for ( cur_transport_ch = 0; cur_transport_ch < nchan_transport; cur_transport_ch++ ) + { + if ( *proto_mtx_ptr > EPSILON ) + { + cur_num_src_chan++; + } + proto_mtx_ptr += nchan_out_cov; + } + + mvr2r_inc( proto_mtx + cur_out_ch, nchan_out_cov, proto_fac + p_diff_proto_info->num_protos_diff, nchan_out_cov, nchan_transport ); + + p_diff_proto_info->proto_index_diff[cur_out_ch] = p_diff_proto_info->num_protos_diff; + p_diff_proto_info->num_protos_diff++; + max_num_src_chan = max( max_num_src_chan, cur_num_src_chan ); + } + } + + /* set up the prototype info struct */ + if ( ( p_diff_proto_info->source_chan_idx = (int16_t **) malloc( p_diff_proto_info->num_protos_diff * sizeof( int16_t * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); + } + if ( ( p_diff_proto_info->proto_fac = (float **) malloc( p_diff_proto_info->num_protos_diff * sizeof( float * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); + } + + for ( cur_diff_proto = 0; cur_diff_proto < p_diff_proto_info->num_protos_diff; cur_diff_proto++ ) + { + float *proto_fac_ptr; + + if ( ( p_diff_proto_info->source_chan_idx[cur_diff_proto] = (int16_t *) malloc( max_num_src_chan * sizeof( int16_t ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); + } + if ( ( p_diff_proto_info->proto_fac[cur_diff_proto] = (float *) malloc( max_num_src_chan * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); + } + + proto_fac_ptr = proto_fac + cur_diff_proto; + for ( cur_transport_ch = 0; cur_transport_ch < nchan_transport; cur_transport_ch++ ) + { + if ( *proto_fac_ptr > EPSILON ) + { + p_diff_proto_info->source_chan_idx[cur_diff_proto][p_diff_proto_info->num_source_chan_diff[cur_diff_proto]] = cur_transport_ch; + p_diff_proto_info->proto_fac[cur_diff_proto][p_diff_proto_info->num_source_chan_diff[cur_diff_proto]] = *proto_fac_ptr; + p_diff_proto_info->num_source_chan_diff[cur_diff_proto]++; + } + proto_fac_ptr += nchan_out_cov; + } + } + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------------* + * ivas_param_mc_bs_decode_parameter_values() + * + * reads and decodes a sequence of Parametric MC parameters from the bitstream + *-------------------------------------------------------------------------*/ + +static void ivas_param_mc_bs_decode_parameter_values( + uint16_t bit_buffer[], /* i : bitstream buffer */ + int16_t *bit_pos, /* i/o: current bitstream buffer position */ + const int16_t max_bits, /* i : maximum available bits in the buffer */ + int16_t *BER_detect, /* i/o: bit error detection flag */ + HANDLE_IVAS_PARAM_MC_METADATA hMetadataPMC, /* i : Parametric MC metadata information */ + HANDLE_PARAM_MC_PARAMETER_CODING_INFO hParamCodingInfo, /* i : Parametric MC parameter quantization and coding tables */ + const int16_t map_size_wo_lfe, /* i : number of parameters per band (w/o LFEs) */ + const int16_t map_size, /* i : number of parameters per band (total) */ + const int16_t num_lfe_bands, /* i : number of parameter bands with coded LFE */ + const int16_t band_step, /* i : parameter band step */ + const int16_t num_param_bands, /* i : number of parameter bands to decode */ + float *value_buffer /* o : output buffer for decoded parameter values */ +) +{ + int16_t range_coding; + int16_t sz_seq; + int16_t delta_coding; + int16_t delta_idx[PARAM_MC_MAX_PARAMETER_BANDS * PARAM_MC_MAX_VAL_MAP_SIZE]; + int16_t idx[PARAM_MC_MAX_PARAMETER_BANDS * PARAM_MC_MAX_VAL_MAP_SIZE]; + int16_t idx_prev; + int16_t idx_offset; + int16_t sz_alphabet; + int16_t i, j, k; + float dequant_seq[PARAM_MC_MAX_PARAMETER_BANDS * PARAM_MC_MAX_VAL_MAP_SIZE]; + float dequant_ordered[PARAM_MC_MAX_PARAMETER_BANDS * PARAM_MC_MAX_VAL_MAP_SIZE]; + int16_t n_lfe_idx; + + range_coding = bit_buffer[( *bit_pos )++]; + + /* Decoding the sequence */ + n_lfe_idx = map_size - map_size_wo_lfe; + sz_seq = num_param_bands * ( map_size_wo_lfe ) + num_lfe_bands * n_lfe_idx; + + set_s( idx, 0, PARAM_MC_MAX_PARAMETER_BANDS * PARAM_MC_MAX_VAL_MAP_SIZE ); + set_zero( dequant_ordered, PARAM_MC_MAX_PARAMETER_BANDS * PARAM_MC_MAX_VAL_MAP_SIZE ); + set_zero( dequant_seq, PARAM_MC_MAX_PARAMETER_BANDS * PARAM_MC_MAX_VAL_MAP_SIZE ); + + if ( range_coding ) + { + delta_coding = bit_buffer[( *bit_pos )++]; + + if ( delta_coding ) + { + idx_prev = hParamCodingInfo->quantizer_size / 2 + hParamCodingInfo->quantizer_size % 2 - 1; + sz_alphabet = 2 * hParamCodingInfo->quantizer_size - 1; + idx_offset = hParamCodingInfo->quantizer_size - 1; + + /* read range coded delta ICC indices */ + *bit_pos += ivas_param_mc_range_decoder_LC( &bit_buffer[*bit_pos], delta_idx, BER_detect, sz_seq, sz_alphabet, + hParamCodingInfo->cum_freq_delta, hParamCodingInfo->sym_freq_delta, PARAM_MC_RANGE_CODER_TOT_SHIFT, max_bits - *bit_pos ); + + /* delta index to absolute index */ + for ( j = 0; j < sz_seq; j++ ) + { + idx[j] = idx_prev + delta_idx[j] - idx_offset; + idx_prev = idx[j]; + } + } + else + { + /* read range coded absolute ICC indices */ + sz_alphabet = hParamCodingInfo->quantizer_size; + *bit_pos += ivas_param_mc_range_decoder_LC( &bit_buffer[*bit_pos], idx, BER_detect, sz_seq, sz_alphabet, + hParamCodingInfo->cum_freq, hParamCodingInfo->sym_freq, PARAM_MC_RANGE_CODER_TOT_SHIFT, max_bits - *bit_pos ); + } + + /* dequantize */ + for ( j = 0; j < sz_seq; j++ ) + { + dequant_seq[j] = hParamCodingInfo->quantizer[idx[j]]; + } + } + else + { + set_zero( dequant_seq, PARAM_MC_MAX_PARAMETER_BANDS * PARAM_MC_MAX_VAL_MAP_SIZE ); + + /* read uniformly coded ICCs */ + *bit_pos += ivas_param_mc_uniform_decoder( dequant_seq, sz_seq, hParamCodingInfo->quantizer, hParamCodingInfo->uni_bits, &bit_buffer[*bit_pos] ); + } + + /* reorder from sequential to parameter-band-wise */ + k = 0; + for ( j = 0; j < map_size_wo_lfe; ++j ) + { + for ( i = 0; i < num_param_bands; ++i ) + { + dequant_ordered[j + i * map_size] = dequant_seq[k++]; + } + } + + for ( i = 0; i < num_lfe_bands; i++ ) + { + for ( j = 0; j < n_lfe_idx; j++ ) + { + dequant_ordered[map_size - n_lfe_idx + j + i * map_size] = dequant_seq[k++]; + } + } + + if ( !( *BER_detect ) ) + { + j = 0; + for ( k = 0; k < hMetadataPMC->nbands_coded; k += band_step ) + { + if ( hMetadataPMC->bAttackPresent || hMetadataPMC->param_frame_idx == hMetadataPMC->coding_band_mapping[k] ) + { + mvr2r( dequant_ordered + j * map_size, value_buffer + k * map_size, map_size ); + j++; + } + if ( hMetadataPMC->bAttackPresent && k + 1 < hMetadataPMC->nbands_coded ) + { + mvr2r( value_buffer + k * map_size, value_buffer + ( k + 1 ) * map_size, map_size ); + } + } + } + + return; +} diff --git a/lib_dec/ivas_mc_paramupmix_dec.c b/lib_dec/ivas_mc_paramupmix_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..26a655425611bcf74ffc8af6724ea1770add4f79 --- /dev/null +++ b/lib_dec/ivas_mc_paramupmix_dec.c @@ -0,0 +1,1336 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_prot_rend.h" +#include "ivas_cnst.h" +#include "ivas_rom_com.h" +#include "ivas_rom_dec.h" +#include "math.h" +#include "wmc_auto.h" +#include "rom_dec.h" + + +/*-----------------------------------------------------------------------* + * Local arrays + *-----------------------------------------------------------------------*/ + +/* boxes = { 0 1 2 3 [4 6] [5 7] [8 10] [9 11] }; */ +const int16_t MC_PARAMUPMIX_CHIDX1[MC_PARAMUPMIX_COMBINATIONS] = { 0, 1, 4, 5 }; +const int16_t MC_PARAMUPMIX_CHIDX2[MC_PARAMUPMIX_COMBINATIONS] = { 2, 3, 6, 7 }; + + +/*-----------------------------------------------------------------------* + * Local function prototypes + *-----------------------------------------------------------------------*/ + +static void ps_pred_process( MC_PARAMUPMIX_DEC_HANDLE hMCParamUpmix, float qmf_mod_re[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], float qmf_mod_im[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], float qmf_side_re[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], float qmf_side_im[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], const int16_t ch ); + +static void ps_pred_process_sf( MC_PARAMUPMIX_DEC_HANDLE hMCParamUpmix, DECODER_TC_BUFFER_HANDLE hTcBuffer, float qmf_mod_re[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float qmf_mod_im[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float qmf_side_re[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float qmf_side_im[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float *param_interpol, const int16_t ch, const int16_t slots_rendered ); + +static void ivas_mc_paramupmix_dec_sf( Decoder_Struct *st_ivas, float *output_f[MAX_OUTPUT_CHANNELS] ); + +static void ivas_param_upmix_dec_decorr_subframes( Decoder_Struct *st_ivas, const int16_t nSamplesForRendering ); + +static void paramupmix_td_decorr_process( ivas_td_decorr_state_t *hTdDecorr[], float *pcm_in[], float **pp_out_pcm, const int16_t output_frame ); + +static int16_t huff_read( Decoder_State *st, const int16_t ( *ht )[2] ); + +static void huffman_decode( Decoder_State *st, const int16_t nv, const int16_t ivStart, PAR_TYPE parType, QUANT_TYPE quant_type, const int16_t bNoDt, int32_t *vq ); + +static void dequant_alpha( const int16_t nv, const int16_t ivStart, const QUANT_TYPE quant_type, int32_t *vq, float *v ); + +static void dequant_beta( const int16_t nv, const int16_t ivStart, const QUANT_TYPE quant_type, int32_t *aq, int32_t *bq, float *beta ); + +static void get_ec_data( Decoder_State *st, const PAR_TYPE parType, const QUANT_TYPE quant_type, const int16_t nParBand, const int16_t parBandStart, int32_t *parQ, int32_t *alphaQEnv, float ab[IVAS_MAX_NUM_BANDS] ); + + +/*------------------------------------------------------------------------- + * ivas_mc_paramupmix_dec_read_BS() + * + * Read the ParamUpmix MC metadata + *------------------------------------------------------------------------*/ + +void ivas_mc_paramupmix_dec_read_BS( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + Decoder_State *st0, /* i/o: decoder state structure */ + MC_PARAMUPMIX_DEC_HANDLE hMCParamUpmix, /* i/o: decoder MC Param-Upmix handle */ + int16_t *nb_bits /* o : number of bits written */ +) +{ + int16_t i, k; + int32_t alpha_quant[IVAS_MAX_NUM_BANDS]; + int16_t nb_bits_read_orig; + int16_t next_bit_pos_orig, last_bit_pos; + uint16_t bstr_meta[MAX_BITS_METADATA], *bit_stream_orig; + + push_wmops( "mc_paramupmix_read_bs" ); + *nb_bits = 0; + + if ( st0->bfi ) + { + for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ ) + { + for ( k = 0; k < IVAS_MAX_NUM_BANDS; k++ ) + { + hMCParamUpmix->alphas[i][k] = hMCParamUpmix->alpha_prev[i][k]; + hMCParamUpmix->betas[i][k] = hMCParamUpmix->beta_prev[i][k]; + } + } + hMCParamUpmix->first_frame = 1; + } + else /* if (!st->bfi) */ + { + bit_stream_orig = st0->bit_stream; + next_bit_pos_orig = st0->next_bit_pos; + last_bit_pos = (int16_t) ( ( st_ivas->hDecoderConfig->ivas_total_brate / FRAMES_PER_SEC ) - 1 ); + nb_bits_read_orig = 0; + last_bit_pos -= nb_bits_read_orig; /* reverse the bitstream for easier reading of indices */ + for ( i = 0; i < min( MAX_BITS_METADATA, last_bit_pos ); i++ ) + { + bstr_meta[i] = st_ivas->bit_stream[last_bit_pos - i]; + } + st0->bit_stream = bstr_meta; + st0->next_bit_pos = 0; + st0->bits_frame = min( MAX_BITS_METADATA, last_bit_pos + 1 ); + st0->total_brate = st_ivas->hDecoderConfig->ivas_total_brate; /* to avoid BER detect */ + + for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ ) + { + get_ec_data( st0, ALPHA, FINE /*quant_type*/, IVAS_MAX_NUM_BANDS /*nParBand*/, + 0 /*parBandStart*/, hMCParamUpmix->alpha_quant[i], alpha_quant, hMCParamUpmix->alphas[i] ); + + get_ec_data( st0, BETA, FINE /*quant_type*/, IVAS_MAX_NUM_BANDS /*nParBand*/, + 0 /*parBandStart*/, hMCParamUpmix->beta_quant[i], alpha_quant, hMCParamUpmix->betas[i] ); + } + *nb_bits += st0->next_bit_pos; + st0->bit_stream = bit_stream_orig; + st0->next_bit_pos = next_bit_pos_orig; + + if ( hMCParamUpmix->first_frame ) + { + for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ ) + { + mvr2r( hMCParamUpmix->alphas[i], hMCParamUpmix->alpha_prev[i], IVAS_MAX_NUM_BANDS ); + mvr2r( hMCParamUpmix->betas[i], hMCParamUpmix->beta_prev[i], IVAS_MAX_NUM_BANDS ); + } + hMCParamUpmix->first_frame = 0; + } + } + + pop_wmops(); + return; +} + + +/*------------------------------------------------------------------------- + * ivas_mc_paramupmix_dec() + * + * MC ParamUpmix decoding process + *------------------------------------------------------------------------*/ + +void ivas_mc_paramupmix_dec( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + float *output_f[] /* i/o: synthesized core-coder transport channels */ +) +{ + MC_PARAMUPMIX_DEC_HANDLE hMCParamUpmix; + int16_t i, k, ch; + int16_t slot_idx; + int16_t first_empty_channel; + int16_t nchan_out_transport; + /*CLDFB*/ + float Cldfb_RealBuffer[MC_PARAMUPMIX_MAX_TRANSPORT_CHANS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + float Cldfb_ImagBuffer[MC_PARAMUPMIX_MAX_TRANSPORT_CHANS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + int16_t channel_active[MAX_OUTPUT_CHANNELS]; + int32_t output_Fs; + int16_t output_frame; + float Pcm_decorr[MC_PARAMUPMIX_COMBINATIONS][L_FRAME48k]; /* decorrelated channels */ + float *pPcm_temp[MC_PARAMUPMIX_COMBINATIONS * 2]; /* decorrelated and undecorrelated*/ + int16_t noparamupmix_delay; + AUDIO_CONFIG output_config; + int16_t subframeIdx, idx_in, index_slot, maxBand; + float Cldfb_RealBuffer_subfr[MAX_INTERN_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; + float Cldfb_ImagBuffer_subfr[MAX_INTERN_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; + float Cldfb_RealBuffer_Binaural[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; + float Cldfb_ImagBuffer_Binaural[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; + + hMCParamUpmix = st_ivas->hMCParamUpmix; + assert( hMCParamUpmix ); + push_wmops( "mc_paramupmix_dec" ); + + set_s( channel_active, 0, MAX_CICP_CHANNELS ); + nchan_out_transport = st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe; + set_s( channel_active, 1, nchan_out_transport ); /* change to nchan_out_transport */ + output_Fs = st_ivas->hDecoderConfig->output_Fs; + output_config = st_ivas->hDecoderConfig->output_config; + output_frame = (int16_t) ( output_Fs / FRAMES_PER_SEC ); + + if ( ( output_config == IVAS_AUDIO_CONFIG_STEREO ) || ( output_config == IVAS_AUDIO_CONFIG_MONO ) ) + { + first_empty_channel = 8; /* Don't upmix */ + + /* Compensate loudness for not doing full upmix */ + for ( i = 4; i < 8; i++ ) + { + v_multc( output_f[i], 2.0f, output_f[i], L_FRAME48k ); + } + } + else + { + first_empty_channel = 12; + + for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ ) + { + pPcm_temp[i] = Pcm_decorr[i]; /* decorrelated */ + } + + paramupmix_td_decorr_process( hMCParamUpmix->hTdDecorr, &( output_f[4] ), pPcm_temp, output_frame ); + + for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ ) + { + pPcm_temp[2 * i] = output_f[i + 4]; /* un-decorrelated */ + pPcm_temp[2 * i + 1] = Pcm_decorr[i]; /* decorrelated */ + } + + /* CLDFB Analysis*/ + for ( ch = 0; ch < MC_PARAMUPMIX_COMBINATIONS * 2; ch++ ) + { + /* slot loop for gathering the input data */ + for ( slot_idx = 0; slot_idx < CLDFB_NO_COL_MAX; slot_idx++ ) + { + cldfbAnalysis_ts( &( pPcm_temp[ch][hMCParamUpmix->num_freq_bands * slot_idx] ), Cldfb_RealBuffer[ch][slot_idx], Cldfb_ImagBuffer[ch][slot_idx], hMCParamUpmix->num_freq_bands, st_ivas->cldfbAnaDec[ch] ); + } + } + for ( ch = 0; ch < MC_PARAMUPMIX_COMBINATIONS; ch++ ) + { + ps_pred_process( hMCParamUpmix, + Cldfb_RealBuffer[2 * ch], /* in/out */ + Cldfb_ImagBuffer[2 * ch], + Cldfb_RealBuffer[2 * ch + 1], /* in/out decorr */ + Cldfb_ImagBuffer[2 * ch + 1], + ch ); + + /*-- m, s -> l, r ----------------------------*/ + for ( i = 0; i < CLDFB_NO_COL_MAX; i++ ) + { + for ( k = 0; k < CLDFB_NO_CHANNELS_MAX; k++ ) + { + float qlre = Cldfb_RealBuffer[2 * ch][i][k]; + float qlim = Cldfb_ImagBuffer[2 * ch][i][k]; + float qrre = Cldfb_RealBuffer[2 * ch + 1][i][k]; + float qrim = Cldfb_ImagBuffer[2 * ch + 1][i][k]; + + Cldfb_RealBuffer[2 * ch][i][k] = qlre + qrre; + Cldfb_ImagBuffer[2 * ch][i][k] = qlim + qrim; + Cldfb_RealBuffer[2 * ch + 1][i][k] = qlre - qrre; + Cldfb_ImagBuffer[2 * ch + 1][i][k] = qlim - qrim; + } + } + + mvr2r( hMCParamUpmix->alphas[ch], hMCParamUpmix->alpha_prev[ch], IVAS_MAX_NUM_BANDS ); + mvr2r( hMCParamUpmix->betas[ch], hMCParamUpmix->beta_prev[ch], IVAS_MAX_NUM_BANDS ); + } + + if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) + { + maxBand = (int16_t) ( ( CLDFB_NO_CHANNELS_MAX * st_ivas->hDecoderConfig->output_Fs ) / 48000 ); + /* fastconv binaural rendering and CLDFB synthesis */ + for ( subframeIdx = 0; subframeIdx < ( CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES ); subframeIdx++ ) + { + index_slot = subframeIdx * MAX_PARAM_SPATIAL_SUBFRAMES; + /* cldfb analysis of non-coupled, non-LFE channels */ + idx_in = 0; + for ( ch = 0; ch < first_empty_channel - 2 * MC_PARAMUPMIX_COMBINATIONS; ch++ ) + { + if ( st_ivas->hIntSetup.index_lfe[0] != ch ) + { + pPcm_temp[ch] = output_f[ch]; + /* slot loop for gathering the input data */ + for ( slot_idx = 0; slot_idx < MAX_PARAM_SPATIAL_SUBFRAMES; slot_idx++ ) + { + cldfbAnalysis_ts( &( pPcm_temp[ch][hMCParamUpmix->num_freq_bands * ( index_slot + slot_idx )] ), + Cldfb_RealBuffer_subfr[idx_in][slot_idx], + Cldfb_ImagBuffer_subfr[idx_in][slot_idx], + maxBand, st_ivas->cldfbAnaDec[2 * MC_PARAMUPMIX_COMBINATIONS + idx_in] ); + } + idx_in++; + } + } + + /* copy and reorder cldfb analysis of coupled channels */ + for ( ch = 0; ch < MAX_PARAM_SPATIAL_SUBFRAMES; ch++ ) + { + for ( slot_idx = 0; slot_idx < MAX_PARAM_SPATIAL_SUBFRAMES; slot_idx++ ) + { + mvr2r( Cldfb_RealBuffer[MC_PARAMUPMIX_CHIDX1[ch]][index_slot + slot_idx], Cldfb_RealBuffer_subfr[idx_in][slot_idx], CLDFB_NO_CHANNELS_MAX ); + mvr2r( Cldfb_ImagBuffer[MC_PARAMUPMIX_CHIDX1[ch]][index_slot + slot_idx], Cldfb_ImagBuffer_subfr[idx_in][slot_idx], CLDFB_NO_CHANNELS_MAX ); + mvr2r( Cldfb_RealBuffer[MC_PARAMUPMIX_CHIDX2[ch]][index_slot + slot_idx], Cldfb_RealBuffer_subfr[idx_in + 1][slot_idx], CLDFB_NO_CHANNELS_MAX ); + mvr2r( Cldfb_ImagBuffer[MC_PARAMUPMIX_CHIDX2[ch]][index_slot + slot_idx], Cldfb_ImagBuffer_subfr[idx_in + 1][slot_idx], CLDFB_NO_CHANNELS_MAX ); + } + idx_in += 2; + } + + if ( st_ivas->hCombinedOrientationData && st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV ) + { + for ( slot_idx = 0; slot_idx < MAX_PARAM_SPATIAL_SUBFRAMES; slot_idx++ ) + { + ivas_param_mc_mc2sba_cldfb( st_ivas->hTransSetup, hMCParamUpmix->hoa_encoder, slot_idx, Cldfb_RealBuffer_subfr, Cldfb_ImagBuffer_subfr, maxBand, GAIN_LFE ); + } + } + + + /* Implement binaural rendering */ + ivas_binRenderer( st_ivas->hBinRenderer, st_ivas->hCombinedOrientationData, subframeIdx, /* TODO (5ms) : tmu2Dlb please verify */ JBM_CLDFB_SLOTS_IN_SUBFRAME, + Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer_subfr, Cldfb_ImagBuffer_subfr ); + + + /* Implement CLDFB synthesis */ + for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + float *RealBuffer[MAX_PARAM_SPATIAL_SUBFRAMES]; + float *ImagBuffer[MAX_PARAM_SPATIAL_SUBFRAMES]; + + for ( slot_idx = 0; slot_idx < MAX_PARAM_SPATIAL_SUBFRAMES; slot_idx++ ) + { + RealBuffer[slot_idx] = Cldfb_RealBuffer_Binaural[ch][slot_idx]; + ImagBuffer[slot_idx] = Cldfb_ImagBuffer_Binaural[ch][slot_idx]; + } + + cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][index_slot * maxBand] ), maxBand * MAX_PARAM_SPATIAL_SUBFRAMES, st_ivas->cldfbSynDec[ch] ); + } + } + } + else + { + pPcm_temp[0] = output_f[4]; + pPcm_temp[1] = output_f[6]; + pPcm_temp[2] = output_f[5]; + pPcm_temp[3] = output_f[7]; + pPcm_temp[4] = output_f[8]; + pPcm_temp[5] = output_f[10]; + pPcm_temp[6] = output_f[9]; + pPcm_temp[7] = output_f[11]; + + /* CLDFB synthesis */ + for ( ch = 0; ch < MC_PARAMUPMIX_COMBINATIONS * 2; ch++ ) + { + for ( slot_idx = 0; slot_idx < CLDFB_NO_COL_MAX; slot_idx++ ) + { + float *ptr_im[1], *ptr_re[1]; + ptr_re[0] = Cldfb_RealBuffer[ch][slot_idx]; + ptr_im[0] = Cldfb_ImagBuffer[ch][slot_idx]; + + cldfbSynthesis( ptr_re, ptr_im, &( pPcm_temp[ch][hMCParamUpmix->num_freq_bands * slot_idx] ), + hMCParamUpmix->num_freq_bands, st_ivas->cldfbSynDec[ch] ); + } + } + + /* adjust delay of other channels */ + noparamupmix_delay = NS2SA( output_Fs, IVAS_FB_DEC_DELAY_NS ); + for ( ch = 0; ch < MC_PARAMUPMIX_COMBINATIONS; ch++ ) + { + float tmp_buf[L_SUBFRAME5MS_48k]; + mvr2r( &output_f[ch][output_frame - noparamupmix_delay], tmp_buf, noparamupmix_delay ); + mvr2r( output_f[ch], &output_f[ch][noparamupmix_delay], output_frame - noparamupmix_delay ); + mvr2r( hMCParamUpmix->pcm_delay[ch], output_f[ch], noparamupmix_delay ); + mvr2r( tmp_buf, hMCParamUpmix->pcm_delay[ch], noparamupmix_delay ); + } + } + } + +#ifdef NONBE_FIX_839_MC_RS_CHANNEL_ALLOC + for ( ch = first_empty_channel; ch < ivas_get_nchan_buffers_dec( st_ivas, -1, -1 ); ch++ ) +#else + for ( ch = first_empty_channel; ch < ivas_get_nchan_buffers_dec( st_ivas, st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); ch++ ) +#endif + { + set_f( output_f[ch], 0.0f, output_frame ); + } + + pop_wmops(); + return; +} + + +/*------------------------------------------------------------------------- + * ivas_mc_paramupmix_dec_digest_tc() + * + * + *------------------------------------------------------------------------*/ + +void ivas_mc_paramupmix_dec_digest_tc( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const uint8_t nCldfbSlots, /* i : number of CLFBS slots in the transport channels*/ + const int16_t nSamplesForRendering /* i : number of samples provided */ +) +{ + MC_PARAMUPMIX_DEC_HANDLE hMCParamUpmix; + hMCParamUpmix = st_ivas->hMCParamUpmix; + assert( hMCParamUpmix ); + push_wmops( "ivas_mc_paramupmix_dec_digest_tc" ); + + ivas_param_upmix_dec_decorr_subframes( st_ivas, nSamplesForRendering ); + + /* adapt subframes */ + ivas_jbm_dec_td_renderers_adapt_subframes( st_ivas ); + + ivas_jbm_dec_get_adapted_linear_interpolator( DEFAULT_JBM_CLDFB_TIMESLOTS, nCldfbSlots, hMCParamUpmix->param_interpolator ); + + pop_wmops(); + return; +} + + +/*------------------------------------------------------------------------- + * ivas_mc_paramupmix_dec_render() + * + * + *------------------------------------------------------------------------*/ + +void ivas_mc_paramupmix_dec_render( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */ + uint16_t *nSamplesRendered, /* o : number of CLDFB slots rendered */ + uint16_t *nSamplesAvailable, /* o : number of CLDFB slots still to render */ + float *input_f[], /* i : core-coder transport channels */ + float *output_f[] /* i/o: synthesized core-coder transport channels */ +) +{ + int16_t slots_to_render, first_sf, last_sf, subframe_idx; + uint16_t slot_size, ch; + float *output_f_local[MAX_OUTPUT_CHANNELS]; + MC_PARAMUPMIX_DEC_HANDLE hMCParamUpmix; + + hMCParamUpmix = st_ivas->hMCParamUpmix; + assert( hMCParamUpmix ); + + push_wmops( "ivas_mc_paramupmix_dec_render" ); + + for ( ch = 0; ch < MAX_OUTPUT_CHANNELS; ch++ ) + { + output_f_local[ch] = output_f[ch]; + } + + slot_size = st_ivas->hTcBuffer->n_samples_granularity; + + /* loop for synthesis, assume we always have to render in multiples of 5ms subframes with spills */ + slots_to_render = min( st_ivas->hTcBuffer->num_slots - st_ivas->hTcBuffer->slots_rendered, nSamplesAsked / slot_size ); + *nSamplesRendered = slots_to_render * slot_size; + first_sf = st_ivas->hTcBuffer->subframes_rendered; + last_sf = first_sf; + + for ( ch = 0; ch < MAX_TRANSPORT_CHANNELS; ch++ ) + { + mvr2r( input_f[ch], output_f_local[ch], *nSamplesRendered ); + } + + while ( slots_to_render > 0 ) + { + slots_to_render -= st_ivas->hTcBuffer->subframe_nbslots[last_sf]; + last_sf++; + } + { + + for ( ch = 0; ch < MC_PARAMUPMIX_COMBINATIONS; ch++ ) + { + mvr2r( hMCParamUpmix->alpha_prev[ch], hMCParamUpmix->alpha_sf[ch], IVAS_MAX_NUM_BANDS ); + mvr2r( hMCParamUpmix->beta_prev[ch], hMCParamUpmix->beta_sf[ch], IVAS_MAX_NUM_BANDS ); + } + + for ( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ ) + { + int16_t n_samples_sf = slot_size * st_ivas->hTcBuffer->subframe_nbslots[subframe_idx]; + + ivas_mc_paramupmix_dec_sf( st_ivas, output_f_local ); + for ( ch = 0; ch < MAX_OUTPUT_CHANNELS; ch++ ) + { + output_f_local[ch] += n_samples_sf; + } + } + + for ( ch = 0; ch < MC_PARAMUPMIX_COMBINATIONS; ch++ ) + { + mvr2r( hMCParamUpmix->alphas[ch], hMCParamUpmix->alpha_prev[ch], IVAS_MAX_NUM_BANDS ); + mvr2r( hMCParamUpmix->betas[ch], hMCParamUpmix->beta_prev[ch], IVAS_MAX_NUM_BANDS ); + } + } + + *nSamplesAvailable = ( st_ivas->hTcBuffer->num_slots - st_ivas->hTcBuffer->slots_rendered ) * slot_size; + + pop_wmops(); + return; +} + + +/*------------------------------------------------------------------------- + * ivas_mc_paramupmix_dec_open() + * + * Open Parametric MC decoder handle + *-------------------------------------------------------------------------*/ + +ivas_error ivas_mc_paramupmix_dec_open( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +) +{ + MC_PARAMUPMIX_DEC_HANDLE hMCParamUpmix; + int32_t output_Fs; + int16_t nchan_transport; + uint16_t i; + ivas_error error; + + error = IVAS_ERR_OK; + + /*-----------------------------------------------------------------* + * prepare library opening + *-----------------------------------------------------------------*/ + + if ( ( hMCParamUpmix = (MC_PARAMUPMIX_DEC_HANDLE) malloc( sizeof( MC_PARAMUPMIX_DEC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param-Upmix MC\n" ) ); + } + output_Fs = st_ivas->hDecoderConfig->output_Fs; + hMCParamUpmix->first_frame = 1; + st_ivas->nchan_transport = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS; + nchan_transport = st_ivas->nchan_transport; + + switch ( nchan_transport ) + { + case 8: + st_ivas->nCPE = 4; + st_ivas->nSCE = 0; + st_ivas->element_mode_init = IVAS_CPE_MDCT; + break; + } + + hMCParamUpmix->hoa_encoder = NULL; + + /*-----------------------------------------------------------------* + * set input parameters + *-----------------------------------------------------------------*/ + + hMCParamUpmix->num_freq_bands = (int16_t) ( output_Fs * INV_CLDFB_BANDWIDTH + 0.5f ); + + for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ ) + { + ivas_td_decorr_dec_open( &( hMCParamUpmix->hTdDecorr[i] ), output_Fs, 2, 1 ); + } + + for ( i = 0; i < MC_PARAMUPMIX_MAX_TRANSPORT_CHANS; i++ ) + { + if ( ( hMCParamUpmix->pcm_delay[i] = (float *) malloc( NS2SA( output_Fs, IVAS_FB_DEC_DELAY_NS ) * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for delay buffer\n" ) ); + } + set_zero( hMCParamUpmix->pcm_delay[i], NS2SA( output_Fs, IVAS_FB_DEC_DELAY_NS ) ); + } + + /* Head or external rotation */ + if ( ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) && ( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation ) ) + { + if ( ( hMCParamUpmix->hoa_encoder = (float *) malloc( st_ivas->hTransSetup.nchan_out_woLFE * MAX_INTERN_CHANNELS * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); + } + compute_hoa_encoder_mtx( st_ivas->hTransSetup.ls_azimuth, st_ivas->hTransSetup.ls_elevation, hMCParamUpmix->hoa_encoder, st_ivas->hTransSetup.nchan_out_woLFE, HEAD_ROTATION_HOA_ORDER ); + } + + /* allocate transport channels*/ + hMCParamUpmix->free_param_interpolator = 0; + hMCParamUpmix->param_interpolator = NULL; + + if ( st_ivas->hDecoderConfig->Opt_5ms == 1 ) + { + if ( ( hMCParamUpmix->param_interpolator = (float *) malloc( MAX_JBM_CLDFB_TIMESLOTS * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for interpolator\n" ) ); + } + hMCParamUpmix->free_param_interpolator = 1; + + ivas_jbm_dec_get_adapted_linear_interpolator( DEFAULT_JBM_CLDFB_TIMESLOTS, DEFAULT_JBM_CLDFB_TIMESLOTS, hMCParamUpmix->param_interpolator ); + } + + if ( st_ivas->hDecoderConfig->Opt_5ms == 1 && st_ivas->hTcBuffer == NULL ) + { + int16_t nchan_to_allocate; + int16_t nchan_tc; + TC_BUFFER_MODE buffer_mode; + + buffer_mode = TC_BUFFER_MODE_RENDERER; + nchan_tc = ivas_jbm_dec_get_num_tc_channels( st_ivas ); + nchan_to_allocate = MC_PARAMUPMIX_MAX_INPUT_CHANS; + + if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_STEREO || st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_MONO ) + { + buffer_mode = TC_BUFFER_MODE_BUFFER; + nchan_tc = st_ivas->hDecoderConfig->nchan_out; + nchan_to_allocate = nchan_tc; + } + else if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) + { + nchan_to_allocate = MC_PARAMUPMIX_MAX_INPUT_CHANS; + } + + if ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, buffer_mode, nchan_tc, nchan_to_allocate, nchan_to_allocate, NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + st_ivas->hMCParamUpmix = hMCParamUpmix; + + return error; +} + + +/*------------------------------------------------------------------------- + * ivas_mc_paramupmix_dec_close() + * + * Close ParamUpmix MC memories + *------------------------------------------------------------------------*/ + +void ivas_mc_paramupmix_dec_close( + MC_PARAMUPMIX_DEC_HANDLE *hMCParamUpmix /* i/o: Parametric MC decoder handle */ +) +{ + int16_t i; + + if ( hMCParamUpmix == NULL || *hMCParamUpmix == NULL ) + { + return; + } + for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ ) + { + ivas_td_decorr_dec_close( &( ( *hMCParamUpmix )->hTdDecorr[i] ) ); + } + for ( i = 0; i < MC_PARAMUPMIX_MAX_TRANSPORT_CHANS; i++ ) + { + if ( ( *hMCParamUpmix )->pcm_delay[i] != NULL ) + { + free( ( *hMCParamUpmix )->pcm_delay[i] ); + } + } + if ( ( *hMCParamUpmix )->param_interpolator != NULL ) + { + if ( ( *hMCParamUpmix )->free_param_interpolator == 1 ) + { + free( ( *hMCParamUpmix )->param_interpolator ); + } + } + if ( ( *hMCParamUpmix )->hoa_encoder != NULL ) + { + free( ( *hMCParamUpmix )->hoa_encoder ); + ( *hMCParamUpmix )->hoa_encoder = NULL; + } + free( *hMCParamUpmix ); + + *hMCParamUpmix = NULL; + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_param_upmix_dec_decorr_subframes() + * + * + *------------------------------------------------------------------------*/ + +static void paramupmix_td_decorr_process_jbm( + ivas_td_decorr_state_t *hTdDecorr[], /* i/o: SPAR Covar. decoder handle */ + float *pcm_in[], /* i : input audio channels */ + float **pp_out_pcm, /* o : output audio channels */ + const int16_t output_frame /* i : output frame length */ +) +{ + int16_t j, k; + int16_t offset; + float in_duck_gain[L_FRAME48k], out_duck_gain[L_FRAME48k]; + + offset = (int16_t) ( output_frame * FRAMES_PER_SEC * IVAS_DECORR_PARM_LOOKAHEAD_TAU ); + + /* Look-ahead delay */ + for ( k = 0; k < MC_PARAMUPMIX_COMBINATIONS; k++ ) + { + mvr2r( pcm_in[k], pp_out_pcm[k], output_frame ); + delay_signal( pp_out_pcm[k], output_frame, hTdDecorr[k]->look_ahead_buf, offset ); + + /* In ducking gains */ + if ( hTdDecorr[k]->ducking_flag ) + { + ivas_td_decorr_get_ducking_gains( hTdDecorr[k]->pTrans_det, pcm_in[k], in_duck_gain, out_duck_gain, output_frame, 0 ); + + for ( j = 0; j < output_frame; j++ ) + { + pp_out_pcm[k][j] = pp_out_pcm[k][j] * in_duck_gain[j]; + } + } + + /* All pass delay section */ + ivas_td_decorr_APD_iir_filter( &hTdDecorr[k]->APD_filt_state[0], pp_out_pcm[k], hTdDecorr[k]->num_apd_sections, output_frame ); + + /* Out ducking gains */ + if ( hTdDecorr[k]->ducking_flag ) + { + for ( j = 0; j < output_frame; j++ ) + { + pp_out_pcm[k][j] = pp_out_pcm[k][j] * out_duck_gain[j]; + } + } + } + + return; +} + + +static void ivas_param_upmix_dec_decorr_subframes( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const int16_t nSamplesForRendering ) +{ + MC_PARAMUPMIX_DEC_HANDLE hMCParamUpmix; + float *pPcm_tmp[MC_PARAMUPMIX_COMBINATIONS]; + float *p_tc[MC_PARAMUPMIX_COMBINATIONS]; + int16_t nchan_internal, ch; + int16_t nSamplesLeftForTD, default_frame; + + hMCParamUpmix = st_ivas->hMCParamUpmix; + assert( hMCParamUpmix ); + + push_wmops( "ivas_param_upmix_dec_decorr_subframes" ); + + /* TD decorrelator */ + default_frame = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); + nSamplesLeftForTD = nSamplesForRendering; + nchan_internal = MC_PARAMUPMIX_COMBINATIONS; + + for ( ch = 0; ch < nchan_internal; ch++ ) + { + pPcm_tmp[ch] = st_ivas->hTcBuffer->tc[ch + 8]; + p_tc[ch] = st_ivas->hTcBuffer->tc[ch + 4]; + } + + while ( nSamplesLeftForTD ) + { + int16_t nSamplesToDecorr = min( nSamplesLeftForTD, default_frame ); + + paramupmix_td_decorr_process_jbm( hMCParamUpmix->hTdDecorr, p_tc, pPcm_tmp, nSamplesToDecorr ); + + for ( ch = 0; ch < nchan_internal; ch++ ) + { + p_tc[ch] += nSamplesToDecorr; + } + + nSamplesLeftForTD -= nSamplesToDecorr; + } + + pop_wmops(); + return; +} + + +/*****************************************************************************************/ +/* local functions */ +/*****************************************************************************************/ + +static void ps_pred_process( + MC_PARAMUPMIX_DEC_HANDLE hMCParamUpmix, + float qmf_mod_re[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* in/out */ + float qmf_mod_im[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], + float qmf_side_re[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* in/out */ + float qmf_side_im[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], + const int16_t ch ) +{ + float vmre, vmim, vsre, vsim; + int16_t iqmf, ipar, ismp, iismp; + float alpha_smp, dalpha, beta_smp, dbeta; + float *alpha1, *alpha2; + float *beta1, *beta2; + float *alpha_prev = hMCParamUpmix->alpha_prev[ch]; + float *beta_prev = hMCParamUpmix->beta_prev[ch]; + + const int16_t qmf_to_par_band[] = { + 0, 1, 2, 3, 4, 5, 5, 6, 6, 7, + 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, + 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11 + }; + + for ( iqmf = 0; iqmf < CLDFB_NO_CHANNELS_MAX; iqmf++ ) + { + /* For changing no of parameter bands (ipar1 != ipar2), TIGGER_FRAMING assumed */ + ipar = qmf_to_par_band[iqmf]; + alpha1 = alpha_prev; + beta1 = beta_prev; + + ismp = 0; + alpha2 = hMCParamUpmix->alphas[ch]; + beta2 = hMCParamUpmix->betas[ch]; + alpha_smp = alpha1[ipar]; + beta_smp = beta1[ipar]; + dalpha = ( alpha2[ipar] - alpha1[ipar] ) / CLDFB_NO_COL_MAX; + dbeta = ( beta2[ipar] - beta1[ipar] ) / CLDFB_NO_COL_MAX; + + for ( iismp = 0; iismp < CLDFB_NO_COL_MAX; iismp++ ) + { + alpha_smp += dalpha; + beta_smp += dbeta; + + vmre = qmf_mod_re[ismp][iqmf]; + vmim = qmf_mod_im[ismp][iqmf]; + vsre = qmf_side_re[ismp][iqmf]; + vsim = qmf_side_im[ismp][iqmf]; + + qmf_side_re[ismp][iqmf] = alpha_smp * vmre + beta_smp * vsre; + qmf_side_im[ismp][iqmf] = alpha_smp * vmim + beta_smp * vsim; + + ismp++; + } + + alpha1 = alpha2; + beta1 = beta2; + } + + return; +} + +static void ps_pred_process_sf( + MC_PARAMUPMIX_DEC_HANDLE hMCParamUpmix, + DECODER_TC_BUFFER_HANDLE hTcBuffer, + float qmf_mod_re[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* in/out */ + float qmf_mod_im[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + float qmf_side_re[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* in/out */ + float qmf_side_im[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + float *param_interpol, + const int16_t ch, + const int16_t slots_rendered ) +{ + float vmre, vmim, vsre, vsim; + int16_t iqmf, ipar, ismp, iismp; + float alpha_smp, beta_smp; + float *alpha1, *alpha2; + float *beta1, *beta2; + float *alpha_prev = hMCParamUpmix->alpha_prev[ch]; + float *beta_prev = hMCParamUpmix->beta_prev[ch]; + float *alpha_sf = hMCParamUpmix->alpha_sf[ch]; + float *beta_sf = hMCParamUpmix->beta_sf[ch]; + float dalpha, dbeta, ifac; + float alpha_start[IVAS_MAX_NUM_BANDS], beta_start[IVAS_MAX_NUM_BANDS]; + + const int16_t qmf_to_par_band[] = { + 0, 1, 2, 3, 4, 5, 5, 6, 6, 7, + 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, + 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11 + }; + + mvr2r( alpha_sf, alpha_start, IVAS_MAX_NUM_BANDS ); + mvr2r( beta_sf, beta_start, IVAS_MAX_NUM_BANDS ); + for ( iqmf = 0; iqmf < CLDFB_NO_CHANNELS_MAX; iqmf++ ) + { + ipar = qmf_to_par_band[iqmf]; + alpha1 = alpha_prev; + beta1 = beta_prev; + + ismp = 0; + alpha2 = hMCParamUpmix->alphas[ch]; + beta2 = hMCParamUpmix->betas[ch]; + alpha_smp = alpha_start[ipar]; + beta_smp = beta_start[ipar]; + + for ( iismp = 0; iismp < hTcBuffer->subframe_nbslots[hTcBuffer->subframes_rendered]; iismp++ ) + { + if ( ( slots_rendered == 0 ) && ( iismp == 0 ) ) + { + ifac = param_interpol[iismp]; + } + else + { + ifac = param_interpol[iismp] - param_interpol[iismp - 1]; + } + dalpha = ( alpha2[ipar] - alpha1[ipar] ) * ifac; + dbeta = ( beta2[ipar] - beta1[ipar] ) * ifac; + + alpha_smp += dalpha; + beta_smp += dbeta; + + vmre = qmf_mod_re[ismp][iqmf]; + vmim = qmf_mod_im[ismp][iqmf]; + vsre = qmf_side_re[ismp][iqmf]; + vsim = qmf_side_im[ismp][iqmf]; + + qmf_side_re[ismp][iqmf] = alpha_smp * vmre + beta_smp * vsre; + qmf_side_im[ismp][iqmf] = alpha_smp * vmim + beta_smp * vsim; + + ismp++; + } + alpha_sf[ipar] = alpha_smp; + beta_sf[ipar] = beta_smp; + } + + return; +} + + +static void ivas_mc_paramupmix_dec_sf( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + float *output_f[MAX_OUTPUT_CHANNELS] /* i/o: synthesized core-coder transport channels */ +) +{ + int16_t i, ch, slot_idx, k; + float *pPcm_temp[MC_PARAMUPMIX_COMBINATIONS * 2]; /* decorrelated and undecorrelated*/ + /*CLDFB*/ + float Cldfb_RealBuffer[MC_PARAMUPMIX_MAX_TRANSPORT_CHANS][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + float Cldfb_ImagBuffer[MC_PARAMUPMIX_MAX_TRANSPORT_CHANS][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + int16_t noparamupmix_delay, n_samples_rendered; + MC_PARAMUPMIX_DEC_HANDLE hMCParamUpmix; + int16_t subframeIdx, idx_in, maxBand; + float Cldfb_RealBuffer_subfr[MAX_INTERN_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; + float Cldfb_ImagBuffer_subfr[MAX_INTERN_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; + float Cldfb_RealBuffer_Binaural[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; + float Cldfb_ImagBuffer_Binaural[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; + + hMCParamUpmix = st_ivas->hMCParamUpmix; + assert( hMCParamUpmix ); + push_wmops( "ivas_mc_paramupmix_dec_sf" ); + + for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ ) + { + pPcm_temp[2 * i] = output_f[i + 4]; /* un-decorrelated */ + pPcm_temp[2 * i + 1] = output_f[i + 8]; /* decorrelated */ + } + + /* CLDFB Analysis*/ + for ( ch = 0; ch < MC_PARAMUPMIX_COMBINATIONS * 2; ch++ ) + { + /* slot loop for gathering the input data */ + for ( slot_idx = 0; slot_idx < st_ivas->hTcBuffer->subframe_nbslots[st_ivas->hTcBuffer->subframes_rendered]; slot_idx++ ) + { + cldfbAnalysis_ts( &( pPcm_temp[ch][hMCParamUpmix->num_freq_bands * slot_idx] ), Cldfb_RealBuffer[ch][slot_idx], Cldfb_ImagBuffer[ch][slot_idx], hMCParamUpmix->num_freq_bands, st_ivas->cldfbAnaDec[ch] ); + } + } + for ( ch = 0; ch < MC_PARAMUPMIX_COMBINATIONS; ch++ ) + { + ps_pred_process_sf( hMCParamUpmix, + st_ivas->hTcBuffer, + Cldfb_RealBuffer[2 * ch], /* in/out */ + Cldfb_ImagBuffer[2 * ch], + Cldfb_RealBuffer[2 * ch + 1], /* in/out decorr */ + Cldfb_ImagBuffer[2 * ch + 1], + &hMCParamUpmix->param_interpolator[st_ivas->hTcBuffer->slots_rendered], + ch, + st_ivas->hTcBuffer->slots_rendered ); + + /*-- m, s -> l, r ----------------------------*/ + for ( slot_idx = 0; slot_idx < st_ivas->hTcBuffer->subframe_nbslots[st_ivas->hTcBuffer->subframes_rendered]; slot_idx++ ) + { + for ( k = 0; k < CLDFB_NO_CHANNELS_MAX; k++ ) + { + float qlre = Cldfb_RealBuffer[2 * ch][slot_idx][k]; + float qlim = Cldfb_ImagBuffer[2 * ch][slot_idx][k]; + float qrre = Cldfb_RealBuffer[2 * ch + 1][slot_idx][k]; + float qrim = Cldfb_ImagBuffer[2 * ch + 1][slot_idx][k]; + + Cldfb_RealBuffer[2 * ch][slot_idx][k] = qlre + qrre; + Cldfb_ImagBuffer[2 * ch][slot_idx][k] = qlim + qrim; + Cldfb_RealBuffer[2 * ch + 1][slot_idx][k] = qlre - qrre; + Cldfb_ImagBuffer[2 * ch + 1][slot_idx][k] = qlim - qrim; + } + } + } + + if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) + { + maxBand = (int16_t) ( ( CLDFB_NO_CHANNELS_MAX * st_ivas->hDecoderConfig->output_Fs ) / 48000 ); + subframeIdx = st_ivas->hTcBuffer->subframes_rendered; + /* fastconv binaural rendering and CLDFB synthesis */ + /* cldfb analysis of non-coupled, non-LFE channels */ + idx_in = 0; + for ( ch = 0; ch < MC_PARAMUPMIX_MAX_INPUT_CHANS - 2 * MC_PARAMUPMIX_COMBINATIONS; ch++ ) + { + if ( st_ivas->hIntSetup.index_lfe[0] != ch ) + { + pPcm_temp[ch] = output_f[ch]; + /* slot loop for gathering the input data */ + for ( slot_idx = 0; slot_idx < st_ivas->hTcBuffer->subframe_nbslots[st_ivas->hTcBuffer->subframes_rendered]; slot_idx++ ) + { + cldfbAnalysis_ts( &( pPcm_temp[ch][hMCParamUpmix->num_freq_bands * slot_idx] ), + Cldfb_RealBuffer_subfr[idx_in][slot_idx], + Cldfb_ImagBuffer_subfr[idx_in][slot_idx], + maxBand, st_ivas->cldfbAnaDec[2 * MC_PARAMUPMIX_COMBINATIONS + idx_in] ); + } + idx_in++; + } + } + + /* copy and reorder cldfb analysis of coupled channels */ + for ( ch = 0; ch < MAX_PARAM_SPATIAL_SUBFRAMES; ch++ ) + { + for ( slot_idx = 0; slot_idx < MAX_PARAM_SPATIAL_SUBFRAMES; slot_idx++ ) + { + mvr2r( Cldfb_RealBuffer[MC_PARAMUPMIX_CHIDX1[ch]][slot_idx], Cldfb_RealBuffer_subfr[idx_in][slot_idx], CLDFB_NO_CHANNELS_MAX ); + mvr2r( Cldfb_ImagBuffer[MC_PARAMUPMIX_CHIDX1[ch]][slot_idx], Cldfb_ImagBuffer_subfr[idx_in][slot_idx], CLDFB_NO_CHANNELS_MAX ); + mvr2r( Cldfb_RealBuffer[MC_PARAMUPMIX_CHIDX2[ch]][slot_idx], Cldfb_RealBuffer_subfr[idx_in + 1][slot_idx], CLDFB_NO_CHANNELS_MAX ); + mvr2r( Cldfb_ImagBuffer[MC_PARAMUPMIX_CHIDX2[ch]][slot_idx], Cldfb_ImagBuffer_subfr[idx_in + 1][slot_idx], CLDFB_NO_CHANNELS_MAX ); + } + idx_in += 2; + } + + if ( st_ivas->hCombinedOrientationData && st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV ) + { + for ( slot_idx = 0; slot_idx < st_ivas->hTcBuffer->subframe_nbslots[st_ivas->hTcBuffer->subframes_rendered]; slot_idx++ ) + { + ivas_param_mc_mc2sba_cldfb( st_ivas->hTransSetup, hMCParamUpmix->hoa_encoder, slot_idx, Cldfb_RealBuffer_subfr, Cldfb_ImagBuffer_subfr, maxBand, GAIN_LFE ); + } + } + + + /* Implement binaural rendering */ + ivas_binRenderer( st_ivas->hBinRenderer, st_ivas->hCombinedOrientationData, subframeIdx, st_ivas->hTcBuffer->subframe_nbslots[subframeIdx], Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer_subfr, Cldfb_ImagBuffer_subfr ); + + + /* Implement CLDFB synthesis */ + for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + float *RealBuffer[MAX_PARAM_SPATIAL_SUBFRAMES]; + float *ImagBuffer[MAX_PARAM_SPATIAL_SUBFRAMES]; + + for ( slot_idx = 0; slot_idx < st_ivas->hTcBuffer->subframe_nbslots[subframeIdx]; slot_idx++ ) + { + RealBuffer[slot_idx] = Cldfb_RealBuffer_Binaural[ch][slot_idx]; + ImagBuffer[slot_idx] = Cldfb_ImagBuffer_Binaural[ch][slot_idx]; + } + + cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][0] ), maxBand * st_ivas->hTcBuffer->subframe_nbslots[subframeIdx], st_ivas->cldfbSynDec[ch] ); + } + } + else + { + /* boxes = { 0 1 2 3 [4 6] [5 7] [8 10] [9 11] }; */ + pPcm_temp[0] = output_f[4]; + pPcm_temp[1] = output_f[6]; + pPcm_temp[2] = output_f[5]; + pPcm_temp[3] = output_f[7]; + pPcm_temp[4] = output_f[8]; + pPcm_temp[5] = output_f[10]; + pPcm_temp[6] = output_f[9]; + pPcm_temp[7] = output_f[11]; + + /* CLDFB synthesis */ + for ( ch = 0; ch < MC_PARAMUPMIX_COMBINATIONS * 2; ch++ ) + { + for ( slot_idx = 0; slot_idx < st_ivas->hTcBuffer->subframe_nbslots[st_ivas->hTcBuffer->subframes_rendered]; slot_idx++ ) + { + float *ptr_im[1], *ptr_re[1]; + ptr_re[0] = Cldfb_RealBuffer[ch][slot_idx]; + ptr_im[0] = Cldfb_ImagBuffer[ch][slot_idx]; + + cldfbSynthesis( ptr_re, ptr_im, &( pPcm_temp[ch][hMCParamUpmix->num_freq_bands * slot_idx] ), + hMCParamUpmix->num_freq_bands, st_ivas->cldfbSynDec[ch] ); + } + } + /* adjust delay of other channels */ + noparamupmix_delay = NS2SA( st_ivas->hDecoderConfig->output_Fs, IVAS_FB_DEC_DELAY_NS ); + n_samples_rendered = st_ivas->hTcBuffer->subframe_nbslots[st_ivas->hTcBuffer->subframes_rendered] * hMCParamUpmix->num_freq_bands; + if ( n_samples_rendered > noparamupmix_delay ) + { + for ( ch = 0; ch < MC_PARAMUPMIX_COMBINATIONS; ch++ ) + { + float tmp_buf[L_SUBFRAME5MS_48k]; + mvr2r( &output_f[ch][n_samples_rendered - noparamupmix_delay], tmp_buf, noparamupmix_delay ); + mvr2r( output_f[ch], &output_f[ch][noparamupmix_delay], n_samples_rendered - noparamupmix_delay ); + mvr2r( hMCParamUpmix->pcm_delay[ch], output_f[ch], noparamupmix_delay ); + mvr2r( tmp_buf, hMCParamUpmix->pcm_delay[ch], noparamupmix_delay ); + } + } + else + { + for ( ch = 0; ch < MC_PARAMUPMIX_COMBINATIONS; ch++ ) + { + float tmp_buf[L_SUBFRAME5MS_48k]; + mvr2r( &output_f[ch][0], tmp_buf, n_samples_rendered ); + mvr2r( hMCParamUpmix->pcm_delay[ch], output_f[ch], n_samples_rendered ); + mvr2r( &hMCParamUpmix->pcm_delay[ch][n_samples_rendered], &hMCParamUpmix->pcm_delay[ch][0], noparamupmix_delay - n_samples_rendered ); + mvr2r( tmp_buf, &hMCParamUpmix->pcm_delay[ch][noparamupmix_delay - n_samples_rendered], n_samples_rendered ); + } + } + } + + st_ivas->hTcBuffer->slots_rendered += st_ivas->hTcBuffer->subframe_nbslots[st_ivas->hTcBuffer->subframes_rendered]; + st_ivas->hTcBuffer->subframes_rendered++; + + pop_wmops(); + return; +} + + +static void paramupmix_td_decorr_process( + ivas_td_decorr_state_t *hTdDecorr[], /* i/o: SPAR Covar. decoder handle */ + float *pcm_in[], /* i : input audio channels */ + float **pp_out_pcm, /* o : output audio channels */ + const int16_t output_frame /* i : output frame length */ +) +{ + int16_t j, k; + int16_t offset; + float in_duck_gain[L_FRAME48k], out_duck_gain[L_FRAME48k]; + + offset = (int16_t) ( output_frame * FRAMES_PER_SEC * IVAS_DECORR_PARM_LOOKAHEAD_TAU ); + + /* Look-ahead delay */ + for ( k = 0; k < MC_PARAMUPMIX_COMBINATIONS; k++ ) + { + mvr2r( pcm_in[k], pp_out_pcm[k], output_frame ); + delay_signal( pp_out_pcm[k], output_frame, hTdDecorr[k]->look_ahead_buf, offset ); + + /* In ducking gains */ + if ( hTdDecorr[k]->ducking_flag ) + { + ivas_td_decorr_get_ducking_gains( hTdDecorr[k]->pTrans_det, pcm_in[k], in_duck_gain, out_duck_gain, output_frame, 0 ); + + for ( j = 0; j < output_frame; j++ ) + { + pp_out_pcm[k][j] = pp_out_pcm[k][j] * in_duck_gain[j]; + } + } + + /* All pass delay section */ + ivas_td_decorr_APD_iir_filter( &hTdDecorr[k]->APD_filt_state[0], pp_out_pcm[k], hTdDecorr[k]->num_apd_sections, output_frame ); + + /* Out ducking gains */ + if ( hTdDecorr[k]->ducking_flag ) + { + for ( j = 0; j < output_frame; j++ ) + { + pp_out_pcm[k][j] = pp_out_pcm[k][j] * out_duck_gain[j]; + } + } + } + + return; +} + + +static int16_t huff_read( + Decoder_State *st, + const int16_t ( *ht )[2] ) +{ + int16_t node = 0; + uint16_t next_bit = 0; + + do + { + next_bit = st->bit_stream[st->next_bit_pos]; + st->next_bit_pos++; + node = ht[node][next_bit]; + } while ( node > 0 ); + + return -( node + 1 ); +} + + +static void huffman_decode( + Decoder_State *st, + const int16_t nv, + const int16_t ivStart, + const PAR_TYPE parType, + const QUANT_TYPE quant_type, + const int16_t bNoDt, + int32_t *vq ) +{ + const int16_t( *huff_node_table )[2]; + int16_t iv, bdt, nquant, offset; + + nquant = 0; + switch ( parType ) + { + case ALPHA: + nquant = ivas_mc_paramupmix_alpha_quant_table[quant_type].nquant; + break; + case BETA: + nquant = ivas_mc_paramupmix_beta_quant_table[quant_type][0].nquant; + break; + default: + assert( 0 ); + } + + offset = nquant - 1; /* range of df/dt [-(nquant - 1), nquant - 1] */ + + if ( bNoDt ) + { + bdt = 0; + } + else + { + bdt = st->bit_stream[st->next_bit_pos]; + st->next_bit_pos++; + } + + if ( bdt ) + { /* Get dt */ + switch ( parType ) + { + case ALPHA: + huff_node_table = ivas_mc_paramupmix_huff_nodes_dt.alpha[quant_type]; + break; + case BETA: + huff_node_table = ivas_mc_paramupmix_huff_nodes_dt.beta[quant_type]; + break; + default: + huff_node_table = NULL; + assert( 0 ); + } + for ( iv = ivStart; iv < nv; iv++ ) + { + vq[iv] = huff_read( st, huff_node_table ) + vq[iv] - offset; + } + } + else /* Get f0, df */ + { + switch ( parType ) + { + case ALPHA: + huff_node_table = ivas_mc_paramupmix_huff_nodes_df0.alpha[quant_type]; + break; + case BETA: + huff_node_table = ivas_mc_paramupmix_huff_nodes_df0.beta[quant_type]; + break; + default: + huff_node_table = NULL; + assert( 0 ); + } + vq[ivStart] = huff_read( st, huff_node_table ); + + switch ( parType ) + { + case ALPHA: + huff_node_table = ivas_mc_paramupmix_huff_nodes_df.alpha[quant_type]; + break; + case BETA: + huff_node_table = ivas_mc_paramupmix_huff_nodes_df.beta[quant_type]; + break; + default: + assert( 0 ); + } + + for ( iv = ivStart + 1; iv < nv; iv++ ) + { + vq[iv] = huff_read( st, huff_node_table ) + vq[iv - 1] - offset; + } + } + + return; +} + + +static void dequant_alpha( + const int16_t nv, + const int16_t ivStart, + const QUANT_TYPE quant_type, + int32_t *vq, + float *v ) +{ + int16_t iv; + const ACPL_QUANT_TABLE *quant_table = &ivas_mc_paramupmix_alpha_quant_table[quant_type]; + + for ( iv = 0; iv < ivStart; iv++ ) + { + v[iv] = 0; + } + + for ( iv = ivStart; iv < nv; iv++ ) + { + v[iv] = quant_table->data[vq[iv]]; + } + + return; +} + + +static void dequant_beta( + const int16_t nv, + const int16_t ivStart, + const QUANT_TYPE quant_type, + int32_t *aq, + int32_t *bq, + float *beta ) +{ + int16_t iv; + const ACPL_QUANT_TABLE *quant_table; + + for ( iv = 0; iv < ivStart; iv++ ) + { + beta[iv] = 0; + } + + for ( iv = ivStart; iv < nv; iv++ ) + { + quant_table = &ivas_mc_paramupmix_beta_quant_table[quant_type][ivas_param_upmx_mx_qmap[quant_type][aq[iv]]]; + beta[iv] = quant_table->data[bq[iv]]; + } + + return; +} + + +static void get_ec_data( + Decoder_State *st, + const PAR_TYPE parType, + const QUANT_TYPE quant_type, + const int16_t nParBand, + const int16_t parBandStart, + int32_t *parQ, + int32_t *alphaQEnv, + float ab[IVAS_MAX_NUM_BANDS] ) +{ + huffman_decode( st, nParBand, parBandStart, parType, quant_type, 0, parQ ); + + if ( parType == ALPHA ) + { + dequant_alpha( nParBand, parBandStart, quant_type, parQ, ab ); + mvl2l( parQ, alphaQEnv, (int16_t) nParBand ); + } + else + { + dequant_beta( nParBand, parBandStart, quant_type, alphaQEnv, parQ, ab ); + } + + return; +} diff --git a/lib_dec/ivas_mcmasa_dec.c b/lib_dec/ivas_mcmasa_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..832572dede7fd7add4f7fe35e3a157b9a19ee217 --- /dev/null +++ b/lib_dec/ivas_mcmasa_dec.c @@ -0,0 +1,97 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include "options.h" +#include +#include "ivas_cnst.h" +#include "ivas_prot.h" +#include "ivas_prot_rend.h" +#include "prot.h" +#include "wmc_auto.h" + + +/*------------------------------------------------------------------------- + * ivas_mcmasa_dec_reconfig() + * + * Reconfigure McMASA decoder + *------------------------------------------------------------------------*/ + +ivas_error ivas_mcmasa_dec_reconfig( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +) +{ + ivas_error error; + int32_t ivas_total_brate; + + ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; + + /* close the old MASA instance */ + ivas_masa_dec_close( &( st_ivas->hMasa ) ); + + /* get new McMASA settings */ + ivas_mcmasa_setNumTransportChannels( &( st_ivas->nchan_transport ), &( st_ivas->element_mode_init ), ivas_total_brate ); + ivas_mcmasa_set_separate_channel_mode( &( st_ivas->hOutSetup.separateChannelEnabled ), &( st_ivas->hOutSetup.separateChannelIndex ), ivas_total_brate ); + + /* transport channel settings may affect renderer */ + ivas_renderer_select( st_ivas ); + + /* renderer change may affect internal config */ + ivas_output_init( &( st_ivas->hIntSetup ), st_ivas->intern_config ); + ivas_mcmasa_set_separate_channel_mode( &( st_ivas->hIntSetup.separateChannelEnabled ), &( st_ivas->hIntSetup.separateChannelIndex ), ivas_total_brate ); + + if ( ( error = ivas_masa_dec_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + + st_ivas->sba_dirac_stereo_flag = ivas_get_sba_dirac_stereo_flag( st_ivas ); + + if ( st_ivas->renderer_type != RENDERER_DISABLE && st_ivas->renderer_type != RENDERER_MCMASA_MONO_STEREO ) + { + if ( st_ivas->hDirAC == NULL ) + { + if ( ( error = ivas_dirac_dec_config( st_ivas, DIRAC_OPEN ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + if ( ( error = ivas_dirac_dec_config( st_ivas, DIRAC_RECONFIGURE ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + + return error; +} diff --git a/lib_dec/ivas_mct_core_dec.c b/lib_dec/ivas_mct_core_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..7364813ff97081aa3ae925d6db3d348803f4b7db --- /dev/null +++ b/lib_dec/ivas_mct_core_dec.c @@ -0,0 +1,270 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include "options.h" +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" +#include "cnst.h" +#include "basop_proto_func.h" +#include "stat_com.h" +#include "ivas_prot.h" +#include "ivas_stat_dec.h" +#include "ivas_stat_com.h" + + +/*-----------------------------------------------------------------* + * ivas_mct_side_bits() * + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * + * Read mct related side bits and distribute bits per channel * + *-----------------------------------------------------------------*/ + +void ivas_mct_side_bits( + MCT_DEC_HANDLE hMCT, /* i/o: MCT decoder structure */ + CPE_DEC_HANDLE hCPE[MCT_MAX_BLOCKS], /* i/o: CPE decoder structure */ + const int16_t nCPE, /* i : number of CPEs */ + Decoder_State *st0, /* i : decoder handle for Bstr */ + const int16_t bfi, /* i : BFI flag */ + uint16_t *bitstream, /* o : bitstream indices */ + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + const int16_t nb_bits_metadata /* i : number of metadata bits */ +) +{ + int16_t ch, cpe_id, nChannels, i, k, nSubframes; + int16_t nf_side_bits, availableBits, next_bit_pos, nf_bits; + int16_t chBitRatios[MCT_MAX_CHANNELS]; + Decoder_State *st, *sts[MCT_MAX_CHANNELS]; + + nf_side_bits = 0; + nChannels = hMCT->nchan_out_woLFE; + + /*initializations */ + for ( cpe_id = 0, i = 0; cpe_id < nCPE; cpe_id++ ) + { + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + sts[i] = hCPE[cpe_id]->hCoreCoder[ch]; + i++; + } + } + + /*first read IFG bits */ + if ( !bfi && st0->igf ) + { + for ( ch = 0; ch < nChannels; ch++ ) + { + st = sts[ch]; + if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) + { + continue; + } + + mdct_read_IGF_bits( st, st0 ); + } + } + + /*read MCT data and calculate frame bits per channel */ + for ( ch = 0; ch < (int16_t) ( hMCT->nchan_out_woLFE * 0.5 ); ch++ ) + { + initMdctStereoDecData( hMCT->hBlockData[ch]->hStereoMdct, st0->igf, st0->hIGFDec->igfData.igfInfo.grid, hCPE[0]->element_brate, st0->bwidth ); + } + + if ( !bfi ) + { + availableBits = 0; + + ivas_mct_dec_mct( hMCT, sts, nChannels ); + + /*read channel bitrate ratios from bitstream*/ + for ( ch = 0; ch < nChannels; ch++ ) + { + st = sts[ch]; + + if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) + { + chBitRatios[ch] = 0; + st->bits_frame_channel = 0; + continue; + } + chBitRatios[ch] = get_next_indice( sts[0], NBBITS_MCT_RATIO ); + + nSubframes = ( st->core == TCX_10_CORE ) ? NB_DIV : 1; + + for ( k = 0; k < nSubframes; k++ ) + { + nf_side_bits += ( NBITS_TCX_GAIN + NOISE_FILL_RANGES * NBITS_NOISE_FILL_LEVEL ); + } + } + + availableBits = (int16_t) ( ( ivas_total_brate / FRAMES_PER_SEC ) - sts[0]->next_bit_pos - nf_side_bits ); + availableBits -= nb_bits_metadata; + + splitAvailableBitsMCT( (void **) sts, availableBits, chBitRatios, DEC, nChannels ); + + next_bit_pos = sts[0]->next_bit_pos; + for ( ch = 1; ch < nChannels; ch++ ) + { + nf_bits = ( sts[ch - 1]->core == TCX_20_CORE ? 1 : NB_DIV ) * ( NBITS_TCX_GAIN + NOISE_FILL_RANGES * NBITS_NOISE_FILL_LEVEL ); + + if ( chBitRatios[ch - 1] == 0 ) /* indicates LFE with no content */ + { + nf_bits = 0; + } + next_bit_pos += sts[ch - 1]->bits_frame_channel + nf_bits; + sts[ch]->bit_stream = bitstream + next_bit_pos; + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * ivas_mct_core_dec() + * + * IVAS MCT core decoder + *--------------------------------------------------------------------*/ + +void ivas_mct_core_dec( + MCT_DEC_HANDLE hMCT, /* i/o: MCT decoder structure */ + CPE_DEC_HANDLE hCPE[MCT_MAX_BLOCKS], /* i/o: CPE decoder structure */ + const int16_t nCPE, /* i : number of CPEs */ + float *signal_out[] /* o : synthesis @internal_FS */ +) +{ + int16_t i, k, ch, cpe_id, nChannels; + Decoder_State *st, *sts[MCT_MAX_CHANNELS]; + float *x[MCT_MAX_CHANNELS][NB_DIV]; + int16_t bfi; + /* Framing */ + int16_t L_frame, L_frameTCX, nSubframes; + /* TCX */ + int16_t tcx_offset; + int16_t tcx_offsetFB; + int16_t left_rect; + int16_t L_spec; +#ifdef DEBUG_MCT + float nrg[MCT_MAX_CHANNELS]; +#endif + + push_wmops( "mct_decoding" ); + + /*--------------------------------------------------------------------------------* + * Initializations + *--------------------------------------------------------------------------------*/ + + nChannels = hMCT->nchan_out_woLFE; + + /*initializations */ + for ( cpe_id = 0, i = 0; cpe_id < nCPE; cpe_id++ ) + { + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + sts[i] = hCPE[cpe_id]->hCoreCoder[ch]; + i++; + } + } + + for ( ch = 0, i = 0; ch < nChannels; ch++ ) + { + if ( sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) + { + continue; + } + i++; + } + + bfi = sts[0]->bfi; + + for ( ch = 0; ch < nChannels; ch++ ) + { + /* Initialization or re-configuration of Stereo TCX */ + sts[ch]->enablePlcWaveadjust = 0; + x[ch][0] = signal_out[ch]; + x[ch][1] = signal_out[ch] + ( L_FRAME48k / 2 ); + } + + /*--------------------------------------------------------------------------------* + * IGF decoding + *--------------------------------------------------------------------------------*/ + + if ( sts[0]->igf ) + { + if ( !hMCT->currBlockDataCnt ) + { + for ( ch = 0; ch < nChannels; ch++ ) + { + st = sts[ch]; + + if ( sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) /*indicates LFE */ + { + continue; + } + + if ( bfi && st->core == ACELP_CORE ) /*no igf processing needed*/ + { + continue; + } + nSubframes = ( st->core == TCX_10_CORE ) ? NB_DIV : 1; + + for ( k = 0; k < nSubframes; k++ ) + { + L_spec = st->hTcxCfg->tcx_coded_lines / nSubframes; + + init_tcx_info( st, st->L_frame / nSubframes, st->hTcxDec->L_frameTCX / nSubframes, k, bfi, &tcx_offset, &tcx_offsetFB, &L_frame, &L_frameTCX, &left_rect, &L_spec ); + + /* mono or dual mono IGF decoding */ + decoder_tcx_IGF_mono( st, x[ch][k], L_frame, left_rect, bfi, k ); + } + } + } + else + { + mctStereoIGF_dec( hMCT, sts, x, bfi ); + } + } + + if ( !bfi ) + { + /*--------------------------------------------------------------------------------* + * MCT processing + *--------------------------------------------------------------------------------*/ + + apply_MCT_dec( hMCT, sts, x ); + } + + pop_wmops(); + + return; +} diff --git a/lib_dec/ivas_mct_dec.c b/lib_dec/ivas_mct_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..1f3809b1d21852bc5c95ea526330a550912b1ee0 --- /dev/null +++ b/lib_dec/ivas_mct_dec.c @@ -0,0 +1,1330 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include "options.h" +#include +#include "cnst.h" +#include "ivas_cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_prot_rend.h" +#include "ivas_rom_com.h" +#include "wmc_auto.h" + + +/*-----------------------------------------------------------------------* + * Local function prototypes + *-----------------------------------------------------------------------*/ + +static ivas_error ivas_mc_dec_reconfig( Decoder_Struct *st_ivas, uint16_t *nSamplesRendered, int16_t *data ); + + +/*--------------------------------------------------------------------------* + * ivas_mct_dec() + * + * Multi-channel Coding Tool (MCT) decoding routine + *--------------------------------------------------------------------------*/ + +ivas_error ivas_mct_dec( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float *output[], /* o : output synthesis signal */ + const int16_t output_frame, /* i : output frame length per channel */ + const int16_t nb_bits_metadata /* i : number of metadata bits */ +) +{ + int16_t n, nCPE, cpe_id; + MCT_DEC_HANDLE hMCT; + CPE_DEC_HANDLE hCPE; + float *x[CPE_CHANNELS][NB_DIV]; + int16_t param[MCT_MAX_BLOCKS][CPE_CHANNELS][DEC_NPRM_DIV * NB_DIV]; + int16_t param_lpc[MCT_MAX_BLOCKS][CPE_CHANNELS][NPRM_LPC_NEW]; + int16_t p_param[MCT_MAX_BLOCKS][CPE_CHANNELS][NB_DIV]; + int16_t nTnsBitsTCX10[MCT_MAX_BLOCKS][CPE_CHANNELS][NB_DIV]; + float Aq[MCT_MAX_BLOCKS][CPE_CHANNELS][( NB_SUBFR16k + 1 ) * ( M + 1 )]; + int16_t fUseTns[MCT_MAX_BLOCKS][CPE_CHANNELS][NB_DIV]; + STnsData tnsData[MCT_MAX_BLOCKS][CPE_CHANNELS][NB_DIV]; + Decoder_State **sts; + float synth[CPE_CHANNELS][L_FRAME_PLUS]; + float output_lfe_ch[L_FRAME48k]; + int32_t ivas_total_brate; + ivas_error error; + + push_wmops( "ivas_mct_dec" ); + + error = IVAS_ERR_OK; + nCPE = st_ivas->nCPE; + hMCT = st_ivas->hMCT; + + ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; + + if ( st_ivas->ivas_format == MC_FORMAT && ( st_ivas->mc_mode == MC_MODE_MCT || st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) ) + { + /* save LFE channel */ + mvr2r( output[LFE_CHANNEL], output_lfe_ch, output_frame ); + } + + if ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCT && !st_ivas->bfi ) + { + /* get the number of channels from the signalled MC LS setup */ + n = ivas_mc_ls_setup_get_num_channels( ivas_mc_map_output_config_to_mc_ls_setup( st_ivas->transport_config ) ); + + if ( n != st_ivas->nchan_transport ) + { + /* IVAS_fmToDo: more work needed for switching the number of transport channels */ + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error: wrong number of transport channels signalled in MC format!" ); + } + } + + for ( cpe_id = 0; cpe_id < nCPE; cpe_id++ ) + { + /*initialize param_lpc buffer*/ + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + set_s( param_lpc[cpe_id][n], 0, NPRM_LPC_NEW ); + } + + if ( ( error = ivas_cpe_dec( st_ivas, cpe_id, output, output_frame, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( cpe_id == 0 ) + { + st_ivas->hCPE[0]->hCoreCoder[0]->total_brate = ivas_total_brate; /* set high enough to read the whole side-info; total_brate is rewritten later in ivas_mdct_core_invQ() */ + } + + if ( !st_ivas->bfi ) + { + ivas_mdct_dec_side_bits_frame_channel( st_ivas->hCPE[cpe_id], param_lpc[cpe_id], p_param[cpe_id], st_ivas->hCPE[0]->hCoreCoder[0], nTnsBitsTCX10[cpe_id], param[cpe_id], 1, + ( ( cpe_id + 1 ) * CPE_CHANNELS > hMCT->nchan_out_woLFE ) ); + + st_ivas->BER_detect |= st_ivas->hCPE[cpe_id]->hCoreCoder[0]->BER_detect; + st_ivas->BER_detect |= st_ivas->hCPE[cpe_id]->hCoreCoder[1]->BER_detect; + } + } + + /* MCT side bits decoder */ + ivas_mct_side_bits( hMCT, st_ivas->hCPE, nCPE, st_ivas->hCPE[0]->hCoreCoder[0], st_ivas->bfi, st_ivas->hCPE[0]->hCoreCoder[0]->bit_stream, ivas_total_brate, nb_bits_metadata ); + + for ( cpe_id = 0; cpe_id < nCPE; cpe_id++ ) + { + st_ivas->hCPE[cpe_id]->hCoreCoder[0]->BER_detect |= st_ivas->BER_detect; + st_ivas->hCPE[cpe_id]->hCoreCoder[1]->BER_detect |= st_ivas->BER_detect; + + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + x[n][0] = output[n + cpe_id * CPE_CHANNELS]; + x[n][1] = output[n + cpe_id * CPE_CHANNELS] + ( L_FRAME48k / 2 ); + set_zero( x[n][0], L_FRAME48k / 2 ); + set_zero( x[n][1], L_FRAME48k / 2 ); + } + + ivas_mdct_core_invQ( st_ivas->hCPE[cpe_id], nTnsBitsTCX10[cpe_id], p_param[cpe_id], param_lpc[cpe_id], param[cpe_id], + fUseTns[cpe_id], tnsData[cpe_id], x, x, Aq[cpe_id], NULL, 1 ); + + st_ivas->BER_detect |= st_ivas->hCPE[cpe_id]->hCoreCoder[0]->BER_detect; + st_ivas->BER_detect |= st_ivas->hCPE[cpe_id]->hCoreCoder[1]->BER_detect; + } + + /* MCT core decoder */ + ivas_mct_core_dec( hMCT, st_ivas->hCPE, nCPE, output ); + + /* for sba to stereo output disable any further processing for TCs > 2 as it is not needed*/ + if ( st_ivas->sba_dirac_stereo_flag && st_ivas->ivas_format != SBA_ISM_FORMAT ) + { + for ( cpe_id = 1; cpe_id < nCPE; cpe_id++ ) + { + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + st_ivas->hCPE[cpe_id]->hCoreCoder[n]->mct_chan_mode = MCT_CHAN_MODE_IGNORE; + } + } + } + + /* MCT reconstruction and CoreCoder updates */ + for ( cpe_id = 0; cpe_id < nCPE; cpe_id++ ) + { + hCPE = st_ivas->hCPE[cpe_id]; + + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + x[n][0] = output[n + cpe_id * CPE_CHANNELS]; + x[n][1] = output[n + cpe_id * CPE_CHANNELS] + ( L_FRAME48k / 2 ); + } + + ivas_mdct_core_tns_ns( hCPE, fUseTns[cpe_id], tnsData[cpe_id], x, Aq[cpe_id], 1 ); + } + + if ( st_ivas->renderer_type == RENDERER_MC ) + { + /* Equalization in MDCT Domain */ + ivas_ls_setup_conversion_process_mdct( st_ivas, output ); + } + + else if ( st_ivas->renderer_type == RENDERER_MC_PARAMMC && ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_MONO || st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_STEREO ) ) + { + float *x_all[MAX_CICP_CHANNELS][NB_DIV]; + + for ( cpe_id = 0; cpe_id < nCPE; cpe_id++ ) + { + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + x_all[n + cpe_id * CPE_CHANNELS][0] = output[n + cpe_id * CPE_CHANNELS]; + x_all[n + cpe_id * CPE_CHANNELS][1] = output[n + cpe_id * CPE_CHANNELS] + ( L_FRAME48k / 2 ); + } + } + + ivas_ls_setup_conversion_process_mdct_param_mc( st_ivas, x_all ); + } + + for ( cpe_id = 0; cpe_id < nCPE; cpe_id++ ) + { + hCPE = st_ivas->hCPE[cpe_id]; + sts = hCPE->hCoreCoder; + + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + x[n][0] = output[n + cpe_id * CPE_CHANNELS]; + x[n][1] = output[n + cpe_id * CPE_CHANNELS] + ( L_FRAME48k / 2 ); + } + + ivas_mdct_core_reconstruct( hCPE, x, synth, fUseTns[cpe_id], 1 ); + + /*----------------------------------------------------------------* + * CoreCoder Post-processing and updates + *----------------------------------------------------------------*/ + + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + if ( st_ivas->sba_dirac_stereo_flag && ( st_ivas->ivas_format != SBA_ISM_FORMAT || cpe_id >= nCPE - 2 ) ) + { + ivas_post_proc( NULL, hCPE, n, synth[n], NULL, output_frame, 1 ); + } + + /* Postprocessing for ACELP/MDCT core switching and synchronization */ + if ( ( error = core_switching_post_dec( sts[n], synth[n], output[cpe_id * CPE_CHANNELS + n], hCPE->output_mem[1], st_ivas->ivas_format, 0, output_frame, 0 /*core_switching_flag*/, ( st_ivas->ivas_format != SBA_ISM_FORMAT || cpe_id >= nCPE - 2 ) ? st_ivas->sba_dirac_stereo_flag : 0, -1, hCPE->last_element_mode ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* final output of synthesis signal */ + mvr2r( synth[n], output[cpe_id * CPE_CHANNELS + n], output_frame ); + + /* Save synthesis for HQ FEC */ + save_synthesis_hq_fec( sts[n], output[cpe_id * CPE_CHANNELS + n], output_frame, hCPE ); + + /* CoreCoder common updates */ + updt_dec_common( sts[n], NORMAL_HQ_CORE, -1, output[cpe_id * CPE_CHANNELS + n] ); + + } /* n_channels loop */ + + + /* synthesis synchronization between stereo modes */ + if ( !st_ivas->sba_dirac_stereo_flag || ( st_ivas->ivas_format == SBA_ISM_FORMAT && cpe_id < nCPE - 2 ) ) + { + synchro_synthesis( ivas_total_brate, hCPE, output + cpe_id * CPE_CHANNELS, output_frame, 0 ); + } + + } + + /* move channels after LFE to correct output for multi-channel MCT */ + if ( st_ivas->ivas_format == MC_FORMAT && ( st_ivas->mc_mode == MC_MODE_MCT || st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) ) + { + float tmp[L_FRAME48k]; + + /*save center channel output*/ + mvr2r( output[hMCT->nchan_out_woLFE - 1], tmp, output_frame ); + + for ( n = hMCT->nchan_out_woLFE - 1; n >= LFE_CHANNEL; n-- ) + { + mvr2r( output[n - 1], output[n + 1], output_frame ); + } + mvr2r( tmp, output[LFE_CHANNEL - 1], output_frame ); + + /* save LFE channel */ + mvr2r( output_lfe_ch, output[LFE_CHANNEL], output_frame ); + } + + + pop_wmops(); + return error; +} + + +/*------------------------------------------------------------------------- + * create_mct_dec() + * + * Create, allocate and initialize IVAS decoder MCT handle + *-------------------------------------------------------------------------*/ + +ivas_error create_mct_dec( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +) +{ + MCT_DEC_HANDLE hMCT; + int16_t n; + int32_t cp_bitrate; + int16_t max_blocks; + int16_t cpe_id; + + /*--------------------------------------------------------- --------* + * Allocate MCT handle + *-----------------------------------------------------------------*/ + + if ( ( hMCT = (MCT_DEC_HANDLE) malloc( sizeof( MCT_DEC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for CPE\n" ) ); + } + + /*-----------------------------------------------------------------* + * Allocate MCT BlockData handles + *-----------------------------------------------------------------*/ + + /* Determine active channels */ + if ( ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMMC ) || st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT ) + { + hMCT->nchan_out_woLFE = st_ivas->nchan_transport; + if ( st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + { + hMCT->nchan_out_woLFE += st_ivas->nchan_ism; + } + } + else if ( st_ivas->mc_mode == MC_MODE_MCT ) + { + hMCT->nchan_out_woLFE = st_ivas->nchan_transport - st_ivas->hTransSetup.num_lfe; + } + else if ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) + { + hMCT->nchan_out_woLFE = st_ivas->nchan_transport - st_ivas->hTransSetup.num_lfe; + } + else + { + assert( !"IVAS format currently not supported for MCT" ); + } + + cp_bitrate = st_ivas->hDecoderConfig->ivas_total_brate / hMCT->nchan_out_woLFE * CPE_CHANNELS; + + if ( st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + { + cp_bitrate = st_ivas->hDecoderConfig->ivas_total_brate / st_ivas->nchan_transport * CPE_CHANNELS; + } + + /* indicate LFE for appropriate core-coder channel */ + for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) + { + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + st_ivas->hCPE[cpe_id]->hCoreCoder[n]->mct_chan_mode = MCT_CHAN_MODE_REGULAR; + } + } + + /* in case we have an uneven number of transport channels, indicate last channel ID as inactive */ + if ( hMCT->nchan_out_woLFE % 2 ) + { + st_ivas->hCPE[st_ivas->nCPE - 1]->hCoreCoder[1]->mct_chan_mode = MCT_CHAN_MODE_IGNORE; + } + + /*Initialize MCT block data */ + max_blocks = hMCT->nchan_out_woLFE / 2; + + for ( n = 0; n < max_blocks; n++ ) + { + if ( ( hMCT->hBlockData[n] = (MCT_DEC_BLOCK_DATA_HANDLE) malloc( sizeof( MCT_DEC_BLOCK_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MCT block data structure\n" ) ); + } + + /*Initialize all parameters to zero*/ + hMCT->hBlockData[n]->ch1 = 0; + hMCT->hBlockData[n]->ch2 = 0; + + /*-----------------------------------------------------------------* + * MDCT stereo initialization + *-----------------------------------------------------------------*/ + + if ( ( hMCT->hBlockData[n]->hStereoMdct = (STEREO_MDCT_DEC_DATA_HANDLE) malloc( sizeof( STEREO_MDCT_DEC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MDCT Stereo \n" ) ); + } + + initMdctStereoDecData( hMCT->hBlockData[n]->hStereoMdct, st_ivas->hCPE[0]->hCoreCoder[0]->igf, st_ivas->hCPE[0]->hCoreCoder[0]->hIGFDec->igfData.igfInfo.grid, cp_bitrate, SWB ); + hMCT->hBlockData[n]->hStereoMdct->use_itd = 0; + hMCT->hBlockData[n]->hStereoMdct->reverse_dmx = 0; + hMCT->hBlockData[n]->hStereoMdct->smooth_ratio = 1.f; + } + for ( ; n < MCT_MAX_BLOCKS; n++ ) + { + hMCT->hBlockData[n] = NULL; + } + + /*-----------------------------------------------------------------* + * Initializations + *-----------------------------------------------------------------*/ + + hMCT->currBlockDataCnt = 0; + + /*Initialize bits required to signal channel-pair index*/ + hMCT->bitsChannelPairIndex = max( 1, (int16_t) ( floorf( ( logf( (float) hMCT->nchan_out_woLFE * ( hMCT->nchan_out_woLFE - 1 ) / 2 - 1 ) * INV_LOG_2 ) ) + 1 ) ); + + set_s( hMCT->chBitRatios, 0, MCT_MAX_CHANNELS ); + set_s( hMCT->lowE_ch, 0, MCT_MAX_CHANNELS ); + + st_ivas->hMCT = hMCT; + + return IVAS_ERR_OK; +} + + +/*------------------------------------------------------------------------- + * mct_dec_reconfigure() + * + * Reconfigure IVAS decoder MCT handle + *-------------------------------------------------------------------------*/ + +ivas_error mct_dec_reconfigure( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const uint16_t b_nchan_change /* i : flag indicating different channel count */ +) +{ + MCT_DEC_HANDLE hMCT; + Decoder_State *st; + int16_t n, cpe_id, max_blocks; + int32_t cp_bitrate; + + hMCT = st_ivas->hMCT; + + /*-----------------------------------------------------------------* + * Allocate and initialize MCT BlockData handles + *-----------------------------------------------------------------*/ + + if ( b_nchan_change ) + { + /* Determine active channels */ + if ( ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMMC ) || st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT ) + { + hMCT->nchan_out_woLFE = st_ivas->nchan_transport; + if ( st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + { + hMCT->nchan_out_woLFE += st_ivas->nchan_ism; + } + } + else if ( st_ivas->mc_mode == MC_MODE_MCT ) + { + hMCT->nchan_out_woLFE = st_ivas->nchan_transport - st_ivas->hTransSetup.num_lfe; + } + else if ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) + { + hMCT->nchan_out_woLFE = st_ivas->nchan_transport - st_ivas->hTransSetup.num_lfe; + } + else + { + assert( !"IVAS format currently not supported for MCT" ); + } + } + + /* indicate LFE for appropriate core-coder channel */ + for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) + { + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + st_ivas->hCPE[cpe_id]->hCoreCoder[n]->mct_chan_mode = MCT_CHAN_MODE_REGULAR; + } + } + + /* in case we have an uneven number of transport channels, indicate last channel ID as inactive */ + if ( hMCT->nchan_out_woLFE % 2 ) + { + st_ivas->hCPE[st_ivas->nCPE - 1]->hCoreCoder[1]->mct_chan_mode = MCT_CHAN_MODE_IGNORE; + } + + cp_bitrate = st_ivas->hDecoderConfig->ivas_total_brate / hMCT->nchan_out_woLFE * CPE_CHANNELS; + if ( st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + { + cp_bitrate = st_ivas->hDecoderConfig->ivas_total_brate / st_ivas->nchan_transport * CPE_CHANNELS; + } + + /* set correct nominal bitrates and igf config already here, otherwise we + * run into a number of problems */ + for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) + { + st_ivas->hCPE[cpe_id]->element_brate = cp_bitrate; + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + st = st_ivas->hCPE[cpe_id]->hCoreCoder[n]; + + st->total_brate = st_ivas->hCPE[cpe_id]->element_brate; + + if ( st->mct_chan_mode != MCT_CHAN_MODE_IGNORE ) + { + st->bits_frame_nominal = (int16_t) ( st_ivas->hCPE[cpe_id]->element_brate / FRAMES_PER_SEC ); + st->igf = getIgfPresent( st->element_mode, st->bits_frame_nominal * FRAMES_PER_SEC, st->bwidth, st->rf_flag ); + if ( st->igf ) + { + IGFDecSetMode( st->hIGFDec, st_ivas->hCPE[cpe_id]->element_brate, st->bwidth, st->element_mode, -1, -1, st->rf_flag ); + } + } + } + } + + /*Initialize MCT block data */ + max_blocks = hMCT->nchan_out_woLFE / CPE_CHANNELS; + + for ( n = 0; n < max_blocks; n++ ) + { + if ( b_nchan_change ) + { + if ( hMCT->hBlockData[n] == NULL ) + { + if ( ( hMCT->hBlockData[n] = (MCT_DEC_BLOCK_DATA_HANDLE) malloc( sizeof( MCT_BLOCK_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MCT block data structure\n" ) ); + } + + /*Initialize all parameters to zero*/ + hMCT->hBlockData[n]->ch1 = 0; + hMCT->hBlockData[n]->ch2 = 0; + + /* MDCT stereo initialization */ + if ( ( hMCT->hBlockData[n]->hStereoMdct = (STEREO_MDCT_DEC_DATA_HANDLE) malloc( sizeof( STEREO_MDCT_ENC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MDCT Stereo \n" ) ); + } + } + } + + initMdctStereoDecData( hMCT->hBlockData[n]->hStereoMdct, st_ivas->hCPE[0]->hCoreCoder[0]->igf, st_ivas->hCPE[0]->hCoreCoder[0]->hIGFDec->igfData.igfInfo.grid, cp_bitrate, st_ivas->hCPE[0]->hCoreCoder[0]->bwidth ); + hMCT->hBlockData[n]->hStereoMdct->use_itd = 0; + } + + for ( ; n < MCT_MAX_BLOCKS; n++ ) + { + /* deallocate no longer needed blocks */ + if ( hMCT->hBlockData[n] != NULL ) + { + if ( hMCT->hBlockData[n]->hStereoMdct != NULL ) + { + free( hMCT->hBlockData[n]->hStereoMdct ); + hMCT->hBlockData[n]->hStereoMdct = NULL; + } + + free( hMCT->hBlockData[n] ); + hMCT->hBlockData[n] = NULL; + } + } + + /*-----------------------------------------------------------------* + * Initializations + *-----------------------------------------------------------------*/ + + if ( b_nchan_change ) + { + hMCT->currBlockDataCnt = 0; + + /*Initialize bits required to signal channel-pair index*/ + hMCT->bitsChannelPairIndex = max( 1, (int16_t) ( floorf( ( logf( (float) hMCT->nchan_out_woLFE * ( hMCT->nchan_out_woLFE - 1 ) / 2 - 1 ) * INV_LOG_2 ) ) + 1 ) ); + + set_s( hMCT->chBitRatios, 0, MCT_MAX_CHANNELS ); + set_s( hMCT->lowE_ch, 0, MCT_MAX_CHANNELS ); + } + + return IVAS_ERR_OK; +} + + +/*------------------------------------------------------------------------- + * create_mct_dec_close() + * + * Close IVAS decoder MCT handle + *-------------------------------------------------------------------------*/ + +void ivas_mct_dec_close( + MCT_DEC_HANDLE *hMCT /* i/o: MCT decoder structure */ +) +{ + int16_t n, maxBlocks; + + if ( hMCT == NULL || *hMCT == NULL ) + { + return; + } + + maxBlocks = ( *hMCT )->nchan_out_woLFE / 2; + + for ( n = 0; n < maxBlocks; n++ ) + { + if ( ( *hMCT )->hBlockData[n] != NULL ) + { + if ( ( *hMCT )->hBlockData[n]->hStereoMdct != NULL ) + { + free( ( *hMCT )->hBlockData[n]->hStereoMdct ); + ( *hMCT )->hBlockData[n]->hStereoMdct = NULL; + } + + free( ( *hMCT )->hBlockData[n] ); + ( *hMCT )->hBlockData[n] = NULL; + } + } + + free( *hMCT ); + *hMCT = NULL; + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_mc_dec_config() + * + * - read transported MC LS setup + * - select MC format mode + * - reconfigure the MC format decoder + *-------------------------------------------------------------------------*/ + +/*! r : MC format mode */ +ivas_error ivas_mc_dec_config( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const int16_t idx, /* i : LS config. index */ + uint16_t *nSamplesRendered, /* o : samples flushed from last frame (JBM) */ + int16_t *data /* o : output synthesis signal */ +) +{ + AUDIO_CONFIG signaled_config; + MC_MODE last_mc_mode; + ivas_error error; + + /* store last frame MC mode */ + last_mc_mode = st_ivas->mc_mode; + + if ( !st_ivas->bfi ) + { + /* set transported MC LS setup */ + signaled_config = ivas_mc_map_ls_setup_to_output_config( idx ); + + if ( st_ivas->ini_frame == 0 ) + { + st_ivas->transport_config = signaled_config; + } + + /* select MC format mode */ + st_ivas->mc_mode = ivas_mc_mode_select( ivas_mc_map_output_config_to_mc_ls_setup( signaled_config ), st_ivas->hDecoderConfig->ivas_total_brate ); + + /* MC format switching */ + if ( st_ivas->ini_frame != 0 ) + { + if ( st_ivas->hDecoderConfig->last_ivas_total_brate != st_ivas->hDecoderConfig->ivas_total_brate || st_ivas->transport_config != signaled_config || last_mc_mode != st_ivas->mc_mode ) + { + if ( ( error = ivas_mc_dec_reconfig( st_ivas, nSamplesRendered, data ) ) != IVAS_ERR_OK ) + + { + return error; + } + } + } + + st_ivas->transport_config = signaled_config; + } + + return IVAS_ERR_OK; +} + + +/*------------------------------------------------------------------------- + * ivas_mc_dec_reconfig() + * + * reconfigure the MC format decoder + *-------------------------------------------------------------------------*/ + +static ivas_error ivas_mc_dec_reconfig( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + uint16_t *nSamplesRendered, /* o : number of samples flushed from the last frame (JBM) */ + int16_t *data /* o : output synthesis signal */ +) +{ + int16_t nchan_transport_old, nSCE_old, nCPE_old, sba_dirac_stereo_flag_old, nchan_hp20_old; + int16_t numCldfbAnalyses_old, numCldfbSyntheses_old; + int32_t new_brate_SCE, new_brate_CPE, ivas_total_brate; + RENDERER_TYPE renderer_type_old; + Decoder_State *st; + ivas_error error; + MC_MODE mc_mode, last_mc_mode; + TC_BUFFER_MODE tc_buffer_mode_new; + int16_t tc_nchan_tc_new; + int16_t tc_nchan_allocate_new; + int16_t tc_granularity_new; + AUDIO_CONFIG intern_config_old; + IVAS_OUTPUT_SETUP hIntSetupOld; +#ifdef NONBE_FIX_839_MC_RS_CHANNEL_ALLOC + int16_t nchan_out_buff_old, nchan_out_buff; +#endif + + error = IVAS_ERR_OK; + ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; + nchan_transport_old = st_ivas->nchan_transport; +#ifdef NONBE_FIX_839_MC_RS_CHANNEL_ALLOC + nchan_out_buff_old = ivas_get_nchan_buffers_dec( st_ivas, -1, -1 ); +#endif + last_mc_mode = ivas_mc_mode_select( ivas_mc_map_output_config_to_mc_ls_setup( st_ivas->transport_config ), st_ivas->hDecoderConfig->last_ivas_total_brate ); /* NB: this assumes that LS config remains the same between frames */ + + /* we have to temporally set the current mc_mode back to the previous one to make sure the following call to + ivas_init_dec_get_num_cldfb_instances() returns the correct counts */ + mc_mode = st_ivas->mc_mode; + st_ivas->mc_mode = last_mc_mode; + ivas_init_dec_get_num_cldfb_instances( st_ivas, &numCldfbAnalyses_old, &numCldfbSyntheses_old ); + st_ivas->mc_mode = mc_mode; + + nSCE_old = st_ivas->nSCE; + nCPE_old = st_ivas->nCPE; + sba_dirac_stereo_flag_old = st_ivas->sba_dirac_stereo_flag; + + /* special handling needed for the hp20 buffers for McMASA */ + if ( last_mc_mode == MC_MODE_MCMASA ) + { + nchan_hp20_old = getNumChanSynthesis( st_ivas ); + } + else + { + nchan_hp20_old = nchan_transport_old; + } + st_ivas->sba_dirac_stereo_flag = ivas_get_sba_dirac_stereo_flag( st_ivas ); + + /* save old IntSetup, might be needed for JBM flushing...*/ + intern_config_old = st_ivas->intern_config; + hIntSetupOld = st_ivas->hIntSetup; + tc_granularity_new = 1; + + /* renderer might have changed, reselect */ + renderer_type_old = st_ivas->renderer_type; + ivas_renderer_select( st_ivas ); + + /* side effect of the renderer selection can be a changed internal config */ + ivas_output_init( &( st_ivas->hIntSetup ), st_ivas->intern_config ); + if ( st_ivas->hDecoderConfig->Opt_5ms ) + { + /* transfer subframe info from DirAC or ParamMC to central tc buffer */ + if ( last_mc_mode == MC_MODE_PARAMMC ) + { + st_ivas->hTcBuffer->nb_subframes = st_ivas->hParamMC->nb_subframes; + st_ivas->hTcBuffer->subframes_rendered = st_ivas->hParamMC->subframes_rendered; + st_ivas->hTcBuffer->num_slots = st_ivas->hParamMC->num_slots; + st_ivas->hTcBuffer->slots_rendered = st_ivas->hParamMC->slots_rendered; + mvs2s( st_ivas->hParamMC->subframe_nbslots, st_ivas->hTcBuffer->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); + } + else if ( last_mc_mode == MC_MODE_MCMASA && st_ivas->hSpatParamRendCom != NULL ) + { + st_ivas->hTcBuffer->nb_subframes = st_ivas->hSpatParamRendCom->nb_subframes; + st_ivas->hTcBuffer->subframes_rendered = st_ivas->hSpatParamRendCom->subframes_rendered; + st_ivas->hTcBuffer->num_slots = st_ivas->hSpatParamRendCom->num_slots; + st_ivas->hTcBuffer->slots_rendered = st_ivas->hSpatParamRendCom->slots_rendered; + mvs2s( st_ivas->hSpatParamRendCom->subframe_nbslots, st_ivas->hTcBuffer->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); + } + + /* JBM: when granularity goes down (e.g. MCT with CREND -> ParamMC with binaural fastconv + render what still fits in the new granularity */ + tc_granularity_new = ivas_jbm_dec_get_render_granularity( st_ivas->renderer_type, st_ivas->ivas_format, st_ivas->mc_mode, st_ivas->hDecoderConfig->output_Fs ); + if ( tc_granularity_new < st_ivas->hTcBuffer->n_samples_granularity ) + { + if ( ( error = ivas_jbm_dec_flush_renderer( st_ivas, tc_granularity_new, renderer_type_old, intern_config_old, &hIntSetupOld, last_mc_mode, ISM_MODE_NONE, nSamplesRendered, data ) ) != IVAS_ERR_OK ) + { + return error; + } + } + /* JBM: when granularity goes up set samples to discard at the beginning of the frame */ + else if ( tc_granularity_new > st_ivas->hTcBuffer->n_samples_granularity ) + { + if ( ( error = ivas_jbm_dec_set_discard_samples( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + + if ( st_ivas->mc_mode == MC_MODE_MCT ) + { + st_ivas->nchan_transport = ivas_mc_ls_setup_get_num_channels( ivas_mc_map_output_config_to_mc_ls_setup( st_ivas->transport_config ) ); + st_ivas->nSCE = 0; + st_ivas->nCPE = st_ivas->nchan_transport / 2; + + if ( last_mc_mode != MC_MODE_MCT ) + { + /*De-allocate handles for other MC modes*/ + if ( st_ivas->hParamMC != NULL ) + { + ivas_param_mc_dec_close( &st_ivas->hParamMC ); + + /* remove ls conversion if it was allocated by ParamMC */ + ivas_ls_setup_conversion_close( &st_ivas->hLsSetUpConversion ); + } + + if ( last_mc_mode == MC_MODE_PARAMUPMIX ) + { + ivas_mc_paramupmix_dec_close( &( st_ivas->hMCParamUpmix ) ); + ivas_ls_setup_conversion_close( &( st_ivas->hLsSetUpConversion ) ); + } + + /* De-allocate McMasa-related handles */ + ivas_masa_dec_close( &( st_ivas->hMasa ) ); + ivas_qmetadata_close( &st_ivas->hQMetaData ); + + if ( st_ivas->hDirAC != NULL ) + { + ivas_dirac_rend_close( &( st_ivas->hDirACRend ) ); + ivas_spat_hSpatParamRendCom_close( &( st_ivas->hSpatParamRendCom ) ); + ivas_dirac_dec_close( &( st_ivas->hDirAC ) ); + vbap_free_data( &( st_ivas->hVBAPdata ) ); + } + + /* init LS conversion if the renderer type asks for it */ + if ( st_ivas->renderer_type == RENDERER_MC && st_ivas->hLsSetUpConversion == NULL ) + { + if ( ( error = ivas_ls_setup_conversion_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + } + else if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) + { + st_ivas->nSCE = 0; + st_ivas->nCPE = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS / 2; + st_ivas->nchan_transport = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS; + + if ( last_mc_mode != MC_MODE_PARAMUPMIX ) + { + /*De-allocate handles for other MC modes*/ + if ( st_ivas->hParamMC != NULL ) + { + ivas_param_mc_dec_close( &st_ivas->hParamMC ); + + /* remove ls conversion if it was allocated by ParamMC */ + ivas_ls_setup_conversion_close( &st_ivas->hLsSetUpConversion ); + } + + ivas_masa_dec_close( &( st_ivas->hMasa ) ); + ivas_qmetadata_close( &st_ivas->hQMetaData ); + + /* init LS conversion if the renderer type asks for it */ + if ( ( st_ivas->renderer_type == RENDERER_MC ) && st_ivas->hLsSetUpConversion == NULL ) + { + if ( ( error = ivas_ls_setup_conversion_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( ( error = ivas_mc_paramupmix_dec_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + else if ( st_ivas->mc_mode == MC_MODE_PARAMMC ) + { + if ( last_mc_mode != MC_MODE_PARAMMC ) + { + /* remove old ls conversion for MCT if open, gets reopened correctly within ivas_param_mc_dec_open when needed */ + if ( renderer_type_old == RENDERER_MC && st_ivas->hLsSetUpConversion != NULL ) + { + ivas_ls_setup_conversion_close( &st_ivas->hLsSetUpConversion ); + } + + if ( ( error = ivas_param_mc_dec_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + if ( ( error = ivas_param_mc_dec_reconfig( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* De-allocate McMasa-related handles */ + ivas_masa_dec_close( &( st_ivas->hMasa ) ); + ivas_qmetadata_close( &st_ivas->hQMetaData ); + + if ( st_ivas->hDirAC != NULL ) + { + ivas_dirac_rend_close( &( st_ivas->hDirACRend ) ); + ivas_spat_hSpatParamRendCom_close( &( st_ivas->hSpatParamRendCom ) ); + ivas_dirac_dec_close( &( st_ivas->hDirAC ) ); + + vbap_free_data( &( st_ivas->hVBAPdata ) ); + } + + if ( last_mc_mode == MC_MODE_MCT ) + { + if ( st_ivas->hMCT != NULL && st_ivas->nchan_transport <= CPE_CHANNELS ) + { + ivas_mct_dec_close( &st_ivas->hMCT ); + } + } + else if ( last_mc_mode == MC_MODE_PARAMUPMIX ) + { + ivas_mc_paramupmix_dec_close( &( st_ivas->hMCParamUpmix ) ); + } + + /* LFE handle */ + ivas_lfe_dec_close( &( st_ivas->hLFE ) ); + } + else if ( st_ivas->mc_mode == MC_MODE_MCMASA ) + { + ivas_mcmasa_setNumTransportChannels( &( st_ivas->nchan_transport ), &( st_ivas->element_mode_init ), ivas_total_brate ); + + if ( last_mc_mode != MC_MODE_MCMASA ) + { + if ( ( error = ivas_qmetadata_open( &( st_ivas->hQMetaData ) ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( ( error = ivas_mcmasa_dec_reconfig( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* LS conversion */ + if ( st_ivas->hLsSetUpConversion != NULL ) + { + ivas_ls_setup_conversion_close( &st_ivas->hLsSetUpConversion ); + } + + ivas_mc_paramupmix_dec_close( &( st_ivas->hMCParamUpmix ) ); + + if ( st_ivas->hParamMC != NULL ) + { + ivas_param_mc_dec_close( &st_ivas->hParamMC ); + st_ivas->hParamMC = NULL; + } + + if ( last_mc_mode == MC_MODE_MCT ) + { + ivas_mct_dec_close( &st_ivas->hMCT ); + } + + /* LFE handle */ + ivas_lfe_dec_close( &( st_ivas->hLFE ) ); + } + + if ( st_ivas->mc_mode != MC_MODE_MCMASA ) + { + if ( st_ivas->nchan_transport == 1 ) + { + st_ivas->element_mode_init = IVAS_SCE; + } + else + { + st_ivas->element_mode_init = IVAS_CPE_MDCT; + } + } + + /*-----------------------------------------------------------------* + * Reconfigure core coder + *-----------------------------------------------------------------*/ + + /* special case: MCT->ParamMC with more than 2 TC, CPE 1 stays, but has the wrong mct_chan_mode in channel 1 + and might have IGF static memory not allocated and the bit stream index list not set, + set correct mct_chan_mode and init missing static mem (IGF, HQ) and some config (TNS) do it here since it is _very_ MC specific */ + if ( last_mc_mode == MC_MODE_MCT && st_ivas->mc_mode == MC_MODE_PARAMMC && st_ivas->nchan_transport > CPE_CHANNELS ) + { + st = st_ivas->hCPE[1]->hCoreCoder[1]; + + if ( st_ivas->nchan_transport == 3 ) + { + st->mct_chan_mode = MCT_CHAN_MODE_IGNORE; + } + else + { + st->mct_chan_mode = MCT_CHAN_MODE_REGULAR; + } + + if ( st->hIGFDec == NULL ) + { + if ( ( st->hIGFDec = (IGF_DEC_INSTANCE_HANDLE) malloc( sizeof( IGFDEC_INSTANCE ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for IGF\n" ) ); + } + + st->igf = 0; + init_igf_dec( st->hIGFDec ); + } + + if ( st->hHQ_core == NULL ) + { + if ( ( st->hHQ_core = (HQ_DEC_HANDLE) malloc( sizeof( HQ_DEC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HQ core\n" ) ); + } + + /* HQ core initialization */ + HQ_core_dec_init( st->hHQ_core ); + } + + /* check if we have a doubly used hTxcCfg, if so, allocate a distint one for the old MCT LFE channel */ + if ( st->hTcxCfg == st_ivas->hCPE[1]->hCoreCoder[0]->hTcxCfg ) + { + if ( ( st->hTcxCfg = (TCX_CONFIG_HANDLE) malloc( sizeof( TCX_config ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for hTcxCfg\n" ) ); + } + } + + st->hTcxCfg->fIsTNSAllowed = getTnsAllowed( ivas_total_brate, st->igf, st->element_mode ); + } + if ( st_ivas->mc_mode == MC_MODE_MCMASA ) + { + uint8_t separateChannelEnabled; + int16_t separateChannelIndex; + ivas_mcmasa_set_separate_channel_mode( &separateChannelEnabled, &separateChannelIndex, ivas_total_brate ); + ivas_mcmasa_split_brate( separateChannelEnabled, ivas_total_brate, st_ivas->nSCE, st_ivas->nCPE, &new_brate_SCE, &new_brate_CPE ); + } + else if ( st_ivas->mc_mode == MC_MODE_MCT ) + { + new_brate_SCE = 0; + new_brate_CPE = ( ivas_total_brate / ( st_ivas->nchan_transport - 1 ) ) * CPE_CHANNELS; + } + else if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) + { + new_brate_SCE = 0; + new_brate_CPE = ( ivas_total_brate / ( st_ivas->nchan_transport - 1 ) ) * CPE_CHANNELS; + } + else + { + new_brate_SCE = 0; /* ivas_total_brate / st_ivas->nchan_transport;*/ + new_brate_CPE = ( ivas_total_brate / st_ivas->nchan_transport ) * CPE_CHANNELS; + } + + if ( ( error = ivas_corecoder_dec_reconfig( st_ivas, nSCE_old, nCPE_old, nchan_transport_old, sba_dirac_stereo_flag_old, new_brate_SCE, new_brate_CPE ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( last_mc_mode == MC_MODE_MCT && st_ivas->mc_mode == MC_MODE_PARAMMC && st_ivas->nchan_transport > CPE_CHANNELS ) + { + st = st_ivas->hCPE[1]->hCoreCoder[1]; + + /* TCX-LTP */ + if ( st->hTcxLtpDec == NULL ) + { + if ( ( st->hTcxLtpDec = (TCX_LTP_DEC_HANDLE) malloc( sizeof( TCX_LTP_DEC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TCX-LTP handle\n" ) ); + } + tcxltp_dec_init( st->hTcxLtpDec, 0, st->last_codec_mode, st->element_mode, st->pit_max, st->sr_core ); + } + } + + /*-----------------------------------------------------------------* + * re-configure HP20 memories + *-----------------------------------------------------------------*/ + + if ( ( error = ivas_hp20_dec_reconfig( st_ivas, nchan_hp20_old ) ) != IVAS_ERR_OK ) + { + return error; + } + + /*-----------------------------------------------------------------* + * Allocate the LFE handle that is coded separately after the allocation of the core coders + *-----------------------------------------------------------------*/ + + if ( ( st_ivas->mc_mode == MC_MODE_MCT || st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) && st_ivas->hLFE == NULL ) + { + int32_t binauralization_delay_ns = st_ivas->binaural_latency_ns; + if ( st_ivas->hBinRenderer != NULL ) + { + if ( st_ivas->hBinRenderer->render_lfe ) + { + /* Account for filterbank delay */ + binauralization_delay_ns += IVAS_FB_DEC_DELAY_NS; + } + else + { + binauralization_delay_ns = 0; + } + } + + if ( ( error = ivas_create_lfe_dec( &st_ivas->hLFE, st_ivas->hDecoderConfig->output_Fs, binauralization_delay_ns ) ) != IVAS_ERR_OK ) + { + return error; + } + + set_zero( st_ivas->hLFE->prevsynth_buf, LFE_PLC_BUFLEN ); + set_zero( st_ivas->hLFE->prior_out_buffer, L_FRAME48k ); + } + + /*-----------------------------------------------------------------* + * Reconfigure renderers + *-----------------------------------------------------------------*/ + + if ( st_ivas->mc_mode == MC_MODE_MCMASA ) + { + if ( ( st_ivas->renderer_type != RENDERER_DISABLE ) && ( st_ivas->renderer_type != RENDERER_MCMASA_MONO_STEREO ) ) + { + if ( st_ivas->hDirAC != NULL ) + { + /* reconfigure existing DirAC dec */ + if ( ( error = ivas_dirac_dec_config( st_ivas, DIRAC_RECONFIGURE ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + /* init a new DirAC dec */ + if ( ( error = ivas_dirac_dec_config( st_ivas, DIRAC_OPEN ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + else if ( st_ivas->renderer_type == RENDERER_DISABLE && st_ivas->hDirAC != NULL ) + { + ivas_dirac_rend_close( &( st_ivas->hDirACRend ) ); + ivas_spat_hSpatParamRendCom_close( &( st_ivas->hSpatParamRendCom ) ); + ivas_dirac_dec_close( &( st_ivas->hDirAC ) ); + + vbap_free_data( &( st_ivas->hVBAPdata ) ); + } + } + + if ( renderer_type_old != st_ivas->renderer_type ) + { + AUDIO_CONFIG output_config; + + output_config = st_ivas->hDecoderConfig->output_config; + + /* binaural renderers*/ + if ( output_config == IVAS_AUDIO_CONFIG_BINAURAL || output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR || output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB + ) + { + /* remove unneeded binaural renderers */ + if ( st_ivas->hBinRenderer != NULL && ( st_ivas->renderer_type != RENDERER_BINAURAL_FASTCONV && st_ivas->renderer_type != RENDERER_BINAURAL_FASTCONV_ROOM ) ) + { + ivas_binRenderer_close( &st_ivas->hBinRenderer ); + } + + if ( ( st_ivas->hCrendWrapper != NULL ) && ( st_ivas->hCrendWrapper->hCrend != NULL ) && ( st_ivas->renderer_type != RENDERER_BINAURAL_MIXER_CONV && st_ivas->renderer_type != RENDERER_BINAURAL_MIXER_CONV_ROOM && ( st_ivas->renderer_type != RENDERER_BINAURAL_OBJECTS_TD || st_ivas->hIntSetup.output_config != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) ) + { + + ivas_rend_closeCrend( &( st_ivas->hCrendWrapper ) ); + } + + if ( st_ivas->hBinRendererTd != NULL && ( st_ivas->renderer_type != RENDERER_BINAURAL_OBJECTS_TD ) ) + { + ivas_td_binaural_close( &st_ivas->hBinRendererTd ); + st_ivas->hHrtfTD = NULL; + } + + if ( st_ivas->hDiracDecBin != NULL ) + { + if ( st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC_ROOM && st_ivas->renderer_type != RENDERER_STEREO_PARAMETRIC ) + { + ivas_dirac_dec_close_binaural_data( &st_ivas->hDiracDecBin ); + } + } + + /* init necessary new renderers */ + if ( st_ivas->hBinRenderer == NULL && ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) ) + { + if ( ( error = ivas_binRenderer_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->hBinRendererTd == NULL && st_ivas->renderer_type == RENDERER_BINAURAL_OBJECTS_TD ) + { + if ( ( error = ivas_td_binaural_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( st_ivas->hIntSetup.output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) + { + if ( ( error = ivas_rend_initCrendWrapper( &st_ivas->hCrendWrapper ) ) != IVAS_ERR_OK ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend Wrapper\n" ); + } + + st_ivas->hCrendWrapper->hCrend = NULL; + st_ivas->hCrendWrapper->hHrtfCrend = NULL; + if ( ( st_ivas->hCrendWrapper->hCrend = (CREND_HANDLE) malloc( sizeof( CREND_DATA ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend\n" ); + } + } + } + else if ( st_ivas->hCrendWrapper == NULL && ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV || st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) ) + { + if ( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hDecoderConfig->output_config, st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } + st_ivas->binaural_latency_ns = st_ivas->hCrendWrapper->binaural_latency_ns; + } + } + /* mono/stereo */ + else if ( output_config == IVAS_AUDIO_CONFIG_MONO || output_config == IVAS_AUDIO_CONFIG_STEREO ) + { + /* nothing should happen here... */ + } + /* LS */ + else if ( output_config == IVAS_AUDIO_CONFIG_5_1 || output_config == IVAS_AUDIO_CONFIG_5_1_2 || output_config == IVAS_AUDIO_CONFIG_5_1_4 || output_config == IVAS_AUDIO_CONFIG_7_1 || output_config == IVAS_AUDIO_CONFIG_7_1_4 || output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM ) + { + } + } + + /*-----------------------------------------------------------------* + * CLDFB instances + *-----------------------------------------------------------------*/ + + if ( ( error = ivas_cldfb_dec_reconfig( st_ivas, nchan_transport_old, numCldfbAnalyses_old, numCldfbSyntheses_old ) ) != IVAS_ERR_OK ) + { + return error; + } + + /*-----------------------------------------------------------------* + * JBM TC buffers + *-----------------------------------------------------------------*/ + + if ( st_ivas->hDecoderConfig->Opt_5ms == 1 ) + { + int16_t tc_nchan_full_new; + DECODER_TC_BUFFER_HANDLE hTcBuffer; + + hTcBuffer = st_ivas->hTcBuffer; + tc_buffer_mode_new = ivas_jbm_dec_get_tc_buffer_mode( st_ivas ); + tc_nchan_tc_new = ivas_jbm_dec_get_num_tc_channels( st_ivas ); + tc_nchan_allocate_new = tc_nchan_tc_new; + tc_nchan_full_new = tc_nchan_tc_new; + + if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) + { + tc_nchan_allocate_new = 2 * BINAURAL_CHANNELS; + tc_nchan_full_new = tc_nchan_allocate_new; + } + + if ( st_ivas->mc_mode == MC_MODE_PARAMMC && st_ivas->hDecoderConfig->output_config != IVAS_AUDIO_CONFIG_MONO && st_ivas->hDecoderConfig->output_config != IVAS_AUDIO_CONFIG_STEREO ) + { + tc_nchan_full_new = 0; + } + else if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) + { + tc_nchan_allocate_new = MC_PARAMUPMIX_MAX_INPUT_CHANS; + tc_buffer_mode_new = TC_BUFFER_MODE_RENDERER; + if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_STEREO || st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_MONO ) + { + tc_buffer_mode_new = TC_BUFFER_MODE_BUFFER; + tc_nchan_tc_new = st_ivas->hDecoderConfig->nchan_out; + tc_nchan_allocate_new = tc_nchan_tc_new; + } + tc_nchan_full_new = tc_nchan_allocate_new; + } + + /* reconfigure buffer */ + if ( hTcBuffer->tc_buffer_mode != tc_buffer_mode_new || hTcBuffer->nchan_transport_jbm != tc_nchan_tc_new || + hTcBuffer->nchan_buffer_full != tc_nchan_full_new || hTcBuffer->nchan_transport_internal != tc_nchan_allocate_new || + tc_granularity_new != hTcBuffer->n_samples_granularity ) + { + if ( ( error = ivas_jbm_dec_tc_buffer_reconfigure( st_ivas, tc_buffer_mode_new, tc_nchan_tc_new, tc_nchan_allocate_new, tc_nchan_full_new, tc_granularity_new ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* transfer subframe info from central tc buffer to ParamMC or McMASA (DirAC) */ + if ( st_ivas->hSpatParamRendCom != NULL ) + { + st_ivas->hSpatParamRendCom->nb_subframes = st_ivas->hTcBuffer->nb_subframes; + st_ivas->hSpatParamRendCom->subframes_rendered = st_ivas->hTcBuffer->subframes_rendered; + st_ivas->hSpatParamRendCom->num_slots = st_ivas->hTcBuffer->num_slots; + st_ivas->hSpatParamRendCom->slots_rendered = st_ivas->hTcBuffer->slots_rendered; + mvs2s( st_ivas->hTcBuffer->subframe_nbslots, st_ivas->hSpatParamRendCom->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); + } + else if ( st_ivas->hParamMC != NULL ) + { + st_ivas->hParamMC->nb_subframes = st_ivas->hTcBuffer->nb_subframes; + st_ivas->hParamMC->subframes_rendered = st_ivas->hTcBuffer->subframes_rendered; + st_ivas->hParamMC->num_slots = st_ivas->hTcBuffer->num_slots; + st_ivas->hParamMC->slots_rendered = st_ivas->hTcBuffer->slots_rendered; + mvs2s( st_ivas->hTcBuffer->subframe_nbslots, st_ivas->hParamMC->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); + } + } + +#ifdef NONBE_FIX_839_MC_RS_CHANNEL_ALLOC + /*-----------------------------------------------------------------* + * floating-point output audio buffers + *-----------------------------------------------------------------*/ + + if ( !st_ivas->hDecoderConfig->Opt_5ms ) + { +#ifdef NONBE_FIX_839_MC_RS_CHANNEL_ALLOC + nchan_out_buff = ivas_get_nchan_buffers_dec( st_ivas, -1, -1 ); + + if ( ( error = ivas_output_buff_dec( st_ivas->p_output_f, nchan_out_buff_old, nchan_out_buff ) ) != IVAS_ERR_OK ) + { + return error; + } +#else + int16_t nchan_out_buff, ch; + nchan_out_buff = ivas_get_nchan_buffers_dec( st_ivas, st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); + + if ( nchan_out_buff > nchan_out_buf_old ) + { + for ( ch = nchan_out_buf_old; ch < nchan_out_buff; ch++ ) + { + /* note: these are intra-frame heap memories */ + if ( ( st_ivas->p_output_f[ch] = (float *) malloc( ( 48000 / FRAMES_PER_SEC ) * sizeof( float ) ) ) == NULL ) /* note: 32000 == max internal sampling rate */ + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for floating-point output audio buffer!\n" ) ); + } + } + } + else + { + for ( ch = nchan_out_buff; ch < nchan_out_buf_old; ch++ ) + { + free( st_ivas->p_output_f[ch] ); + st_ivas->p_output_f[ch] = NULL; + } + } +#endif + } +#endif + + return error; +} diff --git a/lib_dec/ivas_mct_dec_mct.c b/lib_dec/ivas_mct_dec_mct.c new file mode 100644 index 0000000000000000000000000000000000000000..881c35119cdbaef891ac4f8adde4cef504241a95 --- /dev/null +++ b/lib_dec/ivas_mct_dec_mct.c @@ -0,0 +1,335 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "ivas_cnst.h" +#include "ivas_prot.h" +#include "prot.h" +#include "wmc_auto.h" +#include +#include "stat_enc.h" + + +/*----------------------------------------------------------* + * indexToChannelPair() + * + * get the index of each channel pair + *----------------------------------------------------------*/ + +static void indexToChannelPair( + MCT_DEC_BLOCK_DATA_HANDLE hBlock, + const int16_t nChannels, + const int16_t pairIdx ) +{ + int16_t ch1, ch2; + int16_t tmpIdx = 0; + + for ( ch2 = 1; ch2 < nChannels; ch2++ ) + { + for ( ch1 = 0; ch1 < ch2; ch1++ ) + { + + if ( tmpIdx == pairIdx ) + { + hBlock->ch1 = ch1; + hBlock->ch2 = ch2; + + return; + } + else + { + tmpIdx++; + } + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * ivas_mct_dec_mct() + * + * decode core and mct information + *-------------------------------------------------------------------*/ + +void ivas_mct_dec_mct( + MCT_DEC_HANDLE hMCT, /* i/o: MCT decoder structure */ + Decoder_State **sts, /* i/o: decoder state structure */ + const int16_t nchan /* i : number of channels */ +) +{ + int16_t pair, ch, channelPairIndex; + MCT_DEC_BLOCK_DATA_HANDLE hBlock; + Decoder_State *p_st[CPE_CHANNELS]; + int16_t nchan_active = 0; + + hMCT->currBlockDataCnt = get_next_indice( sts[0], MCT_NUM_BLOCK_DATA_BITS ); + + /*first get core and overlap info for all channels*/ + for ( ch = 0; ch < nchan; ch++ ) + { + if ( hMCT->currBlockDataCnt && sts[ch]->mct_chan_mode != MCT_CHAN_MODE_IGNORE ) + { + hMCT->mc_global_ild[ch] = get_next_indice( sts[0], SMDCT_GLOBAL_ILD_BITS ); + } + else + { + hMCT->mc_global_ild[ch] = 0; + } + } + + if ( hMCT->currBlockDataCnt ) + { + for ( ch = 0; ch < nchan; ch++ ) + { + if ( + sts[ch]->mct_chan_mode != MCT_CHAN_MODE_IGNORE ) + { + hMCT->lowE_ch[ch] = get_next_indice( sts[0], 1 ); + } + } + } + + for ( ch = 0; ch < nchan; ch++ ) + { + if ( sts[ch]->mct_chan_mode != MCT_CHAN_MODE_IGNORE ) + { + nchan_active++; + } + } + + for ( pair = hMCT->currBlockDataCnt - 1; pair >= 0; pair-- ) + { + assert( nchan_active >= 2 ); + hBlock = hMCT->hBlockData[pair]; + + /*get channel pair index from BS*/ + channelPairIndex = get_next_indice( sts[0], hMCT->bitsChannelPairIndex ); + indexToChannelPair( hBlock, nchan, channelPairIndex ); + + /*point to decoder states of actual channels to read block pair bits*/ + p_st[0] = sts[hBlock->ch1]; + p_st[1] = sts[hBlock->ch2]; + + parse_stereo_from_bitstream( hBlock->hStereoMdct, p_st, 1, 0, sts[0], hBlock->mask ); + } + + return; +} + + +/*----------------------------------------------------------* + * applyGlobalILD() + * + * revert to initial channel energy levels using the ratios + * sent from the encoder + *----------------------------------------------------------*/ + +static void applyGlobalILD( + Decoder_State **sts, + MCT_DEC_HANDLE hMCT, + float *x[MCT_MAX_CHANNELS][NB_DIV] ) +{ + int16_t ch, k; + int16_t nSubframes, L_subframeTCX; + float qratio; + + for ( ch = 0; ch < ( hMCT->nchan_out_woLFE ); + ch++ ) + { + nSubframes = ( sts[ch]->core == TCX_20_CORE ) ? 1 : NB_DIV; + L_subframeTCX = sts[ch]->hTcxDec->L_frameTCX / nSubframes; + + if ( hMCT->mc_global_ild[ch] ) + { + if ( hMCT->lowE_ch[ch] ) + { + qratio = (float) hMCT->mc_global_ild[ch] / SMDCT_ILD_RANGE; + } + else + { + qratio = SMDCT_ILD_RANGE / (float) hMCT->mc_global_ild[ch]; + } + + for ( k = 0; k < nSubframes; k++ ) + { + v_multc( x[ch][k], qratio, x[ch][k], L_subframeTCX ); + } + } + else + { + continue; + } + } + + return; +} + + +/*----------------------------------------------------------* + * apply_MCT_dec() + * + * main MCT decoding function + *----------------------------------------------------------*/ + +void apply_MCT_dec( + MCT_DEC_HANDLE hMCT, /* i/o: MCT decoder structure */ + Decoder_State **sts, /* i/o: decoder state structure */ + float *x[MCT_MAX_CHANNELS][NB_DIV] /* i/o: decoded and dequan. spect. input to MCT */ +) +{ + int16_t pair; + MCT_DEC_BLOCK_DATA_HANDLE hBlock; + + for ( pair = hMCT->currBlockDataCnt - 1; pair >= 0; pair-- ) + { + hBlock = hMCT->hBlockData[pair]; + + stereo_decoder_tcx( hBlock->hStereoMdct, hBlock->mask, &x[hBlock->ch2][0], &x[hBlock->ch1][0], &x[hBlock->ch2][0], hBlock->hStereoMdct->mdct_stereo_mode, sts[hBlock->ch1]->core, sts[hBlock->ch2]->core, sts[0]->igf, sts[0]->hTcxDec->L_frameTCX, sts[1]->hTcxDec->L_frameTCX, 1, TCX_20_CORE, TCX_20_CORE, 0 ); + } + + applyGlobalILD( sts, hMCT, x ); + + return; +} + +/*----------------------------------------------------------* + * mctStereoIGF_dec() + * + * apply IGF to MCT stereo block pairs + *----------------------------------------------------------*/ + +void mctStereoIGF_dec( + MCT_DEC_HANDLE hMCT, /* i/o: MCT decoder structure */ + Decoder_State **stm, /* i/o: decoder state structure */ + float *x[MCT_MAX_CHANNELS][NB_DIV], /* i/o: decoded and dequantized spectrum*/ + const int16_t bfi /* i : bad frame flag */ +) +{ + int16_t b, core, nSubframes, k, ch, p_ch[CPE_CHANNELS], ch1, ch2; + Decoder_State *sts[CPE_CHANNELS], *st = NULL; + int16_t tcx_offset[CPE_CHANNELS]; + int16_t tcx_offsetFB[CPE_CHANNELS]; + int16_t left_rect[CPE_CHANNELS]; + int16_t L_spec[CPE_CHANNELS]; + int16_t L_frame[CPE_CHANNELS]; + int16_t L_frameTCX[CPE_CHANNELS]; + float *p_x[CPE_CHANNELS][NB_DIV]; + int16_t singleChEle[MCT_MAX_CHANNELS]; + + set_s( singleChEle, 1, ( hMCT->nchan_out_woLFE ) ); + + for ( b = 0; b < hMCT->currBlockDataCnt; b++ ) + { + ch1 = hMCT->hBlockData[b]->ch1; + ch2 = hMCT->hBlockData[b]->ch2; + + sts[0] = stm[ch1]; + sts[1] = stm[ch2]; + core = sts[0]->core; + nSubframes = core; + p_ch[0] = ch1; + p_ch[1] = ch2; + singleChEle[hMCT->hBlockData[b]->ch1] = 0; + singleChEle[hMCT->hBlockData[b]->ch2] = 0; + + for ( k = 0; k < nSubframes; k++ ) + { + p_x[0][k] = x[ch1][k]; + p_x[1][k] = x[ch2][k]; + + if ( hMCT->hBlockData[b]->hStereoMdct->IGFStereoMode[k] != SMDCT_DUAL_MONO || hMCT->hBlockData[b]->hStereoMdct->mdct_stereo_mode[k] != SMDCT_DUAL_MONO ) + { + L_spec[0] = sts[0]->hTcxCfg->tcx_coded_lines / nSubframes; + + init_tcx_info( sts[0], sts[0]->L_frame / nSubframes, sts[0]->hTcxDec->L_frameTCX / nSubframes, k, bfi, &tcx_offset[0], &tcx_offsetFB[0], &L_frame[0], &L_frameTCX[0], &left_rect[0], &L_spec[0] ); + + /* stereo IGF decoding */ + assert( ( sts[0]->core == sts[1]->core ) || ( hMCT->hBlockData[b]->hStereoMdct->mdct_stereo_mode[0] == SMDCT_DUAL_MONO ) ); + + decoder_tcx_IGF_stereo( sts, hMCT->hBlockData[b]->hStereoMdct, hMCT->hBlockData[b]->mask, p_x, L_frame[0], left_rect[0], k, bfi, 1 /* MCT_flag */ ); + } + else + { + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + st = sts[ch]; + if ( bfi && st->core == ACELP_CORE ) /*no igf processing needed*/ + { + continue; + } + L_spec[ch] = st->hTcxCfg->tcx_coded_lines / nSubframes; + + init_tcx_info( st, st->L_frame / nSubframes, st->hTcxDec->L_frameTCX / nSubframes, k, bfi, &tcx_offset[ch], &tcx_offsetFB[ch], &L_frame[ch], &L_frameTCX[ch], &left_rect[ch], &L_spec[ch] ); + + /* mono or dual mono IGF decoding */ + decoder_tcx_IGF_mono( st, x[p_ch[ch]][k], L_frame[ch], left_rect[ch], bfi, k ); + } + } + } + } + + + if ( sum_s( singleChEle, ( hMCT->nchan_out_woLFE ) ) != 0 ) + { + for ( ch = 0; ch < ( hMCT->nchan_out_woLFE ); ch++ ) + { + if ( singleChEle[ch] ) + { + st = stm[ch]; + if ( bfi && st->core == ACELP_CORE ) /*no igf processing needed*/ + { + continue; + } + if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) + { + continue; + } + nSubframes = ( st->core == TCX_10_CORE ) ? NB_DIV : 1; + + for ( k = 0; k < nSubframes; k++ ) + { + L_spec[0] = st->hTcxCfg->tcx_coded_lines / nSubframes; + + init_tcx_info( st, st->L_frame / nSubframes, st->hTcxDec->L_frameTCX / nSubframes, k, bfi, &tcx_offset[0], &tcx_offsetFB[0], &L_frame[0], &L_frameTCX[0], &left_rect[0], &L_spec[0] ); + + /* mono or dual mono IGF decoding */ + decoder_tcx_IGF_mono( st, x[ch][k], L_frame[0], left_rect[0], bfi, k ); + } + } + } + } + + return; +} diff --git a/lib_dec/ivas_mdct_core_dec.c b/lib_dec/ivas_mdct_core_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..0f9d1c66c0709ac826863c950ea6e08637e6bdeb --- /dev/null +++ b/lib_dec/ivas_mdct_core_dec.c @@ -0,0 +1,1075 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include "options.h" +#include "prot.h" +#include "rom_com.h" +#include "ivas_rom_com.h" +#include "wmc_auto.h" +#include "cnst.h" +#include "basop_proto_func.h" +#include "stat_com.h" +#include "ivas_prot.h" +#include "ivas_stat_dec.h" +#include "ivas_stat_com.h" +#include + + +/*-----------------------------------------------------------------* + * Function mdct_read_IGF_bits() + * + * read IGF side bits + *-----------------------------------------------------------------*/ + +void mdct_read_IGF_bits( + Decoder_State *st, /* i/o: Decoder state handle */ + Decoder_State *st0 /* i : pointer to handle where bitstream is read */ +) +{ + int16_t k, start; + + start = st0->next_bit_pos; + + if ( st->core == TCX_20_CORE ) + { + /* read IGF payload */ + IGFDecReadLevel( st->hIGFDec, st0, ( st->last_core == ACELP_CORE ) ? IGF_GRID_LB_TRAN : IGF_GRID_LB_NORM, 1 ); + + IGFDecReadData( st->hIGFDec, st0, ( st->last_core == ACELP_CORE ) ? IGF_GRID_LB_TRAN : IGF_GRID_LB_NORM, 1 ); + } + + if ( st->core == TCX_10_CORE ) + { + for ( k = 0; k < 2; k++ ) + { + IGFDecReadLevel( st->hIGFDec, st0, IGF_GRID_LB_SHORT, k == 0 ? 1 : 0 ); + + IGFDecReadData( st->hIGFDec, st0, IGF_GRID_LB_SHORT, k == 0 ? 1 : 0 ); + + IGFDecStoreTCX10SubFrameData( st->hIGFDec, k ); + } + } + + st->side_bits_frame_channel += ( st0->next_bit_pos - start ); + + return; +} + + +/*-----------------------------------------------------------------* + * Function dec_prm_tcx_sidebits() + * + * decode TCX side parameters + *-----------------------------------------------------------------*/ + +static void dec_prm_tcx_sidebits( + int16_t param[], /* o : decoded parameters */ + Decoder_State *st, /* i/o: decoder memory state */ + const int16_t tnsSize[NB_DIV], /* i : TNS activity/subframe (in channel 0 in case of 2) */ + int16_t p_param[NB_DIV], /* o : pointer to parameters for next round of bs reading*/ + int16_t nTnsBitsTCX10[NB_DIV], /* o : number of TNS bits per TCX10 subframe */ + Decoder_State *st0, /* i/o: core decoder state handle - for bitstream */ + const int16_t MCT_flag, /* i : hMCT handle allocated (1) or not (0) */ + const int16_t ch /* i : channel */ +) +{ + CONTEXT_HM_CONFIG hm_cfg; + int16_t start_bit_pos; + + /*--------------------------------------------------------------------------------* + * Initialization + *--------------------------------------------------------------------------------*/ + + hm_cfg.indexBuffer = NULL; + + start_bit_pos = st0->next_bit_pos; + + /* Init LTP data */ + st->hTcxDec->tcx_hm_LtpPitchLag = -1; + st->hTcxLtpDec->tcxltp_gain = 0.0f; + + /*--------------------------------------------------------------------------------* + * Header + *--------------------------------------------------------------------------------*/ + + /* Modes (ACE_GC, ACE_UC, TCX20, TCX10...) */ + getTCXMode( st, st0, MCT_flag ); + + st->flagGuidedAcelp = 0; + + if ( st->dec_glr ) + { + st->dec_glr_idx = -1; + } + + /* last_core for core switching and error concealment */ + if ( ( st->last_core == ACELP_CORE && st->last_total_brate == FRAME_NO_DATA ) || st->prev_bfi ) + { + /* needed for cases where first TCX frame after a certain transition (e.g. inactive SID/zero frame -> active or stereo switching) is lost */ + st->last_core_from_bs = get_next_indice( st0, 1 ); + + /* ACELP -> TCX_10 transitions are forbidden */ + if ( st->core == TCX_10_CORE && st->last_core == ACELP_CORE ) + { + st->last_core = TCX_20_CORE; + } + } + else + { + st->last_core = get_next_indice( st0, 1 ); + st->last_core_from_bs = st->last_core; + } + + getTCXWindowing( st->core, st->last_core, st->element_mode, st->hTcxCfg, st0 ); + + st->hTcxDec->kernel_type[0] = st->hTcxDec->kernel_type[1] = MDCT_IV; + st->hTcxDec->kernel_type[0] = get_next_indice( st0, st->last_core_from_bs != ACELP_CORE ? 2 : 1 ); + if ( st->core == TCX_10_CORE ) + { + st->hTcxDec->kernel_type[1] = 2 * ( st->hTcxDec->kernel_type[0] & 1 ) + get_next_indice( st0, 1 ); + } + if ( st->core == TCX_20_CORE ) + { + st->transform_type[0] = st->transform_type[1] = TCX_20; + } + else + { + if ( st->hTcxCfg->tcx_curr_overlap_mode == FULL_OVERLAP ) + { + st->transform_type[0] = TCX_5; + st->transform_type[1] = TCX_10; + } + else if ( st->hTcxCfg->tcx_last_overlap_mode == FULL_OVERLAP ) + { + st->transform_type[0] = TCX_10; + st->transform_type[1] = TCX_5; + } + else + { + st->transform_type[0] = st->transform_type[1] = TCX_5; + } + } + + /*--------------------------------------------------------------------------------* + * TCX20/TCX10 parameters + *--------------------------------------------------------------------------------*/ + + getTCXparam( st, st0, hm_cfg, param, 0, 0, ( ( ch > 0 ) && ( tnsSize ) && ( tnsSize[0] + tnsSize[1] > 0 ) ? tnsSize : NULL ), p_param, nTnsBitsTCX10, 0 ); + + st->side_bits_frame_channel = st0->next_bit_pos - start_bit_pos; + + return; +} + + +/*-----------------------------------------------------------------* + * Function dec_prm_tcx_spec() + * + * decode TCX core parameters + *-----------------------------------------------------------------*/ + +static void dec_prm_tcx_spec( + Decoder_State *st, /* i/o: decoder memory state */ + int16_t param[], /* o : decoded parameters */ + int16_t *total_nbbits, /* i/o: number of bits / decoded bits */ + int16_t *bitsRead, /* o : number of read bits */ + int16_t p_param[NB_DIV], /* o : pointer to parameters for next round of bs reading*/ + int16_t nTnsBitsTCX10[NB_DIV] /* i : number of TNS bits per TCX10 subframe */ +) +{ + int16_t nSubframes; + int16_t start_bit_pos, nbits_tcx; + int16_t nf_bits; + int16_t target_bitsTCX10[NB_DIV]; + int16_t indexBuffer[N_MAX + 1]; + CONTEXT_HM_CONFIG hm_cfg; + + /*--------------------------------------------------------------------------------* + * Initialization + *--------------------------------------------------------------------------------*/ + + hm_cfg.indexBuffer = indexBuffer; + + start_bit_pos = st->next_bit_pos; + + nf_bits = 0; + nbits_tcx = 0; + + nSubframes = ( st->core == TCX_10_CORE ) ? NB_DIV : 1; + + /*calculate TCX10 target bits before to assure minimum amount is distributed between subframes*/ + if ( st->core == TCX_10_CORE && st->element_mode == IVAS_CPE_MDCT ) + { + int16_t nTnsBitsTCX10Tmp[NB_DIV]; + nTnsBitsTCX10Tmp[0] = nTnsBitsTCX10[0]; + nTnsBitsTCX10Tmp[1] = nTnsBitsTCX10[1]; + + /*compute target bits */ + nbits_tcx = st->bits_frame_channel + nTnsBitsTCX10[0] + nTnsBitsTCX10[1] + nSubframes * ( NBITS_TCX_GAIN + NOISE_FILL_RANGES * NBITS_NOISE_FILL_LEVEL ); + ivas_mdct_tcx10_bit_distribution( target_bitsTCX10, nbits_tcx, nTnsBitsTCX10Tmp ); + } + + /*--------------------------------------------------------------------------------* + * TCX20/TCX10 parameters + *--------------------------------------------------------------------------------*/ + + getTCXparam( st, st, hm_cfg, param, 0, 0, NULL, p_param, target_bitsTCX10, 1 ); + + nf_bits = nSubframes * ( NBITS_TCX_GAIN + NOISE_FILL_RANGES * NBITS_NOISE_FILL_LEVEL ); + + if ( *total_nbbits - bitsRead[0] + nf_bits < ( st->next_bit_pos - start_bit_pos ) ) + { + st->BER_detect = 1; + st->next_bit_pos = start_bit_pos + *total_nbbits - bitsRead[0]; + } + + bitsRead[0] = st->next_bit_pos - start_bit_pos; + + return; +} + + +/*-----------------------------------------------------------------* + * Function ivas_mdct_dec_side_bits_frame_channel() + * + * Initialize TCX and read TCX side parameters + *-----------------------------------------------------------------*/ + +void ivas_mdct_dec_side_bits_frame_channel( + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + int16_t param_lpc[MCT_MAX_CHANNELS][NPRM_LPC_NEW], /* o : lpc_parameters */ + int16_t p_param[CPE_CHANNELS][NB_DIV], /* o : pointer to param buffer */ + Decoder_State *st0, /* i : pointer to bitstream handle */ + int16_t nTnsBitsTCX10[CPE_CHANNELS][NB_DIV], /* o : number of bits for TNS */ + int16_t param[CPE_CHANNELS][DEC_NPRM_DIV * NB_DIV], /* i/o: parameters buffer */ + const int16_t MCT_flag, /* i : hMCT handle allocated (1) or not (0)*/ + const int16_t odd_channel_cpe /* i : flag cpe with odd nb of tc channels */ +) +{ + int16_t ch, bfi; + Decoder_State **sts, *st; + int16_t total_nbbits[MCT_MAX_CHANNELS]; + int16_t bitsRead[MCT_MAX_CHANNELS]; + int16_t tmp; + int16_t sns_low_br_mode; + int16_t start_bit_pos_sns; + int8_t skipped_first_channel; + + sts = hCPE->hCoreCoder; + bfi = sts[0]->bfi; + + set_s( total_nbbits, 0, MCT_MAX_CHANNELS ); + set_s( bitsRead, 0, MCT_MAX_CHANNELS ); + + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + if ( MCT_flag ) + { + /* Initialization or re-configuration of Stereo TCX */ + stereo_tcx_init_dec( sts[ch], 1, hCPE->last_element_mode ); + } + sts[ch]->enablePlcWaveadjust = 0; + } + + if ( !bfi ) + { + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + /* disguard reading second channel of odd transport channels, mct_chan_mode is set by default*/ + if ( odd_channel_cpe && ch == 1 ) + { + continue; + } + + st = sts[ch]; + if ( MCT_flag ) + { + tmp = get_next_indice( st0, 1 ); + if ( tmp ) + { + st->mct_chan_mode = MCT_CHAN_MODE_IGNORE; + } + else + { + st->mct_chan_mode = MCT_CHAN_MODE_REGULAR; + } + } + } + + /*read channel bitrate ratios from bitstream*/ + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + st = sts[ch]; + if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) + { + sts[ch]->coder_type = INACTIVE; + sts[ch]->side_bits_frame_channel = 0; + continue; + } + + tmp = ch; + if ( ch == 1 && param_lpc[0][0] == 2 ) + { + tmp = 3; + } + + dec_prm_tcx_sidebits( param[ch], st, ( ( st->element_mode == IVAS_CPE_MDCT && !MCT_flag ) ? sts[0]->hTcxDec->tnsActive : NULL ), p_param[ch], nTnsBitsTCX10[ch], st0, MCT_flag, tmp ); + + assert( st->BER_detect != 1 ); + } + + /*--------------------------------------------------------------------------------* + * SNS parameters + *--------------------------------------------------------------------------------*/ + + sns_low_br_mode = 0; + skipped_first_channel = 0; + if ( !MCT_flag && sts[0]->sr_core == 25600 && ( ( hCPE->element_brate == IVAS_48k || hCPE->element_brate == IVAS_64k ) ) ) + { + param_lpc[0][0] = SNS_STEREO_MODE_LR; + param_lpc[0][1] = SNS_STEREO_MODE_LR; + param_lpc[0][2] = 0; + param_lpc[0][3] = 0; + if ( sts[0]->core == sts[1]->core ) + { + int16_t nSubframes; + nSubframes = ( sts[0]->core == TCX_20_CORE ) ? 1 : NB_DIV; + + for ( int16_t n = 0; n < nSubframes; ++n ) + { + param_lpc[0][n] = get_next_indice( st0, 1 ); + } + + /* zero side flags only get transmitted if needed */ + for ( int16_t n = 0; n < nSubframes; ++n ) + { + if ( param_lpc[0][n] == SNS_STEREO_MODE_MS ) + { + param_lpc[0][n + SNS_STEREO_MODE_OFFSET_INDICES / 2] = get_next_indice( st0, 1 ); + } + } + } + for ( ch = 0; ch < CPE_CHANNELS; ++ch ) + { + int16_t nSubframes; + int16_t idxIndices; + + st = sts[ch]; + nSubframes = ( st->core == TCX_20_CORE ) ? 1 : NB_DIV; + idxIndices = 0; + + for ( int16_t n = 0; n < nSubframes; ++n ) + { + const int16_t is_side = ch == 1 && param_lpc[0][n] == SNS_STEREO_MODE_MS; + const int16_t *bits = ( nSubframes == 1 ) ? ivas_sns_cdbks_tcx20_bits : ivas_sns_cdbks_tcx10_bits; + int16_t nStages = ( ( nSubframes == 1 ) ? SNS_MSVQ_NSTAGES_TCX20 : SNS_MSVQ_NSTAGES_TCX10 ); + + if ( is_side ) + { + /* check for zero-side flag */ + if ( param_lpc[0][n + SNS_STEREO_MODE_OFFSET_INDICES / 2] ) + { + continue; + } + nStages = SNS_MSVQ_NSTAGES_SIDE; + bits = ( nSubframes == 1 ) ? ivas_sns_cdbks_side_tcx20_bits : ivas_sns_cdbks_side_tcx10_bits; + } + + for ( int16_t j = 0; j < nStages; ++j ) + { + /* plus one in index for stereo mode storage! */ + param_lpc[ch][j + idxIndices + SNS_STEREO_MODE_OFFSET_INDICES] = get_next_indice( st0, bits[j] ); + } + idxIndices += nStages; + } + } + } + else + { + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + st = sts[ch]; + + if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) + { + skipped_first_channel = 1; + continue; + } + + start_bit_pos_sns = st0->next_bit_pos; + + if ( ch == 0 || skipped_first_channel ) + { + /* read SNS stereo mode */ + param_lpc[0][0] = get_next_indice( st0, 1 ) << 1; + + /* read low br mode flag (if it is possible to be non-zero) */ + if ( sts[0]->element_brate == IVAS_48k && !( ( sts[0]->core == TCX_20 && sts[1]->core == TCX_20 ) ) ) + { + sns_low_br_mode = get_next_indice( st0, 1 ); + } + } + + tmp = ch; + if ( ch == 1 && param_lpc[0][0] == 2 ) + { + tmp = 3; + } + + getLPCparam( st, ¶m_lpc[ch][0], st0, tmp, sns_low_br_mode && !( sts[0]->core == TCX_20 && sts[1]->core == TCX_20 ) ); + + st->side_bits_frame_channel += st0->next_bit_pos - start_bit_pos_sns; + } + } + } + + return; +} + + +/*-----------------------------------------------------------------* + * ivas_mdct_core_invQ() + * + * Inverse processing steps up to inverse quantization + *-----------------------------------------------------------------*/ + +void ivas_mdct_core_invQ( + CPE_DEC_HANDLE hCPE, /* i/o: CPE handle */ + int16_t nTnsBitsTCX10[CPE_CHANNELS][NB_DIV], /* i : number of TNS bits */ + int16_t p_param[CPE_CHANNELS][NB_DIV], /* i : pointer to param buffer */ + int16_t param_lpc[CPE_CHANNELS][NPRM_LPC_NEW], /* i : lpc parameters */ + int16_t param[CPE_CHANNELS][DEC_NPRM_DIV * NB_DIV], /* i : param buffer */ + int16_t fUseTns[CPE_CHANNELS][NB_DIV], /* i : flag TNS enabled */ + STnsData tnsData[CPE_CHANNELS][NB_DIV], /* i : TNS parameter */ + float *x_0[CPE_CHANNELS][NB_DIV], /* i/o: signal buffer */ + float *x[CPE_CHANNELS][NB_DIV], /* i/o: signal buffer */ + float Aq[CPE_CHANNELS][( NB_SUBFR16k + 1 ) * ( M + 1 )], /* i : LP coefficients */ + int16_t ms_mask[NB_DIV][MAX_SFB], /* i : M/S mask */ + const int16_t MCT_flag /* i : hMCT handle allocated (1) or not (0) */ +) +{ + int16_t ch, bfi, k; + Decoder_State **sts, *st; + /* bitstream */ + int16_t total_nbbits[CPE_CHANNELS]; + int16_t bitsRead[CPE_CHANNELS]; + int16_t *prm[CPE_CHANNELS]; + /* LPC */ + Word16 Aind[CPE_CHANNELS][M + 1]; + float sns[CPE_CHANNELS][NB_DIV][M]; + /* TCX */ + float xn_buf[L_MDCT_OVLP_MAX + L_FRAME_PLUS + L_MDCT_OVLP_MAX]; + int16_t tcx_offset[CPE_CHANNELS]; + int16_t tcx_offsetFB[CPE_CHANNELS]; + int16_t left_rect[CPE_CHANNELS]; + int16_t L_spec[CPE_CHANNELS]; + /* Framing */ + int16_t L_frame[CPE_CHANNELS], nSubframes[CPE_CHANNELS], L_frameTCX[CPE_CHANNELS]; + int16_t tmp_concealment_method; + float gain_tcx; + int16_t nf_seed; + const int16_t *prm_sqQ; + int16_t L_frameTCX_global[CPE_CHANNELS]; + float tmp_ms_sig[CPE_CHANNELS][N_MAX]; + float concealment_noise[CPE_CHANNELS][L_FRAME48k]; + TONALMDCTCONC_NOISE_GEN_MODE noise_gen_mode_bfi; + + push_wmops( "mdct_core_invQ" ); + sts = hCPE->hCoreCoder; + bfi = sts[0]->bfi; + noise_gen_mode_bfi = NOISE_GEN_MODE_UNDEF; + + set_f( xn_buf, 0, L_MDCT_OVLP_MAX + L_FRAME_PLUS + L_MDCT_OVLP_MAX ); + set_s( total_nbbits, 0, CPE_CHANNELS ); + set_s( bitsRead, 0, CPE_CHANNELS ); + tmp_concealment_method = 0; + + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + sts[ch]->enablePlcWaveadjust = 0; + } + + /* temporarily restore LR representation of previous frame for PLC mode decision (done on the individual channels) */ + if ( bfi && !MCT_flag && ( hCPE->hStereoMdct->mdct_stereo_mode[0] > SMDCT_DUAL_MONO || hCPE->hStereoMdct->mdct_stereo_mode[1] > SMDCT_DUAL_MONO ) ) + { + L_frameTCX[0] = sts[0]->L_frameTCX_past; + L_frameTCX[1] = sts[1]->L_frameTCX_past; + mvr2r( sts[0]->hTonalMDCTConc->lastBlockData.spectralData, tmp_ms_sig[0], L_frameTCX[0] ); + mvr2r( sts[1]->hTonalMDCTConc->lastBlockData.spectralData, tmp_ms_sig[1], L_frameTCX[0] ); + stereo_decoder_tcx( hCPE->hStereoMdct, ms_mask, x_0[1], &sts[0]->hTonalMDCTConc->lastBlockData.spectralData, &sts[1]->hTonalMDCTConc->lastBlockData.spectralData, &hCPE->hStereoMdct->mdct_stereo_mode[0], sts[0]->core, sts[1]->core, sts[0]->igf, L_frameTCX[0], L_frameTCX[1], 0, sts[0]->last_core, sts[1]->last_core, 1 ); + } + + if ( bfi ) + { + if ( sts[0]->core == sts[1]->core ) + { + noise_gen_mode_bfi = EQUAL_CORES; + } + else if ( sts[0]->core == TCX_20 && sts[1]->core == TCX_10 ) + { + noise_gen_mode_bfi = TCX10_IN_0_TCX20_IN_1; + } + else if ( sts[0]->core == TCX_10 && sts[1]->core == TCX_20 ) + { + noise_gen_mode_bfi = TCX20_IN_0_TCX10_IN_1; + } + } + + /* parameter decoding */ + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + st = sts[ch]; + + if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) + { + st->total_brate = st->bits_frame_channel; + continue; + } + prm[ch] = param[ch]; /* to avoid compilation warnings */ + + /*Adjust bit per frame*/ + if ( !bfi ) + { + st->bits_frame_core = st->bits_frame_channel; + + sts[ch]->total_brate = ( sts[ch]->bits_frame_channel + sts[ch]->side_bits_frame_channel + sts[ch]->core * NF_GAIN_BITS ) * FRAMES_PER_SEC; + } + + /* Framing parameters */ + L_frame[ch] = st->L_frame; + + /*--------------------------------------------------------------------------------* + * BITSTREAM DECODING + *--------------------------------------------------------------------------------*/ + + total_nbbits[ch] = st->bits_frame_channel; + + if ( !bfi ) + { + st->second_last_core = st->last_core; + if ( hCPE->cpe_id == 0 && ch == 0 ) + { + /* add mct and side bits to first handle bitrate to avoid false BER detection */ + st->total_brate += ( st->next_bit_pos * FRAMES_PER_SEC ); + + dec_prm_tcx_spec( st, param[ch], &total_nbbits[ch], &bitsRead[ch], p_param[ch], nTnsBitsTCX10[ch] ); + + /*revert to actual total bitrate assigned to ch0 */ + sts[ch]->total_brate = ( sts[ch]->bits_frame_channel + sts[ch]->side_bits_frame_channel + sts[ch]->core * NF_GAIN_BITS ) * FRAMES_PER_SEC; + } + else + { + dec_prm_tcx_spec( st, param[ch], &total_nbbits[ch], &bitsRead[ch], p_param[ch], nTnsBitsTCX10[ch] ); + } + + assert( st->BER_detect != 1 ); + } + else + { + if ( st->nbLostCmpt > 1 ) + { + st->flagGuidedAcelp = 0; + } + + /* PLC: [Common: mode decision] + * PLC: Decide which Concealment to use. Update pitch lags if needed */ + st->core = GetPLCModeDecision( st ); + } + + if ( ( !st->bfi || st->hTcxCfg->psychParamsCurrent == NULL ) && st->core > ACELP_CORE ) + { + int16_t last_frame_was_concealed_cng; + last_frame_was_concealed_cng = ( st->last_core == ACELP_CORE ) && ( st->last_core != st->last_core_from_bs ); + SetCurrentPsychParams( st->core, last_frame_was_concealed_cng, st->hTcxCfg ); + } + + /* PLC: [Common: Memory update] + * PLC: Update the number of lost frames */ + if ( !bfi ) + { + if ( st->prev_bfi == 1 ) + { + st->prev_nbLostCmpt = st->nbLostCmpt; + } + else + { + st->prev_nbLostCmpt = 0; + } + + st->nbLostCmpt = 0; + } + } + + if ( bfi && !MCT_flag && ( hCPE->hStereoMdct->mdct_stereo_mode[0] > SMDCT_DUAL_MONO || hCPE->hStereoMdct->mdct_stereo_mode[1] > SMDCT_DUAL_MONO ) ) + { + /* avoid using TD-PLC in only one channel when stereo mode isn't dual mono */ + if ( sts[0]->core != sts[1]->core && ( sts[0]->core == ACELP_CORE || sts[1]->core == ACELP_CORE ) ) + { + if ( sts[0]->core == ACELP_CORE ) + { + sts[0]->core = sts[0]->last_core; + } + else if ( sts[1]->core == ACELP_CORE ) + { + sts[1]->core = sts[1]->last_core; + } + } + + mvr2r( tmp_ms_sig[0], sts[0]->hTonalMDCTConc->lastBlockData.spectralData, L_frameTCX[0] ); + mvr2r( tmp_ms_sig[1], sts[1]->hTonalMDCTConc->lastBlockData.spectralData, L_frameTCX[0] ); + } + + /*--------------------------------------------------------------------------------* + * LPC PARAMETERS + *--------------------------------------------------------------------------------*/ + + if ( bfi == 0 ) + { + if ( !MCT_flag && sts[0]->sr_core == 25600 && ( ( hCPE->element_brate == IVAS_48k || hCPE->element_brate == IVAS_64k ) ) ) + { + dequantize_sns( param_lpc, sns, sts ); + } + else + { + if ( sts[0]->core == TCX_20_CORE && sts[1]->core == TCX_20_CORE && sts[0]->mct_chan_mode != MCT_CHAN_MODE_IGNORE && sts[1]->mct_chan_mode != MCT_CHAN_MODE_IGNORE ) + { + sns_avq_dec_stereo( param_lpc[0], param_lpc[1], sts[0]->L_frame, &sns[0][0][0], &sns[1][0][0] ); + } + else + { + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + st = sts[ch]; + if ( st->mct_chan_mode != MCT_CHAN_MODE_IGNORE ) + { + sns_avq_dec( param_lpc[ch], sns[ch], st->L_frame, st->numlpc ); + } + } + } + } + } + + + /*--------------------------------------------------------------* + * Rate switching + *---------------------------------------------------------------*/ + + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + st = sts[ch]; + + if ( st->rate_switching_reset ) + { + lsp2a_stab( st->lsp_old, st->old_Aq_12_8, M ); + } + } + + /*--------------------------------------------------------------------------------* + * TCX20/10/5 + *--------------------------------------------------------------------------------*/ + + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + st = sts[ch]; + + if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) + { + set_f( x[ch][0], 0.f, st->hTcxCfg->tcx_coded_lines ); + /* usually set in decoder_tcx_invQ(), needed for concealment */ + st->hTcxDec->damping = 0.f; + st->hTcxDec->gainHelper = 1.f; + st->hTcxDec->stepCompensate = 0.f; + + continue; + } + + if ( !bfi || ( bfi && st->core != ACELP_CORE ) ) + { + nSubframes[ch] = ( st->core == TCX_10_CORE ) ? NB_DIV : 1; + + for ( k = 0; k < nSubframes[ch]; k++ ) + { + /* Stability Factor */ + if ( !bfi ) + { + mvr2r( sns[ch][k], &Aq[ch][k * M], M ); + } + else + { + st->stab_fac = 1.0f; + } + + /* Set pointer to parameters */ + prm[ch] = param[ch] + ( k * DEC_NPRM_DIV ); + L_frameTCX_global[ch] = st->hTcxDec->L_frameTCX / nSubframes[ch]; + L_spec[ch] = st->hTcxCfg->tcx_coded_lines / nSubframes[ch]; + + init_tcx_info( st, st->L_frame / nSubframes[ch], st->hTcxDec->L_frameTCX / nSubframes[ch], k, bfi, &tcx_offset[ch], &tcx_offsetFB[ch], &L_frame[ch], &L_frameTCX[ch], &left_rect[ch], &L_spec[ch] ); + + tmp_concealment_method = 0; + nf_seed = prm[ch][1 + NOISE_FILL_RANGES + LTPSIZE]; + if ( !bfi && st->hTcxCfg->fIsTNSAllowed && ( ch > 0 ) && ( nf_seed < 0 ) ) + { + mvs2s( param[0] + k * DEC_NPRM_DIV + 1 + NOISE_FILL_RANGES + LTPSIZE, prm[ch] + 1 + NOISE_FILL_RANGES + LTPSIZE, nf_seed * -1 ); + } + nf_seed = 0; + + decoder_tcx_invQ( st, prm[ch], Aq[ch], Aind[ch], L_spec[ch], L_frame[ch], L_frameTCX[ch], x[ch][k], NULL, xn_buf, &fUseTns[ch][k], &tnsData[ch][k], &gain_tcx, &prm_sqQ, &nf_seed, bfi, k ); + + mvr2r( x[ch][k], x_0[ch][k], L_frameTCX[ch] ); + + if ( bfi && !MCT_flag ) + { + TonalMdctConceal_create_concealment_noise( concealment_noise[ch], hCPE, L_frameTCX[ch], L_frame[ch], ch, k, st->core, st->hTcxDec->cummulative_damping_tcx, noise_gen_mode_bfi ); + } + + decoder_tcx_noisefilling( st, concealment_noise[ch], Aq[ch], L_frameTCX_global[ch], L_spec[ch], L_frame[ch], L_frameTCX[ch], x[ch][k], NULL, &tmp_concealment_method, gain_tcx, prm_sqQ, nf_seed, bfi, MCT_flag, k ); + + decoder_tcx_noiseshaping_igf( st, L_spec[ch], L_frame[ch], L_frameTCX[ch], left_rect[ch], x[ch][k], NULL, &tmp_concealment_method, bfi ); + } + } + } + + pop_wmops(); + return; +} + + +/*-----------------------------------------------------------------* + * ivas_mdct_core_reconstruct() + * + * reconstruct time signal + *-----------------------------------------------------------------*/ + +void ivas_mdct_core_reconstruct( + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + float *x[][NB_DIV], /* i/o: synthesis @internal_FS */ + float signal_outFB[CPE_CHANNELS][L_FRAME_PLUS], /* o : synthesis @output_FS */ + int16_t fUseTns[CPE_CHANNELS][NB_DIV], /* i : flage TNS enabled */ + const int16_t MCT_flag /* i : hMCT handle allocated (1) or not (0)*/ +) +{ + int16_t ch, k, bfi; + Decoder_State **sts, *st; + /* Framing */ + int16_t L_frame[CPE_CHANNELS], L_frameTCX[CPE_CHANNELS], nSubframes[CPE_CHANNELS]; + int16_t L_frame_global[CPE_CHANNELS], L_frame_globalTCX[CPE_CHANNELS]; + /* Synth */ + float synth_buf[OLD_SYNTH_SIZE_DEC + L_FRAME_PLUS + M]; + float *synth; + float synth_bufFB[OLD_SYNTH_SIZE_DEC + L_FRAME_PLUS + M]; + float *synthFB; + /* TCX */ + float xn_buf[L_MDCT_OVLP_MAX + L_FRAME_PLUS + L_MDCT_OVLP_MAX]; + int16_t tcx_offset[CPE_CHANNELS]; + int16_t tcx_offsetFB[CPE_CHANNELS]; + int16_t left_rect[CPE_CHANNELS]; + int16_t L_spec[CPE_CHANNELS]; + + int16_t pitch[CPE_CHANNELS][NB_SUBFR16k]; + float pit_gain[CPE_CHANNELS][NB_SUBFR16k]; + int16_t skip_decoding; + + set_f( xn_buf, 0, L_MDCT_OVLP_MAX + L_FRAME_PLUS + L_MDCT_OVLP_MAX ); + + /* Initializations */ + sts = hCPE->hCoreCoder; + bfi = sts[0]->bfi; + + /* TNS, ITF, IMDCT and updates */ + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + st = sts[ch]; + + skip_decoding = 0; + if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) + { + skip_decoding = 1; + } + + nSubframes[ch] = ( st->core == TCX_20_CORE ) ? 1 : NB_DIV; + synth = synth_buf + st->hTcxDec->old_synth_len; + synthFB = synth_bufFB + st->hTcxDec->old_synth_lenFB; + mvr2r( st->hTcxDec->old_synth, synth_buf, st->hTcxDec->old_synth_len ); + mvr2r( st->hTcxDec->old_synthFB, synth_bufFB, st->hTcxDec->old_synth_lenFB ); + set_zero( synth, L_FRAME_PLUS + M ); + set_zero( synthFB, L_FRAME_PLUS + M ); + + if ( st->core != ACELP_CORE ) + { + for ( k = 0; k < nSubframes[ch]; k++ ) + { + L_spec[ch] = st->hTcxCfg->tcx_coded_lines / nSubframes[ch]; + L_frame_global[ch] = st->L_frame / nSubframes[ch]; + L_frame_globalTCX[ch] = st->hTcxDec->L_frameTCX / nSubframes[ch]; + + init_tcx_info( st, L_frame_global[ch], L_frame_globalTCX[ch], k, bfi, &tcx_offset[ch], + &tcx_offsetFB[ch], &L_frame[ch], &L_frameTCX[ch], &left_rect[ch], &L_spec[ch] ); + + if ( !skip_decoding ) + { + decoder_tcx_imdct( st, L_frame_global[ch], L_frame_globalTCX[ch], L_spec[ch], tcx_offset[ch], tcx_offsetFB[ch], L_frame[ch], L_frameTCX[ch], left_rect[ch], &x[ch][k][0], xn_buf, + ( ( hCPE->nchan_out == 1 && st->hTcxDec->kernel_type[k] == MDST_IV ) || st->hTcxCfg->tcx_last_overlap_mode == TRANSITION_OVERLAP ) ? MDCT_IV : st->hTcxDec->kernel_type[k], + fUseTns[ch][k], &synth[k * L_frame[ch]], &synthFB[k * L_frameTCX[ch]], bfi, k, 0 ); + } + else + { + set_f( &synth[k * L_frame[ch]], 0.f, L_frame[ch] ); + set_f( &synthFB[k * L_frame[ch]], 0.f, L_frameTCX[ch] ); + } + } + + if ( !bfi && st->hTonalMDCTConc != NULL ) + { + TonalMDCTConceal_SaveTimeSignal( st->hTonalMDCTConc, synthFB, L_frameTCX[ch] ); + } + + decoder_tcx_post( st, synth, synthFB, NULL, bfi, MCT_flag ); + } + else /*ACELP core for ACELP-PLC */ + { + assert( st->bfi == 1 ); + /* PLC: [TCX: TD PLC] */ + if ( MCT_flag ) + { + con_tcx( st, &synthFB[0], -1.f, NULL, 0, NULL ); + } + else + { + con_tcx( st, &synthFB[0], hCPE->hStereoMdct->lastCoh, &sts[0]->seed_acelp, ( sts[1]->core != ACELP_CORE ) ? 1 : 0, &st->hFdCngDec->hFdCngCom->A_cng[0] ); + } + + lerp( synthFB, synth, st->L_frame, st->hTcxDec->L_frameTCX ); + st->con_tcx = 1; + set_f( &st->mem_pitch_gain[2], st->lp_gainp, st->nb_subfr ); + + /* PLC: [TCX: Tonal Concealment] */ + /* Signal that this frame is not TCX */ + if ( st->hTonalMDCTConc != NULL ) + { + TonalMDCTConceal_UpdateState( st->hTonalMDCTConc, 0, 0, 0, 0 ); + } + } + + /*--------------------------------------------------------------------------------* + * Updates + *--------------------------------------------------------------------------------*/ + + st = sts[ch]; + + if ( bfi && st->last_core != ACELP_CORE && st->core == ACELP_CORE ) + { + /* Update FEC_scale_syn parameters */ + if ( st->hTcxLtpDec->tcxltp_gain == 0 ) + { + fer_energy( st->L_frame, UNVOICED, synth, (float) ( st->L_frame / 2 ), &st->enr_old, st->L_frame ); + } + else + { + fer_energy( st->L_frame, st->clas_dec, synth, st->old_fpitch, &st->enr_old, st->L_frame ); + } + } + + /* Update */ + mvr2r( synth_buf + st->L_frame, st->hTcxDec->old_synth, st->hTcxDec->old_synth_len ); + mvr2r( st->hTcxDec->old_synthFB + st->hTcxDec->L_frameTCX - NS2SA( st->output_Fs, PH_ECU_MEM_NS ), st->hTcxDec->synth_history, NS2SA( st->output_Fs, PH_ECU_MEM_NS ) ); + mvr2r( synth_bufFB + st->hTcxDec->L_frameTCX, st->hTcxDec->old_synthFB, st->hTcxDec->old_synth_lenFB ); + if ( st->hHQ_core != NULL ) + { + mvr2r( st->hHQ_core->old_out + NS2SA( st->output_Fs, N_ZERO_MDCT_NS ), st->hTcxDec->old_synthFB + st->hTcxDec->old_synth_lenFB, NS2SA( st->output_Fs, PH_ECU_LOOKAHEAD_NS ) ); + } + + mvr2r( st->lsp_q_cng, st->old_lsp_q_cng, M ); + mvr2r( st->lsf_q_cng, st->old_lsf_q_cng, M ); + + st->last_is_cng = 0; + + /* Postfiltering */ + post_decoder( st, synth_buf, pit_gain[ch], pitch[ch], x[ch][0], st->p_bpf_noise_buf ); + + if ( signal_outFB[ch] ) + { + mvr2r( synthFB, signal_outFB[ch], st->hTcxDec->L_frameTCX ); + } + + + /* updates */ + st->last_voice_factor = 0.0f; + st->last_coder_type = st->coder_type; + } + + /* calculate coherence of signal needed when next frame is lost */ + if ( !bfi && !MCT_flag && hCPE->element_mode == IVAS_CPE_MDCT ) + { + int16_t i; + float nrgL, nrgR, xcorr; + + nrgL = nrgR = xcorr = EPSILON; + + for ( i = 0; i < sts[0]->hTcxDec->L_frameTCX; i++ ) + { + nrgL += signal_outFB[0][i] * signal_outFB[0][i]; + nrgR += signal_outFB[1][i] * signal_outFB[1][i]; + xcorr += signal_outFB[0][i] * signal_outFB[1][i]; + } + + hCPE->hStereoMdct->lastCoh = fabsf( xcorr ) * inv_sqrt( nrgL * nrgR ); + hCPE->hStereoMdct->lastCoh = min( hCPE->hStereoMdct->lastCoh, 1.f ); + } + + return; +} + + +/*-----------------------------------------------------------------* + * ivas_mdct_core_tns_ns() + * + * reconstruct time signal + *-----------------------------------------------------------------*/ + +void ivas_mdct_core_tns_ns( + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + int16_t fUseTns[CPE_CHANNELS][NB_DIV], /* i : two entries for each channel in TCX10 */ + STnsData tnsData[CPE_CHANNELS][NB_DIV], /* o : TNS parameter */ + float *x[CPE_CHANNELS][NB_DIV], /* o : synthesis @internal_FS */ + float Aq[CPE_CHANNELS][( NB_SUBFR16k + 1 ) * ( M + 1 )], /* o : LP coefficients */ + const int16_t MCT_flag /* i : hMCT handle allocated (1) or not (0) */ +) +{ + int16_t ch, k, bfi; + Decoder_State **sts, *st; + /* Framing */ + int16_t L_frame[CPE_CHANNELS], L_frameTCX[CPE_CHANNELS], nSubframes[CPE_CHANNELS]; + int16_t L_frame_global[CPE_CHANNELS], L_frameTCX_glob[CPE_CHANNELS]; + + /* TCX */ + float xn_buf[L_MDCT_OVLP_MAX + L_FRAME_PLUS + L_MDCT_OVLP_MAX]; + int16_t tcx_offset[CPE_CHANNELS]; + int16_t tcx_offsetFB[CPE_CHANNELS]; + int16_t left_rect[CPE_CHANNELS]; + int16_t L_spec[CPE_CHANNELS]; + float sns_int_scf[FDNS_NPTS]; + + /* Initializations */ + sts = hCPE->hCoreCoder; + bfi = sts[0]->bfi; + + set_f( xn_buf, 0, L_MDCT_OVLP_MAX + L_FRAME_PLUS + L_MDCT_OVLP_MAX ); + + + /* TNS, ITF, IMDCT and updates */ + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + st = sts[ch]; + nSubframes[ch] = ( st->core == TCX_20_CORE ) ? 1 : NB_DIV; + L_frame_global[ch] = st->L_frame / nSubframes[ch]; + L_frameTCX_glob[ch] = st->hTcxDec->L_frameTCX / nSubframes[ch]; + L_spec[ch] = st->hTcxCfg->tcx_coded_lines / nSubframes[ch]; + + if ( ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) || ( st->bfi && st->core == ACELP_CORE ) ) /* indicates LFE with no content, or odd number of channels */ + { + if ( st->hTonalMDCTConc != NULL ) + { + TonalMDCTConceal_UpdateState( st->hTonalMDCTConc, st->hTcxDec->L_frameTCX, 0, bfi, 0 ); + } + + /* nothing to do for missing LFE */ + continue; + } + + for ( k = 0; k < nSubframes[ch]; k++ ) + { + init_tcx_info( st, L_frame_global[ch], L_frameTCX_glob[ch], k, bfi, &tcx_offset[ch], + &tcx_offsetFB[ch], &L_frame[ch], &L_frameTCX[ch], &left_rect[ch], &L_spec[ch] ); + + if ( !bfi ) + { + sns_interpolate_scalefactors( &sns_int_scf[0], &Aq[ch][k * M], DEC ); + + if ( MCT_flag && st->hTonalMDCTConc != NULL && ( ( k + 1 ) == nSubframes[ch] ) ) + { + TonalMDCTConceal_SaveFreqSignal( st->hTonalMDCTConc, x[ch][k], L_frameTCX[ch], L_frame[ch], &sns_int_scf[0], get_igf_startline( st, L_frame[ch], L_frameTCX[ch] ) ); + } + } + else + { + if ( st->hTonalMDCTConc != NULL ) + { + if ( !MCT_flag && st->hTcxDec->cummulative_damping_tcx != 1.f ) + { + float *scf_last, *scf_bg; + float fade_in, fade_out; + + scf_last = &st->hTonalMDCTConc->lastBlockData.scaleFactors[0]; + scf_bg = &st->hTonalMDCTConc->scaleFactorsBackground[0]; + + st->hTonalMDCTConc->scf_fadeout *= 0.95f; + + fade_out = st->hTonalMDCTConc->scf_fadeout; + fade_in = 1 - fade_out; + + for ( int16_t i = 0; i < st->hTonalMDCTConc->nScaleFactors; i++ ) + { + sns_int_scf[i] = fade_out * scf_last[i] + fade_in * scf_bg[i]; + } + } + else + { + st->hTonalMDCTConc->scf_fadeout = 1.0f; + mvr2r( st->hTonalMDCTConc->lastBlockData.scaleFactors, &sns_int_scf[0], st->hTonalMDCTConc->nScaleFactors ); + } + } + } + + decoder_tcx_tns( st, L_frame_global[ch], L_spec[ch], L_frame[ch], L_frameTCX[ch], &x[ch][k][0], fUseTns[ch][k], &tnsData[ch][k], bfi, k, 1 ); + + sns_shape_spectrum( x[ch][k], st->hTcxCfg->psychParamsCurrent, &sns_int_scf[0], st->hTcxCfg->psychParamsCurrent->nBins ); + v_multc( x[ch][k] + st->hTcxCfg->psychParamsCurrent->nBins, sns_int_scf[FDNS_NPTS - 1], x[ch][k] + st->hTcxCfg->psychParamsCurrent->nBins, L_spec[ch] - st->hTcxCfg->psychParamsCurrent->nBins ); + + decoder_tcx_tns( st, L_frame_global[ch], L_spec[ch], L_frame[ch], L_frameTCX[ch], &x[ch][k][0], fUseTns[ch][k], &tnsData[ch][k], bfi, k, 0 ); + } + + if ( bfi && st->tonal_mdct_plc_active ) + { + TonalMDCTConceal_Apply( st->hTonalMDCTConc, x[ch][0], st->hTcxCfg->psychParamsCurrent ); + } + + if ( ( bfi || MCT_flag ) && st->hTonalMDCTConc != NULL ) + { + TonalMDCTConceal_UpdateState( st->hTonalMDCTConc, L_frameTCX[ch], ( st->hTcxDec->tcxltp_last_gain_unmodified > 0 ) ? st->old_fpitch : 0, bfi, bfi && st->tonal_mdct_plc_active ); + } + } + + return; +} diff --git a/lib_dec/ivas_mono_dmx_renderer.c b/lib_dec/ivas_mono_dmx_renderer.c new file mode 100644 index 0000000000000000000000000000000000000000..0936209639d9388e7910919011740336be89bf28 --- /dev/null +++ b/lib_dec/ivas_mono_dmx_renderer.c @@ -0,0 +1,234 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_cnst.h" +#include "ivas_rom_com.h" +#include "ivas_rom_dec.h" +#include "wmc_auto.h" + + +/*------------------------------------------------------------------------- + * Local constants + *------------------------------------------------------------------------*/ + +#define DOWNMIX_ALPHA 0.95f /* Smoothing coefficient */ +#define DOWNMIX_MAX_GAIN 4.0f /* Maximum allowed gain */ +#define MONO_DOWNMIX_RENDERER_MAX_INPUT_CHANS 4 + + +/*------------------------------------------------------------------------- + * ivas_mono_dmx_renderer_open() + * + * Open decoder downmix handle + *-------------------------------------------------------------------------*/ + +ivas_error ivas_mono_dmx_renderer_open( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +) +{ + MONO_DOWNMIX_RENDERER_HANDLE hDownmix; + + if ( ( hDownmix = (MONO_DOWNMIX_RENDERER_HANDLE) malloc( sizeof( MONO_DOWNMIX_RENDERER_STRUCT ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for downmixing\n" ) ); + } + + hDownmix->inputEnergy = 0; + hDownmix->protoEnergy = 0; + st_ivas->hMonoDmxRenderer = hDownmix; + + return IVAS_ERR_OK; +} + + +/*------------------------------------------------------------------------- + * ivas_mono_dmx_renderer_close() + * + * Close decoder downmix handle + *-------------------------------------------------------------------------*/ + +void ivas_mono_dmx_renderer_close( + MONO_DOWNMIX_RENDERER_HANDLE *hMonoDmxRenderer /* i/ i/o: Mono downmix structure */ +) +{ + if ( hMonoDmxRenderer == NULL || *hMonoDmxRenderer == NULL ) + { + return; + } + + free( *hMonoDmxRenderer ); + *hMonoDmxRenderer = NULL; + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_mono_downmix_render_passive() + * + * Downmix process + *------------------------------------------------------------------------*/ + +void ivas_mono_downmix_render_passive( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float *output_f[], /* i/o: synthesized core-coder transport channels/mono output */ + const int16_t output_frame /* i : output frame length */ +) +{ + int16_t i, j, numInputChannels; + float proto_signal[L_FRAME48k], eq; + MONO_DOWNMIX_RENDERER_HANDLE hDownmix; + + numInputChannels = st_ivas->nSCE; + if ( st_ivas->ivas_format == SBA_ISM_FORMAT ) + { + numInputChannels = st_ivas->nchan_ism; + } + + if ( st_ivas->ivas_format == MASA_ISM_FORMAT ) + { + if ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) + { + numInputChannels = st_ivas->nchan_transport + 1; + } + else + { + numInputChannels = st_ivas->nchan_transport + st_ivas->nchan_ism; + } + } + + hDownmix = st_ivas->hMonoDmxRenderer; + set_zero( proto_signal, output_frame ); + + /* Compute the Proto Signal */ + for ( i = 0; i < numInputChannels; i++ ) + { + v_add( output_f[i], proto_signal, proto_signal, output_frame ); + } + + /* compute the input energy, proto energy after smoothing */ + hDownmix->inputEnergy *= DOWNMIX_ALPHA; + hDownmix->protoEnergy *= DOWNMIX_ALPHA; + for ( i = 0; i < output_frame; i++ ) + { + hDownmix->protoEnergy += proto_signal[i] * proto_signal[i]; + + for ( j = 0; j < numInputChannels; j++ ) + { + hDownmix->inputEnergy += ( output_f[j][i] * output_f[j][i] ); + } + } + + /* compute the eq factor */ + eq = min( DOWNMIX_MAX_GAIN, sqrtf( hDownmix->inputEnergy / ( EPSILON + hDownmix->protoEnergy ) ) ); + + /* equalize the downmix */ + v_multc( proto_signal, eq, output_f[0], output_frame ); + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_mono_stereo_downmix_mcmasa() + * + * Downmix process in McMASA + *------------------------------------------------------------------------*/ + +void ivas_mono_stereo_downmix_mcmasa( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float *output_f[], /* i/o: synthesized core-coder transport channels/mono or stereo output */ + int16_t output_frame /* i : output frame length per channel */ +) +{ + int16_t i; + + float dmx_tmp[L_FRAME48k]; + + set_zero( dmx_tmp, output_frame ); + + /* Dowmix center channel to L and R */ + if ( st_ivas->hDecoderConfig->nchan_out == 2 && st_ivas->hOutSetup.separateChannelEnabled ) + { + v_multc_acc( output_f[st_ivas->hOutSetup.separateChannelIndex], INV_SQRT2, output_f[0], output_frame ); + v_multc_acc( output_f[st_ivas->hOutSetup.separateChannelIndex], INV_SQRT2, output_f[1], output_frame ); + } + /* Mono downmix */ + else if ( st_ivas->hDecoderConfig->nchan_out == 1 ) + { + /* Downmix L and R to dmx_tmp */ + for ( i = 0; i < st_ivas->nchan_transport; i++ ) + { + v_multc_acc( output_f[i], INV_SQRT2, dmx_tmp, output_frame ); + } + /* Add center channel */ + if ( st_ivas->hOutSetup.separateChannelEnabled ) + { + v_add( output_f[st_ivas->hOutSetup.separateChannelIndex], dmx_tmp, dmx_tmp, output_frame ); + } + + /* Move to output */ + mvr2r( dmx_tmp, output_f[0], output_frame ); + } + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_apply_non_diegetic_panning() + * + * Apply non-diegetic panning + *------------------------------------------------------------------------*/ + +void ivas_apply_non_diegetic_panning( + float *output_f[], /* i/o: core-coder transport mono channel/stereo output */ + const float non_diegetic_pan_gain, /* i : non-diegetic panning gain */ + const int16_t output_frame /* i : output frame length per channel */ +) +{ + float pan_left, pan_right; + + pan_left = ( non_diegetic_pan_gain + 1.f ) * 0.5f; + pan_right = 1.f - pan_left; + + v_multc( output_f[0], pan_right, output_f[1], output_frame ); + v_multc( output_f[0], pan_left, output_f[0], output_frame ); + + return; +} diff --git a/lib_dec/ivas_objectRenderer_internal.c b/lib_dec/ivas_objectRenderer_internal.c new file mode 100644 index 0000000000000000000000000000000000000000..939eac3f0851c4f2c2f92056e548e1da176637ad --- /dev/null +++ b/lib_dec/ivas_objectRenderer_internal.c @@ -0,0 +1,266 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_prot_rend.h" +#include +#include "ivas_rom_com.h" +#include "wmc_auto.h" + + +/*---------------------------------------------------------------------* + * ivas_td_binaural_open() + * + * Open and initialize TD Object binaural renderer + *---------------------------------------------------------------------*/ + +ivas_error ivas_td_binaural_open( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +) +{ + int16_t num_src; + + num_src = st_ivas->nchan_transport; + if ( ( st_ivas->ism_mode == ISM_MASA_MODE_DISC ) || ( st_ivas->ism_mode == ISM_SBA_MODE_DISC ) ) + { + num_src = st_ivas->nchan_ism; + } + + return ivas_td_binaural_open_unwrap( &st_ivas->hHrtfTD, st_ivas->hDecoderConfig->output_Fs, num_src, st_ivas->ivas_format, + st_ivas->transport_config, st_ivas->hRenderConfig->directivity, st_ivas->hTransSetup, &st_ivas->hBinRendererTd, &st_ivas->binaural_latency_ns ); +} + + +/*---------------------------------------------------------------------* + * ivas_td_binaural_renderer() + * + * Receives the current frames for the object streams, updates metadata + * and renders the current frame. + *---------------------------------------------------------------------*/ + +ivas_error ivas_td_binaural_renderer( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float *output[], /* i/o: SCE channels / Binaural synthesis */ + const int16_t output_frame /* i : output frame length */ +) +{ + int16_t ism_md_subframe_update; + int16_t nchan_transport; + + nchan_transport = ( st_ivas->ism_mode == ISM_MASA_MODE_DISC || st_ivas->ism_mode == ISM_SBA_MODE_DISC ) ? st_ivas->nchan_ism : st_ivas->nchan_transport; + + if ( st_ivas->hDecoderConfig->Opt_delay_comp ) + { + ism_md_subframe_update = 1; + } + else + { + ism_md_subframe_update = 2; + } + + if ( st_ivas->ivas_format == MASA_ISM_FORMAT ) + { + ism_md_subframe_update = 2; + } + + return ivas_td_binaural_renderer_unwrap( st_ivas->hReverb, st_ivas->transport_config, st_ivas->hBinRendererTd, nchan_transport, LFE_CHANNEL, st_ivas->ivas_format, st_ivas->hIsmMetaData, + ( st_ivas->hCombinedOrientationData != NULL ) ? st_ivas->hCombinedOrientationData->enableCombinedOrientation : NULL, + ( st_ivas->hCombinedOrientationData != NULL ) ? st_ivas->hCombinedOrientationData->Quaternions : NULL, + ( st_ivas->hCombinedOrientationData != NULL ) ? st_ivas->hCombinedOrientationData->listenerPos : NULL, + ism_md_subframe_update, output, output_frame, MAX_PARAM_SPATIAL_SUBFRAMES ); +} + + +/*---------------------------------------------------------------------* + * ivas_td_binaural_renderer_sf() + * + * Receives the current frames for the object streams, updates metadata + * and renders the current frame. + *---------------------------------------------------------------------*/ + +ivas_error ivas_td_binaural_renderer_sf( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float *output[], /* i/o: SCE channels / Binaural synthesis */ + const int16_t n_samples_granularity /* i : granularity of the renderer/buffer */ +) +{ + int16_t first_sf, last_sf, subframe_idx; + float reverb_signal[BINAURAL_CHANNELS][L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES]; + float *p_reverb_signal[BINAURAL_CHANNELS]; + float *output_f_local[BINAURAL_CHANNELS]; + float *tc_local[MAX_TRANSPORT_CHANNELS]; + int16_t ch, slot_size, slots_to_render, output_frame; + ivas_error error; + + int16_t ism_md_subframe_update_jbm; + int16_t c_indx, nS; + int16_t nchan_ism_internal, nchan_ism, ch_offset; + + /* Set the number of ISMs */ + if ( st_ivas->ivas_format == MASA_ISM_FORMAT ) + { + nchan_ism_internal = st_ivas->nchan_ism; + nchan_ism = st_ivas->nchan_ism; + ch_offset = 2; + } + else if ( st_ivas->ivas_format == SBA_ISM_FORMAT ) + { + nchan_ism_internal = st_ivas->nchan_ism; + nchan_ism = st_ivas->nchan_ism; + ch_offset = 0; + } + else + { + nchan_ism_internal = st_ivas->hTcBuffer->nchan_transport_internal; + nchan_ism = st_ivas->nchan_transport; + ch_offset = 0; + } + + /* Number of subframes to delay metadata to sync with audio */ + if ( st_ivas->hDecoderConfig->Opt_delay_comp ) + { + ism_md_subframe_update_jbm = max( 0, st_ivas->hTcBuffer->nb_subframes - 3 ); + } + else + { + ism_md_subframe_update_jbm = st_ivas->hTcBuffer->nb_subframes - 2; + } + + if ( st_ivas->ivas_format == MASA_ISM_FORMAT ) + { + ism_md_subframe_update_jbm = max( 0, st_ivas->hTcBuffer->nb_subframes - 2 ); + } + + for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + p_reverb_signal[ch] = reverb_signal[ch]; + } + + for ( ch = 0; ch < nchan_ism_internal; ch++ ) + { + tc_local[ch] = st_ivas->hTcBuffer->tc[ch + ch_offset] + st_ivas->hTcBuffer->n_samples_rendered; + } + + for ( ch = 0; ch < st_ivas->hDecoderConfig->nchan_out; ch++ ) + { + output_f_local[ch] = output[ch]; + } + + slot_size = st_ivas->hTcBuffer->n_samples_granularity; + + /* loop for synthesis, assume we always have to render in multiples of 5ms subframes with spills */ + slots_to_render = min( st_ivas->hTcBuffer->num_slots - st_ivas->hTcBuffer->slots_rendered, n_samples_granularity / slot_size ); + first_sf = st_ivas->hTcBuffer->subframes_rendered; + last_sf = first_sf; + st_ivas->hTcBuffer->slots_rendered += slots_to_render; + + while ( slots_to_render > 0 ) + { + slots_to_render -= st_ivas->hTcBuffer->subframe_nbslots[last_sf]; + last_sf++; + } + + for ( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ ) + { + output_frame = st_ivas->hTcBuffer->subframe_nbslots[subframe_idx] * st_ivas->hTcBuffer->n_samples_granularity; + + /* Update object position(s) */ + c_indx = 0; + + for ( nS = 0; nS < nchan_ism; nS++ ) + { + if ( !( st_ivas->ivas_format == MC_FORMAT && nS == LFE_CHANNEL ) ) /* Skip LFE for MC */ + { + st_ivas->hBinRendererTd->Sources[c_indx]->InputFrame_p = tc_local[nS]; + st_ivas->hBinRendererTd->Sources[c_indx]->SrcRend_p->InputAvailable = TRUE; + c_indx++; + } + } + if ( subframe_idx == ism_md_subframe_update_jbm ) + { + if ( ( error = TDREND_Update_object_positions( st_ivas->hBinRendererTd, nchan_ism, st_ivas->ivas_format, st_ivas->hIsmMetaData ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* Update the listener's location/orientation */ + if ( ( error = TDREND_Update_listener_orientation( st_ivas->hBinRendererTd, + ( st_ivas->hCombinedOrientationData != NULL ) ? st_ivas->hCombinedOrientationData->enableCombinedOrientation[subframe_idx] : 0, + ( st_ivas->hCombinedOrientationData != NULL ) ? st_ivas->hCombinedOrientationData->Quaternions : NULL, + ( st_ivas->hCombinedOrientationData != NULL ) ? st_ivas->hCombinedOrientationData->listenerPos : NULL ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( st_ivas->hRenderConfig != NULL && st_ivas->hIntSetup.output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) + { + if ( ( error = ivas_reverb_process( st_ivas->hReverb, st_ivas->transport_config, 0, tc_local, p_reverb_signal, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* Render subframe */ + /* ism_md_subframe_update_jbm != subframe_idx: trigger update only for ism_md_subframe_update_jbm == subframe_idx, + where then the two TDREND_GetMix()-arguments subframe_idx and ism_md_subframe_update are equal, and we want to enforce the update inside TDREND_GetMix to use subframe_idx == 0 */ + if ( ( error = TDREND_GetMix( st_ivas->hBinRendererTd, output_f_local, output_frame, 0, ism_md_subframe_update_jbm != subframe_idx ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( st_ivas->hRenderConfig != NULL && st_ivas->hIntSetup.output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) + { + /* add reverb to rendered signals */ + v_add( reverb_signal[0], output_f_local[0], output_f_local[0], output_frame ); + v_add( reverb_signal[1], output_f_local[1], output_f_local[1], output_frame ); + } + + + for ( ch = 0; ch < nchan_ism_internal; ch++ ) + { + tc_local[ch] += output_frame; + } + + for ( ch = 0; ch < st_ivas->hDecoderConfig->nchan_out; ch++ ) + { + output_f_local[ch] += output_frame; + } + } + + st_ivas->hTcBuffer->subframes_rendered = last_sf; + + return IVAS_ERR_OK; +} diff --git a/lib_dec/ivas_omasa_dec.c b/lib_dec/ivas_omasa_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..dfa867ac0a9f4175b224b362d7c6373be0a143ec --- /dev/null +++ b/lib_dec/ivas_omasa_dec.c @@ -0,0 +1,790 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include "options.h" +#include +#include "ivas_cnst.h" +#include "ivas_prot.h" +#include "prot.h" +#include "ivas_prot_rend.h" +#include "ivas_rom_com.h" +#include "wmc_auto.h" + + +/*------------------------------------------------------------------------- + * Local constants + *------------------------------------------------------------------------*/ + +#define OMASA_TDREND_MATCHING_GAIN 0.7943f + + +/*-------------------------------------------------------------------* + * ivas_omasa_data_open() + * + * Allocate and initialize MASA_ISM rendering handle + *-------------------------------------------------------------------*/ + +ivas_error ivas_omasa_data_open( + Decoder_Struct *st_ivas /* i/o: IVAS decoder handle */ +) +{ + MASA_ISM_DATA_HANDLE hMasaIsmData; + int16_t ch, bin; + int16_t sf, obj_idx; + + if ( ( hMasaIsmData = (MASA_ISM_DATA_HANDLE) malloc( sizeof( MASA_ISM_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA ISM data\n" ) ); + } + + for ( bin = 0; bin < CLDFB_NO_CHANNELS_MAX; bin++ ) + { + for ( ch = 0; ch < 2; ch++ ) + { + hMasaIsmData->ismPreprocMatrix[ch][ch][bin] = 1.0f; + hMasaIsmData->ismPreprocMatrix[1 - ch][ch][bin] = 0.0f; + hMasaIsmData->eneMoveIIR[ch][bin] = 0.0f; + hMasaIsmData->enePreserveIIR[ch][bin] = 0.0f; + } + hMasaIsmData->preprocEneTarget[bin] = 0.0f; + hMasaIsmData->preprocEneRealized[bin] = 0.0f; + } + + hMasaIsmData->objectsMoved = 0; + hMasaIsmData->delayBuffer = NULL; + + for ( ch = 0; ch < MAX_NUM_OBJECTS; ch++ ) + { + hMasaIsmData->ism_is_edited[ch] = 0; + hMasaIsmData->q_elevation_old[ch] = 0.0f; + hMasaIsmData->q_azimuth_old[ch] = 0.0f; + } + + for ( obj_idx = 0; obj_idx < MAX_NUM_OBJECTS; obj_idx++ ) + { + set_s( hMasaIsmData->azimuth_ism[obj_idx], 0, MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_MASA_PARAM_DEC_SFR ); + set_s( hMasaIsmData->elevation_ism[obj_idx], 0, MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_MASA_PARAM_DEC_SFR ); + for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_MASA_PARAM_DEC_SFR; sf++ ) + { + set_zero( hMasaIsmData->energy_ratio_ism[obj_idx][sf], CLDFB_NO_CHANNELS_MAX ); + } + } + set_s( hMasaIsmData->azimuth_separated_ism, 0, MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_MASA_PARAM_DEC_SFR ); + set_s( hMasaIsmData->elevation_separated_ism, 0, MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_MASA_PARAM_DEC_SFR ); + + st_ivas->hMasaIsmData = hMasaIsmData; + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * ivas_omasa_data_close() + * + * Deallocate MASA_ISM rendering handle + *-------------------------------------------------------------------*/ + +void ivas_omasa_data_close( + MASA_ISM_DATA_HANDLE *hMasaIsmData /* i/o: MASA_ISM rendering handle */ +) +{ + int16_t i; + + if ( hMasaIsmData == NULL || *hMasaIsmData == NULL ) + { + return; + } + + if ( ( *hMasaIsmData )->delayBuffer != NULL ) + { + for ( i = 0; i < ( *hMasaIsmData )->delayBuffer_nchan; i++ ) + { + free( ( *hMasaIsmData )->delayBuffer[i] ); + } + free( ( *hMasaIsmData )->delayBuffer ); + ( *hMasaIsmData )->delayBuffer = NULL; + } + + free( *hMasaIsmData ); + *hMasaIsmData = NULL; + + return; +} + + +/*--------------------------------------------------------------------------* + * ivas_omasa_dec_config() + * + * oMASA decoder configuration + *--------------------------------------------------------------------------*/ + +ivas_error ivas_omasa_dec_config( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + uint16_t *nSamplesRendered, /* o : number of samples flushed from the previous frame (JBM) */ + int16_t *data /* o : output synthesis signal */ +) +{ + int16_t k, sce_id, nSCE_old, nchan_hp20_old, numCldfbAnalyses_old, numCldfbSyntheses_old, n_MD; + int32_t ivas_total_brate, ism_total_brate, cpe_brate; + ISM_MODE ism_mode_old; + IVAS_FORMAT ivas_format_orig; + int16_t nchan_out_buff, nchan_out_buff_old; + ivas_error error; + RENDERER_TYPE old_renderer_type; + + /* initializations */ + ism_total_brate = 0; + ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; + + /* save previous frame parameters */ + ism_mode_old = ivas_omasa_ism_mode_select( st_ivas->hDecoderConfig->last_ivas_total_brate, st_ivas->nchan_ism ); + st_ivas->ism_mode = ism_mode_old; + + ivas_format_orig = st_ivas->ivas_format; + st_ivas->ivas_format = st_ivas->last_ivas_format; + ivas_init_dec_get_num_cldfb_instances( st_ivas, &numCldfbAnalyses_old, &numCldfbSyntheses_old ); +#ifdef NONBE_FIX_839_MC_RS_CHANNEL_ALLOC + nchan_out_buff_old = ivas_get_nchan_buffers_dec( st_ivas, -1, -1 ); +#else + nchan_out_buff_old = ivas_get_nchan_buffers_dec( st_ivas, st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); +#endif + + st_ivas->ivas_format = ivas_format_orig; + + nSCE_old = st_ivas->nSCE; + nchan_hp20_old = getNumChanSynthesis( st_ivas ); + + /* set ism_mode of current frame */ + st_ivas->ism_mode = ivas_omasa_ism_mode_select( ivas_total_brate, st_ivas->nchan_ism ); + + /*-----------------------------------------------------------------* + * Renderer selection + *-----------------------------------------------------------------*/ + + old_renderer_type = st_ivas->renderer_type; + + /* MASA reconfig. */ + cpe_brate = calculate_cpe_brate_MASA_ISM( st_ivas->ism_mode, ivas_total_brate, st_ivas->nchan_ism ); + if ( st_ivas->ini_active_frame == 0 && ivas_total_brate != FRAME_NO_DATA && ( cpe_brate < MASA_STEREO_MIN_BITRATE ) && st_ivas->nCPE == 1 ) + { + st_ivas->hCPE[0]->nchan_out = 1; + } + else if ( ( error = ivas_masa_dec_reconfigure( st_ivas, nSamplesRendered, data ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( cpe_brate < MASA_STEREO_MIN_BITRATE ) + { + st_ivas->hCPE[0]->nchan_out = 1; + } + else + { + st_ivas->hCPE[0]->nchan_out = 2; + } + + /* OMASA reconfig. */ + if ( st_ivas->hMasaIsmData == NULL && st_ivas->ivas_format == MASA_ISM_FORMAT ) + { + if ( ( error = ivas_omasa_data_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + ivas_set_omasa_TC( st_ivas->ism_mode, st_ivas->nchan_ism, &st_ivas->nSCE, &st_ivas->nCPE ); + + /* re-configure hp20 memories */ + if ( ( error = ivas_hp20_dec_reconfig( st_ivas, nchan_hp20_old ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* reconfigure core-coders for ISMs */ + k = 0; + while ( k < SIZE_IVAS_BRATE_TBL && ivas_total_brate != ivas_brate_tbl[k] ) + { + k++; + } + + for ( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) + { + ism_total_brate += sep_object_brate[k - 2][st_ivas->nSCE - 1]; + } + + if ( ( error = ivas_corecoder_dec_reconfig( st_ivas, nSCE_old, 1, 2, 0, st_ivas->nSCE > 0 ? sep_object_brate[k - 2][st_ivas->nSCE - 1] : 0, ivas_total_brate - ism_total_brate ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ism_mode_old != st_ivas->ism_mode ) + { + /* ISM MD reconfig. */ + n_MD = 0; + + if ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) + { + n_MD = 1; + + if ( st_ivas->hIsmMetaData[0] == NULL ) + { + if ( ( error = ivas_ism_metadata_dec_create( st_ivas, 1, NULL ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + else if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC ) + { + n_MD = st_ivas->nchan_ism; + + ivas_ism_metadata_close( st_ivas->hIsmMetaData, 0 ); + + if ( ( error = ivas_ism_metadata_dec_create( st_ivas, st_ivas->nchan_ism, NULL ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + ivas_ism_metadata_close( st_ivas->hIsmMetaData, n_MD ); + + st_ivas->hCPE[0]->element_brate = ivas_total_brate - ism_total_brate; + + /*-----------------------------------------------------------------* + * Renderer selection + *-----------------------------------------------------------------*/ + + ivas_renderer_select( st_ivas ); + + /*-------------------------------------------------------------------* + * Reallocate rendering handles + *--------------------------------------------------------------------*/ + + if ( old_renderer_type != st_ivas->renderer_type ) + { + if ( st_ivas->renderer_type == RENDERER_MONO_DOWNMIX ) + { + if ( ( error = ivas_mono_dmx_renderer_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + ivas_mono_dmx_renderer_close( &st_ivas->hMonoDmxRenderer ); + } + } + + /* objects renderer reconfig. */ + if ( st_ivas->hMasaIsmData != NULL ) + { + ivas_omasa_separate_object_renderer_close( st_ivas ); + } + + if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC ) + { + if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC ) + { + /* Allocate TD renderer for the objects in DISC mode */ + if ( ( error = ivas_td_binaural_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Allocate 'hIsmRendererData' handle and memory for delay buffer within 'hMasaIsmData' */ + if ( ( error = ivas_omasa_separate_object_renderer_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + /* TD renderer handle */ + ivas_td_binaural_close( &st_ivas->hBinRendererTd ); + st_ivas->hHrtfTD = NULL; + + /* ISM renderer handle + ISM data handle */ + ivas_omasa_separate_object_renderer_close( st_ivas ); + } + } + + if ( st_ivas->renderer_type == RENDERER_DIRAC ) + { + if ( ( error = ivas_dirac_dec_config( st_ivas, DIRAC_RECONFIGURE ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_DISC ) + { + /* Allocate 'hIsmRendererData' handle and memory for delay buffer within 'hMasaIsmData' */ + if ( ( error = ivas_omasa_separate_object_renderer_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + /* ISM renderer handle + ISM data handle */ + ivas_omasa_separate_object_renderer_close( st_ivas ); + } + } + + /*-----------------------------------------------------------------* + * TD Decorrelator + *-----------------------------------------------------------------*/ + + if ( st_ivas->hDiracDecBin != NULL ) + { + if ( ( error = ivas_td_decorr_reconfig_dec( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hDecoderConfig->output_Fs, &( st_ivas->hDiracDecBin->hTdDecorr ), &( st_ivas->hDiracDecBin->useTdDecorr ) ) ) != IVAS_ERR_OK ) + + { + return error; + } + } + + /*-----------------------------------------------------------------* + * CLDFB instances + *-----------------------------------------------------------------*/ + + if ( ( error = ivas_cldfb_dec_reconfig( st_ivas, 2, numCldfbAnalyses_old, numCldfbSyntheses_old ) ) != IVAS_ERR_OK ) + { + return error; + } + + /*-----------------------------------------------------------------* + * floating-point output audio buffers + *-----------------------------------------------------------------*/ + + if ( !st_ivas->hDecoderConfig->Opt_5ms ) + { +#ifdef NONBE_FIX_839_MC_RS_CHANNEL_ALLOC + nchan_out_buff = ivas_get_nchan_buffers_dec( st_ivas, -1, -1 ); + + if ( ( error = ivas_output_buff_dec( st_ivas->p_output_f, nchan_out_buff_old, nchan_out_buff ) ) != IVAS_ERR_OK ) + { + return error; + } +#else + nchan_out_buff = ivas_get_nchan_buffers_dec( st_ivas, st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); + + if ( nchan_out_buff > nchan_out_buff_old ) + { + for ( k = nchan_out_buff_old; k < nchan_out_buff; k++ ) + { + /* note: these are intra-frame heap memories */ + if ( ( st_ivas->p_output_f[k] = (float *) malloc( ( 48000 / FRAMES_PER_SEC ) * sizeof( float ) ) ) == NULL ) /* note: 32000 == max internal sampling rate */ + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for floating-point output audio buffer!\n" ) ); + } + } + } + else + { + for ( k = nchan_out_buff; k < nchan_out_buff_old; k++ ) + { + free( st_ivas->p_output_f[k] ); + st_ivas->p_output_f[k] = NULL; + } + } +#endif + } + } + + return IVAS_ERR_OK; +} + + +/*--------------------------------------------------------------------------* + * ivas_set_surplus_brate_dec() + * + * set bit-rate surplus in combined format coding + *--------------------------------------------------------------------------*/ + +void ivas_set_surplus_brate_dec( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + int32_t *ism_total_brate /* i/o: ISM total bitrate */ +) +{ + int16_t n, bits_ism, bits_element[MAX_NUM_OBJECTS]; + int32_t ism_total_brate_ref, element_brate[MAX_NUM_OBJECTS]; + + *ism_total_brate = 0; + + if ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) + { + *ism_total_brate = ivas_interformat_brate( st_ivas->ism_mode, 1, st_ivas->hSCE[0]->element_brate, st_ivas->hIsmMetaData[0]->ism_imp, 0 ); + + st_ivas->hCPE[0]->brate_surplus = st_ivas->hSCE[0]->element_brate - *ism_total_brate; + + /* set 'st->total_brate'; there are no meta-data in ISM_MASA_MODE_PARAM_ONE_OBJ mode */ + st_ivas->hSCE[0]->hCoreCoder[0]->total_brate = *ism_total_brate; + + st_ivas->hSCE[0]->hCoreCoder[0]->low_rate_mode = 0; + if ( st_ivas->hIsmMetaData[0]->ism_imp == ISM_NO_META ) + { + st_ivas->hSCE[0]->hCoreCoder[0]->low_rate_mode = 1; + } + } + else if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC ) + { + int16_t brate_limit_flag, ism_imp[MAX_NUM_OBJECTS]; + + for ( n = 0; n < st_ivas->nchan_ism; n++ ) + { + ism_imp[n] = st_ivas->hIsmMetaData[n]->ism_imp; + } + + brate_limit_flag = calculate_brate_limit_flag( ism_imp, st_ivas->nchan_ism ); + + ism_total_brate_ref = 0; + for ( n = 0; n < st_ivas->nchan_ism; n++ ) + { + ism_total_brate_ref += st_ivas->hSCE[n]->element_brate; + } + + bits_ism = (int16_t) ( ism_total_brate_ref / FRAMES_PER_SEC ); + set_s( bits_element, bits_ism / st_ivas->nchan_ism, st_ivas->nchan_ism ); + bits_element[st_ivas->nchan_ism - 1] += bits_ism % st_ivas->nchan_ism; + bitbudget_to_brate( bits_element, element_brate, st_ivas->nchan_ism ); + + *ism_total_brate = 0; + for ( n = 0; n < st_ivas->nchan_ism; n++ ) + { + st_ivas->hSCE[n]->element_brate = element_brate[n]; + + *ism_total_brate += ivas_interformat_brate( ISM_MASA_MODE_DISC, st_ivas->nchan_ism, st_ivas->hSCE[n]->element_brate, st_ivas->hIsmMetaData[n]->ism_imp, brate_limit_flag ); + + if ( ism_imp[n] > 1 && st_ivas->flag_omasa_brate == 1 && brate_limit_flag >= 0 ) + { + *ism_total_brate -= ADJUST_ISM_BRATE_NEG; + } + + if ( brate_limit_flag == -1 && ism_imp[n] >= 1 && st_ivas->nchan_ism >= 3 && ( ism_total_brate_ref - *ism_total_brate > IVAS_48k ) ) + { + *ism_total_brate += ADJUST_ISM_BRATE_POS; + } + } + st_ivas->hCPE[0]->brate_surplus = ism_total_brate_ref - *ism_total_brate; + + /* 'st->total_brate' is set in ivas_ism_config */ + } + else + { + st_ivas->hCPE[0]->brate_surplus = 0; + } + + return; +} + + +/*--------------------------------------------------------------------------* + * ivas_omasa_ism_metadata_dec() + * + * decode ISM metadata in OMASA format + *--------------------------------------------------------------------------*/ + +ivas_error ivas_omasa_ism_metadata_dec( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const int32_t ism_total_brate, /* i : ISM total bitrate */ + int16_t *nchan_ism, /* o : number of ISM separated channels */ + int16_t *nchan_transport_ism, /* o : number of ISM TCs */ + const int16_t dirac_bs_md_write_idx, /* i : DirAC bitstream write index */ + int16_t nb_bits_metadata[] /* o : number of ISM metadata bits */ +) +{ + int16_t n, block; + int16_t azimuth_ism, elevation_ism, meta_write_index; + ivas_error error; + + /* set ISM parameters */ + *nchan_ism = st_ivas->nchan_ism; + *nchan_transport_ism = st_ivas->nchan_ism; + if ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) + { + *nchan_ism = 1; + *nchan_transport_ism = 1; + } + else if ( st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) + { + *nchan_ism = 0; + *nchan_transport_ism = 1; + } + + if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC || st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) + { + /* decode ISM metadata */ + if ( ( error = ivas_ism_metadata_dec( ism_total_brate, *nchan_ism, nchan_transport_ism, st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->bfi, + nb_bits_metadata, st_ivas->ism_mode, st_ivas->hISMDTX, NULL, &st_ivas->ism_extmeta_active, &st_ivas->ism_extmeta_cnt, st_ivas->hSCE[0]->hCoreCoder[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( st_ivas->hDirAC != NULL ) + { + if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC ) + { + for ( n = 0; n < st_ivas->nchan_ism; n++ ) + { + azimuth_ism = (int16_t) ( st_ivas->hIsmMetaData[n]->azimuth + 0.5f ); + elevation_ism = (int16_t) ( st_ivas->hIsmMetaData[n]->elevation + 0.5f ); + + for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ ) + { + meta_write_index = ( dirac_bs_md_write_idx + block ) % st_ivas->hSpatParamRendCom->dirac_md_buffer_length; + st_ivas->hMasaIsmData->azimuth_ism[n][meta_write_index] = azimuth_ism; + st_ivas->hMasaIsmData->elevation_ism[n][meta_write_index] = elevation_ism; + } + } + } + else /* ISM_MASA_MODE_MASA_ONE_OBJ */ + { + azimuth_ism = (int16_t) ( st_ivas->hIsmMetaData[0]->azimuth + 0.5f ); + elevation_ism = (int16_t) ( st_ivas->hIsmMetaData[0]->elevation + 0.5f ); + + for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ ) + { + meta_write_index = ( dirac_bs_md_write_idx + block ) % st_ivas->hSpatParamRendCom->dirac_md_buffer_length; + st_ivas->hMasaIsmData->azimuth_separated_ism[meta_write_index] = azimuth_ism; + st_ivas->hMasaIsmData->elevation_separated_ism[meta_write_index] = elevation_ism; + } + } + } + } + + return IVAS_ERR_OK; +} + + +/*--------------------------------------------------------------------------* + * ivas_omasa_dirac_rend() + * + * Rendering in OMASA format + *--------------------------------------------------------------------------*/ + +void ivas_omasa_dirac_rend( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float *output[], /* o : output synthesis signal */ + const int16_t output_frame /* i : output frame length per channel */ +) +{ + int16_t n, dirac_read_idx; + float data_separated_objects[MAX_NUM_OBJECTS][L_FRAME48k]; + + if ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) + { + mvr2r( output[2], data_separated_objects[0], output_frame ); + } + else + { + for ( n = 0; n < st_ivas->nchan_ism; n++ ) + { + mvr2r( output[n + 2], data_separated_objects[n], output_frame ); + } + } + + dirac_read_idx = st_ivas->hSpatParamRendCom->dirac_read_idx; + + ivas_dirac_dec( st_ivas, output, st_ivas->nchan_transport, MAX_PARAM_SPATIAL_SUBFRAMES ); + + st_ivas->hSpatParamRendCom->dirac_read_idx = dirac_read_idx; /* Original read index is needed for the next function which will update it again */ + + ivas_omasa_separate_object_render( st_ivas, data_separated_objects, output, output_frame ); + + return; +} + + +/*--------------------------------------------------------------------------* + * ivas_omasa_dirac_rend_jbm() + * + * Rendering in OMASA format for JBM + *--------------------------------------------------------------------------*/ + +void ivas_omasa_dirac_rend_jbm( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const uint16_t nSamplesAsked, /* i : number of samples requested */ + uint16_t *nSamplesRendered, /* o : number of samples rendered */ + uint16_t *nSamplesAvailable, /* o : number of samples still to render */ + const int16_t nchan_transport, /* i : number of transport channels */ + float *output_f[] /* o : rendered time signal */ +) +{ + int16_t subframes_rendered; + int16_t slots_rendered; + + subframes_rendered = st_ivas->hSpatParamRendCom->subframes_rendered; + slots_rendered = st_ivas->hSpatParamRendCom->slots_rendered; + + ivas_dirac_dec_render( st_ivas, nchan_transport, nSamplesAsked, nSamplesRendered, nSamplesAvailable, output_f ); + + ivas_omasa_separate_object_render_jbm( st_ivas, *nSamplesRendered, output_f, subframes_rendered, slots_rendered ); + + return; +} + + +/*--------------------------------------------------------------------------* + * ivas_omasa_dirac_td_binaural() + * + * Binaural rendering in OMASA format + *--------------------------------------------------------------------------*/ + +ivas_error ivas_omasa_dirac_td_binaural( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float *output[], /* o : output synthesis signal */ + const int16_t output_frame /* i : output frame length per channel */ +) +{ + int16_t n; + float data_separated_objects[MAX_NUM_OBJECTS][L_FRAME48k]; + float gain = OMASA_TDREND_MATCHING_GAIN; + ivas_error error; + float *p_sepobj[MAX_NUM_OBJECTS]; + + for ( n = 0; n < MAX_NUM_OBJECTS; n++ ) + { + p_sepobj[n] = &data_separated_objects[n][0]; + } + + for ( n = 0; n < st_ivas->nchan_ism; n++ ) + { + mvr2r( output[2 + n], data_separated_objects[n], output_frame ); + v_multc( data_separated_objects[n], gain, data_separated_objects[n], output_frame ); + } + + for ( n = 0; n < st_ivas->nchan_ism; n++ ) + { + delay_signal( data_separated_objects[n], output_frame, st_ivas->hMasaIsmData->delayBuffer[n], st_ivas->hMasaIsmData->delayBuffer_size ); + } + + ivas_dirac_dec_binaural( st_ivas, st_ivas->hCombinedOrientationData, output, st_ivas->nchan_transport, MAX_PARAM_SPATIAL_SUBFRAMES ); + + if ( ( error = ivas_td_binaural_renderer( st_ivas, p_sepobj, output_frame ) ) != IVAS_ERR_OK ) + { + return error; + } + + for ( n = 0; n < BINAURAL_CHANNELS; n++ ) + { + v_add( output[n], p_sepobj[n], output[n], output_frame ); + } + + return IVAS_ERR_OK; +} + + +/*--------------------------------------------------------------------------* + * ivas_omasa_dirac_td_binaural_render() + * + * Binaural rendering in OMASA format for JBM + *--------------------------------------------------------------------------*/ + +ivas_error ivas_omasa_dirac_td_binaural_jbm( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const uint16_t nSamplesAsked, /* i : number of samples requested */ + uint16_t *nSamplesRendered, /* o : number of samples rendered */ + uint16_t *nSamplesAvailable, /* o : number of samples still to render */ + const int16_t nchan_transport, /* i : number of transport channels */ + float *output_f[] /* o : rendered time signal */ +) +{ + int16_t n; + float data_separated_objects[MAX_NUM_OBJECTS][L_FRAME48k]; + float gain = OMASA_TDREND_MATCHING_GAIN; + ivas_error error; + float *p_sepobj[MAX_NUM_OBJECTS]; + float *tc_local[MAX_TRANSPORT_CHANNELS]; + + for ( n = 0; n < MAX_NUM_OBJECTS; n++ ) + { + p_sepobj[n] = &data_separated_objects[n][0]; + } + + /* Delay the object signals to match the CLDFB delay. Delay the whole buffer with the first rendering call of the stretched buffer. */ + if ( st_ivas->hSpatParamRendCom->slots_rendered == 0 ) + { + int16_t tcBufferSize; + + tcBufferSize = st_ivas->hSpatParamRendCom->num_slots * st_ivas->hSpatParamRendCom->slot_size; + + for ( n = 0; n < st_ivas->nchan_ism; n++ ) + { + tc_local[n] = st_ivas->hTcBuffer->tc[n + 2]; + v_multc( tc_local[n], gain, tc_local[n], tcBufferSize ); + delay_signal( tc_local[n], tcBufferSize, st_ivas->hMasaIsmData->delayBuffer[n], st_ivas->hMasaIsmData->delayBuffer_size ); + } + } + + ivas_dirac_dec_binaural_render( st_ivas, nSamplesAsked, nSamplesRendered, nSamplesAvailable, nchan_transport, output_f ); + + if ( ( error = ivas_td_binaural_renderer_sf( st_ivas, p_sepobj, *nSamplesRendered ) ) != IVAS_ERR_OK ) + { + return error; + } + + for ( n = 0; n < BINAURAL_CHANNELS; n++ ) + { + v_add( output_f[n], p_sepobj[n], output_f[n], *nSamplesRendered ); + } + + return IVAS_ERR_OK; +} + + +/*--------------------------------------------------------------------------* + * ivas_omasa_rearrange_channels() + * + * in case of external rendering, rearrange the channels order + *--------------------------------------------------------------------------*/ + +void ivas_omasa_rearrange_channels( + float *output[], /* o : output synthesis signal */ + const int16_t nchan_transport_ism, /* o : number of ISM TCs */ + const int16_t output_frame /* i : output frame length per channel */ +) +{ + int16_t n; + float tmp_buff[CPE_CHANNELS][L_FRAME48k]; + + mvr2r( output[0], tmp_buff[0], output_frame ); + mvr2r( output[1], tmp_buff[1], output_frame ); + + for ( n = 0; n < nchan_transport_ism; n++ ) + { + mvr2r( output[CPE_CHANNELS + n], output[n], output_frame ); + } + mvr2r( tmp_buff[0], output[n], output_frame ); + mvr2r( tmp_buff[1], output[++n], output_frame ); + + return; +} diff --git a/lib_dec/ivas_osba_dec.c b/lib_dec/ivas_osba_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..8da8628e9d2b2150d6de0c833153c18bcfbed89e --- /dev/null +++ b/lib_dec/ivas_osba_dec.c @@ -0,0 +1,314 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include "options.h" +#include +#include "ivas_cnst.h" +#include "ivas_prot.h" +#include "prot.h" +#include "ivas_prot_rend.h" +#include "ivas_rom_com.h" +#include "wmc_auto.h" + + +/*-------------------------------------------------------------------* + * ivas_osba_data_open() + * + * Allocate and initialize SBA_ISM rendering handle + *-------------------------------------------------------------------*/ + +ivas_error ivas_osba_data_open( + Decoder_Struct *st_ivas /* i/o: IVAS decoder handle */ +) +{ + SBA_ISM_DATA_HANDLE hSbaIsmData; + int16_t i; + + if ( ( hSbaIsmData = (SBA_ISM_DATA_HANDLE) malloc( sizeof( SBA_ISM_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for OSBA data\n" ) ); + } + + hSbaIsmData->delayBuffer_nchan = st_ivas->nchan_ism; + hSbaIsmData->delayBuffer_size = (int16_t) ( ( st_ivas->hDecoderConfig->output_Fs / 50 ) / MAX_PARAM_SPATIAL_SUBFRAMES ); + + if ( ( hSbaIsmData->delayBuffer = (float **) malloc( hSbaIsmData->delayBuffer_nchan * sizeof( float * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for OSBA delay buffer \n" ) ); + } + + for ( i = 0; i < hSbaIsmData->delayBuffer_nchan; i++ ) + { + if ( ( hSbaIsmData->delayBuffer[i] = (float *) malloc( hSbaIsmData->delayBuffer_size * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for OSBA delay buffer \n" ) ); + } + set_zero( hSbaIsmData->delayBuffer[i], hSbaIsmData->delayBuffer_size ); + } + + st_ivas->hSbaIsmData = hSbaIsmData; + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * ivas_osba_data_close() + * + * Deallocate SBA_ISM rendering handle + *-------------------------------------------------------------------*/ + +void ivas_osba_data_close( + SBA_ISM_DATA_HANDLE *hSbaIsmData /* i/o: OSBA rendering handle */ +) +{ + int16_t i; + + if ( hSbaIsmData == NULL || *hSbaIsmData == NULL ) + { + return; + } + + if ( ( *hSbaIsmData )->delayBuffer != NULL ) + { + for ( i = 0; i < ( *hSbaIsmData )->delayBuffer_nchan; i++ ) + { + free( ( *hSbaIsmData )->delayBuffer[i] ); + } + free( ( *hSbaIsmData )->delayBuffer ); + ( *hSbaIsmData )->delayBuffer = NULL; + } + + free( *hSbaIsmData ); + *hSbaIsmData = NULL; + + return; +} + + +/*--------------------------------------------------------------------------* + * ivas_osba_dirac_td_binaural_jbm() + * + * Binaural rendering in JBM OSBA format + *--------------------------------------------------------------------------*/ + +ivas_error ivas_osba_dirac_td_binaural_jbm( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */ + uint16_t *nSamplesRendered, /* o : number of CLDFB slots rendered */ + uint16_t *nSamplesAvailable, /* o : number of CLDFB slots still to render */ + float *output_f[] /* o : rendered time signal */ +) +{ + int16_t n; + ivas_error error; + + if ( ( error = ivas_sba_dec_render( st_ivas, nSamplesAsked, nSamplesRendered, nSamplesAvailable, &output_f[2] ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = ivas_td_binaural_renderer_sf( st_ivas, output_f, *nSamplesRendered ) ) != IVAS_ERR_OK ) + { + return error; + } + + for ( n = 0; n < BINAURAL_CHANNELS; n++ ) + { + int16_t i; + for ( i = 0; i < nSamplesAsked; i++ ) + { + output_f[n][i] = 0.5f * output_f[2 + n][i] + 0.5f * output_f[n][i]; + } + } + + return IVAS_ERR_OK; +} + + +/*--------------------------------------------------------------------------* + * ivas_osba_dirac_td_binaural() + * + * Binaural rendering in OSBA format + *--------------------------------------------------------------------------*/ + +ivas_error ivas_osba_dirac_td_binaural( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float *output[], /* o : output synthesis signal */ + const int16_t output_frame /* i : output frame length per channel */ +) +{ + int16_t n; + float data_separated_objects[MAX_NUM_OBJECTS][L_FRAME48k]; + ivas_error error; + float *p_sepobj[MAX_NUM_OBJECTS]; + int16_t channel_offset; + + for ( n = 0; n < MAX_NUM_OBJECTS; n++ ) + { + p_sepobj[n] = &data_separated_objects[n][0]; + } + + channel_offset = st_ivas->nchan_ism; + + for ( n = 0; n < st_ivas->nchan_ism; n++ ) + { + mvr2r( output[n], data_separated_objects[n], output_frame ); + } + + { + for ( n = 0; n < st_ivas->nchan_ism; n++ ) + { + delay_signal( data_separated_objects[n], output_frame, st_ivas->hSbaIsmData->delayBuffer[n], st_ivas->hSbaIsmData->delayBuffer_size ); + } + } + + if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV ) + { + if ( ( error = ivas_sba_upmixer_renderer( st_ivas, output, output_frame ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + ivas_dirac_dec_binaural( st_ivas, st_ivas->hCombinedOrientationData, &output[channel_offset], st_ivas->nchan_transport, MAX_PARAM_SPATIAL_SUBFRAMES ); + } + + if ( ( error = ivas_td_binaural_renderer( st_ivas, p_sepobj, output_frame ) ) != IVAS_ERR_OK ) + { + return error; + } + + for ( n = 0; n < BINAURAL_CHANNELS; n++ ) + { + int16_t i; + for ( i = 0; i < output_frame; i++ ) + { + output[n][i] = 0.5f * output[channel_offset + n][i] + 0.5f * p_sepobj[n][i]; + } + } + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------------* + * ivas_osba_ism_metadata_dec() + * + * ISM metadata decoding in OSBA format. + *-------------------------------------------------------------------------*/ + +ivas_error ivas_osba_ism_metadata_dec( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const int32_t ism_total_brate, /* i : ISM total bitrate */ + int16_t *nchan_ism, /* o : number of ISM separated channels */ + int16_t nb_bits_metadata[] /* o : number of ISM metadata bits */ +) +{ + ivas_error error; + int16_t nchan_transport_ism; + + /* set ISM parameters */ + nchan_transport_ism = st_ivas->nchan_ism; + *nchan_ism = st_ivas->nchan_ism; + + /* decode ISM metadata */ + if ( ( error = ivas_ism_metadata_dec( ism_total_brate, *nchan_ism, &nchan_transport_ism, st_ivas->hIsmMetaData, NULL, st_ivas->bfi, + nb_bits_metadata, st_ivas->ism_mode, st_ivas->hISMDTX, NULL, &st_ivas->ism_extmeta_active, &st_ivas->ism_extmeta_cnt, st_ivas->hCPE[0]->hCoreCoder[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------------* + * ivas_osba_render() + * + * Object + SBA rendering process. + *-------------------------------------------------------------------------*/ + +ivas_error ivas_osba_render( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float *output_f[], /* i/o: core-coder transport channels/object output */ + const int16_t output_frame /* i : output frame length per channel */ +) +{ + float tmp_ism_out[MAX_OUTPUT_CHANNELS][L_FRAME48k]; + float *p_tmp_ism_out[MAX_OUTPUT_CHANNELS]; + int16_t n, nchan_out, nchan_ism; + ivas_error error; + + nchan_out = st_ivas->hDecoderConfig->nchan_out; + nchan_ism = st_ivas->nchan_ism; + + for ( n = 0; n < max( nchan_out, nchan_ism ); n++ ) + { + p_tmp_ism_out[n] = &tmp_ism_out[n][0]; + } + + if ( st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + { + for ( n = 0; n < nchan_ism; n++ ) + { + mvr2r( output_f[n], tmp_ism_out[n], output_frame ); + delay_signal( tmp_ism_out[n], output_frame, st_ivas->hSbaIsmData->delayBuffer[n], st_ivas->hSbaIsmData->delayBuffer_size ); + } + + if ( st_ivas->renderer_type == RENDERER_OSBA_AMBI ) + { + ivas_ism2sba( p_tmp_ism_out, st_ivas->hIsmRendererData, st_ivas->hIsmMetaData, st_ivas->nchan_ism, output_frame, st_ivas->hIntSetup.ambisonics_order ); + } + else + { + ivas_ism_render( st_ivas, p_tmp_ism_out, output_frame ); + } + } + + if ( ( error = ivas_sba_upmixer_renderer( st_ivas, output_f, output_frame ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + { + for ( n = 0; n < nchan_out; n++ ) + { + v_add( output_f[n + nchan_ism], tmp_ism_out[n], output_f[n], output_frame ); + v_multc( output_f[n], 0.5f, output_f[n], output_frame ); + } + } + + return IVAS_ERR_OK; +} diff --git a/lib_dec/ivas_out_setup_conversion.c b/lib_dec/ivas_out_setup_conversion.c new file mode 100644 index 0000000000000000000000000000000000000000..e1d0c12e521c8598cb006440afea661bc4fe90f9 --- /dev/null +++ b/lib_dec/ivas_out_setup_conversion.c @@ -0,0 +1,1252 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include +#include +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_prot_rend.h" +#include "ivas_rom_com.h" +#include "ivas_rom_rend.h" +#include "wmc_auto.h" + + +/*----------------------------------------------------------------------------------* + * Local constants + *----------------------------------------------------------------------------------*/ + +#define LS_OUT_CONV_SMOOTHING_FACTOR 0.0435f +#define LS_OUT_CONV_CLIP_FACTOR_MAX 2.0f +#define LS_OUT_CONV_CLIP_FACTOR_MIN 0.3f + + +/*----------------------------------------------------------------------------------* + * Local functions + *----------------------------------------------------------------------------------*/ + +static void ivas_lssetupconversion_computeEQFactor( + float *outputEnergy, + float *inputEnergy, + float *EQ ) +{ + /* Compute the Equalization Gain */ + *EQ = sqrtf( *outputEnergy / ( EPSILON + *inputEnergy ) ); + + /* Limit the Equalization Gain */ + *EQ = min( *EQ, LS_OUT_CONV_CLIP_FACTOR_MAX ); + *EQ = max( *EQ, LS_OUT_CONV_CLIP_FACTOR_MIN ); + + return; +} + + +static void ivas_lssetupconversion_mdct_init_bands( + const int16_t output_frame, /* i : output frame length */ + const int16_t tcx_mode, /* i : tcx mode (TCX10, TCX 20) */ + int16_t *sfbOffset, /* o : sfb offset table */ + int16_t *sfbCnt /* o : number of sfbs */ +) +{ + SpectrumWarping const *lpcBndsParam; + int16_t i, cnt, specStartOffset, L_frameTCX; + const unsigned char *sfbWidths; + + L_frameTCX = ( tcx_mode == TCX_20_CORE ) ? output_frame : ( output_frame / 2 ); + + switch ( output_frame ) + { + case L_FRAME48k: + case L_FRAME32k: + lpcBndsParam = sw32000Hz; + break; + case L_FRAME25_6k: + lpcBndsParam = sw25600Hz; + break; + case L_FRAME16k: + lpcBndsParam = sw16000Hz; + break; + default: + assert( !"Subband division not defined for this frame size" ); + return; + } + + sfbWidths = ( tcx_mode == TCX_20_CORE ? lpcBndsParam->bandLengthsTCX20 : lpcBndsParam->bandLengthsTCX10 ); + cnt = ( tcx_mode == TCX_20_CORE ? 64 : 32 ); + + /* calc sfb offsets */ + specStartOffset = 0; + + for ( i = 0; i < cnt; i++ ) + { + sfbOffset[i] = min( specStartOffset, L_frameTCX ); + specStartOffset += sfbWidths[i]; + + if ( sfbOffset[i] >= L_frameTCX ) + { + break; + } + } + + *sfbCnt = i; + sfbOffset[*sfbCnt] = min( specStartOffset, L_frameTCX ); + + if ( sfbOffset[*sfbCnt] < L_frameTCX ) + { + int16_t nMissingBins = L_frameTCX - sfbOffset[*sfbCnt]; + + if ( sfbWidths[i] / 2 < nMissingBins ) + { + ( *sfbCnt )++; + } + sfbOffset[*sfbCnt] = L_frameTCX; + } + + return; +} + + +static void get_custom_ls_conversion_matrix( + const EFAP_HANDLE hEFAPdata, /* i : EFAP handle */ + const IVAS_OUTPUT_SETUP hTransSetup, /* i : Transport channel configuration handle */ + const LSSETUP_CUSTOM_HANDLE hLsSetupCustom, /* i : Custom LS Setup handle */ + LSSETUP_CONVERSION_HANDLE hLsSetUpConversion /* o : LS Setup Conversion Handle */ +) +{ + int16_t ch_in, ch_in_woLFE; + int16_t ch_out, ch_out_woLFE; + int16_t nchan_in, nchan_out; + int16_t lfe_in_idx, lfe_out_idx; + + float dmxCoeff_LFE; + float tmp_gains[MAX_OUTPUT_CHANNELS]; + + lfe_in_idx = -1; + lfe_out_idx = -1; + + nchan_in = hTransSetup.nchan_out_woLFE + hTransSetup.num_lfe; + nchan_out = hLsSetupCustom->num_spk + hLsSetupCustom->num_lfe; + + /* The below code will need to be restructured in case additional LFEs must be supported */ + if ( hTransSetup.num_lfe > 0 ) + { + lfe_in_idx = hTransSetup.index_lfe[0]; + } + if ( hLsSetupCustom->num_lfe > 0 ) + { + lfe_out_idx = hLsSetupCustom->lfe_idx[0]; + } + + dmxCoeff_LFE = 1.f / hTransSetup.nchan_out_woLFE; + + for ( ch_in = 0, ch_in_woLFE = 0; ch_in < nchan_in; ch_in++, ch_in_woLFE++ ) + { + if ( lfe_in_idx == ch_in ) + { + if ( lfe_out_idx >= 0 ) + { + /* re-route LFE */ + hLsSetUpConversion->dmxMtx[ch_in][lfe_out_idx] = 1.0f; + } + else + { + /* mix the LFE to all channels */ + set_f( hLsSetUpConversion->dmxMtx[ch_in], dmxCoeff_LFE, nchan_out ); + } + + ch_in_woLFE--; + } + else if ( lfe_out_idx != ch_in ) + { + /* Set the values of hLsSetUpConversion->dmxMtx to EFAP gains, skipping LFE */ + efap_determine_gains( hEFAPdata, tmp_gains, hTransSetup.ls_azimuth[ch_in_woLFE], hTransSetup.ls_elevation[ch_in_woLFE], EFAP_MODE_EFAP ); + + for ( ch_out = 0, ch_out_woLFE = 0; ch_out < nchan_out; ch_out++, ch_out_woLFE++ ) + { + if ( lfe_out_idx == ch_out ) + { + ch_out_woLFE--; + } + else + { + hLsSetUpConversion->dmxMtx[ch_in][ch_out] = tmp_gains[ch_out_woLFE]; + } + } + } + } + + return; +} + + +static ivas_error get_ls_conversion_matrix( + LSSETUP_CONVERSION_HANDLE hLsSetUpConversion, + const AUDIO_CONFIG input_config, + const AUDIO_CONFIG output_config ) +{ + int16_t i, k; + int16_t ch_in, ch_out; + int16_t nchan_in, nchan_out; + int16_t index; + float value; + const LS_CONVERSION_MATRIX *conversion_matrix; + ivas_error error; + + error = IVAS_ERR_OK; + + conversion_matrix = NULL; + + nchan_in = audioCfg2channels( input_config ); + nchan_out = audioCfg2channels( output_config ); + + /* Search the table for a mapping */ + for ( i = 0; i < LS_SETUP_CONVERSION_NUM_MAPPINGS; i++ ) + { + if ( ( input_config == ls_conversion_mapping[i].input_config ) && ( output_config == ls_conversion_mapping[i].output_config ) ) + { + /* Special handling for MONO and STEREO downmix */ + if ( output_config == IVAS_AUDIO_CONFIG_MONO || output_config == IVAS_AUDIO_CONFIG_STEREO ) + { + for ( ch_in = 0, k = 0; ch_in < nchan_in; ch_in++, k++ ) + { + /* Skip two rows in the matrix for 5.1.x formats */ + if ( ch_in == 6 && ( input_config == IVAS_AUDIO_CONFIG_5_1_2 || input_config == IVAS_AUDIO_CONFIG_5_1_4 ) ) + { + k += 2; + } + + for ( ch_out = 0; ch_out < nchan_out; ch_out++ ) + { + if ( output_config == IVAS_AUDIO_CONFIG_MONO ) + { + hLsSetUpConversion->dmxMtx[ch_in][ch_out] = ls_conversion_cicpX_mono[k][ch_out]; + } + else + { + hLsSetUpConversion->dmxMtx[ch_in][ch_out] = ls_conversion_cicpX_stereo[k][ch_out]; + } + } + } + return error; + } + else + { + conversion_matrix = ls_conversion_mapping[i].conversion_matrix; + + /* If a mapping is defined with a NULL matrix, 1:1 upmix of input channels */ + if ( conversion_matrix == NULL ) + { + for ( k = 0; k < nchan_in; k++ ) + { + hLsSetUpConversion->dmxMtx[k][k] = 1.0f; + } + return error; + } + else + { + for ( k = 1; k < ( conversion_matrix[0].index + 1 ); k++ ) + { + index = conversion_matrix[k].index; + value = conversion_matrix[k].value; + + ch_in = index / nchan_out; + ch_out = index % nchan_out; + + hLsSetUpConversion->dmxMtx[ch_in][ch_out] = value; + } + } + return error; + } + } + } + + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "The conversion matrix between these formats is not defined!\n" ); +} + + +/*------------------------------------------------------------------------- + * ivas_ls_setup_conversion_open() + * + * Open the LS configuration Conversion Module + *-------------------------------------------------------------------------*/ + +ivas_error ivas_ls_setup_conversion_open( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +) +{ + LSSETUP_CONVERSION_HANDLE hLsSetUpConversion; + int16_t chIdx, inChannels, outChannels; + int16_t output_frame; + int32_t output_Fs; + int16_t nchan_out; + int16_t paramUpmixMonoStereo; + + if ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMUPMIX && ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_MONO || st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_STEREO ) ) + { + paramUpmixMonoStereo = TRUE; + } + else + { + paramUpmixMonoStereo = FALSE; + } + output_Fs = st_ivas->hDecoderConfig->output_Fs; + nchan_out = st_ivas->hDecoderConfig->nchan_out; + output_frame = (int16_t) ( output_Fs / FRAMES_PER_SEC ); + + /* Allocate memory to the handle */ + if ( ( hLsSetUpConversion = (LSSETUP_CONVERSION_HANDLE) malloc( sizeof( LSSETUP_CONVERSION_STRUCT ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LS configuration Conversion Handle \n" ) ); + } + + assert( nchan_out <= MAX_OUTPUT_CHANNELS ); + + outChannels = nchan_out; + if ( st_ivas->renderer_type == RENDERER_MC_PARAMMC ) + { + inChannels = st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe; + hLsSetUpConversion->sfbCnt = (int16_t) ( output_Fs * INV_CLDFB_BANDWIDTH + 0.5f ); + for ( chIdx = 0; chIdx < outChannels; chIdx++ ) + { + if ( ( hLsSetUpConversion->targetEnergyPrev[chIdx] = (float *) malloc( ( hLsSetUpConversion->sfbCnt ) * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LS configuration Conversion Handle \n" ) ); + } + if ( ( hLsSetUpConversion->dmxEnergyPrev[chIdx] = (float *) malloc( ( hLsSetUpConversion->sfbCnt ) * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LS configuration Conversion Handle \n" ) ); + } + set_f( hLsSetUpConversion->targetEnergyPrev[chIdx], 0.0f, hLsSetUpConversion->sfbCnt ); + set_f( hLsSetUpConversion->dmxEnergyPrev[chIdx], 0.0f, hLsSetUpConversion->sfbCnt ); + } + for ( ; chIdx < MAX_CICP_CHANNELS; chIdx++ ) + { + hLsSetUpConversion->targetEnergyPrev[chIdx] = NULL; + hLsSetUpConversion->dmxEnergyPrev[chIdx] = NULL; + } + } + else + { + if ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) + { + if ( paramUpmixMonoStereo == TRUE ) + { + inChannels = audioCfg2channels( IVAS_AUDIO_CONFIG_5_1_2 ); + } + else + { + inChannels = st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe; + } + } + else + { + inChannels = st_ivas->nchan_transport; + } + + /*Initialization of MDCT bands with TCX20 resolution */ + ivas_lssetupconversion_mdct_init_bands( output_frame, TCX_20_CORE, &hLsSetUpConversion->sfbOffset[0], &hLsSetUpConversion->sfbCnt ); + if ( ( hLsSetUpConversion->targetEnergyPrev[0] = (float *) malloc( ( MAX_SFB + 2 ) * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LS configuration Conversion Handle \n" ) ); + } + if ( ( hLsSetUpConversion->dmxEnergyPrev[0] = (float *) malloc( ( MAX_SFB + 2 ) * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LS configuration Conversion Handle \n" ) ); + } + + for ( chIdx = 1; chIdx < MAX_CICP_CHANNELS; chIdx++ ) + { + hLsSetUpConversion->targetEnergyPrev[chIdx] = NULL; + hLsSetUpConversion->dmxEnergyPrev[chIdx] = NULL; + } + set_f( hLsSetUpConversion->targetEnergyPrev[0], 0.0f, MAX_SFB + 2 ); + set_f( hLsSetUpConversion->dmxEnergyPrev[0], 0.0f, MAX_SFB + 2 ); + } + + + /* Initialize the DMX conversion matrix */ + for ( chIdx = 0; chIdx < inChannels; chIdx++ ) + { + /* Allocate memory depending on the number of output channels */ + if ( ( hLsSetUpConversion->dmxMtx[chIdx] = (float *) malloc( outChannels * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for temp dmx matrix \n" ) ); + } + set_zero( hLsSetUpConversion->dmxMtx[chIdx], outChannels ); + } + + for ( ; chIdx < MAX_CICP_CHANNELS; chIdx++ ) + { + hLsSetUpConversion->dmxMtx[chIdx] = NULL; + } + + if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM ) + { + get_custom_ls_conversion_matrix( st_ivas->hEFAPdata, st_ivas->hTransSetup, st_ivas->hLsSetupCustom, hLsSetUpConversion ); + } + else + { + if ( st_ivas->transport_config != IVAS_AUDIO_CONFIG_INVALID ) + { + if ( paramUpmixMonoStereo == TRUE ) + { + get_ls_conversion_matrix( hLsSetUpConversion, IVAS_AUDIO_CONFIG_5_1_2, st_ivas->hDecoderConfig->output_config ); + } + else + { + get_ls_conversion_matrix( hLsSetUpConversion, st_ivas->transport_config, st_ivas->hDecoderConfig->output_config ); + } + } + else + { + get_ls_conversion_matrix( hLsSetUpConversion, st_ivas->intern_config, st_ivas->hDecoderConfig->output_config ); + } + } + + st_ivas->hLsSetUpConversion = hLsSetUpConversion; + + return IVAS_ERR_OK; +} + + +/*------------------------------------------------------------------------- + * ivas_ls_setup_conversion_close() + * + * Close the LS configuration Conversion Module + *-------------------------------------------------------------------------*/ + +void ivas_ls_setup_conversion_close( + LSSETUP_CONVERSION_HANDLE *hLsSetUpConversion /* i/o: LS converter handle */ +) +{ + int16_t idx; + + if ( hLsSetUpConversion == NULL || *hLsSetUpConversion == NULL ) + { + return; + } + + for ( idx = 0; idx < MAX_CICP_CHANNELS; idx++ ) + { + if ( ( *hLsSetUpConversion )->dmxMtx[idx] != NULL ) + { + free( ( *hLsSetUpConversion )->dmxMtx[idx] ); + ( *hLsSetUpConversion )->dmxMtx[idx] = NULL; + } + + if ( ( *hLsSetUpConversion )->targetEnergyPrev[idx] != NULL ) + { + free( ( *hLsSetUpConversion )->targetEnergyPrev[idx] ); + ( *hLsSetUpConversion )->targetEnergyPrev[idx] = NULL; + } + + if ( ( *hLsSetUpConversion )->dmxEnergyPrev[idx] != NULL ) + { + free( ( *hLsSetUpConversion )->dmxEnergyPrev[idx] ); + ( *hLsSetUpConversion )->dmxEnergyPrev[idx] = NULL; + } + } + + free( *hLsSetUpConversion ); + *hLsSetUpConversion = NULL; + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_ls_setup_conversion() + * + * Convert (downmix or upmix) the input LS configuration + * to output LS configuration in time domain + *-------------------------------------------------------------------------*/ + +void ivas_ls_setup_conversion( + Decoder_Struct *st_ivas, /* i : IVAS decoder structure */ + const int16_t input_chans, /* i : number of input channels to the renderer */ + const int16_t output_frame, /* i : frame length */ + float *input[], /* i : LS input/output synthesis signal */ + float *output[] /* i/o: LS input/output synthesis signal */ +) +{ + int16_t chInIdx, chOutIdx, idx; + LSSETUP_CONVERSION_HANDLE hLsSetUpConversion; + float dmxCoeff, tmpVal; + float output_tmp[MAX_OUTPUT_CHANNELS][L_FRAME48k]; + + push_wmops( "LS_Renderer" ); + + hLsSetUpConversion = st_ivas->hLsSetUpConversion; + + for ( chOutIdx = 0; chOutIdx < st_ivas->hDecoderConfig->nchan_out; chOutIdx++ ) + { + set_zero( output_tmp[chOutIdx], output_frame ); + for ( chInIdx = 0; chInIdx < input_chans; chInIdx++ ) + { + dmxCoeff = hLsSetUpConversion->dmxMtx[chInIdx][chOutIdx]; + + if ( dmxCoeff == 0.f ) + { + continue; + } + else if ( dmxCoeff == 1.f ) + { + for ( idx = 0; idx < output_frame; idx++ ) + { + output_tmp[chOutIdx][idx] += input[chInIdx][idx]; + } + } + else + { + for ( idx = 0; idx < output_frame; idx++ ) + { + tmpVal = dmxCoeff * input[chInIdx][idx]; + output_tmp[chOutIdx][idx] += tmpVal; + } + } + } + } + + /* Copy to output buffer */ + for ( chOutIdx = 0; chOutIdx < st_ivas->hDecoderConfig->nchan_out; chOutIdx++ ) + { + mvr2r( output_tmp[chOutIdx], output[chOutIdx], output_frame ); + } + + pop_wmops(); + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_ls_setup_conversion_process_mdct() + * + * Equalization in MDCT Domain + *-------------------------------------------------------------------------*/ + +void ivas_ls_setup_conversion_process_mdct( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float *output[] /* i/o: output synthesis signal */ +) +{ + /* Declaration of all required variables */ + int16_t i, bandIdx, chInIdx, chOutIdx, cpe_idx, subFrameIdx, binIdx, idx; + int16_t inChannels, outChannels, num_CPE; + int16_t transform_type[MAX_CICP_CHANNELS][2]; + int16_t frameSize; + float targetEnergy[MAX_SFB + 2], dmxEnergy[MAX_SFB + 2]; + float dmxCoeff; + float dmxSignalReal[L_FRAME48k], dmxSignalImag[L_FRAME48k]; + float eqGain; + float *sig[NB_DIV], *pTmp[NB_DIV], *x[MAX_CICP_CHANNELS][NB_DIV]; + float mdst[L_FRAME48k]; + float convertRes[L_FRAME48k]; + int16_t start, stop, start_tcx5, stop_tcx5; + int16_t mct_chan_mode[MAX_CICP_CHANNELS]; + + /* Declare all handles */ + LSSETUP_CONVERSION_HANDLE hLsSetUpConversion; + CPE_DEC_HANDLE hCPE[MCT_MAX_BLOCKS]; + + push_wmops( "LS_Renderer_MDCT" ); + + /* Assign all the declared variables */ + inChannels = st_ivas->nchan_transport; + outChannels = st_ivas->hDecoderConfig->nchan_out; + num_CPE = st_ivas->nCPE; + + /* Assign output pointer to variable x */ + for ( chInIdx = 0; chInIdx < inChannels; chInIdx++ ) + { + x[chInIdx][0] = output[chInIdx]; + x[chInIdx][1] = output[chInIdx] + ( L_FRAME48k / 2 ); + } + + /* Assign all the declared handles*/ + hLsSetUpConversion = st_ivas->hLsSetUpConversion; + for ( cpe_idx = 0; cpe_idx < num_CPE; cpe_idx++ ) + { + hCPE[cpe_idx] = st_ivas->hCPE[cpe_idx]; + } + + /* Get the core type */ + for ( cpe_idx = 0; cpe_idx < num_CPE; cpe_idx++ ) + { + for ( idx = 0; idx < CPE_CHANNELS; idx++ ) + { + /* get the channel index */ + chInIdx = cpe_idx * CPE_CHANNELS + idx; + assert( chInIdx <= inChannels ); + transform_type[chInIdx][0] = hCPE[cpe_idx]->hCoreCoder[idx]->transform_type[0]; + transform_type[chInIdx][1] = hCPE[cpe_idx]->hCoreCoder[idx]->transform_type[1]; + mct_chan_mode[chInIdx] = hCPE[cpe_idx]->hCoreCoder[idx]->mct_chan_mode; + } + } + + /* set overall frequency resolution of (sub)frame to maximum of (sub)frame, requires conversion if both channels are not the same */ + frameSize = hLsSetUpConversion->sfbOffset[hLsSetUpConversion->sfbCnt]; + + set_zero( targetEnergy, MAX_SFB + 2 ); + set_zero( dmxEnergy, MAX_SFB + 2 ); + + for ( chOutIdx = 0; chOutIdx < outChannels; chOutIdx++ ) + { + /* Step 0: Set the buffers to zero */ + set_zero( dmxSignalReal, frameSize ); + set_zero( dmxSignalImag, frameSize ); + + for ( chInIdx = 0; chInIdx < inChannels; chInIdx++ ) + { + dmxCoeff = hLsSetUpConversion->dmxMtx[chInIdx][chOutIdx]; + + if ( + chInIdx != LFE_CHANNEL && + mct_chan_mode[chInIdx] != MCT_CHAN_MODE_IGNORE ) + { + /* Step 1: Compute the target energy and DMX signal (possible since we have all signals in TCX20 resolution) */ + if ( dmxCoeff ) + { + float tmpDMXSig, targetEne; + + /* Convert the signal resolution to TCX20 */ + /* initially, set pointers to input; if conversion occurs in (sub)frame, set to convertRes */ + sig[0] = pTmp[0] = x[chInIdx][0]; + sig[1] = pTmp[1] = x[chInIdx][1]; + + /* convert (sub)frames to higher frequency resolution */ + if ( transform_type[chInIdx][0] != TCX_20 ) + { + for ( subFrameIdx = 0; subFrameIdx < NB_DIV; subFrameIdx++ ) + { + if ( transform_type[chInIdx][subFrameIdx] == TCX_5 ) + { + /* subframe is TCX5, but TCX10 or TCX20 in other channel -> convert channel with TCX5 to TCX10 resolution */ + pTmp[subFrameIdx] = sig[subFrameIdx] = convertRes + subFrameIdx * frameSize / 2; + convert_coeffs_to_higher_res( x[chInIdx][subFrameIdx], x[chInIdx][subFrameIdx] + frameSize / 4, pTmp[subFrameIdx], frameSize / 4 ); + } + } + + /* convert channel with TCX10 to TCX20 resolution */ + sig[0] = convertRes; + convert_coeffs_to_higher_res( pTmp[0], pTmp[1], sig[0], frameSize / 2 ); + } + + /* MDST estimate */ + mdst[0] = mdst[frameSize - 1] = 0.f; + for ( i = 1; i < frameSize - 1; i++ ) + { + mdst[i] = sig[0][i + 1] - sig[0][i - 1]; + } + + for ( bandIdx = 0; bandIdx < hLsSetUpConversion->sfbCnt; bandIdx++ ) + { + start = hLsSetUpConversion->sfbOffset[bandIdx]; + stop = hLsSetUpConversion->sfbOffset[bandIdx + 1]; + + targetEne = 0.0f; + + /* Loop over all the bins in the band */ + for ( binIdx = start; binIdx < stop; binIdx++ ) + { + tmpDMXSig = dmxCoeff * sig[0][binIdx]; + dmxSignalReal[binIdx] += tmpDMXSig; + targetEne += tmpDMXSig * tmpDMXSig; + + tmpDMXSig = dmxCoeff * mdst[binIdx]; + dmxSignalImag[binIdx] += tmpDMXSig; + targetEne += tmpDMXSig * tmpDMXSig; + } + targetEnergy[bandIdx] += targetEne; + } /* end of band loop */ + } + } + } /* end of chInIdx loop */ + + for ( bandIdx = 0; bandIdx < hLsSetUpConversion->sfbCnt; bandIdx++ ) + { + float tmpReal, tmpImag, DMXEne; + + start = hLsSetUpConversion->sfbOffset[bandIdx]; + stop = hLsSetUpConversion->sfbOffset[bandIdx + 1]; + + /* Loop over all the bins in the band */ + DMXEne = 0.0f; + for ( binIdx = start; binIdx < stop; binIdx++ ) + { + tmpReal = dmxSignalReal[binIdx]; + tmpImag = dmxSignalImag[binIdx]; + + DMXEne += tmpReal * tmpReal + tmpImag * tmpImag; + } + dmxEnergy[bandIdx] += DMXEne; + } + } /* end of out channel loop */ + + /* Step 3: Peform energy smoothing */ + for ( bandIdx = 0; bandIdx < hLsSetUpConversion->sfbCnt; bandIdx++ ) + { + targetEnergy[bandIdx] = LS_OUT_CONV_SMOOTHING_FACTOR * targetEnergy[bandIdx] + ( 1.0f - LS_OUT_CONV_SMOOTHING_FACTOR ) * hLsSetUpConversion->targetEnergyPrev[0][bandIdx]; + dmxEnergy[bandIdx] = LS_OUT_CONV_SMOOTHING_FACTOR * dmxEnergy[bandIdx] + ( 1.0f - LS_OUT_CONV_SMOOTHING_FACTOR ) * hLsSetUpConversion->dmxEnergyPrev[0][bandIdx]; + hLsSetUpConversion->targetEnergyPrev[0][bandIdx] = targetEnergy[bandIdx]; + hLsSetUpConversion->dmxEnergyPrev[0][bandIdx] = dmxEnergy[bandIdx]; + } + + /* Step 4: Perform equalization */ + for ( chInIdx = 0; chInIdx < inChannels; chInIdx++ ) + { + if ( + chInIdx != LFE_CHANNEL && + mct_chan_mode[chInIdx] != MCT_CHAN_MODE_IGNORE ) + { + if ( transform_type[chInIdx][0] == TCX_20 ) + { + /* TCX20 */ + for ( bandIdx = 0; bandIdx < hLsSetUpConversion->sfbCnt; bandIdx++ ) + { + start = hLsSetUpConversion->sfbOffset[bandIdx]; + stop = hLsSetUpConversion->sfbOffset[bandIdx + 1]; + + /* Compute Eq gains */ + ivas_lssetupconversion_computeEQFactor( &targetEnergy[bandIdx], &dmxEnergy[bandIdx], &eqGain ); + for ( binIdx = start; binIdx < stop; binIdx++ ) + { + x[chInIdx][0][binIdx] *= eqGain; + } + } + } + else + { + stop_tcx5 = 0; + for ( bandIdx = 0; bandIdx < hLsSetUpConversion->sfbCnt; bandIdx++ ) + { + start = hLsSetUpConversion->sfbOffset[bandIdx] / 2; + stop = hLsSetUpConversion->sfbOffset[bandIdx + 1] / 2; + + /* Compute Eq gains */ + ivas_lssetupconversion_computeEQFactor( &targetEnergy[bandIdx], &dmxEnergy[bandIdx], &eqGain ); + + for ( subFrameIdx = 0; subFrameIdx < NB_DIV; subFrameIdx++ ) + { + if ( transform_type[chInIdx][subFrameIdx] == TCX_10 ) + { + /* TCX10 */ + for ( binIdx = start; binIdx < stop; binIdx++ ) + { + x[chInIdx][subFrameIdx][binIdx] *= eqGain; + } + } + else + { + /* TCX5*/ + start_tcx5 = stop_tcx5; + stop_tcx5 = ( stop + 1 ) / 2; + + for ( binIdx = start_tcx5; binIdx < stop_tcx5; binIdx++ ) + { + x[chInIdx][subFrameIdx][binIdx] *= eqGain; + x[chInIdx][subFrameIdx][binIdx + ( frameSize >> 2 )] *= eqGain; + } + } + } + } + } + } + } + + pop_wmops(); + return; +} + + +/*------------------------------------------------------------------------- + * ivas_ls_setup_conversion_process_mdct_param_mc() + * + * Equalization in MDCT Domain + *-------------------------------------------------------------------------*/ + +void ivas_ls_setup_conversion_process_mdct_param_mc( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float *x[][NB_DIV] /* i/o: output synthesis signal */ +) +{ + /* Declaration of all required variables */ + int16_t i; + int16_t idx; + int16_t nchan_transport, nchan_out, nchan_transport_format; + int16_t chInIdx, chOutIdx, cpe_idx, subFrameIdx, binIdx; + int16_t band, bandIdx, num_bands; + + int16_t num_CPE; + int16_t transform_type[MAX_CICP_CHANNELS][2]; + int16_t frameSize; + + float targetEnergy[MAX_SFB + 2], dmxEnergy[MAX_SFB + 2]; + float eqGain; + float *sig[MAX_CICP_CHANNELS][NB_DIV], *pTmp[NB_DIV]; + float mdst[MAX_CICP_CHANNELS][L_FRAME48k]; + float convertRes[MAX_CICP_CHANNELS][L_FRAME48k]; + int16_t start, stop, start_tcx5, stop_tcx5; + int16_t mct_chan_mode[MAX_CICP_CHANNELS]; + + float cx[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS]; + float cx_imag[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS]; + float cy[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; + float real_in_buffer[PARAM_MC_MAX_BANDS_IN_PARAMETER_BAND * PARAM_MC_BAND_TO_MDCT_BAND_RATIO * MAX_TRANSPORT_CHANNELS]; + float imag_in_buffer[PARAM_MC_MAX_BANDS_IN_PARAMETER_BAND * PARAM_MC_BAND_TO_MDCT_BAND_RATIO * MAX_TRANSPORT_CHANNELS]; + float real_buffer[PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS]; + float imag_buffer[PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS]; + + float Nrqq[MAX_OUTPUT_CHANNELS]; + float target_ch_ener[MAX_OUTPUT_CHANNELS]; + float *ild_q; + + float DMXEne; + float dmxCoeff; + float dmxSignalReal[L_FRAME48k], dmxSignalImag[L_FRAME48k]; + + float tmpReal, tmpImag; + float tmpDMXSig; + + /* Declare all handles */ + LSSETUP_CONVERSION_HANDLE hLsSetUpConversion; + CPE_DEC_HANDLE hCPE[MCT_MAX_BLOCKS]; + PARAM_MC_DEC_HANDLE hParamMC; + + /* Step 0: Set the buffers to zero */ + set_zero( dmxSignalReal, L_FRAME48k ); + set_zero( dmxSignalImag, L_FRAME48k ); + + /* Assign all the declared variables */ + nchan_transport = st_ivas->nchan_transport; + nchan_out = st_ivas->hDecoderConfig->nchan_out; + num_CPE = st_ivas->nCPE; + nchan_transport_format = st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe; + + /* Assign all the declared handles*/ + hLsSetUpConversion = st_ivas->hLsSetUpConversion; + for ( cpe_idx = 0; cpe_idx < num_CPE; cpe_idx++ ) + { + hCPE[cpe_idx] = st_ivas->hCPE[cpe_idx]; + } + hParamMC = st_ivas->hParamMC; + + /* Get the core type */ + for ( cpe_idx = 0; cpe_idx < num_CPE; cpe_idx++ ) + { + for ( idx = 0; idx < CPE_CHANNELS; idx++ ) + { + /* get the channel index */ + chInIdx = cpe_idx * CPE_CHANNELS + idx; + assert( chInIdx <= nchan_transport ); + transform_type[chInIdx][0] = hCPE[cpe_idx]->hCoreCoder[idx]->transform_type[0]; + transform_type[chInIdx][1] = hCPE[cpe_idx]->hCoreCoder[idx]->transform_type[1]; + mct_chan_mode[chInIdx] = hCPE[cpe_idx]->hCoreCoder[idx]->mct_chan_mode; + } + } + + /* set overall frequency resolution of (sub)frame to maximum of (sub)frame, requires conversion if both channels are not the same */ + frameSize = hLsSetUpConversion->sfbOffset[hLsSetUpConversion->sfbCnt]; + + set_zero( targetEnergy, MAX_SFB + 2 ); + set_zero( dmxEnergy, MAX_SFB + 2 ); + + for ( chInIdx = 0; chInIdx < nchan_transport; chInIdx++ ) + { + if ( mct_chan_mode[chInIdx] != MCT_CHAN_MODE_IGNORE ) + { + /* initially, set pointers to input; if conversion occurs in (sub)frame, set to convertRes */ + sig[chInIdx][0] = pTmp[0] = x[chInIdx][0]; + sig[chInIdx][1] = pTmp[1] = x[chInIdx][1]; + + /* convert (sub)frames to higher frequency resolution */ + if ( transform_type[chInIdx][0] != TCX_20 ) + { + for ( subFrameIdx = 0; subFrameIdx < NB_DIV; subFrameIdx++ ) + { + if ( transform_type[chInIdx][subFrameIdx] == TCX_5 ) + { + /* subframe is TCX5, but TCX10 or TCX20 in other channel -> convert channel with TCX5 to TCX10 resolution */ + pTmp[subFrameIdx] = sig[chInIdx][subFrameIdx] = convertRes[chInIdx] + subFrameIdx * frameSize / 2; + convert_coeffs_to_higher_res( x[chInIdx][subFrameIdx], x[chInIdx][subFrameIdx] + frameSize / 4, pTmp[subFrameIdx], frameSize / 4 ); + } + } + + /* convert channel with TCX10 to TCX20 resolution */ + sig[chInIdx][0] = convertRes[chInIdx]; + convert_coeffs_to_higher_res( pTmp[0], pTmp[1], sig[chInIdx][0], frameSize / 2 ); + } + } + } + + /* precalculate MDST estimate */ + for ( chInIdx = 0; chInIdx < nchan_transport; chInIdx++ ) + { + if ( mct_chan_mode[chInIdx] != MCT_CHAN_MODE_IGNORE ) + { + mdst[chInIdx][0] = mdst[chInIdx][frameSize - 1] = 0.f; + for ( i = 1; i < frameSize - 1; i++ ) + { + mdst[chInIdx][i] = sig[chInIdx][0][i + 1] - sig[chInIdx][0][i - 1]; + } + } + } + + /* Step 1.1, calculate Cx from MDST estimate */ + for ( bandIdx = 0; bandIdx < PARAM_MC_MAX_PARAMETER_BANDS; bandIdx++ ) + { + set_zero( cx[bandIdx], PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS ); + set_zero( cx_imag[bandIdx], PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS ); + } + + set_zero( Nrqq, MAX_OUTPUT_CHANNELS ); + set_zero( target_ch_ener, MAX_OUTPUT_CHANNELS ); + + for ( bandIdx = 0; bandIdx < hLsSetUpConversion->sfbCnt; bandIdx++ ) + { + set_zero( real_in_buffer, PARAM_MC_MAX_BANDS_IN_PARAMETER_BAND * PARAM_MC_BAND_TO_MDCT_BAND_RATIO * MAX_TRANSPORT_CHANNELS ); + set_zero( imag_in_buffer, PARAM_MC_MAX_BANDS_IN_PARAMETER_BAND * PARAM_MC_BAND_TO_MDCT_BAND_RATIO * MAX_TRANSPORT_CHANNELS ); + set_zero( real_buffer, PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS ); + set_zero( imag_buffer, PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS ); + + start = hLsSetUpConversion->sfbOffset[bandIdx]; + stop = hLsSetUpConversion->sfbOffset[bandIdx + 1]; + num_bands = stop - start; + + for ( i = 0; i < num_bands; i++ ) + { + band = start + i; + for ( idx = 0; idx < nchan_transport; idx++ ) + { + if ( mct_chan_mode[idx] != MCT_CHAN_MODE_IGNORE ) + { + real_in_buffer[i + num_bands * idx] = sig[idx][0][band]; + imag_in_buffer[i + num_bands * idx] = mdst[idx][band]; + } + } + } + + cmplx_matrix_square( real_in_buffer, imag_in_buffer, num_bands, nchan_transport, real_buffer, imag_buffer ); + + v_add( cx[bandIdx], real_buffer, cx[bandIdx], nchan_transport * nchan_transport ); + + v_add( cx_imag[bandIdx], imag_buffer, cx_imag[bandIdx], nchan_transport * nchan_transport ); + } + + for ( bandIdx = 0; bandIdx < hLsSetUpConversion->sfbCnt; bandIdx++ ) + { + DMXEne = 0.0f; + set_zero( cy, MAX_CICP_CHANNELS * MAX_CICP_CHANNELS ); + set_zero( Nrqq, MAX_OUTPUT_CHANNELS ); + set_zero( target_ch_ener, MAX_OUTPUT_CHANNELS ); + + /* Step 1.2, get target channel energies for the transported format as in ivas_param_mc_get_mono_stereo_mixing_matrices(), Nrqq calculation */ + ild_q = hParamMC->icld_q + bandIdx * hParamMC->hMetadataPMC->ild_mapping_conf->ild_map_size_lfe; + + for ( chInIdx = 0; chInIdx < nchan_transport_format; chInIdx++ ) + { + float ref_ener = 0.0f; + int16_t ref_channel_cnt; + int16_t ref_channel_idx; + + for ( ref_channel_cnt = 0; ref_channel_cnt < hParamMC->hMetadataPMC->ild_mapping_conf->num_ref_channels[chInIdx]; ref_channel_cnt++ ) + { + ref_channel_idx = hParamMC->hMetadataPMC->ild_mapping_conf->ref_channel_idx[chInIdx][ref_channel_cnt]; + ref_ener += cx[bandIdx][ref_channel_idx + ref_channel_idx * nchan_transport]; + } + + Nrqq[hParamMC->hMetadataPMC->ild_mapping_conf->ild_index[chInIdx]] = powf( 10.0f, ild_q[chInIdx] / 10.0f ) * hParamMC->hMetadataPMC->ild_factors[chInIdx] * ref_ener; + } + + /* Step 1.3 get target Cy like in ivas_param_mc_get_mono_stereo_mixing_matrices() (with dmx matrix from CICPX to MONO/STEREO saved in hParamMC) */ + for ( chOutIdx = 0; chOutIdx < nchan_out; chOutIdx++ ) + { + for ( i = 0; i < nchan_transport_format; i++ ) + { + target_ch_ener[chOutIdx] += hParamMC->ls_conv_dmx_matrix[chOutIdx + i * nchan_out] * Nrqq[i]; + } + cy[chOutIdx + nchan_out * chOutIdx] = target_ch_ener[chOutIdx]; + } + + /* Step 1.4 final target energy for the band would then be the sum over the diagonal of Cy*/ + for ( chOutIdx = 0; chOutIdx < nchan_out; chOutIdx++ ) + { + targetEnergy[bandIdx] += cy[chOutIdx + nchan_out * chOutIdx]; + } + + /* Step 2: Calculate DMX ener */ + start = hLsSetUpConversion->sfbOffset[bandIdx]; + stop = hLsSetUpConversion->sfbOffset[bandIdx + 1]; + + for ( chOutIdx = 0; chOutIdx < nchan_out; chOutIdx++ ) + { + for ( chInIdx = 0; chInIdx < nchan_transport; chInIdx++ ) + { + if ( mct_chan_mode[chInIdx] != MCT_CHAN_MODE_IGNORE ) + { + dmxCoeff = hLsSetUpConversion->dmxMtx[chInIdx][chOutIdx]; + + /* Step 1: Compute the target energy and DMX signal (possible since we have all signals in TCX20 resolution) */ + if ( dmxCoeff ) + { + /* Loop over all the bins in the band */ + for ( binIdx = start; binIdx < stop; binIdx++ ) + { + tmpDMXSig = dmxCoeff * sig[chInIdx][0][binIdx]; + dmxSignalReal[binIdx] += tmpDMXSig; + + tmpDMXSig = dmxCoeff * mdst[chInIdx][binIdx]; + dmxSignalImag[binIdx] += tmpDMXSig; + } + } + } + } + + /* Loop over all the bins in the band */ + DMXEne = 0.0f; + for ( binIdx = start; binIdx < stop; binIdx++ ) + { + tmpReal = dmxSignalReal[binIdx]; + tmpImag = dmxSignalImag[binIdx]; + + DMXEne += tmpReal * tmpReal + tmpImag * tmpImag; + } + } + + dmxEnergy[bandIdx] = DMXEne; + } + + /* Step 3: Peform energy smoothing */ + for ( bandIdx = 0; bandIdx < hLsSetUpConversion->sfbCnt; bandIdx++ ) + { + targetEnergy[bandIdx] = LS_OUT_CONV_SMOOTHING_FACTOR * targetEnergy[bandIdx] + ( 1.0f - LS_OUT_CONV_SMOOTHING_FACTOR ) * hLsSetUpConversion->targetEnergyPrev[0][bandIdx]; + dmxEnergy[bandIdx] = LS_OUT_CONV_SMOOTHING_FACTOR * dmxEnergy[bandIdx] + ( 1.0f - LS_OUT_CONV_SMOOTHING_FACTOR ) * hLsSetUpConversion->dmxEnergyPrev[0][bandIdx]; + hLsSetUpConversion->targetEnergyPrev[0][bandIdx] = targetEnergy[bandIdx]; + hLsSetUpConversion->dmxEnergyPrev[0][bandIdx] = dmxEnergy[bandIdx]; + } + + /* Step 4: Perform equalization */ + for ( chInIdx = 0; chInIdx < nchan_transport; chInIdx++ ) + { + if ( mct_chan_mode[chInIdx] != MCT_CHAN_MODE_IGNORE ) + { + if ( transform_type[chInIdx][0] == TCX_20 ) + { + /*TCX20*/ + for ( bandIdx = 0; bandIdx < hLsSetUpConversion->sfbCnt; bandIdx++ ) + { + start = hLsSetUpConversion->sfbOffset[bandIdx]; + stop = hLsSetUpConversion->sfbOffset[bandIdx + 1]; + + /*Compute Eq gains */ + ivas_lssetupconversion_computeEQFactor( &targetEnergy[bandIdx], &dmxEnergy[bandIdx], &eqGain ); + for ( binIdx = start; binIdx < stop; binIdx++ ) + { + x[chInIdx][0][binIdx] *= eqGain; + } + } + } + else + { + stop_tcx5 = 0; + for ( bandIdx = 0; bandIdx < hLsSetUpConversion->sfbCnt; bandIdx++ ) + { + start = hLsSetUpConversion->sfbOffset[bandIdx] / 2; + stop = hLsSetUpConversion->sfbOffset[bandIdx + 1] / 2; + + /*Compute Eq gains */ + ivas_lssetupconversion_computeEQFactor( &targetEnergy[bandIdx], &dmxEnergy[bandIdx], &eqGain ); + + for ( subFrameIdx = 0; subFrameIdx < NB_DIV; subFrameIdx++ ) + { + if ( transform_type[chInIdx][subFrameIdx] == TCX_10 ) + { + /*TCX10*/ + for ( binIdx = start; binIdx < stop; binIdx++ ) + { + x[chInIdx][subFrameIdx][binIdx] *= eqGain; + } + } + else + { + /* TCX5*/ + start_tcx5 = stop_tcx5; + stop_tcx5 = ( stop + 1 ) / 2; + for ( binIdx = start_tcx5; binIdx < stop_tcx5; binIdx++ ) + { + x[chInIdx][subFrameIdx][binIdx] *= eqGain; + } + + for ( binIdx = start_tcx5; binIdx < stop_tcx5; binIdx++ ) + { + x[chInIdx][subFrameIdx][binIdx + ( frameSize >> 2 )] *= eqGain; + } + } + } + } + } + } + } + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_ls_setup_conversion_process_param_mc() + * + * LS setup conversion in the CLDFB domain for Parametric MC + *-------------------------------------------------------------------------*/ + +void ivas_lssetupconversion_process_param_mc( + Decoder_Struct *st_ivas, /* i/o: LS setup conversion renderer handle */ + const int16_t num_timeslots, + float Cldfb_RealBuffer_InOut[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i/o: LS signals */ + float Cldfb_ImagBuffer_InOut[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i/o: LS signals */ + int16_t channel_active[MAX_CICP_CHANNELS] /* i : bitmap indicating which output channels are active */ +) +{ + int16_t slotIdx, chOutIdx, chInIdx, bandIdx; + int16_t inChannels, outChannels; + float targetEnergy[MAX_CICP_CHANNELS][CLDFB_NO_CHANNELS_MAX]; + float dmxEnergy[MAX_CICP_CHANNELS][CLDFB_NO_CHANNELS_MAX]; + float tmpDMXSig, dmxCoeff, tmpReal, tmpImag; + float EQ; + float Cldfb_RealBuffer_tmp[MAX_CICP_CHANNELS][CLDFB_NO_CHANNELS_MAX]; + float Cldfb_ImagBuffer_tmp[MAX_CICP_CHANNELS][CLDFB_NO_CHANNELS_MAX]; + LSSETUP_CONVERSION_HANDLE hLsSetUpConversion; + + push_wmops( "LS_Renderer_Process_Param_MC" ); + /* inits */ + inChannels = st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe; + outChannels = st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe; + + hLsSetUpConversion = st_ivas->hLsSetUpConversion; + EQ = 0.0f; + + set_s( channel_active, 0, outChannels ); + + /* Loop over each time slots and compute dmx for each time slot */ + for ( slotIdx = 0; slotIdx < num_timeslots; slotIdx++ ) + { + /* copy buffers */ + for ( chInIdx = 0; chInIdx < inChannels; chInIdx++ ) + { + mvr2r( Cldfb_RealBuffer_InOut[chInIdx][slotIdx], Cldfb_RealBuffer_tmp[chInIdx], CLDFB_NO_CHANNELS_MAX ); + mvr2r( Cldfb_ImagBuffer_InOut[chInIdx][slotIdx], Cldfb_ImagBuffer_tmp[chInIdx], CLDFB_NO_CHANNELS_MAX ); + } + /* set the buffers to zero */ + for ( chOutIdx = 0; chOutIdx < outChannels; chOutIdx++ ) + { + set_f( Cldfb_RealBuffer_InOut[chOutIdx][slotIdx], 0.0f, CLDFB_NO_CHANNELS_MAX ); + set_f( Cldfb_ImagBuffer_InOut[chOutIdx][slotIdx], 0.0f, CLDFB_NO_CHANNELS_MAX ); + + set_f( dmxEnergy[chOutIdx], 0.0f, CLDFB_NO_CHANNELS_MAX ); + set_f( targetEnergy[chOutIdx], 0.0f, CLDFB_NO_CHANNELS_MAX ); + } + + /* Compute the target energy and DMX signal */ + for ( chOutIdx = 0; chOutIdx < outChannels; chOutIdx++ ) + { + for ( chInIdx = 0; chInIdx < inChannels; chInIdx++ ) + { + dmxCoeff = hLsSetUpConversion->dmxMtx[chInIdx][chOutIdx]; + if ( dmxCoeff == 0.0f ) + { + continue; + } + else + { + channel_active[chOutIdx] |= 1; + for ( bandIdx = 0; bandIdx < hLsSetUpConversion->sfbCnt; bandIdx++ ) + { + tmpDMXSig = dmxCoeff * Cldfb_RealBuffer_tmp[chInIdx][bandIdx]; + Cldfb_RealBuffer_InOut[chOutIdx][slotIdx][bandIdx] += tmpDMXSig; + targetEnergy[chOutIdx][bandIdx] += tmpDMXSig * tmpDMXSig; + + tmpDMXSig = dmxCoeff * Cldfb_ImagBuffer_tmp[chInIdx][bandIdx]; + Cldfb_ImagBuffer_InOut[chOutIdx][slotIdx][bandIdx] += tmpDMXSig; + targetEnergy[chOutIdx][bandIdx] += tmpDMXSig * tmpDMXSig; + } + } + } + } + + /* Compute the DMX energy */ + for ( chOutIdx = 0; chOutIdx < outChannels; chOutIdx++ ) + { + if ( channel_active[chOutIdx] ) + { + for ( bandIdx = 0; bandIdx < hLsSetUpConversion->sfbCnt; bandIdx++ ) + { + tmpReal = Cldfb_RealBuffer_InOut[chOutIdx][slotIdx][bandIdx]; + tmpImag = Cldfb_ImagBuffer_InOut[chOutIdx][slotIdx][bandIdx]; + + dmxEnergy[chOutIdx][bandIdx] = tmpReal * tmpReal + tmpImag * tmpImag; + } + } + } + + /* Peform energy smoothing */ + for ( chOutIdx = 0; chOutIdx < outChannels; chOutIdx++ ) + { + if ( channel_active[chOutIdx] ) + { + for ( bandIdx = 0; bandIdx < hLsSetUpConversion->sfbCnt; bandIdx++ ) + { + targetEnergy[chOutIdx][bandIdx] = LS_OUT_CONV_SMOOTHING_FACTOR * targetEnergy[chOutIdx][bandIdx] + ( 1 - LS_OUT_CONV_SMOOTHING_FACTOR ) * hLsSetUpConversion->targetEnergyPrev[chOutIdx][bandIdx]; + dmxEnergy[chOutIdx][bandIdx] = LS_OUT_CONV_SMOOTHING_FACTOR * dmxEnergy[chOutIdx][bandIdx] + ( 1 - LS_OUT_CONV_SMOOTHING_FACTOR ) * hLsSetUpConversion->dmxEnergyPrev[chOutIdx][bandIdx]; + hLsSetUpConversion->targetEnergyPrev[chOutIdx][bandIdx] = targetEnergy[chOutIdx][bandIdx]; + hLsSetUpConversion->dmxEnergyPrev[chOutIdx][bandIdx] = dmxEnergy[chOutIdx][bandIdx]; + } + } + } + + /* Compute and perform equalization */ + for ( chOutIdx = 0; chOutIdx < outChannels; chOutIdx++ ) + { + if ( channel_active[chOutIdx] ) + { + for ( bandIdx = 0; bandIdx < hLsSetUpConversion->sfbCnt; bandIdx++ ) + { + ivas_lssetupconversion_computeEQFactor( &targetEnergy[chOutIdx][bandIdx], &dmxEnergy[chOutIdx][bandIdx], &EQ ); + Cldfb_RealBuffer_InOut[chOutIdx][slotIdx][bandIdx] *= EQ; + Cldfb_ImagBuffer_InOut[chOutIdx][slotIdx][bandIdx] *= EQ; + } + } + } + } + + pop_wmops(); + return; +} diff --git a/lib_dec/ivas_output_config.c b/lib_dec/ivas_output_config.c new file mode 100644 index 0000000000000000000000000000000000000000..94bf27274d13ea2bb151620571203665123c1a41 --- /dev/null +++ b/lib_dec/ivas_output_config.c @@ -0,0 +1,447 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "ivas_cnst.h" +#include "ivas_prot.h" +#include "ivas_stat_dec.h" +#include "wmc_auto.h" + + +/*-------------------------------------------------------------------------* + * ivas_renderer_select() + * + * Select and configure IVAS renderer parameters + *-------------------------------------------------------------------------*/ + +void ivas_renderer_select( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +) +{ + RENDERER_TYPE *renderer_type; + AUDIO_CONFIG *internal_config; + AUDIO_CONFIG output_config; + AUDIO_CONFIG transport_config; + + int16_t nchan_internal; + + renderer_type = &( st_ivas->renderer_type ); + internal_config = &( st_ivas->intern_config ); + output_config = st_ivas->hDecoderConfig->output_config; + transport_config = st_ivas->transport_config; + + /* disabled rendering by default */ + *renderer_type = RENDERER_DISABLE; + + /*-----------------------------------------------------------------* + * Binaural rendering configurations + *-----------------------------------------------------------------*/ + + if ( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation ) + { + st_ivas->hCombinedOrientationData->shd_rot_max_order = -1; + } + + if ( output_config == IVAS_AUDIO_CONFIG_BINAURAL || output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR || output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB + ) + { + if ( st_ivas->ivas_format == ISM_FORMAT ) + { + if ( st_ivas->ism_mode == ISM_MODE_PARAM ) + { + if ( output_config == IVAS_AUDIO_CONFIG_BINAURAL ) + { + *renderer_type = RENDERER_BINAURAL_PARAMETRIC; + } + else + { + *renderer_type = RENDERER_BINAURAL_PARAMETRIC_ROOM; + } + } + else /* ISM_MODE_DISC */ + { + if ( output_config == IVAS_AUDIO_CONFIG_BINAURAL || output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB + ) + { + *renderer_type = RENDERER_BINAURAL_OBJECTS_TD; + *internal_config = output_config; + } + else + { + *renderer_type = RENDERER_BINAURAL_MIXER_CONV_ROOM; + *internal_config = IVAS_AUDIO_CONFIG_7_1_4; + } + } + } + else if ( st_ivas->ivas_format == MASA_FORMAT || st_ivas->ivas_format == MASA_ISM_FORMAT || ( ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT ) && st_ivas->nchan_transport <= 2 ) ) + { + *internal_config = output_config; + + if ( output_config == IVAS_AUDIO_CONFIG_BINAURAL ) + { + *renderer_type = RENDERER_BINAURAL_PARAMETRIC; + } + else + { + *renderer_type = RENDERER_BINAURAL_PARAMETRIC_ROOM; + } + } + else if ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT ) + { + *internal_config = IVAS_AUDIO_CONFIG_HOA3; + + if ( output_config == IVAS_AUDIO_CONFIG_BINAURAL || output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB + ) + { + *renderer_type = RENDERER_BINAURAL_FASTCONV; + } + else + { + *renderer_type = RENDERER_BINAURAL_FASTCONV_ROOM; + } + + if ( st_ivas->ivas_format == SBA_ISM_FORMAT && *renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) + { + *internal_config = IVAS_AUDIO_CONFIG_7_1_4; + } + + if ( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation ) + { + + nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); + if ( nchan_internal == 2 ) + { + st_ivas->hCombinedOrientationData->shd_rot_max_order = 1; + } + else if ( nchan_internal == 4 || nchan_internal == 3 ) + { + st_ivas->hCombinedOrientationData->shd_rot_max_order = 0; + } + else if ( nchan_internal == 6 || nchan_internal == 5 ) + { + st_ivas->hCombinedOrientationData->shd_rot_max_order = 2; + } + else if ( nchan_internal == 8 || nchan_internal == 7 ) + { + st_ivas->hCombinedOrientationData->shd_rot_max_order = 3; + } + } + } + else if ( st_ivas->ivas_format == MC_FORMAT ) + { + if ( st_ivas->mc_mode == MC_MODE_MCMASA ) + { + *internal_config = output_config; + + if ( output_config == IVAS_AUDIO_CONFIG_BINAURAL ) + { + *renderer_type = RENDERER_BINAURAL_PARAMETRIC; + } + else + { + *renderer_type = RENDERER_BINAURAL_PARAMETRIC_ROOM; + } + } + else + { + *internal_config = transport_config; + + if ( output_config == IVAS_AUDIO_CONFIG_BINAURAL || output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) + { + if ( ( st_ivas->transport_config == IVAS_AUDIO_CONFIG_5_1 || st_ivas->transport_config == IVAS_AUDIO_CONFIG_7_1 ) && ( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation ) && ( st_ivas->mc_mode == MC_MODE_MCT || st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) ) + { + *renderer_type = RENDERER_BINAURAL_OBJECTS_TD; + } + else + { + if ( st_ivas->mc_mode == MC_MODE_MCT ) + { + *renderer_type = RENDERER_BINAURAL_MIXER_CONV; + } + else + { + *renderer_type = RENDERER_BINAURAL_FASTCONV; + } + +#if 0 // def DEBUGGING /*temp disabling this as paramMC crashes with CREND*/ + if ( st_ivas->hRenderConfig->renderer_type_override == IVAS_RENDER_TYPE_OVERRIDE_CREND ) + { + *renderer_type = RENDERER_BINAURAL_MIXER_CONV; + } + else if ( st_ivas->hRenderConfig->renderer_type_override == IVAS_RENDER_TYPE_OVERRIDE_FASTCONV ) + { + *renderer_type = RENDERER_BINAURAL_FASTCONV; + } +#endif + if ( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation ) + { + /* force HOA3 domain for rotation*/ + *internal_config = IVAS_AUDIO_CONFIG_HOA3; + } + } + } + else + { + if ( st_ivas->mc_mode == MC_MODE_MCT ) + { + *renderer_type = RENDERER_BINAURAL_MIXER_CONV_ROOM; + } + else + { + *renderer_type = RENDERER_BINAURAL_FASTCONV_ROOM; + } + } + } + } + } + + /*-----------------------------------------------------------------* + * Non-binaural rendering configurations + *-----------------------------------------------------------------*/ + + else if ( st_ivas->ivas_format == MONO_FORMAT ) + { + if ( output_config == IVAS_AUDIO_CONFIG_STEREO ) + { + *renderer_type = RENDERER_NON_DIEGETIC_DOWNMIX; + } + } + else if ( st_ivas->ivas_format == STEREO_FORMAT ) + { + if ( output_config != IVAS_AUDIO_CONFIG_STEREO && output_config != IVAS_AUDIO_CONFIG_MONO ) + { + *renderer_type = RENDERER_MC; + } + } + else if ( st_ivas->ivas_format == ISM_FORMAT ) + { + if ( ( output_config == IVAS_AUDIO_CONFIG_STEREO ) && ( st_ivas->hDecoderConfig->Opt_non_diegetic_pan ) ) + { + *renderer_type = RENDERER_NON_DIEGETIC_DOWNMIX; + } + else + { + if ( st_ivas->ism_mode == ISM_MODE_PARAM ) + { + *renderer_type = RENDERER_PARAM_ISM; + if ( output_config == IVAS_AUDIO_CONFIG_MONO ) + { + *renderer_type = RENDERER_MONO_DOWNMIX; + } + else if ( output_config == IVAS_AUDIO_CONFIG_STEREO ) + { + *renderer_type = RENDERER_DISABLE; + } + else if ( output_config == IVAS_AUDIO_CONFIG_FOA || output_config == IVAS_AUDIO_CONFIG_HOA2 || output_config == IVAS_AUDIO_CONFIG_HOA3 ) + { + *renderer_type = RENDERER_SBA_LINEAR_ENC; + *internal_config = IVAS_AUDIO_CONFIG_7_1_4; + } + } + else /* ISM_MODE_DISC */ + { + *renderer_type = RENDERER_TD_PANNING; + if ( output_config == IVAS_AUDIO_CONFIG_MONO ) + { + *renderer_type = RENDERER_MONO_DOWNMIX; + } + else if ( output_config == IVAS_AUDIO_CONFIG_FOA || output_config == IVAS_AUDIO_CONFIG_HOA2 || output_config == IVAS_AUDIO_CONFIG_HOA3 ) + { + *renderer_type = RENDERER_SBA_LINEAR_ENC; + } + else if ( output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) + { + *renderer_type = RENDERER_DISABLE; + } + } + } + } + else if ( st_ivas->ivas_format == MASA_FORMAT || st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT ) + { + IVAS_FORMAT ivas_format; + *renderer_type = RENDERER_DIRAC; + ivas_format = ( st_ivas->ivas_format == SBA_ISM_FORMAT && st_ivas->ism_mode == ISM_MODE_NONE ) ? SBA_FORMAT : st_ivas->ivas_format; /* treat ISM_SBA_MODE_NONE just like SBA_FORMAT */ + + if ( ivas_format == SBA_FORMAT && ( output_config != IVAS_AUDIO_CONFIG_5_1 && output_config != IVAS_AUDIO_CONFIG_5_1_2 && output_config != IVAS_AUDIO_CONFIG_5_1_4 && output_config != IVAS_AUDIO_CONFIG_7_1 && output_config != IVAS_AUDIO_CONFIG_7_1_4 && output_config != IVAS_AUDIO_CONFIG_LS_CUSTOM && output_config != IVAS_AUDIO_CONFIG_MONO && output_config != IVAS_AUDIO_CONFIG_STEREO ) ) + { + if ( output_config == IVAS_AUDIO_CONFIG_HOA2 || output_config == IVAS_AUDIO_CONFIG_FOA ) + { + *internal_config = output_config; + } + else if ( output_config == IVAS_AUDIO_CONFIG_MONO || output_config == IVAS_AUDIO_CONFIG_STEREO ) + { + *internal_config = IVAS_AUDIO_CONFIG_FOA; + } + else + { + *internal_config = IVAS_AUDIO_CONFIG_HOA3; + } + st_ivas->renderer_type = RENDERER_SBA_LINEAR_DEC; + } + else if ( ( ivas_format == MASA_FORMAT && output_config == IVAS_AUDIO_CONFIG_MONO && st_ivas->nchan_transport == 1 ) || + ( ivas_format == SBA_FORMAT && ( output_config == IVAS_AUDIO_CONFIG_STEREO || output_config == IVAS_AUDIO_CONFIG_MONO ) ) ) + { + *renderer_type = RENDERER_DISABLE; + } + else if ( ( ivas_format == MASA_FORMAT && output_config == IVAS_AUDIO_CONFIG_MONO && st_ivas->hDecoderConfig->ivas_total_brate < MASA_STEREO_MIN_BITRATE && st_ivas->hDecoderConfig->ivas_total_brate > IVAS_SID_5k2 ) ) + { + *renderer_type = RENDERER_DISABLE; + } + else if ( ivas_format == MASA_FORMAT && output_config == IVAS_AUDIO_CONFIG_STEREO ) + { + *renderer_type = RENDERER_STEREO_PARAMETRIC; + } + else if ( ivas_format == MASA_FORMAT && output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) + { + *renderer_type = RENDERER_DISABLE; + } + else if ( ivas_format == SBA_FORMAT && output_config == IVAS_AUDIO_CONFIG_MONO ) + { + *renderer_type = RENDERER_SBA_LINEAR_DEC; + } + else if ( ivas_format == SBA_ISM_FORMAT && output_config == IVAS_AUDIO_CONFIG_STEREO ) + { + *renderer_type = RENDERER_OSBA_STEREO; + } + else if ( ivas_format == SBA_ISM_FORMAT && output_config == IVAS_AUDIO_CONFIG_MONO ) + { + *renderer_type = RENDERER_MONO_DOWNMIX; + } + else if ( ivas_format == SBA_ISM_FORMAT && ( output_config == IVAS_AUDIO_CONFIG_FOA || output_config == IVAS_AUDIO_CONFIG_HOA2 || output_config == IVAS_AUDIO_CONFIG_HOA3 ) ) + { + *renderer_type = RENDERER_OSBA_AMBI; + } + else if ( ivas_format == SBA_ISM_FORMAT && ( output_config == IVAS_AUDIO_CONFIG_5_1 || output_config == IVAS_AUDIO_CONFIG_5_1_2 || output_config == IVAS_AUDIO_CONFIG_5_1_4 || output_config == IVAS_AUDIO_CONFIG_7_1 || output_config == IVAS_AUDIO_CONFIG_7_1_4 || output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) + { + *renderer_type = RENDERER_OSBA_LS; + } + else if ( ivas_format == SBA_ISM_FORMAT && output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) + { + *renderer_type = RENDERER_SBA_LINEAR_DEC; + } + } + else if ( st_ivas->ivas_format == MASA_ISM_FORMAT ) + { + *renderer_type = RENDERER_DIRAC; + + if ( output_config == IVAS_AUDIO_CONFIG_MONO ) + { + *renderer_type = RENDERER_MONO_DOWNMIX; + } + else if ( output_config == IVAS_AUDIO_CONFIG_STEREO ) + { + *renderer_type = RENDERER_STEREO_PARAMETRIC; + } + else if ( output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) + { + *renderer_type = RENDERER_DISABLE; + } + } + else if ( st_ivas->ivas_format == MC_FORMAT ) + { + *internal_config = transport_config; + if ( st_ivas->mc_mode == MC_MODE_MCT && *internal_config != output_config ) + { + if ( output_config != IVAS_AUDIO_CONFIG_FOA && output_config != IVAS_AUDIO_CONFIG_HOA2 && output_config != IVAS_AUDIO_CONFIG_HOA3 ) + { + *renderer_type = RENDERER_MC; + } + else + { + *renderer_type = RENDERER_SBA_LINEAR_ENC; + } + } + else if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) + { + *internal_config = transport_config; + if ( *internal_config != output_config ) + { + if ( output_config != IVAS_AUDIO_CONFIG_FOA && output_config != IVAS_AUDIO_CONFIG_HOA2 && output_config != IVAS_AUDIO_CONFIG_HOA3 ) + { + *renderer_type = RENDERER_MC; + } + else + { + *renderer_type = RENDERER_SBA_LINEAR_ENC; + } + } + } + else if ( st_ivas->mc_mode == MC_MODE_PARAMMC ) + { + if ( output_config == IVAS_AUDIO_CONFIG_FOA || output_config == IVAS_AUDIO_CONFIG_HOA2 || output_config == IVAS_AUDIO_CONFIG_HOA3 ) + { + *renderer_type = RENDERER_SBA_LINEAR_ENC; + } + else + { + *renderer_type = RENDERER_MC_PARAMMC; + } + } + else if ( st_ivas->mc_mode == MC_MODE_MCMASA ) + { + *internal_config = output_config; + + /* No rendering for 1TC to Mono or Stereo and 2TC to Stereo */ + if ( output_config == IVAS_AUDIO_CONFIG_MONO || output_config == IVAS_AUDIO_CONFIG_STEREO ) + { + if ( st_ivas->nchan_transport == 1 ) + { + *renderer_type = RENDERER_DISABLE; + } + else if ( output_config == IVAS_AUDIO_CONFIG_STEREO && st_ivas->nchan_transport == 2 && !st_ivas->hOutSetup.separateChannelEnabled ) + { + *renderer_type = RENDERER_DISABLE; + } + else + { + *renderer_type = RENDERER_MCMASA_MONO_STEREO; + } + } + else + { + *renderer_type = RENDERER_DIRAC; + if ( output_config == IVAS_AUDIO_CONFIG_FOA || output_config == IVAS_AUDIO_CONFIG_HOA2 || output_config == IVAS_AUDIO_CONFIG_HOA3 ) + { + *renderer_type = RENDERER_SBA_LINEAR_ENC; + *internal_config = transport_config; + } + else if ( transport_config == IVAS_AUDIO_CONFIG_5_1 && ( output_config == IVAS_AUDIO_CONFIG_7_1 || output_config == IVAS_AUDIO_CONFIG_5_1_4 ) ) + { + *internal_config = transport_config; + } + } + } + } + + return; +} diff --git a/lib_dec/ivas_pca_dec.c b/lib_dec/ivas_pca_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..acb92fe88cb77a31b14ec4d2e30710f3884a9f0d --- /dev/null +++ b/lib_dec/ivas_pca_dec.c @@ -0,0 +1,311 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "prot.h" +#include "ivas_prot.h" +#include +#include "ivas_cnst.h" +#include "wmc_auto.h" + + +/*-----------------------------------------------------------------------* + * Local function definitions + *-----------------------------------------------------------------------*/ + +static int32_t ivas_bitstream_read_int32( + Decoder_State *st0, + const int16_t bits ) +{ + int32_t val; + + /* MSB */ + val = get_next_indice( st0, bits - 16 ) << 16; + + /* + LSB */ + val += get_next_indice( st0, 16 ); + + return val; +} + + +static void pca_dec_reset_dquat( + float *ql, + float *qr ) +{ + set_zero( ql, IVAS_PCA_INTERP ); + ql[0] = 1.0f; + + set_zero( qr, IVAS_PCA_INTERP ); + qr[0] = 1.0f; + + return; +} + + +static void pca_dec_reset_mem_eigvec( + PCA_DEC_STATE *hPCA ) +{ + int16_t i; + + for ( i = 0; i < ( IVAS_PCA_LEN_INTERP_EIG_DEC >> 4 ); i++ ) + { + eye_matrix( &hPCA->mem_eigVec_interp[16 * i], FOA_CHANNELS, 1.0f ); + } + + return; +} + + +static void pca_inv_transform_sub( + float *eigVec, + float *transformed_data[], /* i : input/transformed audio channels */ + const int16_t start, + const int16_t len, + const int16_t n_channels ) +{ + int16_t i, j, k; + float temp; + float buffer_data[FOA_CHANNELS]; + + for ( j = 0; j < len; j++ ) + { + for ( k = 0; k < n_channels; k++ ) + { + buffer_data[k] = transformed_data[k][j + start]; + } + + for ( k = 0; k < n_channels; k++ ) + { + temp = 0.0f; + for ( i = 0; i < n_channels; i++ ) + { + temp += eigVec[k * IVAS_PCA_INTERP + i] * buffer_data[i]; + } + transformed_data[k][j + start] = temp; + } + } + + return; +} + + +static void pca_dec_inv_transform( + PCA_DEC_STATE *hPCA, + float *ql, + float *qr, + const int16_t n_samples, + const int16_t n_channels, + float *decoded_data[] ) +{ + int16_t j; + int16_t slot_len; + float ql_interp[IVAS_PCA_LEN_INTERP_Q], qr_interp[IVAS_PCA_LEN_INTERP_Q]; + + quat_shortestpath( hPCA->prev_ql, ql, hPCA->prev_qr, qr ); + + pca_interp_preproc( hPCA->prev_ql, hPCA->prev_qr, ql, qr, IVAS_PCA_N_SLOTS, ql_interp, qr_interp ); + + slot_len = (int16_t) ( n_samples / IVAS_PCA_N_SLOTS ); + + for ( j = 0; j < IVAS_PCA_N_SLOTS; j++ ) + { + /* convert from double quaternion to 4D matrix */ + dquat2mat( &ql_interp[4 * j], &qr_interp[4 * j], &hPCA->mem_eigVec_interp[16 * j + IVAS_PCA_DELAY_CMP * 16] ); + + pca_inv_transform_sub( &hPCA->mem_eigVec_interp[16 * j], decoded_data, slot_len * j, slot_len, n_channels ); + } + + return; +} + + +static void pca_dec_update_dquat( + PCA_DEC_STATE *hPCA, + const float *ql, + const float *qr ) +{ + /* update state for next frame */ + mvr2r( qr, hPCA->prev_qr, IVAS_PCA_INTERP ); + mvr2r( ql, hPCA->prev_ql, IVAS_PCA_INTERP ); + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_pca_dec_init() + * + * Initialize PCA decoder + *------------------------------------------------------------------------*/ + +void ivas_pca_dec_init( + PCA_DEC_STATE *hPCA /* i/o: PCA decoder structure */ +) +{ + pca_dec_reset_dquat( hPCA->prev_ql, hPCA->prev_qr ); + pca_dec_reset_mem_eigvec( hPCA ); + + /* set counter saturated to 2 frames */ + hPCA->prev_pca_bypass = 2; + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_pca_read_bits() + * + * Decode PCA indexes + *------------------------------------------------------------------------*/ + +void ivas_pca_read_bits( + Decoder_State *st0, /* i/o: decoder state structure - for bitstream handling*/ + PCA_DEC_STATE *hPCA ) +{ + /*first bit in the PCA payload (first bit after 3 header bits) signals bypass/active*/ + hPCA->pca_bypass = get_next_indice( st0, 1 ); + + if ( hPCA->pca_bypass == PCA_MODE_INACTIVE ) + { + return; + } + + hPCA->index[0] = ivas_bitstream_read_int32( st0, IVAS_PCA_QBITS - 1 ); + hPCA->index[1] = ivas_bitstream_read_int32( st0, IVAS_PCA_QBITS ); + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_pca_dec() + * + * PCA decoder + *------------------------------------------------------------------------*/ + +void ivas_pca_dec( + PCA_DEC_STATE *hPCA, /* i/o: PCA decoder structure */ + const int16_t output_frame, /* i : output frame length */ + const int16_t n_channels, /* i : number of channels */ + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + const int32_t last_ivas_total_brate, /* i : last IVAS total bitrate */ + const int16_t bfi, /* i : bad frame indicator */ + float *pcm_out[] /* o : output audio channels */ +) +{ + float ql[IVAS_PCA_INTERP], qr[IVAS_PCA_INTERP]; + int16_t pca_bypass; + + mvr2r( &hPCA->mem_eigVec_interp[IVAS_PCA_N_SLOTS * 16], hPCA->mem_eigVec_interp, IVAS_PCA_DELAY_CMP * 16 ); + + /* @@@TODO: check how ivas_total_brate is set if bfi == 1 */ // ToDo: and what happens in DTX where "ivas_total_brate" can be close to zero? + + /* handle bit rate switching */ + if ( ivas_total_brate != PCA_BRATE || ( ivas_total_brate == PCA_BRATE && n_channels > FOA_CHANNELS ) ) + { + /* set PCA by-pass mode in current frame and interpolate transform as previous frame used PCA */ + pca_dec_reset_dquat( ql, qr ); + + if ( ( last_ivas_total_brate != PCA_BRATE ) || ( last_ivas_total_brate == PCA_BRATE && hPCA->prev_pca_bypass > 1 ) ) + { + pca_dec_reset_mem_eigvec( hPCA ); + } + else + { + pca_dec_inv_transform( hPCA, ql, qr, output_frame, n_channels, pcm_out ); + } + + pca_dec_update_dquat( hPCA, ql, qr ); + hPCA->prev_pca_bypass += 1; + + if ( hPCA->prev_pca_bypass > 2 ) + { + hPCA->prev_pca_bypass = 2; + } + + return; + } + + if ( !bfi ) + { + /* set PCA by-pass mode indicator */ + pca_bypass = hPCA->pca_bypass; + } + else + { + pca_bypass = hPCA->prev_pca_bypass; + } + + if ( pca_bypass == PCA_MODE_INACTIVE ) + { + pca_dec_reset_dquat( ql, qr ); + + if ( hPCA->prev_pca_bypass > 1 ) //&& (hPCA->pca_off_hangover == 0)) + { + /* copy input data into output directly as previous frame was already in by-pass mode */ + pca_dec_reset_mem_eigvec( hPCA ); + } + else + { + pca_dec_inv_transform( hPCA, ql, qr, output_frame, n_channels, pcm_out ); + } + + pca_dec_update_dquat( hPCA, ql, qr ); + + hPCA->prev_pca_bypass += 1; + hPCA->prev_pca_bypass = min( hPCA->prev_pca_bypass, 2 ); + + return; + } + + if ( !bfi ) + { + pca_dec_s3( hPCA->index[0], ql ); + pca_dec_s3( hPCA->index[1], qr ); + } + else + { + /* freeze */ + mvr2r( hPCA->prev_ql, ql, IVAS_PCA_INTERP ); + mvr2r( hPCA->prev_qr, qr, IVAS_PCA_INTERP ); + } + + pca_dec_inv_transform( hPCA, ql, qr, output_frame, n_channels, pcm_out ); + + /* update for next frame */ + pca_dec_update_dquat( hPCA, ql, qr ); + hPCA->prev_pca_bypass = 0; + + return; +} diff --git a/lib_dec/ivas_post_proc.c b/lib_dec/ivas_post_proc.c new file mode 100644 index 0000000000000000000000000000000000000000..08d1d25ab6ba9f77069a8e5cce31f62293356d4a --- /dev/null +++ b/lib_dec/ivas_post_proc.c @@ -0,0 +1,535 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include "options.h" +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_cnst.h" +#include "wmc_auto.h" + +/*------------------------------------------------------------------------- + * ivas_post_proc() + * + * IVAS post-processing + * - in SCE, post-processing of output channel + * - in CPE_DFT, post-processing on output channels + * - in CPE_TD, post-processing on decoded channels before upmixing + *-------------------------------------------------------------------------*/ + +void ivas_post_proc( + SCE_DEC_HANDLE hSCE, /* i/o: SCE decoder structure */ + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + const int16_t n, /* i : channel number */ + float synth[], /* i/o: output synthesis signal */ + float *output[CPE_CHANNELS], /* i/o: output synthesis signal */ + const int16_t output_frame, /* i : output frame length */ + const int16_t sba_dirac_stereo_flag /* i : signal stereo output for SBA DirAC */ +) +{ + int16_t k; + int16_t delay_comp; + int32_t output_Fs; + Decoder_State **sts; + TCX_LTP_DEC_HANDLE hTcxLtpDec; + + if ( hSCE != NULL ) + { + sts = hSCE->hCoreCoder; + } + else + { + sts = hCPE->hCoreCoder; + } + + output_Fs = sts[0]->output_Fs; + + if ( ( sts[n]->element_mode != IVAS_CPE_DFT && !( sba_dirac_stereo_flag && sts[n]->element_mode != IVAS_CPE_MDCT ) ) || ( sts[n]->element_mode == IVAS_CPE_DFT && hCPE->nchan_out == 1 && hCPE->hStereoDft->hConfig->res_cod_mode == STEREO_DFT_RES_COD_OFF ) ) + { + if ( sts[n]->hTcxLtpDec != NULL ) + { + hTcxLtpDec = sts[n]->hTcxLtpDec; + + if ( sts[n]->core != TCX_20_CORE && sts[n]->core != TCX_10_CORE ) + { + /* TCX-LTP Postfilter: used in Mode 1 to update memories and to avoid discontinuities when the past frame was TCX */ + tcx_ltp_post( sts[n], hTcxLtpDec, ACELP_CORE, output_frame, 0, synth, NULL ); + } + else + { + /* set delay */ + delay_comp = NS2SA( output_Fs, DELAY_CLDFB_NS ); + + if ( !( sts[n]->element_mode == IVAS_CPE_DFT && hCPE->nchan_out == 1 && hCPE->hStereoDft->hConfig->res_cod_mode == STEREO_DFT_RES_COD_OFF ) && sts[n]->element_mode != IVAS_CPE_MDCT ) + { + mvr2r( sts[n]->prev_synth_buffer, sts[n]->hTcxDec->FBTCXdelayBuf, 0 ); + mvr2r( sts[n]->delay_buf_out, sts[n]->hTcxDec->FBTCXdelayBuf + 0, delay_comp ); + } + else if ( sba_dirac_stereo_flag && sts[n]->element_mode == IVAS_CPE_MDCT ) + { + int16_t numZeros = (int16_t) ( NS2SA( output_Fs, N_ZERO_MDCT_NS ) ); + mvr2r( sts[n]->hHQ_core->old_out + numZeros, sts[n]->hTcxDec->FBTCXdelayBuf, delay_comp ); + } + + tcx_ltp_post( sts[n], hTcxLtpDec, sts[n]->core, output_frame, NS2SA( output_Fs, ACELP_LOOK_NS ) + delay_comp, synth, sts[n]->hTcxDec->FBTCXdelayBuf ); + } + } + } + else /* IVAS_CPE_DFT */ + { + int16_t pit_res_max_past_tmp; + + pit_res_max_past_tmp = sts[0]->pit_res_max_past; + for ( k = 0; k < hCPE->nchan_out; k++ ) + { + if ( k == 0 ) + { + hTcxLtpDec = sts[0]->hTcxLtpDec; + } + else + { + hTcxLtpDec = hCPE->hStereoDft->hTcxLtpDec; + /* copy LTP side-info of downmix channel also to right channel struct */ + hTcxLtpDec->tcxltp = sts[0]->hTcxLtpDec->tcxltp; + hTcxLtpDec->tcxltp_gain = sts[0]->hTcxLtpDec->tcxltp_gain; + hTcxLtpDec->tcxltp_pitch_int = sts[0]->hTcxLtpDec->tcxltp_pitch_int; + hTcxLtpDec->tcxltp_pitch_fr = sts[0]->hTcxLtpDec->tcxltp_pitch_fr; + /* revert update of pit_res_max_past to have correct value also in right channel */ + sts[0]->pit_res_max_past = pit_res_max_past_tmp; + } + + /*TCX-LTP*/ + if ( sts[0]->core != TCX_20_CORE && sts[0]->core != TCX_10_CORE ) + { + /* update memories and to avoid discontinuities when the past frame was TCX */ + tcx_ltp_post( sts[0], hTcxLtpDec, ACELP_CORE, output_frame, 0, output[k], NULL ); + } + else + { + /*Use channel 0 side info.*/ + tcx_ltp_post( sts[0], hTcxLtpDec, TCX_20_CORE, output_frame, NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ), output[k], hCPE->output_mem[k] ); + } + } + } + + return; +} + + +/*------------------------------------------------------------------------- + * stereo_dft_dec_core_switching() + * + * core switching in DFT stereo + *-------------------------------------------------------------------------*/ + +void stereo_dft_dec_core_switching( + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + float output[], /* i/o: synthesis @internal Fs */ + float synth[], /* i/o: synthesis @output Fs */ + float hb_synth[], /* i/o: hb synthesis */ + float DFT[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* o : DFT buffers */ + const int16_t output_frame, /* i : output frame length */ + const int16_t use_cldfb_for_dft, /* i : flag to use of CLDFB for DFT Stereo */ + const int16_t sba_dirac_stereo_dtx_flag /* i : DTX indicator for SBA DirAC stereo */ +) +{ + int16_t i, tmps; + int16_t delay_dft_dec, delay_dft_dec_lb, delay_tdbwe, delay_comp; + int16_t L_frameTCX; + int32_t output_Fs; + Decoder_State *st; + int16_t predelay, ap_fade_len; + float pAp_input[L_FRAME16k]; + float tcx_core_buf[L_FRAME16k]; + float synth_tmp[L_FRAME48k]; + + st = hCPE->hCoreCoder[0]; /* in DFT stereo, only M channel is decoded by the CoreCoder */ + output_Fs = st->output_Fs; + L_frameTCX = st->hTcxDec->L_frameTCX; + + /*TBE*/ + delay_tdbwe = NS2SA( output_Fs, DELAY_BWE_TOTAL_NS ); + delay_dft_dec = NS2SA( output_Fs, STEREO_DFT_DELAY_DEC_BWE_NS ); + delay_dft_dec_lb = NS2SA( st->L_frame * FRAMES_PER_SEC, STEREO_DFT_DELAY_DEC_BWE_NS ); + + /* TCX/ACELP/HQ-CORE->TCX */ + tmps = NS2SA( output_Fs, DELAY_BWE_TOTAL_NS ); /*cross-fading size @ FB*/ + delay_comp = NS2SA( st->L_frame * FRAMES_PER_SEC, DELAY_BWE_TOTAL_NS ); /*cross-fading size @ LB*/ + + /* resample DFT analysis memories in case of internal sampling rate change */ + if ( st->last_L_frame != st->L_frame && st->last_L_frame <= L_FRAME16k && st->L_frame <= L_FRAME16k ) + { + lerp( hCPE->input_mem_LB[0], hCPE->input_mem_LB[0], NS2SA( st->L_frame * FRAMES_PER_SEC, STEREO_DFT32MS_OVL_NS ), NS2SA( st->last_L_frame * FRAMES_PER_SEC, STEREO_DFT32MS_OVL_NS ) ); + lerp( hCPE->input_mem_BPF[0], hCPE->input_mem_BPF[0], NS2SA( st->L_frame * FRAMES_PER_SEC, STEREO_DFT32MS_OVL_NS ), NS2SA( st->last_L_frame * FRAMES_PER_SEC, STEREO_DFT32MS_OVL_NS ) ); + } + + if ( st->prev_bfi && !( st->last_core_bfi == ACELP_CORE && st->last_con_tcx == 1 ) ) + { + /* last_core needed for correctly decoding ACELP->TCX/HQ switching frames in ivas_core_dec(). + In the following steps the decoder needs to consider if the core was changed due to a lost frame to apply the correct transition */ + st->last_core = st->last_core_bfi; + } + + if ( st->core == TCX_20_CORE || st->core == TCX_10_CORE || st->core == HQ_CORE || ( st->bfi == 1 && st->core == ACELP_CORE && st->con_tcx == 1 ) ) + { + if ( ( ( st->last_core != ACELP_CORE || ( st->prev_bfi == 1 && st->last_core == ACELP_CORE && st->last_con_tcx == 1 ) ) && st->last_core != AMR_WB_CORE ) || ( sba_dirac_stereo_dtx_flag && st->cng_type == FD_CNG ) ) /* TCX / HQ-CORE -> TCX / HQ-CORE */ + { + /* In case of a TCX to ACELP switch next frame */ + mvr2r( &output[st->L_frame - NS2SA( st->L_frame * FRAMES_PER_SEC, STEREO_DFT32MS_OVL_NS )], hCPE->hStereoDft->buff_LBTCX_mem, NS2SA( st->L_frame * FRAMES_PER_SEC, STEREO_DFT32MS_OVL_NS ) ); + + /* BPF */ + if ( st->p_bpf_noise_buf && st->core != HQ_CORE ) + { + stereo_dft_dec_analyze( hCPE, st->p_bpf_noise_buf, DFT, 0, st->L_frame, output_frame, DFT_STEREO_DEC_ANA_BPF, 2, 0 ); + } + /* st->p_bpf_noise_buf not updated for HQ core -> skip analysis and set input memory to zero */ + else if ( st->p_bpf_noise_buf && st->core == HQ_CORE ) + { + set_zero( hCPE->input_mem_BPF[0], STEREO_DFT32MS_OVL_16k ); + } + + /* TCX */ + stereo_dft_dec_analyze( hCPE, synth, DFT, 0, L_frameTCX, output_frame, DFT_STEREO_DEC_ANA_FB, 0, 0 ); + } + else if ( st->core == TCX_20_CORE || st->core == TCX_10_CORE || st->core == HQ_CORE ) /* ACELP -> TCX/HQ */ + { + if ( st->last_core_brate <= SID_2k40 && st->element_mode == IVAS_SCE ) + { + int16_t mem_len = NS2SA( L_frameTCX * FRAMES_PER_SEC, STEREO_DFT32MS_OVL_NS ); + for ( i = 0; i < mem_len; i++ ) + { + hCPE->input_mem[0][i] *= ( mem_len - i ) / mem_len; + } + + /* Update FB input buff with hb synth for last delay_tdbwe sampled */ + for ( i = 0; i < delay_tdbwe; i++ ) + { + hCPE->input_mem[0][NS2SA( L_frameTCX * FRAMES_PER_SEC, STEREO_DFT32MS_OVL_NS ) - delay_tdbwe + i] += hb_synth[i]; + } + } + else + { + /* Update FB input buff with hb synth for last delay_tdbwe sampled */ + for ( i = 0; i < delay_tdbwe; i++ ) + { + hCPE->input_mem[0][NS2SA( L_frameTCX * FRAMES_PER_SEC, STEREO_DFT32MS_OVL_NS ) - delay_tdbwe + i] = hb_synth[i]; + } + } + + /* cross-fading between (delayed) TBE and FB-TCX over 2.3125ms */ + mvr2r( synth, synth_tmp, output_frame ); + for ( i = 0; i < tmps; i++ ) + { + synth_tmp[i] = ( hb_synth[i + delay_tdbwe] * ( tmps - i ) + synth[i] * i ) / tmps; + } + + /* FB-TCX */ + stereo_dft_dec_analyze( hCPE, synth_tmp, DFT, 0, L_frameTCX, output_frame, DFT_STEREO_DEC_ANA_FB, 0, 0 ); + + if ( !st->tcxonly ) + { + if ( hCPE->hStereoDft->hConfig->res_pred_mode == STEREO_DFT_RESPRED_ESF ) + { + mvr2r( output, tcx_core_buf, L_FRAME16k ); + } + /* fading-out LB-TCX/ACELP */ + for ( i = 0; i < delay_comp; i++ ) + { + output[i] = ( output[i] * ( delay_comp - i ) ) / delay_comp; + } + + /* In case of TCX frames, output LB TCX is zeroed out until the end but in case of an TCX->ACELP switch, this memory is needed, hence it is backed up */ + /* Unlike the case when DFT32MS is disabled, there is only 1 DFT analysis window, hence in the TCX frame we don't want to do a DFT analysis for LB TCX + but in a potential ACELP frame, we want the memories of the LB TCX for the last OLA samples so that HB analysis can be skipped */ + mvr2r( &output[st->L_frame - NS2SA( st->L_frame * FRAMES_PER_SEC, STEREO_DFT32MS_OVL_NS )], hCPE->hStereoDft->buff_LBTCX_mem, NS2SA( st->L_frame * FRAMES_PER_SEC, STEREO_DFT32MS_OVL_NS ) ); + + /*zero the rest for avoiding adding contribution except the last samples which are not considered in DFT analysis (potentially used in next ACELP frame)*/ + if ( st->last_core_brate > SID_2k40 ) + { + for ( ; i < st->L_frame; i++ ) + { + output[i] = 0.0f; + } + + stereo_dft_dec_analyze( hCPE, output, DFT, 0, st->L_frame, output_frame, DFT_STEREO_DEC_ANA_LB_ADD, 1, 0 ); + + /* BPF */ + if ( st->p_bpf_noise_buf ) + { + set_zero( hCPE->input_mem_BPF[0], NS2SA( st->L_frame * FRAMES_PER_SEC, STEREO_DFT32MS_OVL_NS ) ); + } + } + } + } + } + else /* ACELP core */ + { + if ( st->core_brate <= SID_2k40 && !( sba_dirac_stereo_dtx_flag ) ) + { + set_zero( hCPE->input_mem[0], NS2SA( st->hTcxDec->L_frameTCX * FRAMES_PER_SEC, STEREO_DFT32MS_OVL_NS ) ); + set_zero( hCPE->input_mem_LB[0], NS2SA( st->L_frame * FRAMES_PER_SEC, STEREO_DFT32MS_OVL_NS ) ); + + /* CNG generated in ivas_cpe_dec() */ + } + else if ( st->last_core == TCX_20_CORE || st->last_core == TCX_10_CORE || st->last_core == HQ_CORE ) /* TCX/HQ -> ACELP */ + { + if ( ( st->last_L_frame <= L_FRAME16k && st->L_frame <= L_FRAME16k ) || ( sba_dirac_stereo_dtx_flag && st->core_brate == SID_2k40 && st->cng_type == FD_CNG ) ) + { + /* In case of a TCX to ACELP switch, retrieve the LB-TCX memories for the first STEREO_DFT32MS_OVL_NS NS of OLA */ + lerp( hCPE->hStereoDft->buff_LBTCX_mem, hCPE->input_mem_LB[0], NS2SA( st->L_frame * FRAMES_PER_SEC, STEREO_DFT32MS_OVL_NS ), NS2SA( st->last_L_frame * FRAMES_PER_SEC, STEREO_DFT32MS_OVL_NS ) ); + } + + if ( sba_dirac_stereo_dtx_flag && st->core_brate == SID_2k40 && st->cng_type == FD_CNG ) + { + int16_t nZeros; + nZeros = (int16_t) ( NS2SA( st->output_Fs, N_ZERO_MDCT_NS ) ); + delay_comp = NS2SA( st->output_Fs, DELAY_CLDFB_NS ); + + mvr2r( &st->hHQ_core->old_out[nZeros - delay_comp - NS2SA( output_frame * FRAMES_PER_SEC, STEREO_DFT32MS_OVL_NS )], hCPE->input_mem[0], NS2SA( output_frame * FRAMES_PER_SEC, STEREO_DFT32MS_OVL_NS ) ); + mvr2r( synth, synth_tmp, output_frame ); + + int16_t mem_len; + mem_len = NS2SA( st->L_frame * FRAMES_PER_SEC, STEREO_DFT32MS_OVL_NS ); + float fac; + fac = 1.0f / mem_len; + for ( i = 0; i < mem_len; i++ ) + { + hCPE->input_mem_LB[0][i] *= ( 1 - i * fac ); + } + set_zero( output, st->L_frame ); + + stereo_dft_dec_analyze( hCPE, output, DFT, 0, st->L_frame, output_frame, DFT_STEREO_DEC_ANA_LB, 0, 0 ); + + /* BPF */ + if ( st->p_bpf_noise_buf ) + { + stereo_dft_dec_analyze( hCPE, st->p_bpf_noise_buf, DFT, 0, st->L_frame, output_frame, DFT_STEREO_DEC_ANA_BPF, 0, 0 ); + } + } + else + { + /* ACELP */ + for ( i = 0; i < ( NS2SA( st->L_frame * FRAMES_PER_SEC, STEREO_DFT32MS_OVL_NS ) - delay_dft_dec_lb ); i++ ) + { + hCPE->input_mem_LB[0][i] = 0.f; + } + /* ACELP fading-in*/ + for ( i = 0; i < delay_dft_dec_lb; i++ ) + { + hCPE->input_mem_LB[0][NS2SA( st->L_frame * FRAMES_PER_SEC, STEREO_DFT32MS_OVL_NS ) - delay_dft_dec_lb + i] *= (float) ( i ) / (float) ( delay_dft_dec_lb ); + } + + stereo_dft_dec_analyze( hCPE, output, DFT, 0, st->L_frame, output_frame, DFT_STEREO_DEC_ANA_LB, 0, 0 ); + + /* BPF */ + if ( st->p_bpf_noise_buf ) + { + stereo_dft_dec_analyze( hCPE, st->p_bpf_noise_buf, DFT, 0, st->L_frame, output_frame, DFT_STEREO_DEC_ANA_BPF, 0, 0 ); + } + + /* Fading-in TD-BWE, Fading-out FB-TCX*/ + mvr2r( synth, synth_tmp, output_frame ); + if ( hCPE->last_element_mode != IVAS_CPE_MDCT ) + { + for ( i = 0; i < delay_dft_dec; i++ ) /* 1.25 ms of hb_synth fade-in and TCX fade-out */ + { + hCPE->input_mem[0][NS2SA( L_frameTCX * FRAMES_PER_SEC, STEREO_DFT32MS_OVL_NS ) - delay_dft_dec + i] = ( hb_synth[delay_tdbwe - delay_dft_dec + i] * ( i ) + hCPE->input_mem[0][NS2SA( L_frameTCX * FRAMES_PER_SEC, STEREO_DFT32MS_OVL_NS ) - delay_dft_dec + i] * ( delay_dft_dec - i ) ) / ( delay_dft_dec ); + } + for ( i = 0; i < delay_dft_dec; i++ ) /* 1.25 ms of hb_synth fade out. ICBWE fade in performed in time domain here */ + { + synth_tmp[i] = ( hb_synth[delay_tdbwe - delay_dft_dec + i] * ( delay_dft_dec - i ) ) / delay_dft_dec; + } + + for ( ; i < output_frame; i++ ) + { + synth_tmp[i] = 0; + } + } + } + + if ( sba_dirac_stereo_dtx_flag ) + { + stereo_dft_dec_analyze( hCPE, synth_tmp, DFT, 0, output_frame, output_frame, DFT_STEREO_DEC_ANA_FB_ADD, 0, 0 ); + } + else if ( hCPE->last_element_mode == IVAS_CPE_MDCT ) + { + stereo_dft_dec_analyze( hCPE, synth_tmp, DFT, 0, output_frame, output_frame, DFT_STEREO_DEC_ANA_HB_ADD, 1, 0 ); + } + else + { + stereo_dft_dec_analyze( hCPE, synth_tmp, DFT, 0, output_frame, output_frame, DFT_STEREO_DEC_ANA_FB_ADD, 1, 0 ); + } + } + else /* ACELP -> ACELP */ + { + if ( sba_dirac_stereo_dtx_flag && st->core_brate <= SID_2k40 && st->cng_type == FD_CNG ) + { + set_zero( output, st->L_frame ); + } + /* this needs an indication for sba2stereo in general */ + else if ( hCPE->element_mode == IVAS_SCE && st->last_core_brate <= SID_2k40 && st->cng_type == FD_CNG ) + { + lerp( hCPE->input_mem[0], hCPE->input_mem_LB[0], NS2SA( st->L_frame * FRAMES_PER_SEC, STEREO_DFT32MS_OVL_NS ), NS2SA( output_frame * FRAMES_PER_SEC, STEREO_DFT32MS_OVL_NS ) ); + } + + /* ACELP synthesis @ internal sampling rate */ + stereo_dft_dec_analyze( hCPE, output, DFT, 0, st->L_frame, output_frame, DFT_STEREO_DEC_ANA_LB, 0, 0 ); + + /* BPF */ + if ( st->p_bpf_noise_buf ) + { + stereo_dft_dec_analyze( hCPE, st->p_bpf_noise_buf, DFT, 0, st->L_frame, output_frame, DFT_STEREO_DEC_ANA_BPF, 0, 0 ); + } + + /* BWE */ + if ( sba_dirac_stereo_dtx_flag && st->core_brate <= SID_2k40 && st->cng_type == FD_CNG ) + { + stereo_dft_dec_analyze( hCPE, synth, DFT, 0, output_frame, output_frame, DFT_STEREO_DEC_ANA_FB_ADD, 0, 0 ); + } + else if ( st->extl != -1 || ( st->bws_cnt > 0 && st->core == ACELP_CORE ) ) + { + stereo_dft_dec_analyze( hCPE, hb_synth, DFT, 0, output_frame, output_frame, DFT_STEREO_DEC_ANA_FB_ADD, 2, -delay_tdbwe ); + } + } + } + + /*----------------------------------------------------------------* + * enhanced stereo filling: allpass filter + *----------------------------------------------------------------*/ + + if ( hCPE->hStereoDft->hConfig->res_pred_mode == STEREO_DFT_RESPRED_ESF ) + { + if ( st->sr_core == INT_FS_12k8 ) + { + ap_fade_len = STEREO_DFT_ALLPASS_FADELEN_12k8; + } + else + { + ap_fade_len = STEREO_DFT_ALLPASS_FADELEN_16k; + } + + if ( st->core == TCX_20_CORE || st->core == TCX_10_CORE || st->core == HQ_CORE || ( st->bfi == 1 && st->core == ACELP_CORE && st->con_tcx == 1 ) ) + { + int16_t numZeros = (int16_t) ( NS2SA( st->sr_core, N_ZERO_MDCT_NS ) ); + float tmp_fade[max( STEREO_DFT_ALLPASS_FADELEN_12k8, STEREO_DFT_ALLPASS_FADELEN_16k )]; + + mvr2r( st->hHQ_core->old_outLB + numZeros, hCPE->hStereoDft->ap_fade_mem, ap_fade_len ); + + if ( st->last_core == ACELP_CORE && !( st->prev_bfi == 1 && st->last_core == ACELP_CORE && st->last_con_tcx == 1 ) && !st->tcxonly ) + { + mvr2r( tcx_core_buf, pAp_input, st->L_frame ); + } + else + { + mvr2r( output, pAp_input, st->L_frame ); + } + + if ( st->last_core == ACELP_CORE && !( st->prev_bfi == 1 && st->last_core == ACELP_CORE && st->last_con_tcx == 1 ) && !st->tcxonly ) /* ACELP -> TCX/HQ-Core */ + { + mvr2r( tcx_core_buf, tmp_fade, ap_fade_len ); + for ( i = 0; i < ap_fade_len; i++ ) + { + pAp_input[i] = ( pAp_input[i] * i + tmp_fade[i] * ( ap_fade_len - i ) ) / ap_fade_len; + } + } + } + else + { + mvr2r( output, pAp_input, st->L_frame ); + if ( st->last_core != ACELP_CORE ) /* TCX/HQ-Core -> ACELP */ + { + for ( i = 0; i < ap_fade_len; i++ ) + { + pAp_input[i] = ( pAp_input[i] * i + hCPE->hStereoDft->ap_fade_mem[i] * ( ap_fade_len - i ) ) / ap_fade_len; + } + } + } + predelay = NS2SA( st->sr_core, DELAY_BWE_TOTAL_NS ); + + /* apply predelay to have same overall filter delay for all cases */ + delay_signal( pAp_input, st->L_frame, hCPE->hStereoDft->ap_delay_mem, predelay ); + + + /* input zeroes for transient frames */ + if ( hCPE->hStereoDft->attackPresent ) + { + float inv_tmps = 1.f / ap_fade_len; + if ( hCPE->hStereoDft->ap_wasTransient ) + { + set_zero( pAp_input, ap_fade_len ); + } + else + { + for ( i = 0; i < ap_fade_len; i++ ) + { + pAp_input[i] *= ( ap_fade_len - i ) * inv_tmps; + } + } + set_zero( pAp_input + ap_fade_len, st->L_frame - ap_fade_len ); + hCPE->hStereoDft->ap_wasTransient = 1; + } + else if ( hCPE->hStereoDft->ap_wasTransient ) + { + float inv_tmps = 1.f / ap_fade_len; + for ( i = 0; i < ap_fade_len; i++ ) + { + pAp_input[i] *= i * inv_tmps; + } + hCPE->hStereoDft->ap_wasTransient = 0; + } + + /* apply 5-stage allpass, each stage consisting of a nested allpass pair */ + filter_with_allpass( pAp_input, pAp_input, st->L_frame, &hCPE->hStereoDft->ap1 ); + filter_with_allpass( pAp_input, pAp_input, st->L_frame, &hCPE->hStereoDft->ap2 ); + filter_with_allpass( pAp_input, pAp_input, st->L_frame, &hCPE->hStereoDft->ap3 ); + + /* apply DFT to allpass-filtered signal */ + stereo_dft_dec_analyze( hCPE, pAp_input, DFT, 1, st->L_frame, output_frame, DFT_STEREO_DEC_ANA_FB, 0, 0 ); + } + + if ( st->core == ACELP_CORE ) + { + if ( !use_cldfb_for_dft ) /* Skip this for DFT Stereo mono output at non-residual bitrates */ + { + lerp( output, synth, output_frame, hCPE->hCoreCoder[0]->L_frame ); /* Dirty resampling, but should be good enough for ECU analysis */ + } + if ( !use_cldfb_for_dft || ( ( st->core_brate == FRAME_NO_DATA || st->core_brate == SID_2k40 ) && st->cng_type == LP_CNG && st->extl == SWB_CNG && hCPE->nchan_out == 1 ) ) + { + v_add( synth, hb_synth, synth, output_frame ); /* Use one channel TD-BWE for ECU analysis buffer */ + } + } + + return; +} diff --git a/lib_dec/ivas_qmetadata_dec.c b/lib_dec/ivas_qmetadata_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..17dfbfb49f4411a24cb398dd1e629922b073b1cf --- /dev/null +++ b/lib_dec/ivas_qmetadata_dec.c @@ -0,0 +1,4179 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include "options.h" +#include +#include "ivas_cnst.h" +#include "ivas_prot.h" +#include "ivas_rom_com.h" +#include "ivas_rom_dec.h" +#include "wmc_auto.h" +#include "prot.h" + +/*-----------------------------------------------------------------------* + * Local function prototypes + *-----------------------------------------------------------------------*/ + +static int16_t ivas_qmetadata_entropy_decode_diffuseness( uint16_t *bitstream, int16_t *index, IVAS_QDIRECTION *q_direction, uint16_t *diffuseness_index_max_ec_frame ); + +static int16_t ivas_qmetadata_entropy_decode_df_ratio( uint16_t *bitstream, int16_t *index, IVAS_QDIRECTION *q_direction, int16_t *dfRatio_bits ); + +static int16_t ivas_qmetadata_entropy_decode_dir( IVAS_QDIRECTION *q_direction, uint16_t *bitstream, int16_t *index, const uint16_t diffuseness_index_max_ec_frame, const int16_t nbands, const int16_t start_band, const int16_t hrmasa_flag ); + +static int16_t ivas_qmetadata_raw_decode_dir( IVAS_QDIRECTION *q_direction, uint16_t *bitstream, int16_t *index, const int16_t nbands, const int16_t start_band, const int16_t hrmasa_flag ); + +static uint16_t ivas_qmetadata_DecodeQuasiUniform( const uint16_t *bitstream, int16_t *index, const uint16_t alphabet_size ); + +static int16_t ivas_qmetadata_ReorderElevationDecoded( const int16_t elev_dist, const int16_t elev_avg, const int16_t elev_alph ); + +static int16_t read_directions( IVAS_QDIRECTION *q_direction, const uint8_t coding_subbands, const uint8_t masa_subframes, uint16_t *bitstream, int16_t *pbit_pos, int16_t *ind_order ); + +static int16_t read_common_direction( uint16_t *bitstream, IVAS_QDIRECTION *q_direction, const int16_t j, const int16_t no_subframes, const int16_t bits_total, int16_t *pbit_pos ); + +static int16_t decode_fixed_rate( IVAS_QDIRECTION *q_direction, const uint16_t *bitstream, int16_t *pbit_pos, const int16_t b, const int16_t nblocks ); + +static int16_t decode_azimuth( IVAS_QDIRECTION *q_direction, uint16_t *bitstream, int16_t *pbit_pos, const int16_t idx_subband, const int16_t masa_subframes ); + +static int16_t decode_elevation( IVAS_QDIRECTION *q_direction, uint16_t *bitstream, int16_t *pbit_pos, const int16_t j, const int16_t masa_subframes ); + +static int16_t decode_azimuth2D( IVAS_QDIRECTION *q_direction, uint16_t *bitstream, const int16_t coding_subbands, int16_t *pbit_pos, const int16_t no_frames ); + +static void set_zero_direction( IVAS_QDIRECTION *q_direction, const int16_t idx_band, const int16_t len ); + +static int16_t read_truncGR_azimuth( uint16_t *bitstream, IVAS_QDIRECTION *q_direction, const int16_t j, const int16_t no_subframes, int16_t *pbit_pos ); + +static ivas_error read_huf( int16_t *num_bits_read, const uint16_t *bitstream, uint16_t *out, const int16_t start_pos, const int16_t len, const int16_t *huff_code, const int16_t max_len ); + +static int16_t read_coherence_data( uint16_t *bitstream, int16_t *p_bit_pos, IVAS_QMETADATA *hQMetaData, const int16_t idx_dir, const int16_t hrmasa_flag ); + +static int16_t read_surround_coherence( uint16_t *bitstream, int16_t *p_bit_pos, IVAS_QMETADATA *hQMetaData ); + +static void decode_spread_coherence( IVAS_QMETADATA_HANDLE hQMetaData, int16_t idx_d, const int16_t no_frames, const int16_t hrmasa_flag ); + +static void decode_combined_index( uint64_t comb_index, const int16_t *no_cv_vec, uint16_t *index, const int16_t len ); + +static int16_t ivas_diffuseness_huff_ec_decode( const uint16_t *bitstream, int16_t *index, int16_t av ); + +static int16_t read_GR_min_removed_data( uint16_t *bitstream, int16_t *p_bit_pos, const int16_t *no_cv_vec, const int16_t no_data, int16_t *decoded_idx, const int16_t no_symb ); + +static int16_t decode_fixed_rate_composed_index_coherence( uint16_t *bitstream, int16_t *p_bit_pos, const int16_t no_bands, int16_t *no_cv_vec, uint16_t *decoded_index, const int16_t no_symb ); + +static int16_t ivas_qmetadata_entropy_decode_diffuseness_hr_512( uint16_t *bitstream, int16_t *index, IVAS_QDIRECTION *q_direction ); + +static int16_t ivas_qmetadata_raw_decode_dir_512( IVAS_QDIRECTION *q_direction, uint16_t *bitstream, int16_t *index, const int16_t nbands, const int16_t start_band, const SPHERICAL_GRID_DATA *sph_grid16 ); + +static int16_t read_surround_coherence_hr( uint16_t *bitstream, int16_t *p_bit_pos, IVAS_QMETADATA *hQMetaData ); + +static int16_t read_coherence_data_hr_512( uint16_t *bitstream, int16_t *p_bit_pos, IVAS_QMETADATA *hQMetaData, const int16_t idx_dir, const int16_t nbits_coh ); + +static void read_stream_dct_coeffs_omasa( int16_t *q_idx, float *q_dct_data, const int16_t len_stream, uint16_t *bit_stream, int16_t *index, const int16_t first_line ); + + +/*-----------------------------------------------------------------------* + * Global function definitions + *-----------------------------------------------------------------------*/ + +/*-----------------------------------------------------------------------* + * ivas_qmetadata_dec_decode() + * + * Main function for decoding Spatial Metadata + *-----------------------------------------------------------------------*/ + +/*! r: number of bits read */ +int16_t ivas_qmetadata_dec_decode( + IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: hQMetaData handle */ + uint16_t *bitstream, /* i : bitstream */ + int16_t *index, /* i/o: bitstream position */ + const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ +) +{ + int16_t d, b, m; + uint16_t diffuseness_index_max_ec_frame; + uint16_t diffuseness_index_max_ec_frame_pre[QMETADATA_MAX_NO_DIRECTIONS]; + int16_t bits_dir_raw_pre[QMETADATA_MAX_NO_DIRECTIONS]; + int16_t dir2band; + int16_t bits_diff_sum; + int16_t bits_diff, bits_coherence; + int16_t bits_dir_raw; + int16_t bits_dir; + int16_t nbands, nblocks, start_band; + IVAS_QDIRECTION *q_direction; + int16_t start_index_0; + int16_t total_bits_1dir; + int16_t signal_bits; + int16_t bits_no_dirs_coh, bits_sur_coherence; + uint16_t all_coherence_zero; + int16_t ec_flag; + int16_t raw_flag[MASA_MAXIMUM_CODING_SUBBANDS]; + int16_t diff_bits; + int16_t dfRatio_bits[MASA_MAXIMUM_CODING_SUBBANDS]; + int16_t no_TF; + int16_t p[MASA_MAXIMUM_CODING_SUBBANDS], dif_p[MASA_MAXIMUM_CODING_SUBBANDS]; + int16_t bits_dir_target; + int16_t bits_dir_used; + int16_t reduce_bits; + int16_t ind_order[MASA_MAXIMUM_CODING_SUBBANDS]; + + + ec_flag = 0; + start_index_0 = *index; + + /*Coherence flag decoding*/ + bits_no_dirs_coh = 0; + all_coherence_zero = 1; + if ( hQMetaData->coherence_flag ) + { + /* read if coherence is zero */ + all_coherence_zero = bitstream[( *index )--]; + bits_no_dirs_coh += 1; + } + + hQMetaData->all_coherence_zero = (uint8_t) all_coherence_zero; + + if ( hQMetaData->no_directions == 2 ) + { + /* Read which bands have 2 directions */ + hQMetaData->q_direction[1].cfg.nbands = hQMetaData->numTwoDirBands; + set_c( (int8_t *) hQMetaData->twoDirBands, 0, hQMetaData->q_direction[0].cfg.nbands ); + d = *index; + dif_p[0] = ivas_qmetadata_DecodeExtendedGR( bitstream, index, MASA_MAXIMUM_CODING_SUBBANDS, 0 ); + p[0] = dif_p[0]; + hQMetaData->twoDirBands[p[0]] = 1; + for ( b = 1; b < hQMetaData->numTwoDirBands; b++ ) + { + dif_p[b] = ivas_qmetadata_DecodeExtendedGR( bitstream, index, MASA_MAXIMUM_CODING_SUBBANDS, 0 ); + p[b] = p[b - 1] + dif_p[b] + 1; + hQMetaData->twoDirBands[p[b]] = 1; + } + bits_no_dirs_coh += ( d - *index ); + } + + bits_diff_sum = 0; + bits_diff_sum += ivas_qmetadata_entropy_decode_diffuseness( bitstream, index, &( hQMetaData->q_direction[0] ), &diffuseness_index_max_ec_frame_pre[0] ); + + if ( hodirac_flag ) + { + if ( hQMetaData->no_directions == 2 ) + { + /* Calculate bits for dfRatio */ + dir2band = 0; + for ( b = hQMetaData->q_direction[0].cfg.start_band; b < hQMetaData->q_direction[0].cfg.nbands; b++ ) + { + if ( hQMetaData->twoDirBands[b] == 1 ) + { + dfRatio_bits[dir2band] = ivas_get_df_ratio_bits_hodirac( hQMetaData->q_direction[0].band_data[b].energy_ratio_index[0] ); + dir2band++; + } + } + + bits_diff_sum += ivas_qmetadata_entropy_decode_df_ratio( bitstream, index, &( hQMetaData->q_direction[1] ), dfRatio_bits ); + } + } + else + { + if ( hQMetaData->no_directions == 2 ) + { + /* Calculate bits for dfRatio */ + dir2band = 0; + for ( b = hQMetaData->q_direction[0].cfg.start_band; b < hQMetaData->q_direction[0].cfg.nbands; b++ ) + { + if ( hQMetaData->twoDirBands[b] == 1 ) + { + dfRatio_bits[dir2band] = ivas_get_df_ratio_bits( hQMetaData->q_direction[0].band_data[b].energy_ratio_index[0] ); + dir2band++; + } + } + + bits_diff_sum += ivas_qmetadata_entropy_decode_df_ratio( bitstream, index, &( hQMetaData->q_direction[1] ), dfRatio_bits ); + } + } + + /* Calculate direct-to-total energy ratios for both directions from diffuse-to-total ratio and distribution factor of direct-to-total ratios */ + if ( hQMetaData->no_directions == 2 ) + { + dir2band = 0; + for ( b = hQMetaData->q_direction[0].cfg.start_band; b < hQMetaData->q_direction[0].cfg.nbands; b++ ) + { + if ( hQMetaData->twoDirBands[b] == 1 ) + { + float diffRatio, dfRatio, dir1ratio, dir2ratio; + int16_t dfRatio_qsteps; + + diffRatio = diffuseness_reconstructions[hQMetaData->q_direction[0].band_data[b].energy_ratio_index[0]]; + dfRatio_qsteps = 1 << dfRatio_bits[dir2band]; + /* already encoded as total and ratios in HO-DirAC */ + if ( hodirac_flag ) + { + dfRatio = usdequant( hQMetaData->q_direction[1].band_data[dir2band].energy_ratio_index[0], 0.0f, 1.f / ( dfRatio_qsteps - 1 ) ); + dir1ratio = 1.f - diffRatio; + dir2ratio = dfRatio; + } + else + { + dfRatio = usdequant( hQMetaData->q_direction[1].band_data[dir2band].energy_ratio_index[0], 0.5f, 0.5f / ( dfRatio_qsteps - 1 ) ); + + dir1ratio = dfRatio * ( 1.0f - diffRatio ); + dir2ratio = ( 1.0f - diffRatio ) - dir1ratio; + } + + /* Requantize the 1 - dirRatio separately for each direction to obtain inverted dirRatio index. These are used in further decoding. */ + hQMetaData->q_direction[0].band_data[b].energy_ratio_index[0] = masa_sq( 1.0f - dir1ratio, diffuseness_thresholds, DIRAC_DIFFUSE_LEVELS ); + if ( hodirac_flag ) + { + float tmp; + hQMetaData->q_direction[1].band_data[dir2band].energy_ratio_index[0] = usquant( dir2ratio, &tmp, 0.0f, 1.f / ( DIRAC_DIFFUSE_LEVELS - 1 ), DIRAC_DIFFUSE_LEVELS ); + } + else + { + hQMetaData->q_direction[1].band_data[dir2band].energy_ratio_index[0] = masa_sq( 1.0f - dir2ratio, diffuseness_thresholds, DIRAC_DIFFUSE_LEVELS ); + } + + for ( m = 0; m < hQMetaData->q_direction[0].cfg.nblocks; m++ ) + { + hQMetaData->q_direction[0].band_data[b].energy_ratio[m] = dir1ratio; + hQMetaData->q_direction[0].band_data[b].energy_ratio_index[m] = hQMetaData->q_direction[0].band_data[b].energy_ratio_index[0]; + } + + for ( m = 0; m < hQMetaData->q_direction[1].cfg.nblocks; m++ ) + { + hQMetaData->q_direction[1].band_data[dir2band].energy_ratio[m] = dir2ratio; + hQMetaData->q_direction[1].band_data[dir2band].energy_ratio_index[m] = hQMetaData->q_direction[1].band_data[dir2band].energy_ratio_index[0]; + } + + dir2band++; + } + else + { + /* 1dir band */ + hQMetaData->q_direction[0].band_data[b].energy_ratio[0] = 1.0f - diffuseness_reconstructions[hQMetaData->q_direction[0].band_data[b].energy_ratio_index[0]]; + for ( m = 1; m < hQMetaData->q_direction[0].cfg.nblocks; m++ ) + { + hQMetaData->q_direction[0].band_data[b].energy_ratio[m] = hQMetaData->q_direction[0].band_data[b].energy_ratio[0]; + hQMetaData->q_direction[0].band_data[b].energy_ratio_index[m] = hQMetaData->q_direction[0].band_data[b].energy_ratio_index[0]; + } + } + } + } + else + { + /* With 1dir band, the decoded index is directly diffuseness and we can decode to direct-to-total ratio with 1 - diff. */ + for ( b = hQMetaData->q_direction[0].cfg.start_band; b < hQMetaData->q_direction[0].cfg.nbands; b++ ) + { + hQMetaData->q_direction[0].band_data[b].energy_ratio[0] = 1.0f - diffuseness_reconstructions[hQMetaData->q_direction[0].band_data[b].energy_ratio_index[0]]; + for ( m = 1; m < hQMetaData->q_direction[0].cfg.nblocks; m++ ) + { + hQMetaData->q_direction[0].band_data[b].energy_ratio[m] = hQMetaData->q_direction[0].band_data[b].energy_ratio[0]; + hQMetaData->q_direction[0].band_data[b].energy_ratio_index[m] = hQMetaData->q_direction[0].band_data[b].energy_ratio_index[0]; + } + } + } + + /* To decode directions correctly for 2dir bands, we need to obtain the compensated direct-to-total ratios and their + * corresponding inverted indices. */ + bits_dir_raw_pre[0] = 0; + bits_dir_raw_pre[1] = 0; + dir2band = 0; + for ( b = hQMetaData->q_direction[0].cfg.start_band; b < hQMetaData->q_direction[0].cfg.nbands; b++ ) + { + if ( hQMetaData->no_directions == 2 && hQMetaData->twoDirBands[b] == 1 ) + { + int16_t index_dirRatio1Inv, index_dirRatio2Inv, index_dirRatio1Inv_mod, index_dirRatio2Inv_mod; + + index_dirRatio1Inv = hQMetaData->q_direction[0].band_data[b].energy_ratio_index[0]; + index_dirRatio2Inv = hQMetaData->q_direction[1].band_data[dir2band].energy_ratio_index[0]; + + masa_compensate_two_dir_energy_ratio_index( index_dirRatio1Inv, index_dirRatio2Inv, &index_dirRatio1Inv_mod, &index_dirRatio2Inv_mod, hodirac_flag ); + + for ( m = 0; m < hQMetaData->q_direction[0].cfg.nblocks; m++ ) + { + hQMetaData->q_direction[0].band_data[b].energy_ratio_index_mod[m] = index_dirRatio1Inv_mod; + hQMetaData->q_direction[0].band_data[b].bits_sph_idx[m] = bits_direction_masa[index_dirRatio1Inv_mod]; + bits_dir_raw_pre[0] += hQMetaData->q_direction[0].band_data[b].bits_sph_idx[m]; + } + + for ( m = 0; m < hQMetaData->q_direction[1].cfg.nblocks; m++ ) + { + hQMetaData->q_direction[1].band_data[dir2band].energy_ratio_index_mod[m] = index_dirRatio2Inv_mod; + hQMetaData->q_direction[1].band_data[dir2band].bits_sph_idx[m] = bits_direction_masa[index_dirRatio2Inv_mod]; + bits_dir_raw_pre[1] += hQMetaData->q_direction[1].band_data[dir2band].bits_sph_idx[m]; + } + + dir2band++; + } + else + { + for ( m = 0; m < hQMetaData->q_direction[0].cfg.nblocks; m++ ) + { + hQMetaData->q_direction[0].band_data[b].energy_ratio_index_mod[m] = hQMetaData->q_direction[0].band_data[b].energy_ratio_index[0]; + hQMetaData->q_direction[0].band_data[b].bits_sph_idx[m] = bits_direction_masa[hQMetaData->q_direction[0].band_data[b].energy_ratio_index[0]]; + bits_dir_raw_pre[0] += hQMetaData->q_direction[0].band_data[b].bits_sph_idx[m]; + } + } + } + + if ( hQMetaData->no_directions == 2 ) + { + no_TF = hQMetaData->q_direction[0].cfg.nbands * hQMetaData->q_direction[0].cfg.nblocks + hQMetaData->q_direction[1].cfg.nbands * hQMetaData->q_direction[1].cfg.nblocks; + if ( ( all_coherence_zero == 0 ) && ( hQMetaData->metadata_max_bits - bits_no_dirs_coh - 4.3f * no_TF - bits_diff_sum >= MASA_MIN_BITS_SURR_COH ) ) + { + bits_sur_coherence = read_surround_coherence( bitstream, index, hQMetaData ); + } + else + { + bits_sur_coherence = 0; + /*Surround coherence*/ + for ( b = 0; b < hQMetaData->q_direction[0].cfg.nbands; b++ ) + { + if ( hQMetaData->surcoh_band_data != NULL ) + { + set_c( (int8_t *) hQMetaData->surcoh_band_data[b].surround_coherence, 0, MAX_PARAM_SPATIAL_SUBFRAMES ); + } + } + } + bits_no_dirs_coh += bits_sur_coherence; + total_bits_1dir = ( ( hQMetaData->metadata_max_bits - bits_no_dirs_coh ) * hQMetaData->q_direction[0].cfg.nbands * hQMetaData->q_direction[0].cfg.nblocks ) / no_TF; + } + else + { + no_TF = hQMetaData->q_direction[0].cfg.nbands * hQMetaData->q_direction[0].cfg.nblocks; + if ( ( all_coherence_zero == 0 ) && ( hQMetaData->metadata_max_bits - bits_no_dirs_coh - 4.3f * no_TF - bits_diff_sum >= MASA_MIN_BITS_SURR_COH ) ) + { + bits_sur_coherence = read_surround_coherence( bitstream, index, hQMetaData ); + } + else + { + bits_sur_coherence = 0; + /*Surround coherence*/ + for ( b = 0; b < hQMetaData->q_direction[0].cfg.nbands; b++ ) + { + if ( hQMetaData->surcoh_band_data != NULL ) + { + set_c( (int8_t *) hQMetaData->surcoh_band_data[b].surround_coherence, 0, MAX_PARAM_SPATIAL_SUBFRAMES ); + } + } + } + bits_no_dirs_coh += bits_sur_coherence; + + total_bits_1dir = hQMetaData->metadata_max_bits - bits_no_dirs_coh; + } + + bits_dir_target = 0; + bits_dir_used = 0; + + for ( d = 0; d < hQMetaData->no_directions; d++ ) + { + q_direction = &hQMetaData->q_direction[d]; + nbands = q_direction->cfg.nbands; + nblocks = q_direction->cfg.nblocks; + start_band = q_direction->cfg.start_band; + + diffuseness_index_max_ec_frame = diffuseness_index_max_ec_frame_pre[0]; + if ( d == 0 ) + { + bits_diff = bits_diff_sum; + } + else + { + bits_diff = 0; + } + bits_dir_raw = bits_dir_raw_pre[d]; + + /* Read coherence, if any */ + bits_coherence = 0; + + if ( all_coherence_zero == 0 ) + { + bits_coherence = read_coherence_data( bitstream, index, hQMetaData, d, 0 ); + } + else + { + /*Surround coherence*/ + for ( b = 0; b < hQMetaData->q_direction[0].cfg.nbands; b++ ) + { + if ( hQMetaData->surcoh_band_data != NULL ) + { + set_c( (int8_t *) hQMetaData->surcoh_band_data[b].surround_coherence, 0, MAX_PARAM_SPATIAL_SUBFRAMES ); + } + + if ( hQMetaData->q_direction[d].coherence_band_data != NULL ) + { + set_c( (int8_t *) hQMetaData->q_direction[d].coherence_band_data[b].spread_coherence, 0, MAX_PARAM_SPATIAL_SUBFRAMES ); + } + } + } + + /* Read 2D signaling*/ + q_direction->not_in_2D = bitstream[( *index )--]; + signal_bits = 1; + + /* Read EC signaling */ + ec_flag = 0; + if ( total_bits_1dir + bits_sur_coherence <= hQMetaData->qmetadata_max_bit_req ) + { + ec_flag = bitstream[( *index )--]; + signal_bits++; + if ( nblocks > 1 ) + { + if ( ec_flag ) + { + ec_flag += bitstream[( *index )--]; + signal_bits++; + } + } + } + + /* Decode quantized directions frame-wise */ + if ( ec_flag == 0 ) /* EC 1*/ + { + bits_dir = 0; + raw_flag[0] = bitstream[( *index )--]; + bits_dir++; + + if ( raw_flag[0] == 0 ) + { + bits_dir += ivas_qmetadata_entropy_decode_dir( q_direction, bitstream, index, diffuseness_index_max_ec_frame, nbands, start_band, 0 ); + } + else + { + bits_dir += ivas_qmetadata_raw_decode_dir( q_direction, bitstream, index, nbands, start_band, 0 ); + } + } + /* Decode quantized directions band-wise */ + else if ( ec_flag == 1 && ( nblocks > 1 ) ) /* EC2 */ + { + bits_dir = 0; + for ( b = start_band; b < nbands; b++ ) + { + raw_flag[b] = bitstream[( *index )--]; + bits_dir++; + } + + /* Read EC bits*/ + diff_bits = bits_diff + bits_coherence + signal_bits - total_bits_1dir; + + for ( b = start_band; b < nbands; b++ ) + { + if ( raw_flag[b] == 0 ) + { + bits_dir += ivas_qmetadata_entropy_decode_dir( q_direction, bitstream, index, diffuseness_index_max_ec_frame, b + 1, b, 0 ); + } + else + { + diff_bits += q_direction->band_data[b].bits_sph_idx[0] * q_direction->cfg.nblocks; + } + } + diff_bits += bits_dir; + + /* Small requantization?*/ + if ( q_direction->not_in_2D > 0 ) + { + /* This is not an ideal solution but mirrors better encoder */ + int16_t i, j; + uint16_t bits_temp[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES]; + + for ( i = q_direction->cfg.start_band; i < q_direction->cfg.nbands; i++ ) + { + for ( j = 0; j < q_direction->cfg.nblocks; j++ ) + { + bits_temp[i][j] = q_direction->band_data[i].bits_sph_idx[j]; + } + } + + small_reduction_direction( q_direction, bits_temp, raw_flag, &diff_bits ); + + for ( i = q_direction->cfg.start_band; i < q_direction->cfg.nbands; i++ ) + { + for ( j = 0; j < q_direction->cfg.nblocks; j++ ) + { + q_direction->band_data[i].bits_sph_idx[j] = bits_temp[i][j]; + } + } + } + + /* Read raw-coded bits*/ + for ( b = start_band; b < nbands; b++ ) + { + if ( raw_flag[b] ) + { + bits_dir += ivas_qmetadata_raw_decode_dir( q_direction, bitstream, index, b + 1, b, 0 ); + } + } + } + /* Decode requantized directions */ + else /* EC3 */ + { + int16_t dummy; + ec_flag = 2; + + if ( hQMetaData->is_masa_ivas_format == 0 ) + { + reduce_bits = bits_dir_raw - ( total_bits_1dir - bits_diff - bits_coherence - signal_bits ); + ind_order[0] = -1; + } + else + { + ind_order[0] = 0; + reduce_bits = min( nbands * nblocks + MASA_BIT_REDUCT_PARAM, bits_dir_raw - ( total_bits_1dir - bits_diff - bits_coherence - signal_bits ) ); + if ( reduce_bits > bits_dir_raw - nbands * nblocks ) + { + reduce_bits = bits_dir_raw - nbands * nblocks; + } + } + only_reduce_bits_direction( &dummy, q_direction, reduce_bits, nbands, nblocks, ind_order ); + + /* Read directions */ + bits_dir = read_directions( q_direction, (uint8_t) nbands, (uint8_t) nblocks, bitstream, index, ind_order ); + } + + if ( bits_coherence > 0 ) + { + if ( nblocks > 1 ) + { + decode_spread_coherence( hQMetaData, d, nblocks, 0 ); + } + } + else + { + for ( b = start_band; b < nbands; b++ ) + { + if ( q_direction->coherence_band_data != NULL ) + { + set_c( (int8_t *) q_direction->coherence_band_data[b].spread_coherence, 0, nblocks ); + } + } + } + if ( d == 0 ) + { + total_bits_1dir = hQMetaData->metadata_max_bits - ( start_index_0 - *index ); + } + + bits_dir_target += bits_dir_raw; + bits_dir_used += bits_dir; + + } + + /* move 2 dir data to its correct subband */ + if ( hQMetaData->no_directions == 2 ) + { + d = hQMetaData->q_direction[1].cfg.nbands - 1; + nblocks = hQMetaData->q_direction[0].cfg.nblocks; + + for ( b = hQMetaData->q_direction[0].cfg.nbands - 1; b >= 0; b-- ) + { + if ( hQMetaData->twoDirBands[b] == 1 ) + { + mvr2r( hQMetaData->q_direction[1].band_data[d].azimuth, hQMetaData->q_direction[1].band_data[b].azimuth, nblocks ); + mvr2r( hQMetaData->q_direction[1].band_data[d].elevation, hQMetaData->q_direction[1].band_data[b].elevation, nblocks ); + mvr2r( hQMetaData->q_direction[1].band_data[d].energy_ratio, hQMetaData->q_direction[1].band_data[b].energy_ratio, nblocks ); + + if ( hQMetaData->q_direction[0].band_data[b].energy_ratio_index[0] < 7 ) + { + for ( m = 0; m < nblocks; m++ ) + { + hQMetaData->q_direction[1].band_data[b].azimuth[m] += hQMetaData->q_direction[0].band_data[b].azimuth[m] - 180; + if ( hQMetaData->q_direction[1].band_data[b].azimuth[m] >= 180 ) + { + hQMetaData->q_direction[1].band_data[b].azimuth[m] -= 360; + } + if ( hQMetaData->q_direction[1].band_data[b].azimuth[m] < -180 ) + { + hQMetaData->q_direction[1].band_data[b].azimuth[m] += 360; + } + } + } + + if ( hQMetaData->q_direction[1].coherence_band_data != NULL ) + { + mvc2c( hQMetaData->q_direction[1].coherence_band_data[d].spread_coherence, hQMetaData->q_direction[1].coherence_band_data[b].spread_coherence, nblocks ); + } + d--; + } + else + { + set_f( hQMetaData->q_direction[1].band_data[b].azimuth, 0.0f, nblocks ); + set_f( hQMetaData->q_direction[1].band_data[b].elevation, 0.0f, nblocks ); + set_f( hQMetaData->q_direction[1].band_data[b].energy_ratio, 0.0f, nblocks ); + + if ( hQMetaData->q_direction[1].coherence_band_data != NULL ) + { + set_c( (int8_t *) hQMetaData->q_direction[1].coherence_band_data[b].spread_coherence, 0, nblocks ); + } + } + } + + /* Scale energy ratios that sum to over one */ + if ( !hodirac_flag ) + { + for ( b = 0; b < hQMetaData->q_direction[0].cfg.nbands; b++ ) + { + float ratioSum; + + ratioSum = hQMetaData->q_direction[0].band_data[b].energy_ratio[0] + hQMetaData->q_direction[1].band_data[b].energy_ratio[0]; + + if ( ratioSum > 1.0f ) + { + set_f( hQMetaData->q_direction[0].band_data[b].energy_ratio, hQMetaData->q_direction[0].band_data[b].energy_ratio[0] / ratioSum, nblocks ); + set_f( hQMetaData->q_direction[1].band_data[b].energy_ratio, hQMetaData->q_direction[1].band_data[b].energy_ratio[0] / ratioSum, nblocks ); + } + } + } + } + + /* Store status information for renderer use */ + hQMetaData->ec_flag = ec_flag; + + hQMetaData->dir_comp_ratio = (float) bits_dir_used / (float) bits_dir_target; + + if ( hQMetaData->dir_comp_ratio > 1.0f ) + { + hQMetaData->dir_comp_ratio = 1.0f; + } + + return ( start_index_0 - *index ); +} + + +/*-----------------------------------------------------------------------* + * ivas_qmetadata_dec_decode_hr_384_512() + * + * Main function for decoding Spatial Metadata at HRs + *-----------------------------------------------------------------------*/ + +/*! r: number of bits read */ +int16_t ivas_qmetadata_dec_decode_hr_384_512( + IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: hQMetaData handle */ + uint16_t *bitstream, /* i : bitstream */ + int16_t *index, /* i/o: bitstream position */ + const SPHERICAL_GRID_DATA *sph_grid16, /* i : spherical grid for deindexing */ + const int16_t bits_sph_idx, + const int16_t bits_sp_coh, + const uint8_t ncoding_bands_config ) +{ + int16_t d, b, m; + int16_t nbands, start_band; + IVAS_QDIRECTION *q_direction; + int16_t start_index_0; + uint16_t all_coherence_zero; + int16_t p[MASA_MAXIMUM_CODING_SUBBANDS], dif_p[MASA_MAXIMUM_CODING_SUBBANDS]; + int16_t codedBands, sf_nbands0, sf_nbands1; + sf_nbands1 = 1; + + + start_index_0 = *index; + /* read number of higher inactive/not encoded bands */ + if ( bitstream[( *index )--] ) + { + codedBands = MASA_MAXIMUM_CODING_SUBBANDS - ivas_qmetadata_DecodeExtendedGR( bitstream, index, MASA_MAXIMUM_CODING_SUBBANDS, 1 ) - 1; + } + else + { + codedBands = MASA_MAXIMUM_CODING_SUBBANDS; + } + for ( b = codedBands; b < ncoding_bands_config; b++ ) + { + for ( m = 0; m < MAX_PARAM_SPATIAL_SUBFRAMES; m++ ) + { + hQMetaData->q_direction[0].band_data[b].azimuth[m] = 0.0f; + hQMetaData->q_direction[0].band_data[b].elevation[m] = 0.0f; + hQMetaData->q_direction[0].band_data[b].energy_ratio[m] = 0.0f; + + if ( hQMetaData->coherence_flag && hQMetaData->q_direction[0].coherence_band_data != NULL ) + { + hQMetaData->q_direction[0].coherence_band_data[b].spread_coherence[m] = 0u; + } + + if ( hQMetaData->no_directions == 2 ) + { + hQMetaData->q_direction[1].band_data[b].azimuth[m] = 0.0f; + hQMetaData->q_direction[1].band_data[b].elevation[m] = 0.0f; + hQMetaData->q_direction[1].band_data[b].energy_ratio[m] = 0.0f; + + if ( hQMetaData->coherence_flag && hQMetaData->q_direction[1].coherence_band_data != NULL ) + { + hQMetaData->q_direction[1].coherence_band_data[b].spread_coherence[m] = 0u; + } + } + + if ( hQMetaData->coherence_flag && hQMetaData->surcoh_band_data != NULL ) + { + hQMetaData->surcoh_band_data[b].surround_coherence[m] = 0u; + } + } + + if ( hQMetaData->no_directions == 2 ) + { + hQMetaData->twoDirBands[b] = 0; + } + } + sf_nbands0 = hQMetaData->q_direction[0].cfg.nbands; + + hQMetaData->q_direction[0].cfg.nbands = codedBands; + + /*Coherence flag decoding*/ + all_coherence_zero = 1; + if ( hQMetaData->coherence_flag ) + { + /* read if coherence is zero */ + all_coherence_zero = bitstream[( *index )--]; + } + + hQMetaData->all_coherence_zero = (uint8_t) all_coherence_zero; + + if ( hQMetaData->no_directions == 2 ) + { + set_c( (int8_t *) hQMetaData->twoDirBands, 1, hQMetaData->q_direction[0].cfg.nbands ); + } + + if ( bits_sph_idx == 11 && hQMetaData->no_directions == 2 ) + { + /* Read which bands have 2 directions */ + hQMetaData->q_direction[1].cfg.nbands = hQMetaData->numTwoDirBands; + sf_nbands1 = hQMetaData->q_direction[1].cfg.nbands; + if ( hQMetaData->q_direction[1].cfg.nbands > codedBands ) + { + hQMetaData->q_direction[1].cfg.nbands = codedBands; + } + set_c( (int8_t *) hQMetaData->twoDirBands, 0, hQMetaData->q_direction[0].cfg.nbands ); + d = *index; + dif_p[0] = ivas_qmetadata_DecodeExtendedGR( bitstream, index, MASA_MAXIMUM_CODING_SUBBANDS, 0 ); + p[0] = dif_p[0]; + hQMetaData->twoDirBands[p[0]] = 1; + for ( b = 1; b < hQMetaData->q_direction[1].cfg.nbands; b++ ) + { + dif_p[b] = ivas_qmetadata_DecodeExtendedGR( bitstream, index, MASA_MAXIMUM_CODING_SUBBANDS, 0 ); + p[b] = p[b - 1] + dif_p[b] + 1; + hQMetaData->twoDirBands[p[b]] = 1; + } + } + + if ( bits_sph_idx == 16 && hQMetaData->no_directions == 2 ) + { + sf_nbands1 = hQMetaData->q_direction[1].cfg.nbands; + if ( hQMetaData->q_direction[1].cfg.nbands > codedBands ) + { + hQMetaData->q_direction[1].cfg.nbands = codedBands; + } + } + ivas_qmetadata_entropy_decode_diffuseness_hr_512( bitstream, index, &( hQMetaData->q_direction[0] ) ); + + if ( hQMetaData->no_directions == 2 ) + { + ivas_qmetadata_entropy_decode_diffuseness_hr_512( bitstream, index, &( hQMetaData->q_direction[1] ) ); + } + + + for ( b = hQMetaData->q_direction[0].cfg.start_band; b < hQMetaData->q_direction[0].cfg.nbands; b++ ) + { + for ( m = 0; m < hQMetaData->q_direction[0].cfg.nblocks; m++ ) + { + hQMetaData->q_direction[0].band_data[b].energy_ratio[m] = 1.0f - diffuseness_reconstructions_hr[hQMetaData->q_direction[0].band_data[b].energy_ratio_index[m]]; + } + } + if ( hQMetaData->no_directions == 2 ) + { + float ratioSum; + if ( bits_sph_idx == 16 ) + { + for ( b = hQMetaData->q_direction[1].cfg.start_band; b < hQMetaData->q_direction[1].cfg.nbands; b++ ) + { + for ( m = 0; m < hQMetaData->q_direction[1].cfg.nblocks; m++ ) + { + hQMetaData->q_direction[1].band_data[b].energy_ratio[m] = 1.0f - diffuseness_reconstructions_hr[hQMetaData->q_direction[1].band_data[b].energy_ratio_index[m]]; + + /* Scale energy ratios that sum to over one */ + ratioSum = hQMetaData->q_direction[0].band_data[b].energy_ratio[m] + hQMetaData->q_direction[1].band_data[b].energy_ratio[m]; + + if ( ratioSum > 1.0f ) + { + hQMetaData->q_direction[0].band_data[b].energy_ratio[m] /= ratioSum; + hQMetaData->q_direction[1].band_data[b].energy_ratio[m] /= ratioSum; + } + } + } + } + else + { + int16_t pos_2dir_band[MASA_MAXIMUM_CODING_SUBBANDS]; + d = 0; + for ( b = hQMetaData->q_direction[0].cfg.start_band; b < hQMetaData->q_direction[0].cfg.nbands; b++ ) + { + if ( hQMetaData->twoDirBands[b] == 1 ) + { + pos_2dir_band[d] = b; + d++; + } + else + { + pos_2dir_band[d] = 0; + } + } + for ( b = hQMetaData->q_direction[1].cfg.start_band; b < hQMetaData->q_direction[1].cfg.nbands; b++ ) + { + for ( m = 0; m < hQMetaData->q_direction[1].cfg.nblocks; m++ ) + { + hQMetaData->q_direction[1].band_data[b].energy_ratio[m] = 1.0f - diffuseness_reconstructions_hr[hQMetaData->q_direction[1].band_data[b].energy_ratio_index[m]]; + + ratioSum = hQMetaData->q_direction[0].band_data[pos_2dir_band[b]].energy_ratio[m] + hQMetaData->q_direction[1].band_data[b].energy_ratio[m]; + + if ( ratioSum > 1.0f ) + { + hQMetaData->q_direction[0].band_data[pos_2dir_band[b]].energy_ratio[m] /= ratioSum; + hQMetaData->q_direction[1].band_data[b].energy_ratio[m] /= ratioSum; + } + } + } + } + } + + if ( hQMetaData->no_directions == 2 ) + { + for ( b = hQMetaData->q_direction[1].cfg.start_band; b < hQMetaData->q_direction[1].cfg.nbands; b++ ) + { + for ( m = 0; m < hQMetaData->q_direction[1].cfg.nblocks; m++ ) + { + hQMetaData->q_direction[1].band_data[b].energy_ratio_index_mod[m] = hQMetaData->q_direction[1].band_data[b].energy_ratio_index[m]; + hQMetaData->q_direction[1].band_data[b].bits_sph_idx[m] = bits_sph_idx; + } + } + } + + for ( b = hQMetaData->q_direction[0].cfg.start_band; b < hQMetaData->q_direction[0].cfg.nbands; b++ ) + { + for ( m = 0; m < hQMetaData->q_direction[0].cfg.nblocks; m++ ) + { + hQMetaData->q_direction[0].band_data[b].energy_ratio_index_mod[m] = hQMetaData->q_direction[0].band_data[b].energy_ratio_index[0]; + hQMetaData->q_direction[0].band_data[b].bits_sph_idx[m] = bits_sph_idx; + } + } + + if ( all_coherence_zero == 0 ) + { + read_surround_coherence_hr( bitstream, index, hQMetaData ); + } + else + { + /*Surround coherence*/ + for ( b = 0; b < hQMetaData->q_direction[0].cfg.nbands; b++ ) + { + if ( hQMetaData->surcoh_band_data != NULL ) + { + set_c( (int8_t *) hQMetaData->surcoh_band_data[b].surround_coherence, 0, MAX_PARAM_SPATIAL_SUBFRAMES ); + } + } + } + + for ( d = 0; d < hQMetaData->no_directions; d++ ) + { + q_direction = &hQMetaData->q_direction[d]; + nbands = q_direction->cfg.nbands; + start_band = q_direction->cfg.start_band; + + /* Read coherence, if any */ + if ( all_coherence_zero == 0 ) + { + read_coherence_data_hr_512( bitstream, index, hQMetaData, d, bits_sp_coh ); + } + else + { + /*Surround coherence*/ + for ( b = 0; b < hQMetaData->q_direction[0].cfg.nbands; b++ ) + { + if ( hQMetaData->surcoh_band_data != NULL ) + { + set_c( (int8_t *) hQMetaData->surcoh_band_data[b].surround_coherence, 0, MAX_PARAM_SPATIAL_SUBFRAMES ); + } + + if ( hQMetaData->q_direction[d].coherence_band_data != NULL ) + { + set_c( (int8_t *) hQMetaData->q_direction[d].coherence_band_data[b].spread_coherence, 0, MAX_PARAM_SPATIAL_SUBFRAMES ); + } + } + } + + /* Decode quantized directions frame-wise */ + ivas_qmetadata_raw_decode_dir_512( q_direction, bitstream, index, nbands, start_band, sph_grid16 ); + + } + + if ( hQMetaData->no_directions == 2 ) + { + /* move 2 dir data to its correct subband */ + if ( bits_sph_idx == 11 ) + { + int16_t nblocks; + d = hQMetaData->q_direction[1].cfg.nbands - 1; + nblocks = hQMetaData->q_direction[0].cfg.nblocks; + + for ( b = hQMetaData->q_direction[0].cfg.nbands - 1; b >= 0; b-- ) + { + if ( hQMetaData->twoDirBands[b] == 1 ) + { + mvr2r( hQMetaData->q_direction[1].band_data[d].azimuth, hQMetaData->q_direction[1].band_data[b].azimuth, nblocks ); + mvr2r( hQMetaData->q_direction[1].band_data[d].elevation, hQMetaData->q_direction[1].band_data[b].elevation, nblocks ); + mvr2r( hQMetaData->q_direction[1].band_data[d].energy_ratio, hQMetaData->q_direction[1].band_data[b].energy_ratio, nblocks ); + + + if ( hQMetaData->q_direction[1].coherence_band_data != NULL ) + { + mvc2c( hQMetaData->q_direction[1].coherence_band_data[d].spread_coherence, hQMetaData->q_direction[1].coherence_band_data[b].spread_coherence, nblocks ); + } + d--; + } + else + { + set_f( hQMetaData->q_direction[1].band_data[b].azimuth, 0.0f, nblocks ); + set_f( hQMetaData->q_direction[1].band_data[b].elevation, 0.0f, nblocks ); + set_f( hQMetaData->q_direction[1].band_data[b].energy_ratio, 0.0f, nblocks ); + + if ( hQMetaData->q_direction[1].coherence_band_data != NULL ) + { + set_c( (int8_t *) hQMetaData->q_direction[1].coherence_band_data[b].spread_coherence, 0, nblocks ); + } + } + } + } + } + + /* Store status information for renderer use */ + hQMetaData->ec_flag = 0; + + hQMetaData->dir_comp_ratio = 1.0f; + + if ( hQMetaData->dir_comp_ratio > 1.0f ) + { + hQMetaData->dir_comp_ratio = 1.0f; + } + + hQMetaData->q_direction[0].cfg.nbands = sf_nbands0; + if ( hQMetaData->no_directions == 2 ) + { + hQMetaData->q_direction[1].cfg.nbands = sf_nbands1; + } + + return ( start_index_0 - *index ); +} + + +/*-----------------------------------------------------------------------* + * ivas_qmetadata_dec_sid_decode() + * + * Main function for decoding SID for Spatial Metadata + *-----------------------------------------------------------------------*/ + +/*! r: number of bits written */ +int16_t ivas_qmetadata_dec_sid_decode( + IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ + uint16_t *bitstream, /* i : bitstream */ + int16_t *index, /* i/o: bitstream position */ + const int16_t nchan_transport, /* i : number of transport channels */ + int16_t *element_mode, /* o : element mode */ + const int16_t ivas_format /* i : IVAS format */ +) +{ + int16_t b, m, i; + uint16_t value; + uint16_t diffuseness_index[DIRAC_MAX_NBANDS]; + int16_t nbands, nblocks, start_band; + IVAS_QDIRECTION *q_direction; + int16_t start_index; + float avg_elevation, avg_azimuth; + float avg_direction_vector[3]; + float direction_vector[3]; + int16_t metadata_sid_bits; /* bits allocated to SID for metadata */ + int16_t bits_delta, bits_dir; + + if ( ivas_format == SBA_FORMAT ) + { + metadata_sid_bits = (int16_t) ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - ( SPAR_DTX_BANDS * SPAR_SID_BITS_TAR_PER_BAND ) - 2 - SID_FORMAT_NBITS; /* -1 for inactive mode header bit*/ + } + else + { + metadata_sid_bits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; + } + + start_index = *index; + + /* read MASA SID descriptor */ + if ( ivas_format == MASA_FORMAT && nchan_transport == 2 ) + { + b = bitstream[( *index )--]; + if ( b ) + { + *element_mode = IVAS_CPE_MDCT; + } + else + { + *element_mode = IVAS_CPE_DFT; + } + } + + /* Fix configuration for SID */ + q_direction = &hQMetaData->q_direction[0]; /* only 1 direction */ + if ( ivas_format == SBA_FORMAT ) + { + nbands = DIRAC_DTX_BANDS; /* only 2 bands transmitted */ + } + else + { + nbands = 5; /* only 5 bands transmitted */ + } + + nblocks = q_direction->cfg.nblocks; /* only 1 block transmitted but up to 4 blocks re-generated */ + start_band = 0; /* start from band 0 */ + + /* Read 2D signaling*/ + if ( ivas_format != SBA_FORMAT ) + { + q_direction->not_in_2D = bitstream[( *index )--]; + } + else + { + q_direction->not_in_2D = 1; + } + + bits_dir = 0; + if ( ivas_format != SBA_FORMAT ) + { + /* Decode diffuseness*/ + for ( b = start_band; b < nbands; b++ ) + { + diffuseness_index[b] = ivas_qmetadata_DecodeQuasiUniform( bitstream, index, DIRAC_DIFFUSE_LEVELS - 4 ) + 4; + q_direction->band_data[b].energy_ratio_index[0] = diffuseness_index[b]; + q_direction->band_data[b].bits_sph_idx[0] = bits_direction_masa[diffuseness_index[b]]; + bits_dir += q_direction->band_data[b].bits_sph_idx[0]; + q_direction->band_data[b].azimuth_m_alphabet[0] = no_phi_masa[q_direction->band_data[b].bits_sph_idx[0] - 1][0]; + } + + bits_delta = metadata_sid_bits - ( start_index - *index ) - bits_dir; /* bit_diff is already read */ + + if ( bits_delta > 0 ) + { + while ( bits_delta > 0 ) + { + for ( b = start_band; b < nbands && ( bits_delta > 0 ); b++ ) + { + if ( q_direction->band_data[b].bits_sph_idx[0] < 11 ) + { + bits_delta -= 1; + q_direction->band_data[b].bits_sph_idx[0]++; + } + } + } + + if ( q_direction->not_in_2D == 0 ) + { + for ( b = start_band; b < nbands; b++ ) + { + q_direction->band_data[b].azimuth_m_alphabet[0] = 1 << ( min( 8, q_direction->band_data[b].bits_sph_idx[0] ) ); + } + } + } + else + { + while ( bits_delta < 0 ) + { + for ( b = nbands - 1; b >= start_band && ( bits_delta < 0 ); b-- ) + { + if ( q_direction->band_data[b].bits_sph_idx[0] >= 4 ) + { + bits_delta += 1; + q_direction->band_data[b].bits_sph_idx[0]--; + } + } + + if ( q_direction->not_in_2D == 0 ) + { + for ( b = start_band; b < nbands; b++ ) + { + q_direction->band_data[b].azimuth_m_alphabet[0] = 1 << ( min( 8, q_direction->band_data[b].bits_sph_idx[0] ) ); + } + } + } + } + } + else + { + /* Decode diffuseness*/ + for ( b = start_band; b < nbands; b++ ) + { + diffuseness_index[b] = ivas_qmetadata_DecodeQuasiUniform( bitstream, index, DIRAC_DIFFUSE_LEVELS - 4 ) + 4; + q_direction->band_data[b].energy_ratio_index[0] = diffuseness_index[b]; + q_direction->band_data[b].bits_sph_idx[0] = bits_direction_masa[diffuseness_index[b]]; + q_direction->band_data[b].azimuth_m_alphabet[0] = no_phi_masa[q_direction->band_data[b].bits_sph_idx[0] - 1][0]; + } + } + + for ( b = start_band; b < nbands; b++ ) + { + q_direction->band_data[b].energy_ratio[0] = 1.0f - diffuseness_reconstructions[diffuseness_index[b]]; + for ( i = 0; i < nblocks; i++ ) + { + q_direction->band_data[b].energy_ratio[i] = q_direction->band_data[b].energy_ratio[0]; + } + } + + /* Decoder DOAs*/ + if ( q_direction->not_in_2D > 0 ) + { + for ( b = start_band; b < nbands; b++ ) + { + value = 0; + for ( i = 0; i < q_direction->band_data[b].bits_sph_idx[0]; i++ ) + { + value = ( value << 1 ) + bitstream[( *index )--]; + } + for ( i = 0; i < nblocks; i++ ) + { + q_direction->band_data[b].spherical_index[i] = value; + } + + deindex_spherical_component( q_direction->band_data[b].spherical_index[0], &avg_azimuth, &avg_elevation, &q_direction->band_data[b].azimuth_index[0], &q_direction->band_data[b].elevation_index[0], q_direction->band_data[b].bits_sph_idx[0], q_direction->cfg.mc_ls_setup ); + + ivas_qmetadata_azimuth_elevation_to_direction_vector( avg_azimuth, avg_elevation, avg_direction_vector ); + ivas_qmetadata_azimuth_elevation_to_direction_vector( q_direction->band_data[b].azimuth[nblocks - 1], q_direction->band_data[b].elevation[nblocks - 1], direction_vector ); + + for ( m = 0; m < nblocks - 1; m++ ) + { + v_add( direction_vector, avg_direction_vector, direction_vector, 3 ); + ivas_qmetadata_direction_vector_to_azimuth_elevation( direction_vector, &q_direction->band_data[b].azimuth[m], &q_direction->band_data[b].elevation[m] ); + } + + ivas_qmetadata_direction_vector_to_azimuth_elevation( avg_direction_vector, &q_direction->band_data[b].azimuth[nblocks - 1], &q_direction->band_data[b].elevation[nblocks - 1] ); + } + } + else + { + for ( b = start_band; b < nbands; b++ ) + { + if ( ivas_format == SBA_FORMAT ) + { + q_direction->band_data[b].azimuth_m_alphabet[0] = 1 << ( min( 5, q_direction->band_data[b].bits_sph_idx[0] ) ); + } + + q_direction->band_data[b].azimuth_index[0] = ivas_qmetadata_DecodeQuasiUniform( bitstream, index, q_direction->band_data[b].azimuth_m_alphabet[0] ); + q_direction->band_data[b].azimuth_index[0] = ivas_qmetadata_dereorder_generic( q_direction->band_data[b].azimuth_index[0] ) + ( q_direction->band_data[b].azimuth_m_alphabet[0] >> 1 ); + avg_azimuth = 360.0f / (float) ( q_direction->band_data[b].azimuth_m_alphabet[0] ) * q_direction->band_data[b].azimuth_index[0] - 180; + + avg_elevation = 0.f; + + ivas_qmetadata_azimuth_elevation_to_direction_vector( avg_azimuth, avg_elevation, avg_direction_vector ); + ivas_qmetadata_azimuth_elevation_to_direction_vector( q_direction->band_data[b].azimuth[nblocks - 1], q_direction->band_data[b].elevation[nblocks - 1], direction_vector ); + + for ( m = 0; m < nblocks - 1; m++ ) + { + v_add( direction_vector, avg_direction_vector, direction_vector, 3 ); + ivas_qmetadata_direction_vector_to_azimuth_elevation( direction_vector, &q_direction->band_data[b].azimuth[m], &q_direction->band_data[b].elevation[m] ); + } + + ivas_qmetadata_direction_vector_to_azimuth_elevation( avg_direction_vector, &q_direction->band_data[b].azimuth[nblocks - 1], &q_direction->band_data[b].elevation[nblocks - 1] ); + + for ( i = 0; i < nblocks; i++ ) + { + q_direction->band_data[b].spherical_index[i] = q_direction->band_data[b].azimuth_index[0]; + } + } + } + + + /*Read filling bits*/ + while ( start_index - *index < metadata_sid_bits ) + { + b = bitstream[( *index )--]; + } + + return ( start_index - *index ); +} + + +/*-----------------------------------------------------------------------* + * Local function definitions for diffuseness/energy ratios + *-----------------------------------------------------------------------*/ + +static int16_t ivas_diffuseness_huff_ec_decode( + const uint16_t *bitstream, + int16_t *index, + int16_t av ) +{ + int16_t val; + + val = 0; + while ( val <= DIFF_EC_HUFF_GR0_LIMIT ) + { + if ( bitstream[( *index )--] == 1 ) + { + val++; + } + else + { + break; + } + } + + if ( val == DIFF_EC_HUFF_GR0_LIMIT + 1 ) + { + val += 2 * bitstream[( *index )]; + ( *index )--; + val += bitstream[( *index )]; + ( *index )--; + } + + if ( val % 2 == 0 ) + { + return -( val / 2 ) + av; + } + else + { + return ( val + 1 ) / 2 + av; + } +} + + +/*-------------------------------------------------------------------* + * ivas_qmetadata_entropy_decode_diffuseness() + * + * + *-------------------------------------------------------------------*/ + +static int16_t ivas_qmetadata_entropy_decode_diffuseness( + uint16_t *bitstream, /* i : bitstream */ + int16_t *index, + IVAS_QDIRECTION *q_direction, + uint16_t *diffuseness_index_max_ec_frame ) +{ + int16_t b; + uint16_t dif_min; + int16_t index_start; + int16_t nbands; + int16_t start_band; + + index_start = *index; + nbands = q_direction->cfg.nbands; + start_band = q_direction->cfg.start_band; + + /* diffuseness decoding */ + /* Handle one band as special case*/ + if ( nbands == 1 ) + { + q_direction->band_data[0].energy_ratio_index[0] = 0; + for ( b = 0; b < MASA_BITS_ER; b++ ) + { + q_direction->band_data[0].energy_ratio_index[0] = ( q_direction->band_data[0].energy_ratio_index[0] << 1 ) + bitstream[( *index )--]; + } + *diffuseness_index_max_ec_frame = 5; + + return MASA_BITS_ER; + } + + if ( bitstream[( *index )--] == 0 ) /* dif_use_raw_coding */ + { + /* Decode with similarity strategy with low band count. On higher band counts, decode with Huffman-coding strategy. */ + if ( nbands < DIFF_EC_HUFF_BAND_LIMIT ) + { + if ( bitstream[( *index )--] != 0 ) /* dif_have_unique_value */ + { + dif_min = ivas_qmetadata_DecodeQuasiUniform( bitstream, index, DIRAC_DIFFUSE_LEVELS ); /* dif_unique_value */ + + for ( b = start_band; b < nbands; b++ ) + { + q_direction->band_data[b].energy_ratio_index[0] = dif_min; + } + } + else /* all diffuseness values are dif_min_value or dif_min_value + 1 */ + { + dif_min = ivas_qmetadata_DecodeQuasiUniform( bitstream, index, DIRAC_DIFFUSE_LEVELS - 1 ); /* dif_min_value */ + + for ( b = start_band; b < nbands; b++ ) + { + q_direction->band_data[b].energy_ratio_index[0] = dif_min + bitstream[( *index )--]; /* dif_bit_offset_values */ + } + } + } + else + { + int16_t av; + + /* read average on 3 bits*/ + av = 0; + for ( b = 0; b < MASA_BITS_ER; b++ ) + { + av += bitstream[( *index )--] * ( 1 << ( MASA_BITS_ER - 1 - b ) ); + } + + dif_min = DIRAC_DIFFUSE_LEVELS; + /* read average removed data (average is added inside)*/ + for ( b = start_band; b < nbands; b++ ) + { + q_direction->band_data[b].energy_ratio_index[0] = ivas_diffuseness_huff_ec_decode( bitstream, index, av ); + dif_min = min( dif_min, q_direction->band_data[b].energy_ratio_index[0] ); + } + } + } + else /* different values for diffuseness */ + { + dif_min = DIRAC_DIFFUSE_LEVELS; + + for ( b = start_band; b < nbands; b++ ) + { + q_direction->band_data[b].energy_ratio_index[0] = ivas_qmetadata_DecodeQuasiUniform( bitstream, index, DIRAC_DIFFUSE_LEVELS ); + dif_min = min( dif_min, q_direction->band_data[b].energy_ratio_index[0] ); + } + } + + *diffuseness_index_max_ec_frame = 5; + /* adaptively select the diffuseness_index_max_ec threshold */ + if ( dif_min > 5 ) + { + *diffuseness_index_max_ec_frame = DIRAC_DIFFUSE_LEVELS - 1; + } + + return ( index_start - *index ); +} + + +/*-------------------------------------------------------------------* + * ivas_qmetadata_entropy_decode_diffuseness_hr_512() + * + * + *-------------------------------------------------------------------*/ + +static int16_t ivas_qmetadata_entropy_decode_diffuseness_hr_512( + uint16_t *bitstream, /* i : bitstream */ + int16_t *index, + IVAS_QDIRECTION *q_direction ) +{ + int16_t b, k; + + int16_t index_start; + int16_t nbands, nblocks; + int16_t start_band; + + index_start = *index; + nbands = q_direction->cfg.nbands; + nblocks = q_direction->cfg.nblocks; + start_band = q_direction->cfg.start_band; + + /* diffuseness decoding */ + /* Handle one band as special case*/ + if ( nbands == 1 ) + { + q_direction->band_data[0].energy_ratio_index[0] = 0; + for ( b = 0; b < MASA_BITS_ER_HR; b++ ) + { + q_direction->band_data[0].energy_ratio_index[0] = ( q_direction->band_data[0].energy_ratio_index[0] << 1 ) + bitstream[( *index )--]; + } + + return MASA_BITS_ER_HR; + } + + for ( b = start_band; b < nbands; b++ ) + { + for ( k = 0; k < nblocks; k++ ) + { + q_direction->band_data[b].energy_ratio_index[k] = ivas_qmetadata_DecodeQuasiUniform( bitstream, index, HR_MASA_ER_LEVELS ); + } + } + + return ( index_start - *index ); +} + + +/*-------------------------------------------------------------------* + * ivas_qmetadata_entropy_decode_df_ratio() + * + * + *-------------------------------------------------------------------*/ + +static int16_t ivas_qmetadata_entropy_decode_df_ratio( + uint16_t *bitstream, + int16_t *index, + IVAS_QDIRECTION *q_direction, + int16_t *dfRatio_bits ) +{ + int16_t b; + int16_t bits_raw; + int16_t max_dfRatio_bits; + uint16_t ratio_min; + int16_t index_start; + int16_t nbands; + int16_t start_band; + int16_t ec_mode; + int16_t dec_mode; + int16_t max_alphabet_size; + + index_start = *index; + nbands = q_direction->cfg.nbands; + start_band = q_direction->cfg.start_band; + + /* Handle one band as special case*/ + if ( nbands == 1 ) + { + q_direction->band_data[0].energy_ratio_index[0] = 0; + for ( b = 0; b < dfRatio_bits[0]; b++ ) + { + q_direction->band_data[0].energy_ratio_index[0] = ( q_direction->band_data[0].energy_ratio_index[0] << 1 ) + bitstream[( *index )--]; + } + return dfRatio_bits[0]; + } + + /* Calculate raw coding bits and decide what modes are possible */ + bits_raw = 0; + max_dfRatio_bits = 0; + for ( b = start_band; b < nbands; b++ ) + { + bits_raw += dfRatio_bits[b]; + max_dfRatio_bits = max( max_dfRatio_bits, dfRatio_bits[b] ); + } + + /* Decide what modes are possible */ + if ( bits_raw >= max_dfRatio_bits + 2 + nbands ) + { + ec_mode = 2; + } + else if ( bits_raw >= max_dfRatio_bits + 1 ) + { + ec_mode = 1; + } + else + { + ec_mode = 0; + } + max_alphabet_size = 1 << max_dfRatio_bits; + + dec_mode = 2; /* Default to raw decoding */ + if ( ec_mode == 1 ) + { + if ( bitstream[( *index )--] == 0 ) + { + dec_mode = 1; /* Switch to one value EC coding */ + } + } + else if ( ec_mode == 2 ) + { + if ( bitstream[( *index )--] == 0 ) + { + if ( bitstream[( *index )--] == 0 ) + { + dec_mode = 1; /* Switch to one value EC coding */ + } + else + { + dec_mode = 0; /* Use one-bit diff bandwise mode */ + } + } + } + + if ( dec_mode == 2 ) /* Raw decoding */ + { + for ( b = start_band; b < nbands; b++ ) + { + q_direction->band_data[b].energy_ratio_index[0] = ivas_qmetadata_DecodeQuasiUniform( bitstream, index, 1 << dfRatio_bits[b] ); + } + } + else if ( dec_mode == 1 ) /* One value decoding */ + { + ratio_min = ivas_qmetadata_DecodeQuasiUniform( bitstream, index, max_alphabet_size ); /* dif_unique_value */ + + for ( b = start_band; b < nbands; b++ ) + { + q_direction->band_data[b].energy_ratio_index[0] = ratio_min; + } + } + else /* Bandwise 1-bit diff decoding */ + { + ratio_min = ivas_qmetadata_DecodeQuasiUniform( bitstream, index, max_alphabet_size - 1 ); /* dif_min_value */ + + for ( b = start_band; b < nbands; b++ ) + { + q_direction->band_data[b].energy_ratio_index[0] = ratio_min + bitstream[( *index )--]; /* dif_bit_offset_values */ + } + } + + return ( index_start - *index ); +} + + +/*-----------------------------------------------------------------------* + * Local functions (EC1) + *-----------------------------------------------------------------------*/ + +/*------------------------------------------------------------------------- + * ivas_qmetadata_entropy_decode_dir() + * + * Main function for entropy decoding of the directions + *------------------------------------------------------------------------*/ + +static int16_t ivas_qmetadata_entropy_decode_dir( + IVAS_QDIRECTION *q_direction, /* i/o: quantized direction structure */ + uint16_t *bitstream, /* i : bitstream */ + int16_t *index, + const uint16_t diffuseness_index_max_ec_frame, + const int16_t nbands, + const int16_t start_band, + const int16_t hrmasa_flag /* i : flag indicating high-rate MASA MD coding*/ +) +{ + int16_t b, m; + int16_t diff_idx; + int16_t diff_idx_min; + int16_t nblocks; + int16_t index_start; + + uint16_t gr_param_elev, gr_param_azith; + int16_t bands_entropic[MASA_MAXIMUM_CODING_SUBBANDS]; + int16_t elev_alph[MASA_MAXIMUM_CODING_SUBBANDS]; + int16_t azith_alph[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES]; + + int16_t avg_elevation_alphabet, avg_azimuth_alphabet; + int16_t avg_elevation_idx, avg_azimuth_index; + int16_t avg_elevation_index_projected, avg_azimuth_index_projected; + float direction_vector[3], avg_direction_vector[3], avg_azimuth, avg_elevation; + int16_t use_adapt_avg, idx; + + index_start = *index; + nblocks = q_direction->cfg.nblocks; + + diff_idx_min = DIRAC_DIFFUSE_LEVELS; + + /*Raw coding for high diffuseness*/ + for ( b = start_band; b < nbands; b++ ) + { + if ( hrmasa_flag ) + { + diff_idx = 0; + } + else + { + diff_idx = q_direction->band_data[b].energy_ratio_index_mod[0]; + } + + diff_idx_min = min( diff_idx_min, diff_idx ); + if ( q_direction->cfg.mc_ls_setup != MC_LS_SETUP_INVALID ) + { + elev_alph[b] = no_theta_masa[bits_direction_masa[diff_idx] - 3]; + } + else + { + elev_alph[b] = no_theta_masa[bits_direction_masa[diff_idx] - 3] * 2 - 1; + } + + if ( q_direction->band_data[b].energy_ratio_index_mod[0] > diffuseness_index_max_ec_frame ) + { + bands_entropic[b] = 0; + + if ( q_direction->not_in_2D > 0 ) + { + decode_fixed_rate( q_direction, bitstream, index, b, nblocks ); + } + else + { + /* in 2D */ + for ( m = 0; m < nblocks; m++ ) + { + q_direction->band_data[b].elevation[m] = 0.f; + q_direction->band_data[b].elevation_index[m] = 0; + + azith_alph[b][m] = no_phi_masa[bits_direction_masa[diff_idx] - 1][0]; + q_direction->band_data[b].azimuth_index[m] = ivas_qmetadata_DecodeQuasiUniform( bitstream, index, azith_alph[b][m] ); + q_direction->band_data[b].azimuth[m] = deindex_azimuth( q_direction->band_data[b].azimuth_index[m], q_direction->band_data[b].bits_sph_idx[m], 0, 1, q_direction->cfg.mc_ls_setup ); + } + } + } + else + { + bands_entropic[b] = 1; + } + } + + /*EC for the low diffuseness*/ + + /*Elevation only if not 2D */ + if ( q_direction->not_in_2D > 0 ) + { + if ( q_direction->cfg.mc_ls_setup != MC_LS_SETUP_INVALID ) + { + avg_elevation_alphabet = no_theta_masa[bits_direction_masa[diff_idx_min] - 3]; + avg_elevation_idx = ivas_qmetadata_DecodeQuasiUniform( bitstream, index, avg_elevation_alphabet ); + } + else + { + avg_elevation_alphabet = no_theta_masa[bits_direction_masa[diff_idx_min] - 3] * 2 - 1; + avg_elevation_idx = ivas_qmetadata_DecodeQuasiUniform( bitstream, index, avg_elevation_alphabet ); + avg_elevation_idx = ivas_qmetadata_dereorder_generic( avg_elevation_idx ) + ( avg_elevation_alphabet >> 1 ); + } + + gr_param_elev = ivas_qmetadata_DecodeQuasiUniform( bitstream, index, 4 + 1 ); + if ( gr_param_elev == 4 ) /* all the elevation distances are zero */ + { + for ( b = start_band; b < nbands; b++ ) + { + if ( bands_entropic[b] ) + { + int16_t tmp_index; + if ( hrmasa_flag ) + { + diff_idx = 0; + } + else + { + diff_idx = q_direction->band_data[b].energy_ratio_index_mod[0]; + } + + if ( q_direction->cfg.mc_ls_setup != MC_LS_SETUP_INVALID ) + { + avg_elevation_index_projected = ivas_chan_project_elevation_index( avg_elevation_idx, avg_elevation_alphabet, elev_alph[b] ); + } + else + { + avg_elevation_index_projected = ivas_dirac_project_elevation_index( avg_elevation_idx, avg_elevation_alphabet, elev_alph[b] ); + + /*reorder elevation indexing*/ + tmp_index = avg_elevation_index_projected - ( elev_alph[b] >> 1 ); + if ( tmp_index < 0 ) + { + tmp_index = tmp_index * -2; + } + else if ( tmp_index > 0 ) + { + tmp_index = tmp_index * 2 - 1; + } + avg_elevation_index_projected = tmp_index; + } + + for ( m = 0; m < nblocks; m++ ) + { + q_direction->band_data[b].elevation_index[m] = avg_elevation_index_projected; + + /*deduce aplhabet for azimuth*/ + if ( q_direction->cfg.mc_ls_setup != MC_LS_SETUP_INVALID ) + { + azith_alph[b][m] = no_phi_masa[bits_direction_masa[diff_idx] - 1][q_direction->band_data[b].elevation_index[m]]; + } + else + { + azith_alph[b][m] = no_phi_masa[bits_direction_masa[diff_idx] - 1][( q_direction->band_data[b].elevation_index[m] + 1 ) >> 1]; + } + + /*decode elevation*/ + q_direction->band_data[b].elevation[m] = deindex_elevation( &q_direction->band_data[b].elevation_index[m], q_direction->band_data[b].bits_sph_idx[m], q_direction->cfg.mc_ls_setup ); + } + } + } + } + else + { + for ( b = start_band; b < nbands; b++ ) + { + if ( bands_entropic[b] ) + { + if ( hrmasa_flag ) + { + diff_idx = 0; + } + else + { + diff_idx = q_direction->band_data[b].energy_ratio_index_mod[0]; + } + + for ( m = 0; m < nblocks; m++ ) + { + int16_t tmp_index; + if ( q_direction->cfg.mc_ls_setup != MC_LS_SETUP_INVALID ) + { + avg_elevation_index_projected = ivas_chan_project_elevation_index( avg_elevation_idx, avg_elevation_alphabet, elev_alph[b] ); + tmp_index = ivas_qmetadata_DecodeExtendedGR( bitstream, index, 2 * elev_alph[b] - 1, gr_param_elev ); + if ( tmp_index % 2 ) + { + tmp_index = avg_elevation_index_projected + ( ( tmp_index + 1 ) >> 1 ); + } + else + { + tmp_index = avg_elevation_index_projected - ( tmp_index >> 1 ); + } + q_direction->band_data[b].elevation_index[m] = tmp_index; + + /*deduce aplhabet for azimuth*/ + azith_alph[b][m] = no_phi_masa[bits_direction_masa[diff_idx] - 1][q_direction->band_data[b].elevation_index[m]]; + } + else + { + avg_elevation_index_projected = ivas_dirac_project_elevation_index( avg_elevation_idx, avg_elevation_alphabet, elev_alph[b] ); + + tmp_index = ivas_qmetadata_DecodeExtendedGR( bitstream, index, elev_alph[b], gr_param_elev ); + tmp_index = ivas_qmetadata_ReorderElevationDecoded( tmp_index, avg_elevation_index_projected, elev_alph[b] ); + + /*reorder elevation indexing*/ + tmp_index = tmp_index - ( elev_alph[b] >> 1 ); + if ( tmp_index < 0 ) + { + tmp_index = tmp_index * -2; + } + else if ( tmp_index > 0 ) + { + tmp_index = tmp_index * 2 - 1; + } + q_direction->band_data[b].elevation_index[m] = tmp_index; + + /*deduce aplhabet for azimuth*/ + azith_alph[b][m] = no_phi_masa[bits_direction_masa[diff_idx] - 1][( q_direction->band_data[b].elevation_index[m] + 1 ) >> 1]; + } + + /*decode elevation*/ + q_direction->band_data[b].elevation[m] = deindex_elevation( &q_direction->band_data[b].elevation_index[m], q_direction->band_data[b].bits_sph_idx[m], q_direction->cfg.mc_ls_setup ); + } + } + } + } + } + else + { + for ( b = start_band; b < nbands; b++ ) + { + if ( bands_entropic[b] ) + { + if ( hrmasa_flag ) + { + diff_idx = 0; + } + else + { + diff_idx = q_direction->band_data[b].energy_ratio_index_mod[0]; + } + + for ( m = 0; m < nblocks; m++ ) + { + q_direction->band_data[b].elevation_index[m] = 0; + + /*deduce alphabet for azimuth*/ + if ( q_direction->cfg.mc_ls_setup != MC_LS_SETUP_INVALID ) + { + azith_alph[b][m] = no_phi_masa[bits_direction_masa[diff_idx] - 1][q_direction->band_data[b].elevation_index[m]]; + } + else + { + azith_alph[b][m] = no_phi_masa[bits_direction_masa[diff_idx] - 1][( q_direction->band_data[b].elevation_index[m] + 1 ) >> 1]; + } + + /*decode elevation*/ + q_direction->band_data[b].elevation[m] = deindex_elevation( &q_direction->band_data[b].elevation_index[m], q_direction->band_data[b].bits_sph_idx[m], q_direction->cfg.mc_ls_setup ); + } + } + } + } + + /*Azimuth*/ + avg_azimuth_alphabet = no_phi_masa[bits_direction_masa[diff_idx_min] - 1][0]; /* average azimuth is quantized on the equatorial plane */ + avg_azimuth_index = ivas_qmetadata_DecodeQuasiUniform( bitstream, index, avg_azimuth_alphabet ); + avg_azimuth_index = ivas_qmetadata_dereorder_generic( avg_azimuth_index ); + avg_azimuth_index = avg_azimuth_index + ( avg_azimuth_alphabet >> 1 ); + + gr_param_azith = ivas_qmetadata_DecodeQuasiUniform( bitstream, index, 5 + 1 ); + if ( gr_param_azith == 5 ) /* all the azimuth distances are zero */ + { + for ( b = start_band; b < nbands; b++ ) + { + if ( bands_entropic[b] ) + { + for ( m = 0; m < nblocks; m++ ) + { + q_direction->band_data[b].azimuth_index[m] = ivas_dirac_project_azimuth_index( avg_azimuth_index, avg_azimuth_alphabet, azith_alph[b][m] ); + + if ( azith_alph[b][m] == 1 ) + { + q_direction->band_data[b].azimuth[m] = 0.f; + } + else + { + q_direction->band_data[b].azimuth[m] = deindex_azimuth( q_direction->band_data[b].azimuth_index[m], q_direction->band_data[b].bits_sph_idx[m], q_direction->band_data[b].elevation_index[m], 0, q_direction->cfg.mc_ls_setup ); + } + } + } + } + } + else + { + set_zero( avg_direction_vector, 3 ); + use_adapt_avg = 0; + idx = 0; + + for ( b = start_band; b < nbands; b++ ) + { + if ( bands_entropic[b] ) + { + for ( m = 0; m < nblocks; m++ ) + { + if ( ( q_direction->cfg.mc_ls_setup != MC_LS_SETUP_INVALID ) && ( idx == MASA_LIMIT_IDX_AVG_AZI ) && ( nblocks > 1 ) ) + { + use_adapt_avg = bitstream[*index]; + ( *index )--; + } + avg_azimuth_index_projected = ivas_dirac_project_azimuth_index( avg_azimuth_index, avg_azimuth_alphabet, azith_alph[b][m] ); + q_direction->band_data[b].azimuth_index[m] = ivas_qmetadata_DecodeExtendedGR( bitstream, index, azith_alph[b][m], gr_param_azith ); + q_direction->band_data[b].azimuth_index[m] = ivas_qmetadata_ReorderElevationDecoded( q_direction->band_data[b].azimuth_index[m], avg_azimuth_index_projected, azith_alph[b][m] ); + + if ( azith_alph[b][m] == 1 ) + { + q_direction->band_data[b].azimuth[m] = 0.f; + } + else + { + q_direction->band_data[b].azimuth[m] = deindex_azimuth( q_direction->band_data[b].azimuth_index[m], q_direction->band_data[b].bits_sph_idx[m], q_direction->band_data[b].elevation_index[m], 0, q_direction->cfg.mc_ls_setup ); + } + if ( ( q_direction->cfg.mc_ls_setup != MC_LS_SETUP_INVALID ) && ( nblocks > 1 ) ) + { + if ( idx < MASA_LIMIT_IDX_AVG_AZI ) + { + ivas_qmetadata_azimuth_elevation_to_direction_vector( q_direction->band_data[b].azimuth[m], q_direction->band_data[b].elevation[m], direction_vector ); + v_add( avg_direction_vector, direction_vector, avg_direction_vector, 3 ); + } + else + { + if ( use_adapt_avg == 1 ) + { + if ( m == 0 ) + { + v_multc( avg_direction_vector, 0.5f, avg_direction_vector, 3 ); + } + /*compute the average direction per already coded subband */ + ivas_qmetadata_azimuth_elevation_to_direction_vector( q_direction->band_data[b].azimuth[m], q_direction->band_data[b].elevation[m], direction_vector ); + v_add( avg_direction_vector, direction_vector, avg_direction_vector, 3 ); + ivas_qmetadata_direction_vector_to_azimuth_elevation( avg_direction_vector, &avg_azimuth, &avg_elevation ); + avg_azimuth_index = quantize_phi( avg_azimuth + 180, 0, &avg_azimuth, avg_azimuth_alphabet ); + } + } + idx++; + } + } + } + } + } + + return ( index_start - *index ); +} + + +/*------------------------------------------------------------------------- + * ivas_qmetadata_raw_decode_dir() + * + * Main function for raw decoding of the directions + *------------------------------------------------------------------------*/ + +static int16_t ivas_qmetadata_raw_decode_dir_512( + IVAS_QDIRECTION *q_direction, /* i/o: quantized direction structure */ + uint16_t *bitstream, /* i : bitstream */ + int16_t *index, + const int16_t nbands, + const int16_t start_band, + const SPHERICAL_GRID_DATA *sph_grid16 /* i : spherical grid for deindexing */ +) +{ + int16_t b, m, i; + int16_t nblocks; + int16_t index_start; + uint16_t value; + + index_start = *index; + nblocks = q_direction->cfg.nblocks; + + for ( b = start_band; b < nbands; b++ ) + { + for ( m = 0; m < nblocks; m++ ) + { + value = 0; + for ( i = 0; i < q_direction->band_data[b].bits_sph_idx[m]; i++ ) + { + value = ( value << 1 ) + bitstream[( *index )--]; + } + q_direction->band_data[b].spherical_index[m] = value; + + if ( q_direction->band_data[b].bits_sph_idx[m] == 16 ) + { + deindex_sph_idx( value, sph_grid16, &( q_direction->band_data[b].elevation[m] ), &( q_direction->band_data[b].azimuth[m] ) ); + } + else + { + deindex_spherical_component( q_direction->band_data[b].spherical_index[m], &q_direction->band_data[b].azimuth[m], &q_direction->band_data[b].elevation[m], &q_direction->band_data[b].azimuth_index[m], &q_direction->band_data[b].elevation_index[m], q_direction->band_data[b].bits_sph_idx[m], q_direction->cfg.mc_ls_setup ); + } + } + } + + return ( index_start - *index ); +} + + +/*------------------------------------------------------------------------- + * ivas_qmetadata_raw_decode_dir() + * + * Main function for raw decoding of the directions + *------------------------------------------------------------------------*/ + +static int16_t ivas_qmetadata_raw_decode_dir( + IVAS_QDIRECTION *q_direction, /* i/o: quantized direction structure */ + uint16_t *bitstream, /* i : bitstream */ + int16_t *index, + const int16_t nbands, + const int16_t start_band, + const int16_t hrmasa_flag /* i : flag indicating high-rate MASA MD coding*/ +) +{ + int16_t b, m, azith_alph; + int16_t diff_idx; + int16_t nblocks; + int16_t index_start; + + index_start = *index; + nblocks = q_direction->cfg.nblocks; + + for ( b = start_band; b < nbands; b++ ) + { + if ( q_direction->not_in_2D > 0 ) + { + decode_fixed_rate( q_direction, bitstream, index, b, nblocks ); + } + else + { + if ( hrmasa_flag ) + { + diff_idx = 0; + } + else + { + diff_idx = q_direction->band_data[b].energy_ratio_index_mod[0]; + } + + for ( m = 0; m < nblocks; m++ ) + { + q_direction->band_data[b].elevation[m] = 0.f; + q_direction->band_data[b].elevation_index[m] = 0; + azith_alph = no_phi_masa[bits_direction_masa[diff_idx] - 1][0]; + q_direction->band_data[b].azimuth_index[m] = ivas_qmetadata_DecodeQuasiUniform( bitstream, index, azith_alph ); + q_direction->band_data[b].azimuth[m] = deindex_azimuth( q_direction->band_data[b].azimuth_index[m], q_direction->band_data[b].bits_sph_idx[m], 0, 1, q_direction->cfg.mc_ls_setup ); + } + } + } + + return ( index_start - *index ); +} + + +/*------------------------------------------------------------------------- + * ivas_qmetadata_DecodeQuasiUniform() + * + * Read the bitstream following the encoding scheme of EncodeQuasiUniform + *------------------------------------------------------------------------*/ + +/*! r: Value read from the bitstream */ +static uint16_t ivas_qmetadata_DecodeQuasiUniform( + const uint16_t *bitstream, /* i : pointer to the bitstream to read */ + int16_t *index, /* i : position in the bitstream to start reading (gets updated with reading) */ + const uint16_t alphabet_size /* i : size of the alphabet, used to calculate the number of bits needed */ +) +{ + int16_t i, bits; + uint16_t tresh, value; + + + bits = 30 - norm_l( alphabet_size ); /* bits = floor(log2(alphabet_size)) */ + tresh = ( 1U << ( bits + 1 ) ) - alphabet_size; + + value = 0; + for ( i = 0; i < bits; i++ ) + { + value = ( value << 1 ) + bitstream[( *index )--]; + } + + if ( value >= tresh ) + { + value = ( value << 1 ) - tresh + bitstream[( *index )--]; + } + + return value; +} + + +/*------------------------------------------------------------------------- + * ivas_qmetadata_DecodeExtendedGR() + * + * Reads the bitstream and decodes the value using the ExtendedGR algorithm + *------------------------------------------------------------------------*/ + +/*! r: Value decoded from the bitstream */ +int16_t ivas_qmetadata_DecodeExtendedGR( + uint16_t *bitstream, /* i : pointer to the bitstream to read */ + int16_t *index, /* i/o: position in the bitstream to start reading (gets updated with reading) */ + const int16_t alph_size, /* i : size of the alphabet, used to calculate the number of bits needed */ + const int16_t gr_param /* i : GR parameter that indicates the limit for the most significant bits (msb) */ +) +{ + int16_t i, msb_size; + uint16_t value; + int16_t msb, lsb; + + msb_size = ( alph_size + ( 1 << gr_param ) - 1 ) >> gr_param; /* ceil division */ + if ( msb_size <= 3 ) + { + value = ivas_qmetadata_DecodeQuasiUniform( bitstream, index, alph_size ); + } + else + { + msb = 0; + while ( ( msb < msb_size - 1 ) && ( bitstream[*index] != 0 ) ) + { + msb++; + ( *index )--; + } + + if ( msb == msb_size - 1 ) + { + lsb = ivas_qmetadata_DecodeQuasiUniform( bitstream, index, alph_size - ( ( msb_size - 1 ) << gr_param ) ); + } + else + { + ( *index )--; + lsb = 0; + for ( i = 0; i < gr_param; i++ ) + { + lsb = ( lsb << 1 ) + bitstream[( *index )--]; + } + } + + value = ( msb << gr_param ) + lsb; + } + + return value; +} + + +/*------------------------------------------------------------------------- + * ivas_qmetadata_ReorderElevationDecoded() + * + * Calculates the correct elevation index from the decoded data + *------------------------------------------------------------------------*/ + +/*! r: Elevation index as it will be read by the dequantizer */ +static int16_t ivas_qmetadata_ReorderElevationDecoded( + const int16_t elev_dist, /* i : Distance to the average extracted from the bitstream */ + const int16_t elev_avg, /* i : Average value over time-blocks extracted from the bitstream */ + const int16_t elev_alph /* i : elevation alphabet */ +) +{ + int16_t dist_reorder; + int16_t elev_index_reorder; + + dist_reorder = ivas_qmetadata_dereorder_generic( elev_dist ); + elev_index_reorder = elev_avg + dist_reorder; + + if ( elev_index_reorder < 0 ) + { + elev_index_reorder += elev_alph; + } + else if ( elev_index_reorder >= elev_alph ) + { + elev_index_reorder -= elev_alph; + } + + return elev_index_reorder; +} + + +/*-----------------------------------------------------------------------* + * Local functions: requentizeEC3 + *-----------------------------------------------------------------------*/ + +/*! r: number of bits read */ +static int16_t read_directions( + IVAS_QDIRECTION *q_direction, /* i/o: quantized direction structure */ + const uint8_t coding_subbands, /* i : number of directions */ + const uint8_t masa_subframes, /* i : number of tiles */ + uint16_t *bitstream, /* i : bitstream to be read */ + int16_t *pbit_pos, + int16_t *ind_order ) +{ + int16_t j, k, allowed_bits, last_j, nbits, fixed_rate; + int16_t i; + int16_t diff; + uint16_t byteBuffer; + int16_t use_vq, max_nb_idx; + int16_t bit_pos; + int16_t *bits_dir0; + + bit_pos = *pbit_pos; + + diff = 0; + if ( q_direction->not_in_2D ) + { + if ( coding_subbands > 1 ) + { + j = ind_order[coding_subbands - 1]; + allowed_bits = 0; + + for ( k = 0; k < masa_subframes; k++ ) + { + allowed_bits += q_direction->band_data[j].bits_sph_idx[k]; + } + + last_j = j - ( allowed_bits == 0 ); + + for ( j = 0; j < last_j; j++ ) + { + i = ind_order[j]; + bits_dir0 = (int16_t *) q_direction->band_data[i].bits_sph_idx; + + nbits = 0; + allowed_bits = sum_s( bits_dir0, q_direction->cfg.nblocks ); + use_vq = 0; + max_nb_idx = 0; + + for ( k = 0; k < q_direction->cfg.nblocks; k++ ) + { + if ( bits_dir0[k] > use_vq ) + { + use_vq = bits_dir0[k]; + max_nb_idx = k; + } + } + + if ( q_direction->cfg.nblocks == 1 ) + { + byteBuffer = 0; + } + else + { + byteBuffer = 0; + if ( use_vq <= 1 ) + { + byteBuffer = 1; + } + if ( use_vq > 1 && use_vq <= LIMIT_USE_COMMON ) + { + bits_dir0[max_nb_idx] -= 1; + allowed_bits -= 1; + /* read 1 bit to tell if joint of VQ coding */ + byteBuffer = bitstream[bit_pos--]; + } + } + + for ( k = 0; k < masa_subframes; k++ ) + { + q_direction->band_data[i].bits_sph_idx[k] = bits_dir0[k]; + if ( bits_dir0[k] > 2 ) + { + if ( q_direction->cfg.mc_ls_setup != MC_LS_SETUP_INVALID ) + { + q_direction->band_data[i].elevation_m_alphabet[k] = no_theta_masa[bits_dir0[k] - 3]; + } + else + { + q_direction->band_data[i].elevation_m_alphabet[k] = no_theta_masa[bits_dir0[k] - 3] * 2 - 1; + } + } + else + { + q_direction->band_data[i].elevation_m_alphabet[k] = 1; + } + } + + if ( allowed_bits > 0 ) + { + if ( byteBuffer == 1 ) + { + nbits = read_common_direction( bitstream, q_direction, i, masa_subframes, allowed_bits, &bit_pos ); + } + else + { + if ( q_direction->cfg.nblocks == 1 && q_direction->band_data[i].bits_sph_idx[0] <= MASA_MIN_BITS_TF + 1 ) + { + /* there is fixed rate only, no need to read */ + fixed_rate = 1; + nbits = 0; + } + else + { + /* check if fixed_rate */ + fixed_rate = bitstream[bit_pos--]; + nbits = 1; + } + + if ( fixed_rate == 1 ) + { + /* decode_fixed_rate()*/ + nbits += decode_fixed_rate( q_direction, bitstream, &bit_pos, i, masa_subframes ); + } + else + { + /* decode elevation */ + nbits += decode_elevation( q_direction, bitstream, &bit_pos, i, masa_subframes ); + + /* decode azimuth */ + nbits += decode_azimuth( q_direction, bitstream, &bit_pos, i, masa_subframes ); + } + } + } + else + { + set_zero_direction( q_direction, i, masa_subframes ); + } + diff += nbits - allowed_bits; + + /* update bits for next block */ + update_bits_next_block( q_direction, &diff, ind_order[j + 1], coding_subbands, masa_subframes ); + } + } + else + { + last_j = q_direction->cfg.start_band; + } + + + for ( j = last_j; j < coding_subbands; j++ ) + { + i = ind_order[j]; + bits_dir0 = (int16_t *) q_direction->band_data[i].bits_sph_idx; + + nbits = 0; + allowed_bits = sum_s( bits_dir0, q_direction->cfg.nblocks ); + if ( allowed_bits > 0 && masa_subframes == 1 ) + { + nbits += decode_fixed_rate( q_direction, bitstream, &bit_pos, i, masa_subframes ); + } + else + { + if ( allowed_bits > 0 ) + { + use_vq = 0; + max_nb_idx = 0; + for ( k = 0; k < masa_subframes; k++ ) + { + if ( bits_dir0[k] > use_vq ) + { + use_vq = bits_dir0[k]; + max_nb_idx = k; + } + } + + byteBuffer = 0; + + if ( use_vq > 1 && use_vq <= LIMIT_USE_COMMON ) + { + bits_dir0[max_nb_idx] -= 1; + allowed_bits -= 1; + + /* read 1 bit to tell if joint of VQ coding */ + byteBuffer = bitstream[bit_pos--]; + } + + if ( allowed_bits > 0 ) + { + if ( byteBuffer == 1 || use_vq <= 1 ) + { + nbits = read_common_direction( bitstream, q_direction, i, masa_subframes, allowed_bits, &bit_pos ); + } + else + { + /* decode_fixed_rate()*/ + nbits += decode_fixed_rate( q_direction, bitstream, &bit_pos, i, masa_subframes ); + } + } + else + { + set_zero_direction( q_direction, i, masa_subframes ); + } + } + else + { + set_zero_direction( q_direction, i, masa_subframes ); + } + } + } + } + else + { + /* 2D */ + for ( j = 0; j < coding_subbands; j++ ) + { + for ( k = 0; k < q_direction->cfg.nblocks; k++ ) + { + q_direction->band_data[j].elevation[k] = 0; + q_direction->band_data[j].elevation_index[k] = 0; + } + } + nbits = decode_azimuth2D( q_direction, bitstream, coding_subbands, &bit_pos, masa_subframes ); + } + nbits = *pbit_pos - bit_pos; + *pbit_pos = bit_pos; + + return nbits; +} + + +/*-------------------------------------------------------------------* + * decode_azimuth() + * + * read and decode the azimuth indexes for one subband + *-------------------------------------------------------------------*/ + +/*! r: number of bits read */ +static int16_t decode_azimuth( + IVAS_QDIRECTION *q_direction, /* i/o: quantized metadata structure */ + uint16_t *bitstream, /* i : bitstream to be read */ + int16_t *pbit_pos, /* i/o: current position in bitstream */ + const int16_t idx_subband, /* i : subband index */ + const int16_t masa_subframes /* i : number of tiles */ +) +{ + int16_t bit_pos, nbits, k; + uint16_t use_context, byteBuffer; + uint16_t min_idx; + int16_t j_az, max_val; + + nbits = 0; + bit_pos = *pbit_pos; + byteBuffer = 0; + + j_az = 0; + /* check number of valid indexes to decode */ + for ( k = 0; k < masa_subframes; k++ ) + { + if ( q_direction->band_data[idx_subband].azimuth_index[k] < MASA_NO_INDEX ) + { + j_az++; + } + else + { + q_direction->band_data[idx_subband].azimuth[k] = 0.f; /*To be in sync with encoder values.*/ + } + } + + if ( j_az == 0 ) + { + return nbits; + } + + if ( byteBuffer == 0 ) + { + /* use context */ + use_context = 0; + for ( k = 0; k < masa_subframes; k++ ) + { + if ( q_direction->band_data[idx_subband].bits_sph_idx[k] <= 1 ) + { + use_context = 1; + } + } + + if ( use_context == 1 ) + { + for ( k = 0; k < masa_subframes; k++ ) + { + if ( q_direction->band_data[idx_subband].bits_sph_idx[k] == 0 ) + { + q_direction->band_data[idx_subband].azimuth_index[k] = 0; + q_direction->band_data[idx_subband].azimuth[k] = 0; + } + else + { + if ( q_direction->band_data[idx_subband].bits_sph_idx[k] == 1 ) + { + byteBuffer = bitstream[bit_pos--]; + q_direction->band_data[idx_subband].azimuth_index[k] = byteBuffer; + + q_direction->band_data[idx_subband].azimuth[k] = q_direction->band_data[idx_subband].azimuth_index[k] * ( -180.f ); + } + else + { + q_direction->band_data[idx_subband].azimuth_index[k] = ivas_qmetadata_DecodeExtendedGR( bitstream, &bit_pos, q_direction->band_data[idx_subband].azimuth_m_alphabet[k], MASA_GR_ORD_AZ - ( q_direction->band_data[idx_subband].bits_sph_idx[k] == 2 ) ); + + q_direction->band_data[idx_subband].azimuth[k] = deindex_azimuth( q_direction->band_data[idx_subband].azimuth_index[k], q_direction->band_data[idx_subband].bits_sph_idx[k], q_direction->band_data[idx_subband].elevation_index[k], 1, q_direction->cfg.mc_ls_setup ); + } + } + } + } + else + { + /* read bit to check if min removed encoding */ + byteBuffer = bitstream[bit_pos--]; + if ( byteBuffer == 0 ) /* regular GR coding5 */ + { + /* read GR_order */ + byteBuffer = bitstream[bit_pos--]; + nbits += 1; + + for ( k = 0; k < masa_subframes; k++ ) + { + if ( q_direction->band_data[idx_subband].bits_sph_idx[k] > 0 ) + { + if ( no_phi_masa[q_direction->band_data[idx_subband].bits_sph_idx[k] - 1][q_direction->band_data[idx_subband].elevation_index[k]] > 1 ) + { + q_direction->band_data[idx_subband].azimuth_index[k] = ivas_qmetadata_DecodeExtendedGR( bitstream, &bit_pos, q_direction->band_data[idx_subband].azimuth_m_alphabet[k], MASA_GR_ORD_AZ - byteBuffer ); + q_direction->band_data[idx_subband].azimuth[k] = deindex_azimuth( q_direction->band_data[idx_subband].azimuth_index[k], q_direction->band_data[idx_subband].bits_sph_idx[k], q_direction->band_data[idx_subband].elevation_index[k], 1, q_direction->cfg.mc_ls_setup ); + } + else + { + q_direction->band_data[idx_subband].azimuth[k] = 0; + q_direction->band_data[idx_subband].azimuth_index[k] = 0; + } + } + else + { + q_direction->band_data[idx_subband].azimuth[k] = 0; + q_direction->band_data[idx_subband].azimuth_index[k] = 0; + } + } + } + else + { + /* min removed GR coding */ + /* read GR_order */ + byteBuffer = bitstream[bit_pos--]; + /* read min index value */ + maximum_s( q_direction->band_data[idx_subband].azimuth_m_alphabet, masa_subframes, &max_val ); + min_idx = ivas_qmetadata_DecodeExtendedGR( bitstream, &bit_pos, max_val, MASA_GR_ORD_AZ ); + + for ( k = 0; k < masa_subframes; k++ ) + { + if ( q_direction->band_data[idx_subband].bits_sph_idx[k] > 0 ) + { + if ( no_phi_masa[q_direction->band_data[idx_subband].bits_sph_idx[k] - 1][q_direction->band_data[idx_subband].elevation_index[k]] > 1 ) + { + q_direction->band_data[idx_subband].azimuth_index[k] = ivas_qmetadata_DecodeExtendedGR( bitstream, &bit_pos, q_direction->band_data[idx_subband].azimuth_m_alphabet[k], MASA_GR_ORD_AZ - 1 - byteBuffer ); + q_direction->band_data[idx_subband].azimuth_index[k] += min_idx; + q_direction->band_data[idx_subband].azimuth[k] = deindex_azimuth( q_direction->band_data[idx_subband].azimuth_index[k], q_direction->band_data[idx_subband].bits_sph_idx[k], q_direction->band_data[idx_subband].elevation_index[k], 1, q_direction->cfg.mc_ls_setup ); + } + else + { + q_direction->band_data[idx_subband].azimuth[k] = 0; + q_direction->band_data[idx_subband].azimuth_index[k] = 0; + } + } + else + { + q_direction->band_data[idx_subband].azimuth[k] = 0; + q_direction->band_data[idx_subband].azimuth_index[k] = 0; + } + } + } + } + } + + nbits = *pbit_pos - bit_pos; + + *pbit_pos = bit_pos; + + return nbits; +} + + +/*-------------------------------------------------------------------* + * decode_elevation() + * + * Reads the bitstream and decode the elevation index + *-------------------------------------------------------------------*/ + +/*! r: number of bits read */ +static int16_t decode_elevation( + IVAS_QDIRECTION *q_direction, /* i/o: quantized metadata structure */ + uint16_t *bitstream, /* i : input bitstream */ + int16_t *pbit_pos, /* i/o: current position to be read in bitstream*/ + const int16_t j, /* i : subband index */ + const int16_t masa_subframes /* i : number of tiles */ +) +{ + int16_t nr_NO_INDEX, nbits; + int16_t bit_pos; + uint16_t byteBuffer; + int16_t k, GR_ord_elevation; + uint16_t same_idx; + + nr_NO_INDEX = 0; + nbits = 0; + bit_pos = *pbit_pos; + + for ( k = 0; k < masa_subframes; k++ ) + { + q_direction->band_data[j].elevation_index[k] = 0; + q_direction->band_data[j].elevation[k] = 0; + + if ( q_direction->band_data[j].bits_sph_idx[k] > 0 ) + { + if ( q_direction->band_data[j].bits_sph_idx[k] <= 2 ) + { + q_direction->band_data[j].elevation_index[k] = MASA_NO_INDEX; + nr_NO_INDEX += 1; + q_direction->band_data[j].elevation[k] = 0; + q_direction->band_data[j].elevation_m_alphabet[k] = 1; + } + else + { + if ( q_direction->cfg.mc_ls_setup != MC_LS_SETUP_INVALID ) + { + q_direction->band_data[j].elevation_m_alphabet[k] = no_theta_masa[q_direction->band_data[j].bits_sph_idx[k] - 3]; + } + else + { + q_direction->band_data[j].elevation_m_alphabet[k] = no_theta_masa[q_direction->band_data[j].bits_sph_idx[k] - 3] * 2 - 1; + } + } + } + else + { + nr_NO_INDEX++; + } + } + + if ( nr_NO_INDEX < masa_subframes ) + { + { + /* read if same or not */ + byteBuffer = bitstream[bit_pos--]; + if ( byteBuffer == 1 ) /* same value */ + { + /* read value */ + byteBuffer = bitstream[bit_pos--]; + byteBuffer = ( byteBuffer << 1 ) + bitstream[bit_pos--]; + same_idx = byteBuffer; + + for ( k = 0; k < masa_subframes; k++ ) + { + if ( q_direction->band_data[j].elevation_index[k] < MASA_NO_INDEX ) + { + q_direction->band_data[j].elevation_index[k] = same_idx; + q_direction->band_data[j].elevation[k] = deindex_elevation( &q_direction->band_data[j].elevation_index[k], q_direction->band_data[j].bits_sph_idx[k], q_direction->cfg.mc_ls_setup ); + } + } + } + else + { + /* not same; decode mean removed GR */ + byteBuffer = bitstream[bit_pos--]; + GR_ord_elevation = MASA_GR_ORD_EL - byteBuffer; + + for ( k = 0; k < masa_subframes; k++ ) + { + if ( q_direction->band_data[j].elevation_index[k] < MASA_NO_INDEX ) + { + q_direction->band_data[j].elevation_index[k] = ivas_qmetadata_DecodeExtendedGR( bitstream, &bit_pos, q_direction->band_data[j].elevation_m_alphabet[k], GR_ord_elevation ); + q_direction->band_data[j].elevation[k] = deindex_elevation( &q_direction->band_data[j].elevation_index[k], q_direction->band_data[j].bits_sph_idx[k], q_direction->cfg.mc_ls_setup ); + } + } + } + } + } + + for ( k = 0; k < masa_subframes; k++ ) + { + if ( ( q_direction->band_data[j].elevation_index[k] < MASA_NO_INDEX ) && + ( no_phi_masa[q_direction->band_data[j].bits_sph_idx[k] - 1][q_direction->band_data[j].elevation_index[k]] <= 1 ) ) + { + q_direction->band_data[j].azimuth_index[k] = MASA_NO_INDEX; + q_direction->band_data[j].azimuth_m_alphabet[k] = 1; + } + else + { + q_direction->band_data[j].azimuth_index[k] = 0; + if ( q_direction->band_data[j].elevation_index[k] < MASA_NO_INDEX ) + { + q_direction->band_data[j].azimuth_m_alphabet[k] = no_phi_masa[q_direction->band_data[j].bits_sph_idx[k] - 1][q_direction->band_data[j].elevation_index[k]]; + } + else + { + q_direction->band_data[j].azimuth_m_alphabet[k] = no_phi_masa[q_direction->band_data[j].bits_sph_idx[k] - 1][0]; + q_direction->band_data[j].elevation_index[k] = 0; + } + } + } + + nbits = *pbit_pos - bit_pos; + *pbit_pos = bit_pos; + + return nbits; +} + + +/*---------------------------------------------------------------- + * decode_fixed_rate() + * + * decoding in fixed rate case, i.e. when using the spherical indexes + *-----------------------------------------------------------------*/ + +/*! r: number of bits read */ +static int16_t decode_fixed_rate( + IVAS_QDIRECTION *q_direction, /* i/o: quantized metadata */ + const uint16_t *bitstream, /* i : bitstream to be read */ + int16_t *pbit_pos, /* i/o: position in bitstream */ + const int16_t b, /* i : subband index */ + const int16_t nblocks /* i : number of tiles in subband */ +) +{ + int16_t nbits, m, i; + uint16_t value; + + nbits = 0; + + for ( m = 0; m < nblocks; m++ ) + { + value = 0; + for ( i = 0; i < q_direction->band_data[b].bits_sph_idx[m]; i++ ) + { + value = ( value << 1 ) + bitstream[( *pbit_pos )--]; + } + + q_direction->band_data[b].spherical_index[m] = value; + nbits += q_direction->band_data[b].bits_sph_idx[m]; + + deindex_spherical_component( q_direction->band_data[b].spherical_index[m], &q_direction->band_data[b].azimuth[m], &q_direction->band_data[b].elevation[m], &q_direction->band_data[b].azimuth_index[m], &q_direction->band_data[b].elevation_index[m], q_direction->band_data[b].bits_sph_idx[m], q_direction->cfg.mc_ls_setup ); + } + + return nbits; +} + + +/*-------------------------------------------------------------------* + * decode_azimuth2D() + * + * Azimuth bitstream reading and decoding in 2D case + *-------------------------------------------------------------------*/ + +/*! r: number of bits read */ +static int16_t decode_azimuth2D( + IVAS_QDIRECTION *q_direction, /* i/o: quantized metadata structure */ + uint16_t *bitstream, /* i : bitstream to be read */ + const int16_t coding_subbands, /* i : number of subbands */ + int16_t *pbit_pos, + const int16_t no_frames ) +{ + int16_t i, j, k; + int16_t allowed_bits, nbits; + int16_t use_vq; + uint16_t Buffer; + int16_t bit_pos; + int16_t *bits_dir0; + + bit_pos = *pbit_pos; + nbits = 0; + for ( j = 0; j < coding_subbands; j++ ) + { + bits_dir0 = (int16_t *) q_direction->band_data[j].bits_sph_idx; + allowed_bits = sum_s( bits_dir0, no_frames ); + + if ( allowed_bits > 0 ) + { + use_vq = 0; + for ( k = 0; k < no_frames; k++ ) + { + q_direction->band_data[j].elevation[k] = 0; + q_direction->band_data[j].elevation_index[k] = 0; + + if ( bits_dir0[k] > use_vq ) + { + use_vq = bits_dir0[k]; + } + } + + if ( use_vq <= 3 && allowed_bits <= 11 ) + { + if ( allowed_bits <= no_frames + 1 ) + { + set_f( q_direction->band_data[j].azimuth, 0.0f, no_frames ); + for ( k = 0; k < min( allowed_bits, no_frames ); k++ ) + { + q_direction->band_data[j].azimuth[k] = ( -180.f ) * bitstream[bit_pos--]; + nbits += 1; + } + } + else + { + nbits += read_truncGR_azimuth( bitstream, q_direction, j, no_frames, &bit_pos ); + } + } + else + { + for ( k = 0; k < no_frames; k++ ) + { + Buffer = 0; + for ( i = 0; i < bits_dir0[k]; i++ ) + { + Buffer = ( Buffer << 1 ) + bitstream[bit_pos--]; + } + + nbits += bits_dir0[k]; + + if ( q_direction->cfg.mc_ls_setup != MC_LS_SETUP_INVALID ) + { + q_direction->band_data[j].azimuth[k] = 360.0f / (float) ( 1 << bits_dir0[k] ) * Buffer - 180; + q_direction->band_data[j].azimuth[k] = companding_azimuth( q_direction->band_data[j].azimuth[k], q_direction->cfg.mc_ls_setup, + ( q_direction->band_data[j].elevation[k] > MC_MASA_THR_ELEVATION ), -1 ); + } + else + { + q_direction->band_data[j].azimuth[k] = 360.0f / (float) ( 1 << bits_dir0[k] ) * Buffer - 180; + } + } + } + } + else + { + set_zero_direction( q_direction, j, no_frames ); + } + } + *pbit_pos = bit_pos; + + return nbits; +} + + +/*-------------------------------------------------------------------* + * set_zero_direction() + * + * + *-------------------------------------------------------------------*/ + +static void set_zero_direction( + IVAS_QDIRECTION *q_direction, + const int16_t idx_band, + const int16_t len ) +{ + int16_t k; + + for ( k = 0; k < len; k++ ) + { + q_direction->band_data[idx_band].azimuth[k] = 0; + q_direction->band_data[idx_band].azimuth_index[k] = 0; + q_direction->band_data[idx_band].elevation[k] = 0; + q_direction->band_data[idx_band].elevation_index[k] = 0; + q_direction->band_data[idx_band].spherical_index[k] = 0; + } + + return; +} + + +/*-------------------------------------------------------------------* + * read_truncGR_azimuth() + * + * + *-------------------------------------------------------------------*/ + +static int16_t read_truncGR_azimuth( + uint16_t *bitstream, /* i : bitstream to be read */ + IVAS_QDIRECTION *q_direction, /* i/o: quantized metadata structure */ + const int16_t j, /* i : subband index */ + const int16_t no_subframes, /* i : number of tiles */ + int16_t *pbit_pos /* i/o: position in bitstream */ +) +{ + int16_t i; + int16_t nbits; + uint16_t idx; + int16_t no_symb, allowed_bits; + + allowed_bits = sum_s( (int16_t *) q_direction->band_data[j].bits_sph_idx, no_subframes ); + nbits = 0; + if ( allowed_bits <= no_subframes + 1 ) + { + for ( i = 0; i < min( allowed_bits, no_subframes ); i++ ) + { + if ( bitstream[( *pbit_pos )--] == 0 ) + { + q_direction->band_data[j].azimuth[i] = 0.0f; + } + else + { + q_direction->band_data[j].azimuth[i] = -180; + } + nbits++; + } + + return nbits; + } + + if ( q_direction->cfg.mc_ls_setup != MC_LS_SETUP_INVALID ) + { + no_symb = 9; + } + else + { + no_symb = 8; + } + nbits = 0; + + nbits = *pbit_pos; + + for ( i = 0; i < no_subframes; i++ ) + { + idx = ivas_qmetadata_DecodeExtendedGR( bitstream, pbit_pos, no_symb, 0 ); + q_direction->band_data[j].azimuth_index[i] = idx; + if ( q_direction->cfg.mc_ls_setup != MC_LS_SETUP_INVALID ) + { + q_direction->band_data[j].azimuth[i] = cb_azi_chan[( idx + 1 ) >> 1]; + if ( idx % 2 > 0 ) + { + q_direction->band_data[j].azimuth[i] = -q_direction->band_data[j].azimuth[i]; + } + } + else + { + q_direction->band_data[j].azimuth[i] = azimuth_cb[idx]; + } + } + + nbits -= *pbit_pos; + + return nbits; +} + + +/*-------------------------------------------------------------------* + * read_common_direction() + * + * + *-------------------------------------------------------------------*/ + +/*! r: number of bits read */ +static int16_t read_common_direction( + uint16_t *bitstream, /* i : bitstream to be read */ + IVAS_QDIRECTION *q_direction, /* i/o: quantized direction structure */ + const int16_t j, /* i : subband index */ + const int16_t no_subframes, /* i : number of tiles */ + const int16_t bits_total, /* i : number of bits for subband directional data */ + int16_t *pbit_pos /* i/o: position in bitstream */ +) +{ + int16_t nbits; + int16_t bit_pos; + int16_t i; + uint16_t byteBuffer; + int16_t bits_el; + + bit_pos = *pbit_pos; + nbits = 0; + + set_zero_direction( q_direction, j, no_subframes ); + if ( bits_total == 0 ) + { + return nbits; + } + + if ( bits_total <= no_subframes + 1 ) + { + for ( i = 0; i < min( no_subframes, bits_total ); i++ ) + { + byteBuffer = bitstream[bit_pos--]; + /*qdirection->azimuth_index[j][i] = (uint16_t)byteBuffer; */ + q_direction->band_data[j].azimuth[i] = azimuth_cb[byteBuffer]; + nbits += 1; + } + *pbit_pos = bit_pos; + + /*nbits += read_truncGR_azimuth(bitstream, qdirection, j, no_subframes, pbit_pos); */ + return nbits; + } + + + byteBuffer = bitstream[bit_pos--]; + bits_el = 1; + nbits += 1; + /* elevation is already set to 0*/ + if ( byteBuffer == 1 ) + { + byteBuffer = bitstream[bit_pos--]; + bits_el += 1; + nbits += 1; + if ( byteBuffer == 0 ) + { + for ( i = 0; i < no_subframes; i++ ) + { + q_direction->band_data[j].elevation[i] = delta_theta_masa[2]; + } + } + else + { + byteBuffer = bitstream[bit_pos--]; + bits_el += 1; + nbits += 1; + if ( byteBuffer == 0 ) + { + for ( i = 0; i < no_subframes; i++ ) + { + q_direction->band_data[j].elevation[i] = -delta_theta_masa[2]; + } + } + else + { + /* theta is +/- 90; no azimuth is read */ + byteBuffer = bitstream[bit_pos--]; + nbits += 1; + if ( byteBuffer == 0 ) + { + set_f( q_direction->band_data[j].elevation, 90.0f, no_subframes ); + set_f( q_direction->band_data[j].azimuth, 0.0f, no_subframes ); + } + else + { + set_f( q_direction->band_data[j].elevation, -90.0f, no_subframes ); + set_f( q_direction->band_data[j].azimuth, 0.0f, no_subframes ); + } + *pbit_pos = bit_pos; + + return nbits; + } + } + } + + bits_el = sum_s( (int16_t *) q_direction->band_data[j].bits_sph_idx, no_subframes ) - bits_el; + + if ( bits_el <= no_subframes + 1 ) + { + nbits += min( no_subframes, bits_el ); + for ( i = 0; i < min( no_subframes, bits_el ); i++ ) + { + byteBuffer = bitstream[bit_pos--]; + /*qdirection->azimuth_index[j][i] = (uint16_t) byteBuffer; */ + q_direction->band_data[j].azimuth[i] = azimuth_cb[byteBuffer]; + } + } + else + { + nbits += read_truncGR_azimuth( bitstream, q_direction, j, no_subframes, &bit_pos ); + } + + *pbit_pos = bit_pos; + + return nbits; +} + + +/*-----------------------------------------------------------------------* + * Local functions: coherence + *-----------------------------------------------------------------------*/ + +static void decode_spread_coherence( + IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: quantized metadata structure */ + int16_t idx_d, /* i : direction index */ + const int16_t no_frames, /* i : number of time subframes */ + const int16_t hrmasa_flag /* i : flag indicating high-rate MASA MD coding */ +) +{ + int16_t i, j; + float var_azi; + int16_t idx_sub_cb; + float dct_coh[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES]; + int16_t MASA_grouping[MASA_MAXIMUM_CODING_SUBBANDS]; + IVAS_QDIRECTION *q_direction; + int16_t coding_subbands, coding_subbands_0, d, two_dir_band[MASA_MAXIMUM_CODING_SUBBANDS]; + int16_t min_index; + + coding_subbands_0 = hQMetaData->q_direction[0].cfg.nbands; + coding_subbands = hQMetaData->q_direction[idx_d].cfg.nbands; + if ( coding_subbands_0 <= 5 ) + { + for ( j = 0; j < 5; j++ ) + { + MASA_grouping[j] = j; + } + } + else + { + if ( coding_subbands_0 <= 8 ) + { + mvs2s( MASA_grouping_8_to_5, MASA_grouping, 8 ); + } + else if ( coding_subbands_0 <= 12 ) + { + mvs2s( MASA_grouping_12_to_5, MASA_grouping, 12 ); + } + else if ( coding_subbands_0 <= 18 ) + { + mvs2s( MASA_grouping_18_to_5, MASA_grouping, 18 ); + } + else + { + if ( coding_subbands_0 <= 24 ) + { + mvs2s( MASA_grouping_24_to_5, MASA_grouping, 24 ); + } + } + } + + if ( coding_subbands < coding_subbands_0 ) + { + d = 0; + for ( j = 0; j < coding_subbands_0; j++ ) + { + if ( hQMetaData->twoDirBands[j] == 1 ) + { + two_dir_band[d++] = j; + } + } + } + else + { + set_s( two_dir_band, 0, coding_subbands ); + } + + q_direction = &hQMetaData->q_direction[idx_d]; + + for ( i = 0; i < coding_subbands; i++ ) + { + var_azi = var( q_direction->band_data[i].azimuth, no_frames ); + + if ( hrmasa_flag ) + { + minimum_s( (int16_t *) ( q_direction->band_data[i].energy_ratio_index ), q_direction->cfg.nblocks, &min_index ); + min_index = min_index >> 1; + } + else + { + min_index = q_direction->band_data[i].energy_ratio_index[0]; + } + + if ( var_azi < MASA_DELTA_AZI_DCT0 ) + { + idx_sub_cb = MASA_NO_CV_COH * min_index; + } + else + { + idx_sub_cb = MASA_NO_CV_COH * ( min_index + DIRAC_DIFFUSE_LEVELS ); /* NO_CV_COH = 8 */ + } + + dct_coh[i][0] = coherence_cb0_masa[idx_sub_cb + q_direction->coherence_band_data[i].spread_coherence_dct0_index]; + + if ( coding_subbands < coding_subbands_0 ) + { + assert( idx_d == 1 ); + dct_coh[i][1] = coherence_cb1_masa[MASA_grouping[two_dir_band[i]] * MASA_NO_CV_COH1 + q_direction->coherence_band_data[i].spread_coherence_dct1_index]; + } + else + { + dct_coh[i][1] = coherence_cb1_masa[MASA_grouping[i] * MASA_NO_CV_COH1 + q_direction->coherence_band_data[i].spread_coherence_dct1_index]; + } + + for ( j = 2; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++ ) + { + dct_coh[i][j] = 0; + } + + invdct4_transform( dct_coh[i], q_direction->coherence_band_data[i].spread_coherence ); + } + + return; +} + + +/*-------------------------------------------------------------------* + * read_huf() + * + * Read Hufman code + *-------------------------------------------------------------------*/ + +/*! r: number of bits read */ +static ivas_error read_huf( + int16_t *num_bits_read, + const uint16_t *bitstream, /* i : bitstream to be read */ + uint16_t *out, /* o : decoded value */ + const int16_t start_pos, /* i : starting position for reading */ + const int16_t len, /* i : number of codewords */ + const int16_t *huff_code, /* i : Huffman table */ + const int16_t max_len /* i : maximum codeword length */ +) +{ + int16_t done = 0, end_pos; + uint16_t ByteBuffer; + int16_t nbits, val; + uint16_t i; + + end_pos = start_pos; + nbits = 0; + val = 0; + while ( ( done == 0 ) && ( nbits < max_len ) ) + { + ByteBuffer = bitstream[end_pos--]; + val = val * 2 + ( ByteBuffer & 1 ); + nbits += 1; + for ( i = 0; i < len; i++ ) + { + if ( val == huff_code[i] ) + { + *out = i; + done = 1; + break; + } + } + } + + *num_bits_read = end_pos; + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * read_GR_min_removed_data() + * + * + *-------------------------------------------------------------------*/ + +static int16_t read_GR_min_removed_data( + uint16_t *bitstream, /* i : bitstream */ + int16_t *p_bit_pos, /* i : position in the bitstream */ + const int16_t *no_cv_vec, + const int16_t no_data, + int16_t *decoded_idx, + const int16_t no_symb ) +{ + int16_t j; + int16_t bit_pos; + int16_t nbits, bits_GR; + uint16_t byteBuffer; + int16_t min_index; + + bit_pos = *p_bit_pos; + + /* read GR order */ + byteBuffer = bitstream[bit_pos--]; + nbits = 1; + + /* read min index */ + bits_GR = bit_pos; + min_index = ivas_qmetadata_DecodeExtendedGR( bitstream, &bit_pos, no_symb, 0 ); + nbits += bits_GR - bit_pos; + + /* read GR data */ + for ( j = 0; j < no_data; j++ ) + { + bits_GR = bit_pos; + if ( no_cv_vec[j] > 1 ) + { + decoded_idx[j] = ivas_qmetadata_DecodeExtendedGR( bitstream, &bit_pos, no_cv_vec[j] - min_index, ( byteBuffer & 1 ) ); + nbits += bits_GR - bit_pos; + } + else + { + decoded_idx[j] = 0; + } + } + + for ( j = 0; j < no_data; j++ ) + { + if ( no_cv_vec[j] > 1 ) + { + decoded_idx[j] += min_index; + } + } + + *p_bit_pos = bit_pos; + + return nbits; +} + + +/*-------------------------------------------------------------------* + * decode_fixed_rate_composed_index_coherence() + * + * + *-------------------------------------------------------------------*/ + +static int16_t decode_fixed_rate_composed_index_coherence( + uint16_t *bitstream, /* i : bitstream */ + int16_t *p_bit_pos, /* i : position in the bitstream */ + const int16_t no_bands, + int16_t *no_cv_vec, + uint16_t *decoded_index, + const int16_t no_symb ) +{ + /* fixed rate */ + uint64_t no_cb; + uint16_t temp_index[MASA_MAXIMUM_CODING_SUBBANDS]; + uint64_t idx_fr; + int16_t no_bits_vec1, half_no_bands; + int16_t bit_pos; + int16_t nbits, bits_GR; + int16_t j; + int16_t no_vals_local; + int16_t no_bits_vec; + + bit_pos = *p_bit_pos; + set_s( (int16_t *) temp_index, 0, MASA_MAXIMUM_CODING_SUBBANDS ); + + no_cb = 1; + nbits = 0; + if ( no_bands > MASA_LIMIT_NO_BANDS_SUR_COH ) + { + /* read 8-max_val with GR0 */ + bits_GR = bit_pos; + no_vals_local = no_symb - ivas_qmetadata_DecodeExtendedGR( bitstream, &bit_pos, no_symb, 0 ); + nbits += bits_GR - bit_pos; + for ( j = 0; j < no_bands; j++ ) + { + if ( no_cv_vec[j] > no_vals_local ) + { + no_cv_vec[j] = no_vals_local; + } + } + } + + half_no_bands = no_bands / 2; + if ( sum_s( no_cv_vec, no_bands ) > MASA_COH_LIMIT_2IDX ) + { + no_cb = 1; + + for ( j = 0; j < half_no_bands; j++ ) + { + no_cb *= no_cv_vec[j]; + } + no_bits_vec = (int16_t) ceilf( logf( (float) no_cb ) * INV_LOG_2 ); + no_cb = 1; + for ( j = half_no_bands; j < no_bands; j++ ) + { + no_cb *= no_cv_vec[j]; + } + no_bits_vec1 = (int16_t) ceilf( logf( (float) no_cb ) * INV_LOG_2 ); + } + else + { + no_cb = 1; + for ( j = 0; j < no_bands; j++ ) + { + no_cb *= no_cv_vec[j]; + } + no_bits_vec = (int16_t) ceilf( logf( (float) no_cb ) * INV_LOG_2 ); + no_bits_vec1 = 0; + } + if ( no_bits_vec1 > 0 ) + { + idx_fr = 0; + for ( j = 0; j < no_bits_vec; j++ ) + { + idx_fr = ( idx_fr << 1 ) + bitstream[bit_pos--]; + } + + nbits += no_bits_vec; + + decode_combined_index( idx_fr, no_cv_vec, temp_index, half_no_bands ); + + idx_fr = 0; + for ( j = 0; j < no_bits_vec1; j++ ) + { + idx_fr = ( idx_fr << 1 ) + bitstream[bit_pos--]; + } + nbits += no_bits_vec1; + decode_combined_index( idx_fr, &no_cv_vec[half_no_bands], &temp_index[half_no_bands], half_no_bands ); + } + else + { + idx_fr = 0; + for ( j = 0; j < no_bits_vec; j++ ) + { + idx_fr = ( idx_fr << 1 ) + bitstream[bit_pos--]; + } + nbits += no_bits_vec; + decode_combined_index( idx_fr, no_cv_vec, temp_index, no_bands ); + } + + for ( j = 0; j < no_bands; j++ ) + { + decoded_index[j] = temp_index[j]; + } + nbits = *p_bit_pos - bit_pos; + + *p_bit_pos = bit_pos; + + return nbits; +} + + +/*-------------------------------------------------------------------* + * read_coherence_data_hr_512() + * + * Read coherence data at HR + *-------------------------------------------------------------------*/ + +/*! r: number of bits read */ +static int16_t read_coherence_data_hr_512( + uint16_t *bitstream, /* i : bitstream */ + int16_t *p_bit_pos, /* i : position in the bitstream */ + IVAS_QMETADATA *hQMetaData, /* i/o: quantized metadata structure */ + const int16_t idx_dir, /* i : direction index */ + const int16_t nbits_coh ) +{ + int16_t j, k, i; + int16_t nbands, nblocks; + int16_t min_index, GR_param; + int16_t cb_size, nbits; + int16_t decoded_idx; + float delta; + + nbands = hQMetaData->q_direction[idx_dir].cfg.nbands; + nblocks = hQMetaData->q_direction[idx_dir].cfg.nblocks; + + cb_size = 1 << nbits_coh; + delta = 256.0f / cb_size; + nbits = *p_bit_pos; + for ( k = 0; k < nblocks; k++ ) + { + /* read method */ + if ( bitstream[( *p_bit_pos )--] == 1 ) + { + /* average removed */ + /* read average index */ + min_index = 0; + for ( i = 0; i < nbits_coh; i++ ) + { + min_index = ( min_index << 1 ) + bitstream[( *p_bit_pos )--]; + } + /* read GR param */ + GR_param = bitstream[( *p_bit_pos )--]; + for ( j = 0; j < nbands; j++ ) + { + decoded_idx = ivas_qmetadata_DecodeExtendedGR( bitstream, p_bit_pos, 2 * cb_size, GR_param ); + if ( decoded_idx % 2 ) + { + decoded_idx = ( ( decoded_idx + 1 ) >> 1 ) + min_index; + } + else + { + decoded_idx = -( decoded_idx >> 1 ) + min_index; + } + hQMetaData->q_direction[idx_dir].coherence_band_data[j].spread_coherence[k] = (uint8_t) ( decoded_idx * delta + delta / 2.0f ); + } + } + else + { + /* read min_index */ + min_index = 0; + for ( i = 0; i < nbits_coh; i++ ) + { + min_index = ( min_index << 1 ) + bitstream[( *p_bit_pos )--]; + } + + /* read GR param */ + GR_param = bitstream[( *p_bit_pos )--]; + for ( j = 0; j < nbands; j++ ) + { + decoded_idx = ivas_qmetadata_DecodeExtendedGR( bitstream, p_bit_pos, cb_size - min_index, GR_param ) + min_index; + hQMetaData->q_direction[idx_dir].coherence_band_data[j].spread_coherence[k] = (uint8_t) ( decoded_idx * delta + delta / 2.0f ); + } + } + } + + nbits = nbits - *p_bit_pos; + + return nbits; +} + + +/*------------------------------------------------------------------- * + * read_coherence_data() + * + * Read coherence data + *------------------------------------------------------------------- */ + +/*! r: number of bits read */ +static int16_t read_coherence_data( + uint16_t *bitstream, /* i : bitstream */ + int16_t *p_bit_pos, /* i : position in the bitstream */ + IVAS_QMETADATA *hQMetaData, /* i/o: quantized metadata structure */ + const int16_t idx_dir, /* i : direction index */ + const int16_t hrmasa_flag /* i : flag indicating high-rate MASA MD coding*/ +) +{ + int16_t j; + int16_t no_cv_vec[MASA_MAXIMUM_CODING_SUBBANDS]; + uint64_t no_cb; + int16_t no_bits_vec, nbits; + int16_t bits_GR; + uint16_t idx_dct1[MASA_MAXIMUM_CODING_SUBBANDS]; + uint16_t av_index; + int16_t no_bits_vec1; + int16_t bit_pos; + IVAS_QDIRECTION *q_direction; + int16_t coding_subbands; + uint64_t dct0_index; + int16_t decoded_idx[MASA_MAXIMUM_CODING_SUBBANDS]; + uint16_t byteBuffer; + int16_t idx_ER; + int16_t min_index; + int16_t extra_cv; + + coding_subbands = hQMetaData->q_direction[idx_dir].cfg.nbands; + extra_cv = (int16_t) ( coding_subbands / MASA_FACTOR_CV_COH ); + q_direction = &( hQMetaData->q_direction[idx_dir] ); + bit_pos = *p_bit_pos; + nbits = 0; + + if ( q_direction->cfg.nblocks == 1 ) + { + for ( j = 0; j < coding_subbands; j++ ) + { + if ( hrmasa_flag ) + { + idx_ER = 7 - ( q_direction->band_data[j].energy_ratio_index_mod[0] >> 1 ) + extra_cv; + } + else + { + idx_ER = 7 - q_direction->band_data[j].energy_ratio_index_mod[0] + extra_cv; + } + no_cv_vec[j] = idx_ER + 1; + } + + if ( sum_s( no_cv_vec, coding_subbands ) == coding_subbands ) + { + for ( j = 0; j < coding_subbands; j++ ) + { + q_direction->coherence_band_data[j].spread_coherence[0] = 0; + } + + return 0; + } + byteBuffer = bitstream[bit_pos--]; + nbits += 1; + + if ( byteBuffer & 1 ) + { + /* decode GR min removed */ + nbits += read_GR_min_removed_data( bitstream, &bit_pos, no_cv_vec, coding_subbands, decoded_idx, MASA_MAX_NO_CV_SUR_COH + extra_cv ); + for ( j = 0; j < coding_subbands; j++ ) + { + if ( no_cv_vec[j] > 1 ) + { + q_direction->coherence_band_data[j].spread_coherence[0] = (uint8_t) roundf( decoded_idx[j] * ( 255.0f / (float) ( 7 - ( q_direction->band_data[j].energy_ratio_index_mod[0] >> ( hrmasa_flag ) ) + coding_subbands / MASA_FACTOR_CV_COH ) ) ); + } + else + { + q_direction->coherence_band_data[j].spread_coherence[0] = 0; + } + } + } + else + { + uint16_t decoded_index[MASA_MAXIMUM_CODING_SUBBANDS]; + /* decode joint index */ + nbits += decode_fixed_rate_composed_index_coherence( bitstream, &bit_pos, coding_subbands, no_cv_vec, decoded_index, MASA_NO_CV_COH + coding_subbands / MASA_FACTOR_CV_COH ); + for ( j = 0; j < coding_subbands; j++ ) + { + if ( no_cv_vec[j] > 1 ) + { + q_direction->coherence_band_data[j].spread_coherence[0] = (uint8_t) roundf( decoded_index[j] * ( 255.0f / (float) ( 7 - ( q_direction->band_data[j].energy_ratio_index_mod[0] >> ( hrmasa_flag ) ) + coding_subbands / MASA_FACTOR_CV_COH ) ) ); + } + else + { + q_direction->coherence_band_data[j].spread_coherence[0] = 0; + } + } + } + } + else + { + for ( j = 0; j < coding_subbands; j++ ) + { + if ( hrmasa_flag ) + { + minimum_s( (int16_t *) ( q_direction->band_data[j].energy_ratio_index ), q_direction->cfg.nblocks, &min_index ); + no_cv_vec[j] = len_cb_dct0_masa[min_index >> 1]; /* spread coherence DCT0*/ + } + else + { + no_cv_vec[j] = len_cb_dct0_masa[q_direction->band_data[j].energy_ratio_index[0]]; /* spread coherence DCT0*/ + } + } + + if ( sum_s( no_cv_vec, coding_subbands ) > MASA_COH_LIMIT_2IDX ) + { + uint16_t spr_coh_temp_index[MASA_MAXIMUM_CODING_SUBBANDS]; + + no_cb = 1; + for ( j = 0; j < coding_subbands / 2; j++ ) + { + no_cb *= no_cv_vec[j]; + } + + no_bits_vec = (int16_t) ceilf( logf( (float) no_cb ) * INV_LOG_2 ); + no_cb = 1; + + for ( j = coding_subbands / 2; j < coding_subbands; j++ ) + { + no_cb *= no_cv_vec[j]; + } + + no_bits_vec1 = (int16_t) ceilf( logf( (float) no_cb ) * INV_LOG_2 ); + dct0_index = 0; + + for ( j = 0; j < no_bits_vec; j++ ) + { + dct0_index = ( dct0_index << 1 ) + bitstream[bit_pos--]; + } + + nbits += no_bits_vec; + set_s( (int16_t *) spr_coh_temp_index, 0, MASA_MAXIMUM_CODING_SUBBANDS ); + + decode_combined_index( dct0_index, no_cv_vec, spr_coh_temp_index, coding_subbands / 2 ); + + dct0_index = 0; + for ( j = 0; j < no_bits_vec1; j++ ) + { + dct0_index = ( dct0_index << 1 ) + bitstream[bit_pos--]; + } + + nbits += no_bits_vec1; + + decode_combined_index( dct0_index, &no_cv_vec[coding_subbands / 2], &spr_coh_temp_index[coding_subbands / 2], coding_subbands / 2 ); + + for ( j = 0; j < coding_subbands; j++ ) + { + q_direction->coherence_band_data[j].spread_coherence_dct0_index = spr_coh_temp_index[j]; + } + } + else + { + /* spread coherence */ + uint16_t spr_coh_temp_index[MASA_MAXIMUM_CODING_SUBBANDS]; + + no_cb = 1; + + for ( j = 0; j < coding_subbands; j++ ) + { + no_cb *= no_cv_vec[j]; + } + + no_bits_vec = (int16_t) ceilf( logf( (float) no_cb ) * INV_LOG_2 ); + + /* read joint index for DCT0 */ + no_bits_vec = (int16_t) ceilf( logf( (float) no_cb ) * INV_LOG_2 ); + dct0_index = 0; + + for ( j = 0; j < no_bits_vec; j++ ) + { + dct0_index = ( dct0_index << 1 ) + bitstream[bit_pos--]; + } + + nbits += no_bits_vec; + + set_s( (int16_t *) spr_coh_temp_index, 0, MASA_MAXIMUM_CODING_SUBBANDS ); + + decode_combined_index( dct0_index, no_cv_vec, spr_coh_temp_index, coding_subbands ); + + for ( j = 0; j < coding_subbands; j++ ) + { + q_direction->coherence_band_data[j].spread_coherence_dct0_index = spr_coh_temp_index[j]; + } + } + + /* read GR data for DCT1 */ + for ( j = 0; j < coding_subbands; j++ ) + { + bits_GR = bit_pos; + idx_dct1[j] = ivas_qmetadata_DecodeExtendedGR( bitstream, &bit_pos, 2 * MASA_NO_CV_COH1, 0 ); + nbits += bits_GR - bit_pos; + } + bits_GR = bit_pos; /* just to store the data */ + + /* read average index */ + read_huf( &bit_pos, bitstream, &av_index, bit_pos, MASA_NO_CV_COH1, huff_code_av_masa, 10 ); /* 10 is MAX_LEN*/ + nbits += ( bits_GR - bit_pos ); + + /* write indexes in metadata structure */ + for ( j = 0; j < coding_subbands; j++ ) + { + if ( idx_dct1[j] % 2 ) + { + q_direction->coherence_band_data[j].spread_coherence_dct1_index = ( idx_dct1[j] + 1 ) / 2 + av_index; + } + else + { + q_direction->coherence_band_data[j].spread_coherence_dct1_index = -idx_dct1[j] / 2 + av_index; + } + } + } + nbits = *p_bit_pos - bit_pos; + + *p_bit_pos = bit_pos; + + return nbits; +} + + +/*-------------------------------------------------------------------* + * read_surround_coherence() + * + * + *-------------------------------------------------------------------*/ + +static int16_t read_surround_coherence( + uint16_t *bitstream, /* i : bitstream */ + int16_t *p_bit_pos, /* i : position in the bitstream */ + IVAS_QMETADATA *hQMetaData /* i/o: quantized metadata structure */ +) +{ + int16_t coding_subbands; + int16_t no_cv_vec[MASA_MAXIMUM_CODING_SUBBANDS]; + int16_t bit_pos; + float error_ratio_surr; + int16_t idx_ER[MASA_MAXIMUM_CODING_SUBBANDS]; + int16_t bits_sur_coherence, bits_GR; + int16_t j, d, k, idx; + uint16_t byteBuffer; + uint16_t idx_sur_coh[MASA_MAXIMUM_CODING_SUBBANDS]; + IVAS_QDIRECTION *q_direction; + int16_t min_index; + + coding_subbands = hQMetaData->q_direction[0].cfg.nbands; + q_direction = hQMetaData->q_direction; + + bits_sur_coherence = 0; + bit_pos = *p_bit_pos; + + d = 0; + for ( j = 0; j < coding_subbands; j++ ) + { + error_ratio_surr = 1.0f; + + if ( hQMetaData->no_directions == 2 ) + { + d += hQMetaData->twoDirBands[j]; + idx = max( d - 1, 0 ); + error_ratio_surr = 1.0f - q_direction[0].band_data[j].energy_ratio[0] - q_direction[1].band_data[idx].energy_ratio[0] * hQMetaData->twoDirBands[j]; + } + else + { + error_ratio_surr = 1.0f - q_direction[0].band_data[j].energy_ratio[0]; + } + + if ( error_ratio_surr <= 0 ) + { + error_ratio_surr = 0; + no_cv_vec[j] = 1; + idx_ER[j] = masa_sq( 0.0f, diffuseness_thresholds, DIRAC_DIFFUSE_LEVELS ); + } + else + { + idx_ER[j] = masa_sq( error_ratio_surr, diffuseness_thresholds, DIRAC_DIFFUSE_LEVELS ); + no_cv_vec[j] = idx_cb_sur_coh_masa[idx_ER[j]] + 2; + } + } + + if ( sum_s( no_cv_vec, coding_subbands ) == coding_subbands ) + { + /* surround coherence is zero */ + for ( j = 0; j < coding_subbands; j++ ) + { + for ( k = 0; k < MAX_PARAM_SPATIAL_SUBFRAMES; k++ ) + { + if ( hQMetaData->surcoh_band_data != NULL ) + { + hQMetaData->surcoh_band_data[j].surround_coherence[k] = 0; + } + } + } + + return bits_sur_coherence; + } + + /* read how the surround coherence is encoded */ + byteBuffer = bitstream[bit_pos--]; + bits_sur_coherence += 1; + + if ( byteBuffer & 1 ) + { + /* GR decoding */ + /* read GR order */ + byteBuffer = bitstream[bit_pos--]; + bits_sur_coherence += 1; + + /* read min index */ + bits_GR = bit_pos; + min_index = ivas_qmetadata_DecodeExtendedGR( bitstream, &bit_pos, MASA_MAX_NO_CV_SUR_COH, 0 ); + bits_sur_coherence += bits_GR - bit_pos; + + /* read GR data */ + for ( j = 0; j < coding_subbands; j++ ) + { + bits_GR = bit_pos; + /* decoding for min removed */ + if ( no_cv_vec[j] > 1 ) + { + idx_sur_coh[j] = ivas_qmetadata_DecodeExtendedGR( bitstream, &bit_pos, no_cv_vec[j] - min_index, ( byteBuffer & 1 ) ); + bits_sur_coherence += bits_GR - bit_pos; + } + else + { + idx_sur_coh[j] = 0; + } + } + + for ( j = 0; j < coding_subbands; j++ ) + { + if ( no_cv_vec[j] > 1 ) + { + hQMetaData->surcoh_band_data[j].sur_coherence_index = idx_sur_coh[j] + min_index; + } + else + { + hQMetaData->surcoh_band_data[j].sur_coherence_index = idx_sur_coh[j]; + } + + hQMetaData->surcoh_band_data[j].surround_coherence[0] = sur_coherence_cb_masa[idx_cb_sur_coh_masa[idx_ER[j]] * MASA_MAX_NO_CV_SUR_COH + hQMetaData->surcoh_band_data[j].sur_coherence_index]; + } + } + else + { + /* fixed rate */ + uint16_t sur_coh_temp_index[MASA_MAXIMUM_CODING_SUBBANDS]; + set_s( (int16_t *) sur_coh_temp_index, 0, MASA_MAXIMUM_CODING_SUBBANDS ); + + decode_fixed_rate_composed_index_coherence( bitstream, &bit_pos, coding_subbands, no_cv_vec, sur_coh_temp_index, MASA_MAX_NO_CV_SUR_COH ); + + for ( j = 0; j < coding_subbands; j++ ) + { + hQMetaData->surcoh_band_data[j].sur_coherence_index = sur_coh_temp_index[j]; + } + + /* deindex surround coherence */ + for ( j = 0; j < coding_subbands; j++ ) + { + if ( no_cv_vec[j] > 1 ) + { + hQMetaData->surcoh_band_data[j].surround_coherence[0] = sur_coherence_cb_masa[idx_cb_sur_coh_masa[idx_ER[j]] * MASA_MAX_NO_CV_SUR_COH + hQMetaData->surcoh_band_data[j].sur_coherence_index]; + } + else + { + hQMetaData->surcoh_band_data[j].surround_coherence[0] = 0; + } + } + } + + for ( j = 0; j < coding_subbands; j++ ) + { + for ( k = 1; k < MAX_PARAM_SPATIAL_SUBFRAMES; k++ ) + { + hQMetaData->surcoh_band_data[j].surround_coherence[k] = hQMetaData->surcoh_band_data[j].surround_coherence[0]; + } + } + + /* Replace return value with the actual read bits. bits_sur_coherence might show wrong count at this point. */ + bits_sur_coherence = *p_bit_pos - bit_pos; + *p_bit_pos = bit_pos; + + return bits_sur_coherence; +} + + +/*-------------------------------------------------------------------* + * read_surround_coherence_hr() + * + * + *-------------------------------------------------------------------*/ + +static int16_t read_surround_coherence_hr( + uint16_t *bitstream, /* i : bitstream */ + int16_t *p_bit_pos, /* i : position in the bitstream */ + IVAS_QMETADATA *hQMetaData /* i/o: quantized metadata structure */ +) +{ + int16_t coding_subbands; + int16_t no_cv_vec[MASA_MAXIMUM_CODING_SUBBANDS]; + int16_t bit_pos; + float error_ratio_surr; + int16_t idx_ER[MASA_MAXIMUM_CODING_SUBBANDS]; + int16_t bits_sur_coherence, bits_GR; + int16_t j, k, sf; + uint16_t byteBuffer; + uint16_t idx_sur_coh[MASA_MAXIMUM_CODING_SUBBANDS]; + IVAS_QDIRECTION *q_direction; + int16_t min_index; + int16_t d, idx; + coding_subbands = hQMetaData->q_direction[0].cfg.nbands; + q_direction = hQMetaData->q_direction; + + bits_sur_coherence = 0; + bit_pos = *p_bit_pos; + + for ( sf = 0; sf < hQMetaData->q_direction[0].cfg.nblocks; sf++ ) + { + d = 0; + for ( j = 0; j < coding_subbands; j++ ) + { + error_ratio_surr = 1.0f; + if ( hQMetaData->no_directions == 2 ) + { + d += hQMetaData->twoDirBands[j]; + idx = max( d - 1, 0 ); + error_ratio_surr = 1.0f - q_direction[0].band_data[j].energy_ratio[sf] - q_direction[1].band_data[idx].energy_ratio[sf] * hQMetaData->twoDirBands[j]; + } + else + { + error_ratio_surr = 1.0f - q_direction[0].band_data[j].energy_ratio[sf]; + } + + if ( error_ratio_surr <= 0 ) + { + error_ratio_surr = 0; + no_cv_vec[j] = 1; + idx_ER[j] = 0; + } + else + { + idx_ER[j] = 7; // masa_sq( error_ratio_surr, diffuseness_thresholds, DIRAC_DIFFUSE_LEVELS ); + no_cv_vec[j] = idx_cb_sur_coh_masa[idx_ER[j]] + 2; + } + } + + if ( sum_s( no_cv_vec, coding_subbands ) == coding_subbands ) + { + /* surround coherence is zero */ + for ( j = 0; j < coding_subbands; j++ ) + { + for ( k = 0; k < MAX_PARAM_SPATIAL_SUBFRAMES; k++ ) + { + if ( hQMetaData->surcoh_band_data != NULL ) + { + hQMetaData->surcoh_band_data[j].surround_coherence[k] = 0; + } + } + } + } + else + { + /* read how the surround coherence is encoded */ + byteBuffer = bitstream[bit_pos--]; + bits_sur_coherence += 1; + + if ( byteBuffer & 1 ) + { + /* GR decoding */ + /* read GR order */ + byteBuffer = bitstream[bit_pos--]; + bits_sur_coherence += 1; + + /* read min index */ + bits_GR = bit_pos; + min_index = ivas_qmetadata_DecodeExtendedGR( bitstream, &bit_pos, MASA_MAX_NO_CV_SUR_COH, 0 ); + bits_sur_coherence += bits_GR - bit_pos; + + /* read GR data */ + for ( j = 0; j < coding_subbands; j++ ) + { + bits_GR = bit_pos; + /* decoding for min removed */ + if ( no_cv_vec[j] > 1 ) + { + idx_sur_coh[j] = ivas_qmetadata_DecodeExtendedGR( bitstream, &bit_pos, no_cv_vec[j] - min_index, ( byteBuffer & 1 ) ); + bits_sur_coherence += bits_GR - bit_pos; + } + else + { + idx_sur_coh[j] = 0; + } + } + + for ( j = 0; j < coding_subbands; j++ ) + { + if ( no_cv_vec[j] > 1 ) + { + hQMetaData->surcoh_band_data[j].sur_coherence_index = idx_sur_coh[j] + min_index; + hQMetaData->surcoh_band_data[j].surround_coherence[sf] = sur_coherence_cb_masa[idx_cb_sur_coh_masa[idx_ER[j]] * MASA_MAX_NO_CV_SUR_COH + hQMetaData->surcoh_band_data[j].sur_coherence_index]; + } + else + { + hQMetaData->surcoh_band_data[j].sur_coherence_index = idx_sur_coh[j]; + hQMetaData->surcoh_band_data[j].surround_coherence[sf] = 0; + } + } + } + else + { + /* fixed rate */ + uint16_t sur_coh_temp_index[MASA_MAXIMUM_CODING_SUBBANDS]; + set_s( (int16_t *) sur_coh_temp_index, 0, MASA_MAXIMUM_CODING_SUBBANDS ); + + decode_fixed_rate_composed_index_coherence( bitstream, &bit_pos, coding_subbands, no_cv_vec, sur_coh_temp_index, MASA_MAX_NO_CV_SUR_COH ); + + for ( j = 0; j < coding_subbands; j++ ) + { + hQMetaData->surcoh_band_data[j].sur_coherence_index = sur_coh_temp_index[j]; + } + + /* deindex surround coherence */ + for ( j = 0; j < coding_subbands; j++ ) + { + if ( no_cv_vec[j] > 1 ) + { + hQMetaData->surcoh_band_data[j].surround_coherence[sf] = sur_coherence_cb_masa[idx_cb_sur_coh_masa[idx_ER[j]] * MASA_MAX_NO_CV_SUR_COH + hQMetaData->surcoh_band_data[j].sur_coherence_index]; + } + else + { + hQMetaData->surcoh_band_data[j].surround_coherence[sf] = 0; + } + } + } + } + } + + /* Replace return value with the actual read bits. bits_sur_coherence might show wrong count at this point. */ + bits_sur_coherence = *p_bit_pos - bit_pos; + *p_bit_pos = bit_pos; + + return bits_sur_coherence; +} + + +/*-------------------------------------------------------------------* + * decode_combined_index() + * + * Decode combined index into several indexes + *-------------------------------------------------------------------*/ + +static void decode_combined_index( + uint64_t comb_index, /* i : index to be decoded */ + const int16_t *no_cv_vec, /* i : number of codewords for each element*/ + uint16_t *index, /* o : decoded indexes */ + const int16_t len /* i : number of elements */ +) +{ + int16_t i; + uint64_t base[MASA_MAXIMUM_CODING_SUBBANDS + 1]; + + base[0] = 1; + for ( i = 1; i < len; i++ ) + { + base[i] = base[i - 1] * no_cv_vec[i - 1]; + } + + for ( i = len - 1; i > 0; i-- ) + { + index[i] = (uint16_t) ( comb_index / base[i] ); + comb_index -= index[i] * base[i]; + } + + index[0] = (uint16_t) comb_index; + + return; +} + + +static void read_stream_dct_coeffs_omasa( + int16_t *q_idx, + float *q_dct_data, + const int16_t len_stream, + uint16_t *bit_stream, + int16_t *index, + const int16_t first_line ) +{ + int16_t sign, nbits; + int16_t i, j, i_min; + + float step; + int16_t GR1, GR2; + + step = STEP_M2T; + nbits = 0; + sign = 1; + if ( first_line == 0 ) + { + /* read sign */ + sign = bit_stream[( *index )--]; + if ( sign == 0 ) + { + sign = -1; + } + nbits++; + } + + set_s( q_idx, 0, len_stream ); + /* read DCT 0 component */ + for ( i = 0; i < BITS_MASA2TOTTAL_DCT0; i++ ) + { + q_idx[0] = ( q_idx[0] << 1 ) + bit_stream[( *index )--]; + } + q_idx[0] *= sign; + + if ( q_idx[0] != 0 ) + { + if ( len_stream >= 8 ) + { + /* read index of last index encoded with GR2 */ + i_min = 0; + j = 4; + for ( i = 0; i < j; i++ ) + { + i_min = ( i_min << 1 ) + bit_stream[( *index )--]; + } + nbits += j; + /* read GR orders */ + GR1 = bit_stream[( *index )--] + 1; + if ( GR1 == 2 ) + { + GR2 = bit_stream[( *index )--]; + } + else + { + GR2 = 0; + } + + /* read GR data */ + for ( i = 1; i <= i_min; i++ ) + { + q_idx[i] = ivas_qmetadata_DecodeExtendedGR( bit_stream, index, 100, GR1 ); + } + for ( i = i_min + 1; i < len_stream; i++ ) + { + q_idx[i] = ivas_qmetadata_DecodeExtendedGR( bit_stream, index, 100, GR2 ); + } + } + else + { + /* read GR order (only one) */ + GR1 = bit_stream[( *index )--]; + for ( i = 1; i < len_stream; i++ ) + { + q_idx[i] = ivas_qmetadata_DecodeExtendedGR( bit_stream, index, 100, GR1 ); + } + } + } + + /* deindex */ + q_dct_data[0] = q_idx[0] * step; + for ( i = 1; i < len_stream; i++ ) + { + if ( ( q_idx[i] % 2 ) == 0 ) + { + q_dct_data[i] = -( q_idx[i] >> 1 ) * step; + } + else + { + q_dct_data[i] = ( ( q_idx[i] + 1 ) >> 1 ) * step; + } + } + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_omasa_decode_masa_to_total() + * + *------------------------------------------------------------------------*/ + +void ivas_omasa_decode_masa_to_total( + uint16_t *bit_stream, + int16_t *index, + float masa_to_total_energy_ratio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], + const int16_t nbands, + const int16_t nblocks ) +{ + int16_t i, j, k; + int16_t q_idx[MAX_PARAM_SPATIAL_SUBFRAMES * MASA_FREQUENCY_BANDS]; + float q_dct_data[MAX_PARAM_SPATIAL_SUBFRAMES * MASA_FREQUENCY_BANDS], + dct_data_tmp[MAX_PARAM_SPATIAL_SUBFRAMES * MASA_FREQUENCY_BANDS]; + int16_t n_streams, len_stream; + + /* Setup coding parameters */ + n_streams = 1; + len_stream = nbands * nblocks; + if ( len_stream == 32 ) + { + n_streams = 4; + len_stream = 8; + } + + set_s( q_idx, 0, nbands * nblocks ); + for ( i = 0; i < n_streams; i++ ) + { + read_stream_dct_coeffs_omasa( &q_idx[i * len_stream], &q_dct_data[i * len_stream], len_stream, bit_stream, index, i == 0 ); + } + + /* inverse DCT2 transform */ + switch ( len_stream ) + { + case 4: + matrix_product( dct4, nblocks, nblocks, 1, q_dct_data, nblocks, 1, 0, dct_data_tmp ); + mvr2r( dct_data_tmp, q_dct_data, nblocks ); + break; + case 5: + matrix_product( dct5, nbands, nbands, 1, q_dct_data, nbands, 1, 0, dct_data_tmp ); + mvr2r( dct_data_tmp, q_dct_data, nbands ); + break; + case 8: + matrix_product( dct8, nbands, nbands, 1, q_dct_data, nbands, 1, 0, dct_data_tmp ); + mvr2r( dct_data_tmp, q_dct_data, nbands ); + break; + case 12: + matrix_product( dct12, nbands, nbands, 1, q_dct_data, nbands, 1, 0, dct_data_tmp ); + mvr2r( dct_data_tmp, q_dct_data, nbands ); + break; + case 20: + matrix_product( dct5, nbands, nbands, 1, q_dct_data, nbands, nblocks, 0, dct_data_tmp ); + matrix_product( dct_data_tmp, nbands, nblocks, 0, dct4, nblocks, nblocks, 0, q_dct_data ); /* reuse of variable*/ + break; + case 32: + matrix_product( dct8, nbands, nbands, 1, q_dct_data, nbands, nblocks, 0, dct_data_tmp ); + matrix_product( dct_data_tmp, nbands, nblocks, 0, dct4, nblocks, nblocks, 0, q_dct_data ); + break; + default: + printf( "Incorrect number of coefficients for OMASA.\n" ); + break; + } + + k = 0; + for ( i = 0; i < nblocks; i++ ) + { + for ( j = 0; j < nbands; j++ ) + { + masa_to_total_energy_ratio[i][j] = max( 0.0f, q_dct_data[k] ); + masa_to_total_energy_ratio[i][j] = min( 1.0f, masa_to_total_energy_ratio[i][j] ); + k++; + } + } + + if ( nblocks == 1 ) + { + for ( i = 1; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + { + for ( j = 0; j < nbands; j++ ) + { + masa_to_total_energy_ratio[i][j] = masa_to_total_energy_ratio[0][j]; + } + } + } + + if ( nbands == 1 ) + { + for ( j = 1; j < 5; j++ ) + { + for ( i = 0; i < nblocks; i++ ) + { + masa_to_total_energy_ratio[i][j] = masa_to_total_energy_ratio[i][0]; + } + } + } + + return; +} diff --git a/lib_dec/ivas_qspherical_dec.c b/lib_dec/ivas_qspherical_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..a3dc21f0c3c12666c62a917f5f80c896c6433c42 --- /dev/null +++ b/lib_dec/ivas_qspherical_dec.c @@ -0,0 +1,97 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "ivas_cnst.h" +#include "ivas_prot.h" +#include "ivas_rom_com.h" +#include "ivas_stat_dec.h" +#include "wmc_auto.h" +#include "prot.h" + + +/*-------------------------------------------------------------------* + * deindex_elevation() + * + * Decode elevation index + *----------------------------------------------------------------------*/ + +/*! r: decoded elevation value */ +float deindex_elevation( + uint16_t *id_th, /* i : input index */ + const int16_t no_bits, /* i : number of bits for the spherical grid */ + const MC_LS_SETUP mc_format /* i : channel format if in MC-mode */ +) +{ + float theta_hat; + + if ( *id_th == MASA_NO_INDEX ) + { + theta_hat = 0; + } + else + { + if ( mc_format != MC_LS_SETUP_INVALID ) + { + theta_hat = ( *id_th * delta_theta_masa[no_bits - 3] ); + if ( theta_hat > 90 ) + { + theta_hat = 90; + } + } + else + { + if ( *id_th % 2 == 0 ) + { + /* theta is negative */ + *id_th = *id_th / 2; + theta_hat = -( *id_th * delta_theta_masa[no_bits - 3] ); + if ( theta_hat < -90 ) + { + theta_hat = -90; + } + } + else + { + *id_th = ( *id_th + 1 ) / 2; + theta_hat = ( *id_th * delta_theta_masa[no_bits - 3] ); + if ( theta_hat > 90 ) + { + theta_hat = 90; + } + } + } + } + + return theta_hat; +} diff --git a/lib_dec/ivas_range_uni_dec.c b/lib_dec/ivas_range_uni_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..70ce6b84edbbcb09bf820093758d5f59b229a6bb --- /dev/null +++ b/lib_dec/ivas_range_uni_dec.c @@ -0,0 +1,477 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "ivas_prot.h" +#include "ivas_cnst.h" +#include "ivas_stat_dec.h" +#include "cnst.h" +#include "rom_com.h" +#include +#include "options.h" +#include "prot.h" +#include "wmc_auto.h" + + +/* + * Up to 30 bits are read internally from bit_buffer as look-ahead more than the + * declared amount of max_available_bits, the total maximum bits available. + * Therefore, the caller must ensure that bit_buffer has an allocated size of at + * least max_available_bits + 30 entries, and also that the extra 30 padding + * entries contain only binary (0 or 1) values, e.g., by setting them to zero. + * The parameter max_available_bits does not represent the total number of bits + * that will be consumed by the range coder, but the usually larger total number + * of bits that have been read from the bitstream and have meaningful values. + */ + +/*-------------------------------------------------------------------* + * Local function prototypes + *-------------------------------------------------------------------*/ + +static int16_t rc_uni_dec_read( RangeUniDecState *rc_st_dec ); + +static void rc_uni_dec_update( RangeUniDecState *rc_st_dec, const uint16_t cum_freq, const uint16_t sym_freq ); + + +/*-------------------------------------------------------------------* + * rc_uni_dec_init() + * + * Initialize the range decoder + *-------------------------------------------------------------------*/ + +void rc_uni_dec_init( + RangeUniDecState *rc_st_dec, /* i/o: RC state handle */ + uint16_t *bit_buffer, /* i : Bit buffer */ + const int16_t max_available_bits /* i : Total maximum bits available */ +) +{ + int16_t i; + + rc_st_dec->rc_low = 0; + rc_st_dec->rc_range = 0xFFFFFFFF; + + rc_st_dec->bit_buffer = bit_buffer; + rc_st_dec->bit_count = 0; + /* the renormalization procedure reads at most 32 - 2 extra bits than available */ + rc_st_dec->max_allowable_bit_count = max_available_bits + 30; + + rc_st_dec->bit_error_detected = 0; + + for ( i = 0; i < 4; i++ ) + { + rc_st_dec->rc_low = ( rc_st_dec->rc_low << 8 ) + rc_uni_dec_read( rc_st_dec ); + } + + return; +} + +/*-------------------------------------------------------------------* + * rc_uni_dec_read_symbol_fastS() + * + * Read an alphabet symbol when total frequency is a power of 2 + *-------------------------------------------------------------------*/ + +/*! r: Read symbol */ +uint16_t rc_uni_dec_read_symbol_fastS( + RangeUniDecState *rc_st_dec, /* i/o: Decoder State */ + const uint16_t cum_freq_table[], /* i : Cumulative frequency up to symbol */ + const uint16_t sym_freq_table[], /* i : Symbol frequency */ + const uint16_t alphabet_size, /* i : Number of symbols in the alphabet */ + const uint16_t tot_shift /* i : Total frequency as a power of 2 */ +) +{ + uint16_t sym_begin; + uint16_t sym_end; + uint16_t sym_middle; + uint32_t low; /* local copy (2 to 1 + ceil(log2(alphabet_size)) uses) */ + uint32_t range; /* local copy (3 to 2 + ceil(log2(alphabet_size)) uses) */ + uint16_t ceil_log2_alphabet_size; /* ceil(log2(alphabet_size)) */ + uint16_t step; + uint32_t reversed_low; + + low = rc_st_dec->rc_low; + range = rc_st_dec->rc_range; + + range >>= tot_shift; + + /* the cumulative value is val = low / range */ + /* the condition val >= level is equivalent with low >= range * level */ + + /* in case of bitstream errors it is possible that val >= (1 << tot_shift) */ + if ( low >= ( range << tot_shift ) ) + { + rc_st_dec->bit_error_detected = 1; + + /* for valid bitstreams, always low < range, therefore setting low = range */ + /* will always reach the bitstream error condition branch on the next call */ + rc_st_dec->rc_range = 0xFFFFFFFF; + rc_st_dec->rc_low = rc_st_dec->rc_range; + + /* the current value and all the following values are very likely incorrect */ + return 0; /* return the minimum valid value for the output */ + } + + /* do a binary search to find the symbol read */ + sym_begin = 0; + sym_end = alphabet_size; /* the possible values are {sym_begin, .., sym_end - 1} */ + + /* ceil(log2(x)) = 1 + floor(log2(x - 1)), for any x >= 2 */ + /* floor(log2(y)) = 31 - norm_ul(y) = 30 - norm_l(y), for any 1 <= y <= 2 ^ 31 - 1 */ + ceil_log2_alphabet_size = 31 - norm_l( alphabet_size - 1 ); + /* completely equivalent with 32 - norm_ul(alphabet_size - 1), but norm_l is faster */ + reversed_low = ( range << tot_shift ) - low; + + /* at most ceil_log2_alphabet_size steps are needed so that sym_end - sym_begin == 1 */ + for ( step = 0; step < ceil_log2_alphabet_size; step++ ) + { + sym_middle = ( sym_begin + sym_end ) >> 1; + /* completely equvalent with low >= range * ((1 << tot_shift) - table[sym_middle]) */ + if ( range * ( ( 1 << tot_shift ) - cum_freq_table[sym_middle] ) >= reversed_low ) + { + sym_begin = sym_middle; + } + else + { + sym_end = sym_middle; + } + } + + /* sym_begin contains the symbol read */ + + /* low was not modified */ + rc_st_dec->rc_range = range; + + rc_uni_dec_update( rc_st_dec, cum_freq_table[sym_begin], sym_freq_table[sym_begin] ); + + return sym_begin; +} + + +/*-------------------------------------------------------------------* + * rc_uni_dec_update() + * + * Update the state for the symbol found after using get_cumulative + *-------------------------------------------------------------------*/ + +static void rc_uni_dec_update( + RangeUniDecState *rc_st_dec, /* i/o: RC State handle */ + const uint16_t cum_freq, /* i : Cumulative frequency */ + const uint16_t sym_freq /* i : Symbol frequency */ +) +{ + rc_st_dec->rc_low -= cum_freq * rc_st_dec->rc_range; + rc_st_dec->rc_range *= sym_freq; + + /* rc_range was shifted right by up to 16, so at most two renormalizations are needed */ + if ( rc_st_dec->rc_range < 0x01000000 ) + { + rc_st_dec->rc_low = ( rc_st_dec->rc_low << 8 ) + rc_uni_dec_read( rc_st_dec ); + rc_st_dec->rc_range <<= 8; + if ( rc_st_dec->rc_range < 0x01000000 ) + { + rc_st_dec->rc_low = ( rc_st_dec->rc_low << 8 ) + rc_uni_dec_read( rc_st_dec ); + rc_st_dec->rc_range <<= 8; + } + } + + return; +} + +/*-------------------------------------------------------------------* + * rc_uni_dec_read_bit() + * + * Read one bit with uniform probability + *-------------------------------------------------------------------*/ + +/*! r: Read bit */ +uint16_t rc_uni_dec_read_bit( + RangeUniDecState *rc_st_dec /* i/o: RC State handle */ +) +{ + uint32_t val; + uint32_t low; /* local copy (1 to 5 uses) */ + uint32_t range; /* local copy (3 to 6 uses) */ + + low = rc_st_dec->rc_low; + range = rc_st_dec->rc_range; + + range >>= 1; + + /* in case of bitstream errors it is possible that rc_low >= (rc_range << 1) */ + val = 0; + if ( low >= range ) + { + val++; + low -= range; + + /* rc_range was already subtracted once from rc_low */ + if ( low >= range ) + { + rc_st_dec->bit_error_detected = 1; + + /* for valid bitstreams, always low < range, therefore setting low = range */ + /* will always reach the bitstream error condition branch on the next call */ + rc_st_dec->rc_range = 0xFFFFFFFF; + rc_st_dec->rc_low = rc_st_dec->rc_range; + + /* the current value and all the following values are very likely incorrect */ + return 0; /* return the minimum valid value for the output */ + } + } + + /* rc_range was shifted right by 1, so at most one renormalization is needed */ + if ( range < 0x01000000 ) + { + low = ( low << 8 ) + rc_uni_dec_read( rc_st_dec ); + range <<= 8; + } + + rc_st_dec->rc_low = low; + rc_st_dec->rc_range = range; + + return (uint16_t) val; +} + + +/*-------------------------------------------------------------------* + * rc_uni_dec_read_bit_prob_fast() + * + * Read one bit with probability freq0 / 2 ^ tot_shift for symbol 0 + *-------------------------------------------------------------------*/ + +/*! r: Read bit */ +uint16_t rc_uni_dec_read_bit_prob_fast( + RangeUniDecState *rc_st_dec, /* i/o: RC State handle */ + const int16_t freq0, /* i : Frequency for symbol 0 */ + const uint16_t tot_shift /* i : Total frequency as a power of 2 */ +) +{ + uint32_t val; + uint32_t low; /* local copy (2 to 7 uses) */ + uint32_t range; /* local copy (5 to 9 uses) */ + + low = rc_st_dec->rc_low; + range = rc_st_dec->rc_range; + + range >>= tot_shift; + + /* in case of bitstream errors it is possible that low >= (1 << tot_shift) * range */ + if ( low >= ( range << tot_shift ) ) /* equivalent condition */ + { + rc_st_dec->bit_error_detected = 1; + + /* for valid bitstreams, always low < range, therefore setting low = range */ + /* will always reach the bitstream error condition branch on the next call */ + rc_st_dec->rc_range = 0xFFFFFFFF; + rc_st_dec->rc_low = rc_st_dec->rc_range; + + /* the current value and all the following values are very likely incorrect */ + return 0; /* return the minimum valid value for the output */ + } + + val = 0; + if ( low >= range * freq0 ) + { + val++; + + low -= range * freq0; + range *= ( 1 << tot_shift ) - freq0; /* freq1 = (1 << tot_shift) - freq0 */ + } + else + { + range *= freq0; + } + + /* rc_range was shifted right by up to 16, so at most two renormalizations are needed */ + if ( range < 0x01000000 ) + { + low = ( low << 8 ) + rc_uni_dec_read( rc_st_dec ); + range <<= 8; + if ( range < 0x01000000 ) + { + low = ( low << 8 ) + (uint32_t) rc_uni_dec_read( rc_st_dec ); + range <<= 8; + } + } + + rc_st_dec->rc_low = low; + rc_st_dec->rc_range = range; + + return (uint16_t) val; +} + + +/*-------------------------------------------------------------------* + * rc_uni_dec_read_bits() + * + * Read up to 16 bits with uniform probability + *-------------------------------------------------------------------*/ + +/*! r: Read bits */ +uint16_t rc_uni_dec_read_bits( + RangeUniDecState *rc_st_dec, /* i/o: RC State handle */ + const int16_t bits /* i : Number of bits */ +) +{ + uint32_t val; + uint32_t low; /* local copy (2 to 6 uses) */ + uint32_t range; /* local copy (4 to 7 uses) */ + + low = rc_st_dec->rc_low; + range = rc_st_dec->rc_range; + + range >>= bits; + + val = low / range; + + /* in case of bitstream errors it is possible that val >= (1 << bits) */ + if ( ( val >> bits ) != 0 ) /* equivalent condition */ + { + rc_st_dec->bit_error_detected = 1; + + /* for valid bitstreams, always low < range, therefore setting low = range */ + /* will always reach the bitstream error condition branch on the next call */ + rc_st_dec->rc_range = 0xFFFFFFFF; + rc_st_dec->rc_low = rc_st_dec->rc_range; + + /* the current value and all the following values are very likely incorrect */ + return 0; /* return the minimum valid value for the output */ + } + + low -= val * range; + + /* rc_range was shifted right by up to 16, so at most two renormalizations are needed */ + if ( range < 0x01000000 ) + { + low = ( low << 8 ) + rc_uni_dec_read( rc_st_dec ); + range <<= 8; + if ( range < 0x01000000 ) + { + low = ( low << 8 ) + rc_uni_dec_read( rc_st_dec ); + range <<= 8; + } + } + + rc_st_dec->rc_low = low; + rc_st_dec->rc_range = range; + + return (uint16_t) val; +} + + +/*-------------------------------------------------------------------* + * rc_uni_dec_finish() + * + * Finalize the range decoder + *-------------------------------------------------------------------*/ + +/*! r: Total number of bits consumed */ +int16_t rc_uni_dec_finish( + RangeUniDecState *rc_st_dec /* i/o: RC State handle */ +) +{ + int16_t total_bit_count; + int16_t bits; + + /* floor(log2(x)) = floor(log2(x >> 24)) + 24, for any x >= 2 ^ 24 */ + /* 32 - floor(log2(y)) = norm_ul(y) + 1 = norm_l(y >> 24) - 22 */ + bits = norm_l( rc_st_dec->rc_range >> 24 ) - 22; /* bits = 32 - floor(log2(rc_range)) */ + /* completely equivalent with norm_ul(rc_st_enc->rc_range) + 1, but norm_l is faster */ + + bits++; /* conservative number of bits, because the decoder only has rc_range available */ + + + total_bit_count = ( rc_st_dec->bit_count - 32 ) + bits; + + return total_bit_count; +} + + +/*-------------------------------------------------------------------* + * rc_uni_dec_virtual_finish() + * + * Get the total number of bits that would be consumed by finalization + *-------------------------------------------------------------------*/ + +/*! r: Total number of bits consumed */ +int16_t rc_uni_dec_virtual_finish( + RangeUniDecState *rc_st_dec /* i : RC state handle */ +) +{ + /* the function is completely equivalent with rc_uni_dec_finish */ + return rc_st_dec->bit_count + norm_l( rc_st_dec->rc_range >> 24 ) - 53; +} + + +/*-------------------------------------------------------------------* + * rc_uni_dec_read() + * + * Read one byte from the bitstream (internal function) + *-------------------------------------------------------------------*/ + +/*! r: Byte read */ +static int16_t rc_uni_dec_read( + RangeUniDecState *rc_st_dec /* i/o: RC State handle */ +) +{ + int16_t byte_read; + uint16_t *shifted_bit_buffer; + + shifted_bit_buffer = rc_st_dec->bit_buffer + rc_st_dec->bit_count; + rc_st_dec->bit_count += 8; + + /* + * In case of bitstream errors the number the bits read may be larger than the total + * number of bits that have been read from the bitstream and have meaningful values + * plus the extra 30 padding bits that must be appended to the buffer by the caller. + */ + if ( rc_st_dec->bit_count > rc_st_dec->max_allowable_bit_count ) + { + rc_st_dec->bit_error_detected = 1; + + /* for valid bitstreams, always low < range, therefore setting low = range */ + /* will always reach the bitstream error condition branch on the next call */ + rc_st_dec->rc_range = 0xFFFFFFFF; + rc_st_dec->rc_low = rc_st_dec->rc_range; + + return 0; /* reading the 8 bits would trigger an out-of-bounds array access */ + } + + + /* pack the first 8 bits from shifted_bit_buffer, first bit is most significant */ + byte_read = ( (int16_t) shifted_bit_buffer[0] << 7 ) | ( (int16_t) shifted_bit_buffer[1] << 6 ) | + ( (int16_t) shifted_bit_buffer[2] << 5 ) | ( (int16_t) shifted_bit_buffer[3] << 4 ) | + ( (int16_t) shifted_bit_buffer[4] << 3 ) | ( (int16_t) shifted_bit_buffer[5] << 2 ) | + ( (int16_t) shifted_bit_buffer[6] << 1 ) | ( (int16_t) shifted_bit_buffer[7] ); + + return byte_read; +} diff --git a/lib_dec/ivas_rom_dec.c b/lib_dec/ivas_rom_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..2bcf76c3f6d59519ecdcb55e7fceb4eaf172a6ac --- /dev/null +++ b/lib_dec/ivas_rom_dec.c @@ -0,0 +1,871 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "cnst.h" +#include "ivas_cnst.h" +#include +#include "wmc_auto.h" +#include "ivas_stat_dec.h" + +/* clang-format off */ + +/*----------------------------------------------------------------------------------* + * DFT stereo ROM tables + *----------------------------------------------------------------------------------*/ + +const float dft_alpha_s[STEREO_DFT_BAND_MAX] = +{ + .7f, .4f, .25f, .2f, .15f, .1f, .1f, .1f, .1f, .1f, .1f, .1f, .1f +}; + +const float dft_alpha_w[STEREO_DFT_BAND_MAX] = +{ + .3f, .3f, .3f, .3f, .3f, .3f, .3f, .3f, .3f, .3f, .3f, .3f, .3f +}; + +const float dft_alpha_s2[STEREO_DFT_BAND_MAX] = +{ + .7f, .6f, .3f, .3f, .3f, .3f, .3f, .3f, .3f, .3f, .3f, .3f, .3f +}; + +const float dft_alpha_s_b2[STEREO_DFT_BAND_MAX] = +{ + .7f, .3f, .15f, .1f, .1f, .1f, .1f +}; + +const float dft_alpha_w_b2[STEREO_DFT_BAND_MAX] = +{ + .3f, .3f, .3f, .3f, .3f, .3f, .3f +}; + +const float dft_alpha_s2_b2[STEREO_DFT_BAND_MAX] = +{ + .7f, .3f, .3f, .3f, .3f, .3f, .3f +}; + +/* HP filter for DFT of 50Hz resolution */ +const float dft_bpf_weights[] = +{ + 1.000040f, 0.994684f, 0.978763f, 0.952708f, 0.917218f, 0.873235f, 0.821906f, 0.764540f, + 0.702561f, 0.637451f, 0.570704f, 0.503772f, 0.438018f, 0.374674f, 0.314811f, 0.259307f, + 0.208838f, 0.163865f, 0.124639f, 0.091211f, 0.063451f, 0.041069f, 0.023648f, 0.010670f, + 0.001553f, 0.004319f, 0.007570f, 0.008799f, 0.008564f, 0.007361f, 0.005613f, 0.003664f, + 0.001777f, 0.000138f, 0.001142f, 0.002011f, 0.002472f, 0.002565f, 0.002356f, 0.001929f +}; + +const float dft_ap_gains[5][3] = +{ + { 0.5f, -0.2f, 0.5f}, + {-0.4f, 0.2f, -0.5f}, + { 0.4f, -0.3f, 0.5f}, + {-0.4f, 0.3f, -0.5f}, + { 0.3f, -0.3f, 0.5f} +}; + +const int16_t dft_ap_delays[3][3] = +{ + { 2, 47, 61}, + {29, 41, 73}, + {31, 37, 59} +}; + +const float dft_res_pred_weights[][STEREO_DFT_BAND_MAX] = +{ + { 1.f, .75f, .5f, .4f, .4f }, + { 1.f, 1.f, 1.f, 1.f, 0.f }, + { 1.f, .5f, .4f, .4f } +}; + + +const float dft_win232ms_8k[75] = +{ + 0.0104718f, 0.0314108f, 0.0523360f, 0.0732382f, 0.0941083f, 0.1149372f, 0.1357156f, 0.1564345f, 0.1770847f, 0.1976573f, 0.2181432f, 0.2385335f, 0.2588190f, 0.2789911f, + 0.2990408f, 0.3189593f, 0.3387379f, 0.3583679f, 0.3778408f, 0.3971479f, 0.4162808f, 0.4352311f, 0.4539905f, 0.4725508f, 0.4909038f, 0.5090414f, 0.5269558f, 0.5446390f, + 0.5620834f, 0.5792812f, 0.5962249f, 0.6129071f, 0.6293204f, 0.6454577f, 0.6613119f, 0.6768760f, 0.6921432f, 0.7071068f, 0.7217602f, 0.7360971f, 0.7501111f, 0.7637960f, + 0.7771460f, 0.7901550f, 0.8028175f, 0.8151278f, 0.8270806f, 0.8386706f, 0.8498927f, 0.8607420f, 0.8712138f, 0.8813035f, 0.8910065f, 0.9003188f, 0.9092361f, 0.9177546f, + 0.9258706f, 0.9335804f, 0.9408808f, 0.9477684f, 0.9542403f, 0.9602937f, 0.9659258f, 0.9711343f, 0.9759168f, 0.9802712f, 0.9841956f, 0.9876883f, 0.9907478f, 0.9933728f, + 0.9955620f, 0.9973145f, 0.9986295f, 0.9995066f, 0.9999452f +}; + +const float dft_win232ms_12k8[120] = +{ + 0.0065449f, 0.0196337f, 0.0327191f, 0.0457989f, 0.0588708f, 0.0719327f, 0.0849822f, 0.0980171f, 0.1110353f, 0.1240345f, 0.1370123f, 0.1499668f, 0.1628955f, 0.1757963f, + 0.1886670f, 0.2015053f, 0.2143092f, 0.2270763f, 0.2398045f, 0.2524916f, 0.2651354f, 0.2777338f, 0.2902847f, 0.3027858f, 0.3152350f, 0.3276302f, 0.3399692f, 0.3522500f, + 0.3644705f, 0.3766285f, 0.3887220f, 0.4007488f, 0.4127070f, 0.4245945f, 0.4364092f, 0.4481492f, 0.4598124f, 0.4713967f, 0.4829003f, 0.4943212f, 0.5056574f, 0.5169069f, + 0.5280679f, 0.5391383f, 0.5501164f, 0.5610003f, 0.5717880f, 0.5824777f, 0.5930676f, 0.6035559f, 0.6139408f, 0.6242205f, 0.6343933f, 0.6444573f, 0.6544109f, 0.6642524f, + 0.6739801f, 0.6835923f, 0.6930874f, 0.7024637f, 0.7117196f, 0.7208536f, 0.7298641f, 0.7387495f, 0.7475083f, 0.7561391f, 0.7646403f, 0.7730105f, 0.7812482f, 0.7893520f, + 0.7973207f, 0.8051526f, 0.8128467f, 0.8204014f, 0.8278156f, 0.8350880f, 0.8422172f, 0.8492022f, 0.8560416f, 0.8627344f, 0.8692793f, 0.8756753f, 0.8819213f, 0.8880161f, + 0.8939588f, 0.8997483f, 0.9053836f, 0.9108638f, 0.9161880f, 0.9213551f, 0.9263644f, 0.9312149f, 0.9359059f, 0.9404366f, 0.9448060f, 0.9490136f, 0.9530586f, 0.9569403f, + 0.9606581f, 0.9642112f, 0.9675991f, 0.9708212f, 0.9738770f, 0.9767659f, 0.9794874f, 0.9820411f, 0.9844266f, 0.9866433f, 0.9886910f, 0.9905693f, 0.9922779f, 0.9938165f, + 0.9951847f, 0.9963825f, 0.9974095f, 0.9982656f, 0.9989507f, 0.9994646f, 0.9998072f, 0.9999786f +}; + +const float dft_win232ms_16k[150] = +{ + 0.0052360f, 0.0157073f, 0.0261769f, 0.0366437f, 0.0471065f, 0.0575640f, 0.0680153f, 0.0784591f, 0.0888943f, 0.0993197f, 0.1097343f, 0.1201368f, 0.1305262f, 0.1409012f, + 0.1512608f, 0.1616038f, 0.1719291f, 0.1822355f, 0.1925220f, 0.2027873f, 0.2130304f, 0.2232501f, 0.2334454f, 0.2436150f, 0.2537579f, 0.2638730f, 0.2739592f, 0.2840153f, + 0.2940403f, 0.3040331f, 0.3139925f, 0.3239174f, 0.3338069f, 0.3436597f, 0.3534748f, 0.3632512f, 0.3729878f, 0.3826834f, 0.3923371f, 0.4019478f, 0.4115144f, 0.4210358f, + 0.4305111f, 0.4399392f, 0.4493190f, 0.4586496f, 0.4679298f, 0.4771588f, 0.4863354f, 0.4954587f, 0.5045276f, 0.5135413f, 0.5224986f, 0.5313986f, 0.5402403f, 0.5490228f, + 0.5577451f, 0.5664062f, 0.5750053f, 0.5835412f, 0.5920132f, 0.6004202f, 0.6087614f, 0.6170359f, 0.6252427f, 0.6333809f, 0.6414496f, 0.6494480f, 0.6573752f, 0.6652304f, + 0.6730125f, 0.6807209f, 0.6883546f, 0.6959128f, 0.7033947f, 0.7107995f, 0.7181263f, 0.7253744f, 0.7325429f, 0.7396311f, 0.7466382f, 0.7535634f, 0.7604060f, 0.7671652f, + 0.7738402f, 0.7804304f, 0.7869350f, 0.7933533f, 0.7996847f, 0.8059283f, 0.8120835f, 0.8181497f, 0.8241262f, 0.8300123f, 0.8358074f, 0.8415108f, 0.8471219f, 0.8526402f, + 0.8580649f, 0.8633956f, 0.8686315f, 0.8737722f, 0.8788171f, 0.8837656f, 0.8886172f, 0.8933714f, 0.8980276f, 0.9025853f, 0.9070440f, 0.9114033f, 0.9156626f, 0.9198215f, + 0.9238795f, 0.9278363f, 0.9316912f, 0.9354440f, 0.9390943f, 0.9426415f, 0.9460854f, 0.9494255f, 0.9526615f, 0.9557930f, 0.9588197f, 0.9617413f, 0.9645574f, 0.9672678f, + 0.9698720f, 0.9723699f, 0.9747612f, 0.9770456f, 0.9792228f, 0.9812927f, 0.9832549f, 0.9851093f, 0.9868557f, 0.9884939f, 0.9900237f, 0.9914449f, 0.9927573f, 0.9939610f, + 0.9950556f, 0.9960411f, 0.9969173f, 0.9976843f, 0.9983418f, 0.9988899f, 0.9993284f, 0.9996573f, 0.9998766f, 0.9999863f +}; + +const float dft_win232ms_32k[300] = +{ + 0.0026180f, 0.0078539f, 0.0130896f, 0.0183249f, 0.0235598f, 0.0287940f, 0.0340274f, 0.0392598f, 0.0444912f, 0.0497214f, 0.0549502f, 0.0601775f, 0.0654031f, 0.0706270f, + 0.0758489f, 0.0810687f, 0.0862864f, 0.0915016f, 0.0967144f, 0.1019245f, 0.1071318f, 0.1123361f, 0.1175374f, 0.1227355f, 0.1279302f, 0.1331213f, 0.1383089f, 0.1434926f, + 0.1486724f, 0.1538482f, 0.1590197f, 0.1641868f, 0.1693495f, 0.1745075f, 0.1796607f, 0.1848091f, 0.1899523f, 0.1950903f, 0.2002230f, 0.2053502f, 0.2104718f, 0.2155876f, + 0.2206974f, 0.2258013f, 0.2308989f, 0.2359902f, 0.2410751f, 0.2461533f, 0.2512248f, 0.2562894f, 0.2613469f, 0.2663973f, 0.2714404f, 0.2764761f, 0.2815042f, 0.2865246f, + 0.2915371f, 0.2965416f, 0.3015380f, 0.3065261f, 0.3115058f, 0.3164770f, 0.3214395f, 0.3263932f, 0.3313379f, 0.3362735f, 0.3412000f, 0.3461171f, 0.3510246f, 0.3559226f, + 0.3608108f, 0.3656891f, 0.3705574f, 0.3754156f, 0.3802634f, 0.3851008f, 0.3899277f, 0.3947439f, 0.3995492f, 0.4043436f, 0.4091269f, 0.4138990f, 0.4186597f, 0.4234090f, + 0.4281467f, 0.4328726f, 0.4375866f, 0.4422887f, 0.4469786f, 0.4516563f, 0.4563216f, 0.4609744f, 0.4656145f, 0.4702419f, 0.4748564f, 0.4794579f, 0.4840462f, 0.4886212f, + 0.4931829f, 0.4977310f, 0.5022655f, 0.5067863f, 0.5112931f, 0.5157859f, 0.5202646f, 0.5247290f, 0.5291790f, 0.5336145f, 0.5380354f, 0.5424415f, 0.5468328f, 0.5512091f, + 0.5555702f, 0.5599162f, 0.5642467f, 0.5685619f, 0.5728614f, 0.5771452f, 0.5814132f, 0.5856652f, 0.5899012f, 0.5941211f, 0.5983246f, 0.6025117f, 0.6066824f, 0.6108363f, + 0.6149736f, 0.6190939f, 0.6231974f, 0.6272837f, 0.6313528f, 0.6354046f, 0.6394390f, 0.6434559f, 0.6474551f, 0.6514366f, 0.6554002f, 0.6593458f, 0.6632734f, 0.6671828f, + 0.6710739f, 0.6749466f, 0.6788007f, 0.6826363f, 0.6864532f, 0.6902512f, 0.6940304f, 0.6977905f, 0.7015314f, 0.7052532f, 0.7089556f, 0.7126385f, 0.7163019f, 0.7199457f, + 0.7235698f, 0.7271740f, 0.7307583f, 0.7343225f, 0.7378666f, 0.7413905f, 0.7448941f, 0.7483772f, 0.7518398f, 0.7552818f, 0.7587031f, 0.7621036f, 0.7654832f, 0.7688418f, + 0.7721794f, 0.7754957f, 0.7787909f, 0.7820646f, 0.7853169f, 0.7885477f, 0.7917569f, 0.7949444f, 0.7981100f, 0.8012538f, 0.8043756f, 0.8074754f, 0.8105530f, 0.8136084f, + 0.8166416f, 0.8196523f, 0.8226405f, 0.8256062f, 0.8285493f, 0.8314696f, 0.8343672f, 0.8372418f, 0.8400936f, 0.8429222f, 0.8457278f, 0.8485102f, 0.8512693f, 0.8540051f, + 0.8567175f, 0.8594064f, 0.8620717f, 0.8647134f, 0.8673314f, 0.8699256f, 0.8724960f, 0.8750425f, 0.8775649f, 0.8800633f, 0.8825376f, 0.8849876f, 0.8874134f, 0.8898149f, + 0.8921920f, 0.8945446f, 0.8968727f, 0.8991763f, 0.9014551f, 0.9037093f, 0.9059386f, 0.9081432f, 0.9103228f, 0.9124775f, 0.9146072f, 0.9167118f, 0.9187912f, 0.9208455f, + 0.9228745f, 0.9248782f, 0.9268566f, 0.9288096f, 0.9307370f, 0.9326390f, 0.9345154f, 0.9363662f, 0.9381913f, 0.9399907f, 0.9417644f, 0.9435122f, 0.9452341f, 0.9469301f, + 0.9486002f, 0.9502443f, 0.9518623f, 0.9534542f, 0.9550199f, 0.9565595f, 0.9580729f, 0.9595600f, 0.9610208f, 0.9624552f, 0.9638633f, 0.9652449f, 0.9666001f, 0.9679288f, + 0.9692309f, 0.9705065f, 0.9717554f, 0.9729777f, 0.9741734f, 0.9753423f, 0.9764845f, 0.9775999f, 0.9786886f, 0.9797504f, 0.9807853f, 0.9817933f, 0.9827744f, 0.9837286f, + 0.9846558f, 0.9855561f, 0.9864293f, 0.9872754f, 0.9880945f, 0.9888865f, 0.9896514f, 0.9903891f, 0.9910997f, 0.9917832f, 0.9924394f, 0.9930685f, 0.9936703f, 0.9942448f, + 0.9947921f, 0.9953122f, 0.9958049f, 0.9962704f, 0.9967085f, 0.9971193f, 0.9975028f, 0.9978589f, 0.9981877f, 0.9984891f, 0.9987631f, 0.9990098f, 0.9992290f, 0.9994209f, + 0.9995854f, 0.9997224f, 0.9998321f, 0.9999143f, 0.9999692f, 0.9999966f +}; + +const float dft_win232ms_48k[450] = +{ + 0.0017453f, 0.0052360f, 0.0087265f, 0.0122170f, 0.0157073f, 0.0191974f, 0.0226873f, 0.0261769f, 0.0296662f, 0.0331552f, 0.0366437f, 0.0401318f, 0.0436194f, 0.0471065f, + 0.0505929f, 0.0540788f, 0.0575640f, 0.0610485f, 0.0645323f, 0.0680153f, 0.0714974f, 0.0749787f, 0.0784591f, 0.0819385f, 0.0854169f, 0.0888943f, 0.0923706f, 0.0958458f, + 0.0993197f, 0.1027925f, 0.1062641f, 0.1097343f, 0.1132032f, 0.1166707f, 0.1201368f, 0.1236015f, 0.1270646f, 0.1305262f, 0.1339862f, 0.1374445f, 0.1409012f, 0.1443562f, + 0.1478094f, 0.1512608f, 0.1547104f, 0.1581581f, 0.1616038f, 0.1650476f, 0.1684894f, 0.1719291f, 0.1753667f, 0.1788022f, 0.1822355f, 0.1856666f, 0.1890954f, 0.1925220f, + 0.1959461f, 0.1993679f, 0.2027873f, 0.2062042f, 0.2096186f, 0.2130304f, 0.2164396f, 0.2198462f, 0.2232501f, 0.2266513f, 0.2300497f, 0.2334454f, 0.2368381f, 0.2402280f, + 0.2436150f, 0.2469990f, 0.2503800f, 0.2537579f, 0.2571328f, 0.2605045f, 0.2638730f, 0.2672384f, 0.2706004f, 0.2739592f, 0.2773147f, 0.2806667f, 0.2840153f, 0.2873605f, + 0.2907022f, 0.2940403f, 0.2973749f, 0.3007058f, 0.3040331f, 0.3073566f, 0.3106764f, 0.3139925f, 0.3173047f, 0.3206130f, 0.3239174f, 0.3272179f, 0.3305144f, 0.3338069f, + 0.3370953f, 0.3403796f, 0.3436597f, 0.3469357f, 0.3502074f, 0.3534748f, 0.3567380f, 0.3599968f, 0.3632512f, 0.3665012f, 0.3697468f, 0.3729878f, 0.3762243f, 0.3794562f, + 0.3826834f, 0.3859060f, 0.3891240f, 0.3923371f, 0.3955455f, 0.3987491f, 0.4019478f, 0.4051416f, 0.4083305f, 0.4115144f, 0.4146932f, 0.4178671f, 0.4210358f, 0.4241994f, + 0.4273579f, 0.4305111f, 0.4336591f, 0.4368018f, 0.4399392f, 0.4430712f, 0.4461978f, 0.4493190f, 0.4524347f, 0.4555449f, 0.4586496f, 0.4617486f, 0.4648420f, 0.4679298f, + 0.4710119f, 0.4740882f, 0.4771588f, 0.4802235f, 0.4832824f, 0.4863354f, 0.4893825f, 0.4924236f, 0.4954587f, 0.4984877f, 0.5015107f, 0.5045276f, 0.5075384f, 0.5105429f, + 0.5135413f, 0.5165333f, 0.5195191f, 0.5224986f, 0.5254717f, 0.5284383f, 0.5313986f, 0.5343523f, 0.5372996f, 0.5402403f, 0.5431744f, 0.5461020f, 0.5490228f, 0.5519370f, + 0.5548444f, 0.5577451f, 0.5606390f, 0.5635260f, 0.5664062f, 0.5692795f, 0.5721459f, 0.5750053f, 0.5778576f, 0.5807030f, 0.5835412f, 0.5863724f, 0.5891964f, 0.5920132f, + 0.5948228f, 0.5976251f, 0.6004202f, 0.6032080f, 0.6059884f, 0.6087614f, 0.6115270f, 0.6142852f, 0.6170359f, 0.6197790f, 0.6225146f, 0.6252427f, 0.6279631f, 0.6306758f, + 0.6333809f, 0.6360782f, 0.6387678f, 0.6414496f, 0.6441236f, 0.6467898f, 0.6494480f, 0.6520984f, 0.6547408f, 0.6573752f, 0.6600017f, 0.6626200f, 0.6652304f, 0.6678326f, + 0.6704266f, 0.6730125f, 0.6755902f, 0.6781597f, 0.6807209f, 0.6832738f, 0.6858184f, 0.6883546f, 0.6908824f, 0.6934018f, 0.6959128f, 0.6984153f, 0.7009093f, 0.7033947f, + 0.7058716f, 0.7083398f, 0.7107995f, 0.7132504f, 0.7156927f, 0.7181263f, 0.7205511f, 0.7229671f, 0.7253744f, 0.7277728f, 0.7301623f, 0.7325429f, 0.7349146f, 0.7372773f, + 0.7396311f, 0.7419758f, 0.7443115f, 0.7466382f, 0.7489557f, 0.7512641f, 0.7535634f, 0.7558535f, 0.7581343f, 0.7604060f, 0.7626683f, 0.7649214f, 0.7671652f, 0.7693996f, + 0.7716246f, 0.7738402f, 0.7760464f, 0.7782431f, 0.7804304f, 0.7826082f, 0.7847764f, 0.7869350f, 0.7890841f, 0.7912235f, 0.7933533f, 0.7954735f, 0.7975839f, 0.7996847f, + 0.8017756f, 0.8038569f, 0.8059283f, 0.8079899f, 0.8100416f, 0.8120835f, 0.8141155f, 0.8161376f, 0.8181497f, 0.8201519f, 0.8221440f, 0.8241262f, 0.8260983f, 0.8280603f, + 0.8300123f, 0.8319541f, 0.8338858f, 0.8358074f, 0.8377187f, 0.8396199f, 0.8415108f, 0.8433914f, 0.8452618f, 0.8471219f, 0.8489717f, 0.8508111f, 0.8526402f, 0.8544588f, + 0.8562671f, 0.8580649f, 0.8598523f, 0.8616292f, 0.8633956f, 0.8651514f, 0.8668967f, 0.8686315f, 0.8703557f, 0.8720693f, 0.8737722f, 0.8754645f, 0.8771462f, 0.8788171f, + 0.8804774f, 0.8821269f, 0.8837656f, 0.8853936f, 0.8870108f, 0.8886172f, 0.8902128f, 0.8917975f, 0.8933714f, 0.8949344f, 0.8964864f, 0.8980276f, 0.8995578f, 0.9010770f, + 0.9025853f, 0.9040825f, 0.9055688f, 0.9070440f, 0.9085082f, 0.9099613f, 0.9114033f, 0.9128342f, 0.9142540f, 0.9156626f, 0.9170601f, 0.9184464f, 0.9198215f, 0.9211854f, + 0.9225381f, 0.9238795f, 0.9252097f, 0.9265286f, 0.9278363f, 0.9291326f, 0.9304176f, 0.9316912f, 0.9329535f, 0.9342045f, 0.9354440f, 0.9366722f, 0.9378889f, 0.9390943f, + 0.9402881f, 0.9414705f, 0.9426415f, 0.9438010f, 0.9449489f, 0.9460854f, 0.9472103f, 0.9483237f, 0.9494255f, 0.9505157f, 0.9515944f, 0.9526615f, 0.9537170f, 0.9547608f, + 0.9557930f, 0.9568136f, 0.9578225f, 0.9588197f, 0.9598053f, 0.9607792f, 0.9617413f, 0.9626917f, 0.9636305f, 0.9645574f, 0.9654726f, 0.9663761f, 0.9672678f, 0.9681476f, + 0.9690157f, 0.9698720f, 0.9707165f, 0.9715491f, 0.9723699f, 0.9731789f, 0.9739760f, 0.9747612f, 0.9755345f, 0.9762960f, 0.9770456f, 0.9777832f, 0.9785090f, 0.9792228f, + 0.9799247f, 0.9806147f, 0.9812927f, 0.9819587f, 0.9826128f, 0.9832549f, 0.9838850f, 0.9845032f, 0.9851093f, 0.9857035f, 0.9862856f, 0.9868557f, 0.9874138f, 0.9879599f, + 0.9884939f, 0.9890159f, 0.9895258f, 0.9900237f, 0.9905095f, 0.9909832f, 0.9914449f, 0.9918944f, 0.9923319f, 0.9927573f, 0.9931706f, 0.9935719f, 0.9939610f, 0.9943379f, + 0.9947028f, 0.9950556f, 0.9953962f, 0.9957247f, 0.9960411f, 0.9963453f, 0.9966374f, 0.9969173f, 0.9971851f, 0.9974408f, 0.9976843f, 0.9979156f, 0.9981348f, 0.9983418f, + 0.9985367f, 0.9987194f, 0.9988899f, 0.9990482f, 0.9991944f, 0.9993284f, 0.9994502f, 0.9995599f, 0.9996573f, 0.9997426f, 0.9998157f, 0.9998766f, 0.9999254f, 0.9999619f, + 0.9999863f, 0.9999985f +}; + +const float dft_win_8k[70] = +{ + 0.0112197f, 0.0336536f, 0.0560704f, 0.0784591f, 0.1008082f, 0.1231066f, 0.1453430f, 0.1675062f, 0.1895851f, 0.2115685f, 0.2334454f, 0.2552047f, 0.2768355f, 0.2983269f, + 0.3196681f, 0.3408484f, 0.3618570f, 0.3826834f, 0.4033172f, 0.4237478f, 0.4439651f, 0.4639588f, 0.4837189f, 0.5032354f, 0.5224986f, 0.5414986f, 0.5602260f, 0.5786713f, + 0.5968252f, 0.6146786f, 0.6322225f, 0.6494480f, 0.6663466f, 0.6829096f, 0.6991287f, 0.7149958f, 0.7305029f, 0.7456422f, 0.7604060f, 0.7747869f, 0.7887777f, 0.8023713f, + 0.8155609f, 0.8283398f, 0.8407016f, 0.8526402f, 0.8641494f, 0.8752234f, 0.8858568f, 0.8960441f, 0.9057802f, 0.9150603f, 0.9238795f, 0.9322336f, 0.9401183f, 0.9475296f, + 0.9544637f, 0.9609173f, 0.9668870f, 0.9723699f, 0.9773632f, 0.9818643f, 0.9858710f, 0.9893813f, 0.9923935f, 0.9949059f, 0.9969173f, 0.9984268f, 0.9994336f, 0.9999371f +}; + + +/*------------------------------------------------------------------------- + * stereo CNA tables + *------------------------------------------------------------------------*/ + +const int16_t cna_init_bands[CNA_INIT_NBANDS + 1] = +{ + 1, 4, 14, 33, 67, 171, 320 +}; + +const float max_smooth_gains1[SBA_DIRAC_STEREO_NUM_BANDS] = +{ + 0.98f, 0.97f, 0.95f, 0.9f, 0.9f, 0.9f, 0.9f, 0.9f, 0.9f, 0.9f, 0.9f, 0.9f +}; + +const float min_smooth_gains1[SBA_DIRAC_STEREO_NUM_BANDS] = +{ + 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f +}; + +const float max_smooth_gains2[SBA_DIRAC_STEREO_NUM_BANDS] = +{ + 0.75f, 0.75f, 0.75f, 0.75f, 0.75f, 0.75f, 0.75f, 0.75f, 0.75f, 0.9f, 0.9f, 0.9f}; + +const float min_smooth_gains2[SBA_DIRAC_STEREO_NUM_BANDS] = +{ + 0.5f, 0.5f, 0.5, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.3f, 0.3f, 0.3f +}; + +/*------------------------------------------------------------------------- + * ECLVQ Stereo ROM tables + *------------------------------------------------------------------------*/ + + /* all the "probability" tables for the actual AC are in the reversed cumulative counts table format; + for example, given the counts table [c0 | c1 | c2 | c3] with c0 + c1 + c2 + c3 = 2 ^ 14, the reversed cumulative + counts table is [2 ^ 14 | 2 ^ 14 - c0 | 2 ^ 14 - c0 - c1 | 2 ^ 14 - c0 - c1 - c2 | 2 ^ 14 - c0 - c1 - c2 - c3] */ +const uint16_t cum_freq_ECSQ_tab_param[ECSQ_CONFIG_COUNT][1 + ECSQ_PARAM_COUNT] = +{ + {0,1024,2048,3072,4096,5120,6144,7168,8192,9216,10240,11264,12288,13312,14336,15360,16384 }, + {0,9294,16019,16213,16311,16346,16363,16371,16375,16377,16378,16379,16380,16381,16382,16383,16384 }, + {0,4250,14782,16048,16331,16373,16374,16375,16376,16377,16378,16379,16380,16381,16382,16383,16384 }, + {0,9273,15897,16198,16311,16347,16364,16372,16376,16377,16378,16379,16380,16381,16382,16383,16384 }, + {0,5298,14622,15756,16305,16353,16374,16375,16376,16377,16378,16379,16380,16381,16382,16383,16384 }, + {0,9444,15751,16198,16310,16346,16363,16371,16375,16377,16378,16379,16380,16381,16382,16383,16384 }, + {0,5836,14448,15610,16267,16343,16374,16375,16376,16377,16378,16379,16380,16381,16382,16383,16384 } +}; + +const uint16_t sym_freq_ECSQ_tab_param[ECSQ_CONFIG_COUNT][ECSQ_PARAM_COUNT] = +{ + {1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024 }, + {9294,6725,194,98,35,17,8,4,2,1,1,1,1,1,1,1 }, + {4250,10532,1266,283,42,1,1,1,1,1,1,1,1,1,1,1 }, + {9273,6624,301,113,36,17,8,4,1,1,1,1,1,1,1,1 }, + {5298,9324,1134,549,48,21,1,1,1,1,1,1,1,1,1,1 }, + {9444,6307,447,112,36,17,8,4,2,1,1,1,1,1,1,1 }, + {5836,8612,1162,657,76,31,1,1,1,1,1,1,1,1,1,1 } +}; + +const uint16_t cum_freq_ECSQ_tab_vals[ECSQ_PARAM_COUNT - 1][1 + ECSQ_TAB_VALS_SIZE] = +{ + {0,6445,12725,15035,15885,16198,16313,16355,16370,16376,16378,16379,16380,16381,16382,16383,16384 }, + {0,3624,8645,11690,13537,14657,15336,15748,15998,16150,16242,16298,16332,16352,16364,16372,16384 }, + {0,1925,5123,7614,9554,11065,12242,13158,13872,14428,14861,15198,15460,15664,15823,15947,16384 }, + {0,2801,5806,8146,9968,11387,12492,13353,14023,14545,14952,15269,15516,15708,15858,15974,16384 }, + {0,3219,6131,8399,10165,11541,12612,13446,14096,14602,14996,15303,15542,15728,15873,15986,16384 }, + {0,3423,6290,8523,10262,11616,12671,13493,14133,14631,15019,15321,15556,15739,15882,15993,16384 }, + {0,3524,6369,8584,10309,11653,12699,13514,14149,14643,15028,15328,15562,15744,15886,15996,16384 }, + {0,3574,6408,8615,10334,11672,12714,13526,14158,14650,15033,15332,15565,15746,15887,15997,16384 }, + {0,3599,6427,8630,10345,11681,12721,13531,14162,14653,15036,15334,15566,15747,15888,15998,16384 }, + {0,3612,6437,8637,10351,11685,12724,13533,14163,14654,15036,15334,15566,15747,15888,15998,16384 }, + {0,3618,6442,8641,10354,11688,12727,13536,14166,14657,15039,15337,15569,15749,15890,15999,16384 }, + {0,3621,6444,8643,10355,11689,12728,13537,14167,14658,15040,15338,15570,15750,15890,15999,16384 }, + {0,3623,6446,8644,10356,11689,12727,13536,14166,14657,15039,15337,15569,15749,15890,15999,16384 }, + {0,3623,6446,8644,10356,11689,12727,13536,14166,14657,15039,15337,15569,15749,15890,15999,16384 }, + {0,3623,6446,8644,10356,11689,12727,13536,14166,14657,15039,15337,15569,15749,15890,15999,16384 }, +}; + +const uint16_t sym_freq_ECSQ_tab_vals[ECSQ_PARAM_COUNT - 1][ECSQ_TAB_VALS_SIZE] = +{ + {6445,6280,2310,850,313,115,42,15,6,2,1,1,1,1,1,1 }, + {3624,5021,3045,1847,1120,679,412,250,152,92,56,34,20,12,8,12 }, + {1925,3198,2491,1940,1511,1177,916,714,556,433,337,262,204,159,124,437 }, + {2801,3005,2340,1822,1419,1105,861,670,522,407,317,247,192,150,116,410 }, + {3219,2912,2268,1766,1376,1071,834,650,506,394,307,239,186,145,113,398 }, + {3423,2867,2233,1739,1354,1055,822,640,498,388,302,235,183,143,111,391 }, + {3524,2845,2215,1725,1344,1046,815,635,494,385,300,234,182,142,110,388 }, + {3574,2834,2207,1719,1338,1042,812,632,492,383,299,233,181,141,110,387 }, + {3599,2828,2203,1715,1336,1040,810,631,491,383,298,232,181,141,110,386 }, + {3612,2825,2200,1714,1334,1039,809,630,491,382,298,232,181,141,110,386 }, + {3618,2824,2199,1713,1334,1039,809,630,491,382,298,232,180,141,109,385 }, + {3621,2823,2199,1712,1334,1039,809,630,491,382,298,232,180,140,109,385 }, + {3623,2823,2198,1712,1333,1038,809,630,491,382,298,232,180,141,109,385 }, + {3623,2823,2198,1712,1333,1038,809,630,491,382,298,232,180,141,109,385 }, + {3623,2823,2198,1712,1333,1038,809,630,491,382,298,232,180,141,109,385 }, +}; + +const uint16_t cum_freq_ECSQ_tab_abs_1bit[1 + 2] = +{ + 0, 5462, 16384 +}; + +/* table for uniform coding of absolute values in {0, +-1, +-2, +-3} */ +const uint16_t cum_freq_ECSQ_tab_abs_2bit[1 + 4] = +{ + 0, 2338, 7020, 11702, 16384 +}; + +/* table for uniform coding of absolute values in {0, +-1, ..., +-7} */ +const uint16_t cum_freq_ECSQ_tab_abs_3bit[1 + 8] = +{ + 0, 1096, 3280, 5464, 7648, 9832, 12016, 14200, 16384 +}; + +/* table for uniform coding of absolute values in {0, +-1, ..., +-15} */ +const uint16_t cum_freq_ECSQ_tab_abs_4bit[1 + 16] = +{ + 0, 514, 1572, 2630, 3688, 4746, 5804, 6862, 7920, 8978, 10036, 11094, 12152, 13210, 14268, 15326, 16384 +}; + +const uint16_t sym_freq_ECSQ_tab_abs_1bit[2] = +{ + 5462, 10922 +}; + +/* table for uniform coding of absolute values in {0, +-1, +-2, +-3} */ +const uint16_t sym_freq_ECSQ_tab_abs_2bit[4] = +{ + 2338, 4682, 4682, 4682 +}; + +/* table for uniform coding of absolute values in {0, +-1, ..., +-7} */ +const uint16_t sym_freq_ECSQ_tab_abs_3bit[8] = +{ + 1096, 2184, 2184, 2184, 2184, 2184, 2184, 2184 +}; + +/* table for uniform coding of absolute values in {0, +-1, ..., +-15} */ +const uint16_t sym_freq_ECSQ_tab_abs_4bit[16] = +{ + 514, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058 +}; + +/* array of tables for uniform coding of absolute values */ +const uint16_t * const cum_freq_ECSQ_tab_abs_lsbs[1 + 4] = +{ + NULL, cum_freq_ECSQ_tab_abs_1bit, cum_freq_ECSQ_tab_abs_2bit, cum_freq_ECSQ_tab_abs_3bit, cum_freq_ECSQ_tab_abs_4bit +}; + +const uint16_t * const sym_freq_ECSQ_tab_abs_lsbs[1 + 4] = +{ + NULL, sym_freq_ECSQ_tab_abs_1bit, sym_freq_ECSQ_tab_abs_2bit, sym_freq_ECSQ_tab_abs_3bit, sym_freq_ECSQ_tab_abs_4bit +}; + + +/*----------------------------------------------------------------------------------* + * DirAC ROM tables + *----------------------------------------------------------------------------------*/ + +const float ls_azimuth_4d4[8] = { 45.0f, -45.0f, 135.0f, -135.0f, 45.0f, -45.0f, 135.0f, -135.0f }; + +const float ls_elevation_4d4[8] = { 0.0f, 0.0f, 0.0f, 0.0f, 35.0f, 35.0f, 35.0f, 35.0f }; + +const float diffuse_response_CICP6[5] = { 0.4219f, 0.4219f, 0.3704f, 0.5034f, 0.5034f }; + +const float diffuse_response_CICP14[7] = { 0.3817f, 0.3817f, 0.2819f, 0.5399f, 0.5399f, 0.1519f, 0.1519f }; + +const float diffuse_response_CICP16[9] = { 0.3456f, 0.3456f, 0.3035f, 0.4124f, 0.4124f, 0.2702f, 0.2702f, 0.3023f, 0.3023f }; + + +const float dirac_dithering_azi_scale[DIRAC_DIFFUSE_LEVELS] = +{ + 6.716062e-01f, 1.011837e+00f, 1.799065e+00f, 2.824915e+00f, 4.800879e+00f, 9.206031e+00f, 1.469832e+01f, 2.566224e+01f +}; + +const float dirac_dithering_ele_scale[DIRAC_DIFFUSE_LEVELS] = +{ + 6.716062e-01f, 1.011804e+00f, 1.796875e+00f, 2.804382e+00f, 4.623130e+00f, 7.802667e+00f, 1.045446e+01f, 1.379538e+01f +}; + +const int16_t ap_pre_delay[DIRAC_DECORR_NUM_SPLIT_BANDS] = { 7, 2, 1 }; + +const int16_t ap_filter_length[DIRAC_DECORR_NUM_SPLIT_BANDS] = { 15, 6, 3 }; + +const float ap_lattice_delta_phi[DIRAC_MAX_NUM_DECORR_FILTERS*DIRAC_MAX_DECORR_FILTER_LEN] = +{ + 1.802519f, 0.922986f, 1.813685f, 1.272828f, 0.856928f, 0.366571f, 1.531249f, 1.318158f, 0.123812f, 0.897173f, 0.958696f, 1.256384f, 0.179677f, 0.668918f, 1.440292f, 1.573058f, 1.396481f, 1.191463f, 0.444143f, 1.666942f, + 1.273955f, 1.747171f, 1.408330f, 1.002782f, 1.559302f, 1.782992f, 1.474896f, 0.813181f, 1.457724f, 0.588531f, 1.384302f, 0.156493f, 0.600048f, 1.661632f, 0.538958f, 0.645429f, 0.565237f, 0.024684f, 0.264229f, 0.062140f, + 1.235343f, 0.851725f, 1.820211f, 0.116148f, 0.972111f, 0.488703f, 1.777672f, 1.452170f, 0.814134f, 1.272649f, 1.281416f, 0.101871f, 0.897888f, 0.199760f, 0.085732f, 1.686579f, 0.964558f, 0.057281f, 0.910252f, 1.662302f, + 0.955234f, 0.834348f, 1.672478f, 1.324896f, 0.444544f, 1.721172f, 0.153356f, 1.602240f, 0.171880f, 1.169774f, 0.543628f, 1.409581f, 1.763724f, 1.686754f, 1.210390f, 0.402691f, 0.983618f, 0.862997f, 1.220409f, 0.890061f, + 0.031641f, 0.461590f, 1.719550f, 1.357698f, 1.112262f, 1.166531f, 0.246097f, 1.387325f, 0.177485f, 1.446268f, 0.799476f, 1.667227f, 1.723465f, 1.505920f, 0.245874f, 1.155854f, 0.831394f, 0.677194f, 0.568871f, 1.652070f, + 0.019803f, 1.197794f, 0.635553f, 0.531682f, 0.878194f, 0.048050f, 0.080480f, 1.566743f, 0.724210f, 0.853668f, 1.741191f, 0.698465f, 1.553550f, 0.130290f, 0.688346f, 1.331091f, 0.599759f, 1.125466f, 1.764818f, 1.042879f, + 1.486589f, 1.627971f, 1.871181f, 0.102359f, 0.035021f, 1.403176f, 1.468675f, 0.190347f, 0.553282f, 1.031227f, 1.232390f, 1.255724f, 1.504443f, 0.683526f, 0.600958f, 1.746936f, 1.529243f, 1.448196f, 0.646850f, 0.116053f, + 1.283295f, 0.355220f, 1.380620f, 1.858453f, 0.818804f, 0.219006f, 0.476292f, 0.420029f, 1.291187f, 0.568738f, 1.174088f, 0.628805f, 1.753154f, 1.459582f, 1.354449f, 1.755790f, 0.441757f, 0.856240f, 1.647962f, 0.686353f, + 1.395289f, 0.699934f, 0.239310f, 0.239535f, 0.958190f, 0.748780f, 0.513784f, 1.666344f, 1.461995f, 1.599060f, 0.893107f, 0.341873f, 1.387703f, 1.808363f, 0.676542f, 1.424958f, 0.310574f, 0.836247f, 1.011101f, 1.686200f, + 1.823432f, 0.994827f, 1.635555f, 0.684380f, 1.017029f, 1.440371f, 1.694641f, 0.607132f, 1.197331f, 0.862161f, 0.666449f, 1.047956f, 0.159627f, 0.043131f, 1.251515f, 1.618724f, 0.216906f, 0.152250f, 0.471610f, 0.744260f, + 0.576810f, 1.632177f, 1.556912f, 1.866317f, 0.568088f, 1.541817f, 1.726725f, 0.275154f, 0.814958f, 0.863399f, 1.333040f, 0.148277f, 0.197893f, 1.048665f, 1.158090f, 1.692225f, 0.884294f, 0.289619f, 0.380633f, 1.728234f, + 1.433213f, 1.749505f, 1.533837f, 0.669701f, 0.372580f, 1.052390f, 1.116645f, 0.181320f, 1.139126f, 0.222671f, 0.604393f, 1.811797f, 1.743315f, 1.368792f, 1.861434f, 0.751908f, 0.159811f, 1.566503f, 0.443273f, 1.667530f, + 1.083060f, 1.243136f, 0.717777f, 0.675019f, 0.690490f, 0.672228f, 1.060789f, 0.423566f, 1.198457f, 0.485768f, 0.993953f, 0.443540f, 0.361702f, 1.552042f, 0.863562f, 1.517677f, 1.061899f, 0.691413f, 1.642818f, 1.756590f, + 0.278323f, 0.790363f, 0.172303f, 0.417138f, 0.009343f, 0.783325f, 1.369303f, 1.041067f, 0.467102f, 0.992773f, 1.525170f, 0.871213f, 0.243906f, 1.542036f, 0.449148f, 0.843633f, 0.191800f, 1.614246f, 1.038188f, 1.415620f, + 0.551081f, 0.382599f, 1.410121f, 0.102084f, 0.137286f, 0.671081f, 0.254860f, 1.758068f, 1.079013f, 0.129143f, 1.410873f, 0.150485f, 0.601119f, 0.760737f, 0.975905f, 0.223261f, 0.710162f, 1.677048f, 0.996836f, 1.849865f, + 1.536222f, 0.089016f, 0.960881f, 0.388690f, 0.379955f, 1.002223f, 1.271420f, 1.410632f, 0.254397f, 1.535559f, 1.133703f, 1.305280f, 1.466565f, 0.274167f, 0.399688f, 1.359638f, 1.766289f, 1.401348f, 1.310883f, 0.261030f, + 1.314825f, 1.538635f, 1.317986f, 1.243167f, 1.749461f, 1.689706f, 0.024853f, 0.634754f, 1.036317f, 1.828101f, 1.676951f, 0.023606f, 0.857000f, 0.076471f, 1.622198f, 0.254469f, 1.451625f, 1.720881f, 0.763812f, 0.186982f, + 0.056994f, 0.590507f, 0.375291f, 1.609261f, 0.607721f, 0.026355f, 0.483366f, 0.823931f, 0.792878f, 0.163577f, 0.753588f, 0.730789f, 0.135991f, 1.031660f, 1.554135f, 1.192863f, 0.016693f, 0.125796f, 1.017920f, 1.591773f, + 0.575956f, 0.112943f, 0.249506f, 1.399570f, 0.053241f, 1.410759f, 0.251638f, 1.059086f, 0.025315f, 1.422914f, 1.030412f, 0.848758f, 0.317396f, 1.375456f, 1.116858f, 1.682310f, 0.279550f, 0.325974f, 0.937704f, 1.744329f, + 0.447773f, 1.024286f, 1.001528f, 1.863684f, 1.278323f, 0.860699f, 1.346331f, 1.692596f, 0.022627f, 1.033613f, 0.546354f, 0.395804f, 1.486546f, 1.381045f, 1.312260f, 0.245976f, 1.607429f, 1.818793f, 0.964359f, 1.496598f, + 0.669967f, 1.535929f, 1.841878f, 0.979127f, 0.614002f, 1.879218f, 0.512531f, 1.167061f, 0.081697f, 1.773427f, 1.535668f, 0.757729f, 0.220395f, 1.538243f, 1.281162f, 0.302159f, 0.889871f, 0.798522f, 1.476288f, 1.665941f, + 0.915365f, 1.394094f, 0.757041f, 0.350064f, 1.199679f, 1.319499f, 1.128405f, 0.632337f, 0.790673f, 0.461582f, 1.693343f, 1.537442f, 0.346527f, 0.433782f, 1.754552f, 0.550903f, 0.686724f, 0.764433f, 1.792750f, 1.489998f +}; + +const float ap_lattice_coeffs_1[DIRAC_DECORR_FILTER_LEN_1*DIRAC_MAX_NUM_DECORR_FILTERS] = +{ + 0.795329f, 0.502700f, 0.204456f, 0.416566f, 0.459648f, 0.270454f, -0.201944f, 0.027997f, 0.067811f, -0.052627f, -0.038779f, -0.057387f, 0.020480f, 0.367697f, -0.593705f, + 0.533667f, 0.202500f, -0.001953f, 0.195081f, -0.184458f, -0.233867f, 0.228100f, -0.329293f, -0.338714f, -0.079700f, 0.052389f, -0.009468f, 0.178807f, 0.190843f, -0.478877f, + 0.044022f, 0.788498f, 0.133529f, -0.173657f, 0.545391f, 0.681431f, 0.332868f, 0.294685f, 0.325261f, 0.047617f, 0.157401f, 0.116272f, 0.218980f, -0.189248f, -0.317401f, + -0.753681f, 0.772385f, -0.507384f, 0.276980f, -0.692775f, 0.232302f, -0.354759f, -0.015620f, -0.223059f, 0.310506f, -0.035034f, 0.085783f, -0.499998f, 0.215260f, 0.201415f, + -0.495551f, -0.301660f, 0.196510f, 0.326147f, -0.594364f, 0.314921f, 0.668671f, 0.076643f, 0.045711f, -0.124790f, -0.203272f, -0.297190f, 0.125806f, -0.179483f, -0.201757f, + 0.161128f, 0.396050f, 0.266897f, 0.356586f, 0.488145f, -0.056254f, 0.139280f, -0.296405f, -0.112844f, 0.037405f, -0.367425f, -0.216292f, -0.277360f, 0.389420f, 0.115115f, + -0.240449f, -0.271015f, 0.426720f, -0.011059f, 0.151813f, 0.253490f, 0.225764f, 0.498716f, -0.136377f, 0.443004f, -0.305017f, -0.031310f, -0.010765f, 0.170349f, 0.496478f, + -0.139875f, -0.241998f, -0.104850f, 0.294343f, -0.067728f, -0.492202f, -0.487610f, 0.036395f, 0.109393f, 0.396155f, -0.352845f, -0.205913f, -0.082999f, -0.463033f, -0.309296f, + 0.025886f, -0.092456f, -0.125139f, -0.156117f, -0.004887f, 0.178440f, 0.089586f, 0.044827f, 0.238219f, -0.312120f, -0.390688f, -0.178543f, 0.454418f, 0.387012f, -0.388874f, + -0.197797f, 0.035540f, 0.455388f, -0.054410f, 0.380035f, 0.290964f, 0.048804f, 0.078637f, 0.221740f, -0.217548f, 0.121289f, -0.396681f, -0.218482f, -0.127265f, -0.269507f, + -0.344218f, -0.465038f, -0.421415f, -0.026031f, 0.221547f, 0.361993f, -0.348243f, 0.294983f, 0.366175f, 0.070663f, -0.086050f, 0.252129f, 0.156066f, -0.062800f, 0.408972f, + 0.242461f, -0.301764f, -0.066160f, 0.388651f, -0.462227f, -0.158880f, 0.230796f, -0.093179f, 0.047076f, 0.073402f, -0.335018f, 0.022940f, 0.354611f, 0.072391f, 0.019473f, + 0.336900f, -0.480534f, 0.170267f, 0.259663f, -0.393576f, -0.348588f, -0.108962f, 0.278842f, 0.385490f, 0.362249f, -0.318739f, 0.362305f, 0.288936f, 0.291204f, -0.278019f, + -0.449302f, -0.288513f, -0.413973f, -0.405279f, -0.295152f, -0.245110f, 0.002530f, 0.287890f, 0.348229f, -0.178354f, -0.206517f, 0.351081f, -0.482205f, 0.021360f, -0.492207f, + 0.048642f, 0.453282f, 0.109160f, 0.232599f, -0.473781f, 0.140502f, 0.352527f, -0.098606f, 0.147172f, -0.055797f, 0.107739f, -0.231026f, 0.357310f, 0.348031f, 0.232404f, + -0.324788f, 0.162480f, 0.057647f, -0.060734f, -0.009742f, -0.224185f, -0.282355f, -0.065443f, 0.064697f, 0.280370f, -0.284906f, -0.470501f, 0.019484f, -0.442308f, 0.377214f, + 0.447384f, -0.290498f, 0.345528f, 0.370207f, -0.313120f, 0.119592f, 0.300014f, 0.406995f, -0.277922f, 0.447039f, 0.194824f, 0.157703f, -0.223402f, -0.147167f, 0.379073f, + -0.216342f, 0.137967f, -0.397180f, 0.073905f, -0.273110f, -0.443037f, -0.168327f, 0.346264f, 0.037543f, 0.065387f, 0.163901f, -0.122523f, 0.365477f, -0.316321f, 0.117273f, + -0.301282f, 0.169625f, -0.336466f, 0.269914f, -0.420160f, -0.331296f, 0.498523f, -0.393009f, -0.462184f, -0.323097f, 0.470977f, -0.359463f, 0.264315f, 0.216797f, 0.493400f, + 0.151489f, -0.321653f, 0.464413f, -0.355673f, 0.420401f, 0.184297f, -0.302128f, 0.136536f, -0.252849f, 0.193906f, 0.298775f, 0.238808f, -0.386298f, -0.181999f, -0.077326f, + 0.124840f, -0.263394f, 0.389606f, 0.004502f, 0.339804f, 0.415204f, 0.377751f, 0.400221f, 0.352426f, -0.003808f, -0.184530f, 0.433348f, -0.237554f, 0.147684f, 0.407210f, + 0.067616f, -0.249313f, -0.354010f, 0.320937f, 0.426000f, 0.309576f, -0.189689f, -0.209447f, 0.158967f, -0.081929f, 0.386828f, 0.178582f, -0.407143f, 0.222189f, -0.149097f +}; + +const float ap_lattice_coeffs_2[DIRAC_DECORR_FILTER_LEN_2*DIRAC_MAX_NUM_DECORR_FILTERS] = +{ + 0.633692f, 0.681207f, -0.049418f, 0.286715f, 0.146022f, 0.135402f, + -0.410145f, -0.206766f, -0.656968f, -0.101746f, 0.436299f, 0.339818f, + -0.131383f, -0.773746f, -0.301627f, 0.327561f, 0.332227f, 0.205858f, + 0.717602f, -0.552370f, -0.150136f, 0.054556f, 0.239519f, -0.648477f, + -0.721848f, 0.189377f, 0.068185f, 0.006216f, 0.077025f, 0.038678f, + 0.423415f, -0.108658f, 0.432050f, -0.414641f, 0.277840f, 0.418486f, + 0.077811f, -0.283063f, -0.357008f, 0.004634f, -0.442640f, -0.372315f, + 0.403336f, 0.243023f, 0.314367f, 0.444513f, 0.347517f, 0.496043f, + 0.108408f, 0.469382f, -0.170286f, 0.326310f, 0.172157f, 0.440334f, + 0.058417f, 0.339673f, -0.194965f, 0.491219f, -0.281296f, -0.043120f, + -0.482487f, -0.335005f, -0.336159f, 0.196469f, -0.164623f, 0.442491f, + -0.135190f, -0.354385f, 0.452133f, -0.311221f, -0.347640f, 0.498342f, + -0.288999f, 0.376431f, -0.177924f, 0.195542f, 0.333872f, -0.152697f, + 0.053230f, 0.457767f, 0.442476f, 0.235254f, -0.345159f, -0.286098f, + 0.155438f, 0.405393f, 0.217073f, -0.107960f, 0.010698f, 0.368987f, + -0.498358f, -0.495816f, -0.215479f, -0.093869f, 0.320276f, -0.013842f, + 0.489406f, 0.470814f, -0.065834f, 0.346871f, 0.027279f, 0.150086f, + 0.484013f, -0.497391f, 0.168796f, -0.493841f, -0.173528f, 0.334676f, + 0.264235f, -0.424651f, -0.314926f, 0.253086f, 0.397381f, -0.491565f, + -0.453727f, -0.463358f, -0.019128f, 0.000344f, 0.315432f, 0.472345f, + 0.095139f, 0.283375f, -0.225088f, -0.119762f, -0.476871f, 0.037525f, + 0.336951f, 0.494511f, -0.062603f, 0.177652f, 0.463892f, 0.489286f +}; + +const float ap_lattice_coeffs_3[DIRAC_DECORR_FILTER_LEN_3*DIRAC_MAX_NUM_DECORR_FILTERS] = +{ + 0.018977f, -0.212205f, 0.422719f, + -0.400657f, -0.106890f, -0.024589f, + 0.140005f, 0.279582f, 0.032357f, + 0.632535f, 0.578535f, -0.734606f, + 0.017182f, 0.013244f, -0.027715f, + -0.353356f, -0.482160f, -0.491265f, + 0.457024f, 0.165122f, 0.469723f, + -0.195705f, 0.440105f, -0.477366f, + 0.360186f, -0.490565f, 0.484623f, + -0.173791f, 0.007543f, 0.278186f, + 0.434416f, 0.060363f, -0.193717f, + -0.033709f, 0.496222f, 0.002939f, + -0.480848f, -0.109552f, -0.023198f, + 0.324679f, -0.292075f, -0.356148f, + -0.366595f, 0.380917f, -0.301741f, + 0.110318f, 0.383789f, 0.303984f, + -0.499685f, -0.349584f, 0.334749f, + -0.020224f, -0.430078f, -0.154705f, + -0.371129f, 0.334080f, 0.346913f, + -0.166781f, -0.229089f, 0.117956f, + 0.341292f, 0.490463f, 0.493655f, + -0.367726f, 0.426528f, -0.045774f +}; + +const float * const ap_lattice_coeffs[DIRAC_DECORR_NUM_SPLIT_BANDS] = +{ + &ap_lattice_coeffs_1[0], + &ap_lattice_coeffs_2[0], + &ap_lattice_coeffs_3[0], +}; + +const float ap_split_frequencies[DIRAC_DECORR_NUM_SPLIT_BANDS + 1] = +{ + 0.0f, 0.125f, 0.375f, 1.0f +}; + +const int16_t sba_map_tc[11] = +{ + 0, 1, 2, 3, 4, 8, 9, 15, 5, 6, 7 +}; +const int16_t sba_map_tc_512[11] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 15 +}; + + +/*----------------------------------------------------------------------------------* + * FASTCONV and PARAMETRIC binaural renderer ROM tables + *----------------------------------------------------------------------------------*/ + +const float dmxmtx_table[BINAURAL_CHANNELS][11] = +{ + { 1.0f, 0.0f, 0.70709997f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f }, + { 0.0f, 1.0f, 0.70709997f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f }, +}; + + + + +/*----------------------------------------------------------------------* + * MC ParamUpmix ROM tables + *-----------------------------------------------------------------------*/ + +/* Alpha Fine Huffman table df0 */ +static const int16_t huff_nodes_first_band_alpha[32][2] = +{ + { -17, 1 }, + { 3, 2 }, + { -16, -18 }, + { 5, 4 }, + { -15, 6 }, + { -19, 7 }, + { 9, 8 }, + { 11, 10 }, + { -14, -20 }, + { 13, 12 }, + { -21, 14 }, + { -13, 15 }, + { 17, 16 }, + { -22, 18 }, + { -12, 19 }, + { -9, -10 }, + { -11, 20 }, + { -23, 21 }, + { -8, 22 }, + { -24, 23 }, + { -25, 24 }, + { -7, 25 }, + { -26, 26 }, + { 28, 27 }, + { -6, -27 }, + { -33, 29 }, + { -1, -28 }, + { -5, 30 }, + { -29, -30 }, + { -4, 31 }, + { -3, -31 }, + { -2, -32 } +}; + +/* Alpha Coarse Huffman table df0 */ +static const int16_t huff_nodes_first_band_alpha_coarse[16][2] = +{ + { -9, 1 }, + { -8, 2 }, + { -10, 3 }, + { 5, 4 }, + { -7, 6 }, + { -11, 7 }, + { -5, 8 }, + { -6, 9 }, + { -12, 10 }, + { -13, 11 }, + { -4, 12 }, + { -14, 13 }, + { -3, 14 }, + { -15, 15 }, + { -2, -16 }, + { -1, -17 } +}; + +/* Alpha Fine Huffman table df */ +static const int16_t huff_nodes_alpha_1D_DF[64][2] = +{ + { -33, 1 }, + { 3, 2 }, + { -32, -34 }, + { 5, 4 }, + { -31, -35 }, + { 7, 6 }, + { -30, 8 }, + { -36, 9 }, + { 11, 10 }, + { -37, 12 }, + { -29, 13 }, + { -28, 14 }, + { -38, 15 }, + { 17, 16 }, + { -27, -39 }, + { 19, 18 }, + { -26, 20 }, + { -40, 21 }, + { 23, 22 }, + { -41, 24 }, + { -25, 25 }, + { -24, 26 }, + { -42, 27 }, + { -43, 28 }, + { -23, 29 }, + { -44, 30 }, + { -22, 31 }, + { -45, 32 }, + { -21, 33 }, + { -20, 34 }, + { -46, 35 }, + { -19, 36 }, + { -47, 37 }, + { -18, -48 }, + { 39, 38 }, + { -17, -49 }, + { 41, 40 }, + { -16, 42 }, + { -1, -50 }, + { -65, 43 }, + { 45, 44 }, + { -51, 46 }, + { -15, 47 }, + { 49, 48 }, + { -52, 50 }, + { -14, 51 }, + { 53, 52 }, + { -13, 54 }, + { -53, 55 }, + { 57, 56 }, + { -12, 58 }, + { -54, 59 }, + { 61, 60 }, + { -55, 62 }, + { -11, 63 }, + { -10, -61 }, + { -5, -57 }, + { -58, -60 }, + { -56, -59 }, + { -4, -6 }, + { -7, -64 }, + { -9, -63 }, + { -3, -8 }, + { -2, -62 } +}; + +/* Alpha Coarse Huffman table df */ +static const int16_t huff_nodes_alpha_1D_DF_coarse[32][2] = +{ + { -17, 1 }, + { -18, 2 }, + { -16, 3 }, + { -15, 4 }, + { -19, 5 }, + { 7, 6 }, + { -14, -20 }, + { 9, 8 }, + { -13, -21 }, + { 11, 10 }, + { -22, 12 }, + { -12, 13 }, + { -23, 14 }, + { -11, 15 }, + { -10, 16 }, + { -24, 17 }, + { -9, -25 }, + { 19, 18 }, + { -26, 20 }, + { -8, 21 }, + { 23, 22 }, + { 25, 24 }, + { -27, 26 }, + { -7, 27 }, + { -1, -33 }, + { -6, 28 }, + { -28, 29 }, + { -29, 30 }, + { -5, -31 }, + { -30, 31 }, + { -3, -4 }, + { -2, -32 } +}; + +/* Alpha Fine Huffman table dt */ +static const int16_t huff_nodes_alpha_1D_DT[64][2] = +{ + { -33, 1 }, + { -34, 2 }, + { -32, 3 }, + { 5, 4 }, + { -31, -35 }, + { 7, 6 }, + { -36, 8 }, + { -30, 9 }, + { 11, 10 }, + { -29, -37 }, + { 13, 12 }, + { 15, 14 }, + { -28, -38 }, + { 17, 16 }, + { -27, -39 }, + { 19, 18 }, + { -40, 20 }, + { -26, 21 }, + { 23, 22 }, + { -25, -41 }, + { 25, 24 }, + { -24, -42 }, + { 27, 26 }, + { -23, -43 }, + { 29, 28 }, + { -22, -44 }, + { 31, 30 }, + { -45, 32 }, + { -21, 33 }, + { -20, 34 }, + { -46, 35 }, + { -47, 36 }, + { -19, 37 }, + { -48, 38 }, + { -18, 39 }, + { 41, 40 }, + { -17, -49 }, + { 43, 42 }, + { -50, 44 }, + { -16, 45 }, + { 47, 46 }, + { -51, 48 }, + { -15, 49 }, + { 51, 50 }, + { -52, -65 }, + { -1, -14 }, + { 53, 52 }, + { -53, 54 }, + { -13, 55 }, + { 57, 56 }, + { -12, 58 }, + { -54, 59 }, + { 61, 60 }, + { -11, -55 }, + { -56, 62 }, + { -10, 63 }, + { -9, -57 }, + { -5, -6 }, + { -58, -61 }, + { -7, -59 }, + { -8, -62 }, + { -4, -60 }, + { -3, -64 }, + { -2, -63 } +}; + +/* Alpha Coarse Huffman table dt */ +static const int16_t huff_nodes_alpha_1D_DT_coarse[32][2] = +{ + { -17, 1 }, + { -18, 2 }, + { -16, 3 }, + { -19, 4 }, + { -15, 5 }, + { 7, 6 }, + { -14, -20 }, + { 9, 8 }, + { -21, 10 }, + { -13, 11 }, + { 13, 12 }, + { -12, -22 }, + { 15, 14 }, + { -11, -23 }, + { 17, 16 }, + { -24, 18 }, + { -10, 19 }, + { -25, 20 }, + { -9, 21 }, + { 23, 22 }, + { -26, 24 }, + { -8, 25 }, + { 27, 26 }, + { -1, -33 }, + { -7, -27 }, + { 29, 28 }, + { -28, 30 }, + { -6, 31 }, + { -5, -29 }, + { -3, -31 }, + { -4, -30 }, + { -2, -32 } +}; + +/* Beta Fine Huffman table df0 */ +static const int16_t huff_nodes_first_band_beta[8][2] = +{ + { -1, 1 }, { -2, 2 }, { -3, 3 }, { -4, 4 }, { -5, 5 }, { -6, 6 }, { -7, 7 }, { -8, -9 } +}; + +/* Beta Coarse Huffman table df0 */ +static const int16_t huff_nodes_first_band_beta_coarse[4][2] = +{ + { -1, 1 }, { -2, 2 }, { -3, 3 }, { -4, -5 } +}; + +/* Beta Fine Huffman table df */ +static const int16_t huff_nodes_beta_1D_DF[16][2] = +{ + { -9, 1 }, { -10, 2 }, { -8, 3 }, { -11, 4 }, { -7, 5 }, { 7, 6 }, { -6, -12 }, { 9, 8 }, { -5, -13 }, { 11, 10 }, { -4, -14 }, { -15, 12 }, { -3, 13 }, { -16, 14 }, { -2, 15 }, { -1, -17 } +}; + +/* Beta Coarse Huffman table df */ +static const int16_t huff_nodes_beta_1D_DF_coarse[8][2] = +{ + { -5, 1 }, { -6, 2 }, { -4, 3 }, { -3, 4 }, { -7, 5 }, { -2, 6 }, { -8, 7 }, { -1, -9 } +}; + +/* Beta Fine Huffman table dt */ +static const int16_t huff_nodes_beta_1D_DT[16][2] = +{ + { -9, 1 }, { -10, 2 }, { -8, 3 }, { -11, 4 }, { -7, 5 }, { 7, 6 }, { -6, -12 }, { -13, 8 }, { -5, 9 }, { -14, 10 }, { -4, 11 }, { -15, 12 }, { -3, 13 }, { -16, 14 }, { -2, 15 }, { -1, -17 } +}; + +/* Beta Coarse Huffman table dt */ +static const int16_t huff_nodes_beta_1D_DT_coarse[8][2] = +{ + { -5, 1 }, { -6, 2 }, { -4, 3 }, { -7, 4 }, { -3, 5 }, { -8, 6 }, { -2, 7 }, { -1, -9 } +}; + +const HUFF_NODE_TABLE ivas_mc_paramupmix_huff_nodes_df0 = +{ + { huff_nodes_first_band_alpha, huff_nodes_first_band_alpha_coarse }, + { huff_nodes_first_band_beta, huff_nodes_first_band_beta_coarse } +}; + +const HUFF_NODE_TABLE ivas_mc_paramupmix_huff_nodes_df = +{ + { huff_nodes_alpha_1D_DF, huff_nodes_alpha_1D_DF_coarse }, + { huff_nodes_beta_1D_DF, huff_nodes_beta_1D_DF_coarse } +}; + +const HUFF_NODE_TABLE ivas_mc_paramupmix_huff_nodes_dt = +{ + { huff_nodes_alpha_1D_DT, huff_nodes_alpha_1D_DT_coarse }, + { huff_nodes_beta_1D_DT, huff_nodes_beta_1D_DT_coarse } +}; + +/* clang-format on */ diff --git a/lib_dec/ivas_rom_dec.h b/lib_dec/ivas_rom_dec.h new file mode 100644 index 0000000000000000000000000000000000000000..24e06eb980dbb232b58968f8c7935efe45776a26 --- /dev/null +++ b/lib_dec/ivas_rom_dec.h @@ -0,0 +1,131 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#ifndef IVAS_ROM_DEC_H +#define IVAS_ROM_DEC_H + +#include +#include "options.h" +#include "cnst.h" +#include "ivas_cnst.h" +#include "ivas_stat_dec.h" + + +/*----------------------------------------------------------------------------------* + * DFT stereo ROM tables + *----------------------------------------------------------------------------------*/ + +extern const float dft_alpha_w_b2[STEREO_DFT_BAND_MAX]; +extern const float dft_alpha_s_b2[STEREO_DFT_BAND_MAX]; +extern const float dft_alpha_s2_b2[STEREO_DFT_BAND_MAX]; +extern const float dft_bpf_weights[]; + +extern const float dft_alpha_w[]; +extern const float dft_alpha_s[]; +extern const float dft_alpha_s2[]; + +extern const float dft_ap_gains[5][3]; +extern const int16_t dft_ap_delays[3][3]; +extern const float dft_res_pred_weights[][STEREO_DFT_BAND_MAX]; + +extern const float dft_win232ms_8k[75]; +extern const float dft_win232ms_12k8[120]; +extern const float dft_win232ms_16k[150]; +extern const float dft_win232ms_32k[300]; +extern const float dft_win232ms_48k[450]; + +extern const float dft_win_8k[70]; + +extern const int16_t cna_init_bands[CNA_INIT_NBANDS + 1]; + +extern const float min_smooth_gains1[SBA_DIRAC_STEREO_NUM_BANDS]; +extern const float max_smooth_gains1[SBA_DIRAC_STEREO_NUM_BANDS]; +extern const float min_smooth_gains2[SBA_DIRAC_STEREO_NUM_BANDS]; +extern const float max_smooth_gains2[SBA_DIRAC_STEREO_NUM_BANDS]; + + +/*----------------------------------------------------------------------------------* + * ECLVQ Stereo ROM tables + *----------------------------------------------------------------------------------*/ + +extern const uint16_t cum_freq_ECSQ_tab_param[ECSQ_CONFIG_COUNT][1 + ECSQ_PARAM_COUNT]; +extern const uint16_t sym_freq_ECSQ_tab_param[ECSQ_CONFIG_COUNT][ECSQ_PARAM_COUNT]; +extern const uint16_t cum_freq_ECSQ_tab_vals[ECSQ_PARAM_COUNT - 1][1 + ECSQ_TAB_VALS_SIZE]; +extern const uint16_t sym_freq_ECSQ_tab_vals[ECSQ_PARAM_COUNT - 1][ECSQ_TAB_VALS_SIZE]; +extern const uint16_t *const cum_freq_ECSQ_tab_abs_lsbs[1 + 4]; +extern const uint16_t *const sym_freq_ECSQ_tab_abs_lsbs[1 + 4]; + + +/*----------------------------------------------------------------------------------* + * DirAC ROM tables + *----------------------------------------------------------------------------------*/ + +extern const float ls_azimuth_4d4[8]; +extern const float ls_elevation_4d4[8]; +extern const float diffuse_response_CICP6[5]; +extern const float diffuse_response_CICP14[7]; +extern const float diffuse_response_CICP16[9]; + + +extern const float dirac_dithering_azi_scale[DIRAC_DIFFUSE_LEVELS]; +extern const float dirac_dithering_ele_scale[DIRAC_DIFFUSE_LEVELS]; + +extern const int16_t ap_pre_delay[DIRAC_DECORR_NUM_SPLIT_BANDS]; +extern const int16_t ap_filter_length[DIRAC_DECORR_NUM_SPLIT_BANDS]; +extern const float ap_lattice_delta_phi[DIRAC_MAX_NUM_DECORR_FILTERS * DIRAC_MAX_DECORR_FILTER_LEN]; +extern const float ap_lattice_coeffs_1[DIRAC_DECORR_FILTER_LEN_1 * DIRAC_MAX_NUM_DECORR_FILTERS]; +extern const float ap_lattice_coeffs_2[DIRAC_DECORR_FILTER_LEN_2 * DIRAC_MAX_NUM_DECORR_FILTERS]; +extern const float ap_lattice_coeffs_3[DIRAC_DECORR_FILTER_LEN_3 * DIRAC_MAX_NUM_DECORR_FILTERS]; +extern const float *const ap_lattice_coeffs[DIRAC_DECORR_NUM_SPLIT_BANDS]; +extern const float ap_split_frequencies[DIRAC_DECORR_NUM_SPLIT_BANDS + 1]; + +extern const int16_t sba_map_tc[11]; +extern const int16_t sba_map_tc_512[11]; + +/*----------------------------------------------------------------------------------* + * FASTCONV and PARAMETRIC binaural renderer ROM tables + *----------------------------------------------------------------------------------*/ + +extern const float dmxmtx_table[BINAURAL_CHANNELS][11]; + + + + +/*----------------------------------------------------------------------* + * MC ParamUpmix ROM tables + *-----------------------------------------------------------------------*/ + +extern const HUFF_NODE_TABLE ivas_mc_paramupmix_huff_nodes_df0; +extern const HUFF_NODE_TABLE ivas_mc_paramupmix_huff_nodes_df; +extern const HUFF_NODE_TABLE ivas_mc_paramupmix_huff_nodes_dt; + +#endif diff --git a/lib_dec/ivas_sba_dec.c b/lib_dec/ivas_sba_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..991fb0658337a2315c3309ba5de29058547785c5 --- /dev/null +++ b/lib_dec/ivas_sba_dec.c @@ -0,0 +1,834 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include "options.h" +#include "cnst.h" +#include "ivas_cnst.h" +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_prot_rend.h" +#include "ivas_rom_com.h" +#include "ivas_rom_dec.h" +#include +#include "wmc_auto.h" + + +/*-------------------------------------------------------------------* + * ivas_sba_set_cna_cng_flag() + * + * Set CNA/CNG flags in IVAS SBA decoder + *-------------------------------------------------------------------*/ + +void ivas_sba_set_cna_cng_flag( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +) +{ + int16_t n, cpe_id; + + if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->nchan_transport == 1 ) + { + /* skip as done in init function */ + /* st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag = 0; */ + /* st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag = 0; */ + } + else if ( st_ivas->nchan_transport == 1 && ( ( st_ivas->renderer_type == RENDERER_DIRAC && st_ivas->hDirACRend->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) || ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) ) ) + { + st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag = 1; + st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag = 1; + } + else if ( st_ivas->nchan_transport == 2 ) + { + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + st_ivas->hCPE[0]->hCoreCoder[n]->cna_dirac_flag = 0; + st_ivas->hCPE[0]->hCoreCoder[n]->cng_sba_flag = 1; + } + } + else + { + for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) + { + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + st_ivas->hCPE[cpe_id]->hCoreCoder[n]->cna_dirac_flag = 0; + st_ivas->hCPE[cpe_id]->hCoreCoder[n]->cng_sba_flag = 0; + } + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * ivas_sba_dec_reconfigure() + * + * Reconfigure IVAS SBA decoder + *-------------------------------------------------------------------*/ + +ivas_error ivas_sba_dec_reconfigure( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + uint16_t *nSamplesFlushed, /* o : number of samples flushed */ + int16_t *data /* o : output synthesis signal */ +) +{ + int16_t nchan_transport_old, nSCE_old, nCPE_old, nchan_hp20_old; + AUDIO_CONFIG intern_config_old; + int16_t numCldfbAnalyses_old, numCldfbSyntheses_old; + int16_t sba_dirac_stereo_flag_old; + int32_t ivas_total_brate; + int32_t last_ivas_total_brate; + int16_t num_channels, num_md_sub_frames; +#ifdef NONBE_FIX_839_MC_RS_CHANNEL_ALLOC + int16_t nchan_out_buff, nchan_out_buff_old; +#else + int16_t ch, nchan_out_buff, nchan_out_buff_old; +#endif + int16_t sba_analysis_order_old; + int16_t sba_analysis_order_old_flush; + DECODER_CONFIG_HANDLE hDecoderConfig; + ivas_error error; + ISM_MODE ism_mode_old; + int16_t granularity_new; + + ism_mode_old = st_ivas->ism_mode; + hDecoderConfig = st_ivas->hDecoderConfig; + ivas_total_brate = hDecoderConfig->ivas_total_brate; + last_ivas_total_brate = st_ivas->last_active_ivas_total_brate; + sba_analysis_order_old_flush = st_ivas->sba_analysis_order; + sba_analysis_order_old = ivas_sba_get_analysis_order( last_ivas_total_brate, st_ivas->sba_order ); + + /*-----------------------------------------------------------------* + * Set SBA high-level parameters + * Save old SBA high-level parameters + *-----------------------------------------------------------------*/ + + nchan_out_buff_old = ivas_get_nchan_buffers_dec( st_ivas, sba_analysis_order_old, last_ivas_total_brate ); + ivas_init_dec_get_num_cldfb_instances( st_ivas, &numCldfbAnalyses_old, &numCldfbSyntheses_old ); + nchan_hp20_old = getNumChanSynthesis( st_ivas ); + + if ( st_ivas->ivas_format == SBA_ISM_FORMAT ) + { + if ( ivas_total_brate >= IVAS_256k ) + { + st_ivas->ism_mode = ISM_SBA_MODE_DISC; + } + else + { + st_ivas->ism_mode = ISM_MODE_NONE; + } + } + else + { + st_ivas->ism_mode = ISM_MODE_NONE; + } + + nSCE_old = st_ivas->nSCE; + nCPE_old = st_ivas->nCPE; + nchan_transport_old = st_ivas->nchan_transport; + sba_dirac_stereo_flag_old = st_ivas->sba_dirac_stereo_flag; + + st_ivas->sba_analysis_order = ivas_sba_get_analysis_order( ivas_total_brate, st_ivas->sba_order ); + + *nSamplesFlushed = 0; + granularity_new = st_ivas->hTcBuffer->n_samples_granularity; + + /* we may need to flush only for binaural and OSBA and TSM */ + if ( st_ivas->ivas_format == SBA_ISM_FORMAT && ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL || st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR || st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) + { + RENDERER_TYPE renderer_type_new; + int16_t sba_order_internal; + + sba_order_internal = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ); + + /* get new renderer type */ + /* copy the logic from ivas_renderer_select(), because calling this function has too many side effects that would affect the flushing */ + if ( ivas_get_sba_num_TCs( ivas_total_brate, sba_order_internal ) <= 2 ) + { + if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL ) + { + renderer_type_new = RENDERER_BINAURAL_PARAMETRIC; + } + else + { + renderer_type_new = RENDERER_BINAURAL_PARAMETRIC_ROOM; + } + } + else + { + if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL || st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB + ) + { + renderer_type_new = RENDERER_BINAURAL_FASTCONV; + } + else + { + renderer_type_new = RENDERER_BINAURAL_FASTCONV_ROOM; + } + } + + /* determine new granularity */ + granularity_new = NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ); + + /* this will change anyway only with binaural */ + if ( renderer_type_new == RENDERER_BINAURAL_FASTCONV && st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + { + granularity_new *= JBM_CLDFB_SLOTS_IN_SUBFRAME; + } + + /* flush renderer on granularity change form 5ms to 1.25ms, again only possible for binaural rendering */ + if ( granularity_new < st_ivas->hTcBuffer->n_samples_granularity ) + { + /* write back info for correct rendering of the flushable samples */ + st_ivas->sba_analysis_order = sba_analysis_order_old_flush; + st_ivas->hDecoderConfig->ivas_total_brate = last_ivas_total_brate; + + if ( ( error = ivas_jbm_dec_flush_renderer( st_ivas, granularity_new, st_ivas->renderer_type, st_ivas->intern_config, &st_ivas->hIntSetup, st_ivas->mc_mode, ism_mode_old, nSamplesFlushed, data ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* restore correct values for the current frame*/ + st_ivas->sba_analysis_order = ivas_sba_get_analysis_order( ivas_total_brate, st_ivas->sba_order ); + st_ivas->hDecoderConfig->ivas_total_brate = ivas_total_brate; + } + else if ( granularity_new > st_ivas->hTcBuffer->n_samples_granularity ) + { + if ( ( error = ivas_jbm_dec_set_discard_samples( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + + /* save old */ + if ( ism_mode_old != ISM_SBA_MODE_DISC ) + { + if ( st_ivas->hDirAC == NULL && st_ivas->hSpar != NULL ) + { + st_ivas->hTcBuffer->num_slots = st_ivas->hSpar->num_slots; + st_ivas->hTcBuffer->nb_subframes = st_ivas->hSpar->nb_subframes; + st_ivas->hTcBuffer->slots_rendered = st_ivas->hSpar->slots_rendered; + st_ivas->hTcBuffer->subframes_rendered = st_ivas->hSpar->subframes_rendered; + mvs2s( st_ivas->hSpar->subframe_nbslots, st_ivas->hTcBuffer->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); + } + else if ( st_ivas->hSpatParamRendCom != NULL ) + { + st_ivas->hTcBuffer->num_slots = st_ivas->hSpatParamRendCom->num_slots; + st_ivas->hTcBuffer->nb_subframes = st_ivas->hSpatParamRendCom->nb_subframes; + st_ivas->hTcBuffer->slots_rendered = st_ivas->hSpatParamRendCom->slots_rendered; + st_ivas->hTcBuffer->subframes_rendered = st_ivas->hSpatParamRendCom->subframes_rendered; + mvs2s( st_ivas->hSpatParamRendCom->subframe_nbslots, st_ivas->hTcBuffer->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); + } + } + + /*-----------------------------------------------------------------* + * Allocate, initialize, and configure SBA handles + *-----------------------------------------------------------------*/ + + int16_t sba_order_internal; + SPAR_DEC_HANDLE hSpar; + hSpar = st_ivas->hSpar; + + sba_order_internal = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ); + + if ( hSpar != NULL ) + { + if ( ( hSpar->hPCA != NULL ) && ( ( hDecoderConfig->ivas_total_brate != PCA_BRATE ) || ( st_ivas->sba_order != 1 ) ) ) + { + free( st_ivas->hSpar->hPCA ); + hSpar->hPCA = NULL; + } + + if ( nchan_transport_old != ivas_get_sba_num_TCs( ivas_total_brate, sba_order_internal ) || ( last_ivas_total_brate >= IVAS_512k && ivas_total_brate < IVAS_512k ) || ( last_ivas_total_brate < IVAS_512k && ivas_total_brate >= IVAS_512k ) ) + { + ivas_spar_dec_close( &( st_ivas->hSpar ), hDecoderConfig->output_Fs, 1 ); + + if ( ( error = ivas_spar_dec_open( st_ivas, 1 ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( last_ivas_total_brate < IVAS_24k4 && ivas_total_brate >= IVAS_24k4 ) + { + num_channels = st_ivas->hSpar->hMdDec->spar_md_cfg.num_umx_chs; + ivas_spar_md_dec_matrix_close( st_ivas->hSpar->hMdDec, num_channels ); + + num_md_sub_frames = ivas_get_spar_dec_md_num_subframes( sba_order_internal, ivas_total_brate, st_ivas->last_active_ivas_total_brate ); + if ( ( error = ivas_spar_md_dec_matrix_open( st_ivas->hSpar->hMdDec, num_channels, num_md_sub_frames ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( hSpar->hPCA == NULL && st_ivas->hDecoderConfig->ivas_total_brate == PCA_BRATE && st_ivas->sba_order == 1 && st_ivas->ivas_format == SBA_FORMAT ) + { + if ( ( hSpar->hPCA = (PCA_DEC_STATE *) malloc( sizeof( PCA_DEC_STATE ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for PCA decoder" ); + } + + ivas_pca_dec_init( hSpar->hPCA ); + } + + ivas_spar_config( ivas_total_brate, sba_order_internal, &st_ivas->nchan_transport, &st_ivas->nSCE, &st_ivas->nCPE, &hSpar->core_nominal_brate, st_ivas->sid_format ); + } + else + { + if ( ( error = ivas_spar_dec_open( st_ivas, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + hSpar = st_ivas->hSpar; + st_ivas->sba_dirac_stereo_flag = ivas_get_sba_dirac_stereo_flag( st_ivas ); + + if ( st_ivas->nchan_transport == 1 ) + { + st_ivas->element_mode_init = IVAS_SCE; + } + else + { + st_ivas->element_mode_init = IVAS_CPE_MDCT; + } + + /*-----------------------------------------------------------------* + * Renderer selection + *-----------------------------------------------------------------*/ + + /* renderer might have changed */ + intern_config_old = st_ivas->intern_config; + ivas_renderer_select( st_ivas ); + + /* side effect of the renderer selection can be a changed internal config */ + if ( st_ivas->intern_config != intern_config_old ) + { + ivas_output_init( &( st_ivas->hIntSetup ), st_ivas->intern_config ); + } + + /*-------------------------------------------------------------------* + * Reallocate and initialize binaural rendering handles + *--------------------------------------------------------------------*/ + + if ( st_ivas->hBinRenderer == NULL && ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) ) + { + /* open fastconv binaural renderer */ + if ( ( error = ivas_binRenderer_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->hBinRenderer != NULL && ( st_ivas->renderer_type != RENDERER_BINAURAL_FASTCONV && st_ivas->renderer_type != RENDERER_BINAURAL_FASTCONV_ROOM ) ) + { + ivas_binRenderer_close( &st_ivas->hBinRenderer ); + } + + if ( st_ivas->renderer_type == RENDERER_MONO_DOWNMIX && st_ivas->hMonoDmxRenderer == NULL ) + { + if ( ( error = ivas_mono_dmx_renderer_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( st_ivas->renderer_type != RENDERER_MONO_DOWNMIX ) + { + ivas_mono_dmx_renderer_close( &st_ivas->hMonoDmxRenderer ); + } + + if ( ( error = ivas_dirac_sba_config( st_ivas->hQMetaData, &st_ivas->element_mode_init, ivas_total_brate, st_ivas->sba_analysis_order, ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ) ? IVAS_MAX_NUM_BANDS : ( IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND ) ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( ( st_ivas->renderer_type != RENDERER_DISABLE ) && ( st_ivas->renderer_type != RENDERER_SBA_LINEAR_DEC ) ) || ( ( hDecoderConfig->output_config != IVAS_AUDIO_CONFIG_FOA ) && ( st_ivas->hDecoderConfig->output_config != IVAS_AUDIO_CONFIG_STEREO ) && ( st_ivas->hDecoderConfig->output_config != IVAS_AUDIO_CONFIG_MONO ) ) ) + { + DIRAC_CONFIG_FLAG flag_config; + + flag_config = DIRAC_OPEN; + if ( st_ivas->hDirAC != NULL ) + { + flag_config = DIRAC_RECONFIGURE_MODE; + } + + if ( ( error = ivas_dirac_dec_config( st_ivas, flag_config ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + int16_t band_grouping[IVAS_MAX_NUM_BANDS + 1]; + + st_ivas->hSpar->enc_param_start_band = min( IVAS_MAX_NUM_BANDS, SPAR_DIRAC_SPLIT_START_BAND ); + if ( ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ) ) + { + st_ivas->hSpar->enc_param_start_band = 0; + + set_c( (int8_t *) st_ivas->hQMetaData->twoDirBands, (int8_t) 1, st_ivas->hQMetaData->q_direction[0].cfg.nbands ); + st_ivas->hQMetaData->numTwoDirBands = (uint8_t) st_ivas->hQMetaData->q_direction[0].cfg.nbands; + } + + ivas_dirac_config_bands( band_grouping, IVAS_MAX_NUM_BANDS, (int16_t) ( st_ivas->hDecoderConfig->output_Fs * INV_CLDFB_BANDWIDTH + 0.5f ), + st_ivas->hSpar->dirac_to_spar_md_bands, st_ivas->hQMetaData->useLowerBandRes, st_ivas->hSpar->enc_param_start_band, 0 ); + + if ( st_ivas->hDirAC ) + { + st_ivas->hDirAC->hConfig->enc_param_start_band = st_ivas->hSpar->enc_param_start_band; + } + } + + if ( st_ivas->renderer_type == RENDERER_DISABLE ) + { + ivas_dirac_rend_close( &( st_ivas->hDirACRend ) ); + ivas_spat_hSpatParamRendCom_close( &( st_ivas->hSpatParamRendCom ) ); + ivas_dirac_dec_close( &( st_ivas->hDirAC ) ); + vbap_free_data( &( st_ivas->hVBAPdata ) ); + } + + if ( st_ivas->hDirAC != NULL ) + { + st_ivas->hSpar->enc_param_start_band = st_ivas->hDirAC->hConfig->enc_param_start_band; + } + + /*-----------------------------------------------------------------* + * Allocate, initialize, and configure SCE/CPE/MCT handles + *-----------------------------------------------------------------*/ + + if ( st_ivas->ivas_format == SBA_ISM_FORMAT ) + { + if ( ism_mode_old == ISM_MODE_NONE && st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + { + int32_t temp_brate[MAX_SCE]; + + st_ivas->ism_mode = ISM_SBA_MODE_DISC; + if ( ( error = ivas_ism_metadata_dec_create( st_ivas, st_ivas->nchan_ism, temp_brate ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( st_ivas->renderer_type == RENDERER_TD_PANNING || + st_ivas->renderer_type == RENDERER_NON_DIEGETIC_DOWNMIX || + st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC || + st_ivas->renderer_type == RENDERER_OSBA_STEREO || + st_ivas->renderer_type == RENDERER_OSBA_AMBI || + st_ivas->renderer_type == RENDERER_OSBA_LS || + st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || + st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM || + st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) ) + { + if ( ( error = ivas_ism_renderer_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( st_ivas->renderer_type == RENDERER_MONO_DOWNMIX ) + { + if ( st_ivas->hMonoDmxRenderer == NULL ) + { + if ( ( error = ivas_mono_dmx_renderer_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + else + { + ivas_mono_dmx_renderer_close( &st_ivas->hMonoDmxRenderer ); + } + + if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV ) + { + /* Allocate TD renderer for the objects in DISC mode */ + if ( st_ivas->hBinRendererTd == NULL ) + { + if ( ( error = ivas_td_binaural_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + + /* Allocate memory for OSBA delay buffer */ + if ( ( error = ivas_osba_data_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + + st_ivas->nCPE += ( st_ivas->nchan_ism + 1 ) >> 1; + } + else if ( ism_mode_old == ISM_SBA_MODE_DISC && st_ivas->ism_mode == ISM_MODE_NONE ) + { + /* ISM renderer handle */ + ivas_ism_renderer_close( &st_ivas->hIsmRendererData ); + ivas_ism_metadata_close( st_ivas->hIsmMetaData, 0 ); + ivas_osba_data_close( &st_ivas->hSbaIsmData ); + + /* Time Domain binaural renderer handle */ + if ( st_ivas->hBinRendererTd != NULL ) + { + if ( st_ivas->hBinRendererTd->HrFiltSet_p->ModelParams.modelROM == TRUE ) + { + ivas_td_binaural_close( &st_ivas->hBinRendererTd ); + st_ivas->hHrtfTD = NULL; + } + } + nchan_transport_old += st_ivas->nchan_ism; + st_ivas->ism_mode = ISM_MODE_NONE; + } + else if ( st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + { + st_ivas->nCPE += ( st_ivas->nchan_ism + 1 ) >> 1; + nCPE_old = st_ivas->nCPE; + nchan_transport_old = st_ivas->nchan_transport; + nchan_transport_old += st_ivas->nchan_ism; + } + } + + if ( ( error = ivas_corecoder_dec_reconfig( st_ivas, nSCE_old, nCPE_old, nchan_transport_old, sba_dirac_stereo_flag_old, st_ivas->hDecoderConfig->ivas_total_brate / st_ivas->nchan_transport, ( st_ivas->hDecoderConfig->ivas_total_brate / st_ivas->nchan_transport ) * CPE_CHANNELS ) ) != IVAS_ERR_OK ) + { + return error; + } + + /*-----------------------------------------------------------------* + * HP20 memories + *-----------------------------------------------------------------*/ + + if ( ( error = ivas_hp20_dec_reconfig( st_ivas, nchan_hp20_old ) ) != IVAS_ERR_OK ) + { + return error; + } + + /*-----------------------------------------------------------------* + * TD Decorrelator + *-----------------------------------------------------------------*/ + + if ( st_ivas->hDiracDecBin != NULL ) + { + if ( ( error = ivas_td_decorr_reconfig_dec( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hDecoderConfig->output_Fs, &( st_ivas->hDiracDecBin->hTdDecorr ), &( st_ivas->hDiracDecBin->useTdDecorr ) ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /*-----------------------------------------------------------------* + * CLDFB instances + *-----------------------------------------------------------------*/ + + if ( ( error = ivas_cldfb_dec_reconfig( st_ivas, nchan_transport_old, numCldfbAnalyses_old, numCldfbSyntheses_old ) ) != IVAS_ERR_OK ) + { + return error; + } + + /*-----------------------------------------------------------------* + * JBM TC buffers + *-----------------------------------------------------------------*/ + + if ( st_ivas->hDecoderConfig->Opt_5ms == 1 || st_ivas->ivas_format == SBA_ISM_FORMAT ) + { + int16_t tc_nchan_to_allocate; + int16_t tc_nchan_tc; + TC_BUFFER_MODE tc_buffer_mode; + + tc_buffer_mode = TC_BUFFER_MODE_RENDERER; + tc_nchan_tc = ivas_jbm_dec_get_num_tc_channels( st_ivas ); + tc_nchan_to_allocate = tc_nchan_tc; + if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_STEREO || st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_MONO ) + { + if ( ( st_ivas->ivas_format == SBA_ISM_FORMAT && st_ivas->ism_mode == ISM_SBA_MODE_DISC && st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_STEREO ) ) + { + tc_nchan_tc = st_ivas->hDecoderConfig->nchan_out + st_ivas->nchan_ism; + tc_nchan_to_allocate = tc_nchan_tc; + } + else + { + tc_buffer_mode = TC_BUFFER_MODE_BUFFER; + tc_nchan_tc = st_ivas->hDecoderConfig->nchan_out; + tc_nchan_to_allocate = tc_nchan_tc; + } + } + else if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) + { + tc_nchan_to_allocate = 2 * BINAURAL_CHANNELS; + } + else if ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT ) + { + tc_nchan_to_allocate = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); + + if ( st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + { + tc_nchan_to_allocate += st_ivas->nchan_ism; + } + } + else + { + if ( st_ivas->nchan_transport == 1 && ( ( st_ivas->renderer_type == RENDERER_DIRAC && st_ivas->hDirACRend->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) || ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) ) + { + tc_nchan_to_allocate++; /* we need a channel for the CNG in this case*/ + } + } + + if ( tc_nchan_tc != st_ivas->hTcBuffer->nchan_transport_jbm || tc_nchan_to_allocate != st_ivas->hTcBuffer->nchan_transport_internal || tc_buffer_mode != st_ivas->hTcBuffer->tc_buffer_mode || granularity_new != st_ivas->hTcBuffer->n_samples_granularity ) + { + if ( ( error = ivas_jbm_dec_tc_buffer_reconfigure( st_ivas, tc_buffer_mode, tc_nchan_tc, tc_nchan_to_allocate, tc_nchan_to_allocate, granularity_new ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + + /* resync SPAR and DirAC JBM info from TC Buffer */ + if ( st_ivas->hSpatParamRendCom != NULL ) + { + if ( st_ivas->hSpatParamRendCom->slot_size == st_ivas->hTcBuffer->n_samples_granularity ) + { + mvs2s( st_ivas->hTcBuffer->subframe_nbslots, st_ivas->hSpatParamRendCom->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); + st_ivas->hSpatParamRendCom->nb_subframes = st_ivas->hTcBuffer->nb_subframes; + st_ivas->hSpatParamRendCom->subframes_rendered = st_ivas->hTcBuffer->subframes_rendered; + + mvs2s( st_ivas->hTcBuffer->subframe_nbslots, st_ivas->hSpar->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); + st_ivas->hSpar->nb_subframes = st_ivas->hTcBuffer->nb_subframes; + st_ivas->hSpar->subframes_rendered = st_ivas->hTcBuffer->subframes_rendered; + } + } + + if ( st_ivas->ivas_format == SBA_ISM_FORMAT && st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV && st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + { + int16_t granularityMultiplier = st_ivas->hTcBuffer->n_samples_granularity / st_ivas->hSpatParamRendCom->slot_size; + int16_t n; + for ( n = 0; n < MAX_JBM_SUBFRAMES_5MS; n++ ) + { + st_ivas->hSpatParamRendCom->subframe_nbslots[n] = st_ivas->hTcBuffer->subframe_nbslots[n] * granularityMultiplier; + } + } + + /*-----------------------------------------------------------------* + * floating-point output audio buffers + *-----------------------------------------------------------------*/ + + if ( !st_ivas->hDecoderConfig->Opt_5ms ) + { + nchan_out_buff = ivas_get_nchan_buffers_dec( st_ivas, st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); + +#ifdef NONBE_FIX_839_MC_RS_CHANNEL_ALLOC + if ( ( error = ivas_output_buff_dec( st_ivas->p_output_f, nchan_out_buff_old, nchan_out_buff ) ) != IVAS_ERR_OK ) + { + return error; + } +#else + if ( nchan_out_buff > nchan_out_buff_old ) + { + for ( ch = nchan_out_buff_old; ch < nchan_out_buff; ch++ ) + { + /* note: these are intra-frame heap memories */ + if ( ( st_ivas->p_output_f[ch] = (float *) malloc( ( 48000 / FRAMES_PER_SEC ) * sizeof( float ) ) ) == NULL ) /* note: 32000 == max internal sampling rate */ + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for floating-point output audio buffer!\n" ) ); + } + } + } + else + { + for ( ch = nchan_out_buff; ch < nchan_out_buff_old; ch++ ) + { + free( st_ivas->p_output_f[ch] ); + st_ivas->p_output_f[ch] = NULL; + } + } +#endif + } + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * ivas_sba_dec_digest_tc() + * + * + *-------------------------------------------------------------------*/ + +void ivas_sba_dec_digest_tc( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const int16_t nCldfbSlots, /* i : number of CLDFB slots */ + const int16_t nSamplesForRendering /* i : number of samples provided */ +) +{ + int16_t ch_idx, nchan_transport; + + /* set the md map */ + if ( st_ivas->hDirAC ) + { + ivas_dirac_dec_set_md_map( st_ivas, nCldfbSlots ); + } + + if ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT ) + { + ivas_spar_dec_digest_tc( st_ivas, st_ivas->nchan_transport, nCldfbSlots, nSamplesForRendering ); + } + + if ( st_ivas->hDiracDecBin != NULL && ( st_ivas->hDiracDecBin->useTdDecorr ) ) + { + int16_t nSamplesLeftForTD, default_frame; + float *decorr_signal[BINAURAL_CHANNELS]; + float *p_tc[2 * BINAURAL_CHANNELS]; + + default_frame = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); + nSamplesLeftForTD = nSamplesForRendering; + + for ( ch_idx = 0; ch_idx < BINAURAL_CHANNELS; ch_idx++ ) + { + decorr_signal[ch_idx] = st_ivas->hTcBuffer->tc[ch_idx + BINAURAL_CHANNELS]; + p_tc[ch_idx] = st_ivas->hTcBuffer->tc[ch_idx]; + } + + while ( nSamplesLeftForTD ) + { + int16_t nSamplesToDecorr = min( nSamplesLeftForTD, default_frame ); + + if ( st_ivas->hDiracDecBin->hTdDecorr ) + { + ivas_td_decorr_process( st_ivas->hDiracDecBin->hTdDecorr, p_tc, decorr_signal, nSamplesToDecorr ); + } + + for ( ch_idx = 0; ch_idx < BINAURAL_CHANNELS; ch_idx++ ) + { + decorr_signal[ch_idx] += nSamplesToDecorr; + p_tc[ch_idx] += nSamplesToDecorr; + } + nSamplesLeftForTD -= nSamplesToDecorr; + } + } + + /* if we have a late CNG generation, do it here */ + nchan_transport = st_ivas->nchan_transport; + if ( st_ivas->ivas_format == MASA_FORMAT && st_ivas->hDecoderConfig->ivas_total_brate < MASA_STEREO_MIN_BITRATE && ( st_ivas->hDecoderConfig->ivas_total_brate > IVAS_SID_5k2 || ( st_ivas->hDecoderConfig->ivas_total_brate <= IVAS_SID_5k2 && st_ivas->nCPE > 0 && st_ivas->hCPE[0]->nchan_out == 1 ) ) ) + { + nchan_transport = 1; /* Only one channel transported */ + } + + if ( ( ( st_ivas->ivas_format != SBA_FORMAT && st_ivas->ivas_format != SBA_ISM_FORMAT ) && st_ivas->nchan_transport == 1 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag ) || + ( ( st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC ) && ( nchan_transport == 1 && st_ivas->nchan_transport != 2 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag ) ) ) + { + Decoder_State *st = st_ivas->hSCE[0]->hCoreCoder[0]; + generate_masking_noise_lb_dirac( st->hFdCngDec->hFdCngCom, st_ivas->hTcBuffer->tc[1], nCldfbSlots, st->cna_dirac_flag && st->flag_cna ); + } + + return; +} + + +/*-------------------------------------------------------------------* + * ivas_sba_dec_render() + * + * + *-------------------------------------------------------------------*/ + +ivas_error ivas_sba_dec_render( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */ + uint16_t *nSamplesRendered, /* o : number of CLDFB slots rendered */ + uint16_t *nSamplesAvailableNext, /* o : number of CLDFB slots still to render */ + float *output_f[] /* o : rendered time signal */ +) +{ + int16_t slots_to_render, first_sf, last_sf, subframe_idx; + uint16_t slot_size, ch; + uint16_t nchan_internal, nchan_out; + SPAR_DEC_HANDLE hSpar; + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom; + float *output_f_local[MAX_OUTPUT_CHANNELS]; + ivas_error error; + + hSpar = st_ivas->hSpar; + hSpatParamRendCom = st_ivas->hSpatParamRendCom; + nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); + nchan_out = st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe; + + for ( ch = 0; ch < nchan_out; ch++ ) + { + output_f_local[ch] = output_f[ch]; + } + + slot_size = NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ); + + /* loop for synthesis, assume we always have to render in multiples of 5ms subframes with spills */ + slots_to_render = min( hSpar->num_slots - hSpar->slots_rendered, nSamplesAsked / slot_size ); + *nSamplesRendered = slots_to_render * slot_size; + first_sf = hSpar->subframes_rendered; + last_sf = first_sf; + + while ( slots_to_render > 0 ) + { + slots_to_render -= hSpar->subframe_nbslots[last_sf]; + last_sf++; + } + + for ( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ ) + { + int16_t n_samples_sf = slot_size * hSpar->subframe_nbslots[subframe_idx]; + + ivas_spar_dec_upmixer_sf( st_ivas, output_f_local, nchan_internal ); + for ( ch = 0; ch < nchan_out; ch++ ) + { + output_f_local[ch] += n_samples_sf; + } + } + + if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_DEC ) + { + if ( ( error = ivas_sba_linear_renderer( output_f, *nSamplesRendered, st_ivas->hIntSetup.nchan_out_woLFE, 0, st_ivas->hDecoderConfig->output_config, st_ivas->hOutSetup ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( st_ivas->hDirAC != NULL && hSpar->slots_rendered == hSpar->num_slots ) + { + if ( st_ivas->hDirAC->hConfig->dec_param_estim == 1 ) + { + hSpatParamRendCom->dirac_read_idx = ( hSpatParamRendCom->dirac_read_idx + DEFAULT_JBM_CLDFB_TIMESLOTS ) % hSpatParamRendCom->dirac_md_buffer_length; + } + else + { + hSpatParamRendCom->dirac_read_idx = ( hSpatParamRendCom->dirac_read_idx + DEFAULT_JBM_SUBFRAMES_5MS ) % hSpatParamRendCom->dirac_md_buffer_length; + } + } + + *nSamplesAvailableNext = ( hSpar->num_slots - hSpar->slots_rendered ) * slot_size; + + return IVAS_ERR_OK; +} diff --git a/lib_dec/ivas_sba_dirac_stereo_dec.c b/lib_dec/ivas_sba_dirac_stereo_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..19f3e656cd44ff8e7ee5fead39cbb7761abe6a9b --- /dev/null +++ b/lib_dec/ivas_sba_dirac_stereo_dec.c @@ -0,0 +1,927 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include "options.h" +#include "cnst.h" +#include "ivas_cnst.h" +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_rom_com.h" +#include "ivas_rom_dec.h" +#include "wmc_auto.h" + + +/*-------------------------------------------------------------------* + * ivas_get_sba_dirac_stereo_flag() + * + * Set sba_dirac_stereo_flag + *-------------------------------------------------------------------*/ + +int16_t ivas_get_sba_dirac_stereo_flag( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +) +{ + int16_t sba_dirac_stereo_flag; + AUDIO_CONFIG output_config; + + sba_dirac_stereo_flag = 0; + output_config = st_ivas->hDecoderConfig->output_config; + + if ( st_ivas->ivas_format == SBA_FORMAT || ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCMASA ) ) + { + if ( st_ivas->ivas_format == SBA_FORMAT ) + { + if ( output_config == IVAS_AUDIO_CONFIG_STEREO || ( output_config == IVAS_AUDIO_CONFIG_MONO && st_ivas->nchan_transport == 1 ) ) + { + sba_dirac_stereo_flag = 1; + } + } + else + { + if ( st_ivas->nchan_transport == 1 && output_config == IVAS_AUDIO_CONFIG_STEREO ) + { + sba_dirac_stereo_flag = 1; + } + } + } + else if ( st_ivas->ivas_format == SBA_ISM_FORMAT ) + { + if ( output_config == IVAS_AUDIO_CONFIG_STEREO ) + { + sba_dirac_stereo_flag = 1; + } + } + + return sba_dirac_stereo_flag; +} + + +/*-------------------------------------------------------------------* + * ivas_sba_dirac_stereo_config() + * + * DFT Stereo Configuration for SBA DirAC stereo output + *-------------------------------------------------------------------*/ + +void ivas_sba_dirac_stereo_config( + STEREO_DFT_CONFIG_DATA_HANDLE hConfig /* o : DFT stereo configuration */ +) +{ + if ( hConfig != NULL ) + { + hConfig->dmx_active = STEREO_DFT_DMX_ACTIVE; + hConfig->band_res = STEREO_DFT_BAND_RES_HIGH; + hConfig->prm_res = 2; + + hConfig->res_pred_mode = STEREO_DFT_RESPRED_ESF; + + hConfig->res_cod_mode = STEREO_DFT_RES_COD_OFF; + hConfig->ada_wb_res_cod_mode = 0; + + hConfig->hybrid_itd_flag = 0; + } + + return; +} + + +/*-------------------------------------------------------------------* + * ivas_sba_dirac_stereo_band_config() + * + * Band Configuration for SBA DirAC stereo output + *-------------------------------------------------------------------*/ + +static int16_t ivas_sba_dirac_stereo_band_config( + int16_t *band_limits, /* o : DFT band limits */ + const int32_t output_Fs, /* i : output sampling rate */ + const int16_t NFFT, /* i : analysis/synthesis window length */ + const int16_t spar_flag /* i : SPAR or DirAC band grouping */ +) +{ + int16_t i; + int16_t bins_per_cldfb_band; + int16_t nbands, num_cldfb_bands; + + nbands = SBA_DIRAC_STEREO_NUM_BANDS; + + if ( spar_flag ) + { + nbands = IVAS_MAX_NUM_BANDS; + } + else + { + nbands = 5; + } + + num_cldfb_bands = (int16_t) ( output_Fs * INV_CLDFB_BANDWIDTH + 0.5f ); + + bins_per_cldfb_band = NFFT / ( 2 * num_cldfb_bands ); + + band_limits[0] = 1; + for ( i = 1; i < nbands; i++ ) + { + if ( spar_flag ) + { + band_limits[i] = DirAC_band_grouping_12[i] * bins_per_cldfb_band; + } + else + { + band_limits[i] = DirAC_band_grouping_5[i] * bins_per_cldfb_band; + } + if ( band_limits[i] >= NFFT / 2 ) + { + nbands = i; + break; + } + } + band_limits[nbands] = NFFT / 2; + + return nbands; +} + + +static float get_panning( + const int16_t aziDeg, + const int16_t eleDeg ) +{ + float aziRad, eleRad, y, mappedX, aziRadMapped, panning; + float A, A2, A3; + const float LsAngleRad = 30.0f * PI_OVER_180; + + aziRad = aziDeg * PI_OVER_180; + eleRad = eleDeg * PI_OVER_180; + y = ( sinf( aziRad ) * cosf( eleRad ) ); + mappedX = sqrtf( max( 0.0f, 1.0f - ( y * y ) ) ); + aziRadMapped = atan2f( y, mappedX ); + + /* Determine the real valued amplitude panning gains */ + panning = 0.0f; + if ( aziRadMapped >= LsAngleRad ) + { /* Left side */ + panning = 1.0f; + } + else if ( aziRadMapped <= -LsAngleRad ) + { /* Right side */ + panning = -1.0f; + } + else /* Tangent panning law */ + { + A = tanf( aziRadMapped ) / tanf( LsAngleRad ); + A2 = ( A - 1.0f ) / max( 0.001f, A + 1.0f ); + A3 = 1.0f / ( A2 * A2 + 1.0f ); + panning = 2 * A3 - 1.0f; + } + return panning; +} + + +/*-------------------------------------------------------------------* + * map_params_dirac_to_stereo() + * + * Compute DFT Stereo parameters from DirAC parameters + *-------------------------------------------------------------------*/ + +static void map_params_dirac_to_stereo( + STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */ + const IVAS_QMETADATA_HANDLE hQMetaData, /* i : frame of MASA q_metadata */ + float synth[], /* i : decoded downmix signal */ + float DFT[STEREO_DFT_BUF_MAX], /* i/o: DFT buffer */ + const uint8_t b_wide_panning, /* i : flag indicating wider panning */ + const int16_t L_frame, /* i : core signal length */ + const int16_t mcmasa /* i : McMASA flag */ +) +{ + int16_t i, b, k; + int16_t k_offset; + int16_t nbands, nBlocks; + int16_t block; + int16_t block_len; + int16_t azimuth[MAX_PARAM_SPATIAL_SUBFRAMES][SBA_DIRAC_STEREO_NUM_BANDS]; + int16_t elevation[MAX_PARAM_SPATIAL_SUBFRAMES][SBA_DIRAC_STEREO_NUM_BANDS]; + float diffuseness[SBA_DIRAC_STEREO_NUM_BANDS]; + float block_nrg[MAX_PARAM_SPATIAL_SUBFRAMES]; + float nrg_norm1, nrg_norm2; + float *pSynth; + float surrCoh[SBA_DIRAC_STEREO_NUM_BANDS]; + float *pDFT; + float subframe_band_nrg[NB_DIV][SBA_DIRAC_STEREO_NUM_BANDS]; + float smooth_long_avg[NB_DIV][SBA_DIRAC_STEREO_NUM_BANDS]; + float smooth_short_avg[NB_DIV][SBA_DIRAC_STEREO_NUM_BANDS]; + float *side_gain, *res_pred_gain; + IVAS_QDIRECTION *q_direction; + + nBlocks = MAX_PARAM_SPATIAL_SUBFRAMES; + nbands = hStereoDft->nbands; + k_offset = STEREO_DFT_OFFSET; + side_gain = hStereoDft->side_gain + k_offset * STEREO_DFT_BAND_MAX; + res_pred_gain = hStereoDft->res_pred_gain + k_offset * STEREO_DFT_BAND_MAX; + q_direction = &( hQMetaData->q_direction[0] ); + + /* gain smoothing factor */ + pDFT = DFT; + for ( k = 0; k < NB_DIV; k++ ) + { + for ( b = 0; b < hStereoDft->nbands; b++ ) + { + /* calculate band-wise subframe energies */ + subframe_band_nrg[k][b] = 0.f; + for ( i = hStereoDft->band_limits[b]; i < hStereoDft->band_limits[b + 1]; i++ ) + { + subframe_band_nrg[k][b] += pDFT[2 * i] * pDFT[2 * i] + pDFT[2 * i + 1] * pDFT[2 * i + 1]; + } + subframe_band_nrg[k][b] = sqrtf( subframe_band_nrg[k][b] ); + hStereoDft->smooth_buf[b][NB_DIV - 1 - k] = subframe_band_nrg[k][b]; + + /* calculate short and long energy averages */ + smooth_short_avg[k][b] = EPSILON; + for ( i = NB_DIV - 1 - k; i < SBA_DIRAC_NRG_SMOOTH_SHORT + NB_DIV - 1 - k; i++ ) + { + smooth_short_avg[k][b] += hStereoDft->smooth_buf[b][i]; + } + + smooth_long_avg[k][b] = smooth_short_avg[k][b]; + for ( i = NB_DIV - 1 - k + SBA_DIRAC_NRG_SMOOTH_SHORT; i < SBA_DIRAC_NRG_SMOOTH_LONG + NB_DIV - 1 - k; i++ ) + { + smooth_long_avg[k][b] += hStereoDft->smooth_buf[b][i]; + } + smooth_short_avg[k][b] /= SBA_DIRAC_NRG_SMOOTH_SHORT; + smooth_long_avg[k][b] /= SBA_DIRAC_NRG_SMOOTH_LONG; + + /* calculate smoothing factor based on energy averages */ + /* reduce factor for higher short-term energy */ + hStereoDft->smooth_fac[k][b] = min( 1.f, smooth_long_avg[k][b] / smooth_short_avg[k][b] ); + /* map factor to range [0;1] */ + hStereoDft->smooth_fac[k][b] = max( 0.f, hStereoDft->smooth_fac[k][b] - (float) SBA_DIRAC_NRG_SMOOTH_SHORT / SBA_DIRAC_NRG_SMOOTH_LONG ) * ( (float) SBA_DIRAC_NRG_SMOOTH_LONG / ( SBA_DIRAC_NRG_SMOOTH_LONG - SBA_DIRAC_NRG_SMOOTH_SHORT ) ); + /* compress factor (higher compression in lowest bands) */ + if ( b < 2 ) + { + hStereoDft->smooth_fac[k][b] = powf( hStereoDft->smooth_fac[k][b], 0.25f ); + } + else + { + hStereoDft->smooth_fac[k][b] = powf( hStereoDft->smooth_fac[k][b], 0.5f ); + } + + /* apply upper bounds depending on band */ + hStereoDft->smooth_fac[0][b] = max( hStereoDft->min_smooth_gains[b], min( hStereoDft->max_smooth_gains[b], hStereoDft->smooth_fac[0][b] ) ); + hStereoDft->smooth_fac[1][b] = max( hStereoDft->min_smooth_gains[b], min( hStereoDft->max_smooth_gains[b], hStereoDft->smooth_fac[1][b] ) ); + } + pDFT += STEREO_DFT32MS_N_MAX; + } + + if ( mcmasa ) + { + /* calculate block energies for side gain weighting (combine angles of 2 DirAC blocks to side gain for 1 DFT Stereo subframe; 4 blocks and 2 subframes overall) */ + pSynth = synth; + block_len = L_frame / nBlocks; + for ( block = 0; block < nBlocks; block++ ) + { + block_nrg[block] = 0.f; + for ( i = 0; i < block_len; i++ ) + { + block_nrg[block] += pSynth[i] * pSynth[i]; + } + block_nrg[block] = sqrtf( block_nrg[block] ); + pSynth += block_len; + } + nrg_norm1 = 1 / ( block_nrg[0] + block_nrg[1] + EPSILON ); + nrg_norm2 = 1 / ( block_nrg[2] + block_nrg[3] + EPSILON ); + + /* extract DirAC parameters from metadata */ + for ( b = 0; b < nbands; b++ ) + { + diffuseness[b] = 1.0f - q_direction->band_data[b].energy_ratio[0]; + if ( hQMetaData->surcoh_band_data != NULL ) + { + surrCoh[b] = hQMetaData->surcoh_band_data[b].surround_coherence[0] / 255.0f; + } + else + { + surrCoh[b] = 0.0f; + } + + for ( block = 0; block < nBlocks; block++ ) + { + int16_t block_metadata; + + if ( hQMetaData->useLowerRes ) + { + block_metadata = 0; + } + else + { + block_metadata = block; + } + if ( q_direction->band_data[b].azimuth[block_metadata] < 0.f ) + { + q_direction->band_data[b].azimuth[block_metadata] += 360.f; + } + azimuth[block][b] = (int16_t) q_direction->band_data[b].azimuth[block_metadata]; + elevation[block][b] = (int16_t) q_direction->band_data[b].elevation[block_metadata]; + } + } + + /* map angles (azi, ele), surround coherence, and diffuseness to DFT Stereo side and prediction gains */ + for ( b = 0; b < hStereoDft->nbands; b++ ) + { + /* combine angles of first 2 blocks to side gain of first subframe */ + side_gain[b] = 0.f; + for ( block = 0; block < nBlocks / 2; block++ ) + { + if ( b_wide_panning == 1 ) + { + /* panning between left and ride, saturate at the stereo ls positions (+/- 30deg azi) */ + side_gain[b] += nrg_norm1 * block_nrg[block] * get_panning( azimuth[block][b], elevation[block][b] ); + } + else + { + side_gain[b] += nrg_norm1 * block_nrg[block] * sinf( azimuth[block][b] * EVS_PI / 180 ) * cosf( elevation[block][b] * EVS_PI / 180 ); + } + } + + /* combine angles of last 2 blocks to side gain of second subframe */ + side_gain[b + STEREO_DFT_BAND_MAX] = 0.f; + for ( block = nBlocks / 2; block < nBlocks; block++ ) + { + if ( b_wide_panning == 1 ) + { + /* panning between left and ride, saturate at the stereo ls positions (+/- 30deg azi) */ + side_gain[b + STEREO_DFT_BAND_MAX] += nrg_norm2 * block_nrg[block] * get_panning( azimuth[block][b], elevation[block][b] ); + } + else + { + side_gain[b + STEREO_DFT_BAND_MAX] += nrg_norm2 * block_nrg[block] * sinf( azimuth[block][b] * EVS_PI / 180 ) * cosf( elevation[block][b] * EVS_PI / 180 ); + } + } + + side_gain[b] *= sqrtf( 1.f - diffuseness[b] ); + side_gain[b + STEREO_DFT_BAND_MAX] *= sqrtf( 1.f - diffuseness[b] ); + res_pred_gain[b] = diffuseness[b] * ( 1.0f - surrCoh[b] ); + res_pred_gain[b + STEREO_DFT_BAND_MAX] = diffuseness[b] * ( 1.0f - surrCoh[b] ); + } + } + + hStereoDft->frame_nodata = 0; + hStereoDft->frame_sid_nodata = 0; + hStereoDft->frame_sid = 0; + + return; +} + + +/*-------------------------------------------------------------------* + * ivas_sba_dirac_stereo_compute_td_stefi_nrgs() + * + * Compute energies for TD stereo filling + *-------------------------------------------------------------------*/ + +static void ivas_sba_dirac_stereo_compute_td_stefi_nrgs( + STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */ + const float hb_synth[L_FRAME48k], /* i : HB signal */ + const int16_t core, /* i : core decision */ + const int16_t output_frame, /* i : output frame length per channel */ + const int16_t fd_cng_flag /* i : FD-CNG indicator */ +) +{ + int16_t i; + float hb_nrg = EPSILON; + float hb_nrg2 = EPSILON; + + if ( ( core == ACELP_CORE && !fd_cng_flag ) || hStereoDft->core_hist[1] == ACELP_CORE ) + { + for ( i = 0; i < output_frame / 2; i++ ) + { + hb_nrg2 += hb_synth[i] * hb_synth[i]; + } + + hStereoDft->hb_nrg_subr[0] = hb_nrg2; + hb_nrg += hb_nrg2; + hb_nrg2 = EPSILON; + + for ( ; i < output_frame; i++ ) + { + hb_nrg2 += hb_synth[i] * hb_synth[i]; + } + + hStereoDft->hb_nrg_subr[1] = hb_nrg2; + hb_nrg += hb_nrg2; + + mvr2r( hb_synth, hStereoDft->hb_stefi_sig + hStereoDft->hb_stefi_delay, output_frame ); + } + else + { + set_zero( hStereoDft->hb_stefi_sig + hStereoDft->hb_stefi_delay, output_frame ); + } + + hStereoDft->hb_nrg_subr[0] *= hStereoDft->NFFT / 2; + hStereoDft->hb_nrg_subr[1] *= hStereoDft->NFFT / 2; + hStereoDft->hb_nrg[0] = hb_nrg; + hStereoDft->td_gain[0] = 0; + hStereoDft->core_hist[0] = ( fd_cng_flag ) ? TCX_20_CORE : core; /* full signal available for DTX with FD-CNG, thus apply stereo filling on full spectrum like in TCX */ + + return; +} + + +/*-------------------------------------------------------------------* + * ivas_sba_dirac_stereo_compute_hb_gain() + * + * Compute HB gains + *-------------------------------------------------------------------*/ + +static void ivas_sba_dirac_stereo_compute_hb_gain( + STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */ + float hb_gain[NB_DIV] /* o : side gains for HB signal */ +) +{ + int16_t k_offset; + + k_offset = STEREO_DFT_OFFSET; + + /* last band covers whole HB range, no averaging needed */ + hb_gain[0] = hStereoDft->side_gain[k_offset * STEREO_DFT_BAND_MAX + hStereoDft->nbands - 1]; + hb_gain[1] = hStereoDft->side_gain[( k_offset + 1 ) * STEREO_DFT_BAND_MAX + hStereoDft->nbands - 1]; + + return; +} + + +/*-------------------------------------------------------------------* + * ivas_sba_dirac_stereo_upmix_hb() + * + * Apply panning to HB signal + *-------------------------------------------------------------------*/ + +static void ivas_sba_dirac_stereo_upmix_hb( + float hb_stereo_synth[CPE_CHANNELS][L_FRAME48k], /* i/o: stereo HB synthesis signal */ + float hb_synth[L_FRAME48k], /* i : HB signal */ + float hb_gain[NB_DIV], /* i : side gains for HB signal */ + const int16_t output_frame, /* i : output frame length per channel */ + const int16_t mcmasa, /* i : McMASA flag */ + const int16_t sba_mono_flag, /* i : flag for mono output */ + const int16_t bwidth, /* i : bandwidth of signal */ + const STEREO_DFT_DEC_DATA_HANDLE hStereoDft /* i : Stereo DFT handle for mixing matrix */ +) +{ + int16_t i; + float gp, gm; + float gain_fac; + + if ( !mcmasa ) + { + gain_fac = ( bwidth == FB ) ? 0.25f : 0.33f; /* last matrix element not used for SWB, divide by 3 instead of 4*/ + if ( sba_mono_flag ) + { + gp = hStereoDft->mixer_mat_smooth[0][0][8] + hStereoDft->mixer_mat_smooth[0][0][9] + + hStereoDft->mixer_mat_smooth[0][0][10]; + if ( bwidth == FB ) + { + gp += hStereoDft->mixer_mat_smooth[0][0][11]; + } + for ( i = 0; i < output_frame / 2; i++ ) + { + hb_stereo_synth[0][i] = hb_synth[i] * gain_fac * gp; + } + gp = hStereoDft->mixer_mat_smooth[0][0][8 + IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[0][0][9 + IVAS_MAX_NUM_BANDS] + + hStereoDft->mixer_mat_smooth[0][0][10 + IVAS_MAX_NUM_BANDS]; + if ( bwidth == FB ) + { + gp += hStereoDft->mixer_mat_smooth[0][0][11 + IVAS_MAX_NUM_BANDS]; + } + for ( i = output_frame / 2; i < output_frame; i++ ) + { + hb_stereo_synth[0][i] = hb_synth[i] * gain_fac * gp; + } + } + else + { + gp = hStereoDft->mixer_mat_smooth[0][0][8] + hStereoDft->mixer_mat_smooth[1][0][8] + + hStereoDft->mixer_mat_smooth[0][0][9] + hStereoDft->mixer_mat_smooth[1][0][9] + + hStereoDft->mixer_mat_smooth[0][0][10] + hStereoDft->mixer_mat_smooth[1][0][10]; + if ( bwidth == FB ) + { + gp += hStereoDft->mixer_mat_smooth[0][0][11] + hStereoDft->mixer_mat_smooth[1][0][11]; + } + + gm = hStereoDft->mixer_mat_smooth[0][0][8] - hStereoDft->mixer_mat_smooth[1][0][8] + + hStereoDft->mixer_mat_smooth[0][0][9] - hStereoDft->mixer_mat_smooth[1][0][9] + + hStereoDft->mixer_mat_smooth[0][0][10] - hStereoDft->mixer_mat_smooth[1][0][10]; + if ( bwidth == FB ) + { + gm += hStereoDft->mixer_mat_smooth[0][0][11] - hStereoDft->mixer_mat_smooth[1][0][11]; + } + + for ( i = 0; i < output_frame / 2; i++ ) + { + hb_stereo_synth[0][i] = 0.5f * hb_synth[i] * gain_fac * gp; + hb_stereo_synth[1][i] = 0.5f * hb_synth[i] * gain_fac * gm; + } + + gp = hStereoDft->mixer_mat_smooth[0][0][8 + IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[1][0][8 + IVAS_MAX_NUM_BANDS] + + hStereoDft->mixer_mat_smooth[0][0][9 + IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[1][0][9 + IVAS_MAX_NUM_BANDS] + + hStereoDft->mixer_mat_smooth[0][0][10 + IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[1][0][10 + IVAS_MAX_NUM_BANDS]; + if ( bwidth == FB ) + { + gp += hStereoDft->mixer_mat_smooth[0][0][11 + IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[1][0][11 + IVAS_MAX_NUM_BANDS]; + } + + gm = hStereoDft->mixer_mat_smooth[0][0][8 + IVAS_MAX_NUM_BANDS] - hStereoDft->mixer_mat_smooth[1][0][8 + IVAS_MAX_NUM_BANDS] + + hStereoDft->mixer_mat_smooth[0][0][9 + IVAS_MAX_NUM_BANDS] - hStereoDft->mixer_mat_smooth[1][0][9 + IVAS_MAX_NUM_BANDS] + + hStereoDft->mixer_mat_smooth[0][0][10 + IVAS_MAX_NUM_BANDS] - hStereoDft->mixer_mat_smooth[1][0][10 + IVAS_MAX_NUM_BANDS]; + if ( bwidth == FB ) + { + gm += hStereoDft->mixer_mat_smooth[0][0][11 + IVAS_MAX_NUM_BANDS] - hStereoDft->mixer_mat_smooth[1][0][11 + IVAS_MAX_NUM_BANDS]; + } + + for ( i = output_frame / 2; i < output_frame; i++ ) + { + hb_stereo_synth[0][i] = 0.5f * hb_synth[i] * gain_fac * gp; + hb_stereo_synth[1][i] = 0.5f * hb_synth[i] * gain_fac * gm; + } + } + } + else + { + for ( i = 0; i < output_frame / 2; i++ ) + { + hb_stereo_synth[0][i] = 0.5f * hb_synth[i] + 0.5f * hb_gain[0] * hb_synth[i]; + hb_stereo_synth[1][i] = 0.5f * hb_synth[i] - 0.5f * hb_gain[0] * hb_synth[i]; + } + + for ( i = output_frame / 2; i < output_frame; i++ ) + { + hb_stereo_synth[0][i] = 0.5f * hb_synth[i] + 0.5f * hb_gain[1] * hb_synth[i]; + hb_stereo_synth[1][i] = 0.5f * hb_synth[i] - 0.5f * hb_gain[1] * hb_synth[i]; + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * ivas_sba_dirac_stereo_apply_td_stefi() + * + * Apply TD stereo filling for ACELP HB + *-------------------------------------------------------------------*/ + +static void ivas_sba_dirac_stereo_apply_td_stefi( + STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */ + float *output[CPE_CHANNELS], /* i/o: output synthesis signal */ + const int16_t output_frame, /* i : output frame length per channel */ + const int16_t spar_flag /* i : SPAR flag */ +) +{ + int16_t i; + int16_t dftOvlLen; + float win_in, win_out; + float tmp; + const float *win_dft; + + if ( spar_flag ) + { + win_dft = hStereoDft->win32ms; + dftOvlLen = hStereoDft->dft32ms_ovl; + + float g_W_1, g_Y_1; + float g_W_2, g_Y_2; + float g_L, g_R; + float stefi_L, stefi_R; + + g_W_1 = ( hStereoDft->mixer_mat_smooth[0][1][8] + hStereoDft->mixer_mat_smooth[0][2][8] + hStereoDft->mixer_mat_smooth[0][3][8] ) + ( hStereoDft->mixer_mat_smooth[0][1][9] + hStereoDft->mixer_mat_smooth[0][2][9] + hStereoDft->mixer_mat_smooth[0][3][9] ) + ( hStereoDft->mixer_mat_smooth[0][1][10] + hStereoDft->mixer_mat_smooth[0][2][10] + hStereoDft->mixer_mat_smooth[0][3][10] ); + + g_Y_1 = ( hStereoDft->mixer_mat_smooth[1][1][8] + hStereoDft->mixer_mat_smooth[1][2][8] + hStereoDft->mixer_mat_smooth[1][3][8] ) + ( hStereoDft->mixer_mat_smooth[1][1][9] + hStereoDft->mixer_mat_smooth[1][2][9] + hStereoDft->mixer_mat_smooth[1][3][9] ) + ( hStereoDft->mixer_mat_smooth[1][1][10] + hStereoDft->mixer_mat_smooth[1][2][10] + hStereoDft->mixer_mat_smooth[1][3][10] ); + + g_W_2 = ( hStereoDft->mixer_mat_smooth[0][1][8 + IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[0][2][8 + IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[0][3][8 + IVAS_MAX_NUM_BANDS] ) + ( hStereoDft->mixer_mat_smooth[0][1][9 + IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[0][2][9 + IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[0][3][9 + IVAS_MAX_NUM_BANDS] ) + ( hStereoDft->mixer_mat_smooth[0][1][10 + IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[0][2][10 + IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[0][3][10 + IVAS_MAX_NUM_BANDS] ); + + g_Y_2 = ( hStereoDft->mixer_mat_smooth[1][1][8 + IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[1][2][8 + IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[1][3][8 + IVAS_MAX_NUM_BANDS] ) + ( hStereoDft->mixer_mat_smooth[1][1][9 + IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[1][2][9 + IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[1][3][9 + IVAS_MAX_NUM_BANDS] ) + ( hStereoDft->mixer_mat_smooth[1][1][10 + IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[1][2][10 + IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[1][3][10 + IVAS_MAX_NUM_BANDS] ); + + g_L = 0.16f * ( g_W_1 + g_W_2 - g_Y_1 - g_Y_2 ); + g_R = 0.16f * ( g_W_1 + g_W_2 + g_Y_1 + g_Y_2 ); + + for ( i = 0; i < dftOvlLen; i++ ) + { + win_in = win_dft[STEREO_DFT32MS_STEP * i] * win_dft[STEREO_DFT32MS_STEP * i]; + win_out = 1 - win_in; + + stefi_L = ( win_out * hStereoDft->g_L_prev + win_in * g_L ) * 0.5f * hStereoDft->hb_stefi_sig[i]; + stefi_R = ( win_out * hStereoDft->g_R_prev + win_in * g_R ) * 0.5f * hStereoDft->hb_stefi_sig[i]; + + output[0][i] += stefi_L; + output[1][i] += stefi_R; + } + for ( i = dftOvlLen; i < output_frame; i++ ) + { + + stefi_L = g_L * 0.5f * hStereoDft->hb_stefi_sig[i]; + stefi_R = g_R * 0.5f * hStereoDft->hb_stefi_sig[i]; + + output[0][i] += stefi_L; + output[1][i] += stefi_R; + } + hStereoDft->g_L_prev = g_L; + hStereoDft->g_R_prev = g_R; + } + else if ( max( hStereoDft->td_gain[0], hStereoDft->td_gain[1] ) > 0 ) + { + win_dft = hStereoDft->win32ms; + dftOvlLen = hStereoDft->dft32ms_ovl; + + for ( i = 0; i < dftOvlLen; i++ ) + { + win_in = win_dft[STEREO_DFT32MS_STEP * i] * win_dft[STEREO_DFT32MS_STEP * i]; + win_out = 1 - win_in; + tmp = ( win_in * hStereoDft->td_gain[0] + win_out * hStereoDft->td_gain[1] ) * 0.5f * hStereoDft->hb_stefi_sig[i]; + + output[0][i] += tmp; + output[1][i] -= tmp; + } + for ( i = dftOvlLen; i < output_frame; i++ ) + { + tmp = hStereoDft->td_gain[0] * 0.5f * hStereoDft->hb_stefi_sig[i]; + output[0][i] += tmp; + output[1][i] -= tmp; + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * ivas_sba_dirac_stereo_smooth_parameters() + * + * Smooth DFT Stereo parameters + *-------------------------------------------------------------------*/ + +void ivas_sba_dirac_stereo_smooth_parameters( + STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */ + ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD handle for upmixing */ + const int16_t cross_fade_start_offset, /* i : SPAR mixer delay compensation */ + const int32_t output_Fs, /* i : Fs for delay calculation */ + const int16_t num_md_sub_frames /* i : number of subframes in mixing matrix */ +) +{ + int16_t i, j, k, i_sf; + int16_t b; + int16_t k_offset; + float *side_gain, *prev_side_gain; + float *res_pred_gain, *prev_res_pred_gain; + + k_offset = STEREO_DFT_OFFSET; + prev_side_gain = hStereoDft->side_gain; + side_gain = hStereoDft->side_gain + k_offset * STEREO_DFT_BAND_MAX; + prev_res_pred_gain = hStereoDft->res_pred_gain; + res_pred_gain = hStereoDft->res_pred_gain + k_offset * STEREO_DFT_BAND_MAX; + + if ( !hMdDec ) + { + /* Smoothing of side and prediction gains between ftrames */ + for ( b = hStereoDft->res_pred_band_min; b < hStereoDft->nbands; b++ ) + { + if ( hStereoDft->attackPresent ) + { + res_pred_gain[b] *= 0.8f; + res_pred_gain[b + STEREO_DFT_BAND_MAX] *= 0.8f; + } + else + { + side_gain[b] = hStereoDft->smooth_fac[0][b] * prev_side_gain[b] + ( 1.f - hStereoDft->smooth_fac[0][b] ) * side_gain[b]; + side_gain[b + STEREO_DFT_BAND_MAX] = hStereoDft->smooth_fac[1][b] * side_gain[b] + ( 1.f - hStereoDft->smooth_fac[1][b] ) * side_gain[b + STEREO_DFT_BAND_MAX]; + res_pred_gain[b] = hStereoDft->smooth_fac[0][b] * prev_res_pred_gain[b] + ( 1.f - hStereoDft->smooth_fac[0][b] ) * res_pred_gain[b]; + res_pred_gain[b + STEREO_DFT_BAND_MAX] = hStereoDft->smooth_fac[1][b] * res_pred_gain[b] + ( 1.f - hStereoDft->smooth_fac[1][b] ) * res_pred_gain[b + STEREO_DFT_BAND_MAX]; + } + } + } + + if ( hMdDec != 0 ) + { + float xfade_start_ns; + int16_t xfade_delay_subframes; + int16_t i_hist; + int16_t md_sf; + + xfade_start_ns = cross_fade_start_offset / (float) output_Fs * 1000000000.f - IVAS_FB_ENC_DELAY_NS; + xfade_delay_subframes = (int16_t) ( xfade_start_ns / ( FRAME_SIZE_NS / MAX_PARAM_SPATIAL_SUBFRAMES ) ); + + i_hist = 4 - xfade_delay_subframes; + + for ( k = 0; k < 2; k++ ) + { + for ( i_sf = k * 2; i_sf < ( k + 1 ) * 2; i_sf++ ) + { + + md_sf = ( num_md_sub_frames == MAX_PARAM_SPATIAL_SUBFRAMES ) ? i_sf : 0; + + if ( hStereoDft->first_frame ) + { + for ( i = 0; i < 2; i++ ) + { + for ( j = 0; j < 4; j++ ) + { + for ( b = 0; b < hStereoDft->nbands; b++ ) + { + hStereoDft->mixer_mat_smooth[i][j][b + k * IVAS_MAX_NUM_BANDS] = hMdDec->mixer_mat[i][j][b]; + } + for ( ; b < IVAS_MAX_NUM_BANDS; b++ ) + { + hStereoDft->mixer_mat_smooth[i][j][b + k * IVAS_MAX_NUM_BANDS] = 0.f; + } + } + } + } + else + { + for ( i = 0; i < 2; i++ ) + { + for ( j = 0; j < 4; j++ ) + { + for ( b = 0; b < hStereoDft->nbands; b++ ) + { + float beta = hStereoDft->smooth_fac[k][b]; + hStereoDft->mixer_mat_smooth[i][j][b + k * IVAS_MAX_NUM_BANDS] = + beta * hStereoDft->mixer_mat_smooth[i][j][b + k * IVAS_MAX_NUM_BANDS] + ( 1 - beta ) * hMdDec->mixer_mat_prev[i_hist][i][j][b]; + } + } + } + } + + mvr2r( hMdDec->mixer_mat_prev[1][0][0], hMdDec->mixer_mat_prev[0][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_SPAR_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS ); + mvr2r( hMdDec->mixer_mat_prev[2][0][0], hMdDec->mixer_mat_prev[1][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_SPAR_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS ); + mvr2r( hMdDec->mixer_mat_prev[3][0][0], hMdDec->mixer_mat_prev[2][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_SPAR_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS ); + mvr2r( hMdDec->mixer_mat_prev[4][0][0], hMdDec->mixer_mat_prev[3][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_SPAR_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS ); + + for ( i = 0; i < 2; i++ ) + { + for ( j = 0; j < 4; j++ ) + { + for ( b = 0; b < hStereoDft->nbands; b++ ) + { + hMdDec->mixer_mat_prev[4][i][j][b] = hMdDec->mixer_mat[i][j][b + md_sf * IVAS_MAX_NUM_BANDS]; + } + } + } + } + } + + hStereoDft->first_frame = 0; + } + + return; +} + + +/*-------------------------------------------------------------------* + * ivas_sba_dirac_stereo_dec() + * + * Create stereo output for SBA DirAC via DFT stereo + *-------------------------------------------------------------------*/ + +void ivas_sba_dirac_stereo_dec( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float *output[CPE_CHANNELS], /* i/o: output synthesis signal */ + const int16_t output_frame, /* i : output frame length per channel */ + const int16_t mcmasa /* i : McMASA flag */ +) +{ + int16_t dtx_flag, fd_cng_flag; + int16_t sba_mono_flag; + int16_t memOffset; + float tmp_buf[NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS )]; + float tmp_synth[L_FRAME16k]; + float hb_gain[NB_DIV]; + float hb_synth_stereo[CPE_CHANNELS][L_FRAME48k]; + float DFT[CPE_CHANNELS][STEREO_DFT_BUF_MAX]; + SCE_DEC_HANDLE hSCE; + CPE_DEC_HANDLE hCPE; + STEREO_DFT_DEC_DATA_HANDLE hStereoDft; + + hSCE = st_ivas->hSCE[0]; + hCPE = st_ivas->hCPE[0]; + hStereoDft = hCPE->hStereoDft; + + if ( st_ivas->nchan_transport > 1 && !mcmasa ) + { + dtx_flag = 0; + fd_cng_flag = 0; + } + else + { + dtx_flag = ( hSCE->hCoreCoder[0]->core_brate <= SID_2k40 ); + fd_cng_flag = ( dtx_flag && hSCE->hCoreCoder[0]->cng_type == FD_CNG ); + } + sba_mono_flag = ( st_ivas->hDecoderConfig->nchan_out == 1 ) ? 1 : 0; + + memOffset = NS2SA( output_frame * FRAMES_PER_SEC, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ); + + ivas_sba_dirac_stereo_config( hStereoDft->hConfig ); + hStereoDft->nbands = ivas_sba_dirac_stereo_band_config( hStereoDft->band_limits, st_ivas->hDecoderConfig->output_Fs, hStereoDft->NFFT, ( ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT ) && !mcmasa ) ); + stereo_dft_dec_update( hStereoDft, output_frame, 1 /*st_ivas->sba_dirac_stereo_flag*/ ); + if ( st_ivas->nchan_transport > 1 ) + { + stereo_dft_dec_analyze( hCPE, output[0], DFT, 0, output_frame, output_frame, DFT_STEREO_DEC_ANA_FB, 0, 0 ); + stereo_dft_dec_analyze( hCPE, output[1], DFT, 1, output_frame, output_frame, DFT_STEREO_DEC_ANA_FB, 0, 0 ); + hStereoDft->core_hist[0] = hCPE->hCoreCoder[0]->core; + } + else + { + /* nrg calculation for TD Stereo Filling, as done in ICBWE which is not used in this case */ + ivas_sba_dirac_stereo_compute_td_stefi_nrgs( hStereoDft, hSCE->save_hb_synth, hSCE->hCoreCoder[0]->core, output_frame, fd_cng_flag ); + + /* do DFT Stereo core switching (including DFT analysis) here as CPE element was not available in SCE decoder */ + mvr2r( hSCE->save_synth, tmp_synth, hSCE->hCoreCoder[0]->L_frame ); + stereo_dft_dec_core_switching( hCPE, output[0] /*hSCE->save_output*/, hSCE->save_synth, hSCE->save_hb_synth, DFT, output_frame, 0, dtx_flag ); + + /* do updates here after skipping this in SCE decoder (needs to be done after core switching) */ + updt_dec_common( hSCE->hCoreCoder[0], NORMAL_HQ_CORE, -1, hSCE->save_synth ); + } + + /* mapping of DirAC parameters (azimuth, elevation, diffuseness) to DFT Stereo parameters (side gain, prediction gain) */ + map_params_dirac_to_stereo( hStereoDft, st_ivas->hQMetaData, tmp_synth, DFT[0], st_ivas->ivas_format == MC_FORMAT, + ( ( st_ivas->ivas_format != SBA_FORMAT && st_ivas->ivas_format != SBA_ISM_FORMAT ) || mcmasa ) ? hSCE->hCoreCoder[0]->L_frame : output_frame, + ( ( st_ivas->ivas_format != SBA_FORMAT && st_ivas->ivas_format != SBA_ISM_FORMAT ) || mcmasa ) ); + + if ( ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT ) && !mcmasa ) + { + set_f( hStereoDft->res_pred_gain, 1.f, 3 * STEREO_DFT_BAND_MAX ); + } + + /* DFT Stereo upmix */ + stereo_dft_dec( hStereoDft, hCPE->hCoreCoder[0], DFT, NULL, NULL, 1 /*st_ivas->sba_dirac_stereo_flag*/, sba_mono_flag, ( st_ivas->hSpar != NULL && !mcmasa ) ? st_ivas->hSpar->hMdDec : NULL, ( st_ivas->hSpar != NULL && !mcmasa ) ? st_ivas->hSpar->hFbMixer->cross_fade_start_offset : 0, + st_ivas->hDecoderConfig->output_Fs, st_ivas->nchan_transport, ivas_get_spar_dec_md_num_subframes( st_ivas->sba_order, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->last_active_ivas_total_brate ) ); + + /* DFT synthesis */ + stereo_dft_dec_synthesize( hCPE, DFT, 0, output[0], output_frame ); + if ( !sba_mono_flag ) + { + stereo_dft_dec_synthesize( hCPE, DFT, 1, output[1], output_frame ); + } + + synchro_synthesis( st_ivas->hDecoderConfig->ivas_total_brate, hCPE, output, output_frame, 1 /*st_ivas->sba_dirac_stereo_flag*/ ); + + /* output scaling */ + if ( !sba_mono_flag ) + { + v_multc( output[0], 0.5f, output[0], output_frame ); + v_multc( output[1], 0.5f, output[1], output_frame ); + } + + /* delay HB synth */ + if ( st_ivas->nchan_transport == 1 ) + { + mvr2r( hSCE->save_hb_synth + output_frame - memOffset, tmp_buf, memOffset ); + mvr2r( hSCE->save_hb_synth, hSCE->save_hb_synth + memOffset, output_frame - memOffset ); + mvr2r( hSCE->prev_hb_synth, hSCE->save_hb_synth, memOffset ); + mvr2r( tmp_buf, hSCE->prev_hb_synth, memOffset ); + } + + if ( ( hCPE->hCoreCoder[0]->core == ACELP_CORE || hCPE->hCoreCoder[0]->last_core == ACELP_CORE ) && !fd_cng_flag && st_ivas->nchan_transport == 1 ) + { + /* upmix ACELP BWE */ + ivas_sba_dirac_stereo_compute_hb_gain( hStereoDft, hb_gain ); + + ivas_sba_dirac_stereo_upmix_hb( hb_synth_stereo, hSCE->save_hb_synth, hb_gain, output_frame, ( ( st_ivas->ivas_format != SBA_FORMAT && st_ivas->ivas_format != SBA_ISM_FORMAT ) || mcmasa ), sba_mono_flag, hSCE->hCoreCoder[0]->bwidth, hStereoDft ); + + /* add HB to ACELP core */ + v_add( output[0], hb_synth_stereo[0], output[0], output_frame ); + if ( !sba_mono_flag ) + { + v_add( output[1], hb_synth_stereo[1], output[1], output_frame ); + + /* apply TD Stereo Filling as is done in ICBWE */ + ivas_sba_dirac_stereo_apply_td_stefi( hStereoDft, output, output_frame, ( ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT ) && !mcmasa ) ); + } + } + + return; +} diff --git a/lib_dec/ivas_sba_rendering_internal.c b/lib_dec/ivas_sba_rendering_internal.c new file mode 100644 index 0000000000000000000000000000000000000000..6d0c73eb56fe9680f5af78ae45b350d089715a8e --- /dev/null +++ b/lib_dec/ivas_sba_rendering_internal.c @@ -0,0 +1,616 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_prot_rend.h" +#include "ivas_stat_dec.h" +#include "ivas_cnst.h" +#include +#include "wmc_auto.h" + + + + +/*-------------------------------------------------------------------------* + * ivas_sba2MC_cldfb() + * + * SBA signals transformed into MC in CLDFB domain + *-------------------------------------------------------------------------*/ + +void ivas_sba2mc_cldfb( + IVAS_OUTPUT_SETUP hInSetup, /* i : Format of input layout */ + float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o: cldfb real part */ + float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o: cldfb imag part */ + const int16_t nb_channels_out, /* i : nb of output channels */ + const int16_t nb_bands, /* i : nb of CLDFB bands to process */ + const int16_t nb_timeslots, /* i : number of time slots to process */ + const float *hoa_dec_mtx /* i : HOA decoding mtx */ +) +{ + int16_t iBlock, iBand, n, m; + float realOut[16][MAX_PARAM_SPATIAL_SUBFRAMES * CLDFB_NO_CHANNELS_MAX], imagOut[16][MAX_PARAM_SPATIAL_SUBFRAMES * CLDFB_NO_CHANNELS_MAX]; + float g; + float *p_real, *p_imag, *p_realOut, *p_imagOut; + int16_t nb_channels_in; + + push_wmops( "ivas_sba2mc_cldfb" ); + nb_channels_in = hInSetup.nchan_out_woLFE; + assert( ( nb_channels_in == 16 ) && ( nb_channels_out == 11 ) && "ivas_sba2mc_cldfb; only HOA3 to CICP19 is for now supported!" ); + + for ( n = 0; n < nb_channels_out; n++ ) + { + set_zero( realOut[n], MAX_PARAM_SPATIAL_SUBFRAMES * nb_bands ); + set_zero( imagOut[n], MAX_PARAM_SPATIAL_SUBFRAMES * nb_bands ); + + for ( m = 0; m < nb_channels_in; m++ ) + { + g = hoa_dec_mtx[SBA_NHARM_HOA3 * n + m]; + p_realOut = realOut[n]; + p_imagOut = imagOut[n]; + + for ( iBlock = 0; iBlock < nb_timeslots; iBlock++ ) + { + p_real = RealBuffer[m][iBlock]; + p_imag = ImagBuffer[m][iBlock]; + for ( iBand = 0; iBand < nb_bands; iBand++ ) + { + *p_realOut = *p_realOut + g * *( p_real++ ); + *p_imagOut = *p_imagOut + g * *( p_imag++ ); + p_realOut++; + p_imagOut++; + } + } + } + } + + for ( n = 0; n < nb_channels_out; n++ ) + { + p_realOut = realOut[n]; + p_imagOut = imagOut[n]; + + for ( iBlock = 0; iBlock < nb_timeslots; iBlock++ ) + { + p_real = RealBuffer[n][iBlock]; + p_imag = ImagBuffer[n][iBlock]; + for ( iBand = 0; iBand < nb_bands; iBand++ ) + { + *( p_real++ ) = *p_realOut++; + *( p_imag++ ) = *p_imagOut++; + } + } + } + + pop_wmops(); + return; +} + + +/*-------------------------------------------------------------------------* + * ivas_mc2sba() + * + * MC signals transformed into SBA in TD domain + *-------------------------------------------------------------------------*/ + +void ivas_mc2sba( + IVAS_OUTPUT_SETUP hIntSetup, /* i : Format of decoder output */ + float *in_buffer_td[], /* i : MC signals (on input) and the HOA3 (on output) */ + float *buffer_td[], /* i/o: MC signals (on input) and the HOA3 (on output) */ + const int16_t output_frame, /* i : output frame length per channel */ + const int16_t sba_order, /* i : Ambisonic (SBA) order */ + const float gain_lfe /* i : gain for LFE, 0 = ignore LFE */ +) +{ + int16_t i, j, k; + int16_t idx_lfe, idx_in; + float buffer_tmp[16][L_FRAME48k]; + float gains[16]; + int16_t azimuth, elevation; + int16_t sba_num_chans; + + assert( ( sba_order <= 3 ) && "Only order up to 3 is supported!" ); + /* Init*/ + sba_num_chans = ( sba_order + 1 ) * ( sba_order + 1 ); + for ( j = 0; j < sba_num_chans; j++ ) + { + set_zero( buffer_tmp[j], output_frame ); + } + + /* HOA encoding*/ + idx_lfe = 0; + idx_in = 0; + for ( i = 0; i < hIntSetup.nchan_out_woLFE + hIntSetup.num_lfe; i++ ) + { + if ( ( hIntSetup.num_lfe > 0 ) && ( i == hIntSetup.index_lfe[idx_lfe] ) ) + { + if ( gain_lfe > 0.f ) + { + /* Add LFE to omni W with gain*/ + for ( k = 0; k < output_frame; k++ ) + { + buffer_tmp[0][k] += gain_lfe * in_buffer_td[i][k]; + } + } + + if ( idx_lfe < ( hIntSetup.num_lfe - 1 ) ) + { + idx_lfe++; + } + } + else + { + azimuth = (int16_t) ( hIntSetup.ls_azimuth[idx_in] ); + elevation = (int16_t) ( hIntSetup.ls_elevation[idx_in] ); + idx_in++; + + /* get HOA response for direction (ACN/SN3D)*/ + ivas_dirac_dec_get_response( + azimuth, + elevation, + gains, + sba_order ); + + for ( j = 0; j < sba_num_chans; j++ ) + { + for ( k = 0; k < output_frame; k++ ) + { + buffer_tmp[j][k] += gains[j] * in_buffer_td[i][k]; + } + } + } + } + + for ( j = 0; j < sba_num_chans; j++ ) + { + mvr2r( buffer_tmp[j], buffer_td[j], output_frame ); + } + + return; +} + + +/*-------------------------------------------------------------------------* + * ivas_param_mc_mc2sba_cldfb() + * + * MC signals transformed into SBA in CLDFB domain + * used for binaural rendering with head rotation + *-------------------------------------------------------------------------*/ + +void ivas_param_mc_mc2sba_cldfb( + IVAS_OUTPUT_SETUP hTransSetup, /* i : transported MC Format */ + float *hoa_encoder, /* i : HOA3 encoder for the transported MC format */ + const int16_t slot_idx, /* i : current slot in the subframe */ + float Cldfb_RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o: Contains the MC signals (on input) and the HOA3 (on output) */ + float Cldfb_ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o: Contains the MC signals (on input) and the HOA3 (on output) */ + const int16_t nBands, /* i : number of synth CLDFB bands */ + const float gain_lfe /* i : gain applied to LFE */ +) +{ + int16_t idx_ch, idx_band; + int16_t idx_lfe, idx_in, idx_out; + float Cldfb_RealBuffer_tmp[MAX_INTERN_CHANNELS][CLDFB_NO_CHANNELS_MAX]; + float Cldfb_ImagBuffer_tmp[MAX_INTERN_CHANNELS][CLDFB_NO_CHANNELS_MAX]; + float *gains; + int16_t sba_num_chans; + + /* Init*/ + sba_num_chans = MAX_INTERN_CHANNELS; + + for ( idx_ch = 0; idx_ch < sba_num_chans; idx_ch++ ) + { + set_zero( Cldfb_RealBuffer_tmp[idx_ch], CLDFB_NO_CHANNELS_MAX ); + set_zero( Cldfb_ImagBuffer_tmp[idx_ch], CLDFB_NO_CHANNELS_MAX ); + } + + idx_lfe = 0; + idx_in = 0; + for ( idx_ch = 0; idx_ch < hTransSetup.nchan_out_woLFE + hTransSetup.num_lfe; idx_ch++ ) + { + if ( ( hTransSetup.num_lfe > 0 ) && ( idx_ch == hTransSetup.index_lfe[idx_lfe] ) ) + { + if ( gain_lfe > 0.f ) + { + /* Add LFE to Omni Channel i.e. W (Just first Band) */ + Cldfb_RealBuffer_tmp[0][0] += gain_lfe * Cldfb_RealBuffer[idx_ch][slot_idx][0]; + Cldfb_ImagBuffer_tmp[0][0] += gain_lfe * Cldfb_ImagBuffer[idx_ch][slot_idx][0]; + } + if ( idx_lfe < ( hTransSetup.num_lfe - 1 ) ) + { + idx_lfe++; + } + } + else + { + gains = hoa_encoder + idx_in * sba_num_chans; + for ( idx_out = 0; idx_out < sba_num_chans; idx_out++ ) + { + for ( idx_band = 0; idx_band < nBands; idx_band++ ) + { + Cldfb_RealBuffer_tmp[idx_out][idx_band] += ( *gains ) * Cldfb_RealBuffer[idx_ch][slot_idx][idx_band]; + Cldfb_ImagBuffer_tmp[idx_out][idx_band] += ( *gains ) * Cldfb_ImagBuffer[idx_ch][slot_idx][idx_band]; + } + gains++; + } + idx_in++; + } + } + + for ( idx_ch = 0; idx_ch < sba_num_chans; idx_ch++ ) + { + mvr2r( Cldfb_RealBuffer_tmp[idx_ch], Cldfb_RealBuffer[idx_ch][slot_idx], nBands ); + mvr2r( Cldfb_ImagBuffer_tmp[idx_ch], Cldfb_ImagBuffer[idx_ch][slot_idx], nBands ); + } + + return; +} + + +/*-------------------------------------------------------------------* + * ivas_sba_remapTCs() + * + * Get TCs from Ambisonics signal in ACN + *-------------------------------------------------------------------*/ + +/*! r: SBA DirAC stereo flag */ +int16_t ivas_sba_remapTCs( + float *sba_data[], /* i/o: SBA signals */ + Decoder_Struct *st_ivas, /* i/o: decoder struct */ + const int16_t output_frame /* i : frame length */ +) +{ + int16_t nchan_remapped; + + + nchan_remapped = st_ivas->nchan_transport; + if ( nchan_remapped == 3 ) + { + + nchan_remapped++; + + if ( nchan_remapped == 4 ) + { + /*For planar A-format channel 2 and 3 are identical -> Z=0*/ + mvr2r( sba_data[2], sba_data[3], output_frame ); + } + } + + if ( st_ivas->nchan_transport >= 3 ) + { + int16_t i = 0; + float temp; + + /*convert WYXZ downmix to WYZX*/ + for ( i = 0; i < output_frame; i++ ) + { + temp = sba_data[2][i]; + sba_data[2][i] = sba_data[3][i]; + sba_data[3][i] = temp; + if ( st_ivas->nchan_transport == 3 ) + { + sba_data[2][i] = 0; + } + } + } + + return ( nchan_remapped ); +} + + +/*-------------------------------------------------------------------------* + * ivas_ism2sba() + * + * ISM transformed into SBA in TD domain. + *-------------------------------------------------------------------------*/ + +void ivas_ism2sba( + float *buffer_td[], /* i/o: TD signal buffers */ + ISM_RENDERER_HANDLE hIsmRendererData, /* i/o: renderer data */ + const ISM_METADATA_HANDLE hIsmMetaData[], /* i : object metadata */ + const int16_t nchan_ism, /* i : number of objects */ + const int16_t output_frame, /* i : output frame length per channel */ + const int16_t sba_order /* i : Ambisonic (SBA) order */ +) +{ + int16_t i, j, k; + float buffer_tmp[16][L_FRAME48k]; + float gains[16]; + float g1, g2; + int16_t azimuth, elevation; + int16_t sba_num_chans; + + assert( ( sba_order <= 3 ) && "Only order up to 3 is supported!" ); + assert( hIsmRendererData != NULL && "hIsmRendererData not allocated!" ); + + /* Init*/ + sba_num_chans = ( sba_order + 1 ) * ( sba_order + 1 ); + for ( j = 0; j < sba_num_chans; j++ ) + { + set_zero( buffer_tmp[j], output_frame ); + } + + for ( i = 0; i < nchan_ism; i++ ) + { + // TODO tmu review when #215 is resolved + azimuth = (int16_t) floorf( hIsmMetaData[i]->azimuth + 0.5f ); + elevation = (int16_t) floorf( hIsmMetaData[i]->elevation + 0.5f ); + + /*get HOA gets for direction (ACN/SN3D)*/ + ivas_dirac_dec_get_response( azimuth, elevation, gains, sba_order ); + + for ( j = 0; j < sba_num_chans; j++ ) + { + g1 = 1.f; + g2 = 0.f; + for ( k = 0; k < output_frame; k++ ) + { + buffer_tmp[j][k] += ( g2 * gains[j] + g1 * hIsmRendererData->prev_gains[i][j] ) * buffer_td[i][k]; + g2 += 1.f / ( output_frame - 1 ); + g1 = 1.0f - g2; + } + hIsmRendererData->prev_gains[i][j] = gains[j]; + } + } + + for ( j = 0; j < sba_num_chans; j++ ) + { + mvr2r( buffer_tmp[j], buffer_td[j], output_frame ); + } + + return; +} + +/*-------------------------------------------------------------------------* + * ivas_ism2sba() + * + * ISM transformed into SBA in TD domain. + *-------------------------------------------------------------------------*/ + +void ivas_ism2sba_sf( + float *buffer_in[], /* i : TC buffer */ + float *buffer_out[], /* o : TD signal buffers */ + ISM_RENDERER_HANDLE hIsmRendererData, /* i/o: renderer data */ + const int16_t num_objects, /* i : number of objects */ + const int16_t n_samples_to_render, /* i : output frame length per channel */ + const int16_t offset, /* i : offset for the interpolatr */ + const int16_t sba_order /* i : Ambisonic (SBA) order */ +) +{ + int16_t i, j, k; + float g1, *g2, *tc, *out, gain, prev_gain; + int16_t sba_num_chans; + + assert( ( sba_order <= 3 ) && "Only order up to 3 is supported!" ); + assert( hIsmRendererData != NULL && "hIsmRendererData not allocated!" ); + /* Init*/ + sba_num_chans = ( sba_order + 1 ) * ( sba_order + 1 ); + for ( j = 0; j < sba_num_chans; j++ ) + { + set_zero( buffer_out[j], n_samples_to_render ); + } + + for ( i = 0; i < num_objects; i++ ) + { + for ( j = 0; j < sba_num_chans; j++ ) + { + g2 = hIsmRendererData->interpolator + offset; + tc = buffer_in[i] + offset; + out = buffer_out[j]; + gain = hIsmRendererData->gains[i][j]; + prev_gain = hIsmRendererData->prev_gains[i][j]; + for ( k = 0; k < n_samples_to_render; k++ ) + { + g1 = 1.0f - *g2; + *( out++ ) += ( ( *( g2++ ) ) * gain + g1 * prev_gain ) * ( *( tc++ ) ); + } + } + } + + return; +} + +/*-------------------------------------------------------------------* + * ivas_sba_upmixer_renderer() + * + * SBA upmix & rendering + *-------------------------------------------------------------------*/ + +ivas_error ivas_sba_upmixer_renderer( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */ + float *output[], /* i/o: transport/output audio channels */ + const int16_t output_frame /* i : output frame length */ +) +{ + int16_t nchan_internal; + int16_t sba_ch_idx; + ivas_error error; + + push_wmops( "ivas_sba_upmixer_renderer" ); + nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); + + /* Upmixer + Renderer */ + ivas_spar_dec_upmixer( st_ivas, output, nchan_internal, output_frame ); + + if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_DEC ) + { + float *output_f[MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS]; + int16_t ch; + AUDIO_CONFIG output_config; + + output_config = ( st_ivas->ivas_format == SBA_ISM_FORMAT ? st_ivas->hOutSetup.output_config : st_ivas->hDecoderConfig->output_config ); + + sba_ch_idx = 0; + if ( st_ivas->ivas_format == SBA_ISM_FORMAT && st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + { + sba_ch_idx = st_ivas->nchan_ism; + } + + for ( ch = 0; ch < ivas_get_nchan_buffers_dec( st_ivas, st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ) - sba_ch_idx; ch++ ) + { + output_f[ch] = output[ch]; + } + + if ( ( error = ivas_sba_linear_renderer( output_f, output_frame, st_ivas->hIntSetup.nchan_out_woLFE, st_ivas->nchan_ism, output_config, st_ivas->hOutSetup ) ) != IVAS_ERR_OK ) + { + return error; + } + } + pop_wmops(); + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * ivas_sba_linear_renderer() + * + * Linear rendering for SBA format + *-------------------------------------------------------------------*/ + +ivas_error ivas_sba_linear_renderer( + float *output_f[], /* i/o: synthesized core-coder transport channels/DirAC output */ + const int16_t output_frame, /* i : output frame length per channel */ + const int16_t nchan_in, /* i : number of input ambisonics channels */ + const int16_t nchan_ism, /* i : number of objects */ + const AUDIO_CONFIG output_config, /* i : output audio configuration */ + const IVAS_OUTPUT_SETUP output_setup /* i : output format setup */ +) +{ + int16_t i; + int16_t nchan_hoa; + ivas_error error; + + error = IVAS_ERR_OK; + + /* Number of channels of HOA depends of transport format which is mixed order xH1V*/ + nchan_hoa = nchan_in; + + if ( nchan_in == 6 ) /*2H1V*/ + { + nchan_hoa = 9; + } + else if ( nchan_in == 8 ) /*3H1V*/ + { + nchan_hoa = 16; + } + + switch ( output_config ) + { + case IVAS_AUDIO_CONFIG_FOA: /* Ambisonics output, order: 1 */ + case IVAS_AUDIO_CONFIG_HOA2: /* Ambisonics output, order: 2 */ + case IVAS_AUDIO_CONFIG_HOA3: /* Ambisonics output, order: 3 */ + for ( i = nchan_hoa; i < output_setup.nchan_out_woLFE; i++ ) + { + set_zero( output_f[i], output_frame ); + } + break; + case IVAS_AUDIO_CONFIG_EXTERNAL: + for ( i = output_setup.nchan_out_woLFE - 1; i >= nchan_ism; i-- ) + { + mvr2r( output_f[i - nchan_ism], output_f[i], output_frame ); + } + for ( ; i >= 0; i-- ) + { + set_zero( output_f[i], output_frame ); + } + break; + default: + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error: illegal output configuration, Exiting.\n" ); + } + + return error; +} + + +/*-------------------------------------------------------------------* + * ivas_sba_mix_matrix_determiner() + * + * Determine SBA mixing matrices + *-------------------------------------------------------------------*/ + +void ivas_sba_mix_matrix_determiner( + SPAR_DEC_HANDLE hSpar, /* i/o: SPAR decoder handle */ + float *output[], /* i/o: transport/output audio channels */ + const int16_t bfi, /* i : BFI flag */ + const int16_t nchan_remapped, /* i : num channels after remapping of TCs */ + const int16_t output_frame, /* i : output frame length */ + const int16_t num_md_sub_frames /* i : number of subframes in mixing matrix*/ +) +{ + int16_t i, ch; + float temp; + int16_t num_bands_out, nchan_transport, nchan_out; + + /* Convert numeric range */ + for ( ch = 0; ch < nchan_remapped; ch++ ) + { + for ( i = 0; i < output_frame; i++ ) + { + temp = output[ch][i]; + temp = floorf( temp + 0.5f ); + + if ( temp > MAX16B_FLT ) + { + temp = MAX16B_FLT; + } + else if ( temp < ( -1.0f * PCM16_TO_FLT_FAC ) ) + { + temp = ( -1.0f * PCM16_TO_FLT_FAC ); + } + temp *= ( 1.0f / PCM16_TO_FLT_FAC ); + output[ch][i] = temp; + } + } + + /* AGC */ + nchan_transport = hSpar->hMdDec->spar_md_cfg.nchan_transport; + nchan_out = nchan_transport; + ivas_agc_dec_process( hSpar->hAgcDec, output, output, nchan_transport, output_frame ); + + /* Convert numeric range back */ + for ( ch = 0; ch < nchan_out; ch++ ) + { + for ( i = 0; i < output_frame; i++ ) + { + output[ch][i] = output[ch][i] * PCM16_TO_FLT_FAC; + } + } + + /* Mixing matrix determiner */ + num_bands_out = hSpar->hFbMixer->pFb->filterbank_num_bands; + ivas_spar_dec_gen_umx_mat( hSpar->hMdDec, nchan_transport, num_bands_out, bfi, num_md_sub_frames ); + + return; +} + + diff --git a/lib_dec/ivas_sce_dec.c b/lib_dec/ivas_sce_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..752ce0e9591c75751413dcc9c54de296fc5f1298 --- /dev/null +++ b/lib_dec/ivas_sce_dec.c @@ -0,0 +1,439 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include "options.h" +#include "cnst.h" +#include "ivas_cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_rom_com.h" +#include "wmc_auto.h" + + +/*--------------------------------------------------------------------------* + * ivas_sce_dec() + * + * Single Channel Element (SCE) decoding routine + *--------------------------------------------------------------------------*/ + +ivas_error ivas_sce_dec( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const int16_t sce_id, /* i : SCE # identifier */ + float *output[1], /* o : output synthesis signal */ + const int16_t output_frame, /* i : output frame length per channel */ + const int16_t nb_bits_metadata /* i : number of metadata bits */ +) +{ + float outputHB[1][L_FRAME48k]; /* 'float' buffer for output HB synthesis, one channel */ + SCE_DEC_HANDLE hSCE; + Decoder_State *st; + int32_t ivas_total_brate, last_ivas_total_brate; + ivas_error error; + + error = IVAS_ERR_OK; + + push_wmops( "ivas_sce_dec" ); + + hSCE = st_ivas->hSCE[sce_id]; + st = hSCE->hCoreCoder[0]; + + st->BER_detect |= st_ivas->BER_detect; + + ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; + last_ivas_total_brate = st_ivas->hDecoderConfig->last_ivas_total_brate; + + if ( st_ivas->ivas_format == ISM_FORMAT ) + { + st->cng_type = FD_CNG; + } + + /*------------------------------------------------------------------* + * Read audio bandwidth info + *-----------------------------------------------------------------*/ + + /* set total_brate - needed in DTX */ + if ( !st_ivas->bfi && ivas_total_brate == IVAS_SID_5k2 ) + { + st->total_brate = ivas_total_brate - nb_bits_metadata * FRAMES_PER_SEC; + assert( st->total_brate == SID_2k40 && "SCE SID must be 2.4kbps!" ); + + if ( st_ivas->ivas_format == ISM_FORMAT && st_ivas->hISMDTX.sce_id_dtx != sce_id ) + { + st->total_brate = FRAME_NO_DATA; + } + } + else if ( !st_ivas->bfi && ivas_total_brate == FRAME_NO_DATA ) + { + st->total_brate = FRAME_NO_DATA; + } + else if ( !st_ivas->bfi && st_ivas->ivas_format != ISM_FORMAT && last_ivas_total_brate <= IVAS_SID_5k2 ) + { + st->total_brate = hSCE->element_brate - nb_bits_metadata * FRAMES_PER_SEC; + } + + /* read the bandwidth */ + if ( st_ivas->bfi || st->total_brate <= SID_2k40 ) + { + /* BFI or SID/NO_DATA frame -> do nothing */ + } + else + { + if ( st->low_rate_mode ) + { + /* ISM Low-rate mode -> always WB */ + st->bwidth = WB; + } + else if ( hSCE->element_brate < MIN_BRATE_SWB_SCE ) + { + /* only WB is supported */ + st->bwidth = WB; + } + else if ( ( hSCE->element_brate < MIN_BRATE_FB_STEREO && !st->is_ism_format ) || + ( hSCE->element_brate < MIN_BRATE_FB_ISM && st->is_ism_format ) ) + { + /* WB and SWB are supported */ + st->bwidth = get_next_indice( st, 1 ) + WB; + } + else + { + /* WB, SWB and FB are supported */ + st->bwidth = get_next_indice( st, NBITS_BWIDTH ); + } + } + + /*------------------------------------------------------------------* + * Initialization + *-----------------------------------------------------------------*/ + + st->idchan = 0; + st->element_mode = IVAS_SCE; + + /* Force to MODE1 in IVAS */ + st->codec_mode = MODE1; + + /* set "bits_frame_nominal" */ + if ( ( st_ivas->hQMetaData != NULL ) && + ( st_ivas->ivas_format != SBA_FORMAT ) ) + { + if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC || st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) + { + st->bits_frame_nominal = (int16_t) ( ( hSCE->element_brate / FRAMES_PER_SEC ) - ISM_NB_BITS_METADATA_NOMINAL ); + } + else if ( ( st_ivas->mc_mode == MC_MODE_MCMASA && ivas_total_brate >= MCMASA_SEPARATE_BRATE ) || ( st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) ) + { + st->bits_frame_nominal = (int16_t) ( hSCE->element_brate / FRAMES_PER_SEC ); + } + else if ( st_ivas->ism_mode == ISM_MODE_NONE && st_ivas->ivas_format == SBA_ISM_FORMAT ) + { + st->bits_frame_nominal = (int16_t) ( st_ivas->hSpar->core_nominal_brate / FRAMES_PER_SEC ); + } + else + { + st->bits_frame_nominal = st_ivas->hQMetaData->bits_frame_nominal; + } + } + else if ( st_ivas->ivas_format == SBA_FORMAT ) + { + st->bits_frame_nominal = (int16_t) ( st_ivas->hSpar->core_nominal_brate / FRAMES_PER_SEC ); + } + else + { + st->bits_frame_nominal = (int16_t) ( ( hSCE->element_brate / FRAMES_PER_SEC ) - ISM_NB_BITS_METADATA_NOMINAL ); + } + + + /* set "total_brate" */ + if ( !st_ivas->bfi && ivas_total_brate == IVAS_SID_5k2 ) + { + st->total_brate = ivas_total_brate - nb_bits_metadata * FRAMES_PER_SEC; + + if ( st_ivas->ivas_format == ISM_FORMAT && st_ivas->hISMDTX.sce_id_dtx != sce_id ) + { + st->total_brate = FRAME_NO_DATA; + } + } + else if ( !st_ivas->bfi && ivas_total_brate == FRAME_NO_DATA ) + { + st->total_brate = ivas_total_brate; + } + else if ( !st_ivas->bfi && st_ivas->ivas_format != ISM_FORMAT && st_ivas->ivas_format != MASA_ISM_FORMAT ) /* note: in ISMs, total_brate[] is set in ivas_ism_config() */ + { + st->total_brate = hSCE->element_brate - nb_bits_metadata * FRAMES_PER_SEC; + } + + /*----------------------------------------------------------------* + * Core codec configuration + *----------------------------------------------------------------*/ + + /* set ACELP12k8 / ACELP16k flag for flexible ACELP core */ + if ( ( st_ivas->ivas_format == ISM_FORMAT || st_ivas->ism_mode == ISM_MASA_MODE_DISC || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) && + st->low_rate_mode && !( st->total_brate == SID_2k40 || st->total_brate == FRAME_NO_DATA ) ) + { + st->flag_ACELP16k = 0; + } + else + { + st->flag_ACELP16k = set_ACELP_flag( IVAS_SCE, hSCE->element_brate, st->total_brate, 0, 0, -1, -1 ); + } + + if ( is_DTXrate( ivas_total_brate ) ) + { + st->VAD = 0; + } + else + { + st->VAD = 1; + } + + if ( st->VAD && hSCE->element_brate <= CNA_MAX_BRATE ) + { + st->flag_cna = 1; + } + else if ( ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == MASA_FORMAT ) && hSCE->element_brate <= ACELP_32k ) + { + st->flag_cna = 1; + } + else + { + st->flag_cna = 0; + } + + /*----------------------------------------------------------------* + * Decoder + *----------------------------------------------------------------*/ + + if ( ( error = ivas_core_dec( st_ivas, hSCE, NULL, NULL, 1, output, outputHB, NULL, st_ivas->sba_dirac_stereo_flag ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( st_ivas->sba_dirac_stereo_flag && ( st->core_brate > SID_2k40 || st->cng_type == LP_CNG ) ) + { + /* skip addition of ACELP BWE for now, will be done after upmix */ + mvr2r( outputHB[0], hSCE->save_hb_synth, output_frame ); + } + else if ( !st_ivas->sba_dirac_stereo_flag ) + { + int32_t output_Fs; + + output_Fs = st_ivas->hDecoderConfig->output_Fs; + + /*----------------------------------------------------------------* + * LB synthesis synchronization between IVAS formats + *----------------------------------------------------------------*/ + + delay_signal( output[0], output_frame, st->prev_synth_buffer, NS2SA( output_Fs, IVAS_DEC_DELAY_NS - DELAY_CLDFB_NS ) ); + + /*----------------------------------------------------------------* + * HB synthesis synchronization between IVAS formats + *----------------------------------------------------------------*/ + + delay_signal( outputHB[0], output_frame, hSCE->prev_hb_synth, NS2SA( output_Fs, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ) ); + + /*----------------------------------------------------------------* + * output LB and HB mix + *----------------------------------------------------------------*/ + + v_add( output[0], outputHB[0], output[0], output_frame ); + } + + /*----------------------------------------------------------------* + * Common updates + *----------------------------------------------------------------*/ + + hSCE->last_element_brate = hSCE->element_brate; + + st_ivas->BER_detect |= st->BER_detect; + + + + pop_wmops(); + return error; +} + + +/*------------------------------------------------------------------------- + * create_sce_dec() + * + * Create, allocate and initialize IVAS decoder SCE handle + *-------------------------------------------------------------------------*/ + +ivas_error create_sce_dec( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const int16_t sce_id, /* i : SCE # identifier */ + const int32_t element_brate /* i : element bitrate */ +) +{ + SCE_DEC_HANDLE hSCE; + Decoder_State *st; + ivas_error error; + int16_t output_frame; + + error = IVAS_ERR_OK; + output_frame = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); + + /*-----------------------------------------------------------------* + * Allocate SCE handle + *-----------------------------------------------------------------*/ + + if ( ( hSCE = (SCE_DEC_HANDLE) malloc( sizeof( SCE_DEC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SCE\n" ) ); + } + + /*-----------------------------------------------------------------* + * Initialization - general parameters + *-----------------------------------------------------------------*/ + + hSCE->sce_id = sce_id; + hSCE->element_brate = element_brate; + + set_f( hSCE->prev_hb_synth, 0.0f, NS2SA( st_ivas->hDecoderConfig->output_Fs, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ) ); + + /*-----------------------------------------------------------------* + * Core Coder, 1 instance: allocate and initialize + *-----------------------------------------------------------------*/ + + if ( ( st = (DEC_CORE_HANDLE) malloc( sizeof( Decoder_State ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for CoreCoder structure\n" ) ); + } + + copy_decoder_config( st_ivas, st ); + + st->total_brate = hSCE->element_brate; /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */ + st->mct_chan_mode = MCT_CHAN_MODE_REGULAR; + st->is_ism_format = 0; + if ( st_ivas->ivas_format == ISM_FORMAT || st_ivas->ivas_format == MASA_ISM_FORMAT ) + { + st->is_ism_format = 1; + } + + if ( ( error = init_decoder( st, 0, st_ivas->mc_mode ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( st_ivas->ivas_format == SBA_FORMAT && ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_STEREO || ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_MONO && st_ivas->nchan_transport == 1 ) ) ) + { + if ( ( error = openCldfb( &st->cldfbSynHB, CLDFB_SYNTHESIS, st->output_Fs, CLDFB_PROTOTYPE_1_25MS ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + st->cldfbSynHB = NULL; + } + + /* allocate and initialize "hTdCngDec" - needed in DTX */ + if ( sce_id == 0 && st->hTdCngDec == NULL ) + { + if ( ( st->hTdCngDec = (TD_CNG_DEC_HANDLE) malloc( sizeof( TD_CNG_DEC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DTX/TD CNG\n" ) ); + } + + td_cng_dec_init( st ); + } + + /*-----------------------------------------------------------------* + * Synthesis buffers: allocate and initialize + *-----------------------------------------------------------------*/ + + if ( st_ivas->sba_dirac_stereo_flag ) + { + if ( ( hSCE->save_synth = (float *) malloc( sizeof( float ) * output_frame ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for stereo output\n" ) ); + } + set_zero( hSCE->save_synth, output_frame ); + + if ( ( hSCE->save_hb_synth = (float *) malloc( sizeof( float ) * output_frame ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate HB memory for stereo output\n" ) ); + } + set_zero( hSCE->save_hb_synth, output_frame ); + } + else + { + hSCE->save_synth = NULL; + hSCE->save_hb_synth = NULL; + } + + hSCE->hCoreCoder[0] = st; + st_ivas->hSCE[sce_id] = hSCE; + + return error; +} + + +/*------------------------------------------------------------------------- + * destroy_sce_dec() + * + * Destroy and deallocate IVAS decoder SCE handle + *-------------------------------------------------------------------------*/ + +void destroy_sce_dec( + SCE_DEC_HANDLE hSCE /* i/o: SCE decoder structure */ +) +{ + Decoder_State *st; + + st = hSCE->hCoreCoder[0]; + + if ( st != NULL ) + { + destroy_core_dec( st ); + + free( st ); + st = NULL; + } + + if ( hSCE->save_synth != NULL ) + { + free( hSCE->save_synth ); + hSCE->save_synth = NULL; + } + if ( hSCE->save_hb_synth != NULL ) + { + free( hSCE->save_hb_synth ); + hSCE->save_hb_synth = NULL; + } + + free( hSCE ); + + return; +} diff --git a/lib_dec/ivas_sns_dec.c b/lib_dec/ivas_sns_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..18eb18e788590827fad1eb6f9d71d541d688b962 --- /dev/null +++ b/lib_dec/ivas_sns_dec.c @@ -0,0 +1,299 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "prot.h" +#include "ivas_prot.h" +#include "rom_com.h" +#include "ivas_rom_com.h" +#include "ivas_cnst.h" +#include +#include "wmc_auto.h" + +/*------------------------------------------------------------------- + * sns_1st_dec() + * + * + *-------------------------------------------------------------------*/ + +static void sns_1st_dec( + const int16_t index, /* i : codebook index */ + const int16_t core, + const int16_t L_frame, + float *snsq /* i/o: i:prediction o:quantized sns */ +) +{ + int16_t i; + const int16_t *p_dico, *means; + const float cdbk_fix2float = 1.f / powf( 2, SNS_CDBKS_BITS_4_FRAC ); + const float means_fix2float = 1.f / powf( 2, SNS_MEANS_BITS_4_FRAC ); + + means = NULL; + switch ( L_frame ) + { + case L_FRAME16k: + means = &sns_1st_means_16k[core - 1][0]; + break; + case L_FRAME25_6k: + means = &sns_1st_means_25k6[core - 1][0]; + break; + case L_FRAME32k: + means = &sns_1st_means_32k[core - 1][0]; + break; + default: + assert( !"illegal frame length in sns_1st_cod" ); + } + + + p_dico = &sns_1st_cdbk[0][core - 1][0] + ( index % 32 ) * ( M / 2 ); + + for ( i = 0; i < M / 2; i++ ) + { + snsq[i] = ( *p_dico++ ) * cdbk_fix2float + means[i] * means_fix2float; + } + + p_dico = &sns_1st_cdbk[1][core - 1][0] + ( index >> 5 ) * ( M / 2 ); + + for ( i = M / 2; i < M; i++ ) + { + snsq[i] = ( *p_dico++ ) * cdbk_fix2float + means[i] * means_fix2float; + } + + return; +} + + +/*------------------------------------------------------------------- + * sns_2st_dec() + * + * + *-------------------------------------------------------------------*/ + +static void sns_2st_dec( + float *snsq, /* i/o: i:1st stage o:1st+2nd stage */ + int16_t *indx /* i : index[] (4 bits per words) */ +) +{ + int16_t i; + int16_t xq[M]; + float scale = 1.0f / 2.5f; + + /* quantize */ + AVQ_dec_lpc( indx, xq, 2 ); + + for ( i = 0; i < M; i++ ) + { + snsq[i] += scale * (float) xq[i]; + } + + return; +} + + +/*------------------------------------------------------------------- + * sns_avq_dec() + * + * Stereo noise-shaping AVQ decoder for 1 channel + *-------------------------------------------------------------------*/ + +void sns_avq_dec( + int16_t *index, /* i : Quantization indices */ + float SNS_Q[NB_DIV][M], /* o : Quantized SNS vectors */ + const int16_t L_frame, /* i : frame length */ + const int16_t numlpc /* i : Number of sets of lpc */ +) +{ + int16_t i, nbi, last; + int16_t q_type; + + /* go from one-based indexing to zero-based indexing */ + last = numlpc - 1; + + index++; + + /* Decode last LPC */ + sns_1st_dec( *index++, numlpc, L_frame, SNS_Q[last] ); + sns_2st_dec( SNS_Q[last], index ); + nbi = 2 + index[0] + index[1]; + index += nbi; + + /* Decode intermediate LPC (512 framing) */ + if ( numlpc == 2 ) + { + q_type = *index++; + + if ( q_type == 0 ) + { + sns_1st_dec( *index++, numlpc, L_frame, SNS_Q[0] ); + sns_2st_dec( SNS_Q[0], index ); + } + else if ( q_type == 1 ) + { + for ( i = 0; i < M; i++ ) + { + SNS_Q[0][i] = SNS_Q[1][i]; + } + sns_2st_dec( SNS_Q[0], index ); + } + } + + return; +} + + +/*------------------------------------------------------------------- + * sns_avq_dec_stereo() + * + * Stereo noise-shaping AVQ decoder for 21 channels + *-------------------------------------------------------------------*/ + +void sns_avq_dec_stereo( + int16_t *indexl, /* i : Quantization indices (left channel) */ + int16_t *indexr, /* i : Quantization indices (right channe) */ + const int16_t L_frame, /* i : frame length */ + float *SNS_Ql, /* o : Quantized SNS vectors (left channel) */ + float *SNS_Qr /* o : Quantized SNS vectors (right channe) */ +) +{ + int16_t i, stereo_mode; + float mid_q[M], side_q[M]; + + stereo_mode = *indexl++; + indexr++; + + if ( stereo_mode == 2 ) + { + /* MS coding */ + sns_1st_dec( *indexl++, TCX_20_CORE, L_frame, mid_q ); + sns_2st_dec( mid_q, indexl ); + + for ( i = 0; i < M; i++ ) + { + side_q[i] = 0.f; + } + + if ( *indexr++ == -1 ) + { + sns_2st_dec( side_q, indexr ); + } + + for ( i = 0; i < M; i++ ) + { + SNS_Ql[i] = mid_q[i] + side_q[i] * 0.5f; + SNS_Qr[i] = mid_q[i] - side_q[i] * 0.5f; + } + } + else + { + /* LR decoding */ + sns_1st_dec( *indexl++, TCX_20_CORE, L_frame, SNS_Ql ); + sns_2st_dec( SNS_Ql, indexl ); + + sns_1st_dec( *indexr++, TCX_20_CORE, L_frame, SNS_Qr ); + sns_2st_dec( SNS_Qr, indexr ); + } + + return; +} + + +/*------------------------------------------------------------------- + * dequantize_sns() + * + * Dequantize SNS + *-------------------------------------------------------------------*/ + +void dequantize_sns( + int16_t indices[CPE_CHANNELS][NPRM_LPC_NEW], + float snsQ_out[CPE_CHANNELS][NB_DIV][M], + Decoder_State **sts ) +{ + int16_t nSubframes, k, ch; + int16_t sns_stereo_mode[NB_DIV]; + int16_t zero_side_flag[NB_DIV]; + Decoder_State *st; + + sns_stereo_mode[0] = indices[0][0]; + sns_stereo_mode[1] = indices[0][1]; + zero_side_flag[0] = indices[0][2]; + zero_side_flag[1] = indices[0][3]; + + for ( ch = 0; ch < CPE_CHANNELS; ++ch ) + { + int16_t idxIndices; + + st = sts[ch]; + nSubframes = ( st->core == TCX_20_CORE ) ? 1 : NB_DIV; + idxIndices = 0; + + for ( k = 0; k < nSubframes; ++k ) + { + const int16_t is_side = ch == 1 && sns_stereo_mode[k] == SNS_STEREO_MODE_MS; + const float *const *cdbks = ( nSubframes == 1 ) ? ivas_sns_cdbks_tcx20 : ivas_sns_cdbks_tcx10; + int16_t nStages = ( ( nSubframes == 1 ) ? SNS_MSVQ_NSTAGES_TCX20 : SNS_MSVQ_NSTAGES_TCX10 ); + float *snsQ = snsQ_out[ch][k]; + + if ( is_side ) + { + const float *const *side_cdbks = ( st->core == TCX_20_CORE ) ? ivas_sns_cdbks_side_tcx20 : ivas_sns_cdbks_side_tcx10; + if ( zero_side_flag[k] ) + { + set_zero( snsQ, M ); + continue; + } + + nStages = SNS_MSVQ_NSTAGES_SIDE; + msvq_dec( side_cdbks, NULL, NULL, nStages, M, M, &indices[ch][idxIndices + SNS_STEREO_MODE_OFFSET_INDICES], 0, NULL, snsQ, NULL ); + } + else + { + msvq_dec( cdbks, NULL, NULL, nStages, M, M, &indices[ch][idxIndices + SNS_STEREO_MODE_OFFSET_INDICES], 0, NULL, snsQ, NULL ); + } + idxIndices += nStages; + } + } + + if ( sns_stereo_mode[0] == SNS_STEREO_MODE_MS || sns_stereo_mode[1] == SNS_STEREO_MODE_MS ) + { + nSubframes = ( sts[0]->core == TCX_20_CORE ) ? 1 : NB_DIV; + for ( k = 0; k < nSubframes; ++k ) + { + if ( sns_stereo_mode[k] == SNS_STEREO_MODE_MS ) + { + inverseMS( M, snsQ_out[0][k], snsQ_out[1][k], 1.f ); + } + } + } + + return; +} diff --git a/lib_dec/ivas_spar_decoder.c b/lib_dec/ivas_spar_decoder.c new file mode 100644 index 0000000000000000000000000000000000000000..147f195ddb26cf4309a39d140f72098b8463e29f --- /dev/null +++ b/lib_dec/ivas_spar_decoder.c @@ -0,0 +1,1772 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "ivas_stat_dec.h" +#include "prot.h" +#include "string.h" +#include "ivas_prot.h" +#include "ivas_prot_rend.h" +#include "ivas_rom_com.h" +#include "ivas_rom_dec.h" +#include "ivas_stat_com.h" +#include +#include +#include "wmc_auto.h" + + +/*-------------------------------------------------------------------* + * Local function prototypes + *--------------------------------------------------------------------*/ + +static ivas_error ivas_spar_dec_MD( Decoder_Struct *st_ivas, Decoder_State *st0 ); + + +/*------------------------------------------------------------------------- + * ivas_spar_dec_open() + * + * Allocate and initialize SPAR decoder handle and sub-handles + *------------------------------------------------------------------------*/ + +ivas_error ivas_spar_dec_open( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const int16_t spar_reconfig_flag /* i : SPAR reconfiguration flag */ +) +{ + SPAR_DEC_HANDLE hSpar; + ivas_error error; + int16_t sba_order_internal, num_channels_internal; + IVAS_FB_CFG *fb_cfg; + int16_t i, j, b, active_w_mixing; + int32_t output_Fs; + int16_t num_decor_chs, map_idx; + + error = IVAS_ERR_OK; + sba_order_internal = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ); + + num_channels_internal = ivas_sba_get_nchan_metadata( sba_order_internal, st_ivas->hDecoderConfig->ivas_total_brate ); + + hSpar = st_ivas->hSpar; + + if ( !spar_reconfig_flag ) + { + /* SPAR decoder handle */ + if ( ( hSpar = (SPAR_DEC_HANDLE) malloc( sizeof( SPAR_DEC_DATA ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR decoder" ); + } + } + + output_Fs = st_ivas->hDecoderConfig->output_Fs; + if ( num_channels_internal > ( SBA_HOA2_ORDER + 1 ) * ( SBA_HOA2_ORDER + 1 ) ) + { + num_decor_chs = IVAS_HBR_MAX_DECOR_CHS; + } + else + { + num_decor_chs = num_channels_internal - 1; + } + + /* TD decorr. */ + if ( ( st_ivas->ivas_format == SBA_FORMAT ) && ( ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_MONO || st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_STEREO ) || ( st_ivas->hDecoderConfig->ivas_total_brate >= IVAS_256k && st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_FOA ) ) ) + { + hSpar->hTdDecorr = NULL; + } + else + { + if ( ( error = ivas_td_decorr_dec_open( &hSpar->hTdDecorr, output_Fs, num_decor_chs + 1, 1 ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* MD handle */ + if ( ( error = ivas_spar_md_dec_open( &hSpar->hMdDec, st_ivas->hDecoderConfig, num_channels_internal, sba_order_internal, st_ivas->sid_format, st_ivas->last_active_ivas_total_brate ) ) != IVAS_ERR_OK ) + { + return error; + } + hSpar->hMdDec->td_decorr_flag = 1; + if ( hSpar->hTdDecorr ) + { + hSpar->hTdDecorr->ducking_flag = ivas_spar_br_table_consts[hSpar->hMdDec->table_idx].td_ducking; + } + + /* set FB config. */ + active_w_mixing = -1; + if ( ( error = ivas_fb_set_cfg( &fb_cfg, SBA_FORMAT, num_channels_internal, num_channels_internal, active_w_mixing, output_Fs, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + fb_cfg->pcm_offset = NS2SA( output_Fs, DELAY_FB_1_NS + IVAS_ENC_DELAY_NS + IVAS_DEC_DELAY_NS ); + fb_cfg->remix_order = remix_order_set[hSpar->hMdDec->spar_md_cfg.remix_unmix_order]; + + /* FB mixer handle */ + if ( ( error = ivas_FB_mixer_open( &hSpar->hFbMixer, output_Fs, fb_cfg, spar_reconfig_flag ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* AGC handle */ + if ( ( error = ivas_spar_agc_dec_open( &hSpar->hAgcDec, output_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* PCA handle */ + hSpar->hPCA = NULL; + if ( st_ivas->hDecoderConfig->ivas_total_brate == PCA_BRATE && sba_order_internal == 1 ) + { + if ( ( hSpar->hPCA = (PCA_DEC_STATE *) malloc( sizeof( PCA_DEC_STATE ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for PCA decoder" ); + } + + ivas_pca_dec_init( hSpar->hPCA ); + } + + /* mixer_mat intitialization */ + for ( i = 0; i < num_channels_internal; i++ ) + { + for ( j = 0; j < num_channels_internal; j++ ) + { + for ( b = 0; b < IVAS_MAX_NUM_BANDS; b++ ) + { + hSpar->hMdDec->mixer_mat[i][j][b] = 0.0f; + for ( int16_t i_ts = 0; i_ts < ( MAX_PARAM_SPATIAL_SUBFRAMES + 1 ); i_ts++ ) + { + hSpar->hMdDec->mixer_mat_prev[i_ts][i][j][b] = 0.0f; + } + } + } + } + hSpar->i_subframe = 0; + hSpar->AGC_flag = 0; + + /*-----------------------------------------------------------------* + * Configuration - set SPAR high-level parameters + *-----------------------------------------------------------------*/ + + ivas_spar_config( st_ivas->hDecoderConfig->ivas_total_brate, sba_order_internal, &st_ivas->nchan_transport, &st_ivas->nSCE, &st_ivas->nCPE, &hSpar->core_nominal_brate, st_ivas->sid_format ); + + switch ( sba_order_internal ) + { + case 1: + st_ivas->transport_config = IVAS_AUDIO_CONFIG_FOA; + break; + case 2: + st_ivas->transport_config = IVAS_AUDIO_CONFIG_HOA2; + break; + case 3: + st_ivas->transport_config = IVAS_AUDIO_CONFIG_HOA3; + break; + } + + ivas_output_init( &( st_ivas->hTransSetup ), st_ivas->transport_config ); + + set_s( hSpar->subframe_nbslots, 0, MAX_JBM_SUBFRAMES_5MS ); + set_s( hSpar->subframe_nbslots, JBM_CLDFB_SLOTS_IN_SUBFRAME, DEFAULT_JBM_SUBFRAMES_5MS ); + hSpar->nb_subframes = DEFAULT_JBM_SUBFRAMES_5MS; + hSpar->subframes_rendered = 0; + hSpar->slots_rendered = 0; + hSpar->num_slots = DEFAULT_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME; + + /* init render timeslot mapping */ + set_s( hSpar->render_to_md_map, 0, MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME ); + for ( map_idx = 0; map_idx < DEFAULT_JBM_CLDFB_TIMESLOTS; map_idx++ ) + { + hSpar->render_to_md_map[map_idx] = map_idx; + } + + /* allocate transport channels*/ + if ( ( st_ivas->hDecoderConfig->Opt_5ms || st_ivas->ivas_format == SBA_ISM_FORMAT ) && st_ivas->hTcBuffer == NULL ) + { + int16_t nchan_to_allocate; + int16_t nchan_tc; + TC_BUFFER_MODE buffer_mode; + int16_t granularity; + + buffer_mode = TC_BUFFER_MODE_RENDERER; + nchan_tc = ivas_jbm_dec_get_num_tc_channels( st_ivas ); + nchan_to_allocate = num_channels_internal; + + if ( st_ivas->ivas_format == SBA_ISM_FORMAT && st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + { + nchan_to_allocate += st_ivas->nchan_ism; + } + + granularity = NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ); + + if ( ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_STEREO || st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_MONO ) ) + { + if ( ( st_ivas->ivas_format == SBA_ISM_FORMAT && st_ivas->ism_mode == ISM_SBA_MODE_DISC && st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_STEREO ) ) + { + nchan_tc = st_ivas->hDecoderConfig->nchan_out + st_ivas->nchan_ism; + nchan_to_allocate = nchan_tc; + } + else + { + buffer_mode = TC_BUFFER_MODE_BUFFER; + nchan_tc = st_ivas->hDecoderConfig->nchan_out; + nchan_to_allocate = nchan_tc; + } + } + else if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) + { + nchan_to_allocate = 2 * BINAURAL_CHANNELS; + } + + if ( st_ivas->ivas_format == SBA_ISM_FORMAT && ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL || st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) && st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + { + /* get correct granularity in case of binaural rendering of the discrete objects with the td obj renderer */ + granularity = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / ( FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES ) ); + } + + /* make sure we have a TC buffer with the correct granularity for rate switching in OSBA */ + if ( !st_ivas->hDecoderConfig->Opt_5ms ) + { + nchan_tc = 0; + nchan_to_allocate = 0; + } + + if ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, buffer_mode, nchan_tc, nchan_to_allocate, nchan_to_allocate, granularity ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + st_ivas->hSpar = hSpar; + + return error; +} + + +/*------------------------------------------------------------------------- + * ivas_spar_dec_close() + * + * Deallocate SPAR handle + *------------------------------------------------------------------------*/ + +void ivas_spar_dec_close( + SPAR_DEC_HANDLE *hSpar, /* i/o: SPAR decoder handle */ + const int32_t output_Fs, /* i : output sampling rate */ + const int16_t spar_reconfig_flag /* i : SPAR reconfiguration flag */ +) +{ + if ( hSpar == NULL || *hSpar == NULL ) + { + return; + } + + /* MD handle */ + ivas_spar_md_dec_close( &( *hSpar )->hMdDec ); + + /* TD decorrelator handle */ + ivas_td_decorr_dec_close( &( *hSpar )->hTdDecorr ); + + /* FB mixer handle */ + ivas_FB_mixer_close( &( *hSpar )->hFbMixer, output_Fs, spar_reconfig_flag ); + + /* AGC */ + ivas_spar_agc_dec_close( &( *hSpar )->hAgcDec ); + + /* PCA */ + if ( ( *hSpar )->hPCA != NULL ) + { + free( ( *hSpar )->hPCA ); + ( *hSpar )->hPCA = NULL; + } + + if ( !spar_reconfig_flag ) + { + free( ( *hSpar ) ); + ( *hSpar ) = NULL; + } + + return; +} + + +/*-------------------------------------------------------------------* + * ivas_spar_dec() + * + * Principal IVAS SPAR decoder routine + *-------------------------------------------------------------------*/ + +ivas_error ivas_spar_dec( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */ + int16_t *nb_bits_read /* o : number of MD bits read */ +) +{ + DECODER_CONFIG_HANDLE hDecoderConfig; + int16_t i, nb_bits_read_orig; + Decoder_State *st0; + int16_t next_bit_pos_orig, last_bit_pos; + uint16_t bstr_meta[MAX_BITS_METADATA], *bit_stream_orig; + ivas_error error; + + push_wmops( "ivas_spar_decode" ); + error = IVAS_ERR_OK; + hDecoderConfig = st_ivas->hDecoderConfig; + + st0 = ( st_ivas->nSCE > 0 ) ? st_ivas->hSCE[0]->hCoreCoder[0] : st_ivas->hCPE[0]->hCoreCoder[0]; + bit_stream_orig = st0->bit_stream; + next_bit_pos_orig = st0->next_bit_pos; + + if ( st_ivas->ivas_format == SBA_ISM_FORMAT ) + { + last_bit_pos = (int16_t) ( ( hDecoderConfig->ivas_total_brate / FRAMES_PER_SEC ) - 1 ) - nb_bits_read[1]; + } + else + { + *nb_bits_read = 0; + last_bit_pos = 0; + } + + /* read DirAC bitstream */ + if ( st_ivas->hQMetaData != NULL ) + { + ivas_dirac_dec_read_BS( hDecoderConfig->ivas_total_brate, st0, st_ivas->hDirAC, st_ivas->hSpatParamRendCom, st_ivas->hQMetaData, nb_bits_read, last_bit_pos, ivas_get_hodirac_flag( hDecoderConfig->ivas_total_brate, st_ivas->sba_analysis_order ), st_ivas->hSpar->dirac_to_spar_md_bands ); + } + + if ( st_ivas->ivas_format == SBA_ISM_FORMAT ) + { + last_bit_pos = (int16_t) ( ( hDecoderConfig->ivas_total_brate / FRAMES_PER_SEC ) - 1 ) - nb_bits_read[1]; + } + else + { + last_bit_pos = (int16_t) ( ( hDecoderConfig->ivas_total_brate / FRAMES_PER_SEC ) - 1 ); + } + + if ( !st0->bfi && hDecoderConfig->ivas_total_brate == IVAS_SID_5k2 ) + { + last_bit_pos -= SID_FORMAT_NBITS; + } + nb_bits_read_orig = *nb_bits_read; + last_bit_pos -= nb_bits_read_orig; + + /* reverse the bitstream for easier reading of indices */ + for ( i = 0; i < min( MAX_BITS_METADATA, last_bit_pos ); i++ ) + { + bstr_meta[i] = st_ivas->bit_stream[last_bit_pos - i]; + } + st0->bit_stream = bstr_meta; + st0->next_bit_pos = 0; + st0->bits_frame = min( MAX_BITS_METADATA, last_bit_pos + 1 ); + + if ( !st0->bfi ) + { + st0->total_brate = hDecoderConfig->ivas_total_brate; /* to avoid BER detect */ + } + + /*---------------------------------------------------------------------* + * Decode SPAR metadata + *---------------------------------------------------------------------*/ + + if ( ( error = ivas_spar_dec_MD( st_ivas, st0 ) ) != IVAS_ERR_OK ) + { + return error; + } + + *nb_bits_read = st0->next_bit_pos + nb_bits_read_orig; + st0->bit_stream = bit_stream_orig; + st0->next_bit_pos = next_bit_pos_orig; + + if ( !st0->bfi && hDecoderConfig->ivas_total_brate == IVAS_SID_5k2 ) + { + int16_t zero_pad_bits; + *nb_bits_read += SID_FORMAT_NBITS; + zero_pad_bits = (int16_t) ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - *nb_bits_read; + assert( zero_pad_bits <= 1 ); + *nb_bits_read += zero_pad_bits; + } + + pop_wmops(); + + return error; +} + + +/*---------------------------------------------------------------------* + * Function ivas_get_spar_table_idx_from_coded_idx() + * + * Get SPAR table index + *---------------------------------------------------------------------*/ + +static int16_t ivas_get_spar_table_idx_from_coded_idx( + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + const int16_t sba_order, /* i : Ambisonic (SBA) order */ + Decoder_State *st0, /* i/o: decoder state structure - for bitstream handling*/ + int16_t *bitlen /* o : number of bits */ +) +{ + int16_t table_idx, ind1[IVAS_SPAR_BR_TABLE_LEN]; + int16_t i, j, ind2; + + j = 0; + for ( i = 0; i < IVAS_SPAR_BR_TABLE_LEN; i++ ) + { + ind1[j] = 0; + if ( ( ivas_spar_br_table_consts[i].ivas_total_brate == ivas_total_brate ) && ( ivas_spar_br_table_consts[i].sba_order == sba_order ) ) + { + ind1[j++] = i; + } + } + + assert( j > 0 ); + *bitlen = ivas_get_bits_to_encode( j - 1 ); + + ind2 = get_next_indice( st0, *bitlen ); + + table_idx = ind1[ind2]; + + return table_idx; +} + + +/*---------------------------------------------------------------------* + * Function ivas_parse_spar_header() + * + * Get SPAR table index + *---------------------------------------------------------------------*/ + +static int16_t ivas_parse_spar_header( + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + const int16_t sba_order, /* i : Ambisonic (SBA) order */ + Decoder_State *st0, /* i/o: decoder state structure - for bitstream handling*/ + int16_t *table_idx ) +{ + int16_t bitlen, bwidth; + + *table_idx = ivas_get_spar_table_idx_from_coded_idx( ivas_total_brate, sba_order, st0, &bitlen ); + + bwidth = ivas_spar_br_table_consts[( *table_idx )].bwidth; + + return bwidth; +} + + +static float get_random_number( + int16_t *seed ) +{ + float x = (float) own_random( seed ) / 32768.0f; + + return x; +} + + +static float matrix_det( + const float a00, + const float a01, + const float a10, + const float a11 ) +{ + return a00 * a11 - a01 * a10; +} + + +static void matrix_inverse( + float in[3][3], + float out[3][3], + const int16_t size ) +{ + float det, fac; + float eps = 1e-16f; + + if ( size == 1 ) + { + out[0][0] = 1.0f / max( in[0][0], eps ); + + return; + } + else if ( size == 2 ) + { + det = matrix_det( in[0][1], in[0][1], in[1][0], in[1][1] ); + fac = 1.0f / max( det, eps ); + + out[0][0] = in[1][1] * fac; + out[1][0] = in[1][0] * ( -fac ); + + out[0][1] = in[0][1] * ( -fac ); + out[1][1] = in[0][0] * fac; + + return; + } + + det = in[0][0] * matrix_det( in[1][1], in[1][2], in[2][1], in[2][2] ) - in[1][0] * matrix_det( in[0][1], in[0][2], in[2][1], in[2][2] ) + in[2][0] * matrix_det( in[0][1], in[0][2], in[1][1], in[1][2] ); + fac = 1.0f / max( det, eps ); + + out[0][0] = matrix_det( in[1][1], in[1][2], in[2][1], in[2][2] ) * fac; + out[1][0] = matrix_det( in[1][0], in[1][2], in[2][0], in[2][2] ) * ( -fac ); + out[2][0] = matrix_det( in[1][0], in[1][1], in[2][0], in[2][1] ) * fac; + + out[0][1] = matrix_det( in[0][1], in[0][2], in[2][1], in[2][2] ) * ( -fac ); + out[1][1] = matrix_det( in[0][0], in[0][2], in[2][0], in[2][2] ) * fac; + out[2][1] = matrix_det( in[0][0], in[0][1], in[2][0], in[2][1] ) * ( -fac ); + + out[0][2] = matrix_det( in[0][1], in[0][2], in[1][1], in[1][2] ) * fac; + out[1][2] = matrix_det( in[0][0], in[0][2], in[1][0], in[1][2] ) * ( -fac ); + out[2][2] = matrix_det( in[0][0], in[0][1], in[1][0], in[1][1] ) * fac; + + return; +} + + +/*---------------------------------------------------------------------* + * Function ivas_spar_get_cldfb_gains() + * + * + *---------------------------------------------------------------------*/ + +void ivas_spar_get_cldfb_gains( + SPAR_DEC_HANDLE hSpar, + HANDLE_CLDFB_FILTER_BANK cldfbAnaDec0, + HANDLE_CLDFB_FILTER_BANK cldfbSynDec0, + const DECODER_CONFIG_HANDLE hDecoderConfig ) +{ + float output_Fs = (float) hDecoderConfig->output_Fs; + int16_t pt_len, stride, num_cldfb_bands, decfb_delay; + int16_t encfb_delay, cf_start, cf_end, cf_len; + float *weights; + int16_t ts, cf_cldfb_start, cf_cldfb_end; + float cf_start_s, cf_len_s; + int16_t sample, num_cf_slots, num_samples; + float T[3 * CLDFB_NO_CHANNELS_MAX + 10 * CLDFB_NO_CHANNELS_MAX - CLDFB_NO_CHANNELS_MAX][3]; + float Tt_T[3][3]; + float Tt_T_inv[3][3]; + float Tt_tgt[3]; + float ts_inout[CLDFB_NO_CHANNELS_MAX]; + float ts_re[CLDFB_NO_CHANNELS_MAX]; + float ts_im[CLDFB_NO_CHANNELS_MAX]; + float *pp_ts_im[1], *pp_ts_re[1]; + float tgt[( 3 - 1 ) * CLDFB_NO_CHANNELS_MAX + 10 * CLDFB_NO_CHANNELS_MAX]; + int16_t seed, split_band, slot_row, slot_col, slot, tmp_idx; + + pt_len = cldfbAnaDec0->p_filter_length; + num_cldfb_bands = cldfbAnaDec0->no_channels; + + stride = NS2SA( output_Fs, DELAY_CLDFB_NS ); + encfb_delay = NS2SA( output_Fs, IVAS_FB_ENC_DELAY_NS ); + decfb_delay = NS2SA( output_Fs, IVAS_FB_DEC_DELAY_NS ); + + cf_start = (int16_t) hSpar->hFbMixer->cross_fade_start_offset - encfb_delay + decfb_delay; /* time domain after CLDFB synthesis*/ + cf_end = (int16_t) hSpar->hFbMixer->cross_fade_end_offset - encfb_delay + decfb_delay; + cf_len = cf_end - cf_start; + weights = hSpar->hFbMixer->cldfb_cross_fade; + + cf_cldfb_start = (int16_t) ceil( ( cf_start - decfb_delay / 2 ) / (float) stride - 0.5f ); + cf_cldfb_end = (int16_t) ( ( cf_start - decfb_delay / 2 + cf_len ) / (float) stride - 0.5f ); + + num_cf_slots = cf_cldfb_end - cf_cldfb_start + 1; + num_samples = num_cf_slots * stride + pt_len - stride; + seed = RANDOM_INITSEED; + split_band = SPAR_DIRAC_SPLIT_START_BAND; + pp_ts_im[0] = ts_im; + pp_ts_re[0] = ts_re; + set_f( tgt, 0, ( 3 - 1 ) * CLDFB_NO_CHANNELS_MAX + 10 * CLDFB_NO_CHANNELS_MAX ); + + cf_start_s = ( cf_start - decfb_delay / 2 ) / output_Fs; + cf_len_s = hSpar->hFbMixer->cross_fade_end_offset / output_Fs - hSpar->hFbMixer->cross_fade_start_offset / output_Fs; + + for ( ts = 0; ts < CLDFB_NO_COL_MAX; ts++ ) + { + weights[ts] = ( ( ( ts + 0.5f ) * stride / output_Fs ) - cf_start_s ) / cf_len_s; + weights[ts] = max( min( weights[ts], 1.0f ), 0.0f ); + } + hSpar->hFbMixer->cldfb_cross_fade_start = cf_cldfb_start; + hSpar->hFbMixer->cldfb_cross_fade_end = cf_cldfb_end; + + if ( num_cf_slots > 3 || pt_len > 10 * CLDFB_NO_CHANNELS_MAX || stride > CLDFB_NO_CHANNELS_MAX || split_band == IVAS_MAX_NUM_BANDS ) + { + return; + } + + /* optimization*/ + /* compute time-domain cross-fade for considered time slots*/ + tmp_idx = cf_start - cf_cldfb_start * stride; + for ( sample = 0; sample < cf_len; sample++ ) + { + /* increasing window function */ + tgt[tmp_idx++] = hSpar->hFbMixer->pFilterbank_cross_fade[sample]; + } + + for ( ; tmp_idx < num_samples; tmp_idx++ ) + { + /* fill up with ones*/ + tgt[tmp_idx] = 1.0f; + } + + for ( sample = 0; sample < num_samples; sample++ ) + { + /* initialize trasnform matrix with zeros*/ + T[sample][0] = T[sample][1] = T[sample][2] = 0.0f; + } + + for ( sample = 0; sample < pt_len - stride; sample++ ) + { + /* fill internal CLDFB analysis time buffer with data*/ + float x = get_random_number( &seed ); + + cldfbAnaDec0->cldfb_state[sample] = x; + } + + for ( slot = 0; slot < num_cf_slots; slot++ ) + { + for ( sample = 0; sample < stride; sample++ ) + { + float x = get_random_number( &seed ); + ts_inout[sample] = x; + } + + cldfbAnalysis_ts( ts_inout, ts_re, ts_im, num_cldfb_bands, cldfbAnaDec0 ); + cldfb_reset_memory( cldfbSynDec0 ); + cldfbSynthesis( pp_ts_re, pp_ts_im, ts_inout, num_cldfb_bands, cldfbSynDec0 ); + + for ( sample = 0; sample < stride; sample++ ) + { + T[slot * stride + sample][slot] = ts_inout[sample]; + } + + tmp_idx = pt_len - 1; + for ( sample = stride; sample < pt_len; sample++ ) + { + T[slot * stride + sample][slot] = cldfbSynDec0->cldfb_state[tmp_idx--]; + } + } + + /* target is synthesis output times the cross-fade window*/ + for ( sample = 0; sample < num_samples; sample++ ) + { + tgt[sample] *= ( T[sample][0] + T[sample][1] + T[sample][2] ); + } + + /* compute matrices */ + for ( slot_row = 0; slot_row < num_cf_slots; slot_row++ ) + { + for ( slot_col = slot_row; slot_col < num_cf_slots; slot_col++ ) + { + Tt_T[slot_row][slot_col] = 0.0f; + for ( sample = 0; sample < num_samples; sample++ ) + { + Tt_T[slot_row][slot_col] += T[sample][slot_row] * T[sample][slot_col]; + } + } + } + + Tt_T[1][0] = Tt_T[0][1]; + Tt_T[2][0] = Tt_T[0][2]; + Tt_T[2][1] = Tt_T[1][2]; + + for ( slot_row = 0; slot_row < num_cf_slots; slot_row++ ) + { + Tt_tgt[slot_row] = 0.0f; + for ( sample = 0; sample < num_samples; sample++ ) + { + Tt_tgt[slot_row] += T[sample][slot_row] * tgt[sample]; + } + } + + matrix_inverse( Tt_T, Tt_T_inv, num_cf_slots ); + + /* compute the optimal coefficients */ + for ( slot_row = 0; slot_row < num_cf_slots; slot_row++ ) + { + float tmp = 0.0f; + for ( slot_col = 0; slot_col < num_cf_slots; slot_col++ ) + { + tmp += Tt_T_inv[slot_row][slot_col] * Tt_tgt[slot_col]; + } + weights[cf_cldfb_start + slot_row] = max( min( tmp, 1.0f ), 0.0f ); + } + + cldfb_reset_memory( cldfbSynDec0 ); + cldfb_reset_memory( cldfbAnaDec0 ); + + return; +} + + +/*---------------------------------------------------------------------* + * Function ivas_is_res_channel() + * + * determines if an FOA input channel is transmitted as residual channel. + *---------------------------------------------------------------------*/ + +/*! r: 1 if prediction residual channel */ +int16_t ivas_is_res_channel( + const int16_t ch, /* i : ch index in WYZX ordering */ + const int16_t nchan_transport /* i : number of transport channels (1-4) */ +) +{ + const int16_t rc_map[FOA_CHANNELS][FOA_CHANNELS] = { + { 0, 0, 0, 0 }, + { 0, 1, 0, 0 }, + { 0, 1, 0, 1 }, + { 0, 1, 1, 1 } + }; + + if ( ch >= FOA_CHANNELS ) + { + /* never transmitted */ + return 0; + } + assert( nchan_transport <= FOA_CHANNELS ); + + return ( rc_map[nchan_transport - 1][ch] ); +} + + +/*-------------------------------------------------------------------* + * ivas_spar_dec_MD() + * + * IVAS SPAR MD decoder + *-------------------------------------------------------------------*/ + +static ivas_error ivas_spar_dec_MD( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + Decoder_State *st0 /* i/o: decoder state structure - for bitstream handling*/ +) +{ + int16_t num_channels, table_idx, num_bands_out, bfi, sba_order; + int32_t ivas_total_brate; + int16_t num_md_sub_frames; + ivas_error error; + DECODER_CONFIG_HANDLE hDecoderConfig = st_ivas->hDecoderConfig; + SPAR_DEC_HANDLE hSpar = st_ivas->hSpar; + + push_wmops( "ivas_spar_dec_MD" ); + + /*---------------------------------------------------------------------* + * Initialization + *---------------------------------------------------------------------*/ + + sba_order = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ); + bfi = st_ivas->bfi; + ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; + num_channels = ivas_sba_get_nchan_metadata( sba_order, ivas_total_brate ); + num_md_sub_frames = ivas_get_spar_dec_md_num_subframes( sba_order, hDecoderConfig->ivas_total_brate, st_ivas->last_active_ivas_total_brate ); + + num_bands_out = hSpar->hFbMixer->pFb->filterbank_num_bands; + + if ( ivas_total_brate > FRAME_NO_DATA && !bfi ) + { + if ( ivas_total_brate > IVAS_SID_5k2 ) + { + ivas_parse_spar_header( hDecoderConfig->ivas_total_brate, sba_order, st0, &table_idx ); + + if ( hSpar->hMdDec->spar_hoa_md_flag ) + { + hSpar->hMdDec->spar_md.num_bands = IVAS_MAX_NUM_BANDS; + } + else + { + hSpar->hMdDec->spar_md.num_bands = min( SPAR_DIRAC_SPLIT_START_BAND, IVAS_MAX_NUM_BANDS ); + } + + if ( hSpar->hMdDec->table_idx != table_idx ) + { + hSpar->hMdDec->table_idx = table_idx; + if ( hSpar->hTdDecorr ) + { + hSpar->hTdDecorr->ducking_flag = ivas_spar_br_table_consts[table_idx].td_ducking; + } + + if ( ( error = ivas_spar_md_dec_init( hSpar->hMdDec, hDecoderConfig, num_channels, sba_order ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + + /*---------------------------------------------------------------------* + * Decode MD + *---------------------------------------------------------------------*/ + + ivas_spar_md_dec_process( st_ivas, st0, num_bands_out, sba_order ); + + /*---------------------------------------------------------------------* + * read PCA bits + *---------------------------------------------------------------------*/ + + if ( hSpar->hPCA != NULL ) + { + ivas_pca_read_bits( st0, hSpar->hPCA ); + } + + /*---------------------------------------------------------------------* + * Read AGC bits + *---------------------------------------------------------------------*/ + + if ( ivas_total_brate > IVAS_SID_5k2 && !bfi && hSpar->hMdDec->dtx_vad ) + { + if ( hSpar->hMdDec->spar_md_cfg.nchan_transport == 1 ) + { + hSpar->AGC_flag = get_next_indice( st0, 1 ); + } + + ivas_agc_read_bits( hSpar->hAgcDec, st0, hSpar->hMdDec->spar_md_cfg.nchan_transport, hSpar->AGC_flag ); + } + + /*---------------------------------------------------------------------* + * MD smoothing + *---------------------------------------------------------------------*/ + + if ( st0->m_old_frame_type == ZERO_FRAME && ivas_total_brate == IVAS_SID_5k2 && st0->prev_bfi == 0 && hSpar->hMdDec->spar_md_cfg.nchan_transport == 1 ) + { + ivas_spar_setup_md_smoothing( hSpar->hMdDec, num_bands_out, num_md_sub_frames ); + } + else + { + ivas_spar_update_md_hist( hSpar->hMdDec ); + } + } + else + { + if ( !bfi ) + { + ivas_spar_smooth_md_dtx( hSpar->hMdDec, num_bands_out, num_md_sub_frames ); + } + + set_s( hSpar->hMdDec->valid_bands, 0, IVAS_MAX_NUM_BANDS ); + } + + pop_wmops(); + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * ivas_spar_get_cldfb_slot_gain() + * + * + *-------------------------------------------------------------------*/ + +static float ivas_spar_get_cldfb_slot_gain( + SPAR_DEC_HANDLE hSpar, /* i/o: SPAR decoder handle */ + const DECODER_CONFIG_HANDLE hDecoderConfig, /* i : configuration structure */ + const int16_t time_slot_idx, + int16_t *time_slot_idx0, + int16_t *time_slot_idx1, + float *weight_lowfreq ) +{ + float weight; + float output_Fs, encfb_delay, decfb_delay; + float xfade_start_ns; + int16_t xfade_delay_subframes; + int16_t i_hist; + int16_t split_band; + + *weight_lowfreq = hSpar->hFbMixer->cldfb_cross_fade[time_slot_idx]; + + output_Fs = (float) hDecoderConfig->output_Fs; + encfb_delay = IVAS_FB_ENC_DELAY_NS; + decfb_delay = IVAS_FB_DEC_DELAY_NS; + xfade_start_ns = hSpar->hFbMixer->cross_fade_start_offset / output_Fs * 1000000000.f - encfb_delay + decfb_delay * 0.5f; + xfade_delay_subframes = (int16_t) ( xfade_start_ns / ( FRAME_SIZE_NS / MAX_PARAM_SPATIAL_SUBFRAMES ) ); + + i_hist = 4 - xfade_delay_subframes; + split_band = SPAR_DIRAC_SPLIT_START_BAND; + + if ( split_band < IVAS_MAX_NUM_BANDS ) + { + if ( hSpar->i_subframe > 3 ) + { + weight = (float) ( time_slot_idx % MAX_PARAM_SPATIAL_SUBFRAMES ) / (float) MAX_PARAM_SPATIAL_SUBFRAMES; + } + else + { + weight = 0.0f; + } + *time_slot_idx0 = i_hist; + *time_slot_idx1 = i_hist + 1; + } + else + { + /* determine cross-fade gain for current frame Parameters*/ + *time_slot_idx0 = hSpar->hFbMixer->cldfb_cross_fade_start; + *time_slot_idx1 = hSpar->hFbMixer->cldfb_cross_fade_end; + weight = *weight_lowfreq; + } + + return weight; +} + + +/*-------------------------------------------------------------------* + * ivas_spar_get_parameters() + * + * + *-------------------------------------------------------------------*/ + +void ivas_spar_get_parameters( + SPAR_DEC_HANDLE hSpar, /* i/o: SPAR decoder handle */ + const DECODER_CONFIG_HANDLE hDecoderConfig, /* i : configuration structure */ + const int16_t ts, + const int16_t num_ch_out, + const int16_t num_ch_in, + const int16_t num_spar_bands, + float par_mat[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS] ) +{ + int16_t spar_band, out_ch, in_ch; + float weight, weight_20ms; + int16_t ts0, ts1, split_band; + + weight = ivas_spar_get_cldfb_slot_gain( hSpar, hDecoderConfig, ts, &ts0, &ts1, &weight_20ms ); + + split_band = SPAR_DIRAC_SPLIT_START_BAND; + for ( spar_band = 0; spar_band < num_spar_bands; spar_band++ ) + { + for ( out_ch = 0; out_ch < num_ch_out; out_ch++ ) + { + if ( split_band < IVAS_MAX_NUM_BANDS + /* 20ms cross-fade for Transport channels in all frequency bands */ + && ( 0 == ivas_is_res_channel( out_ch, hSpar->hMdDec->spar_md_cfg.nchan_transport ) ) /* sub-frame processing for missing channels in all frequency bands*/ + ) + { + for ( in_ch = 0; in_ch < num_ch_in; in_ch++ ) + { + if ( hSpar->i_subframe > 3 ) + { + par_mat[out_ch][in_ch][spar_band] = ( 1.0f - weight ) * hSpar->hMdDec->mixer_mat_prev[ts0][out_ch][in_ch][spar_band] + + weight * hSpar->hMdDec->mixer_mat_prev[ts1][out_ch][in_ch][spar_band]; + } + else + { + par_mat[out_ch][in_ch][spar_band] = hSpar->hMdDec->mixer_mat[out_ch][in_ch][spar_band]; + } + } + } + else + { + for ( in_ch = 0; in_ch < num_ch_in; in_ch++ ) + { + /* 20ms Transport channel reconstruction with matching encoder/decoder processing */ + int16_t prev_idx = SPAR_DIRAC_SPLIT_START_BAND < IVAS_MAX_NUM_BANDS ? 1 : 0; /* if SPAR_DIRAC_SPLIT_START_BAND == IVAS_MAX_NUM_BANDS, then the sub-frame mixer_mat delay line is not active */ + par_mat[out_ch][in_ch][spar_band] = ( 1.0f - weight_20ms ) * hSpar->hMdDec->mixer_mat_prev[prev_idx][out_ch][in_ch][spar_band] + weight_20ms * hSpar->hMdDec->mixer_mat[out_ch][in_ch][spar_band]; + } + } + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * ivas_spar_get_skip_mat() + * + * + *-------------------------------------------------------------------*/ + +static void ivas_spar_get_skip_mat( + SPAR_DEC_HANDLE hSpar, /* i/o: SPAR decoder handle */ + const int16_t num_ch_out, + const int16_t num_ch_in, + const int16_t num_spar_bands, + int16_t skip_mat[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], + const int16_t num_md_sub_frames ) +{ + int16_t spar_band, out_ch, in_ch; + int16_t i_ts, skip_flag; + + for ( out_ch = 0; out_ch < num_ch_out; out_ch++ ) + { + for ( in_ch = 0; in_ch < num_ch_in; in_ch++ ) + { + skip_mat[out_ch][in_ch] = 1; + skip_flag = 1; + for ( i_ts = 0; i_ts < MAX_PARAM_SPATIAL_SUBFRAMES; i_ts++ ) + { + for ( spar_band = 0; spar_band < num_spar_bands; spar_band++ ) + { + if ( hSpar->hMdDec->mixer_mat_prev[1 + i_ts][out_ch][in_ch][spar_band] != 0.0f ) + { + skip_flag = 0; + break; + } + } + + if ( skip_flag == 0 ) + { + skip_mat[out_ch][in_ch] = 0; + break; + } + } + + if ( skip_mat[out_ch][in_ch] == 1 ) + { + for ( i_ts = 0; i_ts < num_md_sub_frames; i_ts++ ) + { + for ( spar_band = 0; spar_band < num_spar_bands; spar_band++ ) + { + if ( hSpar->hMdDec->mixer_mat[out_ch][in_ch][spar_band + i_ts * IVAS_MAX_NUM_BANDS] != 0.0f ) + { + skip_flag = 0; + break; + } + } + + if ( skip_flag == 0 ) + { + skip_mat[out_ch][in_ch] = 0; + break; + } + } + } + } + } + + return; +} + + +static void ivas_spar_calc_smooth_facs( + float *cldfb_in_ts_re[CLDFB_NO_COL_MAX], + float *cldfb_in_ts_im[CLDFB_NO_COL_MAX], + int16_t nbands_spar, + ivas_fb_bin_to_band_data_t *bin2band, + float *smooth_fac, + float smooth_buf[IVAS_MAX_NUM_BANDS][2 * SBA_DIRAC_NRG_SMOOTH_LONG + 1] ) +{ + int16_t b, bin, i, ts; + float subframe_band_nrg[IVAS_MAX_NUM_BANDS]; + float smooth_long_avg[IVAS_MAX_NUM_BANDS]; + float smooth_short_avg[IVAS_MAX_NUM_BANDS]; + + bin = 0; + for ( b = 0; b < nbands_spar; b++ ) + { + if ( bin >= CLDFB_NO_CHANNELS_MAX || ( b > 0 && bin2band->p_cldfb_map_to_spar_band[bin] < bin2band->p_cldfb_map_to_spar_band[bin - 1] ) ) + { + break; + } + + /* calculate band-wise subframe energies */ + subframe_band_nrg[b] = 0.f; + while ( bin < CLDFB_NO_CHANNELS_MAX && b == bin2band->p_cldfb_map_to_spar_band[bin] ) + { + for ( ts = 0; ts < MAX_PARAM_SPATIAL_SUBFRAMES; ts++ ) + { + subframe_band_nrg[b] += cldfb_in_ts_re[ts][bin] * cldfb_in_ts_re[ts][bin] + cldfb_in_ts_im[ts][bin] * cldfb_in_ts_im[ts][bin]; + } + bin++; + } + subframe_band_nrg[b] = sqrtf( subframe_band_nrg[b] ); + smooth_buf[b][0] = subframe_band_nrg[b]; + + /* calculate short and long energy averages */ + smooth_short_avg[b] = EPSILON; + for ( i = 0; i < 2 * SBA_DIRAC_NRG_SMOOTH_SHORT; i++ ) + { + smooth_short_avg[b] += smooth_buf[b][i]; + } + + smooth_long_avg[b] = smooth_short_avg[b]; + for ( i = 2 * SBA_DIRAC_NRG_SMOOTH_SHORT; i < 2 * SBA_DIRAC_NRG_SMOOTH_LONG; i++ ) + { + smooth_long_avg[b] += smooth_buf[b][i]; + } + smooth_short_avg[b] /= ( 2 * SBA_DIRAC_NRG_SMOOTH_SHORT ); + smooth_long_avg[b] /= ( 2 * SBA_DIRAC_NRG_SMOOTH_LONG ); + + /* calculate smoothing factor based on energy averages */ + /* reduce factor for higher short-term energy */ + smooth_fac[b] = min( 1.f, smooth_long_avg[b] / smooth_short_avg[b] ); + + /* map factor to range [0;1] */ + smooth_fac[b] = max( 0.f, smooth_fac[b] - (float) SBA_DIRAC_NRG_SMOOTH_SHORT / SBA_DIRAC_NRG_SMOOTH_LONG ) * ( (float) SBA_DIRAC_NRG_SMOOTH_LONG / ( SBA_DIRAC_NRG_SMOOTH_LONG - SBA_DIRAC_NRG_SMOOTH_SHORT ) ); + + /* compress factor (higher compression in lowest bands) */ + if ( b < 2 ) + { + smooth_fac[b] = powf( smooth_fac[b], 0.25f ); + } + else + { + smooth_fac[b] = powf( smooth_fac[b], 0.5f ); + } + + /* apply upper bounds depending on band */ + smooth_fac[b] = max( min_smooth_gains1[b], min( max_smooth_gains2[b], smooth_fac[b] ) ); + } + + for ( b = 0; b < nbands_spar; b++ ) + { + for ( i = 2 * SBA_DIRAC_NRG_SMOOTH_LONG; i > 0; i-- ) + { + smooth_buf[b][i] = smooth_buf[b][i - 1]; + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * ivas_spar_dec_agc_pca() + * + * + *-------------------------------------------------------------------*/ + +void ivas_spar_dec_agc_pca( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + float *output[], /* i/o: input/output audio channels */ + const int16_t output_frame /* i : output frame length */ +) +{ + int16_t nchan_transport; + int16_t num_in_ingest; + DECODER_CONFIG_HANDLE hDecoderConfig; + SPAR_DEC_HANDLE hSpar; + + push_wmops( "ivas_spar_dec_agc_pca" ); + + hSpar = st_ivas->hSpar; + hDecoderConfig = st_ivas->hDecoderConfig; + nchan_transport = hSpar->hMdDec->spar_md_cfg.nchan_transport; + + if ( st_ivas->nchan_transport >= 3 ) + { + float temp; + int16_t i; + /*convert WYZX downmix to WYXZ*/ + for ( i = 0; i < output_frame; i++ ) + { + temp = output[2][i]; + output[2][i] = output[3][i]; + output[3][i] = temp; + } + } + + if ( hSpar->hMdDec->td_decorr_flag ) + { + num_in_ingest = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); + } + else + { + num_in_ingest = nchan_transport; + } + + /*---------------------------------------------------------------------* + * AGC + *---------------------------------------------------------------------*/ + + ivas_agc_dec_process( hSpar->hAgcDec, output, output, nchan_transport, output_frame ); + + if ( hSpar->hPCA != NULL ) + { + ivas_pca_dec( hSpar->hPCA, output_frame, num_in_ingest, hDecoderConfig->ivas_total_brate, hDecoderConfig->last_ivas_total_brate, st_ivas->bfi, output ); + } + pop_wmops(); + + return; +} + + +/*-------------------------------------------------------------------* + * ivas_spar_dec_set_render_map() + * + * + *-------------------------------------------------------------------*/ + +void ivas_spar_dec_set_render_map( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const int16_t nCldfbTs /* i : number of CLDFB time slots */ +) +{ + SPAR_DEC_HANDLE hSpar; + + hSpar = st_ivas->hSpar; + + /* adapt subframes */ + hSpar->num_slots = nCldfbTs; + hSpar->slots_rendered = 0; + hSpar->subframes_rendered = 0; + + set_s( hSpar->render_to_md_map, 0, MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME ); + ivas_jbm_dec_get_adapted_subframes( nCldfbTs, hSpar->subframe_nbslots, &hSpar->nb_subframes ); + + /* copy also to tc buffer */ + /* only for non-combined formats and combinded formats w/o discrete objects */ + if ( !( st_ivas->ivas_format == SBA_ISM_FORMAT && st_ivas->ism_mode == ISM_SBA_MODE_DISC ) ) + { + st_ivas->hTcBuffer->nb_subframes = hSpar->nb_subframes; + mvs2s( hSpar->subframe_nbslots, st_ivas->hTcBuffer->subframe_nbslots, hSpar->nb_subframes ); + } + + ivas_jbm_dec_get_md_map( DEFAULT_JBM_CLDFB_TIMESLOTS, nCldfbTs, 1, 0, DEFAULT_JBM_CLDFB_TIMESLOTS, hSpar->render_to_md_map ); + + return; +} + + +/*-------------------------------------------------------------------* + * ivas_spar_dec_upmixer() + * + * IVAS SPAR upmixer + *-------------------------------------------------------------------*/ + +void ivas_spar_dec_set_render_params( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const int16_t n_cldfb_slots /* i : number of cldfb slots in this frame */ +) +{ + SPAR_DEC_HANDLE hSpar; + int16_t nchan_transport; + int16_t num_bands_out; + + hSpar = st_ivas->hSpar; + nchan_transport = hSpar->hMdDec->spar_md_cfg.nchan_transport; + num_bands_out = hSpar->hFbMixer->pFb->filterbank_num_bands; + ivas_spar_dec_gen_umx_mat( hSpar->hMdDec, nchan_transport, num_bands_out, st_ivas->bfi, ivas_get_spar_dec_md_num_subframes( st_ivas->sba_order, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->last_active_ivas_total_brate ) ); + + ivas_spar_dec_set_render_map( st_ivas, n_cldfb_slots ); + + return; +} + + +/*-------------------------------------------------------------------* + * ivas_spar_dec_digest_tc() + * + * + *-------------------------------------------------------------------*/ + +void ivas_spar_dec_digest_tc( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const int16_t nchan_transport, /* i : number of transport channels */ + const int16_t nCldfbSlots, /* i : number of CLDFB slots */ + const int16_t nSamplesForRendering /* i : number of samples provided */ +) +{ + SPAR_DEC_HANDLE hSpar; + + hSpar = st_ivas->hSpar; + if ( hSpar->hMdDec->td_decorr_flag && !( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) + { + float Pcm_tmp[MAX_SPAR_INTERNAL_CHANNELS][L_FRAME48k]; + float *pPcm_tmp[MAX_SPAR_INTERNAL_CHANNELS]; + float *p_tc[MAX_SPAR_INTERNAL_CHANNELS]; + int16_t nchan_internal, ch; + int16_t ch_sba_idx; + int16_t nSamplesLeftForTD, default_frame; + + ch_sba_idx = 0; + if ( st_ivas->ivas_format == SBA_ISM_FORMAT ) + { + if ( st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + { + ch_sba_idx = st_ivas->nchan_ism; + } + } + + /* TD decorrelator */ + default_frame = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); + nSamplesLeftForTD = nSamplesForRendering; + nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); + + for ( ch = 0; ch < nchan_internal; ch++ ) + { + pPcm_tmp[ch] = Pcm_tmp[ch]; + p_tc[ch] = st_ivas->hTcBuffer->tc[ch + ch_sba_idx]; + } + + while ( nSamplesLeftForTD ) + { + int16_t nSamplesToDecorr = min( nSamplesLeftForTD, default_frame ); + + if ( hSpar->hTdDecorr ) + { + ivas_td_decorr_process( hSpar->hTdDecorr, p_tc, pPcm_tmp, nSamplesToDecorr ); + if ( hSpar->hTdDecorr->num_apd_outputs >= ( nchan_internal - nchan_transport ) ) + { + for ( ch = 0; ch < nchan_internal - nchan_transport; ch++ ) + { + mvr2r( pPcm_tmp[hSpar->hTdDecorr->num_apd_outputs - 1 - ch], p_tc[nchan_internal - 1 - ch], nSamplesToDecorr ); + } + } + else + { + for ( ch = 0; ch < nchan_internal - nchan_transport; ch++ ) + { + set_zero( p_tc[nchan_internal - 1 - ch], nSamplesToDecorr ); + } + for ( ch = 0; ch < hSpar->hTdDecorr->num_apd_outputs; ch++ ) + { + mvr2r( pPcm_tmp[hSpar->hTdDecorr->num_apd_outputs - 1 - ch], p_tc[nchan_internal - 1 - ch], nSamplesToDecorr ); + } + } + } + for ( ch = 0; ch < nchan_internal; ch++ ) + { + p_tc[ch] += nSamplesToDecorr; + } + + nSamplesLeftForTD -= nSamplesToDecorr; + } + } + + ivas_spar_dec_set_render_params( st_ivas, nCldfbSlots ); + + return; +} + + +/*-------------------------------------------------------------------* + * ivas_spar_dec_upmixer() + * + * + *-------------------------------------------------------------------*/ + +void ivas_spar_dec_upmixer( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + float *output[], /* i/o: input/output audio channels */ + const int16_t nchan_internal, /* i : number of internal channels */ + const int16_t output_frame /* i : output frame length */ +) +{ + SPAR_DEC_HANDLE hSpar; + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom; + int16_t nchan_transport, nchan_out; + int16_t subframe_idx, n, i; + int16_t n_samples_sf; + float *output_f_local[MAX_OUTPUT_CHANNELS]; + float Pcm_tmp[MAX_OUTPUT_CHANNELS][L_FRAME48k]; + float *pPcm_tmp[MAX_OUTPUT_CHANNELS]; + int16_t nchan_internal_total; + int16_t sba_ch_offset; + + hSpar = st_ivas->hSpar; + nchan_transport = hSpar->hMdDec->spar_md_cfg.nchan_transport; + nchan_out = st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe; + n_samples_sf = JBM_CLDFB_SLOTS_IN_SUBFRAME * NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ); + + nchan_internal_total = nchan_internal; + sba_ch_offset = 0; + if ( st_ivas->ivas_format == SBA_ISM_FORMAT && st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + { + nchan_internal_total += st_ivas->nchan_ism; + sba_ch_offset = st_ivas->nchan_ism; + } + + for ( n = 0; n < MAX_OUTPUT_CHANNELS; n++ ) + { + output_f_local[n] = output[n + sba_ch_offset]; + } + + for ( n = 0; n < nchan_internal_total; n++ ) + { + st_ivas->hTcBuffer->tc[n] = output[n]; + } + + /*---------------------------------------------------------------------* + * TD decorrelation + *---------------------------------------------------------------------*/ + + for ( i = 0; i < nchan_internal; i++ ) + { + pPcm_tmp[i] = Pcm_tmp[i]; + } + + if ( hSpar->hMdDec->td_decorr_flag ) + { + if ( hSpar->hTdDecorr ) + { + ivas_td_decorr_process( hSpar->hTdDecorr, output_f_local, pPcm_tmp, output_frame ); + + if ( hSpar->hTdDecorr->num_apd_outputs >= ( nchan_internal - nchan_transport ) ) + { + for ( i = 0; i < nchan_internal - nchan_transport; i++ ) + { + mvr2r( pPcm_tmp[hSpar->hTdDecorr->num_apd_outputs - 1 - i], st_ivas->hTcBuffer->tc[nchan_internal_total - 1 - i], output_frame ); + } + } + else + { + for ( i = 0; i < nchan_internal - nchan_transport; i++ ) + { + set_zero( st_ivas->hTcBuffer->tc[nchan_internal_total - 1 - i], output_frame ); + } + + for ( i = 0; i < hSpar->hTdDecorr->num_apd_outputs; i++ ) + { + mvr2r( pPcm_tmp[hSpar->hTdDecorr->num_apd_outputs - 1 - i], st_ivas->hTcBuffer->tc[nchan_internal_total - 1 - i], output_frame ); + } + } + } + } + + ivas_spar_dec_set_render_params( st_ivas, DEFAULT_JBM_CLDFB_TIMESLOTS ); + + if ( st_ivas->hDirAC != 0 ) + { + ivas_dirac_dec_set_md_map( st_ivas, DEFAULT_JBM_CLDFB_TIMESLOTS ); + } + + for ( subframe_idx = 0; subframe_idx < MAX_PARAM_SPATIAL_SUBFRAMES; subframe_idx++ ) + { + ivas_spar_dec_upmixer_sf( st_ivas, output_f_local, nchan_internal ); + + for ( n = 0; n < nchan_out; n++ ) + { + output_f_local[n] += n_samples_sf; + } + } + + for ( n = 0; n < nchan_internal_total; n++ ) + { + st_ivas->hTcBuffer->tc[n] = NULL; + } + + if ( st_ivas->hDirAC != NULL && st_ivas->hSpatParamRendCom != NULL ) + { + hSpatParamRendCom = st_ivas->hSpatParamRendCom; + if ( st_ivas->hDirAC->hConfig->dec_param_estim == 1 ) + { + hSpatParamRendCom->dirac_read_idx = ( hSpatParamRendCom->dirac_read_idx + DEFAULT_JBM_CLDFB_TIMESLOTS ) % hSpatParamRendCom->dirac_md_buffer_length; + } + else + { + hSpatParamRendCom->dirac_read_idx = ( hSpatParamRendCom->dirac_read_idx + DEFAULT_JBM_SUBFRAMES_5MS ) % hSpatParamRendCom->dirac_md_buffer_length; + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * ivas_spar_dec_upmixer_sf() + * + * IVAS SPAR upmixer + *-------------------------------------------------------------------*/ + +void ivas_spar_dec_upmixer_sf( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + float *output[], /* o : output audio channels */ + const int16_t nchan_internal /* i : number of internal channels */ +) +{ + int16_t cldfb_band, num_cldfb_bands, numch_in, numch_out; + float *cldfb_in_ts_re[MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS][CLDFB_NO_COL_MAX]; + float *cldfb_in_ts_im[MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS][CLDFB_NO_COL_MAX]; + int16_t i, b, ts, out_ch, in_ch; + int16_t num_spar_bands, spar_band, nchan_transport; + int16_t num_in_ingest, split_band; + int16_t slot_size, slot_idx_start; + float *p_tc[MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS]; + int16_t md_idx; + float Pcm_tmp[MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS][L_FRAME48k]; + int16_t numch_out_dirac; + float mixer_mat[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS]; + int16_t b_skip_mat[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; + DECODER_CONFIG_HANDLE hDecoderConfig; + SPAR_DEC_HANDLE hSpar; + int16_t num_md_sub_frames; + + push_wmops( "ivas_spar_dec_upmixer_sf" ); + hSpar = st_ivas->hSpar; + hDecoderConfig = st_ivas->hDecoderConfig; + nchan_transport = hSpar->hMdDec->spar_md_cfg.nchan_transport; + + num_cldfb_bands = hSpar->hFbMixer->pFb->fb_bin_to_band.num_cldfb_bands; + numch_in = hSpar->hFbMixer->fb_cfg->num_in_chans; + numch_out = hSpar->hFbMixer->fb_cfg->num_out_chans; + num_md_sub_frames = ivas_get_spar_dec_md_num_subframes( st_ivas->sba_order, hDecoderConfig->ivas_total_brate, st_ivas->last_active_ivas_total_brate ); + slot_size = NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ); + slot_idx_start = hSpar->slots_rendered; + + if ( st_ivas->ivas_format == SBA_ISM_FORMAT && st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + { + int16_t nchan_ism; + + nchan_ism = st_ivas->nchan_ism; + + for ( i = 0; i < nchan_internal; i++ ) + { + p_tc[i] = st_ivas->hTcBuffer->tc[i + nchan_ism] + slot_idx_start * slot_size; + } + + if ( st_ivas->ivas_format == SBA_ISM_FORMAT && st_ivas->ism_mode == ISM_SBA_MODE_DISC && st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) + { + for ( i = 0; i < nchan_ism; i++ ) + { + p_tc[i + nchan_internal] = st_ivas->hTcBuffer->tc[i] + slot_idx_start * slot_size; + } + } + } + else + { + for ( i = 0; i < nchan_internal; i++ ) + { + p_tc[i] = st_ivas->hTcBuffer->tc[i] + slot_idx_start * slot_size; + } + } + + + /*---------------------------------------------------------------------* + * TD Decorr and pcm ingest + *---------------------------------------------------------------------*/ + + if ( hSpar->hMdDec->td_decorr_flag ) + { + num_in_ingest = nchan_internal; + } + else + { + num_in_ingest = nchan_transport; + } + + /*---------------------------------------------------------------------* + * PCA decoder + *---------------------------------------------------------------------*/ + + hSpar->hFbMixer->fb_cfg->num_in_chans = num_in_ingest; + + + /*---------------------------------------------------------------------* + * Prepare CLDFB buffers + *---------------------------------------------------------------------*/ + + /* set-up pointers */ + if ( hDecoderConfig->output_config != IVAS_AUDIO_CONFIG_FOA ) + { + /* at this point, output channels are used as intermediate procesing buffers */ + for ( in_ch = 0; in_ch < MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS; in_ch++ ) + { + for ( ts = 0; ts < MAX_PARAM_SPATIAL_SUBFRAMES; ts++ ) + { + cldfb_in_ts_re[in_ch][ts] = &Pcm_tmp[in_ch][ts * num_cldfb_bands]; + cldfb_in_ts_im[in_ch][ts] = &Pcm_tmp[in_ch][ts * num_cldfb_bands + 4 * num_cldfb_bands]; + } + } + } + else + { + for ( in_ch = 0; in_ch < numch_in; in_ch++ ) + { + for ( ts = 0; ts < MAX_PARAM_SPATIAL_SUBFRAMES; ts++ ) + { + cldfb_in_ts_re[in_ch][ts] = &Pcm_tmp[in_ch][ts * num_cldfb_bands]; + cldfb_in_ts_im[in_ch][ts] = &Pcm_tmp[in_ch][ts * num_cldfb_bands + 4 * num_cldfb_bands]; + } + } + } + + /*---------------------------------------------------------------------* + * CLDFB Processing and Synthesis + *---------------------------------------------------------------------*/ + + num_spar_bands = hSpar->hFbMixer->pFb->filterbank_num_bands; + + /* apply parameters */ + /* determine if we can skip certain data */ + ivas_spar_get_skip_mat( hSpar, numch_out, numch_in, num_spar_bands, b_skip_mat, num_md_sub_frames ); /* this can be precomputed based on bitrate and format*/ + + numch_out_dirac = hDecoderConfig->nchan_out; + + + /* CLDFB analysis of incoming frame */ + for ( in_ch = 0; in_ch < numch_in; in_ch++ ) + { + for ( ts = 0; ts < hSpar->subframe_nbslots[hSpar->subframes_rendered]; ts++ ) + { + cldfbAnalysis_ts( &p_tc[in_ch][ts * num_cldfb_bands], cldfb_in_ts_re[in_ch][ts], cldfb_in_ts_im[in_ch][ts], num_cldfb_bands, st_ivas->cldfbAnaDec[in_ch] ); + } + } + + if ( st_ivas->ivas_format == SBA_ISM_FORMAT && st_ivas->ism_mode == ISM_SBA_MODE_DISC && st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) + { + for ( ; in_ch < st_ivas->nchan_ism + numch_in; in_ch++ ) + { + for ( ts = 0; ts < hSpar->subframe_nbslots[hSpar->subframes_rendered]; ts++ ) + { + cldfbAnalysis_ts( &p_tc[in_ch][ts * num_cldfb_bands], cldfb_in_ts_re[in_ch][ts], cldfb_in_ts_im[in_ch][ts], num_cldfb_bands, st_ivas->cldfbAnaDec[in_ch] ); + } + } + } + + if ( ( hDecoderConfig->ivas_total_brate < IVAS_24k4 ) && ( ( hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_HOA2 ) || ( hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_HOA3 ) ) ) + { + ivas_spar_calc_smooth_facs( cldfb_in_ts_re[0], cldfb_in_ts_im[0], num_spar_bands, &hSpar->hFbMixer->pFb->fb_bin_to_band, hSpar->hMdDec->smooth_fac, hSpar->hMdDec->smooth_buf ); + } + + for ( ts = 0; ts < hSpar->subframe_nbslots[hSpar->subframes_rendered]; ts++ ) + { + md_idx = hSpar->render_to_md_map[ts + slot_idx_start]; + ivas_spar_get_parameters( hSpar, hDecoderConfig, md_idx, numch_out, numch_in, num_spar_bands, mixer_mat ); + if ( ( hDecoderConfig->ivas_total_brate < IVAS_24k4 ) && ( ( hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_HOA2 ) || ( hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_HOA3 ) ) ) + { + for ( spar_band = 0; spar_band < num_spar_bands; spar_band++ ) + { + for ( out_ch = 0; out_ch < numch_out; out_ch++ ) + { + for ( in_ch = 0; in_ch < numch_in; in_ch++ ) + { + mixer_mat[out_ch][in_ch][spar_band] = ( 1 - hSpar->hMdDec->smooth_fac[spar_band] ) * mixer_mat[out_ch][in_ch][spar_band] + hSpar->hMdDec->smooth_fac[spar_band] * hSpar->hMdDec->mixer_mat_prev2[out_ch][in_ch][spar_band]; + hSpar->hMdDec->mixer_mat_prev2[out_ch][in_ch][spar_band] = mixer_mat[out_ch][in_ch][spar_band]; + } + } + } + } + + for ( cldfb_band = 0; cldfb_band < num_cldfb_bands; cldfb_band++ ) + { + float out_re[IVAS_SPAR_MAX_CH]; + float out_im[IVAS_SPAR_MAX_CH]; + float cldfb_par; + ivas_fb_bin_to_band_data_t *bin2band = &hSpar->hFbMixer->pFb->fb_bin_to_band; + + for ( out_ch = 0; out_ch < numch_out; out_ch++ ) + { + out_re[out_ch] = 0.0f; + out_im[out_ch] = 0.0f; + + for ( in_ch = 0; in_ch < numch_in; in_ch++ ) + { + if ( b_skip_mat[out_ch][in_ch] == 0 ) + { + if ( cldfb_band < CLDFB_PAR_WEIGHT_START_BAND ) /* tuning parameter, depends on how much SPAR Filters overlap for the CLDFB bands */ + { + spar_band = bin2band->p_cldfb_map_to_spar_band[cldfb_band]; + cldfb_par = mixer_mat[out_ch][in_ch][spar_band]; + } + else + { + cldfb_par = 0.0f; + for ( spar_band = bin2band->p_spar_start_bands[cldfb_band]; spar_band < num_spar_bands; spar_band++ ) + { + /* accumulate contributions from all SPAR bands */ + cldfb_par += mixer_mat[out_ch][in_ch][spar_band] * bin2band->pp_cldfb_weights_per_spar_band[cldfb_band][spar_band]; + } + } + + out_re[out_ch] += cldfb_in_ts_re[in_ch][ts][cldfb_band] * cldfb_par; + out_im[out_ch] += cldfb_in_ts_im[in_ch][ts][cldfb_band] * cldfb_par; + } + } + } + + /*update CLDFB data with the parameter-modified data*/ + for ( out_ch = 0; out_ch < numch_out; out_ch++ ) + { + cldfb_in_ts_re[out_ch][ts][cldfb_band] = out_re[out_ch]; + cldfb_in_ts_im[out_ch][ts][cldfb_band] = out_im[out_ch]; + } + } + + if ( ( ( slot_idx_start + ts + 1 ) == hSpar->num_slots ) || ( ( md_idx / JBM_CLDFB_SLOTS_IN_SUBFRAME ) != ( hSpar->render_to_md_map[ts + slot_idx_start + 1] / JBM_CLDFB_SLOTS_IN_SUBFRAME ) ) ) + { + /* we have crossed an unadapted parameter sf border, update previous mixing matrices */ + int16_t md_sf = md_idx / JBM_CLDFB_SLOTS_IN_SUBFRAME; + split_band = SPAR_DIRAC_SPLIT_START_BAND; + md_sf = ( num_md_sub_frames == MAX_PARAM_SPATIAL_SUBFRAMES ) ? md_sf : 0; + if ( split_band < IVAS_MAX_NUM_BANDS ) + { + mvr2r( hSpar->hMdDec->mixer_mat_prev[1][0][0], hSpar->hMdDec->mixer_mat_prev[0][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_SPAR_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS ); + mvr2r( hSpar->hMdDec->mixer_mat_prev[2][0][0], hSpar->hMdDec->mixer_mat_prev[1][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_SPAR_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS ); + mvr2r( hSpar->hMdDec->mixer_mat_prev[3][0][0], hSpar->hMdDec->mixer_mat_prev[2][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_SPAR_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS ); + mvr2r( hSpar->hMdDec->mixer_mat_prev[4][0][0], hSpar->hMdDec->mixer_mat_prev[3][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_SPAR_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS ); + + for ( out_ch = 0; out_ch < numch_out; out_ch++ ) + { + for ( in_ch = 0; in_ch < numch_in; in_ch++ ) + { + for ( b = 0; b < num_spar_bands; b++ ) + { + hSpar->hMdDec->mixer_mat_prev[4][out_ch][in_ch][b] = hSpar->hMdDec->mixer_mat[out_ch][in_ch][b + md_sf * IVAS_MAX_NUM_BANDS]; + } + } + } + hSpar->i_subframe++; + hSpar->i_subframe = min( hSpar->i_subframe, MAX_PARAM_SPATIAL_SUBFRAMES ); + } + } + } + + if ( hDecoderConfig->output_config != IVAS_AUDIO_CONFIG_FOA && hDecoderConfig->output_config != IVAS_AUDIO_CONFIG_STEREO && hDecoderConfig->output_config != IVAS_AUDIO_CONFIG_MONO ) + { + ivas_dirac_dec_render_sf( st_ivas, output, nchan_internal, cldfb_in_ts_re, cldfb_in_ts_im ); + } + + if ( st_ivas->hDirAC != NULL ) + { + int16_t outchannels, idx_in, idx_lfe, ch; + idx_in = 0; + idx_lfe = 0; + + outchannels = st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe; + + for ( ch = 0; ch < outchannels; ch++ ) + { + if ( ( st_ivas->hOutSetup.num_lfe > 0 ) && ( st_ivas->hOutSetup.index_lfe[idx_lfe] == ch ) ) + { + set_zero( output[ch], hSpar->subframe_nbslots[hSpar->subframes_rendered] * num_cldfb_bands ); + if ( idx_lfe < ( st_ivas->hDirACRend->hOutSetup.num_lfe - 1 ) ) + { + idx_lfe++; + } + } + else + { + if ( ( hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_FOA || !( st_ivas->hOutSetup.output_config == IVAS_AUDIO_CONFIG_BINAURAL || st_ivas->hOutSetup.output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR || st_ivas->hOutSetup.output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB + ) ) && + !( st_ivas->ivas_format == SBA_ISM_FORMAT && st_ivas->ism_mode == ISM_SBA_MODE_DISC && st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) ) + { + for ( ts = 0; ts < hSpar->subframe_nbslots[hSpar->subframes_rendered]; ts++ ) + { + cldfbSynthesis( &cldfb_in_ts_re[idx_in][ts], &cldfb_in_ts_im[idx_in][ts], &output[ch][ts * num_cldfb_bands], num_cldfb_bands, st_ivas->cldfbSynDec[idx_in] ); + } + } + idx_in++; + } + } + } + else + { + /* CLDFB to time synthesis (overwrite mixer output) */ + for ( out_ch = 0; out_ch < numch_out_dirac; out_ch++ ) + { + for ( ts = 0; ts < hSpar->subframe_nbslots[hSpar->subframes_rendered]; ts++ ) + { + cldfbSynthesis( &cldfb_in_ts_re[out_ch][ts], &cldfb_in_ts_im[out_ch][ts], &output[out_ch][ts * num_cldfb_bands], num_cldfb_bands, st_ivas->cldfbSynDec[out_ch] ); + } + } + } + + hSpar->slots_rendered += hSpar->subframe_nbslots[hSpar->subframes_rendered]; + hSpar->subframes_rendered++; + + pop_wmops(); + + return; +} diff --git a/lib_dec/ivas_spar_md_dec.c b/lib_dec/ivas_spar_md_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..e109e00d3c28c451600dbf4568e5cc0e0613ff95 --- /dev/null +++ b/lib_dec/ivas_spar_md_dec.c @@ -0,0 +1,2574 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "math.h" +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_rom_com.h" +#include +#include "wmc_auto.h" +#include "ivas_stat_dec.h" + + +/*------------------------------------------------------------------------------------------* + * Local constants + *------------------------------------------------------------------------------------------*/ + +#define IVAS_DEFAULT_DTX_CNG_RAMP ( 8 ) + +/* PLC constants */ +static const int16_t ivas_spar_dec_plc_num_frames_keep = 9; +static const int16_t ivas_spar_dec_plc_num_frames_fade_out = 9; +static const int16_t ivas_spar_dec_plc_per_frame_ramp_down_gain_dB = 3; +static const int16_t ivas_spar_dec_plc_max_num_frames_ramp_down = 33; +static const int16_t ivas_spar_dec_plc_spatial_target[IVAS_SPAR_MAX_CH] = { 1, 0, 0, 0, 0, 0, 0, 0 }; + + +/*------------------------------------------------------------------------------------------* + * Static functions declaration + *------------------------------------------------------------------------------------------*/ + +static void ivas_get_spar_matrices( ivas_spar_md_dec_state_t *hMdDec, const int16_t num_bands_out, const int16_t n_ts, const int16_t bw, const int16_t dtx_vad, const int16_t nB, const int16_t numch_out, const int16_t active_w_vlbr, const int16_t dyn_active_w_flag ); + +static void ivas_decode_arith_bs( ivas_spar_md_dec_state_t *hMdDec, Decoder_State *st, const uint16_t qsi, const int16_t nB, const int16_t bands_bw, int16_t *pDo_diff, const int16_t strat, const int32_t ivas_total_brate ); + +static void ivas_decode_huffman_bs( ivas_spar_md_dec_state_t *hMdDec, Decoder_State *st, const uint16_t qsi, const int16_t nB, const int16_t bands_bw ); + +static void ivas_fill_band_coeffs_idx( ivas_band_coeffs_ind_t *pBands_idx, const int16_t nB, int16_t *pSymbol_re, ivas_cell_dim_t *pCell_dims, ivas_coeffs_type_t coeff_type ); + +static void ivas_mat_col_rearrange( float in_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], const int16_t order[IVAS_SPAR_MAX_CH], const int16_t i_ts, float ***mixer_mat, const int16_t bands, const int16_t num_ch ); + +static void ivas_spar_dec_compute_ramp_down_post_matrix( ivas_spar_md_dec_state_t *hMdDec, const int16_t num_bands, const int16_t bfi, const int16_t num_md_sub_frames ); + +static void ivas_spar_md_fill_invalid_bands( ivas_spar_dec_matrices_t *pSpar_coeffs, ivas_spar_dec_matrices_t *pSpar_coeffs_prev, const int16_t *valid_bands, int16_t *base_band_age, const int16_t num_bands, const int16_t numch_out, const int16_t num_md_sub_frames ); + +static ivas_error ivas_spar_set_dec_config( ivas_spar_md_dec_state_t *hMdDec, const int16_t nchan_transport, float *pFC ); + +static void ivas_parse_parameter_bitstream_dtx( ivas_spar_md_t *pSpar_md, Decoder_State *st, const int16_t bw, const int16_t num_bands, int16_t *num_dmx_per_band, int16_t *num_dec_per_band ); + +static ivas_error ivas_deindex_real_index( const int16_t *index, const int16_t q_levels, const float min_value, const float max_value, float *quant, const int16_t num_ch_dim2 ); + +static void ivas_spar_dec_parse_md_bs( ivas_spar_md_dec_state_t *hMdDec, Decoder_State *st, int16_t *nB, int16_t *bands_bw, int16_t *dtx_vad, const int32_t ivas_total_brate, const int16_t sba_inactive_mode, const int32_t last_active_brate ); + + +/*------------------------------------------------------------------------- + * ivas_spar_md_dec_matrix_open() + * + * Allocate and initialize SPAR MD decoder matrices + *------------------------------------------------------------------------*/ + +ivas_error ivas_spar_md_dec_matrix_open( + ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ + const int16_t num_channels, /* i : number of internal channels */ + const int16_t num_md_sub_frames /* i : number of MD subframes */ +) +{ + int16_t i, j; + int16_t k; + if ( ( hMdDec->spar_md.band_coeffs = (ivas_band_coeffs_t *) malloc( IVAS_MAX_NUM_BANDS * num_md_sub_frames * sizeof( ivas_band_coeffs_t ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for band_coeffs in SPAR MD" ); + } + if ( ( hMdDec->mixer_mat = (float ***) malloc( num_channels * sizeof( float ** ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); + } + for ( i = 0; i < num_channels; i++ ) + { + if ( ( hMdDec->mixer_mat[i] = (float **) malloc( num_channels * sizeof( float * ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); + } + for ( j = 0; j < num_channels; j++ ) + { + if ( ( hMdDec->mixer_mat[i][j] = (float *) malloc( num_md_sub_frames * IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); + } + } + } + + if ( ( hMdDec->spar_coeffs.C_re = (float ***) malloc( num_channels * sizeof( float ** ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); + } + for ( i = 0; i < num_channels; i++ ) + { + if ( ( hMdDec->spar_coeffs.C_re[i] = (float **) malloc( num_channels * sizeof( float * ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); + } + for ( j = 0; j < num_channels; j++ ) + { + if ( ( hMdDec->spar_coeffs.C_re[i][j] = (float *) malloc( num_md_sub_frames * IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); + } + } + } + + if ( ( hMdDec->spar_coeffs.P_re = (float ***) malloc( num_channels * sizeof( float ** ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); + } + for ( i = 0; i < num_channels; i++ ) + { + if ( ( hMdDec->spar_coeffs.P_re[i] = (float **) malloc( num_channels * sizeof( float * ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); + } + for ( j = 0; j < num_channels; j++ ) + { + if ( ( hMdDec->spar_coeffs.P_re[i][j] = (float *) malloc( num_md_sub_frames * IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); + } + } + } + + if ( ( hMdDec->spar_coeffs_prev.C_re = (float ***) malloc( num_channels * sizeof( float ** ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); + } + for ( i = 0; i < num_channels; i++ ) + { + if ( ( hMdDec->spar_coeffs_prev.C_re[i] = (float **) malloc( num_channels * sizeof( float * ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); + } + for ( j = 0; j < num_channels; j++ ) + { + if ( ( hMdDec->spar_coeffs_prev.C_re[i][j] = (float *) malloc( IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); + } + } + } + + if ( ( hMdDec->spar_coeffs_prev.P_re = (float ***) malloc( num_channels * sizeof( float ** ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); + } + for ( i = 0; i < num_channels; i++ ) + { + if ( ( hMdDec->spar_coeffs_prev.P_re[i] = (float **) malloc( num_channels * sizeof( float * ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); + } + for ( j = 0; j < num_channels; j++ ) + { + if ( ( hMdDec->spar_coeffs_prev.P_re[i][j] = (float *) malloc( IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); + } + } + } + + if ( ( hMdDec->spar_coeffs_tar.C_re = (float ***) malloc( num_channels * sizeof( float ** ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); + } + for ( i = 0; i < num_channels; i++ ) + { + if ( ( hMdDec->spar_coeffs_tar.C_re[i] = (float **) malloc( num_channels * sizeof( float * ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); + } + for ( j = 0; j < num_channels; j++ ) + { + if ( ( hMdDec->spar_coeffs_tar.C_re[i][j] = (float *) malloc( IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); + } + } + } + + if ( ( hMdDec->spar_coeffs_tar.P_re = (float ***) malloc( num_channels * sizeof( float ** ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); + } + for ( i = 0; i < num_channels; i++ ) + { + if ( ( hMdDec->spar_coeffs_tar.P_re[i] = (float **) malloc( num_channels * sizeof( float * ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); + } + for ( j = 0; j < num_channels; j++ ) + { + if ( ( hMdDec->spar_coeffs_tar.P_re[i][j] = (float *) malloc( IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); + } + } + } + for ( i = 0; i < num_channels; i++ ) + { + for ( j = 0; j < num_channels; j++ ) + { + for ( k = 0; k < IVAS_MAX_NUM_BANDS; k++ ) + { + hMdDec->spar_coeffs_prev.C_re[i][j][k] = 0.0f; + hMdDec->spar_coeffs_prev.P_re[i][j][k] = 0.0f; + hMdDec->spar_coeffs_tar.C_re[i][j][k] = 0.0f; + hMdDec->spar_coeffs_tar.P_re[i][j][k] = 0.0f; + } + } + } + + return IVAS_ERR_OK; +} + + +/*------------------------------------------------------------------------- + * ivas_get_spar_dec_md_num_subframes() + * + * return number of MD subframes + *------------------------------------------------------------------------*/ + +/*! r: number of MD subframes */ +int16_t ivas_get_spar_dec_md_num_subframes( + const int16_t sba_order, /* i : Ambisonic (SBA) order */ + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + const int32_t ivas_last_active_brate /* i : IVAS last active bitrate */ +) +{ + int16_t num_subframes; + + num_subframes = MAX_PARAM_SPATIAL_SUBFRAMES; + if ( sba_order > SBA_FOA_ORDER ) + { + if ( ivas_total_brate >= IVAS_512k ) + { + num_subframes = 1; + } + } + + if ( ( ivas_total_brate <= IVAS_SID_5k2 && ivas_last_active_brate < IVAS_24k4 ) || ( ivas_total_brate > IVAS_SID_5k2 && ivas_total_brate < IVAS_24k4 ) ) + { + + num_subframes = 1; + } + + return ( num_subframes ); +} + + +/*------------------------------------------------------------------------- + * ivas_spar_md_dec_open() + * + * Allocate and initialize SPAR MD decoder handle + *------------------------------------------------------------------------*/ + +ivas_error ivas_spar_md_dec_open( + ivas_spar_md_dec_state_t **hMdDec_out, /* i/o: SPAR MD decoder handle */ + const DECODER_CONFIG_HANDLE hDecoderConfig, /* i : configuration structure */ + const int16_t num_channels, /* i : number of internal channels */ + const int16_t sba_order, /* i : SBA order */ + const int16_t sid_format, /* i : SID format */ + const int32_t last_active_ivas_total_brate /* i : IVAS last active bitrate */ +) +{ + ivas_spar_md_dec_state_t *hMdDec; + ivas_error error; + int16_t num_md_sub_frames; + + error = IVAS_ERR_OK; + + if ( ( hMdDec = (ivas_spar_md_dec_state_t *) malloc( sizeof( ivas_spar_md_dec_state_t ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD decoder" ); + } + + num_md_sub_frames = ivas_get_spar_dec_md_num_subframes( sba_order, hDecoderConfig->ivas_total_brate, last_active_ivas_total_brate ); + + if ( ( error = ivas_spar_md_dec_matrix_open( hMdDec, num_channels, num_md_sub_frames ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( hDecoderConfig->ivas_total_brate == IVAS_SID_5k2 ) + { + if ( sid_format == SID_SBA_2TC ) + { + hMdDec->table_idx = ivas_get_spar_table_idx( IVAS_48k, sba_order, SPAR_CONFIG_BW, NULL, NULL ); + } + else + { + hMdDec->table_idx = ivas_get_spar_table_idx( IVAS_24k4, sba_order, SPAR_CONFIG_BW, NULL, NULL ); + } + } + else + { + hMdDec->table_idx = ivas_get_spar_table_idx( hDecoderConfig->ivas_total_brate, sba_order, SPAR_CONFIG_BW, NULL, NULL ); + } + + if ( ( error = ivas_spar_md_dec_init( hMdDec, hDecoderConfig, num_channels, sba_order ) ) != IVAS_ERR_OK ) + { + return error; + } + + *hMdDec_out = hMdDec; + + return error; +} + + +/*------------------------------------------------------------------------- + * ivas_spar_md_dec_matrix_close() + * + * Deallocate SPAR MD decoder matrices + *------------------------------------------------------------------------*/ + +void ivas_spar_md_dec_matrix_close( + ivas_spar_md_dec_state_t *hMdDecoder, /* i/o: SPAR MD decoder handle */ + const int16_t num_channels /* i : number of internal channels */ +) +{ + int16_t i, j; + + if ( hMdDecoder->spar_md.band_coeffs != NULL ) + { + free( hMdDecoder->spar_md.band_coeffs ); + hMdDecoder->spar_md.band_coeffs = NULL; + } + + if ( hMdDecoder->mixer_mat != NULL ) + { + for ( i = 0; i < num_channels; i++ ) + { + for ( j = 0; j < num_channels; j++ ) + { + free( hMdDecoder->mixer_mat[i][j] ); + } + free( hMdDecoder->mixer_mat[i] ); + } + free( hMdDecoder->mixer_mat ); + } + + if ( hMdDecoder->spar_coeffs.C_re != NULL ) + { + for ( i = 0; i < num_channels; i++ ) + { + for ( j = 0; j < num_channels; j++ ) + { + free( hMdDecoder->spar_coeffs.C_re[i][j] ); + } + free( hMdDecoder->spar_coeffs.C_re[i] ); + } + free( hMdDecoder->spar_coeffs.C_re ); + } + + if ( hMdDecoder->spar_coeffs.P_re != NULL ) + { + for ( i = 0; i < num_channels; i++ ) + { + for ( j = 0; j < num_channels; j++ ) + { + free( hMdDecoder->spar_coeffs.P_re[i][j] ); + } + free( hMdDecoder->spar_coeffs.P_re[i] ); + } + free( hMdDecoder->spar_coeffs.P_re ); + } + + if ( hMdDecoder->spar_coeffs_prev.C_re != NULL ) + { + for ( i = 0; i < num_channels; i++ ) + { + for ( j = 0; j < num_channels; j++ ) + { + free( hMdDecoder->spar_coeffs_prev.C_re[i][j] ); + } + free( hMdDecoder->spar_coeffs_prev.C_re[i] ); + } + free( hMdDecoder->spar_coeffs_prev.C_re ); + } + + if ( hMdDecoder->spar_coeffs_prev.P_re != NULL ) + { + for ( i = 0; i < num_channels; i++ ) + { + for ( j = 0; j < num_channels; j++ ) + { + free( hMdDecoder->spar_coeffs_prev.P_re[i][j] ); + } + free( hMdDecoder->spar_coeffs_prev.P_re[i] ); + } + free( hMdDecoder->spar_coeffs_prev.P_re ); + } + + if ( hMdDecoder->spar_coeffs_tar.C_re != NULL ) + { + for ( i = 0; i < num_channels; i++ ) + { + for ( j = 0; j < num_channels; j++ ) + { + free( hMdDecoder->spar_coeffs_tar.C_re[i][j] ); + } + free( hMdDecoder->spar_coeffs_tar.C_re[i] ); + } + free( hMdDecoder->spar_coeffs_tar.C_re ); + } + + if ( hMdDecoder->spar_coeffs_tar.P_re != NULL ) + { + for ( i = 0; i < num_channels; i++ ) + { + for ( j = 0; j < num_channels; j++ ) + { + free( hMdDecoder->spar_coeffs_tar.P_re[i][j] ); + } + free( hMdDecoder->spar_coeffs_tar.P_re[i] ); + } + free( hMdDecoder->spar_coeffs_tar.P_re ); + } + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_spar_md_dec_close() + * + * Deallocate SPAR MD decoder handle + *------------------------------------------------------------------------*/ + +void ivas_spar_md_dec_close( + ivas_spar_md_dec_state_t **hMdDec /* i/o: SPAR MD decoder handle */ +) +{ + ivas_spar_md_dec_state_t *hMdDecoder; + int16_t num_channels; + + hMdDecoder = *hMdDec; + num_channels = hMdDecoder->spar_md_cfg.num_umx_chs; + + ivas_spar_md_dec_matrix_close( hMdDecoder, num_channels ); + + free( *hMdDec ); + *hMdDec = NULL; + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_spar_md_dec_init() + * + * SPAR MD decoder initialization + *-----------------------------------------------------------------------------------------*/ + +ivas_error ivas_spar_md_dec_init( + ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ + const DECODER_CONFIG_HANDLE hDecoderConfig, /* i : configuration structure */ + const int16_t num_channels, /* i : number of internal channels */ + const int16_t sba_order /* i : SBA order */ +) +{ + int16_t i, j; + int16_t nchan_transport; + float pFC[IVAS_MAX_NUM_BANDS], PR_minmax[2]; + ivas_error error; + + ivas_sba_get_spar_hoa_md_flag( sba_order, hDecoderConfig->ivas_total_brate, &hMdDec->spar_hoa_md_flag, &hMdDec->spar_hoa_dirac2spar_md_flag ); + + ivas_sba_get_spar_hoa_ch_ind( num_channels, hDecoderConfig->ivas_total_brate, hMdDec->HOA_md_ind ); + + hMdDec->spar_md.num_bands = ( hMdDec->spar_hoa_md_flag ) ? IVAS_MAX_NUM_BANDS : min( IVAS_MAX_NUM_BANDS, SPAR_DIRAC_SPLIT_START_BAND ); + + ivas_spar_set_bitrate_config( &hMdDec->spar_md_cfg, hMdDec->table_idx, hMdDec->spar_md.num_bands, hMdDec->spar_hoa_dirac2spar_md_flag, 0, 0, 0 ); + + nchan_transport = hMdDec->spar_md_cfg.nchan_transport; + + /* get FB coefficients */ + for ( i = 0; i < IVAS_MAX_NUM_BANDS; i++ ) + { + pFC[i] = ivas_fb_fcs_12band_1ms[i] * hDecoderConfig->output_Fs * 0.5f; + } + + if ( ( error = ivas_spar_set_dec_config( hMdDec, nchan_transport, pFC ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( nchan_transport != 2 && ( ( hMdDec->spar_md_cfg.remix_unmix_order == 2 ) || ( hMdDec->spar_md_cfg.remix_unmix_order == 1 ) ) ) + { + return IVAS_ERR_INTERNAL; + } + + /* DTX quant init */ + PR_minmax[0] = hMdDec->spar_md_cfg.quant_strat[0].PR.min; + PR_minmax[1] = hMdDec->spar_md_cfg.quant_strat[0].PR.max; + ivas_spar_quant_dtx_init( &hMdDec->spar_md, PR_minmax ); + + ivas_spar_arith_coeffs_com_init( &hMdDec->arith_coeffs, &hMdDec->spar_md_cfg, hMdDec->table_idx, DEC ); + ivas_spar_huff_coeffs_com_init( &hMdDec->huff_coeffs, &hMdDec->spar_md_cfg, hMdDec->table_idx, DEC ); + + hMdDec->spar_md_cfg.prev_quant_idx = -1; + + /* initialize PLC state */ + set_s( hMdDec->valid_bands, 0, IVAS_MAX_NUM_BANDS ); + set_s( hMdDec->base_band_age, 0, IVAS_MAX_NUM_BANDS ); + hMdDec->spar_plc_num_lost_frames = 0; + hMdDec->spar_plc_enable_fadeout_flag = 1; + hMdDec->dtx_md_smoothing_cntr = 1; + + ivas_clear_band_coeffs( hMdDec->spar_md.band_coeffs, IVAS_MAX_NUM_BANDS ); + ivas_clear_band_coeff_idx( hMdDec->spar_md.band_coeffs_idx, IVAS_MAX_NUM_BANDS ); + ivas_clear_band_coeff_idx( hMdDec->spar_md_prev.band_coeffs_idx, IVAS_MAX_NUM_BANDS ); + ivas_clear_band_coeff_idx( hMdDec->spar_md_prev.band_coeffs_idx_mapped, IVAS_MAX_NUM_BANDS ); + + hMdDec->spar_md.dtx_vad = 0; + hMdDec->td_decorr_flag = 1; + + set_f( hMdDec->spar_md.en_ratio_slow, 0.0f, IVAS_MAX_NUM_BANDS ); + set_f( hMdDec->spar_md.ref_pow_slow, 0.0f, IVAS_MAX_NUM_BANDS ); + + set_zero( hMdDec->smooth_fac, IVAS_MAX_NUM_BANDS ); + for ( i = 0; i < IVAS_MAX_NUM_BANDS; i++ ) + { + set_zero( hMdDec->smooth_buf[i], 2 * SBA_DIRAC_NRG_SMOOTH_LONG + 1 ); + } + + for ( i = 0; i < IVAS_SPAR_MAX_CH; i++ ) + { + for ( j = 0; j < IVAS_SPAR_MAX_CH; j++ ) + { + set_zero( hMdDec->mixer_mat_prev2[i][j], IVAS_MAX_NUM_BANDS ); + } + } + + return IVAS_ERR_OK; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_spar_set_dec_config() + * + * Set configuration for SPAR MD decoder + *-----------------------------------------------------------------------------------------*/ + +static ivas_error ivas_spar_set_dec_config( + ivas_spar_md_dec_state_t *hMdDec, + const int16_t nchan_transport, + float *pFC ) +{ + int16_t i, j, nchan, dmx_ch; + + for ( i = 0; i < nchan_transport; i++ ) + { + hMdDec->spar_md_cfg.max_freq_per_chan[i] = ivas_spar_br_table_consts[hMdDec->table_idx].fpcs; + } + + nchan = ivas_sba_get_nchan_metadata( ivas_spar_br_table_consts[hMdDec->table_idx].sba_order, ivas_spar_br_table_consts[hMdDec->table_idx].ivas_total_brate ); + + switch ( nchan ) + { + case 4: /* FOA_CHANNELS */ + hMdDec->num_decorr = IVAS_TD_DECORR_OUT_3CH; + break; + case 9: /* IVAS_HOA_2_CH */ + hMdDec->num_decorr = IVAS_TD_DECORR_OUT_5CH; + break; + case 6: /* IVAS_HOA_2_CH */ + hMdDec->num_decorr = IVAS_TD_DECORR_OUT_2CH; + break; + case 8: /* IVAS_HOA_3_CH */ + hMdDec->num_decorr = IVAS_TD_DECORR_OUT_4CH; + break; + } + + hMdDec->spar_md_cfg.num_umx_chs = nchan; + + dmx_ch = 0; + for ( i = 0; i < IVAS_MAX_NUM_BANDS; i++ ) + { + dmx_ch = 0; + for ( j = 0; j < nchan_transport; j++ ) + { + if ( pFC[i] < hMdDec->spar_md_cfg.max_freq_per_chan[j] ) + { + dmx_ch += 1; + } + } + + hMdDec->spar_md_cfg.num_dmx_chans_per_band[i] = hMdDec->spar_md_cfg.nchan_transport; + hMdDec->spar_md_cfg.num_decorr_per_band[i] = nchan - hMdDec->spar_md_cfg.nchan_transport; + } + + hMdDec->spar_md_cfg.nchan_transport = dmx_ch; + + return IVAS_ERR_OK; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_dec_mono_sba_handling() + * + * + *-----------------------------------------------------------------------------------------*/ + +static void ivas_dec_mono_sba_handling( + Decoder_Struct *st_ivas /* i/o: IVAS decoder handle */ +) +{ + int16_t mono_flag, b, block; + + mono_flag = 1; + + for ( b = 0; b < st_ivas->hQMetaData->q_direction[0].cfg.nbands; b++ ) + { + for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; ++block ) + { + float azimuth = st_ivas->hQMetaData->q_direction[0].band_data[b].azimuth[block]; + float elevation = st_ivas->hQMetaData->q_direction[0].band_data[b].azimuth[block]; + float energy_ratio = st_ivas->hQMetaData->q_direction[0].band_data[0].energy_ratio[block]; + if ( + ( azimuth != 0.0f ) || + ( elevation != 0.0f ) || + ( energy_ratio > 0.15f ) ) /* 0.15f is just above the lowest quantised value. */ + { + mono_flag = 0; + } + } + } + + /* Combine the SPAR prediction coefs flag with the azimuth, elevation and energy ratio flag.*/ + mono_flag = mono_flag && ivas_spar_chk_zero_coefs( st_ivas ); + + if ( mono_flag ) + { + /* Set Energy Ratio values to be zero */ + for ( b = 0; b < st_ivas->hQMetaData->q_direction[0].cfg.nbands; b++ ) + { + set_zero( st_ivas->hQMetaData->q_direction[0].band_data[b].energy_ratio, MAX_PARAM_SPATIAL_SUBFRAMES ); + } + if ( st_ivas->hDirAC != NULL ) + { + for ( block = 0; block < st_ivas->hSpatParamRendCom->dirac_md_buffer_length; ++block ) + { + /* Set directional Energy Ratio values to be zero */ + set_zero( st_ivas->hSpatParamRendCom->energy_ratio1[block], st_ivas->hSpatParamRendCom->num_freq_bands ); + if ( st_ivas->hQMetaData->no_directions == 2 ) + { + set_zero( st_ivas->hSpatParamRendCom->energy_ratio2[block], st_ivas->hSpatParamRendCom->num_freq_bands ); + } + /* Set Diffuseness values to be 1.0 */ + set_f( st_ivas->hSpatParamRendCom->diffuseness_vector[block], 1.0f, st_ivas->hSpatParamRendCom->num_freq_bands ); + } + } + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_spar_md_dec_process() + * + * SPAR Meta Data decoder process + *-----------------------------------------------------------------------------------------*/ + +void ivas_spar_md_dec_process( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + Decoder_State *st0, /* i/o: decoder state structure - for bitstream handling */ + const int16_t num_bands_out, /* i : number of output bands */ + const int16_t sba_order /* i : Ambisonic (SBA) order */ +) +{ + int16_t j, k, b, bw, dtx_vad, nB, i_ts; + ivas_spar_md_dec_state_t *hMdDec; + int16_t num_md_chs; + int16_t num_md_sub_frames; + int16_t dyn_active_w_flag; + int16_t active_w_vlbr; + + hMdDec = st_ivas->hSpar->hMdDec; + + active_w_vlbr = ( st_ivas->hDecoderConfig->ivas_total_brate < IVAS_24k4 ) ? 1 : 0; + + num_md_chs = ivas_sba_get_nchan_metadata( sba_order, st_ivas->hDecoderConfig->ivas_total_brate ); + + num_md_sub_frames = ivas_get_spar_dec_md_num_subframes( sba_order, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->last_active_ivas_total_brate ); + + if ( hMdDec->spar_md_cfg.nchan_transport > 1 && hMdDec->spar_md_cfg.nchan_transport <= 3 ) + { + hMdDec->spar_md.res_ind = 0; + dyn_active_w_flag = get_next_indice( st0, 1 ); + if ( dyn_active_w_flag == 1 ) + { + if ( hMdDec->spar_md_cfg.nchan_transport == 2 ) + { + hMdDec->spar_md.res_ind = get_next_indice( st0, 1 ); + hMdDec->spar_md.res_ind += hMdDec->spar_md_cfg.nchan_transport; + } + else if ( hMdDec->spar_md_cfg.nchan_transport == 3 ) + { + hMdDec->spar_md.res_ind = remix_order_set[hMdDec->spar_md_cfg.remix_unmix_order][hMdDec->spar_md_cfg.nchan_transport]; + } + } + } + else + { + dyn_active_w_flag = 0; + if ( hMdDec->spar_md_cfg.nchan_transport == FOA_CHANNELS ) + { + get_next_indice( st0, 1 ); + } + } + + ivas_spar_dec_parse_md_bs( hMdDec, st0, &nB, &bw, &dtx_vad, st_ivas->hDecoderConfig->ivas_total_brate, + st_ivas->hQMetaData->sba_inactive_mode, st_ivas->last_active_ivas_total_brate ); + + ivas_dec_mono_sba_handling( st_ivas ); + + /* SPAR to DirAC conversion */ + if ( hMdDec->spar_hoa_dirac2spar_md_flag == 1 ) + { + ivas_spar_to_dirac( st_ivas, hMdDec, dtx_vad, num_bands_out, bw, dyn_active_w_flag ); + } + + /* set correct number of bands*/ + nB = IVAS_MAX_NUM_BANDS; + if ( bw == IVAS_RED_BAND_FACT ) + { + nB = nB >> 1; + } + + /* expand DirAC MD to all time slots */ + for ( i_ts = 1; i_ts < num_md_sub_frames; i_ts++ ) + { + for ( b = 0; b < hMdDec->spar_md.num_bands; b++ ) + { + for ( j = 0; j < IVAS_SPAR_MAX_CH - 1; j++ ) + { + hMdDec->spar_md.band_coeffs[b + i_ts * IVAS_MAX_NUM_BANDS].pred_re[j] = hMdDec->spar_md.band_coeffs[b].pred_re[j]; + } + + for ( j = 0; j < IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS; j++ ) + { + for ( k = 0; k < IVAS_SPAR_MAX_DMX_CHS - 1; k++ ) + { + hMdDec->spar_md.band_coeffs[b + i_ts * IVAS_MAX_NUM_BANDS].C_re[j][k] = hMdDec->spar_md.band_coeffs[b].C_re[j][k]; + } + } + + for ( j = 0; j < IVAS_SPAR_MAX_CH - 1; j++ ) + { + hMdDec->spar_md.band_coeffs[b + i_ts * IVAS_MAX_NUM_BANDS].P_re[j] = hMdDec->spar_md.band_coeffs[b].P_re[j]; + } + } + } + + ivas_get_spar_matrices( hMdDec, num_bands_out, num_md_sub_frames, bw, dtx_vad, nB, num_md_chs, active_w_vlbr, dyn_active_w_flag ); + +#ifdef DEBUG_SPAR_DIRAC_WRITE_OUT_PRED_PARS + { + static FILE *fid = 0; + int16_t band = 9; + if ( !fid ) + { + fid = fopen( "pred_coeffs_dec.txt", "wt" ); + } + fprintf( fid, "%.6f\n", hMdDec->mixer_mat[1][0][band] ); + } +#endif + if ( bw == IVAS_RED_BAND_FACT ) + { + nB = nB << 1; + } + + for ( b = nB; b < num_bands_out; b++ ) + { + hMdDec->valid_bands[b] = 1; + } + + ivas_spar_md_fill_invalid_bands( &hMdDec->spar_coeffs, &hMdDec->spar_coeffs_prev, &hMdDec->valid_bands[0], &hMdDec->base_band_age[0], num_bands_out, num_md_chs, num_md_sub_frames ); + + hMdDec->dtx_md_smoothing_cntr = 1; + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_spar_chk_zero_coefs() + * + * Check for zeroed SPAR coefficients + *-----------------------------------------------------------------------------------------*/ + +int16_t ivas_spar_chk_zero_coefs( + Decoder_Struct *st_ivas /* i/o: IVAS decoder handle */ +) +{ + int16_t j, k, b; + ivas_spar_md_dec_state_t *hMdDec; + int16_t mono = 1; + int16_t ndec, ndm; + + hMdDec = st_ivas->hSpar->hMdDec; + ndec = hMdDec->spar_md_cfg.num_decorr_per_band[0]; + ndm = hMdDec->spar_md_cfg.num_dmx_chans_per_band[0]; + + for ( b = 0; b < min( hMdDec->spar_md.num_bands, SPAR_DIRAC_SPLIT_START_BAND ); b++ ) + { + for ( j = 0; j < ndm + ndec - 1; j++ ) + { + if ( hMdDec->spar_md.band_coeffs[b].pred_re[j] != 0.0f ) + { + mono = 0; + } + } + for ( j = 0; j < ndec; j++ ) + { + for ( k = 0; k < ndm - 1; k++ ) + { + if ( hMdDec->spar_md.band_coeffs[b].C_re[j][k] != 0.0f ) + { + mono = 0; + } + } + } + for ( j = 0; j < ndec; j++ ) + { + if ( hMdDec->spar_md.band_coeffs[b].P_re[j] != 0.0f ) + { + mono = 0; + } + } + } + + return mono; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_spar_smooth_md_dtx() + * + * Smooth MD during no data frame during DTX + *-----------------------------------------------------------------------------------------*/ + +void ivas_spar_smooth_md_dtx( + ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ + const int16_t num_bands_out, /* i : number of output bands */ + const int16_t num_md_sub_frames /* i : number of metadata subframes */ +) +{ + int16_t j, k, b, dmx_ch; + float ramp, tar, prev, new_val; + + ramp = (float) hMdDec->dtx_md_smoothing_cntr / IVAS_DEFAULT_DTX_CNG_RAMP; + + for ( b = 0; b < num_bands_out; b++ ) + { + dmx_ch = hMdDec->spar_md_cfg.num_dmx_chans_per_band[b]; + + for ( j = 1; j < FOA_CHANNELS; j++ ) + { + for ( k = dmx_ch; k < FOA_CHANNELS; k++ ) + { + prev = hMdDec->spar_coeffs_prev.P_re[j][k][b]; + tar = hMdDec->spar_coeffs_tar.P_re[j][k][b]; + new_val = prev + ( ramp * ( tar - prev ) ); + hMdDec->spar_coeffs.P_re[j][k][b] = new_val; + } + } + + for ( j = 0; j < FOA_CHANNELS; j++ ) + { + for ( k = 0; k < dmx_ch; k++ ) + { + prev = hMdDec->spar_coeffs_prev.C_re[j][k][b]; + tar = hMdDec->spar_coeffs_tar.C_re[j][k][b]; + new_val = prev + ( ramp * ( tar - prev ) ); + hMdDec->spar_coeffs.C_re[j][k][b] = new_val; + } + } + } + + /* expand MD to all time slots */ + for ( int16_t i_ts = 1; i_ts < num_md_sub_frames; i_ts++ ) + { + for ( b = 0; b < num_bands_out; b++ ) + { + dmx_ch = hMdDec->spar_md_cfg.num_dmx_chans_per_band[b]; + + for ( j = 1; j < FOA_CHANNELS; j++ ) + { + for ( k = dmx_ch; k < FOA_CHANNELS; k++ ) + + { + hMdDec->spar_coeffs.P_re[j][k][b + i_ts * IVAS_MAX_NUM_BANDS] = hMdDec->spar_coeffs.P_re[j][k][b]; + } + } + + for ( j = 0; j < FOA_CHANNELS; j++ ) + { + for ( k = 0; k < dmx_ch; k++ ) + { + hMdDec->spar_coeffs.C_re[j][k][b + i_ts * IVAS_MAX_NUM_BANDS] = hMdDec->spar_coeffs.C_re[j][k][b]; + } + } + } + } + + hMdDec->dtx_md_smoothing_cntr = min( hMdDec->dtx_md_smoothing_cntr + 1, IVAS_DEFAULT_DTX_CNG_RAMP ); + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_spar_setup_md_smoothing() + * + * Set up smoothing of SPAR MD when SID update frame is received + *-----------------------------------------------------------------------------------------*/ + +void ivas_spar_setup_md_smoothing( + ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ + const int16_t num_bands_out, /* i : number of output bands */ + const int16_t num_md_sub_frames /* i : number of metadata subframes */ +) +{ + /* copy the coeffs */ + int16_t num_channels, i, j, k; + + num_channels = hMdDec->spar_md_cfg.num_umx_chs; + + for ( i = 0; i < num_channels; i++ ) + { + for ( j = 0; j < num_channels; j++ ) + { + for ( k = 0; k < IVAS_MAX_NUM_BANDS; k++ ) + { + hMdDec->spar_coeffs_prev.C_re[i][j][k] = hMdDec->spar_coeffs_tar.C_re[i][j][k]; + } + } + } + + for ( i = 0; i < num_channels; i++ ) + { + for ( j = 0; j < num_channels; j++ ) + { + for ( k = 0; k < IVAS_MAX_NUM_BANDS; k++ ) + { + hMdDec->spar_coeffs_prev.P_re[i][j][k] = hMdDec->spar_coeffs_tar.P_re[i][j][k]; + } + } + } + + for ( i = 0; i < num_channels; i++ ) + { + for ( j = 0; j < num_channels; j++ ) + { + for ( k = 0; k < IVAS_MAX_NUM_BANDS; k++ ) + { + hMdDec->spar_coeffs_tar.C_re[i][j][k] = hMdDec->spar_coeffs.C_re[i][j][k]; + } + } + } + + for ( i = 0; i < num_channels; i++ ) + { + for ( j = 0; j < num_channels; j++ ) + { + for ( k = 0; k < IVAS_MAX_NUM_BANDS; k++ ) + { + hMdDec->spar_coeffs_tar.P_re[i][j][k] = hMdDec->spar_coeffs.P_re[i][j][k]; + } + } + } + + ivas_spar_smooth_md_dtx( hMdDec, num_bands_out, num_md_sub_frames ); + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_spar_update_md_hist() + * + * Update previous and target MD + *-----------------------------------------------------------------------------------------*/ + +void ivas_spar_update_md_hist( + ivas_spar_md_dec_state_t *hMdDec /* i/o: SPAR MD decoder handle */ +) +{ + int16_t num_channels, i, j, k; + + num_channels = hMdDec->spar_md_cfg.num_umx_chs; + + for ( i = 0; i < num_channels; i++ ) + { + for ( j = 0; j < num_channels; j++ ) + { + for ( k = 0; k < IVAS_MAX_NUM_BANDS; k++ ) + { + hMdDec->spar_coeffs_prev.C_re[i][j][k] = hMdDec->spar_coeffs.C_re[i][j][k]; + } + } + } + + for ( i = 0; i < num_channels; i++ ) + { + for ( j = 0; j < num_channels; j++ ) + { + for ( k = 0; k < IVAS_MAX_NUM_BANDS; k++ ) + { + hMdDec->spar_coeffs_prev.P_re[i][j][k] = hMdDec->spar_coeffs.P_re[i][j][k]; + } + } + } + + for ( i = 0; i < num_channels; i++ ) + { + for ( j = 0; j < num_channels; j++ ) + { + for ( k = 0; k < IVAS_MAX_NUM_BANDS; k++ ) + { + hMdDec->spar_coeffs_tar.C_re[i][j][k] = hMdDec->spar_coeffs.C_re[i][j][k]; + } + } + } + + for ( i = 0; i < num_channels; i++ ) + { + for ( j = 0; j < num_channels; j++ ) + { + for ( k = 0; k < IVAS_MAX_NUM_BANDS; k++ ) + { + hMdDec->spar_coeffs_tar.P_re[i][j][k] = hMdDec->spar_coeffs.P_re[i][j][k]; + } + } + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_get_spar_matrices() + * + * Get SPAR matrices + *-----------------------------------------------------------------------------------------*/ + +static void ivas_get_spar_matrices( + ivas_spar_md_dec_state_t *hMdDec, + const int16_t num_bands_out, + const int16_t n_ts, + const int16_t bw, + const int16_t dtx_vad, + const int16_t nB, + const int16_t numch_out, + const int16_t active_w_vlbr, + const int16_t dyn_active_w_flag ) +{ + int16_t num_bands, dmx_ch, split_band; + int16_t i, j, k, m, b, i_ts, active_w; + const int16_t *order; + float active_w_dm_fac, re; + + + num_bands = num_bands_out; + order = remix_order_set[hMdDec->spar_md_cfg.remix_unmix_order]; + + split_band = SPAR_DIRAC_SPLIT_START_BAND; + if ( split_band >= IVAS_MAX_NUM_BANDS ) + { + /*store previous 4x4 parameters for linear interpolation to current*/ + for ( i = 0; i < numch_out; i++ ) + { + for ( j = 0; j < numch_out; j++ ) + { + for ( b = 0; b < num_bands; b++ ) + { + hMdDec->mixer_mat_prev[0][i][j][b] = hMdDec->mixer_mat[i][j][b]; + } + } + } + } + + if ( bw == IVAS_RED_BAND_FACT ) + { + num_bands = num_bands >> 1; + } + + active_w = ( dyn_active_w_flag == 1 ) || ( hMdDec->spar_md_cfg.active_w == 1 ); + active_w_dm_fac = ( dtx_vad == 0 ) ? IVAS_ACTIVEW_DM_F_SCALE_DTX : ( ( active_w_vlbr ) ? IVAS_ACTIVEW_DM_F_SCALE_VLBR : IVAS_ACTIVEW_DM_F_SCALE ); + + for ( i_ts = 0; i_ts < n_ts; i_ts++ ) + { + for ( i = 0; i < numch_out; i++ ) + { + for ( j = 0; j < numch_out; j++ ) + { + set_zero( &hMdDec->spar_coeffs.C_re[i][j][i_ts * IVAS_MAX_NUM_BANDS], IVAS_MAX_NUM_BANDS ); + set_zero( &hMdDec->spar_coeffs.P_re[i][j][i_ts * IVAS_MAX_NUM_BANDS], IVAS_MAX_NUM_BANDS ); + } + } + num_bands = min( num_bands, nB ); + + for ( b = 0; b < num_bands; b++ ) + { + float tmp_C1_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; + float tmp_C2_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; + float tmp_dm_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; + + dmx_ch = hMdDec->spar_md_cfg.num_dmx_chans_per_band[bw * b]; + + for ( j = 0; j < numch_out; j++ ) + { + set_zero( tmp_C1_re[j], numch_out ); + set_zero( tmp_C2_re[j], numch_out ); + set_zero( tmp_dm_re[j], numch_out ); + + tmp_C1_re[j][j] = 1.0f; + tmp_C2_re[j][j] = 1.0f; + tmp_dm_re[j][j] = 1.0f; + } + + for ( j = 1; j < numch_out; j++ ) + { + tmp_C1_re[j][0] = hMdDec->spar_md.band_coeffs[b + i_ts * IVAS_MAX_NUM_BANDS].pred_re[j - 1]; + } + + if ( active_w == 1 ) + { + for ( j = 1; j < numch_out; j++ ) + { + tmp_C2_re[0][j] = active_w_dm_fac * -hMdDec->spar_md.band_coeffs[b + i_ts * IVAS_MAX_NUM_BANDS].pred_re[j - 1]; + } + + IVAS_RMULT_FLOAT( tmp_C2_re[0][1], tmp_C1_re[1][0], re ); + tmp_dm_re[0][0] = 1 + re; + + IVAS_RMULT_FLOAT( tmp_C2_re[0][2], tmp_C1_re[2][0], re ); + tmp_dm_re[0][0] += re; + + IVAS_RMULT_FLOAT( tmp_C2_re[0][3], tmp_C1_re[3][0], re ); + tmp_dm_re[0][0] += re; + + if ( dyn_active_w_flag == 1 ) + { + tmp_dm_re[0][0] *= IVAS_SPAR_DYN_ACTIVEW_THRESH; + } + + tmp_dm_re[0][1] = tmp_C2_re[0][1]; + + tmp_dm_re[0][2] = tmp_C2_re[0][2]; + + tmp_dm_re[0][3] = tmp_C2_re[0][3]; + + tmp_dm_re[1][0] = tmp_C1_re[1][0]; + + tmp_dm_re[2][0] = tmp_C1_re[2][0]; + + tmp_dm_re[3][0] = tmp_C1_re[3][0]; + + if ( hMdDec->spar_md_cfg.remix_unmix_order != 3 ) + { + ivas_mat_col_rearrange( tmp_dm_re, order, i_ts, hMdDec->mixer_mat, b, numch_out ); + } + } + else + { + if ( hMdDec->spar_md_cfg.remix_unmix_order != 3 ) + { + ivas_mat_col_rearrange( tmp_C1_re, order, i_ts, hMdDec->mixer_mat, b, numch_out ); + } + } + + if ( dmx_ch > 0 ) + { + float tmpC_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; + float tmpP_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; + + for ( j = 0; j < numch_out; j++ ) + { + set_zero( tmpC_re[j], numch_out ); + set_zero( tmpP_re[j], numch_out ); + } + + for ( j = 0; j < numch_out; j++ ) + { + set_zero( tmpC_re[j], numch_out ); + } + + for ( k = 0; k < dmx_ch; k++ ) + { + tmpC_re[k][k] = 1; + } + + for ( j = dmx_ch; j < numch_out; j++ ) + { + for ( k = 1; k < dmx_ch; k++ ) + { + tmpC_re[j][k] = hMdDec->spar_md.band_coeffs[b + i_ts * IVAS_MAX_NUM_BANDS].C_re[j - dmx_ch][k - 1]; + } + } + + for ( j = dmx_ch; j < numch_out; j++ ) + { + for ( k = dmx_ch; k < numch_out; k++ ) + { + if ( ( j - dmx_ch ) == ( k - dmx_ch ) ) + { + tmpP_re[j][k] = hMdDec->spar_md.band_coeffs[b + i_ts * IVAS_MAX_NUM_BANDS].P_re[k - dmx_ch]; + } + else + { + tmpP_re[j][k] = 0; + } + } + } + + for ( j = 1; j < numch_out; j++ ) + { + for ( k = dmx_ch; k < numch_out; k++ ) + { + for ( m = 0; m < numch_out; m++ ) + { + IVAS_RMULT_FLOAT( hMdDec->mixer_mat[j][m][b + i_ts * IVAS_MAX_NUM_BANDS], tmpP_re[m][k], re ); + hMdDec->spar_coeffs.P_re[j][k][( b * bw ) + i_ts * IVAS_MAX_NUM_BANDS] += re; + } + } + } + + for ( j = 0; j < numch_out; j++ ) + { + for ( k = 0; k < dmx_ch; k++ ) + { + for ( m = 0; m < numch_out; m++ ) + { + IVAS_RMULT_FLOAT( hMdDec->mixer_mat[j][m][b + i_ts * IVAS_MAX_NUM_BANDS], tmpC_re[m][k], re ); + hMdDec->spar_coeffs.C_re[j][k][( b * bw ) + i_ts * IVAS_MAX_NUM_BANDS] += re; + } + } + } + + hMdDec->spar_coeffs.C_re[0][0][( b * bw ) + i_ts * IVAS_MAX_NUM_BANDS] = + max( 0, hMdDec->spar_coeffs.C_re[0][0][( b * bw ) + i_ts * IVAS_MAX_NUM_BANDS] ); + } + } + + /* band mixing */ + if ( bw == IVAS_RED_BAND_FACT ) + { + for ( b = 0; b < num_bands_out; b = b + bw ) + { + dmx_ch = hMdDec->spar_md_cfg.num_dmx_chans_per_band[b]; + for ( j = 0; j < numch_out; j++ ) + { + for ( k = dmx_ch; k < numch_out; k++ ) + { + hMdDec->spar_coeffs.P_re[j][k][( b + 1 ) + i_ts * IVAS_MAX_NUM_BANDS] = hMdDec->spar_coeffs.P_re[j][k][b + i_ts * IVAS_MAX_NUM_BANDS]; + } + } + + for ( j = 0; j < numch_out; j++ ) + { + for ( k = 0; k < dmx_ch; k++ ) + { + hMdDec->spar_coeffs.C_re[j][k][( b + 1 ) + i_ts * IVAS_MAX_NUM_BANDS] = hMdDec->spar_coeffs.C_re[j][k][b + i_ts * IVAS_MAX_NUM_BANDS]; + } + } + } + } + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_mat_col_rearrange() + * + * reorders the input matrix based on order + *-----------------------------------------------------------------------------------------*/ + +static void ivas_mat_col_rearrange( + float in_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], + const int16_t order[IVAS_SPAR_MAX_CH], + const int16_t i_ts, + float ***mixer_mat, + const int16_t bands, + const int16_t num_ch ) +{ + int16_t i, j, idx; + + for ( i = 0; i < num_ch; i++ ) + { + idx = order[i]; + + for ( j = 0; j < num_ch; j++ ) + { + mixer_mat[j][i][bands + i_ts * IVAS_MAX_NUM_BANDS] = in_re[j][idx]; + } + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_spar_dec_gen_umx_mat() + * + * generates upmix matrix + *-----------------------------------------------------------------------------------------*/ + +void ivas_spar_dec_gen_umx_mat( + ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ + const int16_t nchan_transport, /* i : number of transport channels */ + const int16_t num_bands_out, /* i : number of output bands */ + const int16_t bfi, /* i : bad frame indicator */ + const int16_t num_md_sub_frames ) +{ + int16_t i, j, b, i_ts, num_out_ch; + + num_out_ch = hMdDec->spar_md_cfg.num_umx_chs; + + for ( i_ts = 0; i_ts < num_md_sub_frames; i_ts++ ) + { + if ( hMdDec->td_decorr_flag == 1 ) + { + for ( i = 0; i < num_out_ch; i++ ) + { + for ( j = 0; j < nchan_transport; j++ ) + { + for ( b = 0; b < num_bands_out; b++ ) + { + hMdDec->mixer_mat[i][j][b + i_ts * IVAS_MAX_NUM_BANDS] = hMdDec->spar_coeffs.C_re[i][j][b + i_ts * IVAS_MAX_NUM_BANDS]; + } + } + } + + for ( i = 0; i < num_out_ch; i++ ) + { + for ( j = nchan_transport; j < num_out_ch; j++ ) + { + for ( b = 0; b < num_bands_out; b++ ) + { + hMdDec->mixer_mat[i][j][b + i_ts * IVAS_MAX_NUM_BANDS] = hMdDec->spar_coeffs.P_re[i][j][b + i_ts * IVAS_MAX_NUM_BANDS]; + } + } + } + } + else + { + for ( i = 0; i < num_out_ch; i++ ) + { + for ( j = 0; j < nchan_transport; j++ ) + { + for ( b = 0; b < num_bands_out; b++ ) + { + hMdDec->mixer_mat[i][j][b + i_ts * IVAS_MAX_NUM_BANDS] = hMdDec->spar_coeffs.C_re[i][j][b + i_ts * IVAS_MAX_NUM_BANDS]; + } + } + } + } + + } + + ivas_spar_dec_compute_ramp_down_post_matrix( hMdDec, num_bands_out, bfi, num_md_sub_frames ); + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_spar_dec_parse_md_bs() + * + * Parse SPAR MD bitstream + *-----------------------------------------------------------------------------------------*/ + +static void ivas_spar_dec_parse_md_bs( + ivas_spar_md_dec_state_t *hMdDec, + Decoder_State *st0, + int16_t *nB, + int16_t *bands_bw, + int16_t *dtx_vad, + const int32_t ivas_total_brate, + const int16_t sba_inactive_mode, + const int32_t last_active_brate ) +{ + int16_t i, j, k, num_bands; + int16_t ii, jj, ndec, ndm, b, idx; + uint16_t qsi; + ivas_quant_strat_t qs; + int16_t strat, no_ec; + int16_t do_diff[IVAS_MAX_NUM_BANDS]; + float quant[IVAS_SPAR_MAX_C_COEFF]; + int16_t do_repeat[IVAS_MAX_NUM_BANDS]; + int16_t bw_final, bw_fact; + int32_t active_brate; + *dtx_vad = 1; + *bands_bw = 1; + qsi = 0; + num_bands = hMdDec->spar_md.num_bands; + + if ( ivas_total_brate > IVAS_SID_5k2 ) + { + if ( hMdDec->spar_md_cfg.quant_strat_bits > 0 ) + { + if ( ivas_total_brate >= BRATE_SPAR_Q_STRAT ) + { + /*only one bit written for quantization strategy to indicate either a fixed quantization strategy or dtx_vad==0 */ + qsi = get_next_indice( st0, 1 ); + if ( qsi == 1 ) + { + *dtx_vad = 0; + } + } + else + { + if ( sba_inactive_mode == 1 ) + { + *dtx_vad = 0; + qsi = hMdDec->spar_md_cfg.quant_strat_bits + 1; + } + else + { + qsi = get_next_indice( st0, hMdDec->spar_md_cfg.quant_strat_bits ); + } + } + } + else + { + qsi = 0; + } + } + else + { + *dtx_vad = 0; + } + + hMdDec->dtx_vad = *dtx_vad; + + if ( *dtx_vad == 0 ) + { + *nB = SPAR_DTX_BANDS; + *bands_bw = num_bands / *nB; + + for ( i = 0; i < *nB; i++ ) + { + for ( j = 0; j < IVAS_SPAR_MAX_CH - 1; j++ ) + { + hMdDec->spar_md.band_coeffs[i].pred_re[j] = 0; + hMdDec->spar_md.band_coeffs[i].P_re[j] = 0; + } + hMdDec->valid_bands[i] = 1; + } + + for ( i = 0; i < num_bands; i++ ) + { + for ( j = 0; j < ( IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS ); j++ ) + { + for ( k = 0; k < ( IVAS_SPAR_MAX_DMX_CHS - 1 ); k++ ) + { + hMdDec->spar_md.band_coeffs[i].C_re[j][k] = 0; + } + } + } + + ivas_parse_parameter_bitstream_dtx( &hMdDec->spar_md, st0, *bands_bw, *nB, hMdDec->spar_md_cfg.num_dmx_chans_per_band, hMdDec->spar_md_cfg.num_decorr_per_band ); + + active_brate = ( ivas_total_brate > IVAS_SID_5k2 ) ? ivas_total_brate : last_active_brate; + + if ( active_brate >= IVAS_24k4 ) + { + bw_final = 1; + } + else + { + bw_final = 2; + } + + bw_fact = *bands_bw / bw_final; + + for ( i = *nB - 1; i >= 0; i-- ) + { + ndec = hMdDec->spar_md_cfg.num_decorr_per_band[bw_fact * i]; + + for ( b = bw_fact - 1; b >= 0; b-- ) + { + idx = i * bw_fact + b; + for ( j = 0; j < FOA_CHANNELS - 1; j++ ) + { + hMdDec->spar_md.band_coeffs[idx].pred_re[j] = hMdDec->spar_md.band_coeffs[i].pred_re[j]; + } + for ( j = 0; j < ndec; j++ ) + { + hMdDec->spar_md.band_coeffs[idx].P_re[j] = hMdDec->spar_md.band_coeffs[i].P_re[j]; + } + hMdDec->valid_bands[idx] = 1; + } + } + + *bands_bw = bw_final; + *nB = num_bands / bw_final; + + return; + } + + qs = hMdDec->spar_md_cfg.quant_strat[qsi]; + + strat = get_next_indice( st0, 3 ); + + no_ec = 0; + + if ( strat < 2 ) + { + *bands_bw = strat + 1; + *nB = num_bands / *bands_bw; + for ( i = 0; i < *nB; i++ ) + { + do_diff[i] = 0; + do_repeat[i] = 0; + } + } + else if ( strat < 4 ) + { + *bands_bw = strat - 1; + *nB = num_bands / *bands_bw; + for ( i = 0; i < *nB; i++ ) + { + do_diff[i] = 0; + do_repeat[i] = 0; + } + no_ec = 1; + } + else if ( ivas_total_brate < IVAS_24k4 ) + { + *bands_bw = 2; + *nB = num_bands / *bands_bw; + + for ( i = 0; i < *nB; i++ ) + { + do_diff[i] = 0; + do_repeat[i] = ( ( strat % 2 ) == ( ( i + 1 ) % 2 ) ); + } + } + else + { + *bands_bw = 1; + *nB = num_bands; + + for ( i = 0; i < *nB; i++ ) + { + do_diff[i] = ( ( ( i + 1 ) & 3 ) != strat - 4 ); + do_repeat[i] = 0; + } + + ivas_map_prior_coeffs_quant( &hMdDec->spar_md_prev, &hMdDec->spar_md_cfg, qsi, *nB ); + } + hMdDec->spar_md_cfg.prev_quant_idx = qsi; + + if ( no_ec == 0 ) + { + ivas_decode_arith_bs( hMdDec, st0, qsi, *nB, *bands_bw, do_diff, strat, ivas_total_brate ); + } + else + { + ivas_decode_huffman_bs( hMdDec, st0, qsi, *nB, *bands_bw ); + } + + for ( i = 0; i < *nB; i++ ) + { + ndec = hMdDec->spar_md_cfg.num_decorr_per_band[( *bands_bw ) * i]; + ndm = hMdDec->spar_md_cfg.num_dmx_chans_per_band[( *bands_bw ) * i]; + + ivas_deindex_real_index( hMdDec->spar_md.band_coeffs_idx[i].pred_index_re, qs.PR.q_levels[0], qs.PR.min, qs.PR.max, hMdDec->spar_md.band_coeffs[i].pred_re, ndm + ndec - 1 ); + + j = 0; + for ( ii = 0; ii < ndec; ii++ ) + { + for ( jj = 0; jj < ndm - 1; jj++ ) + { + quant[j] = hMdDec->spar_md.band_coeffs[i].C_re[ii][jj]; + j++; + } + } + + ivas_deindex_real_index( hMdDec->spar_md.band_coeffs_idx[i].drct_index_re, qs.C.q_levels[0], qs.C.min, qs.C.max, quant, ndec * ( ndm - 1 ) ); + + j = 0; + for ( ii = 0; ii < ndec; ii++ ) + { + for ( jj = 0; jj < ndm - 1; jj++ ) + { + hMdDec->spar_md.band_coeffs[i].C_re[ii][jj] = quant[j]; + j++; + } + } + + ivas_deindex_real_index( hMdDec->spar_md.band_coeffs_idx[i].decd_index_re, qs.P_r.q_levels[0], qs.P_r.min, qs.P_r.max, hMdDec->spar_md.band_coeffs[i].P_re, ndm + ndec - 1 ); + + /* Store prior coefficient indices */ + for ( j = 0; j < ndm + ndec - 1; j++ ) + { + hMdDec->spar_md_prev.band_coeffs_idx[i].pred_index_re[j] = hMdDec->spar_md.band_coeffs_idx[i].pred_index_re[j]; + } + for ( j = 0; j < ndec * ( ndm - 1 ); j++ ) + { + hMdDec->spar_md_prev.band_coeffs_idx[i].drct_index_re[j] = hMdDec->spar_md.band_coeffs_idx[i].drct_index_re[j]; + } + for ( j = 0; j < ndec; j++ ) + { + hMdDec->spar_md_prev.band_coeffs_idx[i].decd_index_re[j] = hMdDec->spar_md.band_coeffs_idx[i].decd_index_re[j]; + } + hMdDec->valid_bands[*bands_bw * i] |= ( do_diff[i] == 0 && do_repeat[i] == 0 ) ? 1 : 0; + for ( j = 1; j < *bands_bw; j++ ) + { + hMdDec->valid_bands[*bands_bw * i + j] = hMdDec->valid_bands[*bands_bw * i]; + } + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_decode_arith_bs() + * + * Decode bitstream with arith decoder + *-----------------------------------------------------------------------------------------*/ + +static void ivas_decode_arith_bs( + ivas_spar_md_dec_state_t *hMdDec, + Decoder_State *st0, /* i/o: decoder state structure - for bitstream handling*/ + const uint16_t qsi, + const int16_t nB, + const int16_t bands_bw, + int16_t *pDo_diff, + const int16_t strat, + const int32_t ivas_total_brate ) +{ + int16_t i, ndm, ndec; + int16_t j; + ivas_cell_dim_t pred_cell_dims[IVAS_MAX_NUM_BANDS]; + ivas_cell_dim_t drct_cell_dims[IVAS_MAX_NUM_BANDS]; + ivas_cell_dim_t decd_cell_dims[IVAS_MAX_NUM_BANDS]; + ivas_cell_dim_t decx_cell_dims[IVAS_MAX_NUM_BANDS]; + int16_t symbol_arr_re[IVAS_MAX_INPUT_LEN]; + int16_t symbol_arr_old_re[IVAS_MAX_INPUT_LEN]; + int16_t any_diff; + + for ( i = 0; i < nB; i++ ) + { + ndm = hMdDec->spar_md_cfg.num_dmx_chans_per_band[bands_bw * i]; + ndec = hMdDec->spar_md_cfg.num_decorr_per_band[bands_bw * i]; + if ( ( ivas_total_brate < IVAS_24k4 ) && ( strat > 3 ) && ( ( ( i % 2 == 1 ) && ( strat % 2 == 0 ) ) || ( ( i % 2 == 0 ) && ( strat % 2 == 1 ) ) ) ) + { + pred_cell_dims[i].dim1 = 0; + pred_cell_dims[i].dim2 = 0; + drct_cell_dims[i].dim1 = 0; + drct_cell_dims[i].dim2 = 0; + decd_cell_dims[i].dim1 = 0; + decd_cell_dims[i].dim2 = 0; + decx_cell_dims[i].dim1 = 0; + decx_cell_dims[i].dim2 = 0; + } + else + { + pred_cell_dims[i].dim1 = ndm + ndec - 1; + if ( hMdDec->spar_hoa_md_flag && hMdDec->spar_hoa_dirac2spar_md_flag ) + { + if ( i >= SPAR_DIRAC_SPLIT_START_BAND ) + { + pred_cell_dims[i].dim1 -= ( FOA_CHANNELS - 1 ); + } + } + pred_cell_dims[i].dim2 = 1; + drct_cell_dims[i].dim1 = ndec; + drct_cell_dims[i].dim2 = ndm - 1; + decd_cell_dims[i].dim1 = ndec; + decd_cell_dims[i].dim2 = 1; + decx_cell_dims[i].dim1 = ( ndec * ( ndec - 1 ) ) >> 1; + decx_cell_dims[i].dim2 = 1; + } + } + + any_diff = 0; + for ( i = 0; i < nB; i++ ) + { + if ( pDo_diff[i] != 0 ) + { + any_diff = 1; + break; + } + } + + if ( any_diff == 1 ) + { + if ( hMdDec->spar_hoa_md_flag && hMdDec->spar_hoa_dirac2spar_md_flag ) + { + for ( i = 0; i < nB; i++ ) + { + if ( i >= SPAR_DIRAC_SPLIT_START_BAND ) + { + for ( j = 0; j < pred_cell_dims[i].dim1; j++ ) + { + hMdDec->spar_md_prev.band_coeffs_idx_mapped[i].pred_index_re[j] = + hMdDec->spar_md_prev.band_coeffs_idx_mapped[i].pred_index_re[j + ( FOA_CHANNELS - 1 )]; + } + } + } + } + + ivas_copy_band_coeffs_idx_to_arr( hMdDec->spar_md_prev.band_coeffs_idx_mapped, nB, symbol_arr_old_re, pred_cell_dims, PRED_COEFF ); + } + + ivas_arith_decode_cmplx_cell_array( &hMdDec->arith_coeffs.pred_arith_re[qsi], &hMdDec->arith_coeffs.pred_arith_re_diff[qsi], + st0, pred_cell_dims, pDo_diff, nB, symbol_arr_re, symbol_arr_old_re ); + + ivas_fill_band_coeffs_idx( hMdDec->spar_md.band_coeffs_idx, nB, symbol_arr_re, pred_cell_dims, PRED_COEFF ); + + if ( hMdDec->spar_hoa_md_flag && hMdDec->spar_hoa_dirac2spar_md_flag ) + { + for ( i = 0; i < nB; i++ ) + { + if ( i >= SPAR_DIRAC_SPLIT_START_BAND ) + { + for ( j = pred_cell_dims[i].dim1 - 1; j >= 0; j-- ) + { + hMdDec->spar_md.band_coeffs_idx[i].pred_index_re[j + ( FOA_CHANNELS - 1 )] = + hMdDec->spar_md.band_coeffs_idx[i].pred_index_re[j]; + } + for ( j = 0; j < FOA_CHANNELS - 1; j++ ) + { + hMdDec->spar_md.band_coeffs_idx[i].pred_index_re[j] = 0; + } + } + } + } + + if ( any_diff == 1 ) + { + ivas_copy_band_coeffs_idx_to_arr( hMdDec->spar_md_prev.band_coeffs_idx_mapped, nB, symbol_arr_old_re, drct_cell_dims, DRCT_COEFF ); + } + + ivas_arith_decode_cmplx_cell_array( &hMdDec->arith_coeffs.drct_arith_re[qsi], &hMdDec->arith_coeffs.drct_arith_re_diff[qsi], + st0, drct_cell_dims, pDo_diff, nB, symbol_arr_re, symbol_arr_old_re ); + + ivas_fill_band_coeffs_idx( hMdDec->spar_md.band_coeffs_idx, nB, symbol_arr_re, drct_cell_dims, DRCT_COEFF ); + + if ( any_diff == 1 ) + { + ivas_copy_band_coeffs_idx_to_arr( hMdDec->spar_md_prev.band_coeffs_idx_mapped, nB, symbol_arr_old_re, decd_cell_dims, DECD_COEFF ); + } + + ivas_arith_decode_cmplx_cell_array( &hMdDec->arith_coeffs.decd_arith_re[qsi], &hMdDec->arith_coeffs.decd_arith_re_diff[qsi], + st0, decd_cell_dims, pDo_diff, nB, symbol_arr_re, symbol_arr_old_re ); + + ivas_fill_band_coeffs_idx( hMdDec->spar_md.band_coeffs_idx, nB, symbol_arr_re, decd_cell_dims, DECD_COEFF ); + + if ( any_diff == 1 ) + { + ivas_copy_band_coeffs_idx_to_arr( hMdDec->spar_md_prev.band_coeffs_idx_mapped, nB, symbol_arr_old_re, decx_cell_dims, DECX_COEFF ); + } + + ivas_fill_band_coeffs_idx( hMdDec->spar_md.band_coeffs_idx, nB, symbol_arr_re, decx_cell_dims, DECX_COEFF ); + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_fill_band_coeffs_idx() + * + * Copy pred band coeffs to arr + *-----------------------------------------------------------------------------------------*/ + +static void ivas_fill_band_coeffs_idx( + ivas_band_coeffs_ind_t *pBands_idx, + const int16_t nB, + int16_t *pSymbol_re, + ivas_cell_dim_t *pCell_dims, + const ivas_coeffs_type_t coeff_type ) +{ + int16_t i, len; + int16_t *pPtr_idx = NULL; + + for ( i = 0; i < nB; i++ ) + { + switch ( coeff_type ) + { + case PRED_COEFF: + { + pPtr_idx = pBands_idx[i].pred_index_re; + break; + } + case DRCT_COEFF: + { + pPtr_idx = pBands_idx[i].drct_index_re; + break; + } + case DECD_COEFF: + { + pPtr_idx = pBands_idx[i].decd_index_re; + break; + } + case DECX_COEFF: + { + break; + } + + default: + assert( !"unsupported config!" ); + } + + if ( coeff_type != DECX_COEFF ) + { + len = pCell_dims[i].dim1 * pCell_dims[i].dim2; + mvs2s( pSymbol_re, pPtr_idx, len ); + pSymbol_re += len; + } + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_decode_huffman_bs() + * + * Decode bitstream with huffman decoder + *-----------------------------------------------------------------------------------------*/ + +static void ivas_decode_huffman_bs( + ivas_spar_md_dec_state_t *hMdDec, + Decoder_State *st0, /* i/o: decoder state structure - for bitstream handling*/ + const uint16_t qsi, + const int16_t nB, + const int16_t bands_bw ) +{ + int16_t i, j; + int16_t ndm, ndec; + int16_t pred_dim, drct_dim, decd_dim, pred_offset; + + for ( i = 0; i < nB; i++ ) + { + ndm = hMdDec->spar_md_cfg.num_dmx_chans_per_band[bands_bw * i]; + ndec = hMdDec->spar_md_cfg.num_decorr_per_band[bands_bw * i]; + + pred_dim = ndec + ndm - 1; + drct_dim = ndec * ( ndm - 1 ); + decd_dim = ndec; + pred_offset = 0; + + if ( hMdDec->spar_hoa_md_flag && hMdDec->spar_hoa_dirac2spar_md_flag ) + { + if ( i >= SPAR_DIRAC_SPLIT_START_BAND ) + { + pred_offset = FOA_CHANNELS - 1; + } + } + + for ( j = pred_offset; j < pred_dim; j++ ) + { + ivas_huffman_decode( &hMdDec->huff_coeffs.pred_huff_re[qsi], st0, &hMdDec->spar_md.band_coeffs_idx[i].pred_index_re[j] ); + } + + if ( hMdDec->spar_hoa_md_flag && hMdDec->spar_hoa_dirac2spar_md_flag ) + { + if ( i >= SPAR_DIRAC_SPLIT_START_BAND ) + { + for ( j = 0; j < pred_offset; j++ ) + { + hMdDec->spar_md.band_coeffs_idx[i].pred_index_re[j] = 0; + } + } + } + + for ( j = 0; j < drct_dim; j++ ) + { + ivas_huffman_decode( &hMdDec->huff_coeffs.drct_huff_re[qsi], st0, &hMdDec->spar_md.band_coeffs_idx[i].drct_index_re[j] ); + } + + for ( j = 0; j < decd_dim; j++ ) + { + ivas_huffman_decode( &hMdDec->huff_coeffs.decd_huff_re[qsi], st0, &hMdDec->spar_md.band_coeffs_idx[i].decd_index_re[j] ); + } + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_spar_md_fill_invalid_bands() + * + * Fill invalid bands in interpolation/extrapolation of valid bands + * when PLC is to be done with partial time differential coding + *-----------------------------------------------------------------------------------------*/ + +static void ivas_spar_md_fill_invalid_bands( + ivas_spar_dec_matrices_t *pSpar_coeffs, + ivas_spar_dec_matrices_t *pSpar_coeffs_prev, + const int16_t *valid_bands, + int16_t *base_band_age, + const int16_t num_bands, + const int16_t num_channels, + const int16_t num_md_sub_frames ) +{ + int16_t i, j, b, all_valid; + int16_t valid_band_idx[IVAS_MAX_NUM_BANDS], idx = -1; + int16_t last_valid_band_idx[IVAS_MAX_NUM_BANDS]; + float w = 0; + set_s( valid_band_idx, 0, IVAS_MAX_NUM_BANDS ); + set_s( last_valid_band_idx, 0, IVAS_MAX_NUM_BANDS ); + + all_valid = 1; + for ( b = 0; b < num_bands; b++ ) + { + if ( valid_bands[b] != 0 ) + { + base_band_age[b] = 0; /* reset band age */ + idx++; + valid_band_idx[idx] = b; + } + else + { + base_band_age[b] += 1; /* increment the age of invalid bands */ + + if ( base_band_age[b] > 3 ) + { + last_valid_band_idx[b] = idx; + } + all_valid = 0; + } + } + + assert( idx > 0 ); /* some bands should be valid */ + + if ( all_valid == 0 ) + { + for ( b = 0; b < num_bands; b++ ) + { + /* check against non zero in if and else if */ + if ( base_band_age[b] > 3 ) /* old invalid bands */ + { + int16_t tmp_id, id0, id1; + + tmp_id = last_valid_band_idx[b]; + if ( tmp_id < 0 ) /* Extrapolation */ + { + id1 = valid_band_idx[0]; + id0 = 0; + w = 1; + } + else if ( tmp_id == idx ) /* Extrapolation */ + { + id1 = valid_band_idx[tmp_id]; + id0 = valid_band_idx[tmp_id]; + w = 0; + } + else /* Interpolation */ + { + id0 = valid_band_idx[tmp_id]; + id1 = valid_band_idx[tmp_id + 1]; + w = ( (float) ( b - id0 ) ) / ( id1 - id0 ); + } + + for ( i = 0; i < num_channels; i++ ) + { + for ( j = 0; j < num_channels; j++ ) + { + pSpar_coeffs->C_re[i][j][b] = ( 1 - w ) * pSpar_coeffs->C_re[i][j][id0] + w * pSpar_coeffs->C_re[i][j][id1]; + pSpar_coeffs->P_re[i][j][b] = ( 1 - w ) * pSpar_coeffs->P_re[i][j][id0] + w * pSpar_coeffs->P_re[i][j][id1]; + } + } + } + else /* young invalid bands */ + { + if ( valid_bands[b] == 0 ) + { + for ( i = 0; i < num_channels; i++ ) + { + for ( j = 0; j < num_channels; j++ ) + { + pSpar_coeffs->C_re[i][j][b] = pSpar_coeffs_prev->C_re[i][j][b]; + pSpar_coeffs->P_re[i][j][b] = pSpar_coeffs_prev->P_re[i][j][b]; + } + } + } + } + + if ( valid_bands[b] == 0 ) + { + int16_t i_ts; + for ( i = 0; i < num_channels; i++ ) + { + for ( j = 0; j < num_channels; j++ ) + { + for ( i_ts = 1; i_ts < num_md_sub_frames; i_ts++ ) + { + pSpar_coeffs->C_re[i][j][b + i_ts * IVAS_MAX_NUM_BANDS] = pSpar_coeffs->C_re[i][j][b]; + pSpar_coeffs->P_re[i][j][b + i_ts * IVAS_MAX_NUM_BANDS] = pSpar_coeffs->P_re[i][j][b]; + } + } + } + } + } + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_spar_dec_compute_ramp_down_post_matrix() + * + * + *-----------------------------------------------------------------------------------------*/ + +static void ivas_spar_dec_compute_ramp_down_post_matrix( + ivas_spar_md_dec_state_t *hMdDec, + const int16_t num_bands_out, + const int16_t bfi, + const int16_t num_md_sub_frames ) +{ + int16_t num_in_ch, num_out_ch, i, j, b; + + num_in_ch = hMdDec->spar_md_cfg.num_umx_chs; + num_out_ch = hMdDec->spar_md_cfg.num_umx_chs; + + if ( bfi == 0 ) + { + hMdDec->spar_plc_num_lost_frames = 0; + } + else + { + if ( hMdDec->td_decorr_flag == 0 ) + { + assert( 0 ); + } + + hMdDec->spar_plc_num_lost_frames += 1; + hMdDec->spar_plc_num_lost_frames = min( hMdDec->spar_plc_num_lost_frames, 100 ); + + if ( hMdDec->spar_plc_num_lost_frames > ivas_spar_dec_plc_num_frames_keep ) + { + int16_t num_fade_frames; + int16_t gain_dB; + float gain; + float post_matrix[IVAS_SPAR_MAX_CH]; + + num_fade_frames = max( hMdDec->spar_plc_num_lost_frames - ivas_spar_dec_plc_num_frames_keep, 0 ); + gain_dB = -min( num_fade_frames, ivas_spar_dec_plc_max_num_frames_ramp_down ) * ivas_spar_dec_plc_per_frame_ramp_down_gain_dB; + gain = powf( 10, ( ( (float) gain_dB ) / 20 ) ); + + for ( i = 0; i < IVAS_SPAR_MAX_CH; i++ ) + { + post_matrix[i] = 1 + min( ( (float) num_fade_frames ) / ivas_spar_dec_plc_num_frames_fade_out, 1 ) * ( ivas_spar_dec_plc_spatial_target[i] - 1 ); + post_matrix[i] *= gain; + } + + /* apply the post matrix */ + for ( int16_t i_ts = 0; i_ts < num_md_sub_frames; i_ts++ ) + { + for ( i = 0; i < num_out_ch; i++ ) + { + for ( j = 0; j < num_in_ch; j++ ) + { + for ( b = 0; b < num_bands_out; b++ ) + { + hMdDec->mixer_mat[i][j][b + i_ts * IVAS_MAX_NUM_BANDS] *= post_matrix[i]; + } + } + } + } + } + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_spar_unquant_dtx_indicies() + * + * Unquantize SPAR MD DYX indices + *-----------------------------------------------------------------------------------------*/ + +static void ivas_spar_unquant_dtx_indicies( + ivas_spar_md_t *pSpar_md, + const int16_t nB, + const int16_t bw, + int16_t *ndm_per_band ) +{ + int16_t i, b; + int16_t q_lvl; + float val; + int16_t idx; + float pr_min_max[2]; + + pr_min_max[0] = pSpar_md->min_max[0]; + pr_min_max[1] = pSpar_md->min_max[1]; + + for ( b = 0; b < nB; b++ ) + { + for ( i = 0; i < FOA_CHANNELS - 1; i++ ) + { + q_lvl = dtx_pr_real_q_levels[ndm_per_band[bw * b] - 1][i]; + idx = pSpar_md->band_coeffs_idx[b].pred_index_re[i]; + ivas_deindex_real_index( &idx, q_lvl, pr_min_max[0], pr_min_max[1], &val, 1 ); + pSpar_md->band_coeffs[b].pred_re[i] = val; + } + + for ( i = 0; i < FOA_CHANNELS - ndm_per_band[bw * b]; i++ ) + { + q_lvl = dtx_pd_real_q_levels[ndm_per_band[bw * b] - 1][i]; + idx = pSpar_md->band_coeffs_idx[b].decd_index_re[i]; + ivas_deindex_real_index( &idx, q_lvl, dtx_pd_real_min_max[0], dtx_pd_real_min_max[1], &val, 1 ); + pSpar_md->band_coeffs[b].P_re[i] = val; + } + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_parse_parameter_bitstream_dtx() + * + * parse DTX bitstream parameters + *-----------------------------------------------------------------------------------------*/ + +static void ivas_parse_parameter_bitstream_dtx( + ivas_spar_md_t *pSpar_md, + Decoder_State *st0, /* i/o: decoder state structure - for bitstream handling*/ + const int16_t bw, + const int16_t num_bands, + int16_t *num_dmx_per_band, + int16_t *num_dec_per_band ) +{ + int16_t i, j, ndec, ndm; + float val; + int16_t idx; + float pr_min_max[2]; + int16_t pr_q_lvls, pr, pd, pd_q_lvls, pr_pd_bits; + int16_t zero_pad_bits, sid_bits_len; + + sid_bits_len = st0->next_bit_pos; + pr_min_max[0] = pSpar_md->min_max[0]; + pr_min_max[1] = pSpar_md->min_max[1]; + + for ( i = 0; i < num_bands; i++ ) + { + ndec = num_dec_per_band[bw * i]; + ndm = num_dmx_per_band[bw * i]; + + for ( j = 0; j < FOA_CHANNELS - 1; j++ ) + { + int16_t pr_idx_1, pr_idx_2, pd_idx_1, pd_idx_2; + uint16_t value; + + pr_idx_1 = pr_pr_idx_pairs[ndm - 1][j][0]; + pr_idx_2 = pr_pr_idx_pairs[ndm - 1][j][1]; + pd_idx_1 = pr_pd_idx_pairs[ndm - 1][j][0]; + pd_idx_2 = pr_pd_idx_pairs[ndm - 1][j][1]; + + if ( pr_idx_1 != 0 || pd_idx_1 != 0 || pr_idx_2 != 0 || pd_idx_2 != 0 ) + { + pr_q_lvls = dtx_pr_real_q_levels[ndm - 1][pd_idx_1 - 1]; + + if ( ( j + 1 ) > ndec ) + { + pd_q_lvls = 1; + } + else + { + pd_q_lvls = dtx_pd_real_q_levels[ndm - 1][pd_idx_2 - 1]; + } + + pr_pd_bits = ivas_get_bits_to_encode( pd_q_lvls * pr_q_lvls ); + + value = get_next_indice( st0, pr_pd_bits ); + + pr = (int16_t) floor( value / pd_q_lvls ); + pd = value - pr * pd_q_lvls; + val = dtx_pd_real_min_max[0]; + ivas_quantise_real_values( &val, pd_q_lvls, dtx_pd_real_min_max[0], dtx_pd_real_min_max[1], &idx, &val, 1 ); + pd = pd + idx; + + val = pr_min_max[0]; + ivas_quantise_real_values( &val, pr_q_lvls, pr_min_max[0], pr_min_max[1], &idx, &val, 1 ); + pr = pr + idx; + + if ( ( j + 1 ) <= ndec ) + { + pSpar_md->band_coeffs_idx[i].decd_index_re[pd_idx_2 - 1] = pd; + } + + pSpar_md->band_coeffs_idx[i].pred_index_re[pd_idx_1 - 1] = pr; + } + } + } + + sid_bits_len = st0->next_bit_pos - sid_bits_len; + zero_pad_bits = ( SPAR_DTX_BANDS * SPAR_SID_BITS_TAR_PER_BAND ) - sid_bits_len; + assert( zero_pad_bits >= 0 ); + if ( num_dmx_per_band[0] == 2 ) + { + zero_pad_bits -= 1; + } + + for ( j = 0; j < zero_pad_bits; j++ ) + { + get_next_indice( st0, 1 ); + } + + ivas_spar_unquant_dtx_indicies( pSpar_md, num_bands, bw, num_dmx_per_band ); + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_deindex_real_index() + * + * Deindex real index + *-----------------------------------------------------------------------------------------*/ + +static ivas_error ivas_deindex_real_index( + const int16_t *index, + const int16_t q_levels, + const float min_value, + const float max_value, + float *quant, + const int16_t dim ) +{ + int16_t i; + float q_step; + + if ( q_levels == 0 ) + { + return IVAS_ERR_INTERNAL; + } + + if ( q_levels == 1 ) + { + for ( i = 0; i < dim; i++ ) + { + quant[i] = 0; + } + } + else + { + q_step = ( max_value - min_value ) / ( q_levels - 1 ); + for ( i = 0; i < dim; i++ ) + { + quant[i] = index[i] * q_step; + } + } + + return IVAS_ERR_OK; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_spar_to_dirac() + * + * + *-----------------------------------------------------------------------------------------*/ + +void ivas_spar_to_dirac( + Decoder_Struct *st_ivas, + ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ + const int16_t dtx_vad, /* i : DTX frame flag */ + const int16_t num_bands_out, /* i : number of output bands */ + const int16_t bw, /* i : band joining factor */ + const int16_t dyn_active_w_flag ) +{ + DIRAC_DEC_HANDLE hDirAC; + int16_t start_band, end_band, band, qmf_band_start, qmf_band_end; + int16_t block, b; + int16_t *band_grouping; + float diffuseness[IVAS_MAX_NUM_BANDS]; + int16_t sba_order_internal; + float azi_dirac[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES]; + float ele_dirac[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES]; + int16_t azi[IVAS_MAX_NUM_BANDS]; + int16_t ele[IVAS_MAX_NUM_BANDS]; + float dvx[IVAS_MAX_NUM_BANDS], dvy[IVAS_MAX_NUM_BANDS], dvz[IVAS_MAX_NUM_BANDS]; + float radius; + float en_ratio, res_pow; + int16_t num_slots_in_subfr; + int16_t tmp_write_idx_param_band; + int16_t tmp_write_idx_band; + float pred_re_20ms[IVAS_MAX_NUM_BANDS][IVAS_SPAR_MAX_CH - 1]; + int16_t pred_idx; + int16_t *dirac_to_spar_md_bands; + int16_t enc_param_start_band; + int16_t active_w_vlbr; + int16_t i, num_subframes; + int16_t active_w; + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom; + + active_w = ( dyn_active_w_flag == 1 ) || ( hMdDec->spar_md_cfg.active_w == 1 ); + sba_order_internal = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ); + start_band = 0; + end_band = min( num_bands_out, SPAR_DIRAC_SPLIT_START_BAND ) / bw; + + hDirAC = st_ivas->hDirAC; + hSpatParamRendCom = st_ivas->hSpatParamRendCom; + + dirac_to_spar_md_bands = st_ivas->hSpar->dirac_to_spar_md_bands; + enc_param_start_band = st_ivas->hSpar->enc_param_start_band / bw; + active_w_vlbr = ( st_ivas->hDecoderConfig->ivas_total_brate < IVAS_24k4 ) ? 1 : 0; + + if ( hDirAC != NULL && ivas_get_hodirac_flag( st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->sba_analysis_order ) == 0 ) + { + band_grouping = hDirAC->band_grouping; + num_slots_in_subfr = st_ivas->hDirAC->hConfig->dec_param_estim ? CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES : 1; + + for ( band = start_band; band < end_band; band++ ) + { + float PR[3], Pd[3], dvnorm, g_pred; + + PR[0] = hMdDec->spar_md.band_coeffs[band].pred_re[2]; + PR[1] = hMdDec->spar_md.band_coeffs[band].pred_re[0]; + PR[2] = hMdDec->spar_md.band_coeffs[band].pred_re[1]; + g_pred = PR[0] * PR[0] + PR[1] * PR[1] + PR[2] * PR[2]; + if ( g_pred <= EPSILON ) + { + dvx[band] = 1.0f; + dvy[band] = 0.0f; + dvz[band] = 0.0f; + } + else + { + g_pred = sqrtf( g_pred ); + dvnorm = 1.0f / g_pred; + dvx[band] = PR[0] * dvnorm; + dvy[band] = PR[1] * dvnorm; + dvz[band] = PR[2] * dvnorm; + } + + radius = sqrtf( dvx[band] * dvx[band] + dvy[band] * dvy[band] ); + azi[band] = (int16_t) ( max( -180.0f, min( 180.0f, atan2f( dvy[band], dvx[band] ) / EVS_PI * 180.0f ) ) + 0.5f ); + ele[band] = (int16_t) ( max( -90.0f, min( 180.0f, atan2f( dvz[band], radius ) / EVS_PI * 180.0f ) ) + 0.5f ); + + if ( st_ivas->nchan_transport == 1 ) + { + float w_en_norm, f_scale; + if ( active_w ) + { + if ( dtx_vad == 0 ) + { + f_scale = IVAS_ACTIVEW_DM_F_SCALE_DTX; + } + else + { + f_scale = ( active_w_vlbr ) ? IVAS_ACTIVEW_DM_F_SCALE_VLBR : IVAS_ACTIVEW_DM_F_SCALE; + } + } + else + { + f_scale = 0.0f; + } + + w_en_norm = ( 1.0f - ( f_scale * g_pred * g_pred ) ); + w_en_norm *= w_en_norm; + + Pd[0] = hMdDec->spar_md.band_coeffs[band].P_re[1]; + Pd[1] = hMdDec->spar_md.band_coeffs[band].P_re[0]; + Pd[2] = hMdDec->spar_md.band_coeffs[band].P_re[2]; + en_ratio = PR[0] * PR[0] + PR[1] * PR[1] + PR[2] * PR[2]; + res_pow = w_en_norm + en_ratio + ( Pd[0] * Pd[0] + Pd[1] * Pd[1] + Pd[2] * Pd[2] ); + res_pow *= 0.5f; + hMdDec->spar_md.en_ratio_slow[band] = 0.75f * hMdDec->spar_md.en_ratio_slow[band] + 0.25f * en_ratio; + hMdDec->spar_md.ref_pow_slow[band] = 0.75f * hMdDec->spar_md.ref_pow_slow[band] + 0.25f * res_pow; + en_ratio = sqrtf( hMdDec->spar_md.en_ratio_slow[band] ) / ( hMdDec->spar_md.ref_pow_slow[band] + EPSILON ); + } + else + { + en_ratio = PR[0] * PR[0] + PR[1] * PR[1] + PR[2] * PR[2]; + hMdDec->spar_md.en_ratio_slow[band] = 0.75f * hMdDec->spar_md.en_ratio_slow[band] + 0.25f * en_ratio; + en_ratio = sqrtf( hMdDec->spar_md.en_ratio_slow[band] ); + } + diffuseness[band] = 1.0f - en_ratio; /*compute diffuseness*/ + diffuseness[band] = ( ( diffuseness[band] < 1.0f ) ? ( ( diffuseness[band] < 0.0f ) ? 0.f : diffuseness[band] ) : 1.0f ); + } + + for ( band = start_band; band < end_band; band++ ) + { + int16_t azi_dith, ele_dith; + tmp_write_idx_param_band = hDirAC->spar_to_dirac_write_idx; + + en_ratio = 1.0f - diffuseness[band]; + masa_sq( 1.0f - en_ratio, diffuseness_thresholds, DIRAC_DIFFUSE_LEVELS ); + + qmf_band_start = band_grouping[band]; + qmf_band_end = band_grouping[band + 1]; + + for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ ) + { + int16_t ts_start, ts_end, ts; + + ts_start = DirAC_block_grouping[block]; + ts_end = DirAC_block_grouping[block + 1]; + for ( b = qmf_band_start; b < qmf_band_end; b++ ) + { + + azi_dith = azi[band]; + ele_dith = ele[band]; + + hSpatParamRendCom->energy_ratio1[block][b] = en_ratio; + tmp_write_idx_band = tmp_write_idx_param_band; + + if ( hDirAC->hConfig->dec_param_estim == FALSE ) + { + hSpatParamRendCom->elevation[tmp_write_idx_band][b] = ele_dith; + hSpatParamRendCom->azimuth[tmp_write_idx_band][b] = azi_dith; + hSpatParamRendCom->diffuseness_vector[tmp_write_idx_band][b] = diffuseness[band]; + } + else + { + for ( ts = ts_start; ts < ts_end; ts++ ) + { + hSpatParamRendCom->elevation[tmp_write_idx_band][b] = ele_dith; + hSpatParamRendCom->azimuth[tmp_write_idx_band][b] = azi_dith; + hSpatParamRendCom->diffuseness_vector[tmp_write_idx_band][b] = diffuseness[band]; + tmp_write_idx_band = ( tmp_write_idx_band + 1 ) % hSpatParamRendCom->dirac_md_buffer_length; + } + } + } + tmp_write_idx_param_band = ( tmp_write_idx_param_band + num_slots_in_subfr ) % hSpatParamRendCom->dirac_md_buffer_length; + } + } + + /* update buffer write index */ + if ( hDirAC->hConfig->dec_param_estim == FALSE ) + { + hDirAC->spar_to_dirac_write_idx = ( hDirAC->spar_to_dirac_write_idx + MAX_PARAM_SPATIAL_SUBFRAMES ) % hSpatParamRendCom->dirac_md_buffer_length; + } + else + { + hDirAC->spar_to_dirac_write_idx = ( hDirAC->spar_to_dirac_write_idx + CLDFB_NO_COL_MAX ) % hSpatParamRendCom->dirac_md_buffer_length; + } + } + else + { + band = end_band; + } + + /*read DirAC metadata, convert DirAC to SPAR*/ + for ( ; band < num_bands_out / bw; band++ ) + { + int16_t dirac_band_idx; + + dirac_band_idx = dirac_to_spar_md_bands[band] - enc_param_start_band; + + num_subframes = MAX_PARAM_SPATIAL_SUBFRAMES; + if ( st_ivas->hQMetaData->useLowerRes ) + { + num_subframes = 1; + } + + for ( block = 0; block < num_subframes; block++ ) + { + if ( st_ivas->hQMetaData->q_direction->band_data[dirac_band_idx].azimuth[block] < 0.f ) + { + st_ivas->hQMetaData->q_direction->band_data[dirac_band_idx].azimuth[block] += 360.f; + } + azi_dirac[band][block] = st_ivas->hQMetaData->q_direction->band_data[dirac_band_idx].azimuth[block]; + ele_dirac[band][block] = st_ivas->hQMetaData->q_direction->band_data[dirac_band_idx].elevation[block]; + } + + diffuseness[band] = 1.0f - st_ivas->hQMetaData->q_direction->band_data[dirac_band_idx].energy_ratio[0]; + } + + /* DirAC MD averaged over 4 subframes and converted to SPAR format similar to encoder processing */ + if ( hMdDec->spar_md_cfg.nchan_transport > 1 ) + { + ivas_get_spar_md_from_dirac( azi_dirac, ele_dirac, diffuseness, 1, NULL, &hMdDec->spar_md, &hMdDec->spar_md_cfg, end_band, num_bands_out, ( hMdDec->spar_hoa_md_flag ) ? 1 : sba_order_internal, dtx_vad, NULL, st_ivas->hQMetaData->useLowerRes, active_w_vlbr, dyn_active_w_flag ); + + /* temporarily copy frame-wise prediction coefficients in DirAC bands*/ + for ( pred_idx = 0; pred_idx < FOA_CHANNELS - 1; pred_idx++ ) + { + for ( band = SPAR_DIRAC_SPLIT_START_BAND; band < IVAS_MAX_NUM_BANDS; band++ ) + { + pred_re_20ms[band][pred_idx] = hMdDec->spar_md.band_coeffs[band].pred_re[pred_idx]; + } + } + } + + int16_t num_md_sub_frames; + num_md_sub_frames = ivas_get_spar_dec_md_num_subframes( sba_order_internal, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->last_active_ivas_total_brate ); + ivas_get_spar_md_from_dirac( azi_dirac, ele_dirac, diffuseness, num_md_sub_frames, NULL, &hMdDec->spar_md, &hMdDec->spar_md_cfg, end_band, num_bands_out / bw, ( hMdDec->spar_hoa_md_flag ) ? 1 : sba_order_internal, dtx_vad, NULL, st_ivas->hQMetaData->useLowerRes, active_w_vlbr, dyn_active_w_flag ); + + if ( st_ivas->hQMetaData->useLowerRes && dtx_vad ) + { + for ( band = SPAR_DIRAC_SPLIT_START_BAND; band < IVAS_MAX_NUM_BANDS; band++ ) + { + for ( block = 1; block < num_md_sub_frames; block++ ) + { + for ( i = 0; i < FOA_CHANNELS - 1; i++ ) /* pred coefficient index (index 0, 1, 2 predicts Y, Z, X respectively) */ + { + hMdDec->spar_md.band_coeffs[band + block * IVAS_MAX_NUM_BANDS].pred_re[i] = hMdDec->spar_md.band_coeffs[band].pred_re[i]; + } + for ( i = 0; i < FOA_CHANNELS - 1; i++ ) /* pred coefficient index (index 0, 1, 2 predicts Y, Z, X respectively) */ + { + hMdDec->spar_md.band_coeffs[band + block * IVAS_MAX_NUM_BANDS].P_re[i] = hMdDec->spar_md.band_coeffs[band].P_re[i]; + } + } + } + } + + /* expand DirAC TC 20ms MD for residual channels to all subframes*/ + for ( block = 0; block < num_md_sub_frames; block++ ) + { + for ( band = SPAR_DIRAC_SPLIT_START_BAND; band < IVAS_MAX_NUM_BANDS; band++ ) + { + for ( pred_idx = 0; pred_idx < FOA_CHANNELS - 1; pred_idx++ ) /* pred coefficient index (index 0, 1, 2 predicts Y, Z, X respectively) */ + { + if ( ivas_is_res_channel( pred_idx + 1, hMdDec->spar_md_cfg.nchan_transport ) ) + { + /* use 20ms coefficients only for residual channels */ + hMdDec->spar_md.band_coeffs[band + block * IVAS_MAX_NUM_BANDS].pred_re[pred_idx] = pred_re_20ms[band][pred_idx]; + } + } + } + } + + for ( b = end_band * bw; b < num_bands_out; b++ ) + { + hMdDec->valid_bands[b] = 1; + } + + return; +} diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h new file mode 100644 index 0000000000000000000000000000000000000000..b4eef45cc571d793fa8190fb0399dfbd642401f6 --- /dev/null +++ b/lib_dec/ivas_stat_dec.h @@ -0,0 +1,1090 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#ifndef IVAS_STAT_DEC_H +#define IVAS_STAT_DEC_H + +#include +#include "options.h" +#include "cnst.h" +#include "ivas_cnst.h" +#include "stat_dec.h" +#include "ivas_stat_com.h" +#include "ivas_stat_rend.h" + + +/*----------------------------------------------------------------------------------* + * DFT Stereo decoder structure + *----------------------------------------------------------------------------------*/ + +/* State of the range decoder */ +typedef struct +{ + uint32_t rc_low; + uint32_t rc_range; + + uint16_t *bit_buffer; + int16_t bit_count; + int16_t max_allowable_bit_count; + + int16_t bit_error_detected; + +} RangeUniDecState; + +/* basic allpass structure */ +typedef struct +{ + float gains[3]; + int16_t delays[3]; + float buffer[3][STEREO_DFT_ALLPASS_BUFFERLEN]; + int16_t pos; + +} basic_allpass_t; + + +typedef struct stereo_dft_dec_data_struct +{ + STEREO_DFT_CONFIG_DATA_HANDLE hConfig; + + /*Sizes*/ + int16_t N; /* Size of DFT hop size */ + int16_t NFFT; /* Size of DFT */ + + /*FFT*/ + const float *dft_trigo; + const float *dft_trigo_12k8; + const float *dft_trigo_16k; + const float *dft_trigo_8k; + int16_t dft_trigo_step; + + int16_t dft32ms_ovl; /* Overlap size */ + const float *win32ms; /* DFT window */ + const float *win32ms_12k8; /* DFT window */ + const float *win32ms_16k; /* DFT window */ + const float *win32ms_8k; /* DFT window */ + + int16_t dft32ms_ovl2; /* Overlap2 size */ + const float *win232ms; /* DFT window */ + const float *win232ms_12k8; /* DFT window */ + const float *win232ms_16k; /* DFT window */ + const float *win232ms_8k; /* DFT window */ + + const float *win_8k; /* DFT window residual */ + + /*Bands*/ + int16_t band_res[STEREO_DFT_DEC_DFT_NB]; + int16_t band_limits[STEREO_DFT_BAND_MAX + 1]; + int16_t nbands; + + /*Configuration*/ + int16_t prm_res[STEREO_DFT_DEC_DFT_NB]; + + /*Stereo parameters*/ + float side_gain[STEREO_DFT_DEC_DFT_NB * STEREO_DFT_BAND_MAX]; + int16_t side_gain_flag_1; + int16_t side_gain_flag_2; + int16_t side_gain_index_previous[STEREO_DFT_BAND_MAX]; + int16_t side_gain_index[STEREO_DFT_BAND_MAX]; + + float gipd[STEREO_DFT_DEC_DFT_NB]; + int16_t no_ipd_flag; /* flag to indicate when no IPD gets used */ + + float itd[STEREO_DFT_DEC_DFT_NB]; + + float itd_xfade_step; + float itd_xfade_target; + int16_t itd_xfade_counter; + float itd_xfade_prev; + int32_t last_active_element_brate; + float ipd_xfade_target; + float ipd_xfade_step; + int16_t ipd_xfade_counter; + float ipd_xfade_prev; + + /*residual prediction*/ + int16_t res_pred_mode[STEREO_DFT_DEC_DFT_NB]; /* residual prediction mode: 0(off), 1(stereo filling only), 2(enhanced stereo filling) */ + float res_pred_gain[STEREO_DFT_DEC_DFT_NB * STEREO_DFT_BAND_MAX]; /* prediction gain for the residual HFs */ + int16_t res_pred_band_min; /* Band min for prediction of residual */ + float DFT_past_DMX[STEREO_DFT_PAST_MAX][STEREO_DFT32MS_N_32k]; /* Past DMX for residual prediction */ + int16_t past_DMX_pos; + int16_t res_pred_flag_0; + int16_t res_pred_flag_1; + int16_t res_pred_index_previous[STEREO_DFT_BAND_MAX]; + float past_res_pred_gain[STEREO_DFT_PAST_MAX][STEREO_DFT_BAND_MAX]; + float res_gains_ind[2][2 * STEREO_DFT_BAND_MAX]; + + int16_t reverb_flag; + int16_t nbands_respred; + + /*residual coding*/ + int16_t res_cod_mode[STEREO_DFT_DEC_DFT_NB]; /* mode from 0 (off) to 3 */ + int16_t res_cod_band_max; /* Band max for coding of residual */ + float res_global_gain; + int16_t res_cod_line_max; + float res_hb_nrg_mem; + float bpf_error_signal_last; + float bpf_error_ratio_mem; + float res_cod_mem[STEREO_DFT_OVL_8k]; + float buff_LBTCX_mem[NS2SA( 16000, STEREO_DFT32MS_OVL_NS )]; + + float stab_fac_smooth_res; /* low-pass filtered stability factor */ + BPF_DEC_HANDLE hBpf; + TCX_LTP_DEC_HANDLE hTcxLtpDec; + + int16_t trans; + int16_t attackPresent; + int16_t wasTransient; + + float lt_pred_gain; + float lt_pred_gain_variation; + float lt_var_mean_ratio; + float stefi_short_gain; + float stefi_long_gain; + + basic_allpass_t ap1, ap2, ap3; + float ap_delay_mem[NS2SA( 16000, DELAY_BWE_TOTAL_NS )]; + float ap_fade_mem[STEREO_DFT_ALLPASS_FADELEN_16k]; + int16_t ap_wasTransient; + float smooth_dmx_nrg[STEREO_DFT_BAND_MAX]; + float smooth_res_nrg[STEREO_DFT_BAND_MAX]; + int16_t core_hist[STEREO_DFT_CORE_HIST_MAX]; + float hb_stefi_sig[L_FRAME48k + NS2SA( 48000, STEREO_DFT_TD_STEFI_DELAY_NS )]; + int16_t hb_stefi_delay; + float hb_nrg[STEREO_DFT_CORE_HIST_MAX]; + float hb_nrg_subr[STEREO_DFT_NBDIV]; + float td_gain[STEREO_DFT_CORE_HIST_MAX]; + + /* stereo DTX */ + float g_state[STEREO_DFT_BAND_MAX]; + int16_t frame_sid_nodata; + int16_t frame_nodata; + int16_t frame_sid; + + float scale; + + /* PLC on residual signal */ + float res_mem[STEREO_DFT_RES_BW_MAX]; + int16_t time_offs; + float past_dmx_nrg; + float sg_mean; + int16_t sg_mem_corrupt; + int16_t recovery_flg; + + float smooth_buf[SBA_DIRAC_STEREO_NUM_BANDS][SBA_DIRAC_NRG_SMOOTH_LONG + 1]; + float smooth_fac[NB_DIV][SBA_DIRAC_STEREO_NUM_BANDS]; + + int16_t first_frame; + float mixer_mat_smooth[2][4][2 * IVAS_MAX_NUM_BANDS]; + float g_L_prev; + float g_R_prev; + const float *max_smooth_gains, *min_smooth_gains; + +} STEREO_DFT_DEC_DATA, *STEREO_DFT_DEC_DATA_HANDLE; + + +/* DFT Stereo mono output structure */ +typedef struct stereo_dft_dmx_out_data_structure +{ + float targetGain; /* TCA gain norm applied on target (or right) channel in current frame */ + float prevTargetGain; /* TCA gain norm applied on target (or right) channel in previous frame */ + + float memOutHB[NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS )]; + float memTransitionHB[NS2SA( 48000, STEREO_DFT32MS_OVL_NS )]; + +} STEREO_DFT_DMX_DATA, *STEREO_DFT_DMX_DATA_HANDLE; + + +/*----------------------------------------------------------------------------------* + * Stereo CNG handle + *----------------------------------------------------------------------------------*/ + +typedef struct stereo_dec_cng +{ + float coh[STEREO_DFT_BAND_MAX + 1]; /* coherence */ + float cm[STEREO_DFT_BAND_MAX]; /* cm */ + int16_t first_SID; /* first SID indicator */ + int16_t first_SID_after_TD; /* first SID after TD-stereo indicator */ + int16_t prev_sid_nodata; /* previous frame SID/FRAME_NO_DATA indicator */ + int16_t last_tdm_idx; /* last tdm index */ + float c_LR_LT; /* left right cross correlation */ + int16_t active_frame_counter; /* counter for active frames */ + int16_t xfade_frame_counter; /* xfade counter */ + int16_t xfade_length; /* number of frames to perform xfade */ + int16_t nr_dft_frames; /* dft frame counter */ + int16_t nr_corr_frames; /* correlation frame counter */ + int16_t nr_sid_frames; /* SID frame counter */ + int16_t last_act_element_mode; /* Element mode of last active frame */ + float olapBufferSynth22[FFTLEN]; /* overlap buffer for secondary channel CNA */ + int16_t flag_cna_fade; /* flag enabling CNA fade out */ + float maskingNoiseS[L_FRAME16k]; /* masking noise (CNA) for secondary channel */ + int16_t enableSecCNA; /* flag enabling secondary channel CNA */ + float c_PS_LT; /* long term cross-correlation between primary and secondary channel */ + const int16_t *frameSize; /* Frame size in samples */ + const int16_t *fftlen; /* FFT length used for the decomposition */ + +} STEREO_CNG_DEC, *STEREO_CNG_DEC_HANDLE; + + +/*----------------------------------------------------------------------------------* + * TD Stereo decoder structure + *----------------------------------------------------------------------------------*/ + +typedef struct stereo_td_dec_data_structure +{ + int16_t tdm_last_ratio_idx; /* last TDM ratio index */ + int16_t tdm_last_SM_flag; /* last channel combination scheme flag */ + int16_t tdm_prev_last_SM_flag; /* channel combination scheme flag before last frame */ + int16_t tdm_SM_flag; /* current channel combination scheme flag */ + int16_t tdm_use_IAWB_Ave_lpc; /* Flag to indicate the usage of mean inactive LP coefficients */ + + int16_t tdm_lp_reuse_flag; /* Flag that indicate if it is possible to reuse the LP coefficient from the primary channel or not */ + int16_t tdm_low_rate_mode; /* secondary channel low rate mode flag */ + float tdm_Pri_pitch_buf[NB_SUBFR]; + int16_t tdm_Pitch_reuse_flag; + int16_t tdm_LRTD_flag; + int16_t flag_skip_DMX; /* flag that indicates whether the TD downmixing is skipped */ + + float TCX_old_syn_Overl[L_FRAME16k / 2]; /* past ovrl buffer for possible switching from TD stereo ACELP to MDCT stereo TCX frame */ + + float prevSP_ratio; /* previous SP ratio */ + float SP_ratio_LT; /* longterm SP ratio */ + float c_LR_LT; /* left-right cross-correlation */ + +} STEREO_TD_DEC_DATA, *STEREO_TD_DEC_DATA_HANDLE; + + +/*----------------------------------------------------------------------------------* + * MDCT Stereo decoder structure + *----------------------------------------------------------------------------------*/ + +typedef struct stereo_mdct_dec_data_structure +{ + /* static members */ + STEREO_MDCT_BAND_PARAMETERS stbParamsTCX20; /* stereo frequency band parameters for TCX20 */ + STEREO_MDCT_BAND_PARAMETERS stbParamsTCX10; /* stereo frequency band parameters for TCX10 */ + STEREO_MDCT_BAND_PARAMETERS stbParamsTCX20afterACELP; /* stereo frequency band parameters for transition frame */ + + /* only intraframe */ + int16_t mdct_stereo_mode[2]; /* mdct stereo mode: LR, MS, band-wise MS */ + int16_t global_ild[2]; /* Quantized ILD for the whole spectrum */ + int16_t split_ratio; /* Ratio of bitrate (1 to 7), split_ratio = 8 * 1st chn bitrate / (1st + 2nd chn bitrate) */ + + int16_t IGFStereoMode[2]; /* MDCT stereo mode for IGF */ + + int16_t use_itd; + int16_t itd_mode; /*0/1*/ + float itd; + + int16_t reverse_dmx; + float smooth_ratio; + + int16_t prev_ms_mask[NB_DIV][MAX_SFB]; + float lastCoh; + int16_t noise_seeds_channels[CPE_CHANNELS]; + int16_t noise_seed_common; + int16_t isSBAStereoMode; + +} STEREO_MDCT_DEC_DATA, *STEREO_MDCT_DEC_DATA_HANDLE; + + +/*----------------------------------------------------------------------------------* + * ICA Stereo decoder structure + *----------------------------------------------------------------------------------*/ + +typedef struct stereo_tca_dec_data_structure +{ + int16_t refChanIndx; /* reference channel index in current frame */ + int16_t prevRefChanIndx; /* reference channel index in previous frame */ + int16_t indx_ica_NCShift; /* ICA target channel inter-channel corrstats */ + int16_t indx_ica_gD; /* ICA target gain */ + float targetGain; /* gain norm applied on target (or right) channel in current frame */ + float prevTargetGain; /* gain norm applied on target (or right) channel in previous frame */ + + int16_t corrLagStats; /* corr lag stats in current frame */ + int16_t prevCorrLagStats; /* corr lag stats in previous frame */ + + int16_t interp_dec_prevNCShift; /* NC Shift in previous frame */ + int16_t interp_dec_switch_to_zero_diff; /* switch flag for interpolation */ + + float memChanL[L_DEC_MEM_LEN_ICA]; /* left channel input to correct at the cross-over */ + float memChanR[L_DEC_MEM_LEN_ICA]; /* right channel input to correct at the cross-over */ + +} STEREO_TCA_DEC_DATA, *STEREO_TCA_DEC_HANDLE; + + +/*----------------------------------------------------------------------------------* + * Stereo IC-BWE decoder structure + *----------------------------------------------------------------------------------*/ + +typedef struct stereo_icbwe_dec_data_structure +{ + int16_t prev_refChanIndx_bwe; + int16_t refChanIndx_bwe; + int16_t prev_spIndx; + int16_t prev_gsIndx; + + /* SHB output memory */ + float memOutHB[CPE_CHANNELS][NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS )]; + + float memTransitionHB[CPE_CHANNELS][NS2SA( 48000, STEREO_DFT32MS_OVL_NS )]; + + /* unscaled & scaled SHB synthesis memory */ + float mem_syn_shb_nonref[L_SHB_LAHEAD]; + float mem_lpc_shbsynth_nonref[LPC_SHB_ORDER]; + float mem_syn_shb_ola_nonref[L_SHB_LAHEAD]; + + /* inter-channel BWE spectral shape adj. */ + float prevSpecMapping; + float memShbSpecMapping; + float prevgsMapping; + + float memShbHilbert_nonref[HILBERT_MEM_SIZE]; + float memShbInterp_nonref[2 * ALLPASSSECTIONS_STEEP + 1]; + float memShb_fsout_nonref[INTERP_3_2_MEM_LEN]; + int16_t syn_dm_phase_nonref; + + float icbweM2Ref_prev; + + float nlExc16k[L_FRAME16k]; + float mixExc16k[L_FRAME16k]; + float shbSynthRef[L_FRAME16k]; + int16_t MSFlag; + float lpSHBRef[LPC_SHB_ORDER + 1]; + float gshapeRef[NUM_SHB_SUBFR]; + float gFrameRef; + +} STEREO_ICBWE_DEC_DATA, *STEREO_ICBWE_DEC_HANDLE; + + +/*----------------------------------------------------------------------------------* + * ISM DTX structure + *----------------------------------------------------------------------------------*/ + +typedef struct +{ + int16_t dtx_flag; + int16_t sce_id_dtx; + + int16_t ism_dtx_hangover_cnt; /* hangover counter for ISM DTX decoder */ + +} ISM_DTX_DATA_DEC; + + +/*----------------------------------------------------------------------------------* + * ParamISM decoder structures + *----------------------------------------------------------------------------------*/ + +typedef struct param_ism_rendering +{ + float *proto_matrix; + float *interpolator; + float mixing_matrix_lin_old[CLDFB_NO_CHANNELS_MAX][PARAM_ISM_MAX_CHAN * PARAM_ISM_MAX_DMX]; + float mixing_matrix_lin[CLDFB_NO_CHANNELS_MAX][PARAM_ISM_MAX_CHAN * PARAM_ISM_MAX_DMX]; + float *Cldfb_RealBuffer_tc; + float *Cldfb_ImagBuffer_tc; + +} PARAM_ISM_RENDERING_DATA, *PARAM_ISM_RENDERING_HANDLE; + + +typedef struct ivas_param_ism_dec_data_structure +{ + /*Parameter decoding*/ + float azimuth_values[MAX_PARAM_SPATIAL_SUBFRAMES * IVAS_MAX_NUM_BANDS]; + float elevation_values[MAX_PARAM_SPATIAL_SUBFRAMES * IVAS_MAX_NUM_BANDS]; + float power_ratios[MAX_PARAM_ISM_NBANDS][MAX_PARAM_ISM_NBLOCKS][MAX_PARAM_ISM_WAVE]; + + /*sub-modules*/ + PARAM_ISM_CONFIG_HANDLE hParamIsm; /* Parametric ISM common handle */ + PARAM_ISM_RENDERING_HANDLE hParamIsmRendering; /* ParamISM rendering handle */ + +} PARAM_ISM_DEC_DATA, *PARAM_ISM_DEC_HANDLE; + + +/*----------------------------------------------------------------------------------* + * DirAC decoder structures + *----------------------------------------------------------------------------------*/ + +typedef struct ivas_dirac_dec_data_structure +{ + DIRAC_CONFIG_DATA_HANDLE hConfig; + + int16_t band_grouping[IVAS_MAX_NUM_BANDS + 1]; + int16_t dithering_seed; + int16_t spar_to_dirac_write_idx; + + IVAS_FB_MIXER_HANDLE hFbMdft; + +} DIRAC_DEC_DATA, *DIRAC_DEC_HANDLE; + + +/*----------------------------------------------------------------------------------* + * ParamMC structures + *----------------------------------------------------------------------------------*/ + +typedef struct dirac_output_synthesis_cov_state_structure +{ + /* only pointer to local buffers */ + float *direct_power_factor; + float *diffuse_power_factor; + + /* only pointer to local buffers */ + float *direct_responses; /* direct responses for DOA of current frame. Size: num_freq_bands*num_channels. */ + float *direct_responses_square; + float *diffuse_responses_square; /* squared diffuse responses. Size: num_channels. */ + + /* only pointer to local buffers */ + float *proto_direct_buffer_f; /* Buffer for direct sound prototype signals. Size: 2*num_freq_bands*num_channels*buffer_length (complex interleaved). */ + float *proto_diffuse_buffer_f; /* Buffer for diffuse sound prototype signals. Size: 2*num_freq_bands*num_channels*buffer_length (complex interleaved). */ + float *proto_power; /* Smoothed power of the prototype signals. Size: num_freq_bands*num_channels. */ + float *proto_power_diff; + + float *cx_old[CLDFB_NO_CHANNELS_MAX]; + float *cy_old[CLDFB_NO_CHANNELS_MAX]; + float *mixing_matrix_old[CLDFB_NO_CHANNELS_MAX]; + float *mixing_matrix_res_old[CLDFB_NO_CHANNELS_MAX]; + float *mixing_matrix[CLDFB_NO_CHANNELS_MAX]; + float *mixing_matrix_res[CLDFB_NO_CHANNELS_MAX]; + +} DIRAC_OUTPUT_SYNTHESIS_COV_STATE; + + +/*----------------------------------------------------------------------------------* + * ParamMC structures + *----------------------------------------------------------------------------------*/ + +typedef struct ivas_param_mc_diff_proto_info_structure +{ + int16_t num_protos_diff; + int16_t *proto_index_diff; + int16_t *num_source_chan_diff; + int16_t **source_chan_idx; + float **proto_fac; + +} PARAM_MC_DIFF_PROTO_INFO; + + +typedef struct ivas_param_mc_dec_data_structure +{ + int16_t slot_size; + float *Cldfb_RealBuffer_tc; + float *Cldfb_ImagBuffer_tc; + int16_t subframe_nbslots[MAX_JBM_SUBFRAMES_5MS]; + int16_t nb_subframes; + int16_t subframes_rendered; + int16_t slots_rendered; + int16_t num_slots; + int16_t num_freq_bands; + int16_t num_param_bands_synth; + + int16_t band_grouping[PARAM_MC_MAX_PARAMETER_BANDS + 1]; + + /*Decoder parameters */ + /*Prototypes*/ + int16_t num_outputs_diff; + PARAM_MC_DIFF_PROTO_INFO *diff_proto_info; + PARAM_MC_SYNTHESIS_CONF synthesis_conf; + + /*Options*/ + /* Decorrelator options */ + int16_t max_band_decorr; + /*Decoder states=memories*/ + float *proto_frame_f; + float *proto_frame_dec_f; + + DIRAC_OUTPUT_SYNTHESIS_COV_STATE h_output_synthesis_cov_state; + DIRAC_OUTPUT_SYNTHESIS_PARAMS h_output_synthesis_params; + int16_t max_band_energy_compensation; + HANDLE_IVAS_PARAM_MC_METADATA hMetadataPMC; + float *icc_q; /* ICC parameters*/ + float *icld_q; + int16_t max_param_band_abs_cov; + float *ls_conv_dmx_matrix; + float *proto_matrix_int; + + /*sub-modules*/ + HANDLE_DIRAC_DECORR_PARAMS h_freq_domain_decorr_ap_params; + HANDLE_DIRAC_DECORR_STATE h_freq_domain_decorr_ap_state; + + float *hoa_encoder; + +} PARAM_MC_DEC_DATA, *PARAM_MC_DEC_HANDLE; + + +/*----------------------------------------------------------------------------------* + * MC Param-Upmix Mode structures + *----------------------------------------------------------------------------------*/ + +typedef struct ivas_mc_paramupmix_dec_data_structure +{ + int16_t num_freq_bands; + ivas_td_decorr_state_t *hTdDecorr[MC_PARAMUPMIX_COMBINATIONS]; + float alphas[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS]; + float betas[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS]; + float alpha_prev[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS]; + float beta_prev[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS]; + int32_t alpha_quant[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS]; + int32_t beta_quant[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS]; + int16_t first_frame; + float *pcm_delay[MC_PARAMUPMIX_MAX_TRANSPORT_CHANS]; + float *param_interpolator; + float alpha_sf[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS]; + float beta_sf[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS]; + int16_t free_param_interpolator; + float *hoa_encoder; + +} MC_PARAMUPMIX_DEC_DATA, *MC_PARAMUPMIX_DEC_HANDLE; + + +/*------------------------------------------------------------------------------------------* + * SPAR decoder structures + *------------------------------------------------------------------------------------------*/ + +/* SPAR MD structure */ +typedef struct ivas_spar_dec_matrices_t +{ + float ***C_re; + float ***P_re; + +} ivas_spar_dec_matrices_t; + +typedef struct ivas_spar_md_dec_state_t +{ + ivas_spar_md_t spar_md; + ivas_spar_md_prev_t spar_md_prev; + ivas_spar_dec_matrices_t spar_coeffs; + ivas_spar_dec_matrices_t spar_coeffs_prev; + ivas_spar_dec_matrices_t spar_coeffs_tar; + int16_t dtx_md_smoothing_cntr; + int16_t valid_bands[IVAS_MAX_NUM_BANDS]; + int16_t base_band_age[IVAS_MAX_NUM_BANDS]; + int16_t spar_plc_num_lost_frames; + int16_t num_decorr; + int16_t td_decorr_flag; + int16_t spar_plc_enable_fadeout_flag; + float ***mixer_mat; + float mixer_mat_prev[MAX_PARAM_SPATIAL_SUBFRAMES + 1][IVAS_MAX_FB_MIXER_OUT_CH][IVAS_MAX_SPAR_FB_MIXER_IN_CH][IVAS_MAX_NUM_BANDS]; + ivas_spar_md_com_cfg spar_md_cfg; + ivas_arith_coeffs_t arith_coeffs; + ivas_huff_coeffs_t huff_coeffs; + int16_t table_idx; + int16_t dtx_vad; + int16_t spar_hoa_md_flag; + int16_t spar_hoa_dirac2spar_md_flag; + int16_t HOA_md_ind[IVAS_SPAR_MAX_CH]; + float smooth_buf[IVAS_MAX_NUM_BANDS][2 * SBA_DIRAC_NRG_SMOOTH_LONG + 1]; + float smooth_fac[IVAS_MAX_NUM_BANDS]; + float mixer_mat_prev2[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS]; + +} ivas_spar_md_dec_state_t; + + +/* AGC structure */ +typedef struct ivas_agc_dec_chan_state_t +{ + float lastGain; + int16_t gainExpVal; + +} ivas_agc_dec_chan_state_t; + +typedef struct ivas_agc_dec_state_t +{ + ivas_agc_com_state_t agc_com; + ivas_agc_dec_chan_state_t *gain_state; + ivas_agc_chan_data_t *gain_data; + +} ivas_agc_dec_state_t; + + +/* PCA structure */ +typedef struct +{ + float prev_ql[IVAS_PCA_INTERP]; + float prev_qr[IVAS_PCA_INTERP]; + int16_t prev_pca_bypass; + float mem_eigVec_interp[IVAS_PCA_LEN_INTERP_EIG_DEC]; + /* parser output: */ + int16_t pca_bypass; + int32_t index[2]; + +} PCA_DEC_STATE; + + +/* main SPAR decoder structure */ +typedef struct ivas_spar_dec_lib_t +{ + ivas_td_decorr_state_t *hTdDecorr; + ivas_spar_md_dec_state_t *hMdDec; + IVAS_FB_MIXER_HANDLE hFbMixer; + int16_t AGC_flag; + ivas_agc_dec_state_t *hAgcDec; + PCA_DEC_STATE *hPCA; + int16_t dirac_to_spar_md_bands[DIRAC_MAX_NBANDS]; + int16_t enc_param_start_band; + int32_t core_nominal_brate; /* Nominal bitrate for core coding */ + int16_t i_subframe; + + int16_t subframe_nbslots[MAX_JBM_SUBFRAMES_5MS]; + int16_t render_to_md_map[MAX_JBM_CLDFB_TIMESLOTS]; + int16_t nb_subframes; + int16_t subframes_rendered; + int16_t slots_rendered; + int16_t num_slots; + +} SPAR_DEC_DATA, *SPAR_DEC_HANDLE; + + +/* Data structure for SBA_ISM rendering */ +typedef struct ivas_osba_data +{ + float **delayBuffer; + int16_t delayBuffer_size; + int16_t delayBuffer_nchan; + +} SBA_ISM_DATA, *SBA_ISM_DATA_HANDLE; + + +/*----------------------------------------------------------------------------------* + * SCE decoder structure + *----------------------------------------------------------------------------------*/ + +typedef struct sce_dec_data_structure +{ + int16_t sce_id; /* SCE # identifier */ + int32_t element_brate; /* SCE total bitrate in bps */ + int32_t last_element_brate; /* SCE last total bitrate in bps */ + + /* core coder handle */ + DEC_CORE_HANDLE hCoreCoder[1]; + + float prev_hb_synth[NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS )]; /* HB synthesis synchro buffer */ + + float *save_synth; + float *save_hb_synth; + +} SCE_DEC_DATA, *SCE_DEC_HANDLE; + + +/*----------------------------------------------------------------------------------* + * CPE decoder structure + *----------------------------------------------------------------------------------*/ + +typedef struct cpe_dec_data_structure +{ + int16_t cpe_id; /* CPE # identifier */ + int32_t element_brate; /* CPE element total bitrate in bps */ + int32_t last_element_brate; /* last CPE element total bitrate in bps */ + + int16_t element_mode; /* element mode, in CPE it can be IVAS_CPE_DFT, IVAS_CPE_TD or IVAS_CPE_MDCT */ + int16_t last_element_mode; /* last element mode */ + + int16_t stereo_switching_counter; + int16_t NbFrameMod; + float lt_es_em; + + /* core coder handle */ + DEC_CORE_HANDLE hCoreCoder[CPE_CHANNELS]; + + /* stereo data handles */ + STEREO_DFT_DEC_DATA_HANDLE hStereoDft; /* DFT stereo data structure */ + STEREO_DFT_DMX_DATA_HANDLE hStereoDftDmx; /* DFT stereo DMX decoder structure */ + STEREO_TD_DEC_DATA_HANDLE hStereoTD; /* TD stereo data structure */ + STEREO_MDCT_DEC_DATA_HANDLE hStereoMdct; /* MDCT stereo data structure */ + STEREO_TCA_DEC_HANDLE hStereoTCA; /* Stereo ICA data handle */ + STEREO_ICBWE_DEC_HANDLE hStereoICBWE; /* Stereo inter-channel BWE data handle */ + STEREO_CNG_DEC_HANDLE hStereoCng; /* Stereo CNG data structure */ + + int16_t nchan_out; /* number of output channels (1: mono dmx, 2: default stereo) */ + + float prev_hb_synth[CPE_CHANNELS][NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS )]; + float prev_synth[CPE_CHANNELS][NS2SA( 48000, IVAS_DEC_DELAY_NS - STEREO_DFT32MS_OVL_NS )]; + + /* DFT stereo I/O channel buffer memories that need to be updated for TD->DFT stereo switching */ + float *input_mem[CPE_CHANNELS]; + float *input_mem_LB[CPE_CHANNELS]; + float *input_mem_BPF[1]; + float *output_mem[CPE_CHANNELS]; + float *prev_synth_chs[CPE_CHANNELS]; + + /* buffers used for fading between MDCT and DFT Stereo */ + float old_out_mdct[STEREO_MDCT2DFT_FADE_LEN_48k]; + float old_outLB_mdct[2 * STEREO_MDCT2DFT_FADE_LEN_48k]; + + int32_t brate_surplus; /* bitrate surplus for bitrate adaptation in combined format coding */ + +} CPE_DEC_DATA, *CPE_DEC_HANDLE; + + +/*----------------------------------------------------------------------------------* + * MCT decoder structure + *----------------------------------------------------------------------------------*/ + +typedef struct mct_dec_block_data_struct +{ + int16_t ch1, ch2; + int16_t mask[2][MAX_SFB]; + STEREO_MDCT_DEC_DATA_HANDLE hStereoMdct; /* MDCT stereo data handle */ + +} MCT_DEC_BLOCK_DATA, *MCT_DEC_BLOCK_DATA_HANDLE; + + +typedef struct mct_dec_data_structure +{ + int16_t nchan_out_woLFE; /* number of active channels within multi-channel configuration */ + int16_t currBlockDataCnt; + int16_t bitsChannelPairIndex; /* bits needed to code channel pair index, depends on number of active channels */ + MCT_DEC_BLOCK_DATA_HANDLE hBlockData[MCT_MAX_BLOCKS]; + + int16_t chBitRatios[MCT_MAX_CHANNELS]; + int16_t lowE_ch[MCT_MAX_CHANNELS]; /* note: pointer to local parameter */ + uint16_t mc_global_ild[MCT_MAX_CHANNELS]; /* note: pointer to local parameter */ + +} MCT_DEC_DATA, *MCT_DEC_HANDLE; + + +/*----------------------------------------------------------------------------------* + * LFE decoder structure + *----------------------------------------------------------------------------------*/ + +typedef struct ivas_lfe_dec_data_structure +{ + ivas_filters_process_state_t filter_state; + LFE_WINDOW_HANDLE pWindow_state; + const uint16_t *cum_freq_models[IVAS_MAX_NUM_QUANT_STRATS][IVAS_MAX_NUM_DCT_COEF_GROUPS]; + int16_t lfe_dec_indices_coeffs_tbl[IVAS_MAX_NUM_QUANT_STRATS][IVAS_MAX_NUM_DCT_COEF_GROUPS]; + float lfe_block_delay_s; + int16_t lfe_prior_buf_len; + float prior_out_buffer[L_FRAME48k]; + + float prevsynth_buf[LFE_PLC_BUFLEN]; + float *lfe_delay_buf; + int16_t lfe_addl_delay; + int16_t bfi_count; + +} LFE_DEC_DATA, *LFE_DEC_HANDLE; + + +/*----------------------------------------------------------------------------------* + * renderer structures + *----------------------------------------------------------------------------------*/ + +typedef struct renderer_struct +{ + float prev_gains[MAX_CICP_CHANNELS - 1][MAX_OUTPUT_CHANNELS]; + float *interpolator; + int16_t interpolator_length; + float gains[MAX_CICP_CHANNELS - 1][MAX_OUTPUT_CHANNELS]; + +} ISM_RENDERER_DATA, *ISM_RENDERER_HANDLE; + +/* Fastconv binaural data structure */ +typedef struct ivas_binaural_rendering_struct +{ + /* Common variables for all modules */ + IVAS_OUTPUT_SETUP_HANDLE hInputSetup; /* pointer to input spatial format for binaural renderer*/ + EFAP_HANDLE hEFAPdata; /* EFAP structure*/ + float *hoa_dec_mtx; /* pointer to HOA decoder mtx */ + int8_t rotInCldfb; /* Flag to enable rotation within bin Renderer in CLDFB*/ + int16_t max_band; /* band upto which rendering is performed */ + int16_t conv_band; /* band upto which convolution in cldfb domain is performed */ + int16_t timeSlots; /* number of time slots of binaural renderer */ + int16_t nInChannels; /* number input channels */ + int8_t render_lfe; /* Flag to render LFE in binaural rendering*/ + IVAS_FORMAT ivas_format; /* format; corresponds to st_ivas->ivas_format, unless the signal gets transormed to a different domain for rendering */ + + /* Convolution module structure */ + BINRENDERER_CONV_MODULE_HANDLE hBinRenConvModule; + + /* Variables related to reverberator module */ + float earlyPartEneCorrection[CLDFB_NO_CHANNELS_MAX]; + REVERB_STRUCT_HANDLE hReverb; + +} BINAURAL_RENDERER, *BINAURAL_RENDERER_HANDLE; + + +/*----------------------------------------------------------------------------------* + * MASA decoder structures + *----------------------------------------------------------------------------------*/ + +typedef struct ivas_masa_decoder_ext_out_meta_struct +{ + MASA_DECRIPTIVE_META descriptiveMeta; + + uint16_t directionIndex[MASA_MAXIMUM_DIRECTIONS][MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + uint8_t directToTotalRatio[MASA_MAXIMUM_DIRECTIONS][MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + uint8_t spreadCoherence[MASA_MAXIMUM_DIRECTIONS][MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + + uint8_t surroundCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + uint8_t diffuseToTotalRatio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + +} MASA_DECODER_EXT_OUT_META; + +typedef struct ivas_masa_decoder_data_struct +{ + int16_t band_mapping[MASA_FREQUENCY_BANDS + 1]; + SPHERICAL_GRID_DATA *sph_grid16; + + MASA_DECODER_EXT_OUT_META *extOutMeta; + float dir_decode_quality; + +} MASA_DECODER_DATA; + +typedef struct ivas_masa_decoder_struct +{ + MASA_CODEC_CONFIG config; /* Configuration of MASA decoding */ + MASA_DECODER_DATA data; /* Data storage for MASA decoding */ + MCMASA_LFE_SYNTH_DATA_HANDLE hMasaLfeSynth; /* LFE synthesis structure for McMASA */ + +} MASA_DECODER, *MASA_DECODER_HANDLE; + +/* Data structure for MASA_ISM rendering */ +typedef struct ivas_masa_ism_data_structure +{ + int16_t azimuth_ism[MAX_NUM_OBJECTS][MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_MASA_PARAM_DEC_SFR]; + int16_t elevation_ism[MAX_NUM_OBJECTS][MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_MASA_PARAM_DEC_SFR]; + float energy_ratio_ism[MAX_NUM_OBJECTS][MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_MASA_PARAM_DEC_SFR][CLDFB_NO_CHANNELS_MAX]; + float masa_to_total_energy_ratio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + + int16_t azimuth_ism_edited[MAX_NUM_OBJECTS]; + int16_t elevation_ism_edited[MAX_NUM_OBJECTS]; + uint8_t ism_is_edited[MAX_NUM_OBJECTS]; + + int16_t idx_separated_ism; + int16_t azimuth_separated_ism[MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_MASA_PARAM_DEC_SFR]; + int16_t elevation_separated_ism[MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_MASA_PARAM_DEC_SFR]; + + float q_azimuth_old[MAX_NUM_OBJECTS]; + float q_elevation_old[MAX_NUM_OBJECTS]; + + float ismPreprocMatrix[2][2][CLDFB_NO_CHANNELS_MAX]; + uint8_t objectsMoved; + float eneMoveIIR[2][CLDFB_NO_CHANNELS_MAX]; + float enePreserveIIR[2][CLDFB_NO_CHANNELS_MAX]; + float preprocEneTarget[CLDFB_NO_CHANNELS_MAX]; + float preprocEneRealized[CLDFB_NO_CHANNELS_MAX]; + + float **delayBuffer; + int16_t delayBuffer_size; + int16_t delayBuffer_nchan; + +} MASA_ISM_DATA, *MASA_ISM_DATA_HANDLE; + + +/*----------------------------------------------------------------------------------* + * JBM structures + *----------------------------------------------------------------------------------*/ + +typedef struct decoder_tc_buffer_structure +{ + float *tc_buffer; /* the buffer itself */ + float *tc[MAX_TRANSPORT_CHANNELS + MAX_NUM_OBJECTS]; /* pointers into the buffer to the beginning of each tc */ + TC_BUFFER_MODE tc_buffer_mode; /* mode of the buffer (no buffering, render buffering, out buffering) */ + int16_t nchan_transport_jbm; /* number of TCs after TC decoding */ + int16_t nchan_transport_internal; /* total number of TC buffer channels, can include e.g. TD decorr data */ + int16_t nchan_buffer_full; /* number of channels to be fully buffered */ + int16_t n_samples_available; /* samples still available for rendering in the current frame */ + int16_t n_samples_buffered; /* full number of samples in the buffer (including spill to next frame) */ + int16_t n_samples_rendered; /* samples already rendered in the current frame */ + int16_t n_samples_granularity; /* render granularity */ + int16_t n_samples_flushed; + int16_t subframe_nbslots[MAX_JBM_SUBFRAMES_5MS]; + int16_t nb_subframes; + int16_t subframes_rendered; + int16_t slots_rendered; + int16_t num_slots; + int16_t n_samples_discard; /* number of samples to discard from the beginning of the output */ + +} DECODER_TC_BUFFER, *DECODER_TC_BUFFER_HANDLE; + +typedef struct jbm_metadata_structure +{ + int16_t sf_write_idx; + int16_t sf_md_buffer_length; + + uint16_t directionIndexBuffer[MASA_MAXIMUM_DIRECTIONS][MAX_PARAM_SPATIAL_SUBFRAMES * MASA_JBM_RINGBUFFER_FRAMES][MASA_FREQUENCY_BANDS]; + uint8_t directToTotalRatioBuffer[MASA_MAXIMUM_DIRECTIONS][MAX_PARAM_SPATIAL_SUBFRAMES * MASA_JBM_RINGBUFFER_FRAMES][MASA_FREQUENCY_BANDS]; + uint8_t spreadCoherenceBuffer[MASA_MAXIMUM_DIRECTIONS][MAX_PARAM_SPATIAL_SUBFRAMES * MASA_JBM_RINGBUFFER_FRAMES][MASA_FREQUENCY_BANDS]; + uint8_t surroundCoherenceBuffer[MAX_PARAM_SPATIAL_SUBFRAMES * MASA_JBM_RINGBUFFER_FRAMES][MASA_FREQUENCY_BANDS]; + uint8_t diffuseToTotalRatioBuffer[MAX_PARAM_SPATIAL_SUBFRAMES * MASA_JBM_RINGBUFFER_FRAMES][MASA_FREQUENCY_BANDS]; + uint8_t numberOfDirections[MAX_PARAM_SPATIAL_SUBFRAMES * MASA_JBM_RINGBUFFER_FRAMES]; /* Descriptive metadata, value is 0 or 1 */ + + int16_t slot_read_idx; + int16_t slot_write_idx; + int16_t slot_md_buffer_length; + + int16_t sf_to_slot_map[MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME * MASA_JBM_RINGBUFFER_FRAMES]; + +} JBM_METADATA, *JBM_METADATA_HANDLE; + + + + +/*----------------------------------------------------------------------------------* + * Decoder configuration structure + *----------------------------------------------------------------------------------*/ + +typedef struct decoder_config_structure +{ + int32_t ivas_total_brate; /* IVAS total bitrate in bps */ + int32_t last_ivas_total_brate; /* last IVAS total bitrate in bps */ + int32_t output_Fs; /* output signal sampling frequency in Hz */ + int16_t nchan_out; /* number of output audio channels */ + AUDIO_CONFIG output_config; /* output audio configuration */ + int16_t Opt_LsCustom; /* indicates whether loudspeaker custom setup is used */ + int16_t Opt_HRTF_binary; /* indicates whether HRTF binary file is used */ + int16_t Opt_Headrotation; /* indicates whether head-rotation is used */ + int16_t Opt_RendConfigCustom; /* indicates whether Renderer configuration custom setup is used */ + IVAS_HEAD_ORIENT_TRK_T orientation_tracking; /* indicates orientation tracking type */ + int16_t Opt_non_diegetic_pan; /* indicates diegetic or not */ + float non_diegetic_pan_gain; /* non diegetic panning gain*/ + int16_t Opt_AMR_WB; /* flag indicating AMR-WB IO mode */ + int16_t Opt_ExternalOrientation; /* indiates whether external orientations are used */ + int16_t Opt_dpid_on; /* indicates whether Directivity pattern option is used */ + int16_t Opt_aeid_on; /* indicates whether Acoustic environment option is used */ + int16_t Opt_tsm; + int16_t Opt_5ms; + int16_t Opt_delay_comp; /* flag indicating delay compensation active */ + +} DECODER_CONFIG, *DECODER_CONFIG_HANDLE; + + +/*----------------------------------------------------------------------------------* + * + * Main IVAS decoder structure + * =========================== + *----------------------------------------------------------------------------------*/ +/* clang-format off */ + +typedef struct Decoder_Struct +{ + /* high-level decoder parameters */ + DECODER_CONFIG_HANDLE hDecoderConfig; /* Decoder configuration structure */ + + IVAS_FORMAT ivas_format; /* IVAS format */ + IVAS_FORMAT last_ivas_format; /* last frame IVAS format */ + int16_t sid_format; /* IVAS format indicator from SID frame */ + int16_t nchan_transport; /* number of transport channels */ + IVAS_OUTPUT_SETUP hOutSetup; /* output setup structure */ + AUDIO_CONFIG intern_config; /* internal audio configuration */ + IVAS_OUTPUT_SETUP hIntSetup; /* internal setup structure */ + + AUDIO_CONFIG transport_config; /* transport audio configuration */ + IVAS_OUTPUT_SETUP hTransSetup; /* transport setup structure */ + + int16_t element_mode_init; /* element mode used at initialization */ + int16_t codec_mode; /* Mode 1 or 2 */ + int16_t ini_frame; /* initialization frames counter */ + int16_t ini_active_frame; /* initialization active frames counter */ + + int16_t bfi; /* FEC - bad frame indicator */ + int16_t BER_detect; /* BER detect flag */ + + uint16_t *bit_stream; /* Pointer to bitstream buffer */ + int16_t writeFECoffset; /* parameter for debugging JBM stuff */ + + float **mem_hp20_out; /* output signals HP filter memories */ + IVAS_LIMITER_HANDLE hLimiter; /* Limiter handle */ + + float *p_output_f[MAX_OUTPUT_CHANNELS+MAX_NUM_OBJECTS]; /* floating-point output audio buffers */ + + /* core-decoder modules */ + int16_t nSCE; /* number of total SCEs */ + int16_t nCPE; /* number of total CPEs */ + SCE_DEC_HANDLE hSCE[MAX_SCE]; /* SCE handles */ + CPE_DEC_HANDLE hCPE[MCT_MAX_BLOCKS]; /* CPE handles */ + + /* multichannel modules */ + ISM_METADATA_HANDLE hIsmMetaData[MAX_NUM_OBJECTS]; /* ISM metadata handles (storage for one frame of read ISM metadata) */ + ISM_DTX_DATA_DEC hISMDTX; /* ISM DTX structure */ + ISM_RENDERER_HANDLE hIsmRendererData; /* ISM renderer handle */ + DIRAC_DEC_HANDLE hDirAC; /* DirAC handle */ + PARAM_ISM_DEC_HANDLE hParamIsmDec; /* ParamISM handle */ + SPAR_DEC_HANDLE hSpar; /* SPAR handle */ + IVAS_QMETADATA_HANDLE hQMetaData; /* q_metadata handle */ + MCT_DEC_HANDLE hMCT; /* MCT handle */ + PARAM_MC_DEC_HANDLE hParamMC; /* Parametric MC handle */ + MC_PARAMUPMIX_DEC_HANDLE hMCParamUpmix; /* MC Param-Upmix handle */ + MASA_DECODER_HANDLE hMasa; /* MASA handle */ + LFE_DEC_HANDLE hLFE; /* LFE handle */ + + ISM_MODE ism_mode; /* ISM format mode */ + int16_t nchan_ism; /* number of ISM channels */ + MC_MODE mc_mode; /* MC format mode */ + int16_t sba_order; /* Ambisonic (SBA) order */ + int16_t sba_planar; /* Ambisonic (SBA) planar flag */ + int16_t sba_analysis_order; /* Ambisonic (SBA) order used for analysis and coding */ + int16_t sba_dirac_stereo_flag; /* flag indicating stereo output for SBA DirAC modes with 1 TC */ + + /* rendering modules */ + RENDERER_TYPE renderer_type; /* renderer type */ + HANDLE_CLDFB_FILTER_BANK cldfbAnaDec[MAX_INTERN_CHANNELS]; /* Analysis CLDFB for transport and internal rendered channels */ + HANDLE_CLDFB_FILTER_BANK cldfbSynDec[MAX_OUTPUT_CHANNELS]; /* Synthesis CLDFB for output rendering */ + BINAURAL_RENDERER_HANDLE hBinRenderer; /* fastconv binaural renderer handle */ + BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd; /* Time domain binaural object renderer handle */ + TDREND_HRFILT_FiltSet_t *hHrtfTD; /* pointer to HRTF data for TD renderer */ + DIRAC_DEC_BIN_HANDLE hDiracDecBin; /* parametric binaural renderer handle */ + LSSETUP_CONVERSION_HANDLE hLsSetUpConversion; /* MC LS configuration convertion handle */ + EFAP_HANDLE hEFAPdata; /* EFAP structure */ + VBAP_HANDLE hVBAPdata; /* VBAP structure */ + MONO_DOWNMIX_RENDERER_HANDLE hMonoDmxRenderer; /* Mono downmix structure */ + CREND_WRAPPER_HANDLE hCrendWrapper; /* Crend handle */ + REVERB_HANDLE hReverb; /* Reverb handle */ + HRTFS_CREND_HANDLE hSetOfHRTF; /* Set of HRTFs handle (CRend) */ + HRTFS_FASTCONV_HANDLE hHrtfFastConv; /* FASTCONV HRTF tables for binaural rendering */ + HRTFS_PARAMBIN_HANDLE hHrtfParambin; /* HRTF tables for parametric binauralizer */ + LSSETUP_CUSTOM_HANDLE hLsSetupCustom; /* Custom LS configuration handle */ + float *hoa_dec_mtx; /* Pointer to decoder matrix for SBA */ + HEAD_TRACK_DATA_HANDLE hHeadTrackData; /* Head tracking data structure */ + RENDER_CONFIG_DATA *hRenderConfig; /* Renderer config pointer */ + int32_t binaural_latency_ns; /* Binauralization latency in ns */ + EXTERNAL_ORIENTATION_HANDLE hExtOrientationData; /* External orientation data structure */ + COMBINED_ORIENTATION_HANDLE hCombinedOrientationData; /* Combined external and head orientation data structure */ + DIRAC_REND_HANDLE hDirACRend; /* DirAC renderer handle */ + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom; /* Spatial parametric (DirAC rend, ParamBin, ParamISM) rendering common data handle. */ + MASA_ISM_DATA_HANDLE hMasaIsmData; /* OMASA rendering handle */ + SBA_ISM_DATA_HANDLE hSbaIsmData; /* OSBA rendering handle */ + + int16_t flag_omasa_brate; + + + /* JBM module */ + DECODER_TC_BUFFER_HANDLE hTcBuffer; /* JBM structure */ + JBM_METADATA_HANDLE hJbmMetadata; /* Structure for metadata buffering in JBM */ + + int32_t last_active_ivas_total_brate; + int16_t ism_extmeta_active; /* Extended metadata active in decoder */ + int16_t ism_extmeta_cnt; /* Change frame counter for extended metadata */ + +} Decoder_Struct; + +/* clang-format on */ + +#endif /* IVAS_STAT_DEC_H */ diff --git a/lib_dec/ivas_stereo_adapt_GR_dec.c b/lib_dec/ivas_stereo_adapt_GR_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..81a3131f8de352483cf9221f8b6e314508d902a3 --- /dev/null +++ b/lib_dec/ivas_stereo_adapt_GR_dec.c @@ -0,0 +1,496 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "prot.h" +#include "wmc_auto.h" +#include "ivas_prot.h" +#include "ivas_rom_com.h" +#include "rom_dec.h" + + +/*---------------------------------------------------------------------* + * read_GR2() + * + * reading a bitstream of data encoded with GR of order 2 + *---------------------------------------------------------------------*/ + +/*! r: number of bits read */ +static int16_t read_GR2( + const uint16_t *bit_stream, /* i : bitstream to be read */ + int16_t *ind, /* o : parameters read */ + const int16_t len /* i : number of params to be read */ +) +{ + int16_t i; + uint16_t nb, ready, temp, b; + const uint16_t *p; + + p = bit_stream; + nb = 0; + + for ( i = 0; i < len; i++ ) + { + ready = 0; + temp = 0; + do + { + b = *p++; + if ( b == 0 ) + { + ready = 1; + } + else + { + temp += 1; + } + } while ( ready == 0 ); + b = *p++; + b = 2 * b + *p++; + ind[i] = 4 * temp + b; + nb += temp + 3; + } + + return nb; +} + + +/*---------------------------------------------------------------------* + * read_GR1() + * + * reading a bitstream of data encoded with GR of order 1 + *---------------------------------------------------------------------*/ + +/*! r: number of bits read */ +static int16_t read_GR1( + const uint16_t *bit_stream, /* i : bitstream to be read */ + int16_t *ind, /* o : parameters read */ + const int16_t len /* i : number of params to be read */ +) +{ + int16_t i; + uint16_t nb, ready, temp, b; + const uint16_t *p; + + p = bit_stream; + nb = 0; + + for ( i = 0; i < len; i++ ) + { + ready = 0; + temp = 0; + do + { + b = *p++; + if ( b == 0 ) + { + ready = 1; + } + else + { + temp += 1; + } + } while ( ready == 0 ); + + b = *p++; + ind[i] = 2 * temp + b; + nb += + temp + 2; + } + + return nb; +} + + +/*---------------------------------------------------------------------* + * read_GR0() + * + * reading a bitstream of data encoded with GR of order 0 + *---------------------------------------------------------------------*/ + +/*! r: number of bits read */ +int16_t read_GR0( + const uint16_t *bit_stream, /* i : bitstream to be read */ + int16_t *ind, /* o : parameters read */ + const int16_t len /* i : number of params to be read */ +) +{ + int16_t i; + uint16_t nb, ready, b, temp; + const uint16_t *p; + + p = bit_stream; + nb = 0; + + for ( i = 0; i < len; i++ ) + { + ready = 0; + temp = 0; + do + { + b = *p++; + if ( b == 0 ) + { + ready = 1; + } + else + { + temp += 1; + } + } while ( ready == 0 ); + ind[i] = temp; + nb += temp + 1; + } + + return nb; +} + + +/*---------------------------------------------------------------------* + * find_map() + * + * find the position of the value 'val' in the array 'map' + *---------------------------------------------------------------------*/ + +/*! r: index in array */ +static ivas_error find_map( + int16_t *map_idx, + const int16_t *map, /* i : array to look into */ + const int16_t val, /* i : value to look for */ + const int16_t len /* i : length of array */ +) +{ + *map_idx = 0; + + while ( ( map[*map_idx] != val ) && ( *map_idx < len ) ) + { + ( *map_idx )++; + } + + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * decode_adapt_GR_indices1() + * + * decodes input array using the adaptive GR procedure + *---------------------------------------------------------------------*/ + +static void decode_adapt_GR_indices1( + const int16_t *ind, /* i : array of input encoded symbols */ + const int16_t len, /* i : number of parameters to decode */ + const int16_t no_symb, /* i : number of possible symbols in GR coding */ + int16_t *out, /* o : array of decoded parameters */ + const int16_t *map0 /* i : initial mapping array for the adaptive GR */ +) +{ + const int16_t *map; + int16_t map_symb, i; + + if ( no_symb == NO_SYMB_GR_SIDE_G ) + { + map = &map0[15 * no_symb]; + } + else + { + map = &( map0[8 * no_symb] ); + } + + for ( i = 0; i < len; i++ ) + { + map_symb = ind[i]; + find_map( out + i, map, map_symb, no_symb ); + map = &( map0[out[i] * no_symb] ); + } + + return; +} + + +/*---------------------------------------------------------------------* + * get_value() + * + * reads a value on 'nbits' from a bitstream + *---------------------------------------------------------------------*/ + +/*! r: read value */ +int16_t get_value( + const uint16_t *bit_stream, /* i : bitstream */ + const int16_t nbits /* i : number of bits to be read */ +) +{ + int16_t i; + uint16_t mask = 1, val = 0; + + for ( i = nbits - 1; i >= 0; i-- ) + { + val += mask * bit_stream[i]; + mask <<= 1; + } + + return val; +} + + +/*---------------------------------------------------------------------* + * read_BS_GR() + * + * decode simple GR code from a bitstream + *---------------------------------------------------------------------*/ + +/*! r: number of bits read */ +int16_t read_BS_GR( + const uint16_t *bit_stream, /* i : bitstream to be read */ + const int16_t nb, /* i : starting point in bitstream */ + int16_t *ind1, /* o : data array read */ + const int16_t len, /* i : number of params to be read */ + int16_t *GR_ord /* o : GR order to be used */ +) +{ + int16_t b, ind1_tmp[STEREO_DFT_BAND_MAX], tmp, i; + + *GR_ord = bit_stream[nb]; + b = 1; + + if ( *GR_ord == 0 ) + { + b += read_GR0( &bit_stream[nb + b], ind1_tmp, len ); + } + else + { + b += read_GR1( &bit_stream[nb + b], ind1_tmp, len ); + } + + for ( i = 0; i < len; i++ ) + { + tmp = ind1_tmp[i] + 1; + if ( tmp & 1 ) /* if odd number */ + { + ind1[i] = -( ind1_tmp[i] >> 1 ); + } + else + { + ind1[i] = tmp >> 1; + } + } + + return b; +} + + +/*---------------------------------------------------------------------* + * read_BS_adapt_GR_sg() + * + * read and decode with adaptive GR the bitstream containing side gains values + *---------------------------------------------------------------------*/ + +/*! r: number of bits read */ +int16_t read_BS_adapt_GR_sg( + const uint16_t *bit_stream, /* i : bitstream to be read */ + const int16_t nb, /* i : starting position in bitstream */ + int16_t *ind1, /* o : decoded side gain values */ + const int16_t len, /* i : number of params to be read */ + int16_t *GR_ord, /* o : GR order used (read from bitstream)*/ + const int16_t *map0 /* i : initial map */ +) +{ + int16_t b, ind1_tmp[STEREO_DFT_BAND_MAX], ord; + + /* read first component */ + b = 0; + b += read_GR1( &bit_stream[nb], ind1_tmp, 1 ); + /* read GR ord */ + ord = bit_stream[nb + b]; + b += 1; + + if ( ord == 0 ) + { + *GR_ord = 1; + b += read_GR1( &bit_stream[nb + b], &ind1_tmp[1], len - 1 ); + } + else + { + ord = bit_stream[nb + b]; + b += 1; + if ( ord == 0 ) + { + *GR_ord = 0; + + b += read_GR0( &bit_stream[nb + b], &ind1_tmp[1], len - 1 ); + } + else + { + *GR_ord = 2; + b += read_GR2( &bit_stream[nb + b], &ind1_tmp[1], len - 1 ); + } + } + + decode_adapt_GR_indices1( ind1_tmp, len, NO_SYMB_GR_SIDE_G, ind1, map0 ); + + return b; +} + + +/*---------------------------------------------------------------------* + * read_itd() + * + * read and decode ITD in DFT mode + *---------------------------------------------------------------------*/ + +/*! r: number of bits read */ +int16_t read_itd( + Decoder_State *st, /* i : Decoder state */ + int16_t *pI /* o : ITD value */ +) +{ + int16_t huff_flag, sign_flag, I, i, nb = 0, ready; + + huff_flag = get_next_indice( st, 1 ); + sign_flag = get_next_indice( st, 1 ); + nb += 2; + + if ( huff_flag == 1 ) + { + ready = 0; + I = 0; + + while ( ( ready == 0 ) && ( nb < 10 ) ) + { + I = 2 * I + get_next_indice( st, 1 ); + nb += 1; + + for ( i = 0; i < 20; i++ ) + { + if ( ( I == dft_code_itd[i] ) && ( dft_len_itd[i] == ( nb - 2 ) ) ) + { + I = i; + ready = 1; + break; + } + } + } + if ( ready == 0 ) + { + printf( "Error reading Huffman code for ITD: \n" ); + } + } + else + { + I = get_next_indice( st, STEREO_DFT_ITD_NBITS - 1 ); + nb += STEREO_DFT_ITD_NBITS - 1; + } + + I += 256 * sign_flag; + *pI = I; + + return nb; +} + + +/*---------------------------------------------------------------------* + * read_BS_adapt_GR_rpg() + * + * read and decode residual prediction gain values using adaptive GR + *---------------------------------------------------------------------*/ + +/*! r: number of bits read */ +int16_t read_BS_adapt_GR_rpg( + const uint16_t *bit_stream, /* i : bitstream to be read */ + const int16_t nb, /* i : starting point in bitstream */ + int16_t *ind1_pred, /* o : decoded res pred gains */ + const int16_t start, /* i : starting subband */ + const int16_t total_no, /* i : number of params to be read */ + int16_t *GR_ord /* o : GR order - read */ +) +{ + int16_t b, ind1_tmp[STEREO_DFT_BAND_MAX], i, len; + len = total_no - start; + + /* read first band */ + b = read_GR1( &bit_stream[nb], ind1_tmp, 1 ); + + if ( ind1_tmp[0] == dft_maps_rpg[8 * NO_SYMB_GR_PRED_G] ) + { + for ( i = start; i < total_no; i++ ) + { + ind1_pred[i] = 0; + } + } + else + { + *GR_ord = bit_stream[nb + b]; /* GR order */ + b += 1; + if ( *GR_ord == 0 ) + { + b += read_GR0( &bit_stream[nb + b], &ind1_tmp[1], len - 1 ); + } + else + { + /* GR ord 1 */ + b += read_GR1( &bit_stream[nb + b], &ind1_tmp[1], len - 1 ); + } + decode_adapt_GR_indices1( ind1_tmp, total_no - start, NO_SYMB_GR_PRED_G, &ind1_pred[start], dft_maps_rpg ); + } + + return b; +} + + +/*---------------------------------------------------------------------* + * read_flag_EC_DFT() + * + * read flag differentiating between: CBR/EC with adaptive GR/GR for differential coding + *---------------------------------------------------------------------*/ + +/*! r: number of bits read */ +int16_t read_flag_EC_DFT( + const uint16_t *bit_stream, /* i : bitstream */ + int16_t *flag /* o : flag value */ +) +{ + int16_t flg; + + flg = bit_stream[0]; + if ( flg == 0 ) + { + *flag = flg; + return 1; + } + else + { + *flag = 2 + bit_stream[1]; + return 2; + } +} diff --git a/lib_dec/ivas_stereo_cng_dec.c b/lib_dec/ivas_stereo_cng_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..91a560cb2c9f6784820f17cb56bc2c2a60cd1fa1 --- /dev/null +++ b/lib_dec/ivas_stereo_cng_dec.c @@ -0,0 +1,1029 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_cnst.h" +#include "ivas_rom_com.h" +#include "wmc_auto.h" + +/*------------------------------------------------------------------- + * Local constants + *-------------------------------------------------------------------*/ + +#define A_GFILT 0.8f /* LP-filter coefficient for coherence and sidegain */ +#define SKIP_XFADE_FRAMES 2 + +/* DTX/CNG */ +#define MAX_K 50.0f +#define STEREO_TD_PS_CORR_FILT 0.8f +#define MAX_XFADE 50.0f +#define CM_INIT 50 +#define CORR_INIT 8 +#define SID_INIT 6 +#define STEREO_CNA_LR_CORR_LT_FILT 0.95f /* long-term averaging factor for L/R correlation estimation in stereo CNA */ +#define STEREO_CNA_ILD_LT_FILT 0.9f /* long-term averaging factor for ILD estimation in stereo CNA */ +#define STEREO_CNA_SOFT_VAD_UP 0.7f /* long-term averaging factor for upward soft VAD update in stereo CNA */ +#define STEREO_CNA_SOFT_VAD_DN 0.95f /* long-term averaging factor for downward soft VAD update in stereo CNA */ + + +/*------------------------------------------------------------------- + * stereo_dft_dec_sid_coh() + * + * Decode coherence vector + *-------------------------------------------------------------------*/ + +void stereo_dft_dec_sid_coh( + Decoder_State *st, /* i/o: decoder state structure */ + const int16_t nbands, /* i : number of DFT stereo bands */ + float *coh, /* i/o: coherence */ + int16_t *nb_bits /* i/o: number of bits read */ +) +{ + int16_t nr_of_sid_stereo_bits; + int16_t i; + float alpha; + int16_t alpha_index; + int16_t alpha_step; + float pred; + float pred_err; + int16_t coh_pred_index; + int16_t res_index; + float cohBandq[STEREO_DFT_BAND_MAX]; + const float *pptr; + int16_t bits_tmp; + int16_t b; + + nr_of_sid_stereo_bits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; + + /* If the coherence is not encoded due to lack of bits set alpha to zero which leads to that the coherence */ + /* from the previous frame is used. */ + if ( ( nr_of_sid_stereo_bits - *nb_bits - STEREO_DFT_N_COH_ALPHA_BITS - STEREO_DFT_PRED_NBITS ) > 0 ) + { + /* Read coherence from bitstream */ + coh_pred_index = get_next_indice( st, STEREO_DFT_PRED_NBITS ); /* Read predictor index */ + ( *nb_bits ) += STEREO_DFT_PRED_NBITS; + + alpha_index = get_next_indice( st, STEREO_DFT_N_COH_ALPHA_BITS ); /* Read alpha index */ + ( *nb_bits ) += STEREO_DFT_N_COH_ALPHA_BITS; + + alpha_step = 0; + for ( i = 0; i < STEREO_DFT_N_COH_ALPHA_STEPS - 1; i++ ) + { + if ( nr_of_sid_stereo_bits - *nb_bits > dft_cng_coh_alpha_start[i] ) + { + alpha_step = i + 1; + } + } + alpha = dft_cng_alpha_bits[alpha_step][alpha_index]; + } + else + { + alpha = 0; + coh_pred_index = 0; + for ( i = *nb_bits; i < nr_of_sid_stereo_bits; i++ ) + { + get_next_indice( st, 1 ); + ( *nb_bits )++; + } + } + + pptr = dft_cng_coh_pred[coh_pred_index]; + pred = 0.4f; + + for ( b = 0; b < nbands; b++ ) + { + /* Intra-frame prediction */ + + for ( i = 0; i < b; i++ ) + { + pred += ( *pptr++ ) * cohBandq[i]; + } + /* Weighted intra/inter-frame prediction */ + pred = alpha * pred + ( 1 - alpha ) * coh[b]; + + /* Read residual index from bitstream */ + if ( *nb_bits < nr_of_sid_stereo_bits ) /* If the bit limit is reached, res_index = 0 is assumed for remaining indices */ + { + bits_tmp = read_GR0( &st->bit_stream[st->next_bit_pos], &res_index, 1 ); + *nb_bits += bits_tmp; + st->next_bit_pos += bits_tmp; + } + else + { + res_index = 0; + } + + /* Reconstruct */ + res_index = dft_cng_coh_u2i[res_index]; + pred_err = usdequant( res_index, -0.4f, 0.1f ); + cohBandq[b] = pred + pred_err; /* Store for intra-frame prediction */ + if ( cohBandq[b] > 1 ) + { + cohBandq[b] = 1; + } + else if ( cohBandq[b] < 0 ) + { + cohBandq[b] = 0; + } + coh[b] = cohBandq[b]; /* Update memory for next frame */ + pred = 0; + } + + /* Remove padding bits */ + for ( i = *nb_bits; i < nr_of_sid_stereo_bits; i++ ) + { + get_next_indice( st, 1 ); + ( *nb_bits )++; + } + + + return; +} + + +/*------------------------------------------------------------------- + * stereo_dft_generate_comfort_noise() + * + * Generate the comfort noise based on the target noise level for the CLDFB part + *-------------------------------------------------------------------*/ + +static void stereo_dft_generate_comfort_noise( + STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: DFT Stereo decoder handle */ + STEREO_CNG_DEC_HANDLE hStereoCng, /* i/o: Stereo CNG data structure */ + const int16_t last_element_mode, /* i : last element mode */ + Decoder_State *st, /* i/o: Core coder decoder state */ + float DFT[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* i/o: DFT buffers */ + Decoder_State *st1, /* i/o: Core coder decoder state secondary channel */ + const float targetGain, /* i : ICA target gain */ + const int16_t chan, /* i : channel number */ + const int16_t output_frame /* i : output frame size */ +) +{ + int16_t i, j, k; + float *ptr_level, *ptr_shb, *ptr_r, *ptr_i; + HANDLE_FD_CNG_COM hFdCngCom; + int16_t numSlots; + float scale; + float lp_noise; + float tmp, enr; + float shb_shape[L_FRAME16k]; + float *ptr0, *ptr1, *ptr2; + float dmpf[M + 2], Atmp[M + 2]; + float cngNoiseLevel_upd[L_FRAME16k], cngNoiseLevel_hist[L_FRAME16k - 2]; + float *ptr_tmp, *ptr_cng; + float E0, E1; + int16_t b; + float *pSideGain; + float gamma; + float c; + float scaleMS; + float scaleAvg; + float LR_ratio; + float factor; + float alpha, ftmp; + float trigo_dec[STEREO_DFT32MS_N_16k / 2 + 1]; + const float *pTrigo; + int16_t trigo_step; + + hFdCngCom = st->hFdCngDec->hFdCngCom; + + push_wmops( "DFT_CNG" ); + + set_f( dmpf, 0.0f, M + 2 ); + set_f( Atmp, 0.0f, M + 2 ); + + set_zero( DFT[chan], STEREO_DFT_BUF_MAX ); + + enr = 0; /* Eliminates compiler warning. They are always set before they are used */ + E0 = 0.0f; + E1 = 0.0f; + lp_noise = 0; + + if ( chan == 0 ) + { + pSideGain = hStereoDft->side_gain + STEREO_DFT_NBDIV * STEREO_DFT_BAND_MAX; + for ( b = 0; b < hStereoDft->nbands; b++ ) + { + if ( hStereoCng->xfade_frame_counter == 0 ) + { + hStereoDft->g_state[b] = *pSideGain++; + } + else + { + hStereoDft->g_state[b] = ( 1 - A_GFILT ) * *pSideGain++ + A_GFILT * hStereoDft->g_state[b]; + } + + if ( hStereoCng->first_SID ) + { + if ( hStereoCng->first_SID_after_TD ) + { + hStereoCng->cm[b] = hStereoCng->c_LR_LT * hStereoCng->c_LR_LT; + } + else + { + hStereoCng->cm[b] = hStereoCng->coh[b]; + } + } + else if ( hStereoCng->nr_dft_frames < CM_INIT && hStereoCng->nr_sid_frames < SID_INIT ) + { + if ( hStereoCng->nr_corr_frames > CORR_INIT ) + { + hStereoCng->cm[b] = hStereoCng->c_LR_LT * hStereoCng->c_LR_LT; + } + else + { + hStereoCng->cm[b] = ( 1 - A_GFILT ) * hStereoCng->coh[b] + A_GFILT * hStereoCng->cm[b]; + } + } + else + { + hStereoCng->cm[b] = ( 1 - A_GFILT ) * hStereoCng->coh[b] + A_GFILT * hStereoCng->cm[b]; + } + } + + if ( hStereoCng->first_SID_after_TD ) + { + scaleAvg = 0; + for ( b = 0; b < hStereoDft->nbands; b++ ) + { + if ( hStereoCng->cm[b] < 0.9f ) + { + gamma = hStereoCng->cm[b]; + gamma = gamma / ( 1 - gamma ); + gamma = sqrtf( gamma + 1 - hStereoDft->g_state[b] * hStereoDft->g_state[b] ) - sqrtf( gamma ); + } + else + { + gamma = 0; + } + + LR_ratio = tdm_ratio_tabl[hStereoCng->last_tdm_idx]; + c = ( ( 1 + hStereoDft->g_state[b] ) * ( 1 + hStereoDft->g_state[b] ) + gamma * gamma ) / ( ( 1 - hStereoDft->g_state[b] ) * ( 1 - hStereoDft->g_state[b] ) + gamma * gamma ); + scaleMS = ( 1 + c + 2 * sqrtf( c * hStereoCng->cm[b] ) ) / ( 4 * ( c * LR_ratio * LR_ratio + ( 1 - LR_ratio ) * ( 1 - LR_ratio ) * targetGain * targetGain + 2 * LR_ratio * ( 1 - LR_ratio ) * targetGain * sqrtf( c * hStereoCng->cm[b] ) ) ); + scaleMS = sqrtf( scaleMS ); + scaleAvg += scaleMS; + } + scaleAvg = scaleAvg / hStereoDft->nbands; + + hStereoDft->scale = scaleAvg; + } + } + + if ( st->cng_type == LP_CNG ) + { + set_f( cngNoiseLevel_upd, 0.0f, st->L_frame ); + + /* Deemphasis */ + dmpf[0] = 1.0f; + dmpf[1] = -st->preemph_fac; + mvr2r( st->Aq_cng, Atmp, M + 1 ); + conv( Atmp, dmpf, cngNoiseLevel_upd, M + 2 ); + + if ( st->L_frame == L_FRAME ) + { + pTrigo = hStereoDft->dft_trigo_12k8; + trigo_step = STEREO_DFT_TRIGO_SRATE_12k8_STEP * STEREO_DFT_TRIGO_DEC_STEP; + } + else + { + pTrigo = hStereoDft->dft_trigo_16k; + trigo_step = STEREO_DFT_TRIGO_SRATE_16k_STEP * STEREO_DFT_TRIGO_DEC_STEP; + } + + for ( i = 0; i < st->L_frame / 4; i++ ) + { + trigo_dec[i] = pTrigo[i * trigo_step]; + trigo_dec[st->L_frame / 2 - i] = pTrigo[i * trigo_step]; + } + trigo_dec[st->L_frame / 4] = pTrigo[st->L_frame / 4 * trigo_step]; + + rfft( cngNoiseLevel_upd, trigo_dec, st->L_frame, -1 ); + + /* Compute 1/|A| */ + ptr0 = cngNoiseLevel_upd; + ptr1 = ptr0 + 2; + ptr2 = ptr1 + 1; + assert( st->lp_ener > 0.0f ); + factor = 2.0f * sqrtf( st->lp_ener / st->L_frame * 0.5f ); /* fixed factor in the loop below */ + for ( i = 0; i < st->L_frame / 2 - 1; i++ ) + { + ftmp = *ptr1 * *ptr1 + *ptr2 * *ptr2; + assert( ftmp > 0.0f ); + *ptr0++ = factor * inv_sqrt( ftmp ); + ptr1 += 2; + ptr2 += 2; + } + + if ( min( output_frame, L_FRAME32k ) - hFdCngCom->stopFFTbin > 0 ) + { + /* Transform shb LP spectrum */ + set_f( shb_shape, 0.0f, L_FRAME16k ); + mvr2r( st->hTdCngDec->shb_lpcCNG, shb_shape, LPC_SHB_ORDER + 1 ); + + if ( st->L_frame != L_FRAME16k ) + { + pTrigo = hStereoDft->dft_trigo_16k; + trigo_step = STEREO_DFT_TRIGO_SRATE_16k_STEP * STEREO_DFT_TRIGO_DEC_STEP; + + for ( i = 0; i < L_FRAME16k / 4; i++ ) + { + trigo_dec[i] = pTrigo[i * trigo_step]; + trigo_dec[L_FRAME16k / 2 - i] = pTrigo[i * trigo_step]; + } + trigo_dec[L_FRAME16k / 4] = pTrigo[L_FRAME16k / 4 * trigo_step]; + } + + rfft( shb_shape, trigo_dec, L_FRAME16k, -1 ); + + /* Compute 1/|A| */ + enr = shb_shape[0] * shb_shape[0] + shb_shape[1] * shb_shape[1]; + ptr0 = shb_shape; + ptr1 = ptr0 + 2; + ptr2 = ptr1 + 1; + + for ( i = 0; i < L_FRAME16k / 2 - 1; i++ ) + { + ftmp = ( *ptr1 * *ptr1 + *ptr2 * *ptr2 ); + assert( ftmp > 0.0f ); + ftmp = 1.0f / ftmp; + /* in float: + both a = "div"=(1/(x^2+y^2) and sqrt(a) is used and summed up in the same loop. + + in BASOP: + sum up using inv_sqrt( *ptr1 * *ptr1 + *ptr2 * *ptr2 ), in this loop + and then sum up enr = sum( *ptr0 * *ptr0 ), in a subsequent MAC loop */ + enr += ftmp; + *ptr0++ = sqrtf( ftmp ); + ptr1 += 2; + ptr2 += 2; + } + } + + /* Update CNG noise level from MS noise estimation */ + mvr2r( st->hFdCngDec->bandNoiseShape, cngNoiseLevel_hist, hFdCngCom->stopFFTbin - hFdCngCom->startBand ); + ptr_cng = cngNoiseLevel_hist; + for ( i = 0; i < ( st->last_L_frame - hFdCngCom->startBand ) / 2; i++ ) + { + tmp = *( cngNoiseLevel_hist + i * 2 ); + tmp += *( cngNoiseLevel_hist + i * 2 + 1 ); + *ptr_cng++ = tmp * 0.5f; + } + + if ( last_element_mode == IVAS_CPE_TD && chan == 0 && hStereoCng->xfade_frame_counter == 0 && !( hFdCngCom->msFrCnt_init_counter < hFdCngCom->msFrCnt_init_thresh ) ) + { + ptr_cng = cngNoiseLevel_hist + hFdCngCom->startBand; + ptr_tmp = cngNoiseLevel_upd + hFdCngCom->startBand; + for ( i = 0; i < ( st->last_L_frame - hFdCngCom->startBand ) / 2; i++ ) + { + E0 += *ptr_cng++; + E1 += ( *ptr_tmp ) * ( *ptr_tmp ); + ptr_tmp++; + } + + tmp = sqrtf( E0 / E1 ); + if ( tmp < 1 ) + { + hStereoCng->xfade_length = (int16_t) ( -MAX_XFADE * tmp + MAX_XFADE ); + } + else + { + hStereoCng->xfade_length = (int16_t) ( -MAX_XFADE * ( 1 / tmp ) + MAX_XFADE ); + } + } + + if ( hStereoCng->xfade_frame_counter < hStereoCng->xfade_length ) + { + ptr_cng = cngNoiseLevel_hist + hFdCngCom->startBand; + ptr_tmp = cngNoiseLevel_upd + hFdCngCom->startBand; + for ( i = 0; i < ( st->last_L_frame - hFdCngCom->startBand ) / 2; i++ ) + { + tmp = hStereoCng->xfade_frame_counter / (float) hStereoCng->xfade_length; + *ptr_tmp = tmp * *ptr_tmp + ( 1 - tmp ) * sqrtf( *ptr_cng++ ) * hStereoDft->scale; + ptr_tmp++; + } + } + + for ( k = 0; k < STEREO_DFT_NBDIV; k++ ) + { + /* low band */ + ptr_level = cngNoiseLevel_upd; + ptr_r = DFT[chan] + hFdCngCom->startBand + k * STEREO_DFT32MS_N_MAX; + ptr_i = ptr_r + 1; + scale = output_frame * 0.5f; + + for ( i = 0; i < ( hFdCngCom->stopFFTbin - hFdCngCom->startBand ) / 2; i++ ) + { + /* Real part in FFT bins */ + rand_gauss( ptr_r, &st->hTdCngDec->cng_seed ); + tmp = scale * *ptr_level; + ( *ptr_r ) *= tmp; + ptr_r += 2; + /* Imaginary part in FFT bins */ + rand_gauss( ptr_i, &st->hTdCngDec->cng_seed ); + ( *ptr_i ) *= tmp; + ptr_i += 2; + ptr_level++; + } + + if ( min( output_frame, L_FRAME32k ) - hFdCngCom->stopFFTbin > 0 ) + { + + /* high band generation, flipped spectrum */ + assert( enr != 0.0f ); + scale = sqrtf( powf( 10, 0.1f * st->hTdCngDec->shb_cng_gain ) / enr ); + ptr_shb = shb_shape + L_FRAME16k / 2 - 1; + /* Averaging for Nyquist frequency */ + *ptr_shb = 0.5f * ( cngNoiseLevel_upd[( hFdCngCom->stopFFTbin - hFdCngCom->startBand ) / 2 - 1] / scale + *( ptr_shb - 1 ) ); + + ptr_r = DFT[chan] + hFdCngCom->stopFFTbin + k * STEREO_DFT32MS_N_MAX; + ptr_i = ptr_r + 1; + + for ( i = 0; i < ( min( output_frame, hFdCngCom->regularStopBand * 16 ) - hFdCngCom->stopFFTbin ) / 2; i++ ) + { + /* Real part in FFT bins */ + rand_gauss( ptr_r, &st->hTdCngDec->cng_seed ); + ( *ptr_r ) *= *ptr_shb; + ptr_r += 2; + /* Imaginary part in FFT bins */ + rand_gauss( ptr_i, &st->hTdCngDec->cng_seed ); + ( *ptr_i ) *= *ptr_shb; + ptr_i += 2; + ptr_shb--; + } + + /* rescale */ + scale *= output_frame * 0.5f; + ptr_r = DFT[chan] + hFdCngCom->stopFFTbin + k * STEREO_DFT32MS_N_MAX; + ptr_i = ptr_r + 1; + for ( i = 0; i < ( min( output_frame, hFdCngCom->regularStopBand * 16 ) - hFdCngCom->stopFFTbin ) / 2; i++ ) + { + ( *ptr_r ) *= scale; + ( *ptr_i ) *= scale; + ptr_r += 2; + ptr_i += 2; + } + } + } + + /* Expand cngNoiseLevel from 0-159 to 0-318, compute noise level */ + lp_noise = 0.0f; + ptr_level = hFdCngCom->cngNoiseLevel + hFdCngCom->stopFFTbin - hFdCngCom->startBand - 1; + ptr_tmp = cngNoiseLevel_upd + ( hFdCngCom->stopFFTbin - hFdCngCom->startBand ) / 2 - 1; + for ( i = 0; i < ( hFdCngCom->stopFFTbin - hFdCngCom->startBand ) / 2; i++ ) + { + *ptr_level-- = *ptr_tmp * *ptr_tmp; + ptr_tmp--; + *ptr_level = *( ptr_level + 1 ); + lp_noise += 2 * *ptr_level--; + } + } + else + { + /* FD-CNG */ + if ( !( hFdCngCom->msFrCnt_init_counter < hFdCngCom->msFrCnt_init_thresh ) ) + { + if ( hStereoCng->xfade_frame_counter <= MAX_K && hStereoCng->last_act_element_mode == IVAS_CPE_TD && chan == 0 ) + { + /* Fade MS -> SID/MS */ + j = 0; + for ( k = 0; k < ( hFdCngCom->nFFTpart - 2 ); k++ ) + { + factor = ( hFdCngCom->sidNoiseEstLp[k] + DELTA ) / ( st->hFdCngDec->partNoiseShape[k] + DELTA ); + factor = min( hStereoDft->scale + ( 1 / MAX_K ) * ( factor - hStereoDft->scale ) * hStereoCng->xfade_frame_counter, factor ); + for ( ; j <= hFdCngCom->part[k]; j++ ) + { + hFdCngCom->cngNoiseLevel[j] = st->hFdCngDec->bandNoiseShape[j] * factor; + } + } + } + } + scale = output_frame * 0.5f; + numSlots = hFdCngCom->numSlots / 2; + for ( k = 0; k < STEREO_DFT_NBDIV; k++ ) + { + ptr_level = hFdCngCom->cngNoiseLevel; + ptr_r = DFT[chan] + hFdCngCom->startBand + k * STEREO_DFT32MS_N_MAX; + ptr_i = ptr_r + 1; + for ( i = 0; i < ( hFdCngCom->stopFFTbin - hFdCngCom->startBand ) / 2; i++ ) + { + /* Real part in FFT bins */ + tmp = *ptr_level++; + tmp += *ptr_level++; + tmp = tmp * 0.5f; + rand_gauss( ptr_r, &st->hTdCngDec->cng_seed ); + tmp = sqrtf( tmp ) * scale; + ( *ptr_r ) *= tmp; + ptr_r += 2; + /* Imaginary part in FFT bins */ + rand_gauss( ptr_i, &st->hTdCngDec->cng_seed ); + ( *ptr_i ) *= tmp; + ptr_i += 2; + } + ptr_level = hFdCngCom->cngNoiseLevel + hFdCngCom->stopFFTbin - hFdCngCom->startBand; + ptr_r = DFT[chan] + hFdCngCom->stopFFTbin + k * STEREO_DFT32MS_N_MAX; + ptr_i = ptr_r + 1; + for ( j = hFdCngCom->numCoreBands; j < hFdCngCom->regularStopBand; j++ ) + { + for ( i = 0; i < numSlots; i++ ) + { + /* Real part in FFT bins */ + rand_gauss( ptr_r, &st->hTdCngDec->cng_seed ); + tmp = sqrtf( *ptr_level ) * scale; + ( *ptr_r ) *= tmp; + ptr_r += 2; + /* Imaginary part in FFT bins */ + rand_gauss( ptr_i, &st->hTdCngDec->cng_seed ); + ( *ptr_i ) *= tmp; + ptr_i += 2; + } + ptr_level++; + } + } + + /* Compute noise level */ + lp_noise = 0.0f; + ptr_level = hFdCngCom->cngNoiseLevel; + for ( i = 0; i < hFdCngCom->stopFFTbin - hFdCngCom->startBand; i++ ) + { + lp_noise += *ptr_level++; + } + } + + if ( hStereoCng->last_act_element_mode == IVAS_CPE_TD && chan > 0 ) + { + st1->lp_noise = 0.9f * st1->lp_noise + 0.1f * 10.f * log10f( lp_noise + DELTA ); + } + else if ( chan == 0 ) + { + st->hFdCngDec->lp_noise = 0.9f * st->hFdCngDec->lp_noise + 0.1f * 10.f * log10f( lp_noise + DELTA ); + st->lp_noise = st->hFdCngDec->lp_noise; + st->hFdCngDec->hFdCngCom->flag_noisy_speech = ( st->hFdCngDec->lp_speech - st->hFdCngDec->lp_noise ) < 28.f; + st->hFdCngDec->hFdCngCom->likelihood_noisy_speech = 0.99f * st->hFdCngDec->hFdCngCom->likelihood_noisy_speech + 0.01f * st->hFdCngDec->hFdCngCom->flag_noisy_speech; + } + + if ( chan == 0 && st->core_brate <= SID_2k40 ) + { + /* update smoothed periodogram used by stereo CNA in SID and NO_DATA frames from cngNoiseLevel */ + for ( i = hFdCngCom->startBand; i < hFdCngCom->stopFFTbin; i++ ) + { + ftmp = hFdCngCom->cngNoiseLevel[i - hFdCngCom->startBand]; + + if ( !st->hFdCngDec->first_cna_noise_updated ) + { + /* very first update */ + alpha = 0.0f; + } + else + { + alpha = 0.95f; + if ( st->hFdCngDec->smoothed_psd[i] > 0.0f && ftmp > 2.5f * st->hFdCngDec->smoothed_psd[i] ) + { + /* prevent abrupt upward update steps */ + ftmp = 2.5f * st->hFdCngDec->smoothed_psd[i]; + } + else if ( ftmp < st->hFdCngDec->smoothed_psd[i] ) + { + /* faster downward updates */ + alpha = 0.7f; + } + } + + /* smoothing */ + st->hFdCngDec->smoothed_psd[i] = alpha * st->hFdCngDec->smoothed_psd[i] + ( 1 - alpha ) * ftmp; + } + + /* update msNoiseEst in SID and NO_DATA frames */ + bandcombinepow( &st->hFdCngDec->smoothed_psd[hFdCngCom->startBand], hFdCngCom->stopFFTbin - hFdCngCom->startBand, st->hFdCngDec->part_shaping, st->hFdCngDec->nFFTpart_shaping, st->hFdCngDec->psize_inv_shaping, st->hFdCngDec->msNoiseEst ); + + st->hFdCngDec->first_cna_noise_updated = 1; + mvr2r( st->hFdCngDec->msNoiseEst, st->hFdCngDec->msPeriodog_ST, st->hFdCngDec->nFFTpart_shaping ); + st->hFdCngDec->ms_last_inactive_bwidth = st->bwidth; + } + + pop_wmops(); + return; +} + + +/*------------------------------------------------------------------- + * stereo_dtf_cng() + * + * DFT stereo CNG + *-------------------------------------------------------------------*/ + +void stereo_dtf_cng( + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + float DFT[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* i/o: DFT buffers */ + const int16_t output_frame /* i : output frame size */ +) +{ + Decoder_State **sts; + int16_t n; + + sts = hCPE->hCoreCoder; + + if ( hCPE->hStereoCng != NULL ) + { + if ( hCPE->hStereoCng->nr_dft_frames < CM_INIT ) + { + hCPE->hStereoCng->nr_dft_frames++; + } + + if ( ivas_total_brate <= IVAS_SID_5k2 ) + { + if ( hCPE->hStereoCng->nr_sid_frames < SID_INIT && ivas_total_brate == IVAS_SID_5k2 ) + { + hCPE->hStereoCng->nr_sid_frames++; + } + + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + stereo_dft_generate_comfort_noise( hCPE->hStereoDft, hCPE->hStereoCng, hCPE->last_element_mode, sts[0], DFT, sts[1], hCPE->hStereoTCA->targetGain, n, output_frame ); + } + } + } + + return; +} + + +/*------------------------------------------------------------------- + * stereo_cng_dec_update() + * + * Update counters used for TD->DFT-CNG cross fade and stereo SID parameters + *-------------------------------------------------------------------*/ + +void stereo_cng_dec_update( + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + const int32_t ivas_total_brate /* i : IVAS total bitrate */ +) +{ + if ( hCPE->hCoreCoder[0]->core_brate > SID_2k40 ) + { + hCPE->hStereoCng->last_act_element_mode = hCPE->element_mode; + if ( hCPE->hStereoCng->active_frame_counter > SKIP_XFADE_FRAMES ) + { + hCPE->hStereoCng->xfade_frame_counter = 0; + hCPE->hStereoCng->xfade_length = 0; + } + if ( hCPE->hStereoCng->active_frame_counter < MAX_FRAME_COUNTER ) + { + hCPE->hStereoCng->active_frame_counter++; + } + } + else + { + hCPE->hStereoCng->active_frame_counter = 0; + if ( hCPE->hStereoCng->xfade_frame_counter < MAX_FRAME_COUNTER ) + { + hCPE->hStereoCng->xfade_frame_counter++; + } + } + + if ( hCPE->element_mode == IVAS_CPE_DFT ) + { + if ( ivas_total_brate == IVAS_SID_5k2 || ivas_total_brate == FRAME_NO_DATA ) + { + hCPE->hStereoCng->prev_sid_nodata = 1; + } + else + { + hCPE->hStereoCng->prev_sid_nodata = 0; + } + } + + hCPE->hCoreCoder[0]->hFdCngDec->hFdCngCom->active_frame_counter = hCPE->hStereoCng->active_frame_counter; + + return; +} + + +/*-------------------------------------------------------------------* + * Function stereo_cng_compute_PScorr() + * + * CNA for TD stereo, compute PS correlation + *-------------------------------------------------------------------*/ + +void stereo_cng_compute_PScorr( + float *output[CPE_CHANNELS], /* i : Output signal */ + float *c_PS_LT, /* i/o: Correlation */ + const int16_t L_frame_0, /* i : L_frame channel 0 */ + const int16_t L_frame_1 /* i : L_frame channel 1 */ +) +{ + int16_t i; + float enrP, enrS, dotPS; + float c_PS; + float outputResamp[L_FRAME16k]; + float *outputPptr, *outputSptr; + + enrP = 0.0f; + enrS = 0.0f; + dotPS = 0.0f; + + if ( L_frame_0 > L_frame_1 ) + { + outputPptr = output[0]; + lerp( output[1], outputResamp, L_frame_0, L_frame_1 ); + outputSptr = outputResamp; + } + else if ( L_frame_1 > L_frame_0 ) + { + outputSptr = output[1]; + lerp( output[0], outputResamp, L_frame_1, L_frame_0 ); + outputPptr = outputResamp; + } + else + { + outputPptr = output[0]; + outputSptr = output[1]; + } + + for ( i = 0; i < L_frame_0; i++ ) + { + enrP += *outputPptr * *outputPptr; + enrS += *outputSptr * *outputSptr; + dotPS += *outputPptr++ * *outputSptr++; + } + + c_PS = ( dotPS + EPSILON ) * inv_sqrt( enrP * enrS + EPSILON ); + + *c_PS_LT = STEREO_TD_PS_CORR_FILT * *c_PS_LT + ( 1 - STEREO_TD_PS_CORR_FILT ) * c_PS; + + return; +} + + +/*-------------------------------------------------------------------* + * Function stereo_cng_compute_LRcorr() + * + * CNA for TD stereo, compute LR correlation + *-------------------------------------------------------------------*/ + +static void stereo_cng_compute_LRcorr( + CPE_DEC_HANDLE hCPE, /* i/o: CPE handle */ + float *output[CPE_CHANNELS], /* i : Output signal */ + const int16_t output_frame, /* i : Output frame length */ + const int16_t tdm_ratio_idx /* i : TDM ratio index */ +) +{ + int16_t i; + float c_LR, c, tmp, sc; + float enrL, enrR, dotLR; + float beta; + + beta = tdm_ratio_tabl[tdm_ratio_idx]; + + enrL = 0.0f; + enrR = 0.0f; + dotLR = 0.0f; + for ( i = 0; i < output_frame; i++ ) + { + enrL += output[0][i] * output[0][i]; + enrR += output[1][i] * output[1][i]; + dotLR += output[0][i] * output[1][i]; + } + + c_LR = fabsf( dotLR + EPSILON ) * inv_sqrt( enrL * enrR + EPSILON ); + c = ( enrL + DELTA ) / ( enrR + DELTA ); + hCPE->hStereoTD->c_LR_LT = STEREO_TD_PS_CORR_FILT * hCPE->hStereoTD->c_LR_LT + ( 1 - STEREO_TD_PS_CORR_FILT ) * c_LR; + hCPE->hStereoCng->c_LR_LT = hCPE->hStereoTD->c_LR_LT; + + tmp = 2 * beta * ( 1 - beta ) * sqrtf( c ) * hCPE->hStereoTD->c_LR_LT; + sc = ( ( 1 - beta ) * ( 1 - beta ) * c + beta * beta - tmp + DELTA ) / ( beta * beta * c + ( 1 - beta ) * ( 1 - beta ) + tmp + DELTA ); + sc = min( sc, 4.0f ); + hCPE->hStereoTD->SP_ratio_LT = 0.9f * hCPE->hStereoTD->SP_ratio_LT + ( 1 - 0.9f ) * sqrtf( sc ); + + if ( hCPE->hStereoCng->nr_corr_frames < CM_INIT ) + { + hCPE->hStereoCng->nr_corr_frames++; + } + + hCPE->hStereoCng->nr_dft_frames = 0; + + return; +} + + +/*-------------------------------------------------------------------* + * FindEmEs() + * + * Find the energie ratio between the mono and the side + *-------------------------------------------------------------------*/ + +static void FindEmEs( + const float *ch1, /* i : Left channel */ + const float *ch2, /* i : right channel */ + const int16_t len, /* i : length */ + float *lt_es_em /* i/o: LT energy ratio */ +) +{ + int16_t i; + float mono_i, ener, es_em; + float side_i, ener_side; + + ener = 1e-6f; + ener_side = 1e-6f; + + for ( i = 0; i < len; i++ ) + { + mono_i = ( ch1[i] + ch2[i] ) / 2.0f; + ener += mono_i * mono_i; + side_i = ( ch1[i] - ch2[i] ) / 2.0f; + ener_side += side_i * side_i; + } + + /**es_em = 10 * ( log10( sqrt( ener_side / len ) ) - log10( sqrt( ener / len ) ) ); */ + es_em = 5 * ( logf( sqrtf( ener_side / ener ) ) / logf( 10 ) ); + + /* long-term estimate */ + *lt_es_em = 0.4f * *lt_es_em + 0.6f * es_em; + + return; +} + + +/*-------------------------------------------------------------------* + * Function stereo_cna_update_params() + * + * compute LR correlation and update long-term parameters for stereo CNA + *-------------------------------------------------------------------*/ + +void stereo_cna_update_params( + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + float *output[CPE_CHANNELS], /* i : Output signal */ + const int16_t output_frame, /* i : Output frame length */ + const int16_t tdm_ratio_idx /* i : TDM ratio index */ +) +{ + int16_t i; + float c, c_LR, c_ILD, enrL, enrR, dotLR; + Decoder_State **sts; + HANDLE_FD_CNG_DEC hFdCngDec; + + sts = hCPE->hCoreCoder; + + hFdCngDec = sts[0]->hFdCngDec; + + if ( hCPE->element_mode == IVAS_CPE_DFT ) + { + if ( hCPE->nchan_out > 1 ) + { + FindEmEs( output[0], output[1], output_frame, &hCPE->lt_es_em ); + } + else + { + hCPE->lt_es_em = 0.0f; + } + } + else if ( hCPE->element_mode == IVAS_CPE_TD ) + { + FindEmEs( output[0], output[1], output_frame, &hCPE->lt_es_em ); + + hCPE->hStereoCng->first_SID_after_TD = 1; + stereo_cng_compute_LRcorr( hCPE, output, output_frame, tdm_ratio_idx ); + } + else + { + return; + } + + enrL = 0.0f; + enrR = 0.0f; + dotLR = 0.0f; + if ( hCPE->element_mode == IVAS_CPE_TD || ( hCPE->element_mode == IVAS_CPE_DFT && sts[0]->core_brate > SID_2k40 && sts[0]->VAD == 0 ) ) + { + if ( hCPE->nchan_out == 1 ) + { + c_LR = 1; + c_ILD = 0; + } + else + { + for ( i = 0; i < output_frame; i++ ) + { + enrL += output[0][i] * output[0][i]; + enrR += output[1][i] * output[1][i]; + dotLR += output[0][i] * output[1][i]; + } + + /* estimate L/R correlation factor and ILD in time domain */ + c_LR = fabsf( dotLR + EPSILON ) * inv_sqrt( enrL * enrR + EPSILON ); + c = ( enrL + DELTA ) / ( enrR + DELTA ); + c_ILD = ( c - 1 ) / ( c + 1 ); + } + + /* update of long-term ILD and LR correlation factors for stereo CNA */ + if ( !hFdCngDec->first_cna_noise_updated ) + { + hFdCngDec->cna_LR_LT = c_LR; + hFdCngDec->cna_ILD_LT = c_ILD; + } + else + { + hFdCngDec->cna_LR_LT = STEREO_CNA_LR_CORR_LT_FILT * hFdCngDec->cna_LR_LT + ( 1 - STEREO_CNA_LR_CORR_LT_FILT ) * c_LR; + hFdCngDec->cna_ILD_LT = STEREO_CNA_ILD_LT_FILT * hFdCngDec->cna_ILD_LT + ( 1 - STEREO_CNA_ILD_LT_FILT ) * c_ILD; + } + + set_f( hFdCngDec->cna_g_state, hFdCngDec->cna_ILD_LT, hFdCngDec->cna_nbands ); + set_f( hFdCngDec->cna_cm, hFdCngDec->cna_LR_LT, hFdCngDec->cna_nbands ); + } + + /* Soft VAD for stereo CNA */ + if ( hCPE->element_mode == IVAS_CPE_TD || hCPE->element_mode == IVAS_CPE_DFT ) + { + if ( !hFdCngDec->first_cna_noise_updated ) + { + hFdCngDec->cna_act_fact = 0.0f; + } + else + { + if ( hCPE->element_mode == IVAS_CPE_TD ) + { + /* quickly decrease in TD stereo mode */ + hFdCngDec->cna_act_fact *= 0.7f; + } + else if ( sts[0]->VAD > hFdCngDec->cna_act_fact ) + { + /* quickly increase during active frames in DFT stereo mode */ + hFdCngDec->cna_act_fact = 0.7f * hFdCngDec->cna_act_fact + 0.3f * sts[0]->VAD; + } + else + { + /* slowly decrease during inactive frames in DFT stereo mode */ + hFdCngDec->cna_act_fact = 0.95f * hFdCngDec->cna_act_fact + 0.05f * sts[0]->VAD; + } + } + } + + return; +} + + +/*------------------------------------------------------------------- + * stereo_cng_init_dec() + * + * Initialized stereo CNG + *-------------------------------------------------------------------*/ + +void stereo_cng_init_dec( + STEREO_CNG_DEC_HANDLE hStereoCng, /* i/o: stereo CNG decoder structure */ + const int16_t *frameSize /* i : pointer to frameSize of channel 0 to be used for channel 1 */ +) +{ + hStereoCng->prev_sid_nodata = 0; + set_f( hStereoCng->coh, 0.5f, STEREO_DFT_BAND_MAX + 1 ); + set_zero( hStereoCng->cm, STEREO_DFT_BAND_MAX ); + hStereoCng->first_SID = 1; + hStereoCng->first_SID_after_TD = 0; + hStereoCng->active_frame_counter = 0; + hStereoCng->xfade_frame_counter = 0; + hStereoCng->xfade_length = 0; + hStereoCng->nr_dft_frames = 0; + hStereoCng->nr_corr_frames = 0; + hStereoCng->nr_sid_frames = 0; + set_f( hStereoCng->olapBufferSynth22, 0.0f, FFTLEN ); + hStereoCng->flag_cna_fade = 0; + set_zero( hStereoCng->maskingNoiseS, L_FRAME16k ); + hStereoCng->enableSecCNA = 0; + hStereoCng->c_PS_LT = 0.5f; + hStereoCng->frameSize = frameSize; + hStereoCng->last_act_element_mode = IVAS_CPE_DFT; + + return; +} diff --git a/lib_dec/ivas_stereo_dft_dec.c b/lib_dec/ivas_stereo_dft_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..210b83557f926be18e7cd9e5a42f00022503285a --- /dev/null +++ b/lib_dec/ivas_stereo_dft_dec.c @@ -0,0 +1,3068 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include "options.h" +#include +#include "cnst.h" +#include "rom_com.h" +#include "rom_dec.h" +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_cnst.h" +#include "ivas_rom_com.h" +#include "ivas_rom_dec.h" +#include "wmc_auto.h" + + +/*-------------------------------------------------------------------* + * Local constants + *-------------------------------------------------------------------*/ + +#define STEFI_DELAY_IND( d, buf_ind ) ( ( buf_ind ) + STEREO_DFT_PAST_MAX - ( d ) + 1 ) % STEREO_DFT_PAST_MAX + +#define STEREO_DFT_RES_RATIO_LIMIT 0.18f +#define STEREO_DFT_LT_PREDGAIN_UPD 0.1f +#define STEREO_DFT_VR_PREDGAIN_UPD 0.1f +#define STEREO_DFT_STEFFI_PG_THRESHOLD 0.6f +#define STEREO_DFT_STEFFI_RATIO_UP_HIGH 0.03f +#define STEREO_DFT_STEFFI_RATIO_DOWN_HIGH 0.05f +#define STEREO_DFT_STEFFI_RATIO_UP_LOW 0.1f +#define STEREO_DFT_STEFFI_RATIO_DOWN_LOW 0.001f +#define STEREO_DFT_STEFFI_DELAY_SHORT 2 +#define STEREO_DFT_STEFFI_DELAY_LONG 4 +#define STEREO_DFT_STEFFI_DELAY_OFFSET 2 +#define STEREO_DFT_STEFFI_GAIN_REST_AMT 0.6f +#define STEREO_DFT_STEFFI_GAIN_AMP 1.0f + + +#define STEREO_DFT_BPF_SIZE 40 /* BPF: Number of weights for BPF in DFT: 40*40Hz=1.6kHz*/ + + +/*------------------------------------------------------------------------- + * Local function prototypes + *-------------------------------------------------------------------------*/ + +static void stereo_dft_dec_open( STEREO_DFT_DEC_DATA_HANDLE hStereoDft, const int32_t output_Fs, const int16_t nchan_transport ); + +static void stereo_dft_compute_td_stefi_params( STEREO_DFT_DEC_DATA_HANDLE hStereoDft, const float samp_ratio ); + +static void stereo_dft_adapt_sf_delay( STEREO_DFT_DEC_DATA_HANDLE hStereoDft, float *pPredGain ); + + +/*------------------------------------------------------------------------- + * stereo_dft_dequantize_res_gains() + * + * joint dequantizer for side channel prediction gain and residual energy + *-------------------------------------------------------------------------*/ + +static void stereo_dft_dequantize_res_gains( + int16_t *ind1, + int16_t *ind2, + float *gout, + float *rout, + const int16_t N ) +{ + int16_t i, index; + + for ( i = 0; i < N; i++ ) + { + /* Ensure the indices are within range -- may go out of range due to frame loss */ + ind1[i] = check_bounds_s( ind1[i], 0, 30 ); + ind2[i] = check_bounds_s( ind2[i], 0, 7 ); + index = ( ( ind1[i] < 15 ? 15 - ind1[i] : ind1[i] - 15 ) << 3 ) + ind2[i]; + gout[i] = ind1[i] < 15 ? -dft_res_gains_q[index][0] : dft_res_gains_q[index][0]; + rout[i] = dft_res_gains_q[index][1]; + } + + return; +} + +/*--------------------------------------------------------------------------- + * stereo_dft_dequantize_res_gains_f() + * + * returns interepolated values for non-integer indices + *---------------------------------------------------------------------------*/ + +static void stereo_dft_dequantize_res_gains_f( + float *ind1, + float *ind2, + float *gout, + float *rout, + const int16_t N ) +{ + int16_t i, i1, j1, sign, ji, ij; + float fi, fj; + + for ( i = 0; i < N; i++ ) + { + /* Ensure the indices are within range -- may go out of range due to frame loss */ + ind1[i] = check_bounds( ind1[i], 0, 31 ); + ind2[i] = check_bounds( ind2[i], 0, 7 ); + + /* compensate for the offset and extract/remove sign of first index */ + sign = ind1[i] < 15 ? -1 : 1; + i1 = (int16_t) floor( ind1[i] < 15 ? 15 - ind1[i] : ind1[i] - 15 ); + fi = ( ind1[i] < 15 ? 15 - ind1[i] : ind1[i] - 15 ) - i1; + + j1 = (int16_t) floor( ind2[i] ); + fj = ind2[i] - j1; + + /* choose base indices for interpolation */ + ji = min( fj < .5 ? j1 : j1 + 1, 7 ); + ij = min( fi < .5 ? i1 : i1 + 1, 15 ); + + /* interpolate values from table */ + if ( i1 < 15 ) + { + gout[i] = sign * ( ( 1 - fi ) * dft_res_gains_q[( i1 << 3 ) + ji][0] + fi * dft_res_gains_q[( ( i1 + 1 ) << 3 ) + ji][0] ); + } + else + { + gout[i] = sign * dft_res_gains_q[120 + ji][0]; + } + + if ( j1 < 7 ) + { + rout[i] = ( 1 - fj ) * dft_res_gains_q[( ij << 3 ) + j1][1] + fj * dft_res_gains_q[( ij << 3 ) + j1 + 1][1]; + } + else + { + rout[i] = dft_res_gains_q[( ij << 3 ) + 7][1]; + } + } + + return; +} + + +/*------------------------------------------------------------------------- + * stereo_dft_dequantize_ipd() + * + * Dequantize IPDs + *-------------------------------------------------------------------------*/ + +static void stereo_dft_dequantize_ipd( + int16_t *ind, + float *out, + const int16_t N, + const int16_t bits ) +{ + int16_t i; + float delta; + + if ( bits == 2 ) /* 2-bit phase quantization for the highest frequency band only */ + { + delta = EVS_PI / 2.f; + } + else if ( bits == 3 ) + { + delta = EVS_PI / 4.f; + } + else if ( bits == 4 ) + { + delta = EVS_PI / 8.f; + } + else + { + delta = EVS_PI / 4.f; + assert( 0 ); + } + + for ( i = 0; i < N; i++ ) + { + out[i] = ind[i] * delta - EVS_PI; + } + + return; +} + + +/*------------------------------------------------------------------------- + * stereo_dft_dequantize_itd() + * + * Dequantize ITDs + *-------------------------------------------------------------------------*/ + +void stereo_dft_dequantize_itd( + int16_t *ind, + float *out, + const int32_t output_Fs ) +{ + int16_t itd; + int16_t mask; + + mask = ( 1 << ( STEREO_DFT_ITD_NBITS - 1 ) ) - 1; + itd = ( ind[0] & mask ) + STEREO_DFT_ITD_MIN; + + if ( ( ind[0] >> ( STEREO_DFT_ITD_NBITS - 1 ) ) ) + { + itd *= -1; + } + assert( ( ABSVAL( itd ) <= STEREO_DFT_ITD_MAX ) && ( ABSVAL( itd ) >= STEREO_DFT_ITD_MIN ) ); + + /*Convert back @ fs*/ + *out = (float) ( itd * output_Fs ) / ( (float) ( STEREO_DFT_ITD_FS ) ); + + return; +} + + +/*------------------------------------------------------------------------- + * stereo_dft_dec_create() + * + * Create DFT stereo handle + *------------------------------------------------------------------------*/ + +ivas_error stereo_dft_dec_create( + STEREO_DFT_DEC_DATA_HANDLE *hStereoDft, /* i/o: decoder DFT stereo handle */ + const int32_t element_brate, /* i : element bitrate */ + const int32_t output_Fs, /* i : output sampling rate */ + const int16_t sba_dirac_stereo_flag, /* i : signal stereo output for SBA DirAC */ + const int16_t nchan_transport /* i : number of transport channels */ +) +{ + STEREO_DFT_DEC_DATA_HANDLE hStereoDft_loc; + int16_t tmpS; + + if ( *hStereoDft != NULL ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error: DFT Stereo memory already allocated\n" ); + } + + if ( ( hStereoDft_loc = (STEREO_DFT_DEC_DATA_HANDLE) malloc( sizeof( STEREO_DFT_DEC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DFT Stereo\n" ) ); + } + + if ( ( hStereoDft_loc->hConfig = (STEREO_DFT_CONFIG_DATA_HANDLE) malloc( sizeof( STEREO_DFT_CONFIG_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DFT Stereo Config\n" ) ); + } + + if ( ( hStereoDft_loc->hBpf = (BPF_DEC_HANDLE) malloc( sizeof( BPF_DEC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for BPF handle\n" ) ); + } + + if ( ( hStereoDft_loc->hTcxLtpDec = (TCX_LTP_DEC_HANDLE) malloc( sizeof( TCX_LTP_DEC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TCX-LTP handle\n" ) ); + } + + hStereoDft_loc->hConfig->force_mono_transmission = 0; + + if ( sba_dirac_stereo_flag ) + { + ivas_sba_dirac_stereo_config( hStereoDft_loc->hConfig ); + } + else + { + stereo_dft_config( hStereoDft_loc->hConfig, element_brate, &tmpS, &tmpS ); + } + + stereo_dft_dec_open( hStereoDft_loc, output_Fs, nchan_transport ); + + *hStereoDft = hStereoDft_loc; + + return IVAS_ERR_OK; +} + + +/*------------------------------------------------------------------------- + * stereo_dft_dec_open() + * + * Open DFT decoder stereo handle + *-------------------------------------------------------------------------*/ + +static void stereo_dft_dec_open( + STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */ + const int32_t output_Fs, /* i : output sampling rate */ + const int16_t nchan_transport /* i : number of transport channels */ +) +{ + /*Sizes*/ + hStereoDft->N = (int16_t) ( STEREO_DFT_HOP_MAX * output_Fs / 48000 ); + + /*Init. DFT sizes*/ + hStereoDft->NFFT = (int16_t) ( STEREO_DFT32MS_N_MAX * output_Fs / 48000 ); + + hStereoDft->dft_trigo_8k = dft_trigo_32k; + hStereoDft->dft_trigo_12k8 = dft_trigo_12k8; + hStereoDft->dft_trigo_16k = dft_trigo_32k; + + hStereoDft->dft32ms_ovl = (int16_t) ( ( STEREO_DFT32MS_OVL_MAX * output_Fs ) / 48000 ); + hStereoDft->win232ms_8k = dft_win232ms_8k; + hStereoDft->win232ms_12k8 = dft_win232ms_12k8; + hStereoDft->win232ms_16k = dft_win232ms_16k; + + hStereoDft->dft32ms_ovl2 = (int16_t) ( ( STEREO_DFT32MS_OVL2_MAX * output_Fs ) / 48000 ); + hStereoDft->win32ms_8k = dft_win232ms_8k + 1; + hStereoDft->win32ms_12k8 = dft_win232ms_12k8 + 1; + hStereoDft->win32ms_16k = dft_win232ms_16k + 1; + + if ( output_Fs == 16000 ) + { + hStereoDft->dft_trigo = dft_trigo_32k; + hStereoDft->dft_trigo_step = STEREO_DFT_TRIGO_SRATE_16k_STEP; + hStereoDft->win232ms = dft_win232ms_16k; + hStereoDft->win32ms = dft_win232ms_16k + 1; + } + else if ( output_Fs == 32000 ) + { + hStereoDft->dft_trigo = dft_trigo_32k; + hStereoDft->dft_trigo_step = STEREO_DFT_TRIGO_SRATE_32k_STEP; + hStereoDft->win232ms = dft_win232ms_32k; + hStereoDft->win32ms = dft_win232ms_32k + 1; + } + else + { + assert( output_Fs == 48000 ); + hStereoDft->dft_trigo = dft_trigo_48k; + hStereoDft->dft_trigo_step = STEREO_DFT_TRIGO_SRATE_48k_STEP; + hStereoDft->win232ms = dft_win232ms_48k; + hStereoDft->win32ms = dft_win232ms_48k + 1; + } + + hStereoDft->win_8k = dft_win_8k; + + /*Bands: find the number of bands, Nyquist freq. is not taken into account*/ + set_s( hStereoDft->band_res, hStereoDft->hConfig->band_res, STEREO_DFT_DEC_DFT_NB ); + + hStereoDft->nbands = stereo_dft_band_config( hStereoDft->band_limits, hStereoDft->band_res[0], hStereoDft->NFFT, DEC ); + hStereoDft->hb_stefi_delay = NS2SA( output_Fs, STEREO_DFT_TD_STEFI_DELAY_NS ); + + if ( nchan_transport > 2 ) + { + hStereoDft->min_smooth_gains = min_smooth_gains2; + hStereoDft->max_smooth_gains = max_smooth_gains2; + } + else + { + hStereoDft->min_smooth_gains = min_smooth_gains1; + hStereoDft->max_smooth_gains = max_smooth_gains1; + } + + /* reset DFT stereo memories */ + stereo_dft_dec_reset( hStereoDft ); + + return; +} + + +/*------------------------------------------------------------------------- + * stereo_dft_dec_reset() + * + * Reset DFT stereo memories + *------------------------------------------------------------------------*/ + +void stereo_dft_dec_reset( + STEREO_DFT_DEC_DATA_HANDLE hStereoDft /* i/o: decoder DFT stereo handle */ +) +{ + int16_t i; + int16_t j, b; + + /*Configuration*/ + set_s( hStereoDft->prm_res, hStereoDft->hConfig->prm_res, STEREO_DFT_DEC_DFT_NB ); + + /* SIDE_GAIN */ + set_s( hStereoDft->side_gain_index, 15, STEREO_DFT_BAND_MAX ); + set_s( hStereoDft->side_gain_index_previous, 15, STEREO_DFT_BAND_MAX ); + + /*residual prediction*/ + set_s( hStereoDft->res_pred_mode, hStereoDft->hConfig->res_pred_mode, STEREO_DFT_DEC_DFT_NB ); + for ( i = 0; i < STEREO_DFT_PAST_MAX; i++ ) + { + set_zero( hStereoDft->DFT_past_DMX[i], STEREO_DFT32MS_N_32k ); + set_zero( hStereoDft->past_res_pred_gain[i], STEREO_DFT_BAND_MAX ); + } + + hStereoDft->past_DMX_pos = 0; + + set_s( hStereoDft->res_pred_index_previous, 0, STEREO_DFT_BAND_MAX ); + + for ( i = 0; i < STEREO_DFT_BAND_MAX; i++ ) + { + hStereoDft->res_gains_ind[0][i] = 15.f; + } + + set_zero( hStereoDft->res_gains_ind[1], STEREO_DFT_BAND_MAX ); + + /*residual coding*/ + set_s( hStereoDft->res_cod_mode, hStereoDft->hConfig->res_cod_mode, STEREO_DFT_DEC_DFT_NB ); + hStereoDft->res_cod_band_max = dft_band_res_cod[hStereoDft->hConfig->band_res][hStereoDft->hConfig->res_cod_mode]; + set_zero( hStereoDft->res_cod_mem, STEREO_DFT_OVL_8k ); + + hStereoDft->res_pred_band_min = max( STEREO_DFT_RES_PRED_BAND_MIN, hStereoDft->res_cod_band_max ); + + hStereoDft->stab_fac_smooth_res = 0.f; + bass_psfilter_init( hStereoDft->hBpf ); + + tcxltp_dec_init( hStereoDft->hTcxLtpDec, 0, MODE1, IVAS_CPE_DFT, PIT_MAX, 12800 ); + + hStereoDft->reverb_flag = 0; + + hStereoDft->bpf_error_signal_last = 0.0f; + hStereoDft->bpf_error_ratio_mem = 1.0f; + hStereoDft->res_hb_nrg_mem = 0.0f; + + /*reset parameters*/ + set_zero( hStereoDft->side_gain, STEREO_DFT_DEC_DFT_NB * STEREO_DFT_BAND_MAX ); + set_zero( hStereoDft->gipd, STEREO_DFT_DEC_DFT_NB ); + set_zero( hStereoDft->itd, STEREO_DFT_DEC_DFT_NB ); + set_zero( hStereoDft->res_pred_gain, STEREO_DFT_DEC_DFT_NB * STEREO_DFT_BAND_MAX ); + + hStereoDft->wasTransient = 0; + hStereoDft->attackPresent = 0; + + hStereoDft->lt_pred_gain = 0.0f; + hStereoDft->lt_pred_gain_variation = 0.0f; + hStereoDft->lt_var_mean_ratio = STEREO_DFT_RES_RATIO_LIMIT; + hStereoDft->stefi_short_gain = 1.0f; + hStereoDft->stefi_long_gain = 0.0f; + + set_zero( hStereoDft->g_state, STEREO_DFT_BAND_MAX ); + + init_basic_allpass( &hStereoDft->ap1, dft_ap_gains[0], dft_ap_delays[0] ); + init_basic_allpass( &hStereoDft->ap2, dft_ap_gains[1], dft_ap_delays[1] ); + init_basic_allpass( &hStereoDft->ap3, dft_ap_gains[2], dft_ap_delays[2] ); + + set_zero( hStereoDft->ap_delay_mem, NS2SA( 16000, DELAY_BWE_TOTAL_NS ) ); + set_zero( hStereoDft->ap_fade_mem, STEREO_DFT_ALLPASS_FADELEN_16k ); + hStereoDft->ap_wasTransient = 0; + set_zero( hStereoDft->smooth_dmx_nrg, STEREO_DFT_BAND_MAX ); + set_zero( hStereoDft->smooth_res_nrg, STEREO_DFT_BAND_MAX ); + + set_s( hStereoDft->core_hist, ACELP_CORE, STEREO_DFT_CORE_HIST_MAX ); + + set_zero( hStereoDft->hb_stefi_sig, L_FRAME48k + NS2SA( 48000, STEREO_DFT_TD_STEFI_DELAY_NS ) ); + set_zero( hStereoDft->hb_nrg, STEREO_DFT_CORE_HIST_MAX ); + set_zero( hStereoDft->td_gain, STEREO_DFT_CORE_HIST_MAX ); + + /* PLC parameters */ + set_zero( hStereoDft->res_mem, STEREO_DFT_RES_BW_MAX ); + hStereoDft->time_offs = 0; + hStereoDft->past_dmx_nrg = 0; + hStereoDft->sg_mean = 0.0f; + hStereoDft->sg_mem_corrupt = 0; + hStereoDft->recovery_flg = 0; + + for ( i = 0; i < SBA_DIRAC_STEREO_NUM_BANDS; i++ ) + { + set_zero( hStereoDft->smooth_buf[i], SBA_DIRAC_NRG_SMOOTH_LONG + 1 ); + } + set_zero( hStereoDft->smooth_fac[0], SBA_DIRAC_STEREO_NUM_BANDS ); + set_zero( hStereoDft->smooth_fac[1], SBA_DIRAC_STEREO_NUM_BANDS ); + + hStereoDft->itd_xfade_target = 0.0f; + hStereoDft->itd_xfade_step = 0.0f; + hStereoDft->itd_xfade_counter = 0; + hStereoDft->itd_xfade_prev = 0.0f; + hStereoDft->last_active_element_brate = 0; + hStereoDft->ipd_xfade_target = 0.0f; + hStereoDft->ipd_xfade_step = 0.0f; + hStereoDft->ipd_xfade_counter = 0; + hStereoDft->ipd_xfade_prev = 0.0f; + + for ( b = 0; b < hStereoDft->nbands; b++ ) + { + for ( i = 0; i < 2; i++ ) + { + for ( j = 0; j < 4; j++ ) + { + hStereoDft->mixer_mat_smooth[i][j][b] = 0.0f; + } + } + } + hStereoDft->first_frame = 1; + hStereoDft->g_L_prev = 0.f; + hStereoDft->g_R_prev = 0.f; + + return; +} + + +/*------------------------------------------------------------------------- + * stereo_dft_dec_update() + * + * Update DFT memories for new frame + *-------------------------------------------------------------------------*/ + +void stereo_dft_dec_update( + STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */ + const int16_t output_frame, /* i : output frame length */ + const int16_t sba_dirac_stereo_flag /* i : signal stereo output for SBA DirAC */ +) +{ + int16_t b, i, k_offset; + + /* Initialization */ + k_offset = STEREO_DFT_OFFSET; /*Add an offset*/ + + /* Update parameters */ + for ( i = 0; i < k_offset * STEREO_DFT_BAND_MAX; i++ ) + { + hStereoDft->side_gain[i] = hStereoDft->side_gain[STEREO_DFT_NBDIV * STEREO_DFT_BAND_MAX + i]; + hStereoDft->res_pred_gain[i] = hStereoDft->res_pred_gain[STEREO_DFT_NBDIV * STEREO_DFT_BAND_MAX + i]; + } + + for ( i = 0; i < k_offset; i++ ) + { + hStereoDft->gipd[i] = hStereoDft->gipd[STEREO_DFT_NBDIV + i]; + } + + /* Update configuration memories */ + for ( i = 0; i < k_offset; i++ ) + { + hStereoDft->band_res[i] = hStereoDft->band_res[i + STEREO_DFT_NBDIV]; + hStereoDft->prm_res[i] = hStereoDft->prm_res[i + STEREO_DFT_NBDIV]; + hStereoDft->itd[i] = hStereoDft->itd[STEREO_DFT_NBDIV + i]; + hStereoDft->res_cod_mode[i] = hStereoDft->res_cod_mode[i + STEREO_DFT_NBDIV]; + hStereoDft->res_pred_mode[i] = hStereoDft->res_pred_mode[i + STEREO_DFT_NBDIV]; + } + + /* Load new configurations */ + set_s( hStereoDft->band_res + k_offset, hStereoDft->hConfig->band_res, STEREO_DFT_NBDIV ); + set_s( hStereoDft->prm_res + k_offset, hStereoDft->hConfig->prm_res, STEREO_DFT_NBDIV ); + set_s( hStereoDft->res_pred_mode + k_offset, hStereoDft->hConfig->res_pred_mode, STEREO_DFT_NBDIV ); + set_s( hStereoDft->res_cod_mode + k_offset, hStereoDft->hConfig->res_cod_mode, STEREO_DFT_NBDIV ); + + /*Update attack info*/ + if ( hStereoDft->attackPresent ) + { + hStereoDft->wasTransient = 1; + } + else if ( hStereoDft->wasTransient ) + { + hStereoDft->wasTransient = 0; + } + + for ( i = STEREO_DFT_CORE_HIST_MAX - 1; i > 0; i-- ) + { + hStereoDft->core_hist[i] = hStereoDft->core_hist[i - 1]; + } + + mvr2r( hStereoDft->hb_stefi_sig + output_frame, hStereoDft->hb_stefi_sig, hStereoDft->hb_stefi_delay ); + mvr2r( hStereoDft->hb_nrg, hStereoDft->hb_nrg + 1, STEREO_DFT_CORE_HIST_MAX - 1 ); + mvr2r( hStereoDft->td_gain, hStereoDft->td_gain + 1, STEREO_DFT_CORE_HIST_MAX - 1 ); + + if ( sba_dirac_stereo_flag ) + { + /* buffer update, push back by 2 because of 2 subframes */ + for ( b = 0; b < hStereoDft->nbands; b++ ) + { + for ( i = SBA_DIRAC_NRG_SMOOTH_LONG; i > 1; i-- ) + { + hStereoDft->smooth_buf[b][i] = hStereoDft->smooth_buf[b][i - 2]; + } + } + } + + return; +} + + +/*------------------------------------------------------------------------- + * stereo_dft_dec_destroy() + * + * destroy DFT stereo handle + *-------------------------------------------------------------------------*/ + +void stereo_dft_dec_destroy( + STEREO_DFT_DEC_DATA_HANDLE *hStereoDft_glob /* i/o: decoder DFT stereo handle */ +) +{ + STEREO_DFT_DEC_DATA_HANDLE hStereoDft; + + hStereoDft = *hStereoDft_glob; + + if ( hStereoDft->hConfig != NULL ) + { + free( hStereoDft->hConfig ); + hStereoDft->hConfig = NULL; + } + + if ( hStereoDft->hBpf != NULL ) + { + free( hStereoDft->hBpf ); + hStereoDft->hBpf = NULL; + } + + if ( hStereoDft->hTcxLtpDec != NULL ) + { + free( hStereoDft->hTcxLtpDec ); + hStereoDft->hTcxLtpDec = NULL; + } + + free( hStereoDft ); + hStereoDft = NULL; + + return; +} + + +/*------------------------------------------------------------------------- + * stereo_dft_dec_analyze() + * + * DFT analysis on a 20ms frame + *-------------------------------------------------------------------------*/ + +void stereo_dft_dec_analyze( + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + const float *input, /* i : input signal */ + float out_DFT[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* o : DFT buffers */ + const int16_t chan, /* i : channel number */ + const int16_t input_frame, /* i : input frame size */ + const int16_t output_frame, /* i : output frame size */ + const DFT_STEREO_DEC_ANA_TYPE ana_type, /* i : type of signal to analyse */ + const int16_t k_offset, /* i : offset of DFT */ + const int16_t delay /* i : delay in samples for input signal */ +) +{ + int16_t i, k; + STEREO_DFT_DEC_DATA_HANDLE hStereoDft; + float *pInput, *pInput_buff; + float *mem, input_buff[STEREO_DFT32MS_OVL_MAX + L_FRAME48k]; + float DFT[STEREO_DFT32MS_N_MAX], *pDFT_out; + int16_t NFFT, NFFT_core, ovl, zp; + int16_t offset; + float fac; + const float *trigo, *win_left, *win_right, *win2; + float trigo_dec[STEREO_DFT32MS_N_MAX / 2 + 1]; + int16_t trigo_step; + int32_t inputFs; + int16_t delay_dec; + int16_t mem_size; + int16_t ovl2; + + push_wmops( "DFT_analysis" ); + + hStereoDft = hCPE->hStereoDft; + + assert( output_frame == STEREO_DFT_NBDIV * hStereoDft->N ); + + /*-----------------------------------------------------------------* + * Initialization + *-----------------------------------------------------------------*/ + + if ( input_frame == output_frame ) + { + trigo = hStereoDft->dft_trigo; + trigo_step = hStereoDft->dft_trigo_step * STEREO_DFT_TRIGO_DEC_STEP; + win_right = hStereoDft->win32ms; + win_left = hStereoDft->win32ms; + win2 = hStereoDft->win232ms; + + if ( ana_type == DFT_STEREO_DEC_ANA_BPF ) + { + assert( ( chan == 0 ) && "DFT stereo: BPF memory only for M channel" ); + mem = hCPE->input_mem_BPF[chan]; + } + else if ( ana_type == DFT_STEREO_DEC_ANA_LB || ana_type == DFT_STEREO_DEC_ANA_LB_ADD ) + { + mem = hCPE->input_mem_LB[chan]; + } + else + { + mem = hCPE->input_mem[chan]; + } + } + else if ( input_frame == L_FRAME ) + { + trigo = hStereoDft->dft_trigo_12k8; + trigo_step = STEREO_DFT_TRIGO_SRATE_12k8_STEP * STEREO_DFT_TRIGO_DEC_STEP; + win_right = hStereoDft->win32ms_12k8; + win_left = hStereoDft->win32ms_12k8; + win2 = hStereoDft->win232ms_12k8; + + if ( ana_type == DFT_STEREO_DEC_ANA_BPF ) + { + assert( ( chan == 0 ) && "DFT stereo: BPF memory only for M channel" ); + mem = hCPE->input_mem_BPF[chan]; + } + else if ( ana_type == DFT_STEREO_DEC_ANA_LB || ana_type == DFT_STEREO_DEC_ANA_LB_ADD ) + { + mem = hCPE->input_mem_LB[chan]; + } + else + { + assert( ( chan == 1 ) && "12.8kHz sampling rate only for second channel, i.e. residual coding or allpass signal" ); + mem = hCPE->input_mem[chan]; + } + } + else if ( input_frame == L_FRAME16k ) + { + trigo = hStereoDft->dft_trigo_16k; + trigo_step = STEREO_DFT_TRIGO_SRATE_16k_STEP * STEREO_DFT_TRIGO_DEC_STEP; + win_right = hStereoDft->win32ms_16k; + win_left = hStereoDft->win32ms_16k; + win2 = hStereoDft->win232ms_16k; + + if ( ana_type == DFT_STEREO_DEC_ANA_BPF ) + { + assert( ( chan == 0 ) && "DFT stereo: BPF memory only for M channel" ); + mem = hCPE->input_mem_BPF[chan]; + } + else if ( ana_type == DFT_STEREO_DEC_ANA_LB || ana_type == DFT_STEREO_DEC_ANA_LB_ADD ) + { + mem = hCPE->input_mem_LB[chan]; + } + else + { + assert( ( chan == 1 ) && hCPE->hStereoDft->hConfig->res_pred_mode == STEREO_DFT_RESPRED_ESF && "16kHz sampling rate only for second channel with allpass signal" ); + mem = hCPE->input_mem[chan]; + } + } + else if ( input_frame == L_FRAME8k ) + { + assert( ( chan == 1 ) && "DFT stereo: 8kHz analysis only for residual coding" ); + trigo = hStereoDft->dft_trigo_8k; + trigo_step = STEREO_DFT_TRIGO_SRATE_8k_STEP * STEREO_DFT_TRIGO_DEC_STEP; + win_right = hStereoDft->win32ms_8k; + win_left = hStereoDft->win32ms_8k; + win2 = hStereoDft->win232ms_8k; + mem = hCPE->input_mem[chan]; + } + else + { + IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error in DFT stereo: sampling rate not supported" ); + mem = NULL; /* to avoid compilation warning */ + trigo = NULL; /* to avoid compilation warning */ + trigo_step = -1; /* to avoid compilation warning */ + win_right = NULL; /* to avoid compilation warning */ + win_left = NULL; /* to avoid compilation warning */ + win2 = NULL; /* to avoid compilation warning */ + } + + inputFs = input_frame * FRAMES_PER_SEC; + delay_dec = NS2SA( inputFs, STEREO_DFT32MS_OVL_NS ); + zp = NS2SA( inputFs, STEREO_DFT32MS_ZP_NS ); + ovl = NS2SA( inputFs, STEREO_DFT32MS_OVL_NS ); + NFFT = NS2SA( inputFs, STEREO_DFT32MS_N_NS ); + fac = (float) ( hStereoDft->NFFT ) / (float) ( NFFT ); + ovl2 = NS2SA( inputFs, STEREO_DFT32MS_OVL2_NS ); + + /* Offset for the time buffers */ + assert( ( delay >= -NS2SA( input_frame * FRAMES_PER_SEC, STEREO_DFT_DELAY_DEC_BWE_NS + STEREO_DFT_OVL_NS / 2 ) ) && ( delay <= NS2SA( input_frame * FRAMES_PER_SEC, STEREO_DFT_OVL_NS ) ) ); + mem_size = delay_dec + delay; + + /* Update buffers */ + mvr2r( mem, input_buff, mem_size ); + mvr2r( input, input_buff + mem_size, input_frame ); + mvr2r( input_buff + input_frame, mem, mem_size ); + pInput_buff = input_buff; + + if ( hCPE->nchan_out == 1 && hCPE->hStereoDft->hConfig->res_cod_mode == STEREO_DFT_RES_COD_OFF ) + { + pop_wmops(); + return; + } + + + /*-----------------------------------------------------------------* + * DFT Analysis: loop over frame + *-----------------------------------------------------------------*/ + + assert( k_offset <= STEREO_DFT_NBDIV ); + + for ( i = 0; i < NFFT / 4; i++ ) + { + trigo_dec[i] = trigo[i * trigo_step]; + trigo_dec[NFFT / 2 - i] = trigo[i * trigo_step]; + } + trigo_dec[NFFT / 4] = trigo[NFFT / 4 * trigo_step]; + + for ( k = 0; k < STEREO_DFT_NBDIV - k_offset; k++ ) + { + set_f( DFT, 0, STEREO_DFT32MS_N_MAX ); + if ( k == 0 ) + { + offset = 0; + } + else + { + /* If OVL2 = OVL offset = 10ms */ + offset = NS2SA( inputFs, STEREO_DFT32MS_WIN_CENTER_NS - STEREO_DFT32MS_OVL2_NS / 2 ); + } + + pInput = pInput_buff + offset; + pDFT_out = out_DFT[chan] + k * STEREO_DFT32MS_N_MAX; + + /*Forwards FFT: L and R*/ + /* Zero Padding & Flat Portion */ + mvr2r( pInput, DFT + zp, NFFT - 2 * zp ); + + /* Overlapping portions */ + if ( k == 0 ) + { + for ( i = 0; i < ovl; i++ ) + { + DFT[i + zp] *= win_left[STEREO_DFT32MS_STEP * i]; + } + for ( i = 0; i < ovl2; i++ ) + { + DFT[NFFT - zp - 1 - i] *= win2[i]; + } + } + else + { + for ( i = 0; i < ovl2; i++ ) + { + DFT[i + zp] *= win2[i]; + } + for ( i = 0; i < ovl; i++ ) + { + DFT[NFFT - zp - i - 1] *= win_right[STEREO_DFT32MS_STEP * i]; + } + } + + rfft( DFT, trigo_dec, NFFT, -1 ); + + /*Resampling: filtering+scaling*/ + if ( ana_type == DFT_STEREO_DEC_ANA_FB || ana_type == DFT_STEREO_DEC_ANA_LB || ana_type == DFT_STEREO_DEC_ANA_NOCORE ) + { + pDFT_out[0] = DFT[0] * fac; /*DC*/ + if ( NFFT == hStereoDft->NFFT ) /*Nyquist*/ + { + pDFT_out[1] = DFT[1] * fac; + } + else + { + pDFT_out[1] = 0.f; + } + for ( i = 2; i < NFFT; i++ ) + { + pDFT_out[i] = DFT[i] * fac; + } + for ( i = NFFT; i < hStereoDft->NFFT; i++ ) + { + pDFT_out[i] = 0.f; + } + } + else if ( ana_type == DFT_STEREO_DEC_ANA_BPF ) + { + pDFT_out[0] -= DFT[0] * fac * dft_bpf_weights[0]; + + for ( i = 1; i < STEREO_DFT_BPF_SIZE; i++ ) + { + pDFT_out[2 * i] -= DFT[2 * i] * fac * dft_bpf_weights[i]; + pDFT_out[2 * i + 1] -= DFT[2 * i + 1] * fac * dft_bpf_weights[i]; + } + } + else if ( ana_type == DFT_STEREO_DEC_ANA_HB_ADD ) + { + NFFT_core = NS2SA( hCPE->hCoreCoder[0]->L_frame * FRAMES_PER_SEC, STEREO_DFT32MS_N_NS ); + + for ( i = NFFT_core; i < NFFT; i++ ) + { + pDFT_out[i] += DFT[i] * fac; + } + } + else + { + pDFT_out[0] += DFT[0] * fac; /*DC*/ + if ( NFFT == hStereoDft->NFFT ) /*Nyquist*/ + { + pDFT_out[1] += DFT[1] * fac; + } + for ( i = 2; i < NFFT; i++ ) + { + pDFT_out[i] += DFT[i] * fac; + } + } + } + + pop_wmops(); + return; +} + +/*------------------------------------------------------------------------- + * stereo_dft_dec_synthesize() + * + * Inverse DFT on a 20ms frame + *-------------------------------------------------------------------------*/ + +void stereo_dft_dec_synthesize( + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + float DFT[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* i : DFT buffers */ + const int16_t chan, /* i : channel number */ + float output[L_FRAME48k], /* o : output synthesis signal */ + const int16_t output_frame /* i : output frame length */ +) +{ + int16_t i, k; + int16_t offset; + STEREO_DFT_DEC_DATA_HANDLE hStereoDft; + float *p_DFT; + const float *win, *win2; + float trigo_dec[STEREO_DFT32MS_N_MAX / 2 + 1]; + int16_t trigo_step; + int16_t ovl, zp, NFFT; + int32_t outputFs; + int16_t ovl2, flat_portion_end; + float ola_buff[STEREO_DFT32MS_OVL2_MAX]; + int16_t moffset; + push_wmops( "DFT_synthesis" ); + + /*-----------------------------------------------------------------* + * Initialization + *-----------------------------------------------------------------*/ + + hStereoDft = hCPE->hStereoDft; + + outputFs = output_frame * FRAMES_PER_SEC; + + zp = NS2SA( outputFs, STEREO_DFT32MS_ZP_NS ); + ovl = NS2SA( outputFs, STEREO_DFT32MS_OVL_NS ); + win = hStereoDft->win32ms; + NFFT = NS2SA( outputFs, STEREO_DFT32MS_N_NS ); + ovl2 = NS2SA( outputFs, STEREO_DFT32MS_OVL2_NS ); + flat_portion_end = NS2SA( outputFs, STEREO_DFT32MS_WIN_CENTER_NS - STEREO_DFT32MS_OVL2_NS / 2 ); + win2 = hStereoDft->win232ms; + + p_DFT = DFT[chan]; + set_f( output, 0, NS2SA( outputFs, FRAME_SIZE_NS ) ); + + /* deactivating the spectrum scrambling on active speech */ + if ( ( chan == 0 && hCPE->hCoreCoder[0]->last_coder_type > UNVOICED ) || hCPE->last_element_mode == IVAS_CPE_MDCT || hCPE->last_element_mode < IVAS_CPE_DFT ) + { + hCPE->stereo_switching_counter = 10; + } + + if ( hCPE->stereo_switching_counter == 0 ) + { + /* Set the level of dispersion */ + hCPE->NbFrameMod = (int16_t) ( 12.0f * max( -0.1f, min( 0.4, hCPE->lt_es_em ) ) + 1.2f + 0.5f ); /* -0.1: -0.4 ; -0.1 -> 0, 0.4 -> 6*/ + } + moffset = max( 0, 6 - hCPE->NbFrameMod ); + + /*-----------------------------------------------------------------* + * Synthesis + *-----------------------------------------------------------------*/ + + trigo_step = hStereoDft->dft_trigo_step * STEREO_DFT_TRIGO_DEC_STEP; + for ( i = 0; i < NFFT / 4; i++ ) + { + trigo_dec[i] = hStereoDft->dft_trigo[i * trigo_step]; + trigo_dec[NFFT / 2 - i] = hStereoDft->dft_trigo[i * trigo_step]; + } + trigo_dec[NFFT / 4] = hStereoDft->dft_trigo[NFFT / 4 * trigo_step]; + + for ( k = 0; k < STEREO_DFT_NBDIV; k++ ) + { + /* scrambling the spectrum */ + if ( hCPE->stereo_switching_counter <= 6 && chan == 1 && ( hCPE->lt_es_em > -0.4f || hCPE->NbFrameMod > 4 ) ) + { + for ( i = 3; i < NFFT - moffset - 1; i++ ) + { + p_DFT[i] = -p_DFT[i + moffset + 1]; + } + } + else if ( hCPE->stereo_switching_counter < 7 && ( hCPE->lt_es_em > 0.2f || hCPE->NbFrameMod > 4 ) ) + { + for ( i = 16 - hCPE->NbFrameMod; i < NFFT - moffset - 1; i++ ) + { + p_DFT[i - 2] = -p_DFT[i + moffset + 1]; + } + } + + /*IFFT*/ + rfft( p_DFT, trigo_dec, NFFT, +1 ); + + if ( k == 0 ) + { + offset = 0; + + /* Left OLA - 3.125ms */ + for ( i = 0; i < ovl; i++ ) + { + output[offset + i] = hCPE->output_mem[chan][i] + p_DFT[zp + i] * win[STEREO_DFT32MS_STEP * i]; + } + /* Flat Portion */ + for ( i = ovl; i < flat_portion_end; i++ ) + { + output[offset + i] = p_DFT[zp + i]; + } + /* Right OLA */ + for ( i = 0; i < ovl2; i++ ) + { + ola_buff[i] = win2[ovl2 - 1 - i] * p_DFT[NFFT - zp - ovl2 + i]; + } + } + else + { + /* If OVL2 = OVL offset = 10ms */ + offset = flat_portion_end; + + /* Left OLA */ + for ( i = 0; i < ovl2; i++ ) + { + output[offset + i] = ola_buff[i] + p_DFT[zp + i] * win2[i]; + } + /* Flat Portion */ + for ( i = ovl2; i < NFFT - 2 * zp - ovl; i++ ) + { + output[offset + i] = p_DFT[zp + i]; + } + /* Right OLA - 3.125ms */ + for ( i = 0; i < ovl; i++ ) + { + hCPE->output_mem[chan][i] = win[STEREO_DFT32MS_STEP * ( ovl - 1 - i )] * p_DFT[NFFT - zp - ovl + i]; + } + } + + p_DFT += STEREO_DFT32MS_N_MAX; + } + + + pop_wmops(); + return; +} + + +/*------------------------------------------------------------------------- + * stereo_dft_dec() + * + * DFT-based stereo main processing function + *-------------------------------------------------------------------------*/ + +void stereo_dft_dec( + STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */ + Decoder_State *st0, /* i/o: decoder state structure */ + float DFT[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* i/o: DFT buffers */ + float *input_mem, /* i/o: mem of buffer DFT analysis */ + STEREO_CNG_DEC_HANDLE hStereoCng, /* i/o: Stereo CNG data structure */ + const int16_t sba_dirac_stereo_flag, /* i : signal stereo output for SBA DirAC */ + const int16_t sba_mono_flag, /* i : signal mono output for SBA DirAC */ + ivas_spar_md_dec_state_t *hMdDec, /* i : SPAR MD handle for upmixing */ + const int16_t cross_fade_start_offset, /* i : SPAR mixer delay compensation */ + const int32_t output_Fs, /* i : Fs for delay calculation */ + const int16_t nchan_transport, /* i : number of transpor channels */ + const int16_t num_md_sub_frames /* i : number of MD subframes */ +) +{ + int16_t i, k, b, N_div, stop; + float DFT_L[STEREO_DFT32MS_N_MAX]; + float DFT_R[STEREO_DFT32MS_N_MAX]; + float DFT_PRED_RES[STEREO_DFT32MS_N_32k]; + float *pDFT_DMX; + float *pDFT_DMX1; + float *pDFT_RES; + float g, tmp; + float *pPredGain; + float *pSideGain; + float c0, s0; + int16_t k_offset; + float *pgIpd; + int16_t NFFT_inner; + float gamma; + float samp_ratio; + int16_t prev_bfi; + float dmx_nrg; + int16_t idx_k0, idx_k1; + int16_t output_frame; + int16_t plocs[STEREO_DFT_RES_N_PEAKS_MAX]; + int16_t num_plocs; + float plocsi[STEREO_DFT_RES_N_PEAKS_MAX]; + float ftmp, N1, N2, coh; + float lev1, lev2, cna_level, scale_fact0, scale_fact, *ptr_per; + HANDLE_FD_CNG_DEC hFdCngDec = st0->hFdCngDec; + HANDLE_FD_CNG_COM hFdCngCom = hFdCngDec->hFdCngCom; + int16_t *cna_seed = &( hFdCngCom->seed ); + float DFT_W, DFT_Y; + + output_frame = (int16_t) ( st0->output_Fs / FRAMES_PER_SEC ); + + /*------------------------------------------------------------------* + * Initialization + *-----------------------------------------------------------------*/ + + samp_ratio = (float) st0->sr_core / (float) st0->output_Fs; + + stop = STEREO_DFT32MS_N_32k / 2; + + /* Analyze nature of current frame */ + hStereoDft->trans = ( ( ( st0->clas_dec == ONSET ) || ( st0->clas_dec == SIN_ONSET ) || ( st0->clas_dec == UNVOICED_CLAS ) || ( st0->clas_dec == UNVOICED_TRANSITION ) ) || ( st0->stab_fac <= 0.25f ) ) || + ( st0->core == TCX_20_CORE && ( ( st0->hTcxCfg->tcx_last_overlap_mode == MIN_OVERLAP ) || ( st0->hTcxCfg->tcx_last_overlap_mode == HALF_OVERLAP ) ) ) || ( st0->core == TCX_10_CORE ); + + + /* Initialization */ + k_offset = 1; + N_div = STEREO_DFT_NBDIV; + prev_bfi = st0->prev_old_bfi; /* The core decoding is already completed here and the prev_bfi has been updated for the next frame. + The prev_old_bfi still holds the prev_bfi for the current frame. */ + /* make sure number of bands corresponds to output bwidth in case it is lower than parameter bwidth */ + if ( output_frame < inner_frame_tbl[st0->bwidth] && !sba_dirac_stereo_flag ) + { + hStereoDft->nbands = stereo_dft_band_config( hStereoDft->band_limits, hStereoDft->band_res[k_offset], hStereoDft->NFFT, DEC ); + } + + if ( !st0->bfi ) + { + /* Smoothing for the current frame */ + if ( sba_dirac_stereo_flag ) + { + ivas_sba_dirac_stereo_smooth_parameters( hStereoDft, hMdDec, cross_fade_start_offset, output_Fs, num_md_sub_frames ); + } + else + { + stereo_dft_dec_smooth_parameters( hStereoDft, hStereoCng->prev_sid_nodata, hStereoCng->active_frame_counter, st0->element_brate ); + } + } + + dmx_nrg = 0.0f; + if ( prev_bfi ) + { + dmx_nrg = stereo_dft_dmx_swb_nrg( DFT[0], DFT[0] + STEREO_DFT32MS_N_MAX, min( hStereoDft->NFFT, STEREO_DFT32MS_N_32k ) ); + } + + +#ifdef DEBUG_PRINT + printf( "\nframe: %d\n", frame ); +#endif + for ( k = 0; k < N_div; k++ ) + { + pDFT_DMX = DFT[0] + k * STEREO_DFT32MS_N_MAX; + pDFT_RES = DFT[1] + k * STEREO_DFT32MS_N_MAX; + pDFT_DMX1 = 0; + if ( nchan_transport > 1 ) + { + pDFT_DMX1 = DFT[1] + k * STEREO_DFT32MS_N_MAX; + } + + /*Apply Stereo*/ + if ( hStereoDft->hConfig->dmx_active ) + { + g = 1.f; + c0 = 1.f; + s0 = 0.f; + + /* since delay is just 3.125ms, the parameters received are used for the second window */ + pSideGain = hStereoDft->side_gain + ( k + k_offset ) * STEREO_DFT_BAND_MAX; + pgIpd = hStereoDft->gipd + ( k + k_offset ); + pPredGain = hStereoDft->res_pred_gain + ( k + k_offset ) * STEREO_DFT_BAND_MAX; + +#ifdef DEBUG_PRINT + if ( k == 0 ) + { + printf( "Window0\n" ); + } + else + { + printf( "Window1\n" ); + } + for ( b = 0; b < hStereoDft->nbands; b++ ) + printf( "%.6f ", pSideGain[b] ); + printf( "\n" ); + for ( b = 0; b < hStereoDft->nbands; b++ ) + printf( "%.6f ", pPredGain[b] ); + printf( "\n" ); +#endif + + /* Use coarse band partition in inactive frames */ + if ( hStereoDft->frame_sid_nodata && !sba_dirac_stereo_flag ) + { + NFFT_inner = STEREO_DFT32MS_N_MAX * inner_frame_tbl[st0->bwidth] / L_FRAME48k; + hStereoDft->nbands = stereo_dft_band_config( hStereoDft->band_limits, 2, NFFT_inner, DEC ); + } + + + if ( st0->bfi ) + { + hStereoDft->past_DMX_pos = ( hStereoDft->past_DMX_pos + STEREO_DFT_PAST_MAX - 1 ) % STEREO_DFT_PAST_MAX; + } + + if ( !( sba_dirac_stereo_flag && nchan_transport >= 2 ) ) + { + stereo_dft_generate_res_pred( hStereoDft, samp_ratio, pDFT_DMX, DFT_PRED_RES, pPredGain, k, DFT[1] + k * STEREO_DFT32MS_N_MAX, &stop, st0->bfi ); + } + + if ( hStereoDft->res_cod_band_max > 0 ) + { + if ( !st0->bfi ) + { + if ( k == 1 ) + { + mvr2r( pDFT_RES, hStereoDft->res_mem, 2 * hStereoDft->band_limits[hStereoDft->res_cod_band_max] ); + hStereoDft->time_offs = 0; + } + } + else + { + stereo_dft_res_ecu( hStereoDft, pDFT_RES, DFT_PRED_RES, k, output_frame, prev_bfi, dmx_nrg, &num_plocs, plocs, plocsi, input_mem ); + } + } + + /* Apply active DMX */ + /* pDFT_RES is used for the second channel in inactive frames */ + if ( hStereoDft->frame_sid_nodata && !sba_dirac_stereo_flag ) + { + DFT_L[0] = pDFT_DMX[0]; + DFT_R[0] = pDFT_RES[0]; + } + else + { + DFT_L[0] = pDFT_DMX[0]; + DFT_R[0] = pDFT_DMX[0]; + } + + if ( hStereoDft->frame_sid_nodata || st0->VAD == 0 ) + { + hFdCngDec->cna_nbands = 0; + } + + for ( b = 0; b < hStereoDft->nbands; b++ ) + { + g = pSideGain[b]; + if ( hStereoDft->frame_sid_nodata && !sba_dirac_stereo_flag ) + { + g = hStereoDft->g_state[b]; + } + + /* store side gains from inactive frames for later use by the stereo CNA */ + if ( hStereoDft->band_limits[b] < L_FRAME16k && ( hStereoDft->frame_sid_nodata || st0->VAD == 0 ) ) + { + hFdCngDec->cna_nbands = b + 1; + hFdCngDec->cna_band_limits[b] = hStereoDft->band_limits[b]; + hFdCngDec->cna_g_state[b] = g; + } + + /* No residual coding in inactive frames, instead pDFT_RES is used for the second channel */ + if ( b >= hStereoDft->res_cod_band_max && !hStereoDft->frame_sid_nodata && !( sba_dirac_stereo_flag && hMdDec ) ) + { + /*filter non-coded frequencies. It removes some MDCT frequency aliasing*/ + for ( i = hStereoDft->band_limits[b]; i < hStereoDft->band_limits[b + 1]; i++ ) + { + pDFT_RES[2 * i] = 0.f; + pDFT_RES[2 * i + 1] = 0.f; + } + } + + if ( hStereoDft->frame_sid_nodata && !sba_dirac_stereo_flag ) + { + /* Low pass filter coherence */ + /* store coherence from inactive frames for later use by the stereo CNA */ + hFdCngDec->cna_cm[b] = hStereoCng->cm[b]; + + /* Calculate gamma */ + if ( hStereoCng->cm[b] < 0.9f ) + { + gamma = hStereoCng->cm[b]; + gamma = gamma / ( 1 - gamma ); + gamma = sqrtf( gamma + 1 - g * g ) - sqrtf( gamma ); + } + else + { + gamma = 0; + } + + for ( i = hStereoDft->band_limits[b]; i < hStereoDft->band_limits[b + 1]; i++ ) + { + /* Create L and R signals with the correct coherence by mixing channel 0 (pDFT_DMX) and channel 1 (pDFT_RES) */ + DFT_L[2 * i] = ( 1 + g ) * pDFT_DMX[2 * i] + gamma * pDFT_RES[2 * i]; + DFT_R[2 * i] = ( 1 - g ) * pDFT_DMX[2 * i] - gamma * pDFT_RES[2 * i]; + + DFT_L[2 * i + 1] = ( 1 + g ) * pDFT_DMX[2 * i + 1] + gamma * pDFT_RES[2 * i + 1]; + DFT_R[2 * i + 1] = ( 1 - g ) * pDFT_DMX[2 * i + 1] - gamma * pDFT_RES[2 * i + 1]; + } + + if ( pgIpd[0] != 0.f ) + { + c0 = cosf( pgIpd[0] ); + s0 = sinf( pgIpd[0] ); + for ( i = hStereoDft->band_limits[b]; i < hStereoDft->band_limits[b + 1]; i++ ) + { + /*rotate L*/ + tmp = DFT_L[2 * i] * c0 - DFT_L[2 * i + 1] * s0; + DFT_L[2 * i + 1] = DFT_L[2 * i] * s0 + DFT_L[2 * i + 1] * c0; + DFT_L[2 * i] = tmp; + } + } + } + else if ( sba_dirac_stereo_flag && hMdDec ) + { + + if ( nchan_transport == 1 ) + { + if ( sba_mono_flag ) + { + if ( b == 0 ) + { + i = 0; + + DFT_W = hStereoDft->mixer_mat_smooth[0][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i]; + DFT_L[2 * i] = DFT_W; + DFT_R[2 * i] = 0.f; + + DFT_W = hStereoDft->mixer_mat_smooth[0][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i + 1]; + DFT_L[2 * i + 1] = DFT_W; + DFT_R[2 * i + 1] = 0.f; + } + for ( i = hStereoDft->band_limits[b]; i < min( stop, hStereoDft->band_limits[b + 1] ); i++ ) + { + DFT_W = hStereoDft->mixer_mat_smooth[0][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i] + ( hStereoDft->mixer_mat_smooth[0][1][b + k * IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[0][2][b + k * IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[0][3][b + k * IVAS_MAX_NUM_BANDS] ) * DFT_PRED_RES[2 * i]; + DFT_L[2 * i] = DFT_W; + DFT_R[2 * i] = 0.f; + + DFT_W = hStereoDft->mixer_mat_smooth[0][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i + 1] + ( hStereoDft->mixer_mat_smooth[0][1][b + k * IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[0][2][b + k * IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[0][3][b + k * IVAS_MAX_NUM_BANDS] ) * DFT_PRED_RES[2 * i + 1]; + DFT_L[2 * i + 1] = DFT_W; + DFT_R[2 * i + 1] = 0.f; + } + for ( ; i < hStereoDft->band_limits[b + 1]; i++ ) + { + DFT_W = hStereoDft->mixer_mat_smooth[0][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i]; + DFT_L[2 * i] = DFT_W; + DFT_R[2 * i] = 0.f; + + DFT_W = hStereoDft->mixer_mat_smooth[0][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i + 1]; + DFT_L[2 * i + 1] = DFT_W; + DFT_R[2 * i + 1] = 0.f; + } + } + else + { + if ( b == 0 ) + { + i = 0; + + DFT_W = hStereoDft->mixer_mat_smooth[0][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i]; + DFT_Y = hStereoDft->mixer_mat_smooth[1][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i]; + + DFT_L[2 * i] = DFT_W + DFT_Y; + DFT_R[2 * i] = DFT_W - DFT_Y; + + DFT_W = hStereoDft->mixer_mat_smooth[0][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i + 1]; + DFT_Y = hStereoDft->mixer_mat_smooth[1][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i + 1]; + + DFT_L[2 * i + 1] = DFT_W + DFT_Y; + DFT_R[2 * i + 1] = DFT_W - DFT_Y; + } + for ( i = hStereoDft->band_limits[b]; i < min( stop, hStereoDft->band_limits[b + 1] ); i++ ) + { + DFT_W = hStereoDft->mixer_mat_smooth[0][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i] + ( hStereoDft->mixer_mat_smooth[0][1][b + k * IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[0][2][b + k * IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[0][3][b + k * IVAS_MAX_NUM_BANDS] ) * DFT_PRED_RES[2 * i]; + DFT_Y = hStereoDft->mixer_mat_smooth[1][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i] + ( hStereoDft->mixer_mat_smooth[1][1][b + k * IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[1][2][b + k * IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[1][3][b + k * IVAS_MAX_NUM_BANDS] ) * DFT_PRED_RES[2 * i]; + + DFT_L[2 * i] = DFT_W + DFT_Y; + DFT_R[2 * i] = DFT_W - DFT_Y; + + DFT_W = hStereoDft->mixer_mat_smooth[0][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i + 1] + ( hStereoDft->mixer_mat_smooth[0][1][b + k * IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[0][2][b + k * IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[0][3][b + k * IVAS_MAX_NUM_BANDS] ) * DFT_PRED_RES[2 * i + 1]; + DFT_Y = hStereoDft->mixer_mat_smooth[1][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i + 1] + ( hStereoDft->mixer_mat_smooth[1][1][b + k * IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[1][2][b + k * IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[1][3][b + k * IVAS_MAX_NUM_BANDS] ) * DFT_PRED_RES[2 * i + 1]; + + DFT_L[2 * i + 1] = DFT_W + DFT_Y; + DFT_R[2 * i + 1] = DFT_W - DFT_Y; + } + for ( ; i < hStereoDft->band_limits[b + 1]; i++ ) + { + DFT_W = hStereoDft->mixer_mat_smooth[0][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i]; + DFT_Y = hStereoDft->mixer_mat_smooth[1][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i]; + + DFT_L[2 * i] = DFT_W + DFT_Y; + DFT_R[2 * i] = DFT_W - DFT_Y; + + DFT_W = hStereoDft->mixer_mat_smooth[0][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i + 1]; + DFT_Y = hStereoDft->mixer_mat_smooth[1][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i + 1]; + + DFT_L[2 * i + 1] = DFT_W + DFT_Y; + DFT_R[2 * i + 1] = DFT_W - DFT_Y; + } + } + } + else if ( nchan_transport >= 2 ) + { + if ( b == 0 ) + { + i = 0; + + DFT_W = pDFT_DMX[2 * i]; + DFT_Y = hStereoDft->mixer_mat_smooth[1][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i] + pDFT_DMX1[2 * i]; + + DFT_L[2 * i] = DFT_W + DFT_Y; + DFT_R[2 * i] = DFT_W - DFT_Y; + + DFT_W = pDFT_DMX[2 * i + 1]; + DFT_Y = hStereoDft->mixer_mat_smooth[1][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i + 1] + pDFT_DMX1[2 * i + 1]; + + DFT_L[2 * i + 1] = DFT_W + DFT_Y; + DFT_R[2 * i + 1] = DFT_W - DFT_Y; + } + for ( i = hStereoDft->band_limits[b]; i < hStereoDft->band_limits[b + 1]; i++ ) + { + DFT_W = pDFT_DMX[2 * i]; + DFT_Y = hStereoDft->mixer_mat_smooth[1][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i] + pDFT_DMX1[2 * i]; + + DFT_L[2 * i] = DFT_W + DFT_Y; + DFT_R[2 * i] = DFT_W - DFT_Y; + + DFT_W = pDFT_DMX[2 * i + 1]; + DFT_Y = hStereoDft->mixer_mat_smooth[1][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i + 1] + pDFT_DMX1[2 * i + 1]; + + DFT_L[2 * i + 1] = DFT_W + DFT_Y; + DFT_R[2 * i + 1] = DFT_W - DFT_Y; + } + } + else + { + assert( "nhcan_transport must be 1 or 1!" ); + } + } + else + { + for ( i = hStereoDft->band_limits[b]; i < min( stop, hStereoDft->band_limits[b + 1] ); i++ ) + { + tmp = g * pDFT_DMX[2 * i] + pDFT_RES[2 * i] + DFT_PRED_RES[2 * i]; + + DFT_L[2 * i] = pDFT_DMX[2 * i] + tmp; + DFT_R[2 * i] = pDFT_DMX[2 * i] - tmp; + + tmp = g * pDFT_DMX[2 * i + 1] + pDFT_RES[2 * i + 1] + DFT_PRED_RES[2 * i + 1]; + + DFT_L[2 * i + 1] = pDFT_DMX[2 * i + 1] + tmp; + DFT_R[2 * i + 1] = pDFT_DMX[2 * i + 1] - tmp; + + } + + for ( ; i < hStereoDft->band_limits[b + 1]; i++ ) + { + tmp = g * pDFT_DMX[2 * i] + pDFT_RES[2 * i]; + + DFT_L[2 * i] = pDFT_DMX[2 * i] + tmp; + DFT_R[2 * i] = pDFT_DMX[2 * i] - tmp; + + tmp = g * pDFT_DMX[2 * i + 1] + pDFT_RES[2 * i + 1]; + + DFT_L[2 * i + 1] = pDFT_DMX[2 * i + 1] + tmp; + DFT_R[2 * i + 1] = pDFT_DMX[2 * i + 1] - tmp; + + } + + /* Active Upmix */ + if ( pgIpd[0] != 0.f ) + { + c0 = cosf( pgIpd[0] ); + s0 = sinf( pgIpd[0] ); + for ( i = hStereoDft->band_limits[b]; i < hStereoDft->band_limits[b + 1]; i++ ) + { + /*rotate L*/ + tmp = DFT_L[2 * i] * c0 - DFT_L[2 * i + 1] * s0; + DFT_L[2 * i + 1] = DFT_L[2 * i] * s0 + DFT_L[2 * i + 1] * c0; + DFT_L[2 * i] = tmp; + } + } + } + } + + if ( hStereoDft->frame_sid_nodata || st0->VAD == 0 ) + { + hFdCngDec->cna_band_limits[hFdCngDec->cna_nbands] = hStereoDft->band_limits[hFdCngDec->cna_nbands]; + } + + if ( hStereoDft->frame_sid_nodata && !sba_dirac_stereo_flag ) + { + hStereoCng->first_SID = 0; + hStereoCng->first_SID_after_TD = 0; + } + + for ( i = hStereoDft->band_limits[b]; i < hStereoDft->NFFT / 2; i++ ) + { + DFT_L[2 * i] = 0.f; + DFT_L[2 * i + 1] = 0.f; + DFT_R[2 * i] = 0.f; + DFT_R[2 * i + 1] = 0.f; + } + + /*Nyquist Freq.*/ + if ( hStereoDft->band_limits[b] == hStereoDft->NFFT / 2 ) + { + DFT_L[1] = pDFT_DMX[1] + g * pDFT_DMX[1]; + DFT_R[1] = pDFT_DMX[1] - g * pDFT_DMX[1]; + DFT_L[1] *= INV_SQRT_2; + DFT_R[1] *= INV_SQRT_2; + } + else + { + DFT_L[1] = 0.f; + DFT_R[1] = 0.f; + } + } + else + { + pPredGain = NULL; /* to avoid compilation warnings */ + pSideGain = NULL; + + /* Dummy upmix-> mono binauralization */ + for ( i = 0; i < hStereoDft->NFFT; i++ ) + { + DFT_L[i] = ( pDFT_DMX[i] + pDFT_RES[i] ); + DFT_R[i] = ( pDFT_DMX[i] - pDFT_RES[i] ); + } + } + + /* Comfort Noise Addition */ + if ( st0->flag_cna ) + { + ptr_per = &hFdCngDec->smoothed_psd[hFdCngCom->startBand]; + + scale_fact0 = 0.0f; + if ( hFdCngDec->cna_rescale_fact > 0 ) + { + scale_fact0 = output_frame / 2 * sqrtf( hFdCngDec->cna_rescale_fact * 0.5f ); + } + + for ( b = 0; b < hFdCngDec->cna_nbands; b++ ) + { + /* calculate gamma factor reflecting inter-channel correlation and side gain (ILD) */ + coh = hFdCngDec->cna_cm[b]; + g = hFdCngDec->cna_g_state[b]; + + if ( coh < 0.9f ) + { + gamma = coh; + gamma = gamma / ( 1 - gamma ); + gamma = sqrtf( gamma + 1 - g * g ) - sqrtf( gamma ); + } + else + { + gamma = 0; + } + + for ( i = max( hFdCngDec->cna_band_limits[b], hFdCngCom->startBand / 2 ); i < min( hFdCngDec->cna_band_limits[b + 1], L_FRAME16k / 2 ); i++ ) + { + lev1 = *ptr_per++; + lev2 = *ptr_per++; + + if ( lev1 > 0 && lev2 > 0 && max( lev1, lev2 ) / min( lev1, lev2 ) > 1.2f ) + { + /* take the minimum of two adjacent frequency bins */ + cna_level = min( lev1, lev2 ); + } + else + { + /* take the average of two adjacent frequency bins */ + cna_level = 0.5f * ( lev1 + lev2 ); + } + + scale_fact = scale_fact0 * sqrtf( cna_level ); + + /* generate comfort noise from gaussian noise and add to the decoded DFT spectrum */ + N1 = scale_fact * rand_gauss( &ftmp, cna_seed ); + N2 = scale_fact * rand_gauss( &ftmp, cna_seed ); + DFT_L[2 * i] += ( 1 + g ) * N1 + gamma * N2; + DFT_R[2 * i] += ( 1 - g ) * N1 - gamma * N2; + + N1 = scale_fact * rand_gauss( &ftmp, cna_seed ); + N2 = scale_fact * rand_gauss( &ftmp, cna_seed ); + DFT_L[2 * i + 1] += ( 1 + g ) * N1 + gamma * N2; + DFT_R[2 * i + 1] += ( 1 - g ) * N1 - gamma * N2; + } + } + + /* update CNA re-scaling factor */ + hFdCngDec->cna_rescale_fact = 0.8f * hFdCngDec->cna_act_fact; + if ( !hFdCngDec->first_cna_noise_updated ) + { + hFdCngDec->cna_rescale_fact = 0; + } + } + + /* Update memories */ + hStereoDft->past_DMX_pos = ( hStereoDft->past_DMX_pos + 1 ) % STEREO_DFT_PAST_MAX; + mvr2r( pDFT_DMX, hStereoDft->DFT_past_DMX[hStereoDft->past_DMX_pos], min( hStereoDft->NFFT, STEREO_DFT32MS_N_32k ) ); + if ( pPredGain ) + { + stereo_dft_adapt_sf_delay( hStereoDft, pPredGain ); + } + + mvr2r( DFT_L, DFT[0] + k * STEREO_DFT32MS_N_MAX, hStereoDft->NFFT ); + mvr2r( DFT_R, DFT[1] + k * STEREO_DFT32MS_N_MAX, hStereoDft->NFFT ); + } + + if ( st0->bfi && !prev_bfi ) + { + idx_k0 = ( hStereoDft->past_DMX_pos + STEREO_DFT_PAST_MAX - 1 ) % STEREO_DFT_PAST_MAX; + idx_k1 = ( idx_k0 + 1 ) % STEREO_DFT_PAST_MAX; + /*dmx energy memory*/ + hStereoDft->past_dmx_nrg = stereo_dft_dmx_swb_nrg( hStereoDft->DFT_past_DMX[idx_k0], hStereoDft->DFT_past_DMX[idx_k1], min( hStereoDft->NFFT, STEREO_DFT32MS_N_32k ) ); + } + + stereo_dft_compute_td_stefi_params( hStereoDft, samp_ratio ); + + return; +} + + +/*------------------------------------------------------------------------- + * stereo_dft_dec_res() + * + * Decode the residual signal + *-------------------------------------------------------------------------*/ + +void stereo_dft_dec_res( + CPE_DEC_HANDLE hCPE, /* i/o: decoder CPE handle */ + float res_buf[STEREO_DFT_BUF_MAX], /* i : residual buffer */ + float *output /* o : output */ +) +{ + int16_t i; + float win[L_FRAME8k + STEREO_DFT_OVL_8k]; + float bpf_error_signal_8k[L_FRAME8k]; + int16_t prev_bfi; + float fac, step; + int16_t res_bpf_flag; + + prev_bfi = hCPE->hCoreCoder[0]->prev_old_bfi; /* The core decoding is already completed here and the prev_bfi has been updated for the next frame. + The prev_old_bfi still holds the prev_bfi for the current frame. */ + + /* flush memories when switching residual coding on */ + if ( hCPE->hStereoDft->res_cod_mode[STEREO_DFT_OFFSET - 1] == STEREO_DFT_RES_COD_OFF ) + { + set_zero( hCPE->hStereoDft->res_cod_mem, STEREO_DFT_OVL_8k ); + set_zero( hCPE->input_mem[1], NS2SA( 8000, STEREO_DFT32MS_OVL_NS ) ); + set_zero( hCPE->hStereoDft->hBpf->pst_old_syn, STEREO_DFT_NBPSF_PIT_MAX_8k ); + hCPE->hStereoDft->hBpf->pst_mem_deemp_err = 0.f; + } + + /*Inverse MDCT*/ + TCX_MDCT_Inverse( res_buf, win, STEREO_DFT_OVL_8k, L_FRAME8k - STEREO_DFT_OVL_8k, STEREO_DFT_OVL_8k, IVAS_CPE_DFT ); + + if ( !prev_bfi ) + { + /*OLA*/ + /*overlapping parts*/ + for ( i = 0; i < STEREO_DFT_OVL_8k; i++ ) + { + win[i] = hCPE->hStereoDft->res_cod_mem[i] + win[i] * hCPE->hStereoDft->win_8k[i]; + hCPE->hStereoDft->res_cod_mem[i] = win[L_FRAME8k + i] * hCPE->hStereoDft->win_8k[STEREO_DFT_OVL_8k - 1 - i]; + } + } + else + { + /* For first good frame, ola memory contains extended ECU buffer -- need to crossfade instead of OLA */ + step = (float) ( 1.0f / STEREO_DFT_OVL_8k ); + fac = 0; + for ( i = 0; i < STEREO_DFT_OVL_8k; i++ ) + { + win[i] = ( 1.0f - fac * fac ) * hCPE->hStereoDft->res_cod_mem[i] + ( 1.0f - ( 1.0f - fac ) * ( 1.0f - fac ) ) * win[i] * hCPE->hStereoDft->win_8k[i]; + hCPE->hStereoDft->res_cod_mem[i] = win[L_FRAME8k + i] * hCPE->hStereoDft->win_8k[STEREO_DFT_OVL_8k - 1 - i]; + fac += step; + } + } + + mvr2r( win, output, L_FRAME8k ); + + if ( hCPE->hCoreCoder[0]->core == ACELP_CORE ) + { + /* bass post-filter */ + bass_psfilter( hCPE->hStereoDft->hBpf, hCPE->hCoreCoder[0]->Opt_AMR_WB, output, L_FRAME8k, hCPE->hCoreCoder[0]->old_pitch_buf + ( L_FRAME8k / STEREO_DFT_L_SUBFR_8k ), hCPE->hCoreCoder[0]->bpf_off, + hCPE->hCoreCoder[0]->stab_fac, &hCPE->hStereoDft->stab_fac_smooth_res, hCPE->hCoreCoder[0]->last_coder_type, bpf_error_signal_8k ); + + res_bpf_flag = res_bpf_adapt( hCPE->hStereoDft, bpf_error_signal_8k, res_buf ); + if ( prev_bfi ) + { + /* Ramp up BPF contribution for the first good frame */ + step = (float) ( 1.0f / L_FRAME8k ); + fac = 0; + for ( i = 0; i < L_FRAME8k; i++ ) + { + bpf_error_signal_8k[i] *= fac; + fac += step; + } + } + + if ( res_bpf_flag ) + { + v_sub( output, bpf_error_signal_8k, output, L_FRAME8k ); + } + } + else if ( hCPE->hCoreCoder[0]->last_core == ACELP_CORE ) + { + set_zero( hCPE->hStereoDft->hBpf->pst_old_syn, STEREO_DFT_NBPSF_PIT_MAX_8k ); + hCPE->hStereoDft->hBpf->pst_mem_deemp_err = 0.f; + } + + return; +} + + +/*------------------------------------------------------------------------- + * stereo_dft_dec_read_BS() + * + * Read bitstream + *-------------------------------------------------------------------------*/ + +void stereo_dft_dec_read_BS( + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + const int32_t element_brate, /* i : element bitrate */ + int32_t *total_brate, /* o : total bitrate */ + Decoder_State *st, /* i/o: decoder state structure */ + STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder stereo handle */ + const int16_t bwidth, /* i : bandwidth */ + const int16_t output_frame, /* i : output frame length */ + float res_buf[STEREO_DFT_BUF_MAX], /* o : residual buffer */ + int16_t *nb_bits, /* o : number of bits read */ + float *coh, /* i/o: Coherence */ + const int16_t ivas_format /* i : ivas format */ +) +{ + int16_t b, N_div, nbands; + int16_t NFFT_inner; + int16_t k, k_offset; + int16_t I; + int16_t max_bits; + uint16_t bit_stream_side[800]; /*Max bits per frame for 30kbps*/ + RangeUniDecState range_uni_dec_state; + ECSQ_instance ecsq_inst; + + /* needed for provisorial reordering of indices */ + int16_t ind1[STEREO_DFT_BAND_MAX]; + int16_t n_bits; + int16_t nb, ind1_ipd[STEREO_DFT_BAND_MAX], ind1_pred[STEREO_DFT_BAND_MAX]; + int16_t sign_flag; + float sg_tmp[STEREO_DFT_BAND_MAX]; + float res_pred_gain_tmp[STEREO_DFT_BAND_MAX]; + int16_t itd_mode; + + /*------------------------------------------------------------------* + * Initialization + *-----------------------------------------------------------------*/ + + k_offset = STEREO_DFT_OFFSET; + + if ( ivas_total_brate == IVAS_SID_5k2 ) + { + if ( ivas_format == MASA_FORMAT ) + { + hStereoDft->frame_nodata = 0; + hStereoDft->frame_sid_nodata = 1; + hStereoDft->frame_sid = 1; + *nb_bits = 0; + } + else + { + hStereoDft->frame_nodata = 0; + hStereoDft->frame_sid_nodata = 1; + hStereoDft->frame_sid = 1; + *nb_bits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; + } + } + else if ( ivas_total_brate == FRAME_NO_DATA ) + { + hStereoDft->frame_nodata = 1; + hStereoDft->frame_sid_nodata = 1; + hStereoDft->frame_sid = 0; + *nb_bits = 0; + *total_brate = 0; + hStereoDft->itd[k = hStereoDft->prm_res[k_offset] - 1 + k_offset] = hStereoDft->itd_xfade_target; + hStereoDft->gipd[hStereoDft->prm_res[k_offset] - 1 + k_offset] = hStereoDft->ipd_xfade_target; + + return; + } + else + { + hStereoDft->frame_nodata = 0; + hStereoDft->frame_sid_nodata = 0; + hStereoDft->frame_sid = 0; + + st->total_brate = *nb_bits * FRAMES_PER_SEC; + } + + hStereoDft->reverb_flag = 0; + + /* reverse the bitstream */ + for ( b = 0; b < *nb_bits; b++ ) + { + bit_stream_side[b] = st->bit_stream[-b]; + } + + /* make sure the padding bits read ahead by the arithmetic coder (up to 16) or range coder (up to 32) have binary values */ + for ( ; b < *nb_bits + 32; b++ ) + { + bit_stream_side[b] = 0; + } + st->bit_stream = bit_stream_side; + + /*init*/ + max_bits = *nb_bits; + *nb_bits = 0; + N_div = STEREO_DFT_NBDIV; + + if ( ivas_total_brate > IVAS_SID_5k2 ) + { + mvr2r( hStereoDft->side_gain + 2 * STEREO_DFT_BAND_MAX, sg_tmp, STEREO_DFT_BAND_MAX ); + mvr2r( hStereoDft->res_pred_gain + 2 * STEREO_DFT_BAND_MAX, res_pred_gain_tmp, STEREO_DFT_BAND_MAX ); + } + + /* attackPresent always set to 0 in SID frames */ + if ( hStereoDft->frame_sid ) + { + hStereoDft->attackPresent = 0; + } + else + { + hStereoDft->attackPresent = get_next_indice( st, 1 ); + ( *nb_bits )++; + } + + /* read res_cod_mode from bitstream */ + if ( bwidth == WB && hStereoDft->hConfig->ada_wb_res_cod_mode ) + { + hStereoDft->res_cod_mode[k_offset] = get_next_indice( st, 1 ); + ( *nb_bits )++; + } + + /* read number of bands in the bitstream - depends on the audio bandwidth and not to output_Fs */ + if ( hStereoDft->frame_sid ) + { + NFFT_inner = STEREO_DFT32MS_N_MAX * inner_frame_tbl[bwidth] / L_FRAME48k; + } + else + { + NFFT_inner = STEREO_DFT32MS_N_MAX * inner_frame_tbl[st->bwidth] / L_FRAME48k; + } + + /* Use coarse band partition in inactive frames */ + if ( hStereoDft->frame_sid ) + { + hStereoDft->band_res[k_offset] = STEREO_DFT_BAND_RES_LOW; + hStereoDft->res_cod_mode[k_offset] = STEREO_DFT_RES_COD_OFF; + hStereoDft->nbands = stereo_dft_band_config( hStereoDft->band_limits, hStereoDft->band_res[k_offset], min( STEREO_DFT32MS_N_MAX, NFFT_inner ), DEC ); + + if ( hStereoDft->nbands > STEREO_DFT_COH_MAXBAND ) + { + hStereoDft->band_limits[STEREO_DFT_COH_MAXBAND] = hStereoDft->band_limits[hStereoDft->nbands]; + hStereoDft->nbands = STEREO_DFT_COH_MAXBAND; + } + } + else + { + hStereoDft->nbands = stereo_dft_band_config( hStereoDft->band_limits, hStereoDft->band_res[k_offset], NFFT_inner, DEC ); + } + + hStereoDft->res_cod_band_max = dft_band_res_cod[hStereoDft->band_res[k_offset]][hStereoDft->res_cod_mode[k_offset]]; + hStereoDft->res_cod_line_max = (int16_t) ( 0.5f + ( hStereoDft->band_limits[hStereoDft->res_cod_band_max] - 1 ) * 2.f * output_frame / (float) ( hStereoDft->NFFT ) ); + hStereoDft->res_cod_line_max = 8 * ( hStereoDft->res_cod_line_max / 8 ); + hStereoDft->res_pred_band_min = max( STEREO_DFT_RES_PRED_BAND_MIN, hStereoDft->res_cod_band_max ); + + + /*Copy config. for all DFT frames*/ + set_s( hStereoDft->band_res + k_offset + 1, hStereoDft->band_res[k_offset], N_div - 1 ); + set_s( hStereoDft->prm_res + k_offset + 1, hStereoDft->prm_res[k_offset], N_div - 1 ); + set_s( hStereoDft->res_pred_mode + k_offset + 1, hStereoDft->res_pred_mode[k_offset], N_div - 1 ); + set_s( hStereoDft->res_cod_mode + k_offset + 1, hStereoDft->res_cod_mode[k_offset], N_div - 1 ); + + /*------------------------------------------------------------------* + * Read DFT stereo parameters + *-----------------------------------------------------------------*/ + + /* Sent from the latest to the oldest */ + for ( k = hStereoDft->prm_res[k_offset] - 1; k < N_div; k += hStereoDft->prm_res[k + k_offset] ) + { + /* reset parameters */ + set_zero( hStereoDft->side_gain + ( k + k_offset ) * STEREO_DFT_BAND_MAX, STEREO_DFT_BAND_MAX ); + hStereoDft->gipd[k + k_offset] = 0.f; + set_zero( hStereoDft->res_pred_gain + ( k + k_offset ) * STEREO_DFT_BAND_MAX, STEREO_DFT_BAND_MAX ); + + + if ( !( ivas_format == MASA_FORMAT && ivas_total_brate <= IVAS_SID_5k2 ) ) + { + /*------------------------------------------------------------------* + * read Side gains + *-----------------------------------------------------------------*/ + + /* side gain */ + /* get coding type */ + /* Do not read and decode side gain if a NO_DATA frame */ + if ( !hStereoDft->frame_nodata ) + { + n_bits = 0; + nb = st->next_bit_pos; + n_bits = read_flag_EC_DFT( &st->bit_stream[nb], &hStereoDft->side_gain_flag_1 ); + nb += n_bits; + + if ( hStereoDft->side_gain_flag_1 == 0 ) + { + b = read_BS_adapt_GR_sg( st->bit_stream, nb, ind1, hStereoDft->nbands, &hStereoDft->side_gain_flag_2, dft_maps_sg ); + n_bits += b; + } + else + { + if ( hStereoDft->side_gain_flag_1 == 2 ) /* differential */ + { + b = read_BS_GR( st->bit_stream, nb, ind1, hStereoDft->nbands, &hStereoDft->side_gain_flag_2 ); + n_bits += b; + for ( b = 0; b < hStereoDft->nbands; b++ ) + { + ind1[b] += hStereoDft->side_gain_index_previous[b]; + } + } + else + { + for ( b = 0; b < hStereoDft->nbands; b++ ) + { + ind1[b] = get_value( &st->bit_stream[nb], STEREO_DFT_SIDEGAIN_NBITS ); + nb += STEREO_DFT_SIDEGAIN_NBITS; + n_bits += STEREO_DFT_SIDEGAIN_NBITS; + } + } + } + + for ( b = 0; b < hStereoDft->nbands; b++ ) + { + hStereoDft->side_gain_index_previous[b] = ind1[b]; + + hStereoDft->res_gains_ind[0][b + STEREO_DFT_BAND_MAX] = ind1[b]; + } + + st->next_bit_pos += n_bits; + ( *nb_bits ) += n_bits; + } + + /*------------------------------------------------------------------* + * read ITDs + *-----------------------------------------------------------------*/ + + if ( !hStereoDft->frame_sid_nodata ) + { + itd_mode = get_next_indice( st, STEREO_DFT_ITD_MODE_NBITS ); + ( *nb_bits ) += STEREO_DFT_ITD_MODE_NBITS; /*ITD mode flag: 1bit*/ + + hStereoDft->itd[k + k_offset] = 0.f; + if ( itd_mode ) + { + ( *nb_bits ) += read_itd( st, &I ); + stereo_dft_dequantize_itd( &I, hStereoDft->itd + k + k_offset, st->output_Fs ); + } + } + else if ( *nb_bits <= ( ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - STEREO_DFT_ITD_MODE_NBITS - STEREO_DFT_SID_ITD_NBITS - 1 - SID_FORMAT_NBITS ) ) + { + itd_mode = get_next_indice( st, STEREO_DFT_ITD_MODE_NBITS ); + ( *nb_bits ) += STEREO_DFT_ITD_MODE_NBITS; /*ITD mode flag: 1bit*/ + + hStereoDft->itd[k + k_offset] = 0.f; + if ( itd_mode ) + { + sign_flag = get_next_indice( st, 1 ); + I = get_next_indice( st, STEREO_DFT_SID_ITD_NBITS ); + ( *nb_bits ) += STEREO_DFT_SID_ITD_NBITS + 1; + I = I << STEREO_DFT_SID_ITD_FAC; + I += 256 * sign_flag; + stereo_dft_dequantize_itd( &I, hStereoDft->itd + k + k_offset, st->output_Fs ); + } + } + + /*------------------------------------------------------------------* + * read IPDs + *-----------------------------------------------------------------*/ + + n_bits = 0; + nb = st->next_bit_pos; + + if ( !hStereoDft->frame_sid_nodata ) + { + /* Active frame */ + hStereoDft->no_ipd_flag = st->bit_stream[nb]; + nb += 1; + n_bits += 1; + if ( hStereoDft->no_ipd_flag == 0 ) + { + ind1_ipd[0] = get_value( &st->bit_stream[nb], STEREO_DFT_GIPD_NBITS ); + nb += STEREO_DFT_GIPD_NBITS; + n_bits += STEREO_DFT_GIPD_NBITS; + stereo_dft_dequantize_ipd( &ind1_ipd[0], hStereoDft->gipd + ( k + k_offset ), 1, STEREO_DFT_GIPD_NBITS ); + } + } + else if ( *nb_bits <= ( ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - STEREO_DFT_FLAG_BITS - STEREO_DFT_SID_GIPD_NBITS - SID_FORMAT_NBITS ) ) + { + /* SID frame, only read IPD only if enough bits left in bitstream */ + hStereoDft->no_ipd_flag = st->bit_stream[nb]; + nb += 1; + n_bits += 1; + if ( hStereoDft->no_ipd_flag == 0 ) + { + ind1_ipd[0] = get_value( &st->bit_stream[nb], STEREO_DFT_SID_GIPD_NBITS ); + nb += STEREO_DFT_SID_GIPD_NBITS; + n_bits += STEREO_DFT_SID_GIPD_NBITS; + stereo_dft_dequantize_ipd( &ind1_ipd[0], hStereoDft->gipd + ( k + k_offset ), 1, STEREO_DFT_SID_GIPD_NBITS ); + } + } + else + { + hStereoDft->no_ipd_flag = 1; + } + + st->next_bit_pos += n_bits; + ( *nb_bits ) += n_bits; + + /*------------------------------------------------------------------* + * read Residual parameters + *-----------------------------------------------------------------*/ + + /* Residual prediction */ /* Switch it off if ITD detected */ + n_bits = 0; + nb = st->next_bit_pos; + + /* Not used in inactive frames */ + if ( !hStereoDft->frame_sid_nodata ) + { + if ( hStereoDft->res_pred_mode[k + k_offset] && ( hStereoDft->attackPresent == 0 ) ) + { + nbands = min( hStereoDft->nbands, STEREO_DFT_RES_PRED_BAND_MAX ); + + hStereoDft->reverb_flag = 0; + hStereoDft->nbands_respred = nbands; + + /* Read bit for adaptive SF (WB/SWB & FB) */ + if ( hStereoDft->hConfig->res_cod_mode == STEREO_DFT_RES_COD_OFF ) + { + hStereoDft->reverb_flag = get_next_indice( st, STEREO_DFT_REVERB_MODE_NBITS ); + ( *nb_bits ) += STEREO_DFT_REVERB_MODE_NBITS; + nb += STEREO_DFT_REVERB_MODE_NBITS; + if ( hStereoDft->reverb_flag ) + { + nbands -= STEREO_DFT_RES_PRED_BAND_MIN_CONST; + } + } + + /* get coding type */ + b = read_flag_EC_DFT( &st->bit_stream[nb], &hStereoDft->res_pred_flag_0 ); + nb += b; + n_bits += b; + + if ( hStereoDft->res_pred_flag_0 == 0 ) + { + b = read_BS_adapt_GR_rpg( st->bit_stream, nb, ind1_pred, hStereoDft->res_pred_band_min, nbands, &hStereoDft->res_pred_flag_1 ); + n_bits += b; + } + else + { + if ( hStereoDft->res_pred_flag_0 == 2 ) + { + b = read_BS_GR( st->bit_stream, nb, &ind1_pred[hStereoDft->res_pred_band_min], nbands - hStereoDft->res_pred_band_min, &hStereoDft->res_pred_flag_1 ); + + n_bits += b; + for ( b = hStereoDft->res_pred_band_min; b < nbands; b++ ) + { + ind1_pred[b] += hStereoDft->res_pred_index_previous[b]; + } + } + else + { + for ( b = hStereoDft->res_pred_band_min; b < nbands; b++ ) + { + ind1_pred[b] = get_value( &st->bit_stream[nb], STEREO_DFT_RES_GAINS_BITS ); + nb += STEREO_DFT_RES_GAINS_BITS; + n_bits += STEREO_DFT_RES_GAINS_BITS; + } + } + } + + for ( b = 0; b < hStereoDft->res_pred_band_min; b++ ) + { + I = 0; + stereo_dft_dequantize_res_gains( ind1 + b, &I, hStereoDft->side_gain + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b, hStereoDft->res_pred_gain + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b, 1 ); + hStereoDft->res_pred_index_previous[b] = I; + hStereoDft->res_gains_ind[1][b + STEREO_DFT_BAND_MAX] = 0; + } + + for ( b = hStereoDft->res_pred_band_min; b < nbands; b++ ) + { + I = ind1_pred[b]; + stereo_dft_dequantize_res_gains( ind1 + b, &I, hStereoDft->side_gain + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b, hStereoDft->res_pred_gain + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b, 1 ); + hStereoDft->res_pred_index_previous[b] = I; + hStereoDft->res_gains_ind[1][b + STEREO_DFT_BAND_MAX] = I; + } + + for ( ; b < hStereoDft->nbands; b++ ) + { + I = 0; + stereo_dft_dequantize_res_gains( ind1 + b, &I, hStereoDft->side_gain + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b, hStereoDft->res_pred_gain + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b, 1 ); + hStereoDft->res_pred_index_previous[b] = I; + hStereoDft->res_gains_ind[1][b + STEREO_DFT_BAND_MAX] = 0; + } + } + else + { + for ( b = 0; b < hStereoDft->nbands; b++ ) + { + I = 0; + stereo_dft_dequantize_res_gains( ind1 + b, &I, hStereoDft->side_gain + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b, hStereoDft->res_pred_gain + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b, 1 ); + hStereoDft->res_pred_index_previous[b] = I; + hStereoDft->res_gains_ind[1][b + STEREO_DFT_BAND_MAX] = I; + } + } + + st->next_bit_pos += n_bits; + ( *nb_bits ) += n_bits; + } + else + { + /* Dequantize sidegain if SID frame */ + if ( hStereoDft->frame_sid ) + { + for ( b = 0; b < hStereoDft->nbands; b++ ) + { + I = 0; + stereo_dft_dequantize_res_gains( ind1 + b, &I, hStereoDft->side_gain + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b, hStereoDft->res_pred_gain + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b, 1 ); + } + } + } + } + + } + + if ( !( ivas_format == MASA_FORMAT && ivas_total_brate <= IVAS_SID_5k2 ) ) + { + if ( hStereoDft->side_gain_flag_1 != 2 ) + { + hStereoDft->sg_mem_corrupt = 0; + } + } + + if ( ivas_total_brate > IVAS_SID_5k2 ) + { + hStereoDft->recovery_flg = stereo_dft_sg_recovery( hStereoDft ); + + if ( hStereoDft->recovery_flg ) + { + mvr2r( sg_tmp, hStereoDft->side_gain + 2 * STEREO_DFT_BAND_MAX, STEREO_DFT_BAND_MAX ); + mvr2r( res_pred_gain_tmp, hStereoDft->res_pred_gain + 2 * STEREO_DFT_BAND_MAX, STEREO_DFT_BAND_MAX ); + } + } + + /*----------------------------------------------------------------* + * Residual decoding: spectral lines + *----------------------------------------------------------------*/ + + /* Residual coding not used in inactive frames */ + if ( hStereoDft->res_cod_band_max > 0 && !hStereoDft->frame_sid_nodata ) + { + int16_t dec[STEREO_DFT_N_MAX_RES]; + + I = get_next_indice( st, STEREO_DFT_RES_GLOBAL_GAIN_BITS ); + ( *nb_bits ) += STEREO_DFT_RES_GLOBAL_GAIN_BITS; + + + push_wmops( "residual_decode" ); + if ( I != ECSQ_GLOBAL_GAIN_INDEX_ALL_ZERO ) + { + ECSQ_init_instance( &ecsq_inst, 0 /*dummy index*/, &range_uni_dec_state ); + + rc_uni_dec_init( &range_uni_dec_state, bit_stream_side + *nb_bits, max_bits - *nb_bits ); + + hStereoDft->res_global_gain = ECSQ_dequantize_gain( I ); + + ecsq_inst.config_index = 2 * hStereoDft->res_cod_mode[k_offset] - 1; + + ECSQ_decode( &ecsq_inst, hStereoDft->res_cod_line_max, dec ); + + n_bits = rc_uni_dec_finish( &range_uni_dec_state ); + + + set_zero( res_buf, STEREO_DFT_N_8k ); + ECSQ_dequantize_vector( dec, hStereoDft->res_global_gain, hStereoDft->res_cod_line_max, res_buf ); + } + else + { + set_s( dec, 0, hStereoDft->res_cod_line_max ); + hStereoDft->res_global_gain = 0.0f; + n_bits = 0; + set_zero( res_buf, STEREO_DFT_N_8k ); + } + + ( *nb_bits ) += n_bits; + pop_wmops(); + + } + + if ( hStereoDft->frame_sid && !( ivas_format == MASA_FORMAT && ivas_total_brate <= IVAS_SID_5k2 ) ) + { + stereo_dft_dec_sid_coh( st, hStereoDft->nbands, coh, nb_bits ); + } + + if ( ivas_total_brate == IVAS_SID_5k2 && ivas_format != MASA_FORMAT ) + { + *nb_bits = (int16_t) ( ( element_brate - SID_2k40 ) / FRAMES_PER_SEC ); /* => hCPE->hCoreCoder[0]->total_brate = SID_2k40; */ + } + { + *total_brate = element_brate - ( *nb_bits * FRAMES_PER_SEC ); + } + + + return; +} + + +/*------------------------------------------------------------------------- + * stereo_dft_compute_td_stefi_params() + * + * + *-------------------------------------------------------------------------*/ + +static void stereo_dft_compute_td_stefi_params( + STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */ + const float samp_ratio /* i : sampling ratio */ +) +{ + int16_t pdmx_ind; + float g2; + int16_t bin0; + int16_t band0; + int16_t b; + int16_t nbands; + int16_t bres; + float wsum; + float pred_gain_avg, pred_g; + float nrg_DMX, nrg_pred_DMX; + + pdmx_ind = hStereoDft->past_DMX_pos; + bres = hStereoDft->band_res[1]; + + if ( hStereoDft->core_hist[1] != ACELP_CORE || hStereoDft->wasTransient ) + { + hStereoDft->td_gain[0] = 0; + + return; + } + + bin0 = (int16_t) ( samp_ratio * hStereoDft->NFFT / 2 + .5 ); + bin0 = min( bin0, hStereoDft->band_limits[hStereoDft->nbands] ); + b = hStereoDft->nbands; + while ( hStereoDft->band_limits[b] > bin0 ) + { + b--; + } + band0 = b; + + /* calculate averages over high bands */ + pred_g = pred_gain_avg = 0; + nbands = 0; + wsum = 0; + for ( b = band0; b < hStereoDft->nbands; b++ ) + { + if ( min( hStereoDft->past_res_pred_gain[STEFI_DELAY_IND( STEREO_DFT_TD_STEFI_SUBFR_DELAY + 1, pdmx_ind )][b], hStereoDft->past_res_pred_gain[STEFI_DELAY_IND( STEREO_DFT_TD_STEFI_SUBFR_DELAY + 2, pdmx_ind )][b] ) < 0 ) + { + hStereoDft->td_gain[0] = 0; + return; + } + pred_g += ( hStereoDft->res_pred_gain[b + STEREO_DFT_BAND_MAX] + hStereoDft->res_pred_gain[b + 2 * STEREO_DFT_BAND_MAX] ) / 2 * dft_res_pred_weights[bres][b - band0]; + pred_gain_avg += ( hStereoDft->past_res_pred_gain[STEFI_DELAY_IND( STEREO_DFT_TD_STEFI_SUBFR_DELAY + 2, pdmx_ind )][b] + hStereoDft->past_res_pred_gain[STEFI_DELAY_IND( STEREO_DFT_TD_STEFI_SUBFR_DELAY + 1, pdmx_ind )][b] ) / 2 * dft_res_pred_weights[bres][b - band0]; + + nbands++; + wsum += dft_res_pred_weights[bres][b - band0]; +#ifdef DBG_TD_STEFI + printf( "frame: %d\tband: %-2d\tpred_gain1: %f\tpred_gain2: %f\tppg1: %f\tppg2: %f\n", frame, b, hStereoDft->res_pred_gain[b + STEREO_DFT_BAND_MAX], hStereoDft->res_pred_gain[b + 2 * STEREO_DFT_BAND_MAX], hStereoDft->past_res_pred_gain[STEREO_DFT_TD_STEFI_SUBFR_DELAY - 2][b], hStereoDft->past_res_pred_gain[d_short - 1][b] ); +#endif + } + + if ( nbands == 0 ) + { + /* apparently, there is nothing to do here */ + hStereoDft->td_gain[0] = 0; + return; + } + + pred_g /= wsum; + pred_gain_avg /= wsum; + + nrg_DMX = hStereoDft->hb_nrg[0]; + nrg_pred_DMX = hStereoDft->hb_nrg[1]; + + g2 = pred_g * sqrtf( ( 0.001f + nrg_DMX ) / ( 0.001f + nrg_pred_DMX ) ); + + hStereoDft->td_gain[0] = min( pred_gain_avg * STEREO_DFT_STEFFI_GAIN_AMP, pred_gain_avg * ( 1 - STEREO_DFT_STEFFI_GAIN_REST_AMT ) + g2 * STEREO_DFT_STEFFI_GAIN_REST_AMT ); + +#ifdef DBG_TD_STEFI + printf( "frame: %d\tpred_gain: %f\tpred_gain_avg: %f\tg2_0: %f\tgain: %f\n", frame, pred_gain, pred_gain_avg, g2, hStereoDft->td_gain[0] ); + printf( "nrg_DMX: %f\tnrd_pred_DMX: %f\tnbands: %d\tbin0: %d\n", nrg_DMX, nrg_pred_DMX, hStereoDft->nbands, bin0 ); + /*printf( "td_gain: %f\n", hStereoDft->td_gain[0] );*/ +#endif + + return; +} + + +/*------------------------------------------------------------------------- + * stereo_dft_generate_res_pred() + * + * + *-------------------------------------------------------------------------*/ +void stereo_dft_generate_res_pred( + STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */ + const float samp_ratio, /* i : sampling ratio */ + float *pDFT_DMX, /* i : downmix signal */ + float *DFT_PRED_RES, /* o : residual prediction signal */ + float *pPredGain, /* i : residual prediction gains */ + const int16_t k, /* i : subframe index */ + float *ap_filt_DMX, /* i : enhanced stereo filling signal */ + int16_t *stop, /* o : last FD stereo filling bin */ + const int16_t bfi /* i : BFI flag */ +) +{ + /* general variables */ + int16_t i, b; + int16_t begin, end; + int16_t bin0, band0; /* ESF->Stefi crossover bin/band */ + int16_t lb_stefi_start_band; + + /* variables for enhanced stereo filling */ + float norm_fac; + float alpha, gain_limit; + + /* variables for stereo filling */ + int16_t d_long, d_short, d_long_ind, d_short_ind; + float g_short, g_long; + float dmx_nrg, rev_nrg; + float past_dmx_nrg; + float pred_gain_avg; + float g2; + int16_t nbands_respred; + + push_wmops( "gen_respred" ); + + /* smoothing and limiting parameters */ + alpha = hStereoDft->wasTransient ? 0 : 0.2f; /* no smoothing after transients */ + gain_limit = 2; + + /* residual prediction only used up to 16 kHz (SWB) */ + nbands_respred = min( hStereoDft->nbands, STEREO_DFT_RES_PRED_BAND_MAX ); + + /* In ACELP mode the downmix signal is not available in bandwidth extension area. * + * Therefore, the downmix energy in the corresponding subbands is estimated. */ + bin0 = (int16_t) ( samp_ratio * hStereoDft->NFFT / 2 + .5 ); + bin0 = min( bin0, hStereoDft->band_limits[hStereoDft->nbands] ); + b = hStereoDft->nbands; + while ( hStereoDft->band_limits[b] >= bin0 ) + { + b--; + } + band0 = b; + + if ( hStereoDft->res_pred_mode[k + STEREO_DFT_OFFSET] < STEREO_DFT_RESPRED_ESF ) + { + /* no ESF signal available, use stereo filling over whole spectrum */ + lb_stefi_start_band = max( hStereoDft->res_pred_band_min, hStereoDft->res_cod_band_max ); + } + else + { + /* ESF signal available, use ESF in lowband, stereo filling in highband */ + lb_stefi_start_band = max( band0, hStereoDft->res_cod_band_max ); + } + + if ( bfi ) + { + lb_stefi_start_band = 0; + } + + /* lowband: use ESF if available, else use stereo filling */ + if ( hStereoDft->res_pred_mode[k + STEREO_DFT_OFFSET] == STEREO_DFT_RESPRED_ESF ) + { + /* ESF in lowband */ + /* main loop over core region*/ + for ( b = hStereoDft->res_cod_band_max; b <= band0; b++ ) + { + dmx_nrg = EPSILON; + rev_nrg = EPSILON; + + /* calculate band energies (low band only in case of ACELP) */ + for ( i = hStereoDft->band_limits[b]; i < min( hStereoDft->band_limits[b + 1], bin0 ); i++ ) + { + dmx_nrg += pDFT_DMX[2 * i] * pDFT_DMX[2 * i] + pDFT_DMX[2 * i + 1] * pDFT_DMX[2 * i + 1]; + rev_nrg += ap_filt_DMX[2 * i] * ap_filt_DMX[2 * i] + ap_filt_DMX[2 * i + 1] * ap_filt_DMX[2 * i + 1]; + } + + /* smoothing */ + hStereoDft->smooth_res_nrg[b] = alpha * hStereoDft->smooth_res_nrg[b] + ( 1 - alpha ) * rev_nrg; + hStereoDft->smooth_dmx_nrg[b] = alpha * hStereoDft->smooth_dmx_nrg[b] + ( 1 - alpha ) * dmx_nrg; + + /* normalization factor */ + norm_fac = sqrtf( hStereoDft->smooth_dmx_nrg[b] / hStereoDft->smooth_res_nrg[b] ); + + /* gain compressor */ + norm_fac *= min( max( 0.8f, 1 / norm_fac ), 1.25f ); + + /* gain limiter */ + norm_fac = min( norm_fac, gain_limit ); + + for ( i = hStereoDft->band_limits[b]; i < min( hStereoDft->band_limits[b + 1], bin0 ); i++ ) + { + DFT_PRED_RES[2 * i] = norm_fac * pPredGain[b] * ap_filt_DMX[2 * i]; + DFT_PRED_RES[2 * i + 1] = norm_fac * pPredGain[b] * ap_filt_DMX[2 * i + 1]; + } + } + } + else if ( hStereoDft->res_pred_mode[k + STEREO_DFT_OFFSET] == STEREO_DFT_RESPRED_STEFI ) + { + /* stefi in lowband */ + set_zero( DFT_PRED_RES, 2 * hStereoDft->band_limits[lb_stefi_start_band] ); + + for ( b = lb_stefi_start_band; b <= band0; b++ ) + { + d_short_ind = STEREO_DFT_PAST_MAX - STEREO_DFT_STEFFI_DELAY_SHORT + b % 2; + d_long_ind = max( 4, (int16_t) ( ( STEREO_DFT_PAST_MAX + 4 - 1 ) * ( (float) b / ( hStereoDft->nbands - 1 ) ) + 0.5f ) ) - 4; + /* make sure d_short really corresponds to a shorter or equally long delay than d_long (e.g. not always the case for + * STEREO_DFT_STEFFI_DELAY_SHORT=3 and STEREO_DFT_STEFFI_DELAY_LONG=4)*/ + d_short_ind = max( d_short_ind, d_long_ind ); + + /* Even number of window sliding (assymmetric OLA) */ + d_short_ind = 2 * ( d_short_ind / 2 ); + d_long_ind = 2 * ( d_long_ind / 2 ); + + d_short = STEREO_DFT_PAST_MAX - d_short_ind; + d_long = STEREO_DFT_PAST_MAX - d_long_ind; + + d_short_ind = ( d_short_ind + hStereoDft->past_DMX_pos + 1 ) % STEREO_DFT_PAST_MAX; + d_long_ind = ( d_long_ind + hStereoDft->past_DMX_pos + 1 ) % STEREO_DFT_PAST_MAX; + + g_short = hStereoDft->stefi_short_gain; + g_long = hStereoDft->stefi_long_gain; + + /* change mixing ratio if long and short delay are the same */ + if ( d_short == d_long ) + { + g_short = 1; + g_long = 0; + } + + /* Avoid transient components */ + if ( hStereoDft->past_res_pred_gain[d_short_ind][b] == -1 && hStereoDft->past_res_pred_gain[d_long_ind][b] == -1 ) + { + g_long = 0.0f; + g_short = 0.0f; + } + else if ( hStereoDft->past_res_pred_gain[d_short_ind][b] == -1 ) + { + g_long = 1.0f; + g_short = 0.0f; + } + else if ( hStereoDft->past_res_pred_gain[d_long_ind][b] == -1 ) + { + g_long = 0.0f; + g_short = 1.0f; + } + + if ( max( g_short, g_long ) > 0 ) + { + past_dmx_nrg = EPSILON; + dmx_nrg = EPSILON; + for ( i = hStereoDft->band_limits[b]; i < min( bin0, hStereoDft->band_limits[b + 1] ); i++ ) + { + dmx_nrg += pDFT_DMX[2 * i] * pDFT_DMX[2 * i] + pDFT_DMX[2 * i + 1] * pDFT_DMX[2 * i + 1]; + + DFT_PRED_RES[2 * i] = g_short * ( hStereoDft->DFT_past_DMX[d_short_ind][2 * i] ) + g_long * ( hStereoDft->DFT_past_DMX[d_long_ind][2 * i] ); + DFT_PRED_RES[2 * i + 1] = g_short * ( hStereoDft->DFT_past_DMX[d_short_ind][2 * i + 1] ) + g_long * ( hStereoDft->DFT_past_DMX[d_long_ind][2 * i + 1] ); + + past_dmx_nrg += DFT_PRED_RES[2 * i] * DFT_PRED_RES[2 * i] + DFT_PRED_RES[2 * i + 1] * DFT_PRED_RES[2 * i + 1]; + } + if ( !bfi || b >= hStereoDft->res_cod_band_max ) + { + norm_fac = sqrtf( ( 0.001f + dmx_nrg ) / ( 0.001f + past_dmx_nrg ) ); + g2 = pPredGain[b] * norm_fac; + pred_gain_avg = g_short * hStereoDft->past_res_pred_gain[d_short_ind][b] + + g_long * hStereoDft->past_res_pred_gain[d_long_ind][b]; + + g2 = min( pred_gain_avg * STEREO_DFT_STEFFI_GAIN_AMP, pred_gain_avg * ( 1 - STEREO_DFT_STEFFI_GAIN_REST_AMT ) + g2 * STEREO_DFT_STEFFI_GAIN_REST_AMT ); + + for ( i = hStereoDft->band_limits[b]; i < min( bin0, hStereoDft->band_limits[b + 1] ); i++ ) + { + DFT_PRED_RES[2 * i] *= g2; + DFT_PRED_RES[2 * i + 1] *= g2; + } + } + } + else + { + set_zero( DFT_PRED_RES + 2 * hStereoDft->band_limits[b], 2 * ( min( bin0, hStereoDft->band_limits[b + 1] ) - hStereoDft->band_limits[b] ) ); + } + } + } + + if ( hStereoDft->band_limits[nbands_respred] > bin0 ) + { + /* apply stereo filling in ACELP BWE region */ + if ( hStereoDft->core_hist[0] == ACELP_CORE && hStereoDft->core_hist[STEREO_DFT_STEFFI_DELAY_SHORT / 2] == ACELP_CORE ) + { + /* ACELP -> ACELP: nothing to do */ + *stop = bin0; + } + else if ( hStereoDft->core_hist[STEREO_DFT_STEFFI_DELAY_SHORT / 2] == ACELP_CORE ) + { + /* ACELP -> TCX/HQ core transition */ + /* calculate high band energy only */ + dmx_nrg = EPSILON; + for ( i = bin0; i < hStereoDft->NFFT / 2; i++ ) + { + dmx_nrg += pDFT_DMX[2 * i] * pDFT_DMX[2 * i] + pDFT_DMX[2 * i + 1] * pDFT_DMX[2 * i + 1]; + } + + hStereoDft->hb_nrg[0] += dmx_nrg * 2 / hStereoDft->NFFT; + *stop = bin0; + } + else if ( hStereoDft->core_hist[0] == ACELP_CORE ) + { + /* TCX/HQ core -> ACELP transition */ + /* apply short delay only and blend to long/short gain */ + dmx_nrg = hStereoDft->hb_nrg_subr[k]; + d_short_ind = STEREO_DFT_PAST_MAX - STEREO_DFT_TD_STEFI_SUBFR_DELAY; + + d_short_ind = ( d_short_ind + hStereoDft->past_DMX_pos + 1 ) % STEREO_DFT_PAST_MAX; + + /* calculate high band energy of past dmx */ + past_dmx_nrg = EPSILON; + for ( i = bin0; i < min( hStereoDft->NFFT / 2, STEREO_DFT32MS_N_32k / 2 ); i++ ) + { + past_dmx_nrg += hStereoDft->DFT_past_DMX[d_short_ind][2 * i] * hStereoDft->DFT_past_DMX[d_short_ind][2 * i] + hStereoDft->DFT_past_DMX[d_short_ind][2 * i + 1] * hStereoDft->DFT_past_DMX[d_short_ind][2 * i + 1]; + } + + for ( b = band0; b < nbands_respred; b++ ) + { + g_short = hStereoDft->past_res_pred_gain[d_short_ind][b] < 0 ? 0 : ( 1.f + hStereoDft->stefi_short_gain ) / 2; + + if ( g_short > 0 ) + { + norm_fac = sqrtf( ( 0.001f + dmx_nrg ) / ( 0.001f + past_dmx_nrg ) ); + g2 = pPredGain[b] * norm_fac; + pred_gain_avg = hStereoDft->past_res_pred_gain[d_short_ind][b] * g_short; + + g2 = min( pred_gain_avg * STEREO_DFT_STEFFI_GAIN_AMP, pred_gain_avg * ( 1 - STEREO_DFT_STEFFI_GAIN_REST_AMT ) + g2 * STEREO_DFT_STEFFI_GAIN_REST_AMT ); + for ( i = max( hStereoDft->band_limits[b], bin0 ); i < min( hStereoDft->band_limits[b + 1], STEREO_DFT32MS_N_32k / 2 ); i++ ) + { + DFT_PRED_RES[2 * i] = g2 * hStereoDft->DFT_past_DMX[d_short_ind][2 * i]; + DFT_PRED_RES[2 * i + 1] = g2 * hStereoDft->DFT_past_DMX[d_short_ind][2 * i + 1]; + } + } + else + { + begin = max( hStereoDft->band_limits[b], bin0 ); + end = min( hStereoDft->band_limits[b + 1], STEREO_DFT32MS_N_32k / 2 ); + set_zero( DFT_PRED_RES + 2 * begin, 2 * ( end - begin ) ); + } + } + } + else + { + for ( b = band0; b < nbands_respred; b++ ) + { + /* TCX/HQ core -> TCX/HQ core: business as usual */ + d_short_ind = STEREO_DFT_PAST_MAX - STEREO_DFT_STEFFI_DELAY_SHORT + b % 2; + d_long_ind = max( 4, (int16_t) ( ( STEREO_DFT_PAST_MAX + 4 - 1 ) * ( (float) b / ( hStereoDft->nbands - 1 ) ) + 0.5f ) ) - 4; + /* make sure d_short really corresponds to a shorter or equally long delay than d_long (e.g. not always the case for + * STEREO_DFT_STEFFI_DELAY_SHORT=3 and STEREO_DFT_STEFFI_DELAY_LONG=4)*/ + d_short_ind = max( d_short_ind, d_long_ind ); + + /* Even number of window sliding (assymmetric OLA) */ + d_short_ind = 2 * ( d_short_ind / 2 ); + d_long_ind = 2 * ( d_long_ind / 2 ); + + d_short = STEREO_DFT_PAST_MAX - d_short_ind; + d_long = STEREO_DFT_PAST_MAX - d_long_ind; + + d_short_ind = ( d_short_ind + hStereoDft->past_DMX_pos + 1 ) % STEREO_DFT_PAST_MAX; + d_long_ind = ( d_long_ind + hStereoDft->past_DMX_pos + 1 ) % STEREO_DFT_PAST_MAX; + + g_short = hStereoDft->stefi_short_gain; + g_long = hStereoDft->stefi_long_gain; + + /* change mixing ratio if long and short delay are the same */ + if ( d_short == d_long ) + { + g_short = 1; + g_long = 0; + } + + /* Avoid transient components */ + if ( hStereoDft->past_res_pred_gain[d_short_ind][b] == -1 && hStereoDft->past_res_pred_gain[d_long_ind][b] == -1 ) + { + g_long = 0.0f; + g_short = 0.0f; + } + else if ( hStereoDft->past_res_pred_gain[d_short_ind][b] == -1 ) + { + g_long = 1.0f; + g_short = 0.0f; + } + else if ( hStereoDft->past_res_pred_gain[d_long_ind][b] == -1 ) + { + g_long = 0.0f; + g_short = 1.0f; + } + if ( hStereoDft->core_hist[d_short / 2] == ACELP_CORE ) + { + g_short = 0; + } + if ( hStereoDft->core_hist[d_long / 2] == ACELP_CORE ) + { + g_long = 0; + } + + if ( max( g_short, g_long ) > 0 ) + { + past_dmx_nrg = EPSILON; + dmx_nrg = EPSILON; + for ( i = max( hStereoDft->band_limits[b], bin0 ); i < min( hStereoDft->band_limits[b + 1], STEREO_DFT32MS_N_32k / 2 ); i++ ) + { + dmx_nrg += pDFT_DMX[2 * i] * pDFT_DMX[2 * i] + pDFT_DMX[2 * i + 1] * pDFT_DMX[2 * i + 1]; + + DFT_PRED_RES[2 * i] = g_short * ( hStereoDft->DFT_past_DMX[d_short_ind][2 * i] ) + g_long * ( hStereoDft->DFT_past_DMX[d_long_ind][2 * i] ); + DFT_PRED_RES[2 * i + 1] = g_short * ( hStereoDft->DFT_past_DMX[d_short_ind][2 * i + 1] ) + g_long * ( hStereoDft->DFT_past_DMX[d_long_ind][2 * i + 1] ); + + past_dmx_nrg += DFT_PRED_RES[2 * i] * DFT_PRED_RES[2 * i] + DFT_PRED_RES[2 * i + 1] * DFT_PRED_RES[2 * i + 1]; + } + + norm_fac = sqrtf( ( 0.001f + dmx_nrg ) / ( 0.001f + past_dmx_nrg ) ); + g2 = pPredGain[b] * norm_fac; + pred_gain_avg = g_short * hStereoDft->past_res_pred_gain[d_short_ind][b] + g_long * hStereoDft->past_res_pred_gain[d_long_ind][b]; + + g2 = min( pred_gain_avg * STEREO_DFT_STEFFI_GAIN_AMP, pred_gain_avg * ( 1 - STEREO_DFT_STEFFI_GAIN_REST_AMT ) + g2 * STEREO_DFT_STEFFI_GAIN_REST_AMT ); + + for ( i = max( hStereoDft->band_limits[b], bin0 ); i < min( hStereoDft->band_limits[b + 1], STEREO_DFT32MS_N_32k / 2 ); i++ ) + { + DFT_PRED_RES[2 * i] *= g2; + DFT_PRED_RES[2 * i + 1] *= g2; + } + } + else + { + begin = max( hStereoDft->band_limits[b], bin0 ); + end = min( hStereoDft->band_limits[b + 1], STEREO_DFT32MS_N_32k / 2 ); + set_zero( DFT_PRED_RES + 2 * begin, 2 * ( end - begin ) ); + } + } + } + } + + /* update buffers */ + for ( b = hStereoDft->res_pred_band_min; b < hStereoDft->nbands; b++ ) + { + if ( hStereoDft->attackPresent || hStereoDft->wasTransient ) + { + hStereoDft->past_res_pred_gain[( hStereoDft->past_DMX_pos + 1 ) % STEREO_DFT_PAST_MAX][b] = -1; + } + else + { + hStereoDft->past_res_pred_gain[( hStereoDft->past_DMX_pos + 1 ) % STEREO_DFT_PAST_MAX][b] = pPredGain[b]; + } + } + + pop_wmops(); + return; +} + + +/*--------------------------------------------------------------- + * stereo_dft_dec_smooth_parameters() + * + * + * ---------------------------------------------------------------*/ + +void stereo_dft_dec_smooth_parameters( + STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */ + const int16_t prev_sid_nodata, /* i : Previous SID/No data indicator */ + const int16_t active_frame_counter, /* i : Active frame counter */ + const int32_t element_brate /* i : Element bitrate */ +) +{ + int16_t k_offset, k, k2, b, N_div; + float *pIpd, *pInterpol; + float *pgIpd; + float *pSideGain; + float diff_ipd; + int16_t nbands; + int16_t max_res_pred_ind; + + N_div = STEREO_DFT_NBDIV; + k_offset = STEREO_DFT_OFFSET; + + if ( hStereoDft->frame_sid_nodata || prev_sid_nodata ) + { + k = 1; + for ( b = 0; b < hStereoDft->nbands; b++ ) + { + *( hStereoDft->side_gain + ( ( k + k_offset ) - 1 ) * STEREO_DFT_BAND_MAX + b ) = *( hStereoDft->side_gain + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b ); + } + + if ( hStereoDft->frame_sid_nodata ) + { + /* set new xfade target if new itd received */ + if ( hStereoDft->gipd[k + k_offset] != hStereoDft->ipd_xfade_target ) + { + if ( ( hStereoDft->gipd[k + k_offset] - hStereoDft->ipd_xfade_prev ) > EVS_PI ) + { + hStereoDft->ipd_xfade_target = hStereoDft->gipd[k + k_offset] - 2 * EVS_PI; + hStereoDft->ipd_xfade_step = ( hStereoDft->ipd_xfade_target - hStereoDft->ipd_xfade_prev ) / ( STEREO_DFT_ITD_CNG_XFADE - hStereoDft->ipd_xfade_counter ); + } + else if ( ( hStereoDft->ipd_xfade_prev - hStereoDft->gipd[k + k_offset] ) > EVS_PI ) + { + hStereoDft->ipd_xfade_target = hStereoDft->gipd[k + k_offset] + 2 * EVS_PI; + hStereoDft->ipd_xfade_step = ( hStereoDft->ipd_xfade_target - hStereoDft->ipd_xfade_prev ) / ( STEREO_DFT_ITD_CNG_XFADE - hStereoDft->ipd_xfade_counter ); + } + else + { + hStereoDft->ipd_xfade_target = hStereoDft->gipd[k + k_offset]; + hStereoDft->ipd_xfade_step = ( hStereoDft->ipd_xfade_target - hStereoDft->ipd_xfade_prev ) / ( STEREO_DFT_ITD_CNG_XFADE - hStereoDft->ipd_xfade_counter ); + } + } + + /* xfade */ + if ( hStereoDft->ipd_xfade_prev != hStereoDft->ipd_xfade_target && hStereoDft->ipd_xfade_counter < STEREO_DFT_ITD_CNG_XFADE && hStereoDft->last_active_element_brate <= 24400 ) + { + hStereoDft->gipd[k + k_offset] = hStereoDft->ipd_xfade_prev + hStereoDft->ipd_xfade_step; + hStereoDft->ipd_xfade_prev = hStereoDft->gipd[k + k_offset]; + hStereoDft->ipd_xfade_counter++; + } + } + else + { + /* First active frame, "reset" everything if long enough active encoding, only triggered if STEREO_DFT_ITD_CNG_XFADE_RESET = -1 */ + if ( active_frame_counter > STEREO_DFT_ITD_CNG_XFADE_RESET ) + { + hStereoDft->ipd_xfade_target = hStereoDft->gipd[k + k_offset]; + hStereoDft->ipd_xfade_prev = hStereoDft->gipd[k + k_offset]; + hStereoDft->ipd_xfade_counter = 0; + } + } + + for ( k2 = 1; k2 < hStereoDft->prm_res[k + k_offset]; k2++ ) + { + hStereoDft->gipd[( k + k_offset ) - k2] = hStereoDft->gipd[k + k_offset]; + } + + if ( hStereoDft->frame_sid_nodata ) + { + /* set new xfade target if new itd received */ + if ( hStereoDft->itd[k + k_offset] != hStereoDft->itd_xfade_target ) + { + hStereoDft->itd_xfade_target = hStereoDft->itd[k + k_offset]; + hStereoDft->itd_xfade_step = ( hStereoDft->itd_xfade_target - hStereoDft->itd_xfade_prev ) / ( STEREO_DFT_ITD_CNG_XFADE - hStereoDft->itd_xfade_counter ); + } + + /* xfade */ + if ( hStereoDft->itd_xfade_prev != hStereoDft->itd_xfade_target && hStereoDft->itd_xfade_counter < STEREO_DFT_ITD_CNG_XFADE && hStereoDft->last_active_element_brate <= 24400 ) + { + hStereoDft->itd[k + k_offset] = hStereoDft->itd_xfade_prev + hStereoDft->itd_xfade_step; + hStereoDft->itd_xfade_prev = hStereoDft->itd[k + k_offset]; + hStereoDft->itd_xfade_counter++; + } + } + else + { + /* First active frame, "reset" everything if long enough active encoding, only triggered if STEREO_DFT_ITD_CNG_XFADE_RESET = -1 */ + if ( active_frame_counter > STEREO_DFT_ITD_CNG_XFADE_RESET ) + { + hStereoDft->itd_xfade_target = hStereoDft->itd[k + k_offset]; + hStereoDft->itd_xfade_prev = hStereoDft->itd[k + k_offset]; + hStereoDft->itd_xfade_counter = 0; + } + + hStereoDft->last_active_element_brate = element_brate; + } + for ( k2 = 1; k2 < hStereoDft->prm_res[k + k_offset]; k2++ ) + { + hStereoDft->itd[( k + k_offset ) - k2] = hStereoDft->itd[k + k_offset]; + } + + return; + } + + /* Active frame, "reset" everything "reset" everything if long enough active encoding */ + if ( active_frame_counter > STEREO_DFT_ITD_CNG_XFADE_RESET ) + { + hStereoDft->itd_xfade_counter = 0; + hStereoDft->itd_xfade_target = hStereoDft->itd[STEREO_DFT_NBDIV - 1]; + hStereoDft->itd_xfade_prev = hStereoDft->itd[STEREO_DFT_NBDIV - 1]; + hStereoDft->ipd_xfade_counter = 0; + hStereoDft->ipd_xfade_target = hStereoDft->gipd[STEREO_DFT_NBDIV - 1]; + hStereoDft->ipd_xfade_prev = hStereoDft->gipd[STEREO_DFT_NBDIV - 1]; + } + + hStereoDft->last_active_element_brate = element_brate; + + for ( k = hStereoDft->prm_res[k_offset] - 1; k < N_div; k += hStereoDft->prm_res[k + k_offset] ) + { + max_res_pred_ind = 0; + + if ( hStereoDft->reverb_flag == 1 ) + { + nbands = min( 10, hStereoDft->nbands_respred ); + + /*Shift 2 last bands residual prediction gains for SWB/FB*/ + if ( hStereoDft->band_res[k_offset] == STEREO_DFT_BAND_RES_HIGH ) + { + for ( b = hStereoDft->nbands_respred - 1; b >= nbands; b-- ) + { + hStereoDft->res_gains_ind[1][b + STEREO_DFT_BAND_MAX] = + hStereoDft->res_gains_ind[1][b - STEREO_DFT_RES_PRED_BAND_MIN_RED + hStereoDft->res_pred_band_min + STEREO_DFT_BAND_MAX]; + hStereoDft->res_gains_ind[1][b - STEREO_DFT_RES_PRED_BAND_MIN_RED + hStereoDft->res_pred_band_min + STEREO_DFT_BAND_MAX] = 0; + } + } + + /* Get maximal index */ + for ( b = hStereoDft->res_pred_band_min; b < ( nbands - STEREO_DFT_RES_PRED_BAND_MIN_CONST ); b++ ) + { + if ( max_res_pred_ind < hStereoDft->res_gains_ind[1][b + STEREO_DFT_BAND_MAX] ) + { + max_res_pred_ind = (int16_t) hStereoDft->res_gains_ind[1][b + STEREO_DFT_BAND_MAX]; + } + } + + /* predictive values */ + for ( ; b < nbands; b++ ) + { + assert( hStereoDft->res_gains_ind[1][b + STEREO_DFT_BAND_MAX] == 0 ); + hStereoDft->res_gains_ind[1][b + STEREO_DFT_BAND_MAX] = max_res_pred_ind; + } + } + + for ( b = hStereoDft->res_pred_band_min; b < hStereoDft->res_cod_band_max; b++ ) + { + float tmp; + int16_t tmps1, tmps2; + + hStereoDft->res_gains_ind[0][b] = hStereoDft->res_gains_ind[0][b + STEREO_DFT_BAND_MAX]; + /*stereo_dft_dequantize_res_gains_f(&hStereoDft->res_gains_ind[0][b], &hStereoDft->res_gains_ind[1][b+STEREO_DFT_BAND_MAX],hStereoDft->side_gain+(k+k_offset)*STEREO_DFT_BAND_MAX+b, hStereoDft->res_pred_gain+(k+k_offset)*STEREO_DFT_BAND_MAX+b, 1);*/ + tmps1 = (int16_t) ( hStereoDft->res_gains_ind[0][b] ); + tmps2 = (int16_t) ( hStereoDft->res_gains_ind[1][b + STEREO_DFT_BAND_MAX] ); + stereo_dft_dequantize_res_gains( &tmps1, &tmps2, hStereoDft->side_gain + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b, hStereoDft->res_pred_gain + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b, 1 ); + + if ( hStereoDft->attackPresent ) + { + hStereoDft->res_gains_ind[1][b] = 0.8f * hStereoDft->res_gains_ind[1][b]; + } + else if ( hStereoDft->trans || ( hStereoDft->res_pred_mode[k] && ( hStereoDft->res_gains_ind[1][b + STEREO_DFT_BAND_MAX] < 2.f ) ) ) + { + hStereoDft->res_gains_ind[1][b] = 0.6f * hStereoDft->res_gains_ind[1][b] + 0.4f * hStereoDft->res_gains_ind[1][b + STEREO_DFT_BAND_MAX]; + } + else + { + hStereoDft->res_gains_ind[1][b] = dft_alpha_s2[b] * hStereoDft->res_gains_ind[1][b] + ( 1 - dft_alpha_s2[b] ) * hStereoDft->res_gains_ind[1][b + STEREO_DFT_BAND_MAX]; + } + + stereo_dft_dequantize_res_gains_f( &hStereoDft->res_gains_ind[0][b], &hStereoDft->res_gains_ind[1][b], &tmp, hStereoDft->res_pred_gain + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b, 1 ); + } + + /* Smoothing of prediction gains between ftrames */ + for ( ; b < hStereoDft->nbands; b++ ) + { + if ( hStereoDft->attackPresent ) + { + hStereoDft->res_gains_ind[0][b] = hStereoDft->res_gains_ind[0][b + STEREO_DFT_BAND_MAX]; + hStereoDft->res_gains_ind[1][b] = 0.8f * hStereoDft->res_gains_ind[1][b]; + } + else if ( hStereoDft->trans || ( hStereoDft->res_pred_mode[k] && ( hStereoDft->res_gains_ind[1][b + STEREO_DFT_BAND_MAX] < 2.f ) ) ) + { + hStereoDft->res_gains_ind[0][b] = hStereoDft->res_gains_ind[0][b + STEREO_DFT_BAND_MAX]; + + if ( hStereoDft->hConfig->band_res == STEREO_DFT_BAND_RES_LOW ) + { + hStereoDft->res_gains_ind[1][b] = dft_alpha_w_b2[b] * hStereoDft->res_gains_ind[1][b] + ( 1 - dft_alpha_w_b2[b] ) * hStereoDft->res_gains_ind[1][b + STEREO_DFT_BAND_MAX]; + } + else + { + hStereoDft->res_gains_ind[1][b] = dft_alpha_w[b] * hStereoDft->res_gains_ind[1][b] + ( 1 - dft_alpha_w[b] ) * hStereoDft->res_gains_ind[1][b + STEREO_DFT_BAND_MAX]; + } + } + else + { + if ( hStereoDft->hConfig->band_res == STEREO_DFT_BAND_RES_LOW ) + { + hStereoDft->res_gains_ind[0][b] = dft_alpha_s_b2[b] * hStereoDft->res_gains_ind[0][b] + ( 1 - dft_alpha_s_b2[b] ) * hStereoDft->res_gains_ind[0][b + STEREO_DFT_BAND_MAX]; + hStereoDft->res_gains_ind[1][b] = dft_alpha_s2_b2[b] * hStereoDft->res_gains_ind[1][b] + ( 1 - dft_alpha_s2_b2[b] ) * hStereoDft->res_gains_ind[1][b + STEREO_DFT_BAND_MAX]; + } + else + { + hStereoDft->res_gains_ind[0][b] = dft_alpha_s[b] * hStereoDft->res_gains_ind[0][b] + ( 1 - dft_alpha_s[b] ) * hStereoDft->res_gains_ind[0][b + STEREO_DFT_BAND_MAX]; + hStereoDft->res_gains_ind[1][b] = dft_alpha_s2[b] * hStereoDft->res_gains_ind[1][b] + ( 1 - dft_alpha_s2[b] ) * hStereoDft->res_gains_ind[1][b + STEREO_DFT_BAND_MAX]; + } + } + + if ( !hStereoDft->recovery_flg ) + { + stereo_dft_dequantize_res_gains_f( &hStereoDft->res_gains_ind[0][b], &hStereoDft->res_gains_ind[1][b], hStereoDft->side_gain + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b, hStereoDft->res_pred_gain + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b, 1 ); + } + } + + /* Smoothing of IPDs*/ + pgIpd = hStereoDft->gipd + ( k + k_offset ); + diff_ipd = pgIpd[0] - pgIpd[-hStereoDft->prm_res[k + k_offset]]; + if ( diff_ipd < -EVS_PI ) + { + pgIpd[0] += PI2; + } + else if ( diff_ipd > EVS_PI ) + { + pgIpd[0] -= PI2; + } + + if ( !hStereoDft->attackPresent ) + { + if ( hStereoDft->wasTransient ) + { + pgIpd[0] = 0.8f * pgIpd[0] + 0.2f * pgIpd[-hStereoDft->prm_res[k + k_offset]]; + } + else + { + pgIpd[0] = 0.5f * pgIpd[0] + 0.5f * pgIpd[-hStereoDft->prm_res[k + k_offset]]; + } + } + + + if ( !hStereoDft->attackPresent ) + { + pSideGain = hStereoDft->side_gain + ( k + k_offset ) * STEREO_DFT_BAND_MAX; + for ( b = 0; b < hStereoDft->res_cod_band_max; b++ ) + { + pSideGain[b] = dft_res_cod_alpha[b] * pSideGain[b] + ( 1 - dft_res_cod_alpha[b] ) * pSideGain[b - hStereoDft->prm_res[k + k_offset] * STEREO_DFT_BAND_MAX]; + } + } + + /*Interpolation between DFT slots*/ + for ( k2 = 1; k2 < hStereoDft->prm_res[k + k_offset]; k2++ ) + { + pInterpol = hStereoDft->gipd + ( ( k + k_offset ) - k2 ); + pIpd = hStereoDft->gipd + ( k + k_offset ); + if ( hStereoDft->attackPresent ) + { + *( pInterpol ) = *( pIpd ); + } + else + { + *( pInterpol ) = *( hStereoDft->gipd + ( k + k_offset - hStereoDft->prm_res[k + k_offset] ) ); + } + + for ( b = 0; b < hStereoDft->nbands; b++ ) + { + *( hStereoDft->res_pred_gain + ( ( k + k_offset ) - k2 ) * STEREO_DFT_BAND_MAX + b ) = *( hStereoDft->res_pred_gain + ( k + k_offset - hStereoDft->prm_res[k + k_offset] ) * STEREO_DFT_BAND_MAX + b ); + + if ( b < hStereoDft->res_cod_band_max || hStereoDft->attackPresent || hStereoDft->trans || ( hStereoDft->res_pred_mode[k] && ( hStereoDft->res_gains_ind[1][b + STEREO_DFT_BAND_MAX] < 2.f ) ) ) + { + *( hStereoDft->side_gain + ( ( k + k_offset ) - k2 ) * STEREO_DFT_BAND_MAX + b ) = *( hStereoDft->side_gain + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b ); + } + else + { + *( hStereoDft->side_gain + ( ( k + k_offset ) - k2 ) * STEREO_DFT_BAND_MAX + b ) = *( hStereoDft->side_gain + ( k + k_offset - hStereoDft->prm_res[k + k_offset] ) * STEREO_DFT_BAND_MAX + b ); + } + } + + hStereoDft->itd[( k + k_offset ) - k2] = hStereoDft->itd[k + k_offset]; + } /*end of interpolation*/ + } + + return; +} + + +/*--------------------------------------------------------------- + * stereo_dft_adapt_sf_delay() + * + * + * ---------------------------------------------------------------*/ + +static void stereo_dft_adapt_sf_delay( + STEREO_DFT_DEC_DATA_HANDLE hStereoDft, + float *pPredGain ) +{ + float var_mean_ratio; + float new_variation; + float target_delay; + float max_pg, sum_pg, alpha_up, alpha_down; + int16_t b; + + max_pg = 0.0f; + sum_pg = 0.0f; + + /* find sum and maximum of prediction gains */ + for ( b = hStereoDft->res_pred_band_min; b < hStereoDft->nbands; b++ ) + { + if ( pPredGain[b] > max_pg ) + { + max_pg = pPredGain[b]; + } + sum_pg += pPredGain[b]; + } + + if ( sum_pg > 0.0f ) + { + /* Calculate mean of the prediction gain */ + hStereoDft->lt_pred_gain = STEREO_DFT_LT_PREDGAIN_UPD * sum_pg + ( 1.0f - STEREO_DFT_LT_PREDGAIN_UPD ) * hStereoDft->lt_pred_gain; + + /* Calculate the variation of the prediction gain */ + new_variation = fabsf( sum_pg - hStereoDft->lt_pred_gain ); + hStereoDft->lt_pred_gain_variation = STEREO_DFT_VR_PREDGAIN_UPD * new_variation + ( 1.0f - STEREO_DFT_VR_PREDGAIN_UPD ) * hStereoDft->lt_pred_gain_variation; + } + + /* Calculate ratio of variation and mean of prediction gain */ + var_mean_ratio = STEREO_DFT_RES_RATIO_LIMIT; + if ( hStereoDft->lt_pred_gain > 0.0f ) + { + var_mean_ratio = min( 1.5f * STEREO_DFT_RES_RATIO_LIMIT, hStereoDft->lt_pred_gain_variation / hStereoDft->lt_pred_gain ); + } + + if ( max_pg > STEREO_DFT_STEFFI_PG_THRESHOLD ) + { + /* slow upwards */ + alpha_up = STEREO_DFT_STEFFI_RATIO_UP_HIGH; + alpha_down = STEREO_DFT_STEFFI_RATIO_DOWN_HIGH; + } + else + { + /* slow downwards */ + alpha_up = STEREO_DFT_STEFFI_RATIO_UP_LOW; + alpha_down = STEREO_DFT_STEFFI_RATIO_DOWN_LOW; + } + + if ( var_mean_ratio > hStereoDft->lt_var_mean_ratio ) + { + hStereoDft->lt_var_mean_ratio = alpha_up * var_mean_ratio + ( 1.0f - alpha_up ) * hStereoDft->lt_var_mean_ratio; + } + else + { + hStereoDft->lt_var_mean_ratio = alpha_down * var_mean_ratio + ( 1.0f - alpha_down ) * hStereoDft->lt_var_mean_ratio; + } + + /* Calculate a target delay for the stereo filling. Set the stereo filling delay lower when the prediction gain + variation is relatively high compared to the mean */ + if ( hStereoDft->lt_var_mean_ratio >= STEREO_DFT_RES_RATIO_LIMIT ) + { + target_delay = STEREO_DFT_STEFFI_DELAY_SHORT; + } + else + { + target_delay = min( STEREO_DFT_STEFFI_DELAY_LONG, STEREO_DFT_STEFFI_DELAY_SHORT + ( STEREO_DFT_STEFFI_DELAY_OFFSET + STEREO_DFT_STEFFI_DELAY_LONG - STEREO_DFT_STEFFI_DELAY_SHORT ) * ( 1.0f - hStereoDft->lt_var_mean_ratio / STEREO_DFT_RES_RATIO_LIMIT ) ); + } + + /* Adapt the stereo filling delay by interpolating between two delay taps, one at the shortest delay and one at the longest delay */ + hStereoDft->stefi_short_gain = ( STEREO_DFT_STEFFI_DELAY_LONG - target_delay ) / ( STEREO_DFT_STEFFI_DELAY_LONG - STEREO_DFT_STEFFI_DELAY_SHORT ); + hStereoDft->stefi_long_gain = sqrtf( 1.0f - hStereoDft->stefi_short_gain * hStereoDft->stefi_short_gain ); + + + return; +} diff --git a/lib_dec/ivas_stereo_dft_dec_dmx.c b/lib_dec/ivas_stereo_dft_dec_dmx.c new file mode 100644 index 0000000000000000000000000000000000000000..120a060b2a00e1b159d5545a3ef6454f9d38a932 --- /dev/null +++ b/lib_dec/ivas_stereo_dft_dec_dmx.c @@ -0,0 +1,339 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_cnst.h" +#include "ivas_rom_com.h" +#include "ivas_rom_dec.h" +#include "rom_com.h" +#include "wmc_auto.h" + + +/*------------------------------------------------------------------------- + * stereo_dft_dmx_out_reset() + * + * Reset DFT stereo mono output memories + *------------------------------------------------------------------------*/ + +void stereo_dft_dmx_out_reset( + STEREO_DFT_DMX_DATA_HANDLE hStereoDftDmx /* i/o: DFT stereo DMX decoder */ +) +{ + hStereoDftDmx->targetGain = 1.0f; + hStereoDftDmx->prevTargetGain = 1.0f; + + set_zero( hStereoDftDmx->memOutHB, NS2SA( 48000, STEREO_DFT32MS_OVL_NS ) ); + set_zero( hStereoDftDmx->memTransitionHB, NS2SA( 48000, STEREO_DFT32MS_OVL_NS ) ); + + return; +} + + +/*------------------------------------------------------------------------- + * stereo_dft_unify_dmx() + * + * create a uniform dmx in case of residual coding by converting from passive + * to active dmx in residual coding region + *-------------------------------------------------------------------------*/ + +void stereo_dft_unify_dmx( + STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder stereo handle */ + Decoder_State *st0, /* i/o: decoder state structure */ + float DFT[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* i/o: DFT buffers */ + float *input_mem, /* i/o: mem of buffer DFT analysis */ + const int16_t prev_sid_nodata /* i : Previous SID/No data indicator */ +) +{ + int16_t i, k, b, N_div; + float DFT_L[STEREO_DFT32MS_N_MAX]; + float DFT_R[STEREO_DFT32MS_N_MAX]; + float *pDFT_DMX; + float *pDFT_RES; + float g, tmp; + float *pSideGain; + int16_t k_offset; + + /* Variables for stereo residual PLC */ + float DFT_PRED_RES[STEREO_DFT32MS_N_32k]; + float samp_ratio; + int16_t prev_bfi; + float dmx_nrg; + float *pPredGain; + int16_t stop; + int16_t output_frame; + int16_t plocs[STEREO_DFT_RES_N_PEAKS_MAX]; + int16_t num_plocs; + float plocsi[STEREO_DFT_RES_N_PEAKS_MAX]; + + output_frame = (int16_t) ( st0->output_Fs / FRAMES_PER_SEC ); + samp_ratio = (float) st0->sr_core / (float) st0->output_Fs; + prev_bfi = st0->prev_old_bfi; + + /* Initialization */ + k_offset = 1; + N_div = STEREO_DFT_NBDIV; + + dmx_nrg = 0.0f; + /* make sure number of bands corresponds to output bwidth in case it is lower than parameter bwidth */ + if ( output_frame < inner_frame_tbl[st0->bwidth] ) + { + hStereoDft->nbands = stereo_dft_band_config( hStereoDft->band_limits, hStereoDft->band_res[k_offset], hStereoDft->NFFT, DEC ); + } + if ( prev_bfi ) + { + dmx_nrg = stereo_dft_dmx_swb_nrg( DFT[0], DFT[0] + STEREO_DFT32MS_N_MAX, min( hStereoDft->NFFT, STEREO_DFT32MS_N_32k ) ); + } + + /* Analyze nature of current frame */ + hStereoDft->trans = ( ( ( st0->clas_dec == ONSET ) || ( st0->clas_dec == SIN_ONSET ) || ( st0->clas_dec == UNVOICED_CLAS ) || ( st0->clas_dec == UNVOICED_TRANSITION ) ) || ( st0->stab_fac <= 0.25f ) ) || + ( st0->core == TCX_20_CORE && ( ( st0->hTcxCfg->tcx_last_overlap_mode == MIN_OVERLAP ) || ( st0->hTcxCfg->tcx_last_overlap_mode == HALF_OVERLAP ) ) ) || ( st0->core == TCX_10_CORE ); + + /* Smoothing for the current frame */ + stereo_dft_dec_smooth_parameters( hStereoDft, prev_sid_nodata, st0->hFdCngDec->hFdCngCom->active_frame_counter, st0->element_brate ); + + for ( k = 0; k < N_div; k++ ) + { + pDFT_DMX = DFT[0] + k * STEREO_DFT32MS_N_MAX; + pDFT_RES = DFT[1] + k * STEREO_DFT32MS_N_MAX; + + assert( hStereoDft->hConfig->dmx_active ); + /*Apply Stereo*/ + g = 1.f; + + /* since delay is just 3.125ms, the parameters received are used for the second window */ + pSideGain = hStereoDft->side_gain + ( k + k_offset ) * STEREO_DFT_BAND_MAX; + + + /* Stereo residual PLC */ + if ( hStereoDft->res_cod_band_max > 0 ) + { + if ( !st0->bfi ) + { + if ( k == 1 ) + { + mvr2r( pDFT_RES, hStereoDft->res_mem, 2 * hStereoDft->band_limits[hStereoDft->res_cod_band_max] ); + hStereoDft->time_offs = 0; + } + } + else + { + hStereoDft->nbands = hStereoDft->res_cod_band_max; /* Limit nbands since residual PLC only needs the low frequency range of the stereo filling */ + pPredGain = hStereoDft->res_pred_gain + ( k + k_offset ) * STEREO_DFT_BAND_MAX; + hStereoDft->past_DMX_pos = ( hStereoDft->past_DMX_pos + STEREO_DFT_PAST_MAX - 1 ) % STEREO_DFT_PAST_MAX; + stereo_dft_generate_res_pred( hStereoDft, samp_ratio, pDFT_DMX, DFT_PRED_RES, pPredGain, k, DFT[1] + k * STEREO_DFT32MS_N_MAX, &stop, st0->bfi ); + stereo_dft_res_ecu( hStereoDft, pDFT_RES, DFT_PRED_RES, k, output_frame, prev_bfi, dmx_nrg, &num_plocs, plocs, plocsi, input_mem ); + } + } + + + /* Apply active DMX */ + DFT_L[0] = pDFT_DMX[0]; + DFT_R[0] = pDFT_DMX[0]; + + /* upmix residual part */ + for ( b = 0; b < hStereoDft->res_cod_band_max; b++ ) + { + g = pSideGain[b]; + + + for ( i = hStereoDft->band_limits[b]; i < hStereoDft->band_limits[b + 1]; i++ ) + { + tmp = g * pDFT_DMX[2 * i] + pDFT_RES[2 * i]; + + DFT_L[2 * i] = pDFT_DMX[2 * i] + tmp; + DFT_R[2 * i] = pDFT_DMX[2 * i] - tmp; + + tmp = g * pDFT_DMX[2 * i + 1] + pDFT_RES[2 * i + 1]; + + DFT_L[2 * i + 1] = pDFT_DMX[2 * i + 1] + tmp; + DFT_R[2 * i + 1] = pDFT_DMX[2 * i + 1] - tmp; + } + } + + /* downmix residual part with active downmix */ + for ( b = 0; b < hStereoDft->res_cod_band_max; b++ ) + { + int16_t j; + float sum_nrg_L = EPSILON, sum_nrg_R = EPSILON, dot_prod_real = EPSILON, dot_prod_img = EPSILON; + float sum_nrg_Mid, sum_abs, dot_prod_abs; + float wR, wL; + + for ( j = hStereoDft->band_limits[b]; j < hStereoDft->band_limits[b + 1]; j++ ) + { + sum_nrg_L += DFT_L[2 * j] * DFT_L[2 * j] + DFT_L[2 * j + 1] * DFT_L[2 * j + 1]; + sum_nrg_R += DFT_R[2 * j] * DFT_R[2 * j] + DFT_R[2 * j + 1] * DFT_R[2 * j + 1]; + dot_prod_real += DFT_L[2 * j] * DFT_R[2 * j] + DFT_L[2 * j + 1] * DFT_R[2 * j + 1]; + dot_prod_img += DFT_L[2 * j + 1] * DFT_R[2 * j] - DFT_L[2 * j] * DFT_R[2 * j + 1]; + } + sum_nrg_Mid = max( 0.f, sum_nrg_L + sum_nrg_R + 2.f * dot_prod_real ); + sum_abs = sqrtf( sum_nrg_L ) + sqrtf( sum_nrg_R ) + EPSILON; + dot_prod_abs = sqrtf( dot_prod_real * dot_prod_real + dot_prod_img * dot_prod_img ); + wR = sqrtf( 0.5f * ( sum_nrg_L + sum_nrg_R ) + dot_prod_abs ) / sum_abs; + wL = wR + sqrtf( 2.f ) * ( 1.f - sqrtf( sum_nrg_Mid ) / sum_abs ); + + for ( i = hStereoDft->band_limits[b]; i < hStereoDft->band_limits[b + 1]; i++ ) + { + /*DMX Mapping*/ + pDFT_DMX[2 * i] = ( wL * DFT_L[2 * i] + wR * DFT_R[2 * i] ) * INV_SQRT_2; + pDFT_DMX[2 * i + 1] = ( wL * DFT_L[2 * i + 1] + wR * DFT_R[2 * i + 1] ) * INV_SQRT_2; + } + } + + mvr2r( pDFT_DMX, DFT[0] + k * STEREO_DFT32MS_N_MAX, hStereoDft->NFFT ); + + /* Update DFT_past_DMX, needed for stereo filling used by stereo residual PLC */ + hStereoDft->past_DMX_pos = ( hStereoDft->past_DMX_pos + 1 ) % STEREO_DFT_PAST_MAX; + mvr2r( pDFT_DMX, hStereoDft->DFT_past_DMX[hStereoDft->past_DMX_pos], min( hStereoDft->NFFT, STEREO_DFT32MS_N_32k ) ); + + if ( st0->bfi && !prev_bfi ) + { + int16_t idx_k0, idx_k1; + idx_k0 = ( hStereoDft->past_DMX_pos + 1 ) % STEREO_DFT_PAST_MAX; + idx_k1 = ( idx_k0 + 1 ) % STEREO_DFT_PAST_MAX; + + /*dmx energy memory*/ + hStereoDft->past_dmx_nrg = stereo_dft_dmx_swb_nrg( hStereoDft->DFT_past_DMX[idx_k0], hStereoDft->DFT_past_DMX[idx_k1], min( hStereoDft->NFFT, STEREO_DFT32MS_N_32k ) ); + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * add_HB_to_mono_dmx() + * + * add ACELP HB for DFT Stereo mono output with residual coding + *-------------------------------------------------------------------*/ + +void add_HB_to_mono_dmx( + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + float output[L_FRAME48k], /* i/o: output synthesis */ + float outputHB[L_FRAME48k], /* i : HB synthesis */ + const int16_t last_core, /* i : last core, primary channel */ + const int16_t output_frame /* i : frame length */ +) +{ + int16_t i, j, decoderDelay, icbweOLASize, dftOvlLen, memOffset; + float temp[L_FRAME48k + NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS )]; + + float winSlope; + float alpha; + const float *win_dft; + int32_t output_Fs; + float *memOutHB, *memTransitionHB; + + output_Fs = hCPE->hCoreCoder[0]->output_Fs; + memOutHB = hCPE->hStereoDftDmx->memOutHB; + memTransitionHB = hCPE->hStereoDftDmx->memTransitionHB; + + memOffset = NS2SA( output_Fs, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ); + + if ( hCPE->hCoreCoder[0]->core == ACELP_CORE && hCPE->hCoreCoder[0]->extl_brate > 0 ) + { + /* Resampled LB and HB offset */ + mvr2r( outputHB, temp + memOffset, output_frame - memOffset ); + + decoderDelay = NS2SA( output_Fs, IVAS_DEC_DELAY_NS ); + + if ( last_core != ACELP_CORE ) + { + /* hb_synth of mid band is faded out in the 1.25 ms prior to DFT analysis and the icbwe is faded in time domain */ + icbweOLASize = NS2SA( output_Fs, STEREO_DFT_DELAY_DEC_BWE_NS ); + + for ( i = 0; i < decoderDelay; i++ ) + { + temp[i] = 0; + } + + assert( icbweOLASize > 0 ); + winSlope = 1.0f / icbweOLASize; + alpha = winSlope; + for ( ; i < decoderDelay + icbweOLASize; i++ ) + { + temp[i] *= alpha; + alpha += winSlope; + } + } + else + { + mvr2r( memOutHB, temp, memOffset ); + } + + v_add( temp, output, output, output_frame ); + + mvr2r( outputHB + output_frame - memOffset, memOutHB, memOffset ); + + win_dft = hCPE->hStereoDft->win32ms; + dftOvlLen = hCPE->hStereoDft->dft32ms_ovl; + + /* Preparing buffers in anticipation of an ACELP to TCX switch */ + j = 0; + for ( i = 0; i < memOffset; i++ ) + { + memTransitionHB[i] = memOutHB[i] * win_dft[STEREO_DFT32MS_STEP * ( dftOvlLen - 1 - j )]; + j++; + } + + for ( i = 0; j < dftOvlLen; i++ ) + { + memTransitionHB[memOffset + i] = outputHB[output_frame - i - 1] * win_dft[STEREO_DFT32MS_STEP * ( dftOvlLen - 1 - j )]; + j++; + } + } + else + { + if ( last_core == ACELP_CORE ) + { + /* This is generated in the ACELP frame and windowed. This process is akin to GenTransition for IC-BWE */ + if ( hCPE->element_mode == IVAS_CPE_DFT && hCPE->nchan_out == 1 && hCPE->hStereoDft->hConfig->res_cod_mode == STEREO_DFT_RES_COD_OFF ) + { + v_add( output, outputHB, output, NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) ); + } + else + { + v_add( output, memTransitionHB, output, NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) ); + } + + set_f( memOutHB, 0, memOffset ); + set_f( memTransitionHB, 0, NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) ); + } + } + + return; +} diff --git a/lib_dec/ivas_stereo_dft_plc.c b/lib_dec/ivas_stereo_dft_plc.c new file mode 100644 index 0000000000000000000000000000000000000000..8c7611f737711fe0b7d0b454e78c3d798b645987 --- /dev/null +++ b/lib_dec/ivas_stereo_dft_plc.c @@ -0,0 +1,384 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "cnst.h" +#include "prot.h" +#include "ivas_cnst.h" +#include "ivas_prot.h" +#include "math.h" +#include "wmc_auto.h" + +/*--------------------------------------------------------------- + * Local constants + * ---------------------------------------------------------------*/ + +#define ZP8k 15 /* zero padding in 8kHz DFT analysis */ +#define OFFSET8k 55 /* offset in 8 kHz */ +#define STEREO_DFT_PLC_STEP21 ( L_FRAME8k - OFFSET8k ) /* Step from subframe 2 in frame n to subframe 1 in frame n+1 */ +#define STEREO_DFT_PLC_PH_C ( 1.0f / 3.0329f ) /* Phase estimation constant, for estimating phase of fractional frequency */ + + +/*--------------------------------------------------------------- + * stereo_dft_res_ecu() + * + * Error concealment of DFT Stereo residual, including memory + * updates of DFT analysis memory and IMDCT OLA + * ---------------------------------------------------------------*/ + +void stereo_dft_res_ecu( + STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: Decoder DFT stereo handle */ + float *pDFT_RES, /* i/o: residual signal */ + float *const DFT_PRED_RES, /* i/o: residual prediction signal */ + const int16_t k, /* i : Subframe index */ + const int16_t output_frame, /* i : Output frame length */ + const int16_t prev_bfi, /* i : Previous BFI */ + const float dmx_nrg, /* i : Down-mix energy */ + int16_t *num_plocs, /* i/o: Number of peak locations */ + int16_t *plocs, /* i/o: Peak locations (bin) */ + float *plocsi, /* i/o: Peak locations (fractional) */ + float *input_mem /* o : Residual DFT buffer input mem */ +) +{ + float res_buf[L_FRAME8k]; + int16_t i; + int16_t L_res; + float step; + float fac; + float trigo_dec[STEREO_DFT32MS_N_8k / 2 + 1]; + int16_t trigo_step; + + set_zero( pDFT_RES, L_FRAME8k ); + + L_res = hStereoDft->band_limits[hStereoDft->res_cod_band_max]; + + stereo_dft_res_subst_spec( hStereoDft, pDFT_RES, DFT_PRED_RES, hStereoDft->time_offs, L_res, L_FRAME8k, k, num_plocs, plocs, plocsi, k == 0 ); + + fac = (float) ( L_FRAME8k ) / (float) ( hStereoDft->NFFT ); + + if ( hStereoDft->core_hist[0] == ACELP_CORE ) + { + fac *= 0.25f; + } + + trigo_step = STEREO_DFT_TRIGO_SRATE_8k_STEP * STEREO_DFT_TRIGO_DEC_STEP; + for ( i = 0; i < STEREO_DFT32MS_N_8k / 4; i++ ) + { + trigo_dec[i] = hStereoDft->dft_trigo_8k[i * trigo_step]; + trigo_dec[STEREO_DFT32MS_N_8k / 2 - i] = hStereoDft->dft_trigo_8k[i * trigo_step]; + } + trigo_dec[STEREO_DFT32MS_N_8k / 4] = hStereoDft->dft_trigo_8k[STEREO_DFT32MS_N_8k / 4 * trigo_step]; + + /* estimation of res_cod_mem (ola part in imdct residual signal) and input_mem (memory for buffer in DFT analysis)*/ + if ( k == 0 ) + { + mvr2r( pDFT_RES, res_buf, L_FRAME8k ); + stereo_dft_res_subst_spec( hStereoDft, res_buf, DFT_PRED_RES, hStereoDft->time_offs + output_frame, L_res, L_FRAME8k, k, num_plocs, plocs, plocsi, FALSE ); + + rfft( res_buf, trigo_dec, L_FRAME8k, +1 ); + + v_multc( res_buf, fac, res_buf, L_FRAME8k ); + mvr2r( res_buf + ( OFFSET8k - ZP8k ), hStereoDft->res_cod_mem, STEREO_DFT_OVL_8k ); + + mvr2r( res_buf + ZP8k, input_mem, NS2SA( 8000, STEREO_DFT32MS_OVL_NS ) ); /* Store memory for cross-fade to next frame, in case of good frame */ + } + else + { + mvr2r( pDFT_RES, res_buf, L_FRAME8k ); + + rfft( res_buf, trigo_dec, L_FRAME8k, +1 ); + + v_multc( res_buf, fac, res_buf, L_FRAME8k ); + + /* Cross-fade memory */ + fac = 0; + step = 1.0f / NS2SA( 8000, STEREO_DFT32MS_OVL_NS ); + for ( i = 0; i < NS2SA( 8000, STEREO_DFT32MS_OVL_NS ); i++ ) + { + input_mem[i] = ( 1 - fac ) * res_buf[i + L_FRAME8k - NS2SA( 8000, STEREO_DFT32MS_OVL_NS ) - ZP8k] + fac * input_mem[i]; + fac += step; + } + + /*in case of burst error*/ + hStereoDft->time_offs += L_FRAME8k; + } + + set_zero( DFT_PRED_RES, 2 * L_res ); + + if ( prev_bfi ) + { + stereo_dft_res_ecu_burst_att( hStereoDft, pDFT_RES, dmx_nrg, L_res, L_FRAME8k ); + } + + return; +} + + +/*--------------------------------------------------------------- + * stereo_dft_res_subst_spec() + * + * Generate error concealment frame in DFT domain + * ---------------------------------------------------------------*/ + +void stereo_dft_res_subst_spec( + STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: Decoder DFT stereo handle */ + float *pDFT_RES, /* i/o: residual signal */ + const float *const DFT_PRED_RES, /* i : residual prediction signal */ + const int16_t time_offs, /* i : Time offset for phase adjustment*/ + const int16_t L_res, /* i : bandwidth of residual signal */ + const int16_t L_ana, /* i : Length of FFT analysis */ + const int16_t k, /* i : Subframe index */ + int16_t *num_plocs, /* i/o: Number of peak locations */ + int16_t *plocs, /* i/o: Peak locations (bin) */ + float *plocsi, /* i/o: Peak locations (fractional) */ + const int16_t analysis_flag /* i : Flag for running peak analysis */ +) +{ + int16_t i, idx; + float fac; + float s1, s2, abs1, abs2, abs3, abs4; + float abs_res[( STEREO_DFT_RES_BW_MAX ) / 2]; + float Xmax, Xmin; + float sel; + float corr_phase; + float *p_mem; + float f_frac; + float peak_phase; + float phase_tmp; + float phase; + float conj_sign; + int16_t Np; + float cos_F, sin_F; + + /* initialization */ + mvr2r( DFT_PRED_RES, pDFT_RES, 2 * L_res ); + p_mem = hStereoDft->res_mem; + Np = 1; + + if ( analysis_flag ) + { + /* Perform spectral analysis on 2nd subframe of last good frame */ + abs_res[0] = 0.5f * ( p_mem[0] * p_mem[0] ); /* DC */ + for ( i = 1; i < L_res; i++ ) + { + abs_res[i] = ( p_mem[2 * i] * p_mem[2 * i] + p_mem[2 * i + 1] * p_mem[2 * i + 1] ); + } + + /* Find maxima */ + maximum( abs_res, L_res, &Xmax ); + minimum( abs_res, L_res, &Xmin ); + sel = ( Xmax - Xmin ) * ( 1.0f - 0.97f ); + + peakfinder( abs_res, L_res, plocs, num_plocs, sel, FALSE ); + /* Refine peaks */ + for ( i = 0; i < *num_plocs; i++ ) + { + if ( plocs[i] == 0 ) + { + plocsi[i] = plocs[i] + imax_pos( &abs_res[plocs[i]] ); + } + else if ( plocs[i] == L_res ) + { + plocsi[i] = plocs[i] - 2 + imax_pos( &abs_res[plocs[i] - 2] ); + } + else + { + plocsi[i] = plocs[i] - 1 + imax_pos( &abs_res[plocs[i] - 1] ); + } + } + } + + /* Apply phase of stereo filling on noise spectrum */ + for ( i = 1; i < L_res; i++ ) + { + s1 = sign( pDFT_RES[2 * i] ); + s2 = sign( pDFT_RES[2 * i + 1] ); + abs1 = fabsf( pDFT_RES[2 * i] ); + abs2 = fabsf( pDFT_RES[2 * i + 1] ); + abs3 = fabsf( p_mem[2 * i] ); + abs4 = fabsf( p_mem[2 * i + 1] ); + + fac = 1.0f; + + /* Low-complex phase matching that brings the angle within pi/4 of the target angle */ + if ( ( ( abs1 > abs2 ) && ( abs3 < abs4 ) ) || ( ( abs1 <= abs2 ) && ( abs3 >= abs4 ) ) ) + { + pDFT_RES[2 * i] = fac * s1 * abs4; + pDFT_RES[2 * i + 1] = fac * s2 * abs3; + } + else + { + pDFT_RES[2 * i] = fac * s1 * abs3; + pDFT_RES[2 * i + 1] = fac * s2 * abs4; + } + } + + /* Apply phase adjustment of identified peaks, including Np=1 peak neighbors on each side */ + for ( i = *num_plocs - 1; i >= 0; i-- ) + { + if ( k == 0 ) + { + /* For 1st subframe, apply reversed time ECU to get correct analysis window */ + f_frac = plocsi[i] - plocs[i]; + peak_phase = atan2f( p_mem[2 * plocs[i] + 1], p_mem[2 * plocs[i]] ); + phase_tmp = peak_phase - f_frac * STEREO_DFT_PLC_PH_C; + phase = phase_tmp - f_frac * EVS_PI; + corr_phase = -2 * phase - PI2 * ( STEREO_DFT_PLC_STEP21 + L_ana + time_offs ) * ( plocsi[i] / L_ana ); + conj_sign = -1.0f; + } + else + { + /* For 2nd subframe, do regular phase shift */ + corr_phase = PI2 * ( L_ana + time_offs ) * ( plocsi[i] / L_ana ); + conj_sign = 1.0f; + } + + cos_F = cosf( corr_phase ); + sin_F = sinf( corr_phase ); + + idx = max( 0, plocs[i] - Np ); /* Iterate over plocs[i]-1:plocs[i]+1, considering the edges of the spectrum */ + while ( ( idx < plocs[i] + Np + 1 ) && ( idx < L_res ) ) + { + pDFT_RES[2 * idx] = p_mem[2 * idx] * cos_F - p_mem[2 * idx + 1] * sin_F; + pDFT_RES[2 * idx + 1] = conj_sign * ( p_mem[2 * idx] * sin_F + p_mem[2 * idx + 1] * cos_F ); + idx++; + } + } + + return; +} + + +/*--------------------------------------------------------------- + * stereo_dft_res_ecu_burst_att() + * + * scaling residual PLC in burst error, considering DMX PLC attenuation + * ---------------------------------------------------------------*/ + +void stereo_dft_res_ecu_burst_att( + STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: Decoder DFT stereo handle */ + float *pDFT_RES, /* i/o: residual signal /att. residual */ + const float dmx_nrg, /* i : dmx energy of current frame */ + const int16_t L_res, /* i : Bandwidth of residual */ + const int16_t L_ana /* i : Length of FFT analysis */ +) +{ + float fac; + + /* attenuation of residual; follow attenuation of DMX */ + if ( hStereoDft->core_hist[0] == ACELP_CORE ) + { + fac = 0.1f * sqrtf( dmx_nrg / hStereoDft->past_dmx_nrg ); + } + else + { + fac = (int16_t) ( 1 - ( hStereoDft->time_offs - L_ana ) / ( hStereoDft->time_offs + L_ana ) ); + } + + v_multc( pDFT_RES, fac, pDFT_RES, 2 * L_res ); + + return; +} + + +/*--------------------------------------------------------------- + * stereo_dft_dmx_swb_nrg() + * + * Calculate DMX energy + * ---------------------------------------------------------------*/ + +/*! r: total energy of downmix with maximum swb bandwidth max */ +float stereo_dft_dmx_swb_nrg( + const float *dmx_k0, /* i : first subframe spectrum */ + const float *dmx_k1, /* i : second subframe spectrum */ + const int16_t frame_length /* i : frame lanegth */ +) +{ + int16_t i; + float dmx_nrg; + + dmx_nrg = EPSILON; + for ( i = 0; i < frame_length / 2; i++ ) + { + dmx_nrg += 0.5f * ( dmx_k0[2 * i] * dmx_k0[2 * i] + dmx_k0[2 * i + 1] * dmx_k0[2 * i + 1] + + dmx_k1[2 * i] * dmx_k1[2 * i] + dmx_k1[2 * i + 1] * dmx_k1[2 * i + 1] ); + } + + return dmx_nrg; +} + + +/*--------------------------------------------------------------- + * stereo_dft_sg_recovery() + * + * estimates panning measure + * updates recovery flag that might enbale recovery of side gain + * ---------------------------------------------------------------*/ + +int16_t stereo_dft_sg_recovery( + STEREO_DFT_DEC_DATA_HANDLE hStereoDft /* i/o: Decoder DFT stereo handle */ +) +{ + int16_t b; + float *pSideGain; + float sg_m; + float beta; + + if ( !hStereoDft->sg_mem_corrupt ) + { + pSideGain = hStereoDft->side_gain + 2 * STEREO_DFT_BAND_MAX; + beta = 0.425f; + + sg_m = EPSILON; + for ( b = 0; b < hStereoDft->nbands; b++ ) + { + sg_m += pSideGain[b]; + } + sg_m /= hStereoDft->nbands; + + if ( sg_m < 0.6f && sg_m > -0.6f ) + { + hStereoDft->sg_mean = 0.0f; + } + else + { + hStereoDft->sg_mean = beta * sg_m + ( 1 - beta ) * hStereoDft->sg_mean; /* LP filter delta_sg to obtain side gain stability measure */ + } + } + else if ( hStereoDft->sg_mean > 0.6f || hStereoDft->sg_mean < -0.6f ) + { + return 1; + } + + return 0; +} diff --git a/lib_dec/ivas_stereo_eclvq_dec.c b/lib_dec/ivas_stereo_eclvq_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..0a16d2acc7cb11027f80059d561c593c9bcde4f2 --- /dev/null +++ b/lib_dec/ivas_stereo_eclvq_dec.c @@ -0,0 +1,219 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "ivas_prot.h" +#include "ivas_cnst.h" +#include "ivas_rom_com.h" +#include "ivas_rom_dec.h" +#include +#include "prot.h" +#include "wmc_auto.h" + + +/*--------------------------------------------------------------- + * arith_decode_elias_mod() + * + * + * ---------------------------------------------------------------*/ + +static int16_t arith_decode_elias_mod( + RangeUniDecState *rc_st_dec ) +{ + int16_t n, n_bits, bit; + + n_bits = 0; + + bit = rc_uni_dec_read_bit( rc_st_dec ); + + while ( bit == 0 ) + { + bit = rc_uni_dec_read_bit( rc_st_dec ); + ++n_bits; + if ( n_bits == 17 ) + { + /* bitstream error encountered */ + rc_st_dec->bit_error_detected = 1; + return 0; + } + } + + if ( n_bits == 0 ) + { + /* code for 0 is 10 and code for 1 is 11 */ + n = rc_uni_dec_read_bit( rc_st_dec ); + } + else + { + n = rc_uni_dec_read_bits( rc_st_dec, n_bits ) + ( 1 << n_bits ); + } + + return n; +} + + +/*--------------------------------------------------------------- + * arith_decode_prob_escape() + * + * + * ---------------------------------------------------------------*/ + +static int16_t arith_decode_prob_escape( + RangeUniDecState *rc_st_dec, + const uint16_t cum_freq_table[], /* i : Cumulative frequency up to symbol */ + const uint16_t sym_freq_table[], /* i : Symbol frequency */ + const int16_t table_size ) +{ + int16_t symbol; + + symbol = rc_uni_dec_read_symbol_fastS( rc_st_dec, cum_freq_table, sym_freq_table, table_size, ECSQ_PROB_BITS ); + + if ( symbol == table_size - 1 ) /* escape symbol */ + { + /* decode the additional value using a modified Elias integer code */ + symbol += arith_decode_elias_mod( rc_st_dec ); + } + + return symbol; +} + + +/*--------------------------------------------------------------- + * ECSQ_decode() + * + * decode into output a quantized integer-valued vector, which must be afterwards dequantized; + * if global_gain_index == ECSQ_GLOBAL_GAIN_INDEX_ALL_ZERO, the entire vector is zero and the method should not be called; + * the dequantized vector is obtained using the ECSQ_dequantize_vector method + * ---------------------------------------------------------------*/ + +void ECSQ_decode( + ECSQ_instance *ecsq_inst, + const int16_t N, + int16_t *output ) +{ + int16_t i, idx, segment, segment_count, seg_start, seg_stop; + const uint16_t *tab_vals_cum_freq; + const uint16_t *tab_vals_sym_freq; + const uint16_t *tab_abs_lsbs_cum_freq; + const uint16_t *tab_abs_lsbs_sym_freq; + RangeUniDecState *rc_st_dec; + int16_t param_zb; /* zero-based parameter index for coding */ + int16_t shift, lsbs, nonzero, left1, left0, sym, count0; + + rc_st_dec = (RangeUniDecState *) ecsq_inst->ac_handle; + + + segment_count = ( N + ECSQ_SEGMENT_SIZE - 1 ) / ECSQ_SEGMENT_SIZE; + + for ( segment = 0; segment < segment_count; ++segment ) + { + seg_start = segment * ECSQ_SEGMENT_SIZE; + seg_stop = min( seg_start + ECSQ_SEGMENT_SIZE, N ) - 1; + + param_zb = rc_uni_dec_read_symbol_fastS( rc_st_dec, cum_freq_ECSQ_tab_param[ecsq_inst->config_index], sym_freq_ECSQ_tab_param[ecsq_inst->config_index], ECSQ_PARAM_COUNT, ECSQ_PROB_BITS ); + shift = max( 0, param_zb - 3 ); /* first nonzero shift of 1 is used for param 3 */ + + if ( param_zb != 0 ) /* not the ECSQ_ALL_ZERO_PARAM param */ + { + tab_vals_cum_freq = cum_freq_ECSQ_tab_vals[param_zb - 1]; + tab_vals_sym_freq = sym_freq_ECSQ_tab_vals[param_zb - 1]; + idx = min( shift, 4 ); + tab_abs_lsbs_cum_freq = cum_freq_ECSQ_tab_abs_lsbs[idx]; + tab_abs_lsbs_sym_freq = sym_freq_ECSQ_tab_abs_lsbs[idx]; + + for ( i = seg_start; i <= seg_stop; ++i ) + { + sym = arith_decode_prob_escape( rc_st_dec, tab_vals_cum_freq, tab_vals_sym_freq, ECSQ_TAB_VALS_SIZE ); + + if ( shift != 0 ) + { + if ( ( sym > 0 ) || ( shift > 4 ) ) + { + lsbs = rc_uni_dec_read_bits( rc_st_dec, shift ); + } + else /* (sym == 0) && (shift <= 4) */ + { + lsbs = rc_uni_dec_read_symbol_fastS( rc_st_dec, tab_abs_lsbs_cum_freq, tab_abs_lsbs_sym_freq, 1 << shift, ECSQ_PROB_BITS ); + } + sym = ( sym << shift ) | lsbs; + } + + if ( sym != 0 ) + { + sym *= 1 - 2 * rc_uni_dec_read_bit( rc_st_dec ); /* map the sign bit to +1 or -1 and then multiply */ + } + + output[i] = sym; + } + } + else + { + + nonzero = rc_uni_dec_read_bits( rc_st_dec, 2 ); + + left1 = nonzero; + left0 = ( seg_stop - seg_start + 1 ) - nonzero; + + for ( i = seg_start; i <= seg_stop; ++i ) + { + if ( left1 == 0 ) + { + sym = 0; + } + else if ( left0 == 0 ) + { + sym = 1; + } + else + { + count0 = left0 * ECSQ_tab_inverse[left0 + left1]; /* left0 * round(ECSQ_PROB_TOTAL / (left0 + left1)) */ + sym = rc_uni_dec_read_bit_prob_fast( rc_st_dec, count0, ECSQ_PROB_BITS ); + } + + if ( sym != 0 ) + { + sym *= 1 - 2 * rc_uni_dec_read_bit( rc_st_dec ); /* map the sign bit to +1 or -1 and then multiply */ + --left1; + } + else + { + --left0; + } + + output[i] = sym; + } + } + } + + return; +} diff --git a/lib_dec/ivas_stereo_esf_dec.c b/lib_dec/ivas_stereo_esf_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..391398fd0dec5927fd35b25852070d6eefaa4d73 --- /dev/null +++ b/lib_dec/ivas_stereo_esf_dec.c @@ -0,0 +1,125 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "ivas_prot.h" +#include "ivas_stat_dec.h" +#include "ivas_cnst.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * init_basic_allpass() + * + * + *-------------------------------------------------------------------*/ + +void init_basic_allpass( + basic_allpass_t *ap, + const float *gains, + const int16_t *delays ) +{ + int16_t i, j; + + for ( i = 0; i < 3; i++ ) + { + ap->gains[i] = gains[i]; + ap->delays[i] = delays[i]; + + for ( j = 0; j < STEREO_DFT_ALLPASS_BUFFERLEN; j++ ) + { + ap->buffer[i][j] = 0.f; + } + } + + ap->pos = 0; + + return; +} + + +/*-------------------------------------------------------------------* + * filter_with_allpass() + * + * + *-------------------------------------------------------------------*/ + +void filter_with_allpass( + const float *sig, + float *out, + const int16_t len, + basic_allpass_t *ap ) +{ + int16_t k; + int16_t pos, mask; + int16_t d1, d2, d3; + float P1, P2, P3, P4, P5; + float g1, g2, g3, *D1, *D2, *D3; + + P1 = P2 = P3 = P4 = P5 = 0; + mask = STEREO_DFT_ALLPASS_BUFFERLEN - 1; + + pos = ap->pos; + + g1 = ap->gains[0]; + g2 = ap->gains[1]; + g3 = ap->gains[2]; + + d1 = ap->delays[0]; + d2 = ap->delays[1]; + d3 = ap->delays[2]; + + D1 = ap->buffer[0]; + D2 = ap->buffer[1]; + D3 = ap->buffer[2]; + + for ( k = 0; k < len; k++ ) + { + P1 = sig[k] - g3 * D3[pos]; + P2 = P1 - g1 * D1[pos]; + P3 = D1[pos] + g1 * P2 - g2 * D2[pos]; + P4 = D2[pos] + g2 * P3; + P5 = D3[pos] + g3 * P1; + + out[k] = P5; /* could overwrite sig */ + + D1[( pos + d1 ) & mask] = P2; + D2[( pos + d2 ) & mask] = P3; + D3[( pos + d3 ) & mask] = P4; + + pos = ( pos + 1 ) & mask; + } + + ap->pos = pos; + + return; +} diff --git a/lib_dec/ivas_stereo_ica_dec.c b/lib_dec/ivas_stereo_ica_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..760d81ce6eedffc3a5d64cab30f669ee4ef42ca9 --- /dev/null +++ b/lib_dec/ivas_stereo_ica_dec.c @@ -0,0 +1,357 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include "options.h" +#include +#include "cnst.h" +#include "ivas_cnst.h" +#include "prot.h" +#include "ivas_prot.h" +#include "wmc_auto.h" +#include "rom_com.h" +#include "ivas_rom_com.h" + + +/*--------------------------------------------------------------- + * stereo_tca_dec() + * + * Stereo temporal channel adjustment/allocation processing module; + * upnmix, convert L/R to M/S. + * ---------------------------------------------------------------*/ + +void stereo_tca_dec( + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + float *synth[CPE_CHANNELS], /* i/o: output synth */ + const int16_t output_frame /* i : length of a frame per channel */ +) +{ + /* Buffers, input Left and right channels @ input_Fs*/ + float bufChanL[L_DEC_MEM_LEN_ICA + L_FRAME48k]; + float bufChanR[L_DEC_MEM_LEN_ICA + L_FRAME48k]; + float *ptrChanL, *ptrChanR; + float *target; + int16_t target_idx, prevNCShift, currentNCShift, l_shift_adapt; + int16_t dsFactor, tempMax; + float *ref; + int16_t bothChannelShift; + int32_t output_Fs; + STEREO_TCA_DEC_HANDLE hStereoTCA; + + hStereoTCA = hCPE->hStereoTCA; + + output_Fs = hCPE->hCoreCoder[0]->output_Fs; + + if ( hCPE->nchan_out == 1 ) + { + if ( hCPE->hStereoDftDmx ) + { + if ( hCPE->element_mode == IVAS_CPE_DFT ) + { + hCPE->hStereoDftDmx->targetGain = 1.0f; + } + + /* save the target gain for next frame */ + hCPE->hStereoDftDmx->prevTargetGain = hCPE->hStereoDftDmx->targetGain; + } + + return; + } + else if ( hCPE->element_mode == IVAS_CPE_MDCT && !hCPE->hStereoMdct->use_itd ) + { + return; + } + + /* populate L/R memories into current buffers */ + mvr2r( hStereoTCA->memChanL, bufChanL, L_DEC_MEM_LEN_ICA ); + mvr2r( hStereoTCA->memChanR, bufChanR, L_DEC_MEM_LEN_ICA ); + + /* pointers to the current frame */ + ptrChanL = bufChanL + L_DEC_MEM_LEN_ICA; + ptrChanR = bufChanR + L_DEC_MEM_LEN_ICA; + + /* copy interleaved stereo data to two channels, e.g., L, R */ + mvr2r( synth[0], ptrChanL, output_frame ); + mvr2r( synth[1], ptrChanR, output_frame ); + + /* back up the L/R target synth for next frame */ + mvr2r( bufChanL + output_frame, hStereoTCA->memChanL, L_DEC_MEM_LEN_ICA ); + mvr2r( bufChanR + output_frame, hStereoTCA->memChanR, L_DEC_MEM_LEN_ICA ); + + /* TCA parameter de-quantize */ + dsFactor = (int16_t) ( output_Fs / 8000 ); + tempMax = NS2SA( output_Fs, L_NCSHIFT_NS ); + hStereoTCA->corrLagStats = min( hStereoTCA->indx_ica_NCShift * dsFactor, tempMax ); + + bothChannelShift = 0; + if ( hCPE->element_mode == IVAS_CPE_DFT || hCPE->element_mode == IVAS_CPE_MDCT ) + { + hStereoTCA->corrLagStats = 0; + hStereoTCA->refChanIndx = L_CH_INDX; + hStereoTCA->targetGain = 1.0f; + + if ( hCPE->element_mode == IVAS_CPE_DFT ) + { + hStereoTCA->corrLagStats = (int16_t) fabsf( hCPE->hStereoDft->itd[1] ); + hStereoTCA->refChanIndx = ( hCPE->hStereoDft->itd[1] >= 0 ) ? ( L_CH_INDX ) : ( R_CH_INDX ); + } + else if ( hCPE->element_mode == IVAS_CPE_MDCT ) + { + float itd; + + itd = hCPE->hStereoMdct->itd; + hStereoTCA->corrLagStats = (int16_t) fabsf( itd ); + hStereoTCA->refChanIndx = ( itd >= 0 ) ? ( L_CH_INDX ) : ( R_CH_INDX ); + } + + if ( hStereoTCA->refChanIndx != hStereoTCA->prevRefChanIndx && hStereoTCA->corrLagStats != 0 ) + { + bothChannelShift = 1; + } + } + + prevNCShift = (int16_t) abs( hStereoTCA->prevCorrLagStats ); + currentNCShift = (int16_t) abs( hStereoTCA->corrLagStats ); + + if ( hCPE->element_mode == IVAS_CPE_TD && hCPE->last_element_mode == IVAS_CPE_TD ) + { + if ( hStereoTCA->corrLagStats == hStereoTCA->prevCorrLagStats && hStereoTCA->interp_dec_switch_to_zero_diff == 0 ) + { + hStereoTCA->interp_dec_switch_to_zero_diff = 1; + } + else + { + hStereoTCA->interp_dec_switch_to_zero_diff = 0; + } + + if ( currentNCShift != 0 ) + { + currentNCShift = TRUNC( 0.6 * prevNCShift + 0.4 * currentNCShift ); + } + + prevNCShift = hStereoTCA->interp_dec_prevNCShift; + hStereoTCA->interp_dec_prevNCShift = currentNCShift; + } + else + { + hStereoTCA->interp_dec_prevNCShift = currentNCShift; + hStereoTCA->interp_dec_switch_to_zero_diff = 0; + } + + ref = ptrChanL; + target = ptrChanR; + target_idx = R_CH_INDX; + /* identify target signal to adjust for shift variations */ + if ( ( prevNCShift == 0 && hStereoTCA->refChanIndx == R_CH_INDX ) || ( hStereoTCA->prevRefChanIndx == R_CH_INDX ) ) + { + ref = ptrChanR; + target = ptrChanL; + target_idx = L_CH_INDX; + } + + if ( bothChannelShift == 1 ) + { + ref = ptrChanL; + target = ptrChanR; + target_idx = R_CH_INDX; + if ( hStereoTCA->refChanIndx == R_CH_INDX ) + { + ref = ptrChanR; + target = ptrChanL; + target_idx = L_CH_INDX; + } + } + + /* target signal adjustment for temporal shift variations */ + if ( hStereoTCA->prevCorrLagStats != hStereoTCA->corrLagStats || bothChannelShift || ( hStereoTCA->interp_dec_switch_to_zero_diff == 1 && hCPE->element_mode == IVAS_CPE_TD ) ) + { + l_shift_adapt = L_SHIFT_ADAPT_16k; + if ( output_Fs > 16000 ) + { + l_shift_adapt = L_SHIFT_ADAPT_MAX; + } + + if ( hCPE->element_mode == IVAS_CPE_TD && hCPE->last_element_mode == IVAS_CPE_DFT ) + { + l_shift_adapt = l_shift_adapt >> 1; + } + + if ( abs( currentNCShift - prevNCShift ) <= N_MAX_SHIFT_CHANGE && bothChannelShift == 0 ) + { + adjustTargetSignal( target - currentNCShift, currentNCShift, prevNCShift, l_shift_adapt, 0 ); + } + else + { + if ( bothChannelShift == 1 ) + { + adjustTargetSignal( ref, 0, prevNCShift, l_shift_adapt, 1 ); + adjustTargetSignal( target - currentNCShift, currentNCShift, 0, l_shift_adapt, 1 ); + } + else + { + adjustTargetSignal( target - currentNCShift, currentNCShift, prevNCShift, l_shift_adapt, 1 ); + } + } + } + + /* temporal channel adjustment */ + mvr2r( target - currentNCShift, synth[target_idx], output_frame ); + + mvr2r( ref, synth[!target_idx], output_frame ); + + /* Scale the Right channel with the gain */ + stereo_tca_scale_R_channel( hCPE, synth[1], output_frame ); + + /*-----------------------------------------------------------------* + * updates and memory backups + *-----------------------------------------------------------------*/ + + /* save the reference channel index for next frame */ + hStereoTCA->prevRefChanIndx = hStereoTCA->refChanIndx; + + /* save the corr lag stats for next frame */ + hStereoTCA->prevCorrLagStats = hStereoTCA->corrLagStats; + + /* save the target gain for next frame */ + hStereoTCA->prevTargetGain = hStereoTCA->targetGain; + + return; +} + +/*-------------------------------------------------------------------* + * stereo_tca_scale_R_channel() + * + * Scale the Right channel with the gain + *-------------------------------------------------------------------*/ + +void stereo_tca_scale_R_channel( + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + float *output, /* i/o: output synthesis, R channel */ + const int16_t output_frame /* i : frame length */ +) +{ + STEREO_TCA_DEC_HANDLE hStereoTCA; + int16_t i, j, l_ica_ovl, flat_old; + float tempF, tempF1, winSlope; + int32_t output_Fs; + + hStereoTCA = hCPE->hStereoTCA; + output_Fs = hCPE->hCoreCoder[0]->output_Fs; + + if ( hCPE->hCoreCoder[0]->core_brate <= SID_2k40 && hCPE->nchan_out == 2 ) + { + return; + } + /* Scale the Right channel with the gain */ + l_ica_ovl = NS2SA( output_Fs, STEREO_L_TCA_OVLP_NS ); + + if ( hCPE->nchan_out == 1 ) + { + /* in mono DMX, the scaling is done before synchro_synthesis() */ + flat_old = NS2SA( output_Fs, ACELP_LOOK_NS + IVAS_DEC_DELAY_NS - DELAY_CLDFB_NS ); + + if ( hCPE->last_element_mode == IVAS_CPE_TD && hCPE->element_mode == IVAS_CPE_DFT ) + { + hCPE->hStereoDftDmx->prevTargetGain *= 2.0f; + hCPE->hStereoDftDmx->prevTargetGain = min( hCPE->hStereoDftDmx->prevTargetGain, powf( 10, ( ( 1 << STEREO_BITS_TCA_GD ) - 1 ) * STEREO_TCA_GDSTEP + STEREO_TCA_GDMIN ) ); + hCPE->hStereoDftDmx->targetGain = 1.0f; + + flat_old = NS2SA( output_Fs, IVAS_DEC_DELAY_NS ); + } + } + else if ( hCPE->last_element_mode == IVAS_CPE_TD && hCPE->element_mode == IVAS_CPE_DFT ) + { + flat_old = NS2SA( output_Fs, IVAS_DEC_DELAY_NS ); + } + else + { + flat_old = NS2SA( output_Fs, ACELP_LOOK_NS + IVAS_DEC_DELAY_NS ); + } + + if ( hCPE->nchan_out == 1 ) + { + tempF1 = 1.0f / hCPE->hStereoDftDmx->targetGain; + tempF = 1.0f / hCPE->hStereoDftDmx->prevTargetGain; + } + else + { + tempF1 = 1.0f / hStereoTCA->targetGain; + tempF = 1.0f / hStereoTCA->prevTargetGain; + } + winSlope = 1.0f / (float) l_ica_ovl; + + for ( i = 0; i < flat_old; i++ ) + { + output[i] *= tempF; + } + for ( j = 0; i < flat_old + l_ica_ovl; i++, j++ ) + { + output[i] = ( 1.0f - j * winSlope ) * tempF * output[i] + ( j * winSlope ) * tempF1 * output[i]; + } + for ( ; i < output_frame; i++ ) + { + output[i] *= tempF1; + } + + return; +} + + +/*-------------------------------------------------------------------* + * stereo_tca_init_dec() + * + * Stereo temporal channel adjustment (TCA) decoder initialization + *-------------------------------------------------------------------*/ + +void stereo_tca_init_dec( + STEREO_TCA_DEC_HANDLE hStereoTCA /* i/o: Stereo TCA handle */ +) +{ + hStereoTCA->refChanIndx = L_CH_INDX; + hStereoTCA->prevRefChanIndx = L_CH_INDX; + hStereoTCA->indx_ica_NCShift = 0; + hStereoTCA->indx_ica_gD = 0; + hStereoTCA->targetGain = 1.0f; + hStereoTCA->prevTargetGain = 1.0f; + + hStereoTCA->corrLagStats = 0; + hStereoTCA->prevCorrLagStats = 0; + + hStereoTCA->interp_dec_prevNCShift = 0; + hStereoTCA->interp_dec_switch_to_zero_diff = 0; + + set_f( hStereoTCA->memChanL, 0.0f, L_DEC_MEM_LEN_ICA ); + set_f( hStereoTCA->memChanR, 0.0f, L_DEC_MEM_LEN_ICA ); + + return; +} diff --git a/lib_dec/ivas_stereo_icbwe_dec.c b/lib_dec/ivas_stereo_icbwe_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..334fb5bd71b00e4d402371cb04eb9a28b32ad8e8 --- /dev/null +++ b/lib_dec/ivas_stereo_icbwe_dec.c @@ -0,0 +1,804 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include "options.h" +#include +#include "cnst.h" +#include "ivas_cnst.h" +#include "prot.h" +#include "ivas_prot.h" +#include "wmc_auto.h" +#include "rom_com.h" +#include "ivas_rom_com.h" + +/*-------------------------------------------------------------------* + * ic_bwe_dec_reset() + * + * core switching reset of IC BWE memory + *-------------------------------------------------------------------*/ + +static void ic_bwe_dec_reset( + STEREO_ICBWE_DEC_HANDLE hStereoICBWE /* i/o: Stereo ICBWE handle */ +) +{ + /* unscaled & scaled SHB synthesis memory */ + set_f( hStereoICBWE->mem_syn_shb_nonref, 0, L_SHB_LAHEAD ); /* use samples from !acelp) */ + set_f( hStereoICBWE->mem_lpc_shbsynth_nonref, 0, LPC_SHB_ORDER ); + set_f( hStereoICBWE->mem_syn_shb_ola_nonref, 0, L_SHB_LAHEAD ); /* use samples from !acelp) */ + + /* inter-channel BWE SP and GSP mem reset */ + hStereoICBWE->memShbSpecMapping = 0; + + set_f( hStereoICBWE->memShbHilbert_nonref, 0, HILBERT_MEM_SIZE ); + set_f( hStereoICBWE->memShbInterp_nonref, 0, ( 2 * ALLPASSSECTIONS_STEEP + 1 ) ); + set_f( hStereoICBWE->memShb_fsout_nonref, 0, INTERP_3_2_MEM_LEN ); + hStereoICBWE->syn_dm_phase_nonref = 0; + + return; +} + + +/*-------------------------------------------------------------------* + * stereo_icBWE_dec() + * + * Spatial mapping of reference to the non-reference channels in SHB + *-------------------------------------------------------------------*/ + +void stereo_icBWE_dec( + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + float *synthRef, /* i/o: Reference channel HB synthesis at output Fs */ + float *synth, /* o : Non reference channel HB synthesis at output Fs */ + const float *fb_synth_ref, /* i : ref. high-band synthesis 16-20 kHz */ + const float *voice_factors, /* i : voicing factors */ + const int16_t output_frame /* i : frame length */ +) +{ + int16_t i, j, k, nbSubFr; + Decoder_State *st; /* i/o: decoder state structure, primary channel */ + int16_t spIndx, gsIndx; + float excSHB_nonref[L_FRAME16k]; + float shb_synth_nonref[L_FRAME16k + L_SHB_LAHEAD]; + float error[L_FRAME32k]; + float nlMixFac[NB_SUBFR16k]; + float gsMapping, specMapping; + float fb_synth_nonref[L_FRAME48k]; + float scale, prev_pow, curr_pow, temp; + float alpha, winSlope, winLen, prevgsMapping; + float temp1, temp2; + float icbweM2Ref, ratio_L; + + STEREO_DFT_DEC_DATA_HANDLE hStereoDft = hCPE->hStereoDft; + STEREO_ICBWE_DEC_HANDLE hStereoICBWE = hCPE->hStereoICBWE; + st = hCPE->hCoreCoder[0]; + + /*--------------------------------------------------------------------* + * skip IC-BWE in case of mono DMX output * + * -------------------------------------------------------------------*/ + + if ( hCPE->element_mode == IVAS_CPE_DFT && hCPE->nchan_out == 1 && hCPE->hStereoDft->hConfig->res_cod_mode > STEREO_DFT_RES_COD_OFF ) + { + hCPE->hStereoDft->core_hist[0] = st->core; + + return; + } + else if ( hCPE->element_mode == IVAS_CPE_DFT && hCPE->nchan_out == 1 ) + { + + return; + } + + /*--------------------------------------------------------------------* + * skip IC-BWE in case of SID or NO_DATA frame + * -------------------------------------------------------------------*/ + + if ( st->core_brate <= SID_2k40 ) + { + return; + } + + /*--------------------------------------------------------------------* + * TD high band stereo filling * + * -------------------------------------------------------------------*/ + + /* update buffers for TD stereo filling */ + if ( hCPE->element_mode == IVAS_CPE_DFT ) + { + float hb_nrg = EPSILON; + float hb_nrg2 = EPSILON; + + if ( st->core == ACELP_CORE || st->last_core == ACELP_CORE ) + { + for ( i = 0; i < output_frame / 2; i++ ) + { + hb_nrg2 += synthRef[i] * synthRef[i]; + } + + hCPE->hStereoDft->hb_nrg_subr[0] = hb_nrg2; + hb_nrg += hb_nrg2; + hb_nrg2 = EPSILON; + + for ( ; i < output_frame; i++ ) + { + hb_nrg2 += synthRef[i] * synthRef[i]; + } + + hCPE->hStereoDft->hb_nrg_subr[1] = hb_nrg2; + hb_nrg += hb_nrg2; + + mvr2r( synthRef, hCPE->hStereoDft->hb_stefi_sig + hCPE->hStereoDft->hb_stefi_delay, output_frame ); + } + else + { + set_zero( hCPE->hStereoDft->hb_stefi_sig + hCPE->hStereoDft->hb_stefi_delay, output_frame ); + } + hCPE->hStereoDft->hb_nrg_subr[0] *= hCPE->hStereoDft->NFFT / 2; + hCPE->hStereoDft->hb_nrg_subr[1] *= hCPE->hStereoDft->NFFT / 2; + hCPE->hStereoDft->hb_nrg[0] = hb_nrg; + hCPE->hStereoDft->td_gain[0] = 0; + hCPE->hStereoDft->core_hist[0] = st->core; + } + + /*--------------------------------------------------------------------* + * IC-BWE * + * -------------------------------------------------------------------*/ + + if ( st->core != ACELP_CORE || st->extl == -1 || ( hCPE->element_mode == IVAS_CPE_TD && hCPE->hCoreCoder[0]->tdm_LRTD_flag ) ) + { + return; + } + else if ( hCPE->element_mode == IVAS_CPE_DFT && st->core_brate <= SID_2k40 ) + { + mvr2r( synthRef, synth, output_frame ); + return; + } + + + set_f( fb_synth_nonref, 0, L_FRAME48k ); + + /* core switching reset */ + if ( st->last_core != ACELP_CORE || st->bwidth == WB ) + { + ic_bwe_dec_reset( hStereoICBWE ); + + if ( st->last_core != ACELP_CORE ) + { + hStereoICBWE->prevSpecMapping = 0.0f; + hStereoICBWE->prevgsMapping = 1.0f; + hStereoICBWE->icbweM2Ref_prev = 1.0f; + } + + if ( st->bwidth == WB ) + { + /* copy to outputHB and reset hb_synth values */ + mvr2r( synthRef, synth, output_frame ); + + if ( st->element_mode == IVAS_CPE_TD ) + { + hStereoICBWE->prevSpecMapping = 0.0f; + hStereoICBWE->prevgsMapping = 1.0f; + hStereoICBWE->icbweM2Ref_prev = 1.0f; + } + else if ( st->element_mode == IVAS_CPE_DFT ) + { + hStereoICBWE->refChanIndx_bwe = L_CH_INDX; + hStereoICBWE->prevSpecMapping = 0.0f; + + prevgsMapping = hStereoICBWE->prevgsMapping; + temp1 = hStereoDft->side_gain[2 * STEREO_DFT_BAND_MAX + hStereoDft->nbands - 1]; + icbweM2Ref = 1.f + temp1; + gsMapping = 1.f - temp1; + + winLen = (int16_t) ( ( SHB_OVERLAP_LEN * st->output_Fs ) / 16000 ); + winSlope = 1.0f / winLen; + alpha = winSlope; + for ( i = 0; i < winLen; i++ ) + { + synthRef[i] *= ( alpha * ( icbweM2Ref ) + ( 1.0f - alpha ) * ( hStereoICBWE->icbweM2Ref_prev ) ); + synth[i] *= ( alpha * ( gsMapping ) + ( 1.0f - alpha ) * ( prevgsMapping ) ); + alpha += winSlope; + } + for ( ; i < NS2SA( st->output_Fs, FRAME_SIZE_NS ); i++ ) + { + synthRef[i] *= ( icbweM2Ref ); + synth[i] *= ( gsMapping ); + } + hStereoICBWE->icbweM2Ref_prev = icbweM2Ref; + hStereoICBWE->prevgsMapping = gsMapping; + } + + return; + } + } + + if ( !st->bfi ) + { + hStereoICBWE->refChanIndx_bwe = get_next_indice( st, STEREO_ICBWE_REFBITS ); + if ( st->flag_ACELP16k == 1 ) + { + spIndx = get_next_indice( st, STEREO_ICBWE_SPBITS ); + } + else + { + spIndx = 3; + } + if ( st->element_mode == IVAS_CPE_TD ) + { + gsIndx = get_next_indice( st, STEREO_ICBWE_GSBITS ); + } + else + { + gsIndx = get_next_indice( st, STEREO_ICBWE_GSBITS_DFT ); + } + + /* Store indices in case of frame loss */ + hStereoICBWE->prev_spIndx = spIndx; + hStereoICBWE->prev_gsIndx = gsIndx; + } + else /*bfi*/ + { + /* Retrieve last decoded indices */ + spIndx = hStereoICBWE->prev_spIndx; + gsIndx = hStereoICBWE->prev_gsIndx; + hStereoICBWE->refChanIndx_bwe = hStereoICBWE->prev_refChanIndx_bwe; + } + + /* IC-BWE parameter de-quant */ + /* sp Mapping */ + hStereoICBWE->prevSpecMapping = usdequant( spIndx, -0.6f, 0.2f ); + + /* gs Mapping */ + prevgsMapping = hStereoICBWE->prevgsMapping; + + if ( st->element_mode == IVAS_CPE_TD ) + { + hStereoICBWE->prevgsMapping = icbwe_gsMapping_tbl[gsIndx]; + } + else + { + hStereoICBWE->prevgsMapping = icbwe_gsMappingDFT_tbl[gsIndx]; + } + + hStereoICBWE->prevgsMapping = powf( 10, hStereoICBWE->prevgsMapping ); + + specMapping = hStereoICBWE->prevSpecMapping; + gsMapping = hStereoICBWE->prevgsMapping; + + if ( ( st->extl == SWB_TBE || st->extl == FB_TBE ) && st->flag_ACELP16k == 1 ) + { + mvr2r( voice_factors, nlMixFac, NB_SUBFR16k ); + if ( hCPE->hStereoDftDmx != NULL ) + { + if ( hCPE->hStereoDftDmx->targetGain < 0.5f || hCPE->hStereoDftDmx->targetGain > 2.0f ) + { + v_multc( voice_factors, 0.5f, nlMixFac, NB_SUBFR16k ); + } + } + else + { + if ( hCPE->hStereoTCA->targetGain < 0.5f || hCPE->hStereoTCA->targetGain > 2.0f ) + { + v_multc( voice_factors, 0.5f, nlMixFac, NB_SUBFR16k ); + } + } + + nbSubFr = ( st->flag_ACELP16k == 0 ) ? NB_SUBFR : NB_SUBFR16k; + for ( i = 0, k = 0; i < nbSubFr; i++ ) + { + if ( hCPE->hCoreCoder[0]->coder_type == UNVOICED || hStereoICBWE->MSFlag == 1 ) + { + temp1 = 0; + temp2 = 1.0f; + } + else + { + temp1 = sqrtf( nlMixFac[i] ); + temp2 = sqrtf( 1.0f - nlMixFac[i] ); + } + + for ( j = 0; j < L_FRAME16k / nbSubFr; j++, k++ ) + { + excSHB_nonref[k] = temp1 * hStereoICBWE->nlExc16k[k] + temp2 * hStereoICBWE->mixExc16k[k]; + } + } + + /* LP synthesis */ + mvr2r( hStereoICBWE->mem_syn_shb_nonref, shb_synth_nonref, L_SHB_LAHEAD ); + syn_filt( hStereoICBWE->lpSHBRef, LPC_SHB_ORDER, excSHB_nonref, shb_synth_nonref + L_SHB_LAHEAD, L_FRAME16k, hStereoICBWE->mem_lpc_shbsynth_nonref, 1 ); + + prev_pow = sum2_f( shb_synth_nonref, L_SHB_LAHEAD + 10 ); + curr_pow = sum2_f( shb_synth_nonref + L_SHB_LAHEAD + 10, L_SHB_LAHEAD + 10 ); + + if ( prev_pow == 0 ) + { + scale = 0; + } + else + { + scale = sqrtf( curr_pow / prev_pow ); + } + + for ( i = 0; i < L_SHB_LAHEAD; i++ ) + { + shb_synth_nonref[i] *= scale; + } + + for ( ; i < L_SHB_LAHEAD + 10; i++ ) + { + temp = ( i - 19 ) / 10.0f; + shb_synth_nonref[i] *= ( temp * 1.0f + ( 1.0f - temp ) * scale ); + } + + /* spec and gs adjustment */ + deemph( shb_synth_nonref + L_SHB_LAHEAD, specMapping, L_FRAME16k, &( hStereoICBWE->memShbSpecMapping ) ); + mvr2r( shb_synth_nonref + L_FRAME16k, hStereoICBWE->mem_syn_shb_nonref, L_SHB_LAHEAD ); + + ScaleShapedSHB( SHB_OVERLAP_LEN, shb_synth_nonref, hStereoICBWE->mem_syn_shb_ola_nonref, hStereoICBWE->gshapeRef, ( hStereoICBWE->gFrameRef * gsMapping * 0.9f ), window_shb, subwin_shb ); + + if ( st->extl == FB_TBE ) + { + v_multc( fb_synth_ref, gsMapping, fb_synth_nonref, L_FRAME48k ); + } + + /* generate 32kHz SHB synthesis from 12.8(16)kHz signal */ + GenSHBSynth( shb_synth_nonref, error, hStereoICBWE->memShbHilbert_nonref, hStereoICBWE->memShbInterp_nonref, st->L_frame, &( hStereoICBWE->syn_dm_phase_nonref ) ); + } + else + { + mvr2r( synthRef, synth, output_frame ); + + winLen = (int16_t) ( ( SHB_OVERLAP_LEN * st->output_Fs ) / 16000 ); + winSlope = 1.0f / winLen; + alpha = winSlope; + + ratio_L = ( hCPE->element_mode == IVAS_CPE_DFT ) ? ( 0.5f ) : ( tdm_ratio_tabl[hCPE->hStereoTD->tdm_last_ratio_idx] ); + + icbweM2Ref = gsMapping; + if ( hStereoICBWE->refChanIndx_bwe == L_CH_INDX ) + { + if ( ratio_L >= 0.1f ) + { + icbweM2Ref = sqrtf( 0.5f - min( 0.5f, ( 1 - ratio_L ) * ( 1 - ratio_L ) * gsMapping * gsMapping ) ) / ratio_L; + } + } + else + { + if ( ratio_L <= 0.9f ) + { + icbweM2Ref = sqrtf( 0.5f - min( 0.5f, ratio_L * ratio_L * gsMapping * gsMapping ) ) / ( 1 - ratio_L ); + } + } + + icbweM2Ref = max( gsMapping, icbweM2Ref ); + + for ( i = 0; i < winLen; i++ ) + { + synthRef[i] *= ( alpha * ( icbweM2Ref ) + ( 1.0f - alpha ) * ( hStereoICBWE->icbweM2Ref_prev ) ); + synth[i] *= ( alpha * ( gsMapping ) + ( 1.0f - alpha ) * ( prevgsMapping ) ); + alpha += winSlope; + } + for ( ; i < NS2SA( st->output_Fs, FRAME_SIZE_NS ); i++ ) + { + synthRef[i] *= ( icbweM2Ref ); + synth[i] *= ( gsMapping ); + } + hStereoICBWE->icbweM2Ref_prev = icbweM2Ref; + + ic_bwe_dec_reset( hStereoICBWE ); + hStereoICBWE->prevSpecMapping = 0.0f; + + return; + } + + /* resample to output FS */ + if ( st->output_Fs == 48000 ) + { + interpolate_3_over_2_allpass( error, L_FRAME32k, synth, hStereoICBWE->memShb_fsout_nonref ); + } + else if ( st->output_Fs == 32000 ) + { + mvr2r( error, synth, L_FRAME32k ); + } + else if ( st->output_Fs == 16000 ) + { + Decimate_allpass_steep( error, hStereoICBWE->memShb_fsout_nonref, L_FRAME32k, synth ); + } + + + if ( st->extl == FB_TBE && st->output_Fs == 48000 ) + { + v_add( fb_synth_nonref, synth, synth, L_FRAME48k ); + } + + /* copy to outputHB and reset hb_synth values */ + ratio_L = ( hCPE->element_mode == IVAS_CPE_DFT ) ? ( 0.5f ) : ( tdm_ratio_tabl[hCPE->hStereoTD->tdm_last_ratio_idx] ); + + icbweM2Ref = gsMapping; + if ( hStereoICBWE->refChanIndx_bwe == L_CH_INDX ) + { + if ( ratio_L >= 0.1f ) + { + icbweM2Ref = sqrtf( 0.5f - min( 0.5f, ( 1 - ratio_L ) * ( 1 - ratio_L ) * gsMapping * gsMapping ) ) / ratio_L; + } + } + else + { + if ( ratio_L <= 0.9f ) + { + icbweM2Ref = sqrtf( 0.5f - min( 0.5f, ratio_L * ratio_L * gsMapping * gsMapping ) ) / ( 1 - ratio_L ); + } + } + + icbweM2Ref = max( gsMapping, icbweM2Ref ); + + winLen = (int16_t) ( ( SHB_OVERLAP_LEN * st->output_Fs ) / 16000 ); + winSlope = 1.0f / winLen; + alpha = winSlope; + for ( i = 0; i < winLen; i++ ) + { + synthRef[i] *= ( alpha * ( icbweM2Ref ) + ( 1.0f - alpha ) * ( hStereoICBWE->icbweM2Ref_prev ) ); + alpha += winSlope; + } + + for ( ; i < NS2SA( st->output_Fs, FRAME_SIZE_NS ); i++ ) + { + synthRef[i] *= ( icbweM2Ref ); + } + + hStereoICBWE->icbweM2Ref_prev = icbweM2Ref; + + return; +} + +/*-------------------------------------------------------------------* + * stereo_icBWE_decproc() + * + * Stereo (inter-channel) BWE mapping - decoder initialization + *-------------------------------------------------------------------*/ + +void stereo_icBWE_decproc( + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + float *output[CPE_CHANNELS], /* i/o: output synthesis */ + float outputHB[CPE_CHANNELS][L_FRAME48k], /* i : HB synthesis */ + const int16_t last_core, /* i : last core, primary channel */ + const int16_t last_bwidth, /* i : last bandwidth */ + const int16_t output_frame /* i : frame length */ +) +{ + int16_t i, j, n, decoderDelay, icbweOLASize, dftOvlLen; + int16_t core, memOffset, refChanIndx_bwe; + float temp0[L_FRAME48k + NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS )], temp1[L_FRAME48k + NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS )]; + float winSlope, alpha; + const float *win_dft; + int32_t extl_brate, output_Fs; + + STEREO_ICBWE_DEC_HANDLE hStereoICBWE = hCPE->hStereoICBWE; + + + /*--------------------------------------------------------------------* + * skip IC-BWE in case of SID or NO_DATA frame + * -------------------------------------------------------------------*/ + + if ( ( hCPE->element_mode == IVAS_CPE_TD || hCPE->element_mode == IVAS_CPE_DFT ) && hCPE->nchan_out == 2 /*&& hCPE->hCoreCoder[0]->core_brate > SID_2k40*/ && hCPE->hCoreCoder[0]->last_core_brate <= SID_2k40 ) + { + stereo_icBWE_init_dec( hCPE->hStereoICBWE ); + } + + if ( hCPE->hCoreCoder[0]->core_brate <= SID_2k40 ) + { + return; + } + + /*--------------------------------------------------------------------* + * skip IC-BWE in case of mono DMX output * + * -------------------------------------------------------------------*/ + + if ( hCPE->nchan_out == 1 && hCPE->element_mode == IVAS_CPE_DFT ) + { + add_HB_to_mono_dmx( hCPE, output[0], outputHB[0], last_core, output_frame ); + + return; + } + else if ( hCPE->nchan_out == 1 && hCPE->element_mode != IVAS_CPE_TD ) + { + return; + } + + /*--------------------------------------------------------------------* + * IC-BWE processing + * -------------------------------------------------------------------*/ + + core = hCPE->hCoreCoder[0]->core; + extl_brate = hCPE->hCoreCoder[0]->extl_brate; + output_Fs = hCPE->hCoreCoder[0]->output_Fs; + + memOffset = NS2SA( output_Fs, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ); + + /* LRTD stereo mode - 2xBWEs used */ + if ( hCPE->element_mode == IVAS_CPE_TD && hCPE->hCoreCoder[0]->tdm_LRTD_flag ) + { + /* delay HB synth */ + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + mvr2r( outputHB[n] + output_frame - memOffset, temp0, memOffset ); + mvr2r( outputHB[n], outputHB[n] + memOffset, output_frame - memOffset ); + mvr2r( hCPE->prev_hb_synth[n], outputHB[n], memOffset ); + mvr2r( temp0, hCPE->prev_hb_synth[n], memOffset ); + } + + if ( hCPE->nchan_out == 1 ) + { + /* stereo to mono downmix */ + for ( i = 0; i < output_frame; i++ ) + { + outputHB[0][i] = ( outputHB[0][i] + outputHB[1][i] ) * 0.5f; + } + v_add( output[0], outputHB[0], output[0], output_frame ); + } + else + { + /* Add the delayed hb_synth component to the delayed ACELP synthesis */ + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + v_add( output[n], outputHB[n], output[n], output_frame ); + } + } + } + else + { + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + set_f( hCPE->prev_hb_synth[n], 0, memOffset ); + } + } + + if ( hCPE->element_mode != IVAS_CPE_MDCT && !( hCPE->element_mode == IVAS_CPE_TD && hCPE->hCoreCoder[0]->tdm_LRTD_flag ) ) + { + if ( hCPE->last_element_mode == IVAS_CPE_MDCT ) + { + set_f( hStereoICBWE->memOutHB[0], 0, memOffset ); + set_f( hStereoICBWE->memOutHB[1], 0, memOffset ); + + set_f( hStereoICBWE->memTransitionHB[0], 0, NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) ); + set_f( hStereoICBWE->memTransitionHB[1], 0, NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) ); + } + + if ( core == ACELP_CORE && extl_brate > 0 ) + { + refChanIndx_bwe = hStereoICBWE->refChanIndx_bwe; + + if ( hCPE->element_mode == IVAS_CPE_DFT && hCPE->hCoreCoder[0]->bwidth > WB && last_bwidth == WB && hCPE->hCoreCoder[0]->ini_frame > 1 /* counter wass already updated */ ) + { + /* fad-in reference HB signal */ + winSlope = ( memOffset > 0 ) ? ( 1.0f / memOffset ) : 0; + for ( i = 0; i < memOffset; i++ ) + { + outputHB[refChanIndx_bwe][i] *= ( i + 1 ) * winSlope; + } + } + /* Resampled LB and HB offset */ + mvr2r( outputHB[refChanIndx_bwe], temp0 + memOffset, output_frame - memOffset ); + mvr2r( outputHB[!refChanIndx_bwe], temp1 + memOffset, output_frame - memOffset ); + + decoderDelay = NS2SA( output_Fs, IVAS_DEC_DELAY_NS ); + + if ( last_core != ACELP_CORE && hCPE->element_mode == IVAS_CPE_DFT ) + { + /* hb_synth of mid band is faded out in the 1.25 ms prior to DFT analysis and the icbwe is faded in time domain */ + icbweOLASize = NS2SA( output_Fs, STEREO_DFT_DELAY_DEC_BWE_NS ); + + for ( i = 0; i < decoderDelay; i++ ) + { + temp0[i] = 0; + temp1[i] = 0; + } + + assert( icbweOLASize > 0 ); + winSlope = 1.0f / icbweOLASize; + alpha = winSlope; + for ( ; i < decoderDelay + icbweOLASize; i++ ) + { + temp0[i] *= alpha; + temp1[i] *= alpha; + alpha += winSlope; + } + } + else + { + if ( refChanIndx_bwe != hStereoICBWE->prev_refChanIndx_bwe ) + { + winSlope = ( memOffset > 0 ) ? ( 1.0f / memOffset ) : 0; + for ( i = 0; i < memOffset; i++ ) + { + temp0[i] = ( ( i + 1 ) * winSlope ) * hStereoICBWE->memOutHB[refChanIndx_bwe][i] + + ( 1 - ( i + 1 ) * winSlope ) * hStereoICBWE->memOutHB[hStereoICBWE->prev_refChanIndx_bwe][i]; + temp1[i] = ( ( i + 1 ) * winSlope ) * hStereoICBWE->memOutHB[hStereoICBWE->prev_refChanIndx_bwe][i] + + ( 1 - ( i + 1 ) * winSlope ) * hStereoICBWE->memOutHB[refChanIndx_bwe][i]; + } + } + else + { + mvr2r( hStereoICBWE->memOutHB[refChanIndx_bwe], temp0, memOffset ); + mvr2r( hStereoICBWE->memOutHB[!refChanIndx_bwe], temp1, memOffset ); + } + } + + if ( hCPE->nchan_out == 1 ) + { + /* stereo to mono downmix */ + for ( i = 0; i < output_frame; i++ ) + { + temp0[i] = ( temp0[i] + temp1[i] ) * 0.5f; + output[0][i] += temp0[i]; + } + } + else + { + + v_add( temp0, output[0], output[0], output_frame ); + v_add( temp1, output[1], output[1], output_frame ); + } + mvr2r( outputHB[0] + output_frame - memOffset, hStereoICBWE->memOutHB[0], memOffset ); + mvr2r( outputHB[1] + output_frame - memOffset, hStereoICBWE->memOutHB[1], memOffset ); + + if ( hCPE->element_mode == IVAS_CPE_DFT ) + { + win_dft = hCPE->hStereoDft->win32ms; + dftOvlLen = hCPE->hStereoDft->dft32ms_ovl; + + /* Preparing buffers in anticipation of an ACELP to TCX switch */ + j = 0; + for ( i = 0; i < memOffset; i++ ) + { + hStereoICBWE->memTransitionHB[0][i] = hStereoICBWE->memOutHB[0][i] * win_dft[STEREO_DFT32MS_STEP * ( dftOvlLen - 1 - j )]; + hStereoICBWE->memTransitionHB[1][i] = hStereoICBWE->memOutHB[1][i] * win_dft[STEREO_DFT32MS_STEP * ( dftOvlLen - 1 - j )]; + j++; + } + + for ( i = 0; j < dftOvlLen; i++ ) + { + hStereoICBWE->memTransitionHB[0][memOffset + i] = outputHB[0][output_frame - i - 1] * win_dft[STEREO_DFT32MS_STEP * ( dftOvlLen - 1 - j )]; + hStereoICBWE->memTransitionHB[1][memOffset + i] = outputHB[1][output_frame - i - 1] * win_dft[STEREO_DFT32MS_STEP * ( dftOvlLen - 1 - j )]; + j++; + } + } + + hStereoICBWE->prev_refChanIndx_bwe = refChanIndx_bwe; + } + else + { + if ( last_core == ACELP_CORE ) + { + if ( hCPE->element_mode == IVAS_CPE_TD ) + { + v_add( output[0], hStereoICBWE->memOutHB[hStereoICBWE->prev_refChanIndx_bwe], output[0], memOffset ); + v_add( output[1], hStereoICBWE->memOutHB[!hStereoICBWE->prev_refChanIndx_bwe], output[1], memOffset ); + } + else + { + /* This is generated in the ACELP frame and windowed. This process is akin to GenTransition for IC-BWE */ + v_add( output[0], hStereoICBWE->memTransitionHB[hStereoICBWE->prev_refChanIndx_bwe], output[0], NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) ); + v_add( output[1], hStereoICBWE->memTransitionHB[!hStereoICBWE->prev_refChanIndx_bwe], output[1], NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) ); + } + + set_f( hStereoICBWE->memOutHB[0], 0, memOffset ); + set_f( hStereoICBWE->memOutHB[1], 0, memOffset ); + + set_f( hStereoICBWE->memTransitionHB[0], 0, NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) ); + set_f( hStereoICBWE->memTransitionHB[1], 0, NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) ); + } + } + } + else if ( hCPE->element_mode == IVAS_CPE_TD && hCPE->hCoreCoder[0]->tdm_LRTD_flag && hStereoICBWE != NULL ) + { + stereo_icBWE_init_dec( hStereoICBWE ); + } + else if ( hCPE->element_mode == IVAS_CPE_MDCT && hCPE->last_element_mode == IVAS_CPE_DFT && last_core == ACELP_CORE ) + { + int16_t delay_tdbwe = NS2SA( output_Fs, DELAY_BWE_TOTAL_NS ); + + for ( n = 0; n < hCPE->nchan_out; n++ ) + { + for ( i = 0; i < delay_tdbwe; i++ ) + { + output[n][NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) - delay_tdbwe + i] += outputHB[0][i]; + } + } + /* reset BWE structs as they are only needed in the transition frame in MDCT Stereo */ + td_bwe_dec_init( hCPE->hCoreCoder[0]->hBWE_TD, -1, output_Fs ); + fd_bwe_dec_init( hCPE->hCoreCoder[0]->hBWE_FD ); + } + + if ( hCPE->element_mode == IVAS_CPE_DFT && ( max( hCPE->hStereoDft->td_gain[0], hCPE->hStereoDft->td_gain[1] ) > 0 ) ) + { + float win_in, win_out, tmp; + + win_dft = hCPE->hStereoDft->win32ms; + dftOvlLen = hCPE->hStereoDft->dft32ms_ovl; + + for ( i = 0; i < dftOvlLen; i++ ) + { + win_in = win_dft[STEREO_DFT32MS_STEP * i] * win_dft[STEREO_DFT32MS_STEP * i]; + win_out = 1 - win_in; + tmp = ( win_in * hCPE->hStereoDft->td_gain[0] + win_out * hCPE->hStereoDft->td_gain[1] ) * hCPE->hStereoDft->hb_stefi_sig[i]; + + output[0][i] += tmp; + output[1][i] -= tmp; + } + for ( i = dftOvlLen; i < output_frame; i++ ) + { + tmp = hCPE->hStereoDft->td_gain[0] * hCPE->hStereoDft->hb_stefi_sig[i]; + output[0][i] += tmp; + output[1][i] -= tmp; + } + } + + return; +} + +/*-------------------------------------------------------------------* + * stereo_icBWE_init_dec() + * + * Stereo (inter-channel) BWE mapping - decoder initialization + *-------------------------------------------------------------------*/ + +void stereo_icBWE_init_dec( + STEREO_ICBWE_DEC_HANDLE hStereoICBWE /* i/o: Stereo inter-channel BWE handle */ +) +{ + /* BWE ref channel */ + hStereoICBWE->refChanIndx_bwe = L_CH_INDX; + hStereoICBWE->prev_refChanIndx_bwe = L_CH_INDX; + + /* SHB output memory */ + set_f( hStereoICBWE->memOutHB[0], 0, NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ) ); + set_f( hStereoICBWE->memOutHB[1], 0, NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ) ); + + + /* SHB output memory */ + set_f( hStereoICBWE->memTransitionHB[0], 0, NS2SA( 48000, STEREO_DFT32MS_OVL_NS ) ); + set_f( hStereoICBWE->memTransitionHB[1], 0, NS2SA( 48000, STEREO_DFT32MS_OVL_NS ) ); + + /* inter-channel BWE spectral shape adj. */ + hStereoICBWE->prevSpecMapping = 0; + hStereoICBWE->prevgsMapping = 1.0f; + + hStereoICBWE->icbweM2Ref_prev = 1.0f; + + hStereoICBWE->prev_spIndx = 0; + hStereoICBWE->prev_gsIndx = 0; + + ic_bwe_dec_reset( hStereoICBWE ); + + return; +} diff --git a/lib_dec/ivas_stereo_mdct_core_dec.c b/lib_dec/ivas_stereo_mdct_core_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..20a6e3e5b3acb97d87259c4d9c58e0c06366c687 --- /dev/null +++ b/lib_dec/ivas_stereo_mdct_core_dec.c @@ -0,0 +1,645 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include "options.h" +#include +#include "prot.h" +#include "cnst.h" +#include "stat_com.h" +#include "ivas_prot.h" +#include "ivas_stat_dec.h" +#include "wmc_auto.h" + + +/*------------------------------------------------------------------------- + * Local function prototypes + *-------------------------------------------------------------------------*/ + +static void apply_dmx_weights( CPE_DEC_HANDLE hCPE, float *x[CPE_CHANNELS][NB_DIV], int16_t transform_type_left[NB_DIV], int16_t transform_type_right[NB_DIV] ); + +static void run_min_stats( Decoder_State **sts, float *x[CPE_CHANNELS][NB_DIV] ); + + +/*-------------------------------------------------------------------* + * convert_coeffs_to_higher_res() + * + * convert MDCT coefficients to higher frequency resolution + * by applying high- and lowpass filters to subdivide bins + *-------------------------------------------------------------------*/ + +void convert_coeffs_to_higher_res( + const float *in1, /* i : first subframe input */ + const float *in2, /* i : second subframe input */ + float *out, /* o : converted output */ + const int16_t len /* i : length of subframes */ +) +{ + int16_t i; + float tmp1, tmp2; + + if ( in1 == out ) + { + for ( i = 0; i < len; i += 2 ) + { + tmp1 = 0.5f * ( in2[i] + in1[i] ); + tmp2 = 0.5f * ( in2[i] - in1[i] ); + out[2 * i] = tmp1; + out[2 * i + 1] = tmp2; + tmp1 = 0.5f * ( in2[i] - in1[i] ); + tmp2 = 0.5f * ( in2[i] + in1[i] ); + out[2 * i + 2] = tmp1; + out[2 * i + 3] = tmp2; + } + } + else + { + for ( i = 0; i < len; i += 2 ) + { + out[2 * i] = 0.5f * ( in2[i] + in1[i] ); + out[2 * i + 1] = 0.5f * ( in2[i] - in1[i] ); + out[2 * i + 2] = 0.5f * ( in2[i + 1] - in1[i + 1] ); + out[2 * i + 3] = 0.5f * ( in2[i + 1] + in1[i + 1] ); + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * stereo_mdct_dec_stereo() + * + * decode core and MDCT stereo information + *-------------------------------------------------------------------*/ + +static void stereo_mdct_dec_stereo( + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + int16_t ms_mask[2][MAX_SFB] /* o : bandwise MS mask */ +) +{ + int16_t availableBits; + Decoder_State **sts; + + sts = hCPE->hCoreCoder; + + parse_stereo_from_bitstream( hCPE->hStereoMdct, hCPE->hCoreCoder, 0, hCPE->hStereoMdct->isSBAStereoMode, hCPE->hCoreCoder[0], ms_mask ); + + /*Split available bits between channels */ + availableBits = sts[0]->bits_frame_channel + sts[1]->bits_frame_channel - sts[0]->next_bit_pos - sts[0]->core * ( NF_GAIN_BITS + SMDCT_MINIMUM_ARITH_BITS ) - sts[1]->core * ( NF_GAIN_BITS + SMDCT_MINIMUM_ARITH_BITS ); + + splitAvailableBits( availableBits, hCPE->hStereoMdct->split_ratio, hCPE->hStereoMdct->isSBAStereoMode, &sts[0]->bits_frame_channel, &sts[1]->bits_frame_channel ); + + sts[0]->bits_frame_channel += sts[0]->core * SMDCT_MINIMUM_ARITH_BITS; + sts[1]->bits_frame_channel += sts[1]->core * SMDCT_MINIMUM_ARITH_BITS; + + sts[1]->bit_stream = &sts[0]->bit_stream[sts[0]->next_bit_pos + sts[0]->bits_frame_channel + sts[0]->core * NF_GAIN_BITS]; + + return; +} + + +/*-------------------------------------------------------------------* + * stereo_mdct_core_dec() + * + * MDCT stereo core/stereo decoder + *--------------------------------------------------------------------*/ + +void stereo_mdct_core_dec( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + float *signal_out[CPE_CHANNELS], /* o : synthesis @internal_FS */ + float signal_outFB[CPE_CHANNELS][L_FRAME48k] /* o : synthesis @output_FS */ +) +{ + int16_t k, ch, nChannels; + Decoder_State *st, **sts; + + /* bitstream */ + int16_t param[CPE_CHANNELS][DEC_NPRM_DIV * NB_DIV]; + int16_t param_lpc[CPE_CHANNELS][NPRM_LPC_NEW]; + + float Aq[CPE_CHANNELS][( NB_SUBFR16k + 1 ) * ( M + 1 )]; + float *x[CPE_CHANNELS][NB_DIV]; + + /*needed to allocate N_MAX to prevent stereo switching crash */ + float x_0_buf[CPE_CHANNELS][N_MAX]; + float *x_0[CPE_CHANNELS][NB_DIV]; + + /* Concealment */ + int16_t bfi; + + /* Framing */ + int16_t L_frame[CPE_CHANNELS], L_frameTCX[CPE_CHANNELS], nSubframes[CPE_CHANNELS]; + + /* TCX */ + int16_t fUseTns[CPE_CHANNELS][NB_DIV]; + STnsData tnsData[CPE_CHANNELS][NB_DIV]; + int16_t tcx_offset[CPE_CHANNELS]; + int16_t tcx_offsetFB[CPE_CHANNELS]; + int16_t left_rect[CPE_CHANNELS]; + int16_t L_spec[CPE_CHANNELS]; + + /* stereo */ + int16_t ms_mask[NB_DIV][MAX_SFB]; + + int16_t p_param[CPE_CHANNELS][NB_DIV]; + int16_t nTnsBitsTCX10[CPE_CHANNELS][NB_DIV]; + float signal_outFB_tmp[CPE_CHANNELS][L_FRAME_PLUS]; + float signal_out_tmp[CPE_CHANNELS][L_FRAME_PLUS]; + push_wmops( "stereo_mdct_core_dec" ); + + /*--------------------------------------------------------------------------------* + * Initializations + *--------------------------------------------------------------------------------*/ + + sts = hCPE->hCoreCoder; + st = NULL; + + nChannels = CPE_CHANNELS; + bfi = sts[0]->bfi; + + for ( ch = 0; ch < nChannels; ch++ ) + { + /* Initialization or re-configuration of Stereo TCX */ + stereo_tcx_init_dec( sts[ch], 0, hCPE->last_element_mode ); + sts[ch]->hTcxDec->tnsActive[0] = sts[ch]->hTcxDec->tnsActive[1] = 0; + sts[ch]->enablePlcWaveadjust = 0; + set_zero( signal_out_tmp[ch], L_FRAME_PLUS ); + x[ch][0] = &signal_out_tmp[ch][0]; + x[ch][1] = &signal_out_tmp[ch][0] + L_FRAME_PLUS / 2; + + set_zero( x_0_buf[ch], N_MAX ); + x_0[ch][0] = &x_0_buf[ch][0]; + x_0[ch][1] = &x_0_buf[ch][0] + L_FRAME48k / 2; + nTnsBitsTCX10[ch][0] = 0; + nTnsBitsTCX10[ch][1] = 0; + + set_s( param_lpc[ch], 0, NPRM_LPC_NEW ); + } + set_s( ms_mask[0], 0, MAX_SFB ); + set_s( ms_mask[1], 0, MAX_SFB ); + + initMdctStereoDecData( hCPE->hStereoMdct, sts[0]->igf, sts[0]->hIGFDec->igfData.igfInfo.grid, hCPE->element_brate, sts[0]->bwidth ); + hCPE->hStereoMdct->isSBAStereoMode = ( ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT ) && ( st_ivas->nchan_transport == 2 ) ); + if ( !bfi ) + { + ivas_mdct_dec_side_bits_frame_channel( hCPE, param_lpc, p_param, hCPE->hCoreCoder[0], nTnsBitsTCX10, param, 0, 0 ); + + if ( sts[0]->igf ) + { + for ( ch = 0; ch < nChannels; ch++ ) + { + st = sts[ch]; + mdct_read_IGF_bits( st, sts[0] ); + } + } + + stereo_mdct_dec_stereo( hCPE, ms_mask ); + } + else + { + mvs2s( hCPE->hStereoMdct->prev_ms_mask[0], ms_mask[0], MAX_SFB ); + mvs2s( hCPE->hStereoMdct->prev_ms_mask[1], ms_mask[1], MAX_SFB ); + + if ( sts[0]->core != TCX_10_CORE && sts[1]->core != TCX_10_CORE ) + { + hCPE->hStereoMdct->mdct_stereo_mode[1] = SMDCT_DUAL_MONO; + hCPE->hStereoMdct->IGFStereoMode[1] = SMDCT_DUAL_MONO; + } + else if ( sts[0]->core == TCX_10_CORE && sts[1]->core == TCX_10_CORE ) + { + hCPE->hStereoMdct->global_ild[0] = hCPE->hStereoMdct->global_ild[1]; + hCPE->hStereoMdct->mdct_stereo_mode[0] = hCPE->hStereoMdct->mdct_stereo_mode[1]; + hCPE->hStereoMdct->IGFStereoMode[0] = hCPE->hStereoMdct->IGFStereoMode[1]; + } + } + + ivas_mdct_core_invQ( hCPE, nTnsBitsTCX10, p_param, param_lpc, param, fUseTns, tnsData, x_0, x, Aq, ms_mask, 0 ); + + for ( ch = 0; ch < nChannels; ch++ ) + { + nSubframes[ch] = ( sts[ch]->core == TCX_10_CORE ) ? NB_DIV : 1; + for ( k = 0; k < nSubframes[ch]; k++ ) + { + L_spec[ch] = sts[ch]->hTcxCfg->tcx_coded_lines / nSubframes[ch]; + + init_tcx_info( sts[ch], sts[ch]->L_frame / nSubframes[ch], sts[ch]->hTcxDec->L_frameTCX / nSubframes[ch], k, bfi, &tcx_offset[ch], &tcx_offsetFB[ch], &L_frame[ch], &L_frameTCX[ch], &left_rect[ch], &L_spec[ch] ); + } + } + + /* IGF decoding */ + if ( sts[0]->igf || sts[1]->igf ) + { + if ( sts[0]->core != sts[1]->core ) + { + for ( ch = 0; ch < nChannels; ch++ ) + { + st = sts[ch]; + if ( !bfi || ( bfi && st->core != ACELP_CORE ) ) + { + for ( k = 0; k < nSubframes[ch]; k++ ) + { + /* mono or dual mono IGF decoding */ + decoder_tcx_IGF_mono( st, x[ch][k], L_frame[ch], left_rect[ch], bfi, k ); + } + } + } + } + else if ( sts[0]->core != ACELP_CORE ) + { + assert( nSubframes[0] == nSubframes[1] ); + + for ( k = 0; k < nSubframes[0]; k++ ) + { + if ( ( hCPE->hStereoMdct->IGFStereoMode[k] != SMDCT_DUAL_MONO || hCPE->hStereoMdct->mdct_stereo_mode[k] != SMDCT_DUAL_MONO ) && !hCPE->hStereoMdct->isSBAStereoMode ) + { + assert( ( sts[0]->core == sts[1]->core ) || ( hCPE->hStereoMdct->mdct_stereo_mode[0] == SMDCT_DUAL_MONO ) ); + + /* stereo IGF decoding */ + decoder_tcx_IGF_stereo( sts, hCPE->hStereoMdct, ms_mask, x, L_frame[0], left_rect[0], k, bfi, 0 /* MCT_flag */ ); + } + else + { + for ( ch = 0; ch < nChannels; ch++ ) + { + st = sts[ch]; + /* mono or dual mono IGF decoding */ + decoder_tcx_IGF_mono( st, x[ch][k], L_frame[ch], left_rect[ch], bfi, k ); + } + } + } + } + } + + /*--------------------------------------------------------------------------------* + * Stereo processing + *--------------------------------------------------------------------------------*/ + + if ( !bfi ) + { + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + st = sts[ch]; + for ( k = 0; k < nSubframes[ch]; k++ ) + { + float sns_int_scf[FDNS_NPTS]; + + sns_interpolate_scalefactors( &sns_int_scf[0], &Aq[ch][k * M], DEC ); + + if ( st->hTonalMDCTConc != NULL && ( ( k + 1 ) == nSubframes[ch] ) ) + { + TonalMDCTConceal_SaveFreqSignal( st->hTonalMDCTConc, x[ch][k], L_frameTCX[ch], L_frame[ch], &sns_int_scf[0], get_igf_startline( st, L_frame[ch], L_frameTCX[ch] ) ); + } + } + + TonalMDCTConceal_UpdateState( st->hTonalMDCTConc, L_frameTCX[ch], ( st->hTcxDec->tcxltp_last_gain_unmodified > 0 ) ? st->old_fpitch : 0, bfi, bfi && st->tonal_mdct_plc_active ); + } + + mvs2s( ms_mask[0], hCPE->hStereoMdct->prev_ms_mask[0], MAX_SFB ); + mvs2s( ms_mask[1], hCPE->hStereoMdct->prev_ms_mask[1], MAX_SFB ); + } + + if ( ( !bfi || !( sts[0]->core == ACELP_CORE && sts[1]->core == ACELP_CORE ) ) && !hCPE->hStereoMdct->isSBAStereoMode ) + { + stereo_decoder_tcx( hCPE->hStereoMdct, ms_mask, x_0[1], x[0], x[1], &hCPE->hStereoMdct->mdct_stereo_mode[0], sts[0]->core, sts[1]->core, sts[0]->igf, L_frameTCX[0], L_frameTCX[1], 0, sts[0]->last_core, sts[1]->last_core, 0 ); + } + + ivas_mdct_core_tns_ns( hCPE, fUseTns, tnsData, x, Aq, 0 ); + + if ( st_ivas->renderer_type == RENDERER_MC_PARAMMC && ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_MONO || st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_STEREO ) ) + { + ivas_ls_setup_conversion_process_mdct_param_mc( st_ivas, x ); + } + + run_min_stats( sts, x ); + + if ( hCPE->nchan_out == 1 && ( !bfi || ( bfi && sts[0]->core != ACELP_CORE && sts[1]->core != ACELP_CORE ) ) ) + { + apply_dmx_weights( hCPE, x, sts[0]->transform_type, sts[1]->transform_type ); + } + + ivas_mdct_core_reconstruct( hCPE, x, signal_outFB_tmp, fUseTns, 0 ); + + mvr2r( signal_out_tmp[0], signal_out[0], L_FRAME48k ); + mvr2r( signal_out_tmp[1], signal_out[1], L_FRAME48k ); + + mvr2r( signal_outFB_tmp[0], signal_outFB[0], hCPE->hCoreCoder[0]->hTcxDec->L_frameTCX ); + mvr2r( signal_outFB_tmp[1], signal_outFB[1], hCPE->hCoreCoder[1]->hTcxDec->L_frameTCX ); + + pop_wmops(); + return; +} + + +/*-------------------------------------------------------------------* + * apply_dmx_weights() + * + * apply bandwise weighting for later dmx in case of mono output + *--------------------------------------------------------------------*/ + +static void apply_dmx_weights( + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + float *x[CPE_CHANNELS][NB_DIV], /* i/o: MDCT Spectrum */ + int16_t transform_type_left[NB_DIV], /* i : indicate TCX5 for left ch */ + int16_t transform_type_right[NB_DIV] /* i : indicate TCX5 for right ch */ +) +{ + int16_t b, k, l, i, ch; + int16_t nsub, nsub2[2], nChannels; + int16_t transform_type[2][2]; + int16_t numCoeffs[2], frameSize; + int16_t tcx_10_only, w_idx; + int16_t start, stop, start_tcx5, stop_tcx5; + STEREO_MDCT_BAND_PARAMETERS *sfbConf = NULL; + float mdst[CPE_CHANNELS][NB_DIV][L_FRAME48k]; + float convertRes[CPE_CHANNELS][L_FRAME48k]; + float *sig[CPE_CHANNELS][NB_DIV], *pTmp[CPE_CHANNELS][NB_DIV]; + + nChannels = CPE_CHANNELS; + frameSize = hCPE->hStereoMdct->stbParamsTCX20.sfbOffset[hCPE->hStereoMdct->stbParamsTCX20.sfbCnt]; + + transform_type[0][0] = transform_type_left[0]; + transform_type[0][1] = transform_type_left[1]; + transform_type[1][0] = transform_type_right[0]; + transform_type[1][1] = transform_type_right[1]; + + /* set overall frequency resolution of (sub)frame to maximum of (sub)frame, requires conversion if both channels are not the same */ + if ( transform_type[0][0] == TCX_20 || transform_type[1][0] == TCX_20 ) + { + /* use TCX20 band config for TCX20 in both channels and mixed frames */ + sfbConf = &hCPE->hStereoMdct->stbParamsTCX20; + nsub = nsub2[0] = nsub2[1] = 1; /* overall TCX 20 */ + tcx_10_only = 0; + } + else + { + /* use TCX10 band config only if none of the channels is TCX20 */ + sfbConf = &hCPE->hStereoMdct->stbParamsTCX10; + nsub = 2; + /* set resolution per subframe, subdivide again if subframe is TCX5 in both channels */ + nsub2[0] = ( transform_type[0][0] == TCX_5 && transform_type[1][0] == TCX_5 ) ? 2 : 1; + nsub2[1] = ( transform_type[0][1] == TCX_5 && transform_type[1][1] == TCX_5 ) ? 2 : 1; + tcx_10_only = 1; + } + + /* for subframes with only TCX5 in both channels number of coefficients is only half (in 2 quarterframes) */ + numCoeffs[0] = ( nsub2[0] == 1 ) ? sfbConf->sfbOffset[sfbConf->sfbCnt] : sfbConf->sfbOffset[sfbConf->sfbCnt] / 2; + numCoeffs[1] = ( nsub2[1] == 1 ) ? sfbConf->sfbOffset[sfbConf->sfbCnt] : sfbConf->sfbOffset[sfbConf->sfbCnt] / 2; + + /* initially, set pointers to input; if conversion occurs in (sub)frame, set to convertRes */ + sig[0][0] = pTmp[0][0] = x[0][0]; + sig[0][1] = pTmp[0][1] = x[0][1]; + sig[1][0] = pTmp[1][0] = x[1][0]; + sig[1][1] = pTmp[1][1] = x[1][1]; + + /* convert (sub)frames to higher frequency resolution */ + for ( ch = 0; ch < nChannels; ch++ ) + { + for ( k = 0; k < NB_DIV; k++ ) + { + if ( transform_type[ch][k] == TCX_5 && nsub2[k] == 1 ) + { + /* subframe is TCX5, but TCX10 or TCX20 in other channel -> convert channel with TCX5 to TCX10 resolution */ + pTmp[ch][k] = sig[ch][k] = convertRes[ch] + k * frameSize / 2; + convert_coeffs_to_higher_res( x[ch][k], x[ch][k] + frameSize / 4, pTmp[ch][k], frameSize / 4 ); + } + } + + if ( transform_type[ch][0] != TCX_20 && nsub == 1 ) + { + /* TCX20 and TCX10 in same frame -> convert channel with TCX10 to TCX20 resolution */ + sig[ch][0] = convertRes[ch]; + convert_coeffs_to_higher_res( pTmp[ch][0], pTmp[ch][1], sig[ch][0], frameSize / 2 ); + } + } + + /* MDST estimate */ + for ( ch = 0; ch < nChannels; ch++ ) + { + for ( k = 0; k < nsub; k++ ) + { + for ( l = 0; l < nsub2[k]; l++ ) + { + mdst[ch][k][l * numCoeffs[k]] = mdst[ch][k][( l + 1 ) * numCoeffs[k] - 1] = 0.f; + for ( i = l * numCoeffs[k] + 1; i < ( l + 1 ) * numCoeffs[k] - 1; i++ ) + { + mdst[ch][k][i] = sig[ch][k][i + 1] - sig[ch][k][i - 1]; + } + } + } + } + + /* compute and apply bandwise weigths for active downmix (similar to DFT Stereo) */ + stop_tcx5 = 0; + for ( b = 0; b < sfbConf->sfbCnt; b++ ) + { + float w[CPE_CHANNELS][4]; + + for ( k = 0; k < nsub; k++ ) + { + for ( l = 0; l < nsub2[k]; l++ ) + { + float sum_nrg_L = EPSILON, sum_nrg_R = EPSILON; + float dot_prod_real = EPSILON, dot_prod_imag = EPSILON; + float sum_nrg_Mid, sum_abs, dot_prod_abs; + + start = l * numCoeffs[k] + sfbConf->sfbOffset[b] / nsub2[k]; + stop = l * numCoeffs[k] + sfbConf->sfbOffset[b + 1] / nsub2[k]; + + /* compute band energies and cross correlation */ + for ( i = start; i < stop; i++ ) + { + sum_nrg_L += sig[0][k][i] * sig[0][k][i] + mdst[0][k][i] * mdst[0][k][i]; + sum_nrg_R += sig[1][k][i] * sig[1][k][i] + mdst[1][k][i] * mdst[1][k][i]; + dot_prod_real += sig[0][k][i] * sig[1][k][i] + mdst[0][k][i] * mdst[1][k][i]; + dot_prod_imag += mdst[0][k][i] * sig[1][k][i] - sig[0][k][i] * mdst[1][k][i]; + } + sum_nrg_Mid = max( 0.f, sum_nrg_L + sum_nrg_R + 2.f * dot_prod_real ); + sum_abs = sqrtf( sum_nrg_L ) + sqrtf( sum_nrg_R ) + EPSILON; + dot_prod_abs = sqrtf( dot_prod_real * dot_prod_real + dot_prod_imag * dot_prod_imag ); + + /* calculate weights */ + if ( hCPE->hStereoMdct->reverse_dmx == 0 ) + { + w[1][2 * k + l] = sqrtf( 0.5f * ( sum_nrg_L + sum_nrg_R ) + dot_prod_abs ) / sum_abs; + w[0][2 * k + l] = w[1][2 * k + l] + sqrtf( 2.f ) * ( 1.f - sqrtf( sum_nrg_Mid ) / sum_abs ); + } + else + { + w[0][2 * k + l] = sqrtf( 0.5f * ( sum_nrg_L + sum_nrg_R ) + dot_prod_abs ) / sum_abs; + w[1][2 * k + l] = w[0][2 * k + l] + sqrtf( 2.f ) * ( 1.f - sqrtf( sum_nrg_Mid ) / sum_abs ); + } + } + } + + /* apply weights to channels with their original frequency resolutions */ + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + if ( transform_type[ch][0] == TCX_20 ) + { + for ( i = sfbConf->sfbOffset[b]; i < sfbConf->sfbOffset[b + 1]; i++ ) + { + x[ch][0][i] *= w[ch][0]; + } + } + else + { + start = sfbConf->sfbOffset[b]; + stop = sfbConf->sfbOffset[b + 1]; + if ( !tcx_10_only ) /* TCX20 band config is used */ + { + start /= 2; + stop /= 2; + } + + for ( k = 0; k < NB_DIV; k++ ) + { + w_idx = ( nsub == 1 ) ? 0 : 2 * k; + if ( transform_type[ch][k] == TCX_10 ) + { + for ( i = start; i < stop; i++ ) + { + x[ch][k][i] *= w[ch][w_idx]; + } + } + else /* TCX_5 */ + { + start_tcx5 = stop_tcx5; + stop_tcx5 = ( stop + 1 ) / 2; + + for ( i = start_tcx5; i < stop_tcx5; i++ ) + { + x[ch][k][i] *= w[ch][w_idx]; + } + + if ( nsub2[k] == 2 ) + { + w_idx++; + } + + for ( i = start_tcx5; i < stop_tcx5; i++ ) + { + x[ch][k][i + ( frameSize >> 2 )] *= w[ch][w_idx]; + } + } + } + } + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * run_min_stats() + * + * run the minimum statistics noise estimation algorithm + * directly on the MDCT spectrum + *--------------------------------------------------------------------*/ + +static void run_min_stats( + Decoder_State **sts, + float *x[CPE_CHANNELS][NB_DIV] /* i/o: MDCT Spectrum */ +) +{ + int16_t ch, will_estimate_noise_on_channel[CPE_CHANNELS], save_VAD[CPE_CHANNELS]; + float power_spec[L_FRAME16k]; + float *spec_in; + + /* Check if the minimum statistics would run on the respective channels. They are run on inactive TCX20 channels */ + will_estimate_noise_on_channel[0] = sts[0]->core == TCX_20_CORE && !sts[0]->VAD; + will_estimate_noise_on_channel[1] = sts[1]->core == TCX_20_CORE && !sts[1]->VAD; + + save_VAD[0] = sts[0]->VAD; + save_VAD[1] = sts[1]->VAD; + + /* The first loop calculates the power spectra needed in the minimum statistics (MS) noise estimation. This is only needed if the MS + would run at all on at least one of the channels. If they run on both channels, we need to calculate two distinct power spectra + for the two different channels. If they would only run on one of the channels, the VAD of the other one is patched so that the MS will + still run. This other channel then uses the power spectrum of the other channel to run the MS. This is done to keep continuity and synchronicity + between the two noise levels and silently assumes that the background noise is somehow diffuse and at leas partly shared between the channels */ + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + Decoder_State *st; + st = sts[ch]; + + if ( !sts[0]->bfi && ( will_estimate_noise_on_channel[0] || will_estimate_noise_on_channel[1] ) ) + { + /* if noise estimation is expected to run on this channel, compute power spectrum from it, + otherwise, use other channel's signal */ + if ( will_estimate_noise_on_channel[ch] ) + { + spec_in = &x[ch][0][0]; + } + else + { + spec_in = &x[( ch + 1 ) % 2][0][0]; + /* patch VAD to zero so that estimation runs, will later be restored */ + st->VAD = 0; + } + + /* Compute power spectrum twice if estimation will run on both channels. If only on one channel, it is + computed only once (for ch == 0) and not again in the second run sive the outcome will be the same anyway */ + if ( ( will_estimate_noise_on_channel[0] == will_estimate_noise_on_channel[1] ) || ch == 0 ) + { + /* calculate power spectrum from MDCT coefficients and estimated MDST coeffs */ + power_spec[0] = spec_in[0] * spec_in[0]; + power_spec[L_FRAME16k - 1] = spec_in[L_FRAME16k - 1] * spec_in[L_FRAME16k - 1]; + for ( int16_t i = 1; i < L_FRAME16k - 1; i++ ) + { + float mdst; + mdst = spec_in[i + 1] - spec_in[i - 1]; + power_spec[i] = spec_in[i] * spec_in[i] + mdst * mdst; + } + } + + noisy_speech_detection( st->hFdCngDec, st->VAD && st->m_frame_type == ACTIVE_FRAME, power_spec ); + + st->hFdCngDec->hFdCngCom->likelihood_noisy_speech = 0.99f * st->hFdCngDec->hFdCngCom->likelihood_noisy_speech + 0.01f * (float) st->hFdCngDec->hFdCngCom->flag_noisy_speech; + + st->lp_noise = st->hFdCngDec->lp_noise; + } + + if ( will_estimate_noise_on_channel[0] || will_estimate_noise_on_channel[1] || st->bfi ) + { + ApplyFdCng( NULL, st->bfi ? NULL : power_spec, NULL, NULL, st, st->bfi, 0 ); + } + + /* restore VAD (see above) */ + st->VAD = save_VAD[ch]; + } + + return; +} diff --git a/lib_dec/ivas_stereo_mdct_stereo_dec.c b/lib_dec/ivas_stereo_mdct_stereo_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..7373bc781644cabe2bd5a4518210b5dfa452652b --- /dev/null +++ b/lib_dec/ivas_stereo_mdct_stereo_dec.c @@ -0,0 +1,666 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include "options.h" +#include +#include "ivas_cnst.h" +#include "ivas_prot.h" +#include "prot.h" +#include "wmc_auto.h" + + +/*-------------------------------------------------------------------* + * Local function prototypes + *-------------------------------------------------------------------*/ + +static void inverseBwMS( const int16_t startLine, const int16_t stopLine, float x0[], float x1[], const float norm_fac ); + + +/*-------------------------------------------------------------------* + * parse_stereo_from_bitstream + * + * + *-------------------------------------------------------------------*/ + +void parse_stereo_from_bitstream( + STEREO_MDCT_DEC_DATA_HANDLE hStereoMdct, /* i/o: MDCT stereo decoder structure */ + Decoder_State **sts, /* i/o: decoder state structure */ + const int16_t mct_on, /* i : flag mct block (1) or stereo (0)*/ + const int16_t isSBAStereoMode, /* i : flag core coding for SBA */ + Decoder_State *st0, /* i/o: decoder state structure for Bstr*/ + int16_t ms_mask[NB_DIV][MAX_SFB] /* o : bandwise MS mask */ +) +{ + int16_t i, k, nSubframes, mdct_stereo_mode; + STEREO_MDCT_BAND_PARAMETERS *sfbConf; + + if ( !isSBAStereoMode ) + { + nSubframes = ( sts[0]->core == TCX_10_CORE || ( sts[0]->core != sts[1]->core ) ) ? NB_DIV : 1; + sfbConf = ( sts[0]->core == TCX_20_CORE ) ? &hStereoMdct->stbParamsTCX20 : &hStereoMdct->stbParamsTCX10; + if ( sts[0]->last_core_from_bs == ACELP_CORE ) + { + sfbConf = &hStereoMdct->stbParamsTCX20afterACELP; + } + + if ( hStereoMdct->use_itd ) + { + int16_t I; + + hStereoMdct->itd_mode = get_next_indice( st0, STEREO_DFT_ITD_MODE_NBITS ); + /*(*nb_bits) += STEREO_DFT_ITD_MODE_NBITS;*/ /*ITD mode flag: 1bit*/ + + hStereoMdct->itd = 0.f; + if ( hStereoMdct->itd_mode ) + { + /*(*nb_bits) += */ read_itd( st0, &I ); + stereo_dft_dequantize_itd( &I, &hStereoMdct->itd, st0->output_Fs ); + } + } + + for ( k = 0; k < nSubframes; k++ ) + { + mdct_stereo_mode = get_next_indice( st0, 1 ); + if ( mdct_stereo_mode ) + { + mdct_stereo_mode = 1 + get_next_indice( st0, 1 ); + } + switch ( mdct_stereo_mode ) + { + case 0: + hStereoMdct->mdct_stereo_mode[k] = SMDCT_DUAL_MONO; + break; + case 1: + hStereoMdct->mdct_stereo_mode[k] = SMDCT_MS_FULL; + break; + case 2: + hStereoMdct->mdct_stereo_mode[k] = SMDCT_BW_MS; + break; + default: + assert( !"Not supported stereo mode\n" ); + } + + if ( !mct_on ) + { + if ( sts[0]->core == sts[1]->core || k == 0 ) + { + hStereoMdct->global_ild[k] = get_next_indice( st0, SMDCT_GLOBAL_ILD_BITS ); + assert( ( hStereoMdct->global_ild[k] > 0 ) && ( hStereoMdct->global_ild[k] < SMDCT_ILD_RANGE ) ); + } + else + { + hStereoMdct->global_ild[1] = hStereoMdct->global_ild[0]; + } + } + + set_s( ms_mask[k], ( hStereoMdct->mdct_stereo_mode[k] == SMDCT_MS_FULL ) ? 1 : 0, sfbConf->nBandsStereoCore ); + + if ( hStereoMdct->mdct_stereo_mode[k] == SMDCT_BW_MS ) + { + for ( i = 0; i < sfbConf->nBandsStereoCore; i++ ) + { + ms_mask[k][i] = get_next_indice( st0, 1 ); + } + } + + if ( st0->igf ) + { + mdct_stereo_mode = get_next_indice( st0, 1 ); + if ( mdct_stereo_mode ) + { + mdct_stereo_mode = 1 + get_next_indice( st0, 1 ); + } + + switch ( mdct_stereo_mode ) + { + case 0: + hStereoMdct->IGFStereoMode[k] = SMDCT_DUAL_MONO; + break; + case 1: + hStereoMdct->IGFStereoMode[k] = SMDCT_MS_FULL; + break; + case 2: + hStereoMdct->IGFStereoMode[k] = SMDCT_BW_MS; + break; + default: + assert( !"Not supported stereo mode\n" ); + } + + set_s( &ms_mask[k][sfbConf->nBandsStereoCore], ( hStereoMdct->IGFStereoMode[k] == SMDCT_MS_FULL ) ? 1 : 0, sfbConf->sfbCnt - sfbConf->nBandsStereoCore ); + + if ( hStereoMdct->IGFStereoMode[k] == SMDCT_BW_MS ) + { + for ( i = sfbConf->nBandsStereoCore; i < sfbConf->sfbCnt; i++ ) + { + ms_mask[k][i] = get_next_indice( st0, 1 ); + } + } + } + else + { + hStereoMdct->IGFStereoMode[k] = SMDCT_DUAL_MONO; + } + } + } + + if ( !mct_on ) + { + hStereoMdct->split_ratio = SMDCT_EQUAL_RATIO_RANGE; /* Equal bits to both channels */ + hStereoMdct->split_ratio = get_next_indice( st0, SMDCT_NBBITS_SPLIT_RATIO ); + + assert( hStereoMdct->split_ratio > 0 ); + } + + + return; +} + + +/*-------------------------------------------------------------------* + * stereo_decoder_tcx() + * + * apply stereo processing (inverse MS and global ILD) + *-------------------------------------------------------------------*/ + +#define NF_RED_FAC 0.75f + +void stereo_decoder_tcx( + STEREO_MDCT_DEC_DATA *hStereoMdct, /* i/o: MDCT stereo decoder structure */ + int16_t ms_mask[NB_DIV][MAX_SFB], /* i : bandwise MS mask */ + float *spec_r_0[NB_DIV], /* i/o: spectrum right channel */ + float *spec_l[NB_DIV], /* i/o: spectrum left channel */ + float *spec_r[NB_DIV], /* i/o: spectrum right channel */ + const int16_t mdct_stereo_mode[], /* i : stereo mode (FB/band wise MS, dual mono */ + const int16_t core_l, /* i : core for left channel (TCX20/TCX10) */ + const int16_t core_r, /* i : core for right channel (TCX20/TCX10) */ + const int16_t igf, /* i : flag for IGF activity */ + const int16_t L_frameTCX_l, /* i : TCX frame length of left channel */ + const int16_t L_frameTCX_r, /* i : TCX frame length of right channel */ + const int16_t mct_on, /* i : flag mct block (1) or stereo (0) */ + const int16_t last_core_l, /* i : last core for left channel */ + const int16_t last_core_r, /* i : last core for right channel */ + const int16_t tmp_plc_upmix /* i : indicates temp upmix for PLC decision */ +) +{ + int16_t i, k, sfb, nSubframes; + STEREO_MDCT_BAND_PARAMETERS *sfbConf = NULL; + float nrgRatio; + + nSubframes = 2; + if ( ( core_l <= TCX_20_CORE && core_r <= TCX_20_CORE ) || tmp_plc_upmix ) + { + nSubframes = 1; + } + + for ( k = 0; k < nSubframes; k++ ) + { + sfbConf = ( core_l == TCX_20_CORE ) ? &hStereoMdct->stbParamsTCX20 : &hStereoMdct->stbParamsTCX10; + + if ( last_core_l == ACELP_CORE || last_core_r == ACELP_CORE ) + { + sfbConf = &hStereoMdct->stbParamsTCX20afterACELP; + } + + if ( mdct_stereo_mode[k] == SMDCT_MS_FULL ) + { + for ( i = 0; i < sfbConf->sfbOffset[sfbConf->nBandsStereoCore]; i++ ) + { + if ( spec_r_0[k][i] == 0.0f ) + { + spec_r[k][i] *= NF_RED_FAC; + } + } + inverseMS( sfbConf->sfbOffset[sfbConf->nBandsStereoCore], spec_l[k], spec_r[k], SQRT2_OVER_2 ); + } + else if ( mdct_stereo_mode[k] == SMDCT_BW_MS ) + { + for ( sfb = 0; sfb < sfbConf->nBandsStereoCore; sfb++ ) + { + if ( ms_mask[k][sfb] ) + { + for ( i = sfbConf->sfbOffset[sfb]; i < sfbConf->sfbOffset[sfb + 1]; i++ ) + { + if ( spec_r_0[k][i] == 0.0f ) + { + spec_r[k][i] *= NF_RED_FAC; + } + } + inverseBwMS( sfbConf->sfbOffset[sfb], sfbConf->sfbOffset[sfb + 1], spec_l[k], spec_r[k], SQRT2_OVER_2 ); + } + } + } + + if ( igf ) + { + if ( hStereoMdct->IGFStereoMode[k] == SMDCT_MS_FULL ) + { + for ( i = sfbConf->sfbOffset[sfbConf->nBandsStereoCore]; i < sfbConf->sfbOffset[sfbConf->sfbCnt]; i++ ) + { + if ( spec_r_0[k][i] == 0.0f ) + { + spec_r[k][i] *= NF_RED_FAC; + } + } + inverseMS( sfbConf->sfbOffset[sfbConf->sfbCnt] - sfbConf->sfbOffset[sfbConf->nBandsStereoCore], &spec_l[k][sfbConf->sfbOffset[sfbConf->nBandsStereoCore]], &spec_r[k][sfbConf->sfbOffset[sfbConf->nBandsStereoCore]], SQRT2_OVER_2 ); + } + else if ( hStereoMdct->IGFStereoMode[k] == SMDCT_BW_MS ) + { + for ( sfb = sfbConf->nBandsStereoCore; sfb < sfbConf->sfbCnt; sfb++ ) + { + if ( ms_mask[k][sfb] ) + { + for ( i = sfbConf->sfbOffset[sfb]; i < sfbConf->sfbOffset[sfb + 1]; i++ ) + { + if ( spec_r_0[k][i] == 0.0f ) + { + spec_r[k][i] *= NF_RED_FAC; + } + } + inverseBwMS( sfbConf->sfbOffset[sfb], sfbConf->sfbOffset[sfb + 1], spec_l[k], spec_r[k], SQRT2_OVER_2 ); + } + } + } + } + + if ( !mct_on ) + { + nrgRatio = (float) SMDCT_ILD_RANGE / hStereoMdct->global_ild[k] - 1; /* nrgRatio = nrg[1]/nrg[0] */ + hStereoMdct->smooth_ratio = 0.8f * hStereoMdct->smooth_ratio + 0.2f * nrgRatio; + /* set flag to reverse dmx computation in case of right-side panning, only relevant for mono output */ + if ( hStereoMdct->smooth_ratio > 1.3f ) + { + hStereoMdct->reverse_dmx = 1; + } + else if ( hStereoMdct->smooth_ratio < 0.9f ) + { + hStereoMdct->reverse_dmx = 0; + } + + if ( ( nrgRatio > 1.0f ) && ( k < ( ( core_r == TCX_10_CORE ) ? NB_DIV : 1 ) ) ) + { + v_multc( spec_r[k], nrgRatio, spec_r[k], L_frameTCX_r ); + } + else if ( ( nrgRatio < 1.0f ) && ( k < ( ( core_l == TCX_10_CORE ) ? NB_DIV : 1 ) ) ) + { + v_multc( spec_l[k], 1.0f / nrgRatio, spec_l[k], L_frameTCX_l ); + } + } + } /* for k */ + + return; +} + + +/*-------------------------------------------------------------------* + * inverseBwMS() + * + * Band-wise M/S stereo processing + *-------------------------------------------------------------------*/ + +static void inverseBwMS( + const int16_t startLine, /* i : start line of sfb */ + const int16_t stopLine, /* i : stop line of sfb */ + float x0[], /* i/o: mid/left channel coefficients */ + float x1[], /* i/o: side/right channel coefficients */ + const float norm_fac /* i : normalization factor */ +) +{ + int16_t j; + float tmpValue; + + for ( j = startLine; j < stopLine; j++ ) + { + tmpValue = x0[j]; + x0[j] = ( x0[j] + x1[j] ) * norm_fac; + x1[j] = ( tmpValue - x1[j] ) * norm_fac; + } + + return; +} + + +/*-------------------------------------------------------------------* + * inverseMS() + * + * M/S stereo processing + *-------------------------------------------------------------------*/ + +void inverseMS( + const int16_t L_frame, /* i : frame length */ + float x0[], /* i/o: mid/left channel coefficients */ + float x1[], /* i/o: side/right channel coefficients */ + const float norm_fac /* i : normalization factor */ +) +{ + inverseBwMS( 0, L_frame, x0, x1, norm_fac ); + + return; +} + + +/*-------------------------------------------------------------------* + * initMdctStereoDecData() + * + * Initialize MDCT stereo decoder configuration + *-------------------------------------------------------------------*/ + +void initMdctStereoDecData( + STEREO_MDCT_DEC_DATA *hStereoMdct, /* i/o: mdct stereo parameters structure */ + const int16_t igf, /* i : flag indicating IGF activity */ + const H_IGF_GRID igfGrid, /* i : IGF grid configuration */ + const int32_t element_brate, /* i : element bitrate */ + const int16_t bwidth /* i : audio bandwidth */ +) +{ + int16_t tcx_coded_lines; + + tcx_coded_lines = getNumTcxCodedLines( bwidth ); + + /*Initialize sfb parameteres for TCX20 */ + stereo_mdct_init_bands( tcx_coded_lines, TCX_20_CORE, element_brate, igf, &igfGrid[IGF_GRID_LB_NORM], &hStereoMdct->stbParamsTCX20.sfbOffset[0], &hStereoMdct->stbParamsTCX20.sfbCnt ); + + /*Initialize sfb parameteres for TCX10 */ + stereo_mdct_init_bands( tcx_coded_lines, TCX_10_CORE, element_brate, igf, &igfGrid[IGF_GRID_LB_SHORT], &hStereoMdct->stbParamsTCX10.sfbOffset[0], &hStereoMdct->stbParamsTCX10.sfbCnt ); + + /*Initialize sfb parameteres for transition frames */ + stereo_mdct_init_bands( tcx_coded_lines, -1, element_brate, igf, &igfGrid[IGF_GRID_LB_TRAN], &hStereoMdct->stbParamsTCX20afterACELP.sfbOffset[0], &hStereoMdct->stbParamsTCX20afterACELP.sfbCnt ); + + if ( igf ) + { + /* calculate the igf start band from the igf start line */ + stereo_mdct_init_igf_start_band( &( hStereoMdct->stbParamsTCX20 ), 1.0f, bwidth, element_brate ); + stereo_mdct_init_igf_start_band( &( hStereoMdct->stbParamsTCX10 ), 0.5f, bwidth, element_brate ); + stereo_mdct_init_igf_start_band( &( hStereoMdct->stbParamsTCX20afterACELP ), 1.25f, bwidth, element_brate ); + } + else + { + hStereoMdct->stbParamsTCX20.sfbIgfStart = -1; + hStereoMdct->stbParamsTCX10.sfbIgfStart = -1; + hStereoMdct->stbParamsTCX20afterACELP.sfbIgfStart = -1; + hStereoMdct->stbParamsTCX10.nBandsStereoCore = hStereoMdct->stbParamsTCX10.sfbCnt; + hStereoMdct->stbParamsTCX20.nBandsStereoCore = hStereoMdct->stbParamsTCX20.sfbCnt; + hStereoMdct->stbParamsTCX20afterACELP.nBandsStereoCore = hStereoMdct->stbParamsTCX20afterACELP.sfbCnt; + } + + return; +} + + +/*-------------------------------------------------------------------* + * initMdctStereoDtxData() + * + * Allocate and initialize structures for MDCT-Stereo DTX operation + *-------------------------------------------------------------------*/ + +ivas_error initMdctStereoDtxData( + CPE_DEC_HANDLE hCPE /* i/o: CPE handle */ +) +{ + int16_t ch; + ivas_error error; + + error = IVAS_ERR_OK; + + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + DEC_CORE_HANDLE st = hCPE->hCoreCoder[ch]; + + if ( st->hFdCngDec == NULL ) + { + /* Create FD_CNG instance */ + if ( ( error = createFdCngDec( &st->hFdCngDec ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Init FD-CNG */ + initFdCngDec( st ); + } + + if ( st->first_CNG == 0 ) + { + if ( ch == 1 && st->cng_sba_flag ) + { + st->hFdCngDec->hFdCngCom->seed += 3; + } + } + + if ( st->cldfbAna == NULL ) + { + /* open analysis for max. sampling rate 48kHz */ + if ( ( error = openCldfb( &st->cldfbAna, CLDFB_ANALYSIS, 48000, CLDFB_PROTOTYPE_1_25MS ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( st->cldfbBPF == NULL ) + { + /* open analysis BPF for max. internal sampling rate 16kHz */ + if ( ( error = openCldfb( &st->cldfbBPF, CLDFB_ANALYSIS, 16000, CLDFB_PROTOTYPE_1_25MS ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + + return error; +} + +/*-------------------------------------------------------------------* + * synchonize_channels_mdct_sid() + * + * Synchronize channels in SID frame in MDCT stereo + *-------------------------------------------------------------------*/ + +void synchonize_channels_mdct_sid( + Decoder_State *sts[CPE_CHANNELS], /* i/o: decoder state structure */ + const int16_t n /* i : channel number */ +) +{ + Decoder_State *st; + + st = sts[n]; + + if ( st->element_mode == IVAS_CPE_MDCT && st->total_brate == SID_2k40 ) + { + if ( n == 1 ) + { + /* synchronize channels */ + sts[1]->L_frame = sts[0]->L_frame; + sts[1]->cng_type = sts[0]->cng_type; + sts[1]->bwidth = sts[0]->bwidth; + sts[0]->hFdCngDec->hFdCngCom->coherence = sts[1]->hFdCngDec->hFdCngCom->coherence; /* coherence is stored in sts[1] - see ivas_decision_matrix_dec() */ + sts[0]->hFdCngDec->hFdCngCom->no_side_flag = sts[1]->hFdCngDec->hFdCngCom->no_side_flag; + + /* configure when there is a switching from DFT CNG to MDCT CNG */ + if ( sts[0]->first_CNG == 1 && sts[1]->first_CNG == 0 ) + { + configureFdCngDec( st->hFdCngDec, st->bwidth, st->element_brate, st->L_frame, st->last_L_frame, st->element_mode ); + } + } + + if ( sts[0]->first_CNG == 0 ) + { + /* configure CNG after reading first side info from SID to get correct values for L_frame and bwidth if first SID is also first valid frame */ + configureFdCngDec( st->hFdCngDec, st->bwidth, st->element_brate, st->L_frame, st->last_L_frame, st->element_mode ); + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * updateBuffersForDmxMdctStereo() + * + * synch buffers between channels for mono output and + * apply passive downmix to certain buffers to enable smooth transitions + * between active/inactive coding in MDCT-Stereo DTX + *-------------------------------------------------------------------*/ + +void updateBuffersForDmxMdctStereo( + CPE_DEC_HANDLE hCPE, /* i/o: CPE handle */ + const int16_t output_frame, /* i : output frame length */ + float *output[CPE_CHANNELS], /* i/o: decoder output */ + float synth[CPE_CHANNELS][L_FRAME48k] /* i/o: decoder synthesis */ +) +{ + int16_t delay_buf_out_len, tcxltp_mem_in_len, delta, i; + Decoder_State *sts[CPE_CHANNELS]; + + sts[0] = hCPE->hCoreCoder[0]; + sts[1] = hCPE->hCoreCoder[1]; + + /* synch buffers for inactive frames, but not for transition frames */ + if ( hCPE->last_element_brate <= IVAS_SID_5k2 ) + { + mvr2r( output[0], output[1], output_frame ); + mvr2r( synth[0], synth[1], output_frame ); + } + + if ( hCPE->element_brate == IVAS_SID_5k2 && hCPE->last_element_brate > IVAS_SID_5k2 ) + { + /* in the first SID frame after an active frame, create mid noise shape here, in SID frames that follow inactive frames, it is done directly in the SID decoding since the mid shape is being used in CNG then */ + for ( int16_t p = 0; p < sts[0]->hFdCngDec->hFdCngCom->npart; p++ ) + { + sts[0]->hFdCngDec->hFdCngCom->sidNoiseEst[p] = 0.5f * ( sts[0]->hFdCngDec->hFdCngCom->sidNoiseEst[p] + sts[1]->hFdCngDec->hFdCngCom->sidNoiseEst[p] ); + } + } + + /* for transition of active->inactive frame, apply passive downmix on buffers */ + if ( hCPE->last_element_brate <= IVAS_SID_5k2 ) + { + delta = 1; + if ( output_frame == L_FRAME16k ) + { + delta = 2; + } + else if ( output_frame == L_FRAME32k ) + { + delta = 4; + } + else if ( output_frame == L_FRAME48k ) + { + delta = 6; + } + + delay_buf_out_len = delta * HQ_DELAY_COMP; + tcxltp_mem_in_len = NS2SA( sts[0]->output_Fs, TCXLTP_DELAY_NS ); + + assert( delay_buf_out_len > tcxltp_mem_in_len ); + + for ( i = 0; i < tcxltp_mem_in_len; i++ ) + { + sts[0]->hTcxLtpDec->tcxltp_mem_in[i] = INV_SQRT2 * ( sts[0]->hTcxLtpDec->tcxltp_mem_in[i] + sts[1]->hTcxLtpDec->tcxltp_mem_in[i] ); + sts[0]->delay_buf_out[i] = INV_SQRT2 * ( sts[0]->delay_buf_out[i] + sts[1]->delay_buf_out[i] ); + sts[0]->hHQ_core->old_out[i] = INV_SQRT2 * ( sts[0]->hHQ_core->old_out[i] + sts[1]->hHQ_core->old_out[i] ); + sts[0]->hTcxLtpDec->tcxltp_mem_out[i] = INV_SQRT2 * ( sts[0]->hTcxLtpDec->tcxltp_mem_out[i] + sts[1]->hTcxLtpDec->tcxltp_mem_out[i] ); + } + for ( ; i < delay_buf_out_len; i++ ) + { + sts[0]->delay_buf_out[i] = INV_SQRT2 * ( sts[0]->delay_buf_out[i] + sts[1]->delay_buf_out[i] ); + sts[0]->hHQ_core->old_out[i] = INV_SQRT2 * ( sts[0]->hHQ_core->old_out[i] + sts[1]->hHQ_core->old_out[i] ); + sts[0]->hTcxLtpDec->tcxltp_mem_out[i] = INV_SQRT2 * ( sts[0]->hTcxLtpDec->tcxltp_mem_out[i] + sts[1]->hTcxLtpDec->tcxltp_mem_out[i] ); + } + for ( ; i < output_frame; i++ ) + { + sts[0]->hHQ_core->old_out[i] = INV_SQRT2 * ( sts[0]->hHQ_core->old_out[i] + sts[1]->hHQ_core->old_out[i] ); + sts[0]->hTcxLtpDec->tcxltp_mem_out[i] = INV_SQRT2 * ( sts[0]->hTcxLtpDec->tcxltp_mem_out[i] + sts[1]->hTcxLtpDec->tcxltp_mem_out[i] ); + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * applyDmxMdctStereo() + * + * apply passive downmix to certain buffers to enable smooth transitions + * between active/inactive coding in MDCT-Stereo DTX + *-------------------------------------------------------------------*/ + +void applyDmxMdctStereo( + const CPE_DEC_HANDLE hCPE, /* i : CPE handle */ + float *output[CPE_CHANNELS], /* i/o: core decoder output */ + const int16_t output_frame /* i : output frame length */ +) +{ + int16_t crossfade_len, i; + int16_t dmx_len; + float fade, step; + + step = 1.f; + fade = 1.f; + dmx_len = output_frame; + + if ( hCPE->last_element_brate <= IVAS_SID_5k2 ) + { + crossfade_len = NS2SA( hCPE->hCoreCoder[0]->output_Fs, IVAS_DEC_DELAY_NS - DELAY_CLDFB_NS ); + step /= crossfade_len; + } + /* for first inactive CNG frame after active decoding we have to do a fade-OUT FROM the passive DMX */ + else if ( hCPE->element_brate <= IVAS_SID_5k2 && hCPE->last_element_brate > IVAS_SID_5k2 ) + { + crossfade_len = output_frame / 4; + step /= -crossfade_len; + fade = 0.f; + dmx_len = crossfade_len; + } + else if ( hCPE->last_element_mode == IVAS_CPE_DFT && hCPE->last_element_brate <= IVAS_32k ) + { + crossfade_len = NS2SA( hCPE->hCoreCoder[0]->output_Fs, DELAY_CLDFB_NS ); + step /= crossfade_len; + } + else + { + crossfade_len = 0; + } + + /* apply crossfade */ + for ( i = 0; i < crossfade_len; i++ ) + { + output[0][i] = output[0][i] * fade + ( output[0][i] + output[1][i] ) * INV_SQRT2 * ( 1 - fade ); + fade -= step; + } + + /* apply passive downmix on all-active-frame part */ + for ( ; i < dmx_len; i++ ) + { + output[0][i] = ( output[0][i] + output[1][i] ) * INV_SQRT_2; + } + + return; +} diff --git a/lib_dec/ivas_stereo_switching_dec.c b/lib_dec/ivas_stereo_switching_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..681effb0b7fe55188460062fad98d40453523852 --- /dev/null +++ b/lib_dec/ivas_stereo_switching_dec.c @@ -0,0 +1,1936 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_rom_com.h" +#include "assert.h" +#include "wmc_auto.h" +#include + +/*-------------------------------------------------------------------* + * Local constants + *-------------------------------------------------------------------*/ + +#define DFT2TD_CORR_THRESH 0.9f + + +/*-------------------------------------------------------------------* + * Function allocate_CoreCoder_TCX() + * + * Allocate CoreCoder TCX modules + *-------------------------------------------------------------------*/ + +static ivas_error allocate_CoreCoder_TCX( + DEC_CORE_HANDLE st /* i/o: Core decoder state structure */ +) +{ + if ( st->hTcxDec == NULL ) + { + if ( ( st->hTcxDec = (TCX_DEC_HANDLE) malloc( sizeof( TCX_DEC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for hTcxDec" ) ); + } + + reset_tcx_overl_buf( st->hTcxDec ); + + set_zero( st->hTcxDec->syn_OverlFB, L_FRAME48k / 2 ); + set_zero( st->hTcxDec->old_synth, OLD_SYNTH_INTERNAL_DEC ); + set_zero( st->hTcxDec->synth_history, L_PROT48k + L_FRAME48k ); + } + + if ( st->hTcxCfg == NULL ) + { + if ( ( st->hTcxCfg = (TCX_CONFIG_HANDLE) malloc( sizeof( TCX_config ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for hTcxCfg" ) ); + } + } + + /* allocated TCX-LTP structure for second channel */ + if ( st->hTcxLtpDec == NULL ) + { + if ( ( st->hTcxLtpDec = (TCX_LTP_DEC_HANDLE) malloc( sizeof( TCX_LTP_DEC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for TCX-LTP handle\n" ) ); + } + + tcxltp_dec_init( st->hTcxLtpDec, 0, st->last_codec_mode, st->element_mode, st->pit_max, st->sr_core ); + } + + /* allocate HQ structure */ + if ( st->hHQ_core == NULL ) + { + if ( ( st->hHQ_core = (HQ_DEC_HANDLE) malloc( sizeof( HQ_DEC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for HQ core\n" ) ); + } + + HQ_core_dec_init( st->hHQ_core ); + } + + if ( st->hIGFDec == NULL ) + { + if ( ( st->hIGFDec = (IGF_DEC_INSTANCE_HANDLE) malloc( sizeof( IGFDEC_INSTANCE ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for IGF\n" ) ); + } + + st->igf = 0; + init_igf_dec( st->hIGFDec ); + } + + if ( st->hTonalMDCTConc == NULL ) + { + if ( ( st->hTonalMDCTConc = (TonalMDCTConcealPtr) malloc( sizeof( TonalMDCTConceal_INSTANCE ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for TonalMDCTConcealment\n" ) ); + } + } + + st->last_con_tcx = 0; + st->hTonalMDCTConc->nSamples = 0; + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * Function allocate_CoreCoder() + * + * Allocate CoreCoder modules + *-------------------------------------------------------------------*/ + +static ivas_error allocate_CoreCoder( + DEC_CORE_HANDLE st /* i/o: Core decoder state structure */ +) +{ + ivas_error error; + + error = IVAS_ERR_OK; + + if ( st->hGSCDec == NULL ) + { + if ( ( st->hGSCDec = (GSC_DEC_HANDLE) malloc( sizeof( GSC_DEC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for GSC\n" ) ); + } + + GSC_dec_init( st->hGSCDec ); + } + + if ( st->hPFstat == NULL ) + { + if ( ( st->hPFstat = (PFSTAT_HANDLE) malloc( sizeof( PFSTAT ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for NB/formant postflter\n" ) ); + } + + Init_post_filter( st->hPFstat ); + st->psf_lp_noise = 0.0f; + } + + if ( st->hMusicPF == NULL ) + { + if ( ( st->hMusicPF = (MUSIC_POSTFILT_HANDLE) malloc( sizeof( MUSIC_POSTFILT_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LD music postflter\n" ) ); + } + + music_postfilt_init( st->hMusicPF ); + } + + if ( st->hBPF == NULL ) + { + if ( ( st->hBPF = (BPF_DEC_HANDLE) malloc( sizeof( BPF_DEC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for BPF\n" ) ); + } + + bass_psfilter_init( st->hBPF ); + } + + if ( st->hBWE_zero == NULL ) + { + if ( ( st->hBWE_zero = (ZERO_BWE_DEC_HANDLE) malloc( sizeof( ZERO_BWE_DEC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for zero BWE\n" ) ); + } + + hf_synth_init( st->hBWE_zero ); + } + + if ( st->cldfbAna == NULL ) + { + /* open analysis for max. sampling rate 48kHz */ + if ( ( error = openCldfb( &st->cldfbAna, CLDFB_ANALYSIS, 48000, CLDFB_PROTOTYPE_1_25MS ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( st->cldfbBPF == NULL ) + { + /* open analysis BPF for max. internal sampling rate 16kHz */ + if ( ( error = openCldfb( &st->cldfbBPF, CLDFB_ANALYSIS, 16000, CLDFB_PROTOTYPE_1_25MS ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + return error; +} + + +/*-------------------------------------------------------------------* + * Function deallocate_CoreCoder_TCX() + * + * Deallocate CoreCoder TCX modules + *-------------------------------------------------------------------*/ + +static void deallocate_CoreCoder_TCX( + DEC_CORE_HANDLE st /* i/o: Core decoder state structure */ +) +{ + if ( st->hTcxDec != NULL ) + { + free( st->hTcxDec ); + st->hTcxDec = NULL; + } + + if ( st->hTcxCfg != NULL ) + { + free( st->hTcxCfg ); + st->hTcxCfg = NULL; + } + + if ( st->hIGFDec != NULL ) + { + free( st->hIGFDec ); + st->hIGFDec = NULL; + } + + if ( st->hTonalMDCTConc != NULL ) + { + free( st->hTonalMDCTConc ); + st->hTonalMDCTConc = NULL; + } + + return; +} + + +/*-------------------------------------------------------------------* + * Function deallocate_CoreCoder() + * + * Deallocate CoreCoder modules + *-------------------------------------------------------------------*/ + +static void deallocate_CoreCoder( + DEC_CORE_HANDLE st /* i/o: Core decoder state structure */ +) +{ + if ( st->hGSCDec != NULL ) + { + free( st->hGSCDec ); + st->hGSCDec = NULL; + } + + if ( st->hPFstat != NULL ) + { + free( st->hPFstat ); + st->hPFstat = NULL; + } + + if ( st->hMusicPF != NULL ) + { + free( st->hMusicPF ); + st->hMusicPF = NULL; + } + + if ( st->hBPF != NULL ) + { + free( st->hBPF ); + st->hBPF = NULL; + } + + if ( st->hBWE_zero != NULL ) + { + free( st->hBWE_zero ); + st->hBWE_zero = NULL; + } + + /* CLDFB BPF & resampling tools */ + if ( st->element_mode != IVAS_CPE_MDCT ) + { + deleteCldfb( &st->cldfbAna ); /* delete analysis at max. sampling rate 48kHz */ + deleteCldfb( &st->cldfbBPF ); /* delete analysis BPF at max. internal sampling rate 16kHz */ + } + + if ( st->element_mode != IVAS_CPE_MDCT ) + { + deallocate_CoreCoder_TCX( st ); + } + + return; +} + + +/*-------------------------------------------------------------------* + * Function cpy_tcx_ltp_data() + * + * In case of MDCT<->DFT Stereo switching, copy TCX-LTP data of the right + * channel to the correct structure in the new mode + *-------------------------------------------------------------------*/ + +static void cpy_tcx_ltp_data( + TCX_LTP_DEC_HANDLE hTcxLtpDecOld, /* i : TCX-LTP structure to copy from */ + TCX_LTP_DEC_HANDLE hTcxLtpDecNew, /* o : TCX-LTP structure to copy to */ + const int32_t output_Fs /* i : output sampling rate */ +) +{ + hTcxLtpDecNew->tcxltp_pitch_int_post_prev = hTcxLtpDecOld->tcxltp_pitch_int_post_prev; + hTcxLtpDecNew->tcxltp_pitch_fr_post_prev = hTcxLtpDecOld->tcxltp_pitch_fr_post_prev; + hTcxLtpDecNew->tcxltp_gain_post_prev = hTcxLtpDecOld->tcxltp_gain_post_prev; + hTcxLtpDecNew->tcxltp_filt_idx_prev = hTcxLtpDecOld->tcxltp_filt_idx_prev; + + mvr2r( hTcxLtpDecOld->tcxltp_mem_in, hTcxLtpDecNew->tcxltp_mem_in, (int16_t) ( ( TCXLTP_MAX_DELAY * output_Fs ) / 48000 ) ); + mvr2r( hTcxLtpDecOld->tcxltp_mem_out, hTcxLtpDecNew->tcxltp_mem_out, (int16_t) ( ( L_FRAME48k * output_Fs ) / 48000 ) ); + + return; +} + + +/*-------------------------------------------------------------------* + * Function stereo_memory_dec() + * + * Dynamically allocate/deallocate data structures depending on the actual CPE mode + *-------------------------------------------------------------------*/ + +ivas_error stereo_memory_dec( + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + CPE_DEC_HANDLE hCPE, /* i : CPE decoder structure */ + const int16_t nb_bits_metadata, /* i : number of metadata bits */ + const int32_t output_Fs, /* i : output sampling rate */ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const MC_MODE mc_mode, /* i : MC mode */ + const int16_t nchan_transport /* i : number of transport channels*/ +) +{ + DEC_CORE_HANDLE st; + int16_t i, n, delay_comp_DFT; + ivas_error error; + + error = IVAS_ERR_OK; + + assert( hCPE->last_element_mode >= IVAS_CPE_DFT && "Switching from SCE to CPE is not a valid configuration!" ); + + + hCPE->hCoreCoder[0]->element_mode = hCPE->element_mode; + hCPE->hCoreCoder[1]->element_mode = hCPE->element_mode; + + /*--------------------------------------------------------------* + * stereo switching (using parameters that will be freed) + *---------------------------------------------------------------*/ + + /* handling of DFT->TD switching */ + if ( hCPE->last_element_mode == IVAS_CPE_DFT && ( hCPE->element_mode == IVAS_CPE_TD || hCPE->element_mode == IVAS_CPE_MDCT ) ) + { + delay_comp_DFT = NS2SA( output_Fs, IVAS_DEC_DELAY_NS - STEREO_DFT32MS_OVL_NS ); + + /* redressing of the DFT OLA part */ + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + for ( i = delay_comp_DFT; i < hCPE->hStereoDft->dft32ms_ovl; i++ ) + { + hCPE->output_mem[n][i - delay_comp_DFT] /= hCPE->hStereoDft->win32ms[STEREO_DFT32MS_STEP * ( hCPE->hStereoDft->dft32ms_ovl - 1 + delay_comp_DFT - i )]; + } + } + + if ( hCPE->hCoreCoder[0]->last_core != ACELP_CORE ) + { + mvr2r( hCPE->hStereoDft->buff_LBTCX_mem, hCPE->input_mem_LB[0], NS2SA( hCPE->hCoreCoder[0]->last_L_frame * FRAMES_PER_SEC, STEREO_DFT32MS_OVL_NS ) ); + } + } + + if ( hCPE->last_element_mode == IVAS_CPE_MDCT && hCPE->element_mode == IVAS_CPE_DFT ) + { + v_add( hCPE->hCoreCoder[0]->hHQ_core->old_out, hCPE->hCoreCoder[1]->hHQ_core->old_out, hCPE->hCoreCoder[0]->hHQ_core->old_out, (int16_t) ( output_Fs / FRAMES_PER_SEC ) ); + v_multc( hCPE->hCoreCoder[0]->hHQ_core->old_out, 0.5f, hCPE->hCoreCoder[0]->hHQ_core->old_out, (int16_t) ( output_Fs / FRAMES_PER_SEC ) ); + + v_add( hCPE->hCoreCoder[0]->hHQ_core->old_outLB, hCPE->hCoreCoder[1]->hHQ_core->old_outLB, hCPE->hCoreCoder[0]->hHQ_core->old_outLB, L_FRAME32k ); + v_multc( hCPE->hCoreCoder[0]->hHQ_core->old_outLB, 0.5f, hCPE->hCoreCoder[0]->hHQ_core->old_outLB, L_FRAME32k ); + } + + /*--------------------------------------------------------------* + * allocate/deallocate data structures + *---------------------------------------------------------------*/ + + if ( hCPE->element_mode != hCPE->last_element_mode ) + { + /*--------------------------------------------------------------* + * switching CPE mode to DFT stereo + *---------------------------------------------------------------*/ + + if ( hCPE->element_mode == IVAS_CPE_DFT ) + { + /* deallocate data structure of the previous CPE mode */ + if ( hCPE->hStereoTD != NULL ) + { + free( hCPE->hStereoTD ); + hCPE->hStereoTD = NULL; + } + + if ( hCPE->hStereoMdct != NULL ) + { + free( hCPE->hStereoMdct ); + hCPE->hStereoMdct = NULL; + } + + /* deallocate secondary channel */ + deallocate_CoreCoder( hCPE->hCoreCoder[1] ); + + /* allocate DFT stereo data structure */ + if ( ( error = stereo_dft_dec_create( &( hCPE->hStereoDft ), hCPE->element_brate, output_Fs, 0, nchan_transport ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( hCPE->last_element_mode == IVAS_CPE_MDCT ) + { + cpy_tcx_ltp_data( hCPE->hCoreCoder[1]->hTcxLtpDec, hCPE->hStereoDft->hTcxLtpDec, output_Fs ); + deleteFdCngDec( &hCPE->hCoreCoder[1]->hFdCngDec ); + } + + /* memory update - needed in TD stereo, TCX/HQ frame -> DFT stereo, ACELP frame switching */ + mvr2r( hCPE->input_mem_LB[0], hCPE->hStereoDft->buff_LBTCX_mem, NS2SA( min( hCPE->hCoreCoder[0]->last_L_frame * FRAMES_PER_SEC, 16000 ), STEREO_DFT32MS_OVL_NS ) ); + + /* allocate ICBWE structure */ + if ( hCPE->hStereoICBWE == NULL ) + { + if ( ( hCPE->hStereoICBWE = (STEREO_ICBWE_DEC_HANDLE) malloc( sizeof( STEREO_ICBWE_DEC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Stereo ICBWE \n" ) ); + } + + stereo_icBWE_init_dec( hCPE->hStereoICBWE ); + } + + /* allocate HQ core */ + st = hCPE->hCoreCoder[0]; + if ( st->hHQ_core == NULL ) + { + if ( ( st->hHQ_core = (HQ_DEC_HANDLE) malloc( sizeof( HQ_DEC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HQ core\n" ) ); + } + + HQ_core_dec_init( st->hHQ_core ); + } + + /* allocate TD CNG handle */ + if ( st->idchan == 0 && st->hTdCngDec == NULL ) + { + if ( ( st->hTdCngDec = (TD_CNG_DEC_HANDLE) malloc( sizeof( TD_CNG_DEC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DTX/TD CNG\n" ) ); + } + + td_cng_dec_init( st ); + } + } + + /*--------------------------------------------------------------* + * switching CPE mode to TD stereo + *---------------------------------------------------------------*/ + + if ( hCPE->element_mode == IVAS_CPE_TD ) + { + /* deallocate data structure of the previous CPE mode */ + if ( hCPE->hStereoDft != NULL ) + { + stereo_dft_dec_destroy( &( hCPE->hStereoDft ) ); + hCPE->hStereoDft = NULL; + } + + if ( hCPE->hStereoMdct != NULL ) + { + free( hCPE->hStereoMdct ); + hCPE->hStereoMdct = NULL; + } + + /* deallocated TCX/IGF structures for second channel */ + deallocate_CoreCoder_TCX( hCPE->hCoreCoder[1] ); + + if ( hCPE->last_element_mode == IVAS_CPE_MDCT ) + { + deleteFdCngDec( &hCPE->hCoreCoder[1]->hFdCngDec ); + } + + /* allocate TD stereo data structure */ + if ( hCPE->hStereoTD != NULL ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error: TD Stereo memory already allocated\n" ); + } + + if ( ( hCPE->hStereoTD = (STEREO_TD_DEC_DATA_HANDLE) malloc( sizeof( STEREO_TD_DEC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD Stereo\n" ) ); + } + + stereo_td_init_dec( hCPE->hStereoTD, hCPE->last_element_mode ); + + /* allocate CoreCoder secondary channel */ + if ( ( error = allocate_CoreCoder( hCPE->hCoreCoder[1] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /*--------------------------------------------------------------* + * allocate DFT/TD stereo structures after MDCT stereo frame + *---------------------------------------------------------------*/ + + if ( hCPE->last_element_mode == IVAS_CPE_MDCT && ( hCPE->element_mode == IVAS_CPE_DFT || hCPE->element_mode == IVAS_CPE_TD ) ) + { + /* deallocated TCX-LTP for second channel */ + st = hCPE->hCoreCoder[1]; + if ( st->hTcxLtpDec != 0 ) + { + free( st->hTcxLtpDec ); + st->hTcxLtpDec = NULL; + } + + if ( st->element_mode == IVAS_CPE_TD ) + { + /* re-use an existing buffer for MDCT->TD stereo switching */ + int16_t nZeros, len; + nZeros = (int16_t) ( NS2SA( st->output_Fs, N_ZERO_MDCT_NS ) ); + len = NS2SA( st->output_Fs, 3000000 ); + mvr2r( st->hHQ_core->old_out + nZeros, hCPE->output_mem[1], len ); + } + + /* deallocated HQ-core for second channel */ + if ( st->hHQ_core != 0 ) + { + free( st->hHQ_core ); + st->hHQ_core = NULL; + } + + /* allocate DFT stereo mono DMX data structure */ + if ( hCPE->nchan_out == 1 && hCPE->hStereoDftDmx == NULL ) + { + if ( ( hCPE->hStereoDftDmx = (STEREO_DFT_DMX_DATA_HANDLE) malloc( sizeof( STEREO_DFT_DMX_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Stereo DFT mono output\n" ) ); + } + stereo_dft_dmx_out_reset( hCPE->hStereoDftDmx ); + } + + /* allocate TCA data structure */ + if ( hCPE->nchan_out != 1 && hCPE->hStereoTCA == NULL ) + { + if ( ( hCPE->hStereoTCA = (STEREO_TCA_DEC_HANDLE) malloc( sizeof( STEREO_TCA_DEC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Stereo TCA\n" ) ); + } + + stereo_tca_init_dec( hCPE->hStereoTCA ); + } + + st = hCPE->hCoreCoder[0]; + + /* allocate primary channel substructures */ + if ( ( error = allocate_CoreCoder( st ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* allocate BWEs for primary channel */ + if ( st->hBWE_TD == NULL ) + { + if ( ( st->hBWE_TD = (TD_BWE_DEC_HANDLE) malloc( sizeof( TD_BWE_DEC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD BWE\n" ) ); + } + + td_bwe_dec_init( st->hBWE_TD, -1, st->output_Fs ); + + if ( ( st->hBWE_FD = (FD_BWE_DEC_HANDLE) malloc( sizeof( FD_BWE_DEC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for FD BWE\n" ) ); + } + + fd_bwe_dec_init( st->hBWE_FD ); + } + + /* Allocated FD_CNG instance for primary channel*/ + if ( st->hFdCngDec == NULL ) + { + /* Create FD_CNG instance */ + if ( ( error = createFdCngDec( &st->hFdCngDec ) ) != IVAS_ERR_OK ) + { + return error; + } + initFdCngDec( st ); + configureFdCngDec( st->hFdCngDec, st->bwidth, st->total_brate, st->L_frame, st->last_L_frame, st->element_mode ); + } + + /* allocate stereo CNG structure */ + if ( hCPE->hStereoCng == NULL ) + { + if ( ( hCPE->hStereoCng = (STEREO_CNG_DEC_HANDLE) malloc( sizeof( STEREO_CNG_DEC ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Stereo CNG\n" ) ); + } + stereo_cng_init_dec( hCPE->hStereoCng, &st->hFdCngDec->hFdCngCom->frameSize ); + } + } + + /*--------------------------------------------------------------* + * switching CPE mode to MDCT stereo + *---------------------------------------------------------------*/ + + if ( hCPE->element_mode == IVAS_CPE_MDCT ) + { + float tmpF_buff[L_FRAME16k / 2]; + TCX_LTP_DEC_DATA tcxLtpTmp; + + if ( hCPE->last_element_mode == IVAS_CPE_TD ) + { + mvr2r( hCPE->hStereoTD->TCX_old_syn_Overl, tmpF_buff, L_FRAME16k / 2 ); + } + + if ( hCPE->last_element_mode == IVAS_CPE_DFT ) + { + cpy_tcx_ltp_data( hCPE->hStereoDft->hTcxLtpDec, &tcxLtpTmp, output_Fs ); + } + + /* deallocate data structure of the previous CPE mode */ + if ( hCPE->hStereoDft != NULL ) + { + stereo_dft_dec_destroy( &( hCPE->hStereoDft ) ); + hCPE->hStereoDft = NULL; + } + + if ( hCPE->hStereoTD != NULL ) + { + free( hCPE->hStereoTD ); + hCPE->hStereoTD = NULL; + } + + if ( hCPE->hStereoDftDmx != NULL ) + { + free( hCPE->hStereoDftDmx ); + hCPE->hStereoDftDmx = NULL; + } + + if ( hCPE->hStereoICBWE != NULL ) + { + free( hCPE->hStereoICBWE ); + hCPE->hStereoICBWE = NULL; + } + + /* de-allocate stereo CNG structure */ + if ( hCPE->hStereoCng != NULL ) + { + free( hCPE->hStereoCng ); + hCPE->hStereoCng = NULL; + } + + for ( i = 0; i < CPE_CHANNELS; i++ ) + { + st = hCPE->hCoreCoder[i]; + st->element_mode = hCPE->element_mode; + + /* deallocate core-decoder substructures */ + deallocate_CoreCoder( st ); + + st->first_CNG = 0; + } + + /* allocate CLDFB structures for second channel */ + st = hCPE->hCoreCoder[1]; + + if ( st->cldfbAna == NULL ) + { + if ( ( error = openCldfb( &st->cldfbAna, CLDFB_ANALYSIS, 48000, CLDFB_PROTOTYPE_1_25MS ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( st->cldfbBPF == NULL ) + { + /* open analysis BPF for max. internal sampling rate 16kHz */ + if ( ( error = openCldfb( &st->cldfbBPF, CLDFB_ANALYSIS, 16000, CLDFB_PROTOTYPE_1_25MS ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* allocate Fd-Cng structure for second channel */ + if ( ( error = createFdCngDec( &st->hFdCngDec ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Init FD-CNG */ + initFdCngDec( st ); + + if ( hCPE->last_element_mode == IVAS_CPE_DFT ) + { + st->last_core = ACELP_CORE; /* needed to set-up TCX core in SetTCXModeInfo() */ + } + + /*Allocate CoreCoder TCX modules for second channel */ + if ( ( error = allocate_CoreCoder_TCX( hCPE->hCoreCoder[1] ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( hCPE->last_element_mode == IVAS_CPE_DFT ) + { + if ( hCPE->nchan_out == 1 ) + { + cpy_tcx_ltp_data( hCPE->hCoreCoder[0]->hTcxLtpDec, hCPE->hCoreCoder[1]->hTcxLtpDec, output_Fs ); + } + else + { + cpy_tcx_ltp_data( &tcxLtpTmp, hCPE->hCoreCoder[1]->hTcxLtpDec, output_Fs ); + } + } + + if ( hCPE->last_element_mode == IVAS_CPE_TD ) + { + mvr2r( tmpF_buff, st->hTcxDec->old_syn_Overl, L_FRAME16k / 2 ); + } + + set_f( st->hTcxDec->FBTCXdelayBuf, 0.0f, 111 ); + st->hTcxDec->old_synthFB = st->hTcxDec->synth_history + NS2SA( st->output_Fs, PH_ECU_MEM_NS ); + st->hTcxDec->prev_good_synth = st->hTcxDec->old_synthFB + NS2SA( st->output_Fs, PH_ECU_LOOKAHEAD_NS ); + + /* allocate and initialize MDCT stereo structure */ + if ( ( hCPE->hStereoMdct = (STEREO_MDCT_DEC_DATA_HANDLE) malloc( sizeof( STEREO_MDCT_DEC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MDCT Stereo \n" ) ); + } + if ( ivas_format == STEREO_FORMAT && hCPE->element_brate <= MAX_MDCT_ITD_BRATE ) + { + hCPE->hStereoMdct->use_itd = 1; + } + else + { + hCPE->hStereoMdct->use_itd = 0; + } + hCPE->hStereoMdct->reverse_dmx = 0; + hCPE->hStereoMdct->smooth_ratio = 1.f; + } + } + + /*--------------------------------------------------------------* + * normal TD / LRTD switching + *---------------------------------------------------------------*/ + + if ( hCPE->element_mode == IVAS_CPE_TD ) + { + if ( hCPE->hCoreCoder[0]->bfi == 0 ) + { + st = hCPE->hCoreCoder[1]; + hCPE->hStereoTD->tdm_LRTD_flag = get_indice_st( hCPE->hCoreCoder[0], hCPE->element_brate + hCPE->brate_surplus, (int16_t) ( ( hCPE->element_brate / FRAMES_PER_SEC ) - nb_bits_metadata + ( hCPE->brate_surplus / FRAMES_PER_SEC ) - TDM_SECONDARY_SIGNALLING - TDM_RATIO_BITS - TDM_LP_REUSE_BITS - TDM_LR_CONTENT_BITS ), TDM_LR_CONTENT_BITS ); + + if ( hCPE->hStereoTD->tdm_LRTD_flag ) + { + /* deallocate ICBWE structure */ + if ( hCPE->hStereoICBWE != NULL ) + { + free( hCPE->hStereoICBWE ); + hCPE->hStereoICBWE = NULL; + } + + /* allocate BWEs for secondary channel */ + if ( st->hBWE_TD == NULL ) + { + if ( ( st->hBWE_TD = (TD_BWE_DEC_HANDLE) malloc( sizeof( TD_BWE_DEC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD BWE\n" ) ); + } + + td_bwe_dec_init( st->hBWE_TD, -1, st->output_Fs ); + + if ( ( st->hBWE_FD = (FD_BWE_DEC_HANDLE) malloc( sizeof( FD_BWE_DEC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for FD BWE\n" ) ); + } + + fd_bwe_dec_init( st->hBWE_FD ); + } + } + else /* tdm_LRTD_flag == 0 */ + { + /* deallocate BWEs for secondary channel */ + if ( st->hBWE_TD != NULL ) + { + if ( st->hBWE_TD != NULL ) + { + free( st->hBWE_TD ); + st->hBWE_TD = NULL; + } + + if ( st->hBWE_FD != NULL ) + { + free( st->hBWE_FD ); + st->hBWE_FD = NULL; + } + } + + /* allocate ICBWE structure */ + if ( hCPE->hStereoICBWE == NULL ) + { + if ( ( hCPE->hStereoICBWE = (STEREO_ICBWE_DEC_HANDLE) malloc( sizeof( STEREO_ICBWE_DEC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Stereo ICBWE \n" ) ); + } + + stereo_icBWE_init_dec( hCPE->hStereoICBWE ); + } + } + } + } + + /*--------------------------------------------------------------* + * MDCT stereo bitrate switching + *---------------------------------------------------------------*/ + + if ( ivas_format == STEREO_FORMAT && hCPE->element_mode == IVAS_CPE_MDCT ) + { + if ( hCPE->element_brate <= MAX_MDCT_ITD_BRATE && ivas_total_brate > IVAS_SID_5k2 ) + { + if ( hCPE->hStereoMdct->use_itd == 0 ) + { + if ( hCPE->hStereoTCA == NULL ) + { + /* allocate TCA data structure */ + if ( ( hCPE->hStereoTCA = (STEREO_TCA_DEC_HANDLE) malloc( sizeof( STEREO_TCA_DEC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Stereo TCA\n" ) ); + } + } + stereo_tca_init_dec( hCPE->hStereoTCA ); + } + + hCPE->hStereoMdct->use_itd = 1; + } + else + { + /* de-allocate TCA data structure */ + if ( hCPE->hStereoMdct->use_itd == 1 && ivas_total_brate > IVAS_SID_5k2 && hCPE->hStereoTCA != NULL ) + { + free( hCPE->hStereoTCA ); + hCPE->hStereoTCA = NULL; + hCPE->hStereoMdct->use_itd = 0; + } + else if ( hCPE->hStereoMdct->use_itd == 1 && ivas_total_brate <= IVAS_SID_5k2 ) + { + hCPE->hStereoMdct->itd = 0.0f; + } + else + { + hCPE->hStereoMdct->use_itd = 0; + } + } + } + + /*--------------------------------------------------------------* + * Bitrate switching in MASA format + *---------------------------------------------------------------*/ + + if ( ( ivas_format == MASA_FORMAT || ivas_format == MASA_ISM_FORMAT ) && nchan_transport == 2 ) + { + if ( hCPE->nchan_out == 1 ) + { + if ( hCPE->hStereoDftDmx == NULL ) + { + if ( ( hCPE->hStereoDftDmx = (STEREO_DFT_DMX_DATA_HANDLE) malloc( sizeof( STEREO_DFT_DMX_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Stereo DFT mono output\n" ) ); + } + stereo_dft_dmx_out_reset( hCPE->hStereoDftDmx ); + } + + if ( hCPE->prev_synth_chs[1] != NULL ) + { + free( hCPE->prev_synth_chs[1] ); + hCPE->prev_synth_chs[1] = NULL; + } + + if ( hCPE->hStereoTCA != NULL ) + { + free( hCPE->hStereoTCA ); + hCPE->hStereoTCA = NULL; + } + } + else /* nchan_out == 2 */ + { + if ( hCPE->hStereoDftDmx != NULL ) + { + free( hCPE->hStereoDftDmx ); + hCPE->hStereoDftDmx = NULL; + } + + if ( hCPE->prev_synth_chs[1] == NULL ) + { + st = hCPE->hCoreCoder[1]; + if ( ( hCPE->prev_synth_chs[1] = (float *) malloc( sizeof( float ) * NS2SA( st->output_Fs, FRAME_SIZE_NS ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DFT stereo memory\n" ) ); + } + set_zero( hCPE->prev_synth_chs[1], NS2SA( st->output_Fs, FRAME_SIZE_NS ) ); + } + + if ( hCPE->hStereoICBWE == NULL && hCPE->element_mode == IVAS_CPE_DFT ) + { + if ( ( hCPE->hStereoICBWE = (STEREO_ICBWE_DEC_HANDLE) malloc( sizeof( STEREO_ICBWE_DEC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Stereo ICBWE \n" ) ); + } + + stereo_icBWE_init_dec( hCPE->hStereoICBWE ); + } + + if ( hCPE->hStereoTCA == NULL && ( hCPE->element_mode == IVAS_CPE_DFT || hCPE->element_mode == IVAS_CPE_TD ) ) + { + if ( ( hCPE->hStereoTCA = (STEREO_TCA_DEC_HANDLE) malloc( sizeof( STEREO_TCA_DEC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Stereo TCA\n" ) ); + } + + stereo_tca_init_dec( hCPE->hStereoTCA ); + } + + if ( hCPE->element_mode == IVAS_CPE_MDCT ) + { + if ( hCPE->hStereoTCA != NULL ) + { + /* note: in MASA, hCPE->hStereoMdct->itd = 0 */ + free( hCPE->hStereoTCA ); + hCPE->hStereoTCA = NULL; + } + + if ( hCPE->hStereoICBWE != NULL ) + { + free( hCPE->hStereoICBWE ); + hCPE->hStereoICBWE = NULL; + } + } + } + } + + /*--------------------------------------------------------------* + * Bitrate switching in MASA format + *---------------------------------------------------------------*/ + + if ( ivas_format == MC_FORMAT && hCPE->element_mode == IVAS_CPE_MDCT ) + { + if ( mc_mode == MC_MODE_MCT || mc_mode == MC_MODE_PARAMUPMIX ) + { + /* deallocate the FdCNG handle */ + for ( i = 0; i < CPE_CHANNELS; ++i ) + { + deleteFdCngDec( &hCPE->hCoreCoder[i]->hFdCngDec ); + } + } + else + { + /* allocate the FdCNG handle (for noise estimation for TCX PLC fadeout)*/ + for ( i = 0; i < CPE_CHANNELS; ++i ) + { + if ( hCPE->hCoreCoder[i]->cldfbSyn == NULL ) /* could be NULL when we had the MCT LFE channel */ + { + if ( ( error = openCldfb( &hCPE->hCoreCoder[i]->cldfbSyn, CLDFB_SYNTHESIS, hCPE->hCoreCoder[i]->output_Fs, CLDFB_PROTOTYPE_1_25MS ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( hCPE->hCoreCoder[i]->hFdCngDec == NULL ) + { + if ( ( error = createFdCngDec( &hCPE->hCoreCoder[i]->hFdCngDec ) ) != IVAS_ERR_OK ) + { + return error; + } + initFdCngDec( hCPE->hCoreCoder[i] ); + } + } + } + } + + return error; +} + + +/*-------------------------------------------------------------------* + * Function synchro_synthesis() + * + * Synchronize upmixed DFT/TD/MDCT stereo synthesis to match the overall delay of 32ms + * Handling of TD stereo <-> DFT stereo transitions + *-------------------------------------------------------------------*/ + +void synchro_synthesis( + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + float *output[CPE_CHANNELS], /* i/o: output synthesis signal */ + const int16_t output_frame, /* i : Number of samples */ + const int16_t sba_dirac_stereo_flag /* i : signal stereo output for SBA DirAC */ +) +{ + int16_t n, delay_comp_TD, delay_comp_DFT; + int32_t output_Fs; + Decoder_State **sts; + int16_t i, delay_cldfb, dft32ms_ovl; + float *p_output_mem[CPE_CHANNELS]; + float tmp_out[CPE_CHANNELS][NS2SA( 48000, DELAY_CLDFB_NS )]; + float tmp_out_TD[CPE_CHANNELS][STEREO_DFT32MS_OVL_MAX]; + float tmp_out_TD2[CPE_CHANNELS][STEREO_DFT32MS_OVL_MAX]; + int16_t use_cldfb_for_last_dft; + int16_t dft_mono_brate_switch; + int16_t delay_diff; + float tmpF; + int16_t nChannels; + + sts = hCPE->hCoreCoder; + output_Fs = sts[0]->output_Fs; + + use_cldfb_for_last_dft = 0; + if ( ( hCPE->element_mode != IVAS_CPE_DFT && hCPE->nchan_out == 1 && hCPE->last_element_brate <= IVAS_24k4 ) /* note: this is to mimic the DFT stereo condition "hCPE->hStereoDft->hConfig->res_cod_mode == 0" in last frame */ + || ( hCPE->element_mode == IVAS_CPE_DFT && hCPE->nchan_out == 1 && hCPE->hStereoDft->hConfig->res_cod_mode == STEREO_DFT_RES_COD_OFF ) ) + { + use_cldfb_for_last_dft = 1; + } + + dft_mono_brate_switch = 0; + if ( hCPE->element_mode == IVAS_CPE_DFT && ( hCPE->last_element_mode == IVAS_CPE_DFT || hCPE->last_element_mode == IVAS_CPE_MDCT ) && hCPE->nchan_out == 1 && hCPE->element_brate != hCPE->last_element_brate ) + { + if ( hCPE->last_element_brate >= IVAS_32k && hCPE->hStereoDft->hConfig->res_cod_mode == STEREO_DFT_RES_COD_OFF ) + { + dft_mono_brate_switch = -1; /* switch from residual coding mode or MDCT Stereo */ + } + else if ( hCPE->last_element_brate <= IVAS_24k4 && hCPE->hStereoDft->hConfig->res_cod_mode > STEREO_DFT_RES_COD_OFF ) + { + dft_mono_brate_switch = 1; /* switch to residual coding mode*/ + } + } + + if ( use_cldfb_for_last_dft ) + { + if ( hCPE->element_mode == IVAS_CPE_DFT && hCPE->last_element_mode == IVAS_CPE_TD && ( ivas_total_brate > IVAS_SID_5k2 || hCPE->nchan_out == 2 ) ) + { + stereo_tca_scale_R_channel( hCPE, output[0], output_frame ); + } + } + + /* set delays */ + delay_comp_DFT = NS2SA( output_Fs, IVAS_DEC_DELAY_NS - STEREO_DFT32MS_OVL_NS ); + delay_comp_TD = NS2SA( output_Fs, IVAS_DEC_DELAY_NS - DELAY_CLDFB_NS ); + delay_diff = delay_comp_TD - delay_comp_DFT; + + dft32ms_ovl = (int16_t) ( ( STEREO_DFT32MS_OVL_MAX * output_Fs ) / 48000 ); + delay_cldfb = NS2SA( output_Fs, DELAY_CLDFB_NS ); + + /* initialize pointers */ + if ( hCPE->element_mode >= IVAS_CPE_DFT && hCPE->output_mem[0] != NULL ) + { + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + p_output_mem[n] = hCPE->output_mem[n]; + } + } + + /*----------------------------------------------------------------* + * DFT stereo synchro + *----------------------------------------------------------------*/ + + if ( hCPE->element_mode == IVAS_CPE_DFT || sba_dirac_stereo_flag ) + { + /* handling of bitrate switching from residual (using DFT) to non-residual mode (using CLDFB) for mono output - as in DFT->TD switching */ + if ( dft_mono_brate_switch == -1 ) + { + for ( i = delay_comp_DFT; i < delay_comp_TD; i++ ) + { + sts[0]->prev_synth_buffer[i] = p_output_mem[0][i - delay_comp_DFT]; + } + + for ( i = delay_comp_TD; i < delay_comp_TD + delay_cldfb; i++ ) + { + tmp_out[0][i - delay_comp_TD] = p_output_mem[0][i - delay_comp_DFT]; + } + } + + if ( hCPE->nchan_out == 1 && hCPE->last_element_mode == IVAS_CPE_MDCT ) + { + v_add( sts[0]->prev_synth_buffer, sts[1]->prev_synth_buffer, sts[0]->prev_synth_buffer, delay_comp_DFT ); + v_multc( sts[0]->prev_synth_buffer, INV_SQRT_2, sts[0]->prev_synth_buffer, delay_comp_DFT ); + } + + if ( use_cldfb_for_last_dft ) + { + /* delay CLDFB-based mono output (<= 24.4 kbps) to be aligned with DFT-based mono output (32 kbps), needed to avoid discontinuities with TCX-LTP. */ + mvr2r( sts[0]->prev_synth_buffer + delay_comp_DFT, hCPE->hCoreCoder[0]->hTcxDec->FBTCXdelayBuf, delay_diff ); + delay_signal( output[0], output_frame, hCPE->hCoreCoder[0]->hTcxDec->FBTCXdelayBuf, delay_diff ); + } + + if ( hCPE->element_mode != IVAS_CPE_MDCT ) + { + ivas_post_proc( NULL, hCPE, 0, output[0], output, output_frame, sba_dirac_stereo_flag ); + } + + /* zero padding in order to synchronize the upmixed DFT stereo synthesis with the TD/MDCT stereo synthesis */ + for ( n = 0; n < hCPE->nchan_out; n++ ) + { + if ( sba_dirac_stereo_flag ) + { + delay_signal( output[n], output_frame, hCPE->prev_synth[n], delay_comp_DFT ); + } + else + { + delay_signal( output[n], output_frame, sts[n]->prev_synth_buffer, delay_comp_DFT ); + } + } + + if ( use_cldfb_for_last_dft ) + { + mvr2r( hCPE->hCoreCoder[0]->hTcxDec->FBTCXdelayBuf, sts[0]->prev_synth_buffer + delay_comp_DFT, delay_diff ); + } + + /* handling of TD->DFT switching */ + for ( n = 0; n < hCPE->nchan_out; n++ ) + { + if ( ( hCPE->last_element_mode != IVAS_CPE_DFT && !sba_dirac_stereo_flag && dft_mono_brate_switch != -1 ) || dft_mono_brate_switch == 1 ) + { + float *pPrev_synth; + float inv_fade_len = 1.f / delay_diff; + + /* cross-fading between TD synchro memory and the DFT output */ + if ( sba_dirac_stereo_flag ) + { + pPrev_synth = hCPE->prev_synth[n]; + } + else + { + pPrev_synth = sts[n]->prev_synth_buffer; + } + + if ( hCPE->last_element_mode != IVAS_CPE_MDCT ) + { + for ( i = delay_comp_DFT; i < delay_comp_TD; i++ ) + { + output[n][i] = ( pPrev_synth[i] * ( delay_comp_TD - i ) + output[n][i] * ( i - delay_comp_DFT ) ) * inv_fade_len; + } + } + } + else if ( dft_mono_brate_switch == -1 ) + { + float inv_fade_len_1 = 1.0f / (float) delay_diff; + float inv_fade_len_2 = 1.0f / (float) delay_cldfb; + + for ( i = 0; i < delay_diff; i++ ) + { + output[0][i + delay_comp_DFT] = ( output[0][i + delay_comp_DFT] * ( delay_diff - i ) + p_output_mem[0][i] * i ) * inv_fade_len_1; + } + + for ( i = 0; i < delay_cldfb; i++ ) + { + output[0][i + delay_comp_TD] = ( tmp_out[0][i] * ( delay_cldfb - i ) + output[0][i + delay_comp_TD] * i ) * inv_fade_len_2; + } + } + } + } + + /*----------------------------------------------------------------* + * TD/MDCT stereo synchro + *----------------------------------------------------------------*/ + + if ( sba_dirac_stereo_flag ) + { + return; + } + + if ( hCPE->element_mode == IVAS_CPE_TD || hCPE->element_mode == IVAS_CPE_MDCT ) + { + /* handling of DFT->TD switching */ + if ( hCPE->last_element_mode == IVAS_CPE_DFT && !use_cldfb_for_last_dft && hCPE->output_mem[0] != NULL ) + { + /* use redressed DFT stereo OLA part to reconstruct the TD stereo synchro memory */ + for ( n = 0; n < hCPE->nchan_out; n++ ) + { + for ( i = delay_comp_DFT; i < delay_comp_TD; i++ ) + { + sts[n]->prev_synth_buffer[i] = p_output_mem[n][i - delay_comp_DFT]; + } + + for ( i = delay_comp_TD; i < delay_comp_TD + delay_cldfb; i++ ) + { + tmp_out[n][i - delay_comp_TD] = p_output_mem[n][i - delay_comp_DFT]; + } + } + } + + /* if previous frame had only one channel copy buffers to other channel */ + if ( hCPE->nchan_out == 1 && hCPE->element_mode == IVAS_CPE_MDCT && hCPE->last_element_mode == IVAS_CPE_DFT ) + { + mvr2r( sts[0]->prev_synth_buffer, sts[1]->prev_synth_buffer, delay_comp_TD ); + mvr2r( tmp_out[0], tmp_out[1], delay_cldfb ); + mvr2r( p_output_mem[0], p_output_mem[1], delay_diff ); + } + + /*----------------------------------------------------------------* + * update DFT synthesis overlap memory @output_Fs; needed for TD->DFT stereo switching + *----------------------------------------------------------------*/ + + /* resample LB synthesis to output_Fs */ + if ( hCPE->element_mode != IVAS_CPE_MDCT && !use_cldfb_for_last_dft ) + { + for ( n = 0; n < hCPE->nchan_out; n++ ) + { + if ( sts[n]->core == ACELP_CORE ) + { + lerp( hCPE->input_mem_LB[n], tmp_out_TD[n], dft32ms_ovl, NS2SA( sts[n]->L_frame * FRAMES_PER_SEC, STEREO_DFT32MS_OVL_NS ) ); + } + else /* TCX/HQ core */ + { + lerp( hCPE->input_mem_LB[n], tmp_out_TD[n], dft32ms_ovl, NS2SA( sts[n]->L_frame * FRAMES_PER_SEC, STEREO_DFT32MS_OVL_NS ) ); + + /* use TCX synchro memory (perfect signal is available) */ + for ( i = delay_diff; i < dft32ms_ovl; i++ ) + { + tmp_out_TD[n][i] = sts[n]->delay_buf_out[i - delay_diff]; + } + } + } + + if ( hCPE->nchan_out == CPE_CHANNELS ) + { + /* upmix the resampled LB / the TCX synchro memory */ + tdm_upmix_plain( tmp_out_TD2[0], tmp_out_TD2[1], tmp_out_TD[0], tmp_out_TD[1], tdm_ratio_tabl[hCPE->hStereoTD->tdm_last_ratio_idx], tdm_den_ratio_tabl[hCPE->hStereoTD->tdm_last_ratio_idx], 0, dft32ms_ovl, 1 ); + } + else + { + mvr2r( tmp_out_TD[0], tmp_out_TD2[0], dft32ms_ovl ); + } + + for ( n = 0; n < hCPE->nchan_out; n++ ) + { + if ( sts[0]->core == ACELP_CORE ) /* ACELP core in primary channel */ + { + tmpF = 1.0f / (float) delay_diff; + + /* cross-fading between regular output synthesis and lerp() resampled synthesis in 3.125 - 1.25 ms OLA part */ + for ( i = 0; i < delay_diff; i++ ) + { + p_output_mem[n][i] = ( output[n][output_frame - dft32ms_ovl + delay_cldfb + i] * ( delay_diff - i ) + tmp_out_TD2[n][i] * i ) * tmpF; + } + } + else /* TCX core */ + { + /* reconstruct the 3.125 - 1.25 ms OLA part */ + for ( i = 0; i < delay_diff; i++ ) + { + p_output_mem[n][i] = output[n][output_frame - dft32ms_ovl + delay_cldfb + i]; + } + } + + /* reconstruct the last 1.25 ms part of OLA window */ + for ( i = delay_diff; i < dft32ms_ovl; i++ ) + { + p_output_mem[n][i] = tmp_out_TD2[n][i]; + } + } + } + + /*----------------------------------------------------------------* + * zero padding TD/MDCT synthesis in order to synchronize + * the upmixed TD/MDCT stereo synthesis with the DFT stereo synthesis + *----------------------------------------------------------------*/ + + if ( hCPE->element_mode == IVAS_CPE_TD && hCPE->stereo_switching_counter == 0 && hCPE->nchan_out == 1 && hCPE->last_element_brate <= IVAS_24k4 ) + { + float step; + tmpF = 1.0f; + step = 0.5f / delay_comp_TD; + + /* for the first switching frame from DFT to TD, downmix memory too */ + for ( n = 0; n < delay_comp_TD; n++ ) + { + sts[0]->prev_synth_buffer[n] = ( sts[0]->prev_synth_buffer[n] ) * tmpF; + tmpF -= step; + } + } + + nChannels = ( hCPE->element_mode == IVAS_CPE_MDCT ) ? 2 : hCPE->nchan_out; + for ( n = 0; n < nChannels; n++ ) + { + if ( hCPE->element_mode == IVAS_CPE_MDCT ) + { + mvr2r( sts[n]->prev_synth_buffer + delay_comp_DFT, hCPE->hCoreCoder[n]->hTcxDec->FBTCXdelayBuf, delay_diff ); + delay_signal( output[n], output_frame, hCPE->hCoreCoder[n]->hTcxDec->FBTCXdelayBuf, delay_diff ); + ivas_post_proc( NULL, hCPE, n, output[n], output, output_frame, 0 ); + delay_signal( output[n], output_frame, sts[n]->prev_synth_buffer, delay_comp_DFT ); + mvr2r( hCPE->hCoreCoder[n]->hTcxDec->FBTCXdelayBuf, sts[n]->prev_synth_buffer + delay_comp_DFT, delay_diff ); + } + else + { + delay_signal( output[n], output_frame, sts[n]->prev_synth_buffer, delay_comp_TD ); + } + } + + /* handling of DFT->TD switching */ + if ( hCPE->last_element_mode == IVAS_CPE_DFT && !use_cldfb_for_last_dft ) + { + if ( hCPE->element_mode == IVAS_CPE_TD && hCPE->hStereoCng->prev_sid_nodata ) + { + for ( n = 0; n < hCPE->nchan_out; n++ ) + { + tmpF = 1.0f / (float) delay_cldfb; + + for ( i = 0; i < delay_cldfb; i++ ) + { + tmp_out[n][i] = tmp_out[n][i] * ( delay_cldfb - i ) * tmpF; + } + } + } + + /* cross-fading between DFT OLA memory and TD output */ + for ( n = 0; n < nChannels; n++ ) + { + if ( hCPE->element_mode == IVAS_CPE_MDCT ) + { + tmpF = 1.0f / (float) delay_diff; + + for ( i = 0; i < delay_diff; i++ ) + { + output[n][i + delay_comp_DFT] = ( output[n][i + delay_comp_DFT] * ( delay_diff - i ) + p_output_mem[n][i] * i ) * tmpF; + } + } + + tmpF = 1.0f / (float) delay_cldfb; + + for ( i = 0; i < delay_cldfb; i++ ) + { + output[n][i + delay_comp_TD] = ( tmp_out[n][i] * ( delay_cldfb - i ) + output[n][i + delay_comp_TD] * i ) * tmpF; + } + } + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * Function stereo_switching_dec() + * + * Handling of memories in case of CPE modes switching + *-------------------------------------------------------------------*/ + +void stereo_switching_dec( + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + const int32_t ivas_total_brate /* i : IVAS total bitrate */ +) +{ + int16_t i, n; + int16_t dft32ms_ovl; + Decoder_State **sts; + float tmpF; + int16_t delay_comp_TD; + + sts = hCPE->hCoreCoder; + + delay_comp_TD = NS2SA( sts[0]->output_Fs, IVAS_DEC_DELAY_NS - DELAY_CLDFB_NS ); + + /* prevent CPE mode switching in the first received frame */ + if ( sts[0]->ini_frame == 0 ) + { + hCPE->last_element_mode = hCPE->element_mode; + hCPE->stereo_switching_counter = 10; + hCPE->NbFrameMod = 7; + hCPE->lt_es_em = 0.0f; + } + + if ( hCPE->element_mode == hCPE->last_element_mode ) + { + hCPE->stereo_switching_counter++; + hCPE->stereo_switching_counter = min( 10, hCPE->stereo_switching_counter ); + } + else + { + hCPE->stereo_switching_counter = 0; + } + + if ( hCPE->element_mode == IVAS_CPE_DFT && hCPE->nchan_out == 1 && hCPE->element_brate >= IVAS_32k && hCPE->last_element_brate <= IVAS_24k4 ) + { + dft32ms_ovl = (int16_t) ( ( STEREO_DFT32MS_OVL_MAX * sts[0]->output_Fs ) / 48000 ); + set_zero( hCPE->output_mem[0], dft32ms_ovl ); + } + + if ( hCPE->element_mode == IVAS_CPE_DFT && hCPE->last_element_mode != IVAS_CPE_DFT && hCPE->hCoreCoder[0]->ini_frame > 0 ) + { + /* windowing the OLA memory */ + dft32ms_ovl = (int16_t) ( ( STEREO_DFT32MS_OVL_MAX * sts[0]->output_Fs ) / 48000 ); + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + if ( hCPE->last_element_mode == IVAS_CPE_MDCT ) + { + /* copy memories from previous MDCT Stereo frame to output_mem */ + mvr2r( hCPE->input_mem[n], hCPE->output_mem[n], dft32ms_ovl ); + } + + if ( ivas_total_brate > IVAS_SID_5k2 || n == 0 || hCPE->last_element_mode != IVAS_CPE_TD || hCPE->nchan_out == 1 ) + { + for ( i = 0; i < dft32ms_ovl; i++ ) + { + hCPE->output_mem[n][i] *= hCPE->hStereoDft->win32ms[STEREO_DFT32MS_STEP * ( dft32ms_ovl - 1 - i )]; + } + } + else + { + tmpF = 1.0f / hCPE->hStereoTCA->prevTargetGain; + for ( i = 0; i < dft32ms_ovl; i++ ) + { + hCPE->output_mem[n][i] *= tmpF * hCPE->hStereoDft->win32ms[STEREO_DFT32MS_STEP * ( dft32ms_ovl - 1 - i )]; + } + for ( i = 0; i < delay_comp_TD; i++ ) + { + hCPE->hCoreCoder[1]->prev_synth_buffer[i] *= tmpF; + } + for ( i = 0; i < L_DEC_MEM_LEN_ICA; i++ ) + { + hCPE->hStereoTCA->memChanR[i] *= tmpF; + } + } + } + + if ( hCPE->last_element_mode == IVAS_CPE_MDCT ) + { + /* create passive downmix of MDCT Stereo memories for DFT input memory */ + v_add( hCPE->input_mem_LB[0], hCPE->input_mem_LB[1], hCPE->input_mem_LB[0], STEREO_DFT32MS_OVL_16k ); + v_multc( hCPE->input_mem_LB[0], 0.5f, hCPE->input_mem_LB[0], STEREO_DFT32MS_OVL_16k ); + + v_add( hCPE->input_mem[0], hCPE->input_mem[1], hCPE->input_mem[0], dft32ms_ovl ); + v_multc( hCPE->input_mem[0], 0.5f, hCPE->input_mem[0], dft32ms_ovl ); + + if ( hCPE->nchan_out == 1 ) + { + v_add( hCPE->output_mem[0], hCPE->output_mem[1], hCPE->output_mem[0], dft32ms_ovl ); + v_multc( hCPE->output_mem[0], INV_SQRT_2, hCPE->output_mem[0], dft32ms_ovl ); + } + } + + /* Update the side_gain[] parameters */ + if ( hCPE->last_element_mode != IVAS_CPE_MDCT ) + { + tmpF = 0; + if ( hCPE->hStereoTCA != NULL ) + { + tmpF = usdequant( hCPE->hStereoTCA->indx_ica_gD, STEREO_TCA_GDMIN, STEREO_TCA_GDSTEP ); + } + + set_f( hCPE->hStereoDft->side_gain + STEREO_DFT_NBDIV * STEREO_DFT_BAND_MAX, tmpF, STEREO_DFT_BAND_MAX ); + } + + /* reset residual coding / ESF (secondary channel) */ + set_zero( hCPE->hStereoDft->res_cod_mem, STEREO_DFT_OVL_8k ); + set_zero( hCPE->input_mem[1], NS2SA( sts[0]->output_Fs, STEREO_DFT32MS_OVL_NS ) ); + } + + if ( hCPE->element_mode == IVAS_CPE_TD && hCPE->last_element_mode != IVAS_CPE_TD && hCPE->hCoreCoder[0]->ini_frame > 0 ) + { + hCPE->hStereoTD->tdm_last_ratio_idx = LRTD_STEREO_MID_IS_PRIM; + hCPE->hStereoTD->tdm_last_SM_flag = 0; + hCPE->hStereoTD->tdm_prev_last_SM_flag = 0; + + /* First frame after DFT frame AND the content is uncorrelated or xtalk -> the primary channel is forced to left */ + if ( hCPE->hStereoTD->tdm_LRTD_flag == 1 ) + { + hCPE->hStereoTD->tdm_last_ratio_idx = LRTD_STEREO_LEFT_IS_PRIM; + } + } + + /* no secondary channel in the previous frame -> memory resets */ + if ( hCPE->element_mode > IVAS_CPE_DFT && hCPE->last_element_mode == IVAS_CPE_DFT ) + { + if ( hCPE->last_element_brate <= IVAS_SID_5k2 && hCPE->nchan_out == 2 ) + { + /* reset CLDFB memories */ + cldfb_reset_memory( sts[0]->cldfbAna ); + cldfb_reset_memory( sts[0]->cldfbBPF ); + cldfb_reset_memory( sts[0]->cldfbSyn ); + + sts[0]->mem_deemph = 0; + + sts[0]->tilt_code = 0.0f; + sts[0]->gc_threshold = 0.0f; + + set_f( sts[0]->mem_syn1, 0, M ); + set_f( sts[0]->mem_syn2, 0, M ); + set_f( sts[0]->mem_syn3, 0, M ); + set_f( sts[0]->mem_syn_r, 0.0f, L_SYN_MEM ); + + sts[1]->last_L_frame = sts[0]->last_L_frame; + + /* reset PCh memories */ + set_f( sts[0]->old_exc, 0, L_EXC_MEM_DEC ); + set_f( sts[0]->lsf_old, 0, M ); + set_f( sts[0]->lsp_old, 0, M ); + } + sts[1]->last_extl = -1; + + sts[1]->prev_bfi = sts[0]->prev_bfi; + + set_f( sts[1]->old_pitch_buf, (float) L_SUBFR, 2 * NB_SUBFR16k ); + sts[1]->old_fpitchFB = 2 * (float) L_SUBFR; + + /* reset CLDFB memories */ + cldfb_reset_memory( sts[1]->cldfbAna ); + cldfb_reset_memory( sts[1]->cldfbBPF ); + cldfb_reset_memory( sts[1]->cldfbSyn ); + + sts[1]->mem_deemph = 0; + + sts[1]->tilt_code = 0.0f; + sts[1]->gc_threshold = 0.0f; + + set_f( sts[1]->mem_syn1, 0, M ); + set_f( sts[1]->mem_syn2, 0, M ); + set_f( sts[1]->mem_syn3, 0, M ); + set_f( sts[1]->mem_syn_r, 0.0f, L_SYN_MEM ); + + sts[1]->last_L_frame = sts[0]->last_L_frame; + + /* populate PCh memories into the SCh */ + mvr2r( sts[0]->old_exc, sts[1]->old_exc, L_EXC_MEM_DEC ); + mvr2r( sts[0]->lsf_old, sts[1]->lsf_old, M ); + mvr2r( sts[0]->lsp_old, sts[1]->lsp_old, M ); + if ( hCPE->element_mode == IVAS_CPE_MDCT ) + { + sts[1]->last_core = sts[0]->last_core; + sts[1]->last_coder_type = sts[0]->last_coder_type; + + mvr2r( sts[0]->hHQ_core->old_out, sts[1]->hHQ_core->old_out, L_FRAME48k ); + mvr2r( sts[0]->delay_buf_out, sts[1]->delay_buf_out, HQ_DELTA_MAX * HQ_DELAY_COMP ); + mvr2r( sts[0]->hTcxDec->old_syn_Overl, sts[1]->hTcxDec->old_syn_Overl, 256 ); + } + } + else if ( hCPE->element_mode == IVAS_CPE_TD && hCPE->last_element_mode == IVAS_CPE_MDCT ) + { + set_f( sts[0]->old_exc, 0.0f, L_EXC_MEM_DEC ); + set_f( sts[1]->old_exc, 0.0f, L_EXC_MEM_DEC ); + } + + /* TD/DFT -> MDCT stereo switching (there is no TCX in the TD stereo secondary channel, or DFT stereo) */ + if ( hCPE->element_mode == IVAS_CPE_MDCT && hCPE->last_element_mode != IVAS_CPE_MDCT ) + { + sts[1]->hTcxCfg->last_aldo = sts[0]->hTcxCfg->last_aldo; + sts[1]->hTcxCfg->tcx_curr_overlap_mode = sts[0]->hTcxCfg->tcx_curr_overlap_mode; + sts[1]->fscale = sts[0]->fscale; + sts[1]->hTcxCfg->tcx_mdct_window_length = sts[0]->hTcxCfg->tcx_mdct_window_length; + sts[1]->pit_res_max = sts[0]->pit_res_max; + sts[1]->pit_res_max_past = sts[0]->pit_res_max_past; + sts[1]->hTcxDec->L_frameTCX = sts[0]->hTcxDec->L_frameTCX; + sts[1]->hTcxDec->conceal_eof_gain = sts[0]->hTcxDec->conceal_eof_gain; + } + + return; +} + + +/*-------------------------------------------------------------------* + * Function stereo_td2dft_update() + * + * update OLA buffers - needed for switching from TD stereo to DFT stereo + *-------------------------------------------------------------------*/ + +void stereo_td2dft_update( + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + const int16_t n, /* i : channel number */ + float output[], /* i/o: synthesis @internal Fs */ + float synth[], /* i/o: synthesis @output Fs */ + float hb_synth[], /* i/o: hb synthesis */ + const int16_t output_frame /* i : frame length */ +) +{ + int16_t ovl, ovl_TCX, dft32ms_ovl, hq_delay_comp; + int16_t ns, nsLB; + int16_t old_out_len, old_outLB_len; + Decoder_State **sts; + + if ( hCPE == NULL ) + { + return; + } + + /* initialization */ + sts = hCPE->hCoreCoder; + ovl = NS2SA( sts[n]->L_frame * FRAMES_PER_SEC, STEREO_DFT32MS_OVL_NS ); + dft32ms_ovl = (int16_t) ( ( STEREO_DFT32MS_OVL_MAX * sts[0]->output_Fs ) / 48000 ); + hq_delay_comp = NS2SA( sts[0]->output_Fs, DELAY_CLDFB_NS ); + + if ( hCPE->element_mode >= IVAS_CPE_DFT && hCPE->element_mode != IVAS_CPE_MDCT ) + { + if ( sts[n]->core == ACELP_CORE ) + { + if ( n == 0 ) + { + /* update DFT analysis overlap memory @internal_fs: core synthesis */ + mvr2r( output + sts[n]->L_frame - ovl, hCPE->input_mem_LB[n], ovl ); + + /* update DFT analysis overlap memory @internal_fs: BPF */ + if ( sts[n]->p_bpf_noise_buf ) + { + mvr2r( sts[n]->p_bpf_noise_buf + sts[n]->L_frame - ovl, hCPE->input_mem_BPF[n], ovl ); + } + + /* update DFT analysis overlap memory @output_Fs: BWE */ + if ( sts[n]->extl != -1 || ( sts[n]->bws_cnt > 0 && sts[n]->core == ACELP_CORE ) ) + { + mvr2r( hb_synth + output_frame - dft32ms_ovl, hCPE->input_mem[n], dft32ms_ovl ); + } + } + else + { + /* update DFT analysis overlap memory @internal_fs: core synthesis, secondary channel */ + mvr2r( output + sts[n]->L_frame - ovl, hCPE->input_mem_LB[n], ovl ); + } + } + else /* TCX core */ + { + /* LB-TCX synthesis */ + mvr2r( output + sts[n]->L_frame - ovl, hCPE->input_mem_LB[n], ovl ); + + /* BPF */ + if ( n == 0 && sts[n]->p_bpf_noise_buf ) + { + mvr2r( sts[n]->p_bpf_noise_buf + sts[n]->L_frame - ovl, hCPE->input_mem_BPF[n], ovl ); + } + + /* TCX synthesis (it was already delayed in TD stereo in core_switching_post_dec()) */ + if ( sts[n]->hTcxDec != NULL ) + { + ovl_TCX = NS2SA( sts[n]->hTcxDec->L_frameTCX * FRAMES_PER_SEC, STEREO_DFT32MS_OVL_NS ); + mvr2r( synth + sts[n]->hTcxDec->L_frameTCX + hq_delay_comp - ovl_TCX, hCPE->input_mem[n], ovl_TCX - hq_delay_comp ); + mvr2r( sts[n]->delay_buf_out, hCPE->input_mem[n] + ovl_TCX - hq_delay_comp, hq_delay_comp ); + } + } + } + else if ( hCPE->element_mode == IVAS_CPE_MDCT && hCPE->input_mem[0] != NULL ) + { + + /* update DFT stereo OLA memories */ + /*set_zero( hCPE->input_mem_LB[n], STEREO_DFT32MS_OVL_16k );*/ + lerp( output + sts[n]->L_frame - ovl, hCPE->input_mem_LB[n], STEREO_DFT32MS_OVL_16k, ovl ); + + + /* TCX synthesis (it was already delayed in TD stereo in core_switching_post_dec()) */ + if ( sts[n]->hTcxDec != NULL ) + { + ovl_TCX = NS2SA( sts[n]->hTcxDec->L_frameTCX * FRAMES_PER_SEC, STEREO_DFT32MS_OVL_NS ); + mvr2r( synth + sts[n]->hTcxDec->L_frameTCX + hq_delay_comp - ovl_TCX, hCPE->input_mem[n], ovl_TCX - hq_delay_comp ); + mvr2r( sts[n]->delay_buf_out, hCPE->input_mem[n] + ovl_TCX - hq_delay_comp, hq_delay_comp ); + } + + if ( n == 1 ) + { + nsLB = NS2SA( sts[n]->L_frame * FRAMES_PER_SEC, N_ZERO_MDCT_NS ); + ns = NS2SA( sts[n]->output_Fs, N_ZERO_MDCT_NS ); + old_outLB_len = (int16_t) ( ( 3 * STEREO_MDCT2DFT_FADE_LEN_48k * sts[0]->L_frame * FRAMES_PER_SEC ) / 48000 ); + old_out_len = (int16_t) ( ( STEREO_MDCT2DFT_FADE_LEN_48k * sts[0]->output_Fs ) / 48000 ); + + /* update buffers used for fading when switching to DFT Stereo */ + v_add( sts[0]->hHQ_core->old_outLB + nsLB, sts[1]->hHQ_core->old_outLB + nsLB, hCPE->old_outLB_mdct, old_outLB_len ); + lerp( hCPE->old_outLB_mdct, hCPE->old_outLB_mdct, STEREO_MDCT2DFT_FADE_LEN_48k, old_outLB_len ); + v_multc( hCPE->old_outLB_mdct, 0.5f, hCPE->old_outLB_mdct, STEREO_MDCT2DFT_FADE_LEN_48k ); + + v_add( sts[0]->hHQ_core->old_out + ns, sts[1]->hHQ_core->old_out + ns, hCPE->old_out_mdct, old_out_len ); + v_multc( hCPE->old_out_mdct, 0.5f, hCPE->old_out_mdct, old_out_len ); + } + + if ( n == 0 ) + { + set_zero( hCPE->input_mem_BPF[n], STEREO_DFT32MS_OVL_16k ); + } + } + + /* update ovl buffer for possible switching from TD stereo SCh ACELP frame to MDCT stereo TCX frame */ + if ( hCPE->element_mode == IVAS_CPE_TD && n == 1 && sts[n]->hTcxDec == NULL ) + { + mvr2r( output + sts[n]->L_frame / 2, hCPE->hStereoTD->TCX_old_syn_Overl, sts[n]->L_frame / 2 ); + } + + return; +} + + +/*-------------------------------------------------------------------* + * Function stereo_mdct2dft_update() + * + * update OLA buffers - needed for switching from MDCT stereo to DFT stereo + *-------------------------------------------------------------------*/ + +void stereo_mdct2dft_update( + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + float output0[], /* i/o: synthesis @internal Fs, ch0 */ + float synth0[] /* i/o: synthesis @output Fs, ch0 */ +) +{ + int16_t i; + int16_t fade_len, fade_len_LB; + float tmpF; + Decoder_State *st; + + if ( hCPE == NULL ) + { + return; + } + + st = hCPE->hCoreCoder[0]; + + fade_len = (int16_t) ( ( STEREO_MDCT2DFT_FADE_LEN_48k * st->output_Fs ) / 48000 ); + fade_len_LB = (int16_t) ( 3 * ( STEREO_MDCT2DFT_FADE_LEN_48k * st->L_frame * FRAMES_PER_SEC ) / 48000 ); + + tmpF = 1.f / fade_len; + for ( i = 0; i < fade_len; i++ ) + { + synth0[i] = ( hCPE->old_out_mdct[i] * ( fade_len - i ) + synth0[i] * i ) * tmpF; + } + + tmpF = 1.f / fade_len_LB; + for ( i = 0; i < fade_len_LB; i++ ) + { + output0[i] = ( hCPE->old_outLB_mdct[i] * ( fade_len_LB - i ) + output0[i] * i ) * tmpF; + } + + return; +} + + +static float ncross_corr_self( + float *signal, + const int16_t x, + const int16_t y, + const int16_t corr_len, + const int16_t subsampling ) +{ + float c_c; + float energy_xy, energy_x, energy_y; + uint16_t j; + float *signal_a, *signal_b; + + c_c = 0.0f; + energy_x = 0.0f; + energy_y = 0.0f; + signal_a = &signal[x]; + signal_b = &signal[y]; + + for ( j = 0; j < corr_len; j += subsampling ) + { + c_c += ( signal_a[j] * signal_b[j] ); + energy_x += ( signal_a[j] ) * ( signal_a[j] ); + energy_y += ( signal_b[j] ) * ( signal_b[j] ); + } + + energy_xy = sqrtf( energy_x * energy_y ); + + if ( energy_xy < 1.0f ) + { + energy_xy = 1.0f; /* conceal silent frames */ + } + c_c = c_c / energy_xy; + + return c_c; +} + + +/*-------------------------------------------------------------------* + * Function smooth_dft2td_transition() + * + * apply smoothing to avoid discontinuities and energy variation when + * switching from DFT stereo to TD stereo + *-------------------------------------------------------------------*/ + +void smooth_dft2td_transition( + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + float *output[CPE_CHANNELS], /* i/o: synthesis @external Fs */ + const int16_t output_frame /* i : output frame lenght */ +) +{ + Decoder_State **sts; + int16_t ipit, i, ipit_max, ipit_min, idiff, ilen, j, ch, lsearch, corr_len, subsampl; + float flen, ftmp_corr, fmaxcorr, fac_fs; + float tmp_out[L_FRAME48k + L_FRAME48k / 2], tmp_out2[L_FRAME48k], *ptO2, *ptO, *pt1, *ptE; + + if ( hCPE == NULL ) + { + return; + } + + /* initialization */ + sts = hCPE->hCoreCoder; + + if ( ( hCPE->element_mode == IVAS_CPE_TD && ( hCPE->last_element_mode == IVAS_CPE_DFT || hCPE->last_element_mode == IVAS_CPE_MDCT ) && ( sts[0]->clas_dec == VOICED_CLAS && sts[0]->coder_type < TRANSITION && sts[0]->coder_type > UNVOICED && sts[0]->last_coder_type > UNVOICED && sts[1]->coder_type > UNVOICED ) ) ) + { + /* length of OVA */ + ilen = output_frame / 2; + + /* correlation length */ + corr_len = output_frame / 20; + subsampl = 4; + + for ( ch = 0; ch < hCPE->nchan_out; ch++ ) + { + /* core to external sampling frequency ratio */ + fac_fs = (float) output_frame / sts[ch]->L_frame; + + /* Find minimum and maximum pitch*/ + ipit_min = minimum( sts[ch]->old_pitch_buf + 4, 4, &flen ) + 4; + ipit_max = maximum( sts[ch]->old_pitch_buf + 4, 4, &flen ) + 4; + ipit_min = (short) ( sts[ch]->old_pitch_buf[ipit_min] * fac_fs + 0.5f ); + ipit_max = (short) ( sts[ch]->old_pitch_buf[ipit_max] * fac_fs + 0.5f ); + + if ( ( ipit_max + corr_len ) > ilen ) /*ensure the search is performed on the available memory*/ + { + continue; + } + + lsearch = ipit_max - ipit_min + corr_len; + lsearch = min( lsearch, output_frame / 4 ); + + /* ptr init for search of the best correlation in the past frame */ + ptE = hCPE->prev_synth_chs[ch] + output_frame - ipit_max - corr_len; + + idiff = 0; + fmaxcorr = -1.0f; + for ( i = 0; i < lsearch; i++ ) + { + ftmp_corr = ncross_corr_self( ptE, i, ipit_max, corr_len, subsampl ); + if ( ftmp_corr > fmaxcorr ) + { + idiff = i; + } + fmaxcorr = max( fmaxcorr, ftmp_corr ); + } + + ipit = ipit_max - idiff; + + ptO = tmp_out + output_frame; + + /* If the correlation is too low, don't use the prediction */ + if ( fmaxcorr < DFT2TD_CORR_THRESH ) + { + mvr2r( &output[ch][0], ptO, ilen ); + } + else + { + mvr2r( hCPE->prev_synth_chs[ch], tmp_out, output_frame ); + pt1 = tmp_out + output_frame - ipit; + for ( i = 0; i < ilen; i++ ) + { + ptO[i] = pt1[i]; + } + } + + /* Set buffer for the reserved buffer of the current frame */ + ptO2 = tmp_out2 + output_frame - ilen; + set_f( tmp_out2 + output_frame - ilen, 0.0f, ilen ); + for ( i = 0; i < output_frame; i++ ) + { + tmp_out2[i] = output[ch][output_frame - 1 - i]; + } + /* ptr init for search of the best correlation of the current frame */ + ptE = ptO2 - ( ipit_max + corr_len ); + + idiff = 0; + fmaxcorr = -1.0f; + for ( i = 0; i < lsearch; i++ ) + { + ftmp_corr = ncross_corr_self( ptE, i, ipit_max, corr_len, subsampl ); + if ( ftmp_corr > fmaxcorr ) + { + idiff = i; + } + fmaxcorr = max( fmaxcorr, ftmp_corr ); + } + + ipit = ipit_max - idiff; + + /* If the correlation is too low, don't use the prediction */ + if ( fmaxcorr > DFT2TD_CORR_THRESH ) + { + pt1 = tmp_out2 + output_frame - ilen - ipit; + for ( i = 0; i < ilen; i++ ) + { + ptO2[i] = pt1[i]; + } + } + + /* perform OVA between predicted signals */ + flen = 1.0f / ilen; + + for ( i = 0; i < 4; i++ ) + { + output[ch][i] = ( ( ( 4.0f - i ) * output[ch][i] + i * ptO[i] ) * 0.25f * ( ilen - i ) + tmp_out2[output_frame - 1 - i] * i ) * flen; + } + for ( ; i < ilen - 4; i++ ) + { + output[ch][i] = ( ptO[i] * ( ilen - i ) + tmp_out2[output_frame - 1 - i] * i ) * flen; + } + j = 0; + for ( ; i < ilen; i++ ) + { + output[ch][i] = ( ptO[i] * ( ilen - i ) + ( ( 4.0f - j ) * tmp_out2[output_frame - 1 - i] + j * output[ch][i] ) * i * 0.25f ) * flen; + j++; + } + } + } + else if ( hCPE->element_mode == IVAS_CPE_DFT ) + { + /* Updates */ + for ( ch = 0; ch < hCPE->nchan_out; ch++ ) + { + mvr2r( output[ch], hCPE->prev_synth_chs[ch], output_frame ); + } + } + + return; +} diff --git a/lib_dec/ivas_stereo_td_dec.c b/lib_dec/ivas_stereo_td_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..f7a26cdef4b9d0fd3895bec66f52b61425a66a1d --- /dev/null +++ b/lib_dec/ivas_stereo_td_dec.c @@ -0,0 +1,559 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_rom_com.h" +#include "ivas_cnst.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * stereo_td_init_dec() + * + * Initialize TD stereo decoder + *-------------------------------------------------------------------*/ + +void stereo_td_init_dec( + STEREO_TD_DEC_DATA_HANDLE hStereoTD, /* i/o: TD stereo decoder handle */ + const int16_t last_element_mode /* i : last element mode */ +) +{ + hStereoTD->tdm_SM_flag = 0; + hStereoTD->tdm_last_SM_flag = 0; + hStereoTD->tdm_last_ratio_idx = LRTD_STEREO_MID_IS_PRIM; + hStereoTD->tdm_prev_last_SM_flag = 0; + hStereoTD->tdm_LRTD_flag = 0; + hStereoTD->prevSP_ratio = 0.5f; + hStereoTD->SP_ratio_LT = 0.0f; + hStereoTD->c_LR_LT = 0.5f; + + hStereoTD->flag_skip_DMX = 0; + + if ( last_element_mode == IVAS_CPE_MDCT ) + { + hStereoTD->tdm_last_ratio_idx = LRTD_STEREO_LEFT_IS_PRIM; + hStereoTD->tdm_LRTD_flag = 1; + } + + set_f( hStereoTD->TCX_old_syn_Overl, 0.0f, L_FRAME16k / 2 ); + + return; +} + + +/*-------------------------------------------------------------------* + * tdm_configure_dec() + * + * Configure TD stereo decoder + *-------------------------------------------------------------------*/ + +void tdm_configure_dec( + const int16_t ivas_format, /* i : IVAS format */ + const int16_t ism_mode, /* i : ISM mode in combined format */ + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + int16_t *tdm_ratio_idx, /* o : ratio index */ + const int16_t nb_bits_metadata /* i : number of metadata bits */ +) +{ + STEREO_TD_DEC_DATA_HANDLE hStereoTD; + Decoder_State **sts; + int16_t tdm_tmp_SM_LRTD_flag; + int16_t mod_ct, core, bits_offset; + int16_t idx_LRTD_pri_side, tdm_inst_ratio_idx; + int32_t element_brate_adapt; + int16_t bstr_last_pos; + + hStereoTD = hCPE->hStereoTD; + sts = hCPE->hCoreCoder; + + element_brate_adapt = hCPE->element_brate + hCPE->brate_surplus; + bstr_last_pos = (int16_t) ( hCPE->element_brate / FRAMES_PER_SEC ) - nb_bits_metadata + (int16_t) ( hCPE->brate_surplus / FRAMES_PER_SEC ); + + /*----------------------------------------------------------------* + * Decode CoreCoder signaling + *----------------------------------------------------------------*/ + + /* temporarily decode PCh signaling */ + bits_offset = sts[0]->next_bit_pos; + core = get_indice_st( sts[0], hCPE->element_brate, bits_offset, 1 ); + bits_offset += 1; + + if ( core == ACELP_CORE && hCPE->element_brate < IVAS_24k4 ) + { + mod_ct = get_indice_st( sts[0], hCPE->element_brate, bits_offset, 3 ); + /* Only transition mode is important to decoder, otherwise mod_ct is set to AUDIO only to easy debugging if needed */ + if ( mod_ct != TRANSITION ) + { + mod_ct = AUDIO; + } + } + else /* core != ACELP_CORE */ + { + mod_ct = AUDIO; /* coder_type == VOICED || coder_type == GENERIC */ + } + + /* Get few parameters needed to decode the bitrate allocated to each channel */ + /* Get the coder_type of the secondary channel (last parameter on 2 bits) */ + sts[1]->coder_type = get_indice_st( sts[0], element_brate_adapt, bstr_last_pos - TDM_SECONDARY_SIGNALLING, TDM_SECONDARY_SIGNALLING ); + + /* Get the LRTD config flag: 1 = LRTD configuration, favor closer bitrate per channel; + 0 = Pri/Sec configuration, bitrates linked wrt. the mono */ + tdm_tmp_SM_LRTD_flag = sts[1]->coder_type & 0x1; + sts[1]->coder_type >>= 1; + hStereoTD->tdm_Pitch_reuse_flag = 0; + + if ( sts[1]->coder_type == 2 ) + { + sts[1]->coder_type = GENERIC; + } + else if ( sts[1]->coder_type == 3 ) + { + sts[1]->coder_type = AUDIO; + + if ( hCPE->element_brate <= IVAS_24k4 ) + { + hStereoTD->tdm_Pitch_reuse_flag = 1; + sts[1]->coder_type = GENERIC; + } + } + + /*----------------------------------------------------------------* + * Decode TDM parameters + *----------------------------------------------------------------*/ + + /* Get the correlation ratio */ + *tdm_ratio_idx = get_indice_st( sts[0], element_brate_adapt, (int16_t) ( bstr_last_pos - TDM_SECONDARY_SIGNALLING - TDM_RATIO_BITS ), TDM_RATIO_BITS ); + + hStereoTD->tdm_use_IAWB_Ave_lpc = 0; + if ( sts[1]->coder_type == INACTIVE ) + { + /* Get the flag on the LPC reusage type (primary channel of ave LPC */ + hStereoTD->tdm_use_IAWB_Ave_lpc = get_indice_st( sts[0], element_brate_adapt, bstr_last_pos - TDM_SECONDARY_SIGNALLING - TDM_RATIO_BITS - TDM_LP_REUSE_BITS, TDM_LP_REUSE_BITS ); + hStereoTD->tdm_lp_reuse_flag = 1; + } + else + { + /* Get the flag on the LPC reusage */ + hStereoTD->tdm_lp_reuse_flag = get_indice_st( sts[0], element_brate_adapt, bstr_last_pos - TDM_SECONDARY_SIGNALLING - TDM_RATIO_BITS - TDM_LP_REUSE_BITS, TDM_LP_REUSE_BITS ); + } + + sts[0]->tdm_LRTD_flag = hStereoTD->tdm_LRTD_flag; /* the flag was already read in function stereo_memory_dec() */ + sts[1]->tdm_LRTD_flag = hStereoTD->tdm_LRTD_flag; + + tdm_inst_ratio_idx = *tdm_ratio_idx; + + /* update past tdm_SM_flag */ + hStereoTD->tdm_prev_last_SM_flag = hStereoTD->tdm_last_SM_flag; + hStereoTD->tdm_last_SM_flag = hStereoTD->tdm_SM_flag; + + idx_LRTD_pri_side = -1; + if ( hStereoTD->tdm_LRTD_flag == 1 ) + { + idx_LRTD_pri_side = tdm_tmp_SM_LRTD_flag; + hStereoTD->tdm_SM_flag = 0; + if ( tdm_inst_ratio_idx == TDM_NQ ) + { + hStereoTD->flag_skip_DMX = 1; + } + else + { + hStereoTD->flag_skip_DMX = 0; + } + /* Set primary channel */ + *tdm_ratio_idx = LRTD_STEREO_RIGHT_IS_PRIM; + if ( idx_LRTD_pri_side == 1 ) + { + *tdm_ratio_idx = LRTD_STEREO_LEFT_IS_PRIM; + } + } + else + { + hStereoTD->tdm_SM_flag = tdm_tmp_SM_LRTD_flag; + if ( hCPE->nchan_out == 1 ) + { + /* in case of mono output, use exclusively the YX upmixing scheme in order to deal with NOOP signals */ + hStereoTD->tdm_SM_flag = 0; + } + } + + if ( sts[1]->coder_type == INACTIVE && ( *tdm_ratio_idx >= 29 || *tdm_ratio_idx <= 1 ) ) + { + hStereoTD->tdm_lp_reuse_flag = hStereoTD->tdm_use_IAWB_Ave_lpc; + hStereoTD->tdm_use_IAWB_Ave_lpc = 0; + } + + /*sts[1]->tdm_inst_ratio_idx = sts[0]->tdm_inst_ratio_idx;*/ + + if ( hCPE->nchan_out == 1 && hCPE->hStereoDftDmx != NULL ) + { + /* in mono DMX, only targetGain is needed */ + int16_t tmpS = 20; + if ( hStereoTD->tdm_LRTD_flag == 0 ) + { + tmpS = get_indice_st( sts[0], element_brate_adapt, bstr_last_pos - TDM_SIGNAL_BITS_READ_FROM_THE_END_OF_BS + STEREO_BITS_TCA_CHAN + STEREO_BITS_TCA_CORRSTATS, STEREO_BITS_TCA_GD ); + } + hCPE->hStereoDftDmx->targetGain = usdequant( tmpS, STEREO_TCA_GDMIN, STEREO_TCA_GDSTEP ); + hCPE->hStereoDftDmx->targetGain = powf( 10, hCPE->hStereoDftDmx->targetGain ); + } + else + { + if ( hStereoTD->tdm_LRTD_flag == 0 ) + { + hCPE->hStereoTCA->refChanIndx = get_indice_st( sts[0], element_brate_adapt, bstr_last_pos - TDM_SIGNAL_BITS_READ_FROM_THE_END_OF_BS, STEREO_BITS_TCA_CHAN ); + hCPE->hStereoTCA->indx_ica_NCShift = get_indice_st( sts[0], element_brate_adapt, bstr_last_pos - TDM_SIGNAL_BITS_READ_FROM_THE_END_OF_BS + STEREO_BITS_TCA_CHAN, STEREO_BITS_TCA_CORRSTATS ); + hCPE->hStereoTCA->indx_ica_gD = get_indice_st( sts[0], element_brate_adapt, bstr_last_pos - TDM_SIGNAL_BITS_READ_FROM_THE_END_OF_BS + STEREO_BITS_TCA_CHAN + STEREO_BITS_TCA_CORRSTATS, STEREO_BITS_TCA_GD ); + } + else + { + hCPE->hStereoTCA->refChanIndx = L_CH_INDX; + hCPE->hStereoTCA->indx_ica_NCShift = 0; + hCPE->hStereoTCA->indx_ica_gD = 20; + } + hCPE->hStereoTCA->targetGain = usdequant( hCPE->hStereoTCA->indx_ica_gD, STEREO_TCA_GDMIN, STEREO_TCA_GDSTEP ); + hCPE->hStereoTCA->targetGain = powf( 10, hCPE->hStereoTCA->targetGain ); + } + + + /* set the BW of the secondary channel */ + if ( hStereoTD->tdm_LRTD_flag && sts[1]->bits_frame_channel >= IVAS_16k4 / FRAMES_PER_SEC ) + { + /* set BW of the secondary channel in LRTD stereo mode as the BW of the primary channel at higher bitrates */ + sts[1]->bwidth = sts[0]->bwidth; + } + else + { + /* limit BW of the secondary channel in LRTD mode to WB for low bitrates */ + sts[1]->bwidth = WB; + } + + /*----------------------------------------------------------------* + * bitbudget distribution between channels (taking into account also metadata bitbudget) + *----------------------------------------------------------------*/ + + tdm_bit_alloc( ivas_format, ism_mode, hCPE->element_brate - nb_bits_metadata * FRAMES_PER_SEC + hCPE->brate_surplus, + hStereoTD->tdm_lp_reuse_flag, &( sts[0]->total_brate ), &( sts[1]->total_brate ), + &hStereoTD->tdm_low_rate_mode, sts[1]->coder_type, *tdm_ratio_idx, hStereoTD->tdm_Pitch_reuse_flag, + sts[0]->bwidth, sts[1]->bwidth, sts[0]->flag_ACELP16k, hStereoTD->tdm_LRTD_flag, mod_ct, tdm_inst_ratio_idx ); + + return; +} + + +/*-------------------------------------------------------------------* + * Function tdm_downmix_plain() + * + * downmix Left+Right to Primary+Secondary channel + *-------------------------------------------------------------------*/ + +void tdm_upmix_plain( + float Left[], /* o : left channel */ + float Right[], /* o : right channel */ + const float PCh_2_L[], /* i : primary channel */ + const float SCh_2_R[], /* i : secondary channel */ + const float LR_ratio, /* i : mixing ratio */ + const float inv_den_LR_ratio, /* i : inverse mixing ration */ + const int16_t start_index, /* i : start index */ + const int16_t end_index, /* i : end index */ + const int16_t plus_minus_flag /* i : plus/minus flag */ +) +{ + int16_t i; + + if ( plus_minus_flag == 1 ) + { + for ( i = start_index; i < end_index; i++ ) + { + Left[i] = ( LR_ratio * ( PCh_2_L[i] - SCh_2_R[i] ) + SCh_2_R[i] ) * inv_den_LR_ratio; + Right[i] = ( -LR_ratio * ( PCh_2_L[i] + SCh_2_R[i] ) + PCh_2_L[i] ) * inv_den_LR_ratio; + } + } + else + { + for ( i = start_index; i < end_index; i++ ) + { + Left[i] = ( LR_ratio * ( PCh_2_L[i] + SCh_2_R[i] ) - SCh_2_R[i] ) * inv_den_LR_ratio; + Right[i] = ( LR_ratio * ( PCh_2_L[i] - SCh_2_R[i] ) - PCh_2_L[i] ) * inv_den_LR_ratio; + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * Function tdm_downmix_fade() + * + * downmix Left+Right to Primary+Secondary channel with fade in/out + *-------------------------------------------------------------------*/ + +static void tdm_upmix_fade( + float Left[], /* o : left channel */ + float Right[], /* o : right channel */ + const float PCh_2_L[], /* i : primary channel */ + const float SCh_2_R[], /* i : secondary channel */ + const float LR_ratio_mem, /* i : last mixing ratio */ + const float inv_den_LR_ratio_mem, /* i : last inverse mixing ration */ + const float LR_ratio, /* i : mixing ratio */ + const float inv_den_LR_ratio, /* i : inverse mixing ration */ + const int16_t start_index, /* i : start index */ + const int16_t end_index, /* i : end index */ + const int16_t fading_type /* i : fading type */ +) +{ + int16_t i; + float step, step2, fade_in, fade_out; + + step = 1.0f / (float) ( end_index - start_index ); + fade_out = 1.0f; + fade_in = 0.0f; + + fade_out *= inv_den_LR_ratio_mem; + fade_in *= inv_den_LR_ratio; + step2 = step * inv_den_LR_ratio; + step *= inv_den_LR_ratio_mem; + + if ( fading_type == 0 ) /* Switching from YX scheme to SM scheme */ + { + for ( i = start_index; i < end_index; i++ ) + { + Left[i] = ( LR_ratio_mem * ( PCh_2_L[i] - SCh_2_R[i] ) + SCh_2_R[i] ) * fade_out + ( LR_ratio * ( PCh_2_L[i] + SCh_2_R[i] ) - SCh_2_R[i] ) * fade_in; + Right[i] = ( -LR_ratio_mem * ( PCh_2_L[i] + SCh_2_R[i] ) + PCh_2_L[i] ) * fade_out + ( LR_ratio * ( PCh_2_L[i] - SCh_2_R[i] ) - PCh_2_L[i] ) * fade_in; + fade_in += step2; + fade_out -= step; + } + } + else if ( fading_type == 1 ) /* SM scheme */ + { + for ( i = start_index; i < end_index; i++ ) + { + Left[i] = ( LR_ratio_mem * ( PCh_2_L[i] + SCh_2_R[i] ) - SCh_2_R[i] ) * fade_out + ( LR_ratio * ( PCh_2_L[i] + SCh_2_R[i] ) - SCh_2_R[i] ) * fade_in; + Right[i] = ( LR_ratio_mem * ( PCh_2_L[i] - SCh_2_R[i] ) - PCh_2_L[i] ) * fade_out + ( LR_ratio * ( PCh_2_L[i] - SCh_2_R[i] ) - PCh_2_L[i] ) * fade_in; + fade_in += step2; + fade_out -= step; + } + } + else if ( fading_type == 2 ) /* Switching from SM scheme to YX scheme */ + { + for ( i = start_index; i < end_index; i++ ) + { + Left[i] = ( LR_ratio_mem * ( PCh_2_L[i] + SCh_2_R[i] ) - SCh_2_R[i] ) * fade_out + ( LR_ratio * ( PCh_2_L[i] - SCh_2_R[i] ) + SCh_2_R[i] ) * fade_in; + Right[i] = ( LR_ratio_mem * ( PCh_2_L[i] - SCh_2_R[i] ) - PCh_2_L[i] ) * fade_out + ( -LR_ratio * ( PCh_2_L[i] + SCh_2_R[i] ) + PCh_2_L[i] ) * fade_in; + fade_in += step2; + fade_out -= step; + } + } + else if ( fading_type == 3 ) /* YX scheme */ + { + for ( i = start_index; i < end_index; i++ ) + { + Left[i] = ( LR_ratio_mem * ( PCh_2_L[i] - SCh_2_R[i] ) + SCh_2_R[i] ) * fade_out + ( LR_ratio * ( PCh_2_L[i] - SCh_2_R[i] ) + SCh_2_R[i] ) * fade_in; + Right[i] = ( -LR_ratio_mem * ( PCh_2_L[i] + SCh_2_R[i] ) + PCh_2_L[i] ) * fade_out + ( -LR_ratio * ( PCh_2_L[i] + SCh_2_R[i] ) + PCh_2_L[i] ) * fade_in; + fade_in += step2; + fade_out -= step; + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * stereo_tdm_combine() + * + * Combine Primary and Secondary channels into L and R channels + *-------------------------------------------------------------------*/ + +void stereo_tdm_combine( + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + float *PCh_2_L, /* i/o: Primary channel -> output as left channel */ + float *SCh_2_R, /* i/o: Secondary channel -> output as right channel*/ + const int16_t output_frame, /* i : Number of samples */ + const int16_t flag_HB, /* i : flag to distinguish between core (0) and HB (1) synthesis */ + const int16_t tdm_ratio_idx /* i : TDM ratio index */ +) +{ + int16_t i; + int32_t output_Fs; + float LR_ratio, LR_ratio_mem; + float Left[L_FRAME48k], Right[L_FRAME48k]; + int16_t upmixing_delay; + int16_t stereo_tdm_coder_type; + int16_t tdm_n_OVA; + int16_t tdm_last_ratio_idx = hCPE->hStereoTD->tdm_last_ratio_idx; + + output_Fs = hCPE->hCoreCoder[0]->output_Fs; + tdm_n_OVA = NS2SA( output_Fs, TDM_L_NOVA_NS ); + + if ( flag_HB ) + { + upmixing_delay = NS2SA( output_Fs, ACELP_LOOK_NS + DELAY_BWE_TOTAL_NS ); + } + else + { + upmixing_delay = NS2SA( output_Fs, ACELP_LOOK_NS + DELAY_CLDFB_NS ); + } + + LR_ratio = tdm_ratio_tabl[tdm_ratio_idx]; + LR_ratio_mem = tdm_ratio_tabl[tdm_last_ratio_idx]; + + if ( hCPE->hStereoTD->flag_skip_DMX ) + { + stereo_tdm_coder_type = 10; /* no DMX */ + mvr2r( PCh_2_L, Left, output_frame ); + mvr2r( SCh_2_R, Right, output_frame ); + } + else if ( hCPE->hStereoTD->tdm_last_SM_flag == 1 ) + { + if ( hCPE->hStereoTD->tdm_prev_last_SM_flag == 0 ) + { + stereo_tdm_coder_type = 0; /* mode 1 : Switching from YX scheme to SM scheme*/ + } + else + { + stereo_tdm_coder_type = 1; /* mode 2 : SM scheme*/ + } + } + else + { + if ( hCPE->hStereoTD->tdm_prev_last_SM_flag == 1 ) + { + stereo_tdm_coder_type = 2; /* mode 3 : Switching from SM scheme to YX scheme*/ + } + else + { + stereo_tdm_coder_type = 3; /* mode 4 : YX scheme*/ + } + } + + switch ( stereo_tdm_coder_type ) + { + case ( 0 ): + { + /* Do the upmixing of the first upmixing_delay samples with the old coefficient and formular for YX scheme */ + tdm_upmix_plain( Left, Right, PCh_2_L, SCh_2_R, LR_ratio_mem, tdm_den_ratio_tabl[tdm_last_ratio_idx], 0, upmixing_delay, 1 ); + + /* Switching from YX scheme to SM scheme */ + tdm_upmix_fade( Left, Right, PCh_2_L, SCh_2_R, LR_ratio_mem, tdm_den_ratio_tabl[tdm_last_ratio_idx], LR_ratio, tdm_den_ratio_tabl[tdm_ratio_idx], upmixing_delay, upmixing_delay + tdm_n_OVA, 0 ); + + /* Do the upmixing of the other samples with the new coefficient and formular for SM scheme */ + tdm_upmix_plain( Left, Right, PCh_2_L, SCh_2_R, LR_ratio, tdm_den_ratio_tabl[tdm_ratio_idx], upmixing_delay + tdm_n_OVA, output_frame, 0 ); + } + break; + case ( 1 ): + { + /* Do the upmixing of the first upmixing_delay samples with the old coefficient and formular for SM scheme */ + tdm_upmix_plain( Left, Right, PCh_2_L, SCh_2_R, LR_ratio_mem, tdm_den_ratio_tabl[tdm_last_ratio_idx], 0, upmixing_delay, 0 ); + + /* Do the upmixing of the other samples with the new coefficient and formular for SM scheme */ + if ( LR_ratio == LR_ratio_mem ) + { + tdm_upmix_plain( Left, Right, PCh_2_L, SCh_2_R, LR_ratio_mem, tdm_den_ratio_tabl[tdm_last_ratio_idx], upmixing_delay, output_frame, 0 ); + } + else + { + tdm_upmix_fade( Left, Right, PCh_2_L, SCh_2_R, LR_ratio_mem, tdm_den_ratio_tabl[tdm_last_ratio_idx], LR_ratio, tdm_den_ratio_tabl[tdm_ratio_idx], upmixing_delay, upmixing_delay + tdm_n_OVA, 1 ); + tdm_upmix_plain( Left, Right, PCh_2_L, SCh_2_R, LR_ratio, tdm_den_ratio_tabl[tdm_ratio_idx], upmixing_delay + tdm_n_OVA, output_frame, 0 ); + } + } + break; + case ( 2 ): + { + /* Do the upmixing of the first upmixing_delay samples with the old coefficient and formular for SM scheme */ + tdm_upmix_plain( Left, Right, PCh_2_L, SCh_2_R, LR_ratio_mem, tdm_den_ratio_tabl[tdm_last_ratio_idx], 0, upmixing_delay, 0 ); + + /* Switching from SM scheme to YX scheme */ + tdm_upmix_fade( Left, Right, PCh_2_L, SCh_2_R, LR_ratio_mem, tdm_den_ratio_tabl[tdm_last_ratio_idx], LR_ratio, tdm_den_ratio_tabl[tdm_ratio_idx], upmixing_delay, upmixing_delay + tdm_n_OVA, 2 ); + + /* Do the upmixing of the other samples with the new coefficient and formular for YX scheme */ + tdm_upmix_plain( Left, Right, PCh_2_L, SCh_2_R, LR_ratio, tdm_den_ratio_tabl[tdm_ratio_idx], upmixing_delay + tdm_n_OVA, output_frame, 1 ); + } + break; + case ( 3 ): + { + /* Do the upmixing of the first upmixing_delay samples with the old coefficient and formular for YX scheme */ + tdm_upmix_plain( Left, Right, PCh_2_L, SCh_2_R, LR_ratio_mem, tdm_den_ratio_tabl[tdm_last_ratio_idx], 0, upmixing_delay, 1 ); + + /* Do the upmixing of the other samples with the new coefficient and formular for YX scheme */ + if ( LR_ratio == LR_ratio_mem ) + { + tdm_upmix_plain( Left, Right, PCh_2_L, SCh_2_R, LR_ratio_mem, tdm_den_ratio_tabl[tdm_last_ratio_idx], upmixing_delay, output_frame, 1 ); + } + else + { + tdm_upmix_fade( Left, Right, PCh_2_L, SCh_2_R, LR_ratio_mem, tdm_den_ratio_tabl[tdm_last_ratio_idx], LR_ratio, tdm_den_ratio_tabl[tdm_ratio_idx], upmixing_delay, upmixing_delay + tdm_n_OVA, 3 ); + tdm_upmix_plain( Left, Right, PCh_2_L, SCh_2_R, LR_ratio, tdm_den_ratio_tabl[tdm_ratio_idx], upmixing_delay + tdm_n_OVA, output_frame, 1 ); + } + } + break; + default: + break; + } + + for ( i = 0; i < output_frame; i++ ) + { + PCh_2_L[i] = Left[i]; + SCh_2_R[i] = Right[i]; + } + + /* DFT -> TD stereo switching: equalize signal energies */ + if ( hCPE->last_element_mode != IVAS_CPE_TD ) + { + float incr, fac; + + if ( hCPE->hStereoDftDmx != NULL ) + { + fac = 1.0f; + } + else + { + fac = hCPE->hStereoTCA->targetGain; + } + + if ( fac < 1.0f ) + { + incr = ( 1.0f - fac ) / NS2SA( output_Fs, ACELP_LOOK_NS ); + + for ( i = 0; i < NS2SA( output_Fs, ACELP_LOOK_NS ); i++ ) + { + PCh_2_L[i] *= fac; + fac += incr; + } + } + } + + return; +} diff --git a/lib_dec/ivas_svd_dec.c b/lib_dec/ivas_svd_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..9ea4af761bbee01fca70c4bf9a866f305343a539 --- /dev/null +++ b/lib_dec/ivas_svd_dec.c @@ -0,0 +1,912 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_stat_dec.h" +#include "ivas_cnst.h" +#include +#include "wmc_auto.h" + + +/*-----------------------------------------------------------------------* + * Local constants + *-----------------------------------------------------------------------*/ + +/* The SVD is sensitive to changes to the following constants, so please be careful when trying to tune things */ +#define SVD_MINIMUM_VALUE 1e-32f /* minimum value */ +#define CONVERGENCE_FACTOR 1.19209290e-07f /* factor for SVD convergence */ +#define SVD_MAX_NUM_ITERATION 75 /* maximum number of interations before exiting the SVD */ +#define SVD_ZERO_FLUSH_THRESHOLD 1.0e-20f + + +/*-----------------------------------------------------------------------* + * Local function prototypes + *-----------------------------------------------------------------------*/ + +static float GivensRotation( const float x, const float z ); + +static void biDiagonalReductionLeft( float singularVectors[][MAX_OUTPUT_CHANNELS], float singularValues[MAX_OUTPUT_CHANNELS], float secDiag[MAX_OUTPUT_CHANNELS], const int16_t nChannelsL, const int16_t nChannelsC, const int16_t currChannel, float *sig_x, float *g ); + +static void biDiagonalReductionRight( float singularVectors[][MAX_OUTPUT_CHANNELS], float secDiag[MAX_OUTPUT_CHANNELS], const int16_t nChannelsL, const int16_t nChannelsC, const int16_t currChannel, float *sig_x, float *g ); + +static void singularVectorsAccumulationLeft( float singularVectors_Left[][MAX_OUTPUT_CHANNELS], float singularValues[MAX_OUTPUT_CHANNELS], const int16_t nChannelsL, const int16_t nChannelsC ); + +static void singularVectorsAccumulationRight( float singularVectors_Left[][MAX_OUTPUT_CHANNELS], float singularVectors_Right[][MAX_OUTPUT_CHANNELS], float secDiag[MAX_OUTPUT_CHANNELS], const int16_t nChannelsC ); + +static void HouseholderReduction( float singularVectors_Left[][MAX_OUTPUT_CHANNELS], float singularValues[MAX_OUTPUT_CHANNELS], float singularVectors_Right[][MAX_OUTPUT_CHANNELS], float secDiag[MAX_OUTPUT_CHANNELS], const int16_t nChannelsL, const int16_t nChannelsC, float *eps_x ); + +static int16_t BidagonalDiagonalisation( float singularVectors_Left[][MAX_OUTPUT_CHANNELS], float singularValues[MAX_OUTPUT_CHANNELS], float singularVectors_Right[][MAX_OUTPUT_CHANNELS], float secDiag[MAX_OUTPUT_CHANNELS], const int16_t nChannelsL, const int16_t nChannelsC, const float eps_x ); + +static void ApplyQRTransform( float singularVectors_Left[][MAX_OUTPUT_CHANNELS], float singularValues[MAX_OUTPUT_CHANNELS], float singularVectors_Right[][MAX_OUTPUT_CHANNELS], float secDiag[MAX_OUTPUT_CHANNELS], const int16_t startIndex, const int16_t currentIndex, const int16_t nChannelsL, const int16_t nChannelsC ); + +static void ApplyRotation( float singularVector[][MAX_OUTPUT_CHANNELS], const float c, const float s, float x11, float x12, float *f, float *g, const int16_t currentIndex1, const int16_t currentIndex2, const int16_t nChannels ); + +static float maxWithSign( const float a ); + +static void flushToZeroArray( float arr[MAX_OUTPUT_CHANNELS], const int16_t length ); + +static void flushToZeroMat( float mat[][MAX_OUTPUT_CHANNELS], const int16_t m, const int16_t n ); + + +/*------------------------------------------------------------------------- + * mat2svdMat() + * + * external matrix format to internal + *-------------------------------------------------------------------------*/ + +void mat2svdMat( + const float *mat, /* i : matrix as column ordered vector */ + float svdMat[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS], /* o : matrix as two-dimensional arry */ + const int16_t nRows, /* i : number of rows of the matrix */ + const int16_t mCols, /* i : number of columns of the matrix */ + const int16_t transpose /* i : flag indication transposition */ +) +{ + int16_t i, j; + + if ( transpose ) + { + for ( i = 0; i < mCols; i++ ) + { + for ( j = 0; j < nRows; j++ ) + { + svdMat[i][j] = mat[j + nRows * i]; + } + + set_zero( &svdMat[i][mCols], MAX_OUTPUT_CHANNELS - nRows ); + } + + for ( ; i < MAX_OUTPUT_CHANNELS; i++ ) + { + set_zero( svdMat[i], MAX_OUTPUT_CHANNELS ); + } + } + else + { + for ( i = 0; i < nRows; i++ ) + { + for ( j = 0; j < mCols; j++ ) + { + svdMat[i][j] = mat[i + nRows * j]; + } + + set_zero( &svdMat[i][mCols], MAX_OUTPUT_CHANNELS - mCols ); + } + + for ( ; i < MAX_OUTPUT_CHANNELS; i++ ) + { + set_zero( svdMat[i], MAX_OUTPUT_CHANNELS ); + } + } + + return; +} + + +/*---------------------------------------------------------------------* + * svdMat2mat() + * + * transfer a matrix from a two dimensional array to a column wise ordered vector + *---------------------------------------------------------------------*/ + +void svdMat2mat( + float svdMat[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS], /* i : matrix as two-dimensional arry */ + float *mat, /* o : matrix as column ordered vector */ + const int16_t nRows, /* i : number of rows of the matrix */ + const int16_t mCols /* i : number of columns of the matrix */ +) +{ + int16_t i, j; + + for ( i = 0; i < nRows; i++ ) + { + + + for ( j = 0; j < mCols; j++ ) + { + mat[i + nRows * j] = svdMat[i][j]; + } + } + + return; +} + + +/*------------------------------------------------------------------------- + * svd() + * + * perform a singular value decomposition X=USV of a matrix X + *-------------------------------------------------------------------------*/ + +/*! r: error or success */ +int16_t svd( + float InputMatrix[][MAX_OUTPUT_CHANNELS], /* i : matrix to be decomposed (M) */ + float singularVectors_Left[][MAX_OUTPUT_CHANNELS], /* o : left singular vectors (U) */ + float singularValues[MAX_OUTPUT_CHANNELS], /* o : singular values vector (S) */ + float singularVectors_Right[][MAX_OUTPUT_CHANNELS], /* o : right singular vectors (V) */ + const int16_t nChannelsL, /* i : number of rows in the matrix to be decomposed */ + const int16_t nChannelsC /* i : number of columns in the matrix to be decomposed */ +) +{ + int16_t iCh, jCh; + int16_t lengthSingularValues; + int16_t errorMessage, condition; + int16_t max_length = ( ( nChannelsL > nChannelsC ) ? nChannelsL : nChannelsC ); + float secDiag[MAX_OUTPUT_CHANNELS]; + float eps_x = 0.0f, temp; + + push_wmops( "svd" ); + + set_zero( secDiag, MAX_OUTPUT_CHANNELS ); + + /* Collecting Values */ + for ( iCh = 0; iCh < nChannelsL; iCh++ ) + { + for ( jCh = 0; jCh < nChannelsC; jCh++ ) + { + singularVectors_Left[iCh][jCh] = InputMatrix[iCh][jCh]; + } + } + + /* Householder reduction */ + HouseholderReduction( singularVectors_Left, singularValues, singularVectors_Right, secDiag, nChannelsL, nChannelsC, &eps_x ); + + /* Set extremely small values to zero if needed */ + flushToZeroArray( singularValues, max_length ); + flushToZeroMat( singularVectors_Left, nChannelsL, nChannelsL ); + flushToZeroMat( singularVectors_Right, nChannelsC, nChannelsC ); + + /* BidagonalDiagonalisation */ + errorMessage = BidagonalDiagonalisation( singularVectors_Left, singularValues, singularVectors_Right, secDiag, nChannelsL, nChannelsC, eps_x ); + + /* Sort the singular values descending order */ + lengthSingularValues = min( nChannelsL, nChannelsC ); + + do + { + condition = 0; + for ( iCh = 0; iCh < lengthSingularValues - 1; iCh++ ) + { + if ( singularValues[iCh] < singularValues[iCh + 1] ) + { + condition = 1; + temp = singularValues[iCh]; + singularValues[iCh] = singularValues[iCh + 1]; + singularValues[iCh + 1] = temp; + + for ( jCh = 0; jCh < nChannelsL; ++jCh ) + { + temp = singularVectors_Left[jCh][iCh]; + singularVectors_Left[jCh][iCh] = singularVectors_Left[jCh][iCh + 1]; + singularVectors_Left[jCh][iCh + 1] = temp; + } + + for ( jCh = 0; jCh < nChannelsC; ++jCh ) + { + temp = singularVectors_Right[jCh][iCh]; + singularVectors_Right[jCh][iCh] = singularVectors_Right[jCh][iCh + 1]; + singularVectors_Right[jCh][iCh + 1] = temp; + } + } + } + } while ( condition == 1 ); + + pop_wmops(); + return ( errorMessage ); +} + + +/*-----------------------------------------------------------------------* + * Local functions + *-----------------------------------------------------------------------*/ + +/*------------------------------------------------------------------------- + * BidagonalDiagonalisation() + * + * + *-------------------------------------------------------------------------*/ + +static int16_t BidagonalDiagonalisation( + float singularVectors_Left[][MAX_OUTPUT_CHANNELS], /* i/o: left singular vectors (U) */ + float singularValues[MAX_OUTPUT_CHANNELS], /* i/o: singular values vector (S) */ + float singularVectors_Right[][MAX_OUTPUT_CHANNELS], /* i/o: right singular vectors (V) */ + float secDiag[MAX_OUTPUT_CHANNELS], /* i/o: */ + const int16_t nChannelsL, /* i : number of rows in the matrix to be decomposed */ + const int16_t nChannelsC, /* i : number of columns in the matrix to be decomposed */ + const float eps_x /* i : */ +) +{ + int16_t kCh, nCh, iCh, jCh, split; + float c, s, f1, f2; + float g = 0.0f; + int16_t convergence, iteration, found_split; + int16_t error = 0; + + for ( iCh = nChannelsC - 1; iCh >= 0; iCh-- ) /* nChannelsC */ + { + convergence = 0; + iteration = 0; + split = iCh - 1; + + while ( convergence == 0 ) + { + iteration++; + found_split = 1; + + for ( jCh = iCh; jCh >= 0; jCh-- ) + { + split = jCh - 1; + if ( fabsf( secDiag[jCh] ) <= CONVERGENCE_FACTOR * eps_x ) /* is secDiag[ch] vanishing compared to eps_x */ + { + found_split = 0; + break; + } + if ( fabsf( singularValues[split] ) <= CONVERGENCE_FACTOR * eps_x ) /* is singularValues[split] vanishing compared to eps_x */ + { + break; + } + } + + convergence = ( jCh == iCh ) ? 1 : 0; + + if ( found_split ) + { + s = 1.0f; + c = 0.0f; + + for ( kCh = jCh; kCh <= iCh; kCh++ ) + { + g = s * secDiag[kCh]; + secDiag[kCh] = c * secDiag[kCh]; + if ( fabsf( g ) <= CONVERGENCE_FACTOR * eps_x ) + { + break; + } + + c = singularValues[kCh]; + singularValues[kCh] = GivensRotation( g, singularValues[kCh] ); + c = c / maxWithSign( singularValues[kCh] ); + s = -g / maxWithSign( singularValues[kCh] ); + + ApplyRotation( singularVectors_Left, c, s, 0, 0, &f1, &f2, kCh, split, nChannelsL ); /* nChannelsL */ + } + } + + if ( convergence ) + { + singularValues[iCh] = (float) singularValues[iCh]; + if ( singularValues[iCh] < 0.0f ) + { + singularValues[iCh] = -singularValues[iCh]; + for ( nCh = 0; nCh < nChannelsC; nCh++ ) /* nChannelsC */ + { + singularVectors_Right[nCh][iCh] = -singularVectors_Right[nCh][iCh]; + } + } + } + else + { + if ( iteration >= SVD_MAX_NUM_ITERATION ) + { + if ( singularValues[iCh] < 0.0f ) + { + singularValues[iCh] = -singularValues[iCh]; + + for ( nCh = 0; nCh < nChannelsC; nCh++ ) /* nChannelsC */ + { + singularVectors_Right[nCh][iCh] = -singularVectors_Right[nCh][iCh]; + } + } + error = 1; + convergence = 1; + } + else + { + ApplyQRTransform( singularVectors_Left, singularValues, singularVectors_Right, secDiag, jCh, iCh, nChannelsL, nChannelsC ); /* nChannelsC */ + } + } + } + } + + return ( error ); +} + + +/*------------------------------------------------------------------------- + * ApplyQRTransform() + * + * + *-------------------------------------------------------------------------*/ + +static void ApplyQRTransform( + float singularVectors_Left[][MAX_OUTPUT_CHANNELS], /* i/o: left singular vectors (U) */ + float singularValues[MAX_OUTPUT_CHANNELS], /* i/o: singular values vector (S) */ + float singularVectors_Right[][MAX_OUTPUT_CHANNELS], /* i/o: right singular vectors (V) */ + float secDiag[MAX_OUTPUT_CHANNELS], /* i/o: */ + const int16_t startIndex, /* i : */ + const int16_t currentIndex, /* i : */ + const int16_t nChannelsL, /* i : number of rows in the matrix to be decomposed */ + const int16_t nChannelsC /* i : number of columns in the matrix to be decomposed */ +) +{ + int16_t ch, split; + float d = 0.0f, g = 0.0f, r = 0.0f, x_ii = 0.0f, x_split = 0.0f, x_kk = 0.0f, mu = 0.0f, aux = 0.0f; + float c = 1.0f; + float s = 1.0f; + + x_kk = singularValues[currentIndex]; + x_ii = singularValues[startIndex]; + split = currentIndex - 1; + + x_split = singularValues[split]; + g = secDiag[split]; + r = secDiag[currentIndex]; + + d = ( x_split + x_kk ) * ( x_split - x_kk ) + ( g + r ) * ( g - r ); + d /= maxWithSign( ( r + r ) * x_split ); + + g = GivensRotation( 1.0f, d ); + mu = x_split / maxWithSign( d + ( d >= 0.0f ? 1 : ( -1 ) ) * fabsf( g ) ) - r; + d = ( ( x_ii + x_kk ) * ( x_ii - x_kk ) + r * mu ) / maxWithSign( x_ii ); + + /*QR transformation*/ + for ( ch = startIndex; ch <= split; ch++ ) + { + r = s * secDiag[ch + 1]; + g = c * secDiag[ch + 1]; + + secDiag[ch] = GivensRotation( d, r ); + c = d / maxWithSign( secDiag[ch] ); + s = r / maxWithSign( secDiag[ch] ); + + r = s * singularValues[ch + 1]; + x_split = c * singularValues[ch + 1]; + aux = g; + ApplyRotation( singularVectors_Right, c, s, x_ii, aux, &d, &g, ch + 1, ch, nChannelsC ); + + singularValues[ch] = GivensRotation( d, r ); + if ( fabsf( singularValues[ch] ) > CONVERGENCE_FACTOR * fabsf( singularValues[ch] ) ) + { + aux = 1.0f / singularValues[ch]; + c = d * aux; + s = r * aux; + } + + ApplyRotation( singularVectors_Left, c, s, g, x_split, &d, &x_ii, ch + 1, ch, nChannelsL ); + } + + secDiag[startIndex] = 0.0f; + secDiag[currentIndex] = d; + singularValues[currentIndex] = x_ii; + + return; +} + + +/*------------------------------------------------------------------------- + * ApplyRotation() + * + * + *-------------------------------------------------------------------------*/ + +static void ApplyRotation( + float singularVector[][MAX_OUTPUT_CHANNELS], + const float c, + const float s, + float x11, + float x12, + float *d, + float *g, + const int16_t currentIndex1, + const int16_t currentIndex2, + const int16_t nChannels ) +{ + int16_t ch; + + *d = c * x11 + s * x12; + *g = c * x12 - s * x11; + + for ( ch = 0; ch < nChannels; ch++ ) + { + x11 = singularVector[ch][currentIndex2]; + x12 = singularVector[ch][currentIndex1]; + singularVector[ch][currentIndex2] = ( c * x11 + s * x12 ); + singularVector[ch][currentIndex1] = ( c * x12 - s * x11 ); + } + + return; +} + + +/*------------------------------------------------------------------------- + * HouseholderReduction() + * + * + *-------------------------------------------------------------------------*/ + +static void HouseholderReduction( + float singularVectors_Left[][MAX_OUTPUT_CHANNELS], + float singularValues[MAX_OUTPUT_CHANNELS], + float singularVectors_Right[][MAX_OUTPUT_CHANNELS], + float secDiag[MAX_OUTPUT_CHANNELS], + const int16_t nChannelsL, + const int16_t nChannelsC, + float *eps_x ) +{ + int16_t nCh; + float g = 0.0f, sig_x = 0.0f; + + /* Bidiagonal Reduction for every channel */ + for ( nCh = 0; nCh < nChannelsC; nCh++ ) /* nChannelsC */ + { + biDiagonalReductionLeft( singularVectors_Left, singularValues, secDiag, nChannelsL, nChannelsC, nCh, &sig_x, &g ); + biDiagonalReductionRight( singularVectors_Left, secDiag, nChannelsL, nChannelsC, nCh, &sig_x, &g ); + *eps_x = max( *eps_x, ( fabsf( singularValues[nCh] ) + fabsf( secDiag[nCh] ) ) ); + } + + /* SingularVecotr Accumulation */ + singularVectorsAccumulationRight( singularVectors_Left, singularVectors_Right, secDiag, nChannelsC ); + singularVectorsAccumulationLeft( singularVectors_Left, singularValues, nChannelsL, nChannelsC ); + + return; +} + + +/*------------------------------------------------------------------------- + * biDiagonalReductionLeft() + * + * + *-------------------------------------------------------------------------*/ + +static void biDiagonalReductionLeft( + float singularVectors[][MAX_OUTPUT_CHANNELS], + float singularValues[MAX_OUTPUT_CHANNELS], + float secDiag[MAX_OUTPUT_CHANNELS], + const int16_t nChannelsL, + const int16_t nChannelsC, + const int16_t currChannel, + float *sig_x, + float *g ) +{ + int16_t iCh, jCh, idx; + float norm_x, f, r; + + secDiag[currChannel] = ( *sig_x ) * ( *g ); + + /* Setting values to 0 */ + ( *sig_x ) = 0.0f; + ( *g ) = 0.0f; + + if ( currChannel < nChannelsL ) /* i <= m */ + { + idx = currChannel; + + for ( jCh = idx; jCh < nChannelsL; jCh++ ) /* nChannelsL */ + { + ( *sig_x ) += fabsf( singularVectors[jCh][currChannel] ); + } + + if ( ( *sig_x ) ) /*(fabsf(*sig_x) > EPSILON * fabsf(*sig_x)) { */ + { + norm_x = 0.0f; + + for ( jCh = idx; jCh < nChannelsL; jCh++ ) /* nChannelsL */ + { + singularVectors[jCh][currChannel] = ( singularVectors[jCh][currChannel] / maxWithSign( ( *sig_x ) ) ); + norm_x += ( singularVectors[jCh][currChannel] * singularVectors[jCh][currChannel] ); + } + ( *g ) = -( singularVectors[currChannel][idx] >= 0 ? 1 : ( -1 ) ) * sqrtf( norm_x ); + r = ( *g ) * singularVectors[currChannel][idx] - norm_x; + singularVectors[currChannel][idx] = ( singularVectors[currChannel][idx] - ( *g ) ); + + for ( iCh = currChannel + 1; iCh < nChannelsC; iCh++ ) /* nChannelsC */ + { + norm_x = 0.0f; + for ( jCh = idx; jCh < nChannelsL; jCh++ ) /* nChannelsL */ + { + norm_x += ( singularVectors[jCh][currChannel] * singularVectors[jCh][iCh] ); + } + + f = norm_x / maxWithSign( r ); + + + for ( jCh = idx; jCh < nChannelsL; jCh++ ) /* nChannelsL */ + { + singularVectors[jCh][iCh] += ( f * singularVectors[jCh][currChannel] ); + } + } + + + for ( jCh = idx; jCh < nChannelsL; jCh++ ) /* nChannelsL */ + { + singularVectors[jCh][currChannel] = ( singularVectors[jCh][currChannel] * ( *sig_x ) ); + } + } + + singularValues[currChannel] = ( ( *sig_x ) * ( *g ) ); + } + + return; +} + + +/*------------------------------------------------------------------------- + * biDiagonalReductionRight() + * + * + *-------------------------------------------------------------------------*/ + +static void biDiagonalReductionRight( + float singularVectors[][MAX_OUTPUT_CHANNELS], + float secDiag[MAX_OUTPUT_CHANNELS], + const int16_t nChannelsL, + const int16_t nChannelsC, + const int16_t currChannel, + float *sig_x, + float *g ) +{ + int16_t iCh, jCh, idx; + float norm_x, r; + + /* Setting values to 0 */ + ( *sig_x ) = 0.0f; + ( *g ) = 0.0f; + + if ( currChannel < nChannelsL && currChannel != ( nChannelsC - 1 ) ) /* i <=m && i !=n */ + { + idx = currChannel + 1; + + for ( jCh = idx; jCh < nChannelsC; jCh++ ) /* nChannelsC */ + { + ( *sig_x ) += fabsf( singularVectors[currChannel][jCh] ); + } + + if ( ( *sig_x ) ) /*(fabsf(*sig_x) > EPSILON * fabsf(*sig_x)) { */ + { + norm_x = 0.0f; + + for ( jCh = idx; jCh < nChannelsC; jCh++ ) /*nChannelsC */ + { + singularVectors[currChannel][jCh] = ( singularVectors[currChannel][jCh] / maxWithSign( ( *sig_x ) ) ); + norm_x += ( singularVectors[currChannel][jCh] * singularVectors[currChannel][jCh] ); + } + ( *g ) = -( singularVectors[currChannel][idx] >= 0 ? 1 : ( -1 ) ) * sqrtf( norm_x ); + r = ( *g ) * singularVectors[currChannel][idx] - norm_x; + singularVectors[currChannel][idx] = ( singularVectors[currChannel][idx] - ( *g ) ); + + for ( jCh = idx; jCh < nChannelsC; jCh++ ) /* nChannelsC */ + { + secDiag[jCh] = singularVectors[currChannel][jCh] / maxWithSign( r ); + } + + for ( iCh = currChannel + 1; iCh < nChannelsL; iCh++ ) /* nChannelsL */ + { + norm_x = 0.0f; + for ( jCh = idx; jCh < nChannelsC; jCh++ ) /* nChannelsC */ + { + norm_x += ( singularVectors[iCh][jCh] * singularVectors[currChannel][jCh] ); + } + + for ( jCh = idx; jCh < nChannelsC; jCh++ ) /* nChannelsC */ + { + singularVectors[iCh][jCh] += ( norm_x * secDiag[jCh] ); + } + } + + for ( jCh = idx; jCh < nChannelsC; jCh++ ) /* nChannelsC */ + { + singularVectors[currChannel][jCh] = ( singularVectors[currChannel][jCh] * ( *sig_x ) ); + } + } + } + + return; +} + + +/*------------------------------------------------------------------------- + * singularVectorsAccumulationLeft() + * + * + *-------------------------------------------------------------------------*/ + +static void singularVectorsAccumulationLeft( + float singularVectors_Left[][MAX_OUTPUT_CHANNELS], + float singularValues[MAX_OUTPUT_CHANNELS], + const int16_t nChannelsL, + const int16_t nChannelsC ) +{ + int16_t nCh, iCh, k; + int16_t nChannels; + float norm_y, t_jj, t_ii; + + /* Processing */ + nChannels = min( nChannelsL, nChannelsC ); /* min(nChannelsL,ChannelsC) */ + + for ( nCh = nChannels - 1; nCh >= 0; nCh-- ) /* min(nChannelsL,ChannelsC) */ + { + t_ii = singularValues[nCh]; + + for ( iCh = nCh + 1; iCh < nChannelsC; iCh++ ) /* nChannelsC */ + { + singularVectors_Left[nCh][iCh] = 0.0f; + } + + if ( t_ii ) /*if (fabsf(t_ii) > EPSILON *fabsf(t_ii)) {*/ + { + t_ii = 1.0f / maxWithSign( t_ii ); + + + for ( iCh = nCh + 1; iCh < nChannelsC; iCh++ ) /* nChannelsC */ + { + norm_y = 0.0f; + for ( k = nCh + 1; k < nChannelsL; k++ ) /* nChannelsL */ + { + norm_y += ( singularVectors_Left[k][nCh] * singularVectors_Left[k][iCh] ); + } + t_jj = t_ii * norm_y / maxWithSign( singularVectors_Left[nCh][nCh] ); + + for ( k = nCh; k < nChannelsL; k++ ) /* nChannelsL */ + { + singularVectors_Left[k][iCh] += ( t_jj * singularVectors_Left[k][nCh] ); + } + } + + for ( iCh = nCh; iCh < nChannelsL; iCh++ ) /* nChannelsL */ + { + singularVectors_Left[iCh][nCh] = ( singularVectors_Left[iCh][nCh] * t_ii ); + } + } + else + { + for ( iCh = nCh; iCh < nChannelsL; iCh++ ) /* nChannelsL */ + { + singularVectors_Left[iCh][nCh] = 0.0f; + } + } + + ++singularVectors_Left[nCh][nCh]; + } + + return; +} + + +/*------------------------------------------------------------------------- + * singularVectorsAccumulationRight() + * + * + *-------------------------------------------------------------------------*/ + +static void singularVectorsAccumulationRight( + float singularVectors_Left[][MAX_OUTPUT_CHANNELS], + float singularVectors_Right[][MAX_OUTPUT_CHANNELS], + float secDiag[MAX_OUTPUT_CHANNELS], + const int16_t nChannelsC ) +{ + int16_t nCh, iCh, k; + int16_t nChannels; + float norm_y, t_ii, ratio; + + /* Processing */ + nChannels = nChannelsC; /* nChannelsC */ + + /* avoid compiler warning */ + t_ii = secDiag[nChannels - 1]; + + for ( nCh = nChannels - 1; nCh >= 0; nCh-- ) /* nChannelsC, min(nChannelsLmnChannelsC) otherwise */ + { + + if ( nCh < nChannelsC - 1 ) /* nChannelsC */ + { + if ( t_ii ) /*if (fabsf(t_ii) > EPSILON *fabsf(t_ii)) {*/ + { + + for ( iCh = nCh + 1; iCh < nChannelsC; iCh++ ) /* nChannelsC*/ + { + ratio = singularVectors_Left[nCh][iCh] / maxWithSign( singularVectors_Left[nCh][nCh + 1] ); + singularVectors_Right[iCh][nCh] = ratio / maxWithSign( t_ii ); + } + + for ( iCh = nCh + 1; iCh < nChannelsC; iCh++ ) /* nChannelsC */ + { + norm_y = 0.0f; + + for ( k = nCh + 1; k < nChannelsC; k++ ) /* nChannelsC */ + { + norm_y += ( singularVectors_Left[nCh][k] * singularVectors_Right[k][iCh] ); + } + + for ( k = nCh + 1; k < nChannelsC; k++ ) /* nChannelsC */ + { + singularVectors_Right[k][iCh] += ( norm_y * singularVectors_Right[k][nCh] ); + } + } + } + + for ( iCh = nCh + 1; iCh < nChannelsC; iCh++ ) /* nChannelsC */ + { + singularVectors_Right[nCh][iCh] = singularVectors_Right[iCh][nCh] = 0.0f; + } + } + singularVectors_Right[nCh][nCh] = 1.0f; + t_ii = secDiag[nCh]; + } + + return; +} + + +/*------------------------------------------------------------------------- + * GivensRotation() + * + * + *-------------------------------------------------------------------------*/ + +static float GivensRotation( + const float x, + const float z ) +{ + float x_abs, z_abs; + float cotan, tan, r; + x_abs = fabsf( x ); + z_abs = fabsf( z ); + if ( x_abs <= CONVERGENCE_FACTOR * x_abs && z_abs <= CONVERGENCE_FACTOR * z_abs ) + { + r = 0.0f; + } + else if ( x_abs >= z_abs ) + { + if ( x_abs <= SVD_MINIMUM_VALUE ) + { + r = 0.0f; + } + else + { + cotan = z_abs / ( x_abs ); + r = x_abs * sqrtf( 1.0f + cotan * cotan ); + } + } + else + { + if ( z_abs <= SVD_MINIMUM_VALUE ) + { + r = 0.0f; + } + else + { + tan = x_abs / ( z_abs ); + r = z_abs * sqrtf( 1.0f + tan * tan ); + } + } + + return ( r ); +} + + +/*------------------------------------------------------------------------- + * maxWithSign() + * + * + *-------------------------------------------------------------------------*/ + +static float maxWithSign( + const float a ) +{ + if ( fabsf( a ) > SVD_MINIMUM_VALUE ) + { + return a; + } + else if ( a < 0.0f ) + { + return -SVD_MINIMUM_VALUE; + } + else + { + return SVD_MINIMUM_VALUE; + } +} + + +/*------------------------------------------------------------------------- + * flushToZeroArray() + * + * + *-------------------------------------------------------------------------*/ + +static void flushToZeroArray( + float arr[MAX_OUTPUT_CHANNELS], + const int16_t length ) +{ + int16_t i; + + for ( i = 0; i < length; ++i ) + { + if ( fabsf( arr[i] ) < SVD_ZERO_FLUSH_THRESHOLD ) + { + arr[i] = 0.0f; + } + } + + return; +} + + +/*------------------------------------------------------------------------- + * flushToZeroMat() + * + * + *-------------------------------------------------------------------------*/ + +static void flushToZeroMat( + float mat[][MAX_OUTPUT_CHANNELS], + const int16_t m, + const int16_t n ) +{ + int16_t i, j; + + for ( i = 0; i < m; ++i ) + { + for ( j = 0; j < n; ++j ) + { + if ( fabsf( mat[i][j] ) < SVD_ZERO_FLUSH_THRESHOLD ) + { + mat[i][j] = 0.0f; + } + } + } + + return; +} diff --git a/lib_dec/ivas_tcx_core_dec.c b/lib_dec/ivas_tcx_core_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..d705b8f455970aaf76112918deeb7c7091ff9eaf --- /dev/null +++ b/lib_dec/ivas_tcx_core_dec.c @@ -0,0 +1,897 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include "options.h" +#include +#include "prot.h" +#include "rom_com.h" +#include "stat_dec.h" +#include "wmc_auto.h" +#include "basop_proto_func.h" +#include "stat_com.h" +#include "ivas_prot.h" + +/*-------------------------------------------------------------* + * Local prototypes + *-------------------------------------------------------------*/ + +static void dec_prm_tcx( Decoder_State *st, int16_t param[], int16_t param_lpc[], int16_t *total_nbbits, const int16_t last_element_mode, int16_t *bitsRead ); +static void stereo_tcx_dec_mode_switch_reconf( Decoder_State *st, const int16_t MCT_flag, const int16_t last_element_mode ); + + +/*-------------------------------------------------------------* + * stereo_tcx_init_dec() + * + * Initialize stereo TCX decoder + *-------------------------------------------------------------*/ + +void stereo_tcx_init_dec( + Decoder_State *st, /* i/o: decoder state structure */ + const int16_t MCT_flag, /* i : hMCT handle allocated (1) or not (0)*/ + const int16_t last_element_mode /* i : element mode of previous frame */ +) +{ + TCX_LTP_DEC_HANDLE hTcxLtpDec = st->hTcxLtpDec; + TCX_DEC_HANDLE hTcxDec = st->hTcxDec; + + st->rate_switching_init = 0; + st->m_frame_type = ACTIVE_FRAME; + st->core_brate = st->total_brate; + + /*sampling rate*/ + st->sr_core = getCoreSamplerateMode2( st->element_mode, st->bits_frame_nominal * FRAMES_PER_SEC, st->bwidth, st->flag_ACELP16k, st->rf_flag, st->is_ism_format ); + st->fscale = sr2fscale( st->sr_core ); + + /*frame size*/ + st->L_frame = (int16_t) ( st->sr_core / FRAMES_PER_SEC ); + hTcxDec->L_frameTCX = (int16_t) ( st->output_Fs / FRAMES_PER_SEC ); + + if ( ( st->L_frame == L_FRAME16k && ( st->bits_frame_nominal * FRAMES_PER_SEC ) <= MAX_ACELP_BRATE ) || ( st->tcxonly && ( st->sr_core == 32000 || st->sr_core == INT_FS_16k ) ) ) + { + st->nb_subfr = NB_SUBFR16k; + } + else + { + st->nb_subfr = NB_SUBFR; + } + + /*TCX tools*/ + st->hTcxCfg->ctx_hm = getCtxHm( st->element_mode, st->bits_frame_nominal * FRAMES_PER_SEC, st->rf_flag ); + st->hTcxCfg->resq = getResq( st->bits_frame_nominal * FRAMES_PER_SEC ); + hTcxDec->tcx_lpc_shaped_ari = getTcxLpcShapedAri( st->bits_frame_nominal * FRAMES_PER_SEC, st->rf_flag, st->element_mode ); + st->igf = getIgfPresent( st->element_mode, st->bits_frame_nominal * FRAMES_PER_SEC, st->bwidth, st->rf_flag ); + + if ( st->element_mode != EVS_MONO ) + { + st->hTcxCfg->fIsTNSAllowed = getTnsAllowed( st->bits_frame_nominal * FRAMES_PER_SEC, st->igf, st->element_mode ); + } + if ( hTcxLtpDec != NULL ) + { + hTcxLtpDec->tcxltp = getTcxLtp( st->sr_core ); + } + + if ( st->element_mode == IVAS_SCE ) + { + st->tcxonly = getTcxonly( st->element_mode, st->bits_frame_nominal * FRAMES_PER_SEC, MCT_flag, st->is_ism_format ); + + /* LPC quantization */ + if ( st->sr_core <= INT_FS_16k && st->tcxonly == 0 ) + { + st->lpcQuantization = 1; + } + else + { + st->lpcQuantization = 0; + } + + if ( st->tcxonly == 0 ) + { + st->numlpc = 1; + } + else + { + st->numlpc = 2; + } + } + + if ( ( st->bits_frame_nominal != st->last_bits_frame_nominal ) || + ( st->bwidth != st->last_bwidth ) || + ( st->last_core != TCX_20_CORE && st->last_core != TCX_10_CORE && !( st->prev_bfi == 1 && st->last_core == ACELP_CORE && st->last_con_tcx == 1 ) ) || + ( st->idchan == 1 && st->element_mode == IVAS_CPE_MDCT && last_element_mode != IVAS_CPE_MDCT ) ) + { + /*re-initialization*/ + stereo_tcx_dec_mode_switch_reconf( st, MCT_flag, last_element_mode ); + } + + return; +} + + +/*-------------------------------------------------------------------* + * stereo_tcx_core_dec() + * + * stereo TCX decoder + *-------------------------------------------------------------------*/ + +void stereo_tcx_core_dec( + Decoder_State *st, /* i/o: decoder state structure */ + const FRAME_MODE frameMode, /* i : Decoder frame mode */ + float *signal_out, /* o : synthesis @internal_Fs */ + float *signal_outFB, /* o : synthesis @output_Fs */ + float pitch_buf[], /* o : floating pitch for each subframe */ + const int16_t sba_dirac_stereo_flag, /* i : signal stereo output for SBA DirAC */ + STEREO_TD_DEC_DATA_HANDLE hStereoTD, /* i/o: TD stereo decoder handle */ + const int16_t last_element_mode, /* i : last element mode */ + const int16_t flag_sec_CNA, /* i : CNA flag for secondary channel */ + STEREO_CNG_DEC_HANDLE hStereoCng, /* i : Stereo CNG handle */ + const int16_t nchan_out, /* i : number of output channels */ + const IVAS_FORMAT ivas_format /* i : IVAS format */ +) +{ + int16_t i, k; + + /*Bitstream*/ + int16_t total_nbbits, bitsRead; + int16_t *prm, param[DEC_NPRM_DIV * NB_DIV]; + int16_t param_lpc[NPRM_LPC_NEW]; + + /*LPC*/ + int16_t LSF_Q_prediction; /* o : LSF prediction mode */ + float lsf[( NB_DIV + 1 ) * M], lsp[( NB_DIV + 1 ) * M], lspmid[M], lsfmid[M]; + float lspnew_uw[NB_DIV * M], lsfnew_uw[NB_DIV * M]; + float Aq[( NB_SUBFR16k + 1 ) * ( M + 1 )]; + int16_t pitch[NB_SUBFR16k]; + float pit_gain[NB_SUBFR16k]; + Word16 Aind[M + 1], lspind[M]; + + /*Synth*/ + float synth_buf[OLD_SYNTH_SIZE_DEC + L_FRAME_PLUS + M]; + float *synth; + float synth_bufFB[OLD_SYNTH_SIZE_DEC + L_FRAME_PLUS + M]; + float *synthFB; + + /*Concealment*/ + int16_t bfi; + + float psd[L_FRAME16k], psd_part[NPART_SHAPING]; + + TCX_LTP_DEC_HANDLE hTcxLtpDec = st->hTcxLtpDec; + TCX_DEC_HANDLE hTcxDec = st->hTcxDec; + + push_wmops( "stereo_tcx_core_dec" ); + + /*Sanity check*/ + assert( !( st->total_brate == FRAME_NO_DATA || st->total_brate == SID_2k40 ) ); /*Active frame*/ + assert( st->rf_flag == 0 ); + assert( st->prev_use_partial_copy == 0 ); /* No channel aware mode */ + assert( st->codec_mode == MODE1 ); /* must be in Mode 1 */ + assert( st->mdct_sw == MODE1 ); /* must be switched to TCX in MODE1 */ + + bfi = 0; + + /*--------------------------------------------------------------------------------* + * Initialization or re-configuration of Stereo TCX + *--------------------------------------------------------------------------------*/ + + stereo_tcx_init_dec( st, 0, last_element_mode ); + + /*--------------------------------------------------------------------------------* + * Initializations + *--------------------------------------------------------------------------------*/ + + total_nbbits = (int16_t) ( st->total_brate / FRAMES_PER_SEC ); + bitsRead = 0; + LSF_Q_prediction = -1; /* to avoid compilation warnings */ + + if ( frameMode == FRAMEMODE_NORMAL ) + { + st->m_decodeMode = DEC_NO_FRAM_LOSS; + bfi = 0; + } + + if ( frameMode == FRAMEMODE_MISSING ) + { + st->m_decodeMode = DEC_CONCEALMENT_EXT; + bfi = 1; + } + + /* for bass postfilter */ + if ( st->tcxonly ) + { + st->p_bpf_noise_buf = NULL; + } + else + { + st->p_bpf_noise_buf = st->bpf_noise_buf; + set_s( pitch, L_SUBFR, st->nb_subfr ); + set_zero( pit_gain, st->nb_subfr ); + } + + /* Initialize pointers */ + synth = synth_buf + hTcxDec->old_synth_len; + synthFB = synth_bufFB + hTcxDec->old_synth_lenFB; + mvr2r( hTcxDec->old_synth, synth_buf, hTcxDec->old_synth_len ); + mvr2r( hTcxDec->old_synthFB, synth_bufFB, hTcxDec->old_synth_lenFB ); + set_zero( synth, L_FRAME_PLUS + M ); + set_zero( synthFB, L_FRAME_PLUS + M ); + + + /*--------------------------------------------------------------------------------* + * BITSTREAM DECODING + *--------------------------------------------------------------------------------*/ + + if ( !bfi ) + { + st->second_last_core = st->last_core; + + dec_prm_tcx( st, param, param_lpc, &total_nbbits, last_element_mode, &bitsRead ); + } + else + { + if ( st->nbLostCmpt > 1 ) + { + st->flagGuidedAcelp = 0; + } + + /* PLC: [Common: mode decision] + * PLC: Decide which Concealment to use. Update pitch lags if needed */ + st->core = GetPLCModeDecision( st ); + } + + /*--------------------------------------------------------------------------------* + * LPC PARAMETERS + *--------------------------------------------------------------------------------*/ + + st->acelp_cfg.midLpc = 0; + + if ( !bfi ) + { + if ( hTcxDec->enableTcxLpc ) + { + int16_t tcx_lpc_cdk; + + if ( bfi && st->use_partial_copy && st->rf_frame_type == RF_TCXFD ) + { + tcx_lpc_cdk = tcxlpc_get_cdk( GENERIC ); + } + else + { + tcx_lpc_cdk = tcxlpc_get_cdk( st->coder_type ); + } + + mvr2r( st->lsf_old, &lsf[0], M ); + mvr2r( st->lsp_old, &lsp[0], M ); + + D_lsf_tcxlpc( param_lpc, &lsf[M], lspind, st->narrowBand, tcx_lpc_cdk, st->mem_MA ); + + lsf2lsp( &lsf[M], &lsp[M], M, st->sr_core ); + + lsf_update_memory( st->narrowBand, &lsf[M], st->mem_MA, st->mem_MA ); + mvr2r( &lsf[M], st->mem_AR, M ); + hTcxDec->envWeighted = 1; + + E_LPC_lsp_unweight( &lsp[M], lspnew_uw, lsfnew_uw, 1.0f / st->gamma ); + } + else + { + if ( hTcxDec->envWeighted ) + { + mvr2r( st->lspold_uw, st->lsp_old, M ); + mvr2r( st->lsfold_uw, st->lsf_old, M ); + hTcxDec->envWeighted = 0; + } + + lpc_unquantize( st, lsf, lsp, param_lpc, lspmid, lsfmid, AUDIO, &LSF_Q_prediction ); + + for ( k = 0; k < st->numlpc; ++k ) + { + mvr2r( &lsp[( k + 1 ) * M], &lspnew_uw[k * M], M ); + mvr2r( &lsf[( k + 1 ) * M], &lsfnew_uw[k * M], M ); + } + } + + /* PLC: [LPD: LPC concealment] built the moving average for the LPC concealment */ + for ( k = 0; k < st->numlpc; k++ ) + { + for ( i = 0; i < M; i++ ) + { + st->lsf_adaptive_mean[i] = ( st->lsfoldbfi1[i] + st->lsfoldbfi0[i] + lsfnew_uw[k * M + i] ) / 3; + st->lsfoldbfi1[i] = st->lsfoldbfi0[i]; + st->lsfoldbfi0[i] = lsfnew_uw[k * M + i]; + } + } + } + else + { + /* PLC: [LPD: LPC concealment] Conceal the LPC from the lost frame */ + const float *lsfBase; /* base for differential lsf coding */ + + if ( st->tcxonly == 0 || st->core < TCX_10_CORE ) + { + st->numlpc = 1; + } + else + { + st->numlpc = 2; + } + + if ( st->nbLostCmpt == 1 ) + { + mvr2r( st->lsf_old, st->old_lsf_q_cng, M ); + mvr2r( st->lsp_old, st->old_lsp_q_cng, M ); + } + + lsfBase = PlcGetlsfBase( st->lpcQuantization, st->narrowBand, st->sr_core ); + + dlpc_bfi( st->L_frame, lsfnew_uw, st->lsfold_uw, st->last_good, st->nbLostCmpt, st->mem_MA, st->mem_AR, &( st->stab_fac ), st->lsf_adaptive_mean, st->numlpc, st->lsf_cng, st->plcBackgroundNoiseUpdated, st->lsf_q_cng, st->old_lsf_q_cng, lsfBase ); + + hTcxDec->envWeighted = 0; + + mvr2r( st->lspold_uw, lsp, M ); + mvr2r( st->lsfold_uw, lsf, M ); + + for ( k = 0; k < st->numlpc; k++ ) + { + mvr2r( &lsfnew_uw[k * M], &lsf[( k + 1 ) * M], M ); + + lsf2lsp( &lsf[( k + 1 ) * M], &lsp[( k + 1 ) * M], M, st->sr_core ); + lsf2lsp( st->lsf_q_cng, st->lsp_q_cng, M, st->sr_core ); + + mvr2r( &lsp[( k + 1 ) * M], &lspnew_uw[k * M], M ); + } + } + + /*---------------------------------------------------------------* + * Rate switching + *---------------------------------------------------------------*/ + + if ( st->rate_switching_reset ) + { + mvr2r( &( lsf[M] ), &( lsf[0] ), M ); + mvr2r( &( lsp[M] ), &( lsp[0] ), M ); + mvr2r( &( lsf[M] ), st->lsf_old, M ); + mvr2r( &( lsp[M] ), st->lsp_old, M ); + mvr2r( &( lsf[M] ), lsfmid, M ); + mvr2r( &( lsp[M] ), lspmid, M ); + lsp2a_stab( st->lsp_old, st->old_Aq_12_8, M ); + } + + if ( st->enablePlcWaveadjust && bfi ) + { + st->hPlcInfo->nbLostCmpt++; + } + + /*--------------------------------------------------------------------------------* + * TD-TCX concealment + *--------------------------------------------------------------------------------*/ + + if ( st->core == ACELP_CORE ) + { + assert( bfi ); /*must only happen in BFI*/ + + if ( !st->tcxonly ) + { + /*LPC interpolation*/ + int_lsp( st->L_frame, &lsp[0], &lsp[M], Aq, M, interpol_frac_12k8, 0 ); + int_lsp( st->L_frame, st->old_lsp_q_cng, st->lsp_q_cng, st->Aq_cng, M, interpol_frac_12k8, 0 ); + } + + /* PLC: [TCX: TD PLC] */ + con_tcx( st, &synthFB[0], -1.f, NULL, 0, NULL ); + lerp( synthFB, synth, st->L_frame, hTcxDec->L_frameTCX ); + st->con_tcx = 1; + set_f( &st->mem_pitch_gain[2], st->lp_gainp, st->nb_subfr ); + + /* LPC for ACELP/BWE */ + if ( st->narrowBand || st->sr_core == INT_FS_12k8 || st->sr_core == INT_FS_16k ) + { + mvr2r( Aq, st->mem_Aq, st->nb_subfr * ( M + 1 ) ); + } + + /* PLC: [TCX: Tonal Concealment] */ + /* Signal that this frame is not TCX */ + if ( st->hTonalMDCTConc != NULL ) + { + TonalMDCTConceal_UpdateState( st->hTonalMDCTConc, 0, 0, 0, 0 ); + } + } + + /*--------------------------------------------------------------------------------* + * TCX20 + *--------------------------------------------------------------------------------*/ + + /* Set pointer to parameters */ + prm = param; + if ( st->core == TCX_20_CORE ) + { + /* Stability Factor */ + if ( !bfi ) + { + st->stab_fac = lsf_stab( &lsf[M], &lsf[0], 0, st->L_frame ); + } + + if ( hTcxDec->enableTcxLpc ) + { + /* Convert quantized lsp to A */ + lsp2a_stab( &lsp[M], Aq, M ); + } + else + { + if ( !st->tcxonly ) + { + if ( !bfi && st->prev_bfi && !( st->safety_net ) && st->rate_switching_reset ) + { + /* diffuse LPC power on rate switching*/ + RecLpcSpecPowDiffuseLc( &lsp[M], &lsp[0], &lsf[M], st, 0 ); + int_lsp( st->L_frame, &lsp[0], &lsp[M], Aq, M, interpol_frac_12k8, 0 ); + mvr2r( &lsf[M], lsfnew_uw, M ); + } + else + { + /* LPC Interpolation for TCX */ + E_LPC_int_lpc_tcx( &lsp[0], &lsp[M], Aq ); + } + } + else + { + lsp2a_stab( &lsp[M], Aq, M ); + } + } + + if ( !bfi && hTcxDec->tcx_lpc_shaped_ari ) + { + basop_E_LPC_f_lsp_a_conversion( lspind, Aind, M ); + } + + /* TCX decoder */ + decoder_tcx( st, prm, Aq, Aind, &synth[0], &synthFB[0], bfi, 0, sba_dirac_stereo_flag ); + } + + /*--------------------------------------------------------------------------------* + * TCX10 + *--------------------------------------------------------------------------------*/ + + if ( st->core == TCX_10_CORE ) + { + prm = NULL; /* just to avoid MSVC warnings */ + + for ( k = 0; k < 2; k++ ) + { + /* Set pointer to parameters */ + prm = param + ( k * DEC_NPRM_DIV ); + + /* Stability Factor */ + if ( !bfi ) + { + st->stab_fac = lsf_stab( &lsf[( k + 1 ) * M], &lsf[k * M], 0, st->L_frame ); + } + + lsp2a_stab( &lsp[( k + 1 ) * M], Aq, M ); + { + IGFDecRestoreTCX10SubFrameData( st->hIGFDec, k ); + } + + /* TCX decoder */ + decoder_tcx( st, prm, Aq, Aind, &synth[k * st->L_frame / 2], &synthFB[k * hTcxDec->L_frameTCX / 2], bfi, k, sba_dirac_stereo_flag ); + } + } + + /*--------------------------------------------------------------------------------* + * Post-processing + *--------------------------------------------------------------------------------*/ + + if ( st->core == TCX_10_CORE || st->core == TCX_20_CORE ) + { + if ( st->enablePlcWaveadjust || /* bfi */ + ( st->last_total_brate >= HQ_48k && /* recovery */ + st->last_codec_mode == MODE2 ) ) + { + /* waveform adjustment */ + concealment_signal_tuning( st, bfi, synthFB, st->last_core_bfi ); + + if ( ( bfi || st->prev_bfi ) && st->hPlcInfo->Pitch && st->hPlcInfo->concealment_method == TCX_NONTONAL ) + { + lerp( synthFB, synth, st->L_frame, hTcxDec->L_frameTCX ); + + if ( !bfi && st->prev_bfi ) + { + st->hPlcInfo->Pitch = 0; + } + } + } + + if ( !bfi && st->hTonalMDCTConc != NULL ) + { + TonalMDCTConceal_SaveTimeSignal( st->hTonalMDCTConc, synthFB, hTcxDec->L_frameTCX ); + } + + decoder_tcx_post( st, synth, synthFB, Aq, bfi, 0 ); + + if ( st->core == TCX_20_CORE ) + { + /* LPC Interpolation for BWE/post-processing */ + if ( st->narrowBand || st->sr_core == INT_FS_12k8 || st->sr_core == INT_FS_16k ) + { + int_lsp( st->L_frame, st->lspold_uw, lspnew_uw, Aq, M, interpol_frac_12k8, 0 ); + mvr2r( Aq, st->mem_Aq, st->nb_subfr * ( M + 1 ) ); + } + } + } + + /* PLC: [Common: Classification] */ + /* the classifier buffer is always updated if the sr is at + 16000 or below - the classification itself is just performed if(!st->tcxonly ) */ + if ( st->sr_core <= INT_FS_16k ) + { + if ( st->core == TCX_20_CORE || st->core == TCX_10_CORE || ( st->tcxonly && st->bfi ) ) + { + float pitch_C[4]; + + /* note: the classifier needs the pitch only for tcx_only == 0, i.e. not for TCX10 */ + set_f( pitch_C, floorf( st->old_fpitch + 0.5f ), 4 ); + + /* note: codec_mode is forced to MODE2, since FEC_clas_estim() considers only TCX being in Mode2*/ + FEC_clas_estim( synth, pitch_C, st->L_frame, st->tcxonly ? GENERIC : st->core_ext_mode, MODE2, st->mem_syn_clas_estim, &st->clas_dec, &st->lp_ener_bfi, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, hTcxLtpDec->tcxltp ? hTcxDec->tcxltp_last_gain_unmodified : -1.0f, st->narrowBand, CLASSIFIER_TCX, bfi, st->preemph_fac, st->tcxonly, st->last_core_brate, -1 ); + } + } + + /*--------------------------------------------------------------------------------* + * Updates + *--------------------------------------------------------------------------------*/ + + if ( bfi && st->last_core != ACELP_CORE ) + { + /* Update FEC_scale_syn parameters */ + if ( hTcxLtpDec->tcxltp_gain == 0 ) + { + fer_energy( st->L_frame, UNVOICED, synth, (float) ( st->L_frame / 2 ), &st->enr_old, st->L_frame ); + } + else + { + fer_energy( st->L_frame, st->clas_dec, synth, st->old_fpitch, &st->enr_old, st->L_frame ); + } + } + + if ( !bfi && st->clas_dec >= VOICED_TRANSITION && st->clas_dec < INACTIVE_CLAS ) + { + /* use latest LPC set */ + st->old_enr_LP = enr_1_Az( Aq, L_SUBFR ); + } + + /* Update past buffers */ + mvr2r( synth_buf + st->L_frame, hTcxDec->old_synth, hTcxDec->old_synth_len ); + mvr2r( hTcxDec->old_synthFB + hTcxDec->L_frameTCX - NS2SA( st->output_Fs, PH_ECU_MEM_NS ), hTcxDec->synth_history, NS2SA( st->output_Fs, PH_ECU_MEM_NS ) ); + mvr2r( synth_bufFB + hTcxDec->L_frameTCX, hTcxDec->old_synthFB, hTcxDec->old_synth_lenFB ); + mvr2r( st->hHQ_core->old_out + NS2SA( st->output_Fs, N_ZERO_MDCT_NS ), hTcxDec->old_synthFB + hTcxDec->old_synth_lenFB, NS2SA( st->output_Fs, PH_ECU_LOOKAHEAD_NS ) ); + + mvr2r( &lspnew_uw[( st->numlpc - 1 ) * M], st->lspold_uw, M ); + mvr2r( &lsfnew_uw[( st->numlpc - 1 ) * M], st->lsfold_uw, M ); + + if ( bfi == 1 ) + { + mvr2r( st->lspold_uw, st->lsp_old, M ); /* for recovery */ + mvr2r( st->lsfold_uw, st->lsf_old, M ); /* for recovery */ + } + else + { + mvr2r( &lsp[st->numlpc * M], st->lsp_old, M ); + mvr2r( &lsf[st->numlpc * M], st->lsf_old, M ); + } + mvr2r( st->lsp_q_cng, st->old_lsp_q_cng, M ); + mvr2r( st->lsf_q_cng, st->old_lsf_q_cng, M ); + + /* Update CNG parameters */ + if ( !st->tcxonly && st->hTdCngDec != NULL ) + { + /* update CNG parameters in active frames */ + if ( st->bwidth == NB && hTcxDec->enableTcxLpc && st->core != ACELP_CORE ) + { + float buf[L_LP], res[L_FRAME], A[M + 1], r[M + 1], tmp, lsptmp[M]; + assert( st->L_frame == L_FRAME ); + + mvr2r( synth + L_FRAME - L_LP, buf, L_LP ); + tmp = synth[L_FRAME - L_LP - 1]; + preemph( buf, st->preemph_fac, L_LP, &tmp ); + autocorr( buf, r, M, L_LP, LP_assym_window, 0, 0, 0 ); + lag_wind( r, M, INT_FS_12k8, LAGW_WEAK ); + lev_dur( A, r, M, NULL ); + a2lsp_stab( A, lsptmp, &lspnew_uw[0] ); + residu( A, M, buf + L_LP - L_FRAME, res, L_FRAME ); + + if ( st->hTdCngDec != NULL ) + { + cng_params_upd( lsptmp, res, st->L_frame, &st->hTdCngDec->ho_circ_ptr, st->hTdCngDec->ho_ener_circ, &st->hTdCngDec->ho_circ_size, st->hTdCngDec->ho_lsp_circ, DEC, st->hTdCngDec->ho_env_circ, NULL, NULL, NULL, st->last_active_brate, st->element_mode, st->hFdCngDec->hFdCngCom->CngBandwidth ); + } + } + else if ( st->hTdCngDec != NULL ) + { + cng_params_upd( &lsp[M], st->old_exc + L_EXC_MEM_DEC - st->L_frame, st->L_frame, &st->hTdCngDec->ho_circ_ptr, st->hTdCngDec->ho_ener_circ, &st->hTdCngDec->ho_circ_size, st->hTdCngDec->ho_lsp_circ, DEC, st->hTdCngDec->ho_env_circ, NULL, NULL, NULL, st->last_active_brate, st->element_mode, st->hFdCngDec->hFdCngCom->CngBandwidth ); + } + + /* Set 16k LSP flag for CNG buffer */ + st->hTdCngDec->ho_16k_lsp[st->hTdCngDec->ho_circ_ptr] = ( st->L_frame == L_FRAME ? 0 : 1 ); + } + st->last_is_cng = 0; + + /* Postfiltering */ + post_decoder( st, synth_buf, pit_gain, pitch, signal_out, st->p_bpf_noise_buf ); + + if ( signal_outFB ) + { + mvr2r( synthFB, signal_outFB, hTcxDec->L_frameTCX ); + } + + if ( !bfi ) + { + if ( st->enablePlcWaveadjust ) + { + st->hPlcInfo->nbLostCmpt = 0; + } + + if ( param[1 + NOISE_FILL_RANGES] != 0 ) + { + set_f( pitch_buf, hTcxLtpDec->tcxltp_pitch_int + (float) hTcxLtpDec->tcxltp_pitch_fr / (float) st->pit_res_max, NB_SUBFR16k ); + } + else + { + set_f( pitch_buf, L_SUBFR, NB_SUBFR16k ); + } + } + + if ( bfi ) + { + /*"LPD dec - All BFI"*/ + bitsRead = 0; /*to avoid empty counting */ + } + + /* updates */ + st->last_voice_factor = 0.0f; + st->last_coder_type = st->coder_type; + + /* -------------------------------------------------------------- * + * In FFT domain: perform noise estimation during active frames + * -------------------------------------------------------------- */ + + if ( st->hFdCngDec != NULL && ( st->sr_core == INT_FS_12k8 || st->sr_core == INT_FS_16k ) && st->total_brate <= MAX_ACELP_BRATE ) + { + noisy_speech_detection( st->hFdCngDec, st->VAD && st->m_frame_type == ACTIVE_FRAME, signal_out ); + + st->hFdCngDec->hFdCngCom->likelihood_noisy_speech = 0.99f * st->hFdCngDec->hFdCngCom->likelihood_noisy_speech + 0.01f * (float) st->hFdCngDec->hFdCngCom->flag_noisy_speech; + + st->lp_noise = st->hFdCngDec->lp_noise; + + if ( st->element_mode != IVAS_CPE_TD ) + { + if ( ivas_format == ISM_FORMAT ) + { + float buffer[L_FRAME16k]; + lerp( signal_outFB, buffer, st->L_frame, hTcxDec->L_frameTCX ); + ApplyFdCng( buffer, NULL, NULL, NULL, st, st->bfi, 0 ); + } + else + { + ApplyFdCng( signal_out, NULL, NULL, NULL, st, st->bfi, 0 ); + } + } + + /* Generate additional comfort noise to mask potential coding artefacts */ + if ( st->m_frame_type == ACTIVE_FRAME && st->flag_cna && !st->cna_dirac_flag ) + { + if ( st->element_mode == IVAS_CPE_TD && nchan_out == 2 ) + { + if ( st->element_mode != last_element_mode ) + { + /* Clear memory for secondary channel CNA */ + set_f( hStereoCng->olapBufferSynth22, 0.0f, st->hFdCngDec->hFdCngCom->frameSize / 2 ); + } + expand_range( st->hFdCngDec->msPsd, psd_part, st->hFdCngDec->nFFTpart_shaping ); + scalebands( psd_part, st->hFdCngDec->part_shaping, st->hFdCngDec->nFFTpart_shaping, st->hFdCngDec->midband_shaping, st->hFdCngDec->nFFTpart_shaping, st->hFdCngDec->hFdCngCom->stopFFTbin - st->hFdCngDec->hFdCngCom->startBand, psd, 1 ); + generate_stereo_masking_noise( signal_out, st, hStereoTD, flag_sec_CNA, 0, hStereoCng, nchan_out ); + } + else if ( st->element_mode != IVAS_CPE_DFT ) + { + generate_masking_noise( signal_out, st->hFdCngDec->hFdCngCom, st->hFdCngDec->hFdCngCom->frameSize, 0, 0, 0, st->element_mode, hStereoCng, nchan_out ); + } + } + + if ( st->element_mode == IVAS_CPE_TD && st->idchan == 0 ) + { + ApplyFdCng( signal_out, NULL, NULL, NULL, st, st->bfi, 0 ); + } + } + + + + pop_wmops(); + return; +} + + +/*-----------------------------------------------------------------* + * Function dec_prm_tcx() + * + * Decode TCX parameters + *-----------------------------------------------------------------*/ + +static void dec_prm_tcx( + Decoder_State *st, /* i/o: decoder memory state */ + int16_t param[], /* o : decoded parameters */ + int16_t param_lpc[], /* o : LPC parameters */ + int16_t *total_nbbits, /* i/o: number of bits / decoded bits */ + const int16_t last_element_mode, /* i : last element mode */ + int16_t *bitsRead /* o : number of read bits */ +) +{ + int16_t start_bit_pos, bits_common; + CONTEXT_HM_CONFIG hm_cfg; + int16_t indexBuffer[N_MAX + 1]; + + assert( st->mdct_sw == MODE1 ); + + /*--------------------------------------------------------------------------------* + * INIT + *--------------------------------------------------------------------------------*/ + + hm_cfg.indexBuffer = indexBuffer; + if ( st->element_mode != IVAS_CPE_MDCT ) + { + st->bits_frame_core = (int16_t) ( ( st->total_brate / FRAMES_PER_SEC ) - st->next_bit_pos ); + } + start_bit_pos = st->next_bit_pos; + + /* Init LTP data */ + st->hTcxDec->tcx_hm_LtpPitchLag = -1; + st->hTcxLtpDec->tcxltp_gain = 0.0f; + + /*--------------------------------------------------------------------------------* + * header + *--------------------------------------------------------------------------------*/ + + /* Modes (ACE_GC, ACE_UC, TCX20, TCX10...) */ + getTCXMode( st, st, 0 /* <- MCT_flag */ ); + + /* last_core for error concealment */ + if ( !st->use_partial_copy && st->element_mode != IVAS_CPE_MDCT ) + { + st->last_core_from_bs = get_next_indice( st, 1 ); /* Store decoder memory of last_core */ + if ( st->last_core == ACELP_CORE && st->last_core_from_bs != ACELP_CORE ) + { + /* A mismatch between the memory and the last_core + from the bitstream indicates a frame was lost. If prev_bfi is + not set the frame loss occured during CNG and the prev_bfi needs to be set. */ + st->prev_bfi = 1; + } + + /* possible need for reconfiguration can only be decided correctly once last_core_from_bs has been decoded */ + if ( ( st->last_core != st->last_core_from_bs ) && ( st->last_core_from_bs != TCX_20_CORE && st->last_core_from_bs != TCX_10_CORE && !( st->prev_bfi == 1 && st->last_core_from_bs == ACELP_CORE && st->last_con_tcx == 1 ) ) ) + { + stereo_tcx_dec_mode_switch_reconf( st, 0, last_element_mode ); + } + + st->last_core = st->last_core_from_bs; + + /*for TCX 10 force last_core to be TCX since ACELP as previous core is forbidden*/ + if ( st->core == TCX_10_CORE ) + { + st->last_core = TCX_20_CORE; + } + } + + if ( !st->use_partial_copy ) + { + if ( st->element_mode != IVAS_CPE_MDCT ) + { + getTCXWindowing( st->core, st->last_core, st->element_mode, st->hTcxCfg, st ); + } + st->flagGuidedAcelp = 0; + + if ( st->dec_glr ) + { + st->dec_glr_idx = -1; + } + } + + + /*--------------------------------------------------------------------------------* + * LPC parameters + *--------------------------------------------------------------------------------*/ + + getLPCparam( st, param_lpc, st, -1, 0 ); + + bits_common = st->next_bit_pos - start_bit_pos; + + + /*--------------------------------------------------------------------------------* + * TCX20/10 parameters + *--------------------------------------------------------------------------------*/ + + if ( st->use_partial_copy == 0 ) + { + getTCXparam( st, st, hm_cfg, param, bits_common, start_bit_pos, NULL, NULL, NULL, -1 ); + } + + if ( !st->use_partial_copy ) + { + if ( *total_nbbits - bitsRead[0] < ( st->next_bit_pos - start_bit_pos ) ) + { + st->BER_detect = 1; + st->next_bit_pos = start_bit_pos + *total_nbbits - bitsRead[0]; + } + + bitsRead[0] = st->next_bit_pos - start_bit_pos; + } + + return; +} + +/*-----------------------------------------------------------------* + * Function stereo_tcx_dec_mode_switch_reconf() + * + * Reconfigure stereo TCX parameters + *-----------------------------------------------------------------*/ + +static void stereo_tcx_dec_mode_switch_reconf( + Decoder_State *st, /* i/o: decoder state structure */ + const int16_t MCT_flag, /* i : hMCT handle allocated (1) or not (0)*/ + const int16_t last_element_mode /* i : element mode of previous frame */ +) +{ + int16_t frame_size_index; + + st->rate_switching_init = 1; + + /* Identify frame type - TCX Reconfiguration */ + for ( frame_size_index = 0; frame_size_index < FRAME_SIZE_NB; frame_size_index++ ) + { + if ( frame_size_index < FRAME_SIZE_NB - 1 ) + { + if ( ( FrameSizeConfig[frame_size_index].frame_bits <= st->bits_frame_nominal ) && ( FrameSizeConfig[frame_size_index + 1].frame_bits > st->bits_frame_nominal ) ) + { + break; + } + } + else + { + if ( FrameSizeConfig[frame_size_index].frame_bits <= st->bits_frame_nominal ) + { + break; + } + } + } + + /* Reconfigure Core */ + mode_switch_decoder_LPD( st, st->bwidth, st->bits_frame_nominal * FRAMES_PER_SEC, st->last_bits_frame_nominal * FRAMES_PER_SEC, frame_size_index, MCT_flag, last_element_mode ); + + return; +} diff --git a/lib_dec/ivas_td_low_rate_dec.c b/lib_dec/ivas_td_low_rate_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..646c6561d6e6c82394daec981ccf5eef0d237faa --- /dev/null +++ b/lib_dec/ivas_td_low_rate_dec.c @@ -0,0 +1,306 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "cnst.h" +#include "stat_enc.h" +#include "rom_com.h" +#include "ivas_rom_com.h" +#include "ivas_cnst.h" +#include "prot.h" +#include "ivas_prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * tdm_low_rate_dec() + * + * Decode secondary channel of TD Stereo with a low-bitrate decoder + *-------------------------------------------------------------------*/ + +void tdm_low_rate_dec( + Decoder_State *st, /* i/o: decoder static memory */ + float dct_epit[], /* o : GSC excitation in DCT domain */ + float *tmp_noise, /* o : long term temporary noise energy */ + float *pitch_buf, /* o : floating pitch values for each subframe */ + float *voice_factors, /* o : voicing factors */ + float *exc, /* i/o: adapt. excitation exc */ + float *exc2, /* i/o: adapt. excitation/total exc */ + float *bwe_exc, /* o : excitation for SWB TBE */ + const float *lsf_new /* i : ISFs at the end of the frame */ +) +{ + int16_t tmp_nb_bits_tot, pit_band_idx; + GSC_DEC_HANDLE hGSCDec; + int16_t Diff_len, nb_subfr; + int16_t attack_flag; + int16_t last_bin; + float exc_wo_nf[L_FRAME]; + + hGSCDec = st->hGSCDec; + + /*---------------------------------------------------------------* + * Initialization + *---------------------------------------------------------------*/ + + nb_subfr = 2; + + st->GSC_IVAS_mode = 0; + st->GSC_noisy_speech = 1; + hGSCDec->noise_lev = 14; + + pit_band_idx = 10 + BAND1k2; + hGSCDec->Last_GSC_pit_band_idx = pit_band_idx; + + st->tilt_code = 0.0f; + set_f( exc, 0, L_FRAME ); + set_f( dct_epit, 0, L_FRAME ); + set_f( pitch_buf, L_SUBFR, NB_SUBFR ); + st->bpf_off = 1; + + st->bfi_pitch = (int16_t) ( mean( pitch_buf, 4 ) + 0.5f ); + st->bfi_pitch_frame = L_FRAME; + Diff_len = L_FRAME / 2; + st->bpf_off = 0; + attack_flag = 0; + + /*--------------------------------------------------------------------------------------* + * GSC decoder + *--------------------------------------------------------------------------------------*/ + + /* find the current total number of bits used */ + tmp_nb_bits_tot = st->next_bit_pos; + + if ( st->element_mode == IVAS_CPE_TD ) + { + tmp_nb_bits_tot += TDM_SIGNAL_BITS_READ_FROM_THE_END_OF_BS; + } + + if ( st->tdm_LRTD_flag == 1 ) + { + tmp_nb_bits_tot -= STEREO_BITS_TCA; + } + + if ( st->extl_brate_orig > 0 ) + { + /* subtract 1 bit for TBE/BWE BWE flag (bit counted in extl_brate) */ + tmp_nb_bits_tot--; + } + + gsc_dec( st, dct_epit, pit_band_idx, Diff_len, tmp_nb_bits_tot, nb_subfr, st->coder_type, &last_bin, lsf_new, exc_wo_nf, tmp_noise ); + + /*--------------------------------------------------------------------------------------* + * iDCT transform + *--------------------------------------------------------------------------------------*/ + + edct( dct_epit, exc, L_FRAME, IVAS_CPE_TD ); + + edct( exc_wo_nf, exc_wo_nf, L_FRAME, IVAS_CPE_TD ); + + /*----------------------------------------------------------------------* + * Remove potential pre-echo in case an onset has been detected + *----------------------------------------------------------------------*/ + + pre_echo_att( &hGSCDec->Last_frame_ener, exc, attack_flag, st->last_coder_type, st->L_frame ); + + + /*--------------------------------------------------------------------------------------* + * Update BWE excitation + *--------------------------------------------------------------------------------------*/ + + set_f( voice_factors, 0.0f, NB_SUBFR16k ); + + if ( st->hBWE_TD != NULL ) + { + if ( st->tdm_LRTD_flag ) + { + interp_code_5over2( exc, bwe_exc, L_FRAME ); + } + else + { + set_f( bwe_exc, 0, L_FRAME32k ); + } + } + + /*--------------------------------------------------------------------------------------* + * Updates + *--------------------------------------------------------------------------------------*/ + + mvr2r( exc, exc2, L_FRAME ); + mvr2r( exc_wo_nf, exc, L_FRAME ); + + /*--------------------------------------------------------------------------------------* + * Channel aware mode parameters + *--------------------------------------------------------------------------------------*/ + + set_f( st->tilt_code_dec, 0, NB_SUBFR16k ); + + return; +} + + +/*---------------------------------------------------------------------* + * decod_gen_2sbfr() + * + * Decode generic (GC), 2 subframes mode + *---------------------------------------------------------------------*/ + +void decod_gen_2sbfr( + Decoder_State *st, /* i/o: decoder static memory */ + const int16_t sharpFlag, /* i : formant sharpening flag */ + const float *Aq, /* i : LP filter coefficient */ + float *pitch_buf, /* o : floating pitch values for each subframe */ + float *voice_factors, /* o : voicing factors */ + float *exc, /* i/o: adapt. excitation exc */ + float *exc2, /* i/o: adapt. excitation/total exc */ + float *bwe_exc, /* o : excitation for SWB TBE */ + float *gain_buf, /* o : floating pitch gain for each subframe */ + const int16_t tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag */ + const float tdm_Pri_pitch_buf[] /* i : pitch values for primary channel */ +) +{ + int16_t T0, T0_frac, T0_min, T0_max; /* integer pitch variables */ + float gain_pit = 0.0f; /* pitch gain */ + float gain_code = 0.0f; /* gain/normalized gain of the algebraic excitation */ + float norm_gain_code = 0.0f; /* normalized gain of the algebraic excitation */ + float gain_inov = 0; /* Innovation gain */ + float gains_mem[2 * ( NB_SUBFR - 1 )]; /* pitch gain and code gain from previous subframes */ + float voice_fac; /* voicing factor */ + float code[2 * L_SUBFR]; /* algebraic codevector */ + const float *p_Aq; /* Pointer to frame LP coefficient */ + float *pt_pitch; /* pointer to floating pitch */ + int16_t i_subfr, i; /* tmp variables */ + int16_t L_frame; + int16_t pitch_limit_flag; + float error; + + /*------------------------------------------------------------------* + * Initialization + *------------------------------------------------------------------*/ + + L_frame = L_FRAME; + + T0 = PIT_MIN; + T0_frac = 0; + error = 0.0f; + + /*------------------------------------------------------------------* + * ACELP subframe loop + *------------------------------------------------------------------*/ + + p_Aq = Aq; /* pointer to interpolated LPC parameters */ + pt_pitch = pitch_buf; /* pointer to the pitch buffer */ + + for ( i_subfr = 0; i_subfr < L_frame; i_subfr += 2 * L_SUBFR ) + { + /*----------------------------------------------------------------------* + * Decode pitch lag + *----------------------------------------------------------------------*/ + + *pt_pitch = pit_decode( st, st->core_brate, 0, L_frame, i_subfr, GENERIC, &pitch_limit_flag, &T0, &T0_frac, &T0_min, &T0_max, 2 * L_SUBFR, tdm_Pitch_reuse_flag, tdm_Pri_pitch_buf ); + + tbe_celp_exc( st->element_mode, st->idchan, bwe_exc, L_frame, 2 * L_SUBFR, i_subfr, T0, T0_frac, &error, st->tdm_LRTD_flag ); + + /*--------------------------------------------------------------* + * Find the adaptive codebook vector + *--------------------------------------------------------------*/ + + pred_lt4( &exc[i_subfr], &exc[i_subfr], T0, T0_frac, 2 * L_SUBFR + 1, inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + + /*--------------------------------------------------------------* + * LP filtering of the adaptive excitation + *--------------------------------------------------------------*/ + + lp_filt_exc_dec( st, MODE1, i_subfr, 2 * L_SUBFR, L_frame, st->acelp_cfg.ltf_mode, exc ); + + /*--------------------------------------------------------------* + * Innovation decoding + *--------------------------------------------------------------*/ + + inov_decode( st, st->core_brate, 0, L_frame, sharpFlag, i_subfr, p_Aq, st->tilt_code, *pt_pitch, code, 2 * L_SUBFR ); + + /*--------------------------------------------------------------* + * Gain decoding + * Estimate spectrum tilt and voicing + *--------------------------------------------------------------*/ + + gain_dec_lbr( st, GENERIC, i_subfr, code, &gain_pit, &gain_code, &gain_inov, &norm_gain_code, gains_mem, 2 * L_SUBFR ); + st->tilt_code = est_tilt( exc + i_subfr, gain_pit, code, gain_code, &voice_fac, 2 * L_SUBFR, 0 ); + + /* update LP filtered gains for the case of frame erasures */ + lp_gain_updt( i_subfr, gain_pit, norm_gain_code, &st->lp_gainp, &st->lp_gainc, L_frame ); + lp_gain_updt( i_subfr + L_SUBFR, gain_pit, norm_gain_code, &st->lp_gainp, &st->lp_gainc, L_frame ); + + /*----------------------------------------------------------------------* + * Find the total excitation + *----------------------------------------------------------------------*/ + + for ( i = 0; i < 2 * L_SUBFR; i++ ) + { + exc2[i + i_subfr] = gain_pit * exc[i + i_subfr]; + exc[i + i_subfr] = exc2[i + i_subfr] + gain_code * code[i]; + } + + /*-----------------------------------------------------------------* + * Prepare TBE excitation + *-----------------------------------------------------------------*/ + + prep_tbe_exc( L_frame, L_SUBFR, i_subfr, gain_pit, gain_code, code, voice_fac, &voice_factors[i_subfr / L_SUBFR], bwe_exc, 0, NULL, T0, GENERIC, st->core_brate, st->element_mode, st->idchan, st->hBWE_TD != NULL, st->tdm_LRTD_flag ); + + voice_factors[i_subfr / L_SUBFR + 1] = voice_factors[i_subfr / L_SUBFR]; + + /*----------------------------------------------------------------* + * Excitation enhancements (update of total excitation signal) + * called twice because adapting it to double the subfr length would need lot of modifications + *----------------------------------------------------------------*/ + + enhancer( MODE1, st->core_brate, -1, 0, GENERIC, L_frame, voice_fac, st->stab_fac, norm_gain_code, gain_inov, &st->gc_threshold, code, exc2 + i_subfr, gain_pit, st->dispMem ); + + enhancer( MODE1, st->core_brate, -1, 0, GENERIC, L_frame, voice_fac, st->stab_fac, norm_gain_code, gain_inov, &st->gc_threshold, code + L_SUBFR, exc2 + i_subfr + L_SUBFR, gain_pit, st->dispMem ); + + p_Aq += 2 * ( M + 1 ); + + pt_pitch++; + *pt_pitch = *( pt_pitch - 1 ); + pt_pitch++; + + gain_buf[i_subfr / L_SUBFR] = gain_pit; + gain_buf[( i_subfr + L_SUBFR ) / L_SUBFR] = gain_pit; + st->tilt_code_dec[i_subfr / L_SUBFR] = st->tilt_code; + st->tilt_code_dec[( i_subfr + L_SUBFR ) / L_SUBFR] = st->tilt_code; + } + + /* SC-VBR */ + st->prev_gain_pit_dec = gain_pit; + + return; +} diff --git a/lib_dec/ivas_vbap.c b/lib_dec/ivas_vbap.c new file mode 100644 index 0000000000000000000000000000000000000000..87bf388311999537485b71b254664e870c21b47f --- /dev/null +++ b/lib_dec/ivas_vbap.c @@ -0,0 +1,1934 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include +#include +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_stat_dec.h" +#include "wmc_auto.h" + +/*-----------------------------------------------------------------------* + * Local constants + *-----------------------------------------------------------------------*/ + +/* 128 is maximum num_speaker_nodes number. This relates to memory optimization and maximum of triplets: + - triplet indices are unsigned_char (see below structs) --> max triplets is 256 + - num_speaker_nodes_internal = num_speaker_nodes + 2 (potential virtual node channels, bottom and top) + - max_num_triplets = 256 = (max_num_ls_internal - 2) * 2 = (max_num_ls) * 2 + --> max_num_ls = 128 + */ +#define VBAP_MAX_NUM_SPEAKER_NODES 128 +#define VBAP_MAX_NUM_TRIPLETS 256 +#define VBAP_EPSILON 0.001f /* The fairly large epsilon is for detecting planes etc and accounts for rounding issues */ +#define VBAP_MAX_PLANES 50 +#define VBAP_MAX_HORIZONTAL_GAP_FOR_PLANE_DETECTION 140.0f +/* If a speaker node is found + - above VBAP_NO_VIRTUAL_SPEAKER_NODE_ELE_LIMIT, no virtual node is used + - above VBAP_DISTRIBUTE_VIRTUAL_SPEAKER_NODE_ELE_LIMIT, energy-spreading virtual node is used + - not above VBAP_DISTRIBUTE_VIRTUAL_SPEAKER_NODE_ELE_LIMIT, energy-omitting virtual node is used + Same applies for both elevations and inclinations, i.e., the two half-spheres. */ +#define VBAP_NO_VIRTUAL_SPEAKER_NODE_ELE_LIMIT 45.0f +#define VBAP_DISTRIBUTE_VIRTUAL_SPEAKER_NODE_ELE_LIMIT 20.0f +#define VBAP_VIRTUAL_BACK_ELE_LIMIT 45.0f +#define VBAP_NOT_VALID_CONNECTION ( -1 ) + +/* Maximum azimuth gap between speaker nodes for detecting zero elevation horizontal plane */ +#define VBAP_MAX_HORIZONTAL_GAP 170u + +#define VBAP_SEARCH_SECTOR_SIZE ( 360.0f / ( VBAP_NUM_SEARCH_SECTORS ) ) + + +enum VirtualSpeakerNodeType +{ + NO_VIRTUAL_SPEAKER_NODE, + VIRTUAL_SPEAKER_NODE_DISCARD_ENERGY, + VIRTUAL_SPEAKER_NODE_DISTRIBUTE_ENERGY +}; + +enum ConnectionClass +{ + REGULAR_CONNECTION, + ELEVATED_PLANE_THIN_TRIANGLE_CONNECTION, + CONNECTION_WITH_SPEAKER_NODE_BEHIND +}; + +typedef struct connection_option +{ + int16_t chA; + int16_t chB; + float arc; + float arc_weighted; +} ConnectionOption; + +enum SpeakerNodeGroup +{ + SPEAKER_NODE_BOTTOM_HALF, + SPEAKER_NODE_HORIZONTAL, + SPEAKER_NODE_TOP_HALF, + SPEAKER_NODE_BACK, + SPEAKER_NODE_ALL +}; + +/* Defines a single speaker node */ +typedef struct vbap_speaker_node_structure +{ + float azi_deg; + float ele_deg; + float unit_vec[3]; + enum SpeakerNodeGroup group; + +} VBAP_SPEAKER_NODE; + + +/*-----------------------------------------------------------------------* + * Local function prototypes + *-----------------------------------------------------------------------*/ + +static uint8_t vector_matrix_multiply_3x3( const float *src_vector, float matrix[3][3], float *result ); + +static void init_speaker_node_direction_data( VBAP_SPEAKER_NODE *speaker_node_data, const float *speaker_node_azi_deg, const float *speaker_node_ele_deg, const int16_t num_speaker_nodes ); + +static int16_t determine_virtual_surface_triplets( const int16_t num_speaker_nodes, const VBAP_SPEAKER_NODE *speaker_node_data, int16_t connections[][2], const int16_t max_num_connections, VBAP_VS_TRIPLET *triplets, int16_t initial_search_indices[VBAP_NUM_SEARCH_SECTORS], enum SpeakerNodeGroup allowed_group ); + +static void determine_initial_search_indices( const int16_t num_triplets, const float triplet_azidegs[VBAP_MAX_NUM_TRIPLETS], int16_t initial_search_indices[VBAP_NUM_SEARCH_SECTORS] ); + +static ivas_error determine_connections( const int16_t num_speaker_nodes, const VBAP_SPEAKER_NODE *speaker_node_data, int16_t connections[][2], const int16_t max_num_connections, int16_t *group1_count, int16_t *group2_start, int16_t *group2_count ); + +static void formulate_horizontal_connections( const VBAP_SPEAKER_NODE *speaker_node_data, const int16_t num_speaker_nodes, int16_t connections[][2], int16_t *connection_write_index ); + +static ivas_error get_half_sphere_connection_options( const VBAP_SPEAKER_NODE *speaker_node_data, const enum SpeakerNodeGroup group, const int16_t num_speaker_nodes, const int16_t num_non_crossing_planes, const float *non_crossing_plane_elevation_deg, ConnectionOption **connection_options_pr, int16_t *num_connection_options ); + +static ivas_error formulate_half_sphere_connections( const VBAP_SPEAKER_NODE *speaker_node_data, const int16_t num_speaker_nodes, const enum SpeakerNodeGroup group, int16_t connections[][2], int16_t *connection_write_index, const int16_t max_num_connections, const int16_t num_non_crossing_planes, const float *non_crossing_plane_elevation_deg ); + +static int16_t determine_non_crossing_planes( const int16_t num_speaker_nodes, const VBAP_SPEAKER_NODE *node_data, float *non_crossing_plane_elevation_deg ); + +static enum VirtualSpeakerNodeType check_need_of_virtual_speaker_node( VBAP_HANDLE hVBAPdata, const float *speaker_node_azi_deg, const float *speaker_node_ele_deg, enum SpeakerNodeGroup group ); + +static int16_t determine_best_triplet_and_gains( VBAP_SEARCH_STRUCT *search_struct, const float panning_unit_vec[3], const int16_t azi_deg, float gains[3] ); + +static void determine_virtual_speaker_node_division_gains( const int16_t virtual_speaker_node_index, float *virtual_node_division_gains, int16_t connections[][2], const enum VirtualSpeakerNodeType type, const int16_t max_num_connections, const int16_t num_speaker_nodes, const int16_t use_object_mode ); + +static void reorder_triplets( VBAP_VS_TRIPLET *triplets, const int16_t *target_order, const int16_t num_triplets ); + + +/*-------------------------------------------------------------------------* + * vbap_init_data() + * + * Initialize VBAP data structure for the speaker node set + *-------------------------------------------------------------------------*/ + +ivas_error vbap_init_data( + VBAP_HANDLE *hVBAPdata, /* i/o: handle for VBAP data structure that will be initialized */ + const float *speaker_node_azi_deg, /* i : vector of speaker node azimuths (positive left) */ + const float *speaker_node_ele_deg, /* i : vector of speaker node elevations (positive up) */ + const int16_t num_speaker_nodes, /* i : number of speaker nodes in the set */ + const IVAS_FORMAT ivas_format /* i : IVAS format */ +) +{ + /* Variables */ + int16_t connections[VBAP_MAX_NUM_SPEAKER_NODES][2]; + int16_t max_num_connections; + int16_t is_success; + int16_t connection_group1_count; + int16_t connection_group2_start; + int16_t connection_group2_count; + enum VirtualSpeakerNodeType virtual_top_type; + enum VirtualSpeakerNodeType virtual_bottom_type; + enum VirtualSpeakerNodeType virtual_back_type; + float speaker_node_azi_deg_internal[VBAP_MAX_NUM_SPEAKER_NODES]; + float speaker_node_ele_deg_internal[VBAP_MAX_NUM_SPEAKER_NODES]; + VBAP_SPEAKER_NODE speaker_node_data[VBAP_MAX_NUM_SPEAKER_NODES]; + VBAP_DATA *vbap; + ivas_error error; + + push_wmops( "vbap_init" ); + + /* Basic init checks */ + /* If the requested layout is invalid, hVBAPdata is set to NULL and the signal will + * be distributed with an equal gain into all output channels. + * The surrounding code needs to handle the NULL pointer properly. */ + if ( num_speaker_nodes > VBAP_MAX_NUM_SPEAKER_NODES || num_speaker_nodes < 3 ) + { + hVBAPdata = NULL; + pop_wmops(); + return IVAS_ERR_OK; + } + + if ( !speaker_node_azi_deg || !speaker_node_ele_deg ) + { + hVBAPdata = NULL; + return IVAS_ERR_OK; + } + + /* Allocate VBAP structure */ + if ( ( vbap = (VBAP_HANDLE) malloc( sizeof( VBAP_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for VBAP data\n" ) ); + } + + is_success = 1; + vbap->bottom_virtual_speaker_node_index = -1; + vbap->top_virtual_speaker_node_index = -1; + vbap->back_virtual_speaker_node_index = -1; + vbap->bottom_virtual_speaker_node_division_gains = NULL; + vbap->top_virtual_speaker_node_division_gains = NULL; + vbap->back_virtual_speaker_node_division_gains = NULL; + vbap->object_mode_bottom_virtual_speaker_node_division_gains = NULL; + vbap->object_mode_top_virtual_speaker_node_division_gains = NULL; + vbap->object_mode_back_virtual_speaker_node_division_gains = NULL; + vbap->num_speaker_nodes = num_speaker_nodes; + vbap->num_speaker_nodes_internal = num_speaker_nodes; + + /* Check if the speaker node setup needs a virtual top or bottom node + (function also increments vbap->num_speaker_nodes_internal when necessary) */ + virtual_bottom_type = check_need_of_virtual_speaker_node( vbap, speaker_node_azi_deg, speaker_node_ele_deg, SPEAKER_NODE_BOTTOM_HALF ); + virtual_top_type = check_need_of_virtual_speaker_node( vbap, speaker_node_azi_deg, speaker_node_ele_deg, SPEAKER_NODE_TOP_HALF ); + virtual_back_type = check_need_of_virtual_speaker_node( vbap, speaker_node_azi_deg, speaker_node_ele_deg, SPEAKER_NODE_BACK ); + + /* Init internal speaker node configuration, which is the original configuration + potentially appended with virtual top and/or bottom loudspeakers */ + mvr2r( speaker_node_azi_deg, speaker_node_azi_deg_internal, num_speaker_nodes ); + mvr2r( speaker_node_ele_deg, speaker_node_ele_deg_internal, num_speaker_nodes ); + + if ( is_success && virtual_bottom_type != NO_VIRTUAL_SPEAKER_NODE ) + { + if ( ( vbap->bottom_virtual_speaker_node_division_gains = (float *) malloc( num_speaker_nodes * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for VBAP data\n" ) ); + } + set_zero( vbap->bottom_virtual_speaker_node_division_gains, num_speaker_nodes ); + is_success &= vbap->bottom_virtual_speaker_node_division_gains != NULL; + + if ( ivas_format == MASA_ISM_FORMAT ) + { + if ( ( vbap->object_mode_bottom_virtual_speaker_node_division_gains = (float *) malloc( num_speaker_nodes * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for VBAP data\n" ) ); + } + set_zero( vbap->object_mode_bottom_virtual_speaker_node_division_gains, num_speaker_nodes ); + is_success &= vbap->object_mode_bottom_virtual_speaker_node_division_gains != NULL; + } + + speaker_node_azi_deg_internal[vbap->bottom_virtual_speaker_node_index] = 0.0f; + speaker_node_ele_deg_internal[vbap->bottom_virtual_speaker_node_index] = -90.0f; + } + + if ( is_success && virtual_top_type != NO_VIRTUAL_SPEAKER_NODE ) + { + if ( ( vbap->top_virtual_speaker_node_division_gains = (float *) malloc( num_speaker_nodes * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for VBAP data\n" ) ); + } + set_zero( vbap->top_virtual_speaker_node_division_gains, num_speaker_nodes ); + is_success &= vbap->top_virtual_speaker_node_division_gains != NULL; + + if ( ivas_format == MASA_ISM_FORMAT ) + { + if ( ( vbap->object_mode_top_virtual_speaker_node_division_gains = (float *) malloc( num_speaker_nodes * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for VBAP data\n" ) ); + } + set_zero( vbap->object_mode_top_virtual_speaker_node_division_gains, num_speaker_nodes ); + is_success &= vbap->object_mode_top_virtual_speaker_node_division_gains != NULL; + } + + speaker_node_azi_deg_internal[vbap->top_virtual_speaker_node_index] = 0.0f; + speaker_node_ele_deg_internal[vbap->top_virtual_speaker_node_index] = 90.0f; + } + + if ( is_success && virtual_back_type != NO_VIRTUAL_SPEAKER_NODE ) + { + if ( ( vbap->back_virtual_speaker_node_division_gains = (float *) malloc( num_speaker_nodes * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for VBAP data\n" ) ); + } + set_zero( vbap->back_virtual_speaker_node_division_gains, num_speaker_nodes ); + is_success &= vbap->back_virtual_speaker_node_division_gains != NULL; + + if ( ivas_format == MASA_ISM_FORMAT ) + { + if ( ( vbap->object_mode_back_virtual_speaker_node_division_gains = (float *) malloc( num_speaker_nodes * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for VBAP data\n" ) ); + } + set_zero( vbap->object_mode_back_virtual_speaker_node_division_gains, num_speaker_nodes ); + is_success &= vbap->object_mode_back_virtual_speaker_node_division_gains != NULL; + } + speaker_node_azi_deg_internal[vbap->back_virtual_speaker_node_index] = 180.0f; + speaker_node_ele_deg_internal[vbap->back_virtual_speaker_node_index] = 0.0f; + } + + init_speaker_node_direction_data( speaker_node_data, speaker_node_azi_deg_internal, speaker_node_ele_deg_internal, vbap->num_speaker_nodes_internal ); + + /* Allocate and determine node-node connections */ + max_num_connections = ( vbap->num_speaker_nodes_internal - 2 ) * 3; /* Theoretical maximum */ + + if ( ( error = determine_connections( vbap->num_speaker_nodes_internal, speaker_node_data, connections, max_num_connections, &connection_group1_count, &connection_group2_start, &connection_group2_count ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Allocate and determine virtual surface speaker node triplets */ + if ( is_success ) + { + int16_t ch; + int16_t speaker_nodes_group1_internal = 0; + int16_t speaker_nodes_group2_internal = 0; + int16_t speaker_nodes_horiz_internal = 0; + uint8_t loop_done = 0; + + /* Count nodes in different groups to reserve correct memory */ + for ( ch = 0; ch < vbap->num_speaker_nodes_internal && !loop_done; ch++ ) + { + switch ( speaker_node_data[ch].group ) + { + case SPEAKER_NODE_ALL: + /* If there is even one speaker belonging to "all" group, then all speakers belong to the "all" group. + * We can skip further counts here. */ + speaker_nodes_group1_internal = vbap->num_speaker_nodes_internal; + loop_done = 1; + break; + case SPEAKER_NODE_BOTTOM_HALF: + speaker_nodes_group1_internal++; + break; + case SPEAKER_NODE_TOP_HALF: + speaker_nodes_group2_internal++; + break; + case SPEAKER_NODE_HORIZONTAL: + case SPEAKER_NODE_BACK: + speaker_nodes_group1_internal++; + speaker_nodes_group2_internal++; + speaker_nodes_horiz_internal++; + break; + } + } + + if ( ( vbap->search_struct[0].triplets = (VBAP_VS_TRIPLET *) malloc( ( ( speaker_nodes_group1_internal - 2 ) * 2 - ( max( 0, ( speaker_nodes_horiz_internal - 2 ) ) ) ) * sizeof( VBAP_VS_TRIPLET ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for VBAP data\n" ) ); + } + is_success &= vbap->search_struct[0].triplets != NULL; + + if ( speaker_nodes_group2_internal > 0 ) + { + vbap->num_search_structs = 2; + if ( ( vbap->search_struct[1].triplets = (VBAP_VS_TRIPLET *) malloc( ( ( speaker_nodes_group2_internal - 2 ) * 2 - ( max( 0, ( speaker_nodes_horiz_internal - 2 ) ) ) ) * sizeof( VBAP_VS_TRIPLET ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for VBAP data\n" ) ); + } + is_success &= vbap->search_struct[1].triplets != NULL; + } + else + { + vbap->num_search_structs = 1; + vbap->search_struct[1].triplets = NULL; + } + } + + if ( is_success ) + { + if ( vbap->num_search_structs == 1 ) + { + /* If all speaker nodes belong to ALL set, then we only create one triplet set and search structure */ + vbap->search_struct[0].num_triplets = determine_virtual_surface_triplets( vbap->num_speaker_nodes_internal, speaker_node_data, connections, max_num_connections, vbap->search_struct[0].triplets, vbap->search_struct[0].initial_search_indices, SPEAKER_NODE_ALL ); + } + else + { + /* Otherwise, we have two sets and can handle them separately for more opmitized processing. */ + vbap->search_struct[0].num_triplets = determine_virtual_surface_triplets( vbap->num_speaker_nodes_internal, speaker_node_data, connections, connection_group1_count, vbap->search_struct[0].triplets, vbap->search_struct[0].initial_search_indices, SPEAKER_NODE_BOTTOM_HALF ); + vbap->search_struct[1].num_triplets = determine_virtual_surface_triplets( vbap->num_speaker_nodes_internal, speaker_node_data, connections + connection_group2_start, connection_group2_count, vbap->search_struct[1].triplets, vbap->search_struct[1].initial_search_indices, SPEAKER_NODE_TOP_HALF ); + } + } + + /* Determine how the virtual node gains should be distributed to real nodes, if necessary (checked within function). */ + if ( is_success ) + { + determine_virtual_speaker_node_division_gains( vbap->top_virtual_speaker_node_index, vbap->top_virtual_speaker_node_division_gains, connections, virtual_top_type, max_num_connections, num_speaker_nodes, 0 ); + determine_virtual_speaker_node_division_gains( vbap->bottom_virtual_speaker_node_index, vbap->bottom_virtual_speaker_node_division_gains, connections, virtual_bottom_type, max_num_connections, num_speaker_nodes, 0 ); + determine_virtual_speaker_node_division_gains( vbap->back_virtual_speaker_node_index, vbap->back_virtual_speaker_node_division_gains, connections, virtual_back_type, max_num_connections, num_speaker_nodes, 0 ); + if ( ivas_format == MASA_ISM_FORMAT ) + { + determine_virtual_speaker_node_division_gains( vbap->top_virtual_speaker_node_index, vbap->object_mode_top_virtual_speaker_node_division_gains, connections, virtual_top_type == NO_VIRTUAL_SPEAKER_NODE ? NO_VIRTUAL_SPEAKER_NODE : VIRTUAL_SPEAKER_NODE_DISTRIBUTE_ENERGY, max_num_connections, num_speaker_nodes, 1 ); + determine_virtual_speaker_node_division_gains( vbap->bottom_virtual_speaker_node_index, vbap->object_mode_bottom_virtual_speaker_node_division_gains, connections, virtual_bottom_type == NO_VIRTUAL_SPEAKER_NODE ? NO_VIRTUAL_SPEAKER_NODE : VIRTUAL_SPEAKER_NODE_DISTRIBUTE_ENERGY, max_num_connections, num_speaker_nodes, 1 ); + determine_virtual_speaker_node_division_gains( vbap->back_virtual_speaker_node_index, vbap->object_mode_back_virtual_speaker_node_division_gains, connections, virtual_back_type == NO_VIRTUAL_SPEAKER_NODE ? NO_VIRTUAL_SPEAKER_NODE : VIRTUAL_SPEAKER_NODE_DISTRIBUTE_ENERGY, max_num_connections, num_speaker_nodes, 1 ); + } + } + + pop_wmops(); + + if ( is_success ) + { + *hVBAPdata = vbap; + } + else + { + vbap_free_data( &vbap ); + } + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------------* + * vbap_free_data() + * + * Free VBAP data structure + *-------------------------------------------------------------------------*/ + +void vbap_free_data( + VBAP_HANDLE *hVBAPdata /* i/o: VBAP handle to be freed */ +) +{ + if ( hVBAPdata == NULL || *hVBAPdata == NULL ) + { + return; + } + + if ( ( *hVBAPdata )->bottom_virtual_speaker_node_division_gains != NULL ) + { + free( ( *hVBAPdata )->bottom_virtual_speaker_node_division_gains ); + } + if ( ( *hVBAPdata )->top_virtual_speaker_node_division_gains != NULL ) + { + free( ( *hVBAPdata )->top_virtual_speaker_node_division_gains ); + } + if ( ( *hVBAPdata )->back_virtual_speaker_node_division_gains != NULL ) + { + free( ( *hVBAPdata )->back_virtual_speaker_node_division_gains ); + } + if ( ( *hVBAPdata )->object_mode_bottom_virtual_speaker_node_division_gains != NULL ) + { + free( ( *hVBAPdata )->object_mode_bottom_virtual_speaker_node_division_gains ); + } + if ( ( *hVBAPdata )->object_mode_top_virtual_speaker_node_division_gains != NULL ) + { + free( ( *hVBAPdata )->object_mode_top_virtual_speaker_node_division_gains ); + } + if ( ( *hVBAPdata )->object_mode_back_virtual_speaker_node_division_gains != NULL ) + { + free( ( *hVBAPdata )->object_mode_back_virtual_speaker_node_division_gains ); + } + if ( ( *hVBAPdata )->search_struct[0].triplets != NULL ) + { + free( ( *hVBAPdata )->search_struct[0].triplets ); + } + if ( ( *hVBAPdata )->num_search_structs == 2 && ( *hVBAPdata )->search_struct[1].triplets != NULL ) + { + free( ( *hVBAPdata )->search_struct[1].triplets ); + } + + free( *hVBAPdata ); + *hVBAPdata = NULL; + + return; +} + + +/*-------------------------------------------------------------------------* + * vbap_determine_gains() + * + * Obtain panning gains for all speaker nodes based on the given direction + *-------------------------------------------------------------------------*/ + +void vbap_determine_gains( + const VBAP_HANDLE hVBAPdata, /* i : prepared VBAP structure */ + float *gains, /* o : gain vector for loudspeakers for given direction */ + const int16_t azi_deg, /* i : azimuth in degrees for panning direction (positive left) */ + const int16_t ele_deg, /* i : elevation in degrees for panning direction (positive up) */ + const int16_t use_object_mode /* i : select between object mode panning and spatial mode panning */ +) +{ + /* This function formulates gains for the given angle. The triplet-selection has been pre-formulated. */ + int16_t ch, ch2; + int16_t triplet_ch; + int16_t triplet_index; + float panning_unit_vec[3]; + float gain_triplet[3]; + float norm_value; + float gain_ene; + float azi_rad; + float ele_rad; + float azi_temp; + float ele_temp; + int16_t num_speaker_nodes; + int16_t bottom_virtual_speaker_node_index; + int16_t top_virtual_speaker_node_index; + int16_t back_virtual_speaker_node_index; + VBAP_VS_TRIPLET *selected_triplet; + float *bottom_virtual_speaker_node_division_gains; + float *top_virtual_speaker_node_division_gains; + float *back_virtual_speaker_node_division_gains; + + + push_wmops( "vbap_gains" ); + num_speaker_nodes = hVBAPdata->num_speaker_nodes; + bottom_virtual_speaker_node_index = hVBAPdata->bottom_virtual_speaker_node_index; + top_virtual_speaker_node_index = hVBAPdata->top_virtual_speaker_node_index; + back_virtual_speaker_node_index = hVBAPdata->back_virtual_speaker_node_index; + if ( use_object_mode ) + { + bottom_virtual_speaker_node_division_gains = hVBAPdata->object_mode_bottom_virtual_speaker_node_division_gains; + top_virtual_speaker_node_division_gains = hVBAPdata->object_mode_top_virtual_speaker_node_division_gains; + back_virtual_speaker_node_division_gains = hVBAPdata->object_mode_back_virtual_speaker_node_division_gains; + } + else + { + bottom_virtual_speaker_node_division_gains = hVBAPdata->bottom_virtual_speaker_node_division_gains; + top_virtual_speaker_node_division_gains = hVBAPdata->top_virtual_speaker_node_division_gains; + back_virtual_speaker_node_division_gains = hVBAPdata->back_virtual_speaker_node_division_gains; + } + + panning_wrap_angles( (float) azi_deg, (float) ele_deg, &azi_temp, &ele_temp ); + azi_rad = azi_temp * PI_OVER_180; + ele_rad = ele_temp * PI_OVER_180; + + panning_unit_vec[0] = cosf( azi_rad ) * cosf( ele_rad ); + panning_unit_vec[1] = sinf( azi_rad ) * cosf( ele_rad ); + panning_unit_vec[2] = sinf( ele_rad ); + + /* Find the best VS triplet and speaker node gains for the panning direction using the prepared search structures. */ + if ( hVBAPdata->num_search_structs == 2 && ele_deg > 0 ) + { + triplet_index = determine_best_triplet_and_gains( &( hVBAPdata->search_struct[1] ), panning_unit_vec, azi_deg, gain_triplet ); + selected_triplet = &hVBAPdata->search_struct[1].triplets[triplet_index]; + } + else + { + triplet_index = determine_best_triplet_and_gains( &( hVBAPdata->search_struct[0] ), panning_unit_vec, azi_deg, gain_triplet ); + selected_triplet = &hVBAPdata->search_struct[0].triplets[triplet_index]; + } + + /* Normalize to unit energy */ + gain_ene = 1e-12f; /* Add small value to avoid divide by zero. */ + for ( ch = 0; ch < 3; ch++ ) + { + gain_ene += gain_triplet[ch] * gain_triplet[ch]; + } + + norm_value = inv_sqrt( gain_ene ); + + for ( ch = 0; ch < 3; ch++ ) + { + gain_triplet[ch] *= norm_value; + + /* Sanity check for rounding issues */ + if ( gain_triplet[ch] < 0.0f ) + { + gain_triplet[ch] = 0.0f; + } + } + + /* Flush gain target */ + set_zero( gains, num_speaker_nodes ); + + /* Map gain triplet (internal speaker node configuration) to speaker node output (actual speaker node configuration) */ + for ( ch = 0; ch < 3; ch++ ) + { + triplet_ch = selected_triplet->speaker_node[ch]; + + if ( triplet_ch == bottom_virtual_speaker_node_index ) + { + for ( ch2 = 0; ch2 < num_speaker_nodes; ch2++ ) + { + gains[ch2] += bottom_virtual_speaker_node_division_gains[ch2] * gain_triplet[ch]; + } + } + else if ( triplet_ch == top_virtual_speaker_node_index ) + { + for ( ch2 = 0; ch2 < num_speaker_nodes; ch2++ ) + { + gains[ch2] += top_virtual_speaker_node_division_gains[ch2] * gain_triplet[ch]; + } + } + else if ( triplet_ch == back_virtual_speaker_node_index ) + { + for ( ch2 = 0; ch2 < num_speaker_nodes; ch2++ ) + { + gains[ch2] += back_virtual_speaker_node_division_gains[ch2] * gain_triplet[ch]; + } + } + else + { + gains[triplet_ch] += gain_triplet[ch]; + } + } + + pop_wmops(); + + return; +} + + +/*-----------------------------------------------------------------------* + * Local functions + *-----------------------------------------------------------------------*/ + +/*-------------------------------------------------------------------------* + * vbap_crossp() + * + * 3-by-3 vector cross product + *-------------------------------------------------------------------------*/ + +static void vbap_crossp( + const float *vec1, /* i : input vector 1 */ + const float *vec2, /* i : input vector 2 */ + float *crossProduct /* o : cross product output */ +) +{ + crossProduct[0] = ( vec1[1] * vec2[2] ) - ( vec1[2] * vec2[1] ); + crossProduct[1] = ( vec1[2] * vec2[0] ) - ( vec1[0] * vec2[2] ); + crossProduct[2] = ( vec1[0] * vec2[1] ) - ( vec1[1] * vec2[0] ); + + return; +} + + +/*-------------------------------------------------------------------------* + * vector_matrix_multiply_3x3() + * + * 3-by-3 vector multiply with matrix + *-------------------------------------------------------------------------*/ + +/*! r: Status result if triplet is usable for panning. Allows early exit. */ +static uint8_t vector_matrix_multiply_3x3( + const float *src_vector, /* i : input vector */ + float matrix[3][3], /* i : input matrix */ + float *result /* o : output vector */ +) +{ + result[0] = src_vector[0] * matrix[0][0]; + result[0] += src_vector[1] * matrix[1][0]; + result[0] += src_vector[2] * matrix[2][0]; + + if ( result[0] < -0.01f ) + { + return 0; + } + + result[1] = src_vector[0] * matrix[0][1]; + result[1] += src_vector[1] * matrix[1][1]; + result[1] += src_vector[2] * matrix[2][1]; + + if ( result[1] < -0.01f ) + { + return 0; + } + + result[2] = src_vector[0] * matrix[0][2]; + result[2] += src_vector[1] * matrix[1][2]; + result[2] += src_vector[2] * matrix[2][2]; + + if ( result[2] < -0.01f ) + { + return 0; + } + + return 1; +} + + +/*----------------------------------------------------------------------------------------------* + * determine_best_triplet_and_gains() + * + * Determine the best speaker node triplet and associated gains for panning to defined direction + *----------------------------------------------------------------------------------------------*/ + +/*! r: triplet id */ +static int16_t determine_best_triplet_and_gains( + VBAP_SEARCH_STRUCT *search_struct, /* i : VBAP search struct */ + const float panning_unit_vec[3], /* i : panning unit vector */ + const int16_t azi_deg, /* i : panning azimuth */ + float gains[3] /* o : panning gains */ +) +{ + int16_t i, tr, k; + uint8_t triplet_ok; + int16_t best_triplet; + float best_min_gain; + float min_gain_this; + float unnormalized_gains[3]; + int16_t sector; + int16_t first_triplet; + int16_t jump; + int16_t num_triplets; + + num_triplets = search_struct->num_triplets; + best_min_gain = -999.9f; + best_triplet = 0; + set_zero( gains, 3 ); + + /* Determine the correct search sector for that target panning direction using an optimized algorithm for + * the chosen four sectors. */ + if ( abs( azi_deg ) > 90 ) + { + sector = azi_deg < 0 ? 2 : 1; + } + else + { + sector = azi_deg < 0 ? 3 : 0; + } + first_triplet = search_struct->initial_search_indices[sector]; + + tr = first_triplet; + jump = 1; + for ( i = 0; i < num_triplets; i++ ) + { + triplet_ok = vector_matrix_multiply_3x3( panning_unit_vec, search_struct->triplets[tr].inverse_matrix, unnormalized_gains ); + if ( triplet_ok ) + { + min_gain_this = min( ( min( unnormalized_gains[0], unnormalized_gains[1] ) ), unnormalized_gains[2] ); + + if ( min_gain_this > best_min_gain ) + { + best_min_gain = min_gain_this; + best_triplet = tr; + for ( k = 0; k < 3; k++ ) + { + gains[k] = unnormalized_gains[k]; + } + if ( !( best_min_gain < 0.00f ) ) + { + return best_triplet; + } + } + } + tr = first_triplet + jump; + if ( tr < 0 ) + { + tr += num_triplets; + } + else if ( tr >= num_triplets ) + { + tr -= num_triplets; + } + + jump *= -1; + if ( jump > 0 ) + { + jump += 1; + } + } + + return best_triplet; +} + +/*-------------------------------------------------------------------------* + * determine_virtual_speaker_node_division_gains() + * + * Determines how the virtual node gains are distributed to real nodes + *-------------------------------------------------------------------------*/ + +static void determine_virtual_speaker_node_division_gains( + const int16_t virtual_speaker_node_index, /* i : virtual speaker node index */ + float *virtual_node_division_gains, /* o : virtual speaker node division gains */ + int16_t connections[][2], /* i : vector of all connections */ + const enum VirtualSpeakerNodeType type, /* i : virtual speaker node typel */ + const int16_t max_num_connections, /* i : max number of connections */ + const int16_t num_speaker_nodes, /* i : max number of speaker nodes */ + const int16_t use_object_mode /* i : use VBAP in object panning mode vs. spatial panning mode */ +) +{ + /* When node type is VIRTUAL_SPEAKER_NODE_DISTRIBUTE_ENERGY, the gains of the virtual node + are distributed to all neighboring real speaker nodes. An amplitude-division + instead of energy division is utilized just in case to avoid excessive emphasis + on the coherent distributed sound. */ + int16_t c, ch; + float sum_val; + + if ( type == VIRTUAL_SPEAKER_NODE_DISTRIBUTE_ENERGY ) + { + for ( c = 0; c < max_num_connections; c++ ) + { + if ( connections[c][0] != VBAP_NOT_VALID_CONNECTION ) + { + int16_t connection_node = -1; + if ( connections[c][0] == virtual_speaker_node_index ) + { + connection_node = connections[c][1]; + } + else if ( connections[c][1] == virtual_speaker_node_index ) + { + connection_node = connections[c][0]; + } + + /* The second condition allows division gains only to actual loudspeakers */ + if ( connection_node >= 0 && ( connection_node < num_speaker_nodes ) ) + { + virtual_node_division_gains[connection_node] = 1.0f; + } + } + } + + sum_val = 0.0f; + for ( ch = 0; ch < num_speaker_nodes; ch++ ) + { + sum_val += virtual_node_division_gains[ch]; + } + + for ( ch = 0; ch < num_speaker_nodes; ch++ ) + { + virtual_node_division_gains[ch] /= sum_val; + if ( use_object_mode ) + { + virtual_node_division_gains[ch] = powf( virtual_node_division_gains[ch], 0.8f ); + } + } + } + + return; +} + + +/*-------------------------------------------------------------------------* + * check_need_of_virtual_speaker_node() + * + * Check if virtual speaker node is required + *-------------------------------------------------------------------------*/ + +/*! r: virtual speaker node type */ +static enum VirtualSpeakerNodeType check_need_of_virtual_speaker_node( + VBAP_HANDLE hVBAPdata, /* i/o: VBAP structure */ + const float *speaker_node_azi_deg, /* i : vector of speaker node azimuths */ + const float *speaker_node_ele_deg, /* i : vector of speaker node elevations */ + enum SpeakerNodeGroup group /* i : group of speaker nodes where this belongs */ +) +{ + int16_t ch; + float max_elevation = 0.0f; + + /* The following considers if SPEAKER_NODE_BACK virtual speaker is needed */ + if ( group == SPEAKER_NODE_BACK ) + { + int16_t virtual_back_needed = 1; + const float virtual_back_epsilon = -0.0175f; /* Corresponds to approximately 91 degrees, see code below */ + for ( ch = 0; ch < hVBAPdata->num_speaker_nodes; ch++ ) + { + if ( fabsf( speaker_node_ele_deg[ch] ) < VBAP_VIRTUAL_BACK_ELE_LIMIT ) + { + if ( cosf( speaker_node_azi_deg[ch] * PI_OVER_180 ) < virtual_back_epsilon ) + { + virtual_back_needed = 0; + break; + } + } + } + + if ( virtual_back_needed ) + { + hVBAPdata->back_virtual_speaker_node_index = hVBAPdata->num_speaker_nodes_internal; + hVBAPdata->num_speaker_nodes_internal++; + return VIRTUAL_SPEAKER_NODE_DISTRIBUTE_ENERGY; + } + + return NO_VIRTUAL_SPEAKER_NODE; /* No virtual back needed */ + } + + /* The following considers if TOP or BOTTOM virtual speaker is needed */ + for ( ch = 0; ch < hVBAPdata->num_speaker_nodes; ch++ ) + { + if ( group == SPEAKER_NODE_TOP_HALF ) + { + if ( speaker_node_ele_deg[ch] > max_elevation ) + { + max_elevation = speaker_node_ele_deg[ch]; + } + } + else + { + if ( ( -speaker_node_ele_deg[ch] ) > max_elevation ) + { + max_elevation = -speaker_node_ele_deg[ch]; + } + } + } + + if ( max_elevation > VBAP_NO_VIRTUAL_SPEAKER_NODE_ELE_LIMIT - VBAP_EPSILON ) + { + return NO_VIRTUAL_SPEAKER_NODE; + } + + /* Use virtual node */ + if ( group == SPEAKER_NODE_BOTTOM_HALF ) + { + hVBAPdata->bottom_virtual_speaker_node_index = hVBAPdata->num_speaker_nodes_internal; + } + else + { + hVBAPdata->top_virtual_speaker_node_index = hVBAPdata->num_speaker_nodes_internal; + } + + hVBAPdata->num_speaker_nodes_internal++; + if ( max_elevation > VBAP_DISTRIBUTE_VIRTUAL_SPEAKER_NODE_ELE_LIMIT - VBAP_EPSILON ) + { + return VIRTUAL_SPEAKER_NODE_DISTRIBUTE_ENERGY; + } + + return VIRTUAL_SPEAKER_NODE_DISCARD_ENERGY; +} + + +/*-------------------------------------------------------------------------* + * init_speaker_node_direction_data() + * + * Initialize speaker node data + *-------------------------------------------------------------------------*/ + +static void init_speaker_node_direction_data( + VBAP_SPEAKER_NODE *speaker_node_data, /* o : storage for speaker node data */ + const float *speaker_node_azi_deg, /* i : vector of speaker node azimuths */ + const float *speaker_node_ele_deg, /* i : vector of speaker node elevations */ + const int16_t num_speaker_nodes /* i : number of speaker nodes */ +) +{ + int16_t ch; + float azi_rad; + float ele_rad; + int16_t num_horiz = 0; + uint8_t in_all_mode = TRUE; + + for ( ch = 0; ch < num_speaker_nodes; ch++ ) + { + speaker_node_data[ch].azi_deg = speaker_node_azi_deg[ch]; + azi_rad = speaker_node_azi_deg[ch] * PI_OVER_180; + if ( ( speaker_node_ele_deg[ch] >= -5 ) && ( speaker_node_ele_deg[ch] <= 5 ) ) + { + speaker_node_data[ch].ele_deg = 0.0f; + ele_rad = 0.0f; + speaker_node_data[ch].group = SPEAKER_NODE_HORIZONTAL; + num_horiz++; + } + else + { + speaker_node_data[ch].ele_deg = speaker_node_ele_deg[ch]; + ele_rad = speaker_node_ele_deg[ch] * PI_OVER_180; + if ( ele_rad < 0 ) + { + speaker_node_data[ch].group = SPEAKER_NODE_BOTTOM_HALF; + } + else + { + speaker_node_data[ch].group = SPEAKER_NODE_TOP_HALF; + } + } + + speaker_node_data[ch].unit_vec[0] = cosf( azi_rad ) * cosf( ele_rad ); + speaker_node_data[ch].unit_vec[1] = sinf( azi_rad ) * cosf( ele_rad ); + speaker_node_data[ch].unit_vec[2] = sinf( ele_rad ); + } + + /* Check for largest horizontal gap if there are at least 3 horizontal speaker nodes */ + if ( num_horiz >= 3 ) + { + int16_t i; + uint16_t horiz_azi[VBAP_MAX_NUM_SPEAKER_NODES]; + uint16_t largest_gap; + uint16_t temp; + + i = 0; + for ( ch = 0; ch < num_speaker_nodes && i < num_horiz; ch++ ) + { + if ( speaker_node_data[ch].group == SPEAKER_NODE_HORIZONTAL ) + { + horiz_azi[i] = speaker_node_azi_deg[ch] < 0.0f ? (uint16_t) floorf( speaker_node_azi_deg[ch] + 360.0f ) : (uint16_t) floorf( speaker_node_azi_deg[ch] ); + i++; + } + } + + /* Reorder horizontal azi to increasing order */ + sort( horiz_azi, num_horiz ); + + /* Find largest gap. Initialize with the wrap over gap. */ + largest_gap = horiz_azi[0] - horiz_azi[num_horiz - 1] + 360; + for ( ch = 0; ch < num_horiz - 1; ch++ ) + { + temp = horiz_azi[ch + 1] - horiz_azi[ch]; + if ( temp > largest_gap ) + { + largest_gap = temp; + } + } + + /* If largest gap is small enough, we have definitive zero elevation plane. + * Otherwise, we should assign all speaker nodes to one group. */ + if ( largest_gap <= VBAP_MAX_HORIZONTAL_GAP ) + { + in_all_mode = FALSE; + } + } + + /* Designate all speaker nodes to same group if there was no definitive zero + * elevation plane. */ + if ( in_all_mode ) + { + for ( ch = 0; ch < num_speaker_nodes; ch++ ) + { + speaker_node_data[ch].group = SPEAKER_NODE_ALL; + } + } + + return; +} + +/*-------------------------------------------------------------------------* + * matrix_inverse_3x3() + * + * 3-by-3 matrix inverse + *-------------------------------------------------------------------------*/ + +static void matrix_inverse_3x3( + const float **input_matrix, /* i : input matrix */ + float inverse_matrix[3][3] /* o : output matrix */ +) +{ + int16_t k; + float determinant; + float cross_vec[3]; + + vbap_crossp( input_matrix[1], input_matrix[2], cross_vec ); + + determinant = dotp( input_matrix[0], cross_vec, 3 ); + + for ( k = 0; k < 3; k++ ) + { + inverse_matrix[k][0] = cross_vec[k] / determinant; + } + + vbap_crossp( input_matrix[2], input_matrix[0], cross_vec ); + + for ( k = 0; k < 3; k++ ) + { + inverse_matrix[k][1] = cross_vec[k] / determinant; + } + + vbap_crossp( input_matrix[0], input_matrix[1], cross_vec ); + + for ( k = 0; k < 3; k++ ) + { + inverse_matrix[k][2] = cross_vec[k] / determinant; + } + + return; +} + +/*-------------------------------------------------------------------------* + * check_and_store_triplet() + * + * Check if the given loudspeaker triplet is a valid one and store data when + * valid triplet is found. + *-------------------------------------------------------------------------*/ + +static int16_t check_and_store_triplet( + const int16_t chA, /* i : first channel index that forms the loudspeaker triplet */ + const int16_t chB, /* i : second channel index that forms the loudspeaker triplet */ + const int16_t chC, /* i : third channel index that forms the loudspeaker triplet */ + const int16_t num_speaker_nodes, /* i : number of speaker nodes */ + const VBAP_SPEAKER_NODE *speaker_node_data, /* i : speaker node data structure */ + VBAP_VS_TRIPLET *triplets, /* o : vector of virtual surface triplets */ + int16_t *triplet_index, /* i/o: index for the next free triplet slot */ + float *triplet_azidegs, /* o : center azimuths of the found triplets */ + int16_t *triplet_order /* o : initial order of triplet indices */ +) +{ + int16_t ch_check; + int16_t k; + int16_t speaker_node_found_inside_triplet; + uint8_t triplet_ok; + float inverse_matrix[3][3], unnormalized_gains[3]; + const float *speaker_node_triplet_unit_vec_matrix[3]; + + /* Triplet found, determine inverse matrix for VBAP formulation */ + speaker_node_triplet_unit_vec_matrix[0] = speaker_node_data[chA].unit_vec; + speaker_node_triplet_unit_vec_matrix[1] = speaker_node_data[chB].unit_vec; + speaker_node_triplet_unit_vec_matrix[2] = speaker_node_data[chC].unit_vec; + matrix_inverse_3x3( speaker_node_triplet_unit_vec_matrix, inverse_matrix ); + + /* Check through all speaker nodes that none of them are within the triplet. + * Node within the triplet is identified by that all three panning gains are positive. + * Epsilon-condition is for some small rounding issues.*/ + speaker_node_found_inside_triplet = 0; + for ( ch_check = 0; ch_check < num_speaker_nodes; ch_check++ ) + { + if ( ( ch_check != chA ) && ( ch_check != chB ) && ( ch_check != chC ) ) + { + triplet_ok = vector_matrix_multiply_3x3( speaker_node_data[ch_check].unit_vec, inverse_matrix, unnormalized_gains ); + if ( triplet_ok && unnormalized_gains[0] > VBAP_EPSILON && unnormalized_gains[1] > VBAP_EPSILON && unnormalized_gains[2] > VBAP_EPSILON ) + { + speaker_node_found_inside_triplet = 1; + break; + } + } + } + + /* No speaker node inside triplet -> appropriate triplet found, save data. */ + if ( speaker_node_found_inside_triplet == 0 ) + { + triplets[*triplet_index].speaker_node[0] = (uint8_t) chA; + triplets[*triplet_index].speaker_node[1] = (uint8_t) chB; + triplets[*triplet_index].speaker_node[2] = (uint8_t) chC; + for ( k = 0; k < 3; k++ ) + { + mvr2r( inverse_matrix[k], triplets[*triplet_index].inverse_matrix[k], 3 ); + } + + /* Get center azimuth for fast search use */ + triplet_azidegs[*triplet_index] = atan2f( speaker_node_data[chA].unit_vec[1] + speaker_node_data[chB].unit_vec[1] + speaker_node_data[chC].unit_vec[1], + speaker_node_data[chA].unit_vec[0] + speaker_node_data[chB].unit_vec[0] + speaker_node_data[chC].unit_vec[0] ) * + _180_OVER_PI; + + /* Store increasing order indices for the later sorting step. */ + triplet_order[*triplet_index] = *triplet_index; + + ( *triplet_index )++; + + return 1; + } + + /* Triplet was not good */ + return 0; +} + + +/*-------------------------------------------------------------------------* + * determine_virtual_surface_triplets() + * + * Determine virtual surface triples that are used for panning. This + * function is optimized for the use in cases where speaker nodes are in + * one group or divided into two separate groups divided by a horizontal + * layer. + *-------------------------------------------------------------------------*/ + +/*! r: number of virtual surface triplets */ +static int16_t determine_virtual_surface_triplets( + const int16_t num_speaker_nodes, /* i : number of speaker nodes */ + const VBAP_SPEAKER_NODE *speaker_node_data, /* i : speaker node data structure */ + int16_t connections[][2], /* i : vector of all connections */ + const int16_t max_num_connections, /* i : max number of connections */ + VBAP_VS_TRIPLET *triplets, /* o : vector of virtual surface triplets */ + int16_t initial_search_indices[VBAP_NUM_SEARCH_SECTORS], /* o : initial search indices for this set of triplets corresponding to the search struct */ + enum SpeakerNodeGroup allowed_group /* i : group of allowed speaker nodes for forming the triplets in this call */ +) +{ + int16_t chA, chB, chC, k, l, m; + int16_t num_triplets = 0; + int16_t num_connected_to_chA; + int16_t connected_to_chA[VBAP_MAX_NUM_SPEAKER_NODES]; + int16_t connection_uses_left[VBAP_MAX_NUM_SPEAKER_NODES]; + float triplet_azidegs[VBAP_MAX_NUM_TRIPLETS]; + int16_t triplet_order[VBAP_MAX_NUM_TRIPLETS]; + + /* Each connection can be used exactly by two different virtual surface triplets. */ + set_s( connection_uses_left, 2, VBAP_MAX_NUM_SPEAKER_NODES ); + + for ( chA = 0; chA < num_speaker_nodes; chA++ ) + { + /* Early skip if not in correct group. */ + if ( speaker_node_data[chA].group != allowed_group ) + { + continue; + } + + /* Get all connections connected to current chA that have not been used by + * two triplets yet. */ + num_connected_to_chA = 0; + for ( k = 0; k < max_num_connections; k++ ) + { + if ( ( connections[k][0] == chA || connections[k][1] == chA ) && connection_uses_left[k] > 0 ) + { + connected_to_chA[num_connected_to_chA] = k; + num_connected_to_chA++; + } + } + + /* Check that we have enough connections to use. We need at least two available connections to form a triplet. + * This can fail in later stages when all connections are already used. */ + if ( num_connected_to_chA < 2 ) + { + continue; + } + + /* Try to form triplets from each valid connection. */ + for ( k = 0; k < num_connected_to_chA; k++ ) + { + int16_t connect_index_k = connected_to_chA[k]; + chB = connections[connect_index_k][0] == chA ? connections[connect_index_k][1] : connections[connect_index_k][0]; + for ( l = k + 1; l < num_connected_to_chA; l++ ) + { + int16_t connect_index_l = connected_to_chA[l]; + chC = connections[connect_index_l][0] == chA ? connections[connect_index_l][1] : connections[connect_index_l][0]; + + /* With chA, chB, and chC selected, we still need to find connection between chB and chC and verify that the triplet is valid */ + for ( m = 0; m < max_num_connections; m++ ) + { + if ( ( connections[m][0] == chB && connections[m][1] == chC ) || ( connections[m][1] == chB && connections[m][0] == chC ) ) + { + if ( check_and_store_triplet( chA, chB, chC, num_speaker_nodes, speaker_node_data, triplets, &num_triplets, triplet_azidegs, triplet_order ) ) + { + connection_uses_left[connect_index_k]--; + connection_uses_left[connect_index_l]--; + connection_uses_left[m]--; + break; + } + } + } + + /* Check if chA-chB connection has been used in two triplets already. If yes, then break out of loop + * as this connection cannot be used for more triplets and we need to continue with another chA-chB + * connection. */ + if ( connection_uses_left[connect_index_k] < 1 ) + { + break; + } + } + } + } + + /* All triplets should be stored now. Sort them for search use and then determine the initial search indices for + * each search sector for this search struct. */ + v_sort_ind( triplet_azidegs, triplet_order, num_triplets ); + reorder_triplets( triplets, triplet_order, num_triplets ); + determine_initial_search_indices( num_triplets, triplet_azidegs, initial_search_indices ); + + return num_triplets; +} + +/*-------------------------------------------------------------------------* + * determine_initial_search_indices() + * + * Determine initial search indices used for fast search of correct triangle + *-------------------------------------------------------------------------*/ + +static void determine_initial_search_indices( + const int16_t num_triplets, /* i : number of triplets */ + const float triplet_azidegs[VBAP_MAX_NUM_TRIPLETS], /* i : azimuths of triplets (in degrees) */ + int16_t initial_search_indices[VBAP_NUM_SEARCH_SECTORS] /* o : initial search indices */ +) +{ + int16_t i, j; + float sector_reference_azideg; + float sector_border_start_azideg; + float sector_border_end_azideg; + int16_t best_index; + float min_azideg_diff; + float azideg_diff; + + for ( i = 0; i < VBAP_NUM_SEARCH_SECTORS; i++ ) + { + sector_border_start_azideg = i * VBAP_SEARCH_SECTOR_SIZE; + sector_border_end_azideg = ( i + 1 ) * VBAP_SEARCH_SECTOR_SIZE; + sector_reference_azideg = ( sector_border_start_azideg + sector_border_end_azideg ) / 2.0f; + best_index = 0; + min_azideg_diff = 9999.9f; + + for ( j = 0; j < num_triplets; j++ ) + { + azideg_diff = sector_reference_azideg - triplet_azidegs[j]; + if ( azideg_diff > 180.0f ) + { + azideg_diff -= 360.0f; + } + else if ( azideg_diff < -180.0f ) + { + azideg_diff += 360.0f; + } + azideg_diff = fabsf( azideg_diff ); + + if ( azideg_diff < min_azideg_diff ) + { + min_azideg_diff = azideg_diff; + best_index = j; + } + } + + initial_search_indices[i] = best_index; + } + + return; +} + + +/*-------------------------------------------------------------------------* + * determine_connections() + * + * Determine all valid connections between all speaker nodes + *-------------------------------------------------------------------------*/ + +static ivas_error determine_connections( + const int16_t num_speaker_nodes, /* i : number of speaker nodes */ + const VBAP_SPEAKER_NODE *speaker_node_data, /* i : speaker node data */ + int16_t connections[][2], /* o : vector of connections */ + const int16_t max_num_connections, /* i : max number of connections */ + int16_t *group1_count, /* o : number of connections in first group */ + int16_t *group2_start, /* o : start of second group of connections */ + int16_t *group2_count /* o : number of connections in second group */ +) +{ + int16_t num_non_crossing_planes; + int16_t c; + int16_t connection_write_index = 0; + float non_crossing_plane_elevation_deg[VBAP_MAX_PLANES]; + ivas_error error; + + set_f( non_crossing_plane_elevation_deg, 0.0f, VBAP_MAX_PLANES ); + + /* Reset connection data */ + for ( c = 0; c < max_num_connections; c++ ) + { + connections[c][0] = VBAP_NOT_VALID_CONNECTION; + } + + /* This function determines some prominent elevated planes, that are favoured in making node-node connections. */ + num_non_crossing_planes = determine_non_crossing_planes( num_speaker_nodes, speaker_node_data, non_crossing_plane_elevation_deg ); + + /* Process in different mode based on the grouping. It is enough to check for first node. */ + if ( speaker_node_data[0].group == SPEAKER_NODE_ALL ) + { + if ( ( error = formulate_half_sphere_connections( speaker_node_data, num_speaker_nodes, SPEAKER_NODE_ALL, connections, &connection_write_index, max_num_connections, num_non_crossing_planes, non_crossing_plane_elevation_deg ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + /* The node-node connections are determined in three stages: bottom, horizontal, and top. */ + if ( ( error = formulate_half_sphere_connections( speaker_node_data, num_speaker_nodes, SPEAKER_NODE_BOTTOM_HALF, connections, &connection_write_index, max_num_connections, num_non_crossing_planes, non_crossing_plane_elevation_deg ) ) != IVAS_ERR_OK ) + { + return error; + } + *group2_start = connection_write_index; + + formulate_horizontal_connections( speaker_node_data, num_speaker_nodes, connections, &connection_write_index ); + *group1_count = connection_write_index; + + if ( ( error = formulate_half_sphere_connections( speaker_node_data, num_speaker_nodes, SPEAKER_NODE_TOP_HALF, connections, &connection_write_index, max_num_connections, num_non_crossing_planes, non_crossing_plane_elevation_deg ) ) != IVAS_ERR_OK ) + { + return error; + } + *group2_count = connection_write_index - *group2_start; + } + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------------* + * determine_connection_class() + * + * Determine the type of connection + *-------------------------------------------------------------------------*/ + +/*! r: type of connection */ +static enum ConnectionClass determine_connection_class( + const VBAP_SPEAKER_NODE *node_data, /* i : speaker node data */ + const int16_t num_speaker_nodes, /* i : number of speaker nodes */ + const enum SpeakerNodeGroup group, /* i : speaker node group */ + const int16_t chA, /* i : speaker node counter 1 */ + const int16_t chB /* i : speaker node counter 2 */ +) +{ + int16_t ch, k; + const float *p1, *v2; + float v1v1, v1v2, v2v2, v1p1, v2p1; + float determinant; + float norm_distance_on_v1; + float vec_diff[3]; + float v1[3]; + float vTarget[3]; + float energy_sum; + float eq_value; + float uvecdot; + + /* Check if connection passes through origin. This is not desired. + * When this happens, unit vectors point in opposite directions. */ + uvecdot = dotp( node_data[chA].unit_vec, node_data[chB].unit_vec, 3 ) + 1.0f; + if ( uvecdot < VBAP_EPSILON && uvecdot > -VBAP_EPSILON ) + { + return CONNECTION_WITH_SPEAKER_NODE_BEHIND; + } + + /* This loop checks the chA-chB connection with respect to all loudspeakers: + - in case there is a node behind or nearly behind the connection line. These + connections need to be discarded. + - in case there is a node that is closer to the connection line than 1/5 of the + connection length AND at the same horizontal plane. These connections need to be + weighted with a penalty (a special case, for example avoiding elevated L,R,C triplet) + */ + for ( ch = 0; ch < num_speaker_nodes; ch++ ) + { + /* Select speaker_node only within TOP or BOTTOM sphere half, not being part of chA-chB pair */ + if ( ( group == node_data[ch].group ) && ( ch != chA ) && ( ch != chB ) ) + { + /* The following lines formulate the point on the chA-chB-connection that is + nearest to the origo-ch-line */ + p1 = node_data[chA].unit_vec; + for ( k = 0; k < 3; k++ ) + { + v1[k] = node_data[chB].unit_vec[k] - node_data[chA].unit_vec[k]; + } + v2 = node_data[ch].unit_vec; + v1v1 = dotp( v1, v1, 3 ); + v1v2 = dotp( v1, v2, 3 ); + v2v2 = 1.0f; /* dotp(v2, v2) is always 1. */ + v1p1 = dotp( v1, p1, 3 ); + v2p1 = dotp( v2, p1, 3 ); + determinant = ( v1v1 ) * ( -v2v2 ) + ( v1v2 * v1v2 ); + /* Norm distance = distance parameter on line chA-chB, determines point that is + nearest to origo-ch line. Distance 0 means chA and distance 1 means chB. Can be + outside this region as well.*/ + norm_distance_on_v1 = ( 1.0f / determinant ) * ( ( v2v2 ) * ( v1p1 ) + ( -v1v2 ) * ( v2p1 ) ); + + /* Continue only if the nearest point is between chA and chB */ + if ( norm_distance_on_v1 > 0.0f && norm_distance_on_v1 < 1.0f ) + { + /* Formulate vTarget, that is an unit vector that goes through the determined point on chA-chB connection */ + energy_sum = 0.0f; + for ( k = 0; k < 3; k++ ) + { + vTarget[k] = p1[k] + norm_distance_on_v1 * v1[k]; + energy_sum += vTarget[k] * vTarget[k]; + vec_diff[k] = vTarget[k] - v2[k]; + } + eq_value = sqrtf( 1.0f / energy_sum ); + for ( k = 0; k < 3; k++ ) + { + vTarget[k] *= eq_value; + } + + /* A check if the angle between vTarget and node_data[ch].unit_vec is less than 1 degree. + Essentially reveals if there is a speaker node too close "behind" the connection. Such + connections should be rejected.*/ + if ( dotp( vTarget, v2, 3 ) > 0.9998f ) + { + return CONNECTION_WITH_SPEAKER_NODE_BEHIND; + } + + /* A special case, mainly accounting for ELEVATED L,R,C speaker nodes. + A triplet between these nodes is not desired if there is a top node, + a penalty is implemented to take care of this. */ + if ( sqrtf( v1v1 ) > 5.0f * sqrtf( dotp( vec_diff, vec_diff, 3 ) ) ) + { + if ( fabsf( node_data[chB].unit_vec[2] - node_data[chA].unit_vec[2] ) < VBAP_EPSILON ) + { + return ELEVATED_PLANE_THIN_TRIANGLE_CONNECTION; + } + } + } + } + } + + return REGULAR_CONNECTION; +} + + +/*-------------------------------------------------------------------------* + * formulate_horizontal_connections() + * + * Formulate connections in the horizontal plane + *-------------------------------------------------------------------------*/ + +static void formulate_horizontal_connections( + const VBAP_SPEAKER_NODE *speaker_node_data, /* i : speaker node data */ + const int16_t num_speaker_nodes, /* i : number of speaker nodes */ + int16_t connections[][2], /* o : vector of all connections */ + int16_t *connection_write_index ) +{ + int16_t ch; + int16_t chCheck; + int16_t next_index; + float min_arc_diff; + float arc_diff; + + for ( ch = 0; ch < num_speaker_nodes; ch++ ) + { + /* Find next horizontal speaker node */ + if ( speaker_node_data[ch].group == SPEAKER_NODE_HORIZONTAL ) + { + next_index = -1; + min_arc_diff = 9999.0f; + for ( chCheck = 0; chCheck < num_speaker_nodes; chCheck++ ) + { + if ( ( ch != chCheck ) && ( speaker_node_data[chCheck].group == SPEAKER_NODE_HORIZONTAL ) ) + { + arc_diff = speaker_node_data[chCheck].azi_deg - speaker_node_data[ch].azi_deg; + while ( arc_diff < 0.0f ) + { + arc_diff += 360.0f; + } + if ( arc_diff < min_arc_diff ) + { + min_arc_diff = arc_diff; + next_index = chCheck; + } + } + } + connections[*connection_write_index][0] = ch; + connections[*connection_write_index][1] = next_index; + ( *connection_write_index )++; + } + } + + return; +} + +/*-------------------------------------------------------------------------* + * check_plane_crossing() + * + * Check crossing of non-allowed planes + *-------------------------------------------------------------------------*/ + +/*! r: truth value for crossing */ +static int16_t check_plane_crossing( + const float ele1_deg, /* i : speaker node 1 elevation */ + const float ele2_deg, /* i : speaker node 2 elevation */ + const int16_t num_non_crossing_planes, /* i : number of non-crossing planes */ + const float *non_crossing_plane_elevation_deg /* i : vector non-crossing plane elevations*/ +) +{ + /* Find if the connection crosses a non-crossing plane, with 1-degree threshold. */ + int16_t plane; + + for ( plane = 0; plane < num_non_crossing_planes; plane++ ) + { + if ( ( ele1_deg > non_crossing_plane_elevation_deg[plane] + 1.0f ) && ( ele2_deg < non_crossing_plane_elevation_deg[plane] - 1.0f ) ) + { + return 1; + } + + if ( ( ele2_deg > non_crossing_plane_elevation_deg[plane] + 1.0f ) && ( ele1_deg < non_crossing_plane_elevation_deg[plane] - 1.0f ) ) + { + return 1; + } + } + + return 0; +} + + +/*-------------------------------------------------------------------------* + * get_half_sphere_connection_options() + * + * Get list of all potential connections at the half-sphere + *-------------------------------------------------------------------------*/ + +static ivas_error get_half_sphere_connection_options( + const VBAP_SPEAKER_NODE *speaker_node_data, /* i : speaker node data */ + const enum SpeakerNodeGroup group, /* i : speaker node group */ + const int16_t num_speaker_nodes, /* i : number of speaker nodes */ + const int16_t num_non_crossing_planes, /* i : number of non-crossing planes */ + const float *non_crossing_plane_elevation_deg, /* i : vector of non-crossing plane elevations */ + ConnectionOption **connection_options_pr, /* o : list of connection options */ + int16_t *num_connection_options /* o : number of connection options */ +) +{ + int16_t max_num_connection_options = 0; + int16_t index = 0; + int16_t node, chA, chB, c, c_cmp; + ConnectionOption *c_options, *c_options_reorder; + + /* Count max num connection options at the half sphere */ + for ( node = 0; node < num_speaker_nodes; node++ ) + { + if ( speaker_node_data[node].group == group || speaker_node_data[node].group == SPEAKER_NODE_HORIZONTAL ) + { + max_num_connection_options += index; + index++; + } + } + + /* Init memory for connection options */ + if ( ( c_options = (ConnectionOption *) malloc( sizeof( ConnectionOption ) * max_num_connection_options ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for VBAP data\n" ) ); + } + + for ( c = 0; c < max_num_connection_options; c++ ) + { + c_options[c].chA = -1; + c_options[c].chB = -1; + c_options[c].arc = 1e20f; + c_options[c].arc_weighted = 1e20f; + } + + /* Determine connection options for the half-sphere */ + index = 0; + for ( chA = 0; chA < num_speaker_nodes; chA++ ) + { + /* First loudspeaker at the connection is at the half sphere */ + if ( speaker_node_data[chA].group == group || speaker_node_data[chA].group == SPEAKER_NODE_HORIZONTAL ) + { + for ( chB = chA + 1; chB < num_speaker_nodes; chB++ ) + { + /* Second loudspeaker at the connection is at the half sphere, but so that first and second are not both horizontal. */ + if ( ( speaker_node_data[chB].group == group ) || ( speaker_node_data[chB].group == SPEAKER_NODE_HORIZONTAL && speaker_node_data[chA].group == group ) ) + { + int16_t ConnectionClass = determine_connection_class( speaker_node_data, num_speaker_nodes, group, chA, chB ); + /* Connection is considered only if there is no speaker node behind it */ + if ( ConnectionClass != CONNECTION_WITH_SPEAKER_NODE_BEHIND ) + { + /* Store connection information */ + c_options[index].chA = chA; + c_options[index].chB = chB; + c_options[index].arc = acosf( dotp( speaker_node_data[chA].unit_vec, speaker_node_data[chB].unit_vec, 3 ) ); + c_options[index].arc_weighted = c_options[index].arc; + + /* A special case, mainly accounting for ELEVATED L,R,C speaker nodes. + A triplet between these nodes is not desired if there is a top node, + a penalty is implemented to take care of this. */ + if ( ConnectionClass == ELEVATED_PLANE_THIN_TRIANGLE_CONNECTION ) + { + c_options[index].arc_weighted *= 2.0f; + } + + /* If the connection passes a pre-determined plane of speaker nodes, then add further penalty */ + if ( check_plane_crossing( speaker_node_data[chA].ele_deg, speaker_node_data[chB].ele_deg, num_non_crossing_planes, non_crossing_plane_elevation_deg ) ) + { + c_options[index].arc_weighted *= 2.0f; + } + index++; + } + } + } + } + } + /* Number of found connection options at the half sphere */ + *num_connection_options = index; + + /* Init memory for reordered connection options and order by arc_weighted, + * which informs of the preference order of the connections in case they cross */ + if ( ( c_options_reorder = (ConnectionOption *) malloc( sizeof( ConnectionOption ) * ( *num_connection_options ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for VBAP data\n" ) ); + } + + for ( c = 0; c < *num_connection_options; c++ ) + { + float min_arc_weighted; + int16_t min_arc_index; + min_arc_weighted = 1e20f; + min_arc_index = -1; + + for ( c_cmp = 0; c_cmp < *num_connection_options; c_cmp++ ) + { + if ( c_options[c_cmp].arc_weighted <= min_arc_weighted ) + { + min_arc_weighted = c_options[c_cmp].arc_weighted; + min_arc_index = c_cmp; + } + } + c_options_reorder[c].chA = c_options[min_arc_index].chA; + c_options_reorder[c].chB = c_options[min_arc_index].chB; + c_options_reorder[c].arc = c_options[min_arc_index].arc; + c_options_reorder[c].arc_weighted = c_options[min_arc_index].arc_weighted; + c_options[min_arc_index].arc_weighted = 1e20f; + } + + /* Set reordered connections as output and free temporary data */ + *connection_options_pr = c_options_reorder; + free( c_options ); + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------------* + * formulate_half_sphere_connections() + * + * Formulate half-sphere connections + *-------------------------------------------------------------------------*/ + +static ivas_error formulate_half_sphere_connections( + const VBAP_SPEAKER_NODE *speaker_node_data, /* i : speaker node data */ + const int16_t num_speaker_nodes, /* i : number of speaker nodes */ + const enum SpeakerNodeGroup group, /* i : speaker node group */ + int16_t connections[][2], /* o : vector of connections */ + int16_t *connection_write_index, + const int16_t max_num_connections, /* i : max number of connections */ + const int16_t num_non_crossing_planes, /* i : number of non-crossing planes */ + const float *non_crossing_plane_elevation_deg /* i : vector of non-crossing plane elevations */ +) +{ + /* Variable initializations */ + int16_t c, chA, chB, cmp_chA, cmp_chB, k, c_opt; + int16_t new_connection_is_valid; + int16_t within_first_arc; + float planeCrossingVec[3]; + float new_arc; + float new_cross[3]; + float tmpFloat; + float cmp_arc; + float normVal; + float angleCmp; + float connection_arc[( VBAP_MAX_NUM_SPEAKER_NODES - 2 ) * 3]; + float connection_cross[( VBAP_MAX_NUM_SPEAKER_NODES - 2 ) * 3][3]; + ConnectionOption *connection_options; + int16_t num_connection_options; + int16_t half_sphere_first_connection; + ivas_error error; + + half_sphere_first_connection = *connection_write_index; + + /* Obtain all connection options (i.e., channel pairs) at the half sphere. The function orders them + * in terms of which connection to keep if two connections would cross each other. */ + if ( ( error = get_half_sphere_connection_options( + speaker_node_data, + group, + num_speaker_nodes, + num_non_crossing_planes, + non_crossing_plane_elevation_deg, + &connection_options, + &num_connection_options ) ) != IVAS_ERR_OK ) + { + return error; + } + + set_f( connection_arc, 0.0f, max_num_connections ); + for ( c = 0; c < max_num_connections; c++ ) + { + set_f( connection_cross[c], 0.0f, 3 ); + } + + /* The following loop goes through all reasonable chA - chB pairs for the half-sphere */ + c_opt = 0; + while ( c_opt < num_connection_options && *connection_write_index < max_num_connections ) + { + chA = connection_options[c_opt].chA; + chB = connection_options[c_opt].chB; + new_arc = connection_options[c_opt].arc; + + /* Cross-product is needed for later stages */ + vbap_crossp( speaker_node_data[chA].unit_vec, speaker_node_data[chB].unit_vec, new_cross ); + + /* Determine if new connection between chA and chB is valid */ + new_connection_is_valid = 1; + c = half_sphere_first_connection; + while ( ( c < *connection_write_index ) && new_connection_is_valid ) + { + cmp_chA = connections[c][0]; + cmp_chB = connections[c][1]; + /* The connections are compared only if they don't involve same speaker nodes */ + if ( ( cmp_chA != chA ) && ( cmp_chA != chB ) && ( cmp_chB != chA ) && ( cmp_chB != chB ) ) + { + /* The following lines determine if the connection chA-chB crosses with the connection cmp_chA-cmp_chB.*/ + /* The connections, i.e., node-pairs determine a plane. The crossing can be determined by + * studying the intersection of these planes. */ + vbap_crossp( connection_cross[c], new_cross, planeCrossingVec ); + tmpFloat = 1e-12f; + cmp_arc = connection_arc[c]; + for ( k = 0; k < 3; k++ ) + { + tmpFloat += planeCrossingVec[k] * planeCrossingVec[k]; + } + normVal = sqrtf( 1.0f / tmpFloat ); + + for ( k = 0; k < 3; k++ ) + { + planeCrossingVec[k] *= normVal; + } + + /* If the plane intersection is between both connections, then the two connections cross. */ + /* Study first if the crossing is between arc chA-chB */ + angleCmp = acosf( dotp( planeCrossingVec, speaker_node_data[chA].unit_vec, 3 ) ); + angleCmp += acosf( dotp( planeCrossingVec, speaker_node_data[chB].unit_vec, 3 ) ); + + within_first_arc = 0; + if ( fabsf( new_arc - angleCmp ) < 0.01f ) + { + within_first_arc = 1; + } + else if ( fabsf( new_arc - ( 2.0f * EVS_PI - angleCmp ) ) < 0.01f ) + { + within_first_arc = 1; + /* In this case, the plane crossing vector is inverted. The inverse is another + * plane-crossing vector, and detected to be between chA-chB connection.*/ + for ( k = 0; k < 3; k++ ) + { + planeCrossingVec[k] *= -1.0f; + } + } + + /* Study if the crossing is also between arc cmp_chA-cmp_chB */ + if ( within_first_arc > 0 ) + { + angleCmp = acosf( dotp( planeCrossingVec, speaker_node_data[cmp_chA].unit_vec, 3 ) ); + angleCmp += acosf( dotp( planeCrossingVec, speaker_node_data[cmp_chB].unit_vec, 3 ) ); + if ( fabsf( cmp_arc - angleCmp ) < 0.01f ) + { + /* A crossing is detected. The new connection is not valid, because + * the connections were ordered in order of preference (arc_weighted) */ + new_connection_is_valid = 0; + } + } + } + c++; + } + + /* Store the new connection which has been confirmed valid */ + if ( new_connection_is_valid > 0 ) + { + connections[*connection_write_index][0] = chA; + connections[*connection_write_index][1] = chB; + connection_arc[*connection_write_index] = new_arc; + connection_cross[*connection_write_index][0] = new_cross[0]; + connection_cross[*connection_write_index][1] = new_cross[1]; + connection_cross[*connection_write_index][2] = new_cross[2]; + ( *connection_write_index )++; + } + c_opt++; + } + + free( connection_options ); + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------------* + * determine_non_crossing_planes() + * + * Determine non-crossing planes + *-------------------------------------------------------------------------*/ + +/*! r: number of non-crossing planes */ +static int16_t determine_non_crossing_planes( + const int16_t num_speaker_nodes, /* i : number of speaker nodes */ + const VBAP_SPEAKER_NODE *node_data, /* i : speaker node data */ + float *non_crossing_plane_elevation_deg /* o : vector of non-crossing plane elevations */ +) +{ + float next_ele_check; + float ele_check; + float max_gap; + float gap_to_next_ls; + int16_t ch, ch_cmp; + int16_t num_planes; + + ele_check = -999.9f; + num_planes = 0; + + /* For each plane, check if a non-crossing plane should be determined */ + while ( ele_check < 90.0f ) + { + next_ele_check = 999.9f; + /* Find next node elevation that is not in horizontal plane */ + for ( ch = 0; ch < num_speaker_nodes; ch++ ) + { + if ( ( node_data[ch].group != SPEAKER_NODE_HORIZONTAL ) && ( node_data[ch].ele_deg > ele_check + VBAP_EPSILON ) && ( node_data[ch].ele_deg < next_ele_check - VBAP_EPSILON ) ) + { + next_ele_check = node_data[ch].ele_deg; + } + } + ele_check = next_ele_check; + if ( ele_check > 90.0f ) + { + /* When no next node elevation found, break loop */ + break; + } + + max_gap = -9999.9f; + for ( ch = 0; ch < num_speaker_nodes; ch++ ) + { + /* Find gap to the next speaker node at the same plane */ + if ( fabsf( node_data[ch].ele_deg - ele_check ) < VBAP_EPSILON ) + { + gap_to_next_ls = 99999.9f; + for ( ch_cmp = 0; ch_cmp < num_speaker_nodes; ch_cmp++ ) + { + if ( ch_cmp != ch && fabsf( node_data[ch_cmp].ele_deg - ele_check ) < VBAP_EPSILON ) + { + float gap = node_data[ch_cmp].azi_deg - node_data[ch].azi_deg; + while ( gap < 0 ) + { + gap += 360.0f; + } + if ( gap < gap_to_next_ls ) + { + gap_to_next_ls = gap; + } + } + } + /* Find maximum gap on that plane */ + if ( gap_to_next_ls > max_gap ) + { + max_gap = gap_to_next_ls; + } + } + } + + /* If maximum gap is small enough, then a non-crossing plane is detected */ + if ( max_gap < ( VBAP_MAX_HORIZONTAL_GAP_FOR_PLANE_DETECTION + VBAP_EPSILON ) && max_gap > 0.0f ) + { + non_crossing_plane_elevation_deg[num_planes] = ele_check; + num_planes++; + if ( num_planes == VBAP_MAX_PLANES ) + { + /* Memory init limit. Does not happen with any real speaker node configuration. + Triangulation succeeds even if number of non_crossing_planes are limited. */ + break; + } + } + } + + return num_planes; +} + + +/*-------------------------------------------------------------------------* + * reorder_triplets() + * + * Reorder virtual surface triplets into provided target order. + *-------------------------------------------------------------------------*/ + +static void reorder_triplets( + VBAP_VS_TRIPLET *triplets, /* i/o: VS triplets to be reordered */ + const int16_t *target_order, /* i : Target order for VS triplets */ + const int16_t num_triplets /* i : Number of VS triplets */ +) +{ + VBAP_VS_TRIPLET tempTriplets[VBAP_MAX_NUM_TRIPLETS]; + int16_t c; + + /* First copy to temp array */ + for ( c = 0; c < num_triplets; c++ ) + { + tempTriplets[c] = triplets[c]; + } + + /* Then move back in sorted order */ + for ( c = 0; c < num_triplets; c++ ) + { + triplets[c] = tempTriplets[target_order[c]]; + } + + return; +} diff --git a/lib_dec/jbm_jb4_circularbuffer.c b/lib_dec/jbm_jb4_circularbuffer.c new file mode 100644 index 0000000000000000000000000000000000000000..03c040c5750e37aa022ba5e907b23471d1419221 --- /dev/null +++ b/lib_dec/jbm_jb4_circularbuffer.c @@ -0,0 +1,479 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include "options.h" +#include "string.h" +#include "prot.h" +#include "wmc_auto.h" +/* local includes */ +#include "jbm_jb4_circularbuffer.h" + + +/** Calculates percentile by selecting greatest elements. + * This function partial sorts all given elements in the given buffer. + * @param[in,out] elements ascending sorted buffer of selected greatest elements + * @param[in,out] size size of elements buffer + * @param[in] capacity maximum number of elements to buffer + * @param[in] newElement element to insert in buffer if great enough */ +static void JB4_CIRCULARBUFFER_calcPercentile( JB4_CIRCULARBUFFER_ELEMENT *elements, uint16_t *size, uint16_t capacity, JB4_CIRCULARBUFFER_ELEMENT newElement ); + +/** circular buffer (FIFO) with fixed capacity */ +struct JB4_CIRCULARBUFFER +{ + /** elements of circular buffer */ + JB4_CIRCULARBUFFER_ELEMENT *data; + /** maximum allowed number of elements plus one free element (to decide between full/empty buffer) */ + uint16_t capacity; + /** position of next enque operation */ + uint16_t writePos; + /** position of next deque operation */ + uint16_t readPos; +}; + + +/* Creates a circular buffer (FIFO) */ +ivas_error JB4_CIRCULARBUFFER_Create( JB4_CIRCULARBUFFER_HANDLE *ph ) +{ + JB4_CIRCULARBUFFER_HANDLE h; + + if ( ( h = malloc( sizeof( struct JB4_CIRCULARBUFFER ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for JBM\n" ) ); + } + + h->data = NULL; + h->capacity = 0; + h->writePos = 0; + h->readPos = 0; + + *ph = h; + + return IVAS_ERR_OK; +} + + +/* Destroys the circular buffer (FIFO) */ +void JB4_CIRCULARBUFFER_Destroy( + JB4_CIRCULARBUFFER_HANDLE *ph ) +{ + JB4_CIRCULARBUFFER_HANDLE h; + + if ( !ph ) + { + return; + } + h = *ph; + if ( !h ) + { + return; + } + + if ( h->data ) + { + free( h->data ); + } + free( h ); + *ph = NULL; + + return; +} + + +/* Initializes a circular buffer (FIFO) with a fixed maximum allowed number of elements */ +int16_t JB4_CIRCULARBUFFER_Init( + JB4_CIRCULARBUFFER_HANDLE h, + uint16_t capacity ) +{ + /* keep one element free to be able to decide between full/empty buffer */ + ++capacity; + + if ( ( h->data = malloc( capacity * sizeof( JB4_CIRCULARBUFFER_ELEMENT ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for JBM\n" ) ); + } + + h->capacity = capacity; + h->writePos = 0; + h->readPos = 0; + + return IVAS_ERR_OK; +} + + +int16_t JB4_CIRCULARBUFFER_Enque( + JB4_CIRCULARBUFFER_HANDLE h, + JB4_CIRCULARBUFFER_ELEMENT element ) +{ + if ( JB4_CIRCULARBUFFER_IsFull( h ) ) + { + return -1; + } + + h->data[h->writePos] = element; + ++h->writePos; + if ( h->writePos == h->capacity ) + { + h->writePos = 0; + } + + return 0; +} + + +int16_t JB4_CIRCULARBUFFER_Deque( + JB4_CIRCULARBUFFER_HANDLE h, + JB4_CIRCULARBUFFER_ELEMENT *pElement ) +{ + if ( JB4_CIRCULARBUFFER_IsEmpty( h ) ) + { + return -1; + } + + *pElement = h->data[h->readPos]; + ++h->readPos; + if ( h->readPos == h->capacity ) + { + h->readPos = 0; + } + + return 0; +} + + +/* Returns the first element. */ +JB4_CIRCULARBUFFER_ELEMENT JB4_CIRCULARBUFFER_Front( + const JB4_CIRCULARBUFFER_HANDLE h ) +{ + JB4_CIRCULARBUFFER_ELEMENT ret; + + ret = h->data[h->readPos]; + + return ret; +} + +/* Returns the last element. */ +JB4_CIRCULARBUFFER_ELEMENT JB4_CIRCULARBUFFER_Back( + const JB4_CIRCULARBUFFER_HANDLE h ) +{ + JB4_CIRCULARBUFFER_ELEMENT ret; + + if ( h->writePos != 0U ) + { + ret = h->data[h->writePos - 1]; + } + else + { + ret = h->data[h->capacity - 1]; + } + + + return ret; +} + + +int16_t JB4_CIRCULARBUFFER_IsEmpty( + const JB4_CIRCULARBUFFER_HANDLE h ) +{ + int16_t ret; + + if ( h->readPos == h->writePos ) + { + ret = 1; + } + else + { + ret = 0; + } + + return ret; +} + + +int16_t JB4_CIRCULARBUFFER_IsFull( + const JB4_CIRCULARBUFFER_HANDLE h ) +{ + int16_t ret; + + if ( ( ( h->writePos + 1 ) % h->capacity ) == h->readPos ) + { + ret = 1; + } + else + { + ret = 0; + } + + return ret; +} + + +uint16_t JB4_CIRCULARBUFFER_Size( + const JB4_CIRCULARBUFFER_HANDLE h ) +{ + uint16_t ret; + + if ( h->readPos <= h->writePos ) + { + ret = h->writePos - h->readPos; + } + else + { + /* wrap around */ + ret = h->writePos + h->capacity - h->readPos; + } + + + return ret; +} + + +/* Calculates statistics over all elements: min element */ +void JB4_CIRCULARBUFFER_Min( + const JB4_CIRCULARBUFFER_HANDLE h, + JB4_CIRCULARBUFFER_ELEMENT *pMin ) +{ + uint16_t i; + JB4_CIRCULARBUFFER_ELEMENT minEle; + + /* init output variable */ + minEle = h->data[h->readPos]; + + if ( h->readPos <= h->writePos ) + { + /* no wrap around */ + /* calc statistics for [readPos;writePos[ */ + for ( i = h->readPos; i != h->writePos; ++i ) + { + if ( h->data[i] < minEle ) + { + minEle = h->data[i]; + } + } + } + else + { + /* wrap around */ + /* calc statistics for [readPos;capacity[ */ + for ( i = h->readPos; i != h->capacity; ++i ) + { + if ( h->data[i] < minEle ) + { + minEle = h->data[i]; + } + } + /* calc statistics for [0;writePos[ */ + for ( i = 0; i != h->writePos; ++i ) + { + if ( h->data[i] < minEle ) + { + minEle = h->data[i]; + } + } + } + + *pMin = minEle; +} + + +/* Calculates statistics over all elements: max element */ +void JB4_CIRCULARBUFFER_Max( + const JB4_CIRCULARBUFFER_HANDLE h, + JB4_CIRCULARBUFFER_ELEMENT *pMax ) +{ + uint16_t i; + JB4_CIRCULARBUFFER_ELEMENT maxEle; + + /* init output variable */ + maxEle = h->data[h->readPos]; + if ( h->readPos <= h->writePos ) + { + /* no wrap around */ + /* calc statistics for [readPos;writePos[ */ + for ( i = h->readPos; i != h->writePos; ++i ) + { + if ( h->data[i] > maxEle ) + { + maxEle = h->data[i]; + } + } + } + else + { + /* wrap around */ + /* calc statistics for [readPos;capacity[ */ + for ( i = h->readPos; i != h->capacity; ++i ) + { + if ( h->data[i] > maxEle ) + { + maxEle = h->data[i]; + } + } + /* calc statistics for [0;writePos[ */ + for ( i = 0; i != h->writePos; ++i ) + { + if ( h->data[i] > maxEle ) + { + maxEle = h->data[i]; + } + } + } + + *pMax = maxEle; + + return; +} + +#define JBM_MAX_CIRCULAR_ELEMENTS 100 + +/* Calculates statistics over a considered fraction of all elements: min element and percentile */ +void JB4_CIRCULARBUFFER_MinAndPercentile( + const JB4_CIRCULARBUFFER_HANDLE h, + uint16_t nElementsToIgnore, + JB4_CIRCULARBUFFER_ELEMENT *pMin, + JB4_CIRCULARBUFFER_ELEMENT *pPercentile ) +{ + uint16_t i; + JB4_CIRCULARBUFFER_ELEMENT maxElements[JBM_MAX_CIRCULAR_ELEMENTS]; + uint16_t maxElementsSize; + uint16_t maxElementsCapacity; + JB4_CIRCULARBUFFER_ELEMENT minEle; + + /* init output variables */ + minEle = h->data[h->readPos]; + + /* To calculate the percentile, a number of elements with the highest values are collected in maxElements in + * ascending sorted order. This array has a size of nElementsToIgnore plus one. This additional element is the + * lowest of all maxElements, and is called the percentile of all elements. */ + + maxElementsSize = 0; + maxElementsCapacity = nElementsToIgnore + 1; + assert( maxElementsCapacity <= JBM_MAX_CIRCULAR_ELEMENTS ); + if ( h->readPos <= h->writePos ) + { + /* no wrap around */ + /* calc statistics for [readPos;writePos[ */ + for ( i = h->readPos; i != h->writePos; ++i ) + { + if ( h->data[i] < minEle ) + { + minEle = h->data[i]; + } + JB4_CIRCULARBUFFER_calcPercentile( maxElements, &maxElementsSize, maxElementsCapacity, h->data[i] ); + } + } + else + { + /* wrap around */ + /* calc statistics for [readPos;capacity[ */ + for ( i = h->readPos; i != h->capacity; ++i ) + { + if ( h->data[i] < minEle ) + { + minEle = h->data[i]; + } + JB4_CIRCULARBUFFER_calcPercentile( maxElements, &maxElementsSize, maxElementsCapacity, h->data[i] ); + } + /* calc statistics for [0;writePos[ */ + for ( i = 0; i != h->writePos; ++i ) + { + if ( h->data[i] < minEle ) + { + minEle = h->data[i]; + } + JB4_CIRCULARBUFFER_calcPercentile( maxElements, &maxElementsSize, maxElementsCapacity, h->data[i] ); + } + } + + *pPercentile = maxElements[0]; + *pMin = minEle; + + return; +} + + +/* Calculates percentile by selecting greatest elements. */ +static void JB4_CIRCULARBUFFER_calcPercentile( + JB4_CIRCULARBUFFER_ELEMENT *elements, + uint16_t *size, + uint16_t capacity, + JB4_CIRCULARBUFFER_ELEMENT newElement ) +{ + uint16_t i; + + /* insert newElement if elements buffer is not yet full */ + if ( *size < capacity ) + { + for ( i = 0; i != *size; ++i ) + { + if ( newElement <= elements[i] ) + { + /* insert newElement at index i */ + memmove( elements + i + 1, elements + i, ( *size - i ) * sizeof( JB4_CIRCULARBUFFER_ELEMENT ) ); /* IVAS_fmToDo: avoid use of memmove() */ + elements[i] = newElement; + ++*size; + return; + } + } + /* newElement is maximum, just append it */ + elements[*size] = newElement; + ++*size; + return; + } + + /* check if newElement is too small to be inserted in elements buffer */ + if ( newElement <= elements[0] ) + { + return; + } + + /* select position to insert newElement to elements */ + for ( i = *size - 1; i != 0; --i ) + { + if ( newElement >= elements[i] ) + { + /* insert newElement at index i */ + memmove( elements, elements + 1, i * sizeof( JB4_CIRCULARBUFFER_ELEMENT ) ); + elements[i] = newElement; + return; + } + } + /* newElement is just greater than first on in elements buffer */ + elements[0] = newElement; + + return; +} diff --git a/lib_dec/jbm_jb4_circularbuffer.h b/lib_dec/jbm_jb4_circularbuffer.h new file mode 100644 index 0000000000000000000000000000000000000000..e14144b329e0984730809384e565db6c9b42b6ae --- /dev/null +++ b/lib_dec/jbm_jb4_circularbuffer.h @@ -0,0 +1,76 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#ifndef JBM_JB4_CIRCULARBUFFER_H +#define JBM_JB4_CIRCULARBUFFER_H JBM_JB4_CIRCULARBUFFER_H + +#include "prot.h" +#include "cnst.h" + +/** handle for circular buffer (FIFO) with fixed capacity */ +typedef struct JB4_CIRCULARBUFFER *JB4_CIRCULARBUFFER_HANDLE; + +/** type of circular buffer elements */ +typedef int32_t JB4_CIRCULARBUFFER_ELEMENT; + + +ivas_error JB4_CIRCULARBUFFER_Create( JB4_CIRCULARBUFFER_HANDLE *ph ); + +void JB4_CIRCULARBUFFER_Destroy( JB4_CIRCULARBUFFER_HANDLE *ph ); + +int16_t JB4_CIRCULARBUFFER_Init( JB4_CIRCULARBUFFER_HANDLE h, uint16_t capacity ); + +int16_t JB4_CIRCULARBUFFER_Enque( JB4_CIRCULARBUFFER_HANDLE h, JB4_CIRCULARBUFFER_ELEMENT element ); + +int16_t JB4_CIRCULARBUFFER_Deque( JB4_CIRCULARBUFFER_HANDLE h, JB4_CIRCULARBUFFER_ELEMENT *pElement ); + +JB4_CIRCULARBUFFER_ELEMENT JB4_CIRCULARBUFFER_Front( const JB4_CIRCULARBUFFER_HANDLE h ); + +JB4_CIRCULARBUFFER_ELEMENT JB4_CIRCULARBUFFER_Back( const JB4_CIRCULARBUFFER_HANDLE h ); + +int16_t JB4_CIRCULARBUFFER_IsEmpty( const JB4_CIRCULARBUFFER_HANDLE h ); + +int16_t JB4_CIRCULARBUFFER_IsFull( const JB4_CIRCULARBUFFER_HANDLE h ); + +uint16_t JB4_CIRCULARBUFFER_Size( const JB4_CIRCULARBUFFER_HANDLE h ); + +void JB4_CIRCULARBUFFER_Min( const JB4_CIRCULARBUFFER_HANDLE h, JB4_CIRCULARBUFFER_ELEMENT *pMin ); + +void JB4_CIRCULARBUFFER_Max( const JB4_CIRCULARBUFFER_HANDLE h, JB4_CIRCULARBUFFER_ELEMENT *pMax ); + +void JB4_CIRCULARBUFFER_MinAndPercentile( const JB4_CIRCULARBUFFER_HANDLE h, uint16_t nElementsToIgnore, JB4_CIRCULARBUFFER_ELEMENT *pMin, JB4_CIRCULARBUFFER_ELEMENT *pPercentile ); + +#endif /* JBM_JB4_CIRCULARBUFFER_H */ diff --git a/lib_dec/jbm_jb4_inputbuffer.c b/lib_dec/jbm_jb4_inputbuffer.c new file mode 100644 index 0000000000000000000000000000000000000000..0982a781f37b91385570cc0f4d4195501c1fd288 --- /dev/null +++ b/lib_dec/jbm_jb4_inputbuffer.c @@ -0,0 +1,373 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +/** \file jbm_jb4_inputbuffer.c RTP input buffer with fixed capacity. */ + +#include +#include +#include "options.h" +#include "prot.h" +#include "string.h" +#include "jbm_jb4_inputbuffer.h" +#include "wmc_auto.h" + +#define WMC_TOOL_SKIP + + +/** input buffer with fixed capacity */ +struct JB4_INPUTBUFFER +{ + /** elements of input buffer */ + JB4_INPUTBUFFER_ELEMENT *data; + /** maximum allowed number of elements plus one free element (to decide between full/empty buffer) */ + uint16_t capacity; + /** position of next enque operation */ + uint16_t writePos; + /** position of next deque operation */ + uint16_t readPos; + /** function to compare two elements */ + int16_t ( *compareFunction )( const JB4_INPUTBUFFER_ELEMENT first, const JB4_INPUTBUFFER_ELEMENT second, bool *replaceWithNewElementIfEqual ); +}; + + +/* Creates a input buffer */ +ivas_error JB4_INPUTBUFFER_Create( + JB4_INPUTBUFFER_HANDLE *ph ) +{ + JB4_INPUTBUFFER_HANDLE h; + + if ( ( h = malloc( sizeof( struct JB4_INPUTBUFFER ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for JBM\n" ) ); + } + + h->data = NULL; + h->capacity = 0; + h->writePos = 0; + h->readPos = 0; + h->compareFunction = NULL; + + *ph = h; + + return IVAS_ERR_OK; +} + + +/* Destroys the input buffer */ +void JB4_INPUTBUFFER_Destroy( + JB4_INPUTBUFFER_HANDLE *ph ) +{ + JB4_INPUTBUFFER_HANDLE h; + + if ( !ph ) + { + return; + } + h = *ph; + if ( !h ) + { + return; + } + + if ( h->data ) + { + free( h->data ); + } + + free( h ); + *ph = NULL; + + return; +} + + +/* Initializes a input buffer with a fixed maximum allowed number of elements */ +ivas_error JB4_INPUTBUFFER_Init( + JB4_INPUTBUFFER_HANDLE h, + uint16_t capacity, + int16_t ( *compareFunction )( const JB4_INPUTBUFFER_ELEMENT first, const JB4_INPUTBUFFER_ELEMENT second, bool *replaceWithNewElementIfEqual ) ) +{ + + /* keep one element free to be able to decide between full/empty buffer */ + ++capacity; + if ( ( h->data = malloc( capacity * sizeof( JB4_INPUTBUFFER_ELEMENT ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for JBM\n" ) ); + } + + h->capacity = capacity; + h->writePos = 0; + h->readPos = 0; + h->compareFunction = compareFunction; + + return IVAS_ERR_OK; +} + + +int16_t JB4_INPUTBUFFER_Enque( + JB4_INPUTBUFFER_HANDLE h, + JB4_INPUTBUFFER_ELEMENT element, + JB4_INPUTBUFFER_ELEMENT *replacedElement ) +{ + uint16_t size; + int16_t low, high, middle, diff; + uint16_t insertPos; + uint16_t canMoveRight; + uint16_t canMoveLeft; + bool replace; + *replacedElement = NULL; + + size = JB4_INPUTBUFFER_Size( h ); + if ( size >= h->capacity - 1 ) + { + return -1; + } + + /* appending the first element is straight forward */ + if ( size == 0U ) + { + h->data[h->writePos] = element; + ++h->writePos; + if ( h->writePos == h->capacity ) + { + h->writePos = 0; + } + return 0; + } + + /* there's a high probability that the new element can be appended at the back */ + if ( h->compareFunction( element, JB4_INPUTBUFFER_Back( h ), &replace ) > 0 ) + { + h->data[h->writePos] = element; + ++h->writePos; + if ( h->writePos == h->capacity ) + { + h->writePos = 0; + } + return 0; + } + + /* out of order: use binary search to get the position to insert */ + low = 0; + high = size - 1; + while ( low <= high ) + { + middle = low + ( high - low ) / 2; + diff = h->compareFunction( element, JB4_INPUTBUFFER_Element( h, middle ), &replace ); + if ( diff < 0 ) + { + high = middle - 1; + } + else if ( diff > 0 ) + { + low = middle + 1; + } + else /* an element with same index is already stored */ + { + if ( replace != 0 ) + { + *replacedElement = h->data[( h->readPos + middle ) % h->capacity]; + h->data[( h->readPos + middle ) % h->capacity] = element; + return 0; + } + return 1; + } + } + + assert( h->compareFunction( element, JB4_INPUTBUFFER_Element( h, low ), &replace ) != 0 ); + if ( low > 0 ) + assert( h->compareFunction( element, JB4_INPUTBUFFER_Element( h, low - 1 ), &replace ) > 0 ); + assert( h->compareFunction( element, JB4_INPUTBUFFER_Element( h, low ), &replace ) < 0 ); + if ( (uint16_t) ( low + 1 ) < size ) + assert( h->compareFunction( element, JB4_INPUTBUFFER_Element( h, low + 1 ), &replace ) < 0 ); + + insertPos = ( h->readPos + low ) % h->capacity; + if ( h->readPos < h->writePos ) + { + canMoveRight = 1; + canMoveLeft = h->readPos > 0; + } + else + { + canMoveRight = insertPos < h->writePos; + canMoveLeft = insertPos > h->writePos; + } + + assert( canMoveRight != 0 || canMoveLeft != 0 ); + + if ( canMoveRight ) + { + /* move higher elements to the right and insert at insertPos */ + memmove( h->data + insertPos + 1, h->data + insertPos, ( h->writePos - insertPos ) * sizeof( JB4_INPUTBUFFER_ELEMENT ) ); /* IVAS_fmToDo: avoid use of memmove() */ + h->data[insertPos] = element; + ++h->writePos; + if ( h->writePos == h->capacity ) + { + h->writePos = 0; + } + } + else + { + /* move lower elements to the left and insert before insertPos */ + memmove( h->data + h->readPos - 1, h->data + h->readPos, low * sizeof( JB4_INPUTBUFFER_ELEMENT ) ); /* IVAS_fmToDo: avoid use of memmove() */ + h->data[insertPos - 1] = element; + --h->readPos; + assert( (int16_t) h->readPos >= 0 ); + } + + return 0; +} + + +int16_t JB4_INPUTBUFFER_Deque( + JB4_INPUTBUFFER_HANDLE h, + JB4_INPUTBUFFER_ELEMENT *pElement ) +{ + if ( JB4_INPUTBUFFER_IsEmpty( h ) ) + { + return -1; + } + + *pElement = h->data[h->readPos]; + ++h->readPos; + if ( h->readPos == h->capacity ) + { + h->readPos = 0; + } + + return 0; +} + + +/* Returns the first element. */ +JB4_INPUTBUFFER_ELEMENT JB4_INPUTBUFFER_Front( + const JB4_INPUTBUFFER_HANDLE h ) +{ + JB4_INPUTBUFFER_ELEMENT ret; + + + ret = h->data[h->readPos]; + + return ret; +} + + +/* Returns the last element. */ +JB4_INPUTBUFFER_ELEMENT JB4_INPUTBUFFER_Back( + const JB4_INPUTBUFFER_HANDLE h ) +{ + JB4_INPUTBUFFER_ELEMENT ret; + + if ( h->writePos != 0U ) + { + ret = h->data[h->writePos - 1]; + } + else + { + ret = h->data[h->capacity - 1]; + } + + return ret; +} + + +/* Returns the element with the given index (0 means front element). */ +JB4_INPUTBUFFER_ELEMENT JB4_INPUTBUFFER_Element( + const JB4_INPUTBUFFER_HANDLE h, + uint16_t index ) +{ + JB4_INPUTBUFFER_ELEMENT ret; + + /* return h->data[(h->readPos + index) % h->capacity] without error handling */ + if ( h->readPos + index < h->capacity ) + { + ret = h->data[h->readPos + index]; + } + else + { + /* wrap around */ + ret = h->data[h->readPos + index - h->capacity]; + } + + return ret; +} + + +int16_t JB4_INPUTBUFFER_IsEmpty( + const JB4_INPUTBUFFER_HANDLE h ) +{ + int16_t ret; + + ret = h->readPos == h->writePos; + + return ret; +} + + +int16_t JB4_INPUTBUFFER_IsFull( + const JB4_INPUTBUFFER_HANDLE h ) +{ + int16_t ret; + + ret = 0; + if ( JB4_INPUTBUFFER_Size( h ) == h->capacity - 1 ) + { + ret = 1; + } + + return ret; +} + + +uint16_t JB4_INPUTBUFFER_Size( + const JB4_INPUTBUFFER_HANDLE h ) +{ + uint16_t ret; + + if ( h->readPos <= h->writePos ) + { + ret = h->writePos - h->readPos; + } + else + { + /* wrap around */ + ret = h->writePos + h->capacity - h->readPos; + } + + return ret; +} + +#undef WMC_TOOL_SKIP diff --git a/lib_dec/jbm_jb4_inputbuffer.h b/lib_dec/jbm_jb4_inputbuffer.h new file mode 100644 index 0000000000000000000000000000000000000000..6087ecb20717b76c316e2349ca79a0e95131629e --- /dev/null +++ b/lib_dec/jbm_jb4_inputbuffer.h @@ -0,0 +1,73 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +/** \file jbm_jb4_inputbuffer.h RTP input buffer with fixed capacity. */ + +#ifndef JBM_JB4_INPUTBUFFER_H +#define JBM_JB4_INPUTBUFFER_H JBM_JB4_INPUTBUFFER_H + +#include +#include +#include "options.h" + + +typedef struct JB4_INPUTBUFFER *JB4_INPUTBUFFER_HANDLE; + +typedef void *JB4_INPUTBUFFER_ELEMENT; + +ivas_error JB4_INPUTBUFFER_Create( JB4_INPUTBUFFER_HANDLE *ph ); + +void JB4_INPUTBUFFER_Destroy( JB4_INPUTBUFFER_HANDLE *ph ); + +ivas_error JB4_INPUTBUFFER_Init( JB4_INPUTBUFFER_HANDLE h, uint16_t capacity, int16_t ( *compareFunction )( const JB4_INPUTBUFFER_ELEMENT newElement, const JB4_INPUTBUFFER_ELEMENT arrayElement, bool *replaceWithNewElementIfEqual ) ); + +int16_t JB4_INPUTBUFFER_Enque( JB4_INPUTBUFFER_HANDLE h, JB4_INPUTBUFFER_ELEMENT element, JB4_INPUTBUFFER_ELEMENT *replacedElement ); + +int16_t JB4_INPUTBUFFER_Deque( JB4_INPUTBUFFER_HANDLE h, JB4_INPUTBUFFER_ELEMENT *pElement ); + +JB4_INPUTBUFFER_ELEMENT JB4_INPUTBUFFER_Front( const JB4_INPUTBUFFER_HANDLE h ); + +JB4_INPUTBUFFER_ELEMENT JB4_INPUTBUFFER_Back( const JB4_INPUTBUFFER_HANDLE h ); + +JB4_INPUTBUFFER_ELEMENT JB4_INPUTBUFFER_Element( const JB4_INPUTBUFFER_HANDLE h, uint16_t index ); + +int16_t JB4_INPUTBUFFER_IsEmpty( const JB4_INPUTBUFFER_HANDLE h ); + +int16_t JB4_INPUTBUFFER_IsFull( const JB4_INPUTBUFFER_HANDLE h ); + +uint16_t JB4_INPUTBUFFER_Size( const JB4_INPUTBUFFER_HANDLE h ); + +#endif /* JBM_JB4_INPUTBUFFER_H */ diff --git a/lib_dec/jbm_jb4_jmf.c b/lib_dec/jbm_jb4_jmf.c new file mode 100644 index 0000000000000000000000000000000000000000..99abd75e5adc4689aedaae1985113f2befe4ddf7 --- /dev/null +++ b/lib_dec/jbm_jb4_jmf.c @@ -0,0 +1,340 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +/** \file jbm_jb4_jmf.c jitter measure fifo - a fifo used for windowed measure of network status */ + +/* system includes */ +#include +#include +#include +#include +#include "options.h" +#include "prot.h" +#include "wmc_auto.h" + +/* local includes */ +#include "jbm_jb4_jmf.h" +#include "jbm_jb4_circularbuffer.h" +/* instrumentation */ + + +/** jitter measure fifo - a fifo used for windowed measure of network status */ +struct JB4_JMF +{ + /** scale of system time and RTP time stamps */ + int16_t timeScale; + /** the window size of the fifo as time in sysTimeScale */ + uint16_t maxWindowDuration; + /** considered fraction in 1/1000 units, e.g. 900 ignores 10% of the highest samples */ + uint16_t consideredFraction; + + /** fifo containing the delay entries (ordered by receive time) */ + JB4_CIRCULARBUFFER_HANDLE fifo; + /** fifo containing the offset entries (ordered by receive time) */ + JB4_CIRCULARBUFFER_HANDLE offsetFifo; + /** fifo containing the RTP times of the values in offsetFifo (ordered by receive time) */ + JB4_CIRCULARBUFFER_HANDLE timeStampFifo; + /** flag if the first packet was already pushed */ + int16_t firstPacketPushed; + /** last packets system time in microseconds */ + int32_t lastSysTime; + /** RTP time stamp of the last pushed packet */ + int32_t lastRtpTimeStamp; + /** last packets calculated delay value */ + int32_t lastDelay; + /** number of elements to ignore for percentile calculation - value set within init */ + int16_t nElementsToIgnore; +}; + + +/** helper function to add an entry at back of the buffer */ +static void JB4_JMF_pushBack( JB4_JMF_HANDLE h, const int32_t delay, const int32_t offset, const uint32_t time ); + +/** helper function to remove an entry from the front of the buffer */ +static void JB4_JMF_popFront( JB4_JMF_HANDLE h ); + + +ivas_error JB4_JMF_Create( + JB4_JMF_HANDLE *ph ) +{ + JB4_JMF_HANDLE h; + ivas_error error; + + if ( ( h = malloc( sizeof( struct JB4_JMF ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for JBM\n" ) ); + } + + if ( ( error = JB4_CIRCULARBUFFER_Create( &h->fifo ) ) != IVAS_ERR_OK ) + { + return error; + } + if ( ( JB4_CIRCULARBUFFER_Create( &h->offsetFifo ) ) != IVAS_ERR_OK ) + { + return error; + } + if ( ( JB4_CIRCULARBUFFER_Create( &h->timeStampFifo ) ) != IVAS_ERR_OK ) + { + return error; + } + + h->timeScale = 1000; + h->consideredFraction = 1000; + h->firstPacketPushed = 0; + h->lastSysTime = 0; + h->lastRtpTimeStamp = 0; + h->lastDelay = 0; + h->nElementsToIgnore = 0; + + *ph = h; + + return IVAS_ERR_OK; +} + + +void JB4_JMF_Destroy( + JB4_JMF_HANDLE *ph ) +{ + JB4_JMF_HANDLE h; + + if ( !ph ) + { + return; + } + h = *ph; + if ( !h ) + { + return; + } + + JB4_CIRCULARBUFFER_Destroy( &h->fifo ); + JB4_CIRCULARBUFFER_Destroy( &h->offsetFifo ); + JB4_CIRCULARBUFFER_Destroy( &h->timeStampFifo ); + + free( h ); + *ph = NULL; + + return; +} + + +/* function to set the window size of the fifo and the fraction which will be considered */ +int16_t JB4_JMF_Init( + JB4_JMF_HANDLE h, + const int16_t timeScale, + const uint16_t windowSize, + const uint16_t windowDuration, + const uint16_t consideredFraction ) +{ + + /* check parameters */ + if ( windowSize != 0U && consideredFraction * windowSize / 1000 < 2 ) + { + return -1; + } + if ( consideredFraction > 1000 ) + { + return -1; + } + + /* store values */ + h->timeScale = timeScale; + h->maxWindowDuration = windowDuration; + h->consideredFraction = consideredFraction; + + JB4_CIRCULARBUFFER_Init( h->fifo, windowSize ); + JB4_CIRCULARBUFFER_Init( h->offsetFifo, windowSize ); + JB4_CIRCULARBUFFER_Init( h->timeStampFifo, windowSize ); + + h->nElementsToIgnore = (uint16_t) ( windowSize * ( 1000 - consideredFraction ) / 1000 ); + + return 0; +} + + +/* function to calculate delay for the current packet */ +int16_t JB4_JMF_PushPacket( + JB4_JMF_HANDLE h, + const uint32_t sysTime, + const uint32_t rtpTimeStamp ) +{ + int32_t rtpTimeDiff, sysTimeDiff; + int32_t offset, delay; + + /* check if this is the first entry */ + if ( h->firstPacketPushed == 0 ) + { + h->firstPacketPushed = 1; + h->lastSysTime = sysTime; + h->lastRtpTimeStamp = rtpTimeStamp; + return 0; + } + + rtpTimeDiff = (int32_t) ( rtpTimeStamp - h->lastRtpTimeStamp ); + sysTimeDiff = sysTime - h->lastSysTime; + offset = sysTime - rtpTimeStamp; + + /* get the delay (yes, signed!!!!) */ + delay = sysTimeDiff - rtpTimeDiff + h->lastDelay; + + /* remember old values */ + h->lastSysTime = sysTime; + h->lastRtpTimeStamp = rtpTimeStamp; + /* reset delay if absolute value is greater than 60s + * to avoid overflow caused by clockdrift */ + if ( delay > 60 * h->timeScale || delay < -60 * h->timeScale ) + { + h->lastDelay = 0; + } + else + { + h->lastDelay = delay; + } + + JB4_JMF_pushBack( h, delay, offset, rtpTimeStamp ); + + return 0; +} + + +/* function to get the current jitter */ +int16_t JB4_JMF_Jitter( + const JB4_JMF_HANDLE h, + uint32_t *jitter ) +{ + JB4_CIRCULARBUFFER_ELEMENT min_ele, percentile; + + /* sanity check (must not be empty) and return invalid result if there is only one entry */ + if ( JB4_CIRCULARBUFFER_Size( h->fifo ) < 2U ) + { + return -1; + } + + JB4_CIRCULARBUFFER_MinAndPercentile( h->fifo, h->nElementsToIgnore, &min_ele, &percentile ); + + /* return the difference between the highest considered and the smallest value */ + *jitter = percentile - min_ele; + assert( percentile >= min_ele ); + + return 0; +} + + +/* function to get the minimum offset between received time and time stamp of all entries in the fifo */ +int16_t JB4_JMF_MinOffset( + const JB4_JMF_HANDLE h, + int32_t *offset ) +{ + JB4_CIRCULARBUFFER_ELEMENT min_ele; + + if ( JB4_CIRCULARBUFFER_IsEmpty( h->offsetFifo ) ) + { + return -1; + } + + JB4_CIRCULARBUFFER_Min( h->offsetFifo, &min_ele ); + + *offset = min_ele; + + return 0; +} + + +/***************************************************************************** + **************************** private functions ****************************** + *****************************************************************************/ + +/* helper function to add entry at back of the buffer */ +static void JB4_JMF_pushBack( + JB4_JMF_HANDLE h, + const int32_t delay, + const int32_t offset, + const uint32_t time ) +{ + int32_t minTime, maxTime; + uint32_t duration; + + /* check for size and discard first entry if too big */ + if ( JB4_CIRCULARBUFFER_IsFull( h->fifo ) ) + { + JB4_JMF_popFront( h ); + } + + /* push back new entry */ + JB4_CIRCULARBUFFER_Enque( h->fifo, delay ); + JB4_CIRCULARBUFFER_Enque( h->offsetFifo, offset ); + JB4_CIRCULARBUFFER_Enque( h->timeStampFifo, time ); + + /* check for duration and discard first entries if too long */ + minTime = JB4_CIRCULARBUFFER_Front( h->timeStampFifo ); + maxTime = JB4_CIRCULARBUFFER_Back( h->timeStampFifo ); + if ( maxTime > minTime ) + { + duration = maxTime - minTime; + while ( duration > h->maxWindowDuration ) + { + JB4_JMF_popFront( h ); + minTime = JB4_CIRCULARBUFFER_Front( h->timeStampFifo ); + if ( maxTime <= minTime ) + { + break; + } + duration = maxTime - minTime; + } + } + + return; +} + + +/* helper function to remove an entry from the front of the buffer */ +static void JB4_JMF_popFront( + JB4_JMF_HANDLE h ) +{ + JB4_CIRCULARBUFFER_ELEMENT tmpElement; + + /* try to remove one element - fails if empty */ + if ( JB4_CIRCULARBUFFER_Deque( h->fifo, &tmpElement ) != 0 ) + { + return; + } + + /* also remove offset entry */ + JB4_CIRCULARBUFFER_Deque( h->offsetFifo, &tmpElement ); + JB4_CIRCULARBUFFER_Deque( h->timeStampFifo, &tmpElement ); + + return; +} diff --git a/lib_dec/jbm_jb4_jmf.h b/lib_dec/jbm_jb4_jmf.h new file mode 100644 index 0000000000000000000000000000000000000000..5efff7cd5ee36c4a91bf2f4cf0dc3b400161f590 --- /dev/null +++ b/lib_dec/jbm_jb4_jmf.h @@ -0,0 +1,61 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +/** \file jbm_jb4_jmf.h jitter measure fifo - a fifo used for windowed measure of network status */ + +#ifndef JBM_JB4_JMF_H +#define JBM_JB4_JMF_H JBM_JB4_JMF_H + +#include +#include "options.h" + +/** handle for jitter measure fifo - a fifo used for windowed measure of network status */ +typedef struct JB4_JMF *JB4_JMF_HANDLE; + +ivas_error JB4_JMF_Create( JB4_JMF_HANDLE *ph ); + +void JB4_JMF_Destroy( JB4_JMF_HANDLE *ph ); + +int16_t JB4_JMF_Init( JB4_JMF_HANDLE h, const int16_t timeScale, const uint16_t windowSize, const uint16_t windowDuration, const uint16_t consideredFraction ); + +int16_t JB4_JMF_PushPacket( JB4_JMF_HANDLE h, const uint32_t sysTime, const uint32_t rtpTimeStamp ); + +int16_t JB4_JMF_Jitter( const JB4_JMF_HANDLE h, uint32_t *jitter ); + +int16_t JB4_JMF_MinOffset( const JB4_JMF_HANDLE h, int32_t *offset ); + + +#endif /* JBM_JB4_JMF_H */ diff --git a/lib_dec/jbm_jb4sb.c b/lib_dec/jbm_jb4sb.c new file mode 100644 index 0000000000000000000000000000000000000000..04a2aac31281cb568bb0763aaa5047ca5e84ccb9 --- /dev/null +++ b/lib_dec/jbm_jb4sb.c @@ -0,0 +1,1533 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +/*! \file jbm_jb4sb.c EVS Jitter Buffer Management Interface */ + +/* system headers */ +#include +#include +#include +#include +#include "options.h" +#include "wmc_auto.h" +/* local headers */ +#include "jbm_jb4_circularbuffer.h" +#include "jbm_jb4_inputbuffer.h" +#include "jbm_jb4_jmf.h" +#include "jbm_jb4sb.h" +#include "prot.h" + +#define WMC_TOOL_SKIP + +#define JB4_MIN( a, b ) ( ( a ) > ( b ) ? ( b ) : ( a ) ) +#define JB4_MAX( a, b ) ( ( a ) > ( b ) ? ( a ) : ( b ) ) + +#define MAXOFFSET 10 + +/*! Calculates the difference between two RTP timestamps - the diff is positive, if B 'later', negative otherwise */ +static int32_t JB4_rtpTimeStampDiff( const uint32_t tsA, const uint32_t tsB ); +/* function to calculate different options for the target playout delay */ +static void JB4_targetPlayoutDelay( const JB4_HANDLE h, uint32_t *targetMin, uint32_t *targetMax, uint32_t *targetDtx, uint32_t *targetStartUp ); +/*! function to do playout adaptation before playing the next data unit */ +/*! In case of time shrinking, data units will be dropped before the next data unit to play is returned and + * in case of time stretching a empty data unit is returned and the frame should be concealed. + * @param[in] now current system time + * @param[out] dataUnit the next data unit to play + * @param[out] scale the scale in percent used as target for time scaling of the returned data unit + * @param[out] maxScaling the maximum allowed external time scaling */ +static int16_t JB4_adaptPlayout( JB4_HANDLE h, uint32_t sysTime, uint32_t extBufferedTime, JB4_DATAUNIT_HANDLE *pDataUnit, uint32_t *scale, uint32_t *maxScaling ); +/*! function to do playout adaptation before playing the first data unit */ +/*! @param[in] now current system time + * @param[out] prebuffer true, if the data unit should be prebuffered */ +static void JB4_adaptFirstPlayout( JB4_HANDLE h, uint32_t sysTime, bool *prebuffer ); +/*! function for playout adaptation while active (no DTX) */ +static void JB4_adaptActivePlayout( JB4_HANDLE h, uint32_t extBufferedTime, uint32_t *scale, uint32_t *maxScaling ); +/*! function for playout adaptation while DTX */ +static void JB4_adaptDtxPlayout( JB4_HANDLE h, uint32_t sysTime, bool *stretchTime ); +/*! function to look into the buffer and check if it makes sense to drop a data unit */ +/*! @param[out] dropEarly true, if a data unit could be dropped early + * @param[out] buffered the buffered time span in timeScale units + * @return true, if a data unit could be dropped */ +static int16_t JB4_inspectBufferForDropping( const JB4_HANDLE h, bool *dropEarly, uint32_t *buffered ); +/* function to look into the buffer and check if it makes sense to drop a data unit during DTX */ +static int16_t JB4_checkDtxDropping( const JB4_HANDLE h ); +/*! function to estimate the short term jitter */ +static void JB4_estimateShortTermJitter( JB4_HANDLE h, const uint32_t rcvTime, const uint32_t rtpTimeStamp ); +/*! function to pop a data unit from the buffer */ +static void JB4_popFromBuffer( JB4_HANDLE h, const uint32_t sysTime, JB4_DATAUNIT_HANDLE *pDataUnit ); +/*! function to drop a data unit from the buffer - updates nShrinked */ +static void JB4_dropFromBuffer( JB4_HANDLE h ); +/*! function to calculate the playout delay based on the current jitter */ +/*! @param[in] playTime the system time when the data unit will be played + * @param[in] timeStamp the time stamp of the data unit to played + * @param[out] delay the calculated playout delay */ +static int16_t JB4_playoutDelay( const JB4_HANDLE h, const uint32_t playTime, const uint32_t rtpTimeStamp, uint32_t *delay ); +/*! function to update lastPlayoutDelay and lastTargetTime after popFromBuffer() */ +static void JB4_updateLastTimingMembers( JB4_HANDLE h, const uint32_t playTime, const uint32_t rtpTimeStamp ); +/*! function to compare the RTP time stamps of two data units: newElement==arrayElement ? 0 : (newElement>arrayElement ? +1 : -1) */ +static int16_t JB4_inputBufferCompareFunction( const JB4_INPUTBUFFER_ELEMENT newElement, const JB4_INPUTBUFFER_ELEMENT arrayElement, bool *replaceWithNewElementIfEqual ); + + +/*! Jitter Buffer Management Interface */ +struct JB4 +{ + /*! @name statistics for user */ + /*@{ */ + /*! the number of late lost data units */ + uint32_t nLateLost; + /*! the number of data units that were available (not NULL) at playout time */ + uint32_t nAvailablePopped; + /*! the number of data units that were not available (NULL) at playout time */ + uint32_t nUnavailablePopped; + /*! the number of unavailable pops since the last available one - used as temp value for nLost and nStretched */ + uint32_t nLostOrStretched; + /*! the number of data units that were lost at playout time */ + uint32_t nLost; + /*! the number of empty data units inserted for playout adaptation */ + uint32_t nStretched; + /*! the number of data units dropped for playout adaptation */ + /*! This function counts all time shrinking events, no matter if a dropped data unit was actually available. */ + uint32_t nShrinked; + /*! the number of data units that were returned to create comfort noice (including NULL) */ + uint32_t nComfortNoice; + /*! the number of jitter induced concealment operations (as defined in 3GPP TS 26.114) */ + uint32_t jitterInducedConcealments; + /*! the target playout delay of the last returned data unit */ + uint32_t targetPlayoutDelay; + /*! the target playout time of the last returned data unit */ + uint32_t lastTargetTime; + /*@} */ + /*! @name internal configuration values - do not change!!! */ + /*@{ */ + /*! internal time scale for all calculations */ + int16_t timeScale; + /*! internal frame duration in timeScale units */ + uint32_t frameDuration; + /*@} */ + /*! @name jitter buffer configuration values */ + /*@{ */ + /*! the allowed delay reserve in addition to network jitter to reduce late-loss [milliseconds] */ + int16_t safetyMargin; + /*@} */ + /*! @name data for short term jitter estimation */ + /*@{ */ + /*! short term jitter measure FIFO */ + JB4_JMF_HANDLE stJmf; + /*! FIFO of short term jitter values */ + JB4_CIRCULARBUFFER_HANDLE stJitterFifo; + /*! FIFO of RTP time stamps for the values stored in stJitterFifo */ + JB4_CIRCULARBUFFER_HANDLE stTimeStampFifo; + /*! short term jitter */ + uint32_t stJitter; + /*@} */ + /*! @name jitter buffer data */ + /*@{ */ + /*! true, if a data unit was already popped from the buffer */ + bool firstDataUnitPopped; + /*! system time of the previous JB4_PopDataUnit() call */ + uint32_t prevPopSysTime; + /*! RTP timestamp of the last played/dropped data unit that was actually available */ + uint32_t lastReturnedTs; + /*! true, if the last popped data unit contained no active signal, i.e. silence -> hint for DTX */ + bool lastPoppedWasSilence; + /*! the playout time minus the minimum offset of the last played data unit in microseconds */ + int32_t lastPlayoutOffset; + /*! RTP time stamp of the next data unit that is expected to be fetched from the buffer */ + uint32_t nextExpectedTs; + Word16 rfOffset2Active; + Word16 rfOffset3Active; + Word16 rfOffset5Active; + Word16 rfOffset7Active; + Word32 rfDelay; + /*! long term jitter measure FIFO */ + JB4_JMF_HANDLE ltJmf; + + uint32_t FecOffWinLen; + uint32_t FecOffWin[10]; + uint32_t optimum_offset; + + float netLossRate; + Word32 nPartialCopiesUsed; + Word32 last_nLost; + Word32 last_ntot; + + uint32_t totWin; + bool pre_partial_frame; + /*@} */ + + /*! @name members to store the data units */ + /*@{ */ + /*! the data unit buffer */ + JB4_INPUTBUFFER_HANDLE inputBuffer; + struct JB4_DATAUNIT memorySlots[MAX_JBM_SLOTS]; + JB4_DATAUNIT_HANDLE freeMemorySlots[MAX_JBM_SLOTS]; + uint16_t nFreeMemorySlots; + /*@} */ +}; /* JB4 */ + + +ivas_error JB4_Create( + JB4_HANDLE *ph ) +{ + int16_t iter; + JB4_HANDLE h; + ivas_error error; + + if ( ( h = malloc( sizeof( struct JB4 ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for JB4 structure\n" ) ); + } + + /* statistics for user */ + h->nLateLost = 0; + h->nAvailablePopped = 0; + h->nUnavailablePopped = 0; + h->nLostOrStretched = 0; + h->nLost = 0; + h->nStretched = 0; + h->nShrinked = 0; + h->nComfortNoice = 0; + h->jitterInducedConcealments = 0; + h->targetPlayoutDelay = 0; + h->lastTargetTime = 0; + /* internal configuration values - do not change!!! */ + h->timeScale = 0; + h->frameDuration = 0; + + /* jitter buffer configuration values: done in JB4_Init() */ + /* short term jitter evaluation */ + if ( ( error = JB4_JMF_Create( &h->stJmf ) ) != IVAS_ERR_OK ) + { + return error; + } + if ( ( error = JB4_CIRCULARBUFFER_Create( &h->stJitterFifo ) ) != IVAS_ERR_OK ) + { + return error; + } + if ( ( error = JB4_CIRCULARBUFFER_Create( &h->stTimeStampFifo ) ) != IVAS_ERR_OK ) + { + return error; + } + h->stJitter = 0; + + /* jitter buffer data */ + h->firstDataUnitPopped = false; + h->prevPopSysTime = 0; + h->lastReturnedTs = 0; + h->lastPoppedWasSilence = false; + h->lastPlayoutOffset = 0; + h->nextExpectedTs = 0; + h->rfOffset2Active = 0; + h->rfOffset3Active = 0; + h->rfOffset5Active = 0; + h->rfOffset7Active = 0; + h->rfDelay = 0; + JB4_JMF_Create( &h->ltJmf ); + h->pre_partial_frame = 0; + + h->FecOffWinLen = 0; + for ( iter = 0; iter < 10; iter++ ) + { + h->FecOffWin[iter] = 0; + } + h->optimum_offset = 3; + h->totWin = 0; + h->netLossRate = 0.0f; + move32(); + h->nPartialCopiesUsed = 0; + move32(); + h->last_nLost = 0; + move32(); + h->last_ntot = 0; + move32(); + + /* members to store the data units */ + if ( ( error = JB4_INPUTBUFFER_Create( &h->inputBuffer ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* allocate memory for data units */ + for ( iter = 0; iter < MAX_JBM_SLOTS; ++iter ) + { + if ( ( h->memorySlots[iter].data = malloc( MAX_AU_SIZE ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for JB4 structure\n" ) ); + } + h->freeMemorySlots[iter] = &h->memorySlots[iter]; + } + h->nFreeMemorySlots = MAX_JBM_SLOTS; + *ph = h; + + return IVAS_ERR_OK; +} + + +void JB4_Destroy( + JB4_HANDLE *ph ) +{ + JB4_HANDLE h; + uint16_t i; + + if ( !ph ) + { + return; + } + h = *ph; + if ( !h ) + { + return; + } + + JB4_JMF_Destroy( &h->stJmf ); + JB4_CIRCULARBUFFER_Destroy( &h->stJitterFifo ); + JB4_CIRCULARBUFFER_Destroy( &h->stTimeStampFifo ); + JB4_JMF_Destroy( &h->ltJmf ); + JB4_INPUTBUFFER_Destroy( &h->inputBuffer ); + + for ( i = 0; i < MAX_JBM_SLOTS; ++i ) + { + free( h->memorySlots[i].data ); + } + + free( h ); + *ph = NULL; + + return; +} + + +ivas_error JB4_Init( + JB4_HANDLE h, + const int16_t safetyMargin ) +{ + uint16_t ltJmfSize, stFifoSize, stJmfSize, stJmfAllowedLateLoss; + uint16_t inputBufferCapacity; + ivas_error error; + + /* internal timescale is 1000, frame duration is 20ms */ + h->timeScale = 1000; /* ms */ + h->frameDuration = 20; /* ms */ + + /* jitter buffer configuration values */ + h->safetyMargin = safetyMargin; + + /* long term jitter measure FIFO: 500 frames and 10s */ + ltJmfSize = 10000; + JB4_JMF_Init( h->ltJmf, h->timeScale, ltJmfSize / 20, ltJmfSize, 1000 ); + /* short term jitter evaluation */ + stFifoSize = 200; + stJmfSize = 50; + stJmfAllowedLateLoss = 60; /* 6%, e.g. ignore three packets out of 50 */ + JB4_CIRCULARBUFFER_Init( h->stJitterFifo, stFifoSize ); + JB4_CIRCULARBUFFER_Init( h->stTimeStampFifo, stFifoSize ); + JB4_JMF_Init( h->stJmf, h->timeScale, stJmfSize, h->timeScale /* 1s */, (uint16_t) ( 1000 - stJmfAllowedLateLoss ) ); + + inputBufferCapacity = MAX_JBM_SLOTS - 2; + + if ( ( error = JB4_INPUTBUFFER_Init( h->inputBuffer, inputBufferCapacity, JB4_inputBufferCompareFunction ) ) != IVAS_ERR_OK ) + { + return error; + } + + return IVAS_ERR_OK; +} + + +/* Returns a memory slot to store a new data unit */ +JB4_DATAUNIT_HANDLE JB4_AllocDataUnit( + JB4_HANDLE h ) +{ + JB4_DATAUNIT_HANDLE dataUnit; + while ( h->nFreeMemorySlots == 0 ) + { + assert( JB4_INPUTBUFFER_IsEmpty( h->inputBuffer ) == 0 ); + JB4_dropFromBuffer( h ); + } + + --h->nFreeMemorySlots; + dataUnit = h->freeMemorySlots[h->nFreeMemorySlots]; + h->freeMemorySlots[h->nFreeMemorySlots] = NULL; + assert( dataUnit != NULL ); + + return dataUnit; +} + + +/* Notifies the JBM that a data unit is no longer used and the memory can be reused */ +void JB4_FreeDataUnit( + JB4_HANDLE h, + JB4_DATAUNIT_HANDLE dataUnit ) +{ + assert( dataUnit != NULL ); + assert( h->nFreeMemorySlots < MAX_JBM_SLOTS ); + h->freeMemorySlots[h->nFreeMemorySlots] = dataUnit; + h->nFreeMemorySlots++; + + return; +} + + +int16_t JB4_PushDataUnit( + JB4_HANDLE h, + JB4_DATAUNIT_HANDLE dataUnit, + const uint32_t rcvTime ) +{ + JB4_DATAUNIT_HANDLE droppedDataUnit = NULL; + + assert( dataUnit->duration == h->frameDuration ); + assert( dataUnit->timeScale == (uint16_t) h->timeScale ); + + /* ignore frames from too far in future (3 seconds) */ + if ( h->firstDataUnitPopped && JB4_rtpTimeStampDiff( h->lastReturnedTs, dataUnit->timeStamp ) >= + (int32_t) ( 50 * 3 * dataUnit->duration ) ) + { + JB4_FreeDataUnit( h, dataUnit ); + return 0; + } + + /* reserve space for one element to add: drop oldest if buffer is full */ + while ( JB4_INPUTBUFFER_IsFull( h->inputBuffer ) ) + { + JB4_dropFromBuffer( h ); + } + assert( JB4_INPUTBUFFER_IsFull( h->inputBuffer ) == 0 ); + + /* do statistics on partial copy offset using active primary copies to + * avoid unexpected resets because RF_NO_DATA partial copies are dropped before JBM */ + if ( dataUnit->silenceIndicator == 0 && dataUnit->partial_frame == 0 ) + { + if ( dataUnit->partialCopyOffset == 0 ) + { + if ( h->rfOffset2Active > 0 ) + --h->rfOffset2Active; + if ( h->rfOffset3Active > 0 ) + --h->rfOffset3Active; + if ( h->rfOffset5Active > 0 ) + --h->rfOffset5Active; + if ( h->rfOffset7Active > 0 ) + --h->rfOffset7Active; + } + else if ( dataUnit->partialCopyOffset == 2 ) + { + h->rfOffset2Active = 100; + h->rfOffset3Active = 0; + h->rfOffset5Active = 0; + h->rfOffset7Active = 0; + } + else if ( dataUnit->partialCopyOffset == 3 ) + { + h->rfOffset2Active = 0; + h->rfOffset3Active = 100; + h->rfOffset5Active = 0; + h->rfOffset7Active = 0; + } + else if ( dataUnit->partialCopyOffset == 5 ) + { + h->rfOffset2Active = 0; + h->rfOffset3Active = 0; + h->rfOffset5Active = 100; + h->rfOffset7Active = 0; + } + else if ( dataUnit->partialCopyOffset == 7 ) + { + h->rfOffset2Active = 0; + h->rfOffset3Active = 0; + h->rfOffset5Active = 0; + h->rfOffset7Active = 100; + } + } + + if ( dataUnit->partial_frame != 0 ) + { + /* check for "real" late loss: a frame with higher/same timestamp was already returned to be fed into decoder */ + if ( h->firstDataUnitPopped && JB4_rtpTimeStampDiff( h->lastReturnedTs, dataUnit->timeStamp ) <= 0 ) + { + JB4_FreeDataUnit( h, dataUnit ); + return 0; + } + + /* drop partial copy if the missing frame was already concealed */ + if ( h->firstDataUnitPopped ) + { + if ( dataUnit->partialCopyOffset <= 3 && JB4_rtpTimeStampDiff( h->nextExpectedTs, dataUnit->timeStamp ) < 0 ) + { + JB4_FreeDataUnit( h, dataUnit ); + return 0; + } + else if ( dataUnit->partialCopyOffset == 5 && JB4_rtpTimeStampDiff( h->nextExpectedTs, dataUnit->timeStamp ) < -40 ) + { + JB4_FreeDataUnit( h, dataUnit ); + return 0; + } + else if ( dataUnit->partialCopyOffset == 7 && JB4_rtpTimeStampDiff( h->nextExpectedTs, dataUnit->timeStamp ) < -80 ) + { + JB4_FreeDataUnit( h, dataUnit ); + return 0; + } + } + + /* try to store partial copy - will be dropped if primary copy already available */ + if ( JB4_INPUTBUFFER_Enque( h->inputBuffer, dataUnit, (void **) &droppedDataUnit ) == 0 ) + { + /* partial copy is useful, consider it in long-term jitter estimation */ + if ( dataUnit->partialCopyOffset <= 3 ) + { + JB4_JMF_PushPacket( h->ltJmf, rcvTime, dataUnit->timeStamp ); + } + } + else + { + JB4_FreeDataUnit( h, dataUnit ); + } + if ( droppedDataUnit != NULL ) + { + JB4_FreeDataUnit( h, droppedDataUnit ); + } + } + else + { + /* calculate jitter */ + JB4_JMF_PushPacket( h->ltJmf, rcvTime, dataUnit->timeStamp ); + JB4_estimateShortTermJitter( h, rcvTime, dataUnit->timeStamp ); + /* check for "real" late loss: a frame with higher/same timestamp was already returned to be fed into decoder */ + if ( h->firstDataUnitPopped && JB4_rtpTimeStampDiff( h->lastReturnedTs, dataUnit->timeStamp ) <= 0 ) + { + if ( !dataUnit->silenceIndicator ) + { + ++h->nLateLost; + /* deletion of a speech frame because it arrived at the JBM too late */ + ++h->jitterInducedConcealments; + } + JB4_FreeDataUnit( h, dataUnit ); + return 0; + } + /* store data unit */ + if ( JB4_INPUTBUFFER_Enque( h->inputBuffer, dataUnit, (void **) &droppedDataUnit ) != 0 ) + { + JB4_FreeDataUnit( h, dataUnit ); + } + if ( droppedDataUnit != NULL ) + { + JB4_FreeDataUnit( h, droppedDataUnit ); + } + } + return 0; +} + + +int16_t JB4_getFECoffset( + JB4_HANDLE h ) +{ + return (int16_t) h->optimum_offset; +} + + +int16_t JB4_FECoffset( + JB4_HANDLE h ) +{ + if ( h->netLossRate < 0.05 ) + { + return 0; + } + else + { + return 1; + } +} + + +int16_t JB4_PopDataUnit( + JB4_HANDLE h, + const uint32_t sysTime, + const uint32_t extBufferedTime, + JB4_DATAUNIT_HANDLE *pDataUnit, + uint32_t *scale, + uint32_t *maxScaling ) +{ + int16_t ret; + + assert( sysTime >= h->prevPopSysTime ); + if ( sysTime > h->prevPopSysTime + 20 ) + { + h->lastPlayoutOffset += 20; + } + h->prevPopSysTime = sysTime; + + ret = JB4_adaptPlayout( h, sysTime, extBufferedTime, pDataUnit, scale, maxScaling ); + + return ret; +} + + +/* Calculates the difference between two RTP timestamps - the diff is positive, if B 'later', negative otherwise */ +static int32_t JB4_rtpTimeStampDiff( + const uint32_t tsA, + const uint32_t tsB ) +{ + int32_t ret; + /* do not dare to inline this function, casting to int32_t is important here! */ + ret = (int32_t) ( tsB - tsA ); + return ret; +} + + +/* function to get the number of data units contained in the buffer */ +uint16_t JB4_bufferedDataUnits( + const JB4_HANDLE h ) + +{ + return JB4_INPUTBUFFER_Size( h->inputBuffer ); +} + + +/***************************************************************************** + **************************** private functions ****************************** + *****************************************************************************/ + + +/* function to calculate different options for the target playout delay */ +static void JB4_targetPlayoutDelay( + const JB4_HANDLE h, + uint32_t *targetMin, + uint32_t *targetMax, + uint32_t *targetDtx, + uint32_t *targetStartUp ) +{ + uint32_t ltJitter, extraDelayReserve; + + /* adapt target delay to partial copy offset */ + extraDelayReserve = 0; + h->rfDelay = 0; + if ( h->rfOffset7Active != 0 ) + { + h->rfDelay = 140; + } + else if ( h->rfOffset5Active != 0 ) + { + h->rfDelay = 100; + } + else if ( h->rfOffset2Active == 0 && h->rfOffset3Active == 0 ) + { + /* keep some delay reserve for RF-off */ + extraDelayReserve = 15; + } + + /* get estimated long term jitter */ + if ( JB4_JMF_Jitter( h->ltJmf, <Jitter ) == 0 ) + { + /* combine long term and short term jitter to calculate target delay values */ + *targetMax = h->stJitter + h->safetyMargin + h->rfDelay; + *targetMin = JB4_MIN( ltJitter + 20 + h->rfDelay + extraDelayReserve, *targetMax ); + *targetDtx = JB4_MIN( ltJitter + extraDelayReserve, h->stJitter ); + *targetStartUp = ( *targetMin + *targetMax + extraDelayReserve / 4 ) / 2; + } + else + { + /* combine long term and short term jitter to calculate target delay values */ + *targetMax = h->safetyMargin; + *targetMin = JB4_MIN( 20, *targetMax ); + *targetDtx = 0; + *targetStartUp = ( *targetMin + *targetMax ) / 2; + } + + if ( *targetStartUp < 60 ) + { + *targetStartUp = 60; + } + + return; +} + + +/* function to do playout adaptation before playing the next data unit */ +static int16_t JB4_adaptPlayout( + JB4_HANDLE h, + uint32_t sysTime, + uint32_t extBufferedTime, + JB4_DATAUNIT_HANDLE *pDataUnit, + uint32_t *scale, + uint32_t *maxScaling ) +{ + bool stretchTime; + + /* reset scale */ + if ( scale == NULL || maxScaling == NULL ) + { + return -1; + } + *scale = 100; + *maxScaling = 0; + stretchTime = false; + + /* switch type of current playout (first one, active, DTX) */ + if ( !h->firstDataUnitPopped ) + { + JB4_adaptFirstPlayout( h, sysTime, &stretchTime ); + } + else if ( h->lastPoppedWasSilence ) + { + JB4_adaptDtxPlayout( h, sysTime, &stretchTime ); + } + else + { + JB4_adaptActivePlayout( h, extBufferedTime, scale, maxScaling ); + } + + /* time shrinking done if needed, now do time stretching or pop data unit to play */ + if ( stretchTime ) + { + /* return empty data unit */ + *pDataUnit = NULL; + if ( h->firstDataUnitPopped ) + { + ++h->nUnavailablePopped; + if ( !h->lastPoppedWasSilence ) + { + ++h->nStretched; + /* jitter-induced insertion (e.g. buffer underflow) */ + ++h->jitterInducedConcealments; + } + } + /* add one frame to last playout delay */ + h->lastPlayoutOffset += h->frameDuration; + } + else + { + /* return next data unit from buffer */ + JB4_popFromBuffer( h, sysTime, pDataUnit ); + } + + return 0; +} + + +/* function for playout adaptation while active (no DTX) */ +static void JB4_adaptActivePlayout( + JB4_HANDLE h, + uint32_t extBufferedTime, + uint32_t *scale, + uint32_t *maxScaling ) +{ + JB4_DATAUNIT_HANDLE nextDataUnit; + bool convertToLateLoss, dropEarly; + uint32_t targetMin, targetMax, targetDtx, targetStartUp, targetMaxStretch; + uint32_t currPlayoutDelay, gap, buffered; + uint32_t dropGapMax, dropRateMin, dropRateMax, rate; + int32_t minOffTicks, tsDiffToNextDataUnit; + + JB4_targetPlayoutDelay( h, &targetMin, &targetMax, &targetDtx, &targetStartUp ); + if ( JB4_JMF_MinOffset( h->ltJmf, &minOffTicks ) != 0 ) + { + return; + } + h->targetPlayoutDelay = ( targetMin + targetMax ) / 2; + + convertToLateLoss = false; + dropEarly = false; + dropGapMax = 200; + dropRateMin = 5; + dropRateMax = 200; /* 20% */ + + /* calculate current playout delay */ + currPlayoutDelay = h->lastPlayoutOffset - minOffTicks + extBufferedTime; + if ( !JB4_INPUTBUFFER_IsEmpty( h->inputBuffer ) ) + { + nextDataUnit = (JB4_DATAUNIT_HANDLE) JB4_INPUTBUFFER_Front( h->inputBuffer ); + tsDiffToNextDataUnit = JB4_rtpTimeStampDiff( h->nextExpectedTs, nextDataUnit->timeStamp ); + if ( tsDiffToNextDataUnit < 0 ) + { + convertToLateLoss = true; + /* time stretching is expected -> increase playout delay to allow dropping the late frame */ + currPlayoutDelay -= tsDiffToNextDataUnit; + currPlayoutDelay += 1; + } + } + + /* decided between shrinking/stretching */ + if ( currPlayoutDelay > targetMax ) /* time shrinking */ + { + gap = currPlayoutDelay - h->targetPlayoutDelay; + /* check if gap is positive and dropping is allowed + * and buffer contains enough time (ignoring one frame) */ + if ( gap > 0 && + JB4_inspectBufferForDropping( h, &dropEarly, &buffered ) == 0 && + ( convertToLateLoss || + ( buffered + h->frameDuration + extBufferedTime ) > targetMax ) ) + { + if ( convertToLateLoss ) + { + JB4_dropFromBuffer( h ); + } + else if ( dropEarly ) + { + JB4_dropFromBuffer( h ); + ++h->nLostOrStretched; + } + else + { + /* limit gap to [gapMin,gapMax] and calculate current drop rate from gap */ + rate = JB4_MIN( (uint32_t) ( gap ), dropGapMax ) * + ( dropRateMax - dropRateMin ) / dropGapMax + + dropRateMin; + *scale = ( 1000 - rate ) / 10; + *maxScaling = currPlayoutDelay - targetMax; + } + } + } + else /* time stretching */ + { + uint32_t delayWithClearedExternalBuffer; + /* Stretching only makes sense if we win one additional frame in the input buffer. + * If too much additional delay would be required to do so, then do not scale. + * Also make sure that the delay doesn't increase too much. */ + delayWithClearedExternalBuffer = currPlayoutDelay - extBufferedTime + h->frameDuration; + targetMaxStretch = targetMax - h->frameDuration; + if ( delayWithClearedExternalBuffer + h->frameDuration <= targetMaxStretch && + currPlayoutDelay < targetMaxStretch && currPlayoutDelay < (uint32_t) ( 110 + h->rfDelay / 4 ) ) + { + *scale = 120; + *maxScaling = targetMaxStretch - currPlayoutDelay; + } + } + + return; +} + + +/* function for playout adaptation while DTX */ +static void JB4_adaptDtxPlayout( + JB4_HANDLE h, + uint32_t sysTime, + bool *stretchTime ) +{ + JB4_DATAUNIT_HANDLE firstDu; + uint32_t firstTs; + uint32_t targetMin, targetMax, targetDtx, targetStartUp; + uint32_t currPlayoutDelay, headRoom; + int32_t minOffTicks, tsDiffToNextDataUnit; + + JB4_targetPlayoutDelay( h, &targetMin, &targetMax, &targetDtx, &targetStartUp ); + if ( JB4_JMF_MinOffset( h->ltJmf, &minOffTicks ) != 0 ) + { + return; + } + + /* calculate current playout delay */ + currPlayoutDelay = h->lastPlayoutOffset - minOffTicks; + + /* check for startup after DTX */ + if ( !JB4_INPUTBUFFER_IsEmpty( h->inputBuffer ) ) + { + firstDu = (JB4_DATAUNIT_HANDLE) JB4_INPUTBUFFER_Front( h->inputBuffer ); + firstTs = firstDu->timeStamp; + + tsDiffToNextDataUnit = JB4_rtpTimeStampDiff( h->nextExpectedTs, firstTs ); + /* check if the next available data unit should already be used (time stamp order) */ + if ( tsDiffToNextDataUnit > 0 ) + { + /* time stretching is expected -> increase playout delay */ + currPlayoutDelay += tsDiffToNextDataUnit; + } + if ( !firstDu->silenceIndicator ) + { + /* recalculate playout delay based on first buffered data unit */ + JB4_playoutDelay( h, sysTime, firstTs, &currPlayoutDelay ); + /* check if the next available data unit should already be used (time stamp order) */ + if ( tsDiffToNextDataUnit > 0 ) + { + /* time stretching is expected -> increase playout delay */ + currPlayoutDelay += tsDiffToNextDataUnit; + } + h->targetPlayoutDelay = targetStartUp; + headRoom = 600 * h->frameDuration / 1000; + /* decided between shrinking/stretching */ + if ( currPlayoutDelay > targetStartUp + headRoom ) /* time shrinking */ + { + if ( JB4_checkDtxDropping( h ) ) + { + JB4_dropFromBuffer( h ); + } + } + else if ( currPlayoutDelay + headRoom < targetStartUp ) /* time stretching */ + { + *stretchTime = true; + } + return; + } + } + + /* adapt while DTX */ + h->targetPlayoutDelay = targetDtx; + + /* decided between shrinking/stretching */ + if ( currPlayoutDelay >= targetDtx + h->frameDuration ) /* time shrinking */ + { + if ( JB4_checkDtxDropping( h ) ) + { + JB4_dropFromBuffer( h ); + } + } + else if ( currPlayoutDelay + 500 * h->frameDuration / 1000 < targetDtx ) /* time stretching */ + { + *stretchTime = true; + } + + return; +} + + +/* function to do playout adaptation before playing the first data unit */ +static void JB4_adaptFirstPlayout( + JB4_HANDLE h, + uint32_t sysTime, + bool *prebuffer ) +{ + uint32_t currPlayoutDelay; + JB4_DATAUNIT_HANDLE firstDu; + uint32_t targetMin, targetMax, targetDtx, targetStartUp; + if ( JB4_INPUTBUFFER_IsEmpty( h->inputBuffer ) ) + { + *prebuffer = true; + return; + } + JB4_targetPlayoutDelay( h, &targetMin, &targetMax, &targetDtx, &targetStartUp ); + if ( targetStartUp < h->frameDuration ) + { + return; + } + /* calculate delay if first data unit would be played now */ + firstDu = (JB4_DATAUNIT_HANDLE) JB4_INPUTBUFFER_Front( h->inputBuffer ); + if ( JB4_playoutDelay( h, sysTime, firstDu->timeStamp, &currPlayoutDelay ) != 0 ) + { + *prebuffer = true; + return; + } + if ( currPlayoutDelay + h->frameDuration / 2 < targetStartUp ) /* time stretching */ + { + *prebuffer = true; + } + else /* no adaptation, start playout */ + { + *prebuffer = false; + } + + return; +} + + +/* function to look into the buffer and check if it makes sense to drop a data unit */ +static int16_t JB4_inspectBufferForDropping( + const JB4_HANDLE h, + bool *dropEarly, + uint32_t *buffered ) +{ + uint16_t inputBufferSize; + int32_t seqNrDiff; + int32_t bufferedTs; + uint32_t firstTs; + uint64_t beginTs, endTs; + JB4_DATAUNIT_HANDLE firstDu, secondDu, lastDu; + + assert( !h->lastPoppedWasSilence ); + *dropEarly = false; + *buffered = 0; + inputBufferSize = JB4_INPUTBUFFER_Size( h->inputBuffer ); + if ( inputBufferSize == 0U ) + { + return -1; + } + + firstDu = (JB4_DATAUNIT_HANDLE) JB4_INPUTBUFFER_Front( h->inputBuffer ); + firstTs = firstDu->timeStamp; + /* check for loss: sequence number diff is exactly 0 in the valid case */ + if ( h->firstDataUnitPopped ) + { + seqNrDiff = JB4_rtpTimeStampDiff( h->nextExpectedTs, firstTs ) / + (int32_t) ( h->frameDuration ); + } + else + { + seqNrDiff = 0; + } + if ( seqNrDiff <= 0 ) + { + /* preview data unit to play after dropping */ + if ( inputBufferSize <= 1U ) + { + /* data unit to play missing, avoid drop followed by concealment */ + return -1; + } + secondDu = JB4_INPUTBUFFER_Element( h->inputBuffer, 1 ); + if ( firstTs + h->frameDuration != secondDu->timeStamp ) + { + /* data unit to play is not available, avoid drop followed by concealment */ + return -1; + } + /* calculate buffered time span */ + bufferedTs = 0; + } + else if ( seqNrDiff == 2 ) + { + /* data unit to play is not available, avoid dropping followed by concealment */ + return -1; + } + else /* seqNoDiff == 1 || seqNoDiff > 2 */ + { + /* first data unit is not available -> drop it early to avoid concealment + * This is very aggressive: ignores the maximum drop rate (50% drop and 50% concealment for adjacent lost), + * but on the other hand, dropping sounds better than concealment. */ + *dropEarly = true; + /* data unit to drop (first one) is lost */ + bufferedTs = 0; + } + + /* add time stamp difference of last and first actually buffered data unit */ + if ( inputBufferSize == 1U ) + { + bufferedTs += h->frameDuration; + } + else + { + lastDu = (JB4_DATAUNIT_HANDLE) JB4_INPUTBUFFER_Back( h->inputBuffer ); + beginTs = firstTs; + endTs = lastDu->timeStamp + h->frameDuration; + /* check for RTP time stamp wrap around */ + if ( endTs < beginTs ) + { + endTs = endTs + 0xFFFFFFFF; + } + bufferedTs += (int32_t) ( endTs - beginTs ); + } + + /* the result should not be negative */ + if ( bufferedTs < 0 ) + { + return -1; + } + *buffered = bufferedTs; + + return 0; +} + + +/* function to look into the buffer and check if it makes sense to drop a data unit */ +static int16_t JB4_checkDtxDropping( + const JB4_HANDLE h ) +{ + uint16_t inputBufferSize; + int32_t seqNrDiff; + JB4_DATAUNIT_HANDLE firstDu; + int16_t droppingAllowed; + + assert( h->firstDataUnitPopped ); + assert( h->lastPoppedWasSilence ); + + droppingAllowed = 1; + inputBufferSize = JB4_INPUTBUFFER_Size( h->inputBuffer ); + if ( inputBufferSize > 0U ) + { + firstDu = (JB4_DATAUNIT_HANDLE) JB4_INPUTBUFFER_Front( h->inputBuffer ); + /* check for loss: sequence number diff is exactly 0 in the valid case */ + seqNrDiff = JB4_rtpTimeStampDiff( h->nextExpectedTs, firstDu->timeStamp ) / + (int32_t) ( h->frameDuration ); + if ( seqNrDiff <= 0 ) + { + /* no not drop first active frame */ + droppingAllowed = 0; + } + } + /* else: buffer empty, allow dropping FRAME_NO_DATA */ + + return droppingAllowed; +} + + +/* function to estimate the short term jitter */ +static void JB4_estimateShortTermJitter( + JB4_HANDLE h, + const uint32_t rcvTime, + const uint32_t rtpTimeStamp ) +{ + uint32_t jitter, duration, maxDuration; + int32_t minTime, maxTime; + JB4_CIRCULARBUFFER_ELEMENT maxElement, dequedElement; + + jitter = 0; + JB4_JMF_PushPacket( h->stJmf, rcvTime, rtpTimeStamp ); + /* save delta delay */ + if ( JB4_JMF_Jitter( h->stJmf, &jitter ) == 0 ) + { + /* compensate difference between both offsets */ + int32_t stOffset, ltOffset; + JB4_JMF_MinOffset( h->stJmf, &stOffset ); + JB4_JMF_MinOffset( h->ltJmf, <Offset ); + jitter += stOffset - ltOffset; + assert( (int16_t) jitter >= 0 ); + if ( JB4_CIRCULARBUFFER_IsFull( h->stJitterFifo ) ) + { + JB4_CIRCULARBUFFER_Deque( h->stJitterFifo, &dequedElement ); + JB4_CIRCULARBUFFER_Deque( h->stTimeStampFifo, &dequedElement ); + } + JB4_CIRCULARBUFFER_Enque( h->stJitterFifo, jitter ); + JB4_CIRCULARBUFFER_Enque( h->stTimeStampFifo, rtpTimeStamp ); + + /* check for duration and discard first entries if too long */ + minTime = JB4_CIRCULARBUFFER_Front( h->stTimeStampFifo ); + maxTime = JB4_CIRCULARBUFFER_Back( h->stTimeStampFifo ); + if ( maxTime > minTime ) + { + duration = maxTime - minTime; + maxDuration = 4 * h->timeScale; + while ( duration > maxDuration ) + { + JB4_CIRCULARBUFFER_Deque( h->stJitterFifo, &dequedElement ); + JB4_CIRCULARBUFFER_Deque( h->stTimeStampFifo, &dequedElement ); + minTime = JB4_CIRCULARBUFFER_Front( h->stTimeStampFifo ); + if ( maxTime <= minTime ) + { + break; + } + duration = maxTime - minTime; + } + } + } + + /* update h->stJitter */ + if ( !JB4_CIRCULARBUFFER_IsEmpty( h->stJitterFifo ) ) + { + JB4_CIRCULARBUFFER_Max( h->stJitterFifo, &maxElement ); + /* round up to full frame duration */ + h->stJitter = (uint32_t) ceil( (double) ( maxElement ) / h->frameDuration ) * + h->frameDuration; + } + + return; +} + + +/* function to pop a data unit from the buffer */ +static void JB4_popFromBuffer( + JB4_HANDLE h, + const uint32_t sysTime, + JB4_DATAUNIT_HANDLE *pDataUnit ) +{ + JB4_DATAUNIT_HANDLE nextDataUnit; + uint32_t nStretched; + int32_t tsDiff; + JB4_DATAUNIT_HANDLE tempDataUnit; + uint16_t readlen; + uint16_t i; + int16_t frameoffset; + uint32_t maxval; + Word32 lost, total_rec; + JB4_DATAUNIT_HANDLE partialCopyDu; + uint16_t searchpos, endpos; + + /* check if a data unit is available */ + if ( JB4_INPUTBUFFER_IsEmpty( h->inputBuffer ) ) + { + /* no data unit available */ + *pDataUnit = NULL; + h->nextExpectedTs += h->frameDuration; + if ( h->lastPoppedWasSilence ) + { + ++h->nComfortNoice; + } + else + { + ++h->nUnavailablePopped; + ++h->nLostOrStretched; + } + + return; + } + + /* preview next data unit in sequence order */ + nextDataUnit = (JB4_DATAUNIT_HANDLE) JB4_INPUTBUFFER_Front( h->inputBuffer ); + + /* check if this is the first data unit */ + if ( !h->firstDataUnitPopped ) + { + h->firstDataUnitPopped = true; + /* adjust sequence numbers to avoid handling first packet as loss */ + h->nextExpectedTs = nextDataUnit->timeStamp; + } + + /* check if the next available data unit should already be used (time stamp order) */ + tsDiff = JB4_rtpTimeStampDiff( nextDataUnit->timeStamp, h->nextExpectedTs ); + + h->totWin += 1; + if ( ( h->totWin > 3000 ) || ( h->FecOffWinLen > 100 ) ) + { + maxval = h->FecOffWin[1]; + h->optimum_offset = 1; + for ( i = 2; i < MAXOFFSET; i++ ) + { + if ( h->FecOffWin[i] > maxval ) + { + maxval = h->FecOffWin[i]; + h->optimum_offset = i; + } + h->FecOffWin[i] = 0; + } + h->FecOffWin[0] = 0; + h->FecOffWin[1] = 0; + h->totWin = 0; + h->FecOffWinLen = 0; + + + lost = h->nLost + h->nPartialCopiesUsed - h->last_nLost; + total_rec = h->nAvailablePopped + h->nUnavailablePopped - h->last_ntot; + + if ( lost != 0 && total_rec != 0 ) + { + h->netLossRate = (float) lost / (float) total_rec; + } + else + { + h->netLossRate = 0.0f; + } + h->last_nLost = L_add( h->nLost, h->nPartialCopiesUsed ); + h->last_ntot = L_add( h->nAvailablePopped, h->nUnavailablePopped ); + } + + if ( tsDiff < 0 ) + { + readlen = JB4_INPUTBUFFER_Size( h->inputBuffer ); + for ( i = 0; i < readlen; i++ ) + { + tempDataUnit = (JB4_DATAUNIT_HANDLE) JB4_INPUTBUFFER_Element( h->inputBuffer, i ); + if ( !tempDataUnit->partial_frame && !h->lastPoppedWasSilence ) + { + frameoffset = (int16_t) ( JB4_rtpTimeStampDiff( h->nextExpectedTs, tempDataUnit->timeStamp ) / 20 ); + + if ( frameoffset > 0 && frameoffset < MAXOFFSET ) + { + h->FecOffWin[frameoffset] += 1; + } + } + } + h->FecOffWinLen += 1; + + /* next expected data unit is missing + * -> conceal network loss, do time stretching or create comfort noise */ + *pDataUnit = NULL; + + /* update statistics */ + h->nextExpectedTs += h->frameDuration; + if ( h->lastPoppedWasSilence ) + { + ++h->nComfortNoice; + } + else + { + ++h->nUnavailablePopped; + ++h->nLostOrStretched; + } + return; + } + + /* fetch the next data unit from buffer */ + *pDataUnit = nextDataUnit; + nextDataUnit->nextCoderType = INACTIVE; + if ( h->pre_partial_frame || nextDataUnit->partial_frame ) + { + if ( nextDataUnit->partial_frame ) + { + h->pre_partial_frame = 1; + } + else if ( h->pre_partial_frame ) + { + h->pre_partial_frame = 0; + } + + endpos = JB4_INPUTBUFFER_Size( h->inputBuffer ); + for ( searchpos = 0; searchpos < endpos; searchpos++ ) + { + partialCopyDu = (JB4_DATAUNIT_HANDLE) JB4_INPUTBUFFER_Element( h->inputBuffer, searchpos ); + if ( partialCopyDu->timeStamp == nextDataUnit->timeStamp + partialCopyDu->duration ) + { + get_NextCoderType( partialCopyDu->data, &nextDataUnit->nextCoderType ); + break; + } + } + } + JB4_INPUTBUFFER_Deque( h->inputBuffer, (void **) pDataUnit ); + + if ( nextDataUnit->partial_frame ) + { + h->nPartialCopiesUsed += 1; + + readlen = JB4_INPUTBUFFER_Size( h->inputBuffer ); + for ( i = 0; i < readlen; i++ ) + { + tempDataUnit = (JB4_DATAUNIT_HANDLE) JB4_INPUTBUFFER_Element( h->inputBuffer, i ); + if ( !tempDataUnit->partial_frame && !h->lastPoppedWasSilence ) + { + frameoffset = (int16_t) ( JB4_rtpTimeStampDiff( h->nextExpectedTs, tempDataUnit->timeStamp ) / 20 ); + + if ( frameoffset > 0 && frameoffset < MAXOFFSET ) + { + h->FecOffWin[frameoffset] += 1; + } + } + } + h->FecOffWinLen += 1; + } + + /* update statistics */ + if ( h->nLostOrStretched != 0U ) + { + assert( h->lastPoppedWasSilence == false ); + /* separate concealments since last available pop in lost and stretched */ + nStretched = tsDiff / h->frameDuration; + assert( h->nLostOrStretched >= nStretched ); + h->nLost += h->nLostOrStretched - nStretched; + /* jitter-induced insertion (e.g. buffer underflow) */ + h->jitterInducedConcealments += nStretched; + h->nStretched += nStretched; + h->nLostOrStretched = 0; + } + h->lastReturnedTs = nextDataUnit->timeStamp; + JB4_updateLastTimingMembers( h, sysTime, nextDataUnit->timeStamp ); + h->nextExpectedTs = nextDataUnit->timeStamp + h->frameDuration; + if ( nextDataUnit->silenceIndicator ) + { + h->lastPoppedWasSilence = true; + ++h->nComfortNoice; + } + else + { + h->lastPoppedWasSilence = false; + ++h->nAvailablePopped; + } + + return; +} + +/* function to drop a data unit from the buffer - updates nShrinked */ +static void JB4_dropFromBuffer( + JB4_HANDLE h ) +{ + JB4_DATAUNIT_HANDLE nextDataUnit, dataUnit; + int32_t tsDiff; + uint32_t nStretched; + + /* check if a data unit is available */ + if ( JB4_INPUTBUFFER_IsEmpty( h->inputBuffer ) ) + { + return; + } + /* preview next data unit in sequence order */ + nextDataUnit = (JB4_DATAUNIT_HANDLE) JB4_INPUTBUFFER_Front( h->inputBuffer ); + + /* check if this is the first data unit */ + if ( !h->firstDataUnitPopped ) + { + h->firstDataUnitPopped = true; + /* adjust sequence numbers to avoid handling first packet as loss */ + h->nextExpectedTs = nextDataUnit->timeStamp; + } + + /* check if the next available data unit should already be used (time stamp order) */ + tsDiff = JB4_rtpTimeStampDiff( nextDataUnit->timeStamp, h->nextExpectedTs ); + if ( tsDiff < 0 ) + { + /* next expected data unit is missing, remember this data unit as popped, + * but do not count it as lost, because it will not be concealed */ + h->nextExpectedTs += h->frameDuration; + /* substract one frame from last playout delay */ + h->lastPlayoutOffset -= h->frameDuration; + if ( !h->lastPoppedWasSilence ) + { + ++h->nShrinked; + /* modification of the output timeline due to link loss */ + ++h->nUnavailablePopped; + ++h->nLostOrStretched; + } + if ( h->lastTargetTime != 0U ) + { + h->lastTargetTime += h->frameDuration; + } + return; + } + + /* fetch the next data unit from buffer */ + JB4_INPUTBUFFER_Deque( h->inputBuffer, (void *) &dataUnit ); + /* update statistics */ + if ( h->nLostOrStretched != 0U ) + { + assert( h->lastPoppedWasSilence == false ); + /* separate concealments since last available pop in lost and stretched */ + nStretched = tsDiff / h->frameDuration; + assert( h->nLostOrStretched >= nStretched ); + + /* convert stretching followed by shrinking to late-loss */ + if ( nStretched > 0U ) + { + --nStretched; + ++h->nLateLost; + h->nLost += h->nLostOrStretched - nStretched; + /* jitter-induced insertion (e.g. buffer underflow) */ + h->jitterInducedConcealments += nStretched; + if ( !dataUnit->silenceIndicator ) + { + /* JBM induced removal of a speech frame (intentional frame dropping) */ + ++h->jitterInducedConcealments; + } + h->nStretched += nStretched; + } + else + { + h->nLost += h->nLostOrStretched; + ++h->nShrinked; + if ( !dataUnit->silenceIndicator ) + { + /* JBM induced removal of a speech frame (intentional frame dropping) */ + ++h->jitterInducedConcealments; + } + } + h->nLostOrStretched = 0; + } + else + { + if ( !dataUnit->silenceIndicator ) + { + ++h->nShrinked; + /* JBM induced removal of a speech frame (intentional frame dropping) */ + ++h->jitterInducedConcealments; + } + } + + h->lastReturnedTs = dataUnit->timeStamp; + h->lastPoppedWasSilence = dataUnit->silenceIndicator; + h->nextExpectedTs = dataUnit->timeStamp + h->frameDuration; + + /* substract one frame from last playout delay */ + h->lastPlayoutOffset -= h->frameDuration; + if ( h->lastTargetTime != 0U ) + h->lastTargetTime += h->frameDuration; + + JB4_FreeDataUnit( h, dataUnit ); + + return; +} + + +/* function to calculate the playout delay based on the current jitter */ +static int16_t JB4_playoutDelay( + const JB4_HANDLE h, + const uint32_t playTime, + const uint32_t rtpTimeStamp, + uint32_t *delay ) +{ + int32_t minOffTicks; + + if ( JB4_JMF_MinOffset( h->ltJmf, &minOffTicks ) != 0 ) + { + return -1; + } + + *delay = playTime - minOffTicks - rtpTimeStamp; + + return 0; +} + + +/* function to update lastPlayoutDelay and lastTargetTime after popFromBuffer() */ +static void JB4_updateLastTimingMembers( + JB4_HANDLE h, + const uint32_t playTime, + const uint32_t rtpTimeStamp ) +{ + int32_t minOffTicks; + + if ( JB4_JMF_MinOffset( h->ltJmf, &minOffTicks ) != 0 ) + { + return; + } + + /* playoutDelay = playTime - minOffset - timeStamp */ + h->lastPlayoutOffset = playTime - rtpTimeStamp; + /* targetTime = minOffset + timeStamp + targetDelay */ + h->lastTargetTime = (uint32_t) ( minOffTicks + rtpTimeStamp + h->targetPlayoutDelay ); + + return; +} + + +/* function to compare the RTP time stamps of two data units: newElement==arrayElement ? 0 : (newElement>arrayElement ? +1 : -1) */ +static int16_t JB4_inputBufferCompareFunction( + const JB4_INPUTBUFFER_ELEMENT newElement, + const JB4_INPUTBUFFER_ELEMENT arrayElement, + bool *replaceWithNewElementIfEqual ) +{ + JB4_DATAUNIT_HANDLE newDataUnit, arrayDataUnit; + int32_t diff; + int16_t result; + + *replaceWithNewElementIfEqual = 0; + newDataUnit = (JB4_DATAUNIT_HANDLE) newElement; + arrayDataUnit = (JB4_DATAUNIT_HANDLE) arrayElement; + diff = JB4_rtpTimeStampDiff( arrayDataUnit->timeStamp, newDataUnit->timeStamp ); + if ( diff > 0 ) + { + result = 1; + } + else if ( diff < 0 ) + { + result = -1; + } + else /* equal timestamps */ + { + result = 0; + if ( newDataUnit->partial_frame == 0 && arrayDataUnit->partial_frame == 1 ) + { + /* replace partial copy with primary copy */ + *replaceWithNewElementIfEqual = 1; + } + else if ( newDataUnit->partial_frame == arrayDataUnit->partial_frame && newDataUnit->dataSize > arrayDataUnit->dataSize ) + { + /* if both are primary or partial: take the one with higher size (e.g. higher bitrate) */ + *replaceWithNewElementIfEqual = 1; + } + } + + return result; +} + +#undef WMC_TOOL_SKIP diff --git a/lib_dec/jbm_jb4sb.h b/lib_dec/jbm_jb4sb.h new file mode 100644 index 0000000000000000000000000000000000000000..b64805f342b62fe26bcaa7d60b28c164c5414894 --- /dev/null +++ b/lib_dec/jbm_jb4sb.h @@ -0,0 +1,103 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +/** \file jbm_jb4sb.h EVS Jitter Buffer Management Interface */ + +#ifndef JBM_JB4SB_H +#define JBM_JB4SB_H JBM_JB4SB_H + +#include +#include +#include "options.h" +#include "typedef.h" +#include "ivas_error.h" + +/** handle for jitter buffer */ +typedef struct JB4 *JB4_HANDLE; + +/** jitter buffer data units (access unit together with RTP seqNo, timestamp, ...) */ +struct JB4_DATAUNIT +{ + /** the RTP sequence number (16 bits) */ + uint16_t sequenceNumber; + /** the RTP time stamp (32 bits) of this chunk in timeScale() units */ + uint32_t timeStamp; + /** the duration of this chunk in timeScale() units */ + uint32_t duration; + /** the RTP time scale, which is used for timeStamp() and duration() */ + uint32_t timeScale; + /** the receive time of the RTP packet in milliseconds */ + uint32_t rcvTime; + /** true, if the data unit contains only silence */ + bool silenceIndicator; + /** Q bit for AMR-WB IO */ + Word16 qBit; + + /** the binary encoded access unit */ + uint8_t *data; + /** the size of the binary encoded access unit [bits] */ + uint16_t dataSize; + + /** identify if the data unit has a partial copy of a previous frame */ + bool partial_frame; + /** offset of the partial copy contained in that frame or zero */ + int16_t partialCopyOffset; + int16_t nextCoderType; +}; +typedef struct JB4_DATAUNIT *JB4_DATAUNIT_HANDLE; + + +ivas_error JB4_Create( JB4_HANDLE *ph ); + +void JB4_Destroy( JB4_HANDLE *ph ); + +ivas_error JB4_Init( JB4_HANDLE h, const int16_t safetyMargin ); + +JB4_DATAUNIT_HANDLE JB4_AllocDataUnit( JB4_HANDLE h ); + +void JB4_FreeDataUnit( JB4_HANDLE h, JB4_DATAUNIT_HANDLE dataUnit ); + +int16_t JB4_PushDataUnit( JB4_HANDLE h, JB4_DATAUNIT_HANDLE dataUnit, const uint32_t rcvTime ); + +int16_t JB4_PopDataUnit( JB4_HANDLE h, const uint32_t sysTime, const uint32_t extBufferedTime, JB4_DATAUNIT_HANDLE *pDataUnit, uint32_t *scale, uint32_t *maxScaling ); + +int16_t JB4_getFECoffset( JB4_HANDLE h ); + +int16_t JB4_FECoffset( JB4_HANDLE h ); + +uint16_t JB4_bufferedDataUnits( const JB4_HANDLE h ); + +#endif /* JBM_JB4SB_H */ diff --git a/lib_dec/jbm_pcmdsp_apa.c b/lib_dec/jbm_pcmdsp_apa.c new file mode 100644 index 0000000000000000000000000000000000000000..8a69fa78ef68e863a19fd0bffb5ec66e7b184502 --- /dev/null +++ b/lib_dec/jbm_pcmdsp_apa.c @@ -0,0 +1,1493 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +/*! @file jbm_pcmdsp_apa.c Adaptive Playout for Audio (apa). */ + +/* system headers */ +#include +#include +#include +#include +#include +#include "options.h" +#include "prot.h" +#include "wmc_auto.h" +/* local headers */ +#include "jbm_pcmdsp_apa.h" +#include "jbm_pcmdsp_similarityestimation.h" +#include "jbm_pcmdsp_window.h" +#include "cnst.h" + + +/*---------------------------------------------------------------------* + * Local state structure + *---------------------------------------------------------------------*/ + +/* maximum number of segments/iterations in extend_frm() */ +#define MAXN 10 + +/* definition of state struct */ +struct apa_state_t +{ + /* output buffer */ + bool evs_compat_mode; + float *buf_out; + uint16_t buf_out_capacity; + uint16_t l_buf_out; + + /* Hann window */ + float win[APA_BUF_PER_CHANNEL]; + uint16_t l_halfwin; + + /* sampling rate [Hz] */ + uint16_t rate; + + /* length of a segment [samples] */ + uint16_t l_seg; + + /* length of a frame [samples] */ + uint16_t l_frm; + + /* total number of processed input samples since apa_reset() */ + uint32_t l_in_total; + + /* time resolution in samples of the IVAS renderer*/ + uint16_t l_ts; + + /* samples already available in the renderer buffer */ + uint16_t l_r_buf; + + /* sum of inserted/removed samples since last apa_set_scale() */ + int32_t diffSinceSetScale; + /* number of input frames since last apa_set_scale() */ + uint32_t nFramesSinceSetScale; + + /* current and previous scaling ratio [%] */ + uint16_t scale; + + /* minimum pitch length [samples] */ + uint16_t p_min; + + /* search length [samples] */ + uint16_t l_search; + + uint16_t wss; /* waveform subsampling per channel */ + uint16_t css; /* correlation subsampling per channel */ + + float targetQuality; + uint16_t qualityred; /* quality reduction threshold */ + uint16_t qualityrise; /* quality rising for adaptive quality thresholds */ + + uint16_t last_pitch; /* last pitch/sync position */ + uint16_t bad_frame_count; /* # frames before quality threshold is lowered */ + uint16_t good_frame_count; /* # scaled frames */ + + uint16_t num_channels; /* number of input/output channels */ +}; + + +/*---------------------------------------------------------------------* + * Local function prototypes + *---------------------------------------------------------------------*/ + +static float apa_corrEnergy2dB( float energy, uint16_t corr_len ); + +static float apa_getQualityIncreaseForLowEnergy( float energydB ); + +static bool logarithmic_search( const apa_state_t *ps, const float *signal, int16_t s_start, uint16_t inlen, uint16_t offset, uint16_t fixed_pos, uint16_t corr_len, uint16_t wss, uint16_t css, int16_t *synchpos ); + +static bool find_synch( apa_state_t *ps, const float *in, uint16_t l_in, int16_t s_start, uint16_t s_len, int16_t fixed_pos, uint16_t corr_len, uint16_t offset, float *energy, float *quality, int16_t *synch_pos ); + +static bool copy_frm( apa_state_t *ps, const float frm_in[], float frm_out[], uint16_t *l_frm_out ); + +static bool shrink_frm( apa_state_t *ps, const float frm_in[], uint16_t maxScaling, float frm_out[], uint16_t *l_frm_out ); + +static bool extend_frm( apa_state_t *ps, const float frm_in[], float frm_out[], uint16_t *l_frm_out ); + +/*---------------------------------------------------------------------* + * Public functions + *---------------------------------------------------------------------*/ + +/* Allocates memory for state struct and initializes elements. */ +ivas_error apa_init( + apa_state_t **pps, + const int32_t num_channels ) +{ + apa_state_t *ps = NULL; + + /* make sure pointer is valid */ + if ( !pps ) + { + return 1; + } + + /* allocate state struct */ + if ( ( ps = (apa_state_t *) malloc( sizeof( apa_state_t ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for JBM\n" ) ); + } + + ps->num_channels = (uint16_t) num_channels; + ps->buf_out_capacity = (uint16_t) ( APA_BUF_PER_CHANNEL * num_channels ); + if ( ( ps->buf_out = malloc( sizeof( float ) * ps->buf_out_capacity ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for JBM\n" ) ); + } + + ps->evs_compat_mode = false; + + apa_reset( ps ); + *pps = ps; + + return IVAS_ERR_OK; +} + + +/* Sets state variables to initial value. */ +void apa_reset( + apa_state_t *ps ) +{ + /* init state struct */ + ps->l_buf_out = 0; + ps->l_halfwin = 0; + ps->rate = 0; + ps->l_seg = 0; + ps->l_frm = 0; + ps->l_in_total = 0; + ps->diffSinceSetScale = 0; + ps->nFramesSinceSetScale = 0; + ps->scale = 100; + ps->p_min = 0; + ps->l_search = 0; + ps->wss = 1; + ps->css = 1; + ps->targetQuality = 0.0f; + ps->qualityred = 0; + ps->qualityrise = 0; + ps->last_pitch = 0; + ps->bad_frame_count = 0; + ps->good_frame_count = 0; + + ps->l_ts = 1; + ps->l_r_buf = 0; + return; +} + +uint8_t apa_reconfigure( + apa_state_t *ps, + uint16_t num_channels, + uint16_t l_ts ) +{ + + /* realloc buffer */ + free( ps->buf_out ); + ps->num_channels = (uint16_t) num_channels; + ps->buf_out_capacity = (uint16_t) ( APA_BUF_PER_CHANNEL * num_channels ); + ps->buf_out = (float *) malloc( sizeof( float ) * ps->buf_out_capacity ); + if ( !ps->buf_out ) + { + return 2; + } + ps->l_buf_out = 0; + ps->l_in_total = 0; + ps->l_ts = ps->num_channels * l_ts; + + /* set everything else dependent on the number of channels */ + /* set segment size */ + /* in the order of a pitch, set to 160 samples at 16 kHz */ + /* used for windowing and as the correlation length, i.e., */ + /* the size of the template segment. */ + ps->l_seg = ( ps->rate / 100 ) * ps->num_channels; + + /* set frame size */ + /* set to 320 samples at 16 kHz */ + ps->l_frm = ( ps->rate / FRAMES_PER_SEC ) * ps->num_channels; + + /* set minimum pitch */ + /* set to 40 samples at 16 kHz */ + /* (defines min change in number of samples, i.e., abs(l_in-l_out) >= p_min) */ + ps->p_min = ( ps->rate / 400 ) * ps->num_channels; + + /* set search length */ + /* must cover one pitch, set to 200 samples at 16 kHz */ + /* (the resulting maximum pitch is then p_min+l_search = 240 samples at 16 kHz) */ + ps->l_search = ( ps->rate / 80 ) * ps->num_channels; + + return 0; +} + + +/* Sets the audio configuration. */ +bool apa_set_rate( + apa_state_t *ps, + const int32_t output_Fs ) +{ + /* make sure pointer is valid */ + if ( ps == NULL ) + { + return 1; + } + + /* check range */ + if ( ( output_Fs < APA_MIN_RATE ) || ( output_Fs > APA_MAX_RATE ) ) + { + return 1; + } + + /* reset state struct */ + apa_reset( ps ); + + /* copy rate to state struct */ + ps->rate = (uint16_t) output_Fs; + + if ( ps->num_channels > APA_MAX_NUM_CHANNELS ) + { + return 1; + } + + /* + * several other parameters depend on the sampling rate + * and are set below. Some "magic numbers" are used here + * which are based on typical values of a "pitch" in + * human voice. The pitch length is the period of the + * base frequency and is usually assumed to be 40-240 + * samples at 16 kHz. + */ + + /* set segment size */ + /* in the order of a pitch, set to 160 samples at 16 kHz */ + /* used for windowing and as the correlation length, i.e., */ + /* the size of the template segment. */ + ps->l_seg = ( ps->rate / 100 ) * ps->num_channels; + + /* init Hann window */ + /* Note: l_win < APA_BUF_PER_CHANNEL is required */ + /* Length of Hann window should be independent of + * number of channels - same window applied to all channels */ + ps->l_halfwin = ps->rate / 100; + hannWindow( ps->l_halfwin * 2, ps->win ); + + /* set frame size */ + /* set to 320 samples at 16 kHz */ + ps->l_frm = ( ps->rate / FRAMES_PER_SEC ) * ps->num_channels; + + /* set minimum pitch */ + /* set to 40 samples at 16 kHz */ + /* (defines min change in number of samples, i.e., abs(l_in-l_out) >= p_min) */ + ps->p_min = ( ps->rate / 400 ) * ps->num_channels; + + /* set search length */ + /* must cover one pitch, set to 200 samples at 16 kHz */ + /* (the resulting maximum pitch is then p_min+l_search = 240 samples at 16 kHz) */ + ps->l_search = ( ps->rate / 80 ) * ps->num_channels; + + return 0; +} + + +/* Set scaling. */ +bool apa_set_scale( + apa_state_t *ps, + uint16_t scale ) +{ + /* make sure pointer is valid */ + if ( ps == NULL ) + { + return 1; + } + + /* check range */ + if ( ( scale < APA_MIN_SCALE ) || ( scale > APA_MAX_SCALE ) ) + { + return 1; + } + + /* do nothing if same scale is set multiple times */ + /* (otherwise scale control is confused) */ + if ( ps->scale == scale ) + { + return 0; + } + + /* copy to state struct */ + ps->scale = scale; + + /* reset scaling statistics */ + ps->diffSinceSetScale = 0; + ps->nFramesSinceSetScale = 0; + + return 0; +} + +bool apa_set_renderer_granularity( + apa_state_t *ps, + uint16_t l_ts ) +{ + /* make sure pointer is valid */ + if ( ps == NULL ) + { + return 1; + } + + + /* copy to state struct */ + ps->l_ts = l_ts * ps->num_channels; + return 0; +} + +bool apa_set_renderer_residual_samples( + apa_state_t *ps, + uint16_t l_r_buf ) +{ + /* make sure pointer is valid */ + if ( ps == NULL ) + { + return 1; + } + + + /* copy to state struct */ + ps->l_r_buf = l_r_buf * ps->num_channels; + return 0; +} + +bool apa_set_evs_compat_mode( + apa_state_t *ps, + bool mode ) +{ + /* make sure pointer is valid */ + if ( ps == NULL ) + { + return 1; + } + + ps->evs_compat_mode = mode; + + return 0; +} + +/* +******************************************************************************** +* +* Function : apa_set_quality +* Tables : +* Compile Defines : +* Return : 0 on success, 1 on failure +* Information : Set quality thresholds. +* +* quality is lower limit for minimum quality +* Range is [-2;2] - where positive values allow +* only pasting with same phase information +* Negative values would yield cross phased pasting +* +* qualityred allows dynamic lowering of lower quality +* bound - this gives better results for rhythmic signals +* Range is [0;20], meaning 0.1 lowering*qualityred +* +* undocumented: qualityrise (same as qualityred - other +* direction) +* +******************************************************************************** +*/ +bool apa_set_quality( + apa_state_t *ps, + float quality, + uint16_t qualityred, + uint16_t qualityrise ) +{ + assert( ps != NULL ); + assert( -2.0f <= quality && quality <= 3.1f ); + assert( qualityred > 0 && qualityred <= 20 ); + assert( qualityrise > 0 && qualityrise <= 20 ); + + ps->targetQuality = quality; + ps->qualityred = qualityred; + ps->qualityrise = qualityrise; + ps->bad_frame_count = 0; + ps->good_frame_count = 0; + + return 0; +} + +/* +******************************************************************************** +* +* Function : apa_set_complexity_options +* Tables : +* Compile Defines : +* Return : 0 on success, 1 on failure +* Information : Set complexity options +* Waveform subsampling computes the correlation function +* for certain positions only +* Correlation function subsampling computes the maxima +* for certain positions only +* +******************************************************************************** +*/ +bool apa_set_complexity_options( + apa_state_t *ps, + uint16_t wss, + uint16_t css ) +{ + /* make sure pointer is valid */ + if ( ps == NULL ) + { + return 1; + } + + if ( wss == 0 || wss > 1000 ) + { + return 1; + } + + if ( css == 0 || css > 1000 ) + { + return 1; + } + + ps->wss = wss; + ps->css = css; + + return 0; +} + +/* +******************************************************************************** +* +* Function : apa_exit +* Tables : +* Compile Defines : +* Return : 0 on success, 1 on failure +* Information : The memory used for storing the state is freed. +* The state struct pointer is set to NULL. +* +******************************************************************************** +*/ +bool apa_exit( + apa_state_t **pps ) +{ + /* ignore NULL pointer input */ + if ( *pps == NULL ) + { + return 0; + } + + /* deallocate state struct members */ + free( ( *pps )->buf_out ); + + /* deallocate state struct */ + free( *pps ); + + /* set pointer to NULL */ + *pps = NULL; + + return 0; +} + +/* +******************************************************************************** +* +* Function : apa_exec +* Tables : +* Compile Defines : +* Return : 0 on success, 1 on failure +* Information : Execute adaptive playout for audio, i.e., audio scaling. +* Will take l_in input samples from a_in[] and +* try to extend/shrink the amount of samples according +* to the last scaling set by using apa_set_scale(). +* The actual amount of samples after scaling may vary +* and is given in l_out. The scaled audio samples +* are contained in a_out[]. Note that the scaling is +* achieved only in average. The input buffer must be +* filled with 20ms audio. The output buffer must be +* allocated externally and must be at least of size +* APA_BUF. +* Scaling can only be performed when a sampling rate +* is specified using apa_set_rate(). Otherwise, +* an error is returned. +* +* The amount of scaling is achieved by controlling the +* frequency of scaling. Note that the exact amount of +* scaling is signal dependent and is an integer +* multiple of a pitch. Hence, when we want to achieve +* a scaling of e.g. 110% then the APA module will typically +* forward several frames without any modification and +* then scale one frame by a higher amount, e.g. 143%. +* +******************************************************************************** +*/ +uint8_t apa_exec( + apa_state_t *ps, /* i/o: state struct */ + const float a_in[], /* i : input samples */ + uint16_t l_in, /* i : number of input samples */ + uint16_t maxScaling, /* i : allowed number of inserted/removed samples */ + float a_out[], /* o : output samples */ + uint16_t *l_out /* o : number of output samples */ +) +{ + uint16_t i; + float frm_in[APA_BUF]; /* TODO(mcjbm): this buffer could be smaller - always allocates space for 16 channels */ + uint16_t l_frm_out; + int16_t l_rem; + int32_t dl_scaled, dl_copied, l_frm_out_target; + int32_t expScaling, actScaling; + uint32_t statsResetThreshold, statsResetShift; + + statsResetThreshold = 1637; + statsResetShift = 2; + + /* Convert max_scaling from "per channel" to total */ + maxScaling *= ps->num_channels; + + /* make sure no invalid output is used */ + *l_out = 0; + l_frm_out = 0; + + /* make sure pointer is valid */ + if ( ps == NULL ) + { + return 1; + } + /* check available rate */ + if ( ps->rate == 0 ) + { + return 2; + } + /* check size of input */ + if ( l_in != ps->l_frm ) + { + return 3; + } + + /* get target length */ + if ( ps->scale > 100 ) + { + expScaling = (int32_t) ( ( ps->l_frm * ( ps->scale - 100.0f ) / 100.0f ) * ( ps->nFramesSinceSetScale + 1 ) + 0.5f ); + } + else if ( ps->scale < 100 ) + { + expScaling = (int32_t) ( ( ps->l_frm * ( ps->scale - 100.0f ) / 100.0f ) * ( ps->nFramesSinceSetScale + 1 ) - 0.5f ); + } + else + { + expScaling = 0; + } + actScaling = ps->diffSinceSetScale - ps->l_frm; + l_frm_out_target = expScaling - actScaling; + + /* Wait until we have l_frm outputs samples */ + /* (required to search for correlation in the past). */ + /* If we don't have enough samples, simply copy input to output */ + if ( ps->l_buf_out < ps->l_frm ) + { + for ( i = 0; i < ps->l_frm; i++ ) + { + a_out[i] = a_in[i]; + } + l_frm_out = ps->l_frm; + } + else + { + float *buf_out_ptr = &( ps->buf_out[ps->l_buf_out - ps->l_frm] ); + float *frm_in_ptr = &( frm_in[ps->l_frm] ); + + /* fill input frame */ + /* 1st input frame: previous output samples */ + for ( i = 0; i < ps->l_frm; i++ ) + { + frm_in[i] = buf_out_ptr[i]; + } + /* 2nd input frame: new input samples */ + for ( i = 0; i < ps->l_frm; i++ ) + { + frm_in_ptr[i] = a_in[i]; + } + /* no scaling */ + if ( ps->scale == 100 ) + { + copy_frm( ps, frm_in, a_out, &l_frm_out ); + } + /* shrink */ + else if ( ps->scale < 100 ) + { + shrink_frm( ps, frm_in, maxScaling, a_out, &l_frm_out ); + } + /* extend */ + else + { + extend_frm( ps, frm_in, a_out, &l_frm_out ); + } + /* control the amount/frequency of scaling */ + if ( l_frm_out != ps->l_frm ) + { + if ( maxScaling != 0U && + abs( (int16_t) ( ps->l_frm - l_frm_out ) ) > maxScaling ) + { + /* maxScaling exceeded -> discard scaled frame */ + copy_frm( ps, frm_in, a_out, &l_frm_out ); + } + else if ( abs( l_frm_out_target ) > ps->l_frm ) /* ignore small difference */ + { + dl_copied = l_frm_out_target - (int32_t) ps->l_frm; + dl_scaled = l_frm_out_target - (int32_t) l_frm_out; + /* discard scaled frame if copied frame is closer to target length */ + if ( abs( dl_copied ) < abs( dl_scaled ) ) + { + copy_frm( ps, frm_in, a_out, &l_frm_out ); + } + } + } + } + + /* copy output to internal buffer */ + /* avoid buffer overflow: */ + /* discard old samples; always keep at least most recent l_frm samples */ + if ( ( ps->l_buf_out + l_frm_out ) > ps->buf_out_capacity ) + { + float *buf_out_ptr1 = ps->buf_out; + float *buf_out_ptr2; + + l_rem = ( ps->l_frm - l_frm_out ); + if ( l_rem < 0 ) + { + l_rem = 0; + } + buf_out_ptr2 = &( ps->buf_out[ps->l_buf_out - l_rem] ); + for ( i = 0; i < l_rem; i++ ) + { + buf_out_ptr1[i] = buf_out_ptr2[i]; + } + ps->l_buf_out = l_rem; + } + /* append new output samples */ + if ( ( ps->l_buf_out + l_frm_out ) > ps->buf_out_capacity ) + { + return 5; + } + { + float *buf_out_ptr = &( ps->buf_out[ps->l_buf_out] ); + for ( i = 0; i < l_frm_out; i++ ) + { + buf_out_ptr[i] = a_out[i]; + } + } + ps->l_buf_out += l_frm_out; + + *l_out = l_frm_out; + /* update time */ + ps->l_in_total += ps->l_frm; + + if ( abs( ps->diffSinceSetScale ) < ( 0x7FFFFF - ( l_frm_out - ps->l_frm ) ) && + ps->nFramesSinceSetScale < statsResetThreshold ) + { + ps->diffSinceSetScale += l_frm_out - ps->l_frm; + ++ps->nFramesSinceSetScale; + } + else /* scale statistics down to avoid overflow */ + { + ps->diffSinceSetScale >>= statsResetShift; + ps->nFramesSinceSetScale >>= statsResetShift; + } + + return 0; +} + + +/*---------------------------------------------------------------------* + * Local functions + *---------------------------------------------------------------------*/ + +/* +******************************************************************************** +* +* Function : get_scaling_quality +* Tables : +* Compile Defines : +* Return : 0 on success, 1 on failure +* Information : Uses pitch, half pitch, three halves and double pitch +* to evaluate the quality of the scaled frame by checking +* periodicity. +* Silence can be detected as additional feature. This must +* be set in global struct apa_state. +* +* If search length is very narrow then use fewer points +* to evaluate periodicity and silence. +* +* Computationally not very efficient by using normalized +* cross-correlation: Using sqrt() for energy calculation +* adds complexity. +* +* 03-AUG-04 S.Doehla initial version +* +******************************************************************************** +*/ +static void get_scaling_quality( + const apa_state_t *ps, + const float *signal, + uint16_t s_len, + uint16_t offset, + uint16_t corr_len, + uint16_t pitch, + float *energydB, + float *quality ) +{ + float maxEnergy = 0.0f; + float qualityOfMaxEnergy = 0.0f; /* we measure the quality for all channels and select the one with highest energy */ + + float half_pitch_cn = 0.0f; + float pitch_cn = 0.0f; + float three_halves_pitch_cn = 0.0f; + float double_pitch_cn = 0.0f; + + float pitch_energy = 0.0f; + float half_pitch_energy = 0.0f; + float three_halves_pitch_energy = 0.0f; + float double_pitch_energy = 0.0f; + + uint16_t i = 0; + + for ( i = 0; i < ps->num_channels; i++ ) + { + float energy; + offset = 0; + + pitch_cn = normalized_cross_correlation_self( signal, pitch + offset, offset, corr_len, ps->num_channels * 2, &pitch_energy ); + if ( pitch_cn > 0.0f ) + { + /* calculate correlation for double pitch */ + if ( 2 * pitch + offset + corr_len <= s_len ) + { + double_pitch_cn = normalized_cross_correlation_self( signal, 2 * pitch + offset, offset, corr_len, ps->num_channels * 2, &double_pitch_energy ); + } + else + { + double_pitch_cn = pitch_cn; + double_pitch_energy = pitch_energy; + } + /* calculate correlation for three/half pitch */ + if ( ( 3 * pitch ) / 2 + offset + corr_len <= s_len ) + { + three_halves_pitch_cn = normalized_cross_correlation_self( signal, ( 3 * pitch ) / 2 + offset, offset, corr_len, ps->num_channels * 2, &three_halves_pitch_energy ); + } + else + { + three_halves_pitch_cn = pitch_cn; + three_halves_pitch_energy = pitch_energy; + } + /* calculate correlation for half pitch */ + if ( pitch / 2 + offset + corr_len <= s_len ) + { + half_pitch_cn = normalized_cross_correlation_self( signal, pitch / 2 + offset, offset, corr_len, ps->num_channels * 2, &half_pitch_energy ); + } + else + { + half_pitch_cn = pitch_cn; + half_pitch_energy = pitch_energy; + } + + /* combine correlation results */ + *quality = ( half_pitch_cn * three_halves_pitch_cn ) + ( pitch_cn * double_pitch_cn ); + energy = pitch_energy + half_pitch_energy + three_halves_pitch_energy + double_pitch_energy; + } + else + { + *quality = pitch_cn; /* value is negative, thus pass it */ + energy = pitch_energy; + } + + /* update the quality by the quality of the signal with the highest energy */ + if ( energy > maxEnergy ) + { + qualityOfMaxEnergy = *quality; + maxEnergy = energy; + } + + /* go to next channel */ + ++signal; + } + *quality = qualityOfMaxEnergy; + + /* increase calculated quality of signals with low energy */ + *energydB = apa_corrEnergy2dB( maxEnergy, corr_len ); + *quality += apa_getQualityIncreaseForLowEnergy( *energydB ); + + return; +} + + +/* Converts the correlation energy to dB. */ +static float apa_corrEnergy2dB( + float energy, + uint16_t corr_len ) +{ + float energydB = 10.0f * (float) log10( energy / ( PCM16_TO_FLT_FAC * PCM16_TO_FLT_FAC * corr_len * 4.0f ) ); + + return energydB; +} + + +/* Increases the calculated quality of signals with low energy. */ +static float apa_getQualityIncreaseForLowEnergy( + float energydB ) +{ + const float qualIncreaseMinEnergy = -65; + const float qualIncreaseMaxEnergy = -40; + float qualIncForLowEnergy = 0; + + if ( energydB < qualIncreaseMaxEnergy ) + { + qualIncForLowEnergy = energydB; + if ( qualIncForLowEnergy < qualIncreaseMinEnergy ) + { + qualIncForLowEnergy = qualIncreaseMinEnergy; + } + if ( qualIncForLowEnergy > qualIncreaseMaxEnergy ) + { + qualIncForLowEnergy = qualIncreaseMaxEnergy; + } + qualIncForLowEnergy = ( qualIncForLowEnergy - qualIncreaseMaxEnergy ) / + ( qualIncreaseMinEnergy - qualIncreaseMaxEnergy ) * 2; + assert( qualIncForLowEnergy >= 0 && qualIncForLowEnergy <= 2 ); + } + + return qualIncForLowEnergy; +} + + +/* +******************************************************************************** +* +* Function : logarithmic_search +* Tables : +* Compile Defines : +* Return : 0 on success, 1 on failure +* Information : Search for best match of a template segment using +* hierarchical search method: +* Parameter css is used for sampling every css'd correlation +* value. The area around the best match so far is used for +* further correlation value with half css-value until css=1. +* Search area length is always half previous search length. +* Parameter wss is passed to the correlation computation +* If the search area passes the boundaries, the search +* window is reduced so that it's entirely inside the +* boundaries. +* +******************************************************************************** +*/ +static bool logarithmic_search( + const apa_state_t *ps, + const float *signal, + int16_t s_start, + uint16_t inlen, + uint16_t offset, + uint16_t fixed_pos, + uint16_t corr_len, + uint16_t wss, + uint16_t css, + int16_t *synchpos ) +{ + int16_t i; + float coeff; + float coeff_max; + int16_t s_start_old = 0; + uint16_t s_len_old = 0; + + do + { + coeff_max = -FLT_MAX; /* will always be overwritten with result of first correlation */ + for ( i = s_start; i < s_start + inlen; i += css * ps->num_channels ) + { + if ( ( wss == 1 ) && ( ps->num_channels == 1 ) ) + { + coeff = cross_correlation_self( signal, i + offset, fixed_pos + offset, corr_len ); + } + else + { + coeff = cross_correlation_subsampled_self( signal, i + offset, fixed_pos + offset, corr_len, wss * ps->num_channels ); + } + + /* update max corr */ + if ( ps->scale < 100 ) + { + /* shrinking: prefer greater synchpos for equal coeff */ + if ( coeff >= coeff_max ) + { + coeff_max = coeff; + *synchpos = i; + } + } + else + { + /* extending: prefer smaller synchpos for equal coeff */ + if ( coeff > coeff_max ) + { + coeff_max = coeff; + *synchpos = i; + } + } + } + /* backup old search range */ + s_start_old = s_start; + s_len_old = inlen; + + css = css / 2; + inlen = inlen / 2; + s_start = *synchpos - inlen / 2; + if ( s_start < s_start_old ) + { + s_start = s_start_old; + } + if ( ( s_start + inlen ) > ( s_start_old + s_len_old ) ) + { + inlen = s_start_old - s_start + s_len_old; + } + } while ( css > 2 ); + + return 0; +} + + +/* +******************************************************************************** +* +* Function : find_synch +* Tables : +* Compile Defines : +* Return : 0 on success, 1 on failure +* Information : Find the best match of an template segment within +* a search region by similarity measures. +* +* Typical example: +* +* 0 10 20 30 40 50 60 +* in[] = abcdefghijk_abcdefghijk_abcdefghijk_abcdEFGHIJk_abcdefghijk_a +* l_in = 61 +* offset = 30 | +* s_start = -20 <-------------------| +* s_len = 15 <-------------> | +* search range: *************** | +* fixed_pos = 10 |---------> +* corr_len = 6 | <----> +* template segment: | ****** +* synch_pos: -14 <-------------| +* +* All positions are given relative to offset. The +* search region starts at offset+s_start and ends +* at offset+s_start+s_len. The template segment +* starts at offset+fixed_pos and ends at +* offset+fixed_pos+corr_len. For correlation, the +* template segment (EFGHIJ) is matched against the +* segment in the search region, e.g., against (k_abcd) +* in the first search position. The search position +* with the best match (-14: EFGHIJ <-> efghij) is +* returned. +* +* 19-JUN-03 N.Faerber initial version +* 23-APR-04 S.Doehla added subsampling +* +******************************************************************************** +*/ +static bool find_synch( + apa_state_t *ps, + const float *in, + uint16_t l_in, + int16_t s_start, + uint16_t s_len, + int16_t fixed_pos, + uint16_t corr_len, + uint16_t offset, + float *energy, + float *quality, + int16_t *synch_pos ) +{ + assert( ( corr_len - 1 + s_start + s_len - 1 + offset ) < l_in ); + assert( ( corr_len - 1 + fixed_pos + offset ) < l_in ); + + /* pass last pitch to search function as prediction value */ + *synch_pos = ps->last_pitch; + + logarithmic_search( ps, in, s_start, s_len, offset, fixed_pos, corr_len, ps->wss, ps->css, synch_pos ); + + /* assert synch_pos is cleanly divisible by number of channels */ + assert( *synch_pos % ps->num_channels == 0 ); + + *quality = 0; + get_scaling_quality( ps, in, l_in, offset, corr_len, (uint16_t) abs( fixed_pos - *synch_pos ), energy, quality ); + + ps->last_pitch = *synch_pos; + + return 0; +} + + +/* +******************************************************************************** +* +* Function : copy_frm +* Tables : +* Compile Defines : +* Return : 0 on success, 1 on failure +* Information : Copy an audio. +* +* The frame size is fixed to ps->l_frm. The input data +* is stored in frm_in[], where the first ps->l_frm samples +* shall include the previous output frame and the second +* ps->l_frm samples shall contain the current input frame. +* The output frame is stored in frm_out[] and contains +* l_frm_out = ps->l_frm. +* +* The first ps->l_frm input samples are not used by +* this function and are only provided for a consistent +* function call with shrink_frm() and extend_frm(). +* +******************************************************************************** +*/ +static bool copy_frm( + apa_state_t *ps, + const float frm_in[], + float frm_out[], + uint16_t *l_frm_out ) +{ + uint16_t i; + + /* only 2nd input frame is used */ + frm_in += ps->l_frm; + + /* copy frame */ + for ( i = 0; i < ps->l_frm; i++ ) + { + frm_out[i] = frm_in[i]; + } + + /* set output length */ + *l_frm_out = ps->l_frm; + + return 0; +} + + +/* +******************************************************************************** +* +* Function : shrink_frm +* Tables : +* Compile Defines : +* Return : 0 on success, 1 on failure +* Information : Shrink the length of an audio frame using the WSOLA +* algorithm. +* +* The frame size is fixed to ps->l_frm. The input data +* is stored in frm_in[], where the first ps->l_frm samples +* shall include the previous output frame and the second +* ps->l_frm samples shall contain the current input frame. +* The output frame is stored in frm_out[] and contains +* l_frm_out samples. The amount of shrinking is signal +* dependent. +* +* The first ps->l_frm input samples are not used by +* this function and are only provided for a consistent +* function call with extend_frm(). +* +******************************************************************************** +*/ +static bool shrink_frm( + apa_state_t *ps, + const float frm_in[], + uint16_t maxScaling, + float frm_out[], + uint16_t *l_frm_out ) +{ + bool findSynchResult = 0; + int16_t xtract, l_rem, s_start, s_end; + uint16_t i; + uint16_t over; + float energy, quality = 0.0f; + uint16_t l_frm; + uint16_t l_seg; + + l_frm = ps->l_frm; + l_seg = ps->l_seg; + + /* only 2nd input frame is used */ + frm_in += l_frm; + + /* set search range */ + s_start = ( ps->p_min / ps->num_channels ) * ps->num_channels; + s_end = s_start + ps->l_search; + if ( ( s_end + l_seg ) >= l_frm ) + { + s_end = ( l_frm - l_seg ); + } + + /* calculate overlap position */ + if ( isSilence( frm_in, l_seg, 10 ) ) + { + /* maximum scaling */ + energy = -65; + quality = 5; + if ( ps->evs_compat_mode == false ) + { + + xtract = maxScaling; + /* take samples already in the renderer buf into account */ + xtract += ps->l_r_buf; + /* snap to renderer time slot borders */ + xtract -= ( ps->l_ts - ( l_frm - xtract + ps->l_r_buf ) % ps->l_ts ); + while ( xtract < 0 ) + { + xtract += ps->l_ts; + } + while ( xtract > ( s_end - ps->num_channels ) ) + { + /* exceeded the possible shrinking, go back one renderer ts*/ + xtract -= ps->l_ts; + } + } + else if ( maxScaling != 0U && s_end > maxScaling + 1 ) + { + xtract = maxScaling; + } + else + { + /* set to last valid element (i.e. element[len - 1] but note for stereo last element is last pair of samples) */ + xtract = s_end - ps->num_channels; + } + } + else + { + /* find synch */ + findSynchResult = find_synch( ps, frm_in, l_frm, s_start, (uint16_t) ( s_end - s_start ), 0, l_seg, 0, &energy, &quality, &xtract ); + } + + /* assert synch_pos is cleanly divisible by number of channels */ + assert( xtract % ps->num_channels == 0 ); + + /* set frame overlappable - reset if necessary */ + over = 1; + + /* test whether frame has sufficient quality */ + if ( quality < ( ps->targetQuality - ( ps->bad_frame_count * 0.1f ) + ( ps->good_frame_count * 0.2f ) ) ) + { + /* not sufficient */ + over = 0; + if ( ps->bad_frame_count < ps->qualityred ) + { + ++ps->bad_frame_count; + } + if ( ps->good_frame_count > 0U ) + { + --ps->good_frame_count; + } + } + else + { + /* sufficient quality */ + if ( ps->bad_frame_count > 0U ) + { + --ps->bad_frame_count; + } + if ( ps->good_frame_count < ps->qualityrise ) + { + ++ps->good_frame_count; + } + } + + /* Calculate output data */ + if ( over && xtract ) + { + if ( findSynchResult == 1 ) + { + return 1; + } + if ( ps->evs_compat_mode == true ) + { + overlapAddEvs( frm_in, frm_in + xtract, frm_out, l_seg, ps->num_channels, ps->win + ps->l_halfwin, ps->win ); + } + else + { + overlapAdd( frm_in, frm_in + xtract, frm_out, l_seg, ps->num_channels, ps->win + ps->l_halfwin, ps->win ); + } + } + else + { + xtract = 0; + for ( i = 0; i < l_seg; i++ ) + { + frm_out[i] = frm_in[i]; + } + } + + /* append remaining samples */ + l_rem = l_frm - xtract - l_seg; + for ( i = 0; i < l_rem; i++ ) + { + frm_out[l_seg + i] = frm_in[l_frm - l_rem + i]; + } + + /* set output length */ + *l_frm_out = l_seg + l_rem; + + return 0; +} + + +/* +******************************************************************************** +* +* Function : extend_frm +* Tables : +* Compile Defines : +* Return : 0 on success, 1 on failure +* Information : Extend the length of an audio frame using the WSOLA +* algorithm. +* +* The frame size is fixed to ps->l_frm. The input data +* is stored in frm_in[], where the first ps->l_frm samples +* shall include the previous output frame and the second +* ps->l_frm samples shall contain the current input frame. +* The output frame is stored in frm_out[] and contains +* l_frm_out samples. The amount of extension is signal +* dependent. +* +******************************************************************************** +*/ +static bool extend_frm( + apa_state_t *ps, + const float frm_in[], + float frm_out[], + uint16_t *l_frm_out ) +{ + bool findSynchResult = 0; + uint16_t l_frm_out_target; + uint16_t n, i; + int16_t N; + int16_t s[MAXN + 2], s_max, s_min; + int16_t xtract[MAXN + 2], sync_start, s_end; + uint16_t over[MAXN + 2]; + int16_t l_rem; + int16_t s_start = 0; + float energy, quality = 0.0f; + uint16_t l_frm, l_seg; + const float *fadeOut, *fadeIn; + float *out; + + + l_frm = ps->l_frm; + l_seg = ps->l_seg; + + /* number of segments/iterations */ + l_frm_out_target = (uint16_t) ( (float) l_frm * 1.5f ); + N = ( l_frm_out_target / l_seg ) - 1; + if ( N < 1 ) + { + N = 1; + } + if ( N > MAXN ) + { + return 1; + } + /* calculate equally spaced search regions */ + /* s[n] are given relative to 2nd frame and point to the start of */ + /* the search region. The first segment (n=1) will not be moved. */ + /* Hence, the iterations will start with n=2. */ + s_min = -( ps->l_search ) - ( ps->p_min ); + /* (make sure not to exceed array dimension) */ + if ( l_frm + s_min < 0 ) + { + s_min = -( l_frm ); + } + s_max = l_frm - 2 * l_seg - ps->l_search; + if ( s_max < s_min ) + { + N = 1; + } + /* for just one segment start at s_min */ + if ( N == 1 ) + { + s[2] = s_min; + } + /* else, spread linear in between s_min and s_max */ + /* (including s_min and s_max) */ + else + { + for ( n = 2; n <= ( N + 1 ); n++ ) + { + s[n] = s_min + ( ( s_max - s_min ) * ( n - 2 ) ) / ( N - 1 ); + } + } + + /* + * Planning Phase + */ + + xtract[1] = -( l_seg ); /* make sync_start=0 in 1st iteration */ + n = 2; + + /* define synch segment (to be correlated with search region) */ + sync_start = xtract[n - 1] + l_seg; + over[n] = 1; /* will be reset if overlap is not required */ + /* check end of search region: should be at least p_min */ + /* samples on the left of synch_start */ + if ( ( s[n] + ps->l_search ) < ( sync_start - ( ps->p_min ) ) ) + { + s_start = s[n]; + s_end = s_start + ps->l_search; + } + else + { + /* shrink search region to enforce minimum shift */ + s_end = sync_start - ( ps->p_min ); + if ( s[n] + ps->l_search < sync_start ) + { + s_start = s[n]; /* just do it with normal start position */ + } + else if ( n == ( N + 1 ) ) /* move search region left for last segment */ + { + s_start = s_end - ( ps->l_search - ps->p_min ); + } + else + { + over[n] = 0; /* don't search/overlap (just copy down) */ + } + } + + if ( over[n] ) + { + /* calculate overlap position */ + if ( isSilence( frm_in, l_seg, 10 ) ) + { + /* maximum scaling */ + energy = -65; + quality = 5; + xtract[n] = s_start + ps->num_channels; + if ( ps->evs_compat_mode == false ) + { + /* take renderer buffer samples into accout */ + xtract[n] += ps->l_r_buf; + /* snap to next renderer time slot border to resynchronize */ + xtract[n] -= ( ( N - 1 ) * l_seg - xtract[n] + ps->l_r_buf ) % ps->l_ts; + } + } + else + { + /* find synch */ + findSynchResult = find_synch( ps, frm_in, 2 * l_frm, s_start, s_end - s_start, sync_start, l_seg, l_frm, &energy, &quality, &xtract[n] ); + } + /* assert synch_pos is cleanly divisible by number of channels */ + assert( xtract[n] % ps->num_channels == 0 ); + + /* test for sufficient quality */ + if ( quality < ( ps->targetQuality - ( ps->bad_frame_count * 0.1f ) + ( ps->good_frame_count * 0.2f ) ) ) + { + /* not sufficient */ + over[n] = 0; + xtract[n] = sync_start; + if ( ps->bad_frame_count < ps->qualityred ) + { + ++ps->bad_frame_count; + } + if ( ps->good_frame_count > 0U ) + { + --ps->good_frame_count; + } + } + else + { + /* sufficient quality */ + if ( ps->bad_frame_count > 0U ) + { + --ps->bad_frame_count; + } + if ( ps->good_frame_count < ps->qualityrise ) + { + ++ps->good_frame_count; + } + } + if ( findSynchResult ) + { + return 1; + } + } + else + { + xtract[n] = sync_start; + } + + + /* Calculate output data */ + for ( n = 2; n <= N; n++ ) + { + if ( over[n] && xtract[n - 1] + l_seg != xtract[n] ) + { + /* mix 2nd half of previous segment with 1st half of current segment */ + fadeOut = frm_in + l_frm + xtract[n - 1] + l_seg; + fadeIn = frm_in + l_frm + xtract[n]; + out = frm_out + ( n - 2 ) * l_seg; + if ( ps->evs_compat_mode == true ) + { + overlapAddEvs( fadeOut, fadeIn, out, l_seg, ps->num_channels, ps->win + ps->l_halfwin, ps->win ); + } + else + { + overlapAdd( fadeOut, fadeIn, out, l_seg, ps->num_channels, ps->win + ps->l_halfwin, ps->win ); + } + } + else + { + /* just copy down 1st half of current segment (= 2nd half of previous segment) */ + float *frm_out_ptr; + const float *frm_in_ptr; + frm_out_ptr = &( frm_out[( n - 2 ) * l_seg] ); + frm_in_ptr = &( frm_in[l_frm + xtract[n]] ); + for ( i = 0; i < l_seg; i++ ) + { + frm_out_ptr[i] = frm_in_ptr[i]; + } + } + } + + /* append remaining samples */ + l_rem = l_frm - ( xtract[N] + l_seg ); + for ( i = 0; i < l_rem; i++ ) + { + frm_out[( N - 1 ) * l_seg + i] = frm_in[2 * l_frm - l_rem + i]; + } + + /* set output length */ + *l_frm_out = ( N - 1 ) * l_seg + l_rem; + + return 0; +} diff --git a/lib_dec/jbm_pcmdsp_apa.h b/lib_dec/jbm_pcmdsp_apa.h new file mode 100644 index 0000000000000000000000000000000000000000..74e6b59c6b6c06940d47a3a105ab91bcb792aac5 --- /dev/null +++ b/lib_dec/jbm_pcmdsp_apa.h @@ -0,0 +1,133 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +/*! @file jbm_pcmdsp_apa.h Adaptive Playout for Audio (apa). */ + +#ifndef JBM_PCMDSP_APA_H +#define JBM_PCMDSP_APA_H JBM_PCMDSP_APA_H + +#include +#include +#include "options.h" + +/* +******************************************************************************** +* DEFINITION OF CONSTANTS +******************************************************************************** +*/ + +/* size of IO buffers (a_in[], a_out[]) for apa_exec() */ +#define APA_BUF_PER_CHANNEL ( 960 * 3 ) +#define APA_MAX_NUM_CHANNELS 16 +#define APA_BUF ( APA_BUF_PER_CHANNEL * APA_MAX_NUM_CHANNELS ) + +/* min/max sampling rate [Hz] */ +#define APA_MIN_RATE 1000 +#define APA_MAX_RATE 48000 + +/* min/max scaling [%] */ +#define APA_MIN_SCALE 50 +#define APA_MAX_SCALE 150 + +#define APA_SM_SURROUND 1 +#define APA_SM_LOGARITHMIC 2 +#define APA_SM_FULLSUBSAMPLED 3 + +#define APA_SIM_CCF 11 +#define APA_SIM_NCCF 12 +#define APA_SIM_AMDF 13 +#define APA_SIM_SSE 14 + +/* +******************************************************************************** +* DEFINITION OF DATA TYPES +******************************************************************************** +*/ + +struct apa_state_t; +typedef struct apa_state_t apa_state_t; +/*! handle for APA */ +typedef struct apa_state_t *PCMDSP_APA_HANDLE; + + +/* +******************************************************************************** +* DECLARATION OF PROTOTYPES +******************************************************************************** +*/ + +/*! Allocates memory for state struct and initializes elements. + * @return 0 on success, 1 on failure */ +ivas_error apa_init( apa_state_t **s, + const int32_t num_channels ); + +/*! Sets state variables to initial value. */ +void apa_reset( apa_state_t *s ); + +/*! Sets the audio configuration. + * Must be called once before processing can start. + * If called again during processing it will reset the state struct! + * Typical sample rates: 8000, 16000, 22050, 44100. Must be in range [APA_MIN_RATE,APA_MAX_RATE]. + * Will also set a number of other state variables that depend on the sampling rate. + * @param[in,out] ps state + * @param[in] output_Fs sample rate [Hz] + * @param[in] num_channels number of channels + * @return 0 on success, 1 on failure */ +bool apa_set_rate( apa_state_t *ps, const int32_t output_Fs ); + +/*! Set scaling. + * The scale is given in % and will be valid until changed again. + * Must be in range [APA_MIN_SCALE,APA_MAX_SCALE]. + * @return 0 on success, 1 on failure */ +bool apa_set_scale( apa_state_t *s, uint16_t scale ); + +bool apa_set_renderer_granularity( apa_state_t *ps, uint16_t l_ts ); + +bool apa_set_renderer_residual_samples( apa_state_t *ps, uint16_t l_r_buf ); + +bool apa_set_evs_compat_mode( apa_state_t *ps, bool mode ); + +uint8_t apa_reconfigure( apa_state_t *ps, uint16_t num_channels, uint16_t l_ts ); + +bool apa_set_complexity_options( apa_state_t *s, uint16_t wss, uint16_t css ); + +bool apa_set_quality( apa_state_t *s, float quality, uint16_t qualityred, uint16_t qualityrise ); + +bool apa_exit( apa_state_t **s ); + +uint8_t apa_exec( apa_state_t *s, const float a_in[], uint16_t l_in, uint16_t maxScaling, float a_out[], uint16_t *l_out ); + +#endif /* JBM_PCMDSP_APA_H */ diff --git a/lib_dec/jbm_pcmdsp_fifo.c b/lib_dec/jbm_pcmdsp_fifo.c new file mode 100644 index 0000000000000000000000000000000000000000..7fa6a9f95338e26e4de98824489cf1a3b4464a05 --- /dev/null +++ b/lib_dec/jbm_pcmdsp_fifo.c @@ -0,0 +1,40 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +/*! @file jbm_pcmdsp_fifo.c Ringbuffer (FIFO) with fixed capacity for audio samples */ + +#include +#include "options.h" diff --git a/lib_dec/jbm_pcmdsp_fifo.h b/lib_dec/jbm_pcmdsp_fifo.h new file mode 100644 index 0000000000000000000000000000000000000000..25591ac83eae9bfa5c8dfbcd3d9676f38b0c62e4 --- /dev/null +++ b/lib_dec/jbm_pcmdsp_fifo.h @@ -0,0 +1,44 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +/*! @file jbm_pcmdsp_fifo.h Ringbuffer (FIFO) with fixed capacity for audio samples. */ + +#ifndef JBM_PCMDSP_FIFO_H +#define JBM_PCMDSP_FIFO_H JBM_PCMDSP_FIFO_H + +#include +#include "options.h" +#endif /* JBM_PCMDSP_FIFO_H */ diff --git a/lib_dec/jbm_pcmdsp_similarityestimation.c b/lib_dec/jbm_pcmdsp_similarityestimation.c new file mode 100644 index 0000000000000000000000000000000000000000..13b3a3190ea3f84750d4f82a217408b6894a1bc7 --- /dev/null +++ b/lib_dec/jbm_pcmdsp_similarityestimation.c @@ -0,0 +1,155 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +/*! @file jbm_pcmdsp_similarityestimation.c Algorithms for correlation and similarity estimation. */ + +/* system headers */ +#include +#include +#include +#include "options.h" +#include "wmc_auto.h" + +/* local headers */ +#include "jbm_pcmdsp_similarityestimation.h" + + +/* Calculates cross correlation coefficient for template segment. */ +float cross_correlation_self( + const float *signal, + uint16_t x, + uint16_t y, + uint16_t corr_len ) +{ + float c_c; + int16_t j; + + c_c = 0.0f; + for ( j = 0; j < corr_len; j++ ) + { + c_c += ( signal[j + x] * signal[j + y] ); + } + + return c_c; +} + +/* Calculates cross correlation coefficient for template segment. */ +float cross_correlation_subsampled_self( + const float *signal, + uint16_t x, + uint16_t y, + uint16_t corr_len, + uint16_t subsampling ) +{ + float c_c; + int16_t j; + + c_c = 0.0f; + for ( j = 0; j < corr_len; j += subsampling ) + { + c_c += ( signal[j + x] * signal[j + y] ); + } + + return c_c; +} + + +/* Calculates normalized cross correlation coefficient for template segment. */ +float normalized_cross_correlation_self( + const float *signal, + uint16_t x, + uint16_t y, + uint16_t corr_len, + uint16_t subsampling, + float *energy ) +{ + float c_c; + float energy_xy, energy_x, energy_y; + uint16_t j; + const float *signal_a, *signal_b; + + c_c = 0.0f; + energy_x = 0.0f; + energy_y = 0.0f; + signal_a = &signal[x]; + signal_b = &signal[y]; + for ( j = 0; j < corr_len; j += subsampling ) + { + c_c += ( signal_a[j] * signal_b[j] ); + energy_x += ( signal_a[j] ) * ( signal_a[j] ); + energy_y += ( signal_b[j] ) * ( signal_b[j] ); + } + energy_xy = sqrtf( energy_x * energy_y ); + if ( energy_xy < 1.0f ) + { + energy_xy = 1.0f; /* conceal silent frames */ + } + + c_c = c_c / energy_xy; + *energy = energy_xy; + + return c_c; +} + + +/* Splits the signal into segments and checks if all of them have very low energy. */ +bool isSilence( + const float *signal, + uint32_t len, + uint32_t segments ) +{ + uint32_t i, samplesPerSegment; + float energy; + + energy = 0; + samplesPerSegment = len / segments; + for ( i = 0; i < len; i++ ) + { + energy += ( signal[i] / 32768.f ) * ( signal[i] / 32768.f ); + if ( ( i != 0U && i % samplesPerSegment == 0U ) || i + 1 == len ) + { + /* check energy of current segment */ + energy = 10 * log10f( energy / (float) samplesPerSegment ); + if ( energy > -65 ) + { + return false; + } + energy = 0; + } + } + + return true; +} diff --git a/lib_dec/jbm_pcmdsp_similarityestimation.h b/lib_dec/jbm_pcmdsp_similarityestimation.h new file mode 100644 index 0000000000000000000000000000000000000000..c944bc1f7be47a64780ec0f1eb8cc0e5527e0659 --- /dev/null +++ b/lib_dec/jbm_pcmdsp_similarityestimation.h @@ -0,0 +1,158 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +/*! @file jbm_pcmdsp_similarityestimation.h Algorithms for correlation and similarity estimation. */ + +#ifndef JBM_PCMDSP_SIMILARITYESTIMATION_H +#define JBM_PCMDSP_SIMILARITYESTIMATION_H JBM_PCMDSP_SIMILARITYESTIMATION_H + +#include "options.h" +#include "typedef.h" + +/* +******************************************************************************** +* +* Function : cross_correlation_self +* Tables : +* Compile Defines : +* Return : (float) cross correlation coefficient +* Information : Calculate cross correlation coefficient for template +* segment. +* The returned value is signal-energy dependant. +* +* Used formula: +* +* corr_len-1 +* ---- +* \ +* / (j+x)*(j+y) +* ---- +* j=0 +* +* +* 23-JUL-04 S.Doehla initial version +* +******************************************************************************** +*/ +float cross_correlation_self( + const float *signal, + uint16_t x, + uint16_t y, + uint16_t corr_len ); + +/* +******************************************************************************** +* +* Function : cross_correlation_subsampled_self +* Tables : +* Compile Defines : +* Return : (float) cross correlation coefficient +* Information : Calculate cross correlation coefficient for template +* segment. +* The returned value is signal-energy dependant. +* +* Used formula: +* +* corr_len-1 +* ---- +* \ +* / (j+x)*(j+y) +* ---- +* j=0 +* +* +* 23-JUL-04 S.Doehla initial version +* +******************************************************************************** +*/ +float cross_correlation_subsampled_self( + const float *signal, + uint16_t x, + uint16_t y, + uint16_t corr_len, + uint16_t subsampling ); + +/* +******************************************************************************** +* +* Function : normalized_cross_correlation_self +* Tables : +* Compile Defines : +* Return : (float) normalized cross correlation coefficient +* Information : Calculate normalized cross correlation coefficient +* for template segment. +* The returned value is signal-energy independant. +* This means, no matter how loud your signal is, equal +* signals will return 1.0, cross-phased signals -1.0. +* +* Complexity is very high due to many floating point +* operations and using squared root! +* +* This function fills parameter energy with the common +* energy of signal x and signal y. This might be useful +* for silence detection. +* +* Used formula: +* +* corr_len-1 +* ---- +* \ (j+x)*(j+y) +* \ __________________ +* / -------------- +* / -/ (j+x)�+(j+y)� +* ---- +* j=0 +* +* +* 23-JUL-04 S.Doehla initial version +* +******************************************************************************** +*/ +float normalized_cross_correlation_self( + const float *signal, + uint16_t x, + uint16_t y, + uint16_t corr_len, + uint16_t subsampling, + float *energy ); + +/* Splits the signal into segments and checks if all of them have very low energy. */ +bool isSilence( + const float *signal, + uint32_t len, + uint32_t segments ); + +#endif /* JBM_PCMDSP_SIMILARITYESTIMATION_H */ diff --git a/lib_dec/jbm_pcmdsp_window.c b/lib_dec/jbm_pcmdsp_window.c new file mode 100644 index 0000000000000000000000000000000000000000..942f25db6ff9d90d642df287d03fc0b07ac2f5a0 --- /dev/null +++ b/lib_dec/jbm_pcmdsp_window.c @@ -0,0 +1,156 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include +#include "options.h" +#include "jbm_pcmdsp_window.h" +#include "cnst.h" +#include "wmc_auto.h" + +/*-----------------------------------------------------------------------* + * hannWindow() + * + * Generates a Hann window (cos-shaped) of length n + *-----------------------------------------------------------------------*/ + +void hannWindow( + uint16_t n, + float *w ) +{ + uint16_t i; + float arg; + + for ( i = 0; i < n / 2; i++ ) + { + arg = ( ( 2.0f * EVS_PI ) * i ) / (float) ( n ); + w[i] = (float) ( ( 1.0f - cos( arg ) ) / 2.0f ); + } + + for ( ; i < n; i++ ) + { + w[i] = 1.0f - w[i - n / 2]; + } + + return; +} + + +/*-----------------------------------------------------------------------* + * overlapAdd() + * + * Overlap/Add of two signal with a given window + *-----------------------------------------------------------------------*/ + +void overlapAdd( + const float *fadeOut, + const float *fadeIn, + float *out, + uint16_t n, + uint16_t nChannels, + const float *fadeOutWin, + const float *fadeInWin ) +{ + float fdOutVal, fdInVal; + int16_t i, j, hannIter; + float combinedVal; + + for ( j = 0; j < nChannels; j++ ) + { + /* reset Hann window iterator to beginning (both channels use same window) */ + hannIter = 0; + for ( i = j; i < n; i += nChannels ) + { + fdOutVal = fadeOut[i] * fadeOutWin[hannIter]; + fdInVal = fadeIn[i] * fadeInWin[hannIter]; + /* round combinedVal value (taking care of sign) */ + combinedVal = fdInVal + fdOutVal; + out[i] = combinedVal; + hannIter++; + } + } + + return; +} + +void overlapAddEvs( + const float *fadeOut, + const float *fadeIn, + float *out, + uint16_t n, + uint16_t nChannels, + const float *fadeOutWin, + const float *fadeInWin ) +{ + float fdOutVal, fdInVal; + int16_t i, j, hannIter; + float combinedVal; + + for ( j = 0; j < nChannels; j++ ) + { + /* reset Hann window iterator to beginning (both channels use same window) */ + hannIter = 0; + for ( i = j; i < n; i += nChannels ) + { + fdOutVal = fadeOut[i] * fadeOutWin[hannIter]; + fdInVal = fadeIn[i] * fadeInWin[hannIter]; + /* round combinedVal value (taking care of sign) */ + + combinedVal = floorf( ( fdInVal + fdOutVal ) + 0.5f ); + if ( fdInVal + fdOutVal < 0.0 ) + { + combinedVal = ceilf( ( fdInVal + fdOutVal ) - 0.5f ); + } + + /* saturate value */ + if ( combinedVal > MAX16B_FLT ) + { + combinedVal = MAX16B_FLT; + } + else if ( combinedVal < MIN16B_FLT ) + { + combinedVal = MIN16B_FLT; + } + + out[i] = combinedVal; + + hannIter++; + } + } + + return; +} diff --git a/lib_dec/jbm_pcmdsp_window.h b/lib_dec/jbm_pcmdsp_window.h new file mode 100644 index 0000000000000000000000000000000000000000..b11decf11df74c99f9b411a2ad240938f94958f4 --- /dev/null +++ b/lib_dec/jbm_pcmdsp_window.h @@ -0,0 +1,66 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +/*! @file jbm_jbm_pcmdsp_window.h Window functions. */ + +#ifndef JBM_PCMDSP_WINDOW_H +#define JBM_PCMDSP_WINDOW_H JBM_PCMDSP_WINDOW_H + +#include +#include "options.h" + +/*! Generates a Hann window (cos-shaped) of length n. + * Roughly: + * + * 1 __ + * / \ + * 0 _/ \_ + * <------> + * n + */ +void hannWindow( uint16_t n, float *w ); + +/** Overlap/Add of two signal with a given window. */ +/** @param[in] fadeOut signal to fade out + * @param[in] fadeIn signal to fade in + * @param[in] out buffer to store the output signal + * @param[in] n number of samples + * @param[in] nChannels number of channels + * @param[in] fadeOutWin window for fade out + * @param[in] fadeInWin window for fade in */ +void overlapAdd( const float *fadeOut, const float *fadeIn, float *out, uint16_t n, uint16_t nChannels, const float *fadeOutWin, const float *fadeInWin ); +void overlapAddEvs( const float *fadeOut, const float *fadeIn, float *out, uint16_t n, uint16_t nChannels, const float *fadeOutWin, const float *fadeInWin ); +#endif /* JBM_PCMDSP_WINDOW_H */ diff --git a/lib_dec/lead_deindexing.c b/lib_dec/lead_deindexing.c new file mode 100644 index 0000000000000000000000000000000000000000..0b3c68d10866e89ff3825e2e395ffa3f0ecd84a7 --- /dev/null +++ b/lib_dec/lead_deindexing.c @@ -0,0 +1,280 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "prot.h" +#include "rom_com.h" +#include "rom_dec.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * Local function prototypes + *-------------------------------------------------------------------*/ + +static void fcb_decode_pos( const int16_t index, int16_t pos_vector[], const int16_t pulse_num, const int16_t pos_num ); + + +/*-------------------------------------------------------------------* + * re8_decode_base_index + * + * Decode RE8 base index + *-------------------------------------------------------------------*/ + +void re8_decode_base_index( + const int16_t n, /* i : codebook number (*n is an integer defined in {0,2,3,4,..,n_max}) */ + uint16_t I, /* i : index of c (pointer to unsigned 16-bit word) */ + int16_t *x /* o : point in RE8 (8-dimensional integer vector) */ +) +{ + int16_t i, j, k1, l, m, m1, m2; + int16_t setor_8p_temp[8], setor_8p_temp_1[8], setor_8p_temp_2[8]; + int16_t sign_8p; + int16_t code_level; + const int16_t *a1, *a2; + int16_t ka; + uint16_t offset; + int16_t code_index; + int16_t element_a10, element_a11, element_a12; + + set_s( setor_8p_temp_2, 0, 8 ); + + element_a11 = 0, + element_a12 = 0; + if ( n < 2 ) + { + for ( i = 0; i < 8; i++ ) + { + x[i] = 0; + } + } + else + { + if ( I > 65519L ) + { + I = 0; + } + /*-------------------------------------------------------------------* + * search for the identifier ka of the absolute leader (table-lookup) + * Q2 is a subset of Q3 - the two cases are considered in the same branch + *-------------------------------------------------------------------*/ + if ( n <= 3 ) + { + for ( i = 1; i < NB_LDQ3; i++ ) + { + if ( I < (int32_t) II3[i] ) + { + break; + } + } + ka = AA3[i - 1]; + } + else + { + for ( i = 1; i < NB_LDQ4; i++ ) + { + if ( I < (int32_t) II4[i] ) + { + break; + } + } + ka = AA4[i - 1]; + } + + /*-------------------------------------------------------* + * decode + *-------------------------------------------------------*/ + + a1 = vals_a[ka]; + a2 = vals_q[ka]; + k1 = a2[0]; + code_level = a2[1]; + + offset = Is[ka]; + code_index = I - offset; + + sign_8p = code_index & ( ( 1 << k1 ) - 1 ); + + code_index = code_index >> k1; + + m = 0; + m1 = 0; + m2 = 0; + + element_a10 = a1[0]; + switch ( code_level ) + { + case 4: + + m2 = 1; /*a2[4];*/ + i = code_index & 1; + if ( i == 0 ) + setor_8p_temp_2[0] = 0; + else + setor_8p_temp_2[0] = 1; + code_index = code_index >> 1; + /* FALLTHRU */ + case 3: + + m = a2[2]; + m1 = a2[3]; + l = select_table22[m1][m]; + j = ( code_index * mult_avq_tab[l] ) >> shift_avq_tab[l]; + code_index = code_index - j * l; + fcb_decode_pos( code_index, setor_8p_temp_1, m, m1 ); + code_index = j; + element_a12 = a1[2]; + /* FALLTHRU */ + case 2: + + m = a2[2]; + fcb_decode_pos( code_index, setor_8p_temp, 8, m ); + element_a11 = a1[1]; + } + + for ( i = 0; i < 8; i++ ) + { + x[i] = element_a10; + } + + for ( i = 0; i < m; i++ ) + { + x[setor_8p_temp[i]] = element_a11; + } + + for ( i = 0; i < m1; i++ ) + { + x[setor_8p_temp[setor_8p_temp_1[i]]] = element_a12; + } + + for ( i = 0; i < m2; i++ ) + { + x[setor_8p_temp[setor_8p_temp_1[setor_8p_temp_2[0]]]] = 6; + } + + /*--------------------------------------------------------------------* + * add the sign of all elemnt ( except the last one in some case ) + *--------------------------------------------------------------------*/ + m1 = k1 - 1; + m2 = 8; + l = 1; + for ( i = 0; i < 8; i++ ) + { + l *= x[i]; + } + /* if the signs are constrained and all components are non-zero */ + if ( ( k1 == 7 ) && ( l > 0 ) ) + { + m2 = 7; + } + for ( i = 0; i < m2; i++ ) + { + if ( x[i] != 0 ) + { + if ( ( sign_8p >> m1 ) & 1 ) + { + x[i] *= -1; + } + m1--; + } + } + + /*--------------------------------------------------------------------* + * recover the sign of last element if needed + *--------------------------------------------------------------------*/ + if ( k1 == 7 ) + { + m1 = 0; + + for ( i = 0; i < 8; i++ ) + { + m1 += x[i]; + } + if ( m1 & 3 ) + { + x[7] *= -1; + } + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * fcb_decode_pos + * + * base function for decoding position index + *-------------------------------------------------------------------*/ + +static void fcb_decode_pos( + const int16_t index, /* i : Index to decoder */ + int16_t pos_vector[], /* o : Position vector */ + const int16_t pulse_num, /* i : Number of pulses */ + const int16_t pos_num /* i : Number of positions */ +) +{ + int16_t i, k, l; + int16_t temp1, temp2; + const int16_t *select_table23, *select_table24; + + k = index; + l = 0; + temp1 = pos_num; + temp2 = pulse_num + 1; + + for ( i = 0; i < pos_num - 1; i++ ) + { + select_table23 = select_table22[temp1]; + select_table24 = &select_table23[pulse_num - l]; + + k = *select_table24 - k; + + while ( k <= ( *select_table24-- ) ) + { + l++; + } + k = select_table23[temp2 - l] - k; + + pos_vector[i] = l - 1; + temp1--; + } + + pos_vector[i] = l + k; + + return; +} diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..5cc036b1895271d656d963f7a64e2662bca324d7 --- /dev/null +++ b/lib_dec/lib_dec.c @@ -0,0 +1,2898 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include "lib_dec.h" +#include "ivas_cnst.h" +#include "ivas_prot.h" +#include "ivas_prot_rend.h" +#include "prot.h" +#include "jbm_jb4sb.h" +#include "jbm_pcmdsp_apa.h" +#include "jbm_pcmdsp_fifo.h" +#include +#include +#include +#include "wmc_auto.h" + +/*---------------------------------------------------------------------* + * Local structs + *---------------------------------------------------------------------*/ + +struct IVAS_DEC_VOIP +{ + uint16_t nSamplesFrame; /* Total number of samples in a frame (includes number of channels) */ + JB4_HANDLE hJBM; + uint16_t lastDecodedWasActive; + JB4_DATAUNIT_HANDLE hCurrentDataUnit; /* Points to the currently processed data unit */ + uint16_t *bs_conversion_buf; /* Buffer for bitstream conversion from packed to serial */ +#ifdef SUPPORT_JBM_TRACEFILE + IVAS_JBM_TRACE_DATA JbmTraceData; +#endif +}; + +typedef struct IVAS_DEC_VOIP IVAS_DEC_VOIP; + +struct IVAS_DEC +{ + IVAS_DEC_MODE mode; + uint16_t nSamplesFrame; + Decoder_Struct *st_ivas; + IVAS_DEC_VOIP *hVoIP; + bool hasBeenFedFirstGoodFrame; /* False on init. Gets set to true after first good frame has been fed into the decoder, but not decoded yet. */ + bool hasDecodedFirstGoodFrame; /* False on init. Gets set to true after first good frame has been decoded -> all bitstream information is known from that point on */ + bool isInitialized; + + int16_t bitstreamformat; /* Bitstream format flag (G.192/MIME/VOIP_G192_RTP/VOIP_RTPDUMP) */ + bool Opt_VOIP; /* flag indicating VOIP mode with JBM */ + int16_t tsm_scale; /* scale for TSM operation */ + int16_t tsm_max_scaling; + float *apaExecBuffer; /* Buffer for APA scaling */ + PCMDSP_APA_HANDLE hTimeScaler; + bool needNewFrame; + bool hasBeenFedFrame; + uint16_t nSamplesAvailableNext; + int16_t nSamplesRendered; + int16_t nTransportChannelsOld; + int16_t amrwb_rfc4867_flag; /* MIME from rfc4867 is used */ + int16_t sdp_hf_only; /* RTP payload format parameter: only Header-Full format without zero padding for size collision avoidance */ + int16_t prev_ft_speech; /* RXDTX handler: previous frametype flag for G.192 format AMRWB SID_FIRST detection */ + int16_t CNG; /* RXDTX handler: CNG=1, nonCNG=0 */ +}; + + +/*---------------------------------------------------------------------* + * Local function declarations + *---------------------------------------------------------------------*/ + +static void IVAS_DEC_Close_VoIP( IVAS_DEC_VOIP *hVoIP ); +#ifdef SUPPORT_JBM_TRACEFILE +static void store_JbmData( IVAS_DEC_VOIP *hVoIP, JB4_DATAUNIT_HANDLE dataUnit, const uint32_t systemTimestamp_ms, const uint16_t extBufferedSamples, const int32_t output_Fs ); +#endif +static ivas_error evs_dec_main( Decoder_Struct *st_ivas, const int16_t nOutSamples, float *floatBuf, int16_t *pcmBuf ); +static ivas_error input_format_API_to_internal( IVAS_DEC_INPUT_FORMAT input_format, int16_t *bitstream_format_internal, int16_t *sdp_hf_only, const bool is_voip_enabled ); +static void init_decoder_config( DECODER_CONFIG_HANDLE hDecoderConfig ); +static int16_t IVAS_DEC_VoIP_GetRenderGranularity( Decoder_Struct *st_ivas ); +static ivas_error IVAS_DEC_VoIP_reconfigure( IVAS_DEC_HANDLE hIvasDec, const uint16_t nTransportChannels, const uint16_t l_ts ); +static ivas_error IVAS_DEC_Setup( IVAS_DEC_HANDLE hIvasDec, uint16_t *nTcBufferGranularity, uint8_t *nTransportChannels, uint8_t *nOutChannels, uint16_t *nSamplesRendered, int16_t *data ); +static ivas_error IVAS_DEC_GetTcSamples( IVAS_DEC_HANDLE hIvasDec, float *pcmBuf, int16_t *nOutSamples ); +static ivas_error IVAS_DEC_RendererFeedTcSamples( IVAS_DEC_HANDLE hIvasDec, const int16_t nSamplesForRendering, int16_t *nSamplesResidual, float *pcmBuf ); +static ivas_error IVAS_DEC_GetRenderedSamples( IVAS_DEC_HANDLE hIvasDec, const uint16_t nSamplesForRendering, uint16_t *nSamplesRendered, uint16_t *nSamplesAvailableNext, int16_t *pcmBuf ); +static ivas_error IVAS_DEC_GetBufferedNumberOfSamples( IVAS_DEC_HANDLE hIvasDec, int16_t *nSamplesBuffered ); + + +/*---------------------------------------------------------------------* + * IVAS_DEC_Open() + * + * Open IVAS decoder + *---------------------------------------------------------------------*/ + +/* may return an error but may still have allocated memory - thus run Close also in case of error to release memory */ +ivas_error IVAS_DEC_Open( + IVAS_DEC_HANDLE *phIvasDec, /* i/o: pointer to an IVAS decoder handle to be opened */ + const IVAS_DEC_MODE mode /* i : compatibility mode (EVS or IVAS) */ +) +{ + IVAS_DEC_HANDLE hIvasDec; + Decoder_Struct *st_ivas; + + if ( phIvasDec == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + /*-----------------------------------------------------------------* + * Allocate and initialize IVAS application decoder handle + *-----------------------------------------------------------------*/ + + if ( ( *phIvasDec = (IVAS_DEC_HANDLE) malloc( sizeof( struct IVAS_DEC ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for IVAS decoder handle" ); + } + hIvasDec = *phIvasDec; + hIvasDec->hVoIP = NULL; + hIvasDec->apaExecBuffer = NULL; + hIvasDec->hTimeScaler = NULL; + hIvasDec->tsm_scale = 100; + hIvasDec->needNewFrame = false; + hIvasDec->nTransportChannelsOld = 0; + hIvasDec->nSamplesAvailableNext = 0; + hIvasDec->nSamplesRendered = 0; + hIvasDec->nSamplesFrame = 0; + hIvasDec->hasBeenFedFrame = false; + hIvasDec->hasBeenFedFirstGoodFrame = false; + hIvasDec->hasDecodedFirstGoodFrame = false; + hIvasDec->isInitialized = false; + + hIvasDec->mode = mode; + + hIvasDec->bitstreamformat = G192; + hIvasDec->Opt_VOIP = 0; + hIvasDec->amrwb_rfc4867_flag = -1; + hIvasDec->prev_ft_speech = 1; /* RXDTX handler previous frametype flag for G.192 format AMRWB SID_FIRST detection */ + hIvasDec->CNG = 0; /* RXDTX handler CNG = 1, no CNG = 0*/ + + /*-----------------------------------------------------------------* + * Initialize IVAS-codec decoder state + *-----------------------------------------------------------------*/ + + if ( ( hIvasDec->st_ivas = (Decoder_Struct *) malloc( sizeof( Decoder_Struct ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for IVAS decoder structure" ); + } + + if ( ( hIvasDec->st_ivas->hDecoderConfig = (DECODER_CONFIG_HANDLE) malloc( sizeof( DECODER_CONFIG ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for Decoder config structure" ); + } + + /*-----------------------------------------------------------------* + * Initialize IVAS-codec decoder state + *-----------------------------------------------------------------*/ + + st_ivas = hIvasDec->st_ivas; + + /* initialize Decoder Config. handle */ + init_decoder_config( hIvasDec->st_ivas->hDecoderConfig ); + + /* initialize pointers to handles to NULL */ + ivas_initialize_handles_dec( st_ivas ); + + /* set high-level parameters */ + if ( mode == IVAS_DEC_MODE_EVS ) + { + st_ivas->codec_mode = 0; /* unknown before first frame */ + st_ivas->element_mode_init = EVS_MONO; + st_ivas->ivas_format = MONO_FORMAT; + st_ivas->transport_config = IVAS_AUDIO_CONFIG_INVALID; + st_ivas->intern_config = IVAS_AUDIO_CONFIG_INVALID; + st_ivas->writeFECoffset = 0; + + return IVAS_ERR_OK; + } + else if ( mode == IVAS_DEC_MODE_IVAS ) + { + st_ivas->codec_mode = 0; /* unknown before first frame */ + st_ivas->element_mode_init = -1; + st_ivas->ivas_format = UNDEFINED_FORMAT; + st_ivas->transport_config = IVAS_AUDIO_CONFIG_INVALID; + st_ivas->intern_config = IVAS_AUDIO_CONFIG_INVALID; + st_ivas->renderer_type = RENDERER_DISABLE; + st_ivas->ini_frame = 0; + st_ivas->ini_active_frame = 0; + st_ivas->writeFECoffset = 0; + + st_ivas->ism_mode = ISM_MODE_NONE; + st_ivas->mc_mode = MC_MODE_NONE; + + st_ivas->sba_order = 0; + st_ivas->sba_planar = 0; + st_ivas->sba_analysis_order = 0; + + return IVAS_ERR_OK; + } + + return IVAS_ERR_WRONG_PARAMS; +} + + +/*---------------------------------------------------------------------* + * init_decoder_config() + * + * Initialize Decoder Config. handle + *---------------------------------------------------------------------*/ + +static void init_decoder_config( + DECODER_CONFIG_HANDLE hDecoderConfig /* i/o: configuration structure */ +) +{ + hDecoderConfig->Opt_AMR_WB = 0; + hDecoderConfig->nchan_out = 1; + hDecoderConfig->output_config = IVAS_AUDIO_CONFIG_INVALID; + hDecoderConfig->Opt_LsCustom = 0; + hDecoderConfig->Opt_HRTF_binary = 0; + hDecoderConfig->Opt_Headrotation = 0; + hDecoderConfig->Opt_RendConfigCustom = 0; + hDecoderConfig->orientation_tracking = IVAS_HEAD_ORIENT_TRK_NONE; + hDecoderConfig->Opt_non_diegetic_pan = 0; + hDecoderConfig->non_diegetic_pan_gain = 0; + hDecoderConfig->Opt_tsm = 0; + hDecoderConfig->Opt_5ms = 0; + hDecoderConfig->Opt_delay_comp = 0; + hDecoderConfig->Opt_ExternalOrientation = 0; + hDecoderConfig->Opt_dpid_on = 0; + hDecoderConfig->Opt_aeid_on = 0; + + return; +} + + +/*---------------------------------------------------------------------* + * IVAS_DEC_Close( ) + * + * + *---------------------------------------------------------------------*/ + +void IVAS_DEC_Close( + IVAS_DEC_HANDLE *phIvasDec /* i/o: pointer to IVAS decoder handle */ +) +{ + /* Free all memory */ + if ( phIvasDec == NULL || *phIvasDec == NULL ) + { + return; + } + + if ( ( *phIvasDec )->hVoIP ) + { + IVAS_DEC_Close_VoIP( ( *phIvasDec )->hVoIP ); + ( *phIvasDec )->hVoIP = NULL; + } + + if ( ( *phIvasDec )->st_ivas ) + { + ivas_destroy_dec( ( *phIvasDec )->st_ivas ); + ( *phIvasDec )->st_ivas = NULL; + } + + apa_exit( &( *phIvasDec )->hTimeScaler ); + + if ( ( *phIvasDec )->apaExecBuffer != NULL ) + { + free( ( *phIvasDec )->apaExecBuffer ); + } + free( *phIvasDec ); + *phIvasDec = NULL; + phIvasDec = NULL; + + return; +} + + +/*---------------------------------------------------------------------* + * mapIvasFormat( ) + * + * + *---------------------------------------------------------------------*/ + +static IVAS_DEC_BS_FORMAT mapIvasFormat( + const IVAS_FORMAT ivas_format ) +{ + switch ( ivas_format ) + { + case MONO_FORMAT: + return IVAS_DEC_BS_MONO; + case STEREO_FORMAT: + return IVAS_DEC_BS_STEREO; + case ISM_FORMAT: + return IVAS_DEC_BS_OBJ; + case MC_FORMAT: + return IVAS_DEC_BS_MC; + case SBA_FORMAT: + return IVAS_DEC_BS_SBA; + case SBA_ISM_FORMAT: + return IVAS_DEC_BS_SBA_ISM; + case MASA_FORMAT: + return IVAS_DEC_BS_MASA; + case MASA_ISM_FORMAT: + return IVAS_DEC_BS_MASA_ISM; + default: + break; + } + + return IVAS_DEC_BS_UNKOWN; +} + + +/*---------------------------------------------------------------------* + * IVAS_DEC_Configure( ) + * + * Decoder configuration + * legacy code behavior: if no output format set, then it's EVS mono + *---------------------------------------------------------------------*/ + +ivas_error IVAS_DEC_Configure( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const uint32_t sampleRate, /* i : output sampling frequency */ + const AUDIO_CONFIG outputConfig, /* i : output configuration */ + const int16_t tsmEnabled, /* i : enable TSM */ + const int16_t enable5ms, /* i : enable 5ms rendering path */ + const int16_t customLsOutputEnabled, /* i : enable custom loudspeaker setup handle */ + const int16_t hrtfReaderEnabled, /* i : enable HRTF binary file input */ + const int16_t enableHeadRotation, /* i : enable head rotation for binaural output */ + const int16_t enableExternalOrientation, /* i : enable external orientations */ + const IVAS_HEAD_ORIENT_TRK_T orientation_tracking, /* i : head orientation tracking type */ + const int16_t renderConfigEnabled, /* i : enable Renderer config. file for binaural output */ + const int16_t Opt_non_diegetic_pan, /* i : diegetic or not */ + const float non_diegetic_pan_gain, /* i : non diegetic panning gain */ + const int16_t Opt_dpid_on, /* i : enable directivity pattern option */ + const uint16_t acousticEnvironmentId, /* i : Acoustic environment ID */ + const int16_t delayCompensationEnabled /* i : enable delay compensation */ +) +{ + Decoder_Struct *st_ivas; + DECODER_CONFIG_HANDLE hDecoderConfig; + ivas_error error; + + error = IVAS_ERR_OK; + if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + if ( sampleRate != 8000 && sampleRate != 16000 && sampleRate != 32000 && sampleRate != 48000 ) + { + return IVAS_ERR_WRONG_PARAMS; + } + + if ( hIvasDec->mode == IVAS_DEC_MODE_EVS && !( ( outputConfig == IVAS_AUDIO_CONFIG_MONO && Opt_non_diegetic_pan == 0 ) || + ( outputConfig == IVAS_AUDIO_CONFIG_STEREO && Opt_non_diegetic_pan == 1 ) ) ) + { + return IVAS_ERR_WRONG_MODE; + } + + st_ivas = hIvasDec->st_ivas; + + hDecoderConfig = st_ivas->hDecoderConfig; + + hDecoderConfig->output_config = outputConfig; + if ( hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_INVALID ) + { + return IVAS_ERR_WRONG_PARAMS; + } + + hDecoderConfig->output_Fs = sampleRate; + + if ( hIvasDec->mode == IVAS_DEC_MODE_EVS ) + { + st_ivas->element_mode_init = EVS_MONO; + hDecoderConfig->nchan_out = 1; + } + + if ( outputConfig != IVAS_AUDIO_CONFIG_EXTERNAL && outputConfig != IVAS_AUDIO_CONFIG_LS_CUSTOM ) + { + hDecoderConfig->nchan_out = audioCfg2channels( hDecoderConfig->output_config ); + } + + hDecoderConfig->Opt_tsm = tsmEnabled; + hDecoderConfig->Opt_5ms = enable5ms; + hDecoderConfig->Opt_LsCustom = customLsOutputEnabled; + hDecoderConfig->Opt_Headrotation = enableHeadRotation; + hDecoderConfig->orientation_tracking = orientation_tracking; + hDecoderConfig->Opt_HRTF_binary = hrtfReaderEnabled; + hDecoderConfig->Opt_RendConfigCustom = renderConfigEnabled; + hDecoderConfig->Opt_non_diegetic_pan = Opt_non_diegetic_pan; + hDecoderConfig->non_diegetic_pan_gain = non_diegetic_pan_gain; + hDecoderConfig->Opt_delay_comp = delayCompensationEnabled; + hDecoderConfig->Opt_ExternalOrientation = enableExternalOrientation; + hDecoderConfig->Opt_dpid_on = Opt_dpid_on; + hDecoderConfig->Opt_aeid_on = acousticEnvironmentId != 65535 ? TRUE : FALSE; + + + /* Set decoder parameters to initial values */ + if ( ( error = ivas_init_decoder_front( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( hIvasDec->mode == IVAS_DEC_MODE_EVS ) + { + hIvasDec->st_ivas->ivas_format = MONO_FORMAT; + } + + hIvasDec->nSamplesFrame = (uint16_t) ( hDecoderConfig->output_Fs / FRAMES_PER_SEC ); + hIvasDec->nSamplesAvailableNext = 0; + hIvasDec->nSamplesRendered = 0; + hIvasDec->tsm_scale = 100; + hIvasDec->tsm_max_scaling = 100; + + return error; +} + + + +/*---------------------------------------------------------------------* + * IVAS_DEC_Set5msFlag( ) + * + * Get the 5ms flag + *---------------------------------------------------------------------*/ + +ivas_error IVAS_DEC_Set5msFlag( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const int16_t enable5ms /* i : 5ms flag */ +) +{ + if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL || hIvasDec->st_ivas->hDecoderConfig == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + hIvasDec->st_ivas->hDecoderConfig->Opt_5ms = enable5ms; + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * IVAS_DEC_Get5msFlag( ) + * + * Get the 5ms flag + *---------------------------------------------------------------------*/ + +ivas_error IVAS_DEC_Get5msFlag( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + int16_t *enable5ms /* o : 5ms flag */ +) +{ + if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL || enable5ms == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + *enable5ms = (int16_t) hIvasDec->st_ivas->hDecoderConfig->Opt_5ms; + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * IVAS_DEC_EnableVoIP( ) + * + * Intitialize JBM + * jbmSafetyMargin: allowed delay reserve in addition to network jitter + * to reduce late-loss, default: 60 [milliseconds] + *---------------------------------------------------------------------*/ + +ivas_error IVAS_DEC_EnableVoIP( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const int16_t jbmSafetyMargin, /* i : allowed delay reserve for JBM, in milliseconds */ + const IVAS_DEC_INPUT_FORMAT inputFormat /* i : format of the input bitstream */ +) +{ + DECODER_CONFIG_HANDLE hDecoderConfig; + ivas_error error; + + error = IVAS_ERR_OK; + + + if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + hDecoderConfig = hIvasDec->st_ivas->hDecoderConfig; + + hIvasDec->Opt_VOIP = 1; + hDecoderConfig->Opt_tsm = 1; + hDecoderConfig->Opt_5ms = 1; + + if ( hDecoderConfig->output_config != IVAS_AUDIO_CONFIG_EXTERNAL ) + { + hDecoderConfig->nchan_out = audioCfg2channels( hDecoderConfig->output_config ); + } + + if ( ( error = input_format_API_to_internal( inputFormat, &hIvasDec->bitstreamformat, &hIvasDec->sdp_hf_only, true ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( hIvasDec->hVoIP = malloc( sizeof( IVAS_DEC_VOIP ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate VoIP handle" ); + } + + hIvasDec->hVoIP->lastDecodedWasActive = 0; + hIvasDec->hVoIP->hCurrentDataUnit = NULL; + hIvasDec->hVoIP->nSamplesFrame = (uint16_t) ( hDecoderConfig->output_Fs / FRAMES_PER_SEC ); + +#define WMC_TOOL_SKIP + /* Bitstream conversion is not counted towards complexity and memory usage */ + hIvasDec->hVoIP->bs_conversion_buf = malloc( sizeof( uint16_t ) * ( MAX_BITS_PER_FRAME + 4 * 8 ) ); +#undef WMC_TOOL_SKIP + + if ( hIvasDec->hVoIP->bs_conversion_buf == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate VoIP handle" ); + } + + /* initialize JBM */ + if ( ( error = JB4_Create( &hIvasDec->hVoIP->hJBM ) != IVAS_ERR_OK ) != IVAS_ERR_OK ) + { + return error; + } + + if ( JB4_Init( hIvasDec->hVoIP->hJBM, jbmSafetyMargin ) != 0 ) + { + return IVAS_ERR_FAILED_ALLOC; + } + + return error; +} + + +/*---------------------------------------------------------------------* + * IVAS_DEC_FeedFrame_Serial( ) + * + * + *---------------------------------------------------------------------*/ + +ivas_error IVAS_DEC_FeedFrame_Serial( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + uint16_t *serial, /* i : buffer containing serial input bitstream. Each bit should be stored as a single uint16_t value */ + const uint16_t num_bits, /* i : number of bits in input bitstream */ + int16_t bfi /* i : bad frame indicator flag */ +) +{ + ivas_error error; + + if ( !hIvasDec->isInitialized ) + { + /* Once first frame is fed, finish initialization in EVS Mono. + * In IVAS mode, initialization is done in ivas_dec(). */ + if ( hIvasDec->mode == IVAS_DEC_MODE_EVS ) + { + if ( ( error = ivas_init_decoder( hIvasDec->st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( hIvasDec->hVoIP != NULL && hIvasDec->hVoIP->hCurrentDataUnit != NULL ) + { + DEC_CORE_HANDLE st = hIvasDec->st_ivas->hSCE[0]->hCoreCoder[0]; + st->ini_frame = 0; + st->prev_use_partial_copy = 0; + hIvasDec->st_ivas->hDecoderConfig->ivas_total_brate = hIvasDec->hVoIP->hCurrentDataUnit->dataSize * FRAMES_PER_SEC; + } + else + { + hIvasDec->st_ivas->hDecoderConfig->ivas_total_brate = ACELP_8k00; + } + hIvasDec->isInitialized = true; + } + } + + if ( !bfi ) /* TODO(mcjbm): Is this ok for bfi == 2 (partial frame)? Is there enough info to fully configure decoder? */ + { + hIvasDec->hasBeenFedFirstGoodFrame = true; + } + + /* Update redundant frame information in EVS (pre- read indices) */ + if ( hIvasDec->mode == IVAS_DEC_MODE_EVS && hIvasDec->hVoIP != NULL && hIvasDec->hVoIP->hCurrentDataUnit != NULL ) + { + DEC_CORE_HANDLE st = hIvasDec->st_ivas->hSCE[0]->hCoreCoder[0]; + st->bit_stream = serial; + + if ( hIvasDec->hVoIP->hCurrentDataUnit->partial_frame || st->prev_use_partial_copy ) + { + st->next_coder_type = hIvasDec->hVoIP->hCurrentDataUnit->nextCoderType; + } + else + { + st->next_coder_type = INACTIVE; + } + + if ( hIvasDec->hVoIP->hCurrentDataUnit->partial_frame == 1 && bfi != 1 ) + { + bfi = 2; + } + } + + if ( ( error = read_indices( hIvasDec->st_ivas, serial, num_bits, &hIvasDec->prev_ft_speech, &hIvasDec->CNG, bfi ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Update redundant frame information in EVS (post- read indices) */ + if ( hIvasDec->mode == IVAS_DEC_MODE_EVS && + hIvasDec->hVoIP != NULL && + hIvasDec->hVoIP->hCurrentDataUnit != NULL && + hIvasDec->hVoIP->hCurrentDataUnit->partial_frame != 0 ) + { + DEC_CORE_HANDLE st = hIvasDec->st_ivas->hSCE[0]->hCoreCoder[0]; + st->codec_mode = MODE2; + st->use_partial_copy = 1; + } + + hIvasDec->needNewFrame = false; + hIvasDec->hasBeenFedFrame = true; + hIvasDec->nSamplesRendered = 0; + hIvasDec->nSamplesAvailableNext = hIvasDec->nSamplesFrame; + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * IVAS_DEC_GetSamples( ) + * + * Main function to decode to PCM data + *---------------------------------------------------------------------*/ + +static ivas_error _GetSamples( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + int16_t *pcmBuf, /* i/o: buffer for decoded PCM output. The memory must already be allocated and be able to hold the expected number of output samples, based on frame size and number of output channels */ + int16_t *nOutSamples /* o : number of samples per channel written to output buffer */ +) +{ + Decoder_Struct *st_ivas; + ivas_error error; + + if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + st_ivas = hIvasDec->st_ivas; + + *nOutSamples = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); + + if ( hIvasDec->mode == IVAS_DEC_MODE_EVS ) + { + if ( ( error = evs_dec_main( st_ivas, *nOutSamples, NULL, pcmBuf ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( hIvasDec->mode == IVAS_DEC_MODE_IVAS ) + { + /* run the main IVAS decoding routine */ + + if ( ( error = ivas_dec( st_ivas, pcmBuf ) ) != IVAS_ERR_OK ) + { + return error; + } + + hIvasDec->isInitialized = true; /* Initialization done in ivas_dec() */ + } + + if ( hIvasDec->hasBeenFedFirstGoodFrame ) + { + hIvasDec->hasDecodedFirstGoodFrame = true; + } + + return IVAS_ERR_OK; +} + + +ivas_error IVAS_DEC_GetSamples( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const int16_t nSamplesAsked, /* i : number of samples wanted by the caller */ + int16_t *pcmBuf, /* i/o: buffer for decoded PCM output. The memory must already be allocated and be able to hold the expected number of output samples, based on frame size and number of output channels */ + int16_t *nOutSamples, /* o : number of samples per channel written to output buffer */ + bool *needNewFrame /* o :indication that the decoder needs a new frame */ +) +{ + ivas_error error; + int16_t nOutSamplesElse, result, nSamplesToRender; + uint16_t nSamplesRendered, nSamplesRendered_loop, l_ts, nTimeScalerOutSamples; + uint8_t nTransportChannels, nOutChannels; + + nSamplesRendered = 0; + nOutChannels = 0; + nSamplesRendered_loop = 0; + l_ts = 0; + nTransportChannels = 0; + + if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + if ( !hIvasDec->hasBeenFedFrame && hIvasDec->nSamplesAvailableNext == 0 ) + { + /* no frame was fed, do nothing but ask for a frame */ + *needNewFrame = true; + *nOutSamples = 0; + hIvasDec->needNewFrame = true; + return IVAS_ERR_OK; + } + + /* check if we are still at the beginning with bad frames, put out zeroes, keep track of subframes */ + if ( !hIvasDec->isInitialized && hIvasDec->st_ivas->bfi ) + { + hIvasDec->hasBeenFedFrame = false; + set_s( pcmBuf, 0, hIvasDec->st_ivas->hDecoderConfig->nchan_out * nSamplesAsked ); + hIvasDec->nSamplesRendered += nSamplesAsked; + *nOutSamples = nSamplesAsked; + hIvasDec->nSamplesAvailableNext -= nSamplesAsked; + if ( hIvasDec->nSamplesAvailableNext == 0 ) + { + hIvasDec->needNewFrame = true; + *needNewFrame = true; + } + } + + /* only for 1st step 5ms API, split rendering still needs to go through the old decoding function */ + else + { + /* check if we need to run the setup function */ + if ( !hIvasDec->isInitialized || hIvasDec->hasBeenFedFrame ) + { + /* setup */ + + if ( ( error = IVAS_DEC_Setup( hIvasDec, &l_ts, &nTransportChannels, &nOutChannels, &nSamplesRendered_loop, pcmBuf + nSamplesRendered * nOutChannels ) ) != IVAS_ERR_OK ) + + { + return error; + } + } + + if ( !hIvasDec->st_ivas->hDecoderConfig->Opt_5ms ) + { + if ( ( error = _GetSamples( hIvasDec, pcmBuf, nOutSamples ) ) != IVAS_ERR_OK ) + { + return error; + } + hIvasDec->nSamplesAvailableNext = 0; + hIvasDec->nSamplesRendered = *nOutSamples; + nSamplesRendered = *nOutSamples; + hIvasDec->needNewFrame = true; + hIvasDec->hasBeenFedFrame = false; + *needNewFrame = true; + } + else + { + /* check if we need to run the setup function, tc decoding and feeding the renderer */ + if ( !hIvasDec->isInitialized || hIvasDec->hasBeenFedFrame ) + { + int16_t nResidualSamples, nSamplesTcsScaled; + nSamplesRendered += nSamplesRendered_loop; + + if ( nTransportChannels != hIvasDec->nTransportChannelsOld ) + { + if ( ( error = IVAS_DEC_VoIP_reconfigure( hIvasDec, nTransportChannels, l_ts ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* decode TCs only */ + if ( ( error = IVAS_DEC_GetTcSamples( hIvasDec, hIvasDec->apaExecBuffer, &nOutSamplesElse ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( hIvasDec->st_ivas->hDecoderConfig->Opt_tsm ) + { + if ( apa_set_scale( hIvasDec->hTimeScaler, hIvasDec->tsm_scale ) != 0 ) + { + return IVAS_ERR_UNKNOWN; + } + result = apa_exec( hIvasDec->hTimeScaler, hIvasDec->apaExecBuffer, hIvasDec->nSamplesFrame * nTransportChannels, (uint16_t) hIvasDec->tsm_max_scaling, hIvasDec->apaExecBuffer, &nTimeScalerOutSamples ); + if ( result != 0 ) + { + return IVAS_ERR_UNKNOWN; + } + assert( nTimeScalerOutSamples <= APA_BUF ); + } + else + { + nTimeScalerOutSamples = hIvasDec->nSamplesFrame * nTransportChannels; + } + nSamplesTcsScaled = nTimeScalerOutSamples / nTransportChannels; + + /* render IVAS frames */ + if ( ( error = IVAS_DEC_RendererFeedTcSamples( hIvasDec, nSamplesTcsScaled, &nResidualSamples, hIvasDec->apaExecBuffer ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( hIvasDec->st_ivas->hDecoderConfig->Opt_tsm ) + { + /* feed residual samples to TSM for the next call */ + if ( apa_set_renderer_residual_samples( hIvasDec->hTimeScaler, (uint16_t) nResidualSamples ) != 0 ) + { + return IVAS_ERR_UNKNOWN; + } + } + hIvasDec->hasBeenFedFrame = false; + } + + /* render IVAS frames directly to the output buffer */ + nSamplesToRender = nSamplesAsked - nSamplesRendered; + + if ( ( error = IVAS_DEC_GetRenderedSamples( hIvasDec, nSamplesToRender, &nSamplesRendered_loop, &hIvasDec->nSamplesAvailableNext, pcmBuf + nSamplesRendered * nOutChannels ) ) != IVAS_ERR_OK ) + { + return error; + } + + nSamplesRendered += nSamplesRendered_loop; + nSamplesToRender -= nSamplesRendered_loop; + if ( hIvasDec->nSamplesAvailableNext == 0 ) + { + *needNewFrame = true; + hIvasDec->needNewFrame = true; + } + else + { + *needNewFrame = false; + } + } + } + + *nOutSamples = nSamplesRendered; + + return IVAS_ERR_OK; +} + + + + +/*---------------------------------------------------------------------* + * IVAS_DEC_Setup( ) + * + * + *---------------------------------------------------------------------*/ + +static ivas_error IVAS_DEC_Setup( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + uint16_t *nTcBufferGranularity, /* o : granularity of the TC Buffer */ + uint8_t *nTransportChannels, /* o : number of decoded transport PCM channels */ + uint8_t *nOutChannels, /* o : number of decoded out channels (PCM or CLDFB) */ + uint16_t *nSamplesRendered, /* o : number of samples flushed from the last frame */ + int16_t *data /* o : output synthesis signal */ +) +{ + ivas_error error; + + *nSamplesRendered = 0; + + if ( hIvasDec->mode == IVAS_DEC_MODE_EVS ) + { + if ( hIvasDec->st_ivas->renderer_type == RENDERER_NON_DIEGETIC_DOWNMIX ) + { + *nTransportChannels = MAX_OUTPUT_CHANNELS_IN_DIEGETIC_PAN; + *nOutChannels = MAX_OUTPUT_CHANNELS_IN_DIEGETIC_PAN; + } + else + { + *nTransportChannels = 1; + *nOutChannels = 1; + } + } + else + { + Decoder_Struct *st_ivas; + + st_ivas = hIvasDec->st_ivas; + + /*----------------------------------------------------------------* + * IVAS decoder setup + * - read IVAS format signaling + * - read IVAS format specific signaling + * - initialize decoder in the first frame based on IVAS format and number of transport channels + * - reconfigure the decoder when the number of TC or IVAS total bitrate change + *----------------------------------------------------------------*/ + + if ( st_ivas->bfi == 0 ) + { + if ( ( error = ivas_dec_setup( st_ivas, nSamplesRendered, data ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + *nTransportChannels = (uint8_t) st_ivas->hTcBuffer->nchan_transport_jbm; + *nTcBufferGranularity = (uint16_t) st_ivas->hTcBuffer->n_samples_granularity; + *nOutChannels = (uint8_t) st_ivas->hDecoderConfig->nchan_out; + } + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * IVAS_DEC_GetTcSamples( ) + * + * Main function to decode to PCM data of the transport channels + *---------------------------------------------------------------------*/ + +static ivas_error IVAS_DEC_GetTcSamples( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + float *pcmBuf, /* i/o: buffer for decoded PCM output. The memory must already be allocated and be able to hold the expected number of output samples, based on frame size and number of output channels */ + int16_t *nOutSamples /* o : number of samples per channel written to output buffer */ +) +{ + Decoder_Struct *st_ivas; + ivas_error error; + + if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + st_ivas = hIvasDec->st_ivas; + + *nOutSamples = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); + + if ( hIvasDec->mode == IVAS_DEC_MODE_EVS ) + { + if ( ( error = evs_dec_main( st_ivas, *nOutSamples, pcmBuf, NULL ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( hIvasDec->mode == IVAS_DEC_MODE_IVAS ) + { + /* run the main IVAS decoding routine */ + if ( ( error = ivas_jbm_dec_tc( st_ivas, pcmBuf ) ) != IVAS_ERR_OK ) + { + return error; + } + + hIvasDec->isInitialized = true; /* Initialization done in ivas_dec() */ + } + + if ( hIvasDec->hasBeenFedFirstGoodFrame ) + { + hIvasDec->hasDecodedFirstGoodFrame = true; + } + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * IVAS_DEC_Rendered_FeedTcSamples( ) + * + * Main function to decode to PCM data of the transport channels + *---------------------------------------------------------------------*/ + +static ivas_error IVAS_DEC_RendererFeedTcSamples( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const int16_t nSamplesForRendering, /* i : number of TC samples wanted from the renderer */ + int16_t *nSamplesResidual, /* o : number of samples not fitting into the renderer grid and buffer for the next call */ + float *pcmBuf /* i/o: buffer for decoded PCM output. The memory must already be allocated and be able to hold the expected number of output samples, based on frame size and number of output channels */ +) +{ + Decoder_Struct *st_ivas; + + if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + st_ivas = hIvasDec->st_ivas; + + /* feed the TCs to the IVAS renderer */ + ivas_jbm_dec_feed_tc_to_renderer( st_ivas, nSamplesForRendering, nSamplesResidual, pcmBuf ); + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * IVAS_DEC_GetRenderedSamples( ) + * + * Main function to render the transport channels to PCM output datat + *---------------------------------------------------------------------*/ + +static ivas_error IVAS_DEC_GetRenderedSamples( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const uint16_t nSamplesForRendering, /* i : number of TC samples wanted from the renderer */ + uint16_t *nSamplesRendered, /* o : number of samples rendered */ + uint16_t *nSamplesAvailableNext, /* o : number of samples still available in the renerer pipeline */ + int16_t *pcmBuf +) +{ + Decoder_Struct *st_ivas; + ivas_error error; + + if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + st_ivas = hIvasDec->st_ivas; + + /* run the main IVAS decoding routine */ + error = ivas_jbm_dec_render( st_ivas, nSamplesForRendering, nSamplesRendered, nSamplesAvailableNext, pcmBuf ); + + return error; +} + + +/*---------------------------------------------------------------------* + * IVAS_DEC_GetBufferedNumberOfSamples( ) + * + * Returns the number of objects available in the decoded bitstream + *---------------------------------------------------------------------*/ + +static ivas_error IVAS_DEC_GetBufferedNumberOfSamples( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + int16_t *nSamplesBuffered /* o : number of samples still buffered */ +) +{ + *nSamplesBuffered = 0; + if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + /* check if the TC buffer already exists, otherweise nothing is buffered anyway */ + if ( hIvasDec->st_ivas->hTcBuffer != NULL ) + { + *nSamplesBuffered = hIvasDec->st_ivas->hTcBuffer->n_samples_buffered - hIvasDec->st_ivas->hTcBuffer->n_samples_rendered; + } + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * IVAS_DEC_GetNumObjects( ) + * + * Returns the number of objects available in the decoded bitstream + *---------------------------------------------------------------------*/ + +ivas_error IVAS_DEC_GetNumObjects( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + uint16_t *numObjects /* o : number of objects for which the decoder has been configured */ +) +{ + if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + if ( hIvasDec->st_ivas->ivas_format == ISM_FORMAT || hIvasDec->st_ivas->ivas_format == SBA_ISM_FORMAT || hIvasDec->st_ivas->ivas_format == MASA_ISM_FORMAT ) + { + *numObjects = hIvasDec->st_ivas->nchan_ism; + } + else + { + *numObjects = 0; + } + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * IVAS_DEC_GetFormat( ) + * + * Returns the format of currently decoded bitstream. + * Note: bitstream format is only known after the first (good) frame has been decoded. + *---------------------------------------------------------------------*/ + +ivas_error IVAS_DEC_GetFormat( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_DEC_BS_FORMAT *format /* o : format detected from bitstream fed to the decoder */ +) +{ + if ( hIvasDec->hasDecodedFirstGoodFrame ) + { + *format = mapIvasFormat( hIvasDec->st_ivas->ivas_format ); + } + else + { + *format = IVAS_DEC_BS_UNKOWN; + } + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * getInputBufferSize() + * + * + *---------------------------------------------------------------------*/ + +static int16_t getOutputBufferSize( + const Decoder_Struct *st_ivas /* i : IVAS decoder handle */ +) +{ + if ( st_ivas->hDecoderConfig == NULL ) + { + return -1; + } + + if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) + { + return (int16_t) ( st_ivas->hDecoderConfig->output_Fs * ( IVAS_MAX_OUTPUT_CHANNELS + IVAS_MAX_NUM_OBJECTS ) / FRAMES_PER_SEC ); + } + else if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM ) + { + if ( st_ivas->hLsSetupCustom == NULL ) + { + return -1; + } + + return (int16_t) ( st_ivas->hDecoderConfig->output_Fs * ( st_ivas->hLsSetupCustom->num_spk + st_ivas->hLsSetupCustom->num_lfe ) / FRAMES_PER_SEC ); + } + else + { + return (int16_t) ( st_ivas->hDecoderConfig->output_Fs * st_ivas->hDecoderConfig->nchan_out / FRAMES_PER_SEC ); + } +} + + +/*---------------------------------------------------------------------* + * IVAS_DEC_GetOutputBufferSize() + * + * + *---------------------------------------------------------------------*/ + +ivas_error IVAS_DEC_GetOutputBufferSize( + const IVAS_DEC_HANDLE hIvasDec, /* i : IVAS decoder handle */ + int16_t *outputBufferSize /* o : total number of samples expected in the output buffer for current decoder configuration */ +) +{ + if ( outputBufferSize == NULL || hIvasDec == NULL || hIvasDec->st_ivas == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + *outputBufferSize = getOutputBufferSize( hIvasDec->st_ivas ); + + if ( *outputBufferSize == -1 ) + { + return IVAS_ERR_INVALID_OUTPUT_BUFFER_SIZE; + } + else + { + return IVAS_ERR_OK; + } +} + + +/*---------------------------------------------------------------------* + * IVAS_DEC_GetNumOutputChannels( ) + * + * Returns number of output channels + *---------------------------------------------------------------------*/ + +ivas_error IVAS_DEC_GetNumOutputChannels( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + int16_t *numOutputChannels /* o : number of PCM output channels */ +) +{ + if ( hIvasDec->hasDecodedFirstGoodFrame ) + { + *numOutputChannels = hIvasDec->st_ivas->hDecoderConfig->nchan_out; + } + else + { + *numOutputChannels = 0; + } + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * IVAS_DEC_GetObjectMetadata( ) + * + * Get metadata of one object decoded in the most recent frame + *---------------------------------------------------------------------*/ + +ivas_error IVAS_DEC_GetObjectMetadata( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_ISM_METADATA *metadata, /* o : struct where metadata decoded in most recently decoded frame will be written */ + const uint16_t zero_flag, /* i : if this flag is enabled, this function outputs a zero-initialized metadata struct */ + const uint16_t objectIdx /* i : index of the queried object */ +) +{ + Decoder_Struct *st_ivas; + ISM_METADATA_HANDLE hIsmMeta; + + if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + st_ivas = hIvasDec->st_ivas; + if ( st_ivas->ivas_format != ISM_FORMAT && st_ivas->ivas_format != MASA_ISM_FORMAT && st_ivas->ivas_format != SBA_ISM_FORMAT ) + { + return IVAS_ERR_WRONG_MODE; + } + + if ( objectIdx >= st_ivas->nchan_ism ) + { + return IVAS_ERR_INVALID_INDEX; + } + + hIsmMeta = st_ivas->hIsmMetaData[objectIdx]; + + if ( hIsmMeta == NULL || zero_flag ) + { + metadata->azimuth = 0.f; + metadata->elevation = 0.f; + metadata->radius = 1.f; + metadata->spread = 0.f; + metadata->gainFactor = 1.f; + metadata->yaw = 0.f; + metadata->pitch = 0.f; + metadata->non_diegetic_flag = 0; + } + else + { + metadata->azimuth = hIsmMeta->azimuth; + metadata->elevation = hIsmMeta->elevation; + metadata->radius = hIsmMeta->radius; + metadata->yaw = hIsmMeta->yaw; + metadata->pitch = hIsmMeta->pitch; + metadata->spread = 0.f; + metadata->gainFactor = 1.f; + metadata->non_diegetic_flag = hIsmMeta->non_diegetic_flag; + } + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * IVAS_DEC_GetMasaMetadata( ) + * + * Get metadata of the most recently decoded MASA frame + *---------------------------------------------------------------------*/ + +ivas_error IVAS_DEC_GetMasaMetadata( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + MASA_DECODER_EXT_OUT_META_HANDLE *hMasaExtOutMeta, /* o : pointer to handle, which will be set to point to metadata from the most recently decoded frame */ + const uint8_t getFromJbmBuffer /* i : get metadata from a JBM buffer */ +) +{ + if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + if ( hIvasDec->st_ivas->ivas_format != MASA_FORMAT && hIvasDec->st_ivas->ivas_format != MASA_ISM_FORMAT ) + { + return IVAS_ERR_WRONG_MODE; + } + + if ( getFromJbmBuffer ) + { + ivas_jbm_masa_sf_to_sf_map( hIvasDec->st_ivas ); + } + + *hMasaExtOutMeta = hIvasDec->st_ivas->hMasa->data.extOutMeta; + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * IVAS_DEC_FeedHeadTrackData( ) + * + * Feed the decoder with the head tracking data + *---------------------------------------------------------------------*/ + +ivas_error IVAS_DEC_FeedHeadTrackData( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_QUATERNION orientation, /* i : head-tracking data, listener orientation */ + IVAS_VECTOR3 Pos, /* i : listener position */ + const int16_t subframe_idx /* i : subframe index */ +) +{ + HEAD_TRACK_DATA_HANDLE hHeadTrackData; + ivas_error error; + + if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + hHeadTrackData = hIvasDec->st_ivas->hHeadTrackData; + + if ( hHeadTrackData == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + /* Move head-tracking data to the decoder handle */ + /* check for Euler angle signaling */ + if ( orientation.w == -3.0f ) + { + Euler2Quat( deg2rad( orientation.x ), deg2rad( orientation.y ), deg2rad( orientation.z ), &orientation ); + } + + if ( ( error = ivas_orient_trk_Process( hHeadTrackData->OrientationTracker, orientation, FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES, &hHeadTrackData->Quaternions[subframe_idx] ) ) != IVAS_ERR_OK ) + { + return error; + } + + hHeadTrackData->Pos[subframe_idx].x = Pos.x; + hHeadTrackData->Pos[subframe_idx].y = Pos.y; + hHeadTrackData->Pos[subframe_idx].z = Pos.z; + + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * IVAS_DEC_FeedRefRotData( ) + * + * Feed the decoder with the reference rotation + *---------------------------------------------------------------------*/ + +ivas_error IVAS_DEC_FeedRefRotData( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_QUATERNION rotation /* i : reference rotation data */ +) +{ + ivas_orient_trk_state_t *pOtr; + + if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL || hIvasDec->st_ivas->hHeadTrackData == NULL || hIvasDec->st_ivas->hHeadTrackData->OrientationTracker == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + pOtr = hIvasDec->st_ivas->hHeadTrackData->OrientationTracker; + + pOtr->refRot.w = rotation.w; + pOtr->refRot.x = rotation.x; + pOtr->refRot.z = rotation.z; + pOtr->refRot.y = rotation.y; + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * IVAS_DEC_FeedRefVectorData( ) + * + * Feed the decoder with a reference vector spanning from listenerPos + * to refPos. Only available in OTR_TRACKING_REF_POS and + * OTR_TRACKING_REF_POS_LEV modes. + *---------------------------------------------------------------------*/ + +ivas_error IVAS_DEC_FeedRefVectorData( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const IVAS_VECTOR3 listenerPos, /* i : Listener position */ + const IVAS_VECTOR3 refPos /* i : Reference position */ +) +{ + ivas_orient_trk_state_t *pOtr; + + if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL || hIvasDec->st_ivas->hHeadTrackData == NULL || hIvasDec->st_ivas->hHeadTrackData->OrientationTracker == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + pOtr = hIvasDec->st_ivas->hHeadTrackData->OrientationTracker; + + return ivas_orient_trk_SetReferenceVector( pOtr, listenerPos, refPos ); +} + + +/*---------------------------------------------------------------------* + * IVAS_DEC_FeedExternalOrientationData( ) + * + * Feed the decoder with the external orientation data + *---------------------------------------------------------------------*/ + +ivas_error IVAS_DEC_FeedExternalOrientationData( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_QUATERNION orientation, /* i : external orientation data */ + int8_t enableHeadRotation, /* i : flag to enable head rotation for this frame */ + int8_t enableExternalOrientation, /* i : flag to enable external orientation for this frame */ + int8_t enableRotationInterpolation, /* i : flag to interpolate rotations from current and previous frames */ + int16_t numFramesToTargetOrientation, /* i : number of frames until target orientation is reached */ + const int16_t subframe_idx /* i : subframe index */ +) +{ + EXTERNAL_ORIENTATION_HANDLE hExternalOrientationData; + + if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + hExternalOrientationData = hIvasDec->st_ivas->hExtOrientationData; + + if ( hExternalOrientationData == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + /* Move external orientation data to the decoder handle (invert orientations) */ + QuaternionInverse( orientation, &hExternalOrientationData->Quaternions[subframe_idx] ); + + hExternalOrientationData->enableHeadRotation[subframe_idx] = enableHeadRotation; + hExternalOrientationData->enableExternalOrientation[subframe_idx] = enableExternalOrientation; + hExternalOrientationData->enableRotationInterpolation[subframe_idx] = enableRotationInterpolation; + hExternalOrientationData->numFramesToTargetOrientation[subframe_idx] = numFramesToTargetOrientation; + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * IVAS_DEC_FeedCustomLsData( ) + * + * Feed the decoder with the Custom loudspeaker data + *---------------------------------------------------------------------*/ + +/*! r: error code */ +ivas_error IVAS_DEC_FeedCustomLsData( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const IVAS_CUSTOM_LS_DATA hLsCustomData /* i : Custom loudspeaker setup data */ +) +{ + int16_t i, is_planar; + IVAS_LSSETUP_CUSTOM_HANDLE hLsSetupCustom; + + if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + hLsSetupCustom = hIvasDec->st_ivas->hLsSetupCustom; + + if ( hLsSetupCustom == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + /* Move Custom LS layout data to the decoder handle */ + + /* Loudspeaker azimuths and elevations */ + hLsSetupCustom->num_spk = hLsCustomData.num_spk; + + mvr2r( hLsCustomData.azimuth, hLsSetupCustom->ls_azimuth, hLsCustomData.num_spk ); + mvr2r( hLsCustomData.elevation, hLsSetupCustom->ls_elevation, hLsCustomData.num_spk ); + + /* Set planar flag */ + is_planar = 1; + for ( i = 0; i < hLsCustomData.num_spk; i++ ) + { + if ( is_planar && hLsSetupCustom->ls_elevation[i] != 0.0f ) + { + is_planar = 0; + } + } + hLsSetupCustom->is_planar_setup = is_planar; + + /* Loudspeaker LFE */ + hLsSetupCustom->num_lfe = hLsCustomData.num_lfe; + mvs2s( hLsCustomData.lfe_idx, hLsSetupCustom->lfe_idx, hLsCustomData.num_lfe ); + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * IVAS_DEC_GetHrtfHandle( ) + * + * + *---------------------------------------------------------------------*/ + +ivas_error IVAS_DEC_GetHrtfHandle( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_DEC_HRTF_HANDLE *hHrtfTD /* o : HRTF handle */ +) +{ + if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL || hIvasDec->st_ivas->hHrtfTD == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + *hHrtfTD = hIvasDec->st_ivas->hHrtfTD; + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * IVAS_DEC_GetHrtfCRendHandle( ) + * + * + *---------------------------------------------------------------------*/ + +ivas_error IVAS_DEC_GetHrtfCRendHandle( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_DEC_HRTF_CREND_HANDLE *hSetOfHRTF /* o : Set of HRTF handle */ +) +{ + if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL || hIvasDec->st_ivas->hSetOfHRTF == NULL ) + { + return IVAS_ERR_WRONG_PARAMS; + } + + *hSetOfHRTF = hIvasDec->st_ivas->hSetOfHRTF; + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * IVAS_DEC_GetHrtfFastConvHandle( ) + * + * + *---------------------------------------------------------------------*/ + +ivas_error IVAS_DEC_GetHrtfFastConvHandle( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_DEC_HRTF_FASTCONV_HANDLE *hHrtfFastConv /* o : FASTCONV HRTF handle */ +) +{ + if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL || hIvasDec->st_ivas->hHrtfFastConv == NULL ) + { + return IVAS_ERR_WRONG_PARAMS; + } + + *hHrtfFastConv = hIvasDec->st_ivas->hHrtfFastConv; + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * IVAS_DEC_GetHrtfParamBinHandle( ) + * + * + *---------------------------------------------------------------------*/ + +ivas_error IVAS_DEC_GetHrtfParamBinHandle( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_DEC_HRTF_PARAMBIN_HANDLE *hHrtfParambin /* o : Parametric binauralizer HRTF handle */ +) +{ + if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL || hIvasDec->st_ivas->hHrtfParambin == NULL ) + { + return IVAS_ERR_WRONG_PARAMS; + } + + *hHrtfParambin = hIvasDec->st_ivas->hHrtfParambin; + + return IVAS_ERR_OK; +} + +/*---------------------------------------------------------------------* + * copyRendererConfigStruct( ) + * + * + *---------------------------------------------------------------------*/ + +static ivas_error copyRendererConfigStruct( + RENDER_CONFIG_HANDLE hRCin, + IVAS_RENDER_CONFIG_HANDLE hRCout ) +{ + if ( hRCin == NULL || hRCout == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + hRCout->roomAcoustics.override = hRCin->roomAcoustics.override; + hRCout->roomAcoustics.nBands = hRCin->roomAcoustics.nBands; + hRCout->roomAcoustics.acousticPreDelay = hRCin->roomAcoustics.acousticPreDelay; + hRCout->roomAcoustics.inputPreDelay = hRCin->roomAcoustics.inputPreDelay; + + mvr2r( hRCin->roomAcoustics.pFc_input, hRCout->roomAcoustics.pFc_input, CLDFB_NO_CHANNELS_MAX ); + mvr2r( hRCin->roomAcoustics.pAcoustic_rt60, hRCout->roomAcoustics.pAcoustic_rt60, CLDFB_NO_CHANNELS_MAX ); + mvr2r( hRCin->roomAcoustics.pAcoustic_dsr, hRCout->roomAcoustics.pAcoustic_dsr, CLDFB_NO_CHANNELS_MAX ); + mvr2r( hRCin->directivity, hRCout->directivity, 3 * MAX_NUM_OBJECTS ); + hRCout->roomAcoustics.use_er = hRCin->roomAcoustics.use_er; + hRCout->roomAcoustics.lowComplexity = hRCin->roomAcoustics.lowComplexity; + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * IVAS_DEC_GetRenderConfig( ) + * + * + *---------------------------------------------------------------------*/ + +ivas_error IVAS_DEC_GetRenderConfig( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const IVAS_RENDER_CONFIG_HANDLE hRCout /* o : Render configuration handle */ +) +{ + + if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL || hIvasDec->st_ivas->hRenderConfig == NULL || hRCout == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + return copyRendererConfigStruct( hIvasDec->st_ivas->hRenderConfig, hRCout ); +} + +/*! r: error code*/ +ivas_error IVAS_DEC_GetDefaultRenderConfig( + IVAS_RENDER_CONFIG_HANDLE hRCout /* o : Render config handle */ +) +{ + RENDER_CONFIG_DATA RCin; + RENDER_CONFIG_HANDLE hRCin = &RCin; + ivas_error error; + + if ( ( error = ivas_render_config_init_from_rom( &hRCin ) ) != IVAS_ERR_OK ) + { + return error; + } + + return copyRendererConfigStruct( hRCin, hRCout ); +} + + +/*---------------------------------------------------------------------* + * IVAS_DEC_FeedRenderConfig( ) + * + * + *---------------------------------------------------------------------*/ + +ivas_error IVAS_DEC_FeedRenderConfig( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const IVAS_RENDER_CONFIG_DATA renderConfig /* i : Render configuration struct */ +) +{ + RENDER_CONFIG_HANDLE hRenderConfig; + + if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL || hIvasDec->st_ivas->hRenderConfig == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + hRenderConfig = hIvasDec->st_ivas->hRenderConfig; + hRenderConfig->roomAcoustics.override = renderConfig.roomAcoustics.override; + hRenderConfig->roomAcoustics.nBands = renderConfig.roomAcoustics.nBands; + hRenderConfig->roomAcoustics.acousticPreDelay = renderConfig.roomAcoustics.acousticPreDelay; + hRenderConfig->roomAcoustics.inputPreDelay = renderConfig.roomAcoustics.inputPreDelay; + + hRenderConfig->roomAcoustics.use_er = 0; + if ( renderConfig.roomAcoustics.use_er == 1 ) + { + hRenderConfig->roomAcoustics.use_er = renderConfig.roomAcoustics.use_er; + hRenderConfig->roomAcoustics.lowComplexity = renderConfig.roomAcoustics.lowComplexity; + hRenderConfig->roomAcoustics.dimensions = renderConfig.roomAcoustics.dimensions; + hRenderConfig->roomAcoustics.ListenerOrigin = renderConfig.roomAcoustics.ListenerOrigin; + + mvr2r( renderConfig.roomAcoustics.AbsCoeff, hRenderConfig->roomAcoustics.AbsCoeff, ER_ABS_COEFF ); + } + + mvr2r( renderConfig.roomAcoustics.pFc_input, hRenderConfig->roomAcoustics.pFc_input, CLDFB_NO_CHANNELS_MAX ); + mvr2r( renderConfig.roomAcoustics.pAcoustic_rt60, hRenderConfig->roomAcoustics.pAcoustic_rt60, CLDFB_NO_CHANNELS_MAX ); + mvr2r( renderConfig.roomAcoustics.pAcoustic_dsr, hRenderConfig->roomAcoustics.pAcoustic_dsr, CLDFB_NO_CHANNELS_MAX ); + + mvr2r( renderConfig.directivity, hRenderConfig->directivity, 3 * MAX_NUM_OBJECTS ); + + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * IVAS_DEC_GetDelay( ) + * + * + *---------------------------------------------------------------------*/ + +ivas_error IVAS_DEC_GetDelay( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + int16_t *nSamples, /* o : decoder delay in samples */ + int32_t *timeScale /* o : time scale of the delay, equal to decoder output sampling rate */ +) +{ + Decoder_Struct *st_ivas; + DECODER_CONFIG_HANDLE hDecoderConfig; + + if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL || nSamples == NULL || timeScale == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + if ( !hIvasDec->hasDecodedFirstGoodFrame ) + { + /* Delay depends on IVAS format, which is unknown until first frame has been decoded */ + return IVAS_ERR_WAITING_FOR_BITSTREAM; + } + + st_ivas = hIvasDec->st_ivas; + hDecoderConfig = st_ivas->hDecoderConfig; + + nSamples[1] = NS2SA( hDecoderConfig->output_Fs, get_delay( DEC, hDecoderConfig->output_Fs, st_ivas->ivas_format, st_ivas->cldfbAnaDec[0] ) ); + nSamples[2] = (int16_t) roundf( (float) st_ivas->binaural_latency_ns * hDecoderConfig->output_Fs / 1000000000.f ); + nSamples[0] = nSamples[1] + nSamples[2]; + + if ( st_ivas->ivas_format == MASA_FORMAT ) + { + /* note: in MASA, all delay is compensated at the decoder by default, so subtract the encoder delay for print-out */ + nSamples[1] -= NS2SA( hDecoderConfig->output_Fs, IVAS_ENC_DELAY_NS ); + } + + *timeScale = hDecoderConfig->output_Fs; + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * IVAS_DEC_HasDecodedFirstGoodFrame( ) + * + * + *---------------------------------------------------------------------*/ + +ivas_error IVAS_DEC_HasDecodedFirstGoodFrame( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + bool *hasDecodedFirstGoodFrame /* o : flag indicating if the decoder has decoded a good frame since it was configured */ +) +{ + if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL || hasDecodedFirstGoodFrame == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + *hasDecodedFirstGoodFrame = hIvasDec->hasDecodedFirstGoodFrame; + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * IVAS_DEC_GetPcmFrameSize( ) + * + * + *---------------------------------------------------------------------*/ + +ivas_error IVAS_DEC_GetPcmFrameSize( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + int32_t *pcmFrameSize /* o : total size of the PCM output frame. This takes into account the number of output channels */ +) +{ + if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL || pcmFrameSize == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + if ( hIvasDec->hasDecodedFirstGoodFrame ) + { + *pcmFrameSize = hIvasDec->st_ivas->hDecoderConfig->nchan_out * hIvasDec->st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC; + } + else + { + *pcmFrameSize = 0; + } + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * isSidFrame( ) + * + * Check if a frame contains a SID + *---------------------------------------------------------------------*/ + +static bool isSidFrame( + const uint16_t size ) +{ + if ( size == SID_1k75 / FRAMES_PER_SEC ) + { + return true; /* AMR-WB SID */ + } + else if ( size == SID_2k40 / FRAMES_PER_SEC ) + { + return true; /* EVS SID */ + } + else if ( size == IVAS_SID_5k2 / FRAMES_PER_SEC ) + { + return true; /* IVAS SID */ + } + + return false; +} + +static void bsCompactToSerial( const uint8_t *compact, uint16_t *serial, uint16_t num_bits ) +{ +/* Bitstream conversion is not counted towards complexity and memory usage */ +#define WMC_TOOL_SKIP + uint32_t i; + uint8_t byte = 0; + const uint8_t mask = 0x80; + + for ( i = 0; i < num_bits; ++i ) + { + if ( i % 8 == 0 ) + { + byte = compact[i / 8]; + } + + serial[i] = ( byte & mask ) >> 7; + + byte <<= 1; + } + + /* Add 4 padding bytes required by core coder */ + for ( i = 0; i < 4 * 8; ++i ) + { + serial[num_bits + i] = 0; + } +#undef WMC_TOOL_SKIP +} + + +/*---------------------------------------------------------------------* + * IVAS_DEC_VoIP_FeedFrame( ) + * + * Feed RTP packet into internal jitter buffer + *---------------------------------------------------------------------*/ + +ivas_error IVAS_DEC_VoIP_FeedFrame( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + uint8_t *au, /* i : buffer containing input access unit */ + const uint16_t auSize, /* i : size of the access unit */ + const uint16_t rtpSequenceNumber, /* i : RTP sequence number (16 bits) */ + const uint32_t rtpTimeStamp, /* i : RTP timestamp (32 bits) */ + const uint32_t rcvTime_ms, /* i : receive time of the RTP packet in milliseconds */ + const bool qBit /* i : Q bit for AMR-WB IO */ +) +{ + JB4_DATAUNIT_HANDLE dataUnit; + int16_t partialCopyFrameType, partialCopyOffset; + int16_t result; + + if ( auSize == 0 ) + { + return IVAS_ERR_OK; /* ignore empty/NO_DATA frame - shouldn't be transmitted in RTP */ + } + if ( ( auSize + 7 ) / 8 > MAX_AU_SIZE ) + { + return IVAS_ERR_INVALID_BITSTREAM; + } + + /* check if frame contains a partial copy and get its offset */ + evs_dec_previewFrame( au, auSize, &partialCopyFrameType, &partialCopyOffset ); + + /* create data unit for primary copy in the frame */ + dataUnit = JB4_AllocDataUnit( hIvasDec->hVoIP->hJBM ); + mvc2c( au, dataUnit->data, (int16_t) ( ( auSize + 7 ) / 8 ) ); + dataUnit->dataSize = auSize; + dataUnit->duration = 20; + dataUnit->sequenceNumber = rtpSequenceNumber; + dataUnit->silenceIndicator = isSidFrame( dataUnit->dataSize ); + dataUnit->timeScale = 1000; + dataUnit->rcvTime = rcvTime_ms; + dataUnit->timeStamp = rtpTimeStamp; + dataUnit->partial_frame = 0; + dataUnit->partialCopyOffset = partialCopyOffset; + dataUnit->qBit = qBit; + + /* add the frame to the JBM */ + result = JB4_PushDataUnit( hIvasDec->hVoIP->hJBM, dataUnit, rcvTime_ms ); + if ( result != 0 ) + { + return IVAS_ERR_UNKNOWN; + } + + if ( partialCopyFrameType != RF_NO_DATA && partialCopyOffset != 0 ) + { + /* create data unit for partial copy in the frame */ + dataUnit = JB4_AllocDataUnit( hIvasDec->hVoIP->hJBM ); + mvc2c( au, dataUnit->data, (int16_t) ( ( auSize + 7 ) / 8 ) ); + dataUnit->dataSize = auSize; + dataUnit->duration = 20; + dataUnit->sequenceNumber = rtpSequenceNumber; + dataUnit->silenceIndicator = 0; /* there are no partial copies for SID frames */ + dataUnit->timeScale = 1000; + dataUnit->rcvTime = rcvTime_ms; + dataUnit->timeStamp = rtpTimeStamp - partialCopyOffset * dataUnit->duration; + dataUnit->partial_frame = 1; + dataUnit->partialCopyOffset = partialCopyOffset; + dataUnit->qBit = qBit; + + /* add the frame to the JBM */ + result = JB4_PushDataUnit( hIvasDec->hVoIP->hJBM, dataUnit, rcvTime_ms ); + if ( result != 0 ) + { + return IVAS_ERR_UNKNOWN; + } + } + + return IVAS_ERR_OK; +} + +/*---------------------------------------------------------------------* + * IVAS_DEC_VoIP_SetScale( ) + * + * Set the TSM scale + *---------------------------------------------------------------------*/ + +ivas_error IVAS_DEC_VoIP_SetScale( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const int16_t maxScaling, + const int16_t scale /* i : TSM scale to set */ +) +{ + ivas_error error; + + error = IVAS_ERR_OK; + + if ( hIvasDec->st_ivas->hDecoderConfig->Opt_tsm == false ) + { + return IVAS_ERR_TSM_NOT_ENABLED; + } + else + { + hIvasDec->tsm_scale = scale; + hIvasDec->tsm_max_scaling = maxScaling; + } + + return error; +} + + +/*---------------------------------------------------------------------* + * IVAS_DEC_VoIP_GetSamples( ) + * + * Main function to decode one frame in VoIP + *---------------------------------------------------------------------*/ + +ivas_error IVAS_DEC_VoIP_GetSamples( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + uint16_t nSamplesPerChannel, /* i : number of samples per channel requested to be written to output buffer */ + int16_t *pcmBuf, /* i/o: buffer for decoded PCM output. The memory must already be allocated and be able to hold the expected number of output samples, based on frame size and number of output channels */ + const uint32_t systemTimestamp_ms /* i : current system timestamp */ +#ifdef SUPPORT_JBM_TRACEFILE + , + JbmTraceFileWriterFn jbmWriterFn, + void *jbmWriter +#endif +) +{ + Decoder_Struct *st_ivas; + DECODER_CONFIG_HANDLE hDecoderConfig; + IVAS_DEC_VOIP *hVoIP; + uint32_t extBufferedTime_ms, scale, maxScaling; + JB4_DATAUNIT_HANDLE dataUnit; + uint16_t extBufferedSamples; + int16_t timeScalingDone; + int16_t result; + ivas_error error; + int16_t nSamplesRendered; + uint8_t nOutChannels; + + st_ivas = hIvasDec->st_ivas; + hDecoderConfig = st_ivas->hDecoderConfig; + hVoIP = hIvasDec->hVoIP; + timeScalingDone = 0; + nOutChannels = (uint8_t) st_ivas->hDecoderConfig->nchan_out; + nSamplesRendered = 0; + + if ( nSamplesPerChannel == 0 ) + { + return IVAS_ERR_WRONG_PARAMS; + } + + /* make sure that the FIFO after decoder/scaler contains at least one sound card frame (i.e. 20ms) */ + while ( nSamplesRendered < nSamplesPerChannel ) + { + if ( hIvasDec->nSamplesAvailableNext == 0 ) + { + int16_t nSamplesBuffered; + nSamplesBuffered = 0; + if ( hIvasDec->hasBeenFedFirstGoodFrame ) + { + if ( ( error = IVAS_DEC_GetBufferedNumberOfSamples( hIvasDec, &nSamplesBuffered ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + extBufferedSamples = nSamplesRendered + nSamplesBuffered; + extBufferedTime_ms = extBufferedSamples * 1000 / hDecoderConfig->output_Fs; + dataUnit = NULL; + + /* pop one access unit from the jitter buffer */ + result = JB4_PopDataUnit( hVoIP->hJBM, systemTimestamp_ms, extBufferedTime_ms, &dataUnit, &scale, &maxScaling ); + if ( result != 0 ) + { + return IVAS_ERR_UNKNOWN; + } + maxScaling = maxScaling * hDecoderConfig->output_Fs / 1000; + + /* avoid time scaling multiple times in one sound card slot */ + if ( scale != 100U ) + { + if ( timeScalingDone ) + { + scale = 100; + } + else + { + timeScalingDone = 1; + } + } + + /* limit scale to range supported by time scaler */ + if ( scale < APA_MIN_SCALE ) + { + scale = APA_MIN_SCALE; + } + else if ( scale > APA_MAX_SCALE ) + { + scale = APA_MAX_SCALE; + } + + if ( ( error = IVAS_DEC_VoIP_SetScale( hIvasDec, (int16_t) maxScaling, (int16_t) scale ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* copy bitstream into decoder state */ + if ( dataUnit ) + { + hIvasDec->hVoIP->hCurrentDataUnit = dataUnit; + + bsCompactToSerial( dataUnit->data, hIvasDec->hVoIP->bs_conversion_buf, dataUnit->dataSize ); + + + if ( ( error = IVAS_DEC_FeedFrame_Serial( hIvasDec, hIvasDec->hVoIP->bs_conversion_buf, dataUnit->dataSize, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( hIvasDec->hasDecodedFirstGoodFrame ) + { + /* Decoder has been initialized with first good frame - do PLC */ + if ( ( error = IVAS_DEC_FeedFrame_Serial( hIvasDec, hIvasDec->hVoIP->bs_conversion_buf, 0, 1 ) ) != IVAS_ERR_OK ) + { + return error; + } + } + +#ifdef SUPPORT_JBM_TRACEFILE + /* jbmWriterFn and jbmWriter may be NULL if tracefile writing was not requested on CLI */ + if ( jbmWriterFn != NULL && jbmWriter != NULL ) + { + /* write JBM trace data entry */ + store_JbmData( hVoIP, dataUnit, systemTimestamp_ms, extBufferedSamples, hDecoderConfig->output_Fs ); + if ( ( jbmWriterFn( &hVoIP->JbmTraceData, jbmWriter ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError writing JBM Trace data to file\n" ); + return IVAS_ERR_UNKNOWN; + } + } +#endif + if ( dataUnit ) + { + if ( dataUnit->partial_frame != 0 ) + { + hVoIP->lastDecodedWasActive = 1; + } + else + { + hVoIP->lastDecodedWasActive = !dataUnit->silenceIndicator; + } + + /* data unit memory is no longer used */ + JB4_FreeDataUnit( hVoIP->hJBM, dataUnit ); + } + + if ( !hIvasDec->hasBeenFedFirstGoodFrame ) + { + hIvasDec->nSamplesAvailableNext = hIvasDec->nSamplesFrame; + hIvasDec->nSamplesRendered = 0; + } + } + + /* decode */ + if ( !hIvasDec->hasBeenFedFirstGoodFrame ) + { + /* codec mode to use not known yet - simply output silence */ + /* directly set output zero */ + int16_t nSamplesToZero = min( nSamplesPerChannel, hIvasDec->nSamplesAvailableNext ); + set_s( pcmBuf + nSamplesRendered * nOutChannels, 0, nSamplesToZero * nOutChannels ); + nSamplesRendered += nSamplesToZero; + hIvasDec->nSamplesRendered += nSamplesToZero; + hIvasDec->nSamplesAvailableNext -= nSamplesToZero; + } + else + { + int16_t nSamplesToRender, nSamplesRendered_loop; + bool tmp; + nSamplesToRender = nSamplesPerChannel - nSamplesRendered; + + /* render IVAS frames directly to the output buffer */ + if ( ( error = IVAS_DEC_GetSamples( hIvasDec, nSamplesToRender, pcmBuf + nSamplesRendered * nOutChannels, &nSamplesRendered_loop, &tmp ) ) != IVAS_ERR_OK ) + { + return error; + } + + nSamplesRendered += nSamplesRendered_loop; + } + } + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * IVAS_DEC_VoIP_Flush( ) + * + * Function to flush remaining audio in VoIP + *---------------------------------------------------------------------*/ + +ivas_error IVAS_DEC_Flush( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const int16_t nSamplesPerChannel, /* i : number of samples per channel requested to be written to output buffer */ + int16_t *pcmBuf, /* i/o: buffer for decoded PCM output. The memory must already be allocated and be able to hold the expected number of output samples, based on frame size and number of output channels */ + int16_t *nSamplesFlushed /* o : number of samples flushed */ +) +{ + ivas_error error; + uint16_t nSamplesToRender; + uint16_t nSamplesFlushedLocal; + + *nSamplesFlushed = min( nSamplesPerChannel, hIvasDec->nSamplesAvailableNext ); + + nSamplesToRender = (uint16_t) *nSamplesFlushed; + + /* render IVAS frames */ + + error = IVAS_DEC_GetRenderedSamples( hIvasDec, nSamplesToRender, &nSamplesFlushedLocal, &hIvasDec->nSamplesAvailableNext, pcmBuf ); + + return error; +} + + +/*---------------------------------------------------------------------* + * IVAS_DEC_VoIP_IsEmpty( ) + * + * + *---------------------------------------------------------------------*/ + +bool IVAS_DEC_VoIP_IsEmpty( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const int16_t nSamplesAsked ) +{ + return ( ( JB4_bufferedDataUnits( hIvasDec->hVoIP->hJBM ) == 0 ) && ( hIvasDec->nSamplesAvailableNext < nSamplesAsked ) ); +} + + +/*---------------------------------------------------------------------* + * IVAS_DEC_VoIP_Get_CA_offset( ) + * + * + *---------------------------------------------------------------------*/ + +ivas_error IVAS_DEC_VoIP_Get_CA_offset( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + int16_t *optimum_offset, + int16_t *FEC_hi ) +{ + if ( hIvasDec == NULL || hIvasDec->hVoIP == NULL || hIvasDec->hVoIP->hJBM == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + *optimum_offset = JB4_getFECoffset( hIvasDec->hVoIP->hJBM ); + *FEC_hi = JB4_FECoffset( hIvasDec->hVoIP->hJBM ); + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * IVAS_DEC_Close_VoIP( ) + * + * + *---------------------------------------------------------------------*/ + +static void IVAS_DEC_Close_VoIP( + IVAS_DEC_VOIP *hVoIP /* i/o: IVAS decoder handle */ +) +{ + JB4_Destroy( &hVoIP->hJBM ); + + if ( hVoIP->bs_conversion_buf != NULL ) + { +#define WMC_TOOL_SKIP + /* Bitstream conversion is not counted towards complexity and memory usage */ + free( hVoIP->bs_conversion_buf ); +#undef WMC_TOOL_SKIP + } + + free( hVoIP ); + + return; +} + + +#ifdef SUPPORT_JBM_TRACEFILE +/*---------------------------------------------------------------------* + * store_JbmData() + * + * Store JBM trace data entry + *---------------------------------------------------------------------*/ + +static void store_JbmData( + IVAS_DEC_VOIP *hVoIP, + JB4_DATAUNIT_HANDLE dataUnit, + const uint32_t systemTimestamp_ms, + const uint16_t extBufferedSamples, + const int32_t output_Fs ) +{ + IVAS_JBM_TRACE_DATA *JbmTraceData; + + if ( hVoIP == NULL ) + { + return; + } + + JbmTraceData = &hVoIP->JbmTraceData; + + JbmTraceData->systemTimestamp_ms = systemTimestamp_ms; + JbmTraceData->extBufferedSamples = extBufferedSamples; + JbmTraceData->lastDecodedWasActive = hVoIP->lastDecodedWasActive; + JbmTraceData->output_Fs = output_Fs; + JbmTraceData->dataUnit_flag = dataUnit != NULL; + if ( dataUnit != NULL ) + { + JbmTraceData->sequenceNumber = dataUnit->sequenceNumber; + JbmTraceData->timeStamp = dataUnit->timeStamp; + JbmTraceData->rcvTime = dataUnit->rcvTime; + JbmTraceData->partial_frame = dataUnit->partial_frame; + JbmTraceData->partialCopyOffset = dataUnit->partialCopyOffset; + } + + return; +} + + +/*---------------------------------------------------------------------* + * IVAS_DEC_GetJbmData() + * + * + *---------------------------------------------------------------------*/ + +ivas_error IVAS_DEC_GetJbmData( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_JBM_TRACE_DATA *JbmTraceData /* o : JBM Trace data */ + +) +{ + if ( hIvasDec->hVoIP == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + *JbmTraceData = hIvasDec->hVoIP->JbmTraceData; + + return IVAS_ERR_OK; +} + +#endif + + +/*---------------------------------------------------------------------* + * IVAS_DEC_GetErrorMessage( ) + * + * Maps error codes to error description strings + *---------------------------------------------------------------------*/ + +const char *IVAS_DEC_GetErrorMessage( + ivas_error error /* i : decoder error code enum */ +) +{ + return ivas_error_to_string( error ); +} + + +/*---------------------------------------------------------------------* + * get_channel_config() + * + * Gets a str related to input config + *---------------------------------------------------------------------*/ + +static ivas_error get_channel_config( + AUDIO_CONFIG config, + char *str ) +{ + if ( config == IVAS_AUDIO_CONFIG_MONO ) + { + strcpy( str, "Mono" ); + } + else if ( config == IVAS_AUDIO_CONFIG_STEREO ) + { + strcpy( str, "Stereo" ); + } + else if ( config == IVAS_AUDIO_CONFIG_5_1 ) + { + strcpy( str, "Multichannel 5.1 (CICP6)" ); + } + else if ( config == IVAS_AUDIO_CONFIG_7_1 ) + { + strcpy( str, "Multichannel 7.1 (CICP12)" ); + } + else if ( config == IVAS_AUDIO_CONFIG_5_1_2 ) + { + strcpy( str, "Multichannel 5.1+2 (CICP14)" ); + } + else if ( config == IVAS_AUDIO_CONFIG_5_1_4 ) + { + strcpy( str, "Multichannel 5.1+4 (CICP16)" ); + } + else if ( config == IVAS_AUDIO_CONFIG_7_1_4 ) + { + strcpy( str, "Multichannel 7.1+4 (CICP19)" ); + } + else if ( config == IVAS_AUDIO_CONFIG_LS_CUSTOM ) + { + strcpy( str, "Multichannel (custom loudspeaker layout)" ); + } + else if ( config == IVAS_AUDIO_CONFIG_FOA ) + { + strcpy( str, "Ambisonics: First Order (FOA)" ); + } + else if ( config == IVAS_AUDIO_CONFIG_HOA2 ) + { + strcpy( str, "Ambisonics: Second Order (HOA2)" ); + } + else if ( config == IVAS_AUDIO_CONFIG_HOA3 ) + { + strcpy( str, "Ambisonics: Third Order (HOA3)" ); + } + else if ( config == IVAS_AUDIO_CONFIG_BINAURAL ) + { + strcpy( str, "Binaural: no room" ); + } + else if ( config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) + { + strcpy( str, "Binaural: room with impulse responses" ); + } + else if ( config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) + { + strcpy( str, "Binaural: room with reverb" ); + } + else if ( config == IVAS_AUDIO_CONFIG_EXTERNAL ) + { + strcpy( str, "External renderer" ); + } + else + { + return IVAS_ERROR( IVAS_ERR_INVALID_OUTPUT_FORMAT, "Error: Incorrect Input/Output Configuration" ); + } + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * printConfigInfo_dec( ) + * + * + *---------------------------------------------------------------------*/ + +static ivas_error printConfigInfo_dec( + Decoder_Struct *st_ivas, + const int16_t bitstreamformat, + const bool Opt_VOIP, + const bool quietModeEnabled ) +{ + ivas_error error; + char config_str[50]; + + /*-----------------------------------------------------------------* + * Print info on screen + *-----------------------------------------------------------------*/ + + fprintf( stdout, "\n" ); + + /*-----------------------------------------------------------------* + * Print output sampling frequency + *-----------------------------------------------------------------*/ + + fprintf( stdout, "Output sampling rate: %d Hz\n", st_ivas->hDecoderConfig->output_Fs ); + + /*-----------------------------------------------------------------* + * Print bitrate + *-----------------------------------------------------------------*/ + + if ( !quietModeEnabled ) + { + if ( !Opt_VOIP ) + { + fprintf( stdout, "Bitrate: %.2f kbps\n", (float) st_ivas->hDecoderConfig->ivas_total_brate / 1000 ); + + if ( st_ivas->hDecoderConfig->ivas_total_brate <= 0 ) + { + if ( bitstreamformat == G192 ) + { + fprintf( stdout, "Active Bitrate not identified in bitstream file \n" ); + } + else /* MIME */ + { + fprintf( stdout, "Active Bitrate not identified from first MIME frame \n" ); + } + } + } + } + + /*-----------------------------------------------------------------* + * Print output configuration + *-----------------------------------------------------------------*/ + + if ( st_ivas->ivas_format == MONO_FORMAT ) + { + if ( st_ivas->hDecoderConfig->Opt_non_diegetic_pan ) + { + fprintf( stdout, "Output configuration: mono EVS bit-exact decoding to stereo\n" ); + fprintf( stdout, "Non-diegetic panning: %.2f\n", st_ivas->hDecoderConfig->non_diegetic_pan_gain * 90.f ); + } + else + { + fprintf( stdout, "Output configuration: mono EVS bit-exact decoding\n" ); + } + } + else + { + if ( !quietModeEnabled ) + { + if ( st_ivas->ivas_format == STEREO_FORMAT ) + { + fprintf( stdout, "Input configuration: Stereo\n" ); + } + else if ( st_ivas->ivas_format == ISM_FORMAT ) + { + if ( st_ivas->ism_mode == ISM_MODE_PARAM ) + { + fprintf( stdout, "Input configuration: ISM (ParamISM): 2 transport channels\n" ); + } + else + { + fprintf( stdout, "Input configuration: ISM: %d transport channel(s)\n", st_ivas->nchan_transport ); + } + } + else if ( st_ivas->ivas_format == SBA_FORMAT ) + { + fprintf( stdout, "Input configuration: Scene Based Audio, Ambisonic order %i%s, %d transport channel(s)\n", st_ivas->sba_order, st_ivas->sba_planar ? " (Planar)" : "", st_ivas->nchan_transport ); + } + else if ( st_ivas->ivas_format == SBA_ISM_FORMAT ) + { + fprintf( stdout, "Input configuration: Combined Scene Based Audio, Ambisonic order %i, with %d Objects \n", st_ivas->sba_order, st_ivas->nchan_ism ); + } + else if ( st_ivas->ivas_format == MASA_FORMAT ) + { + fprintf( stdout, "Input configuration: MASA - %d channel(s)\n", st_ivas->nchan_transport ); + } + else if ( st_ivas->ivas_format == MC_FORMAT ) + { + if ( ( error = get_channel_config( st_ivas->transport_config, &config_str[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + + fprintf( stdout, "Input configuration: %s\n", config_str ); + } + else if ( st_ivas->ivas_format == MASA_ISM_FORMAT ) + { + fprintf( stdout, "Input configuration: combined ISM and MASA (%i ISM stream(s)) \n", st_ivas->nchan_ism ); + } + } + + get_channel_config( st_ivas->hDecoderConfig->output_config, &config_str[0] ); + fprintf( stdout, "Output configuration: %s\n", config_str ); + + if ( st_ivas->hDecoderConfig->Opt_HRTF_binary ) + { + fprintf( stdout, "HRIR/BRIR file: ON\n" ); + } + + if ( st_ivas->hDecoderConfig->Opt_RendConfigCustom ) + { + fprintf( stdout, "Renderer config. file: ON\n" ); + } + + if ( st_ivas->hDecoderConfig->Opt_Headrotation ) + { + fprintf( stdout, "Head rotation: ON\n" ); + } + + if ( st_ivas->hDecoderConfig->Opt_ExternalOrientation ) + { + fprintf( stdout, "External orientation: ON\n" ); + } + + if ( st_ivas->hDecoderConfig->orientation_tracking != IVAS_HEAD_ORIENT_TRK_NONE ) + { + switch ( st_ivas->hDecoderConfig->orientation_tracking ) + { + case IVAS_HEAD_ORIENT_TRK_AVG: + fprintf( stdout, "Orientation tracking: AVG\n" ); + break; + case IVAS_HEAD_ORIENT_TRK_REF: + fprintf( stdout, "Orientation tracking: REF\n" ); + break; + case IVAS_HEAD_ORIENT_TRK_REF_VEC: + fprintf( stdout, "Orientation tracking: REF_VEC\n" ); + break; + case IVAS_HEAD_ORIENT_TRK_REF_VEC_LEV: + fprintf( stdout, "Orientation tracking: REF_VEC_LEV\n" ); + break; + default: + break; + } + } + + if ( st_ivas->hDecoderConfig->Opt_non_diegetic_pan ) + { + fprintf( stdout, "Non-diegetic panning: %.2f\n", st_ivas->hDecoderConfig->non_diegetic_pan_gain * 90.f ); + } + + if ( st_ivas->hDecoderConfig->Opt_dpid_on ) + { + fprintf( stdout, "Directivity pattern: ON\n" ); + } + + if ( st_ivas->hDecoderConfig->Opt_aeid_on ) + { + fprintf( stdout, "Acoustic environment ID:ON\n" ); + } + } + + /*-----------------------------------------------------------------* + * Print TSM mode info + *-----------------------------------------------------------------*/ + + if ( st_ivas->hDecoderConfig->Opt_tsm ) + { + fprintf( stdout, "TSM mode: ON\n" ); + } + + /*-----------------------------------------------------------------* + * Print 5ms API mode info + *-----------------------------------------------------------------*/ + + if ( st_ivas->hDecoderConfig->Opt_5ms ) + { + fprintf( stdout, "API 5ms mode: ON\n" ); + } + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * IVAS_DEC_PrintConfig( ) + * + * Print decoder set-up info + *---------------------------------------------------------------------*/ + +void IVAS_DEC_PrintConfig( + const IVAS_DEC_HANDLE hIvasDec, + const bool quietModeEnabled, + const bool voipMode ) +{ + printConfigInfo_dec( hIvasDec->st_ivas, hIvasDec->bitstreamformat, voipMode, quietModeEnabled ); + + return; +} + + + + +/*---------------------------------------------------------------------* + * IVAS_DEC_PrintDisclaimer( ) + * + * Print IVAS disclaimer to console + *---------------------------------------------------------------------*/ + +void IVAS_DEC_PrintDisclaimer( void ) +{ + print_disclaimer( stderr ); + + return; +} + + +/*---------------------------------------------------------------------* + * evs_dec_main( ) + * + * EVS codec main decoder fucntion + *---------------------------------------------------------------------*/ + +static ivas_error evs_dec_main( + Decoder_Struct *st_ivas, + const int16_t nOutSamples, + float *floatBuf, + int16_t *pcmBuf ) +{ + DEC_CORE_HANDLE *hCoreCoder; + float output[MAX_OUTPUT_CHANNELS_IN_DIEGETIC_PAN][L_FRAME48k]; + float mixer_left, mixer_rigth; + float *p_output[MAX_OUTPUT_CHANNELS_IN_DIEGETIC_PAN]; + int16_t ch; + ivas_error error; + + hCoreCoder = st_ivas->hSCE[0]->hCoreCoder; + hCoreCoder[0]->total_brate = st_ivas->hDecoderConfig->ivas_total_brate; + + mdct_switching_dec( hCoreCoder[0] ); + + for ( ch = 0; ch < MAX_OUTPUT_CHANNELS_IN_DIEGETIC_PAN; ch++ ) + { + p_output[ch] = output[ch]; + } + + /* run the main EVS decoding routine */ + if ( hCoreCoder[0]->codec_mode == MODE1 ) + { + if ( hCoreCoder[0]->Opt_AMR_WB ) + { + if ( ( error = amr_wb_dec( hCoreCoder[0], st_ivas->mem_hp20_out[0], output[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + if ( ( error = evs_dec( hCoreCoder[0], st_ivas->mem_hp20_out[0], output[0], FRAMEMODE_NORMAL ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + else + { + if ( hCoreCoder[0]->bfi == 0 ) + { + if ( ( error = evs_dec( hCoreCoder[0], st_ivas->mem_hp20_out[0], output[0], FRAMEMODE_NORMAL ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( hCoreCoder[0]->bfi == 2 ) + { + if ( ( error = evs_dec( hCoreCoder[0], st_ivas->mem_hp20_out[0], output[0], FRAMEMODE_FUTURE ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + if ( ( error = evs_dec( hCoreCoder[0], st_ivas->mem_hp20_out[0], output[0], FRAMEMODE_MISSING ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + + st_ivas->BER_detect = hCoreCoder[0]->BER_detect; + + if ( st_ivas->renderer_type == RENDERER_NON_DIEGETIC_DOWNMIX ) + { + mixer_left = ( st_ivas->hDecoderConfig->non_diegetic_pan_gain + 1.f ) * 0.5f; + mixer_rigth = 1.f - mixer_left; + v_multc( output[0], mixer_rigth, output[1], nOutSamples ); + v_multc( output[0], mixer_left, output[0], nOutSamples ); + } + + if ( !st_ivas->hDecoderConfig->Opt_tsm && st_ivas->hDecoderConfig->Opt_5ms ) + { + ivas_jbm_dec_copy_tc_no_tsm( st_ivas, p_output, nOutSamples ); + } + else if ( floatBuf != NULL ) + { + /* BE workaround */ + int16_t pcm_buf_local[L_FRAME48k * MAX_OUTPUT_CHANNELS_IN_DIEGETIC_PAN]; + + /* convert 'float' output data to 'short' */ + ivas_syn_output( p_output, nOutSamples, st_ivas->hDecoderConfig->nchan_out, pcm_buf_local ); + mvs2r( pcm_buf_local, floatBuf, nOutSamples * st_ivas->hDecoderConfig->nchan_out ); + } + else + { + ivas_syn_output( p_output, nOutSamples, st_ivas->hDecoderConfig->nchan_out, pcmBuf ); + } + + return IVAS_ERR_OK; +} + + + + +/*---------------------------------------------------------------------* + * input_format_API_to_internal() + * + * + *---------------------------------------------------------------------*/ + +static ivas_error input_format_API_to_internal( + IVAS_DEC_INPUT_FORMAT input_format, + int16_t *bitstream_format_internal, + int16_t *sdp_hf_only, + const bool is_voip_enabled ) +{ + switch ( input_format ) + { + case IVAS_DEC_INPUT_FORMAT_G192: + *bitstream_format_internal = is_voip_enabled ? VOIP_G192_RTP : G192; + *sdp_hf_only = 0; + break; + case IVAS_DEC_INPUT_FORMAT_MIME: + *bitstream_format_internal = MIME; + *sdp_hf_only = 0; + break; + case IVAS_DEC_INPUT_FORMAT_RTPDUMP: + assert( is_voip_enabled && "RTP dump only supported in VoIP mode" ); + *bitstream_format_internal = VOIP_RTPDUMP; + *sdp_hf_only = 0; + break; + case IVAS_DEC_INPUT_FORMAT_RTPDUMP_HF: + assert( is_voip_enabled && "RTP dump only supported in VoIP mode" ); + *bitstream_format_internal = VOIP_RTPDUMP; + *sdp_hf_only = 1; + break; + default: + return IVAS_ERR_INVALID_BITSTREAM; + break; + } + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * IVAS_DEC_VoIP_GetRenderGranularity() + * + * + *---------------------------------------------------------------------*/ + +static int16_t IVAS_DEC_VoIP_GetRenderGranularity( + Decoder_Struct *st_ivas ) +{ + return st_ivas->hTcBuffer->n_samples_granularity; +} + + +/*---------------------------------------------------------------------* + * IVAS_DEC_VoIP_reconfigure() + * + * + *---------------------------------------------------------------------*/ + +static ivas_error IVAS_DEC_VoIP_reconfigure( + IVAS_DEC_HANDLE hIvasDec, + const uint16_t nTransportChannels, + const uint16_t l_ts ) +{ + int16_t apa_buffer_size; + + apa_buffer_size = hIvasDec->nSamplesFrame; + + if ( hIvasDec->apaExecBuffer == NULL ) + { + DECODER_CONFIG_HANDLE hDecoderConfig; + + if ( hIvasDec->st_ivas->hDecoderConfig->Opt_tsm ) + { + uint16_t wss, css; + float startQuality; + + startQuality = 1.0f; + apa_buffer_size = APA_BUF_PER_CHANNEL; + + /* get current renderer type*/ + hDecoderConfig = hIvasDec->st_ivas->hDecoderConfig; + + if ( hDecoderConfig->output_Fs == 8000 ) + { + wss = 1; + css = 1; + } + else if ( hDecoderConfig->output_Fs == 16000 ) + { + wss = 2; + css = 1; + } + else if ( hDecoderConfig->output_Fs == 32000 ) + { + wss = 4; + css = 2; + } + else if ( hDecoderConfig->output_Fs == 48000 ) + { + wss = 6; + css = 3; + } + else + { + return IVAS_ERR_INIT_ERROR; + } + + if ( apa_init( &hIvasDec->hTimeScaler, nTransportChannels ) != IVAS_ERR_OK || + apa_set_rate( hIvasDec->hTimeScaler, hDecoderConfig->output_Fs ) != 0 || + apa_set_complexity_options( hIvasDec->hTimeScaler, wss, css ) != 0 || + apa_set_quality( hIvasDec->hTimeScaler, startQuality, 4, 4 ) != 0 || + apa_set_renderer_granularity( hIvasDec->hTimeScaler, l_ts ) != 0 ) + { + return IVAS_ERR_INIT_ERROR; + } + + if ( hIvasDec->mode == IVAS_DEC_MODE_EVS ) + { + if ( apa_set_evs_compat_mode( hIvasDec->hTimeScaler, true ) != 0 ) + { + return IVAS_ERR_INIT_ERROR; + } + } + + if ( ( hIvasDec->apaExecBuffer = malloc( sizeof( float ) * apa_buffer_size * nTransportChannels ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate VoIP handle" ); + } + + set_zero( hIvasDec->apaExecBuffer, apa_buffer_size * nTransportChannels ); + } + } + else + { + if ( hIvasDec->st_ivas->hDecoderConfig->Opt_tsm ) + { + if ( apa_reconfigure( hIvasDec->hTimeScaler, nTransportChannels, l_ts ) != 0 ) + { + return IVAS_ERR_INIT_ERROR; + } + apa_buffer_size = APA_BUF_PER_CHANNEL; + free( hIvasDec->apaExecBuffer ); + if ( ( hIvasDec->apaExecBuffer = malloc( sizeof( float ) * apa_buffer_size * nTransportChannels ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate VoIP handle" ); + } + set_zero( hIvasDec->apaExecBuffer, apa_buffer_size * nTransportChannels ); + } + /* realloc apa_exe_buffer */ + } + + hIvasDec->nTransportChannelsOld = nTransportChannels; + + return IVAS_ERR_OK; +} + + + + diff --git a/lib_dec/lib_dec.h b/lib_dec/lib_dec.h new file mode 100644 index 0000000000000000000000000000000000000000..fdb92e61b1d96ed805a8d0b623c197da883da8fa --- /dev/null +++ b/lib_dec/lib_dec.h @@ -0,0 +1,384 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#ifndef LIB_DEC_H +#define LIB_DEC_H + +#include "common_api_types.h" +#include + +/*---------------------------------------------------------------------* + * Decoder enums + *---------------------------------------------------------------------*/ + +/* mode the decoder is operating in */ +typedef enum _IVAS_DEC_MODE +{ + IVAS_DEC_MODE_EVS = 0x0001, + IVAS_DEC_MODE_IVAS +} IVAS_DEC_MODE; + +typedef enum +{ + IVAS_DEC_INPUT_FORMAT_UNDEF = 0, + IVAS_DEC_INPUT_FORMAT_G192 = 1, + IVAS_DEC_INPUT_FORMAT_MIME = 2, + IVAS_DEC_INPUT_FORMAT_RTPDUMP = 3, + IVAS_DEC_INPUT_FORMAT_RTPDUMP_HF = 4, /* RTP payload: only Header-Full format without zero padding for size collision avoidance */ +} IVAS_DEC_INPUT_FORMAT; + +typedef enum _IVAS_DEC_COMPLEXITY_LEVEL +{ + IVAS_DEC_COMPLEXITY_LEVEL_ONE = 1, + IVAS_DEC_COMPLEXITY_LEVEL_TWO = 2, + IVAS_DEC_COMPLEXITY_LEVEL_THREE = 3 +} IVAS_DEC_COMPLEXITY_LEVEL; + + + + + +/* bitstream formats that can be consumed */ +typedef enum _IVAS_DEC_BS_FORMAT +{ + IVAS_DEC_BS_MONO = 0x0001, /* EVS-compatible mono bitstream */ + IVAS_DEC_BS_STEREO, + IVAS_DEC_BS_MC, + IVAS_DEC_BS_SBA, + IVAS_DEC_BS_SBA_ISM, + IVAS_DEC_BS_OBJ, + IVAS_DEC_BS_MASA, + IVAS_DEC_BS_MASA_ISM, + IVAS_DEC_BS_UNKOWN = 0xffff +} IVAS_DEC_BS_FORMAT; + +typedef struct IVAS_DEC *IVAS_DEC_HANDLE; + +#ifdef SUPPORT_JBM_TRACEFILE +/* Callback function for JBM tracefile writing */ +typedef ivas_error ( *JbmTraceFileWriterFn )( const void *data, void *writer ); +#endif + + +/* clang-format off */ +/*---------------------------------------------------------------------* + * Decoder function declarations + *---------------------------------------------------------------------*/ + +/* Open, configure, close functions - should be called once per decoder lifetime */ + +/*! r: error code */ +ivas_error IVAS_DEC_Open( + IVAS_DEC_HANDLE *phIvasDec, /* i/o: pointer to an IVAS decoder handle to be opened */ + IVAS_DEC_MODE mode /* i : compatibility mode (EVS or IVAS) */ +); + +/*! r: error code */ +ivas_error IVAS_DEC_Configure( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const uint32_t sampleRate, /* i : output sampling frequency */ + const IVAS_AUDIO_CONFIG outputConfig, /* i : audio configuration */ + const int16_t tsmEnabled, /* i : enable TSM */ + const int16_t enable5ms, /* i : enable 5ms rendering path */ + const int16_t customLsOutputEnabled, /* i : enable custom loudspeaker setup handle */ + const int16_t hrtfReaderEnabled, /* i : enable HRTF binary file input */ + const int16_t enableHeadRotation, /* i : enable head rotation for binaural output */ + const int16_t enableExternalOrientation, /* i : enable external orientations */ + const IVAS_HEAD_ORIENT_TRK_T orientation_tracking, /* i : head orientation tracking type */ + const int16_t renderConfigEnabled, /* i : enable Renderer config. file for binaural output */ + const int16_t Opt_non_diegetic_pan, /* i : diegetic or not */ + const float non_diegetic_pan_gain, /* i : non diegetic panning gain */ + const int16_t Opt_dpid_on, /* i : enable directivity pattern option */ + const uint16_t acousticEnvironmentId, /* i : Acoustic environment ID */ + const int16_t delayCompensationEnabled /* i : enable delay compensation */ +); + +void IVAS_DEC_Close( + IVAS_DEC_HANDLE *phIvasDec /* i/o: pointer to IVAS decoder handle */ +); + + +/* Decoding functions - should be called with a configured decoder handle */ + +/*! r: error code */ +ivas_error IVAS_DEC_FeedFrame_Serial( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + uint16_t *serial, /* i : buffer containing serial input bitstream. Each bit should be stored as a single uint16_t value */ + const uint16_t num_bits, /* i : number of bits in input bitstream */ + int16_t bfi /* i : bad frame indicator flag */ +); + +/*! r: decoder error code */ +ivas_error IVAS_DEC_GetSamples( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const int16_t nSamplesAsked, /* i : number of samples wanted by the caller */ + int16_t *pcmBuf, /* i/o: buffer for decoded PCM output. The memory must already be allocated and be able to hold the expected number of output samples, based on frame size and number of output channels */ + int16_t *nOutSamples, /* o : number of samples per channel written to output buffer */ + bool *needNewFrame /* o : indication that the decoder needs a new frame */ +); + + +/*! r: error code */ +ivas_error IVAS_DEC_GetObjectMetadata( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_ISM_METADATA *metadata, /* o : struct where metadata decoded in most recently decoded frame will be written */ + const uint16_t zero_flag, /* i : if this flag is enabled, this function outputs a zero-initialized metadata struct */ + const uint16_t objectIdx /* i : index of the queried object */ +); + +/*! r: error code */ +ivas_error IVAS_DEC_GetMasaMetadata( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_MASA_DECODER_EXT_OUT_META_HANDLE *hMasaExtOutMeta, /* o : pointer to handle, which will be set to point to metadata from the most recently decoded frame */ + const uint8_t getFromJbmBuffer /* i : get metadata from a JBM buffer */ +); + +/*! r: error code */ +ivas_error IVAS_DEC_FeedHeadTrackData( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_QUATERNION orientation, /* i : head-tracking data, listener orientation */ + IVAS_VECTOR3 Pos, /* i : listener position */ + const int16_t subframe_idx /* i : subframe index */ +); + +/*! r: error code */ +ivas_error IVAS_DEC_FeedRefRotData( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_QUATERNION rotation /* i : reference rotation data */ +); + +/*! r: error code */ +ivas_error IVAS_DEC_FeedRefVectorData( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const IVAS_VECTOR3 listenerPos, /* i : Listener position */ + const IVAS_VECTOR3 refPos /* i : Reference position */ +); + +/*! r: error code */ +ivas_error IVAS_DEC_FeedExternalOrientationData( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_QUATERNION orientation, /* i : external orientation data */ + int8_t enableHeadRotation, /* i : flag to enable head rotation for this frame */ + int8_t enableExternalOrientation, /* i : flag to enable external orientation for this frame */ + int8_t enableRotationInterpolation, /* i : flag to interpolate rotations from current and previous frames */ + int16_t numFramesToTargetOrientation, /* i : number of frames until target orientation is reached */ + const int16_t subframe_idx /* i : subframe index */ +); + +/*! r: error code */ +ivas_error IVAS_DEC_VoIP_FeedFrame( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + uint8_t *au, /* i : buffer containing input access unit */ + const uint16_t auSize, /* i : size of the access unit */ + const uint16_t rtpSequenceNumber, /* i : RTP sequence number (16 bits) */ + const uint32_t rtpTimeStamp, /* i : RTP timestamp (32 bits) */ + const uint32_t rcvTime_ms, /* i : receive time of the RTP packet in milliseconds */ + const bool qBit /* i : Q bit for AMR-WB IO */ +); + +ivas_error IVAS_DEC_VoIP_SetScale( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const int16_t maxScaling, /* i : maximum allowed TSM scale */ + const int16_t scale /* i : TSM scale to set */ +); + +/*! r: error code */ +ivas_error IVAS_DEC_VoIP_GetSamples( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + uint16_t nSamplesPerChannel, /* i : number of samples per channel requested to be written to output buffer */ + int16_t *pcmBuf, /* i/o: buffer for decoded PCM output. The memory must already be allocated and be able to hold the expected number of output samples, based on frame size and number of output channels */ + const uint32_t systemTimestamp_ms /* i : current system timestamp */ +#ifdef SUPPORT_JBM_TRACEFILE + , JbmTraceFileWriterFn jbmWriterFn, + void* jbmWriter +#endif +); + +ivas_error IVAS_DEC_Flush( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const int16_t nSamplesPerChannel, /* i : number of samples per channel requested to be written to output buffer */ + int16_t *pcmBuf, /* i/o: buffer for decoded PCM output. The memory must already be allocated and be able to hold the expected number of output samples, based on frame size and number of output channels */ + int16_t *nSamplesFlushed /* o : number of samples flushed */ +); + +/* Setter functions - apply changes to decoder configuration */ + +/*! r: error code */ +ivas_error IVAS_DEC_EnableVoIP( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const int16_t jbmSafetyMargin, /* i : allowed delay reserve for JBM, in milliseconds */ + const IVAS_DEC_INPUT_FORMAT inputFormat /* i : format of the input bitstream */ +); + + +ivas_error IVAS_DEC_Set5msFlag( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const int16_t enable5ms /* i : 5ms flag */ +); + +ivas_error IVAS_DEC_Get5msFlag( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + int16_t *enable5ms /* o : 5ms flag */ +); + + +/* Getter functions - retrieve information from a decoder through a handle */ + +/*! r: error code */ +ivas_error IVAS_DEC_GetNumObjects( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + uint16_t *numObjects /* o : number of objects for which the decoder has been configured */ +); + +/*! r: error code */ +ivas_error IVAS_DEC_GetFormat( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_DEC_BS_FORMAT *format /* o : format detected from bitstream fed to the decoder */ +); + +/*! r: error code */ +ivas_error IVAS_DEC_GetOutputBufferSize( + const IVAS_DEC_HANDLE hIvasDec, /* i : IVAS decoder handle */ + int16_t *outputBufferSize /* o : total number of samples expected in the output buffer for current decoder configuration */ +); + +/*! r: error code */ +ivas_error IVAS_DEC_GetNumOutputChannels( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + int16_t *numOutputChannels /* o : number of PCM output channels */ +); + +/*! r: error code */ +ivas_error IVAS_DEC_FeedCustomLsData( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const IVAS_CUSTOM_LS_DATA hLsCustomData /* i : Custom loudspeaker setup data */ +); + +/*! r: error code */ +ivas_error IVAS_DEC_GetHrtfHandle( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_DEC_HRTF_HANDLE *hHrtfTD /* o : HRTF handle */ +); + +/*! r: error code */ +ivas_error IVAS_DEC_GetHrtfCRendHandle( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_DEC_HRTF_CREND_HANDLE *hSetOfHRTF /* o : Set of HRTF handle */ +); + +ivas_error IVAS_DEC_GetHrtfFastConvHandle( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_DEC_HRTF_FASTCONV_HANDLE *hHrtfFastConv /* o : FASTCONV HRTF handle */ +); + +ivas_error IVAS_DEC_GetHrtfParamBinHandle( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_DEC_HRTF_PARAMBIN_HANDLE *hHrtfParambin /* o : Parametric binauralizer HRTF handle */ +); + + +/*! r: error code*/ +ivas_error IVAS_DEC_GetRenderConfig( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const IVAS_RENDER_CONFIG_HANDLE hRCout /* o : Render config handle */ +); + +/*! r: error code*/ +ivas_error IVAS_DEC_GetDefaultRenderConfig( + IVAS_RENDER_CONFIG_HANDLE hRCout /* o : Render config handle */ +); + +/*! r: error code*/ +ivas_error IVAS_DEC_FeedRenderConfig( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const IVAS_RENDER_CONFIG_DATA hRenderConfig /* i : Render config data structure */ +); + +/*! r: error code */ +ivas_error IVAS_DEC_GetDelay( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + int16_t *nSamples, /* o : decoder delay in samples */ + int32_t *timeScale /* o : time scale of the delay, equal to decoder output sampling rate */ +); + +/*! r: error code */ +ivas_error IVAS_DEC_HasDecodedFirstGoodFrame( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + bool *hasDecodedFirstGoodFrame /* o : flag indicating if the decoder has decoded a good frame since it was configured */ +); + +/*! r: error code */ +ivas_error IVAS_DEC_GetPcmFrameSize( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + int32_t *pcmFrameSize /* o : total size of the PCM output frame. This takes into account the number of output channels */ +); + +/*! r: true if decoder has no data in VoIP jitter buffer */ +bool IVAS_DEC_VoIP_IsEmpty( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const int16_t nSamplesAsked +); + +ivas_error IVAS_DEC_VoIP_Get_CA_offset( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + int16_t *optimum_offset, + int16_t *FEC_hi +); + +#ifdef SUPPORT_JBM_TRACEFILE +ivas_error IVAS_DEC_GetJbmData( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_JBM_TRACE_DATA *JbmTraceData /* o : JBM Trace data */ +); +#endif + +/* Utility functions */ + +/*! r: pointer to an error message string */ +const char *IVAS_DEC_GetErrorMessage( + ivas_error error /* i : decoder error code enum */ +); + +void IVAS_DEC_PrintConfig( + const IVAS_DEC_HANDLE hIvasDec, /* i : IVAS decoder handle */ + const bool quietModeEnabled, /* i : quiet mode flag: if true, reduces the amount of config info printed */ + const bool voipMode +); + + +void IVAS_DEC_PrintDisclaimer( + void +); + +/* clang-format on */ + +#endif diff --git a/lib_dec/lp_exc_d.c b/lib_dec/lp_exc_d.c new file mode 100644 index 0000000000000000000000000000000000000000..65457e6300598c82bec67199c2f5369e69426c8d --- /dev/null +++ b/lib_dec/lp_exc_d.c @@ -0,0 +1,100 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "prot.h" +#include "wmc_auto.h" + +/*---------------------------------------------------------------------* + * lp_filt_exc_dec() + * + * Low-pass filtering of the adaptive exctitation + *---------------------------------------------------------------------*/ + +void lp_filt_exc_dec( + Decoder_State *st, /* i/o: decoder state structure */ + const int16_t codec_mode, /* i : codec mode */ + const int16_t i_subfr, /* i : subframe index */ + const int16_t L_subfr, /* i : subframe size */ + const int16_t L_frame, /* i : frame size */ + int16_t lp_flag, /* i : operation mode signaling */ + float *exc /* i/o: pointer to the excitation signal frame */ +) +{ + int16_t i; + float code[L_FRAME]; + + /*-----------------------------------------------------------------* + * Select LP filtering of the adaptive excitation + *-----------------------------------------------------------------*/ + + if ( codec_mode == MODE1 ) + { + if ( lp_flag == NORMAL_OPERATION ) + { + lp_flag = get_next_indice( st, 1 ); + } + } + + /*--------------------------------------------------------------------* + * Find pitch excitation with LP filter + *--------------------------------------------------------------------*/ + + if ( lp_flag == LOW_PASS ) + { + /* pointer positionning to avoid doing it inside the loop */ + if ( codec_mode == MODE2 && L_frame == L_FRAME16k ) + { + for ( i = 0; i < L_subfr; i++ ) + { + code[i] = (float) ( 0.21f * exc[i - 1 + i_subfr] + 0.58f * exc[i + i_subfr] + 0.21f * exc[i + 1 + i_subfr] ); + } + } + else + { + for ( i = 0; i < L_subfr; i++ ) + { + code[i] = (float) ( 0.18f * exc[i - 1 + i_subfr] + 0.64f * exc[i + i_subfr] + 0.18f * exc[i + 1 + i_subfr] ); + } + } + + mvr2r( code, &exc[i_subfr], L_subfr ); + } + + return; +} diff --git a/lib_dec/lsf_dec.c b/lib_dec/lsf_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..4e5871fea107d684376eb10ec4796a387de990ae --- /dev/null +++ b/lib_dec/lsf_dec.c @@ -0,0 +1,790 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "basop_proto_func.h" +#include "ivas_prot.h" +#include "ivas_rom_com.h" +#include "wmc_auto.h" + + +/*---------------------------------------------------------------------* + * Local function prototypes + *---------------------------------------------------------------------*/ + +static void lsf_mid_dec( Decoder_State *st, const float lsp_new[], const int16_t coder_type, float lsp_mid[] ); + +static void dqlsf_CNG( Decoder_State *st, float *lsf_q ); + + +/*---------------------------------------------------------------------* + * lsf_dec() + * + * LSF decoder + *---------------------------------------------------------------------*/ + +void lsf_dec( + Decoder_State *st, /* i/o: State structure */ + const int16_t tc_subfr, /* i : TC subframe index */ + float *Aq, /* o : quantized A(z) for 4 subframes */ + int16_t *LSF_Q_prediction, /* o : LSF prediction mode */ + float *lsf_new, /* o : de-quantized LSF vector */ + float *lsp_new, /* o : de-quantized LSP vector */ + float *lsp_mid, /* o : de-quantized mid-frame LSP vector */ + const int16_t tdm_low_rate_mode, /* i : secondary channel low rate mode flag */ + const float tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel */ +) +{ + int16_t i, nBits, coder_type, no_param_lpc; + int16_t param_lpc[NPRM_LPC_NEW]; + float tmp_old[M + 1], tmp_new[M + 1], enr_old, enr_new; + float lsf_diff; + + coder_type = st->coder_type; + if ( st->core_brate == SID_2k40 ) + { + coder_type = INACTIVE; + } + + if ( coder_type == AUDIO && st->GSC_IVAS_mode > 0 ) + { + coder_type = GENERIC; + } + + /* initialize */ + no_param_lpc = 0; + + /* Find the number of bits for LSF quantization */ + nBits = 0; + if ( st->core_brate == SID_2k40 ) + { + nBits = LSF_BITS_CNG; + } + else + { + if ( st->nelp_mode_dec == 0 && st->ppp_mode_dec == 0 ) + { + nBits = st->acelp_cfg.lsf_bits; + } + else if ( st->nelp_mode_dec == 1 ) + { + if ( coder_type == UNVOICED ) + { + if ( st->bwidth == NB ) + { + nBits = 32; + } + else + { + nBits = 30; + } + } + } + else if ( st->ppp_mode_dec == 1 ) + { + nBits = 26; + } + } + + /* LSF de-quantization */ + lsf_end_dec( st, coder_type, st->bwidth, nBits, lsf_new, param_lpc, LSF_Q_prediction, &no_param_lpc, + tdm_lsfQ_PCh ); + + /* convert quantized LSFs to LSPs */ + lsf2lsp( lsf_new, lsp_new, M, st->sr_core ); + + /* set seed_acelp used in UC mode */ + if ( coder_type == UNVOICED && st->element_mode > EVS_MONO ) + { + st->seed_acelp = 0; + for ( i = no_param_lpc - 1; i >= 0; i-- ) + { + /* rightshift before *seed_acelp+param_lpc[i] to avoid overflows*/ + st->seed_acelp = (int16_t) ( ( ( ( st->seed_acelp ) >> 1 ) + param_lpc[i] ) * 31821L + 13849L ); + } + } + + if ( st->core_brate == SID_2k40 ) + { + /* return if SID frame (conversion to A(z) done in the calling function) */ + return; + } + + /*-------------------------------------------------------------------------------------* + * FEC - update adaptive LSF mean vector + *-------------------------------------------------------------------------------------*/ + + for ( i = 0; i < M; i++ ) + { + st->lsf_adaptive_mean[i] = ( st->lsfoldbfi1[i] + st->lsfoldbfi0[i] + lsf_new[i] ) / 3; + } + + if ( st->prev_bfi && coder_type == TRANSITION && ( tc_subfr == ( st->L_frame - L_SUBFR ) ) ) + { + lsf_diff = st->sr_core / (float) ( 2 * ( M + 1 ) ); + st->lsf_old[0] = lsf_diff; + + for ( i = 1; i < M; i++ ) + { + st->lsf_old[i] = st->lsf_old[i - 1] + lsf_diff; + } + + lsf2lsp( st->lsf_old, st->lsp_old, M, st->sr_core ); + } + + /*-------------------------------------------------------------------------------------* + * Mid-frame LSF decoding + * LSP interpolation and conversion of LSPs to A(z) + *-------------------------------------------------------------------------------------*/ + + if ( st->rate_switching_reset ) + { + /* extrapolation in case of unstable LSF convert */ + mvr2r( lsp_new, st->lsp_old, M ); + mvr2r( lsf_new, st->lsf_old, M ); + } + + lsf_mid_dec( st, lsp_new, coder_type, lsp_mid ); + + if ( !( st->prev_bfi && ( coder_type == TRANSITION ) && ( tc_subfr == ( st->L_frame - L_SUBFR ) ) ) ) + { + if ( st->prev_bfi ) + { + /* check, if LSP interpolation can be relaxed */ + lsp2a_stab( st->lsp_old, tmp_old, M ); + enr_old = enr_1_Az( tmp_old, 2 * L_SUBFR ); + + lsp2a_stab( lsp_new, tmp_new, M ); + enr_new = enr_1_Az( tmp_new, 2 * L_SUBFR ); + + if ( enr_new / enr_old < 0.3f ) + { + st->relax_prev_lsf_interp = -1; + if ( st->clas_dec == UNVOICED_CLAS || st->clas_dec == SIN_ONSET || st->clas_dec == INACTIVE_CLAS || coder_type == GENERIC || coder_type == TRANSITION ) + { + st->relax_prev_lsf_interp = 1; + } + } + } + } + + if ( st->last_core == HQ_CORE && st->core == ACELP_CORE ) + { + /* update old LSPs/LSFs in case of HQ->ACELP core switching */ + mvr2r( lsp_mid, st->lsp_old, M ); + lsp2lsf( lsp_mid, st->lsf_old, M, st->sr_core ); + } + + if ( tdm_low_rate_mode == 1 && coder_type > UNVOICED ) + { + if ( st->active_cnt == 1 ) + { + mvr2r( lsp_mid, st->lsp_old, M ); + lsp2lsf( lsp_mid, st->lsf_old, M, st->sr_core ); + mvr2r( lsp_new, lsp_mid, M ); + } + + /* LSP interpolation and conversion of LSPs to A(z) - two-subframe mode */ + int_lsp4( st->L_frame, st->lsp_old, lsp_mid, lsp_new, Aq, M, -2 ); + } + else + { + /* LSP interpolation and conversion of LSPs to A(z) */ + int_lsp4( st->L_frame, st->lsp_old, lsp_mid, lsp_new, Aq, M, st->relax_prev_lsf_interp ); + } + + /*------------------------------------------------------------------* + * Check LSF stability (distance between old LSFs and current LSFs) + *------------------------------------------------------------------*/ + + st->stab_fac = lsf_stab( lsf_new, st->lsf_old, 0, st->L_frame ); + + return; +} + + +/*------------------------------------------------------------------------------------------* + * lsf_end_dec() + * + * De-quantize frame end LSF vector + *------------------------------------------------------------------------------------------*/ + +void lsf_end_dec( + Decoder_State *st, /* i/o: decoder state structure */ + const int16_t coder_type_org, /* i : coding type */ + const int16_t bwidth, /* i : input signal bandwidth */ + const int16_t nBits_in, /* i : number of bits used for ISF quantization*/ + float *qlsf, /* o : quantized LSFs in the cosine domain */ + int16_t *lpc_param, /* i : LPC parameters */ + int16_t *LSF_Q_prediction, /* o : LSF prediction mode */ + int16_t *nb_indices, /* o : number of indices */ + const float tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel */ +) +{ + float pred0[M]; /* Prediction for the safety-net quantizer (usually mean)*/ + float pred1[M], pred2[M]; /* Prediction for the predictive quantizer*/ + int16_t stages0; /* Amount of stages used by safety-net quantizer*/ + int16_t stages1; /* Amount of stages used by predictive quantizer*/ + int16_t levels0[MAX_VQ_STAGES]; /* Sizes of different codebook stages for safety-net quantizer*/ + int16_t levels1[MAX_VQ_STAGES]; /* Sizes of different codebook stages for predictive quantizer*/ + int16_t i; + int16_t TCQIdx[M / 2 + 4]; + int16_t bits0[MAX_VQ_STAGES], bits1[MAX_VQ_STAGES]; + int16_t cumleft; + int16_t lindice[MAX_VQ_STAGES + 3]; /* Predictor selector needs 1 bit and the LVQ indice uses 3 shorts */ + int16_t mode_lvq, mode_lvq_p; + int16_t safety_net, predmode, stages, *levels; + const int16_t *Bit_alloc1 = NULL, *bits; + int16_t num_bits; + int16_t *p_lpc_param; + int16_t nBits; + int16_t coder_type; + int16_t flag_1bit_gran; + float pred3[M]; + + flag_1bit_gran = ( st->element_mode > EVS_MONO ); + nBits = nBits_in; + *nb_indices = 0; + + if ( coder_type_org == GENERIC && st->sr_core == INT_FS_16k && st->codec_mode == MODE1 && st->idchan == 0 ) + { + /* this bit is used only for primary channel or mono */ + coder_type = get_next_indice( st, 1 ); + coder_type += 2; + if ( coder_type == GENERIC || ( coder_type == VOICED && flag_1bit_gran == 1 ) ) + { + nBits--; + } + } + else + { + coder_type = coder_type_org; + } + + /*--------------------------------------------------------------------------------* + * LSF de-quantization of SID frames + *--------------------------------------------------------------------------------*/ + + if ( st->core_brate == SID_2k40 ) + { + dqlsf_CNG( st, qlsf ); + v_sort( qlsf, 0, M - 1 ); + reorder_lsf( qlsf, MODE1_LSF_GAP, M, st->sr_core ); + + return; + } + + find_pred_mode( &predmode, coder_type, bwidth, st->sr_core, &mode_lvq, &mode_lvq_p, st->total_brate ); + + /*----------------------------------------------------------------* + * Calculate number of stages and levels for each stage based on the allowed bit allocation + * (subtract one bit for LSF predictor selection) + *----------------------------------------------------------------*/ + + lsf_allocate( nBits - ( predmode >> 1 ), mode_lvq, mode_lvq_p, &stages0, &stages1, levels0, levels1, bits0, bits1 ); + + /*--------------------------------------------------------------------------* + * Select safety_net or predictive mode + *--------------------------------------------------------------------------*/ + + p_lpc_param = lpc_param; + + if ( st->tdm_LRTD_flag == 0 && st->idchan == 1 && tdm_lsfQ_PCh != NULL ) + { + /* if secondary channel predmode is set to be > 2 */ + predmode += 3; + } + + if ( predmode == 0 ) + { + safety_net = 1; + } + else if ( predmode == 1 ) + { + safety_net = 0; + } + else + { + if ( st->codec_mode == MODE2 || st->core == TCX_20_CORE || st->core == TCX_10_CORE ) + { + /* read from param_lpc */ + safety_net = p_lpc_param[0]; + p_lpc_param++; + *nb_indices += 1; + } + else + { + safety_net = get_next_indice( st, 1 ); + } + } + + st->safety_net = safety_net; + + + /* Make sure there are the correct bit allocations */ + if ( st->idchan == 1 && predmode > 2 ) + { + /* use same AR prediction bit allocation for intra and inter modes*/ + lsf_allocate( nBits - 1, mode_lvq, 9, &stages0, &stages1, levels0, levels1, bits0, bits1 ); + stages0 = stages1; + mvs2s( levels1, levels0, stages0 ); + mvs2s( bits1, bits0, stages0 ); + } + + /*--------------------------------------------------------------------------* + * Read indices from array + *--------------------------------------------------------------------------*/ + + if ( st->sr_core == INT_FS_16k && coder_type == VOICED && flag_1bit_gran == 0 ) + { + /* BC-TCVQ - only in VOICED_WB@16kHz */ + if ( st->codec_mode == MODE2 || st->core == TCX_20_CORE || st->core == TCX_10_CORE ) + { + *nb_indices = 10; + TCQIdx[0] = safety_net; + for ( i = 1; i < *nb_indices; i++ ) + { + TCQIdx[i] = *p_lpc_param++; + } + } + else + { + Bit_alloc1 = &BC_TCVQ_BIT_ALLOC_40B[1]; + TCQIdx[0] = safety_net; + for ( i = 0; i < M / 2 + 3; i++ ) + { + TCQIdx[i + 1] = get_next_indice( st, Bit_alloc1[i] ); + } + } + } + else + { + if ( safety_net ) + { + stages = stages0; + levels = levels0; + bits = bits0; + } + else + { + stages = stages1; + levels = levels1; + bits = bits1; + } + + if ( st->codec_mode == MODE2 || st->core == TCX_20_CORE || st->core == TCX_10_CORE ) + { + for ( i = 0; i < stages - 1; i++ ) + { + num_bits = bits[i]; + lindice[i + 1] = *p_lpc_param++; + } + + cumleft = levels[stages - 1]; + while ( cumleft > 0 ) + { + if ( cumleft > LEN_INDICE ) + { + cumleft -= LEN_INDICE; + } + else + { + cumleft = 0; + } + + lindice[i + 1] = *p_lpc_param++; + i++; + } + *nb_indices += i; + } + else + { + for ( i = 0; i < stages - 1; i++ ) + { + num_bits = bits[i]; + lindice[i + 1] = get_next_indice( st, num_bits ); + } + + cumleft = levels[stages - 1]; + while ( cumleft > 0 ) + { + if ( cumleft > LEN_INDICE ) + { + cumleft -= LEN_INDICE; + num_bits = LEN_INDICE; + } + else + { + num_bits = cumleft; + cumleft = 0; + } + + lindice[i + 1] = get_next_indice( st, num_bits ); + i++; + } + } + } + + if ( st->reset_mem_AR == 1 ) + { + for ( i = 0; i < M; i++ ) + { + st->mem_AR[i] = ModeMeans[mode_lvq][i]; + } + st->reset_mem_AR = 0; + } + + /*------------------------------------------------------------------------------------------* + * De-quantize LSF vector + *------------------------------------------------------------------------------------------*/ + + *LSF_Q_prediction = SAFETY_NET; + + /* VOICED_WB@16kHz */ + if ( st->sr_core == INT_FS_16k && coder_type == VOICED && flag_1bit_gran == 0 ) + { + /* BC-TCVQ decoder */ + safety_net = qlsf_ARSN_tcvq_Dec_16k( qlsf, TCQIdx, nBits - 1 ); + + /* Update mem_MA */ + mvr2r( qlsf, st->mem_MA, M ); + + if ( safety_net ) + { + mvr2r( ModeMeans[mode_lvq], pred0, M ); + } + else + { + for ( i = 0; i < M; i++ ) + { + pred0[i] = ModeMeans[mode_lvq][i] + Predictors[mode_lvq_p][i] * ( st->mem_AR[i] - ModeMeans[mode_lvq][i] ); + } + *LSF_Q_prediction = AUTO_REGRESSIVE; + } + v_add( qlsf, pred0, qlsf, M ); + } + else + { + /* Safety-net */ + mvr2r( ModeMeans[mode_lvq], pred0, M ); + + /* for mem_MA update */ + for ( i = 0; i < M; i++ ) + { + pred1[i] = pred0[i] + MU_MA * st->mem_MA[i]; + } + + /* TD stereo SCh: perform intra-frame prediction with pulling-to-mean */ + if ( st->tdm_LRTD_flag == 0 && st->idchan == 1 && tdm_lsfQ_PCh != NULL ) + { + tdm_SCh_LSF_intra_pred( st->element_brate, tdm_lsfQ_PCh, pred3 ); + } + + if ( safety_net ) + { + /* LVQ */ + if ( st->tdm_LRTD_flag == 0 && st->idchan == 1 && tdm_lsfQ_PCh != NULL ) + { + + /* intra mode*/ + st->BER_detect = st->BER_detect | + vq_dec_lvq( 0, qlsf, &lindice[1], stages0, M, 9, /*mode_lvq_p,*/ levels0[stages0 - 1] ); + + v_add( qlsf, pred3, qlsf, M ); + v_sub( qlsf, pred1, st->mem_MA, M ); + } + else + { + st->BER_detect = st->BER_detect | + vq_dec_lvq( 1, qlsf, &lindice[1], stages0, M, mode_lvq, levels0[stages0 - 1] ); + + v_add( qlsf, pred0, qlsf, M ); + v_sub( qlsf, pred1, st->mem_MA, M ); + } + } + else + { + if ( predmode == 4 ) + { + mode_lvq_p = 9; + predmode = 2; + } + st->BER_detect = st->BER_detect | + vq_dec_lvq( 0, qlsf, &lindice[1], stages1, M, mode_lvq_p, levels1[stages1 - 1] ); + + if ( predmode == 1 || ( predmode == 4 ) ) /* MA only */ + { + mvr2r( qlsf, st->mem_MA, M ); + v_add( qlsf, pred1, qlsf, M ); + *LSF_Q_prediction = MOVING_AVERAGE; + } + else + { + /* AR */ + for ( i = 0; i < M; i++ ) + { + pred2[i] = pred0[i] + Predictors[mode_lvq_p][i] * ( st->mem_AR[i] - pred0[i] ); + } + v_add( qlsf, pred2, qlsf, M ); + v_sub( qlsf, pred1, st->mem_MA, M ); + *LSF_Q_prediction = AUTO_REGRESSIVE; + } + } + } + + + /*--------------------------------------------------------------------------* + * Sort the quantized vector + * Verify stability + * Update AR-predictor memory + *--------------------------------------------------------------------------*/ + + /* Sort the quantized vector */ + v_sort( qlsf, 0, M - 1 ); + + /* Verify stability */ + reorder_lsf( qlsf, MODE1_LSF_GAP, M, st->sr_core ); + + /* Update predictor memory */ + mvr2r( qlsf, st->mem_AR, M ); + + st->mode_lvq = mode_lvq; + + return; +} + + +/*-------------------------------------------------------------------* + * lsf_mid_dec() + * + * Decode mid-frame LSFs + *-------------------------------------------------------------------*/ + +static void lsf_mid_dec( + Decoder_State *st, /* i/o: decoder state structure */ + const float lsp_new[], /* i : quantized LSPs from frame end */ + const int16_t coder_type, /* i : coder type */ + float lsp_mid[] /* o : quantized LSPs */ +) +{ + int16_t j, idx; + int16_t nb_bits; + float qlsf0[M], qlsf1[M], qlsf[M]; + const float *ratio = NULL; + int16_t bad_spacing; + + bad_spacing = 0; + + /* Convert LSPs to LSFs */ + lsp2lsf( st->lsp_old, qlsf0, M, st->sr_core ); + lsp2lsf( lsp_new, qlsf1, M, st->sr_core ); + + /* Codebook selection */ + if ( st->ppp_mode_dec == 1 ) + { + nb_bits = 1; + ratio = &( tbl_mid_voi_wb_1b[0] ); + } + else if ( st->nelp_mode_dec == 1 ) + { + nb_bits = 4; + ratio = &( tbl_mid_unv_wb_4b[0] ); + } + else + { + nb_bits = st->acelp_cfg.mid_lsf_bits; + + /* codebook selection */ + if ( coder_type == VOICED ) + { + switch ( nb_bits ) + { + case 5: + { + ratio = tbl_mid_voi_wb_5b; + break; + } + case 4: + { + ratio = tbl_mid_voi_wb_4b; + break; + } + case 1: + { + ratio = tbl_mid_voi_wb_1b; + break; + } + } + } + else if ( coder_type == UNVOICED ) + { + ratio = tbl_mid_unv_wb_5b; + } + else + { + /* GENERIC, TRANSITION, AUDIO and INACTIVE */ + switch ( nb_bits ) + { + case 5: + { + ratio = tbl_mid_gen_wb_5b; + break; + } + case 4: + { + ratio = tbl_mid_gen_wb_4b; + break; + } + case 2: + { + ratio = tbl_mid_gen_wb_2b; + break; + } + } + } + } + + /* Retrieve mid-frame LSF index */ + idx = get_next_indice( st, nb_bits ); + + /* Calculation of mid-LSF vector */ + for ( j = 0; j < M; j++ ) + { + qlsf[j] = ( 1.0f - ratio[idx * M + j] ) * qlsf0[j] + ratio[idx * M + j] * qlsf1[j]; + } + + /* check for incorrect LSF ordering */ + if ( st->mid_lsf_int == 1 ) + { + for ( j = 1; j < M; j++ ) + { + if ( qlsf[j] < qlsf[j - 1] ) + { + bad_spacing = 1; + break; + } + } + } + + /* Redo mid-LSF interpolation with 0.4 in case of LSF instability */ + if ( st->prev_bfi || ( st->mid_lsf_int == 1 && bad_spacing ) ) + { + for ( j = 0; j < M; j++ ) + { + /* redo mid-LSF interpolation with 0.4 */ + qlsf[j] = 0.4f * qlsf0[j] + 0.6f * qlsf1[j]; + + /* ensure correct ordering of LSF indices */ + if ( j > 0 && j < M && qlsf[j] < qlsf[j - 1] + LSF_GAP_MID ) + { + qlsf[j] = qlsf[j - 1] + LSF_GAP_MID; + } + } + } + else + { + /* otherwise, use regular LSF spacing and ordering as in the encoder */ + for ( j = 0; j < M; j++ ) + { + if ( j > 0 && j < M && qlsf[j] < qlsf[j - 1] + LSF_GAP_MID ) + { + qlsf[j] = qlsf[j - 1] + LSF_GAP_MID; + } + } + } + + if ( st->prev_bfi ) + { + /* continue redoing mid-LSF interpolation with 0.4 in order not to propagate the error */ + st->mid_lsf_int = 1; + } + + if ( st->safety_net ) + { + /* safety-net encountered -> stop redoing mid-LSF interpolation with 0.4 */ + st->mid_lsf_int = 0; + } + + reorder_lsf( qlsf, LSF_GAP_MID, M, st->sr_core ); + /* convert back to LSPs */ + lsf2lsp( qlsf, lsp_mid, M, st->sr_core ); + + return; +} + +/*----------------------------------------------------------------------------------------------* + * dqlsf_CNG() + * + * LSF de-quantizer for SID frames (uses 28 bits, 4 for VQ, 24 for LVQ) + * + * Note: + * LP-CNG LSF decoder does not need to know the sampling rate, + * the sampling rate data is embedded inside the LSF coefficients + * If the highest order LSF coefficient (lsf_q[M-1]) is smaller than 6350 then Fs=12.8kHz + * If the highest order LSF coefficient (lsf_q[M-1]) is larger than 6350 then Fs=16kHz + *----------------------------------------------------------------------------------------------*/ + +static void dqlsf_CNG( + Decoder_State *st, /* i/o: decoder state structure */ + float *lsf_q /* o : decoded LSFs */ +) +{ + int16_t indice[4]; + + indice[0] = get_next_indice( st, 4 ); + indice[1] = get_next_indice( st, LEN_INDICE ); + indice[2] = get_next_indice( st, LSF_BITS_CNG - 4 - LEN_INDICE ); + + st->BER_detect = st->BER_detect | + deindex_lvq_cng( &indice[1], lsf_q, indice[0], LSF_BITS_CNG - 4 ); + /* The sampling frequency of the LP-CNG frame can be determined by checking the value of the highest order LSF + coefficient (last coefficient of lsf_q). If the last decoded LSF coefficient (lsf_q[15]) is larger than 6350 + the decoded frame is WB2 with sampling rate of 16 kHz, otherwise it is sampled at 12.8kHz and contains + either NB or WB LSF data. */ + + v_add( lsf_q, &CNG_SN1[indice[0] * M], lsf_q, M ); + + if ( ( ( st->L_frame == L_FRAME16k ) && ( lsf_q[M - 1] <= WB_LIMIT_LSF ) ) || ( ( st->L_frame < L_FRAME16k ) && ( lsf_q[M - 1] > WB_LIMIT_LSF ) ) ) + { + st->BER_detect = 1; + } + + return; +} diff --git a/lib_dec/lsf_msvq_ma_dec.c b/lib_dec/lsf_msvq_ma_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..945797915d946fc0c07ade5772df118f75e4c12c --- /dev/null +++ b/lib_dec/lsf_msvq_ma_dec.c @@ -0,0 +1,280 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "prot.h" +#include "rom_com.h" +#include "basop_proto_func.h" +#include "wmc_auto.h" + +/*---------------------------------------------------------------------* + * lsf_msvq_ma_decprm() + * + * + *---------------------------------------------------------------------*/ + +int16_t lsf_msvq_ma_decprm( + Decoder_State *st, + int16_t *param_lpc ) +{ + int16_t i, nbits_lpc, bits_midlpc; + int16_t bits0[MAX_VQ_STAGES], bits1[MAX_VQ_STAGES], stages0, stages1, stages, + levels0[MAX_VQ_STAGES], levels1[MAX_VQ_STAGES], *bits; + int16_t predmode, mode_lvq, mode_lvq_p, safety_net; + + bits_midlpc = MIDLSF_NBITS; + + if ( st->sr_core == INT_FS_16k && st->coder_type == UNVOICED ) + { + find_pred_mode( &predmode, GENERIC, 1 - st->narrowBand /*st->bwidth*/, st->sr_core, &mode_lvq, &mode_lvq_p, st->total_brate ); + } + else + { + if ( st->core == TCX_20_CORE ) + { + find_pred_mode( &predmode, AUDIO, 1 - st->narrowBand /*st->bwidth*/, st->sr_core, &mode_lvq, &mode_lvq_p, st->total_brate ); + } + else + { + find_pred_mode( &predmode, st->coder_type, 1 - st->narrowBand /*st->bwidth*/, st->sr_core, &mode_lvq, &mode_lvq_p, st->total_brate ); + } + } + + lsf_allocate( ENDLSF_NBITS - ( predmode >> 1 ), mode_lvq, mode_lvq_p, &stages0, &stages1, levels0, levels1, bits0, bits1 ); + + nbits_lpc = 0; + + if ( predmode == 2 ) + { + /* there is choice between SN and AR prediction */ + safety_net = get_next_indice( st, 1 ); + + if ( safety_net == 1 ) + { + stages = stages0; + bits = bits0; + } + else + { + stages = stages1; + bits = bits1; + } + *param_lpc = safety_net; + param_lpc++; + nbits_lpc++; + } + else + { + stages = stages1; + bits = bits1; + } + + for ( i = 0; i < stages - 1; i++ ) + { + *param_lpc = get_next_indice( st, bits[i] ); + param_lpc++; + nbits_lpc += bits[i]; + } + *param_lpc = get_next_indice( st, LEN_INDICE ); + param_lpc++; + nbits_lpc += LEN_INDICE; + + + *param_lpc = get_next_indice( st, bits[i] - LEN_INDICE ); + param_lpc++; + nbits_lpc += bits[i] - LEN_INDICE; + + if ( st->coder_type != VOICED && st->core == ACELP_CORE && st->acelp_cfg.midLpc ) + { + + *param_lpc = get_next_indice( st, bits_midlpc ); + nbits_lpc += bits_midlpc; + } + + return nbits_lpc; +} + + +/*---------------------------------------------------------------------* + * lsf_bctcvq_decprm() + * + * + *---------------------------------------------------------------------*/ + +int16_t lsf_bctcvq_decprm( + Decoder_State *st, + int16_t *param_lpc ) +{ + int16_t i, nbits_lpc, num_par; + const int16_t *bits1; + + num_par = 10; + bits1 = BC_TCVQ_BIT_ALLOC_40B; + + nbits_lpc = 0; + + for ( i = 0; i < num_par; i++ ) + { + *param_lpc = get_next_indice( st, bits1[i] ); + param_lpc++; + nbits_lpc += bits1[i]; + } + + return nbits_lpc; +} + + +/*---------------------------------------------------------------------* + * D_lsf_tcxlpc() + * + * + *---------------------------------------------------------------------*/ + +/*! r: number of indices */ +int16_t D_lsf_tcxlpc( + const int16_t indices[], /* i : VQ indices */ + float lsf_q[], /* o : quantized lsf */ + Word16 lsp_q_ind[], /* o : quantized lsp (w/o MA prediction) */ + const int16_t narrowband, /* i : narrowband flag */ + const int16_t cdk, /* i : codebook selector */ + const float mem_MA[] /* i : MA memory */ +) +{ + int16_t i, NumIndices; + float pred[M16k]; + const float *means; + Word16 lsf_q_ind[M16k]; + float lsf_rem_q[M]; + Word16 lsf_rem_q_ind[M]; + + NumIndices = 1; + + msvq_dec( lsf_codebook[narrowband][cdk], lsf_dims, lsf_offs, TCXLPC_NUMSTAGES, M, M, indices + NumIndices, 0, NULL, lsf_q, lsf_q_ind ); + + NumIndices += TCXLPC_NUMSTAGES; + + if ( indices[0] ) + { + /* Only add contribution if flag is enabled */ + + + msvq_dec( lsf_ind_codebook[narrowband][cdk], lsf_ind_dims, lsf_ind_offs, TCXLPC_IND_NUMSTAGES, M, M, indices + NumIndices, 0, NULL, lsf_rem_q, lsf_rem_q_ind ); + NumIndices += TCXLPC_IND_NUMSTAGES; + + /* Add to MA-removed vector */ + for ( i = 0; i < M; ++i ) + { + lsf_q_ind[i] = add( lsf_q_ind[i], lsf_rem_q_ind[i] ); + } + } + + /* Inter-frame prediction */ + means = lsf_means[narrowband]; + + for ( i = 0; i < M; ++i ) + { + pred[i] = means[i] + MU_MA * mem_MA[i]; + } + + /* Add prediction */ + for ( i = 0; i < M; ++i ) + { + lsf_q[i] += pred[i]; + lsf_q_ind[i] = add( lsf_q_ind[i], LSFM( means[i] ) ); + } + reorder_lsf( lsf_q, TCXLPC_LSF_GAP, M, INT_FS_12k8 ); + + basop_reorder_lsf( lsf_q_ind, LSF_GAP_VAL( TCXLPC_LSF_GAP ), M, INT_FS_FX ); + + if ( lsp_q_ind ) + { + basop_lsf2lsp( lsf_q_ind, lsp_q_ind ); + } + + return NumIndices; +} + + +/*---------------------------------------------------------------------* + * dec_lsf_tcxlpc() + * + * + *---------------------------------------------------------------------*/ + +/*! r: number of bits read */ +int16_t dec_lsf_tcxlpc( + Decoder_State *st, /* i/o: Decoder state */ + int16_t **indices, /* o : Ptr to VQ indices */ + const int16_t narrowband, /* i : narrowband flag */ + const int16_t cdk /* i : codebook selector */ +) +{ + int16_t i, start_bit_pos; + float lsf_q_ignored[M]; + Word16 lsf_q_ind[M]; + int16_t *flag; + + flag = *indices; /* Save pointer */ + *flag = 0; /* Set flag to disabled */ + ++*indices; + + start_bit_pos = st->next_bit_pos; + + for ( i = 0; i < TCXLPC_NUMSTAGES; ++i ) + { + **indices = get_next_indice( st, lsf_numbits[i] ); + ++*indices; + } + + /* Decode independent lsf */ + msvq_dec( lsf_codebook[narrowband][cdk], lsf_dims, lsf_offs, TCXLPC_NUMSTAGES, M, M, flag + 1, 0, NULL, lsf_q_ignored, lsf_q_ind ); + + /* Update flag */ + *flag = lsf_ind_is_active( lsf_q_ind, lsf_means[narrowband], narrowband, cdk ); + + if ( *flag ) + { + for ( i = 0; i < TCXLPC_IND_NUMSTAGES; ++i ) + { + **indices = get_next_indice( st, lsf_ind_numbits[i] ); + ++*indices; + } + } + + return st->next_bit_pos - start_bit_pos; +} diff --git a/lib_dec/nelp_dec.c b/lib_dec/nelp_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..77b3703d10d53fc757e57afbbd77497cf871c101 --- /dev/null +++ b/lib_dec/nelp_dec.c @@ -0,0 +1,219 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * nelp_decoder() + * + * NELP decoder + *-------------------------------------------------------------------*/ + +void nelp_decoder( + Decoder_State *st, /* i/o: decoder static memory */ + float *exc_nelp, /* o : adapt. excitation/total exc*/ + float *exc, /* o : adapt. excitation exc */ + int16_t bfi, /* i : frame error rate */ + const int16_t coder_type, /* i : coding type */ + float *gain_buf /* o : floating pitch gain for each subframe */ +) +{ + int16_t i, fid = 0; + SC_VBR_DEC_HANDLE hSC_VBR; + float ptr[L_FRAME], filtRes[L_FRAME], gain_fac; + float Gains[10], Gain, E3, E2, R; + float ptr_tmp[L_FRAME]; + int16_t iG1, iG2[2]; + + hSC_VBR = st->hSC_VBR; + + if ( ( st->last_nelp_mode_dec == 1 ) && ( st->bwidth != st->last_bwidth ) ) + { + st->last_nelp_mode_dec = 0; + } + + if ( coder_type == UNVOICED && st->bwidth == NB ) + { + if ( st->last_nelp_mode_dec != 1 ) + { + set_f( hSC_VBR->bp1_filt_mem_nb_dec, 0, 7 * 2 ); + } + } + else if ( coder_type == UNVOICED && ( st->bwidth == WB || st->bwidth == SWB ) ) + { + if ( st->last_nelp_mode_dec != 1 ) + { + set_f( hSC_VBR->bp1_filt_mem_wb_dec, 0, 4 * 2 ); + } + } + + if ( st->last_nelp_mode_dec != 1 ) + { + set_f( hSC_VBR->shape1_filt_mem_dec, 0, 20 ); + set_f( hSC_VBR->shape2_filt_mem_dec, 0, 20 ); + set_f( hSC_VBR->shape3_filt_mem_dec, 0, 20 ); + } + + if ( bfi == 0 ) + { + if ( st->rf_frame_type == RF_NELP && st->use_partial_copy ) + { + iG1 = st->rf_indx_nelp_iG1; + iG2[0] = st->rf_indx_nelp_iG2[0]; + iG2[1] = st->rf_indx_nelp_iG2[1]; + } + else + { + /* Do Unvoiced/NELP Decoding */ + iG1 = get_next_indice( st, 5 ); + iG2[0] = get_next_indice( st, 6 ); + iG2[1] = get_next_indice( st, 6 ); + } + + if ( coder_type == UNVOICED && ( st->bwidth == WB || st->bwidth == SWB ) ) + { + if ( st->rf_frame_type == RF_NELP && st->use_partial_copy ) + { + fid = st->rf_indx_nelp_fid; + } + else + { + fid = get_next_indice( st, 2 ); + } + } + + dequantize_uvg( iG1, iG2, Gains, st->bwidth ); + } + else + { + for ( i = 1, Gain = 0.001f; i <= L_SUBFR; i++ ) + { + Gain += SQR( exc[-i] ); + } + + Gain = (float) ( sqrt( Gain / L_SUBFR ) ); + Gain *= 0.8f; /* Some scale down of energy since it is an erasure */ + + set_f( Gains, Gain, 10 ); + } + + if ( coder_type == UNVOICED && ( st->bwidth == WB || st->bwidth == SWB ) ) + { + gain_fac = 1.16f; + } + else + { + gain_fac = 1.37f; + } + + generate_nelp_excitation( &( hSC_VBR->nelp_dec_seed ), Gains, ptr, gain_fac ); + + if ( coder_type == UNVOICED && ( st->bwidth == WB || st->bwidth == SWB ) ) + { + polezero_filter( ptr, ptr_tmp, L_FRAME, bp1_num_coef_wb, bp1_den_coef_wb, 4, hSC_VBR->bp1_filt_mem_wb_dec ); + mvr2r( ptr_tmp, ptr, L_FRAME ); + } + + if ( coder_type == UNVOICED && st->bwidth == NB ) + { + polezero_filter( ptr, ptr_tmp, L_FRAME, bp1_num_coef_nb_fx_order7, bp1_den_coef_nb_fx_order7, 7, hSC_VBR->bp1_filt_mem_nb_dec ); + mvr2r( ptr_tmp, ptr, L_FRAME ); + } + + for ( i = 0, E3 = 0.001f; i < L_FRAME; i++ ) + { + E3 += SQR( ptr[i] ); + } + + if ( coder_type == UNVOICED && ( st->bwidth == WB || st->bwidth == SWB ) ) + { + polezero_filter( ptr, ptr_tmp, L_FRAME, shape1_num_coef, shape1_den_coef, 10, hSC_VBR->shape1_filt_mem_dec ); + mvr2r( ptr_tmp, ptr, L_FRAME ); + + switch ( fid ) + { + case 1: + /* Update other filter memory */ + polezero_filter( ptr, filtRes, L_FRAME, shape3_num_coef, shape3_den_coef, 10, hSC_VBR->shape3_filt_mem_dec ); + + /* filter the residual to desired shape */ + polezero_filter( ptr, ptr_tmp, L_FRAME, shape2_num_coef, shape2_den_coef, 10, hSC_VBR->shape2_filt_mem_dec ); + mvr2r( ptr_tmp, ptr, L_FRAME ); + + break; + case 2: + /* Update other filter memory */ + polezero_filter( ptr, filtRes, L_FRAME, shape2_num_coef, shape2_den_coef, 10, hSC_VBR->shape2_filt_mem_dec ); + + /* filter the residual to desired shape */ + polezero_filter( ptr, ptr_tmp, L_FRAME, shape3_num_coef, shape3_den_coef, 10, hSC_VBR->shape3_filt_mem_dec ); + + mvr2r( ptr_tmp, ptr, L_FRAME ); + + break; + default: + /* Update other filter memory */ + polezero_filter( ptr, filtRes, L_FRAME, shape2_num_coef, shape2_den_coef, 10, hSC_VBR->shape2_filt_mem_dec ); + + polezero_filter( ptr, filtRes, L_FRAME, shape3_num_coef, shape3_den_coef, 10, hSC_VBR->shape3_filt_mem_dec ); + + break; + } + + for ( i = 0, E2 = 0.001f; i < L_FRAME; i++ ) + { + E2 += SQR( ptr[i] ); + } + + R = (float) sqrt( E3 / E2 ); + + for ( i = 0; i < L_FRAME; i++ ) + { + ptr[i] *= R; + } + } + + mvr2r( ptr, exc_nelp, L_FRAME ); + set_f( gain_buf, 0.f, NB_SUBFR16k ); + + return; +} diff --git a/lib_dec/peak_vq_dec.c b/lib_dec/peak_vq_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..857bf0d5feb08ab98a6c2cf6cd14fcab3aff6a23 --- /dev/null +++ b/lib_dec/peak_vq_dec.c @@ -0,0 +1,542 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + + +/*------------------------------------------------------------------------* + * Local function prototypes + *------------------------------------------------------------------------*/ + +static void dequant_peaks( Decoder_State *st, float *vect_out, const float *peak_gain ); + +static int16_t hvq_dec_pos( Decoder_State *st, int16_t *pos_vec, const int16_t length, const int16_t num_peaks ); + +static int16_t sparse_dec_pos( Decoder_State *st, int16_t *out, const int16_t length ); + +static void peak_vq_dec( Decoder_State *st, float *coefs_out, const int32_t core_brate, const int16_t num_bits, const int16_t *ynrm, int16_t *R, int16_t *vq_peak_idx, int16_t *Npeaks, const int16_t core ); + + +/*-------------------------------------------------------------------------- + * hvq_dec() + * + * HVQ decoder + *--------------------------------------------------------------------------*/ + +void hvq_dec( + Decoder_State *st, /* i/o: decoder state structure */ + const int16_t num_bits, /* i : Number of available bits */ + const int32_t core_brate, /* i : Core bitrate */ + const int16_t *ynrm, /* i : Envelope coefficients */ + int16_t *R, /* i/o: Bit allocation/updated bit allocation */ + float *noise_level, /* o : Noise level */ + int16_t *peak_idx, /* o : Peak position vector */ + int16_t *Npeaks, /* o : Total number of peaks */ + float *coefsq_norm, /* o : Output vector */ + const int16_t core /* i : Core */ +) +{ + int16_t i; + int16_t bits; + int16_t noise_level_idx; + + bits = num_bits; + + for ( i = 0; i < HVQ_BWE_NOISE_BANDS; i++ ) + { + noise_level_idx = get_next_indice( st, 2 ); + noise_level[i] = usdequant( noise_level_idx, 0.0f, 0.1f ); + + bits -= 2; + } + + peak_vq_dec( st, coefsq_norm, core_brate, bits, ynrm, R, peak_idx, Npeaks, core ); + + return; +} + + +/*-------------------------------------------------------------------------- + * peak_vq_dec() + * + * Vector de-quantization of MDCT peaks + *--------------------------------------------------------------------------*/ + +static void peak_vq_dec( + Decoder_State *st, /* i/o: decoder state structure */ + float *coefs_out, /* o : Output coefficient vector */ + const int32_t core_brate, /* i : Core bitrate */ + const int16_t num_bits, /* i : Number of bits for HVQ */ + const int16_t *ynrm, /* i : Envelope coefficients */ + int16_t *R, /* i/o: Bit allocation/updated bit allocation */ + int16_t *vq_peak_idx, /* o : Peak position vector */ + int16_t *Npeaks, /* o : Number of peaks */ + const int16_t core /* i : Core type */ +) +{ + int16_t vq_peaks, i, j, k, FlagN, hcode_l, diff; + int16_t bin_th, max_peaks, pvq_bands; + int16_t nf_seed = RANDOM_INITSEED; + int16_t nf_gains_idx[HVQ_NF_GROUPS], pgain_difidx[HVQ_MAX_PEAKS], pvq_norm[MAX_PVQ_BANDS]; + int16_t gain_bits_array[MAX_PVQ_BANDS]; + int16_t pos_bits; + float nf_gains[HVQ_NF_GROUPS], peak_gains[HVQ_MAX_PEAKS]; + int32_t manE_peak, manPkEnrg; /* (man, exp) representation ported from BASOP for interoperability */ + int16_t expE_peak, expPkEnrg; + float pvq_vector[HVQ_PVQ_BUF_LEN]; + int16_t res_vec[HVQ_THRES_BIN_32k]; + int16_t k_sort[HVQ_MAX_PVQ_WORDS]; + int16_t pvq_inp_vector[HVQ_PVQ_BUF_LEN]; + int16_t npulses[MAX_PVQ_BANDS]; + int16_t pvq_bits, Rk[MAX_PVQ_BANDS]; + float fg_pred[NB_SFM_MAX]; + int16_t Rk_f[MAX_PVQ_BANDS]; /* Q3 */ + int16_t sel_bnds[HVQ_NUM_SFM_24k]; + int16_t n_sel_bnds; + int16_t hvq_band_end[MAX_PVQ_BANDS]; + int16_t hvq_band_start[MAX_PVQ_BANDS]; + int16_t hvq_band_width[MAX_PVQ_BANDS]; + int16_t n; + int16_t s; + float normq; + + set_s( gain_bits_array, 0, MAX_PVQ_BANDS ); + set_f( pvq_vector, 0.0f, HVQ_PVQ_BUF_LEN ); + set_s( npulses, 0, MAX_PVQ_BANDS ); + set_s( pvq_inp_vector, 0, HVQ_PVQ_BUF_LEN ); + + /* Set bitrate dependent variables */ + assert( ( core_brate > HQ_16k40 && core_brate <= HQ_48k ) && "HVQ rate not supported" ); + max_peaks = (int16_t) ( ( core_brate * HVQ_PEAKS_PER_DELTA + HVQ_PEAKS_PER_DELTA_OFFS ) / HVQ_PEAKS_BPS_DELTA ); + + bin_th = HVQ_THRES_BIN_24k; + if ( core_brate >= HQ_BWE_CROSSOVER_BRATE ) + { + bin_th = HVQ_THRES_BIN_32k; + } + + /* Get number of peaks */ + vq_peaks = get_next_indice( st, 5 ); + vq_peaks = max_peaks - vq_peaks; + *Npeaks = vq_peaks; + diff = 5; + + /* safety check in case of bit errors */ + if ( *Npeaks < HVQ_MIN_PEAKS ) + { + st->BER_detect = 1; + vq_peaks = HVQ_MIN_PEAKS; + *Npeaks = HVQ_MIN_PEAKS; + } + + /* De-quantize peak positions */ + for ( i = 0; i < bin_th; i++ ) + { + res_vec[i] = 0; + } + + /* Unpack HVQ codewords */ + pos_bits = hvq_dec_pos( st, res_vec, bin_th, vq_peaks ); + diff += pos_bits; + + for ( i = 0, j = 0; i < bin_th && j < vq_peaks; i++ ) /* safety check in case of bit errors */ + { + if ( res_vec[i] ) + { + vq_peak_idx[j++] = i; + } + } + + /* safety check in case of bit errors */ + if ( j < vq_peaks ) + { + st->BER_detect = 1; + vq_peaks = j - 1; + *Npeaks = j - 1; + } + + /* Huffman or differential coding */ + FlagN = get_next_indice( st, 1 ); + + /* De-quantize peak gains */ + pgain_difidx[0] = get_next_indice( st, GAIN0_BITS ); + + /* safety check in case of bit errors */ + if ( pgain_difidx[0] > 44 ) + { + st->BER_detect = 1; + pgain_difidx[0] = 44; + } + peak_gains[0] = dicn_pg[pgain_difidx[0]] * sign( (float) res_vec[vq_peak_idx[0]] ); + + hcode_l = 0; + if ( FlagN ) + { + huff_dec( st, vq_peaks - 1, MAX_PG_HUFFLEN, NUM_PG_HUFFLEN, hvq_pg_huff_thres, hvq_pg_huff_offset, hvq_pg_huff_tab, &pgain_difidx[1] ); + for ( i = 1; i < vq_peaks; i++ ) + { + hcode_l += pgain_huffsizn[pgain_difidx[i]]; + } + } + else + { + for ( i = 1; i < vq_peaks; i++ ) + { + pgain_difidx[i] = get_next_indice( st, GAINI_BITS ); + hcode_l += GAINI_BITS; + } + } + + for ( i = 1; i < vq_peaks; i++ ) + { + pgain_difidx[i] += pgain_difidx[i - 1] - 15; + + /* safety check in case of bit errors */ + if ( pgain_difidx[i] > 44 || pgain_difidx[i] < 0 ) + { + st->BER_detect = 1; + pgain_difidx[i] = 44; + } + + peak_gains[i] = dicn_pg[pgain_difidx[i]] * sign( (float) res_vec[vq_peak_idx[i]] ); + } + + /* Scale up peak gains and accumulate peak energy */ + /* Simulating BASOP code for interoperability */ + manE_peak = 0; + expE_peak = 32; + for ( i = 0; i < vq_peaks; i++ ) + { + peak_gains[i] *= 4.0f; + manPkEnrg = manPkEnrg_tbl[pgain_difidx[i]]; + expPkEnrg = expPkEnrg_tbl[pgain_difidx[i]]; + floating_point_add( &manE_peak, &expE_peak, manPkEnrg, expPkEnrg ); + } + + /* Number of bits used for peak gain quantization */ + diff += FLAGN_BITS + GAIN0_BITS + hcode_l; + + /* De-quantize peaks */ + for ( i = 0; i < vq_peaks; i++ ) + { + dequant_peaks( st, &coefs_out[vq_peak_idx[i] - 2], &peak_gains[i] ); + + diff += 9; + } + + for ( i = 0; i < HVQ_NF_GROUPS; i++ ) + { + nf_gains_idx[i] = get_next_indice( st, 5 ); + nf_gains[i] = 0.5f * dicn[nf_gains_idx[i]]; + diff += 5; + } + + pvq_bits = num_bits - diff; + + /* Calculate number of PVQ bands to code and assign bits */ + pvq_bands = hvq_pvq_bitalloc( pvq_bits, core_brate, st->bwidth, ynrm, manE_peak, expE_peak, Rk, R, sel_bnds, &n_sel_bnds ); + + /* safety check in case of bit errors */ + if ( ( pvq_bands == 0 ) && st->element_mode == EVS_MONO ) /* PVQ bands may be zero for IVAS */ + { + st->BER_detect = 1; + } + + pvq_bits -= HVQ_PVQ_GAIN_BITS * pvq_bands; + + /* Get band limits for concatenated PVQ target */ + hvq_concat_bands( pvq_bands, sel_bnds, n_sel_bnds, hvq_band_start, hvq_band_width, hvq_band_end ); + + s = 0; + for ( k = 0; k < pvq_bands; k++ ) + { + k_sort[k] = k; + Rk_f[k] = Rk[k] * 8; + } + + pvq_decode_frame( st, pvq_vector, npulses, pvq_inp_vector, hvq_band_start, hvq_band_end, hvq_band_width, pvq_bands, Rk_f, pvq_bits, core ); + + fine_gain_pred( hvq_band_start, hvq_band_end, hvq_band_width, k_sort, npulses, NULL, NULL, pvq_bands, pvq_vector, pvq_inp_vector, fg_pred, core ); + + fine_gain_dec( st, k_sort, pvq_bands, gain_bits_array, fg_pred ); + + apply_gain( k_sort, hvq_band_start, hvq_band_end, pvq_bands, fg_pred, pvq_vector ); + + i = 0; + n = 0; + s = 0; + for ( k = 0; k < pvq_bands; k++ ) + { + pvq_norm[k] = get_next_indice( st, HVQ_PVQ_GAIN_BITS ); + pvq_norm[k] += 8; + + diff += HVQ_PVQ_GAIN_BITS; + + j = 0; + if ( k >= pvq_bands - n_sel_bnds ) + { + i = band_start_harm[sel_bnds[s++]]; + } + while ( j < hvq_band_width[k] ) + { + normq = dicn[pvq_norm[k]]; + if ( coefs_out[i] == 0 ) + { + coefs_out[i] = pvq_vector[n] * normq; + j++; + n++; + } + i++; + } + } + /* Noise fill unqantized coeffs with one gain per group */ + for ( i = 0; i < HVQ_NF_GROUPS; i++ ) + { + for ( j = i * ( bin_th / HVQ_NF_GROUPS ); j < ( i + 1 ) * ( bin_th / HVQ_NF_GROUPS ); j++ ) + { + if ( coefs_out[j] == 0 ) + { + coefs_out[j] = ( (float) own_random( &nf_seed ) / MAX16B ) * nf_gains[i]; + } + } + } + + return; +} + +/*-------------------------------------------------------------------------- + * dequant_peaks() + * + * Reads codebook vector and scales peak + *--------------------------------------------------------------------------*/ + +static void dequant_peaks( + Decoder_State *st, /* i/o: decoder state structure */ + float *vect_out, /* o : Quantized vector */ + const float *peak_gain /* i : Peak gain */ +) +{ + float xq[4]; + const float *tmp; + int16_t i, hvq_cb_rev; + int16_t cb_idx; + + hvq_cb_rev = get_next_indice( st, 1 ); + cb_idx = get_next_indice( st, 8 ); + + if ( hvq_cb_rev ) + { + tmp = &hvq_peak_cb[cb_idx * 4 + 3]; + for ( i = 0; i < 4; i++ ) + { + xq[i] = tmp[-i]; + } + } + else + { + mvr2r( &hvq_peak_cb[cb_idx * 4], xq, 4 ); + } + if ( vect_out[0] == 0 ) + { + vect_out[0] = xq[0] * *peak_gain; + vect_out[1] = xq[1] * *peak_gain; + } + else + { + if ( fabs( peak_gain[-1] ) <= fabs( *peak_gain ) ) + { + vect_out[0] = xq[0] * *peak_gain; + vect_out[1] = xq[1] * *peak_gain; + } + else + { + if ( vect_out[1] == 0 || fabs( peak_gain[-1] ) <= fabs( *peak_gain ) ) + { + vect_out[1] = xq[1] * *peak_gain; + } + } + } + vect_out[2] = *peak_gain; + vect_out[3] = xq[2] * *peak_gain; + vect_out[4] = xq[3] * *peak_gain; + + return; +} + +/*-------------------------------------------------------------------------- + * hvq_dec_pos() + * + * HVQ decode peak positions + *--------------------------------------------------------------------------*/ + +static int16_t hvq_dec_pos( + Decoder_State *st, /* i/o: decoder state structure */ + int16_t *pos_vec, /* o : decoded peak positions */ + const int16_t length, /* i : length */ + const int16_t num_peaks /* i : number of peaks */ +) +{ + int16_t peak_idx[HVQ_MAX_PEAKS]; + int16_t delta[HVQ_MAX_PEAKS]; + int16_t sign_vec[HVQ_MAX_PEAKS]; + + int16_t mode; + int16_t num_bits; + int16_t i, j; + + num_bits = 0; + set_s( pos_vec, 0, length ); + + mode = get_next_indice( st, 1 ); + num_bits += 1; + + if ( mode == HVQ_CP_DELTA ) + { + huff_dec( st, num_peaks, HVQ_CP_HUFF_MAX_CODE, HVQ_CP_HUFF_NUM_LEN, hvq_cp_huff_thres, hvq_cp_huff_offset, hvq_cp_huff_tab, delta ); + + for ( i = 0; i < num_peaks; i++ ) + { + num_bits += hvq_cp_huff_len[delta[i]]; + } + + peak_idx[0] = delta[0] - HVQ_CP_HUFF_OFFSET; + /* safety check in case of bit errors */ + if ( peak_idx[0] < 2 ) + { + peak_idx[0] = 2; + st->BER_detect = 1; + } + for ( i = 1; i < num_peaks; i++ ) + { + peak_idx[i] = delta[i] + peak_idx[i - 1] + HVQ_CP_HUFF_OFFSET; + /* safety check in case of bit errors */ + if ( peak_idx[i] >= HVQ_THRES_BIN_32k ) + { + peak_idx[i] = HVQ_THRES_BIN_32k - 1; + st->BER_detect = 1; + } + } + + for ( i = 0; i < num_peaks; i++ ) + { + pos_vec[peak_idx[i]] = 1; + } + } + else + { + num_bits += sparse_dec_pos( st, pos_vec, length ); + } + + for ( i = 0; i < num_peaks; i++ ) + { + sign_vec[i] = ( get_next_indice_1( st ) == 0 ) ? -1 : 1; + } + num_bits += num_peaks; + + for ( i = 0, j = 0; i < length && j < num_peaks; i++ ) /* safety check in case of bit errors */ + { + if ( pos_vec[i] ) + { + pos_vec[i] *= sign_vec[j++]; + } + } + + return num_bits; +} + +/*-------------------------------------------------------------------------- + * sparse_dec_pos() + * + * Sparse decode positions + *--------------------------------------------------------------------------*/ + +/*! r: number of bits decoded */ +static int16_t sparse_dec_pos( + Decoder_State *st, /* i/o: decoder state structure */ + int16_t *out, /* o : decoded peak positions */ + const int16_t length /* i : length */ +) +{ + int16_t layer2[HVQ_CP_L2_MAX]; + int16_t layer_length; + int16_t i, j; + int16_t bits; + int16_t idx, val; + + set_s( layer2, 0, HVQ_CP_L2_MAX ); + set_s( out, 0, length ); + bits = 0; + + layer_length = (int16_t) ( (float) length / HVQ_CP_L1_LEN + 0.5 ); + + for ( i = 0; i < layer_length; i++ ) + { + layer2[i] = get_next_indice_1( st ); + } + bits += layer_length; + + for ( j = 0; j < layer_length; j++ ) + { + if ( layer2[j] ) + { + idx = get_next_indice( st, HVQ_CP_MAP_IDX_LEN ); + bits += HVQ_CP_MAP_IDX_LEN; + + val = hvq_cp_layer1_map5[idx]; + + /* safety check in case of bit errors */ + if ( j == 0 && val > 4 ) /* out[0] and out[1] are invalid positions */ + { + st->BER_detect = 1; + val = 4; + } + for ( i = min( ( j + 1 ) * HVQ_CP_L1_LEN, length ) - 1; i >= j * HVQ_CP_L1_LEN; i-- ) + { + out[i] = val & 1; + val >>= 1; + } + } + } + + return bits; +} diff --git a/lib_dec/pit_dec.c b/lib_dec/pit_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..2f19d70795ad227e0b8060d4651abfd247a5d67d --- /dev/null +++ b/lib_dec/pit_dec.c @@ -0,0 +1,839 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include "options.h" +#include "cnst.h" +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*----------------------------------------------------------* + * pit_decode() + * + * Decode OL pitch lag + *----------------------------------------------------------*/ + +/*! r: floating pitch value */ +float pit_decode( + Decoder_State *st, /* i/o: decoder state structure */ + const int32_t core_brate, /* i : core bitrate */ + const int16_t Opt_AMR_WB, /* i : flag indicating AMR-WB IO mode */ + const int16_t L_frame, /* i : length of the frame */ + int16_t i_subfr, /* i : subframe index */ + const int16_t coder_type, /* i : coding type */ + int16_t *limit_flag, /* i/o: restrained(0) or extended(1) Q limits */ + int16_t *T0, /* o : close loop integer pitch */ + int16_t *T0_frac, /* o : close loop fractional part of the pitch */ + int16_t *T0_min, /* i/o: delta search min */ + int16_t *T0_max, /* i/o: delta search max */ + const int16_t L_subfr, /* i : subframe length */ + const int16_t tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag */ + const float tdm_Pri_pitch_buf[] /* i : primary channel pitch buffer */ +) +{ + float pitch; + int16_t pitch_index, nBits, pit_flag; + + pitch_index = 0; + + /*----------------------------------------------------------------* + * Set pit_flag = 0 for every subframe with absolute pitch search + *----------------------------------------------------------------*/ + + pit_flag = i_subfr; + if ( i_subfr == 2 * L_SUBFR ) + { + pit_flag = 0; + } + + /*-------------------------------------------------------* + * Retrieve the pitch index + *-------------------------------------------------------*/ + + if ( !Opt_AMR_WB ) + { + /*----------------------------------------------------------------* + * pitch Q: Set limit_flag to 0 for restrained limits, and 1 for extended limits + *----------------------------------------------------------------*/ + + if ( i_subfr == 0 ) + { + *limit_flag = 1; + + if ( coder_type == VOICED ) + { + *limit_flag = 2; /* double-extended limits */ + } + + if ( coder_type == GENERIC && core_brate == ACELP_7k20 ) + { + *limit_flag = 0; + } + } + else if ( i_subfr == 2 * L_SUBFR && coder_type == GENERIC && core_brate <= ACELP_13k20 ) + { + if ( *T0 > ( PIT_FR1_EXTEND_8b + PIT_MIN ) >> 1 ) + { + *limit_flag = 0; + } + } + + /*-------------------------------------------------------* + * Retrieve the number of Q bits + *-------------------------------------------------------*/ + + nBits = 0; + if ( coder_type != AUDIO ) + { + nBits = st->acelp_cfg.pitch_bits[i_subfr / L_subfr]; + + pitch_index = get_next_indice( st, nBits ); + } + + /*-------------------------------------------------------* + * Pitch decoding in AUDIO mode + * (both ACELP@12k8 and ACELP@16k cores) + *-------------------------------------------------------*/ + + if ( coder_type == AUDIO ) + { + if ( L_subfr == L_FRAME / 2 && i_subfr != 0 ) + { + pit_flag = L_SUBFR; + } + + if ( pit_flag == 0 ) + { + nBits = 10; + } + else + { + nBits = 6; + } + + pitch_index = get_next_indice( st, nBits ); + + if ( L_subfr == L_FRAME / 2 && i_subfr != 0 && pitch_index >= 32 ) /* safety check in case of bit errors */ + { + pitch_index = pitch_index >> 1; + st->BER_detect = 1; + } + + pit_Q_dec( 0, pitch_index, nBits, 4, pit_flag, *limit_flag, T0, T0_frac, T0_min, T0_max, &st->BER_detect ); + } + else if ( coder_type == VOICED ) + { + /*-------------------------------------------------------* + * Pitch decoding in VOICED mode + * (ACELP@12k8 core only) + *-------------------------------------------------------*/ + + if ( i_subfr == 2 * L_SUBFR ) + { + pit_flag = i_subfr; + } + + pit_Q_dec( 0, pitch_index, nBits, 4, pit_flag, *limit_flag, T0, T0_frac, T0_min, T0_max, &st->BER_detect ); + } + else if ( st->idchan == 1 && ( tdm_Pitch_reuse_flag == 1 || nBits == 4 ) ) + { + /*-------------------------------------------------------* + * Pitch decoding with reusing of primary channel information + *-------------------------------------------------------*/ + int16_t loc_T0, loc_frac, delta; + + delta = 4; + pit_flag = L_SUBFR; + + if ( L_subfr == 2 * L_SUBFR ) + { + loc_T0 = (int16_t) ( 0.5f * tdm_Pri_pitch_buf[i_subfr / L_SUBFR] + 0.5f * tdm_Pri_pitch_buf[( i_subfr + L_SUBFR ) / L_SUBFR] ); + loc_frac = (int16_t) ( ( ( 0.5f * tdm_Pri_pitch_buf[i_subfr / L_SUBFR] + 0.5f * tdm_Pri_pitch_buf[( i_subfr + L_SUBFR ) / L_SUBFR] ) - loc_T0 ) * 4.0f ); + } + else + { + loc_T0 = (int16_t) tdm_Pri_pitch_buf[i_subfr / L_SUBFR]; + loc_frac = (int16_t) ( ( tdm_Pri_pitch_buf[i_subfr / L_SUBFR] - loc_T0 ) * 4.0f ); + } + + limit_T0( L_FRAME, delta, pit_flag, *limit_flag, loc_T0, loc_frac, T0_min, T0_max ); + + if ( nBits > 0 ) + { + pit_Q_dec( 0, pitch_index, nBits, delta, pit_flag, *limit_flag, T0, T0_frac, T0_min, T0_max, &st->BER_detect ); + } + else + { + *T0 = loc_T0; + *T0_frac = loc_frac; + } + } + else + { + /*-------------------------------------------------------* + * Pitch decoding in GENERIC mode + * (both ACELP@12k8 and ACELP@16k cores) + *-------------------------------------------------------*/ + + if ( L_frame == L_FRAME ) + { + pit_Q_dec( 0, pitch_index, nBits, 8, pit_flag, *limit_flag, T0, T0_frac, T0_min, T0_max, &st->BER_detect ); + } + else + { + pit16k_Q_dec( pitch_index, nBits, *limit_flag, T0, T0_frac, T0_min, T0_max, &st->BER_detect ); + } + } + } + + /*-------------------------------------------------------* + * Pitch decoding in AMR-WB IO mode + *-------------------------------------------------------*/ + + else + { + *limit_flag = 0; + + if ( i_subfr == 0 || ( i_subfr == 2 * L_SUBFR && core_brate == ACELP_8k85 ) ) + { + nBits = 8; + } + else + { + nBits = 5; + } + + if ( core_brate > ACELP_8k85 ) + { + nBits = 6; + + if ( i_subfr == 0 || i_subfr == 2 * L_SUBFR ) + { + nBits = 9; + } + } + + pitch_index = get_next_indice( st, nBits ); + + pit_Q_dec( 1, pitch_index, nBits, 8, pit_flag, *limit_flag, T0, T0_frac, T0_min, T0_max, &st->BER_detect ); + } + + /*-------------------------------------------------------* + * Compute floating pitch output + *-------------------------------------------------------*/ + + pitch = (float) ( *T0 ) + (float) ( *T0_frac ) / 4.0f; + + return pitch; +} + + +/*---------------------------------------------------------------------* + * abs_pit_dec() + * + * Decode the absolute pitch + *---------------------------------------------------------------------*/ + +void abs_pit_dec( + const int16_t fr_steps, /* i : fractional resolution steps (0, 2, 4) */ + int16_t pitch_index, /* i : pitch index */ + const int16_t limit_flag, /* i : restrained(0) or extended(1) limits */ + int16_t *T0, /* o : integer pitch lag */ + int16_t *T0_frac /* o : pitch fraction */ +) +{ + if ( limit_flag == 0 ) + { + if ( fr_steps == 2 ) + { + if ( pitch_index < ( PIT_FR1_8b - PIT_MIN ) * 2 ) + { + *T0 = PIT_MIN + ( pitch_index / 2 ); + *T0_frac = pitch_index - ( ( *T0 - PIT_MIN ) * 2 ); + *T0_frac *= 2; + } + else + { + *T0 = pitch_index + PIT_FR1_8b - ( ( PIT_FR1_8b - PIT_MIN ) * 2 ); + *T0_frac = 0; + } + } + else if ( fr_steps == 4 ) + { + if ( pitch_index < ( PIT_FR2_9b - PIT_MIN ) * 4 ) + { + *T0 = PIT_MIN + ( pitch_index / 4 ); + *T0_frac = pitch_index - ( *T0 - PIT_MIN ) * 4; + } + else if ( pitch_index < ( ( PIT_FR2_9b - PIT_MIN ) * 4 + ( PIT_FR1_9b - PIT_FR2_9b ) * 2 ) ) + { + pitch_index -= ( PIT_FR2_9b - PIT_MIN ) * 4; + *T0 = PIT_FR2_9b + ( pitch_index / 2 ); + *T0_frac = pitch_index - ( *T0 - PIT_FR2_9b ) * 2; + ( *T0_frac ) *= 2; + } + else + { + *T0 = pitch_index + PIT_FR1_9b - ( ( PIT_FR2_9b - PIT_MIN ) * 4 ) - ( ( PIT_FR1_9b - PIT_FR2_9b ) * 2 ); + *T0_frac = 0; + } + } + else /* fr_steps == 0 */ + { + /* not used in the codec */ + } + } + else if ( limit_flag == 1 ) /* extended Q range */ + { + if ( fr_steps == 2 ) + { + if ( pitch_index < ( PIT_FR1_EXTEND_8b - PIT_MIN_EXTEND ) * 2 ) + { + *T0 = PIT_MIN_EXTEND + ( pitch_index / 2 ); + *T0_frac = pitch_index - ( ( *T0 - PIT_MIN_EXTEND ) * 2 ); + *T0_frac *= 2; + } + else + { + *T0 = pitch_index + PIT_FR1_EXTEND_8b - ( ( PIT_FR1_EXTEND_8b - PIT_MIN_EXTEND ) * 2 ); + *T0_frac = 0; + } + } + else if ( fr_steps == 4 ) + { + if ( pitch_index < ( PIT_FR2_EXTEND_9b - PIT_MIN_EXTEND ) * 4 ) + { + *T0 = PIT_MIN_EXTEND + ( pitch_index / 4 ); + *T0_frac = pitch_index - ( *T0 - PIT_MIN_EXTEND ) * 4; + } + else if ( pitch_index < ( ( PIT_FR2_EXTEND_9b - PIT_MIN_EXTEND ) * 4 + ( PIT_FR1_EXTEND_9b - PIT_FR2_EXTEND_9b ) * 2 ) ) + { + pitch_index -= ( PIT_FR2_EXTEND_9b - PIT_MIN_EXTEND ) * 4; + *T0 = PIT_FR2_EXTEND_9b + ( pitch_index / 2 ); + *T0_frac = pitch_index - ( *T0 - PIT_FR2_EXTEND_9b ) * 2; + ( *T0_frac ) *= 2; + } + else + { + *T0 = pitch_index + PIT_FR1_EXTEND_9b - ( ( PIT_FR2_EXTEND_9b - PIT_MIN_EXTEND ) * 4 ) - ( ( PIT_FR1_EXTEND_9b - PIT_FR2_EXTEND_9b ) * 2 ); + *T0_frac = 0; + } + } + else /* fr_steps == 0 */ + { + /* not used in the codec */ + } + } + else /* limit_flag == 2 */ + { + if ( fr_steps == 2 ) + { + if ( pitch_index < ( PIT_FR1_DOUBLEEXTEND_8b - PIT_MIN_DOUBLEEXTEND ) * 2 ) + { + *T0 = PIT_MIN_DOUBLEEXTEND + ( pitch_index / 2 ); + *T0_frac = pitch_index - ( ( *T0 - PIT_MIN_DOUBLEEXTEND ) * 2 ); + *T0_frac *= 2; + } + else + { + *T0 = pitch_index + PIT_FR1_DOUBLEEXTEND_8b - ( ( PIT_FR1_DOUBLEEXTEND_8b - PIT_MIN_DOUBLEEXTEND ) * 2 ); + *T0_frac = 0; + } + } + else if ( fr_steps == 4 ) + { + if ( pitch_index < ( PIT_FR2_DOUBLEEXTEND_9b - PIT_MIN_DOUBLEEXTEND ) * 4 ) + { + *T0 = PIT_MIN_DOUBLEEXTEND + ( pitch_index / 4 ); + *T0_frac = pitch_index - ( *T0 - PIT_MIN_DOUBLEEXTEND ) * 4; + } + else if ( pitch_index < ( ( PIT_FR2_DOUBLEEXTEND_9b - PIT_MIN_DOUBLEEXTEND ) * 4 + ( PIT_FR1_DOUBLEEXTEND_9b - PIT_FR2_DOUBLEEXTEND_9b ) * 2 ) ) + { + pitch_index -= ( PIT_FR2_DOUBLEEXTEND_9b - PIT_MIN_DOUBLEEXTEND ) * 4; + *T0 = PIT_FR2_DOUBLEEXTEND_9b + ( pitch_index / 2 ); + *T0_frac = pitch_index - ( *T0 - PIT_FR2_DOUBLEEXTEND_9b ) * 2; + ( *T0_frac ) *= 2; + } + else + { + *T0 = pitch_index + PIT_FR1_DOUBLEEXTEND_9b - ( ( PIT_FR2_DOUBLEEXTEND_9b - PIT_MIN_DOUBLEEXTEND ) * 4 ) - ( ( PIT_FR1_DOUBLEEXTEND_9b - PIT_FR2_DOUBLEEXTEND_9b ) * 2 ); + *T0_frac = 0; + } + } + else /* fr_steps == 0 */ + { + /* not used in the codec */ + } + } + + return; +} + + +/*---------------------------------------------------------------------* + * delta_pit_dec() + * + * Decode delta pitch + *---------------------------------------------------------------------*/ + +void delta_pit_dec( + const int16_t fr_steps, /* i : fractional resolution steps (0, 2, 4) */ + const int16_t pitch_index, /* i : pitch index */ + int16_t *T0, /* o : integer pitch lag */ + int16_t *T0_frac, /* o : pitch fraction */ + const int16_t T0_min /* i : delta search min */ +) +{ + if ( fr_steps == 0 ) + { + *T0 = T0_min + pitch_index; + *T0_frac = 0; + } + else if ( fr_steps == 2 ) + { + *T0 = T0_min + pitch_index / 2; + *T0_frac = pitch_index - ( *T0 - T0_min ) * 2; + *T0_frac *= 2; + } + else if ( fr_steps == 4 ) + { + *T0 = T0_min + pitch_index / 4; + *T0_frac = pitch_index - ( *T0 - T0_min ) * 4; + } + + return; +} + + +/*-------------------------------------------------* + * pit_Q_dec() + * + * pitch decoding + *-------------------------------------------------*/ + +void pit_Q_dec( + const int16_t Opt_AMR_WB, /* i : flag indicating AMR-WB IO mode */ + const int16_t pitch_index, /* i : pitch index */ + const int16_t nBits, /* i : # of Q bits */ + const int16_t delta, /* i : Half the CL searched interval */ + const int16_t pit_flag, /* i : absolute(0) or delta(1) pitch Q */ + const int16_t limit_flag, /* i : restrained(0) or extended(1) Q limits */ + int16_t *T0, /* o : integer pitch lag */ + int16_t *T0_frac, /* o : pitch fraction */ + int16_t *T0_min, /* i/o: delta search min */ + int16_t *T0_max, /* i/o: delta search max */ + int16_t *BER_detect /* o : BER detect flag */ +) +{ + if ( nBits == 10 ) /* absolute decoding with 10 bits */ + { + if ( limit_flag == 0 ) + { + *T0 = PIT_MIN + ( pitch_index / 4 ); + *T0_frac = pitch_index - ( *T0 - PIT_MIN ) * 4; + } + else if ( limit_flag == 1 ) + { + *T0 = PIT_MIN_EXTEND + ( pitch_index / 4 ); + *T0_frac = pitch_index - ( *T0 - PIT_MIN_EXTEND ) * 4; + } + else /* limit_flag == 2 */ + { + *T0 = PIT_MIN_DOUBLEEXTEND + ( pitch_index / 4 ); + *T0_frac = pitch_index - ( *T0 - PIT_MIN_DOUBLEEXTEND ) * 4; + } + } + else if ( nBits == 9 ) /* absolute decoding with 9 bits */ + { + abs_pit_dec( 4, pitch_index, limit_flag, T0, T0_frac ); + + /* find T0_min and T0_max for delta search */ + if ( Opt_AMR_WB ) + { + limit_T0( L_FRAME, delta, pit_flag, 0, *T0, 0, T0_min, T0_max ); /* T0_frac==0 to keep IO with AMR-WB */ + } + } + else if ( nBits == 8 ) /* absolute decoding with 8 bits */ + { + abs_pit_dec( 2, pitch_index, limit_flag, T0, T0_frac ); + + /* find T0_min and T0_max for delta search */ + if ( Opt_AMR_WB ) + { + limit_T0( L_FRAME, delta, pit_flag, 0, *T0, 0, T0_min, T0_max ); /* T0_frac==0 to keep IO with AMR-WB */ + } + } + else if ( nBits == 6 ) /* relative decoding with 6 bits */ + { + delta_pit_dec( 4, pitch_index, T0, T0_frac, *T0_min ); + } + else if ( nBits == 5 ) /* relative decoding with 5 bits */ + { + if ( delta == 8 ) + { + delta_pit_dec( 2, pitch_index, T0, T0_frac, *T0_min ); + } + else /* delta == 4 */ + { + delta_pit_dec( 4, pitch_index, T0, T0_frac, *T0_min ); + } + } + else /* nBits == 4 */ /* relative decoding with 4 bits */ + { + if ( delta == 8 ) + { + delta_pit_dec( 0, pitch_index, T0, T0_frac, *T0_min ); + } + else /* delta == 4 */ + { + delta_pit_dec( 2, pitch_index, T0, T0_frac, *T0_min ); + } + } + + /* biterror detection mechanism */ + if ( ( ( *T0 << 2 ) + *T0_frac ) > ( PIT_MAX << 2 ) + 2 && pit_flag == 0 && !Opt_AMR_WB ) + { + *T0 = L_SUBFR; + *T0_frac = 0; + *BER_detect = 1; + } + + if ( !Opt_AMR_WB ) + { + /* find T0_min and T0_max for delta search */ + limit_T0( L_FRAME, delta, L_SUBFR, limit_flag, *T0, *T0_frac, T0_min, T0_max ); + } + + return; +} + +/*-------------------------------------------------* + * pit16k_Q_dec() + * + * pitch decoding @16kHz core + *-------------------------------------------------*/ + +void pit16k_Q_dec( + const int16_t pitch_index, /* i : pitch index */ + const int16_t nBits, /* i : # of Q bits */ + const int16_t limit_flag, /* i : restrained(0) or extended(1) limits */ + int16_t *T0, /* o : integer pitch lag */ + int16_t *T0_frac, /* o : pitch fraction */ + int16_t *T0_min, /* i/o: delta search min */ + int16_t *T0_max, /* i/o: delta search max */ + int16_t *BER_detect /* o : BER detect flag */ +) +{ + int16_t index; + + if ( nBits == 10 ) /* absolute decoding with 10 bits */ + { + { + if ( pitch_index < ( PIT16k_FR2_EXTEND_10b - PIT16k_MIN_EXTEND ) * 4 ) + { + *T0 = PIT16k_MIN_EXTEND + ( pitch_index / 4 ); + *T0_frac = pitch_index - ( ( *T0 - PIT16k_MIN_EXTEND ) * 4 ); + } + else + { + index = pitch_index - ( PIT16k_FR2_EXTEND_10b - PIT16k_MIN_EXTEND ) * 4; + *T0 = PIT16k_FR2_EXTEND_10b + ( index / 2 ); + *T0_frac = index - ( *T0 - PIT16k_FR2_EXTEND_10b ) * 2; + ( *T0_frac ) *= 2; + } + } + } + else if ( nBits == 9 ) /* absolute decoding with 9 bits */ + { + { + if ( pitch_index < ( PIT16k_FR2_EXTEND_9b - PIT16k_MIN_EXTEND ) * 4 ) + { + *T0 = PIT16k_MIN_EXTEND + ( pitch_index / 4 ); + *T0_frac = pitch_index - ( *T0 - PIT16k_MIN_EXTEND ) * 4; + } + else if ( pitch_index < ( ( PIT16k_FR2_EXTEND_9b - PIT16k_MIN_EXTEND ) * 4 + ( PIT16k_FR1_EXTEND_9b - PIT16k_FR2_EXTEND_9b ) * 2 ) ) + { + index = pitch_index - ( PIT16k_FR2_EXTEND_9b - PIT16k_MIN_EXTEND ) * 4; + *T0 = PIT16k_FR2_EXTEND_9b + ( index / 2 ); + *T0_frac = index - ( *T0 - PIT16k_FR2_EXTEND_9b ) * 2; + ( *T0_frac ) *= 2; + } + else + { + *T0 = pitch_index + PIT16k_FR1_EXTEND_9b - ( ( PIT16k_FR2_EXTEND_9b - PIT16k_MIN_EXTEND ) * 4 ) - ( ( PIT16k_FR1_EXTEND_9b - PIT16k_FR2_EXTEND_9b ) * 2 ); + *T0_frac = 0; + } + } + } + else /* nBits == 6 */ /* relative decoding with 6 bits */ + { + delta_pit_dec( 4, pitch_index, T0, T0_frac, *T0_min ); + } + + /* biterror detection mechanism */ + if ( ( ( *T0 << 2 ) + *T0_frac ) > ( PIT16k_MAX << 2 ) && nBits >= 9 ) + { + *T0 = L_SUBFR; + *T0_frac = 0; + *BER_detect = 1; + } + + /* find T0_min and T0_max for delta search */ + limit_T0( L_FRAME16k, 8, L_SUBFR, limit_flag, *T0, *T0_frac, T0_min, T0_max ); + + return; +} + + +/*----------------------------------------------------------* + * Mode2_pit_decode() + * + * Decode pitch lag + *----------------------------------------------------------*/ + +/*! r: floating pitch value */ +float Mode2_pit_decode( + const int16_t coder_type, /* i : coding model */ + const int16_t i_subfr, /* i : subframe index */ + const int16_t L_subfr, /* i : sub-frame length */ + int16_t **pt_indice, /* i/o: quantization indices pointer */ + int16_t *T0, /* i/o: close loop integer pitch */ + int16_t *T0_frac, /* o : close loop fractional part of the pitch */ + int16_t *T0_res, /* i/o: pitch resolution */ + int16_t *T0_min, /* i/o: lower limit for close-loop search */ + int16_t *T0_min_frac, /* i/o: lower limit for close-loop search */ + int16_t *T0_max, /* i/o: higher limit for close-loop search */ + int16_t *T0_max_frac, /* i/o: higher limit for close-loop search */ + const int16_t pit_min, + const int16_t pit_fr1, + const int16_t pit_fr1b, + const int16_t pit_fr2, + const int16_t pit_max, + const int16_t pit_res_max ) +{ + float pitch; + int16_t pit_res_max2; + + if ( coder_type == 0 ) /*Unvoiced Coding do nothing*/ + { + *T0 = L_subfr; + *T0_frac = 0; + *T0_res = 1; + } + else if ( coder_type == 1 ) /* 8/4/4/4 (EVS) */ + { + if ( i_subfr == 0 ) + { + Mode2_abs_pit_dec( T0, T0_frac, T0_res, pt_indice, pit_min, pit_fr1b, pit_min, pit_res_max ); + } + else + { + limit_T0_voiced( 4, pit_res_max >> 1, *T0, *T0_frac, *T0_res, T0_min, T0_min_frac, T0_max, T0_max_frac, pit_min, pit_max ); + *T0_res = ( pit_res_max >> 1 ); + Mode2_delta_pit_dec( T0, T0_frac, *T0_res, T0_min, T0_min_frac, pt_indice ); + } + } + else if ( coder_type == 2 ) /* 8/5/8/5 (EVS) */ + { + + if ( ( i_subfr == 0 ) || ( i_subfr == 2 * L_subfr ) ) + { + Mode2_abs_pit_dec( T0, T0_frac, T0_res, pt_indice, pit_min, pit_fr1b, pit_min, pit_res_max ); + } + else + { + limit_T0_voiced( 5, pit_res_max >> 1, *T0, *T0_frac, *T0_res, T0_min, T0_min_frac, T0_max, T0_max_frac, pit_min, pit_max ); + *T0_res = ( pit_res_max >> 1 ); + Mode2_delta_pit_dec( T0, T0_frac, *T0_res, T0_min, T0_min_frac, pt_indice ); + } + } + else if ( coder_type == 3 ) /* 9/6/6/6 (HRs- VC) */ + { + pit_res_max2 = pit_res_max; + if ( pit_min == PIT_MIN_16k ) + { + pit_res_max2 = pit_res_max >> 1; + } + + if ( i_subfr == 0 ) + { + Mode2_abs_pit_dec( T0, T0_frac, T0_res, pt_indice, pit_min, pit_fr1, pit_fr2, pit_res_max ); + } + else + { + limit_T0_voiced( 6, pit_res_max2, *T0, 0, 1, T0_min, T0_min_frac, T0_max, T0_max_frac, pit_min, pit_max ); + *T0_res = pit_res_max2; + Mode2_delta_pit_dec( T0, T0_frac, *T0_res, T0_min, T0_min_frac, pt_indice ); + } + } + else if ( coder_type == 4 ) /* 9/6/9/6 (AMRWB) */ + { + pit_res_max2 = pit_res_max; + if ( pit_min == PIT_MIN_16k ) + { + pit_res_max2 = pit_res_max >> 1; + } + + if ( ( i_subfr == 0 ) || ( i_subfr == 2 * L_subfr ) ) + { + Mode2_abs_pit_dec( T0, T0_frac, T0_res, pt_indice, pit_min, pit_fr1, pit_fr2, pit_res_max ); + } + else + { + limit_T0_voiced( 6, pit_res_max2, *T0, 0, 1, T0_min, T0_min_frac, T0_max, T0_max_frac, pit_min, pit_max ); + *T0_res = pit_res_max2; + Mode2_delta_pit_dec( T0, T0_frac, *T0_res, T0_min, T0_min_frac, pt_indice ); + } + } + else if ( coder_type == 8 ) /* 8/5/5/5 (RF all pred mode) */ + { + if ( i_subfr == 0 ) + { + Mode2_abs_pit_dec( T0, T0_frac, T0_res, pt_indice, pit_min, pit_fr1b, pit_min, pit_res_max ); + } + else + { + limit_T0_voiced( 5, pit_res_max >> 1, *T0, *T0_frac, *T0_res, T0_min, T0_min_frac, T0_max, T0_max_frac, pit_min, pit_max ); + *T0_res = ( pit_res_max >> 1 ); + Mode2_delta_pit_dec( T0, T0_frac, *T0_res, T0_min, T0_min_frac, pt_indice ); + } + } + else if ( coder_type == 9 ) /* 8/0/8/0 (RF gen pred mode) */ + { + if ( i_subfr == 0 ) + { + Mode2_abs_pit_dec( T0, T0_frac, T0_res, pt_indice, pit_min, pit_fr1b, pit_min, pit_res_max ); + } + else + { + limit_T0_voiced( 4, pit_res_max >> 1, *T0, *T0_frac, *T0_res, T0_min, T0_min_frac, T0_max, T0_max_frac, pit_min, pit_max ); + *T0_res = ( pit_res_max >> 1 ); + Mode2_delta_pit_dec( T0, T0_frac, *T0_res, T0_min, T0_min_frac, pt_indice ); + } + } + else /*RCELP 8 bits pitch delay*/ + { + assert( 0 ); + } + + /*-------------------------------------------------------* + * Compute floating pitch output + *-------------------------------------------------------*/ + + pitch = (float) ( *T0 ) + (float) ( *T0_frac ) / (float) ( *T0_res ); /* save subframe pitch values */ + + return pitch; +} + + +/*---------------------------------------------------------------------* + * Mode2_abs_pit_dec() + * + * Decode the absolute pitch + *---------------------------------------------------------------------*/ + +void Mode2_abs_pit_dec( + int16_t *T0, /* o : integer pitch lag */ + int16_t *T0_frac, /* o : pitch fraction */ + int16_t *T0_res, /* o : pitch resolution */ + int16_t **pt_indice, /* i/o: pointer to Vector of Q indexes */ + const int16_t pit_min, + const int16_t pit_fr1, + const int16_t pit_fr2, + const int16_t pit_res_max ) +{ + int16_t index; + int16_t pit_res_max_half; + + index = **pt_indice; + ( *pt_indice )++; + pit_res_max_half = pit_res_max >> 1; + + if ( index < ( pit_fr2 - pit_min ) * pit_res_max ) + { + *T0 = pit_min + ( index / pit_res_max ); + + *T0_frac = index - ( *T0 - pit_min ) * pit_res_max; + *T0_res = pit_res_max; + } + else if ( index < ( ( pit_fr2 - pit_min ) * pit_res_max + ( pit_fr1 - pit_fr2 ) * pit_res_max_half ) ) + { + index -= ( pit_fr2 - pit_min ) * pit_res_max; + + *T0 = pit_fr2 + ( index / pit_res_max_half ); + + *T0_frac = index - ( *T0 - pit_fr2 ) * pit_res_max_half; + *T0_res = pit_res_max_half; + } + else + { + *T0 = index + pit_fr1 - ( ( pit_fr2 - pit_min ) * pit_res_max ) - ( ( pit_fr1 - pit_fr2 ) * pit_res_max_half ); + *T0_frac = 0; + *T0_res = 1; + } + + return; +} + + +/*---------------------------------------------------------------------* + * Routine Mode2_delta_pit_dec() + * + * Decode delta pitch + *---------------------------------------------------------------------*/ + +void Mode2_delta_pit_dec( + int16_t *T0, /* o : integer pitch lag */ + int16_t *T0_frac, /* o : pitch fraction */ + int16_t T0_res, /* i : pitch resolution */ + int16_t *T0_min, /* i/o: delta search min */ + int16_t *T0_min_frac, /* i : delta search min */ + int16_t **pt_indice /* i/o: pointer to Vector of Q indexes */ +) +{ + int16_t index; + + index = **pt_indice; + ( *pt_indice )++; + + *T0 = *T0_min + ( index + *T0_min_frac ) / T0_res; + + *T0_frac = index + *T0_min_frac - ( *T0 - *T0_min ) * T0_res; + + return; +} diff --git a/lib_dec/pitch_extr.c b/lib_dec/pitch_extr.c new file mode 100644 index 0000000000000000000000000000000000000000..209370d2f2d27fe5880ace741332fe0038013fa4 --- /dev/null +++ b/lib_dec/pitch_extr.c @@ -0,0 +1,348 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include + +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "basop_util.h" +#include "wmc_auto.h" + + +/*-----------------------------------------------------------------* + * Pitch prediction for frame erasure using linear fitting * + *-----------------------------------------------------------------*/ + +void pitch_pred_linear_fit( + const int16_t nbLostCmpt, /* i : bfi counter */ + const int16_t last_good, /* i : last classification type */ + float *old_pitch_buf, /* i : pitch lag buffer */ + float *old_fpitch, /* i : */ + float *T0_out, /* o : estimated close loop pitch */ + const int16_t pit_min, /* i : Minimum pitch lag */ + const int16_t pit_max, /* i : Maximum pitch lag */ + float *mem_pitch_gain, /* i : pitch gain [0] is the most recent subfr gain */ + const int16_t limitation, + const int16_t plc_use_future_lag, /* i : */ + int16_t *extrapolationFailed, /* o : flag if extrap decides not to change the pitch*/ + const int16_t nb_subfr /* i : number of ACELP subframes */ +) +{ + float T0 = 0; + float mdy, dy[5], ftmp; + int16_t lcor = 5; + int16_t imax, i; + float pg[8], ml[8]; /* local buffer for pitch gain and mem_lag*/ + int16_t no_subfr_pred; + float mem_lag[2 * NB_SUBFR16k + 2]; + + + if ( nb_subfr == 4 ) + { + for ( i = 0; i < 2 * NB_SUBFR + 2; i++ ) + { + mem_lag[i] = old_pitch_buf[2 * NB_SUBFR + 1 - i]; + } + } + else /* L_frame == L_FRAME16k */ + { + for ( i = 0; i < 2 * NB_SUBFR16k + 2; i++ ) + { + mem_lag[i] = old_pitch_buf[2 * NB_SUBFR16k + 1 - i]; + } + } + + if ( (int16_t) *old_fpitch > pit_max ) + { + *extrapolationFailed = 1; + *T0_out = pit_max; + printf( "\n WARNING: *old_fpitch > pit_max : old_fpitch = %f, pit_max = %i \n\n", *old_fpitch, pit_max ); + return; + } + + if ( nbLostCmpt == 1 && last_good >= UNVOICED_TRANSITION && last_good < ONSET ) + { + if ( plc_use_future_lag ) + { + no_subfr_pred = 2; + } + else + { + no_subfr_pred = 4; + } + + /* copy to local buffers, depending on availability of info about future subframes */ + mvr2r( mem_pitch_gain + no_subfr_pred - 2, pg, 8 ); + mvr2r( mem_lag + no_subfr_pred - 2, ml, 8 ); + + mdy = 0.0f; + for ( i = ( lcor - 1 ); i >= 0; i-- ) + { + dy[i] = ( ml[i] - ml[i + 1] ); + mdy += dy[i]; + } + + /*---------------------------------------------------* + * remove maximum variation + *---------------------------------------------------*/ + ftmp = (float) fabs( dy[0] ); + imax = 0; + for ( i = 1; i < lcor; i++ ) + { + if ( ftmp < (float) fabs( dy[i] ) ) + { + ftmp = (float) fabs( dy[i] ); + imax = i; + } + } + if ( ( fabs( dy[imax] ) < 0.15f * *old_fpitch ) && ( ( limitation == 1 ) || ( fabs( dy[imax] ) < fabs( mdy ) ) ) ) + { + Word16 pg_fx[5]; + Word32 ml_fx[5]; + Word32 pit, a, b, pita, pitb; + Word16 sum0; + Word16 const timeWeight[5] = { 20480 /*1.25f Q14*/, 18432 /*1.125f Q14*/, 16384 /*1.f Q14*/, 14336 /*0.875f Q14*/, 12288 /*.75f Q14*/ }; /*Q14*/ + Word16 a1, a2, a3, a4, a5, tmpa, tmpb, b1, b2, b3, b4, b5; + Word16 a_e, b_e, sum0_q; + + /* convert gains and lags to fixed precision */ + for ( i = 0; i < lcor; i++ ) + { + pg_fx[i] = (int16_t) ( pg[i] / pow( 2.f, -15 + 1 ) ); /* Q14 */ + ml_fx[i] = (int32_t) ( ml[i] / pow( 2.f, -31 + 15 ) ); /* Q16 */ + } + +#define WMC_TOOL_SKIP + FOR( i = 0; i < lcor; i++ ) + { + pg_fx[i] = mult( mult( pg_fx[i], pg_fx[i] ), timeWeight[i] ); /*Q12 'til pg[lcor-1], Q14 'til pg[8]*/ + move16(); + } + + /* Linear prediction (estimation) of pitch */ + /* sum0=(pg[1]+4*pg[2]+9*pg[3]+16*pg[4])*pg[0]+(pg[2]+4*pg[3]+9*pg[4])*pg[1]+(pg[3]+4*pg[4])*pg[2]+pg[4]*pg[3];*/ + { + Word32 t1, t2, t3, t4, t5, t6, t7; + Word16 e1, e2, e3, e4, e5, e6, e7; +#ifdef BASOP_NOGLOB + Flag Overflow; +#endif + t1 = L_mult0( pg_fx[4], pg_fx[3] ); /*Q24*/ /* t1 = pg[4]*pg[3] */ + e1 = 7; + t2 = L_add( L_deposit_l( pg_fx[3] ), L_shl( L_deposit_l( pg_fx[4] ), 2 ) ); /*Q12*/ + e2 = norm_l( t2 ); + t2 = L_shl( t2, e2 ); /*Q12,-e2*/ + t2 = Mpy_32_16_1( t2, pg_fx[2] ); /*Q9,-e2*/ /* t2 = (pg[3]+4*pg[4])*pg[2] */ + e2 = sub( 22, e2 ); + t3 = L_add( L_deposit_l( pg_fx[2] ), L_add( L_shl( L_deposit_l( pg_fx[3] ), 2 ), L_add( L_shl( L_deposit_l( pg_fx[4] ), 3 ), L_deposit_l( pg_fx[4] ) ) ) ); /*Q12*/ + e3 = norm_l( t3 ); + t3 = L_shl( t3, e3 ); /*Q12,-e3*/ + t3 = Mpy_32_16_1( t3, pg_fx[1] ); /*Q9,-e3*/ /* t3 = (pg[2]+4*pg[3]+9*pg[4])*pg[1] */ + e3 = sub( 22, e3 ); + t4 = L_add( pg_fx[1], L_add( L_shl( L_deposit_l( pg_fx[2] ), 2 ), L_add( L_add( L_shl( L_deposit_l( pg_fx[3] ), 3 ), L_deposit_l( pg_fx[3] ) ), L_shl( L_deposit_l( pg_fx[4] ), 4 ) ) ) ); /*Q12*/ + e4 = norm_l( t4 ); + t4 = L_shl( t4, e4 ); /*Q12,-e4*/ + t4 = Mpy_32_16_1( t4, pg_fx[0] ); /*Q9,-e4*/ /* t4 = (pg[1]+4*pg[2]+9*pg[3]+16*pg[4])*pg[0] */ + e4 = sub( 22, e4 ); + t5 = BASOP_Util_Add_Mant32Exp( t1, e1, t2, e2, &e5 ); + t6 = BASOP_Util_Add_Mant32Exp( t3, e3, t4, e4, &e6 ); + t7 = BASOP_Util_Add_Mant32Exp( t5, e5, t6, e6, &e7 ); /*Q31,e7*/ + sum0_q = norm_l( t7 ); +#ifdef BASOP_NOGLOB + sum0 = round_fx_o( L_shl( t7, sum0_q ), &Overflow ); /*Q15,e7-sum0_q*/ +#else + sum0 = round_fx( L_shl( t7, sum0_q ) ); /*Q15,e7-sum0_q*/ +#endif + sum0_q = add( 15, sub( sum0_q, e7 ) ); /* sum0 is now Qsum0_q*/ + } + + pit = 0; + move16(); + IF( sum0 != 0 ) + { + /* Shift to the right, changing Q as long as no precision is lost */ + WHILE( s_and( sum0, 1 ) == 0 ) + { + sum0 = shr( sum0, 1 ); + sum0_q = sub( sum0_q, 1 ); + } + + /* float: + a=-( + ( 3*pg[1]+4*pg[2]+3*pg[3])*pg[0] */ + /*a1*/ /* + *ml[0] +( + ( 2*pg[2]+2*pg[3])*pg[1]-4*pg[1]*pg[0] */ + /*a2*/ /* + )*ml[1] +( + - 8*pg[2]*pg[0]-3*pg[2]*pg[1]+pg[3]*pg[2] */ + /*a3*/ /* + )*ml[2] +( + -12*pg[3]*pg[0]-6*pg[3]*pg[1]-2*pg[3]*pg[2] */ + /*a4*/ /* + )*ml[3] +( + -16*pg[4]*pg[0] -9*pg[4]*pg[1] -4*pg[4]*pg[2] -pg[4]*pg[3] */ + /*a5*/ /* + )*ml[4] ) /sum0; MAC(19);MULT(9);DIV(1);*/ + + /*magic numbers: Q11 if not DIRECTLY marked otherwise*/ + a5 = mac_r( L_mac( L_mac( L_mult( mult_r( -32768, pg_fx[0] ) /*Q8*/, pg_fx[4] ) /*Q5+16*/, mult_r( -9 * 2048, pg_fx[1] ) /*Q8*/, pg_fx[4] /*Q12*/ ) /*Q5+16*/, mult_r( -4 * 2048, pg_fx[2] ) /*Q8*/, pg_fx[4] /*Q12*/ ) /*Q5+16*/, mult_r( pg_fx[4], -4096 /*Q12->Q9*/ ), mult_r( pg_fx[3], 16384 /*Q12->Q11*/ ) ) /*Q5*/; + a4 = mac_r( L_mac( L_mult( mult_r( -12 * 2048, pg_fx[0] ) /*Q8*/, pg_fx[3] /*Q12*/ ) /*Q5+16*/, mult_r( -6 * 2048, pg_fx[1] ) /*Q8*/, pg_fx[3] /*Q12*/ ) /*Q5+16*/, mult_r( -2 * 2048, pg_fx[2] ) /*Q8*/, pg_fx[3] /*Q12*/ ) /*Q5*/; + a3 = mac_r( L_mac( L_mult( mult_r( -8 * 2048, pg_fx[0] ) /*Q8*/, pg_fx[2] ), mult_r( -3 * 2048, pg_fx[1] ) /*Q8*/, pg_fx[2] ), mult_r( pg_fx[2], 4096 /*Q12->Q9*/ ), mult_r( pg_fx[3], 16384 /*12->Q11*/ ) ); /*Q5*/ + a2 = mac_r( L_mac( L_mult( mult_r( 2 * 2048, pg_fx[1] ) /*Q8*/, pg_fx[2] ) /*Q5+16*/, mult_r( 2 * 2048, pg_fx[1] ) /*Q8*/, pg_fx[3] ) /*Q5+16*/, mult_r( -4 * 2048, pg_fx[0] ) /*Q8*/, pg_fx[1] /*Q12*/ ) /*Q5*/; + a1 = mac_r( L_mac( L_mult( mult_r( 3 * 2048, pg_fx[0] ) /*Q8*/, pg_fx[1] ) /*Q5+16*/, mult_r( 4 * 2048, pg_fx[0] ) /*Q8*/, pg_fx[2] /*Q12*/ ) /*Q5+16*/, mult_r( 3 * 2048, pg_fx[0] ) /*Q8*/, pg_fx[3] /*Q12*/ ) /*Q5*/; + + a = L_mac( L_mac( L_mac( L_mac( L_mult( a1, round_fx( L_shl( ml_fx[0], 4 ) ) ), /*Q4*/ + round_fx( L_shl( ml_fx[1], 4 ) ) /*Q4*/, a2 ), + round_fx( L_shl( ml_fx[2], 4 ) ) /*Q4*/, a3 ), + round_fx( L_shl( ml_fx[3], 4 ) ) /*Q4*/, a4 ), + round_fx( L_shl( ml_fx[4], 4 ) ) /*Q4*/, a5 ); /*Q-6+16 = Q10*/ + + a_e = norm_l( a ); + a = L_shl( a, a_e ); + + a1 = BASOP_Util_Divide3216_Scale( L_negate( a ), /* Numerator */ /*scalefactor 21*/ + sum0, /* Denominator*/ /*scalefactor 10*/ + &tmpa ); /* scalefactor for result */ + + /* Float: + b=(( pg[1]+2*pg[2]+3*pg[3]+4*pg[4])*pg[0] */ + /*b1*/ /* + *ml[0] + + (( pg[2]+2*pg[3]+3*pg[4])*pg[1]-pg[1]*pg[0]) */ + /*b2*/ /* + *ml[1] + + ( -2*pg[2]*pg[0]-pg[2]*pg[1]+(pg[3]+2*pg[4])*pg[2]) */ + /*b3*/ /* + *ml[2] + + ( -3*pg[3]*pg[0]-2*pg[3]*pg[1]-pg[3]*pg[2]+pg[4]*pg[3]) */ + /*b4*/ /* + *ml[3] + + ( -4*pg[4]*pg[0]-3*pg[4]*pg[1]-2*pg[4]*pg[2]-pg[4]*pg[3]) */ + /*b5*/ /* + *ml[4] )/sum0; MAC(22);MULT(9);DIV(1);*/ + + /*magic numbers in Q13 if not DIRECTLY marked otherwise*/ + b1 = mac_r( L_mac( L_mac( L_mult( mult_r( pg_fx[1], pg_fx[0] ), 32768 / 4 ) /*Q7+16*/, mult_r( 2 * 8192, pg_fx[0] ) /*Q10*/, pg_fx[2] /*Q12*/ ) /*Q7+16*/, mult_r( 3 * 8192, pg_fx[0] ) /*Q10*/, pg_fx[3] /*Q12*/ ) /*Q7+16*/, /*mult_r(4*8192,pg_fx[0])*/ pg_fx[0] /*Q10*/, pg_fx[4] /*Q12*/ ) /*Q7*/; + b2 = mac_r( L_mac( L_mac( L_mult( mult_r( pg_fx[2], pg_fx[1] ), 32768 / 4 ) /*Q7+16*/, mult_r( 2 * 8192, pg_fx[1] ), pg_fx[3] ), mult_r( 3 * 8192, pg_fx[1] ), pg_fx[4] ) /*Q7+16*/, mult_r( pg_fx[1], -32768 / 2 /*Q12->Q12*/ ), mult_r( pg_fx[0], 32768 / 2 /*Q12->Q10*/ ) ) /*Q7*/; + b3 = mac_r( L_mac( L_mac( L_mult( mult_r( -2 * 8192, pg_fx[0] ), pg_fx[2] ) /*Q7+16*/, mult_r( pg_fx[2], -32768 / 2 ), mult_r( pg_fx[1], 32768 / 2 ) ), mult_r( pg_fx[3], 32768 / 2 ), mult_r( pg_fx[2], 32768 / 2 ) ) /*Q5+16*/, mult_r( 2 * 8192, pg_fx[2] ), pg_fx[4] ) /*Q7*/; + b4 = mac_r( L_mac( L_mac( L_mult( mult_r( -3 * 8192, pg_fx[0] ), pg_fx[3] ), mult_r( -2 * 8192, pg_fx[1] ), pg_fx[3] ), mult_r( -32768 / 2, pg_fx[3] ), mult_r( 32768 / 2, pg_fx[2] ) ), mult_r( 32768 / 2, pg_fx[4] ), mult_r( 32768 / 2, pg_fx[3] ) ); /*Q7*/ + b5 = mac_r( L_mac( L_mac( L_mult( mult_r( -32768 /*(-4*8192)*/, pg_fx[0] ), pg_fx[4] ), mult_r( -3 * 8192, pg_fx[1] ), pg_fx[4] ), mult_r( -2 * 8192, pg_fx[2] ), pg_fx[4] ), mult_r( -32768 / 2, pg_fx[4] ), mult_r( 32768 / 2, pg_fx[3] ) ) /*Q7*/; + + b = L_mac( L_mac( L_mac( L_mac( L_mult( b1, round_fx( L_shl( ml_fx[0], 4 ) ) ), /*Q4*/ + round_fx( L_shl( ml_fx[1], 4 ) ) /*Q4*/, b2 ), + round_fx( L_shl( ml_fx[2], 4 ) ) /*Q4*/, b3 ), + round_fx( L_shl( ml_fx[3], 4 ) ) /*Q4*/, b4 ), + round_fx( L_shl( ml_fx[4], 4 ) ) /*Q4*/, b5 ); /*Q-4+16 = Q12*/ + /*predict pitch for 4th future subframe*/ + + b_e = norm_l( b ); + b = L_shl( b, b_e ); + + b1 = BASOP_Util_Divide3216_Scale( b, /* Numerator */ /*scalefactor 19*/ + sum0, /* Denominator*/ /*scalefactor 10*/ + &tmpb ); /* scalefactor for result*/ + + /*pit = a + b * ((float)no_subfr_pred + (float)nb_subfr);*/ + pita = L_shl( L_deposit_l( a1 ), add( add( sum0_q, 16 - 10 + 1 ), sub( tmpa, a_e ) ) ) /*Q16*/; + pitb = L_shl_r( L_mult( b1 /*Q15*/, add( no_subfr_pred, nb_subfr ) /*Q0*/ ), add( add( sum0_q, 16 - 12 ), sub( tmpb, b_e ) ) ); + pit = L_add( pita, pitb ); /*Q16*/ +#undef WMC_TOOL_SKIP + + /* convert pitch back to float precision */ + T0 = (float) ( pit * pow( 2.f, -31 + 15 ) ); + + /*limit pitch to allowed range*/ + if ( T0 > pit_max ) + { + T0 = (float) pit_max; + } + + if ( T0 < pit_min ) + { + T0 = (float) pit_min; + } + + *extrapolationFailed = 0; + } + else + { + T0 = 0; + *extrapolationFailed = 1; + } + } + else + { + T0 = 0; + *extrapolationFailed = 1; + } + } + else + { + T0 = *old_fpitch; + *extrapolationFailed = 1; + } + + *T0_out = T0; + + return; +} + + +void get_subframe_pitch( + const int16_t nSubframes, /* i : number of subframes */ + float pitchStart, /* i : starting pitch lag (in subframe -1) */ + float pitchEnd, /* i : ending pitch lag (in subframe nSubframes-1) */ + float *pitchBuf /* o : interpolated pitch lag per subframe */ +) +{ + int16_t i; + float pitchDelta; + + assert( ( nSubframes > 0 ) && ( pitchBuf != NULL ) && ( pitchStart >= 0 ) && ( pitchEnd > 0 ) ); + + pitchDelta = ( pitchEnd - pitchStart ) / nSubframes; + pitchBuf[0] = pitchStart + pitchDelta; + for ( i = 1; i < nSubframes; i++ ) + { + pitchBuf[i] = pitchBuf[i - 1] + pitchDelta; + } + + return; +} diff --git a/lib_dec/post_dec.c b/lib_dec/post_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..f661992ac2e3a07a3f21132838932a670c8a79db --- /dev/null +++ b/lib_dec/post_dec.c @@ -0,0 +1,476 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*---------------------------------------------------------------------* + * Function prototypes + *---------------------------------------------------------------------*/ + +static void bass_pf_1sf_delay( float *syn, const int16_t *T_sf, const float *gainT_sf, const int16_t l_frame, const int16_t l_subfr, float *bpf_noise_buf, int16_t *gain_factor_param, const int16_t disable_bpf, float *mem_deemph_err, float *lp_ener ); + + +/*---------------------------------------------------------------------* + * post_decoder() + * + * Perform post-processing + *---------------------------------------------------------------------*/ + +void post_decoder( + Decoder_State *st, /* i/o: decoder memory state pointer */ + float synth_buf[], + const float pit_gain[], + const int16_t pitch[], + float signal_out[], + float *bpf_noise_buf ) +{ + int16_t L_frame, nb_subfr, i; + float *synth2; + float *synth; + int16_t pfstat_on_previous; + int16_t pitch_gain_adjust[NB_SUBFR16k]; + float synth_buf2[NBPSF_PIT_MAX + L_FRAME_MAX + M]; + int32_t brate; + float A[M + 1]; + float pitch_buf[NB_SUBFR16k]; + float tmp; + int16_t L_subfr; + + L_frame = st->L_frame; + nb_subfr = st->nb_subfr; + brate = ( st->core_brate > SID_2k40 ) ? st->total_brate : st->last_active_brate; + pfstat_on_previous = 0; + if ( st->hPFstat != NULL ) + { + pfstat_on_previous = st->hPFstat->on; + st->hPFstat->on = 0; + } + set_s( pitch_gain_adjust, st->bpf_gain_param, nb_subfr ); + synth = synth_buf + st->hTcxDec->old_synth_len; + synth2 = synth_buf2 + NBPSF_PIT_MAX; + if ( st->hBPF != NULL ) + { + mvr2r( st->hBPF->pst_old_syn, synth_buf2, NBPSF_PIT_MAX ); + } + + if ( st->tcxonly ) + { + /* High bitrates (48kbps and above), high sampling rates (25.6kHz and above) */ + + mvr2r( synth, synth2, L_frame ); + + if ( pfstat_on_previous ) + { + /* Past frame was low-bitrate with formant post-filter */ + lsp2a_stab( st->lsp_old, A, M ); + mvr2r( st->hPFstat->mem_pf_in + L_SYN_MEM - M, synth - M, M ); + L_subfr = st->L_frame / st->nb_subfr; + residu( A, M, synth, synth_buf, L_subfr ); + syn_filt( A, M, synth_buf, synth2, L_subfr, st->hPFstat->mem_stp + L_SYN_MEM - M, 0 ); + scale_st( synth, synth2, &st->hPFstat->gain_prec, L_subfr, -1 ); + blend_subfr2( synth2 + L_subfr / 2, synth + L_subfr / 2, synth2 + L_subfr / 2 ); + } + } + else + { + /* Low bitrates (32kbps and below), low sampling rates (12.8kHz and 16kHz) */ + if ( st->last_bwidth == NB ) + { + /* NB Post-filter (pitch+formant post-filter) */ + mvr2r( synth, synth_buf, L_frame ); + tmp = synth[-1]; + preemph( synth_buf, st->preemph_fac, L_frame, &tmp ); + + tmp = 0.0f; + for ( i = 0; i < nb_subfr; i++ ) + { + pitch_buf[i] = pitch[i]; + } + + if ( pfstat_on_previous == 0 ) + { + st->hPFstat->reset = 1; + } + + if ( st->bwidth == NB ) + { + st->hPFstat->on = 1; + nb_post_filt( L_frame, L_SUBFR, st->hPFstat, &tmp, 0, synth_buf, st->mem_Aq, pitch_buf, GENERIC, st->BER_detect, st->lp_noise > LP_NOISE_THRESH ? 1 : ( ( st->core != ACELP_CORE ) || ( st->coder_type == UNVOICED ) ) ); + } + else + { + st->hPFstat->on = 0; + nb_post_filt( L_frame, L_SUBFR, st->hPFstat, &tmp, 0, synth_buf, st->mem_Aq, pitch_buf, AUDIO, st->BER_detect, st->lp_noise > LP_NOISE_THRESH ? 1 : ( ( st->core != ACELP_CORE ) || ( st->coder_type == UNVOICED ) ) ); + } + + + mvr2r( synth_buf, synth2, L_frame ); + tmp = synth2[-1]; + deemph( synth2, st->preemph_fac, L_frame, &tmp ); + } + else + { + /* Formant Post-filter */ + if ( pfstat_on_previous == 0 ) + { + st->hPFstat->reset = 1; + } + + if ( st->bwidth >= WB ) + { + st->hPFstat->on = 1; + formant_post_filt( st->hPFstat, synth, st->mem_Aq, synth2, L_frame, L_SUBFR, st->lp_noise, brate, 0 ); + } + else + { + st->hPFstat->on = 0; + formant_post_filt( st->hPFstat, synth, st->mem_Aq, synth2, L_frame, L_SUBFR, st->lp_noise, brate, 1 ); + } + } + + /*Bass Post-filter */ + bass_pf_1sf_delay( synth2, pitch, pit_gain, L_frame, L_SUBFR, bpf_noise_buf, pitch_gain_adjust, ( st->lp_noise > LP_NOISE_THRESH && st->narrowBand ) ? 1 : 0, &( st->hBPF->pst_mem_deemp_err ), &( st->hBPF->pst_lp_ener ) ); + } + + /* Output */ + mvr2r( synth2, signal_out, L_frame ); + + /* Update synth2 memory */ + if ( st->hBPF != NULL ) + { + mvr2r( synth_buf2 + L_frame, st->hBPF->pst_old_syn, NBPSF_PIT_MAX ); + } + + return; +} + + +/*---------------------------------------------------------------------* + * bass_pf_1sf_delay() + * + * Perform low-frequency postfiltering + *---------------------------------------------------------------------*/ + +static void bass_pf_1sf_delay( + float *syn, /* i : synthesis to postfilter */ + const int16_t *T_sf, /* i : Pitch period for all subframes (T_sf[4]) */ + const float *gainT_sf, /* i : Pitch gain for all subframes (gainT_sf[4]) */ + const int16_t L_frame, /* i : frame length (multiple of l_subfr) */ + const int16_t L_subfr_in, /* i : sub-frame length (80/64) */ + float *bpf_noise_buf, /* i : harmoninc filtered signal */ + int16_t *gain_factor_param, /* i : gain factor param 0-> minimum BPF, 3-> full BPF */ + const int16_t disable_bpf, /* i : flag to disable BPF */ + float *mem_deemph_err, /* i/o: Error deemphasis memory */ + float *lp_ener /* i/o: long_term error signal energy */ +) +{ + int16_t i, sf, i_subfr, T, lg, L_subfr; + float tmp, corr, ener, gain; + float noise_buf[( 2 * L_SUBFR )], *noise_in; + float error[L_SUBFR]; + float ener2; + + noise_in = noise_buf; + + sf = 0; + L_subfr = L_subfr_in; + + for ( i_subfr = 0; i_subfr < L_frame; i_subfr += L_subfr, sf++ ) + { + if ( i_subfr == 0 ) + { + L_subfr = L_subfr_in; + } + else if ( i_subfr == L_frame ) + { + L_subfr = 0; + } + else + { + L_subfr = L_subfr_in; + } + + T = T_sf[sf]; + gain = gainT_sf[sf]; + + if ( gain > 1.0f ) + { + gain = 1.0f; + } + if ( gain < 0.0f ) + { + gain = 0.0f; + } + + lg = L_frame - T - i_subfr; + if ( lg < 0 ) + { + lg = 0; + } + if ( lg > L_subfr ) + { + lg = L_subfr; + } + + if ( !disable_bpf && gain > 0 ) + { + corr = 0.01f; + ener = 0.01f; + + for ( i = 0; i < lg; i++ ) + { + corr += syn[i + i_subfr] * ( 0.5f * syn[i + i_subfr - T] + 0.5f * syn[i + i_subfr + T] ); + ener += ( 0.5f * syn[i + i_subfr - T] + 0.5f * syn[i + i_subfr + T] ) * ( 0.5f * syn[i + i_subfr - T] + 0.5f * syn[i + i_subfr + T] ); + } + + for ( i = lg; i < L_subfr; i++ ) + { + corr += syn[i + i_subfr] * syn[i + i_subfr - T]; + ener += syn[i + i_subfr - T] * syn[i + i_subfr - T]; + } + gain = corr / ener; + + if ( gain > 1.f ) + { + gain = 1.0f; + } + else if ( gain < 0.f ) + { + gain = 0.f; + } + + ener2 = 0.01f; + for ( i = 0; i < lg; i++ ) + { + error[i] = gain * ( syn[i + i_subfr] - 0.5f * syn[i + i_subfr - T] - 0.5f * syn[i + i_subfr + T] ); + error[i] = error[i] + 0.9f * *mem_deemph_err; + *mem_deemph_err = error[i]; + ener2 += error[i] * error[i]; + } + + for ( i = lg; i < L_subfr; i++ ) + { + error[i] = 0.5f * gain * ( syn[i + i_subfr] - syn[i + i_subfr - T] ); + error[i] = error[i] + 0.9f * *mem_deemph_err; + *mem_deemph_err = error[i]; + ener2 += error[i] * error[i]; + } + + ener2 = (float) ( 10.f * log10( ener2 ) ); + *lp_ener = (float) ( 0.99f * *lp_ener + 0.01f * ener2 ); + ener2 = (float) pow( 10.f, 0.1f * *lp_ener ); + tmp = 0.5f * corr / ( ener + ener2 ); + + if ( tmp > 0.5f ) + { + tmp = 0.5f; + } + else if ( tmp < 0.f ) + { + tmp = 0.0f; + } + + /*Adjust gain*/ + /* full gain = gainLTP*0.5*/ + /* adaptive gain = gainLTP*0.5*gain_factor*0.5*/ + tmp *= max( 0.5f * gain_factor_param[sf], 0.125f ); + + /* calculate noise based on voiced pitch */ + for ( i = 0; i < lg; i++ ) + { + noise_in[i] = tmp * ( syn[i + i_subfr] - 0.5f * syn[i + i_subfr - T] - 0.5f * syn[i + i_subfr + T] ); + } + + for ( i = lg; i < L_subfr; i++ ) + { + noise_in[i] = tmp * ( syn[i + i_subfr] - syn[i + i_subfr - T] ); + /*It simulates an extrapolation of the buffer syn: syn[i+i_subfr+T]=syn[i+i_subfr] + * -> reduce nrg of noise_in and avoid too much post-filtering*/ + /*noise_in[i] = tmp * (syn[i+i_subfr] - 0.5f*syn[i+i_subfr-T] - 0.5f*syn[i+i_subfr]);*/ + /*->noise_in[i] = tmp * 0.5f * (syn[i+i_subfr] - syn[i+i_subfr-T]);*/ + noise_in[i] *= 0.5f; + } + } + else + { + set_zero( noise_in, L_subfr ); + } + + /* copy bpf noise signal to buffer */ + mvr2r( noise_in, bpf_noise_buf + i_subfr, L_subfr ); + } + + return; +} +/*---------------------------------------------------------------------* + * cldfb_synth_set_bandsToZero() + * + * + *---------------------------------------------------------------------*/ + +void cldfb_synth_set_bandsToZero( + Decoder_State *st, + float **rAnalysis, + float **iAnalysis, + const int16_t nTimeSlots ) +{ + float nrg_bwddec, nrg_band[CLDFB_NO_CHANNELS_MAX], thr_bwddwc, max_nrg, realQ1, imagQ1; + int16_t flag, offset, WBcnt, i, k, update_perc; + float perc_detect, perc_miss; + + realQ1 = 0.0f; + imagQ1 = 0.0f; + + set_f( nrg_band, 0.0f, CLDFB_NO_CHANNELS_MAX ); + max_nrg = 0.0f; + + offset = 250; + WBcnt = 20; + perc_miss = 0.83f; + perc_detect = 0.93f; + + if ( st->VAD == 1 ) + { + st->active_frame_cnt_bwddec++; + st->total_frame_cnt_bwddec++; + if ( st->active_frame_cnt_bwddec > 99 ) + { + st->active_frame_cnt_bwddec = 100; + } + if ( st->total_frame_cnt_bwddec > 500 ) + { + st->total_frame_cnt_bwddec = 500; + } + + for ( i = 0; i < ( st->cldfbSyn->no_channels - st->cldfbSyn->bandsToZero ); i++ ) + { + nrg_bwddec = 0.0f; + for ( k = 0; k < nTimeSlots; k++ ) + { + realQ1 = rAnalysis[k][i]; + imagQ1 = iAnalysis[k][i]; + nrg_bwddec += ( realQ1 * realQ1 ); + nrg_bwddec += ( imagQ1 * imagQ1 ); + } + nrg_band[i] = ( nrg_bwddec ); + if ( ( nrg_band[i] > max_nrg ) && ( i > 11 ) ) + { + max_nrg = nrg_band[i]; + } + } + for ( ; i < st->cldfbSyn->no_channels; i++ ) + { + nrg_band[i] = 0; + } + + nrg_bwddec = 0; + for ( i = 2; i < 9; i++ ) + { + nrg_bwddec += ( nrg_band[i] / 7.0f ); + } + + thr_bwddwc = ( nrg_bwddec / 512.0f ); + + st->avg_nrg_LT = 0.98999f * st->avg_nrg_LT + 0.009979f * thr_bwddwc; + update_perc = 1; + if ( st->ini_frame >= 25 && thr_bwddwc < st->avg_nrg_LT * 0.005f ) + { + update_perc = 0; + } + + flag = 1; + if ( max_nrg >= thr_bwddwc ) + { + flag = 0; + } + + for ( i = 0; i < WBcnt - 1; i++ ) + { + st->flag_buffer[i] = st->flag_buffer[i + 1]; + } + st->flag_buffer[WBcnt - 1] = flag; + + /*long term percentage*/ + if ( update_perc == 1 ) + { + st->perc_bwddec += ( flag - st->perc_bwddec ) / st->active_frame_cnt_bwddec; + } + if ( ( st->total_frame_cnt_bwddec > offset ) && ( st->active_frame_cnt_bwddec > 50 ) ) + { + if ( ( st->perc_bwddec >= perc_detect || ( st->perc_bwddec >= perc_miss && st->last_flag_filter_NB ) ) && ( sum_s( st->flag_buffer, WBcnt ) != 0 ) ) /* decision hysterysis */ + { + st->cldfbSyn->bandsToZero = ( st->cldfbSyn->no_channels - 10 ); + st->last_flag_filter_NB = 1; /* VAD processing must be dependent on hysterysis, as if hysterysis fails, but threshold passes, we dont want next VAD frames to have NB only */ + } + else + { + st->last_flag_filter_NB = 0; + } + } + else + { + st->last_flag_filter_NB = 0; + } + if ( sum_s( st->flag_buffer, WBcnt ) == 0 ) + { + st->perc_bwddec = 0.0f; + st->active_frame_cnt_bwddec = 0; + st->total_frame_cnt_bwddec = 0; + st->last_flag_filter_NB = 0; + } + } + else + { + if ( st->last_flag_filter_NB == 1 ) + { + st->cldfbSyn->bandsToZero = st->last_active_bandsToZero_bwdec; + } + st->total_frame_cnt_bwddec++; + if ( st->total_frame_cnt_bwddec > 500 ) + { + st->total_frame_cnt_bwddec = 500; + } + } + + st->last_active_bandsToZero_bwdec = st->cldfbSyn->bandsToZero; + + return; +} diff --git a/lib_dec/ppp_dec.c b/lib_dec/ppp_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..f9e97edcaaa35fb7a10eec86aab93eb0f4b569bf --- /dev/null +++ b/lib_dec/ppp_dec.c @@ -0,0 +1,183 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + + +/*-------------------------------------------------------------------* + * DTFS_dequant_cw() + * + * DTFS dequantization + *-------------------------------------------------------------------*/ + +static void DTFS_dequant_cw( + int16_t pl, /* i : Previous lag */ + int16_t POWER_IDX, /* i : POWER index */ + const int16_t *AMP_IDX, /* i : Amp Shape index */ + float *lastLgainD, /* i/o: low band last gain */ + float *lastHgainD, /* i/o: high band last gain */ + float *lasterbD, /* i/o: last frame ERB vector */ + DTFS_STRUCTURE *X, /* o : DTFS structure dequantized */ + int16_t num_erb /* i : Number of ERB bands */ +) +{ + float tmp, mfreq[NUM_ERB_WB], curr_erb[NUM_ERB_WB]; + int16_t slot[NUM_ERB_WB]; + const float( *PowerCB )[2] = NULL; + + if ( num_erb == NUM_ERB_NB ) + { + PowerCB = PowerCB_NB; + } + else if ( num_erb == NUM_ERB_WB ) + { + PowerCB = PowerCB_WB; + } + + /* Amplitude Dequantization */ + erb_add( curr_erb, X->lag, lasterbD, pl, AMP_IDX, num_erb ); + curr_erb[0] = curr_erb[1] * 0.3f; + curr_erb[num_erb - 2] = curr_erb[num_erb - 3] * 0.3f; + curr_erb[num_erb - 1] = 0; + erb_slot( X->lag, slot, mfreq, num_erb ); + DTFS_erb_inv( curr_erb, slot, mfreq, X, num_erb ); + + /* Back up the lasterbD memory after power normalization */ + DTFS_setEngyHarm( 92.0, 1104.5, 0.0, 1104.5, 1.0, X ); + DTFS_setEngyHarm( 1104.5, X->upper_cut_off_freq_of_interest, 1104.5, X->upper_cut_off_freq, 1.0, X ); + DTFS_to_erb( *X, lasterbD ); + + /* Power Dequantization */ + *lastLgainD += (float) PowerCB[POWER_IDX][0]; + *lastHgainD += (float) PowerCB[POWER_IDX][1]; + tmp = (float) pow( 10.0, (double) ( *lastLgainD ) ) / X->lag; + + if ( !( tmp >= 0.0 ) ) + { + tmp = 0.0; + } + + DTFS_setEngyHarm( 92.0, 1104.5, 0.0, 1104.5, tmp, X ); + tmp = (float) pow( 10.0, (double) ( *lastHgainD ) ) / X->lag; + + if ( !( tmp >= 0.0 ) ) + { + tmp = 0.0; + } + + DTFS_setEngyHarm( 1104.5, X->upper_cut_off_freq_of_interest, 1104.5, X->upper_cut_off_freq, tmp, X ); + + return; +} + +/*------------------------------------------------------------------- + * ppp_quarter_decoder() + * + * PPP quarter decoder + *-------------------------------------------------------------------*/ + +ivas_error ppp_quarter_decoder( + Decoder_State *st, /* i/o: decoder state structure */ + DTFS_STRUCTURE *CURRCW_Q_DTFS, /* i/o: Current CW DTFS */ + int16_t prevCW_lag, /* i : Previous lag */ + float *lastLgainD, /* i/o: Last gain lowband */ + float *lastHgainD, /* i/o: Last gain highwband */ + float *lasterbD, /* i/o: Last ERB vector */ + int16_t bfi, /* i : FER flag */ + DTFS_STRUCTURE PREV_CW_D /* i : Previous DTFS */ +) +{ + DTFS_STRUCTURE *PREVDTFS; + float tmp, temp_pl = (float) prevCW_lag, temp_l = (float) CURRCW_Q_DTFS->lag; + int16_t l = CURRCW_Q_DTFS->lag; + int16_t POWER_IDX, AMP_IDX[2]; + float Erot = 0.0, z = 0.0; + int16_t num_erb = 24; + ivas_error error; + + error = IVAS_ERR_OK; + if ( ( error = DTFS_new( &PREVDTFS ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( CURRCW_Q_DTFS->upper_cut_off_freq == 4000.0 ) + { + num_erb = 22; + } + else if ( CURRCW_Q_DTFS->upper_cut_off_freq == 6400.0 ) + { + num_erb = 24; + } + + DTFS_copy( PREVDTFS, PREV_CW_D ); + if ( bfi == 0 ) + { + POWER_IDX = get_next_indice( st, 6 ); + AMP_IDX[0] = get_next_indice( st, 6 ); + AMP_IDX[1] = get_next_indice( st, 6 ); + + /* Amplitude Dequantization */ + DTFS_dequant_cw( prevCW_lag, POWER_IDX, AMP_IDX, lastLgainD, lastHgainD, lasterbD, CURRCW_Q_DTFS, num_erb ); + } + + /* Copying phase spectrum over */ + DTFS_adjustLag( PREVDTFS, l ); + + z = ( ( L_FRAME - temp_l ) * ( temp_l + temp_pl ) ) / ( 2 * temp_l * temp_pl ); + + Erot = (float) ( temp_l - rint_new( temp_l * ( z - floor( z ) ) ) ); + + DTFS_phaseShift( PREVDTFS, (float) ( PI2 * Erot / CURRCW_Q_DTFS->lag ) ); + DTFS_car2pol( PREVDTFS ); + + mvr2r( PREVDTFS->b, CURRCW_Q_DTFS->b, (int16_t) ( CURRCW_Q_DTFS->lag >> 1 ) + 1 ); + + DTFS_pol2car( CURRCW_Q_DTFS ); + + tmp = (float) get_next_indice( st, 3 ); + DTFS_phaseShift( CURRCW_Q_DTFS, (float) ( PI2 * ( tmp - 3 ) / CURRCW_Q_DTFS->lag ) ); + + free( PREVDTFS ); + + return error; +} diff --git a/lib_dec/pvq_core_dec.c b/lib_dec/pvq_core_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..677b80f5c09b8aa6d4a72a7720f1e14d1880d319 --- /dev/null +++ b/lib_dec/pvq_core_dec.c @@ -0,0 +1,506 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "stl.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * Local prototypes + * + *-------------------------------------------------------------------*/ + +static int16_t get_pvq_splits( Decoder_State *st, PVQ_DEC_HANDLE hPVQ, const int16_t band_bits, const int16_t sfmsize, int16_t *bits ); + +static void densitySymbolIndexDecode( Decoder_State *st, PVQ_DEC_HANDLE hPVQ, int16_t density, int16_t opp_sz, int16_t near_sz, int16_t *index_phi ); + +static void decode_energies( Decoder_State *st, PVQ_DEC_HANDLE hPVQ, int16_t Np, int16_t *dim_part, int16_t *bits_part, int16_t *g_part, int16_t qband, int16_t *bits_left, int16_t n, const int16_t strict_bits ); + +/*-------------------------------------------------------------------* + * pvq_decode_band() + * + *-------------------------------------------------------------------*/ + +static void pvq_decode_band( + Decoder_State *st, /* i/o: Decoder state */ + PVQ_DEC_HANDLE hPVQ, /* i/o: PVQ decoder handle */ + int16_t *pulse_vector, /* i/o: decoded integer shape vector */ + int16_t *npulses, /* i/o: number of pulses */ + float *coefs_quant, /* i/o: decoded coefficients buffer */ + const int16_t sfmsize, /* i : band length */ + const int16_t band_bits, /* i : assigned bit budget */ + int16_t *bits_left, /* i/o: number of bits / bits remaining */ + const int16_t strict_bits /* i : Conservative rounding flag */ +) +{ + int16_t K_val; + int16_t j, Np; + int16_t part_start[MAX_SPLITS + 1], dim_part[MAX_SPLITS + 1], bits_part[MAX_SPLITS + 1]; + int16_t pool_tot, pool_part, dim_parts; + float g_part[MAX_SPLITS]; + int16_t g_part_s[MAX_SPLITS]; + int16_t sg_part[MAX_SPLITS + 1]; + int16_t idx_sort[MAX_SPLITS + 1]; + int16_t js, band_bits_tot, split_bit; + + Np = get_pvq_splits( st, hPVQ, band_bits, sfmsize, &split_bit ); + band_bits_tot = band_bits - split_bit; + + dim_parts = (int16_t) intLimCDivPos( sfmsize, Np ); + set_s( dim_part, dim_parts, Np - 1 ); + dim_part[Np - 1] = sfmsize - dim_parts * ( Np - 1 ); + + part_start[0] = 0; + for ( j = 1; j < Np; j++ ) + { + part_start[j] = part_start[j - 1] + dim_part[j - 1]; + } + + set_s( g_part_s, -32768, Np ); + if ( Np > 1 ) + { + decode_energies( st, hPVQ, Np, dim_part, bits_part, g_part_s, band_bits_tot, bits_left, sfmsize, strict_bits ); + } + else + { + bits_part[0] = band_bits_tot; + } + + pool_tot = 0; + pool_part = 0; + + for ( j = 0; j < Np; j++ ) + { + g_part[j] = -( (float) g_part_s[j] ) / 32768; + g_part_s[j] = -g_part_s[j]; + } + + srt_vec_ind( g_part_s, sg_part, idx_sort, Np ); + for ( j = 0; j < Np; j++ ) + { + js = idx_sort[Np - 1 - j]; + pool_part = shrtCDivSignedApprox( pool_tot, Np - j ); + bits_part[js] = max( 0, min( bits_part[js] + pool_part, 256 ) ); + + conservativeL1Norm( dim_part[js], bits_part[js], strict_bits, *bits_left, pool_tot, *npulses, /* inputs */ + &K_val, bits_left, &pool_tot, npulses ); /* outputs */ + if ( K_val >= 1 ) + { + pvq_decode( st, hPVQ, coefs_quant + part_start[js], pulse_vector + part_start[js], K_val, dim_part[js], g_part[js] ); + } + else + { + set_f( coefs_quant + part_start[js], 0.0f, dim_part[js] ); + set_s( pulse_vector + part_start[js], 0, dim_part[js] ); + } + } + + return; +} + +/*-------------------------------------------------------------------* + * pvq_decode_frame() + * + *-------------------------------------------------------------------*/ + +void pvq_decode_frame( + Decoder_State *st, /* i/o: Decoder state */ + float *coefs_quant, /* o : quantized coefficients */ + int16_t *npulses, /* o : number of pulses per band */ + int16_t *pulse_vector, /* o : non-normalized pulse shapes */ + const int16_t *sfm_start, /* i : indices of first coeffs in the bands */ + const int16_t *sfm_end, /* i : indices of last coeffs in the bands */ + const int16_t *sfmsize, /* i : band sizes */ + const int16_t nb_sfm, /* i : total number of bands */ + const int16_t *R, /* i : bitallocation per band (Q3) */ + const int16_t pvq_bits, /* i : number of bits avaiable */ + const int16_t core /* i : core */ +) +{ + int16_t i, j; + int16_t band_bits, bits_left; + int16_t bit_pool = 0; + int16_t coded_bands, bands_to_code; + int16_t curr_bits; + int16_t R_sort[NB_SFM]; /*Q3*/ + int16_t is, i_sort[NB_SFM]; + int16_t strict_bits; + + PVQ_DEC_DATA pvq_dec; + PVQ_DEC_HANDLE hPVQ = &pvq_dec; + + rc_dec_init( st, hPVQ, pvq_bits ); + curr_bits = ( pvq_bits - RC_BITS_RESERVED ) << 3; + bands_to_code = 0; + for ( i = 0; i < nb_sfm; i++ ) + { + if ( R[i] > 0 ) + { + bands_to_code++; + } + } + + if ( core == ACELP_CORE ) + { + strict_bits = PVQ_CONS; + srt_vec_ind( R, R_sort, i_sort, nb_sfm ); + } + else + { + strict_bits = PVQ_NEAREST; + for ( i = 0; i < nb_sfm; i++ ) + { + i_sort[i] = i; + } + } + + coded_bands = 0; + for ( i = 0; i < nb_sfm; i++ ) + { + is = i_sort[i]; + if ( R[is] > 0 ) + { + bandBitsAdjustment( hPVQ->rc_num_bits, hPVQ->rc_range, curr_bits, bands_to_code, bands_to_code - coded_bands, sfmsize[is], R[is], bit_pool, /* inputs */ + &band_bits, &bits_left, &bit_pool ); /* outputs */ + + pvq_decode_band( st, hPVQ, &pulse_vector[sfm_start[is]], &npulses[is], &coefs_quant[sfm_start[is]], sfmsize[is], band_bits, &bits_left, strict_bits ); + + /* Updates */ + coded_bands++; + } + else + { + for ( j = sfm_start[is]; j < sfm_end[is]; j++ ) + { + coefs_quant[j] = 0.0f; + pulse_vector[j] = 0; + } + } + } + + rc_dec_finish( st, hPVQ ); + + return; +} + +/*-------------------------------------------------------------------* + * pvq_core_dec() + * + *-------------------------------------------------------------------*/ + +/*! r: number of bits decoded */ +int16_t pvq_core_dec( + Decoder_State *st, /* i/o: Decoder state */ + const int16_t *sfm_start, /* i : indices of first coeffs in the bands */ + const int16_t *sfm_end, /* i : indices of last coeffs in the bands */ + const int16_t *sfmsize, /* i : band sizes */ + float coefs_quant[], /* o : output MDCT */ + const int16_t bits_tot, /* i : bit budget */ + const int16_t nb_sfm, /* i : number of bands */ + int16_t *R, /* i/o: Bit allocation/Adjusted bit alloc.(Q3) */ + int16_t *Rs, /* i/o: Integer bit allocation */ + int16_t *npulses, /* o : number of pulses per band */ + int16_t *maxpulse, /* o : maximum pulse per band */ + const int16_t core /* i : core */ +) +{ + int16_t i; + int16_t R_upd; + int16_t ord[NB_SFM_MAX]; + int16_t pulse_vector[L_SPEC48k_EXT]; + int16_t pvq_bits; + int16_t gain_bits_array[NB_SFM]; + float fg_pred[NB_SFM_MAX]; + + if ( st->hHQ_core != NULL ) + { + st->hHQ_core->ber_occured_in_pvq = 0; + } + + R_upd = bits_tot * 8; + assign_gain_bits( core, nb_sfm, sfmsize, R, gain_bits_array, &R_upd ); + + pvq_bits = R_upd >> 3; + + pvq_decode_frame( st, coefs_quant, npulses, pulse_vector, sfm_start, sfm_end, sfmsize, nb_sfm, R, pvq_bits, core ); + + if ( Rs != NULL ) + { + for ( i = 0; i < nb_sfm; i++ ) + { + Rs[i] = Rs[i] * ( npulses[i] > 0 ); /* Update Rs in case no pulses were assigned */ + } + } + + for ( i = 0; i < nb_sfm; i++ ) + { + ord[i] = i; + R[i] = R[i] * ( npulses[i] > 0 ); /* Update in case no pulses were assigned */ + } + + get_max_pulses( sfm_start, sfm_end, ord, npulses, nb_sfm, pulse_vector, maxpulse ); + + fine_gain_pred( sfm_start, sfm_end, sfmsize, ord, npulses, maxpulse, R, nb_sfm, coefs_quant, pulse_vector, fg_pred, core ); + + fine_gain_dec( st, ord, nb_sfm, gain_bits_array, fg_pred ); + + if ( st->hHQ_core != NULL ) + { + if ( st->hHQ_core->ber_occured_in_pvq != 0 ) + { + set_f( fg_pred, ( 1.0f / 8192.0f ), nb_sfm ); /* low complex ECU action in case of detetected BER in PVQ decoding */ + } + } + + apply_gain( ord, sfm_start, sfm_end, nb_sfm, fg_pred, coefs_quant ); + + return (int16_t) bits_tot; +} + + +/*-------------------------------------------------------------------* + * decode_energies() + * + *-------------------------------------------------------------------*/ + +static void decode_energies( + Decoder_State *st, + PVQ_DEC_HANDLE hPVQ, + int16_t Np, + int16_t *dim_part, + int16_t *bits_part, + int16_t *g_part, + int16_t qband, + int16_t *bits_left, + int16_t dim, + const int16_t strict_bits ) +{ + int16_t res; + int16_t i, l_Np, r_Np; + int16_t l_bits, r_bits, l_dim, r_dim; + int16_t il, ir; + int16_t oppRQ3, qzero; + int16_t index_phi = -1; + l_Np = Np >> 1; + r_Np = Np - l_Np; + + l_bits = 0; + l_dim = 0; + for ( i = 0; i < l_Np; i++ ) + { + l_dim += dim_part[i]; + } + r_dim = dim - l_dim; + + obtainEnergyQuantizerDensity( dim, qband, &res ); + rangeCoderFinalizationFBits( hPVQ->rc_num_bits, hPVQ->rc_range, &qzero ); + densitySymbolIndexDecode( st, hPVQ, res, r_dim, l_dim, &index_phi ); + densityAngle2RmsProjDec( res, index_phi, &ir, &il, &oppRQ3 ); + for ( i = 0; i < l_Np; i++ ) + { + g_part[i] = ( (int16_t) g_part[i] * il + 16384 ) >> 15; + } + + for ( i = l_Np; i < Np; i++ ) + { + g_part[i] = ( (int16_t) g_part[i] * ir + 16384 ) >> 15; + } + + + NearOppSplitAdjustment( qband, qzero, hPVQ->rc_num_bits, hPVQ->rc_range, *bits_left, strict_bits, Np, dim_part[0], dim_part[Np - 1], l_dim, r_dim, oppRQ3, &l_bits, &r_bits, bits_left ); + if ( l_Np > 1 ) + { + decode_energies( st, hPVQ, l_Np, dim_part, bits_part, g_part, l_bits, bits_left, l_dim, strict_bits ); + } + else + { + bits_part[0] = l_bits; + } + + if ( r_Np > 1 ) + { + decode_energies( st, hPVQ, r_Np, &dim_part[l_Np], &bits_part[l_Np], &g_part[l_Np], r_bits, bits_left, r_dim, strict_bits ); + } + else + { + bits_part[1] = r_bits; + } + + return; +} + +/*-------------------------------------------------------------------* + * densitySymbolIndexDecode() + * + *-------------------------------------------------------------------*/ + +static void densitySymbolIndexDecode( + Decoder_State *st, + PVQ_DEC_HANDLE hPVQ, + int16_t density, + int16_t opp_sz, + int16_t near_sz, + int16_t *index_phi ) +{ + + int32_t tmp1; + int16_t tmp2; + int32_t cum_freq = 0, dec_freq, tot; + uint32_t sym_freq = 1; + int16_t angle, c; + int16_t res1, res2, res_c, res_alpha; + int16_t res = density; + int16_t r_dim = opp_sz; + int16_t l_dim = near_sz; + int16_t alpha; +#ifdef BASOP_NOGLOB + Flag Overflow; +#endif /* BASOP_NOGLOB */ + + if ( ( 0xFFFE & density ) == 0 ) + { /* odd density exit */ + *index_phi = -1; + return; + } +#define WMC_TOOL_SKIP + angle = atan2_fx( SQRT_DIM_fx[r_dim], SQRT_DIM_fx[l_dim] ); +#ifndef BASOP_NOGLOB + angle = shl( angle, 1 ); +#else /* BASOP_NOGLOB */ + angle = shl_o( angle, 1, &Overflow ); +#endif /* BASOP_NOGLOB */ + angle = mult_r( angle, 20861 ); + c = mult_r( res, angle ); +#undef WMC_TOOL_SKIP + + res_c = res - c; + if ( c == 0 ) + { + tot = res * ( res + 1 ) + 1; + dec_freq = rc_decode( &st->BER_detect, hPVQ, tot ); + alpha = (int16_t) floor_sqrt_exact( (uint32_t) ( res + 1 ) * ( res + 1 ) - dec_freq ) + res + 1; + sym_freq = 2 * ( res - alpha ) + 1; + cum_freq = alpha * ( 2 * ( res + 1 ) - alpha ); + } + else if ( c == res ) + { + tot = res * ( res + 1 ) + 1; + dec_freq = rc_decode( &st->BER_detect, hPVQ, tot ); + alpha = (int16_t) floor_sqrt_exact( (uint32_t) dec_freq ); + sym_freq = 2 * alpha + 1; + cum_freq = alpha * alpha; + } + else + { + tot = res * c * ( res - c ) + res + 1; + dec_freq = rc_decode( &st->BER_detect, hPVQ, tot ); + if ( dec_freq < tot - ( res + 1 ) - ( res - ( c + 1 ) ) * ( res - c ) * c + c + 1 ) + { + alpha = ( res_c - 1 + (int16_t) floor_sqrt_exact( (uint32_t) res_c * ( res_c + 4 * dec_freq - 2 ) + 1 ) ) / ( 2 * res_c ); + sym_freq = 2 * alpha * res_c + 1; + cum_freq = alpha * ( ( alpha - 1 ) * res_c + 1 ); + } + else + { + res1 = res + 1; + res2 = 2 * res + 1; + tmp1 = ( c * res2 + 1 ) * ( c * res2 + 1 ) + 4 * c * ( ( tot - dec_freq - res1 ) - c * ( res * res1 ) ); + tmp2 = (int16_t) floor_sqrt_exact( (uint32_t) tmp1 ); + if ( tmp2 * tmp2 != tmp1 ) + { + tmp2++; /* convert to ceil */ + } + + alpha = ( c * ( 2 * res + 1 ) + 1 - tmp2 ) / ( 2 * c ); + + res_alpha = res - alpha; + sym_freq = 2 * res_alpha * c + 1; + cum_freq = tot - ( res + 1 ) - res_alpha * ( res_alpha + 1 ) * c + alpha; + } + } + rc_dec_update( st, hPVQ, cum_freq, sym_freq ); + + *index_phi = alpha; + + return; +} + + +/*--------------------------------------------------------------------------* + * get_pvq_splits() + * + * Retrieve the number of segments + *--------------------------------------------------------------------------*/ + +/*! r: Number of segments */ +static int16_t get_pvq_splits( + Decoder_State *st, /* i/o: Decoder state */ + PVQ_DEC_HANDLE hPVQ, /* i/o: PVQ decoder handle */ + const int16_t band_bits, /* i : Band bit-budget */ + const int16_t sfmsize, /* i : Band width */ + int16_t *bits /* o : Used bits */ +) +{ + int16_t Np; + uint32_t flag; + + Np = (int16_t) ( intLimCDivPos( band_bits, 67 ) >> 2 ); + if ( band_bits - 268 * Np != 0 || Np == 0 ) /* L_msu */ + { + Np++; /* ceil */ + } + *bits = 0; + if ( Np < MAX_SPLITS && ( band_bits - ( 8 * sfmsize * THR_ADD_SPLIT ) > 0 ) ) + { + flag = rc_dec_bits( st, hPVQ, 1 ); + *bits = 8; + if ( flag ) + { + Np += 1; + } + } + + Np = max( Np, (int16_t) ( ceil( (float) sfmsize / PVQ_MAX_BAND_SIZE ) ) ); + Np = min( MAX_SPLITS, Np ); + Np = min( (int16_t) floor( (float) sfmsize / MIN_BAND_SIZE ), Np ); + + return Np; +} diff --git a/lib_dec/pvq_decode.c b/lib_dec/pvq_decode.c new file mode 100644 index 0000000000000000000000000000000000000000..b161d12aa43ca5fbbc0d372f897f5e506a789d55 --- /dev/null +++ b/lib_dec/pvq_decode.c @@ -0,0 +1,109 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * Function pvq_decode() * + * * + * PVQ subvector decoding algorithm * + *-------------------------------------------------------------------*/ + +void pvq_decode( + Decoder_State *st, /* i/o: Decoder state */ + PVQ_DEC_HANDLE hPVQ, /* i/o: PVQ decoder handle */ + float *xq, /* o : decoded vector (scaled float) */ + int16_t *y, /* o : decoded vector (non-scaled short)*/ + const int16_t k_val, /* i : number of allocated pulses */ + const int16_t dim, /* i : Length of vector */ + const float gain /* i : Gain */ +) +{ + int16_t i; + float gain_fac; + float yy; + int16_t output[PVQ_MAX_BAND_SIZE]; /* short interface as in STL-FIP */ + uint32_t h_mem[1 + KMAX_NON_DIRECT + 1]; /* allocate max offset memory for dim 6 */ + PvqEntry entry; + + entry = get_size_mpvq_calc_offset( dim, k_val, h_mem ); /* get size & prepare H(adaptive table for entry.size=N_MPVQ(dim,k_val) */ + + if ( dim != 1 ) + { + entry.lead_sign_ind = (int16_t) rc_dec_bits( st, hPVQ, 1 ); + entry.index = rc_dec_uniform( st, hPVQ, entry.size ); /* NB so far no PVQ-size wc is exactly 2^32-1 */ + + /* safety check in case of bit errors */ + if ( st->hHQ_core != NULL ) + { + if ( entry.index >= entry.size || st->hHQ_core->ber_occured_in_pvq != 0 ) + { + st->hHQ_core->ber_occured_in_pvq = 1; + st->BER_detect = 1; + entry.index = 0; /* a zero index will essentially disable PVQ index decompostion complexity */ + } + } + } + else + { + entry.lead_sign_ind = (int16_t) rc_dec_bits( st, hPVQ, 1 ); /* always a single sign bit */ + entry.index = 0; + } + mpvq_decode_vec( &entry, h_mem, output ); + + mvs2s( output, y, dim ); + + /* Find decoded vector energy */ + yy = 0; + for ( i = 0; i < dim; i++ ) + { + yy += y[i] * y[i]; + } + + /* Apply scaling, always energy in yy */ + gain_fac = gain * 1.0f / (float) sqrt( yy ); + for ( i = 0; i < dim; i++ ) + { + xq[i] = y[i] * gain_fac; + } + + return; +} diff --git a/lib_dec/range_dec.c b/lib_dec/range_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..87589a840e09a0579906865a77d093a031777643 --- /dev/null +++ b/lib_dec/range_dec.c @@ -0,0 +1,245 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * Local prototypes + *-------------------------------------------------------------------*/ + +static int16_t rc_dec_read( Decoder_State *st, PVQ_DEC_HANDLE hPVQ ); + + +/*-------------------------------------------------------------------* + * rc_dec_init() + * + * Initialize range coder + *-------------------------------------------------------------------*/ + +void rc_dec_init( + Decoder_State *st, /* i/o: Decoder State */ + PVQ_DEC_HANDLE hPVQ, /* i/o: PVQ decoder handle */ + int16_t tot_bits /* i : Total bit budget */ +) +{ + int16_t i; + + hPVQ->rc_low = 0; + hPVQ->rc_range = 0xffffffff; + hPVQ->rc_num_bits = 0; + hPVQ->rc_offset = tot_bits + st->next_bit_pos; + hPVQ->rc_end = hPVQ->rc_offset; + + for ( i = 0; i < 4; i++ ) + { + hPVQ->rc_low = ( hPVQ->rc_low << 8 ) + rc_dec_read( st, hPVQ ); + } + + return; +} + +/*-------------------------------------------------------------------* + * rc_decode() + * + * Decode symbol + *-------------------------------------------------------------------*/ + +/*! r: Decoded value */ +uint32_t rc_decode( + int16_t *BER_detect, /* o : Bit error detection flag */ + PVQ_DEC_HANDLE hPVQ, /* i/o: PVQ decoder handle */ + uint32_t tot /* i : Total cumulative frequency */ +) +{ + uint32_t inv, val; + int16_t exp; + + inv = UL_inverse( tot, &exp ); + hPVQ->rc_help = UMult_32_32( hPVQ->rc_range, inv ); + hPVQ->rc_help = hPVQ->rc_help >> ( exp - 32 ); + + /* safety check in case of bit errors */ + val = hPVQ->rc_low / hPVQ->rc_help; + if ( val > tot ) + { + *BER_detect = 1; + return 0; + } + + return val; +} + +/*-------------------------------------------------------------------* + * rc_dec_update() + * + * Update range coder + *-------------------------------------------------------------------*/ + +void rc_dec_update( + Decoder_State *st, /* i/o: Decoder State */ + PVQ_DEC_HANDLE hPVQ, /* i/o: PVQ decoder handle */ + const uint32_t cum_freq, /* i : Cumulative frequency */ + const uint32_t sym_freq /* i : Symbol frequency */ +) +{ + hPVQ->rc_low = hPVQ->rc_low - cum_freq * hPVQ->rc_help; + hPVQ->rc_range = hPVQ->rc_help * sym_freq; + + while ( hPVQ->rc_range < ( 1 << 24 ) ) + { + hPVQ->rc_num_bits += 8; + hPVQ->rc_low = ( hPVQ->rc_low << 8 ) + rc_dec_read( st, hPVQ ); + hPVQ->rc_range <<= 8; + } + + return; +} + +/*-------------------------------------------------------------------* + * rc_dec_bits() + * + * Decode bits + *-------------------------------------------------------------------*/ + +/*! r: Decoded value */ +uint32_t rc_dec_bits( + Decoder_State *st, /* i/o: Decoder State */ + PVQ_DEC_HANDLE hPVQ, /* i/o: PVQ decoder handle */ + const int16_t bits /* i : Number of bits */ +) +{ + uint32_t value; + + hPVQ->rc_num_bits += bits; + + if ( bits > 16 ) + { + hPVQ->rc_offset -= bits - 16; + value = get_indice( st, hPVQ->rc_offset, bits - 16 ) << 16; + hPVQ->rc_offset -= 16; + value |= get_indice( st, hPVQ->rc_offset, 16 ); + } + else + { + hPVQ->rc_offset -= bits; + value = get_indice( st, hPVQ->rc_offset, bits ); + } + + return value; +} + +/*-------------------------------------------------------------------* + * rc_dec_uniform() + * + * Encode with uniform distribution + *-------------------------------------------------------------------*/ + +/*! r: Decoded value */ +uint32_t rc_dec_uniform( + Decoder_State *st, /* i/o: Decoder State */ + PVQ_DEC_HANDLE hPVQ, /* i/o: PVQ decoder handle */ + const uint32_t tot /* i : Maximum value */ +) +{ + uint32_t value; + int16_t n; + + n = 32 - norm_ul( tot - 1 ); /* aligned to BASOP */ + + if ( n <= 8 ) + { + value = rc_decode( &st->BER_detect, hPVQ, tot ); + rc_dec_update( st, hPVQ, value, 1 ); + } + else + { + n -= 8; + value = rc_decode( &st->BER_detect, hPVQ, ( tot >> n ) + 1 ); + rc_dec_update( st, hPVQ, value, 1 ); + value <<= n; + value |= rc_dec_bits( st, hPVQ, n ); + } + + return value; +} + +/*-------------------------------------------------------------------* + * rc_dec_finish() + * + * Finalize range decoder + *-------------------------------------------------------------------*/ + +void rc_dec_finish( + Decoder_State *st, /* i/o: Decoder State */ + PVQ_DEC_HANDLE hPVQ /* i/o: PVQ decoder handle */ +) +{ + st->next_bit_pos = hPVQ->rc_end; + + return; +} + + +/*-------------------------------------------------------------------* + * rc_dec_read() + * + * Read a byte from bitstream + *-------------------------------------------------------------------*/ + +static int16_t rc_dec_read( + Decoder_State *st, /* i/o: Decoder state */ + PVQ_DEC_HANDLE hPVQ /* i/o: PVQ decoder handle */ +) +{ + int16_t bits; + + bits = hPVQ->rc_end - st->next_bit_pos; + + /* If the end of the buffer has been reached, pad the last byte with zeros */ + if ( bits < 8 ) + { + return ( get_next_indice( st, bits ) << ( 8 - bits ) ); + } + else + { + return get_next_indice( st, 8 ); + } +} diff --git a/lib_dec/re8_dec.c b/lib_dec/re8_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..a48e6471a48f60487573b1552846477e78d0414b --- /dev/null +++ b/lib_dec/re8_dec.c @@ -0,0 +1,105 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "prot.h" +#include "wmc_auto.h" + + +/*-------------------------------------------------------------------------- + re8_dec(n, I, k, y) + + MULTI-RATE INDEXING OF A POINT y in THE LATTICE RE8 (INDEX DECODING) + -------------------------------------------------------------------------*/ + +void re8_dec( + int16_t n, /* i : codebook number (*n is an integer defined in {0,2,3,4,..,n_max}) */ + const uint16_t I, /* i : index of c (pointer to unsigned 16-bit word) */ + const int16_t k[], /* i : index of v (8-dimensional vector of binary indices) = Voronoi index */ + int16_t y[] /* o : point in RE8 (8-dimensional integer vector) */ +) +{ + int16_t i, m, v[8]; + + /*------------------------------------------------------------------------* + * decode the sub-indices I and kv[] according to the codebook number n: + * if n=0,2,3,4, decode I (no Voronoi extension) + * if n>4, Voronoi extension is used, decode I and kv[] + *------------------------------------------------------------------------*/ + + if ( n <= 4 ) + { + re8_decode_base_index( n, I, y ); + } + else + { + /*--------------------------------------------------------------------* + * compute the Voronoi modulo m = 2^r where r is extension order + *--------------------------------------------------------------------*/ + + m = 1; + while ( n > 4 ) + { + m *= 2; + n -= 2; + } + + /*--------------------------------------------------------------------* + * decode base codebook index I into c (c is an element of Q3 or Q4) + * [here c is stored in y to save memory] + *--------------------------------------------------------------------*/ + + re8_decode_base_index( n, I, y ); + + /*--------------------------------------------------------------------* + * decode Voronoi index k[] into v + *--------------------------------------------------------------------*/ + + re8_k2y( k, m, v ); + + /*--------------------------------------------------------------------* + * reconstruct y as y = m c + v (with m=2^r, r integer >=1) + *--------------------------------------------------------------------*/ + + for ( i = 0; i < 8; i++ ) + { + y[i] = m * y[i] + v[i]; + } + } + + return; +} diff --git a/lib_dec/rom_dec.c b/lib_dec/rom_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..11661592f9469d82d6448bbc33c767a650d1ac6d --- /dev/null +++ b/lib_dec/rom_dec.c @@ -0,0 +1,243 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "wmc_auto.h" + +/* clang-format off */ + +/*----------------------------------------------------------------------------------* + * LP filter for filtering periodic part of excitation in artificial onset + * construction after frame error concealment + *----------------------------------------------------------------------------------*/ + +const float h_low[5] = { -0.0125f, 0.1090f, 0.7813f, 0.1090f, -0.0125f }; + +/* RE8 related tables */ +const int16_t mult_avq_tab[7] = {1,1,1,342,1,1,171}; +const int16_t shift_avq_tab[7] = {0,0,1, 10,2,0, 10}; + +const int16_t hntable[55]= +{ + 0X13, -0X10, -0X0F, -0X11, 0X51, 0X61, -0X0E, -0X12, 0X51, 0X61, + -0X13, -0X0D, 0X51, 0X62, -0X14, 0X81, -0X0C, 0X81, -0X15, -0X17, + 0X71, 0X81, -0X18, -0X16, 0X71, -0X0B, 0X71, -0X1A, 0X71, -0X09, + -0X1B, -0X0A, -0X19, 0X41, -0X1C, -0X08, 0X31, 0X41, -0X1D, -0X06, + 0X31, 0X41, -0X07, 0X41, -0X05, -0X1E, -0X04, -0X1F, 0X11, -0X03, + 0X11, -0X02, 0X11, -0X01, 0X00 +}; + +const int16_t hetable[57]= +{ + 0X12, 0X41, -0X0F, 0X41, -0X10, -0X0E, 0X31, -0X11, 0X31, 0X41, + -0X0D, 0X41, -0X12, 0X42, -0x0C, 0X61, -0X13, 0X61, 0X71, -0X0A, + 0X71, -0X0B, -0X14, -0X15, 0X51, 0X61, -0X16, -0X09, 0X51, 0X61, + -0X17, 0X62, -0X08, 0X81, -0X07, 0X81, -0X18, -0X05, -0X04, -0X03, + 0X51, -0X06, 0X51, -0X19, 0X51, -0X01, -0X1C, -0X02, -0X1B, -0X1A, + 0X11, 0X00, 0X11, -0X1D, 0X11, -0X1E, -0X1F +}; + +const int16_t hestable[15]= +{ + 0X11, 0X21, -0X04, 0X21, -0X03, 0X21, -0X02, -0X05, 0X11, 0X21, -0X01, -0X06, + 0X11, -0X07, -0X00 +}; + +const float lsf_tab[LPC_SHB_ORDER] = +{ + 0.070633653f, 0.11962059f, 0.16925794f, 0.20627696f, 0.24345790f, + 0.31293656f, 0.34594478f, 0.38072862f, 0.410051247f, 0.44525622f +}; + +/* frequency group start bins for transient analysis */ +/* 125 375 750 1250 2000 4000 8000 16000 24000 */ +const int16_t gw[LGW_MAX] = { 1, 3, 6, 10, 16, 32, 64, 128, 192 }; + +/* 31.25 343.75 718.75 1218.75 1968.75 4000 8000 16000 24000 */ +const int16_t ivas_gwlpr[LGW_MAX] = { 1, 3*QUOT_LPR_LTR-1, 6*QUOT_LPR_LTR-1, 10*QUOT_LPR_LTR-1, 16*QUOT_LPR_LTR-1, 32*QUOT_LPR_LTR, 64*QUOT_LPR_LTR, 128*QUOT_LPR_LTR, 192*QUOT_LPR_LTR }; + +const float w_hamm48k_2[L_TRANA48k/2] = +{ + 0.080000000000000f, 0.080061898522781f, 0.080247577432747f, 0.080556986759243f, 0.080990043232791f, 0.081546630307495f, 0.082226598192408f, 0.083029763891845f, + 0.083955911254630f, 0.085004791032270f, 0.086176120946031f, 0.087469585762906f, 0.088884837380455f, 0.090421494920485f, 0.092079144831552f, 0.093857341000262f, + 0.095755604871328f, 0.097773425576361f, 0.099910260071357f, 0.102165533282844f, 0.104538638262646f, 0.107028936351231f, 0.109635757349585f, 0.112358399699582f, + 0.115196130672791f, 0.118148186567665f, 0.121213772915079f, 0.124392064692135f, 0.127682206544200f, 0.131083313015096f, 0.134594468785406f, 0.138214728918801f, + 0.141943119116349f, 0.145778635978722f, 0.149720247276233f, 0.153766892226636f, 0.157917481780606f, 0.162170898914830f, 0.166525998932624f, 0.170981609771997f, + 0.175536532321084f, 0.180189540740855f, 0.184939382795015f, 0.189784780187013f, 0.194724428904063f, 0.199756999568084f, 0.204881137793469f, 0.210095464551578f, + 0.215398576541875f, 0.220789046569584f, 0.226265423929784f, 0.231826234797829f, 0.237469982625987f, 0.243195148546199f, 0.249000191778843f, 0.254883550047394f, + 0.260843639998870f, 0.266878857629950f, 0.272987578718653f, 0.279168159261450f, 0.285418935915708f, 0.291738226447335f, 0.298124330183510f, 0.304575528470374f, + 0.311090085135560f, 0.317666246955443f, 0.324302244126969f, 0.330996290743956f, 0.337746585277719f, 0.344551311061912f, 0.351408636781431f, 0.358316716965264f, + 0.365273692483159f, 0.372277691045950f, 0.379326827709445f, 0.386419205381703f, 0.393552915333588f, 0.400726037712459f, 0.407936642058840f, 0.415182787825961f, + 0.422462524902000f, 0.429773894134909f, 0.437114927859666f, 0.444483650427822f, 0.451878078739195f, 0.459296222775571f, 0.466736086136265f, 0.474195666575400f, + 0.481672956540759f, 0.489165943714067f, 0.496672611552554f, 0.504190939831653f, 0.511718905188695f, 0.519254481667438f, 0.526795641263308f, 0.534340354469178f, + 0.541886590821560f, 0.549432319447051f, 0.556975509608890f, 0.564514131253475f, 0.572046155556704f, 0.579569555469978f, 0.587082306265726f, 0.594582386082315f, + 0.602067776468170f, 0.609536462925001f, 0.616986435449943f, 0.624415689076500f, 0.631822224414129f, 0.639204048186324f, 0.646559173767056f, 0.653885621715418f, + 0.661181420308344f, 0.668444606071246f, 0.675673224306430f, 0.682865329619155f, 0.690018986441185f, 0.697132269551692f, 0.704203264595389f, 0.711230068597719f, + 0.718210790476997f, 0.725143551553344f, 0.732026486054283f, 0.738857741616868f, 0.745635479786192f, 0.752357876510168f, 0.759023122630418f, 0.765629424369165f, + 0.772175003811978f, 0.778658099386259f, 0.785076966335314f, 0.791429877187917f, 0.797715122223211f, 0.803931009930835f, 0.810075867466152f, 0.816148041100446f, + 0.822145896665987f, 0.828067819995822f, 0.833912217358185f, 0.839677515885409f, 0.845362163997224f, 0.850964631818323f, 0.856483411590088f, 0.861917018076364f, + 0.867263988963175f, 0.872522885252262f, 0.877692291648358f, 0.882770816940072f, 0.887757094374303f, 0.892649782024062f, 0.897447563149619f, 0.902149146552868f, + 0.906753266924821f, 0.911258685186131f, 0.915664188820559f, 0.919968592201292f, 0.924170736910022f, 0.928269492048706f, 0.932263754543917f, 0.936152449443706f, + 0.939934530206900f, 0.943608978984751f, 0.947174806894860f, 0.950631054287315f, 0.953976791002949f, 0.957211116623676f, 0.960333160714807f, 0.963342083059310f, + 0.966237073883933f, 0.969017354077129f, 0.971682175398738f, 0.974230820681355f, 0.976662604023336f, 0.978976870973391f, 0.981172998706713f, 0.983250396192597f, + 0.985208504353495f, 0.987046796215483f, 0.988764777050081f, 0.990361984507393f, 0.991837988740540f, 0.993192392521341f, 0.994424831347216f, 0.995534973539285f, + 0.996522520331626f, 0.997387205951684f, 0.998128797691797f, 0.998747095971820f, 0.999241934392838f, 0.999613179781951f, 0.999860732228111f, 0.999984525109009f +}; + +const float w_hamm32k_2[L_TRANA32k/2] = +{ + 0.080000000000000f, 0.080139632090179f, 0.080558443590627f, 0.081256180242538f, 0.082232418452750f, 0.083486565550910f, 0.085017860149273f, 0.086825372604947f, + 0.088908005584270f, 0.091264494728999f, 0.093893409423896f, 0.096793153665248f, 0.099961967029797f, 0.103397925743485f, 0.107098943849369f, 0.111062774473996f, + 0.115287011191475f, 0.119769089484404f, 0.124506288300781f, 0.129495731705944f, 0.134734390628539f, 0.140219084699457f, 0.145946484182623f, 0.151913111996467f, + 0.158115345824847f, 0.164549420316138f, 0.171211429369169f, 0.178097328504598f, 0.185202937320297f, 0.192523942029263f, 0.200055898078497f, 0.207794232847276f, + 0.215734248423172f, 0.223871124454139f, 0.232199921074925f, 0.240715581906049f, 0.249412937123505f, 0.258286706597345f, 0.267331503097225f, 0.276541835562968f, + 0.285912112438167f, 0.295436645064799f, 0.305109651136783f, 0.314925258210395f, 0.324877507269410f, 0.334960356342792f, 0.345167684172755f, 0.355493293930949f, + 0.365930916980537f, 0.376474216681854f, 0.387116792239357f, 0.397852182587524f, 0.408673870313343f, 0.419575285613002f, 0.430549810280395f, 0.441590781725011f, + 0.452691497016760f, 0.463845216955300f, 0.475045170161378f, 0.486284557187706f, 0.497556554646881f, 0.508854319353835f, 0.520170992480304f, 0.531499703718800f, + 0.542833575453544f, 0.554165726935838f, 0.565489278461346f, 0.576797355546729f, 0.588083093103121f, 0.599339639603893f, 0.610560161244195f, 0.621737846089724f, + 0.632865908212225f, 0.643937591809204f, 0.654946175305346f, 0.665884975433158f, 0.676747351290353f, 0.687526708371517f, 0.698216502571607f, 0.708810244158849f, + 0.719301501714632f, 0.729683906037996f, 0.739951154012344f, 0.750097012432047f, 0.760115321786592f, 0.770000000000000f, 0.779745046123229f, 0.789344543977327f, + 0.798792665745119f, 0.808083675509254f, 0.817211932734458f, 0.826171895691878f, 0.834958124823446f, 0.843565286044212f, 0.851988153980648f, 0.860221615142946f, + 0.868260671029406f, 0.876100441160999f, 0.883736166044290f, 0.891163210060907f, 0.898377064281809f, 0.905373349204632f, 0.912147817412476f, 0.918696356152490f, + 0.925014989832710f, 0.931099882435622f, 0.936947339846999f, 0.942553812098577f, 0.947915895523229f, 0.953030334821319f, 0.957894025036981f, 0.962504013443125f, + 0.966857501334024f, 0.970951845724403f, 0.974784560953977f, 0.978353320196492f, 0.981655956872329f, 0.984690465963826f, 0.987455005232518f, 0.989947896337551f, + 0.992167625854595f, 0.994112846194642f, 0.995782376422118f, 0.997175202971826f, 0.998290480264278f, 0.999127531219040f, 0.999685847665791f, 0.999965090652822f +}; + +const float w_hamm16k_2[L_TRANA16k/2] = +{ + 0.080000000000000f, 0.080562848541440f, 0.082250016781061f, 0.085057375935460f, 0.088978055926352f, 0.094002462192807f, 0.100118299170741f, 0.107310600382232f, + 0.115561765060989f, 0.124851601224384f, 0.135157375086613f, 0.146453866692083f, 0.158713431632863f, 0.171906068699192f, 0.185999493297458f, 0.200959216456013f, + 0.216748629225465f, 0.233329092266912f, 0.250660030408878f, 0.268699031941561f, 0.287401952405387f, 0.306723022619904f, 0.326614960688639f, 0.347029087705815f, + 0.367915446881795f, 0.389222925795719f, 0.410899381476157f, 0.432891768003705f, 0.455146266323232f, 0.477608415948132f, 0.500223248234257f, 0.522935420897402f, + 0.545689353445147f, 0.568429363191639f, 0.591099801522450f, 0.613645190076067f, 0.636010356508734f, 0.658140569510427f, 0.679981672741539f, 0.701480217362516f, + 0.722583592832128f, 0.743240155654278f, 0.763399355758289f, 0.783011860203399f, 0.802029673904734f, 0.820406257085326f, 0.838096639166738f, 0.855057528819616f, + 0.871247419904816f, 0.886626693045890f, 0.901157712584333f, 0.914804918680351f, 0.927534914333744f, 0.939316547111965f, 0.950120985385339f, 0.959921788882895f, + 0.968694973396140f, 0.976419069472435f, 0.983075174954342f, 0.988647001236375f, 0.993120913125941f, 0.996485962210947f, 0.998733913652397f, 0.999859266336418f +}; + +const float w_hamm_sana48k_2[L_PROT_HAMM_LEN2_48k] = +{ + 0.080000000000000f, 0.080027462973758f, 0.080109848615839f, 0.080247147089046f, 0.080439341999361f, 0.080686410397899f, 0.080988322783646f, 0.081345043106986f, + 0.081756528774001f, 0.082222730651560f, 0.082743593073186f, 0.083319053845701f, 0.083949044256652f, 0.084633489082516f, 0.085372306597683f, 0.086165408584215f, + 0.087012700342376f, 0.087914080701944f, 0.088869442034286f, 0.089878670265216f, 0.090941644888610f, 0.092058238980796f, 0.093228319215714f, 0.094451745880830f, + 0.095728372893819f, 0.097058047820012f, 0.098440611890594f, 0.099875900021559f, 0.101363740833430f, 0.102903956671715f, 0.104496363628120f, 0.106140771562514f, + 0.107836984125627f, 0.109584798782499f, 0.111384006836658f, 0.113234393455047f, 0.115135737693669f, 0.117087812523972f, 0.119090384859956f, 0.121143215586007f, + 0.123246059585445f, 0.125398665769793f, 0.127600777108759f, 0.129852130660926f, 0.132152457605149f, 0.134501483272651f, 0.136898927179823f, 0.139344503061711f, + 0.141837918906203f, 0.144378876988888f, 0.146967073908615f, 0.149602200623714f, 0.152283942488898f, 0.155011979292835f, 0.157785985296381f, 0.160605629271474f, + 0.163470574540687f, 0.166380479017425f, 0.169334995246772f, 0.172333770446984f, 0.175376446551605f, 0.178462660252227f, 0.181592043041866f, 0.184764221258970f, + 0.187978816132029f, 0.191235443824805f, 0.194533715482165f, 0.197873237276507f, 0.201253610454792f, 0.204674431386151f, 0.208135291610080f, 0.211635777885218f, + 0.215175472238683f, 0.218753952015982f, 0.222370789931481f, 0.226025554119419f, 0.229717808185479f, 0.233447111258894f, 0.237213018045087f, 0.241015078878844f, + 0.244852839778006f, 0.248725842497672f, 0.252633624584921f, 0.256575719434027f, 0.260551656342175f, 0.264560960565666f, 0.268603153376600f, 0.272677752120042f, + 0.276784270271653f, 0.280922217495778f, 0.285091099704000f, 0.289290419114133f, 0.293519674309662f, 0.297778360299609f, 0.302065968578839f, 0.306381987188769f, + 0.310725900778505f, 0.315097190666374f, 0.319495334901855f, 0.323919808327907f, 0.328370082643670f, 0.332845626467550f, 0.337345905400666f, 0.341870382090660f, + 0.346418516295861f, 0.350989764949788f, 0.355583582225999f, 0.360199419603261f, 0.364836725931051f, 0.369494947495359f, 0.374173528084809f, 0.378871909057071f, + 0.383589529405564f, 0.388325825826447f, 0.393080232785873f, 0.397852182587524f, 0.402641105440390f, 0.407446429526807f, 0.412267581070735f, 0.417103984406268f, + 0.421955062046372f, 0.426820234751838f, 0.431698921600448f, 0.436590540056336f, 0.441494506039550f, 0.446410233995788f, 0.451337136966322f, 0.456274626658076f, + 0.461222113513879f, 0.466179006782852f, 0.471144714590954f, 0.476118644011648f, 0.481100201136704f, 0.486088791147110f, 0.491083818384099f, 0.496084686420271f, + 0.501090798130810f, 0.506101555764784f, 0.511116361016516f, 0.516134615097028f, 0.521155718805537f, 0.526179072601003f, 0.531204076673714f, 0.536230131016910f, + 0.541256635498423f, 0.546282989932337f, 0.551308594150653f, 0.556332848074950f, 0.561355151788038f, 0.566374905605590f, 0.571391510147749f, 0.576404366410692f, + 0.581412875838160f, 0.586416440392922f, 0.591414462628186f, 0.596406345758937f, 0.601391493733196f, 0.606369311303187f, 0.611339204096419f, 0.616300578686650f, + 0.621252842664750f, 0.626195404709433f, 0.631127674657866f, 0.636049063576134f, 0.640958983829565f, 0.645856849152894f, 0.650742074720264f, 0.655614077215060f, + 0.660472274899558f, 0.665316087684385f, 0.670144937197788f, 0.674958246854690f, 0.679755441925542f, 0.684535949604939f, 0.689299199080028f, 0.694044621598654f, + 0.698771650537277f, 0.703479721468629f, 0.708168272229108f, 0.712836742985904f, 0.717484576303842f, 0.722111217211948f, 0.726716113269708f, 0.731298714633038f, + 0.735858474119933f, 0.740394847275806f, 0.744907292438496f, 0.749395270802946f, 0.753858246485539f, 0.758295686588082f, 0.762707061261442f, 0.767091843768804f, + 0.771449510548575f, 0.775779541276891f, 0.780081418929751f, 0.784354629844749f, 0.788598663782413f, 0.792813013987120f, 0.796997177247615f, 0.801150653957089f, + 0.805272948172839f, 0.809363567675482f, 0.813422024027731f, 0.817447832632716f, 0.821440512791844f, 0.825399587762201f, 0.829324584813474f, 0.833215035284397f, + 0.837070474638713f, 0.840890442520641f, 0.844674482809841f, 0.848422143675885f, 0.852132977632196f, 0.855806541589490f, 0.859442396908678f, 0.863040109453242f, + 0.866599249641071f, 0.870119392495760f, 0.873600117697347f, 0.877041009632507f, 0.880441657444176f, 0.883801655080607f, 0.887120601343857f, 0.890398099937691f, + 0.893633759514900f, 0.896827193724033f, 0.899978021255524f, 0.903085865887227f, 0.906150356529334f, 0.909171127268689f, 0.912147817412476f, 0.915080071531290f, + 0.917967539501574f, 0.920809876547428f, 0.923606743281775f, 0.926357805746886f, 0.929062735454256f, 0.931721209423824f, 0.934332910222545f, 0.936897526002284f, + 0.939414750537061f, 0.941884283259609f, 0.944305829297265f, 0.946679099507180f, 0.949003810510844f, 0.951279684727920f, 0.953506450409391f, 0.955683841670007f, + 0.957811598520034f, 0.959889466896295f, 0.961917198692508f, 0.963894551788914f, 0.965821290081179f, 0.967697183508596f, 0.969522008081546f, 0.971295545908249f, + 0.973017585220782f, 0.974687920400358f, 0.976306352001886f, 0.977872686777781f, 0.979386737701038f, 0.980848323987568f, 0.982257271117780f, 0.983613410857422f, + 0.984916581277667f, 0.986166626774449f, 0.987363398087044f, 0.988506752315891f, 0.989596552939653f, 0.990632669831523f, 0.991614979274757f, 0.992543363977448f, + 0.993417713086533f, 0.994237922201026f, 0.995003893384487f, 0.995715535176712f, 0.996372762604660f, 0.996975497192592f, 0.997523666971448f, 0.998017206487434f, + 0.998456056809844f, 0.998840165538090f, 0.999169486807964f, 0.999443981297112f, 0.999663616229731f, 0.999828365380479f, 0.999938209077610f, 0.999993134205322f +}; + +const float w_hamm_sana32k_2[L_PROT_HAMM_LEN2_32k] = +{ + 0.080000000000000f, 0.080061898522781f, 0.080247577432747f, 0.080556986759243f, 0.080990043232791f, 0.081546630307495f, 0.082226598192408f, 0.083029763891845f, + 0.083955911254630f, 0.085004791032270f, 0.086176120946031f, 0.087469585762906f, 0.088884837380455f, 0.090421494920485f, 0.092079144831552f, 0.093857341000262f, + 0.095755604871328f, 0.097773425576361f, 0.099910260071357f, 0.102165533282844f, 0.104538638262646f, 0.107028936351231f, 0.109635757349585f, 0.112358399699582f, + 0.115196130672791f, 0.118148186567665f, 0.121213772915079f, 0.124392064692135f, 0.127682206544200f, 0.131083313015096f, 0.134594468785406f, 0.138214728918801f, + 0.141943119116349f, 0.145778635978722f, 0.149720247276233f, 0.153766892226636f, 0.157917481780606f, 0.162170898914830f, 0.166525998932624f, 0.170981609771997f, + 0.175536532321084f, 0.180189540740855f, 0.184939382795015f, 0.189784780187013f, 0.194724428904063f, 0.199756999568084f, 0.204881137793469f, 0.210095464551578f, + 0.215398576541875f, 0.220789046569584f, 0.226265423929784f, 0.231826234797829f, 0.237469982625987f, 0.243195148546199f, 0.249000191778843f, 0.254883550047394f, + 0.260843639998870f, 0.266878857629950f, 0.272987578718653f, 0.279168159261450f, 0.285418935915708f, 0.291738226447335f, 0.298124330183510f, 0.304575528470374f, + 0.311090085135560f, 0.317666246955443f, 0.324302244126969f, 0.330996290743956f, 0.337746585277719f, 0.344551311061912f, 0.351408636781431f, 0.358316716965264f, + 0.365273692483159f, 0.372277691045950f, 0.379326827709445f, 0.386419205381703f, 0.393552915333588f, 0.400726037712459f, 0.407936642058840f, 0.415182787825961f, + 0.422462524902000f, 0.429773894134909f, 0.437114927859666f, 0.444483650427822f, 0.451878078739195f, 0.459296222775571f, 0.466736086136265f, 0.474195666575400f, + 0.481672956540759f, 0.489165943714067f, 0.496672611552554f, 0.504190939831653f, 0.511718905188695f, 0.519254481667438f, 0.526795641263308f, 0.534340354469178f, + 0.541886590821560f, 0.549432319447051f, 0.556975509608890f, 0.564514131253475f, 0.572046155556704f, 0.579569555469978f, 0.587082306265726f, 0.594582386082315f, + 0.602067776468170f, 0.609536462925001f, 0.616986435449943f, 0.624415689076500f, 0.631822224414129f, 0.639204048186324f, 0.646559173767056f, 0.653885621715418f, + 0.661181420308344f, 0.668444606071246f, 0.675673224306430f, 0.682865329619155f, 0.690018986441185f, 0.697132269551692f, 0.704203264595389f, 0.711230068597719f, + 0.718210790476997f, 0.725143551553344f, 0.732026486054283f, 0.738857741616868f, 0.745635479786192f, 0.752357876510168f, 0.759023122630418f, 0.765629424369165f, + 0.772175003811978f, 0.778658099386259f, 0.785076966335314f, 0.791429877187917f, 0.797715122223211f, 0.803931009930835f, 0.810075867466152f, 0.816148041100446f, + 0.822145896665987f, 0.828067819995822f, 0.833912217358185f, 0.839677515885409f, 0.845362163997224f, 0.850964631818323f, 0.856483411590088f, 0.861917018076364f, + 0.867263988963175f, 0.872522885252262f, 0.877692291648358f, 0.882770816940072f, 0.887757094374303f, 0.892649782024062f, 0.897447563149619f, 0.902149146552868f, + 0.906753266924821f, 0.911258685186131f, 0.915664188820559f, 0.919968592201292f, 0.924170736910022f, 0.928269492048706f, 0.932263754543917f, 0.936152449443706f, + 0.939934530206900f, 0.943608978984751f, 0.947174806894860f, 0.950631054287315f, 0.953976791002949f, 0.957211116623676f, 0.960333160714807f, 0.963342083059310f, + 0.966237073883933f, 0.969017354077129f, 0.971682175398738f, 0.974230820681355f, 0.976662604023336f, 0.978976870973391f, 0.981172998706713f, 0.983250396192597f, + 0.985208504353495f, 0.987046796215483f, 0.988764777050081f, 0.990361984507393f, 0.991837988740540f, 0.993192392521341f, 0.994424831347216f, 0.995534973539285f, + 0.996522520331626f, 0.997387205951684f, 0.998128797691797f, 0.998747095971820f, 0.999241934392838f, 0.999613179781951f, 0.999860732228111f, 0.999984525109009f +}; + +const float w_hamm_sana16k_2[L_PROT_HAMM_LEN2_16k] = +{ + 0.080000000000000f, 0.080248875229243f, 0.080995231617495f, 0.082238261557724f, 0.083976620009229f, 0.086208425953062f, 0.088931264427414f, 0.092142189140766f, + 0.095837725659970f, 0.100013875169814f, 0.104666118800010f, 0.109789422514906f, 0.115378242560646f, 0.121426531463883f, 0.127927744575542f, 0.134874847152564f, + 0.142260321969963f, 0.150076177454966f, 0.158313956334418f, 0.166964744786114f, 0.176019182084144f, 0.185467470727822f, 0.195299387043225f, 0.205504292245887f, + 0.216071143952672f, 0.226988508130357f, 0.238244571468020f, 0.249827154159818f, 0.261723723084350f, 0.273921405366317f, 0.286407002305832f, 0.299167003660284f, + 0.312187602263317f, 0.325454708965093f, 0.338953967877692f, 0.352670771909129f, 0.366590278569198f, 0.380697426030022f, 0.394976949423959f, 0.409413397361190f, + 0.423991148649151f, 0.438694429195694f, 0.453507329077705f, 0.468413819756689f, 0.483397771422710f, 0.498442970447917f, 0.513533136930761f, 0.528651942311926f, + 0.543783027042910f, 0.558910018288144f, 0.574016547641481f, 0.589086268837895f, 0.604102875441222f, 0.619050118488809f, 0.633911824073957f, 0.648671910847171f, + 0.663314407417236f, 0.677823469633322f, 0.692183397729409f, 0.706378653312465f, 0.720393876176025f, 0.734213900920944f, 0.747823773365368f, 0.761208766726146f, + 0.774354397554188f, 0.787246441406510f, 0.799870948238030f, 0.812214257496436f, 0.824263012903808f, 0.836004176908999f, 0.847425044795124f, 0.858513258426909f, + 0.869256819623006f, 0.879644103138828f, 0.889663869245825f, 0.899305275893620f, 0.908557890441822f, 0.917411700948838f, 0.925857127005450f, 0.933885030101461f, + 0.941486723514159f, 0.948653981707932f, 0.955379049234843f, 0.961654649126531f, 0.967473990768381f, 0.972830777247415f, 0.977719212165966f, 0.982134005913770f, + 0.986070381391670f, 0.989524079180756f, 0.992491362151336f, 0.994969019506760f, 0.996954370257714f, 0.998445266123226f, 0.999440093855253f, 0.999937776984316f +}; + + +/* er_dec_tcx.c */ +const float h_high3_32[L_FIR_FER2] = {-0.0517f, -0.0587f, -0.0820f, -0.1024f, -0.1164f, 0.8786f, -0.1164f, -0.1024f, -0.0820f, -0.0587f, -0.0517f}; +const float h_high3_16[L_FIR_FER2] = { 0.f, -0.0205f, -0.0651f, -0.1256f, -0.1792f, 0.8028f, -0.1792f, -0.1256f, -0.0651f, -0.0205f, 0.f }; + +/* clang-format on */ diff --git a/lib_dec/rom_dec.h b/lib_dec/rom_dec.h new file mode 100644 index 0000000000000000000000000000000000000000..bbf6759bdbe7ad242bf110a93a913262a5b7fa5f --- /dev/null +++ b/lib_dec/rom_dec.h @@ -0,0 +1,67 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#ifndef ROM_DEC_H +#define ROM_DEC_H + +#include +#include "options.h" +#include "cnst.h" + +extern const float h_low[]; /* LP filter for filtering periodic part of excitation in artificial onset construction after FEC */ + +extern const int16_t mult_avq_tab[]; +extern const int16_t shift_avq_tab[]; + +extern const int16_t hntable[55]; +extern const int16_t hetable[57]; +extern const int16_t hestable[15]; + +extern const float lsf_tab[LPC_SHB_ORDER]; + +extern const int16_t gw[LGW_MAX]; +extern const int16_t ivas_gwlpr[LGW_MAX]; +extern const float w_hamm32k_2[L_TRANA32k / 2]; +extern const float w_hamm16k_2[L_TRANA16k / 2]; +extern const float w_hamm_sana32k_2[L_PROT_HAMM_LEN2_32k]; +extern const float w_hamm_sana16k_2[L_PROT_HAMM_LEN2_16k]; +extern const float w_hamm48k_2[L_TRANA48k / 2]; +extern const float w_hamm_sana48k_2[L_PROT_HAMM_LEN2_48k]; + +extern const float h_high3_32[L_FIR_FER2]; +extern const float h_high3_16[L_FIR_FER2]; + +#endif diff --git a/lib_dec/rst_dec.c b/lib_dec/rst_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..00bc9298d92d1bfd7b86ad39659bfc8b0dfdbac8 --- /dev/null +++ b/lib_dec/rst_dec.c @@ -0,0 +1,95 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "wmc_auto.h" + +/*----------------------------------------------------------------------------------* + * CNG_reset_dec() + * + * Reset decoder static variables in case of CNG frame + *----------------------------------------------------------------------------------*/ + +void CNG_reset_dec( + Decoder_State *st, /* i/o: decoder state structure */ + float *pitch_buf, /* o : floating pitch for each subframe */ + float *voice_factors /* o : voicing factors */ +) +{ + mvr2r( UVWB_Ave, st->mem_AR, M ); + set_f( st->mem_MA, 0, M ); + set_f( st->dispMem, 0, 8 ); + st->tilt_code = 0.0f; + st->gc_threshold = 0.0f; + + /* last good received frame for FEC in ACELP */ + st->clas_dec = UNVOICED_CLAS; + st->last_good = UNVOICED_CLAS; + + /* LP-filtered pitch gain set to 0 */ + st->lp_gainp = 0.0f; + + /* convert CNG energy into CNG gain for ACELP FEC */ + st->lp_gainc = (float) sqrt( st->lp_ener ); + + /* reset the pitch buffer in case of FRAME_NO_DATA or SID frames */ + if ( st->L_frame == L_FRAME ) + { + set_f( pitch_buf, (float) L_SUBFR, NB_SUBFR ); + } + else /* st->L_frame == L_FRAME16k */ + { + set_f( pitch_buf, (float) L_SUBFR16k, NB_SUBFR16k ); + } + + set_f( voice_factors, 1.0, NB_SUBFR16k ); + + /* deactivate bass post-filter */ + st->bpf_off = 1; + + /* Reset active frame counter */ + if ( st->hTdCngDec != NULL ) + { + st->hTdCngDec->act_cnt2 = 0; + } + + return; +} diff --git a/lib_dec/stat_dec.h b/lib_dec/stat_dec.h new file mode 100644 index 0000000000000000000000000000000000000000..822b593c5b6a02a64fb2345c4c37fec352c00f8c --- /dev/null +++ b/lib_dec/stat_dec.h @@ -0,0 +1,1346 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#ifndef STAT_DEC_H +#define STAT_DEC_H + +#include +#include "options.h" +#include "cnst.h" +#include "stat_com.h" /* Common structures */ +#include "ivas_cnst.h" + +/*---------------------------------------------------------------* + * Structure for FD Mode2 frameMode + *---------------------------------------------------------------*/ + +typedef enum _DEC_MODE +{ + DEC_NO_FRAM_LOSS = 0x0, + DEC_CONCEALMENT_EXT = 0x1 +} DEC_MODE; + +typedef enum +{ + FRAMEMODE_NORMAL = 0x0, /* frame available */ + FRAMEMODE_MISSING = 0x1, /* frame missing => conceal */ + FRAMEMODE_FUTURE = 0x2 +} FRAME_MODE; + + +/*---------------------------------------------------------------* + * Structure for FD CNG + *---------------------------------------------------------------*/ + +typedef struct +{ + HANDLE_FD_CNG_COM hFdCngCom; + + float msPeriodog[NPART_SHAPING]; /* Periodogram */ + float msBminWin[NPART_SHAPING]; + float msBminSubWin[NPART_SHAPING]; + float msPsd[NPART_SHAPING]; /* Power Spectral Density estimate (i.e., smoothed periodogram) */ + float msAlpha[NPART_SHAPING]; /* Optimal smoothing parameter */ + float msMinBuf[MSNUMSUBFR * NPART_SHAPING]; /* Buffer of minima */ + float msCurrentMinOut[NPART_SHAPING]; + float msCurrentMin[NPART_SHAPING]; + float msCurrentMinSubWindow[NPART_SHAPING]; + int16_t msLocalMinFlag[NPART_SHAPING]; + int16_t msNewMinFlag[NPART_SHAPING]; + float msPsdFirstMoment[NPART_SHAPING]; + float msPsdSecondMoment[NPART_SHAPING]; + float msNoiseFloor[NPART_SHAPING]; /* Estimated noise floor */ + float msNoiseEst[NPART_SHAPING]; /* Estimated noise level */ + float msLogPeriodog[NPART_SHAPING]; /* Periodogram */ + float msLogNoiseEst[NPART_SHAPING]; /* Estimated noise level */ + int16_t npart_shaping; /* Number of partitions */ + int16_t nFFTpart_shaping; /* Number of hybrid spectral partitions */ + int16_t part_shaping[NPART_SHAPING]; /* Partition upper boundaries (band indices starting from 0) */ + int16_t midband_shaping[NPART_SHAPING]; /* Central band of each partition */ + float psize_shaping[NPART_SHAPING]; /* Partition sizes */ + float psize_inv_shaping[NPART_SHAPING]; /* Inverse of partition sizes */ + float bandNoiseShape[FFTLEN2]; /* CNG spectral shape computed at the decoder */ + float partNoiseShape[NPART]; /* CNG spectral shape computed at the decoder */ + + float smoothed_psd[L_FRAME16k]; /* stereo CNA - periodogram smoothed with IIR filter */ + float msPeriodog_ST[NPART_SHAPING]; /* stereo CNA - short-term periodogram */ + int16_t ms_last_inactive_bwidth; /* stereo CNA - bandwidth from the last inactive frame */ + int16_t ms_cnt_bw_up; /* stereo CNA - downward counter of frames since the last NB->WB switch */ + float cna_LR_LT; /* stereo CNA - long-term L/R correlation factor calculated on stereo upmix */ + float cna_ILD_LT; /* stereo CNA - long-term ILD factor calculated on stereo upmix */ + float cna_g_state[STEREO_DFT_BAND_MAX]; /* stereo CNA - side gains from the last inactive frame */ + float cna_cm[STEREO_DFT_BAND_MAX]; /* stereo CNA - coherence from the last inactive frame */ + int16_t first_cna_noise_updated; /* stereo CNA - flag indicating that comfort noise has been properly initialized during warmup */ + int16_t first_cna_noise_update_cnt; /* stereo CNA - counter of CN initialization frames */ + int16_t cna_nbands; /* stereo CNA - number of frequency bands used by the CNA in DFT stereo mode */ + + int16_t cna_band_limits[STEREO_DFT_BAND_MAX + 1]; /* stereo CNA - band limits used by the CNA in DFT stereo mode */ + float cna_act_fact; /* stereo CNA - long-term signal activity factor (0-1) */ + float cna_rescale_fact; /* stereo CNA - CN energy re-scaling factor to maintain decoded energy */ + int16_t cna_seed; /* stereo CNA - seed for random CN generator */ + + int16_t flag_dtx_mode; + float lp_speech; + float lp_noise; + + float msPeriodogBuf[MSBUFLEN * NPART_SHAPING]; + int16_t msPeriodogBufPtr; + + +} FD_CNG_DEC, *HANDLE_FD_CNG_DEC; + +/*---------------------------------------------------------------* + * Structure for PLC + *---------------------------------------------------------------*/ + +typedef struct +{ + int16_t L_frameTCX; + + int16_t Pitch; + int16_t T_bfi; + + int16_t Transient[MAX_POST_LEN]; + int16_t TCX_Tonality[DEC_STATE_LEN]; + + float outx_new_n1; + float nsapp_gain; + float nsapp_gain_n; + float data_reci2[L_FRAME_MAX]; + float data_noise[L_FRAME_MAX]; + float ener_mean; + float ener; + int16_t zp; + float recovery_gain; + float step_concealgain; + + int16_t concealment_method; + int16_t subframe; + int16_t nbLostCmpt; + + int16_t seed; + +} T_PLCInfo, *T_PLCInfo_HANDLE; + + +/*---------------------------------------------------------------* + * Structures for Tonal MDCT PLC * + *---------------------------------------------------------------*/ + +typedef struct +{ + uint16_t nSamples; + uint16_t nSamplesCore; + Float32 *spectralData; + float *scaleFactors; + int16_t blockIsValid; + int16_t blockIsConcealed; + int16_t tonalConcealmentActive; +} blockData; + +typedef struct +{ + uint16_t numIndexes; + uint16_t indexOfTonalPeak[MAX_NUMBER_OF_IDX]; + uint16_t lowerIndex[MAX_NUMBER_OF_IDX]; + uint16_t upperIndex[MAX_NUMBER_OF_IDX]; + Float32 phaseDiff[MAX_NUMBER_OF_IDX]; /* This one can be stored with 16 bits in range 0..2*PI */ + Float32 phase_currentFramePredicted[MAX_NUMBER_OF_IDX * GROUP_LENGTH]; /* This one can be stored with 16 bits in range 0..2*PI, but the code has to be adapted to use moduo(2*PI) after adding */ +} TonalComponentsInfo; + +typedef struct +{ + TCX_config *tcx_cfg; + void *pMDSTData; + int16_t nSamples; + int16_t nSamplesCore; + int16_t nNonZeroSamples; + int16_t nScaleFactors; + + float lastPitchLag; + + blockData lastBlockData; + blockData secondLastBlockData; + + Float32 scaleFactorsBuffers[2][FDNS_NPTS]; /* Contains also global gain. If it can not be stored in 16 bits with global gain included, then store global gain separately. */ + Float32 spectralDataBuffers[2][L_FRAME_MAX]; /* 16 bits is enough, because it is stored before applying scale factors. Take care that power spectrum is also stored here. */ + Float32 timeDataBuffer[( 3 * L_FRAME_MAX ) / 2]; + Float32 *lastPcmOut; + Float32 *secondLastPcmOut; + float *secondLastPowerSpectrum; + + float scaleFactorsBackground[FDNS_NPTS]; + float scf_fadeout; + PsychoacousticParameters *psychParams; + PsychoacousticParameters psychParamsTCX20; + PsychoacousticParameters psychParamsTCX10; + + float last_block_nrg; + float curr_noise_nrg; + float faded_signal_nrg; + + float nFramesLost; + + TonalComponentsInfo *pTCI; + +} TonalMDCTConceal_INSTANCE, *TonalMDCTConcealPtr; + +typedef enum SIGNAL_CLASSIFER_MODE +{ + CLASSIFIER_ACELP, + CLASSIFIER_TCX +} SIGNAL_CLASSIFIER_MODE; + + +/*---------------------------------------------------------------* + * Structures for IGF decoder * + *---------------------------------------------------------------*/ + +typedef struct +{ + int16_t bitsRead; /* after a call bitsRead contains the number of bits consumed by the decoder */ + int16_t prev[64]; /* no more than 64 SCFs for the IGF energy envelope of one block */ + int16_t scfCountLongBlock[IGF_NOF_GRIDS]; + int16_t t; + int32_t bitrate; + const uint16_t *cf_se00; + const uint16_t *cf_se01; + int16_t cf_off_se01; + const uint16_t *cf_se02; + const int16_t *cf_off_se02; + const uint16_t *cf_se10; + int16_t cf_off_se10; + const uint16_t *cf_se11; + const int16_t *cf_off_se11; + Tastat acState; + +} IGFSCFDEC_INSTANCE, *IGFSCFDEC_INSTANCE_HANDLE; + +typedef struct igfdec_private_data_struct +{ + + IGF_INFO igfInfo; + /* envelope reconstruction: */ + float igf_sN[IGF_MAX_SFB]; /* only with short blocks as static needed */ + float igf_pN[IGF_MAX_SFB]; /* only with short blocks as static needed */ + int16_t igf_curr[IGF_MAX_SFB]; /* current igf energies */ + int16_t igf_prev[IGF_MAX_SFB]; /* needed for concealment or indepflag==0 */ + int16_t igf_curr_subframe[IGF_MAX_SUBFRAMES][IGF_TRANS_FAK][IGF_MAX_SFB]; /* current igf energies per subframe*/ + int16_t igf_prev_subframe[IGF_MAX_SUBFRAMES][IGF_MAX_SFB]; /* needed for concealment or indepflag==0 */ + int16_t igf_flatteningTrigger_subframe[IGF_MAX_SUBFRAMES]; + + /* spectral whitening: */ + float *pSpecFlat; + float pSpecFlatBuf[IGF_START_MX]; + int16_t restrict_hopsize; + + int16_t currWhiteningLevel[IGF_MAX_TILES]; + int16_t prevWhiteningLevel[IGF_MAX_TILES]; /* needed for concealment */ + int16_t currWhiteningLevel_subframe[IGF_MAX_SUBFRAMES][IGF_MAX_TILES]; + int16_t prevWhiteningLevel_subframe[IGF_MAX_SUBFRAMES][IGF_MAX_TILES]; /* needed for concealment */ + + float totalNoiseNrg; + int16_t n_noise_bands; + + float totalNoiseNrg_off; + int16_t n_noise_bands_off; + + /* IGF SCF decoding: */ + IGFSCFDEC_INSTANCE hArithSCFdec; + + /* concealment: */ + int16_t frameLossCounter; + +} IGFDEC_PRIVATE_DATA, *IGF_DEC_PRIVATE_DATA_HANDLE; + +typedef struct igfdec_instance_struct +{ + int16_t isIGFActive; + int16_t infoIGFAllZero; + int16_t infoIGFStopLine; + int16_t infoIGFStartLine; + int16_t infoIGFStopFreq; + int16_t infoIGFStartFreq; + uint8_t *infoTCXNoise; + uint8_t infoTCXNoiseBuf[IGF_START_MX]; + int16_t *flag_sparse; + int16_t flag_sparseBuf[N_MAX_TCX - IGF_START_MN]; + float *virtualSpec; + float virtualSpecBuf[N_MAX_TCX - IGF_START_MN]; + + int16_t flatteningTrigger; + IGFDEC_PRIVATE_DATA igfData; + +} IGFDEC_INSTANCE, *IGF_DEC_INSTANCE_HANDLE; + + +/*---------------------------------------------------------------* + * Structure for TEC + *---------------------------------------------------------------*/ + +typedef struct tec_dec_structure +{ + float pGainTemp[CLDFB_NO_COL_MAX]; + float loBuffer[CLDFB_NO_COL_MAX + MAX_TEC_SMOOTHING_DEG]; + +} TEC_DEC_DATA, *TEC_DEC_HANDLE; + + +/*------------------------------------------------------------------------------------------* + * TCX LTP decoder + *------------------------------------------------------------------------------------------*/ + +typedef struct tcx_ltp_dec_structure +{ + /* TCX-LTP */ + int16_t tcxltp; + float tcxltp_gain; + int16_t tcxltp_pitch_int; + int16_t tcxltp_pitch_fr; + + float tcxltp_mem_in[TCXLTP_MAX_DELAY]; + float tcxltp_mem_out[L_FRAME48k]; + int16_t tcxltp_pitch_int_post_prev; + int16_t tcxltp_pitch_fr_post_prev; + float tcxltp_gain_post_prev; + int16_t tcxltp_filt_idx_prev; + +} TCX_LTP_DEC_DATA, *TCX_LTP_DEC_HANDLE; + + +/*------------------------------------------------------------------------------------------* + * TCX decoder + *------------------------------------------------------------------------------------------*/ + +typedef struct tcx_dec_structure +{ + int16_t enableTcxLpc; /* global toggle for the TCX LPC quantizer */ + int16_t envWeighted; /* are is{p,f}_old[] weighted or not? */ + + /* tonal PLC */ + float tcxltp_second_last_pitch; + float tcxltp_third_last_pitch; + float tcxltp_last_gain_unmodified; + + int16_t tcx_hm_LtpPitchLag; + int16_t tcx_lpc_shaped_ari; + + int16_t pit_min_TCX; + int16_t pit_max_TCX; + + int16_t L_frameTCX; + + float old_excFB[L_FRAME48k]; /* old excitation FB */ + + int16_t old_synth_len; + int16_t old_synth_lenFB; + float old_synth[OLD_SYNTH_INTERNAL_DEC]; /* synthesis memory */ + float synth_history[L_PROT48k + L_FRAME_MAX]; /* unified synthesis memory */ + + float *old_synthFB; + float *prev_good_synth; + + float old_syn_Overl[L_FRAME32k / 2]; + + float syn_Overl_TDAC[L_FRAME32k / 2]; + float syn_Overl_TDACFB[L_FRAME_MAX / 2]; + + float syn_Overl[L_FRAME32k / 2]; + float syn_OverlFB[L_FRAME_MAX / 2]; + + float FBTCXdelayBuf[111]; /* 2.3125ms at 48kHz -> 111 samples */ + + /*TCX resisual Q*/ + int16_t resQBits[NB_DIV]; /* number of bits read for the residual Quantization in TCX*/ + + /* PLC */ + int16_t noise_filling_index[NB_DIV]; /* PLC - last decoded noise filling index */ + int16_t tnsActive[NB_DIV]; + float ltpGainMemory[N_LTP_GAIN_MEMS]; /* for smoothing noiseTransWidth */ + uint16_t kernel_type[2]; /* transform kernel type in each subframe (MDCT or MDST) */ + + int16_t prev_widow_left_rect; + float CngLevelBackgroundTrace_bfi; /* PLC - long term gain estimate for background level, used for PLC fade out */ + /* state variables for the minimum statistics used for PLC */ + float NoiseLevelMemory_bfi[PLC_MIN_STAT_BUFF_SIZE]; + int16_t NoiseLevelIndex_bfi; + int16_t CurrLevelIndex_bfi; + float LastFrameLevel_bfi; + float old_gaintcx_bfi; + float conceal_eof_gain; + float damping; + float gainHelper; + float stepCompensate; + int16_t tcxConceal_recalc_exc; + float cummulative_damping_tcx; + +} TCX_DEC_DATA, *TCX_DEC_HANDLE; + + +/*----------------------------------------------------------------------------------* + * GSC static variables + *----------------------------------------------------------------------------------*/ + +typedef struct gsc_dec_structure +{ + int16_t seed_tcx; /* AC mode (GSC) - seed for noise fill */ + int16_t cor_strong_limit; /* AC mode (GSC) - Indicator about high spectral correlation per band */ + float old_y_gain[MBANDS_GN16k]; /* AC mode (GSC) - AR mem for low rate gain quantization */ + int16_t noise_lev; /* AC mode (GSC) - noise level */ + float lt_ener_per_band[MBANDS_GN16k]; + float Last_frame_ener; /* AC mode (GSC) - last frame energy */ + float Last_GSC_spectrum[L_FRAME16k]; /* AC mode (GSC) - Last good GSC spectrum */ + int16_t Last_GSC_pit_band_idx; /* AC mode (GSC) - Last pitch band index */ + float last_exc_dct_in[L_FRAME16k]; /* AC mode (GSC) - previous excitation */ + float last_ener; /* AC mode (GSC) - previous energy */ + int16_t last_bitallocation_band[6]; /* AC mode (GSC) - previous bit allocation of each band */ + +} GSC_DEC_DATA, *GSC_DEC_HANDLE; + + +/*----------------------------------------------------------------------------------* + * FEC - ACELP fast recovery + *----------------------------------------------------------------------------------*/ + +typedef struct WI_dec_structure +{ + float old_exc2[L_EXC_MEM]; /* FEC - old excitation2 used in fast recovery */ + float old_syn2[L_EXC_MEM]; /* FEC - old syn speech used in fast recovery */ + +} WI_DEC_DATA, *WI_DEC_HANDLE; + + +/*----------------------------------------------------------------------------------* + * NB postfilter / formant postfilter static variables + *----------------------------------------------------------------------------------*/ + +typedef struct pfstat_structure +{ + int16_t on; /* On/off flag */ + int16_t reset; /* reset flag */ + float mem_pf_in[L_SUBFR]; /* Input memory */ + float mem_stp[L_SUBFR]; /* 1/A(gamma1) memory */ + float mem_res2[DECMEM_RES2]; /* A(gamma2) residual */ + float mem_zero[M]; /* null memory to compute i.r. of A(gamma2)/A(gamma1) */ + float gain_prec; /* for gain adjustment */ + +} PFSTAT, *PFSTAT_HANDLE; + +/*----------------------------------------------------------------------------------* + * LD music post-filter + *----------------------------------------------------------------------------------*/ + +typedef struct ld_music_postfilt_structure +{ + float LDm_mem_etot; /* LD music post-filter - total energy memory */ + int16_t LDm_last_music_flag; /* LD music post-filter - last music flag */ + int16_t LDm_nb_thr_1; /* LD music post-filter - number of consecutive frames of level 1 */ + int16_t LDm_nb_thr_3; + float dct_post_old_exc[DCT_L_POST - OFFSET2]; + float LDm_thres[4]; /* LD music post-filter - Classification threshold */ + float LDm_lt_diff_etot[MAX_LT]; /* LD music post-filter - long-term total energy variation */ + float LDm_enh_lp_gbin[VOIC_BINS_HR]; /* LD music post-filter - smoothed suppression gain, per bin FFT */ + float LDm_enh_lf_EO[VOIC_BINS_HR]; /* LD music post-filter - old per bin E for previous half frame */ + float LDm_enh_min_ns_gain; /* LD music post-filter - minimum suppression gain */ + float LDm_bckr_noise[MBANDS_GN_LD]; /* LD music post-filter - background noise estimation per critical band */ + float filt_lfE[DCT_L_POST]; + int16_t last_nonfull_music; + +} MUSIC_POSTFILT_DATA, *MUSIC_POSTFILT_HANDLE; + +/*----------------------------------------------------------------------------------* + * Bass post-filter + *----------------------------------------------------------------------------------*/ + +typedef struct bass_postfilt_structure +{ + float pst_old_syn[NBPSF_PIT_MAX]; /* Bass post-filter - old synthesis buffer 1 */ + float pst_mem_deemp_err; /* Bass post-filter - filter memory of noise LP filter */ + float pst_lp_ener; /* Bass post-filter - long-term energy */ + int16_t Track_on_hist[L_TRACK_HIST]; /* Bass post-filter - History of half frame usage */ + int16_t vibrato_hist[L_TRACK_HIST]; /* Bass post-filter - History of frames declared as vibrato */ + float psf_att; /* Bass post-filter - post filter attenuation factor */ + float mem_mean_pit[L_TRACK_HIST]; /* Bass post-filter - average pitch memory */ + +} BPF_DEC_DATA, *BPF_DEC_HANDLE; + +/*------------------------------------------------------------------------------------------* + * DTX and TD CNG structure + *------------------------------------------------------------------------------------------*/ + +typedef struct td_cng_dec_structure +{ + int16_t cng_seed; /* DTX/CNG - seed for white noise random generator */ + float Enew; /* DTX/CNG - decoded residual energy */ + int16_t old_enr_index; /* DTX/CNG - index of last encoded CNG energy */ + int16_t cng_ener_seed; /* DTX/CNG - seed for random generator for variation of excitation energy */ + int16_t cng_ener_seed1; + int16_t last_allow_cn_step; + int16_t ho_hist_size; /* DTX/CNG - size of DTX hangover history buffer for averaging, <0,HO_HIST_SIZE> */ + int16_t ho_hist_ptr; /* DTX/CNG - pointer for averaging buffers */ + int16_t ho_sid_bw; /* DTX/CNG - SID bandwidth flags */ + float ho_lsp_hist[HO_HIST_SIZE * M]; /* DTX/CNG - old LSP buffer for averaging */ + float ho_ener_hist[HO_HIST_SIZE]; /* DTX/CNG - energy buffer for averaging */ + float ho_env_hist[HO_HIST_SIZE * NUM_ENV_CNG]; + int16_t act_cnt; /* DTX/CNG - counter of active frames */ + int16_t ho_circ_size; /* DTX/CNG - size of DTX hangover history buffer for averaging, <0,HO_HIST_SIZE> */ + int16_t ho_circ_ptr; /* DTX/CNG - pointer for averaging buffers */ + float ho_lsp_circ[HO_HIST_SIZE * M]; /* DTX/CNG - old LSP buffer for averaging */ + float ho_ener_circ[HO_HIST_SIZE]; /* DTX/CNG - energy buffer for averaging */ + float ho_env_circ[HO_HIST_SIZE * NUM_ENV_CNG]; + int16_t num_ho; /* DTX/CNG - number of selected hangover frames */ + int16_t ho_16k_lsp[HO_HIST_SIZE]; /* DTX/CNG - 16k LSPs flags */ + int16_t act_cnt2; /* DTX/CNG - counter of active frames for CNG_mode switching */ + float old_env[20]; + float lp_env[20]; + float exc_mem[24]; + float exc_mem1[30]; + + + float interpol_3_2_cng_dec[INTERP_3_2_MEM_LEN]; + + /* SWB DTX/CNG parameters */ + float shb_cng_ener; + float shb_lpcCNG[LPC_SHB_ORDER + 1]; + float shb_cng_gain; + float wb_cng_ener; + float last_wb_cng_ener; + float last_shb_cng_ener; + int16_t swb_cng_seed; + float lsp_shb_prev_prev[LPC_SHB_ORDER]; + float lsp_shb_prev[LPC_SHB_ORDER]; + int16_t shb_dtx_count; + int16_t trans_cnt; + int16_t burst_cnt; + float last_shb_ener; + +} TD_CNG_DEC_DATA, *TD_CNG_DEC_HANDLE; + +/*----------------------------------------------------------------------------------* + * SC-VBR structure + *----------------------------------------------------------------------------------*/ + +typedef struct sc_vbr_dec_structure +{ + int16_t firstTime_voiceddec; + + /* DTFS variables */ + float dtfs_dec_a[MAXLAG_WI]; + float dtfs_dec_b[MAXLAG_WI]; + int16_t dtfs_dec_lag; + int16_t dtfs_dec_nH; + int16_t dtfs_dec_nH_4kHz; + float dtfs_dec_upper_cut_off_freq_of_interest; + float dtfs_dec_upper_cut_off_freq; + float ph_offset_D; + float lastLgainD; /* previous gain value for the low band */ + float lastHgainD; /* previous gain value for the high band */ + float lasterbD[NUM_ERB_WB]; /* previous amplitude spectrum (ERB) */ + + /* NELP decoder variables */ + float bp1_filt_mem_nb_dec[14]; + float bp1_filt_mem_wb_dec[8]; + float shape1_filt_mem_dec[20]; + float shape2_filt_mem_dec[20]; + float shape3_filt_mem_dec[20]; + + int16_t nelp_dec_seed; + +} SC_VBR_DEC_DATA, *SC_VBR_DEC_HANDLE; + +/*----------------------------------------------------------------------------------* + * HQ NB FEC structure + *----------------------------------------------------------------------------------*/ + +typedef struct hq_nbfec_structure +{ + int16_t prev_last_core; /* !!! note: the parameter is identical to last_core in IVAS */ + + float diff_energy; + int16_t stat_mode_out; + int16_t stat_mode_old; + int16_t phase_mat_flag; + int16_t phase_mat_next; + int16_t old_Min_ind; + float old_auOut_2fr[L_FRAME8k * 2]; + float old_out_pha[2][N_LEAD_NB]; /* FEC for HQ Core, 0-phase matching old_out, 1-overlapping original old_out and phase matching old_out*/ + float ynrm_values[MAX_SB_NB][MAX_PGF]; + float r_p_values[MAX_SB_NB][MAX_ROW]; + float Norm_gain[SFM_N_NB]; + int16_t HQ_FEC_seed; + float energy_MA_Curr[2]; + int16_t prev_sign_switch[HQ_FEC_SIGN_SFM]; + int16_t prev_sign_switch_2[HQ_FEC_SIGN_SFM]; + float old_coeffs[L_FRAME8k]; /* HQ core - old coefficients (for FEC) */ + float oldIMDCTout[L_FRAME8k / 2]; + float prev_oldauOut[L_FRAME8k]; + +} HQ_NBFEC_DATA, *HQ_NBFEC_HANDLE; + +/*----------------------------------------------------------------------------------* + * HQ core structure + *----------------------------------------------------------------------------------*/ + +typedef struct hq_dec_structure +{ + float old_out[L_FRAME48k]; /* HQ core - previous synthesis for OLA */ + float old_outLB[L_FRAME32k]; + int16_t last_hq_core_type; + int16_t old_is_transient[3]; /* HQ core - previous transient flag (for FEC and BWE/NF) */ + + int16_t mem_norm[SFM_N_ENV_STAB]; + int16_t mem_env_delta; + int16_t no_att_hangover; + float energy_lt; + int16_t hq_generic_seed; + float prev_noise_level[2]; + int16_t prev_hqswb_clas; + int16_t prev_R; /* the table of bit allocation of last frame */ + float prev_coeff_out[L_HQ_WB_BWE]; /* the highest coefficients of last frame */ + int16_t prev_SWB_peak_pos[SPT_SHORTEN_SBNUM]; + + int16_t HqVoicing; + float fer_samples[L_FRAME48k]; + float prev_normq[SFM_N_WB]; /* previous norms */ + float prev_env[SFM_N_WB]; /* previous noise envelopes */ + + float last_ni_gain[BANDS_MAX]; + float last_env[BANDS_MAX]; + int16_t last_max_pos_pulse; + + /* pre-echo reduction */ + float memfilt_lb; + float mean_prev_hb; + float smoothmem; + float mean_prev; + float mean_prev_nc; + float wmold_hb; + int16_t prevflag; + int16_t pastpre; + int16_t prev_frm_hfe2; + int16_t prev_stab_hfe2; + float prev_ni_ratio; + float prev_En_sb[NB_SWB_SUBBANDS]; + + /*----------------------------------------------------------------------------------* + * HQ FEC + *----------------------------------------------------------------------------------*/ + + /* HQ PHASE ECU internal state */ + int16_t time_offs; + float X_sav[PH_ECU_SPEC_SIZE]; + int16_t num_p; + int16_t plocs[MAX_PLOCS]; + float plocsi[MAX_PLOCS]; + float env_stab; + int16_t mem_norm_hqfec[SFM_N_ENV_STAB]; + int16_t mem_env_delta_hqfec; + float env_stab_plc; + float env_stab_state_p[NUM_ENV_STAB_PLC_STATES]; + int16_t envstabplc_hocnt; + + float mag_chg_1st[LGW_MAX]; /* i/o: per band magnitude modifier for transients*/ + float Xavg[LGW_MAX]; /* Frequency group average gain to fade to */ + float beta_mute; /* Factor for long-term mute */ + + int16_t last_fec; + int16_t ph_ecu_HqVoicing; + int16_t oldHqVoicing; + float oldgapsynth[L_FRAME48k]; + int16_t ph_ecu_active; /* Set to 1 if Phase ECU was used in last bad frame; Set to 2 if TCX TD PLC was used */ + int16_t ni_seed_forfec; + int16_t ber_occured_in_pvq; /* flag for BER detection from PVQ routines */ + +} HQ_DEC_DATA, *HQ_DEC_HANDLE; + + +/*----------------------------------------------------------------------------------* + * HF (6-7kHz) (zero) BWE structure + *----------------------------------------------------------------------------------*/ + +typedef struct zero_bwe_dec_structure +{ + int16_t seed2; /* HF (6-7kHz) BWE - seed for random signal generator */ + float mem_hp400[4]; /* HF (6-7kHz) BWE - hp400 filter memory */ + float mem_hf[( L_FIR - 1 )]; /* HF (6-7kHz) BWE - band-pass filter memory */ + float mem_syn_hf[M]; /* HF (6-7kHz) BWE - synthesis filter memory */ + float delay_syn_hf[NS2SA( 16000, DELAY_CLDFB_NS )]; /* HF (6-7kHz) BWE - To synchronise BWE content with postfiltered synthesis */ + float mem_hp_interp[INTERP_3_1_MEM_LEN]; /* HF (6-7 kHz) BWE - interp. memory */ + +} ZERO_BWE_DEC_DATA, *ZERO_BWE_DEC_HANDLE; + + +/*----------------------------------------------------------------------------------* + * TD BWE structure + *----------------------------------------------------------------------------------*/ + +typedef struct td_bwe_dec_structure +{ + /* states for the filters used in generating SHB excitation from WB excitation */ + float state_lpc_syn[LPC_SHB_ORDER]; + float mem_csfilt[2]; + + /* states for the filters used in generating SHB signal from SHB excitation*/ + float state_syn_shbexc[L_SHB_LAHEAD]; + float syn_overlap[L_SHB_LAHEAD]; /* overlap buffer used to Adjust SHB Frame Gain*/ + + /* previous frame parameters for frame error concealment */ + float lsp_prevfrm[LPC_SHB_ORDER]; + float GainFrame_prevfrm; + float GainShape_Delay[NUM_SHB_SUBFR / 2]; + float GainAttn; + + float old_bwe_exc[PIT16k_MAX * 2]; /* old excitation */ + int16_t bwe_seed[2]; + float bwe_non_lin_prev_scale; + float old_bwe_exc_extended[NL_BUFF_OFFSET]; + + float genSHBsynth_Hilbert_Mem[HILBERT_MEM_SIZE]; + + float mem_genSHBexc_filt_down_shb[( 2 * ALLPASSSECTIONS_STEEP + 1 )]; + float mem_genSHBexc_filt_down_wb2[( 2 * ALLPASSSECTIONS_STEEP + 1 )]; + float mem_genSHBexc_filt_down_wb3[( 2 * ALLPASSSECTIONS_STEEP + 1 )]; + float genSHBsynth_state_lsyn_filt_shb_local[2 * ALLPASSSECTIONS_STEEP]; + float state_lsyn_filt_shb[2 * ALLPASSSECTIONS_STEEP]; + float state_lsyn_filt_dwn_shb[2 * ALLPASSSECTIONS_STEEP]; + float mem_resamp_HB[INTERP_3_1_MEM_LEN]; + float mem_resamp_HB_32k[2 * ALLPASSSECTIONS_STEEP + 1]; + float prev_pow_exc16kWhtnd; /* power of the LB excitation signal in the previous frame */ + float prev_mix_factor; /* mixing factor in the previous frame */ + + int16_t syn_dm_phase; + float fbbwe_hpf_mem[4][4]; + float prev_wb_bwe_frame_pow; + float prev_swb_bwe_frame_pow; + float prev_ener; + float prev_GainShape; + float fb_state_lpc_syn[LPC_SHB_ORDER]; + float fb_tbe_demph; + float prev_fbbwe_ratio; + + float tbe_demph; + float tbe_premph; + float mem_stp_swb[LPC_SHB_ORDER]; + float *ptr_mem_stp_swb; + float gain_prec_swb; + float mem_zero_swb[LPC_SHB_ORDER]; + + float swb_lsp_prev_interp[LPC_SHB_ORDER]; + float prev1_shb_ener_sf, prev2_shb_ener_sf, prev3_shb_ener_sf, prev_res_shb_gshape, prev_mixFactors; + float tilt_mem; /* Formant factor adaptation tilt smoothing memory */ + float prev_lsf_diff[LPC_SHB_ORDER - 2]; + float prev_tilt_para; + float cur_sub_Aq[M + 1]; + + /* quantized data */ + int16_t lsf_idx[NUM_Q_LSF]; + int16_t m_idx; + int16_t grid_idx; + int16_t idxSubGains; + int16_t idxFrameGain; + int16_t idx_shb_fr_gain; + int16_t idx_res_gs[NB_SUBFR16k]; + int16_t idx_mixFac; + + int16_t lsf_WB; + int16_t gFrame_WB; + + int16_t idxGain; + + float old_core_synth[L_FRAME16k]; + float old_tbe_synth[L_SHB_TRANSITION_LENGTH]; + + float int_3_over_2_tbemem_dec[INTERP_3_2_MEM_LEN]; + + float old_hb_synth[L_FRAME48k]; + + float tilt_swb_fec; /* FEC - SWB TBE TILT */ + +} TD_BWE_DEC_DATA, *TD_BWE_DEC_HANDLE; + +/*----------------------------------------------------------------------------------* + * FD BWE structure + *----------------------------------------------------------------------------------*/ + +typedef struct fd_bwe_dec_structure +{ + float old_wtda_swb[L_FRAME48k]; + float old_syn_12k8_16k[NS2SA( 16000, DELAY_FD_BWE_ENC_NS )]; + float mem_deemph_old_syn; + int16_t prev_mode; + float prev_SWB_fenv[SWB_FENV]; + float prev_Energy; + float prev_Energy_wb; + int16_t prev_L_swb_norm; + int16_t Seed; + int16_t prev_frica_flag; + float mem_imdct[L_FRAME48k]; + float prev_td_energy; + float prev_weight; + int16_t prev_flag; + float last_wb_bwe_ener; + float prev_fb_ener_adjust; + +} FD_BWE_DEC_DATA, *FD_BWE_DEC_HANDLE; + + +/*----------------------------------------------------------------------------------* + * HR SWB BWE structure + *----------------------------------------------------------------------------------*/ + +typedef struct hr_swb_bwe_dec_structure +{ + + int16_t bwe_highrate_seed; + float t_audio_prev[2 * END_FREQ_BWE_FULL_FB / FRAMES_PER_SEC - NUM_NONTRANS_START_FREQ_COEF]; + int16_t old_is_transient_hr_bwe; + float mem_EnergyLT; + +} HR_BWE_DEC_DATA, *HR_BWE_DEC_HANDLE; + + +/*---------------------------------------------------------------* + * PVQ range decoder state + *---------------------------------------------------------------*/ + +typedef struct pvq_dec_structure +{ + uint32_t rc_low; + uint32_t rc_range; + uint32_t rc_help; + int16_t rc_num_bits; + int16_t rc_offset; + int16_t rc_end; + +} PVQ_DEC_DATA, *PVQ_DEC_HANDLE; + + +/*---------------------------------------------------------------* + * AMR-WB IO mode decoder structure + *---------------------------------------------------------------*/ + +typedef struct amrwb_io_dec_structure +{ + float past_qua_en[GAIN_PRED_ORDER]; /* gain quantization memory (used also in AMR-WB IO mode) */ + + float prev_r; /* HF BWE - previous sub-frame gain */ + float fmerit_w_sm; /* HF BWE - fmerit parameter memory */ + int16_t frame_count; /* HF BWE - frame count */ + float ne_min; /* HF BWE - minimum Noise gate - short-term energy */ + float fmerit_m_sm; /* HF BWE - memory of fmerit_m param */ + float voice_fac_amr_wb_hf; /* HF BWE - voice factor */ + float unvoicing; /* HF BWE - unvoiced parameter */ + float unvoicing_sm; /* HF BWE - smoothed unvoiced parameter */ + int16_t unvoicing_flag; /* HF BWE - unvoiced flag */ + int16_t voicing_flag; /* HF BWE - voiced flag */ + int16_t start_band_old; /* HF BWE - previous start point for copying frequency band */ + float OptCrit_old; /* HF BWE - previous criterion value for deciding the start point */ + + /* Improvement of unvoiced and audio signals in AMR-WB IO mode */ + int16_t UV_cnt; /* number of consecutives frames classified as UV */ + float LT_UV_cnt; /* long-term consecutives frames classified as UV */ + float Last_ener; /* last_energy frame */ + float lt_diff_etot[MAX_LT]; /* stability estimation - long-term total energy variation */ + float old_Aq[NB_SUBFR * ( M + 1 )]; /* old LPC filter coefficient */ + float lt_voice_fac; /* average voice factor over 4 sub-frames */ + +} AMRWB_IO_DEC_DATA, *AMRWB_IO_DEC_HANDLE; + + +/*----------------------------------------------------------------------------------* + * + * Main decoder structure + * + *----------------------------------------------------------------------------------*/ + +typedef struct Decoder_State +{ + + /*----------------------------------------------------------------------------------* + * Common parameters + *----------------------------------------------------------------------------------*/ + + int16_t idchan; /* channel ID (audio channel number) */ + int16_t element_mode; /* element mode */ + int32_t element_brate; /* element bitrate */ + int16_t codec_mode; /* Mode 1 or 2 */ + int16_t mdct_sw_enable; /* MDCT switching enable flag */ + int16_t mdct_sw; /* MDCT switching indicator */ + int16_t last_codec_mode; /* last used codec mode */ + + uint16_t *bit_stream; /* pointer to bitstream buffer */ + int16_t next_bit_pos; /* position of the next bit to be read from the bitstream */ + int16_t BER_detect; /* flag to signal detected bit error in the bitstream */ + int32_t output_Fs; /* output sampling rate */ + int32_t total_brate; /* total bitrate in kbps of the codec */ + int32_t last_total_brate; /* last total bitrate in kbps of the codec */ + int32_t last_total_brate_ber; /* last total bitrate in kbps of the codec - used only when first frame is lost and BER is detected afterwards */ + int16_t bits_frame_nominal; /* avg bits per frame on active frame */ + int32_t last_bits_frame_nominal; /* last avg bits per frame on active frame */ + int16_t flag_ACELP16k; /* flag indicating use of ACELP core at 16kHz internal sampling rate */ + int16_t bits_frame_channel; /* bits frame channel */ + int16_t side_bits_frame_channel; /* bits frame channel */ + int16_t core; /* core (ACELP_CORE, TCX_20_CORE, TCX_10_CORE, HQ_CORE, AMR_WB_CORE) */ + int16_t coder_type; /* coder type */ + int16_t transform_type[2]; /* TCX20/10/5 mode in each subframe */ + int32_t core_brate; /* core bitrate */ + int32_t last_core_brate; /* previous frame core bitrate */ + int16_t extl; /* extension layer */ + int16_t extl_orig; /* extension layer */ + int16_t last_extl; /* previous extension layer */ + int32_t extl_brate; /* extension layer bitrate */ + int32_t extl_brate_orig; /* extension layer bitrate */ + int16_t L_frame; /* ACELP core internal frame length */ + int16_t bwidth; /* encoded signal bandwidth */ + int16_t Opt_AMR_WB; /* flag indicating AMR-WB IO mode */ + int16_t ini_frame; /* initialization frames counter */ + int16_t prev_coder_type; /* coding type of last frame */ + int16_t low_rate_mode; /* low-rate mode flag */ + int16_t last_low_rate_mode; /* previous frame low-rate mode flag */ + int16_t inactive_coder_type_flag; /* inactive coder type flag (0 = AVQ / 1 = GSC) */ + + /*----------------------------------------------------------------------------------* + * ACELP core parameters + *----------------------------------------------------------------------------------*/ + + float old_exc[L_EXC_MEM_DEC]; /* old excitation */ + float lsp_old[M]; /* old LSP vector at the end of the frame */ + float lsf_old[M]; /* old LSF vector at the end of the frame */ + float tilt_code; /* tilt of code */ + float mem_syn1[M]; /* synthesis filter memory (for core switching and FD BWE) */ + float mem_syn2[M]; /* synthesis filter memory */ + float mem_syn3[M]; + float mem_deemph; /* deemphasis filter memory */ + float mem_AR[M]; /* AR memory of LSF quantizer (past quantized LSFs without mean) */ + float mem_MA[M]; /* MA memory of LSF quantizer (past quantized residual) */ + float stab_fac; /* LSF stability factor */ + float stab_fac_smooth; /* low-pass filtered stability factor */ + int16_t last_coder_type; /* previous coder type */ + float agc_mem2[2]; /* memory of AGC for saturation control */ + int16_t mid_lsf_int; + int16_t safety_net; + float stab_fac_smooth_lt; + float log_energy_old; + float log_energy_diff_lt; + + int16_t GSC_noisy_speech; /* AC mode (GSC) - flag to indicate GSC on SWB noisy speech */ + int16_t GSC_IVAS_mode; /* AC mode (GSC) - GSC IVAS mode */ + int16_t Last_GSC_noisy_speech_flag; /* AC mode (GSC) - mem of the past flag to indicate GSC osn SWB noisy speech */ + GSC_DEC_HANDLE hGSCDec; + + float gc_threshold; /* Noise enhancer - threshold for gain_code */ + float dispMem[8]; /* Noise enhancer - phase dispersion algorithm memory */ + + ZERO_BWE_DEC_HANDLE hBWE_zero; /* HF (6-7kHz) BWE */ + + int16_t unv_cnt; /* Stationary noise UV modification - unvoiced frame counter */ + int16_t uv_count; /* Stationary noise UV modification - unvoiced counter */ + int16_t act_count; /* Stationary noise UV modification - activation counter */ + float ge_sm; /* Stationary noise UV modification - smoothed excitation gain */ + float lspold_s[M]; /* Stationary noise UV modification - old LSP vector */ + int16_t noimix_seed; /* Stationary noise UV modification - mixture seed */ + float min_alpha; /* Stationary noise UV modification - minimum alpha */ + float exc_pe; /* Stationary noise UV modification - memory of the preemphasis filter */ + + int16_t bfi; /* FEC - bad frame indicator */ + int16_t prev_bfi; /* FEC - previous bad frame indicator */ + int16_t prev_old_bfi; /* FEC - previous old bad frame indicator */ + int16_t seed; /* FEC - seed for random generator for excitation */ + float lp_ener_bfi; /* FEC - long-term active-signal average energy */ + int16_t last_good; /* FEC - clas of last good received */ + float lp_gainp; /* FEC - low-pass filtered pitch gain */ + float lp_gainc; /* FEC - low-pass filtered code gain */ + float lp_ener; /* FEC - low-pass filtered energy */ + float enr_old; /* FEC - energy of the concealed frame */ + float bfi_pitch; /* FEC - pitch for FEC */ + int16_t bfi_pitch_frame; /* FEC - frame length when pitch for FEC is saved */ + float old_pitch_buf[2 * NB_SUBFR16k + 2]; /* FEC - buffer of old subframe pitch values */ + int16_t upd_cnt; /* FEC - counter of frames since last update */ + int16_t scaling_flag; /* FEC - flag to indicate energy control of syn */ + float lp_ener_FEC_av; /* FEC - averaged voiced signal energy */ + float lp_ener_FEC_max; /* FEC - averaged voiced signal energy */ + float old_enr_LP; /* FEC - LP filter gain */ + int16_t prev_nbLostCmpt; /* FEC - compt for number of consecutive lost frame at the previous frame*/ + int16_t mode_lvq; /* FEC - index for LSF mean vector */ + float lsfoldbfi0[M]; /* FEC - LSF vector of the previous frame */ + float lsfoldbfi1[M]; /* FEC - LSF vector of the past previous frame */ + float lsf_adaptive_mean[M]; /* FEC - adaptive mean LSF vector for FEC */ + int16_t decision_hyst; /* FEC - hysteresis of the music/speech decision */ + WI_DEC_HANDLE hWIDec; + int16_t relax_prev_lsf_interp; + float mem_syn_clas_estim[L_SYN_MEM_CLAS_ESTIM]; /* FEC - memory of the synthesis signal for frame class estimation */ + + int16_t bpf_off; /* Bass post-filter - do not use BPF when this flag is set to 1 */ + BPF_DEC_HANDLE hBPF; /* Bass post-filter handle */ + + HANDLE_CLDFB_FILTER_BANK cldfbAna; /* main analysis filter bank handle */ + HANDLE_CLDFB_FILTER_BANK cldfbBPF; /* BPF analysis filter bank handle */ + HANDLE_CLDFB_FILTER_BANK cldfbSyn; /* main synthesis filter bank handle */ + HANDLE_CLDFB_FILTER_BANK cldfbSynHB; /* high band synthesis filter bank needed in SBA2Stereo DTX handling */ + + int16_t last_active_bandsToZero_bwdec; + int16_t last_flag_filter_NB; + float perc_bwddec; + int16_t active_frame_cnt_bwddec; + int16_t flag_buffer[20]; + int16_t total_frame_cnt_bwddec; + float avg_nrg_LT; + float ng_ener_ST; /* Noise gate - short-term energy */ + + int16_t last_L_frame; /* ACELP@16kHz - last value of st->L_frame */ + float mem_preemp_preQ; /* ACELP@16kHz - prequantizer preemhasis memory */ + int16_t last_nq_preQ; /* ACELP@16kHz - AVQ subquantizer number of the last sub-band of the last subframe */ + int16_t last_code_preq; /* ACELP@16kHz - last coefficient of the pre-quantizer contribution */ + int16_t use_acelp_preq; /* ACELP@16kHz - flag of prequantizer usage */ + + /* NB and formant post-filter */ + PFSTAT_HANDLE hPFstat; /* NB and formant post-filter states */ + float psf_lp_noise; /* NB post-filter - long-term noise */ + + float last_voice_factor; + float prev_synth_buffer[NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_CLDFB_NS )]; + + int16_t old_bfi_cnt; /* HQ core - # of bfi until previous frame(for FEC) */ + + /*----------------------------------------------------------------------------------* + * DTX and TD CNG parameters + *----------------------------------------------------------------------------------*/ + + int16_t first_CNG; /* DTX/CNG - first CNG frame flag */ + int16_t cng_type; /* DTX/CNG - flag indicating LP or CLDFB based SID/CNG */ + int16_t last_vad; + int32_t last_active_brate; /* DTX/CNG - last active frame bitrate used for CNG_mode control */ + int16_t last_CNG_L_frame; /* DTX/CNG - last CNG frame length */ + + int16_t active_cnt; + + int16_t CNG_mode; /* DTX/CNG - mode for DTX configuration */ + float lspCNG[M]; /* DTX/CNG - LP filtered ISPs */ + + TD_CNG_DEC_HANDLE hTdCngDec; + int16_t masa_sid_format; + + /*----------------------------------------------------------------------------------* + * AMR-WB IO mode parameters + *----------------------------------------------------------------------------------*/ + + AMRWB_IO_DEC_HANDLE hAmrwb_IO; + + /*----------------------------------------------------------------------------------* + * SC-VBR parameters + *----------------------------------------------------------------------------------*/ + + SC_VBR_DEC_HANDLE hSC_VBR; + + int16_t last_ppp_mode_dec; + int16_t ppp_mode_dec; + int16_t last_nelp_mode_dec; + int16_t nelp_mode_dec; + float prev_gain_pit_dec; + float prev_tilt_code_dec; + int16_t vbr_hw_BWE_disable_dec; + int16_t last_vbr_hw_BWE_disable_dec; + + /*----------------------------------------------------------------------------------* + * channel-aware mode + *----------------------------------------------------------------------------------*/ + + float tilt_code_dec[NB_SUBFR16k]; + + int16_t rf_frame_type; + int16_t use_partial_copy; + int16_t prev_use_partial_copy; + int16_t rf_flag; + int16_t rf_flag_last; + + int16_t rf_fec_offset; + int16_t next_coder_type; + int16_t prev_rf_frame_type; + int16_t rf_target_bits; + + int16_t rf_indx_nelp_fid; + int16_t rf_indx_nelp_iG1; + int16_t rf_indx_nelp_iG2[2]; + int16_t rf_indx_tbeGainFr; + + /*----------------------------------------------------------------------------------* + * HR SWB BWE parameters + *----------------------------------------------------------------------------------*/ + + HR_BWE_DEC_HANDLE hBWE_FD_HR; + + /*----------------------------------------------------------------------------------* + * HQ core parameters + *----------------------------------------------------------------------------------*/ + + HQ_DEC_HANDLE hHQ_core; + + int16_t last_core; + int16_t last_core_from_bs; /* last frame core as coded in TCX bitstream */ + + int16_t last_L_frame_ori; + float previoussynth[L_FRAME48k]; /* note: only 60+111 out of 960 samples are needed in IVAS (for ACELP->TCX switching */ + float old_synth_sw[NS2SA( 48000, FRAME_SIZE_NS - ACELP_LOOK_NS - DELAY_BWE_TOTAL_NS )]; /* note: buffer used only in EVS mono */ + float delay_buf_out[HQ_DELTA_MAX * HQ_DELAY_COMP]; + + float old_Aq_12_8[M + 1]; /* old Aq[] for core switching */ + float old_Es_pred; /* old Es_pred for core switching */ + + HQ_NBFEC_HANDLE hHQ_nbfec; + + /*----------------------------------------------------------------------------------* + * TBE parameters + *----------------------------------------------------------------------------------*/ + + TD_BWE_DEC_HANDLE hBWE_TD; + + int16_t old_bwe_delay; + float hb_prev_synth_buffer[NS2SA( 48000, DELAY_BWE_TOTAL_NS )]; + + /* WB/SWB bandwidth switching */ + float tilt_wb; + float tilt_swb; + float prev_ener_shb; + float enerLH; + float prev_enerLH; + float enerLL; + float prev_enerLL; + int16_t prev_fractive; + int16_t prev_bws_cnt; + int16_t bws_cnt; + int16_t bws_cnt1; + float attenu1; + int16_t last_inner_frame; + int16_t last_bwidth; + float t_audio_q[L_FRAME]; + + /*----------------------------------------------------------------------------------* + * SWB BWE structure + *----------------------------------------------------------------------------------*/ + + FD_BWE_DEC_HANDLE hBWE_FD; + + /*----------------------------------------------------------------------------------* + * LD music post-filter + *----------------------------------------------------------------------------------*/ + + MUSIC_POSTFILT_HANDLE hMusicPF; + + /*----------------------------------------------------------------------------------* + * TCX LTP decoder handle + *----------------------------------------------------------------------------------*/ + TCX_LTP_DEC_HANDLE hTcxLtpDec; + + /*----------------------------------------------------------------------------------* + * TCX core decoder handle + *----------------------------------------------------------------------------------*/ + + TCX_DEC_HANDLE hTcxDec; + + /*----------------------------------------------------------------------------------* + * Mode 2 + *----------------------------------------------------------------------------------*/ + + int16_t force_lpd_reset; + ACELP_config acelp_cfg; /* ACELP configuration set for each frame */ + ACELP_config acelp_cfg_rf; /* ACELP configuration for RF frame */ + + TCX_CONFIG_HANDLE hTcxCfg; /* TCX config */ + + int16_t bits_frame; /* bit per frame overall */ + int16_t bits_frame_core; /* bit per frame for the core */ + int16_t narrowBand; + + int16_t last_is_cng; + + float *acelp_zir; + float syn[M + 1]; + + int16_t bpf_gain_param; /* bass post-filter gain factor parameter (0->noBpf)*/ + + int16_t L_frame_past; + int16_t L_frameTCX_past; + + float lsfold_uw[M]; /* old lsf (unweighted) */ + float lspold_uw[M]; /* old lsp (unweighted) */ + int16_t seed_tcx_plc; /* seed memory (for random function in TCX PLC) */ + float past_gpit; /* past gain of pitch (for frame recovery) */ + float past_gcode; /* past energy (!) of code (for frame recovery) */ + float lsf_cng[M]; /* lsf coefficients used for CNG generation (long term) */ + float lspold_cng[M]; /* lsp coefficients used for CNG generation (long term) */ + float lsp_q_cng[M]; /* lsp coefficients used for CNG generation (short term interpolated) */ + float old_lsp_q_cng[M]; /* lsp coefficients used for CNG generation (short term interpolated) */ + float lsf_q_cng[M]; /* lsf coefficients used for CNG generation (short term interpolated) */ + float old_lsf_q_cng[M]; /* lsf: old quantized lsfs for background noise */ + float Aq_cng[( NB_SUBFR16k + 1 ) * ( M + 1 )]; /* LPC coefficients derived from CNG estimate */ + float mem_syn_unv_back[M]; /* filter memory for unvoiced synth */ + int16_t plcBackgroundNoiseUpdated; /* flag: Is background noise estimate updated? */ + float last_gain_syn_deemph; + float last_concealed_gain_syn_deemph; + + /* variables for framing */ + int16_t nb_subfr; + + int16_t fscale; + int16_t fscale_old; + int32_t sr_core; + + int16_t pit_min; + int16_t pit_fr1; + int16_t pit_fr1b; + int16_t pit_fr2; + int16_t pit_max; + int16_t pit_res_max; + int16_t pit_res_max_past; + + /*Preemphasis factor*/ + float preemph_fac; + float gamma; + + /*for AMR-WB like 6.4 to 7 kHz upsampling and noise filling*/ + float mem_Aq[NB_SUBFR16k * ( M + 1 )]; + + /* Error concealment */ + int16_t last_core_bfi; /* PLC - mode in previous frame */ + int16_t nbLostCmpt; /* PLC - compt for number of consecutive lost frame */ + + float old_fpitch; /* PLC - last pitch of previous frame (as transmitted) */ + float old_fpitchFB; /* PLC - last pitch of previous FB frame (depends on output sr) */ + int16_t clas_dec; /* PLC - frame class at the decoder */ + float mem_pitch_gain[2 * NB_SUBFR16k + 2]; /* PLC - Pitch gain memory */ + int16_t plc_use_future_lag; /* PLC - flag indicating if info (pitch lag / pitch gain) about future frame is usable */ + + float cummulative_damping; + float cngTDLevel; + int16_t reset_mem_AR; + int16_t rate_switching_init; + + /* LPC quantization */ + int16_t lpcQuantization; + int16_t numlpc; + + /* Bandwidth */ + float TcxBandwidth; + + float voice_fac; + + int16_t tcxonly; + + int16_t last_ctx_hm_enabled; + + TonalMDCTConcealPtr hTonalMDCTConc; + int16_t tonal_mdct_plc_active; + int16_t last_tns_active; + int16_t second_last_tns_active; + int16_t second_last_core; + + /* parameters for switching */ + float mem_syn_r[L_SYN_MEM]; /*LPC synthesis memory needed for rate switching*/ + int16_t rate_switching_reset; + + float bpf_noise_buf[L_FRAME16k]; + float *p_bpf_noise_buf; + + int16_t enableGplc; + int16_t flagGuidedAcelp; + int16_t T0_4th; + int16_t guidedT0; + + int16_t enablePlcWaveadjust; + int16_t tonality_flag; + T_PLCInfo_HANDLE hPlcInfo; + + int16_t VAD; + int16_t flag_cna; + int16_t last_flag_cna; + + float lp_noise; + + int16_t seed_acelp; + int16_t core_ext_mode; /*GC,VC,UC,TC: core extended mode used for PLC or Acelp-external modules.*/ + + int16_t dec_glr; + int16_t dec_glr_idx; + + DEC_MODE m_decodeMode; + uint8_t m_frame_type; /*ZERO_FRAME/SID_FRAME/ACTIVE_FRAME*/ + uint8_t m_old_frame_type; /*ZERO_FRAME/SID_FRAME/ACTIVE_FRAME*/ + + int16_t old_ppp_mode; + int16_t con_tcx; + int16_t last_con_tcx; + + int16_t writeFECoffset; + + /*----------------------------------------------------------------------------------* + * Frequency-domain-based CNG + *----------------------------------------------------------------------------------*/ + + HANDLE_FD_CNG_DEC hFdCngDec; + + /*----------------------------------------------------------------------------------* + * IGF + *----------------------------------------------------------------------------------*/ + + IGF_DEC_INSTANCE_HANDLE hIGFDec; + int16_t igf; + + /*----------------------------------------------------------------------------------* + * TEC + *----------------------------------------------------------------------------------*/ + + int16_t tec_tfa; + int16_t tec_flag; + int16_t tfa_flag; + TEC_DEC_HANDLE hTECDec; + + /*----------------------------------------------------------------------------------* + * IVAS parameters + *----------------------------------------------------------------------------------*/ + + int16_t tdm_LRTD_flag; /* LRTD stereo mode flag */ + int16_t cna_dirac_flag; /* CNA in DirAC flag */ + int16_t cng_sba_flag; /* CNG in SBA flag */ + + /* MCT Channel mode indication: LFE, ignore channel? */ + MCT_CHAN_MODE mct_chan_mode; + + int16_t cng_ism_flag; /* CNG in ISM format flag */ + int16_t is_ism_format; /* Indication whether the codec operates in ISM format */ + +} Decoder_State, *DEC_CORE_HANDLE; + +#endif diff --git a/lib_dec/stat_noise_uv_dec.c b/lib_dec/stat_noise_uv_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..0c024aaac9126fafbab202beed3187fd866afe52 --- /dev/null +++ b/lib_dec/stat_noise_uv_dec.c @@ -0,0 +1,109 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "prot.h" +#include "wmc_auto.h" + +/*---------------------------------------------------------* + * stat_noise_uv_dec() + * + * Modifies excitation signal in UC mode when the noise is stationary + *---------------------------------------------------------*/ + +void stat_noise_uv_dec( + Decoder_State *st, /* i/o: decoder static memory */ + const float *lsp_new, /* i : end-frame LSP vector */ + const float *lsp_mid, /* i : mid-frame LSP vector */ + float *Aq, /* o : A(z) quantized for the 4 subframes */ + float *exc2, /* i/o: excitation buffer */ + const int16_t uc_two_stage_flag /* i : flag indicating two-stage UC */ +) +{ + int16_t i; + float ftmp, noisiness = 0; + + /*-----------------------------------------------------------------* + * Decode the VAD flag + *-----------------------------------------------------------------*/ + + if ( ( st->coder_type == UNVOICED && !uc_two_stage_flag ) || ( st->coder_type == INACTIVE && st->core_brate <= ACELP_9k60 ) ) + { + /* read the noisiness parameter */ + noisiness = (float) get_next_indice( st, NBITS_NOISENESS ); + } + + /*-----------------------------------------------------------------* + * Update long-term energies for FEC + * Update LSP vector for CNG + *-----------------------------------------------------------------*/ + + if ( st->coder_type == INACTIVE ) + { + if ( st->unv_cnt > 20 ) + { + ftmp = st->lp_gainc * st->lp_gainc; + st->lp_ener = 0.7f * st->lp_ener + 0.3f * ftmp; + if ( st->hTdCngDec != NULL ) + { + for ( i = 0; i < M; i++ ) + { + st->lspCNG[i] = (float) ( 0.9f * st->lspCNG[i] + 0.1f * lsp_new[i] ); + } + } + } + else + { + st->unv_cnt++; + } + } + else + { + st->unv_cnt = 0; + } + + /*-----------------------------------------------------------------* + * Modify the excitation signal + *-----------------------------------------------------------------*/ + + if ( !st->Opt_AMR_WB ) + { + stat_noise_uv_mod( st->coder_type, noisiness, st->lsp_old, lsp_new, lsp_mid, Aq, exc2, 0, &st->ge_sm, &st->uv_count, &st->act_count, st->lspold_s, &st->noimix_seed, &st->min_alpha, &st->exc_pe, st->core_brate, st->bwidth ); + } + + return; +} diff --git a/lib_dec/swb_bwe_dec.c b/lib_dec/swb_bwe_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..23c59cf5c9e232420f168c78fb11f9dcd98e5876 --- /dev/null +++ b/lib_dec/swb_bwe_dec.c @@ -0,0 +1,789 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "rom_com.h" +#include "basop_util.h" +#include "basop_proto_func.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * para_pred_bws() + * + * predict SWB parameters for bandwidth switching + *-------------------------------------------------------------------*/ + +static int16_t para_pred_bws( + Decoder_State *st, /* i/o: decoder state structure */ + float *signal_wb, /* i : wideband frequency signal */ + float *SWB_fenv /* o : frequency-domain BWE envelope */ +) +{ + int16_t i, j, k; + int16_t mode; + FD_BWE_DEC_HANDLE hBWE_FD; + float *input_hi; + float peak, mean[7], mag, min_val; + float avrg1, avrg2; + float att; + + hBWE_FD = st->hBWE_FD; + + mode = NORMAL; + + k = 0; + input_hi = &signal_wb[SHARP_WIDTH]; + for ( i = 0; i < 7; i++ ) + { + peak = 0.0f; + mean[i] = 0; + for ( j = 0; j < SHARP_WIDTH; j++ ) + { + mag = (float) fabs( *input_hi ); + if ( mag > peak ) + { + peak = mag; + } + mean[i] += mag; + input_hi++; + } + + if ( peak * ( SHARP_WIDTH + 3.5f ) > 4.5f * mean[i] && peak > 8.0f ) + { + k += 1; + } + } + + avrg1 = 0.0f; + avrg2 = 0.0f; + for ( i = 1; i < 4; i++ ) + { + avrg1 += mean[i]; + avrg2 += mean[i + 3]; + } + avrg1 /= 3; + avrg2 /= 3; + + min_val = FLT_MAX; + peak = 0.0f; + for ( i = 4; i < 7; i++ ) + { + if ( mean[i] > 2.0f * avrg2 ) + { + mean[i] *= 2 * avrg2 / mean[i]; + } + if ( mean[i] < min_val ) + { + min_val = mean[i]; + } + if ( mean[i] > peak ) + { + peak = mean[i]; + } + } + + if ( st->tilt_wb > 8 ) + { + min_val = min( st->tilt_wb / 15.0f, 1.0f ) * peak; + } + + if ( peak == 0 || min_val == 0 ) + { + set_f( SWB_fenv, 0, SWB_FENV ); + } + else + { + for ( i = 0; i < SWB_FENV; i++ ) + { + SWB_fenv[i] = min_val * mean[i / 5 + 4] / ( 64 * peak ); + } + } + + for ( j = 0, i = SWB_FENV / 2; i < SWB_FENV; i++ ) + { + SWB_fenv[i] *= ( 1.0f - (float) j++ / SWB_FENV ); + } + + if ( avrg1 > 8.0f * avrg2 ) + { + for ( i = 0; i < SWB_FENV; i++ ) + { + SWB_fenv[i] *= 0.5f; + } + } + if ( st->last_core != HQ_CORE && st->last_codec_mode == MODE1 && + ( st->enerLH > 0.5f * st->prev_enerLH && st->enerLH < 2.0f * st->prev_enerLH ) && + ( st->enerLL > 0.5f * st->prev_enerLL && st->enerLL < 2.0f * st->prev_enerLL ) ) + { + for ( i = 0; i < SWB_FENV; i++ ) + { + if ( st->prev_coder_type != st->coder_type && SWB_fenv[i] > 2.0f * hBWE_FD->prev_SWB_fenv[i] ) + { + SWB_fenv[i] = 0.1f * SWB_fenv[i] + 0.9f * hBWE_FD->prev_SWB_fenv[i]; + } + else + { + SWB_fenv[i] = st->attenu1 * SWB_fenv[i] + ( 1.0f - st->attenu1 ) * hBWE_FD->prev_SWB_fenv[i]; + } + } + + if ( st->attenu1 < 0.9f ) + { + st->attenu1 += 0.05f; + } + } + else + { + if ( st->core_brate != st->last_core_brate || ( st->enerLH > 0.5f * st->prev_enerLH && st->enerLH < 2.0f * st->prev_enerLH ) || + ( st->enerLL > 0.5f * st->prev_enerLL && st->enerLL < 2.0f * st->prev_enerLL ) ) + { + for ( i = 0; i < SWB_FENV; i++ ) + { + if ( SWB_fenv[i] > 2.0f * hBWE_FD->prev_SWB_fenv[i] ) + { + SWB_fenv[i] = hBWE_FD->prev_SWB_fenv[i]; + } + } + } + + for ( i = 0; i < SWB_FENV; i++ ) + { + SWB_fenv[i] = 0.9f * SWB_fenv[i] + 0.1f * hBWE_FD->prev_SWB_fenv[i]; + } + + st->attenu1 = 0.1f; + } + + if ( k > 3 ) + { + mode = HARMONIC; + } + + att = ( (float) N_WS2N_FRAMES - (float) st->bws_cnt ) / (float) N_WS2N_FRAMES; + if ( st->L_frame == L_FRAME16k ) + { + for ( i = 0; i < 4; i++ ) + { + SWB_fenv[i] *= att; + } + } + + for ( i = 4; i < SWB_FENV; i++ ) + { + SWB_fenv[i] *= att; + } + + return mode; +} + +/*-------------------------------------------------------------------* + * WB_BWE_gain_deq() + * + * Decoding of WB parameters + *-------------------------------------------------------------------*/ + +static int16_t WB_BWE_gain_deq( + Decoder_State *st, /* i/o: decoder state structure */ + float *WB_fenv ) +{ + int16_t mode; + int16_t index; + + index = get_next_indice( st, 5 ); + mode = get_next_indice( st, 1 ) + 2; + + WB_fenv[0] = (float) pow( 2, 0.5f * F_2_5[2 * index] ); + WB_fenv[1] = (float) pow( 2, 0.5f * F_2_5[2 * index + 1] ); + + return ( mode ); +} + +/*-------------------------------------------------------------------* + * wb_bwe_dec() + * + * WB BWE decoder (only for 16kHz signals) + *-------------------------------------------------------------------*/ + +void wb_bwe_dec( + Decoder_State *st, /* i/o: decoder state structure */ + const float output[], /* i : synthesis @internal Fs */ + float *synth, /* i/o: ACELP core synthesis/final synthesis */ + float *hb_synth, /* o : SHB synthesis/final synthesis */ + const int16_t use_cldfb_for_dft, /* i : flag to use of CLDFB for DFT Stereo */ + const int16_t output_frame, /* i : frame length */ + const float voice_factors[], /* i : voicing factors */ + const float pitch_buf[] /* i : pitch buffer */ +) +{ + int16_t i, mode; + FD_BWE_DEC_HANDLE hBWE_FD; + float ysynth[L_FRAME48k]; /* MDCT spectrum of core synthesis */ + float yerror[L_FRAME48k]; /* MDCT spectrum of error */ + float wtda_synth[2 * L_FRAME48k]; + float WB_fenv[SWB_FENV]; + + hBWE_FD = st->hBWE_FD; + + /* MDCT of the core synthesis signal */ + if ( st->element_mode == IVAS_CPE_DFT && !use_cldfb_for_dft ) + { + /* IVAS_fmToDo: wtda() does not support L_FRAME length; thus temporarily resample the signal */ + /* IVAS_fmToDo: delay output[] by 1.25ms ? */ + lerp( output, ysynth, L_FRAME16k, st->L_frame ); + + wtda( ysynth, wtda_synth, hBWE_FD->old_wtda_swb, ALDO_WINDOW, ALDO_WINDOW, /*st->L_frame*/ L_FRAME16k ); + direct_transform( wtda_synth, ysynth, 0, /*st->L_frame*/ L_FRAME16k, st->element_mode ); + } + else + { + wtda( synth, wtda_synth, hBWE_FD->old_wtda_swb, ALDO_WINDOW, ALDO_WINDOW, output_frame ); + direct_transform( wtda_synth, ysynth, 0, output_frame, st->element_mode ); + } + + if ( !st->bfi ) + { + if ( st->extl_brate > 0 ) + { + /* de-quantization */ + mode = WB_BWE_gain_deq( st, WB_fenv ); + hBWE_FD->last_wb_bwe_ener = 0.5f * ( WB_fenv[0] + WB_fenv[1] ); + } + else + { + int32_t tmp_brate; + + tmp_brate = st->last_core_brate; + if ( st->last_total_brate == ACELP_9k60 && st->last_extl == SWB_TBE ) + { + tmp_brate = ACELP_8k00; /* this is needed in order to stay BE wrt. EVS mono */ + } + + if ( st->last_extl != WB_BWE ) + { + hBWE_FD->prev_SWB_fenv[0] = 0.0f; + } + + mode = WB_BWE_gain_pred( WB_fenv, ysynth, st->coder_type, st->prev_coder_type, hBWE_FD->prev_SWB_fenv[0], voice_factors, pitch_buf, tmp_brate, hBWE_FD->last_wb_bwe_ener, st->last_extl, st->tilt_wb ); + } + } + else + { + /* FEC */ + mode = NORMAL; + for ( i = 0; i < 2; i++ ) + { + WB_fenv[i] = 0.75f * hBWE_FD->prev_SWB_fenv[i]; + } + } + + if ( st->last_extl != WB_BWE || st->bfi ) + { + mvr2r( WB_fenv, hBWE_FD->prev_SWB_fenv, 2 ); + } + + /* reconstruction of MDCT spectrum of the error signal */ + WB_BWE_decoding( ysynth, WB_fenv, yerror, L_FRAME16k, mode, st->last_extl, &hBWE_FD->prev_Energy_wb, hBWE_FD->prev_SWB_fenv, &hBWE_FD->prev_L_swb_norm, st->extl, st->coder_type, st->total_brate, &hBWE_FD->Seed, &hBWE_FD->prev_flag, st->prev_coder_type ); + + if ( st->output_Fs == 32000 ) + { + set_f( &yerror[L_FRAME16k], 0, L_FRAME16k ); + } + else if ( st->output_Fs == 48000 ) + { + set_f( &yerror[L_FRAME16k], 0, L_FRAME32k ); + } + + inverse_transform( yerror, wtda_synth, 0, output_frame, -1, st->element_mode ); + + window_ola( wtda_synth, hb_synth, hBWE_FD->mem_imdct, output_frame, ALDO_WINDOW, ALDO_WINDOW, 0, 0, 0 ); + + if ( st->element_mode == IVAS_CPE_DFT && !use_cldfb_for_dft ) + { + /* add HB synth from hf_synth() */ + v_add( hb_synth, synth, hb_synth, output_frame ); + } + + st->hBWE_FD->prev_mode = mode; + + return; +} + +/*-------------------------------------------------------------------* + * swb_bwe_gain_deq() + * + * Decoding of SWB parameters + *-------------------------------------------------------------------*/ + +/*! r: BWE class */ +int16_t swb_bwe_gain_deq( + Decoder_State *st, /* i/o: decoder state structure */ + const int16_t core, /* i : core */ + float *SWB_tenv, /* o : time-domain BWE envelope */ + float *SWB_fenv, /* o : frequency-domain BWE envelope */ + const int16_t hr_flag, /* i : high rate flag */ + const int16_t hqswb_clas /* i : HQ BWE class */ +) +{ + int16_t index, mode, n_band; + int16_t indice[6]; + float quant_tmp[SWB_FENV / 2], quant_tmp2[SWB_FENV / 2]; + int16_t nb_bits[6]; + int16_t nenv; + + if ( hqswb_clas > 0 ) + { + mode = get_next_indice( st, 1 ); + if ( mode == 0 ) + { + mode = get_next_indice( st, 1 ); + } + else + { + mode = HQ_GENERIC_SP_EXC; + } + } + else + { + mode = get_next_indice( st, 2 ); + } + + if ( mode == 1 && core == ACELP_CORE ) + { + for ( n_band = 0; n_band < SWB_TENV; n_band++ ) + { + index = get_next_indice( st, 4 ); + SWB_tenv[n_band] = (float) ( 1 << index ); + } + + indice[0] = get_next_indice( st, 7 ); + indice[1] = get_next_indice( st, 6 ); + + for ( n_band = 0; n_band < DIM_TR1; n_band++ ) + { + quant_tmp[2 * n_band] = Env_TR_Cdbk1[indice[0] * DIM_TR1 + n_band]; + } + + quant_tmp[1] = ( quant_tmp[0] + quant_tmp[2] ) * 0.5f + Env_TR_Cdbk2[indice[1] * DIM_TR2]; + quant_tmp[3] = quant_tmp[2] + Env_TR_Cdbk2[indice[1] * DIM_TR2 + 1]; + + for ( n_band = 0; n_band < SWB_FENV_TRANS; n_band++ ) + { + SWB_fenv[n_band] = (float) pow( 10, 0.025f * ( quant_tmp[n_band] + Mean_env_tr[n_band] ) ); + } + + /* in case of band-width switching, attenuate frame gain */ + if ( st->bws_cnt1 > 0 ) + { + for ( n_band = 0; n_band < SWB_TENV; n_band++ ) + { + SWB_tenv[n_band] *= (float) st->bws_cnt1 / (float) N_NS2W_FRAMES; + } + + for ( n_band = 0; n_band < SWB_FENV_TRANS; n_band++ ) + { + SWB_fenv[n_band] *= (float) st->bws_cnt1 / (float) N_NS2W_FRAMES; + } + } + } + else + { + nb_bits[0] = 5; + nb_bits[1] = 7; + nb_bits[2] = 6; + nb_bits[3] = 5; + + if ( hr_flag == 1 ) + { + nb_bits[4] = 5; + nenv = SWB_FENV - 2; + } + else + { + nb_bits[4] = 6; + nenv = SWB_FENV; + } + + for ( n_band = 0; n_band < 5; n_band++ ) + { + indice[n_band] = get_next_indice( st, nb_bits[n_band] ); + } + + if ( hqswb_clas == HQ_GEN_FB ) + { + indice[n_band] = get_next_indice( st, 5 ); + } + + mvr2r( &EnvCdbk11[indice[0] * DIM11], quant_tmp, DIM11 ); + mvr2r( &EnvCdbk1st[indice[1] * DIM1ST], quant_tmp2, DIM1ST ); + mvr2r( &EnvCdbk2nd[indice[2] * DIM2ND], quant_tmp2 + DIM1ST, DIM2ND ); + + for ( n_band = 0; n_band < DIM11 - 1; n_band++ ) + { + quant_tmp[n_band] += quant_tmp2[n_band]; + SWB_fenv[n_band * 2] = quant_tmp[n_band]; + } + + if ( hr_flag == 1 ) + { + quant_tmp[6] += quant_tmp2[6]; + SWB_fenv[11] = quant_tmp[6]; + + + mvr2r( &EnvCdbk3rd[indice[3] * DIM3RD], quant_tmp2, DIM3RD ); + mvr2r( &EnvCdbk3rd[indice[4] * DIM3RD], quant_tmp2 + DIM3RD, DIM3RD ); + + for ( n_band = 0; n_band < 5; n_band++ ) + { + SWB_fenv[n_band * 2 + 1] = ( ( quant_tmp[n_band] + quant_tmp[n_band + 1] ) / 2.f ) + quant_tmp2[n_band + 1]; + } + + SWB_fenv[0] += quant_tmp2[0]; + } + else + { + quant_tmp[DIM11 - 1] += quant_tmp2[DIM11 - 1]; + SWB_fenv[( DIM11 - 1 ) * 2] = quant_tmp[DIM11 - 1]; + + mvr2r( &EnvCdbk3rd[indice[3] * DIM3RD], quant_tmp2, DIM3RD ); + mvr2r( &EnvCdbk4th[indice[4] * DIM4TH], quant_tmp2 + DIM3RD, DIM4TH ); + + for ( n_band = 0; n_band < DIM12 - 1; n_band++ ) + { + SWB_fenv[n_band * 2 + 1] = ( ( quant_tmp[n_band] + quant_tmp[n_band + 1] ) / 2.f ) + quant_tmp2[n_band]; + } + + SWB_fenv[n_band * 2 + 1] = quant_tmp[n_band] + quant_tmp2[n_band]; + } + + for ( n_band = 0; n_band < nenv; n_band++ ) + { + Word16 tmp, frac, exp; + Word32 L_tmp; +#ifdef BASOP_NOGLOB + Flag Overflow; +#endif + tmp = add( (int16_t) ( SWB_fenv[n_band] * 256 ), (int16_t) ( Mean_env[n_band] * 256 ) ); /*Q8 */ + + L_tmp = L_mult( tmp, 21771 ); /* 0.166096 in Q17 -> Q26 */ + L_tmp = L_shr( L_tmp, 10 ); /* From Q26 to Q16 */ + frac = L_Extract_lc( L_tmp, &exp ); /* Extract exponent of L_tmp */ + + tmp = extract_l( Pow2( 13, frac ) ); /* Put 13 as exponent so that */ + /* output of Pow2() will be: */ + /* 16384 < Pow2() <= 32767 */ + exp = sub( exp, 13 ); +#ifdef BASOP_NOGLOB + tmp = shl_o( tmp, add( exp, 1 ), &Overflow ); /*Q1 */ +#else + tmp = shl( tmp, add( exp, 1 ) ); /*Q1 */ +#endif + SWB_fenv[n_band] = (float) tmp * 0.5f; /*Q1 */ + } + + if ( hqswb_clas == HQ_GEN_FB ) + { + mvr2r( &EnvCdbkFB[indice[5] * DIM_FB], &SWB_fenv[nenv], DIM_FB ); + for ( n_band = 0; n_band < DIM_FB; n_band++ ) + { + Word16 tmp, frac, exp; + Word32 L_tmp; + + tmp = add( (int16_t) ( SWB_fenv[n_band + nenv] * 128 ), (int16_t) ( Mean_env_fb[n_band] * 128 ) ); /*Q7 */ + L_tmp = L_mult( tmp, 21771 ); /* 0.166096 in Q17 -> Q25 */ + L_tmp = L_shr( L_tmp, 9 ); /* From Q25 to Q16 */ + frac = L_Extract_lc( L_tmp, &exp ); /* Extract exponent of L_tmp */ + + tmp = extract_l( Pow2( 13, frac ) ); /* Put 13 as exponent so that */ + /* output of Pow2() will be: */ + /* 16384 < Pow2() <= 32767 */ + exp = sub( exp, 13 ); + tmp = shl( tmp, add( exp, 1 ) ); + move16(); + SWB_fenv[add( n_band, nenv )] = (float) tmp * 0.5f; + } + } + } + + return mode; +} + +/*-------------------------------------------------------------------* + * swb_bwe_dec() + * + * SWB BWE decoder + *-------------------------------------------------------------------*/ + +void swb_bwe_dec( + Decoder_State *st, /* i/o: decoder state structure */ + const float output[], /* i : synthesis @internal Fs */ + const float *synth, /* i : ACELP core synthesis/final synthesis */ + float *hb_synth, /* o : SHB synthesis/final synthesis */ + const int16_t use_cldfb_for_dft, /* i : flag to use of CLDFB for DFT Stereo */ + const int16_t output_frame /* i : frame length */ +) +{ + int16_t i, l_subfr; + FD_BWE_DEC_HANDLE hBWE_FD; + float ysynth[L_FRAME48k]; + float yerror[L_FRAME48k]; + float wtda_synth[2 * L_FRAME48k]; + float SWB_tenv[SWB_TENV]; + float SWB_fenv[SWB_FENV]; + int16_t L; + int16_t mode; + int16_t frica_flag = 0; + float fb_ener_adjust = 0.0f; + int16_t j = 0; + float ener_adjust_quan; + int16_t idxGain; + int16_t fb_band_begin; + + hBWE_FD = st->hBWE_FD; + + /*---------------------------------------------------------------------* + * SWB BWE decoding + *---------------------------------------------------------------------*/ + + if ( st->element_mode == IVAS_CPE_DFT && !use_cldfb_for_dft ) + { + /* todo - wtda() does not support L_FRAME length; thus temporarily resample the signal */ + /* todo - delay output[] by 1.25ms ? */ + lerp( output, ysynth, L_FRAME16k, st->L_frame ); + + /* windowing of the ACELP core synthesis */ + wtda( ysynth, wtda_synth, hBWE_FD->old_wtda_swb, ALDO_WINDOW, ALDO_WINDOW, /*st->L_frame*/ L_FRAME16k ); + + /* DCT of the ACELP core synthesis */ + direct_transform( wtda_synth, ysynth, 0, /*st->L_frame*/ L_FRAME16k, st->element_mode ); + } + else + { + /* windowing of the ACELP core synthesis */ + wtda( synth, wtda_synth, hBWE_FD->old_wtda_swb, ALDO_WINDOW, ALDO_WINDOW, output_frame ); + + /* DCT of the ACELP core synthesis */ + direct_transform( wtda_synth, ysynth, 0, output_frame, st->element_mode ); + } + + if ( !st->bfi ) + { + if ( st->bws_cnt > 0 ) + { + /* estimate parameters */ + mode = para_pred_bws( st, ysynth, SWB_fenv ); + } + else + { + /* de-quantization */ + mode = swb_bwe_gain_deq( st, ACELP_CORE, SWB_tenv, SWB_fenv, 0, -1 ); + } + + L = mode == TRANSIENT ? SWB_FENV_TRANS : SWB_FENV; + st->prev_ener_shb = 0.0f; + for ( i = 0; i < L; i++ ) + { + st->prev_ener_shb += SWB_fenv[i]; + } + st->prev_ener_shb /= L; + } + else + { + /* SHB FEC */ + if ( hBWE_FD->prev_mode != TRANSIENT ) + { + mode = hBWE_FD->prev_mode; + } + else + { + mode = NORMAL; + } + + mvr2r( hBWE_FD->prev_SWB_fenv, SWB_fenv, SWB_FENV ); + } + + /* reconstruction of MDCT spectrum of the error signal */ + set_f( yerror, 0, output_frame ); + + if ( st->L_frame == L_FRAME16k ) + { + SWB_BWE_decoding( ysynth, SWB_fenv, yerror, L_FRAME32k - 80, mode, &frica_flag, &hBWE_FD->prev_Energy, hBWE_FD->prev_SWB_fenv, &hBWE_FD->prev_L_swb_norm, st->tilt_wb, &hBWE_FD->Seed, 80, &hBWE_FD->prev_weight, st->extl, st->last_extl ); + } + else + { + SWB_BWE_decoding( ysynth, SWB_fenv, yerror, L_FRAME32k - 80, mode, &frica_flag, &hBWE_FD->prev_Energy, hBWE_FD->prev_SWB_fenv, &hBWE_FD->prev_L_swb_norm, st->tilt_wb, &hBWE_FD->Seed, 6, &hBWE_FD->prev_weight, st->extl, st->last_extl ); + } + + if ( hBWE_FD->prev_frica_flag == 1 && frica_flag == 0 ) + { + for ( i = 0; i < L_SUBFR; i++ ) + { + hBWE_FD->mem_imdct[i] *= 1.0f - i * 0.015625f; + } + + for ( ; i < output_frame; i++ ) + { + hBWE_FD->mem_imdct[i] = 0.0f; + } + } + + /* decode information */ + if ( st->extl == FB_BWE ) + { + if ( !st->bfi ) + { + idxGain = get_next_indice( st, NUM_BITS_FB_FRAMEGAIN ); + fb_ener_adjust = usdequant( idxGain, FB_GAIN_QLOW, FB_GAIN_QDELTA ); + } + else if ( st->bfi ) + { + fb_ener_adjust = hBWE_FD->prev_fb_ener_adjust; + } + + hBWE_FD->prev_fb_ener_adjust = fb_ener_adjust; + if ( mode == TRANSIENT ) + { + ener_adjust_quan = fb_ener_adjust; + } + else + { + if ( SWB_fenv[7] < 0.01f ) + { + ener_adjust_quan = 0.0f; + } + else + { + ener_adjust_quan = min( SWB_fenv[13] / SWB_fenv[7], 4.0f ); + } + } + + fb_band_begin = FB_BAND_BEGIN; + if ( st->L_frame == L_FRAME ) + { + fb_band_begin = FB_BAND_BEGIN_12k8; + } + + for ( i = fb_band_begin; i < fb_band_begin + DE_OFFSET1; i++ ) + { + yerror[i] = yerror[i - FB_BAND_WIDTH] * ( ( 1.0f - j * FB_GAIN_QDELTA ) * ener_adjust_quan + j * FB_GAIN_QDELTA * fb_ener_adjust ); + j++; + } + for ( ; i < FB_BAND_END; i++ ) + { + yerror[i] = yerror[i - FB_BAND_WIDTH] * fb_ener_adjust; + } + } + + /* iDCT of the error signal */ + inverse_transform( yerror, wtda_synth, 0, output_frame, -1, st->element_mode ); + + /* inverse windowing of the error signal */ + window_ola( wtda_synth, hb_synth, hBWE_FD->mem_imdct, output_frame, ALDO_WINDOW, ALDO_WINDOW, 0, 0, 0 ); + l_subfr = output_frame / 4; + + if ( mode == TRANSIENT ) + { + for ( i = 0; i < SWB_TENV; i++ ) + { + SWB_tenv[i] *= 0.8f; + } + + /* time envelope shaping when the current frame is TRANSIENT frame */ + time_envelop_shaping( hb_synth, SWB_tenv, output_frame ); + + hBWE_FD->prev_td_energy = SWB_tenv[3]; + } + else if ( frica_flag == 1 && hBWE_FD->prev_frica_flag == 0 ) + { + /* IVAS_fmToDo: synth[] is @internal_Fs!!! */ + time_reduce_pre_echo( synth, hb_synth, hBWE_FD->prev_td_energy, l_subfr ); + } + else + { + hBWE_FD->prev_td_energy = 0.0f; + for ( i = 0; i < l_subfr; i++ ) + { + hBWE_FD->prev_td_energy += hb_synth[3 * l_subfr + i] * hb_synth[3 * l_subfr + i]; + } + hBWE_FD->prev_td_energy = (float) sqrt( hBWE_FD->prev_td_energy / l_subfr ); + } + + if ( st->element_mode == IVAS_CPE_DFT && !use_cldfb_for_dft ) + { + /* add HB synth from hf_synth() */ + v_add( hb_synth, synth, hb_synth, output_frame ); + } + + hBWE_FD->prev_frica_flag = frica_flag; + hBWE_FD->prev_mode = mode; + + return; +} + +/*-------------------------------------------------------------------* + * fd_bwe_dec_init() + * + * Initialize FD BWE state structure at the decoder + *-------------------------------------------------------------------*/ + +void fd_bwe_dec_init( + FD_BWE_DEC_HANDLE hBWE_FD /* i/o: FD BWE data handle */ +) +{ + set_f( hBWE_FD->old_wtda_swb, 0, L_FRAME48k ); + set_f( hBWE_FD->old_syn_12k8_16k, 0, NS2SA( 16000, DELAY_FD_BWE_ENC_NS ) ); + hBWE_FD->prev_mode = NORMAL; + set_f( hBWE_FD->prev_SWB_fenv, 0, SWB_FENV ); + hBWE_FD->prev_Energy = 0.0f; + hBWE_FD->prev_L_swb_norm = 8; + hBWE_FD->Seed = 21211; + hBWE_FD->prev_frica_flag = 0; + set_f( hBWE_FD->mem_imdct, 0, L_FRAME48k ); + hBWE_FD->prev_td_energy = 0.0f; + hBWE_FD->prev_weight = 0.2f; + hBWE_FD->prev_flag = 0; + hBWE_FD->last_wb_bwe_ener = 0.0f; + hBWE_FD->prev_Energy_wb = 0.0f; + + hBWE_FD->mem_deemph_old_syn = 0.0f; + + hBWE_FD->prev_fb_ener_adjust = 0.0f; + + return; +} diff --git a/lib_dec/swb_bwe_dec_hr.c b/lib_dec/swb_bwe_dec_hr.c new file mode 100644 index 0000000000000000000000000000000000000000..065a24c6bdae55440cfbe0ecd140b65c3f76e72d --- /dev/null +++ b/lib_dec/swb_bwe_dec_hr.c @@ -0,0 +1,811 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * swb_bwe_dec_hr() + * + * HR SWB BWE decoder + *-------------------------------------------------------------------*/ + +void swb_bwe_dec_hr( + Decoder_State *st, /* i/o: decoder state structure */ + const float *syn_12k8_16k, /* i : ACELP core synthesis @16kHz */ + float *hb_synth, /* o : SHB synthesis */ + const int16_t output_frame, /* i : frame length */ + const int16_t unbits, /* i : number of core unused bits */ + const float pitch_buf[] /* i : pitch buffer */ +) +{ + int16_t i, j, k, nBits, nBits_total, nBits_block, Nsv, Nsv2, width_noncoded; + int16_t is_transient, tmpS, incr, IsTransient, pos; + FD_BWE_DEC_HANDLE hBWE_FD; + HR_BWE_DEC_HANDLE hBWE_FD_HR; + int16_t x_norm[NSV_MAX * ( WIDTH_BAND + 1 )], x_norm1[NSV_MAX * ( WIDTH_BAND + 1 )]; + float t_audio[L_FRAME48k], t_audio_tmp[L_FRAME48k]; + float gain = 0.0f, gain2, en_band[N_BANDS_BWE_HR]; + int16_t ind1, ind2; + float EnergyLT, Energy; + int16_t nq[NSV_MAX], nq2[NSV_MAX], nq_tmp[NSV_MAX]; + float tilt_wb, min_env, max_env; + float tmpF, tmp2, pitch, alpha; + float en_noncoded; + float env = 0.0f; + + hBWE_FD = st->hBWE_FD; + hBWE_FD_HR = st->hBWE_FD_HR; + + /*---------------------------------------------------------------------* + * initializations + *---------------------------------------------------------------------*/ + + set_f( t_audio, 0.0f, output_frame ); + + hBWE_FD_HR->bwe_highrate_seed = (int16_t) ( (int16_t) ( pitch_buf[0] * 64.0f ) * (int16_t) ( pitch_buf[3] * 64.0f ) ); + + ind2 = 0; /* only to suppress warnings */ + Nsv2 = 0; /* only to suppress warnings */ + gain2 = 0; /* only to suppress warnings */ + + /* reset memories in case that last frame was a different technology */ + if ( st->last_core == HQ_CORE || st->last_extl != st->extl ) + { + set_f( hBWE_FD->old_wtda_swb, 0, L_FRAME48k ); + } + + /* calculate SWB BWE bit-budget */ + nBits = (int16_t) ( st->extl_brate ) / FRAMES_PER_SEC + unbits; + nBits_total = nBits; + + /*---------------------------------------------------------------------* + * calculate tilt of the core synthesis + *---------------------------------------------------------------------*/ + + calc_tilt_bwe( syn_12k8_16k, &tilt_wb, L_FRAME16k ); + pitch = sum_f( pitch_buf, NB_SUBFR16k ) + EPSILON; + + /*---------------------------------------------------------------------* + * FEC, or good frame decoding + *---------------------------------------------------------------------*/ + + if ( st->bfi ) + { + is_transient = hBWE_FD_HR->old_is_transient_hr_bwe; + + /* Replication of the last spectrum, with an attenuation */ + if ( ( st->clas_dec == VOICED_CLAS || st->clas_dec == INACTIVE_CLAS ) && st->nbLostCmpt <= 3 ) + { + alpha = 0.8f; + } + else if ( is_transient ) + { + alpha = 0.15f; + } + else + { + alpha = 0.3f; + } + + if ( is_transient ) + { + /* set BWE spectrum length */ + if ( output_frame == L_FRAME32k ) + { + tmpS = L_FRAME32k / NUM_TIME_SWITCHING_BLOCKS - NUM_TRANS_START_FREQ_COEF; + } + else /* output_frame == L_FRAME48k */ + { + tmpS = ( 2 * END_FREQ_BWE_FULL_FB / FRAMES_PER_SEC ) / NUM_TIME_SWITCHING_BLOCKS - NUM_TRANS_START_FREQ_COEF; + } + + /* reconstruct */ + for ( k = 0; k < NUM_TIME_SWITCHING_BLOCKS; k++ ) + { + for ( i = 0; i < tmpS; i++ ) + { + t_audio[NUM_TRANS_START_FREQ_COEF + k * output_frame / NUM_TIME_SWITCHING_BLOCKS + i] = alpha * hBWE_FD_HR->t_audio_prev[i + k * tmpS]; + } + /* save transform coefficients for the next frame (needed in case of frame erasures) */ + mvr2r( t_audio + NUM_TRANS_START_FREQ_COEF + k * output_frame / NUM_TIME_SWITCHING_BLOCKS, hBWE_FD_HR->t_audio_prev + k * tmpS, tmpS ); + } + } + else + { + /* set BWE spectrum length */ + if ( output_frame == L_FRAME32k ) + { + tmpS = L_FRAME32k - NUM_NONTRANS_START_FREQ_COEF; + } + else /* output_frame == L_FRAME48k */ + { + tmpS = 2 * END_FREQ_BWE_FULL_FB / FRAMES_PER_SEC - NUM_NONTRANS_START_FREQ_COEF; + } + + /* reconstruct */ + for ( i = 0; i < tmpS; i++ ) + { + t_audio[NUM_NONTRANS_START_FREQ_COEF + i] = alpha * hBWE_FD_HR->t_audio_prev[i]; + } + /* Save transform coefficients for the next frame (needed in case of frame erasures) */ + mvr2r( t_audio + NUM_NONTRANS_START_FREQ_COEF, hBWE_FD_HR->t_audio_prev, tmpS ); + } + + hBWE_FD_HR->mem_EnergyLT *= alpha; + gain = (float) ( 2.0f * sqrt( hBWE_FD_HR->mem_EnergyLT / output_frame ) ); + env = 1.0f; + } + else + { + /*---------------------------------------------------------------------* + * get transient frame flag + *---------------------------------------------------------------------*/ + + is_transient = get_next_indice( st, 1 ); + + if ( is_transient ) + { + nBits = -1; /* is_transient flag */ + nBits_block = nBits_total / NUM_TIME_SWITCHING_BLOCKS; + nBits += nBits_total % NUM_TIME_SWITCHING_BLOCKS; + + /* set width of noncoded (blind estimated) spectrum */ + if ( st->extl == SWB_BWE_HIGHRATE || output_frame == L_FRAME32k ) + { + width_noncoded = L_FRAME32k / NUM_TIME_SWITCHING_BLOCKS - NUM_TRANS_END_FREQ_COEF; + tmpS = L_FRAME32k / NUM_TIME_SWITCHING_BLOCKS - NUM_TRANS_END_FREQ_COEF_EFF; + } + else /* st->extl == FB_BWE_HIGHRATE */ + { + width_noncoded = ( 2 * END_FREQ_BWE_FULL_FB / FRAMES_PER_SEC ) / NUM_TIME_SWITCHING_BLOCKS - NUM_TRANS_END_FREQ_COEF; + tmpS = ( 2 * END_FREQ_BWE_FULL_FB / FRAMES_PER_SEC ) / NUM_TIME_SWITCHING_BLOCKS - NUM_TRANS_END_FREQ_COEF_EFF; + } + + /*---------------------------------------------------------------------* + * transient frames: processing in blocks (subframes) + *---------------------------------------------------------------------*/ + + for ( k = 0; k < NUM_TIME_SWITCHING_BLOCKS; k++ ) + { + nBits += nBits_block; + + /*---------------------------------------------------------------------* + * global gain and envelope decoding + *---------------------------------------------------------------------*/ + + /* get global gain */ + ind1 = get_next_indice( st, NBITS_GLOB_GAIN_BWE_HR ); + gain = gain_dequant( ind1, MIN_GLOB_GAIN_BWE_HR, MAX_GLOB_GAIN_BWE_HR, NBITS_GLOB_GAIN_BWE_HR ); + nBits -= NBITS_GLOB_GAIN_BWE_HR; + + /* get energy per band */ + if ( k == 0 ) + { + ind1 = get_next_indice( st, NBITS_ENVELOPE_BWE_HR_TR ); + ind2 = ind1; + nBits -= NBITS_ENVELOPE_BWE_HR_TR; + } + else + { + if ( ind2 < 8 ) + { + ind1 = get_next_indice( st, NBITS_ENVELOPE_BWE_HR_TR - 1 ); + } + else + { + ind1 = get_next_indice( st, NBITS_ENVELOPE_BWE_HR_TR - 1 ) + NUM_ENVLOPE_CODE_HR_TR2; + } + nBits -= ( NBITS_ENVELOPE_BWE_HR_TR - 1 ); + } + + en_band[0] = swb_hr_env_code3[2 * ind1]; + en_band[1] = swb_hr_env_code3[2 * ind1 + 1]; + env = 0.5f * ( en_band[0] + en_band[1] ); + + /*---------------------------------------------------------------------* + * estimate energy of noncoded spectrum (14.4-20kHz) + *---------------------------------------------------------------------*/ + + en_noncoded = en_band[N_BANDS_TRANS_BWE_HR - 1]; + + if ( st->extl == FB_BWE_HIGHRATE ) + { + ind1 = get_next_indice( st, NBITS_HF_GAIN_BWE_HR ); + nBits -= NBITS_HF_GAIN_BWE_HR; + + if ( ind1 == 1 ) + { + en_noncoded *= BWE_HR_TRANS_EN_LIMIT1; + } + else if ( ind1 == 2 ) + { + en_noncoded *= BWE_HR_TRANS_EN_LIMIT2; + } + else if ( ind1 == 3 ) + { + en_noncoded *= BWE_HR_TRANS_EN_LIMIT3; + } + } + + /*---------------------------------------------------------------------* + * AVQ decoding (dequantize normalized spectrum) + *---------------------------------------------------------------------*/ + + Nsv = ( NUM_TRANS_END_FREQ_COEF - NUM_TRANS_START_FREQ_COEF ) / WIDTH_BAND; + AVQ_demuxdec( st, x_norm, &nBits, Nsv, nq, 0, Nsv - 1 ); + for ( i = 0; i < Nsv * WIDTH_BAND; i++ ) + { + t_audio[k * output_frame / NUM_TIME_SWITCHING_BLOCKS + NUM_TRANS_START_FREQ_COEF + i] = (float) ( x_norm[i] ); + } + + /* apply noise-fill */ + swb_hr_noise_fill( is_transient, NUM_TRANS_START_FREQ_COEF, NUM_TRANS_END_FREQ_COEF, tilt_wb, pitch, nq, Nsv, &hBWE_FD_HR->bwe_highrate_seed, t_audio + NUM_TRANS_START_FREQ_COEF + k * output_frame / NUM_TIME_SWITCHING_BLOCKS ); + + /*---------------------------------------------------------------------* + * reconstruction + *---------------------------------------------------------------------*/ + + /* reconstruct 14-16(20) kHz spectrum */ + for ( j = 0; j < tmpS; j++ ) + { + t_audio[k * output_frame / NUM_TIME_SWITCHING_BLOCKS + NUM_TRANS_END_FREQ_COEF_EFF + j] = 0.5f * t_audio[k * output_frame / NUM_TIME_SWITCHING_BLOCKS + NUM_TRANS_END_FREQ_COEF_EFF - tmpS + j]; + } + + /* envelope denormalization */ + for ( i = 0; i < N_BANDS_TRANS_BWE_HR; i++ ) + { + for ( j = 0; j < WIDTH_TRANS_FREQ_COEF; j++ ) + { + t_audio[k * output_frame / NUM_TIME_SWITCHING_BLOCKS + NUM_TRANS_START_FREQ_COEF + i * WIDTH_TRANS_FREQ_COEF + j] *= en_band[i]; + } + } + + /* envelope denormalization of 14.4-16(20) kHz spectrum */ + for ( j = tmpS - width_noncoded; j < tmpS; j++ ) + { + t_audio[k * output_frame / NUM_TIME_SWITCHING_BLOCKS + NUM_TRANS_END_FREQ_COEF_EFF + j] *= en_noncoded; + } + + /* overlap region */ + if ( output_frame == L_FRAME48k ) + { + for ( i = 0; i < NSV_OVERLAP * WIDTH_BAND / NUM_TIME_SWITCHING_BLOCKS; i++ ) + { + t_audio[k * output_frame / NUM_TIME_SWITCHING_BLOCKS + NUM_TRANS_START_FREQ_COEF + i] *= overlap_coefs_48kHz[i * 4]; + } + } + else + { + for ( i = 0; i < NSV_OVERLAP * WIDTH_BAND / NUM_TIME_SWITCHING_BLOCKS; i++ ) + { + t_audio[k * output_frame / NUM_TIME_SWITCHING_BLOCKS + NUM_TRANS_START_FREQ_COEF + i] *= overlap_coefs[i * 4]; + } + } + + /* apply global gain */ + for ( i = 0; i < WIDTH_TRANS_FREQ_COEF * N_BANDS_TRANS_BWE_HR + width_noncoded; i++ ) + { + t_audio[NUM_TRANS_START_FREQ_COEF + k * output_frame / NUM_TIME_SWITCHING_BLOCKS + i] *= gain; + } + + /* save transform coefficients for the next frame (needed in case of frame erasures) */ + if ( output_frame == L_FRAME32k ) + { + mvr2r( t_audio + NUM_TRANS_START_FREQ_COEF + k * output_frame / NUM_TIME_SWITCHING_BLOCKS, hBWE_FD_HR->t_audio_prev + k * ( L_FRAME32k / NUM_TIME_SWITCHING_BLOCKS - NUM_TRANS_START_FREQ_COEF ), L_FRAME32k / NUM_TIME_SWITCHING_BLOCKS - NUM_TRANS_START_FREQ_COEF ); + } + else /* output_frame == L_FRAME48k */ + { + mvr2r( t_audio + NUM_TRANS_START_FREQ_COEF + k * output_frame / NUM_TIME_SWITCHING_BLOCKS, hBWE_FD_HR->t_audio_prev + k * ( ( 2 * END_FREQ_BWE_FULL_FB / FRAMES_PER_SEC ) / NUM_TIME_SWITCHING_BLOCKS - NUM_TRANS_START_FREQ_COEF ), ( 2 * END_FREQ_BWE_FULL_FB / FRAMES_PER_SEC ) / NUM_TIME_SWITCHING_BLOCKS - NUM_TRANS_START_FREQ_COEF ); + } + + /* attenuate HFs in case of band-width switching */ + if ( st->bws_cnt1 > 0 ) + { + if ( output_frame == L_FRAME32k ) + { + j = L_FRAME32k / NUM_TIME_SWITCHING_BLOCKS - NUM_TRANS_START_FREQ_COEF; + } + else /* output_frame == L_FRAME48k */ + { + j = ( 2 * END_FREQ_BWE_FULL_FB / FRAMES_PER_SEC ) / NUM_TIME_SWITCHING_BLOCKS - NUM_TRANS_START_FREQ_COEF; + } + + for ( i = 0; i < j; i++ ) + { + t_audio[NUM_TRANS_START_FREQ_COEF + k * output_frame / NUM_TIME_SWITCHING_BLOCKS + i] *= (float) st->bws_cnt1 / (float) N_NS2W_FRAMES; + } + } + } + } + else /* !is_transient */ + { + /* subtract one bit for is_transient flag */ + nBits--; + + /*---------------------------------------------------------------------* + * global gain and envelope decoding + *---------------------------------------------------------------------*/ + + /* get global gain */ + ind1 = get_next_indice( st, NBITS_GLOB_GAIN_BWE_HR ); + gain = gain_dequant( ind1, MIN_GLOB_GAIN_BWE_HR, MAX_GLOB_GAIN_BWE_HR, NBITS_GLOB_GAIN_BWE_HR ); + + /* get energy per band */ + ind1 = get_next_indice( st, NBITS_ENVELOPE_BWE_HR1 ); + ind2 = get_next_indice( st, NBITS_ENVELOPE_BWE_HR2 ); + + en_band[0] = swb_hr_env_code1[2 * ind1]; + en_band[1] = swb_hr_env_code1[2 * ind1 + 1]; + en_band[2] = swb_hr_env_code2[2 * ind2]; + en_band[3] = swb_hr_env_code2[2 * ind2 + 1]; + env = 0.25f * ( en_band[0] + en_band[1] + en_band[2] + en_band[3] ); + + /*---------------------------------------------------------------------* + * choose sub-bands to be dequantized + *---------------------------------------------------------------------*/ + + /* find the subband with the min envelope */ + pos = 0; + min_env = en_band[0]; + max_env = en_band[0]; + for ( j = 1; j < N_BANDS_BWE_HR; j++ ) + { + if ( en_band[j] < min_env ) + { + pos = j; + min_env = en_band[j]; + } + if ( en_band[j] > max_env ) + { + max_env = en_band[j]; + } + } + + /* decide the spectrum to be dequantized */ + if ( nBits_total > NBITS_THRESH_BWE_HR ) + { + i = NUM_NONTRANS_END_FREQ_COEF - NUM_NONTRANS_START_FREQ_COEF; + } + else + { + i = NUM_NONTRANS_END_FREQ_COEF - NUM_NONTRANS_START_FREQ_COEF - 64 - 8 * ( pos % 2 ); + } + + nBits -= NBITS_GLOB_GAIN_BWE_HR + NBITS_ENVELOPE_BWE_HR1 + NBITS_ENVELOPE_BWE_HR2; + + /*---------------------------------------------------------------------* + * estimate energy of noncoded spectrum (14.4-20kHz) + *---------------------------------------------------------------------*/ + + en_noncoded = 0.5f * min_env; + + if ( st->extl == FB_BWE_HIGHRATE ) + { + ind1 = get_next_indice( st, NBITS_HF_GAIN_BWE_HR ); + nBits -= NBITS_HF_GAIN_BWE_HR; + + if ( ind1 == 1 ) + { + en_noncoded *= BWE_HR_NONTRANS_EN_LIMIT1; + } + else if ( ind1 == 2 ) + { + en_noncoded *= 2.0f * BWE_HR_NONTRANS_EN_LIMIT2; + } + else if ( ind1 == 3 ) + { + en_noncoded *= 2.0f * BWE_HR_NONTRANS_EN_LIMIT3; + } + } + + /*---------------------------------------------------------------------* + * AVQ decoding (dequantize normalized spectrum) + *---------------------------------------------------------------------*/ + + Nsv = i / WIDTH_BAND; + AVQ_demuxdec( st, x_norm, &nBits, Nsv, nq, 0, Nsv - 1 ); + /*---------------------------------------------------------------------* + * second stage decoding + *---------------------------------------------------------------------*/ + + if ( nBits >= 9 + NBITS_GLOB_GAIN_BWE_HR && sum_s( nq, Nsv ) > 0 ) + { + ind1 = get_next_indice( st, NBITS_GLOB_GAIN_BWE_HR ); + gain2 = gain_dequant( ind1, MIN_GLOB_GAIN_BWE_HR, MAX_GLOB_GAIN_BWE_HR, NBITS_GLOB_GAIN_BWE_HR ); + gain2 *= 0.0625f; + + /* calculate the number of subbands according to the rest bits */ + if ( nBits > 396 ) + { + Nsv2 = 33; + } + else + { + Nsv2 = nBits / 12; + } + + nBits -= NBITS_GLOB_GAIN_BWE_HR; + AVQ_demuxdec( st, x_norm1, &nBits, Nsv2, nq2, 0, Nsv2 - 1 ); + } + + /*---------------------------------------------------------------------* + * dequantization + *---------------------------------------------------------------------*/ + + for ( i = 0; i < Nsv * WIDTH_BAND; i++ ) + { + t_audio_tmp[i] = (float) ( x_norm[i] ); + } + + mvs2s( nq, nq_tmp, Nsv ); + if ( Nsv2 > Nsv ) + { + /* Safety check, happens rarely */ + set_s( nq_tmp + Nsv, 0, Nsv2 - Nsv ); + } + + k = 0; + incr = 0; + for ( i = 0; i < Nsv; i++ ) + { + if ( nq[i] == 0 && incr < Nsv2 ) + { + for ( j = 0; j < WIDTH_BAND; j++ ) + { + t_audio_tmp[i * WIDTH_BAND + j] = gain2 * x_norm1[k++]; + } + nq[i] += nq2[incr++]; + } + } + + for ( i = 0; incr < Nsv2; i++ ) + { + /* safety check, happens rarely */ + if ( i >= Nsv2 ) + { + break; + } + + if ( nq_tmp[i] != 0 ) + { + for ( j = 0; j < WIDTH_BAND; j++ ) + { + t_audio_tmp[i * WIDTH_BAND + j] += gain2 * x_norm1[k++]; + } + nq[i] += nq2[incr++]; + } + } + + /*---------------------------------------------------------------------* + * reorder the decoded spectrum + *---------------------------------------------------------------------*/ + + if ( nBits_total > NBITS_THRESH_BWE_HR ) + { + mvr2r( t_audio_tmp, t_audio + NUM_NONTRANS_START_FREQ_COEF, NUM_NONTRANS_END_FREQ_COEF - NUM_NONTRANS_START_FREQ_COEF ); + } + else + { + ind1 = ( pos * 64 + pos / 2 * WIDTH_BAND ); + mvr2r( t_audio_tmp, t_audio + NUM_NONTRANS_START_FREQ_COEF, ind1 ); + + ind2 = ( ( pos + 1 ) * 64 + ( pos + 1 ) / 2 * WIDTH_BAND ); + mvr2r( t_audio_tmp + ind1, t_audio + NUM_NONTRANS_START_FREQ_COEF + ind2, NUM_NONTRANS_END_FREQ_COEF - NUM_NONTRANS_START_FREQ_COEF - ind2 ); + + /* reconstruct non-encoded subband */ + if ( pos == 3 ) + { + mvr2r( t_audio + NUM_NONTRANS_START_FREQ_COEF + 128, t_audio + NUM_NONTRANS_START_FREQ_COEF + 200, 72 ); + + mvs2s( nq + 16, nq + 25, 9 ); + } + else + { + pos %= 2; + mvr2r( t_audio + NUM_NONTRANS_START_FREQ_COEF + ind2, t_audio + NUM_NONTRANS_START_FREQ_COEF + ind1, 64 + pos * WIDTH_BAND ); + ind1 /= WIDTH_BAND; + ind2 /= WIDTH_BAND; + + j = 0; + for ( i = Nsv - 1; i >= ind1; i-- ) + { + nq[33 - j++] = nq[i]; + } + + mvs2s( nq + ind2, nq + ind1, WIDTH_BAND + pos ); + } + } + + /* apply noise-fill */ + if ( nBits < 200 ) + { + swb_hr_noise_fill( is_transient, NUM_NONTRANS_START_FREQ_COEF, NUM_NONTRANS_END_FREQ_COEF, tilt_wb, pitch, nq, Nsv, &hBWE_FD_HR->bwe_highrate_seed, t_audio + NUM_NONTRANS_START_FREQ_COEF ); + } + + /*---------------------------------------------------------------------* + * reconstruction + *---------------------------------------------------------------------*/ + + /* smoothing 12.6-12.8kHz */ + if ( pos == 3 && nBits_total <= 400 ) + { + tmpF = sum2_f( t_audio + NUM_NONTRANS_START_FREQ_COEF + 200 - WIDTH_BAND, WIDTH_BAND ) + EPSILON; + tmp2 = sum2_f( t_audio + NUM_NONTRANS_START_FREQ_COEF + 200, WIDTH_BAND ) + EPSILON; + tmpF = (float) sqrt( tmpF / tmp2 ); + for ( i = 0; i < WIDTH_BAND; i++ ) + { + t_audio[NUM_NONTRANS_START_FREQ_COEF + 200 + i] *= ( ( 1.0f - i / (float) WIDTH_BAND ) * tmpF + i / (float) WIDTH_BAND ); + } + } + + /* reconstruct 14.4-16(20) kHz spectrum */ + if ( st->extl == SWB_BWE_HIGHRATE || output_frame == L_FRAME32k ) + { + width_noncoded = L_FRAME32k - NUM_NONTRANS_END_FREQ_COEF; + } + else /* st->extl == FB_BWE_HIGHRATE */ + { + width_noncoded = 2 * END_FREQ_BWE_FULL_FB / FRAMES_PER_SEC - NUM_NONTRANS_END_FREQ_COEF; + } + mvr2r( t_audio + NUM_NONTRANS_END_FREQ_COEF - width_noncoded, t_audio + NUM_NONTRANS_END_FREQ_COEF, width_noncoded ); + + /* smoothing 14.4-14.8kHz */ + tmpF = sum2_f( t_audio + NUM_NONTRANS_END_FREQ_COEF - WIDTH_BAND, WIDTH_BAND ) + EPSILON; + tmp2 = sum2_f( t_audio + NUM_NONTRANS_END_FREQ_COEF, WIDTH_BAND ) + EPSILON; + tmpF = (float) sqrt( tmpF / tmp2 ); + for ( i = 0; i < WIDTH_BAND; i++ ) + { + t_audio[NUM_NONTRANS_END_FREQ_COEF + i] *= tmpF; + } + + /* envelope denormalization */ + for ( i = 0; i < N_BANDS_BWE_HR; i++ ) + { + for ( j = 0; j < WIDTH_NONTRANS_FREQ_COEF; j++ ) + { + t_audio[NUM_NONTRANS_START_FREQ_COEF + i * WIDTH_NONTRANS_FREQ_COEF + j] *= en_band[i]; + } + } + + /* equalize 14.4-16(20) kHz spectrum */ + tmpF = max_env / min_env; + if ( st->extl == SWB_BWE_HIGHRATE || tmpF < 2.2f ) + { + for ( j = 0; j < WIDTH_BAND; j++ ) + { + t_audio[NUM_NONTRANS_END_FREQ_COEF + j] *= ( ( 1.0f - j / (float) WIDTH_BAND ) * en_band[3] + ( j / (float) WIDTH_BAND ) * en_noncoded ); + } + + for ( j = WIDTH_BAND; j < width_noncoded; j++ ) + { + t_audio[NUM_NONTRANS_END_FREQ_COEF + j] *= en_noncoded; + } + } + else + { + if ( output_frame == L_FRAME48k ) + { + tmpS = width_noncoded - 2 * WIDTH_NONTRANS_FREQ_COEF; + } + else + { + tmpS = L_FRAME32k - NUM_NONTRANS_END_FREQ_COEF; + } + + k = 0; + for ( j = 0; j < tmpS; j++ ) + { + t_audio[NUM_NONTRANS_END_FREQ_COEF + j] *= 2.2f * en_noncoded * ( 1 - (float) k / (float) 160 ); + k++; + } + + k = 0; + for ( ; j < width_noncoded; j++ ) + { + t_audio[NUM_NONTRANS_END_FREQ_COEF + j] *= 0.65f * en_noncoded * ( 1 - (float) k / (float) 320 ); + k++; + } + } + + /* overlap region */ + if ( output_frame == L_FRAME48k ) + { + for ( i = 0; i < NSV_OVERLAP * WIDTH_BAND; i++ ) + { + t_audio[NUM_NONTRANS_START_FREQ_COEF + i] *= overlap_coefs_48kHz[i]; + } + } + else + { + for ( i = 0; i < NSV_OVERLAP * WIDTH_BAND; i++ ) + { + t_audio[NUM_NONTRANS_START_FREQ_COEF + i] *= overlap_coefs[i]; + } + } + + /* apply global gain */ + if ( nBits_total <= NBITS_THRESH_BWE_HR ) + { + gain *= 0.85f; + } + + for ( i = 0; i < WIDTH_NONTRANS_FREQ_COEF * N_BANDS_BWE_HR + width_noncoded; i++ ) + { + t_audio[NUM_NONTRANS_START_FREQ_COEF + i] *= gain; + } + + /* save transform coefficients for the next frame (needed in case of frame erasures) */ + if ( output_frame == L_FRAME32k ) + { + mvr2r( t_audio + NUM_NONTRANS_START_FREQ_COEF, hBWE_FD_HR->t_audio_prev, L_FRAME32k - NUM_NONTRANS_START_FREQ_COEF ); + } + else /* output_frame == L_FRAME48k */ + { + mvr2r( t_audio + NUM_NONTRANS_START_FREQ_COEF, hBWE_FD_HR->t_audio_prev, 2 * END_FREQ_BWE_FULL_FB / FRAMES_PER_SEC - NUM_NONTRANS_START_FREQ_COEF ); + } + + /* attenuate HFs in case of band-width switching */ + if ( st->bws_cnt1 > 0 ) + { + if ( output_frame == L_FRAME32k ) + { + j = L_FRAME32k - NUM_NONTRANS_START_FREQ_COEF; + } + else /* output_frame == L_FRAME48k */ + { + j = 2 * END_FREQ_BWE_FULL_FB / FRAMES_PER_SEC - NUM_NONTRANS_START_FREQ_COEF; + } + + for ( i = 0; i < j; i++ ) + { + t_audio[NUM_NONTRANS_START_FREQ_COEF + i] *= (float) st->bws_cnt1 / (float) N_NS2W_FRAMES; + } + } + } + } + + st->prev_ener_shb = gain * env; + for ( i = 0; i < SWB_FENV; i++ ) + { + hBWE_FD->prev_SWB_fenv[i] = gain * env; + } + + /*---------------------------------------------------------------------* + * iOLA and iMDCT + *---------------------------------------------------------------------*/ + + inverse_transform( t_audio, t_audio_tmp, is_transient, output_frame, output_frame, st->element_mode ); + + window_ola( t_audio_tmp, hb_synth, hBWE_FD->old_wtda_swb, output_frame, ALDO_WINDOW, ALDO_WINDOW, 0, 0, 0 ); + + /*---------------------------------------------------------------------* + * final adjustments + *---------------------------------------------------------------------*/ + + if ( !st->bfi ) + { + IsTransient = 0; + EnergyLT = hBWE_FD_HR->mem_EnergyLT; + pos = 0; + for ( j = 0; j < 4; j++ ) + { + Energy = sum2_f( hb_synth + j * ( output_frame / 4 ), output_frame / 4 ) + EPSILON; + if ( Energy > 12.5f * EnergyLT ) + { + IsTransient = 1; + pos = j; + } + + EnergyLT = 0.75f * EnergyLT + 0.25f * Energy; + } + + if ( IsTransient == 1 && pos > 0 && tilt_wb < 3.0f && pitch > 500 ) + { + Nsv = pos * ( output_frame / 4 ); + Energy = sum2_f( hb_synth, Nsv ) + EPSILON; + if ( st->last_extl != st->extl ) + { + hBWE_FD_HR->mem_EnergyLT = Energy; + } + gain = (float) sqrt( pos * hBWE_FD_HR->mem_EnergyLT / Energy ); + + gain *= 0.2f; + for ( i = 0; i < Nsv; i++ ) + { + hb_synth[i] *= gain; + } + + alpha = (float) WIDTH_BAND / output_frame; + for ( i = 0; i < output_frame / WIDTH_BAND; i++ ) + { + hb_synth[i + Nsv] *= ( ( 1.0f - i * alpha ) * gain + i * alpha ); + } + } + + hBWE_FD_HR->mem_EnergyLT = EnergyLT; + hBWE_FD_HR->old_is_transient_hr_bwe = is_transient; + } + + /* post-processing in case of TD/FD switching */ + if ( st->last_core == HQ_CORE || st->last_extl != st->extl ) + { + if ( tilt_wb < 3.0f ) + { + gain = td_postprocess( hb_synth, output_frame, st->last_extl ); + + for ( i = 0; i < output_frame; i++ ) + { + hBWE_FD->old_wtda_swb[i] *= gain; + } + + tmpS = L_FRAME32k - NUM_NONTRANS_START_FREQ_COEF; + if ( output_frame == L_FRAME48k ) + { + tmpS = 2 * END_FREQ_BWE_FULL_FB / FRAMES_PER_SEC - NUM_NONTRANS_START_FREQ_COEF; + } + + for ( i = 0; i < tmpS; i++ ) + { + hBWE_FD_HR->t_audio_prev[i] *= gain; + } + } + } + + return; +} + +/*-------------------------------------------------------------------* + * hr_bwe_dec_init() + * + * Initialize HR BWE state structure at the decoder + *-------------------------------------------------------------------*/ + +void hr_bwe_dec_init( + HR_BWE_DEC_HANDLE hBWE_FD_HR /* i/o: HR BWE data handle */ +) +{ + set_f( hBWE_FD_HR->t_audio_prev, 0, 2 * END_FREQ_BWE_FULL_FB / FRAMES_PER_SEC - NUM_NONTRANS_START_FREQ_COEF ); + hBWE_FD_HR->old_is_transient_hr_bwe = 0; + hBWE_FD_HR->bwe_highrate_seed = 12345; + hBWE_FD_HR->mem_EnergyLT = 0.0f; + + return; +} diff --git a/lib_dec/swb_bwe_dec_lr.c b/lib_dec/swb_bwe_dec_lr.c new file mode 100644 index 0000000000000000000000000000000000000000..7953ee5d9417cf7c6c3ebfea507b3e4efaff0c01 --- /dev/null +++ b/lib_dec/swb_bwe_dec_lr.c @@ -0,0 +1,306 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "rom_com.h" +#include "stat_com.h" +#include "wmc_auto.h" + + +/*-------------------------------------------------------------------* + * DecodeSWBGenericParameters() + * + * Decoding of generic subband coding parameters + *-------------------------------------------------------------------*/ + +static void DecodeSWBGenericParameters( + Decoder_State *st, /* i/o: decoder state structure */ + int16_t *lagIndices, /* o : lowband index for each subband */ + const int16_t nBands_search, /* i : number of subbnads for SSearch */ + const int16_t BANDS, /* i : total number of subbands per frame */ + const int16_t *p2a_flags, /* i : HF tonal flag */ + const int16_t hq_swb_clas /* i : mode of operation HQ_NORMAL or HQ_HARMONIC */ +) +{ + int16_t sb; + + /* lag index for each subband (except last two) */ + for ( sb = 0; sb < nBands_search; sb++ ) + { + if ( hq_swb_clas == HQ_HARMONIC ) + { + lagIndices[sb] = get_next_indice( st, bits_lagIndices_mode0_Har[sb] ); + } + else + { + if ( p2a_flags[BANDS - NB_SWB_SUBBANDS + sb] == 0 ) + { + lagIndices[sb] = get_next_indice( st, bits_lagIndices_modeNormal[sb] ); + } + else + { + lagIndices[sb] = 0; + } + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * DecodeSWBSubbands() + * + * Main routine for generic SWB coding + * + * High-frequency subbands are replicated based on the lowband signal using a lowband index denoting + * the selected lowband subband as well as linear and logarithmic domain gains + *-------------------------------------------------------------------*/ + +static void DecodeSWBSubbands( + Decoder_State *st, /* i/o: decoder state structure */ + HQ_DEC_HANDLE hHQ_core, /* i/o: HQ decoder handle */ + float *spectra, /* i/o: MDCT domain spectrum */ + const int16_t fLenLow, /* i : lowband length */ + const int16_t fLenHigh, /* i : highband length */ + const int16_t nBands, /* i : number of subbands */ + const int16_t *sbWidth, /* i : subband lengths */ + int16_t *lagIndices, + float *lagGains, /* i : first gain for each subband */ + int16_t BANDS, /* i : number subbands per frame */ + int16_t *band_start, /* i : band start of each SB */ + int16_t *band_end, /* i : band end of each SB */ + float *band_energy, /* i : band energy of each SB */ + int16_t *p2a_flags, /* i : HF tonal indicator */ + const int16_t hqswb_clas, /* i : class information */ + const int16_t har_bands, /* i : number of LF harmonic bands */ + const int16_t *subband_search_offset, + int16_t *prev_frm_hfe2, + int16_t *prev_stab_hfe2, + int16_t band_width[], /* i : subband band widths */ + const int16_t *subband_offsets, /* i : subband offsets for sparse filling */ + const float spectra_ni[], /* i : core coder with sparseness filled */ + int16_t *ni_seed /* i/o: random seed for search buffer NI */ +) +{ + int16_t i; + int16_t k; + float sspectra[L_FRAME32k]; + float sspectra_ni[L_FRAME32k], sspectra_diff[L_FRAME32k], th_g[NB_SWB_SUBBANDS]; + float ss_min = 1.0f, g, be_tonal[SWB_HAR_RAN1], xSynth_har[L_FRAME32k]; + GainItem pk_sf[(NB_SWB_SUBBANDS) *8]; + int16_t lagIndices_real[NB_SWB_SUBBANDS]; + int16_t pul_res[NB_SWB_SUBBANDS], imin; + int16_t har_freq_est1 = 0; + int16_t har_freq_est2 = 0; + int16_t flag_dis = 1; + int16_t pos_max_hfe2 = 0; + + set_s( pul_res, 0, NB_SWB_SUBBANDS ); + set_f( xSynth_har, 0.0f, fLenHigh ); + + + if ( hqswb_clas == HQ_HARMONIC ) + { + /* Harmonic Structure analysis */ + pos_max_hfe2 = har_est( spectra, fLenLow, &har_freq_est1, &har_freq_est2, &flag_dis, prev_frm_hfe2, subband_search_offset, sbWidth, prev_stab_hfe2 ); + /* Spectrum normalization for the corecoder */ + noise_extr_corcod( spectra, spectra_ni, sspectra, sspectra_diff, sspectra_ni, fLenLow, hHQ_core->prev_hqswb_clas, &hHQ_core->prev_ni_ratio ); + /* Harmonic Structure analysis */ + + if ( flag_dis == 0 ) + { + if ( har_freq_est2 != SWB_HAR_RAN1 || har_freq_est2 != *prev_frm_hfe2 ) + { + har_freq_est2 += lagIndices[0]; + } + } + /*Generate HF noise*/ + genhf_noise( sspectra_diff, xSynth_har, sspectra, BANDS, har_bands, har_freq_est2, pos_max_hfe2, pul_res, pk_sf, fLenLow, fLenHigh, sbWidth, lagIndices, subband_offsets, subband_search_offset ); + + imin = get_next_indice( st, 2 ); + g = (float) pow( 10.0f, gain_table_SWB_BWE[imin] ); + /* tonal energy estimation */ + ton_ene_est( xSynth_har, be_tonal, band_energy, band_start, band_end, band_width, fLenLow, fLenHigh, BANDS, har_bands, g, pk_sf, pul_res ); + + /* HF Spectrum Generation */ + Gettonl_scalfact( xSynth_har, spectra_ni, fLenLow, fLenHigh, har_bands, BANDS, band_energy, band_start, band_end, p2a_flags, be_tonal, pk_sf, pul_res ); + if ( flag_dis == 0 ) + { + *prev_frm_hfe2 = 0; + } + else + { + *prev_frm_hfe2 = har_freq_est2; + } + + for ( k = har_bands; k < BANDS; k++ ) + { + for ( i = band_start[k]; i <= band_end[k]; i++ ) + { + spectra[i] = xSynth_har[i - fLenLow]; + } + } + } + else if ( hqswb_clas == HQ_NORMAL ) + { + /* Spectrum normalization for the corecoder */ + ss_min = spectrumsmooth_noiseton( spectra, spectra_ni, sspectra, sspectra_diff, sspectra_ni, fLenLow, ni_seed ); + + convert_lagIndices_pls2smp( (int16_t *) lagIndices, nBands, lagIndices_real, sspectra, sbWidth, fLenLow ); + + for ( k = 0; k < nBands; k++ ) + { + if ( p2a_flags[BANDS - NB_SWB_SUBBANDS + k] == 1 ) + { + lagIndices_real[k] = 0; + } + } + /*get levels for missing bands*/ + GetlagGains( sspectra_ni, &band_energy[BANDS - NB_SWB_SUBBANDS], nBands, sbWidth, lagIndices_real, fLenLow, lagGains ); + for ( k = 0; k < NB_SWB_SUBBANDS; k++ ) + { + lagGains[k] *= 0.9f; + } + for ( k = 0; k < NB_SWB_SUBBANDS; k++ ) + { + th_g[k] = 0.0f; + if ( p2a_flags[BANDS - NB_SWB_SUBBANDS + k] == 0 ) + { + th_g[k] = lagGains[k] * ss_min; + } + } + /* Construct spectrum */ + GetSynthesizedSpecThinOut( sspectra_ni, xSynth_har, nBands, sbWidth, lagIndices_real, lagGains, fLenLow ); + + /*Level adjustment for the missing bands*/ + noiseinj_hf( xSynth_har, th_g, band_energy, hHQ_core->prev_En_sb, p2a_flags, BANDS, band_start, band_end, fLenLow ); + /* xSynth is the reconstructed high-band */ + for ( k = BANDS - NB_SWB_SUBBANDS; k < BANDS; k++ ) + { + if ( p2a_flags[k] == 0 ) + { + for ( i = band_start[k]; i <= band_end[k]; i++ ) + { + spectra[i] = xSynth_har[i - fLenLow]; + } + } + else + { + for ( i = band_start[k]; i <= band_end[k]; i++ ) + { + spectra[i] = spectra_ni[i]; + } + } + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * swb_bwe_dec_lr() + * + * Main decoding routine of SWB BWE for the LR MDCT core + *-------------------------------------------------------------------*/ + +void swb_bwe_dec_lr( + Decoder_State *st, /* i/o: decoder state structure */ + const float m_core[], /* i : lowband synthesis */ + float m[], /* o : highband synthesis with lowband zeroed */ + const int32_t total_brate, /* i : total bitrate for selecting subband pattern */ + int16_t BANDS, /* i : Number subbands/Frame */ + int16_t *band_start, /* i : Band Start of each SB */ + int16_t *band_end, /* i : Band end of each SB */ + float *band_energy, /* i : BAnd energy of each SB */ + int16_t *p2a_flags, /* i : HF tonal Indicator */ + const int16_t hqswb_clas, /* i : class information */ + int16_t lowlength, /* i : Lowband Length */ + int16_t highlength, /* i : Highband Length */ + const int16_t har_bands, /* i : Number of LF harmonic bands */ + int16_t *prev_frm_hfe2, + int16_t *prev_stab_hfe2, + int16_t band_width[], /* i : subband bandwidth */ + const float y2_ni[], /* i/o: Sparse filled corecoder */ + int16_t *ni_seed /* i/o: random seed */ +) +{ + int16_t k; + int16_t nBands; + int16_t nBands_search; + int16_t wBands[NB_SWB_SUBBANDS]; + int16_t lagIndices[NB_SWB_SUBBANDS]; + float lagGains[NB_SWB_SUBBANDS]; + int16_t swb_lowband, swb_highband; + const int16_t *subband_search_offset; + + const int16_t *subband_offsets; + + subband_search_offset = subband_search_offsets_13p2kbps_Har; + subband_offsets = subband_offsets_sub5_13p2kbps_Har; + hf_parinitiz( total_brate, hqswb_clas, lowlength, highlength, wBands, &subband_search_offset, &subband_offsets, &nBands, &nBands_search, &swb_lowband, &swb_highband ); + + /* Decoding of the SWB parameters */ + DecodeSWBGenericParameters( st, lagIndices, nBands_search, BANDS, p2a_flags, hqswb_clas ); + + /* Copy WB synthesis for SWB decoding */ + mvr2r( m_core, m, swb_lowband + swb_highband ); + + /* Generic subband processing */ + DecodeSWBSubbands( st, st->hHQ_core, m, swb_lowband, swb_highband, nBands, wBands, lagIndices, lagGains, BANDS, band_start, band_end, band_energy, p2a_flags, hqswb_clas, har_bands, subband_search_offset, prev_frm_hfe2, prev_stab_hfe2, band_width, subband_offsets, y2_ni, ni_seed ); + + /* Smoothen highest frequencies */ + m[swb_lowband + swb_highband - 1] *= 0.0625f; + m[swb_lowband + swb_highband - 2] *= 0.125f; + m[swb_lowband + swb_highband - 3] *= 0.25f; + m[swb_lowband + swb_highband - 4] *= 0.5f; + + /* Set frequencies below 6.4 kHz to zero */ + if ( hqswb_clas == HQ_NORMAL ) + { + for ( k = 0; k < swb_lowband; k++ ) + { + m[k] = 0.0f; + } + } + + return; +} diff --git a/lib_dec/swb_tbe_dec.c b/lib_dec/swb_tbe_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..c858a80af42f4afc9194c47758dad0f4b5b44513 --- /dev/null +++ b/lib_dec/swb_tbe_dec.c @@ -0,0 +1,2375 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "rom_com.h" +#include "rom_dec.h" +#include "wmc_auto.h" +#include "ivas_prot.h" + +/*-----------------------------------------------------------------* + * Local function prototypes + *-----------------------------------------------------------------*/ + +static void dequantizeSHBparams( Decoder_State *st, const int16_t extl, int32_t extl_brate, float *Q_lsf, float *Q_subgain, float *Q_framegrain, int16_t *uv_flag, float *Q_shb_ener_sf, float *Q_shb_res_gshape, float *Q_mixFactors, int16_t *MSFlag ); +static void Dequant_lower_LSF( const int16_t lsf_idx[], float lsf_q[] ); +static void Map_higher_LSF( float lsf_q[], const float m, const float grid_in[] ); +static void Dequant_mirror_point( const float lsf_q[], const int16_t m_idx, float *m ); + + +/*-------------------------------------------------------------------* + * ResetSHBbuffer_Dec() + * + * + *-------------------------------------------------------------------*/ + +void ResetSHBbuffer_Dec( + TD_BWE_DEC_HANDLE hBWE_TD, /* i/o: TD BWE data handle */ + const int16_t extl /* i : BWE extension layer */ +) +{ + int16_t i; + float f; + float inc; + + if ( extl != WB_TBE ) + { + f = 1.0f / 22.0f; + inc = 1.0f / 22.0f; + } + else + { + f = 1.0f / 6.0f; + inc = 1.0f / 6.0f; + } + + /* states for the filters used in generating SHB excitation from WB excitation*/ + set_f( hBWE_TD->mem_csfilt, 0, 2 ); + + /* states for the filters used in generating SHB signal from SHB excitation*/ + set_f( hBWE_TD->state_syn_shbexc, 0, L_SHB_LAHEAD ); + set_f( hBWE_TD->state_lpc_syn, 0, LPC_SHB_ORDER ); + + if ( extl == FB_TBE ) + { + set_f( hBWE_TD->fb_state_lpc_syn, 0, LPC_SHB_ORDER ); + hBWE_TD->fb_tbe_demph = 0; + fb_tbe_reset_synth( hBWE_TD->fbbwe_hpf_mem, &hBWE_TD->prev_fbbwe_ratio ); + } + + /* states for the filters used in generating SHB signal from SHB excitation in wideband*/ + set_f( hBWE_TD->mem_genSHBexc_filt_down_shb, 0.0f, ( 2 * ALLPASSSECTIONS_STEEP + 1 ) ); + set_f( hBWE_TD->mem_genSHBexc_filt_down_wb2, 0.0f, ( 2 * ALLPASSSECTIONS_STEEP + 1 ) ); + set_f( hBWE_TD->mem_genSHBexc_filt_down_wb3, 0.0f, ( 2 * ALLPASSSECTIONS_STEEP + 1 ) ); + + set_f( hBWE_TD->state_lsyn_filt_shb, 0, 2 * ALLPASSSECTIONS_STEEP ); + set_f( hBWE_TD->state_lsyn_filt_dwn_shb, 0, 2 * ALLPASSSECTIONS_STEEP ); + set_f( hBWE_TD->mem_resamp_HB, 0, INTERP_3_1_MEM_LEN ); + + /* States for the local synthesis filters */ + set_f( hBWE_TD->syn_overlap, 0, L_SHB_LAHEAD ); + + /* States for FEC */ + if ( extl != WB_TBE ) + { + for ( i = 0; i < LPC_SHB_ORDER; i++ ) + { + hBWE_TD->lsp_prevfrm[i] = f; + f += inc; + } + } + else + { + for ( i = 0; i < LPC_SHB_ORDER_WB; i++ ) + { + hBWE_TD->lsp_prevfrm[i] = f; + f += inc; + } + for ( ; i < LPC_SHB_ORDER; i++ ) + { + hBWE_TD->lsp_prevfrm[i] = 0.0f; + } + } + + hBWE_TD->GainFrame_prevfrm = 0.0f; + hBWE_TD->GainAttn = 1.0; + hBWE_TD->tbe_demph = 0.0f; + hBWE_TD->tbe_premph = 0.0f; + set_f( hBWE_TD->mem_stp_swb, 0, LPC_SHB_ORDER ); + hBWE_TD->gain_prec_swb = 1.0f; + set_f( hBWE_TD->GainShape_Delay, 0, NUM_SHB_SUBFR / 2 ); + hBWE_TD->prev_pow_exc16kWhtnd = 1.0f; + hBWE_TD->prev_mix_factor = 1.0f; + + set_f( hBWE_TD->old_core_synth, 0, L_FRAME16k ); + set_f( hBWE_TD->old_tbe_synth, 0, L_SHB_TRANSITION_LENGTH ); + hBWE_TD->tilt_swb_fec = 0.0f; + + return; +} + +/*-------------------------------------------------------------------* + * wb_tbe_dec() + * + * WB TBE decoder, 6 - 8 kHz band decoding module + *-------------------------------------------------------------------*/ + +void wb_tbe_dec( + Decoder_State *st, /* i/o: decoder state structure */ + const float *bwe_exc_extended, /* i : bandwidth extended excitation */ + const float voice_factors[], /* i : voicing factors */ + float *synth /* o : WB synthesis/final synthesis */ +) +{ + int16_t i; + TD_BWE_DEC_HANDLE hBWE_TD; + float shaped_wb_excitation[( L_FRAME16k + L_SHB_LAHEAD ) / 4]; + float exc4kWhtnd[L_FRAME16k / 4]; + float lsf_wb[LPC_SHB_ORDER_WB], lpc_wb[LPC_SHB_ORDER_WB + 1], GainShape[NUM_SHB_SUBFR], GainFrame; + float error[L_FRAME16k]; + float upsampled_synth[L_FRAME48k]; + float prev_pow, curr_pow, scale; + float temp, curr_frame_pow; + int16_t j; + float vf_modified[NB_SUBFR16k]; + int16_t uv_flag = 0; + + hBWE_TD = st->hBWE_TD; + + if ( st->bws_cnt == 0 ) + { + + if ( !st->bfi ) + { + if ( st->use_partial_copy ) + { + if ( st->last_extl != WB_TBE ) + { + hBWE_TD->GainFrame_prevfrm = 0; + hBWE_TD->lsp_prevfrm[0] = 0.1f; + for ( i = 1; i < LPC_SHB_ORDER_LBR_WB; i++ ) + { + hBWE_TD->lsp_prevfrm[i] = hBWE_TD->lsp_prevfrm[i - i] + 0.1f; + } + } + + mvr2r( hBWE_TD->lsp_prevfrm, lsf_wb, LPC_SHB_ORDER_LBR_WB ); + set_f( GainShape, RECIP_ROOT_EIGHT, NUM_SHB_SUBFR / 2 ); + + if ( st->rf_frame_type == RF_NELP ) + { + /* Frame gain */ + /* only four LSBs are valid */ + st->rf_indx_tbeGainFr &= 0xF; + mvr2r( SHBCB_FrameGain16 + st->rf_indx_tbeGainFr, &GainFrame, 1 ); + if ( st->core == ACELP_CORE && st->last_core == ACELP_CORE && !st->prev_use_partial_copy && st->prev_coder_type == UNVOICED && GainFrame != hBWE_TD->GainFrame_prevfrm && st->last_extl == WB_TBE ) + { + GainFrame = 0.2f * GainFrame + 0.8f * hBWE_TD->GainFrame_prevfrm; + } + } + else + { + /* Frame gain */ + temp = 0.0f; + switch ( st->rf_indx_tbeGainFr ) + { + case 0: + GainFrame = 0.5f; + if ( hBWE_TD->GainFrame_prevfrm <= 1.25 ) + { + temp = 0.8f; + } + break; + case 1: + GainFrame = 2.0f; + if ( hBWE_TD->GainFrame_prevfrm > 1.25 && hBWE_TD->GainFrame_prevfrm <= 3 ) + { + temp = 0.8f; + } + break; + case 2: + GainFrame = 4.0f; + if ( hBWE_TD->GainFrame_prevfrm > 3 && hBWE_TD->GainFrame_prevfrm <= 6 ) + { + temp = 0.8f; + } + break; + case 3: + GainFrame = 8.0f; + if ( hBWE_TD->GainFrame_prevfrm > 6 && hBWE_TD->GainFrame_prevfrm <= 16 ) + { + temp = 0.8f; + } + break; + default: + GainFrame = 1.0f; + IVAS_ERROR( IVAS_ERR_INTERNAL, "RF WB-TBE gain bits not supported." ); + break; + } + + if ( st->last_extl == WB_TBE ) + { + GainFrame = ( 1 - temp ) * GainFrame + temp * ( hBWE_TD->GainFrame_prevfrm ); + } + + if ( st->core == ACELP_CORE && st->last_core == ACELP_CORE ) + { + if ( !st->prev_use_partial_copy && st->last_coder_type == VOICED && st->rf_frame_type == RF_GENPRED && st->prev_tilt_code_dec < 0.046f && st->prev_tilt_code_dec > 0.006f ) + { + GainFrame *= 0.3f; + } + } + } + } + else + { + /* de-quantization */ + dequantizeSHBparams( st, st->extl, st->extl_brate, lsf_wb, GainShape, &GainFrame, &uv_flag, 0, 0, 0, &j /*temp*/ ); + } + } + else + { + if ( st->extl_brate == WB_TBE_0k35 ) + { + mvr2r( hBWE_TD->lsp_prevfrm, lsf_wb, LPC_SHB_ORDER_LBR_WB ); + } + else + { + mvr2r( hBWE_TD->lsp_prevfrm, lsf_wb, LPC_SHB_ORDER_WB ); + } + set_f( GainShape, RECIP_ROOT_EIGHT, NUM_SHB_SUBFR / 2 ); + hBWE_TD->GainAttn *= 0.85f; + if ( st->codec_mode == MODE1 ) + { + GainFrame = hBWE_TD->GainAttn * hBWE_TD->GainFrame_prevfrm; + } + else + { + GainFrame = hBWE_TD->GainFrame_prevfrm; + } + } + + if ( st->extl_brate == WB_TBE_0k35 ) + { + /* convert LSPs back into LP coeffs */ + lsp2a( lpc_wb, lsf_wb, LPC_SHB_ORDER_LBR_WB ); + set_f( lpc_wb + LPC_SHB_ORDER_LBR_WB + 1, 0.0f, ( LPC_SHB_ORDER_WB - LPC_SHB_ORDER_LBR_WB ) ); + } + else + { + /* convert LSPs back into LP coeffs */ + lsp2a( lpc_wb, lsf_wb, LPC_SHB_ORDER_WB ); + } + lpc_wb[0] = 1.0f; + mvr2r( voice_factors, vf_modified, NB_SUBFR16k ); + if ( st->coder_type == VOICED ) + { + for ( i = 1; i < NB_SUBFR; i++ ) + { + vf_modified[i] = 0.8f * voice_factors[i] + 0.2f * voice_factors[i - 1]; + } + + if ( st->L_frame != L_FRAME ) + { + vf_modified[4] = 0.8f * voice_factors[4] + 0.2f * voice_factors[3]; + } + } + + if ( st->use_partial_copy && st->nelp_mode_dec ) + { + set_f( vf_modified, 0.0f, NB_SUBFR16k ); + } + + /* From low band excitation, generate highband excitation */ + mvr2r( hBWE_TD->state_syn_shbexc, shaped_wb_excitation, L_SHB_LAHEAD / 4 ); + + GenShapedWBExcitation( shaped_wb_excitation + L_SHB_LAHEAD / 4, lpc_wb, exc4kWhtnd, hBWE_TD->mem_csfilt, hBWE_TD->mem_genSHBexc_filt_down_shb, hBWE_TD->mem_genSHBexc_filt_down_wb2, hBWE_TD->mem_genSHBexc_filt_down_wb3, hBWE_TD->state_lpc_syn, st->coder_type, bwe_exc_extended, hBWE_TD->bwe_seed, vf_modified, uv_flag, st->igf ); + + prev_pow = sum2_f( shaped_wb_excitation, L_SHB_LAHEAD / 4 ); + curr_pow = sum2_f( shaped_wb_excitation + L_SHB_LAHEAD / 4, L_SHB_LAHEAD / 4 ); + + if ( voice_factors[0] > 0.75f ) + { + curr_pow *= 0.25; + } + + if ( prev_pow == 0 ) + { + scale = 0; + } + else + { + scale = (float) sqrt( curr_pow / prev_pow ); + } + for ( i = 0; i < L_SHB_LAHEAD / 4 - 1; i++ ) + { + shaped_wb_excitation[i] *= scale; + } + scale = (float) sqrt( scale ); + + shaped_wb_excitation[L_SHB_LAHEAD / 4 - 1] *= scale; + + /* Update SHB excitation */ + mvr2r( shaped_wb_excitation + L_FRAME16k / 4, hBWE_TD->state_syn_shbexc, L_SHB_LAHEAD / 4 ); + + /* Adjust the subframe and frame gain of the synthesized shb signal */ + /* Scale the shaped excitation */ + ScaleShapedSHB( SHB_OVERLAP_LEN / 2, shaped_wb_excitation, hBWE_TD->syn_overlap, GainShape, GainFrame, window_wb, subwin_wb ); + + curr_frame_pow = sum2_f( shaped_wb_excitation, L_FRAME16k / 4 ) + 0.001f; + curr_frame_pow = min( curr_frame_pow, FLT_MAX ); + + if ( !st->bfi && ( st->prev_bfi || st->prev_use_partial_copy ) ) + { + if ( curr_frame_pow > 2.0f * hBWE_TD->prev_wb_bwe_frame_pow ) + { + scale = root_a_over_b( hBWE_TD->prev_wb_bwe_frame_pow, curr_frame_pow ); + temp = (float) pow( scale, 0.125f ); + } + else + { + scale = 1.0f; + temp = 1.0f; + } + + for ( j = 0; j < 8; j++ ) + { + GainShape[2 * j] *= scale; + GainShape[2 * j + 1] *= scale; + for ( i = 0; i < L_FRAME16k / ( 4 * 8 ); i++ ) + { + shaped_wb_excitation[i + j * L_FRAME16k / ( 4 * 8 )] *= scale; + } + scale /= temp; + } + } + + hBWE_TD->prev_wb_bwe_frame_pow = curr_frame_pow; + + /* generate 16kHz SHB signal (6 - 8 kHz) from 2kHz signal */ + GenWBSynth( shaped_wb_excitation, error, hBWE_TD->state_lsyn_filt_shb, hBWE_TD->state_lsyn_filt_dwn_shb ); + + mvr2r( error + L_FRAME16k - L_SHB_TRANSITION_LENGTH, hBWE_TD->old_tbe_synth, L_SHB_TRANSITION_LENGTH ); + + for ( i = 0; i < L_FRAME16k; i++ ) + { + synth[i] = 0.65f * error[i]; + } + + if ( st->hBWE_FD != NULL ) + { + st->hBWE_FD->last_wb_bwe_ener = 0.0f; + for ( i = 0; i < L_FRAME16k; i++ ) + { + st->hBWE_FD->last_wb_bwe_ener += synth[i] * synth[i]; + } + st->hBWE_FD->last_wb_bwe_ener = (float) sqrt( st->hBWE_FD->last_wb_bwe_ener / L_FRAME16k ); + } + + if ( st->output_Fs == 32000 ) /* 32kHz sampling rate, but only WB output - interpolate */ + { + Interpolate_allpass_steep( synth, hBWE_TD->mem_resamp_HB, L_FRAME16k, upsampled_synth ); + mvr2r( upsampled_synth, synth, L_FRAME32k ); + } + else if ( st->output_Fs == 48000 ) + { + interpolate_3_over_1_allpass( synth, L_FRAME16k, upsampled_synth, hBWE_TD->mem_resamp_HB ); + mvr2r( upsampled_synth, synth, L_FRAME48k ); + } + } + else + { + for ( i = 0; i < LPC_SHB_ORDER_WB; i++ ) + { + lsf_wb[i] = ( i + 1 ) / 6.f; + } + GainFrame = 0; + + hBWE_TD->prev_wb_bwe_frame_pow = 0.001f; + } + + /* Update previous frame parameters for FEC */ + if ( st->extl_brate == WB_TBE_0k35 ) + { + mvr2r( lsf_wb, hBWE_TD->lsp_prevfrm, LPC_SHB_ORDER_LBR_WB ); + } + else + { + mvr2r( lsf_wb, hBWE_TD->lsp_prevfrm, LPC_SHB_ORDER_WB ); + } + hBWE_TD->GainFrame_prevfrm = GainFrame; + + if ( !st->bfi ) + { + hBWE_TD->GainAttn = 1.0f; + } + + return; +} + +/*-------------------------------------------------------------------* + * swb_tbe_dec() + * + * SWB TBE decoder, 6 - 14 kHz (or 7.5 - 15.5 kHz) band decoding module + *-------------------------------------------------------------------*/ + +void swb_tbe_dec( + Decoder_State *st, /* i/o: decoder state structure */ + STEREO_ICBWE_DEC_HANDLE hStereoICBWE, /* i/o: IC-BWE state structure */ + const float *bwe_exc_extended, /* i : bandwidth extended excitation */ + const float voice_factors[], /* i : voicing factors */ + const float old_syn_12k8_16k[], /* i : low band synthesis */ + float *White_exc16k, /* o : shaped white excitation for the FB TBE */ + float *synth, /* o : SHB synthesis/final synthesis */ + float *pitch_buf ) +{ + int16_t i, j; + int16_t stemp; + TD_BWE_DEC_HANDLE hBWE_TD; + float shaped_shb_excitation[L_FRAME16k + L_SHB_LAHEAD]; + float lsf_shb[LPC_SHB_ORDER], lpc_shb[LPC_SHB_ORDER + 1], GainShape[NUM_SHB_SUBFR], GainFrame; + float error[L_FRAME32k]; + float ener; + int16_t is_fractive; + float prev_pow, curr_pow, scale; + float curr_frame_pow, temp; + float GainShapeTemp[NUM_SHB_SUBFR / 4], GainGrad0[3], GainGrad1[3], GainGradFEC[4]; + float vf_modified[NB_SUBFR16k]; + float f, inc; + float GainFrame_prevfrm; + float tilt_swb_fec; + float prev_ener_ratio; + float lsp_shb_1[LPC_SHB_ORDER], lsp_shb_2[LPC_SHB_ORDER], lsp_temp[LPC_SHB_ORDER]; + float lpc_shb_sf[4 * ( LPC_SHB_ORDER + 1 )]; + const float *ptr_lsp_interp_coef; + float shb_ener_sf; + float shb_res_gshape[NB_SUBFR16k]; + float mixFactors; + int16_t vind; + float shb_res_dummy[L_FRAME16k]; + float shaped_shb_excitationTemp[L_FRAME16k]; + float ener_tmp[NUM_SHB_SUBGAINS]; + float GainShape_tmp[NUM_SHB_SUBGAINS]; + float pitch; + int16_t l_subframe; + float formant_fac; + float synth_scale; + float lsf_diff[LPC_SHB_ORDER], w[LPC_SHB_ORDER]; + float refl[M]; + float tilt_para; + float *nlExc16k, *mixExc16k; + int16_t MSFlag; + float feedback; + float GainShape_tilt; + + hBWE_TD = st->hBWE_TD; + + /* initializations */ + GainFrame = 0.0f; + mixFactors = 0.0f; + shb_ener_sf = 0.0f; + set_f( shaped_shb_excitationTemp, 0.0f, L_FRAME16k ); + if ( st->hTdCngDec != NULL ) + { + st->hTdCngDec->shb_dtx_count = 0; + } + is_fractive = 0; + + if ( hStereoICBWE != NULL ) + { + nlExc16k = hStereoICBWE->nlExc16k; + mixExc16k = hStereoICBWE->mixExc16k; + MSFlag = hStereoICBWE->MSFlag; + } + else + { + nlExc16k = NULL; + mixExc16k = NULL; + MSFlag = 0; + } + + /* find tilt */ + calc_tilt_bwe( old_syn_12k8_16k, &tilt_swb_fec, L_FRAME ); + + if ( st->bfi && st->clas_dec != UNVOICED_CLAS ) + { + tilt_swb_fec = hBWE_TD->tilt_swb_fec; + } + + /* WB/SWB bandwidth switching */ + if ( ( st->tilt_wb > 5 && st->clas_dec == UNVOICED_CLAS ) || st->tilt_wb > 10 ) + { + if ( ( st->prev_fractive == 0 && st->prev_enerLH < 2.0f * st->enerLH && st->prev_enerLH > 0.5f * st->enerLH && st->prev_enerLL < 2.0f * st->enerLL && st->prev_enerLL > 0.5f * st->enerLL ) || ( st->prev_fractive == 1 && st->prev_enerLH > 3.0f * st->enerLH ) || ( st->enerLL > 1.5f * st->enerLH && st->tilt_wb < 10.0f ) ) + { + is_fractive = 0; + } + else + { + is_fractive = 1; + } + } + + /* WB/SWB bandwidth switching */ + if ( st->bws_cnt > 0 ) + { + f = 1.0f / 22.0f; + inc = 1.0f / 22.0f; + + if ( is_fractive == 1 ) + { + mvr2r( lsf_tab, hBWE_TD->lsp_prevfrm, LPC_SHB_ORDER ); + } + else + { + for ( i = 0; i < LPC_SHB_ORDER; i++ ) + { + hBWE_TD->lsp_prevfrm[i] = f; + f += inc; + } + } + if ( ( st->last_extl != SWB_TBE && st->last_extl != FB_TBE && !( st->prev_enerLH < 2.0f * st->enerLH && st->prev_enerLH > 0.5f * st->enerLH ) ) || st->last_core != ACELP_CORE || ( st->last_core == ACELP_CORE && labs( st->last_core_brate - st->core_brate ) > 3600 ) || ( is_fractive ^ st->prev_fractive ) == 1 ) + { + set_f( GainShape, 0.3536f, NUM_SHB_SUBFR ); + } + else + { + hBWE_TD->prev_GainShape = ( hBWE_TD->prev_GainShape > 0.3536f ) ? 0.353f : hBWE_TD->prev_GainShape; + set_f( GainShape, hBWE_TD->prev_GainShape, NUM_SHB_SUBFR ); + } + + mvr2r( hBWE_TD->lsp_prevfrm, lsf_shb, LPC_SHB_ORDER ); + set_f( shb_res_gshape, 0.2f, NB_SUBFR16k ); + } + else + { + if ( st->last_extl != SWB_TBE && st->last_extl != FB_TBE ) + { + f = 1.0f / 22.0f; + inc = 1.0f / 22.0f; + for ( i = 0; i < LPC_SHB_ORDER; i++ ) + { + hBWE_TD->lsp_prevfrm[i] = f; + f += inc; + } + } + + if ( !st->bfi ) + { + if ( st->use_partial_copy ) + { + if ( st->last_extl != SWB_TBE ) + { + hBWE_TD->GainFrame_prevfrm = 0; + f = 1.0f / 22.0f; + inc = 1.0f / 22.0f; + for ( i = 0; i < LPC_SHB_ORDER; i++ ) + { + hBWE_TD->lsp_prevfrm[i] = f; + f += inc; + } + } + mvr2r( hBWE_TD->lsp_prevfrm, lsf_shb, LPC_SHB_ORDER ); + set_f( GainShape, RECIP_ROOT_EIGHT, NUM_SHB_SUBFR ); + + if ( st->rf_frame_type == RF_NELP ) + { + /* Frame gain */ + GainFrame = usdequant( st->rf_indx_tbeGainFr, SHB_GAIN_QLOW, SHB_GAIN_QDELTA ); + GainFrame = (float) pow( 10.0, GainFrame ); + + if ( st->core == ACELP_CORE && st->last_core == ACELP_CORE && !st->prev_use_partial_copy && st->prev_coder_type == UNVOICED && GainFrame != hBWE_TD->GainFrame_prevfrm && st->next_coder_type != GENERIC && st->last_extl == SWB_TBE ) + { + GainFrame = 0.2f * GainFrame + 0.8f * hBWE_TD->GainFrame_prevfrm; + } + } + else + { + temp = 0.0f; + /* Frame gain */ + switch ( st->rf_indx_tbeGainFr ) + { + case 0: + GainFrame = 0.5f; + if ( hBWE_TD->GainFrame_prevfrm <= 1.25 ) + { + temp = 0.8f; + } + break; + case 1: + GainFrame = 2.0f; + if ( hBWE_TD->GainFrame_prevfrm > 1.25 && hBWE_TD->GainFrame_prevfrm <= 3 ) + { + temp = 0.8f; + } + break; + case 2: + GainFrame = 4.0f; + if ( hBWE_TD->GainFrame_prevfrm > 3 && hBWE_TD->GainFrame_prevfrm <= 6 ) + { + temp = 0.8f; + } + break; + case 3: + GainFrame = 8.0f; + if ( hBWE_TD->GainFrame_prevfrm > 6 && hBWE_TD->GainFrame_prevfrm <= 16 ) + { + temp = 0.8f; + } + break; + default: + IVAS_ERROR( IVAS_ERR_INTERNAL, "RF SWB-TBE gain bits not supported." ); + } + + if ( st->last_extl == SWB_TBE ) + { + GainFrame = ( 1 - temp ) * GainFrame + temp * ( hBWE_TD->GainFrame_prevfrm ); + } + + if ( st->core == ACELP_CORE && st->last_core == ACELP_CORE ) + { + if ( !st->prev_use_partial_copy && st->last_coder_type == VOICED && st->rf_frame_type == RF_GENPRED && GainFrame > 8.0f && GainFrame < 11.67f ) + { + GainFrame *= 0.3f; + } + } + } + } + else + { + /* de-quantization */ + dequantizeSHBparams( st, st->extl, st->extl_brate, lsf_shb, GainShape, &GainFrame, &stemp, &shb_ener_sf, shb_res_gshape, &mixFactors, &MSFlag ); + if ( hStereoICBWE != NULL ) + { + hStereoICBWE->MSFlag = MSFlag; + } + } + } + else + { + mvr2r( hBWE_TD->lsp_prevfrm, lsf_shb, LPC_SHB_ORDER ); + + if ( st->codec_mode == MODE1 && st->element_mode == EVS_MONO ) + { + /* the previous frame gainshape gradient and the gainshape gradient pattern for the current frame */ + for ( j = 0; j < 3; j++ ) + { + GainGrad0[j] = hBWE_TD->GainShape_Delay[j + 1] - hBWE_TD->GainShape_Delay[j]; + GainGrad1[j] = hBWE_TD->GainShape_Delay[j + 5] - hBWE_TD->GainShape_Delay[j + 4]; + GainGradFEC[j + 1] = GainGrad0[j] * 0.4f + GainGrad1[j] * 0.6f; + } + + /* gradient for the first gainshape */ + if ( ( GainGrad1[2] > 2 * GainGrad1[1] && GainGrad1[1] > 2 * GainGrad1[0] ) || + ( GainGrad1[2] < 2 * GainGrad1[1] && GainGrad1[1] < 2 * GainGrad1[0] ) ) + { + GainGradFEC[0] = GainGrad1[1] * 0.1f + GainGrad1[2] * 0.9f; + } + else + { + GainGradFEC[0] = GainGrad1[0] * 0.2f + GainGrad1[1] * 0.3f + GainGrad1[2] * 0.5f; + } + + /* get the first gainshape template */ + if ( ( st->prev_coder_type == UNVOICED || st->last_good == UNVOICED_CLAS ) && GainGradFEC[0] > 0 ) + { + GainShapeTemp[0] = hBWE_TD->GainShape_Delay[7] + GainGradFEC[0]; + } + else if ( GainGradFEC[0] > 0 ) + { + GainShapeTemp[0] = hBWE_TD->GainShape_Delay[7] + GainGradFEC[0] * 0.5f; + } + else + { + GainShapeTemp[0] = hBWE_TD->GainShape_Delay[7]; + } + + /*Get the second the third and the fourth gainshape template*/ + if ( ( GainGrad1[2] > 10.0f * GainGrad1[1] ) && GainGrad1[1] > 0 ) + { + for ( i = 1; i < NUM_SHB_SUBFR / 4; i++ ) + { + GainShapeTemp[i] = GainShapeTemp[i - 1] + GainGradFEC[i] * 0.8f; + GainShapeTemp[i] = max( GainShapeTemp[i], 0.01f ); + } + } + else if ( ( GainGrad1[2] > 10.0f * GainGrad1[1] ) && GainGrad1[1] < 0 ) + { + for ( i = 1; i < NUM_SHB_SUBFR / 4; i++ ) + { + GainShapeTemp[i] = GainShapeTemp[i - 1] + GainGradFEC[i] * 0.2f; + GainShapeTemp[i] = max( GainShapeTemp[i], 0.01f ); + } + } + else + { + for ( i = 1; i < NUM_SHB_SUBFR / 4; i++ ) + { + GainShapeTemp[i] = GainShapeTemp[i - 1] + GainGradFEC[i]; + GainShapeTemp[i] = max( GainShapeTemp[i], 0.01f ); + } + } + + /* Get the gainshape and gain frame for the current frame*/ + if ( ( st->prev_coder_type == UNVOICED || st->last_good == UNVOICED_CLAS ) && st->nbLostCmpt == 1 ) + { + for ( i = 0; i < NUM_SHB_SUBFR / 4; i++ ) + { + for ( j = 0; j < 4; j++ ) + { + GainShape[i * 4 + j] = GainShapeTemp[i] * 1.2f; + } + } + hBWE_TD->GainAttn *= 0.95f; + } + else if ( st->prev_coder_type == UNVOICED || st->last_good == UNVOICED_CLAS ) + { + for ( i = 0; i < NUM_SHB_SUBFR / 4; i++ ) + { + for ( j = 0; j < 4; j++ ) + { + GainShape[i * 4 + j] = GainShapeTemp[i]; + } + } + hBWE_TD->GainAttn *= 0.95f; + } + else if ( st->nbLostCmpt > 1 ) + { + for ( i = 0; i < NUM_SHB_SUBFR / 4; i++ ) + { + for ( j = 0; j < 4; j++ ) + { + GainShape[i * 4 + j] = GainShapeTemp[i] * 0.5f; + } + } + hBWE_TD->GainAttn *= 0.5f; + } + else + { + for ( i = 0; i < NUM_SHB_SUBFR / 4; i++ ) + { + for ( j = 0; j < 4; j++ ) + { + GainShape[i * 4 + j] = GainShapeTemp[i]; + } + } + hBWE_TD->GainAttn *= 0.85f; + } + + GainFrame = hBWE_TD->GainAttn * hBWE_TD->GainFrame_prevfrm; + } + else + { + for ( i = 0; i < NUM_SHB_SUBFR / 4; i++ ) + { + for ( j = 0; j < 4; j++ ) + { + GainShape[i * 4 + j] = st->cummulative_damping * hBWE_TD->GainShape_Delay[4 + i]; + } + } + + if ( tilt_swb_fec > 8 ) + { + if ( st->nbLostCmpt == 1 ) + { + GainFrame = (float) ( 0.6 * st->cummulative_damping * hBWE_TD->GainFrame_prevfrm ); + } + else if ( st->nbLostCmpt == 2 ) + { + GainFrame = (float) ( 0.35 * st->cummulative_damping * hBWE_TD->GainFrame_prevfrm ); + } + else + { + GainFrame = (float) ( 0.2 * st->cummulative_damping * hBWE_TD->GainFrame_prevfrm ); + } + } + else + { + GainFrame = hBWE_TD->GainFrame_prevfrm; /* gain locking */ + } + } + + if ( st->extl_brate >= SWB_TBE_2k8 ) + { + if ( st->codec_mode == MODE1 && st->element_mode == EVS_MONO ) + { + scale = (float) ( hBWE_TD->prev1_shb_ener_sf / sqrt( ( hBWE_TD->prev2_shb_ener_sf * hBWE_TD->prev3_shb_ener_sf ) + 0.0001 ) ); + scale = hBWE_TD->prev_res_shb_gshape * min( scale, 1.0f ); + + if ( hBWE_TD->prev2_shb_ener_sf > 2.0f * hBWE_TD->prev1_shb_ener_sf || hBWE_TD->prev3_shb_ener_sf > 2.0f * hBWE_TD->prev2_shb_ener_sf ) + { + shb_ener_sf = 0.5f * scale * hBWE_TD->prev1_shb_ener_sf; + if ( st->nbLostCmpt > 1 ) + { + shb_ener_sf *= 0.5f; + } + } + else + { + shb_ener_sf = scale * scale * hBWE_TD->prev1_shb_ener_sf; + } + } + else + { + if ( hBWE_TD->prev2_shb_ener_sf > 2.0f * hBWE_TD->prev1_shb_ener_sf || hBWE_TD->prev3_shb_ener_sf > 2.0f * hBWE_TD->prev2_shb_ener_sf ) + { + shb_ener_sf = 0.5f * st->cummulative_damping * hBWE_TD->prev1_shb_ener_sf; + } + else + { + shb_ener_sf = st->cummulative_damping * hBWE_TD->prev1_shb_ener_sf; + } + } + } + + shb_ener_sf = max( shb_ener_sf, 1.0f ); + mixFactors = hBWE_TD->prev_mixFactors; + + if ( st->codec_mode == MODE2 ) + { + set_f( shb_res_gshape, 1.0f, NB_SUBFR16k ); + } + else + { + set_f( shb_res_gshape, 0.2f, NB_SUBFR16k ); + } + } + } + + /* get the gainshape delay */ + mvr2r( &hBWE_TD->GainShape_Delay[4], &hBWE_TD->GainShape_Delay[0], NUM_SHB_SUBFR / 4 ); + for ( i = 0; i < NUM_SHB_SUBFR / 4; i++ ) + { + hBWE_TD->GainShape_Delay[i + 4] = GainShape[i * 4]; + } + + mvr2r( voice_factors, vf_modified, NB_SUBFR16k ); + if ( st->coder_type == VOICED || mean( voice_factors, 4 ) > 0.4f ) + { + for ( i = 1; i < NB_SUBFR; i++ ) + { + vf_modified[i] = 0.8f * voice_factors[i] + 0.2f * voice_factors[i - 1]; + } + + if ( st->L_frame != L_FRAME ) + { + vf_modified[4] = 0.8f * voice_factors[4] + 0.2f * voice_factors[3]; + } + } + + if ( st->use_partial_copy && st->nelp_mode_dec ) + { + set_f( vf_modified, 0.0f, NB_SUBFR16k ); + } + + /* SHB LSF from current frame; and convert to LSP for interpolation */ + lsf2lsp( lsf_shb, lsp_shb_2, LPC_SHB_ORDER, 1 ); + + if ( st->last_extl == SWB_TBE || st->last_extl == FB_TBE ) + { + /* SHB LSP values from prev. frame for interpolation */ + mvr2r( hBWE_TD->swb_lsp_prev_interp, lsp_shb_1, LPC_SHB_ORDER ); + } + else + { + /* Use current frame's LSPs; in effect no interpolation */ + mvr2r( lsp_shb_2, lsp_shb_1, LPC_SHB_ORDER ); + } + + if ( st->bws_cnt == 0 && st->bws_cnt1 == 0 && st->prev_use_partial_copy == 0 && st->use_partial_copy == 0 ) + { + lsf_diff[0] = lsf_diff[LPC_SHB_ORDER - 1] = 0.5f; + for ( i = 1; i < ( LPC_SHB_ORDER - 1 ); i++ ) + { + lsf_diff[i] = lsf_shb[i] - lsf_shb[i - 1]; + } + + a2rc( hBWE_TD->cur_sub_Aq + 1, refl, M ); + tilt_para = 6.6956f * ( 1.0f + refl[0] ) * ( 1.0f + refl[0] ) - 3.8714f * ( 1.0f + refl[0] ) + 1.3041f; + if ( st->last_extl != SWB_TBE && st->last_extl != FB_TBE ) + { + for ( i = 1; i < LPC_SHB_ORDER - 1; i++ ) + { + hBWE_TD->prev_lsf_diff[i - 1] = 0.5f * lsf_diff[i]; + } + } + + if ( st->extl_brate <= FB_TBE_1k8 ) + { + if ( !( hBWE_TD->prev_tilt_para > 5.0f && ( st->coder_type == TRANSITION || tilt_para < 1.0f ) ) && !( ( hBWE_TD->prev_tilt_para < 3.0f && st->prev_coder_type >= VOICED ) && tilt_para > 5.0f ) ) + { + for ( i = 1; i < ( LPC_SHB_ORDER - 1 ); i++ ) + { + if ( lsf_diff[i] < 0 || hBWE_TD->prev_lsf_diff[i - 1] <= 0 ) /* safety check in case of bit errors */ + { + w[i] = 0; + st->BER_detect = 1; + } + else + { + w[i] = ( lsf_diff[i] < hBWE_TD->prev_lsf_diff[i - 1] ) ? min( max( 0.8f * lsf_diff[i] / hBWE_TD->prev_lsf_diff[i - 1], 0.5f ), 1.0f ) : min( max( 0.8f * hBWE_TD->prev_lsf_diff[i - 1] / lsf_diff[i], 0.5f ), 1.0f ); + } + } + w[0] = w[1]; + w[LPC_SHB_ORDER - 1] = w[LPC_SHB_ORDER - 2]; + + for ( i = 0; i < LPC_SHB_ORDER; i++ ) + { + lsp_temp[i] = lsp_shb_1[i] * ( 1.0f - w[i] ) + lsp_shb_2[i] * w[i]; + } + } + else + { + mvr2r( lsp_shb_2, lsp_temp, LPC_SHB_ORDER ); + } + + /* convert from lsp to lsf */ + lsp2lsf( lsp_temp, lsf_shb, LPC_SHB_ORDER, 1 ); + } + + mvr2r( lsf_diff + 1, hBWE_TD->prev_lsf_diff, LPC_SHB_ORDER - 2 ); + hBWE_TD->prev_tilt_para = tilt_para; + } + else + { + mvr2r( lsp_shb_2, lsp_temp, LPC_SHB_ORDER ); + } + + if ( st->extl_brate >= SWB_TBE_2k8 ) + { + /* SHB LSP interpolation */ + ptr_lsp_interp_coef = interpol_frac_shb; + for ( j = 0; j < 4; j++ ) + { + for ( i = 0; i < LPC_SHB_ORDER; i++ ) + { + lsp_temp[i] = lsp_shb_1[i] * ( *ptr_lsp_interp_coef ) + lsp_shb_2[i] * ( *( ptr_lsp_interp_coef + 1 ) ); + } + ptr_lsp_interp_coef += 2; + + /* convert from lsp to lsf */ + lsp2lsf( lsp_temp, lsp_temp, LPC_SHB_ORDER, 1 ); + + /* convert lsf to lpc for SHB synthesis */ + lsp2a( lpc_shb_sf + j * ( LPC_SHB_ORDER + 1 ), lsp_temp, LPC_SHB_ORDER ); + lpc_shb_sf[j * ( LPC_SHB_ORDER + 1 )] = 1.0f; + } + } + + /* Save the SWB LSP values from current frame for interpolation */ + mvr2r( lsp_shb_2, hBWE_TD->swb_lsp_prev_interp, LPC_SHB_ORDER ); + + /* save the shb_ener and mixFactor values */ + hBWE_TD->prev3_shb_ener_sf = hBWE_TD->prev2_shb_ener_sf; + hBWE_TD->prev2_shb_ener_sf = hBWE_TD->prev1_shb_ener_sf; + hBWE_TD->prev1_shb_ener_sf = shb_ener_sf; + hBWE_TD->prev_res_shb_gshape = shb_res_gshape[4]; + hBWE_TD->prev_mixFactors = mixFactors; + + /* SWB CNG/DTX - update memories */ + if ( st->hTdCngDec != NULL ) + { + mvr2r( st->hTdCngDec->lsp_shb_prev, st->hTdCngDec->lsp_shb_prev_prev, LPC_SHB_ORDER ); + mvr2r( lsf_shb, st->hTdCngDec->lsp_shb_prev, LPC_SHB_ORDER ); + } + + /* convert LSPs back into LP coeffs */ + lsp2a( lpc_shb, lsf_shb, LPC_SHB_ORDER ); + lpc_shb[0] = 1.0; + if ( st->extl_brate == SWB_TBE_1k10 || st->extl_brate == SWB_TBE_1k75 ) + { + vind = (int16_t) ( mixFactors * ( ( 1 << NUM_BITS_SHB_VF ) - 1 ) ); + } + else + { + vind = (int16_t) ( mixFactors * ( 1 << NUM_BITS_SHB_VF ) ); + } + + /* Determine formant PF strength */ + formant_fac = swb_formant_fac( lpc_shb[1], &hBWE_TD->tilt_mem ); + if ( st->total_brate > ACELP_32k ) + { + for ( j = 0; j < 4; j++ ) + { + mvr2r( lpc_shb, &lpc_shb_sf[j * ( LPC_SHB_ORDER + 1 )], LPC_SHB_ORDER + 1 ); + } + } + + /* From low band excitation, generate highband excitation */ + mvr2r( hBWE_TD->state_syn_shbexc, shaped_shb_excitation, L_SHB_LAHEAD ); + GenShapedSHBExcitation( shaped_shb_excitation + L_SHB_LAHEAD, lpc_shb, White_exc16k, hBWE_TD->mem_csfilt, hBWE_TD->mem_genSHBexc_filt_down_shb, hBWE_TD->state_lpc_syn, st->coder_type, bwe_exc_extended, hBWE_TD->bwe_seed, vf_modified, st->extl, &( hBWE_TD->tbe_demph ), &( hBWE_TD->tbe_premph ), lpc_shb_sf, &shb_ener_sf, shb_res_gshape, shb_res_dummy, &vind, formant_fac, hBWE_TD->fb_state_lpc_syn, &( hBWE_TD->fb_tbe_demph ), st->total_brate, st->prev_bfi, st->element_mode, st->flag_ACELP16k, nlExc16k, mixExc16k, st->extl_brate, MSFlag, + NULL, &( hBWE_TD->prev_pow_exc16kWhtnd ), &( hBWE_TD->prev_mix_factor ), NULL, NULL ); + + /* fill-in missing SHB excitation */ + if ( ( st->element_mode == IVAS_CPE_TD || st->element_mode == IVAS_CPE_DFT ) && st->last_core_brate <= SID_2k40 ) + { + mvr2r( shaped_shb_excitation + L_SHB_LAHEAD, shaped_shb_excitation, L_SHB_LAHEAD ); + } + + if ( hStereoICBWE != NULL ) + { + mvr2r( shaped_shb_excitation + L_SHB_LAHEAD, hStereoICBWE->shbSynthRef, L_FRAME16k ); + } + + if ( st->extl_brate != SWB_TBE_1k10 && st->extl_brate != SWB_TBE_1k75 ) + { + for ( i = 0; i < L_FRAME16k; i += L_SUBFR16k ) + { + /* TD BWE post-processing */ + PostShortTerm( &shaped_shb_excitation[L_SHB_LAHEAD + i], lpc_shb, &shaped_shb_excitationTemp[i], hBWE_TD->mem_stp_swb, hBWE_TD->ptr_mem_stp_swb, &( hBWE_TD->gain_prec_swb ), hBWE_TD->mem_zero_swb, formant_fac ); + } + + mvr2r( shaped_shb_excitationTemp, &shaped_shb_excitation[L_SHB_LAHEAD], L_FRAME16k ); + prev_pow = sum2_f( shaped_shb_excitation, L_SHB_LAHEAD + 10 ); + curr_pow = sum2_f( shaped_shb_excitation + L_SHB_LAHEAD + 10, L_SHB_LAHEAD + 10 ); + + if ( voice_factors[0] > 0.75f ) + { + curr_pow *= 0.25; + } + + if ( prev_pow == 0 ) + { + scale = 0; + } + else + { + scale = (float) sqrt( curr_pow / prev_pow ); + } + + for ( i = 0; i < L_SHB_LAHEAD; i++ ) + { + shaped_shb_excitation[i] *= scale; + } + for ( ; i < L_SHB_LAHEAD + 10; i++ ) + { + temp = ( i - 19 ) / 10.0f; + shaped_shb_excitation[i] *= ( temp * 1.0f + ( 1.0f - temp ) * scale ); + } + } + else + { + /* reset the PF memories if the PF is not running */ + set_f( hBWE_TD->mem_stp_swb, 0, LPC_SHB_ORDER ); + hBWE_TD->gain_prec_swb = 1.0f; + set_f( hBWE_TD->mem_zero_swb, 0, LPC_SHB_ORDER ); + } + + /* Update SHB excitation */ + mvr2r( shaped_shb_excitation + L_FRAME16k, hBWE_TD->state_syn_shbexc, L_SHB_LAHEAD ); + l_subframe = L_FRAME16k / NUM_SHB_SUBGAINS; + ener = EPSILON; + for ( i = 0; i < NUM_SHB_SUBGAINS; i++ ) + { + ener_tmp[i] = EPSILON; + for ( j = 0; j < l_subframe; j++ ) + { + ener_tmp[i] += shaped_shb_excitation[i * l_subframe + j] * shaped_shb_excitation[i * l_subframe + j] * 0.0125f; + } + ener_tmp[i] = (float) sqrt( ener_tmp[i] ); + ener += ener_tmp[i]; + } + ener /= NUM_SHB_SUBGAINS; + + /* WB/SWB bandwidth switching */ + if ( st->bws_cnt > 0 ) + { + ener *= 0.35f; + + if ( st->tilt_swb > 8 ) + { + st->prev_fractive = 1; + } + + if ( is_fractive == 0 ) + { + if ( st->tilt_wb > 1.0 ) + { + st->tilt_wb = 1.0f; + } + else if ( st->tilt_wb < 0.5 ) + { + st->tilt_wb = 0.5f; + } + + if ( st->prev_fractive == 1 && st->tilt_wb > 0.5 ) + { + st->tilt_wb = 0.5f; + } + } + else + { + if ( st->tilt_wb > 4 ) + { + if ( st->prev_fractive == 0 ) + { + st->tilt_wb = 4; + } + else + { + st->tilt_wb = 8; + } + } + else + { + st->tilt_wb *= 2; + } + } + + if ( ener != 0 ) + { + if ( ener * st->tilt_wb > st->enerLH ) + { + st->tilt_wb = 0.5f * st->enerLH / ener; + } + else if ( ener * st->tilt_wb < 0.05f * st->enerLH && is_fractive == 1 ) + { + st->tilt_wb = 0.25f * st->enerLH / ener; + } + + GainFrame_prevfrm = st->prev_ener_shb / ener; + } + else + { + GainFrame_prevfrm = 0; + } + + if ( is_fractive == 1 ) + { + GainFrame = 8.0f * st->tilt_wb; + } + else + { + GainFrame = 2.0f * st->tilt_wb; + } + + if ( ( is_fractive & st->prev_fractive ) == 1 && GainFrame > GainFrame_prevfrm ) + { + GainFrame = 0.2f * GainFrame + 0.8f * GainFrame_prevfrm; + } + else + { + if ( ( st->prev_enerLH < 2.0f * st->enerLH && st->prev_enerLH > 0.5f * st->enerLH ) && ( st->prev_enerLL < 2.0f * st->enerLL && st->prev_enerLL > 0.5f * st->enerLL ) && ( is_fractive ^ st->prev_fractive ) == 0 ) + { + GainFrame = 0.5f * GainFrame + 0.5f * GainFrame_prevfrm; + } + else + { + if ( is_fractive == 0 && st->prev_fractive == 1 ) + { + GainFrame = ( 1.0f - 0.1f * GainFrame ) * GainFrame + 0.1f * GainFrame * GainFrame_prevfrm; + } + else + { + GainFrame = 0.5f * GainFrame + 0.5f * GainFrame_prevfrm; + } + } + } + + GainFrame *= ( (float) N_WS2N_FRAMES - (float) st->bws_cnt ) / (float) N_WS2N_FRAMES; + } + else + { + if ( st->bws_cnt1 > 0 ) + { + GainFrame *= (float) st->bws_cnt1 / (float) N_WS2N_FRAMES; + } + + if ( st->nbLostCmpt == 1 ) + { + prev_ener_ratio = st->prev_ener_shb / ener; + + if ( st->clas_dec != UNVOICED_CLAS && st->clas_dec != UNVOICED_TRANSITION && hBWE_TD->tilt_swb_fec < 8.0 && + ( ( st->enerLL > 0.5f * st->prev_enerLL && st->enerLL < 2.0f * st->prev_enerLL ) || ( st->enerLH > 0.5f * st->prev_enerLH && st->enerLH < 2.0f * st->prev_enerLH ) ) ) + { + if ( prev_ener_ratio > 4.0f * GainFrame ) + { + GainFrame = 0.4f * prev_ener_ratio + 0.6f * GainFrame; + } + else if ( prev_ener_ratio > 2.0f * GainFrame ) + { + GainFrame = 0.8f * prev_ener_ratio + 0.2f * GainFrame; + } + else + { + GainFrame = 0.2f * prev_ener_ratio + 0.8f * GainFrame; + } + + if ( tilt_swb_fec > hBWE_TD->tilt_swb_fec ) + { + GainFrame *= hBWE_TD->tilt_swb_fec > 0 ? ( min( 5.0f, tilt_swb_fec / hBWE_TD->tilt_swb_fec ) ) : 1.0f; + } + } + else if ( ( st->clas_dec != UNVOICED_CLAS || hBWE_TD->tilt_swb_fec > 8.0 ) && prev_ener_ratio > 4.0f * GainFrame && ( st->enerLL > 0.5f * st->prev_enerLL || st->enerLH > 0.5f * st->prev_enerLH ) ) + { + GainFrame = 0.2f * prev_ener_ratio + 0.8f * GainFrame; + } + } + else if ( st->nbLostCmpt > 1 ) + { + prev_ener_ratio = st->prev_ener_shb / ener; + if ( ( prev_ener_ratio > 4.0 * GainFrame ) && ( ( st->codec_mode == MODE1 && st->enerLL > st->prev_enerLL && st->enerLH > st->prev_enerLH ) || st->codec_mode == MODE2 ) ) + { + if ( tilt_swb_fec > 10.0f && hBWE_TD->tilt_swb_fec > 10.0f ) + { + GainFrame = min( ( prev_ener_ratio * 0.8f + GainFrame * 0.2f ), 4.0f * GainFrame ); + } + else + { + GainFrame = min( ( prev_ener_ratio * 0.5f + GainFrame * 0.5f ), 4.0f * GainFrame ); + } + } + else if ( ( prev_ener_ratio > GainFrame ) && ( ( st->codec_mode == MODE1 && st->enerLL > st->prev_enerLL && st->enerLH > st->prev_enerLH ) || st->codec_mode == MODE2 ) ) + { + if ( tilt_swb_fec > 10.0f && hBWE_TD->tilt_swb_fec > 10.0f ) + { + GainFrame = 0.5f * prev_ener_ratio + 0.5f * GainFrame; + } + else + { + GainFrame = 0.2f * prev_ener_ratio + 0.8f * GainFrame; + } + } + } + } + + st->prev_fractive = is_fractive; + + /* Adjust the subframe and frame gain of the synthesized shb signal */ + /* Scale the shaped excitation */ + if ( st->L_frame == L_FRAME ) + { + pitch = 0.25f * sum_f( pitch_buf, 4 ); + } + else + { + pitch = 0.2f * sum_f( pitch_buf, 5 ); + } + + if ( ( ( st->extl_brate >= SWB_TBE_2k8 && st->prev_coder_type == st->coder_type && st->coder_type != UNVOICED ) || ( st->extl_brate < SWB_TBE_2k8 && ( st->prev_coder_type == st->coder_type || ( st->prev_coder_type == VOICED && st->coder_type == GENERIC ) || ( st->prev_coder_type == GENERIC && st->coder_type == VOICED ) ) ) ) && pitch > 70 && st->extl < FB_TBE && st->extl_brate != SWB_TBE_1k10 && st->extl_brate != SWB_TBE_1k75 ) + { + for ( i = 0; i < NUM_SHB_SUBGAINS; i++ ) + { + GainShape_tmp[i] = GainShape[i * 4]; + } + + for ( i = 0; i < NUM_SHB_SUBGAINS; i++ ) + { + if ( ener_tmp[i] * GainShape_tmp[i] > hBWE_TD->prev_ener * hBWE_TD->prev_GainShape ) + { + GainShape_tmp[i] = 0.5f * ( hBWE_TD->prev_ener * hBWE_TD->prev_GainShape / ener_tmp[i] + GainShape_tmp[i] ); + } + hBWE_TD->prev_ener = ener_tmp[i]; + hBWE_TD->prev_GainShape = GainShape_tmp[i]; + } + + for ( i = 0; i < NUM_SHB_SUBFR; i++ ) + { + GainShape[i] = GainShape_tmp[i * NUM_SHB_SUBGAINS / NUM_SHB_SUBFR]; + } + } + + /* Gain shape smoothing after quantization */ + if ( st->extl_brate == SWB_TBE_1k10 || st->extl_brate == SWB_TBE_1k75 ) + { + for ( i = 0; i < NUM_SHB_SUBGAINS; i++ ) + { + GainShape_tmp[i] = GainShape[i * NUM_SHB_SUBGAINS]; + } + + lls_interp_n( GainShape_tmp, NUM_SHB_SUBGAINS, &GainShape_tilt, &temp, 1 ); + + if ( vind >= 6 && fabs( GainShape_tilt ) < 0.12f ) + { + feedback = 0.3f; + for ( i = 0; i < NUM_SHB_SUBGAINS; i++ ) + { + GainShape[i] = ( 1 - feedback ) * GainShape[i * NUM_SHB_SUBGAINS] + feedback * GainShape_tmp[i]; + } + + for ( i = NUM_SHB_SUBFR - 1; i > 0; i-- ) + { + GainShape[i] = GainShape[i * NUM_SHB_SUBGAINS / NUM_SHB_SUBFR]; + } + } + } + + /* fil-in missing memory */ + if ( ( st->element_mode == IVAS_CPE_TD || st->element_mode == IVAS_CPE_DFT ) && st->last_core_brate <= SID_2k40 ) + { + for ( i = 0; i < L_SHB_LAHEAD; i++ ) + { + hBWE_TD->syn_overlap[i] = shaped_shb_excitation[i] * subwin_shb[L_SHB_LAHEAD - i]; + hBWE_TD->syn_overlap[i] *= window_shb[L_SHB_LAHEAD - 1 - i] * GainFrame; + } + } + + ScaleShapedSHB( SHB_OVERLAP_LEN, shaped_shb_excitation, hBWE_TD->syn_overlap, GainShape, GainFrame, window_shb, subwin_shb ); + + if ( hStereoICBWE != NULL ) + { + mvr2r( lpc_shb, hStereoICBWE->lpSHBRef, LPC_SHB_ORDER + 1 ); + mvr2r( GainShape, hStereoICBWE->gshapeRef, NUM_SHB_SUBFR ); + hStereoICBWE->gFrameRef = GainFrame; + + mvr2r( shaped_shb_excitation, hStereoICBWE->shbSynthRef, L_FRAME16k ); + } + + curr_frame_pow = sum2_f( shaped_shb_excitation, L_FRAME16k ) + 0.001f; + curr_frame_pow = min( curr_frame_pow, FLT_MAX ); + + if ( !st->bfi && ( st->prev_bfi || st->prev_use_partial_copy ) ) + { + if ( ( curr_frame_pow > 2.0f * hBWE_TD->prev_swb_bwe_frame_pow ) && + ( curr_frame_pow < 30.0f * hBWE_TD->prev_swb_bwe_frame_pow ) && + st->prev_coder_type == UNVOICED ) + { + scale = (float) sqrt( hBWE_TD->prev_swb_bwe_frame_pow / curr_frame_pow ); + if ( curr_frame_pow == 0 ) + { + scale = 0; + } + temp = (float) pow( scale, 0.125f ); + } + else + { + scale = 1.0f; + temp = 1.0f; + } + + for ( j = 0; j < 8; j++ ) + { + GainShape[2 * j] *= scale; + GainShape[2 * j + 1] *= scale; + for ( i = 0; i < L_FRAME16k / 8; i++ ) + { + shaped_shb_excitation[i + j * L_FRAME16k / 8] *= scale; + } + + scale /= temp; + } + } + + /* adjust the FEC frame energy */ + if ( st->bfi ) + { + scale = 1.0f; + temp = 1.0f; + if ( st->nbLostCmpt == 1 ) + { + if ( curr_frame_pow > hBWE_TD->prev_swb_bwe_frame_pow && st->prev_coder_type != UNVOICED && st->last_good != UNVOICED_CLAS ) + { + scale = (float) sqrt( hBWE_TD->prev_swb_bwe_frame_pow / curr_frame_pow ); + if ( curr_frame_pow == 0 ) + { + scale = 0; + } + temp = (float) pow( scale, 0.125f ); + } + else if ( curr_frame_pow < 0.5f * hBWE_TD->prev_swb_bwe_frame_pow && st->nbLostCmpt == 1 && ( st->enerLL > 0.5 * st->prev_enerLL || st->enerLH > 0.5 * st->prev_enerLH ) && ( st->prev_coder_type == UNVOICED || st->last_good == UNVOICED_CLAS || hBWE_TD->tilt_swb_fec > 5.0f ) ) + { + scale = (float) sqrt( hBWE_TD->prev_swb_bwe_frame_pow / curr_frame_pow ); + if ( curr_frame_pow == 0 ) + { + scale = 0; + } + temp = (float) pow( scale, 0.125f ); + } + } + else if ( st->nbLostCmpt > 1 ) + { + if ( curr_frame_pow > hBWE_TD->prev_swb_bwe_frame_pow ) + { + scale = (float) sqrt( hBWE_TD->prev_swb_bwe_frame_pow / curr_frame_pow ); + if ( curr_frame_pow == 0 ) + { + scale = 0; + } + temp = (float) pow( scale, 0.125f ); + } + else if ( curr_frame_pow < 0.5f * hBWE_TD->prev_swb_bwe_frame_pow && ( st->enerLL > 0.5 * st->prev_enerLL || st->enerLH > 0.5 * st->prev_enerLH ) && ( st->prev_coder_type == UNVOICED || st->last_good == UNVOICED_CLAS || hBWE_TD->tilt_swb_fec > 5.0f ) ) + { + scale = (float) min( 2.0f, sqrt( hBWE_TD->prev_swb_bwe_frame_pow / curr_frame_pow ) ); + if ( curr_frame_pow == 0 ) + { + scale = 0; + } + temp = (float) pow( scale, 0.125f ); + } + } + + for ( j = 0; j < 8; j++ ) + { + GainShape[2 * j] *= scale; + GainShape[2 * j + 1] *= scale; + for ( i = 0; i < L_FRAME16k / 8; i++ ) + { + shaped_shb_excitation[i + j * L_FRAME16k / 8] *= scale; + } + + scale /= temp; + } + } + + hBWE_TD->prev_swb_bwe_frame_pow = curr_frame_pow; + + st->prev_ener_shb = EPSILON; + for ( i = 0; i < L_FRAME16k; i++ ) + { + st->prev_ener_shb += shaped_shb_excitation[i] * shaped_shb_excitation[i]; + } + st->prev_ener_shb = (float) sqrt( st->prev_ener_shb / L_FRAME16k ); + + if ( st->hBWE_FD != NULL ) + { + for ( i = 0; i < SWB_FENV; i++ ) + { + st->hBWE_FD->prev_SWB_fenv[i] = (float) sqrt( curr_frame_pow / L_FRAME16k ); + } + } + + /* generate 32kHz SHB synthesis from 12.8(16)kHz signal */ + GenSHBSynth( shaped_shb_excitation, error, hBWE_TD->genSHBsynth_Hilbert_Mem, hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local, st->L_frame, &( hBWE_TD->syn_dm_phase ) ); + + mvr2r( error + L_FRAME32k - L_SHB_TRANSITION_LENGTH, hBWE_TD->old_tbe_synth, L_SHB_TRANSITION_LENGTH ); + + /* resample SHB synthesis (if needed) and scale down */ + synth_scale = ( st->codec_mode == MODE1 ) ? 0.9f : 1.f; + + if ( st->output_Fs == 48000 ) + { + if ( st->extl == FB_TBE ) + { + for ( i = 0; i < L_FRAME16k; i++ ) + { + White_exc16k[i] *= GainFrame * GainShape[NUM_SHB_SUBFR * i / L_FRAME16k]; + } + } + + for ( i = 0; i < L_FRAME32k; i++ ) + { + error[i] *= synth_scale; + } + + interpolate_3_over_2_allpass( error, L_FRAME32k, synth, hBWE_TD->int_3_over_2_tbemem_dec ); + } + else if ( st->output_Fs == 32000 ) + { + for ( i = 0; i < L_FRAME32k; i++ ) + { + synth[i] = synth_scale * error[i]; + } + } + else if ( st->output_Fs == 16000 ) + { + for ( i = 0; i < L_FRAME32k; i++ ) + { + error[i] *= synth_scale; + } + + Decimate_allpass_steep( error, hBWE_TD->mem_resamp_HB_32k, L_FRAME32k, synth ); + } + + /* Update previous frame parameters for FEC */ + mvr2r( lsf_shb, hBWE_TD->lsp_prevfrm, LPC_SHB_ORDER ); + if ( st->codec_mode == MODE1 ) + { + hBWE_TD->GainFrame_prevfrm = GainFrame; + hBWE_TD->tilt_swb_fec = tilt_swb_fec; + + if ( !st->bfi ) + { + hBWE_TD->GainAttn = 1.0f; + } + } + else + { + if ( !st->bfi ) + { + hBWE_TD->tilt_swb_fec = tilt_swb_fec; + hBWE_TD->GainFrame_prevfrm = GainFrame; /* gain locking on lost frame */ + hBWE_TD->GainAttn = 1.0f; + } + } + hBWE_TD->prev_ener = ener_tmp[NUM_SHB_SUBGAINS - 1]; + hBWE_TD->prev_GainShape = GainShape[NUM_SHB_SUBFR - 1]; + + return; +} + +/*-------------------------------------------------------------------* + * Dequant_lower_LSF() + * + * Dequantized the lower LSFs + *-------------------------------------------------------------------*/ + +static void Dequant_lower_LSF( + const int16_t lsf_idx[], /* i : LSF indices */ + float lsf_q[] /* o : Quantized LSFs */ +) +{ + int16_t i; + + lsf_q[0] = lsf_q_cb[0][lsf_idx[0]]; + for ( i = 1; i < NUM_Q_LSF; i++ ) + { + lsf_q[i] = lsf_q_cb[i][lsf_idx[i]] + lsf_q[i - 1]; + } + + return; +} + +/*-------------------------------------------------------------------* + * Map_higher_LSF() + * + * Map the higher LSFs from the lower LSFs + *-------------------------------------------------------------------*/ + +static void Map_higher_LSF( + float lsf_q[], /* i/o: Quantized lower LSFs */ + const float m, /* i : Mirroring point */ + const float grid_in[] /* i : Input LSF smoohthing grid */ +) +{ + float lsf_map[NUM_MAP_LSF]; + float grid[NUM_MAP_LSF]; + float last_q_lsf; + float lsf_smooth[NUM_MAP_LSF]; + float offset; + int16_t i; + float scale; + + for ( i = 0; i < NUM_MAP_LSF; i++ ) + { + lsf_map[i] = 2 * m - lsf_q[NUM_MAP_LSF - 1 - i]; + } + + if ( m > MAX_LSF / 2 ) + { + offset = lsf_map[0]; + scale = ( MAX_LSF - m ) / m; + for ( i = 0; i < NUM_MAP_LSF; i++ ) + { + lsf_map[i] = ( lsf_map[i] - offset ) * scale + offset; + } + } + + last_q_lsf = lsf_q[NUM_Q_LSF - 1]; + scale = MAX_LSF - last_q_lsf; + + for ( i = 0; i < NUM_MAP_LSF; i++ ) + { + grid[i] = grid_in[i] * scale + last_q_lsf; + } + + for ( i = 0; i < NUM_MAP_LSF; i++ ) + { + lsf_smooth[i] = ( 1 - grid_smoothing[i] ) * lsf_map[i] + grid_smoothing[i] * grid[i]; + } + + for ( i = 0; i < NUM_MAP_LSF; i++ ) + { + lsf_q[NUM_Q_LSF + i] = lsf_smooth[i]; + } + + return; +} + +/*-------------------------------------------------------------------* + * Map_higher_LSF() + * + * Map the higher LSFs from the lower LSFs + *-------------------------------------------------------------------*/ + +static void Dequant_mirror_point( + const float lsf_q[], /* i/o: Quantized lower LSFs */ + const int16_t m_idx, /* i : Mirror point index */ + float *m /* i : Mirroring point */ +) +{ + *m = mirror_point_q_cb[m_idx] + lsf_q[NUM_Q_LSF - 1]; + + return; +} + +/*-------------------------------------------------------------------* + * dequantizeSHBparams() + * + * Dequantize super highband spectral envolope, temporal gains and frame gain + *-------------------------------------------------------------------*/ + +static void dequantizeSHBparams( + Decoder_State *st, /* i/o: decoder state structure */ + const int16_t extl, /* i : extension layer */ + int32_t extl_brate, /* i : extensiuon layer bitrate */ + float *Q_lsf, /* o : SHB LSF from de-quantization */ + float *Q_subgain, /* o : SHB subframe gains from de-quantization */ + float *Q_framegrain, /* o : SHB frame gain from de-quantization */ + int16_t *uv_flag, /* o : unvoiced flag */ + float *Q_shb_ener_sf, + float *Q_shb_res_gshape, + float *Q_mixFactors, + int16_t *MSFlag ) +{ + int16_t i, j, idxLSF, idxSubGain, idxFrameGain; + TD_BWE_DEC_HANDLE hBWE_TD; + float Q_combined_gains[NUM_SHB_SUBFR / 4]; + float lsf_q[LPC_SHB_ORDER]; + int16_t lsf_idx[NUM_Q_LSF]; + int16_t m_idx, grid_idx; + float m; + int16_t idx_shb_fr_gain, idx_res_gs[5], idx_mixFac; + + UWord32 Idx_lvq; + int16_t Idx, Idx_pred; + int16_t num_bits_lvq; + float out[LATTICE_DIM]; + const float *cb_stage; + int16_t predictor_bits; + int16_t nbits = NUM_BITS_SHB_MSLVQ; + + hBWE_TD = st->hBWE_TD; + + /* LSFs */ + if ( extl == WB_TBE ) + { + if ( extl_brate == WB_TBE_0k35 ) + { + if ( st->codec_mode == MODE2 ) + { + idxFrameGain = hBWE_TD->gFrame_WB; + idxLSF = hBWE_TD->lsf_WB; + } + else + { + idxFrameGain = get_next_indice( st, NUM_BITS_SHB_FrameGain_LBR_WB ); + idxLSF = get_next_indice( st, NUM_BITS_LBR_WB_LSF ); + } + + mvr2r( lbr_wb_bwe_lsfvq_cbook_2bit + idxLSF * LPC_SHB_ORDER_LBR_WB, Q_lsf, LPC_SHB_ORDER_LBR_WB ); + set_f( Q_subgain, RECIP_ROOT_EIGHT, NUM_SHB_SUBFR / 2 ); + mvr2r( SHBCB_FrameGain16 + idxFrameGain, Q_framegrain, 1 ); + } + else + { + /* read the information about UNVOICED frame */ + *uv_flag = get_next_indice( st, 1 ); + + idxSubGain = get_next_indice( st, NUM_BITS_SHB_SUBGAINS ); + idxFrameGain = get_next_indice( st, NUM_BITS_SHB_FrameGain ); + idxLSF = get_next_indice( st, NUM_BITS_WB_LSF ); + + mvr2r( wb_bwe_lsfvq_cbook_8bit + idxLSF * LPC_SHB_ORDER_WB, Q_lsf, LPC_SHB_ORDER_WB ); + mvr2r( HBCB_SubGain5bit + idxSubGain * NUM_SHB_SUBFR / 4, Q_combined_gains, NUM_SHB_SUBFR / 4 ); + + for ( i = 0; i < NUM_SHB_SUBFR / 4; i++ ) + { + Q_combined_gains[i] = (float) pow( 10.0f, Q_combined_gains[i] / 20.0f ); + } + + for ( i = 0; i < NUM_SHB_SUBFR / 2; i += 2 ) + { + Q_subgain[i] = Q_combined_gains[i / 2]; + Q_subgain[i + 1] = Q_combined_gains[i / 2]; + } + + /* frame gain */ + mvr2r( SHBCB_FrameGain64 + idxFrameGain, Q_framegrain, 1 ); + } + } + else + { + if ( st->codec_mode == MODE2 ) + { + idxSubGain = hBWE_TD->idxSubGains; + idxFrameGain = hBWE_TD->idxFrameGain; + } + else + { + idxSubGain = get_next_indice( st, NUM_BITS_SHB_SUBGAINS ); + if ( st->extl_brate == SWB_TBE_1k75 ) + { + idxFrameGain = get_next_indice( st, NUM_BITS_SHB_FRAMEGAIN_1k75 ); + } + else + { + idxFrameGain = get_next_indice( st, NUM_BITS_SHB_FRAMEGAIN ); + } + } + + /* Multi Source Flag */ + if ( st->element_mode >= IVAS_CPE_DFT && !( st->element_mode == IVAS_CPE_TD && st->tdm_LRTD_flag ) ) + { + *MSFlag = get_next_indice( st, STEREO_ICBWE_MSFLAG_BITS ); + } + else + { + *MSFlag = 0; + } + + if ( st->extl_brate >= SWB_TBE_2k8 ) + { + if ( st->codec_mode == MODE2 ) + { + idx_shb_fr_gain = hBWE_TD->idx_shb_fr_gain; + } + else + { + idx_shb_fr_gain = get_next_indice( st, NUM_BITS_SHB_ENER_SF ); + } + *Q_shb_ener_sf = usdequant( idx_shb_fr_gain, 0, 0.042f ); + *Q_shb_ener_sf = (float) pow( 10.0, *Q_shb_ener_sf ); + + for ( i = 0; i < 5; i++ ) + { + if ( st->codec_mode == MODE2 ) + { + idx_res_gs[i] = hBWE_TD->idx_res_gs[i]; + } + else + { + idx_res_gs[i] = get_next_indice( st, NUM_BITS_SHB_RES_GS ); + } + Q_shb_res_gshape[i] = usdequant( idx_res_gs[i], 0.125f, 0.125f ); + } + + if ( st->codec_mode == MODE2 ) + { + idx_mixFac = hBWE_TD->idx_mixFac; + } + else + { + idx_mixFac = get_next_indice( st, NUM_BITS_SHB_VF ); + } + *Q_mixFactors = usdequant( idx_mixFac, 0.125f, 0.125f ); + } + else + { + *Q_shb_ener_sf = 0; + if ( st->extl_brate == SWB_TBE_1k10 || st->extl_brate == SWB_TBE_1k75 ) + { + idx_mixFac = get_next_indice( st, NUM_BITS_SHB_VF ); + *Q_mixFactors = usdequant( idx_mixFac, 0.0f, 1.0f / ( ( 1 << NUM_BITS_SHB_VF ) - 1 ) ); + } + else + { + *Q_mixFactors = 0; + } + set_f( Q_shb_res_gshape, 0, 5 ); + } + + if ( ( st->extl_brate == SWB_TBE_0k95 || st->extl_brate == SWB_TBE_1k10 ) && st->codec_mode == MODE1 ) + { + set_s( lsf_idx, 0, 5 ); + lsf_idx[0] = get_next_indice( st, 8 ); + grid_idx = 0; + m_idx = 0; + + mvr2r( swb_tbe_lsfvq_cbook_8b + lsf_idx[0] * LPC_SHB_ORDER, Q_lsf, LPC_SHB_ORDER ); + } + else if ( st->rf_flag == 0 && !( ( st->element_mode == EVS_MONO && st->total_brate == ACELP_9k60 ) || ( st->element_mode == EVS_MONO && ( st->total_brate == 0 ) && ( ( st->last_total_brate == ACELP_9k60 ) || ( st->last_total_brate == ACELP_13k20 && st->rf_flag_last ) ) ) ) ) + { + /* LSFs */ + if ( st->extl_brate == SWB_TBE_1k75 ) + { + /* read multi-stage LVQ quantizer */ + if ( nbits >= 19 ) + { + cb_stage = cb_LSF_BWE[0]; + } + else + { + cb_stage = cb_LSF_BWE[1]; + } + + set_zero( lsf_q, LPC_SHB_ORDER ); + + /* VQ part */ + num_bits_lvq = config_LSF_BWE[( NUM_BITS_SHB_MSLVQ - nbits ) * 3]; + Idx = get_next_indice( st, num_bits_lvq ); + v_add( lsf_q, cb_stage + Idx * 6, lsf_q, 6 ); + + /* MSLVQ part */ + num_bits_lvq = nbits - num_bits_lvq - config_LSF_BWE[( NUM_BITS_SHB_MSLVQ - nbits ) * 3 + 2]; + predictor_bits = config_LSF_BWE[( NUM_BITS_SHB_MSLVQ - nbits ) * 3 + 2]; + Idx_pred = 0; + + if ( num_bits_lvq == 16 ) + { + /* MSLVQ part */ + Idx_lvq = get_next_indice( st, num_bits_lvq - 1 ) + ( ( get_next_indice( st, 1 ) ) << 15 ); + deindex_lvq_SHB( Idx_lvq, out, num_bits_lvq, 0 ); + } + else + { + /* MSLVQ part */ + Idx_lvq = get_next_indice( st, num_bits_lvq ); + deindex_lvq_SHB( Idx_lvq, out, num_bits_lvq, ( nbits < 19 ) ); + } + + /* mvr2r( mean_lsf, Q_lsfs, LPC_SHB_ORDER ); */ + v_add( lsf_q, out, lsf_q, LATTICE_DIM ); /* quantized mean removed data for first 8 dim*/ + + /* predict last 2 components */ + if ( predictor_bits == 0 ) + { + lsf_q[LATTICE_DIM] = dotp( lsf_q, LastCoefPred_0bit, LATTICE_DIM ); + lsf_q[LATTICE_DIM + 1] = dotp( lsf_q, &LastCoefPred_0bit[LATTICE_DIM + 1], LATTICE_DIM ); + } + else + { + Idx_pred = get_next_indice( st, 1 ); + + lsf_q[LATTICE_DIM] = dotp( lsf_q, &LastCoefPred_1bit[2 * ( LATTICE_DIM + 1 ) * Idx_pred], LATTICE_DIM ); + lsf_q[LATTICE_DIM + 1] = dotp( lsf_q, &LastCoefPred_1bit[2 * ( LATTICE_DIM + 1 ) * Idx_pred + LATTICE_DIM + 1], LATTICE_DIM ); + } + + if ( nbits < NUM_BITS_SHB_MSLVQ ) + { + Idx_pred = get_next_indice( st, NUM_BITS_SHB_MSLVQ - nbits ); + } + + v_add( SHB_LSF_mean, lsf_q, lsf_q, LPC_SHB_ORDER ); + v_sort( lsf_q, 0, LPC_SHB_ORDER - 1 ); + } + else + { + if ( extl_brate == SWB_TBE_1k6 || extl_brate == FB_TBE_1k8 || extl_brate == SWB_TBE_2k8 || extl_brate == FB_TBE_3k0 ) + { + for ( i = 0; i < NUM_Q_LSF; i++ ) + { + if ( st->codec_mode == MODE2 ) + { + lsf_idx[i] = hBWE_TD->lsf_idx[i]; + } + else + { + lsf_idx[i] = get_next_indice( st, lsf_q_num_bits[i] ); + } + } + } + + Dequant_lower_LSF( lsf_idx, lsf_q ); + + if ( st->codec_mode == MODE2 ) + { + m_idx = hBWE_TD->m_idx; + grid_idx = hBWE_TD->grid_idx; + } + else + { + m_idx = get_next_indice( st, MIRROR_POINT_BITS ); + grid_idx = get_next_indice( st, NUM_LSF_GRID_BITS ); + } + + Dequant_mirror_point( lsf_q, m_idx, &m ); + + /* safety check in case of bit errors */ + if ( m > MAX_LSF ) + { + st->BER_detect = 1; + m = MAX_LSF; + } + + Map_higher_LSF( lsf_q, m, lsf_grid[grid_idx] ); + } + for ( i = 0; i < LPC_SHB_ORDER; i++ ) + { + /* safety check in case of bit errors */ + if ( lsf_q[LPC_SHB_ORDER - 1 - i] > MAX_LSF ) + { + st->BER_detect = 1; + lsf_q[LPC_SHB_ORDER - 1 - i] = MAX_LSF; + } + Q_lsf[i] = 0.5f - lsf_q[LPC_SHB_ORDER - 1 - i]; + } + } + else + { + set_s( lsf_idx, 0, 5 ); + mvs2s( hBWE_TD->lsf_idx, lsf_idx, 5 ); + grid_idx = 0; + m_idx = 0; + mvr2r( swb_tbe_lsfvq_cbook_8b + lsf_idx[0] * LPC_SHB_ORDER, Q_lsf, LPC_SHB_ORDER ); + } + + space_lsfs( Q_lsf, LPC_SHB_ORDER ); + + /* Dequantize subgain indices */ + j = idxSubGain * NUM_SHB_SUBGAINS; + + for ( i = 0; i < NUM_SHB_SUBGAINS; i++ ) + { + Q_subgain[i] = (float) pow( 10.0, SHBCB_SubGain5bit[j++] ); + } + + for ( i = NUM_SHB_SUBFR - 1; i >= 0; i-- ) + { + Q_subgain[i] = Q_subgain[i * NUM_SHB_SUBGAINS / NUM_SHB_SUBFR]; + } + + /* Frame gain */ + if ( st->extl_brate == SWB_TBE_1k75 ) + { + *Q_framegrain = usdequant( idxFrameGain, SHB_GAIN_QLOW_1k75, SHB_GAIN_QDELTA_1k75 ); + } + else + { + *Q_framegrain = usdequant( idxFrameGain, SHB_GAIN_QLOW, SHB_GAIN_QDELTA ); + } + + *Q_framegrain = (float) pow( 10.0, *Q_framegrain ); + } + + return; +} + + +/*-------------------------------------------------------------------* + * fb_tbe_dec() + * + * FB TBE decoder, 14(resp. 15.5) - 20 kHz band decoding module + *-------------------------------------------------------------------*/ + +void fb_tbe_dec( + Decoder_State *st, /* i/o: decoder state structure */ + const float fb_exc[], /* i : FB excitation from the SWB part */ + float *hb_synth, /* o : high-band synthesis */ + float *fb_synth_ref, /* o : high-band synthesis 16-20 kHz */ + const int16_t output_frame /* i : output frame length */ +) +{ + int16_t i; + TD_BWE_DEC_HANDLE hBWE_TD; + float ratio = 0, fb_exc_energy = 0; + float fb_synth[L_FRAME48k]; + + hBWE_TD = st->hBWE_TD; + + if ( output_frame == L_FRAME48k ) + { + /* decode FB slope information */ + if ( st->extl == FB_TBE && !st->bfi ) + { + if ( st->codec_mode == MODE2 ) + { + i = hBWE_TD->idxGain; + } + else + { + i = get_next_indice( st, NUM_BITS_FB_FRAMEGAIN_TBE ); + } + ratio = (float) ( 1 << i ); + } + else if ( st->extl == FB_TBE && st->bfi ) + { + ratio = hBWE_TD->prev_fbbwe_ratio; + } + } + else + { + /* update the position in the bitstream - needed in IVAS */ + if ( !st->bfi ) + { + st->next_bit_pos += NUM_BITS_FB_FRAMEGAIN; + } + + return; + } + + fb_exc_energy = sum2_f( fb_exc, L_FRAME16k ); + + /* FB TBE synthesis */ + synthesise_fb_high_band( fb_exc, fb_synth, fb_exc_energy, ratio, st->L_frame, st->bfi, &( hBWE_TD->prev_fbbwe_ratio ), hBWE_TD->fbbwe_hpf_mem ); + + if ( st->element_mode >= IVAS_CPE_DFT && st->idchan == 0 ) + { + mvr2r( fb_synth, fb_synth_ref, L_FRAME48k ); + } + + /* add the fb_synth component to the hb_synth component */ + v_add( hb_synth, fb_synth, hb_synth, L_FRAME48k ); + + return; +} + + +/*---------------------------------------------------------------------* + * tbe_read_bitstream() + * + * Read TBE bitstream and populate the parameters for TD-BWE decoder. + *---------------------------------------------------------------------*/ + +void tbe_read_bitstream( + Decoder_State *st /* i/o: decoder state structure */ +) +{ + int16_t i; + TD_BWE_DEC_HANDLE hBWE_TD; + + hBWE_TD = st->hBWE_TD; + + if ( ( st->rf_flag || st->total_brate == ACELP_9k60 ) && st->bwidth == WB ) + { + /* WB LSF */ + hBWE_TD->lsf_WB = get_next_indice( st, NUM_BITS_LBR_WB_LSF ); + + /* WB frame gain */ + hBWE_TD->gFrame_WB = get_next_indice( st, NUM_BITS_SHB_FrameGain_LBR_WB ); + } + else if ( st->total_brate >= ACELP_9k60 && st->total_brate <= ACELP_32k && ( st->bwidth == SWB || st->bwidth == FB ) ) + { + if ( st->rf_flag == 0 && st->total_brate > ACELP_9k60 ) + { + for ( i = 0; i < NUM_Q_LSF; i++ ) + { + hBWE_TD->lsf_idx[i] = get_next_indice( st, lsf_q_num_bits[i] ); + } + hBWE_TD->m_idx = get_next_indice( st, MIRROR_POINT_BITS ); + hBWE_TD->grid_idx = get_next_indice( st, NUM_LSF_GRID_BITS ); + } + else + { + hBWE_TD->lsf_idx[0] = get_next_indice( st, 8 ); + hBWE_TD->m_idx = 0; + hBWE_TD->grid_idx = 0; + } + + /* shape gains */ + hBWE_TD->idxSubGains = get_next_indice( st, NUM_BITS_SHB_SUBGAINS ); + + /* frame gain */ + hBWE_TD->idxFrameGain = get_next_indice( st, NUM_BITS_SHB_FRAMEGAIN ); + + if ( st->total_brate >= ACELP_24k40 ) + { + /* sub frame energy*/ + hBWE_TD->idx_shb_fr_gain = get_next_indice( st, NUM_BITS_SHB_ENER_SF ); + + /* gain shapes residual */ + for ( i = 0; i < NB_SUBFR16k; i++ ) + { + hBWE_TD->idx_res_gs[i] = get_next_indice( st, NUM_BITS_SHB_RES_GS ); + } + + /* voicing factor */ + hBWE_TD->idx_mixFac = get_next_indice( st, NUM_BITS_SHB_VF ); + } + + if ( st->tec_tfa == 1 ) + { + st->tec_flag = get_next_indice( st, BITS_TEC ); + st->tfa_flag = get_next_indice( st, BITS_TFA ); + + if ( st->tfa_flag && st->tec_flag ) + { + st->tec_flag = 2; + st->tfa_flag = 0; + } + } + else + { + st->tec_flag = 0; + st->tfa_flag = 0; + } + } + + if ( st->bwidth == FB ) + { + hBWE_TD->idxGain = get_next_indice( st, 4 ); + } + + return; +} + + +/*---------------------------------------------------------------------* + * GenTransition() + * + * Generate a highband transition signal from the gain shape overlap + * buffer to fill the gap caused by the delay alignment buffer when + * switching from TBE to IGF + *---------------------------------------------------------------------*/ + +void GenTransition( + TD_BWE_DEC_HANDLE hBWE_TD, /* i/o: TD BWE data handle */ + float *outputHB, /* o : synthesized HB transitions signal */ + const int32_t output_Fs, /* i : output sampling rate */ + const int16_t element_mode, /* i : element mode */ + const int16_t L_frame, /* i : ACELP frame length */ + const int16_t rf_flag, /* i : RF flag */ + const int32_t total_brate /* i : total bitrate */ +) +{ + int16_t i, length; + float syn_overlap_32k[2 * SHB_OVERLAP_LEN]; + + /* set targeted length of transition signal */ + length = 2 * NS2SA( output_Fs, DELAY_BWE_TOTAL_NS ); + + /* upsample overlap snippet */ + Interpolate_allpass_steep( hBWE_TD->syn_overlap, hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local, SHB_OVERLAP_LEN, syn_overlap_32k ); + + /* perform spectral flip and downmix with overlap snippet to match HB synth */ + if ( ( element_mode == EVS_MONO && ( rf_flag || total_brate == ACELP_9k60 ) ) || ( element_mode > EVS_MONO && L_frame == L_FRAME ) ) + { + flip_and_downmix_generic( syn_overlap_32k, syn_overlap_32k, 2 * SHB_OVERLAP_LEN, hBWE_TD->genSHBsynth_Hilbert_Mem, hBWE_TD->genSHBsynth_Hilbert_Mem + HILBERT_ORDER1, hBWE_TD->genSHBsynth_Hilbert_Mem + ( HILBERT_ORDER1 + 2 * HILBERT_ORDER2 ), &( hBWE_TD->syn_dm_phase ) ); + } + else + { + for ( i = 0; i < 2 * SHB_OVERLAP_LEN; i++ ) + { + syn_overlap_32k[i] = ( ( i % 2 ) == 0 ) ? ( -syn_overlap_32k[i] ) : ( syn_overlap_32k[i] ); + } + } + + /* cross fade of overlap snippet and mirrored HB synth from previous frame */ + for ( i = 0; i < 2 * L_SHB_LAHEAD; i++ ) + { + outputHB[i] = window_shb_32k[i] * hBWE_TD->old_tbe_synth[L_SHB_TRANSITION_LENGTH - 1 - i] + window_shb_32k[2 * L_SHB_LAHEAD - 1 - i] * syn_overlap_32k[i]; + } + + /* fill transition signal with mirrored HB synth from previous frame to fully fill delay alignment buffer gap */ + for ( ; i < length; i++ ) + { + outputHB[i] = hBWE_TD->old_tbe_synth[L_SHB_TRANSITION_LENGTH - 1 - i]; + } + + if ( output_Fs == 48000 ) + { + interpolate_3_over_2_allpass( outputHB, length, outputHB, hBWE_TD->int_3_over_2_tbemem_dec ); + } + else if ( output_Fs == 16000 ) + { + Decimate_allpass_steep( outputHB, hBWE_TD->mem_resamp_HB_32k, L_FRAME32k, outputHB ); + } + + return; +} + +/*---------------------------------------------------------------------* + * GenTransition_WB() + * + * + *---------------------------------------------------------------------*/ + +void GenTransition_WB( + TD_BWE_DEC_HANDLE hBWE_TD, /* i/o: TD BWE data handle */ + float *outputHB, /* o : synthesized HB transitions signal */ + const int32_t output_Fs /* i : output sampling rate */ +) +{ + int16_t i, length; + float speech_buf_16k1[SHB_OVERLAP_LEN], speech_buf_16k2[2 * SHB_OVERLAP_LEN]; + float upsampled_synth[L_FRAME48k]; + + /* set targeted length of transition signal */ + length = 2 * NS2SA( output_Fs, DELAY_BWE_TOTAL_NS ); + + /* upsample overlap snippet */ + Interpolate_allpass_steep( hBWE_TD->syn_overlap, hBWE_TD->state_lsyn_filt_shb, SHB_OVERLAP_LEN / 2, speech_buf_16k1 ); + Interpolate_allpass_steep( speech_buf_16k1, hBWE_TD->state_lsyn_filt_dwn_shb, SHB_OVERLAP_LEN, speech_buf_16k2 ); + + /* perform spectral flip and downmix with overlap snippet to match HB synth */ + for ( i = 0; i < SHB_OVERLAP_LEN; i++ ) + { + speech_buf_16k2[i] = ( ( i % 2 ) == 0 ) ? ( -speech_buf_16k2[i] ) : ( speech_buf_16k2[i] ); + } + + /* cross fade of overlap snippet and mirrored HB synth from previous frame */ + for ( i = 0; i < L_SHB_LAHEAD; i++ ) + { + outputHB[i] = window_shb[i] * hBWE_TD->old_tbe_synth[L_SHB_TRANSITION_LENGTH - 1 - i] + window_shb[L_SHB_LAHEAD - 1 - i] * speech_buf_16k2[i]; + outputHB[i] *= 0.65f; + } + + /* fill transition signal with mirrored HB synth from previous frame to fully fill delay alignment buffer gap */ + for ( ; i < length; i++ ) + { + outputHB[i] = hBWE_TD->old_tbe_synth[L_SHB_TRANSITION_LENGTH - 1 - i]; + outputHB[i] *= 0.65f; + } + + /* upsampling if necessary */ + if ( output_Fs == 32000 ) + { + Interpolate_allpass_steep( outputHB, hBWE_TD->mem_resamp_HB, L_FRAME16k, upsampled_synth ); + mvr2r( upsampled_synth, outputHB, L_FRAME32k ); + } + else if ( output_Fs == 48000 ) + { + interpolate_3_over_1_allpass( outputHB, L_FRAME16k, upsampled_synth, hBWE_TD->mem_resamp_HB ); + mvr2r( upsampled_synth, outputHB, L_FRAME48k ); + } + + return; +} + + +/*---------------------------------------------------------------------* + * void TBEreset_dec() + * + * + *---------------------------------------------------------------------*/ + +void TBEreset_dec( + Decoder_State *st /* i/o: decoder state structure */ +) +{ + TD_BWE_DEC_HANDLE hBWE_TD; + + hBWE_TD = st->hBWE_TD; + + if ( st->last_core != ACELP_CORE ) + { + set_f( hBWE_TD->old_bwe_exc, 0.0f, PIT16k_MAX * 2 ); + hBWE_TD->bwe_non_lin_prev_scale = 0.f; + } + if ( st->bwidth == WB ) + { + wb_tbe_extras_reset( hBWE_TD->mem_genSHBexc_filt_down_wb2, hBWE_TD->mem_genSHBexc_filt_down_wb3 ); + wb_tbe_extras_reset_synth( hBWE_TD->state_lsyn_filt_shb, hBWE_TD->state_lsyn_filt_dwn_shb, hBWE_TD->mem_resamp_HB ); + set_f( hBWE_TD->mem_genSHBexc_filt_down_shb, 0, 7 ); + set_f( hBWE_TD->state_lpc_syn, 0, 10 ); + set_f( hBWE_TD->state_syn_shbexc, 0, L_SHB_LAHEAD / 4 ); + set_f( hBWE_TD->syn_overlap, 0, L_SHB_LAHEAD ); + set_f( hBWE_TD->mem_csfilt, 0, 2 ); + } + else if ( st->bwidth == SWB || st->bwidth == FB ) + { + swb_tbe_reset( hBWE_TD->mem_csfilt, hBWE_TD->mem_genSHBexc_filt_down_shb, hBWE_TD->state_lpc_syn, hBWE_TD->syn_overlap, hBWE_TD->state_syn_shbexc, &( hBWE_TD->tbe_demph ), &( hBWE_TD->tbe_premph ), hBWE_TD->mem_stp_swb, &( hBWE_TD->gain_prec_swb ) ); + + set_f( hBWE_TD->GainShape_Delay, 0, NUM_SHB_SUBFR / 2 ); + set_f( hBWE_TD->int_3_over_2_tbemem_dec, 0.f, INTERP_3_2_MEM_LEN ); + set_f( hBWE_TD->mem_resamp_HB_32k, 0, 2 * ALLPASSSECTIONS_STEEP + 1 ); + hBWE_TD->prev_pow_exc16kWhtnd = 1.0f; + hBWE_TD->prev_mix_factor = 1.0f; + + swb_tbe_reset_synth( hBWE_TD->genSHBsynth_Hilbert_Mem, hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local ); + + if ( st->bwidth == FB ) + { + if ( st->hBWE_FD != NULL ) + { + st->hBWE_FD->prev_fb_ener_adjust = 0.0f; + } + set_f( hBWE_TD->fb_state_lpc_syn, 0, LPC_SHB_ORDER ); + hBWE_TD->fb_tbe_demph = 0; + fb_tbe_reset_synth( hBWE_TD->fbbwe_hpf_mem, &hBWE_TD->prev_fbbwe_ratio ); + } + } + + return; +} + +/*-------------------------------------------------------------------* + * td_bwe_dec_init() + * + * Initialize TD BWE state structure at the decoder + *-------------------------------------------------------------------*/ + +void td_bwe_dec_init( + TD_BWE_DEC_HANDLE hBWE_TD, /* i/o: TD BWE data handle */ + const int16_t extl, /* i : BWE extension layer */ + const int32_t output_Fs /* i : output sampling rate */ +) +{ + int16_t i; + + /* init. SHB buffers */; + set_f( hBWE_TD->old_bwe_exc, 0.0f, ( PIT16k_MAX * 2 ) ); + hBWE_TD->bwe_seed[0] = 23; /* 1; */ + hBWE_TD->bwe_seed[1] = 59; /* 10000; */ + set_f( hBWE_TD->old_bwe_exc_extended, 0.0f, NL_BUFF_OFFSET ); + hBWE_TD->bwe_non_lin_prev_scale = 0; + + set_f( hBWE_TD->genSHBsynth_Hilbert_Mem, 0.0f, HILBERT_MEM_SIZE ); + set_f( hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local, 0.0f, 2 * ALLPASSSECTIONS_STEEP ); + + hBWE_TD->syn_dm_phase = 0; + hBWE_TD->prev_fbbwe_ratio = 1.0f; + hBWE_TD->prev_wb_bwe_frame_pow = 0.001f; + hBWE_TD->prev_swb_bwe_frame_pow = 0.001f; + + /* reset SHB buffers */ + ResetSHBbuffer_Dec( hBWE_TD, extl ); + + if ( output_Fs == 48000 ) + { + set_f( hBWE_TD->fbbwe_hpf_mem[0], 0, 4 ); + set_f( hBWE_TD->fbbwe_hpf_mem[1], 0, 4 ); + set_f( hBWE_TD->fbbwe_hpf_mem[2], 0, 4 ); + set_f( hBWE_TD->fbbwe_hpf_mem[3], 0, 4 ); + } + + set_f( hBWE_TD->mem_resamp_HB, 0, INTERP_3_1_MEM_LEN ); + set_f( hBWE_TD->mem_resamp_HB_32k, 0, 2 * ALLPASSSECTIONS_STEEP + 1 ); + + hBWE_TD->tilt_mem = 0.0f; + set_f( hBWE_TD->prev_lsf_diff, 0.5f, LPC_SHB_ORDER - 2 ); + hBWE_TD->prev_tilt_para = 0.0f; + set_f( hBWE_TD->cur_sub_Aq, 0.0f, M + 1 ); + set_f( hBWE_TD->int_3_over_2_tbemem_dec, 0.0f, INTERP_3_2_MEM_LEN ); + + /* TD BWE post-processing */ + hBWE_TD->ptr_mem_stp_swb = hBWE_TD->mem_stp_swb + LPC_SHB_ORDER - 1; + set_f( hBWE_TD->mem_zero_swb, 0, LPC_SHB_ORDER ); + + for ( i = 0; i < LPC_SHB_ORDER; i++ ) + { + hBWE_TD->swb_lsp_prev_interp[i] = (float) cos( (float) i * EVS_PI / (float) 10.0f ); + } + + hBWE_TD->prev1_shb_ener_sf = 1.0f; + hBWE_TD->prev2_shb_ener_sf = 1.0f; + hBWE_TD->prev3_shb_ener_sf = 1.0f; + hBWE_TD->prev_res_shb_gshape = 0.125f; + hBWE_TD->prev_mixFactors = 0.5f; + hBWE_TD->prev_GainShape = 0.0f; + set_f( hBWE_TD->fb_state_lpc_syn, 0, LPC_SHB_ORDER ); + hBWE_TD->fb_tbe_demph = 0.0f; + + set_f( hBWE_TD->old_hb_synth, 0, L_FRAME48k ); + + hBWE_TD->GainFrame_prevfrm = 0.0f; + + hBWE_TD->prev_ener = 0.0f; + + return; +} diff --git a/lib_dec/syn_outp.c b/lib_dec/syn_outp.c new file mode 100644 index 0000000000000000000000000000000000000000..aebcc9b0450c2b10640c888f40285c320d828ef8 --- /dev/null +++ b/lib_dec/syn_outp.c @@ -0,0 +1,135 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * syn_output() + * + * Output synthesis signal with compensation for saturation + * returns number of clipped samples + *-------------------------------------------------------------------*/ + +/*! r: number of clipped samples */ +uint32_t syn_output( + float *synth, /* i/o: float synthesis signal */ + const int16_t output_frame, /* i : output frame length */ + int16_t *synth_out /* o : integer 16 bits synthesis signal */ +) +{ + /*-----------------------------------------------------------------* + * float to integer conversion with saturation control + *-----------------------------------------------------------------*/ + + /* integer conversion */ + return mvr2s( synth, synth_out, output_frame ); +} + + +/*-------------------------------------------------------------------* + * AGC_dec() + * + * In-place saturation control (Automatic Gain Control) + *-------------------------------------------------------------------*/ + +void AGC_dec( + float x[], /* i/o: input/output vector */ + float mem[], /* i/o: mem[2] should be init to [0,0] */ + const int16_t n /* i : vector size */ +) +{ + int16_t i; + float fac, prev, tmp, frame_fac, max_val; + + /*-----------------------------------------------------------------* + * calculate AGC factor to avoid saturation + *-----------------------------------------------------------------*/ + + max_val = 0.0f; + + for ( i = 0; i < n; i++ ) + { + tmp = (float) fabs( x[i] ); + if ( tmp > max_val ) + { + max_val = tmp; + } + } + + frame_fac = 0.0f; + if ( max_val > 30000.0f ) + { + frame_fac = 0.5f - ( 15000.0f / max_val ); + } + + fac = mem[0]; + prev = mem[1]; + + /*-----------------------------------------------------------------* + * AGC + *-----------------------------------------------------------------*/ + + for ( i = 0; i < n; i++ ) + { + /* update AGC factor (slowly) */ + fac = 0.99f * fac + 0.01f * frame_fac; + + /* convert float to integer with AGC */ + tmp = ( 1.0f - fac ) * x[i] - fac * prev; + prev = x[i]; + + if ( tmp > MAX16B_FLT ) + { + tmp = MAX16B_FLT; + } + else if ( tmp < MIN16B_FLT ) + { + tmp = MIN16B_FLT; + } + + x[i] = (int16_t) floor( tmp + 0.5f ); + } + + mem[0] = fac; + mem[1] = prev; + + return; +} diff --git a/lib_dec/tcq_core_dec.c b/lib_dec/tcq_core_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..c9dcb27d1a35f43c05fc1bd7eff85c83b14778af --- /dev/null +++ b/lib_dec/tcq_core_dec.c @@ -0,0 +1,473 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "basop_util.h" +#include "basop_proto_func.h" +#include "wmc_auto.h" + +/*---------------------------------------------------------------------* + * tcq_core_LR_enc() + * + * Main Generic Audio Decoder Routine for LR-MDCT + *---------------------------------------------------------------------*/ + +void tcq_core_LR_dec( + Decoder_State *st, + int32_t *inp_vector, + const int16_t bit_budget, + const int16_t BANDS, + const int16_t *band_start, + const int16_t *band_width, + Word32 *Rk_fx, + int16_t *npulses, + int16_t *k_sort, + const int16_t *p2a_flags, + const int16_t p2a_bands, + const int16_t *last_bitalloc, + const int16_t input_frame, + const int16_t adjustFlag, + const int16_t *is_transient ) +{ + int16_t i, j, k; + float Rk_sort[NB_SFM]; + int16_t flag_wbnb = 0; + int16_t USQ_TCQ[NB_SFM]; /* TCQ is selected by default*/ + int16_t nb_bytes, pulsesnum, nz; + int32_t positions[L_FRAME32k]; + int16_t k_num[2]; + ARCODEC ardec, *pardec; + TCQ_BITSTREAM bs, *pbs; + + int16_t nzbands = 0; + int16_t lsbtcq_bits = TCQ_AMP; + int16_t tcq_arbits = 2; + + /* LSB TCQ variables*/ + int16_t dpath[280]; + int16_t bcount = 0; + float mbuffer[560]; + + Word32 leftbits = 0; + Word32 sepbits = 0; + Word32 divider = 0; + + /*Word32 Rk_fx[NB_SFM];*/ /* Q16 */ + Word32 Rk_sort_fx[NB_SFM]; /* Q16 */ + Word32 bsub_fx = 0; + + Word16 nzb = 0; + Word32 delta_fx; + Word32 surplus_fx; + Word32 bit_surplus_fx[2]; + + /* initialization */ + set_s( dpath, 0, 280 ); + set_f( mbuffer, 0.f, 560 ); + set_f( Rk_sort, 0.f, NB_SFM ); + set_s( USQ_TCQ, 0, NB_SFM ); + set_l( positions, 0, L_FRAME32k ); + + if ( input_frame <= L_FRAME16k && adjustFlag == 0 && *is_transient == 0 ) + { + flag_wbnb = 1; + lsbtcq_bits = 0; + tcq_arbits = 0; + } + + pardec = &ardec; + pbs = &bs; + pbs->curPos = 7; + pbs->numbits = 0; + pbs->numByte = 0; + + /* Bits distribution analysis*/ + for ( i = 0; i < BANDS; i++ ) + { + if ( L_sub( ar_div( Rk_fx[i], band_width[i] ), 49152 ) >= 0 ) + { + /* USQ used for high importance bands*/ + USQ_TCQ[i] = 1; + } + else + { + /* TCQ used for usual bands*/ + USQ_TCQ[i] = 0; + } + if ( Rk_fx[i] > 0.0f ) + { + nzbands++; + } + } + + for ( j = 0; j < BANDS; j++ ) + { + if ( Rk_fx[j] > 0.0f ) + { + nzb++; + } + } + +#define WMC_TOOL_SKIP + bsub_fx = L_shl( L_add( tcq_arbits, lsbtcq_bits ), 16 ); + IF( bsub_fx > 0 ) + { + bsub_fx = L_add( bsub_fx, 2048 ); + } + for ( j = BANDS - 1; j >= 0; j-- ) + { + if ( Rk_fx[j] > 0 ) + { + Rk_fx[j] = L_sub( Rk_fx[j], ar_div( bsub_fx, nzb ) ); + if ( Rk_fx[j] < 0 ) + { + bsub_fx = L_sub( bsub_fx, L_add( ar_div( bsub_fx, nzb ), Rk_fx[j] ) ); + Rk_fx[j] = 0; + } + else + { + bsub_fx = L_sub( bsub_fx, ar_div( bsub_fx, nzb ) ); + } + nzb = sub( nzb, 1 ); + } + } + + srt_vec_ind_fx( Rk_fx, Rk_sort_fx, k_sort, BANDS ); +#undef WMC_TOOL_SKIP + + /*read the bits*/ + nb_bytes = bit_budget >> 3; + k = bit_budget - ( nb_bytes << 3 ); + for ( i = 0; i < nb_bytes; i++ ) + { + pbs->buf[i] = (uint8_t) get_next_indice( st, 8 ); + } + + if ( k > 0 ) + { + pbs->buf[nb_bytes] = (uint8_t) get_next_indice( st, k ); + pbs->buf[nb_bytes] <<= ( 8 - k ); + i++; + nb_bytes++; + } + /* set two more bytes, which are used to flush the arithmetic coder, to 0 + -> this avoids reading of uninitialized memory */ + nb_bytes = min( nb_bytes + 2, MAX_SIZEBUF_PBITSTREAM ); + for ( ; i < nb_bytes; i++ ) + { + pbs->buf[i] = 0; + } + + pbs->maxBytes = nb_bytes; + + ar_decoder_start( pardec, pbs ); + + delta_fx = 0; + surplus_fx = 0; + + if ( input_frame <= L_FRAME16k && adjustFlag == 0 && *is_transient == 0 ) + { + surplus_fx = -131072; + + bit_allocation_second_fx( Rk_fx, Rk_sort_fx, BANDS, band_width, k_sort, k_num, p2a_flags, p2a_bands, last_bitalloc, input_frame ); + + nzbands = 0; + for ( j = 0; j < BANDS; j++ ) + { + if ( sub( j, k_num[0] ) == 0 || sub( j, k_num[1] ) == 0 ) + { + sepbits = L_add( sepbits, Rk_fx[k_sort[j]] ); + } + else + { + leftbits = L_add( leftbits, Rk_fx[k_sort[j]] ); + if ( Rk_fx[k_sort[j]] > 0 ) + { + nzbands = add( nzbands, 1 ); + } + } + } + + for ( k = 0; k < BANDS; k++ ) + { + if ( k != k_num[0] && k != k_num[1] ) + { + if ( Rk_fx[k_sort[k]] > 0 && USQ_TCQ[k_sort[k]] == 0 ) + { + /* When number of bits per band is less than + arithmetic bits overhead, this band is not encoded. + It may happens when the actual number of bits per + band is near same to estimated number of bits, for + most bands (very unprobable but possible) */ + if ( L_add( Rk_fx[k_sort[k]], delta_fx ) < 0 ) + { + pulsesnum = 0; + for ( i = 0; i < band_width[k_sort[k]]; i++ ) + { + inp_vector[band_start[k_sort[k]] + i] = 0; + } + if ( surplus_fx != 0 ) + { +#define WMC_TOOL_SKIP + surplus_fx = L_add( Rk_fx[k_sort[k]], surplus_fx ); + surplus_fx = L_add( delta_fx, surplus_fx ); +#undef WMC_TOOL_SKIP + } + } + else + { + /*get number of pulses */ + pulsesnum = GetScale_fx( band_width[k_sort[k]], L_add( Rk_fx[k_sort[k]], delta_fx ), &surplus_fx ); + + leftbits = L_sub( leftbits, L_add( Rk_fx[k_sort[k]], delta_fx ) ); + + decode_position_ari_fx( pardec, band_width[k_sort[k]], pulsesnum, &nz, &positions[band_start[k_sort[k]]] ); + decode_mangitude_tcq_fx( pardec, band_width[k_sort[k]], pulsesnum, nz, &positions[band_start[k_sort[k]]], &inp_vector[band_start[k_sort[k]]], &surplus_fx ); + decode_signs_fx( pardec, band_width[k_sort[k]], &inp_vector[band_start[k_sort[k]]] ); + } + nzbands--; + } + else if ( Rk_fx[k_sort[k]] > 0 && USQ_TCQ[k_sort[k]] == 1 ) + { + /* When number of bits per band is less than + arithmetic bits overhead, this band is not encoded. + It may happens when the actual number of bits per + band is near same to estimated number of bits, for + most bands (very unprobable but possible) */ + if ( L_add( Rk_fx[k_sort[k]], delta_fx ) < 0 ) + { + pulsesnum = 0; + for ( i = 0; i < band_width[k_sort[k]]; i++ ) + { + inp_vector[band_start[k_sort[k]] + i] = 0; + } + if ( surplus_fx != 0 ) + { +#define WMC_TOOL_SKIP + surplus_fx = L_add( Rk_fx[k_sort[k]], surplus_fx ); + surplus_fx = L_add( delta_fx, surplus_fx ); +#undef WMC_TOOL_SKIP + } + } + else + { + + pulsesnum = GetScale_fx( band_width[k_sort[k]], L_add( Rk_fx[k_sort[k]], delta_fx ), &surplus_fx ); + + leftbits = L_sub( leftbits, L_add( Rk_fx[k_sort[k]], delta_fx ) ); + + decode_position_ari_fx( pardec, band_width[k_sort[k]], pulsesnum, &nz, &positions[band_start[k_sort[k]]] ); + decode_magnitude_usq_fx( pardec, band_width[k_sort[k]], pulsesnum, nz, &positions[band_start[k_sort[k]]], &inp_vector[band_start[k_sort[k]]] ); + decode_signs_fx( pardec, band_width[k_sort[k]], &inp_vector[band_start[k_sort[k]]] ); + } + nzbands--; + } + else + { + pulsesnum = 0; + for ( i = 0; i < band_width[k_sort[k]]; i++ ) + { + inp_vector[band_start[k_sort[k]] + i] = 0; + } + } + + npulses[k_sort[k]] = pulsesnum; + + if ( Rk_fx[k_sort[k]] > 0 && surplus_fx < 0 ) + { +#define WMC_TOOL_SKIP + IF( nzbands <= 1 ) + { + divider = 0; + } + ELSE + { + divider = 2; + } + + IF( L_add( L_add( surplus_fx, sepbits ), ar_div( leftbits, divider ) ) < 0 ) + { + /* Overflow possible => start to distribute negative surplus */ + delta_fx = ar_div( surplus_fx + sepbits, nzbands ); + } + else + { + delta_fx = 0; + } + surplus_fx = L_sub( surplus_fx, delta_fx ); +#undef WMC_TOOL_SKIP + } + else + { + delta_fx = 0; + } + } + } + +#define WMC_TOOL_SKIP + if ( ( L_sub( surplus_fx, 524288 ) > 0 && sub( input_frame, L_FRAME8k ) == 0 ) || ( L_sub( surplus_fx, 786432 ) > 0 && sub( input_frame, L_FRAME16k ) == 0 ) ) + { + bit_surplus_fx[0] = Mult_32_16( surplus_fx, 24576 ); /* Q16 */ + bit_surplus_fx[1] = Mult_32_16( surplus_fx, 8192 ); /* Q16 */ + } +#undef WMC_TOOL_SKIP + else + { + bit_surplus_fx[0] = surplus_fx; + bit_surplus_fx[1] = 0; + } + + for ( k = 0; k < BANDS; k++ ) + { + for ( j = 0; j < 2; j++ ) + { + if ( k == k_num[j] ) + { +#define WMC_TOOL_SKIP + Rk_fx[k_sort[k]] = L_add( Rk_fx[k_sort[k]], bit_surplus_fx[j] ); +#undef WMC_TOOL_SKIP + if ( Rk_fx[k_sort[k]] > 0 && USQ_TCQ[k_sort[k]] == 0 ) + { + /* get number of pulses */ + pulsesnum = GetScale_fx( band_width[k_sort[k]], Rk_fx[k_sort[k]], &surplus_fx ); + + decode_position_ari_fx( pardec, band_width[k_sort[k]], pulsesnum, &nz, &positions[band_start[k_sort[k]]] ); + /* decode tcq magniitude and update the surplus bits. */ + decode_mangitude_tcq_fx( pardec, band_width[k_sort[k]], pulsesnum, nz, &positions[band_start[k_sort[k]]], &inp_vector[band_start[k_sort[k]]], &surplus_fx ); + decode_signs_fx( pardec, band_width[k_sort[k]], &inp_vector[band_start[k_sort[k]]] ); + } + else if ( Rk_fx[k_sort[k]] > 0 && USQ_TCQ[k_sort[k]] == 1 ) + { + pulsesnum = GetScale_fx( band_width[k_sort[k]], Rk_fx[k_sort[k]], &surplus_fx ); + + decode_position_ari_fx( pardec, band_width[k_sort[k]], pulsesnum, &nz, &positions[band_start[k_sort[k]]] ); + /* decode usq magnitude and don't need to update surplus bits */ + decode_magnitude_usq_fx( pardec, band_width[k_sort[k]], pulsesnum, nz, &positions[band_start[k_sort[k]]], &inp_vector[band_start[k_sort[k]]] ); + decode_signs_fx( pardec, band_width[k_sort[k]], &inp_vector[band_start[k_sort[k]]] ); + } + else + { + pulsesnum = 0; + for ( i = 0; i < band_width[k_sort[k]]; i++ ) + { + inp_vector[band_start[k_sort[k]] + i] = 0; + } + } + npulses[k_sort[k]] = pulsesnum; + } + } + } + } + else + { + for ( k = 0; k < BANDS; k++ ) + { + if ( Rk_fx[k_sort[k]] > 0 ) + { + pulsesnum = GetScale_fx( band_width[k_sort[k]], Rk_fx[k_sort[k]] + delta_fx, &surplus_fx ); + + decode_position_ari_fx( pardec, band_width[k_sort[k]], pulsesnum, &nz, &positions[band_start[k_sort[k]]] ); + + /*decode usq magnitude and don't need to update surplus bits*/ + decode_magnitude_usq_fx( pardec, band_width[k_sort[k]], pulsesnum, nz, &positions[band_start[k_sort[k]]], &inp_vector[band_start[k_sort[k]]] ); + decode_signs_fx( pardec, band_width[k_sort[k]], &inp_vector[band_start[k_sort[k]]] ); + +#define WMC_TOOL_SKIP + nzbands = sub( nzbands, 1 ); +#undef WMC_TOOL_SKIP + } + else + { + pulsesnum = 0; + for ( i = 0; i < band_width[k_sort[k]]; i++ ) + { + inp_vector[band_start[k_sort[k]] + i] = 0; + } + } + + npulses[k_sort[k]] = pulsesnum; + + /* surplus distribution */ + if ( surplus_fx > 0 && nzbands > 0 ) + { + delta_fx = ar_div( surplus_fx, nzbands ); + surplus_fx = L_sub( surplus_fx, delta_fx ); + } + } + } + /* Load TCQ path from bitstream */ + LoadTCQdata( pardec, dpath, lsbtcq_bits ); + + TCQLSBdec( dpath, mbuffer, 2 * lsbtcq_bits ); + + ar_decoder_done( pardec ); + + /* Restore TCQ */ + if ( !flag_wbnb ) + { + for ( k = 0; k < BANDS; k++ ) + { + if ( Rk_fx[k_sort[k]] > 0 ) + { + RestoreTCQdec( &inp_vector[band_start[k_sort[k]]], band_width[k_sort[k]], &bcount, mbuffer ); + } + } + } + else + { + for ( k = 0; k < BANDS; k++ ) + { + if ( Rk_fx[k_sort[k]] > 0 && k != k_num[0] && k != k_num[1] ) + { + RestoreTCQdec( &inp_vector[band_start[k_sort[k]]], band_width[k_sort[k]], &bcount, mbuffer ); + } + } + for ( k = 0; k < BANDS; k++ ) + { + if ( Rk_fx[k_sort[k]] > 0 && ( k == k_num[0] || k == k_num[1] ) ) + { + RestoreTCQdec( &inp_vector[band_start[k_sort[k]]], band_width[k_sort[k]], &bcount, mbuffer ); + } + } + } + + + return; +} diff --git a/lib_dec/tcx_utils_dec.c b/lib_dec/tcx_utils_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..e2dc05a8a2c7185d67905e3e7198c1a8128f5b1a --- /dev/null +++ b/lib_dec/tcx_utils_dec.c @@ -0,0 +1,300 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include "options.h" +#include "cnst.h" +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*--------------------------------------------------------------- + * tcx_decoder_memory_update() + * + * + *--------------------------------------------------------------*/ + +void tcx_decoder_memory_update( + Decoder_State *st, /* i/o: decoder memory state */ + const float *xn_buf, /* i/o: mdct output buffer used also as temporary buffer */ + float *synthout, /* o : synth */ + const float *A /* i : Quantized LPC coefficients */ +) +{ + int16_t L_frame_glob; + float tmp; + float *synth; + float buf[1 + M + L_FRAME_PLUS]; + float preemph_f = st->preemph_fac; + + L_frame_glob = st->L_frame; + + /*TCX must be aligned with ACELP*/ + assert( st->hTcxCfg->lfacNext <= 0 ); + + /* Output synth */ + mvr2r( xn_buf, synthout, L_frame_glob ); + + /* Update synth */ + synth = buf + 1 + M; + mvr2r( st->syn, buf, 1 + M ); + mvr2r( xn_buf, synth, L_frame_glob ); + mvr2r( synth + L_frame_glob - M - 1, st->syn, 1 + M ); + + /* Emphasis of synth -> synth_pe */ + tmp = synth[-M - 1]; + preemph( synth - M, preemph_f, M + L_frame_glob, &tmp ); + + mvr2r( synth + L_frame_glob - M, st->mem_syn2, M ); + mvr2r( synth + L_frame_glob - L_SYN_MEM, st->mem_syn_r, L_SYN_MEM ); + + if ( st->element_mode != IVAS_CPE_MDCT ) + { + if ( !st->tcxonly || L_frame_glob == L_FRAME16k ) + { + /* Update excitation */ + assert( L_frame_glob < L_EXC_MEM_DEC ); + mvr2r( st->old_exc + ( L_frame_glob ), st->old_exc, L_EXC_MEM_DEC - ( L_frame_glob ) ); + residu( A, M, synth, st->old_exc + L_EXC_MEM_DEC - ( L_frame_glob ), ( L_frame_glob ) ); + } + + /* Update old_Aq */ + mvr2r( A, st->old_Aq_12_8, M + 1 ); + } + + return; +} + +/*--------------------------------------------------------------- + * tcx_ari_res_invQ_spec() + * + * Residual Quantization + *--------------------------------------------------------------*/ + +/*! r: number of bits used (including "bits") */ +int16_t tcx_ari_res_invQ_spec( + float x_Q[], /* i/o: quantized spectrum */ + const int16_t L_frame, /* i : number of lines */ + const int16_t prm[], /* i : bitstream */ + int16_t target_bits, /* i : number of bits available */ + int16_t bits, /* i : number of bits used so far */ + const float deadzone, /* i : quantizer deadzone */ + const float x_fac[] /* i : spectrum post-quantization factors */ +) +{ + int16_t i, j, num_zeros; + int16_t zeros[L_FRAME_PLUS]; + float fac_m, fac_p, sign; + + /* Limit the number of residual bits */ + target_bits = min( target_bits, NPRM_RESQ ); + + /* Requantize the spectrum line-by-line */ + fac_m = deadzone * 0.5f; + num_zeros = 0; + for ( i = 0; i < L_frame; ++i ) + { + if ( bits >= target_bits ) + { + /* no bits left */ + break; + } + if ( x_Q[i] != 0 ) + { + if ( x_Q[i] > 0 ) + { + sign = x_fac[i]; + } + else + { + sign = -x_fac[i]; + } + + x_Q[i] += sign * ( prm[bits++] * 0.5f - fac_m ); + } + else + { + zeros[num_zeros++] = i; + } + } + + /* Requantize zeroed-lines of the spectrum */ + fac_p = ( 1.0f - deadzone ) * 0.33f * 2.0f; + --target_bits; /* reserve 1 bit for the check below */ + for ( j = 0; j < num_zeros; ++j ) + { + if ( bits >= target_bits ) + { + /* 1 or 0 bits left */ + break; + } + + i = zeros[j]; + + if ( prm[bits++] != 0 ) + { + x_Q[i] = ( 2 * prm[bits++] - 1 ) * fac_p * x_fac[i]; + } + } + + return bits; +} + + +/*--------------------------------------------------------------- + * tcx_res_invQ_gain() + * + * + *--------------------------------------------------------------*/ + +int16_t tcx_res_invQ_gain( + float *gain_tcx, + const int16_t *prm, + const int16_t resQBits ) +{ + int16_t bits; + + /*Refine the gain quantization*/ + for ( bits = 0; bits < min( resQBits, TCX_RES_Q_BITS_GAIN ); bits++ ) + { + if ( prm[bits] == 0 ) + { + *gain_tcx = ( *gain_tcx ) * gain_corr_inv_fac[bits]; + } + else + { + *gain_tcx = ( *gain_tcx ) * gain_corr_fac[bits]; + } + } + + return ( bits ); +} + + +/*--------------------------------------------------------------- + * tcx_res_invQ_spec() + * + * + *--------------------------------------------------------------*/ + +int16_t tcx_res_invQ_spec( + float *x, + const int16_t L_frame, + const int16_t *prm, + int16_t resQBits, + int16_t bits, + const float sq_round, + const float lf_deemph_factors[] ) +{ + int16_t i; + float fac_m, fac_p, thres; + + /* Limit the number of residual bits */ + resQBits = min( resQBits, NPRM_RESQ ); + + /* Requantize the spectrum line-by-line */ + fac_p = 0.5f - sq_round * 0.5f; + fac_m = sq_round * 0.5f; + if ( !lf_deemph_factors ) + { + for ( i = 0; ( i < L_frame ) && ( bits < resQBits ); i++ ) + { + /* bits < resQBits */ + if ( x[i] != 0.0f ) + { + if ( prm[bits++] == 0 ) + { + x[i] -= ( x[i] > 0.0f ) ? fac_m : fac_p; + } + else + { + x[i] += ( x[i] > 0.0f ) ? fac_p : fac_m; + } + } + } + resQBits--; /* Quantize zeroed lines of the spectrum */ + for ( i = 0; ( i < L_frame ) && ( bits < resQBits ); i++ ) + { + if ( x[i] == 0.0f ) + { + if ( prm[bits++] != 0 ) + { + x[i] = ( prm[bits++] * 2.64f - 1.32f ) * fac_p; + } + } + } + + return bits; + } + for ( i = 0; i < L_frame; i++ ) + { + if ( bits >= resQBits ) + { + break; + } + if ( x[i] != 0.f && lf_deemph_factors[i] > 0.5f ) + { + if ( prm[bits++] == 0 ) + { + x[i] -= ( x[i] > 0 ) ? fac_m * lf_deemph_factors[i] : fac_p * lf_deemph_factors[i]; + } + else + { + x[i] += ( x[i] > 0 ) ? fac_p * lf_deemph_factors[i] : fac_m * lf_deemph_factors[i]; + } + } + } + + /*Quantize zeroed-line of the spectrum*/ + for ( i = 0; i < L_frame; i++ ) + { + if ( bits >= ( resQBits - 1 ) ) /*need at least two bits*/ + { + break; + } + if ( x[i] == 0.f && lf_deemph_factors[i] > 0.5f ) + { + if ( prm[bits++] == 1 ) + { + thres = ( 1 - sq_round ) * 0.66f * lf_deemph_factors[i]; + x[i] = ( prm[bits++] * 2.f - 1.f ) * thres; + } + } + } + + return bits; +} diff --git a/lib_dec/tns_base_dec.c b/lib_dec/tns_base_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..444c465042ed8232f18414ca6b69a8355b0a9b8c --- /dev/null +++ b/lib_dec/tns_base_dec.c @@ -0,0 +1,143 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "stat_com.h" +#include "wmc_auto.h" + + +/*---------------------------------------------------------------------* + * ReadTnsData() + * + * + *---------------------------------------------------------------------*/ + +void ReadTnsData( + STnsConfig const *pTnsConfig, + Decoder_State *st, + int16_t *pnBits, + int16_t *stream, + int16_t *pnSize ) +{ + int16_t start_bit_pos; + + start_bit_pos = st->next_bit_pos; + if ( pTnsConfig->nMaxFilters > 1 ) + { + if ( pTnsConfig->allowTnsOnWhite ) + { + if ( pTnsConfig->iFilterBorders[0] < 512 ) + { + ReadFromBitstream( &tnsEnabledOnWhiteSWBTCX10BitMap, 1, st, &stream, pnSize ); + } + else + { + ReadFromBitstream( &tnsEnabledOnWhiteSWBTCX20BitMap, 1, st, &stream, pnSize ); + } + } + else + { + if ( pTnsConfig->iFilterBorders[0] < 512 ) + { + ReadFromBitstream( &tnsEnabledSWBTCX10BitMap, 1, st, &stream, pnSize ); + } + else + { + ReadFromBitstream( &tnsEnabledSWBTCX20BitMap, 1, st, &stream, pnSize ); + } + } + } + else + { + ReadFromBitstream( &tnsEnabledWBTCX20BitMap, 1, st, &stream, pnSize ); + } + + *pnBits = st->next_bit_pos - start_bit_pos; + + return; +} + + +/*---------------------------------------------------------------------* + * DecodeTnsData() + * + * + *---------------------------------------------------------------------*/ + +int16_t DecodeTnsData( + STnsConfig const *pTnsConfig, + const int16_t *stream, + int16_t *pnSize, + STnsData *pTnsData ) +{ + ResetTnsData( pTnsData ); + + if ( pTnsConfig->nMaxFilters > 1 ) + { + if ( pTnsConfig->allowTnsOnWhite ) + { + if ( pTnsConfig->iFilterBorders[0] < 512 ) + { + SetParameters( &tnsEnabledOnWhiteSWBTCX10BitMap, 1, pTnsData, &stream, pnSize ); + } + else + { + SetParameters( &tnsEnabledOnWhiteSWBTCX20BitMap, 1, pTnsData, &stream, pnSize ); + } + } + else + { + if ( pTnsConfig->iFilterBorders[0] < 512 ) + { + SetParameters( &tnsEnabledSWBTCX10BitMap, 1, pTnsData, &stream, pnSize ); + } + else + { + SetParameters( &tnsEnabledSWBTCX20BitMap, 1, pTnsData, &stream, pnSize ); + } + } + } + else + { + SetParameters( &tnsEnabledWBTCX20BitMap, 1, pTnsData, &stream, pnSize ); + } + + return ( pTnsData->nFilters > 0 ) ? TRUE : FALSE; +} diff --git a/lib_dec/tonalMDCTconcealment.c b/lib_dec/tonalMDCTconcealment.c new file mode 100644 index 0000000000000000000000000000000000000000..56bae2137079b84bc6a20736a63acb9defb08cae --- /dev/null +++ b/lib_dec/tonalMDCTconcealment.c @@ -0,0 +1,1173 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#define _USE_MATH_DEFINES + +#include +#include +#include "options.h" +#include +#include "prot.h" +#include "ivas_prot.h" +#include "wmc_auto.h" + + +/*******************************************************/ +/*-------------- public functions -------------------- */ +/*******************************************************/ + +ivas_error TonalMDCTConceal_Init( + TonalMDCTConcealPtr hTonalMDCTConc, + const uint16_t nSamples, + const uint16_t nSamplesCore, + const uint16_t nScaleFactors, + TCX_CONFIG_HANDLE hTcxCfg ) +{ + if ( nSamples > L_FRAME_MAX || nScaleFactors > FDNS_NPTS ) + { + assert( nSamples <= L_FRAME_MAX ); + assert( nScaleFactors <= FDNS_NPTS ); + return ( IVAS_ERROR( IVAS_ERR_INTERNAL, "TonalMDCT FEC: Number of samples larger than max. block size\n" ) ); + } + assert( ( hTonalMDCTConc->nScaleFactors == nScaleFactors ) || ( hTonalMDCTConc->nSamples != nSamples ) ); /* If nSamples doesn't change then also nScaleFactors must stay the same */ + + hTonalMDCTConc->tcx_cfg = hTcxCfg; + hTonalMDCTConc->lastBlockData.spectralData = hTonalMDCTConc->spectralDataBuffers[0]; + hTonalMDCTConc->secondLastBlockData.spectralData = hTonalMDCTConc->spectralDataBuffers[1]; + hTonalMDCTConc->secondLastPowerSpectrum = hTonalMDCTConc->secondLastBlockData.spectralData; + hTonalMDCTConc->lastBlockData.scaleFactors = hTonalMDCTConc->scaleFactorsBuffers[0]; + hTonalMDCTConc->secondLastBlockData.scaleFactors = hTonalMDCTConc->scaleFactorsBuffers[1]; + hTonalMDCTConc->lastBlockData.blockIsValid = 0; + hTonalMDCTConc->secondLastBlockData.blockIsValid = 0; + hTonalMDCTConc->nSamples = 0; + hTonalMDCTConc->nScaleFactors = 0; + + hTonalMDCTConc->lastBlockData.blockIsConcealed = 0; + hTonalMDCTConc->secondLastBlockData.blockIsConcealed = 0; + hTonalMDCTConc->pTCI = (TonalComponentsInfo *) hTonalMDCTConc->timeDataBuffer; + + hTonalMDCTConc->lastPitchLag = 0; + + if ( hTonalMDCTConc->nSamples != nSamples ) + { + hTonalMDCTConc->secondLastBlockData.blockIsValid = 0; + hTonalMDCTConc->lastBlockData.blockIsValid = 0; + } + hTonalMDCTConc->nSamples = nSamples; + hTonalMDCTConc->nSamplesCore = nSamplesCore; + hTonalMDCTConc->nScaleFactors = nScaleFactors; + + set_zero( hTonalMDCTConc->scaleFactorsBackground, FDNS_NPTS ); + hTonalMDCTConc->scf_fadeout = 1.0f; + PsychoacousticParameters_Init( INT_FS_16k, L_FRAME16k, 64, 1, 1, &hTonalMDCTConc->psychParamsTCX20 ); + PsychoacousticParameters_Init( INT_FS_16k, L_FRAME16k / 2, 64, 0, 1, &hTonalMDCTConc->psychParamsTCX10 ); + hTonalMDCTConc->psychParams = NULL; + + hTonalMDCTConc->last_block_nrg = 0.0f; + hTonalMDCTConc->curr_noise_nrg = 0.0f; + hTonalMDCTConc->faded_signal_nrg = 0.0f; + + /* Offset the pointer to the end of buffer, so that pTCI is not destroyed when + new time samples are stored in lastPcmOut */ + /* just the second half of the second last pcm output is needed */ + hTonalMDCTConc->secondLastPcmOut = &hTonalMDCTConc->timeDataBuffer[( 3 * L_FRAME_MAX ) / 2 - ( 3 * min( L_FRAME_MAX, nSamples ) ) / 2]; + hTonalMDCTConc->lastPcmOut = &hTonalMDCTConc->timeDataBuffer[( 3 * L_FRAME_MAX ) / 2 - min( L_FRAME_MAX, nSamples )]; + + /* If the second last frame was lost and concealed with tonal PLC, we + reuse saved TonalComponentsInfo and don't update pcm buffers */ + assert( sizeof( *hTonalMDCTConc->pTCI ) <= ( hTonalMDCTConc->lastPcmOut - hTonalMDCTConc->timeDataBuffer ) * sizeof( hTonalMDCTConc->timeDataBuffer[0] ) ); + + return IVAS_ERR_OK; +} + + +void TonalMDCTConceal_SaveFreqSignal( + TonalMDCTConcealPtr hTonalMDCTConc, + const float *mdctSpectrum, + const uint16_t nNewSamples, + const uint16_t nNewSamplesCore, + const float *scaleFactors, + const int16_t infoIGFStartLine ) +{ + float *temp; + uint16_t nOldSamples; + + assert( nNewSamples > 0 && nNewSamples <= 2 * L_FRAME_MAX ); + + /* Avoid overwriting hTonalMDCTConc->secondLastPowerSpectrum stored in spectralData, + because it is needed if the second last and the current frame are lost + and concealed using the Tonal MDCT PLC */ + if ( !hTonalMDCTConc->lastBlockData.tonalConcealmentActive || ( hTonalMDCTConc->lastBlockData.nSamples != nNewSamples ) ) + { + if ( nNewSamples <= L_FRAME_MAX ) + { + /* Shift the buffers */ + temp = hTonalMDCTConc->secondLastBlockData.spectralData; /* Save the pointer */ + hTonalMDCTConc->secondLastBlockData.spectralData = hTonalMDCTConc->lastBlockData.spectralData; + hTonalMDCTConc->lastBlockData.spectralData = temp; + temp = hTonalMDCTConc->secondLastBlockData.scaleFactors; + hTonalMDCTConc->secondLastBlockData.scaleFactors = hTonalMDCTConc->lastBlockData.scaleFactors; + hTonalMDCTConc->lastBlockData.scaleFactors = temp; + } + else + { + /* Order the buffers so that even transition frame can fit in if written into the first buffer */ + hTonalMDCTConc->lastBlockData.spectralData = hTonalMDCTConc->spectralDataBuffers[0]; + hTonalMDCTConc->secondLastBlockData.spectralData = hTonalMDCTConc->spectralDataBuffers[1]; + hTonalMDCTConc->lastBlockData.scaleFactors = hTonalMDCTConc->scaleFactorsBuffers[0]; + hTonalMDCTConc->secondLastBlockData.scaleFactors = hTonalMDCTConc->scaleFactorsBuffers[1]; + } + nOldSamples = hTonalMDCTConc->lastBlockData.nSamples; + hTonalMDCTConc->lastBlockData.nSamples = nNewSamples; + hTonalMDCTConc->secondLastBlockData.nSamples = nOldSamples; + nOldSamples = hTonalMDCTConc->lastBlockData.nSamplesCore; + hTonalMDCTConc->lastBlockData.nSamplesCore = nNewSamplesCore; + hTonalMDCTConc->secondLastBlockData.nSamplesCore = nOldSamples; + } + + if ( ( nNewSamples > 0 ) && ( nNewSamples <= 2 * L_FRAME_MAX ) ) + { + /* Store new data */ + int16_t i; + + hTonalMDCTConc->last_block_nrg = 0.0f; + for ( i = 0; i < infoIGFStartLine; i++ ) + { + hTonalMDCTConc->lastBlockData.spectralData[i] = mdctSpectrum[i]; + hTonalMDCTConc->last_block_nrg += mdctSpectrum[i] * mdctSpectrum[i]; + } + for ( ; i < nNewSamples; i++ ) + { + hTonalMDCTConc->lastBlockData.spectralData[i] = mdctSpectrum[i]; + } + + mvr2r( scaleFactors, hTonalMDCTConc->lastBlockData.scaleFactors, hTonalMDCTConc->nScaleFactors ); + } + + return; +} + + +void TonalMDCTConceal_UpdateState( + TonalMDCTConcealPtr hTonalMDCTConc, + const int16_t nNewSamples, + const float pitchLag, + const int16_t badBlock, + const int16_t tonalConcealmentActive ) +{ + int16_t newBlockIsValid; + + assert( !( !badBlock && tonalConcealmentActive ) ); + + if ( badBlock ) + { + newBlockIsValid = hTonalMDCTConc->lastBlockData.blockIsValid; + } + else + { + newBlockIsValid = ( nNewSamples <= 2 * L_FRAME_MAX ) && ( nNewSamples > 0 ); + } + + /* Shift old state */ + hTonalMDCTConc->secondLastBlockData.blockIsConcealed = hTonalMDCTConc->lastBlockData.blockIsConcealed; + hTonalMDCTConc->secondLastBlockData.blockIsValid = hTonalMDCTConc->lastBlockData.blockIsValid; + hTonalMDCTConc->secondLastBlockData.tonalConcealmentActive = hTonalMDCTConc->lastBlockData.tonalConcealmentActive; + + /* Store new state */ + hTonalMDCTConc->lastBlockData.blockIsConcealed = badBlock; + hTonalMDCTConc->lastBlockData.blockIsValid = newBlockIsValid; + hTonalMDCTConc->lastBlockData.tonalConcealmentActive = tonalConcealmentActive; + hTonalMDCTConc->lastPitchLag = pitchLag; + + return; +} + + +static void FindPhases( + const TonalMDCTConcealPtr hTonalMDCTConc, + const float secondLastMDCT[], + const float secondLastMDST[] ) +{ + int16_t i; + int16_t l; + float *pCurrentPhase; + + pCurrentPhase = hTonalMDCTConc->pTCI->phase_currentFramePredicted; + /* for each index/index group */ + for ( i = 0; i < hTonalMDCTConc->pTCI->numIndexes; i++ ) + { + for ( l = hTonalMDCTConc->pTCI->lowerIndex[i]; l <= hTonalMDCTConc->pTCI->upperIndex[i]; l++ ) + { + *pCurrentPhase++ = (float) atan2( secondLastMDST[l], secondLastMDCT[l] ); + } + } + + return; +} + +#define CNST_bandwidth 7.0f +#define CNST_m (float) cos( EVS_PI / CNST_bandwidth ) +#define CNST_s (float) cos( ( 3 * EVS_PI ) / CNST_bandwidth ) +#define CNST_n (float) sin( EVS_PI / CNST_bandwidth ) +#define CNST_j (float) sin( ( 3 * EVS_PI ) / CNST_bandwidth ) +#define CNST_G (float) ( 1.0 / ( 2 * 1.36 ) ) +#define CNST_maxRatio 44.8f /* Maximum ratio |ODFT[k-1]|/|ODFT[k+1]| is 16.5 dB, that is maximum ratio (for fractional = 0) is (cos(EVS_PI/bandwidth)/cos(3PI/bandwidth))^1.36 */ + + +static void FindPhaseDifferences( + TonalMDCTConcealPtr const hTonalMDCTConc, + float powerSpectrum[] ) +{ + int16_t i, k; + float odft_left, odft_right; + float *phaseDiff; + float fractional; + float Q, a; + + phaseDiff = hTonalMDCTConc->pTCI->phaseDiff; + for ( i = 0; i < hTonalMDCTConc->pTCI->numIndexes; i++ ) + { + k = hTonalMDCTConc->pTCI->indexOfTonalPeak[i]; + odft_left = powerSpectrum[k - 1]; + odft_right = powerSpectrum[k + 1]; + if ( odft_left >= CNST_maxRatio * odft_right ) + { + a = (float) tan( 0.0f * EVS_PI / CNST_bandwidth ); + } + else + { + if ( odft_right >= CNST_maxRatio * odft_left ) + { + a = (float) tan( 2.0f * EVS_PI / CNST_bandwidth ); + } + else + { + Q = (float) pow( odft_left / odft_right, CNST_G ); + a = ( CNST_m - Q * CNST_s ) / ( CNST_n + Q * CNST_j ); + } + } + fractional = (float) atan( a ) * ( CNST_bandwidth / 2.0f ); + assert( ( fractional >= 0 ) && ( fractional <= EVS_PI + 1.192092896e-07F ) ); + phaseDiff[i] = fractional + EVS_PI * ( k % 4 ); + } + + return; +} + +static void CalcPowerSpec( + const float *mdctSpec, + const float *mdstSpec, + const int16_t nSamples, + float floorPowerSpectrum, + float *powerSpec ) +{ + int16_t k; + float x; + + for ( k = 1; k <= nSamples - 2; k++ ) + { + x = mdctSpec[k] * mdctSpec[k] + mdstSpec[k] * mdstSpec[k]; + powerSpec[k] = max( floorPowerSpectrum, x ); + } + powerSpec[0] = 0.5f * powerSpec[1]; + powerSpec[nSamples - 1] = 0.5f * powerSpec[nSamples - 2]; + + return; +} + +static void CalcPowerSpecAndDetectTonalComponents( + const TonalMDCTConcealPtr hTonalMDCTConc, + float secondLastMDST[], + float secondLastMDCT[], + const float pitchLag, + const PsychoacousticParameters *psychParamsCurrent ) +{ + int16_t i, nSamples; + float floorPowerSpectrum; /* Minimum significant value of a spectral line in the power spectrum */ + float powerSpectrum[L_FRAME_MAX]; /* 32 bits are required */ + float invScaleFactors[FDNS_NPTS]; + int16_t nBands; + + nSamples = hTonalMDCTConc->nNonZeroSamples; + + /* It is taken into account that the MDCT is not normalized. */ + floorPowerSpectrum = hTonalMDCTConc->nSamples * hTonalMDCTConc->nSamples / 400.0f; + CalcPowerSpec( secondLastMDCT, secondLastMDST, nSamples, floorPowerSpectrum, powerSpectrum ); + + /* This setting to minimal level is required because the power spectrum is used in the threshold adaptation using the pitch up to hTonalMDCTConc->nSamples. */ + set_f( powerSpectrum + nSamples, floorPowerSpectrum, hTonalMDCTConc->nSamples - nSamples ); + /* this setting to zero is needed since the FDNS needs to be called + with hTonalMDCTConc->nSamplesCore; it relevant only for nb; it has no effect + to the output, but memory checker may complain otherwise due to the + usage of uninitialized values */ + + if ( hTonalMDCTConc->nSamplesCore > hTonalMDCTConc->nSamples ) + { + set_zero( powerSpectrum + hTonalMDCTConc->nSamples, hTonalMDCTConc->nSamplesCore - hTonalMDCTConc->nSamples ); + } + + DetectTonalComponents( hTonalMDCTConc->pTCI->indexOfTonalPeak, hTonalMDCTConc->pTCI->lowerIndex, hTonalMDCTConc->pTCI->upperIndex, &hTonalMDCTConc->pTCI->numIndexes, hTonalMDCTConc->lastPitchLag, pitchLag, + hTonalMDCTConc->lastBlockData.spectralData, hTonalMDCTConc->lastBlockData.scaleFactors, powerSpectrum, nSamples, hTonalMDCTConc->nSamplesCore, floorPowerSpectrum, psychParamsCurrent ); + + FindPhases( hTonalMDCTConc, secondLastMDCT, secondLastMDST ); + + FindPhaseDifferences( hTonalMDCTConc, powerSpectrum ); + + if ( hTonalMDCTConc->pTCI->numIndexes > 0 ) + { + hTonalMDCTConc->secondLastPowerSpectrum = hTonalMDCTConc->secondLastBlockData.spectralData; + + for ( i = 0; i < nSamples; i++ ) + { + powerSpectrum[i] = (float) sqrt( powerSpectrum[i] ); + } + + for ( i = 0; i < hTonalMDCTConc->nScaleFactors; i++ ) + { + invScaleFactors[i] = 1.0f / hTonalMDCTConc->secondLastBlockData.scaleFactors[i]; + } + + if ( psychParamsCurrent == NULL ) + { + nBands = FDNS_NPTS; + mdct_noiseShaping( powerSpectrum, hTonalMDCTConc->nSamplesCore, invScaleFactors, nBands ); + } + else + { + sns_shape_spectrum( powerSpectrum, psychParamsCurrent, invScaleFactors, hTonalMDCTConc->nSamplesCore ); + nBands = psychParamsCurrent->nBands; + } + + v_multc( powerSpectrum + hTonalMDCTConc->nSamplesCore, invScaleFactors[nBands - 1], powerSpectrum + hTonalMDCTConc->nSamplesCore, hTonalMDCTConc->nSamples - hTonalMDCTConc->nSamplesCore ); + mvr2r( powerSpectrum, hTonalMDCTConc->secondLastPowerSpectrum, hTonalMDCTConc->nSamples ); /* 16 bits are now enough for storing the power spectrum */ + } + + return; +} + + +static void CalcMDXT( + const TonalMDCTConcealPtr hTonalMDCTConc, + const char type, + const float *timeSignal, + float *mdxtOutput ) +{ + float windowedTimeSignal[L_FRAME_PLUS + 2 * L_MDCT_OVLP_MAX]; + int16_t left_overlap, right_overlap; + int16_t L_frame; + + L_frame = hTonalMDCTConc->nSamples; + WindowSignal( hTonalMDCTConc->tcx_cfg, hTonalMDCTConc->tcx_cfg->tcx_offsetFB, FULL_OVERLAP, FULL_OVERLAP, &left_overlap, &right_overlap, timeSignal, &L_frame, windowedTimeSignal, 1, 1 ); + + if ( type == 'S' ) + { + TCX_MDST( windowedTimeSignal, mdxtOutput, left_overlap, L_frame - ( left_overlap + right_overlap ) / 2, right_overlap, EVS_MONO ); + } + else + { + TCX_MDCT( windowedTimeSignal, mdxtOutput, left_overlap, L_frame - ( left_overlap + right_overlap ) / 2, right_overlap, EVS_MONO ); + } + + return; +} + + +void TonalMDCTConceal_Detect( + const TonalMDCTConcealPtr hTonalMDCTConc, + const float pitchLag, + int16_t *numIndices, + const PsychoacousticParameters *psychParamsCurrent ) +{ + float secondLastMDST[L_FRAME_MAX]; /* 32 bits are required */ + float secondLastMDCT[L_FRAME_MAX]; /* 32 bits are required */ + float *powerSpectrum = secondLastMDST; + int16_t i, nSamples; + int16_t nBands; + + nSamples = hTonalMDCTConc->nSamples; + if ( hTonalMDCTConc->lastBlockData.blockIsValid && hTonalMDCTConc->secondLastBlockData.blockIsValid && ( hTonalMDCTConc->lastBlockData.nSamples == nSamples ) && ( hTonalMDCTConc->secondLastBlockData.nSamples == nSamples ) && ( !hTonalMDCTConc->secondLastBlockData.blockIsConcealed || hTonalMDCTConc->secondLastBlockData.tonalConcealmentActive || ( pitchLag != 0 ) ) ) + { + /* Safety if the second last frame was concealed and tonal concealment was inactive */ + + if ( !hTonalMDCTConc->lastBlockData.blockIsConcealed ) + { + if ( !hTonalMDCTConc->secondLastBlockData.tonalConcealmentActive ) + { + CalcMDXT( hTonalMDCTConc, 'S', hTonalMDCTConc->secondLastPcmOut, secondLastMDST ); + CalcMDXT( hTonalMDCTConc, 'C', hTonalMDCTConc->secondLastPcmOut, secondLastMDCT ); + hTonalMDCTConc->nNonZeroSamples = 0; + for ( i = 0; i < hTonalMDCTConc->nSamples; i++ ) + { + if ( hTonalMDCTConc->secondLastBlockData.spectralData[i] != 0 ) + { + hTonalMDCTConc->nNonZeroSamples = i; + } + } + /* 23 is the maximum length of the MA filter in getEnvelope */ + hTonalMDCTConc->nNonZeroSamples = min( hTonalMDCTConc->nSamples, hTonalMDCTConc->nNonZeroSamples + 23 ); + CalcPowerSpecAndDetectTonalComponents( hTonalMDCTConc, secondLastMDST, secondLastMDCT, pitchLag, psychParamsCurrent ); + } + else + { + /* If the second last frame was also lost, it is expected that pastTimeSignal could hold a bit different signal (e.g. including fade-out) from the one stored in TonalMDCTConceal_SaveTimeSignal. */ + /* That is why we reuse the already stored information about the concealed spectrum in the second last frame */ + nSamples = hTonalMDCTConc->nNonZeroSamples; + mvr2r( hTonalMDCTConc->secondLastPowerSpectrum, powerSpectrum, nSamples ); /* Convert from 16 bits to 32 bits */ + if ( psychParamsCurrent == NULL ) + { + nBands = FDNS_NPTS; + mdct_noiseShaping( powerSpectrum, hTonalMDCTConc->nSamplesCore, hTonalMDCTConc->secondLastBlockData.scaleFactors, nBands ); + } + else + { + sns_shape_spectrum( powerSpectrum, psychParamsCurrent, hTonalMDCTConc->secondLastBlockData.scaleFactors, hTonalMDCTConc->nSamplesCore ); + nBands = psychParamsCurrent->nBands; + } + + v_multc( powerSpectrum + hTonalMDCTConc->nSamplesCore, hTonalMDCTConc->secondLastBlockData.scaleFactors[nBands - 1], powerSpectrum + hTonalMDCTConc->nSamplesCore, nSamples - hTonalMDCTConc->nSamplesCore ); + v_mult( powerSpectrum, powerSpectrum, powerSpectrum, nSamples ); + + RefineTonalComponents( hTonalMDCTConc->pTCI->indexOfTonalPeak, hTonalMDCTConc->pTCI->lowerIndex, hTonalMDCTConc->pTCI->upperIndex, hTonalMDCTConc->pTCI->phaseDiff, + hTonalMDCTConc->pTCI->phase_currentFramePredicted, &hTonalMDCTConc->pTCI->numIndexes, hTonalMDCTConc->lastPitchLag, pitchLag, + hTonalMDCTConc->lastBlockData.spectralData, hTonalMDCTConc->lastBlockData.scaleFactors, powerSpectrum, + nSamples, hTonalMDCTConc->nSamplesCore, hTonalMDCTConc->nSamples * hTonalMDCTConc->nSamples / 400.0f /* floorPowerSpectrum */, psychParamsCurrent ); + } + } + } + else + { + hTonalMDCTConc->pTCI->numIndexes = 0; + } + + *numIndices = hTonalMDCTConc->pTCI->numIndexes; + + return; +} + + +void TonalMDCTConceal_InsertNoise( + const TonalMDCTConcealPtr hTonalMDCTConc, /*IN */ + float *mdctSpectrum, /*OUT*/ + const int16_t tonalConcealmentActive, + int16_t *pSeed, + const float tiltCompFactor, + const float crossfadeGain, + const float concealment_noise[L_FRAME48k], + const float cngLevelBackgroundTrace_bfi, + const int16_t crossOverFreq ) +{ + int16_t i, l; + float x, y; + Word16 rnd; + float g, nrgNoiseInLastFrame, nrgWhiteNoise, tiltFactor, tilt; + float last_block_nrg_correct; + + push_wmops( "InsertNoise" ); + + g = 1.0f - crossfadeGain; + if ( !hTonalMDCTConc->lastBlockData.blockIsConcealed ) + { + rnd = 1977; + } + else + { + rnd = *pSeed; + } + + /* based on what is done in tcx_noise_filling() */ + /* always initialize these to avoid compiler warnings */ + tiltFactor = (float) pow( max( 0.375f, tiltCompFactor ), 1.0f / hTonalMDCTConc->lastBlockData.nSamples ); + tilt = 1.0f; + nrgNoiseInLastFrame = 0.0f; + nrgWhiteNoise = 0.0f; + hTonalMDCTConc->faded_signal_nrg = 0.0f; + last_block_nrg_correct = 0.0f; + + if ( !hTonalMDCTConc->lastBlockData.blockIsValid ) + { + /* may just become active if the very first frame is lost */ + set_f( mdctSpectrum, 0.0f, hTonalMDCTConc->nSamples ); + } + else if ( concealment_noise != NULL ) + { + if ( !tonalConcealmentActive ) + { + /* if fadeout has not started yet, only apply sign scrambling */ + if ( crossfadeGain == 1.0f ) + { + for ( i = 0; i < crossOverFreq; i++ ) + { + if ( concealment_noise[i] > 0 ) + { + mdctSpectrum[i] = hTonalMDCTConc->lastBlockData.spectralData[i]; + } + else + { + mdctSpectrum[i] = -hTonalMDCTConc->lastBlockData.spectralData[i]; + } + } + + for ( l = crossOverFreq; l < hTonalMDCTConc->lastBlockData.nSamples; l++ ) + { + mdctSpectrum[l] = hTonalMDCTConc->lastBlockData.spectralData[l]; + } + } + /* actual fadeout is done in this case */ + else + { + g *= (float) sqrt( cngLevelBackgroundTrace_bfi / hTonalMDCTConc->curr_noise_nrg ); + + for ( i = 0; i < crossOverFreq; i++ ) + { + x = hTonalMDCTConc->lastBlockData.spectralData[i]; + y = concealment_noise[i]; + + if ( y > 0 ) + { + mdctSpectrum[i] = g * y + crossfadeGain * x; + } + else + { + mdctSpectrum[i] = g * y - crossfadeGain * x; + } + + hTonalMDCTConc->faded_signal_nrg += mdctSpectrum[i] * mdctSpectrum[i]; + } + for ( l = crossOverFreq; l < hTonalMDCTConc->lastBlockData.nSamples; l++ ) + { + mdctSpectrum[l] = 0.0f; + } + } + } + else + { + assert( hTonalMDCTConc->pTCI->numIndexes > 0 ); + + /* initialize bins of tonal components with zero: basically not + necessary, but currently the whole spectrum is rescaled in + mdct_noiseShaping() and then there would be a processing of + uninitialized values */ + for ( i = 0; i < hTonalMDCTConc->pTCI->numIndexes; i++ ) + { + for ( l = hTonalMDCTConc->pTCI->lowerIndex[i]; l <= hTonalMDCTConc->pTCI->upperIndex[i]; l++ ) + { + mdctSpectrum[l] = 0; + if ( l < crossOverFreq ) + { + last_block_nrg_correct += hTonalMDCTConc->lastBlockData.spectralData[l] * hTonalMDCTConc->lastBlockData.spectralData[l]; + hTonalMDCTConc->curr_noise_nrg -= concealment_noise[l] * concealment_noise[l]; + } + } + } + + /* if fadeout has not started yet, only apply sign scrambling */ + if ( crossfadeGain == 1.0f ) + { + for ( l = 0; l < hTonalMDCTConc->pTCI->lowerIndex[0]; l++ ) + { + if ( concealment_noise[l] > 0 ) + { + mdctSpectrum[l] = hTonalMDCTConc->lastBlockData.spectralData[l]; + } + else + { + mdctSpectrum[l] = -hTonalMDCTConc->lastBlockData.spectralData[l]; + } + } + for ( i = 1; i < hTonalMDCTConc->pTCI->numIndexes; i++ ) + { + for ( l = hTonalMDCTConc->pTCI->upperIndex[i - 1] + 1; l < hTonalMDCTConc->pTCI->lowerIndex[i]; l++ ) + { + if ( concealment_noise[l] > 0 ) + { + mdctSpectrum[l] = hTonalMDCTConc->lastBlockData.spectralData[l]; + } + else + { + mdctSpectrum[l] = -hTonalMDCTConc->lastBlockData.spectralData[l]; + } + } + } + + for ( l = hTonalMDCTConc->pTCI->upperIndex[hTonalMDCTConc->pTCI->numIndexes - 1] + 1; l < crossOverFreq; l++ ) + { + if ( concealment_noise[l] > 0 ) + { + mdctSpectrum[l] = hTonalMDCTConc->lastBlockData.spectralData[l]; + } + else + { + mdctSpectrum[l] = -hTonalMDCTConc->lastBlockData.spectralData[l]; + } + } + + for ( l = crossOverFreq; l < hTonalMDCTConc->lastBlockData.nSamples; l++ ) + { + mdctSpectrum[l] = hTonalMDCTConc->lastBlockData.spectralData[l]; + } + } + /* actual fadeout is done in this case */ + else + { + g *= (float) sqrt( cngLevelBackgroundTrace_bfi / hTonalMDCTConc->curr_noise_nrg ); + + for ( l = 0; l < hTonalMDCTConc->pTCI->lowerIndex[0]; l++ ) + { + x = hTonalMDCTConc->lastBlockData.spectralData[l]; + y = concealment_noise[l]; + + if ( y > 0 ) + { + mdctSpectrum[l] = g * y + crossfadeGain * x; + } + else + { + mdctSpectrum[l] = g * y - crossfadeGain * x; + } + hTonalMDCTConc->faded_signal_nrg += mdctSpectrum[l] * mdctSpectrum[l]; + } + for ( i = 1; i < hTonalMDCTConc->pTCI->numIndexes; i++ ) + { + for ( l = hTonalMDCTConc->pTCI->upperIndex[i - 1] + 1; l < hTonalMDCTConc->pTCI->lowerIndex[i]; l++ ) + { + x = hTonalMDCTConc->lastBlockData.spectralData[l]; + y = concealment_noise[l]; + + if ( y > 0 ) + { + mdctSpectrum[l] = g * y + crossfadeGain * x; + } + else + { + mdctSpectrum[l] = g * y - crossfadeGain * x; + } + hTonalMDCTConc->faded_signal_nrg += mdctSpectrum[l] * mdctSpectrum[l]; + } + } + + for ( l = hTonalMDCTConc->pTCI->upperIndex[hTonalMDCTConc->pTCI->numIndexes - 1] + 1; l < crossOverFreq; l++ ) + { + x = hTonalMDCTConc->lastBlockData.spectralData[l]; + y = concealment_noise[l]; + + if ( y > 0 ) + { + mdctSpectrum[l] = g * y + crossfadeGain * x; + } + else + { + mdctSpectrum[l] = g * y - crossfadeGain * x; + } + hTonalMDCTConc->faded_signal_nrg += mdctSpectrum[l] * mdctSpectrum[l]; + } + + for ( l = crossOverFreq; l < hTonalMDCTConc->lastBlockData.nSamples; l++ ) + { + mdctSpectrum[l] = 0.0f; + } + } + } + + if ( hTonalMDCTConc->faded_signal_nrg > 0.0f && hTonalMDCTConc->curr_noise_nrg > MDCT_ST_PLC_FADEOUT_MIN_NOISE_NRG ) + { + float nrg_corr_factor; + + nrg_corr_factor = sqrtf( ( hTonalMDCTConc->last_block_nrg - last_block_nrg_correct ) / hTonalMDCTConc->faded_signal_nrg ); + v_multc( mdctSpectrum, nrg_corr_factor, mdctSpectrum, crossOverFreq ); + } + } + else + { + if ( !tonalConcealmentActive ) + { + for ( i = 0; i < crossOverFreq; i++ ) + { + x = hTonalMDCTConc->lastBlockData.spectralData[i]; + nrgNoiseInLastFrame += x * x; + rnd = own_random( &rnd ); + mdctSpectrum[i] = tilt * rnd; + tilt *= tiltFactor; + nrgWhiteNoise += mdctSpectrum[i] * mdctSpectrum[i]; + } + if ( nrgWhiteNoise > 0 ) + { + g *= (float) sqrt( nrgNoiseInLastFrame / nrgWhiteNoise ); + } + for ( i = 0; i < crossOverFreq; i++ ) + { + x = hTonalMDCTConc->lastBlockData.spectralData[i]; + y = mdctSpectrum[i]; + + if ( y > 0 ) + { + mdctSpectrum[i] = g * y + crossfadeGain * x; + } + else + { + mdctSpectrum[i] = g * y - crossfadeGain * x; + } + } + + for ( l = crossOverFreq; l < hTonalMDCTConc->lastBlockData.nSamples; l++ ) + { + mdctSpectrum[l] = hTonalMDCTConc->lastBlockData.spectralData[l]; + } + } + else + { + assert( hTonalMDCTConc->pTCI->numIndexes > 0 ); + for ( l = 0; l < hTonalMDCTConc->pTCI->lowerIndex[0]; l++ ) + { + x = hTonalMDCTConc->lastBlockData.spectralData[l]; + rnd = own_random( &rnd ); + mdctSpectrum[l] = tilt * rnd; + tilt *= tiltFactor; + nrgNoiseInLastFrame += x * x; + nrgWhiteNoise += mdctSpectrum[l] * mdctSpectrum[l]; + } + + for ( i = 1; i < hTonalMDCTConc->pTCI->numIndexes; i++ ) + { + tilt *= (float) pow( tiltFactor, hTonalMDCTConc->pTCI->upperIndex[i - 1] - hTonalMDCTConc->pTCI->lowerIndex[i - 1] + 1 ); + for ( l = hTonalMDCTConc->pTCI->upperIndex[i - 1] + 1; l < hTonalMDCTConc->pTCI->lowerIndex[i]; l++ ) + { + x = hTonalMDCTConc->lastBlockData.spectralData[l]; + rnd = own_random( &rnd ); + mdctSpectrum[l] = tilt * rnd; + tilt *= tiltFactor; + nrgNoiseInLastFrame += x * x; + nrgWhiteNoise += mdctSpectrum[l] * mdctSpectrum[l]; + } + } + tilt *= (float) pow( tiltFactor, hTonalMDCTConc->pTCI->upperIndex[hTonalMDCTConc->pTCI->numIndexes - 1] - hTonalMDCTConc->pTCI->lowerIndex[hTonalMDCTConc->pTCI->numIndexes - 1] + 1 ); + + for ( l = hTonalMDCTConc->pTCI->upperIndex[hTonalMDCTConc->pTCI->numIndexes - 1] + 1; l < crossOverFreq; l++ ) + { + x = hTonalMDCTConc->lastBlockData.spectralData[l]; + rnd = own_random( &rnd ); + mdctSpectrum[l] = tilt * rnd; + tilt *= tiltFactor; + nrgNoiseInLastFrame += x * x; + nrgWhiteNoise += mdctSpectrum[l] * mdctSpectrum[l]; + } + if ( nrgWhiteNoise > 0 ) + { + g *= (float) sqrt( nrgNoiseInLastFrame / nrgWhiteNoise ); + } + for ( l = 0; l < hTonalMDCTConc->pTCI->lowerIndex[0]; l++ ) + { + x = hTonalMDCTConc->lastBlockData.spectralData[l]; + y = mdctSpectrum[l]; + + if ( y > 0 ) + { + mdctSpectrum[l] = g * y + crossfadeGain * x; + } + else + { + mdctSpectrum[l] = g * y - crossfadeGain * x; + } + } + for ( i = 1; i < hTonalMDCTConc->pTCI->numIndexes; i++ ) + { + for ( l = hTonalMDCTConc->pTCI->upperIndex[i - 1] + 1; l < hTonalMDCTConc->pTCI->lowerIndex[i]; l++ ) + { + x = hTonalMDCTConc->lastBlockData.spectralData[l]; + y = mdctSpectrum[l]; + + if ( y > 0 ) + { + mdctSpectrum[l] = g * y + crossfadeGain * x; + } + else + { + mdctSpectrum[l] = g * y - crossfadeGain * x; + } + } + } + /* initialize bins of tonal components with zero: basically not + necessary, but currently the whole spectrum is rescaled in + mdct_noiseShaping() and then there would be a processing of + uninitialized values */ + for ( i = 0; i < hTonalMDCTConc->pTCI->numIndexes; i++ ) + { + for ( l = hTonalMDCTConc->pTCI->lowerIndex[i]; l <= hTonalMDCTConc->pTCI->upperIndex[i]; l++ ) + { + mdctSpectrum[l] = 0; + } + } + for ( l = hTonalMDCTConc->pTCI->upperIndex[hTonalMDCTConc->pTCI->numIndexes - 1] + 1; l < crossOverFreq; l++ ) + { + x = hTonalMDCTConc->lastBlockData.spectralData[l]; + y = mdctSpectrum[l]; + + if ( y > 0 ) + { + mdctSpectrum[l] = g * y + crossfadeGain * x; + } + else + { + mdctSpectrum[l] = g * y - crossfadeGain * x; + } + } + + for ( l = crossOverFreq; l < hTonalMDCTConc->lastBlockData.nSamples; l++ ) + { + mdctSpectrum[l] = hTonalMDCTConc->lastBlockData.spectralData[l]; + } + } + } + + *pSeed = rnd; + + pop_wmops(); + + return; +} + + +void TonalMDCTConceal_Apply( + TonalMDCTConcealPtr hTonalMDCTConc, /*IN */ + float *mdctSpectrum, /*OUT */ + const PsychoacousticParameters *psychParamsCurrent ) +{ + int16_t i, l; + float *phaseDiff, *pCurrentPhase; + float phaseToAdd; + float powerSpectrum[L_FRAME_MAX]; + int16_t nSamples; + int16_t nBands; + + if ( hTonalMDCTConc->lastBlockData.blockIsValid & hTonalMDCTConc->secondLastBlockData.blockIsValid ) + { + assert( hTonalMDCTConc->pTCI->numIndexes > 0 ); + + nSamples = hTonalMDCTConc->nNonZeroSamples; + assert( hTonalMDCTConc->pTCI->upperIndex[hTonalMDCTConc->pTCI->numIndexes - 1] < nSamples ); + mvr2r( hTonalMDCTConc->secondLastPowerSpectrum, powerSpectrum, nSamples ); /* Convert from 16 bits to 32 bits */ + if ( psychParamsCurrent == NULL ) + { + nBands = FDNS_NPTS; + mdct_noiseShaping( powerSpectrum, hTonalMDCTConc->nSamplesCore, hTonalMDCTConc->secondLastBlockData.scaleFactors, nBands ); + } + else + { + sns_shape_spectrum( powerSpectrum, psychParamsCurrent, hTonalMDCTConc->secondLastBlockData.scaleFactors, hTonalMDCTConc->nSamplesCore ); + nBands = psychParamsCurrent->nBands; + } + + v_multc( powerSpectrum + hTonalMDCTConc->nSamplesCore, hTonalMDCTConc->secondLastBlockData.scaleFactors[nBands - 1], powerSpectrum + hTonalMDCTConc->nSamplesCore, nSamples - hTonalMDCTConc->nSamplesCore ); + + phaseDiff = hTonalMDCTConc->pTCI->phaseDiff; /* if multiple frame loss occurs use the phase from the last frame and continue rotating */ + pCurrentPhase = hTonalMDCTConc->pTCI->phase_currentFramePredicted; + + if ( !hTonalMDCTConc->lastBlockData.blockIsConcealed ) + { + if ( hTonalMDCTConc->secondLastBlockData.tonalConcealmentActive ) + { + hTonalMDCTConc->nFramesLost += 1; + } + else + { + hTonalMDCTConc->nFramesLost = 1.5; + } + } + + /* for each index group */ + for ( i = 0; i < hTonalMDCTConc->pTCI->numIndexes; i++ ) + { + phaseToAdd = hTonalMDCTConc->nFramesLost * phaseDiff[i]; + + /* Move phaseToAdd to range -EVS_PI..EVS_PI */ + while ( phaseToAdd > EVS_PI ) + { + phaseToAdd -= PI2; + } + + while ( phaseToAdd < -EVS_PI ) + { + /* should never occur in flt - kept for safety reasons */ + phaseToAdd += PI2; + } + + for ( l = hTonalMDCTConc->pTCI->lowerIndex[i]; l <= hTonalMDCTConc->pTCI->upperIndex[i]; l++ ) + { + const float currentPhase = ( *pCurrentPhase++ ) + phaseToAdd; /* *pCurrentPhase and phaseToAdd are in range -EVS_PI..EVS_PI */ + mdctSpectrum[l] = (float) cos( currentPhase ) * powerSpectrum[l]; + } + } + } + + hTonalMDCTConc->nFramesLost++; + + return; +} + + +void TonalMDCTConceal_SaveTimeSignal( + TonalMDCTConcealPtr hTonalMDCTConc, + float *timeSignal, + const int16_t nNewSamples ) +{ + if ( nNewSamples == hTonalMDCTConc->nSamples ) + { + assert( nNewSamples <= L_FRAME_MAX ); + + if ( !hTonalMDCTConc->secondLastBlockData.tonalConcealmentActive ) + { + mvr2r( hTonalMDCTConc->lastPcmOut + hTonalMDCTConc->nSamples / 2, hTonalMDCTConc->secondLastPcmOut, hTonalMDCTConc->nSamples / 2 ); + } + + mvr2r( timeSignal, hTonalMDCTConc->lastPcmOut, hTonalMDCTConc->nSamples ); + } + + return; +} + +void TonalMdctConceal_create_concealment_noise( + float concealment_noise[L_FRAME48k], + CPE_DEC_HANDLE hCPE, + const int16_t L_frameTCX, + const int16_t L_frame, + const int16_t idchan, + const int16_t subframe_idx, + const int16_t core, + const float crossfade_gain, + const TONALMDCTCONC_NOISE_GEN_MODE noise_gen_mode ) +{ + STEREO_MDCT_DEC_DATA_HANDLE hStereoMdct; + TonalMDCTConcealPtr hTonalMDCTConc; + Decoder_State *st; + HANDLE_FD_CNG_COM hFdCngCom; + int16_t *rnd_c, *rnd; + int16_t crossOverFreq, i, save_rnd_c, max_noise_line; + float c, c_inv; + float noise_shape_buffer[L_FRAME48k]; + int16_t inc, start_idx, stop_idx; + float *cngNoiseLevelPtr; + float last_scf; + + push_wmops( "create_conc_noise" ); + + hStereoMdct = hCPE->hStereoMdct; + st = hCPE->hCoreCoder[idchan]; + hTonalMDCTConc = st->hTonalMDCTConc; + hFdCngCom = st->hFdCngDec->hFdCngCom; + rnd = &hStereoMdct->noise_seeds_channels[idchan]; + rnd_c = &hStereoMdct->noise_seed_common; + + /* determine start bin for IGF */ + if ( st->igf == 0 ) + { + if ( st->narrowBand == 0 ) + { + /* minimum needed for output with sampling rates lower then the + nominal sampling rate */ + crossOverFreq = min( L_frameTCX, L_frame ); + } + else + { + crossOverFreq = L_frameTCX; + } + } + else + { + crossOverFreq = min( st->hIGFDec->infoIGFStartLine, L_frameTCX ); + } + + /* for tonal mdct concealment with tonal components above the crossover frequency, conditionally raise the frequency index until which noise is generated */ + max_noise_line = crossOverFreq; + if ( st->tonal_mdct_plc_active ) + { + max_noise_line = max( max_noise_line, hTonalMDCTConc->pTCI->upperIndex[hTonalMDCTConc->pTCI->numIndexes - 1] + 1 ); + } + + /* first lost frame is handled separately */ + if ( !hTonalMDCTConc->lastBlockData.blockIsConcealed ) + { + *rnd = 1977 + idchan; + /* will be set twice when looping over two channels, but does not matter */ + *rnd_c = 1979; + } + + if ( crossfade_gain == 1.0f ) + { + /* In first frame, noise is weighted with zero anyway, we only need the random numbers for the sign scrambling */ + for ( i = 0; i < max_noise_line; i++ ) + { + *rnd = own_random( rnd ); + concealment_noise[i] = *rnd; + } + + pop_wmops(); + + return; + } + + save_rnd_c = *rnd_c; + + c = sqrtf( hStereoMdct->lastCoh ); + c_inv = sqrtf( 1 - hStereoMdct->lastCoh ); + + /* pre-compute the noise shape for later weighting of the noise spectra */ + cngNoiseLevelPtr = &hFdCngCom->cngNoiseLevel[0]; + inc = ( st->core > TCX_20_CORE ) ? 2 : 1; + start_idx = hFdCngCom->startBand / inc; + stop_idx = hFdCngCom->stopFFTbin / inc; + + for ( i = 0; i < start_idx; i++ ) + { + noise_shape_buffer[i] = 0.0f; + } + for ( ; i < stop_idx; i++, cngNoiseLevelPtr += inc ) + { + noise_shape_buffer[i] = sqrtf( *( cngNoiseLevelPtr ) ); + } + + last_scf = sqrtf( *( cngNoiseLevelPtr - inc ) ); + + for ( ; i < max_noise_line; i++ ) + { + noise_shape_buffer[i] = last_scf; + } + + /* fill the noise vector */ + hTonalMDCTConc->curr_noise_nrg = MDCT_ST_PLC_FADEOUT_MIN_NOISE_NRG; + if ( noise_gen_mode == EQUAL_CORES || ( ( noise_gen_mode == TCX20_IN_0_TCX10_IN_1 && idchan == 0 ) || ( noise_gen_mode == TCX10_IN_0_TCX20_IN_1 && idchan == 1 ) ) ) + { + /* current channel is TCX20 -> generate noise for "full-length" spectrum */ + for ( i = 0; i < max_noise_line; i++ ) + { + *rnd = own_random( rnd ); + *rnd_c = own_random( rnd_c ); + + concealment_noise[i] = ( c_inv * *rnd + c * *rnd_c ) * noise_shape_buffer[i]; + hTonalMDCTConc->curr_noise_nrg += concealment_noise[i] * concealment_noise[i]; + } + } + else /* ( ( noise_gen_mode == TCX10_IN_0_TCX20_IN_1 && idchan == 0 ) || ( noise_gen_mode == TCX20_IN_0_TCX10_IN_1 && idchan == 1 ) ) */ + { + /* current channel is TCX10 and the other is TCX20 -> generate noise for "half-length" spectrum, but "increment" mid seed twice, to have the same seed in mid as the other (TCX20) channel for next frame */ + for ( i = 0; i < max_noise_line; i++ ) + { + *rnd = own_random( rnd ); + *rnd_c = own_random( rnd_c ); + + concealment_noise[i] = ( c_inv * *rnd + c * *rnd_c ) * noise_shape_buffer[i]; + hTonalMDCTConc->curr_noise_nrg += concealment_noise[i] * concealment_noise[i]; + + *rnd_c = own_random( rnd_c ); + } + } + + if ( st->tonal_mdct_plc_active ) + { + for ( i = crossOverFreq; i < max( crossOverFreq, hTonalMDCTConc->pTCI->lowerIndex[hTonalMDCTConc->pTCI->numIndexes - 1] ); ++i ) + { + concealment_noise[i] *= 0.0f; + } + } + + /* restore common seed + - after finishing the first channel + - after a first subframe if the current channel is TCX10 */ + if ( ( idchan == 0 && ( core == TCX_20 || ( core == TCX_10 && subframe_idx == 1 ) ) ) || ( core == TCX_10 && subframe_idx == 0 ) ) + { + *rnd_c = save_rnd_c; + } + + st->seed_tcx_plc = *rnd; + + pop_wmops(); + + return; +} + +void TonalMdctConceal_whiten_noise_shape( + Decoder_State *st, + const int16_t L_frame, + const TONALMDCTCONC_NOISE_SHAPE_WHITENING_MODE whitening_mode ) +{ + int16_t inc, start_idx, stop_idx; + float *noiseLevelPtr, *scfs_bg, *scfs_for_shaping; + HANDLE_FD_CNG_COM hFdCngCom; + float whitenend_noise_shape[L_FRAME16k]; + float scfs_int[FDNS_NPTS]; + const PsychoacousticParameters *psychParams; + + push_wmops( "apply_sns_on_noise_shape" ); + + scfs_bg = &st->hTonalMDCTConc->scaleFactorsBackground[0]; + psychParams = st->hTonalMDCTConc->psychParams; + hFdCngCom = st->hFdCngDec->hFdCngCom; + + inc = ( ( whitening_mode == ON_FIRST_LOST_FRAME ? st->core : st->last_core ) > TCX_20_CORE ) ? 2 : 1; + start_idx = hFdCngCom->startBand / inc; + stop_idx = L_frame / inc; + noiseLevelPtr = hFdCngCom->cngNoiseLevel; + + set_zero( whitenend_noise_shape, start_idx ); + for ( int16_t j = start_idx; j < stop_idx; j++, noiseLevelPtr += inc ) + { + whitenend_noise_shape[j] = *noiseLevelPtr; + } + + if ( whitening_mode == ON_FIRST_LOST_FRAME ) + { + float scf[SNS_NPTS]; + + sns_compute_scf( whitenend_noise_shape, psychParams, L_frame, scf ); + sns_interpolate_scalefactors( scfs_int, scf, ENC ); + sns_interpolate_scalefactors( scfs_bg, scf, DEC ); + scfs_for_shaping = &scfs_int[0]; + } + else /* whitening_mode == ON_FIRST_GOOD_FRAME */ + { + scfs_for_shaping = &scfs_bg[0]; + } + + if ( sum_f( scfs_for_shaping, FDNS_NPTS ) > 0.0f ) + { + sns_shape_spectrum( whitenend_noise_shape, psychParams, scfs_for_shaping, L_frame ); + mvr2r( whitenend_noise_shape + start_idx, hFdCngCom->cngNoiseLevel, stop_idx - start_idx ); + } + else + { + set_zero( hFdCngCom->cngNoiseLevel, stop_idx - start_idx ); + } + + pop_wmops(); +} diff --git a/lib_dec/transition_dec.c b/lib_dec/transition_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..a7fa472b55ab9dc84ddd8af32d129a3dbd170e58 --- /dev/null +++ b/lib_dec/transition_dec.c @@ -0,0 +1,766 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "wmc_auto.h" + +/*----------------------------------------------------------------------* + * Local function prototypes + *----------------------------------------------------------------------*/ + +static void tc_dec( Decoder_State *st, const int16_t L_frame, float exc[], int16_t *T0, int16_t *T0_frac, const int16_t i_subfr, const int16_t tc_subfr, int16_t *position, float bwe_exc[] ); + + +/*-------------------------------------------------------------------* + * transition_dec() + * + * Principal function for TC decoding + *-------------------------------------------------------------------*/ + +void transition_dec( + Decoder_State *st, /* i/o: decoder state structure */ + const int16_t L_frame, /* i : length of the frame */ + const int16_t i_subfr, /* i : subframe index */ + const int16_t tc_subfr, /* i : TC subframe index */ + int16_t *Jopt_flag, /* i : joint optimization flag */ + float *exc, /* o : excitation signal */ + int16_t *T0, /* o : close loop integer pitch */ + int16_t *T0_frac, /* o : close loop fractional part of the pitch */ + int16_t *T0_min, /* i/o: delta search min for sf 2 & 4 */ + int16_t *T0_max, /* i/o: delta search max for sf 2 & 4 */ + float **pt_pitch, /* o : floating pitch values */ + int16_t *position, /* i/o: first glottal impulse position in frame */ + float *bwe_exc /* o : excitation for SWB TBE */ +) +{ + int16_t i, pit_flag, pit_start, pit_limit, index, nBits; + int16_t limit_flag; + int16_t offset; + + /* Set limit_flag to 0 for restrained limits, and 1 for extended limits */ + limit_flag = 0; + + /*---------------------------------------------------------------------* + * zero adaptive contribution (glottal shape codebook search not + * in first subframe(s) ) + *---------------------------------------------------------------------*/ + + if ( tc_subfr > i_subfr + TC_0_192 ) + { + set_f( &exc[i_subfr], 0, L_SUBFR ); + + if ( L_frame == L_FRAME ) + { + set_f( &bwe_exc[i_subfr * HIBND_ACB_L_FAC], 0, (int16_t) ( L_SUBFR * HIBND_ACB_L_FAC ) ); /* set past excitation buffer to 0 */ + } + else + { + set_f( &bwe_exc[i_subfr * 2], 0, (int16_t) ( L_SUBFR * 2 ) ); /* set past excitation buffer to 0 */ + } + + *T0 = L_SUBFR; + *T0_frac = 0; + **pt_pitch = (float) L_SUBFR; + } + + /*---------------------------------------------------------------------* + * glottal shape codebook search + *---------------------------------------------------------------------*/ + + else if ( ( tc_subfr - i_subfr >= 0 ) && ( tc_subfr - i_subfr <= TC_0_192 ) ) + { + set_f( exc - L_EXC_MEM, 0, L_EXC_MEM ); /* set past excitation buffer to 0 */ + + if ( L_frame == L_FRAME ) + { + set_f( bwe_exc - PIT_MAX * HIBND_ACB_L_FAC, 0, PIT_MAX * HIBND_ACB_L_FAC ); /* set past excitation buffer to 0 */ + } + else + { + set_f( bwe_exc - PIT16k_MAX * 2, 0, PIT16k_MAX * 2 ); /* set past excitation buffer to 0 */ + } + + /* glottal shape codebook contribution construction */ + tc_dec( st, L_frame, exc, T0, T0_frac, i_subfr, tc_subfr, position, bwe_exc ); + + **pt_pitch = (float) ( *T0 ) + (float) ( *T0_frac ) / 4.0f; /* save subframe pitch values */ + *Jopt_flag = 1; + } + + /*---------------------------------------------------------------------* + * Regular ACELP Decoding using GENERIC type decoder + * (all subframes following subframe with glottal shape codebook seach) + * - search the position of the 2nd glottal impulse in case that the first + * one is in the 1st subframe (different adaptive contribution + * construction and the pitch period coding is used) + *---------------------------------------------------------------------*/ + + else if ( tc_subfr < i_subfr ) + { + if ( L_frame == L_FRAME ) + { + *Jopt_flag = 1; + + if ( ( i_subfr - tc_subfr >= L_SUBFR ) && ( i_subfr - tc_subfr <= L_SUBFR + TC_0_192 ) ) + { + pit_flag = 0; + } + else + { + pit_flag = L_SUBFR; + } + + if ( tc_subfr == TC_0_0 ) + { + if ( i_subfr == L_SUBFR ) + { + limit_T0( L_FRAME, 8, pit_flag, limit_flag, *T0, 0, T0_min, T0_max ); + } + + pit_flag = 1; + } + + /*-----------------------------------------------------------------* + * get number of bits for pitch decoding + *-----------------------------------------------------------------*/ + + nBits = st->acelp_cfg.pitch_bits[i_subfr / L_SUBFR]; + + /*------------------------------------------------------------* + * first glottal impulse is in the 1st subframe + *------------------------------------------------------------*/ + + if ( ( i_subfr == L_SUBFR ) && ( tc_subfr >= TC_0_128 ) ) + { + /*--------------------------------------------------------* + * second glottal impulse is in the 3rd or 4th subframe + * - build exc[] in 2nd subframe + *--------------------------------------------------------*/ + + *T0 = 2 * L_SUBFR; + *T0_frac = 0; + *Jopt_flag = 0; + + /* set adaptive part of exciation for curent subframe to 0 */ + set_f( &exc[i_subfr], 0, (int16_t) ( L_SUBFR + 1 ) ); + + set_f( &bwe_exc[i_subfr * HIBND_ACB_L_FAC], 0, (int16_t) ( L_SUBFR * HIBND_ACB_L_FAC ) ); + } + else if ( ( i_subfr == L_SUBFR ) && ( tc_subfr == TC_0_64 ) ) + { + /*--------------------------------------------------------* + * second glottal impulse is in the 2nd subframe, + * - build exc[] in 2nd subframe + *--------------------------------------------------------*/ + + if ( PIT_MIN > ( *position ) ) + { + pit_start = L_SUBFR - ( *position ); + } + else + { + pit_start = PIT_MIN; + } + + if ( pit_start < PIT_MIN ) + { + pit_start = PIT_MIN; + } + + pit_limit = 2 * pit_start + ( *position ); + + /* 7 bit pitch DECODER */ + index = get_next_indice( st, nBits ); + + *T0 = (int16_t) ( floor( pit_start + index / 2 ) ); + *T0_frac = ( index - ( *T0 - pit_start ) * 2 ) * 2; + limit_T0( L_FRAME, 8, pit_flag, limit_flag, *T0, 0, T0_min, T0_max ); /* find T0_min and T0_max */ + + /* Find the adaptive codebook vector - ACELP long-term prediction */ + pred_lt4( &exc[i_subfr], &exc[i_subfr], *T0, *T0_frac, L_SUBFR + 1, inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + + offset = tbe_celp_exc_offset( *T0, *T0_frac ); + for ( i = 0; i < L_SUBFR * HIBND_ACB_L_FAC; i++ ) + { + bwe_exc[i + i_subfr * HIBND_ACB_L_FAC] = bwe_exc[i + i_subfr * HIBND_ACB_L_FAC - offset]; + } + } + else if ( ( i_subfr == 2 * L_SUBFR ) && ( tc_subfr == TC_0_128 ) ) + { + /*--------------------------------------------------------* + * second glottal impulse is in the 3rd subframe + * - build exc[] in 3rd subframe + *--------------------------------------------------------*/ + + /* 7bit pitch DECODER */ + pit_start = 2 * L_SUBFR - ( *position ); + + index = get_next_indice( st, nBits ); + + *T0 = (int16_t) ( floor( pit_start + (int16_t) ( index / 2 ) ) ); + *T0_frac = ( index - ( *T0 - pit_start ) * 2 ) * 2; + + limit_T0( L_FRAME, 8, pit_flag, limit_flag, *T0, 0, T0_min, T0_max ); /* find T0_min and T0_max */ + + /* Find the adaptive codebook vector. ACELP long-term prediction */ + pred_lt4( &exc[i_subfr], &exc[i_subfr], *T0, *T0_frac, L_SUBFR + 1, inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + + offset = tbe_celp_exc_offset( *T0, *T0_frac ); + for ( i = 0; i < L_SUBFR * HIBND_ACB_L_FAC; i++ ) + { + bwe_exc[i + i_subfr * HIBND_ACB_L_FAC] = bwe_exc[i + i_subfr * HIBND_ACB_L_FAC - offset]; + } + } + else if ( ( i_subfr == 2 * L_SUBFR ) && ( tc_subfr == TC_0_192 ) ) + { + /*--------------------------------------------------------* + * second glottal impulse is in the 4th subframe + * - build exc[] in 3rd subframe + *--------------------------------------------------------*/ + + *T0 = 4 * L_SUBFR; + *T0_frac = 0; + *Jopt_flag = 0; + + /* set adaptive part of exciation for curent subframe to 0 */ + set_f( &exc[i_subfr], 0, (int16_t) ( L_SUBFR + 1 ) ); + + set_f( &bwe_exc[i_subfr * HIBND_ACB_L_FAC], 0, (int16_t) ( L_SUBFR * HIBND_ACB_L_FAC ) ); + } + else if ( ( i_subfr == 3 * L_SUBFR ) && ( tc_subfr == TC_0_192 ) ) + { + /*--------------------------------------------------------* + * second glottal impulse is in the 4th subframe + * - build exc[] in 4th subframe + *--------------------------------------------------------*/ + + pit_start = 3 * L_SUBFR - ( *position ); + pit_limit = 2 * L_FRAME - PIT_MAX - 2 * ( *position ) - 2; + + index = get_next_indice( st, nBits ); + + if ( index < ( pit_limit - pit_start ) * 2 ) + { + *T0 = (int16_t) ( floor( pit_start + ( index / 2 ) ) ); + *T0_frac = ( index - ( ( *T0 ) - pit_start ) * 2 ) * 2; + } + else + { + *T0 = index + pit_limit - ( pit_limit - pit_start ) * 2; + *T0_frac = 0; + } + + /* biterror detection mechanism */ + if ( ( ( *T0 << 2 ) + *T0_frac ) > ( PIT_MAX << 2 ) + 2 ) + { + *T0 = L_SUBFR; + *T0_frac = 0; + st->BER_detect = 1; + } + + /* Find the adaptive codebook vector. ACELP long-term prediction */ + pred_lt4( &exc[i_subfr], &exc[i_subfr], *T0, *T0_frac, L_SUBFR + 1, inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + + offset = tbe_celp_exc_offset( *T0, *T0_frac ); + for ( i = 0; i < L_SUBFR * HIBND_ACB_L_FAC; i++ ) + { + bwe_exc[i + i_subfr * HIBND_ACB_L_FAC] = bwe_exc[i + i_subfr * HIBND_ACB_L_FAC - offset]; + } + } + else if ( ( i_subfr == 3 * L_SUBFR ) && ( tc_subfr == TC_0_128 ) ) + { + /*--------------------------------------------------------* + * second glottal impulse in the 3rd subframe + * build exc[] in 4th subframe + *--------------------------------------------------------*/ + + index = get_next_indice( st, nBits ); + + delta_pit_dec( 2, index, T0, T0_frac, *T0_min ); + + /* Find the adaptive codebook vector. ACELP long-term prediction */ + pred_lt4( &exc[i_subfr], &exc[i_subfr], *T0, *T0_frac, L_SUBFR + 1, inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + + offset = tbe_celp_exc_offset( *T0, *T0_frac ); + for ( i = 0; i < L_SUBFR * HIBND_ACB_L_FAC; i++ ) + { + bwe_exc[i + i_subfr * HIBND_ACB_L_FAC] = bwe_exc[i + i_subfr * HIBND_ACB_L_FAC - offset]; + } + } + + /*------------------------------------------------------------* + * first glottal impulse is NOT in the 1st subframe, + * or two impulses are in the 1st subframe + *------------------------------------------------------------*/ + else + { + index = get_next_indice( st, nBits ); + + pit_Q_dec( 0, index, nBits, 8, pit_flag, limit_flag, T0, T0_frac, T0_min, T0_max, &st->BER_detect ); + + /* Find the adaptive codebook vector */ + pred_lt4( &exc[i_subfr], &exc[i_subfr], *T0, *T0_frac, L_SUBFR + 1, inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + + offset = tbe_celp_exc_offset( *T0, *T0_frac ); + for ( i = 0; i < L_SUBFR * HIBND_ACB_L_FAC; i++ ) + { + bwe_exc[i + i_subfr * HIBND_ACB_L_FAC] = bwe_exc[i + i_subfr * HIBND_ACB_L_FAC - offset]; + } + } + + /*-----------------------------------------------------------------* + * LP filtering of the adaptive excitation (if non-zero) + *-----------------------------------------------------------------*/ + + if ( *Jopt_flag ) + { + lp_filt_exc_dec( st, MODE1, i_subfr, L_SUBFR, L_frame, st->acelp_cfg.ltf_mode, exc ); + } + + /*---------------------------------------------------------------------* + * fill the pitch buffer - needed for post-processing and FEC_clas_estim() + *---------------------------------------------------------------------*/ + + **pt_pitch = (float) ( *T0 ) + (float) ( *T0_frac ) / 4.0f; /* save subframe pitch values */ + if ( ( tc_subfr >= 2 * L_SUBFR ) && ( i_subfr == 3 * L_SUBFR ) ) + { + ( *pt_pitch ) -= 3; + **pt_pitch = (float) ( *T0 ) + (float) ( *T0_frac ) / 4.0f; + ( *pt_pitch )++; + **pt_pitch = (float) ( *T0 ) + (float) ( *T0_frac ) / 4.0f; + ( *pt_pitch )++; + **pt_pitch = (float) ( *T0 ) + (float) ( *T0_frac ) / 4.0f; + ( *pt_pitch )++; + } + else if ( ( tc_subfr == L_SUBFR ) && ( i_subfr == 2 * L_SUBFR ) ) + { + ( *pt_pitch ) -= 2; + **pt_pitch = (float) ( *T0 ) + (float) ( *T0_frac ) / 4.0f; + ( *pt_pitch )++; + **pt_pitch = (float) ( *T0 ) + (float) ( *T0_frac ) / 4.0f; + ( *pt_pitch )++; + } + else if ( ( tc_subfr == TC_0_64 ) && ( i_subfr == L_SUBFR ) ) + { + ( *pt_pitch ) -= 1; + **pt_pitch = (float) ( *T0 ) + (float) ( *T0_frac ) / 4.0f; + ( *pt_pitch )++; + } + else if ( ( tc_subfr == TC_0_128 ) && ( i_subfr == 2 * L_SUBFR ) ) + { + ( *pt_pitch ) -= 2; + **pt_pitch = (float) ( *T0 ) + (float) ( *T0_frac ) / 4.0f; + ( *pt_pitch )++; + **pt_pitch = (float) ( *T0 ) + (float) ( *T0_frac ) / 4.0f; + ( *pt_pitch )++; + } + else if ( ( tc_subfr == TC_0_192 ) && ( i_subfr == 3 * L_SUBFR ) ) + { + ( *pt_pitch ) -= 3; + **pt_pitch = (float) ( *T0 ) + (float) ( *T0_frac ) / 4.0f; + ( *pt_pitch )++; + **pt_pitch = (float) ( *T0 ) + (float) ( *T0_frac ) / 4.0f; + ( *pt_pitch )++; + **pt_pitch = (float) ( *T0 ) + (float) ( *T0_frac ) / 4.0f; + ( *pt_pitch )++; + } + } + else /* L_frame == L_FRAME16k */ + { + if ( i_subfr >= 2 * L_SUBFR ) + { + limit_flag = 1; + } + + if ( i_subfr - tc_subfr == L_SUBFR ) + { + limit_T0( L_FRAME16k, 8, 0, limit_flag, *T0, *T0_frac, T0_min, T0_max ); /* find T0_min and T0_max */ + } + + /*-----------------------------------------------------------------* + * get number of bits and index for pitch decoding + *-----------------------------------------------------------------*/ + + nBits = st->acelp_cfg.pitch_bits[i_subfr / L_SUBFR]; + + index = get_next_indice( st, nBits ); + + /*-----------------------------------------------------------------* + * Find adaptive part of excitation, encode pitch period + *-----------------------------------------------------------------*/ + + if ( nBits == 10 ) + { + pit16k_Q_dec( index, nBits, limit_flag, T0, T0_frac, T0_min, T0_max, &st->BER_detect ); + } + else if ( nBits == 8 ) /* tc_subfr==0 && i_subfr==L_SUBFR */ + { + /*-----------------------------------------------------------------------------* + * The pitch range is encoded absolutely with 8 bits and is divided as follows: + * PIT16k_MIN to PIT16k_FR2_TC0_2SUBFR-1 resolution 1/4 (frac = 0,1,2 or 3) + * PIT16k_FR2_TC0_2SUBFR to 2*L_SUBFR resolution 1/2 (frac = 0 or 2) + *-----------------------------------------------------------------------------*/ + + if ( index < ( PIT16k_FR2_TC0_2SUBFR - PIT16k_MIN ) * 4 ) + { + *T0 = PIT16k_MIN + ( index / 4 ); + *T0_frac = index - ( *T0 - PIT16k_MIN ) * 4; + } + else + { + index -= ( PIT16k_FR2_TC0_2SUBFR - PIT16k_MIN ) * 4; + *T0 = PIT16k_FR2_TC0_2SUBFR + ( index / 2 ); + *T0_frac = index - ( *T0 - PIT16k_FR2_TC0_2SUBFR ) * 2; + ( *T0_frac ) *= 2; + } + + /* biterror detection mechanism */ + if ( ( ( *T0 << 2 ) + *T0_frac ) > ( ( 2 * L_SUBFR ) << 2 ) ) + { + *T0 = L_SUBFR; + *T0_frac = 0; + st->BER_detect = 1; + } + } + else if ( nBits == 6 ) + { + delta_pit_dec( 4, index, T0, T0_frac, *T0_min ); + } + if ( nBits == 6 ) + { + limit_T0( L_FRAME16k, 8, L_SUBFR, limit_flag, *T0, *T0_frac, T0_min, T0_max ); /* find T0_min and T0_max */ + } + + /*-----------------------------------------------------------------* + * - find the adaptive codebook vector + * - LP filtering of the adaptive excitation (if non-zero) + *-----------------------------------------------------------------*/ + + if ( ( i_subfr == L_SUBFR ) && ( *T0 == 2 * L_SUBFR ) ) + { + /* no adaptive excitation in the second subframe */ + set_f( &exc[i_subfr], 0, L_SUBFR + 1 ); + + get_next_indice( st, 1 ); /* this bit is actually not needed */ + + set_f( &bwe_exc[i_subfr * 2], 0, L_SUBFR * 2 ); + } + else + { + /* Find the adaptive codebook vector - ACELP long-term prediction */ + pred_lt4( &exc[i_subfr], &exc[i_subfr], *T0, *T0_frac, L_SUBFR + 1, inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + + for ( i = 0; i < L_SUBFR * 2; i++ ) + { + bwe_exc[i + i_subfr * 2] = bwe_exc[i + i_subfr * 2 - *T0 * 2 - (int16_t) ( (float) *T0_frac * 0.5f + 4 + 0.5f ) + 4]; + } + + lp_filt_exc_dec( st, MODE1, i_subfr, L_SUBFR, L_frame, st->acelp_cfg.ltf_mode, exc ); + + *Jopt_flag = 1; + } + + **pt_pitch = (float) ( *T0 ) + (float) ( *T0_frac ) / 4.0f; /* save subframe pitch values */ + + /*---------------------------------------------------------------------* + * fill the pitch buffer - needed for post-processing and FEC_clas_estim() + *---------------------------------------------------------------------*/ + + if ( ( i_subfr - tc_subfr == L_SUBFR ) || ( tc_subfr == 0 && i_subfr == 2 * L_SUBFR ) ) + { + index = i_subfr / L_SUBFR; + ( *pt_pitch ) -= index; + + for ( i = 0; i < index; i++ ) + { + **pt_pitch = (float) ( *T0 ) + (float) ( *T0_frac ) / 4.0f; + ( *pt_pitch )++; + } + } + } + } + + return; +} + +/*---------------------------------------------------------------------* + * tc_dec() + * + * Principal function for TC decoding. + * - constructs glottal codebook contribution + * - uses pitch sharpening + * - uses gain_trans + *---------------------------------------------------------------------*/ + +static void tc_dec( + Decoder_State *st, /* i/o: decoder state structure */ + const int16_t L_frame, /* i : length of the frame */ + float exc[], /* o : glottal codebook contribution */ + int16_t *T0, /* o : close-loop pitch period */ + int16_t *T0_frac, /* o : close-loop pitch period - fractional part */ + const int16_t i_subfr, /* i : subframe index */ + const int16_t tc_subfr, /* i : TC subframe index */ + int16_t *position, /* o : first glottal impulse position in frame */ + float bwe_exc[] /* o : excitation for SWB TBE */ +) +{ + int16_t i, imp_shape, imp_pos, imp_sign, imp_gain, nBits; + float gain_trans; + int16_t index; + + /*----------------------------------------------------------------* + * find the number of bits + *----------------------------------------------------------------*/ + + nBits = st->acelp_cfg.pitch_bits[i_subfr / L_SUBFR]; + + /*----------------------------------------------------------------* + * decode parameter T0 (pitch period) + *----------------------------------------------------------------*/ + + if ( L_frame == L_FRAME ) + { + if ( ( ( i_subfr == 0 ) && ( ( tc_subfr == 0 ) || ( tc_subfr == TC_0_64 ) || ( tc_subfr == TC_0_128 ) || ( tc_subfr == TC_0_192 ) ) ) || ( tc_subfr == L_SUBFR ) ) + { + *T0 = L_SUBFR; + *T0_frac = 0; + } + else if ( ( tc_subfr == 3 * L_SUBFR ) ) + { + i = get_next_indice( st, nBits ); + + if ( nBits == 9 ) + { + abs_pit_dec( 4, i, 0, T0, T0_frac ); + } + else + { + abs_pit_dec( 2, i, 0, T0, T0_frac ); + } + } + else + { + i = get_next_indice( st, nBits ); + + if ( i == 0 ) + { + *T0 = L_SUBFR; + *T0_frac = 0; + } + else + { + if ( tc_subfr == TC_0_0 ) + { + delta_pit_dec( 2, i, T0, T0_frac, PIT_MIN - 1 ); + } + else + { + delta_pit_dec( 0, i, T0, T0_frac, PIT_MIN - 1 ); + } + } + } + } + else /* L_frame == L_FRAME16k */ + { + i = get_next_indice( st, nBits ); + + if ( nBits == 10 ) + { + if ( i < ( PIT16k_FR2_EXTEND_10b - PIT16k_MIN_EXTEND ) * 4 ) + { + *T0 = PIT16k_MIN_EXTEND + ( i / 4 ); + *T0_frac = i - ( ( *T0 - PIT16k_MIN_EXTEND ) * 4 ); + } + else + { + index = i - ( PIT16k_FR2_EXTEND_10b - PIT16k_MIN_EXTEND ) * 4; + *T0 = PIT16k_FR2_EXTEND_10b + ( index / 2 ); + *T0_frac = index - ( *T0 - PIT16k_FR2_EXTEND_10b ) * 2; + ( *T0_frac ) *= 2; + } + } + else if ( nBits == 6 ) + { + *T0 = PIT16k_MIN + ( i / 2 ); + *T0_frac = i - ( *T0 - PIT16k_MIN ) * 2; + *T0_frac *= 2; + } + } + + /*----------------------------------------------------------------* + * decode other TC parameters + *----------------------------------------------------------------*/ + + imp_shape = get_next_indice( st, 3 ); + imp_pos = get_next_indice( st, 6 ); + imp_sign = get_next_indice( st, 1 ); + imp_gain = get_next_indice( st, 3 ); + + /*----------------------------------------------------------------* + * restore gain_trans + * build glottal codebook contribution + *----------------------------------------------------------------*/ + + gain_trans = tbl_gain_trans_tc[imp_gain]; + + if ( imp_sign == 0 ) + { + gain_trans *= -1; + } + + /* build glottal codebook contribution */ + set_f( &exc[i_subfr], 0, L_SUBFR ); + + for ( i = ( imp_pos - L_IMPULSE2 ); i <= ( imp_pos + L_IMPULSE2 ); i++ ) + { + if ( ( i >= 0 ) && ( i < L_SUBFR ) ) + { + exc[i + i_subfr] = glottal_cdbk[(imp_shape) *L_IMPULSE + i - imp_pos + L_IMPULSE2] * gain_trans; + } + } + + /*--------------------------------------------------------------* + * adapt. search of the second impulse in the same subframe + * (when appears) + *--------------------------------------------------------------*/ + + pred_lt4_tc( exc, *T0, *T0_frac, inter4_2, imp_pos, i_subfr ); + + if ( st->hBWE_TD != NULL ) + { + if ( L_frame == L_FRAME ) + { + interp_code_5over2( &exc[i_subfr], &bwe_exc[i_subfr * HIBND_ACB_L_FAC], L_SUBFR ); + } + else + { + interp_code_4over2( &exc[i_subfr], &bwe_exc[i_subfr * 2], L_SUBFR ); + } + } + + *position = imp_pos + i_subfr; + + return; +} + +/*-------------------------------------------------------------------* + * tc_classif() + * + * TC subframe classification decoding + *-------------------------------------------------------------------*/ + +int16_t tc_classif( + Decoder_State *st /* i/o: decoder state structure */ +) +{ + int16_t tc_subfr, indice; + + if ( st->L_frame == L_FRAME ) + { + if ( get_next_indice( st, 1 ) ) + { + tc_subfr = TC_0_0; + } + else + { + if ( get_next_indice( st, 1 ) ) + { + tc_subfr = 0; + + if ( get_next_indice( st, 1 ) ) + { + tc_subfr = TC_0_192; + } + else + { + if ( get_next_indice( st, 1 ) ) + { + tc_subfr = TC_0_64; + } + else + { + tc_subfr = TC_0_128; + } + } + } + else + { + if ( get_next_indice( st, 1 ) ) + { + tc_subfr = L_SUBFR; + } + else + { + if ( get_next_indice( st, 1 ) ) + { + tc_subfr = 2 * L_SUBFR; + } + else + { + tc_subfr = 3 * L_SUBFR; + } + } + } + } + } + else /* L_frame == L_FRAME16k */ + { + indice = get_next_indice( st, 2 ); + + if ( indice < 3 ) + { + tc_subfr = indice * L_SUBFR; + } + else + { + if ( get_next_indice( st, 1 ) == 0 ) + { + tc_subfr = 3 * L_SUBFR; + } + else + { + tc_subfr = 4 * L_SUBFR; + } + } + } + + return ( tc_subfr ); +} diff --git a/lib_dec/updt_dec.c b/lib_dec/updt_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..9ee8093ffc0ea4e1055819d6aaf33c93fb7ca1c1 --- /dev/null +++ b/lib_dec/updt_dec.c @@ -0,0 +1,778 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include "options.h" +#include "prot.h" +#include "rom_com.h" +#include "cnst.h" +#include +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * updt_dec() + * + * Common updates (all frame types) + *-------------------------------------------------------------------*/ + +void updt_dec( + Decoder_State *st, /* i/o: state structure */ + const float *old_exc, /* i : buffer of excitation */ + const float *pitch_buf, /* i : floating pitch values for each subframe */ + const float Es_pred, /* i : predicited scaled innovation energy */ + const float *Aq, /* i : A(z) quantized for all subframes */ + const float *lsf_new, /* i : current frame LSF vector */ + const float *lsp_new, /* i : current frame LSP vector */ + const float voice_factors[], /* i : voicing factors */ + const float *old_bwe_exc, /* i : buffer of excitation */ + const float *gain_buf /* o : floating pitch gain for each subframe */ +) +{ + int16_t i; + int16_t tmp_seed; + + HQ_DEC_HANDLE hHQ_core = st->hHQ_core; + + /* update old excitation buffer */ + mvr2r( &old_exc[st->L_frame], st->old_exc, L_EXC_MEM_DEC ); + if ( !st->Opt_AMR_WB && st->hBWE_TD != NULL ) + { + mvr2r( &old_bwe_exc[L_FRAME32k], st->hBWE_TD->old_bwe_exc, PIT16k_MAX * 2 ); + } + + /* update old LSP and LSF vector */ + mvr2r( lsf_new, st->lsf_old, M ); + mvr2r( lsp_new, st->lsp_old, M ); + + /* update last coding type */ + st->last_coder_type = st->coder_type; + if ( st->coder_type == INACTIVE || ( st->bpf_off == 1 && st->coder_type != AUDIO && st->coder_type != TRANSITION ) ) + { + /* overwrite previous coding type to help FEC */ + st->last_coder_type = UNVOICED; + } + + if ( st->hGSCDec != NULL ) + { + if ( ( st->coder_type != AUDIO || st->Last_GSC_noisy_speech_flag != 0 ) && st->hGSCDec->Last_GSC_pit_band_idx > 0 ) + { + st->hGSCDec->Last_GSC_pit_band_idx = 0; /*The temporal contribution of the GSC is meaningless after 1 frame lost for inactive & unvoiced content */ + } + } + + /* this ensures that st->last_coder_type is never set to INACTIVE in case of AVQ inactive because the FEC does not distinguish between GSC inactive and AVQ inactive */ + if ( st->coder_type == INACTIVE && st->total_brate > ACELP_24k40 ) + { + st->last_coder_type = GENERIC; + } + + if ( st->Opt_AMR_WB && st->coder_type == INACTIVE && st->core_brate != SID_1k75 && st->core_brate != FRAME_NO_DATA ) + { + /* overwrite previous coding type to help FEC */ + st->last_coder_type = UNVOICED; + st->last_voice_factor = voice_factors[NB_SUBFR - 1]; + } + + if ( !st->Opt_AMR_WB ) + { + /* update voicing factor of TBE to help FEC */ + if ( st->L_frame == L_FRAME ) + { + st->last_voice_factor = voice_factors[NB_SUBFR - 1]; + } + else /* L_frame == L_FRAME16k */ + { + st->last_voice_factor = voice_factors[NB_SUBFR16k - 1]; + } + } + + if ( st->hGSCDec != NULL && st->coder_type != AUDIO && st->coder_type != INACTIVE ) + { + st->hGSCDec->noise_lev = NOISE_LEVEL_SP3; + set_f( st->hGSCDec->old_y_gain, 0.0f, MBANDS_GN ); + + for ( i = 0; i < L_FRAME; i++ ) + { + tmp_seed = st->hGSCDec->seed_tcx; + st->hGSCDec->Last_GSC_spectrum[i] = own_random( &tmp_seed ) / PCM16_TO_FLT_FAC; + } + } + + /* update last GSC SWB speech flag for FEC */ + st->Last_GSC_noisy_speech_flag = st->GSC_noisy_speech; + + /* update counter for FEC pitch estimate */ + st->upd_cnt++; + if ( st->upd_cnt > MAX_UPD_CNT ) + { + st->upd_cnt = MAX_UPD_CNT; + } + + mvr2r( &st->old_pitch_buf[st->L_frame / L_SUBFR], st->old_pitch_buf, st->L_frame / L_SUBFR ); + mvr2r( pitch_buf, &st->old_pitch_buf[st->L_frame / L_SUBFR], st->L_frame / L_SUBFR ); + mvr2r( &st->mem_pitch_gain[2], &st->mem_pitch_gain[st->L_frame / L_SUBFR + 2], st->L_frame / L_SUBFR ); + + if ( st->L_frame == L_FRAME ) + { + st->mem_pitch_gain[2] = gain_buf[3]; + st->mem_pitch_gain[3] = gain_buf[2]; + st->mem_pitch_gain[4] = gain_buf[1]; + st->mem_pitch_gain[5] = gain_buf[0]; + } + else + { + st->mem_pitch_gain[2] = gain_buf[4]; + st->mem_pitch_gain[3] = gain_buf[3]; + st->mem_pitch_gain[4] = gain_buf[2]; + st->mem_pitch_gain[5] = gain_buf[1]; + st->mem_pitch_gain[6] = gain_buf[0]; + } + + /* FEC - update adaptive LSF mean vector */ + mvr2r( st->lsfoldbfi0, st->lsfoldbfi1, M ); + mvr2r( lsf_new, st->lsfoldbfi0, M ); + + /* update of pitch and voicing information for HQ FEC */ + if ( hHQ_core != NULL && st->last_core != HQ_CORE ) + { + if ( !st->Opt_AMR_WB && st->coder_type == UNVOICED ) + { + hHQ_core->HqVoicing = 0; + } + else + { + hHQ_core->HqVoicing = 1; + } + } + + /* SC-VBR */ + st->old_ppp_mode = st->last_ppp_mode_dec; + st->last_ppp_mode_dec = st->ppp_mode_dec; + st->last_nelp_mode_dec = st->nelp_mode_dec; + st->last_vbr_hw_BWE_disable_dec = st->vbr_hw_BWE_disable_dec; + + /* core switching updates */ + mvr2r( &Aq[( st->L_frame / L_SUBFR - 1 ) * ( M + 1 )], st->old_Aq_12_8, M + 1 ); + st->old_Es_pred = Es_pred; + + return; +} + +/*-------------------------------------------------------------------* + * updt_IO_switch() + * + * Common updates for AMR-WB IO mode and EVS primary mode switching + *-------------------------------------------------------------------*/ + +void updt_IO_switch_dec( + const int16_t output_frame, /* i : output frame length */ + Decoder_State *st /* i/o: state structure */ +) +{ + float xsp_tmp[M]; + + if ( st->last_core == AMR_WB_CORE ) /* switching to EVS primary mode */ + { + /* AMR-WB IO mode uses ISF(ISP), but EVS primary mode LSF(LSP) */ + mvr2r( stable_LSP, xsp_tmp, M ); + isf2lsf( st->lsf_old, st->lsf_old, xsp_tmp, M, INT_FS_12k8 ); + mvr2r( stable_LSP, xsp_tmp, M ); + isp2lsp( st->lsp_old, st->lsp_old, xsp_tmp, M ); + + /* AMR-WB IO mode uses ISF(ISP), but EVS primary mode uses LSF(LSP) */ + mvr2r( stable_LSP, xsp_tmp, M ); + if ( st->hTdCngDec != NULL ) + { + isp2lsp( st->lspCNG, st->lspCNG, xsp_tmp, M ); + st->hTdCngDec->old_enr_index = min( (int16_t) ( (float) st->hTdCngDec->old_enr_index / STEP_AMR_WB_SID * STEP_SID ), 127 ); + } + + /* reset TD BWE buffers */ + if ( st->hBWE_TD != NULL ) + { + set_f( st->hBWE_TD->old_bwe_exc, 0.0f, PIT16k_MAX * 2 ); + set_f( st->hBWE_TD->old_bwe_exc_extended, 0.0f, NL_BUFF_OFFSET ); + st->hBWE_TD->bwe_non_lin_prev_scale = 0.0; + + wb_tbe_extras_reset( st->hBWE_TD->mem_genSHBexc_filt_down_wb2, st->hBWE_TD->mem_genSHBexc_filt_down_wb3 ); + wb_tbe_extras_reset_synth( st->hBWE_TD->state_lsyn_filt_shb, st->hBWE_TD->state_lsyn_filt_dwn_shb, st->hBWE_TD->mem_resamp_HB ); + + if ( output_frame >= L_FRAME32k ) + { + swb_tbe_reset( st->hBWE_TD->mem_csfilt, st->hBWE_TD->mem_genSHBexc_filt_down_shb, st->hBWE_TD->state_lpc_syn, st->hBWE_TD->syn_overlap, st->hBWE_TD->state_syn_shbexc, &st->hBWE_TD->tbe_demph, &st->hBWE_TD->tbe_premph, st->hBWE_TD->mem_stp_swb, &( st->hBWE_TD->gain_prec_swb ) ); + + /* reset GainShape delay for SWB TBE FEC */ + set_f( st->hBWE_TD->GainShape_Delay, 0, NUM_SHB_SUBFR / 2 ); + st->hBWE_TD->prev_pow_exc16kWhtnd = 1.0f; + st->hBWE_TD->prev_mix_factor = 1.0f; + + swb_tbe_reset_synth( st->hBWE_TD->genSHBsynth_Hilbert_Mem, st->hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local ); + } + + if ( output_frame == L_FRAME48k ) + { + set_f( st->hBWE_TD->fb_state_lpc_syn, 0, LPC_SHB_ORDER ); + st->hBWE_TD->fb_tbe_demph = 0; + fb_tbe_reset_synth( st->hBWE_TD->fbbwe_hpf_mem, &st->hBWE_TD->prev_fbbwe_ratio ); + } + } + st->last_voice_factor = 0.0f; + + /* reset FD BWE buffers */ + if ( st->hBWE_FD != NULL ) + { + st->hBWE_FD->prev_mode = NORMAL; + st->hBWE_FD->prev_Energy = 0.0f; + st->hBWE_FD->prev_Energy_wb = 0.0f; + st->hBWE_FD->prev_L_swb_norm = 8; + st->hBWE_FD->prev_frica_flag = 0; + set_f( st->hBWE_FD->mem_imdct, 0, L_FRAME48k ); + st->hBWE_FD->prev_td_energy = 0.0f; + st->hBWE_FD->prev_weight = 0.2f; + set_f( st->hBWE_FD->old_wtda_swb, 0, L_FRAME48k ); + + if ( output_frame == L_FRAME48k ) + { + st->hBWE_FD->prev_fb_ener_adjust = 0.0f; + } + } + + /* HQ core buffers */ + set_f( st->delay_buf_out, 0, HQ_DELTA_MAX * HQ_DELAY_COMP ); + + /* reset the unvoiced/audio signal improvement memories */ + st->hGSCDec->seed_tcx = 15687; + + st->use_acelp_preq = 0; + if ( st->last_flag_filter_NB == 1 ) + { + st->cldfbSyn->bandsToZero = 0; + } + st->last_active_bandsToZero_bwdec = 0; + st->perc_bwddec = 0.0f; + st->last_flag_filter_NB = 0; + st->active_frame_cnt_bwddec = 0; + set_s( st->flag_buffer, 0, 20 ); + } + else /* switching to AMR-WB IO mode */ + { + float tmpF[MAX_LT]; + + /* ISF Q memories */ + set_f( st->mem_MA, 0, M ); + + /* AMR-WB IO mode uses ISF(ISP), but EVS primary mode LSF(LSP) */ + mvr2r( stable_ISP, xsp_tmp, M ); + lsf2isf( st->lsf_old, st->lsf_old, xsp_tmp, M, INT_FS_12k8 ); + mvr2r( stable_ISP, xsp_tmp, M ); + lsp2isp( st->lsp_old, st->lsp_old, xsp_tmp, M ); + + /* AMR-WB IO mode uses ISF(ISP), but EVS primary mode LSF(LSP) */ + mvr2r( stable_ISP, xsp_tmp, M ); + if ( st->hTdCngDec != NULL ) + { + lsp2isp( st->lspCNG, st->lspCNG, xsp_tmp, M ); + st->hTdCngDec->old_enr_index = min( (int16_t) ( (float) st->hTdCngDec->old_enr_index / STEP_SID * STEP_AMR_WB_SID ), 63 ); + } + + /* HF synthesis memories */ + st->ng_ener_ST = -51.0f; + + /* reset the unvoiced/audio signal improvement memories */ + st->hGSCDec->seed_tcx = 15687; + + st->psf_lp_noise = st->lp_noise; + + /* AMR-WB IO init */ + mvr2r( st->hAmrwb_IO->lt_diff_etot, tmpF, MAX_LT ); + amr_wb_dec_init( st->hAmrwb_IO ); + mvr2r( tmpF, st->hAmrwb_IO->lt_diff_etot, MAX_LT ); + + hf_synth_amr_wb_reset( st->hAmrwb_IO, st->hBWE_zero ); + + /* reset VBR signaling */ + st->last_ppp_mode_dec = 0; + st->last_nelp_mode_dec = 0; + st->ppp_mode_dec = 0; + st->nelp_mode_dec = 0; + } + + /* CNG - reset */ + if ( st->hTdCngDec != NULL ) + { + st->hTdCngDec->ho_hist_size = 0; + } + + /* ISF Q memories */ + mvr2r( UVWB_Ave, st->mem_AR, M ); + + /* FEC - update adaptive LSF mean vector */ + mvr2r( st->lsf_old, st->lsfoldbfi0, M ); + mvr2r( st->lsf_old, st->lsfoldbfi1, M ); + mvr2r( st->lsf_old, st->lsf_adaptive_mean, M ); + + return; +} + +/*-------------------------------------------------------------------* + * updt_bw_switching() + * + * Updates for BW switching + *-------------------------------------------------------------------*/ + +void updt_bw_switching( + Decoder_State *st, /* i/o: decoder state structure */ + const float *synth /* i : float synthesis signal */ +) +{ + if ( st->output_Fs == 32000 && st->bwidth == SWB ) + { + calc_tilt_bwe( synth, &( st->tilt_swb ), L_FRAME32k ); + } + + st->prev_enerLH = st->enerLH; + st->prev_enerLL = st->enerLL; + st->last_bwidth = st->bwidth; + + if ( st->core == ACELP_CORE ) + { + if ( st->bwidth == WB && st->bws_cnt == 0 ) + { + st->last_inner_frame = L_FRAME16k; + } + else + { + st->last_inner_frame = L_FRAME32k; + } + } + else + { + if ( st->last_inner_frame >= L_FRAME16k && inner_frame_tbl[st->bwidth] <= L_FRAME16k && st->bws_cnt > 0 && st->bws_cnt < N_WS2N_FRAMES ) + { + st->last_inner_frame = st->last_inner_frame; + } + else + { + st->last_inner_frame = inner_frame_tbl[st->bwidth]; + } + } + + st->prev_bws_cnt = st->bws_cnt; + + return; +} + + +/*-------------------------------------------------------------------* + * updt_dec_common() + * + * Common updates for MODE1 and MODE2 + *-------------------------------------------------------------------*/ + +void updt_dec_common( + Decoder_State *st, /* i/o: decoder state structure */ + const int16_t hq_core_type, /* i : HQ core type */ + const int16_t concealWholeFrameTmp, /* i : concealWholeFrameTmp flag */ + const float *synth /* i : decoded synthesis */ +) +{ + int16_t i; + float log_energy, log_energy_diff; + int16_t output_frame; + + st->last_codec_mode = st->codec_mode; + st->last_extl = st->extl; + st->last_L_frame = st->L_frame; + st->prev_old_bfi = st->prev_bfi; + st->prev_bfi = st->bfi; + if ( st->core != AMR_WB_CORE ) + { + st->old_bfi_cnt = st->nbLostCmpt; + } + st->last_con_tcx = st->con_tcx; + st->con_tcx = 0; + + if ( st->hHQ_nbfec != NULL ) + { + st->hHQ_nbfec->prev_last_core = st->last_core; + } + + if ( st->use_partial_copy ) + { + st->prev_rf_frame_type = st->rf_frame_type; + } + else + { + st->prev_rf_frame_type = INACTIVE; + } + + if ( st->hTcxDec != NULL ) + { + st->hTcxDec->tcxConceal_recalc_exc = 0; + } + + if ( ( st->rf_frame_type >= RF_TCXFD && st->rf_frame_type <= RF_TCXTD2 && st->use_partial_copy && st->bfi ) || !st->bfi ) + { + if ( st->bfi && st->last_good <= UNVOICED_TRANSITION && st->clas_dec > UNVOICED_TRANSITION && st->last_con_tcx && st->hTcxDec != NULL ) + { + st->hTcxDec->tcxConceal_recalc_exc = 1; + } + st->last_good = st->clas_dec; + } + + if ( st->m_frame_type == ACTIVE_FRAME && ( !st->bfi || st->use_partial_copy ) ) + { + st->rf_flag_last = st->rf_flag; + } + + if ( st->codec_mode == MODE1 ) + { + if ( !st->bfi && ( st->core_brate > SID_2k40 || ( st->core_brate > SID_1k75 && st->core == AMR_WB_CORE ) ) ) + { + st->last_active_brate = st->total_brate; + } + if ( !st->bfi || st->element_mode == EVS_MONO ) + { + st->last_core = st->core; + } + st->last_core_bfi = st->core; /* also required for clean channel decoding */ + if ( st->hHQ_core != NULL ) + { + st->hHQ_core->last_hq_core_type = hq_core_type; + } + } + else if ( st->codec_mode == MODE2 ) + { + if ( !st->bfi && st->last_is_cng == 0 ) + { + st->last_active_brate = st->total_brate; + } + + if ( st->m_frame_type != ACTIVE_FRAME ) + { + st->last_is_cng = 1; + } + + if ( !st->bfi ) + { + st->last_core = st->core; + } + st->last_core_bfi = st->core; /* also required for clean channel decoding */ + } + + st->last_core_brate = st->core_brate; + + /* save synthesis for core switching */ + if ( st->element_mode == EVS_MONO && st->core != AMR_WB_CORE ) + { + mvr2r( synth + NS2SA( st->output_Fs, ACELP_LOOK_NS + DELAY_BWE_TOTAL_NS ), st->old_synth_sw, NS2SA( st->output_Fs, FRAME_SIZE_NS - ACELP_LOOK_NS - DELAY_BWE_TOTAL_NS ) ); + } + + /* Store long-term estimates of stab_fac and log energy diff to estimate env_stab in case of core switch ACELP/TCX->HQ */ + if ( st->element_mode != EVS_MONO ) + { + output_frame = NS2SA( st->output_Fs, FRAME_SIZE_NS ); + log_energy = log2f( ( sum2_f( synth, output_frame ) / output_frame ) + 1.0f ); + log_energy_diff = fabsf( st->log_energy_old - log_energy ); + st->log_energy_old = log_energy; + st->log_energy_diff_lt = ENV_SMOOTH_FAC * log_energy_diff + ( 1.0f - ENV_SMOOTH_FAC ) * st->log_energy_diff_lt; + if ( st->core == HQ_CORE ) + { + st->stab_fac = min( 1, ( STAB_FAC_EST1 + ( STAB_FAC_EST2 * st->hHQ_core->mem_env_delta ) + ( STAB_FAC_EST3 * st->log_energy_diff_lt ) ) ); + st->stab_fac = max( 0, st->stab_fac ); + } + st->stab_fac_smooth_lt = ENV_SMOOTH_FAC * st->stab_fac + ( 1.0f - ENV_SMOOTH_FAC ) * st->stab_fac_smooth_lt; + } + + if ( ( st->core_brate <= SID_2k40 && st->cng_type == FD_CNG ) || ( st->tcxonly && st->codec_mode == MODE2 ) ) + { + /* reset LP memories */ + set_zero( st->mem_MA, M ); + if ( st->sr_core == INT_FS_16k ) + { + mvr2r( GEWB2_Ave, st->mem_AR, M ); + } + else + { + mvr2r( GEWB_Ave, st->mem_AR, M ); + } + } + + if ( st->codec_mode == MODE2 ) + { + if ( st->use_partial_copy && st->rf_frame_type == RF_NELP ) + { + st->last_nelp_mode_dec = 1; + } + else + { + st->last_nelp_mode_dec = 0; + } + } + + st->prev_use_partial_copy = st->use_partial_copy; + + st->prev_tilt_code_dec = 0.0f; + for ( i = 0; i < NB_SUBFR; i++ ) + { + st->prev_tilt_code_dec += st->tilt_code_dec[i] * 0.25f; + } + + if ( st->core == HQ_CORE ) + { + st->prev_coder_type = GENERIC; + } + else if ( st->core != AMR_WB_CORE ) + { + st->prev_coder_type = st->coder_type; + } + + /* CNG updates */ + if ( ( st->core_brate > SID_2k40 || ( st->core_brate > SID_1k75 && st->core == AMR_WB_CORE ) ) && st->first_CNG == 1 && st->hTdCngDec != NULL ) + { + if ( st->hTdCngDec->act_cnt >= BUF_DEC_RATE ) + { + st->hTdCngDec->act_cnt = 0; + } + + st->hTdCngDec->act_cnt++; + + if ( st->hTdCngDec->act_cnt == BUF_DEC_RATE && st->hTdCngDec->ho_hist_size > 0 ) + { + st->hTdCngDec->ho_hist_size--; + } + + if ( ++( st->hTdCngDec->act_cnt2 ) >= MIN_ACT_CNG_UPD ) + { + st->hTdCngDec->act_cnt2 = MIN_ACT_CNG_UPD; + } + } + + if ( st->core_brate <= SID_2k40 && st->first_CNG == 0 && ( st->cng_type == LP_CNG || st->element_mode == IVAS_CPE_MDCT ) ) + { + st->first_CNG = 1; + } + + /* synchronisation of CNG seeds */ + if ( st->hTdCngDec != NULL && ( st->bfi || ( st->core_brate != FRAME_NO_DATA && st->core_brate != SID_2k40 ) ) && st->core != AMR_WB_CORE ) + { + own_random( &( st->hTdCngDec->cng_seed ) ); + own_random( &( st->hTdCngDec->cng_ener_seed ) ); + } + + /* general updates */ + st->last_flag_cna = st->flag_cna; + if ( st->hFdCngDec != NULL ) + { + st->hFdCngDec->hFdCngCom->frame_type_previous = st->m_frame_type; + } + + if ( st->element_mode > EVS_MONO ) + { + st->m_old_frame_type = st->m_frame_type; + } + + /* update bandwidth switching parameters */ + if ( st->core == AMR_WB_CORE ) + { + st->last_bwidth = WB; + + st->prev_bws_cnt = 0; + st->bws_cnt = 0; + st->bws_cnt1 = 0; + } + else if ( ( st->codec_mode == MODE1 ) && ( ( st->core_brate > SID_2k40 ) || ( st->element_mode == EVS_MONO ) ) ) + { + updt_bw_switching( st, synth ); + } + else + { + st->last_bwidth = st->bwidth; + st->prev_bws_cnt = st->bws_cnt; + } + + if ( st->hTcxDec != NULL && st->enablePlcWaveadjust && !concealWholeFrameTmp && st->core != AMR_WB_CORE ) + { + /* update the parameters used in waveform adjustment */ + concealment_update2( synth, st->hPlcInfo, st->hTcxDec->L_frameTCX ); + } + + st->last_total_brate_ber = st->total_brate; + if ( !st->bfi ) + { + st->last_total_brate = st->total_brate; + st->last_bits_frame_nominal = st->bits_frame_nominal; + } + + st->last_low_rate_mode = st->low_rate_mode; + + /*-----------------------------------------------------------------* + * Increase the counter of initialization frames + * Limit the max number of init. frames + *-----------------------------------------------------------------*/ + + if ( st->ini_frame < MAX_FRAME_COUNTER ) + { + ( st->ini_frame )++; + } + + return; +} + +/*-------------------------------------------------------------------* + * update_decoder_LPD_cng() + * + * + *--------------------------------------------------------------------*/ + +void update_decoder_LPD_cng( + Decoder_State *st, + float *timeDomainBuffer, + float *A, + float *bpf_noise_buf ) +{ + int16_t i; + float lsp[M], lsf[M], pitch[NB_SUBFR16k]; + float *synth, synth_buf[M + 1 + L_FRAME_MAX + L_FRAME_MAX / 2]; + float tmp; + float buf_synth[OLD_SYNTH_SIZE_DEC + L_FRAME_MAX + M]; + int16_t pf_pitch[NB_SUBFR16k]; + float pf_gain[NB_SUBFR16k]; + TCX_DEC_HANDLE hTcxDec = st->hTcxDec; + + synth = synth_buf + ( 1 + M ); + + /* LPC -> LSP/lsp */ + a2lsp_stab( A, lsp, st->lsp_old ); + + /* LSP/lsp -> LSF/lsf */ + if ( st->L_frame == L_FRAME16k ) + { + lsp2lsf( lsp, lsf, M, INT_FS_16k ); + } + else + { + lsp2lsf( lsp, lsf, M, INT_FS_12k8 ); + } + + if ( hTcxDec != NULL ) + { + mvr2r( hTcxDec->old_synth, buf_synth, hTcxDec->old_synth_len ); + mvr2r( timeDomainBuffer, buf_synth + hTcxDec->old_synth_len, st->L_frame ); + + /* Update synth memory */ + mvr2r( st->syn, synth_buf, 1 + M ); + mvr2r( timeDomainBuffer, synth, st->L_frame ); + mvr2r( synth + st->L_frame - ( 1 + M ), st->syn, 1 + M ); + mvr2r( hTcxDec->old_synth + st->L_frame, hTcxDec->old_synth, hTcxDec->old_synth_len - st->L_frame ); + mvr2r( synth, hTcxDec->old_synth + hTcxDec->old_synth_len - st->L_frame, st->L_frame ); + + mvr2r( synth + st->L_frame - ( st->L_frame / 2 ), hTcxDec->old_syn_Overl, st->L_frame / 2 ); + + hTcxDec->tcxltp_last_gain_unmodified = 0.0f; + } + + /* Update pre-synth memory */ + tmp = synth[-( 1 + M )]; + preemph( synth - M, st->preemph_fac, M + st->L_frame, &tmp ); + mvr2r( synth + st->L_frame - M, st->mem_syn2, M ); + mvr2r( synth + st->L_frame - L_SYN_MEM, st->mem_syn_r, L_SYN_MEM ); + + /* Update excitation memory */ + assert( st->L_frame < L_EXC_MEM_DEC ); + mvr2r( st->old_exc + st->L_frame, st->old_exc, L_EXC_MEM_DEC - st->L_frame ); + residu( A, M, synth, st->old_exc + L_EXC_MEM_DEC - st->L_frame, st->L_frame ); + + /* Update LPC-related memories */ + mvr2r( lsp, st->lsp_old, M ); + mvr2r( lsf, st->lsf_old, M ); + mvr2r( lsp, st->lspold_uw, M ); + mvr2r( lsf, st->lsfold_uw, M ); + + hTcxDec->envWeighted = 0; + mvr2r( A, st->old_Aq_12_8, M + 1 ); + st->old_Es_pred = 0; + + /* Reset acelp memories */ + set_zero( st->dispMem, 8 ); + st->tilt_code = TILT_CODE; + st->gc_threshold = 0.0f; + + /* Update ace/tcx mode */ + st->core = ACELP_CORE; + st->last_is_cng = 1; + + /* Reset TCX overlap */ + if ( st->hTcxCfg != NULL ) + { + st->hTcxCfg->tcx_curr_overlap_mode = st->hTcxCfg->tcx_last_overlap_mode = ALDO_WINDOW; + } + + /* For BWE and Postfilter */ + mvr2r( A, &( st->mem_Aq[0] ), M + 1 ); + mvr2r( A, &( st->mem_Aq[( M + 1 )] ), M + 1 ); + mvr2r( A, &( st->mem_Aq[2 * ( M + 1 )] ), M + 1 ); + mvr2r( A, &( st->mem_Aq[3 * ( M + 1 )] ), M + 1 ); + if ( st->L_frame == L_FRAME16k ) + { + mvr2r( A, &( st->mem_Aq[4 * ( M + 1 )] ), M + 1 ); + } + + /* Update for concealment */ + st->nbLostCmpt = 0; + st->prev_old_bfi = 0; + + for ( i = 0; i < M; i++ ) + { + st->lsf_adaptive_mean[i] = ( st->lsfoldbfi1[i] + st->lsfoldbfi0[i] + lsf[i] ) / 3; + st->lsfoldbfi1[i] = st->lsfoldbfi0[i]; + st->lsfoldbfi0[i] = lsf[i]; + } + + set_f( pitch, (float) L_SUBFR, NB_SUBFR16k ); + + FEC_clas_estim( synth, pitch, st->L_frame, UNVOICED, st->codec_mode, st->mem_syn_clas_estim, &( st->clas_dec ), &st->lp_ener_bfi, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, -1.0f, st->narrowBand, CLASSIFIER_ACELP, 0, st->preemph_fac, st->tcxonly, st->last_core_brate, -1 ); + + /* Postfiltering */ + pf_pitch[0] = pf_pitch[1] = pf_pitch[2] = pf_pitch[3] = pf_pitch[4] = L_SUBFR; + pf_gain[0] = pf_gain[1] = pf_gain[2] = pf_gain[3] = pf_gain[4] = 0.f; + st->bpf_gain_param = 0; + + post_decoder( st, buf_synth, pf_gain, pf_pitch, timeDomainBuffer, bpf_noise_buf ); + + return; +} diff --git a/lib_dec/vlpc_1st_dec.c b/lib_dec/vlpc_1st_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..cc7b33bc9a5754ffb867eb9ba2a35d4e51e0262e --- /dev/null +++ b/lib_dec/vlpc_1st_dec.c @@ -0,0 +1,68 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include "options.h" +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*------------------------------------------------------------------* + * vlpc_1st_dec() + * + * + *------------------------------------------------------------------*/ + +void vlpc_1st_dec( + const int16_t index, /* i : codebook index */ + float *lsfq, /* i/o: i:prediction o:quantized lsf */ + const int32_t sr_core ) +{ + int16_t i; + const float *p_dico; + float scale = ( (float) sr_core ) / INT_FS_12k8; + + assert( index < 256 ); + + p_dico = &dico_lsf_abs_8b[index * M]; + for ( i = 0; i < M; i++ ) + { + lsfq[i] += scale * *p_dico++; + } + + return; +} diff --git a/lib_dec/vlpc_2st_dec.c b/lib_dec/vlpc_2st_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..8ac23141b83c681149148297be8f2fafbf1ed2f8 --- /dev/null +++ b/lib_dec/vlpc_2st_dec.c @@ -0,0 +1,77 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "prot.h" +#include "wmc_auto.h" + +/*------------------------------------------------------------------* + * vlpc_2st_dec() + * + * + *------------------------------------------------------------------*/ + +void vlpc_2st_dec( + float *lsfq, /* i/o: i:1st stage o:1st+2nd stage */ + int16_t *indx, /* i : index[] (4 bits per words) */ + const int16_t mode, /* i : 0=abs, >0=rel */ + const int32_t sr_core /* i : internal sampling rate */ +) +{ + int16_t i; + float w[M]; + int16_t xq[M]; + float scale = ( (float) sr_core ) / INT_FS_12k8; + + /* weighting from the 1st stage */ + lsf_weight_2st( lsfq, w, mode, sr_core ); + + /* quantize */ + AVQ_dec_lpc( indx, xq, 2 ); + + /* quantized lsf */ + for ( i = 0; i < M; i++ ) + { + lsfq[i] += scale * ( w[i] * (float) xq[i] ); + } + + /* reorder */ + v_sort( lsfq, 0, M - 1 ); + reorder_lsf( lsfq, LSF_GAP, M, sr_core ); + + return; +} diff --git a/lib_dec/voiced_dec.c b/lib_dec/voiced_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..5c2bcc1f15e6de19b2d7924b112b886d51696e90 --- /dev/null +++ b/lib_dec/voiced_dec.c @@ -0,0 +1,278 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "prot.h" +#include "cnst.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * ppp_voiced_decoder() + * + * Voiced decoder for SC-VBR + *-------------------------------------------------------------------*/ + +ivas_error ppp_voiced_decoder( + Decoder_State *st, /* i/o: state structure */ + float *out, /* o : residual signal */ + const float *lpc2, /* i : current frame LPC */ + float *exc, /* i : previous frame excitation */ + float *pitch, /* o : floating pitch values for each subframe */ + const int16_t bfi /* i : BFI flag */ +) +{ + int16_t k, delta_lag_D = 0; + SC_VBR_DEC_HANDLE hSC_VBR; + float upper_cut_off_freq_of_interest = 0, upper_cut_off_freq = 0; + int16_t pl, l; + float interp_delay[3], temp_l, temp_pl, diff; + DTFS_STRUCTURE *TMPDTFS; + DTFS_STRUCTURE *CURRP_Q_D; + DTFS_STRUCTURE *dtfs_temp; + ivas_error error; + + error = IVAS_ERR_OK; + + if ( ( error = DTFS_new( &TMPDTFS ) ) != IVAS_ERR_OK ) + { + IVAS_ERROR( error, "Error creating DTFS structure" ); + } + if ( ( error = DTFS_new( &CURRP_Q_D ) ) != IVAS_ERR_OK ) + { + IVAS_ERROR( error, "Error creating DTFS structure" ); + } + if ( ( error = DTFS_new( &dtfs_temp ) ) != IVAS_ERR_OK ) + { + IVAS_ERROR( error, "Error creating DTFS structure" ); + } + + hSC_VBR = st->hSC_VBR; + + if ( st->bwidth == NB ) + { + upper_cut_off_freq_of_interest = 3300.0; + upper_cut_off_freq = 4000.0; + } + else if ( st->bwidth == WB ) + { + upper_cut_off_freq_of_interest = 4000.0; + upper_cut_off_freq = 6400.0; + } + + /* Initialization */ + if ( hSC_VBR->firstTime_voiceddec ) + { + hSC_VBR->firstTime_voiceddec = 0; + + hSC_VBR->dtfs_dec_lag = 0; + hSC_VBR->dtfs_dec_nH = 0; + hSC_VBR->dtfs_dec_nH_4kHz = 0; + hSC_VBR->dtfs_dec_upper_cut_off_freq_of_interest = 3300.0; + hSC_VBR->dtfs_dec_upper_cut_off_freq = 4000.0; + + for ( k = 0; k < MAXLAG_WI; k++ ) + { + hSC_VBR->dtfs_dec_a[k] = 0.0; + hSC_VBR->dtfs_dec_b[k] = 0.0; + } + } + pl = (int16_t) min( rint_new( st->old_pitch_buf[( 2 * NB_SUBFR ) - 1] ), MAX_LAG_PIT ); + delta_lag_D = get_next_indice( st, 5 ); + + l = min( MAX_LAG_PIT, pl + delta_lag_D - 11 ); + + temp_pl = (float) pl; + temp_l = (float) l; + + if ( temp_pl != temp_l ) + { + for ( k = 0; k < NB_SUBFR; k++ ) + { + /* do the linear pitch interp to drive the nb_post_filt */ + Interpol_delay( interp_delay, &( temp_pl ), &( temp_l ), k, frac_4sf ); + pitch[k] = min( MAX_LAG_PIT, max( 19, interp_delay[0] ) ); + } + } + else + { + set_f( pitch, min( MAX_LAG_PIT, max( 19, temp_l ) ), NB_SUBFR ); + } + + if ( st->last_coder_type == UNVOICED ) + { + pl = l; /* if prev frame was sil/uv*/ + } + + if ( pl > (int16_t) anint( 1.85 * l ) ) + { + pl /= 2; + } + + if ( pl * 2 <= PIT_MAX && pl <= (int16_t) anint( 0.54 * l ) ) + { + pl *= 2; + } + + /* Restoring PPP memories when the last frame is non-PPP or full-rate PPP */ + if ( st->last_ppp_mode_dec != 1 ) + { + DTFS_to_fs( exc - pl, pl, dtfs_temp, st->bwidth == WB ? (int16_t) 16000 : (int16_t) 8000, 0 ); + + hSC_VBR->ph_offset_D = 0.0; + + /* Copy over PREV_CW_D into TMPDTFS */ + DTFS_copy( TMPDTFS, *dtfs_temp ); + + DTFS_car2pol( TMPDTFS ); + + hSC_VBR->lastLgainD = (float) log10( TMPDTFS->lag * DTFS_setEngyHarm( 92.0, 1104.5, 0.0, 1104.5, 1.0, TMPDTFS ) ); + hSC_VBR->lastHgainD = (float) log10( TMPDTFS->lag * DTFS_setEngyHarm( 1104.5, upper_cut_off_freq_of_interest, 1104.5, upper_cut_off_freq, 1.0, TMPDTFS ) ); + + DTFS_to_erb( *TMPDTFS, hSC_VBR->lasterbD ); + } + else + { + /* Copy DTFS related parameters from 'st' to 'dtfs_temp' structure */ + dtfs_temp->lag = hSC_VBR->dtfs_dec_lag; + dtfs_temp->nH = hSC_VBR->dtfs_dec_nH; + dtfs_temp->nH_4kHz = hSC_VBR->dtfs_dec_nH_4kHz; + dtfs_temp->upper_cut_off_freq_of_interest = hSC_VBR->dtfs_dec_upper_cut_off_freq_of_interest; + dtfs_temp->upper_cut_off_freq = hSC_VBR->dtfs_dec_upper_cut_off_freq; + + mvr2r( hSC_VBR->dtfs_dec_a, dtfs_temp->a, MAXLAG_WI ); + mvr2r( hSC_VBR->dtfs_dec_b, dtfs_temp->b, MAXLAG_WI ); + } + + CURRP_Q_D->lag = l; + + /* safety check in case of bit errors */ + if ( CURRP_Q_D->lag <= 0 ) + { + CURRP_Q_D->lag = 1; + st->BER_detect = 1; + } + + /* compute nH for lag */ + CURRP_Q_D->nH = (int16_t) floor( upper_cut_off_freq / ( ( (float) INT_FS_12k8 ) / CURRP_Q_D->lag ) ); + diff = ( (float) INT_FS_12k8 ) / CURRP_Q_D->lag; + + if ( upper_cut_off_freq - ( diff * CURRP_Q_D->nH ) >= diff ) + { + CURRP_Q_D->nH++; + } + + CURRP_Q_D->nH_4kHz = (int16_t) floor( 4000.0 / ( INT_FS_12k8 / CURRP_Q_D->lag ) ); + + if ( 4000.0 - ( diff * CURRP_Q_D->nH_4kHz ) >= diff ) + { + CURRP_Q_D->nH_4kHz++; + } + + CURRP_Q_D->upper_cut_off_freq = dtfs_temp->upper_cut_off_freq; + CURRP_Q_D->upper_cut_off_freq_of_interest = dtfs_temp->upper_cut_off_freq_of_interest; + + if ( bfi == 0 ) + { + if ( ( error = ppp_quarter_decoder( st, CURRP_Q_D, dtfs_temp->lag, &( hSC_VBR->lastLgainD ), &( hSC_VBR->lastHgainD ), &( hSC_VBR->lasterbD[0] ), bfi, *dtfs_temp ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( ( error = WIsyn( *dtfs_temp, CURRP_Q_D, lpc2, &( hSC_VBR->ph_offset_D ), out, (int16_t) L_FRAME, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + + + DTFS_copy( dtfs_temp, *CURRP_Q_D ); + + /* Copy DTFS related parameters from 'dtfs_temp' to 'st' structure */ + hSC_VBR->dtfs_dec_lag = dtfs_temp->lag; + hSC_VBR->dtfs_dec_nH = dtfs_temp->nH; + hSC_VBR->dtfs_dec_nH_4kHz = dtfs_temp->nH_4kHz; + hSC_VBR->dtfs_dec_upper_cut_off_freq_of_interest = dtfs_temp->upper_cut_off_freq_of_interest; + hSC_VBR->dtfs_dec_upper_cut_off_freq = dtfs_temp->upper_cut_off_freq; + + mvr2r( dtfs_temp->a, hSC_VBR->dtfs_dec_a, MAXLAG_WI ); + mvr2r( dtfs_temp->b, hSC_VBR->dtfs_dec_b, MAXLAG_WI ); + + free( TMPDTFS ); + free( CURRP_Q_D ); + free( dtfs_temp ); + + return error; +} + + +/*---------------------------------------------------------------------* + * sc_vbr_dec_init() + * + * Initialize SC-VBR decoder + *---------------------------------------------------------------------*/ + +void sc_vbr_dec_init( + SC_VBR_DEC_HANDLE hSC_VBR /* i/o: SC-VBR decoder handle */ +) +{ + hSC_VBR->nelp_dec_seed = 0; + hSC_VBR->firstTime_voiceddec = 1; + + /* DTFS variables */ + set_f( hSC_VBR->dtfs_dec_a, 0, MAXLAG_WI ); + set_f( hSC_VBR->dtfs_dec_b, 0, MAXLAG_WI ); + hSC_VBR->dtfs_dec_lag = 0; + hSC_VBR->dtfs_dec_nH = 0; + hSC_VBR->dtfs_dec_nH_4kHz = 0; + hSC_VBR->dtfs_dec_upper_cut_off_freq_of_interest = 0; + hSC_VBR->dtfs_dec_upper_cut_off_freq = 0; + hSC_VBR->ph_offset_D = 0; + hSC_VBR->lastLgainD = 0; + hSC_VBR->lastHgainD = 0; + set_f( hSC_VBR->lasterbD, 0, NUM_ERB_WB ); + + /* NELP decoder variables */ + set_f( hSC_VBR->bp1_filt_mem_nb_dec, 0, 14 ); + set_f( hSC_VBR->bp1_filt_mem_wb_dec, 0, 8 ); + set_f( hSC_VBR->shape1_filt_mem_dec, 0, 20 ); + set_f( hSC_VBR->shape2_filt_mem_dec, 0, 20 ); + set_f( hSC_VBR->shape3_filt_mem_dec, 0, 20 ); + + return; +} diff --git a/lib_dec/waveadjust_fec_dec.c b/lib_dec/waveadjust_fec_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..dce0e221dfa27f6980bca1129bd7f6e6aa375410 --- /dev/null +++ b/lib_dec/waveadjust_fec_dec.c @@ -0,0 +1,890 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "prot.h" +#include "wmc_auto.h" + + +/*-------------------------------------------------------------------* + * Local functions + * + *-------------------------------------------------------------------*/ + +static void LpFilter2( + const float *x, + float *y, + const int16_t N, + float *mem ) +{ + int16_t i; + + y[0] = 0.18f * mem[0] + 0.64f * mem[1] + 0.18f * x[0]; + y[1] = 0.18f * mem[1] + 0.64f * y[0] + 0.18f * x[1]; + + for ( i = 2; i < N; i++ ) + { + y[i] = 0.18f * y[i - 2] + 0.64f * y[i - 1] + 0.18f * x[i]; + } + + return; +} + +static float harmo( + const float *X, + const int16_t n, + const float f ) +{ + int16_t h, k, m = 8; + float ener = 0, ener_harmo = 0; + + for ( k = 1; k < m + 1; k++ ) + { + h = (int16_t) ( k * f - 0.5f ); + if ( k * f - h > 0.5f ) + { + ener_harmo += X[h] * X[h] + X[h + 1] * X[h + 1]; + } + else + { + ener_harmo += X[h] * X[h]; + } + } + + for ( k = 0; k < n; k++ ) + { + ener += X[k] * X[k]; + } + + return ener_harmo / ( ener + EPSILON ); +} + + +static int16_t Is_Periodic( + const float cov_max, + const int16_t zp, + const float ener, + const float ener_mean, + const int16_t pitch, + const int16_t L_frameTCX, + const float *mdctdata ) +{ + int16_t flag = 0; + float f = 2.0f * L_frameTCX / pitch; + float harm; + + harm = harmo( mdctdata /*X*/, L_frameTCX, f ); + + if ( ener < 50 || ( ener < ener_mean - 8.0f && cov_max < 0.9f ) ) + { + flag = 0; + } + else if ( cov_max > 0.8f ) + { + flag = 1; + } + else if ( zp > 100 ) + { + flag = 0; + } + else if ( ener < ener_mean - 6 ) + { + flag = 0; + } + else if ( ener > ener_mean + 1 && cov_max > 0.6f ) + { + flag = 1; + } + else if ( harm < 0.7f ) + { + flag = 0; + } + else + { + flag = 1; + } + + return flag; +} + + +static int16_t zero_pass( + const float *s, + const int16_t N ) +{ + int16_t zp = 0, i; + + for ( i = 1; i < N; i++ ) + { + if ( s[i - 1] * s[i] <= 0 ) + { + zp++; + } + } + + return zp; +} + + +static float sig_tilt( + const float *s, + const int16_t L_frameTCX ) +{ + float tilt, enr1, enr2; + int16_t L_subfr, shift = 2; + const float *p1, *p2; + + L_subfr = L_frameTCX >> 2; + p1 = s + L_subfr; + p2 = s + L_subfr - shift; + enr1 = dotp( p1, p2, L_frameTCX - L_subfr ); + enr2 = dotp( p1, p1, L_frameTCX - L_subfr ); + tilt = enr1 / ( enr2 + EPSILON ); + + return tilt; +} + + +static int16_t pitch_search( + float *s, /* lastPcmOut */ + float *outx_new, + const int16_t L_frameTCX, + float *voicing, + int16_t *zp, + float *ener, + float ener_mean, + float *mdct_data, + const int16_t core ) +{ + int16_t pitch, t, i; + float cov_max, temp, tmp, tilt, mdct_ener, low_freq_rate; + float s_LP[L_FRAME_MAX]; + float s_tmp[L_FRAME_MAX]; + int16_t L_frameTCX_tmp; + int16_t pitch_tmp[3]; + float mem[2]; + int16_t start_pos, end_pos; + int16_t cov_size; + int16_t flag, zp_current; + int16_t curr_frmsize; + float tmp_last; + float cov_max_tmp; + float temp2, voicing2; + + set_f( s_LP, 0, L_FRAME_MAX ); + mem[0] = 0.0f; + mem[1] = 0.0f; + tmp_last = 0; + cov_max_tmp = 0; + flag = 0; + + curr_frmsize = L_frameTCX; + if ( core == TCX_10_CORE ) + { + curr_frmsize = L_frameTCX >> 1; + } + + zp_current = zero_pass( outx_new, curr_frmsize ); + if ( core == TCX_10_CORE ) + { + zp_current = zp_current << 1; + } + + if ( L_frameTCX <= L_FRAME ) + { + if ( zp_current > 70 ) + { + return 0; + } + } + else + { + if ( zp_current > 105 ) + { + return 0; + } + } + + t = 30; + if ( core == TCX_10_CORE ) + { + t = 30 / 2; + mdct_data = mdct_data + curr_frmsize; + } + + mdct_ener = 0; + for ( i = 0; i < t; i++ ) + { + mdct_ener += mdct_data[i] * mdct_data[i]; + } + low_freq_rate = mdct_ener; + for ( ; i < curr_frmsize; i++ ) + { + mdct_ener += mdct_data[i] * mdct_data[i]; + } + low_freq_rate /= ( mdct_ener + EPSILON ); + + if ( core == TCX_10_CORE ) + { + mdct_data = mdct_data - curr_frmsize; + } + + if ( low_freq_rate < 0.02f ) + { + return 0; + } + + LpFilter2( s, s_LP, L_frameTCX, mem ); + + tilt = sig_tilt( s_LP, L_frameTCX ); + + if ( L_frameTCX <= L_FRAME16k ) + { + if ( tilt < 0.5f ) + { + return 0; + } + } + else + { + if ( tilt < 0.7f ) + { + return 0; + } + } + + cov_max = 0; + pitch = 0; + if ( L_frameTCX <= L_FRAME16k ) + { + start_pos = (int16_t) ( L_frameTCX * 34 / 256.0 + 0.5f ); + end_pos = (int16_t) ( L_frameTCX * 3 / 4.0 + 0.5f ); + for ( t = start_pos; t < end_pos; t++ ) + { + cov_size = L_frameTCX - t; + tmp = dotp( s_LP, s_LP + t, cov_size ) / cov_size; + if ( t > start_pos ) /* don't use the first value */ + { + if ( tmp > tmp_last ) /* store the current cov, if it is larger than the last one */ + { + cov_max_tmp = tmp; + } + else if ( cov_max < cov_max_tmp ) /* otherwise */ + { + cov_max = cov_max_tmp; /* use the last value cov, being a max */ + pitch = t - 1; /* and the last index as pitch */ + } + } + tmp_last = tmp; + } + + temp = (float) ( sqrt( dotp( s_LP + pitch, s_LP + pitch, L_frameTCX - pitch ) ) * sqrt( dotp( s_LP, s_LP, L_frameTCX - pitch ) ) ); + + *voicing = cov_max * ( L_frameTCX - pitch ) / ( temp + EPSILON ); + + temp2 = (float) ( sqrt( dotp( s_LP + ( pitch >> 1 ), s_LP + ( pitch >> 1 ), L_frameTCX - ( pitch >> 1 ) ) ) * sqrt( dotp( s_LP, s_LP, L_frameTCX - ( pitch >> 1 ) ) ) ); + + voicing2 = dotp( s_LP + ( pitch >> 1 ), s_LP, L_frameTCX - ( pitch >> 1 ) ) / temp2; + + if ( voicing2 > *voicing ) + { + pitch = pitch >> 1; + *voicing = voicing2; + } + } + else + { + L_frameTCX_tmp = L_frameTCX >> 1; + + for ( i = 0; i < L_frameTCX_tmp; i++ ) + { + s_tmp[i] = s_LP[2 * i]; + } + + start_pos = (int16_t) ( ( 34.0f * L_frameTCX_tmp ) / L_FRAME + 0.5f ); + end_pos = (int16_t) ( ( L_frameTCX_tmp >> 1 ) * 1.5f + 0.5f ); + for ( t = start_pos; t < end_pos; t++ ) + { + cov_size = L_frameTCX_tmp - t; + tmp = dotp( s_tmp, s_tmp + t, cov_size ) / cov_size; + + if ( t > start_pos ) /* don't use the first value */ + { + if ( tmp > tmp_last ) /* store the current cov, if it is larger than the last one */ + { + cov_max_tmp = tmp; + } + else if ( cov_max < cov_max_tmp ) /* otherwise */ + { + cov_max = cov_max_tmp; /* use the last value cov, being a max */ + pitch = t - 1; /* and the last index as pitch */ + } + } + + tmp_last = tmp; + } + + if ( pitch > 0 ) + { + pitch_tmp[0] = max( 2 * pitch - 1, 0 ); + pitch_tmp[1] = 2 * pitch; + pitch_tmp[2] = 2 * pitch + 1; + cov_max = 0; + pitch = 0; + + for ( i = 0; i < 3; i++ ) + { + cov_size = L_frameTCX - pitch_tmp[i]; + + temp = (float) ( sqrt( dotp( s_LP + pitch_tmp[i], s_LP + pitch_tmp[i], cov_size ) ) * sqrt( dotp( s_LP, s_LP, cov_size ) ) ); + + tmp = dotp( s_LP, s_LP + pitch_tmp[i], cov_size ) / ( temp + EPSILON ); + + if ( tmp > cov_max ) + { + cov_max = tmp; + pitch = pitch_tmp[i]; + } + } + + *voicing = cov_max; + } + } + + if ( pitch > 0 ) + { + flag = Is_Periodic( *voicing, *zp, *ener, ener_mean, pitch, L_frameTCX, mdct_data ); + } + + if ( flag == 0 ) + { + pitch = 0; + } + + return pitch; +} + + +static int16_t OverlapAdd( + float *pitch125_data, + float *sbuf, + const int16_t n, + const int16_t pitch, + const int16_t Bufsize ) +{ + int16_t pitch125 = (int16_t) floor( 0.5f + ( 1.25f * (float) pitch ) ); + int16_t Loverlap = pitch125 - pitch; + int16_t n1 = min( Loverlap, Bufsize - n ); + int16_t n2 = min( pitch125, Bufsize - n ); + int16_t i; + float tmp, dat; + + for ( i = 0; i < n1; i++ ) + { + tmp = (float) i / (float) Loverlap; + dat = sbuf[n + i]; + sbuf[n + i] = (float) ( ( 1.0 - tmp ) * dat + tmp * pitch125_data[i] ); + } + + for ( i = n1; i < n2; i++ ) + { + sbuf[n + i] = pitch125_data[i]; + } + + return ( n + pitch ); +} + + +static void add_noise( + float *sbuf, + float *outx_new_n1, + float *noise_seg, + const int16_t Len, + float *gain, + const float *gain_n, + const int16_t firstFrame ) +{ + int16_t i; + + if ( !firstFrame ) + { + sbuf[0] += *gain * ( noise_seg[0] - 0.68f * ( *outx_new_n1 ) ); + *gain = 0.99f * ( *gain ) + 0.01f * ( *gain_n ); + } + for ( i = 1; i < Len; i++ ) + { + sbuf[i] += *gain * ( noise_seg[i] - 0.68f * noise_seg[i - 1] ); + *gain = 0.99f * ( *gain ) + 0.01f * ( *gain_n ); + } + *outx_new_n1 = noise_seg[i - 1]; + + return; +} + +static int16_t waveform_adj( + T_PLCInfo_HANDLE hPlcInfo, + float *overlapbuf, + float *outdata2, + float *outx_new, + const int16_t L_frameTCX, + const float voicing, + const int16_t core ) +{ + int16_t i, i1, i2, zp1, zp2, pitch; + float sbuf[L_FRAME_MAX]; + float tmp_buf[L_FRAME_MAX], *p_tmp; + int16_t pitch125, Loverlap, n; + float pitch125_data[L_FRAME_MAX]; + + set_f( sbuf, 0, L_FRAME_MAX ); + set_f( tmp_buf, 0, L_FRAME_MAX ); + set_f( pitch125_data, 0, L_FRAME_MAX ); + + zp1 = zero_pass( outdata2, L_frameTCX >> 1 ); + zp2 = zero_pass( outdata2 + ( L_frameTCX >> 1 ), L_frameTCX >> 1 ); + + pitch = hPlcInfo->Pitch; + + /* judge if the pitch is usable */ + if ( 4 * max( zp1, 1 ) < zp2 ) + { + return 0; + } + + /* adjust the pitch value */ + if ( hPlcInfo->T_bfi && pitch <= L_frameTCX >> 1 && L_frameTCX > L_FRAME && core == TCX_20_CORE ) + { + i1 = 1 + maximum( outx_new, pitch, NULL ); + i2 = 1 + maximum( outx_new + pitch, pitch, NULL ); + if ( (float) ( i2 + pitch - i1 ) < ( 1.25f * pitch ) && ( 1.25f * ( i2 + pitch - i1 ) ) > (float) pitch && (float) ( i2 + pitch - i1 ) < (float) ( L_frameTCX >> 1 ) ) + { + pitch = i2 + pitch - i1; + } + } + + pitch125 = (int16_t) floor( 0.5f + ( 1.25f * (float) pitch ) ); + Loverlap = pitch125 - pitch; + mvr2r( outdata2 + L_frameTCX - pitch, pitch125_data, pitch ); + mvr2r( outx_new, pitch125_data + pitch, Loverlap ); + mvr2r( outx_new, sbuf, L_frameTCX ); + + p_tmp = tmp_buf + 1; + mvr2r( pitch125_data, p_tmp, pitch125 ); + p_tmp[-1] = outdata2[L_frameTCX - pitch - 1]; + p_tmp[pitch125] = outx_new[Loverlap]; + for ( i = 0; i < pitch125; i++ ) + { + pitch125_data[i] = 0.18f * p_tmp[i - 1] + 0.64f * p_tmp[i] + 0.18f * p_tmp[i + 1]; + } + + n = 0; + while ( n < L_frameTCX ) /* periodical extension */ + { + n = OverlapAdd( pitch125_data, sbuf, n, pitch, L_frameTCX ); + } + + /* maximum pitch lag is 3/4 L_frameTCX; pitch125_data is reused for + temporary storage, since outdata2 (holding the pcm data of the + last good frame) is still needed and overlapbuf overlaps outdata2 */ + mvr2r( &sbuf[L_frameTCX / 4], pitch125_data, ( 3 * L_frameTCX ) / 4 ); + + hPlcInfo->nsapp_gain = 0.0; + hPlcInfo->nsapp_gain_n = 1.0f - voicing / 2; + + /* use last good signal for noise generation */ + add_noise( sbuf, &( hPlcInfo->outx_new_n1 ), outdata2, L_frameTCX, &( hPlcInfo->nsapp_gain ), &( hPlcInfo->nsapp_gain_n ), 1 ); + + /* save current (noisy) output from IMDCT */ + mvr2r( outx_new, hPlcInfo->data_noise, L_frameTCX ); + + /* overlapbuf can now be filled with sbuf, needed for subsequently lost frames */ + mvr2r( pitch125_data, &overlapbuf[L_frameTCX / 4], ( 3 * L_frameTCX ) / 4 ); + + for ( i = 0; i < L_frameTCX; i++ ) + { + outx_new[i] = sbuf[i]; + } + + return pitch; +} + + +/*-------------------------------------------------------------------* + * waveform_adj2() + * + *-------------------------------------------------------------------*/ + +void waveform_adj2( + T_PLCInfo_HANDLE hPlcInfo, + float *overlapbuf, + float *outx_new, + const int16_t delay, + const int16_t bfi_cnt, + const int16_t bfi ) +{ + int16_t i, n = 0; + float ratio; + float sbuf[L_FRAME_MAX]; + int16_t pitch, L_frameTCX; + + pitch = hPlcInfo->Pitch; + L_frameTCX = hPlcInfo->L_frameTCX; + + if ( pitch > 0 ) + { + while ( n < L_frameTCX ) + { + /* periodical extension */ + for ( i = 0; i < min( pitch, L_frameTCX - n ); i++ ) + { + sbuf[n + i] = overlapbuf[L_frameTCX - pitch + i]; + } + n += pitch; + } + for ( i = 0; i < L_frameTCX; i++ ) + { + overlapbuf[i] = sbuf[i]; + } + + /* use last (noisy) output from IMDCT for noise generation */ + add_noise( sbuf, &( hPlcInfo->outx_new_n1 ), hPlcInfo->data_noise, L_frameTCX, &( hPlcInfo->nsapp_gain ), &( hPlcInfo->nsapp_gain_n ), 0 ); + + if ( bfi ) + { + /* save current (noisy) output from IMDCT */ + mvr2r( outx_new, hPlcInfo->data_noise, L_frameTCX ); + } + + if ( bfi_cnt == 4 || bfi == 0 ) + { + if ( bfi == 0 ) + { + int16_t gain_zero_start = 10000; + /* overlap-and-add */ + if ( hPlcInfo->step_concealgain > EPSILON ) + { + gain_zero_start = (int16_t) min( (float) L_FRAME48k, ( hPlcInfo->recovery_gain / hPlcInfo->step_concealgain ) ) + 1; + } + + if ( delay > 0 ) + { + L_frameTCX -= delay; + } + for ( i = 0; i < min( gain_zero_start, L_frameTCX ); i++ ) + { + ratio = (float) i / (float) L_frameTCX; + outx_new[i] = ( 1 - ratio ) * sbuf[i] * hPlcInfo->recovery_gain + ratio * outx_new[i]; + hPlcInfo->recovery_gain -= hPlcInfo->step_concealgain; + } + for ( i = gain_zero_start; i < L_frameTCX; i++ ) + { + ratio = (float) i / (float) L_frameTCX; + outx_new[i] = ratio * outx_new[i]; + } + if ( hPlcInfo->recovery_gain < 0.0f ) + { + hPlcInfo->recovery_gain = 0.0f; + } + } + else + { + /* overlap-and-add */ + for ( i = 0; i < L_frameTCX; i++ ) + { + ratio = (float) i / (float) L_frameTCX; + outx_new[i] = ( 1 - ratio ) * sbuf[i] + ratio * outx_new[i]; + } + } + } + else + { + mvr2r( sbuf, outx_new, L_frameTCX ); + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * set_state() + * + * + *-------------------------------------------------------------------*/ + +void set_state( + int16_t *state, + const int16_t num, + const int16_t N ) +{ + int16_t i; + + for ( i = 0; i < N - 1; i++ ) + { + state[i] = state[i + 1]; + } + state[N - 1] = num; + + return; +} + + +/*-------------------------------------------------------------------* + * concealment_init() + * + * + *-------------------------------------------------------------------*/ + +void concealment_init( + const int16_t L_frameTCX, + T_PLCInfo_HANDLE hPlcInfo ) +{ + int16_t i; + + hPlcInfo->L_frameTCX = L_frameTCX; + hPlcInfo->Pitch = 0; + hPlcInfo->T_bfi = 0; + hPlcInfo->outx_new_n1 = 0.0f; + hPlcInfo->nsapp_gain = 0.0f; + hPlcInfo->nsapp_gain_n = 0.0f; + hPlcInfo->ener_mean = 59.4260f; + hPlcInfo->ener = 0.0f; + hPlcInfo->zp = L_frameTCX; + hPlcInfo->recovery_gain = 0.0f; + hPlcInfo->step_concealgain = 0.0f; + hPlcInfo->concealment_method = TCX_NONTONAL; + hPlcInfo->subframe = 0; + hPlcInfo->nbLostCmpt = 0; + hPlcInfo->seed = RANDOM_INITSEED; + + for ( i = 0; i < TCX_TONALITY_INIT_CNT; i++ ) + { + hPlcInfo->TCX_Tonality[i] = 1; + } + for ( i = TCX_TONALITY_INIT_CNT; i < DEC_STATE_LEN; i++ ) + { + hPlcInfo->TCX_Tonality[i] = 0; + } + for ( i = 0; i < MAX_POST_LEN; i++ ) + { + hPlcInfo->Transient[i] = 1; + } + + for ( i = 0; i < L_FRAME_MAX; i++ ) + { + hPlcInfo->data_reci2[i] = 0; + } + + return; +} + + +/*-------------------------------------------------------------------* + * concealment_decode() + * + * + *-------------------------------------------------------------------*/ + +void concealment_decode( + const int16_t core, + float *invkoef, + T_PLCInfo_HANDLE hPlcInfo ) +{ + int16_t i; + int16_t *seed = &( hPlcInfo->seed ); + int16_t sign; + + if ( hPlcInfo->concealment_method == TCX_NONTONAL ) + { + if ( core == TCX_20_CORE ) + { + /* copy the data of the last frame */ + mvr2r( hPlcInfo->data_reci2, invkoef, hPlcInfo->L_frameTCX ); + + /* sign randomization */ + for ( i = 0; i < hPlcInfo->L_frameTCX; i++ ) + { + sign = ( ( own_random( seed ) >> 15 ) << 1 ) + 1; + invkoef[i] *= sign; + } + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * concealment_update() + * + * + *-------------------------------------------------------------------*/ + +void concealment_update( + const int16_t bfi, + const int16_t core, + const int16_t tonality, + float *invkoef, + T_PLCInfo_HANDLE hPlcInfo ) +{ + float *data_reci2 = hPlcInfo->data_reci2; + int16_t subframe = hPlcInfo->subframe; + int16_t i; + + if ( core == TCX_20_CORE ) + { + set_state( hPlcInfo->Transient, core, MAX_POST_LEN ); + + for ( i = 0; i < hPlcInfo->L_frameTCX; i++ ) + { + data_reci2[i] = invkoef[i]; + } + + if ( !bfi ) + { + set_state( hPlcInfo->TCX_Tonality, tonality, DEC_STATE_LEN ); + } + } + else + { + if ( subframe == 0 ) + { + set_state( hPlcInfo->Transient, core, MAX_POST_LEN ); + + if ( !bfi ) + { + set_state( hPlcInfo->TCX_Tonality, tonality, DEC_STATE_LEN ); + } + } + /* don't store the second subframe during frameloss; in + pitch_search(), low_freq_rate is derived on the last good + TCX-10 spectrum */ + if ( !bfi || subframe == 0 ) + { + float *ptr = data_reci2 + subframe; + for ( i = 0; i < ( hPlcInfo->L_frameTCX >> 1 ); i++ ) + { + ptr[i] = invkoef[i]; + } + } + } + return; +} + + +/*-------------------------------------------------------------------* + * concealment_update2() + * + * + *-------------------------------------------------------------------*/ + +void concealment_update2( + const float *outx_new, + T_PLCInfo_HANDLE hPlcInfo, + const int16_t L_frameTCX ) +{ + hPlcInfo->zp = zero_pass( outx_new, L_frameTCX ); + hPlcInfo->ener = dotp( outx_new, outx_new, L_frameTCX ) / L_frameTCX; + hPlcInfo->ener = 10 * (float) log10( hPlcInfo->ener + EPSILON ); + + if ( hPlcInfo->zp < 100 && hPlcInfo->ener > 50 ) + { + hPlcInfo->ener_mean = 0.98f * hPlcInfo->ener_mean + 0.02f * hPlcInfo->ener; + } + + return; +} + + +/*-------------------------------------------------------------------* + * concealment_signal_tuning() + * + * + *-------------------------------------------------------------------*/ + +void concealment_signal_tuning( + Decoder_State *st, + const int16_t bfi, + float *outx_new, + const int16_t past_core ) +{ + float voicing = 0; + T_PLCInfo_HANDLE hPlcInfo = st->hPlcInfo; + float *OverlapBuf = st->hTonalMDCTConc->secondLastPcmOut; + float *outdata2 = st->hTonalMDCTConc->lastPcmOut; + + if ( bfi ) + { + if ( st->enablePlcWaveadjust && hPlcInfo->concealment_method == TCX_NONTONAL ) + { + if ( st->nbLostCmpt == 1 ) + { + hPlcInfo->Pitch = pitch_search( outdata2, outx_new, st->hPlcInfo->L_frameTCX, &voicing, &hPlcInfo->zp, &hPlcInfo->ener, hPlcInfo->ener_mean, st->hPlcInfo->data_reci2, st->core ); + + if ( hPlcInfo->Pitch ) /* waveform adjustment for the first lost frame */ + { + hPlcInfo->Pitch = waveform_adj( hPlcInfo, OverlapBuf, outdata2, outx_new, st->hPlcInfo->L_frameTCX, voicing, st->core ); + } + } + else if ( st->nbLostCmpt < 5 ) /* waveform adjustment for the 2nd~4th lost frame */ + { + waveform_adj2( hPlcInfo, OverlapBuf, outx_new, 0, st->nbLostCmpt, bfi ); + } + } + hPlcInfo->T_bfi = 1; + } + else + { + if ( st->prev_bfi && past_core != ACELP_CORE && st->last_total_brate >= HQ_48k && st->last_codec_mode == MODE2 ) + { + if ( hPlcInfo->concealment_method == TCX_NONTONAL ) + { + if ( hPlcInfo->nbLostCmpt < 4 ) /* smoothing of the concealed signal with the good signal */ + { + waveform_adj2( hPlcInfo, OverlapBuf, outx_new, 0, hPlcInfo->nbLostCmpt + 1, bfi ); + } + } + } + else + { + hPlcInfo->T_bfi = 0; + } + } + + return; +} diff --git a/lib_enc/ACcontextMapping_enc.c b/lib_enc/ACcontextMapping_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..ff345d69e857ea9e34fa81b76c8770a1b8420941 --- /dev/null +++ b/lib_enc/ACcontextMapping_enc.c @@ -0,0 +1,1517 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "ivas_prot.h" /* Range coder header file */ +#include "ivas_rom_com.h" +#include "ivas_rom_enc.h" +#include "wmc_auto.h" + + +/*-------------------------------------------------------------------* + * ACcontextMapping_encode2_no_mem_s17_LC() + * + * Arithmetic encoder + *-------------------------------------------------------------------*/ + +void ACcontextMapping_encode2_no_mem_s17_LC( + BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ + int16_t *x, + int16_t nt, + int16_t lastnz, + int16_t nbbits, + int16_t resQMaxBits, + CONTEXT_HM_CONFIG *hm_cfg ) +{ + int16_t ptr[BITBUFSIZE]; + Tastat as, as_overflow; + int16_t bp, bp_overflow; + int16_t a1, b1, a1_i, b1_i, k; + uint16_t t; + int16_t pki, lev1; + int16_t rateFlag; + int16_t value; + int16_t nbbits_ntuples, nbbits_lsbs, nbbits_signs, nbbits_signs_overflow, nbbits_lsbs_overflow, flag_overflow; + int16_t *lsbs_bits; + int16_t nt_half; + int32_t c[2], *ctx; + int32_t p1, p2; + int16_t ii[2]; + int16_t idx1, idx2, idx; + int16_t numPeakIndicesOrig, numHoleIndices; + uint16_t signs[N_MAX]; + int16_t nbbits_m2; + + a1 = 0; /* to avoid compilation warnings */ + b1 = 0; /* to avoid compilation warnings */ + + /* Rate flag */ + if ( nbbits > 400 ) + { + rateFlag = 2 << NBITS_CONTEXT; + } + else + { + rateFlag = 0; + } + + /* Init */ + nt_half = nt >> 1; + c[0] = c[1] = 0; + + /* Bits for encoding the number of encoded tuples */ + nbbits_ntuples = 0; + k = 1; + + while ( k < nt / 2 ) + { + nbbits_ntuples++; + k = k << 1; + } + + t = 0; + bp = nbbits_ntuples; + nbbits_signs = 0; + nbbits_lsbs = 0; + nbbits_m2 = nbbits - 2; + flag_overflow = 0; + + if ( hm_cfg ) + { + /* mapped domain */ + numPeakIndicesOrig = hm_cfg->numPeakIndices; + hm_cfg->numPeakIndices = min( hm_cfg->numPeakIndices, lastnz ); + numHoleIndices = lastnz - hm_cfg->numPeakIndices; + + /* Mark hole indices beyond lastnz as pruned */ + for ( k = numHoleIndices; k < hm_cfg->numHoleIndices; ++k ) + { + hm_cfg->holeIndices[k] = hm_cfg->holeIndices[k] + nt; + } + + ii[0] = numPeakIndicesOrig; + ii[1] = 0; + + p1 = p2 = 0; /* to avoid compilation warnings */ + } + else + { + /* unmapped domain */ + ii[0] = 0; + + p1 = p2 = 0; + + /* Find last non-zero tuple */ + /* ensure termination of while loop by dummy value */ + a1 = x[0]; + x[0] = 1; + + while ( x[lastnz - 1] == 0 && x[lastnz - 2] == 0 ) + { + lastnz -= 2; + } + x[0] = a1; + } + + lsbs_bits = (int16_t *) ptr + nbbits - 1; + + /*Start Encoding*/ + ari_start_encoding_14bits( &as ); + + /*Main Loop through the 2-tuples*/ + b1_i = -1; + + for ( k = 0; k < lastnz; k += 2 ) + { + + if ( hm_cfg ) + { + a1_i = get_next_coeff_mapped( ii, &p1, &idx1, hm_cfg ); + b1_i = get_next_coeff_mapped( ii, &p2, &idx2, hm_cfg ); + } + else + { + a1_i = get_next_coeff_unmapped( ii, &idx1 ); + b1_i = get_next_coeff_unmapped( ii, &idx2 ); + } + + idx = min( idx1, idx2 ); + + /* Get context */ + ctx = &c[p1 | p2]; + + t = (uint16_t) ( *ctx + rateFlag ); + t += ( nt_half >= idx ) ? 0 : ( 1 << NBITS_CONTEXT ); + + /* Init current 2-tuple encoding */ + + if ( flag_overflow != 0 ) + { + x[a1_i] = 0; + x[b1_i] = 0; + } + + a1 = (int16_t) abs( x[a1_i] ); + b1 = (int16_t) abs( x[b1_i] ); + + lev1 = -1; + + /*Copy states*/ + ari_copy_states( &as, &as_overflow ); + bp_overflow = bp; + nbbits_signs_overflow = nbbits_signs; + nbbits_lsbs_overflow = nbbits_lsbs; + + /*Signs encoding*/ + + if ( a1 > 0 ) + { + signs[nbbits_signs++] = ( (uint16_t) x[a1_i] >> ( sizeof( uint16_t ) * 8 - 1 ) ); + } + + if ( b1 > 0 ) + { + signs[nbbits_signs++] = ( (uint16_t) x[b1_i] >> ( sizeof( uint16_t ) * 8 - 1 ) ); + } + + /* MSBs coding */ + while ( max( a1, b1 ) >= A_THRES ) + { + pki = ari_lookup_s17_LC[t + ( ( lev1 + 1 ) << ( NBITS_CONTEXT + NBITS_RATEQ ) )]; + bp = ari_encode_14bits_ext( ptr, bp, &as, VAL_ESC, ari_pk_s17_LC_ext[pki] ); + + *lsbs_bits-- = a1 & 1; + *lsbs_bits-- = b1 & 1; + + /* LSBs bit counting */ + nbbits_lsbs += 2; + + a1 >>= 1; + b1 >>= 1; + + lev1 = min( lev1 + 1, 2 ); + } + + pki = ari_lookup_s17_LC[t + ( ( lev1 + 1 ) << ( NBITS_CONTEXT + NBITS_RATEQ ) )]; + bp = ari_encode_14bits_ext( ptr, bp, &as, a1 + A_THRES * b1, ari_pk_s17_LC_ext[pki] ); + + + /* Check bit budget */ + if ( bp + as.bits_to_follow + nbbits_signs + nbbits_lsbs > nbbits_m2 ) + { + ari_copy_states( &as_overflow, &as ); + bp = bp_overflow; + + if ( !flag_overflow ) + { + nbbits_signs = nbbits_signs_overflow; + nbbits_lsbs = nbbits_lsbs_overflow; + + if ( hm_cfg ) + { + flag_overflow = 1; + + /* Code from now only zeros */ + x[a1_i] = 0; + x[b1_i] = 0; + lev1 = -1; + + pki = ari_lookup_s17_LC[t]; + bp = ari_encode_14bits_ext( ptr, bp, &as, 0, ari_pk_s17_LC_ext[pki] ); + + if ( bp + as.bits_to_follow + nbbits_signs + nbbits_lsbs > nbbits_m2 ) + { + ari_copy_states( &as_overflow, &as ); + bp = bp_overflow; + break; + } + } + else + { + break; + } + } + else + { + break; + } + } + + /* Update context for next 2-tuple */ + if ( p1 == p2 ) + { + /* peak-peak or hole-hole context */ + + if ( lev1 <= 0 ) + { + t = 1 + ( a1 + b1 ) * ( lev1 + 2 ); + } + else + { + t = 13 + lev1; + } + + *ctx = ( *ctx & 0xf ) * 16 + t; + } + else + { + /* mixed context */ + + if ( idx1 & 1 ) + { + /* update first context */ + c[p1] = update_mixed_context( c[p1], (int16_t) abs( x[a1_i] ) ); + } + + if ( idx2 & 1 ) + { + /* update second context */ + c[p2] = update_mixed_context( c[p2], (int16_t) abs( x[b1_i] ) ); + } + } + } /*end of the 2-tuples loop*/ + + + /* End arithmetic coder, overflow management */ + bp = ari_done_encoding_14bits( ptr, bp, &as ); + + /*Overflow is detected*/ + + if ( k != lastnz ) + { + + if ( hm_cfg ) + { + /*Fill with zero to be sure that decoder finish at the same position the MSB decoding*/ + + for ( ; bp < nbbits - ( nbbits_signs + nbbits_lsbs ); ) + { + ptr[bp++] = 0; + } + } + else + { + lastnz = k; + } + } + + /* Push number of encoded tuples */ + value = ( lastnz >> 1 ) - 1; + push_next_indice( hBstr, value, nbbits_ntuples ); + + /* Push arithmetic coded bits */ + push_next_bits( hBstr, (uint16_t *) &ptr[nbbits_ntuples], bp - nbbits_ntuples ); + + /* Push sign bits */ + push_next_bits( hBstr, (uint16_t *) signs, nbbits_signs ); + bp += nbbits_signs; + + /* write residual Quantization bits */ + for ( k = 0; k < min( nbbits - bp - nbbits_lsbs, resQMaxBits ); k++ ) + { + ptr[nbbits - 1 - nbbits_lsbs - k] = x[nt + k]; + } + + /* Write filler bits */ + for ( ; k < nbbits - bp - nbbits_lsbs; ++k ) + { + ptr[nbbits - 1 - nbbits_lsbs - k] = 0; + } + + /* Check for debugging */ + assert( bp + k <= nbbits ); + + /* Push the rest of the buffer */ + push_next_bits( hBstr, (uint16_t *) &ptr[bp], nbbits - bp ); + + return; +} + +/*-------------------------------------------------------------------* + * find_last_nz_pair() + * + * + *-------------------------------------------------------------------*/ + +static int16_t find_last_nz_pair( + const int16_t x[], + const int16_t length, + const CONTEXT_HM_CONFIG *hm_cfg ) +{ + int16_t last_nz, i; + const int16_t *tmp; + + last_nz = 2; + + if ( hm_cfg ) + { + /* mapped kernel */ + tmp = hm_cfg->indexBuffer; + + for ( i = length; i >= 4; i -= 2 ) + { + + if ( x[tmp[i - 2]] != 0 || x[tmp[i - 1]] != 0 ) + { + last_nz = i; + break; + } + } + } + else + { + /* unmapped kernel */ + + for ( i = length; i >= 4; i -= 2 ) + { + + if ( x[i - 2] != 0 || x[i - 1] != 0 ) + { + last_nz = i; + break; + } + } + } + + return last_nz; +} + + +/*-------------------------------------------------------------------* + * ACcontextMapping_encode2_estimate_no_mem_s17_LC() + * + * + *-------------------------------------------------------------------*/ + +int16_t ACcontextMapping_encode2_estimate_no_mem_s17_LC( + const int16_t *x, + const int16_t nt, + int16_t *lastnz_out, + int16_t *nEncoded, + const int16_t target, + int16_t *stop, + CONTEXT_HM_CONFIG *hm_cfg ) +{ + int16_t a1, b1, a1_i, b1_i; + int16_t k, pki, lev1; + uint16_t t; + int16_t lastnz, lastnz2; + int16_t rateFlag; + int16_t nbits_old, nbits; + int16_t stop2; + int32_t proba; + int16_t nlz; + const uint16_t *cum_freq; + int16_t symbol; + const uint8_t *lookup; + int16_t nt_half; + int32_t c[2], *ctx; + int32_t p1, p2; + int16_t ii[2]; + int16_t idx1, idx2, idx; + int16_t numPeakIndicesOrig = 0, numHoleIndices = 0; /* only to avoid compiler warning */ + + /* Rate flag */ + if ( target > 400 ) + { + rateFlag = 2 << NBITS_CONTEXT; + } + else + { + rateFlag = 0; + } + + /* 2 bits = arithmetic coder initialization interval = 1 bits for rounding last proba + 1 bit?*/ + nbits = 2; + /*proba coded on 14bits -> proba=1*/ + proba = 16384; + + /* Init */ + nt_half = nt >> 1; + stop2 = 0; + c[0] = c[1] = 0; + + /* bits to encode lastnz */ + k = 1; + + while ( k < nt / 2 ) + { + nbits++; + k = k << 1; + /* check while condition */ + } + nbits_old = nbits; + + nbits -= target; + + /* Find last non-zero tuple in the mapped domain signal */ + lastnz = find_last_nz_pair( x, nt, hm_cfg ); + + /* At least one tuple is coded */ + lastnz2 = 2; + + if ( hm_cfg ) + { + /* mapped domain */ + numPeakIndicesOrig = hm_cfg->numPeakIndices; + hm_cfg->numPeakIndices = min( hm_cfg->numPeakIndices, lastnz ); + numHoleIndices = lastnz - hm_cfg->numPeakIndices; + + /* Mark hole indices beyond lastnz as pruned */ + for ( k = numHoleIndices; k < hm_cfg->numHoleIndices; ++k ) + { + hm_cfg->holeIndices[k] = hm_cfg->holeIndices[k] + nt; + } + + ii[0] = numPeakIndicesOrig; + ii[1] = 0; + + p1 = p2 = 0; /* to avoid compilation warnings */ + } + else + { + /* unmapped domain */ + ii[0] = 0; + + p1 = p2 = 0; + } + + /* Main Loop through the 2-tuples */ + for ( k = 0; k < lastnz; k += 2 ) + { + if ( hm_cfg ) + { + a1_i = get_next_coeff_mapped( ii, &p1, &idx1, hm_cfg ); + b1_i = get_next_coeff_mapped( ii, &p2, &idx2, hm_cfg ); + } + else + { + a1_i = get_next_coeff_unmapped( ii, &idx1 ); + b1_i = get_next_coeff_unmapped( ii, &idx2 ); + } + + idx = min( idx1, idx2 ); + + /* Get context */ + ctx = &c[p1 | p2]; + + t = (uint16_t) ( *ctx + rateFlag ); + t += ( nt_half >= idx ) ? 0 : ( 1 << NBITS_CONTEXT ); + + /* Init current 2-tuple encoding */ + a1 = (int16_t) abs( x[a1_i] ); + b1 = (int16_t) abs( x[b1_i] ); + lev1 = -( 1 << ( NBITS_CONTEXT + NBITS_RATEQ ) ); + + /* Signs Bits */ + nbits += min( a1, 1 ); + nbits += min( b1, 1 ); + + /* pre-compute address of ari_pk_s17_LC_ext[0][Val_esc] to avoid doing it multiple times inside the loop */ + lookup = &ari_lookup_s17_LC[t] + ( 1 << ( NBITS_CONTEXT + NBITS_RATEQ ) ); + + /* check while condition */ + /* MSBs coding */ + while ( max( a1, b1 ) >= A_THRES ) + { + pki = lookup[lev1]; + cum_freq = ari_pk_s17_LC_ext[pki] + VAL_ESC; + /*p1*p2=proba on 28 bits: p=0.5->power(2,27)*/ + proba *= *( cum_freq ); + /*Number of leading zero computed in one cycle=norm_l() in BASOP*/ + nlz = 2; + while ( proba < 134217728 ) /*power(2,27)*/ + { + nlz++; + proba = proba << 1; + } + nbits += nlz; + /*addition added as shift not done in norm_l(): real shift = 14-nlz*/ + proba >>= 14; /*proba is rounded down on 14 bits ->automatic over-estimation of bit consumption*/ + + ( a1 ) >>= 1; + ( b1 ) >>= 1; + + lev1 = min( lev1 + ( 1 << ( NBITS_CONTEXT + NBITS_RATEQ ) ), 2 << ( NBITS_CONTEXT + NBITS_RATEQ ) ); + /* check while condition */ + } + pki = lookup[lev1]; + symbol = a1 + A_THRES * b1; + cum_freq = ari_pk_s17_LC_ext[pki] + symbol; + /*p1*p2=proba on 28 bits: p=0.5->power(2,27)*/ + proba *= ( cum_freq[0] - cum_freq[1] ); + /*Number of leading zero computed in one cycle=norm_l() in BASOP*/ + nlz = 0; + while ( proba < 134217728 ) /*power(2,27)*/ + { + nlz++; + proba = proba << 1; + } + + nbits += nlz; + proba >>= 14; /*proba is rounded down on 14 bits ->automatic over-estimation of bit consumption*/ + + /* Should we truncate? */ + if ( nbits > 0 ) + { + stop2 = 1; + + if ( *stop ) + { + break; + } + } + else + { + if ( hm_cfg || k == 0 || x[a1_i] || x[b1_i] ) + { + nbits_old = nbits + target; + lastnz2 = b1_i + 1; + } + } + + /* Update context for next 2-tuple */ + if ( p1 == p2 ) /* peak-peak or hole-hole context */ + { + lev1 >>= NBITS_CONTEXT + NBITS_RATEQ; + + if ( lev1 <= 0 ) + { + t = 1 + ( a1 + b1 ) * ( lev1 + 2 ); + } + else + { + t = 13 + lev1; + } + + *ctx = ( *ctx & 0xf ) * 16 + t; + } + else + { + /* mixed context */ + + if ( idx1 & 1 ) + { + /* update first context */ + c[p1] = update_mixed_context( c[p1], (int16_t) abs( x[a1_i] ) ); + } + + if ( idx2 & 1 ) + { + /* update second context */ + c[p2] = update_mixed_context( c[p2], (int16_t) abs( x[b1_i] ) ); + } + } + } /*end of the 2-tuples loop*/ + + nbits += target; + + /* Output */ + + if ( *stop ) + { + nbits = nbits_old; + } + + if ( stop2 ) + { + stop2 = nbits; + } + *nEncoded = lastnz2; + *stop = stop2; + *lastnz_out = lastnz; + + if ( hm_cfg ) + { + /* Restore hole indices beyond lastnz */ + for ( k = numHoleIndices; k < hm_cfg->numHoleIndices; ++k ) + { + hm_cfg->holeIndices[k] = hm_cfg->holeIndices[k] - nt; + } + hm_cfg->numPeakIndices = numPeakIndicesOrig; + } + + return nbits_old; +} + + +/* Range Coder Functions */ + +/*-------------------------------------------------------------------* + * RCcontextMapping_encode2_no_mem_s17_LCS() + * + * Range encoder + *-------------------------------------------------------------------*/ + +void RCcontextMapping_encode2_no_mem_s17_LCS( + BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ + int16_t *x, + const int16_t nt, + int16_t lastnz, + const int16_t nbbits, + const int16_t resQMaxBits, + CONTEXT_HM_CONFIG *hm_cfg ) +{ + int16_t ptr[BITBUFSIZE]; + RangeUniEncState rc_st_enc; + int16_t bp; + int16_t rc_tot_bits; /* No. of bits returned by range coder */ + int16_t pki, lev1; + uint16_t t; + int16_t rateFlag; + int16_t value; + int16_t nbbits_ntuples, nbbits_lsbs, nbbits_signs; + int16_t *lsbs_bits; + int16_t nt_half; + int16_t signs[N_MAX]; + int16_t a1, b1, k; + + a1 = 0; /* to avoid compilation warnings */ + b1 = 0; /* to avoid compilation warnings */ + + /* Init */ + nt_half = nt >> 1; + + /* Bits for encoding the number of encoded tuples */ + nbbits_ntuples = 0; + k = 1; + while ( k < nt / 2 ) + { + nbbits_ntuples++; + k = k << 1; + } + + t = 0; + nbbits_signs = 0; + nbbits_lsbs = 0; + + if ( hm_cfg ) + { + int16_t a1_i, b1_i; + int32_t c[2], *ctx; + int32_t p1, p2; + int16_t ii[2]; + int16_t idx1, idx2, idx; + int16_t numPeakIndicesOrig, numHoleIndices; + + /* Rate flag */ + if ( nbbits > 400 ) + { + rateFlag = 2 << NBITS_CONTEXT; + } + else + { + rateFlag = 0; + } + + c[0] = c[1] = 0; + + /* mapped domain */ + numPeakIndicesOrig = hm_cfg->numPeakIndices; + hm_cfg->numPeakIndices = min( hm_cfg->numPeakIndices, lastnz ); + numHoleIndices = lastnz - hm_cfg->numPeakIndices; + + /* Mark hole indices beyond lastnz as pruned */ + for ( k = numHoleIndices; k < hm_cfg->numHoleIndices; ++k ) + { + hm_cfg->holeIndices[k] = hm_cfg->holeIndices[k] + nt; + } + + ii[0] = numPeakIndicesOrig; + ii[1] = 0; + + p1 = p2 = 0; /* to avoid compilation warnings */ + + lsbs_bits = ptr + nbbits - 1; + + /*Start Encoding*/ + /* Initialize range encoder */ + rc_uni_enc_init( &rc_st_enc ); + + /*Main Loop through the 2-tuples*/ + b1_i = -1; + + for ( k = 0; k < lastnz; k += 2 ) + { + a1_i = get_next_coeff_mapped( ii, &p1, &idx1, hm_cfg ); + b1_i = get_next_coeff_mapped( ii, &p2, &idx2, hm_cfg ); + + idx = min( idx1, idx2 ); + + /* Get context */ + ctx = &c[p1 | p2]; + + t = (uint16_t) ( *ctx + rateFlag ); + t += ( nt_half >= idx ) ? 0 : ( 1 << NBITS_CONTEXT ); + + /* Init current 2-tuple encoding */ + a1 = (int16_t) abs( x[a1_i] ); + b1 = (int16_t) abs( x[b1_i] ); + + lev1 = -1; + + /*Signs encoding*/ + if ( a1 > 0 ) + { + signs[nbbits_signs++] = ( (uint16_t) x[a1_i] >> ( sizeof( uint16_t ) * 8 - 1 ) ); + } + + if ( b1 > 0 ) + { + signs[nbbits_signs++] = ( (uint16_t) x[b1_i] >> ( sizeof( uint16_t ) * 8 - 1 ) ); + } + + /* MSBs coding */ + while ( max( a1, b1 ) >= A_THRES ) + { + pki = ari_lookup_s17_LC[t + ( ( lev1 + 1 ) << ( NBITS_CONTEXT + NBITS_RATEQ ) )]; + rc_uni_enc_encode_symbol_fastS( &rc_st_enc, VAL_ESC, cum_freq_ari_pk_s17_LC_ext[pki], sym_freq_ari_pk_s17_LC_ext[pki], 14 ); /* Encode ESC symbol */ + + *lsbs_bits-- = a1 & 1; + *lsbs_bits-- = b1 & 1; + + /* LSBs bit counting */ + nbbits_lsbs += 2; + + a1 >>= 1; + b1 >>= 1; + + lev1 = min( lev1 + 1, 2 ); + } + + pki = ari_lookup_s17_LC[t + ( ( lev1 + 1 ) << ( NBITS_CONTEXT + NBITS_RATEQ ) )]; + rc_uni_enc_encode_symbol_fastS( &rc_st_enc, a1 + A_THRES * b1, cum_freq_ari_pk_s17_LC_ext[pki], sym_freq_ari_pk_s17_LC_ext[pki], 14 ); /* Encode MSB symbol */ + + /*Confirm that there is no overflow, i.e. bit-budget has not exceeded */ + + /* Update context for next 2-tuple */ + if ( p1 == p2 ) + { + /* peak-peak or hole-hole context */ + + if ( lev1 <= 0 ) + { + t = 1 + ( a1 + b1 ) * ( lev1 + 2 ); + } + else + { + t = 13 + lev1; + } + + *ctx = ( *ctx & 0xf ) * 16 + t; + } + else + { + /* mixed context */ + + if ( idx1 & 1 ) + { + /* update first context */ + c[p1] = update_mixed_context( c[p1], (int16_t) abs( x[a1_i] ) ); + } + + if ( idx2 & 1 ) + { + /* update second context */ + c[p2] = update_mixed_context( c[p2], (int16_t) abs( x[b1_i] ) ); + } + } + + } /*end of the 2-tuples loop*/ + } + else /* if (!hm_cfg) */ + { + int16_t cp; + int16_t esc_nb, rateQ; + uint16_t s; + + /* Rate flag */ + if ( nbbits > 400 ) + { + rateFlag = 2; + } + else + { + rateFlag = 0; + } + + s = 0; + + /* Find last non-zero tuple */ + /* ensure termination of while loop by dummy value */ + a1 = x[0]; + x[0] = 1; /* ensure first tuple is non-zero */ + + while ( x[lastnz - 1] == 0 && x[lastnz - 2] == 0 ) + { + lastnz -= 2; + } + x[0] = a1; + + lsbs_bits = ptr + nbbits - 1; + + /*Start Encoding*/ + /* Initialize range encoder */ + rc_uni_enc_init( &rc_st_enc ); + + /*Main Loop through the 2-tuples*/ + for ( k = 0; k < lastnz; k += 2 ) + { + + /* Init current 2-tuple encoding */ + a1 = (int16_t) abs( x[k + 0] ); + b1 = (int16_t) abs( x[k + 1] ); + + lev1 = 0; + esc_nb = 0; + + /*Signs encoding*/ + if ( a1 > 0 ) + { + signs[nbbits_signs++] = ( (uint16_t) x[k + 0] >> ( sizeof( uint16_t ) * 8 - 1 ) ); + } + + if ( b1 > 0 ) + { + signs[nbbits_signs++] = ( (uint16_t) x[k + 1] >> ( sizeof( uint16_t ) * 8 - 1 ) ); + } + + rateQ = rateFlag + ( k > ( nt >> 1 ) ); + + /* MSBs coding */ + while ( max( a1, b1 ) >= A_THRES ) + { + pki = ari_lookup_s17_LC[t + ( ( rateQ ) << NBITS_CONTEXT ) + ( esc_nb << ( NBITS_CONTEXT + NBITS_RATEQ ) )]; + rc_uni_enc_encode_symbol_fastS( &rc_st_enc, VAL_ESC, cum_freq_ari_pk_s17_LC_ext[pki], sym_freq_ari_pk_s17_LC_ext[pki], 14 ); /* Encode ESC symbol */ + + *lsbs_bits-- = a1 & 1; + *lsbs_bits-- = b1 & 1; + + /* LSBs bit counting */ + nbbits_lsbs += 2; + + a1 >>= 1; + b1 >>= 1; + + lev1++; + esc_nb = min( lev1, 3 ); + } + + pki = ari_lookup_s17_LC[t + ( ( rateQ ) << NBITS_CONTEXT ) + ( esc_nb << ( NBITS_CONTEXT + NBITS_RATEQ ) )]; + rc_uni_enc_encode_symbol_fastS( &rc_st_enc, a1 + A_THRES * b1, cum_freq_ari_pk_s17_LC_ext[pki], sym_freq_ari_pk_s17_LC_ext[pki], 14 ); /* Encode MSB symbol */ + + /*Confirm that there is no overflow, i.e. bit-budget has not exceeded */ + + /* Update context for next 2-tuple */ + if ( esc_nb < 2 ) + { + cp = 1 + ( ( a1 + b1 ) * ( esc_nb + 1 ) ); + } + else + { + cp = 12 + esc_nb; + } + + /*Shift old 4 bits, replace last 4 bits*/ + s = ( s << 4 ) + cp; + t = s & 0xFF; + + } /*end of the 2-tuples loop*/ + } + + /* Finish range encoder */ + rc_tot_bits = rc_uni_enc_finish( &rc_st_enc ); /* No. of bits consumed by range coder */ + bp = rc_tot_bits + nbbits_ntuples; /* Update bitstream pointer */ + + /* Cross-check that there is no overflow */ + + /* Push number of encoded tuples */ + value = ( lastnz >> 1 ) - 1; + push_next_indice( hBstr, value, nbbits_ntuples ); + + /* Push range coded bits from byte_buffer to bitstream */ + /* 1) Push all complete bytes, one byte at a time */ + for ( k = 0; k < ( rc_tot_bits >> 3 ); k++ ) + { + push_next_indice( hBstr, rc_st_enc.byte_buffer[k], 8 ); + } + /* 2) Push remaining bits */ + if ( ( rc_tot_bits & 7 ) != 0 ) + { + push_next_indice( hBstr, rc_st_enc.byte_buffer[k] >> ( 8 - ( rc_tot_bits & 7 ) ), rc_tot_bits & 7 ); + } + + /* Push sign bits */ + push_next_bits( hBstr, (uint16_t *) signs, nbbits_signs ); + bp += nbbits_signs; + + /*write residual Quantization bits*/ + + for ( k = 0; k < min( nbbits - bp - nbbits_lsbs, resQMaxBits ); k++ ) + { + ptr[nbbits - 1 - nbbits_lsbs - k] = x[nt + k]; + } + /* Write filler bits */ + for ( ; k < nbbits - bp - nbbits_lsbs; ++k ) + { + ptr[nbbits - 1 - nbbits_lsbs - k] = 0; + } + + /* Check for debugging */ + assert( bp + k <= nbbits ); + + /* Push the rest of the buffer */ + push_next_bits( hBstr, (uint16_t *) &ptr[bp], nbbits - bp ); + + /* return (bp+nbbits_lsbs);*/ /*return only for debug plot*/ + return; +} + +/*-------------------------------------------------------------------* + * RCcontextMapping_encode2_estimate_no_mem_s17_LCS() + * + * Range coder bit-estimation + *-------------------------------------------------------------------*/ + +int16_t RCcontextMapping_encode2_estimate_no_mem_s17_LCS( + int16_t *x, /* Spectral coefficients */ + const int16_t nt, /* L - size of spectrum (no. of spectral coefficients) */ + int16_t *lastnz_out, + int16_t *nEncoded, /* No. of spectral coefficients that can be coded without an overflow occuring */ + const int16_t target, /* Target bits */ + int16_t *stop, + int16_t mode, + CONTEXT_HM_CONFIG *hm_cfg /* context-based harmonic model configuration */ +) +{ + /* Common variables */ + int16_t a1, b1; + int16_t k, pki, lev1; + uint16_t t; + int16_t lastnz, lastnz2; + int16_t rateFlag; + float bit_estimate; + int16_t symbol; + const uint8_t *lookup; + float nbits2; + + /* Initialization */ + bit_estimate = 2.0f; + nbits2 = 0.f; + + /* bits to encode lastnz */ + k = 1; + + while ( k < nt / 2 ) + { + bit_estimate++; + k = k << 1; + /* check while condition */ + } + + nbits2 = bit_estimate; + + if ( hm_cfg ) + { + int16_t a1_i, b1_i; + int16_t stop2; + int16_t total_output_bits; + int16_t nt_half; + int32_t c[2], *ctx; + int32_t p1, p2; + int16_t ii[2]; + int16_t idx1, idx2, idx; + int16_t numPeakIndicesOrig = 0, numHoleIndices = 0; /* only to avoid compiler warning */ + + /* Rate flag */ + if ( target > 400 ) + { + rateFlag = 2 << NBITS_CONTEXT; /* Select context-A for higher bitrates */ + } + else + { + rateFlag = 0; /* Select context-B for lower bitrates */ + } + + nt_half = nt >> 1; + stop2 = 0; + c[0] = c[1] = 0; + + /* Find last non-zero tuple in the mapped domain signal */ + lastnz = find_last_nz_pair( x, nt, hm_cfg ); + + lastnz2 = 2; + + /* mapped domain */ + numPeakIndicesOrig = hm_cfg->numPeakIndices; + hm_cfg->numPeakIndices = min( hm_cfg->numPeakIndices, lastnz ); + numHoleIndices = lastnz - hm_cfg->numPeakIndices; + + /* Mark hole indices beyond lastnz as pruned */ + for ( k = numHoleIndices; k < hm_cfg->numHoleIndices; ++k ) + { + hm_cfg->holeIndices[k] = hm_cfg->holeIndices[k] + nt; + } + + ii[0] = numPeakIndicesOrig; + ii[1] = 0; + + p1 = p2 = 0; /* to avoid compilation warnings */ + + /* Main Loop through the 2-tuples */ + for ( k = 0; k < lastnz; k += 2 ) + { + a1_i = get_next_coeff_mapped( ii, &p1, &idx1, hm_cfg ); + b1_i = get_next_coeff_mapped( ii, &p2, &idx2, hm_cfg ); + + idx = min( idx1, idx2 ); + + /* Get context */ + ctx = &c[p1 | p2]; + + t = (uint16_t) ( *ctx + rateFlag ); + t += ( nt_half >= idx ) ? 0 : ( 1 << NBITS_CONTEXT ); + + /* Init current 2-tuple encoding */ + a1 = (int16_t) abs( x[a1_i] ); + b1 = (int16_t) abs( x[b1_i] ); + lev1 = -( 1 << ( NBITS_CONTEXT + NBITS_RATEQ ) ); + + /* Signs Bits */ + bit_estimate += min( a1, 1 ); + bit_estimate += min( b1, 1 ); + + /* pre-compute address of ari_pk_s17_LC_ext[0][Val_esc] to avoid doing it multiple times inside the loop */ + lookup = &ari_lookup_s17_LC[t] + ( 1 << ( NBITS_CONTEXT + NBITS_RATEQ ) ); + + /* check while condition */ + /* MSBs coding */ + while ( max( a1, b1 ) >= A_THRES ) + { + pki = lookup[lev1]; /* ESC symbol */ + + bit_estimate = bit_estimate + ari_bit_estimate_s17_LC[pki][VAL_ESC]; + bit_estimate += 2; /* Add 2 LSB bits corresponding to the bit-plane */ + + ( a1 ) >>= 1; + ( b1 ) >>= 1; + + lev1 = min( lev1 + ( 1 << ( NBITS_CONTEXT + NBITS_RATEQ ) ), 2 << ( NBITS_CONTEXT + NBITS_RATEQ ) ); + + /* check while condition */ + } + + pki = lookup[lev1]; + + symbol = a1 + A_THRES * b1; + bit_estimate = bit_estimate + ari_bit_estimate_s17_LC[pki][symbol]; + + /* Should we truncate? */ + if ( bit_estimate > target ) + { + stop2 = 1; + + if ( *stop ) + { + break; + } + } + else + { + lastnz2 = b1_i + 1; + nbits2 = bit_estimate; + } + + /* Update context for next 2-tuple */ + if ( p1 == p2 ) /* peak-peak or hole-hole context */ + { + lev1 >>= NBITS_CONTEXT + NBITS_RATEQ; + + if ( lev1 <= 0 ) + { + t = 1 + ( a1 + b1 ) * ( lev1 + 2 ); + } + else + { + t = 13 + lev1; + } + + *ctx = ( *ctx & 0xf ) * 16 + t; + } + else + { + /* mixed context */ + + if ( idx1 & 1 ) + { + /* update first context */ + c[p1] = update_mixed_context( c[p1], (int16_t) abs( x[a1_i] ) ); + } + + if ( idx2 & 1 ) + { + /* update second context */ + c[p2] = update_mixed_context( c[p2], (int16_t) abs( x[b1_i] ) ); + } + } + + } /*end of the 2-tuples loop*/ + + total_output_bits = (int16_t) ( bit_estimate + 0.5f ); + if ( *stop ) + { + total_output_bits = (int16_t) ( nbits2 + 0.5f ); + } + + if ( stop2 ) + { + stop2 = total_output_bits; + } + *nEncoded = lastnz2; + *stop = stop2; /* If zero, it means no overflow occured during bit-estimation */ + *lastnz_out = lastnz; + + /* Restore hole indices beyond lastnz */ + for ( k = numHoleIndices; k < hm_cfg->numHoleIndices; ++k ) + { + hm_cfg->holeIndices[k] = hm_cfg->holeIndices[k] - nt; + } + hm_cfg->numPeakIndices = numPeakIndicesOrig; + + return (int16_t) ( nbits2 + 0.5f ); + } + else /* if (!hm_cfg) */ + { + int16_t esc_nb, cp, rateQ; + uint16_t s; + int16_t tot_bits2; + int16_t overflow_flag = 0; + + /* Rate flag */ + if ( target > 400 ) + { + rateFlag = 2; + } + else + { + rateFlag = 0; /* Select context-B for lower bitrates */ + } + + t = 0; + s = 0; + cp = 0; + lastnz = 1; + lastnz2 = 0; + tot_bits2 = 0; + + /* Find last non-zero tuple in the mapped domain signal */ + for ( lastnz = ( nt - 2 ); lastnz >= 0; lastnz -= 2 ) + { + if ( ( x[lastnz] != 0 ) || ( x[lastnz + 1] != 0 ) ) + { + break; + } + } + lastnz += 2; + if ( lastnz < 2 ) + { + lastnz = 2; /* At least one tuple is coded */ + } + + lastnz2 = 2; + + /* Main Loop through the 2-tuples */ + for ( k = 0; k < lastnz; k += 2 ) + { + /* Init current 2-tuple encoding */ + a1 = (int16_t) abs( x[k] ); + b1 = (int16_t) abs( x[k + 1] ); + lev1 = 0; + esc_nb = 0; + rateQ = rateFlag + ( k > ( nt >> 1 ) ); + + /* Signs Bits */ + bit_estimate += min( a1, 1 ); + bit_estimate += min( b1, 1 ); + + /* pre-compute address of ari_pk_s17_LC_ext[0][Val_esc] to avoid doing it multiple times inside the loop */ + lookup = &ari_lookup_s17_LC[t + ( rateQ << NBITS_CONTEXT )]; + + /* check while condition */ + /* MSBs coding */ + while ( max( a1, b1 ) >= A_THRES ) + { + pki = lookup[( esc_nb << ( NBITS_CONTEXT + NBITS_RATEQ ) )]; + + bit_estimate = bit_estimate + ari_bit_estimate_s17_LC[pki][VAL_ESC]; + bit_estimate += 2; /* Add 2 LSB bits corresponding to the bit-plane */ + + ( a1 ) >>= 1; + ( b1 ) >>= 1; + + lev1++; + esc_nb = min( lev1, 3 ); + + /* check while condition */ + } + + pki = lookup[( esc_nb << ( NBITS_CONTEXT + NBITS_RATEQ ) )]; + + symbol = a1 + A_THRES * b1; + bit_estimate = bit_estimate + ari_bit_estimate_s17_LC[pki][symbol]; + + /* Should we truncate? */ + if ( bit_estimate > target ) /* Overflow occured */ + { + overflow_flag = 1; + } + else + { + if ( abs( x[k] ) || abs( x[k + 1] ) ) /* No overflow & non-zero tuple */ + { + nbits2 = bit_estimate; + lastnz2 = k + 2; + } + } + + /* Update context for next 2-tuple */ + if ( esc_nb < 2 ) + { + cp = 1 + ( a1 + b1 ) * ( esc_nb + 1 ); + } + else + { + cp = 12 + esc_nb; + } + /*shift old bits and replace last 4 bits*/ + s = ( s << 4 ) + cp; + t = s & 0xFF; + + } /*end of the 2-tuples loop*/ + + tot_bits2 = (int16_t) ( nbits2 + 0.5f ); + if ( lastnz2 < lastnz ) /* Overflow occured because unable to code all tuples */ + { + overflow_flag = 1; + } + if ( mode == -1 ) + { + tot_bits2 = (int16_t) ( bit_estimate + 0.5f ); + } + if ( overflow_flag == 0 ) /* No overflow */ + { + *stop = 0; + } + else /* Overflow */ + { + if ( *stop ) + { + *stop = tot_bits2; + } + else + { + *stop = (int16_t) ( bit_estimate + 0.5f ); + } + } + + *lastnz_out = lastnz; + *nEncoded = lastnz2; + /* Safety mechanism to avoid overflow */ + if ( lastnz2 == 2 && overflow_flag == 1 ) + { + for ( k = 0; k < lastnz2; k++ ) + { + x[k] = 0; + } + } + + return tot_bits2; + } +} + +/*-------------------------------------------------------------------* + * RCcontextMapping_encode2_estimate_bandWise_start() + * + * Range coder - start bandwise bit-estimation + *-------------------------------------------------------------------*/ + +int16_t RCcontextMapping_encode2_estimate_bandWise_start( + int16_t *x, + const int16_t nt, + const int16_t target, + HANDLE_RC_CONTEXT_MEM hContextMem ) +{ + int16_t i, k; + + /* Rate flag */ + if ( target > 400 ) + { + hContextMem->rateFlag = 2 << NBITS_CONTEXT; + } + else + { + hContextMem->rateFlag = 0; + } + + hContextMem->bit_estimate = 2.0f; + + /* Init */ + hContextMem->nt_half = nt >> 1; + + /* bits to encode lastnz */ + k = 1; + + while ( k < hContextMem->nt_half ) + { + hContextMem->bit_estimate++; + + k = k << 1; + /* check while condition */ + } + + /* bits to encode lastnz */ + hContextMem->nbits_old = (int16_t) hContextMem->bit_estimate; + + hContextMem->ctx = 0; + hContextMem->lastnz = 2; + + /* Find last non-zero tuple */ + + for ( i = nt; i >= 4; i -= 2 ) + { + + if ( x[i - 2] != 0 || x[i - 1] != 0 ) + { + hContextMem->lastnz = i; + break; + } + } + + return (int16_t) hContextMem->bit_estimate; +} + +/*-------------------------------------------------------------------* + * RCcontextMapping_encode2_estimate_bandWise() + * + * Range coder - bandwise bit-estimation + *-------------------------------------------------------------------*/ + +int16_t RCcontextMapping_encode2_estimate_bandWise( + int16_t *x, + const int16_t start_line, + const int16_t end_line, + HANDLE_RC_CONTEXT_MEM hContextMem ) +{ + int16_t a1, b1, a1_i, b1_i; + int16_t k, pki, lev1; + uint16_t t; + int16_t bandBits = 0; + int16_t total_output_bits; /* No. of bits after finalization */ + int16_t symbol; + const uint8_t *lookup; + int16_t idx; + + /* Main Loop through the 2-tuples */ + /*hContextMem->nt_half = end_line >> 1;*/ + for ( k = start_line; k < min( hContextMem->lastnz, end_line ); k += 2 ) + { + a1_i = k; + b1_i = k + 1; + + idx = k; + + /* Get context */ + t = hContextMem->ctx + hContextMem->rateFlag; + t += ( hContextMem->nt_half >= idx ) ? 0 : ( 1 << NBITS_CONTEXT ); + + /* Init current 2-tuple encoding */ + a1 = (int16_t) abs( x[a1_i] ); + b1 = (int16_t) abs( x[b1_i] ); + lev1 = -( 1 << ( NBITS_CONTEXT + NBITS_RATEQ ) ); + + /* Signs Bits */ + hContextMem->bit_estimate += min( a1, 1 ); + hContextMem->bit_estimate += min( b1, 1 ); + + /* pre-compute address of ari_pk_s17_LC_ext[0][Val_esc] to avoid doing it multiple times inside the loop */ + lookup = &ari_lookup_s17_LC[t] + ( 1 << ( NBITS_CONTEXT + NBITS_RATEQ ) ); + + /* check while condition */ + /* MSBs coding */ + while ( max( a1, b1 ) >= A_THRES ) + { + pki = lookup[lev1]; + hContextMem->bit_estimate = hContextMem->bit_estimate + ari_bit_estimate_s17_LC[pki][VAL_ESC]; + hContextMem->bit_estimate += 2; /* Add the 2 LSB bits that were shifted out */ + + ( a1 ) >>= 1; + ( b1 ) >>= 1; + + lev1 = min( lev1 + ( 1 << ( NBITS_CONTEXT + NBITS_RATEQ ) ), 2 << ( NBITS_CONTEXT + NBITS_RATEQ ) ); + /* check while condition */ + } + + pki = lookup[lev1]; + symbol = a1 + A_THRES * b1; /* MSB symbol */ + hContextMem->bit_estimate = hContextMem->bit_estimate + ari_bit_estimate_s17_LC[pki][symbol]; + + /* Update context */ + lev1 >>= NBITS_CONTEXT + NBITS_RATEQ; + + if ( lev1 <= 0 ) + { + t = 1 + ( a1 + b1 ) * ( lev1 + 2 ); + } + else + { + t = 13 + lev1; + } + + hContextMem->ctx = ( hContextMem->ctx & 0xf ) * 16 + t; + + } /*end of the 2-tuples loop*/ + total_output_bits = (int16_t) ( hContextMem->bit_estimate + 0.5f ); + + bandBits = total_output_bits - hContextMem->nbits_old; + hContextMem->nbits_old = total_output_bits; + + return bandBits; +} diff --git a/lib_enc/FEC_enc.c b/lib_enc/FEC_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..30f35f37a06f0604bd65ef1bf883df6144714fa5 --- /dev/null +++ b/lib_enc/FEC_enc.c @@ -0,0 +1,271 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * FEC_encode() + * + * Encoder supplementary information for FEC + *-------------------------------------------------------------------*/ + +void FEC_encode( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const ACELP_config acelp_cfg, /* i/o: configuration of the ACELP */ + const float *synth, /* i : pointer to synthesized speech for E computation */ + const int16_t coder_type, /* i : type of coder */ + int16_t clas, /* i : signal clas for current frame */ + const float *fpit, /* i : close loop fractional pitch buffer */ + const float *res, /* i : LP residual signal frame */ + int16_t *last_pulse_pos, /* i/o: Position of the last pulse */ + const int16_t L_frame, /* i : Frame length */ + const int32_t total_brate /* i : total codec bitrate */ +) +{ + int16_t tmpS, index; + int16_t maxi, sign = 0, tmp_FER_pitch; + float enr_q; + + tmpS = 0; + enr_q = 1.0f; + + if ( coder_type > UNVOICED && coder_type < AUDIO && acelp_cfg.FEC_mode > 0 ) + { + /*-----------------------------------------------------------------* + * encode signal class (not needed for VC since it is clearly voiced) (2 bits) + *-----------------------------------------------------------------*/ + + if ( coder_type != VOICED ) + { + /* encode signal clas with 2 bits */ + if ( clas == UNVOICED_CLAS ) + { + index = 0; + } + else if ( clas == VOICED_TRANSITION || clas == UNVOICED_TRANSITION ) + { + index = 1; + } + else if ( clas == VOICED_CLAS ) + { + index = 2; + } + else + { + index = 3; + } + + push_indice( hBstr, IND_FEC_CLAS, index, FEC_BITS_CLS ); + } + + /*-----------------------------------------------------------------* + * Encode frame energy (5 bits) + *-----------------------------------------------------------------*/ + + if ( acelp_cfg.FEC_mode > 1 ) /* GENERIC and VOICED frames */ + { + /* frame energy (maximum energy per pitch period for voiced frames or mean energy per sample over 2nd halframe for unvoiced frames) */ + fer_energy( L_frame, clas, synth, fpit[( L_frame >> 6 ) - 1], &enr_q, L_frame ); + + /* linearly quantize the energy in the range 0 : FEC_ENR_STEP : 96 dB */ + tmpS = (int16_t) ( 10.0 * log10( enr_q + 0.001f ) / FEC_ENR_STEP ); + + if ( tmpS > FEC_ENR_QLIMIT ) + { + tmpS = FEC_ENR_QLIMIT; + } + + if ( tmpS < 0 ) + { + tmpS = 0; + } + + push_indice( hBstr, IND_FEC_ENR, tmpS, FEC_BITS_ENR ); + } + + /*-----------------------------------------------------------------* + * Encode last glottal pulse position (8 bits) + *-----------------------------------------------------------------*/ + + if ( acelp_cfg.FEC_mode > 2 ) /* GENERIC frames */ + { + /* retrieve the last glottal pulse position of the previous frame */ + /* use the current pitch information to scale or not the quantization */ + tmp_FER_pitch = (int16_t) ( fpit[0] ); /* take the 1st subframe pitch, since it is easier to retrieve it on decoder side */ + + sign = 0; + maxi = *last_pulse_pos; + if ( maxi < 0 ) + { + sign = 1; + maxi = -maxi; + } + + if ( tmp_FER_pitch >= 128 ) + { + maxi /= 2; + } + + if ( maxi > 127 ) + { + /* better not use the glottal pulse position at all instead of using a wrong pulse */ + /* can happen only with pitch > 254 and max pit = 289 and should happen very rarely */ + maxi = 0; + } + + if ( sign == 1 ) + { + maxi += 128; /* use 8 bits (MSB represents the sign of the pulse) */ + } + + push_indice( hBstr, IND_FEC_POS, maxi, FEC_BITS_POS ); + } + + /* find the glottal pulse position of the current frame (could be sent as extra FEC info in the next frame) */ + maxi = 0; + if ( clas >= VOICED_CLAS && total_brate >= ACELP_24k40 ) + { + maxi = findpulse( L_frame, res, (int16_t) ( fpit[( L_frame >> 6 ) - 1] ), 0, &sign ); + if ( sign == 1 ) + { + maxi = -maxi; + } + } + + *last_pulse_pos = maxi; + } + else + { + *last_pulse_pos = 0; + } + + return; +} + + +/*-------------------------------------------------------------------* + * FEC_lsf_estim_enc() + * + * Simulates LSF estimation in case of FEC in the encoder ( only one frame erasure is considered ) + * The estimated LSF vector is then used to check LSF stability and may invoke safety-net usage in the next frame + *-------------------------------------------------------------------*/ + +void FEC_lsf_estim_enc( + Encoder_State *st, /* i : Encoder static memory */ + float *lsf /* o : estimated LSF vector */ +) +{ + int16_t i; + float alpha, lsf_mean[M]; + + if ( st->L_frame == L_FRAME ) + { + mvr2r( UVWB_Ave, lsf_mean, M ); + } + else + { + mvr2r( GEWB2_Ave, lsf_mean, M ); + } + + /*----------------------------------------------------------------------* + * Initialize the alpha factor + *----------------------------------------------------------------------*/ + + if ( st->last_coder_type == UNVOICED ) + { + /* clearly unvoiced */ + alpha = ALPHA_UU; + } + else if ( st->last_coder_type == AUDIO || st->clas == INACTIVE_CLAS ) + { + alpha = 0.995f; + } + else if ( st->clas == UNVOICED_CLAS ) + { + /* if stable, do not flatten the spectrum in the first erased frame */ + alpha = st->stab_fac * ( 1.0f - 2.0f * ALPHA_U ) + 2.0f * ALPHA_U; + } + else if ( st->clas == UNVOICED_TRANSITION ) + { + alpha = ALPHA_UT; + } + else if ( st->clas == VOICED_CLAS || st->clas == ONSET ) + { + /* clearly voiced - mild convergence to the CNG spectrum for the first three erased frames */ + alpha = ALPHA_V; + } + else if ( st->clas == SIN_ONSET ) + { + alpha = ALPHA_S; + } + else + { + /* long erasures and onsets - rapid convergence to the CNG spectrum */ + alpha = ALPHA_VT; + } + + /*----------------------------------------------------------------------* + * Extrapolate LSF vector + *----------------------------------------------------------------------*/ + + /* extrapolate the old LSF vector */ + for ( i = 0; i < M; i++ ) + { + /* calculate mean LSF vector */ + lsf_mean[i] = BETA_FEC * lsf_mean[i] + ( 1 - BETA_FEC ) * st->lsf_adaptive_mean[i]; + + /* move old LSF vector towards the mean LSF vector */ + lsf[i] = alpha * st->lsf_old[i] + ( 1.0f - alpha ) * lsf_mean[i]; + } + + /* check LSF stability through LSF ordering */ + if ( st->L_frame == L_FRAME ) + { + reorder_lsf( lsf, MODE1_LSF_GAP, M, INT_FS_12k8 ); + } + else /* L_frame == L_FRAME16k */ + { + reorder_lsf( lsf, MODE1_LSF_GAP, M, INT_FS_16k ); + } + + return; +} diff --git a/lib_enc/SNR_calc.c b/lib_enc/SNR_calc.c new file mode 100644 index 0000000000000000000000000000000000000000..6078062ea35c5a15155853f81e25650a0f93f4e0 --- /dev/null +++ b/lib_enc/SNR_calc.c @@ -0,0 +1,261 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "prot.h" +#include "rom_enc.h" +#include "wmc_auto.h" + + +/*-------------------------------------------------------------------* + * SNR_calc() + * + * + *-------------------------------------------------------------------*/ + +void SNR_calc( + const float frame_sb_energy[], /* i : energy of sub-band divided non-uniformly */ + const float sb_bg_energy[], /* i : sub-band background energy */ + const float t_bg_energy, /* i : time background energy of several frames */ + float *snr, /* o : frequency domain SNR */ + float *tsnr, /* o : time domain SNR */ + const float frame_energy, /* i : current frame energy */ + const int16_t bwidth /* i : audio band width */ +) +{ + int16_t i; + float snr_tmp, tmp; + int16_t SNR_sb_num; + SNR_sb_num = ENERGY_BAND_NUM[bwidth - CLDFBVAD_NB_ID]; + + snr_tmp = 0; + for ( i = 0; i < SNR_sb_num; i++ ) + { + tmp = ( frame_sb_energy[i] + 0.0001f ) / ( sb_bg_energy[i] + 0.0001f ); + tmp = (float) log10( tmp ); + if ( tmp > -0.1 ) + { + if ( bwidth == CLDFBVAD_SWB_ID ) + { + tmp = tmp * 3.2f; + } + else if ( bwidth == CLDFBVAD_WB_ID ) + { + tmp = tmp * 3.31f; + } + else + { + tmp = tmp * 3.0f; + } + snr_tmp += tmp; + } + } + if ( snr_tmp < 0 ) + { + snr_tmp = 0; + } + *snr = snr_tmp / SNR_sb_num; + tmp = ( frame_energy + 0.0001f ) / ( t_bg_energy + 0.0001f ); + tmp = (float) log10( tmp ); + *tsnr = tmp * 3.0f; + if ( bwidth == CLDFBVAD_SWB_ID ) + { + tmp = ( frame_energy ) / ( t_bg_energy + FLT_MIN ); + tmp = (float) log10( tmp + FLT_MIN ); + *tsnr = tmp * 2.8f; + } + + return; +} + + +/*-------------------------------------------------------------------* + * calc_snr_flux() + * + * + *-------------------------------------------------------------------*/ + +void calc_snr_flux( + float tsnr, /* i : time-domain SNR */ + float pre_snr[], /* i/o: time-domain SNR storage */ + float *snr_flux /* o : average tsnr */ +) +{ + int16_t i; + float snr_sum = 0.0f; + + if ( tsnr < 2.6f && tsnr > 0 ) + { + pre_snr[0] = tsnr; + } + else if ( tsnr <= 0 ) + { + pre_snr[0] = 0; + } + else + { + pre_snr[0] = 2.6f; + } + + snr_sum = 0; + for ( i = 0; i < PRE_SNR_NUM; i++ ) + { + snr_sum += pre_snr[i]; + } + *snr_flux = snr_sum / PRE_SNR_NUM; + for ( i = PRE_SNR_NUM - 1; i > 0; i-- ) + { + pre_snr[i] = pre_snr[i - 1]; + } + + return; +} + + +/*-------------------------------------------------------------------* + * calc_lt_snr() + * + * + *-------------------------------------------------------------------*/ + +void calc_lt_snr( + float *lt_snr_org, /* o : original long time SNR */ + float *lt_snr, /* o : long time SNR calculated by fg_energy and bg_energy */ + const float fg_energy, /* i : foreground energy sum */ + const int16_t fg_energy_count, /* i : number of the foreground energy frame */ + const float bg_energy, /* i : background energy sum */ + const int16_t bg_energy_count, /* i : number of the background energy frame */ + const int16_t bw_index, /* i : band width index */ + const float lt_noise_sp_center0 /* i : long time noise spectral center by 0 */ +) +{ + float tmp_lt_noise_sp_center; + float rtn_lt_snr; + + const float offset = -0.00156247615814208984375f; + + tmp_lt_noise_sp_center = lt_noise_sp_center0 - 1.4f; + if ( tmp_lt_noise_sp_center > 0.8 ) + { + tmp_lt_noise_sp_center = 0.8f; + } + if ( tmp_lt_noise_sp_center < 0 ) + { + tmp_lt_noise_sp_center = 0.0f; + } + rtn_lt_snr = (float) log10( ( fg_energy * bg_energy_count + FLT_MIN ) / ( bg_energy * fg_energy_count + FLT_MIN ) ); + *lt_snr_org = rtn_lt_snr; + + if ( bg_energy_count < 56 || fg_energy_count < 56 ) + { + rtn_lt_snr = 2.1f; + } + + if ( bw_index == CLDFBVAD_NB_ID ) + { + rtn_lt_snr = ( rtn_lt_snr - 1.5f ) * 0.5f; + } + else if ( bw_index == CLDFBVAD_WB_ID ) + { + rtn_lt_snr = ( rtn_lt_snr - 1.5f ) * 0.50f; + } + else + { + rtn_lt_snr = ( rtn_lt_snr - 1.5f ) * 0.46f; + } + rtn_lt_snr = rtn_lt_snr + ( rtn_lt_snr * 0.4f + offset ) * tmp_lt_noise_sp_center * 0.4f; + if ( rtn_lt_snr < 0 ) + { + rtn_lt_snr = 0.0f; + } + + if ( rtn_lt_snr > 2.0 ) + { + rtn_lt_snr = 2.0f; + } + + *lt_snr = rtn_lt_snr; + + return; +} + + +/*-------------------------------------------------------------------* + * calc_lf_snr() + * + * + *-------------------------------------------------------------------*/ + +void calc_lf_snr( + float *lf_snr_smooth, /* o : smoothed lf_snr */ + float *lf_snr, /* o : long time frequency domain SNR calculated by l_speech_snr and l_silence_snr*/ + const float l_speech_snr, /* i : sum of active frames snr */ + const int16_t l_speech_snr_count, /* i : number of the active frame */ + const float l_silence_snr, /* i : sum of the nonactive frames snr */ + const int16_t l_silence_snr_count, /* i : number of the nonactive frame */ + const int16_t fg_energy_count, /* i : number of the foreground energy frame */ + const int16_t bg_energy_count, /* i : number of the background energy frame */ + const int16_t bw_index /* i : band width index */ +) +{ + float l_snr; + + l_snr = l_speech_snr / l_speech_snr_count - l_silence_snr / l_silence_snr_count; + *lf_snr_smooth = *lf_snr_smooth * 0.9f + 0.1f * l_snr; + + if ( bg_energy_count < 56 || fg_energy_count < 56 ) + { + l_snr = 4.8f; + } + + l_snr = ( l_snr - 3.0f ) * 0.12f; + + if ( l_snr < 0 ) + { + l_snr = 0; + } + + if ( l_snr > MAX_LF_SNR_TAB[bw_index] ) + { + l_snr = MAX_LF_SNR_TAB[bw_index]; + } + + *lf_snr = l_snr; + + return; +} diff --git a/lib_enc/acelp_core_enc.c b/lib_enc/acelp_core_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..7162bdeea49eff693096dfb393cd8c9821d5a530 --- /dev/null +++ b/lib_enc/acelp_core_enc.c @@ -0,0 +1,706 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "rom_enc.h" +#include "rom_com.h" +#include "prot.h" +#include "ivas_cnst.h" +#include "ivas_prot.h" +#include "ivas_rom_com.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * acelp_core_enc() + * + * ACELP core encoder + *--------------------------------------------------------------------*/ + +ivas_error acelp_core_enc( + Encoder_State *st, /* i/o: encoder state structure */ + const float inp[], /* i : input signal of the current frame */ + const float ener, /* i : residual energy from Levinson-Durbin*/ + float A[NB_SUBFR16k * ( M + 1 )], /* i : A(z) unquantized for the 4 subframes*/ + float Aw[NB_SUBFR16k * ( M + 1 )], /* i : weighted A(z) unquant. for subframes*/ + const float epsP[M + 1], /* i : LP prediction errors */ + float lsp_new[M], /* i : LSPs at the end of the frame */ + float lsp_mid[M], /* i : LSPs in the middle of the frame */ + const int16_t vad_hover_flag, /* i : VAD hangover flag */ + const int16_t attack_flag, /* i : attack flag (GSC or TC) */ + float bwe_exc_extended[], /* i/o: bandwidth extended excitation */ + float *voice_factors, /* o : voicing factors */ + float old_syn_12k8_16k[], /* o : intermediate ACELP synthesis at 12.8kHz or 16kHz to be used by SWB BWE */ + float pitch_buf[NB_SUBFR16k], /* o : floating pitch for each subframe */ + int16_t *unbits, /* o : number of unused bits */ + STEREO_TD_ENC_DATA_HANDLE hStereoTD, /* i/o: TD stereo encoder handle */ + const float tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel */ +) +{ + int16_t i, nBits; /* reserved bits */ + LPD_state_HANDLE hLPDmem; /* i/o: acelp memories */ + float old_exc[L_EXC], *exc; /* excitation signal buffer */ + float lsf_new[M]; /* ISFs at the end of the frame */ + float Aq[NB_SUBFR16k * ( M + 1 )]; /* A(z) quantized for the 4 subframes */ + float syn[L_FRAME16k]; /* synthesis signal buffer */ + float res[L_FRAME16k]; /* Residual signal for FER protection */ + float exc2[L_FRAME16k]; /* enhanced excitation */ + float Es_pred; /* predicited scaled innovation energy */ + float tmp_noise; /* NB post-filter long-term noise energy*/ + int16_t tc_subfr; /* TC sub-frame indication */ + float old_bwe_exc[( PIT16k_MAX + ( L_FRAME16k + 1 ) + L_SUBFR16k ) * 2]; /* excitation buffer */ + float *bwe_exc; /* excitation for SWB TBE */ + int16_t allow_cn_step; + int32_t int_fs; + float att; + int16_t nb_bits; /* parameters handling */ + + /* SC-VBR - back-up memories for LSF quantizer and synthesis filter */ + int16_t pstreaklen; + float mem_MA[M], mem_AR[M], Bin_E[L_FFT], Bin_E_old[L_FFT / 2], lsp_new_bck[M], lsp_mid_bck[M], mem_syn_bck[M]; + float clip_var, mem_w0_bck, streaklimit; + + float q_env[NUM_ENV_CNG]; + int16_t sid_bw = -1; + float exc3[L_FRAME16k]; + float syn1[L_FRAME16k]; + + float tilt_code_bck; + float gc_threshold_bck; + float clip_var_bck[6]; + int16_t next_force_sf_bck; + int16_t uc_two_stage_flag; + int16_t position; + float tmpF; + int16_t ppp_mode, nelp_mode; + int16_t tdm_lp_reuse_flag, tdm_low_rate_mode, tdm_Pitch_reuse_flag; + float *tdm_Pri_pitch_buf; + + /* bitstream */ + BSTR_ENC_HANDLE hBstr = st->hBstr; + + ivas_error error; + + error = IVAS_ERR_OK; + + if ( st->element_mode == IVAS_CPE_MDCT && st->core_brate <= SID_2k40 ) + { + /* Core was ACELP because of DTX in MDCT-Stereo, but SID encoding for that is done in separate function */ + return error; + } + + push_wmops( "acelp_core_enc" ); + /*------------------------------------------------------------------* + * Initialization + *------------------------------------------------------------------*/ + + hLPDmem = st->hLPDmem; + + Es_pred = 0; + + exc = old_exc + L_EXC_MEM; /* pointer to excitation signal in the current frame */ + mvr2r( hLPDmem->old_exc, old_exc, L_EXC_MEM ); + + if ( st->hBWE_TD != NULL ) + { + bwe_exc = old_bwe_exc + PIT16k_MAX * 2; /* pointer to BWE excitation signal in the current frame */ + mvr2r( st->hBWE_TD->old_bwe_exc, old_bwe_exc, PIT16k_MAX * 2 ); + } + else + { + bwe_exc = NULL; + } + + st->bpf_off = 0; + if ( st->last_core == HQ_CORE || st->last_codec_mode == MODE2 || st->last_core == TCX_20_CORE || st->last_core == TCX_10_CORE ) + { + /* in case of HQ->ACELP switching, do not apply BPF */ + st->bpf_off = 1; + /* reset the GSC pre echo energy threshold in case of switching */ + if ( st->hGSCEnc != NULL ) + { + st->hGSCEnc->Last_frame_ener = (float) MAX_32; + } + } + + /* force safety-net LSFQ in the first frames after CNG segment */ + if ( st->last_core_brate <= SID_2k40 ) + { + st->Nb_ACELP_frames = 0; + } + st->Nb_ACELP_frames++; + + if ( st->L_frame == L_FRAME ) + { + int_fs = INT_FS_12k8; + } + else + { + int_fs = INT_FS_16k; + } + + tmp_noise = 0; + tc_subfr = -1; + position = -1; + + /* SC-VBR temporary variables */ + pstreaklen = 0; + clip_var = 0; + mem_w0_bck = 0; + streaklimit = 0; + + /* channel-aware mode */ + reset_rf_indices( st->hRF, st->L_frame, &st->rf_target_bits_write ); + + /* VBR modes */ + if ( st->Opt_SC_VBR ) + { + ppp_mode = st->hSC_VBR->ppp_mode; + nelp_mode = st->hSC_VBR->nelp_mode; + } + else + { + ppp_mode = 0; + nelp_mode = 0; + } + + /* TD stereo */ + if ( st->element_mode == IVAS_CPE_TD && st->idchan == 1 ) + { + tdm_lp_reuse_flag = hStereoTD->tdm_lp_reuse_flag; + tdm_low_rate_mode = hStereoTD->tdm_low_rate_mode; + tdm_Pitch_reuse_flag = hStereoTD->tdm_Pitch_reuse_flag; + tdm_Pri_pitch_buf = hStereoTD->tdm_Pri_pitch_buf; + } + else + { + tdm_lp_reuse_flag = 0; + tdm_low_rate_mode = 0; + if ( st->element_mode == IVAS_SCE && st->low_rate_mode ) + { + tdm_low_rate_mode = 1; + } + tdm_Pitch_reuse_flag = 0; + tdm_Pri_pitch_buf = NULL; + } + + /*-----------------------------------------------------------------* + * ACELP@12k8 / ACELP@16k switching + *-----------------------------------------------------------------*/ + + if ( st->last_L_frame != st->L_frame && ( st->last_core == ACELP_CORE || st->last_core == AMR_WB_CORE ) ) + { + /* in case of switching, do not apply BPF (flag employed also in updt_enc()) */ + st->bpf_off = 1; + + /* force safety-net LSFQ in the first frames after ACELP@12k8/ACELP@16k switching */ + st->Nb_ACELP_frames = 1; + + /* convert old quantized LSP vector */ + if ( st->L_frame == L_FRAME ) + { + st->rate_switching_reset = lsp_convert_poly( st->lsp_old, st->L_frame, 0 ); + } + else + { + st->rate_switching_reset = st->rate_switching_reset_16kHz; + mvr2r( st->lsp_old16k, st->lsp_old, M ); + } + + /* convert old quantized LSF vector */ + lsp2lsf( st->lsp_old, st->lsf_old, M, int_fs ); + + /* interpolation of unquantized ISPs */ + if ( st->rate_switching_reset ) + { + /*extrapolation in case of unstable LSP*/ + int_lsp4( st->L_frame, lsp_mid, lsp_mid, lsp_new, A, M, 0 ); + } + else + { + int_lsp4( st->L_frame, st->lsp_old, lsp_mid, lsp_new, A, M, 0 ); + } + + /* Reset LPC mem */ + mvr2r( GEWB_Ave, st->mem_AR, M ); + set_zero( st->mem_MA, M ); + + /* update synthesis filter memories */ + synth_mem_updt2( st->L_frame, st->last_L_frame, hLPDmem->old_exc, hLPDmem->mem_syn_r, hLPDmem->mem_syn2, hLPDmem->mem_syn, ENC ); + mvr2r( hLPDmem->old_exc, old_exc, L_EXC_MEM ); + mvr2r( hLPDmem->mem_syn2, hLPDmem->mem_syn1, M ); + mvr2r( hLPDmem->mem_syn2, hLPDmem->mem_syn3, M ); + + /* update Aw[] coefficients */ + weight_a_subfr( st->L_frame / L_SUBFR, A, Aw, st->gamma, M ); + } + + if ( st->last_bwidth == NB && st->bwidth != NB && st->ini_frame != 0 ) + { + st->rate_switching_reset = 1; + } + + /*----------------------------------------------------------------* + * Encoding of CNG frames + *----------------------------------------------------------------*/ + + if ( st->core_brate == SID_2k40 || st->core_brate == FRAME_NO_DATA ) + { + if ( st->cng_type == LP_CNG ) + { + /* Run CNG post parameter update */ + cng_params_postupd( st->hTdCngEnc->ho_circ_ptr, &st->hTdCngEnc->cng_buf_cnt, st->hTdCngEnc->cng_exc2_buf, st->hTdCngEnc->cng_brate_buf, st->hTdCngEnc->ho_env_circ, st->element_mode, st->hFdCngEnc->hFdCngCom->CngBandwidth ); + + /* encode CNG parameters */ + CNG_enc( st, Aq, inp, ener, lsp_mid, lsp_new, lsf_new, &allow_cn_step, q_env, &sid_bw ); + + /* comfort noise generation */ + CNG_exc( st->core_brate, st->L_frame, &st->hTdCngEnc->Enew, &st->hTdCngEnc->cng_seed, exc, exc2, &st->hTdCngEnc->lp_ener, st->last_core_brate, &st->hDtxEnc->first_CNG, &st->hTdCngEnc->cng_ener_seed, bwe_exc, allow_cn_step, &st->hTdCngEnc->last_allow_cn_step, st->hTdCngEnc->num_ho, q_env, st->hTdCngEnc->lp_env, st->hTdCngEnc->old_env, st->hTdCngEnc->exc_mem, st->hTdCngEnc->exc_mem1, &sid_bw, &st->hTdCngEnc->cng_ener_seed1, exc3, st->Opt_AMR_WB, EVS_MONO ); + } + else + { + if ( st->core_brate == SID_2k40 && st->element_mode != IVAS_CPE_MDCT ) + { + FdCng_encodeSID( st ); + st->hDtxEnc->last_CNG_L_frame = st->L_frame; + } + + generate_comfort_noise_enc( st ); + + FdCng_exc( st->hFdCngEnc->hFdCngCom, &st->hDtxEnc->CNG_mode, st->L_frame, st->lsp_old, st->hDtxEnc->first_CNG, st->hDtxEnc->lspCNG, Aq, lsp_new, lsf_new, exc, exc2, bwe_exc ); + mvr2r( exc2, exc3, st->L_frame ); + + if ( st->core_brate == SID_2k40 ) + { + if ( st->hTdCngEnc != NULL ) + { + tmpF = cng_energy( st->element_mode, st->bwidth, st->hDtxEnc->CNG_mode, st->hTdCngEnc->CNG_att, exc, st->L_frame ); + i = (int16_t) ( ( tmpF + 2.0f ) * STEP_SID ); + i = min( max( i, 0 ), 127 ); + st->hTdCngEnc->old_enr_index = i; + } + } + } + + /* Reset HO counter in the first SID frame */ + if ( st->hTdCngEnc != NULL ) + { + st->hTdCngEnc->burst_ho_cnt = 0; + } + + /* synthesis at 12.8kHz sampling rate */ + syn_12k8( st->L_frame, Aq, exc3, syn1, hLPDmem->mem_syn3, 1 ); + + /* reset the encoder */ + CNG_reset_enc( st, pitch_buf, voice_factors, 0 ); + + /* update st->mem_syn1 for ACELP core switching */ + mvr2r( hLPDmem->mem_syn3, hLPDmem->mem_syn1, M ); + + /* update ACELP core synthesis filter memory */ + mvr2r( hLPDmem->mem_syn3, hLPDmem->mem_syn, M ); + + /* update old synthesis buffer - needed for ACELP internal sampling rate switching */ + mvr2r( syn1 + st->L_frame - L_SYN_MEM, hLPDmem->mem_syn_r, L_SYN_MEM ); + + /* save and delay synthesis to be used by SWB BWE */ + if ( st->hBWE_FD != NULL ) + { + save_old_syn( st->L_frame, syn1, old_syn_12k8_16k, st->hBWE_FD->old_syn_12k8_16k, st->preemph_fac, &st->hBWE_FD->mem_deemph_old_syn ); + } + + /*Update MODE2 core switching memory*/ + deemph( syn1, st->preemph_fac, st->L_frame, &( hLPDmem->syn[M] ) ); + mvr2r( syn1 + st->L_frame - M - 1, hLPDmem->syn, M + 1 ); + } + + /*----------------------------------------------------------------* + * Encoding of all other frames + *----------------------------------------------------------------*/ + + else + { + /*-----------------------------------------------------------------* + * Configure ACELP bit allocation + *-----------------------------------------------------------------*/ + + nb_bits = 0; + st->acelp_cfg.FEC_mode = 0; + uc_two_stage_flag = 0; + + if ( !nelp_mode && !ppp_mode ) + { + config_acelp1( ENC, st->total_brate, st->core_brate, st->core, st->extl, st->extl_brate, st->L_frame, st->GSC_noisy_speech, &( st->acelp_cfg ), hBstr->nb_bits_tot, st->coder_type, tc_subfr, 0, &nb_bits, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); + } + + /*-----------------------------------------------------------------* + * After inactive period, use the most up-to-date ISPs + *-----------------------------------------------------------------*/ + + if ( st->last_core_brate == FRAME_NO_DATA || st->last_core_brate == SID_2k40 ) + { + mvr2r( st->hDtxEnc->lspCNG, st->lsp_old, M ); + lsp2lsf( st->hDtxEnc->lspCNG, st->lsf_old, M, int_fs ); + } + + /*-----------------------------------------------------------------* + * Reset higher ACELP pre-quantizer in case of switching + *-----------------------------------------------------------------*/ + + if ( !st->use_acelp_preq ) + { + st->mem_deemp_preQ = 0.0f; + st->mem_preemp_preQ = 0.0f; + st->last_code_preq = 0; + st->last_nq_preQ = 0; + } + st->use_acelp_preq = 0; + + /*-----------------------------------------------------------------* + * LSF Quantization + * A[z] calculation + *-----------------------------------------------------------------*/ + + /* SC-VBR & channel-aware mode - back-up memories for LSF quantizer and synthesis filter */ + lsf_syn_mem_backup( st, &tilt_code_bck, &gc_threshold_bck, clip_var_bck, &next_force_sf_bck, lsp_new, lsp_mid, &clip_var, mem_AR, mem_MA, lsp_new_bck, lsp_mid_bck, Bin_E, Bin_E_old, mem_syn_bck, &mem_w0_bck, &streaklimit, &pstreaklen ); + + if ( !tdm_lp_reuse_flag ) + { + lsf_enc( st, lsf_new, lsp_new, lsp_mid, Aq, tdm_low_rate_mode, st->GSC_IVAS_mode, tdm_lsfQ_PCh ); + } + else + { + const float *pt_interp_2; + + if ( st->active_cnt != 1 ) + { + int16_t beta_index; + float lsf_wgts[M]; + + /* intra_frame prediction for the LSFs */ + lsp2lsf( lsp_new, lsf_new, M, 12800 ); + + Unified_weighting( &st->Bin_E[L_FFT / 2], lsf_new, lsf_wgts, st->bwidth == NB, st->coder_type == UNVOICED, st->sr_core, M ); + + tdm_SCh_lsf_reuse( ENC, st->element_brate, lsf_new, lsp_new, tdm_lsfQ_PCh, lsf_wgts, &beta_index ); + + push_indice( hBstr, IND_IC_LSF_PRED, beta_index, TDM_IC_LSF_PRED_BITS ); + } + + pt_interp_2 = interpol_frac_12k8; + if ( tdm_low_rate_mode == 1 && st->coder_type > UNVOICED ) + { + pt_interp_2 = interpol_frac2; + } + + if ( st->active_cnt == 1 ) + { + mvr2r( lsp_new, st->lsp_old, M ); + lsp2lsf( lsp_new, st->lsf_old, M, st->sr_core ); + lsp2lsf( lsp_new, lsf_new, M, st->sr_core ); + } + + /* LSP interpolation and conversion of LSPs to A(z) */ + int_lsp( st->L_frame, st->lsp_old, lsp_new, Aq, M, pt_interp_2, 0 ); + + /* Check LSF stability (distance between old LSFs and current LSFs) */ + st->stab_fac = lsf_stab( lsf_new, st->lsf_old, 0, st->L_frame ); + } + + if ( st->last_core == HQ_CORE && st->element_mode > EVS_MONO ) + { + /* Prepare ACB memory from last HQ frame */ + tmpF = hLPDmem->old_exc[0]; + preemph( hLPDmem->old_exc, st->preemph_fac, st->L_frame, &tmpF ); + mvr2r( hLPDmem->old_exc + st->L_frame - M, hLPDmem->mem_syn, M ); + residu( Aq, M, hLPDmem->old_exc, old_exc, st->L_frame ); + } + + if ( st->last_core != ACELP_CORE && st->element_mode > EVS_MONO ) + { + /* Prepare ACB memory of old_bwe_exc */ + if ( st->L_frame == L_FRAME ) + { + lerp( old_exc, old_bwe_exc, L_EXC_MEM_DEC * HIBND_ACB_L_FAC, L_EXC_MEM_DEC ); + } + else + { + lerp( old_exc, old_bwe_exc, L_EXC_MEM_DEC * 2, L_EXC_MEM_DEC ); + } + } + + + /*---------------------------------------------------------------* + * Calculation of LP residual (filtering through A[z] filter) + *---------------------------------------------------------------*/ + + calc_residu( inp, res, Aq, st->L_frame ); + + calculate_hangover_attenuation_gain( st, &att, vad_hover_flag ); + if ( att != 1.0f ) + { + v_multc( res, att, res, st->L_frame ); + } + + /*-----------------------------------------------------------------* + * Determine TC subframe classification + *-----------------------------------------------------------------*/ + + if ( st->coder_type == TRANSITION ) + { + tc_classif_enc( st->L_frame, &tc_subfr, &position, attack_flag, st->pitch[0], res ); + + config_acelp1( ENC, st->total_brate, st->core_brate, st->core, st->extl, st->extl_brate, st->L_frame, -1, &( st->acelp_cfg ), hBstr->nb_bits_tot, st->coder_type, tc_subfr, 1, NULL, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); + } + + /*---------------------------------------------------------------* + * Calculation of prediction for scaled innovation energy + * (for memory-less gain quantizer) + *---------------------------------------------------------------*/ + + if ( nb_bits > 0 ) + { + Es_pred_enc( &Es_pred, &i, st->L_frame, L_SUBFR, res, st->voicing, nb_bits, uc_two_stage_flag ); + push_indice( hBstr, IND_ES_PRED, i, nb_bits ); + } + + /*------------------------------------------------------------* + * Encode excitation according to coding type + *------------------------------------------------------------*/ + + if ( tdm_low_rate_mode ) /* tdm stereo low rate mode */ + { + if ( st->coder_type <= UNVOICED ) + { + tdm_low_rate_enc( st, Aq, res, syn, exc, pitch_buf, voice_factors, bwe_exc, 0 /*attack_flag*/, lsf_new, &tmp_noise ); + } + else /* GENERIC */ + { + encod_gen_2sbfr( st, inp, Aw, Aq, res, syn, exc, exc2, pitch_buf, voice_factors, bwe_exc, tdm_Pitch_reuse_flag, tdm_Pri_pitch_buf ); + } + } + else if ( nelp_mode ) + { + /* SC-VBR - NELP frames */ + encod_nelp( st, inp, Aw, Aq, res, syn, &tmp_noise, exc, exc2, pitch_buf, voice_factors, bwe_exc ); + } + else if ( st->coder_type == UNVOICED ) + { + /* UNVOICED frames (Gauss. excitation) */ + encod_unvoiced( st, inp, Aw, Aq, Es_pred, uc_two_stage_flag, res, syn, &tmp_noise, exc, pitch_buf, voice_factors, bwe_exc ); + } + else if ( st->coder_type == TRANSITION ) + { + encod_tran( st, inp, Aw, Aq, Es_pred, res, syn, exc, exc2, pitch_buf, voice_factors, bwe_exc, tc_subfr, position, unbits ); + } + else if ( ppp_mode ) + { + /* SC-VBR - PPP frames */ + if ( ( error = encod_ppp( st, inp, Aw, Aq, res, syn, exc, exc2, pitch_buf, voice_factors, bwe_exc ) ) != IVAS_ERR_OK ) + { + return error; + } + + + if ( st->hSC_VBR->bump_up ) /* PPP failed, bump up */ + { + /* restore memories of LSF quantizer and synthesis filter */ + lsf_syn_mem_restore( st, tilt_code_bck, gc_threshold_bck, clip_var_bck, next_force_sf_bck, lsp_new, lsp_mid, clip_var, mem_AR, mem_MA, lsp_new_bck, lsp_mid_bck, Bin_E, Bin_E_old, mem_syn_bck, mem_w0_bck, streaklimit, pstreaklen ); + + /* Configure ACELP bit allocation */ + config_acelp1( ENC, st->total_brate, st->core_brate, st->core, st->extl, st->extl_brate, st->L_frame, -1, &( st->acelp_cfg ), hBstr->nb_bits_tot, st->coder_type, tc_subfr, 0, &nb_bits, unbits, 0, &uc_two_stage_flag, 0, 0, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); + + /* redo LSF quantization */ + lsf_enc( st, lsf_new, lsp_new, lsp_mid, Aq, tdm_low_rate_mode, 0, NULL ); + + /* recalculation of LP residual (filtering through A[z] filter) */ + calc_residu( inp, res, Aq, st->L_frame ); + st->hTdCngEnc->burst_ho_cnt = 0; + + /* VOICED frames in SC-VBR */ + encod_gen_voic( st, inp, Aw, Aq, Es_pred, res, syn, exc, exc2, pitch_buf, voice_factors, bwe_exc, unbits, tdm_Pitch_reuse_flag, tdm_Pri_pitch_buf ); + } + } + else if ( st->coder_type == AUDIO || ( st->coder_type == INACTIVE && st->inactive_coder_type_flag ) ) + { + /* AUDIO and INACTIVE frames (coded by GSC technology) */ + encod_audio( st, inp, Aw, Aq, res, syn, exc, pitch_buf, voice_factors, bwe_exc, attack_flag, lsf_new, &tmp_noise, tdm_Pitch_reuse_flag, tdm_Pri_pitch_buf ); + } + else + { + /* GENERIC, VOICED and INACTIVE frames (coded by AVQ technology) */ + encod_gen_voic( st, inp, Aw, Aq, Es_pred, res, syn, exc, exc2, pitch_buf, voice_factors, bwe_exc, unbits, tdm_Pitch_reuse_flag, tdm_Pri_pitch_buf ); + } + + + /* update mem_syn1 for ACELP core switching */ + mvr2r( hLPDmem->mem_syn, hLPDmem->mem_syn1, M ); + + /* update old synthesis buffer - needed for ACELP internal sampling rate switching */ + mvr2r( syn + st->L_frame - L_SYN_MEM, hLPDmem->mem_syn_r, L_SYN_MEM ); + + /* save and delay synthesis to be used by SWB BWE */ + if ( st->hBWE_FD != NULL ) + { + save_old_syn( st->L_frame, syn, old_syn_12k8_16k, st->hBWE_FD->old_syn_12k8_16k, st->preemph_fac, &st->hBWE_FD->mem_deemph_old_syn ); + } + + /*Update MODE2 core switching memory*/ + mvr2r( syn, syn1, st->L_frame ); + deemph( syn1, st->preemph_fac, st->L_frame, &( hLPDmem->syn[M] ) ); + mvr2r( syn1 + st->L_frame - M - 1, hLPDmem->syn, M + 1 ); + + if ( st->element_mode > EVS_MONO && st->hTcxEnc != NULL ) + { + mvr2r( syn1 + st->L_frame / 2, st->hTcxEnc->Txnq, st->L_frame / 2 ); + } + + /*--------------------------------------------------------------------------------------* + * Modify the excitation signal when the noise is stationary + *--------------------------------------------------------------------------------------*/ + + if ( !( st->idchan == 1 && st->element_mode == IVAS_CPE_TD ) && nelp_mode != 1 && !( st->element_mode == IVAS_SCE && tdm_low_rate_mode ) ) + { + /* exc2 buffer is needed only for updating of Aq[] which is needed for core switching */ + mvr2r( exc, exc2, st->L_frame ); + stat_noise_uv_enc( st, epsP, lsp_new, lsp_mid, Aq, exc2, uc_two_stage_flag ); + } + + /*-----------------------------------------------------------------* + * Encode supplementary information for Frame Error Concealment + *-----------------------------------------------------------------*/ + + FEC_encode( hBstr, st->acelp_cfg, syn, st->coder_type, st->clas, pitch_buf, res, &st->Last_pulse_pos, st->L_frame, st->total_brate ); + + if ( st->hBWE_TD != NULL ) + { + if ( st->L_frame == L_FRAME ) + { + mvr2r( Aq + 2 * ( M + 1 ), st->hBWE_TD->cur_sub_Aq, ( M + 1 ) ); + } + else + { + mvr2r( Aq + 3 * ( M + 1 ), st->hBWE_TD->cur_sub_Aq, ( M + 1 ) ); + } + } + + + } /* end of active inp coding */ + + + /*-----------------------------------------------------------------* + * Write ACELP unused bits + *-----------------------------------------------------------------*/ + + if ( st->core_brate != SID_2k40 && st->core_brate != FRAME_NO_DATA && st->core_brate != PPP_NELP_2k80 ) + { + nBits = st->acelp_cfg.ubits; + + while ( nBits > 0 ) + { + i = min( nBits, 16 ); + push_indice( hBstr, IND_UNUSED, 0, i ); + nBits -= i; + } + } + + /*-----------------------------------------------------------------* + * Apply non linearity in case of SWB TBE + *-----------------------------------------------------------------*/ + + if ( st->hBWE_TD != NULL ) + { + if ( ( st->last_Opt_SC_VBR == 1 && st->Opt_SC_VBR == 0 ) || ( ( st->extl == SWB_TBE || st->extl == WB_TBE || st->extl == FB_TBE ) && st->last_extl != SWB_TBE && st->last_extl != WB_TBE && st->last_extl != FB_TBE ) || ( st->idchan == 1 && st->element_mode == IVAS_CPE_TD && !st->tdm_LRTD_flag ) ) + { + st->hBWE_TD->bwe_non_lin_prev_scale = 0.0f; + set_f( st->hBWE_TD->old_bwe_exc_extended, 0.0f, NL_BUFF_OFFSET ); + } + + if ( !st->Opt_SC_VBR && ( st->idchan == 0 || st->element_mode != IVAS_CPE_TD || ( st->idchan == 1 && st->element_mode == IVAS_CPE_TD && st->tdm_LRTD_flag ) ) ) + { + /* Apply a non linearity to the SHB excitation */ + non_linearity( bwe_exc, bwe_exc_extended, st->hBWE_TD->old_bwe_exc_extended, L_FRAME32k, &st->hBWE_TD->bwe_non_lin_prev_scale, st->coder_type, voice_factors, st->L_frame ); + } + + if ( st->core_brate == SID_2k40 || st->core_brate == FRAME_NO_DATA ) + { + st->hBWE_TD->bwe_non_lin_prev_scale = 0.0f; + } + } + + /*-----------------------------------------------------------------* + * Updates + *-----------------------------------------------------------------*/ + + updt_enc( st, old_exc, pitch_buf, Es_pred, Aq, lsf_new, lsp_new, old_bwe_exc ); + + if ( st->hTdCngEnc != NULL && st->Opt_DTX_ON && st->core_brate > SID_2k40 ) + { + /* update CNG parameters in active frames */ + cng_params_upd( lsp_new, exc, st->L_frame, &st->hTdCngEnc->ho_circ_ptr, st->hTdCngEnc->ho_ener_circ, &st->hTdCngEnc->ho_circ_size, st->hTdCngEnc->ho_lsp_circ, ENC, st->hTdCngEnc->ho_env_circ, &st->hTdCngEnc->cng_buf_cnt, st->hTdCngEnc->cng_exc2_buf, st->hTdCngEnc->cng_brate_buf, st->hDtxEnc->last_active_brate, st->element_mode, st->hFdCngEnc->hFdCngCom->CngBandwidth ); + + if ( st->L_frame == L_FRAME ) + { + /* store LSPs@16k, potentially to be used in CNG@16k */ + mvr2r( st->lsp_old16k, &( st->hTdCngEnc->ho_lsp_circ2[( st->hTdCngEnc->ho_circ_ptr ) * M] ), M ); + } + + /* set LSP@16k flag for the first buffer */ + st->hTdCngEnc->ho_16k_lsp[st->hTdCngEnc->ho_circ_ptr] = ( st->L_frame == L_FRAME ? 0 : 1 ); + + /* efficient DTX hangover control */ + if ( st->hTdCngEnc->burst_ho_cnt > 1 ) + { + dtx_hangover_control( st, lsp_new ); + } + } + + /* SC-VBR update of average data rate */ + if ( st->vad_flag == 1 ) + { + /* reset in case of bitrate switching in EVS */ + if ( st->hSC_VBR != NULL ) + { + update_average_rate( st->hSC_VBR, st->core_brate ); + } + } + + pop_wmops(); + + return error; +} diff --git a/lib_enc/acelp_core_switch_enc.c b/lib_enc/acelp_core_switch_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..b54262c4fd4ef07e0d5eea0c142329cf2526021a --- /dev/null +++ b/lib_enc/acelp_core_switch_enc.c @@ -0,0 +1,483 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "rom_enc.h" +#include "rom_com.h" +#include "prot.h" +#include "wmc_auto.h" + +/*---------------------------------------------------------------------* + * Local function prototypes + *---------------------------------------------------------------------*/ + +static void encod_gen_voic_core_switch( Encoder_State *st, const int16_t L_frame, const float inp[], const float Aq[], const float A[], const int16_t T_op[], const float voicing[], float *exc, const int32_t core_bitrate ); + +static void bwe_switch_enc( Encoder_State *st, const float *old_input ); + + +/*-------------------------------------------------------------------* + * acelp_core_switch_enc() + * + * ACELP core encoder in the ACELP->HQ switching frame + *--------------------------------------------------------------------*/ + +void acelp_core_switch_enc( + Encoder_State *st, /* i/o: encoder state structure */ + const float inp12k8[], /* i : input signal @12.8 kHz */ + const float inp16k[], /* i : input signal @16 kHz */ + const float A[NB_SUBFR16k * ( M + 1 )] /* i : A(z) unquantized for the 4 subframes*/ +) +{ + int16_t i, j, T_op[2]; + float old_exc[L_EXC], *exc; /* excitation signal buffer */ + const float *inp; + int32_t cbrate; + float Aq[2 * ( M + 1 )]; + uint16_t value; + int16_t nb_bits; + BSTR_ENC_HANDLE hBstr = st->hBstr; + + /* initializations */ + exc = old_exc + L_EXC_MEM; /* pointer to excitation signal in the current frame */ + mvr2r( st->hLPDmem->old_exc, old_exc, L_EXC_MEM ); + + mvr2r( st->old_Aq_12_8, Aq, M + 1 ); + mvr2r( st->old_Aq_12_8, Aq + ( M + 1 ), M + 1 ); + + T_op[0] = st->pitch[0]; + T_op[1] = st->pitch[1]; + + + /*----------------------------------------------------------------* + * set switching frame bitrate + *----------------------------------------------------------------*/ + + if ( st->last_L_frame == L_FRAME ) /* ACELP@12k8 core */ + { + inp = inp12k8; + + if ( st->core_brate > ACELP_24k40 ) + { + cbrate = ACELP_24k40; + } + else + { + cbrate = st->core_brate; + } + } + else /* ACELP@16k core */ + { + inp = inp16k; + + if ( st->core_brate <= ACELP_8k00 ) + { + cbrate = ACELP_8k00; + } + else if ( st->core_brate <= ACELP_14k80 ) + { + cbrate = ACELP_14k80; + } + else + { + cbrate = min( st->core_brate, ACELP_22k60 ); + } + } + +#ifdef FIX_I4_OL_PITCH + if ( st->last_codec_mode == MODE1 ) + { + /* in MODE1 T_op is at 12.8 kHz */ + if ( st->last_L_frame != L_FRAME ) /* ACELP@16k core -> convert T_op to 16 kHz */ + { + T_op[0] = (short) ( 1.25f * T_op[0] + 0.5f ); + T_op[1] = (short) ( 1.25f * T_op[1] + 0.5f ); + } + } + else + { + /* in MODE2 T_op is at 16 kHz */ + if ( st->last_L_frame == L_FRAME ) /* ACELP@12.8k core -> convert T_op to 12.8 kHz */ + { + T_op[0] = (short) ( 0.8f * T_op[0] + 0.5f ); + T_op[1] = (short) ( 0.8f * T_op[1] + 0.5f ); + } + } +#else + if ( st->last_L_frame != L_FRAME ) /* ACELP@16k core */ + { + T_op[0] = (short) ( 1.25f * T_op[0] + 0.5f ); + T_op[1] = (short) ( 1.25f * T_op[1] + 0.5f ); + } +#endif + /*----------------------------------------------------------------* + * Excitation encoding + *----------------------------------------------------------------*/ + + config_acelp1( ENC, st->total_brate, cbrate, st->core, -1, -1, st->last_L_frame, -1, &( st->acelp_cfg ), hBstr->nb_bits_tot, GENERIC, -1, -1, &j, &i, st->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st->idchan, st->active_cnt, 0 /*tdm_Pitch_reuse_flag*/, 0, 0 /*GSC_IVAS_mode*/ ); + + encod_gen_voic_core_switch( st, st->last_L_frame, inp, Aq, A, T_op, st->voicing, exc, cbrate ); + + /*----------------------------------------------------------------* + * Manipulate ACELP subframe indices (move them to their proper place) + *----------------------------------------------------------------*/ + + i = find_indice( hBstr, TAG_ACELP_SUBFR_LOOP_START, &value, &nb_bits ); + while ( hBstr->ind_list[i].id == TAG_ACELP_SUBFR_LOOP_START ) + { + push_indice( hBstr, IND_CORE_SWITCHING_CELP_SUBFRAME, hBstr->ind_list[i].value, hBstr->ind_list[i].nb_bits ); + i++; + } + delete_indice( hBstr, TAG_ACELP_SUBFR_LOOP_START ); + + /*----------------------------------------------------------------* + * BWE encoding + *----------------------------------------------------------------*/ + + if ( !( ( st->last_L_frame == L_FRAME16k && inner_frame_tbl[st->bwidth] == L_FRAME16k ) || inner_frame_tbl[st->bwidth] == L_FRAME8k ) ) + { + bwe_switch_enc( st, (const float *) st->old_input_signal ); + } + + return; +} + + +/*-------------------------------------------------------------------* + * encod_gen_voic_core_switch() + * + * Encode excitation signal in ACELP->HQ switching frame + *-------------------------------------------------------------------*/ + +static void encod_gen_voic_core_switch( + Encoder_State *st, /* i/o: state structure */ + const int16_t L_frame, /* i : length of the frame */ + const float inp[], /* i : input signal */ + const float Aq[], /* i : LP coefficients */ + const float A[], /* i : unquantized A(z) filter */ + const int16_t T_op[], /* i : open loop pitch */ + const float voicing[], /* i : voicing */ + float *exc, /* i/o: current non-enhanced excitation */ + const int32_t core_bitrate /* i : switching frame bitrate */ +) +{ + float res[L_SUBFR]; /* residual signal */ + float Ap[M + 1]; /* A(z) with spectral expansion */ + float xn[L_SUBFR]; /* Target vector for pitch search */ + float xn2[L_SUBFR]; /* Target vector for codebook search */ + float cn[L_SUBFR]; /* Target vector in residual domain */ + float h1[L_SUBFR + ( M + 1 )]; /* Impulse response vector */ + float code[L_SUBFR]; /* Fixed codebook excitation */ + float y1[L_SUBFR]; /* Filtered adaptive excitation */ + float y2[L_SUBFR]; /* Filtered algebraic excitation */ + float gain_pit; /* Pitch gain */ + float voice_fac; /* Voicing factor */ + float gain_code; /* Gain of code */ + float gain_inov; /* inovation gain */ + int16_t i; /* tmp variables */ + int16_t T0, T0_frac; /* close loop integer pitch and fractional part */ + int16_t T0_min, T0_max; /* pitch variables */ + float pitch; /* floating pitch value */ + float g_corr[6]; /* ACELP correl, values + gain pitch */ + int16_t clip_gain; /* ISF clip gain */ + int16_t unbits; /* number of unused bits for EVS_PI */ + float norm_gain_code; + int16_t pitch_limit_flag; + float tmpF, dummyF[NB_SUBFR16k]; + int16_t lp_select, lp_flag; + + LPD_state_HANDLE hLPDmem = st->hLPDmem; + + BSTR_ENC_HANDLE hBstr = st->hBstr; + + /*------------------------------------------------------------------* + * Initializations + *------------------------------------------------------------------*/ + + unbits = 0; + + if ( L_frame == L_FRAME ) + { + T0_max = PIT_MAX; + T0_min = PIT_MIN; + } + else /* L_frame == L_FRAME16k */ + { + T0_max = PIT16k_MAX; + T0_min = PIT16k_MIN; + } + + /*------------------------------------------------------------------* + * Calculation of LP residual (filtering through A[z] filter) + *------------------------------------------------------------------*/ + + residu( Aq, M, inp, res, L_SUBFR ); + + /*------------------------------------------------------------------* + * ACELP subframe loop + *------------------------------------------------------------------*/ + + mvr2r( res, exc, L_SUBFR ); + + if ( L_frame == L_FRAME16k ) + { + weight_a( A, Ap, GAMMA16k, M ); /* Bandwidth expansion of A(z) filter coefficients */ + find_targets( inp, hLPDmem->mem_syn, 0, &( hLPDmem->mem_w0 ), Aq, res, L_SUBFR, Ap, PREEMPH_FAC_16k, xn, cn, h1 ); + } + else + { + weight_a( A, Ap, GAMMA1, M ); /* Bandwidth expansion of A(z) filter coefficients */ + find_targets( inp, hLPDmem->mem_syn, 0, &( hLPDmem->mem_w0 ), Aq, res, L_SUBFR, Ap, PREEMPH_FAC, xn, cn, h1 ); + } + + /*----------------------------------------------------------------* + * Close-loop pitch search and quantization + * Adaptive exc. construction + *----------------------------------------------------------------*/ + + set_f( dummyF, -1, NB_SUBFR16k ); /* hack to signal ACELP->HQ switching frame */ + pitch = pit_encode( hBstr, st->acelp_cfg.pitch_bits, core_bitrate, 0, L_frame, GENERIC, &pitch_limit_flag, 0, exc, L_SUBFR, T_op, &T0_min, &T0_max, &T0, &T0_frac, h1, xn, 0 /*hStereoTD->tdm_Pitch_reuse_flag*/, dummyF /*hStereoTD->tdm_Pri_pitch_buf*/ ); + + /*-----------------------------------------------------------------* + * Find adaptive exitation + *-----------------------------------------------------------------*/ + + pred_lt4( exc, exc, T0, T0_frac, L_SUBFR + 1, inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + + /*-----------------------------------------------------------------* + * Gain clipping test to avoid unstable synthesis on frame erasure + * or in case of floating point encoder & fixed p. decoder + *-----------------------------------------------------------------*/ + + clip_gain = gp_clip( st->element_mode, core_bitrate, voicing, 0, GENERIC, xn, st->clip_var ); + + /*-----------------------------------------------------------------* + * LP filtering of the adaptive excitation, codebook target computation + *-----------------------------------------------------------------*/ + + lp_flag = st->acelp_cfg.ltf_mode; + + lp_select = lp_filt_exc_enc( MODE1, GENERIC, 0, exc, h1, xn, y1, xn2, L_SUBFR, L_frame, g_corr, clip_gain, &gain_pit, &lp_flag ); + + if ( lp_flag == NORMAL_OPERATION ) + { + push_indice( hBstr, IND_LP_FILT_SELECT, lp_select, 1 ); + } + + /*-----------------------------------------------------------------* + * Innovation encoding + *-----------------------------------------------------------------*/ + + inov_encode( st, core_bitrate, 0, L_frame, L_frame, GENERIC, st->bwidth, 0, 0, -1, Aq, gain_pit, cn, exc, h1, hLPDmem->tilt_code, pitch, xn2, code, y2, &unbits, L_SUBFR ); + + /*-----------------------------------------------------------------* + * Gain encoding + *-----------------------------------------------------------------*/ + + if ( L_frame == L_FRAME ) + { + gain_enc_mless( hBstr, st->acelp_cfg.gains_mode, st->element_mode, L_frame, 0, -1, xn, y1, y2, code, st->old_Es_pred, &gain_pit, &gain_code, &gain_inov, &norm_gain_code, g_corr, clip_gain ); + } + else + { + gain_enc_mless( hBstr, st->acelp_cfg.gains_mode, st->element_mode, L_frame, 0, -1, xn, y1, y2, code, st->old_Es_pred, &gain_pit, &gain_code, &gain_inov, &norm_gain_code, g_corr, clip_gain ); + } + + gp_clip_test_gain_pit( st->element_mode, core_bitrate, gain_pit, st->clip_var ); + + hLPDmem->tilt_code = est_tilt( exc, gain_pit, code, gain_code, &voice_fac, L_SUBFR, 0 ); + + /*-----------------------------------------------------------------* + * Construct adaptive part of the excitation + *-----------------------------------------------------------------*/ + + for ( i = 0; i < L_SUBFR; i++ ) + { + tmpF = gain_pit * exc[i]; + exc[i] = tmpF + gain_code * code[i]; + } + + /* write reserved bits */ + if ( unbits ) + { + push_indice( hBstr, IND_UNUSED, 0, unbits ); + } + + /*-----------------------------------------------------------------* + * long term prediction on the 2nd sub frame + *-----------------------------------------------------------------*/ + + pred_lt4( &exc[L_SUBFR], &exc[L_SUBFR], T0, T0_frac, L_SUBFR + 1, inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + + for ( i = 0; i < L_SUBFR; i++ ) + { + exc[i + L_SUBFR] *= gain_pit; + } + + return; +} + + +/*-------------------------------------------------------------------* + * bwe_switch_enc() + * + * Encode BWE in ACELP->HQ switching frame + *-------------------------------------------------------------------*/ + +static void bwe_switch_enc( + Encoder_State *st, /* i/o: encoder state structure */ + const float *new_speech /* i : original input signal */ +) +{ + int16_t i, k, delta, Loverlapp, d1, d1m, maxd1, ind1, fdelay, gapsize; + float accA, accB, min_sq_cross, min_corr, E1, E2, gain; + float tmp_mem[2 * L_FILT48k], tmp_mem2[2 * L_FILT48k], hb_synth_tmp[NS2SA( 48000, 10000000L )]; + const float *hp_filter; + float synth_subfr_bwe[SWITCH_MAX_GAP]; /* synthesized bwe for core switching */ + int16_t n, L, input_frame; + + input_frame = (int16_t) ( st->input_Fs / FRAMES_PER_SEC ); + + L = NS2SA( st->input_Fs, FRAME_SIZE_NS ); + n = (int16_t) ( (float) L * N_ZERO_MDCT_NS / FRAME_SIZE_NS ); + + /* set multiplication factor according to the sampling rate */ + hp_filter = hp16000_48000; + fdelay = 48; + if ( st->input_Fs == 16000 ) + { + delta = 1; + if ( st->last_L_frame == L_FRAME ) + { + hp_filter = hp12800_16000; + fdelay = 20; + } + } + else if ( st->input_Fs == 32000 ) + { + delta = 2; + if ( st->last_L_frame == L_FRAME ) + { + hp_filter = hp12800_32000; + fdelay = 40; + } + else + { + hp_filter = hp16000_32000; + fdelay = 32; + } + } + else + { + delta = 3; + if ( st->last_L_frame == L_FRAME ) + { + hp_filter = hp12800_48000; + fdelay = 60; + } + } + + set_f( tmp_mem, 0, 2 * L_FILT48k ); + set_f( tmp_mem2, 0, 2 * L_FILT48k ); + + Loverlapp = delta * SWITCH_OVERLAP_8k * 2; + gapsize = delta * ( NS2SA( 16000, SWITCH_GAP_LENGTH_NS ) ); + set_f( synth_subfr_bwe, 0, SWITCH_MAX_GAP ); + + for ( i = 0; i < gapsize + fdelay; i++ ) + { + /* target */ + synth_subfr_bwe[i] = new_speech[i + L / 2 + n + Loverlapp - gapsize]; + } + + for ( i = 0; i < fdelay; i++ ) + { + /* put the 40 past samples into the memory */ + tmp_mem[i] = new_speech[i + L / 2 + n + Loverlapp - gapsize - fdelay]; + } + + /* HP filtered target */ + fir( synth_subfr_bwe, hp_filter, synth_subfr_bwe, tmp_mem, gapsize + fdelay, fdelay, 0 ); + mvr2r( synth_subfr_bwe + (int16_t) ( fdelay / 2 ), synth_subfr_bwe, delta * ( NS2SA( 16000, SWITCH_GAP_LENGTH_NS ) ) - (int16_t) ( fdelay / 2 ) ); + + /* codebook */ + fir( new_speech, hp_filter, hb_synth_tmp, tmp_mem2, input_frame >> 1, fdelay, 1 ); + + min_sq_cross = -1; + min_corr = 0; + d1m = 0; + + maxd1 = (int16_t) ( ( ( input_frame >> 1 ) - gapsize - fdelay ) / delta ); + + /* find delay */ + for ( k = 0, d1 = 0; k < maxd1; d1 += delta, k++ ) + { + accA = accB = 0; + for ( i = 0; i < gapsize; i += delta ) + { + accA += hb_synth_tmp[d1 + i + fdelay] * hb_synth_tmp[d1 + i + fdelay]; + accB += hb_synth_tmp[d1 + i + fdelay] * synth_subfr_bwe[i]; + } + if ( accB * accB * min_corr >= min_sq_cross * accA ) + { + d1m = k; + min_corr = accA; + min_sq_cross = accB * accB; + } + } + + push_indice( st->hBstr, IND_CORE_SWITCHING_AUDIO_DELAY, d1m, AUDIODELAYBITS ); + + /* find gain */ + E1 = 0.0f; + E2 = 1.0f; /* to avoid /0 */ + + for ( i = 0; i < gapsize; i++ ) + { + E1 += synth_subfr_bwe[i] * synth_subfr_bwe[i]; + E2 += hb_synth_tmp[i + d1m * delta + fdelay] * hb_synth_tmp[i + d1m * delta + fdelay]; + } + + gain = (float) sqrt( (float) ( E1 / E2 ) ); + + ind1 = usquant( gain, &gain, MINVALUEOFFIRSTGAIN, DELTAOFFIRSTGAIN, ( 1 << NOOFGAINBITS1 ) ); + push_indice( st->hBstr, IND_CORE_SWITCHING_AUDIO_GAIN, ind1, NOOFGAINBITS1 ); + + return; +} diff --git a/lib_enc/acelp_enc_util.c b/lib_enc/acelp_enc_util.c new file mode 100644 index 0000000000000000000000000000000000000000..3cead2ee786ed5b5b1f05ba9ca2bc96463d1e489 --- /dev/null +++ b/lib_enc/acelp_enc_util.c @@ -0,0 +1,75 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "prot.h" +#include "cnst.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * E_ACELP_toeplitz_mul() + * + * Multiplication of Toeplitz matrix with vector c, such that d = toeplitz(R)*c + *-------------------------------------------------------------------*/ + +void E_ACELP_toeplitz_mul( + const float R[], + const float c[], + float d[] ) +{ + int16_t k, j; + float s; + + for ( k = 0; k < L_SUBFR; k++ ) + { + s = R[k] * c[0]; + + for ( j = 1; j < k; j++ ) + { + s += R[k - j] * c[j]; + } + + for ( ; j < L_SUBFR; j++ ) + { + s += R[j - k] * c[j]; + } + d[k] = s; + } + + return; +} diff --git a/lib_enc/amr_wb_enc.c b/lib_enc/amr_wb_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..b133d941310e97fb753cb3ef5184873108e800c4 --- /dev/null +++ b/lib_enc/amr_wb_enc.c @@ -0,0 +1,549 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "rom_enc.h" +#include "rom_com.h" +#include "prot.h" +#include "wmc_auto.h" + + +/*-------------------------------------------------------------------* + * amr_wb_enc() + * + * AMR-WB encoder + *-------------------------------------------------------------------*/ + +void amr_wb_enc( + Encoder_State *st, /* i/o: encoder state structure */ + const int16_t *input_sp, /* i : input signal */ + float *mem_hp20_in, /* i/o: hp20 filter memory */ + const int16_t n_samples /* i : number of input samples */ +) +{ + int16_t i, delay, harm_flag; + float old_inp[L_INP_12k8], *new_inp, *inp; /* buffer of old input signal */ + float old_inp_16k[L_INP_12k8 + L_SUBFR], *inp_16k, *new_inp_16k; /* buffer of old input signal @16kHz*/ + float old_exc[L_EXC], *exc; /* excitation signal buffer */ + float old_wsp[L_WSP], *wsp; /* weighted input signal buffer */ + int16_t input_frame; /* frame length at input sampling freq. */ + float fr_bands[2 * NB_BANDS]; /* energy in frequency bands */ + float lf_E[2 * VOIC_BINS]; /* per bin spectrum energy in lf */ + float tmpN[NB_BANDS]; /* temporary noise update */ + float tmpE[NB_BANDS], PS[L_FFT / 2]; /* temporary averaged energy of 2 sf. */ + float corr_shift; /* correlation shift */ + float relE; /* frame relative energy */ + float non_staX, cor_map_sum, sp_div; + float Etot; /* total energy */ + float ener; /* residual energy from Levinson-Durbin */ + float A[NB_SUBFR * ( M + 1 )]; /* A(z) unquantized for the 4 subframes */ + float Aw[NB_SUBFR * ( M + 1 )]; /* weigted A(z) unquant. for 4 subframes*/ + float epsP[M + 1]; /* LP prediction errors */ + float isp_new[M]; /* ISPs at the end of the frame */ + float isf_new[M]; /* ISFs at the end of the frame */ + float isp_tmp[M]; + float Aq[NB_SUBFR * ( M + 1 )]; /* A(z) quantized for the 4 subframes */ + float syn[L_FRAME]; /* synthesis vector */ + float res[L_FRAME]; /* residual signal for FER protection */ + float exc2[L_FRAME]; /* enhanced excitation */ + float pitch_buf[NB_SUBFR]; /* floating pitch for each subframe */ + float dummy_buf[L_FRAME32k]; /* dummy buffer - no usage */ + float snr_sum_he; + int16_t allow_cn_step; + int16_t localVAD_HE_SAD; + int16_t tmps; + int16_t vad_flag_dtx; + int16_t vad_hover_flag; + int16_t hf_gain[NB_SUBFR]; + int16_t high_lpn_flag; + float lp_bckr, hp_bckr; + float q_env[NUM_ENV_CNG]; + int16_t sid_bw = 0; + float exc3[L_FRAME]; + float fft_buff[2 * L_FFT]; + float sp_floor; + float tmp; + int16_t old_pitch1; + + LPD_state_HANDLE hLPDmem = st->hLPDmem; + + /*------------------------------------------------------------------* + * Initialization + *------------------------------------------------------------------*/ + + st->L_frame = L_FRAME; + st->gamma = GAMMA1; + st->core = AMR_WB_CORE; + st->core_brate = st->total_brate; + st->input_bwidth = st->last_input_bwidth; + st->bwidth = st->last_bwidth; + st->extl = -1; + st->mdct_sw = 0; + st->coder_type = GENERIC; + input_frame = (int16_t) ( st->input_Fs / FRAMES_PER_SEC ); /* frame length of the input signal */ + st->encoderPastSamples_enc = ( L_FRAME * 9 ) / 16; + st->encoderLookahead_enc = L_LOOK_12k8; + + + st->bpf_off = 0; + if ( st->last_core == HQ_CORE || st->last_codec_mode == MODE2 ) + { + st->bpf_off = 1; + } + + st->igf = 0; + + /* Updates in case of EVS primary mode -> AMR-WB IO mode switching */ + if ( st->last_core != AMR_WB_CORE ) + { + updt_IO_switch_enc( st, input_frame ); + } + + /* Updates in case of HQ -> AMR-WB IO switching */ + core_switching_pre_enc( st, NULL, NULL, 0, 0 ); + + set_s( hf_gain, 0, NB_SUBFR ); + + set_f( old_inp, 0.0f, L_INP_12k8 ); + exc = old_exc + L_EXC_MEM; /* pointer to excitation signal in the current frame */ + mvr2r( hLPDmem->old_exc, old_exc, L_EXC_MEM ); + + new_inp = old_inp + L_INP_MEM; /* pointer to new samples of the input signal */ + inp = new_inp - L_LOOK_12k8; /* pointer to current frame of input signal */ + wsp = old_wsp + L_WSP_MEM; /* pointer to current frame of weighted signal */ + + mvr2r( st->old_inp_12k8, old_inp, L_INP_MEM ); + mvr2r( st->old_wsp, old_wsp, L_WSP_MEM ); + + new_inp_16k = old_inp_16k + L_INP_MEM; /* pointer to new samples of the input signal in 16kHz core */ + inp_16k = new_inp_16k - L_LOOK_16k; /* pointer to the current frame of input signal in 16kHz core */ + mvr2r( st->old_inp_16k, old_inp_16k, L_INP_MEM ); + + /* in case of switching, reset AMR-WB BWE memories */ + if ( st->total_brate == ACELP_23k85 && st->last_core_brate != ACELP_23k85 ) + { + hf_cod_init( st->hAmrwb_IO->mem_hp400_enc, st->hAmrwb_IO->mem_hf_enc, st->hAmrwb_IO->mem_syn_hf_enc, st->hAmrwb_IO->mem_hf2_enc, &st->hAmrwb_IO->gain_alpha ); + } + + /*----------------------------------------------------------------* + * set input samples buffer + *----------------------------------------------------------------*/ + + /* get delay to synchronize ACELP and MDCT frame */ + delay = NS2SA( st->input_Fs, DELAY_FIR_RESAMPL_NS ); + + mvr2r( st->input - delay, st->old_input_signal, input_frame + delay ); + + /*----------------------------------------------------------------* + * Buffering of input signal + * (convert 'short' input data to 'float') + * HP filtering + *----------------------------------------------------------------*/ + + mvs2r( input_sp, st->input, n_samples ); + + for ( i = n_samples; i < input_frame; i++ ) + { + st->input[i] = 0; + } + + hp20( st->input, input_frame, mem_hp20_in, st->input_Fs ); + + /*-----------------------------------------------------------------* + * switching from ACELP@16k core to AMR-WB IO mode + *-----------------------------------------------------------------*/ + + st->rate_switching_reset = 0; + + if ( st->last_core != AMR_WB_CORE && st->last_L_frame == L_FRAME16k && st->last_core != HQ_CORE ) + { + /* in case of switching, do not apply BPF */ + st->bpf_off = 1; + /* convert old quantized LSP vector */ + st->rate_switching_reset = lsp_convert_poly( st->lsp_old, L_FRAME, 1 ); + + /* convert old quantized LSF vector */ + lsp2lsf( st->lsp_old, st->lsf_old, M, INT_FS_12k8 ); + + /* Reset LPC mem */ + mvr2r( GEWB_Ave, st->mem_AR, M ); + set_zero( st->mem_MA, M ); + + /* update synthesis filter memories */ + synth_mem_updt2( L_FRAME, st->last_L_frame, hLPDmem->old_exc, hLPDmem->mem_syn_r, hLPDmem->mem_syn1, hLPDmem->mem_syn, ENC ); + mvr2r( hLPDmem->old_exc, old_exc, L_EXC_MEM ); + mvr2r( hLPDmem->mem_syn1, hLPDmem->mem_syn2, M ); + mvr2r( hLPDmem->mem_syn2, hLPDmem->mem_syn3, M ); + + /* lsp -> isp */ + mvr2r( stable_ISP, isp_tmp, M ); + lsp2isp( st->lsp_old, st->lsp_old, isp_tmp, M ); + } + + /* update buffer of old subframe pitch values */ + if ( st->last_L_frame != L_FRAME ) + { + if ( st->last_L_frame == L_FRAME32k ) + { + tmp = (float) 12800 / (float) 32000; + } + else if ( st->last_L_frame == 512 ) + { + tmp = (float) 12800 / (float) 25600; + } + else /* st->last_L_frame == L_FRAME16k */ + { + tmp = (float) 12800 / (float) 16000; + } + + for ( i = NB_SUBFR16k - NB_SUBFR; i < NB_SUBFR16k; i++ ) + { + st->old_pitch_buf[i - 1] = tmp * st->old_pitch_buf[i]; + } + + for ( i = 2 * NB_SUBFR16k - NB_SUBFR; i < 2 * NB_SUBFR16k; i++ ) + { + st->old_pitch_buf[i - 2] = tmp * st->old_pitch_buf[i]; + } + } + if ( st->last_bwidth == NB && st->ini_frame != 0 ) + { + st->rate_switching_reset = 1; + } + + /*----------------------------------------------------------------* + * Change the sampling frequency to 12.8 kHz + *----------------------------------------------------------------*/ + + modify_Fs( st->input, input_frame, st->input_Fs, new_inp, 12800, st->mem_decim, 0 ); + + /* update signal buffer */ + mvr2r( new_inp, st->buf_speech_enc + L_FRAME, L_FRAME ); + + /*------------------------------------------------------------------* + * Perform fixed preemphasis through 1 - g*z^-1 + *-----------------------------------------------------------------*/ + + preemph( new_inp, PREEMPH_FAC, L_FRAME, &st->mem_preemph ); + + /*----------------------------------------------------------------* + * Compute spectrum, find energy per critical frequency band + * Track energy and signal dynamics + * Detect NB spectrum in a 16kHz-sampled input + *----------------------------------------------------------------*/ + + analy_sp( -1, NULL, st->input_Fs, inp, st->Bin_E, st->Bin_E_old, fr_bands, lf_E, &Etot, st->min_band, st->max_band, dummy_buf, PS, fft_buff ); + + noise_est_pre( Etot, st->ini_frame, st->hNoiseEst, 0, EVS_MONO, EVS_MONO ); + + /*----------------------------------------------------------------* + * VAD + *----------------------------------------------------------------*/ + + st->vad_flag = wb_vad( st, fr_bands, &tmps, &tmps, &tmps, &snr_sum_he, &localVAD_HE_SAD, &( st->flag_noisy_speech_snr ), NULL, NULL, -1000.0f, -1000.0f ); + + if ( st->vad_flag == 0 ) + { + st->coder_type = INACTIVE; + } + + /* apply DTX hangover for CNG analysis */ + vad_flag_dtx = dtx_hangover_addition( st, st->vad_flag, st->lp_speech - st->lp_noise, 0, &vad_hover_flag, NULL, NULL, NULL ); + + /*-----------------------------------------------------------------* + * Select SID or FRAME_NO_DATA frame if DTX enabled + *-----------------------------------------------------------------*/ + + if ( st->last_core != AMR_WB_CORE ) + { + st->fd_cng_reset_flag = 1; + } + else if ( st->fd_cng_reset_flag > 0 && st->fd_cng_reset_flag < 10 ) + { + st->fd_cng_reset_flag++; + } + else + { + st->fd_cng_reset_flag = 0; + } + dtx( st, -1, vad_flag_dtx, inp ); + /*----------------------------------------------------------------* + * Noise energy down-ward update and total noise energy estimation + * Long-term energies and relative frame energy updates + * Correlation correction as a function of total noise level + *----------------------------------------------------------------*/ + + noise_est_down( fr_bands, st->hNoiseEst->bckr, tmpN, tmpE, st->min_band, st->max_band, &st->hNoiseEst->totalNoise, Etot, &st->hNoiseEst->Etot_last, &st->hNoiseEst->Etot_v_h2 ); + + high_lpn_flag = 0; + + long_enr( st, Etot, localVAD_HE_SAD, high_lpn_flag, NULL, 1, NULL, NULL ); + + relE = Etot - st->lp_speech; + + if ( st->bwidth != NB ) + { + lp_bckr = mean( st->hNoiseEst->bckr, 10 ); + } + else + { + lp_bckr = mean( st->hNoiseEst->bckr + 1, 9 ); + } + hp_bckr = 0.5f * ( st->hNoiseEst->bckr[st->max_band - 1] + st->hNoiseEst->bckr[st->max_band] ); + st->bckr_tilt_lt = 0.9f * st->bckr_tilt_lt + 0.1f * lp_bckr / hp_bckr; + + corr_shift = correlation_shift( st->hNoiseEst->totalNoise ); + + /*----------------------------------------------------------------* + * WB, SWB and FB bandwidth detector + *----------------------------------------------------------------*/ + + bw_detect( st, st->input, NULL, NULL, MONO_FORMAT, 0 ); + + /* in AMR_WB IO, limit the maximum band-width to WB */ + if ( st->bwidth > WB ) + { + st->bwidth = WB; + } + + /*----------------------------------------------------------------* + * Perform LP analysis + * Compute weighted inp + * Perform open-loop pitch analysis + * Perform 1/4 pitch precision improvement + *----------------------------------------------------------------*/ + + if ( st->vad_flag == 0 ) + { + /* reset the OL pitch tracker memories during inactive frames */ + pitch_ol_init( &st->old_thres, &st->old_pitch, &st->delta_pit, &st->old_corr ); + } + + old_pitch1 = st->pitch[1]; + + /* LP analysis */ + analy_lp_AMR_WB( inp, &ener, A, epsP, isp_new, st->lsp_old1, isf_new, st->old_pitch_la, st->voicing[2] ); + + /* compute weighted input */ + find_wsp( L_FRAME, L_SUBFR, NB_SUBFR, A, Aw, inp, TILT_FAC, wsp, &st->mem_wsp, GAMMA1, L_LOOK_12k8 ); + + /* open-loop pitch analysis */ + pitch_ol( st->pitch, st->voicing, &st->old_pitch, &st->old_corr, corr_shift, &st->old_thres, &st->delta_pit, st->old_wsp2, wsp, st->mem_decim2, relE, L_LOOK_12k8, 0, st->bwidth, 0 ); + + st->old_pitch_la = st->pitch[2]; + vad_param_updt( st, corr_shift, corr_shift, A, old_pitch1, NULL, 1 ); + + /*------------------------------------------------------------------* + * Update estimated noise energy and voicing cut-off frequency + *-----------------------------------------------------------------*/ + + noise_est( st, old_pitch1, tmpN, epsP, Etot, relE, corr_shift, tmpE, fr_bands, &cor_map_sum, NULL, &sp_div, &non_staX, &harm_flag, lf_E, &st->hNoiseEst->harm_cor_cnt, st->hNoiseEst->Etot_l_lp, &sp_floor, 0, NULL, NULL, st->ini_frame ); + + /*----------------------------------------------------------------* + * Change the sampling frequency to 16 kHz, + * input@16kHz needed for AMR-WB IO BWE @23.85kbps + *----------------------------------------------------------------*/ + + if ( st->input_Fs == 16000 ) + { + /* no resampling needed, only delay adjustement to account for the FIR resampling delay */ + tmps = NS2SA( 16000, DELAY_FIR_RESAMPL_NS ); + mvr2r( st->mem_decim16k + tmps, new_inp_16k, tmps ); + mvr2r( st->input, new_inp_16k + tmps, input_frame - tmps ); + mvr2r( st->input + input_frame - 2 * tmps, st->mem_decim16k, 2 * tmps ); + } + else if ( st->input_Fs == 32000 || st->input_Fs == 48000 ) + { + modify_Fs( st->input, input_frame, st->input_Fs, new_inp_16k, 16000, st->mem_decim16k, 0 ); + } + + /*----------------------------------------------------------------* + * Encoding of SID frames + *----------------------------------------------------------------*/ + + if ( st->core_brate == SID_1k75 || st->core_brate == FRAME_NO_DATA ) + { + /* encode CNG parameters */ + CNG_enc( st, Aq, inp, ener, isp_new, isp_new, isf_new, &allow_cn_step, q_env, &sid_bw ); + + /* comfort noise generation */ + CNG_exc( st->core_brate, L_FRAME, &st->hTdCngEnc->Enew, &st->hTdCngEnc->cng_seed, exc, exc2, &st->hTdCngEnc->lp_ener, st->last_core_brate, &st->hDtxEnc->first_CNG, &st->hTdCngEnc->cng_ener_seed, dummy_buf, allow_cn_step, &st->hTdCngEnc->last_allow_cn_step, st->hTdCngEnc->num_ho, q_env, st->hTdCngEnc->lp_env, st->hTdCngEnc->old_env, st->hTdCngEnc->exc_mem, st->hTdCngEnc->exc_mem1, &sid_bw, &st->hTdCngEnc->cng_ener_seed1, exc3, st->Opt_AMR_WB, EVS_MONO ); + + if ( st->hDtxEnc->first_CNG == 0 ) + { + st->hDtxEnc->first_CNG = 1; + } + + /* synthesis */ + syn_12k8( L_FRAME, Aq, exc2, dummy_buf, hLPDmem->mem_syn3, 1 ); /* dummy_buf = temporary buffer to handle syn1[] */ + + /* reset the encoder */ + CNG_reset_enc( st, pitch_buf, dummy_buf + L_FRAME, 0 ); + + /* update mem_syn1 for ACELP core switching */ + mvr2r( hLPDmem->mem_syn3, hLPDmem->mem_syn1, M ); + + /* update ACELP core synthesis filter memory */ + mvr2r( hLPDmem->mem_syn3, hLPDmem->mem_syn, M ); + + /* update old synthesis buffer - needed for ACELP internal sampling rate switching */ + mvr2r( dummy_buf + L_FRAME - L_SYN_MEM, hLPDmem->mem_syn_r, L_SYN_MEM ); + + /* Update MODE2 core switching memory */ + deemph( dummy_buf, PREEMPH_FAC, L_FRAME, &( hLPDmem->syn[M] ) ); + mvr2r( dummy_buf + L_FRAME - M - 1, hLPDmem->syn, M + 1 ); + } + + /*----------------------------------------------------------------* + * Encoding of all other frames + *----------------------------------------------------------------*/ + + else + { + /*-----------------------------------------------------------------* + * After inactive period, use the most up-to-date ISPs + *-----------------------------------------------------------------*/ + + if ( st->last_core_brate == FRAME_NO_DATA || st->last_core_brate == SID_1k75 ) + { + mvr2r( st->hDtxEnc->lspCNG, st->lsp_old, M ); + isp2isf( st->hDtxEnc->lspCNG, st->lsf_old, M, INT_FS_12k8 ); + set_f( old_exc, 0, L_EXC_MEM ); + } + + /*-----------------------------------------------------------------* + * ISF Quantization and interpolation + *-----------------------------------------------------------------*/ + + isf_enc_amr_wb( st, isf_new, isp_new, Aq ); + + /*---------------------------------------------------------------* + * Calculation of LP residual (filtering through A[z] filter) + *---------------------------------------------------------------*/ + + calc_residu( inp, res, Aq, L_FRAME ); + + if ( st->hTdCngEnc != NULL ) + { + st->hTdCngEnc->burst_ho_cnt = 0; + } + + /*------------------------------------------------------------* + * Encode excitation + *------------------------------------------------------------*/ + + encod_amr_wb( st, inp, Aw, Aq, res, syn, exc, exc2, pitch_buf, hf_gain, inp_16k ); + + + /* update mem_syn1 for ACELP core switching */ + mvr2r( hLPDmem->mem_syn, hLPDmem->mem_syn1, M ); + + /* update old synthesis buffer - needed for ACELP internal sampling rate switching */ + mvr2r( syn + L_FRAME - L_SYN_MEM, hLPDmem->mem_syn_r, L_SYN_MEM ); + + /* Update MODE2 core switching memory */ + mvr2r( syn, dummy_buf, L_FRAME ); + deemph( dummy_buf, PREEMPH_FAC, L_FRAME, &( hLPDmem->syn[M] ) ); + mvr2r( dummy_buf + L_FRAME - M - 1, hLPDmem->syn, M + 1 ); + + /*--------------------------------------------------------------------------------------* + * Write VAD information into the bitstream in AMR-WB IO mode + *--------------------------------------------------------------------------------------*/ + + push_indice( st->hBstr, IND_VAD_FLAG, st->vad_flag, 1 ); + } + + + /*-----------------------------------------------------------------* + * Updates + *-----------------------------------------------------------------*/ + + /* update old weighted speech buffer - for OL pitch analysis */ + mvr2r( &old_wsp[L_FRAME], st->old_wsp, L_WSP_MEM ); + + /* update old input signal buffer */ + mvr2r( &old_inp[L_FRAME], st->old_inp_12k8, L_INP_MEM ); + + /* update old input signal @16kHz buffer */ + if ( st->input_Fs > 8000 ) + { + mvr2r( &old_inp_16k[L_FRAME16k], st->old_inp_16k, L_INP_MEM ); + } + + /* update of old per-band energy spectrum */ + mvr2r( fr_bands + NB_BANDS, st->hNoiseEst->enrO, NB_BANDS ); + + /* update signal buffers */ + mvr2r( new_inp, st->buf_speech_enc_pe + L_FRAME, L_FRAME ); + mvr2r( wsp, st->buf_wspeech_enc + L_FRAME + L_SUBFR, L_FRAME + L_LOOK_12k8 ); + + /* update ACELP core parameters */ + updt_enc( st, old_exc, pitch_buf, 0, Aq, isf_new, isp_new, dummy_buf ); + + /* update main codec paramaters */ + updt_enc_common( st ); + + + + return; +} + +/*---------------------------------------------------------------------* + * amr_wb_enc_init() + * + * Initialize AMR-WB encoder + *---------------------------------------------------------------------*/ + +void amr_wb_enc_init( + AMRWB_IO_ENC_HANDLE hAmrwb_IO /* i/o: AMR-WB IO encoder handle */ +) +{ + int16_t i; + + /* HF (6-7kHz) BWE */ + hAmrwb_IO->seed2_enc = RANDOM_INITSEED; + + for ( i = 0; i < GAIN_PRED_ORDER; i++ ) + { + hAmrwb_IO->past_qua_en[i] = -14.0f; /* gain quantization memory (used in AMR-WB IO mode) */ + } + + hf_cod_init( hAmrwb_IO->mem_hp400_enc, hAmrwb_IO->mem_hf_enc, hAmrwb_IO->mem_syn_hf_enc, hAmrwb_IO->mem_hf2_enc, &hAmrwb_IO->gain_alpha ); + + return; +} diff --git a/lib_enc/analy_lp.c b/lib_enc/analy_lp.c new file mode 100644 index 0000000000000000000000000000000000000000..536d1e13afe4015e2a17312ab69e8b3c67027be1 --- /dev/null +++ b/lib_enc/analy_lp.c @@ -0,0 +1,183 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * analy_lp() + * + * Perform LP analysis + * + * - autocorrelations + lag windowing + * - Levinson-Durbin algorithm to find A(z) + * - convert A(z) to LSPs + * - find interpolated LSPs and convert back to A(z) for all subframes + * - update LSPs for the next frame + *-------------------------------------------------------------------*/ + +void analy_lp( + const float speech[], /* i : pointer to the speech frame */ + const int16_t L_frame, /* i : length of the frame */ + const int16_t L_look, /* i : look-ahead */ + float *ener, /* o : residual energy from Levinson-Durbin */ + float A[], /* o : A(z) filter coefficients */ + float epsP[], /* o : LP analysis residual energies for each iteration */ + float lsp_new[], /* o : current frame LSPs */ + float lsp_mid[], /* o : current mid-frame LSPs */ + float lsp_old[], /* i/o: previous frame unquantized LSPs */ + const int16_t Top[2], /* i : open loop pitch lag */ + const float Tnc[2], /* i : open loop pitch gain */ + const int32_t sr_core, /* i : internal sampling rate */ + const int16_t sec_chan_low_rate /* i : TD secondary channel flag */ +) +{ + int16_t i_subfr, wind_length, half_frame; + float r[M + 1], *lsp; + const float *wind, *pt; + int16_t half_frame_idx; + + if ( L_frame == L_FRAME ) + { + wind_length = L_LP; + wind = LP_assym_window; + } + else /* L_frame == L_FRAME16k */ + { + wind_length = L_LP_16k; + wind = LP_assym_window_16k; + } + lsp = lsp_mid; + half_frame = L_frame >> 1; + + half_frame_idx = 0; + for ( i_subfr = half_frame; i_subfr <= L_frame; i_subfr = i_subfr + half_frame ) + { + pt = speech + i_subfr + L_look - wind_length; + + /* Autocorrelations */ + autocorr( pt, r, M, wind_length, wind, 0, 0, 0 ); + + /* Lag windowing */ + adapt_lag_wind( r, M, Top[half_frame_idx], Tnc[half_frame_idx], sr_core ); + ++half_frame_idx; + + /* Levinson-Durbin */ + lev_dur( A, r, M, epsP ); + + /* Conversion of A(z) to LSPs */ + a2lsp_stab( A, lsp, lsp_old ); + + lsp = lsp_new; + } + + if ( sec_chan_low_rate == 1 ) + { + int_lsp4( L_frame, lsp_old, lsp_mid, lsp_new, A, M, -2 ); + } + else + { + /* LSP interpolation */ + int_lsp4( L_frame, lsp_old, lsp_mid, lsp_new, A, M, 0 ); + } + + /* updates */ + mvr2r( lsp_new, lsp_old, M ); + + *ener = epsP[M]; + + return; +} + + +/*-------------------------------------------------------------------* + * analy_lp_AMR_WB() + * + * Perform LP analysis for AMR-WB IO mode + * + * - autocorrelations + lag windowing + * - Levinson-Durbin algorithm to find A(z) + * - convert A(z) to ISPs + * - find interpolated ISPs and convert back to A(z) for all subframes + * - update ISPs for the next frame + *-------------------------------------------------------------------*/ + +void analy_lp_AMR_WB( + const float speech[], /* i : pointer to the speech frame */ + float *ener, /* o : residual energy from Levinson-Durbin */ + float A[], /* o : A(z) filter coefficients */ + float epsP[], /* o : LP analysis residual energies for each iteration */ + float isp_new[], /* o : current frame ISPs */ + float isp_old[], /* i/o: previous frame unquantized ISPs */ + float isf_new[], /* o : current frame ISFs */ + const int16_t Top, /* i : open loop pitch lag */ + const float Tnc /* i : open loop pitch gain */ +) +{ + int16_t wind_length; + float r[M + 1]; + const float *wind; + + /* Initialization */ + wind_length = L_LP_AMR_WB; + wind = hamcos_window; + + /* Autocorrelations */ + autocorr( speech - L_SUBFR, r, M, wind_length, wind, 0, 0, 0 ); + + /* Lag windowing */ + adapt_lag_wind( r, M, Top, Tnc, 12800 ); + + /* Levinson-Durbin */ + lev_dur( A, r, M, epsP ); + + a2isf( A, isf_new, stable_ISF, M ); + isf2isp( isf_new, isp_new, M, INT_FS_12k8 ); + + /* ISP interpolation */ + int_lsp( L_FRAME, isp_old, isp_new, A, M, interpol_isp_amr_wb, 1 ); + + *ener = epsP[M]; + + /* updates */ + mvr2r( isp_new, isp_old, M ); + + return; +} diff --git a/lib_enc/analy_sp.c b/lib_enc/analy_sp.c new file mode 100644 index 0000000000000000000000000000000000000000..c03ec0c90aa98ded2ebad22d62cba59b8b53724d --- /dev/null +++ b/lib_enc/analy_sp.c @@ -0,0 +1,410 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "rom_enc.h" +#include "rom_com.h" +#include "prot.h" +#include "wmc_auto.h" +#include +#include "ivas_cnst.h" + +/*-------------------------------------------------------------------* + * Local prototypes + *-------------------------------------------------------------------*/ + +static void find_enr( const float data[], float band[], float *ptE, float *Etot, const int16_t min_band, const int16_t max_band, float *Bin_E, const int16_t bin_freq, float *band_ener ); + +static void find_enr_dft( CPE_ENC_HANDLE hCPE, const int32_t input_Fs, float DFT_past_DMX[], float band[], float *ptE, float *Etot, const int16_t min_band, const int16_t max_band, float *Bin_E, float *band_ener ); + +/*-------------------------------------------------------------------* + * analy_sp() + * + * Spectral analysis + *-------------------------------------------------------------------*/ + +void analy_sp( + const int16_t element_mode, /* i : element mode */ + CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ + const int32_t input_Fs, /* i : input sampling rate */ + float *speech, /* i : speech buffer */ + float *Bin_E, /* o : per bin log energy spectrum */ + float *Bin_E_old, /* o : per bin log energy spectrum for mid-frame */ + float *fr_bands, /* o : per band energy spectrum (2 analyses) */ + float lf_E[], /* o : per bin E for first VOIC_BINS bins (without DC) */ + float *Etot, /* o : total input energy */ + const int16_t min_band, /* i : minimum critical band */ + const int16_t max_band, /* i : maximum critical band */ + float *band_ener, /* o : energy in critical frequency bands without minimum noise floor E_MIN */ + float *PS, /* o : Per bin energy spectrum */ + float *fft_buff /* o : FFT coefficients */ +) +{ + int16_t i_subfr, i; + float *pt_bands, *pt_fft, *pt; + const float *pt1; + + /*-----------------------------------------------------------------* + * Perform two spectral analyses + * Find energy per critical frequency band and total energy in dB + *-----------------------------------------------------------------*/ + + pt_bands = fr_bands; + pt_fft = fft_buff; + *Etot = 0.0f; + + if ( element_mode != IVAS_CPE_DFT ) + { + for ( i_subfr = 0; i_subfr <= 1; i_subfr++ ) + { + /* set pointer to the beginning of the signal for spectral analysis */ + if ( i_subfr == 0 ) + { + /* set the pointer for first analysis window */ + pt = speech + 3 * ( L_SUBFR / 2 ) - L_FFT / 2; + } + else + { + /* set the pointer for second analysis window */ + pt = speech + 7 * ( L_SUBFR / 2 ) - L_FFT / 2; + } + + /* 1st half of the window */ + pt1 = sqrt_han_window; + for ( i = 0; i < L_FFT / 2; i++ ) + { + pt_fft[i] = *pt++ * *pt1++; + } + /* 2nd half of the window */ + for ( i = L_FFT / 2; i < L_FFT; i++ ) + { + pt_fft[i] = *pt++ * *pt1--; + } + + /* compute the spectrum */ + fft_rel( pt_fft, L_FFT, LOG2_L_FFT ); + + /* find energy per critical band */ + find_enr( pt_fft, pt_bands, lf_E + i_subfr * VOIC_BINS, Etot, min_band, max_band, Bin_E + i_subfr * ( L_FFT / 2 ), (int16_t) BIN, band_ener + i_subfr * NB_BANDS ); + + pt_bands += NB_BANDS; + pt_fft += L_FFT; + } + } + else + { + /* find energy per critical band */ + find_enr_dft( hCPE, input_Fs, hCPE->hStereoDft->DFT[0], pt_bands, lf_E, Etot, min_band, max_band, Bin_E, band_ener ); + mvr2r( lf_E, lf_E + VOIC_BINS, VOIC_BINS ); + mvr2r( Bin_E, Bin_E + ( L_FFT / 2 ), L_FFT / 2 ); + mvr2r( band_ener, band_ener + NB_BANDS, NB_BANDS ); + mvr2r( pt_bands, pt_bands + NB_BANDS, NB_BANDS ); + *Etot *= 2.f; + } + + /* Average total log energy over both half-frames */ + *Etot = 10.0f * (float) log10( 0.5f * *Etot ); + + /* Per-bin log-energy spectrum */ + Bin_E[L_FFT / 2 - 1] = Bin_E[L_FFT / 2 - 2]; + Bin_E[L_FFT - 1] = Bin_E[L_FFT - 2]; + + for ( i = 0; i < L_FFT / 2; i++ ) + { + Bin_E_old[i] = Bin_E[i]; + PS[i] = ( Bin_E[i] + 1e-5f + Bin_E[i + L_FFT / 2] + 1e-5f ) / 2.0f; + Bin_E[i] = (float) ( 10.0f * log( PS[i] ) ); + } + + return; +} + +/*------------------------------------------------------------------------* + * find_enr() + * + * find input signal energy for each critical band and first 74 LF bins + * The energy is normalized by the number of frequency bins in a channel + *------------------------------------------------------------------------*/ + +static void find_enr( + const float data[], /* i : fft result, for the format see fft_rel.c */ + float band[], /* o : per band energy */ + float *ptE, /* o : per bin energy for low frequencies */ + float *Etot, /* i/o: total energy */ + const int16_t min_band, /* i : minimum critical band */ + const int16_t max_band, /* i : maximum critical band */ + float *Bin_E, /* o : Per bin energy */ + const int16_t bin_freq, /* i : Number of frequency bins */ + float *band_ener /* o : per band energy without E_MIN */ +) +{ + int16_t i, cnt; + float freq, tmp; + const float *ptR, *ptI; + int16_t voic_band; + float norm_val; + + norm_val = 4.0f / ( L_FFT * L_FFT ); + + voic_band = VOIC_BAND_8k; + if ( bin_freq == 50 ) + { + voic_band = VOIC_BAND; + } + + ptR = &data[1]; /* first real */ + ptI = &data[L_FFT - 1]; /* first imaginary */ + + /* for low frequency bins, save per bin energy for the use in find_tilt() */ + freq = bin_freq; + for ( i = 0; i < voic_band; i++ ) /* up to maximum allowed voiced critical band */ + { + band[i] = 0.0f; + cnt = 0; + while ( freq <= crit_bands[i] ) + { + *ptE = *ptR * *ptR + *ptI * *ptI; /* energy */ + *ptE *= norm_val; /* normalization - corresponds to FFT normalization by 2/L_FFT */ + *Bin_E++ = *ptE; + band[i] += *ptE++; + ptR++; + ptI--; + + freq += bin_freq; + cnt++; + } + + band[i] *= inv_tbl[cnt]; /* normalization per frequency bin */ + + band_ener[i] = band[i]; /* per band energy without E_MIN */ + + if ( band[i] < E_MIN ) + { + band[i] = E_MIN; + } + } + + /* continue computing the energy per critical band for higher frequencies */ + if ( bin_freq == 50 ) + { + for ( i = voic_band; i < NB_BANDS; i++ ) + { + band[i] = 0.0f; + cnt = 0; + while ( freq <= crit_bands[i] ) + { + *Bin_E = *ptR * *ptR + *ptI * *ptI; + *Bin_E *= norm_val; + band[i] += *Bin_E; + Bin_E++; + ptR++; + ptI--; + + freq += bin_freq; + cnt++; + } + + band[i] *= inv_tbl[cnt]; /* normalization per frequency bin */ + + band_ener[i] = band[i]; /* per band energy without E_MIN */ + + if ( band[i] < E_MIN ) + { + band[i] = E_MIN; + } + } + } + + /* find the total log energy */ + tmp = *Etot; + for ( i = min_band; i <= max_band; i++ ) + { + tmp += band[i]; + } + + *Etot = tmp; + + return; +} + +/*------------------------------------------------------------------------* + * find_enr_dft() + * + * find input signal energy for each critical band using the DFT buffers + *------------------------------------------------------------------------*/ + +static void find_enr_dft( + CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ + const int32_t input_Fs, /* i : input sampling rate */ + float DFT_past_DMX[], + float band[], /* o : per band energy */ + float *ptE, /* o : per bin energy for low frequencies */ + float *Etot, /* i/o: total energy */ + const int16_t min_band, /* i : minimum critical band */ + const int16_t max_band, /* i : maximum critical band */ + float *Bin_E, /* o : Per bin energy */ + float *band_ener /* o : per band energy without E_MIN */ +) +{ + int16_t i, cnt; + float freq, tmp; + const float *ptR, *ptI; + float norm_val; + int16_t bin_cnt = 0; + + float c, s; + /* One window - 40ms*12.8kHz = 512 samples */ + float c_1 = cosf( PI2 / STEREO_DFT_N_12k8_ENC ); + float s_1 = sinf( PI2 / STEREO_DFT_N_12k8_ENC ); + float g_1 = 1.f + 0.68f * 0.68f; + float g_2 = 2 * 0.68f; + float g; + float scaleWin; + + float BinE[STEREO_DFT_N_12k8_ENC / 2]; /* NB_BANDS = 20 (= 6350Hz) = highest band available for SR 12.8 -> bin_cnt = 158 */ + float bin_freq = input_Fs / (float) hCPE->hStereoDft->NFFT; /* adaptive frequency bin width */ + + scaleWin = 1 / ( 2 * hCPE->hStereoDft->win_ana_energy ); + scaleWin *= (float) BIN / bin_freq; + norm_val = scaleWin * 4.0f / ( hCPE->hStereoDft->NFFT * hCPE->hStereoDft->NFFT ); + + ptR = &DFT_past_DMX[2]; /* first real */ + ptI = &DFT_past_DMX[3]; /* first imaginary */ + c = c_1; + s = s_1; + + /* for low frequency bins, save per bin energy for the use in find_tilt() */ + freq = bin_freq; + for ( i = 0; i < NB_BANDS - 1; i++ ) /* up to maximum allowed voiced critical band */ + { + band[i] = 0.0f; + cnt = 0; + + /* bins up to crit_band 17 (<= 3700 Hz): + * bin_cnt old (bin_width 50 Hz): 74 (74 * FRAMES_PER_SEC = 3700) + * bin_cnt new (bin_width 40 Hz): 92 (92 * 40 = 3680) + */ + + while ( freq <= crit_bands[i] ) + { + BinE[bin_cnt] = *ptR * *ptR + *ptI * *ptI; /* energy */ + g = g_1 - g_2 * c; + tmp = c * c_1 - s * s_1; + s = s * c_1 + c * s_1; + c = tmp; + BinE[bin_cnt] *= norm_val * g; /* normalization - corresponds to FFT normalization by 2/L_FFT */ + band[i] += BinE[bin_cnt]; + ptR += 2; + ptI += 2; + + freq += bin_freq; + cnt++; + bin_cnt++; + } + + band[i] *= inv_tbl[cnt]; /* normalization per frequency bin */ + + band_ener[i] = band[i]; /* per band energy without E_MIN */ + + if ( band[i] < E_MIN ) + { + band[i] = E_MIN; + } + } + + /* continue computing the energy per critical band for higher frequencies */ + + /* old version, FFT 256 @ SR12.8 (-> bin_width = 50 Hz): + NB_BANDS = 20 (= 6350Hz) = highest band available for SR 12.8 -> bin_cnt = 127 = L_FFT/2-1*/ + + /* new version: DFT (1200/800/400) @ input SR (48/32/16) (-> bin_width = 40 Hz): + * + */ + /* NB_BANDS = 20 (= 6350Hz) = highest band available for SR 12.8 -> bin_cnt = 158 */ + /* NB_BANDS = 21 (= 7700Hz) = highest band available for SR 16 -> bin_cnt = 192 */ + /* NB_BANDS = 24 (= 15500Hz) = highest band available for SR 32 -> bin_cnt = 387 */ + /* NB_BANDS = 24 (= 15500Hz) = highest band available for SR 48 -> bin_cnt = 387 */ + + for ( ; i < NB_BANDS; i++ ) + { + band[i] = 0.0f; + cnt = 0; + while ( freq < 6399.0f ) + { + BinE[bin_cnt] = *ptR * *ptR + *ptI * *ptI; + g = g_1 - g_2 * c; + BinE[bin_cnt] *= norm_val * g; + band[i] += BinE[bin_cnt]; + ptR += 2; + ptI += 2; + + freq += bin_freq; + cnt++; + bin_cnt++; + } + + band[i] *= inv_tbl[cnt]; /* normalization per frequency bin */ + + band_ener[i] = band[i]; /* per band energy without E_MIN */ + + if ( band[i] < E_MIN ) + { + band[i] = E_MIN; + } + } + + /* put bin energies from BinE into Bin_E[L_FFT/2-1] (interpolate 40 Hz bin values to fit into 50 Hz bins) */ + /* Last value of Bin_E is handled outside this function*/ + assert( bin_cnt == ( STEREO_DFT_N_12k8_ENC / 2 - 1 ) ); + BinE[STEREO_DFT_N_12k8_ENC / 2 - 1] = BinE[STEREO_DFT_N_12k8_ENC / 2 - 2]; + lerp( BinE, Bin_E, L_FFT / 2, STEREO_DFT_N_12k8_ENC / 2 ); + mvr2r( Bin_E, ptE, VOIC_BINS ); + + + /* find the total log energy */ + tmp = *Etot; + for ( i = min_band; i <= max_band; i++ ) + { + tmp += band[i]; + } + + *Etot = tmp; + + return; +} diff --git a/lib_enc/ari_enc.c b/lib_enc/ari_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..b2e692bc168e98536b40c52e828677928d94dc55 --- /dev/null +++ b/lib_enc/ari_enc.c @@ -0,0 +1,454 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include "options.h" +#include "cnst.h" +#include "prot.h" +#include "stat_com.h" +#include "basop_util.h" +#include "wmc_auto.h" + + +/*--------------------------------------------------------------- + * ari_copy_states() + * + * Copy state + *-------------------------------------------------------------*/ + +void ari_copy_states( + Tastat *source, + Tastat *dest ) +{ + dest->low = source->low; + dest->high = source->high; + dest->bits_to_follow = source->bits_to_follow; + + return; +} + +/*--------------------------------------------------------------- + Ari encoder 14 bits routines + -------------------------------------------------------------*/ + +/*--------------------------------------------------------------- + * ari_start_encoding_14bits() + * + * Start ArCo encoding + *-------------------------------------------------------------*/ + +void ari_start_encoding_14bits( + Tastat *s ) +{ + /* : addressing is made with walking pointer s */ + s->low = 0; + s->high = ari_q4new; + s->bits_to_follow = 0; + + return; +} + + +/*--------------------------------------------------------------- + * ari_done_encoding_14bits() + * + * Finish ArCo encoding + *-------------------------------------------------------------*/ + +int16_t ari_done_encoding_14bits( + int16_t *ptr, + int16_t bp, + Tastat *s ) +{ + int32_t low; + int32_t bits_to_follow; + + /* not needed, s points to s->low */ + low = s->low; + bits_to_follow = s->bits_to_follow + 1; + + if ( low < ari_q1new ) + { + ptr[bp++] = 0; /*send a zero*/ + for ( ; bits_to_follow > 0; bits_to_follow-- ) + { + ptr[bp++] = 1; /*send a one*/ + } + } + else + { + ptr[bp++] = 1; /*send a one*/ + for ( ; bits_to_follow > 0; bits_to_follow-- ) + { + ptr[bp++] = 0; /*send a zero*/ + } + } + + /*It is done so no need to save values-> no counting*/ + /*s->low = low; + s->bits_to_follow = bits_to_follow;*/ + + return bp; +} + + +/*--------------------------------------------------------------- + * ari_encode_14bits_ext() + * + * encode function for extended proba tables: less branches needed for coding + * + *-------------------------------------------------------------*/ + +int16_t ari_encode_14bits_ext( + int16_t *ptr, + int16_t bp, + Tastat *s, + int32_t symbol, + const uint16_t *cum_freq ) +{ + int32_t low, high, range; + int32_t bits_to_follow; + + /*for all operation using bit_ptr=&ptr[bp] */ + /* for reading s->high,low,bits_to_follow sequentially */ + high = s->high; + low = s->low; + range = high - low + 1; + + high = low + mul_sbc_14bits( range, cum_freq[symbol] ) - 1; + low += mul_sbc_14bits( range, cum_freq[symbol + 1] ); + + bits_to_follow = s->bits_to_follow; + + for ( ;; ) + { + if ( high < ari_q2new ) + { + ptr[bp++] = 0; /*send a zero*/ + for ( ; bits_to_follow > 0; bits_to_follow-- ) + { + ptr[bp++] = 1; /*send a one*/ + } + } + else + { + if ( low >= ari_q2new ) + { + ptr[bp++] = 1; /*send a one*/ + for ( ; bits_to_follow > 0; bits_to_follow-- ) + { + ptr[bp++] = 0; /*send a zero*/ + } + low -= ari_q2new; + high -= ari_q2new; /* Subtract offset to top. */ + } + else + { + /* Output an opposite bit */ + if ( low >= ari_q1new && high < ari_q3new ) /* Output an opposite bit */ + { + /* later if in middle half. */ + bits_to_follow += 1; + low -= ari_q1new; /* Subtract offset to middle*/ + high -= ari_q1new; + } + else + { + break; /* Otherwise exit loop. */ + } + } + } + low += low; + high += high + 1; /* Scale up code range. */ + } + + s->low = low; + s->high = high; + s->bits_to_follow = bits_to_follow; + + return bp; +} + + +/*------------------------------------------------------------------------ + * Function: ari_encode_14bits_range() + * + * Encode an cumulative frequency interval. + *-------------------------------------------------------------------------*/ + +int16_t ari_encode_14bits_range( + int16_t *ptr, + int16_t bp, + int32_t bits, + Tastat *s, + uint16_t cum_freq_low, + uint16_t cum_freq_high ) +{ + int32_t low, high, range; + int32_t bits_to_follow; + + /* not needed, s points to s->low */ + high = s->high; + high++; + low = s->low; + range = high - low; + + high = low + mul_sbc_14bits( range, cum_freq_high ); + low += mul_sbc_14bits( range, cum_freq_low ); + + bits_to_follow = s->bits_to_follow; + + /* while there are more than 16 bits left */ + for ( ; bp + 16 + bits_to_follow - bits < 0; ) + { + if ( high <= ari_q2new ) + { + ptr[bp++] = 0; /*send a zero*/ + for ( ; bits_to_follow > 0; bits_to_follow-- ) + { + ptr[bp++] = 1; /*send a one*/ + } + } + else if ( low >= ari_q2new ) + { + /* to reach this branch */ + ptr[bp++] = 1; /*send a one*/ + for ( ; bits_to_follow > 0; bits_to_follow-- ) + { + ptr[bp++] = 0; /*send a zero*/ + } + low -= ari_q2new; + high -= ari_q2new; /* Subtract offset to top. */ + } + else if ( low >= ari_q1new && high <= ari_q3new ) + { + /* to reach this branch */ + /* Output an opposite bit */ + /* later if in middle half. */ + bits_to_follow += 1; + low -= ari_q1new; /* Subtract offset to middle*/ + high -= ari_q1new; + } + else + { + /* to reach this branch */ + break; /* Otherwise exit loop. */ + } + + low += low; + high += high; /* Scale up code range. */ + } + /* if there are <= 16 bits left */ + if ( bp + 16 + bits_to_follow - bits >= 0 ) + { + /* No need to do anyhing, but let's keep a place for a breakpoint */ + s->bits_to_follow = -1; + } + + s->low = low; + s->high = high - 1; + s->bits_to_follow = bits_to_follow; + + return bp; +} + +/*------------------------------------------------------------------------ + * Function: ari_encode_14bits_sign() + * + * Encode a sign with equal probabilities. + *-------------------------------------------------------------------------*/ + +int16_t ari_encode_14bits_sign( + int16_t *ptr, + int16_t bp, + int32_t bits, + Tastat *s, + int32_t sign ) +{ + int32_t low, high, range; + int32_t bits_to_follow; + + /* not needed, s points to s->low */ + high = s->high; + high++; + low = s->low; + range = high - low; + + if ( sign ) + { + high = low + ( range >> 1 ); + } + else + { + low += range >> 1; + } + + bits_to_follow = s->bits_to_follow; + + /* while there are more than 16 bits left */ + for ( ; bp + 16 + bits_to_follow - bits < 0; ) + { + if ( high <= ari_q2new ) + { + ptr[bp++] = 0; /*send a zero*/ + for ( ; bits_to_follow > 0; bits_to_follow-- ) + { + ptr[bp++] = 1; /*send a one*/ + } + } + else if ( low >= ari_q2new ) + { + /* to reach this branch */ + ptr[bp++] = 1; /*send a one*/ + for ( ; bits_to_follow > 0; bits_to_follow-- ) + { + ptr[bp++] = 0; /*send a zero*/ + } + low -= ari_q2new; + high -= ari_q2new; /* Subtract offset to top. */ + } + else if ( low >= ari_q1new && high <= ari_q3new ) + { + /* to reach this branch */ + /* Output an opposite bit */ + /* later if in middle half. */ + bits_to_follow += 1; + low -= ari_q1new; /* Subtract offset to middle*/ + high -= ari_q1new; + } + else + { + /* to reach this branch */ + break; /* Otherwise exit loop. */ + } + + low += low; + high += high; /* Scale up code range. */ + } + + s->low = low; + s->high = high - 1; + s->bits_to_follow = bits_to_follow; + + return bp; +} + +/*------------------------------------------------------------------------ + * Function: ari_done_cbr_encoding_14bits() + * + * Finish up encoding in CBR mode. + *-------------------------------------------------------------------------*/ + +int16_t ari_done_cbr_encoding_14bits( + int16_t *ptr, + int16_t bp, + int32_t bits, + Tastat *s ) +{ + int32_t high; + int32_t bits_to_follow; + uint16_t k; + + while ( bits - bp - 16 - s->bits_to_follow > 0 ) + { + bp = ari_encode_14bits_sign( ptr, bp, bits, s, 0 ); + } + + /* not needed, s points to s->low */ + high = s->high; + bits_to_follow = s->bits_to_follow; + + if ( bits_to_follow ) + { + /* If in upper half, then output a one, bits_to_follow zeros, and the remaining bits, except the first one */ + if ( high < 0x8000 ) + { + ptr[bp++] = 0; /*send a zero*/ + for ( ; bits_to_follow > 0; bits_to_follow-- ) + { + ptr[bp++] = 1; /*send a one*/ + } + } + else + { + ptr[bp++] = 1; /*send a one*/ + for ( ; bits_to_follow > 0; bits_to_follow-- ) + { + ptr[bp++] = 0; /*send a zero*/ + } + } + /* write remaining bits */ + for ( k = 0x4000; k > 0; k >>= 1 ) + { + if ( k & high ) + { + ptr[bp++] = 1; /*send a one*/ + } + else + { + ptr[bp++] = 0; /*send a zero*/ + } + + if ( bp >= bits ) + { + break; + } + } + } + else + { + /* no carry-bits, just write all bits */ + for ( k = 0x8000; k > 0; k >>= 1 ) + { + if ( k & high ) + { + ptr[bp++] = 1; /*send a one*/ + } + else + { + ptr[bp++] = 0; /*send a zero*/ + } + + if ( bp >= bits ) + { + break; + } + } + } + + return bp; +} diff --git a/lib_enc/ari_hm_enc.c b/lib_enc/ari_hm_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..46a093369b1e057027af064ed29322e02c694845 --- /dev/null +++ b/lib_enc/ari_hm_enc.c @@ -0,0 +1,618 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include "options.h" +#include +#include "cnst.h" +#include "rom_enc.h" +#include "stl.h" +#include "basop_util.h" +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * EncodeIndex() + * + * + *-------------------------------------------------------------------*/ + +int16_t EncodeIndex( + const int16_t Bandwidth, + int16_t PeriodicityIndex, + BSTR_ENC_HANDLE hBstr ) +{ + if ( PeriodicityIndex & kLtpHmFlag ) + { + int16_t LtpPitchIndex = PeriodicityIndex >> 9; + assert( 0 <= LtpPitchIndex && LtpPitchIndex <= 16 ); + --PeriodicityIndex; + assert( ( PeriodicityIndex & 0xff ) < ( 1 << NumRatioBits[Bandwidth][LtpPitchIndex] ) ); + + push_next_indice( hBstr, PeriodicityIndex & 0xff, NumRatioBits[Bandwidth][LtpPitchIndex] ); + return NumRatioBits[Bandwidth][LtpPitchIndex]; + } + else + { + push_next_indice( hBstr, PeriodicityIndex, 8 ); + return 8; + } +} + + +/*-------------------------------------------------------------------* + * GetWeight() + * + * + *-------------------------------------------------------------------*/ + +static float GetWeight( int16_t i ) +{ + i = 3 * i - 2; + + return (float) ( pow( i, 0.3 ) / pow( 256 - 1, 0.3 ) ); +} + + +/*-------------------------------------------------------------------* + * SearchPeriodicityIndex_Single() + * + * + *-------------------------------------------------------------------*/ + +static float SearchPeriodicityIndex_Single( + const float AbsMdct3[], + const int16_t NumToConsider, + const int32_t Lag, + const int16_t FractionalResolution ) +{ + int16_t HighestMultiplier; + float AbsMeanCurrent3; /* Mean for BucketWidth == 3 */ + int32_t Limit, OldIndex, i; + + Limit = ( NumToConsider - 1 ) << FractionalResolution; + AbsMeanCurrent3 = 0; + HighestMultiplier = 1; + + for ( i = Lag; i < Limit; i += Lag ) + { + OldIndex = i >> FractionalResolution; + AbsMeanCurrent3 += AbsMdct3[OldIndex] * GetWeight( HighestMultiplier ); + ++HighestMultiplier; + } + + return AbsMeanCurrent3 / ( HighestMultiplier - 1 + 0.00001f ); +} + + +/*-------------------------------------------------------------------* + * SearchPeriodicityIndex_Range() + * + * + *-------------------------------------------------------------------*/ + +static void SearchPeriodicityIndex_Range( + const float AbsMdct3[], + const int16_t NumToConsider, + const int16_t Lo, + const int16_t Hi, + const int16_t FractionalResolution, + const int16_t Adj, + const int16_t Spacing, + int16_t *PeriodicityIndex, + float *Score ) +{ + int16_t Index, BestIndex, B; + float CurrentScore, BestScore; + + BestScore = -1e30f; + BestIndex = 0; + + for ( Index = Lo; Index < Hi; Index += Spacing ) + { + CurrentScore = SearchPeriodicityIndex_Single( AbsMdct3, NumToConsider, Index + Adj, FractionalResolution ); + + if ( CurrentScore > BestScore ) + { + BestScore = CurrentScore; + BestIndex = Index; + } + } + + if ( BestScore > *Score ) + { + *Score = BestScore; + *PeriodicityIndex = BestIndex; + } + + + B = BestIndex - ( Spacing >> 1 ); + B = max( Lo, B ); + + for ( Index = B; Index < BestIndex; ++Index ) + { + CurrentScore = SearchPeriodicityIndex_Single( AbsMdct3, NumToConsider, Index + Adj, FractionalResolution ); + + if ( CurrentScore > *Score ) + { + *Score = CurrentScore; + *PeriodicityIndex = Index; + } + } + + B = BestIndex + ( Spacing >> 1 ); + + for ( Index = BestIndex + 1; Index <= B; ++Index ) + { + CurrentScore = SearchPeriodicityIndex_Single( AbsMdct3, NumToConsider, Index + Adj, FractionalResolution ); + + if ( CurrentScore > *Score ) + { + *Score = CurrentScore; + *PeriodicityIndex = Index; + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * SearchPeriodicityIndex() + * + * + *-------------------------------------------------------------------*/ + +/*! r: PeriodicityIndex */ +int16_t SearchPeriodicityIndex( + const float Mdct[], /* i : Coefficients, Mdct[0..NumCoeffs-1] */ + const float UnfilteredMdct[], /* i : Unfiltered coefficients, UnfilteredMdct[0..NumCoeffs-1] */ + const int16_t NumCoeffs, /* i : Number of coefficients */ + const int16_t TargetBits, /* i : Target bit budget (excl. Done flag) */ + const int16_t LtpPitchLag, /* i : TCX-LTP pitch */ + const float LtpGain, /* i : LTP gain */ + float *RelativeScore /* o : Energy concentration factor */ +) +{ + float AbsMdct3[MAX_LENGTH], A, B, C = 0.f; + int16_t i; + int16_t MaxAt; + float Score; + int16_t PeriodicityIndex; + int16_t NumToConsider; + float AbsTotal; + + PeriodicityIndex = 0; + NumToConsider = NumCoeffs; + Score = -1e30f; + + A = (float) fabs( Mdct[0] ); + B = (float) fabs( Mdct[1] ); + + for ( i = 1; i < NumToConsider - 3; i += 3 ) + { + C = (float) fabs( Mdct[i + 1] ); + AbsMdct3[i] = A + B + C; + + A = (float) fabs( Mdct[i + 2] ); + AbsMdct3[i + 1] = A + B + C; + + B = (float) fabs( Mdct[i + 3] ); + AbsMdct3[i + 2] = A + B + C; + } + + if ( i < NumToConsider - 1 ) + { + C = (float) fabs( Mdct[i + 1] ); + AbsMdct3[i] = A + B + C; + } + + + if ( i + 1 < NumToConsider - 1 ) + { + A = (float) fabs( Mdct[i + 2] ); + AbsMdct3[i + 1] = A + B + C; + } + + AbsTotal = 0.0f; + + if ( UnfilteredMdct != NULL ) + { + for ( i = 0; i < NumToConsider; ++i ) + { + AbsTotal += (float) fabs( UnfilteredMdct[i] ); + } + } + else + { + for ( i = 1; i < NumToConsider - 1; i += 3 ) + { + AbsTotal += AbsMdct3[i]; + } + } + + + if ( ( LtpPitchLag > 0 ) && ( LtpGain > kLtpHmGainThr ) ) + { + int16_t FractionalResolution = kLtpHmFractionalResolution; + int16_t Multiplier, LtpPitchIndex, Bandwidth; + + Bandwidth = NumCoeffs >= 256; + LtpPitchIndex = ( ( LtpPitchLag + ( 1 << ( kLtpHmFractionalResolution - 1 ) ) ) >> kLtpHmFractionalResolution ) - 2; + assert( 0 <= LtpPitchIndex && LtpPitchIndex <= 16 ); + + for ( Multiplier = 1; Multiplier <= ( 1 << NumRatioBits[Bandwidth][LtpPitchIndex] ); ++Multiplier ) + { + float CurrentScore; + int32_t Lag; + + Lag = ( LtpPitchLag * (int16_t) ( 4 * Ratios[Bandwidth][LtpPitchIndex][Multiplier - 1] ) ) >> 2; + + if ( Lag >= ( 4 << FractionalResolution ) && ( Lag <= ( ( NumToConsider - 2 ) << FractionalResolution ) ) ) + { + CurrentScore = SearchPeriodicityIndex_Single( AbsMdct3, NumToConsider, Lag, FractionalResolution ); + + if ( CurrentScore > Score ) + { + Score = CurrentScore; + PeriodicityIndex = Multiplier | kLtpHmFlag; + } + } + } + PeriodicityIndex |= LtpPitchIndex << 9; + } + else + { + if ( UnfilteredMdct != NULL ) + { + MaxAt = 1; + A = AbsMdct3[1]; + + for ( i = 4; i < NumToConsider - 1; i += 3 ) + { + + if ( AbsMdct3[i] > AbsMdct3[MaxAt] ) + { + MaxAt = i; + } + A += AbsMdct3[i]; + } + + if ( AbsMdct3[MaxAt] > A * 0.7f ) + { + NumToConsider = min( NumToConsider, MaxAt + 4 ); + } + } + + SearchPeriodicityIndex_Range( AbsMdct3, NumToConsider, 0, 16, 3, GET_ADJ2( 0, 6, 3 ), 4, &PeriodicityIndex, &Score ); + + SearchPeriodicityIndex_Range( AbsMdct3, NumToConsider, 16, 80, 4, GET_ADJ2( 16, 8, 4 ), 4, &PeriodicityIndex, &Score ); + + SearchPeriodicityIndex_Range( AbsMdct3, NumToConsider, 80, 208, 3, GET_ADJ2( 80, 12, 3 ), 4, &PeriodicityIndex, &Score ); + + if ( NumToConsider <= 128 ) + { + /* no long lags for band-limited MDCTs */ + + SearchPeriodicityIndex_Range( AbsMdct3, NumToConsider, 208, 88 + NumToConsider, 0, GET_ADJ2( 224, 188, 0 ), 1, &PeriodicityIndex, &Score ); + } + else + { + + if ( TargetBits > kSmallerLagsTargetBitsThreshold && NumCoeffs >= 256 ) + { + SearchPeriodicityIndex_Range( AbsMdct3, NumToConsider, 208, 224, 1, GET_ADJ2( 208, 28, 1 ), 1, &PeriodicityIndex, &Score ); + + SearchPeriodicityIndex_Range( AbsMdct3, NumToConsider, 224, 256, 0, GET_ADJ2( 224, 188, 0 ), 1, &PeriodicityIndex, &Score ); + } + else + { + SearchPeriodicityIndex_Range( AbsMdct3, NumToConsider, 208, 256, 1, GET_ADJ2( 208, 28, 1 ), 1, &PeriodicityIndex, &Score ); + } + } + } + + if ( AbsTotal > 0 ) + { + *RelativeScore = Score / AbsTotal * (float) NumCoeffs; + } + else + { + *RelativeScore = 0; + } + + return PeriodicityIndex; +} + + +/*-------------------------------------------------------------------* + * PeakFilter() + * + * + *-------------------------------------------------------------------*/ + +#define kPeakElevationThreshold 1.0f + +static void PeakFilter( + const float x[], /* (I) absolute spectrum */ + float y[], /* (O) filtered absolute spectrum, must not alias x[] */ + const int16_t L_frame /* (I) number of spectral lines */ +) +{ + int16_t flen, i; + float a, m; + + flen = ( L_frame >> 4 ); + m = kPeakElevationThreshold / (float) ( 2 * flen + 1 ); + + a = 0.0f; + for ( i = 0; i < flen; ++i ) + { + a += x[i]; + } + + for ( i = 0; i < flen; ++i ) + { + y[i] = max( 0.0f, x[i] - a * m ); + a += x[i + flen]; + } + for ( ; i < L_frame - flen; ++i ) + { + y[i] = max( 0.0f, x[i] - a * m ); + a -= x[i - flen]; + a += x[i + flen]; + } + + for ( ; i < L_frame; ++i ) + { + y[i] = max( 0.0f, x[i] - a * m ); + a -= x[i - flen]; + } + + return; +} + + +/*-------------------------------------------------------------------* + * tcx_hm_get_re() + * + * + *-------------------------------------------------------------------*/ + +/*! r: RE error */ +static float tcx_hm_get_re( + const float x[], /* i : absolute spectrum */ + const Word16 gain, /* i : HM gain (Q11) */ + const int16_t lag, + const int16_t fract_res, + const Word16 p[], /* i : harmonic model (Q13) */ + const Word32 env[], /* i : envelope (Q16) */ + const int16_t L_frame /* i : number of spectral lines */ +) +{ + Word32 ne[N_MAX_ARI]; + float G, e; + int16_t i; + + /* Calculate new envelope with "gain" harmonic gain */ + for ( i = 0; i < L_frame; ++i ) + { + ne[i] = env[i]; + } + + tcx_hm_modify_envelope( gain, lag, fract_res, p, ne, L_frame ); + + /* Normalize */ + G = 0; + + for ( i = 0; i < L_frame; ++i ) + { + G += x[i] * ne[i]; + } + G = 1.0f / G; + + /* Calculate error */ + e = 0; + + for ( i = 0; i < L_frame; ++i ) + { + e += (float) pow( x[i] * ( ne[i] * G ), 4 ); + } + + return e; +} + + +/*-------------------------------------------------------------------* + * tcx_hm_quantize_gain() + * + * + *-------------------------------------------------------------------*/ + +static void tcx_hm_quantize_gain( + const float x[], /* i : absolute spectrum */ + const Word32 env[], /* i : envelope (Q16) */ + const int16_t lag, + const int16_t fract_res, + Word16 p[], /* i : harmonic model (Q13) */ + const int16_t L_frame, /* i : number of spectral lines */ + const int16_t coder_type, /* i : GC/VC coder type */ + float relative_score, /* i : periodicity score */ + int16_t *gain_idx, /* o : quantization index */ + Word16 *gain /* o : quantized harmonic model gain (Q11) */ +) +{ + int16_t g, s; + float be, e, pe; + const float kLowPeriodicityThr[2] = { 0.5f, 0.2f }; + + assert( coder_type == VOICED || coder_type == GENERIC ); + + s = 0; + if ( coder_type == VOICED ) + { + s = 1; + } + + *gain = 0; + + /* Disable the harmonic model if periodicity is very low */ + if ( relative_score < kLowPeriodicityThr[s] ) + { + return; + } + + be = tcx_hm_get_re( x, *gain, lag, fract_res, p, env, L_frame ); + + if ( coder_type == GENERIC ) + { + e = tcx_hm_get_re( x, qGains[s][0], lag, fract_res, p, env, L_frame ); + pe = 1.05f; + + if ( e * pe < be ) + { + *gain_idx = 0; + *gain = qGains[s][0]; + } + } + else + { + /* Iterate over all possible gain values */ + for ( g = 0; g < ( 1 << kTcxHmNumGainBits ); ++g ) + { + + e = tcx_hm_get_re( x, qGains[s][g], lag, fract_res, p, env, L_frame ); + + /* Add bit penalty */ + pe = 1.0f; + if ( *gain == 0.0f ) + { + pe = 1.05f; + } + + /* Minimum selection */ + if ( e * pe < be ) + { + be = e; + *gain_idx = g; + *gain = qGains[s][g]; + } + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * tcx_hm_analyse() + * + * + *-------------------------------------------------------------------*/ + +void tcx_hm_analyse( + const float abs_spectrum[], /* i : absolute spectrum */ + const int16_t L_frame, /* i : number of spectral lines */ + Word32 env[], /* i/o: envelope shape (Q16) */ + const int16_t targetBits, /* i : target bit budget */ + const int16_t coder_type, /* i : GC/VC coder type */ + int16_t prm_hm[], /* o : HM parameters */ + int16_t LtpPitchLag, /* i : LTP pitch lag or -1 if none */ + const float LtpGain, /* i : LTP gain */ + int16_t *hm_bits /* o : bit consumption */ +) +{ + int16_t lag; + int32_t tmpL; + int16_t fract_res; + float fspec[N_MAX_ARI], RelativeScore; + Word16 p[2 * kTcxHmParabolaHalfWidth + 1], gain; + + /* Disable HM for non-GC,VC coder types */ + if ( ( coder_type != VOICED ) && ( coder_type != GENERIC ) ) + { + *hm_bits = 0; + prm_hm[0] = 0; + + return; + } + + /* Bit consumption for the HM off case: 1 bit flag */ + *hm_bits = 1; + + /* Filter out noise and keep the peaks */ + PeakFilter( abs_spectrum, fspec, L_frame ); + + /* Get the best lag index */ + prm_hm[1] = SearchPeriodicityIndex( fspec, abs_spectrum, L_frame, targetBits - *hm_bits, LtpPitchLag, LtpGain, &RelativeScore ); + + /* Convert the index to lag */ + UnmapIndex( prm_hm[1], L_frame >= 256, LtpPitchLag, ( targetBits - *hm_bits <= kSmallerLagsTargetBitsThreshold ) || ( L_frame < 256 ), &fract_res, &tmpL ); + lag = (int16_t) tmpL; + + /* Render harmonic model */ + tcx_hm_render( lag, fract_res, p ); + + /* Calculate and quantize gain */ + gain = 0; + + tcx_hm_quantize_gain( abs_spectrum, env, lag, fract_res, p, L_frame, coder_type, RelativeScore, &prm_hm[2], &gain ); + + /* Decision */ + if ( gain > 0 ) + { + prm_hm[0] = 1; /* flag: on */ + + *hm_bits += CountIndexBits( L_frame >= 256, prm_hm[1] ); + + if ( coder_type == VOICED ) + { + *hm_bits += kTcxHmNumGainBits; + } + + tcx_hm_modify_envelope( gain, lag, fract_res, p, env, L_frame ); + } + else + { + prm_hm[0] = 0; /* flag: off */ + prm_hm[1] = -1; /* pitch index */ + prm_hm[2] = 0; /* gain index */ + } + + return; +} diff --git a/lib_enc/arith_coder_enc.c b/lib_enc/arith_coder_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..d4b4735499eac9d1cb9c74d8a0c3b4554932dacf --- /dev/null +++ b/lib_enc/arith_coder_enc.c @@ -0,0 +1,682 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "rom_com.h" +#include "basop_util.h" +#include "basop_proto_func.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * Local constants + *-------------------------------------------------------------------*/ + +#define kMaxNumHeapElems 10 + +typedef struct HeapElem +{ + float mScore; /* Sort key */ + int16_t mIndex; /* Original index */ +} HeapElem; + +typedef struct Heap +{ + HeapElem mElem[2 * kMaxNumHeapElems + 1]; +} Heap; + + +/*-------------------------------------------------------------------* + * tcx_arith_estimate_scale() + * + * + *-------------------------------------------------------------------*/ + +/*! r: estimated SQ scale */ +static float tcx_arith_estimate_scale( + const float abs_spectrum[], /* i : absolute MDCT coefficients */ + const int16_t L_frame, /* i : number of spectral lines */ + const Word16 envelope[], /* i : scaled envelope (Q15-e) */ + const Word16 envelope_e /* i : scaled envelope exponent (Q0) */ +) +{ + float scale, tmp; + int16_t k; + + /* compute normalised standard deviation and determine approximate scale */ + scale = 0.01f; + for ( k = 0; k < L_frame; k++ ) + { + tmp = abs_spectrum[k] * envelope[k]; + scale += tmp * tmp; + } + tmp = (float) ( 1 << ( 15 - envelope_e ) ); + scale = (float) sqrt( ( L_frame * tmp * tmp * 4.0f ) / scale ); + + + return scale; +} + + +/*-------------------------------------------------------------------* + * MinHeapify_i() + * + * + *-------------------------------------------------------------------*/ + +static void MinHeapify_i( + Heap *H, + int16_t i ) +{ + int16_t left, right, largest; + HeapElem T; + + left = 2 * i + 1; + right = left + 1; + largest = i; + + if ( H->mElem[left].mScore < H->mElem[largest].mScore ) + { + largest = left; + } + if ( H->mElem[right].mScore < H->mElem[largest].mScore ) + { + largest = right; + } + while ( largest != i ) + { + T.mIndex = H->mElem[i].mIndex; + T.mScore = H->mElem[i].mScore; + + H->mElem[i].mIndex = H->mElem[largest].mIndex; + H->mElem[i].mScore = H->mElem[largest].mScore; + + H->mElem[largest].mIndex = T.mIndex; + H->mElem[largest].mScore = T.mScore; + + i = largest; + + left = 2 * i + 1; + right = left + 1; + + if ( H->mElem[left].mScore < H->mElem[largest].mScore ) + { + largest = left; + } + if ( H->mElem[right].mScore < H->mElem[largest].mScore ) + { + largest = right; + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * tcx_arith_find_max_scale() + * + * + *-------------------------------------------------------------------*/ + +static float tcx_arith_find_max_scale( + const float abs_spectrum[], /* i : absolute MDCT coefficients */ + const int16_t L_frame, /* i : number of spectral lines */ + const Word16 envelope[], /* i : scaled envelope (Q15-e) */ + const Word16 envelope_e, /* i : scaled envelope exponent (Q0) */ + const Word16 exps[], /* i : expfp(-(integer)envelope[]/2) */ + const float deadzone /* i : deadzone (0.5f = no deadzone) */ +) +{ + int16_t i, k, q; + float p, scale; + Heap heap; + Word16 tmpi1, tmpi2; + float envelope_scale; + const float limit = -9.70406052784f; /* = ln(1/16384): log of smallest allowed probability */ + + /* Find the top most offending lines according to probability estimates */ + heap.mElem[0].mScore = 0; /* mal: just to silnce the compiler */ + + for ( i = 0; i < kMaxNumHeapElems; ++i ) + { + heap.mElem[i].mIndex = 0; + heap.mElem[i].mScore = 0; + } + for ( ; i < 2 * kMaxNumHeapElems + 1; ++i ) + { + heap.mElem[i].mScore = FLT_MAX; + } + for ( k = 0; k < L_frame; ++k ) + { + p = envelope[k] * abs_spectrum[k]; + if ( p > heap.mElem[0].mScore ) + { + heap.mElem[0].mScore = p; + heap.mElem[0].mIndex = k; + MinHeapify_i( &heap, 0 ); + } + } + + /* Make sure the scale is limited so that the offending lines don't cause probability underflow. */ + /* Also limit scale to avoiding saturation of the gain quantizer */ + scale = 1.0f / (float) sqrt( L_frame * 0.5f ); + envelope_scale = -(float) pow( 2, envelope_e - 16 ); + for ( i = 0; i < kMaxNumHeapElems; ++i ) + { + k = heap.mElem[i].mIndex; + + /* Get approximate maximum allowed magnitude */ + q = (int16_t) ceil( ( ( limit - log( 1.0f - ( exps[k] / PCM16_TO_FLT_FAC ) * ( exps[k] / PCM16_TO_FLT_FAC ) ) ) / ( envelope[k] * envelope_scale ) - 1 ) / 2.0f ); + + /* Refinement: get the exact q */ + powfp_odd2( exps[k], q, &tmpi1, &tmpi2 ); + if ( tmpi1 - tmpi2 >= 2 ) + { + /* q may be too low */ + powfp_odd2( exps[k], q + 1, &tmpi1, &tmpi2 ); + while ( tmpi1 - tmpi2 >= 2 ) + { + ++q; + powfp_odd2( exps[k], q + 1, &tmpi1, &tmpi2 ); + } + } + else + { + /* q is too high */ + --q; + powfp_odd2( exps[k], q, &tmpi1, &tmpi2 ); + while ( tmpi1 - tmpi2 < 2 ) + { + --q; + powfp_odd2( exps[k], q, &tmpi1, &tmpi2 ); + } + } + + /* Find the largest scale so that the quantized magnitude is at most q */ + p = ( q + 0.99f - deadzone ) / ( abs_spectrum[k] + 0.000001f ); + assert( (int16_t) ( abs_spectrum[k] * p + deadzone ) <= q ); + scale = min( scale, p ); + } + + return scale; +} + + +/*-------------------------------------------------------------------* + * tcx_arith_find_kMax() + * + * + *-------------------------------------------------------------------*/ + +/*! r: index of highest freq. nonzero line (-1 if all zeros) */ +static int16_t tcx_arith_find_kMax( + const float abs_spectrum[], /* i : absolute MDCT coefficients */ + const int16_t L_frame, /* i : number of spectral lines */ + const float scale, /* i : scalar quantizer scale */ + const float deadzone, /* i : deadzone (0.5f = no deadzone) */ + const int16_t deadzone_flags[] /* i : line-wise deadzone control */ +) +{ + int16_t kMax; + + kMax = L_frame - 1; + while ( ( kMax >= 0 ) && ( abs_spectrum[kMax] * scale < ( 1.0f - deadzone ) + deadzone * deadzone_flags[kMax] ) ) + { + kMax--; + } + + return kMax; +} + + +/*-------------------------------------------------------------------* + * tcx_arith_rateloop() + * + * + *-------------------------------------------------------------------*/ + +/*! r: best scale */ +static float tcx_arith_rateloop( + const float abs_spectrum[], /* i : absolute MDCT coefficients */ + const int16_t L_frame, /* i : number of spectral lines */ + const Word16 envelope[], /* i : scaled envelope (Q15-e) */ + const Word16 envelope_e, /* i : scaled envelope exponent (Q0) */ + const Word16 exps[], /* i : expfp(-(integer)envelope[]/2) */ + const int16_t target_bits, /* i : target bit budget */ + const float deadzone, /* i : deadzone (0.5f = no deadzone) */ + const int16_t deadzone_flags[], /* i : line-wise deadzone control */ + float *target_bits_fac /* i/o: scale estimator compensation */ +) +{ + int16_t k, idx, kMax, q; + float s, adjust; + float fixed_bits[2][N_MAX_ARI]; + float estimator_undershoot; + float max_complexity; + int16_t iter; /* rate loop iteration counter */ + float scale; /* SQ scale factor to try next */ + float scale_best; /* best SQ scale factor */ + float scale_max; /* maximum allowable scale factor */ + float lob; /* lower bound of SQ scale factor */ + float hib; /* upper bound of SQ scale factor */ + int16_t flag; /* 1:bit surplus, -1:bit deficit, 0:unknown */ + float complexity; /* cumulative rate loop complexity */ + float bits; /* number of bits (approximate) */ + float envelope_scale; + + + scale = tcx_arith_estimate_scale( abs_spectrum, L_frame, envelope, envelope_e ); + scale *= *target_bits_fac; + + scale_max = tcx_arith_find_max_scale( abs_spectrum, L_frame, envelope, envelope_e, exps, deadzone ); + if ( scale > scale_max ) + { + scale = scale_max; + } + + scale_best = scale; + lob = 0.0f; + hib = 0.0f; + flag = 0; + complexity = 0; + bits = 0; + max_complexity = 96.0f * L_frame; + iter = 0; + envelope_scale = (float) pow( 2, envelope_e - 15 ); + + estimator_undershoot = 0; + /* Precalculate fixed bit costs */ + for ( k = 0; k < L_frame; ++k ) + { + s = envelope[k] * envelope_scale; + + fixed_bits[0][k] = -log2_f( 1 - exps[k] / PCM16_TO_FLT_FAC ); + fixed_bits[1][k] = 1 - s * 0.5f * INV_LOG_2 - log2_f( 1 - ( exps[k] / PCM16_TO_FLT_FAC ) * ( exps[k] / PCM16_TO_FLT_FAC ) ); + } + + while ( complexity + 48 + L_frame * 11 < max_complexity ) + { + kMax = tcx_arith_find_kMax( abs_spectrum, L_frame, scale, deadzone, deadzone_flags ); + complexity += 16 + ( L_frame - kMax ) * 5 + ( kMax + 1 ) * 2; + + bits = estimator_undershoot * kMax + 1; + + for ( k = 0; k <= kMax; ++k ) + { + s = envelope[k] * envelope_scale; + q = (int16_t) ( abs_spectrum[k] * scale + deadzone ); + idx = min( 1, q ); + bits += fixed_bits[idx][k]; + bits += s * q * INV_LOG_2; + } + complexity += 32 + 6 * kMax; + if ( iter == 0 ) + { + /* First rate loop iteration */ + if ( scale < scale_max ) + { + /* Only update in non-degenerate case */ + /* Update estimator temporal compensation factor */ + *target_bits_fac *= target_bits / (float) bits; + if ( *target_bits_fac > 1.25f ) + { + *target_bits_fac = 1.25f; + } + if ( *target_bits_fac < 0.75f ) + { + *target_bits_fac = 0.75f; + } + } + } + + if ( bits <= target_bits ) + { + /* Bits leftover => scale is too small */ + if ( flag <= 0 || scale >= scale_best ) + { + scale_best = scale; + flag = 1; + } + + lob = scale; + if ( hib > 0 ) + { + /* Bisection search */ + scale = ( lob + hib ) * 0.5f; + } + else + { + /* Initial scale adaptation */ + adjust = 1.25f * target_bits / (float) bits; + if ( adjust > 2.0f ) + { + adjust = 2.0f; + } + scale *= adjust; + if ( scale > scale_max ) + { + scale = scale_max; + } + } + } + else + { + /* Ran out of bits => scale is too large */ + hib = scale; + if ( lob > 0 ) + { + /* Bisection search */ + scale = ( lob + hib ) * 0.5f; + } + else + { + /* Initial scale adaptation */ + adjust = 0.8f * target_bits / (float) bits; + if ( adjust < 0.5f ) + { + adjust = 0.5f; + } + scale *= adjust; + } + if ( flag <= 0 ) + { + scale_best = scale; + flag = 0; + } + } + ++iter; + } + + + return scale_best; +} + + +/*-------------------------------------------------------------------* + * tcx_arith_encode() + * + * + *-------------------------------------------------------------------*/ + +/*! r: number of bits consumed */ +static int16_t tcx_arith_encode( + int32_t q_abs_spectrum[], /* i/o: scalar quantized absolute spectrum */ + const int16_t signs[], /* i : signs */ + const int16_t kMax, /* i : number of nonzero spectral lines to code */ + const int16_t L_frame, /* i : nominal number of spectral lines */ + const Word16 exps[], /* i : expfp(-(integer)envelope[]/2) */ + const int16_t target_bits, /* i : target bit budget */ + int16_t prm[] /* o : bitstream */ +) +{ + Tastat as, as_lastgood; + int16_t bp, bp_lastgood; + int16_t k; + int16_t kEncoded; + Word16 tmpi1, tmpi2; + + /* Final coding */ + ari_start_encoding_14bits( &as ); + ari_copy_states( &as, &as_lastgood ); + bp = bp_lastgood = 0; + kEncoded = kMax; + for ( k = 0; k <= kMax; ++k ) + { + if ( q_abs_spectrum[k] == 0 ) + { + assert( exps[k] >= 2 ); + bp = ari_encode_14bits_range( prm, bp, target_bits, &as, exps[k] >> 1, 16384 ); + } + else + { + /* q_abs_spectrum[k] != 0 */ + powfp_odd2( exps[k], (Word16) q_abs_spectrum[k], &tmpi1, &tmpi2 ); + while ( tmpi1 < tmpi2 + 2 ) + { + --q_abs_spectrum[k]; + powfp_odd2( exps[k], (Word16) q_abs_spectrum[k], &tmpi1, &tmpi2 ); + } + bp = ari_encode_14bits_range( prm, bp, target_bits, &as, tmpi2 >> 1, tmpi1 >> 1 ); + bp = ari_encode_14bits_sign( prm, bp, target_bits, &as, signs[k] ); + } + /* Check bit budget status */ + if ( as.high <= as.low ) + { + /* no bits left */ + /* printf("\noverflow at %d\n\n", k); */ + if ( q_abs_spectrum[k] > 1 ) /* Lower magnitude is still > 0 */ + { + /* Restore state */ + ari_copy_states( &as_lastgood, &as ); + bp = bp_lastgood; + + /* Quantize to lower magnitude */ + --q_abs_spectrum[k]; + + /* Retry encoding */ + powfp_odd2( exps[k], (Word16) q_abs_spectrum[k], &tmpi1, &tmpi2 ); + bp = ari_encode_14bits_range( prm, bp, target_bits, &as, tmpi2 >> 1, tmpi1 >> 1 ); + bp = ari_encode_14bits_sign( prm, bp, target_bits, &as, signs[k] ); + if ( as.high > as.low ) /* Success */ + { + ari_copy_states( &as, &as_lastgood ); + bp_lastgood = bp; + kEncoded = k; + for ( ++k; k <= kMax; k++ ) + { + q_abs_spectrum[k] = 0; + } + break; + } + } + ari_copy_states( &as_lastgood, &as ); + bp = bp_lastgood; + kEncoded = k - 1; + for ( ; k <= kMax; k++ ) + { + q_abs_spectrum[k] = 0; + } + break; + } + else + { + ari_copy_states( &as, &as_lastgood ); + bp_lastgood = bp; + } + } + + /* Send zeros until L_frame */ + for ( k = kEncoded + 1, kEncoded = L_frame - 1; k < L_frame; ++k ) + { + assert( exps[k] >= 2 ); + bp = ari_encode_14bits_range( prm, bp, target_bits, &as, exps[k] >> 1, 16384 ); + /* Check bit budget status */ + if ( as.high <= as.low ) + { + /* no bits left */ + ari_copy_states( &as_lastgood, &as ); + bp = bp_lastgood; + kEncoded = k - 1; + break; + } + else + { + ari_copy_states( &as, &as_lastgood ); + bp_lastgood = bp; + } + } + + if ( kEncoded == L_frame - 1 ) + { + /* RESQ bits possibly available */ + /* Limit target bits to actually needed bits */ + bp = ari_done_cbr_encoding_14bits( prm, bp, bp + 16 + as.bits_to_follow, &as ); + } + else + { + bp = ari_done_cbr_encoding_14bits( prm, bp, target_bits, &as ); + } + + return bp; +} + + +/*-------------------------------------------------------------------* + * tcx_arith_encode_envelope() + * + * + *-------------------------------------------------------------------*/ + +void tcx_arith_encode_envelope( + float spectrum[], /* i/o: MDCT coefficients */ + int16_t signs[], /* o : signs (spectrum[.]<0) */ + const int16_t L_frame, /* i : frame or MDCT length */ + const int16_t L_spec, /* i : length w/o BW limitation */ + Encoder_State *st, /* i/o: coder state */ + const Word16 A_ind[], /* i : quantised LPC coefficients */ + int16_t target_bits, /* i : number of available bits */ + int16_t prm[], /* o : bitstream parameters */ + const int16_t use_hm, /* i : use HM in current frame? */ + int16_t prm_hm[], /* o : HM parameter area */ + const int16_t tcxltp_pitch, /* i : TCX LTP pitch in FD, -1 if n/a */ + int16_t *arith_bits, /* o : bits used for ari. coding */ + int16_t *signaling_bits, /* o : bits used for signaling */ + const int16_t low_complexity /* i : low-complexity flag */ +) +{ + TCX_ENC_HANDLE hTcxEnc = st->hTcxEnc; + Word16 tmp; + Word32 env[N_MAX_ARI]; /* unscaled envelope (Q16) */ + Word16 *envelope; /* scaled envelope (Q15-e) */ + Word16 envelope_e; + Word16 exponents[N_MAX_ARI]; /* Q15 */ + int16_t L_spec_core; + int32_t *q_spectrum; + TCX_CONFIG_HANDLE hTcxCfg; + float scale; + int16_t k, kMax; + float deadzone; + const int16_t *deadzone_flags; + float gamma_w, gamma_uw; + int16_t hm_bits; + + assert( L_spec <= N_MAX_ARI ); + + hTcxCfg = st->hTcxCfg; + deadzone = hTcxCfg->sq_rounding; + deadzone_flags = hTcxEnc->memQuantZeros; + *signaling_bits = 0; + assert( st->enableTcxLpc ); + gamma_w = 1.0f; + gamma_uw = 1.0f / st->gamma; + +#define WMC_TOOL_SKIP + tcx_arith_render_envelope( A_ind, L_frame, L_spec, FL2WORD16( hTcxCfg->preemph_fac ), FL2WORD16( gamma_w ), FL2WORD16( 0.5f * gamma_uw ), env ); +#undef WMC_TOOL_SKIP + + for ( k = 0; k < L_spec; ++k ) + { + if ( spectrum[k] < 0 ) + { + spectrum[k] = -spectrum[k]; + signs[k] = 1; + } + else + { + signs[k] = 0; + } + } + + if ( use_hm ) + { + tcx_hm_analyse( spectrum, L_spec, env, target_bits, hTcxCfg->coder_type, prm_hm, tcxltp_pitch, hTcxEnc->tcxltp_gain, &hm_bits ); + + target_bits -= hm_bits; + *signaling_bits += hm_bits; + } + else + { + prm_hm[0] = 0; /* just to be sure */ + hm_bits = 0; + } + + L_spec_core = L_spec; + if ( st->igf ) + { + L_spec_core = min( L_spec_core, st->hIGFEnc->infoStartLine ); + } + envelope = (Word16 *) env; + tcx_arith_scale_envelope( L_spec, L_spec_core, env, target_bits, low_complexity, envelope, &envelope_e ); + +#define WMC_TOOL_SKIP + tmp = sub( envelope_e, 1 ); + FOR( k = 0; k < L_spec; k++ ) + { + exponents[k] = expfp( negate( envelope[k] ), tmp ); + } +#undef WMC_TOOL_SKIP + scale = tcx_arith_rateloop( spectrum, L_spec, envelope, envelope_e, exponents, target_bits, deadzone, deadzone_flags, &( hTcxEnc->tcx_target_bits_fac ) ); + + /* Final quantization */ + kMax = tcx_arith_find_kMax( spectrum, L_spec, scale, deadzone, deadzone_flags ); + + q_spectrum = env; /* Reuse buffer */ + for ( k = 0; k <= kMax; ++k ) + { + /* quantise using dead-zone */ + q_spectrum[k] = (int32_t) ( spectrum[k] * scale + deadzone ); + } + + /* Final encoding */ + *arith_bits = tcx_arith_encode( q_spectrum, signs, kMax, L_spec, exponents, target_bits, prm ); + + /* Multiply back the signs */ + for ( k = 0; k <= kMax; ++k ) + { + spectrum[k] = (float) ( q_spectrum[k] * ( 1 - 2 * signs[k] ) ); + } + for ( ; k < max( L_frame, L_spec ); ++k ) + { + spectrum[k] = 0; + } + + return; +} diff --git a/lib_enc/avq_cod.c b/lib_enc/avq_cod.c new file mode 100644 index 0000000000000000000000000000000000000000..f76b4a353739dc41c0d6ded9fe2b4ea08d975fe1 --- /dev/null +++ b/lib_enc/avq_cod.c @@ -0,0 +1,596 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * Local prototypes + *-------------------------------------------------------------------*/ + +static void wrte_cv( BSTR_ENC_HANDLE hBstr, const int16_t nq, const int16_t i_ind, const int16_t kv_ind, uint16_t I, int16_t kv[], int16_t *bits ); + +/*-------------------------------------------------------------------* + * Function AVQ_cod() * + * * + * Split algebraic vector quantizer (AVQ) based on RE8 latice * + *-------------------------------------------------------------------*/ + +/*! r: comfort noise gain factor */ +float AVQ_cod( + const float xri[], /* i : vector to quantize */ + int16_t xriq[], /* o : quantized normalized vector (assuming the bit budget is enough) */ + const int16_t nb_bits, /* i : number of allocated bits */ + const int16_t Nsv /* i : number of subvectors (lg=Nsv*8) */ +) +{ + int16_t i, j, iter; + int16_t c[8]; + float gain_inv, x1[8], ener, tmp, nbits, nbits_max, fac, offset; + float ebits[NSV_MAX]; + + /* find energy of each subvector in log domain (scaled for bits estimation) */ + for ( i = 0; i < Nsv; i++ ) + { + ener = 2.0f; /* to set ebits >= 0 */ + for ( j = 0; j < 8; j++ ) + { + x1[j] = xri[i * 8 + j]; + ener += x1[j] * x1[j]; + } + + /* estimated bit consumption when gain=1 */ + ebits[i] = 5.0f * FAC_LOG2 * (float) log10( ener * 0.5f ); + } + + /* estimate gain according to number of bits allowed */ + fac = 128.0f; /* start at the middle (offset range = 0 to 255.75) */ + offset = 0.0f; + nbits_max = 0.95f * ( (float) ( nb_bits - Nsv ) ); + + /* tree search with 10 iterations : offset with step of 0.25 bits (0.3 dB) */ + for ( iter = 0; iter < 10; iter++ ) + { + offset += fac; + /* calculate the required number of bits */ + nbits = 0.0; + for ( i = 0; i < Nsv; i++ ) + { + tmp = ebits[i] - offset; + if ( tmp < 0.0 ) + { + tmp = 0.0; + } + nbits += tmp; + } + /* decrease gain when no overflow occurs */ + if ( nbits <= nbits_max ) + { + offset -= fac; + } + fac *= 0.5; + } + + /* estimated gain (when offset=0, estimated gain=1) */ + gain_inv = 1.0f / (float) pow( 10.0f, (float) ( offset / ( 2.0f * 5.0f * FAC_LOG2 ) ) ); + + /* quantize all subvector using estimated gain */ + for ( i = 0; i < Nsv; i++ ) + { + for ( j = 0; j < 8; j++ ) + { + x1[j] = xri[i * 8 + j] * gain_inv; + } + + re8_PPV( x1, c ); + for ( j = 0; j < 8; j++ ) + { + xriq[i * 8 + j] = c[j]; + } + } + + fac = 0; + + /* round bit allocations and save */ + for ( i = 0; i < Nsv; i++ ) + { + xriq[( Nsv * 8 ) + i] = (int16_t) floor( ebits[i] * 128.0f ); + } + + return ( fac ); +} + + +/*-----------------------------------------------------------------* + * AVQ_encmux() + * + * Encode subvectors and write indexes into the bitstream + *-----------------------------------------------------------------*/ + +void AVQ_encmux( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const int16_t extl, /* i : extension layer */ + int16_t xriq[], /* i/o: rounded subvectors [0..8*Nsv-1] followedby rounded bit allocations [8*Nsv..8*Nsv+Nsv-1]*/ + int16_t *nb_bits, /* i/o: number of allocated bits */ + const int16_t Nsv, /* i : number of subvectors */ + int16_t nq[], /* o : AVQ nq index */ + int16_t avq_bit_sFlag, /* i : flag for AVQ bit saving solution */ + int16_t trgtSvPos /* i : target SV for AVQ bit savings */ +) +{ + int16_t i, j = 0, bits, pos, pos_max, overflow; + int16_t sort_idx[NSV_MAX]; + int16_t *t, kv[NSV_MAX * 8]; + uint16_t I[NSV_MAX]; + int16_t nq_ind, i_ind, kv_ind; + int16_t nq_est, unused_bits, unused_bits_idx; + int16_t bitsMod; + int16_t unusedbitsFlag; + int16_t svOrder[NSV_MAX], k, nullVec, dummy_bits; + + if ( extl == SWB_BWE_HIGHRATE || extl == FB_BWE_HIGHRATE ) + { + nq_ind = IND_NQ2; + i_ind = IND_I2; + kv_ind = IND_KV2; + } + else + { + nq_ind = IND_NQ; + i_ind = IND_I; + kv_ind = IND_KV; + } + + unusedbitsFlag = 0; + bitsMod = 0; + + for ( i = 0; i < NSV_MAX; i++ ) + { + I[i] = (uint16_t) -1; + } + + /*----------------------------------------------------------------- + * Encode subvectors and fix possible overflows in total bit budget, + * i.e. find for each subvector a codebook index nq (nq=0,2,3,4,...,NSV_MAX), + * a base codebook index (I), and a Voronoi index (kv) + *-----------------------------------------------------------------*/ + + /* sort subvectors by estimated bit allocations in decreasing order */ + t = kv; /* reuse vector to save memory */ + for ( i = 0; i < Nsv; i++ ) + { + t[i] = xriq[8 * Nsv + i]; + } + + for ( i = 0; i < Nsv; i++ ) + { + bits = t[0]; + pos = 0; + for ( j = 1; j < Nsv; j++ ) + { + if ( t[j] > bits ) + { + bits = t[j]; + pos = j; + } + } + sort_idx[i] = pos; + t[pos] = -1; + } + + /* compute multi-rate indices and avoid bit budget overflow */ + pos_max = 0; + bits = 0; + for ( i = 0; i < Nsv; i++ ) + { + /* find vector to quantize (criteria: nb of estimated bits) */ + pos = sort_idx[i]; + + /* compute multi-rate index of rounded subvector (nq,I,kv[]) */ + re8_cod( &xriq[pos * 8], &nq[pos], &I[pos], &kv[8 * pos] ); + + if ( nq[pos] > 0 ) + { + j = pos_max; + if ( pos > j ) + { + j = pos; + } + + /* compute (number of bits -1) to describe Q #nq */ + if ( nq[pos] >= 2 ) + { + overflow = nq[pos] * 5 - 1; + } + else + { + overflow = 0; + } + + /* check for overflow and compute number of bits-1 (n) */ + if ( ( bits + overflow + j ) > *nb_bits ) + { + /* if budget overflow */ + for ( j = pos * 8; j < ( pos * 8 ) + 8; j++ ) + { + xriq[j] = 0; + } + nq[pos] = 0; /* force Q0 */ + } + else + { + bits += overflow; + pos_max = j; /* update index of the last described subvector */ + } + } + } + + nullVec = 0; + dummy_bits = 0; + svOrder[Nsv - 1] = trgtSvPos; + svOrder[0] = 0; + svOrder[1] = 1; + i = 2; + j = i; + if ( avq_bit_sFlag == 2 ) + { + j = i + 1; + } + while ( i < Nsv - 1 ) + { + svOrder[i] = j; + i++; + j++; + } + + /* write indexes to the bitstream */ + /* ============================== */ + + bits = *nb_bits; + overflow = 0; + for ( i = 0; i < Nsv; i++ ) + { + k = svOrder[i]; + if ( avq_bit_sFlag == 2 && bits % 5 == 4 && bits > 8 && bits < 30 && k >= trgtSvPos && i < Nsv - 1 ) + { + ordr_esti( Nsv - i, &trgtSvPos, &svOrder[i], Nsv ); + k = svOrder[i]; + avq_bit_sFlag = 1; + } + + if ( k == trgtSvPos && avq_bit_sFlag > 0 ) + { + if ( ( *nb_bits - bits ) == 7 || bits < BIT_SAVING_LOW_THR || bits >= BIT_SAVING_HIGH_THR ) + { + avq_bit_sFlag = 0; + } + else + { + break; + } + } + + if ( 5 * nq[k] - 1 == bits ) /* check the overflow */ + { + overflow = 1; + } + + if ( bits > 8 ) + { + /* write the unary code for nq[i] */ + j = nq[k] - 1; + if ( nq[k] > 0 ) + { + /* write the unary code */ + while ( j > 16 ) + { + push_indice( hBstr, nq_ind, 65535, 16 ); + bits -= 16; + j -= 16; + } + + if ( j > 0 ) + { + push_indice( hBstr, nq_ind, ( 1 << j ) - 1, j ); + bits -= j; + } + } + + if ( !overflow ) + { + /* write the stop bit */ + push_indice( hBstr, nq_ind, 0, 1 ); + bits--; + } + + /* write codebook indices (rank I and event. Voronoi index kv) */ + wrte_cv( hBstr, nq[k], i_ind, kv_ind, I[k], &kv[k * 8], &bits ); + } + } /* for */ + + /* Bit Saving Solution */ + if ( avq_bit_sFlag > 0 && bits > 8 ) + { + bitsMod = bits % 5; + i = svOrder[Nsv - 1]; + if ( i != Nsv - 1 ) + { + nullVec = 0; + for ( j = i; j < Nsv - 1; j++ ) + { + if ( nq[svOrder[j]] == 0 ) + { + nullVec++; + } + } + nq_est = bits / 5; + if ( ( bitsMod > 0 || ( nullVec == 4 && nq_est == 5 ) ) && bitsMod != 4 && ( bits + nullVec ) >= 5 * nq_est + 4 && nq[svOrder[Nsv - 2]] == 0 ) /* detect need for dummy bits */ + { + dummy_bits = 5 - bitsMod; + bits = bits + dummy_bits; /* add dummy bits */ + bitsMod = 0; + } + else if ( nq_est > 4 && ( ( bitsMod == 0 && nullVec > 3 && nullVec < 6 ) || ( bitsMod == 4 && nullVec == 5 ) ) && nq[svOrder[Nsv - 2]] == 0 ) /* wasted bits 4, 5 for nq 6,7..*/ + { + overflow = 0; + if ( ( bitsMod + nullVec ) % 5 != 0 ) + { + overflow = 1; + } + dummy_bits = nullVec + overflow; + bits = bits + dummy_bits; /* add dummy bits */ + bitsMod = 0; + } + } + + overflow = 1; + if ( bitsMod != 4 ) + { + overflow = 0; + bits -= bitsMod; + } + bits = bits + overflow; /*add fake bit */ + unused_bits = bits - 5 * nq[i]; + if ( nq[i] == 0 ) /*no bit savings*/ + { + unused_bits--; /*Stop Bit*/ + } + unused_bits_idx = (int16_t) unused_bits / 5; + + unusedbitsFlag = 0; + + if ( dummy_bits == 0 ) + { + if ( unused_bits_idx == 1 && bits > BIT_SAVING_LOW_THR ) + { + unused_bits_idx = 0; + unusedbitsFlag = 1; + } + else if ( unused_bits_idx == 0 && bits > BIT_SAVING_LOW_THR ) + { + unused_bits_idx = 1; + unusedbitsFlag = -1; + } + } + + j = unused_bits_idx; + /*Encode Unused Bit Unary Codeword */ + if ( j > 0 ) + { + /* write the unary code */ + push_indice( hBstr, nq_ind, ( 1 << j ) - 1, j ); + } + + if ( nq[i] != 0 ) + { + /* write the stop bit */ + push_indice( hBstr, nq_ind, 0, 1 ); + } + + /*Compute AVQ code book number from unused Bits */ + nq_est = (int16_t) ceil( 0.2f * ( bits - 5 * ( unusedbitsFlag + unused_bits_idx ) ) ); + + if ( nq_est == 1 ) + { + nq_est = 0; + } + bits -= overflow; + + bits -= j; + + if ( nq_est != 0 ) + { + bits--; + } + nq[i] = nq_est; + + /* write codebook indices (rank I and event. Voronoi index kv) */ + wrte_cv( hBstr, nq[i], i_ind, kv_ind, I[i], &kv[i * 8], &bits ); + + bits -= dummy_bits; + + if ( bitsMod != 4 ) + { + bits += bitsMod; + } + } + + + *nb_bits = bits; + + return; +} + + +/*-------------------------------------------------------------------* + * Function AVQ_cod_lpc() * + * * + * Split algebraic vector quantizer (AVQ) for LPC quantization * + *-------------------------------------------------------------------*/ + +void AVQ_cod_lpc( + const float nvec[], /* i : vector to quantize */ + int16_t nvecq[], /* o : quantized normalized vector (assuming the bit budget is enough) */ + int16_t *indx, /* o : index[] (4 bits per words) */ + const int16_t Nsv /* i : number of subvectors (lg=Nsv*8) */ +) +{ + int16_t nq, c[8]; + int16_t i, l, n, nk, pos, ival, kv[8]; + float x1[8]; + uint16_t I; + + /* quantize all subvector using estimated gain */ + pos = Nsv; + + for ( l = 0; l < Nsv; l++ ) + { + for ( i = 0; i < 8; i++ ) + { + x1[i] = nvec[l * 8 + i]; + } + + re8_PPV( x1, c ); + + re8_cod( c, &nq, &I, kv ); + + for ( i = 0; i < 8; i++ ) + { + nvecq[l * 8 + i] = c[i]; + } + + indx[l] = nq; /* index[0..Nsv-1] = quantizer number (0,2,3,4...) */ + + nk = 0; + n = nq; + + if ( nq > 4 ) + { + nk = ( nq - 3 ) >> 1; + n = nq - nk * 2; + } + + /* write n groups of 4-bit for base codebook index (I) */ + while ( n-- > 0 ) + { + indx[pos++] = ( I & 0x0F ); + I >>= 4; + } + + /* write n groups of 4-bit for Voronoi index (k[]) */ + while ( nk-- > 0 ) + { + ival = 0; + + for ( i = 0; i < 8; i++ ) + { + ival <<= 1; + ival += ( kv[i] & 0x01 ); + kv[i] >>= 1; + } + indx[pos++] = ( ival & 0x0F ); + ival >>= 4; + indx[pos++] = ( ival & 0x0F ); + } + } + + return; +} + +/*-------------------------------------------------------------------* + * Function wrte_cv() * + * * + * write codebook indices (rank I and event. Voronoi index kv) * + *-------------------------------------------------------------------*/ + +static void wrte_cv( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const int16_t nq, /* i : AVQ nq index */ + const int16_t i_ind, /* i : Base Bitstream index */ + const int16_t kv_ind, /* i : Vornoi Bitstream index */ + uint16_t I, /* o : rank I code book index */ + int16_t kv[], /* o : Vornoi index kv */ + int16_t *nbits /* i/o: bits */ +) +{ + int16_t pos, j; + int16_t bits; + + bits = *nbits; + + /* write codebook indices (rank I and event. Voronoi index kv) */ + if ( nq == 0 ) /* Q0 */ + { + /* nothing to write */ + } + else if ( nq < 5 ) /* Q2, Q3, Q4 */ + { + push_indice( hBstr, i_ind, I, 4 * nq ); + bits -= ( 4 * nq ); + } + else if ( nq % 2 == 0 ) /* Q4 + Voronoi extensions r=1,2,3,... */ + { + push_indice( hBstr, i_ind, I, 4 * 4 ); + bits -= 4 * 4; + pos = (int16_t) ( nq / 2 - 2 ); /* Voronoi order determination */ + for ( j = 0; j < 8; j++ ) + { + push_indice( hBstr, kv_ind, kv[j], pos ); + } + + bits -= 8 * pos; + } + else /* Q3 + Voronoi extensions r=1,2,3,... */ + { + push_indice( hBstr, i_ind, I, 4 * 3 ); + bits -= 4 * 3; + + pos = (int16_t) ( nq / 2 - 1 ); /* Voronoi order determination */ + for ( j = 0; j < 8; j++ ) + { + push_indice( hBstr, kv_ind, kv[j], pos ); + } + + bits -= 8 * pos; + } + + *nbits = bits; + return; +} diff --git a/lib_enc/bass_psfilter_enc.c b/lib_enc/bass_psfilter_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..dbfb38224948414be4af4c2314c66195b4a54d91 --- /dev/null +++ b/lib_enc/bass_psfilter_enc.c @@ -0,0 +1,257 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + + +/*---------------------------------------------------------------------* + * bass_pf_enc() + * + * Low-frequency postfiltering, decoder parammeter estimation + *---------------------------------------------------------------------*/ + +float bass_pf_enc( + const float *orig, /* i : 12.8kHz original signal */ + const float *syn, /* i : 12.8kHz synthesis to postfilter */ + const float pitch_buf[], /* i : Pitch gain for all subframes (gainT_sf[16]) */ + const float gainT_sf[], /* i : Pitch gain for all subframes (gainT_sf[16]) */ + const int16_t l_frame, /* i : frame length (should be multiple of l_subfr)*/ + const int16_t l_subfr_in, /* i : sub-frame length (80/64) */ + float mem_bpf[], /* i/o: memory state [2*L_FILT16k] */ + float mem_error_bpf[], /* i/o: memory state [2*L_FILT16k] */ + int16_t *gain_factor_param, /* o : quantized gain factor */ + const int16_t mode, /* i : coding mode of adapt bpf */ + float *mem_deemph_err, /* o : Error deemphasis memory */ + float *lp_ener /* o : long_term error signal energy */ +) +{ + int16_t i, j, sf, i_subfr, T, lg, l_subfr, l_filt; + float d, n, snr, nrg1, nrg2, gain, nrg, tmp; + float noise_buf[L_FILT16k + ( 2 * L_SUBFR )], *noise, *noise_in; + float error_buf[L_FILT16k + ( 2 * L_SUBFR )], *error, *error_in; + float cross_n_d, nrg_n; + const float *pFilt; + float ener2; + + if ( l_frame != L_FRAME16k ) + { + pFilt = filt_lp; + l_filt = L_FILT; + } + else + { + pFilt = filt_lp_16kHz; + l_filt = L_FILT16k; + } + + noise = noise_buf + l_filt; + noise_in = noise_buf + 2 * l_filt; + error = error_buf + l_filt; + error_in = error_buf + 2 * l_filt; + + sf = 0; + snr = 0.f; + nrg_n = 1e-6f; + cross_n_d = 0.f; + l_subfr = l_subfr_in; + for ( i_subfr = 0; i_subfr < l_frame; i_subfr += l_subfr, sf++ ) + { + T = (int16_t) pitch_buf[sf]; + gain = gainT_sf[sf]; + + if ( gain > 1.0f ) + { + gain = 1.0f; + } + if ( gain < 0.0f ) + { + gain = 0.0f; + } + + lg = l_frame - T - i_subfr; + if ( lg < 0 ) + { + lg = 0; + } + if ( lg > l_subfr ) + { + lg = l_subfr; + } + + if ( gain > 0 ) + { + tmp = 0.01f; + nrg = 0.01f; + for ( i = 0; i < lg; i++ ) + { + tmp += syn[i + i_subfr] * ( 0.5f * syn[i + i_subfr - T] + 0.5f * syn[i + i_subfr + T] ); + nrg += ( 0.5f * syn[i + i_subfr - T] + 0.5f * syn[i + i_subfr + T] ) * ( 0.5f * syn[i + i_subfr - T] + 0.5f * syn[i + i_subfr + T] ); + } + for ( i = lg; i < l_subfr; i++ ) + { + tmp += syn[i + i_subfr] * syn[i + i_subfr - T]; + nrg += syn[i + i_subfr - T] * syn[i + i_subfr - T]; + } + gain = tmp / nrg; + + if ( gain > 1.0f ) + { + gain = 1.0f; + } + else if ( gain < 0.f ) + { + gain = 0.f; + } + + ener2 = 0.01f; + for ( i = 0; i < lg; i++ ) + { + error[i] = gain * ( syn[i + i_subfr] - 0.5f * syn[i + i_subfr - T] - 0.5f * syn[i + i_subfr + T] ); + error[i] = error[i] + 0.9f * *mem_deemph_err; + *mem_deemph_err = error[i]; + ener2 += error[i] * error[i]; + } + for ( i = lg; i < l_subfr; i++ ) + { + error[i] = 0.5f * gain * ( syn[i + i_subfr] - syn[i + i_subfr - T] ); + error[i] = error[i] + 0.9f * *mem_deemph_err; + *mem_deemph_err = error[i]; + ener2 += error[i] * error[i]; + } + + ener2 = (float) ( 10.f * log10( ener2 ) ); + *lp_ener = (float) ( 0.99f * *lp_ener + 0.01f * ener2 ); + ener2 = (float) pow( 10.f, 0.1f * *lp_ener ); + + tmp = 0.5f * tmp / ( nrg + ener2 ); + if ( tmp > 0.5f ) + { + tmp = 0.5f; + } + else if ( tmp < 0.f ) + { + tmp = 0.0f; + } + + for ( i = 0; i < lg; i++ ) + { + noise_in[i] = tmp * ( syn[i + i_subfr] - 0.5f * syn[i + i_subfr - T] - 0.5f * syn[i + i_subfr + T] ); + error_in[i] = ( orig[i + i_subfr] - syn[i + i_subfr] ); + } + for ( i = lg; i < l_subfr; i++ ) + { + noise_in[i] = tmp * ( syn[i + i_subfr] - syn[i + i_subfr - T] ); + noise_in[i] *= 0.5f; + error_in[i] = ( orig[i + i_subfr] - syn[i + i_subfr] ); + } + } + else + { + set_zero( noise_in, l_subfr ); + set_zero( error_in, l_subfr ); + } + + mvr2r( mem_bpf, noise_buf, 2 * l_filt ); + mvr2r( noise_buf + l_subfr, mem_bpf, 2 * l_filt ); + + mvr2r( mem_error_bpf, error_buf, 2 * l_filt ); + mvr2r( error_buf + l_subfr, mem_error_bpf, 2 * l_filt ); + + nrg1 = 1e-6f; + nrg2 = 1e-6f; + + /* substract from voiced speech low-pass filtered noise */ + for ( i = 0; i < l_subfr; i++ ) + { + n = pFilt[0] * noise[i]; + d = error[i]; + + for ( j = 1; j <= l_filt; j++ ) + { + n += pFilt[j] * ( noise[i - j] + noise[i + j] ); + } + /*for optimal g*/ + nrg_n += n * n; + cross_n_d += n * d; + + /*for evaluating SNR*/ + nrg1 += ( d + n ) * ( d + n ); + nrg2 += d * d; + } + + /*SegSNR*/ + snr += (float) log10( nrg2 / nrg1 ); + } + + /*Compute and quantize optimal gain*/ + /* optimal gain = -/ */ + if ( mode == 2 ) + { + int32_t gain32; + + gain32 = (int32_t) ( -2.f * ( cross_n_d / nrg_n ) + 0.5f ); + if ( gain32 > 3 ) + { + *gain_factor_param = 3; + } + else if ( gain32 < 0 ) + { + *gain_factor_param = 0; + } + else + { + *gain_factor_param = (int16_t) gain32; + } + + /*If optimal gain negatif or zero but snr still positif->gain=0.5f*/ + if ( snr > 0.f && *gain_factor_param == 0 ) + { + *gain_factor_param = 1; + } + } + else + { + *gain_factor_param = 2; + } + + + return ( snr ); +} diff --git a/lib_enc/bw_detect.c b/lib_enc/bw_detect.c new file mode 100644 index 0000000000000000000000000000000000000000..94e26fbf5ec39b1cd29df9964dae708f64050d2e --- /dev/null +++ b/lib_enc/bw_detect.c @@ -0,0 +1,728 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include "options.h" +#include +#include "cnst.h" +#include "rom_enc.h" +#include "rom_com.h" +#include "prot.h" +#include "ivas_prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * Local constants + *-------------------------------------------------------------------*/ + +#define BWD_MIN_BRATE_WIDER_BW_MDCT IVAS_48k +#define BWD_MIN_BRATE_WIDER_BW_ISM IVAS_32k +#define BWD_MAX_BRATE_WIDER_BW_MDCT IVAS_80k +#define BWD_MAX_BRATE_WIDER_BW_ISM IVAS_64k + +#define ALPHA_BWD 0.75f +#define BWD_LT_THRESH 0.6f + +#define BWD_COUNT_MAX 100 +#define BWD_COUNT_WIDER_BW 10 +#define BWD_COUNT_WIDER_BW_MDCT 0 + +#define CLDFB_ENER_OFFSET 1.6f + +/*-------------------------------------------------------------------* + * bw_detect() + * + * bandwidth detector + *-------------------------------------------------------------------*/ + +void bw_detect( + Encoder_State *st, /* i/o: Encoder State */ + const float signal_in[], /* i : input signal */ + float *spectrum, /* i : MDCT spectrum */ + const float *enerBuffer, /* i : energy buffer */ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const int16_t mct_on /* i : flag MCT mode */ +) +{ + int16_t i, j, k, bw_max, bin_width, n_bins; + float spect[L_FRAME48k], in_win[BWD_TOTAL_WIDTH]; + float spect_bin[BWD_N_BINS_MAX]; + float cldfb_bin[9]; + const float *pt, *pt1; + float max_NB, max_WB, max_SWB, max_FB, mean_NB, mean_WB, mean_SWB, mean_FB; + int16_t cldfb_bin_width = 4; + int16_t bwd_count_wider_bw, l_frame; + + bwd_count_wider_bw = BWD_COUNT_WIDER_BW; + if ( st->ini_frame > 0 && ( ( st->element_mode == IVAS_CPE_MDCT && ( st->element_brate >= BWD_MIN_BRATE_WIDER_BW_MDCT || mct_on ) ) || + ( ivas_format == ISM_FORMAT && st->element_brate >= BWD_MIN_BRATE_WIDER_BW_ISM ) ) ) + { + bwd_count_wider_bw = BWD_COUNT_WIDER_BW_MDCT; + } + + if ( st->input_Fs > 8000 ) + { + if ( enerBuffer != NULL ) + { + float ScalFac; + + ScalFac = 1 / ( st->cldfbAnaEnc->scale * st->cldfbAnaEnc->scale * 8.f ); + set_f( cldfb_bin, 0.001f, 9 ); + + /* NB: 1.2 - 2.8 kHz, 4 cldfb-bands*/ + cldfb_bin[0] += sum_f( &( enerBuffer[3] ), cldfb_bin_width ); + + /* WB: 4.4 - 7.2 kHz, 8 cldfb-bands, mid band(14) counted twice */ + if ( st->input_Fs >= 16000 ) + { + cldfb_bin[1] += sum_f( &( enerBuffer[11] ), cldfb_bin_width ); + cldfb_bin[2] += sum_f( &( enerBuffer[14] ), cldfb_bin_width ); + } + + /* SWB: 9.2 - 15.6 kHz, 16 cldfb-bands */ + if ( st->input_Fs >= 32000 ) + { + cldfb_bin[3] += sum_f( &( enerBuffer[23] ), cldfb_bin_width ); + cldfb_bin[4] += sum_f( &( enerBuffer[27] ), cldfb_bin_width ); + cldfb_bin[5] += sum_f( &( enerBuffer[31] ), cldfb_bin_width ); + cldfb_bin[6] += sum_f( &( enerBuffer[35] ), cldfb_bin_width ); + } + + /* FB: 16.8 - 20.0 kHz, 8 cldfb-bands */ + if ( st->input_Fs >= 48000 ) + { + cldfb_bin[7] += sum_f( &( enerBuffer[42] ), cldfb_bin_width ); + cldfb_bin[8] += sum_f( &( enerBuffer[46] ), cldfb_bin_width ); + } + + for ( i = 0; i < 9; i++ ) + { + cldfb_bin[i] = (float) log10( cldfb_bin[i] * ScalFac ); /* see formula used in perform_noise_estimation_enc() for CNG */ + } + } + else + { + /* set width of a speactral bin (corresponds to 1.5kHz) */ + if ( st->input_Fs == 16000 ) + { + bw_max = WB; + bin_width = 60; + n_bins = 5; /* spectrum to 7.5 kHz */ + } + else if ( st->input_Fs == 32000 ) + { + bw_max = SWB; + bin_width = 30; + n_bins = 10; /* spectrum to 15 kHz */ + } + else /* st->input_Fs == 48000 */ + { + bw_max = FB; + bin_width = 20; + n_bins = BWD_N_BINS_MAX; /* spectrum to 19.5 kHz */ + } + + if ( signal_in != NULL ) + { + /*---------------------------------------------------------------------* + * windowing of the input signal + *---------------------------------------------------------------------*/ + + pt = signal_in; + pt1 = hann_window_320; + + /* 1st half of the window */ + for ( i = 0; i < BWD_TOTAL_WIDTH / 2; i++ ) + { + in_win[i] = *pt++ * *pt1++; + } + pt1--; + + /* 2nd half of the window */ + for ( ; i < BWD_TOTAL_WIDTH; i++ ) + { + in_win[i] = *pt++ * *pt1--; + } + + /*---------------------------------------------------------------------* + * tranform into frequency domain + *---------------------------------------------------------------------*/ + + edct( in_win, spect, BWD_TOTAL_WIDTH, st->element_mode ); + } + else + { + l_frame = (int16_t) ( st->input_Fs / FRAMES_PER_SEC ); + if ( st->core == TCX_10_CORE ) + { + l_frame /= 2; + } + + bin_width *= ( l_frame / BWD_TOTAL_WIDTH ); + mvr2r( spectrum, spect, l_frame ); + } + /*---------------------------------------------------------------------* + * compute energy per spectral bins + *---------------------------------------------------------------------*/ + + set_f( spect_bin, 0.001f, n_bins ); + + for ( k = 0; k <= bw_max; k++ ) + { + for ( i = bwd_start_bin[k]; i <= bwd_end_bin[k]; i++ ) + { + for ( j = 0; j < bin_width; j++ ) + { + spect_bin[i] += spect[i * bin_width + j] * spect[i * bin_width + j]; + } + spect_bin[i] = (float) log10( spect_bin[i] ); + } + } + } + + if ( enerBuffer != NULL ) + { + /* cldfb detections */ + mean_NB = mean( cldfb_bin, 1 ); /* NB: 1.2 - 2.8 kHz, 4 cldfb-bands (1 bin) */ + maximum( cldfb_bin, 1, &max_NB ); + mean_WB = mean( cldfb_bin + 1, 2 ); /* WB: 4.4 - 7.2 kHz, 8 cldfb-bands (2 bins) */ + maximum( cldfb_bin + 1, 2, &max_WB ); + + mean_NB += CLDFB_ENER_OFFSET; + max_NB += CLDFB_ENER_OFFSET; + mean_WB += CLDFB_ENER_OFFSET; + max_WB += CLDFB_ENER_OFFSET; + + if ( st->input_Fs == 16000 ) + { + /* for 16kHz sampled inputs, do not check SWB & FB */ + mean_SWB = 0.0f; + max_SWB = 0.0f; + mean_FB = 0.0f; + max_FB = 0.0f; + } + else if ( st->input_Fs == 32000 ) + { + /* for 32kHz sampled inputs, do not check FB */ + mean_FB = 0.0f; + max_FB = 0.0f; + mean_SWB = mean( cldfb_bin + 3, 4 ); /* SWB: 9.2 - 15.6 kHz, 16 cldfb-bands (4 bins) */ + maximum( cldfb_bin + 3, 4, &max_SWB ); + mean_SWB += CLDFB_ENER_OFFSET; + max_SWB += CLDFB_ENER_OFFSET; + } + else + { + mean_SWB = mean( cldfb_bin + 3, 4 ); /* SWB: 9.2 - 15.6 kHz, 16 cldfb-bands (4 bins) */ + maximum( cldfb_bin + 3, 4, &max_SWB ); + mean_FB = mean( cldfb_bin + 7, 2 ); /* FB: 16.8 - 20.0 kHz, 8 cldfb-bands (2 bins) */ + maximum( cldfb_bin + 7, 2, &max_FB ); + + mean_SWB += CLDFB_ENER_OFFSET; + max_SWB += CLDFB_ENER_OFFSET; + mean_FB += CLDFB_ENER_OFFSET; + max_FB += CLDFB_ENER_OFFSET; + } + } + else + { + mean_NB = mean( spect_bin + bwd_start_bin[0], bwd_end_bin[0] - bwd_start_bin[0] + 1 ); /* NB: 1.5-3.0kHz (1 bin) */ + maximum( spect_bin + bwd_start_bin[0], bwd_end_bin[0] - bwd_start_bin[0] + 1, &max_NB ); + mean_WB = mean( spect_bin + bwd_start_bin[1], bwd_end_bin[1] - bwd_start_bin[1] + 1 ); /* WB: 4.5-7.5kHz (2 bins) */ + maximum( spect_bin + bwd_start_bin[1], bwd_end_bin[1] - bwd_start_bin[1] + 1, &max_WB ); + + if ( st->input_Fs == 16000 ) + { + /* for 16kHz sampled inputs, do not check SWB & FB */ + mean_SWB = 0.0f; + max_SWB = 0.0f; + mean_FB = 0.0f; + max_FB = 0.0f; + } + else if ( st->input_Fs == 32000 ) + { + mean_SWB = mean( spect_bin + bwd_start_bin[2], bwd_end_bin[2] - bwd_start_bin[2] + 1 ); /* SWB: 9.0-15.0kHz (4 bins) */ + maximum( spect_bin + bwd_start_bin[2], bwd_end_bin[2] - bwd_start_bin[2] + 1, &max_SWB ); + + /* for 32kHz sampled inputs, do not check FB */ + mean_FB = 0.0f; + max_FB = 0.0f; + } + else + { + mean_SWB = mean( spect_bin + bwd_start_bin[2], bwd_end_bin[2] - bwd_start_bin[2] + 1 ); /* SWB: 9.0-15.0kHz (4 bins) */ + maximum( spect_bin + bwd_start_bin[2], bwd_end_bin[2] - bwd_start_bin[2] + 1, &max_SWB ); + mean_FB = mean( spect_bin + bwd_start_bin[3], bwd_end_bin[3] - bwd_start_bin[3] + 1 ); /* FB: 16.5-19.5kHz (2 bins) */ + maximum( spect_bin + bwd_start_bin[3], bwd_end_bin[3] - bwd_start_bin[3] + 1, &max_FB ); + } + } + + /*---------------------------------------------------------------------* + * update LT counters and energies + *---------------------------------------------------------------------*/ + + if ( st->localVAD || st->lp_noise > 30 ) + { + st->lt_mean_NB = ALPHA_BWD * st->lt_mean_NB + ( 1 - ALPHA_BWD ) * mean_NB; + st->lt_mean_WB = ALPHA_BWD * st->lt_mean_WB + ( 1 - ALPHA_BWD ) * mean_WB; + st->lt_mean_SWB = ALPHA_BWD * st->lt_mean_SWB + ( 1 - ALPHA_BWD ) * mean_SWB; + + if ( enerBuffer != NULL ) + { + if ( 0.9f * max_WB > BWD_LT_THRESH * st->lt_mean_NB ) + { + if ( 2.5f * max_WB > max_NB ) + { + st->count_WB++; + } + } + else + { + if ( 3.5f * mean_WB < mean_NB ) + { + st->count_WB--; + } + } + + if ( 0.83f * max_SWB > BWD_LT_THRESH * st->lt_mean_WB && max_WB > BWD_LT_THRESH * st->lt_mean_NB ) + { + if ( 2 * max_SWB > max_WB ) + { + st->count_SWB++; + } + } + else + { + if ( 3 * mean_SWB < mean_WB ) + { + st->count_SWB--; + } + } + + if ( max_FB > BWD_LT_THRESH * st->lt_mean_SWB && 0.83f * max_SWB > BWD_LT_THRESH * st->lt_mean_WB && max_WB > BWD_LT_THRESH * st->lt_mean_NB ) + { + if ( 3 * max_FB > max_SWB ) + { + st->count_FB++; + } + } + else + { + if ( 4.1f * mean_FB < mean_SWB ) + { + st->count_FB--; + } + } + } + else + { + if ( max_WB > BWD_LT_THRESH * st->lt_mean_NB ) + { + if ( 2 * max_WB > max_NB ) + { + st->count_WB++; + } + } + else + { + if ( 2.6f * mean_WB < mean_NB ) + { + st->count_WB--; + } + } + + if ( max_SWB > BWD_LT_THRESH * st->lt_mean_WB && max_WB > BWD_LT_THRESH * st->lt_mean_NB ) + { + if ( 2 * max_SWB > max_WB ) + { + st->count_SWB++; + } + } + else + { + if ( 3 * mean_SWB < mean_WB ) + { + st->count_SWB--; + } + } + + if ( max_FB > BWD_LT_THRESH * st->lt_mean_SWB && max_SWB > BWD_LT_THRESH * st->lt_mean_WB && max_WB > BWD_LT_THRESH * st->lt_mean_NB ) + { + if ( 2 * max_FB > max_SWB ) + { + st->count_FB++; + } + } + else + { + if ( 3 * mean_FB < mean_SWB ) + { + st->count_FB--; + } + } + } + + st->count_WB = min( st->count_WB, BWD_COUNT_MAX ); + st->count_SWB = min( st->count_SWB, BWD_COUNT_MAX ); + st->count_FB = min( st->count_FB, BWD_COUNT_MAX ); + st->count_WB = max( st->count_WB, 0 ); + st->count_SWB = max( st->count_SWB, 0 ); + st->count_FB = max( st->count_FB, 0 ); + + /*---------------------------------------------------------------------* + * check against thresholds + * detect a band-width change + *---------------------------------------------------------------------*/ + + /* switching to a higher BW */ + if ( st->last_input_bwidth == NB ) + { + if ( st->count_WB > bwd_count_wider_bw ) + { + st->input_bwidth = WB; + st->count_WB = BWD_COUNT_MAX; + + if ( st->count_SWB > bwd_count_wider_bw ) + { + st->input_bwidth = SWB; + st->count_SWB = BWD_COUNT_MAX; + + if ( st->count_FB > bwd_count_wider_bw ) + { + st->input_bwidth = FB; + st->count_FB = BWD_COUNT_MAX; + } + } + } + } + + if ( st->last_input_bwidth == WB && st->input_Fs > 16000 ) + { + if ( st->count_SWB > bwd_count_wider_bw ) + { + st->input_bwidth = SWB; + st->count_SWB = BWD_COUNT_MAX; + + if ( st->count_FB > bwd_count_wider_bw ) + { + st->input_bwidth = FB; + st->count_FB = BWD_COUNT_MAX; + } + } + } + + if ( st->last_input_bwidth == SWB && st->input_Fs > 32000 ) + { + if ( st->count_FB > bwd_count_wider_bw ) + { + st->input_bwidth = FB; + st->count_FB = BWD_COUNT_MAX; + } + } + + /* switching to a lower BW */ + if ( st->last_input_bwidth == FB ) + { + if ( st->count_FB < 10 ) + { + st->input_bwidth = SWB; + st->count_FB = 0; + } + if ( st->count_SWB < 10 ) + { + st->input_bwidth = WB; + st->count_SWB = 0; + st->count_FB = 0; + } + if ( st->count_WB < 10 ) + { + st->input_bwidth = NB; + st->count_WB = 0; + st->count_SWB = 0; + st->count_FB = 0; + } + } + + if ( st->last_input_bwidth == SWB ) + { + if ( st->count_SWB < 10 ) + { + st->input_bwidth = WB; + st->count_SWB = 0; + st->count_FB = 0; + } + if ( st->count_WB < 10 ) + { + st->input_bwidth = NB; + st->count_WB = 0; + st->count_SWB = 0; + st->count_FB = 0; + } + } + + if ( st->last_input_bwidth == WB ) + { + if ( st->count_WB < 10 ) + { + st->input_bwidth = NB; + st->count_WB = 0; + st->count_SWB = 0; + st->count_FB = 0; + } + } + } + } + + /* verify that maximum encoded bandwidth (specified on the command line) is not exceeded */ + if ( st->input_bwidth > st->max_bwidth ) + { + st->input_bwidth = st->max_bwidth; + } + + if ( st->element_mode == EVS_MONO ) + { + set_bw( -1, -1, st, st->codec_mode ); + } + + return; +} + +/*-------------------------------------------------------------------* + * set_bw() + * + * Set and limit the encoded bandwidth + *-------------------------------------------------------------------*/ + +void set_bw( + const int16_t element_mode, /* i : element mode */ + const int32_t element_brate, /* i : element bitrate */ + Encoder_State *st, /* i/o: Encoder State */ + const int16_t codec_mode /* i : codec mode */ +) +{ + /* initialization */ + st->bwidth = st->input_bwidth; + + if ( codec_mode == MODE1 ) + { + int32_t total_brate; + + st->bwidth = st->input_bwidth; + total_brate = st->total_brate; + + if ( element_mode > IVAS_SCE ) + { + if ( element_brate < MIN_BRATE_SWB_STEREO ) + { + st->bwidth = WB; + } + else + { + if ( st->idchan == 0 || element_mode == IVAS_CPE_MDCT ) + { + if ( element_brate >= MIN_BRATE_FB_STEREO ) + { + st->bwidth = min( st->bwidth, FB ); + } + else + { + st->bwidth = min( st->bwidth, SWB ); + } + st->bwidth = max( st->bwidth, WB ); + } + else + { + st->bwidth = WB; + } + } + } + else if ( element_mode == IVAS_SCE ) + { + if ( element_brate < MIN_BRATE_SWB_SCE || st->bwidth < WB ) + { + st->bwidth = WB; + } + else if ( st->bwidth > SWB && ( ( element_brate < MIN_BRATE_FB_STEREO && !st->is_ism_format ) || + ( element_brate < MIN_BRATE_FB_ISM && st->is_ism_format ) ) ) + { + st->bwidth = SWB; + } + else if ( element_brate > BWD_MAX_BRATE_WIDER_BW_ISM ) + { + st->bwidth = st->max_bwidth; + } + } + /* element_mode == EVS_MONO */ + else if ( total_brate <= ACELP_9k60 && st->bwidth > WB ) + { + st->bwidth = WB; + } + else if ( total_brate >= ACELP_13k20 && total_brate <= ACELP_16k40 && st->bwidth > SWB ) + { + st->bwidth = SWB; + } + else if ( total_brate >= ACELP_32k && st->bwidth < WB ) + { + st->bwidth = WB; + } + } + else if ( codec_mode == MODE2 ) + { + int16_t n, bits_frame_nominal, tmpBandwidthMin; + + bits_frame_nominal = (int16_t) ( st->total_brate / FRAMES_PER_SEC ); + for ( n = 0; n < FRAME_SIZE_NB; n++ ) + { + if ( FrameSizeConfig[n].frame_bits == bits_frame_nominal ) + { + break; + } + } + if ( n == FRAME_SIZE_NB ) + { + assert( !"Bitrate not supported: not part of EVS" ); + } + + tmpBandwidthMin = FrameSizeConfig[n].bandwidth_min; + + if ( st->rf_mode ) + { + tmpBandwidthMin = WB; + } + + st->bwidth = max( min( st->input_bwidth, FrameSizeConfig[n].bandwidth_max ), tmpBandwidthMin ); + } + + return; +} + +/*-------------------------------------------------------------------* + * set_bw_stereo() + * + * Set encoded bandwidth for stereo (CPE) channels + *-------------------------------------------------------------------*/ + +void set_bw_stereo( + CPE_ENC_HANDLE hCPE /* i/o: CPE encoder structures */ +) +{ + Encoder_State **sts = hCPE->hCoreCoder; + + if ( hCPE->element_brate > BWD_MAX_BRATE_WIDER_BW_MDCT ) + { + sts[0]->bwidth = sts[0]->max_bwidth; + sts[1]->bwidth = sts[1]->max_bwidth; + } + else if ( hCPE->element_mode == IVAS_CPE_MDCT ) + { + /* ensure that both CPE channels have the same audio band-width */ + if ( sts[0]->input_bwidth == sts[1]->input_bwidth ) + { + sts[0]->bwidth = sts[0]->input_bwidth; + sts[1]->bwidth = sts[0]->input_bwidth; + } + else + { + sts[0]->bwidth = max( sts[0]->input_bwidth, sts[1]->input_bwidth ); + sts[1]->bwidth = max( sts[0]->input_bwidth, sts[1]->input_bwidth ); + } + } + + sts[0]->bwidth = max( sts[0]->bwidth, WB ); + sts[1]->bwidth = max( sts[1]->bwidth, WB ); + + return; +} + +/*-------------------------------------------------------------------* + * set_bw_mct() + * + * Set encoded bandwidth for MCT + *-------------------------------------------------------------------*/ + +/*! r: flag indicating whether the coded BW has changed */ +int16_t set_bw_mct( + CPE_ENC_HANDLE hCPE[MCT_MAX_BLOCKS], /* i/o: CPE encoder structures */ + const int16_t nCPE /* i : number of CPEs */ +) +{ + Encoder_State *st; + int16_t ch, cpe_id; + int16_t mct_bwidth, last_mct_bwidth, bw_changed; + + mct_bwidth = WB; /* minimum coded audio band-width */ + last_mct_bwidth = hCPE[0]->hCoreCoder[0]->last_bwidth; /* supposes that LFE is not in the first channel */ + + for ( cpe_id = 0; cpe_id < nCPE; cpe_id++ ) + { + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + st = hCPE[cpe_id]->hCoreCoder[ch]; + if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) + { + continue; + } + + mct_bwidth = max( mct_bwidth, st->input_bwidth ); + } + } + + for ( cpe_id = 0; cpe_id < nCPE; cpe_id++ ) + { + if ( hCPE[cpe_id]->element_brate > BWD_MAX_BRATE_WIDER_BW_MDCT ) + { + mct_bwidth = max( mct_bwidth, hCPE[cpe_id]->hCoreCoder[0]->max_bwidth ); + } + } + + bw_changed = 0; + if ( mct_bwidth != last_mct_bwidth ) + { + bw_changed = 1; + + for ( cpe_id = 0; cpe_id < nCPE; cpe_id++ ) + { + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + st = hCPE[cpe_id]->hCoreCoder[ch]; + st->bwidth = mct_bwidth; + } + } + } + + return bw_changed; +} diff --git a/lib_enc/cng_enc.c b/lib_enc/cng_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..de5c00b71e83c63138cc88b20e690edd967e5e6d --- /dev/null +++ b/lib_enc/cng_enc.c @@ -0,0 +1,1160 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "rom_enc.h" +#include "rom_com.h" +#include "prot.h" +#include "wmc_auto.h" + +/*---------------------------------------------------------------------* + * Local constants + *---------------------------------------------------------------------*/ + +#define MAX_DELTA_CNG 1 +#define ENER_MID_DEAD_ZONE 0.01 /* dead-zone width around mid points between quantization levels */ + +/*---------------------------------------------------------------------* + * Local function prototypes + *---------------------------------------------------------------------*/ + +static int16_t shb_DTX( Encoder_State *st, const float *shb_speech, const float *syn_12k8_16k ); + +static void shb_CNG_encod( Encoder_State *st, const int16_t update ); + + +/*---------------------------------------------------------------------* + * CNG_enc() + * + * Confort noise generation for the coder + *---------------------------------------------------------------------*/ + +void CNG_enc( + Encoder_State *st, /* i/o: State structure */ + float Aq[], /* o : LP coefficients */ + const float *speech, /* i : pointer to current frame input speech buffer */ + float enr, /* i : residual energy from Levinson-Durbin */ + const float *lsp_mid, /* i : mid frame LSPs */ + float *lsp_new, /* i/o: current frame ISPs */ + float *lsf_new, /* i/o: current frame ISFs */ + int16_t *allow_cn_step, /* o : allow CN step */ + float *q_env, + int16_t *sid_bw ) +{ + int16_t enr_index, i; + float step, res[L_FRAME16k]; + int16_t maxl, num_bits; + int16_t j, k, ptr; + int16_t m1; + float weights; + float sp_enr; + int16_t m = 0; + float tmp[HO_HIST_SIZE * M]; + int16_t ll, s_ptr; + float att = 1.0f; + float lsf_tmp[M]; + float C[M]; + float max_val[2]; + int16_t max_idx[2]; + float ftmp; + float lsp_tmp[M]; + float dev; + float max_dev; + float dist; + int16_t max_idx1[2] = { 0, 0 }; + float fft_io[L_FRAME16k]; + float *ptR, *ptI; + float enr1 = 0; + float env[NUM_ENV_CNG]; + float min1; + int16_t min1_idx; + float d; + float res1[L_FRAME16k]; + float tmp_env[HO_HIST_SIZE * NUM_ENV_CNG]; + int16_t force_cn_step = 0; + + float st_lp_sp_enr; + + float lp_ener_thr_scale; + + BSTR_ENC_HANDLE hBstr = st->hBstr; + TD_CNG_ENC_HANDLE hTdCngEnc = st->hTdCngEnc; + DTX_ENC_HANDLE hDtxEnc = st->hDtxEnc; + + st_lp_sp_enr = hTdCngEnc->lp_sp_enr; + + lp_ener_thr_scale = 4.0f; + if ( st->element_mode != EVS_MONO ) + { + lp_ener_thr_scale = 3.5f; + } + + /* calculate input energy */ + sp_enr = (float) log10( sum2_f( speech, st->L_frame ) / st->L_frame + 0.1f ) / (float) log10( 2.0f ); + + if ( sp_enr < 0.0f ) + { + sp_enr = 0.0f; + } + + if ( hDtxEnc->first_CNG == 0 || hTdCngEnc->old_enr_index < 0 ) + { + hTdCngEnc->lp_sp_enr = sp_enr; + } + else + { + if ( st->last_core_brate > SID_2k40 && ( st->last_core == HQ_CORE || st->hTdCngEnc->burst_ho_cnt > 0 ) && hTdCngEnc->lp_sp_enr < 6.0f && ( sp_enr - hTdCngEnc->lp_sp_enr ) > 4.0f && sp_enr > 6.0f ) + { + hTdCngEnc->lp_sp_enr = sp_enr; + force_cn_step = 1; + } + else + { + hTdCngEnc->lp_sp_enr = 0.1f * sp_enr + 0.9f * hTdCngEnc->lp_sp_enr; + } + } + + /* update the pointer to circular buffer of old LSP vectors */ + if ( ++( hTdCngEnc->cng_hist_ptr ) == DTX_HIST_SIZE ) + { + hTdCngEnc->cng_hist_ptr = 0; + } + + /* update the circular buffer of old LSP vectors with the new LSP vector */ + mvr2r( lsp_new, &( hTdCngEnc->cng_lsp_hist[( hTdCngEnc->cng_hist_ptr ) * M] ), M ); + + /*-----------------------------------------------------------------* + * Find CNG spectral envelope + * Find LSP median + *-----------------------------------------------------------------*/ + + if ( ( st->core_brate == SID_2k40 || st->core_brate == SID_1k75 ) && hDtxEnc->cng_cnt >= ( hDtxEnc->cng_hist_size - 1 ) ) + { + set_f( max_val, 0.0f, 2 ); + set_s( max_idx, 0, 2 ); + + for ( i = 0; i < hDtxEnc->cng_hist_size; i++ ) + { + if ( st->L_frame == L_FRAME ) + { + lsp2lsf( &hTdCngEnc->cng_lsp_hist[i * M], lsf_tmp, M, INT_FS_12k8 ); + ftmp = 6400.0f / ( M + 1 ); + C[i] = ( 6400.0f - lsf_tmp[M - 1] - ftmp ) * ( 6400.0f - lsf_tmp[M - 1] - ftmp ); + } + else + { + lsp2lsf( &hTdCngEnc->cng_lsp_hist[i * M], lsf_tmp, M, INT_FS_16k ); + ftmp = 8000.0f / ( M + 1 ); + C[i] = ( 8000.0f - lsf_tmp[M - 1] - ftmp ) * ( 8000.0f - lsf_tmp[M - 1] - ftmp ); + } + + C[i] += ( lsf_tmp[0] - ftmp ) * ( lsf_tmp[0] - ftmp ); + + for ( j = 0; j < M - 1; j++ ) + { + C[i] += ( lsf_tmp[j + 1] - lsf_tmp[j] - ftmp ) * ( lsf_tmp[j + 1] - lsf_tmp[j] - ftmp ); + } + + C[i] *= 0.0588235f; /* 1/M+1 */ + + if ( C[i] > max_val[0] ) + { + max_val[1] = max_val[0]; + max_idx[1] = max_idx[0]; + max_val[0] = C[i]; + max_idx[0] = i; + } + else if ( C[i] > max_val[1] ) + { + max_val[1] = C[i]; + max_idx[1] = i; + } + } + + for ( i = 0; i < M; i++ ) + { + lsp_new[i] = 0.0f; + for ( j = 0; j < hDtxEnc->cng_hist_size; j++ ) + { + lsp_new[i] += hTdCngEnc->cng_lsp_hist[j * M + i]; + } + + lsp_new[i] -= ( hTdCngEnc->cng_lsp_hist[max_idx[0] * M + i] + hTdCngEnc->cng_lsp_hist[max_idx[1] * M + i] ); + lsp_new[i] /= (float) ( hDtxEnc->cng_hist_size - 2 ); + } + max_idx1[0] = max_idx[0]; + max_idx1[1] = max_idx[1]; + } + + /*-----------------------------------------------------------------* + * Quantize CNG spectral envelope (only in SID frame) + * Quantize the LSF vector + *-----------------------------------------------------------------*/ + + + *allow_cn_step = ( ( hDtxEnc->cng_cnt == 0 ) && + ( hTdCngEnc->lp_sp_enr > 6.0f ) && + ( ( st_lp_sp_enr + 4.0f ) < sp_enr ) && + ( hDtxEnc->first_CNG != 0 ) && + ( hTdCngEnc->old_enr_index >= 0 ) && + ( st->last_core_brate > SID_2k40 ) ) || + force_cn_step; + + /* Initialize the CNG spectral envelope in case of the very first CNG frame */ + if ( hDtxEnc->first_CNG == 0 ) + { + mvr2r( st->lsp_old, hDtxEnc->lspCNG, M ); + + /* Average the CNG spectral envelope in case of the very first CNG frame */ + if ( st->element_mode != EVS_MONO ) + { + for ( i = 0; i < M; i++ ) + { + lsp_new[i] = 0.5f * ( lsp_mid[i] + lsp_new[i] ); + } + } + } + + if ( st->core_brate == SID_2k40 || st->core_brate == SID_1k75 ) + { + /* LSF quantization */ + if ( st->Opt_AMR_WB ) + { + isf_enc_amr_wb( st, lsf_new, lsp_new, 0 ); + } + else + { + lsf_enc( st, lsf_new, lsp_new, 0, 0, 0, 0, NULL ); + } + + /* Reset CNG history if CNG frame length is changed */ + if ( st->bwidth == WB && hDtxEnc->first_CNG && st->L_frame != hDtxEnc->last_CNG_L_frame ) + { + hTdCngEnc->ho_hist_size = 0; + } + } + else + { + /* Use old LSP vector */ + mvr2r( st->lsp_old, lsp_new, M ); + mvr2r( st->lsf_old, lsf_new, M ); + } + + + /*---------------------------------------------------------------------* + * CNG spectral envelope update + * Find A(z) coefficients + *---------------------------------------------------------------------*/ + + if ( st->last_core_brate == FRAME_NO_DATA || st->last_core_brate == SID_1k75 || st->last_core_brate == SID_2k40 ) + { + /* Reset hangover counter if not first SID period */ + if ( st->core_brate > FRAME_NO_DATA ) + { + hTdCngEnc->num_ho = 0; + } + /* Update LSPs if last SID energy not outlier or insufficient number of hangover frames */ + if ( hTdCngEnc->num_ho < 3 || hTdCngEnc->Enew < 1.5f * hTdCngEnc->lp_ener ) + { + for ( i = 0; i < M; i++ ) + { + /* AR low-pass filter */ + hDtxEnc->lspCNG[i] = CNG_ISF_FACT * hDtxEnc->lspCNG[i] + ( 1 - CNG_ISF_FACT ) * lsp_new[i]; + } + } + } + else + { + /* Update CNG_mode if allowed */ + if ( st->element_mode == EVS_MONO && ( st->Opt_AMR_WB || st->bwidth == WB ) && ( !hDtxEnc->first_CNG || hTdCngEnc->act_cnt2 >= MIN_ACT_CNG_UPD ) ) + { + if ( hDtxEnc->last_active_brate > ACELP_16k40 ) + { + hDtxEnc->CNG_mode = -1; + } + else + { + hDtxEnc->CNG_mode = get_cng_mode( hDtxEnc->last_active_brate ); + } + } + + /* If first SID after active burst update LSF history from circ buffer */ + hTdCngEnc->burst_ho_cnt = min( hTdCngEnc->burst_ho_cnt, hTdCngEnc->ho_circ_size ); + hTdCngEnc->act_cnt = 0; + s_ptr = hTdCngEnc->ho_circ_ptr - hTdCngEnc->burst_ho_cnt + 1; + if ( s_ptr < 0 ) + { + s_ptr += hTdCngEnc->ho_circ_size; + } + + for ( ll = hTdCngEnc->burst_ho_cnt; ll > 0; ll-- ) + { + if ( ++( hTdCngEnc->ho_hist_ptr ) == HO_HIST_SIZE ) + { + hTdCngEnc->ho_hist_ptr = 0; + } + /* Conversion between 12.8k and 16k LSPs */ + if ( st->L_frame == L_FRAME && hTdCngEnc->ho_16k_lsp[s_ptr] == 1 ) + { + /* Conversion from 16k LPSs to 12k8 */ + lsp_convert_poly( &( hTdCngEnc->ho_lsp_circ[s_ptr * M] ), st->L_frame, 0 ); + } + else if ( st->L_frame == L_FRAME16k && hTdCngEnc->ho_16k_lsp[s_ptr] == 0 ) + { + /* 16k LSPs already converted and stored, just copy to the other buffer */ + mvr2r( &( hTdCngEnc->ho_lsp_circ2[s_ptr * M] ), &( hTdCngEnc->ho_lsp_circ[s_ptr * M] ), M ); + } + + /* update circular buffers */ + mvr2r( &( hTdCngEnc->ho_lsp_circ[s_ptr * M] ), &( hTdCngEnc->ho_lsp_hist[hTdCngEnc->ho_hist_ptr * M] ), M ); + mvr2r( &( hTdCngEnc->ho_ener_circ[s_ptr] ), &( hTdCngEnc->ho_ener_hist[hTdCngEnc->ho_hist_ptr] ), 1 ); + hTdCngEnc->ho_sid_bw = ( hTdCngEnc->ho_sid_bw & 0x3fffffffL ) << 1; + mvr2r( &( hTdCngEnc->ho_env_circ[s_ptr * NUM_ENV_CNG] ), &( hTdCngEnc->ho_env_hist[hTdCngEnc->ho_hist_ptr * NUM_ENV_CNG] ), NUM_ENV_CNG ); + + hTdCngEnc->ho_hist_size++; + if ( hTdCngEnc->ho_hist_size > HO_HIST_SIZE ) + { + hTdCngEnc->ho_hist_size = HO_HIST_SIZE; + } + + s_ptr++; + + if ( s_ptr == hTdCngEnc->ho_circ_size ) + { + s_ptr = 0; + } + } + if ( st->hTdCngEnc->burst_ho_cnt > 0 ) + { + *allow_cn_step |= ( hDtxEnc->first_CNG || st->element_mode == EVS_MONO ) && ( hTdCngEnc->ho_ener_hist[hTdCngEnc->ho_hist_ptr] > lp_ener_thr_scale * hTdCngEnc->lp_ener ); + } + + if ( !*allow_cn_step && hTdCngEnc->ho_hist_size > 0 ) + { + ptr = hTdCngEnc->ho_hist_ptr; + mvr2r( &( hTdCngEnc->ho_lsp_hist[ptr * M] ), tmp, M ); + m1 = 0; + if ( ( hTdCngEnc->ho_sid_bw & 0x1L ) == 0 ) + { + mvr2r( &hTdCngEnc->ho_env_hist[ptr * NUM_ENV_CNG], tmp_env, NUM_ENV_CNG ); + m1 = 1; + } + enr = W_DTX_HO[0] * hTdCngEnc->ho_ener_hist[ptr]; + weights = W_DTX_HO[0]; + m = 1; + for ( k = 1; k < hTdCngEnc->ho_hist_size; k++ ) + { + ptr--; + if ( ptr < 0 ) + { + ptr = HO_HIST_SIZE - 1; + } + + if ( hTdCngEnc->ho_ener_hist[ptr] < hTdCngEnc->ho_ener_hist[hTdCngEnc->ho_hist_ptr] * BUF_H_NRG && + hTdCngEnc->ho_ener_hist[ptr] > hTdCngEnc->ho_ener_hist[hTdCngEnc->ho_hist_ptr] * BUF_L_NRG ) + { + enr += W_DTX_HO[k] * hTdCngEnc->ho_ener_hist[ptr]; + weights += W_DTX_HO[k]; + mvr2r( &hTdCngEnc->ho_lsp_hist[ptr * M], &tmp[m * M], M ); + if ( ( hTdCngEnc->ho_sid_bw & ( 0x1L << k ) ) == 0 ) + { + mvr2r( &hTdCngEnc->ho_env_hist[ptr * NUM_ENV_CNG], &tmp_env[m1 * NUM_ENV_CNG], NUM_ENV_CNG ); + m1++; + } + m++; + } + } + + enr /= weights; + hTdCngEnc->lp_ener = enr; + + set_f( max_val, 0.0f, 2 ); + set_s( max_idx, 0, 2 ); + + for ( i = 0; i < m; i++ ) + { + if ( st->L_frame == L_FRAME ) + { + lsp2lsf( &tmp[i * M], lsf_tmp, M, INT_FS_12k8 ); + ftmp = 6400.0f / ( M + 1 ); + C[i] = ( 6400.0f - lsf_tmp[M - 1] - ftmp ) * ( 6400.0f - lsf_tmp[M - 1] - ftmp ); + } + else + { + lsp2lsf( &tmp[i * M], lsf_tmp, M, INT_FS_16k ); + ftmp = 8000.0f / ( M + 1 ); + C[i] = ( 8000.0f - lsf_tmp[M - 1] - ftmp ) * ( 8000.0f - lsf_tmp[M - 1] - ftmp ); + } + + C[i] += ( lsf_tmp[0] - ftmp ) * ( lsf_tmp[0] - ftmp ); + + for ( j = 0; j < M - 1; j++ ) + { + C[i] += ( lsf_tmp[j + 1] - lsf_tmp[j] - ftmp ) * ( lsf_tmp[j + 1] - lsf_tmp[j] - ftmp ); + } + + C[i] *= 0.0588235f; /* 1/M+1 */ + + if ( C[i] > max_val[0] ) + { + max_val[1] = max_val[0]; + max_idx[1] = max_idx[0]; + max_val[0] = C[i]; + max_idx[0] = i; + } + else if ( C[i] > max_val[1] ) + { + max_val[1] = C[i]; + max_idx[1] = i; + } + } + + if ( m == 1 ) + { + mvr2r( tmp, lsp_tmp, M ); + } + else if ( m < 4 ) + { + for ( i = 0; i < M; i++ ) + { + lsp_tmp[i] = 0.0f; + for ( j = 0; j < m; j++ ) + { + lsp_tmp[i] += tmp[j * M + i]; + } + + lsp_tmp[i] -= tmp[max_idx[0] * M + i]; + lsp_tmp[i] /= (float) ( m - 1 ); + } + } + else + { + for ( i = 0; i < M; i++ ) + { + lsp_tmp[i] = 0.0f; + for ( j = 0; j < m; j++ ) + { + lsp_tmp[i] += tmp[j * M + i]; + } + + lsp_tmp[i] -= ( tmp[max_idx[0] * M + i] + tmp[max_idx[1] * M + i] ); + lsp_tmp[i] /= (float) ( m - 2 ); + } + } + + dist = 0.0f; + max_dev = 0.0f; + for ( i = 0; i < M; i++ ) + { + dev = (float) fabs( lsp_tmp[i] - lsp_new[i] ); + dist += dev; + if ( dev > max_dev ) + { + max_dev = dev; + } + } + + if ( dist > 0.4f || max_dev > 0.1f ) + { + for ( i = 0; i < M; i++ ) + { + hDtxEnc->lspCNG[i] = lsp_tmp[i]; + } + } + else + { + for ( i = 0; i < M; i++ ) + { + /* AR low-pass filter */ + hDtxEnc->lspCNG[i] = 0.8f * lsp_tmp[i] + ( 1 - 0.8f ) * lsp_new[i]; + } + } + if ( m1 > 0 ) + { + for ( i = 0; i < NUM_ENV_CNG; i++ ) + { + env[i] = 0; + for ( j = 0; j < m1; j++ ) + { + env[i] += tmp_env[j * NUM_ENV_CNG + i]; + } + + env[i] /= (float) m1; + env[i] = env[i] - 2 * hTdCngEnc->lp_ener; + } + mvr2r( env, hTdCngEnc->lp_env, NUM_ENV_CNG ); + } + } + else + { + mvr2r( lsp_new, hDtxEnc->lspCNG, M ); /* use newly analyzed parameters */ + } + } + + if ( st->Opt_AMR_WB ) + { + isp2a( hDtxEnc->lspCNG, Aq, M ); + } + else + { + lsp2a_stab( hDtxEnc->lspCNG, Aq, M ); + } + + for ( i = 1; i < st->L_frame / L_SUBFR; i++ ) + { + mvr2r( Aq, &Aq[i * ( M + 1 )], M + 1 ); + } + + /*-----------------------------------------------------------------* + * Find residual signal + * Calculate residual signal energy per sample + *-----------------------------------------------------------------*/ + + /* calculate the residual signal */ + residu( Aq, M, speech, res, st->L_frame ); + + mvr2r( res, res1, st->L_frame ); + + if ( st->element_mode == IVAS_CPE_DFT || st->element_mode == IVAS_CPE_TD ) + { + att = powf( 10.0f, hTdCngEnc->CNG_att / 20.0f ); + v_multc( res1, att, res1, st->L_frame ); + } + else if ( st->bwidth != NB ) + { + if ( st->bwidth == WB && hDtxEnc->CNG_mode >= 0 ) + { + ftmp = HO_ATT[hDtxEnc->CNG_mode]; + } + else + { + ftmp = 0.6f; + } + + att = ftmp / 6.0f; + att = 1.0f / ( 1 + att * 8 ); + + if ( att < ftmp ) + { + att = ftmp; + } + + v_multc( res1, att, res1, st->L_frame ); + } + + /* calculate the spectrum of residual signal */ + mvr2r( res1, fft_io, st->L_frame ); + + if ( st->L_frame == L_FRAME16k ) + { + modify_Fs( fft_io, L_FRAME16k, 16000, fft_io, 12800, hTdCngEnc->exc_mem2, 0 ); + } + + fft_rel( fft_io, L_FFT, LOG2_L_FFT ); + ptR = &fft_io[1]; + ptI = &fft_io[L_FFT - 1]; + for ( i = 0; i < NUM_ENV_CNG; i++ ) + { + env[i] = 2.0f * ( *ptR * *ptR + *ptI * *ptI ) / L_FFT; + ptR++; + ptI--; + } + + mvr2r( env, &( hTdCngEnc->cng_res_env[( hTdCngEnc->cng_hist_ptr ) * NUM_ENV_CNG] ), NUM_ENV_CNG ); + /* calculate the residual signal energy */ + enr = dotp( res, res, st->L_frame ) / st->L_frame; + + /* convert log2 of residual signal energy */ + enr = (float) log10( enr + 0.1f ) / (float) log10( 2.0f ); + + /* update the circular buffer of old energies */ + hTdCngEnc->cng_ener_hist[hTdCngEnc->cng_hist_ptr] = enr; + + /*-----------------------------------------------------------------* + * Quantize residual signal energy (only in SID frame) + *-----------------------------------------------------------------*/ + + if ( st->core_brate == SID_2k40 || st->core_brate == SID_1k75 ) + { + if ( hDtxEnc->cng_cnt >= hDtxEnc->cng_hist_size - 1 ) + { + /* average the envelope except outliers */ + for ( i = 0; i < NUM_ENV_CNG; i++ ) + { + for ( j = 0; j < hDtxEnc->cng_hist_size; j++ ) + { + env[i] += hTdCngEnc->cng_res_env[j * NUM_ENV_CNG + i]; + } + + env[i] -= ( hTdCngEnc->cng_res_env[max_idx1[0] * NUM_ENV_CNG + i] + hTdCngEnc->cng_res_env[max_idx1[1] * NUM_ENV_CNG + i] ); + env[i] /= (float) ( hDtxEnc->cng_hist_size - 2 ); + } + /* compute average excitation energy */ + enr = 0; + weights = 0; + ptr = hTdCngEnc->cng_hist_ptr; + + for ( k = 0; k < hDtxEnc->cng_hist_size; k++ ) + { + enr += W_HIST[k] * hTdCngEnc->cng_ener_hist[ptr--]; + if ( ptr < 0 ) + { + ptr = DTX_HIST_SIZE - 1; + } + + weights += W_HIST[k]; + } + + /* normalize the average value */ + enr /= weights; + } + + if ( st->element_mode == IVAS_SCE || st->element_mode == IVAS_CPE_DFT ) + { + enr += hTdCngEnc->CNG_att * FAC_LOG2 / 10.0f; + } + else if ( st->bwidth != NB ) + { + if ( st->bwidth == WB ) + { + if ( hDtxEnc->CNG_mode >= 0 ) + { + /* Bitrate adapted attenuation */ + att = ENR_ATT[hDtxEnc->CNG_mode]; + } + else + { + /* Use least attenuation for higher bitrates */ + att = ENR_ATT[4]; + } + } + else + { + att = 1.5f; + } + enr -= att; + } + + /* intialize the energy quantization parameters */ + if ( !st->Opt_AMR_WB ) + { + step = STEP_SID; + maxl = 127; + num_bits = 7; + } + else + { + step = STEP_AMR_WB_SID; + maxl = 63; + num_bits = 6; + } + + /* calculate the energy quantization index */ + enr_index = (int16_t) ( ( enr + 2.0f ) * step ); + + /* limit the energy quantization index */ + if ( enr_index > maxl ) + { + enr_index = maxl; + } + + if ( enr_index < 0 ) + { + enr_index = 0; + } + + /* allow only slow energy increase */ + if ( hDtxEnc->first_CNG && enr_index > hTdCngEnc->old_enr_index + MAX_DELTA_CNG ) + { + if ( *allow_cn_step == 1 ) + { + enr_index = hTdCngEnc->old_enr_index + (int16_t) ( 0.85f * ( enr_index - hTdCngEnc->old_enr_index ) ); + } + else + { + enr_index = hTdCngEnc->old_enr_index + MAX_DELTA_CNG; + } + } + hTdCngEnc->old_enr_index = enr_index; + + push_indice( hBstr, IND_ENERGY, enr_index, num_bits ); + if ( enr_index == 0 ) + { + enr_index = -5; + } + /* find the quatized energy */ + hTdCngEnc->Enew = (float) enr_index / step - 2.0f; + hTdCngEnc->Enew = (float) ( pow( 2.0f, hTdCngEnc->Enew ) ); + if ( st->core_brate == SID_2k40 ) + { + enr1 = (float) log10( hTdCngEnc->Enew * st->L_frame + 0.1f ) / (float) log10( 2.0f ); + for ( i = 0; i < NUM_ENV_CNG; i++ ) + { + env[i] -= 2 * hTdCngEnc->Enew; + + if ( env[i] < 0.0f ) + { + env[i] = 0.1f; + } + + env[i] = (float) log10( env[i] + 0.1f ) / (float) log10( 2.0f ); + env[i] -= att; + + if ( env[i] < 0 ) + { + env[i] = 0; + } + + env[i] = enr1 - env[i]; + } + + /* codebook search */ + min1 = 9999.0f; + min1_idx = 0; + + for ( i = 0; i < 64; i++ ) + { + d = 0.0f; + for ( j = 0; j < NUM_ENV_CNG; j++ ) + { + d += ( env[j] - CNG_details_codebook[i][j] ) * ( env[j] - CNG_details_codebook[i][j] ); + } + + if ( d < min1 ) + { + min1 = d; + min1_idx = i; + } + } + push_indice( hBstr, IND_CNG_ENV1, min1_idx, 6 ); + /* get quantized res_env_details */ + for ( i = 0; i < NUM_ENV_CNG; i++ ) + { + q_env[i] = CNG_details_codebook[min1_idx][i]; + } + } + /* Update hangover memory during CNG */ + if ( !*allow_cn_step && ( hTdCngEnc->Enew < 1.5f * hTdCngEnc->lp_ener ) ) + { + /* update the pointer to circular buffer of old LSP vectors */ + if ( ++( hTdCngEnc->ho_hist_ptr ) == HO_HIST_SIZE ) + { + hTdCngEnc->ho_hist_ptr = 0; + } + + /* update the circular buffer of old LSP vectors with the new LSP vector */ + mvr2r( lsp_new, &( hTdCngEnc->ho_lsp_hist[( hTdCngEnc->ho_hist_ptr ) * M] ), M ); + + /* update the hangover energy buffer */ + hTdCngEnc->ho_ener_hist[hTdCngEnc->ho_hist_ptr] = hTdCngEnc->Enew; + if ( st->core_brate == SID_2k40 ) + { + for ( i = 0; i < NUM_ENV_CNG; i++ ) + { + /* get quantized envelope */ + env[i] = (float) ( pow( 2.0f, ( enr1 - q_env[i] ) ) + 2 * hTdCngEnc->Enew ); + } + mvr2r( env, &( hTdCngEnc->ho_env_hist[( hTdCngEnc->ho_hist_ptr ) * NUM_ENV_CNG] ), NUM_ENV_CNG ); + } + if ( ++( hTdCngEnc->ho_hist_size ) > HO_HIST_SIZE ) + { + hTdCngEnc->ho_hist_size = HO_HIST_SIZE; + } + } + } + + /* dithering bit for AMR-WB IO mode is always set to 0 */ + if ( st->core_brate == SID_1k75 ) + { + push_indice( hBstr, IND_DITHERING, 0, 1 ); + } + + if ( st->core_brate == SID_2k40 ) + { + push_indice( hBstr, IND_ACELP_16KHZ, st->L_frame == L_FRAME16k ? 1 : 0, 1 ); + + /* transmit ho_cnt for use at decoder side as CNG synthesis assistance */ + if ( hTdCngEnc->burst_ho_cnt > ( HO_HIST_SIZE - 1 ) ) + { + push_indice( hBstr, IND_CNG_HO, ( HO_HIST_SIZE - 1 ), 3 ); /* send max allowed value, limited to 7 */ + } + else + { + push_indice( hBstr, IND_CNG_HO, hTdCngEnc->burst_ho_cnt, 3 ); /* send actual value */ + } + hTdCngEnc->num_ho = m; + push_indice( hBstr, IND_SID_TYPE, 0, 1 ); + + if ( st->input_Fs < 32000 && st->element_mode != IVAS_CPE_DFT ) + { + push_indice( hBstr, IND_SID_BW, 0, 1 ); + *sid_bw = 0; + } + } + + /*-----------------------------------------------------------------* + * Updates + *-----------------------------------------------------------------*/ + + /* update the SID frames counter */ + if ( st->core_brate == SID_2k40 || st->core_brate == SID_1k75 ) + { + hDtxEnc->cng_cnt = 0; + /* update frame length memory */ + hDtxEnc->last_CNG_L_frame = st->L_frame; + hTdCngEnc->cng_hist_ptr = -1; + } + else + { + hDtxEnc->cng_cnt++; + } + + return; +} + + +/*---------------------------------------------------------------------* + * swb_CNG_enc() + * + * SWB DTX/CNG encoding + *---------------------------------------------------------------------*/ + +void swb_CNG_enc( + Encoder_State *st, /* i/o: State structure */ + const float *shb_speech, /* i : SHB target signal (6-14kHz) at 16kHz */ + const float *syn_12k8_16k /* i : ACELP core synthesis at 12.8kHz or 16kHz */ +) +{ + int16_t shb_SID_updt; + + if ( st->core_brate == SID_2k40 || st->core_brate == FRAME_NO_DATA ) + { + if ( st->cng_type == LP_CNG ) + { + if ( st->input_Fs >= L_FRAME32k * FRAMES_PER_SEC ) + { + /* decide if SHB SID encoding or not */ + shb_SID_updt = shb_DTX( st, shb_speech, syn_12k8_16k ); + + /* SHB CNG encoding */ + shb_CNG_encod( st, shb_SID_updt ); + } + else if ( st->element_mode == IVAS_CPE_DFT && st->core_brate == SID_2k40 ) + { + /* LF-boost not used in DFT-stereo, instead the bandwidth is transmitted */ + delete_indice( st->hBstr, IND_CNG_ENV1 ); + push_indice( st->hBstr, IND_BWIDTH, st->bwidth, 2 ); + push_indice( st->hBstr, IND_UNUSED, 0, 4 ); + push_indice( st->hBstr, IND_SID_BW, 1, 1 ); + } + } + st->hTdCngEnc->last_vad = 0; + } + else + { + st->hTdCngEnc->last_vad = 1; + } + + return; +} + +/*---------------------------------------------------------------------* + * shb_CNG_encod() + * + * SID parameters encoding for SHB signal + *---------------------------------------------------------------------*/ + +static void shb_CNG_encod( + Encoder_State *st, /* i/o: State structure */ + const int16_t update /* i : SID update flag */ +) +{ + int16_t idx_ener = 0; + BSTR_ENC_HANDLE hBstr = st->hBstr; + float ener_mid_dec_thr; + + if ( update == 1 ) + { + /* SHB energy quantization */ + if ( st->element_mode == EVS_MONO ) + { + idx_ener = (int16_t) ( 0.9f * ( 0.1f * st->hTdCngEnc->mov_shb_cng_ener / (float) log10( 2.0f ) + 6.0f ) + 0.5f ); + } + else + { + idx_ener = (int16_t) ( 0.7f * ( 0.1f * st->hTdCngEnc->mov_shb_cng_ener / (float) log10( 2.0f ) + 6.0f ) + 0.5f ); + } + + if ( st->bwidth < SWB ) + { + idx_ener = 0; + } + + if ( idx_ener > 15 ) + { + idx_ener = 15; + } + else if ( idx_ener < 0 ) + { + idx_ener = 0; + } + + /* prevent toggling of idx_ener by adding small dead-zone interval around decision thresholds */ + if ( st->element_mode != EVS_MONO ) + { + if ( abs( idx_ener - st->hTdCngEnc->last_idx_ener ) == 1 ) + { + ener_mid_dec_thr = 0.5f * ( ( st->hTdCngEnc->last_idx_ener / 0.7f - 6.0f ) / 0.1f ) * (float) log10( 2.0f ); + ener_mid_dec_thr += 0.5f * ( ( idx_ener / 0.7f - 6.0f ) / 0.1f ) * (float) log10( 2.0f ); + + if ( fabs( st->hTdCngEnc->mov_shb_cng_ener - ener_mid_dec_thr ) / ener_mid_dec_thr < ENER_MID_DEAD_ZONE ) + { + idx_ener = st->hTdCngEnc->last_idx_ener; + } + } + } + + st->hTdCngEnc->last_idx_ener = idx_ener; + + push_indice( hBstr, IND_SHB_CNG_GAIN, idx_ener, 4 ); + push_indice( hBstr, IND_SID_BW, 1, 1 ); + delete_indice( hBstr, IND_CNG_ENV1 ); + if ( st->element_mode == IVAS_CPE_DFT ) + { + push_indice( st->hBstr, IND_BWIDTH, st->bwidth, 2 ); + } + else + { + push_indice( hBstr, IND_UNUSED, 0, 2 ); + } + st->hTdCngEnc->ho_sid_bw = ( st->hTdCngEnc->ho_sid_bw & 0x3fffffffL ) << 1; + st->hTdCngEnc->ho_sid_bw |= 0x1L; + } + else if ( st->core_brate == SID_2k40 ) + { + st->hTdCngEnc->ho_sid_bw = ( st->hTdCngEnc->ho_sid_bw & 0x3fffffffL ) << 1; + push_indice( hBstr, IND_SID_BW, 0, 1 ); + } + + return; +} + + +/*---------------------------------------------------------------------* + * shb_DTX() + * + * Decide if encoding SHB SID or not + *---------------------------------------------------------------------*/ + +static int16_t shb_DTX( + Encoder_State *st, /* i/o: State structure */ + const float *shb_speech, /* i : SHB target signal (6-14kHz) at 16kHz */ + const float *syn_12k8_16k /* i : ACELP core synthesis at 12.8kHz or 16kHz */ +) +{ + int16_t i; + int16_t update; + float shb_old_speech[( L_LOOK_12k8 + L_SUBFR + L_FRAME ) * 5 / 4]; + float *shb_new_speech; + float wb_ener; + float shb_ener; + float log_wb_ener; + float log_shb_ener; + float ftmp; + int16_t allow_cn_step = 0; + float att; + + TD_CNG_ENC_HANDLE hTdCngEnc = st->hTdCngEnc; + + shb_new_speech = shb_old_speech + ( L_LOOK_12k8 + L_SUBFR ) * 5 / 4; + mvr2r( st->hBWE_TD->old_speech_shb, shb_old_speech, ( L_LOOK_12k8 + L_SUBFR ) * 5 / 4 ); + mvr2r( shb_speech, shb_new_speech, L_FRAME16k ); + mvr2r( shb_old_speech + L_FRAME16k, st->hBWE_TD->old_speech_shb, ( L_LOOK_12k8 + L_SUBFR ) * 5 / 4 ); + + shb_ener = FLT_MIN * L_FRAME16k; + for ( i = 0; i < L_FRAME16k; i++ ) + { + shb_ener += shb_old_speech[i] * shb_old_speech[i]; + } + shb_ener /= L_FRAME16k; + + wb_ener = sum2_f( syn_12k8_16k, st->L_frame ) + 0.001f; + wb_ener = wb_ener / st->L_frame; + + log_wb_ener = 10 * (float) log10( wb_ener ); + if ( st->element_mode == IVAS_SCE || st->element_mode == IVAS_CPE_DFT ) + { + att = 0.0f; + + apply_scale( &att, st->hFdCngEnc->hFdCngCom->CngBandwidth, st->hFdCngEnc->hFdCngCom->CngBitrate, scaleTableStereo, SIZE_SCALE_TABLE_STEREO ); + } + else + { + att = -6.5f; + } + log_shb_ener = 10 * (float) log10( shb_ener ) + att; + + if ( st->hDtxEnc->first_CNG == 0 ) + { + hTdCngEnc->mov_wb_cng_ener = log_wb_ener; + hTdCngEnc->mov_shb_cng_ener = log_shb_ener; + hTdCngEnc->last_wb_cng_ener = log_wb_ener; + hTdCngEnc->last_shb_cng_ener = log_shb_ener; + } + if ( fabs( log_wb_ener - hTdCngEnc->mov_wb_cng_ener ) > 12.0f ) + { + allow_cn_step = 1; + } + + /* Also allow step if shb energy has dropped 12 dB */ + if ( ( st->element_mode == IVAS_CPE_DFT || st->element_mode == IVAS_CPE_TD ) && ( ( hTdCngEnc->mov_shb_cng_ener - log_shb_ener ) > 12.0f ) ) + { + allow_cn_step = 1; + } + + if ( allow_cn_step == 1 ) + { + hTdCngEnc->mov_wb_cng_ener = log_wb_ener; + hTdCngEnc->mov_shb_cng_ener = log_shb_ener; + } + else + { + ftmp = log_wb_ener - hTdCngEnc->mov_wb_cng_ener; + + hTdCngEnc->mov_wb_cng_ener += 0.9f * ftmp; + + ftmp = log_shb_ener - hTdCngEnc->mov_shb_cng_ener; + + hTdCngEnc->mov_shb_cng_ener += 0.25f * ftmp; + } + hTdCngEnc->shb_NO_DATA_cnt++; + + update = 0; + if ( st->core_brate == SID_2k40 ) + { + if ( st->hDtxEnc->first_CNG == 0 ) + { + update = 1; + } + else if ( hTdCngEnc->shb_cng_ini_cnt > 0 ) + { + hTdCngEnc->shb_cng_ini_cnt--; + update = 1; + } + else if ( hTdCngEnc->last_vad == 1 ) + { + update = 1; + } + else if ( hTdCngEnc->shb_NO_DATA_cnt >= 100 ) + { + update = 1; + } + else if ( fabs( ( hTdCngEnc->mov_wb_cng_ener - hTdCngEnc->mov_shb_cng_ener ) - ( hTdCngEnc->last_wb_cng_ener - hTdCngEnc->last_shb_cng_ener ) ) > 3.0f ) + { + update = 1; + } + else if ( ( st->bwidth >= SWB && hTdCngEnc->last_SID_bwidth < SWB ) || ( st->bwidth < SWB && hTdCngEnc->last_SID_bwidth >= SWB ) ) + { + update = 1; + } + + hTdCngEnc->last_SID_bwidth = st->bwidth; + } + + /* LF-boost not yet implemented in decoder which means that the specific wb_sid information is not used */ + if ( ( st->element_mode == IVAS_CPE_DFT || st->element_mode == IVAS_CPE_TD ) && st->core_brate == SID_2k40 ) + { + update = 1; + } + + if ( update == 1 ) + { + hTdCngEnc->last_wb_cng_ener = hTdCngEnc->mov_wb_cng_ener; + hTdCngEnc->last_shb_cng_ener = hTdCngEnc->mov_shb_cng_ener; + hTdCngEnc->shb_NO_DATA_cnt = 0; + } + + return ( update ); +} + + +/*---------------------------------------------------------------------* + * calculate_hangover_attenuation_gain() + * + * + *---------------------------------------------------------------------*/ + +void calculate_hangover_attenuation_gain( + Encoder_State *st, /* i : encoder state structure */ + float *att, /* o : attenuation factor */ + const int16_t vad_hover_flag /* i : VAD hangover flag */ +) +{ + float lim; + + *att = 1.0f; + if ( st->hTdCngEnc != NULL && vad_hover_flag && st->hTdCngEnc->burst_ho_cnt > 0 && ( st->bwidth != NB || st->element_mode > EVS_MONO ) ) + { + if ( st->element_mode == IVAS_CPE_DFT || st->element_mode == IVAS_CPE_TD ) + { + *att = powf( 10.0f, ( st->hTdCngEnc->CNG_att / 160.0f ) * st->hTdCngEnc->burst_ho_cnt ); + } + else + { + if ( st->bwidth == WB && st->hDtxEnc->CNG_mode >= 0 ) + { + lim = HO_ATT[st->hDtxEnc->CNG_mode]; + } + else + { + lim = 0.6f; + } + + *att = lim / 6.0f; + *att = 1.0f / ( 1 + *att * st->hTdCngEnc->burst_ho_cnt ); + + if ( *att < lim ) + { + *att = lim; + } + } + } + + return; +} diff --git a/lib_enc/cod2t32.c b/lib_enc/cod2t32.c new file mode 100644 index 0000000000000000000000000000000000000000..38d0628539c8ee28bce1f9c85a28088862c4d0c2 --- /dev/null +++ b/lib_enc/cod2t32.c @@ -0,0 +1,345 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "prot.h" +#include "wmc_auto.h" + +/*---------------------------------------------------------------------* + * Local constants + *---------------------------------------------------------------------*/ + +#define STEP 2 +#define MSIZE 1024 + + +/*---------------------------------------------------------------------------------- + * Function acelp_2t32() + * + * 12 bits algebraic codebook. + * 2 tracks x 32 positions per track = 64 samples. + * + * 12 bits --> 2 pulses in a frame of 64 samples. + * + * All pulses can have two (2) possible amplitudes: +1 or -1. + * Each pulse can have 32 possible positions. + *----------------------------------------------------------------------------------*/ + +void acelp_2t32( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const float dn[], /* i : corr. between target and h[]. */ + const float h[], /* i : impulse response of weighted synthesis filter */ + float code[], /* o : algebraic (fixed) codebook excitation */ + float y[] /* o : filtered fixed codebook excitation */ +) +{ + int16_t i, j, k, i0, i1, ix, iy, pos, pos2, index; + float psk, ps1, ps2, alpk, alp1, alp2, sq; + float pol[L_SUBFR], dn_p[L_SUBFR], r0; + int16_t ii, jj; + float s, cor, sign0, sign1; + float *p0, *p1, *p2; + const float *ptr_h1, *ptr_h2, *ptr_hf; + float rrixix[NB_TRACK_FCB_2T][NB_POS_FCB_2T]; + float rrixiy[MSIZE]; + + + /*----------------------------------------------------------------* + * Compute rrixix[][] needed for the codebook search. + *----------------------------------------------------------------*/ + + /* Init pointers to last position of rrixix[] */ + p0 = &rrixix[0][NB_POS_FCB_2T - 1]; + p1 = &rrixix[1][NB_POS_FCB_2T - 1]; + + ptr_h1 = h; + cor = 0.0f; + for ( i = 0; i < NB_POS_FCB_2T; i++ ) + { + cor += *ptr_h1 * *ptr_h1; + ptr_h1++; + *p1-- = cor; + cor += *ptr_h1 * *ptr_h1; + ptr_h1++; + *p0-- = cor; + } + + p0 = rrixix[0]; + p1 = rrixix[1]; + + for ( i = 0; i < NB_POS_FCB_2T; i++ ) + { + *p0 = 0.5f * ( *p0 ); + p0++; + *p1 = 0.5f * ( *p1 ); + p1++; + } + + /*------------------------------------------------------------* + * Compute rrixiy[][] needed for the codebook search. + *------------------------------------------------------------*/ + + pos = MSIZE - 1; + pos2 = MSIZE - 2; + ptr_hf = h + 1; + + for ( k = 0; k < NB_POS_FCB_2T; k++ ) + { + /* Init pointers to last position of diagonals */ + p1 = &rrixiy[pos]; + p0 = &rrixiy[pos2]; + + cor = 0.0f; + ptr_h1 = h; + ptr_h2 = ptr_hf; + + for ( i = k + 1; i < NB_POS_FCB_2T; i++ ) + { + cor += *ptr_h1++ * *ptr_h2++; + *p1 = cor; + + cor += *ptr_h1++ * *ptr_h2++; + *p0 = cor; + + p1 -= ( NB_POS_FCB_2T + 1 ); + p0 -= ( NB_POS_FCB_2T + 1 ); + } + + cor += *ptr_h1++ * *ptr_h2; + *p1 = cor; + + pos -= NB_POS_FCB_2T; + pos2--; + ptr_hf += STEP; + } + + /*----------------------------------------------------------------* + * computing reference vector and pre-selection of polarities + *----------------------------------------------------------------*/ + + for ( i = 0; i < L_SUBFR; i++ ) + { + /* FIR high-pass filtering */ + if ( i == 0 ) + { + r0 = dn[i] - dn[i + 1] * 0.35f; + } + else if ( i == L_SUBFR - 1 ) + { + r0 = -dn[i - 1] * 0.35f + dn[i]; + } + else + { + r0 = -dn[i - 1] * 0.35f + dn[i] - dn[i + 1] * 0.35f; + } + + /* pre-selection of polarities */ + if ( r0 >= 0.0f ) + { + pol[i] = 1.0f; + } + else + { + pol[i] = -1.0f; + } + + /* including polarities into dn[] */ + dn_p[i] = dn[i] * pol[i]; + } + + /*----------------------------------------------------------------* + * compute denominator ( multiplied by polarity ) + *----------------------------------------------------------------*/ + + k = 0; + ii = 0; + for ( i = 0; i < NB_POS_FCB_2T; i++ ) + { + jj = 1; + for ( j = 0; j < NB_POS_FCB_2T; j++ ) + { + rrixiy[k + j] *= pol[ii] * pol[jj]; + jj += 2; + } + ii += 2; + k += NB_POS_FCB_2T; + } + + /*----------------------------------------------------------------* + * search 2 pulses + * All combinaisons are tested: + * 32 pos x 32 pos x 2 signs = 2048 tests + *----------------------------------------------------------------*/ + + p0 = rrixix[0]; + p1 = rrixix[1]; + p2 = rrixiy; + + psk = -1; + alpk = 1; + ix = 0; + iy = 1; + for ( i0 = 0; i0 < L_SUBFR; i0 += STEP ) + { + ps1 = dn_p[i0]; + alp1 = *p0++; + pos = -1; + for ( i1 = 1; i1 < L_SUBFR; i1 += STEP ) + { + ps2 = ps1 + dn_p[i1]; + alp2 = alp1 + *p1++ + *p2++; + sq = ps2 * ps2; + s = alpk * sq - psk * alp2; + if ( s > 0 ) + { + psk = sq; + alpk = alp2; + pos = i1; + } + } + p1 -= NB_POS_FCB_2T; + if ( pos >= 0 ) + { + ix = i0; + iy = pos; + } + } + + i0 = ix / STEP; + i1 = iy / STEP; + sign0 = pol[ix]; + sign1 = pol[iy]; + + + /*-------------------------------------------------------------------* + * Build the codeword, the filtered codeword and index of codevector. + *-------------------------------------------------------------------*/ + + set_f( code, 0.0f, L_SUBFR ); + + code[ix] = sign0; + code[iy] = sign1; + index = ( i0 << 6 ) + i1; + + if ( sign0 < 0.0f ) + { + index += 0x800; + } + + if ( sign1 < 0.0f ) + { + index += 0x20; + } + + set_f( y, 0.0f, L_SUBFR ); + for ( i = ix; i < L_SUBFR; i++ ) + { + y[i] = ( sign0 * h[i - ix] ); + } + + for ( i = iy; i < L_SUBFR; i++ ) + { + y[i] += ( sign1 * h[i - iy] ); + } + + /* write index to array of indices */ + push_indice( hBstr, IND_ALG_CDBK_2T32, index, 12 ); + + return; +} + +/*---------------------------------------------------------------------------------- + * acelp_1t64() + * + * 7 bits algebraic codebook. + * 1 track x 64 positions per track = 64 samples. + * + * The pulse can have 64 possible positions and two (2) possible amplitudes: +1 or -1. + *----------------------------------------------------------------------------------*/ + +void acelp_1t64( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const float dn[], /* i : corr. between target and h[]. */ + const float h[], /* i : impulse response of weighted synthesis filter */ + float code[], /* o : algebraic (fixed) codebook excitation */ + float y[], /* o : filtered fixed codebook excitation */ + const int16_t L_subfr /* i : subframe length */ +) +{ + int16_t i, pos, sgn, index; + float tmp; + + /*-------------------------------------------------------------------* + * Find position and sign of maximum impulse. + *-------------------------------------------------------------------*/ + + pos = emaximum( dn, L_subfr, &tmp ); + sgn = (int16_t) sign( dn[pos] ); + + /*-------------------------------------------------------------------* + * Build the codeword, the filtered codeword and index of codevector. + *-------------------------------------------------------------------*/ + + set_f( code, 0.0f, L_subfr ); + code[pos] = sgn; + + set_f( y, 0.0f, L_subfr ); + + for ( i = pos; i < L_subfr; i++ ) + { + y[i] = ( sgn * h[i - pos] ); + } + + index = pos; + + if ( sgn > 0 ) + { + index += L_subfr; + } + + if ( L_subfr == L_SUBFR ) + { + push_indice( hBstr, IND_ALG_CDBK_1T64, index, 7 ); + } + else /* L_subfr == L_SUBFR */ + { + push_indice( hBstr, IND_ALG_CDBK_1T64, index, 8 ); + } + + return; +} diff --git a/lib_enc/cod4t64.c b/lib_enc/cod4t64.c new file mode 100644 index 0000000000000000000000000000000000000000..8d851c47d9c5f402c3a2643183a39b2a8a7b6898 --- /dev/null +++ b/lib_enc/cod4t64.c @@ -0,0 +1,1017 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "rom_enc.h" +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*---------------------------------------------------------------------* + * Local function prototypes + *---------------------------------------------------------------------*/ + +static int16_t quant_1p_N1( const int16_t pos, const int16_t N ); +static int16_t quant_3p_3N1( const int16_t pos1, const int16_t pos2, const int16_t pos3, const int16_t N ); +static int32_t quant_4p_4N( const int16_t pos[], const int16_t N ); +static int32_t quant_5p_5N( const int16_t pos[], const int16_t N ); +static int32_t quant_6p_6N_2( const int16_t pos[], const int16_t N ); +static int16_t pre_process( const float v[], int16_t pos_vector[], int16_t pos_vector_num[], int16_t *pulse_pos_num ); +static int32_t fcb_encode_position( const int16_t pos_vector[], int16_t n, const int16_t pos_num, const int16_t flag ); +static int32_t fcb_encode_class( const int16_t buffer[], const int16_t pulse_num, const int16_t pos_num ); +static int32_t fcb_encode_PI( const float v[], const int16_t pulse_num ); + + +/*---------------------------------------------------------------------* + * ACELP_4t64() + * + * 20, 36, 44, 52, 64, 72, 88 bits algebraic codebook. + * 4 tracks x 16 positions per track = 64 samples. + * + * 20 bits --> 4 pulses in a frame of 64 samples. + * 36 bits --> 8 pulses in a frame of 64 samples. + * 44 bits 13 + 9 + 13 + 9 --> 10 pulses in a frame of 64 samples. + * 52 bits 13 + 13 + 13 + 13 --> 12 pulses in a frame of 64 samples. + * 64 bits 2 + 2 + 2 + 2 + 14 + 14 + 14 + 14 --> + * 16 pulses in a frame of 64 samples. + * 72 bits 10 + 2 + 10 + 2 + 10 + 14 + 10 + 14 --> + * 18 pulses in a frame of 64 samples. + * 88 bits 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 --> + * 24 pulses in a frame of 64 samples. + * All pulses can have two (2) possible amplitudes: +1 or -1. + * Each pulse can have sixteen (16) possible positions. + *---------------------------------------------------------------------*/ + +int16_t acelp_4t64( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + float dn[], /* i : corr. between target and h[]. */ + const float cn[], /* i : residual after long term prediction */ + const float H[], /* i : impulse response of weighted synthesis filter */ + float R[], /* i : autocorrelation values */ + const int16_t acelpautoc, /* i : autocorrealtion flag */ + float code[], /* o : algebraic (fixed) codebook excitation */ + float y[], /* o : filtered fixed codebook excitation */ + int16_t nbbits, /* i : number of bits per codebook */ + const int16_t cmpl_flag, /* i : coomplexity reduction flag */ + const int16_t Opt_AMR_WB /* i : flag indicating AMR-WB IO mode */ +) +{ + int16_t i, k, index, track; + int32_t L_index; + + int16_t ind[NPMAXPT * NB_TRACK_FCB_4T + 32]; + int16_t saved_bits = 0; + PulseConfig config; + int16_t wordcnt, bitcnt; + int16_t indexing_indices[6]; + + /*-----------------------------------------------------------------* + * Configuration + *-----------------------------------------------------------------*/ + + + switch ( nbbits ) + { + case 20: /* EVS/AMR-WB pulse indexing: 20 bits, 4 pulses, 4 tracks */ + config.nbiter = 4; /* 4x12x16=768 loop */ + config.alp = 2.0f; + config.nb_pulse = 4; + config.fixedpulses = 0; + config.nbpos[0] = 4; + config.nbpos[1] = 8; + break; + + case 28: /* EVS pulse indexing: 28 bits, 6 pulses, 4 tracks */ + config.nbiter = 4; /* 4x20x16=1280 loops */ + config.alp = 1.0f; /* coeff for sign setting */ + config.nb_pulse = 6; + config.fixedpulses = 0; + config.nbpos[0] = 6; + config.nbpos[1] = 6; + config.nbpos[2] = 8; + break; + + case 36: /* EVS/AMR-WB pulse indexing: 36 bits, 8 pulses, 4 tracks */ + config.nbiter = 4; /* 4x20x16=1280 loops */ + config.alp = 1.0f; /* coeff for sign setting */ + config.nb_pulse = 8; + config.fixedpulses = 2; + config.nbpos[0] = 4; + config.nbpos[1] = 8; + config.nbpos[2] = 8; + break; + + case 43: /* EVS pulse indexing: 43 bits, 10 pulses, 4 tracks */ + case 44: /* AMR-WB pulse indexing: 44 bits, 10 pulses, 4 tracks */ + config.nbiter = 4; /* 4x26x16=1664 loops */ + config.alp = 1.0f; + config.nb_pulse = 10; + config.fixedpulses = 2; + config.nbpos[0] = 4; + config.nbpos[1] = 6; + config.nbpos[2] = 8; + config.nbpos[3] = 8; + break; + + case 50: /* EVS pulse indexing: 50 bits, 12 pulses, 4 tracks */ + case 52: /* AMR-WB pulse indexing: 52 bits, 12 pulses, 4 tracks */ + config.nbiter = 4; /* 4x26x16=1664 loops */ + config.alp = 1.0f; + config.nb_pulse = 12; + config.fixedpulses = 4; + config.nbpos[0] = 4; + config.nbpos[1] = 6; + config.nbpos[2] = 8; + config.nbpos[3] = 8; + break; + + case 62: /* EVS pulse indexing: 62 bits, 16 pulses, 4 tracks */ + case 64: /* AMR-WB pulse indexing: 64 bits, 16 pulses, 4 tracks */ + config.nbiter = 3; /* 3x36x16=1728 loops */ + config.alp = 0.8F; + config.nb_pulse = 16; + config.fixedpulses = 4; + config.nbpos[0] = 4; + config.nbpos[1] = 4; + config.nbpos[2] = 6; + config.nbpos[3] = 6; + config.nbpos[4] = 8; + config.nbpos[5] = 8; + break; + + case 72: /* AMR-WB pulse indexing: 72 bits, 18 pulses, 4 tracks */ + config.nbiter = 3; /* 3x35x16=1680 loops */ + config.alp = 0.75F; + config.nb_pulse = 18; + config.fixedpulses = 4; + config.nbpos[0] = 2; + config.nbpos[1] = 3; + config.nbpos[2] = 4; + config.nbpos[3] = 5; + config.nbpos[4] = 6; + config.nbpos[5] = 7; + config.nbpos[6] = 8; + break; + + case 88: /* AMR-WB pulse indexing: 88 bits, 24 pulses, 4 tracks */ + config.nbiter = 2; /* 2x53x16=1696 loop */ + config.alp = 0.5f; + config.nb_pulse = 24; + config.fixedpulses = 4; + config.nbpos[0] = 2; + config.nbpos[1] = 2; + config.nbpos[2] = 3; + config.nbpos[3] = 4; + config.nbpos[4] = 5; + config.nbpos[5] = 6; + config.nbpos[6] = 7; + config.nbpos[7] = 8; + config.nbpos[8] = 8; + config.nbpos[9] = 8; + break; + + case 87: /* EVS pulse indexing: 87 bits, 26 pulses, 4 tracks */ + config.nbiter = 1; + config.alp = 0.5F; + config.nb_pulse = 26; + config.fixedpulses = 4; + config.nbpos[0] = 4; + config.nbpos[1] = 6; + config.nbpos[2] = 6; + config.nbpos[3] = 8; + config.nbpos[4] = 8; + config.nbpos[5] = 8; + config.nbpos[6] = 8; + config.nbpos[7] = 8; + config.nbpos[8] = 8; + config.nbpos[9] = 8; + config.nbpos[10] = 8; + break; + } + + /* reduce the number of iterations as a compromise between the performance and complexity */ + if ( cmpl_flag > 0 ) + { + config.nbiter = cmpl_flag; + } + + config.codetrackpos = TRACKPOS_FIXED_FIRST; + config.bits = nbbits; + + + /*-----------------------------------------------------------------* + * Search + *-----------------------------------------------------------------*/ + + if ( acelpautoc ) + { + E_ACELP_4tsearchx( dn, cn, R, code, &config, ind ); + + /* Generate weighted code */ + set_f( y, 0.0f, L_SUBFR ); + for ( i = 0; i < L_SUBFR; i++ ) + { + /* Code is sparse, so check which samples are non-zero */ + if ( code[i] != 0 ) + { + for ( k = 0; k < L_SUBFR - i; k++ ) + { + y[i + k] += code[i] * H[k]; + } + } + } + } + else + { + E_ACELP_4tsearch( dn, cn, H, code, &config, ind, y ); + } + + /*-----------------------------------------------------------------* + * Indexing + *-----------------------------------------------------------------*/ + + if ( !Opt_AMR_WB ) + { + /* EVS pulse indexing */ + + saved_bits = E_ACELP_indexing( code, config, NB_TRACK_FCB_4T, indexing_indices ); + + saved_bits = 0; + + wordcnt = nbbits >> 4; + bitcnt = nbbits & 15; + for ( i = 0; i < wordcnt; i++ ) + { + push_indice( hBstr, IND_ALG_CDBK_4T64, indexing_indices[i], 16 ); + } + if ( bitcnt ) + { + push_indice( hBstr, IND_ALG_CDBK_4T64, indexing_indices[i], bitcnt ); + } + } + else + { + /* AMR-WB pulse indexing */ + + if ( nbbits == 20 ) + { + for ( track = 0; track < NB_TRACK_FCB_4T; track++ ) + { + k = track * NPMAXPT; + index = quant_1p_N1( ind[k], 4 ); + push_indice( hBstr, IND_ALG_CDBK_4T64, index, 5 ); + } + } + else if ( nbbits == 36 ) + { + for ( track = 0; track < NB_TRACK_FCB_4T; track++ ) + { + k = track * NPMAXPT; + index = quant_2p_2N1( ind[k], ind[k + 1], 4 ); + push_indice( hBstr, IND_ALG_CDBK_4T64, index, 9 ); + } + } + else if ( nbbits == 44 ) + { + for ( track = 0; track < ( NB_TRACK_FCB_4T - 2 ); track++ ) + { + k = track * NPMAXPT; + index = quant_3p_3N1( ind[k], ind[k + 1], ind[k + 2], 4 ); + push_indice( hBstr, IND_ALG_CDBK_4T64, index, 13 ); + } + + for ( track = 2; track < NB_TRACK_FCB_4T; track++ ) + { + k = track * NPMAXPT; + index = quant_2p_2N1( ind[k], ind[k + 1], 4 ); + push_indice( hBstr, IND_ALG_CDBK_4T64, index, 9 ); + } + } + else if ( nbbits == 52 ) + { + for ( track = 0; track < NB_TRACK_FCB_4T; track++ ) + { + k = track * NPMAXPT; + index = quant_3p_3N1( ind[k], ind[k + 1], ind[k + 2], 4 ); + push_indice( hBstr, IND_ALG_CDBK_4T64, index, 13 ); + } + } + else if ( nbbits == 64 ) + { + for ( track = 0; track < NB_TRACK_FCB_4T; track++ ) + { + k = track * NPMAXPT; + L_index = quant_4p_4N( &ind[k], 4 ); + index = ( ( L_index >> 14 ) & 3 ); + push_indice( hBstr, IND_ALG_CDBK_4T64_1, index, 2 ); + } + + for ( track = 0; track < NB_TRACK_FCB_4T; track++ ) + { + k = track * NPMAXPT; + L_index = quant_4p_4N( &ind[k], 4 ); + index = ( L_index & 0x3FFF ); + push_indice( hBstr, IND_ALG_CDBK_4T64_2, index, 14 ); + } + } + else if ( nbbits == 72 ) + { + for ( track = 0; track < ( NB_TRACK_FCB_4T - 2 ); track++ ) + { + k = track * NPMAXPT; + L_index = quant_5p_5N( &ind[k], 4 ); + index = ( ( L_index >> 10 ) & 0x03FF ); + push_indice( hBstr, IND_ALG_CDBK_4T64_1, index, 10 ); + } + + for ( track = 2; track < NB_TRACK_FCB_4T; track++ ) + { + k = track * NPMAXPT; + L_index = quant_4p_4N( &ind[k], 4 ); + index = ( ( L_index >> 14 ) & 3 ); + push_indice( hBstr, IND_ALG_CDBK_4T64_1, index, 2 ); + } + + for ( track = 0; track < ( NB_TRACK_FCB_4T - 2 ); track++ ) + { + k = track * NPMAXPT; + L_index = quant_5p_5N( &ind[k], 4 ); + index = ( L_index & 0x03FF ); + push_indice( hBstr, IND_ALG_CDBK_4T64_2, index, 10 ); + } + + for ( track = 2; track < NB_TRACK_FCB_4T; track++ ) + { + k = track * NPMAXPT; + L_index = quant_4p_4N( &ind[k], 4 ); + index = ( L_index & 0x3FFF ); + push_indice( hBstr, IND_ALG_CDBK_4T64_2, index, 14 ); + } + } + else if ( nbbits == 88 ) + { + for ( track = 0; track < NB_TRACK_FCB_4T; track++ ) + { + k = track * NPMAXPT; + L_index = quant_6p_6N_2( &ind[k], 4 ); + index = ( ( L_index >> 11 ) & 0x07FF ); + push_indice( hBstr, IND_ALG_CDBK_4T64_1, index, 11 ); + } + + for ( track = 0; track < NB_TRACK_FCB_4T; track++ ) + { + k = track * NPMAXPT; + L_index = quant_6p_6N_2( &ind[k], 4 ); + index = ( L_index & 0x07FF ); + push_indice( hBstr, IND_ALG_CDBK_4T64_2, index, 11 ); + } + } + } + + return saved_bits; +} + + +/*---------------------------------------------------------------------* + * Quantization of 1 pulse with N+1 bits: * + *---------------------------------------------------------------------*/ + +/*! r: return N+1 bits */ +static int16_t quant_1p_N1( + const int16_t pos, /* i : position of the pulse */ + const int16_t N /* i : number of bits for position */ +) +{ + int16_t mask, index; + + mask = ( ( 1 << N ) - 1 ); + + index = ( pos & mask ); + + if ( ( pos & NB_POS_FCB_4T ) != 0 ) + { + index += 1 << N; + } + + return index; +} + + +/*---------------------------------------------------------------------* + * Quantization of 2 pulses with 2*N+1 bits: * + *---------------------------------------------------------------------*/ + +/*! r: return (2*N)+1 bits */ +int16_t quant_2p_2N1( + const int16_t pos1, /* i : position of the pulse 1 */ + const int16_t pos2, /* i : position of the pulse 2 */ + const int16_t N /* i : number of bits for position */ +) +{ + int16_t mask, index; + + mask = ( ( 1 << N ) - 1 ); + + /*-----------------------------------------------------------------* + * sign of 1st pulse == sign of 2nd pulse + *-----------------------------------------------------------------*/ + + if ( ( ( pos2 ^ pos1 ) & NB_POS_FCB_4T ) == 0 ) + { + if ( ( pos1 - pos2 ) <= 0 ) + { + index = ( ( pos1 & mask ) << N ) + ( pos2 & mask ); + } + else + { + index = ( ( pos2 & mask ) << N ) + ( pos1 & mask ); + } + if ( ( pos1 & NB_POS_FCB_4T ) != 0 ) + { + index += 1 << ( 2 * N ); + } + } + else + { + + /*-----------------------------------------------------------------* + * sign of 1st pulse != sign of 2nd pulse + *-----------------------------------------------------------------*/ + if ( ( ( pos1 & mask ) - ( pos2 & mask ) ) <= 0 ) + { + index = ( ( pos2 & mask ) << N ) + ( pos1 & mask ); + if ( ( pos2 & NB_POS_FCB_4T ) != 0 ) + { + index += 1 << ( 2 * N ); + } + } + else + { + index = ( ( pos1 & mask ) << N ) + ( pos2 & mask ); + if ( ( pos1 & NB_POS_FCB_4T ) != 0 ) + { + index += 1 << ( 2 * N ); + } + } + } + + return index; +} + +/*---------------------------------------------------------------------* + * Quantization of 3 pulses with 3*N+1 bits: * + *---------------------------------------------------------------------*/ + +/*! r: return (3*N)+1 bits */ +static int16_t quant_3p_3N1( + const int16_t pos1, /* i : position of the pulse 1 */ + const int16_t pos2, /* i : position of the pulse 2 */ + const int16_t pos3, /* i : position of the pulse 3 */ + const int16_t N /* i : number of bits for position */ +) +{ + int16_t index, nb_pos; + + nb_pos = ( 1 << ( N - 1 ) ); + + /* Quantization of 3 pulses with 3*N+1 bits */ + if ( ( ( pos1 ^ pos2 ) & nb_pos ) == 0 ) + { + index = quant_2p_2N1( pos1, pos2, ( N - 1 ) ); + index += ( pos1 & nb_pos ) << N; + index += quant_1p_N1( pos3, N ) << ( 2 * N ); + } + else if ( ( ( pos1 ^ pos3 ) & nb_pos ) == 0 ) + { + index = quant_2p_2N1( pos1, pos3, ( N - 1 ) ); + index += ( pos1 & nb_pos ) << N; + index += quant_1p_N1( pos2, N ) << ( 2 * N ); + } + else + { + index = quant_2p_2N1( pos2, pos3, ( N - 1 ) ); + index += ( pos2 & nb_pos ) << N; + index += quant_1p_N1( pos1, N ) << ( 2 * N ); + } + + return index; +} + +/*---------------------------------------------------------------------* + * Quantization of 4 pulses with 4*N+1 bits: * + *---------------------------------------------------------------------*/ + +/*! r: return (4*N)+1 bits */ +static int32_t quant_4p_4N1( + const int16_t pos1, /* i : position of the pulse 1 */ + const int16_t pos2, /* i : position of the pulse 2 */ + const int16_t pos3, /* i : position of the pulse 3 */ + const int16_t pos4, /* i : position of the pulse 4 */ + const int16_t N /* i : number of bits for position */ +) +{ + int32_t index, nb_pos; + + nb_pos = ( 1 << ( N - 1 ) ); + + /* Quantization of 4 pulses with 4*N+1 bits */ + if ( ( ( pos1 ^ pos2 ) & nb_pos ) == 0 ) + { + index = quant_2p_2N1( pos1, pos2, ( N - 1 ) ); + index += ( pos1 & nb_pos ) << N; + index += quant_2p_2N1( pos3, pos4, N ) << ( 2 * N ); + } + else if ( ( ( pos1 ^ pos3 ) & nb_pos ) == 0 ) + { + index = quant_2p_2N1( pos1, pos3, ( N - 1 ) ); + index += ( pos1 & nb_pos ) << N; + index += quant_2p_2N1( pos2, pos4, N ) << ( 2 * N ); + } + else + { + index = quant_2p_2N1( pos2, pos3, ( N - 1 ) ); + index += ( pos2 & nb_pos ) << N; + index += quant_2p_2N1( pos1, pos4, N ) << ( 2 * N ); + } + + return ( index ); +} + +/*---------------------------------------------------------------------* + * Quantization of 4 pulses with 4*N bits: * + *---------------------------------------------------------------------*/ + +/*! r: return 4*N bits */ +static int32_t quant_4p_4N( + const int16_t pos[], /* i : position of the pulse 1..4 */ + const int16_t N /* i : number of bits for position */ +) +{ + int16_t i, j, k, n_1; + int16_t posA[4], posB[4]; + int32_t nb_pos, index = 0; + + n_1 = N - 1; + nb_pos = ( 1 << n_1 ); + + i = 0; + j = 0; + for ( k = 0; k < 4; k++ ) + { + if ( ( pos[k] & nb_pos ) == 0 ) + { + posA[i++] = pos[k]; + } + else + { + posB[j++] = pos[k]; + } + } + + switch ( i ) + { + case 0: + index = 1 << ( ( 4 * N ) - 3 ); + index += quant_4p_4N1( posB[0], posB[1], posB[2], posB[3], n_1 ); + break; + case 1: + index = quant_1p_N1( posA[0], n_1 ) << ( ( 3 * n_1 ) + 1 ); + index += quant_3p_3N1( posB[0], posB[1], posB[2], n_1 ); + break; + case 2: + index = quant_2p_2N1( posA[0], posA[1], n_1 ) << ( ( 2 * n_1 ) + 1 ); + index += quant_2p_2N1( posB[0], posB[1], n_1 ); + break; + case 3: + index = quant_3p_3N1( posA[0], posA[1], posA[2], n_1 ) << N; + index += quant_1p_N1( posB[0], n_1 ); + break; + case 4: + index = quant_4p_4N1( posA[0], posA[1], posA[2], posA[3], n_1 ); + break; + } + index += ( i & 3 ) << ( ( 4 * N ) - 2 ); + + return ( index ); +} + +/*---------------------------------------------------------------------* + * Quantization of 5 pulses with 5*N bits: * + *---------------------------------------------------------------------*/ + +/*! r: return 5*N bits */ +static int32_t quant_5p_5N( + const int16_t pos[], /* i : position of the pulse 1..5 */ + const int16_t N /* i : number of bits for position */ +) +{ + int16_t i, j, k, n_1, nb_pos; + int16_t posA[5], posB[5]; + int32_t index = 0; + + n_1 = N - 1; + nb_pos = ( 1 << n_1 ); + + i = 0; + j = 0; + for ( k = 0; k < 5; k++ ) + { + if ( ( pos[k] & nb_pos ) == 0 ) + { + posA[i++] = pos[k]; + } + else + { + posB[j++] = pos[k]; + } + } + switch ( i ) + { + case 0: + index = 1 << ( ( 5 * N ) - 1 ); + index += quant_3p_3N1( posB[0], posB[1], posB[2], n_1 ) << ( ( 2 * N ) + 1 ); + index += quant_2p_2N1( posB[3], posB[4], N ); + break; + case 1: + index = 1 << ( ( 5 * N ) - 1 ); + index += quant_3p_3N1( posB[0], posB[1], posB[2], n_1 ) << ( ( 2 * N ) + 1 ); + index += quant_2p_2N1( posB[3], posA[0], N ); + break; + case 2: + index = 1 << ( ( 5 * N ) - 1 ); + index += quant_3p_3N1( posB[0], posB[1], posB[2], n_1 ) << ( ( 2 * N ) + 1 ); + index += quant_2p_2N1( posA[0], posA[1], N ); + break; + case 3: + index = quant_3p_3N1( posA[0], posA[1], posA[2], n_1 ) << ( ( 2 * N ) + 1 ); + index += quant_2p_2N1( posB[0], posB[1], N ); + break; + case 4: + index = quant_3p_3N1( posA[0], posA[1], posA[2], n_1 ) << ( ( 2 * N ) + 1 ); + index += quant_2p_2N1( posA[3], posB[0], N ); + break; + case 5: + index = quant_3p_3N1( posA[0], posA[1], posA[2], n_1 ) << ( ( 2 * N ) + 1 ); + index += quant_2p_2N1( posA[3], posA[4], N ); + break; + } + + return ( index ); +} + +/*---------------------------------------------------------------------* + * Quantization of 6 pulses with 6*N-2 bits: * + *---------------------------------------------------------------------*/ + +/*! r: return 6*N-2 bits */ +static int32_t quant_6p_6N_2( + const int16_t pos[], /* i : position of the pulse 1..6 */ + const int16_t N /* i : number of bits for position */ +) +{ + int16_t i, j, k, n_1; + int16_t posA[6], posB[6]; + int32_t nb_pos, index = 0; + + n_1 = N - 1; + nb_pos = 1 << n_1; + + i = 0; + j = 0; + for ( k = 0; k < 6; k++ ) + { + if ( ( pos[k] & nb_pos ) == 0 ) + { + posA[i++] = pos[k]; + } + else + { + posB[j++] = pos[k]; + } + } + switch ( i ) + { + case 0: + index = 1 << ( ( 6 * N ) - 5 ); + index += quant_5p_5N( posB, n_1 ) << N; + index += quant_1p_N1( posB[5], n_1 ); + break; + case 1: + index = 1 << ( ( 6 * N ) - 5 ); + index += quant_5p_5N( posB, n_1 ) << N; + index += quant_1p_N1( posA[0], n_1 ); + break; + case 2: + index = 1 << ( ( 6 * N ) - 5 ); + index += quant_4p_4N( posB, n_1 ) << ( ( 2 * n_1 ) + 1 ); + index += quant_2p_2N1( posA[0], posA[1], n_1 ); + break; + case 3: + index = quant_3p_3N1( posA[0], posA[1], posA[2], n_1 ) << ( ( 3 * n_1 ) + 1 ); + index += quant_3p_3N1( posB[0], posB[1], posB[2], n_1 ); + break; + case 4: + i = 2; + index = quant_4p_4N( posA, n_1 ) << ( ( 2 * n_1 ) + 1 ); + index += quant_2p_2N1( posB[0], posB[1], n_1 ); + break; + case 5: + i = 1; + index = quant_5p_5N( posA, n_1 ) << N; + index += quant_1p_N1( posB[0], n_1 ); + break; + case 6: + i = 0; + index = quant_5p_5N( posA, n_1 ) << N; + index += quant_1p_N1( posA[5], n_1 ); + break; + } + + index += ( i & 3 ) << ( ( 6 * N ) - 4 ); + + return ( index ); +} + +/*---------------------------------------------------------------------* + *order the pulse position * + *---------------------------------------------------------------------*/ + +/*! r: return sign value of pulse on a track */ +static int16_t pre_process( + const float v[], /* i : the pulse vector */ + int16_t pos_vector[], /* o : position of the pulse on a track */ + int16_t pos_vector_num[], /* o : the pulse number on the position which have pulse */ + int16_t *pulse_pos_num /* i : the number of position which have pulse */ +) +{ + int16_t j, k; + int16_t sign; + + sign = 0; + j = 0; + for ( k = 0; k < 64; k += 4 ) + { + if ( v[k] ) + { + pos_vector[j] = k >> 2; + pos_vector_num[j] = (int16_t) fabsf( v[k] ); + if ( v[k] > 0 ) + { + sign = sign << 1; + } + else + { + sign = ( sign << 1 ) + 1; + } + j++; + } + } + *pulse_pos_num = j; + + return sign; +} + +/*---------------------------------------------------------------------* + *encode the position * + *---------------------------------------------------------------------*/ + +/*! r: return index of the positions which have pulse */ +static int32_t fcb_encode_position( + const int16_t pos_vector[], /* i : position of the pulse on a track */ + int16_t n, + const int16_t pos_num, /* i : the number of position which have pulse */ + const int16_t flag ) +{ + int16_t i; + int32_t mmm1; + int16_t temp2; + + mmm1 = PI_select_table[n][pos_num] - 1; + temp2 = pos_num; + + if ( flag ) /* no decrease */ + { + for ( i = 0; i < pos_num; i++ ) + { + mmm1 -= PI_select_table[n - pos_vector[i] - 1][temp2--]; + } + } + else + { + for ( i = 0; i < pos_num; i++ ) + { + mmm1 -= PI_select_table[n - pos_vector[i] - 1][temp2--]; + n--; + } + } + + return mmm1; +} + +/*---------------------------------------------------------------------* + *encode class for 3p 4p 5p 6p/track * + *---------------------------------------------------------------------*/ + +/*! r: class index of the pulse on a track */ +static int32_t fcb_encode_cl( + const int16_t buffer[], /* i : pulses on a track */ + const int16_t pulse_num, /* i : pulses number on a track */ + const int16_t pos_num /* i : number of the position which have pulse */ +) +{ + int32_t k; + int16_t i, temp1, temp2; + + temp1 = pos_num + pulse_num - 1; + temp2 = pulse_num; + k = PI_select_table[temp1][pulse_num] - 1; + temp1--; + for ( i = 0; i < pulse_num; i++ ) + { + k -= PI_select_table[temp1 - buffer[i]][temp2--]; + temp1--; + } + + return k; +} + +/*---------------------------------------------------------------------* + *encode the class and compute class offset * + *---------------------------------------------------------------------*/ + +/*! r: class offset */ +static int32_t fcb_encode_class( + const int16_t sector_6p_num[], /* i : position which have pulse on a track */ + const int16_t pulse_num, /* i : pulse number on a track */ + const int16_t pulse_pos_num /* i : number of position which have pulse on a track */ +) +{ + int16_t i, j; + int32_t k, mn9_offet; + int16_t vector_class[6]; + int16_t *vector_class_ptr; + + mn9_offet = 0; + + if ( pulse_pos_num < pulse_num ) + { + vector_class_ptr = vector_class; + for ( i = 0; i < pulse_pos_num; i++ ) + { + for ( j = 0; j < ( sector_6p_num[i] - 1 ); j++ ) + { + *vector_class_ptr++ = i; + } + } + k = fcb_encode_cl( vector_class, pulse_num - pulse_pos_num, pulse_pos_num ); + mn9_offet = PI_factor[pulse_pos_num] * k; + } + + return mn9_offet; +} + + +/*---------------------------------------------------------------------* + *encode fcb pulse index * + *---------------------------------------------------------------------*/ + +/*! r: return index of the pulse on a track */ +static int32_t fcb_encode_PI( + const float v[], /* i : the pulse vector */ + const int16_t pulse_num /* i : number of the pulse on a track */ +) +{ + int16_t vector_p[7]; + int16_t pulse_pos_num; + int16_t vector_p_num[7]; + int32_t code_index; + int16_t sign; + + /*order the pulse position*/ + sign = pre_process( v, vector_p, vector_p_num, &pulse_pos_num ); + + /*encode the position*/ + code_index = fcb_encode_position( vector_p, 16, pulse_pos_num, 1 ); + + /*encode the class and compute class offset*/ + code_index += fcb_encode_class( vector_p_num, pulse_num, pulse_pos_num ); + + code_index = PI_offset[pulse_num][pulse_num + 1 - pulse_pos_num] + ( code_index << pulse_pos_num ) + sign; + + return code_index; +} + + +/*--------------------------------------------------------------------------* + * E_ACELP_code43bit + * + * Fixed bit-length arithmetic coding of pulses + * v - (input) pulse vector + * s - (output) encoded state + * n - (output) range of possible states (0...n-1) + * p - (output) number of pulses found + * len - (input) length of pulse vector + * trackstep - (input) step between tracks + *--------------------------------------------------------------------------*/ + +int16_t E_ACELP_code43bit( + const float code[], + uint32_t *ps, + int16_t *p, + uint16_t idxs[] ) +{ + int16_t j, k, track; + int16_t ind[32]; + int16_t tmp; + int32_t joint_index; + int32_t joint_offset = 3611648; /*offset for 3 pulses per track*/ + int16_t saved_bits = 0; + + for ( track = 0; track < 2; track++ ) + { + k = track * NPMAXPT; + ps[track] = fcb_encode_PI( code + track, 3 ); + p[track] = 3; + } + + for ( track = 2; track < NB_TRACK_FCB_4T; track++ ) + { + j = track * NPMAXPT; + for ( k = track; k < 64; k += 4 ) + { + if ( code[k] ) + { + tmp = k >> 2; + if ( code[k] < 0 ) + { + tmp += 16; + } + if ( fabs( code[k] ) > 1 ) + { + ind[j] = tmp; + ind[j + 1] = tmp; + break; + } + else + { + ind[j] = tmp; + j++; + } + } + } + k = track * NPMAXPT; + ps[track] = quant_2p_2N1( ind[k], ind[k + 1], 4 ); + p[track] = 2; + } + joint_index = ps[0] * 5472 + ps[1]; + if ( joint_index >= joint_offset ) + { + joint_index += joint_offset; + } + else + { + saved_bits += 1; + } + + idxs[0] = ( ( ps[2] << 9 ) + ps[3] ) & 0xffff; + idxs[1] = ( ( joint_index << 2 ) + ( ps[2] >> 7 ) ) & 0xffff; + idxs[2] = (uint16_t) ( joint_index >> 14 ); + + return saved_bits; +} diff --git a/lib_enc/cod4t64_fast.c b/lib_enc/cod4t64_fast.c new file mode 100644 index 0000000000000000000000000000000000000000..7594f23e4c2eb92e60d270852ae8e2e2c2364648 --- /dev/null +++ b/lib_enc/cod4t64_fast.c @@ -0,0 +1,751 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "ivas_prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * Local constants + *-------------------------------------------------------------------*/ + +#define BETA_BN1 2.0f +#define BETA_BN2 2.25f + +#define L_SUBFR_MAX 2 * L_SUBFR +#define MAX_NUM_INTER 5 +#define MAX_PULSES_STEREO 5 + +/*---------------------------------------------------------------------* + * Quantization of 1 pulse with N+1 bits: * + *---------------------------------------------------------------------*/ + +/*! r: return index (N+1 bits) */ +static int16_t quant_1p_N1_L_subfr( + const int16_t nb_pos, /* i : number of positions */ + const int16_t pos, /* i : position of the pulse */ + const int16_t N /* i : number of bits for position */ +) +{ + int16_t mask, index; + + mask = ( ( 1 << N ) - 1 ); + + index = ( pos & mask ); + + if ( ( pos & nb_pos ) != 0 ) + { + index += 1 << N; + } + + return index; +} + +/*-------------------------------------------------------------------* + * Function find_best_pulse() + * + * Find best pulse + *-------------------------------------------------------------------*/ + +static int16_t find_best_pulse( + const int16_t L_subfr, + const int16_t nb_tracks, + const int16_t track, + const float dn[], + const float sign[], + int16_t *s ) +{ + int16_t m, i; + float temp, max_val; + + max_val = FLT_MIN; + m = track; + for ( i = track; i < L_subfr; i += nb_tracks ) + { + temp = dn[i] * sign[i]; + + if ( temp >= max_val ) + { + max_val = temp; + m = i; + } + } + + *s = (int16_t) sign[m]; + + return m; +} + + +/*-------------------------------------------------------------------* + * Function acelp_fast() + * + * Fast algebraic codebook search. + * Supports 10, 15, 17, 20, 24, and 26 bits codebooks. + *-------------------------------------------------------------------*/ + +void acelp_fast( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const int16_t cdk_index, /* i : codebook index */ + const float dn_orig[L_SUBFR], /* i : corr. between target and h[]. */ + const float cn[L_SUBFR], /* i : residual after long term prediction */ + const float H[L_SUBFR], /* i : impulse response of weighted synthesis filter */ + float code[L_SUBFR], /* o : algebraic (fixed) codebook excitation */ + float y[], /* o : filtered fixed codebook excitation */ + const int16_t L_subfr /* i : subframe length */ +) +{ + int16_t i, j, q, bits, bits_track, nb_pos, nb_pulse, track, nb_iter, nb_tracks; + int16_t skip_track[MAX_NUM_INTER], skip_track_max; + PulseConfig config; + enum TRACKPOS codetrackpos; + int16_t m[MAX_PULSES_STEREO], s[MAX_PULSES_STEREO], m_max[MAX_PULSES_STEREO], s_max[MAX_PULSES_STEREO]; + int16_t track_order[NB_TRACK_FCB_4T * MAX_NUM_INTER], m0_track[NB_TRACK_FCB_4T]; + int16_t ind_stream[NPMAXPT * NB_TRACK_FCB_4T], idx; + float G, G1, G2, G3, Gn, Gd, dn[L_SUBFR_MAX]; + float tmpF, y_tmp[L_SUBFR_MAX]; + float crit_num, crit_den, crit_num_max, crit_den_max; + float h_buf[4 * L_SUBFR_MAX], *h, *h_inv, *p_hn, alp_buf[2 * L_SUBFR_MAX], *alp, *alp_pos0, *alp_pos1, *alp_pos2, *alp_pos3; + float dndn, cncn, s_coef, bn_orig[L_SUBFR_MAX], cncn_track[NB_TRACK_FCB_4T]; + float max_val, temp, sign[L_SUBFR_MAX], max_track[MAX_NUM_INTER]; + float beta1, beta2; + + /*-----------------------------------------------------------------* + * Initialization + *-----------------------------------------------------------------*/ + + nb_iter = NB_TRACK_FCB_4T; + nb_tracks = NB_TRACK_FCB_4T; + nb_pulse = 0; /* to avoid compilation warnings */ + + if ( L_subfr == L_SUBFR ) + { + config = PulseConfTable[cdk_index]; + bits = config.bits; + nb_pulse = config.nb_pulse; + codetrackpos = config.codetrackpos; + + if ( cdk_index == 2 ) + { + /* 12 bits, 2 pulses, 2 tracks: 11 (used all tracks) */ + nb_tracks = NB_TRACK_FCB_2T; + nb_iter = NB_TRACK_FCB_2T; + } + else if ( nb_pulse == 2 ) + { + /* 10 bits, 2 pulses, 4 tracks: 1010 (used only even tracks) */ + nb_iter = NB_TRACK_FCB_4T - 2; + } + else if ( nb_pulse == 3 ) + { + if ( codetrackpos == TRACKPOS_FIXED_FIRST ) + { + /* 15 bits, 3 pulses, 4 tracks: 1110 (fixed track to first) */ + nb_iter = NB_TRACK_FCB_4T - 1; + } + else if ( codetrackpos == TRACKPOS_FREE_THREE ) + { + /* 17 bits, 3 pulses, 4 tracks (used all tracks): 1110, 1101, 1011, 0111 */ + nb_iter = NB_TRACK_FCB_4T; + } + } + } + else /* L_subfr == 2*L_SUBFFR */ + { + bits = cdk_index; + codetrackpos = -1; /* to avoid compilation warnings */ + + if ( cdk_index == 14 ) + { + /* 14 bits, 2 pulses, 2 tracks: 11 (used all tracks) */ + nb_pulse = 2; + nb_iter = NB_TRACK_FCB_2T; + codetrackpos = TRACKPOS_FIXED_TWO; + nb_tracks = NB_TRACK_FCB_2T; + } + else if ( cdk_index == 12 ) + { + /* 12 bits, 2 pulses, 4 tracks: 1010 (used only even tracks) */ + nb_pulse = 2; + nb_iter = NB_TRACK_FCB_4T - 2; + codetrackpos = TRACKPOS_FIXED_EVEN; + } + else if ( cdk_index == 18 ) + { + /* 18 bits, 3 pulses, 4 tracks: 1110 (used first three tracks) */ + nb_pulse = 3; + nb_iter = NB_TRACK_FCB_4T - 1; + codetrackpos = TRACKPOS_FIXED_FIRST; + } + else if ( cdk_index == 20 ) + { + /* 20 bits, 3 pulses, 4 tracks (used all tracks): 1110, 1101, 1011, 0111 */ + nb_pulse = 3; + nb_iter = NB_TRACK_FCB_4T; + codetrackpos = TRACKPOS_FREE_THREE; + } + else if ( cdk_index == 24 ) + { + /* 24 bits, 4 pulses, 4 tracks: 1111 */ + nb_pulse = 4; + nb_iter = NB_TRACK_FCB_4T; + codetrackpos = TRACKPOS_FIXED_FIRST; + } + } + + beta1 = BETA_BN1; + beta2 = BETA_BN2; + + if ( cdk_index <= 2 ) + { + beta1 = BETA_BN1 * 2; + beta2 = BETA_BN2 * 2; + } + + /*-----------------------------------------------------------------* + * Find signal bn[] and sign pre-selection vector sign[]. + *-----------------------------------------------------------------*/ + + dndn = sum2_f( dn_orig, L_subfr ) + 0.01f; + + cncn = 0.1f; + for ( q = 0; q < nb_tracks; q++ ) + { + cncn_track[q] = 0.1f; + + for ( i = 0; i < L_subfr; i += nb_tracks ) + { + cncn_track[q] += ( cn[i + q] * cn[i + q] ); + } + cncn += cncn_track[q]; + } + + s_coef = sqrtf( dndn / cncn ); + + for ( i = 0; i < L_subfr; i++ ) + { + temp = ( s_coef * cn[i] ) + ( beta1 * dn_orig[i] ); + bn_orig[i] = temp; + + if ( temp >= 0 ) + { + sign[i] = 1.0f; + } + else + { + sign[i] = -1.0f; + } + } + + /*-----------------------------------------------------------------* + * Compute buffer h_buf[]. + *-----------------------------------------------------------------*/ + + h = h_buf; + h_inv = h_buf + ( 2 * L_subfr ); + + for ( i = 0; i < L_subfr; i++ ) + { + *h++ = 0.0f; + *h_inv++ = 0.0f; + } + + for ( i = 0; i < L_subfr; i++ ) + { + h[i] = H[i]; + h_inv[i] = -H[i]; + } + + /*-----------------------------------------------------------------* + * Approximate FI[i][j] by alp[abs(i-j)] and compute buffer alp_buf[]. + *-----------------------------------------------------------------*/ + + alp = alp_buf + L_subfr; + + for ( i = 0; i < L_subfr; i++ ) + { + *alp = 0.0f; + + for ( j = i; j < L_subfr; j++ ) + { + *alp += H[j] * H[j - i]; + } + alp_buf[L_subfr - i] = *alp++; + } + + alp = alp_buf + L_subfr; + + for ( q = 0; q < nb_tracks; q++ ) + { + max_track[q] = 0.0f; + + for ( i = q; i < L_subfr; i += nb_tracks ) + { + temp = bn_orig[i] * sign[i]; + + if ( temp >= max_track[q] ) + { + max_track[q] = temp; + m0_track[q] = i; + } + } + } + + /*-----------------------------------------------------------------* + * Track re-order + *-----------------------------------------------------------------*/ + + if ( nb_tracks == NB_TRACK_FCB_2T ) + { + track_order[0] = 0; + track_order[1] = 1; + track_order[2] = 1; + track_order[3] = 0; + } + else + { + /* skip certain tracks if number of pulses is lower than number of tracks */ + if ( nb_pulse == 2 && nb_tracks == NB_TRACK_FCB_4T ) + { + max_track[NB_TRACK_FCB_4T - 3] = -1; + max_track[NB_TRACK_FCB_4T - 1] = -1; + } + else if ( nb_pulse == 3 && codetrackpos == TRACKPOS_FIXED_FIRST ) + { + max_track[NB_TRACK_FCB_4T - 1] = -1; + } + + for ( q = 0; q < nb_tracks; q++ ) + { + i = maximum( max_track, nb_tracks, &tmpF ); + track_order[q] = i; + max_track[i] = -1.0f; + } + + track_order[4] = track_order[1]; + track_order[5] = track_order[0]; + track_order[6] = track_order[2]; + track_order[7] = track_order[3]; + + track_order[8] = track_order[2]; + track_order[9] = track_order[0]; + track_order[10] = track_order[1]; + track_order[11] = track_order[3]; + + track_order[12] = track_order[3]; + track_order[13] = track_order[0]; + track_order[14] = track_order[1]; + track_order[15] = track_order[2]; + + if ( cdk_index == 3 ) + { + track_order[12] = track_order[2]; + track_order[13] = track_order[1]; + track_order[14] = track_order[0]; + + track_order[16] = track_order[1]; + track_order[17] = track_order[2]; + track_order[18] = track_order[0]; + nb_iter = 5; + } + else if ( cdk_index == 4 ) + { + track_order[16] = track_order[2]; + track_order[17] = track_order[3]; + track_order[18] = track_order[1]; + track_order[19] = track_order[0]; + nb_iter = 5; + } + } + + /*-----------------------------------------------------------------* + * Main searching loop + *-----------------------------------------------------------------*/ + + crit_num_max = -1.0f; + crit_den_max = 1.0f; + skip_track_max = -1; + + for ( q = 0; q < nb_iter; q++ ) + { + /*-----------------------------------------------------------------* + * First pulse search + *-----------------------------------------------------------------*/ + + track = track_order[q * nb_tracks]; + m[0] = m0_track[track]; + s[0] = (int16_t) sign[m[0]]; + + /*-----------------------------------------------------------------* + * Second pulse search + *-----------------------------------------------------------------*/ + + if ( nb_tracks == NB_TRACK_FCB_2T ) + { + Gn = s[0] * dn_orig[m[0]]; + Gd = alp[0]; + G = Gn / Gd; + G *= s[0]; + + track = track_order[q * nb_tracks + 1]; + alp_pos0 = alp - m[0] + track; + + for ( i = track; i < L_subfr; i += NB_TRACK_FCB_2T ) + { + dn[i] = dn_orig[i] - G * ( *alp_pos0 ); + alp_pos0 += NB_TRACK_FCB_2T; + } + + m[1] = find_best_pulse( L_subfr, NB_TRACK_FCB_2T, track, dn, sign, &s[1] ); + } + else + { + Gn = s[0] * dn_orig[m[0]]; + Gd = alp[0]; + G = Gn; + G *= s[0]; + + track = track_order[q * nb_tracks + 1]; + alp_pos0 = alp - m[0] + track; + + dndn = 0.1f; + for ( i = track; i < L_subfr; i += nb_tracks ) + { + dn[i] = Gd * dn_orig[i] - G * ( *alp_pos0 ); + alp_pos0 += nb_tracks; + dndn += ( dn[i] * dn[i] ); + } + + s_coef = sqrtf( dndn / cncn_track[track] ); + + max_val = FLT_MIN; + m[1] = track; + for ( i = track; i < L_subfr; i += nb_tracks ) + { + dn[i] = ( s_coef * cn[i] ) + ( beta2 * dn[i] ); + temp = dn[i] * sign[i]; + + if ( temp >= max_val ) + { + max_val = temp; + m[1] = i; + } + } + + s[1] = (int16_t) sign[m[1]]; + } + + /*-----------------------------------------------------------------* + * Third pulse search + *-----------------------------------------------------------------*/ + + if ( nb_pulse >= 3 ) + { + Gn += s[1] * dn_orig[m[1]]; + Gd += alp[0] + 2 * s[0] * s[1] * alp[m[0] - m[1]]; + G = Gn; + G1 = G * s[1]; + G *= s[0]; + + track = track_order[q * nb_tracks + 2]; + alp_pos0 = alp - m[0] + track; + alp_pos1 = alp - m[1] + track; + + for ( i = track; i < L_subfr; i += nb_tracks ) + { + dn[i] = Gd * dn_orig[i] - G * ( *alp_pos0 ) - G1 * ( *alp_pos1 ); + alp_pos0 += nb_tracks; + alp_pos1 += nb_tracks; + } + + m[2] = find_best_pulse( L_subfr, nb_tracks, track, dn, sign, &s[2] ); + } + + /*-----------------------------------------------------------------* + * Fourth pulse search + *-----------------------------------------------------------------*/ + + if ( nb_pulse >= 4 ) + { + Gn += s[2] * dn_orig[m[2]]; + Gd += alp[0] + 2 * s[0] * s[2] * alp[m[0] - m[2]] + 2 * s[1] * s[2] * alp[m[1] - m[2]]; + G = Gn; + G1 = G * s[1]; + G2 = G * s[2]; + G *= s[0]; + + track = track_order[q * nb_tracks + 3]; + alp_pos0 = alp - m[0] + track; + alp_pos1 = alp - m[1] + track; + alp_pos2 = alp - m[2] + track; + + for ( i = track; i < L_subfr; i += nb_tracks ) + { + dn[i] = Gd * dn_orig[i] - G * ( *alp_pos0 ) - G1 * ( *alp_pos1 ) - G2 * ( *alp_pos2 ); + alp_pos0 += nb_tracks; + alp_pos1 += nb_tracks; + alp_pos2 += nb_tracks; + } + + m[3] = find_best_pulse( L_subfr, nb_tracks, track, dn, sign, &s[3] ); + } + else + { + skip_track[q] = track_order[q * nb_tracks + 3]; + } + + /*-----------------------------------------------------------------* + * Fifth pulse search + *-----------------------------------------------------------------*/ + + if ( nb_pulse >= 5 ) + { + Gn += s[3] * dn_orig[m[3]]; + Gd += alp[0] + 2 * s[0] * s[3] * alp[m[0] - m[3]] + 2 * s[1] * s[3] * alp[m[1] - m[3]] + 2 * s[2] * s[3] * alp[m[2] - m[3]]; + G = Gn; + G1 = G * s[1]; + G2 = G * s[2]; + G3 = G * s[3]; + G *= s[0]; + + if ( cdk_index == 6 ) + { + track = 0; /* always track 0 */ + + alp_pos0 = alp - m[0]; + alp_pos1 = alp - m[1]; + alp_pos2 = alp - m[2]; + alp_pos3 = alp - m[3]; + + for ( i = track; i < L_subfr; i += nb_tracks ) + { + dn[i] = Gd * dn_orig[i] - G * ( *alp_pos0 ) - G1 * ( *alp_pos1 ) - G2 * ( *alp_pos2 ) - G3 * ( *alp_pos3 ); + alp_pos0 += nb_tracks; + alp_pos1 += nb_tracks; + alp_pos2 += nb_tracks; + alp_pos3 += nb_tracks; + } + + m[4] = find_best_pulse( L_subfr, nb_tracks, track, dn, sign, &s[4] ); + } + else /* cdk_index == 7 (26 bits codebook) */ + { + alp_pos0 = alp - m[0]; + alp_pos1 = alp - m[1]; + alp_pos2 = alp - m[2]; + alp_pos3 = alp - m[3]; + + for ( i = 0; i < L_subfr; i++ ) + { + dn[i] = Gd * dn_orig[i] - G * ( *alp_pos0 ) - G1 * ( *alp_pos1 ) - G2 * ( *alp_pos2 ) - G3 * ( *alp_pos3 ); + alp_pos0++; + alp_pos1++; + alp_pos2++; + alp_pos3++; + } + + i = emaximum( dn, L_subfr, &temp ); + track = i % nb_tracks; + + m[4] = find_best_pulse( L_subfr, nb_tracks, track, dn, sign, &s[4] ); + } + skip_track[q] = track; + } + + /*-----------------------------------------------------------------* + * - Build the filtered codeword and criterion computing. + * - Memorize the best code positions & signs, and the best filtered codevector. + *-----------------------------------------------------------------*/ + + crit_num = 0.0f; + set_zero( y_tmp, L_subfr ); + + for ( j = 0; j < nb_pulse; j++ ) + { + p_hn = ( ( s[j] > 0 ) ? h - m[j] : h_inv - m[j] ); + + for ( i = 0; i < L_subfr; i++ ) + { + y_tmp[i] += *p_hn++; + } + + crit_num += s[j] * dn_orig[m[j]]; + } + + crit_num = crit_num * crit_num; + crit_den = sum2_f( y_tmp, L_subfr ); + + if ( crit_num * crit_den_max >= crit_den * crit_num_max ) + { + crit_num_max = crit_num; + crit_den_max = crit_den; + + for ( j = 0; j < nb_pulse; j++ ) + { + m_max[j] = m[j]; + s_max[j] = s[j]; + } + + mvr2r( y_tmp, y, L_subfr ); + skip_track_max = skip_track[q]; + } + } + + /*-----------------------------------------------------------------* + * Reconstruct the best codevector, + * compute index of codevector and write it into the bitstream. + *-----------------------------------------------------------------*/ + + set_zero( code, L_subfr ); + for ( q = 0; q < nb_pulse; q++ ) + { + code[m_max[q]] += s_max[q]; + } + + if ( bits == 12 || bits == 14 ) + { + /* 12 bits, 2 pulses, 2 tracks 11 used all tracks */ + i = 6; + j = 0x800; + q = 0x20; + + if ( L_subfr == 2 * L_SUBFR ) + { + /* 14 bits, 2 pulses, 2 tracks: 11 (used all tracks) */ + i = 7; + j = 0x2000; + q = 0x40; + } + + if ( m_max[0] % NB_TRACK_FCB_2T == 1 ) + { + idx = ( ( m_max[1] / NB_TRACK_FCB_2T ) << i ) + ( m_max[0] / NB_TRACK_FCB_2T ); + + if ( s_max[1] < 0.0f ) + { + idx += j; + } + + if ( s_max[0] < 0.0f ) + { + idx += q; + } + } + else + { + idx = ( ( m_max[0] / NB_TRACK_FCB_2T ) << i ) + ( m_max[1] / NB_TRACK_FCB_2T ); + + if ( s_max[0] < 0.0f ) + { + idx += j; + } + + if ( s_max[1] < 0.0f ) + { + idx += q; + } + } + + push_indice( hBstr, IND_ALG_CDBK_2T32, idx, bits ); + } + else + { + /* compute index of codevector */ + set_s( ind_stream, -1, NPMAXPT * nb_tracks ); + + bits_track = 4; + nb_pos = NB_POS_FCB_4T; + + if ( L_subfr == 2 * L_SUBFR ) + { + bits_track = 5; + nb_pos = NB_POS_FCB_4T_128; + } + + for ( q = 0; q < nb_pulse; q++ ) + { + i = ( m_max[q] % NB_TRACK_FCB_4T ) * NPMAXPT; /* track number */ + if ( ind_stream[i] >= 0 ) + { + i++; + } + ind_stream[i] = m_max[q] / NB_TRACK_FCB_4T; /* pos of pulse */ + + if ( s_max[q] < 0 ) + { + ind_stream[i] += nb_pos; + } + } + + if ( codetrackpos == TRACKPOS_FREE_THREE || codetrackpos == TRACKPOS_FREE_ONE ) + { + push_indice( hBstr, IND_ALG_CDBK_4T64, skip_track_max, 2 ); + } + + if ( nb_pulse < 5 ) + { + for ( q = 0; q < NB_TRACK_FCB_4T; q++ ) + { + j = q * NPMAXPT; + if ( ind_stream[j] != -1 ) + { + idx = quant_1p_N1_L_subfr( nb_pos, ind_stream[j], bits_track ); + push_indice( hBstr, IND_ALG_CDBK_4T64, idx, bits_track + 1 ); + } + } + } + else + { + for ( q = 0; q < NB_TRACK_FCB_4T; q++ ) + { + j = q * NPMAXPT; + if ( q == skip_track_max ) + { + idx = quant_2p_2N1( ind_stream[j], ind_stream[j + 1], bits_track ); + push_indice( hBstr, IND_ALG_CDBK_4T64, idx, ( 2 * bits_track ) + 1 ); + } + else + { + idx = quant_1p_N1_L_subfr( nb_pos, ind_stream[j], bits_track ); + push_indice( hBstr, IND_ALG_CDBK_4T64, idx, bits_track + 1 ); + } + } + } + } + + return; +} diff --git a/lib_enc/cod_ace.c b/lib_enc/cod_ace.c new file mode 100644 index 0000000000000000000000000000000000000000..75058cfddd74c2fc34661da90385c84d4952d0be --- /dev/null +++ b/lib_enc/cod_ace.c @@ -0,0 +1,427 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "prot.h" +#include +#include "options.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * coder_acelp() + * + * Encode ACELP frame + *-------------------------------------------------------------------*/ + +void coder_acelp( + Encoder_State *st, /* i/o: coder memory state */ + const float A[], /* i : coefficients 4xAz[M+1] */ + const float Aq[], /* i : coefficients 4xAz_q[M+1] */ + const float speech[], /* i : speech[-M..lg] */ + LPD_state *LPDmem, /* i/o: ACELP memories */ + int16_t *prm, /* o : acelp parameters */ + const float stab_fac, + const int16_t target_bits, + float *gain_pitch_buf, /* o : gain pitch values */ + float *gain_code_buf, /* o : gain code values */ + float *pitch_buf, /* o : pitch values for each subfr.*/ + float *voice_factors, /* o : voicing factors */ + float *bwe_exc /* o : excitation for SWB TBE */ +) +{ + int16_t i, i_subfr; + int16_t T0, T0_min, T0_min_frac, T0_max, T0_max_frac, T0_res, T0_frac; + float tmp, Es_pred; + float gain_pit, gain_code, voice_fac; + ACELP_CbkCorr g_corr; + float g_corr2[6]; + const float *p_A, *p_Aq; + float h1[L_SUBFR]; /* weighted impulse response of LP */ + float code[L_SUBFR]; + float cn[L_SUBFR]; + float xn[L_SUBFR]; + float xn2[L_SUBFR]; + float y1[L_SUBFR]; /* Filtered adaptive excitation */ + float y2[L_SUBFR]; /* Filtered adaptive excitation */ + float res_save; + float exc_buf[L_EXC_MEM + L_FRAME16k + 1], *exc; + float exc2[L_SUBFR]; + float *syn, syn_buf[M + L_FRAME16k + L_FRAME16k / 2]; /*128 for the memory, L_FRAME for the current synth and 128 for the ZIR for next TCX*/ + float syn2[L_FRAME16k]; + float norm_gain_code, gain_inov; + int16_t clip_gain; + float gain_code2; + float code2[L_SUBFR]; + float y22[L_SUBFR]; /* Filtered adaptive excitation */ + int16_t lp_select; + float *pt_pitch, *pt_gain_pitch, *pt_gain_code; + float error; + float gain_preQ; /* Gain of prequantizer excitation */ + float code_preQ[L_SUBFR]; /* Prequantizer excitation */ + ACELP_config *acelp_cfg; + + acelp_cfg = &( st->acelp_cfg ); + + /* Configure ACELP */ + BITS_ALLOC_config_acelp( target_bits, st->coder_type, acelp_cfg, st->narrowBand, st->nb_subfr ); + + /*------------------------------------------------------------------------* + * Initialize buffers * + *------------------------------------------------------------------------*/ + + set_f( code_preQ, 0.f, L_SUBFR ); + gain_preQ = 0.0f; + + /* Reset phase dispersion */ + if ( st->last_core > ACELP_CORE ) + { + set_zero( st->hLPDmem->dispMem, 8 ); + } + + /* set excitation memory*/ + exc = exc_buf + L_EXC_MEM; + mvr2r( LPDmem->old_exc, exc_buf, L_EXC_MEM ); + *( exc + st->L_frame ) = 0.f; /*to solve a warning*/ + + /* Init syn buffer */ + syn = syn_buf + M; + mvr2r( LPDmem->mem_syn, syn_buf, M ); + + pt_pitch = pitch_buf; + pt_gain_pitch = gain_pitch_buf; + pt_gain_code = gain_code_buf; + + T0 = 0; + T0_res = 0; + T0_frac = 0; + + error = 0.0f; + + /*---------------------------------------------------------------* + * Calculation of LP residual (filtering through A[z] filter) + *---------------------------------------------------------------*/ + + calc_residu( speech, exc, Aq, st->L_frame ); + + /*------------------------------------------------------------------------* + * Find and quantize mean_ener_code for gain quantizer * + *------------------------------------------------------------------------*/ + + if ( acelp_cfg->nrg_mode > 0 ) + { + Es_pred_enc( &Es_pred, prm, st->L_frame, L_SUBFR, exc, st->voicing, acelp_cfg->nrg_bits, acelp_cfg->nrg_mode > 1 ); + prm++; + } + else + { + Es_pred = 0.f; + } + + if ( st->L_frame == L_FRAME ) + { + mvr2r( Aq + 2 * ( M + 1 ), st->hBWE_TD->cur_sub_Aq, ( M + 1 ) ); + } + else + { + mvr2r( Aq + 3 * ( M + 1 ), st->hBWE_TD->cur_sub_Aq, ( M + 1 ) ); + } + + /*------------------------------------------------------------------------* + * Loop for every subframe in the analysis frame * + *------------------------------------------------------------------------* + * To find the pitch and innovation parameters. The subframe size is * + * L_SUBFR and the loop is repeated L_FRAME_PLUS/L_SUBFR times. * + * - compute impulse response of weighted synthesis filter (h1[]) * + * - compute the target signal for pitch search * + * - find the closed-loop pitch parameters * + * - encode the pitch delay * + * - update the impulse response h1[] by including fixed-gain pitch * + * - find target vector for codebook search * + * - correlation between target vector and impulse response * + * - codebook search * + * - encode codebook address * + * - VQ of pitch and codebook gains * + * - find synthesis speech * + * - update states of weighting filter * + *------------------------------------------------------------------------*/ + + p_A = A; + p_Aq = Aq; + + res_save = exc[0]; + + for ( i_subfr = 0; i_subfr < st->L_frame; i_subfr += L_SUBFR ) + { + /* Restore exc[i_subfr] and save next exc[L_SUBFR+i_subfr] */ + exc[i_subfr] = res_save; + res_save = exc[L_SUBFR + i_subfr]; + + /*--------------------------------------------------------------------------* + * Find target for pitch search (xn[]), target for innovation search (cn[]) * + * and impulse response of the weighted synthesis filter (h1[]). * + *--------------------------------------------------------------------------*/ + + find_targets( speech, &syn[i_subfr - M], i_subfr, &LPDmem->mem_w0, p_Aq, exc, L_SUBFR, p_A, st->preemph_fac, xn, cn, h1 ); + + /*-----------------------------------------------------------------* + * Gain clipping test to avoid unstable synthesis on frame erasure + * or in case of floating point encoder & fixed p. decoder + *-----------------------------------------------------------------*/ + + clip_gain = gp_clip( st->element_mode, st->core_brate, st->voicing, i_subfr, st->coder_type, xn, st->clip_var ); + + /*-----------------------------------------------------------------* + * - find unity gain pitch excitation (adaptive codebook entry) * + * with fractional interpolation. * + * - find filtered pitch exc. y1[]=exc[] convolved with h1[]) * + * - compute pitch gain1 * + *-----------------------------------------------------------------*/ + + if ( acelp_cfg->ltp_bits != 0 ) + { + /* pitch lag coding */ + Mode2_pit_encode( acelp_cfg->ltp_mode, i_subfr, &prm, &exc[i_subfr], st->pitch, &T0_min, &T0_min_frac, &T0_max, &T0_max_frac, &T0, &T0_frac, &T0_res, h1, xn, st->pit_min, st->pit_fr1, st->pit_fr1b, st->pit_fr2, st->pit_max, st->pit_res_max ); + + /* find pitch excitation */ + if ( st->pit_res_max == 6 ) + { + if ( T0_res == ( st->pit_res_max >> 1 ) ) + { + pred_lt4( &exc[i_subfr], &exc[i_subfr], T0, T0_frac << 1, L_SUBFR + 1, inter6_2, PIT_L_INTERPOL6_2, PIT_UP_SAMP6 ); + } + else + { + pred_lt4( &exc[i_subfr], &exc[i_subfr], T0, T0_frac, L_SUBFR + 1, inter6_2, PIT_L_INTERPOL6_2, PIT_UP_SAMP6 ); + } + } + else + { + if ( T0_res == ( st->pit_res_max >> 1 ) ) + { + pred_lt4( &exc[i_subfr], &exc[i_subfr], T0, T0_frac << 1, L_SUBFR + 1, inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + } + else + { + pred_lt4( &exc[i_subfr], &exc[i_subfr], T0, T0_frac, L_SUBFR + 1, inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + } + } + + /* filter adaptive codebook */ + lp_select = lp_filt_exc_enc( MODE2, st->coder_type, i_subfr, exc, h1, xn, y1, xn2, L_SUBFR, st->L_frame, g_corr2, clip_gain, &( gain_pit ), &( acelp_cfg->ltf_mode ) ); + + if ( acelp_cfg->ltf_mode == NORMAL_OPERATION ) + { + *prm = lp_select; + prm++; + } + + g_corr.y1y1 = g_corr2[0]; + g_corr.xy1 = -0.5f * ( g_corr2[1] - 0.01f ) + 0.01f; + } + else + { + /* No adaptive codebook (UC) */ + gain_pit = 0.f; + g_corr.xy1 = 0.f; + g_corr.y1y1 = 0.f; + set_zero( y1, L_SUBFR ); + set_zero( exc + i_subfr, L_SUBFR ); + T0 = L_SUBFR; + T0_frac = 0; + T0_res = 1; + } + + if ( st->igf ) + { + tbe_celp_exc( st->element_mode, st->idchan, bwe_exc, st->L_frame, L_SUBFR, i_subfr, T0, T0_frac, &error, 0 ); + } + + pitch_buf[i_subfr / L_SUBFR] = (float) T0 + (float) T0_frac / (float) T0_res; + + /*----------------------------------------------------------------------* + * Encode the algebraic innovation * + *----------------------------------------------------------------------*/ + + E_ACELP_innovative_codebook( exc, T0, T0_frac, T0_res, gain_pit, LPDmem->tilt_code, acelp_cfg, i_subfr, p_Aq, h1, xn, cn, y1, y2, st->acelp_autocorr, &prm, code, st->L_frame, st->last_L_frame, st->total_brate ); + + E_corr_xy2( xn, y1, y2, g_corr2, L_SUBFR ); + g_corr.y2y2 = 0.01F + g_corr2[2]; + g_corr.xy2 = 0.01F + -0.5f * g_corr2[3]; + g_corr.y1y2 = 0.01F + 0.5f * g_corr2[4]; + + g_corr.xx = 0.01F + dotp( xn, xn, L_SUBFR ); + + /*----------------------------------------------------------------------* + * Add Gaussian excitation * + *----------------------------------------------------------------------*/ + + if ( acelp_cfg->gains_mode[i_subfr / L_SUBFR] == 7 ) + { + assert( gain_pit == 0.f ); + + gauss_L2( h1, code2, y2, y22, &gain_code2, g_corr2, LPDmem->tilt_code, p_Aq, acelp_cfg->formant_enh_num, &( st->seed_acelp ) ); + + g_corr.y1y1 = g_corr2[0]; + g_corr.y1y2 = g_corr2[4]; + } + else + { + gain_code2 = 0.f; + set_zero( code2, L_SUBFR ); + set_zero( y22, L_SUBFR ); + } + + /*----------------------------------------------------------* + * - Compute the fixed codebook gain * + * - quantize fixed codebook gain * + *----------------------------------------------------------*/ + + encode_acelp_gains( code, acelp_cfg->gains_mode[i_subfr / L_SUBFR], Es_pred, clip_gain, &g_corr, &gain_pit, &gain_code, &prm, &norm_gain_code, &gain_inov, L_SUBFR, code2, &gain_code2, st->flag_noisy_speech_snr ); + + gp_clip_test_gain_pit( st->element_mode, st->core_brate, gain_pit, st->clip_var ); + + /*----------------------------------------------------------* + * - voice factor (for codebook tilt sharpening) * + *----------------------------------------------------------*/ + + LPDmem->tilt_code = est_tilt( exc + i_subfr, gain_pit, code, gain_code, &voice_fac, L_SUBFR, acelp_cfg->voice_tilt ); + + if ( st->Opt_RF_ON ) + { + st->hRF->rf_tilt_buf[i_subfr / L_SUBFR] = LPDmem->tilt_code; + } + + + /*-----------------------------------------------------------------* + * Update memory of the weighting filter + *-----------------------------------------------------------------*/ + + LPDmem->mem_w0 = xn[L_SUBFR - 1] - gain_pit * y1[L_SUBFR - 1] - gain_code * y2[L_SUBFR - 1] - gain_code2 * y22[L_SUBFR - 1]; + + /*-------------------------------------------------------* + * - Find the total excitation. * + *-------------------------------------------------------*/ + + for ( i = 0; i < L_SUBFR; i++ ) + { + exc2[i] = gain_pit * exc[i + i_subfr]; + exc2[i] += gain_code2 * code2[i]; + exc[i + i_subfr] = exc2[i] + gain_code * code[i]; + } + + /*-----------------------------------------------------------------* + * Prepare TBE excitation + *-----------------------------------------------------------------*/ + + prep_tbe_exc( st->L_frame, L_SUBFR, i_subfr, gain_pit, gain_code, code, voice_fac, &voice_factors[i_subfr / L_SUBFR], bwe_exc, gain_preQ, code_preQ, T0, st->coder_type, st->core_brate, st->element_mode, st->idchan, 0, 0 ); + + /*---------------------------------------------------------* + * Enhance the excitation * + *---------------------------------------------------------*/ + + enhancer( MODE2, -1, acelp_cfg->fixed_cdk_index[i_subfr / L_SUBFR], 0, st->coder_type, st->L_frame, voice_fac, stab_fac, norm_gain_code, gain_inov, &( LPDmem->gc_threshold ), code, exc2, gain_pit, LPDmem->dispMem ); + + /*----------------------------------------------------------* + * - compute the synthesis speech * + *----------------------------------------------------------*/ + + syn_filt( p_Aq, M, exc2, &syn2[i_subfr], L_SUBFR, LPDmem->mem_syn2, 1 ); + + syn_filt( p_Aq, M, &exc[i_subfr], &syn[i_subfr], L_SUBFR, &syn[i_subfr - M], 0 ); + + /*----------------------------------------------------------* + * Save buffers for BPF * + *----------------------------------------------------------*/ + + *pt_pitch = ( (float) T0 + (float) T0_frac / (float) T0_res + 0.5f ); + *pt_gain_pitch = gain_pit; + *pt_gain_code = gain_code; + + /*----------------------------------------------------------* + * Update * + *----------------------------------------------------------*/ + + p_A += ( M + 1 ); + p_Aq += ( M + 1 ); + pt_pitch++; + pt_gain_pitch++; + pt_gain_code++; + + if ( st->hPlcExt != NULL ) + { + st->hPlcExt->T0_4th = T0; + } + + } /* end of subframe loop */ + + p_A -= ( M + 1 ); + p_Aq -= ( M + 1 ); + + + /*----------------------------------------------------------* + * Update LPD memory * + *----------------------------------------------------------*/ + + mvr2r( exc + st->L_frame - L_EXC_MEM, LPDmem->old_exc, L_EXC_MEM ); + mvr2r( syn + st->L_frame - M, LPDmem->mem_syn, M ); + mvr2r( syn + st->L_frame - L_SYN_MEM, LPDmem->mem_syn_r, L_SYN_MEM ); + + if ( st->hPlcExt != NULL ) + { + mvr2r( exc + st->L_frame - L_EXC_MEM - 8, st->hPlcExt->old_exc, 8 ); + } + + /*----------------------------------------------------------* + * ZIR at the end of the ACELP frame (for TCX) * + *----------------------------------------------------------*/ + + mvr2r( syn2, syn, st->L_frame ); + tmp = LPDmem->syn[M]; + deemph( syn, st->preemph_fac, st->L_frame, &tmp ); + if ( st->hTcxEnc != NULL ) + { + mvr2r( syn + st->L_frame / 2, st->hTcxEnc->Txnq, st->L_frame / 2 ); + } + mvr2r( syn + st->L_frame - ( M + 1 ), LPDmem->syn, M + 1 ); + mvr2r( syn, st->synth, st->L_frame ); + + /*Update MODE1*/ + mvr2r( p_Aq, st->old_Aq_12_8, M + 1 ); + st->old_Es_pred = Es_pred; + + return; +} diff --git a/lib_enc/cod_tcx.c b/lib_enc/cod_tcx.c new file mode 100644 index 0000000000000000000000000000000000000000..b2d8883c591407b48d41100c9605e32f6d3957c2 --- /dev/null +++ b/lib_enc/cod_tcx.c @@ -0,0 +1,2157 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "wmc_auto.h" +#include "ivas_prot.h" +#include "ivas_rom_com.h" + +/*-------------------------------------------------------------------* + * HBAutocorrelation() + * + * + *-------------------------------------------------------------------*/ + +void HBAutocorrelation( + TCX_CONFIG_HANDLE hTcxCfg, /* i : configuration of TCX */ + const int16_t left_overlap_mode, /* i : overlap mode of left window half */ + const int16_t right_overlap_mode, /* i : overlap mode of right window half */ + float speech[], /* i : synthesis */ + int16_t L_frame, /* i : frame length */ + float *r /* o : autocorrelations vector */ +) +{ + int16_t i, j, left_overlap, right_overlap; + float s; + float xn_buf[L_MDCT_OVLP_MAX + L_FRAME_PLUS + L_MDCT_OVLP_MAX]; + + /*-----------------------------------------------------------* + * Windowing * + *-----------------------------------------------------------*/ + + WindowSignal( hTcxCfg, hTcxCfg->tcx_offset, left_overlap_mode, right_overlap_mode, &left_overlap, &right_overlap, speech, &L_frame, xn_buf, 1, 0 ); + + /*-----------------------------------------------------------* + * Autocorrelation * + *-----------------------------------------------------------*/ + + for ( i = 0; i <= M; i++ ) + { + s = 0.0; + + for ( j = 0; j < L_frame + ( left_overlap + right_overlap ) / 2 - i; j++ ) + { + s += xn_buf[j] * xn_buf[j + i]; + } + r[i] = s; + } + + if ( r[0] < 100.0 ) + { + r[0] = 100.0; + } + + return; +} + + +/*-------------------------------------------------------------------* + * TNSAnalysisStereo() + * + * + *-------------------------------------------------------------------*/ + +#define SIMILAR_TNS_THRESHOLD ( 0.04f ) +#define TNS_GAIN_THRESHOLD_FOR_WHITE ( 3.0f ) + +void TNSAnalysisStereo( + Encoder_State **sts, /* i : encoder state handle */ + float *mdst_spectrum[MCT_MAX_CHANNELS][NB_DIV], /* o : MDST spectrum */ + const int16_t bWhitenedDomain, /* i : whitened domain flag */ + int16_t tnsSize[MCT_MAX_CHANNELS][NB_DIV], /* i : number of tns parameters put into prm */ + int16_t tnsBits[MCT_MAX_CHANNELS][NB_DIV], /* i : number of tns bits in the frame */ + int16_t param_core[][NB_DIV * NPRM_DIV], /* o : TNS parameters */ + const int16_t mct_on /* i : flag mct block (1) or stereo (0) */ +) +{ + int16_t ch, k, L_spec, L_frame, nSubframes, iFilter; + float *spectrum; + Encoder_State *st = NULL; + TCX_ENC_HANDLE hTcxEnc = NULL; + int16_t individual_decision[NB_DIV]; + float maxPredictionGain = 0.f, meanPredictionGain; + + individual_decision[0] = 0; + individual_decision[1] = 0; + L_spec = -1; + L_frame = -1; + + /* TNS filter analysis, loop over channels */ + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + st = sts[ch]; + if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) + { + continue; + } + + hTcxEnc = st->hTcxEnc; + + nSubframes = ( hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; + + for ( k = 0; k < nSubframes; k++ ) + { + /* reset tns on whitened domain flag */ + if ( !bWhitenedDomain ) + { + hTcxEnc->bTnsOnWhithenedSpectra[k] = 0; + hTcxEnc->fUseTns[k] = 0; + } + + if ( st->hTcxCfg->fIsTNSAllowed && ( !bWhitenedDomain || hTcxEnc->bTnsOnWhithenedSpectra[k] ) ) + { + + spectrum = hTcxEnc->spectrum[k]; + L_frame = hTcxEnc->L_frameTCX; + st->hTcxCfg->pCurrentTnsConfig = &st->hTcxCfg->tnsConfig[hTcxEnc->transform_type[k] == TCX_20][( k == 0 ) && ( st->last_core == ACELP_CORE )]; + L_spec = st->hTcxCfg->pCurrentTnsConfig->iFilterBorders[0]; + + /*-----------------------------------------------------------* + * Temporal Noise Shaping analysis * + *-----------------------------------------------------------*/ + + if ( hTcxEnc->transform_type[k] == TCX_5 ) + { + /* rearrange LF sub-window lines prior to TNS analysis & filtering */ + tcx5TnsGrouping( L_frame >> 2, L_spec >> 1, spectrum ); + } + + /* WMOPS: All initializations are either for safety or static (tables) and thus not to be counted */ + ResetTnsData( &hTcxEnc->tnsData[k] ); + if ( st->hTcxCfg->pCurrentTnsConfig->maxOrder <= 0 ) + { + break; + } + + CalculateTnsFilt( st->hTcxCfg->pCurrentTnsConfig, spectrum, &hTcxEnc->tnsData[k], NULL ); + } + } + } + + if ( !mct_on ) + { + /* TNS decision */ + /* if framing differs between channels, keep the filter decision per channel */ + if ( ( sts[0]->hTcxEnc->transform_type[0] != sts[1]->hTcxEnc->transform_type[0] && + sts[0]->hTcxEnc->transform_type[1] != sts[1]->hTcxEnc->transform_type[1] ) || + sts[0]->hTcxCfg->fIsTNSAllowed != sts[1]->hTcxCfg->fIsTNSAllowed ) + { + individual_decision[0] = individual_decision[1] = 1; + } + else if ( bWhitenedDomain ) + { + nSubframes = ( sts[0]->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; + for ( k = 0; k < nSubframes; k++ ) + { + if ( sts[0]->hTcxEnc->bTnsOnWhithenedSpectra[k] != sts[1]->hTcxEnc->bTnsOnWhithenedSpectra[k] ) + { + individual_decision[k] = 1; + } + } + } + + /* framing equal, check for similar filters, if very similar (also indicator for and M signal), + * use at least the same decision, maybe use the same filter + */ + { + int16_t isTCX10; + isTCX10 = ( sts[0]->hTcxEnc->tcxMode == TCX_20 ) ? 0 : 1; + + nSubframes = ( sts[0]->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; + + for ( k = 0; k < nSubframes; k++ ) + { + if ( sts[0]->hTcxCfg->fIsTNSAllowed && individual_decision[k] != 1 && ( !bWhitenedDomain || sts[0]->hTcxEnc->bTnsOnWhithenedSpectra[k] ) ) + { + float maxPredGain = -1.0f; + sts[0]->hTcxCfg->pCurrentTnsConfig = &sts[0]->hTcxCfg->tnsConfig[sts[0]->hTcxEnc->transform_type[k] == TCX_20][( k == 0 ) && ( sts[0]->last_core == ACELP_CORE )]; + sts[1]->hTcxCfg->pCurrentTnsConfig = &sts[1]->hTcxCfg->tnsConfig[sts[1]->hTcxEnc->transform_type[k] == TCX_20][( k == 0 ) && ( sts[1]->last_core == ACELP_CORE )]; + + for ( iFilter = sts[0]->hTcxCfg->pCurrentTnsConfig->nMaxFilters - 1; iFilter >= 0; iFilter-- ) + { + STnsFilter *pFilter[2]; + struct TnsParameters const *pTnsParameters[2]; + pFilter[0] = sts[0]->hTcxEnc->tnsData[k].filter + iFilter; + pTnsParameters[0] = sts[0]->hTcxCfg->pCurrentTnsConfig->pTnsParameters + iFilter; + pFilter[1] = sts[1]->hTcxEnc->tnsData[k].filter + iFilter; + pTnsParameters[1] = sts[1]->hTcxCfg->pCurrentTnsConfig->pTnsParameters + iFilter; + + /* if prediction gain and avgSqrCoef are both close we are pretty sure the filters are quite similar, use the avg of + * both filters for the decision + */ + meanPredictionGain = ( pFilter[0]->predictionGain + pFilter[1]->predictionGain ) * 0.5f; + maxPredictionGain = max( maxPredictionGain, meanPredictionGain ); + + if ( ( pFilter[0]->predictionGain > pTnsParameters[0]->minPredictionGain ) && ( sts[0]->element_brate < IVAS_80k ) && + ( pFilter[1]->predictionGain > pTnsParameters[1]->minPredictionGain ) && ( sts[0]->hTcxEnc->tnsData[k].nFilters == sts[1]->hTcxEnc->tnsData[k].nFilters ) ) + { + pFilter[0]->predictionGain = pFilter[1]->predictionGain = meanPredictionGain; /* more TNS filter sync at 48kbps */ + } + if ( ( fabs( pFilter[0]->predictionGain - pFilter[1]->predictionGain ) < SIMILAR_TNS_THRESHOLD * meanPredictionGain ) && + ( sts[0]->hTcxEnc->tnsData[k].nFilters == sts[1]->hTcxEnc->tnsData[k].nFilters ) ) + { + float maxAvgSqrCoef = max( pFilter[0]->avgSqrCoef, pFilter[1]->avgSqrCoef ); + float meanLtpGain = ( sts[0]->hTcxEnc->tcxltp_gain + sts[1]->hTcxEnc->tcxltp_gain ) * 0.5f; + maxPredGain = max( maxPredGain, meanPredictionGain ); + if ( ( meanPredictionGain > pTnsParameters[0]->minPredictionGain ) || ( maxAvgSqrCoef > pTnsParameters[0]->minAvgSqrCoef ) ) + { + if ( sts[0]->hTcxEnc->tnsData[k].nFilters > 0 || sts[1]->hTcxEnc->tnsData[k].nFilters > 0 || isTCX10 || meanLtpGain < 0.6f ) + { + ++sts[0]->hTcxEnc->tnsData[k].nFilters; + pFilter[0]->filterType = TNS_FILTER_ON; + ++sts[1]->hTcxEnc->tnsData[k].nFilters; + pFilter[1]->filterType = TNS_FILTER_ON; + } + else + { + const float maxEnergyChange = ( GetTCXMaxenergyChange( sts[0]->hTranDet, isTCX10, NSUBBLOCKS, 3 ) + GetTCXMaxenergyChange( sts[1]->hTranDet, isTCX10, NSUBBLOCKS, 3 ) ) * 0.5f; + + if ( maxEnergyChange >= pTnsParameters[0]->minEnergyChange ) + { + ++sts[0]->hTcxEnc->tnsData[k].nFilters; + pFilter[0]->filterType = TNS_FILTER_ON; + ++sts[1]->hTcxEnc->tnsData[k].nFilters; + pFilter[1]->filterType = TNS_FILTER_ON; + } + else + { + pFilter[0]->filterType = TNS_FILTER_OFF; + pFilter[1]->filterType = TNS_FILTER_OFF; + } + } + } + else if ( sts[0]->hTcxEnc->tnsData[k].nFilters > 0 && sts[1]->hTcxEnc->tnsData[k].nFilters > 0 ) /* If a previous filter is turned on */ + { + pFilter[0]->filterType = TNS_FILTER_ON_ZERO; + pFilter[1]->filterType = TNS_FILTER_ON_ZERO; + ++sts[0]->hTcxEnc->tnsData[k].nFilters; + ++sts[1]->hTcxEnc->tnsData[k].nFilters; + } + else if ( sts[0]->hTcxEnc->tnsData[k].nFilters != sts[1]->hTcxEnc->tnsData[k].nFilters ) /* sanity check */ + { + assert( 0 ); + } + else + { + pFilter[0]->filterType = TNS_FILTER_OFF; + pFilter[1]->filterType = TNS_FILTER_OFF; + } + if ( ( pFilter[0]->filterType == TNS_FILTER_ON ) && ( pFilter[1]->filterType == TNS_FILTER_ON ) && ( sts[0]->element_brate < IVAS_80k ) ) + { + int16_t tmpIntValue = 0; + int16_t tmpCoeff[TNS_MAX_FILTER_ORDER]; + int16_t i, maxOrder = max( pFilter[0]->order, pFilter[1]->order ); + + set_s( tmpCoeff, 0, TNS_MAX_FILTER_ORDER ); + for ( i = 0; i < maxOrder; i++ ) + { + tmpIntValue = (int16_t) max( tmpIntValue, abs( pFilter[0]->coefIndex[i] - pFilter[1]->coefIndex[i] ) ); + } + if ( tmpIntValue == 1 ) /* the TNS coefficients are sufficiently similar to equalize the two filters */ + { + for ( i = maxOrder - 1; i >= 0; i-- ) + { + tmpCoeff[i] = ( abs( pFilter[0]->coefIndex[i] ) < abs( pFilter[1]->coefIndex[i] ) ? pFilter[0]->coefIndex[i] : pFilter[1]->coefIndex[i] ); + if ( ( tmpIntValue > 0 ) && ( tmpCoeff[i] == 0 ) ) + { + maxOrder--; + } + else + { + tmpIntValue = 0; + } + } + /* make sure that maxOrder is non zero and not all coefficients are zero (could happen in rare cases) */ + if ( maxOrder > 0 ) + { + for ( i = TNS_MAX_FILTER_ORDER - 1; i >= 0; i-- ) + { + pFilter[0]->coefIndex[i] = pFilter[1]->coefIndex[i] = tmpCoeff[i]; + } + + pFilter[0]->order = pFilter[1]->order = maxOrder; + } + } + } + } + else + { + individual_decision[k] = 1; + } + } + + if ( individual_decision[k] == 0 ) + { + sts[0]->hTcxEnc->fUseTns[k] = ( sts[0]->hTcxEnc->tnsData[k].nFilters > 0 ) ? 1 : 0; + sts[1]->hTcxEnc->fUseTns[k] = ( sts[1]->hTcxEnc->tnsData[k].nFilters > 0 ) ? 1 : 0; + } + else + { + sts[0]->hTcxEnc->tnsData[k].nFilters = 0; + sts[1]->hTcxEnc->tnsData[k].nFilters = 0; + sts[0]->hTcxEnc->fUseTns[k] = 0; + sts[1]->hTcxEnc->fUseTns[k] = 0; + for ( iFilter = sts[0]->hTcxCfg->pCurrentTnsConfig->nMaxFilters - 1; iFilter >= 0; iFilter-- ) + { + sts[0]->hTcxEnc->tnsData[k].filter[iFilter].filterType = TNS_FILTER_OFF; + sts[1]->hTcxEnc->tnsData[k].filter[iFilter].filterType = TNS_FILTER_OFF; + } + } + + if ( !bWhitenedDomain && individual_decision[k] == 0 && maxPredGain < TNS_GAIN_THRESHOLD_FOR_WHITE && sts[0]->hTcxEnc->transform_type[k] != TCX_5 ) + { + sts[0]->hTcxEnc->bTnsOnWhithenedSpectra[k] = 1; + sts[1]->hTcxEnc->bTnsOnWhithenedSpectra[k] = 1; + sts[0]->hTcxEnc->tnsData[k].nFilters = 0; + sts[1]->hTcxEnc->tnsData[k].nFilters = 0; + sts[0]->hTcxEnc->fUseTns[k] = 0; + sts[1]->hTcxEnc->fUseTns[k] = 0; + for ( iFilter = sts[0]->hTcxCfg->pCurrentTnsConfig->nMaxFilters - 1; iFilter >= 0; iFilter-- ) + { + ClearTnsFilterCoefficients( sts[0]->hTcxEnc->tnsData[k].filter + iFilter ); + ClearTnsFilterCoefficients( sts[1]->hTcxEnc->tnsData[k].filter + iFilter ); + } + } + maxPredictionGain = max( maxPredictionGain, maxPredGain ); + } + } + } + } + + /* individual decision for each channel */ + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + if ( sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) + { + continue; + } + + int16_t isTCX10; + isTCX10 = ( sts[ch]->hTcxEnc->tcxMode == TCX_20 ) ? 0 : 1; + + nSubframes = ( sts[ch]->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; + + for ( k = 0; k < nSubframes; k++ ) + { + if ( sts[ch]->hTcxCfg->fIsTNSAllowed && ( individual_decision[k] || mct_on ) && + ( !bWhitenedDomain || sts[ch]->hTcxEnc->bTnsOnWhithenedSpectra[k] ) ) + { + float maxPredGain = -1.0f; + + sts[ch]->hTcxCfg->pCurrentTnsConfig = &sts[ch]->hTcxCfg->tnsConfig[sts[ch]->hTcxEnc->transform_type[k] == TCX_20][( k == 0 ) && ( sts[ch]->last_core == ACELP_CORE )]; + + for ( iFilter = sts[ch]->hTcxCfg->pCurrentTnsConfig->nMaxFilters - 1; iFilter >= 0; iFilter-- ) + { + STnsFilter *pFilter; + const struct TnsParameters *pTnsParameters; + pFilter = sts[ch]->hTcxEnc->tnsData[k].filter + iFilter; + pTnsParameters = sts[ch]->hTcxCfg->pCurrentTnsConfig->pTnsParameters + iFilter; + maxPredGain = max( maxPredGain, pFilter->predictionGain ); + + if ( ( pFilter->predictionGain > pTnsParameters->minPredictionGain ) || ( pFilter->avgSqrCoef > pTnsParameters->minAvgSqrCoef ) ) + { + if ( sts[ch]->hTcxEnc->tnsData[k].nFilters > 0 || isTCX10 || sts[ch]->hTcxEnc->tcxltp_gain < 0.6f ) + { + ++sts[ch]->hTcxEnc->tnsData[k].nFilters; + pFilter->filterType = TNS_FILTER_ON; + } + else + { + const float maxEnergyChange = GetTCXMaxenergyChange( sts[ch]->hTranDet, isTCX10, NSUBBLOCKS, 3 ); + + if ( maxEnergyChange >= pTnsParameters->minEnergyChange ) + { + ++sts[ch]->hTcxEnc->tnsData[k].nFilters; + pFilter->filterType = TNS_FILTER_ON; + } + else + { + pFilter->filterType = TNS_FILTER_OFF; + } + } + } + else if ( sts[ch]->hTcxEnc->tnsData[k].nFilters > 0 ) /* If a previous filter is turned on */ + { + pFilter->filterType = TNS_FILTER_ON_ZERO; + ++sts[ch]->hTcxEnc->tnsData[k].nFilters; + } + else + { + pFilter->filterType = TNS_FILTER_OFF; + } + } + + sts[ch]->hTcxEnc->fUseTns[k] = ( sts[ch]->hTcxEnc->tnsData[k].nFilters > 0 ) ? 1 : 0; + + if ( !bWhitenedDomain && maxPredGain < TNS_GAIN_THRESHOLD_FOR_WHITE && sts[ch]->hTcxEnc->transform_type[k] != TCX_5 ) + { + sts[ch]->hTcxEnc->fUseTns[k] = 0; + sts[ch]->hTcxEnc->bTnsOnWhithenedSpectra[k] = 1; + sts[ch]->hTcxEnc->tnsData[k].nFilters = 0; + for ( iFilter = sts[ch]->hTcxCfg->pCurrentTnsConfig->nMaxFilters - 1; iFilter >= 0; iFilter-- ) + { + ClearTnsFilterCoefficients( sts[ch]->hTcxEnc->tnsData[k].filter + iFilter ); + sts[ch]->hTcxEnc->tnsData[k].filter[iFilter].filterType = TNS_FILTER_OFF; + } + } + maxPredictionGain = max( maxPredictionGain, maxPredGain ); + } + } + } + + + /* we have the decision, set filter data accordingly */ + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + if ( sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) + { + continue; + } + + nSubframes = ( sts[ch]->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; + + for ( k = 0; k < nSubframes; k++ ) + { + if ( sts[ch]->hTcxCfg->fIsTNSAllowed && ( !bWhitenedDomain || sts[ch]->hTcxEnc->bTnsOnWhithenedSpectra[k] ) ) + { + sts[ch]->hTcxCfg->pCurrentTnsConfig = &sts[ch]->hTcxCfg->tnsConfig[sts[ch]->hTcxEnc->transform_type[k] == TCX_20][( k == 0 ) && ( sts[ch]->last_core == ACELP_CORE )]; + + for ( iFilter = sts[ch]->hTcxCfg->pCurrentTnsConfig->nMaxFilters - 1; iFilter >= 0; iFilter-- ) + { + STnsFilter *pFilter; + pFilter = sts[ch]->hTcxEnc->tnsData[k].filter + iFilter; + switch ( pFilter->filterType ) + { + case TNS_FILTER_OFF: + ClearTnsFilterCoefficients( sts[ch]->hTcxEnc->tnsData[k].filter + iFilter ); + break; + case TNS_FILTER_ON_ZERO: + /* Since TNS filter of order 0 is not allowed we have to signal in the stream filter of order 1 with the 0th coefficient equal to 0 */ + ClearTnsFilterCoefficients( pFilter ); + pFilter->order = 1; + break; + } + } + } + } + } + + /* Apply filters, loop over channels */ + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + st = sts[ch]; + if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) + { + continue; + } + + nSubframes = ( st->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; + + for ( k = 0; k < nSubframes; k++ ) + { + if ( bWhitenedDomain && ( ch > 0 ) && /* test for identical TNS filter data in both channels */ + sts[0]->hTcxCfg->fIsTNSAllowed && sts[0]->hTcxEnc->fUseTns[k] && + sts[1]->hTcxCfg->fIsTNSAllowed && sts[1]->hTcxEnc->fUseTns[k] ) + { + int16_t equalFilterData = ( sts[0]->hTcxCfg->pCurrentTnsConfig->nMaxFilters == sts[1]->hTcxCfg->pCurrentTnsConfig->nMaxFilters && + sts[0]->hTcxEnc->bTnsOnWhithenedSpectra[k] == sts[1]->hTcxEnc->bTnsOnWhithenedSpectra[k] && + sts[0]->hTcxEnc->tnsData[k].nFilters == sts[1]->hTcxEnc->tnsData[k].nFilters ) + ? 1 + : 0; + if ( equalFilterData ) + { + for ( iFilter = st->hTcxCfg->pCurrentTnsConfig->nMaxFilters - 1; iFilter >= 0; iFilter-- ) + { + const int16_t *pDataCh0 = (const int16_t *) &sts[0]->hTcxEnc->tnsData[k].filter[iFilter]; + const int16_t *pDataCh1 = (const int16_t *) &sts[1]->hTcxEnc->tnsData[k].filter[iFilter]; + int16_t i = 2 + TNS_MAX_FILTER_ORDER; /* excl. informative float data. Portable? */ + + while ( ( i >= 0 ) && ( pDataCh0[i] == pDataCh1[i] ) ) + { + i--; + } + if ( i >= 0 ) + { + equalFilterData = 0; + break; + } + } + if ( equalFilterData ) + { + st->hTcxEnc->tnsData[k].nFilters *= -1; /* signals common TNS */ + } + } + } + if ( st->hTcxCfg->fIsTNSAllowed && ( !bWhitenedDomain || st->hTcxEnc->bTnsOnWhithenedSpectra[k] ) ) + { + L_spec = st->hTcxCfg->pCurrentTnsConfig->iFilterBorders[0]; + spectrum = st->hTcxEnc->spectrum[k]; + /* If TNS should be used then get the residual after applying it inplace in the spectrum */ + if ( st->hTcxEnc->fUseTns[k] ) + { + st->hTcxCfg->pCurrentTnsConfig = &st->hTcxCfg->tnsConfig[st->hTcxEnc->transform_type[k] == TCX_20][( k == 0 ) && ( st->last_core == ACELP_CORE )]; + + ApplyTnsFilter( st->hTcxCfg->pCurrentTnsConfig, &st->hTcxEnc->tnsData[k], spectrum, 1 ); + } + + if ( st->hTcxEnc->transform_type[k] == TCX_5 ) + { + tcx5TnsUngrouping( L_frame >> 2, L_spec >> 1, st->hTcxEnc->spectrum[k], ENC ); + } + + st->hTcxEnc->tnsData[k].tnsOnWhitenedSpectra = st->hTcxEnc->bTnsOnWhithenedSpectra[k]; + + EncodeTnsData( st->hTcxCfg->pCurrentTnsConfig, &st->hTcxEnc->tnsData[k], param_core[ch] + k * NPRM_DIV + 1 + NOISE_FILL_RANGES + LTPSIZE, tnsSize[ch] + k, tnsBits[ch] + k ); + } + + if ( st->hTcxEnc->transform_type[k] == TCX_5 ) + { + tcx5SpectrumInterleaving( st->hTcxCfg->tcx5SizeFB, st->hTcxEnc->spectrum[k] ); + tcx5SpectrumInterleaving( st->hTcxCfg->tcx5SizeFB, mdst_spectrum[ch][k] ); + } + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * TNSAnalysis() + * + * + *-------------------------------------------------------------------*/ + +void TNSAnalysis( + TCX_CONFIG_HANDLE hTcxCfg, /* i : configuration of TCX */ + const int16_t L_frame, /* i : frame length */ + int16_t L_spec, /* i : length of the spectrum */ + const int16_t transform_type, /* i : transform type for the frame/subframe - TCX20 | TCX10 | TCX 5 (meaning 2 x TCX 5) */ + const int16_t isAfterACELP, /* i : Flag indicating if the last frame was ACELP. For the second TCX subframe it should be 0 */ + float spectrum[], /* i : MDCT spectrum of the subframe */ + TRAN_DET_HANDLE hTranDet, /* i : handle transient detection */ + const float ltp_gain, /* i : ltp gain */ + STnsData *pTnsData, /* o : TNS data */ + int16_t *pfUseTns, /* o : Flag indicating if TNS is used */ + float *predictionGain /* o : TNS prediction gain */ +) +{ + float buff[8]; /* Buffer for the rearrangement of LF TCX5 */ + + /* Init TNS */ + *pfUseTns = 0; + + if ( hTcxCfg->fIsTNSAllowed ) + { + hTcxCfg->pCurrentTnsConfig = &hTcxCfg->tnsConfig[transform_type == TCX_20][isAfterACELP]; + L_spec = hTcxCfg->pCurrentTnsConfig->iFilterBorders[0]; + + /*-----------------------------------------------------------* + * Temporal Noise Shaping analysis * + *-----------------------------------------------------------*/ + + if ( transform_type == TCX_5 ) + { + /* rearrange LF sub-window lines prior to TNS analysis & filtering */ + if ( L_spec < L_frame / 2 ) + { + mvr2r( spectrum + 8, spectrum + 16, L_spec / 2 - 8 ); + mvr2r( spectrum + L_frame / 4, spectrum + 8, 8 ); + mvr2r( spectrum + L_frame / 4 + 8, spectrum + L_spec / 2 + 8, L_spec / 2 - 8 ); + } + else + { + mvr2r( spectrum + L_frame / 4, buff, 8 ); + mvr2r( spectrum + 8, spectrum + 16, L_frame / 4 - 8 ); + mvr2r( buff, spectrum + 8, 8 ); + } + } + + *pfUseTns = DetectTnsFilt( hTcxCfg->pCurrentTnsConfig, spectrum, hTranDet, transform_type != TCX_20, ltp_gain, pTnsData, predictionGain ); + + + /* If TNS should be used then get the residual after applying it inplace in the spectrum */ + if ( *pfUseTns ) + { + ApplyTnsFilter( hTcxCfg->pCurrentTnsConfig, pTnsData, spectrum, 1 ); + } + + if ( transform_type == TCX_5 ) + { + /* undo rearrangement of LF sub-window lines prior to TNS analysis */ + if ( L_spec < L_frame / 2 ) + { + mvr2r( spectrum + L_spec / 2 + 8, spectrum + L_frame / 4 + 8, L_spec / 2 - 8 ); + mvr2r( spectrum + 8, spectrum + L_frame / 4, 8 ); + mvr2r( spectrum + 16, spectrum + 8, L_spec / 2 - 8 ); + set_zero( spectrum + L_spec / 2, L_frame / 4 - L_spec / 2 ); + set_zero( spectrum + L_frame / 4 + L_spec / 2, L_frame / 4 - L_spec / 2 ); + } + else + { + mvr2r( spectrum + 8, buff, 8 ); + mvr2r( spectrum + 16, spectrum + 8, L_frame / 4 - 8 ); + mvr2r( buff, spectrum + L_frame / 4, 8 ); + } + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * ShapeSpectrum() + * + * + *-------------------------------------------------------------------*/ + +void ShapeSpectrum( + TCX_CONFIG_HANDLE hTcxCfg, /* i : configuration of TCX */ + const float A[], /* i : quantized coefficients NxAz_q[M+1] */ + float gainlpc[], /* o : MDCT gains for the previous frame */ + const int16_t L_frame_glob, /* i : frame length */ + int16_t L_spec, /* i : length of the spectrum */ + float spectrum[], /* i/o: MDCT spectrum */ + const int16_t fUseTns, /* i : Flag indicating if TNS is used */ + Encoder_State *st, /* i/o: encoder state structure */ + float *scf /* i : scale factors */ +) +{ + TCX_ENC_HANDLE hTcxEnc = st->hTcxEnc; + int16_t i, sf_width, L_frame, tcx_offset; + float Ap[M + 2]; + float tmp, gamma1; + float max_low_pre = 0.f, max_high_pre = 0.f; + float sns_int_scf[FDNS_NPTS]; + int32_t total_brate = ( st->element_mode == IVAS_CPE_MDCT ? st->element_brate : st->total_brate ); + /*-----------------------------------------------------------* + * Init * + *-----------------------------------------------------------*/ + + /* Init lengths */ + L_frame = L_frame_glob; + tcx_offset = hTcxCfg->tcx_offset; + + gamma1 = st->gamma; + if ( st->enableTcxLpc ) + { + gamma1 = 1.0f; + } + + if ( st->element_mode != IVAS_CPE_MDCT ) /* in MDCT, this is already done outside the function */ + { + if ( st->last_core == ACELP_CORE ) + { + L_frame += tcx_offset; + L_spec += hTcxCfg->tcx_coded_lines >> 2; + if ( hTcxCfg->lfacNext < 0 ) + { + L_frame -= hTcxCfg->lfacNext; + } + } + } + + tcxGetNoiseFillingTilt( A, L_frame, ( total_brate >= ACELP_13k20 && !st->rf_mode ), &st->hTcxEnc->noiseTiltFactor ); + + /* Calculate Spectrum Flatness Measure for the TCX Concealment */ + if ( st->enablePlcWaveadjust ) + { + hTcxCfg->SFM2 = SFM_Cal( spectrum, min( 200, L_frame ) ); + } + + if ( ( total_brate <= ACELP_13k20 && st->bwidth == SWB ) ) + { + max_low_pre = 0.f; + for ( i = 0; i < L_frame; i++ ) + { + tmp = fabsf( spectrum[i] ); + if ( tmp > max_low_pre ) + { + max_low_pre = tmp; + } + } + + max_high_pre = 0.f; + for ( i = 0; i < L_spec - L_frame; i++ ) + { + tmp = fabsf( spectrum[L_frame + i] ); + if ( tmp > max_high_pre ) + { + max_high_pre = tmp; + } + } + } + + if ( st->element_mode == IVAS_CPE_MDCT ) + { + sns_interpolate_scalefactors( &sns_int_scf[0], scf, ENC ); + sns_shape_spectrum( spectrum, st->hTcxCfg->psychParamsCurrent, &sns_int_scf[0], L_frame ); + v_multc( spectrum + L_frame, sns_int_scf[hTcxCfg->psychParamsCurrent->nBands - 1], spectrum + L_frame, L_spec - L_frame ); + } + else + { + /*-----------------------------------------------------------* + * Pre-shaping in frequency domain using weighted LPC (Wz) * + *-----------------------------------------------------------*/ + + weight_a( A, Ap, gamma1, M ); + + lpc2mdct( Ap, M, gainlpc, FDNS_NPTS, 0 ); + + mdct_preShaping( spectrum, L_frame, gainlpc ); + + v_multc( spectrum + L_frame, 1.f / gainlpc[FDNS_NPTS - 1], spectrum + L_frame, L_spec - L_frame ); + } + + /* reduce the peaks in the IGF region, to make life of the core-coder easier... */ + if ( total_brate <= ACELP_13k20 && st->bwidth == SWB ) + { + int16_t dist_low, dist_high; + float max_fac; + float max_low, max_low1, max_low2, max_high; + + if ( hTcxEnc->tcx_lpc_shaped_ari ) + { + max_fac = 1.5f; + } + else + { + max_fac = 3.f; + } + + sf_width = L_frame / 2; + + max_low2 = 0.f; + dist_low = 0; + for ( i = 0; i < sf_width; i++ ) + { + tmp = fabsf( spectrum[L_frame - 1 - i] ); + if ( tmp > max_low2 ) + { + max_low2 = tmp; + dist_low = i; + } + } + + max_low1 = 0.f; + for ( i = 0; i < L_frame - sf_width; i++ ) + { + tmp = fabsf( spectrum[L_frame - sf_width - 1 - i] ); + if ( tmp > max_low1 ) + { + max_low1 = tmp; + } + if ( tmp > max_low2 ) + { + dist_low = sf_width + i; + } + } + + max_low = max( max_low1, max_low2 ); + + max_high = 0.f; + dist_high = 0; + for ( i = 0; i < L_spec - L_frame; i++ ) + { + tmp = fabsf( spectrum[L_frame + i] ); + if ( tmp > max_high ) + { + max_high = tmp; + dist_high = i; + } + } + + if ( ( 4.f * dist_high * max_high > dist_low * max_low ) && ( 16.f * max_low_pre > max_high_pre ) && ( max_high > max_fac * max_low2 ) ) + { + tmp = max_fac * max_low2 / max_high; + v_multc( spectrum + L_frame, tmp, spectrum + L_frame, L_spec - L_frame ); + } + } + + if ( st->element_mode != IVAS_CPE_MDCT && st->tcxonly && st->hTcxEnc->tcxltp && ( st->hTcxEnc->tcxltp_gain > 0.0f ) && !fUseTns ) + { + PsychAdaptLowFreqEmph( spectrum, gainlpc ); + } + + return; +} + + +/*-------------------------------------------------------------------* + * GetTransWidth() + * + * + *-------------------------------------------------------------------*/ + +static int16_t GetTransWidth( + const int16_t tcxonly, + const int16_t tcx10, + const float tcxltp_gain, + const int16_t hm_active ) +{ + int16_t noiseTransWidth = MIN_NOISE_FILLING_HOLE; + + if ( tcxonly ) + { + noiseTransWidth = HOLE_SIZE_FROM_LTP( max( tcxltp_gain, 0.3125f * hm_active ) ); + + if ( tcx10 ) + { + noiseTransWidth = 3; /* minimum transition for noise filling in TCX-10 */ + } + } + + return noiseTransWidth; +} + + +/*-----------------------------------------------------------* + * EstimateTCXNoiseLevel() + * + * Estimate and quantize noise factor * + *-----------------------------------------------------------*/ + +static void EstimateTCXNoiseLevel( + Encoder_State *st, /* i : encoder state handle */ + const float x_orig[], /* i : shaped MDCT spectrum */ + float spectrum[], /* i/o: quantized MDCT spectrum */ + const float gain_tcx, /* i : global gain */ + const int16_t L_frame, /* i : frame length */ + const int16_t noiseFillingBorder, /* i : noise filling border */ + const int16_t hm_active, /* i : flag indicating if the harmonic model is active */ + float *fac_ns, /* o : noise filling level */ + int16_t *fac_ns_q /* o : quantized noise filling level */ +) +{ + int16_t maxNfCalcBw, iStart, noiseTransWidth; + TCX_ENC_HANDLE hTcxEnc = st->hTcxEnc; + + maxNfCalcBw = min( noiseFillingBorder, (int16_t) ( hTcxEnc->measuredBwRatio * (float) L_frame + 0.5f ) ); + + if ( st->total_brate >= HQ_96k ) + { + *fac_ns = 0.0f; + *fac_ns_q = 0; + } + else + { + const int16_t minLevel = ( hTcxEnc->tcx_lpc_shaped_ari && st->element_mode > IVAS_SCE ? 0 : 1 ); + iStart = L_frame / ( ( st->total_brate >= ACELP_13k20 && !st->rf_mode ) ? 6 : 8 ); /* noise filling start bin*/ + noiseTransWidth = GetTransWidth( st->tcxonly, ( L_frame == st->L_frame >> 1 ), st->hTcxEnc->tcxltp_gain, ( st->hTcxCfg->ctx_hm && st->last_core != ACELP_CORE && hm_active ) ); + tcx_noise_factor( x_orig, spectrum, iStart, maxNfCalcBw, noiseTransWidth, L_frame, gain_tcx, hTcxEnc->noiseTiltFactor, fac_ns, fac_ns_q, st->element_mode ); + + /* hysteresis for very tonal passages (more stationary noise filling level) */ + if ( *fac_ns_q == minLevel ) + { + hTcxEnc->noiseLevelMemory_cnt = (int16_t) min( INT16_MAX, 1 + abs( hTcxEnc->noiseLevelMemory_cnt ) ); /* update counter */ + } + else + { + if ( ( *fac_ns_q == minLevel + 1 ) && ( abs( hTcxEnc->noiseLevelMemory_cnt ) > 5 ) ) + { + *fac_ns_q = minLevel; /* reduce noise filling level by one step */ + *fac_ns = minLevel * 0.75f / ( 1 << NBITS_NOISE_FILL_LEVEL ); + + /* signal that noise level is changed by inverting sign of level memory */ + hTcxEnc->noiseLevelMemory_cnt = ( hTcxEnc->noiseLevelMemory_cnt < 0 ) ? 5 : -1 - hTcxEnc->noiseLevelMemory_cnt; + } + else + { + hTcxEnc->noiseLevelMemory_cnt = 0; /* reset memory since level is too different */ + } + } + } /* bitrate */ + + return; +} + + +/*-----------------------------------------------------------* + * EstimateStereoTCXNoiseLevel() + * + * Estimate and quantize stereo noise factors + *-----------------------------------------------------------*/ + +void EstimateStereoTCXNoiseLevel( + Encoder_State **sts, /* i : state handle */ + float *q_spectrum[CPE_CHANNELS][NB_DIV], /* i : quantized MDCT spectrum */ + float gain_tcx[][NB_DIV], /* i : global gain */ + int16_t L_frame[][NB_DIV], /* i : frame length */ + int16_t noiseFillingBorder[][NB_DIV], /* i : noise filling border */ + int16_t hm_active[][NB_DIV], /* i : flag indicating if the harmonic model is active */ + const int16_t ignore_chan[], /* i : flag indicating whether the channel should be ignored */ + float fac_ns[][NB_DIV], /* o : noise filling level */ + int16_t param_core[][NB_DIV * NPRM_DIV], /* o : quantized noise filling level */ + const int16_t MCT_flag /* i : hMCT handle allocated (1) or not (0) */ +) +{ + int16_t ch, n; + int16_t nSubframes, maxNfCalcBw, iStart, noiseTransWidth; + float smooth_gain; + float combined_q_spectrum[N_MAX]; + int16_t *fac_ns_q; + int32_t total_brate; + + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + Encoder_State *st = sts[ch]; + TCX_ENC_HANDLE hTcxEnc = st->hTcxEnc; + + nSubframes = ( st->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; + + if ( ignore_chan[ch] ) + { + continue; + } + total_brate = ( st->element_mode == IVAS_CPE_MDCT && !MCT_flag ) ? st->element_brate : st->total_brate; + + for ( n = 0; n < nSubframes; n++ ) + { + fac_ns_q = param_core[ch] + n * NPRM_DIV + 1; + maxNfCalcBw = min( noiseFillingBorder[ch][n], (int16_t) ( hTcxEnc->measuredBwRatio * (float) L_frame[ch][n] + 0.5f ) ); + if ( ( total_brate >= HQ_96k && ( st->element_mode <= IVAS_SCE || st->bwidth < SWB ) ) || total_brate > IVAS_192k ) + { + fac_ns[ch][n] = 0.0f; + *fac_ns_q = 0; + } + else + { + iStart = L_frame[ch][n] / ( ( total_brate >= ACELP_13k20 && !st->rf_mode ) ? 6 : 8 ); /* noise filling start bin*/ + + if ( n == 0 ) + { + mvr2r( hTcxEnc->ltpGainMemory, &hTcxEnc->ltpGainMemory[1], N_LTP_GAIN_MEMS - 1 ); + hTcxEnc->ltpGainMemory[0] = st->hTcxEnc->tcxltp_gain; + } + + smooth_gain = dotp( hTcxEnc->ltpGainMemory, nf_tw_smoothing_coeffs, N_LTP_GAIN_MEMS ); + + noiseTransWidth = GetTransWidth( st->tcxonly, ( L_frame[ch][n] == st->L_frame >> 1 ), smooth_gain, ( st->hTcxCfg->ctx_hm && st->last_core != ACELP_CORE && hm_active[ch][n] ) ); + + mvr2r( q_spectrum[ch][n], combined_q_spectrum, L_frame[ch][n] ); + tcx_noise_factor( hTcxEnc->spectrum[n], combined_q_spectrum, iStart, maxNfCalcBw, noiseTransWidth, L_frame[ch][n], gain_tcx[ch][n], hTcxEnc->noiseTiltFactor, &fac_ns[ch][n], fac_ns_q, st->element_mode ); + + /* hysteresis for very tonal passages (more stationary noise filling level) */ + if ( *fac_ns_q == 1 ) + { + hTcxEnc->noiseLevelMemory_cnt = (int16_t) min( INT16_MAX, 1 + abs( hTcxEnc->noiseLevelMemory_cnt ) ); /* update counter */ + } + else + { + if ( ( *fac_ns_q == 2 ) && ( abs( hTcxEnc->noiseLevelMemory_cnt ) > 5 ) ) + { + *fac_ns_q = 1; /* reduce noise filling level by one step */ + fac_ns[ch][n] = 0.75f / ( 1 << NBITS_NOISE_FILL_LEVEL ); + + /* signal that noise level is changed by inverting sign of level memory */ + hTcxEnc->noiseLevelMemory_cnt = ( hTcxEnc->noiseLevelMemory_cnt < 0 ) ? 5 : -1 - hTcxEnc->noiseLevelMemory_cnt; + } + else + { + hTcxEnc->noiseLevelMemory_cnt = 0; /* reset memory since level is too different */ + } + } + } /* bitrate */ + } + } + + return; +} + + +/*-----------------------------------------------------------* + * DecideTonalSideInfo() + * + * + *-----------------------------------------------------------*/ + +static int16_t DecideTonalSideInfo( + const float spectrum[], + const int16_t L_frame_glob, + float SFM2 ) +{ + float SFM, K, K2; + int16_t Tonal_SideInfo; + + SFM = SFM_Cal( spectrum, min( 200, L_frame_glob ) ); + + if ( L_frame_glob <= 256 ) + { + K = 0.4f; + K2 = 0.1f; + } + else if ( L_frame_glob == 320 || L_frame_glob == 512 ) + { + K = 0.4f; + K2 = 0.1f; + } + else /*FrameSize_Core == 640*/ + { + K = 0.35f; + K2 = 0.04f; + } + + + Tonal_SideInfo = 0; + if ( SFM < K ) + { + Tonal_SideInfo = 1; + } + + if ( SFM2 < K2 ) + { + Tonal_SideInfo = 1; + } + + return Tonal_SideInfo; +} + +/*-----------------------------------------------------------* + * QuantizeTCXSpectrum() + * + * + *-----------------------------------------------------------*/ + +void QuantizeTCXSpectrum( + Encoder_State *st, /* i : state handle */ + const int16_t frame_cnt, /* i : frame counter in the super_frame */ + const float *x_orig, /* i : shaped MDCT spectrum */ + const float *gainlpc, /* i : FDNS gains */ + const Word16 *Aqind, /* i : frame-independent quantized coefficients (M+1) */ + const int16_t tnsSize, /* i : number of tns parameters put into prm */ + const int16_t nb_bits, /* i : bit budget */ + const int16_t vad_hover_flag, /* i : VAD hangover flag */ + int16_t *pL_frameTCX, /* o : full frame length */ + int16_t *pL_frame, /* o : frame length */ + int16_t *pL_spec, /* o : length of the coded spectrum */ + int16_t *ptcx_offset, /* o : folding point offset relative to the end of the previous frame */ + int16_t *pnoiseFillingBorder, /* o : noise filling border */ + float spectrum[], /* o : quantized MDCT spectrum */ + CONTEXT_HM_CONFIG *hm_cfg, /* o : Context-based harmonic model configuration */ + int16_t *hm_active, /* o : flag indicating if the harmonic model is active */ + float lf_deemph_fact[], /* o : low frequency deemphasis factors */ + int16_t *nf_seed, /* o : noise filling random seed */ + float *ener, /* o : energy of the quantized spectrum */ + float *gain_tcx, /* o : global gain */ + int16_t prm[] /* o : tcx parameters */ +) +{ + TCX_ENC_HANDLE hTcxEnc = st->hTcxEnc; + int16_t i, L_frame, L_frameTCX, L_spec, tcx_offset; + int16_t noiseFillingBorder, LtpPitchLag, PeriodicityIndex; + float sqGain, gain_tcx_opt, RelativeScore; + int16_t lastnzCtxHm, lastnz; + int16_t stop; + int16_t nEncodedCtxHm, stopCtxHm, sqBitsCtxHm, Selector; + int16_t nEncoded, sqBits_noStop; + int16_t NumIndexBits, signaling_bits, sqTargetBits, sqBits, ctxHmBits, resQBits, resQTargetBits; + int16_t *prm_ltp, *prm_tns, *prm_hm, *prm_lastnz, *sqQ, *prm_target; + float att; + int32_t total_brate; + + /*-----------------------------------------------------------* + * Init * + *-----------------------------------------------------------*/ + + sqGain = 1.0f; + resQTargetBits = 0; + + NumIndexBits = 0; + sqBits = 0; + ctxHmBits = 0; + resQBits = 0; + prm_ltp = &prm[1 + NOISE_FILL_RANGES]; + prm_tns = prm_ltp + LTPSIZE; + prm_hm = prm_tns + tnsSize; + prm_lastnz = prm_hm + 2; + sqQ = prm_hm + NPRM_CTX_HM; + + total_brate = ( st->element_mode == IVAS_CPE_MDCT ) ? st->element_brate : st->total_brate; + + /*-----------------------------------------------------------* + * Init lengths * + *-----------------------------------------------------------*/ + + L_frame = st->L_frame; + L_frameTCX = hTcxEnc->L_frameTCX; + L_spec = st->hTcxCfg->tcx_coded_lines; + tcx_offset = st->hTcxCfg->tcx_offset; + + if ( st->core == TCX_10_CORE ) + { + L_frame /= 2; + L_frameTCX /= 2; + L_spec /= 2; + } + else if ( st->last_core == ACELP_CORE ) + { + st->hTcxCfg->last_aldo = 0; + + L_frame += tcx_offset; + L_frameTCX += st->hTcxCfg->tcx_offsetFB; + L_spec += st->hTcxCfg->tcx_coded_lines >> 2; + + if ( st->hTcxCfg->lfacNext < 0 ) + { + L_frame -= st->hTcxCfg->lfacNext; + L_frameTCX -= st->hTcxCfg->lfacNextFB; + tcx_offset = st->hTcxCfg->lfacNext; + } + else + { + tcx_offset = 0; + } + hTcxEnc->noiseLevelMemory_cnt = 0; + } + + *pL_frameTCX = L_frameTCX; + *pL_frame = L_frame; + *pL_spec = L_spec; + *ptcx_offset = tcx_offset; + + /* target bitrate for SQ */ + sqTargetBits = nb_bits - NBITS_TCX_GAIN - NBITS_NOISE_FILL_LEVEL; + + if ( st->enablePlcWaveadjust ) + { + st->Tonal_SideInfo = DecideTonalSideInfo( x_orig, ( st->core == TCX_20_CORE ) ? st->L_frame : st->L_frame / 2, st->hTcxCfg->SFM2 ); + } + + /* Start with the pre-shaped spectrum*/ + mvr2r( x_orig, spectrum, L_spec ); + + /*-----------------------------------------------------------* + * Bandwidth Limitation * + *-----------------------------------------------------------*/ + + noiseFillingBorder = L_spec; + if ( st->igf ) + { + noiseFillingBorder = st->hIGFEnc->infoStartLine; + } + *pnoiseFillingBorder = noiseFillingBorder; + + if ( st->igf ) + { + for ( i = st->hIGFEnc->infoStopLine; i < max( L_frame, L_frameTCX ); i++ ) + { + spectrum[i] = 0.0f; + } + } + else + { + for ( i = noiseFillingBorder; i < max( L_frame, L_frameTCX ); i++ ) + { + spectrum[i] = 0.0f; + } + } + + /*-----------------------------------------------------------* + * Quantization * + *-----------------------------------------------------------*/ + + if ( !hTcxEnc->tcx_lpc_shaped_ari ) + { + /* context based arithmetic coder */ + + /* initialize signaling to default, i.e. context based AC is inactive */ + prm_hm[0] = 0; + prm_hm[1] = -1; + + /* Fast estimation of the scalar quantizer step size */ + if ( st->hTcxCfg->ctx_hm && st->last_core != ACELP_CORE ) + { + LtpPitchLag = ( ( !st->tcxonly ) && ( hTcxEnc->tcxltp_pitch_int < st->L_frame ) ? ( ( 2 * st->L_frame * st->pit_res_max ) << kLtpHmFractionalResolution ) / ( hTcxEnc->tcxltp_pitch_int * st->pit_res_max + hTcxEnc->tcxltp_pitch_fr ) : -1 ); + + ++ctxHmBits; /* ContextHM flag */ + --sqTargetBits; /* ContextHM flag */ + + PeriodicityIndex = SearchPeriodicityIndex( spectrum, NULL, L_spec, sqTargetBits, LtpPitchLag, hTcxEnc->tcxltp ? hTcxEnc->tcxltp_gain : -1.0f, &RelativeScore ); + + NumIndexBits = CountIndexBits( L_spec >= 256, PeriodicityIndex ); + + if ( st->element_mode > EVS_MONO ) + { + ConfigureContextHm( L_spec, sqTargetBits - NumIndexBits, PeriodicityIndex, LtpPitchLag, hm_cfg ); + } + else + { + ConfigureContextHm( L_spec, sqTargetBits, PeriodicityIndex, LtpPitchLag, hm_cfg ); + } + + /* Quantize original spectrum */ + sqGain = SQ_gain( spectrum, (int16_t) ( hTcxEnc->tcx_target_bits_fac * (float) sqTargetBits ), L_spec ); + + tcx_scalar_quantization( spectrum, sqQ, L_spec, sqGain, st->hTcxCfg->sq_rounding, hTcxEnc->memQuantZeros, st->tcxonly ); + + /* Estimate original bitrate */ + stop = 0; + if ( st->element_mode > EVS_MONO ) + { + sqBits = RCcontextMapping_encode2_estimate_no_mem_s17_LCS( sqQ, L_spec, &lastnz, &nEncoded, sqTargetBits, &stop, 0, NULL ); + } + else + { + sqBits = ACcontextMapping_encode2_estimate_no_mem_s17_LC( sqQ, L_spec, &lastnz, &nEncoded, sqTargetBits, &stop, NULL ); + } + + /* Estimate context mapped bitrate */ + stopCtxHm = 0; + + /* Context Mapping */ + if ( st->element_mode > EVS_MONO ) + { + sqBitsCtxHm = RCcontextMapping_encode2_estimate_no_mem_s17_LCS( sqQ, L_spec, &lastnzCtxHm, &nEncodedCtxHm, sqTargetBits - NumIndexBits, &stopCtxHm, 0, hm_cfg ); + } + else + { + sqBitsCtxHm = ACcontextMapping_encode2_estimate_no_mem_s17_LC( sqQ, L_spec, &lastnzCtxHm, &nEncodedCtxHm, sqTargetBits - NumIndexBits, &stopCtxHm, hm_cfg ); + } + + /* Decide whether or not to use context mapping */ + Selector = max( stop, sqBits ) - ( max( stopCtxHm, sqBitsCtxHm ) + NumIndexBits ); + + if ( Selector > 2 || ( abs( Selector ) <= 2 && kCtxHmOlRSThr < RelativeScore ) ) + { + /* CtxHm is likely better */ + sqTargetBits -= NumIndexBits; + ctxHmBits += NumIndexBits; + prm_hm[0] = 1; + prm_hm[1] = PeriodicityIndex; + *prm_lastnz = lastnzCtxHm; + sqBits_noStop = sqBits = sqBitsCtxHm; + nEncoded = nEncodedCtxHm; + stop = stopCtxHm; + } + else + { + /* Original is better or not much difference */ + prm_hm[0] = 0; + prm_hm[1] = PeriodicityIndex; + *prm_lastnz = lastnz; + PeriodicityIndex = -1; + + sqBits_noStop = sqBits; + } + + if ( stop != 0 ) + { + sqBits = stop; + } + } + else + { + /* no context hm*/ + PeriodicityIndex = -1; + + if ( st->element_mode == IVAS_CPE_MDCT ) + { + sqGain = SQ_gain_estimate( spectrum, (int16_t) ( hTcxEnc->tcx_target_bits_fac * (float) sqTargetBits ), L_spec ); + } + else + { + sqGain = SQ_gain( spectrum, (int16_t) ( hTcxEnc->tcx_target_bits_fac * (float) sqTargetBits ), L_spec ); + } + + /* Quantize spectrum */ + tcx_scalar_quantization( spectrum, sqQ, L_spec, sqGain, st->hTcxCfg->sq_rounding, hTcxEnc->memQuantZeros, st->tcxonly ); + + /* Estimate bitrate */ + stop = 0; + if ( st->element_mode > EVS_MONO ) + { + sqBits_noStop = sqBits = RCcontextMapping_encode2_estimate_no_mem_s17_LCS( sqQ, L_spec, prm_lastnz, &nEncoded, sqTargetBits, &stop, 0, NULL ); + } + else + { + sqBits_noStop = sqBits = ACcontextMapping_encode2_estimate_no_mem_s17_LC( sqQ, L_spec, prm_lastnz, &nEncoded, sqTargetBits, &stop, NULL ); + } + + if ( stop != 0 ) + { + sqBits = stop; + } + } /* end of if (ctx_hm) */ + + /* Adjust correction factor */ + if ( ( L_spec & ( L_spec - 1 ) ) == 0 ) + { + /* power-of-2 */ + hTcxEnc->tcx_target_bits_fac *= (float) sqTargetBits / (float) ( sqBits + 1 ); + } + else + { + hTcxEnc->tcx_target_bits_fac *= (float) sqTargetBits / (float) sqBits; + } + + if ( hTcxEnc->tcx_target_bits_fac > 1.25 ) + { + hTcxEnc->tcx_target_bits_fac = 1.25; + } + if ( hTcxEnc->tcx_target_bits_fac < 0.75 ) + { + hTcxEnc->tcx_target_bits_fac = 0.75; + } + + /* Refine quantizer step size with a rate-control-loop (optional) */ + sqBits = tcx_scalar_quantization_rateloop( spectrum, sqQ, L_spec, &sqGain, st->hTcxCfg->sq_rounding, hTcxEnc->memQuantZeros, prm_lastnz, /* lastnz */ sqTargetBits, &nEncoded, &stop, sqBits_noStop, sqBits, st->hTcxCfg->tcxRateLoopOpt, st->tcxonly, PeriodicityIndex >= 0 ? hm_cfg : NULL, ( st->element_mode == IVAS_CPE_MDCT ? 2 : 4 ), st->element_mode ); + + if ( ctxHmBits > 0 ) + { + /* Mapping tool is enabled */ + /* Truncate spectrum */ + for ( i = nEncoded; i < L_spec; i++ ) + { + if ( st->element_mode > EVS_MONO ) + { + break; + } + else + { + sqQ[i] = 0; + } + } + + if ( PeriodicityIndex >= 0 ) + { + /* Mapping is used */ + /* Estimate non-mapped bitrate */ + stopCtxHm = 1; + if ( st->element_mode > EVS_MONO ) + { + /* Fix: Use updated value for target bits (sqTargetBits + NumIndexBits) before computing non-mapped estimate */ + sqBitsCtxHm = RCcontextMapping_encode2_estimate_no_mem_s17_LCS( sqQ, L_spec, &lastnz, &nEncodedCtxHm, sqTargetBits + NumIndexBits, &stopCtxHm, 0, NULL ); + } + else + { + sqBitsCtxHm = ACcontextMapping_encode2_estimate_no_mem_s17_LC( sqQ, L_spec, &lastnz, &nEncodedCtxHm, sqTargetBits, &stopCtxHm, NULL ); + } + + /* Decide whether or not to revert mapping */ + Selector = sqBits - ( sqBitsCtxHm + NumIndexBits ); + + if ( st->element_mode > EVS_MONO ) + { + if ( ( stopCtxHm == 0 && Selector > 0 ) || stop ) /* If overflow occured with mapped, select non-mapped */ + { + /* Non-mapped is better */ + sqTargetBits += NumIndexBits; + ctxHmBits -= NumIndexBits; + prm_hm[0] = 0; + *prm_lastnz = lastnz; + PeriodicityIndex = -1; + sqBits_noStop = sqBits = sqBitsCtxHm; + nEncoded = nEncodedCtxHm; + stop = stopCtxHm; + } + } + else + { + if ( stopCtxHm == 0 && Selector > 0 ) + { + /* Non-mapped is better */ + sqTargetBits += NumIndexBits; + ctxHmBits -= NumIndexBits; + prm_hm[0] = 0; + *prm_lastnz = lastnz; + PeriodicityIndex = -1; + sqBits_noStop = sqBits = sqBitsCtxHm; + nEncoded = nEncodedCtxHm; + stop = stopCtxHm; + } + } + } + else + { + /* Mapping is not used */ + if ( st->element_mode > EVS_MONO ) + { + /* Truncate Spectrum */ + for ( i = nEncoded; i < L_spec; i++ ) + { + sqQ[i] = 0; + } + } + /* Estimate mapped bitrate */ + stopCtxHm = 1; + if ( st->element_mode > EVS_MONO ) + { + sqBitsCtxHm = RCcontextMapping_encode2_estimate_no_mem_s17_LCS( sqQ, L_spec, &lastnzCtxHm, &nEncodedCtxHm, sqTargetBits - NumIndexBits, &stopCtxHm, 0, hm_cfg ); + } + else + { + sqBitsCtxHm = ACcontextMapping_encode2_estimate_no_mem_s17_LC( sqQ, L_spec, &lastnzCtxHm, &nEncodedCtxHm, sqTargetBits - NumIndexBits, &stopCtxHm, hm_cfg ); + } + + /* Decide whether or not to use mapping */ + Selector = sqBits - ( sqBitsCtxHm + NumIndexBits ); + + if ( stopCtxHm == 0 && Selector > 0 ) + { + /* Mapped is better */ + sqTargetBits -= NumIndexBits; + ctxHmBits += NumIndexBits; + prm_hm[0] = 1; + *prm_lastnz = lastnzCtxHm; + PeriodicityIndex = prm_hm[1]; + sqBits_noStop = sqBits = sqBitsCtxHm; + nEncoded = nEncodedCtxHm; + stop = stopCtxHm; + } + } + } + + /* Limit low sqGain for avoiding saturation of the gain quantizer*/ + if ( st->hTcxCfg->tcxRateLoopOpt < 3 && sqGain < sqrt( (float) NORM_MDCT_FACTOR / (float) L_spec ) ) + { + sqGain = (float) sqrt( (float) NORM_MDCT_FACTOR / (float) L_spec ); + + tcx_scalar_quantization( spectrum, sqQ, L_spec, sqGain, st->hTcxCfg->sq_rounding, hTcxEnc->memQuantZeros, st->tcxonly ); + + stop = 1; + if ( st->element_mode > EVS_MONO ) + { + /* Ensure non-mapped estimation is used for limiting low sqGain considering that this refinement occurs very rarely */ + PeriodicityIndex = -1; + if ( prm_hm[0] == 1 ) + { + prm_hm[0] = 0; + sqTargetBits += NumIndexBits; + ctxHmBits -= NumIndexBits; + } + sqBits = RCcontextMapping_encode2_estimate_no_mem_s17_LCS( sqQ, L_spec, prm_lastnz, &nEncoded, sqTargetBits, &stop, 0, NULL ); + } + else + { + sqBits = ACcontextMapping_encode2_estimate_no_mem_s17_LC( sqQ, L_spec, prm_lastnz, &nEncoded, sqTargetBits, &stop, PeriodicityIndex >= 0 ? hm_cfg : NULL ); + } + } + + /* Truncate spectrum (for CBR) */ + if ( stop ) + { + for ( i = nEncoded; i < L_spec; i++ ) + { + sqQ[i] = 0; + } + } + + /* Save quantized Values */ + *nf_seed = 0; + for ( i = 0; i < L_spec; i++ ) + { + spectrum[i] = (float) sqQ[i]; + /* noise filling seed */ + *nf_seed += (int16_t) ( abs( sqQ[i] ) * i * 2 ); + } + } + else + { + /* low rates: envelope based arithmetic coder */ + + AdaptLowFreqEmph( spectrum, NULL, 0.f, 1, gainlpc, L_frame ); + + prm_target = sqQ; + sqQ = prm_target + 1; + + LtpPitchLag = ( ( hTcxEnc->tcxltp_pitch_int < st->L_frame ) ? ( ( 2 * st->L_frame * st->pit_res_max ) << kLtpHmFractionalResolution ) / ( st->hTcxEnc->tcxltp_pitch_int * st->pit_res_max + hTcxEnc->tcxltp_pitch_fr ) : -1 ); + + tcx_arith_encode_envelope( spectrum, hm_cfg->indexBuffer, L_frame, L_spec, st, Aqind, sqTargetBits, sqQ, st->last_core != ACELP_CORE, prm_hm, /* HM parameter area */ LtpPitchLag, &sqBits, &signaling_bits, ( st->bwidth > WB ) ? 1 : 0 ); + + sqTargetBits -= signaling_bits; + *prm_target = sqTargetBits; + + /* Noise filling seed */ + *nf_seed = 0; + for ( i = 0; i < noiseFillingBorder; ++i ) + { + *nf_seed += (int16_t) ( abs( (int16_t) spectrum[i] ) * i * 2 ); + } + } + + *hm_active = prm_hm[0]; + + /*-----------------------------------------------------------* + * Compute optimal TCX gain. * + *-----------------------------------------------------------*/ + + if ( lf_deemph_fact != NULL ) + { + /* initialize LF deemphasis factors in lf_deemph_fact */ + for ( i = 0; i < L_spec; i++ ) + { + lf_deemph_fact[i] = 1.0f; + } + } + + if ( !st->tcxonly ) + { + AdaptLowFreqDeemph( spectrum, hTcxEnc->tcx_lpc_shaped_ari, gainlpc, L_frame, lf_deemph_fact ); + } + + assert( x_orig != spectrum ); + gain_tcx_opt = get_gain( x_orig, spectrum, L_spec, ener ); + + if ( gain_tcx_opt <= 0.0f ) + { + gain_tcx_opt = sqGain; + } + *gain_tcx = gain_tcx_opt; + + if ( st->element_mode == IVAS_CPE_DFT || st->element_mode == IVAS_CPE_TD ) + { + calculate_hangover_attenuation_gain( st, &att, vad_hover_flag ); + *gain_tcx *= att; + } + + /*-----------------------------------------------------------* + * Quantize TCX gain * + *-----------------------------------------------------------*/ + + /* gain quantization here in case of VBR unvoiced coding; fixes problems of uninitialized global gain values */ + if ( total_brate >= ACELP_13k20 && !st->rf_mode ) + { + tcx_QuantizeGain( L_spec, gain_tcx, &prm[0] ); + } + + /*-----------------------------------------------------------* + * Residual Quantization * + *-----------------------------------------------------------*/ + + if ( st->hTcxCfg->resq ) + { + resQTargetBits = sqTargetBits - sqBits; + + if ( hTcxEnc->tcx_lpc_shaped_ari ) + { + /* envelope based arithmetic coder */ + int16_t *prm_resq; + + prm_resq = sqQ + sqTargetBits - resQTargetBits; + + resQBits = tcx_ari_res_Q_spec( x_orig, hm_cfg->indexBuffer, spectrum, L_spec, *gain_tcx, prm_resq, resQTargetBits, resQBits, st->hTcxCfg->sq_rounding, lf_deemph_fact ); + + /* Transmit zeros when there bits remain after RESQ */ + for ( i = resQBits; i < resQTargetBits; ++i ) + { + prm_resq[i] = 0; + } + } + else + { + /* context based arithmetic coder */ + resQBits = tcx_res_Q_gain( gain_tcx_opt, gain_tcx, sqQ + L_spec, resQTargetBits ); + + resQBits = tcx_res_Q_spec( x_orig, spectrum, L_spec, *gain_tcx, sqQ + L_spec, resQTargetBits, resQBits, st->hTcxCfg->sq_rounding, st->tcxonly ? NULL : lf_deemph_fact ); + } + } + + /*-----------------------------------------------------------* + * ALFE tcx only bitrates * + *-----------------------------------------------------------*/ + + if ( st->element_mode != IVAS_CPE_MDCT ) + { + if ( st->tcxonly ) + { + if ( hTcxEnc->tcxltp && ( hTcxEnc->tcxltp_gain > 0.0f ) && !hTcxEnc->fUseTns[frame_cnt] ) + { + PsychAdaptLowFreqDeemph( spectrum, gainlpc, NULL ); + } + } + } + + + return; +} + + +/*-------------------------------------------------------------------* + * InternalTCXDecoder() + * + * + *-------------------------------------------------------------------*/ + +void InternalTCXDecoder( + Encoder_State *st, /* i/o: state handle */ + const int16_t frame_cnt, /* i : frame counter in the super_frame */ + const int16_t L_frameTCX, /* i : full frame length */ + const int16_t L_frame, /* i : frame length */ + const int16_t L_spec, /* i : length of the coded spectrum */ + const int16_t tcx_offset, /* i : folding point offset relative to the end of the previous frame */ + const int16_t noiseFillingBorder, /* i : noise filling border */ + const float *x_quant, /* i : quantized spectrum */ + const float ener, /* i : energy of the quantized spectrum */ + float lf_deemph_fact[], /* i/o: low frequency deemphasis factors */ + const float fac_ns, /* i : noise filling level */ + const int16_t nf_seed, /* i : noise filling random seed */ + const float *A, /* i : LPC representation of the FDNS gains */ + float *gainlpc, /* i/o: FDNS gains */ + const int16_t hm_active, /* i : flag indicating if the harmonic model is active */ + float gain_tcx, /* i/o: global gain / quantized global gain */ + float spectrum[], /* o : dequantized spectrum */ + float synth[], /* o : time domain signal */ + int16_t *gain_tcx_q /* o : quantized global gain (at low bitrates) */ +) +{ + TCX_ENC_HANDLE hTcxEnc = st->hTcxEnc; + int16_t i, iStart, noiseTransWidth; + int16_t tcx_last_overlap_mode, overlap; + int16_t nz; /* non-zero length in ALDO window*/ + int16_t aldo; /* ALDO flag in current frame*/ + float xn_buf[L_MDCT_OVLP_MAX + L_FRAME_PLUS + L_MDCT_OVLP_MAX]; + float Aq_old[M + 1]; + float sns_interpolated_scalefactors[FDNS_NPTS]; + + mvr2r( x_quant, spectrum, max( L_frame, L_spec ) ); + + /* Replication of ACELP formant enhancement for low rates */ + if ( st->total_brate < ACELP_13k20 || st->rf_mode ) + { + tcxFormantEnhancement( lf_deemph_fact, gainlpc, spectrum, L_frame ); + } + + /*-----------------------------------------------------------* + * Noise Filling. * + *-----------------------------------------------------------*/ + + if ( fac_ns > 0.0f ) + { + iStart = tcxGetNoiseFillingTilt( A, L_frame, ( st->total_brate >= ACELP_13k20 && !st->rf_mode ), &hTcxEnc->noiseTiltFactor ); + + noiseTransWidth = GetTransWidth( st->tcxonly, ( L_frame == st->L_frame >> 1 ), hTcxEnc->tcxltp_gain, ( st->hTcxCfg->ctx_hm && st->last_core != ACELP_CORE && hm_active ) ); + assert( st->element_mode != IVAS_CPE_MDCT ); + tcx_noise_filling( spectrum, nf_seed, iStart, noiseFillingBorder, noiseTransWidth, L_frame, hTcxEnc->noiseTiltFactor, fac_ns, NULL, st->element_mode ); + } + + if ( st->total_brate < ACELP_13k20 || st->rf_mode ) + { + /* partially recompute global gain (energy part), taking noise filling and formant enhancement into account */ + float ener_nf = 1e-6f; + for ( i = 0; i < L_spec; i++ ) + { + ener_nf += spectrum[i] * spectrum[i]; + } + gain_tcx *= (float) sqrt( ener / ener_nf ); + tcx_QuantizeGain( L_spec, &gain_tcx, gain_tcx_q ); + } + + /*end of noise filling*/ + + /*-----------------------------------------------------------* + * Noise shaping in frequency domain (1/Wz) * + *-----------------------------------------------------------*/ + + if ( st->element_mode == IVAS_CPE_MDCT ) + { + sns_interpolate_scalefactors( sns_interpolated_scalefactors, A, DEC ); + sns_shape_spectrum( spectrum, st->hTcxCfg->psychParamsCurrent, sns_interpolated_scalefactors, L_frame ); + } + else + { + mdct_noiseShaping( spectrum, L_frame, gainlpc, FDNS_NPTS ); + } + + /*-----------------------------------------------------------* + * Apply gain * + *-----------------------------------------------------------*/ + + if ( st->hTcxCfg->coder_type == INACTIVE ) + { + + gain_tcx *= st->hTcxCfg->na_scale; + } + + v_multc( spectrum, gain_tcx, spectrum, L_spec ); + + tcx_last_overlap_mode = st->hTcxCfg->tcx_last_overlap_mode; /* backup last TCX overlap mode */ + + if ( ( L_frame == st->L_frame >> 1 ) && st->tcxonly ) + { + int16_t L = L_frame; + + if ( ( st->hTcxCfg->fIsTNSAllowed && hTcxEnc->fUseTns[frame_cnt] != 0 ) || ( L_spec > L_frame ) ) + { + L = L_spec; + } + + tcxInvertWindowGrouping( st->hTcxCfg, xn_buf, spectrum, L, hTcxEnc->fUseTns[frame_cnt], st->last_core, tcx_last_overlap_mode, frame_cnt, 0 ); + } + + /*-----------------------------------------------------------* + * Temporal Noise Shaping Synthesis * + *-----------------------------------------------------------*/ + + if ( st->hTcxCfg->fIsTNSAllowed ) + { + SetTnsConfig( st->hTcxCfg, st->core == TCX_20_CORE, ( st->last_core == ACELP_CORE ) && ( frame_cnt == 0 ) ); + + /* Apply TNS to get the reconstructed signal */ + if ( hTcxEnc->fUseTns[frame_cnt] != 0 ) + { + ApplyTnsFilter( st->hTcxCfg->pCurrentTnsConfig, &hTcxEnc->tnsData[frame_cnt], spectrum, 0 ); + + if ( ( L_frame == st->L_frame >> 1 ) && ( st->tcxonly ) ) + { + if ( ( st->hTcxCfg->tcx_last_overlap_mode != FULL_OVERLAP ) || + ( ( st->hTcxCfg->tcx_curr_overlap_mode == FULL_OVERLAP ) && ( frame_cnt == 0 ) && ( tcx_last_overlap_mode == 0 ) ) ) + { + const int16_t L_win = L_spec >> 1; + + /* undo rearrangement of LF sub-window lines for TNS synthesis filter */ + if ( L_frame > L_spec ) + { + assert( 0 ); + } + else + { + mvr2r( spectrum + 8, xn_buf, L_win ); + mvr2r( xn_buf, spectrum + L_win, 8 ); + mvr2r( xn_buf + 8, spectrum + 8, L_win - 8 ); + } + } + } + } + } + + /*-----------------------------------------------------------* + * Compute inverse MDCT of spectrum[]. * + *-----------------------------------------------------------*/ + + lsp2a_stab( st->lsp_old, Aq_old, M ); + overlap = st->hTcxCfg->tcx_mdct_window_length; + nz = NS2SA( st->sr_core, N_ZERO_MDCT_NS ); + aldo = 0; + + if ( ( L_frame == st->L_frame >> 1 ) && ( st->tcxonly ) ) + { + if ( st->hTcxCfg->tcx_last_overlap_mode != FULL_OVERLAP ) + { + /* minimum or half overlap, two transforms, grouping into one window */ + float win[( L_FRAME_PLUS + L_MDCT_OVLP_MAX ) / 2]; + const int16_t L_win = L_frame >> 1; + const int16_t L_spec_TCX5 = max( L_frame, L_spec ) >> 1; + const int16_t L_ola = ( st->hTcxCfg->tcx_last_overlap_mode == MIN_OVERLAP ) ? st->hTcxCfg->tcx_mdct_window_min_length : st->hTcxCfg->tcx_mdct_window_half_length; + int16_t w; + + set_f( win, 0, ( L_FRAME_PLUS + L_MDCT_OVLP_MAX ) / 2 ); + set_zero( xn_buf, tcx_offset + ( L_ola >> 1 ) ); /* zero left end of buffer */ + + for ( w = 0; w < 2; w++ ) + { + if ( st->hTcxCfg->tcx_last_overlap_mode == MIN_OVERLAP ) + { + TCX_MDCT_Inverse( spectrum + w * L_spec_TCX5, win, L_ola, L_win - L_ola, L_ola, st->element_mode ); + } + else + { + TCX_MDCT_Inverse( spectrum + w * L_spec_TCX5, win, L_ola, L_win - L_ola, L_ola, st->element_mode ); + } + + tcx_windowing_synthesis_current_frame( win, st->hTcxCfg->tcx_aldo_window_2, st->hTcxCfg->tcx_mdct_window_half, st->hTcxCfg->tcx_mdct_window_minimum, L_ola, st->hTcxCfg->tcx_mdct_window_half_length, st->hTcxCfg->tcx_mdct_window_min_length, w == 0 && st->last_core == ACELP_CORE, ( w > 0 ) || ( w == 0 && tcx_last_overlap_mode == 2 ) ? MIN_OVERLAP : st->hTcxCfg->tcx_last_overlap_mode, st->hTcxEnc->acelp_zir, st->hTcxEnc->Txnq, NULL, Aq_old, st->hTcxCfg->tcx_mdct_window_trans, L_win, tcx_offset < 0 ? -tcx_offset : 0, ( w > 0 ) ? 1 : st->last_core, 0, 0 ); + + if ( w > 0 ) + { + tcx_windowing_synthesis_past_frame( xn_buf + tcx_offset - ( L_ola >> 1 ) + w * L_win, st->hTcxCfg->tcx_aldo_window_1_trunc, st->hTcxCfg->tcx_mdct_window_half, st->hTcxCfg->tcx_mdct_window_minimum, L_ola, st->hTcxCfg->tcx_mdct_window_half_length, st->hTcxCfg->tcx_mdct_window_min_length, 2 ); + } + + /* add part of current sub-window overlapping with previous window */ + v_add( win, xn_buf + tcx_offset - ( L_ola >> 1 ) + w * L_win, xn_buf + tcx_offset - ( L_ola >> 1 ) + w * L_win, L_ola ); + + /* copy new sub-window region not overlapping with previous window */ + mvr2r( win + L_ola, xn_buf + tcx_offset + ( L_ola >> 1 ) + w * L_win, L_win ); + } + + /* To assure that no garbage values are copied to Txnq */ + set_zero( xn_buf + L_frame + tcx_offset + ( L_ola >> 1 ), overlap - tcx_offset - ( L_ola >> 1 ) ); + } + else if ( ( frame_cnt == 0 ) && ( st->hTcxCfg->tcx_curr_overlap_mode == FULL_OVERLAP ) ) + { + /* special overlap attempt, two transforms, grouping into one window */ + float win[( L_FRAME_PLUS + L_MDCT_OVLP_MAX ) / 2]; + const int16_t L_win = L_frame >> 1; + const int16_t L_spec_TCX5 = max( L_frame, L_spec ) >> 1; + const int16_t L_ola = st->hTcxCfg->tcx_mdct_window_min_length; + int16_t w; + + set_f( win, 0, ( L_FRAME_PLUS + L_MDCT_OVLP_MAX ) / 2 ); + + /* Resize overlap (affect only asymmetric window)*/ + overlap = st->hTcxCfg->tcx_mdct_window_delay; + + /* 1st TCX-5 window, special MDCT with minimum overlap on right side */ + TCX_MDCT_Inverse( spectrum, win + L_win, 0, L_win - ( L_ola >> 1 ), L_ola, st->element_mode ); + + /* copy new sub-window region not overlapping with previous window */ + mvr2r( win + L_win, xn_buf + ( overlap >> 1 ), L_win + ( L_ola >> 1 ) ); + + /* 2nd TCX-5 window, regular MDCT with minimum overlap on both sides */ + TCX_MDCT_Inverse( spectrum + L_spec_TCX5, win, L_ola, L_win - L_ola, L_ola, st->element_mode ); + + tcx_windowing_synthesis_current_frame( win, st->hTcxCfg->tcx_aldo_window_2, st->hTcxCfg->tcx_mdct_window_half, st->hTcxCfg->tcx_mdct_window_minimum, L_ola, st->hTcxCfg->tcx_mdct_window_half_length, st->hTcxCfg->tcx_mdct_window_min_length, 0, /* left_rect */ + 2, /* left_mode */ st->hTcxEnc->acelp_zir, st->hTcxEnc->Txnq, NULL, Aq_old, st->hTcxCfg->tcx_mdct_window_trans, L_win, tcx_offset < 0 ? -tcx_offset : 0, 1, /* not st->last_core */ 0, 0 ); + + tcx_windowing_synthesis_past_frame( xn_buf + ( overlap >> 1 ) + L_win - ( L_ola >> 1 ), st->hTcxCfg->tcx_aldo_window_1_trunc, st->hTcxCfg->tcx_mdct_window_half, st->hTcxCfg->tcx_mdct_window_minimum, L_ola, st->hTcxCfg->tcx_mdct_window_half_length, st->hTcxCfg->tcx_mdct_window_min_length, 2 ); + + /* add part of current sub-window overlapping with previous window */ + v_add( win, xn_buf + ( overlap >> 1 ) + L_win - ( L_ola >> 1 ), xn_buf + ( overlap >> 1 ) + L_win - ( L_ola >> 1 ), L_ola ); + + /* copy new sub-window region not overlapping with previous window */ + mvr2r( win + L_ola, xn_buf + ( overlap >> 1 ) + L_win + ( L_ola >> 1 ), L_win ); + + /* extra folding-out on left side of win, for perfect reconstruction */ + for ( w = ( overlap >> 1 ); w < overlap; w++ ) + { + xn_buf[overlap - 1 - w] = -1.0f * xn_buf[w]; + } + + tcx_windowing_synthesis_current_frame( xn_buf, st->hTcxCfg->tcx_aldo_window_2, st->hTcxCfg->tcx_mdct_window_half, st->hTcxCfg->tcx_mdct_window_minimum, overlap, /*st->hTcxCfg->tcx_mdct_window_length*/ st->hTcxCfg->tcx_mdct_window_half_length, st->hTcxCfg->tcx_mdct_window_min_length, st->last_core == ACELP_CORE, 0, /* left_mode */ st->hTcxEnc->acelp_zir, st->hTcxEnc->Txnq, NULL, Aq_old, st->hTcxCfg->tcx_mdct_window_trans, L_win, tcx_offset < 0 ? -tcx_offset : 0, st->last_core, 0, 0 ); + } + else + { + /* default, i.e. maximum overlap, single transform, no grouping */ + TCX_MDCT_Inverse( spectrum, xn_buf, overlap, L_frame - overlap, overlap, st->element_mode ); + + tcx_windowing_synthesis_current_frame( xn_buf, st->hTcxCfg->tcx_aldo_window_2, st->hTcxCfg->tcx_mdct_window_half, st->hTcxCfg->tcx_mdct_window_minimum, overlap, /*st->hTcxCfg->tcx_mdct_window_length*/ st->hTcxCfg->tcx_mdct_window_half_length, st->hTcxCfg->tcx_mdct_window_min_length, st->last_core == ACELP_CORE, ( frame_cnt > 0 ) && ( tcx_last_overlap_mode == 0 ) && ( st->last_core != ACELP_CORE ) ? 2 : tcx_last_overlap_mode, st->hTcxEnc->acelp_zir, st->hTcxEnc->Txnq, NULL, Aq_old, st->hTcxCfg->tcx_mdct_window_trans, st->L_frame >> 2, tcx_offset < 0 ? -tcx_offset : 0, st->last_core, 0, 0 ); + + } /* tcx_last_overlap_mode != FULL_OVERLAP */ + } + else + { + /* frame is TCX-20 or not TCX-only */ + if ( st->hTcxCfg->tcx_last_overlap_mode != TRANSITION_OVERLAP ) + { + float tmp[L_FRAME_PLUS]; + + edct( spectrum, xn_buf + overlap / 2 + nz, L_frame, st->element_mode ); + + v_multc( xn_buf + overlap / 2 + nz, (float) sqrt( (float) L_frame / NORM_MDCT_FACTOR ), tmp, L_frame ); + + window_ola( tmp, xn_buf, st->hTcxEnc->old_out, L_frame, st->hTcxCfg->tcx_last_overlap_mode, st->hTcxCfg->tcx_curr_overlap_mode, 0, 0, NULL ); + aldo = 1; + } + else + { + TCX_MDCT_Inverse( spectrum, xn_buf, overlap, L_frame - overlap, overlap, st->element_mode ); + + /* Windowing, overlap and add */ + /* Window current frame */ + tcx_windowing_synthesis_current_frame( xn_buf, st->hTcxCfg->tcx_aldo_window_2, st->hTcxCfg->tcx_mdct_window_half, st->hTcxCfg->tcx_mdct_window_minimum, overlap, /*st->hTcxCfg->tcx_mdct_window_length*/ st->hTcxCfg->tcx_mdct_window_half_length, st->hTcxCfg->tcx_mdct_window_min_length, st->last_core == ACELP_CORE, st->hTcxCfg->tcx_last_overlap_mode, /*left mode*/ st->hTcxEnc->acelp_zir, st->hTcxEnc->Txnq, NULL, Aq_old, st->hTcxCfg->tcx_mdct_window_trans, st->L_frame >> 1, tcx_offset < 0 ? -tcx_offset : 0, st->last_core, 0, 0 ); + } + } /* TCX-20/TCX-10 and TCX-only */ + + /* Window and overlap-add past frame if past frame is TCX */ + if ( st->last_core > ACELP_CORE && ( ( ( L_frameTCX == hTcxEnc->L_frameTCX >> 1 ) && ( st->tcxonly ) ) || ( st->hTcxCfg->tcx_last_overlap_mode == TRANSITION_OVERLAP ) ) ) + { + if ( st->hTcxCfg->last_aldo ) + { + for ( i = 0; i < overlap - st->hTcxCfg->tcx_mdct_window_min_length; i++ ) + { + xn_buf[i] += st->hTcxEnc->old_out[i + nz]; + } + /* fade truncated ALDO window */ + for ( ; i < overlap; i++ ) + { + xn_buf[i] += st->hTcxEnc->old_out[i + nz] * st->hTcxCfg->tcx_mdct_window_minimum[overlap - 1 - i]; + } + } + else + { + if ( frame_cnt > 0 && tcx_last_overlap_mode == 0 && st->hTcxCfg->tcx_curr_overlap_mode == FULL_OVERLAP && st->last_core != ACELP_CORE ) + { + tcx_last_overlap_mode = 2; /* use minimum overlap between the two TCX-10 windows */ + } + + tcx_windowing_synthesis_past_frame( st->hTcxEnc->Txnq, st->hTcxCfg->tcx_aldo_window_1_trunc, st->hTcxCfg->tcx_mdct_window_half, st->hTcxCfg->tcx_mdct_window_minimum, overlap, st->hTcxCfg->tcx_mdct_window_half_length, st->hTcxCfg->tcx_mdct_window_min_length, ( tcx_last_overlap_mode == 0 || st->hTcxCfg->tcx_last_overlap_mode == MIN_OVERLAP ) ? st->hTcxCfg->tcx_last_overlap_mode : tcx_last_overlap_mode ); + + for ( i = 0; i < overlap; i++ ) + { + xn_buf[i] += st->hTcxEnc->Txnq[i]; + } + } + } + + if ( !aldo && ( ( ( L_frameTCX == hTcxEnc->L_frameTCX >> 1 ) && frame_cnt > 0 ) || L_frameTCX != ( hTcxEnc->L_frameTCX >> 1 ) ) ) + { + /*Compute windowed synthesis in case of switching to ALDO windows in next frame*/ + mvr2r( xn_buf + L_frame - nz, st->hTcxEnc->old_out, nz + overlap ); + set_zero( st->hTcxEnc->old_out + nz + overlap, nz ); + + tcx_windowing_synthesis_past_frame( st->hTcxEnc->old_out + nz, st->hTcxCfg->tcx_aldo_window_1_trunc, st->hTcxCfg->tcx_mdct_window_half, st->hTcxCfg->tcx_mdct_window_minimum, overlap, st->hTcxCfg->tcx_mdct_window_half_length, st->hTcxCfg->tcx_mdct_window_min_length, st->hTcxCfg->tcx_curr_overlap_mode ); + + if ( st->hTcxCfg->tcx_curr_overlap_mode == FULL_OVERLAP ) + { + for ( i = 0; i < nz; i++ ) + { + st->hTcxEnc->old_out[nz + overlap + i] = xn_buf[L_frame - 1 - i] * st->hTcxCfg->tcx_aldo_window_1_trunc[-1 - i]; + } + } + } + + st->hTcxCfg->last_aldo = aldo; + + /* Update Txnq */ + if ( !st->hTcxCfg->last_aldo ) + { + mvr2r( xn_buf + L_frame, st->hTcxEnc->Txnq, overlap ); + } + + /* Output */ + mvr2r( xn_buf + ( overlap >> 1 ) - tcx_offset, synth, ( st->core == TCX_20_CORE ) ? st->L_frame : L_frame ); + + return; +} + +/*-------------------------------------------------------------------* + * QuantizeSpectrum() + * + * + *-------------------------------------------------------------------*/ + +void QuantizeSpectrum( + Encoder_State *st, /* i/o: encoder state structure */ + const float A[], /* i : quantized coefficients NxAz_q[M+1] */ + const Word16 Aqind[], /* i : frame-independent quantized coefficients (M+1) */ + float gainlpc[], /* i : MDCT gains of the previous frame */ + float synth[], /* o : synthesis buffer */ + const int16_t nb_bits, /* i : bit budget */ + const int16_t tnsSize, /* i : number of tns parameters put into prm */ + int16_t prm[], /* o : tcx parameters */ + const int16_t frame_cnt, /* i : frame counter in the super_frame */ + CONTEXT_HM_CONFIG *hm_cfg, /* i : HM configuration */ + const int16_t vad_hover_flag /* i : VAD hangover flag */ +) +{ + int16_t L_frameTCX; /* full frame length */ + int16_t L_frame; /* frame length */ + int16_t L_spec; /* length of the coded spectrum */ + int16_t tcx_offset; /* folding point offset relative to the end of the previous frame */ + int16_t noiseFillingBorder; /* noise filling border */ + float quantized_spectrum[N_MAX]; /* quantized MDCT spectrum */ + float lf_deemph_fact[L_MDCT_OVLP_MAX + L_FRAME_PLUS + L_MDCT_OVLP_MAX]; /* low frequency deemphasis factors */ + int16_t hm_active; /* flag indicating if the harmonic model is active */ + float fac_ns; /* noise filling level */ + int16_t nf_seed; /* noise filling random seed */ + float ener; /* energy of the quantized spectrum */ + float gain_tcx; /* global gain */ + TCX_ENC_HANDLE hTcxEnc = st->hTcxEnc; + + /*-----------------------------------------------------------* + * Quantize the MDCT spectrum * + *-----------------------------------------------------------*/ + + QuantizeTCXSpectrum( st, frame_cnt, hTcxEnc->spectrum[frame_cnt], gainlpc, Aqind, tnsSize, nb_bits, vad_hover_flag, + &L_frameTCX, &L_frame, &L_spec, &tcx_offset, &noiseFillingBorder, quantized_spectrum, hm_cfg, &hm_active, lf_deemph_fact, &nf_seed, &ener, &gain_tcx, prm ); + + /*-----------------------------------------------------------* + * Estimate and quantize noise factor * + *-----------------------------------------------------------*/ + + EstimateTCXNoiseLevel( st, hTcxEnc->spectrum[frame_cnt], quantized_spectrum, gain_tcx, L_frame, noiseFillingBorder, hm_active, &fac_ns, &prm[1] ); + + /*-----------------------------------------------------------* + * Internal decoder * + *-----------------------------------------------------------*/ + + InternalTCXDecoder( st, frame_cnt, L_frameTCX, L_frame, L_spec, tcx_offset, noiseFillingBorder, quantized_spectrum, ener, lf_deemph_fact, fac_ns, nf_seed, A, gainlpc, hm_active, gain_tcx, hTcxEnc->spectrum[frame_cnt], synth, &prm[0] ); + + /* Update L_frame_past */ + st->L_frame_past = L_frame; + + /* Update overlap */ + if ( ( ( ( L_frameTCX == hTcxEnc->L_frameTCX >> 1 ) && frame_cnt > 0 ) || ( st->hTcxCfg->tcx_last_overlap_mode == TRANSITION_OVERLAP ) ) && ( st->hTcxCfg->tcx_curr_overlap_mode == FULL_OVERLAP ) ) + { + st->hTcxCfg->tcx_curr_overlap_mode = ALDO_WINDOW; + } + + + return; +} + + +/*-------------------------------------------------------------------* + * coder_tcx() + * + * + *-------------------------------------------------------------------*/ + +void coder_tcx( + Encoder_State *st, /* i/o: encoder state structure */ + TCX_CONFIG_HANDLE hTcxCfg, /* i : configuration of TCX */ + const float A[], /* i : quantized coefficients NxAz_q[M+1] */ + const Word16 Aqind[], /* i : frame-independent quantized coefficients (M+1) */ + float synth[], /* o : decoded synthesis */ + const int16_t L_frame_glob, /* i : frame length */ + const int16_t L_frameTCX_glob, + const int16_t L_spec, + int16_t nb_bits, /* i : bit budget */ + float spectrum[], /* i/o: MDCT spectrum */ + int16_t prm[], /* o : tcx parameters */ + CONTEXT_HM_CONFIG *hm_cfg, + const int16_t vad_hover_flag /* i : VAD hangover flag */ +) +{ + int16_t L_frame; + int16_t left_overlap = -1, right_overlap = -1; + int16_t tnsSize = 0; /* number of tns parameters put into prm */ + int16_t tnsBits = 0; /* number of tns bits in the frame */ + int16_t ltpBits = 0; + float gainlpc[FDNS_NPTS]; + float buf[N_MAX + L_MDCT_OVLP_MAX]; + float winMDST[N_MAX + L_MDCT_OVLP_MAX]; + float *win; + float *powerSpec; + TCX_ENC_HANDLE hTcxEnc = st->hTcxEnc; + + powerSpec = win = buf; /* Share memory for windowed TD signal and for the power spectrum */ + + L_frame = L_frameTCX_glob; + + /*-----------------------------------------------------------* + * Windowing and MDCT * + *-----------------------------------------------------------*/ + + if ( st->hTcxCfg->tcx_last_overlap_mode == TRANSITION_OVERLAP ) + { + WindowSignal( hTcxCfg, hTcxCfg->tcx_offsetFB, hTcxCfg->tcx_last_overlap_mode, hTcxCfg->tcx_curr_overlap_mode, &left_overlap, &right_overlap, st->hTcxEnc->speech_TCX, &L_frame, win, 1, 1 ); + + /* Compute MDCT for xn_buf[] */ + TCX_MDCT( win, spectrum, left_overlap, L_frame - ( left_overlap + right_overlap ) / 2, right_overlap, st->element_mode ); + } + else + { + wtda( st->hTcxEnc->new_speech_TCX, win, NULL, hTcxCfg->tcx_last_overlap_mode, hTcxCfg->tcx_curr_overlap_mode, L_frame ); + + WindowSignal( hTcxCfg, hTcxCfg->tcx_offsetFB, hTcxCfg->tcx_last_overlap_mode == ALDO_WINDOW ? FULL_OVERLAP : hTcxCfg->tcx_last_overlap_mode, hTcxCfg->tcx_curr_overlap_mode == ALDO_WINDOW ? FULL_OVERLAP : hTcxCfg->tcx_curr_overlap_mode, &left_overlap, &right_overlap, st->hTcxEnc->speech_TCX, &L_frame, winMDST, 1, 1 ); + + edct( win, spectrum, L_frame, st->element_mode ); + + v_multc( spectrum, (float) sqrt( (float) NORM_MDCT_FACTOR / L_frame ), spectrum, L_frame ); + } + + /*-----------------------------------------------------------* + * Attenuate upper end of NB spectrum, * + * to simulate ACELP behavior * + *-----------------------------------------------------------*/ + + if ( st->narrowBand ) + { + attenuateNbSpectrum( L_frame, spectrum ); + } + + /*-----------------------------------------------------------* + * Compute noise-measure flags for spectrum filling * + * and quantization (0: tonal, 1: noise-like). * + * Detect low pass if present. * + *-----------------------------------------------------------*/ + + AnalyzePowerSpectrum( st, L_frame * st->L_frame / hTcxEnc->L_frameTCX, L_frame, left_overlap, right_overlap, spectrum, ( st->hTcxCfg->tcx_last_overlap_mode == TRANSITION_OVERLAP ) ? win : winMDST, powerSpec ); + + if ( hTcxCfg->fIsTNSAllowed ) + { + SetTnsConfig( hTcxCfg, L_frame_glob == st->L_frame, st->last_core == ACELP_CORE ); + + TNSAnalysis( hTcxCfg, L_frame, L_spec, TCX_20, st->last_core == ACELP_CORE, spectrum, NULL, -1, hTcxEnc->tnsData, hTcxEnc->fUseTns, &st->hIGFEnc->tns_predictionGain ); + } + else + { + hTcxEnc->fUseTns[0] = hTcxEnc->fUseTns[1] = 0; + } + + if ( st->igf ) + { + ProcessIGF( st, spectrum, spectrum, powerSpec, 1, 0, 0, vad_hover_flag ); + } + + ShapeSpectrum( hTcxCfg, A, gainlpc, L_frame_glob, L_spec, spectrum, hTcxEnc->fUseTns[0], st, NULL ); + + if ( st->igf ) + { + nb_bits -= st->hIGFEnc->infoTotalBitsPerFrameWritten; + } + + if ( hTcxCfg->fIsTNSAllowed ) + { + EncodeTnsData( hTcxCfg->pCurrentTnsConfig, hTcxEnc->tnsData, prm + 1 + NOISE_FILL_RANGES + LTPSIZE, &tnsSize, &tnsBits ); + } + + QuantizeSpectrum( st, A, Aqind, gainlpc, synth, nb_bits - tnsBits - ltpBits, tnsSize, prm, 0, hm_cfg, vad_hover_flag ); + + return; +} + +/*-------------------------------------------------------------------* + * coder_tcx_post() + * + * + *-------------------------------------------------------------------*/ + +void coder_tcx_post( + Encoder_State *st, /* i/o: encoder memory state */ + float *A, /* o : Quantized LPC coefficients */ + const float *Ai /* i : Unquantized (interpolated) LPC coefficients */ +) +{ + float xn_buf[L_FRAME_MAX]; + + /* TCX output */ + mvr2r( st->synth, xn_buf, st->L_frame ); + + /*-----------------------------------------------------------* + * Memory update * + *-----------------------------------------------------------*/ + + /* Update LPDmem (Txnq,syn,syn_pe,old_exc,wsyn,Ai,Aq) */ + tcx_encoder_memory_update( st, xn_buf, Ai, A ); + + return; +} diff --git a/lib_enc/cod_uv.c b/lib_enc/cod_uv.c new file mode 100644 index 0000000000000000000000000000000000000000..2c22ed41888c8eff36115f44e10960347de4636b --- /dev/null +++ b/lib_enc/cod_uv.c @@ -0,0 +1,90 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * gauss_L2: + * + * encode an additional Gaussian excitation for unvoiced subframes and compute + * associated xcorrelations for gains computation + * + * Gaussian excitation is generated by a white noise and shapes it with LPC-derived filter + *-------------------------------------------------------------------*/ + +void gauss_L2( + const float h[], /* i : weighted LP filter impulse response */ + float code[], /* o : gaussian excitation */ + float y2[], /* i : zero-memory filtered code. excitation */ + float y11[], /* o : zero-memory filtered gauss. excitation */ + float *gain, /* o : excitation gain */ + float g_corr[], /* i/o: correlation structure for gain coding */ + float tilt_code, /* i : tilt of code */ + const float *Aq, /* i : quantized LPCs */ + float formant_enh_num, /* i : formant enhancement factor */ + int16_t *seed_acelp /* i/o: random seed */ +) +{ + int16_t i; + + /*-----------------------------------------------------------------* + * Find new target for the Gaussian codebook + *-----------------------------------------------------------------*/ + + /*Generate white gaussian noise using central limit theorem method (N only 4 as E_util_random is not purely uniform)*/ + for ( i = 0; i < L_SUBFR; i++ ) + { + code[i] = (float) ( own_random( seed_acelp ) ) / ( 1 << 15 ); + code[i] += (float) ( own_random( seed_acelp ) ) / ( 1 << 15 ); + code[i] += (float) ( own_random( seed_acelp ) ) / ( 1 << 15 ); + } + + /*Shape the gaussian excitation*/ + cb_shape( 1, 0, 0, 1, 0, formant_enh_num, FORMANT_SHARPENING_G2, Aq, code, tilt_code, 0, L_SUBFR ); + + /*compute 0s memory weighted synthesis contribution and find gain*/ + conv( code, h, y11, L_SUBFR ); + *gain = 0.f; + + /*Update correlations for gains coding */ + g_corr[0] = 0.01F + dotp( y11, y11, L_SUBFR ); + g_corr[4] = 0.01F + dotp( y11, y2, L_SUBFR ); + + return; +} diff --git a/lib_enc/comvad_decision.c b/lib_enc/comvad_decision.c new file mode 100644 index 0000000000000000000000000000000000000000..240f1754ba362a86053983f2b56b3e74249b35d7 --- /dev/null +++ b/lib_enc/comvad_decision.c @@ -0,0 +1,875 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "prot.h" +#include "rom_enc.h" +#include "wmc_auto.h" + + +/*-------------------------------------------------------------------* + * local function prototypes + *-------------------------------------------------------------------*/ + +static int16_t comvad_hangover( const float lt_snr_org, const float snr, const float lf_snr, const float snr_flux, const int16_t bw_index, const int16_t vad_flag, const int16_t pre_res_hang_num, const int16_t continuous_speech_num2, const int16_t noisy_type ); + + +/*-------------------------------------------------------------------* + * comvad_decision() + * + * + *-------------------------------------------------------------------*/ + +int16_t comvad_decision( + VAD_CLDFB_HANDLE hVAD_CLDFB, /* i/o: CLDFB VAD state */ + const float snr, /* i : frequency domain SNR */ + const float tsnr, /* i : time domain SNR */ + const float snr_flux, /* i : average tsnr of several frames */ + const float lt_snr, /* i : long time SNR calculated by fg_energy and bg_energy*/ + const float lt_snr_org, /* i : original long time SNR */ + const float lf_snr, /* i : long time frequency domain SNR calculated by l_speech_snr and l_silence_snr*/ + const float frame_energy, /* i : current frame energy */ + const int16_t music_backgound_f, /* i : background music flag */ + int16_t *cldfb_addition, + const int16_t vada_flag ) +{ + int16_t speech_flag = hVAD_CLDFB->speech_flag; + int16_t fg_energy_count = hVAD_CLDFB->fg_energy_count; + int16_t bg_energy_count = hVAD_CLDFB->bg_energy_count; + float fg_energy = hVAD_CLDFB->fg_energy; + float bg_energy = hVAD_CLDFB->bg_energy; + int16_t l_speech_snr_count = hVAD_CLDFB->l_speech_snr_count; + int16_t vad_flag; + float snr_thresh = 0.2f; + float *ltd_stable_rate = hVAD_CLDFB->ltd_stable_rate; + float *sp_center = hVAD_CLDFB->sp_center; + int16_t frameloop = hVAD_CLDFB->frameloop; + int16_t bw_index = hVAD_CLDFB->bw_index; + int16_t noisy_type = UNKNOWN_NOISE; + int16_t vadb_flag = 0; + + /* + * ls_snr_org + * -------NB---------------WB----------------SWB--------- + * l16 [13.5 17] [13.5 16] [13.1 15.2] + * 126 [12 14] [10.7 12.7] [10.3 12.1] + * l36 [9.5 12] [8.5 10.5] [7.8 9.2] + * 15dB [3.5 4.5] + * 20dB [4.5 5.5] + */ + + /* + * lt_snr_org + * -------NB---------------WB----------------SWB--------- + * l16 [-- --] [-- --] [-- --] + * 126 [-- --] [-- -] [-- --] + * l36 [-- --] [-- --] [- --] + * 15dB [1.2 1.9] + * 20dB [2.1 2.7] [1.8 2.3] + */ + + if ( hVAD_CLDFB->lf_snr_smooth > LS_MIN_SELENCE_SNR[bw_index - CLDFBVAD_NB_ID] && lt_snr_org > LT_MIN_SILENCE_SNR[bw_index - CLDFBVAD_NB_ID] ) + { + noisy_type = SILENCE; + } + + snr_thresh = construct_snr_thresh( sp_center, snr_flux, lt_snr, lf_snr, hVAD_CLDFB->continuous_speech_num, hVAD_CLDFB->continuous_noise_num, hVAD_CLDFB->fg_energy_est_start, bw_index ); + + if ( snr > snr_thresh ) + { + vad_flag = 1; + } + else + { + vad_flag = 0; + } + + if ( bw_index == CLDFBVAD_WB_ID ) + { + if ( tsnr > 2.8 ) + { + vad_flag = 1; + } + } + else + { + if ( tsnr > 2.6 ) + { + vad_flag = 1; + } + } + + if ( frameloop > 25 ) + { + if ( vad_flag == 1 && hVAD_CLDFB->fg_energy_est_start == 1 ) + { + if ( fg_energy_count == 512 ) + { + fg_energy = fg_energy * 0.75f; + fg_energy_count = 384; + } + if ( ( frame_energy * bg_energy_count ) > 6 * bg_energy ) + { + fg_energy = fg_energy + frame_energy; + fg_energy_count = fg_energy_count + 1; + } + } + } + + if ( music_backgound_f ) + { + vad_flag = 1; + } + + if ( vad_flag == 1 ) + { + if ( snr > hVAD_CLDFB->l_silence_snr / hVAD_CLDFB->l_silence_snr_count + 1.5 ) + { + if ( l_speech_snr_count == 512 ) + { + hVAD_CLDFB->l_speech_snr = hVAD_CLDFB->l_speech_snr * 0.75f; + l_speech_snr_count = 384; + + hVAD_CLDFB->l_speech_snr += snr; + l_speech_snr_count++; + } + else + { + hVAD_CLDFB->l_speech_snr += snr; + l_speech_snr_count++; + } + } + } + + if ( bw_index == CLDFBVAD_NB_ID ) + { + if ( snr_flux > 1.9 + lt_snr * 0.28 ) + { + vad_flag = 1; + } + if ( ( snr_flux > 1.5 ) && sp_center[3] > 1.6 && lt_snr_org < 3.5 ) + { + vad_flag = 1; + } + if ( ( snr_flux > 1.2 ) && sp_center[3] > 1.9 && lt_snr_org < 3.5 ) + { + vad_flag = 1; + } + if ( ( snr_flux > 1.00f ) && sp_center[3] > 3.2 && lt_snr_org < 3.5 ) + { + vad_flag = 1; + } + } + + if ( bw_index == CLDFBVAD_WB_ID ) + { + if ( ( snr_flux > 2.1 + lt_snr * 0.24 ) ) + { + vad_flag = 1; + } + if ( ( snr_flux > 1.6 ) && sp_center[3] > 2.5 && lt_snr_org < 3.5 ) + { + vad_flag = 1; + } + if ( ( snr_flux > 1.2 ) && sp_center[3] > 2.8 && lt_snr_org < 3.5 ) + { + vad_flag = 1; + } + if ( ( snr_flux > 1.0 ) && sp_center[3] > 4.5 && lt_snr_org < 3.5 ) + { + vad_flag = 1; + } + } + + if ( bw_index == CLDFBVAD_SWB_ID ) + { + if ( ( snr_flux > 2.1 + lt_snr * 0.32 ) ) + { + vad_flag = 1; + } + if ( ( snr_flux > 1.68 ) && sp_center[3] > 2.76 && lt_snr_org < 3.5 ) + { + vad_flag = 1; + } + if ( ( snr_flux > 1.24 ) && sp_center[3] > 2.92 && lt_snr_org < 3.5 ) + { + vad_flag = 1; + } + if ( ( snr_flux > 1.10f ) && sp_center[3] > 4.6 && lt_snr_org < 3.5 ) + { + vad_flag = 1; + } + } + + if ( hVAD_CLDFB->fg_energy_est_start == 0 ) + { + if ( ltd_stable_rate[0] > 0.08 && vad_flag == 1 && frame_energy > 50 ) + { + hVAD_CLDFB->fg_energy_est_start = 1; + } + } + + /************************************************************************/ + /* hangover */ + /************************************************************************/ + + speech_flag = comvad_hangover( lt_snr_org, snr, lf_snr, snr_flux, bw_index, vad_flag, speech_flag, hVAD_CLDFB->continuous_speech_num2, noisy_type ); + + if ( vad_flag == 0 && speech_flag > 0 ) + { + speech_flag--; + vad_flag = 1; + } + + vadb_flag = vad_flag; + + if ( bw_index == CLDFBVAD_SWB_ID ) + { + if ( SILENCE == noisy_type && snr > 0.2 && vad_flag == 0 ) + { + vad_flag = vada_flag; + } + else if ( hVAD_CLDFB->lf_snr_smooth < 10.5 || SILENCE != noisy_type ) + { + if ( ( snr_flux > 1.8 ) || ( ( hVAD_CLDFB->continuous_speech_num2 > 40 ) && ( snr_flux > 1.6 ) ) || music_backgound_f == 1 ) + { + vad_flag = vada_flag | vadb_flag; + } + /*only use for silence*/ + else if ( noisy_type == SILENCE ) + { + vad_flag = vada_flag; + } + } + } + else if ( bw_index == CLDFBVAD_WB_ID ) + { + if ( SILENCE == noisy_type && snr > 0.2 && vad_flag == 0 ) + { + vad_flag = vada_flag; + } + else + { + if ( hVAD_CLDFB->lf_snr_smooth < 10.5 || SILENCE != noisy_type ) + { + if ( ( snr_flux > 2.2 ) || ( ( hVAD_CLDFB->continuous_speech_num2 > 40 ) && ( snr_flux > 1.6 ) ) || music_backgound_f == 1 ) + { + vad_flag = vada_flag | vadb_flag; + } + else if ( SILENCE == noisy_type ) + { + vad_flag = vada_flag; + } + } + } + } + else + { + if ( noisy_type == SILENCE ) + { + if ( hVAD_CLDFB->lf_snr_smooth > 12.5 && music_backgound_f == 0 ) + { + vad_flag = vada_flag; + } + } + else + { + if ( ( snr_flux > 2.0 ) || ( hVAD_CLDFB->continuous_speech_num2 > 30 && ( snr_flux > 1.5 ) ) || music_backgound_f == 1 ) + { + vad_flag = vada_flag | vadb_flag; + } + } + } + + if ( vad_flag == 0 ) + { + if ( hVAD_CLDFB->l_silence_snr_count == 512 ) + { + hVAD_CLDFB->l_silence_snr = hVAD_CLDFB->l_silence_snr * 0.75f; + hVAD_CLDFB->l_silence_snr_count = 384; + + hVAD_CLDFB->l_silence_snr += snr; + hVAD_CLDFB->l_silence_snr_count++; + } + else if ( snr < 0.8 ) + { + hVAD_CLDFB->l_silence_snr += snr; + hVAD_CLDFB->l_silence_snr_count++; + } + } + + if ( vad_flag == 0 ) + { + if ( bg_energy_count == 512 ) + { + bg_energy = bg_energy * 0.75f; + bg_energy_count = 384; + } + + if ( tsnr < 1.0 ) + { + bg_energy = bg_energy + frame_energy; + bg_energy_count = bg_energy_count + 1; + } + } + + hVAD_CLDFB->lt_snr_org = lt_snr_org; + hVAD_CLDFB->speech_flag = speech_flag; + + hVAD_CLDFB->fg_energy_count = fg_energy_count; + hVAD_CLDFB->bg_energy_count = bg_energy_count; + hVAD_CLDFB->fg_energy = fg_energy; + hVAD_CLDFB->bg_energy = bg_energy; + hVAD_CLDFB->l_speech_snr_count = l_speech_snr_count; + + hVAD_CLDFB->vad_flag_for_bk_update = vad_flag; + if ( hVAD_CLDFB->update_count < 12 && vadb_flag == 1 ) + { + hVAD_CLDFB->warm_hang_num = max( 20, speech_flag ); + } + + if ( vad_flag == 0 && hVAD_CLDFB->warm_hang_num > 0 ) + { + hVAD_CLDFB->warm_hang_num--; + vad_flag = 1; + } + + if ( noisy_type == SILENCE && bw_index != CLDFBVAD_NB_ID ) + + { + *cldfb_addition = 2; + } + else + { + *cldfb_addition = 0; + + if ( bw_index == CLDFBVAD_WB_ID ) + { + *cldfb_addition = 3; + } + + if ( bw_index == CLDFBVAD_SWB_ID ) + { + *cldfb_addition = 1; + } + + if ( hVAD_CLDFB->bw_index == CLDFBVAD_NB_ID ) + { + *cldfb_addition = 1; + } + } + + return vad_flag; +} + + +/*-------------------------------------------------------------------* + * construct_snr_thresh() + * + * + *-------------------------------------------------------------------*/ + +float construct_snr_thresh( + const float sp_center[], /* i : spectral center */ + const float snr_flux, /* i : snr flux */ + const float lt_snr, /* i : long time time domain snr */ + const float lf_snr, /* i : long time frequency domain snr */ + const int16_t continuous_speech_num, /* i : number of continuous speech frames */ + const int16_t continuous_noise_num, /* i : number of continuous noise frames */ + const int16_t fg_energy_est_start, /* i : whether if estimated energy */ + const int16_t bw_index /* i : band width index */ +) +{ + float test_l_snr = 0.f; + float snr_delta; + float snr_thresh; + float bw_snr; + + snr_delta = COMVAD_INIT_SNR_DELTA[bw_index]; + bw_snr = lt_snr; + + if ( bw_index == CLDFBVAD_SWB_ID ) + { + test_l_snr = lt_snr; + test_l_snr = test_l_snr * 1.0f; + + if ( sp_center[3] > 2.80f ) + { + snr_delta = snr_delta + 0.00f; + } + else if ( sp_center[2] > 2.6 ) + { + snr_delta = snr_delta + 0.03f; + } + else if ( sp_center[2] > 1.6 ) + { + snr_delta = snr_delta + 0.05f; + } + else if ( sp_center[3] > 1.4 ) + { + snr_delta = snr_delta + 0.10f; + } + else + { + snr_delta = snr_delta + 0.40f; + } + + if ( continuous_speech_num > 8 && fg_energy_est_start == 1 ) + { + snr_delta = snr_delta - 0.2f; + } + else if ( continuous_noise_num > 12 && ( snr_flux > 0.6 + lf_snr * 0.1 ) ) + { + snr_delta = snr_delta + 0.1f; + } + else if ( continuous_noise_num > 24 ) + { + snr_delta = snr_delta + 0.2f; + } + else if ( ( continuous_noise_num > 4 ) ) + { + snr_delta = snr_delta + 0.1f; + } + } + else if ( bw_index == CLDFBVAD_WB_ID ) + { + test_l_snr = lt_snr; + if ( sp_center[3] > 2.80f ) + { + snr_delta = snr_delta + 0.00f; + } + else if ( sp_center[2] > 2.6 ) + { + snr_delta = snr_delta + 0.03f; + } + else if ( sp_center[2] > 1.6 ) + { + snr_delta = snr_delta + 0.05f; + } + else if ( sp_center[3] > 1.4 ) + { + snr_delta = snr_delta + 0.10f; + } + else + { + snr_delta = snr_delta + 0.30f; + } + + if ( continuous_speech_num > 8 && fg_energy_est_start == 1 ) + { + snr_delta = snr_delta - 0.1f; + } + else if ( continuous_noise_num > 12 && ( snr_flux > 0.6 + bw_snr * 0.1 ) ) + { + snr_delta = snr_delta + 0.1f; + } + else if ( continuous_noise_num > 24 ) + { + snr_delta = snr_delta + 0.2f; + } + else if ( ( continuous_noise_num > 4 ) ) + { + snr_delta = snr_delta + 0.1f; + } + } + else if ( bw_index == CLDFBVAD_NB_ID ) + { + test_l_snr = lt_snr; + + if ( sp_center[3] > 3.0 ) + { + snr_delta = snr_delta + 0.00f; + } + else if ( sp_center[2] > 2.6 ) + { + snr_delta = snr_delta + 0.02f; + } + else if ( sp_center[2] > 1.6 ) + { + snr_delta = snr_delta + 0.04f; + } + else if ( sp_center[2] > 1.46 ) + { + snr_delta = snr_delta + 0.10f; + } + else + { + snr_delta = snr_delta + 0.18f; + } + + if ( continuous_speech_num > 80 && fg_energy_est_start == 1 && ( sp_center[0] > 1.4 ) ) + { + snr_delta = snr_delta - 0.32f; + } + else if ( continuous_speech_num > 8 && fg_energy_est_start == 1 && ( snr_flux > 0.2 + lf_snr * 0.1 ) ) + { + snr_delta = snr_delta - 0.1f; + } + else if ( continuous_noise_num > 12 && ( snr_flux > 0.6 + lf_snr * 0.1 ) ) + { + snr_delta = snr_delta + 0.1f; + } + else if ( continuous_noise_num > 24 ) + { + snr_delta = snr_delta + 0.2f; + } + } + else + { + snr_delta = 1.0f; + } + + snr_thresh = snr_delta + test_l_snr; + + + return snr_thresh; +} + + +/*-------------------------------------------------------------------* + * comvad_hangover() + * + * + *-------------------------------------------------------------------*/ + +static int16_t comvad_hangover( + const float lt_snr_org, /* i : original long time SNR */ + const float snr, /* i : frequency domain SNR */ + const float lf_snr, /* i : long time frequency domain SNR calculated by l_speech_snr and l_silence_snr*/ + const float snr_flux, /* i : average tsnr */ + const int16_t bw_index, /* i : band width index */ + const int16_t vad_flag, /* i : VAD flag */ + const int16_t pre_res_hang_num, /* i : residual number of previous hangover */ + const int16_t continuous_speech_num2, /* i : number of continuous speech frames */ + const int16_t noisy_type /* i : noisy type */ +) +{ + int16_t speech_flag = pre_res_hang_num; + + if ( bw_index == CLDFBVAD_SWB_ID ) + { + if ( vad_flag ) + { + if ( lt_snr_org > 3.5f ) + { + speech_flag = 3; + } + else + { + speech_flag = 4; + } + + if ( ( continuous_speech_num2 < 8 ) && ( lt_snr_org < 4.0f ) ) + { + speech_flag = 8 - continuous_speech_num2; + } + else if ( ( snr_flux > 0.8 ) && ( continuous_speech_num2 > 24 ) ) + { + if ( lt_snr_org > 3.6f ) + { + speech_flag = 3; + } + else if ( lt_snr_org > 2.6f ) + { + speech_flag = 3; + } + else if ( lt_snr_org > 1.6f ) + { + speech_flag = 4; + } + else + { + speech_flag = 5; + } + speech_flag = speech_flag - 1; + } + + if ( continuous_speech_num2 < 120 ) + { + if ( snr > 1.5 ) + { + speech_flag = 9; + } + else if ( snr > 1.0 && speech_flag < 7 ) + { + speech_flag = 7; + } + else if ( speech_flag < 3 ) + { + speech_flag = 3; + } + if ( speech_flag > 3 ) + { + speech_flag -= 2; + } + } + else + { + if ( lt_snr_org > 3.6f ) + { + speech_flag = 1; + } + else if ( lt_snr_org > 3.0f ) + { + speech_flag = 2; + } + else if ( lt_snr_org > 2.5f ) + { + speech_flag = 3; + } + else if ( lt_snr_org > 2.0f ) + { + speech_flag = 3; + } + else if ( lt_snr_org > 1.5f ) + { + speech_flag = 4; + } + else + { + speech_flag = 5; + } + } + + if ( noisy_type == SILENCE ) + { + speech_flag = 6; + } + } + } + else if ( bw_index == CLDFBVAD_WB_ID ) + { + if ( vad_flag ) + { + if ( lt_snr_org > 3.5f ) + { + speech_flag = 1; + } + else + { + speech_flag = 2; + } + + if ( ( continuous_speech_num2 < 8 ) && ( lt_snr_org < 4.0f ) ) + { + speech_flag = 8 - continuous_speech_num2; + } + else if ( ( snr_flux > 0.9 ) && ( continuous_speech_num2 > 50 ) ) + { + if ( lt_snr_org > 3.6f ) + { + speech_flag = 1; + } + else if ( lt_snr_org > 2.6f ) + { + speech_flag = 5; + } + else if ( lt_snr_org > 1.6f ) + { + speech_flag = 6; + } + else + { + speech_flag = 7; + } + + if ( speech_flag > 1 ) + { + speech_flag = speech_flag - 1; + } + } + + if ( continuous_speech_num2 < 120 ) + { + if ( snr > 1.5 ) + { + speech_flag = 6; + } + else if ( snr > 1.0 && speech_flag < 5 ) + { + speech_flag = 5; + } + else if ( snr > 0.8 && lt_snr_org < 2 && speech_flag < 4 ) + { + speech_flag = 4; + } + else if ( speech_flag < 3 ) + { + speech_flag = 3; + } + } + else + { + if ( lt_snr_org > 3.6f ) + { + speech_flag = 1; + } + else if ( lt_snr_org > 3.0f ) + { + speech_flag = 2; + } + else if ( lt_snr_org > 2.5f ) + { + speech_flag = 2; + } + else if ( lt_snr_org > 2.0f ) + { + speech_flag = 3; + } + else + { + speech_flag = 3; + } + } + + if ( noisy_type == SILENCE ) + { + speech_flag = 6; + } + } + } + else + { + if ( vad_flag ) + { + if ( lt_snr_org > 3.5f ) + { + speech_flag = 3; + } + else + { + speech_flag = 4; + } + + if ( ( continuous_speech_num2 < 8 ) && ( lt_snr_org < 4.0f ) ) + { + speech_flag = 8 - continuous_speech_num2; + } + else if ( ( snr_flux > 0.8 + lf_snr * 0.1 ) && ( continuous_speech_num2 > 24 ) ) + { + if ( lt_snr_org > 3.6f ) + { + speech_flag = 3; + } + else if ( lt_snr_org > 2.6f ) + { + speech_flag = 8; + } + else if ( lt_snr_org > 1.2f ) + { + speech_flag = 10; + } + else + { + speech_flag = 12; + } + + if ( speech_flag > 2 ) + { + speech_flag = speech_flag - 2; + } + } + + if ( continuous_speech_num2 < 120 ) + { + if ( snr > 1.5 ) + { + speech_flag = 10; + } + else if ( snr > 1.0 && speech_flag < 7 ) + { + speech_flag = 7; + } + else if ( speech_flag < 3 && continuous_speech_num2 > 12 ) + { + speech_flag = 3; + } + } + else + { + if ( lt_snr_org > 3.6f ) + { + speech_flag = 2; + } + else if ( lt_snr_org > 3.0f ) + { + speech_flag = 2; + } + else if ( lt_snr_org > 2.5f ) + { + speech_flag = 3; + } + else if ( lt_snr_org > 2.0f ) + { + speech_flag = 3; + } + else if ( lt_snr_org > 1.5f ) + { + speech_flag = 4; + } + else + { + speech_flag = 4; + } + } + + if ( noisy_type == SILENCE ) + { + speech_flag = 2; + } + } + } + + if ( vad_flag == 1 ) + { + if ( noisy_type != SILENCE ) + { + speech_flag--; + } + else + { + speech_flag = speech_flag - 3; + } + + if ( speech_flag < 0 ) + { + speech_flag = 0; + } + } + + return speech_flag; +} diff --git a/lib_enc/cor_shif.c b/lib_enc/cor_shif.c new file mode 100644 index 0000000000000000000000000000000000000000..67c11d4b9030aa32b52e9d4a14da4bd87bf5bb6c --- /dev/null +++ b/lib_enc/cor_shif.c @@ -0,0 +1,72 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * Correlation_shift + * + * Find normalized correlation correction dependent on estimated noise + * Note: this variable is basically active only if noise suppression + * is desactivated. * Otherwise, (for default NS = 14 dB and up to 10dB SNR) + * it can be assumed about 0 + *-------------------------------------------------------------------*/ + +#define MAX_CORR_SHIFT 0.5f + +/*! r: noise dependent voicing correction */ +float correlation_shift( + const float totalNoise /* i : noise estimate over all critical bands */ +) +{ + float corr_shift; + + corr_shift = 0.0f; + if ( totalNoise > 28.18225893613955f ) /* to make corr_shift > 0.0 */ + { + /* useful values range from 0 to 1 (can saturate at 1.0) */ + corr_shift = 2.4492e-4f * (float) exp( 0.1596f * totalNoise ) - 0.022f; + } + if ( corr_shift > MAX_CORR_SHIFT ) + { + corr_shift = MAX_CORR_SHIFT; + } + return corr_shift; +} diff --git a/lib_enc/core_enc_2div.c b/lib_enc/core_enc_2div.c new file mode 100644 index 0000000000000000000000000000000000000000..25d62130cfa70fc731b40e334c091d71b8d57690 --- /dev/null +++ b/lib_enc/core_enc_2div.c @@ -0,0 +1,243 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * core_encode_twodiv() + * + * Two-div core encoder + *-------------------------------------------------------------------*/ + +void core_encode_twodiv( + Encoder_State *st, /* i/o: coder memory state */ + const float new_samples[], /* i : new samples */ + float Aw[NB_SUBFR16k * ( M + 1 )], /* i : weighted A(z) unquant. for subframes*/ + const int16_t vad_hover_flag /* i : VAD hangover flag */ +) +{ + TCX_ENC_HANDLE hTcxEnc = st->hTcxEnc; + int16_t n; + float lsp_new[M], lsp_mid[M]; + float lsf_q[M], lsp_q[M]; + float lspmid_q[M]; + float A_q[M + 1]; + int16_t param_lpc[NPRM_LPC_NEW]; + int16_t nbits_lpc[2]; + int16_t param_core[2 * NPRM_DIV]; + int16_t target_bits; + float gainlpc[2][FDNS_NPTS]; + int16_t tnsSize[2]; /* number of tns parameters put into prm */ + int16_t tnsBits[2]; /* number of tns bits in the frame */ + int16_t ltpBits; + int16_t bitsAvailable; + int16_t indexBuffer[2 * ( ( N_MAX / 2 ) + 1 )]; + CONTEXT_HM_CONFIG hm_cfg[2]; + int16_t bits_param_lpc[10], no_param_lpc; + int16_t i, T_op[3]; + + hm_cfg[0].indexBuffer = &indexBuffer[0]; + hm_cfg[1].indexBuffer = &indexBuffer[N_MAX / 2 + 1]; + + set_s( tnsSize, 0, 2 ); + set_s( tnsBits, 0, 2 ); + ltpBits = 0; + + for ( i = 0; i < 3; i++ ) + { + T_op[i] = st->pitch[i]; + + /* check minimum pitch for quantization */ + if ( T_op[i] < PIT_MIN_SHORTER ) + { + T_op[i] *= 2; + } + + /* convert pitch values to core sampling-rate */ + if ( st->L_frame != L_FRAME ) + { + T_op[i] = (int16_t) ( T_op[i] * (float) st->L_frame / (float) L_FRAME + 0.5f ); + } + } + + /*--------------------------------------------------------------* + * TCX20/TCX10 switching decision + *---------------------------------------------------------------*/ + + if ( st->hTcxEnc->tcxMode == TCX_10 ) + { + st->core = TCX_10_CORE; + } + else if ( st->hTcxEnc->tcxMode == TCX_20 ) + { + st->core = TCX_20_CORE; + } + + /*--------------------------------------------------------------* + * Core Signal Analysis: MDCT, TNS, LPC analysis + *---------------------------------------------------------------*/ + + core_signal_analysis_high_bitrate( new_samples, T_op, lsp_new, lsp_mid, st, NULL, tnsSize, tnsBits, param_core, <pBits, NULL, st->L_frame, hTcxEnc->L_frameTCX, EVS_MONO, vad_hover_flag ); + + /*--------------------------------------------------------------* + * LPC Quantization + *---------------------------------------------------------------*/ + + lpc_quantization( st, lsp_new, lsp_mid, lsp_q, lsf_q, lspmid_q, st->coder_type, 0, /*No acelp->no need to compute any mid-LPC*/ + param_lpc, nbits_lpc, bits_param_lpc, &no_param_lpc ); + + /*--------------------------------------------------------------* + * Rate switching + *--------------------------------------------------------------*/ + + if ( st->rate_switching_reset ) + { + mvr2r( lsp_q, st->lsp_old, M ); + mvr2r( lsf_q, st->lsf_old, M ); + } + + /*--------------------------------------------------------------* + * Run Two TCX10 + *---------------------------------------------------------------*/ + + if ( st->core == TCX_10_CORE ) + { + const int16_t last_ace_mode = st->last_core; + + for ( n = 0; n < 2; n++ ) + { + if ( n == 0 ) + { + lsp2a_stab( lspmid_q, A_q, M ); + } + else + { + lsp2a_stab( lsp_q, A_q, M ); + } + + /* Shape spectrum */ + ShapeSpectrum( st->hTcxCfg, A_q, gainlpc[n], st->L_frame / 2, st->hTcxCfg->tcx_coded_lines / 2, hTcxEnc->spectrum[n], hTcxEnc->fUseTns[n], st, NULL ); + + st->last_core = st->core; + } + st->last_core = last_ace_mode; + + /* Calculate target bits */ + bitsAvailable = st->bits_frame_core - nbits_lpc[0] - nbits_lpc[1] - st->nb_bits_header_tcx; + + /* subtract bits for TCX overlap mode (1 bit: full, 2 bits: half or no overlap) */ + bitsAvailable -= ( st->hTcxCfg->tcx_curr_overlap_mode == HALF_OVERLAP || st->hTcxCfg->tcx_curr_overlap_mode == MIN_OVERLAP ) ? 2 : 1; + { + bitsAvailable -= st->hIGFEnc->infoTotalBitsWritten; + } + + hTcxEnc->measuredBwRatio = 1.f; + + for ( n = 0; n < 2; n++ ) + { + target_bits = ( ( bitsAvailable + 1 - n ) >> 1 ) - tnsBits[n]; + + if ( n == 0 ) + { + target_bits -= ltpBits; + } + + if ( st->enablePlcWaveadjust && n ) + { + target_bits -= 1; + } + + /* Run TCX10 encoder */ + QuantizeSpectrum( st, A_q, NULL, gainlpc[n], st->synth + n * st->L_frame / 2, target_bits, tnsSize[n], param_core + n * NPRM_DIV, n, &hm_cfg[n], vad_hover_flag ); + + /* Update tcx overlap mode */ + if ( ( n > 0 ) || !st->tcxonly ) + { + st->hTcxCfg->tcx_last_overlap_mode = st->hTcxCfg->tcx_curr_overlap_mode; + } + } + + coder_tcx_post( st, A_q, Aw ); + } + + /*--------------------------------------------------------------* + * Run One TCX20 + *---------------------------------------------------------------*/ + + if ( st->core == TCX_20_CORE ) + { + lsp2a_stab( lsp_q, A_q, M ); + + ShapeSpectrum( st->hTcxCfg, A_q, gainlpc[0], st->L_frame, st->hTcxCfg->tcx_coded_lines, hTcxEnc->spectrum_long, hTcxEnc->fUseTns[0], st, NULL ); + + hTcxEnc->measuredBwRatio = 1.f; + + /* Calculate target bits */ + target_bits = st->bits_frame_core - tnsBits[0] - nbits_lpc[0] - st->nb_bits_header_tcx - ltpBits; + + /* subtract bits for TCX overlap mode (1 bit: full, 2 bits: half or no overlap) */ + target_bits -= ( st->hTcxCfg->tcx_curr_overlap_mode == HALF_OVERLAP || st->hTcxCfg->tcx_curr_overlap_mode == MIN_OVERLAP ) ? 2 : 1; + { + target_bits -= st->hIGFEnc->infoTotalBitsPerFrameWritten; + } + if ( st->enablePlcWaveadjust ) + { + target_bits -= 1; + } + + QuantizeSpectrum( st, A_q, NULL, gainlpc[0], st->synth, target_bits, tnsSize[0], param_core, 0, &hm_cfg[0], vad_hover_flag ); + + coder_tcx_post( st, A_q, Aw ); + } + + /* Update lsp/lsf memory */ + mvr2r( lsf_q, st->lsf_old, M ); + mvr2r( lsp_q, st->lsp_old, M ); + + + /*--------------------------------------------------------------* + * Generate Bitstream + *---------------------------------------------------------------*/ + + enc_prm( st, param_core, param_lpc, hm_cfg, bits_param_lpc, no_param_lpc ); + + return; +} diff --git a/lib_enc/core_enc_init.c b/lib_enc/core_enc_init.c new file mode 100644 index 0000000000000000000000000000000000000000..b0ef74245d84cb9bbbd7756fed87e954588cbfd2 --- /dev/null +++ b/lib_enc/core_enc_init.c @@ -0,0 +1,766 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "prot.h" +#include "ivas_prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*-----------------------------------------------------------------------* + * Local function prototypes + *-----------------------------------------------------------------------*/ + +static void init_tcx( Encoder_State *st, const int16_t L_frame_old, const int32_t total_brate, const int32_t last_total_brate, const int16_t MCT_flag ); +static void init_sig_buffers( Encoder_State *st, const int16_t L_frame_old, const int16_t L_subfr, const int32_t total_brate, const int32_t last_total_brate ); +static void init_core_sig_ana( Encoder_State *st ); +static void init_acelp( Encoder_State *st, const int16_t L_frame_old, const int32_t total_brate, const int32_t last_total_brate ); +static void init_modes( Encoder_State *st, const int32_t last_total_brate ); + +/*-----------------------------------------------------------------------* + * init_coder_ace_plus() + * + * Initialization of state variables + *-----------------------------------------------------------------------*/ + +void init_coder_ace_plus( + Encoder_State *st, /* i : Encoder state */ + const int32_t last_total_brate, /* i : last total bitrate */ + const int16_t MCT_flag /* i : hMCT handle allocated (1) or not (0) */ +) +{ + TCX_ENC_HANDLE hTcxEnc = st->hTcxEnc; + int16_t L_frame_old; /*keep old frame size for switching */ + int16_t L_subfr; + + /* Bitrate */ + st->tcxonly = getTcxonly( st->element_mode, st->total_brate, MCT_flag, st->is_ism_format ); + + /* Core Sampling Rate */ + st->sr_core = getCoreSamplerateMode2( st->element_mode, st->total_brate, st->bwidth, st->flag_ACELP16k, st->rf_mode, st->is_ism_format ); + st->fscale = sr2fscale( st->sr_core ); + + /* Narrowband? */ + st->narrowBand = ( st->bwidth == NB ) ? 1 : 0; + + /* Core Framing */ + L_frame_old = st->last_L_frame; + st->L_frame = (int16_t) ( st->sr_core / FRAMES_PER_SEC ); + st->L_frame_past = -1; + + if ( hTcxEnc != NULL ) + { + hTcxEnc->L_frameTCX = (int16_t) ( st->input_Fs / FRAMES_PER_SEC ); + + if ( st->ini_frame == 0 ) + { + set_zero( hTcxEnc->Txnq, L_FRAME32k / 2 + 64 ); + hTcxEnc->acelp_zir = hTcxEnc->Txnq + L_FRAME / 2; + hTcxEnc->tcx_target_bits_fac = 1.0f; + } + } + + if ( ( st->element_mode == EVS_MONO && st->L_frame == L_FRAME16k && st->total_brate <= ACELP_32k ) || ( st->element_mode > EVS_MONO && st->L_frame == L_FRAME16k && st->total_brate <= MAX_ACELP_BRATE ) ) + { + st->nb_subfr = NB_SUBFR16k; + } + else + { + st->nb_subfr = NB_SUBFR; + } + L_subfr = st->L_frame / st->nb_subfr; + + /* Core Lookahead */ + st->encoderLookahead_enc = NS2SA( st->sr_core, ACELP_LOOK_NS ); + st->encoderLookahead_FB = NS2SA( st->input_Fs, ACELP_LOOK_NS ); + + if ( st->ini_frame == 0 ) + { + st->acelpFramesCount = 0; + st->prevTempFlatness = 1.0f; + } + + /* Initialize TBE */ + if ( st->hBWE_TD != NULL ) + { + st->hBWE_TD->prev_coder_type = GENERIC; + set_f( st->hBWE_TD->prev_lsf_diff, 0.5f, LPC_SHB_ORDER - 2 ); + st->hBWE_TD->prev_tilt_para = 0.0f; + set_zero( st->hBWE_TD->cur_sub_Aq, M + 1 ); + } + + st->currEnergyHF = 0; + + /* Initialize LPC analysis/quantization */ + if ( st->sr_core <= INT_FS_16k && st->tcxonly == 0 ) + { + st->lpcQuantization = 1; + } + else + { + st->lpcQuantization = 0; + } + + st->next_force_safety_net = 0; + if ( ( st->last_L_frame != st->L_frame ) || ( st->last_core == AMR_WB_CORE ) || ( st->last_core == HQ_CORE ) ) + { + set_f( st->mem_MA, 0.0f, M ); + mvr2r( GEWB_Ave, st->mem_AR, M ); + } + + /* Initialize IGF */ + if ( st->hIGFEnc != NULL ) + { + st->hIGFEnc->infoStopFrequency = -1; + } + + if ( st->igf && st->hIGFEnc != NULL ) + { + IGFEncSetMode( st->hIGFEnc, st->total_brate, st->bwidth, st->element_mode, st->rf_mode ); + } + else if ( st->hIGFEnc != NULL ) + { + st->hIGFEnc->infoTotalBitsWritten = 0; + st->hIGFEnc->infoTotalBitsPerFrameWritten = 0; + } + + /* Initialize Core Signal Analysis Module */ + init_core_sig_ana( st ); + + /* Initialize TCX */ + if ( hTcxEnc != NULL ) + { + init_tcx( st, L_frame_old, st->total_brate, last_total_brate, MCT_flag ); + } + + /* Initialize Signal Buffers */ + init_sig_buffers( st, L_frame_old, L_subfr, st->total_brate, last_total_brate ); + + /* Initialize ACELP */ + init_acelp( st, L_frame_old, st->total_brate, last_total_brate ); + + if ( st->ini_frame == 0 ) + { + st->tec_tfa = 0; + } + + if ( st->hTECEnc != NULL ) + { + resetTecEnc( st->hTECEnc, st->tec_tfa ); + } + + if ( st->bwidth == SWB && ( st->total_brate == ACELP_16k40 || st->total_brate == ACELP_24k40 ) && st->element_mode == EVS_MONO ) + { + st->tec_tfa = 1; + } + else + { + st->tec_tfa = 0; + } + + st->tec_flag = 0; + st->tfa_flag = 0; + + + if ( ( st->total_brate == ACELP_9k60 || st->total_brate == ACELP_16k40 || st->total_brate == ACELP_24k40 ) && st->element_mode == EVS_MONO ) + { + st->glr = 1; + } + else + { + st->glr = 0; + } + + st->glr_reset = 0; + + /* Initialize ACELP/TCX Modes */ + init_modes( st, last_total_brate ); + + /* Adaptive BPF */ + set_zero( st->mem_bpf, 2 * L_FILT16k ); + set_zero( st->mem_error_bpf, 2 * L_FILT16k ); + + if ( st->total_brate >= HQ_48k ) + { + st->enablePlcWaveadjust = 1; + } + else + { + st->enablePlcWaveadjust = 0; + } + + if ( st->hPlcExt ) + { + init_PLC_enc( st->hPlcExt, st->sr_core ); + } + + st->glr_idx[0] = 0; + st->glr_idx[1] = 0; + st->mean_gc[0] = 0.0f; + st->mean_gc[1] = 0.0f; + st->prev_lsf4_mean = 0.0f; + st->last_stab_fac = 0.0f; + + return; +} + +/*-----------------------------------------------------------------------* + * init_tcx() + * + * Initialization of TCX + *-----------------------------------------------------------------------*/ + +static void init_tcx( + Encoder_State *st, + const int16_t L_frame_old, + const int32_t total_brate, + const int32_t last_total_brate, + const int16_t MCT_flag ) +{ + TCX_ENC_HANDLE hTcxEnc = st->hTcxEnc; + + /* Share the memories for 2xTCX10/4xTCX5 and for TCX20 */ + hTcxEnc->spectrum[0] = hTcxEnc->spectrum_long; + hTcxEnc->spectrum[1] = hTcxEnc->spectrum_long + N_TCX10_MAX; + + init_tcx_cfg( st->hTcxCfg, total_brate, st->sr_core, st->input_Fs, st->L_frame, st->bwidth, hTcxEnc->L_frameTCX, st->fscale, st->encoderLookahead_enc, st->encoderLookahead_FB, st->preemph_fac, st->tcxonly, st->rf_mode, st->igf, st->hIGFEnc != NULL ? st->hIGFEnc->infoStopFrequency : 0, st->element_mode, st->ini_frame, MCT_flag ); + + /* Init TCX target bits correction factor */ + hTcxEnc->tcx_target_bits_fac = 1.0f; + hTcxEnc->measuredBwRatio = 1.0f; + hTcxEnc->noiseTiltFactor = 0.5625f; + hTcxEnc->noiseLevelMemory_cnt = 0; + + set_f( hTcxEnc->ltpGainMemory, 0.0f, N_LTP_GAIN_MEMS ); + set_s( hTcxEnc->memQuantZeros, 0, L_FRAME_PLUS ); + + /* TCX-LTP */ + hTcxEnc->tcxltp = getTcxLtp( st->sr_core ); + + if ( st->ini_frame == 0 ) + { + hTcxEnc->tcxltp_pitch_int_past = st->L_frame; + hTcxEnc->tcxltp_pitch_fr_past = 0; + hTcxEnc->tcxltp_gain_past = 0.f; + hTcxEnc->tcxltp_norm_corr_past = 0.f; + hTcxEnc->tcxltp_norm_corr_mem = 0.f; + hTcxEnc->kernel_switch_corr_past = 0.f; + hTcxEnc->kernel_symmetry_past = 0; /* MDCT_IV & 1 */ + hTcxEnc->enc_ste_pre_corr_past = 0; + hTcxEnc->tfm_mem = 0.75f; + hTcxEnc->tcxltp_on_mem = 0; + } + else if ( st->L_frame != L_frame_old && !( ( total_brate >= ACELP_16k40 && total_brate <= ACELP_24k40 ) && + ( total_brate == last_total_brate ) && ( st->last_bwidth == st->bwidth ) ) ) + { + int16_t pitres, pitres_old; + float pit, pit_old; + + if ( L_frame_old % 160 == 0 ) + { + pitres_old = 6; + } + else + { + pitres_old = 4; + } + pit_old = (float) hTcxEnc->tcxltp_pitch_int_past + (float) hTcxEnc->tcxltp_pitch_fr_past / (float) pitres_old; + if ( st->L_frame % 160 == 0 ) + { + pitres = 6; + } + else + { + pitres = 4; + } + pit = pit_old * (float) st->L_frame / (float) L_frame_old; + hTcxEnc->tcxltp_pitch_int_past = (int16_t) pit; + hTcxEnc->tcxltp_pitch_fr_past = (int16_t) ( ( pit - (float) hTcxEnc->tcxltp_pitch_int_past ) * (float) pitres ); + } + + hTcxEnc->tcx_lpc_shaped_ari = getTcxLpcShapedAri( total_brate, st->rf_mode, st->element_mode ); + + return; +} + +/*-----------------------------------------------------------------------* + * init_sig_buffers() + * + * Initialization of signal buffers + *-----------------------------------------------------------------------*/ + +static void init_sig_buffers( + Encoder_State *st, + const int16_t L_frame_old, + const int16_t L_subfr, + const int32_t total_brate, + const int32_t last_total_brate ) +{ + TCX_ENC_HANDLE hTcxEnc = st->hTcxEnc; + + /* Encoder Past Samples at encoder-sampling-rate */ + st->encoderPastSamples_enc = ( st->L_frame * 9 ) / 16; + + /* Initialize Signal Buffers and Pointers at encoder-sampling-rate */ + if ( st->ini_frame == 0 ) + { + set_zero( st->buf_speech_enc, L_PAST_MAX_32k + L_FRAME32k + L_NEXT_MAX_32k ); + set_zero( st->buf_speech_enc_pe, L_PAST_MAX_32k + L_FRAME32k + L_NEXT_MAX_32k ); + set_zero( st->buf_wspeech_enc, L_FRAME16k + L_SUBFR + L_FRAME16k + L_NEXT_MAX_16k + 320 ); + if ( hTcxEnc != NULL ) + { + set_zero( hTcxEnc->buf_speech_ltp, L_PAST_MAX_32k + L_FRAME32k + L_NEXT_MAX_32k ); + } + } + else if ( st->L_frame != L_frame_old && !( ( total_brate >= ACELP_16k40 && total_brate <= ACELP_24k40 ) && + ( total_brate == last_total_brate ) && ( st->last_bwidth == st->bwidth ) ) ) + { + lerp( st->buf_speech_enc, st->buf_speech_enc, st->L_frame, L_frame_old ); + + if ( ( st->last_core != TCX_20_CORE ) && ( st->last_core != TCX_10_CORE ) ) + { + mvr2r( st->buf_speech_enc, hTcxEnc->buf_speech_ltp, st->L_frame ); + } + + mvr2r( st->old_wsp, st->buf_wspeech_enc + st->L_frame + L_SUBFR - L_WSP_MEM, L_WSP_MEM ); + + /*Resamp buffers needed only for ACELP*/ + if ( st->L_frame == L_FRAME && !st->tcxonly ) + { + mvr2r( st->old_inp_12k8, st->buf_speech_enc_pe + st->L_frame - L_INP_MEM, L_INP_MEM ); + } + else if ( st->L_frame == L_FRAME16k && !st->tcxonly ) + { + lerp( st->buf_wspeech_enc + st->L_frame + L_SUBFR - L_WSP_MEM, st->buf_wspeech_enc + st->L_frame + L_SUBFR - 310, 310, L_WSP_MEM ); + mvr2r( st->old_inp_16k, st->buf_speech_enc_pe + st->L_frame - L_INP_MEM, L_INP_MEM ); + } + + st->mem_preemph_enc = st->buf_speech_enc[st->L_frame - 1]; + st->mem_wsp_enc = st->buf_wspeech_enc[st->L_frame + L_SUBFR - 1]; + } + else if ( !st->tcxonly && last_total_brate > ACELP_32k ) /* coming from TCXonly modes */ + { + mvr2r( st->old_wsp, st->buf_wspeech_enc + st->L_frame + L_SUBFR - L_WSP_MEM, L_WSP_MEM ); + + /*Resamp buffers needed only for ACELP*/ + if ( st->L_frame == L_FRAME16k ) + { + lerp( st->buf_wspeech_enc + st->L_frame + L_SUBFR - L_WSP_MEM, st->buf_wspeech_enc + st->L_frame + L_SUBFR - 310, 310, L_WSP_MEM ); + } + st->hLPDmem->mem_w0 = 0; + st->mem_wsp_enc = st->buf_wspeech_enc[st->L_frame + L_SUBFR - 1]; + } + + st->new_speech_enc = st->buf_speech_enc + st->encoderPastSamples_enc + st->encoderLookahead_enc; + st->new_speech_enc_pe = st->buf_speech_enc_pe + st->encoderPastSamples_enc + st->encoderLookahead_enc; + + if ( hTcxEnc != NULL ) + { + hTcxEnc->new_speech_ltp = hTcxEnc->buf_speech_ltp + st->encoderPastSamples_enc + st->encoderLookahead_enc; + } + + if ( st->hTcxEnc != NULL ) + { + st->hTcxEnc->new_speech_TCX = st->input_buff + st->input_Fs / FRAMES_PER_SEC; /* note: in EVS st->new_speech_TCX == st->input - 0.9375ms; in IVAS st->new_speech_TCX == st->input */ + st->hTcxEnc->speech_TCX = st->hTcxEnc->new_speech_TCX - st->encoderLookahead_FB; + } + + st->speech_enc = st->buf_speech_enc + st->encoderPastSamples_enc; + st->speech_enc_pe = st->buf_speech_enc_pe + st->encoderPastSamples_enc; + + if ( hTcxEnc != NULL ) + { + hTcxEnc->speech_ltp = hTcxEnc->buf_speech_ltp + st->encoderPastSamples_enc; + } + + if ( st->element_mode > EVS_MONO ) + { + st->wspeech_enc = st->buf_wspeech_enc + st->L_frame + L_SUBFR; + } + else + { + st->wspeech_enc = st->buf_wspeech_enc + st->L_frame + L_subfr; + } + + if ( st->ini_frame == 0 || st->L_frame != L_frame_old || st->last_codec_mode == MODE1 ) + { + set_zero( st->buf_synth, OLD_SYNTH_SIZE_ENC + L_FRAME32k ); + } + st->synth = st->buf_synth + st->L_frame + L_subfr; + + return; +} + + +/*-----------------------------------------------------------------------* + * init_core_sig_ana() + * + * + *-----------------------------------------------------------------------*/ + +static void init_core_sig_ana( + Encoder_State *st ) +{ + /* Pre-emphasis factor and memory */ + if ( st->fscale < ( 16000 * FSCALE_DENOM ) / 12800 ) + { + st->preemph_fac = PREEMPH_FAC; /*WB*/ + } + else if ( st->fscale < ( 24000 * FSCALE_DENOM ) / 12800 ) + { + st->preemph_fac = PREEMPH_FAC_16k; /*WB*/ + } + else + { + st->preemph_fac = PREEMPH_FAC_SWB; /*SWB*/ + } + + if ( st->sr_core == INT_FS_16k ) + { + st->gamma = GAMMA16k; + } + else + { + st->gamma = GAMMA1; + } + + if ( st->narrowBand ) + { + st->min_band = 1; + st->max_band = 16; + } + else + { + st->min_band = 0; + st->max_band = 19; + } + + return; +} + + +/*-----------------------------------------------------------------------* + * init_acelp() + * + * + *-----------------------------------------------------------------------*/ + +static void init_acelp( + Encoder_State *st, + const int16_t L_frame_old, + const int32_t total_brate, + const int32_t last_total_brate ) +{ + int16_t mem_syn_r_size_old; + int16_t mem_syn_r_size_new; + + LPD_state_HANDLE hLPDmem = st->hLPDmem; + + /* Init pitch lag */ + if ( st->element_mode == IVAS_CPE_MDCT ) + { + /* TCX LTP ana always runs @12.8kHz */ + st->pit_res_max = initPitchLagParameters( 12800, &st->pit_min, &st->pit_fr1, &st->pit_fr1b, &st->pit_fr2, &st->pit_max ); + } + else + { + st->pit_res_max = initPitchLagParameters( st->sr_core, &st->pit_min, &st->pit_fr1, &st->pit_fr1b, &st->pit_fr2, &st->pit_max ); + } + + /* Init LPDmem */ + if ( st->ini_frame == 0 ) + { + if ( hLPDmem != NULL ) + { + set_zero( hLPDmem->syn, 1 + M ); + set_zero( hLPDmem->mem_syn_r, L_SYN_MEM ); + } + + if ( st->hTcxEnc != NULL ) + { + set_zero( st->hTcxEnc->Txnq, L_FRAME32k / 2 + 64 ); + st->hTcxEnc->acelp_zir = st->hTcxEnc->Txnq + ( st->L_frame / 2 ); + } + } + else /*Rate switching*/ + { + if ( st->hTcxEnc != NULL ) + { + if ( st->last_core == ACELP_CORE ) + { + lerp( st->hTcxEnc->Txnq, st->hTcxEnc->Txnq, st->L_frame / 2, L_frame_old / 2 ); + } + else + { + lerp( st->hTcxEnc->Txnq, st->hTcxEnc->Txnq, st->hTcxCfg->tcx_mdct_window_length, st->hTcxCfg->tcx_mdct_window_length_old ); + } + st->hTcxEnc->acelp_zir = st->hTcxEnc->Txnq + ( st->L_frame / 2 ); + } + + /* Rate switching */ + if ( st->last_codec_mode == MODE1 && st->element_mode == EVS_MONO ) + { + if ( hLPDmem != NULL ) + { + mvr2r( hLPDmem->mem_syn1, hLPDmem->mem_syn2, M ); + set_zero( hLPDmem->syn, M ); + } + + if ( st->hTcxEnc != NULL ) + { + set_zero( st->hTcxEnc->Txnq, L_FRAME32k / 2 + 64 ); + } + } + + if ( st->last_core == AMR_WB_CORE ) + { + st->next_force_safety_net = 1; + st->last_core = ACELP_CORE; + } + + if ( st->last_codec_mode == MODE1 && st->last_core == HQ_CORE ) + { + /*Reset of ACELP memories*/ + st->next_force_safety_net = 1; + st->rate_switching_reset = 1; + if ( hLPDmem != NULL ) + { + hLPDmem->tilt_code = TILT_CODE; + set_zero( hLPDmem->old_exc, L_EXC_MEM ); + set_zero( hLPDmem->syn, 1 + M ); + hLPDmem->mem_w0 = 0.0f; + set_zero( hLPDmem->mem_syn, M ); + set_zero( hLPDmem->mem_syn2, M ); + } + + /* unquantized LPC*/ + if ( !( ( total_brate >= ACELP_16k40 && total_brate <= ACELP_24k40 ) && total_brate == last_total_brate && st->last_bwidth == st->bwidth ) ) + { + mvr2r( st->lsp_old1, st->lspold_enc, M ); /*lsp old @12.8kHz*/ + if ( st->L_frame == L_FRAME16k ) + { + lsp_convert_poly( st->lspold_enc, st->L_frame, 0 ); + } + } + mvr2r( st->lspold_enc, st->lsp_old, M ); /*used unquantized values for mid-LSF Q*/ + lsp2lsf( st->lsp_old, st->lsf_old, M, st->sr_core ); + + st->last_core = TCX_20_CORE; + + st->hTcxCfg->last_aldo = 1; /*It was previously ALDO*/ + st->hTcxCfg->tcx_curr_overlap_mode = ALDO_WINDOW; + + /*ALDO overlap windowed past: also used in MODE1 but for other MDCT-FB*/ + set_f( st->hTcxEnc->old_out, 0, st->L_frame ); + } + else + { + if ( st->L_frame != L_frame_old && st->L_frame <= L_FRAME16k && L_frame_old <= L_FRAME16k ) /* Rate switching between 12.8 and 16 kHz*/ + { + float tmp, A[M + 1], Ap[M + 1], tmp_buf[M + 1]; + + /* convert quantized LSP vector */ + st->rate_switching_reset = lsp_convert_poly( st->lsp_old, st->L_frame, 0 ); + lsp2lsf( st->lsp_old, st->lsf_old, M, st->sr_core ); + + if ( st->L_frame == L_FRAME16k ) + { + mvr2r( st->lsp_old, st->lspold_enc, M ); + } + else + { + mvr2r( st->lsp_old1, st->lspold_enc, M ); + } + + /* Update wsyn */ + if ( hLPDmem != NULL ) + { + synth_mem_updt2( st->L_frame, st->last_L_frame, hLPDmem->old_exc, hLPDmem->mem_syn_r, hLPDmem->mem_syn2, hLPDmem->mem_syn, ENC ); + lsp2a_stab( st->lsp_old, A, M ); + weight_a( A, Ap, GAMMA1, M ); + tmp = 0.f; + tmp_buf[0] = 0.f; + mvr2r( hLPDmem->mem_syn2, tmp_buf + 1, M ); + deemph( tmp_buf + 1, st->preemph_fac, M, &tmp ); + residu( Ap, M, tmp_buf + M, &tmp, 1 ); + hLPDmem->mem_w0 = st->wspeech_enc[-1] - tmp; + } + } + else if ( st->L_frame != L_frame_old ) /* Rate switching involving TCX only modes */ + { + /*Partial reset of ACELP memories*/ + st->next_force_safety_net = 1; + st->rate_switching_reset = 1; + + /*reset partly some memories*/ + if ( hLPDmem != NULL ) + { + hLPDmem->tilt_code = TILT_CODE; + set_zero( hLPDmem->old_exc, L_EXC_MEM ); + + /*Resamp others memories*/ + /*Size of LPC syn memory*/ + mem_syn_r_size_old = (int16_t) ( 1.25 * L_frame_old / 20.f ); + mem_syn_r_size_new = (int16_t) ( 1.25 * st->L_frame / 20.f ); + lerp( hLPDmem->mem_syn_r + L_SYN_MEM - mem_syn_r_size_old, hLPDmem->mem_syn_r + L_SYN_MEM - mem_syn_r_size_new, mem_syn_r_size_new, mem_syn_r_size_old ); + mvr2r( hLPDmem->mem_syn_r + L_SYN_MEM - M, hLPDmem->mem_syn, M ); + mvr2r( hLPDmem->mem_syn, hLPDmem->mem_syn2, M ); + + /*Untouched memories : LPDmem->syn & LPDmem->mem_w0*/ + hLPDmem->mem_w0 = 0; + } + + /* unquantized LPC*/ + mvr2r( st->lsp_old1, st->lspold_enc, M ); /*lsp old @12.8kHz*/ + if ( st->L_frame == L_FRAME16k ) + { + lsp_convert_poly( st->lspold_enc, st->L_frame, 0 ); + } + mvr2r( st->lspold_enc, st->lsp_old, M ); /*used unquantized values for mid-LSF Q*/ + lsp2lsf( st->lsp_old, st->lsf_old, M, st->sr_core ); + } + /* necessary in BASOP only, due to different representations of st->lsf_old */ + /* else if ( !st->tcxonly && (st->L_frame == L_FRAME16k) && (st->last_total_brate > ACELP_32k) ) */ + /* { */ + /* lsp2lsf( st->lsp_old, st->lsf_old, M, st->sr_core ); */ + /* } */ + } + } + + if ( st->last_bwidth == NB && st->bwidth != NB && st->ini_frame != 0 ) + { + st->rate_switching_reset = 1; + } + + /* Post-processing */ + if ( hLPDmem != NULL ) + { + set_zero( hLPDmem->dispMem, 8 ); + hLPDmem->gc_threshold = 0.0f; + } + + /* Pulse Search configuration */ + st->acelp_autocorr = 1; + + /*Use for 12.8 kHz sampling rate and low bitrates, the conventional pulse search->better SNR*/ + if ( ( total_brate <= ACELP_9k60 || st->rf_mode == 1 ) && st->sr_core == INT_FS_12k8 ) + { + st->acelp_autocorr = 0; + } + + /*BPF parameters for adjusting gain in function of background noise*/ + if ( st->codec_mode == MODE2 ) + { + st->pst_lp_ener = 0.0f; + if ( st->last_codec_mode == MODE1 ) + { + st->pst_mem_deemp_err = 0.0f; + } + } + + + return; +} + +/*-----------------------------------------------------------------------* + * init_modes() + * + * + *-----------------------------------------------------------------------*/ + +static void init_modes( + Encoder_State *st, + const int32_t last_total_brate ) +{ + int16_t n; + + /* Restrict ACE/TCX20/TCX10 mode */ + st->restrictedMode = getRestrictedMode( st->element_mode, st->total_brate, st->Opt_AMR_WB ); + + st->acelpEnabled = ( st->restrictedMode & 1 ) == 1; + st->tcx20Enabled = ( st->restrictedMode & 2 ) == 2; + st->tcx10Enabled = ( st->restrictedMode & 4 ) == 4; + + /* TCX mode (TCX20 TCX10_10 or NO_TCX) */ + if ( st->hTcxEnc != NULL ) + { + st->hTcxEnc->tcxMode = NO_TCX; + } + + /*st->bits_frame_nominal = (int16_t)( (float)st->L_frame * (float)FSCALE_DENOM * (float)st->total_brate / ( (float)st->fscale * 12800.0f ) );*/ + st->bits_frame_nominal = (int16_t) ( (float) st->L_frame / (float) st->fscale * (float) FSCALE_DENOM / 128.0f * (float) st->total_brate / 100.0f + 0.49f ); + + if ( st->Opt_AMR_WB ) + { + st->bits_frame = st->bits_frame_nominal; + st->bits_frame_core = st->bits_frame_nominal; + st->frame_size_index = 0; + } + else + { + for ( n = 0; n < FRAME_SIZE_NB; n++ ) + { + + if ( n < FRAME_SIZE_NB - 1 ) + { + if ( FrameSizeConfig[n].frame_bits <= st->bits_frame_nominal && FrameSizeConfig[n + 1].frame_bits > st->bits_frame_nominal ) + { + st->frame_size_index = n; + st->bits_frame = st->bits_frame_nominal; + st->bits_frame_core = st->bits_frame_nominal - FrameSizeConfig[n].transmission_bits - FrameSizeConfig[n].bandwidth_bits - FrameSizeConfig[n].reserved_bits; + break; + } + } + else + { + if ( FrameSizeConfig[n].frame_bits <= st->bits_frame_nominal ) + { + st->frame_size_index = n; + st->bits_frame = st->bits_frame_nominal; + st->bits_frame_core = st->bits_frame_nominal - FrameSizeConfig[n].transmission_bits - FrameSizeConfig[n].bandwidth_bits - FrameSizeConfig[n].reserved_bits; + break; + } + } + } + } + + /* Reconfigure core */ + core_coder_reconfig( st, last_total_brate ); + + return; +} diff --git a/lib_enc/core_enc_ol.c b/lib_enc/core_enc_ol.c new file mode 100644 index 0000000000000000000000000000000000000000..278f47b73f60981a54ec792b6233c8fa831814a1 --- /dev/null +++ b/lib_enc/core_enc_ol.c @@ -0,0 +1,1176 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include "options.h" +#include +#include "prot.h" +#include "rom_com.h" +#include "basop_proto_func.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * Local function prototypes + *-------------------------------------------------------------------*/ + +static void BITS_ALLOC_ACELP_config_rf( const int16_t coder_type, float *tilt_code, int16_t *rf_frame_type, int16_t *rf_target_bits, const int16_t nb_subfr, const int16_t rf_fec_indicator, float *pitch_buf ); + +static void BITS_ALLOC_TCX_config_rf( int16_t *rf_frame_type, int16_t *rf_target_bits, const int16_t PLC_Mode, const int16_t coder_type, const int16_t last_core, const int16_t TD_Mode ); + +static void closest_centroid_rf( const float *data, const float *weights, const float *quantizer, const int16_t centroids, const int16_t length, int16_t *ind_vec ); + + +/*-------------------------------------------------------------------* + * core_encode_openloop() + * + * Open-loop core encoder + *-------------------------------------------------------------------*/ + +void core_encode_openloop( + Encoder_State *st, /* i/o: encoder state structure */ + const float Aw[NB_SUBFR16k * ( M + 1 )], /* i : weighted A(z) unquant. for subframes*/ + const float lsp_new[M], /* i : LSPs at the end of the frame */ + const float lsp_mid[M], /* i : LSPs at the middle of the frame */ + float *pitch_buf, /* i/o: floating pitch values for each subfr*/ + float *voice_factors, /* o : voicing factors */ + float *ptr_bwe_exc, /* o : excitation for SWB TBE */ + const int16_t vad_hover_flag /* i : VAD hangover flag */ +) +{ + TCX_ENC_HANDLE hTcxEnc = st->hTcxEnc; + + float lsf_q[M], lsp_q[M], lspmid_q[M]; + Word16 lspq_ind[M]; + Word16 A_q_ind[M + 1]; + float A_q_ace[NB_SUBFR16k * ( M + 1 )]; + float A_q_tcx[NB_SUBFR16k * ( M + 1 )]; + int16_t param_lpc[NPRM_LPC_NEW]; + int16_t nbits_lpc; + int16_t param_core[2 * NPRM_DIV]; + int16_t target_bits; + float stab_fac; + int16_t indexBuffer[N_MAX + 1]; + CONTEXT_HM_CONFIG hm_cfg; + float lsp_tcx_q[M], lsf_tcx_q[M]; + int16_t tcx_lpc_cdk; + float A_w[M + 1]; + float gain_pitch_buf[NB_SUBFR16k]; + float gain_code_buf[NB_SUBFR16k]; + int16_t bits_param_lpc[10], no_param_lpc; + + /* lsf quant parameters */ + float lsp_q_rf[M]; + float Aq_rf[NB_SUBFR * ( M + 1 )]; + float stab_fac_rf; + float *exc_rf; + float *syn_rf; + int16_t rf_PLC_Mode; + int16_t TD_Mode; + int16_t rf_tcx_lpc_cdk; + float lsp[M], lsf[M]; + float rf_mem_MA[M]; + float exc_buf_rf[L_EXC_MEM + L_FRAME + 1]; + float syn_buf_rf[M + L_FRAME16k + L_FRAME16k / 2]; + + float w_rf[M], lsf_uq_rf[M]; + float lsf_q_1st_rf[M], lsf_q_d_rf[M], lsf_q_rf[M]; + float lsp_old_q_rf[M], lsf_old_q_rf[M]; + + LPD_state_HANDLE hLPDmem = st->hLPDmem; + + /*--------------------------------------------------------------* + * back up parameters for RF + *---------------------------------------------------------------*/ + + /* back up the old LSPs and LSFs */ + mvr2r( st->lsp_old, lsp_old_q_rf, M ); + mvr2r( st->lsf_old, lsf_old_q_rf, M ); + + /* back up old exc before primary encoding */ + set_f( exc_buf_rf, 0, ( L_EXC_MEM + L_FRAME + 1 ) ); + exc_rf = exc_buf_rf + L_EXC_MEM; + mvr2r( hLPDmem->old_exc, exc_buf_rf, L_EXC_MEM ); + + /* back up old synthesis before primary encoding */ + set_f( syn_buf_rf, 0, ( M + L_FRAME16k + L_FRAME16k / 2 ) ); + syn_rf = syn_buf_rf + M; + mvr2r( hLPDmem->mem_syn, syn_buf_rf, M ); + + if ( st->Opt_RF_ON ) + { + /* back up syn2 mem */ + mvr2r( hLPDmem->mem_syn2, st->hRF->rf_mem_syn2, M ); + + /* back up LPD mem_w0 target generation memory */ + st->hRF->rf_mem_w0 = hLPDmem->mem_w0; + + /* back up clip gain memory */ + mvr2r( st->clip_var, st->hRF->rf_clip_var, 6 ); + + /* back up tilt code */ + st->hRF->rf_tilt_code = hLPDmem->tilt_code; + + /* back up dispMem */ + mvr2r( hLPDmem->dispMem, st->hRF->rf_dispMem, 8 ); + + /* back up gc_threshold for noise addition */ + st->hRF->rf_gc_threshold = hLPDmem->gc_threshold; + } + + + /*--------------------------------------------------------------* + * Initializations + *---------------------------------------------------------------*/ + + tcx_lpc_cdk = 0; + set_s( param_lpc, 0, NPRM_LPC_NEW ); + set_s( param_core, 0, 2 * NPRM_DIV ); + mvs2s( hTcxEnc->tcxltp_param, ¶m_core[1 + NOISE_FILL_RANGES], LTPSIZE ); + + no_param_lpc = 0; /* avoid MSVC warnings */ + nbits_lpc = 0; /* avoid MSVC warnings */ + stab_fac = 0.0f; /* avoid MSVC warnings */ + + hm_cfg.indexBuffer = indexBuffer; + + /*--------------------------------------------------------------* + * LPC Quantization + *---------------------------------------------------------------*/ + + if ( st->lpcQuantization == 1 && st->coder_type == VOICED ) + { + ( &( st->acelp_cfg ) )->midLpc = 0; + } + else + { + ( &( st->acelp_cfg ) )->midLpc = st->acelp_cfg.midLpc_enable; + } + + if ( st->core == ACELP_CORE || !st->enableTcxLpc ) + { + if ( st->envWeighted ) + { + /* Unweight the envelope */ + E_LPC_lsp_unweight( st->lsp_old, st->lsp_old, st->lsf_old, 1.0f / st->gamma ); + st->envWeighted = 0; + } + + if ( st->core == TCX_20_CORE ) + { + lpc_quantization( st, lsp_new, lsp_mid, lsp_q, lsf_q, lspmid_q, AUDIO, st->acelp_cfg.midLpc, param_lpc, &nbits_lpc, bits_param_lpc, &no_param_lpc ); + } + else + { + lpc_quantization( st, lsp_new, lsp_mid, lsp_q, lsf_q, lspmid_q, st->coder_type, st->acelp_cfg.midLpc, param_lpc, &nbits_lpc, bits_param_lpc, &no_param_lpc ); + } + + /*-------------------------------------------------------------* + * Rate switching: reset + *-------------------------------------------------------------*/ + + if ( st->rate_switching_reset ) + { + mvr2r( lsp_q, st->lsp_old, M ); + mvr2r( lsf_q, st->lsf_old, M ); + mvr2r( lsp_q, lspmid_q, M ); + } + + /*--------------------------------------------------------------* + * LPC Interpolation + *---------------------------------------------------------------*/ + + stab_fac = lsf_stab( lsf_q, st->lsf_old, 0, st->L_frame ); + } + + + /*--------------------------------------------------------------* + * Run ACELP + *---------------------------------------------------------------*/ + + if ( st->core == ACELP_CORE ) + { + if ( st->acelp_cfg.midLpc ) + { + int_lsp4( st->L_frame, st->lsp_old, lspmid_q, lsp_q, A_q_ace, M, 0 ); + } + else + { + int_lsp( st->L_frame, st->lsp_old, lsp_q, A_q_ace, M, interpol_frac_12k8, 0 ); + } + + /* Calculate target bits */ + target_bits = st->bits_frame_core - nbits_lpc - st->nb_bits_header_ace; + + if ( st->rf_mode ) + { + /* joint bit allocation for redundant frame and TBE */ + /* calculate target bits for core coding */ + target_bits -= st->rf_target_bits_write; + } + + if ( st->igf ) + { + target_bits -= get_tbe_bits( st->total_brate, st->bwidth, st->rf_mode ); + } + + if ( st->acelp_cfg.midLpc ) + { + target_bits -= MIDLSF_NBITS; + } + + if ( st->hPlcExt && st->hPlcExt->enableGplc ) + { + target_bits -= st->hPlcExt->nBits; + } + + /* reset TBE buffers previous frame frame wasn't ACELP*/ + if ( st->last_core != ACELP_CORE ) + { + TBEreset_enc( st->hBWE_TD, st->last_core, st->bwidth ); + } + + /* Run ACELP encoder */ + coder_acelp( st, Aw, A_q_ace, st->speech_enc_pe, hLPDmem, param_core, stab_fac, target_bits, gain_pitch_buf, gain_code_buf, pitch_buf, voice_factors, ptr_bwe_exc ); + + if ( st->hPlcExt ) + { + st->glr_idx[0] = encSideSpecPowDiffuseDetector( st->hPlcExt->last_lsf_ref, st->hPlcExt->last_lsf_con, st->last_sr_core, &( st->prev_lsf4_mean ), st->glr, st->coder_type ); + + mvr2r( lsf_q, st->hPlcExt->last_lsf_ref, M ); + mvr2r( st->hPlcExt->lsf_con, st->hPlcExt->last_lsf_con, M ); + updateSpecPowDiffuseIdx( gain_pitch_buf, gain_code_buf, st->glr_idx, st->mean_gc ); + + if ( st->last_stab_fac > 0.02 ) + { + st->glr_idx[0] = 0; + } + + st->hPlcExt->LPDmem = hLPDmem; + + encoderSideLossSimulation( st, st->hPlcExt, lsf_q, stab_fac, st->hPlcExt->calcOnlylsf, st->L_frame ); + } + st->last_stab_fac = stab_fac; + + hTcxEnc->tcxltp_norm_corr_past = st->voicing[1]; + st->hTcxCfg->tcx_curr_overlap_mode = st->hTcxCfg->tcx_last_overlap_mode = ALDO_WINDOW; + } + + + /*--------------------------------------------------------------* + * Run TCX20 + *---------------------------------------------------------------*/ + + if ( st->core == TCX_20_CORE ) + { + if ( st->enableTcxLpc ) + { + if ( st->rf_mode ) + { + mvr2r( st->mem_MA, rf_mem_MA, M ); + } + + tcx_lpc_cdk = tcxlpc_get_cdk( st->hTcxCfg->coder_type ); + + /* Get the envelope corresponding to the current frame */ + E_LPC_int_lpc_tcx( st->lspold_enc, lsp_new, A_q_tcx ); + + /* Weight the envelope */ + weight_a( A_q_tcx, A_q_tcx, st->gamma, M ); + + /* Save the weighted envelope */ + mvr2r( A_q_tcx, A_w, M + 1 ); + + /* Convert to lsp and lsf */ + a2lsp_stab( A_q_tcx, lsp, lsp_new ); + lsp2lsf( lsp, lsf, M, INT_FS_12k8 ); + + /* Quantize */ + Q_lsf_tcxlpc( lsf, lsf_tcx_q, lspq_ind, param_lpc, st->narrowBand, tcx_lpc_cdk, st->mem_MA, st->hTcxCfg->coder_type, st->Bin_E ); + + /* Account for consumed bits */ + nbits_lpc = TCXLPC_NUMBITS; + if ( param_lpc[0] ) + { + nbits_lpc += TCXLPC_IND_NUMBITS; + } + + /* Convert quantized lsf to lsp and A */ + lsf2lsp( lsf_tcx_q, lsp_tcx_q, M, INT_FS_12k8 ); + lsp2a_stab( lsp_tcx_q, A_q_tcx, M ); + } + else + { + E_LPC_int_lpc_tcx( st->lsp_old, lsp_q, A_q_tcx ); + } + + if ( hTcxEnc->tcx_lpc_shaped_ari ) + { + basop_E_LPC_f_lsp_a_conversion( lspq_ind, A_q_ind, M ); + } + + /* Calculate target bits */ + target_bits = st->bits_frame_core - nbits_lpc - st->nb_bits_header_tcx; + if ( st->rf_mode ) + { + /* joint bit allocation for redundant frame and TBE */ + /* calculate target bits for core coding */ + target_bits -= st->rf_target_bits_write; + } + + if ( st->mdct_sw == MODE1 ) + { + /* Account for core signaling bits difference: bandwidth and ACELP/TCX signaling bit are replaced */ + target_bits += ( FrameSizeConfig[st->frame_size_index].bandwidth_bits + 1 ) - signaling_mode1_tcx20_enc( st, 0 ); + } + else if ( st->mdct_sw_enable == MODE2 ) + { + --target_bits; + } + + if ( st->hPlcExt && st->hPlcExt->enableGplc ) + { + target_bits -= st->hPlcExt->nBits; + } + + /* subtract bits for TCX overlap mode (1 bit: full, 2 bits: half or no overlap) */ + target_bits -= ( st->hTcxCfg->tcx_curr_overlap_mode == HALF_OVERLAP || st->hTcxCfg->tcx_curr_overlap_mode == MIN_OVERLAP ) ? 2 : 1; + + target_bits -= hTcxEnc->tcxltp_bits; + + /* Run TCX20 encoder */ + coder_tcx( st, st->hTcxCfg, A_q_tcx, A_q_ind, st->synth, st->L_frame, hTcxEnc->L_frameTCX, st->hTcxCfg->tcx_coded_lines, target_bits, hTcxEnc->spectrum_long, param_core, &hm_cfg, vad_hover_flag ); + + coder_tcx_post( st, A_q_tcx, Aw ); + + if ( st->hPlcExt ) + { + st->hPlcExt->LPDmem = hLPDmem; + + GplcTcxEncSetup( hTcxEnc->tcxltp_pitch_int, st->hPlcExt ); + } + + if ( st->enableTcxLpc ) + { + E_LPC_lsp_unweight( lsp_tcx_q, lsp_q, lsf_q, 1.0f / st->gamma ); /* Update lsf_q for encoderSideLossSimulation() */ + } + if ( st->hPlcExt ) + { + encoderSideLossSimulation( st, st->hPlcExt, lsf_q, stab_fac, 1, st->L_frame ); + } + } + + + /* Update lsp/lsf memory */ + mvr2r( lsp_new, st->lspold_enc, M ); + + if ( st->enableTcxLpc && st->core != ACELP_CORE ) + { + /* Update lsf / lsp memory */ + mvr2r( lsf_tcx_q, st->lsf_old, M ); + mvr2r( lsp_tcx_q, st->lsp_old, M ); + st->envWeighted = 1; + + /* Update ACELP quantizer state */ + lsf_update_memory( st->narrowBand, st->lsf_old, st->mem_MA, st->mem_MA ); + st->pstreaklen = 0; + st->streaklimit = 1.0f; + + /* check resonance for pitch clipping algorithm */ + gp_clip_test_lsf( st->element_mode, st->core_brate, st->lsf_old, st->clip_var, 0 ); + mvr2r( st->lsf_old, st->mem_AR, M ); + } + else + { + mvr2r( lsf_q, st->lsf_old, M ); + mvr2r( lsp_q, st->lsp_old, M ); + } + + if ( st->Opt_DTX_ON ) + { + /* update CNG parameters in active frames */ + if ( st->bwidth == NB && st->enableTcxLpc && st->core != ACELP_CORE ) + { + float buf[L_LP], res[L_FRAME], A[M + 1], r[M + 1], tmp, lsptmp[M]; + + assert( st->L_frame == L_FRAME ); + + mvr2r( st->synth + L_FRAME - L_LP, buf, L_LP ); + tmp = st->synth[L_FRAME - L_LP - 1]; + preemph( buf, st->preemph_fac, L_LP, &tmp ); + autocorr( buf, r, M, L_LP, LP_assym_window, 0, 0, 0 ); + lag_wind( r, M, INT_FS_12k8, LAGW_WEAK ); + lev_dur( A, r, M, NULL ); + a2lsp_stab( A, lsptmp, lsp_new ); + + residu( A, M, buf + L_LP - L_FRAME, res, L_FRAME ); + + cng_params_upd( lsptmp, res, st->L_frame, &st->hTdCngEnc->ho_circ_ptr, st->hTdCngEnc->ho_ener_circ, &st->hTdCngEnc->ho_circ_size, st->hTdCngEnc->ho_lsp_circ, ENC, st->hTdCngEnc->ho_env_circ, &st->hTdCngEnc->cng_buf_cnt, st->hTdCngEnc->cng_exc2_buf, st->hTdCngEnc->cng_brate_buf, st->hDtxEnc->last_active_brate, st->element_mode, st->hFdCngEnc->hFdCngCom->CngBandwidth ); + } + else + { + cng_params_upd( lsp_new, hLPDmem->old_exc + L_EXC_MEM - st->L_frame, st->L_frame, &st->hTdCngEnc->ho_circ_ptr, st->hTdCngEnc->ho_ener_circ, &st->hTdCngEnc->ho_circ_size, st->hTdCngEnc->ho_lsp_circ, ENC, st->hTdCngEnc->ho_env_circ, &st->hTdCngEnc->cng_buf_cnt, st->hTdCngEnc->cng_exc2_buf, st->hTdCngEnc->cng_brate_buf, st->hDtxEnc->last_active_brate, st->element_mode, st->hFdCngEnc->hFdCngCom->CngBandwidth ); + } + + if ( st->L_frame == L_FRAME ) + { + /* store LSPs@16k, potentially to be used in CNG@16k */ + mvr2r( st->lsp_old16k, &( st->hTdCngEnc->ho_lsp_circ2[( st->hTdCngEnc->ho_circ_ptr ) * M] ), M ); + } + + /* Set 16k LSP flag for CNG buffer */ + st->hTdCngEnc->ho_16k_lsp[st->hTdCngEnc->ho_circ_ptr] = ( st->L_frame == L_FRAME ? 0 : 1 ); + + /* efficient DTX hangover control */ + if ( st->hTdCngEnc->burst_ho_cnt > 1 ) + { + dtx_hangover_control( st, lsp_new ); + } + } + + /*--------------------------------------------------------------* + * Adaptive Bass Post-filter + *---------------------------------------------------------------*/ + + if ( st->core > ACELP_CORE || st->rate_switching_reset ) + { + /*TCX mode: copy values*/ + set_zero( st->mem_bpf, 2 * L_FILT16k ); /*TCX->no gain*/ + set_zero( st->mem_error_bpf, 2 * L_FILT16k ); /*TCX->no gain*/ + st->bpf_gain_param = 0; + } + else if ( st->acelp_cfg.bpf_mode >= 1 ) + { + /*ACELP: estimate bpf parameter with delay=0*/ + + /*Estimate bpf parameter*/ + bass_pf_enc( st->speech_enc, st->synth, pitch_buf, gain_pitch_buf, st->L_frame, L_SUBFR, st->mem_bpf, st->mem_error_bpf, &( st->bpf_gain_param ), st->acelp_cfg.bpf_mode, &( st->pst_lp_ener ), &( st->pst_mem_deemp_err ) ); + } + + /*--------------------------------------------------------------* + * Generate Bitstream + *---------------------------------------------------------------*/ + + enc_prm( st, param_core, param_lpc, &hm_cfg, bits_param_lpc, no_param_lpc ); + + /* Channel-aware mode - encode partial copy */ + if ( st->rf_mode ) + { + RF_ENC_HANDLE hRF = st->hRF; + + set_f( lsf_q_1st_rf, 0.0f, M ); + + if ( st->core == ACELP_CORE ) + { + /* convert lsp to lsf */ + lsp2lsf( lsp_new, lsf_uq_rf, M, st->sr_core ); + + /* first stage VQ, 8 bits; reuse TCX high rate codebook */ + hRF->rf_indx_lsf[0][0] = vlpc_1st_cod( lsf_uq_rf, lsf_q_1st_rf, st->sr_core, w_rf ); + v_sub( lsf_uq_rf, lsf_q_1st_rf, lsf_q_d_rf, M ); + + /* second stage vq */ + closest_centroid_rf( lsf_q_d_rf, w_rf, lsf_q_diff_cb_8b_rf, ( 1 << 8 ), M, &hRF->rf_indx_lsf[0][1] ); + + /* quantized lsf from two stages */ + v_add( lsf_q_1st_rf, lsf_q_diff_cb_8b_rf + M * hRF->rf_indx_lsf[0][1], lsf_q_rf, M ); + + v_sort( lsf_q_rf, 0, M - 1 ); + reorder_lsf( lsf_q_rf, LSF_GAP, M, st->sr_core ); + } + else + { + rf_tcx_lpc_cdk = tcxlpc_get_cdk( GENERIC ); + + /* Quantize */ + Q_lsf_tcxlpc( lsf, lsf_tcx_q, lspq_ind, param_lpc, st->narrowBand, rf_tcx_lpc_cdk, rf_mem_MA, GENERIC, st->Bin_E ); + + /* VQ, 5+4+4 bits; reuse TCX low rate codebook */ + hRF->rf_indx_lsf[0][0] = param_lpc[1]; + hRF->rf_indx_lsf[0][1] = param_lpc[2]; + hRF->rf_indx_lsf[0][2] = param_lpc[3]; + } + + if ( st->core == ACELP_CORE ) + { + /* current n-th ACELP frame and its corresponding partial copy */ + lsf2lsp( lsf_q_rf, lsp_q_rf, M, st->sr_core ); + + /* Interpolate LSPs and convert to LPC */ + int_lsp( st->L_frame, lsp_old_q_rf, lsp_q_rf, Aq_rf, M, interpol_frac_12k8, 0 ); + + /* stability estimation */ + stab_fac_rf = lsf_stab( lsf_q_rf, lsf_old_q_rf, 0, st->L_frame ); + + /* Configure partial copy estimation of the current n-th frame to be packed in future with n+fec_offset frame */ + /* o: rf_frame_type, o: rf_target_bits */ + if ( st->Opt_RF_ON ) + { + BITS_ALLOC_ACELP_config_rf( st->coder_type, hRF->rf_tilt_buf, &hRF->rf_frame_type, &hRF->rf_target_bits, st->nb_subfr, st->rf_fec_indicator, pitch_buf ); + } + + /* RF frame type in the buffer */ + hRF->rf_indx_frametype[0] = hRF->rf_frame_type; + hRF->rf_targetbits_buff[0] = hRF->rf_target_bits; + + if ( hRF->rf_frame_type != RF_NO_DATA ) + { + /* coder_acelp_rf does the partial copy encoding based on the rf frame type chosen for the RF encoding */ + coder_acelp_rf( hRF->rf_target_bits, st->speech_enc_pe, st->coder_type, hRF->rf_frame_type, Aw, Aq_rf, st->voicing, st->pitch, stab_fac_rf, st, &( hRF->acelp_cfg_rf ), exc_rf, syn_rf ); + } + } + else + { + TD_Mode = 1; + hRF->rf_clas[0] = st->clas; + hRF->rf_gain_tcx[0] = param_core[0]; + + /* attenuate somewhat the gain for onset when the correlation with previous frame is too low: avoid preecho */ + if ( hRF->rf_gain_tcx[1] != 0 && hRF->rf_gain_tcx[0] > 1.6 * hRF->rf_gain_tcx[1] && hTcxEnc->tcxltp_gain <= 0.2 ) + { + hRF->rf_gain_tcx[0] = (int16_t) ( 1.6f * hRF->rf_gain_tcx[1] ); + + if ( hRF->rf_gain_tcx[0] > 127 ) + { + hRF->rf_gain_tcx[0] = 127; + } + } + + /* get concealment decision*/ + rf_PLC_Mode = 0; + if ( st->core == TCX_20_CORE && ( st->last_core == TCX_20_CORE ) && ( hRF->rf_second_last_core == TCX_20_CORE ) && ( ( hTcxEnc->tcxltp_pitch_int <= 0.5f * st->L_frame ) || ( hTcxEnc->tcxltp_gain <= 0.4f ) ) && ( hTcxEnc->tcxltp_pitch_int == hRF->rf_tcxltp_pitch_int_past ) && !hRF->rf_last_tns_active && !hRF->rf_second_last_tns_active && !( st->hTcxCfg->fIsTNSAllowed & hTcxEnc->fUseTns[0] ) ) + { + rf_PLC_Mode = 1; + } + else if ( st->last_core != ACELP_CORE ) + { + if ( ( st->clas <= UNVOICED_TRANSITION || st->last_clas <= UNVOICED_TRANSITION || hTcxEnc->tcxltp_gain <= 0.4f ) && st->last_core != -1 ) + { + rf_PLC_Mode = st->last_core; + } + } + + /* call TD1 when the gain drop compare to previous frame*/ + if ( rf_PLC_Mode == 0 && hRF->rf_gain_tcx[1] != 0 && + ( ( st->hTranDet->transientDetector.bIsAttackPresent && hRF->rf_gain_tcx[0] < 0.97 * hRF->rf_gain_tcx[1] ) || + hRF->rf_gain_tcx[0] < 0.90 * hRF->rf_gain_tcx[1] ) ) + { + TD_Mode = 0; + } + else + { + TD_Mode = 1; + } + + /* updates */ + hRF->rf_tcxltp_pitch_int_past = hTcxEnc->tcxltp_pitch_int; + hRF->rf_second_last_tns_active = hRF->rf_last_tns_active; + hRF->rf_last_tns_active = st->hTcxCfg->fIsTNSAllowed & hTcxEnc->fUseTns[0]; + hRF->rf_second_last_core = st->last_core; + + hRF->rf_tcxltp_param[0] = hTcxEnc->tcxltp_param[1]; + + /* Configure partial copy estimation of the current n-th frame to be packed in future with n+fec_offset frame */ + BITS_ALLOC_TCX_config_rf( &hRF->rf_frame_type, &hRF->rf_target_bits, rf_PLC_Mode, st->coder_type, st->last_core, TD_Mode ); + + /* RF frame type in the buffer */ + hRF->rf_indx_frametype[0] = hRF->rf_frame_type; + hRF->rf_targetbits_buff[0] = hRF->rf_target_bits; + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * closest_centroid_rf() + * + * Determine a set of closest VQ centroids for a given input + *-------------------------------------------------------------------*/ + +static void closest_centroid_rf( + const float *data, /* i : input data */ + const float *weights, /* i : weights */ + const float *quantizer, /* i : quantizer table */ + const int16_t centroids, /* i : number of centroids */ + const int16_t length, /* i : dimension of quantiser */ + int16_t *ind_vec /* o : list of best match indice vectors */ +) +{ + int16_t i, j; + float tmp, werr, best_werr; + + ind_vec[0] = 0; + best_werr = 1.0E20f; + + for ( i = 0; i < centroids; i++ ) + { + werr = 0.0f; + for ( j = 0; j < length; j++ ) + { + tmp = (float) *( data + j ) - quantizer[i * length + j]; + werr += (float) ( *( weights + j ) * tmp * tmp ); + } + + if ( werr < best_werr ) + { + ind_vec[0] = i; + best_werr = werr; + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * core_acelp_tcx20_switching() + * + * Open-loop ACELP/TCX20 core decision + *-------------------------------------------------------------------*/ + +void core_acelp_tcx20_switching( + Encoder_State *st, /* i/o: encoder state structure */ + float non_staX, /* i : unbound non-stationarity for sp/mu clas */ + float *pitch_fr, /* i/o: fraction pitch values */ + float *voicing_fr, /* i/o: fractional voicing values */ + const float currFlatness, /* i : flatness */ + const float lsp_mid[M], /* i : LSPs at the middle of the frame */ + const float stab_fac /* i : LP filter stability */ +) +{ + TCX_ENC_HANDLE hTcxEnc = st->hTcxEnc; + int16_t i, j; + float A_q_tcx[NB_SUBFR16k * ( M + 1 )]; + float dsnr, snr_tcx, snr_acelp; + int16_t iter; + float xn_buf[L_MDCT_OVLP_MAX + L_FRAME_PLUS + L_MDCT_OVLP_MAX]; + float Ap[M + 1]; + float gainlpc[FDNS_NPTS]; + float en[N_MAX / 4]; + float sqGain, ener, tmp, fac, offset; + int16_t L_frame = st->L_frame; + int16_t overlap; + int16_t tcx_offset = st->hTcxCfg->tcx_offset; + float *x = hTcxEnc->spectrum_long; + float target; + int16_t T0; + float gain, noise, scale; + float *pt_ener_sfr, ener_sfr[NB_SUBFR16k]; + + /* Check minimum pitch for quantization */ + for ( i = 0; i < 3; i++ ) + { + /* check minimum pitch for quantization */ + if ( st->pitch[i] < PIT_MIN_SHORTER ) + { + st->pitch[i] *= 2; + } + + /* convert pitch values to 16kHz domain */ + if ( st->L_frame == L_FRAME16k ) + { + st->pitch[i] = (int16_t) ( st->pitch[i] * 1.25f + 0.5f ); + } + } + if ( st->narrowBand == 1 ) + { + pitchDoubling_det( st->wspeech_enc, st->pitch, pitch_fr, voicing_fr ); + } + + lsp2a_stab( lsp_mid, A_q_tcx, M ); + + tcx_ltp_encode( st, TCX_20, st->L_frame, st->speech_enc + st->encoderLookahead_enc, hTcxEnc->speech_ltp + st->encoderLookahead_enc, st->wspeech_enc + st->encoderLookahead_enc, st->pitch, hTcxEnc->tcxltp_param, &hTcxEnc->tcxltp_bits, A_q_tcx, 0, st->element_mode ); + + + /* Force TCX when TCX20 in MODE1 is selected */ + if ( st->mdct_sw == MODE1 ) + { + st->core = TCX_20_CORE; + } + else + { + /*--------------------------------------------------------------* + * Estimate TCX SNR + *---------------------------------------------------------------*/ + + target = 1000.f; + if ( st->sr_core == INT_FS_16k ) + { + target = 850.f; + } + else if ( st->sr_core == INT_FS_12k8 ) + { + target = 850.f; + } + + if ( st->narrowBand == 1 ) + { + target = 500.f; + } + + if ( st->last_core == ACELP_CORE ) + { + L_frame += tcx_offset; + + if ( st->hTcxCfg->lfacNext < 0 ) + { + L_frame -= st->hTcxCfg->lfacNext; + tcx_offset = st->hTcxCfg->lfacNext; + } + else + { + tcx_offset = 0; + } + } + + overlap = st->hTcxCfg->tcx_mdct_window_delay; + + mvr2r( hTcxEnc->speech_ltp - ( overlap >> 1 ) + tcx_offset, xn_buf, L_frame + overlap ); + + if ( st->last_core == ACELP_CORE ) + { + if ( tcx_offset < 0 ) + { + set_f( xn_buf, 0.0f, overlap >> 1 ); + } + } + else + { + for ( i = 0; i < overlap; i++ ) + { + xn_buf[i] *= st->hTcxCfg->tcx_mdct_window[i]; + } + } + + for ( i = 0; i < overlap; i++ ) + { + xn_buf[L_frame + i] *= st->hTcxCfg->tcx_mdct_window[overlap - 1 - i]; + } + + TCX_MDCT( xn_buf, x, overlap, L_frame - overlap, overlap, st->element_mode ); + + for ( i = 0; i < L_frame; i++ ) + { + x[i] *= (float) ( L_frame / sqrt( 2 * NORM_MDCT_FACTOR ) ); + } + + weight_a( A_q_tcx, Ap, st->gamma, M ); + + lpc2mdct( Ap, M, gainlpc, FDNS_NPTS, 0 ); + + mdct_preShaping( x, L_frame, gainlpc ); + + if ( st->narrowBand == 1 ) + { + j = (int16_t) ( (float) L_frame * 0.625f ); + + set_f( x + j, 0.0f, L_frame - j ); + } + + for ( i = 0; i < L_frame; i += 4 ) + { + ener = 0.01f + x[i] * x[i] + x[i + 1] * x[i + 1] + x[i + 2] * x[i + 2] + x[i + 3] * x[i + 3]; + en[i / 4] = 9.0f + 10.0f * (float) log10( ener ); + } + + fac = 128.0f; + offset = fac; + + for ( iter = 0; iter < 10; iter++ ) + { + fac *= 0.5f; + offset -= fac; + ener = 0.0f; + + for ( i = 0; i < L_frame / 4; i++ ) + { + tmp = en[i] - offset; + + if ( tmp > 3.0f ) + { + ener += tmp; + } + + if ( ener > target ) + { + offset += fac; + break; + } + } + } + + if ( offset <= 32.f ) + { + offset = -128.f; + } + + sqGain = (float) pow( 10.0f, offset / 20.0f ); + ener = sqGain * sqGain / 12.f * (float) sqrt( 2.f ) / (float) L_frame; + + snr_tcx = 0.0f; + pt_ener_sfr = ener_sfr; + + for ( i = 0; i < st->L_frame; i += L_SUBFR ) + { + *pt_ener_sfr = sum2_f( st->wspeech_enc + i, L_SUBFR ) + 1e-6f; + + snr_tcx += (float) log10( *pt_ener_sfr / ( ener * L_SUBFR ) ); + pt_ener_sfr++; + } + snr_tcx *= ( (float) ( 10 * L_SUBFR ) ) / (float) st->L_frame; + + + /*--------------------------------------------------------------* + * Estimate ACELP SNR + *---------------------------------------------------------------*/ + + scale = 0.055f; + if ( st->sr_core == INT_FS_16k ) + { + scale = 0.092f; + } + else if ( st->sr_core == INT_FS_12k8 ) + { + scale = 0.059f; + } + + if ( st->narrowBand ) + { + scale = 0.15f; + } + + snr_acelp = 0.0f; + fac = (float) st->sr_core / (float) INT_FS_12k8; + pt_ener_sfr = ener_sfr; + + for ( i = 0; i < st->L_frame; i += L_SUBFR ) + { + T0 = (int16_t) ( ( fac * pitch_fr[(int16_t) ( (float) ( i / L_SUBFR ) / fac + 0.5f )] ) + 0.5f ); + gain = get_gain( st->wspeech_enc + i, st->wspeech_enc + i - T0, L_SUBFR, NULL ); + + noise = 1e-6f; + for ( j = 0; j < L_SUBFR; j++ ) + { + tmp = st->wspeech_enc[i + j] - gain * st->wspeech_enc[i + j - T0]; + noise += tmp * tmp; + } + + noise *= scale; + snr_acelp += (float) log10( *pt_ener_sfr / noise ); + pt_ener_sfr++; + } + + snr_acelp *= ( (float) ( 10 * L_SUBFR ) ) / (float) st->L_frame; + + + /*--------------------------------------------------------------* + * Switching Decision + *---------------------------------------------------------------*/ + + dsnr = 0.0f; + /* hysteresis for very small SNR differences between ACELP and TCX */ + + /* try to use TCX instead of ACELP on temporally stationary frames */ + if ( ( snr_acelp > snr_tcx ) && + ( snr_acelp < snr_tcx + 2.0f ) && + ( st->prevTempFlatness + currFlatness < 3.25f || stab_fac == 1.0f || ( st->sr_core == INT_FS_12k8 && st->sp_aud_decision0 == 1 && st->prevTempFlatness + currFlatness < 20.f ) ) && + ( st->acelpFramesCount <= 6 ) ) + { + dsnr = -2.0f; + } + + /* try to use ACELP instead of TCX on transient and "buzzy" frames */ + if ( ( snr_acelp < snr_tcx ) && + ( snr_acelp > snr_tcx - 2.0f ) && + ( st->prevTempFlatness + currFlatness > 3.25f ) && + ( st->acelpFramesCount >= 6 ) ) + { + dsnr = 2.0f; + } + + if ( ( st->sr_core == INT_FS_12k8 ) && ( offset < 74.0f ) && ( non_staX > 5.0f ) && ( snr_acelp >= snr_tcx - 4 ) && st->acelpFramesCount >= 1 && ( ( ( st->hSpMusClas->lps > st->hSpMusClas->lpm ) && mean( voicing_fr, 4 ) >= 0.3f ) || ( st->acelpFramesCount >= 6 && ( st->hSpMusClas->lps > st->hSpMusClas->lpm - 1.5f ) ) ) && ( st->sp_aud_decision0 == 0 ) && st->vad_flag ) + { + /* Fine tuned across various databases based on various metrics to detect TCX frames in speech.*/ + dsnr = 4.0f; + } + + if ( st->flag_noisy_speech_snr ) + { + if ( st->vad_flag || st->Opt_DTX_ON ) + { + dsnr += 2.f; + } + else + { + dsnr -= 2.f; + } + } + + if ( st->sr_core == INT_FS_12k8 && ( non_staX < 2.f || ( st->flag_noisy_speech_snr == 0 && st->vad_flag == 1 && offset == -128.f && st->acelpFramesCount >= 6 ) ) && ( st->last_core == ACELP_CORE || st->last_core == TCX_20_CORE ) ) + { + st->core = st->last_core; + } + else if ( snr_acelp + dsnr > snr_tcx ) + { + st->core = ACELP_CORE; + st->acelpFramesCount = min( MAX16B - 1, st->acelpFramesCount + 1 ); + } + else + { + st->core = TCX_20_CORE; + st->acelpFramesCount = 0; + } + } + + /* Fixed Decision (using -C) */ + if ( st->acelpEnabled == 1 && st->tcx20Enabled == 0 ) + { + st->core = ACELP_CORE; + } + + if ( st->acelpEnabled == 0 && st->tcx20Enabled == 1 ) + { + st->core = TCX_20_CORE; + } + + st->prevTempFlatness = currFlatness; + + return; +} + +/*-------------------------------------------------------------------* + * BITS_ALLOC_ACELP_config_rf() + * + * configure channel aware mode + *-------------------------------------------------------------------*/ + +static void BITS_ALLOC_ACELP_config_rf( + const int16_t coder_type, + float *tilt_code, + int16_t *rf_frame_type, + int16_t *rf_target_bits, + const int16_t nb_subfr, + const int16_t rf_fec_indicator, + float *pitch_buf ) +{ + float mean_tc, min_tilt_code, max_tilt_code; + int16_t nrgMode, ltfMode, ltpMode, gainsMode; + + int16_t en_partial_red = 1; + float dpit1, dpit2, dpit3; + + /* Init */ + *rf_target_bits = 0; + + /* ----------------------------------------* + * RF frame type selection * + *-----------------------------------------*/ + + /* Mean tilt code estimation */ + mean_tc = 0; + mean_tc = mean( tilt_code, nb_subfr ); + + /* Maximum tilt code estimation */ + max_tilt_code = tilt_code[0]; + maximum( tilt_code, nb_subfr, &max_tilt_code ); + + /* Minimum tilt code estimation */ + min_tilt_code = tilt_code[0]; + minimum( tilt_code, nb_subfr, &min_tilt_code ); + + /* ----------------------------------------*/ + /* Decide Criticality */ + /*-----------------------------------------*/ + dpit1 = (float) fabs( pitch_buf[0] - pitch_buf[1] ); + dpit2 = (float) fabs( pitch_buf[1] - pitch_buf[2] ); + dpit3 = (float) fabs( pitch_buf[2] - pitch_buf[3] ); + + if ( rf_fec_indicator == 1 ) + { + if ( max_tilt_code > 0.48f && dpit1 <= 0.0f && dpit2 <= 0.0f && dpit3 <= 0.0f && coder_type == VOICED ) + { + en_partial_red = 0; + } + if ( max_tilt_code > 0.47f && dpit1 <= 1.0f && dpit2 <= 1.0f && dpit3 <= 1.0f && coder_type == GENERIC ) + { + en_partial_red = 0; + } + } + else + { + if ( max_tilt_code > 0.47 && dpit1 <= 0.25f && dpit2 <= 0.25f && dpit3 <= 0.25f && coder_type == VOICED ) + { + en_partial_red = 0; + } + if ( max_tilt_code > 0.45 && dpit1 <= 1.25f && dpit2 <= 1.25f && dpit3 <= 1.25f && coder_type == GENERIC ) + { + en_partial_red = 0; + } + } + + + /* ---------------------------------------------------------* + * Identify number of bits required as per rf frame type * + * ---------------------------------------------------------*/ + + /* rf_mode, 1 bit */ + *rf_target_bits += 1; + + /* rf_fec_offset 2 bits */ + *rf_target_bits += 2; + + /* rf_frame_type, 3 bits */ + *rf_target_bits += 3; + + /* LSF bits 8 + 8 bits */ + *rf_target_bits += 16; + + /* Intialize the RF mode frame type to all-pred */ + *rf_frame_type = RF_ALLPRED; + + if ( coder_type == INACTIVE || en_partial_red == 0 ) + { + *rf_frame_type = RF_NO_DATA; + } + else if ( coder_type == UNVOICED || coder_type == INACTIVE ) + { + *rf_frame_type = RF_NELP; + } + else if ( ( coder_type == GENERIC ) && max_tilt_code < 0.05f ) + { + *rf_frame_type = RF_NOPRED; + } + else if ( ( coder_type == GENERIC ) && mean_tc < 0.3f ) + { + *rf_frame_type = RF_GENPRED; + } + + nrgMode = ACELP_NRG_MODE[1][1][*rf_frame_type]; + ltfMode = ACELP_LTF_MODE[1][1][*rf_frame_type]; + ltpMode = ACELP_LTP_MODE[1][1][*rf_frame_type]; + gainsMode = ACELP_GAINS_MODE[1][1][*rf_frame_type]; + + /* Number of RF bits for different RF coder types */ + switch ( *rf_frame_type ) + { + case RF_ALLPRED: + /* Es_pred bits 3 bits, LTF: 1, pitch: 8,5,5,5, FCB: 0, gain: 7,0,7,0, Diff GFr: 4*/ + *rf_target_bits += ( ACELP_NRG_BITS[nrgMode] + ACELP_LTF_BITS[ltfMode] + ACELP_LTP_BITS_SFR[ltpMode][0] + ACELP_LTP_BITS_SFR[ltpMode][1] + ACELP_LTP_BITS_SFR[ltpMode][2] + ACELP_LTP_BITS_SFR[ltpMode][3] + ACELP_GAINS_BITS[gainsMode] + ACELP_GAINS_BITS[gainsMode] + 2 /*2 bits for PartialCopy GainFrame*/ ); + break; + + case RF_NOPRED: + /* Es_pred bits 3 bits, LTF: 0, pitch: 0, FCB: 7,7,7,7, gain: 6,0,6,0, Diff GFr: 2*/ + /*bits += (3 + 0 + 0 + 28 + 12 + 2); */ /* 64 rf bits */ + *rf_target_bits += ( ACELP_NRG_BITS[nrgMode] + ACELP_LTF_BITS[ltfMode] + 28 + ACELP_GAINS_BITS[gainsMode] + ACELP_GAINS_BITS[gainsMode] + 2 /*2 bits for PartialCopy GainFrame*/ ); + break; + + case RF_GENPRED: + /* Es_pred bits 3 bits, LTF: 0, pitch: 8,0,8,0, FCB: 6,7,5,5, gain: 5,0,5,0, Diff GFr: 0*/ + /*bits += (3 + 0 + 16 + 23 + 10 + 0); */ /* 72 rf bits */ + *rf_target_bits += ( ACELP_NRG_BITS[nrgMode] + ACELP_LTF_BITS[ltfMode] + ACELP_LTP_BITS_SFR[ltpMode][0] + ACELP_LTP_BITS_SFR[ltpMode][1] + ACELP_LTP_BITS_SFR[ltpMode][2] + ACELP_LTP_BITS_SFR[ltpMode][3] + 14 + ACELP_GAINS_BITS[gainsMode] + ACELP_GAINS_BITS[gainsMode] + 2 /*2 bits for PartialCopy GainFrame*/ ); + break; + + case RF_NELP: + /* gain: 19, Diff GFr: 5 */ + /*bits += (19 + 5); */ + *rf_target_bits += ( 19 + NUM_BITS_SHB_FRAMEGAIN ); + break; + + case RF_NO_DATA: + *rf_target_bits = 6; + break; + default: + assert( !"RF_Frame_type does not belong to ACELP Partial copy frame types possible!" ); + break; + } + + return; +} + + +/*-------------------------------------------------------------------* + * BITS_ALLOC_TCX_config_rf() + * + * configure channel aware mode + *-------------------------------------------------------------------*/ + +static void BITS_ALLOC_TCX_config_rf( int16_t *rf_frame_type, int16_t *rf_target_bits, const int16_t PLC_Mode, const int16_t coder_type, const int16_t last_core, const int16_t TD_Mode ) +{ + /* Init: rf_mode + rf_fec_offset + rf_frame_type */ + *rf_target_bits = 1 + 2 + 3; + + if ( coder_type == INACTIVE || last_core == ACELP_CORE ) + { + *rf_frame_type = RF_NO_DATA; + } + else + { + /* classification */ + *rf_target_bits += 2; + + if ( PLC_Mode ) + { + /* TCX global gain = 7 bits */ + *rf_target_bits += 7; + *rf_frame_type = RF_TCXFD; + } + else + { + /* pitch and gain */ + /* LTP data */ + if ( TD_Mode ) + { + *rf_target_bits += 9; + *rf_frame_type = RF_TCXTD2; + } + else + { + *rf_target_bits += 9; + *rf_frame_type = RF_TCXTD1; + } + } + + if ( *rf_frame_type == RF_TCXFD ) + { + /* TCXFD: LSF bits 5 + 4 + 4 bits */ + /* only embed LSF for FD concealment */ + *rf_target_bits += TCXLPC_NUMBITS; + } + } + return; +} diff --git a/lib_enc/core_enc_reconf.c b/lib_enc/core_enc_reconf.c new file mode 100644 index 0000000000000000000000000000000000000000..0ad804f958327c6fce4eb3811ad2097abeb6d2d2 --- /dev/null +++ b/lib_enc/core_enc_reconf.c @@ -0,0 +1,238 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "prot.h" +#include "rom_com.h" +#include "rom_enc.h" +#include "wmc_auto.h" + +/*-----------------------------------------------------------------* + * Funtion core_coder_reconfig * + * ~~~~~~~~~~~~~~~~~~~ * + * - reconfig core coder when switching to another frame type * + *-----------------------------------------------------------------*/ + +void core_coder_reconfig( + Encoder_State *st, + const int32_t last_total_brate ) +{ + TCX_ENC_HANDLE hTcxEnc = st->hTcxEnc; + int16_t bwidth, i, index; + + /*Configuration of ACELP*/ + BITS_ALLOC_init_config_acelp( st->total_brate, st->narrowBand, st->nb_subfr, &( st->acelp_cfg ) ); + + /*Configuration of partial copy*/ + if ( st->Opt_RF_ON ) + { + st->hRF->acelp_cfg_rf.mode_index = 1; + st->hRF->acelp_cfg_rf.midLpc = 0; + st->hRF->acelp_cfg_rf.midLpc_enable = 0; + st->hRF->acelp_cfg_rf.pre_emphasis = 0; + st->hRF->acelp_cfg_rf.formant_enh = 1; + st->hRF->acelp_cfg_rf.formant_tilt = 1; + st->hRF->acelp_cfg_rf.voice_tilt = 1; + st->hRF->acelp_cfg_rf.formant_enh_num = FORMANT_SHARPENING_G1; + st->hRF->acelp_cfg_rf.formant_enh_den = FORMANT_SHARPENING_G2; + } + + if ( st->element_mode == IVAS_CPE_MDCT ) + { + st->nb_bits_header_tcx = 2; /* signal class */ + } + else if ( st->tcxonly ) + { + st->nb_bits_header_tcx = 1 + 1; /*TCX20/TCX10 + last_core*/ + st->nb_bits_header_tcx += 2; /* Siganl class*/ + } + else + { + st->nb_bits_header_ace = 1 + 2 + 1; /*TCX/ACELP+coder_type + last_core*/ + st->nb_bits_header_tcx = st->nb_bits_header_ace; + + if ( st->hTcxCfg != NULL ) + { + if ( st->hTcxCfg->lfacNext <= 0 ) + { + st->nb_bits_header_ace--; /*No last_core*/ + } + } + } + + /*Switch off TCX or ACELP?*/ + if ( st->sr_core == INT_FS_12k8 ) + { + st->acelpEnabled = ( st->restrictedMode & 1 ) == 1; + st->tcx20Enabled = ( st->restrictedMode & 2 ) == 2; + } + st->prevEnergyHF = st->currEnergyHF = 65535.0f; /* prevent block switch */ + + /* TCX-LTP */ + if ( st->hTcxEnc != NULL ) + { + st->hTcxEnc->tcxltp = getTcxLtp( st->sr_core ); + } + + /*Use for 12.8 kHz sampling rate and low bitrates, the conventional pulse search->better SNR*/ + st->acelp_autocorr = 1; + if ( st->total_brate <= ACELP_9k60 && st->sr_core == INT_FS_12k8 ) + { + st->acelp_autocorr = 0; + } + + /*Get audio bandwidth info*/ + if ( st->narrowBand ) + { + bwidth = NB; + } + else if ( st->sr_core <= INT_FS_16k ) + { + bwidth = WB; + } + else + { + bwidth = SWB; + } + + /*Scale TCX for non-active frames to adjust loudness with ACELP*/ + if ( st->hTcxCfg != NULL ) + { + st->hTcxCfg->na_scale = 1.f; + if ( bwidth < SWB && !( st->tcxonly ) ) + { + for ( i = 0; i < SIZE_SCALE_TABLE_TCX; i++ ) + { + if ( ( bwidth == scaleTcxTable[i].bwmode ) && + ( st->total_brate >= scaleTcxTable[i].bitrateFrom ) && + ( st->total_brate < scaleTcxTable[i].bitrateTo ) ) + { + if ( st->rf_mode ) + { + i--; + } + st->hTcxCfg->na_scale = scaleTcxTable[i].scale; + break; + } + } + } + } + + if ( st->element_mode > IVAS_SCE ) + { + st->enableTcxLpc = ( st->lpcQuantization == 1 ) && ( st->total_brate <= LOWRATE_TCXLPC_MAX_BR_CPE || st->rf_mode ); + } + else + { + st->enableTcxLpc = ( st->lpcQuantization == 1 ) && ( st->total_brate <= LOWRATE_TCXLPC_MAX_BR || st->rf_mode ); + } + + if ( st->ini_frame == 0 || st->last_codec_mode == MODE1 ) + { + st->envWeighted = 0; + } + + if ( st->bwidth == SWB && ( st->total_brate == ACELP_16k40 || st->total_brate == ACELP_24k40 ) && st->element_mode == EVS_MONO ) + { + if ( st->tec_tfa == 0 ) + { + set_zero( st->hTECEnc->loBuffer, MAX_TEC_SMOOTHING_DEG ); + } + st->tec_tfa = 1; + } + else + { + st->tec_tfa = 0; + } + + st->enablePlcWaveadjust = 0; + if ( st->total_brate >= HQ_48k ) + { + st->enablePlcWaveadjust = 1; + } + + st->glr = 0; + if ( ( st->total_brate == ACELP_9k60 || st->total_brate == ACELP_16k40 || st->total_brate == ACELP_24k40 ) && st->element_mode == EVS_MONO ) + { + st->glr = 1; + } + + if ( st->glr ) + { + st->nb_bits_header_ace += G_LPC_RECOVERY_BITS; + } + + if ( hTcxEnc != NULL ) + { + if ( st->bwidth == NB || st->bwidth == WB ) + { + index = min( N_TCX_STARTLINE_NOISE_WB - 1, (uint16_t) max( 0, ( st->rf_mode == 0 ) ? st->frame_size_index : st->frame_size_index - 1 ) ); + hTcxEnc->nmStartLine = startLineWB[index]; + } + else /* (st->bwidth == SWB || st->bwidth == FB) */ + { + index = min( N_TCX_STARTLINE_NOISE_SWB - 1, (uint16_t) max( 3, ( st->rf_mode == 0 ) ? st->frame_size_index : st->frame_size_index - 1 ) - 3 ); + if ( st->total_brate >= IVAS_96k && st->total_brate <= IVAS_192k && st->element_mode > IVAS_SCE ) + { + index--; + } + hTcxEnc->nmStartLine = startLineSWB[index]; + if ( st->total_brate == IVAS_48k && st->element_mode == IVAS_CPE_MDCT && hTcxEnc->nmStartLine * 5 < st->L_frame * 4 ) + { + hTcxEnc->nmStartLine = ( hTcxEnc->nmStartLine * 5 ) >> 2; /* low-rate stereo is more efficient than dual-mono due to stereo processing */ + } + } + } + + if ( hTcxEnc != NULL ) + { + if ( st->total_brate < ACELP_24k40 && ( ( st->total_brate > last_total_brate ) || ( st->last_codec_mode == MODE1 ) ) ) + { + /* low-freq memQuantZeros must be reset partially if bitrate increased */ + set_s( hTcxEnc->memQuantZeros, 0, hTcxEnc->nmStartLine ); + } + else + { + if ( st->total_brate >= ACELP_24k40 && st->total_brate <= ACELP_32k && last_total_brate >= ACELP_13k20 && last_total_brate < ACELP_24k40 ) + { + set_s( hTcxEnc->memQuantZeros, 0, st->L_frame ); + } + } + } + + return; +} diff --git a/lib_enc/core_enc_switch.c b/lib_enc/core_enc_switch.c new file mode 100644 index 0000000000000000000000000000000000000000..e6b672d858db2975c0af23df4d3318923ee48475 --- /dev/null +++ b/lib_enc/core_enc_switch.c @@ -0,0 +1,196 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * core_coder_mode_switch() + * + * + *-------------------------------------------------------------------*/ + +void core_coder_mode_switch( + Encoder_State *st, /* i/o: encoder state structure */ + const int32_t last_total_brate, /* i : last bitrate */ + const int16_t MCT_flag /* i : hMCT handle allocated (1) or not (0)*/ +) +{ + TCX_ENC_HANDLE hTcxEnc = st->hTcxEnc; + int16_t i, fscale, switchWB; + int32_t sr_core; + int16_t bSwitchFromAmrwbIO; + int16_t tcxonly_tmp; + + switchWB = 0; + bSwitchFromAmrwbIO = 0; + if ( st->last_core == AMR_WB_CORE ) + { + bSwitchFromAmrwbIO = 1; + } + + /* force active frame for the first frame when switching from high bitrates when DTX is enabled*/ + sr_core = getCoreSamplerateMode2( st->element_mode, st->total_brate, st->bwidth, st->flag_ACELP16k, st->rf_mode, st->is_ism_format ); + + fscale = sr2fscale( sr_core ); + + + if ( st->last_codec_mode == MODE1 ) + { + switchWB = 1; /*force init when coming from MODE1*/ + } + + tcxonly_tmp = getTcxonly( st->element_mode, st->total_brate, MCT_flag, st->is_ism_format ); + + if ( tcxonly_tmp != st->tcxonly ) + { + switchWB = 1; /*force init when coming from MODE1*/ + } + + if ( fscale == st->fscale && !bSwitchFromAmrwbIO && !switchWB ) + { + st->sr_core = sr_core; + st->L_frame = (int16_t) ( sr_core / FRAMES_PER_SEC ); + + st->tcxonly = getTcxonly( st->element_mode, st->total_brate, MCT_flag, st->is_ism_format ); + + st->bits_frame_nominal = (int16_t) ( (float) st->L_frame / (float) st->fscale * (float) FSCALE_DENOM / 128.0f * (float) st->total_brate / 100.0f + 0.49f ); + + st->igf = getIgfPresent( st->element_mode, st->total_brate, st->bwidth, st->rf_mode ); + + /* switch IGF configuration */ + if ( st->igf ) + { + IGFEncSetMode( st->hIGFEnc, st->total_brate, st->bwidth, st->element_mode, st->rf_mode ); + } + + st->hTcxCfg->tcx_coded_lines = getNumTcxCodedLines( st->bwidth ); + st->hTcxCfg->bandwidth = getTcxBandwidth( st->bwidth ); + st->hTcxCfg->tcxRateLoopOpt = ( st->tcxonly ) ? 2 : 0; + st->hTcxCfg->tcxRateLoopOpt = ( st->element_mode == IVAS_CPE_MDCT ) ? 3 : st->hTcxCfg->tcxRateLoopOpt; + st->hTcxCfg->ctx_hm = getCtxHm( st->element_mode, st->total_brate, st->rf_mode ); + st->hTcxCfg->resq = getResq( st->total_brate ); + hTcxEnc->tcx_lpc_shaped_ari = getTcxLpcShapedAri( st->total_brate, st->rf_mode, st->element_mode ); + + st->hTcxCfg->tcxRateLoopOpt = ( st->hTcxCfg->resq && !st->tcxonly ) ? 1 : st->hTcxCfg->tcxRateLoopOpt; + st->hTcxCfg->fIsTNSAllowed = getTnsAllowed( st->total_brate, st->igf, st->element_mode ); + + if ( st->hTcxCfg->fIsTNSAllowed ) + { + InitTnsConfigs( st->bwidth, st->hTcxCfg->tcx_coded_lines, st->hTcxCfg->tnsConfig, st->hIGFEnc->infoStopFrequency, st->total_brate, st->element_mode, MCT_flag ); + + SetAllowTnsOnWhite( st->hTcxCfg->tnsConfig, st->element_mode == IVAS_CPE_MDCT ); + } + + if ( st->bwidth == NB ) + { + st->narrowBand = 1; + st->min_band = 1; + st->max_band = 16; + } + else + { + st->narrowBand = 0; + st->min_band = 0; + st->max_band = 19; + } + + for ( i = 0; i < FRAME_SIZE_NB; i++ ) + { + if ( FrameSizeConfig[i].frame_bits == st->bits_frame_nominal ) + { + st->frame_size_index = i; + st->bits_frame = FrameSizeConfig[i].frame_bits; + st->bits_frame_core = FrameSizeConfig[i].frame_net_bits; + break; + } + } + + st->restrictedMode = getRestrictedMode( st->element_mode, st->total_brate, 0 ); + + core_coder_reconfig( st, last_total_brate ); + } + else + { + st->igf = getIgfPresent( st->element_mode, st->total_brate, st->bwidth, st->rf_mode ); + init_coder_ace_plus( st, last_total_brate, MCT_flag ); + } + + if ( st->igf && st->hBWE_TD != NULL ) + { + /* reset TBE */ + if ( ( st->bwidth == WB && st->last_extl != WB_TBE ) || + ( st->bwidth == SWB && st->last_extl != SWB_TBE ) || + ( st->bwidth == FB && st->last_extl != FB_TBE ) ) + { + TBEreset_enc( st->hBWE_TD, st->last_core, st->bwidth ); + } + else + { + set_f( st->hBWE_TD->state_lpc_syn, 0.0f, LPC_SHB_ORDER ); + set_f( st->hBWE_TD->state_syn_shbexc, 0.0f, L_SHB_LAHEAD ); + set_f( st->hBWE_TD->mem_stp_swb, 0.0f, LPC_SHB_ORDER ); + set_f( st->hBWE_TD->mem_zero_swb, 0, LPC_SHB_ORDER ); + st->hBWE_TD->gain_prec_swb = 1.0f; + } + } + + if ( st->envWeighted && !st->enableTcxLpc ) + { + /* Unweight the envelope */ + E_LPC_lsp_unweight( st->lsp_old, st->lsp_old, st->lsf_old, 1.0f / st->gamma ); + st->envWeighted = 0; + } + + if ( st->total_brate >= HQ_48k ) + { + st->enablePlcWaveadjust = 1; + } + else + { + st->enablePlcWaveadjust = 0; + } + + if ( ( last_total_brate > HQ_32k || st->last_codec_mode == MODE1 ) && st->element_mode == EVS_MONO ) + { + st->glr_reset = 1; + } + + return; +} diff --git a/lib_enc/core_enc_updt.c b/lib_enc/core_enc_updt.c new file mode 100644 index 0000000000000000000000000000000000000000..1e17f7822dba420cc63e6d14e4bd14dc251cbedb --- /dev/null +++ b/lib_enc/core_enc_updt.c @@ -0,0 +1,202 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "prot.h" +#include "rom_com.h" +#include "cnst.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * core_encode_update() + * + * Common updates of buffers + *-------------------------------------------------------------------*/ + +void core_encode_update( + Encoder_State *st /* i/o: Encoder state structure */ +) +{ + TCX_ENC_HANDLE hTcxEnc = st->hTcxEnc; + int16_t n; + + /* Update Input Signal Buffers */ + n = st->encoderPastSamples_enc + st->encoderLookahead_enc; + + mvr2r( st->buf_speech_enc_pe + st->L_frame, st->buf_speech_enc_pe, n ); + mvr2r( st->buf_speech_enc + st->L_frame, st->buf_speech_enc, n ); + + if ( !st->tcxonly ) + { + n = st->L_frame + st->L_frame / 4; + mvr2r( st->buf_wspeech_enc + st->L_frame, st->buf_wspeech_enc, n ); + } + + if ( hTcxEnc != NULL ) + { + if ( st->core == ACELP_CORE || st->core == AMR_WB_CORE || st->core_brate == SID_2k40 || st->core_brate == FRAME_NO_DATA ) + { + mvr2r( st->buf_speech_enc + st->L_frame, hTcxEnc->buf_speech_ltp + st->L_frame, st->L_frame ); + } + } + + n = st->encoderPastSamples_enc + st->encoderLookahead_enc; + mvr2r( st->buf_synth + st->L_frame, st->buf_synth, st->L_frame + L_SUBFR ); + if ( hTcxEnc != NULL ) + { + mvr2r( hTcxEnc->buf_speech_ltp + st->L_frame, hTcxEnc->buf_speech_ltp, n ); + + if ( st->element_mode != IVAS_CPE_MDCT ) + { + st->hTcxEnc->kernel_switch_corr_past = 0.f; + st->hTcxEnc->kernel_type[0] = MDCT_IV; + st->hTcxEnc->kernel_symmetry_past = 0; + st->hTcxEnc->enc_ste_pre_corr_past = 0; + } + } + + if ( ( st->Opt_DTX_ON && st->core_brate <= SID_2k40 && st->cng_type == FD_CNG ) || ( st->tcxonly && st->codec_mode == MODE2 ) ) + { + /* reset LP memories */ + set_zero( st->mem_MA, M ); + mvr2r( GEWB_Ave, st->mem_AR, M ); + } + + return; +} + + +/*-------------------------------------------------------------------* + * core_encode_update_cng() + * + * Common updates in case of CNG + *-------------------------------------------------------------------*/ + +void core_encode_update_cng( + Encoder_State *st, + float *timeDomainBuffer, + float *A, + const float Aw[] /* i : weighted A(z) unquant. for subframes*/ +) +{ + float lsp[M], lsf[M]; + float *synth, synth_buf[M + 1 + L_FRAME_PLUS + L_FRAME_PLUS / 2], wsyn[L_FRAME_PLUS]; + float tmp; + float enr; + int16_t enr_index; + int16_t L_frame = st->L_frame; + + LPD_state_HANDLE hLPDmem = st->hLPDmem; + + /* LPC -> LSP/lsp */ + a2lsp_stab( A, lsp, st->lsp_old ); + + /* LSP/lsp -> LSF/lsf */ + if ( L_frame == L_FRAME16k ) + { + lsp2lsf( lsp, lsf, M, INT_FS_16k ); + } + else + { + lsp2lsf( lsp, lsf, M, INT_FS_12k8 ); + } + + /* Update synth memory */ + synth = synth_buf + ( 1 + M ); + mvr2r( hLPDmem->syn, synth_buf, 1 + M ); + mvr2r( timeDomainBuffer, synth, L_frame ); + mvr2r( synth + L_frame - ( 1 + M ), hLPDmem->syn, 1 + M ); + mvr2r( synth, st->synth, L_frame ); + + /* Update ZIR */ + set_zero( synth + L_frame, L_frame / 2 ); + syn_filt( A, M, synth + L_frame, synth + L_frame, L_frame / 2, &synth[L_frame - M], 0 ); + if ( st->hTcxEnc != NULL ) + { + mvr2r( synth + L_frame - ( L_frame / 2 ), st->hTcxEnc->Txnq, L_frame / 2 ); + } + + /* Update pe-synth memory */ + tmp = synth[-( 1 + M )]; + preemph( synth - M, st->preemph_fac, M + L_frame, &tmp ); + mvr2r( synth + L_frame - M, hLPDmem->mem_syn, M ); + mvr2r( synth + L_frame - M, hLPDmem->mem_syn2, M ); + + /* Update excitation memory */ + mvr2r( hLPDmem->old_exc + L_frame, hLPDmem->old_exc, max( L_EXC_MEM - L_frame, 0 ) ); + residu( A, M, synth, hLPDmem->old_exc + max( L_EXC_MEM - L_frame, 0 ), L_frame ); + + if ( st->core_brate == SID_2k40 ) + { + enr = cng_energy( st->element_mode, st->bwidth, st->hDtxEnc->CNG_mode, st->hTdCngEnc->CNG_att, hLPDmem->old_exc + max( L_EXC_MEM - L_frame, 0 ), L_frame ); + + enr_index = (int16_t) ( ( enr + 2.0f ) * STEP_SID ); + enr_index = min( max( enr_index, 0 ), 127 ); + st->hTdCngEnc->old_enr_index = enr_index; + } + + /* Update weighted synthesis memory */ + calc_residu( synth, wsyn, Aw, L_frame ); + tmp = st->wspeech_enc[-1] - hLPDmem->mem_w0; + deemph( wsyn, st->preemph_fac, L_frame, &tmp ); + hLPDmem->mem_w0 = st->wspeech_enc[L_frame - 1] - wsyn[L_frame - 1]; + + /* Update LPC-related memories */ + mvr2r( lsp, st->lsp_old, M ); + mvr2r( lsf, st->lsf_old, M ); + st->envWeighted = 0; + mvr2r( A, st->old_Aq_12_8, M + 1 ); + st->old_Es_pred = 0; + + /* Reset acelp memories */ + set_zero( hLPDmem->dispMem, 8 ); + hLPDmem->tilt_code = TILT_CODE; + hLPDmem->gc_threshold = 0.0f; + + /* Update ace/tcx mode */ + st->core = ACELP_CORE; + + /* Reset TCX overlap */ + st->hTcxCfg->tcx_curr_overlap_mode = st->hTcxCfg->tcx_last_overlap_mode = ALDO_WINDOW; + + if ( st->hDtxEnc->first_CNG == 0 ) + { + mvr2r( st->lsp_old, st->hDtxEnc->lspCNG, M ); + } + + return; +} diff --git a/lib_enc/core_switching_enc.c b/lib_enc/core_switching_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..9b988a123c6df96f335e5950f0127b651b65d2ad --- /dev/null +++ b/lib_enc/core_switching_enc.c @@ -0,0 +1,554 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "rom_enc.h" +#include "rom_com.h" +#include "prot.h" +#include "wmc_auto.h" + +/*---------------------------------------------------------------------* + * core_switching_pre_enc() + * + * Preprocessing (preparing) for ACELP/HQ core switching + *---------------------------------------------------------------------*/ + +void core_switching_pre_enc( + Encoder_State *st, /* i/o: encoder state structure */ + const float *old_inp_12k8, /* i : old input signal @12.8kHz */ + const float *old_inp_16k, /* i : old input signal @16kHz */ + const int16_t active_cnt, /* i : active frame counter */ + const int16_t last_element_mode /* i : last_element_mode */ +) +{ + int16_t Sample_Delay_HP, Sample_Delay_LP; + + HQ_ENC_HANDLE hHQ_core = st->hHQ_core; + LPD_state_HANDLE hLPDmem = st->hLPDmem; + + /* Codec mode switching */ + if ( st->last_codec_mode == MODE2 || ( ( st->last_core == TCX_20_CORE || st->last_core == TCX_10_CORE ) && st->element_mode > EVS_MONO ) ) + { + if ( hLPDmem != NULL ) + { + mvr2r( hLPDmem->mem_syn2, hLPDmem->mem_syn1, M ); + } + + if ( st->element_mode != IVAS_CPE_MDCT ) + { + st->igf = 0; + } + + if ( st->hBWE_TD != NULL ) + { + if ( st->last_core != ACELP_CORE ) + { + set_f( st->hBWE_TD->old_bwe_exc, 0, PIT16k_MAX * 2 ); + st->hBWE_TD->bwe_non_lin_prev_scale = 0.0f; + } + + set_f( st->hBWE_FD->old_syn_12k8_16k, 0, NS2SA( 16000, DELAY_FD_BWE_ENC_NS ) ); + } + + if ( st->last_core == TCX_20_CORE || st->last_core == TCX_10_CORE ) + { + if ( st->element_mode == EVS_MONO ) + { + st->last_core = HQ_CORE; + } + + if ( hHQ_core != NULL ) + { + set_f( hHQ_core->last_ni_gain, 0, BANDS_MAX ); + set_f( hHQ_core->last_env, 0, BANDS_MAX ); + hHQ_core->last_max_pos_pulse = 0; + + hHQ_core->mode_count = 0; + hHQ_core->mode_count1 = 0; + + set_s( hHQ_core->prev_SWB_peak_pos, 0, SPT_SHORTEN_SBNUM ); + hHQ_core->prev_frm_hfe2 = 0; + hHQ_core->prev_stab_hfe2 = 0; + } + + /*ALDO overlap windowed past: also used in MODE2 but for other MDCT-LB*/ + if ( st->element_mode == EVS_MONO && st->hTcxEnc != NULL ) + { + set_f( st->hTcxEnc->old_out, 0, L_FRAME32k ); + } + } + if ( st->L_frame == L_FRAME16k && st->last_L_frame == L_FRAME ) + { + mvr2r( st->lsp_old, st->lsp_old16k, M ); + st->rate_switching_reset_16kHz = lsp_convert_poly( st->lsp_old16k, L_FRAME16k, 0 ); + } + + st->use_acelp_preq = 0; + } + + if ( st->last_core == -1 && ( st->core == HQ_CORE || st->core == TCX_20_CORE || st->core == TCX_10_CORE ) ) + { + /* very first frame is HQ_CORE */ + st->last_core = HQ_CORE; + } + + if ( st->core == HQ_CORE && ( st->last_core == ACELP_CORE || st->last_core == AMR_WB_CORE ) ) /* HQ init */ + { + + set_f( hHQ_core->last_ni_gain, 0, BANDS_MAX ); + set_f( hHQ_core->last_env, 0, BANDS_MAX ); + hHQ_core->last_max_pos_pulse = 0; + + hHQ_core->mode_count = 0; + hHQ_core->mode_count1 = 0; + + set_s( hHQ_core->prev_SWB_peak_pos, 0, SPT_SHORTEN_SBNUM ); + hHQ_core->prev_frm_hfe2 = 0; + hHQ_core->prev_stab_hfe2 = 0; + + if ( st->hTcxEnc != NULL ) + { + set_f( st->hTcxEnc->old_out, 0, L_FRAME32k ); + } + } + + /* Here we only handle cases where last_ppp and last_nelp not updated when coming from CodecB or other cores + within ACELP_CORE if switching from another bitarate to vbr, last_ppp and last_nelp is always updated in the previous frame */ + if ( st->core == ACELP_CORE && ( st->last_core != ACELP_CORE || st->last_codec_mode == MODE2 ) ) + { + /* reset in case of bitrate switching in EVS */ + if ( st->hSC_VBR != NULL ) + { + st->hSC_VBR->last_last_ppp_mode = 0; + st->hSC_VBR->last_ppp_mode = 0; + st->hSC_VBR->last_nelp_mode = 0; + } + } + + /* Handle state reset of stat_noise_uv_mod memory */ + if ( st->core == ACELP_CORE && ( st->last_core != ACELP_CORE || st->last_codec_mode == MODE2 || st->last_total_brate <= PPP_NELP_2k80 ) ) + { + st->act_count = 3; + st->uv_count = 0; + } + + if ( ( ( st->core == ACELP_CORE || st->core == AMR_WB_CORE ) && st->last_core == HQ_CORE ) || ( ( st->element_mode == IVAS_CPE_DFT || st->element_mode == IVAS_CPE_TD || ( st->element_mode == IVAS_CPE_MDCT && last_element_mode == IVAS_CPE_DFT ) ) && active_cnt == 1 ) ) + { + /* Reset the ACELP core in case of HQ->ACELP core switching */ + + if ( st->L_frame == L_FRAME16k ) + { + mvr2r( TRWB2_Ave, st->lsf_old, M ); /* init of LSP */ + lsf2lsp( st->lsf_old, st->lsp_old, M, INT_FS_16k ); + } + else + { + mvr2r( TRWB_Ave, st->lsf_old, M ); /* init of LSP */ + lsf2lsp( st->lsf_old, st->lsp_old, M, INT_FS_12k8 ); + } + + /* Reset ACELP parameters */ + if ( hLPDmem != NULL ) + { + hLPDmem->syn[M] = 0; + set_f( hLPDmem->mem_syn2, 0.0f, M ); + set_f( hLPDmem->mem_syn, 0.0f, M ); + set_f( hLPDmem->mem_syn1, 0.0f, M ); + hLPDmem->mem_w0 = 0.0f; + hLPDmem->tilt_code = 0.0f; + hLPDmem->gc_threshold = 0.0f; + set_f( hLPDmem->dispMem, 0, 8 ); + } + st->Nb_ACELP_frames = 0; + + set_zero( st->mem_MA, M ); + mvr2r( GEWB_Ave, st->mem_AR, M ); + init_gp_clip( st->clip_var ); + + st->last_coder_type = GENERIC; + + mvr2r( st->old_pitch_buf + st->L_frame / L_SUBFR, st->old_pitch_buf, st->L_frame / L_SUBFR ); + set_f( st->old_pitch_buf + st->L_frame / L_SUBFR, L_SUBFR, st->L_frame / L_SUBFR ); + + /* Reset old ACELP buffers */ + if ( st->element_mode == EVS_MONO && hLPDmem != NULL ) + { + set_f( hLPDmem->old_exc, 0, L_EXC_MEM ); + } + + if ( st->hBWE_TD != NULL ) + { + set_f( st->hBWE_TD->old_bwe_exc, 0, PIT16k_MAX * 2 ); + + /* reset BWE memories */ + st->hBWE_TD->bwe_non_lin_prev_scale = 0.0; + } + + if ( st->hBWE_FD != NULL ) + { + set_f( st->hBWE_FD->old_syn_12k8_16k, 0, NS2SA( 16000, DELAY_FD_BWE_ENC_NS ) ); + } + } + + if ( ( st->core == ACELP_CORE || st->core == AMR_WB_CORE ) && ( st->last_core == TCX_20_CORE || st->last_core == TCX_10_CORE ) ) + { + /* Reset the ACELP core in case of TCX->ACELP core switching */ + st->Nb_ACELP_frames = 0; + + if ( hLPDmem != NULL ) + { + hLPDmem->mem_w0 = 0.0f; + hLPDmem->tilt_code = 0.0f; + init_gp_clip( st->clip_var ); + hLPDmem->gc_threshold = 0.0f; + set_f( hLPDmem->dispMem, 0, 8 ); + } + + st->last_coder_type = GENERIC; + + mvr2r( st->old_pitch_buf + st->L_frame / L_SUBFR, st->old_pitch_buf, st->L_frame / L_SUBFR ); + set_f( st->old_pitch_buf + st->L_frame / L_SUBFR, L_SUBFR, st->L_frame / L_SUBFR ); + + /* Reset old TD BWE buffers */ + if ( st->hBWE_TD != NULL ) + { + set_f( st->hBWE_TD->old_bwe_exc, 0, PIT16k_MAX * 2 ); + st->hBWE_TD->bwe_non_lin_prev_scale = 0.0; + } + + /* reset BWE memories */ + if ( st->hBWE_TD != NULL ) + { + set_f( st->hBWE_FD->old_syn_12k8_16k, 0, NS2SA( 16000, DELAY_FD_BWE_ENC_NS ) ); + } + } + + if ( st->input_Fs >= 16000 && st->last_extl != WB_BWE && st->extl == WB_BWE && st->hBWE_FD != NULL ) + { + if ( st->last_extl != SWB_BWE && st->last_extl != FB_BWE ) + { + st->hBWE_FD->prev_mode = NORMAL; + st->hBWE_FD->modeCount = 0; + } + + st->hBWE_FD->prev_L_swb_norm1 = 8; + } + + if ( ( st->input_Fs >= 32000 && st->last_extl != SWB_BWE && st->extl == SWB_BWE ) || + ( st->input_Fs >= 48000 && st->last_extl != FB_BWE && st->extl == FB_BWE ) ) + { + /* we are switching to SWB BWE - reset SWB BWE buffers */ + if ( st->L_frame == L_FRAME ) + { + Sample_Delay_HP = NS2SA( 16000, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_12k8_NS + DELAY_FIR_RESAMPL_NS - DELAY_CLDFB_NS ); + Sample_Delay_LP = NS2SA( 12800, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_12k8_NS ); + + if ( st->element_mode > EVS_MONO ) + { + if ( st->element_mode == IVAS_CPE_TD ) + { + Sample_Delay_HP = NS2SA( 16000, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_12k8_NS + DELAY_FIR_RESAMPL_NS - DELAY_CLDFB_NS - L_MEM_RECALC_TBE_NS ); + } + Sample_Delay_HP -= NS2SA( 16000, DELAY_FIR_RESAMPL_NS ); + } + + mvr2r( old_inp_12k8 + L_INP_MEM + L_FRAME - Sample_Delay_LP, st->hBWE_FD->old_input_lp, Sample_Delay_LP ); + } + else + { + Sample_Delay_HP = NS2SA( 16000, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_16k_NS + DELAY_FIR_RESAMPL_NS - DELAY_CLDFB_NS ); + Sample_Delay_LP = NS2SA( 16000, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_16k_NS ); + + if ( st->element_mode > EVS_MONO ) + { + if ( st->element_mode == IVAS_CPE_TD ) + { + Sample_Delay_HP = NS2SA( 16000, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_16k_NS + DELAY_FIR_RESAMPL_NS - DELAY_CLDFB_NS - L_MEM_RECALC_TBE_NS ); + } + Sample_Delay_HP -= NS2SA( 16000, DELAY_FIR_RESAMPL_NS ); + } + + mvr2r( old_inp_16k + L_INP_MEM + L_FRAME - Sample_Delay_LP, st->hBWE_FD->old_input_lp, Sample_Delay_LP ); + } + + mvr2r( st->hBWE_TD->old_speech_shb + L_LOOK_16k + L_SUBFR16k - Sample_Delay_HP, st->hBWE_FD->new_input_hp, Sample_Delay_HP ); + + if ( st->last_extl != WB_BWE ) + { + st->hBWE_FD->prev_mode = NORMAL; + st->hBWE_FD->modeCount = 0; + } + st->hBWE_FD->EnergyLF = 0.0f; + st->hBWE_FD->prev_L_swb_norm1 = 8; + } + + /*---------------------------------------------------------------------* + * band-width switching from WB -> SWB/FB + *---------------------------------------------------------------------*/ + + if ( st->element_mode > EVS_MONO ) + { + if ( st->bwidth_sw_cnt == 0 ) + { + if ( st->bwidth >= SWB && st->last_bwidth == WB ) + { + st->bwidth_sw_cnt++; + } + } + else + { + st->bwidth_sw_cnt++; + + if ( st->bwidth_sw_cnt == BWS_TRAN_PERIOD ) + { + st->bwidth_sw_cnt = 0; + } + } + } + + return; +} + + +/*---------------------------------------------------------------------* + * core_switching_post_enc() + * + * Postprocessing for ACELP/HQ core switching + *---------------------------------------------------------------------*/ + +void core_switching_post_enc( + Encoder_State *st, /* i/o: encoder state structure */ + const float *old_inp_12k8, /* i : old input signal @12.8kHz */ + const float *old_inp_16k, /* i : old input signal @16kHz */ + const float A[] /* i : unquant. LP filter coefs. */ +) +{ + if ( st->core == HQ_CORE ) + { + st->use_acelp_preq = 0; + + if ( ( st->last_core == ACELP_CORE || st->last_core == AMR_WB_CORE ) && st->element_mode == EVS_MONO ) /* core switching ==> ACELP subframe encoding */ + { + acelp_core_switch_enc( st, old_inp_12k8 + L_INP_MEM - NS2SA( INT_FS_12k8, ACELP_LOOK_NS ), old_inp_16k + L_INP_MEM - NS2SA( INT_FS_16k, ACELP_LOOK_NS ), A ); + } + + st->hBWE_TD->bwe_non_lin_prev_scale = 0.0; + st->hBWE_FD->mem_deemph_old_syn = 0.0f; + } + else + { + if ( st->hBWE_TD == NULL ) + { + return; + } + + /* reset SWB TBE buffers */ + if ( st->extl == WB_TBE && st->last_extl != WB_TBE ) + { + wb_tbe_extras_reset( st->hBWE_TD->mem_genSHBexc_filt_down_wb2, st->hBWE_TD->mem_genSHBexc_filt_down_wb3 ); + + if ( st->last_extl != WB_BWE ) + { + set_f( st->hBWE_TD->decim_state1, 0.0f, ( 2 * ALLPASSSECTIONS_STEEP + 1 ) ); + set_f( st->hBWE_TD->decim_state2, 0.0f, ( 2 * ALLPASSSECTIONS_STEEP + 1 ) ); + } + + set_f( st->hBWE_TD->state_syn_shbexc, 0, L_SHB_LAHEAD / 4 ); + set_f( st->hBWE_TD->syn_overlap, 0, L_SHB_LAHEAD ); + set_f( st->hBWE_TD->mem_csfilt, 0, 2 ); + } + + if ( ( st->extl == SWB_TBE || st->extl == FB_TBE ) && + ( st->last_core == HQ_CORE || st->L_frame != st->last_L_frame || ( st->last_extl != SWB_TBE && st->last_extl != FB_TBE && st->last_core != TCX_20_CORE && st->last_core != TCX_10_CORE ) ) ) + { + set_f( st->hBWE_TD->state_ana_filt_shb, 0.0f, ( 2 * ALLPASSSECTIONS_STEEP + 1 ) ); + InitSWBencBufferStates( st->hBWE_TD, NULL ); + swb_tbe_reset( st->hBWE_TD->mem_csfilt, st->hBWE_TD->mem_genSHBexc_filt_down_shb, st->hBWE_TD->state_lpc_syn, st->hBWE_TD->syn_overlap, st->hBWE_TD->state_syn_shbexc, &( st->hBWE_TD->tbe_demph ), &( st->hBWE_TD->tbe_premph ), st->hBWE_TD->mem_stp_swb, &( st->hBWE_TD->gain_prec_swb ) ); + set_f( st->hBWE_TD->dec_2_over_3_mem, 0.0f, L_FILT_2OVER3 ); + set_f( st->hBWE_TD->dec_2_over_3_mem_lp, 0.0f, L_FILT_2OVER3_LP ); + } + else if ( ( st->extl == SWB_TBE || st->extl == FB_TBE ) && ( ( st->element_mode == IVAS_CPE_TD && st->last_extl != SWB_TBE && st->last_extl != FB_TBE ) || ( st->element_mode != IVAS_CPE_TD && st->last_total_brate != st->total_brate ) || ( st->last_bwidth != st->bwidth ) || ( st->last_codec_mode != MODE1 ) || ( st->rf_mode_last != st->rf_mode ) ) ) + { + set_f( st->hBWE_TD->state_lpc_syn, 0.0f, LPC_SHB_ORDER ); + set_f( st->hBWE_TD->state_syn_shbexc, 0.0f, L_SHB_LAHEAD ); + set_f( st->hBWE_TD->mem_stp_swb, 0.0f, LPC_SHB_ORDER ); + set_f( st->hBWE_TD->mem_zero_swb, 0, LPC_SHB_ORDER ); + st->hBWE_TD->gain_prec_swb = 1.0f; + } + else if ( st->last_core == TCX_20_CORE || st->last_core == TCX_10_CORE ) + { + TBEreset_enc( st->hBWE_TD, st->last_core, st->bwidth ); + } + + /* Interp_3_2 CNG buffers reset */ + if ( st->extl == FB_TBE && ( ( st->last_extl != FB_TBE && st->last_core != TCX_20_CORE && st->last_core != TCX_10_CORE ) || st->L_frame != st->last_L_frame ) ) + { + set_f( st->hBWE_TD->fb_state_lpc_syn, 0, LPC_SHB_ORDER ); + st->hBWE_TD->fb_tbe_demph = 0; + fb_tbe_reset_enc( st->hBWE_TD->elliptic_bpf_2_48k_mem, &st->hBWE_TD->prev_fb_energy ); + } + /* Fade towards init value for non HQ_CORE */ + if ( st->hHQ_core != NULL ) + { + st->hHQ_core->crest_lp = HQ_CREST_FAC_SM * ( st->hHQ_core->crest_lp ) + ( 1.0f - HQ_CREST_FAC_SM ) * HQ_CREST_THRESHOLD; + st->hHQ_core->crest_mod_lp = HQ_CREST_FAC_SM * ( st->hHQ_core->crest_mod_lp ) + ( 1.0f - HQ_CREST_FAC_SM ) * HQ_CREST_MOD_THRESHOLD; + } + } + + return; +} + + +/*---------------------------------------------------------------------* + * core_switching_hq_prepare_enc() + * + * Preprocessing in the first HQ frame after ACELP frame + * - modify bit allocation for HQ core removing CELP subframe budget + * - update st->old_wtda to modify windows at the encoder + *---------------------------------------------------------------------*/ + +void core_switching_hq_prepare_enc( + Encoder_State *st, /* i/o: encoder state structure */ + int16_t *num_bits, /* i/o: bit budget update */ + const int16_t input_frame, /* i : frame length */ + float *wtda_audio, + const float *audio ) +{ + int16_t delta, Loverlapp, i; + int16_t n; + int32_t cbrate; + + /* set multiplication factor according to the sampling rate */ + delta = 1; + if ( input_frame == L_FRAME16k ) + { + delta = 2; + } + else if ( input_frame == L_FRAME32k ) + { + delta = 4; + } + else if ( input_frame == L_FRAME48k ) + { + delta = 6; + } + + /* set switching frame bitrate */ + if ( st->last_L_frame == L_FRAME ) + { + if ( st->core_brate > ACELP_24k40 ) + { + cbrate = ACELP_24k40; + } + else + { + cbrate = st->core_brate; + } + + /* subtract ACELP switching frame bits */ + if ( st->core_brate >= ACELP_11k60 ) + { + /* subtract one bit for LP filtering flag */ + ( *num_bits )--; + } + + *num_bits -= ACB_bits_tbl[BIT_ALLOC_IDX( cbrate, GENERIC, 0, 0 )]; /* pitch bits */ + *num_bits -= gain_bits_tbl[BIT_ALLOC_IDX( cbrate, TRANSITION, 0, 0 )]; /* gain bits */ + *num_bits -= FCB_bits_tbl[BIT_ALLOC_IDX( cbrate, GENERIC, 0, 0 )]; /* FCB bits */ + } + else /* L_frame == L_FRAME16k */ + { + if ( st->core_brate <= ACELP_8k00 ) + { + cbrate = ACELP_8k00; + } + else if ( st->core_brate <= ACELP_14k80 ) + { + cbrate = ACELP_14k80; + } + else + { + cbrate = min( st->core_brate, ACELP_22k60 ); + } + + /* subtract ACELP switching frame bits */ + if ( st->core_brate >= ACELP_11k60 ) + { + /* subtract one bit for LP filtering flag */ + ( *num_bits )--; + } + + *num_bits -= ACB_bits_16kHz_tbl[BIT_ALLOC_IDX_16KHZ( cbrate, GENERIC, 0, 0 )]; /* pitch bits */ + *num_bits -= gain_bits_16kHz_tbl[BIT_ALLOC_IDX_16KHZ( cbrate, GENERIC, 0, 0 )]; /* gain bits */ + *num_bits -= FCB_bits_16kHz_tbl[BIT_ALLOC_IDX_16KHZ( cbrate, GENERIC, 0, 0 )]; /* FCB bits */ + } + + /* subtract BWE bits */ + if ( !( ( inner_frame_tbl[st->bwidth] == L_FRAME16k && st->last_L_frame == L_FRAME16k ) || inner_frame_tbl[st->bwidth] == L_FRAME8k ) ) + { + *num_bits -= ( NOOFGAINBITS1 + AUDIODELAYBITS ); + } + + n = (int16_t) ( (float) input_frame * N_ZERO_MDCT_NS / FRAME_SIZE_NS ); + + /* Transition window at the encoder */ + Loverlapp = delta * SWITCH_OVERLAP_8k; + for ( i = 0; i < n; i++ ) + { + wtda_audio[i + input_frame / 2] = -audio[n - i - 1]; + } + + for ( i = n; i < input_frame / 2 - Loverlapp; i++ ) + { + wtda_audio[i + input_frame / 2] = -audio[n - i - 1]; + } + + for ( i = input_frame / 2 - Loverlapp; i < input_frame / 2; i++ ) + { + wtda_audio[i + input_frame / 2] = -audio[n - i - 1] * (float) cos( ( i + 1 - input_frame / 2 + Loverlapp ) * EVS_PI / ( 2 * ( Loverlapp + 1 ) ) ); /* win=cos() */ + } + + /* reset state of old_out if switching */ + if ( st->hTcxEnc != NULL ) + { + set_f( st->hTcxEnc->old_out, 0.0f, L_FRAME32k ); + } + + return; +} diff --git a/lib_enc/corr_xh.c b/lib_enc/corr_xh.c new file mode 100644 index 0000000000000000000000000000000000000000..def6a44f00592fd31039327b00cac54f2035e112 --- /dev/null +++ b/lib_enc/corr_xh.c @@ -0,0 +1,74 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "prot.h" +#include "cnst.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * corr_xh() + * + * Compute the correlation between the target signal and the impulse + * response of the weighted synthesis filter. + * + * y[i] = sum(j=i,l-1) x[j]*h[j-i], i=0,l-1 + *-------------------------------------------------------------------*/ + +void corr_xh( + const float *x, /* i : target signal */ + float *y, /* o : correlation between x[] and h[] */ + const float *h, /* i : impulse response (of weighted synthesis filter) */ + const int16_t L_subfr /* i : length of the subframe */ +) +{ + int16_t i, j; + float s; + + for ( i = 0; i < L_subfr; i++ ) + { + s = 0.0f; + for ( j = i; j < L_subfr; j++ ) + { + s += x[j] * h[j - i]; + } + + y[i] = s; + } + + return; +} diff --git a/lib_enc/decision_matrix_enc.c b/lib_enc/decision_matrix_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..8dd792144d17998b4de24f643f56639038467c6c --- /dev/null +++ b/lib_enc/decision_matrix_enc.c @@ -0,0 +1,715 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include "options.h" +#include "prot.h" +#include "stat_enc.h" +#include "stat_dec.h" +#include "rom_com.h" +#include "wmc_auto.h" + + +/*-----------------------------------------------------------------* + * decision_matrix_enc() + * + * Select operating point (combination of technologies) based on input signal properties and command-line parameters: + * + * 7.20 8.00 9.60 13.20 16.40 24.40 32 48 64 96 128 + * Mode 1 1 2 1 2 2 1 2 1 2 2 + * ---------------------------------------------------------------------------------------------------------------------------------------------------------------- + * NB + * speech ACELP@12k8 ACELP@12k8 ACELP@12k8 ACELP@12k8 + * audio LR MDCT LR MDCT TCX LR MDCT + * inactive GSC@12k8 GSC@12k8 TCX GSC@12k8 + * ---------------------------------------------------------------------------------------------------------------------------------------------------------------- + * WB + * speech ACELP@12k8 ACELP@12k8 ACELP@12k8 ACELP@12k8 ACELP@16k ACELP@16k ACELP@16k TCX ACELP@16k TCX TCX + * +0b WB BWE +0b WB BWE +TD WB BWE +TD WB BWE + * audio GSC@12k8 GSC@12k8 TCX LR MDCT TCX TCX HQ TCX HQ TCX TCX + * +0b WB BWE +0b WB BWE +IGF + * inactive GSC@12k8 GSC@12k8 TCX GSC@12k8 TCX TCX AVQ@16k TCX AVQ@16k TCX TCX + * +0b WB BWE +0b WB BWE +IGF +FD WB BWE + * ---------------------------------------------------------------------------------------------------------------------------------------------------------------- + * SWB + * speech ACELP@12k8 ACELP@16k ACELP@16k ACELP@16k TCX ACELP@16k TCX TCX + * +TD SWB BWE +TD SWB BWE +TD SWB BWE +TD SWB BWE +IGF +HR SWB BWE + * audio LR MDCT/GSC TCX TCX HQ TCX HQ TCX TCX + * +FD SWB BWE +IGF +IGF +FD SWB BWE +IGF + * inactive GSC@12k8 TCX TCX AVQ@16k TCX AVQ@16k TCX TCX + * +FD SWB BWE +IGF +IGF +FD SWB BWE +IGF +HR SWB BWE + * ---------------------------------------------------------------------------------------------------------------------------------------------------------------- + * FB + * speech ACELP@16k ACELP@16k ACELP@16k TCX ACELP@16k TCX TCX + * +TD FB BWE +TD FB BWE +TD FB BWE +IGF +HR FB BWE + * audio TCX TCX HQ TCX HQ TCX TCX + * +IGF +IGF +FD FB BWE +IGF + * inactive TCX TCX AVQ@16k TCX AVQ@16k TCX TCX + * +IGF +IGF +FD FB BWE +IGF +HR FB BWE + * ----------------------------------------------------------------------------------------------------------------------------------------------------------------- + * + * Note: the GSC technology is part of the ACELP core as AUDIO coder_type (it is used also at 13.2 for SWB unvoiced noisy speech) + * Note2: FB processing is optional and is activated via "-band FB" option on the encoder command line + * Note3: NB (0-4kHz), WB (0-8kHz), SWB (0-16kHz), FB (0-20kHz) + * + * Signalling of modes (x marks a mode that must be signalled in the bitstream) + * + * 7.20 8.00 9.6 13.2 16.4 24.4 32 48 64 + * NB WB SWB FB NB WB SWB FB NB WB SWB FB NB WB SWB FB NB WB SWB FB NB WB SWB FB NB WB SWB FB NB WB SWB FB NB WB SWB FB + * GC, 12k8 x x x x x x x x x x x x x + * UC, 12k8 x x x x x x + * VC, 12k8 x x x x x x x x x x x x x + * TC, 12k8 x x x x x x x x x x x x x + * GC, 16k x x x x x x x x x x x x + * TC, 16k x x x x x x x x x x x x + * AC(GSC) x x x x x x x x x x x x x + * IC x x x x x x x x x x x x x x x x x x x x x x x x x + * + * GC, 12k8, FS x x x x x x x x x x x x x + * GC, 16k, FS x x x x x x x x x x x + * VC, 12k8, FS x x x x x x x + * TC, 12k8, FS x + * TC, 16k, FS x x x x x x x x x x x + * + * LR MDCT x x x x x x x x x x x + * + *-----------------------------------------------------------------*/ + +void decision_matrix_enc( + Encoder_State *st, /* i : encoder state structure */ + int16_t *hq_core_type /* o : HQ core type */ +) +{ + /* initialization */ + st->core = -1; + st->extl = -1; + st->extl_brate = 0; + *hq_core_type = -1; + st->igf = 0; + + /* SID and FRAME_NO_DATA frames */ + if ( st->Opt_DTX_ON && ( st->core_brate == SID_2k40 || st->core_brate == FRAME_NO_DATA ) ) + { + st->core = ACELP_CORE; + + if ( st->input_Fs >= 32000 && st->bwidth >= SWB ) + { + st->extl = SWB_CNG; + } + + st->rf_mode = 0; + + return; + } + + st->core_brate = 0; + + /* SC-VBR */ + if ( st->Opt_SC_VBR ) + { + /* SC-VBR */ + st->core = ACELP_CORE; + st->core_brate = ACELP_7k20; + st->total_brate = ACELP_7k20; + + if ( st->hSC_VBR->ppp_mode == 1 ) + { + /* PPP mode */ + st->core_brate = PPP_NELP_2k80; + } + else if ( ( ( st->coder_type == UNVOICED || st->coder_type == TRANSITION ) && !st->sp_aud_decision1 ) || st->bwidth != NB ) + { + if ( st->coder_type == UNVOICED && st->vad_flag == 1 && ( ( st->last_bwidth >= SWB && st->last_Opt_SC_VBR ) || st->last_bwidth < SWB ) && ( st->last_core != HQ_CORE || st->bwidth != NB ) ) + { + /* NELP mode */ + st->hSC_VBR->nelp_mode = 1; + st->core_brate = PPP_NELP_2k80; + } + else if ( st->coder_type == TRANSITION || ( st->coder_type == UNVOICED && st->hSC_VBR->nelp_mode != 1 ) || ( ( st->coder_type == AUDIO || st->coder_type == INACTIVE ) && st->bwidth != NB ) ) + { + /* silence portions */ + st->core_brate = ACELP_8k00; + st->total_brate = ACELP_8k00; + } + } + + /* set inactive coder_type flag in ACELP core to GSC */ + st->inactive_coder_type_flag = 1; + + return; + } + + /*---------------------------------------------------------------------* + * NB + *---------------------------------------------------------------------*/ + + else if ( st->bwidth == NB ) + { + st->core = ACELP_CORE; + + if ( st->total_brate >= HQCORE_NB_MIN_RATE && st->sp_aud_decision1 == 1 ) + { + st->core = HQ_CORE; + } + } + + /*---------------------------------------------------------------------* + * WB + *---------------------------------------------------------------------*/ + + else if ( st->bwidth == WB ) + { + st->core = ACELP_CORE; + + if ( ( st->total_brate >= HQCORE_WB_MIN_RATE && st->sp_aud_decision1 == 1 ) || st->total_brate >= HQ_96k ) + { + st->core = HQ_CORE; + } + else + { + if ( st->bwidth == WB && st->total_brate < ACELP_9k60 ) + { + st->extl = WB_BWE; + } + else if ( st->bwidth == WB && st->total_brate >= ACELP_9k60 && st->total_brate <= ACELP_16k40 ) + { + /* Note: WB BWE is used exceptionally at 13.2 kbps if GSC is selected instead of LR-MDCT */ + if ( st->sp_aud_decision1 == 1 || st->coder_type == INACTIVE || ( st->sp_aud_decision1 == 0 && st->sp_aud_decision2 == 1 ) ) + { + st->extl = WB_BWE; + st->extl_brate = WB_BWE_0k35; + } + else + { + st->extl = WB_TBE; + st->extl_brate = WB_TBE_1k05; + } + } + } + } + + /*---------------------------------------------------------------------* + * SWB and FB + *---------------------------------------------------------------------*/ + + else if ( st->bwidth == SWB || st->bwidth == FB ) + { + if ( ( st->total_brate >= HQCORE_SWB_MIN_RATE && st->sp_aud_decision1 == 1 ) || st->total_brate >= HQ_96k ) + { + st->core = HQ_CORE; + } + else + { + st->core = ACELP_CORE; + + if ( st->total_brate >= ACELP_13k20 && st->total_brate < ACELP_48k ) + { + /* Note: SWB BWE is not used in case of GSC noisy speech */ + /* Note: SWB BWE is used exceptionally at 13.2 kbps if GSC is selected instead of LR-MDCT */ + if ( ( st->sp_aud_decision1 == 1 || st->coder_type == INACTIVE || ( st->sp_aud_decision1 == 0 && st->sp_aud_decision2 == 1 ) ) && !st->GSC_noisy_speech ) + { + st->extl = SWB_BWE; + st->extl_brate = SWB_BWE_1k6; + + if ( st->bwidth == FB && st->total_brate >= ACELP_24k40 ) + { + st->extl = FB_BWE; + st->extl_brate = FB_BWE_1k8; + } + } + else + { + st->extl = SWB_TBE; + st->extl_brate = SWB_TBE_1k6; + + if ( st->total_brate >= ACELP_24k40 ) + { + st->extl_brate = SWB_TBE_2k8; + } + + if ( st->bwidth == FB && st->total_brate >= ACELP_24k40 ) + { + st->extl = FB_TBE; + st->extl_brate = FB_TBE_3k0; + } + } + } + else if ( st->total_brate >= ACELP_48k ) + { + st->extl = SWB_BWE_HIGHRATE; + st->extl_brate = SWB_BWE_16k; + + if ( st->bwidth == FB ) + { + st->extl = FB_BWE_HIGHRATE; + } + } + } + } + + /*-----------------------------------------------------------------* + * Set HQ core type + *-----------------------------------------------------------------*/ + + if ( st->core == HQ_CORE ) + { + *hq_core_type = NORMAL_HQ_CORE; + + if ( ( st->bwidth == SWB || st->bwidth == WB ) && st->total_brate <= LRMDCT_CROSSOVER_POINT ) + { + /* note that FB (bitrate >= 24400 bps) is always coded with NORMAL_HQ_CORE */ + *hq_core_type = LOW_RATE_HQ_CORE; + } + else if ( st->bwidth == NB ) + { + *hq_core_type = LOW_RATE_HQ_CORE; + } + } + + /* set core bitrate */ + st->core_brate = st->total_brate - st->extl_brate; + + if ( st->ini_frame == 0 ) + { + /* avoid switching in the very first frame */ + st->last_core = st->core; + st->last_core_brate = st->core_brate; + st->last_extl = st->extl; + } + + /*-----------------------------------------------------------------* + * set inactive coder_type flag in ACELP core + *-----------------------------------------------------------------*/ + + st->inactive_coder_type_flag = 0; /* AVQ by default */ + if ( st->total_brate <= MAX_GSC_INACTIVE_BRATE ) + { + st->inactive_coder_type_flag = 1; /* GSC */ + } + + return; +} + + +/*---------------------------------------------------------------------* + * signaling_mode1_tcx20_enc() + * + * write MODE1 TCX20 signaling information into the bitstream + *---------------------------------------------------------------------*/ + +int16_t signaling_mode1_tcx20_enc( + Encoder_State *st, /* i/o: encoder state structure */ + const int16_t push /* i : flag to push indice */ +) +{ + int16_t num_bits; + int16_t nBits, idx, start_idx; + BSTR_ENC_HANDLE hBstr = st->hBstr; + + assert( st->core == TCX_20_CORE ); + + num_bits = 0; + + /* Use ACELP signaling for LR MDCT */ + if ( st->total_brate <= ACELP_16k40 ) + { + /* find the section in the ACELP signaling table corresponding to bitrate */ + idx = 0; + while ( acelp_sig_tbl[idx] != st->total_brate ) + { + idx++; + } + + /* retrieve the number of bits for signaling */ + nBits = (int16_t) acelp_sig_tbl[++idx]; + + /* retrieve the signaling index */ + start_idx = ++idx; + while ( acelp_sig_tbl[idx] != SIG2IND( LR_MDCT, st->bwidth, 0, 0 ) ) + { + idx++; + } + + num_bits += nBits; + if ( push ) + { + push_indice( hBstr, IND_ACELP_SIGNALLING, idx - start_idx, nBits ); + } + + /* HQ/TCX core switching flag */ + ++num_bits; + if ( push ) + { + push_indice( hBstr, IND_MDCT_CORE, 1, 1 ); + } + } + else + { + if ( st->core_brate <= ACELP_64k ) + { + /* write ACELP/HQ core indication flag */ + ++num_bits; + if ( push ) + { + push_indice( hBstr, IND_CORE, 1, 1 ); + } + } + + /* HQ/TCX core switching flag */ + ++num_bits; + if ( push ) + { + push_indice( hBstr, IND_MDCT_CORE, 1, 1 ); + } + + num_bits += 2; + if ( push ) + { + /* write band-width (needed for different I/O sampling rate support) */ + if ( st->bwidth == NB ) + { + push_indice( hBstr, IND_HQ_BWIDTH, 0, 2 ); + } + else if ( st->bwidth == WB ) + { + push_indice( hBstr, IND_HQ_BWIDTH, 1, 2 ); + } + else if ( st->bwidth == SWB ) + { + push_indice( hBstr, IND_HQ_BWIDTH, 2, 2 ); + } + else /* st->bwidth == FB */ + { + push_indice( hBstr, IND_HQ_BWIDTH, 3, 2 ); + } + } + } + + return num_bits; +} + + +/*---------------------------------------------------------------------* + * signaling_enc() + * + * write signaling information into the bitstream + *---------------------------------------------------------------------*/ + +void signaling_enc( + Encoder_State *st /* i : encoder state structure */ +) +{ + int16_t nBits, idx, start_idx; + int32_t total_brate_temp; + int16_t sig; + BSTR_ENC_HANDLE hBstr = st->hBstr; + + if ( st->mdct_sw == MODE2 ) + { + + assert( !st->tcxonly ); + assert( st->core == HQ_CORE ); + + push_next_indice( hBstr, 1, 1 ); /* TCX */ + push_next_indice( hBstr, 1, 1 ); /* HQ_CORE */ + + /* write ACELP->HQ core switching flag */ + if ( st->last_core == ACELP_CORE || st->last_core == AMR_WB_CORE ) + { + push_indice( hBstr, IND_HQ_SWITCHING_FLG, 1, 1 ); + + /* write ACELP L_frame info */ + if ( st->last_L_frame == L_FRAME ) + { + push_indice( hBstr, IND_LAST_L_FRAME, 0, 1 ); + } + else + { + push_indice( hBstr, IND_LAST_L_FRAME, 1, 1 ); + } + } + else + { + push_indice( hBstr, IND_HQ_SWITCHING_FLG, 0, 1 ); + } + + return; + } + + if ( st->core == ACELP_CORE ) + { + int16_t ppp_mode, nelp_mode; + + if ( st->Opt_SC_VBR ) + { + ppp_mode = st->hSC_VBR->ppp_mode; + nelp_mode = st->hSC_VBR->nelp_mode; + } + else + { + ppp_mode = 0; + nelp_mode = 0; + } + + if ( ppp_mode == 1 || nelp_mode == 1 ) + { + /* 1 bit to distinguish between 2.8kbps PPP/NELP frame and SID frame */ + push_indice( hBstr, IND_CORE, 0, 1 ); + + /* SC-VBR: 0 - PPP_NB, 1 - PPP_WB, 2 - NELP_NB, 3 - NELP_WB */ + if ( st->coder_type == VOICED && st->bwidth == NB && ppp_mode == 1 ) + { + push_indice( hBstr, IND_PPP_NELP_MODE, 0, 2 ); + } + else if ( st->coder_type == VOICED && st->bwidth != NB && ppp_mode == 1 ) + { + push_indice( hBstr, IND_PPP_NELP_MODE, 1, 2 ); + } + else if ( st->coder_type == UNVOICED && st->bwidth == NB && nelp_mode == 1 ) + { + push_indice( hBstr, IND_PPP_NELP_MODE, 2, 2 ); + } + else if ( st->coder_type == UNVOICED && st->bwidth != NB && nelp_mode == 1 ) + { + push_indice( hBstr, IND_PPP_NELP_MODE, 3, 2 ); + } + } + else if ( st->core_brate != SID_2k40 && st->core_brate != FRAME_NO_DATA ) + { + /* write the ACELP/HQ core selection bit */ + if ( st->total_brate >= ACELP_24k40 ) + { + push_indice( hBstr, IND_CORE, 0, 1 ); + } + + /* find the section in the ACELP signaling table corresponding to bitrate */ + idx = 0; + while ( idx < MAX_ACELP_SIG ) + { + if ( st->total_brate <= brate_tbl[idx] ) + { + break; + } + idx++; + } + total_brate_temp = brate_tbl[idx]; + + idx = 0; + while ( acelp_sig_tbl[idx] != total_brate_temp ) + { + idx++; + } + + /* retrieve the number of bits for signaling */ + nBits = (int16_t) acelp_sig_tbl[++idx]; + + /* retrieve the signaling index */ + start_idx = ++idx; + if ( st->element_mode == IVAS_CPE_TD && st->bwidth == SWB && st->total_brate <= ACELP_9k60 ) + { + /* patch to signal SWB as NB in Stereo */ + sig = SIG2IND( st->coder_type, NB, st->sharpFlag, st->rf_mode ); + } + else + { + sig = SIG2IND( st->coder_type, st->bwidth, st->sharpFlag, st->rf_mode ); + } + + while ( acelp_sig_tbl[idx] != sig ) + { + idx++; + } + + push_indice( hBstr, IND_ACELP_SIGNALLING, idx - start_idx, nBits ); + } + + /* write extension layer flag to distinguish between TBE (0) and BWE (1) */ + if ( st->extl_brate > 0 ) + { + if ( st->extl == WB_TBE || st->extl == SWB_TBE || st->extl == FB_TBE ) + { + push_indice( hBstr, IND_BWE_FLAG, 0, 1 ); + } + else if ( st->extl == WB_BWE || st->extl == SWB_BWE || st->extl == FB_BWE ) + { + push_indice( hBstr, IND_BWE_FLAG, 1, 1 ); + } + } + } + else /* HQ core */ + { + /* write ACELP->HQ core switching flag */ + if ( st->last_core == ACELP_CORE || st->last_core == AMR_WB_CORE ) + { + push_indice( hBstr, IND_HQ_SWITCHING_FLG, 1, 1 ); + + /* write ACELP L_frame info */ + if ( st->last_L_frame == L_FRAME ) + { + push_indice( hBstr, IND_LAST_L_FRAME, 0, 1 ); + } + else + { + push_indice( hBstr, IND_LAST_L_FRAME, 1, 1 ); + } + } + else + { + push_indice( hBstr, IND_HQ_SWITCHING_FLG, 0, 1 ); + } + + /* HQ/TCX core switching flag */ + push_indice( hBstr, IND_MDCT_CORE, 0, 1 ); + + /* Use ACELP signaling for LR MDCT */ + if ( st->total_brate <= ACELP_16k40 ) + { + /* find the section in the ACELP signaling table corresponding to bitrate */ + idx = 0; + while ( acelp_sig_tbl[idx] != st->total_brate ) + { + idx++; + } + + /* retrieve the number of bits for signaling */ + nBits = (int16_t) acelp_sig_tbl[++idx]; + + /* retrieve the signaling index */ + start_idx = ++idx; + while ( acelp_sig_tbl[idx] != SIG2IND( LR_MDCT, st->bwidth, 0, 0 ) ) + { + idx++; + } + + push_indice( hBstr, IND_ACELP_SIGNALLING, idx - start_idx, nBits ); + } + else + { + if ( st->core_brate <= ACELP_64k ) + { + /* write ACELP/HQ core indication flag */ + push_indice( hBstr, IND_CORE, 1, 1 ); + } + + /* write band-width (needed for different I/O sampling rate support) */ + if ( st->bwidth == NB ) + { + push_indice( hBstr, IND_HQ_BWIDTH, 0, 2 ); + } + else if ( st->bwidth == WB ) + { + push_indice( hBstr, IND_HQ_BWIDTH, 1, 2 ); + } + else if ( st->bwidth == SWB ) + { + push_indice( hBstr, IND_HQ_BWIDTH, 2, 2 ); + } + else /* st->bwidth == FB */ + { + push_indice( hBstr, IND_HQ_BWIDTH, 3, 2 ); + } + } + } + + return; +} + +/*---------------------------------------------------------------------* + * signaling_enc_rf() + * + * write channel-aware signaling information into the bitstream + *---------------------------------------------------------------------*/ + +void signaling_enc_rf( + Encoder_State *st /* i/o: encoder state structure */ +) +{ + int16_t i, sfr; + RF_ENC_HANDLE hRF = st->hRF; + + /* write partial copy into bitstream */ + if ( st->rf_mode == 1 ) + { + enc_prm_rf( st, hRF->rf_indx_frametype[st->rf_fec_offset], st->rf_fec_offset ); + hRF->rf_indx_tbeGainFr[0] = hRF->RF_bwe_gainFr_ind; + } + + if ( hRF != NULL ) + { + /* Shift the RF indices such that the partial copy associated with + (n-fec_offset)th frame is included in the bitstream in nth frame. */ + for ( i = st->rf_fec_offset; i >= 0; i-- ) + { + /* RF frame type */ + hRF->rf_indx_frametype[i + 1] = hRF->rf_indx_frametype[i]; + + /* RF target bits buffer */ + hRF->rf_targetbits_buff[i + 1] = hRF->rf_targetbits_buff[i]; + + /* lsf indx */ + hRF->rf_indx_lsf[i + 1][0] = hRF->rf_indx_lsf[i][0]; + hRF->rf_indx_lsf[i + 1][1] = hRF->rf_indx_lsf[i][1]; + hRF->rf_indx_lsf[i + 1][2] = hRF->rf_indx_lsf[i][2]; + + /* ES pred energy */ + hRF->rf_indx_EsPred[i + 1] = hRF->rf_indx_EsPred[i]; + + /* LTF mode, sfr params: pitch, fcb and gain */ + for ( sfr = 0; sfr < st->nb_subfr; sfr++ ) + { + hRF->rf_indx_ltfMode[i + 1][sfr] = hRF->rf_indx_ltfMode[i][sfr]; + hRF->rf_indx_pitch[i + 1][sfr] = hRF->rf_indx_pitch[i][sfr]; + hRF->rf_indx_fcb[i + 1][sfr] = hRF->rf_indx_fcb[i][sfr]; + hRF->rf_indx_gain[i + 1][sfr] = hRF->rf_indx_gain[i][sfr]; + } + + /* shift the nelp indices */ + hRF->rf_indx_nelp_iG1[i + 1] = hRF->rf_indx_nelp_iG1[i]; + hRF->rf_indx_nelp_iG2[i + 1][0] = hRF->rf_indx_nelp_iG2[i][0]; + hRF->rf_indx_nelp_iG2[i + 1][1] = hRF->rf_indx_nelp_iG2[i][1]; + hRF->rf_indx_nelp_fid[i + 1] = hRF->rf_indx_nelp_fid[i]; + + /* tbe gain Fr shift */ + hRF->rf_indx_tbeGainFr[i + 1] = hRF->rf_indx_tbeGainFr[i]; + hRF->rf_clas[i + 1] = hRF->rf_clas[i]; + hRF->rf_gain_tcx[i + 1] = hRF->rf_gain_tcx[i]; + hRF->rf_tcxltp_param[i + 1] = hRF->rf_tcxltp_param[i]; + } + } + + return; +} diff --git a/lib_enc/detect_transient.c b/lib_enc/detect_transient.c new file mode 100644 index 0000000000000000000000000000000000000000..669b55433a713dd71e5cdfe0e351e40d3682c017 --- /dev/null +++ b/lib_enc/detect_transient.c @@ -0,0 +1,261 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "prot.h" +#include "cnst.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------------- + * hp_filter() + * + * High pass filter + *--------------------------------------------------------------------------*/ + +static void hp_filter( + const float *x, /* i : input signal */ + float *y, /* o : output signal */ + float *oldx, /* i/o: previous filter input */ + float *oldy, /* i/o: previous filter output */ + const int16_t L /* i : length (32 or 48Hz) */ +) +{ + int16_t i; + + y[0] = 0.4931f * *oldy + 0.7466f * ( x[0] - *oldx ); + + for ( i = 1; i < L; i++ ) + { + y[i] = 0.4931f * y[i - 1] + 0.7466f * ( x[i] - x[i - 1] ); + } + + *oldx = x[L - 1]; + *oldy = y[L - 1]; + + return; +} + +/*-------------------------------------------------------------------------- + * detect_transient() + * + * Detect if the signal is a transient + *--------------------------------------------------------------------------*/ + +/*! r: transient flag */ +int16_t detect_transient( + Encoder_State *st, /* i/o: Encoder state structure */ + const float *in, /* i : input signal */ + const int16_t L /* i : length (32 or 48kHz) */ +) +{ + float Energy; + float EnergyLT; + int16_t i, blk; + int16_t IsTransient; + float out_filt[L_FRAME48k]; + int16_t position = 0; + float thr; + float Thres = 0.f; + float Energy_in[5]; + float E_low, E_high; + float E_in = 0.0f, E_out = 0.0f; + + IsTransient = 0; + + if ( st->last_extl != st->extl ) + { + st->TransientHangOver = 0; + st->old_hpfilt_in = 0; + st->old_hpfilt_out = 0; + st->Energy_Old = 0; + } + + /* High-pass filter */ + hp_filter( in, out_filt, &( st->old_hpfilt_in ), &( st->old_hpfilt_out ), L ); + + /* Long-term energy */ + if ( st->last_extl != st->extl || ( st->last_extl == st->extl && st->last_core != st->core ) || st->last_codec_mode == MODE2 ) + { + EnergyLT = EPSILON; + for ( i = 0; i < L / 4; i++ ) + { + EnergyLT += out_filt[i] * out_filt[i]; + } + } + else + { + EnergyLT = st->EnergyLT; + } + + if ( L == L_FRAME8k ) + { + Energy_in[0] = st->Energy_Old; + E_in = 0; + E_out = 0; + + /* Compute block energy */ + for ( blk = 0; blk < 4; blk++ ) + { + Energy = EPSILON; + Energy_in[blk + 1] = EPSILON; + + for ( i = 0; i < L / 4; i++ ) + { + Energy += out_filt[i + blk * ( L / 4 )] * out_filt[i + blk * ( L / 4 )]; + Energy_in[blk + 1] += in[i + blk * ( L / 4 )] * in[i + blk * ( L / 4 )]; + } + + E_in += Energy_in[blk + 1]; + E_out += Energy; + + Thres = 15.f; + + if ( Energy > 6.0f * EnergyLT ) + { + IsTransient = 1; + position = blk; + } + + EnergyLT = 0.75f * EnergyLT + 0.25f * Energy; + } + } + else + { + /* Compute block energy */ + for ( blk = 0; blk < 4; blk++ ) + { + Energy = EPSILON; + for ( i = 0; i < L / 4; i++ ) + { + Energy += out_filt[i + blk * ( L / 4 )] * out_filt[i + blk * ( L / 4 )]; + } + + if ( st->extl == SWB_BWE || st->extl == FB_BWE ) + { + if ( ( Energy > 13.5f * EnergyLT ) || ( Energy > 10.0f * EnergyLT && st->core == ACELP_CORE && st->coder_type == INACTIVE ) ) + { + IsTransient = 1; + position = blk; + } + } + else + { + if ( st->total_brate <= HQ_16k40 && st->bwidth == SWB ) + { + thr = 13.5f; + } + else + { + thr = 6.0f; + } + + if ( Energy > thr * EnergyLT ) + { + IsTransient = 1; + position = blk; + } + } + + EnergyLT = 0.75f * EnergyLT + 0.25f * Energy; + } + } + + st->EnergyLT = EnergyLT; + + if ( ( st->last_extl != SWB_BWE && st->last_extl != SWB_TBE && st->extl == SWB_BWE ) || + ( st->last_extl != FB_BWE && st->last_extl != FB_TBE && st->extl == FB_BWE ) ) + { + IsTransient = 0; + } + + if ( IsTransient && L == L_FRAME8k ) + { + E_low = 0.f; + blk = 0; + for ( i = 0; i < position + 1; i++ ) + { + E_low += Energy_in[i]; + blk++; + } + E_low /= (float) blk; + + E_high = 0.f; + blk = 0; + for ( i = position + 1; i < 5; i++ ) + { + E_high += Energy_in[i]; + blk++; + } + E_high /= (float) blk; + + if ( ( ( E_high / E_low < 2.0f ) && ( E_high / E_low > 0.7f ) ) && ( ( E_in / E_out ) > Thres ) ) + { + IsTransient = 0; + } + } + + if ( IsTransient ) + { + if ( L == L_FRAME8k ) + { + if ( position == 3 ) + { + st->TransientHangOver = 1; + } + } + else + { + st->TransientHangOver = 1; + } + } + else + { + if ( st->TransientHangOver ) + { + st->TransientHangOver = 0; + IsTransient = 1; + } + } + + if ( L == L_FRAME8k ) + { + st->Energy_Old = Energy_in[4]; + } + + return IsTransient; +} diff --git a/lib_enc/diffcod.c b/lib_enc/diffcod.c new file mode 100644 index 0000000000000000000000000000000000000000..47810a67228f97cecdfa4c652ec6f735ef8b87c9 --- /dev/null +++ b/lib_enc/diffcod.c @@ -0,0 +1,149 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*--------------------------------------------------------------------------*/ +/* Function diffcod() */ +/* */ +/* Differential coding for indices of quantized norms */ +/*--------------------------------------------------------------------------*/ + +void diffcod( + const int16_t N, /* i : number of sub-vectors */ + int16_t *y, /* i/o: indices of quantized norms */ + int16_t *difidx /* o : differential code */ +) +{ + int16_t i, k, r; + + for ( i = N - 1; i > 0; i-- ) + { + r = i - 1; + k = y[i] - y[r]; + if ( k < ( -15 ) ) + { + y[r] = y[i] + 15; + } + } + + for ( i = 1; i < N; i++ ) + { + r = i - 1; + k = y[i] - y[r]; + if ( k > 16 ) + { + k = 16; + y[i] = y[r] + 16; + } + difidx[r] = k + 15; + } + + return; +} + + +/*-------------------------------------------------------------------------- + * diffcod_lrmdct() + * + * Differential coding for indices of quantized norms + *--------------------------------------------------------------------------*/ + +void diffcod_lrmdct( + const int16_t N, /* i : number of sub-vectors */ + const int16_t be_ref, /* i : band energy reference */ + int16_t *y, /* i/o: indices of quantized norms */ + int16_t *difidx, /* o : differential code */ + const int16_t is_transient /* i : transient flag */ +) +{ + int16_t i, m, r; + int16_t k; + int16_t thr_l, thr_h; + + if ( is_transient ) + { + thr_l = -15; + thr_h = 16; + } + else + { + thr_l = -32; + thr_h = 31; + } + + difidx[0] = y[0] - be_ref; + if ( difidx[0] > thr_h ) + { + difidx[0] = thr_h; + y[0] = be_ref + thr_h; + } + + if ( difidx[0] < thr_l ) + { + difidx[0] = thr_l; + y[0] = be_ref + thr_l; + } + + m = N - 1; + for ( i = m; i > 0; i-- ) + { + r = i - 1; + k = y[i] - y[r]; + if ( k < thr_l ) + { + y[r] = y[i] - thr_l; + } + } + + for ( i = 1; i < N; i++ ) + { + r = i - 1; + k = y[i] - y[r]; + if ( k > thr_h ) + { + k = thr_h; + y[i] = y[r] + thr_h; + } + difidx[i] = k; + } + + return; +} diff --git a/lib_enc/dtx.c b/lib_enc/dtx.c new file mode 100644 index 0000000000000000000000000000000000000000..9153316fa403ee2d9663420befb8c244d351062d --- /dev/null +++ b/lib_enc/dtx.c @@ -0,0 +1,871 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "ivas_prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * Local constants + *-------------------------------------------------------------------*/ + +#define ALPHA_ENER_SLOW 0.99f /* Slow adaptation (noise up, speech down) */ +#define ALPHA_ENER_FAST 0.90f /* Fast adaptation (noise down, speech up) */ +#define MIN_CNT 50 /* Minimum frame number before SID interval adaptation */ + +#define SNR_H 51.0f /* Estimated SNR and corresponding SID interval */ + /* 51dB corresponds to 25dB SNR before noise supressor */ +#define SNR_L 36.0f +#define INT_H 50 +#define INT_L 8 + +#define LTE_VAR -4.0f + +#define MAX_BRATE_DTX_EVS ACELP_24k40 /* maximum bitrate to which the default DTX is applied in EVS; otherwise DTX is applied only in silence */ +#define MAX_BRATE_DTX_IVAS IVAS_80k /* maximum bitrate to which the default DTX is applied in IVAS; otherwise DTX is applied only in silence */ +/*-------------------------------------------------------------------* + * Local function prototypes + *-------------------------------------------------------------------*/ + +static void update_SID_cnt( DTX_ENC_HANDLE hDtxEnc, const int32_t core_brate, const int16_t Opt_AMR_WB ); + +/*-------------------------------------------------------------------* + * dtx() + * + * Discontinuous transmission operation + *-------------------------------------------------------------------*/ + +void dtx( + Encoder_State *st, /* i/o: encoder state structure */ + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + const int16_t vad, /* i : VAD flag for DTX */ + const float speech[] /* i : Pointer to the speech frame */ +) +{ + float alpha; + DTX_ENC_HANDLE hDtxEnc = st->hDtxEnc; + int16_t last_br_cng_flag, last_br_flag, br_dtx_flag; + if ( st->dtx_sce_sba != 0 ) + { + last_br_cng_flag = 1; + last_br_flag = 1; + br_dtx_flag = 1; + } + else + { + last_br_cng_flag = st->last_total_brate_cng <= MAX_BRATE_DTX_EVS || st->lp_noise < 15 || ( st->element_mode == IVAS_SCE && st->last_total_brate_cng <= MAX_BRATE_DTX_IVAS ); + last_br_flag = st->last_total_brate <= MAX_BRATE_DTX_EVS || st->lp_noise < 15 || ( st->element_mode == IVAS_SCE && st->last_total_brate <= MAX_BRATE_DTX_IVAS ); + br_dtx_flag = 0; + } + + /* Initialization */ + if ( st->ini_frame == 0 ) + { + st->active_cnt = CNG_TYPE_HO; + + if ( ( st->codec_mode == MODE1 || st->Opt_AMR_WB ) && st->element_mode != IVAS_SCE && st->element_mode != IVAS_CPE_MDCT ) + { + st->cng_type = LP_CNG; + } + else + { + st->cng_type = FD_CNG; + } + } + + if ( st->Opt_DTX_ON && vad == 0 && + st->ini_frame > 2 && /* CNG coding starts after 3 frames */ + st->fd_cng_reset_flag == 0 && + st->last_core != AMR_WB_CORE && + st->Opt_AMR_WB == 0 ) + { + if ( st->last_core_brate > SID_2k40 && + st->last_total_brate_cng != -1 && + st->last_total_brate_cng != st->total_brate && + last_br_cng_flag ) + { + st->total_brate = st->last_total_brate_cng; + if ( !( st->total_brate == ACELP_7k20 && st->Opt_SC_VBR ) ) + { + st->Opt_SC_VBR = 0; + } + + st->rf_mode = st->last_rf_mode_cng; + st->bwidth = st->last_bwidth_cng; + st->codec_mode = st->last_codec_mode_cng; + } + + if ( st->last_core_brate <= SID_2k40 && + st->last_total_brate != st->total_brate && + last_br_flag ) + { + st->total_brate = st->last_total_brate; + if ( !( st->total_brate == ACELP_7k20 && st->Opt_SC_VBR ) ) + { + st->Opt_SC_VBR = 0; + } + + st->Opt_RF_ON = 0; + if ( st->rf_mode && st->rf_fec_offset > 0 && st->total_brate == ACELP_13k20 && st->bwidth != NB ) + { + st->Opt_RF_ON = 1; + } + st->rf_mode = st->Opt_RF_ON; + st->bwidth = st->last_bwidth; + + if ( st->element_mode > EVS_MONO ) + { + st->codec_mode = MODE1; + } + else + { + st->codec_mode = get_codec_mode( st->total_brate ); + } + } + } + + /*------------------------------------------------------------------------* + * Select SID or FRAME_NO_DATA frame if DTX is enabled + *------------------------------------------------------------------------*/ + + if ( st->dtx_sce_sba == 0 ) + { + br_dtx_flag = ( st->element_mode == EVS_MONO && st->total_brate <= MAX_BRATE_DTX_EVS ) || + ( st->element_mode != EVS_MONO && ivas_total_brate <= MAX_BRATE_DTX_IVAS ) || + st->lp_noise < 15; + } + + if ( st->Opt_DTX_ON && vad == 0 && + st->ini_frame > 2 && /* CNG coding starts after 3 frames */ + + br_dtx_flag && + st->fd_cng_reset_flag == 0 ) + { + /* reset counter */ + st->active_cnt = 0; + + if ( st->Opt_AMR_WB ) + { + st->last_total_brate_cng = -1; + } + else + { + st->last_total_brate_cng = st->total_brate; + st->last_bwidth_cng = st->bwidth; + st->last_codec_mode_cng = st->codec_mode; + st->last_rf_mode_cng = st->rf_mode; + } + + if ( hDtxEnc->cnt_SID == 0 ) + { + /* this will be a SID frame */ + if ( st->Opt_AMR_WB ) + { + st->core_brate = SID_1k75; + } + else + { + st->core_brate = SID_2k40; + } + } + else + { + /* this will be a no data frame */ + st->core_brate = FRAME_NO_DATA; + } + + if ( st->core_brate == FRAME_NO_DATA && st->last_core != ACELP_CORE && !st->Opt_AMR_WB ) + { + /* force SID frame when switching from HQ core or AMR-WB IO mode into inactive frame in ACELP core when DTX is on */ + { + st->core_brate = SID_2k40; + } + } + + if ( ( st->last_core != ACELP_CORE || st->cng_type == FD_CNG ) && st->dtx_sce_sba == 1 ) + { + st->cng_type = FD_CNG; + if ( st->element_mode == EVS_MONO && ( st->total_brate == ACELP_9k60 || st->total_brate == ACELP_16k40 || st->total_brate == ACELP_24k40 || st->total_brate == ACELP_48k || st->total_brate == HQ_96k || st->total_brate == HQ_128k ) ) + { + st->codec_mode = MODE2; + } + } + else + { + if ( ( st->cng_type == FD_CNG && ( st->total_brate <= MAX_BRATE_DTX_EVS || ( st->element_mode != EVS_MONO && ivas_total_brate <= MAX_BRATE_DTX_IVAS ) ) ) || ( st->element_mode == IVAS_CPE_MDCT ) ) /* at highest bitrates, use exclusively LP_CNG */ + { + if ( st->element_mode == EVS_MONO && ( st->total_brate == ACELP_9k60 || st->total_brate == ACELP_16k40 || st->total_brate == ACELP_24k40 ) ) + { + st->codec_mode = MODE2; + } + } + else + { + st->cng_type = LP_CNG; + if ( st->codec_mode == MODE2 ) + { + st->hTdCngEnc->lp_cng_mode2 = 1; + } + st->codec_mode = MODE1; + } + } + + /* reset the bitstream (IVAS format signaling was already written) */ + if ( st->element_mode != IVAS_CPE_MDCT && st->hBstr != NULL ) + { + reset_indices_enc( st->hBstr, st->hBstr->nb_ind_tot ); + } + } + + /*------------------------------------------------------------------------* + * Reset counters when in active frame (neither SID nor FRAME_NO_DATA frame) + *------------------------------------------------------------------------*/ + + if ( st->core_brate != SID_2k40 && st->core_brate != SID_1k75 && st->core_brate != FRAME_NO_DATA ) + { + if ( hDtxEnc != NULL ) + { + hDtxEnc->cnt_SID = 0; + + /* change SID update rate */ + /* first SID update is only 8 (3 in AMR-WB IO mode) frames after the active speech end */ + if ( !st->Opt_AMR_WB ) + { + hDtxEnc->max_SID = FIXED_SID_RATE; + } + else + { + hDtxEnc->max_SID = 3; + } + + if ( hDtxEnc->max_SID > hDtxEnc->interval_SID ) + { + hDtxEnc->max_SID = hDtxEnc->interval_SID; + } + + /* reset the counter of CNG frames for averaging */ + hDtxEnc->cng_cnt = 0; + } + + if ( st->active_cnt >= CNG_TYPE_HO && !st->Opt_AMR_WB && st->element_mode != IVAS_CPE_MDCT ) + { + if ( st->element_mode == IVAS_SCE ) + { + float lp_thresh, fd_thresh; + if ( st->Opt_DTX_ON && st->dtx_sce_sba == 1 ) + { + lp_thresh = 5.f; + fd_thresh = 2.f; + } + else + + { + lp_thresh = 10.f; + fd_thresh = 5.f; + } + + /*More conservative selection of LP-CNG for SCE*/ + if ( st->cng_type == LP_CNG && ( st->bckr_tilt_lt > lp_thresh ) ) + { + st->cng_type = FD_CNG; + } + else if ( st->cng_type == FD_CNG && ( st->bckr_tilt_lt < fd_thresh ) && ( st->lp_noise > 2.f ) ) + { + st->cng_type = LP_CNG; + } + } + else + { + if ( st->cng_type == LP_CNG && ( ( st->input_bwidth == NB && st->bckr_tilt_lt > 9.f ) || ( st->input_bwidth > NB && st->bckr_tilt_lt > 45.f ) ) ) + { + st->cng_type = FD_CNG; + } + else if ( st->cng_type == FD_CNG && ( ( st->input_bwidth == NB && st->bckr_tilt_lt < 2.f ) || ( st->input_bwidth > NB && st->bckr_tilt_lt < 10.f ) ) ) + { + st->cng_type = LP_CNG; + } + } + st->last_total_brate_cng = -1; + } + else if ( st->Opt_AMR_WB ) + { + st->cng_type = LP_CNG; + } + + st->active_cnt++; + + st->active_cnt = min( st->active_cnt, 200 ); + } + + /*------------------------------------------------------------------------* + * Update speech and background noise long-term energy + *------------------------------------------------------------------------*/ + + if ( hDtxEnc != NULL ) + { + hDtxEnc->frame_ener = 0.0f; + + if ( st->Opt_DTX_ON ) + { + hDtxEnc->frame_ener = sum2_f( speech, L_FRAME ); + + /* Active speech (voiced) */ + if ( st->clas == VOICED_CLAS ) + { + alpha = ALPHA_ENER_SLOW; + if ( hDtxEnc->frame_ener > hDtxEnc->lt_ener_voiced ) + { + alpha = ALPHA_ENER_FAST; + } + + hDtxEnc->lt_ener_voiced = alpha * hDtxEnc->lt_ener_voiced + ( 1.0f - alpha ) * hDtxEnc->frame_ener; + + hDtxEnc->VarDTX_cnt_voiced++; + if ( hDtxEnc->VarDTX_cnt_voiced > MIN_CNT ) + { + hDtxEnc->VarDTX_cnt_voiced = MIN_CNT; + } + } + + /* Background noise */ + else if ( !st->Opt_AMR_WB ) + { + alpha = ALPHA_ENER_SLOW; + if ( hDtxEnc->frame_ener < hDtxEnc->lt_ener_noise ) + { + alpha = ALPHA_ENER_FAST; + } + + hDtxEnc->lt_ener_noise = alpha * hDtxEnc->lt_ener_noise + ( 1.0f - alpha ) * hDtxEnc->frame_ener; + + hDtxEnc->VarDTX_cnt_noise++; + + if ( hDtxEnc->VarDTX_cnt_noise > MIN_CNT ) + { + hDtxEnc->VarDTX_cnt_noise = MIN_CNT; + } + } + } + } + + /* Update of the SID counter */ + update_SID_cnt( hDtxEnc, st->core_brate, st->Opt_AMR_WB ); + + /* Update encoded bandwidth */ + if ( st->Opt_DTX_ON && ( st->core_brate == SID_2k40 || st->core_brate == FRAME_NO_DATA ) ) + { + st->bwidth = st->last_bwidth; + if ( st->last_core_brate > SID_2k40 && st->last_total_brate_cng != -1 ) + { + st->bwidth = st->last_bwidth_cng; + } + + if ( st->Opt_RF_ON && st->total_brate == ACELP_13k20 && st->bwidth == NB ) + { + st->codec_mode = MODE1; + reset_rf_indices( st->hRF, st->L_frame, &st->rf_target_bits_write ); + st->Opt_RF_ON = 0; + st->rf_mode = 0; + } + + if ( st->Opt_RF_ON && st->total_brate != ACELP_13k20 && st->hRF != NULL ) + { + reset_rf_indices( st->hRF, st->L_frame, &st->rf_target_bits_write ); + st->Opt_RF_ON = 0; + st->rf_mode = 0; + } + + if ( st->codec_mode == MODE2 ) + { + int16_t n, bits_frame_nominal, tmpBandwidthMin; + + bits_frame_nominal = (int16_t) ( st->total_brate / FRAMES_PER_SEC ); + for ( n = 0; n < FRAME_SIZE_NB; n++ ) + { + if ( FrameSizeConfig[n].frame_bits == bits_frame_nominal ) + { + break; + } + } + if ( n == FRAME_SIZE_NB ) + { + assert( !"Bitrate not supported: not part of EVS" ); + } + + tmpBandwidthMin = FrameSizeConfig[n].bandwidth_min; + + if ( st->rf_mode ) + { + tmpBandwidthMin = WB; + } + + st->bwidth = check_bounds_s( st->bwidth, tmpBandwidthMin, FrameSizeConfig[n].bandwidth_max ); + } + } + + + return; +} + + +/*---------------------------------------------------------------------* + * update_SID_cnt() + * + * Update of the SID counter + *---------------------------------------------------------------------*/ + +static void update_SID_cnt( + DTX_ENC_HANDLE hDtxEnc, /* i/o: common DTX handle */ + const int32_t core_brate, /* i : core coder core bitrate */ + const int16_t Opt_AMR_WB /* i : AMR BW IO mode? */ +) +{ + float EstimatedSNR, delta; + + if ( core_brate == SID_2k40 || core_brate == SID_1k75 || core_brate == FRAME_NO_DATA ) + { + /* Adapt the SID interval */ + if ( hDtxEnc->var_SID_rate_flag && hDtxEnc->VarDTX_cnt_voiced == MIN_CNT && hDtxEnc->VarDTX_cnt_noise == MIN_CNT ) + { + EstimatedSNR = 10.0f * (float) log10( ( 0.01f + hDtxEnc->lt_ener_voiced ) / ( 0.01f + hDtxEnc->lt_ener_noise ) ); + if ( EstimatedSNR > SNR_H ) + { + hDtxEnc->interval_SID = INT_H; + } + else if ( EstimatedSNR < SNR_L ) + { + hDtxEnc->interval_SID = INT_L; + } + else + { + hDtxEnc->interval_SID = INT_L + (int16_t) ( ( INT_H - INT_L ) * ( EstimatedSNR - SNR_L ) / ( SNR_H - SNR_L ) ); + } + hDtxEnc->interval_SID = check_bounds_s( hDtxEnc->interval_SID, INT_L, INT_H ); + + if ( !Opt_AMR_WB || hDtxEnc->max_SID != 3 ) + { + hDtxEnc->max_SID = hDtxEnc->interval_SID; /* change SID update rate */ + } + } + + if ( hDtxEnc->cnt_SID != 0 ) + { + /* Send SID frame only if long-term energy variation is above threshold */ + delta = 10.0f * (float) log10( ( 0.01f + hDtxEnc->lt_ener_noise ) / ( 0.01f + hDtxEnc->lt_ener_last_SID ) ); + if ( delta < LTE_VAR && hDtxEnc->VarDTX_cnt_voiced == MIN_CNT && hDtxEnc->VarDTX_cnt_noise == MIN_CNT ) + { + /* Send SID frame, and reset hDtxEnc->lt_ener_noise */ + hDtxEnc->lt_ener_noise = hDtxEnc->frame_ener; + } + } + else + { + /* If SID frame was sent, update long-term energy */ + hDtxEnc->lt_ener_last_SID = hDtxEnc->lt_ener_noise; + } + + hDtxEnc->cnt_SID++; + + if ( hDtxEnc->var_SID_rate_flag ) + { + if ( Opt_AMR_WB && hDtxEnc->max_SID == 3 && hDtxEnc->cnt_SID == 3 ) + { + /* set the size of CNG history buffer for averaging to 3 frames */ + hDtxEnc->cng_hist_size = 3; + } + else if ( hDtxEnc->max_SID != 3 && hDtxEnc->cnt_SID == DTX_HIST_SIZE ) + { + /* set the size of CNG history buffer for averaging to DTX_HIST_SIZE frames */ + /* be sure that DTX_HIST_SIZE >= INT_L */ + hDtxEnc->cng_hist_size = DTX_HIST_SIZE; + } + } + + if ( !hDtxEnc->var_SID_rate_flag && hDtxEnc->interval_SID > 1 ) + { + /* set the size of CNG history buffer for averaging to interval_SID frames */ + hDtxEnc->cng_hist_size = hDtxEnc->interval_SID; + if ( hDtxEnc->cng_hist_size > DTX_HIST_SIZE ) + { + hDtxEnc->cng_hist_size = DTX_HIST_SIZE; + } + } + + if ( hDtxEnc->cnt_SID >= hDtxEnc->max_SID ) + { + /* adaptive SID update interval */ + hDtxEnc->max_SID = hDtxEnc->interval_SID; + hDtxEnc->cnt_SID = 0; + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * dtx_hangover_control() + * + * + *-------------------------------------------------------------------*/ + +void dtx_hangover_control( + Encoder_State *st, /* i/o: encoder state structure */ + const float lsp_new[M] /* i : current frame LSPs */ +) +{ + int16_t ptr; + int16_t i, j, m; + float tmp_lsp[max( DTX_HIST_SIZE, HO_HIST_SIZE ) * M]; + float tmp_enr[max( DTX_HIST_SIZE, HO_HIST_SIZE )]; + float tmp[max( DTX_HIST_SIZE, HO_HIST_SIZE ) * M]; + float enr_new; + float weights; + float enr_est, lsp_est[M]; + float Dlsp, Denr; + float lsf_tmp[M]; + float C[M]; + float max_val[2]; + int16_t max_idx[2]; + float ftmp; + float Dlsp_n2e, Denr_n2e; + + TD_CNG_ENC_HANDLE hTdCngEnc = st->hTdCngEnc; + + /* get current frame exc energy in log2 */ + enr_new = (float) ( log10( hTdCngEnc->ho_ener_circ[hTdCngEnc->ho_circ_ptr] ) / log10( 2.0f ) ); + + if ( enr_new < 0.0f ) + { + enr_new = 0.0f; + } + + /* get energies and lsps of hangover frames */ + ptr = hTdCngEnc->ho_circ_ptr - ( hTdCngEnc->burst_ho_cnt - 1 ); + if ( ptr < 0 ) + { + ptr += hTdCngEnc->ho_circ_size; + } + + for ( i = 0; i < hTdCngEnc->burst_ho_cnt - 1; i++ ) + { + mvr2r( &( hTdCngEnc->ho_lsp_circ[ptr * M] ), &( tmp_lsp[i * M] ), M ); + tmp_enr[i] = hTdCngEnc->ho_ener_circ[ptr]; + + ptr++; + if ( ptr == hTdCngEnc->ho_circ_size ) + { + ptr = 0; + } + } + + /* get estimated CNG energy and lsps assuming terminate hangover at current frame */ + ptr = hTdCngEnc->burst_ho_cnt - 2; + enr_est = W_DTX_HO[0] * tmp_enr[ptr]; + weights = W_DTX_HO[0]; + mvr2r( &( tmp_lsp[ptr * M] ), tmp, M ); + m = 1; + + for ( i = 1; i < hTdCngEnc->burst_ho_cnt - 2; i++ ) + { + if ( tmp_enr[ptr - i] < tmp_enr[ptr] * BUF_H_NRG && tmp_enr[ptr - i] > tmp_enr[ptr] * BUF_L_NRG ) + { + enr_est += W_DTX_HO[i] * tmp_enr[ptr - i]; + weights += W_DTX_HO[i]; + mvr2r( &tmp_lsp[( ptr - i ) * M], &tmp[m * M], M ); + m++; + } + } + + enr_est /= weights; + + if ( enr_est < 1.0f ) + { + enr_est = 1.0f; + } + + Denr_n2e = (float) fabs( enr_new - log10( enr_est ) / log10( 2.0f ) ); + + if ( m < 3 ) + { + enr_est = 0.8f * enr_est + ( 1 - 0.8f ) * hTdCngEnc->ho_ener_circ[hTdCngEnc->ho_circ_ptr]; + } + else + { + enr_est = 0.95f * enr_est + ( 1 - 0.95f ) * hTdCngEnc->ho_ener_circ[hTdCngEnc->ho_circ_ptr]; + } + + enr_est = (float) ( log10( enr_est ) / log10( 2.0f ) ); + + if ( enr_est < 0.0f ) + { + enr_est = 0.0f; + } + + set_f( max_val, 0.0f, 2 ); + set_s( max_idx, 0, 2 ); + + for ( i = 0; i < m; i++ ) + { + if ( st->L_frame == L_FRAME ) + { + lsp2lsf( &tmp[i * M], lsf_tmp, M, INT_FS_12k8 ); + ftmp = 6400.0f / ( M + 1 ); + C[i] = ( 6400.0f - lsf_tmp[M - 1] - ftmp ) * ( 6400.0f - lsf_tmp[M - 1] - ftmp ); + } + else + { + lsp2lsf( &tmp[i * M], lsf_tmp, M, INT_FS_16k ); + ftmp = 8000.0f / ( M + 1 ); + C[i] = ( 8000.0f - lsf_tmp[M - 1] - ftmp ) * ( 8000.0f - lsf_tmp[M - 1] - ftmp ); + } + + C[i] += ( lsf_tmp[0] - ftmp ) * ( lsf_tmp[0] - ftmp ); + for ( j = 0; j < M - 1; j++ ) + { + C[i] += ( lsf_tmp[j + 1] - lsf_tmp[j] - ftmp ) * ( lsf_tmp[j + 1] - lsf_tmp[j] - ftmp ); + } + + C[i] *= 0.0588235f; /* 0.0588235f = 1/(M+1) */ + + if ( C[i] > max_val[0] ) + { + max_val[1] = max_val[0]; + max_idx[1] = max_idx[0]; + max_val[0] = C[i]; + max_idx[0] = i; + } + else if ( C[i] > max_val[1] ) + { + max_val[1] = C[i]; + max_idx[1] = i; + } + } + + if ( m == 1 ) + { + mvr2r( tmp, lsp_est, M ); + } + else if ( m < 4 ) + { + for ( i = 0; i < M; i++ ) + { + lsp_est[i] = 0.0f; + for ( j = 0; j < m; j++ ) + { + lsp_est[i] += tmp[j * M + i]; + } + + lsp_est[i] -= tmp[max_idx[0] * M + i]; + lsp_est[i] /= (float) ( m - 1 ); + } + } + else + { + for ( i = 0; i < M; i++ ) + { + lsp_est[i] = 0.0f; + for ( j = 0; j < m; j++ ) + { + lsp_est[i] += tmp[j * M + i]; + } + + lsp_est[i] -= ( tmp[max_idx[0] * M + i] + tmp[max_idx[1] * M + i] ); + lsp_est[i] /= (float) ( m - 2 ); + } + } + + Dlsp_n2e = 0.0f; + for ( i = 0; i < M; i++ ) + { + Dlsp_n2e += (float) fabs( lsp_new[i] - lsp_est[i] ); + lsp_est[i] = 0.8f * lsp_est[i] + ( 1 - 0.8f ) * lsp_new[i]; + } + + /* get deviation of CNG parameters between newly estimated and current state memory */ + Dlsp = 0.0f; + max_val[0] = 0.0f; + + for ( i = 0; i < M; i++ ) + { + Dlsp += (float) fabs( st->hDtxEnc->lspCNG[i] - lsp_est[i] ); + if ( fabs( st->hDtxEnc->lspCNG[i] - lsp_est[i] ) > max_val[0] ) + { + max_val[0] = (float) fabs( st->hDtxEnc->lspCNG[i] - lsp_est[i] ); + } + } + Denr = (float) fabs( ( log10( hTdCngEnc->lp_ener + 0.1f ) / log10( 2.0f ) ) - enr_est ); + + /* make decision if DTX hangover can be terminated */ + st->hVAD->hangover_terminate_flag = 0; + + if ( ( Dlsp < 0.4f && Denr < 1.4f && max_val[0] < 0.1f && Dlsp_n2e < 0.4f && Denr_n2e < 1.2f && st->Opt_SC_VBR ) || + ( Dlsp < 0.4f && Denr < 0.8f && max_val[0] < 0.1f && Dlsp_n2e < 0.4f && Denr_n2e < 0.8f && !st->Opt_SC_VBR ) ) + { + st->hVAD->hangover_terminate_flag = 1; + } + + return; +} + + +/*-------------------------------------------------------------------* + * td_cng_enc_init() + * + * + *-------------------------------------------------------------------*/ + +void td_cng_enc_init( + TD_CNG_ENC_HANDLE hTdCngEnc, /* i/o: DTX/TD CNG data handle */ + const int16_t Opt_DTX_ON, /* i : flag indicating DTX operation */ + const int16_t max_bwidth /* i : maximum encoded bandwidth */ +) +{ + + hTdCngEnc->cng_seed = RANDOM_INITSEED; + hTdCngEnc->cng_ener_seed = RANDOM_INITSEED; + hTdCngEnc->cng_ener_seed1 = RANDOM_INITSEED; + hTdCngEnc->lp_ener = 0.0f; + hTdCngEnc->old_enr_index = -1; + hTdCngEnc->Enew = 0.0f; + + hTdCngEnc->lp_sp_enr = 0.0f; + hTdCngEnc->last_allow_cn_step = 0; + + hTdCngEnc->CNG_att = 0.0f; + + if ( Opt_DTX_ON ) + { + hTdCngEnc->cng_hist_ptr = -1; + set_f( hTdCngEnc->cng_lsp_hist, 0, DTX_HIST_SIZE * M ); + set_f( hTdCngEnc->cng_ener_hist, 0, DTX_HIST_SIZE ); + hTdCngEnc->ho_hist_ptr = -1; + hTdCngEnc->ho_sid_bw = 0; + set_f( hTdCngEnc->ho_lsp_hist, 0, HO_HIST_SIZE * M ); + set_f( hTdCngEnc->ho_ener_hist, 0, HO_HIST_SIZE ); + set_f( hTdCngEnc->ho_env_hist, 0, HO_HIST_SIZE * NUM_ENV_CNG ); + hTdCngEnc->ho_hist_size = 0; + hTdCngEnc->act_cnt = 0; + } + + set_s( hTdCngEnc->ho_16k_lsp, 0, HO_HIST_SIZE ); + hTdCngEnc->act_cnt2 = 0; + hTdCngEnc->num_ho = 0; + + hTdCngEnc->ho_circ_ptr = -1; + set_f( hTdCngEnc->ho_lsp_circ, 0, HO_HIST_SIZE * M ); + set_f( hTdCngEnc->ho_ener_circ, 0, HO_HIST_SIZE ); + set_f( hTdCngEnc->ho_env_circ, 0, HO_HIST_SIZE * NUM_ENV_CNG ); + hTdCngEnc->ho_circ_size = 0; + hTdCngEnc->burst_ho_cnt = 0; + hTdCngEnc->cng_buf_cnt = 0; + + + set_f( hTdCngEnc->lp_env, 0.0f, 20 ); + set_f( hTdCngEnc->cng_res_env, 0.0f, 20 * 8 ); + set_f( hTdCngEnc->exc_mem, 0.0f, 24 ); + set_f( hTdCngEnc->exc_mem1, 0.0f, 30 ); + set_f( hTdCngEnc->exc_mem2, 0.0f, 30 ); + set_f( hTdCngEnc->old_env, 0.0f, NUM_ENV_CNG ); + + /* SWB CNG/DTX */ + hTdCngEnc->last_wb_cng_ener = -6.02f; + hTdCngEnc->last_shb_cng_ener = -6.02f; + hTdCngEnc->mov_wb_cng_ener = -6.02f; + hTdCngEnc->mov_shb_cng_ener = -6.02f; + hTdCngEnc->shb_cng_ini_cnt = 1; + hTdCngEnc->shb_NO_DATA_cnt = 0; + hTdCngEnc->last_SID_bwidth = min( max_bwidth, SWB ); + hTdCngEnc->last_vad = 0; + hTdCngEnc->last_idx_ener = 0; + + return; +} + + +/*-------------------------------------------------------------------* + * dtx_enc_init() + * + * Initialize DTX parameters + *-------------------------------------------------------------------*/ + +void dtx_enc_init( + Encoder_State *st, /* i : Encoder state handle */ + const int16_t var_SID_rate_flag, /* i : flag for variable SID update rate */ + const int16_t interval_SID /* i : interval for SID update */ +) +{ + DTX_ENC_HANDLE hDtxEnc; + hDtxEnc = st->hDtxEnc; + + hDtxEnc->first_CNG = 0; + hDtxEnc->cnt_SID = 0; + hDtxEnc->max_SID = 2; + hDtxEnc->CNG_mode = -1; + mvr2r( st->lsp_old1, hDtxEnc->lspCNG, M ); + hDtxEnc->VarDTX_cnt_voiced = 0; + hDtxEnc->VarDTX_cnt_noise = 0; + hDtxEnc->lt_ener_voiced = 0.0f; + hDtxEnc->lt_ener_noise = 0.0f; + hDtxEnc->frame_ener = 0.0f; + hDtxEnc->lt_ener_last_SID = 0.0f; + hDtxEnc->last_CNG_L_frame = L_FRAME; + hDtxEnc->var_SID_rate_flag = var_SID_rate_flag; + hDtxEnc->last_active_brate = ACELP_7k20; + hDtxEnc->cng_cnt = 0; + + if ( hDtxEnc->var_SID_rate_flag ) + { + hDtxEnc->interval_SID = 12; + hDtxEnc->cng_hist_size = DTX_HIST_SIZE; + } + else + { + hDtxEnc->interval_SID = interval_SID; + if ( hDtxEnc->interval_SID >= DTX_HIST_SIZE ) + { + hDtxEnc->cng_hist_size = hDtxEnc->interval_SID; + } + } + + return; +} diff --git a/lib_enc/enc_acelp.c b/lib_enc/enc_acelp.c new file mode 100644 index 0000000000000000000000000000000000000000..8e034e1c7f785a3dedec18f0cd7ee3c8dd596de7 --- /dev/null +++ b/lib_enc/enc_acelp.c @@ -0,0 +1,1517 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include "options.h" +#include +#include "prot.h" +#include "rom_com.h" +#include "rom_enc.h" +#include "wmc_auto.h" + + +/*---------------------------------------------------------------------* + * Local function prototypes + *---------------------------------------------------------------------*/ + +static void E_ACELP_codearithp( const float v[], uint32_t *n, uint32_t *ps, int16_t *p, const int16_t trackstep, const int16_t tracklen ); + + +/*---------------------------------------------------------------------* + * Local constants + *---------------------------------------------------------------------*/ + +#define NB_MAX 8 + +/* + * E_ACELP_h_vec_corrx + * + * Parameters: + * h I: scaled impulse response + * vec I: vector to correlate with h[] + * track I: track to use + * sign I: sign vector + * rrixix I: correlation of h[x] with h[x] + * cor O: result of correlation (16 elements) + * + * Function: + * Calculate the correlations of h[] with vec[] for the specified track + * + * Returns: + * void + */ +static void acelp_h_vec_corr1( + float h[], + float vec[], + int16_t track, + float sign[], + float ( *rrixix )[16], + float cor[], + int16_t dn2_pos[], + int16_t nb_pulse ) +{ + int16_t i, j; + int16_t dn; + int16_t *dn2; + float *p0; + float s; + + dn2 = &dn2_pos[track * 8]; + p0 = rrixix[track]; + for ( i = 0; i < nb_pulse; i++ ) + { + dn = dn2[i]; + s = 0.0F; + /* L_SUBFR-dn */ + /* vec[dn] */ + for ( j = 0; j < ( L_SUBFR - dn ); j++ ) + { + s += h[j] * vec[dn + j]; + } + + cor[dn >> 2] = sign[dn] * s + p0[dn >> 2]; + } + + return; +} + + +static void acelp_h_vec_corr2( + float h[], + float vec[], + int16_t track, + float sign[], + float ( *rrixix )[16], + float cor[] ) +{ + int16_t i, j; + float *p0; + float s; + + p0 = rrixix[track]; + /* sign[track] */ + for ( i = 0; i < 16; i++ ) + { + s = 0.0F; + /* h[0], vec[track] */ + /* L_SUBFR-track */ + for ( j = 0; j < L_SUBFR - track; j++ ) + { + s += h[j] * vec[track + j]; + } + + cor[i] = s * sign[track] + p0[i]; + track += 4; + } + return; +} + + +/* + * acelp_2pulse_search + * + * Parameters: + * nb_pos_ix I: nb of pos for pulse 1 (1..8) + * track_x I: track of pulse 1 + * track_y I: track of pulse 2 + * ps I/O: correlation of all fixed pulses + * alp I/O: energy of all fixed pulses + * ix O: position of pulse 1 + * iy O: position of pulse 2 + * dn I: corr. between target and h[] + * dn2 I: vector of selected positions + * cor_x I: corr. of pulse 1 with fixed pulses + * cor_y I: corr. of pulse 2 with fixed pulses + * rrixiy I: corr. of pulse 1 with pulse 2 + * + * Function: + * Find the best positions of 2 pulses in a subframe + * + * Returns: + * void + */ +static void acelp_2pulse_search( + int16_t nb_pos_ix, + int16_t track_x, + int16_t track_y, + float *ps, + float *alp, + int16_t *ix, + int16_t *iy, + float dn[], + int16_t *dn2, + float cor_x[], + float cor_y[], + float ( *rrixiy )[256] ) +{ + int16_t x, x2, y, x_save = 0, y_save = 0, i, *pos_x; + float ps0, alp0; + float ps1, ps2, sq, sqk; + float alp1, alp2, alpk; + float *p1, *p2; + float s; + + /* x_save=y_save=0 */ + /* eight dn2 max positions per track */ + pos_x = &dn2[track_x << 3]; + /* save these to limit memory searches */ + ps0 = *ps; + alp0 = *alp; + + alpk = 1.0F; + sqk = -1.0F; + x2 = pos_x[0] >> 2; + if ( ( alp0 + cor_x[x2] + cor_y[0] + rrixiy[track_x][x2 << 4] ) < 0 ) + { + sqk = 1.0F; + } + + /* loop track 1 */ + for ( i = 0; i < nb_pos_ix; i++ ) + { + x = pos_x[i]; + x2 = x >> 2; + /* dn[x] has only nb_pos_ix positions saved */ + ps1 = ps0 + dn[x]; + alp1 = alp0 + cor_x[x2]; + p1 = cor_y; + p2 = &rrixiy[track_x][x2 << 4]; + for ( y = track_y; y < L_SUBFR; y += 4 ) + { + ps2 = ps1 + dn[y]; + alp2 = alp1 + ( *p1++ ) + ( *p2++ ); + + sq = ps2 * ps2; + + s = ( alpk * sq ) - ( sqk * alp2 ); + + if ( s > 0.0F ) + { + sqk = sq; + alpk = alp2; + y_save = y; + x_save = x; + } + } + } + + *ps = ps0 + dn[x_save] + dn[y_save]; + *alp = alpk; + *ix = x_save; + *iy = y_save; + + return; +} + + +/* + * E_ACELP_1pulse_search + * + * Parameters: + * track_x I: track of pulse 1 + * track_y I: track of pulse 2 + * ps I/O: correlation of all fixed pulses + * alp I/O: energy of all fixed pulses + * ix O: position of pulse 1 + * dn I: corr. between target and h[] + * cor_x I: corr. of pulse 1 with fixed pulses + * cor_y I: corr. of pulse 2 with fixed pulses + * + * Function: + * Find the best positions of 1 pulse in a subframe + * + * Returns: + * void + */ +static void E_ACELP_1pulse_search( + int16_t track_x, + int16_t track_y, + float *ps, + float *alp, + int16_t *ix, + float dn[], + float cor_x[], + float cor_y[] ) +{ + int16_t x, x_save = 0; + float ps0, alp0; + float ps1, sq, sqk; + float alp1, alpk; + float s; + + /* save these to limit memory searches */ + ps0 = *ps; + alp0 = *alp; + alpk = 1.0F; + sqk = -1.0F; + + if ( ( alp0 + cor_x[( track_x >> 2 )] ) < 0 ) + { + sqk = 1.0F; + } + for ( x = track_x; x < L_SUBFR; x += 4 ) + { + ps1 = ps0 + dn[x]; + alp1 = alp0 + cor_x[x >> 2]; + sq = ps1 * ps1; + s = ( alpk * sq ) - ( sqk * alp1 ); + + if ( s > 0.0F ) + { + sqk = sq; + alpk = alp1; + x_save = x; + } + } + if ( track_y != track_x ) + { + for ( x = track_y; x < L_SUBFR; x += 4 ) + { + ps1 = ps0 + dn[x]; + alp1 = alp0 + cor_y[x >> 2]; + sq = ps1 * ps1; + s = ( alpk * sq ) - ( sqk * alp1 ); + + if ( s > 0.0F ) + { + sqk = sq; + alpk = alp1; + x_save = x; + } + } + } + + *ps = ps0 + dn[x_save]; + *alp = alpk; + *ix = x_save; + + return; +} + + +/* + * acelp_pulsesign + * + * Parameters: + * cn I: residual after int32_t term prediction + * dn I: corr. between target and h[]. + * dn2 O: dn2[] = mix of dn[] and cn[] + * sign O: sign of pulse + * vec O: negative sign of pulse + * + * Function: + * Determine sign of each pulse position, store them in "sign" + * and change dn to all positive. + * Subframe size = L_SUBFR + * Returns: + * void + */ +void acelp_pulsesign( + const float cn[], + float dn[], + float dn2[], + float sign[], + float vec[], + const float alp ) +{ + int16_t i; + float val; + float s, cor; + + /* calculate energy for normalization of cn[] and dn[] */ + val = ( cn[0] * cn[0] ) + 1.0F; + cor = ( dn[0] * dn[0] ) + 1.0F; + for ( i = 1; i < L_SUBFR; i++ ) + { + val += ( cn[i] * cn[i] ); + cor += ( dn[i] * dn[i] ); + } + + s = (float) sqrt( cor / val ); + for ( i = 0; i < L_SUBFR; i++ ) + { + cor = ( s * cn[i] ) + ( alp * dn[i] ); + if ( cor >= 0.0F ) + { + sign[i] = 1.0F; + vec[i] = -1.0F; + dn2[i] = cor; /* dn2[] = mix of dn[] and cn[] */ + } + else + { + sign[i] = -1.0F; + vec[i] = 1.0F; + dn[i] = -dn[i]; /* modify dn[] according to the fixed sign */ + dn2[i] = -cor; /* dn2[] = mix of dn[] and cn[] */ + } + } + + return; +} + + +void acelp_findcandidates( + float dn2[], + int16_t dn2_pos[], + int16_t pos_max[], + const int16_t L_subfr, + const int16_t tracks ) +{ + int16_t i, k, j; + float *ps_ptr; + + /* &pos_max[0], &dn2_pos[0] */ + for ( i = 0; i < tracks; i++ ) + { + for ( k = 0; k < NB_MAX; k++ ) + { + ps_ptr = &dn2[i]; + for ( j = i + tracks; j < L_subfr; j += tracks ) + { + if ( dn2[j] > *ps_ptr ) + { + ps_ptr = &dn2[j]; + } + } + *ps_ptr = (float) k - NB_MAX; /* dn2 < 0 when position is selected */ + dn2_pos[i * 8 + k] = (int16_t) ( ps_ptr - dn2 ); + } + pos_max[i] = dn2_pos[i * 8]; + } + + return; +} + + +static void acelp_hbuf( + float *h_buf, + float **h, + float **h_inv, + const float *H ) +{ + int16_t i; + + *h = h_buf + L_SUBFR; + *h_inv = h_buf + ( 3 * L_SUBFR ); + for ( i = 0; i < L_SUBFR; i++ ) + { + ( *h )[-1 - i] = 0.0f; + ( *h_inv )[-1 - i] = 0.0f; + ( *h )[i] = H[i]; + ( *h_inv )[i] = -H[i]; + } + + return; +} + + +static void E_ACELP_corrmatrix( + float h[], + float sign[], + float vec[], + float rrixix[4][16], + float rrixiy[4][256] ) +{ + float *p0, *p1, *p2, *p3, *psign0, *psign1, *psign2, *psign3; + float *ptr_h1, *ptr_h2, *ptr_hf; + float cor; + int16_t i, k, pos; + + /* Compute rrixix[][] needed for the codebook search. */ + /* storage order --> i3i3, i2i2, i1i1, i0i0 */ + + /* Init pointers to last position of rrixix[] */ + p0 = &rrixix[0][16 - 1]; + p1 = &rrixix[1][16 - 1]; + p2 = &rrixix[2][16 - 1]; + p3 = &rrixix[3][16 - 1]; + + ptr_h1 = h; + cor = 0.0F; + for ( i = 0; i < 16; i++ ) + { + cor += ( *ptr_h1 ) * ( *ptr_h1 ); + ptr_h1++; + *p3-- = cor * 0.5F; + cor += ( *ptr_h1 ) * ( *ptr_h1 ); + ptr_h1++; + *p2-- = cor * 0.5F; + cor += ( *ptr_h1 ) * ( *ptr_h1 ); + ptr_h1++; + *p1-- = cor * 0.5F; + cor += ( *ptr_h1 ) * ( *ptr_h1 ); + ptr_h1++; + *p0-- = cor * 0.5F; + } + + /* Compute rrixiy[][] needed for the codebook search. */ + /* storage order --> i2i3, i1i2, i0i1, i3i0 */ + + pos = 256 - 1; + ptr_hf = h + 1; + for ( k = 0; k < 16; k++ ) + { + + p3 = &rrixiy[2][pos]; + p2 = &rrixiy[1][pos]; + p1 = &rrixiy[0][pos]; + p0 = &rrixiy[3][pos - 16]; + + cor = 0.0F; + ptr_h1 = h; + ptr_h2 = ptr_hf; + for ( i = k; i < 15; i++ ) + { + cor += ( *ptr_h1 ) * ( *ptr_h2 ); + ptr_h1++; + ptr_h2++; + *p3 = cor; + cor += ( *ptr_h1 ) * ( *ptr_h2 ); + ptr_h1++; + ptr_h2++; + *p2 = cor; + cor += ( *ptr_h1 ) * ( *ptr_h2 ); + ptr_h1++; + ptr_h2++; + *p1 = cor; + cor += ( *ptr_h1 ) * ( *ptr_h2 ); + ptr_h1++; + ptr_h2++; + *p0 = cor; + + p3 -= ( 16 + 1 ); + p2 -= ( 16 + 1 ); + p1 -= ( 16 + 1 ); + p0 -= ( 16 + 1 ); + } + + cor += ( *ptr_h1 ) * ( *ptr_h2 ); + ptr_h1++; + ptr_h2++; + *p3 = cor; + cor += ( *ptr_h1 ) * ( *ptr_h2 ); + ptr_h1++; + ptr_h2++; + *p2 = cor; + cor += ( *ptr_h1 ) * ( *ptr_h2 ); + ptr_h1++; + ptr_h2++; + *p1 = cor; + + pos -= 16; + ptr_hf += 4; + } + + /* storage order --> i3i0, i2i3, i1i2, i0i1 */ + + pos = 256 - 1; + ptr_hf = h + 3; + for ( k = 0; k < 16; k++ ) + { + + p3 = &rrixiy[3][pos]; + p2 = &rrixiy[2][pos - 1]; + p1 = &rrixiy[1][pos - 1]; + p0 = &rrixiy[0][pos - 1]; + + cor = 0.0F; + ptr_h1 = h; + ptr_h2 = ptr_hf; + for ( i = k + 1; i < 16; i++ ) + { + cor += ( *ptr_h1 ) * ( *ptr_h2 ); + ptr_h1++; + ptr_h2++; + *p3 = cor; + cor += ( *ptr_h1 ) * ( *ptr_h2 ); + ptr_h1++; + ptr_h2++; + *p2 = cor; + cor += ( *ptr_h1 ) * ( *ptr_h2 ); + ptr_h1++; + ptr_h2++; + *p1 = cor; + cor += ( *ptr_h1 ) * ( *ptr_h2 ); + ptr_h1++; + ptr_h2++; + *p0 = cor; + + p3 -= ( 16 + 1 ); + p2 -= ( 16 + 1 ); + p1 -= ( 16 + 1 ); + p0 -= ( 16 + 1 ); + } + + cor += ( *ptr_h1 ) * ( *ptr_h2 ); + *p3 = cor; + + pos--; + ptr_hf += 4; + } + + /* Modification of rrixiy[][] to take signs into account. */ + + p0 = &rrixiy[0][0]; + /* speed-up: 11% */ + p1 = &rrixiy[1][0]; + p2 = &rrixiy[2][0]; + p3 = &rrixiy[3][0]; + for ( i = 0; i < L_SUBFR; i += 4 ) + { + if ( sign[i + 0] < 0.0F ) + psign0 = &vec[1]; + else + psign0 = &sign[1]; + if ( sign[i + 1] < 0.0F ) + psign1 = &vec[2]; + else + psign1 = &sign[2]; + if ( sign[i + 2] < 0.0F ) + psign2 = &vec[3]; + else + psign2 = &sign[3]; + if ( sign[i + 3] < 0.0F ) + psign3 = &vec[0]; + else + psign3 = &sign[0]; + p0[0] = p0[0] * psign0[0]; + p0[1] = p0[1] * psign0[4]; + p0[2] = p0[2] * psign0[8]; + p0[3] = p0[3] * psign0[12]; + p0[4] = p0[4] * psign0[16]; + p0[5] = p0[5] * psign0[20]; + p0[6] = p0[6] * psign0[24]; + p0[7] = p0[7] * psign0[28]; + p0[8] = p0[8] * psign0[32]; + p0[9] = p0[9] * psign0[36]; + p0[10] = p0[10] * psign0[40]; + p0[11] = p0[11] * psign0[44]; + p0[12] = p0[12] * psign0[48]; + p0[13] = p0[13] * psign0[52]; + p0[14] = p0[14] * psign0[56]; + p0[15] = p0[15] * psign0[60]; + p0 += 16; + + p1[0] = p1[0] * psign1[0]; + p1[1] = p1[1] * psign1[4]; + p1[2] = p1[2] * psign1[8]; + p1[3] = p1[3] * psign1[12]; + p1[4] = p1[4] * psign1[16]; + p1[5] = p1[5] * psign1[20]; + p1[6] = p1[6] * psign1[24]; + p1[7] = p1[7] * psign1[28]; + p1[8] = p1[8] * psign1[32]; + p1[9] = p1[9] * psign1[36]; + p1[10] = p1[10] * psign1[40]; + p1[11] = p1[11] * psign1[44]; + p1[12] = p1[12] * psign1[48]; + p1[13] = p1[13] * psign1[52]; + p1[14] = p1[14] * psign1[56]; + p1[15] = p1[15] * psign1[60]; + p1 += 16; + + p2[0] = p2[0] * psign2[0]; + p2[1] = p2[1] * psign2[4]; + p2[2] = p2[2] * psign2[8]; + p2[3] = p2[3] * psign2[12]; + p2[4] = p2[4] * psign2[16]; + p2[5] = p2[5] * psign2[20]; + p2[6] = p2[6] * psign2[24]; + p2[7] = p2[7] * psign2[28]; + p2[8] = p2[8] * psign2[32]; + p2[9] = p2[9] * psign2[36]; + p2[10] = p2[10] * psign2[40]; + p2[11] = p2[11] * psign2[44]; + p2[12] = p2[12] * psign2[48]; + p2[13] = p2[13] * psign2[52]; + p2[14] = p2[14] * psign2[56]; + p2[15] = p2[15] * psign2[60]; + p2 += 16; + + p3[0] = p3[0] * psign3[0]; + p3[1] = p3[1] * psign3[4]; + p3[2] = p3[2] * psign3[8]; + p3[3] = p3[3] * psign3[12]; + p3[4] = p3[4] * psign3[16]; + p3[5] = p3[5] * psign3[20]; + p3[6] = p3[6] * psign3[24]; + p3[7] = p3[7] * psign3[28]; + p3[8] = p3[8] * psign3[32]; + p3[9] = p3[9] * psign3[36]; + p3[10] = p3[10] * psign3[40]; + p3[11] = p3[11] * psign3[44]; + p3[12] = p3[12] * psign3[48]; + p3[13] = p3[13] * psign3[52]; + p3[14] = p3[14] * psign3[56]; + p3[15] = p3[15] * psign3[60]; + p3 += 16; + } + + return; +} + +void E_ACELP_4tsearch( + float dn[], + const float cn[], + const float H[], + float code[], + PulseConfig *config, + int16_t ind[], + float y[] ) +{ + float sign[L_SUBFR], vec[L_SUBFR]; + float cor_x[16], cor_y[16], h_buf[4 * L_SUBFR]; + float rrixix[4][16]; + float rrixiy[4][256]; + float dn2[L_SUBFR]; + float psk, ps, alpk, alp = 0.0F; + int16_t codvec[NB_PULSE_MAX]; + int16_t pos_max[4]; + int16_t dn2_pos[8 * 4]; + int16_t ipos[NB_PULSE_MAX]; + float *p0, *p1, *p2, *p3; + float *h, *h_inv; + int16_t i, j, k, l, st, pos = 0, track; + int16_t index, iPulse; + float val; + float s; + int16_t restpulses; + + alp = config->alp; /* initial value for energy of all fixed pulses */ + + for ( k = 0; k < config->nb_pulse; k++ ) + { + codvec[k] = 0; + } + + /* Find sign for each pulse position. */ + acelp_pulsesign( cn, dn, dn2, sign, vec, alp ); + + /* Select the most important 8 position per track according to dn2[]. */ + acelp_findcandidates( dn2, dn2_pos, pos_max, L_SUBFR, NB_TRACK_FCB_4T ); + + /* Compute h_inv[i]. */ + acelp_hbuf( h_buf, &h, &h_inv, H ); + + /* Compute correlation matrices needed for the codebook search. */ + E_ACELP_corrmatrix( h, sign, vec, rrixix, rrixiy ); + + /* + * Deep first search: + * ------------------ + * 20 bits (4p): 4 iter x ((4x16)+(8x16)) = 768 tests + * 36 bits (8p): 4 iter x ((1x1)+(4x16)+(8x16)+(8x16)) = 1280 tests + * 52 bits (12p): 3 iter x ((1x1)+(1x1)+(4x16)+(6x16) + * +(8x16)+(8x16)) = 1248 tests + * 64 bits (16p): 2 iter x ((1x1)+(1x1)+(4x16)+(6x16) + * +(6x16)+(8x16)+(8x16)+(8x16)) = 1280 tests + */ + psk = -1.0; + alpk = 1.0; + /*Number of iterations*/ + for ( k = 0; k < config->nbiter; k++ ) + { + /* copy search order from hash-table */ + for ( l = 0; l < config->nb_pulse; l++ ) + { + ipos[l] = tipos[( k * 4 ) + l]; + } + + /* if all tracks do not have equal number of pulses */ + restpulses = config->nb_pulse & 3; + if ( restpulses ) + { + switch ( config->codetrackpos ) + { + case TRACKPOS_FIXED_FIRST: /* fixed track positions, starting from left */ + /* add tracks from left */ + for ( iPulse = 0; iPulse < restpulses; iPulse++ ) + { + ipos[config->nb_pulse - restpulses + iPulse] = iPulse; + } + /* Put the same track on the next position, because the 1-pulse search + * will access it to determine if this could be in any track. */ + ipos[config->nb_pulse] = ipos[config->nb_pulse - 1]; + break; + case TRACKPOS_FIXED_EVEN: /* fixed track positions, odd tracks */ + /* odd tracks, switch order for every iteration */ + ipos[config->nb_pulse - restpulses] = ( k << 1 ) & 2; /* 0 for even k, 2 for odd*/ + ipos[config->nb_pulse - restpulses + 1] = ipos[config->nb_pulse - restpulses] ^ 2; /* 2 for even k, 0 for odd*/ + break; + case TRACKPOS_FIXED_TWO: /* two tracks instead of four */ + /* Put the next track on the next position, because the 1-pulse search + * will access it to determine if this could be in any track. */ + ipos[config->nb_pulse] = ( ipos[config->nb_pulse - 1] + 1 ) & 3; + break; + default: /* one or three free track positions */ + /* copy an extra position from table - 1pulse search will access this */ + ipos[config->nb_pulse] = tipos[( k * 4 ) + config->nb_pulse]; + break; + } + } + if ( config->fixedpulses == 0 ) /* 1100, 11, 1110, 1111, 2211 */ + { + pos = 0; + ps = 0.0F; + alp = 0.0F; + for ( i = 0; i < L_SUBFR; i++ ) + { + vec[i] = 0; + } + } + else if ( config->fixedpulses == 2 ) /* 2222 and 3322 */ + { + /* first stage: fix 2 pulses */ + pos = 2; + + ind[0] = pos_max[ipos[0]]; + ind[1] = pos_max[ipos[1]]; + ps = dn[ind[0]] + dn[ind[1]]; + + /*ind[1]>>2 and ind[0]>>2 and save*/ + /* ipos[1] and ipos[0] and save*/ + alp = rrixix[ipos[0]][ind[0] >> 2] + rrixix[ipos[1]][ind[1] >> 2] + + rrixiy[ipos[0]][( ( ind[0] >> 2 ) << 4 ) + ( ind[1] >> 2 )]; + + if ( sign[ind[0]] < 0.0 ) + { + p0 = h_inv - ind[0]; + } + else + { + p0 = h - ind[0]; + } + if ( sign[ind[1]] < 0.0 ) + { + p1 = h_inv - ind[1]; + } + else + { + p1 = h - ind[1]; + } + /*ptx = &vec p1 and p0 already initialize*/ + vec[0] = p0[0] + p1[0]; + vec[1] = p0[1] + p1[1]; + vec[2] = p0[2] + p1[2]; + vec[3] = p0[3] + p1[3]; + for ( i = 4; i < L_SUBFR; i += 6 ) + { + vec[i] = p0[i] + p1[i]; + vec[i + 1] = p0[i + 1] + p1[i + 1]; + vec[i + 2] = p0[i + 2] + p1[i + 2]; + vec[i + 3] = p0[i + 3] + p1[i + 3]; + vec[i + 4] = p0[i + 4] + p1[i + 4]; + vec[i + 5] = p0[i + 5] + p1[i + 5]; + } + } + else /* 3333 and above */ + { + /* first stage: fix 4 pulses */ + pos = 4; + + ind[0] = pos_max[ipos[0]]; + ind[1] = pos_max[ipos[1]]; + ind[2] = pos_max[ipos[2]]; + ind[3] = pos_max[ipos[3]]; + ps = dn[ind[0]] + dn[ind[1]] + dn[ind[2]] + dn[ind[3]]; + + p0 = h - ind[0]; + if ( sign[ind[0]] < 0.0 ) + { + p0 = h_inv - ind[0]; + } + + p1 = h - ind[1]; + if ( sign[ind[1]] < 0.0 ) + { + p1 = h_inv - ind[1]; + } + + p2 = h - ind[2]; + if ( sign[ind[2]] < 0.0 ) + { + p2 = h_inv - ind[2]; + } + + p3 = h - ind[3]; + if ( sign[ind[3]] < 0.0 ) + { + p3 = h_inv - ind[3]; + } + /* pt =&vec; others already defined*/ + vec[0] = p0[0] + p1[0] + p2[0] + p3[0]; + for ( i = 1; i < L_SUBFR; i += 3 ) + { + vec[i] = p0[i] + p1[i] + p2[i] + p3[i]; + vec[i + 1] = p0[i + 1] + p1[i + 1] + p2[i + 1] + p3[i + 1]; + vec[i + 2] = p0[i + 2] + p1[i + 2] + p2[i + 2] + p3[i + 2]; + } + + alp = 0.0F; + alp += vec[0] * vec[0] + vec[1] * vec[1]; + alp += vec[2] * vec[2] + vec[3] * vec[3]; + + for ( i = 4; i < L_SUBFR; i += 6 ) + { + alp += vec[i] * vec[i]; + alp += vec[i + 1] * vec[i + 1]; + alp += vec[i + 2] * vec[i + 2]; + alp += vec[i + 3] * vec[i + 3]; + alp += vec[i + 4] * vec[i + 4]; + alp += vec[i + 5] * vec[i + 5]; + } + + alp *= 0.5F; + } + + /* other stages of 2 pulses */ + for ( j = pos, st = 0; j < config->nb_pulse; j += 2, st++ ) + { + if ( ( config->nb_pulse - j ) >= 2 ) /*pair-wise search*/ + { + /* Calculate correlation of all possible positions + * of the next 2 pulses with previous fixed pulses. + * Each pulse can have 16 possible positions. */ + acelp_h_vec_corr1( h, vec, ipos[j], sign, rrixix, cor_x, dn2_pos, config->nbpos[st] ); + acelp_h_vec_corr2( h, vec, ipos[j + 1], sign, rrixix, cor_y ); + + /* Find best positions of 2 pulses. */ + acelp_2pulse_search( config->nbpos[st], ipos[j], ipos[j + 1], &ps, &alp, &ind[j], &ind[j + 1], dn, dn2_pos, cor_x, cor_y, rrixiy ); + } + else /*single pulse search*/ + { + acelp_h_vec_corr2( h, vec, ipos[j], sign, rrixix, cor_x ); + acelp_h_vec_corr2( h, vec, ipos[j + 1], sign, rrixix, cor_y ); + E_ACELP_1pulse_search( ipos[j], ipos[j + 1], &ps, &alp, &ind[j], dn, cor_x, cor_y ); + } + if ( j < ( config->nb_pulse - 2 ) ) + { + p0 = h - ind[j]; + if ( sign[ind[j]] < 0.0 ) + { + p0 = h_inv - ind[j]; + } + + p1 = h - ind[j + 1]; + if ( sign[ind[j + 1]] < 0.0 ) + { + p1 = h_inv - ind[j + 1]; + } + + vec[0] += p0[0] + p1[0]; + vec[1] += p0[1] + p1[1]; + vec[2] += p0[2] + p1[2]; + vec[3] += p0[3] + p1[3]; + for ( i = 4; i < L_SUBFR; i += 6 ) + { + vec[i] += p0[i] + p1[i]; + vec[i + 1] += p0[i + 1] + p1[i + 1]; + vec[i + 2] += p0[i + 2] + p1[i + 2]; + vec[i + 3] += p0[i + 3] + p1[i + 3]; + vec[i + 4] += p0[i + 4] + p1[i + 4]; + vec[i + 5] += p0[i + 5] + p1[i + 5]; + } + } + } + + /* memorise the best codevector */ + ps = ps * ps; + s = ( alpk * ps ) - ( psk * alp ); + if ( psk < 0 ) + { + s = 1.0F; + } + if ( s > 0.0F ) + { + psk = ps; + alpk = alp; + for ( i = 0; i < config->nb_pulse; i++ ) + { + codvec[i] = ind[i]; + } + } + } + + /* Build the codeword, the filtered codeword and index of codevector, as well as store weighted correlations. */ + set_f( code, 0, L_SUBFR ); + set_f( y, 0, L_SUBFR ); + set_s( ind, -1, NPMAXPT * 4 ); + + for ( k = 0; k < config->nb_pulse; k++ ) + { + i = codvec[k]; /* read pulse position */ + val = sign[i]; /* read sign */ + + index = (int16_t) ( i / 4 ); /* pos of pulse (0..15) */ + track = i % 4; + if ( val > 0 ) + { + code[i] += 1.0f; + codvec[k] += ( 2 * L_SUBFR ); + } + else + { + code[i] -= 1.0f; + index += 16; + } + + i = track * NPMAXPT; + while ( ind[i] >= 0 ) + { + i++; + } + + ind[i] = index; + + p0 = h_inv - codvec[k]; + for ( i = 0; i < L_SUBFR; i++ ) + { + y[i] += *p0++; + } + } + + return; +} + + +/* + * E_ACELP_4t + * + * Parameters: + * dn I: corr. between target and h[]. + * cn I: residual after int32_t term prediction + * H I: impulse response of weighted synthesis filter (Q12) + * code O: algebraic (fixed) codebook excitation (Q9) + * y O: filtered fixed codebook excitation (Q9) + * nbbits I: 20, 36, 44, 52, 64, 72 or 88 bits + * mode I: speech mode + * _index O: index + * + * Function: + * 20, 36, 44, 52, 64, 72, 88 bits algebraic codebook. + * 4 tracks x 16 positions per track = 64 samples. + * + * 20 bits 5 + 5 + 5 + 5 --> 4 pulses in a frame of 64 samples. + * 36 bits 9 + 9 + 9 + 9 --> 8 pulses in a frame of 64 samples. + * 44 bits 13 + 9 + 13 + 9 --> 10 pulses in a frame of 64 samples. + * 52 bits 13 + 13 + 13 + 13 --> 12 pulses in a frame of 64 samples. + * 64 bits 2 + 2 + 2 + 2 + 14 + 14 + 14 + 14 --> + * 16 pulses in a frame of 64 samples. + * 72 bits 10 + 2 + 10 + 2 + 10 + 14 + 10 + 14 --> + * 18 pulses in a frame of 64 samples. + * 88 bits 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 --> + * 24 pulses in a frame of 64 samples. + * + * All pulses can have two (2) possible amplitudes: +1 or -1. + * Each pulse can sixteen (16) possible positions. + * + * Returns: + * void + */ + +void E_ACELP_4t( + float dn[], + float cn[], + float H[], + float R[], + const int16_t acelpautoc, + float code[], + const int16_t cdk_index, + int16_t _index[], + const int16_t L_frame, + const int16_t last_L_frame, + const int32_t total_brate, + const int16_t i_subfr, + const int16_t cmpl_flag ) +{ + PulseConfig config; + int16_t ind[NPMAXPT * 4]; + float y[L_SUBFR]; + + config = PulseConfTable[cdk_index]; + + if ( cmpl_flag > 0 ) + { + config.nbiter = cmpl_flag; + } + + if ( L_frame != last_L_frame && total_brate == ACELP_24k40 && i_subfr < 5 * L_SUBFR ) + { + ( config.nbiter )--; + config.nbiter = max( config.nbiter, 1 ); + } + + if ( acelpautoc & 0x01 ) + { + E_ACELP_4tsearchx( dn, cn, R, code, &config, ind ); + } + else + { + E_ACELP_4tsearch( dn, cn, H, code, &config, ind, y ); + } + + E_ACELP_indexing( code, config, NB_TRACK_FCB_4T, _index ); + + return; +} + + +int16_t E_ACELP_indexing( + float code[], + PulseConfig config, + const int16_t num_tracks, + int16_t prm[] ) +{ + uint16_t track; + int16_t p[NB_TRACK_FCB_4T], wordcnt; + int16_t k; + uint16_t idxs[MAX_IDX_LEN], maxppos; + uint32_t s[NB_TRACK_FCB_4T], n[NB_TRACK_FCB_4T]; + int16_t maxp; + int16_t saved_bits; + + assert( num_tracks == NB_TRACK_FCB_4T ); + + saved_bits = 0; + + /* Code state of pulses of all tracks */ + wordcnt = ( config.bits + 15 ) >> 4; /* ceil(bits/16) */ + for ( k = 0; k < wordcnt; k++ ) + { + idxs[k] = 0; + } + if ( config.bits == 43 ) /* EVS pulse indexing */ + { + saved_bits = E_ACELP_code43bit( code, s, p, idxs ); + } + else + { + for ( track = 0; track < num_tracks; track++ ) + { + /* Code track of length 2^4 where step between tracks is 4. */ + E_ACELP_codearithp( code + track, n + track, s + track, p + track, num_tracks, 16 ); + } + fcb_pulse_track_joint( idxs, wordcnt, s, p, num_tracks ); + } + + /* check if we need to code track positions */ + switch ( config.codetrackpos ) + { + case TRACKPOS_FIXED_TWO: + /* Code position of consecutive tracks with single extra pulses */ + + /* Find track with one pulse less. */ + if ( p[0] == p[1] ) + { + /* Either 1100 or 0011 */ + if ( p[1] > p[2] ) + { + track = 0; /* 1100 */ + } + else + { + track = 2; /* 0011 */ + } + } + else + { + /* Either 0110 or 1001 */ + if ( p[0] < p[1] ) + { + track = 1; /* 0110 */ + } + else + { + track = 3; /* 1001 */ + } + } + /* Multiply by number of possible states (=shift by two) and + * add actual state. */ + longshiftleft( idxs, 2, idxs, wordcnt ); + longadd( idxs, &track, wordcnt, 1 ); + break; + case TRACKPOS_FREE_THREE: + /* Code position of track with one pulse less than others */ + + /* Find track with one pulse less. */ + maxp = p[0]; + maxppos = 0; + for ( track = 1; track < 4; track++ ) + { + if ( p[track] < maxp ) + { + maxppos = track; + break; + } + } + /* Multiply by number of possible states (=shift by two) and + * add actual state. */ + longshiftleft( idxs, 2, idxs, wordcnt ); + longadd( idxs, &maxppos, wordcnt, 1 ); + break; + case TRACKPOS_FREE_ONE: + /* Code position of track with one pulse more than others */ + + /* Find track with one pulse more. */ + maxp = p[0]; + maxppos = 0; + for ( track = 1; track < 4; track++ ) + { + if ( p[track] > maxp ) + { + maxppos = track; + break; + } + } + /* Multiply by number of possible states (=shift by two) and + * add actual state. */ + longshiftleft( idxs, 2, idxs, wordcnt ); + longadd( idxs, &maxppos, wordcnt, 1 ); + break; + case TRACKPOS_FIXED_EVEN: + case TRACKPOS_FIXED_FIRST: + break; + default: + printf( "Codebook mode not implemented." ); + assert( 0 ); /* mode not yet implemented*/ + break; + } + + /* cast to output buffer */ + for ( k = 0; k < wordcnt; k++ ) + { + prm[k] = idxs[k]; + } + + return ( saved_bits ); +} + + +/*--------------------------------------------------------------------------* + * E_ACELP_innovative_codebook + * + * Find innovative codebook. + *--------------------------------------------------------------------------*/ + +void E_ACELP_innovative_codebook( + const float *exc, /* i : pointer to the excitation frame */ + const int16_t T0, /* i : integer pitch lag */ + const int16_t T0_frac, /* i : fraction of lag */ + const int16_t T0_res, /* i : pitch resolution */ + const float pitch_gain, /* i : adaptive codebook gain */ + const float tilt_code, /* i : tilt factor */ + ACELP_config *acelp_cfg, /* i/o: configuration of the ACELP */ + const int16_t i_subfr, /* i : subframe index */ + const float *Aq, /* i : quantized LPC coefficients */ + const float *h1, /* i : impulse response of weighted synthesis filter */ + const float *xn, /* i : Close-loop Pitch search target vector */ + const float *cn, /* i : Innovative codebook search target vector */ + const float *y1, /* i : zero-memory filtered adaptive excitation */ + float *y2, /* o : zero-memory filtered algebraic excitation */ + const int16_t acelpautoc, /* i : autocorrelation mode enabled */ + int16_t **pt_indice, /* i/o: quantization indices pointer */ + float *code, /* o : innovative codebook */ + const int16_t L_frame, /* i : length of the frame */ + const int16_t last_L_frame, /* i : length of the last frame */ + const int32_t total_brate /* i : total bitrate */ +) +{ + float xn2[L_SUBFR], cn2[L_SUBFR], dn[L_SUBFR], h2[L_SUBFR]; + float Rw2[L_SUBFR]; + int16_t i, k; + float pitch; + + pitch = (float) T0 + (float) T0_frac / (float) T0_res; + + /* Update target vector for ACELP codebook search */ + updt_tar( xn, xn2, y1, pitch_gain, L_SUBFR ); + + /* Include fixed-gain pitch contribution into impulse resp. h1[] */ + mvr2r( h1, h2, L_SUBFR ); + cb_shape( acelp_cfg->pre_emphasis, acelp_cfg->pitch_sharpening, acelp_cfg->phase_scrambling, acelp_cfg->formant_enh, acelp_cfg->formant_tilt, acelp_cfg->formant_enh_num, acelp_cfg->formant_enh_den, Aq, h2, tilt_code, pitch, L_SUBFR ); + + /* Correlation between target xn2[] and impulse response h1[] */ + if ( acelpautoc & 0x01 ) + { + corr_xh( h2, Rw2, h2, L_SUBFR ); + for ( k = 0; k < L_SUBFR; k++ ) + { + cn2[k] = xn2[k]; + for ( i = 0; i < k; i++ ) + { + cn2[k] -= cn2[i] * h2[k - i]; + } + } + + E_ACELP_toeplitz_mul( Rw2, cn2, dn ); + } + else + { + updt_tar( cn, cn2, &exc[i_subfr], pitch_gain, L_SUBFR ); + corr_xh( xn2, dn, h2, L_SUBFR ); + } + + /* Innovative codebook search */ + if ( acelp_cfg->fixed_cdk_index[i_subfr / L_SUBFR] < ACELP_FIXED_CDK_NB ) + { + E_ACELP_4t( dn, cn2, h2, Rw2, acelpautoc, code, acelp_cfg->fixed_cdk_index[i_subfr / L_SUBFR], *pt_indice, L_frame, last_L_frame, total_brate, i_subfr, 0 ); + } + else + { + assert( 0 ); + } + *pt_indice += 8; + /* Generate weighted code */ + set_f( y2, 0.0f, L_SUBFR ); + for ( i = 0; i < L_SUBFR; i++ ) + { + /* Code is sparse, so check which samples are non-zero */ + if ( code[i] != 0 ) + { + for ( k = 0; k < L_SUBFR - i; k++ ) + { + y2[i + k] += code[i] * h2[k]; + } + } + } + + /*-------------------------------------------------------* + * - Add the fixed-gain pitch contribution to code[]. * + *-------------------------------------------------------*/ + + cb_shape( acelp_cfg->pre_emphasis, acelp_cfg->pitch_sharpening, acelp_cfg->phase_scrambling, acelp_cfg->formant_enh, acelp_cfg->formant_tilt, acelp_cfg->formant_enh_num, acelp_cfg->formant_enh_den, Aq, code, tilt_code, pitch, L_SUBFR ); + + return; +} + + +/*--------------------------------------------------------------------------* + * E_ACELP_codearithp + * + * Fixed bit-length arithmetic coding of pulses + * v - (input) pulse vector + * s - (output) encoded state + * n - (output) range of possible states (0...n-1) + * p - (output) number of pulses found + * len - (input) length of pulse vector + * trackstep - (input) step between tracks + *--------------------------------------------------------------------------*/ + +static void E_ACELP_codearithp( + const float v[], + uint32_t *n, + uint32_t *ps, + int16_t *p, + const int16_t trackstep, + const int16_t tracklen ) +{ + int16_t k, h, t, pos[9], sig[9], posno, tmp, L_subfr; + uint32_t s; + + posno = 0; + L_subfr = trackstep * tracklen; + + for ( k = t = 0; k < L_subfr; k += trackstep, t++ ) + { + tmp = ( v[k] > 0 ? 1 : -1 ); /* sign */ + for ( h = 0; h < v[k] * tmp; h++ ) + { + pos[posno] = t; + sig[posno] = tmp; + posno++; + if ( posno > 9 ) + { + break; + } + } + if ( posno >= 9 ) + { + break; + } + } + *p = posno; + + s = 0; + for ( k = 0; k < posno; k++ ) + { + /* check if next position is the same as this one */ + if ( ( k == posno - 1 ) || ( pos[k] != pos[k + 1] ) ) + { + /* next position is not the same (or we are at the last position) + * -> save sign */ + s <<= 1; + if ( sig[k] < 0 ) + { + s++; + } + } + s += pulsestostates[pos[k]][k]; + } + *ps = s; + if ( posno ) + { + *n = pulsestostates[tracklen][posno - 1]; + } + else + { + *n = 0; + } + + return; +} + + +void fcb_pulse_track_joint( + uint16_t *idxs, + const int16_t wordcnt, + uint32_t *index_n, + const int16_t *pulse_num, + const int16_t track_num ) +{ + int16_t hi_to_low[10] = { 0, 0, 0, 3, 9, 5, 3, 1, 8, 8 }; + + uint32_t index, indx_tmp; + uint32_t index_mask; + int16_t indx_flag, indx_flag_1; + int16_t track, track_num1, pulse_num0, pulse_num1; + int16_t indx_flag_2; + + indx_flag = 0; + indx_flag_1 = 0; + indx_flag_2 = 0; + for ( track = 0; track < track_num; track++ ) + { + indx_flag += ( pulse_num[track] >> 2 ); + indx_flag_1 += ( pulse_num[track] >> 1 ); + indx_flag_2 += ( pulse_num[track] >> 3 ); + } + + if ( indx_flag_2 >= 1 ) + { + hi_to_low[7] = 9; + index_mask = 0xffffff; + } + else + { + hi_to_low[7] = 1; + if ( indx_flag >= track_num ) + { + hi_to_low[4] = 9; + index_mask = 0xffff; + } + else + { + hi_to_low[4] = 1; + index_mask = 0xff; + } + } + + if ( indx_flag_1 >= track_num ) + { + indx_tmp = 0; + index = index_n[0] >> low_len[pulse_num[0]]; + for ( track = 1; track < track_num; track++ ) + { + pulse_num0 = pulse_num[track - 1]; + pulse_num1 = pulse_num[track]; + indx_tmp = index_n[track] >> low_len[pulse_num1]; + index = index * indx_fact[pulse_num1] + indx_tmp; + + index_n[track - 1] = ( index_n[track - 1] & low_mask[pulse_num0] ) + ( ( index << low_len[pulse_num0] ) & index_mask ); + index = index >> hi_to_low[pulse_num0]; + } + track_num1 = track_num - 1; + pulse_num1 = pulse_num[track_num1]; + index_n[track_num1] = ( ( index_n[track_num1] & low_mask[pulse_num1] ) + ( index << low_len[pulse_num1] ) ) & index_mask; + index = index >> hi_to_low[pulse_num1]; + if ( indx_flag >= track_num ) + { + if ( indx_flag_2 >= 1 ) + { + idxs[0] = index_n[0] & 0xffff; + idxs[1] = ( ( index_n[1] << 8 ) + ( index_n[0] >> 16 ) ) & 0xffff; + idxs[2] = ( index_n[1] >> 8 ) & 0xffff; + idxs[3] = index_n[2] & 0xffff; + idxs[4] = ( ( index_n[3] << 8 ) + ( index_n[2] >> 16 ) ) & 0xffff; + idxs[5] = ( index_n[3] >> 8 ) & 0xffff; + for ( track = 6; track < wordcnt; track++ ) + { + idxs[track] = index & 0xffff; + index = index >> 16; + } + } + else + { + for ( track = 0; track < track_num; track++ ) + { + idxs[track] = index_n[track] & 0xffff; + } + for ( track = track_num; track < wordcnt; track++ ) + { + idxs[track] = index & 0xffff; + index = index >> 16; + } + } + } + else + { + idxs[0] = ( ( index_n[0] << 8 ) + index_n[1] ) & 0xffff; + idxs[1] = ( ( index_n[2] << 8 ) + index_n[3] ) & 0xffff; + for ( track = 2; track < wordcnt; track++ ) + { + idxs[track] = index & 0xffff; + index = index >> 16; + } + } + } + else + { + index = index_n[0]; + for ( track = 1; track < 4; track++ ) + { + pulse_num1 = pulse_num[track]; + index = ( index << index_len[pulse_num1] ) + index_n[track]; + } + for ( track = 0; track < wordcnt; track++ ) + { + idxs[track] = index & 0xffff; + index = index >> 16; + } + } + + return; +} diff --git a/lib_enc/enc_acelp_tcx_main.c b/lib_enc/enc_acelp_tcx_main.c new file mode 100644 index 0000000000000000000000000000000000000000..338d87cc699bffcefc526a4f9b7077cd0a8c4e1f --- /dev/null +++ b/lib_enc/enc_acelp_tcx_main.c @@ -0,0 +1,131 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * enc_acelp_tcx_main() + * + * encoder function for coding ACELP/TCX + *--------------------------------------------------------------------*/ + +void enc_acelp_tcx_main( + Encoder_State *st, /* i/o: encoder state structure */ + const float new_samples[], /* i : new samples */ + float Aw[NB_SUBFR16k * ( M + 1 )], /* i : weighted A(z) unquant. for subframes*/ + const float lsp_new[M], /* i : LSPs at the end of the frame */ + const float lsp_mid[M], /* i : LSPs at the middle of the frame */ + float bwe_exc_extended[], /* i/o: bandwidth extended excitation */ + float *voice_factors, /* o : voicing factors */ + float pitch_buf[], /* o : floating pitch for each subframe */ + const int16_t vad_hover_flag /* i : VAD hangover flag */ +) +{ + float old_bwe_exc[( PIT16k_MAX + ( L_FRAME16k + 1 ) + L_SUBFR16k ) * 2]; /* excitation buffer */ + float *ptr_bwe_exc; /* pointer to BWE excitation signal in the current frame */ + + push_wmops( "enc_acelp_tcx_main" ); + + ptr_bwe_exc = old_bwe_exc + PIT16k_MAX * 2; + + if ( st->last_core == ACELP_CORE ) + { + set_f( old_bwe_exc + PIT16k_MAX * 2, 0.f, ( ( L_FRAME16k + 1 ) + L_SUBFR16k ) * 2 ); + mvr2r( st->hBWE_TD->old_bwe_exc, old_bwe_exc, PIT16k_MAX * 2 ); + } + else + { + set_f( old_bwe_exc, 0.f, ( ( L_FRAME16k + 1 ) + L_SUBFR16k + PIT16k_MAX ) * 2 ); + } + + /* Guided ACELP PLC */ + if ( st->hPlcExt ) + { + gPLC_encInfo( st->hPlcExt, st->total_brate, st->bwidth, st->clas, st->coder_type ); + } + + if ( st->core_brate != FRAME_NO_DATA && st->core_brate != SID_2k40 ) + { + /* Run Core Coder */ + if ( st->tcxonly == 0 ) + { + core_encode_openloop( st, Aw, lsp_new, lsp_mid, pitch_buf, voice_factors, ptr_bwe_exc, vad_hover_flag ); + } + else + { + core_encode_twodiv( st, new_samples, Aw, vad_hover_flag ); + } + + /* Apply non linearity to the SHB excitation */ + if ( st->core == ACELP_CORE && st->igf ) + { + non_linearity( ptr_bwe_exc, bwe_exc_extended, st->hBWE_TD->old_bwe_exc_extended, L_FRAME32k, &st->hBWE_TD->bwe_non_lin_prev_scale, st->coder_type, voice_factors, st->L_frame ); + + /* update the old_BWE_exc memory */ + mvr2r( &old_bwe_exc[L_FRAME32k], st->hBWE_TD->old_bwe_exc, PIT16k_MAX * 2 ); + } + else + { + set_f( st->hBWE_TD->old_bwe_exc_extended, 0, NL_BUFF_OFFSET ); + set_f( st->hBWE_TD->old_bwe_exc, 0, PIT16k_MAX * 2 ); /* reset old non_linear exc during igf frames */ + st->hBWE_TD->bwe_non_lin_prev_scale = 0.0f; + } + } + else + { + /* Run SID Coder */ + if ( st->core_brate == SID_2k40 ) + { + FdCng_encodeSID( st ); + } + + /* Generate Comfort Noise */ + generate_comfort_noise_enc( st ); + + /* Update Core Encoder */ + core_encode_update_cng( st, st->hFdCngEnc->hFdCngCom->timeDomainBuffer, st->hFdCngEnc->hFdCngCom->A_cng, Aw ); + } + + /* coreSwitching update of Mode 1 parameters in the last frame */ + st->last_coder_type = st->coder_type; + + pop_wmops(); + return; +} diff --git a/lib_enc/enc_acelpx.c b/lib_enc/enc_acelpx.c new file mode 100644 index 0000000000000000000000000000000000000000..d8dcf192bac007cc36c2de44c2e36aed020b1f9c --- /dev/null +++ b/lib_enc/enc_acelpx.c @@ -0,0 +1,497 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include "options.h" +#include "prot.h" +#include "rom_enc.h" +#include "wmc_auto.h" + + +/* Iterations: nb_pos_ix*16 */ +static void E_ACELP_2pulse_searchx( + const int16_t nb_pos_ix, + const int16_t track_x, + const int16_t track_y, + float *R, + float *ps, + float *alp, + int16_t *ix, + int16_t *iy, + float dn[], + int16_t *dn2, + float cor[], + float sign[] ) +{ + int16_t i; + int16_t x, y, *pos_x, x_save = 0, y_save = 0; + float ps0, alp0, alp1, ps1, alp2, ps2, sq, s, sqk, alpk, *pR, sgnx, *pRx, *pRy, sign_x, sign_y; + + /* x_save=y_save=0 */ + /* eight dn2 max positions per track */ + pos_x = &dn2[track_x << 3]; + /* save these to limit memory searches */ + ps0 = *ps; + alp0 = *alp + 2.0f * R[0]; + + sqk = -1.0F; + alpk = 1.0F; + + x = pos_x[0]; + sgnx = sign[track_y]; + if ( sign[x] < 0 ) + { + sgnx = -sgnx; + } + if ( ( alp0 + ( cor[x] * sign[x] ) + ( cor[track_y] * sign[track_y] ) + ( R[track_y - x] * sgnx ) ) < 0.0F ) + { + sqk = 1.0F; + } + + /* loop track 1 */ + for ( i = 0; i < nb_pos_ix; i++ ) + { + x = pos_x[i]; + sgnx = sign[x]; + /* dn[x] has only nb_pos_ix positions saved */ + ps1 = ps0 + dn[x]; + alp1 = alp0 + 2 * sgnx * cor[x]; + pR = R - x; + + for ( y = track_y; y < L_SUBFR; y += 4 ) + { + ps2 = ps1 + dn[y]; + alp2 = alp1 + 2.0f * sign[y] * ( cor[y] + sgnx * pR[y] ); + sq = ps2 * ps2; + + s = ( alpk * sq ) - ( sqk * alp2 ); + if ( s > 0.0F ) + { + sqk = sq; + alpk = alp2; + y_save = y; + x_save = x; + } + } + } + /* Update numerator */ + *ps = ps0 + dn[x_save] + dn[y_save]; + /* Update denominator */ + *alp = alpk; + + /* Update product of autocorrelation and already fixed pulses. with the + * two newly found ones */ + pRx = R - x_save; + pRy = R - y_save; + sign_x = sign[x_save]; + sign_y = sign[y_save]; + + for ( i = 0; i < L_SUBFR; i++ ) + { + cor[i] += pRx[i] * sign_x + pRy[i] * sign_y; + } + + *ix = x_save; + *iy = y_save; + if ( ( ( x_save & 3 ) != track_x ) || ( ( y_save & 3 ) != track_y ) ) + { + /* sanity check */ + assert( 0 ); + } + + return; +} + +static void E_ACELP_1pulse_searchx( + int16_t track_x, + int16_t track_y, + float *R, + float *ps, + float *alp, + int16_t *ix, + float dn[], + float cor[], + float sign[] ) +{ + int16_t x, x_save = 0; + float ps0, alp0; + float ps1, sq, sqk; + float alp1, alpk; + float s; + + /* save these to limit memory searches */ + ps0 = *ps; + alp0 = *alp + R[0]; + sqk = -1.0F; + alpk = 1.0F; + + if ( ( alp0 + ( cor[track_x] * sign[track_x] ) ) < 0 ) + { + sqk = 1.0F; + } + + x_save = track_x; + for ( x = track_x; x < L_SUBFR; x += 4 ) + { + ps1 = ps0 + dn[x]; + alp1 = alp0 + 2 * sign[x] * cor[x]; + sq = ps1 * ps1; + s = ( alpk * sq ) - ( sqk * alp1 ); + if ( s > 0.0F ) + { + sqk = sq; + alpk = alp1; + x_save = x; + } + } + + if ( track_y != track_x ) + { + for ( x = track_y; x < L_SUBFR; x += 4 ) + { + ps1 = ps0 + dn[x]; + alp1 = alp0 + 2 * sign[x] * cor[x]; + sq = ps1 * ps1; + s = ( alpk * sq ) - ( sqk * alp1 ); + if ( s > 0.0F ) + { + sqk = sq; + alpk = alp1; + x_save = x; + } + } + } + + *ps = ps0 + dn[x_save]; + *alp = alpk; + *ix = x_save; + + return; +} + + +/* Autocorrelation method for searching pulse positions effectively + * Algorithm is identical to traditional covariance method. */ +void E_ACELP_4tsearchx( + float dn[], + const float cn[], + float Rw[], + float code[], + PulseConfig *config, + int16_t ind[] ) +{ + float sign[L_SUBFR], vec[L_SUBFR]; + float cor[L_SUBFR]; + float R_buf[2 * L_SUBFR - 1], *R; + float dn2[L_SUBFR]; + float psk = 0.0F, ps2k, ps, ps2, alpk, alp = 0.0F; + int16_t codvec[NB_PULSE_MAX]; + int16_t pos_max[4]; + int16_t dn2_pos[8 * 4]; + int16_t ipos[NB_PULSE_MAX]; + float *p0; + int16_t i, j, k, l, st, pos = 0, index, track; + int16_t iPulse; + float val; + float s; + int16_t restpulses; + + alp = config->alp; + for ( k = 0; k < config->nb_pulse; k++ ) + { + codvec[k] = ( k & 3 ); + } + + set_f( cor, 0.0f, L_SUBFR ); + + /* Set up autocorrelation vector */ + R = R_buf + L_SUBFR - 1; + R[0] = Rw[0]; + for ( k = 1; k < L_SUBFR; k++ ) + { + R[k] = R[-k] = Rw[k]; + } + + /* Find sign for each pulse position. */ + acelp_pulsesign( cn, dn, dn2, sign, vec, alp ); + + /* Select the most important 8 position per track according to dn2[]. */ + acelp_findcandidates( dn2, dn2_pos, pos_max, L_SUBFR, NB_TRACK_FCB_4T ); + + /* + * Deep first search: + * ------------------ + * 20 bits (4p): 4 iter x ((4x16)+(8x16)) = 768 tests + * 36 bits (8p): 4 iter x ((1x1)+(4x16)+(8x16)+(8x16)) = 1280 tests + * 52 bits (12p): 3 iter x ((1x1)+(1x1)+(4x16)+(6x16) + * +(8x16)+(8x16)) = 1248 tests + * 64 bits (16p): 2 iter x ((1x1)+(1x1)+(4x16)+(6x16) + * +(6x16)+(8x16)+(8x16)+(8x16)) = 1280 tests + */ + ps2k = -1.0; + alpk = 1000.0; + /*Number of iterations*/ + for ( k = 0; k < config->nbiter; k++ ) + { + /* copy search order from hash-table */ + for ( l = 0; l < config->nb_pulse; l++ ) + { + ipos[l] = tipos[( k * 4 ) + l]; + } + + /* if all tracks do not have equal number of pulses */ + restpulses = config->nb_pulse & 3; + if ( restpulses ) + { + switch ( config->codetrackpos ) + { + case TRACKPOS_FIXED_FIRST: /* fixed track positions, starting from left */ + /* add tracks from left */ + for ( iPulse = 0; iPulse < restpulses; iPulse++ ) + { + ipos[config->nb_pulse - restpulses + iPulse] = iPulse; + } + /* Put the same track on the next position, because the 1-pulse search + * will access it to determine if this could be in any track. */ + ipos[config->nb_pulse] = ipos[config->nb_pulse - 1]; + break; + case TRACKPOS_FIXED_EVEN: /* fixed track positions, odd tracks */ + /* odd tracks, switch order for every iteration */ + ipos[config->nb_pulse - restpulses] = ( k << 1 ) & 2; /* 0 for even k, 2 for odd*/ + ipos[config->nb_pulse - restpulses + 1] = ipos[config->nb_pulse - restpulses] ^ 2; /* 2 for even k, 0 for odd*/ + break; + case TRACKPOS_FIXED_TWO: /* two tracks instead of four */ + /* Put the next track on the next position, because the 1-pulse search + * will access it to determine if this could be in any track. */ + ipos[config->nb_pulse] = ( ipos[config->nb_pulse - 1] + 1 ) & 3; + break; + default: /* one or three free track positions */ + /* copy an extra position from table - 1pulse search will access this */ + ipos[config->nb_pulse] = tipos[( k * 4 ) + config->nb_pulse]; + break; + } + } + if ( config->fixedpulses == 0 ) /* 1100, 11, 1110, 1111, 2211 */ + { + pos = 0; + ps = 0.0F; + alp = 0.0F; + for ( i = 0; i < L_SUBFR; i++ ) + { + cor[i] = 0; + } + } + else if ( config->fixedpulses == 2 ) /* 2222 and 3322 */ + { + /* --- first stage: fix 2 pulses --- */ + /* index to first non-fixed position */ + pos = 2; + + /* set fixed positions */ + ind[0] = pos_max[ipos[0]]; + ind[1] = pos_max[ipos[1]]; + + /* correlation of fixed part with residual */ + ps = dn[ind[0]] + dn[ind[1]]; + + /* multiplication of autocorrelation with signed fixed pulses */ + /* first pulse */ + p0 = R - ind[0]; + if ( sign[ind[0]] > 0 ) + { + for ( i = 0; i < L_SUBFR; i++ ) + { + cor[i] = *p0; + p0++; + } + } + else + { + for ( i = 0; i < L_SUBFR; i++ ) + { + cor[i] = -*p0; + p0++; + } + } + /* second pulse */ + p0 = R - ind[1]; + if ( sign[ind[1]] > 0 ) + { + for ( i = 0; i < L_SUBFR; i++ ) + { + cor[i] += *p0; + p0++; + } + } + else + { + for ( i = 0; i < L_SUBFR; i++ ) + { + cor[i] -= *p0; + p0++; + } + } + + /* normalisation contribution of fixed part */ + alp = sign[ind[0]] * cor[ind[0]] + sign[ind[1]] * cor[ind[1]]; + } + else /* if (config->fixedpulses == 4) */ /* 3333 and above */ + { + /* first stage: fix 4 pulses */ + pos = 4; + + ind[0] = pos_max[ipos[0]]; + ind[1] = pos_max[ipos[1]]; + ind[2] = pos_max[ipos[2]]; + ind[3] = pos_max[ipos[3]]; + + /* correlation of fixed part with residual */ + ps = dn[ind[0]] + dn[ind[1]] + dn[ind[2]] + dn[ind[3]]; + + /* multiplication of autocorrelation with signed fixed pulses */ + /* first pulse */ + p0 = R - ind[0]; + if ( sign[ind[0]] > 0 ) + { + for ( i = 0; i < L_SUBFR; i++ ) + { + cor[i] = *p0; + p0++; + } + } + else + { + for ( i = 0; i < L_SUBFR; i++ ) + { + cor[i] = -*p0; + p0++; + } + } + /* pulses 1..3 */ + for ( j = 1; j < 4; j++ ) + { + p0 = R - ind[j]; + if ( sign[ind[j]] > 0 ) + { + for ( i = 0; i < L_SUBFR; i++ ) + { + cor[i] += *p0; + p0++; + } + } + else + { + for ( i = 0; i < L_SUBFR; i++ ) + { + cor[i] -= *p0; + p0++; + } + } + } + + /* normalisation contribution of fixed part */ + alp = sign[ind[0]] * cor[ind[0]] + sign[ind[1]] * cor[ind[1]] + sign[ind[2]] * cor[ind[2]] + sign[ind[3]] * cor[ind[3]]; + } + + /* other stages of 2 pulses */ + for ( j = pos, st = 0; j < config->nb_pulse; j += 2, st++ ) + { + if ( ( config->nb_pulse - j ) >= 2 ) + { + /*pair-wise search*/ + + /* Calculate correlation of all possible positions + * of the next 2 pulses with previous fixed pulses. + * Each pulse can have 16 possible positions. */ + + E_ACELP_2pulse_searchx( config->nbpos[st], ipos[j], ipos[j + 1], R, &ps, &alp, &ind[j], &ind[j + 1], dn, dn2_pos, cor, sign ); + } + else + { + /*single pulse search*/ + E_ACELP_1pulse_searchx( ipos[j], ipos[j + 1], R, &ps, &alp, &ind[j], dn, cor, sign ); + } + } + + /* memorise the best codevector */ + ps2 = ps * ps; + s = ( alpk * ps2 ) - ( ps2k * alp ); + if ( s > 0.0F ) + { + ps2k = ps2; + psk = ps; + alpk = alp; + for ( i = 0; i < config->nb_pulse; i++ ) + { + codvec[i] = ind[i]; + } + } + } + + /* Store weighted energy of code, build the codeword and index of codevector. */ + set_f( code, 0, L_SUBFR ); + set_s( ind, -1, NPMAXPT * 4 ); + + for ( k = 0; k < config->nb_pulse; k++ ) + { + i = codvec[k]; /* read pulse position */ + val = sign[i]; /* read sign */ + + index = i / 4; /* pos of pulse (0..15) */ + track = i % 4; + if ( val * psk > 0 ) + { + code[i] += 1.0f; + codvec[k] += ( 2 * L_SUBFR ); + } + else + { + code[i] -= 1.0f; + index += 16; + } + + i = track * NPMAXPT; + while ( ind[i] >= 0 ) + { + i++; + } + + ind[i] = index; + } + + return; +} diff --git a/lib_enc/enc_amr_wb.c b/lib_enc/enc_amr_wb.c new file mode 100644 index 0000000000000000000000000000000000000000..f902680026491e3408ea4a5d142505cc407a7016 --- /dev/null +++ b/lib_enc/enc_amr_wb.c @@ -0,0 +1,238 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * encod_amr_wb() + * + * Encode excitation signal in AMR-WB IO mode + *-------------------------------------------------------------------*/ + +void encod_amr_wb( + Encoder_State *st, /* i/o: state structure */ + const float speech[], /* i : input speech */ + const float Aw[], /* i : weighted A(z) unquantized for subframes */ + const float Aq[], /* i : 12k8 Lp coefficient */ + const float *res, /* i : residual signal */ + float *syn, /* i/o: core synthesis */ + float *exc, /* i/o: current non-enhanced excitation */ + float *exc2, /* i/o: current enhanced excitation */ + float *pitch_buf, /* i/o: floating pitch values for each subframe */ + int16_t hf_gain[NB_SUBFR], /* o : decoded HF gain */ + const float *speech16k /* i : input speech @16kHz */ +) +{ + float xn[L_SUBFR]; /* Target vector for pitch search */ + float xn2[L_SUBFR]; /* Target vector for codebook search */ + float cn[L_SUBFR]; /* Target vector in residual domain */ + float h1[L_SUBFR + ( M + 1 )]; /* Impulse response vector */ + float code[L_SUBFR]; /* Fixed codebook excitation */ + float y1[L_SUBFR]; /* Filtered adaptive excitation */ + float y2[L_SUBFR]; /* Filtered algebraic excitation */ + float gain_pit; /* Pitch gain */ + float voice_fac; /* Voicing factor */ + float gain_code; /* Gain of code */ + float gain_inov; /* inovation gain */ + int16_t i, i_subfr; /* tmp variables */ + int16_t T_op[3]; /* pitch period for quantization */ + int16_t T0, T0_frac; /* close loop integer pitch and fractional part */ + int16_t T0_min, T0_max; /* pitch variables */ + float *pt_pitch; /* pointer to floating pitch buffer */ + float g_corr[6]; /* ACELP correl, values + gain pitch */ + int16_t clip_gain; /* LSF clip gain */ + const float *p_Aw, *p_Aq; /* pointer to LP filter coeff. vector*/ + int16_t unbits = 0; + float norm_gain_code; + int16_t pitch_limit_flag; + int16_t lp_select, lp_flag; + + BSTR_ENC_HANDLE hBstr = st->hBstr; + LPD_state_HANDLE hLPDmem = st->hLPDmem; + + /*------------------------------------------------------------------* + * Initializations + *------------------------------------------------------------------*/ + + pitch_limit_flag = 0; /* always restrained pitch Q range in IO mode */ + T0_max = PIT_MAX; + T0_min = PIT_MIN; + + p_Aw = Aw; + p_Aq = Aq; + pt_pitch = pitch_buf; + + mvs2s( st->pitch, T_op, 2 ); + if ( T_op[0] <= PIT_MIN ) + { + T_op[0] *= 2; + } + + if ( T_op[1] <= PIT_MIN ) + { + T_op[1] *= 2; + } + + st->acelp_cfg.fcb_mode = 0; /* flag used in inov_encode() */ + + /*-----------------------------------------------------------------* + * Select LP filtering flag + *-----------------------------------------------------------------*/ + + if ( st->core_brate < ACELP_11k60 ) + { + lp_flag = LOW_PASS; + } + else + { + lp_flag = NORMAL_OPERATION; + } + + /*------------------------------------------------------------------* + * ACELP subframe loop + *------------------------------------------------------------------*/ + + for ( i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR ) + { + /*----------------------------------------------------------------* + * Bandwidth expansion of A(z) filter coefficients + * Find the the excitation search target "xn" and innovation + * target in residual domain "cn" + * Compute impulse response, h1[], of weighted synthesis filter + *----------------------------------------------------------------*/ + + mvr2r( &res[i_subfr], &exc[i_subfr], L_SUBFR ); + + find_targets( speech, hLPDmem->mem_syn, i_subfr, &hLPDmem->mem_w0, p_Aq, res, L_SUBFR, p_Aw, TILT_FAC, xn, cn, h1 ); + + /*----------------------------------------------------------------* + * Close-loop pitch search and quantization + * Adaptive exc. construction + *----------------------------------------------------------------*/ + + *pt_pitch = pit_encode( hBstr, st->acelp_cfg.pitch_bits, st->core_brate, 1, L_FRAME, -1, &pitch_limit_flag, i_subfr, exc, L_SUBFR, T_op, &T0_min, &T0_max, &T0, &T0_frac, h1, xn, 0 /*tdm_Pitch_reuse_flag*/, NULL /*tdm_Pri_pitch_buf*/ ); + + /*-----------------------------------------------------------------* + * Find adaptive exitation + *-----------------------------------------------------------------*/ + + pred_lt4( &exc[i_subfr], &exc[i_subfr], T0, T0_frac, L_SUBFR + 1, inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + + /*-----------------------------------------------------------------* + * Gain clipping test to avoid unstable synthesis on frame erasure + * or in case of floating point encoder & fixed p. decoder + *-----------------------------------------------------------------*/ + + clip_gain = gp_clip( st->element_mode, st->core_brate, st->voicing, i_subfr, 0, xn, st->clip_var ); + + /*-----------------------------------------------------------------* + * LP filtering of the adaptive excitation, codebook target computation + *-----------------------------------------------------------------*/ + + lp_select = lp_filt_exc_enc( MODE1, -1, i_subfr, exc, h1, xn, y1, xn2, L_SUBFR, L_FRAME, g_corr, clip_gain, &gain_pit, &lp_flag ); + + if ( lp_flag == NORMAL_OPERATION ) + { + push_indice( hBstr, IND_LP_FILT_SELECT, lp_select, 1 ); + } + + /*-----------------------------------------------------------------* + * Innovation encoding + *-----------------------------------------------------------------*/ + + inov_encode( st, st->core_brate, 1, L_FRAME, st->last_L_frame, -1, -1, 0, i_subfr, -1, p_Aq, gain_pit, cn, exc, h1, hLPDmem->tilt_code, *pt_pitch, xn2, code, y2, &unbits, L_SUBFR ); + + /*-----------------------------------------------------------------* + * Gain encoding + * Pitch gain clipping test + * Estimate spectrum tilt and voicing + *-----------------------------------------------------------------*/ + + gain_enc_amr_wb( hBstr, xn, y1, y2, code, st->core_brate, &gain_pit, &gain_code, &gain_inov, &norm_gain_code, g_corr, clip_gain, st->hAmrwb_IO->past_qua_en ); + + gp_clip_test_gain_pit( st->element_mode, st->core_brate, gain_pit, st->clip_var ); + + hLPDmem->tilt_code = est_tilt( exc + i_subfr, gain_pit, code, gain_code, &voice_fac, L_SUBFR, 0 ); + + /*-----------------------------------------------------------------* + * Update memory of the weighting filter + *-----------------------------------------------------------------*/ + + hLPDmem->mem_w0 = xn[L_SUBFR - 1] - gain_pit * y1[L_SUBFR - 1] - gain_code * y2[L_SUBFR - 1]; + + /*-----------------------------------------------------------------* + * Find the total excitation + *-----------------------------------------------------------------*/ + + for ( i = 0; i < L_SUBFR; i++ ) + { + exc2[i + i_subfr] = gain_pit * exc[i + i_subfr]; + exc[i + i_subfr] = exc2[i + i_subfr] + gain_code * code[i]; + } + + /*-----------------------------------------------------------------* + * Synthesize speech to update mem_syn[] + * Update A(z) filters + *-----------------------------------------------------------------*/ + + syn_filt( p_Aq, M, &exc[i_subfr], &syn[i_subfr], L_SUBFR, hLPDmem->mem_syn, 1 ); + + /*-----------------------------------------------------------------* + * HF gain modification factors at 23.85 kbps + *-----------------------------------------------------------------*/ + + if ( st->core_brate == ACELP_23k85 ) + { + if ( st->input_Fs >= 16000 ) + { + hf_cod( st->core_brate, &speech16k[i_subfr * L_SUBFR16k / L_SUBFR], p_Aq, &exc[i_subfr], &syn[i_subfr], &st->hAmrwb_IO->seed2_enc, st->hAmrwb_IO->mem_hp400_enc, st->hAmrwb_IO->mem_syn_hf_enc, st->hAmrwb_IO->mem_hf_enc, st->hAmrwb_IO->mem_hf2_enc, &st->hVAD->hangover_cnt, &st->hAmrwb_IO->gain_alpha, &hf_gain[i_subfr / L_SUBFR] ); + } + + push_indice( hBstr, IND_HF_GAIN_MODIFICATION, hf_gain[i_subfr / L_SUBFR], 4 ); + } + + p_Aw += ( M + 1 ); + p_Aq += ( M + 1 ); + pt_pitch++; + } + + return; +} diff --git a/lib_enc/enc_gain.c b/lib_enc/enc_gain.c new file mode 100644 index 0000000000000000000000000000000000000000..607c36f6e9a75843068355dfd4f8a88cecaa5abb --- /dev/null +++ b/lib_enc/enc_gain.c @@ -0,0 +1,270 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include "options.h" +#include "prot.h" +#include "rom_enc.h" +#include "rom_com.h" +#include "wmc_auto.h" + + +/* + * E_GAIN_norm_corr_interpolate + * + * Parameters: + * x I: input vector + * frac I: fraction (-4..+3) + * + * Function: + * Interpolating the normalized correlation + * + * Returns: + * interpolated value + */ +static float E_GAIN_norm_corr_interpolate( + float *x, + int16_t frac ) +{ + float s, *x1, *x2; + const float *c1, *c2; + + if ( frac < 0 ) + { + frac += 4; + x--; + } + + x1 = &x[0]; + x2 = &x[1]; + c1 = &E_ROM_inter4_1[frac]; + c2 = &E_ROM_inter4_1[4 - frac]; + s = x1[0] * c1[0] + x2[0] * c2[0]; + s += x1[-1] * c1[4] + x2[1] * c2[4]; + s += x1[-2] * c1[8] + x2[2] * c2[8]; + s += x1[-3] * c1[12] + x2[3] * c2[12]; + + return s; +} + +static float E_GAIN_norm_corr_interpolate6( + float *x, + int16_t frac ) +{ + float s, *x1, *x2; + const float *c1, *c2; + + if ( frac < 0 ) + { + frac += 6; + x--; + } + + x1 = &x[0]; + x2 = &x[1]; + c1 = &E_ROM_inter6_1[frac]; + c2 = &E_ROM_inter6_1[6 - frac]; + s = x1[0] * c1[0] + x2[0] * c2[0]; + s += x1[-1] * c1[6] + x2[1] * c2[6]; + s += x1[-2] * c1[12] + x2[2] * c2[12]; + s += x1[-3] * c1[18] + x2[3] * c2[18]; + + return s; +} + +/* + * E_GAIN_closed_loop_search + * + * Parameters: + * exc I: excitation buffer + * xn I: target signal + * h I: weighted synthesis filter impulse response + * dn I: residual domain target signal + * t0_min I: minimum value in the searched range + * t0_max I: maximum value in the searched range + * pit_frac O: chosen fraction + * i_subfr I: flag to first subframe + * t0_fr2 I: minimum value for resolution 1/2 + * t0_fr1 I: minimum value for resolution 1 + * + * Function: + * Find the closed loop pitch period with 1/4 subsample resolution. + * + * Returns: + * chosen integer pitch lag + */ +int16_t E_GAIN_closed_loop_search( + float exc[], + float xn[], + float h[], + int16_t t0_min, + int16_t t0_min_frac, + int16_t t0_max, + int16_t t0_max_frac, + const int16_t t0_min_max_res, + int16_t *pit_frac, + int16_t *pit_res, + const int16_t pit_res_max, + const int16_t i_subfr, + const int16_t pit_min, + const int16_t pit_fr2, + const int16_t pit_fr1, + const int16_t L_subfr ) +{ + float corr_v[32 + 2 * L_INTERPOL1 + 1]; + float cor_max, max_val, temp; + float *corr; + int16_t i, fraction, frac1, frac2, step; + int16_t t0, t_min, t_max; + + /* Find interval to compute normalized correlation */ + if ( t0_min_frac > 0 ) + { + t0_min++; + } + t_min = t0_min - L_INTERPOL1; + t_max = t0_max + L_INTERPOL1; + + /* allocate memory to normalized correlation vector */ + corr = &corr_v[-t_min]; /* corr[t_min..t_max] */ + + /* Compute normalized correlation between target and filtered excitation */ + norm_corr( exc, xn, h, t_min, t_max, corr, L_subfr ); + + /* find integer pitch */ + max_val = corr[t0_min]; + t0 = t0_min; + for ( i = t0_min + 1; i <= t0_max; i++ ) + { + if ( corr[i] >= max_val ) + { + max_val = corr[i]; + t0 = i; + } + } + + /* If first subframe and t0 >= pit_fr1, do not search fractionnal pitch */ + if ( ( i_subfr == 0 ) & ( t0 >= pit_fr1 ) ) + { + *pit_frac = 0; + *pit_res = 1; + return ( t0 ); + } + + /* + * Search fractionnal pitch + * Test the fractions around t0 and choose the one which maximizes + * the interpolated normalized correlation. + */ + + if ( t0_min_max_res == ( pit_res_max >> 1 ) ) + { + t0_min_frac = t0_min_frac << 1; + t0_max_frac = t0_max_frac << 1; + } + + step = 1; + frac1 = -( pit_res_max - 1 ); + frac2 = pit_res_max - 1; + if ( ( ( i_subfr == 0 ) & ( t0 >= pit_fr2 ) ) | ( pit_fr2 <= pit_min ) ) + { + step = 2; + frac1 = -( pit_res_max - 2 ); + frac2 = pit_res_max - 2; + } + + if ( ( t0 == t0_min ) && ( t0_min_frac == 0 ) ) + { + frac1 = t0_min_frac; + } + else if ( ( t0 == t0_min ) && ( frac1 + pit_res_max < t0_min_frac ) ) + { + frac1 = t0_min_frac - pit_res_max; + } + if ( t0 == t0_max ) + { + frac2 = t0_max_frac; + } + assert( frac1 <= 0 && frac2 >= 0 && frac2 > frac1 ); + if ( pit_res_max == 6 ) + { + cor_max = E_GAIN_norm_corr_interpolate6( &corr[t0], frac1 ); + fraction = frac1; + for ( i = ( frac1 + step ); i <= frac2; i += step ) + { + temp = E_GAIN_norm_corr_interpolate6( &corr[t0], i ); + if ( temp > cor_max ) + { + cor_max = temp; + fraction = i; + } + } + } + else + { + cor_max = E_GAIN_norm_corr_interpolate( &corr[t0], frac1 ); + fraction = frac1; + for ( i = ( frac1 + step ); i <= frac2; i += step ) + { + temp = E_GAIN_norm_corr_interpolate( &corr[t0], i ); + if ( temp > cor_max ) + { + cor_max = temp; + fraction = i; + } + } + } + + /* limit the fraction value */ + if ( fraction < 0 ) + { + fraction += pit_res_max; + t0 -= 1; + } + if ( ( ( i_subfr == 0 ) & ( t0 >= pit_fr2 ) ) | ( pit_fr2 <= pit_min ) ) + { + *pit_res = pit_res_max >> 1; + *pit_frac = fraction >> 1; + } + else + { + *pit_res = pit_res_max; + *pit_frac = fraction; + } + + return ( t0 ); +} diff --git a/lib_enc/enc_gen_voic.c b/lib_enc/enc_gen_voic.c new file mode 100644 index 0000000000000000000000000000000000000000..07dc54f779465e17f4269282c356d180d1f12854 --- /dev/null +++ b/lib_enc/enc_gen_voic.c @@ -0,0 +1,324 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * encod_gen_voic() + * + * Encode excitation signal + *-------------------------------------------------------------------*/ + +void encod_gen_voic( + Encoder_State *st, /* i/o: state structure */ + const float speech[], /* i : input speech */ + const float Aw[], /* i : weighted A(z) unquantized for subframes */ + const float Aq[], /* i : LP coefficients */ + const float Es_pred, /* i : predicted scaled innov. energy */ + const float *res, /* i : residual signal */ + float *syn, /* i/o: core synthesis */ + float *exc, /* i/o: current non-enhanced excitation */ + float *exc2, /* i/o: current enhanced excitation */ + float *pitch_buf, /* i/o: floating pitch values for each subframe */ + float *voice_factors, /* o : voicing factors */ + float *bwe_exc, /* o : excitation for SWB TBE */ + int16_t *unbits, /* i/o: number of unused bits */ + const int16_t tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag */ + const float tdm_Pri_pitch_buf[] /* i : primary channel pitch buffer */ +) +{ + float xn[L_SUBFR]; /* Target vector for pitch search */ + float xn2[L_SUBFR]; /* Target vector for codebook search */ + float cn[L_SUBFR]; /* Target vector in residual domain */ + float h1[L_SUBFR + ( M + 1 )]; /* Impulse response vector */ + float code[L_SUBFR]; /* Fixed codebook excitation */ + float y1[L_SUBFR]; /* Filtered adaptive excitation */ + float y2[L_SUBFR]; /* Filtered algebraic excitation */ + float gain_pit; /* Pitch gain */ + float voice_fac; /* Voicing factor */ + float gain_code; /* Gain of code */ + float gain_inov; /* inovation gain */ + int16_t i, i_subfr; /* tmp variables */ + int16_t T0, T0_frac; /* close loop integer pitch and fractional part */ + int16_t T0_min, T0_max; /* pitch variables */ + float *pt_pitch; /* pointer to floating pitch buffer */ + float g_corr[6]; /* ACELP correl, values + gain pitch */ + float gains_mem[2 * ( NB_SUBFR - 1 )]; /* pitch gain and code gain from previous subframes */ + int16_t clip_gain; /* LSF clip gain */ + const float *p_Aw, *p_Aq; /* pointer to LP filter coeff. vector*/ + float error; + float gain_preQ; /* Gain of prequantizer excitation */ + float code_preQ[L_SUBFR]; /* Prequantizer excitation */ + int16_t unbits_PI; /* number of unused bits for EVS_PI */ + float norm_gain_code; + int16_t pitch_limit_flag; + int16_t harm_flag_acelp; + int16_t lp_select, lp_flag; + int16_t L_frame; + + BSTR_ENC_HANDLE hBstr = st->hBstr; + LPD_state_HANDLE hLPDmem = st->hLPDmem; + + /*------------------------------------------------------------------* + * Initializations + *------------------------------------------------------------------*/ + + gain_pit = 0; + gain_code = 0; + gain_preQ = 0; + unbits_PI = 0; + error = 0.0f; + + L_frame = st->L_frame; + + if ( L_frame == L_FRAME ) + { + T0_max = PIT_MAX; + T0_min = PIT_MIN; + } + else /* L_frame == L_FRAME16k */ + { + T0_max = PIT16k_MAX; + T0_min = PIT16k_MIN; + } + + lp_flag = st->acelp_cfg.ltf_mode; + *unbits = 0; + + p_Aw = Aw; + p_Aq = Aq; + pt_pitch = pitch_buf; + gain_preQ = 0; + set_f( code_preQ, 0, L_SUBFR ); + + /* set and write harmonicity flag */ + harm_flag_acelp = 0; + + if ( st->core_brate >= MIN_BRATE_AVQ_EXC && st->core_brate <= MAX_BRATE_AVQ_EXC_TD && st->coder_type == GENERIC ) + { + if ( st->last_harm_flag_acelp > 2 ) + { + harm_flag_acelp = 1; + } + + push_indice( hBstr, IND_HARM_FLAG_ACELP, harm_flag_acelp, 1 ); + } + + /*------------------------------------------------------------------* + * ACELP subframe loop + *------------------------------------------------------------------*/ + + for ( i_subfr = 0; i_subfr < L_frame; i_subfr += L_SUBFR ) + { + /*----------------------------------------------------------------* + * Find the the excitation search target "xn" and innovation + * target in residual domain "cn" + * Compute impulse response, h1[], of weighted synthesis filter + *----------------------------------------------------------------*/ + + mvr2r( &res[i_subfr], &exc[i_subfr], L_SUBFR ); + + find_targets( speech, hLPDmem->mem_syn, i_subfr, &hLPDmem->mem_w0, p_Aq, res, L_SUBFR, p_Aw, st->preemph_fac, xn, cn, h1 ); + + /*----------------------------------------------------------------* + * Close-loop pitch search and quantization + * Adaptive exc. construction + *----------------------------------------------------------------*/ + + *pt_pitch = pit_encode( hBstr, st->acelp_cfg.pitch_bits, st->core_brate, 0, L_frame, st->coder_type, &pitch_limit_flag, i_subfr, exc, L_SUBFR, st->pitch, &T0_min, &T0_max, &T0, &T0_frac, h1, xn, tdm_Pitch_reuse_flag, tdm_Pri_pitch_buf ); + + tbe_celp_exc( st->element_mode, st->idchan, bwe_exc, L_frame, L_SUBFR, i_subfr, T0, T0_frac, &error, st->tdm_LRTD_flag ); + + /*-----------------------------------------------------------------* + * Find adaptive exitation + *-----------------------------------------------------------------*/ + + pred_lt4( &exc[i_subfr], &exc[i_subfr], T0, T0_frac, L_SUBFR + 1, inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + + /*-----------------------------------------------------------------* + * Gain clipping test to avoid unstable synthesis on frame erasure + *-----------------------------------------------------------------*/ + + clip_gain = gp_clip( st->element_mode, st->core_brate, st->voicing, i_subfr, st->coder_type, xn, st->clip_var ); + + if ( st->coder_type == INACTIVE ) + { + /* in case of AVQ inactive, limit the gain to 0.65 */ + clip_gain = 2; + } + + /*-----------------------------------------------------------------* + * LP filtering of the adaptive excitation, codebook target computation + *-----------------------------------------------------------------*/ + + lp_select = lp_filt_exc_enc( MODE1, st->coder_type, i_subfr, exc, h1, xn, y1, xn2, L_SUBFR, L_frame, g_corr, clip_gain, &gain_pit, &lp_flag ); + + if ( lp_flag == NORMAL_OPERATION ) + { + push_indice( hBstr, IND_LP_FILT_SELECT, lp_select, 1 ); + } + + /* update long-term pitch gain for speech/music classifier */ + st->hSpMusClas->lowrate_pitchGain = 0.9f * st->hSpMusClas->lowrate_pitchGain + 0.1f * gain_pit; + + /*-----------------------------------------------------------------* + * Transform-domain contribution (active frames) + *-----------------------------------------------------------------*/ + + if ( st->core_brate >= MIN_BRATE_AVQ_EXC && st->coder_type != INACTIVE ) + { + transf_cdbk_enc( st, harm_flag_acelp, i_subfr, cn, exc, p_Aq, p_Aw, h1, xn, xn2, y1, y2, Es_pred, &gain_pit, gain_code, g_corr, clip_gain, &gain_preQ, code_preQ, unbits ); + } + + /*-----------------------------------------------------------------* + * Innovation encoding + *-----------------------------------------------------------------*/ + + inov_encode( st, st->core_brate, 0, L_frame, st->last_L_frame, st->coder_type, st->bwidth, st->sharpFlag, i_subfr, -1, p_Aq, gain_pit, cn, exc, h1, hLPDmem->tilt_code, *pt_pitch, xn2, code, y2, &unbits_PI, L_SUBFR ); + + /*-----------------------------------------------------------------* + * Gain encoding + *-----------------------------------------------------------------*/ + + if ( st->core_brate <= ACELP_8k00 ) + { + gain_enc_lbr( hBstr, st->acelp_cfg.gains_mode, st->coder_type, i_subfr, xn, y1, y2, code, &gain_pit, &gain_code, &gain_inov, &norm_gain_code, g_corr, gains_mem, clip_gain, L_SUBFR ); + } + else if ( st->core_brate > ACELP_32k ) + { + gain_enc_SQ( hBstr, st->acelp_cfg.gains_mode, i_subfr, xn, y1, y2, code, Es_pred, &gain_pit, &gain_code, &gain_inov, &norm_gain_code, g_corr, clip_gain ); + } + else + { + gain_enc_mless( hBstr, st->acelp_cfg.gains_mode, st->element_mode, L_frame, i_subfr, -1, xn, y1, y2, code, Es_pred, &gain_pit, &gain_code, &gain_inov, &norm_gain_code, g_corr, clip_gain ); + } + + if ( st->Opt_SC_VBR ) + { + if ( st->hSC_VBR->last_ppp_mode == 1 ) + { + /* SC-VBR - all other st->clip_var values will be updated even in a PPP frame */ + st->clip_var[1] = gain_pit; + } + } + + /*-----------------------------------------------------------------* + * update LP-filtered gains for the case of frame erasures + *-----------------------------------------------------------------*/ + + gp_clip_test_gain_pit( st->element_mode, st->core_brate, gain_pit, st->clip_var ); + + hLPDmem->tilt_code = est_tilt( exc + i_subfr, gain_pit, code, gain_code, &voice_fac, L_SUBFR, 0 ); + + /*-----------------------------------------------------------------* + * Transform-domain contribution (inactive frames) + *-----------------------------------------------------------------*/ + + if ( st->total_brate >= MAX_GSC_INACTIVE_BRATE && st->coder_type == INACTIVE ) + { + transf_cdbk_enc( st, 0, i_subfr, cn, exc, p_Aq, p_Aw, h1, xn, xn2, y1, y2, Es_pred, &gain_pit, gain_code, g_corr, clip_gain, &gain_preQ, code_preQ, unbits ); + } + + /*-----------------------------------------------------------------* + * Update memory of the weighting filter + *-----------------------------------------------------------------*/ + + hLPDmem->mem_w0 = xn[L_SUBFR - 1] - ( gain_pit * y1[L_SUBFR - 1] ) - ( gain_code * y2[L_SUBFR - 1] ); + + /*-----------------------------------------------------------------* + * Construct adaptive part of the excitation + * Save the non-enhanced excitation for FEC_exc + *-----------------------------------------------------------------*/ + + for ( i = 0; i < L_SUBFR; i++ ) + { + exc2[i + i_subfr] = gain_pit * exc[i + i_subfr]; + exc[i + i_subfr] = exc2[i + i_subfr] + gain_code * code[i]; + } + + /*-----------------------------------------------------------------* + * Add the ACELP pre-quantizer contribution + *-----------------------------------------------------------------*/ + + if ( gain_preQ != 0 ) + { + for ( i = 0; i < L_SUBFR; i++ ) + { + exc2[i + i_subfr] += gain_preQ * code_preQ[i]; + exc[i + i_subfr] += gain_preQ * code_preQ[i]; + } + } + + /*-----------------------------------------------------------------* + * Prepare TBE excitation + *-----------------------------------------------------------------*/ + + prep_tbe_exc( L_frame, L_SUBFR, i_subfr, gain_pit, gain_code, code, voice_fac, &voice_factors[i_subfr / L_SUBFR], bwe_exc, gain_preQ, code_preQ, T0, st->coder_type, st->core_brate, st->element_mode, st->idchan, st->hBWE_TD != NULL, st->tdm_LRTD_flag ); + + /*-----------------------------------------------------------------* + * Synthesize speech to update mem_syn[]. + * Update A(z) filters + *-----------------------------------------------------------------*/ + + syn_filt( p_Aq, M, &exc[i_subfr], &syn[i_subfr], L_SUBFR, hLPDmem->mem_syn, 1 ); + + p_Aw += ( M + 1 ); + p_Aq += ( M + 1 ); + pt_pitch++; + } + + /* write reserved bits */ + while ( unbits_PI > 0 ) + { + i = min( unbits_PI, 16 ); + push_indice( hBstr, IND_UNUSED, 0, i ); + unbits_PI -= i; + } + + /* SC-VBR */ + if ( st->Opt_SC_VBR ) + { + st->hSC_VBR->prev_ppp_gain_pit = gain_pit; + st->hSC_VBR->prev_tilt_code = hLPDmem->tilt_code; + } + + return; +} diff --git a/lib_enc/enc_gen_voic_rf.c b/lib_enc/enc_gen_voic_rf.c new file mode 100644 index 0000000000000000000000000000000000000000..c3a6a4f8f07d1b2eb3cea82654d86591588d142e --- /dev/null +++ b/lib_enc/enc_gen_voic_rf.c @@ -0,0 +1,398 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * reset_rf_indices() + * + * Initialization of oartial redundancy coding + *-------------------------------------------------------------------*/ + +void reset_rf_indices( + RF_ENC_HANDLE hRF, /* i/o: RF state structure */ + const int16_t L_frame, /* i : frame length */ + int16_t *rf_target_bits_write ) +{ + int16_t i, j; + + if ( hRF != NULL ) + { + hRF->rf_frame_type = 0; /* since this function is called every frame this will happen even for a SID frame, hence treating it as GSC frame, i.e no RF encoding */ + + hRF->rf_mem_w0 = 0; + set_f( hRF->rf_clip_var, 0, 6 ); + hRF->rf_tilt_code = 0; + set_f( hRF->rf_mem_syn2, 0, M ); + set_f( hRF->rf_dispMem, 0, 8 ); + hRF->rf_gc_threshold = 0; + set_f( hRF->rf_tilt_buf, 0, NB_SUBFR16k ); + + hRF->rf_target_bits = 0; + *rf_target_bits_write = 0; + hRF->rf_tcxltp_pitch_int_past = L_frame; + hRF->rf_last_tns_active = 0; + hRF->rf_second_last_tns_active = 0; + hRF->rf_second_last_core = 0; + + for ( i = 0; i < MAX_RF_FEC_OFFSET; i++ ) + { + hRF->rf_indx_frametype[i] = RF_NO_DATA; + hRF->rf_targetbits_buff[i] = 6; /* rf_mode: 1, rf_frame_type: 3, and fec_offset: 2 */ + hRF->rf_indx_lsf[i][0] = 0; + hRF->rf_indx_lsf[i][1] = 0; + hRF->rf_indx_lsf[i][2] = 0; + hRF->rf_indx_EsPred[i] = 0; + hRF->rf_indx_nelp_fid[i] = 0; + hRF->rf_indx_nelp_iG1[i] = 0; + hRF->rf_indx_nelp_iG2[i][0] = 0; + hRF->rf_indx_nelp_iG2[i][1] = 0; + + for ( j = 0; j < NB_SUBFR16k; j++ ) + { + hRF->rf_indx_ltfMode[i][j] = 0; + hRF->rf_indx_pitch[i][j] = 0; + hRF->rf_indx_fcb[i][j] = 0; + hRF->rf_indx_gain[i][j] = 0; + } + + hRF->rf_clas[i] = UNVOICED_CLAS; + hRF->rf_gain_tcx[i] = 0; + hRF->rf_tcxltp_param[i] = 0; + + hRF->rf_indx_tbeGainFr[i] = 0; + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * coder_acelp_rf() + * + * Encode excitation signal (partial redundancy) + *-------------------------------------------------------------------*/ + +void coder_acelp_rf( + const int16_t target_bits, /* i : target bits */ + const float speech[], /* i : speech[-M..lg] */ + const int16_t coder_type, /* i : coding type */ + const int16_t rf_frame_type, /* i : rf_frame_type */ + const float A[], /* i : coefficients 4xAz[M+1] */ + const float Aq[], /* i : coefficients 4xAz_q[M+1] */ + const float voicing[], /* i : open-loop LTP gain */ + const int16_t T_op[], /* i : open-loop LTP lag */ + const float stab_fac, /* i : LP stability factor */ + Encoder_State *st, /* i/o: coder memory state */ + ACELP_config *acelp_cfg, /* i/o: configuration of the ACELP */ + float *exc_rf, /* i/o: pointer to RF excitation */ + float *syn_rf /* i/o: pointer to RF synthesis */ +) +{ + int16_t i, i_subfr, nSubfr; + int16_t T0, T0_frac, T0_min, T0_min_frac, T0_max, T0_max_frac, T0_res; + float Es_pred_rf; + float gain_pit, gain_code, voice_fac; + float prev_gain_pit; + ACELP_CbkCorr g_corr; + float g_corr2[6]; + const float *p_A, *p_Aq; + float code[L_SUBFR]; + float xn[L_SUBFR], cn[L_SUBFR], h1[L_SUBFR]; + float xn2[L_SUBFR], y1[L_SUBFR], y2[L_SUBFR]; + float res_save; + float exc2[L_SUBFR]; + float exc_nelp[L_FRAME]; + float syn2[L_FRAME16k]; + float past_gcode, gain_inov; + int16_t clip_gain; + float gain_code2; + float code2[L_SUBFR]; + float y22[L_SUBFR]; + int16_t lp_select; + int16_t *prm_rf; + + RF_ENC_HANDLE hRF = st->hRF; + + /*-----------------------------------------------------------------------* + * Initialization + *------------------------------------------------------------------------*/ + past_gcode = 0; + gain_inov = 0; + T0 = 0; + T0_res = 0; + T0_frac = 0; + gain_pit = 0; + gain_code = 0; + voice_fac = 0; + prev_gain_pit = 0; + Es_pred_rf = 0; + set_f( code, 0.0f, L_SUBFR ); + + /*-----------------------------------------------------------------------* + * Configure ACELP partial copy * + *-----------------------------------------------------------------------*/ + + BITS_ALLOC_config_acelp( target_bits, rf_frame_type, &( hRF->acelp_cfg_rf ), 0, st->nb_subfr ); + + /* Reset phase dispersion */ + if ( st->last_core > ACELP_CORE ) + { + set_zero( hRF->rf_dispMem, 8 ); + } + + /*---------------------------------------------------------------* + * Calculation of LP residual (filtering through A[z] filter) + *---------------------------------------------------------------*/ + + calc_residu( speech, exc_rf, Aq, st->L_frame ); + + /*------------------------------------------------------------------------* + * Find and quantize mean_ener_code for gain quantizer * + *------------------------------------------------------------------------*/ + + Es_pred_rf = 0; + if ( acelp_cfg->nrg_mode > 0 && rf_frame_type != RF_NELP ) + { + Es_pred_enc( &Es_pred_rf, &hRF->rf_indx_EsPred[0], st->L_frame, L_SUBFR, exc_rf, voicing, acelp_cfg->nrg_bits, acelp_cfg->nrg_mode > 1 ); + } + + /*------------------------------------------------------------------* + * ACELP subframe loop + *------------------------------------------------------------------*/ + + p_A = A; + p_Aq = Aq; + + res_save = exc_rf[0]; + nSubfr = 0; + + for ( i_subfr = 0; i_subfr < st->L_frame; i_subfr += L_SUBFR ) + { + if ( rf_frame_type != RF_NELP ) + { + /* Restore exc[i_subfr] and save next exc[L_SUBFR+i_subfr] */ + exc_rf[i_subfr] = res_save; + res_save = exc_rf[L_SUBFR + i_subfr]; + + /*--------------------------------------------------------------------------* + * Find target for pitch search (xn[]), target for innovation search (cn[]) * + * and impulse response of the weighted synthesis filter (h1[]). * + *--------------------------------------------------------------------------*/ + + find_targets( speech, &syn_rf[i_subfr - M], i_subfr, &( hRF->rf_mem_w0 ), p_Aq, exc_rf, L_SUBFR, p_A, st->preemph_fac, xn, cn, h1 ); + } + + /* full frame nelp partial copy encoding */ + if ( rf_frame_type == RF_NELP ) + { + if ( i_subfr == 0 ) + { + nelp_encoder( st, exc_rf, exc_nelp, 0 ); + } + mvr2r( &exc_nelp[i_subfr], exc2, L_SUBFR ); + mvr2r( &exc_nelp[i_subfr], exc_rf, L_SUBFR ); + } + else + { + /*-----------------------------------------------------------------* + * Gain clipping test to avoid unstable synthesis on frame erasure + * or in case of floating point encoder & fixed p. decoder + *-----------------------------------------------------------------*/ + + clip_gain = gp_clip( st->element_mode, st->core_brate, voicing, i_subfr, coder_type, xn, hRF->rf_clip_var ); + + /*-----------------------------------------------------------------* + * - find unity gain pitch excitation (adaptive codebook entry) * + * with fractional interpolation. * + * - find filtered pitch exc. y1[]=exc[] convolved with h1[]) * + * - compute pitch gain1 * + *-----------------------------------------------------------------*/ + + if ( acelp_cfg->gains_mode[i_subfr / L_SUBFR] == 0 ) + { + gain_pit = prev_gain_pit; + } + + if ( acelp_cfg->ltp_bits != 0 ) + { + prm_rf = &hRF->rf_indx_pitch[0][nSubfr]; + + /* Adaptive Codebook (GC and VC) */ + Mode2_pit_encode( acelp_cfg->ltp_mode, i_subfr, &prm_rf, &exc_rf[i_subfr], T_op, &T0_min, &T0_min_frac, &T0_max, &T0_max_frac, &T0, &T0_frac, &T0_res, h1, xn, st->pit_min, st->pit_fr1, st->pit_fr1b, st->pit_fr2, st->pit_max, st->pit_res_max ); + + /* find ACB excitation */ + if ( T0_res == ( st->pit_res_max >> 1 ) ) /* st->pit_res_max is 4 for 12.8kHz core */ + { + pred_lt4( &exc_rf[i_subfr], &exc_rf[i_subfr], T0, T0_frac << 1, L_SUBFR + 1, inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + } + else + { + pred_lt4( &exc_rf[i_subfr], &exc_rf[i_subfr], T0, T0_frac, L_SUBFR + 1, inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + } + + + /* filter adaptive codebook */ + lp_select = lp_filt_exc_enc( MODE2, ( acelp_cfg->gains_mode[i_subfr / L_SUBFR] > 0 ) ? ( acelp_cfg->gains_mode[i_subfr / L_SUBFR] ) : ( 100 ), i_subfr, exc_rf, h1, xn, y1, xn2, L_SUBFR, st->L_frame, g_corr2, clip_gain, &( gain_pit ), &( acelp_cfg->ltf_mode ) ); + + if ( acelp_cfg->ltf_mode == NORMAL_OPERATION ) + { + hRF->rf_indx_ltfMode[0][nSubfr] = lp_select; + } + + g_corr.y1y1 = g_corr2[0]; + g_corr.xy1 = -0.5f * ( g_corr2[1] - 0.01f ) + 0.01f; + } + else + { + gain_pit = 0.f; + g_corr.xy1 = 0.f; + g_corr.y1y1 = 0.f; + set_zero( y1, L_SUBFR ); + set_zero( exc_rf + i_subfr, L_SUBFR ); + T0 = L_SUBFR; + T0_frac = 0; + T0_res = 1; + } + + /*----------------------------------------------------------------------* + * Encode the algebraic innovation * + *----------------------------------------------------------------------*/ + + if ( acelp_cfg->fixed_cdk_index[i_subfr / L_SUBFR] >= 0 ) + { + prm_rf = &hRF->rf_indx_fcb[0][nSubfr]; + E_ACELP_innovative_codebook( exc_rf, T0, T0_frac, T0_res, gain_pit, hRF->rf_tilt_code, acelp_cfg, i_subfr, p_Aq, h1, xn, cn, y1, y2, st->acelp_autocorr, &prm_rf, code, st->L_frame, st->last_L_frame, st->total_brate ); + } + else + { + set_f( code, 0.0f, L_SUBFR ); + set_f( y2, 0.0f, L_SUBFR ); + } + + if ( i_subfr < ( st->L_frame - L_SUBFR ) ) + { + E_corr_xy2( xn, y1, y2, g_corr2, L_SUBFR ); + g_corr.y2y2 = 0.01F + g_corr2[2]; + g_corr.xy2 = 0.01F + -0.5f * g_corr2[3]; + g_corr.y1y2 = 0.01F + 0.5f * g_corr2[4]; + + g_corr.xx = 0.01F + dotp( xn, xn, L_SUBFR ); + + /*----------------------------------------------------------------------* + * Add Gaussian excitation * + *----------------------------------------------------------------------*/ + + gain_code2 = 0.f; + set_zero( code2, L_SUBFR ); + set_zero( y22, L_SUBFR ); + + /*----------------------------------------------------------* + * - Compute the fixed codebook gain * + * - quantize fixed codebook gain * + *----------------------------------------------------------*/ + + if ( acelp_cfg->gains_mode[i_subfr / L_SUBFR] != 0 ) + { + prm_rf = &hRF->rf_indx_gain[0][nSubfr]; + encode_acelp_gains( code, acelp_cfg->gains_mode[i_subfr / L_SUBFR], Es_pred_rf, clip_gain, &g_corr, &gain_pit, &gain_code, &prm_rf, &past_gcode, &gain_inov, L_SUBFR, code2, &gain_code2, st->flag_noisy_speech_snr ); + } + + gp_clip_test_gain_pit( st->element_mode, st->core_brate, gain_pit, hRF->rf_clip_var ); + + /*----------------------------------------------------------* + * - voice factor (for codebook tilt sharpening) * + *----------------------------------------------------------*/ + + hRF->rf_tilt_code = est_tilt( exc_rf + i_subfr, gain_pit, code, gain_code, &voice_fac, L_SUBFR, acelp_cfg->voice_tilt ); + + /*-----------------------------------------------------------------* + * Update memory of the weighting filter + *-----------------------------------------------------------------*/ + + hRF->rf_mem_w0 = xn[L_SUBFR - 1] - gain_pit * y1[L_SUBFR - 1] - gain_code * y2[L_SUBFR - 1] - gain_code2 * y22[L_SUBFR - 1]; + + /*-------------------------------------------------------* + * - Find the total excitation. * + *-------------------------------------------------------*/ + + for ( i = 0; i < L_SUBFR; i++ ) + { + exc2[i] = gain_pit * exc_rf[i + i_subfr]; + exc2[i] += gain_code2 * code2[i]; + exc_rf[i + i_subfr] = exc2[i] + gain_code * code[i]; + } + + /*---------------------------------------------------------* + * Enhance the excitation * + *---------------------------------------------------------*/ + + enhancer( MODE2, -1, acelp_cfg->fixed_cdk_index[i_subfr / L_SUBFR], 0, coder_type, st->L_frame, voice_fac, stab_fac, past_gcode, gain_inov, &hRF->rf_gc_threshold, code, exc2, gain_pit, hRF->rf_dispMem ); + } + } + + if ( ( i_subfr < ( st->L_frame - L_SUBFR ) ) || ( rf_frame_type != RF_NELP ) ) + { + /*----------------------------------------------------------* + * - compute the synthesis speech * + *----------------------------------------------------------*/ + + syn_filt( p_Aq, M, exc2, &syn2[i_subfr], L_SUBFR, hRF->rf_mem_syn2, 1 ); + + syn_filt( p_Aq, M, &exc_rf[i_subfr], &syn_rf[i_subfr], L_SUBFR, &syn_rf[i_subfr - M], 0 ); + + /*----------------------------------------------------------* + * Updates * + *----------------------------------------------------------*/ + + p_A += ( M + 1 ); + p_Aq += ( M + 1 ); + nSubfr++; + + /* copy current gain for next subframe use, in case there is no explicit encoding */ + prev_gain_pit = gain_pit; + } + + } /* end of subframe loop */ + + return; +} diff --git a/lib_enc/enc_higher_acelp.c b/lib_enc/enc_higher_acelp.c new file mode 100644 index 0000000000000000000000000000000000000000..bd68e5d68264e9475209f59b40731ecd85c79213 --- /dev/null +++ b/lib_enc/enc_higher_acelp.c @@ -0,0 +1,391 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*---------------------------------------------------------------------* + * Local function prototypes + *---------------------------------------------------------------------*/ + +static void find_cn( const float xn[], const float Ap[], const float *p_Aq, float cn[] ); + + +/*-----------------------------------------------------------------* + * transf_cdbk_enc() + * + * Transform domain contribution encoding + *-----------------------------------------------------------------*/ + +void transf_cdbk_enc( + Encoder_State *st, /* i/o: encoder state structure */ + const int16_t harm_flag_acelp, /* i : harmonic flag for higher rates ACELP */ + const int16_t i_subfr, /* i : subframe index */ + float cn[], /* i/o: target vector in residual domain */ + float exc[], /* i/o: pointer to excitation signal frame */ + const float *p_Aq, /* i : 12k8 Lp coefficient */ + const float Ap[], /* i : weighted LP filter coefficients */ + const float h1[], /* i : weighted filter input response */ + float xn[], /* i/o: target vector */ + float xn2[], /* i/o: target vector for innovation search */ + float y1[], /* i/o: zero-memory filtered adaptive excitation */ + const float y2[], /* i : zero-memory filtered innovative excitation */ + const float Es_pred, /* i : predicited scaled innovation energy */ + float *gain_pit, /* i/o: adaptive excitation gain */ + const float gain_code, /* i : innovative excitation gain */ + float g_corr[], /* o : ACELP correlation values */ + const int16_t clip_gain, /* i : adaptive gain clipping flag */ + float *gain_preQ, /* o : prequantizer excitation gain */ + float code_preQ[], /* o : prequantizer excitation */ + int16_t *unbits /* o : number of AVQ unused bits */ +) +{ + int16_t i, index, nBits, Nsv; + float x_in[L_SUBFR], x_tran[L_SUBFR], temp; + int16_t x_norm[L_SUBFR + L_SUBFR / WIDTH_BAND]; + float corr, ener; + int16_t nq[L_SUBFR / WIDTH_BAND]; + int16_t avq_bit_sFlag; + int16_t trgtSvPos; + + avq_bit_sFlag = 0; + if ( st->element_mode > EVS_MONO ) + { + avq_bit_sFlag = 1; + } + + /*--------------------------------------------------------------* + * Set bit-allocation + *--------------------------------------------------------------*/ + + Nsv = 8; + nBits = st->acelp_cfg.AVQ_cdk_bits[i_subfr / L_SUBFR]; + + /* increase # of AVQ allocated bits by unused bits from the previous subframe */ + nBits += ( *unbits ); + + /*--------------------------------------------------------------* + * Compute/Update target + * For inactive frame, find target in residual domain + * Deemphasis + *--------------------------------------------------------------*/ + + if ( st->coder_type == INACTIVE ) + { + for ( i = 0; i < L_SUBFR; i++ ) + { + x_tran[i] = xn[i] - *gain_pit * y1[i] - gain_code * y2[i]; + } + + find_cn( x_tran, Ap, p_Aq, x_in ); + } + else + { + updt_tar( cn, x_in, &exc[i_subfr], *gain_pit, L_SUBFR ); + } + + deemph( x_in, FAC_PRE_AVQ, L_SUBFR, &st->mem_deemp_preQ ); + + /*--------------------------------------------------------------* + * DCT-II + *--------------------------------------------------------------*/ + + if ( st->coder_type != INACTIVE && st->core_brate >= MIN_BRATE_AVQ_EXC && st->core_brate <= MAX_BRATE_AVQ_EXC_TD && !harm_flag_acelp ) + { + mvr2r( x_in, x_tran, L_SUBFR ); + } + else + { + edct2( L_SUBFR, -1, x_in, x_tran, ip_edct2_64, w_edct2_64 ); + } + + /*--------------------------------------------------------------* + * Split algebraic vector quantizer based on RE8 lattice + *--------------------------------------------------------------*/ + + AVQ_cod( x_tran, x_norm, nBits, Nsv ); + + /*--------------------------------------------------------------* + * Find prequantizer excitation gain + * Quantize the gain + *--------------------------------------------------------------*/ + + corr = 0; + ener = 1e-6f; + + for ( i = 0; i < Nsv * 8; i++ ) + { + corr += x_tran[i] * (float) x_norm[i]; + ener += (float) x_norm[i] * (float) x_norm[i]; + } + + *gain_preQ = corr / ener; + + if ( st->coder_type == INACTIVE ) + { + *gain_preQ /= gain_code; + + if ( st->core_brate > 56000 ) + { + index = usquant( *gain_preQ, gain_preQ, G_AVQ_MIN_INACT_64k, G_AVQ_DELTA_INACT_64k, ( 1 << G_AVQ_BITS ) ); + } + else if ( st->core_brate > 42000 ) + { + index = usquant( *gain_preQ, gain_preQ, G_AVQ_MIN_INACT_48k, G_AVQ_DELTA_INACT_48k, ( 1 << G_AVQ_BITS ) ); + } + else + { + index = usquant( *gain_preQ, gain_preQ, G_AVQ_MIN_INACT, G_AVQ_DELTA_INACT, ( 1 << G_AVQ_BITS ) ); + } + + *gain_preQ *= gain_code; + } + else + { + if ( Es_pred < 0 ) + { + temp = (float) ( 0.25f * fabs( Es_pred ) ); + } + else + { + temp = Es_pred; + } + *gain_preQ /= temp; + + if ( st->core_brate > ACELP_24k40 && st->core_brate <= 42000 ) + { + index = gain_quant( gain_preQ, 0.1f * G_AVQ_MIN, G_AVQ_MAX, G_AVQ_BITS ); + } + else + { + index = gain_quant( gain_preQ, G_AVQ_MIN, G_AVQ_MAX, G_AVQ_BITS ); + } + *gain_preQ *= temp; + } + + push_indice( st->hBstr, IND_AVQ_GAIN, index, G_AVQ_BITS ); + + /*--------------------------------------------------------------* + * Encode and multiplex subvectors into bitstream + *--------------------------------------------------------------*/ + + trgtSvPos = Nsv - 1; + if ( avq_bit_sFlag && nBits > 85 && !harm_flag_acelp && ( st->coder_type == GENERIC || st->coder_type == TRANSITION || st->coder_type == INACTIVE ) ) + { + trgtSvPos = 2; + avq_bit_sFlag = 2; + } + + AVQ_encmux( st->hBstr, -1, x_norm, &nBits, Nsv, nq, avq_bit_sFlag, trgtSvPos ); + + /* save # of AVQ unused bits for next subframe */ + *unbits = nBits; + + /* at the last subframe, write AVQ unused bits */ + if ( i_subfr == 4 * L_SUBFR && st->extl != SWB_BWE_HIGHRATE && st->extl != FB_BWE_HIGHRATE ) + { + while ( *unbits > 0 ) + { + i = min( *unbits, 16 ); + push_indice( st->hBstr, IND_UNUSED, 0, i ); + *unbits -= i; + } + } + + /*--------------------------------------------------------------* + * DCT transform + *--------------------------------------------------------------*/ + + for ( i = 0; i < Nsv * WIDTH_BAND; i++ ) + { + x_tran[i] = (float) ( x_norm[i] ); + } + + set_f( x_tran + Nsv * WIDTH_BAND, 0.0f, L_SUBFR - WIDTH_BAND * Nsv ); + + if ( st->coder_type != INACTIVE && st->core_brate >= MIN_BRATE_AVQ_EXC && st->core_brate <= MAX_BRATE_AVQ_EXC_TD && !harm_flag_acelp ) + { + mvr2r( x_tran, code_preQ, L_SUBFR ); + } + else + { + edct2( L_SUBFR, 1, x_tran, code_preQ, ip_edct2_64, w_edct2_64 ); + } + + /*--------------------------------------------------------------* + * Preemphasise + *--------------------------------------------------------------*/ + + /* in extreme cases at subframe boundaries, lower the preemphasis memory to avoid a saturation */ + if ( ( nq[7] != 0 ) && ( st->last_nq_preQ - nq[0] > 7 ) ) + { + st->mem_preemp_preQ /= 16; + } + + st->last_nq_preQ = nq[7]; + + /* TD pre-quantizer: in extreme cases at subframe boundaries, lower the preemphasis memory to avoid a saturation */ + if ( st->element_mode > EVS_MONO && st->coder_type != INACTIVE && st->core_brate >= MIN_BRATE_AVQ_EXC && st->core_brate <= MAX_BRATE_AVQ_EXC_TD && !harm_flag_acelp && code_preQ[0] != 0 ) + { + if ( (float) abs( st->last_code_preq ) > 16.0f * (float) fabs( code_preQ[0] ) ) + { + st->mem_preemp_preQ /= 16; + } + else if ( (float) abs( st->last_code_preq ) > 8.0f * (float) fabs( code_preQ[0] ) ) + { + st->mem_preemp_preQ /= 8; + } + } + + st->last_code_preq = (int16_t) code_preQ[L_SUBFR - 1]; + + preemph( code_preQ, FAC_PRE_AVQ, L_SUBFR, &st->mem_preemp_preQ ); + + /*--------------------------------------------------------------* + * For inactive segments + * - Zero-memory filtered pre-filter excitation + * - Update of targets and gain_pit + * For active segments + * - Update xn[L_subfr-1] for updating the memory of the weighting filter + *--------------------------------------------------------------*/ + + if ( st->coder_type == INACTIVE ) + { + temp = code_preQ[0] * h1[L_SUBFR - 1]; + + for ( i = 1; i < L_SUBFR; i++ ) + { + temp += code_preQ[i] * h1[L_SUBFR - 1 - i]; + } + + xn[L_SUBFR - 1] -= *gain_preQ * temp; + } + else + { + conv( code_preQ, h1, x_tran, L_SUBFR ); + + updt_tar( cn, cn, code_preQ, *gain_preQ, L_SUBFR ); + updt_tar( xn, xn, x_tran, *gain_preQ, L_SUBFR ); + + *gain_pit = corr_xy1( xn, y1, g_corr, L_SUBFR, 0 ); + + /* clip gain if necessary to avoid problems at decoder */ + if ( clip_gain == 1 && *gain_pit > 0.95f ) + { + *gain_pit = 0.95f; + } + + updt_tar( xn, xn2, y1, *gain_pit, L_SUBFR ); + } + + st->use_acelp_preq = 1; + + return; +} + +/*-------------------------------------------------------------------* + * Find target in residual domain - cn[] + *-------------------------------------------------------------------*/ + +static void find_cn( + const float xn[], /* i : target signal */ + const float Ap[], /* i : weighted LP filter coefficients */ + const float *p_Aq, /* i : 12k8 LP coefficients */ + float cn[] /* o : target signal in residual domain */ +) +{ + float tmp, tmp_fl[L_SUBFR + M]; + + set_f( tmp_fl, 0, M ); + mvr2r( xn, tmp_fl + M, L_SUBFR ); + tmp = 0.0f; + + preemph( tmp_fl + M, PREEMPH_FAC_16k, L_SUBFR, &tmp ); + syn_filt( Ap, M, tmp_fl + M, tmp_fl + M, L_SUBFR, tmp_fl, 0 ); + residu( p_Aq, M, tmp_fl + M, cn, L_SUBFR ); + + return; +} + +/*---------------------------------------------------------------* + * gain_quant() + * + * Quantization of gains between the specified range + * using the specified number of levels. + *---------------------------------------------------------------*/ + +/*! r: quantization index */ +int16_t gain_quant( + float *gain, /* i/o: quantized gain */ + const float min_val, /* i : value of lower limit */ + const float max_val, /* i : value of upper limit */ + const int16_t bits /* i : number of bits to quantize */ +) +{ + int16_t index, levels; + float tmp, c_min, c_mult; + + levels = 1 << bits; + + if ( *gain < FLT_MIN ) + { + *gain = FLT_MIN; + } + + c_min = (float) log10( min_val ); + c_mult = (float) ( ( levels - 1 ) / ( log10( max_val ) - c_min ) ); + + tmp = c_mult * ( (float) log10( *gain ) - c_min ); + index = (int16_t) ( tmp + 0.5f ); + + if ( index < 0 ) + { + index = 0; + } + if ( index > levels - 1 ) + { + index = levels - 1; + } + + *gain = (float) pow( 10.0, ( ( (float) index ) / c_mult ) + c_min ); + + return ( index ); +} diff --git a/lib_enc/enc_nelp.c b/lib_enc/enc_nelp.c new file mode 100644 index 0000000000000000000000000000000000000000..253a97a9b5831d5a4b4388469f083837bbb06caf --- /dev/null +++ b/lib_enc/enc_nelp.c @@ -0,0 +1,148 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * encod_nelp() + * + * Encode Unvoiced frames in SC-VBR + *-------------------------------------------------------------------*/ + +void encod_nelp( + Encoder_State *st, /* i/o: state structure */ + const float *speech, /* i : input speech */ + const float Aw[], /* i : weighted A(z) unquantized for subframes */ + const float *Aq, /* i : 12k8 Lp coefficient */ + float *res, /* o : residual signal */ + float *synth, /* o : core synthesis */ + float *tmp_noise, /* o : long-term noise energy */ + float *exc, /* i/o: current non-enhanced excitation */ + float *exc2, /* i/o: current enhanced excitation */ + float *pitch_buf, /* o : floating pitch values for each subframe */ + float *voice_factors, /* o : voicing factors */ + float *bwe_exc /* o : excitation for SWB TBE */ +) +{ + float xn[L_SUBFR]; /* Target vector for pitch search */ + float h1[L_SUBFR]; /* Impulse response vector */ + float exc_nelp[L_FRAME]; + const float *p_Aw, *p_Aq; /* pointer to LP filter coeff. vector */ + int16_t i_subfr, j; + + LPD_state_HANDLE hLPDmem = st->hLPDmem; + SC_VBR_ENC_HANDLE hSC_VBR = st->hSC_VBR; + + int16_t reduce_gains = 0; + + if ( st->bwidth == NB && st->input_Fs >= 16000 ) + { + if ( hSC_VBR->last_nelp_mode == 0 ) + { + set_f( hSC_VBR->nelp_lp_fit_mem, 0, NELP_LP_ORDER * 2 ); + } + polezero_filter( res, res, L_FRAME, num_nelp_lp, den_nelp_lp, NELP_LP_ORDER, hSC_VBR->nelp_lp_fit_mem ); /*16-Q of filter coeff*/ + } + + p_Aw = Aw; + p_Aq = Aq; + + for ( i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR ) + { + /*----------------------------------------------------------------* + * - Find the excitation search target "xn" and innovation + * target in residual domain "cn" + * - Compute impulse response, h1[], of weighted synthesis filter + *----------------------------------------------------------------*/ + mvr2r( &res[i_subfr], &exc[i_subfr], L_SUBFR ); + + find_targets( speech, hLPDmem->mem_syn, i_subfr, &hLPDmem->mem_w0, p_Aq, res, L_SUBFR, p_Aw, TILT_FAC, xn, NULL, h1 ); + + if ( i_subfr == 0 ) + { + if ( hSC_VBR->Local_VAD == 1 && st->bwidth == NB ) + { + reduce_gains = 1; + } + + nelp_encoder( st, res, exc_nelp, reduce_gains ); + } + *tmp_noise = 0; + + /*-----------------------------------------------------------------* + * Synthesize speech to update mem_syn[]. + * Update A(z) filters + *-----------------------------------------------------------------*/ + + syn_filt( p_Aq, M, &exc_nelp[i_subfr], &synth[i_subfr], L_SUBFR, hLPDmem->mem_syn, 1 ); + + p_Aw += ( M + 1 ); + p_Aq += ( M + 1 ); + *pitch_buf = L_SUBFR; + pitch_buf++; + } + + mvr2r( exc_nelp, exc, L_FRAME ); + + /*-----------------------------------------------------------------* + * Updates: last value of new target is stored in mem_w0 + *-----------------------------------------------------------------*/ + + hLPDmem->mem_w0 = xn[L_SUBFR - 1] - ( exc[L_FRAME - 1] ); + hLPDmem->tilt_code = 0.0f; /* purely unvoiced */ + hSC_VBR->prev_tilt_code = hLPDmem->tilt_code; + + mvr2r( exc, exc2, L_FRAME ); + + hSC_VBR->prev_ppp_gain_pit = 0.0; + hLPDmem->dispMem[0] = 0; + hLPDmem->dispMem[2] = hSC_VBR->prev_ppp_gain_pit; + + for ( j = 3; j < 7; j++ ) + { + hLPDmem->dispMem[j] = hLPDmem->dispMem[j - 1]; + } + + interp_code_5over2( exc2, bwe_exc, L_FRAME ); + set_f( voice_factors, 0.0f, NB_SUBFR16k ); + + return; +} diff --git a/lib_enc/enc_pit_exc.c b/lib_enc/enc_pit_exc.c new file mode 100644 index 0000000000000000000000000000000000000000..b640e0b416c689a55e70bc1a30859aeb7e50b105 --- /dev/null +++ b/lib_enc/enc_pit_exc.c @@ -0,0 +1,414 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * enc_pit_exc() + * + * Encode pitch only contribution + *-------------------------------------------------------------------*/ + +void enc_pit_exc( + Encoder_State *st, /* i/o: State structure */ + const float *speech, /* i : Input speech */ + const float Aw[], /* i : weighted A(z) unquantized for subframes */ + const float *Aq, /* i : 12k8 Lp coefficient */ + const float Es_pred, /* i : predicted scaled innov. energy */ + const float *res, /* i : residual signal */ + float *synth, /* i/o: core synthesis */ + float *exc, /* i/o: current non-enhanced excitation */ + int16_t *T0, /* i/o: close loop integer pitch */ + int16_t *T0_frac, /* i/o: close-loop pitch period - fractional part */ + float *pitch_buf, /* i/o: Fractionnal per subframe pitch */ + const int16_t nb_subfr, /* i : Number of subframe considered */ + float *gpit, /* o : pitch mean gpit */ + const int16_t tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag */ + const float tdm_Pri_pitch_buf[] /* i : primary channel pitch buffer */ +) +{ + float xn[PIT_EXC_L_SUBFR]; /* Target vector for pitch search */ + float xn2[PIT_EXC_L_SUBFR]; /* Target vector for codebook search */ + float cn[PIT_EXC_L_SUBFR]; /* Target vector in residual domain */ + float h1[PIT_EXC_L_SUBFR + ( M + 1 )]; /* Impulse response vector */ + float y1[PIT_EXC_L_SUBFR]; /* Filtered adaptive excitation */ + float code[2 * L_SUBFR]; /* Fixed codebook excitation */ + float y2[2 * L_SUBFR]; /* Filtered algebraic excitation */ + float voice_fac; /* Voicing factor */ + float gain_code; /* Gain of code */ + float gain_inov; /* inovation gain */ + float gain_pit; /* Pitch gain */ + int16_t pit_idx, i_subfr; /* tmp variables */ + int16_t T0_min, T0_max; /* pitch variables */ + float g_corr[10]; /* ACELP correlation values + gain pitch */ + int16_t clip_gain, i; /* LSF clip gain and LP flag */ + const float *p_Aw, *p_Aq; /* pointer to LP filter coefficient vector */ + float *pt_pitch; /* pointer to floating pitch */ + int16_t L_subfr; + float cum_gpit, gpit_tmp; + int32_t Local_BR, Pitch_BR; + int16_t Pitch_CT, unbits_PI; + float norm_gain_code; + int16_t pitch_limit_flag; + int16_t lp_select, lp_flag; + BSTR_ENC_HANDLE hBstr = st->hBstr; + int16_t use_fcb; + float gains_mem[2 * ( NB_SUBFR - 1 )]; /* pitch gain and code gain from previous subframes */ + + LPD_state_HANDLE hLPDmem = st->hLPDmem; + + /*------------------------------------------------------------------* + * Initialization + *------------------------------------------------------------------*/ + + pitch_limit_flag = 1; /* always extended pitch Q range */ + use_fcb = 0; + unbits_PI = 0; + + if ( st->GSC_IVAS_mode > 0 && ( st->GSC_noisy_speech || st->core_brate > GSC_H_RATE_STG ) ) + { + Local_BR = ACELP_8k00; + Pitch_CT = GENERIC; + Pitch_BR = ACELP_8k00; + if ( st->L_frame == L_FRAME16k ) + { + Local_BR = ACELP_14k80; + if ( st->GSC_IVAS_mode > 0 ) + { + Local_BR = ACELP_9k60; + } + Pitch_BR = st->core_brate; + } + } + else if ( st->GSC_noisy_speech ) + { + Local_BR = ACELP_7k20; + Pitch_CT = GENERIC; + Pitch_BR = ACELP_7k20; + if ( st->L_frame == L_FRAME16k ) + { + Pitch_BR = st->core_brate; + } + } + else + { + Local_BR = ACELP_7k20; + Pitch_CT = AUDIO; + Pitch_BR = st->core_brate; + + if ( st->L_frame == L_FRAME16k ) + { + Local_BR = ACELP_13k20; + Pitch_CT = GENERIC; + } + } + + gain_code = 0; + + if ( st->L_frame == L_FRAME16k ) + { + T0_max = PIT16k_MAX; + T0_min = PIT16k_MIN; + } + else + { + T0_max = PIT_MAX; + T0_min = PIT_MIN; + } + + cum_gpit = 0.0f; + + L_subfr = st->L_frame / nb_subfr; + + lp_flag = st->acelp_cfg.ltf_mode; + + if ( ( ( st->core_brate >= MIN_RATE_FCB || ( st->GSC_noisy_speech == 1 && ( ( st->L_frame == L_FRAME && st->core_brate >= ACELP_13k20 ) || ( st->L_frame == L_FRAME16k && st->core_brate >= GSC_H_RATE_STG ) || st->GSC_IVAS_mode == 0 ) ) ) && L_subfr == L_SUBFR ) ) + { + use_fcb = 1; + } + else if ( st->GSC_IVAS_mode > 0 && L_subfr == 2 * L_SUBFR && st->GSC_IVAS_mode < 3 ) + { + use_fcb = 2; + st->acelp_cfg.fcb_mode = 1; + set_s( st->acelp_cfg.gains_mode, 6, NB_SUBFR ); + set_s( st->acelp_cfg.pitch_bits, 9, NB_SUBFR ); + set_s( st->acelp_cfg.fixed_cdk_index, 14, NB_SUBFR16k ); + } + + /*------------------------------------------------------------------* + * ACELP subframe loop + *------------------------------------------------------------------*/ + + p_Aw = Aw; + p_Aq = Aq; + pt_pitch = pitch_buf; /* pointer to the pitch buffer */ + + for ( i_subfr = 0; i_subfr < st->L_frame; i_subfr += L_subfr ) + { + /*----------------------------------------------------------------* + * Find the the excitation search target "xn" and innovation + * target in residual domain "cn" + * Compute impulse response, h1[], of weighted synthesis filter + *----------------------------------------------------------------*/ + + mvr2r( &res[i_subfr], &exc[i_subfr], L_subfr ); + + find_targets( speech, st->hGSCEnc->mem_syn_tmp, i_subfr, &st->hGSCEnc->mem_w0_tmp, p_Aq, res, L_subfr, p_Aw, st->preemph_fac, xn, cn, h1 ); + + /*----------------------------------------------------------------* + * Close-loop pitch search and quantization + * Adaptive exc. construction + *----------------------------------------------------------------*/ + + *pt_pitch = pit_encode( hBstr, st->acelp_cfg.pitch_bits, Pitch_BR, 0, st->L_frame, Pitch_CT, &pitch_limit_flag, i_subfr, exc, L_subfr, st->pitch, &T0_min, &T0_max, T0, T0_frac, h1, xn, tdm_Pitch_reuse_flag, tdm_Pri_pitch_buf ); + + /*-----------------------------------------------------------------* + * Find adaptive exitation + *-----------------------------------------------------------------*/ + + pred_lt4( &exc[i_subfr], &exc[i_subfr], *T0, *T0_frac, L_subfr + 1, inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + + /*-----------------------------------------------------------------* + * Gain clipping test to avoid unstable synthesis on frame erasure + * or in case of floating point encoder & fixed p. decoder + *-----------------------------------------------------------------*/ + + clip_gain = gp_clip( st->element_mode, st->core_brate, st->voicing, i_subfr, AUDIO, xn, st->clip_var ); + + /*-----------------------------------------------------------------* + * Codebook target computation + * (No LP filtering of the adaptive excitation) + *-----------------------------------------------------------------*/ + + lp_select = lp_filt_exc_enc( MODE1, AUDIO, i_subfr, exc, h1, xn, y1, xn2, L_subfr, st->L_frame, g_corr, clip_gain, &gain_pit, &lp_flag ); + + if ( lp_flag == NORMAL_OPERATION ) + { + push_indice( hBstr, IND_LP_FILT_SELECT, lp_select, 1 ); + } + + /* update long-term pitc hgain for speech/music classifier */ + st->hSpMusClas->lowrate_pitchGain = 0.9f * st->hSpMusClas->lowrate_pitchGain + 0.1f * gain_pit; + + gpit_tmp = gain_pit; + + if ( use_fcb == 0 ) + { + if ( st->core_brate >= MIN_RATE_FCB ) + { + pit_idx = (int16_t) vquant( &gain_pit, mean_gp, &gain_pit, dic_gp, 1, 32 ); + push_indice( hBstr, IND_PIT_IDX, pit_idx, 5 ); + } + else + { + pit_idx = (int16_t) vquant( &gain_pit, mean_gp, &gain_pit, dic_gp, 1, 16 ); + push_indice( hBstr, IND_PIT_IDX, pit_idx, 4 ); + } + } + else if ( use_fcb == 2 ) + { + /*-----------------------------------------------------------------* + * Innovation encoding + *-----------------------------------------------------------------*/ + + inov_encode( st, st->core_brate, 0, st->L_frame, st->last_L_frame, GENERIC, st->bwidth, 0, i_subfr, -1, p_Aq, gain_pit, cn, exc, h1, hLPDmem->tilt_code, *pt_pitch, xn2, code, y2, &i, 2 * L_SUBFR ); + + /*-----------------------------------------------------------------* + * Gain encoding + *-----------------------------------------------------------------*/ + + gain_enc_lbr( st->hBstr, st->acelp_cfg.gains_mode, GENERIC, i_subfr, xn, y1, y2, code, &gain_pit, &gain_code, &gain_inov, &norm_gain_code, g_corr, gains_mem, clip_gain, 2 * L_SUBFR ); + } + else + { + /*-----------------------------------------------------------------* + * Innovation & gain encoding + *-----------------------------------------------------------------*/ + + inov_encode( st, Local_BR, 0, st->L_frame, st->last_L_frame, LOCAL_CT, WB, 1, i_subfr, -1, p_Aq, gain_pit, cn, exc, h1, hLPDmem->tilt_code, *pt_pitch, xn2, code, y2, &unbits_PI, L_SUBFR ); + + gain_enc_mless( hBstr, st->acelp_cfg.gains_mode, st->element_mode, st->L_frame, i_subfr, -1, xn, y1, y2, code, Es_pred, &gain_pit, &gain_code, &gain_inov, &norm_gain_code, g_corr, clip_gain ); + } + + gp_clip_test_gain_pit( st->element_mode, st->core_brate, gain_pit, st->clip_var ); + + if ( use_fcb != 0 ) + { + hLPDmem->tilt_code = est_tilt( exc + i_subfr, gain_pit, code, gain_code, &voice_fac, L_subfr, 0 ); + } + else + { + hLPDmem->tilt_code = 0.0f; + } + + /*-----------------------------------------------------------------* + * Update memory of the weighting filter + *-----------------------------------------------------------------*/ + + if ( use_fcb != 0 ) + { + st->hGSCEnc->mem_w0_tmp = xn[L_subfr - 1] - ( gain_pit * y1[L_subfr - 1] ) - ( gain_code * y2[L_subfr - 1] ); + } + else + { + st->hGSCEnc->mem_w0_tmp = xn[L_subfr - 1] - ( gain_pit * y1[L_subfr - 1] ); + } + + /*-----------------------------------------------------------------* + * Construct adaptive part of the excitation + * Save the non-enhanced excitation for FEC_exc + *-----------------------------------------------------------------*/ + + if ( use_fcb != 0 ) + { + for ( i = 0; i < L_subfr; i++ ) + { + exc[i + i_subfr] = gain_pit * exc[i + i_subfr] + gain_code * code[i]; + } + } + else + { + for ( i = 0; i < L_subfr; i++ ) + { + exc[i + i_subfr] = gain_pit * exc[i + i_subfr]; + } + } + + /*-----------------------------------------------------------------* + * Synthesize speech to update mem_syn[]. + * Update A(z) filters + *-----------------------------------------------------------------*/ + + syn_filt( p_Aq, M, &exc[i_subfr], &synth[i_subfr], L_subfr, st->hGSCEnc->mem_syn_tmp, 1 ); + + if ( L_subfr == 5 * L_SUBFR ) + { + cum_gpit = gpit_tmp; + + pt_pitch++; + *pt_pitch = *( pt_pitch - 1 ); + pt_pitch++; + *pt_pitch = *( pt_pitch - 1 ); + pt_pitch++; + *pt_pitch = *( pt_pitch - 1 ); + pt_pitch++; + *pt_pitch = *( pt_pitch - 1 ); + pt_pitch++; + + p_Aw += 5 * ( M + 1 ); + p_Aq += 5 * ( M + 1 ); + } + else if ( L_subfr == 5 * L_SUBFR / 2 ) + { + if ( i_subfr == 0 ) + { + cum_gpit = gpit_tmp * .4f; + pt_pitch++; + *pt_pitch = *( pt_pitch - 1 ); + pt_pitch++; + p_Aw += 2 * ( M + 1 ); + p_Aq += 2 * ( M + 1 ); + } + else + { + cum_gpit += gpit_tmp * .6f; + pt_pitch++; + *pt_pitch = *( pt_pitch - 1 ); + pt_pitch++; + *pt_pitch = *( pt_pitch - 1 ); + pt_pitch++; + p_Aw += 3 * ( M + 1 ); + p_Aq += 3 * ( M + 1 ); + } + } + else if ( L_subfr == 2 * L_SUBFR ) + { + if ( i_subfr == 0 ) + { + cum_gpit = gpit_tmp * .5f; + } + else + { + cum_gpit += gpit_tmp * .5f; + } + + p_Aw += 2 * ( M + 1 ); + p_Aq += 2 * ( M + 1 ); + pt_pitch++; + *pt_pitch = *( pt_pitch - 1 ); + pt_pitch++; + } + else if ( L_subfr == 4 * L_SUBFR ) + { + cum_gpit = gpit_tmp; + + pt_pitch++; + *pt_pitch = *( pt_pitch - 1 ); + pt_pitch++; + *pt_pitch = *( pt_pitch - 1 ); + pt_pitch++; + *pt_pitch = *( pt_pitch - 1 ); + pt_pitch++; + + p_Aw += 4 * ( M + 1 ); + p_Aq += 4 * ( M + 1 ); + } + else + { + if ( i_subfr == 0 ) + { + cum_gpit = gpit_tmp * .25f; + } + else + { + cum_gpit += gpit_tmp * .25f; + } + + pt_pitch++; + p_Aw += ( M + 1 ); + p_Aq += ( M + 1 ); + } + } + + *gpit = 0.1f * *gpit + 0.9f * cum_gpit; + + return; +} diff --git a/lib_enc/enc_ppp.c b/lib_enc/enc_ppp.c new file mode 100644 index 0000000000000000000000000000000000000000..51e353dfef40b8da45ae1c139de6ba3632a59301 --- /dev/null +++ b/lib_enc/enc_ppp.c @@ -0,0 +1,205 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "prot.h" +#include "wmc_auto.h" + +/*------------------------------------------------------------------- + * encod_ppp() + * + * Encode PPP frames in SC-VBR + *-------------------------------------------------------------------*/ + +ivas_error encod_ppp( + Encoder_State *st, /* i/o: state structure */ + const float speech[], /* i : input speech */ + const float Aw[], /* i : weighted A(z) unquantized for subframes */ + const float Aq[], /* i : 12k8 Lp coefficient */ + float *res, /* i/o: residual signal */ + float *synth, /* i/o: core synthesis */ + float *exc, /* i/o: current non-enhanced excitation */ + float *exc2, /* i/o: current enhanced excitation */ + float *pitch_buf, /* i/o: floating pitch values for each subframe */ + float *voice_factors, /* o : voicing factors */ + float *bwe_exc /* o : excitation for SWB TBE */ +) +{ + float xn[L_SUBFR]; /* Target vector for pitch search */ + float h1[L_SUBFR + ( M + 1 )]; /* Impulse response vector */ + int16_t i_subfr; /* tmp variables */ + const float *p_Aw, *p_Aq; /* pointer to LP filter coeff. vector */ + int16_t k; + float p_Aq_old[M + 1], excQ_ppp[L_FRAME], p_Aq_curr[M], pitch[NB_SUBFR]; + float LPC_de_old[M + 1], LPC_de_curr[M + 1]; + int16_t rate_ctrl; + + LPD_state_HANDLE hLPDmem = st->hLPDmem; + SC_VBR_ENC_HANDLE hSC_VBR = st->hSC_VBR; + BSTR_ENC_HANDLE hBstr = st->hBstr; + ivas_error error; + + error = IVAS_ERR_OK; + + rate_ctrl = hSC_VBR->rate_control; + + /*------------------------------------------------------------------* + * ACELP subframe loop + *------------------------------------------------------------------*/ + + p_Aw = Aw; + p_Aq = Aq; + + for ( i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR ) + { + /*----------------------------------------------------------------* + * Bandwidth expansion of A(z) filter coefficients + * Find the the excitation search target "xn" and innovation + * target in residual domain "cn" + * Compute impulse response, h1[], of weighted synthesis filter + *----------------------------------------------------------------*/ + + mvr2r( &res[i_subfr], &exc[i_subfr], L_SUBFR ); + + find_targets( speech, hLPDmem->mem_syn, i_subfr, &hLPDmem->mem_w0, p_Aq, res, L_SUBFR, p_Aw, TILT_FAC, xn, NULL, h1 ); + + /* call voiced encoder at this point */ + if ( i_subfr == 0 ) /* generate the L_FRAME exc */ + { + for ( k = 0; k < M; k++ ) + { + p_Aq_curr[k] = p_Aq[k + ( 3 * ( M + 1 ) ) + 1]; + } + + lsp2a_stab( st->lsp_old, p_Aq_old, M ); + + deemph_lpc( p_Aq_curr, p_Aq_old, LPC_de_curr, LPC_de_old, 1 ); + + /* last frame-end lpc and curr frame-end lpc */ + if ( ( error = ppp_voiced_encoder( hBstr, st->hSC_VBR, st->bwidth, st->last_coder_type_raw, st->old_pitch_buf, res, excQ_ppp, st->pitch[1], LPC_de_old, LPC_de_curr, exc, pitch ) ) != IVAS_ERR_OK ) + { + return error; + } + + + if ( hSC_VBR->bump_up ) + { + i_subfr = L_FRAME; + } + } + + if ( hSC_VBR->bump_up != 1 ) + { + /*-----------------------------------------------------------------* + * Gain clipping test to avoid unstable synthesis on frame erasure + * or in case of floating point encoder & fixed p. decoder + *-----------------------------------------------------------------*/ + + gp_clip( st->element_mode, st->core_brate, st->voicing, i_subfr, st->coder_type, xn, st->clip_var ); + + /* run the above to maintain gain clipping memories */ + gp_clip_test_gain_pit( st->element_mode, st->core_brate, hSC_VBR->prev_ppp_gain_pit, st->clip_var ); + + /*-----------------------------------------------------------------* + * Synthesize speech to update mem_syn[]. + * Update A(z) filters + *-----------------------------------------------------------------*/ + + syn_filt( p_Aq, M, &excQ_ppp[i_subfr], &synth[i_subfr], L_SUBFR, hLPDmem->mem_syn, 1 ); + + p_Aw += ( M + 1 ); + p_Aq += ( M + 1 ); + } + + } /* end of subframe loop */ + + + if ( hSC_VBR->bump_up ) + { + /* PPP failed, bump up */ + hSC_VBR->ppp_mode = 0; + st->core_brate = ACELP_7k20; + hSC_VBR->pppcountE = 0; + + if ( hSC_VBR->set_ppp_generic ) + { + st->coder_type = GENERIC; + } + else + { + st->coder_type = VOICED; + } + + /* delete previous indices */ + reset_indices_enc( hBstr, hBstr->nb_ind_tot ); + + /* signaling matrix (writing of signaling bits) */ + signaling_enc( st ); + } + else + { + mvr2r( excQ_ppp, exc, L_FRAME ); + + /*-----------------------------------------------------------------* + * Updates: last value of new target is stored in mem_w0 + *-----------------------------------------------------------------*/ + + hLPDmem->mem_w0 = xn[L_SUBFR - 1] - ( exc[L_FRAME - 1] ); + + mvr2r( exc, exc2, L_FRAME ); + + hLPDmem->dispMem[0] = 2; + hLPDmem->dispMem[2] = hSC_VBR->prev_ppp_gain_pit; + + for ( k = 3; k < 7; k++ ) + { + hLPDmem->dispMem[k] = hLPDmem->dispMem[k - 1]; + } + hLPDmem->tilt_code = hSC_VBR->prev_tilt_code; + mvr2r( pitch, pitch_buf, NB_SUBFR ); + pitch_buf[NB_SUBFR16k - 1] = pitch[NB_SUBFR - 1]; + interp_code_5over2( exc2, bwe_exc, L_FRAME ); + set_f( voice_factors, 0.0f, NB_SUBFR16k ); + } + + hSC_VBR->rate_control = rate_ctrl; + + set_f( hSC_VBR->nelp_lp_fit_mem, 0, NELP_LP_ORDER * 2 ); + + return error; +} diff --git a/lib_enc/enc_prm.c b/lib_enc/enc_prm.c new file mode 100644 index 0000000000000000000000000000000000000000..41a211fbfa5ea54a60cb54c4ff478f5a274fbd68 --- /dev/null +++ b/lib_enc/enc_prm.c @@ -0,0 +1,887 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include "options.h" +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "wmc_auto.h" + + +/*-------------------------------------------------------------------* + * writeTCXMode() + * + * write TCX mode + *--------------------------------------------------------------------*/ + +void writeTCXMode( + Encoder_State *st, /* i/o: encoder state structure */ + BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ + const int16_t MCT_flag, /* i : hMCT handle allocated (1) or not (0) */ + int16_t *nbits_start /* o : nbits start */ +) +{ + uint16_t index; + int16_t idx, start_idx; + int16_t nBits; + + if ( st->tcxonly ) + { + push_next_indice( hBstr, st->core == TCX_10_CORE, 1 ); + + if ( st->clas == UNVOICED_CLAS ) + { + index = 0; + } + else if ( st->clas == VOICED_TRANSITION || st->clas == UNVOICED_TRANSITION ) + { + index = 1; + } + else if ( st->clas == VOICED_CLAS ) + { + index = 2; + } + else + { + index = 3; + } + + push_next_indice( hBstr, index, 2 ); + + if ( st->element_mode == IVAS_CPE_MDCT && !MCT_flag ) + { + push_next_indice( hBstr, st->vad_flag, 1 ); + } + } + else + { + if ( st->core == ACELP_CORE ) + { + /* write the RF signaling information */ + if ( st->rf_mode == 1 ) + { + /* find the section in the ACELP signaling table corresponding to bitrate */ + idx = 0; + while ( acelp_sig_tbl[idx] != st->total_brate ) /* total bitrate is kept at 13.2kbps */ + { + idx++; + } + + /* retrieve the number of bits for signaling */ + nBits = (int16_t) acelp_sig_tbl[++idx]; + + /* retrieve the signaling index */ + start_idx = ++idx; + while ( acelp_sig_tbl[idx] != SIG2IND( st->coder_type, st->bwidth, st->sharpFlag, st->rf_mode ) ) + { + idx++; + } + push_next_indice( hBstr, idx - start_idx, nBits ); + push_next_indice( hBstr, 0, 1 ); /* Indicate to the decoder that the core is ACELP*/ + *nbits_start = 3; + } + else + { + push_next_indice( hBstr, st->coder_type, 3 ); + } + } + else + { + if ( st->mdct_sw == MODE1 ) + { + /* 2 bits instead of 3 as TCX is already signaled */ + push_next_indice( hBstr, st->hTcxCfg->coder_type, 2 ); + } + else + { + if ( st->mdct_sw_enable == MODE2 ) + { + push_next_indice( hBstr, 1, 1 ); /* TCX */ + push_next_indice( hBstr, 0, 1 ); /* not HQ_CORE */ + push_next_indice( hBstr, st->hTcxCfg->coder_type, 2 ); + } + else + { + /*write the RF signaling information*/ + if ( st->rf_mode == 1 ) + { + /* find the section in the ACELP signaling table corresponding to bitrate */ + idx = 0; + while ( acelp_sig_tbl[idx] != st->total_brate ) + { + idx++; + } + + /* retrieve the number of bits for signaling */ + nBits = (int16_t) acelp_sig_tbl[++idx]; + + if ( st->hTcxCfg->coder_type == VOICED || st->hTcxCfg->coder_type == GENERIC || st->hTcxCfg->coder_type == TRANSITION ) + { + st->sharpFlag = 1; + } + else + { + st->sharpFlag = 0; + } + + /* retrieve the signaling index */ + start_idx = ++idx; + while ( acelp_sig_tbl[idx] != SIG2IND( st->hTcxCfg->coder_type, st->bwidth, st->sharpFlag, st->rf_mode ) ) + { + idx++; + } + push_next_indice( hBstr, idx - start_idx, nBits ); + push_next_indice( hBstr, 1, 1 ); /* Indicate to the decoder that the core is TCX*/ + *nbits_start = 3; + } + else + { + push_next_indice( hBstr, ACELP_MODE_MAX + st->hTcxCfg->coder_type, 3 ); + } + } + } + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * writeTCXWindowing() + * + * write TCX transform type + *-------------------------------------------------------------------*/ + +void writeTCXWindowing( + BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ + const int16_t overlap_mode /* i : overlap mode */ +) +{ + + if ( overlap_mode == MIN_OVERLAP ) + { + push_next_indice( hBstr, 2, 2 ); + } + else if ( overlap_mode == HALF_OVERLAP ) + { + push_next_indice( hBstr, 3, 2 ); + } + else + { + push_next_indice( hBstr, 0, 1 ); + } + + return; +} + + +/*-------------------------------------------------------------------* + * writeLPCparam() + * + * write LTC parameters + *-------------------------------------------------------------------*/ + +void writeLPCparam( + Encoder_State *st, /* i/o: encoder state structure */ + BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ + const int16_t param_lpc[], /* i : LPC parameters to write */ + const int16_t bits_param_lpc[], /* i : bits per LPC parameter */ + const int16_t no_param_lpc, /* i : number of LPC parameters */ + int16_t *nbits_lpc /* o : LPC bits written */ +) +{ + int16_t numlpc; + + if ( st->enableTcxLpc && st->core != ACELP_CORE ) + { + /* Encode the indices */ + *nbits_lpc = enc_lsf_tcxlpc( ¶m_lpc, hBstr ); + } + else + { + if ( st->lpcQuantization == 0 ) + { + /* LPC quantizer */ + if ( st->core == TCX_20_CORE ) + { + numlpc = 1; + } + else + { + numlpc = 2; + } + + *nbits_lpc = encode_lpc_avq( hBstr, numlpc, param_lpc, st->core, st->element_mode ); + } + else if ( st->lpcQuantization == 1 ) + { + if ( st->sr_core == INT_FS_16k && st->coder_type == VOICED && st->core == ACELP_CORE ) + { + assert( st->element_mode == EVS_MONO ); + + *nbits_lpc = lsf_bctcvq_encprm( hBstr, param_lpc, bits_param_lpc, no_param_lpc ); + } + else + { + *nbits_lpc = lsf_msvq_ma_encprm( hBstr, param_lpc, st->core, st->coder_type, st->acelp_cfg.midLpc, bits_param_lpc, no_param_lpc ); + } + } + else + { + assert( 0 ); + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * enc_prm_hm() + * + * + *-------------------------------------------------------------------*/ + +static void enc_prm_hm( + const int16_t *prm_hm, + BSTR_ENC_HANDLE hBstr, + const int16_t coder_type, + const int16_t L_frame ) +{ + /* Disable HM for non-GC,VC modes */ + if ( coder_type != VOICED && coder_type != GENERIC ) + { + return; + } + + /* Flag */ + push_next_indice( hBstr, prm_hm[0], 1 ); + + if ( prm_hm[0] ) + { + /* Periodicy index */ + EncodeIndex( L_frame >= L_FRAME, prm_hm[1], hBstr ); + + if ( coder_type == VOICED ) + { + /* Gain index */ + push_next_indice( hBstr, prm_hm[2], kTcxHmNumGainBits ); + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * writeTCXparam() + * + * write TCX core parameters + *-------------------------------------------------------------------*/ + +void writeTCXparam( + Encoder_State *st, /* i/o: Encoder State handle */ + BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ + CONTEXT_HM_CONFIG hm_cfg[], /* i/o: HM config */ + int16_t param[], /* i : parameters */ + const int16_t nbits_header, + const int16_t nbits_start, + const int16_t nbits_lpc, + const int16_t *no_param_tns, /* i : number of TNS parameters per subframe */ + int16_t p_param[2], /* i/o: pointer to parameters from previous bs writing */ + const int16_t target_bitsTCX10[2], + const int16_t pre_past_flag ) +{ + int16_t *prm; + int16_t j, k, nSubframes, core, last_core; + int16_t lg, lgFB, hm_size, flag_ctx_hm; + int16_t total_nbbits, nbits_igf, nbits_tcx; + int16_t nTnsParams, nTnsBits; + int16_t pre_part, post_part; + + if ( pre_past_flag == 0 ) + { + pre_part = 1; + post_part = 0; + } + else if ( pre_past_flag == 1 ) + { + pre_part = 0; + post_part = 1; + } + else + { + pre_part = 1; + post_part = 1; + } + + /* Initialization */ + core = st->core; + last_core = st->last_core; + nbits_igf = 0; + + nSubframes = 1; + if ( core == TCX_10_CORE ) + { + nSubframes = 2; + } + + /* loop over subframes */ + for ( k = 0; k < nSubframes; k++ ) + { + if ( st->element_mode < IVAS_CPE_MDCT && k == 0 && st->igf && core == TCX_10_CORE ) + { + nbits_igf = IGFEncWriteConcatenatedBitstream( st->hIGFEnc, hBstr ); + } + + flag_ctx_hm = 0; + + prm = param + ( k * NPRM_DIV ); + j = 0; + + nbits_tcx = total_nbbits = hBstr->nb_bits_tot - nbits_start; + + if ( pre_part && st->enablePlcWaveadjust && k == ( nSubframes - 1 ) ) + { + push_next_indice( hBstr, st->Tonal_SideInfo, 1 ); + } + + if ( post_part ) + { + /* TCX Gain */ + push_next_indice( hBstr, prm[j++], NBITS_TCX_GAIN ); + + /* TCX Noise Filling = NBITS_NOISE_FILL_LEVEL bits */ + push_next_indice( hBstr, prm[j++], NBITS_NOISE_FILL_LEVEL ); + } + else + { + j += 1 + NOISE_FILL_RANGES; + } + + /* LTP data */ + if ( pre_part ) + { + if ( ( k == 0 ) && ( st->hTcxEnc->tcxltp || ( st->sr_core > 25600 ) ) ) /* PLC pitch info for HB */ + { + if ( prm[j] ) + { + push_next_indice( hBstr, 1, 1 ); + push_next_indice( hBstr, prm[j + 1], 9 ); + push_next_indice( hBstr, prm[j + 2], 2 ); + } + else + { + push_next_indice( hBstr, 0, 1 ); + } + } + j += 3; + } + else + { + j += p_param[k] - 2; + } + + /* TCX spectral data */ + lg = st->last_L_frame >> ( nSubframes - 1 ); + lgFB = st->hTcxCfg->tcx_coded_lines >> ( nSubframes - 1 ); + if ( post_part && k == 0 && last_core == ACELP_CORE ) + { + /* ACE->TCX transition */ + lg += st->hTcxCfg->tcx_offset; + lgFB += lgFB >> ( 3 - nSubframes ); + + if ( st->hTcxCfg->lfacNext < 0 ) + { + lg -= st->hTcxCfg->lfacNext; + } + } + + if ( pre_part ) + { + /* TNS data */ + nTnsParams = 0; + nTnsBits = 0; + + if ( st->hTcxCfg->fIsTNSAllowed ) + { + SetTnsConfig( st->hTcxCfg, core == TCX_20_CORE, ( last_core == ACELP_CORE ) && ( k == 0 ) ); + + if ( no_param_tns ) + { + push_next_indice( hBstr, ( st->hTcxEnc->tnsData[k].nFilters < 0 ? 1 : 0 ), 1 ); /* common_tns_data[] for subframe k */ + } + if ( no_param_tns && ( st->hTcxEnc->tnsData[k].nFilters < 0 ) ) + { + /* a negative filter count means that the filters are identical to those in the first channel at the same sub-frame */ + nTnsParams = no_param_tns[k]; + } + else + { + WriteTnsData( st->hTcxCfg->pCurrentTnsConfig, prm + j, &nTnsParams, hBstr, &nTnsBits ); + } + if ( no_param_tns ) + { + nTnsBits++; + } + j += nTnsParams; + } + + if ( post_part ) + { + hm_size = (int16_t) ( 2.0f * st->hTcxCfg->bandwidth * (float) lg ); + + if ( st->hTcxEnc->tcx_lpc_shaped_ari && last_core != ACELP_CORE && core == TCX_20_CORE ) + { + enc_prm_hm( &prm[j], hBstr, st->hTcxCfg->coder_type, hm_size ); + } + + /*Context HM flag*/ + if ( st->hTcxCfg != NULL && st->hTcxCfg->ctx_hm && !( last_core == ACELP_CORE && k == 0 ) ) + { + push_next_indice( hBstr, prm[j], 1 ); + + if ( prm[j] ) + { + EncodeIndex( hm_size >= 256, prm[j + 1], hBstr ); + + flag_ctx_hm = 1; + } + } + } + j += NPRM_CTX_HM; + + if ( post_part ) + { + /* IGF data */ + if ( st->igf && core == TCX_20_CORE ) + { + st->hIGFEnc->infoTotalBitsPerFrameWritten = 0; + IGFEncWriteBitstream( st->hIGFEnc, hBstr, &st->hIGFEnc->infoTotalBitsPerFrameWritten, ( last_core == ACELP_CORE ) ? IGF_GRID_LB_TRAN : IGF_GRID_LB_NORM, 1 ); + } + + total_nbbits = hBstr->nb_bits_tot - nbits_start; + + if ( core == TCX_20_CORE ) + { + if ( st->rf_mode ) + { + total_nbbits += st->rf_target_bits_write; + } + nbits_tcx = st->bits_frame_core - total_nbbits; + } + else /* TCX_10_CORE */ + { + nbits_tcx = ( ( st->bits_frame_core - nbits_header - nbits_lpc - nbits_igf + 1 - k ) >> 1 ) - ( total_nbbits - nbits_tcx ); + } + } + else + { + /*Context HM flag*/ + p_param[k] = j; + } + } + else + { + nbits_tcx = st->bits_frame_channel; + if ( core == TCX_10_CORE ) + { + nbits_tcx = target_bitsTCX10[k] - NBITS_TCX_GAIN - NOISE_FILL_RANGES * NBITS_NOISE_FILL_LEVEL; + } + } + + if ( post_part ) + { + if ( st->hTcxEnc->tcx_lpc_shaped_ari && core == TCX_20_CORE ) + { + push_next_bits( hBstr, (uint16_t *) &prm[++j], nbits_tcx ); + j += nbits_tcx; + } + else + { + if ( st->element_mode > EVS_MONO ) + { + RCcontextMapping_encode2_no_mem_s17_LCS( hBstr, prm + j, lgFB, prm[j - 1], /* lastnz */ + nbits_tcx, NPRM_RESQ * st->hTcxCfg->resq, flag_ctx_hm ? &hm_cfg[k] : NULL ); + } + else + { + ACcontextMapping_encode2_no_mem_s17_LC( hBstr, prm + j, lgFB, prm[j - 1], /* lastnz */ + nbits_tcx, NPRM_RESQ * st->hTcxCfg->resq, flag_ctx_hm ? &hm_cfg[k] : NULL ); + } + } + } + } + + return; +} + + +/*-----------------------------------------------------------------* + * Function enc_prm_rf() * + * ~~~~~~~~~~~~~~~~~~~~~~ * + * * + * encode RF parameters for ACELP and TCX partial copy * + *-----------------------------------------------------------------*/ + +void enc_prm_rf( + Encoder_State *st, + const int16_t rf_frame_type, + const int16_t fec_offset ) +{ + int16_t sfr, nb_subfr, n, index; + int16_t ltp_mode, ltf_mode, gains_mode; + + RF_ENC_HANDLE hRF = st->hRF; + TCX_ENC_HANDLE hTcxEnc = st->hTcxEnc; + BSTR_ENC_HANDLE hBstr = st->hBstr; + + nb_subfr = st->nb_subfr; + + /* partial copy bitstream writing */ + if ( rf_frame_type >= RF_TCXFD && rf_frame_type <= RF_TCXTD2 ) + { + /* TCX frames partial copy write */ + if ( rf_frame_type == RF_TCXFD ) + { + push_next_indice( hBstr, hRF->rf_indx_lsf[fec_offset][0], lsf_numbits[0] ); /* VQ 1 */ + push_next_indice( hBstr, hRF->rf_indx_lsf[fec_offset][1], lsf_numbits[1] ); /* VQ 2 */ + push_next_indice( hBstr, hRF->rf_indx_lsf[fec_offset][2], lsf_numbits[2] ); /* VQ 3 */ + } + + /* classification */ + if ( hRF->rf_clas[fec_offset] == UNVOICED_CLAS ) + { + index = 0; + } + else if ( ( hRF->rf_clas[fec_offset] == VOICED_TRANSITION ) || ( hRF->rf_clas[fec_offset] == UNVOICED_TRANSITION ) ) + { + index = 1; + } + else if ( hRF->rf_clas[fec_offset] == VOICED_CLAS ) + { + index = 2; + } + else + { + index = 3; + } + push_next_indice( hBstr, index, 2 ); + + if ( rf_frame_type == RF_TCXFD ) + { + /* TCX global gain = 7 bits */ + push_next_indice( hBstr, hRF->rf_gain_tcx[fec_offset], 7 ); + } + else + { + /* LTP data */ + if ( ( rf_frame_type == RF_TCXTD1 || rf_frame_type == RF_TCXTD2 ) && hTcxEnc->tcxltp ) + { + push_next_indice( hBstr, hRF->rf_tcxltp_param[fec_offset], 9 ); + } + } + } + else if ( rf_frame_type == 7 ) /* NELP bitstream writing */ + { + /* LSF indices */ + push_next_indice( hBstr, hRF->rf_indx_lsf[fec_offset][0], 8 ); /* VQ 1 */ + push_next_indice( hBstr, hRF->rf_indx_lsf[fec_offset][1], 8 ); /* VQ 2 */ + + /* NELP gain indices */ + push_next_indice( hBstr, hRF->rf_indx_nelp_iG1[fec_offset], 5 ); + push_next_indice( hBstr, hRF->rf_indx_nelp_iG2[fec_offset][0], 6 ); + push_next_indice( hBstr, hRF->rf_indx_nelp_iG2[fec_offset][1], 6 ); + + /* NELP filter selection index */ + push_next_indice( hBstr, hRF->rf_indx_nelp_fid[fec_offset], 2 ); + + /* tbe gainFr */ + push_next_indice( hBstr, hRF->rf_indx_tbeGainFr[fec_offset], 5 ); + } + else if ( rf_frame_type >= 4 ) /* rf_frame_type ALL_PRED: 4, NO_PRED: 5, GEN_PRED: 6 */ + { + /* LSF indices */ + push_next_indice( hBstr, hRF->rf_indx_lsf[fec_offset][0], 8 ); /* VQ 1 */ + push_next_indice( hBstr, hRF->rf_indx_lsf[fec_offset][1], 8 ); /* VQ 2 */ + + /* ES pred */ + push_next_indice( hBstr, hRF->rf_indx_EsPred[fec_offset], 3 ); + + ltp_mode = ACELP_LTP_MODE[1][1][rf_frame_type]; + ltf_mode = ACELP_LTF_MODE[1][1][rf_frame_type]; + gains_mode = ACELP_GAINS_MODE[1][1][rf_frame_type]; + + /* Subframe parameters */ + for ( sfr = 0; sfr < nb_subfr; sfr++ ) + { + /* Pitch lag (5, or 8 bits) */ + n = ACELP_LTP_BITS_SFR[ltp_mode][sfr]; + if ( n != 0 ) + { + push_next_indice( hBstr, hRF->rf_indx_pitch[fec_offset][sfr], n ); + } + + /* Adaptive codebook filtering (1 bit) */ + if ( ltf_mode == 2 ) + { + push_next_indice( hBstr, hRF->rf_indx_ltfMode[fec_offset][sfr], 1 ); + } + + /*Innovative codebook*/ + if ( ( rf_frame_type == RF_NOPRED ) || ( rf_frame_type == RF_GENPRED && ( sfr == 0 || sfr == 2 ) ) ) + { + push_next_indice( hBstr, hRF->rf_indx_fcb[fec_offset][sfr], 7 ); + } + + /* Gains (5b, 6b or 7b / subfr) */ + if ( sfr == 0 || sfr == 2 ) + { + n = ACELP_GAINS_BITS[gains_mode]; + push_next_indice( hBstr, hRF->rf_indx_gain[fec_offset][sfr], n ); + } + } + /* tbe gainFr */ + push_next_indice( hBstr, hRF->rf_indx_tbeGainFr[fec_offset], 2 ); + } + + /***************/ + /*IMPORTANT: The last three bits are always the rf_frame_type in the bitstream (for both acelp and tcx partial copy); + the rf_frame_type indicates the length of the partial copy payload at the decoder. + The 2 bits before the rf_frame_type contains the fec_offset */ + + /***************/ + /* write FEC offset just before the rf_frame_type */ + if ( fec_offset == 2 ) + { + push_next_indice( hBstr, 0, 2 ); + } + else if ( fec_offset == 3 || fec_offset == 5 || fec_offset == 7 ) + { + push_next_indice( hBstr, ( fec_offset - 1 ) / 2, 2 ); + } + + /* write RF frame type last in the bitstream */ + push_next_indice( hBstr, rf_frame_type, 3 ); + + return; +} + +/*-----------------------------------------------------------------* + * Function enc_prm() * + * ~~~~~~~~~~~~~~~~~~~~~~ * + * * + * encode parameters according to selected mode including * + * the FAC parameters when transition occurs. * + *-----------------------------------------------------------------*/ + +void enc_prm( + Encoder_State *st, /* i/o: encoder state structure */ + int16_t param[], /* i : parameters */ + int16_t param_lpc[], /* i : LPC parameters */ + CONTEXT_HM_CONFIG hm_cfg[], + const int16_t bits_param_lpc[], + const int16_t no_param_lpc ) +{ + int16_t j, n, sfr, core, last_core, nb_subfr; + int16_t *prm; + int16_t nbits_start, /*total_nbbits,*/ nbits_header, nbits_lpc; + int16_t ix, j_old, wordcnt, bitcnt; + + BSTR_ENC_HANDLE hBstr = st->hBstr; + + /*--------------------------------------------------------------------------------* + * initialization + *--------------------------------------------------------------------------------*/ + + nbits_lpc = 0; + + /* Useful parameters */ + nb_subfr = st->nb_subfr; + core = st->core; + last_core = st->last_core; + + /* Initialize pointers */ + prm = param; + + /* Init counters */ + j = 0; + nbits_start = hBstr->nb_bits_tot; + + /*--------------------------------------------------------------------------------* + * HEADER + *--------------------------------------------------------------------------------*/ + + if ( st->mdct_sw == MODE1 ) + { + /* Adjust st->bits_frame_core not to subtract MODE2 bandwidth signaling */ + st->bits_frame_core += FrameSizeConfig[st->frame_size_index].bandwidth_bits; + + /* Write MODE1 core & coder_type signaling */ + signaling_mode1_tcx20_enc( st, 1 ); + } + + /* EVS header */ + /* Modes (ACE_GC, ACE_UC, TCX20, TCX10...) */ + writeTCXMode( st, st->hBstr, 0 /* MCT_flag */, &nbits_start ); + + /* write last_core for error concealment */ + if ( !( core == ACELP_CORE && st->hTcxCfg->lfacNext <= 0 ) ) + { + push_next_indice( hBstr, ( ( last_core != ACELP_CORE ) || ( core == TCX_10_CORE ) ), 1 ); + } + + /* write TCX overlap mode (1 bit: full, 2 bits: half or no overlap) */ + if ( core != ACELP_CORE ) + { + writeTCXWindowing( hBstr, st->hTcxCfg->tcx_curr_overlap_mode ); + } + + if ( st->hPlcExt && st->hPlcExt->enableGplc ) + { + /* encode side information. */ + enc_prm_side_Info( st->hPlcExt, st ); + } + + if ( st->glr ) + { + if ( core != ACELP_CORE || st->coder_type == INACTIVE || + ( st->last_core == ACELP_CORE && st->last_coder_type_raw == INACTIVE ) || + st->glr_reset ) + { + st->glr_idx[0] = 0; + } + + if ( core == ACELP_CORE ) + { + push_next_indice( hBstr, st->glr_idx[0], G_LPC_RECOVERY_BITS ); + } + } + + st->glr_reset = 0; + + nbits_header = hBstr->nb_bits_tot - nbits_start; + + /*--------------------------------------------------------------------------------* + * LPC parameters + *--------------------------------------------------------------------------------*/ + + writeLPCparam( st, hBstr, param_lpc, bits_param_lpc, no_param_lpc, &nbits_lpc ); + + + /*--------------------------------------------------------------------------------* + * ACELP parameters + *--------------------------------------------------------------------------------*/ + + if ( core == ACELP_CORE ) + { + /* Adaptive BPF (2 bits)*/ + n = ACELP_BPF_BITS[st->acelp_cfg.bpf_mode]; + + if ( n != 0 ) + { + push_next_indice( hBstr, st->bpf_gain_param, n ); + } + + /* Mean energy (2 or 3 bits) */ + n = ACELP_NRG_BITS[st->acelp_cfg.nrg_mode]; + + if ( n != 0 ) + { + push_next_indice( hBstr, prm[j++], n ); + } + + /* Subframe parameters */ + for ( sfr = 0; sfr < nb_subfr; sfr++ ) + { + /* Pitch lag (4, 5, 6, 8 or 9 bits) */ + n = ACELP_LTP_BITS_SFR[st->acelp_cfg.ltp_mode][sfr]; + + if ( n != 0 ) + { + push_next_indice( hBstr, prm[j++], n ); + } + + /* Adaptive codebook filtering (1 bit) */ + if ( st->acelp_cfg.ltf_mode == 2 ) + { + push_next_indice( hBstr, prm[j++], 1 ); + } + + /*Innovative codebook*/ + + j_old = j; + if ( ( st->acelp_cfg.fixed_cdk_index[sfr] >= ACELP_FIXED_CDK_NB ) || ( st->acelp_cfg.fixed_cdk_index[sfr] < 0 ) ) + { + IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "ACELP bits allocation: wrong fixed cdk bit allocation" ); + } + + wordcnt = ACELP_FIXED_CDK_BITS( st->acelp_cfg.fixed_cdk_index[sfr] ) >> 4; + bitcnt = ACELP_FIXED_CDK_BITS( st->acelp_cfg.fixed_cdk_index[sfr] ) & 15; + for ( ix = 0; ix < wordcnt; ix++ ) + { + push_next_indice( hBstr, prm[j++], 16 ); + } + + if ( bitcnt ) + { + push_next_indice( hBstr, prm[j++], bitcnt ); + } + j = j_old + 8; + + /* Gains (5b, 6b or 7b / subfr) */ + n = ACELP_GAINS_BITS[st->acelp_cfg.gains_mode[sfr]]; + push_next_indice( hBstr, prm[j++], n ); + } + } + + + /*--------------------------------------------------------------------------------* + * TCX20/10 parameters + *--------------------------------------------------------------------------------*/ + + if ( core == TCX_20_CORE || core == TCX_10_CORE ) + { + writeTCXparam( st, hBstr, hm_cfg, param, nbits_header, nbits_start, nbits_lpc, NULL, NULL, NULL, -1 ); + } + + /*total_nbbits = hBstr->nb_bits_tot - nbits_start;*/ + + return; +} diff --git a/lib_enc/enc_tran.c b/lib_enc/enc_tran.c new file mode 100644 index 0000000000000000000000000000000000000000..6bd536aae886f6196c72bd91b00d138315413458 --- /dev/null +++ b/lib_enc/enc_tran.c @@ -0,0 +1,342 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * encod_tran() + * + * Encode transition (TC) frames + *-------------------------------------------------------------------*/ + +int16_t encod_tran( + Encoder_State *st, /* i/o: state structure */ + const float speech[], /* i : input speech */ + const float Aw[], /* i : weighted A(z) unquantized for subframes */ + const float Aq[], /* i : LP coefficients */ + const float Es_pred, /* i : predicted scaled innov. energy */ + const float *res, /* i : residual signal */ + float *syn, /* i/o: core synthesis */ + float *exc, /* i/o: current non-enhanced excitation */ + float *exc2, /* i/o: current enhanced excitation */ + float *pitch_buf, /* i/o: floating pitch values for each subframe */ + float *voice_factors, /* o : voicing factors */ + float *bwe_exc, /* i/o: excitation for SWB TBE */ + int16_t tc_subfr, /* i/o: TC subframe classification */ + int16_t position, /* i : maximum of residual signal index */ + int16_t *unbits /* i/o: number of unused bits */ +) +{ + float xn[L_SUBFR]; /* Target vector for pitch search */ + float xn2[L_SUBFR]; /* Target vector for codebook search */ + float cn[L_SUBFR]; /* Target vector in residual domain */ + float h1[L_SUBFR + ( M + 1 )]; /* Impulse response vector */ + float code[L_SUBFR]; /* Fixed codebook excitation */ + float y1[L_SUBFR]; /* Filtered adaptive excitation */ + float y2[L_SUBFR]; /* Filtered algebraic excitation */ + float gain_pit; /* Pitch gain */ + float voice_fac; /* Voicing factor */ + float gain_code; /* Gain of code */ + float gain_inov; /* inovation gain */ + int16_t i, i_subfr; /* tmp variables */ + int16_t T0_min, T0_max; /* pitch and TC variables */ + int16_t unbits_ACELP; + int16_t T0, T0_frac; /* close loop integer pitch and fractional part */ + float *pt_pitch; /* pointer to floating pitch buffer */ + float g_corr[6]; /* ACELP correlation values and gain pitch */ + int16_t clip_gain; /* LSF clip gain */ + const float *p_Aw, *p_Aq; /* pointer to LP filter coefficient vector */ + float gain_preQ; /* Gain of prequantizer excitation */ + float code_preQ[L_SUBFR]; /* Prequantizer excitation */ + int16_t Jopt_flag; /* joint optimization flag */ + int16_t unbits_PI; /* saved bits for EVS_PI */ + float norm_gain_code; + int16_t L_frame; + + BSTR_ENC_HANDLE hBstr = st->hBstr; + LPD_state_HANDLE hLPDmem = st->hLPDmem; + + /*------------------------------------------------------------------* + * Initializations + *------------------------------------------------------------------*/ + + gain_pit = 0; + gain_code = 0; + gain_preQ = 0; + unbits_PI = 0; + + L_frame = st->L_frame; + + if ( L_frame == L_FRAME ) + { + T0_max = PIT_MAX; + T0_min = PIT_MIN; + } + else /* L_frame == L_FRAME16k */ + { + T0_max = PIT16k_MAX; + T0_min = PIT16k_MIN; + } + + Jopt_flag = 0; + unbits_ACELP = *unbits; + *unbits = 0; + + p_Aw = Aw; + p_Aq = Aq; + pt_pitch = pitch_buf; + gain_preQ = 0; + set_f( code_preQ, 0, L_SUBFR ); + + /*----------------------------------------------------------------* + * ACELP subframe loop + *----------------------------------------------------------------*/ + + for ( i_subfr = 0; i_subfr < L_frame; i_subfr += L_SUBFR ) + { + /*----------------------------------------------------------------* + * Find the the excitation search target "xn" and innovation + * target in residual domain "cn" + * Compute impulse response, h1[], of weighted synthesis filter + *----------------------------------------------------------------*/ + + mvr2r( &res[i_subfr], &exc[i_subfr], L_SUBFR ); + + find_targets( speech, hLPDmem->mem_syn, i_subfr, &hLPDmem->mem_w0, p_Aq, res, L_SUBFR, p_Aw, st->preemph_fac, xn, cn, h1 ); + + /*-----------------------------------------------------------------* + * TC: subframe determination & + * adaptive/glottal part of excitation construction + *-----------------------------------------------------------------*/ + + transition_enc( st, i_subfr, &tc_subfr, &Jopt_flag, &position, &T0, &T0_frac, &T0_min, &T0_max, exc, y1, h1, xn, xn2, st->clip_var, &gain_pit, g_corr, &clip_gain, &pt_pitch, bwe_exc, &unbits_ACELP ); + + /*-----------------------------------------------------------------* + * Transform domain contribution encoding - active frames + *-----------------------------------------------------------------*/ + + if ( st->core_brate >= MIN_BRATE_AVQ_EXC ) + { + transf_cdbk_enc( st, 0, i_subfr, cn, exc, p_Aq, p_Aw, h1, xn, xn2, y1, y2, Es_pred, &gain_pit, gain_code, g_corr, clip_gain, &gain_preQ, code_preQ, unbits ); + } + + /*-----------------------------------------------------------------* + * ACELP codebook search + pitch sharpening + *-----------------------------------------------------------------*/ + + inov_encode( st, st->core_brate, 0, L_frame, st->last_L_frame, st->coder_type, st->bwidth, st->sharpFlag, i_subfr, tc_subfr, p_Aq, gain_pit, cn, exc, h1, hLPDmem->tilt_code, *pt_pitch, xn2, code, y2, &unbits_PI, L_SUBFR ); + + if ( ( L_frame == L_FRAME16k ) && ( tc_subfr == 0 ) && ( i_subfr == L_SUBFR ) && ( T0 == 2 * L_SUBFR ) ) + { + Jopt_flag = 1; + } + + /*-----------------------------------------------------------------* + * Quantize the gains + * Test quantized gain of pitch for pitch clipping algorithm + * Update tilt of code: 0.0 (unvoiced) to 0.5 (voiced) + *-----------------------------------------------------------------*/ + + if ( Jopt_flag == 0 ) + { + /* SQ gain_code */ + gain_enc_tc( hBstr, st->acelp_cfg.gains_mode, i_subfr, xn, y2, code, Es_pred, &gain_pit, &gain_code, &gain_inov, &norm_gain_code ); + } + else + { + if ( st->core_brate > ACELP_32k ) + { + /* SQ gain_pit and gain_code */ + gain_enc_SQ( hBstr, st->acelp_cfg.gains_mode, i_subfr, xn, y1, y2, code, Es_pred, &gain_pit, &gain_code, &gain_inov, &norm_gain_code, g_corr, clip_gain ); + } + else + { + /* VQ gain_pit and gain_code */ + gain_enc_mless( hBstr, st->acelp_cfg.gains_mode, st->element_mode, L_frame, i_subfr, tc_subfr, xn, y1, y2, code, Es_pred, &gain_pit, &gain_code, &gain_inov, &norm_gain_code, g_corr, clip_gain ); + } + } + + /*-----------------------------------------------------------------* + * update LP-filtered gains for the case of frame erasures + *-----------------------------------------------------------------*/ + + gp_clip_test_gain_pit( st->element_mode, st->core_brate, gain_pit, st->clip_var ); + + hLPDmem->tilt_code = est_tilt( exc + i_subfr, gain_pit, code, gain_code, &voice_fac, L_SUBFR, 0 ); + + /*-----------------------------------------------------------------* + * Update memory of the weighting filter + *-----------------------------------------------------------------*/ + + hLPDmem->mem_w0 = xn[L_SUBFR - 1] - ( gain_pit * y1[L_SUBFR - 1] ) - ( gain_code * y2[L_SUBFR - 1] ); + + /*-----------------------------------------------------------------* + * Construct adaptive part of the excitation + * Save the non-enhanced excitation for FEC_exc + *-----------------------------------------------------------------*/ + + for ( i = 0; i < L_SUBFR; i++ ) + { + exc2[i + i_subfr] = gain_pit * exc[i + i_subfr]; + exc[i + i_subfr] = exc2[i + i_subfr] + gain_code * code[i]; + } + + /*-----------------------------------------------------------------* + * Add the ACELP pre-quantizer contribution + *-----------------------------------------------------------------*/ + + if ( st->core_brate >= MIN_BRATE_AVQ_EXC ) + { + for ( i = 0; i < L_SUBFR; i++ ) + { + exc2[i + i_subfr] += gain_preQ * code_preQ[i]; + exc[i + i_subfr] += gain_preQ * code_preQ[i]; + } + } + + /*-----------------------------------------------------------------* + * Prepare TBE excitation + *-----------------------------------------------------------------*/ + + prep_tbe_exc( L_frame, L_SUBFR, i_subfr, gain_pit, gain_code, code, voice_fac, &voice_factors[i_subfr / L_SUBFR], bwe_exc, gain_preQ, code_preQ, T0, st->coder_type, st->core_brate, st->element_mode, st->idchan, st->hBWE_TD != NULL, st->tdm_LRTD_flag ); + + /*-----------------------------------------------------------------* + * Synthesize speech to update mem_syn[]. + * Update A(z) filters + *-----------------------------------------------------------------*/ + + syn_filt( p_Aq, M, &exc[i_subfr], &syn[i_subfr], L_SUBFR, hLPDmem->mem_syn, 1 ); + + p_Aw += ( M + 1 ); + p_Aq += ( M + 1 ); + pt_pitch++; + } + + /* write reserved bits */ + while ( unbits_PI > 0 ) + { + i = min( unbits_PI, 16 ); + push_indice( hBstr, IND_UNUSED, 0, i ); + unbits_PI -= i; + } + + /* write TC configuration */ + if ( L_frame == L_FRAME ) + { + if ( tc_subfr == TC_0_0 ) + { + push_indice( hBstr, IND_TC_SUBFR, 1, 1 ); + } + else if ( tc_subfr == TC_0_64 ) + { + push_indice( hBstr, IND_TC_SUBFR, 0, 1 ); + push_indice( hBstr, IND_TC_SUBFR, 1, 1 ); + push_indice( hBstr, IND_TC_SUBFR, 0, 1 ); + push_indice( hBstr, IND_TC_SUBFR, 1, 1 ); + } + else if ( tc_subfr == TC_0_128 ) + { + push_indice( hBstr, IND_TC_SUBFR, 0, 1 ); + push_indice( hBstr, IND_TC_SUBFR, 1, 1 ); + push_indice( hBstr, IND_TC_SUBFR, 0, 1 ); + push_indice( hBstr, IND_TC_SUBFR, 0, 1 ); + } + else if ( tc_subfr == TC_0_192 ) + { + push_indice( hBstr, IND_TC_SUBFR, 0, 1 ); + push_indice( hBstr, IND_TC_SUBFR, 1, 1 ); + push_indice( hBstr, IND_TC_SUBFR, 1, 1 ); + } + else if ( tc_subfr == L_SUBFR ) + { + push_indice( hBstr, IND_TC_SUBFR, 0, 1 ); + push_indice( hBstr, IND_TC_SUBFR, 0, 1 ); + push_indice( hBstr, IND_TC_SUBFR, 1, 1 ); + } + else if ( tc_subfr == 2 * L_SUBFR ) + { + push_indice( hBstr, IND_TC_SUBFR, 0, 1 ); + push_indice( hBstr, IND_TC_SUBFR, 0, 1 ); + push_indice( hBstr, IND_TC_SUBFR, 0, 1 ); + push_indice( hBstr, IND_TC_SUBFR, 1, 1 ); + } + else if ( tc_subfr == 3 * L_SUBFR ) + { + push_indice( hBstr, IND_TC_SUBFR, 0, 1 ); + push_indice( hBstr, IND_TC_SUBFR, 0, 1 ); + push_indice( hBstr, IND_TC_SUBFR, 0, 1 ); + push_indice( hBstr, IND_TC_SUBFR, 0, 1 ); + } + } + else /* L_frame == L_FRAME16k */ + { + if ( tc_subfr == 0 ) + { + push_indice( hBstr, IND_TC_SUBFR, 0, 2 ); + } + else if ( tc_subfr == L_SUBFR ) + { + push_indice( hBstr, IND_TC_SUBFR, 1, 2 ); + } + else if ( tc_subfr == 2 * L_SUBFR ) + { + push_indice( hBstr, IND_TC_SUBFR, 2, 2 ); + } + else if ( tc_subfr == 3 * L_SUBFR ) + { + push_indice( hBstr, IND_TC_SUBFR, 3, 2 ); + push_indice( hBstr, IND_TC_SUBFR, 0, 1 ); + } + else if ( tc_subfr == 4 * L_SUBFR ) + { + push_indice( hBstr, IND_TC_SUBFR, 3, 2 ); + push_indice( hBstr, IND_TC_SUBFR, 1, 1 ); + } + } + + /* SC-VBR */ + if ( st->Opt_SC_VBR ) + { + st->hSC_VBR->prev_ppp_gain_pit = gain_pit; + st->hSC_VBR->prev_tilt_code = hLPDmem->tilt_code; + } + + return tc_subfr; +} diff --git a/lib_enc/enc_uv.c b/lib_enc/enc_uv.c new file mode 100644 index 0000000000000000000000000000000000000000..2ca7ecfdcb62d90808040edb6d9e834850eae208 --- /dev/null +++ b/lib_enc/enc_uv.c @@ -0,0 +1,240 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * encod_unvoiced() + * + * Encode unvoiced (UC) frames + *-------------------------------------------------------------------*/ + +void encod_unvoiced( + Encoder_State *st, /* i/o: state structure */ + const float *speech, /* i : input speech */ + const float Aw[], /* i : weighted A(z) unquantized for subframes */ + const float *Aq, /* i : LP coefficients */ + const float Es_pred, /* i : predicted scaled innov. energy */ + const int16_t uc_two_stage_flag, /* i : flag indicating two-stage UC */ + const float *res, /* i : residual signal */ + float *syn, /* o : core synthesis */ + float *tmp_noise, /* o : long-term noise energy */ + float *exc, /* i/o: current non-enhanced excitation */ + float *pitch_buf, /* o : floating pitch values for each subframe */ + float *voice_factors, /* o : voicing factors */ + float *bwe_exc /* i/o: excitation for SWB TBE */ +) +{ + float xn[L_SUBFR]; /* Target vector for pitch search */ + float h1[L_SUBFR]; /* Impulse response vector */ + float code[L_SUBFR]; /* Fixed codebook excitation */ + float y2[L_SUBFR]; /* Filtered algebraic excitation */ + float *pt_pitch; /* pointer to floating pitch buffer */ + float gain_pit; /* Pitch gain */ + float voice_fac; /* Voicing factor */ + float gain_code; /* gain of code */ + float gain_inov; /* inovative gain */ + const float *p_Aw, *p_Aq; /* pointer to LP filter coeff. vector */ + int16_t i_subfr; + float norm_gain_code; + float cn[L_SUBFR]; /* Target vector in residual domain */ + float y1[L_SUBFR]; /* Filtered adaptive excitation */ + float code2[L_SUBFR]; /* Gaussian excitation */ + float y22[L_SUBFR]; /* Filtered Gaussian excitation */ + int16_t i, unbits_PI; + ACELP_CbkCorr g_corr; + float gain_code2, g_corr2[6], exc2[L_SUBFR]; + int16_t index; + + LPD_state_HANDLE hLPDmem = st->hLPDmem; + + /*------------------------------------------------------------------* + * Initializations + *------------------------------------------------------------------*/ + + gain_pit = 0; + + if ( st->Opt_SC_VBR && st->vad_flag == 0 ) + { + if ( st->hSC_VBR->last_ppp_mode == 1 || st->hSC_VBR->last_nelp_mode == 1 ) + { + /* SC_VBR - reset the encoder, to avoid memory not updated issue for the + case when UNVOICED mode is used to code inactive speech */ + CNG_reset_enc( st, pitch_buf, voice_factors, 1 ); + } + } + + p_Aw = Aw; + p_Aq = Aq; + pt_pitch = pitch_buf; + + /*----------------------------------------------------------------* + * subframe loop + *----------------------------------------------------------------*/ + + for ( i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR ) + { + /*----------------------------------------------------------------* + * Bandwidth expansion of A(z) filter coefficients + * Find the excitation search target "xn" and innovation target in residual domain "cn" + * Compute impulse response, h1[], of weighted synthesis filter + *----------------------------------------------------------------*/ + + mvr2r( &res[i_subfr], &exc[i_subfr], L_SUBFR ); + + find_targets( speech, hLPDmem->mem_syn, i_subfr, &hLPDmem->mem_w0, p_Aq, res, L_SUBFR, p_Aw, st->preemph_fac, xn, cn, h1 ); + + if ( !uc_two_stage_flag ) + { + /*----------------------------------------------------------------* + * Unvoiced subframe processing + *----------------------------------------------------------------*/ + + *pt_pitch = gaus_encode( st, i_subfr, h1, xn, exc, &hLPDmem->mem_w0, st->clip_var, &hLPDmem->tilt_code, code, &gain_code, y2, &gain_inov, &voice_fac, &gain_pit, &norm_gain_code ); + } + else + { + /*----------------------------------------------------------------* + * Unvoiced subframe processing in two stages + *----------------------------------------------------------------*/ + + /* No adaptive codebook (UC) */ + set_zero( y1, L_SUBFR ); + set_zero( exc + i_subfr, L_SUBFR ); + + /*-----------------------------------------------------------------* + * Gain clipping test to avoid unstable synthesis on frame erasure + *-----------------------------------------------------------------*/ + + gp_clip( st->element_mode, st->core_brate, st->voicing, i_subfr, UNVOICED, xn, st->clip_var ); + + *pt_pitch = (float) L_SUBFR; + + /*-----------------------------------------------------------------* + * Innovation encoding + *-----------------------------------------------------------------*/ + + inov_encode( st, st->core_brate, 0, L_FRAME, st->last_L_frame, UNVOICED, st->bwidth, 1, i_subfr, -1, p_Aq, gain_pit, cn, exc, h1, hLPDmem->tilt_code, *pt_pitch, xn, code, y2, &unbits_PI, L_SUBFR ); + + E_corr_xy2( xn, y1, y2, g_corr2, L_SUBFR ); + g_corr.y2y2 = 0.01F + g_corr2[2]; + g_corr.xy2 = 0.01F + -0.5f * g_corr2[3]; + g_corr.y1y2 = 0.01F + 0.5f * g_corr2[4]; + + g_corr.xx = 0.01F + dotp( xn, xn, L_SUBFR ); + + /*----------------------------------------------------------------------* + * Add Gaussian excitation + *----------------------------------------------------------------------*/ + + assert( gain_pit == 0.f ); + + gauss_L2( h1, code2, y2, y22, &gain_code2, g_corr2, hLPDmem->tilt_code, p_Aq, FORMANT_SHARPENING_G1, &( st->seed_acelp ) ); + + g_corr.xy1 = 0.f; + g_corr.y1y1 = g_corr2[0]; + g_corr.y1y2 = g_corr2[4]; + + /*-----------------------------------------------------------------* + * Gain encoding + *-----------------------------------------------------------------*/ + + index = gain_enc_gacelp_uv( code, code2, L_SUBFR, Es_pred, &gain_pit, &gain_code, &gain_code2, &g_corr, &norm_gain_code, &gain_inov, st->flag_noisy_speech_snr ); + + push_indice( st->hBstr, IND_GAIN, index, st->acelp_cfg.gains_mode[i_subfr / L_SUBFR] ); + + gp_clip_test_gain_pit( st->element_mode, st->core_brate, gain_pit, st->clip_var ); + + /*----------------------------------------------------------* + * - voice factor (for codebook tilt sharpening) * + *----------------------------------------------------------*/ + + hLPDmem->tilt_code = est_tilt( exc + i_subfr, gain_pit, code, gain_code, &voice_fac, L_SUBFR, 0 ); + + /*-----------------------------------------------------------------* + * Update memory of the weighting filter + *-----------------------------------------------------------------*/ + + hLPDmem->mem_w0 = xn[L_SUBFR - 1] - gain_code * y2[L_SUBFR - 1] - gain_code2 * y22[L_SUBFR - 1]; + + /*-------------------------------------------------------* + * - Find the total excitation. * + *-------------------------------------------------------*/ + + for ( i = 0; i < L_SUBFR; i++ ) + { + exc2[i] = gain_pit * exc[i + i_subfr]; + exc2[i] += gain_code2 * code2[i]; + exc[i + i_subfr] = exc2[i] + gain_code * code[i]; + } + } + + *tmp_noise = norm_gain_code; + + voice_factors[i_subfr / L_SUBFR] = 0.0f; + + if ( st->hBWE_TD != NULL ) + { + interp_code_5over2( &exc[i_subfr], &bwe_exc[i_subfr * HIBND_ACB_L_FAC], L_SUBFR ); + } + + /*-----------------------------------------------------------------* + * Synthesize speech to update mem_syn[]. + * Update A(z) filters + *-----------------------------------------------------------------*/ + + syn_filt( p_Aq, M, &exc[i_subfr], &syn[i_subfr], L_SUBFR, hLPDmem->mem_syn, 1 ); + + p_Aw += ( M + 1 ); + p_Aq += ( M + 1 ); + pt_pitch++; + } + + /* SC-VBR */ + if ( st->Opt_SC_VBR ) + { + st->hSC_VBR->prev_ppp_gain_pit = gain_pit; + st->hSC_VBR->prev_tilt_code = hLPDmem->tilt_code; + } + + return; +} diff --git a/lib_enc/energy.c b/lib_enc/energy.c new file mode 100644 index 0000000000000000000000000000000000000000..f9cb7f6a2ef0630dde1f920d00e8dce2628d15cb --- /dev/null +++ b/lib_enc/energy.c @@ -0,0 +1,287 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "prot.h" +#include "cnst.h" +#include "rom_enc.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * background_update() + * + * + *-------------------------------------------------------------------*/ + +void background_update( + VAD_CLDFB_HANDLE hVAD_CLDFB, /* i/o: CLDFB VAD state */ + float frame_energy, /* i : current frame energy */ + const int16_t update_flag, /* i : current frame update flag */ + const int16_t music_backgound_f, /* i : background music flag */ + const float snr ) +{ + int16_t i, SNR_sb_num; + float *sb_bg_energy = hVAD_CLDFB->sb_bg_energy; + float *frame_sb_energy = hVAD_CLDFB->frame_sb_energy; + float *f_tonality_rate = hVAD_CLDFB->f_tonality_rate; + float *ltd_stable_rate = hVAD_CLDFB->ltd_stable_rate; + int16_t frameloop = hVAD_CLDFB->frameloop; + float t_bg_energy = hVAD_CLDFB->t_bg_energy; + + SNR_sb_num = ENERGY_BAND_NUM[hVAD_CLDFB->bw_index - CLDFBVAD_NB_ID]; + + frame_energy = frame_energy + 0.0001f; + + if ( ( frameloop < 60 ) && ( frameloop > 5 ) && ( f_tonality_rate[0] < 0.56 ) && + ( f_tonality_rate[1] < 0.5 ) && ltd_stable_rate[1] < 0.06 && snr < 2.5f ) + { + if ( frameloop < 50 ) + { + hVAD_CLDFB->t_bg_energy_sum += frame_energy / 10; + hVAD_CLDFB->tbg_energy_count++; + } + else + { + hVAD_CLDFB->t_bg_energy_sum += frame_energy; + hVAD_CLDFB->tbg_energy_count++; + } + + for ( i = 0; i < SNR_sb_num; i++ ) + { + sb_bg_energy[i] = sb_bg_energy[i] * 0.9f + frame_sb_energy[i] * 0.01f; + } + } + + if ( update_flag == 1 && frameloop > 2 && music_backgound_f == 0 ) + { + if ( hVAD_CLDFB->bg_update_count < 16 ) + { + if ( frameloop < 50 ) + { + hVAD_CLDFB->t_bg_energy_sum += frame_energy / 10; + hVAD_CLDFB->tbg_energy_count++; + } + else + { + hVAD_CLDFB->t_bg_energy_sum += frame_energy; + hVAD_CLDFB->tbg_energy_count++; + } + for ( i = 0; i < SNR_sb_num; i++ ) + { + sb_bg_energy[i] = sb_bg_energy[i] * 0.96f + frame_sb_energy[i] * 0.04f; + } + hVAD_CLDFB->bg_update_count++; + } + else + { + float a = 0.94f; + + if ( ( t_bg_energy < frame_energy ) && 24 * hVAD_CLDFB->frame_energy_smooth < frame_energy ) + { + for ( i = 0; i < SNR_sb_num; i++ ) + { + sb_bg_energy[i] = (float) ( sb_bg_energy[i] * 0.999f + frame_sb_energy[i] * 0.001 ); + } + } + else if ( 12 * t_bg_energy < frame_energy ) + { + if ( frameloop < 50 ) + { + hVAD_CLDFB->t_bg_energy_sum += frame_energy / 10; + hVAD_CLDFB->tbg_energy_count++; + } + else + { + hVAD_CLDFB->t_bg_energy_sum += frame_energy; + hVAD_CLDFB->tbg_energy_count++; + } + + for ( i = 0; i < SNR_sb_num; i++ ) + { + sb_bg_energy[i] = sb_bg_energy[i] * 0.96f + frame_sb_energy[i] * 0.04f; + } + } + else + { + if ( t_bg_energy > frame_energy ) + { + a = 0.95f; + if ( frameloop < 50 ) + { + hVAD_CLDFB->t_bg_energy_sum += frame_energy / 10; + hVAD_CLDFB->tbg_energy_count++; + } + else + { + hVAD_CLDFB->t_bg_energy_sum += frame_energy; + hVAD_CLDFB->tbg_energy_count++; + } + + for ( i = 0; i < SNR_sb_num; i++ ) + { + sb_bg_energy[i] = sb_bg_energy[i] * a + frame_sb_energy[i] * ( 1 - a ); + } + } + else + { + a = 0.96f; + if ( frameloop < 50 ) + { + hVAD_CLDFB->t_bg_energy_sum += frame_energy / 10; + hVAD_CLDFB->tbg_energy_count++; + } + else + { + hVAD_CLDFB->t_bg_energy_sum += frame_energy; + hVAD_CLDFB->tbg_energy_count++; + } + + for ( i = 0; i < SNR_sb_num; i++ ) + { + sb_bg_energy[i] = sb_bg_energy[i] * a + frame_sb_energy[i] * ( 1 - a ); + } + } + } + } + } + else + { + if ( ( t_bg_energy > 500 * frame_energy ) && ( sb_bg_energy[0] > 10 * frame_sb_energy[0] ) ) + { + for ( i = 0; i < SNR_sb_num; i++ ) + { + sb_bg_energy[i] = sb_bg_energy[i] * 0.9f + frame_sb_energy[i] * 0.1f; + } + } + else if ( t_bg_energy > 10 * frame_energy ) + { + for ( i = 0; i < SNR_sb_num; i++ ) + { + sb_bg_energy[i] = sb_bg_energy[i] * 0.999f + frame_sb_energy[i] * 0.001f; + } + } + } + + if ( hVAD_CLDFB->t_bg_energy_sum > 160 * hVAD_CLDFB->tbg_energy_count ) + { + hVAD_CLDFB->t_bg_energy_sum = 160.0f * hVAD_CLDFB->tbg_energy_count; + } + + if ( music_backgound_f == 1 && hVAD_CLDFB->lt_snr_org < 3.2 && t_bg_energy > 1 && update_flag == 0 ) + { + for ( i = 0; i < SNR_sb_num; i++ ) + { + sb_bg_energy[i] = sb_bg_energy[i] * 0.98f + 0.000001f; + } + } + if ( music_backgound_f == 1 && frame_energy < 5000 * t_bg_energy ) + { + for ( i = 0; i < SNR_sb_num; i++ ) + { + sb_bg_energy[i] = sb_bg_energy[i] * 0.98f + 0.000001f; + } + } + + if ( hVAD_CLDFB->tbg_energy_count == 64 ) + { + hVAD_CLDFB->tbg_energy_count = 48; + hVAD_CLDFB->t_bg_energy_sum = hVAD_CLDFB->t_bg_energy_sum * 0.75f; + } + + hVAD_CLDFB->t_bg_energy = hVAD_CLDFB->t_bg_energy_sum / hVAD_CLDFB->tbg_energy_count; + + return; +} + + +/*-------------------------------------------------------------------* + * est_energy() + * + * + *-------------------------------------------------------------------*/ + +void est_energy( + float sb_power[], /* o : energy of sub-band divided uniformly */ + float frame_sb_energy[], /* o : energy of sub-band divided non-uniformly */ + float *p_frame_energy, /* o : frame energy 1 */ + float *p_frame_energy2, /* o : frame energy 2 */ + float *p_high_energy, /* o : high frequency energy */ + const int16_t bw /* i : bandwidth */ +) +{ + int16_t i, j, SNR_sb_num; + float frame_energy2, high_energy; + int16_t band_num = BAND_NUM_TAB[bw]; + const float sb_power_scale[5] = { 0.0f, 0.16f, 0.24f, 0.28f, 0.28f }; + const int16_t *Nregion_index; + + frame_energy2 = 0.0f; + high_energy = 0.0f; + for ( i = 0; i < band_num; i++ ) + { + if ( i > 0 && ( i != band_num - 1 ) ) + { + frame_energy2 += sb_power[i]; + } + if ( i > 5 ) + { + high_energy += sb_power[i]; + } + } + + high_energy /= ( PCM16_TO_FLT_FAC * PCM16_TO_FLT_FAC ); + frame_energy2 /= ( PCM16_TO_FLT_FAC * PCM16_TO_FLT_FAC ); + + Nregion_index = REGION_INDEX[bw - CLDFBVAD_NB_ID]; + SNR_sb_num = ENERGY_BAND_NUM[bw - CLDFBVAD_NB_ID]; + + for ( i = 0; i < SNR_sb_num; i++ ) + { + frame_sb_energy[i] = 0; + for ( j = Nregion_index[i]; j < Nregion_index[i + 1]; j++ ) + { + frame_sb_energy[i] += sb_power[j]; + } + + frame_sb_energy[i] /= ( PCM16_TO_FLT_FAC * PCM16_TO_FLT_FAC ); + } + *p_high_energy = high_energy; + *p_frame_energy2 = frame_energy2; + *p_frame_energy = frame_energy2 + ( sb_power_scale[bw] * sb_power[0] / ( PCM16_TO_FLT_FAC * PCM16_TO_FLT_FAC ) ); + + return; +} diff --git a/lib_enc/eval_pit_contr.c b/lib_enc/eval_pit_contr.c new file mode 100644 index 0000000000000000000000000000000000000000..7f6a026ac26d0313b131f2e6c04b43ac56d8c407 --- /dev/null +++ b/lib_enc/eval_pit_contr.c @@ -0,0 +1,357 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * Local constantes + *-------------------------------------------------------------------*/ + +#define NB_VOIC 13 +#define DIV_NB_VOIC ( 1.0f / NB_VOIC ) +#define ALPA 0.95f +#define ALPAM1 ( 1.0f - ALPA ) +#define BETA ( ALPAM1 / 2.0f ) +#define AFREQ_THR 2 +#define GPIT_THR 0.4f +#define HANGOVER_DELAY 2 + +/*-------------------------------------------------------------------* + * Pit_exc_contribution_len() + * + * Determine up to which band the pit contribution is significant + *-------------------------------------------------------------------*/ + +/*! r: bin where pitch contribution is significant */ +int16_t Pit_exc_contribution_len( + Encoder_State *st, /* i/o: state structure */ + const float *dct_res, /* i : DCT of residual */ + float *dct_pitex, /* i/o: DCT of pitch contribution */ + float *pitch_buf, /* i/o: Pitch per subframe */ + int16_t *hangover /* i : hangover for the time contribution switching*/ +) +{ + float corr_dct_pit[MBANDS_LOC], corr_tmp; + float av_corr, min_corr, ftmp; + int16_t freq, i, j; + int16_t last_pit_band, pit_contr_idx, last_pit_bin; + GSC_ENC_HANDLE hGSCEnc; + float ener_res; + float ener_pit; + float low_pit, F1st_harm, F8th_harm; + float corr_dct_pit_tmp[MBANDS_LOC]; + int16_t time_flg = 0; + int16_t Len, max_len; + int16_t tmp_dec; + int16_t Mbands_loc = MBANDS_LOC - 2; + BSTR_ENC_HANDLE hBstr; + + /* initialization */ + hGSCEnc = st->hGSCEnc; + hBstr = st->hBstr; + + if ( st->L_frame == L_FRAME16k ) + { + Mbands_loc = MBANDS_LOC; + } + + minimum( pitch_buf, st->L_frame >> 6, &low_pit ); + + F1st_harm = (float) INT_FS_12k8 / low_pit; + if ( st->L_frame == L_FRAME16k ) + { + F1st_harm = (float) INT_FS_16k / low_pit; + } + F8th_harm = 8.0f * F1st_harm; + + freq = 0; + for ( i = 0; i < Mbands_loc; i++ ) + { + corr_tmp = 0.0f; + ener_res = 0.1f; + ener_pit = 0.1f; + + for ( j = 0; j < mfreq_bindiv_loc[i]; j++ ) + { + corr_tmp += dct_res[j + freq] * dct_pitex[j + freq]; + ener_res += dct_res[j + freq] * dct_res[j + freq]; + ener_pit += dct_pitex[j + freq] * dct_pitex[j + freq]; + } + + corr_dct_pit[i] = (float) ( corr_tmp / sqrt( ener_res * ener_pit ) ); + freq += mfreq_bindiv_loc[i]; + } + + /* Smooth the inter-correlation value and skip the last band for the average (since last band is almost always 0)*/ + corr_dct_pit_tmp[0] = ALPA * corr_dct_pit[0] + ALPAM1 * corr_dct_pit[1]; + if ( corr_dct_pit_tmp[0] < 0.5f ) + { + corr_dct_pit_tmp[0] = 0.5f; + } + corr_dct_pit_tmp[0] = ( corr_dct_pit_tmp[0] - 0.5f ) * 2.0f; + + for ( i = 1; i < Mbands_loc - 1; i++ ) + { + corr_dct_pit_tmp[i] = ALPA * corr_dct_pit[i] + BETA * corr_dct_pit[i + 1] + BETA * corr_dct_pit[i - 1]; + if ( corr_dct_pit_tmp[i] < 0.5f ) + { + corr_dct_pit_tmp[i] = 0.5f; + } + corr_dct_pit_tmp[i] = ( corr_dct_pit_tmp[i] - 0.5f ) * 2.0f; + } + + corr_dct_pit_tmp[i] = ALPA * corr_dct_pit[i] + ALPAM1 * corr_dct_pit[i - 1]; + + if ( corr_dct_pit_tmp[i] < 0.5f ) + { + corr_dct_pit_tmp[i] = 0.5f; + } + corr_dct_pit_tmp[i] = ( corr_dct_pit_tmp[i] - 0.5f ) * 2.0f; + + for ( i = 0; i < Mbands_loc; i++ ) + { + corr_dct_pit[i] = corr_dct_pit_tmp[i]; + } + + av_corr = DIV_NB_VOIC * corr_dct_pit[0]; + for ( i = 1; i < NB_VOIC; i++ ) + { + av_corr += DIV_NB_VOIC * corr_dct_pit[i]; + } + + /* Find the cut-off freq similarly to HSX */ + last_pit_band = 0; + + av_corr *= 6400; + if ( st->L_frame == L_FRAME16k ) + { + av_corr *= 1.25f; + } + + if ( st->GSC_IVAS_mode >= 1 || st->core_brate < ACELP_9k60 ) + { + /* Correlation really poor at low rate, time domain still valide */ + av_corr *= 2.0; + } + + min_corr = (float) fabs( mfreq_loc[0] - av_corr ); + + for ( i = 1; i < Mbands_loc; i++ ) + { + ftmp = (float) fabs( mfreq_loc[i] - av_corr ); + if ( ftmp < min_corr ) + { + last_pit_band = i; + min_corr = ftmp; + } + } + + if ( F8th_harm > mfreq_loc[last_pit_band] ) + { + do + { + last_pit_band++; + } while ( F8th_harm >= mfreq_loc[last_pit_band] ); + } + + if ( st->GSC_IVAS_mode >= 1 ) + { + last_pit_band = max( last_pit_band, 7 ); + } + + if ( last_pit_band > 7 + BAND1k2 && ( st->core_brate < CFREQ_BITRATE || st->bwidth == NB ) ) + { + last_pit_band = 7 + BAND1k2; + } + else if ( last_pit_band > 10 + BAND1k2 && st->core_brate >= CFREQ_BITRATE ) + { + last_pit_band = 10 + BAND1k2; + } + + time_flg = 0; + if ( ( hGSCEnc->mem_last_pit_band > 0 && st->old_corr > 0.5f && st->hSpMusClas->mold_corr > 0.5f && hGSCEnc->lt_gpitch >= 1.5f * GPIT_THR ) || ( last_pit_band > 6 ) || ( last_pit_band >= 4 && hGSCEnc->lt_gpitch >= 1.5f * GPIT_THR && st->old_corr > 0.7f ) || ( last_pit_band > BAND1k2 && st->hSpMusClas->mold_corr > 0.80f && hGSCEnc->lt_gpitch >= GPIT_THR ) ) + { + tmp_dec = 1; + } + else + { + tmp_dec = 0; + } + + /* Different past and current decision */ + if ( ( hGSCEnc->mem_last_pit_band == 0 && tmp_dec == 1 ) || ( hGSCEnc->mem_last_pit_band > 0 && tmp_dec == 0 ) ) + { + if ( *hangover == 0 ) + { + time_flg = tmp_dec; + *hangover = HANGOVER_DELAY; + } + else + { + time_flg = 0; + if ( hGSCEnc->mem_last_pit_band > 0 ) + { + time_flg = 1; + } + + ( *hangover ) -= 1; + if ( *hangover < 0 ) + { + *hangover = 0; + } + } + } + else + { + time_flg = tmp_dec; + *hangover = HANGOVER_DELAY; + } + + /* Decicison on final length of time contribution */ + pit_contr_idx = 0; + if ( time_flg == 1 || st->coder_type != INACTIVE || st->GSC_noisy_speech ) + { + if ( st->core_brate < ACELP_9k60 && low_pit < 64 ) + { + last_pit_band = 9 + BAND1k2; + if ( st->bwidth == NB ) + { + last_pit_band = 7 + BAND1k2; + } + } + else if ( st->core_brate < ACELP_9k60 && low_pit < 128 ) + { + last_pit_band = 5 + BAND1k2; + } + else if ( st->core_brate < ACELP_9k60 ) + { + last_pit_band = 3 + BAND1k2; + } + else if ( last_pit_band < BAND1k2 + 1 ) + { + last_pit_band = BAND1k2 + 1; + } + + last_pit_bin = (int16_t) ( mfreq_loc[last_pit_band] / BIN_SIZE ); + + st->bpf_off = 0; + + max_len = st->L_frame - last_pit_bin; + if ( st->bwidth == NB ) + { + max_len = 160 - last_pit_bin; + } + + Len = 80; + if ( max_len < 80 ) + { + Len = max_len; + } + + if ( st->core_brate == ACELP_8k00 && st->bwidth != NB ) + { + for ( i = 0; i < max_len; i++ ) + { + dct_pitex[i + last_pit_bin] = 0.0f; + } + } + else + { + for ( i = 0; i < Len; i++ ) + { + dct_pitex[i + last_pit_bin] *= sm_table[i]; + } + + for ( ; i < max_len; i++ ) + { + dct_pitex[i + last_pit_bin] = 0.0f; + } + } + + hGSCEnc->mem_last_pit_band = last_pit_band; + pit_contr_idx = last_pit_band - BAND1k2; + } + else + { + set_f( dct_pitex, 0.0f, st->L_frame ); + st->bpf_off = 1; + last_pit_bin = 0; + last_pit_band = 0; + pit_contr_idx = 0; + hGSCEnc->mem_last_pit_band = 0; + set_f( pitch_buf, (float) L_SUBFR, NB_SUBFR16k ); + + /* pitch contribution useless - delete all previously written indices belonging to pitch contribution */ + for ( i = TAG_ACELP_SUBFR_LOOP_START; i < TAG_ACELP_SUBFR_LOOP_END; i++ ) + { + delete_indice( hBstr, i ); + } + + delete_indice( hBstr, IND_ES_PRED ); + } + + if ( st->core_brate < CFREQ_BITRATE ) + { + if ( st->core_brate < ACELP_9k60 ) + { + if ( pit_contr_idx > 0 ) + { + pit_contr_idx = 1; + } + + if ( st->coder_type == INACTIVE ) + { + push_indice( hBstr, IND_PIT_CONTR_IDX, pit_contr_idx, 1 ); + } + } + else + { + push_indice( hBstr, IND_PIT_CONTR_IDX, pit_contr_idx, 3 ); + } + } + else + { + push_indice( hBstr, IND_PIT_CONTR_IDX, pit_contr_idx, 4 ); + } + + return last_pit_bin; +} diff --git a/lib_enc/evs_enc.c b/lib_enc/evs_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..7ae9a30bcc06409cd78337aa0ae5dccc7ce7793f --- /dev/null +++ b/lib_enc/evs_enc.c @@ -0,0 +1,651 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * Local function prototypes + *-------------------------------------------------------------------*/ + +static void configure_core_coder( Encoder_State *st ); + +static void writeFrameHeader( Encoder_State *st ); + +static void initFrameHeader( Encoder_State *st ); + + +/*-------------------------------------------------------------------* + * evs_enc() + * + * Principal encoder routine + *-------------------------------------------------------------------*/ + +ivas_error evs_enc( + Encoder_State *st, /* i/o: encoder state structure */ + const int16_t *data, /* i : input signal */ + float *mem_hp20_in, /* i/o: hp20 filter memory */ + const int16_t n_samples /* i : number of input samples */ +) +{ + int16_t i, input_frame, delay; + float old_inp_12k8[L_INP_12k8], *inp; /* buffer of input signal @ 12k8 */ + float old_inp_16k[L_INP]; /* buffer of input signal @ 16kHz */ + float fr_bands[2 * NB_BANDS]; /* energy in frequency bands */ + float ener; /* residual energy from Levinson-Durbin */ + float A[NB_SUBFR16k * ( M + 1 )]; /* A(z) unquantized for subframes */ + float Aw[NB_SUBFR16k * ( M + 1 )]; /* weighted A(z) unquantized for subframes */ + float epsP[M + 1]; /* LP prediction errors */ + float lsp_new[M]; /* LSPs at the end of the frame */ + float lsp_mid[M]; /* ISPs in the middle of the frame */ + int16_t vad_hover_flag; /* VAD hangover flag */ + int16_t hq_core_type; /* HQ core type (HQ, or LR-MDCT) */ + int16_t attack_flag; /* attack flag (GSC or TC) */ + float new_inp_resamp16k[L_FRAME16k]; /* new input signal @16kHz, non pre-emphasised, used by the WB TBE/BWE */ + float old_syn_12k8_16k[L_FRAME16k]; /* ACELP core synthesis at 12.8kHz or 16kHz to be used by the SWB BWE */ + float shb_speech[L_FRAME16k]; + float hb_speech[L_FRAME16k / 4]; + float new_swb_speech[L_FRAME48k]; + float bwe_exc_extended[L_FRAME32k + NL_BUFF_OFFSET]; + float voice_factors[NB_SUBFR16k]; + float fb_exc[L_FRAME16k]; + int16_t Voicing_flag; + float pitch_buf[NB_SUBFR16k]; + int16_t unbits; + int16_t padBits; + float realBuffer[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; /* real buffer */ + float imagBuffer[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; /* imag buffer */ +#ifndef FIX_I4_OL_PITCH + int16_t pitch_orig[3]; /* original open-loop pitch values that might be altered in core_acelp_tcx20_switching() within MODE2 */ +#endif + ivas_error error; + + error = IVAS_ERR_OK; + + push_wmops( "evs_enc" ); + + /*------------------------------------------------------------------* + * Initialization + *-----------------------------------------------------------------*/ + + input_frame = (int16_t) ( st->input_Fs / FRAMES_PER_SEC ); + st->core = -1; + st->extl = -1; + st->core_brate = -1; + st->input_bwidth = st->last_input_bwidth; + st->bwidth = st->last_bwidth; + hq_core_type = -1; + unbits = 0; + + st->bits_frame_core = 0; /* For getting bit consumption in core coder */ + st->hTdCngEnc->lp_cng_mode2 = 0; + st->mdct_sw_enable = 0; + st->mdct_sw = 0; + st->rate_switching_reset = 0; + + st->idchan = 0; + st->flag_ACELP16k = set_ACELP_flag( EVS_MONO, -1, st->total_brate, 0, 0, -1, -1 ); + + /*----------------------------------------------------------------* + * set input samples buffer + *----------------------------------------------------------------*/ + + /* get delay to synchronize ACELP and MDCT frame */ + delay = NS2SA( st->input_Fs, DELAY_FIR_RESAMPL_NS ); + + mvr2r( st->input - delay, st->old_input_signal, input_frame + delay ); + + /*----------------------------------------------------------------* + * convert 'short' input data to 'float' + *----------------------------------------------------------------*/ + + for ( i = 0; i < n_samples; i++ ) + { + st->input[i] = (float) data[i]; + } + + if ( n_samples < input_frame ) + { + set_f( st->input + n_samples, 0.0f, input_frame - n_samples ); + } + + /*----------------------------------------------------------------* + * HP filtering + *----------------------------------------------------------------*/ + + hp20( st->input, input_frame, mem_hp20_in, st->input_Fs ); + + /*----------------------------------------------------------------* + * Updates in case of AMR-WB IO mode -> EVS primary mode switching + *----------------------------------------------------------------*/ + + if ( st->last_core == AMR_WB_CORE ) + { + updt_IO_switch_enc( st, input_frame ); + cldfb_reset_memory( st->cldfbAnaEnc ); + cldfb_reset_memory( st->cldfbSynTd ); + } + + /*---------------------------------------------------------------------* + * Pre-processing + *---------------------------------------------------------------------*/ + +#ifdef FIX_I4_OL_PITCH + pre_proc( st, input_frame, old_inp_12k8, old_inp_16k, &inp, fr_bands, Etot, &ener, A, Aw, epsP, lsp_new, lsp_mid, &vad_hover_flag, &attack_flag, new_inp_resamp16k, &Voicing_flag, realBuffer, imagBuffer, &hq_core_type ); +#else + pre_proc( st, input_frame, old_inp_12k8, old_inp_16k, &inp, fr_bands, &ener, pitch_orig, A, Aw, epsP, lsp_new, lsp_mid, &vad_hover_flag, &attack_flag, new_inp_resamp16k, &Voicing_flag, realBuffer, imagBuffer, &hq_core_type ); +#endif + + if ( st->mdct_sw == MODE2 ) + { + st->bits_frame_nominal = (int16_t) ( st->total_brate / FRAMES_PER_SEC ); + initFrameHeader( st ); + + writeFrameHeader( st ); + + if ( ( st->total_brate > ACELP_24k40 && st->total_brate < HQ_96k ) || ( st->total_brate == ACELP_24k40 && st->bwidth >= WB ) ) + { + st->L_frame = L_FRAME16k; + st->gamma = GAMMA16k; + st->preemph_fac = PREEMPH_FAC_16k; + + weight_a_subfr( NB_SUBFR16k, A, Aw, GAMMA16k, M ); + + if ( st->last_L_frame == L_FRAME && st->ini_frame != 0 ) + { + /* this is just an approximation, but it is sufficient */ + mvr2r( st->lsp_old1, st->lspold_enc, M ); + } + } + else + { + st->L_frame = L_FRAME; + st->gamma = GAMMA1; + st->preemph_fac = PREEMPH_FAC; + } + + st->sr_core = st->L_frame * FRAMES_PER_SEC; + st->core_brate = st->total_brate; + + st->igf = 0; + hq_core_type = NORMAL_HQ_CORE; + + if ( ( st->bwidth == SWB || st->bwidth == WB ) && st->total_brate <= LRMDCT_CROSSOVER_POINT ) + { + /* note that FB (bitrate >= 24400 bps) is always coded with NORMAL_HQ_CORE */ + hq_core_type = LOW_RATE_HQ_CORE; + } + else if ( st->bwidth == NB ) + { + hq_core_type = LOW_RATE_HQ_CORE; + } + } + + /*---------------------------------------------------------------------* + * Encoding + *---------------------------------------------------------------------*/ + + if ( st->codec_mode == MODE1 ) + { + /* write signaling info into the bitstream */ + signaling_enc( st ); + + /*---------------------------------------------------------------------* + * Preprocessing (preparing) for ACELP/HQ core switching + *---------------------------------------------------------------------*/ + + core_switching_pre_enc( st, old_inp_12k8, old_inp_16k, 0, 0 ); + + /*---------------------------------------------------------------------* + * ACELP core encoding + *---------------------------------------------------------------------*/ + + if ( st->core == ACELP_CORE ) + { + if ( ( error = acelp_core_enc( st, inp, ener, A, Aw, epsP, lsp_new, lsp_mid, vad_hover_flag, attack_flag, bwe_exc_extended, voice_factors, old_syn_12k8_16k, pitch_buf, &unbits, NULL, NULL ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /*---------------------------------------------------------------------* + * HQ core encoding + *---------------------------------------------------------------------*/ + + if ( st->core == HQ_CORE ) + { + hq_core_enc( st, st->input - delay, input_frame, hq_core_type, Voicing_flag, vad_hover_flag ); + } + + /*---------------------------------------------------------------------* + * Postprocessing for ACELP/HQ core switching + *---------------------------------------------------------------------*/ + + core_switching_post_enc( st, old_inp_12k8, old_inp_16k, A ); + +#ifndef FIX_I4_OL_PITCH + if ( st->core == HQ_CORE ) + { + mvs2s( pitch_orig, st->pitch, 3 ); /* original open-loop pitch values might be altered in core_acelp_tcx20_switching() */ + } +#endif + } + + else /* MODE2 */ + { + + /*----------------------------------------------------------------* + * Configuration of core coder/SID + * Write Frame Header + *----------------------------------------------------------------*/ + + configure_core_coder( st ); + + if ( st->mdct_sw != MODE1 ) + { + writeFrameHeader( st ); + } + + /*----------------------------------------------------------------* + * Core-Coder + *----------------------------------------------------------------*/ + + /* Call main encoding function */ + enc_acelp_tcx_main( st, old_inp_16k + L_INP_MEM, Aw, lsp_new, lsp_mid, bwe_exc_extended, voice_factors, pitch_buf, vad_hover_flag ); + +#ifndef FIX_I4_OL_PITCH + mvs2s( pitch_orig, st->pitch, 3 ); /* populate the original OL pitch values back */ +#endif + + /*---------------------------------------------------------------------* + * Postprocessing for Mode 1/2 switching + *---------------------------------------------------------------------*/ + /* TBE for Mode 2 interface */ + if ( st->igf && st->core_brate > SID_2k40 ) + { + if ( st->core == ACELP_CORE ) + { + switch ( st->bwidth ) + { + case WB: + st->extl = WB_TBE; + st->extl_brate = WB_TBE_0k35; + break; + + case SWB: + st->extl = SWB_TBE; + st->extl_brate = SWB_TBE_1k6; + + if ( st->total_brate < ACELP_13k20 ) + { + st->extl_brate = SWB_TBE_0k95; + } + else if ( st->total_brate >= ACELP_24k40 ) + { + st->extl_brate = SWB_TBE_2k8; + } + + break; + + case FB: + st->extl = FB_TBE; + st->extl_brate = FB_TBE_1k8; + + if ( st->total_brate >= ACELP_24k40 ) + { + st->extl_brate = FB_TBE_3k0; + } + + break; + } + } + else + { + st->coder_type = -1; + st->extl = IGF_BWE; + st->extl_brate = 0; + } + + st->core_brate = st->total_brate - st->extl_brate; + + if ( st->tec_tfa == 1 ) + { + st->core_brate -= BITS_TEC; + st->core_brate -= BITS_TFA; + } + } + + /*----------------------------------------------------------------* + * Complete Bitstream Writing + *----------------------------------------------------------------*/ + + /* Pad the bitstream with zeros and byte-alignment*/ + if ( st->igf && st->core == ACELP_CORE && st->core_brate > SID_2k40 ) + { + padBits = ( ( st->bits_frame + 7 ) / 8 ) * 8 - ( st->hBstr->nb_bits_tot + ( st->rf_target_bits_write - ( ( st->rf_mode == 1 ) ? 1 : 0 ) ) + get_tbe_bits( st->total_brate, st->bwidth, st->rf_mode ) ); + } + else + { + padBits = ( ( st->bits_frame + 7 ) / 8 ) * 8 - ( st->hBstr->nb_bits_tot + ( st->rf_target_bits_write - ( ( st->rf_mode == 1 ) ? 1 : 0 ) ) ); + } + for ( i = 0; i < padBits; i++ ) + { + push_next_indice( st->hBstr, 0, 1 ); + } + } + + /*---------------------------------------------------------------------* + * WB TBE encoding + * WB BWE encoding + *---------------------------------------------------------------------*/ + push_wmops( "BWE_encoding" ); + + if ( st->input_Fs >= 16000 && st->bwidth < SWB ) + { + /* Common pre-processing for WB TBE and WB BWE */ + wb_pre_proc( st, -1, new_inp_resamp16k, hb_speech ); + } + + if ( st->extl == WB_TBE ) + { + /* WB TBE encoder */ + wb_tbe_enc( st, hb_speech, bwe_exc_extended, voice_factors, pitch_buf ); + + if ( st->codec_mode == MODE2 ) + { + tbe_write_bitstream( st ); + } + } + else if ( st->extl == WB_BWE ) + { + /* WB BWE encoder */ + wb_bwe_enc( st, new_inp_resamp16k ); + } + + /*---------------------------------------------------------------------* + * SWB(FB) TBE encoding + * SWB(FB) BWE encoding + *---------------------------------------------------------------------*/ + + if ( !st->Opt_SC_VBR && st->input_Fs >= 32000 ) + { + /* Common pre-processing for SWB(FB) TBE and SWB(FB) BWE */ + swb_pre_proc( st, new_swb_speech, shb_speech, realBuffer, imagBuffer, NULL ); + } + else if ( st->input_Fs >= 32000 ) + { + InitSWBencBufferStates( st->hBWE_TD, shb_speech ); + } + + /* SWB TBE encoder */ + if ( st->extl == SWB_TBE || st->extl == FB_TBE || ( st->igf && st->core == ACELP_CORE && st->extl != WB_TBE ) ) + { + if ( st->core_brate != FRAME_NO_DATA && st->core_brate != SID_2k40 ) + { + swb_tbe_enc( st, NULL, shb_speech, bwe_exc_extended, voice_factors, fb_exc, pitch_buf ); + + if ( st->extl == FB_TBE ) + { + /* FB TBE encoder */ + fb_tbe_enc( st, st->input, fb_exc ); + } + + if ( st->codec_mode == MODE2 ) + { + if ( st->tec_tfa == 1 ) + { + tecEnc_TBE( &( st->hTECEnc->corrFlag ), st->voicing, st->coder_type ); + + if ( st->coder_type == INACTIVE ) + { + st->tec_flag = 0; + st->hTECEnc->corrFlag = 0; + } + st->tfa_flag = tfaEnc_TBE( st->tfa_enr, st->last_core, st->voicing, pitch_buf ); + set_TEC_TFA_code( st->hTECEnc->corrFlag, &st->tec_flag, &st->tfa_flag ); + } + else + { + st->tec_flag = 0; + st->hTECEnc->corrFlag = 0; + st->tfa_flag = 0; + } + + tbe_write_bitstream( st ); + } + } + } + else if ( st->extl == SWB_BWE || st->extl == FB_BWE ) + { + /* SWB(FB) BWE encoder */ + swb_bwe_enc( st, EVS_MONO, old_inp_12k8, old_inp_16k, old_syn_12k8_16k, new_swb_speech, shb_speech ); + } + else if ( st->extl == SWB_BWE_HIGHRATE || st->extl == FB_BWE_HIGHRATE ) + { + swb_bwe_enc_hr( st, st->input - delay, input_frame, unbits ); + } + + + /*---------------------------------------------------------------------* + * SWB DTX/CNG encoding + *---------------------------------------------------------------------*/ + + if ( st->Opt_DTX_ON && input_frame >= L_FRAME32k ) + { + /* SHB DTX/CNG encoder */ + swb_CNG_enc( st, shb_speech, old_syn_12k8_16k ); + } + + pop_wmops(); + /*---------------------------------------------------------------------* + * Channel-aware mode - write signaling information into the bitstream + *---------------------------------------------------------------------*/ + + signaling_enc_rf( st ); + + + /*---------------------------------------------------------------------* + * Updates + *---------------------------------------------------------------------*/ + + updt_enc_common( st ); + + if ( st->mdct_sw == MODE1 ) + { + st->codec_mode = MODE1; + } + + + if ( st->hTdCngEnc->lp_cng_mode2 ) + { + st->codec_mode = MODE2; + } + + + pop_wmops(); + + return error; +} + + +/*-------------------------------------------------------------------* + * initFrameHeader() + * + * Init Mode 2 frame header + *-------------------------------------------------------------------*/ + +static void initFrameHeader( + Encoder_State *st /* i/o: encoder state structure */ +) +{ + int16_t n; + + if ( st->core_brate == SID_2k40 ) + { + /*Get size of frame*/ + st->bits_frame = FRAME_2_4; + st->bits_frame_core += FRAME_2_4 - 4; /*1 bit for SID on/off + 2 bits for bandwith in case of SID + 1 bit CNG type */ + st->frame_size_index = 2; + } + else if ( st->core_brate == FRAME_NO_DATA ) + { + st->bits_frame = FRAME_0; + st->bits_frame_core += st->bits_frame; + st->frame_size_index = 0; + } + else + { + for ( n = 0; n < FRAME_SIZE_NB; n++ ) + { + if ( n < FRAME_SIZE_NB - 1 ) + { + if ( FrameSizeConfig[n].frame_bits <= st->bits_frame_nominal && FrameSizeConfig[n + 1].frame_bits > st->bits_frame_nominal ) + { + st->frame_size_index = n; + st->bits_frame = st->bits_frame_nominal; + st->bits_frame_core = st->bits_frame_nominal - FrameSizeConfig[n].transmission_bits - FrameSizeConfig[n].bandwidth_bits - FrameSizeConfig[n].reserved_bits; + break; + } + } + else + { + if ( FrameSizeConfig[n].frame_bits <= st->bits_frame_nominal ) + { + st->frame_size_index = n; + st->bits_frame = st->bits_frame_nominal; + st->bits_frame_core = st->bits_frame_nominal - FrameSizeConfig[n].transmission_bits - FrameSizeConfig[n].bandwidth_bits - FrameSizeConfig[n].reserved_bits; + break; + } + } + } + } + + return; +} + +/*-------------------------------------------------------------------* + * writeFrameHeader() + * + * Write Mode 2 frame header + *-------------------------------------------------------------------*/ + +static void writeFrameHeader( + Encoder_State *st /* i/o: encoder state structure */ +) +{ + BSTR_ENC_HANDLE hBstr = st->hBstr; + + if ( st->core_brate != FRAME_NO_DATA ) + { + /* SID flag at 2.4kbps */ + if ( st->core_brate == SID_2k40 ) + { + if ( st->cng_type == FD_CNG ) + { + /* write SID/CNG type flag */ + push_next_indice( hBstr, 1, 1 ); + + /* write bandwidth info */ + push_next_indice( hBstr, st->bwidth, 2 ); + + /* write L_frame */ + if ( st->L_frame == L_FRAME ) + { + push_next_indice( hBstr, 0, 1 ); + } + else + { + push_next_indice( hBstr, 1, 1 ); + } + } + } + else /* active frames */ + { + if ( st->rf_mode == 0 ) + { + push_next_indice( hBstr, st->bwidth - FrameSizeConfig[st->frame_size_index].bandwidth_min, FrameSizeConfig[st->frame_size_index].bandwidth_bits ); + } + } + + /* Write reserved bit */ + if ( FrameSizeConfig[st->frame_size_index].reserved_bits && st->rf_mode == 0 ) + { + push_next_indice( hBstr, 0, FrameSizeConfig[st->frame_size_index].reserved_bits ); + } + } + + return; +} + +/*------------------------------------------------------------------------* + * Configuration of core coder/SID + *------------------------------------------------------------------------*/ + +static void configure_core_coder( + Encoder_State *st /* i/o: encoder state structure */ +) +{ + initFrameHeader( st ); + + if ( st->core_brate != SID_2k40 && st->core_brate != FRAME_NO_DATA ) + { + if ( st->tcxonly ) + { + st->coder_type = GENERIC; + } + + st->hTcxCfg->coder_type = st->coder_type; + + + if ( !st->tcxonly && !st->localVAD && st->hTcxCfg->coder_type == GENERIC ) + { + st->hTcxCfg->coder_type = UNVOICED; + } + } + + st->igf = getIgfPresent( 0, st->total_brate, st->bwidth, st->rf_mode ); + + if ( st->core_brate != SID_2k40 && st->core_brate != FRAME_NO_DATA ) + { + st->core_brate = st->total_brate; + } + + return; +} diff --git a/lib_enc/ext_sig_ana.c b/lib_enc/ext_sig_ana.c new file mode 100644 index 0000000000000000000000000000000000000000..6488407e3305aa3f7458cc041cd1cc14f56504c8 --- /dev/null +++ b/lib_enc/ext_sig_ana.c @@ -0,0 +1,449 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include "options.h" +#include +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + + +/*-------------------------------------------------------------------* + * core_signal_analysis_high_bitrate() + * + * + *-------------------------------------------------------------------*/ + +void core_signal_analysis_high_bitrate( + const float *new_samples, + const int16_t T_op[3], /* i : open-loop pitch values for quantiz. */ + float lsp_new[], + float lsp_mid[], + Encoder_State *st, + float *mdst_spectrum[2], + int16_t pTnsSize[], + int16_t pTnsBits[], + int16_t param_core[], + int16_t *ltpBits, + float *windowed_samples, /* i/o: backup of windowed time signal */ + const int16_t L_frame, + const int16_t L_frameTCX, + const int16_t last_element_mode, + const int16_t vad_hover_flag /* i : VAD hangover flag */ +) +{ + TCX_ENC_HANDLE hTcxEnc = st->hTcxEnc; + + const int16_t last_overlap = st->hTcxCfg->tcx_last_overlap_mode; + const int16_t curr_overlap = st->hTcxCfg->tcx_curr_overlap_mode; + const int16_t minWindowLen = st->hTcxCfg->tcx_mdct_window_min_lengthFB - 1; + int16_t i, frameno; + int16_t L_subframe; + int16_t left_overlap = -1, right_overlap = -1, folding_offset; + float buf[N_MAX + L_MDCT_OVLP_MAX]; /* Buffer for TCX20/TCX10 windowing */ + float mdstWin[N_MAX + L_MDCT_OVLP_MAX]; /* Buffer for MDST windowing */ + float *powerSpec; + float *tcx20Win; + float tcx5Win[N_TCX10_MAX / 2 + L_MDCT_OVLP_MAX]; /* Buffer for TCX5 windowing and interleaving. */ + float *interleaveBuf = tcx5Win; + int16_t nSubframes; + int16_t overlap_mode[3]; + int16_t *transform_type = hTcxEnc->transform_type; + float r[M + 1]; + float A[M + 1]; + float *lsp[2]; + const int16_t tcx10SizeFB = 2 * st->hTcxCfg->tcx5SizeFB; + const int16_t tcx5SizeFB = st->hTcxCfg->tcx5SizeFB; + const int16_t tcx10Size = 2 * st->hTcxCfg->tcx5Size; + int16_t alw_pitch_lag_12k8[2], alw_pitch_lag_12k8_wc = -1; + float alw_voicing[2], alw_voicing_wc = -1; + int16_t disable_ltp = 0; + + if ( last_element_mode != st->element_mode ) + { + disable_ltp = 1; /* disable TCX-LTP in stereo switching to avoid discontinuities in synthesis */ + } + + powerSpec = tcx20Win = buf; /* Share memory for windowed TD signal and for the power spectrum */ + + /*--------------------------------------------------------------* + * Input Signal Processing: copy, HP filter, pre-emphasis + *---------------------------------------------------------------*/ + + if ( st->tcxonly && st->element_mode != IVAS_CPE_MDCT ) + { + /* Copy Samples */ + mvr2r( new_samples, st->new_speech_enc, L_frame ); + } + + /*--------------------------------------------------------------* + * TCX-LTP + *---------------------------------------------------------------*/ + + if ( st->element_mode == IVAS_CPE_DFT ) + { + tcx_ltp_encode( st, hTcxEnc->tcxMode, L_frame, st->wspeech_enc, NULL, st->wspeech_enc, T_op, ¶m_core[1 + NOISE_FILL_RANGES], ltpBits, NULL, disable_ltp, st->element_mode ); + } + else if ( st->element_mode != IVAS_CPE_MDCT ) + { + tcx_ltp_encode( st, hTcxEnc->tcxMode, L_frame, st->speech_enc + st->encoderLookahead_enc, hTcxEnc->speech_ltp + st->encoderLookahead_enc, st->speech_enc + st->encoderLookahead_enc, T_op, ¶m_core[1 + NOISE_FILL_RANGES], ltpBits, NULL, disable_ltp, st->element_mode ); + } + + if ( st->tcxonly && st->element_mode != IVAS_CPE_MDCT ) + { + mvr2r( st->speech_enc + st->encoderLookahead_enc, st->new_speech_enc_pe, L_frame ); + + preemph( st->new_speech_enc_pe, st->preemph_fac, L_frame, &( st->mem_preemph_enc ) ); + } + + if ( hTcxEnc->tcxMode == TCX_10 ) + { + mvs2s( ¶m_core[1 + NOISE_FILL_RANGES], ¶m_core[NPRM_DIV + 1 + NOISE_FILL_RANGES], LTPSIZE ); + } + + if ( st->element_mode != IVAS_CPE_MDCT ) + { + lsp[0] = lsp_new; + lsp[1] = lsp_mid; + } + + /*-------------------------------------------------------------------------* + * Decision matrix for the transform and overlap length + *--------------------------------------------------------------------------*/ + + if ( st->element_mode != IVAS_CPE_MDCT ) + { + alw_pitch_lag_12k8[0] = st->pitch[0]; + alw_pitch_lag_12k8[1] = st->pitch[1]; + alw_voicing[0] = st->voicing[0]; + alw_voicing[1] = st->voicing[1]; + alw_pitch_lag_12k8_wc = min( alw_pitch_lag_12k8[0], alw_pitch_lag_12k8[1] ); + alw_voicing_wc = max( alw_voicing[0], alw_voicing[1] ); + } + + overlap_mode[0] = last_overlap; /* Overlap between the last and the current frame */ + + if ( hTcxEnc->tcxMode == TCX_20 ) + { + nSubframes = 1; + transform_type[0] = TCX_20; + transform_type[1] = TCX_20; + overlap_mode[1] = curr_overlap; /* Overlap between the current and the next frame */ + + if ( st->element_mode != IVAS_CPE_MDCT ) + { + alw_pitch_lag_12k8[0] = alw_pitch_lag_12k8_wc; + alw_voicing[0] = alw_voicing_wc; + } + } + else + { + nSubframes = 2; + if ( curr_overlap == FULL_OVERLAP ) + { + transform_type[0] = TCX_5; + transform_type[1] = TCX_10; + overlap_mode[1] = ( last_overlap == HALF_OVERLAP ) ? HALF_OVERLAP : MIN_OVERLAP; /* Overlap between 2nd and 3rd sub-frame */ + } + else if ( last_overlap == FULL_OVERLAP ) + { + transform_type[0] = TCX_10; + transform_type[1] = TCX_5; + overlap_mode[1] = ( curr_overlap == HALF_OVERLAP ) ? HALF_OVERLAP : MIN_OVERLAP; /* Overlap between 1st and 2nd sub-frame */ + } + else + { + transform_type[0] = transform_type[1] = TCX_5; + overlap_mode[1] = ( last_overlap == HALF_OVERLAP && curr_overlap == HALF_OVERLAP ) ? HALF_OVERLAP : MIN_OVERLAP; /* Overlap between 2nd and 3rd sub-frame */ + } + overlap_mode[2] = curr_overlap; /* Overlap between the current and the next frame */ + } + + if ( st->igf && transform_type[0] != TCX_20 ) + { + IGFEncResetTCX10BitCounter( st->hIGFEnc ); + } + + for ( frameno = 0; frameno < nSubframes; frameno++ ) + { + /*-------------------------------------------------------------------------* + * Get MDCT output and TNS parameters. Apply TNS in the spectrum if needed + *--------------------------------------------------------------------------*/ + + L_subframe = L_frameTCX / nSubframes; + + if ( transform_type[frameno] == TCX_20 && st->hTcxCfg->tcx_last_overlap_mode != TRANSITION_OVERLAP ) + { + wtda( hTcxEnc->new_speech_TCX, tcx20Win, NULL, overlap_mode[frameno], overlap_mode[frameno + 1], L_frameTCX ); + + if ( windowed_samples != NULL ) /* store overlap data for later */ + { + assert( frameno == 0 ); + windowed_samples[0] = (float) overlap_mode[frameno]; + windowed_samples[1] = (float) overlap_mode[frameno + 1]; + } + if ( st->element_mode != IVAS_CPE_MDCT ) + { + /* Windowing of the 2xTCX5 subframes or 1xTCX10 or 1xTCX20 */ + WindowSignal( st->hTcxCfg, st->hTcxCfg->tcx_offsetFB, overlap_mode[frameno] == ALDO_WINDOW ? FULL_OVERLAP : overlap_mode[frameno], overlap_mode[frameno + 1] == ALDO_WINDOW ? FULL_OVERLAP : overlap_mode[frameno + 1], &left_overlap, &right_overlap, &hTcxEnc->speech_TCX[frameno * tcx10SizeFB], &L_subframe, mdstWin, 1, 1 ); + } + } + else + { + /* Windowing of the 2xTCX5 subframes or 1xTCX10 or 1xTCX20 */ + WindowSignal( st->hTcxCfg, st->hTcxCfg->tcx_offsetFB, overlap_mode[frameno], overlap_mode[frameno + 1], &left_overlap, &right_overlap, &hTcxEnc->speech_TCX[frameno * tcx10SizeFB], &L_subframe, tcx20Win, st->element_mode != IVAS_CPE_MDCT, 1 ); + + if ( windowed_samples != NULL ) /* save windowed speech_TCX samples */ + { + assert( L_subframe + ( left_overlap + right_overlap ) / 2 < 2 * L_FRAME_MAX / nSubframes - L_FRAME_MAX / 8 ); + windowed_samples[frameno * L_FRAME_MAX + 0] = (float) overlap_mode[frameno]; + windowed_samples[frameno * L_FRAME_MAX + 1] = (float) overlap_mode[frameno + 1]; + mvr2r( tcx20Win, windowed_samples + frameno * L_FRAME_MAX + 2, L_subframe + ( left_overlap + right_overlap ) / 2 ); + } + } + + if ( transform_type[frameno] == TCX_5 ) + { + /* Outer left folding */ + for ( i = 0; i < left_overlap / 2; i++ ) + { + tcx20Win[left_overlap / 2 + i] -= tcx20Win[left_overlap / 2 - 1 - i]; + } + + if ( st->element_mode == IVAS_CPE_MDCT && frameno == 0 && overlap_mode[0] == FULL_OVERLAP && L_subframe - left_overlap > minWindowLen ) + { + for ( i = minWindowLen; i >= 0; i-- ) /* outer left folding of shortened long ALDO slope */ + { + tcx20Win[left_overlap + i] -= hTcxEnc->speech_TCX[-1 - i] * st->hTcxCfg->tcx_aldo_window_1_FB[left_overlap / 2 + minWindowLen - i] * st->hTcxCfg->tcx_mdct_window_minimumFB[minWindowLen - i]; + } + } + + /* Outer right folding */ + for ( i = 0; i < right_overlap / 2; i++ ) + { + tcx20Win[L_subframe + left_overlap / 2 - 1 - i] += tcx20Win[L_subframe + left_overlap / 2 + i]; + } + + /* 2xTCX5 */ + L_subframe = tcx5SizeFB; + folding_offset = left_overlap / 2; + + for ( i = 0; i < 2; i++ ) + { + WindowSignal( st->hTcxCfg, folding_offset, i == 0 ? RECTANGULAR_OVERLAP : MIN_OVERLAP, i == 1 ? RECTANGULAR_OVERLAP : MIN_OVERLAP, &left_overlap, &right_overlap, tcx20Win + i * tcx5SizeFB, &L_subframe, tcx5Win, st->element_mode != IVAS_CPE_MDCT, 1 ); + + TCX_MDCT( tcx5Win, hTcxEnc->spectrum[frameno] + i * tcx5SizeFB, left_overlap, L_subframe - ( left_overlap + right_overlap ) / 2, right_overlap, st->element_mode ); + + /* high-band gain control in case of BWS */ + if ( st->bwidth_sw_cnt > 0 ) + { + v_multc( hTcxEnc->spectrum[frameno] + i * tcx5SizeFB + L_FRAME16k / ( 2 * nSubframes ), (float) ( st->bwidth_sw_cnt ) / (float) BWS_TRAN_PERIOD, hTcxEnc->spectrum[frameno] + i * tcx5SizeFB + L_FRAME16k / ( 2 * nSubframes ), L_subframe - L_FRAME16k / ( 2 * nSubframes ) ); + } + } + } + else /* transform_type[frameno] != TCX_5 */ + { + assert( transform_type[frameno] == TCX_10 || transform_type[frameno] == TCX_20 ); + + if ( transform_type[frameno] == TCX_20 && st->hTcxCfg->tcx_last_overlap_mode != TRANSITION_OVERLAP ) + { + edct( tcx20Win, hTcxEnc->spectrum[frameno], L_subframe, st->element_mode ); + + v_multc( hTcxEnc->spectrum[frameno], (float) sqrt( (float) NORM_MDCT_FACTOR / L_subframe ), hTcxEnc->spectrum[frameno], L_subframe ); + } + else + { + /* TCX20/TCX10 */ + if ( st->element_mode == IVAS_CPE_MDCT && frameno == 0 && transform_type[0] == TCX_10 && overlap_mode[0] == FULL_OVERLAP && L_subframe - left_overlap > minWindowLen ) + { + for ( i = minWindowLen; i >= 0; i-- ) /* outer left folding of shortened long ALDO slope */ + { + tcx20Win[left_overlap + i] -= hTcxEnc->speech_TCX[-1 - i] * st->hTcxCfg->tcx_aldo_window_1_FB[left_overlap / 2 + minWindowLen - i] * st->hTcxCfg->tcx_mdct_window_minimumFB[minWindowLen - i]; + } + } + + TCX_MDCT( tcx20Win, hTcxEnc->spectrum[frameno], left_overlap, L_subframe - ( left_overlap + right_overlap ) / 2, right_overlap, st->element_mode ); + } + + /* high-band gain control in case of BWS */ + if ( st->bwidth_sw_cnt > 0 ) + { + v_multc( hTcxEnc->spectrum[frameno] + L_FRAME16k / nSubframes, (float) ( st->bwidth_sw_cnt ) / (float) BWS_TRAN_PERIOD, hTcxEnc->spectrum[frameno] + L_FRAME16k / nSubframes, L_subframe - L_FRAME16k / nSubframes ); + } + + if ( st->element_mode != IVAS_CPE_MDCT ) + { + /* For TCX20 at bitrates up to 64 kbps we need the power spectrum */ + if ( hTcxEnc->tcxMode == TCX_20 && ( st->total_brate < HQ_96k || st->igf ) ) + { + /* Compute noise-measure flags for spectrum filling and quantization */ + AnalyzePowerSpectrum( st, L_subframe * st->L_frame / hTcxEnc->L_frameTCX, L_subframe, left_overlap, right_overlap, hTcxEnc->spectrum[frameno], ( ( hTcxEnc->tcxMode == TCX_20 ) && ( st->hTcxCfg->tcx_last_overlap_mode != TRANSITION_OVERLAP ) ) ? mdstWin : tcx20Win, powerSpec ); + } + } + } + + if ( st->element_mode == IVAS_CPE_MDCT ) + { + L_subframe = L_frameTCX / nSubframes; + + if ( transform_type[frameno] == TCX_20 && st->hTcxCfg->tcx_last_overlap_mode != TRANSITION_OVERLAP ) + { + wtda_ext( hTcxEnc->new_speech_TCX, mdstWin, overlap_mode[frameno], overlap_mode[frameno + 1], L_frameTCX, 3 ); + } + else + { + /* Windowing for the MDST */ + WindowSignal( st->hTcxCfg, st->hTcxCfg->tcx_offsetFB, overlap_mode[frameno] == ALDO_WINDOW ? FULL_OVERLAP : overlap_mode[frameno], overlap_mode[frameno + 1] == ALDO_WINDOW ? FULL_OVERLAP : overlap_mode[frameno + 1], &left_overlap, &right_overlap, &hTcxEnc->speech_TCX[frameno * tcx10SizeFB], &L_subframe, mdstWin, 0, 1 ); + } + + if ( transform_type[frameno] == TCX_5 ) + { + /* Outer left folding */ + for ( i = 0; i < left_overlap / 2; i++ ) + { + mdstWin[left_overlap / 2 + i] += mdstWin[left_overlap / 2 - 1 - i]; + } + + if ( frameno == 0 && overlap_mode[0] == FULL_OVERLAP && L_subframe - left_overlap > minWindowLen ) + { + for ( i = minWindowLen; i >= 0; i-- ) /* outer left folding of shortened long ALDO slope */ + { + mdstWin[left_overlap + i] += hTcxEnc->speech_TCX[-1 - i] * st->hTcxCfg->tcx_aldo_window_1_FB[left_overlap / 2 + minWindowLen - i] * st->hTcxCfg->tcx_mdct_window_minimumFB[minWindowLen - i]; + } + } + + /* Outer right folding */ + for ( i = 0; i < right_overlap / 2; i++ ) + { + mdstWin[L_subframe + left_overlap / 2 - 1 - i] -= mdstWin[L_subframe + left_overlap / 2 + i]; + } + + /* 2xTCX5 */ + L_subframe = tcx5SizeFB; + folding_offset = left_overlap / 2; + + for ( i = 0; i < 2; i++ ) + { + WindowSignal( st->hTcxCfg, folding_offset, i == 0 ? RECTANGULAR_OVERLAP : MIN_OVERLAP, i == 1 ? RECTANGULAR_OVERLAP : MIN_OVERLAP, &left_overlap, &right_overlap, mdstWin + i * tcx5SizeFB, &L_subframe, tcx5Win, 0, 1 ); + + TCX_MDST( tcx5Win, mdst_spectrum[frameno] + i * tcx5SizeFB, left_overlap, L_subframe - ( left_overlap + right_overlap ) / 2, right_overlap, st->element_mode ); + /* high-band gain control in case of BWS */ + if ( st->bwidth_sw_cnt > 0 ) + { + v_multc( mdst_spectrum[frameno] + i * tcx5SizeFB + L_FRAME16k / ( 2 * nSubframes ), (float) ( st->bwidth_sw_cnt ) / (float) BWS_TRAN_PERIOD, mdst_spectrum[frameno] + i * tcx5SizeFB + L_FRAME16k / ( 2 * nSubframes ), L_subframe - L_FRAME16k / ( 2 * nSubframes ) ); + } + } + } + else /* transform_type[frameno] != TCX_5 */ + { + if ( transform_type[frameno] == TCX_20 && st->hTcxCfg->tcx_last_overlap_mode != TRANSITION_OVERLAP ) + { + edst( mdstWin, mdst_spectrum[frameno], L_subframe, st->element_mode ); + + v_multc( mdst_spectrum[frameno], (float) sqrt( (float) NORM_MDCT_FACTOR / L_subframe ), mdst_spectrum[frameno], L_subframe ); + } + else + { + if ( frameno == 0 && transform_type[0] == TCX_10 && overlap_mode[0] == FULL_OVERLAP && L_subframe - left_overlap > minWindowLen ) + { + for ( i = minWindowLen; i >= 0; i-- ) /* outer left folding of shortened long ALDO slope */ + { + mdstWin[left_overlap + i] += hTcxEnc->speech_TCX[-1 - i] * st->hTcxCfg->tcx_aldo_window_1_FB[left_overlap / 2 + minWindowLen - i] * st->hTcxCfg->tcx_mdct_window_minimumFB[minWindowLen - i]; + } + } + + TCX_MDST( mdstWin, mdst_spectrum[frameno], left_overlap, L_subframe - ( left_overlap + right_overlap ) / 2, right_overlap, st->element_mode ); + } + + /* high-band gain control in case of BWS */ + if ( st->bwidth_sw_cnt > 0 ) + { + v_multc( mdst_spectrum[frameno] + L_FRAME16k / nSubframes, (float) ( st->bwidth_sw_cnt ) / (float) BWS_TRAN_PERIOD, mdst_spectrum[frameno] + L_FRAME16k / nSubframes, L_subframe - L_FRAME16k / nSubframes ); + } + } + } + + if ( st->element_mode != IVAS_CPE_MDCT ) + { + TNSAnalysis( st->hTcxCfg, L_frameTCX, st->hTcxCfg->tcx_coded_lines, transform_type[frameno], ( frameno == 0 ) && ( st->last_core == ACELP_CORE ), hTcxEnc->spectrum[frameno], st->hTranDet, -1, &hTcxEnc->tnsData[frameno], &hTcxEnc->fUseTns[frameno], NULL ); + + if ( st->hTcxCfg->fIsTNSAllowed ) + { + EncodeTnsData( st->hTcxCfg->pCurrentTnsConfig, &hTcxEnc->tnsData[frameno], param_core + frameno * NPRM_DIV + 1 + NOISE_FILL_RANGES + LTPSIZE, pTnsSize + frameno, pTnsBits + frameno ); + } + + if ( transform_type[frameno] == TCX_5 ) + { + /* group sub-windows: interleave bins according to their frequencies */ + for ( i = 0; i < tcx5SizeFB; i++ ) + { + interleaveBuf[2 * i] = hTcxEnc->spectrum[frameno][i]; + interleaveBuf[2 * i + 1] = hTcxEnc->spectrum[frameno][tcx5SizeFB + i]; + } + mvr2r( interleaveBuf, hTcxEnc->spectrum[frameno], tcx10SizeFB ); + } + + /*--------------------------------------------------------------* + * LPC analysis + *---------------------------------------------------------------*/ + + if ( st->tcxonly ) + { + HBAutocorrelation( st->hTcxCfg, overlap_mode[frameno] == ALDO_WINDOW ? FULL_OVERLAP : overlap_mode[frameno], overlap_mode[frameno + 1] == ALDO_WINDOW ? FULL_OVERLAP : overlap_mode[frameno + 1], &st->speech_enc_pe[frameno * tcx10Size], L_frame / nSubframes, r ); + + adapt_lag_wind( r, M, alw_pitch_lag_12k8[frameno], alw_voicing[frameno], st->sr_core ); + + lev_dur( A, r, M, NULL ); + + a2lsp_stab( A, lsp[nSubframes - 1 - frameno], st->lspold_enc ); + } + + if ( st->igf ) + { + ProcessIGF( st, hTcxEnc->spectrum[frameno], hTcxEnc->spectrum[frameno], powerSpec, transform_type[frameno] == TCX_20, frameno, 0, vad_hover_flag ); + } + } + } + if ( st->element_mode != IVAS_CPE_MDCT ) + { + /* Copy memory */ + mvr2r( lsp_new, st->lspold_enc, M ); + } + + return; +} diff --git a/lib_enc/fd_cng_enc.c b/lib_enc/fd_cng_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..12019f480095030a2b0722c6dec038fb09a34fd6 --- /dev/null +++ b/lib_enc/fd_cng_enc.c @@ -0,0 +1,1360 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include "options.h" +#include +#include "rom_enc.h" +#include "rom_com.h" +#include "prot.h" +#include "ivas_prot.h" +#include "stat_enc.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * createFdCngEnc() + * + * + *-------------------------------------------------------------------*/ + +ivas_error createFdCngEnc( + HANDLE_FD_CNG_ENC *hFdCngEnc /* i/o: FD_CNG structure */ +) +{ + HANDLE_FD_CNG_ENC hs; + ivas_error error; + error = IVAS_ERR_OK; + + /* Set output to NULL in case of errors and early return */ + *hFdCngEnc = NULL; + + /* Allocate memory */ + if ( ( hs = (HANDLE_FD_CNG_ENC) malloc( sizeof( FD_CNG_ENC ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for FD CNG ENC structure" ); + } + + if ( ( error = createFdCngCom( &( hs->hFdCngCom ) ) ) != IVAS_ERR_OK ) + { + return error; + } + + *hFdCngEnc = hs; + + return error; +} + +/*-------------------------------------------------------------------* + * initFdCngEnc() + * + * Initialize FD_CNG + *-------------------------------------------------------------------*/ + +void initFdCngEnc( + HANDLE_FD_CNG_ENC hFdCngEnc, /* i/o: Contains the variables related to the FD-based CNG process */ + const int32_t input_Fs, /* i : input signal sampling frequency in Hz */ + const float scale /* i : scaling factor */ +) +{ + int16_t j; + HANDLE_FD_CNG_COM hsCom = hFdCngEnc->hFdCngCom; + + /* Initialize common */ + initFdCngCom( hsCom, scale ); + + /* Configure the Noise Estimator */ + hsCom->numSlots = 16; + hsCom->numCoreBands = 16; + hsCom->regularStopBand = (int16_t) ( input_Fs * INV_CLDFB_BANDWIDTH ); + if ( hsCom->regularStopBand > 40 ) + { + hsCom->regularStopBand = 40; + } + + hsCom->startBand = 2; + if ( hsCom->regularStopBand == 10 ) + { + hsCom->stopFFTbin = 160; + hsCom->stopBand = 160; + hsCom->nFFTpart = 17; + } + else + { + hsCom->stopFFTbin = 256; + hsCom->stopBand = hsCom->regularStopBand - hsCom->numCoreBands + hsCom->stopFFTbin; + hsCom->nFFTpart = 20; + } + + initPartitions( sidparts_encoder_noise_est, SIZE_SIDPARTS_ENC_NOISE_EST, hsCom->startBand, hsCom->stopBand, hsCom->part, &hsCom->npart, hsCom->midband, hsCom->psize, hsCom->psize_inv, 0 ); + + hsCom->nCLDFBpart = hsCom->npart - hsCom->nFFTpart; + for ( j = 0; j < hsCom->nCLDFBpart; j++ ) + { + hsCom->CLDFBpart[j] = hsCom->part[j + hsCom->nFFTpart] - ( 256 - hsCom->startBand ); + hsCom->CLDFBpsize_inv[j] = hsCom->psize_inv[j + hsCom->nFFTpart]; + } + + /* Initialize the Noise Estimator */ + set_f( hFdCngEnc->msPeriodog, 0.0f, NPART ); + set_f( hFdCngEnc->msAlpha, 0.0f, NPART ); + set_f( hFdCngEnc->msBminWin, 0.0f, NPART ); + set_f( hFdCngEnc->msBminSubWin, 0.0f, NPART ); + set_f( hFdCngEnc->msPsd, 0.0f, NPART ); + set_f( hFdCngEnc->msNoiseFloor, 0.0f, NPART ); + set_f( hFdCngEnc->msNoiseEst, 0.0f, NPART ); + set_f( hFdCngEnc->energy_ho, 0.0f, NPART ); + set_f( hFdCngEnc->msNoiseEst_old, 0.0f, NPART ); + set_f( hFdCngEnc->msMinBuf, FLT_MAX, MSNUMSUBFR * NPART ); + set_f( hFdCngEnc->msCurrentMin, FLT_MAX, NPART ); + set_f( hFdCngEnc->msCurrentMinOut, FLT_MAX, NPART ); + set_f( hFdCngEnc->msCurrentMinSubWindow, FLT_MAX, NPART ); + set_s( hFdCngEnc->msLocalMinFlag, 0, NPART ); + set_s( hFdCngEnc->msNewMinFlag, 0, NPART ); + set_f( hFdCngEnc->msPsdFirstMoment, 0.0f, NPART ); + set_f( hFdCngEnc->msPsdSecondMoment, 0.0f, NPART ); + hFdCngEnc->msPeriodogBufPtr = 0; + set_f( hFdCngEnc->msPeriodogBuf, 0.0f, MSBUFLEN * NPART ); + set_f( hFdCngEnc->msLogPeriodog, 0.0f, NPART ); + set_f( hFdCngEnc->msLogNoiseEst, 0.0f, NPART ); + + set_f( hFdCngEnc->mem_coherence, EPSILON, 4 ); + + return; +} + +/*-------------------------------------------------------------------* + * configureFdCngEnc() + * + * Configure FD_CNG + *-------------------------------------------------------------------*/ + +void configureFdCngEnc( + HANDLE_FD_CNG_ENC hFdCngEnc, /* i/o: Contains the variables related to the FD-based CNG process */ + const int16_t bwidth, + const int32_t total_brate ) +{ + HANDLE_FD_CNG_COM hsCom = hFdCngEnc->hFdCngCom; + float psizeDec[NPART]; + float psize_invDec[NPART]; + + hsCom->CngBandwidth = bwidth; + if ( hsCom->CngBandwidth == FB ) + { + hsCom->CngBandwidth = SWB; + } + hsCom->CngBitrate = total_brate; + + /* NB configuration */ + if ( bwidth == NB ) + { + hsCom->FdCngSetup = FdCngSetup_nb; + } + + /* WB configuration */ + else if ( bwidth == WB ) + { + /* FFT 6.4kHz, no CLDFB */ + if ( total_brate <= ACELP_8k00 ) + { + hsCom->FdCngSetup = FdCngSetup_wb1; + } + /* FFT 6.4kHz, CLDFB 8.0kHz */ + else if ( total_brate <= ACELP_13k20 ) + { + hsCom->FdCngSetup = FdCngSetup_wb2; + } + /* FFT 8.0kHz, no CLDFB */ + else + { + hsCom->FdCngSetup = FdCngSetup_wb3; + } + } + + /* SWB/FB configuration */ + else + { + /* FFT 6.4kHz, CLDFB 14kHz */ + if ( total_brate <= ACELP_13k20 ) + { + hsCom->FdCngSetup = FdCngSetup_swb1; + } + /* FFT 8.0kHz, CLDFB 16kHz */ + else + { + hsCom->FdCngSetup = FdCngSetup_swb2; + } + } + hsCom->fftlen = hsCom->FdCngSetup.fftlen; + hFdCngEnc->stopFFTbinDec = hsCom->FdCngSetup.stopFFTbin; + + /* Configure the SID quantizer and the Confort Noise Generator */ + + hFdCngEnc->startBandDec = hsCom->startBand; + hFdCngEnc->stopBandDec = hsCom->FdCngSetup.sidPartitions[hsCom->FdCngSetup.numPartitions - 1] + 1; + initPartitions( hsCom->FdCngSetup.sidPartitions, hsCom->FdCngSetup.numPartitions, hFdCngEnc->startBandDec, hFdCngEnc->stopBandDec, hFdCngEnc->partDec, &hFdCngEnc->npartDec, hFdCngEnc->midbandDec, psizeDec, psize_invDec, 0 ); + + if ( hFdCngEnc->stopFFTbinDec == 160 ) + { + hFdCngEnc->nFFTpartDec = 17; + } + else if ( hFdCngEnc->stopFFTbinDec == 256 ) + { + hFdCngEnc->nFFTpartDec = 20; + } + else + { + hFdCngEnc->nFFTpartDec = 21; + } + + switch ( hsCom->fftlen ) + { + case 512: + hsCom->fftSineTab = NULL; + hsCom->olapWinAna = olapWinAna512; + hsCom->olapWinSyn = olapWinSyn256; + break; + case 640: + hsCom->fftSineTab = fftSineTab640; + hsCom->olapWinAna = olapWinAna640; + hsCom->olapWinSyn = olapWinSyn320; + break; + default: + assert( !"Unsupported FFT length for FD-based CNG" ); + break; + } + hsCom->frameSize = hsCom->fftlen >> 1; + + return; +} + + +/*-------------------------------------------------------------------* + * deleteFdCngEnc() + * + * Delete the instance of type FD_CNG + *-------------------------------------------------------------------*/ + +void deleteFdCngEnc( + HANDLE_FD_CNG_ENC *hFdCngEnc /* i/o: FD_CNG structure */ +) +{ + + HANDLE_FD_CNG_ENC hsEnc = *hFdCngEnc; + + if ( hsEnc != NULL ) + { + deleteFdCngCom( &( hsEnc->hFdCngCom ) ); + free( hsEnc ); + *hFdCngEnc = NULL; + } + + return; +} + +/*-------------------------------------------------------------------* + * resetFdCngEnc() + * + * Reset the instance of type FD_CNG + *-------------------------------------------------------------------*/ + +void resetFdCngEnc( + Encoder_State *st /* i/o: encoder state structure */ +) +{ + int16_t n; + float totalNoiseIncrease; + + /* Detect fast increase of totalNoise */ + totalNoiseIncrease = st->hNoiseEst->totalNoise - st->last_totalNoise; + st->last_totalNoise = st->hNoiseEst->totalNoise; + if ( totalNoiseIncrease > 0 ) + { + if ( st->totalNoise_increase_len == TOTALNOISE_HIST_SIZE ) + { + for ( n = 0; n < TOTALNOISE_HIST_SIZE - 1; n++ ) + { + st->totalNoise_increase_hist[n] = st->totalNoise_increase_hist[n + 1]; + } + st->totalNoise_increase_hist[TOTALNOISE_HIST_SIZE - 1] = totalNoiseIncrease; + } + else + { + st->totalNoise_increase_hist[st->totalNoise_increase_len] = totalNoiseIncrease; + st->totalNoise_increase_len++; + } + } + else + { + st->totalNoise_increase_len = 0; + } + + totalNoiseIncrease = 0.f; + for ( n = 0; n < st->totalNoise_increase_len; n++ ) + { + totalNoiseIncrease += st->totalNoise_increase_hist[n]; + } + + if ( + ( totalNoiseIncrease > 5 && st->totalNoise_increase_len == TOTALNOISE_HIST_SIZE && st->ini_frame > 150 ) || + ( st->input_bwidth > st->last_input_bwidth ) || + ( st->last_core == AMR_WB_CORE ) ) + { + st->fd_cng_reset_flag = 1; + st->hFdCngEnc->hFdCngCom->msFrCnt_init_counter = 0; + st->hFdCngEnc->hFdCngCom->init_old = FLT_MAX; + } + else if ( st->fd_cng_reset_flag > 0 && st->fd_cng_reset_flag < 10 ) + { + st->fd_cng_reset_flag++; + } + else + { + st->fd_cng_reset_flag = 0; + } + + return; +} + + +/*-------------------------------------------------------------------* + * perform_noise_estimation_enc() + * + * Perform noise estimation + *-------------------------------------------------------------------*/ + +void perform_noise_estimation_enc( + float *band_energies, /* i : energy in critical bands without minimum noise floor E_MIN*/ + float *enerBuffer, /* i : energy buffer */ + HANDLE_FD_CNG_ENC hFdCngEnc, /* i/o: CNG structure containing all buffers and variables */ + const int32_t input_Fs, /* i : input sampling rate */ + CPE_ENC_HANDLE hCPE /* i : CPE encoder structure */ +) +{ + int16_t i, j; + int16_t numCoreBands = hFdCngEnc->hFdCngCom->numCoreBands; + int16_t regularStopBand = hFdCngEnc->hFdCngCom->regularStopBand; + int16_t numSlots = hFdCngEnc->hFdCngCom->numSlots; + float numSlots_inv = 1.f / (float) numSlots; /*enough if done only once*/ + float *periodog = hFdCngEnc->hFdCngCom->periodog; + float *ptr_per = periodog; + int16_t npart = hFdCngEnc->hFdCngCom->npart; + int16_t nFFTpart = hFdCngEnc->hFdCngCom->nFFTpart; + float *psize = hFdCngEnc->hFdCngCom->psize; + float *msPeriodog = hFdCngEnc->msPeriodog; + float *msNoiseEst = hFdCngEnc->msNoiseEst; + + float *msLogPeriodog = hFdCngEnc->msLogPeriodog; + float *msLogNoiseEst = hFdCngEnc->msLogNoiseEst; + + float band_res_dft, chan_width_f; + float chan_width_bins; + float scaleEB; + + if ( hCPE != NULL && hCPE->hStereoDft != NULL ) + { + band_res_dft = ( (float) input_Fs ) / hCPE->hStereoDft->NFFT; + chan_width_f = 24000.f / CLDFB_NO_CHANNELS_MAX; + chan_width_bins = chan_width_f / band_res_dft; + + /* Scaling of Energy buffer to get energy per sample, same scaling as for band_energies, 3 is to compensate for the 1/3 scaling in calculate_energy_buffer */ + scaleEB = 3 * 4.0f / ( hCPE->hStereoDft->NFFT * hCPE->hStereoDft->NFFT ); + + /* Scale with number of bins in one band */ + scaleEB = scaleEB / chan_width_bins; + } + else + { + scaleEB = numSlots_inv * hFdCngEnc->hFdCngCom->scalingFactor; + } + + /* preemphasis compensation and grouping of per bin energies into msPeriodog */ + for ( i = 0; i < nFFTpart; i++ ) + { + msPeriodog[i] = 0.5f * ( band_energies[i] + band_energies[i + NB_BANDS] ); + msPeriodog[i] *= preemphCompensation[i]; + } + + /* Adjust to the desired time resolution by averaging the periodograms over the time slots */ + for ( j = numCoreBands; j < regularStopBand; j++ ) + { + ( *ptr_per ) = enerBuffer[j] * scaleEB; + ptr_per++; + } + + /* Adjust filterbank to the desired frequency resolution by averaging over spectral partitions for SID transmission */ + if ( numCoreBands < regularStopBand ) + { + bandcombinepow( periodog, regularStopBand - numCoreBands, hFdCngEnc->hFdCngCom->CLDFBpart, hFdCngEnc->hFdCngCom->nCLDFBpart, hFdCngEnc->hFdCngCom->CLDFBpsize_inv, &msPeriodog[nFFTpart] ); + } + + /* Compress MS inputs */ + compress_range( msPeriodog, msLogPeriodog, npart ); + + /* Call the minimum statistics routine for noise estimation */ + minimum_statistics( npart, nFFTpart, psize, msLogPeriodog, hFdCngEnc->msNoiseFloor, msLogNoiseEst, hFdCngEnc->msAlpha, hFdCngEnc->msPsd, hFdCngEnc->msPsdFirstMoment, hFdCngEnc->msPsdSecondMoment, hFdCngEnc->msMinBuf, hFdCngEnc->msBminWin, hFdCngEnc->msBminSubWin, hFdCngEnc->msCurrentMin, hFdCngEnc->msCurrentMinOut, hFdCngEnc->msCurrentMinSubWindow, hFdCngEnc->msLocalMinFlag, hFdCngEnc->msNewMinFlag, hFdCngEnc->msPeriodogBuf, &( hFdCngEnc->msPeriodogBufPtr ), hFdCngEnc->hFdCngCom, + ENC, ( hCPE == NULL ) ? 0 : hCPE->element_mode ); + + /* Expand MS outputs */ + expand_range( msLogNoiseEst, msNoiseEst, npart ); + + return; +} + + +/*-------------------------------------------------------------------* + * AdjustFirstSID() + * + * Adjust the noise estimator at the beginning of each CNG phase (encoder-side) + *-------------------------------------------------------------------*/ + +void AdjustFirstSID( + Encoder_State *st /* i/o: encoder state structure */ +) +{ + float lambda; + int16_t i; + int16_t npart = st->hFdCngEnc->hFdCngCom->npart; + float *msPeriodog = st->hFdCngEnc->msPeriodog; + float *energy_ho = st->hFdCngEnc->energy_ho; + float *msNoiseEst = st->hFdCngEnc->msNoiseEst; + float *msNoiseEst_old = st->hFdCngEnc->msNoiseEst_old; + int16_t *active_frame_counter = &( st->hFdCngEnc->hFdCngCom->active_frame_counter ); + + if ( st->hDtxEnc->cnt_SID == 1 && st->last_core_brate > SID_2k40 ) + { + /* Detect the hangover period and the first SID frame at the beginning of each CNG phase */ + + /* Average input energy over hangover period */ + mvr2r( msPeriodog, energy_ho, npart ); /*First hangover frame*/ + /* Set first SID to current input level but add some smoothing */ + lambda = (float) pow( 0.96f, (float) ( *active_frame_counter + 1 ) ); + v_multc( msNoiseEst_old, lambda, msNoiseEst_old, npart ); + v_multc( energy_ho, 1 - lambda, energy_ho, npart ); + + v_add( msNoiseEst_old, energy_ho, energy_ho, npart ); + for ( i = 0; i < npart; i++ ) + { + if ( msNoiseEst[i] > energy_ho[i] ) + { + msNoiseEst[i] = energy_ho[i]; + } + } + *active_frame_counter = 0; + } + + if ( st->core_brate != SID_2k40 && st->core_brate != FRAME_NO_DATA ) + { + ( *active_frame_counter )++; /* Count the number of active frames in a row */ + } + else + { + mvr2r( msNoiseEst, msNoiseEst_old, npart ); /* Store the noise estimate obtained in the CNG phases */ + } + + return; +} + +/*-------------------------------------------------------------------* + * FdCng_encodeSID() + * + * Generate a bitstream out of the partition levels + *-------------------------------------------------------------------*/ + +void FdCng_encodeSID( + Encoder_State *st /* i/o: encoder state structure */ +) +{ + int16_t N; + HANDLE_FD_CNG_ENC hFdCngEnc = st->hFdCngEnc; + HANDLE_FD_CNG_COM hFdCngCom = hFdCngEnc->hFdCngCom; + BSTR_ENC_HANDLE hBstr = st->hBstr; + float *E = hFdCngEnc->msNoiseEst; + float gain; + int16_t i, index; + float v[32], e; + int16_t indices[32]; + float w[32]; + float preemph_fac = st->preemph_fac; + + float *invTrfMatrix; + float tmpRAM[FDCNG_VQ_MAX_LEN][FDCNG_VQ_DCT_MAXTRUNC]; + float dct_target[FDCNG_VQ_DCT_MAXTRUNC]; + float tot_sig_ext[FDCNG_VQ_MAX_LEN]; + const float gain_q_offset = ( st->element_mode == EVS_MONO ) ? GAIN_Q_OFFSET_EVS : GAIN_Q_OFFSET_IVAS; + + /* Init */ + N = hFdCngEnc->npartDec; + + invTrfMatrix = (float *) tmpRAM; /* dynamically filled */ + set_zero( v, FDCNG_VQ_MAX_LEN ); + + /* Convert to LOG */ + e = 0.f; + for ( i = 0; i < N; i++ ) + { + v[i] = 10.f * (float) log10( E[i] + 1e-4f ); + e += v[i]; + } + + /* Normalize MSVQ input */ + gain = 0.f; + for ( i = N_GAIN_MIN; i < N_GAIN_MAX; i++ ) + { + gain += v[i]; + } + + gain /= (float) ( N_GAIN_MAX - N_GAIN_MIN ); + + for ( i = 0; i < N; i++ ) + { + v[i] -= gain; + } + + /* MSVQ encoder */ + set_f( w, 1.0f, N ); + + if ( st->element_mode != EVS_MONO ) + { + /* DCT domain compressed/truncated indices used for first stage */ + /* quantization with stage1 stored in DCT24 domain, stages 2 through 6 directly dearched + in FDCNG band domain + */ + if ( N == FDCNG_VQ_MAX_LEN_WB ) + { + create_IDCT_N_Matrix( invTrfMatrix, N, FDCNG_VQ_DCT_MAXTRUNC, sizeof( tmpRAM ) / ( sizeof( float ) ) ); + /* truncated DCT21 analysis */ + dctT2_N_apply_matrix( (const float *) v, dct_target, FDCNG_VQ_DCT_MAXTRUNC, N, invTrfMatrix, FDCNG_VQ_DCT_MAXTRUNC, DCT_T2_21_XX ); + /* truncated IDCT21 extension to 24 bands */ + extend_dctN_input( v, dct_target, N, tot_sig_ext, FDCNG_VQ_MAX_LEN, invTrfMatrix, FDCNG_VQ_DCT_MAXTRUNC, IDCT_T2_XX_21 ); + + mvr2r( tot_sig_ext, v, FDCNG_VQ_MAX_LEN ); /* write extended result as input to VQ stage #1 */ + } + create_IDCT_N_Matrix( invTrfMatrix, FDCNG_VQ_MAX_LEN, FDCNG_VQ_DCT_MAXTRUNC, sizeof( tmpRAM ) / ( sizeof( float ) ) ); + msvq_enc( cdk_37bits_ivas, NULL, NULL, v, levels_37bits, FD_CNG_maxC_37bits, FD_CNG_stages_37bits, w, N, FD_CNG_maxN_37bits, 1, invTrfMatrix, indices ); + msvq_dec( cdk_37bits_ivas, NULL, NULL, FD_CNG_stages_37bits, N, FD_CNG_maxN_37bits, indices, 1, invTrfMatrix, v, NULL ); + } + else + { /* EVS_MONO tables */ + msvq_enc( cdk_37bits, NULL, NULL, v, levels_37bits, FD_CNG_maxC_37bits, FD_CNG_stages_37bits, w, N, FD_CNG_maxN_37bits, 0, NULL, indices ); + msvq_dec( cdk_37bits, NULL, NULL, FD_CNG_stages_37bits, N, FD_CNG_maxN_37bits, indices, 0, NULL, v, NULL ); + } + + + /* Compute gain */ + gain = 0.f; + for ( i = 0; i < N; i++ ) + { + gain += v[i]; + } + + gain = ( e - gain ) / (float) N; + + /* Apply bitrate-dependant scale */ + if ( st->element_mode > EVS_MONO ) + { + apply_scale( &gain, hFdCngCom->CngBandwidth, hFdCngCom->CngBitrate, scaleTableStereo, SIZE_SCALE_TABLE_STEREO ); + } + else + { + apply_scale( &gain, hFdCngCom->CngBandwidth, hFdCngCom->CngBitrate, scaleTableMono, SIZE_SCALE_TABLE_MONO ); + } + + /* Quantize gain */ + index = (int16_t) floor( gain * 1.5f + gain_q_offset + 0.5f ); + + if ( index < 0 ) + { + index = 0; + } + + if ( index > 127 ) + { + index = 127; + } + + gain = ( (float) index - gain_q_offset ) / 1.5f; + + /* Apply gain and undo log */ + for ( i = 0; i < N; i++ ) + { + + hFdCngCom->sidNoiseEst[i] = (float) pow( 10.f, ( v[i] + gain ) / 10.f ); + } + + /* NB last band energy compensation */ + if ( hFdCngCom->CngBandwidth == NB ) + { + hFdCngCom->sidNoiseEst[N - 1] *= NB_LAST_BAND_SCALE; + } + + if ( hFdCngCom->CngBandwidth == SWB && hFdCngCom->CngBitrate <= ACELP_13k20 ) + { + hFdCngCom->sidNoiseEst[N - 1] *= SWB_13k2_LAST_BAND_SCALE; + } + + /* Write bitstream */ + if ( st->codec_mode == MODE2 ) + { + for ( i = 0; i < FD_CNG_stages_37bits; i++ ) + { + push_next_indice( hBstr, indices[i], bits_37bits[i] ); + } + + push_next_indice( hBstr, index, 7 ); + } + else + { + push_indice( hBstr, IND_SID_TYPE, 1, 1 ); + push_indice( hBstr, IND_BWIDTH, st->bwidth, 2 ); + push_indice( hBstr, IND_ACELP_16KHZ, st->L_frame == L_FRAME16k ? 1 : 0, 1 ); + + for ( i = 0; i < FD_CNG_stages_37bits; i++ ) + { + push_indice( hBstr, IND_LSF, indices[i], bits_37bits[i] ); + } + + push_indice( hBstr, IND_ENERGY, index, 7 ); + } + + /* Interpolate the bin/band-wise levels from the partition levels */ + scalebands( hFdCngCom->sidNoiseEst, hFdCngEnc->partDec, hFdCngEnc->npartDec, hFdCngEnc->midbandDec, hFdCngEnc->nFFTpartDec, hFdCngEnc->stopBandDec - hFdCngEnc->startBandDec, hFdCngCom->cngNoiseLevel, 1 ); + + lpc_from_spectrum( hFdCngCom, hFdCngEnc->startBandDec, hFdCngEnc->stopFFTbinDec, preemph_fac ); + + return; +} + + +/*-------------------------------------------------------------------* + * generate_comfort_noise_enc() + * + * + *-------------------------------------------------------------------*/ + +void generate_comfort_noise_enc( + Encoder_State *st /* i/o: encoder state structure */ +) +{ + int16_t i; + float *ptr_r; + float *ptr_i; + HANDLE_FD_CNG_ENC hFdCngEnc = st->hFdCngEnc; + HANDLE_FD_CNG_COM hFdCngCom = hFdCngEnc->hFdCngCom; + float *cngNoiseLevel = hFdCngCom->cngNoiseLevel; + float *ptr_level = cngNoiseLevel; + int16_t *seed = &( hFdCngCom->seed ); + float scale = 1.f; + float *fftBuffer = hFdCngCom->fftBuffer; + float *timeDomainOutput = hFdCngCom->timeDomainBuffer; + float preemph_fac = st->preemph_fac; + int16_t tcx_transition = 0; + float enr; + + /* Generate Gaussian random noise in real and imaginary parts of the FFT bins + Amplitudes are adjusted to the estimated noise level cngNoiseLevel in each bin */ + if ( hFdCngEnc->startBandDec == 0 ) + { + rand_gauss( &fftBuffer[0], seed ); + fftBuffer[0] *= (float) sqrt( scale * *ptr_level ); /* DC component in FFT */ + ptr_level++; + ptr_r = fftBuffer + 2; + } + else + { + fftBuffer[0] = 0.f; + set_f( fftBuffer + 2, 0.0f, 2 * ( hFdCngEnc->startBandDec - 1 ) ); + ptr_r = fftBuffer + 2 * hFdCngEnc->startBandDec; + } + + ptr_i = ptr_r + 1; + for ( ; ptr_level < cngNoiseLevel + hFdCngEnc->stopFFTbinDec - hFdCngEnc->startBandDec; ptr_level++ ) + { + /* Real part in FFT bins */ + rand_gauss( ptr_r, seed ); + ( *ptr_r ) *= (float) sqrt( ( scale * *ptr_level ) * 0.5f ); + ptr_r += 2; + /* Imaginary part in FFT bins */ + rand_gauss( ptr_i, seed ); + ( *ptr_i ) *= (float) sqrt( ( scale * *ptr_level ) * 0.5f ); + ptr_i += 2; + } + + /* Remaining FFT bins are set to zero */ + set_f( fftBuffer + 2 * hFdCngEnc->stopFFTbinDec, 0.0f, hFdCngCom->fftlen - 2 * hFdCngEnc->stopFFTbinDec ); + + /* Nyquist frequency is discarded */ + fftBuffer[1] = 0.f; + + /* If previous frame is active, reset the overlap-add buffer */ + if ( st->last_core_brate > SID_2k40 ) + { + set_f( hFdCngCom->olapBufferSynth, 0.0f, hFdCngCom->fftlen ); + + if ( ( st->last_core > ACELP_CORE && st->codec_mode == MODE2 ) || st->codec_mode == MODE1 ) + { + tcx_transition = 1; + } + } + + /* Perform STFT synthesis */ + SynthesisSTFT( fftBuffer, timeDomainOutput, hFdCngCom->olapBufferSynth, hFdCngCom->olapWinSyn, tcx_transition, hFdCngCom, -1, -1 ); + + if ( st->hTdCngEnc != NULL ) + { + /* update CNG excitation energy for LP_CNG */ + /* calculate the residual signal energy */ + enr = cng_energy( st->element_mode, st->bwidth, st->hDtxEnc->CNG_mode, st->hTdCngEnc->CNG_att, hFdCngCom->exc_cng, hFdCngCom->frameSize ); + + st->hTdCngEnc->lp_ener = (float) ( 0.8f * st->hTdCngEnc->lp_ener + 0.2f * pow( 2.0f, enr ) ); + } + + /* Overlap-add when previous frame is active */ + if ( st->last_core_brate > SID_2k40 && st->codec_mode == MODE2 ) + { + float noise[2048], old_exc_ener = 0.f, gain = 0.f, tmp; + int16_t N = hFdCngCom->frameSize; + int16_t seed_loc = hFdCngCom->seed; + float *old_exc, old_Aq[M + 1], *old_syn_pe, old_syn; + + if ( st->last_core > ACELP_CORE ) + { + tcx_windowing_synthesis_current_frame( timeDomainOutput, st->hTcxCfg->tcx_mdct_window, /*Keep sine windows for limiting Time modulation*/ + st->hTcxCfg->tcx_mdct_window_half, st->hTcxCfg->tcx_mdct_window_minimum, st->hTcxCfg->tcx_mdct_window_length, st->hTcxCfg->tcx_mdct_window_half_length, st->hTcxCfg->tcx_mdct_window_min_length, 0, st->hTcxCfg->tcx_last_overlap_mode == ALDO_WINDOW ? FULL_OVERLAP : st->hTcxCfg->tcx_last_overlap_mode, NULL, NULL, NULL, NULL, NULL, N / 2, st->hTcxCfg->tcx_offset < 0 ? -st->hTcxCfg->tcx_offset : 0, 1, 0, 0 ); + + if ( st->hTcxCfg->last_aldo ) + { + for ( i = 0; i < hFdCngCom->frameSize; i++ ) + { + timeDomainOutput[i] += st->hTcxEnc->old_out[i + NS2SA( st->sr_core, N_ZERO_MDCT_NS )]; + } + } + else + { + tcx_windowing_synthesis_past_frame( st->hTcxEnc->Txnq, st->hTcxCfg->tcx_aldo_window_1_trunc, st->hTcxCfg->tcx_mdct_window_half, st->hTcxCfg->tcx_mdct_window_minimum, st->hTcxCfg->tcx_mdct_window_length, st->hTcxCfg->tcx_mdct_window_half_length, st->hTcxCfg->tcx_mdct_window_min_length, st->hTcxCfg->tcx_last_overlap_mode ); + + for ( i = 0; i < st->hTcxCfg->tcx_mdct_window_length; i++ ) + { + timeDomainOutput[i] += st->hTcxEnc->Txnq[i]; + } + } + } + else + { + lsp2a_stab( st->lsp_old, old_Aq, M ); + old_exc = st->hLPDmem->old_exc + L_EXC_MEM - ( N / 2 ); + old_syn_pe = st->hLPDmem->mem_syn2; + old_syn = st->hLPDmem->syn[M]; + for ( i = 0; i < N / 2; i++ ) + { + old_exc_ener += old_exc[i] * old_exc[i]; + } + + old_exc_ener = (float) sqrt( old_exc_ener / (float) ( N / 2 ) ); + + for ( i = 0; i < N; i++ ) + { + rand_gauss( &( noise[i] ), &( seed_loc ) ); + gain += noise[i] * noise[i]; + } + + gain = old_exc_ener / (float) sqrt( gain / (float) N ); + + for ( i = 0; i < N; i++ ) + { + noise[i] *= gain; + } + + syn_filt( old_Aq, M, noise, noise, N, old_syn_pe, 0 ); + + tmp = old_syn; + + deemph( noise, preemph_fac, N, &tmp ); + + for ( i = 0; i < N / 2; i++ ) + { + timeDomainOutput[i] += noise[i] * hFdCngCom->olapWinSyn[N / 2 + i]; + } + } + } + + return; +} + +/*-------------------------------------------------------------------* + * cng_energy() + * + * + *-------------------------------------------------------------------*/ + +/*! r: CNG energy */ +float cng_energy( + const int16_t element_mode, /* i : element mode */ + const int16_t bwidth, /* i : audio bandwidh */ + const int16_t CNG_mode, /* i : mode for DTX configuration */ + const float CNG_att, /* i : attenuation factor for CNG */ + const float *exc, /* i : input signal */ + const int16_t len /* i : vector length */ +) +{ + float enr, att; + + /* calculate the residual signal energy */ + enr = dotp( exc, exc, len ) / len; + + /* convert log2 of residual signal energy */ + enr = (float) log10( enr + 0.1f ) / (float) log10( 2.0f ); + + /* decrease the energy in case of WB input */ + if ( element_mode == IVAS_CPE_DFT || element_mode == IVAS_CPE_TD ) + { + enr += CNG_att * FAC_LOG2 / 10.0f; + } + else if ( bwidth != NB ) + { + if ( bwidth == WB ) + { + if ( CNG_mode >= 0 ) + { + /* Bitrate adapted attenuation */ + att = ENR_ATT[CNG_mode]; + } + else + { + /* Use least attenuation for higher bitrates */ + att = ENR_ATT[4]; + } + } + else + { + att = 1.5f; + } + enr -= att; + } + + return ( enr ); +} + + +/*-------------------------------------------------------------------* + * stereoFdCngCoherence() + * + * compute coherence of channels for use in FD-CNG + *-------------------------------------------------------------------*/ + +void stereoFdCngCoherence( + Encoder_State **sts, /* i/o: core encoder structures */ + const int16_t last_element_mode, /* i : last element mode */ + float fft_buff[CPE_CHANNELS][2 * L_FFT] /* i : fft buffers for L and R channels */ +) +{ + const float *pt_fftL, *pt_fftR; + int16_t i_subfr, i; + float cr, ci, eL, eR; + float *mem; + + if ( last_element_mode != IVAS_CPE_MDCT ) + { + set_f( sts[0]->hFdCngEnc->mem_coherence, EPSILON, 4 ); + } + + if ( sts[0]->core_brate == -1 || sts[1]->core_brate == -1 ) + { + /* case: at least one channel has triggered VAD -> ACTIVE FRAME */ + if ( sts[0]->core_brate == -1 ) + { + sts[1]->total_brate = sts[0]->total_brate; + sts[1]->active_cnt = sts[0]->active_cnt; + if ( sts[1]->active_cnt >= CNG_TYPE_HO ) + { + sts[1]->last_total_brate_cng = -1; + } + } + if ( sts[1]->core_brate == -1 ) + { + sts[0]->total_brate = sts[1]->total_brate; + sts[0]->active_cnt = sts[1]->active_cnt; + if ( sts[0]->active_cnt >= CNG_TYPE_HO ) + { + sts[0]->last_total_brate_cng = -1; + } + } + sts[0]->core_brate = -1; + sts[1]->core_brate = -1; + sts[0]->hDtxEnc->cnt_SID = 0; + sts[1]->hDtxEnc->cnt_SID = 0; + } + else if ( sts[0]->core_brate <= SID_2k40 && sts[1]->core_brate <= SID_2k40 ) + { + /* case: no VAD for both channels -> INACTIVE FRAME */ + reset_indices_enc( sts[0]->hBstr, sts[0]->hBstr->nb_ind_tot ); + + reset_indices_enc( sts[1]->hBstr, sts[1]->hBstr->nb_ind_tot ); + + /* synchronize SID sending for variable SID rate */ + if ( sts[0]->core_brate != sts[1]->core_brate ) + { + sts[0]->core_brate = SID_2k40; + sts[1]->core_brate = SID_2k40; + } + + /* synchronize SID counters */ + sts[0]->hDtxEnc->cnt_SID = min( sts[0]->hDtxEnc->cnt_SID, sts[1]->hDtxEnc->cnt_SID ); + sts[1]->hDtxEnc->cnt_SID = sts[0]->hDtxEnc->cnt_SID; + } + + pt_fftL = fft_buff[0]; + pt_fftR = fft_buff[1]; + mem = sts[0]->hFdCngEnc->mem_coherence; + + for ( i_subfr = 0; i_subfr < 2; i_subfr++ ) + { + cr = ci = eL = eR = EPSILON; + + cr += pt_fftL[0] * pt_fftR[0] + pt_fftL[L_FFT / 2] * pt_fftR[L_FFT / 2]; + eL += pt_fftL[0] * pt_fftL[0] + pt_fftL[L_FFT / 2] * pt_fftL[L_FFT / 2]; + eR += pt_fftR[0] * pt_fftR[0] + pt_fftR[L_FFT / 2] * pt_fftR[L_FFT / 2]; + + for ( i = 1; i < L_FFT / 2; i++ ) + { + cr += pt_fftL[i] * pt_fftR[i] + pt_fftL[L_FFT - i] * pt_fftR[L_FFT - i]; + ci += -pt_fftL[i] * pt_fftR[L_FFT - i] + pt_fftR[i] * pt_fftL[L_FFT - i]; + eL += pt_fftL[i] * pt_fftL[i] + pt_fftL[L_FFT - i] * pt_fftL[L_FFT - i]; + eR += pt_fftR[i] * pt_fftR[i] + pt_fftR[L_FFT - i] * pt_fftR[L_FFT - i]; + } + + if ( sts[0]->ini_frame <= 50 || ( sts[0]->vad_flag == 0 && sts[1]->vad_flag == 0 ) ) + { + mem[0] = 0.95f * mem[0] + 0.05f * cr; + mem[1] = 0.95f * mem[1] + 0.05f * ci; + mem[2] = 0.95f * mem[2] + 0.05f * eL; + mem[3] = 0.95f * mem[3] + 0.05f * eR; + } + + pt_fftL += L_FFT; + pt_fftR += L_FFT; + } + + sts[0]->hFdCngEnc->hFdCngCom->coherence = sqrtf( ( mem[0] * mem[0] + mem[1] * mem[1] ) / ( mem[2] * mem[3] ) ); + + return; +} + + +/*-------------------------------------------------------------------* + * FdCngEncodeMDCTStereoSID() + * + * Encode DTX parameters and noise shapes into SID for MDCT-Stereo DTX + *-------------------------------------------------------------------*/ + +void FdCngEncodeMDCTStereoSID( + CPE_ENC_HANDLE hCPE /* i/o: CPE encoder state structure */ +) +{ + ENC_CORE_HANDLE sts[CPE_CHANNELS]; + float *lr_in_ptr[CPE_CHANNELS]; + float *ms_ptr[CPE_CHANNELS]; + float *lr_out_ptr[CPE_CHANNELS]; + float logNoiseEst[CPE_CHANNELS][NPART]; + float E[CPE_CHANNELS]; + float gain[CPE_CHANNELS]; + float weights[NPART]; + int16_t indices[CPE_CHANNELS][FD_CNG_stages_37bits]; + int16_t gain_idx[CPE_CHANNELS]; + int16_t N, stages, ch, p, coh_idx; + float side_energy; + int16_t no_side_flag; + int16_t is_inp_ms; + + float tot_sig_ext[FDCNG_VQ_MAX_LEN], dct_target[CPE_CHANNELS][FDCNG_VQ_DCT_MAXTRUNC]; /* 24 +2*18*/ + float *invTrfMatrix; + float tmpRAM[FDCNG_VQ_MAX_LEN][FDCNG_VQ_DCT_MAXTRUNC]; /*24*18*/ + invTrfMatrix = (float *) tmpRAM; /* dynamically filled */ + + + is_inp_ms = 0; + if ( hCPE->hCoreCoder[0]->cng_sba_flag == 1 ) + { + is_inp_ms = 1; + } + + /* set pointers and initialize */ + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + sts[ch] = hCPE->hCoreCoder[ch]; + lr_in_ptr[ch] = &sts[ch]->hFdCngEnc->msNoiseEst[0]; + ms_ptr[ch] = &logNoiseEst[ch][0]; + lr_out_ptr[ch] = &sts[ch]->hFdCngEnc->hFdCngCom->sidNoiseEst[0]; + } + N = sts[0]->hFdCngEnc->npartDec; + set_f( weights, 1.f, NPART ); + + /* apply log and save energy of original left and right channels */ + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + E[ch] = 0.0f; + for ( p = 0; p < N; p++ ) + { + ms_ptr[ch][p] = 10.f * log10f( lr_in_ptr[ch][p] + EPSILON ); + E[ch] += ms_ptr[ch][p]; + } + } + + /* M/S transform on log envelopes */ + if ( is_inp_ms == 0 ) + { + convertToMS( N, ms_ptr[0], ms_ptr[1], 0.5f ); + } + + side_energy = sum2_f( ms_ptr[1], N ); + + /* do not transmit side shape if initial noise shapes are very similar */ + if ( side_energy <= 0.1f ) + { + no_side_flag = 1; + } + else + { + no_side_flag = 0; + } + + /* Quantize noise shapes */ + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + /* Normalize MSVQ input */ + gain[ch] = 0.f; + for ( p = N_GAIN_MIN; p < N_GAIN_MAX; p++ ) + { + gain[ch] += ms_ptr[ch][p]; + } + gain[ch] /= (float) ( N_GAIN_MAX - N_GAIN_MIN ); + + for ( p = 0; p < N; p++ ) + { + ms_ptr[ch][p] -= gain[ch]; + } + } + /* always split channel targetloop */ + + /* extend fdcng envelope from length 21 to a 24 length fdncg domain envelope signal */ + /* High quality cosine smooth basis extension used to not introduce noise in stage#1 DCT24 analysis and subsequent VQ-steps */ + if ( N == FDCNG_VQ_MAX_LEN_WB ) + { + create_IDCT_N_Matrix( invTrfMatrix, N, FDCNG_VQ_DCT_MAXTRUNC, sizeof( tmpRAM ) / ( sizeof( float ) ) ); /*WB: create truncated IDCT21 matrix */ + + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + /* run DCT_N N==21 , truncated at 18/21 ~= 86% , i.e use a bit better better quality in extrapolation , than subsequent DCT24 analysis which is truncated at 75%*/ + + /* truncated DCT 21 analysis */ + dctT2_N_apply_matrix( (const float *) ms_ptr[ch], dct_target[ch], FDCNG_VQ_DCT_MAXTRUNC, N, invTrfMatrix, FDCNG_VQ_DCT_MAXTRUNC, DCT_T2_21_XX ); + + /* extrapolate extend fdcng envelope signal in the fdncg ienvelope/"time" domain using DCT21 basis vectors, + estimated DCT21 coeffs scaling extended basis vectors are used to create extrapolated length 24 input target envelope signal */ + /* this DCT21 extension does not introduce DCT24 coefficient noise for the subsequent dct24 target analysis, and later in IDCT24 synthesis */ + + /* truncated IDCT 21 extension synthesis */ + extend_dctN_input( ms_ptr[ch], dct_target[ch], N, tot_sig_ext, FDCNG_VQ_MAX_LEN, invTrfMatrix /* DCT_N basis vectors */, FDCNG_VQ_DCT_MAXTRUNC, IDCT_T2_XX_21 ); /* use 18 basis vectors*/ + + mvr2r( tot_sig_ext, ms_ptr[ch], FDCNG_VQ_MAX_LEN ); /* write extended result as input to VQ */ + } + } + create_IDCT_N_Matrix( invTrfMatrix, FDCNG_VQ_MAX_LEN, FDCNG_VQ_DCT_MAXTRUNC, sizeof( tmpRAM ) / ( sizeof( float ) ) ); /*always create/set up IDCT24 matrix in RAM */ + + /* end split */ + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + /* MSVQ */ + if ( ch ) + { + stages = FD_CNG_JOINT_stages_25bits; + } + else + { + stages = FD_CNG_stages_37bits; + } + + /* DCT24 domain compressed/truncated indices used for first stage */ + /* mid channel quantization using stages 1 through 6 */ + /* & side channel quantization using stages 1 through 4 */ + + { + msvq_enc( cdk_37bits_ivas, NULL, NULL, ms_ptr[ch], levels_37bits, FD_CNG_maxC_37bits, stages, weights, N, FD_CNG_maxN_37bits, 1, invTrfMatrix, indices[ch] ); + msvq_dec( cdk_37bits_ivas, NULL, NULL, stages, N, FD_CNG_maxN_37bits, indices[ch], 1, invTrfMatrix, ms_ptr[ch], NULL ); + } + } + + if ( no_side_flag ) + { + set_zero( ms_ptr[1], N ); + } + + /* undo M/S */ + if ( is_inp_ms == 0 ) + { + convertToMS( N, ms_ptr[0], ms_ptr[1], 1.0f ); + } + + /* Compute gain against original left and right channels */ + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + gain[ch] = 0.f; + for ( p = 0; p < N; p++ ) + { + gain[ch] += ms_ptr[ch][p]; + } + gain[ch] = ( E[ch] - gain[ch] ) / (float) N; + apply_scale( &gain[ch], sts[ch]->hFdCngEnc->hFdCngCom->CngBandwidth, sts[ch]->element_brate, scaleTableStereo, SIZE_SCALE_TABLE_STEREO ); + + /* quantize gain */ + gain_idx[ch] = (int16_t) floor( gain[ch] * 1.5f + GAIN_Q_OFFSET_IVAS + .5f ); + gain_idx[ch] = max( 0, min( 127, gain_idx[ch] ) ); + + gain[ch] = ( (float) gain_idx[ch] - GAIN_Q_OFFSET_IVAS ) / 1.5f; + } + + /* restore channel noise envelopes */ + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + HANDLE_FD_CNG_ENC hFdCngEnc = sts[ch]->hFdCngEnc; + HANDLE_FD_CNG_COM hFdCngCom = hFdCngEnc->hFdCngCom; + + for ( p = 0; p < N; p++ ) + { + lr_out_ptr[ch][p] = powf( 10.f, ( ms_ptr[ch][p] + gain[ch] ) / 10.f ); + } + + /* scale bands and get scalefactors */ + scalebands( lr_out_ptr[ch], hFdCngEnc->partDec, N, hFdCngEnc->midbandDec, hFdCngEnc->nFFTpartDec, hFdCngEnc->stopBandDec - hFdCngEnc->startBandDec, hFdCngCom->cngNoiseLevel, 1 ); + + lpc_from_spectrum( hFdCngCom, hFdCngEnc->startBandDec, hFdCngEnc->stopFFTbinDec, sts[ch]->preemph_fac ); + + sts[ch]->hDtxEnc->last_CNG_L_frame = sts[ch]->L_frame; + } + + /* quantize channel coherence */ + coh_idx = (int16_t) floor( sts[0]->hFdCngEnc->hFdCngCom->coherence * 15.f + 0.5f ); + coh_idx = max( 0, min( coh_idx, 15 ) ); + + /* ---- Write SID bitstream ---- */ + + + /* noise shapes and channel gains */ + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + if ( ch ) + { + stages = FD_CNG_JOINT_stages_25bits; + sts[ch]->hBstr->ind_list = sts[0]->hBstr->ind_list + sts[0]->hBstr->nb_ind_tot; + + /* side info */ + push_indice( sts[ch]->hBstr, IND_SID_TYPE, coh_idx, 4 ); + push_indice( sts[ch]->hBstr, IND_SID_TYPE, no_side_flag, 1 ); + } + else + { + stages = FD_CNG_stages_37bits; + /* side info */ + push_indice( sts[ch]->hBstr, IND_SID_TYPE, 1, 1 ); + push_indice( sts[ch]->hBstr, IND_BWIDTH, sts[0]->bwidth, 2 ); + push_indice( sts[ch]->hBstr, IND_ACELP_16KHZ, sts[0]->L_frame == L_FRAME16k ? 1 : 0, 1 ); + } + + for ( int16_t i = 0; i < stages; i++ ) + { + push_indice( sts[ch]->hBstr, IND_LSF, indices[ch][i], bits_37bits[i] ); + } + push_indice( sts[ch]->hBstr, IND_ENERGY, gain_idx[ch], 7 ); + } + + /* pad with zeros to reach common SID frame size */ + push_indice( sts[1]->hBstr, IND_ENERGY, 0, ( IVAS_SID_5k2 - 4400 ) / FRAMES_PER_SEC ); + + + return; +} + + +/*-------------------------------------------------------------------* + * FdCngEncodeDiracMDCTStereoSID() + * + * Encode DTX parameters and noise shapes into SID for MDCT-Stereo DTX + * together with Dirac + *-------------------------------------------------------------------*/ + +void FdCngEncodeDiracMDCTStereoSID( + CPE_ENC_HANDLE hCPE /* i/o: CPE encoder state structure */ +) +{ + ENC_CORE_HANDLE sts[CPE_CHANNELS]; + float *lr_in_ptr[CPE_CHANNELS]; + float *ms_ptr[CPE_CHANNELS]; + float *lr_out_ptr[CPE_CHANNELS]; + float logNoiseEst[CPE_CHANNELS][NPART]; + float E[CPE_CHANNELS]; + float gain[CPE_CHANNELS]; + float weights[NPART]; + int16_t N[CPE_CHANNELS]; + int16_t indices[CPE_CHANNELS][FD_CNG_stages_37bits]; + int16_t gain_idx[CPE_CHANNELS]; + int16_t ch, p; + float *invTrfMatrix; + float tmpRAM[FDCNG_VQ_MAX_LEN][FDCNG_VQ_DCT_MAXTRUNC]; + float dct_target[FDCNG_VQ_DCT_MAXTRUNC]; + float tot_sig_ext[FDCNG_VQ_MAX_LEN]; + invTrfMatrix = (float *) tmpRAM; /* dynamically filled */ + + /* set pointers and initialize */ + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + sts[ch] = hCPE->hCoreCoder[ch]; + N[ch] = sts[ch]->hFdCngEnc->npartDec; + lr_in_ptr[ch] = &sts[ch]->hFdCngEnc->msNoiseEst[0]; + ms_ptr[ch] = &logNoiseEst[ch][0]; + lr_out_ptr[ch] = &sts[ch]->hFdCngEnc->hFdCngCom->sidNoiseEst[0]; + } + set_f( weights, 1.f, NPART ); + + /* apply log and save energy of original left and right channels */ + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + E[ch] = 0.0f; + for ( p = 0; p < N[ch]; p++ ) + { + ms_ptr[ch][p] = 10.f * log10f( lr_in_ptr[ch][p] + EPSILON ); + E[ch] += ms_ptr[ch][p]; + } + } + + /* M/S transform on log envelopes */ + convertToMS( N[0], ms_ptr[0], ms_ptr[1], 0.5f ); + + E[0] = sum_f( ms_ptr[0], N[0] ); + + /* Quantize M noise shape */ + /* Normalize MSVQ input */ + gain[0] = sum_f( ms_ptr[0] + N_GAIN_MIN, N_GAIN_MAX - N_GAIN_MIN ); + gain[0] /= (float) ( N_GAIN_MAX - N_GAIN_MIN ); + + for ( p = 0; p < N[0]; p++ ) + { + ms_ptr[0][p] -= gain[0]; + } + + /* MSVQ */ + /* DCT domain compressed/truncated indices used for first stage */ + /* mid quantization using stages #1 through 6 */ + if ( N[0] == FDCNG_VQ_MAX_LEN_WB ) + { + create_IDCT_N_Matrix( invTrfMatrix, N[0], FDCNG_VQ_DCT_MAXTRUNC, sizeof( tmpRAM ) / ( sizeof( float ) ) ); + /* truncated DCT 21 analysis */ + dctT2_N_apply_matrix( (const float *) ms_ptr[0], dct_target, FDCNG_VQ_DCT_MAXTRUNC, N[0], invTrfMatrix, FDCNG_VQ_DCT_MAXTRUNC, DCT_T2_21_XX ); + /* truncated IDCT21 extension to 24 synthesis */ + extend_dctN_input( ms_ptr[0], dct_target, N[0], tot_sig_ext, FDCNG_VQ_MAX_LEN, invTrfMatrix, FDCNG_VQ_DCT_MAXTRUNC, IDCT_T2_XX_21 ); /* use 18 basis vectors*/ + + mvr2r( tot_sig_ext, ms_ptr[0], FDCNG_VQ_MAX_LEN ); /* write extended result as input to VQ stage #1 */ + } + create_IDCT_N_Matrix( invTrfMatrix, FDCNG_VQ_MAX_LEN, FDCNG_VQ_DCT_MAXTRUNC, sizeof( tmpRAM ) / ( sizeof( float ) ) ); + + msvq_enc( cdk_37bits_ivas, NULL, NULL, ms_ptr[0], levels_37bits, FD_CNG_maxC_37bits, FD_CNG_stages_37bits, weights, N[0], FD_CNG_maxN_37bits, 1, invTrfMatrix, indices[0] ); + msvq_dec( cdk_37bits_ivas, NULL, NULL, FD_CNG_stages_37bits, N[0], FD_CNG_maxN_37bits, indices[0], 1, invTrfMatrix, ms_ptr[0], NULL ); + + + /* set S to zero */ + set_zero( ms_ptr[1], NPART ); + + /* compute M gain */ + gain[0] = sum_f( ms_ptr[0], N[0] ); + gain[0] = ( E[0] - gain[0] ) / (float) N[0]; + apply_scale( &gain[0], sts[0]->hFdCngEnc->hFdCngCom->CngBandwidth, sts[0]->hDtxEnc->last_active_brate, scaleTableStereo, SIZE_SCALE_TABLE_STEREO ); + + /* quantize gain */ + gain_idx[0] = (int16_t) floor( gain[0] * 1.5f + GAIN_Q_OFFSET_IVAS + .5f ); + gain_idx[0] = max( 0, min( 127, gain_idx[0] ) ); + + gain[0] = ( (float) gain_idx[0] - GAIN_Q_OFFSET_IVAS ) / 1.5f; + gain[1] = gain[0]; + + /* undo M/S */ + convertToMS( NPART, ms_ptr[0], ms_ptr[1], 1.0f ); + + /* restore channel noise envelopes */ + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + HANDLE_FD_CNG_ENC hFdCngEnc = sts[ch]->hFdCngEnc; + HANDLE_FD_CNG_COM hFdCngCom = hFdCngEnc->hFdCngCom; + + for ( p = 0; p < N[0]; p++ ) + { + lr_out_ptr[ch][p] = powf( 10.f, ( ms_ptr[ch][p] + gain[ch] ) / 10.f ); + } + + /* NB last band energy compensation */ + if ( hFdCngCom->CngBandwidth == NB ) + { + lr_out_ptr[ch][N[ch] - 1] *= NB_LAST_BAND_SCALE; + } + else if ( hFdCngCom->CngBandwidth == SWB && hFdCngCom->CngBitrate <= ACELP_13k20 ) + { + lr_out_ptr[ch][N[ch] - 1] *= SWB_13k2_LAST_BAND_SCALE; + } + + /* scale bands and get scalefactors */ + scalebands( lr_out_ptr[ch], hFdCngEnc->partDec, N[ch], hFdCngEnc->midbandDec, hFdCngEnc->nFFTpartDec, hFdCngEnc->stopBandDec - hFdCngEnc->startBandDec, hFdCngCom->cngNoiseLevel, 1 ); + + lpc_from_spectrum( hFdCngCom, hFdCngEnc->startBandDec, hFdCngEnc->stopFFTbinDec, sts[ch]->preemph_fac ); + + sts[ch]->hDtxEnc->last_CNG_L_frame = sts[ch]->L_frame; + } + sts[0]->hFdCngEnc->hFdCngCom->coherence = 0.0f; + sts[1]->hFdCngEnc->hFdCngCom->coherence = 0.0f; + + /* ---- Write SID bitstream ---- */ + + /* side info */ + push_indice( sts[0]->hBstr, IND_SID_TYPE, 1, 1 ); + push_indice( sts[0]->hBstr, IND_BWIDTH, sts[0]->bwidth, 2 ); + push_indice( sts[0]->hBstr, IND_ACELP_16KHZ, sts[0]->L_frame == L_FRAME16k ? 1 : 0, 1 ); + + /* noise shapes and channel gains */ + for ( int16_t i = 0; i < FD_CNG_stages_37bits; i++ ) + { + push_indice( sts[0]->hBstr, IND_LSF, indices[0][i], bits_37bits[i] ); + } + push_indice( sts[0]->hBstr, IND_ENERGY, gain_idx[0], 7 ); + + return; +} diff --git a/lib_enc/find_tar.c b/lib_enc/find_tar.c new file mode 100644 index 0000000000000000000000000000000000000000..fc94194276b300cae95b3ea378fcdeac55ab3fbb --- /dev/null +++ b/lib_enc/find_tar.c @@ -0,0 +1,120 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * find_targets() + * + * Find the target vectors for excitaiton search: + *-------------------------------------------------------------------*/ + +void find_targets( + const float *speech, /* i : pointer to the speech frame */ + const float *mem_syn, /* i : memory of the synthesis filter */ + const int16_t i_subfr, /* i : subframe index */ + float *mem_w0, /* i/o: weighting filter denominator memory */ + const float *p_Aq, /* i : interpolated quantized A(z) filter */ + const float *res, /* i : residual signal */ + const int16_t L_subfr, /* i : length of vectors for gain quantization */ + const float *Ap, /* i : unquantized A(z) filter with bandwidth expansion */ + const float tilt_fac, /* i : tilt factor */ + float *xn, /* o : Close-loop Pitch search target vector */ + float *cn, /* o : target vector in residual domain */ + float *h1 /* o : impulse response of weighted synthesis filter */ +) +{ + int16_t i; + float error[M + 6 * L_SUBFR]; /* error of quantization */ + float tmp_fl[M + 3 * L_SUBFR], tmp; + + /*------------------------------------------------------------------------* + * Find the target vector for excitation search: + * + * |------| res[n] + * speech[n]---| A(z) |-------- + * |------| | |--------| error[n] |------| + * zero -- (-)--| 1/A(z) |-----------| W(z) |-- target + * exc |--------| |------| + * + * Instead of subtracting the zero-input response of filters from + * the weighted input speech, the above configuration is used to + * compute the target vector. + *-----------------------------------------------------------------------*/ + + for ( i = 0; i < M; i++ ) + { + error[i] = speech[i + i_subfr - M] - mem_syn[i]; + } + + syn_filt( p_Aq, M, &res[i_subfr], error + M, L_subfr, error, 0 ); + residu( Ap, M, error + M, xn, L_subfr ); + deemph( xn, tilt_fac, L_subfr, mem_w0 ); + + /*-----------------------------------------------------------------* + * Find target in residual domain (cn[]) for innovation search + *--------------------------------------------------------------*/ + if ( cn != NULL ) + { + /* first half: xn[] --> cn[] */ + set_f( tmp_fl, 0, M ); + mvr2r( xn, tmp_fl + M, L_subfr / 2 ); + tmp = 0.0f; + + preemph( tmp_fl + M, tilt_fac, L_subfr / 2, &tmp ); + syn_filt( Ap, M, tmp_fl + M, tmp_fl + M, L_subfr / 2, tmp_fl, 0 ); + residu( p_Aq, M, tmp_fl + M, cn, L_subfr / 2 ); + + /* second half: res[] --> cn[] (approximated and faster) */ + mvr2r( &res[i_subfr + ( L_subfr / 2 )], cn + ( L_subfr / 2 ), L_subfr / 2 ); + } + + /*-----------------------------------------------------------------* + * Compute impulse response h1[] of the weighted synthesis filter + *-----------------------------------------------------------------*/ + + set_f( h1, 0, L_subfr ); + mvr2r( Ap, h1, M + 1 ); + syn_filt( p_Aq, M, h1, h1, L_subfr, h1 + ( M + 1 ), 0 ); + tmp = 0.0f; + deemph( h1, tilt_fac, L_subfr, &tmp ); + + return; +} diff --git a/lib_enc/find_tilt.c b/lib_enc/find_tilt.c new file mode 100644 index 0000000000000000000000000000000000000000..fcff9d796b0defcaa1d16764546362828be20ddb --- /dev/null +++ b/lib_enc/find_tilt.c @@ -0,0 +1,213 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "wmc_auto.h" + +/*---------------------------------------------------------------------* + * Local constants + *---------------------------------------------------------------------*/ + +#define FACT 3.0f /* background noise energy estimation adjusting factor - to maintain the ADR about the same */ +#define TH_COR 0.6f /* Minimum correlation for per bin processing */ +#define TH_D 50.0f /* Difference limit between nearest harmonic and a frequency bin */ +#define TH_PIT ( INT_FS_12k8 / ( 2.0f * TH_D ) ) /* Maximum pitch for per bin processing */ + +/*-------------------------------------------------------------------* + * find_tilt() + * + * Find LF/HF energy ratio + *-------------------------------------------------------------------*/ + +void find_tilt( + const float fr_bands[], /* i : energy in frequency bands */ + const float bckr[], /* i : per band background noise energy estimate */ + float ee[2], /* o : lf/hf E ration for present frame */ + const int16_t pitch[3], /* i : open loop pitch values for 3 half-frames */ + const float voicing[3], /* i : normalized correlation for 3 half-frames */ + const float *lf_E, /* i : per bin energy for low frequencies */ + const float corr_shift, /* i : normalized correlation correction */ + const int16_t bwidth, /* i : input signal bandwidth */ + const int16_t max_band, /* i : maximum critical band */ + float hp_E[], /* o : energy in HF */ + const int16_t codec_mode, /* i : Mode 1 or 2 */ + float *bckr_tilt_lt, /* i/o: lf/hf E ratio of background noise */ + int16_t Opt_vbr_mode ) +{ + float lp_bckr, hp_bckr, lp_E, freq, f0, f1, f2, mean_voi, bin; + const float *pt_bands, *pt_bckr, *tmp_E, *hf_bands, *pt_E; + int16_t cnt, i, nb_bands; + float th_pit; + + /*-----------------------------------------------------------------* + * Initializations + *-----------------------------------------------------------------*/ + + th_pit = TH_PIT; + + if ( bwidth != NB ) + { + /* WB processing */ + bin = BIN; /* First useful frequency bin ~ 50 Hz */ + pt_bands = fr_bands; + tmp_E = lf_E; + pt_bckr = bckr; + nb_bands = 10; + } + else + { + /* NB processing */ + bin = 3.0f * BIN; /* first useful frequency bin ~ 150 Hz */ + pt_bands = fr_bands + 1; /* exlcude 1st critical band */ + tmp_E = lf_E + 2; /* start at the 3rd bin (150 Hz) */ + pt_bckr = bckr + 1; /* exclude 1st critical band */ + nb_bands = 9; /* nb. of "low" frequency bands taken into account in NB processing */ + } + + /*-----------------------------------------------------------------* + * Find spectrum tilt + *-----------------------------------------------------------------*/ + + pt_E = tmp_E; /* pointer at the 1st useful element of the per-bin energy vector */ + hf_bands = fr_bands; + + /* bckr + voicing */ + lp_bckr = mean( pt_bckr, nb_bands ); /* estimated noise E in first critical bands, up to 1270 Hz */ + hp_bckr = 0.5f * ( bckr[max_band - 1] + bckr[max_band] ); /* estimated noise E in last 2 critical bands */ + *bckr_tilt_lt = 0.9f * *bckr_tilt_lt + 0.1f * lp_bckr / hp_bckr; + + if ( codec_mode == MODE2 || Opt_vbr_mode ) + { + lp_bckr *= FACT; + hp_bckr *= FACT; + } + + mean_voi = 0.5f * ( voicing[1] + voicing[2] ) + corr_shift; + f0 = ( (float) INT_FS_12k8 ) / pitch[2]; + + for ( i = 0; i < 2; i++ ) + { + hp_E[i] = 0.5f * ( hf_bands[max_band - 1] + hf_bands[max_band] ) - hp_bckr; /* average E in last 2 critical bands */ + + if ( !Opt_vbr_mode ) + { + if ( hp_E[i] < E_MIN ) + { + /* to avoid division by 0 */ + hp_E[i] = E_MIN; + } + } + else + { + if ( hp_E[i] < 1.0f ) + { + /* to avoid division by 0 */ + hp_E[i] = 1.0f; + } + } + + + if ( ( mean_voi > TH_COR ) && ( pitch[2] < th_pit ) ) + { + /* high-pitched voiced frames */ + freq = bin; /* 1st useful frequency bin */ + cnt = 0; + lp_E = 0.0f; + f1 = 1.5f * f0; /* middle between 2 harmonics */ + f2 = f0; + + while ( freq <= 1270.0f ) /* end frequency of 10th critical band */ + { + /*pt_E*/ + while ( freq <= f1 ) + { + if ( fabs( freq - f2 ) < TH_D ) /* include only bins sufficiently close to harmonics */ + { + lp_E += *pt_E; + cnt++; + } + freq += BIN; + pt_E++; + } + f1 += f0; + f2 += f0; /* next harmonic */ + } + + lp_E = lp_E / (float) cnt - lp_bckr; + pt_E = tmp_E + VOIC_BINS; /* update for next half-frame */ + } + else + { + /* other than high-pitched voiced frames */ + lp_E = mean( pt_bands, nb_bands ) - lp_bckr; /* average E in first critical bands, up to 1270 Hz */ + } + + if ( !Opt_vbr_mode ) + { + if ( lp_E < E_MIN ) + { + /* avoid negative E due to noise subtraction */ + lp_E = E_MIN; + } + } + else + { + + if ( lp_E < 0.0f ) + { + /* avoid negative E due to noise subtraction */ + lp_E = 0.0f; + } + } + + /* calculate the tilt (LF/HF ratio) */ + ee[i] = lp_E / hp_E[i]; + + if ( bwidth == NB ) /* for NB input, compensate for the missing bands */ + { + ee[i] *= 6.0f; + } + + pt_bands += NB_BANDS; /* update pointers for the next half-frame */ + hf_bands += NB_BANDS; + } + + return; +} diff --git a/lib_enc/find_uv.c b/lib_enc/find_uv.c new file mode 100644 index 0000000000000000000000000000000000000000..9551a2a15330d7b4fcd86579764fc0d0d14a145d --- /dev/null +++ b/lib_enc/find_uv.c @@ -0,0 +1,488 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * Local constants + *-------------------------------------------------------------------*/ + +#define L_ENR ( NB_SSF + 2 ) +#define VOI_THRLD 0.2f + + +/*-------------------------------------------------------------------* + * find_ener_decrease() + * + * Find maximum energy ratio between short sub-subframes in case + * energy is trailing off after a spike + *-------------------------------------------------------------------*/ + +/*! r: maximum energy ratio */ +static float find_ener_decrease( + const int16_t ind_deltaMax, /* i : index of the beginning of maximum energy search */ + const float *pt_enr_ssf /* i : Pointer to the energy buffer */ +) +{ + int16_t i, j, end, flag; + float maxEnr, minEnr, dE2; + + dE2 = 0.0f; + j = ind_deltaMax + 2; + end = j + L_ENR; + maxEnr = pt_enr_ssf[j]; + j++; + flag = 0; + for ( i = j; i < end; i++ ) + { + if ( pt_enr_ssf[i] > maxEnr && flag == 0 ) + { + maxEnr = pt_enr_ssf[i]; + j++; + } + else + { + flag = 1; + } + } + + minEnr = maxEnr; + for ( i = j; i < end; i++ ) + { + if ( pt_enr_ssf[i] < minEnr ) + { + minEnr = pt_enr_ssf[i]; + } + } + + dE2 = maxEnr / ( minEnr + 1.0e5f ); + + return dE2; +} + + +/*-------------------------------------------------------------------* + * find_uv() + * + * Decision about coder type + *-------------------------------------------------------------------*/ + +/*! r: coding type */ +int16_t find_uv( + Encoder_State *st, /* i/o: encoder state structure */ + const float *pitch_fr, /* i : pointer to adjusted fractional pitch (4 val.) */ + const float *voicing_fr, /* i : refined correlation for each subframes */ + const float *speech, /* i : pointer to speech signal for E computation */ + const float *ee, /* i : lf/hf Energy ratio for present frame */ + float *dE1X, /* o : sudden energy increase for S/M classifier */ + const float corr_shift, /* i : normalized correlation correction in noise */ + const float relE, /* i : relative frame energy */ + const float Etot, /* i : total energy */ + const float hp_E[], /* i : energy in HF */ + int16_t *flag_spitch, /* i/o: flag to indicate very short stable pitch and high correlation */ + const int16_t last_core_orig, /* i : original last core */ + STEREO_CLASSIF_HANDLE hStereoClassif /* i/o: stereo classifier structure */ +) +{ + const float *pt_speech; + int16_t i, coder_type, ind_deltaMax, tmp_offset_flag, nb_cond, flag_low_relE; + float fac, mean_voi3, mean_ee, relE_thres; + float enr_ssf[4 * NB_SSF + 2]; + float dE1, *pt_enr_ssf, *pt_enr_ssf1, dE2, dE3, dE2_th, ee0_th, ee1_th, voi_th; + float mean_voi3_offset; + float voicing_m, dpit1, dpit2, dpit3; + int16_t Last_Resort; + float vadnoise; + + if ( st->hSC_VBR != NULL ) + { + Last_Resort = st->hSC_VBR->Last_Resort; + vadnoise = st->hSC_VBR->vadnoise; + } + else + { + Last_Resort = 0; + vadnoise = 0; + } + + /*-----------------------------------------------------------------* + * Detect sudden energy increases to catch voice and music attacks (dE1) + * + * - Find maximum energy per short sub-subframe + * two sub-subframe sets are used, shifted by half the sub-subframe length + * - Find maximum energy increase (ratio) between adjacent sub-subframes + *-----------------------------------------------------------------*/ + + /* find maximum energy per sub-subframe */ + pt_speech = speech - SSF; + pt_enr_ssf = enr_ssf + 2 * NB_SSF; + for ( i = 0; i < 2 * ( NB_SSF + 1 ); i++ ) + { + emaximum( pt_speech, SSF, pt_enr_ssf ); + pt_speech += ( SSF / 2 ); + pt_enr_ssf++; + } + + dE1 = 0.0f; + ind_deltaMax = 0; + pt_enr_ssf = enr_ssf + 2 * NB_SSF; + pt_enr_ssf1 = pt_enr_ssf + 2; + + /* test on energy increase between adjacent sub-subframes */ + for ( i = 0; i < 2 * NB_SSF; i++ ) + { + fac = *pt_enr_ssf1 / ( *pt_enr_ssf + 1.0f ); + if ( fac > dE1 ) + { + dE1 = fac; + ind_deltaMax = i; + } + + pt_enr_ssf++; + pt_enr_ssf1++; + } + + if ( hStereoClassif != NULL ) + { + if ( st->idchan == 0 ) + { + hStereoClassif->dE1_ch1 = dE1; + } + else + { + hStereoClassif->dE1_ch2 = dE1; + } + } + + if ( dE1X != NULL ) + { + *dE1X = dE1; + } + + /*-----------------------------------------------------------------* + * Average spectral tilt + * Average voicing (normalized correlation) + *-----------------------------------------------------------------*/ + + mean_ee = 1.0f / 3.0f * ( st->ee_old + ee[0] + ee[1] ); + mean_voi3 = 1.0f / 3.0f * ( st->voicing[0] + st->voicing[1] + st->voicing[2] ); + + /*-----------------------------------------------------------------* + * Total frame energy difference (dE3) + *-----------------------------------------------------------------*/ + + dE3 = Etot - st->hNoiseEst->Etot_last; + + /*-----------------------------------------------------------------* + * Energy decrease after spike (dE2) + *-----------------------------------------------------------------*/ + + /* set different thresholds and conditions for NB and WB input */ + if ( st->input_bwidth == NB ) + { + dE2_th = 21.0f; + nb_cond = ( mean_voi3 + corr_shift ) < 0.68f; + } + else + { + dE2_th = 30.0f; + nb_cond = 1; /* no additional condition for WB input */ + } + + /* calcualte maximum energy decrease */ + dE2 = 0.0f; + pt_enr_ssf = enr_ssf + 2 * NB_SSF; + + if ( dE1 > 30.0f && nb_cond ) + { + if ( 2 * NB_SSF - ind_deltaMax < L_ENR ) + { + st->old_ind_deltaMax = ind_deltaMax; + mvr2r( pt_enr_ssf, st->old_enr_ssf, 2 * NB_SSF ); + } + else + { + st->old_ind_deltaMax = -1; + dE2 = find_ener_decrease( ind_deltaMax, pt_enr_ssf ); + if ( dE2 > dE2_th ) + { + st->spike_hyst = 0; + } + } + } + else + { + if ( st->old_ind_deltaMax >= 0 ) + { + mvr2r( st->old_enr_ssf, enr_ssf, 2 * NB_SSF ); + dE2 = find_ener_decrease( st->old_ind_deltaMax, enr_ssf ); + if ( dE2 > dE2_th ) + { + st->spike_hyst = 1; + } + } + st->old_ind_deltaMax = -1; + } + + /*-----------------------------------------------------------------* + * Detection of voiced offsets (tmp_offset_flag) + *-----------------------------------------------------------------*/ + + tmp_offset_flag = 1; + + if ( st->input_bwidth != NB ) + { + ee0_th = 2.4f; + voi_th = 0.74f; + } + else + { + ee0_th = 9.8f; + voi_th = 0.76f; + } + + if ( ( st->last_coder_type_raw == UNVOICED ) || /* previous frame was unvoiced */ + ( ( ee[0] < ee0_th ) && ( hp_E[0] > (float) E_MIN ) && /* energy is concentrated in high frequencies provided that some energy is present in HF. The cast to (float) is needed for Linux i686 (gcc version 4.7.2), otherwise the criterion hp_E[0] > E_MIN holds true if E_MIN was assigned to hp_E[0] before */ + ( st->voicing[0] + corr_shift < voi_th ) ) ) /* normalized correlation is low */ + { + tmp_offset_flag = 0; + } + + /*-----------------------------------------------------------------* + * Decision about UC + *-----------------------------------------------------------------*/ + + /* SC-VBR - set additional parameters and thresholds for SC-VBR */ + mean_voi3_offset = 0.0f; + flag_low_relE = 0; + ee1_th = 9.5f; + if ( st->Opt_SC_VBR || ( st->idchan == 1 && st->element_mode == IVAS_CPE_TD ) ) /* Allow the low energy flag for the secondary channel */ + { + ee1_th = 8.5f; + + /* SC-VBR - determine the threshold on relative energy as a function of lp_noise */ + if ( st->input_bwidth != NB ) + { + if ( Last_Resort == 0 ) + { + relE_thres = 0.650f * st->lp_noise - 33.5f; + } + else + { + relE_thres = 0.700f * st->lp_noise - 33.5f; + } + } + else + { + relE_thres = 0.60f * st->lp_noise - 28.2f; + } + + if ( relE_thres < -25.0f ) + { + relE_thres = -25.0f; + } + + /* SC-VBR = set flag on low relative energy */ + if ( relE < relE_thres ) + { + flag_low_relE = 1; + } + + /* SC-VBR - correction of voicing threshold for NB inputs (important only in noisy conditions) */ + if ( st->input_bwidth == NB && vadnoise < 20.0f ) + { + mean_voi3_offset = 0.05f; + } + } + + /* make decision whether frame is unvoiced */ + coder_type = GENERIC; + if ( st->input_bwidth == NB ) + { + if ( ( ( mean_voi3 + corr_shift < 0.68f + mean_voi3_offset ) && /* normalized correlation low */ + ( ( st->voicing[2] + corr_shift ) < 0.79f ) && /* normalized correlation low on look-ahead - onset detection */ + ( ee[0] < 10.0f ) && ( hp_E[0] > (float) E_MIN ) && /* energy concentrated in high frequencies provided that some energy is present in HF... */ + ( ee[1] < ee1_th ) && ( hp_E[1] > (float) E_MIN ) && /* ... biased towards look-ahead to detect onsets. The cast to (float) is needed for Linux i686 (gcc version 4.7.2), otherwise the criterion hp_E[0] > E_MIN holds true if E_MIN was assigned to hp_E[] before */ + ( tmp_offset_flag == 0 ) && /* take care of voiced offsets */ + ( dE1 <= 29.0f ) && /* avoid on sharp energy spikes */ + ( st->old_dE1 <= 29.0f ) && /* + one frame hysteresis */ + ( st->spike_hyst < 0 ) ) || /* avoid after sharp energy spikes followed by decay (e.g. castanets) */ + flag_low_relE ) /* low relative frame energy (only for SC-VBR) */ + { + coder_type = UNVOICED; + } + } + else + { + if ( ( ( mean_voi3 + corr_shift < 0.695f + mean_voi3_offset ) && /* normalized correlation low */ + ( ee[0] < 6.2f ) && ( hp_E[0] > (float) E_MIN ) && /* energy concentrated in high frequencies provided that some energy is present in HF */ + ( ee[1] < 6.2f ) && ( hp_E[1] > (float) E_MIN ) && /* ... biased towards look-ahead to detect onsets. The cast to (float) is needed for Linux i686 (gcc version 4.7.2), otherwise the criterion hp_E[0] > E_MIN holds true if E_MIN was assigned to hp_E[] before */ + ( tmp_offset_flag == 0 ) && /* take care of voiced offsets */ + ( dE1 <= 30.0f ) && /* avoid on sharp energy spikes */ + ( st->old_dE1 <= 30.0f ) && /* + one frame hysteresis */ + ( st->spike_hyst < 0 ) ) || /* avoid after sharp energy spikes followed by decay (e.g. castanets) */ + ( flag_low_relE && st->old_dE1 <= 30.0f ) ) /* low relative frame energy (only for SC-VBR) */ + { + coder_type = UNVOICED; + } + } + + /*-----------------------------------------------------------------* + * Decision about VC + *-----------------------------------------------------------------*/ + + if ( st->Opt_SC_VBR ) + { + st->hSC_VBR->set_ppp_generic = 0; + } + + if ( st->localVAD == 1 && coder_type == GENERIC && last_core_orig != AMR_WB_CORE ) + { + if ( ( voicing_fr[0] > 0.605f ) && /* normalized correlation high in 1st sf. */ + ( voicing_fr[1] > 0.605f ) && /* normalized correlation high in 2st sf. */ + ( voicing_fr[2] > 0.605f ) && /* normalized correlation high in 3st sf. */ + ( voicing_fr[3] > 0.605f ) && /* normalized correlation high in 4st sf. */ + ( mean_ee > 4.0f ) && /* energy concentrated in low frequencies */ + ( fabs( pitch_fr[1] - pitch_fr[0] ) < 3.0f ) && /* small OL pitch difference in 1st sf. */ + ( fabs( pitch_fr[2] - pitch_fr[1] ) < 3.0f ) && /* small OL pitch difference in 2nd sf. */ + ( fabs( pitch_fr[3] - pitch_fr[2] ) < 3.0f ) ) /* small OL pitch difference in 3rd sf. */ + { + coder_type = VOICED; + } + else if ( st->Opt_SC_VBR && st->input_bwidth == NB && vadnoise < 20 ) + { + if ( ( voicing_fr[0] > 0.25f ) && /* normalized correlation high in 1st sf. */ + ( voicing_fr[1] > 0.25f ) && /* normalized correlation high in 2st sf. */ + ( voicing_fr[2] > 0.25f ) && /* normalized correlation high in 3st sf. */ + ( voicing_fr[3] > 0.25f ) && /* normalized correlation high in 4st sf. */ + ( mean_ee > 1.0f ) && /* energy concentrated in low frequencies (used 1.0 for WB) */ + ( fabs( pitch_fr[1] - pitch_fr[0] ) < 5.0f ) && /* small OL pitch difference in 1st sf. */ + ( fabs( pitch_fr[2] - pitch_fr[1] ) < 5.0f ) && /* small OL pitch difference in 2nd sf. */ + ( fabs( pitch_fr[3] - pitch_fr[2] ) < 5.0f ) ) /* small OL pitch difference in 3rd sf. */ + { + st->hSC_VBR->set_ppp_generic = 1; + coder_type = VOICED; + } + } + + /* set VOICED mode for frames with very stable pitch and high correlation + and avoid to switch to AUDIO/MUSIC later */ + voicing_m = mean( voicing_fr, NB_SUBFR ); + + dpit1 = (float) fabs( pitch_fr[0] - pitch_fr[1] ); + dpit2 = (float) fabs( pitch_fr[1] - pitch_fr[2] ); + dpit3 = (float) fabs( pitch_fr[2] - pitch_fr[3] ); + + if ( *flag_spitch || ( dpit1 <= 3.0f && dpit2 <= 3.0f && dpit3 <= 3.0f && + voicing_m > 0.95f && st->voicing_sm > 0.97f ) ) + { + coder_type = VOICED; + *flag_spitch = 1; /*to avoid switch to AUDIO/MUSIC later*/ + } + } + + /*-----------------------------------------------------------------* + * Channel-aware mode - set RF mode and total bitrate + *-----------------------------------------------------------------*/ + + st->rf_mode = st->Opt_RF_ON; + + if ( coder_type == GENERIC ) + { + if ( ( voicing_fr[0] < VOI_THRLD ) && /* normalized correlation high in 1st sf. */ + ( voicing_fr[1] < VOI_THRLD ) && /* normalized correlation high in 2st sf. */ + ( voicing_fr[2] < VOI_THRLD ) && /* normalized correlation high in 3st sf. */ + ( voicing_fr[3] < VOI_THRLD ) && /* normalized correlation high in 4st sf. */ + ( vadnoise > 25.0f ) ) /* when speech is clean */ + { + st->rf_mode = 0; + + /* Current frame cannot be compressed to pack the partial redundancy */ + if ( st->rf_mode != st->Opt_RF_ON ) + { + core_coder_mode_switch( st, st->last_total_brate, 0 ); + } + } + } + + /*-----------------------------------------------------------------* + * UNCLR classifier + *-----------------------------------------------------------------*/ + + if ( hStereoClassif != NULL ) + { + if ( st->element_mode > EVS_MONO && ( coder_type == GENERIC || coder_type == UNVOICED || coder_type == INACTIVE || st->localVAD == 0 ) && hStereoClassif->unclr_sw_enable_cnt[st->idchan] < MAX_UV_CNT ) + { + hStereoClassif->unclr_sw_enable_cnt[st->idchan]++; + } + else + { + hStereoClassif->unclr_sw_enable_cnt[st->idchan] = 0; + } + } + + /*-----------------------------------------------------------------* + * Updates + *-----------------------------------------------------------------*/ + + /* update spike hysteresis parameters */ + if ( st->spike_hyst >= 0 && st->spike_hyst < 2 ) + { + st->spike_hyst++; + } + + /* reset spike hysteresis */ + if ( ( st->spike_hyst > 1 ) && + ( dE3 > 5.0f || /* energy increases */ + ( relE > -13.0f && ( mean_voi3 + corr_shift > 0.695f ) ) ) ) /* normalized correlation is high */ + { + st->spike_hyst = -1; + } + + /* update tilt parameters */ + st->ee_old = ee[1]; + st->old_dE1 = dE1; + + /* save the raw coder_type for various modules later in the codec (the reason is that e.g. UNVOICED is not used (rewritten) at higher rates) */ + st->coder_type_raw = coder_type; + + return coder_type; +} diff --git a/lib_enc/find_wsp.c b/lib_enc/find_wsp.c new file mode 100644 index 0000000000000000000000000000000000000000..4837411a5582862d163abc568487f10b2e7f5f89 --- /dev/null +++ b/lib_enc/find_wsp.c @@ -0,0 +1,95 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * find_wsp() + * + * Compute weighted speech used in open-loop pitch search + *-------------------------------------------------------------------*/ + +void find_wsp( + const int16_t L_frame, /* i : length of the frame */ + const int16_t L_subfr, /* i : length of subframe */ + const int16_t nb_subfr, /* i : number of subframes */ + const float *A, /* i : A(z) filter coefficients */ + float *Aw, /* o : weighted A(z) filter coefficients */ + const float *speech, /* i : pointer to the denoised speech frame */ + const float tilt_fact, /* i : tilt factor */ + float *wsp, /* o : poitnter to the weighted speech frame */ + float *mem_wsp, /* i/o: W(Z) denominator memory */ + const float gamma, /* i : weighting factor */ + const int16_t L_look /* i : look-ahead */ +) +{ + float *p_Aw, tmp; + int16_t i_subfr; + + + /*-----------------------------------------------------------------* + * Compute weighted A(z) unquantized for subframes + *-----------------------------------------------------------------*/ + + weight_a_subfr( nb_subfr, A, Aw, gamma, M ); + + /*-----------------------------------------------------------------* + * Compute weighted speech for all subframes + *-----------------------------------------------------------------*/ + + p_Aw = Aw; + for ( i_subfr = 0; i_subfr < L_frame; i_subfr += L_subfr ) + { + residu( p_Aw, M, &speech[i_subfr], &wsp[i_subfr], L_subfr ); + p_Aw += ( M + 1 ); + } + p_Aw -= ( M + 1 ); + + /*-----------------------------------------------------------------* + * Weighted speech computation is extended on look-ahead + *-----------------------------------------------------------------*/ + + deemph( wsp, tilt_fact, L_frame, mem_wsp ); + residu( p_Aw, M, &speech[L_frame], &wsp[L_frame], L_look ); + tmp = *mem_wsp; + deemph( &wsp[L_frame], tilt_fact, L_look, &tmp ); + + return; +} diff --git a/lib_enc/frame_spec_dif_cor_rate.c b/lib_enc/frame_spec_dif_cor_rate.c new file mode 100644 index 0000000000000000000000000000000000000000..b0ececfb38628c38ab0835e13a7ef35866ce14f7 --- /dev/null +++ b/lib_enc/frame_spec_dif_cor_rate.c @@ -0,0 +1,96 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * frame_spec_dif_cor_rate() + * + * + *-------------------------------------------------------------------*/ + +void frame_spec_dif_cor_rate( + float spec_amp[], /* i : spectral amplitude */ + float pre_spec_low_dif[], /* i/o: low spectrum different */ + float f_tonality_rate[] /* o : tonality rate */ +) +{ + int16_t i; + float spec_low_dif[59]; + float tmp, spec_low_dif_cor_rate, spec_dif_cor_rate; + float m, dx, dy; + + + for ( i = 0; i < PRE_SPEC_DIF_NUM; i++ ) + { + tmp = spec_amp[i + 6] - spec_amp[i + 5]; + if ( tmp < 0 ) + { + spec_low_dif[i] = 0; + } + else + { + spec_low_dif[i] = tmp; + } + } + m = 0; + dx = 0; + dy = 0; + for ( i = 0; i < PRE_SPEC_DIF_NUM; i++ ) + { + m += spec_low_dif[i] * pre_spec_low_dif[i]; + dx += spec_low_dif[i] * spec_low_dif[i]; + dy += pre_spec_low_dif[i] * pre_spec_low_dif[i]; + } + + /* 1073741.824 = 0.001 * 32768 * 32768 */ + spec_low_dif_cor_rate = (float) ( m / sqrt( ( dx * dy + 1073741.824f ) ) ); + spec_dif_cor_rate = spec_low_dif_cor_rate; + f_tonality_rate[0] = spec_dif_cor_rate; + f_tonality_rate[1] = f_tonality_rate[1] * 0.96f + spec_dif_cor_rate * 0.04f; + f_tonality_rate[2] = f_tonality_rate[2] * 0.90f + spec_dif_cor_rate * 0.1f; + + for ( i = 0; i < PRE_SPEC_DIF_NUM; i++ ) + { + pre_spec_low_dif[i] = spec_low_dif[i]; + } + + return; +} diff --git a/lib_enc/gain_enc.c b/lib_enc/gain_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..6ee7c72283fbe86d8f1ab8d34681f12d7fd07aaa --- /dev/null +++ b/lib_enc/gain_enc.c @@ -0,0 +1,1045 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * Local constants + *-------------------------------------------------------------------*/ + +#define RANGE 64 + +/*---------------------------------------------------------------------* + * Es_pred_enc() + * + * Calculation and quantization of average predicted innovation energy to be + *---------------------------------------------------------------------*/ + +void Es_pred_enc( + float *Es_pred, /* o : predicited scaled innovation energy */ + int16_t *Es_pred_indice, /* o : indice corresponding to above parameter */ + const int16_t L_frame, /* i : length of the frame */ + const int16_t L_subfr, /* i : length of the subframe */ + const float *res, /* i : residual signal */ + const float *voicing, /* i : normalized correlation in three 1/2frames */ + const int16_t nb_bits, /* i : allocated number of bits */ + const int16_t no_ltp /* i : no_ltp flag */ +) +{ + int16_t i, i_subfr, size; + float tmp, dist, mean_ener_code, ener; + float weight; + const float *qua_table; + + /*----------------------------------------------------------* + * calculate the average residual signal energy + *----------------------------------------------------------*/ + if ( L_frame == L_FRAME ) + { + weight = 0.25f; + } + else /* L_frame == L_FRAME16k */ + { + weight = 0.2f; + } + + mean_ener_code = 0.0f; + for ( i_subfr = 0; i_subfr < L_frame; i_subfr += L_subfr ) + { + /* calculate the energy of residual signal */ + ener = sum2_f( &res[i_subfr], L_subfr ) + 0.01f; + ener = 10 * (float) log10( ener / ( (float) L_subfr ) ); + if ( ( ener < 0 ) && !( no_ltp ) ) + { + ener = 0; + } + + /* update the average energy of residual signal */ + mean_ener_code += weight * ener; + } + + if ( !no_ltp ) + { + /*----------------------------------------------------------* + * subtract an estimate of adaptive codebook contribution + *----------------------------------------------------------*/ + + mean_ener_code -= 10.0f * ( 0.5f * voicing[0] + 0.5f * voicing[1] ); + + /*----------------------------------------------------------* + * quantize the average predicted innovation energy + *----------------------------------------------------------*/ + switch ( nb_bits ) + { + case 5: + { + qua_table = Es_pred_qua_5b; + break; + } + case 4: + { + qua_table = Es_pred_qua_4b; + break; + } + case 3: + { + qua_table = Es_pred_qua_3b; + break; + } + default: + { + qua_table = Es_pred_qua_5b; + break; + } + } + } + else + { + qua_table = Es_pred_qua_4b_no_ltp; + } + + /* select codebook, size and number of bits */ + size = 1 << nb_bits; + + /* find the nearest neighbour (codevector) */ + tmp = 1e30f; + *Es_pred_indice = 0; + for ( i = 0; i < size; i++ ) + { + dist = (float) fabs( mean_ener_code - qua_table[i] ); + if ( dist < tmp ) + { + tmp = dist; + *Es_pred = qua_table[i]; + *Es_pred_indice = i; + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * gain_enc_amr_wb() + * + * Quantization of pitch and codebook gains (used also in AMR-WB IO mode) + * MA prediction is performed on the innovation energy (in dB with mean removed). + * An initial predicted gain, gcode0, is first determined and the correction + * factor alpha = g_code / gcode0 is quantized. + * The pitch gain and the correction factor are vector quantized and the + * mean-squared weighted error criterion is used in the quantizer search. + *-------------------------------------------------------------------*/ + +void gain_enc_amr_wb( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const float *xn, /* i : target vector */ + const float *y1, /* i : zero-memory filtered adaptive excitation */ + const float *y2, /* i : zero-memory filtered algebraic codebook excitation */ + const float *code, /* i : algebraic excitation */ + const int32_t core_brate, /* i : core bitrate */ + float *gain_pit, /* i/o: pitch gain / Quantized pitch gain */ + float *gain_code, /* o : quantized codebook gain */ + float *gain_inov, /* o : gain of the innovation (used for normalization) */ + float *norm_gain_code, /* o : norm. gain of the codebook excitation */ + float *g_corr, /* i/o: correlations , -2,, -2 and 2 */ + const int16_t clip_gain, /* i : gain pitch clipping flag (1 = clipping) */ + float *past_qua_en /* i/o: gain quantization memory (4 words) */ +) +{ + int16_t index, i, j, min_ind, size, nBits; + float dist, dist_min, g_pitch, g_code, qua_en, gcode0; + const float *p, *t_qua_gain; + + /*-----------------------------------------------------------------* + * gain computation correlations + * find raw innovation energy + *-----------------------------------------------------------------*/ + + E_corr_xy2( xn, y1, y2, g_corr, L_SUBFR ); + g_corr[2] += 0.01F; + g_corr[3] -= 0.02F; + g_corr[4] += 0.02F; + *gain_inov = 1.0f / (float) sqrt( ( dotp( code, code, L_SUBFR ) + 0.01f ) / L_SUBFR ); + + /*-----------------------------------------------------------------* + * find the initial quantization pitch index + * set gains search range + *-----------------------------------------------------------------*/ + + if ( core_brate < ACELP_12k65 ) + { + t_qua_gain = t_qua_gain6b; + nBits = 6; + min_ind = 0; + size = RANGE; + if ( clip_gain == 1 ) + { + size -= 16; /* limit pitch gain to 1.0 */ + } + } + else + { + t_qua_gain = t_qua_gain7b; + nBits = 7; + p = t_qua_gain7b + RANGE; /* pt at 1/4th of table */ + j = NB_QUA_GAIN7B - RANGE; + if ( clip_gain == 1 ) + { + j -= 27; /* limit pitch gain to 1.0 */ + } + + min_ind = 0; + g_pitch = *gain_pit; + + + for ( i = 0; i < j; i++, p += 2 ) + { + if ( g_pitch > *p ) + { + min_ind++; + } + } + size = RANGE; + } + + /*-----------------------------------------------------------------* + * predicted code gain + *-----------------------------------------------------------------*/ + + /* start with predicting code energy in dB */ + gcode0 = MEAN_ENER; + for ( i = 0; i < GAIN_PRED_ORDER; i++ ) + { + gcode0 += pred_gain[i] * past_qua_en[i]; + } + gcode0 += (float) ( 20.0 * log10( *gain_inov ) ); + + /* convert from energy in dB to gain */ + gcode0 = (float) pow( 10.0, gcode0 / 20.0 ); + + /*-----------------------------------------------------------------* + * search the codebook + *-----------------------------------------------------------------*/ + + dist_min = 3.402823466e+38F; + p = t_qua_gain + min_ind * 2; + + index = 0; + for ( i = 0; i < size; i++ ) + { + g_pitch = *p++; /* pitch gain */ + g_code = gcode0 * *p++; /* code gain */ + dist = g_pitch * g_pitch * g_corr[0] + g_pitch * g_corr[1] + g_code * g_code * g_corr[2] + g_code * g_corr[3] + g_pitch * g_code * g_corr[4]; + if ( dist < dist_min ) + { + dist_min = dist; + index = i; + } + } + index = index + min_ind; + *gain_pit = t_qua_gain[index * 2]; + qua_en = t_qua_gain[index * 2 + 1]; + *gain_code = qua_en * gcode0; + + /*-----------------------------------------------------------------* + * update table of past quantized energies + *-----------------------------------------------------------------*/ + + for ( i = GAIN_PRED_ORDER - 1; i > 0; i-- ) + { + past_qua_en[i] = past_qua_en[i - 1]; + } + past_qua_en[0] = (float) ( 20.0 * log10( qua_en ) ); + + push_indice( hBstr, IND_GAIN, index, nBits ); + + *norm_gain_code = *gain_code / *gain_inov; + + return; +} + +/*---------------------------------------------------------------------* + * gain_enc_mless() + * + * Quantization of pitch and codebook gains without prediction (memory-less) + * - an initial predicted gain, gcode0, is first determined based on + * the predicted average innovation energy + * - a correction factor gamma = g_code / gcode0 is then vector quantized along with gain_pit + * - the mean-squared weighted error criterion is used for codebook search + *---------------------------------------------------------------------*/ + +void gain_enc_mless( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const int16_t gains_mode[], /* i : gain bits */ + const int16_t element_mode, /* i : element mode */ + const int16_t L_frame, /* i : length of the frame */ + const int16_t i_subfr, /* i : subframe index */ + const int16_t tc_subfr, /* i : TC subframe index */ + const float *xn, /* i : target vector */ + const float *y1, /* i : zero-memory filtered adaptive excitation */ + const float *y2, /* i : zero-memory filtered algebraic codebook excitation */ + const float *code, /* i : algebraic excitation */ + const float Es_pred, /* i : predicted scaled innovation energy */ + float *gain_pit, /* o : quantized pitch gain */ + float *gain_code, /* o : quantized codebook gain */ + float *gain_inov, /* o : gain of the innovation (used for normalization) */ + float *norm_gain_code, /* o : norm. gain of the codebook excitation */ + float *g_corr, /* i/o: correlations , -2,, -2 and 2 */ + const int16_t clip_gain /* i : gain pitch clipping flag (1 = clipping) */ +) +{ + int16_t index, i, size, nBits; + float dist, dist_min, g_pitch, g_code, gcode0, Ei, Ecode; + int16_t nBits2; + float tmp1, tmp2; + const float *p, *qua_table; + + /*-----------------------------------------------------------------* + * calculate the rest of the correlation coefficients + * c2 = , c3 = -2, c4 = 2 + *-----------------------------------------------------------------*/ + + E_corr_xy2( xn, y1, y2, g_corr, L_SUBFR ); + g_corr[2] += 0.01F; + g_corr[3] -= 0.02F; + g_corr[4] += 0.02F; + + /*-----------------------------------------------------------------* + * calculate the unscaled innovation energy + * calculate the predicted gain code + *-----------------------------------------------------------------*/ + + Ecode = ( dotp( code, code, L_SUBFR ) + 0.01f ) / L_SUBFR; + *gain_inov = 1.0f / (float) sqrt( Ecode ); + Ei = 10 * (float) log10( Ecode ); + gcode0 = (float) pow( 10, 0.05 * ( Es_pred - Ei ) ); + + /*-----------------------------------------------------------------* + * select the codebook, size and number of bits + * set the gains searching range + *-----------------------------------------------------------------*/ + + nBits = gains_mode[i_subfr / L_SUBFR]; + + if ( ( tc_subfr == 3 * L_SUBFR && i_subfr == 3 * L_SUBFR && L_frame == L_FRAME ) || + ( tc_subfr == 4 * L_SUBFR && i_subfr == 4 * L_SUBFR && L_frame == L_FRAME16k ) ) + { + /* in case of attack at the end of the frame, use scalar gain quantizers */ + tmp1 = ( g_corr[0] * g_corr[2] ) - ( 0.25f * g_corr[4] * g_corr[4] ); + tmp2 = -0.5f * g_corr[1] / tmp1; + tmp1 = -0.5f * g_corr[3] / tmp1; + + *gain_pit = ( g_corr[2] * tmp2 ) - ( 0.5f * g_corr[4] * tmp1 ); + *gain_code = ( g_corr[0] * tmp1 ) - ( 0.5f * g_corr[4] * tmp2 ); + + *gain_pit = max( G_PITCH_MIN_TC192, min( *gain_pit, G_PITCH_MAX_TC192 ) ); + + /* set number of bits for two SQs */ + nBits2 = ( nBits + 1 ) >> 1; + nBits = nBits >> 1; + + /* gain_pit Q */ + tmp1 = ( G_PITCH_MAX_TC192 - G_PITCH_MIN_TC192 ) / ( ( 1 << nBits ) - 1 ); /* set quantization step */ + index = usquant( *gain_pit, gain_pit, G_PITCH_MIN_TC192, tmp1, ( 1 << nBits ) ); + push_indice( hBstr, IND_GAIN_PIT, index, nBits ); + + /* gain_code Q */ + *gain_code /= gcode0; + index = gain_quant( gain_code, G_CODE_MIN_TC192, G_CODE_MAX_TC192, nBits2 ); + push_indice( hBstr, IND_GAIN_CODE, index, nBits2 ); + *gain_code *= gcode0; + } + else + { + size = 1 << nBits; + + switch ( nBits ) + { + case 7: + { + qua_table = gain_qua_mless_7b; + if ( clip_gain == 1 ) + { + size -= 30; + } + break; + } + case 6: + { + qua_table = gain_qua_mless_6b; + + if ( element_mode > EVS_MONO ) + { + qua_table = gain_qua_mless_6b_stereo; + } + + if ( clip_gain == 1 ) + { + size -= 14; + } + break; + } + case 5: + { + qua_table = gain_qua_mless_5b; + if ( clip_gain == 1 ) + { + size -= 6; + } + break; + } + default: + { + qua_table = gain_qua_mless_6b; + size = 64; + if ( clip_gain == 1 ) + { + size -= 14; + } + break; + } + } + + /* in case of AVQ inactive, limit the gain_pit to 0.65 */ + if ( clip_gain == 2 && nBits == 6 ) + { + size -= 36; + nBits--; + } + + /*-----------------------------------------------------------------* + * search for the best quantizer + *-----------------------------------------------------------------*/ + + p = qua_table; + dist_min = 3.402823466e+38F; + index = 0; + for ( i = 0; i < size; i++ ) + { + g_pitch = *p++; /* pitch gain */ + g_code = gcode0 * *p++; /* code gain */ + dist = g_pitch * g_pitch * g_corr[0] + g_pitch * g_corr[1] + g_code * g_code * g_corr[2] + g_code * g_corr[3] + g_pitch * g_code * g_corr[4]; + if ( dist < dist_min ) + { + dist_min = dist; + index = i; + } + } + *gain_pit = qua_table[index * 2]; + *gain_code = qua_table[index * 2 + 1] * gcode0; + + push_indice( hBstr, IND_GAIN, index, nBits ); + } + + *norm_gain_code = *gain_code / *gain_inov; + + return; +} + + +/*---------------------------------------------------------------------* + * gain_enc_SQ() + * + * Scalar Quantization of pitch and codebook gains without prediction + * - an initial predicted gain, gcode0, is first determined based on + * the predicted scaled innovation energy + * - a correction factor gamma = g_code / gcode0 is then vector quantized + * along with gain_pit + * - the mean-squared weighted error criterion is used for codebook search + *---------------------------------------------------------------------*/ + +void gain_enc_SQ( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const int16_t gains_mode[], /* i : gain bits */ + const int16_t i_subfr, /* i : subframe index */ + const float *xn, /* i : target vector */ + const float *yy1, /* i : zero-memory filtered adaptive excitation */ + const float *y2, /* i : zero-memory filtered algebraic codebook excitation */ + const float *code, /* i : algebraic excitation */ + const float Es_pred, /* i : predicted scaled innovation energy */ + float *gain_pit, /* o : quantized pitch gain */ + float *gain_code, /* o : quantized codebook gain */ + float *gain_inov, /* o : gain of the innovation (used for normalization) */ + float *norm_gain_code, /* o : norm. gain of the codebook excitation */ + float *g_corr, /* i/o: correlations , -2,, -2 and 2 */ + const int16_t clip_gain /* i : gain pitch clipping flag (1 = clipping) */ +) +{ + int16_t index, nBits_pitch, nBits_code; + float g_code, gcode0, Ei, Ecode, tmp1, tmp2; + int16_t tmp16; + /*-----------------------------------------------------------------* + * calculate the rest of the correlation coefficients + * c2 = , c3 = -2, c4 = 2 + *-----------------------------------------------------------------*/ + + g_corr[1] *= -0.5; + g_corr[2] = dotp( y2, y2, L_SUBFR ) + 0.01f; + g_corr[3] = dotp( xn, y2, L_SUBFR ) - 0.02f; + g_corr[4] = dotp( yy1, y2, L_SUBFR ) + 0.02f; + + /*-----------------------------------------------------------------* + * calculate the unscaled innovation energy + * calculate the predicted gain code + * calculate optimal gains + *-----------------------------------------------------------------*/ + + Ecode = ( dotp( code, code, L_SUBFR ) + 0.01f ) / L_SUBFR; + *gain_inov = 1.0f / (float) sqrt( Ecode ); + Ei = 10 * (float) log10( Ecode ); + gcode0 = (float) pow( 10, 0.05 * ( Es_pred - Ei ) ); + + tmp1 = ( g_corr[0] * g_corr[2] ) - ( g_corr[4] * g_corr[4] ); + tmp2 = g_corr[1] / tmp1; + tmp1 = g_corr[3] / tmp1; + + *gain_pit = ( g_corr[2] * tmp2 ) - ( g_corr[4] * tmp1 ); + *gain_code = ( g_corr[0] * tmp1 ) - ( g_corr[4] * tmp2 ); + + *gain_pit = max( G_PITCH_MIN, min( *gain_pit, G_PITCH_MAX ) ); + + /*-----------------------------------------------------------------* + * limit the pitch gain searching range (if indicated by clip_gain) + *-----------------------------------------------------------------*/ + + if ( clip_gain == 1 && *gain_pit > 0.95f ) + { + *gain_pit = 0.95f; + } + else if ( clip_gain == 2 && *gain_pit > 0.65f ) + { + *gain_pit = 0.65f; + } + + /*-----------------------------------------------------------------* + * search for the best quantized values + *-----------------------------------------------------------------*/ + + nBits_pitch = gains_mode[i_subfr / L_SUBFR]; + nBits_code = ( nBits_pitch + 1 ) >> 1; + nBits_pitch = nBits_pitch >> 1; + + tmp16 = div_s( 1, ( ( 1 << ( nBits_pitch ) ) - 1 ) ); /* Q15*/ + tmp1 = (float) mult_r( (int16_t) ( G_PITCH_MAX * 8192.0f + 0.5f ), tmp16 ) / 8192.0f; + index = usquant( *gain_pit, gain_pit, G_PITCH_MIN, tmp1, ( 1 << nBits_pitch ) ); + push_indice( hBstr, IND_GAIN_PIT, index, nBits_pitch ); + + g_code = *gain_code / gcode0; + index = gain_quant( &g_code, G_CODE_MIN, G_CODE_MAX, nBits_code ); + *gain_code = g_code * gcode0; + push_indice( hBstr, IND_GAIN_CODE, index, nBits_code ); + + *norm_gain_code = *gain_code / *gain_inov; + + return; +} + +/*-------------------------------------------------------------------* + * gain_enc_gaus() + * + * Quantization of gain for Gaussian codebook + *-------------------------------------------------------------------*/ + +/*! r: Return index of quantization */ +int16_t gain_enc_gaus( + float *gain, /* i/o: Code gain to quantize */ + const int16_t bits, /* i : number of bits to quantize */ + const float lowBound, /* i : lower bound of quantizer (dB) */ + const float topBound /* i : upper bound of quantizer (dB) */ +) +{ + int16_t index; + float enr, stepSize; + + enr = (float) ( 20.0 * log10( *gain + 0.001f ) ); /* codebook gain in dB */ + + /*-----------------------------------------------------------------* + * quantize linearly the log E + *-----------------------------------------------------------------*/ + + stepSize = ( topBound - lowBound ) / ( (float) ( 1 << bits ) ); + index = (int16_t) ( ( ( enr - lowBound ) / stepSize ) + 0.5f ); + if ( index >= ( 1 << bits ) ) + { + index = ( 1 << bits ) - 1; + } + + if ( index < 0 ) + { + index = 0; + } + + enr = (float) index * stepSize + lowBound; /* quantized codebook gain in dB */ + *gain = (float) pow( 10.0f, enr / 20.0f ); /* quantized codebook gain */ + + return index; +} + +/*-----------------------------------------------------------------* + * gain_enc_tc() + * + * Search and quantization of gain_code for subframes (in the + * beginning of frame) without pulses in TC - 3b coding. + * In this case: + * - gain_pit = 0 + * - gain_code - scalar quantization (no prediciton history used) + *-----------------------------------------------------------------*/ + +void gain_enc_tc( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const int16_t gains_mode[], /* i : gain bits */ + const int16_t i_subfr, /* i : subframe index */ + const float xn[], /* i : target vector */ + const float y2[], /* i : zero-memory filtered algebraic codebook excitation */ + const float code[], /* i : algebraic excitation */ + const float Es_pred, /* i : predicted scaled innovation energy */ + float *gain_pit, /* o : Pitch gain / Quantized pitch gain */ + float *gain_code, /* o : quantized codebook gain */ + float *gain_inov, /* o : innovation gain */ + float *norm_gain_code /* o : norm. gain of the codebook excitation */ +) +{ + int16_t i, index, nBits; + float Ei, g_code, gcode0, Ecode; + + /*----------------------------------------------------------------* + * get number of bits for gain quantization + *----------------------------------------------------------------*/ + + nBits = gains_mode[i_subfr / L_SUBFR]; + + /*----------------------------------------------------------------* + * find the code pitch (for current subframe) + *----------------------------------------------------------------*/ + + *gain_code = dotp( xn, y2, L_SUBFR ) / ( dotp( y2, y2, L_SUBFR ) + 0.01f ); + + /*----------------------------------------------------------------* + * calculate the predicted gain code + * decode codebook gain + *----------------------------------------------------------------*/ + + *gain_pit = 0; + + Ecode = ( dotp( code, code, L_SUBFR ) + 0.01f ) / L_SUBFR; + *gain_inov = 1.0f / (float) sqrt( Ecode ); + Ei = 10 * (float) log10( Ecode ); + gcode0 = (float) pow( 10, 0.05 * ( Es_pred - Ei ) ); + + if ( nBits > 3 ) + { + g_code = *gain_code / gcode0; + index = gain_quant( &g_code, G_CODE_MIN, G_CODE_MAX, nBits ); + *gain_code = g_code * gcode0; + push_indice( hBstr, IND_GAIN_CODE, index, nBits ); + } + else + { + index = N_GAIN_CODE_TC - 1; + for ( i = 0; i < N_GAIN_CODE_TC - 1; i++ ) + { + if ( *gain_code < ( ( tbl_gain_code_tc[i] + ( tbl_gain_code_tc[i + 1] - tbl_gain_code_tc[i] ) / 2 ) * gcode0 ) ) + { + index = i; + break; + } + } + + /*----------------------------------------------------------------* + * 3-bit -> 2-bit encoding + *----------------------------------------------------------------*/ + + if ( nBits == 2 ) + { + index /= 2; + *gain_code = tbl_gain_code_tc[index * 2] * gcode0; + push_indice( hBstr, IND_GAIN_CODE, index, nBits ); + } + else + { + *gain_code = tbl_gain_code_tc[index] * gcode0; + push_indice( hBstr, IND_GAIN_CODE, index, nBits ); + } + } + + *norm_gain_code = *gain_code / *gain_inov; + + return; +} + +/*---------------------------------------------------------------------* + * E_corr_xy2() + * + * Find the correlations between the target xn[], the filtered adaptive + * codebook exc. y1[], and the filtered fixed codebook innovation y2[]. + * ( , -2 and 2 ) (stored in g_corr[2..4]) + *---------------------------------------------------------------------*/ + +void E_corr_xy2( + const float xn[], /* i : target vector */ + const float y1[], /* i : filtered excitation components 1 */ + const float y2[], /* i : filtered excitation components 2 */ + float g_corr[], /* o : correlations between x, y1, y2, y3, y4 */ + const int16_t L_subfr /* i : subframe size */ +) +{ + g_corr[2] = dotp( y2, y2, L_subfr ); + g_corr[3] = -2.0f * dotp( xn, y2, L_subfr ); + g_corr[4] = 2.0f * dotp( y1, y2, L_subfr ); + + return; +} + + +/*---------------------------------------------------------------------* + * gain_enc_lbr() + * + * Quantization of pitch and codebook gains without prediction (memory-less) + * in ACELP at 7.2 and 8.0 kbps + * - the gain codebooks and gain estimation constants are different in each subframe + * - the estimated gain, gcode0, is first determined based on + * classification and/or previous quantized gains (from previous subframes in the current frame) + * - a correction factor gamma = g_code / gcode0 is then vector quantized + * along with gain_pit + * - the mean-squared error criterion is used for codebook search + *---------------------------------------------------------------------*/ + +void gain_enc_lbr( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const int16_t gains_mode[], /* i : gain bits */ + const int16_t coder_type, /* i : coding type */ + const int16_t i_subfr, /* i : subframe index */ + const float *xn, /* i : target vector */ + const float *y1, /* i : zero-memory filtered adaptive excitation */ + const float *y2, /* i : zero-memory filtered algebraic codebook excitation */ + const float *code, /* i : algebraic excitation */ + float *gain_pit, /* o : quantized pitch gain */ + float *gain_code, /* o : quantized codebook gain */ + float *gain_inov, /* o : gain of the innovation (used for normalization) */ + float *norm_gain_code, /* o : norm. gain of the codebook excitation */ + float *g_corr, /* i/o: correlations , -2,, -2 and 2 */ + float gains_mem[], /* i/o: pitch gain and code gain from previous subframes */ + const int16_t clip_gain, /* i : gain pitch clipping flag (1 = clipping) */ + const int16_t L_subfr /* i : subframe length */ +) +{ + int16_t index = 0, i, size, nBits, n_pred, ctype; + float dist, dist_min, g_pitch, g_code, gcode0, aux[10], Ecode; + int16_t rf_flag = 0; + const float *p, *b, *cdbk = 0; + + /*-----------------------------------------------------------------* + * calculate the rest of the correlation coefficients + * c2 = , c3 = -2, c4 = 2, c5* = + * c5* - not necessary to calculate + *-----------------------------------------------------------------*/ + + E_corr_xy2( xn, y1, y2, g_corr, L_subfr ); + g_corr[2] += 0.01F; + g_corr[3] -= 0.02F; + g_corr[4] += 0.02F; + + Ecode = ( dotp( code, code, L_subfr ) + 0.01f ) / L_subfr; + *gain_inov = 1.0f / (float) sqrt( Ecode ); + + /*-----------------------------------------------------------------* + * select the codebook, size and number of bits + * set the gains searching range + *-----------------------------------------------------------------*/ + + nBits = gains_mode[i_subfr / L_subfr]; + size = 1 << nBits; + + /*-----------------------------------------------------------------* + * calculate prediction of gcode + * search for the best codeword + *-----------------------------------------------------------------*/ + + ctype = 2 * ( coder_type - 1 ); + if ( i_subfr == 0 ) + { + b = b_1sfr; + n_pred = 2; + + switch ( nBits ) + { + case 8: + { + cdbk = gp_gamma_1sfr_8b; + if ( clip_gain == 1 ) + { + size -= 60; + } + break; + } + case 7: + { + cdbk = gp_gamma_1sfr_7b; + if ( clip_gain == 1 ) + { + size -= 27; + } + break; + } + case 6: + { + cdbk = gp_gamma_1sfr_6b; + if ( clip_gain == 1 ) + { + size -= 10; + } + break; + } + } + + /* calculate predicted gain */ + aux[0] = 1.0f; + aux[1] = ctype; + gcode0 = (float) pow( 10, dotp( b, aux, n_pred ) - 0.5f * (float) log10( Ecode ) ); + + /* searching of codebook */ + p = cdbk; + dist_min = 3.402823466e+38F; + index = 0; + for ( i = 0; i < size; i++ ) + { + g_pitch = *p++; + g_code = gcode0 * *p++; + dist = g_pitch * g_pitch * g_corr[0] + g_pitch * g_corr[1] + g_code * g_code * g_corr[2] + g_code * g_corr[3] + g_pitch * g_code * g_corr[4]; + + if ( dist < dist_min ) + { + dist_min = dist; + index = i; + } + } + + *gain_pit = cdbk[index * 2]; + *gain_code = cdbk[index * 2 + 1] * gcode0; + + gains_mem[0] = *gain_code; + gains_mem[3] = *gain_pit; + } + else if ( i_subfr == L_SUBFR || ( L_subfr == 2 * L_SUBFR ) ) + { + b = b_2sfr; + n_pred = 4; + + switch ( nBits ) + { + case 7: + { + cdbk = gp_gamma_2sfr_7b; + if ( clip_gain == 1 ) + { + size -= 30; + } + break; + } + case 6: + { + cdbk = gp_gamma_2sfr_6b; + if ( clip_gain == 1 ) + { + size -= 12; + } + break; + } + } + + /* calculate predicted gain */ + aux[0] = 1.0f; + aux[1] = ctype; + aux[2] = (float) log10( gains_mem[0] ); + aux[3] = gains_mem[3]; + gcode0 = (float) pow( 10, dotp( b, aux, n_pred ) ); + + /* searching of codebook */ + p = cdbk; + dist_min = 3.402823466e+38F; + index = 0; + for ( i = 0; i < size; i++ ) + { + g_pitch = *p++; + g_code = gcode0 * *p++; + dist = g_pitch * g_pitch * g_corr[0] + g_pitch * g_corr[1] + g_code * g_code * g_corr[2] + g_code * g_corr[3] + g_pitch * g_code * g_corr[4]; + + if ( dist < dist_min ) + { + dist_min = dist; + index = i; + } + } + *gain_pit = cdbk[index * 2]; + *gain_code = cdbk[index * 2 + 1] * gcode0; + + gains_mem[1] = *gain_code; + gains_mem[4] = *gain_pit; + } + else if ( i_subfr == 2 * L_SUBFR ) + { + if ( rf_flag == 1 ) + { + gains_mem[1] = gains_mem[0]; + gains_mem[4] = gains_mem[3]; + } + + b = b_3sfr; + n_pred = 6; + + switch ( nBits ) + { + case 7: + { + cdbk = gp_gamma_3sfr_7b; + if ( clip_gain == 1 ) + { + size -= 28; + } + break; + } + case 6: + { + cdbk = gp_gamma_3sfr_6b; + if ( clip_gain == 1 ) + { + size -= 11; + } + break; + } + } + + /* calculate predicted gain */ + aux[0] = 1.0f; + aux[1] = ctype; + aux[2] = (float) log10( gains_mem[0] ); + aux[3] = (float) log10( gains_mem[1] ); + aux[4] = gains_mem[3]; + aux[5] = gains_mem[4]; + gcode0 = (float) pow( 10, dotp( b, aux, n_pred ) ); + + /* searching of codebook */ + p = cdbk; + dist_min = 3.402823466e+38F; + index = 0; + for ( i = 0; i < size; i++ ) + { + g_pitch = *p++; + g_code = gcode0 * *p++; + dist = g_pitch * g_pitch * g_corr[0] + g_pitch * g_corr[1] + g_code * g_code * g_corr[2] + g_code * g_corr[3] + g_pitch * g_code * g_corr[4]; + + if ( dist < dist_min ) + { + dist_min = dist; + index = i; + } + } + *gain_pit = cdbk[index * 2]; + *gain_code = cdbk[index * 2 + 1] * gcode0; + + gains_mem[2] = *gain_code; + gains_mem[5] = *gain_pit; + } + else if ( i_subfr == 3 * L_SUBFR ) + { + b = b_4sfr; + n_pred = 8; + + switch ( nBits ) + { + case 7: + { + cdbk = gp_gamma_4sfr_7b; + if ( clip_gain == 1 ) + { + size -= 25; + } + break; + } + case 6: + { + cdbk = gp_gamma_4sfr_6b; + if ( clip_gain == 1 ) + { + size -= 11; + } + break; + } + } + + /* calculate predicted gain */ + aux[0] = 1.0f; + aux[1] = ctype; + aux[2] = (float) log10( gains_mem[0] ); + aux[3] = (float) log10( gains_mem[1] ); + aux[4] = (float) log10( gains_mem[2] ); + aux[5] = gains_mem[3]; + aux[6] = gains_mem[4]; + aux[7] = gains_mem[5]; + gcode0 = (float) pow( 10, dotp( b, aux, n_pred ) ); + + /* searching of codebook */ + p = cdbk; + dist_min = 3.402823466e+38F; + index = 0; + for ( i = 0; i < size; i++ ) + { + g_pitch = *p++; + g_code = gcode0 * *p++; + dist = g_pitch * g_pitch * g_corr[0] + g_pitch * g_corr[1] + g_code * g_code * g_corr[2] + g_code * g_corr[3] + g_pitch * g_code * g_corr[4]; + + if ( dist < dist_min ) + { + dist_min = dist; + index = i; + } + } + *gain_pit = cdbk[index * 2]; + *gain_code = cdbk[index * 2 + 1] * gcode0; + } + + *norm_gain_code = *gain_code / *gain_inov; + + push_indice( hBstr, IND_GAIN, index, nBits ); + + return; +} diff --git a/lib_enc/gaus_enc.c b/lib_enc/gaus_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..7f322009425d6e6096e23777f5806d92f9aee929 --- /dev/null +++ b/lib_enc/gaus_enc.c @@ -0,0 +1,460 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * Local constants + *-------------------------------------------------------------------*/ + +#define NMAX 8 /* Control of the routine's complexity */ +#define FAC_DELTA 16.0f + +/*---------------------------------------------------------------------* + * Prototypes + *---------------------------------------------------------------------*/ + +static int16_t cod_2pos( const int16_t ind1, const int16_t ind2, const float sign1, const float sign2, const int16_t n ); + +static void gauss2v( BSTR_ENC_HANDLE hBstr, const float h[], const float xn[], const float dn[], float code[], float y1[], float *gain, const int16_t lg, const int16_t nb_bits ); + +/*-------------------------------------------------------------------* + * Gaus_encode + * + * Encoder UnVoiced excitation coding using Gaussian codebooks + * - ACELP quantized Gaussian excitation + * - gain quantization + * - Total excitation for UnVoiced coders + * - Updates + *-------------------------------------------------------------------*/ + +float gaus_encode( + Encoder_State *st, /* i/o: encoder state structure */ + const int16_t i_subfr, /* i : subframe index */ + const float *h1, /* i : weighted filter input response */ + const float *xn, /* i : target vector */ + float *exc, /* o : pointer to excitation signal frame */ + float *mem_w0, /* o : weighting filter denominator memory */ + float *gp_clip_mem, /* o : memory of gain of pitch clipping algorithm */ + float *tilt_code, /* o : synthesis excitation spectrum tilt */ + float *code, /* o : algebraic excitation */ + float *gain_code, /* o : Code gain. */ + float *y2, /* o : zero-memory filtered adaptive excitation */ + float *gain_inov, /* o : innovation gain */ + float *voice_fac, /* o : voicing factor */ + float *gain_pit, /* o : adaptive excitation gain */ + float *norm_gain_code /* o : normalized innovative cb. gain */ +) +{ + int16_t i = 0, nb_bits, idx; + float dn[L_SUBFR]; /* Correlation between xn and h1 */ + BSTR_ENC_HANDLE hBstr = st->hBstr; + + /*----------------------------------------------------------------* + * Encode gaussian excitation + *----------------------------------------------------------------*/ + + corr_xh( xn, dn, h1, L_SUBFR ); /* Correlation between target xn[] and impulse response h1[] */ + + nb_bits = st->acelp_cfg.fixed_cdk_index[i_subfr / L_SUBFR]; + + gauss2v( hBstr, h1, xn, dn, code, y2, gain_code, L_SUBFR, nb_bits >> 1 ); + + /*----------------------------------------------------------------* + * Encode gaussian gain + *----------------------------------------------------------------*/ + + /* codeword energy computation */ + *gain_inov = 1.0f / (float) sqrt( ( dotp( code, code, L_SUBFR ) + 0.01f ) / L_SUBFR ); + + nb_bits = st->acelp_cfg.gains_mode[i_subfr / L_SUBFR]; + + idx = gain_enc_gaus( gain_code, nb_bits, -30.0f, 190.0f ); + push_indice( hBstr, IND_GAIN, idx, nb_bits ); + + /*-----------------------------------------------------------------* + * Total excitation for Unvoiced coders + *-----------------------------------------------------------------*/ + + for ( i = 0; i < L_SUBFR; i++ ) + { + exc[i + i_subfr] = *gain_code * code[i]; + } + + /*-----------------------------------------------------------------* + * Updates: last value of new target is stored in mem_w0 + *-----------------------------------------------------------------*/ + + *mem_w0 = xn[L_SUBFR - 1] - *gain_code * y2[L_SUBFR - 1]; + + init_gp_clip( gp_clip_mem ); /* reset pitch clipping parameters */ + *gain_pit = 0.0f; + *tilt_code = 0.0f; /* purely unvoiced */ + *voice_fac = -1.0f; /* purely unvoiced */ + + *norm_gain_code = *gain_code / *gain_inov; + + return L_SUBFR; +} + +/*-------------------------------------------------------------------* + * gauss2v() + * + * encoder of Gaussian Codebook for unvoiced + * consisting of addition of 2 Gaussian vectors + * + * One Gaussian vector of 192 values vectors delayed by 2 + *-------------------------------------------------------------------*/ + +static void gauss2v( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const float h[], /* i : weighted LP filter impulse response */ + const float xn[], /* i : target signal */ + const float dn[], /* i : backward filtered target */ + float code[], /* o : gaussian excitation */ + float y11[], /* o : zero-memory filtered gauss. excitation */ + float *gain, /* o : excitation gain */ + const int16_t lg, /* i : subframe size */ + const int16_t nb_bits /* i : nb ob bits per track (max 6) */ +) +{ + int16_t i, j, ind1, ind2, idx; + int16_t nvec, step; + float cor, cora, cor2, cor2w, eneri, enerw; + float *pt1, *pt2; + float max_val[NMAX + 1], *pos[NMAX + 1], sign[NMAX + 1]; + float ener[NMAX + 1], corr[NMAX + 1], ener1; + float dico2[L_SUBFR * NMAX]; + float c1, c0; + float gxx, gcc; + float gaus_dico2[190]; + float hg[190]; + float delta; + int16_t index_delta; + + /*-----------------------------------------------------------------* + * Encode the tilt of gaussian excitation + *-----------------------------------------------------------------*/ + + c0 = 0.0f; /* Compute spectral tilt of target */ + c1 = 0.0f; + for ( i = 1; i < L_SUBFR; i++ ) + { + c0 += xn[i] * xn[i]; + c1 += xn[i] * xn[i - 1]; + } + if ( c0 < FLT_MIN ) + { + gxx = 0.f; + } + else + { + gxx = c1 / c0; + } + + set_f( hg, 0, 190 ); /* Compute spectral tilt of filtered codebook */ + mvr2r( h, hg, L_SUBFR ); + conv( gaus_dico, hg, gaus_dico2, 190 ); + + c0 = 0.0f; + c1 = 0.0f; + for ( i = 1; i < 190; i++ ) + { + c0 += gaus_dico2[i] * gaus_dico2[i]; + c1 += gaus_dico2[i] * gaus_dico2[i - 1]; + } + gcc = c1 / c0; + delta = ( 1 - gcc * gxx ) / ( 2 * gcc + gxx ); /* Compute and quantize spectral tilt modification factor (3b) */ + + index_delta = (int16_t) ( FAC_DELTA * delta ); + if ( index_delta < 0 ) + { + index_delta = 0; + } + if ( index_delta > 7 ) + { + index_delta = 7; + } + + delta = STEP_DELTA * (float) index_delta; + if ( delta > 0.0f ) /* Adapt spectral tilt of initial codebook */ + { + gaus_dico2[0] = gaus_dico[0]; + for ( i = 1; i < 190; i++ ) + { + gaus_dico2[i] = ( gaus_dico[i] - delta * gaus_dico[i - 1] ) / ( 1 + delta * delta ); + } + } + else + { + for ( i = 0; i < 190; i++ ) + { + gaus_dico2[i] = gaus_dico[i]; + } + } + + /*-----------------------------------------------------------------* + * Codebook search initializations + *-----------------------------------------------------------------*/ + + ind1 = 0; + ind2 = 0; + + nvec = 1 << nb_bits; + step = 0x80 >> nb_bits; + + /*-----------------------------------------------------------------* + * dot product between dn and gaussian codevectors, + * keep NMAX best vectors + *-----------------------------------------------------------------*/ + + set_f( max_val, 0, NMAX + 1 ); + set_f( sign, 0, NMAX + 1 ); + + for ( i = 0; i < NMAX + 1; i++ ) + { + pos[i] = (float *) gaus_dico2; + } + + pt1 = (float *) gaus_dico2; + + for ( i = 0; i < nvec; i++, pt1 += step ) + { + cor = dotp( pt1, dn, lg ); + cora = (float) fabs( cor ); + j = NMAX - 1; + do + { + if ( cora >= max_val[j] ) + { + max_val[j + 1] = max_val[j]; + pos[j + 1] = pos[j]; + sign[j + 1] = sign[j]; + max_val[j] = cora; + pos[j] = pt1; + sign[j] = cor; + } + + j--; + } while ( j >= 0 ); + } + + /*-----------------------------------------------------------------* + * filter selected vectors + * put sign + * compute energy + *-----------------------------------------------------------------*/ + + pt1 = dico2; + for ( i = 0; i < NMAX; i++, pt1 += L_SUBFR ) + { + conv( pos[i], h, pt1, lg ); + + /* put sign and compute energy */ + if ( sign[i] < 0.0f ) + { + for ( j = 0; j < lg; j++ ) + { + pt1[j] = -pt1[j]; /*Store into dico2*/ + } + } + ener[i] = dotp( pt1, pt1, lg ); + corr[i] = dotp( pt1, xn, lg ); /* must be equal to sign[i] */ + } + + /*-----------------------------------------------------------------* + * try all combinations of NMAX best vectors + *-----------------------------------------------------------------*/ + + pt1 = dico2; + + /* Initial values for search algorithm */ + enerw = 1.0f; + cor2w = -1.0f; + + for ( i = 0; i < NMAX; i++, pt1 += L_SUBFR ) + { + pt2 = pt1; + for ( j = i; j < NMAX; j++, pt2 += L_SUBFR ) + { + cor = corr[i] + corr[j]; + eneri = ener[i] + ener[j] + 2.0f * dotp( pt1, pt2, lg ); + cor2 = cor * cor; + if ( cor2 * enerw > cor2w * eneri ) + { + cor2w = cor2; + enerw = eneri; + ind1 = i; + ind2 = j; + } + } + } + + /*-----------------------------------------------------------------* + * Compute zero-memory filtered gauss. excitation y + *-----------------------------------------------------------------*/ + + pt1 = dico2 + ind1 * L_SUBFR; + pt2 = dico2 + ind2 * L_SUBFR; + for ( i = 0; i < lg; i++ ) + { + y11[i] = pt1[i] + pt2[i]; + } + + /*-----------------------------------------------------------------* + * Signs of vectors + *-----------------------------------------------------------------*/ + + if ( sign[ind1] >= 0.0f ) + { + sign[ind1] = 1.0f; + } + else + { + sign[ind1] = -1.0f; + } + + if ( sign[ind2] >= 0.0f ) + { + sign[ind2] = 1.0f; + } + else + { + sign[ind2] = -1.0f; + } + + /*-----------------------------------------------------------------* + * Compute code + *-----------------------------------------------------------------*/ + + pt1 = pos[ind1]; + pt2 = pos[ind2]; + for ( i = 0; i < lg; i++ ) + { + code[i] = pt1[i] * sign[ind1] + pt2[i] * sign[ind2]; + } + cor = corr[ind1] + corr[ind2]; + + /*-----------------------------------------------------------------* + * Compute index + *-----------------------------------------------------------------*/ + + i = (int16_t) ( ( pos[ind1] - gaus_dico2 ) / step ); /* Division by step can be replaced by shift */ + j = (int16_t) ( ( pos[ind2] - gaus_dico2 ) / step ); /* Division by step can be replaced by shift */ + + idx = cod_2pos( i, j, sign[ind1], sign[ind2], nvec ); + + push_indice( hBstr, IND_GAUS_CDBK_INDEX, idx, 2 * nb_bits + 1 ); + push_indice( hBstr, IND_TILT_FACTOR, index_delta, 3 ); + + /*-----------------------------------------------------------------* + * Find quantized gain + *-----------------------------------------------------------------*/ + + *gain = cor / enerw; + ener1 = dotp( xn, xn, lg ); + ener1 = (float) sqrt( ener1 / enerw ); /* Minimize ebergy error */ + *gain = *gain * 0.6f + ener1 * 0.4f; + + return; +} + +/*---------------------------------------------------------------------* + * Put selected codevector positions and signs into quantization index + *---------------------------------------------------------------------*/ + +/*! r: codebook quantization index */ +static int16_t cod_2pos( + const int16_t ind1, /* i : index of 1st gaussian vector */ + const int16_t ind2, /* i : index of 2nd gaussian vector */ + const float sign1, /* i : sign of 1st gaussian vector */ + const float sign2, /* i : sign of 2nd gaussian vector */ + const int16_t n /* i : nb. of codebook vectors */ +) +{ + int16_t i1, i2, index, s1, s2; + + + s1 = 1; + if ( sign1 > 0.0f ) + { + s1 = 0; + } + + s2 = 1; + if ( sign2 > 0.0f ) + { + s2 = 0; + } + + if ( s1 == s2 ) + { + if ( ind1 <= ind2 ) + { + i1 = ind1; + i2 = ind2; + } + else + { + i1 = ind2; + i2 = ind1; + } + } + else + { + if ( ind1 > ind2 ) + { + i1 = ind1; + i2 = ind2; + } + else + { + i1 = ind2; + i2 = ind1; + s1 = s2; + } + } + index = i1 * n + i2; + index = ( index << 1 ) + s1; + + return index; +} diff --git a/lib_enc/gp_clip.c b/lib_enc/gp_clip.c new file mode 100644 index 0000000000000000000000000000000000000000..36133af3ec74ba24f6fbbf1f241945bb71660d1f --- /dev/null +++ b/lib_enc/gp_clip.c @@ -0,0 +1,250 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "prot.h" +#include "cnst.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * Local constants + *-------------------------------------------------------------------*/ +#define DIST_ISF_MAX_IO 150.0f + +#define DIST_ISF_MAX 120.0f +#define DIST_ISF_THRES 60 +#define GAIN_PIT_THRES 0.9f +#define GAIN_PIT_MIN 0.6f + +#define ALPHA1 0.98f +#define ALPHA4 0.99f +#define WINDOW_SIZE 50 +#define THRESH_TYPE 0.85f +#define THRESH_VOICING 0.86f + +/*-------------------------------------------------------------------* + * init_gp_clip + * + * Pitch Gain clipping initializations + *-------------------------------------------------------------------*/ +void init_gp_clip( + float mem[] /* o : memory of gain of pitch clipping algorithm */ +) +{ + mem[0] = DIST_ISF_MAX; + mem[1] = GAIN_PIT_MIN; + mem[2] = 0.0f; /* old energy of target (dB) */ + mem[3] = 0.0f; + mem[4] = 0.0f; + mem[5] = 0.8f; + + return; +} + +/*-------------------------------------------------------------------* + * Function gp_clip + * + * The gain needs to be limited (gain pitch < 1.0) when one of the + * following cases occurs: + * - a resonance on LPC filter (lp_disp < 60 Hz) AND a good pitch + * prediction (lp_gp > 0.9) + * - target energy drops by 6 dB AND a good pitch prediction (lp_gp>1.0) + *-------------------------------------------------------------------*/ + +int16_t gp_clip( + const int16_t element_mode, /* i : element mode */ + const int32_t core_brate, /* i : core bitrate */ + const float *voicing, /* i : normalized correlations (from OL pitch) */ + const int16_t i_subfr, /* i : subframe index */ + const int16_t coder_type, /* i : type of coder */ + const float xn[], /* i : target vector */ + float mem[] /* i/o: memory of gain of pitch clipping algorithm */ +) +{ + int16_t clip; + int16_t i; + float wener, tmp; + + clip = 0; + + if ( ( core_brate == ACELP_6k60 ) || ( core_brate == ACELP_8k85 ) || ( element_mode > EVS_MONO ) ) + { + tmp = 0.9f + ( 0.1f * mem[0] / DIST_ISF_MAX_IO ); /* clipping is activated when filtered pitch gain > threshold (0.94 to 1) */ + if ( mem[1] > tmp ) + { + clip = 1; + } + } + else if ( ( mem[0] < DIST_ISF_THRES ) && ( mem[1] > GAIN_PIT_THRES ) ) + { + clip = 1; + } + + wener = 0.01f; + for ( i = 0; i < L_SUBFR; i++ ) + { + wener += xn[i] * xn[i]; + } + wener = 10.0f * (float) log10( wener ); + if ( ( wener < ( mem[2] - 6.0f ) ) && ( mem[1] > 1.0f ) ) + { + clip = 1; + } + + mem[2] = wener; + tmp = ALPHA1 * mem[4]; + + if ( coder_type == GENERIC || coder_type == TRANSITION || coder_type == INACTIVE ) + { + tmp += ( 1 - ALPHA1 ); + } + + mem[4] = tmp; + tmp = ALPHA4 * mem[5]; + if ( i_subfr == 0 ) + { + mem[5] = ( 1 - ALPHA4 ) * voicing[0] + tmp; + } + else if ( i_subfr == 2 * L_SUBFR ) + { + mem[5] = ( 1 - ALPHA4 ) * voicing[1] + tmp; + } + if ( mem[3] > WINDOW_SIZE ) + { + if ( ( mem[4] > THRESH_TYPE ) && ( mem[5] > THRESH_VOICING ) ) + { + clip = 1; + } + } + else + { + mem[3]++; + } + + return ( clip ); +} + +/*-------------------------------------------------------------------* + * gp_clip_test_lsf() + * + * check the minimum distance of LSFs for pitch gain clipping flag + *-------------------------------------------------------------------*/ + +void gp_clip_test_lsf( + const int16_t element_mode, /* i : element mode */ + const int32_t core_brate, /* i : core bitrate */ + const float lsf[], /* i : LSF vector */ + float mem[], /* i/o: memory of gain of pitch clipping algorithm */ + const int16_t Opt_AMR_WB /* i : flag indicating AMR-WB IO mode */ +) +{ + int16_t i; + int16_t m; + float dist, dist_min; + + dist_min = lsf[1] - lsf[0]; + + if ( Opt_AMR_WB ) + { + m = M - 1; + } + else + { + m = M; + } + + for ( i = 2; i < m; i++ ) + { + dist = lsf[i] - lsf[i - 1]; + if ( dist < dist_min ) + { + dist_min = dist; + } + } + + dist = 0.8f * mem[0] + 0.2f * dist_min; + + if ( ( core_brate == ACELP_6k60 ) || ( core_brate == ACELP_8k85 ) || ( element_mode > EVS_MONO ) ) + { + if ( dist > DIST_ISF_MAX_IO ) + { + dist = DIST_ISF_MAX_IO; + } + } + else if ( dist > DIST_ISF_MAX ) + { + dist = DIST_ISF_MAX; + } + + mem[0] = dist; + + return; +} + +/*-------------------------------------------------------------------* + * gp_clip_test_gain_pit() + * + * low-pass filtering of the pitch gain for pitch gain clipping flag + *-------------------------------------------------------------------*/ + +void gp_clip_test_gain_pit( + const int16_t element_mode, /* i : element mode */ + const int32_t core_brate, /* i : core bitrate */ + const float gain_pit, /* i : gain of quantized pitch */ + float mem[] /* i/o: memory of gain of pitch clipping algorithm */ +) +{ + float gain; + + if ( ( core_brate == ACELP_6k60 ) || ( core_brate == ACELP_8k85 ) || ( element_mode > EVS_MONO ) ) + { + gain = 0.98f * mem[1] + 0.02f * gain_pit; /* long term LTP gain average (>250ms) */ + } + else + { + gain = 0.9f * mem[1] + 0.1f * gain_pit; + } + + if ( gain < GAIN_PIT_MIN ) + { + gain = GAIN_PIT_MIN; + } + mem[1] = gain; + + return; +} diff --git a/lib_enc/gs_enc.c b/lib_enc/gs_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..c22285436ce4bf52ea65307891b84c76577a04a7 --- /dev/null +++ b/lib_enc/gs_enc.c @@ -0,0 +1,671 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "ivas_prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * Local function prototypes + *-------------------------------------------------------------------*/ + +static float edyn( const float *vec, const int16_t lvec ); + + +/*-------------------------------------------------------------------* + * encod_audio() + * + * Encode audio (AC) frames + *-------------------------------------------------------------------*/ + +void encod_audio( + Encoder_State *st, /* i/o: State structure */ + const float speech[], /* i : input speech */ + const float Aw[], /* i : weighted A(z) unquantized for subframes */ + const float Aq[], /* i : 12k8 Lp coefficient */ + const float *res, /* i : residual signal */ + float *synth, /* i/o: core synthesis */ + float *exc, /* i/o: current non-enhanced excitation */ + float *pitch_buf, /* i/o: floating pitch values for each subframe */ + float *voice_factors, /* o : voicing factors */ + float *bwe_exc, /* o : excitation for SWB TBE */ + const int16_t attack_flag, /* i : attack flag (GSC or TC) */ + float *lsf_new, /* i : current frame ISF vector */ + float *tmp_noise, /* o : long-term noise energy */ + const int16_t tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag */ + const float tdm_Pri_pitch_buf[] /* i : primary channel pitch buffer */ +) +{ + const float *p_Aq; + int16_t i, i_subfr, nb_subfr, last_pit_bin; + int16_t T0_tmp, T0_frac_tmp, nb_subfr_flag; + int16_t tmp_nb_bits_tot; + GSC_ENC_HANDLE hGSCEnc; + float Es_pred; + float dct_res[L_FRAME16k], dct_epit[L_FRAME16k]; + float m_mean; + float exc_wo_nf[L_FRAME16k]; + int16_t nb_bits; /*number of bits*/ + BSTR_ENC_HANDLE hBstr = st->hBstr; + LPD_state_HANDLE hLPDmem = st->hLPDmem; + + /*---------------------------------------------------------------* + * Initialization + *---------------------------------------------------------------*/ + + hGSCEnc = st->hGSCEnc; + + m_mean = 0.0f; + + T0_tmp = 64; + T0_frac_tmp = 0; + mvr2r( hLPDmem->mem_syn, hGSCEnc->mem_syn_tmp, M ); + hGSCEnc->mem_w0_tmp = hLPDmem->mem_w0; + Es_pred = 0; + + /*---------------------------------------------------------------* + * Encode GSC IVAS mode + * Encode GSC attack flag (used to reduce possible pre-echo) + * Encode GSC SWB speech flag + *---------------------------------------------------------------*/ + + if ( st->element_mode > EVS_MONO && st->idchan == 0 ) + { + push_indice( hBstr, IND_GSC_IVAS_SP, st->GSC_IVAS_mode, 2 ); + } + + if ( attack_flag > 0 ) + { + push_indice( hBstr, IND_GSC_ATTACK, 1, 1 ); + } + else + { + push_indice( hBstr, IND_GSC_ATTACK, 0, 1 ); + } + + if ( st->GSC_IVAS_mode >= 1 || ( st->coder_type != INACTIVE && ( ( st->element_mode == EVS_MONO && st->total_brate >= ACELP_13k20 ) || + ( st->element_mode > EVS_MONO && st->total_brate > MIN_BRATE_GSC_NOISY_FLAG && st->bwidth >= SWB && !st->flag_ACELP16k ) ) ) ) + { + push_indice( hBstr, IND_GSC_SWB_SPEECH, st->GSC_noisy_speech, 1 ); + } + + /*---------------------------------------------------------------*+ + * Find and encode the number of subframes + *---------------------------------------------------------------*/ + + if ( st->core_brate >= ACELP_9k60 && st->core_brate <= ACELP_13k20 ) + { + for ( i = 0; i < 5; i++ ) + { + if ( fabs( st->hSpMusClas->gsc_lt_diff_etot[MAX_LT - i - 1] ) > 6.0f && hGSCEnc->cor_strong_limit == 1 ) + { + hGSCEnc->cor_strong_limit = 0; + } + } + } + + if ( st->GSC_IVAS_mode >= 1 || ( st->GSC_noisy_speech == 1 && st->GSC_IVAS_mode == 0 ) ) + { + nb_subfr = NB_SUBFR; + if ( st->GSC_IVAS_mode > 0 && st->GSC_IVAS_mode < 3 && st->core_brate < GSC_L_RATE_STG ) + { + nb_subfr = 2; + } + + hGSCEnc->cor_strong_limit = 0; + nb_subfr_flag = 1; + } + else if ( st->L_frame == L_FRAME16k && ( st->core_brate <= ACELP_13k20 || st->coder_type == INACTIVE ) ) + { + hGSCEnc->cor_strong_limit = 0; + nb_subfr = SWNB_SUBFR; + nb_subfr_flag = 1; + } + else + { + if ( ( hGSCEnc->cor_strong_limit == 0 || st->coder_type == INACTIVE ) && st->core_brate >= ACELP_9k60 ) + { + nb_subfr = 2; + nb_subfr_flag = 0; + hGSCEnc->cor_strong_limit = 0; + } + else + { + nb_subfr = SWNB_SUBFR; + nb_subfr_flag = 1; + } + + if ( st->L_frame == L_FRAME16k && ( st->hSpMusClas->mold_corr > .8f && st->core_brate >= MIN_RATE_4SBFR && st->coder_type != INACTIVE ) ) + { + nb_subfr *= 2; + nb_subfr_flag |= 0x2; + } + + if ( st->L_frame == L_FRAME16k && st->core_brate >= MIN_RATE_4SBFR ) + { + push_indice( hBstr, IND_HF_NOISE, nb_subfr_flag, 2 ); + } + else if ( st->core_brate >= ACELP_9k60 ) + { + /* nb_subfr_flag can only have the value 0 or 1 */ + push_indice( hBstr, IND_HF_NOISE, nb_subfr_flag, 1 ); + } + } + + if ( st->L_frame == L_FRAME16k && nb_subfr == NB_SUBFR ) + { + nb_subfr = NB_SUBFR16k; + } + + /*---------------------------------------------------------------* + * Compute adaptive (pitch) excitation contribution + *---------------------------------------------------------------*/ + + if ( !( st->GSC_IVAS_mode > 0 && st->L_frame / nb_subfr == 2 * L_SUBFR && st->GSC_IVAS_mode < 3 ) && + ( ( st->core_brate >= MIN_RATE_FCB || st->GSC_noisy_speech ) && + ( ( nb_subfr == NB_SUBFR && st->L_frame == L_FRAME ) || ( nb_subfr == NB_SUBFR16k && st->L_frame == L_FRAME16k ) ) ) ) + { + if ( st->element_mode > EVS_MONO ) + { + nb_bits = 5; + } + else + { + nb_bits = Es_pred_bits_tbl[BIT_ALLOC_IDX( st->core_brate, GENERIC, -1, -1 )]; + } + Es_pred_enc( &Es_pred, &i, st->L_frame, L_SUBFR, res, st->voicing, nb_bits, 0 ); + push_indice( hBstr, IND_ES_PRED, i, nb_bits ); + } + + enc_pit_exc( st, speech, Aw, Aq, Es_pred, res, synth, exc, &T0_tmp, &T0_frac_tmp, pitch_buf, nb_subfr, &hGSCEnc->lt_gpitch, tdm_Pitch_reuse_flag, tdm_Pri_pitch_buf ); + + /*---------------------------------------------------------------* + * DCT transform + *---------------------------------------------------------------*/ + + edct( exc, dct_epit, st->L_frame, st->element_mode ); + + edct( res, dct_res, st->L_frame, st->element_mode ); + + /*---------------------------------------------------------------* + * Calculate energy dynamics + *---------------------------------------------------------------*/ + + for ( i = 7; i < 15; i++ ) + { + m_mean += edyn( dct_res + i * 16, 16 ); + } + m_mean *= 0.125f; + + if ( m_mean > hGSCEnc->mid_dyn ) + { + hGSCEnc->mid_dyn = 0.2f * hGSCEnc->mid_dyn + 0.8f * m_mean; + } + else + { + hGSCEnc->mid_dyn = 0.6f * hGSCEnc->mid_dyn + 0.4f * m_mean; + } + + if ( st->coder_type != INACTIVE ) + { + hGSCEnc->noise_lev = ( NOISE_LEVEL_SP3 + 1 ) - usquant( hGSCEnc->mid_dyn, &m_mean, MIN_DYNAMIC, DYNAMIC_RANGE / GSC_NF_STEPS, GSC_NF_STEPS ); + if ( hGSCEnc->noise_lev > NOISE_LEVEL_SP3 ) + { + hGSCEnc->noise_lev = NOISE_LEVEL_SP3; + } + } + + hGSCEnc->past_dyn_dec = hGSCEnc->noise_lev; + + if ( st->GSC_IVAS_mode >= 1 ) + { + hGSCEnc->noise_lev = NOISE_LEVEL_SP2; + if ( st->GSC_IVAS_mode == 3 ) /* Music like */ + { + hGSCEnc->noise_lev = NOISE_LEVEL_SP0; + } + else if ( st->GSC_noisy_speech == 0 ) + { + hGSCEnc->noise_lev = NOISE_LEVEL_SP3; + } + } + else if ( st->core_brate <= ACELP_8k00 ) + { + if ( hGSCEnc->noise_lev <= NOISE_LEVEL_SP2 ) + { + hGSCEnc->noise_lev = NOISE_LEVEL_SP2; + } + + push_indice( hBstr, IND_NOISE_LEVEL, hGSCEnc->noise_lev - NOISE_LEVEL_SP2, 2 ); + } + else if ( st->GSC_noisy_speech ) + { + hGSCEnc->noise_lev = NOISE_LEVEL_SP3; + } + else + { + push_indice( hBstr, IND_NOISE_LEVEL, hGSCEnc->noise_lev - NOISE_LEVEL_SP0, 3 ); + } + + /*---------------------------------------------------------------* + * Find and encode the last band where the adaptive (pitch) contribution is significant + *---------------------------------------------------------------*/ + + last_pit_bin = Pit_exc_contribution_len( st, dct_res, dct_epit, pitch_buf, &hGSCEnc->pit_exc_hangover ); + + if ( last_pit_bin == 0 ) + { + hLPDmem->tilt_code = 0.0f; + } + else + { + last_pit_bin++; + } + + /*--------------------------------------------------------------------------------------* + * GSC encoder + *--------------------------------------------------------------------------------------*/ + + /* Find the current total number of bits used */ + tmp_nb_bits_tot = hBstr->nb_bits_tot; + + if ( st->extl_brate > 0 ) + { + /* subtract 1 bit for TBE/BWE BWE flag (bit counted in extl_brate) */ + tmp_nb_bits_tot--; + } + + if ( st->coder_type == INACTIVE && st->core_brate <= ACELP_9k60 && st->idchan == 0 ) + { + /* add 5 bits for noisiness */ + tmp_nb_bits_tot += 5; + } + + gsc_enc( st, dct_res, dct_epit, last_pit_bin, tmp_nb_bits_tot, nb_subfr, lsf_new, exc_wo_nf, tmp_noise ); + + /*--------------------------------------------------------------------------------------* + * iDCT transform + *--------------------------------------------------------------------------------------*/ + + edct( dct_epit, exc, st->L_frame, st->element_mode ); + + edct( exc_wo_nf, exc_wo_nf, st->L_frame, st->element_mode ); + + /*--------------------------------------------------------------------------------------* + * Remove potential pre-echo in case an onset has been detected + *--------------------------------------------------------------------------------------*/ + + pre_echo_att( &hGSCEnc->Last_frame_ener, exc, attack_flag, st->last_coder_type, st->L_frame ); + + /*--------------------------------------------------------------------------------------* + * Update BWE excitation + *--------------------------------------------------------------------------------------*/ + + if ( st->hBWE_TD != NULL ) + { + if ( st->L_frame == L_FRAME16k ) + { + set_f( voice_factors, 0.0f, NB_SUBFR16k ); + interp_code_4over2( exc, bwe_exc, L_FRAME16k ); + } + else + { + set_f( voice_factors, 0.0f, NB_SUBFR ); + interp_code_5over2( exc, bwe_exc, L_FRAME ); + } + } + + /*--------------------------------------------------------------------------------------* + * Synthesis + *--------------------------------------------------------------------------------------*/ + + p_Aq = Aq; + for ( i_subfr = 0; i_subfr < st->L_frame; i_subfr += L_SUBFR ) + { + syn_filt( p_Aq, M, &exc_wo_nf[i_subfr], &synth[i_subfr], L_SUBFR, hLPDmem->mem_syn, 1 ); + p_Aq += ( M + 1 ); + } + + /*--------------------------------------------------------------------------------------* + * Updates + *--------------------------------------------------------------------------------------*/ + + hLPDmem->mem_w0 = hGSCEnc->mem_w0_tmp; + mvr2r( exc_wo_nf, exc, st->L_frame ); + + return; +} + +/*-------------------------------------------------------------------* + * gsc_enc() + * + * Generic audio signal encoder + *-------------------------------------------------------------------*/ + +void gsc_enc( + Encoder_State *st, /* i/o: State structure */ + float res_dct_in[], /* i : dct of residual signal */ + float exc_dct_in[], /* i/o: dct of pitch-only excitation / total excitation */ + const int16_t Diff_len, /* i : Lenght of the difference signal (before pure spectral)*/ + const int16_t bits_used, /* i : Number of bit used before frequency Q */ + const int16_t nb_subfr, /* i : Number of subframe considered */ + const float *lsf_new, /* i : ISFs at the end of the frame */ + float *exc_wo_nf, /* o : excitation (in f domain) without noisefill */ + float *tmp_noise /* o : long-term noise energy */ +) +{ + int16_t i; + GSC_ENC_HANDLE hGSCEnc; + BSTR_ENC_HANDLE hBstr; + float exc_diffQ[L_FRAME16k]; + float exc_diff[L_FRAME16k]; + int16_t bit; + int16_t nb_subbands; + int16_t pvq_len; + int16_t bits_per_bands[MBANDS_GN_BITALLOC16k]; /*Q3*/ + int16_t tmp_band; + float concat_in[L_FRAME16k]; + float concat_out[L_FRAME16k]; + int16_t max_ener_band[MBANDS_GN_BITALLOC16k], j; + float Ener_per_bd_iQ[MBANDS_GN16k]; + int16_t last_bin; + int16_t bitallocation_band[MBANDS_GN_BITALLOC16k]; + int16_t bitallocation_exc[2]; + int16_t npulses[NB_SFM]; + int16_t maxpulse[NB_SFM]; + float mean_gain; + int16_t seed_init; + float max_eq, max_eq_val; + + /*--------------------------------------------------------------------------------------* + * Initialization + *--------------------------------------------------------------------------------------*/ + + hGSCEnc = st->hGSCEnc; + hBstr = st->hBstr; + + bit = bits_used; + if ( st->coder_type == INACTIVE && ( st->tdm_LRTD_flag == 1 || st->element_mode == IVAS_SCE ) && st->core_brate <= GSC_LRES_GAINQ_LIMIT ) + { + bit += GSC_LRES_NB_NITS; + } + + set_f( exc_diffQ, 0.0f, st->L_frame ); + set_f( Ener_per_bd_iQ, 0.0f, MBANDS_GN16k ); + + /*--------------------------------------------------------------------------------------* + * Calculate the difference between the residual spectrum and the spectrum of adaptive excitation + * (non valuable temporal content present in exc_dct_in is already zeroed) + *--------------------------------------------------------------------------------------*/ + + v_sub( res_dct_in, exc_dct_in, exc_diff, st->L_frame ); + exc_diff[0] = 0; + + /*--------------------------------------------------------------------------------------* + * Multiply the difference spectrum with the normalized spectral shape of the residual signal + * This improves the stability of the differnece spectrum since the spectral shape of the + * residual signal is less suseptible to rapid changes than the difference spectrum + *--------------------------------------------------------------------------------------*/ + + if ( Diff_len == 0 ) + { + tmp_band = 0; + } + else + { + tmp_band = hGSCEnc->mem_last_pit_band; + } + + Ener_per_band_comp( exc_diff, Ener_per_bd_iQ, MBANDS_GN, 1, st->L_frame ); + + /*--------------------------------------------------------------------------------------* + * Gain quantizaion + *--------------------------------------------------------------------------------------*/ + + i = 0; + while ( i < SIZE_BRATE_INTERMED_TBL ) + { + if ( st->core_brate <= brate_intermed_tbl[i] ) + { + break; + } + i++; + } + if ( st->element_mode > EVS_MONO && st->coder_type == AUDIO && + st->core_brate <= STEREO_GSC_BIT_RATE_ALLOC && brate_intermed_tbl[i] == ACELP_9k60 ) /* Bit allocation should be mapped to 8 kb/s instead of 9.6 kb/s in this case */ + { + i--; + } + + mean_gain = gsc_gainQ( hBstr, st->element_mode, st->idchan, Ener_per_bd_iQ, Ener_per_bd_iQ, brate_intermed_tbl[i], st->coder_type, st->bwidth, st->L_frame, st->tdm_LRTD_flag, st->core_brate ); + + *tmp_noise = 10.0f * mean_gain; + + /*--------------------------------------------------------------------------------------* + * PVQ encoder + *--------------------------------------------------------------------------------------*/ + + bands_and_bit_alloc( hGSCEnc->cor_strong_limit, hGSCEnc->noise_lev, st->core_brate, Diff_len, bit, &bit, Ener_per_bd_iQ, max_ener_band, bits_per_bands, &nb_subbands, exc_diff, concat_in, &pvq_len, st->coder_type, st->bwidth, st->GSC_noisy_speech, st->L_frame, st->element_mode, st->GSC_IVAS_mode ); + + set_s( npulses, 0, NB_SFM ); + + if ( bit == 0 ) + { + set_zero( concat_out, L_FRAME16k ); + } + else + { + bit -= pvq_core_enc( hBstr, concat_in, concat_out, bit, nb_subbands, gsc_sfm_start, gsc_sfm_end, gsc_sfm_size, bits_per_bands, NULL, npulses, maxpulse, ACELP_CORE ); + } + + /* write unused bits */ + while ( bit > 0 ) + { + i = min( bit, 16 ); + push_indice( hBstr, IND_UNUSED, 0, i ); + bit -= i; + } + + /* Reorder Q bands */ + last_bin = 0; + set_s( bitallocation_band, 0, MBANDS_GN_BITALLOC16k ); + seed_init = 0; + max_eq = 0; + max_eq_val = 1.0f; + + if ( ( ( ( st->core_brate < ACELP_7k20 && st->GSC_noisy_speech == 1 ) || st->core_brate < 6000 ) && st->coder_type <= UNVOICED ) || st->GSC_IVAS_mode >= 1 ) + { + j = emaximum( concat_out, nb_subbands * 16, &max_eq ); + max_eq = max_eq_val / ( fabsf( concat_out[j] ) + 0.01f ); + max_eq = min( max_eq_val, max_eq ); + } + + for ( j = 0; j < nb_subbands; j++ ) + { + mvr2r( concat_out + j * 16, exc_diffQ + max_ener_band[j] * 16, 16 ); + + if ( max_ener_band[j] > last_bin ) + { + last_bin = max_ener_band[j]; + } + + bitallocation_band[max_ener_band[j]] = 1; + + seed_init += npulses[j]; + } + if ( st->last_coder_type != AUDIO /* First audio frame */ + && st->last_coder_type != UNVOICED ) /* last_coder_type == INACTIVE is overwritten in update_enc to UNVOICED */ + { + for ( j = 0; j < nb_subbands * 16; j++ ) + { + if ( concat_out[j] > 0 ) + { + seed_init = (int16_t) ( (int32_t) seed_init * 8 ); + } + if ( concat_out[j] < 0 ) + { + seed_init += 3; + } + } + + hGSCEnc->seed_tcx = seed_init; + } + + if ( st->core_brate == ACELP_8k00 && st->bwidth != NB ) + { + bitallocation_exc[0] = 0; + bitallocation_exc[1] = 0; + + if ( exc_diffQ[L_FRAME8k - 2] != 0 ) + { + bitallocation_exc[0] = 1; + } + + if ( exc_diffQ[L_FRAME8k - 1] != 0 ) + { + bitallocation_exc[1] = 1; + } + } + + /*--------------------------------------------------------------------------------------* + * Skip adaptive (pitch) contribution frequency band (no noise added over the adaptive (pitch) contribution) + * Find x pulses between 1.6-3.2kHz to code in the spectrum of the residual signal + * Gain is based on the inter-correlation gain between the pulses found and residual signal + *--------------------------------------------------------------------------------------*/ + + if ( st->GSC_IVAS_mode >= 1 && st->GSC_noisy_speech == 1 ) + { + for ( i = 64; i < st->L_frame; i++ ) + { + exc_diffQ[i] *= max_eq; + } + } + else if ( st->core_brate < ACELP_7k20 && st->GSC_noisy_speech == 1 && st->coder_type <= UNVOICED ) + { + for ( i = 0; i < L_FRAME; i++ ) + { + exc_diffQ[i] *= max_eq; + } + } + else + { + freq_dnw_scaling( hGSCEnc->cor_strong_limit, st->coder_type, hGSCEnc->noise_lev, st->core_brate, exc_diffQ, st->L_frame ); + } + + /*--------------------------------------------------------------------------------------* + * Estimate noise level + *--------------------------------------------------------------------------------------*/ + + highband_exc_dct_in( st->core_brate, mfreq_bindiv_loc, last_bin, Diff_len, hGSCEnc->noise_lev, tmp_band, exc_diffQ, &hGSCEnc->seed_tcx, Ener_per_bd_iQ, nb_subfr, exc_dct_in, st->last_coder_type, bitallocation_band, lsf_new, hGSCEnc->last_exc_dct_in, &hGSCEnc->last_ener, hGSCEnc->last_bitallocation_band, bitallocation_exc, 0, st->coder_type, st->bwidth, exc_wo_nf, st->GSC_noisy_speech, NULL, st->L_frame, st->element_mode, st->GSC_IVAS_mode ); + + exc_dct_in[0] = 0; + + return; +} + + +/*---------------------------------------------------------------------* + * edyn() + * + * Calculate energy dynamics in a vector (ratio of energy maximum to energy mean) + *---------------------------------------------------------------------*/ + +/*! r: ratio of max to mean */ +static float edyn( + const float *vec, /* i : input vector */ + const int16_t lvec /* i : length of input vector */ +) +{ + int16_t j; + float temp, ener_max, ener_mean, dyn; + + ener_mean = 1.0f; + ener_max = 1.0f; + + for ( j = 0; j < lvec; j++ ) + { + temp = vec[j] * vec[j]; + + if ( temp > ener_max ) + { + ener_max = temp; + } + ener_mean += temp; + } + ener_mean /= lvec; + dyn = 10.0f * ( ener_max / ener_mean ); + + return dyn; +} + + +/*-------------------------------------------------------------------* + * GSC_enc_init() + * + * Initialize GSC encoder state structure + *-------------------------------------------------------------------*/ + +void GSC_enc_init( + GSC_ENC_HANDLE hGSCEnc /* i/o: GSC data handle */ +) +{ + /* AC mode */ + hGSCEnc->seed_tcx = 15687; + hGSCEnc->cor_strong_limit = 1; + set_f( hGSCEnc->last_exc_dct_in, 0, L_FRAME16k ); + hGSCEnc->last_ener = 0.0f; + set_s( hGSCEnc->last_bitallocation_band, 0, 6 ); + hGSCEnc->mem_last_pit_band = BAND1k2 + 1; + + hGSCEnc->lt_gpitch = 0.0f; + hGSCEnc->pit_exc_hangover = 0; + + /* GSC - pitch excitation parameters */ + hGSCEnc->mem_w0_tmp = 0.0f; + set_f( hGSCEnc->mem_syn_tmp, 0.0f, M ); + + hGSCEnc->Last_frame_ener = (float) MAX_32; + hGSCEnc->mid_dyn = 40.0f; + hGSCEnc->noise_lev = NOISE_LEVEL_SP0; + hGSCEnc->past_dyn_dec = 0; + + return; +} diff --git a/lib_enc/guided_plc_enc.c b/lib_enc/guided_plc_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..cb5e84683d5aa3163c1ddb7df3b609887b308d20 --- /dev/null +++ b/lib_enc/guided_plc_enc.c @@ -0,0 +1,386 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "prot.h" +#include "stat_enc.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * coderLookAheadInnovation() + * + * + *-------------------------------------------------------------------*/ + +static void coderLookAheadInnovation( + const float A[], /* i : coefficients NxAz[M+1] */ + int16_t *pT, /* o : pitch */ + PLC_ENC_EVS_HANDLE st, /* i/o: coder memory state */ + float *speechLookAhead, + float *old_exc, + const int16_t L_subfr, + const int16_t L_frame ) +{ + int16_t i; + float *exc, exc_buf[L_EXC_MEM + 2 * L_SUBFR + 8]; + int16_t T0 = 0; + int16_t prev_pitch; + float ps, alp, max_ps; + int16_t subfr_len; + int16_t search_range; + + search_range = 9; + + set_f( exc_buf, 0.0f, L_EXC_MEM + 2 * L_SUBFR + 8 ); + + /* Framing parameters */ + if ( L_frame < L_FRAME16k ) + { + subfr_len = (int16_t) ( 1.75 * L_subfr ); + } + else + { + subfr_len = (int16_t) ( 2 * L_subfr ); + } + + /*------------------------------------------------------------------------* + * Initialize buffers * + *------------------------------------------------------------------------*/ + + /* set excitation memory */ + exc = exc_buf + L_EXC_MEM + 8; + mvr2r( old_exc, exc_buf, L_EXC_MEM + 8 ); + + /*------------------------------------------------------------------------* + * - Get residual signal and target at lookahead part. * + *------------------------------------------------------------------------*/ + + /* find LP residual signal for look-ahead part */ + getLookAheadResSig( speechLookAhead, A, exc, L_frame, L_subfr, M, 2 ); + + /* Initialize excitation buffer */ + prev_pitch = st->T0_4th; + /* find target signals */ + /* find best candidate of pitch lag */ + { + max_ps = -1.0e10; + T0 = st->T0_4th; + for ( i = -search_range; i < search_range; i++ ) + { + if ( prev_pitch + i > st->pit_max || prev_pitch + i < st->pit_min ) + { + continue; + } + ps = dotp( exc, &exc[-( prev_pitch + i )], subfr_len ); + alp = dotp( &exc[-( prev_pitch + i )], &exc[-( prev_pitch + i )], subfr_len ); + ps /= (float) sqrt( alp + 1.0e-10 ); + if ( max_ps < ps ) + { + max_ps = ps; + T0 = prev_pitch + i; + } + } + if ( max_ps < 0.0 ) + { + T0 = st->T0_4th; + } + } + + pT[0] = T0; + + return; +} + + +/*-------------------------------------------------------------------* + * getConcealedlsf() + * + * + *-------------------------------------------------------------------*/ + +static void getConcealedlsf( + PLC_ENC_EVS_HANDLE memDecState, + const float lsfBase[], + const int16_t L_frame, + const int16_t last_good ) +{ + float *lsf = memDecState->lsf_con; + + dlpc_bfi( L_frame, &lsf[0], memDecState->lsfold, last_good, 1 /*assumes packet loss */, memDecState->mem_MA, memDecState->mem_AR, &( memDecState->stab_fac ), memDecState->lsf_adaptive_mean, 1, NULL, 0, NULL, NULL, lsfBase ); + + return; +} + + +/*-------------------------------------------------------------------* + * enc_prm_side_Info() + * + * + *-------------------------------------------------------------------*/ + +void enc_prm_side_Info( + PLC_ENC_EVS_HANDLE hPlc_Ext, + Encoder_State *st ) +{ + int16_t diff_pitch; + int16_t bits_per_subfr, search_range; + BSTR_ENC_HANDLE hBstr = st->hBstr; + + bits_per_subfr = 4; + search_range = 8; + + if ( hPlc_Ext->nBits > 1 ) + { + push_next_indice( hBstr, 1, 1 ); + + diff_pitch = hPlc_Ext->T0 - hPlc_Ext->T0_4th; + + if ( ( diff_pitch > search_range - 1 ) || ( diff_pitch < -search_range + 1 ) ) + { + diff_pitch = -8; + } + + push_next_indice( hBstr, ( diff_pitch + search_range ), bits_per_subfr ); + } + else + { + push_next_indice( hBstr, 0, 1 ); + } + + return; +} + +/*-------------------------------------------------------------------* + * encoderSideLossSimulation() + * + * Encoder side loss simulation + *-------------------------------------------------------------------*/ + +void encoderSideLossSimulation( + Encoder_State *st, + PLC_ENC_EVS_HANDLE hPlc_Ext, + float *lsf_q, + const float stab_fac, + const int16_t calcOnlylsf, + const int16_t L_frame ) +{ + float lspLocal[M]; + const float *lsfBase; /* base for differential lsf coding */ + + /* Decoder State Update */ + lsf2lsp( lsf_q, lspLocal, M, st->sr_core ); + + lsfBase = PlcGetlsfBase( st->lpcQuantization, st->narrowBand, st->sr_core ); + + mvr2r( st->mem_MA, hPlc_Ext->mem_MA, M ); + + /* lsf parameter processing for concealment */ + updatelsfForConcealment( hPlc_Ext, lsf_q ); + hPlc_Ext->stab_fac = stab_fac; + + /* Update Decoder State for the loss simulation at the next frame */ + mvr2r( lsf_q, hPlc_Ext->lsfold, M ); + mvr2r( lspLocal, hPlc_Ext->lspold, M ); + + if ( calcOnlylsf ) + { + /* lsf concealment simulation */ + getConcealedlsf( hPlc_Ext, lsfBase, L_frame, st->clas ); + hPlc_Ext->T0 = hPlc_Ext->T0_4th; + } + else + { + float AqCon[( NB_SUBFR16k + 1 ) * ( M + 1 )]; + float *speechLookAhead; + float old_exc[L_EXC_MEM + 8]; + + /* Initialize pointers here */ + mvr2r( hPlc_Ext->old_exc, old_exc, 8 ); + mvr2r( hPlc_Ext->LPDmem->old_exc, &old_exc[8], L_EXC_MEM ); + speechLookAhead = &( st->speech_enc_pe[L_frame] ); + + /* lsf concealment simulation */ + getConcealedLP( hPlc_Ext, AqCon, lsfBase, st->sr_core, st->clas, L_frame ); + + /* apply encoder side PLC simulation */ + hPlc_Ext->pit_min = st->pit_min; + hPlc_Ext->pit_max = st->pit_max; + coderLookAheadInnovation( AqCon, &( hPlc_Ext->T0 ), hPlc_Ext, speechLookAhead, old_exc, L_SUBFR, st->L_frame ); + } + + return; +} + +/*-------------------------------------------------------------------* + * GplcTcxEncSetup() + * + * + *-------------------------------------------------------------------*/ + +void GplcTcxEncSetup( + const int16_t tcxltp_pitch_int, + PLC_ENC_EVS_HANDLE hPlc_Ext ) +{ + hPlc_Ext->T0_4th = tcxltp_pitch_int; + + return; +} + +/*-------------------------------------------------------------------* + * encSideSpecPowDiffuseDetector() + * + * + *-------------------------------------------------------------------*/ + +int16_t encSideSpecPowDiffuseDetector( + float *lsf_ref, + float *lsf_con, + const int32_t sr_core, + float *prev_lsf4_mean, + const int16_t sw, + const int16_t coder_type ) +{ + float lsf_mod[M]; + float dist1, dist2, cum_dist1, cum_dist2; + float lsf4_mean; + float th; + float th_dif_lsf4_mean; + int16_t idx; + int16_t cnt_imprv, i; + + /* calculate the mean of the lowest 4 lsfs */ + lsf4_mean = 0; + + for ( i = 0; i < 4; i++ ) + { + lsf4_mean += lsf_ref[i]; + } + lsf4_mean /= 4.0f; + + if ( sw ) + { + mvr2r( lsf_con, lsf_mod, M ); + + modify_lsf( lsf_mod, M, sr_core, 1 ); + + cum_dist1 = 0; + cum_dist2 = 0; + + cnt_imprv = 0; + + + for ( i = 0; i < M; i++ ) + { + dist1 = ( lsf_con[i] - lsf_ref[i] ) * ( lsf_con[i] - lsf_ref[i] ); + dist2 = ( lsf_mod[i] - lsf_ref[i] ) * ( lsf_mod[i] - lsf_ref[i] ); + cum_dist1 += dist1; + cum_dist2 += dist2; + + if ( dist1 > dist2 ) + { + cnt_imprv++; + } + } + + th = 800; + th_dif_lsf4_mean = 90; + + if ( sr_core == INT_FS_16k ) + { + th *= 1.25; + th_dif_lsf4_mean *= 1.25; + } + + + if ( cum_dist1 > cum_dist2 * 1.15 && lsf4_mean - *prev_lsf4_mean > th_dif_lsf4_mean && *prev_lsf4_mean < th && cnt_imprv > 2 && coder_type == GENERIC ) + { + idx = 1; + } + else + { + idx = 0; + } + } + else + { + idx = 0; + } + + /* update parameters */ + *prev_lsf4_mean = lsf4_mean; + + return idx; +} + +/*-------------------------------------------------------------------* + * updateSpecPowDiffuseIdx() + * + * + *-------------------------------------------------------------------*/ + +void updateSpecPowDiffuseIdx( + const float gain_pitch_buf[], /* i : gain pitch values */ + const float gain_code_buf[], /* i : gain pitch values */ + int16_t glr_idx[2], /* o : */ + float mean_gc[2] /* o : */ +) +{ + float min_gp; + int16_t k; + + mean_gc[1] = gain_code_buf[0]; + min_gp = gain_pitch_buf[0]; + + for ( k = 1; k < 4; k++ ) + { + mean_gc[1] += gain_code_buf[k]; + + if ( gain_pitch_buf[k] < min_gp ) + { + min_gp = gain_pitch_buf[k]; + } + } + + if ( mean_gc[1] / ( mean_gc[0] + 1e-6 ) < 1.098 || min_gp > 0.82 ) + { + glr_idx[0] = 0; + } + mean_gc[0] = mean_gc[1]; + + return; +} diff --git a/lib_enc/hf_cod_amrwb.c b/lib_enc/hf_cod_amrwb.c new file mode 100644 index 0000000000000000000000000000000000000000..7357bcd188f2c9da87f99e44adf8bed938727d7b --- /dev/null +++ b/lib_enc/hf_cod_amrwb.c @@ -0,0 +1,340 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*---------------------------------------------------------------------* + * Local function prototypes + *---------------------------------------------------------------------*/ + +static void hp400_12k8( float signal[], const int16_t lg, float mem[] ); +static void filt_6k_8k( float signal[], const int16_t lg, float mem[] ); + + +/*---------------------------------------------------------------------* + * hf_cod_init() + * + * + *---------------------------------------------------------------------*/ + +void hf_cod_init( + float *mem_hp400_enc, /* o : memory of hp 400 Hz filter */ + float *mem_hf1_enc, /* o : HF band-pass filter memory */ + float *mem_syn_hf_enc, /* o : HF synthesis memory */ + float *mem_hf2_enc, /* o : HF band-pass filter memory */ + float *gain_alpha /* o : smoothing gain for transitions between active and inactive frames */ +) +{ + set_f( mem_hp400_enc, 0, 4 ); + set_f( mem_hf1_enc, 0, L_FIR - 1 ); + set_f( mem_syn_hf_enc, 0, M ); + set_f( mem_hf2_enc, 0, L_FIR - 1 ); + *gain_alpha = 1.0; + + return; +} + + +/*---------------------------------------------------------------------* + * hf_cod() + * + * + *---------------------------------------------------------------------*/ + +void hf_cod( + const int32_t core_brate, /* i : core bitrate */ + const float *speech16k, /* i : original speech at 16 kHz */ + const float Aq[], /* i : quantized Aq */ + const float exc[], /* i : excitation at 12.8 kHz */ + float synth[], /* i : 12.8kHz synthesis signal */ + int16_t *seed2_enc, /* i/o: random seed for HF noise gen */ + float *mem_hp400_enc, /* i/o: memory of hp 400 Hz filter */ + float *mem_syn_hf_enc, /* i/o: HF synthesis memory */ + float *mem_hf1_enc, /* i/o: HF band-pass filter memory */ + float *mem_hf2_enc, /* i/o: HF band-pass filter memory */ + const int16_t *dtxHangoverCount, + float *gain_alpha, /* i/o: smoothing gain for transitions between active and inactive frames */ + int16_t *hf_gain /* o : HF gain to be transmitted to decoder */ +) +{ + int16_t i; + float ener_hf, ener_exc, ener_input, fac, HF_syn[L_SUBFR16k], tmp, ener, scale; + float Ap[M16k + 1]; + float HF_SP[L_SUBFR16k]; + float HF_est_gain; + float HF_calc_gain; + float HF_corr_gain; + int16_t HF_gain_ind; + float dist_min, dist; + float HF[L_SUBFR16k]; /* HF excitation */ + + /* Original speech signal as reference for high band gain quantisation */ + for ( i = 0; i < L_SUBFR16k; i++ ) + { + HF_SP[i] = speech16k[i]; + } + + /*-----------------------------------------------------------------* + * generate white noise vector + *-----------------------------------------------------------------*/ + + for ( i = 0; i < L_SUBFR16k; i++ ) + { + HF[i] = (float) own_random( seed2_enc ); + } + + /*-----------------------------------------------------------------* + * calculate energy scaling factor so that white noise would have the + * same energy as exc12k8 + *-----------------------------------------------------------------*/ + + ener_exc = 0.01f; + for ( i = 0; i < L_SUBFR; i++ ) + { + ener_exc += exc[i] * exc[i]; + } + + ener_hf = 0.01f; + for ( i = 0; i < L_SUBFR16k; i++ ) + { + ener_hf += HF[i] * HF[i]; + } + + scale = (float) ( sqrt( ener_exc / ener_hf ) ); + + for ( i = 0; i < L_SUBFR16k; i++ ) + { + HF[i] *= scale; + } + + /*-----------------------------------------------------------------* + * calculate energy scaling factor to respect tilt of synth12k8 + * (tilt: 1=voiced, -1=unvoiced) + *-----------------------------------------------------------------*/ + + hp400_12k8( synth, L_SUBFR, mem_hp400_enc ); + + ener = 0.001f; + tmp = 0.001f; + for ( i = 1; i < L_SUBFR; i++ ) + { + ener += synth[i] * synth[i]; /* ener = r[0] */ + tmp += synth[i] * synth[i - 1]; /* tmp = r[1] */ + } + fac = tmp / ener; + + HF_est_gain = (float) ( 1.0f - fac ); + if ( core_brate == SID_1k75 || core_brate == FRAME_NO_DATA ) + { + /* emphasize HF noise in CNG */ + HF_est_gain *= 1.25f; /* full alignment with G.722 and AMR-WB */ + } + + if ( HF_est_gain < 0.1f ) + { + HF_est_gain = 0.1f; + } + + if ( HF_est_gain > 1.0f ) /* this condition is not in G.722.2, but in AMR-WB!*/ + { + HF_est_gain = 1.0f; + } + + /*-----------------------------------------------------------------* + * synthesis of noise: 4.8kHz..5.6kHz --> 6kHz..7kHz + *-----------------------------------------------------------------*/ + + weight_a( Aq, Ap, 0.6f, M ); + syn_filt( Ap, M, HF, HF_syn, L_SUBFR16k, mem_syn_hf_enc, 1 ); + + /*-----------------------------------------------------------------* + * high pass filtering (0.9375ms of delay = 15 samples@16k) + *-----------------------------------------------------------------*/ + + filt_6k_8k( HF_syn, L_SUBFR16k, mem_hf1_enc ); + + /* filtering of the original signal */ + filt_6k_8k( HF_SP, L_SUBFR16k, mem_hf2_enc ); + + /* check the gain difference */ + ener_input = 0.01f; + ener_hf = 0.01f; + for ( i = 0; i < L_SUBFR16k; i++ ) + { + ener_input += HF_SP[i] * HF_SP[i]; + ener_hf += HF_syn[i] * HF_syn[i]; + } + + HF_calc_gain = (float) sqrt( ener_input / ener_hf ); + + /* set energy of HF synthesis to energy of original HF: + cross-fade between HF levels in active and inactive frame in hangover period */ + + *gain_alpha *= (float) ( 10 - ( *dtxHangoverCount ) ) / 7.0f; + if ( ( 10 - ( *dtxHangoverCount ) ) > 6 ) + { + *gain_alpha = 1.0f; + } + + HF_corr_gain = ( *gain_alpha ) * HF_calc_gain + ( 1.0f - ( *gain_alpha ) ) * HF_est_gain; + HF_corr_gain /= 2.0f; /* to stay in aligned with AMR-WB legacy decoder where decoded gain is multiplied by 2 */ + + /* Quantize the correction gain */ + dist_min = 100000.0f; + HF_gain_ind = 0; + for ( i = 0; i < 16; i++ ) + { + dist = ( HF_corr_gain - HP_gain[i] ) * ( HF_corr_gain - HP_gain[i] ); + if ( dist_min > dist ) + { + dist_min = dist; + HF_gain_ind = i; + } + } + + *hf_gain = HF_gain_ind; + + return; +} + +/*-----------------------------------------------------------------------* + * Function hp400_12k8() * + * * + * 2nd order Cheb2 high pass filter with cut off frequency at 400 Hz. * + * Optimized for fixed-point to get the following frequency response : * + * * + * frequency : 0Hz 100Hz 200Hz 300Hz 400Hz 630Hz 1.5kHz 3kHz * + * dB loss : -infdB -30dB -20dB -10dB -3dB +6dB +1dB 0dB * + * * + * Algorithm : * + * * + * y[i] = b[0]*x[i] + b[1]*x[i-1] + b[2]*x[i-2] * + * + a[1]*y[i-1] + a[2]*y[i-2]; * + * * + * short b[3] = {3660, -7320, 3660}; in Q12 * + * short a[3] = {4096, 7320, -3540}; in Q12 * + * * + * float --> b[3] = {0.893554687, -1.787109375, 0.893554687}; * + * a[3] = {1.000000000, 1.787109375, -0.864257812}; * + *-----------------------------------------------------------------------*/ + +static void hp400_12k8( + float signal[], /* i/o: signal */ + const int16_t lg, /* i : length of signal */ + float mem[] /* i/o: filter memory [4] */ +) +{ + int16_t i; + float x0, x1, x2; + float yy0, yy1, y2; + + yy1 = mem[0]; + y2 = mem[1]; + x0 = mem[2]; + x1 = mem[3]; + for ( i = 0; i < lg; i++ ) + { + x2 = x1; + x1 = x0; + x0 = signal[i]; + yy0 = yy1 * a_hp400[1] + y2 * a_hp400[2] + x0 * b_hp400[0] + x1 * b_hp400[1] + x2 * b_hp400[2]; + + signal[i] = yy0; + y2 = yy1; + yy1 = yy0; + } + + mem[0] = yy1; + mem[1] = y2; + mem[2] = x0; + mem[3] = x1; + + return; +} + +/*-------------------------------------------------------------------* + * filt_6k_7k: + * + * 15th order band pass 6kHz to 7kHz FIR filter. + * + * frequency :4kHz 5kHz 5.5kHz 6kHz 6.5kHz 7kHz 7.5kHz 8kHz + * dB loss : -60dB -45dB -13dB -3dB 0dB -3dB -13dB -45dB + * (gain=4.0) + *-------------------------------------------------------------------*/ + +static void filt_6k_8k( + float signal[], /* i/o: signal */ + const int16_t lg, /* i : signal length */ + float mem[] /* i/o: filter memory */ +) +{ + int16_t i, j; + float s, x[L_FRAME48k / NB_SUBFR + ( L_FIR - 1 )]; + + for ( i = 0; i < ( L_FIR - 1 ); i++ ) + { + x[i] = mem[i]; + } + + for ( i = 0; i < lg; i++ ) + { + x[i + ( L_FIR - 1 )] = signal[i]; + } + + for ( i = 0; i < lg; i++ ) + { + s = 0.0; + for ( j = 0; j < L_FIR; j++ ) + { + s += x[i + j] * fir_6k_8k[j]; + } + + signal[i] = (float) ( s * 1.0f ); + } + + for ( i = 0; i < ( L_FIR - 1 ); i++ ) + { + mem[i] = x[i + lg]; + } + + return; +} diff --git a/lib_enc/hq_classifier_enc.c b/lib_enc/hq_classifier_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..1df92357d09afdbc9349e4c0812f2773bda48681 --- /dev/null +++ b/lib_enc/hq_classifier_enc.c @@ -0,0 +1,625 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*-----------------------------------------------------------------* + * Local constants + *-----------------------------------------------------------------*/ + +#define SHARP_DIST_THRES 22.2f +#define HALF_WIN_LENGTH 10 +#define L_SPEC_HB 320 +#define PEAK_THRESHOLD 0.1f +#define LOW_COUNT_THRESHOLD 220 + + +/*-----------------------------------------------------------------* + * Local function prototypes + *-----------------------------------------------------------------*/ + +static void hvq_classifier( const float *input, int16_t *prev_Npeaks, int16_t *prev_peaks, int16_t *hqswb_clas, int16_t *Npeaks, int16_t *peaks, const int32_t core_brate, const int16_t last_core, float *nf_gains, int16_t *hvq_hangover, float *pe_gains ); +static int16_t hf_spectrum_sparseness( Encoder_State *st, const float *coefs ); + +/*--------------------------------------------------------------------------* + * hq_classifier_enc() + * + * HQ mode selector (decision_matrix) + *--------------------------------------------------------------------------*/ + +/*! r: Consumed bits */ +int16_t hq_classifier_enc( + Encoder_State *st, /* i/o: encoder state structure */ + const int16_t length, /* i : Frame length */ + const float *coefs, /* i : Spectral coefficients */ + const int16_t is_transient, /* i : Transient flag */ + int16_t *Npeaks, /* o : Number of identified peaks */ + int16_t *peaks, /* o : Peak indices */ + float *pe_gains, /* o : Peak gains */ + float *nf_gains, /* o : Noise-fill gains */ + int16_t *hqswb_clas /* o : HQ class */ +) +{ + int16_t bits; + int32_t max_brate; + int16_t harmonic_decision; + + HQ_ENC_HANDLE hHQ_core = st->hHQ_core; + + max_brate = HQ_32k; + if ( st->element_mode > EVS_MONO ) + { + max_brate = HQ_48k; + } + + *hqswb_clas = HQ_NORMAL; + bits = 1; + if ( is_transient ) + { + *hqswb_clas = HQ_TRANSIENT; + } + + if ( length == L_SPEC32k || length == L_SPEC48k ) + { + if ( st->core_brate <= max_brate ) + { + + if ( !is_transient && st->bwidth == st->last_bwidth ) + { + /* Detect HQ_HARMONIC mode */ + *hqswb_clas = peak_avrg_ratio( st->total_brate, coefs, NUMC_N + 96, &hHQ_core->mode_count, &hHQ_core->mode_count1 ); + + harmonic_decision = hf_spectrum_sparseness( st, coefs ); + + if ( *hqswb_clas == HQ_HARMONIC && !harmonic_decision ) + { + *hqswb_clas = HQ_NORMAL; + } + else + { + /* Detect HQ_HVQ mode */ + hvq_classifier( coefs, &hHQ_core->prev_Npeaks, hHQ_core->prev_peaks, hqswb_clas, Npeaks, peaks, st->core_brate, st->last_core, nf_gains, &hHQ_core->hvq_hangover, pe_gains ); + } + } + bits = 2; + } + } + else if ( length == L_SPEC16k_EXT || length == L_SPEC48k_EXT ) + { + bits = 0; /* HQ_NORMAL only -- no signaling needed */ + } + + /* write signaling info to the bitstream */ + push_indice( st->hBstr, IND_HQ_SWB_CLAS, *hqswb_clas, bits ); + + if ( st->core_brate <= HQ_32k && *hqswb_clas == HQ_NORMAL ) + { + if ( length == L_SPEC32k ) + { + *hqswb_clas = HQ_GEN_SWB; + } + else if ( length == L_SPEC48k ) + { + *hqswb_clas = HQ_GEN_FB; + } + } + + return bits; +} + +/*--------------------------------------------------------------------------* + * peak_avrg_ratio() + * + * Classify the input signal and decide if it has a harmonic structure + *--------------------------------------------------------------------------*/ + +/*! r: hqswb_clas */ +int16_t peak_avrg_ratio( + const int32_t total_brate, /* i : total bitrate */ + const float *input_hi, /* i : input signal */ + const int16_t N, /* i : number of coefficients */ + int16_t *mode_count, /* i/o: HQ_HARMONIC mode count */ + int16_t *mode_count1 /* i/o: HQ_NORMAL mode count */ +) +{ + float mean, peak, sharp; + int16_t i, j, q, k, k1, hqswb_clas; + float input_abs[L_FRAME32k]; + + for ( i = 96; i < N; i++ ) + { + input_abs[i] = (float) fabs( input_hi[i] ); + } + + hqswb_clas = HQ_NORMAL; + + k = 0; + k1 = 0; + q = 96; + for ( i = 3; i < 17; i++ ) + { + peak = 0.0f; + mean = EPSILON; + for ( j = 0; j < 32; j++, q++ ) + { + mean += input_abs[q]; + + if ( input_abs[q] > peak ) + { + peak = input_abs[q]; + } + } + + sharp = 32 * peak / mean; + + if ( i < 8 ) + { + if ( sharp > 4.5 ) + { + k += 1; + } + } + else + { + if ( sharp > 3.6 && peak > 10 ) + { + k1 += 1; + } + } + } + + if ( k + k1 >= 10 && k1 > 5 ) + { + if ( *mode_count < 8 ) + { + ( *mode_count )++; + } + + if ( *mode_count1 > 0 ) + { + ( *mode_count1 )--; + } + } + else + { + if ( *mode_count > 0 ) + { + ( *mode_count )--; + } + + if ( *mode_count1 < 8 ) + { + ( *mode_count1 )++; + } + } + if ( ( k + k1 >= 5 && k1 > 2 && total_brate < HQ_BWE_CROSSOVER_BRATE && total_brate > HQ_16k40 ) || ( ( ( k + k1 >= 10 && k1 > 5 ) || *mode_count >= 5 ) && *mode_count1 < 5 ) ) + { + hqswb_clas = HQ_HARMONIC; + } + + return hqswb_clas; +} + + +/*--------------------------------------------------------------------------* + * hvq_classifier() + * + * Classification of spectral content for HQ_HVQ mode + *--------------------------------------------------------------------------*/ + +static void hvq_classifier( + const float *input, /* i : input signal */ + int16_t *prev_Npeaks, /* i/o: Peak number memory */ + int16_t *prev_peaks, /* i/o: Peak indices memory */ + int16_t *hqswb_clas, /* i/o: HQ class */ + int16_t *Npeaks, /* o : Number of peaks */ + int16_t *peaks, /* o : Peak indices */ + const int32_t core_brate, /* i : Core bitrate */ + const int16_t last_core, /* i : Last core used */ + float *nf_gains, /* o : Noisefloor gains */ + int16_t *hvq_hangover, /* i/o: Mode-switch hangover */ + float *pe_gains /* o : peak gains */ +) +{ + const float *p_adj; + float sharp_dist; + float nf, pe, d, peak, thr_tmp, m; + float input_abs[L_FRAME32k], thr[L_FRAME16k]; + float pe_mean[HVQ_NSUB_32k], nf_mean[HVQ_NSUB_32k]; + float sharp[HVQ_NSUB_32k]; + + int16_t num_sharp_bands, i, j, k, q, peak_th, nsub, pindx, N, offset; + int16_t num_peak_cands, high, low; + int16_t peak_cand_idx[HVQ_THRES_BIN_32k], avail_peaks[HVQ_NSUB_32k]; + + if ( *hqswb_clas == HQ_HARMONIC && last_core != ACELP_CORE && last_core != AMR_WB_CORE ) + { + set_f( thr, 0.0f, L_FRAME16k ); + + if ( core_brate < HQ_BWE_CROSSOVER_BRATE ) + { + nsub = HVQ_NSUB_24k; + } + else + { + nsub = HVQ_NSUB_32k; + } + + N = nsub * HVQ_BW; + + for ( i = 0; i < N; i++ ) + { + input_abs[i] = (float) fabs( input[i] ); + } + + *Npeaks = 0; + nf = 800; + pe = 800; + num_sharp_bands = 0; + k = 0; + q = 0; + sharp_dist = 0; + + /* Find peak threshold */ + for ( i = 0; i < nsub; i++ ) + { + peak = 0.0f; + nf_mean[i] = EPSILON; + pe_mean[i] = EPSILON; + for ( j = 0; j < HVQ_BW; j++, q++ ) + { + d = input_abs[q]; + + if ( d > nf ) + { + nf = HVQ_NF_WEIGHT1 * nf + ( 1 - HVQ_NF_WEIGHT1 ) * d; + } + else + { + nf = HVQ_NF_WEIGHT2 * nf + ( 1 - HVQ_NF_WEIGHT2 ) * d; + } + + if ( d > pe ) + { + pe = HVQ_PE_WEIGHT1 * pe + ( 1 - HVQ_PE_WEIGHT1 ) * d; + } + else + { + pe = HVQ_PE_WEIGHT2 * pe + ( 1 - HVQ_PE_WEIGHT2 ) * d; + } + + nf_mean[i] += nf; + pe_mean[i] += pe; + + if ( d > peak ) + { + peak = d; + } + } + + nf_mean[i] /= HVQ_BW; + pe_mean[i] /= HVQ_BW; + + + thr_tmp = (float) pow( pe_mean[i] / nf_mean[i], HVQ_THR_POW ) * nf_mean[i]; + set_f( &thr[k], thr_tmp, HVQ_BW ); + k += HVQ_BW; + + sharp[i] = peak / nf_mean[i]; + sharp_dist += sharp[i] - HVQ_SHARP_THRES; + + if ( sharp[i] > HVQ_SHARP_THRES ) + { + num_sharp_bands++; + } + } + + /* Estimate noise floor gains */ + offset = nsub % 2; + for ( i = 0; i < 2 * ( nsub / 2 ); i++ ) + { + nf_gains[( 2 * i + 1 ) / nsub] += nf_mean[i + offset]; + pe_gains[( 2 * i + 1 ) / nsub] += pe_mean[i + offset]; + } + + for ( i = 0; i < HVQ_NF_GROUPS; i++ ) + { + nf_gains[i] /= nsub / HVQ_NF_GROUPS; + pe_gains[i] /= nsub / HVQ_NF_GROUPS; + } + + /* Allocate available peaks */ + for ( i = 0; i < nsub; i++ ) + { + avail_peaks[i] = HVQ_PA_PEAKS_SHARP1; + if ( nf_mean[i] < nf_gains[( 2 * i + 1 ) / nsub] * HVQ_PA_FAC ) + { + if ( sharp[i] < HVQ_PA_SHARP_THRES3 ) + { + avail_peaks[i] = HVQ_PA_PEAKS_SHARP3; + } + else if ( sharp[i] < HVQ_PA_SHARP_THRES2 ) + { + avail_peaks[i] = HVQ_PA_PEAKS_SHARP2; + } + } + } + + /* Adjust threshold around previous peaks */ + for ( i = 0; i < *prev_Npeaks; i++ ) + { + j = prev_peaks[i] - 2; + k = prev_peaks[i] + 2; + p_adj = hvq_thr_adj; + + for ( q = j; q < k; q++ ) + { + thr[q] *= *p_adj++; + } + } + + num_peak_cands = 0; + + /* Remove everything below threshold for peak search */ + input_abs[0] = 0; + input_abs[1] = 0; + input_abs[N - 2] = 0; + input_abs[N - 1] = 0; + for ( i = 0; i < N - 2; i++ ) + { + if ( input_abs[i] < thr[i] ) + { + input_abs[i] = 0; + } + else + { + input_abs[num_peak_cands] = input_abs[i]; + peak_cand_idx[num_peak_cands] = i; + num_peak_cands++; + } + } + + /* maximum 27 (5+9+13) bits for additional peak */ + peak_th = (int16_t) ( ( core_brate * HVQ_PEAKS_PER_DELTA_THR + HVQ_PEAKS_PER_DELTA_THR_OFFS ) / HVQ_PEAKS_BPS_DELTA ); + + /* Find peaks */ + pindx = maximum( input_abs, num_peak_cands, &m ); + i = 0; + + while ( m > 0 && i < peak_th + 1 ) + { + if ( avail_peaks[peak_cand_idx[pindx] / HVQ_BW] > 0 ) + { + peaks[i++] = peak_cand_idx[pindx]; + avail_peaks[peak_cand_idx[pindx] / HVQ_BW]--; + } + + j = pindx - 2; + k = pindx + 2; + + if ( j < 0 ) + { + j = 0; + } + + if ( k > num_peak_cands - 1 ) + { + k = num_peak_cands - 1; + } + + low = peak_cand_idx[pindx] - 2; + high = peak_cand_idx[pindx] + 2; + + if ( low < 0 ) + { + low = 0; + } + + if ( high > N - 1 ) + { + high = N - 1; + } + + for ( q = j; q <= pindx; q++ ) + { + if ( peak_cand_idx[q] >= low ) + { + peak_cand_idx[q] = 0; + input_abs[q] = 0; + } + } + + for ( q = pindx + 1; q <= k; q++ ) + { + if ( peak_cand_idx[q] <= high ) + { + peak_cand_idx[q] = 0; + input_abs[q] = 0; + } + } + + pindx = maximum( input_abs, num_peak_cands, &m ); + } + + *Npeaks = i; + + /* decision about HQ_HVQ mode */ + if ( *Npeaks > HVQ_MIN_PEAKS ) + { + if ( num_sharp_bands > nsub - 3 && *Npeaks <= peak_th ) + { + sharp_dist /= nsub; + if ( sharp_dist <= SHARP_DIST_THRES && *hvq_hangover < 0 ) + { + ( *hvq_hangover )++; + } + else + { + *hqswb_clas = HQ_HVQ; + *hvq_hangover = 2; + } + + /* update memory */ + *prev_Npeaks = *Npeaks; + mvs2s( peaks, prev_peaks, *Npeaks ); + } + else + { + if ( *hvq_hangover > 0 ) + { + *hqswb_clas = HQ_HVQ; + ( *hvq_hangover )--; + } + else + { + *hvq_hangover = -1; + } + } + } + else + { + *hvq_hangover = -1; + } + + *Npeaks = (int16_t) ( min( ( core_brate * HVQ_PEAKS_PER_DELTA + HVQ_PEAKS_PER_DELTA_OFFS ) / HVQ_PEAKS_BPS_DELTA, *Npeaks ) ); + } + else + { + *prev_Npeaks = 0; + *hvq_hangover = 0; + } + + return; +} +/*--------------------------------------------------------------------------* + * hf_spectrum_sparseness() + * + * Detection of sparse spectrum in high band for activation of harmonic + * modes HQ_HARMONIC and HQ_HVQ + *--------------------------------------------------------------------------*/ +/*! r: Harmonic decision for high band */ +static int16_t hf_spectrum_sparseness( + Encoder_State *st, /* i/o: encoder state structure */ + const float *coefs /* i : MDCT spectrum */ +) +{ + int16_t i; + float thr; + int16_t low_count; + float A[L_SPEC_HB]; + float Amax; + float movmean; + float inv_rms; + float crest; + float crest_mod; + const float *p_num; + float *crest_lp; + float *crest_mod_lp; + int16_t result; + + crest_lp = &st->hHQ_core->crest_lp; + crest_mod_lp = &st->hHQ_core->crest_mod_lp; + + result = TRUE; + if ( st->element_mode != EVS_MONO ) + { + for ( i = 0; i < L_SPEC_HB; i++ ) + { + A[i] = (float) fabsf( coefs[i + L_SPEC_HB] ); + } + low_count = 0; + inv_rms = 0.0f; + crest_mod = 0.0f; + maximum( A, L_SPEC_HB, &Amax ); + thr = Amax * PEAK_THRESHOLD; + movmean = 0.0f; /* avoid uninitialized warning */ + p_num = &inv_tbl[HALF_WIN_LENGTH + 1]; /* Table for division 1./(11:21) */ + for ( i = 0; i < L_SPEC_HB; i++ ) + { + inv_rms += A[i] * A[i]; + if ( A[i] < thr ) + { + low_count += 1; + } + if ( i <= HALF_WIN_LENGTH ) + { + if ( i == 0 ) + { + movmean = sum_f( &A[0], i + HALF_WIN_LENGTH + 1 ) * ( *p_num ); + } + else + { + p_num++; + movmean = movmean + ( A[i + HALF_WIN_LENGTH] - movmean ) * ( *p_num ); + } + } + else + { + if ( L_SPEC_HB <= i + HALF_WIN_LENGTH ) + { + p_num--; + movmean = movmean + ( movmean - A[i - HALF_WIN_LENGTH - 1] ) * ( *p_num ); + } + else + { + movmean = movmean + ( A[i + HALF_WIN_LENGTH] - A[i - HALF_WIN_LENGTH - 1] ) * ( *p_num ); + } + } + if ( crest_mod < movmean ) + { + crest_mod = movmean; + } + } + inv_rms = 1.0f / (float) sqrtf( inv_rms / L_SPEC_HB ); + crest = Amax * inv_rms; + crest_mod = crest_mod * inv_rms; + *crest_lp = HQ_CREST_FAC_SM * ( *crest_lp ) + ( 1.0f - HQ_CREST_FAC_SM ) * crest; + *crest_mod_lp = HQ_CREST_FAC_SM * ( *crest_mod_lp ) + ( 1.0f - HQ_CREST_FAC_SM ) * crest_mod; + + if ( ( ( *crest_lp ) > HQ_CREST_THRESHOLD ) && ( ( *crest_mod_lp ) > HQ_CREST_MOD_THRESHOLD ) && ( low_count > LOW_COUNT_THRESHOLD ) ) + { + result = FALSE; + } + } + + return result; +} diff --git a/lib_enc/hq_core_enc.c b/lib_enc/hq_core_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..261e022025f2e6b15a08ecbe99a957163ed0f651 --- /dev/null +++ b/lib_enc/hq_core_enc.c @@ -0,0 +1,329 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------------- + * hq_core_enc() + * + * HQ core encoder + *--------------------------------------------------------------------------*/ + +void hq_core_enc( + Encoder_State *st, /* i/o: encoder state structure */ + const float *audio, /* i : input audio signal */ + const int16_t input_frame_orig, /* i : frame length */ + const int16_t hq_core_type, /* i : HQ core type */ + const int16_t Voicing_flag, /* i : Voicing flag for FER method selection */ + const int16_t vad_hover_flag /* i : VAD hangover flag */ +) +{ + int16_t i, is_transient, num_bits, extra_unused; + float wtda_audio[2 * L_FRAME48k]; + float t_audio[L_FRAME48k_EXT]; + int16_t inner_frame, input_frame, L_frame; + float ener_match; + int16_t left_overlap, right_overlap; + int16_t L_spec, overlap, nz, tcx_offset; + float Aq_old[M + 1]; + float output[L_FRAME16k]; + + BSTR_ENC_HANDLE hBstr = st->hBstr; + + push_wmops( "hq_core_enc" ); + + set_f( t_audio, 0, L_FRAME48k ); + st->Nb_ACELP_frames = 0; + + /* set input_frame length */ + input_frame = input_frame_orig; + + /* Sanity check, it should never happen at the encoder side (no BFI) */ + if ( st->hTcxCfg->tcx_curr_overlap_mode == FULL_OVERLAP ) + { + st->hTcxCfg->tcx_last_overlap_mode = ALDO_WINDOW; + } + else + { + st->hTcxCfg->tcx_last_overlap_mode = st->hTcxCfg->tcx_curr_overlap_mode; + } + st->hTcxCfg->tcx_curr_overlap_mode = ALDO_WINDOW; + + /*-------------------------------------------------------------------------- + * Preprocessing in the first HQ frame after ACELP frame + * Find the number of bits for PVQ coding + * Write signaling information + *--------------------------------------------------------------------------*/ + + num_bits = (int16_t) ( st->total_brate / FRAMES_PER_SEC ); + extra_unused = 0; + + /*-------------------------------------------------------------------------- + * Detect signal transition + *--------------------------------------------------------------------------*/ + + is_transient = detect_transient( st, audio, input_frame ); + + if ( st->element_mode > EVS_MONO && ( st->last_core == ACELP_CORE || st->last_core == AMR_WB_CORE ) ) + { + /*-------------------------------------------------------------------------- + * IVAS switching frame + *--------------------------------------------------------------------------*/ + + L_spec = input_frame; + left_overlap = -1; + right_overlap = -1; + + WindowSignal( st->hTcxCfg, st->hTcxCfg->tcx_offsetFB, TRANSITION_OVERLAP, FULL_OVERLAP, &left_overlap, &right_overlap, st->hTcxEnc->speech_TCX, &L_spec, wtda_audio, 1, 1 ); + + TCX_MDCT( wtda_audio, t_audio, left_overlap, L_spec - ( left_overlap + right_overlap ) / 2, right_overlap, st->element_mode ); + + inner_frame = inner_frame_tbl[st->bwidth]; + L_spec = l_spec_ext_tbl[st->bwidth]; + is_transient = 0; + } + else + { + /*-------------------------------------------------------------------------- + * Windowing and time-domain aliasing + * DCT transform + *--------------------------------------------------------------------------*/ + + wtda( audio, wtda_audio, NULL, st->hTcxCfg->tcx_last_overlap_mode, st->hTcxCfg->tcx_curr_overlap_mode, input_frame ); + + if ( st->last_core == ACELP_CORE || st->last_core == AMR_WB_CORE ) + { + /* Preprocessing in the first HQ frame after ACELP frame */ + core_switching_hq_prepare_enc( st, &num_bits, input_frame, wtda_audio, audio ); + + /* During ACELP->HQ core switching, limit the HQ core bitrate to 48kbps */ + if ( num_bits > HQ_48k / FRAMES_PER_SEC ) + { + extra_unused = num_bits - (int16_t) ( HQ_48k / FRAMES_PER_SEC ); + num_bits = (int16_t) ( HQ_48k / FRAMES_PER_SEC ); + } + } + + direct_transform( wtda_audio, t_audio, is_transient, input_frame, st->element_mode ); + + /* scale coefficients to their nominal level (8kHz) */ + if ( input_frame != NORM_MDCT_FACTOR ) + { + ener_match = (float) sqrt( (float) NORM_MDCT_FACTOR / (float) input_frame ); + + for ( i = 0; i < input_frame; i++ ) + { + t_audio[i] *= ener_match; + } + } + + /* limit encoded band-width according to the command-line OR BWD limitation */ + inner_frame = inner_frame_tbl[st->bwidth]; + L_spec = l_spec_tbl[st->bwidth]; + + if ( input_frame > inner_frame ) + { + if ( is_transient ) + { + for ( i = 1; i < NUM_TIME_SWITCHING_BLOCKS; i++ ) + { + mvr2r( t_audio + i * input_frame / NUM_TIME_SWITCHING_BLOCKS, t_audio + i * inner_frame / NUM_TIME_SWITCHING_BLOCKS, inner_frame / NUM_TIME_SWITCHING_BLOCKS ); + } + } + + set_f( t_audio + inner_frame, 0.0f, input_frame - inner_frame ); + } + } + + /* subtract signaling bits */ + num_bits -= hBstr->nb_bits_tot; + + /*-------------------------------------------------------------------------- + * High-band gain control in case of BWS + *--------------------------------------------------------------------------*/ + + if ( st->bwidth_sw_cnt > 0 ) + { + if ( is_transient ) + { + for ( i = 0; i < NUM_TIME_SWITCHING_BLOCKS; i++ ) + { + v_multc( t_audio + i * inner_frame / NUM_TIME_SWITCHING_BLOCKS + L_FRAME16k / NUM_TIME_SWITCHING_BLOCKS, (float) ( st->bwidth_sw_cnt ) / (float) BWS_TRAN_PERIOD, t_audio + i * inner_frame / NUM_TIME_SWITCHING_BLOCKS + L_FRAME16k / NUM_TIME_SWITCHING_BLOCKS, inner_frame / NUM_TIME_SWITCHING_BLOCKS - L_FRAME16k / NUM_TIME_SWITCHING_BLOCKS ); + } + } + else + { + v_multc( t_audio + L_FRAME16k, (float) ( st->bwidth_sw_cnt ) / (float) BWS_TRAN_PERIOD, t_audio + L_FRAME16k, L_spec - L_FRAME16k ); + } + } + + /*-------------------------------------------------------------------------- + * Classify whether to put extra bits for FER mitigation + *--------------------------------------------------------------------------*/ + + if ( ( st->last_core == TCX_20_CORE || st->last_core == TCX_10_CORE || st->last_core == HQ_CORE ) && st->core_brate > MINIMUM_RATE_TO_ENCODE_VOICING_FLAG ) + { + if ( Voicing_flag > 0 ) + { + push_indice( hBstr, IND_HQ_VOICING_FLAG, 1, 1 ); + num_bits -= 1; + } + else + { + push_indice( hBstr, IND_HQ_VOICING_FLAG, 0, 1 ); + num_bits -= 1; + } + } + + /*-------------------------------------------------------------------------- + * Transform-domain encoding + *--------------------------------------------------------------------------*/ + + if ( hq_core_type == LOW_RATE_HQ_CORE ) + { + /* HQ low rate encoder */ + hq_lr_enc( st, t_audio, inner_frame, &num_bits, is_transient ); + } + else + { + /* HQ high rate encoder */ + hq_hr_enc( st, t_audio, L_spec, &num_bits, is_transient, vad_hover_flag ); + } + + /* write all unused bits to the bitstream */ + num_bits += extra_unused; + + while ( num_bits >= 16 ) + { + push_indice( hBstr, IND_UNUSED, 0, 16 ); + num_bits -= 16; + } + + if ( num_bits != 0 ) + { + push_indice( hBstr, IND_UNUSED, 0, num_bits ); + } + + if ( st->element_mode > EVS_MONO && ( st->last_core == ACELP_CORE || st->last_core == AMR_WB_CORE ) ) + { + overlap = st->hTcxCfg->tcx_mdct_window_length; + nz = NS2SA( st->sr_core, N_ZERO_MDCT_NS ); + L_frame = (int16_t) ( st->L_frame + st->hTcxCfg->tcx_offset - st->hTcxCfg->lfacNext ); + tcx_offset = st->hTcxCfg->lfacNext; + set_f( Aq_old, 0, M + 1 ); /* Dummy filter */ + Aq_old[0] = 1; + + /* Code taken from InternalTCXDecoder() */ + TCX_MDCT_Inverse( t_audio, wtda_audio, overlap, L_frame - overlap, overlap, st->element_mode ); + + /* Window current frame */ + tcx_windowing_synthesis_current_frame( wtda_audio, st->hTcxCfg->tcx_aldo_window_2, st->hTcxCfg->tcx_mdct_window_half, st->hTcxCfg->tcx_mdct_window_minimum, overlap, /*st->hTcxCfg->tcx_mdct_window_length*/ st->hTcxCfg->tcx_mdct_window_half_length, st->hTcxCfg->tcx_mdct_window_min_length, st->last_core == ACELP_CORE, st->hTcxCfg->tcx_last_overlap_mode, /*left mode*/ st->hTcxEnc->acelp_zir, st->hTcxEnc->Txnq, NULL, Aq_old, st->hTcxCfg->tcx_mdct_window_trans, st->L_frame >> 1, tcx_offset < 0 ? -tcx_offset : 0, st->last_core, 0, 0 ); + + /*Compute windowed synthesis in case of switching to ALDO windows in next frame*/ + mvr2r( wtda_audio + L_frame - nz, st->hTcxEnc->old_out, nz + overlap ); + set_zero( st->hTcxEnc->old_out + nz + overlap, nz ); + + tcx_windowing_synthesis_past_frame( st->hTcxEnc->old_out + nz, st->hTcxCfg->tcx_aldo_window_1_trunc, st->hTcxCfg->tcx_mdct_window_half, st->hTcxCfg->tcx_mdct_window_minimum, overlap, st->hTcxCfg->tcx_mdct_window_half_length, st->hTcxCfg->tcx_mdct_window_min_length, FULL_OVERLAP ); + + for ( i = 0; i < nz; i++ ) + { + st->hTcxEnc->old_out[nz + overlap + i] = wtda_audio[L_frame - 1 - i] * st->hTcxCfg->tcx_aldo_window_1_trunc[-1 - i]; + } + mvr2r( wtda_audio + ( overlap >> 1 ) - tcx_offset, output, st->L_frame ); + } + else + { + ener_match = (float) sqrt( (float) L_FRAME16k / (float) NORM_MDCT_FACTOR ); + v_multc( t_audio, ener_match, t_audio, inner_frame ); + + inverse_transform( t_audio, wtda_audio, is_transient, L_FRAME16k, inner_frame, st->element_mode ); + + window_ola( wtda_audio, output, st->hTcxEnc->old_out, L_FRAME16k, st->hTcxCfg->tcx_last_overlap_mode, st->hTcxCfg->tcx_curr_overlap_mode, 0, 0, NULL ); + } + + if ( st->element_mode > EVS_MONO ) + { + /* Store LB synthesis in case of switch to ACELP */ + mvr2r( output, st->hLPDmem->old_exc, L_FRAME16k ); + } + + pop_wmops(); + + return; +} + +/*-------------------------------------------------------------------* + * hq_core_enc_init() + * + * Initialize HQ core state structure + *-------------------------------------------------------------------*/ + +void HQ_core_enc_init( + HQ_ENC_HANDLE hHQ_core /* i/o: HQ core data handle */ +) +{ + hHQ_core->mode_count = 0; + hHQ_core->mode_count1 = 0; + + hHQ_core->hq_generic_speech_class = 0; + + hHQ_core->prev_Npeaks = 0; + set_s( hHQ_core->prev_peaks, 0, HVQ_MAX_PEAKS ); + hHQ_core->hvq_hangover = 0; + hHQ_core->prev_hqswb_clas = HQ_NORMAL; + set_s( hHQ_core->prev_SWB_peak_pos, 0, SPT_SHORTEN_SBNUM ); + + set_s( hHQ_core->prev_frm_index, -1, NB_SWB_SUBBANDS_HAR_SEARCH_SB ); + hHQ_core->prev_frm_hfe2 = 0; + hHQ_core->prev_stab_hfe2 = 0; + hHQ_core->prev_ni_ratio = 0.5f; + set_f( hHQ_core->prev_En_sb, 0.0f, NB_SWB_SUBBANDS ); + set_s( hHQ_core->last_bitalloc_max_band, 0, 2 ); + set_f( hHQ_core->last_ni_gain, 0, BANDS_MAX ); + set_f( hHQ_core->last_env, 0, BANDS_MAX ); + hHQ_core->last_max_pos_pulse = 0; + + hHQ_core->crest_lp = HQ_CREST_THRESHOLD; + hHQ_core->crest_mod_lp = HQ_CREST_MOD_THRESHOLD; + + return; +} diff --git a/lib_enc/hq_env_enc.c b/lib_enc/hq_env_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..c0a63e2628dc5187fbb28b24782def95fad2ef11 --- /dev/null +++ b/lib_enc/hq_env_enc.c @@ -0,0 +1,561 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "prot.h" +#include "rom_com.h" +#include "rom_enc.h" +#include "wmc_auto.h" + +/*--------------------------------------------------------------------------------------* + * encode_envelope_indices() + * + * Encode envelope indices + *--------------------------------------------------------------------------------------*/ + +/*! r: Number of bits if flag_pack=0,0 if flag_pack=1 */ +int16_t encode_envelope_indices( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const int16_t num_sfm, /* i : Number of subbands */ + const int16_t numnrmibits, /* i : Bitrate of fall-back coding mode */ + int16_t *difidx, /* i/o: Diff indices/encoded diff indices */ + int16_t *LCmode, /* o : Coding mode if flag_pack=0, i : if flag_pack=1 */ + const int16_t flag_pack, /* i : indicator of packing or estimating bits */ + const int16_t flag_HQ2, /* i : indicator of HQ2 core */ + const int16_t is_transient /* i : transient flag */ +) +{ + int16_t bits; + int16_t prevj; + int16_t hcode_l; + int16_t i, j; + int16_t difidx_flag; + int16_t index_max, index_min, index_rad; + int16_t difidx_org[NB_SFM]; /* length of this buffer is max(BANDS_MAX,NB_SFM) */ + int16_t m, r; + int16_t v, k; + + set_s( difidx_org, 0, NB_SFM ); + difidx_flag = 0; + + /*------------------------------------------------------------------* + * Check Huffman encoding for QNorm indices + *------------------------------------------------------------------*/ + + /* LC mode index is changed to synchronize LR-MDCT signaling */ + /* LC mode 0 = Context based coding */ + /* LC mode 1 = resized huffman coding */ + /* LC mode 2 = normal Huffman Coding */ + /* LC mode 3 = bit packing */ + if ( flag_pack == 0 ) + { + if ( is_transient && flag_HQ2 == LOW_RATE_HQ_CORE_TRAN ) + { + bits = 0; + index_max = 0; + index_min = 31; + for ( i = 0; i < num_sfm; i++ ) + { + if ( difidx[i] > index_max ) + { + index_max = difidx[i]; + } + if ( difidx[i] < index_min ) + { + index_min = difidx[i]; + } + } + if ( index_min > 10 && index_max < 22 ) + { + for ( i = 1; i < num_sfm; i++ ) + { + j = difidx[i]; + bits += huffsizn_tran[j]; + } + } + hcode_l = 0; + *LCmode = 0; + prevj = difidx[0] + OFFSET_NORM; + /* LC mode 0 = Context based coding */ + for ( i = 1; i < num_sfm; i++ ) + { + j = difidx[i]; + if ( prevj > HTH_NORM ) + { + /* above */ + hcode_l += huffsizn_n[31 - j]; + } + else + { + if ( prevj < LTH_NORM ) + { + /* less */ + hcode_l += huffsizn_n[j]; + } + else + { + /* equal */ + hcode_l += huffsizn_e[j]; + } + } + prevj = j; + } + if ( hcode_l >= bits && bits != 0 ) + { + /* LC mode 1 Transient Huffman Coding */ + *LCmode = 1; + hcode_l = bits; + } + } + else + { + /* Check bits if LC mode == 3 -> Check bits if LC mode == 0 */ + hcode_l = 0; + prevj = difidx[0] + OFFSET_NORM; + for ( i = 1; i < num_sfm; i++ ) + { + j = difidx[i]; + if ( prevj > HTH_NORM ) + { + /* above */ + hcode_l += huffsizn_n[31 - j]; + } + else + { + if ( prevj < LTH_NORM ) + { + /* less */ + hcode_l += huffsizn_n[j]; + } + else + { + /* equal */ + hcode_l += huffsizn_e[j]; + } + } + prevj = j; + } + + *LCmode = 0; + + /* LR-MDCT core doesn't have coding mode 2 and 3 */ + if ( flag_HQ2 == NORMAL_HQ_CORE ) + { + /* Check bits if LC mode == 1 -> Check bits if LC mode == 2 */ + bits = 0; + for ( i = 1; i < num_sfm; i++ ) + { + j = difidx[i]; + bits += huffsizn[j]; + } + + /*------------------------------------------------------------------------------* + * comparing bit expenses of coding mode 2 with that of the optimal coding mode + *------------------------------------------------------------------------------*/ + + if ( hcode_l > bits ) + { + *LCmode = 2; + hcode_l = bits; + } + } + + /* Check bits if LC mode == 2 -> Check bits if LC mode == 1 */ + bits = 0; + index_max = 0; + index_min = 31; + for ( i = 1; i < num_sfm; i++ ) + { + difidx_org[i] = difidx[i]; + } + + difidx_flag = 0; + for ( i = 2; i < num_sfm; i++ ) + { + if ( difidx_org[i - 1] > 17 ) + { + difidx[i] = difidx_org[i] + min( ( difidx_org[i - 1] - 17 ), 3 ); + if ( difidx[i] > 31 ) + { + difidx_flag = 1; + break; + } + } + + if ( difidx_org[i - 1] < 13 ) + { + difidx[i] = difidx_org[i] + max( ( difidx_org[i - 1] - 13 ), -3 ); + if ( difidx[i] < 0 ) + { + difidx_flag = 1; + break; + } + } + } + + index_rad = 0; + if ( difidx_flag != 1 ) + { + for ( i = 1; i < num_sfm; i++ ) + { + if ( difidx[i] > index_max ) + { + index_max = difidx[i]; + } + + if ( difidx[i] < index_min ) + { + index_min = difidx[i]; + } + } + + index_rad = max( ( 15 - index_min ), ( index_max - 15 ) ); + + if ( index_rad <= HUFF_THR ) + { + for ( i = 1; i < num_sfm; i++ ) + { + j = difidx[i]; + bits += resize_huffsizn[j]; + } + + /*------------------------------------------------------------------* + * comparing bit expenses of coding mode 1 with that of coding mode 0 + *------------------------------------------------------------------*/ + + if ( hcode_l > bits ) + { + hcode_l = bits; + *LCmode = 1; + } + } + } + + /* LR-MDCT core doesn't have coding mode 2 and 3 */ + if ( flag_HQ2 == NORMAL_HQ_CORE ) + { + /*------------------------------------------------------------------------------* + * comparing bit expenses of coding mode 3 with that of the optimal coding mode + *------------------------------------------------------------------------------*/ + + if ( hcode_l >= numnrmibits ) + { + hcode_l = numnrmibits; + *LCmode = 3; + } + } + + if ( ( *LCmode != 1 && flag_HQ2 == NORMAL_HQ_CORE ) || flag_HQ2 == LOW_RATE_HQ_CORE ) + { + for ( i = 2; i < num_sfm; i++ ) + { + difidx[i] = difidx_org[i]; + } + } + } + } + else + { + if ( flag_HQ2 == LOW_RATE_HQ_CORE_TRAN || flag_HQ2 == LOW_RATE_HQ_CORE ) + { + push_indice( hBstr, IND_HQ2_DENG_HMODE, *LCmode, BITS_DE_HMODE ); + push_indice( hBstr, IND_HQ2_DIFF_ENERGY, difidx[0], BITS_DE_FCOMP ); + } + else + { + push_indice( hBstr, IND_LC_MODE, *LCmode, 2 ); + push_indice( hBstr, IND_YNRM, difidx[0], NORM0_BITS ); + } + + if ( is_transient && flag_HQ2 == LOW_RATE_HQ_CORE_TRAN ) + { + hcode_l = 0; + if ( *LCmode == 1 ) + { + /* LC mode 0 Transient Huffman Coding */ + for ( i = 1; i < num_sfm; i++ ) + { + j = difidx[i]; + m = huffnorm_tran[j]; + r = huffsizn_tran[j]; + v = 0; + + /* Bit reverse */ + for ( k = 0; k < r; k++ ) + { + v <<= 1; + v |= m & 1; + m >>= 1; + } + + push_indice( hBstr, IND_HQ2_DIFF_ENERGY, v, r ); + } + } + else + { + /* LC mode 1 context based Coding */ + prevj = difidx[0] + OFFSET_NORM; + for ( i = 1; i < num_sfm; i++ ) + { + j = difidx[i]; + + if ( prevj > HTH_NORM ) + { + /* above */ + r = huffsizn_n[31 - j]; + m = huffnorm_n[31 - j]; + } + else + { + if ( prevj < LTH_NORM ) + { + /* less */ + r = huffsizn_n[j]; + m = huffnorm_n[j]; + } + else + { + /* equal */ + r = huffsizn_e[j]; + m = huffnorm_e[j]; + } + } + push_indice( hBstr, IND_HQ2_DIFF_ENERGY, m, r ); + prevj = j; + } + } + } + else + { + hcode_l = 0; + if ( *LCmode == 0 ) + { + /* LC mode 3 -> LC mode 0 */ + prevj = difidx[0] + OFFSET_NORM; + for ( i = 1; i < num_sfm; i++ ) + { + j = difidx[i]; + + if ( prevj > HTH_NORM ) + { + /* above */ + r = huffsizn_n[31 - j]; + m = huffnorm_n[31 - j]; + } + else + { + if ( prevj < LTH_NORM ) + { + /* less */ + r = huffsizn_n[j]; + m = huffnorm_n[j]; + } + else + { + /* equal */ + r = huffsizn_e[j]; + m = huffnorm_e[j]; + } + } + + if ( flag_HQ2 == LOW_RATE_HQ_CORE ) + { + push_indice( hBstr, IND_HQ2_DIFF_ENERGY, m, r ); + } + else + { + push_indice( hBstr, IND_YNRM, m, r ); + } + + prevj = j; + } + } + else if ( *LCmode == 1 ) + { + if ( flag_HQ2 == 1 ) + { + index_max = 0; + index_min = 31; + for ( i = 1; i < num_sfm; i++ ) + { + difidx_org[i] = difidx[i]; + } + + for ( i = 2; i < num_sfm; i++ ) + { + if ( difidx_org[i - 1] > 17 ) + { + difidx[i] = difidx_org[i] + min( ( difidx_org[i - 1] - 17 ), 3 ); + if ( difidx[i] > 31 ) + { + difidx_flag = 1; + break; + } + } + + if ( difidx_org[i - 1] < 13 ) + { + difidx[i] = difidx_org[i] + max( ( difidx_org[i - 1] - 13 ), -3 ); + if ( difidx[i] < 0 ) + { + difidx_flag = 1; + break; + } + } + } + + if ( difidx_flag != 1 ) + { + for ( i = 1; i < num_sfm; i++ ) + { + if ( difidx[i] > index_max ) + { + index_max = difidx[i]; + } + + if ( difidx[i] < index_min ) + { + index_min = difidx[i]; + } + } + + index_rad = max( ( 15 - index_min ), ( index_max - 15 ) ); + + if ( index_rad <= HUFF_THR ) + { + for ( i = 1; i < num_sfm; i++ ) + { + j = difidx[i]; + } + } + } + } + + /* LC mode 2 -> LC mode 1 */ + for ( i = 1; i < num_sfm; i++ ) + { + j = difidx[i]; + + m = resize_huffnorm[j]; + r = resize_huffsizn[j]; + v = 0; + + /* Bit reverse */ + for ( k = 0; k < r; k++ ) + { + v <<= 1; + v |= m & 1; + m >>= 1; + } + + if ( flag_HQ2 ) + { + push_indice( hBstr, IND_HQ2_DIFF_ENERGY, v, r ); + } + else + { + push_indice( hBstr, IND_YNRM, v, r ); + } + } + } + else if ( *LCmode == 2 ) + { + /* LC mode 1 -> LC mode 2 */ + for ( i = 1; i < num_sfm; i++ ) + { + j = difidx[i]; + + m = huffnorm[j]; + r = huffsizn[j]; + + push_indice( hBstr, IND_YNRM, m, r ); + } + } + else + { + for ( i = 1; i < num_sfm; i++ ) + { + push_indice( hBstr, IND_YNRM, difidx[i], NORMI_BITS ); + } + } + } + } + + return hcode_l; +} + +/*--------------------------------------------------------------------------* + * diff_envelope_coding() + * + * Create differential code of norm indices + *--------------------------------------------------------------------------*/ + +void diff_envelope_coding( + const int16_t is_transient, /* i : transient indicator */ + const int16_t num_env_bands, /* i : number of envelope bands to code */ + const int16_t start_norm, /* i : start of envelope coding */ + int16_t *ynrm, /* i/o: quantization indices for norms */ + int16_t *normqlg2, /* i/o: quantized norms */ + int16_t *difidx /* o : differential code */ +) +{ + int16_t i; + int16_t idxbuf[NB_SFM]; + int16_t normbuf[NB_SFM]; + + /* Differential coding for indices of quantized norms */ + if ( is_transient ) + { + /* Reorder quantization indices and quantized norms */ + reordernorm( ynrm, normqlg2, idxbuf, normbuf, num_env_bands ); + diffcod( num_env_bands, idxbuf, &difidx[1] ); + difidx[0] = idxbuf[0]; + recovernorm( idxbuf, ynrm, normqlg2, num_env_bands ); + } + else + { + diffcod( num_env_bands, &ynrm[start_norm], &difidx[1] ); + difidx[0] = ynrm[start_norm]; + + for ( i = start_norm; i < start_norm + num_env_bands; i++ ) + { + normqlg2[i] = dicnlg2[ynrm[i]]; + } + } + + return; +} diff --git a/lib_enc/hq_hr_enc.c b/lib_enc/hq_hr_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..1855f26df1306ebdc27d1b4c3079d2fed72dedd6 --- /dev/null +++ b/lib_enc/hq_hr_enc.c @@ -0,0 +1,251 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "prot.h" +#include "rom_enc.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*--------------------------------------------------------------------------* + * hq_hr_enc() + * + * HQ high rate encoding routine + *--------------------------------------------------------------------------*/ + +void hq_hr_enc( + Encoder_State *st, /* i/o: encoder state structure */ + float *t_audio, /* i/o: transform-domain coefficients */ + const int16_t length, /* i : length of spectrum */ + int16_t *num_bits, /* i/o: number of available bits */ + const int16_t is_transient, /* i : transient flag */ + const int16_t vad_hover_flag /* i : VAD hangover flag */ +) +{ + int16_t nb_sfm; + int16_t sum, hcode_l; + int16_t difidx[NB_SFM]; + int16_t normqlg2[NB_SFM], ynrm[NB_SFM]; + int16_t nf_idx; + int16_t LCmode; + int16_t shape_bits, num_sfm, numnrmibits; + int16_t hqswb_clas; + int16_t num_env_bands; + int16_t Npeaks, start_norm; + int16_t difidx_org[NB_SFM]; + int16_t R[NB_SFM]; + int16_t peaks[HVQ_MAX_PEAKS]; + int16_t sfmsize[NB_SFM], sfm_start[NB_SFM], sfm_end[NB_SFM]; + int16_t npulses[NB_SFM], maxpulse[NB_SFM]; + int16_t Rsubband[NB_SFM]; /* Q3 */ + float t_audio_q[L_SPEC48k_EXT]; + float nf_gains[HVQ_NF_GROUPS], pe_gains[HVQ_NF_GROUPS]; + float noise_level[HVQ_BWE_NOISE_BANDS]; + int16_t hq_generic_offset; + float hq_generic_fenv[HQ_FB_FENV]; + int16_t hq_generic_exc_clas = 0; + int16_t core_sfm; + int16_t har_freq_est1 = 0, har_freq_est2 = 0; + int16_t flag_dis = 1; + const int16_t *subband_search_offset; + int16_t wBands[2]; + int16_t b_delta_env; + float att; + HQ_ENC_HANDLE hHQ_core = st->hHQ_core; + BSTR_ENC_HANDLE hBstr = st->hBstr; + + /*------------------------------------------------------------------* + * Initializations + *------------------------------------------------------------------*/ + + Npeaks = 0; + set_s( npulses, 0, NB_SFM ); + set_s( maxpulse, 0, NB_SFM ); + set_s( difidx_org, 0, NB_SFM ); + set_f( t_audio_q, 0.0f, L_FRAME48k ); + set_f( nf_gains, 0.0f, HVQ_NF_GROUPS ); + set_f( pe_gains, 0.0f, HVQ_NF_GROUPS ); + + /*------------------------------------------------------------------* + * Classification + *------------------------------------------------------------------*/ + + *num_bits -= hq_classifier_enc( st, length, t_audio, is_transient, &Npeaks, peaks, pe_gains, nf_gains, &hqswb_clas ); + + + /*------------------------------------------------------------------* + * Set quantization parameters + *------------------------------------------------------------------*/ + + hq_configure( length, hqswb_clas, st->core_brate, &num_sfm, &nb_sfm, &start_norm, &num_env_bands, &numnrmibits, &hq_generic_offset, sfmsize, sfm_start, sfm_end ); + + /*------------------------------------------------------------------* + * Transient frame handling + *------------------------------------------------------------------*/ + + /* Interleave MLT coefficients of 4 sub-vectors in case of transient frame */ + if ( is_transient ) + { + interleave_spectrum( t_audio, length ); + } + + if ( st->element_mode == IVAS_CPE_DFT || st->element_mode == IVAS_CPE_TD ) + { + calculate_hangover_attenuation_gain( st, &att, vad_hover_flag ); + if ( att != 1.0f ) + { + v_multc( t_audio, att, t_audio, sfm_end[num_sfm - 1] ); + } + } + + /*------------------------------------------------------------------* + * Scalar quantization of norms + * Encode norm indices + *------------------------------------------------------------------*/ + + /* calculate and quantize norms */ + calc_norm( t_audio, ynrm, normqlg2, start_norm, num_env_bands, sfmsize, sfm_start ); + + /* create differential code of quantized norm indices */ + diff_envelope_coding( is_transient, num_env_bands, start_norm, ynrm, normqlg2, difidx ); + + /* Find norm coding mode and calculate number of bits */ + hcode_l = encode_envelope_indices( hBstr, num_env_bands, numnrmibits, difidx, &LCmode, 0, NORMAL_HQ_CORE, is_transient ); + *num_bits -= hcode_l + NORM0_BITS + FLAGS_BITS; + + /* Encode norm indices */ + encode_envelope_indices( hBstr, num_env_bands, numnrmibits, difidx, &LCmode, 1, NORMAL_HQ_CORE, is_transient ); + + /*------------------------------------------------------------------* + * HQ GENERIC BWE encoding + *------------------------------------------------------------------*/ + + if ( hqswb_clas == HQ_GEN_SWB || hqswb_clas == HQ_GEN_FB ) + { + hq_generic_hf_encoding( t_audio, hq_generic_fenv, hq_generic_offset, st, &hq_generic_exc_clas, length ); + if ( hq_generic_exc_clas == HQ_GENERIC_SP_EXC ) + { + ( *num_bits )++; /* conditional 1 bit saving for representing FD3 BWE excitation class */ + } + map_hq_generic_fenv_norm( hqswb_clas, hq_generic_fenv, ynrm, normqlg2, num_env_bands, nb_sfm, hq_generic_offset ); + } + + /*------------------------------------------------------------------* + * Bit allocation + *------------------------------------------------------------------*/ + + hq_bit_allocation( st->core_brate, length, hqswb_clas, num_bits, normqlg2, nb_sfm, sfmsize, noise_level, R, Rsubband, &sum, &core_sfm, num_env_bands ); + + /*------------------------------------------------------------------* + * Normalize coefficients with quantized norms + *------------------------------------------------------------------*/ + if ( hqswb_clas != HQ_HVQ ) + { + if ( hqswb_clas == HQ_GEN_SWB || hqswb_clas == HQ_GEN_FB ) + { + b_delta_env = calc_nor_delta_hf( hBstr, t_audio, ynrm, Rsubband, num_env_bands, nb_sfm, sfmsize, sfm_start, core_sfm ); + sum -= b_delta_env; + } + normalizecoefs( t_audio, ynrm, nb_sfm, sfm_start, sfm_end ); + } + + /*------------------------------------------------------------------* + * Quantize/code spectral fine structure using PVQ or HVQ + *------------------------------------------------------------------*/ + + if ( hqswb_clas == HQ_HVQ ) + { + sum = hvq_enc( hBstr, st->bwidth, st->core_brate, *num_bits, Npeaks, ynrm, R, peaks, nf_gains, noise_level, pe_gains, t_audio, t_audio_q ); + *num_bits -= sum; + } + else + { + shape_bits = pvq_core_enc( hBstr, t_audio, t_audio_q, sum, nb_sfm, sfm_start, sfm_end, sfmsize, Rsubband, R, npulses, maxpulse, HQ_CORE ); + *num_bits += ( sum - shape_bits ); + } + + if ( hqswb_clas == HQ_HVQ || hqswb_clas == HQ_HARMONIC ) + { + subband_search_offset = subband_search_offsets_13p2kbps_Har; + wBands[0] = SWB_SB_BW_LEN0_16KBPS_HAR; + wBands[1] = SWB_SB_BW_LEN1_16KBPS_HAR; + + har_est( t_audio_q, 300, &har_freq_est1, &har_freq_est2, &flag_dis, &hHQ_core->prev_frm_hfe2, subband_search_offset, wBands, &hHQ_core->prev_stab_hfe2 ); + + hHQ_core->prev_frm_hfe2 = har_freq_est2; + } + + /* reset LR-HQ memories */ + hHQ_core->prev_frm_hfe2 = 0; /*reset*/ + hHQ_core->prev_stab_hfe2 = 0; + + nf_idx = 0; + if ( !is_transient && hqswb_clas != HQ_HVQ && !( length == L_FRAME16k && st->core_brate <= HQ_32k ) ) + { + if ( hqswb_clas == HQ_GEN_SWB || hqswb_clas == HQ_GEN_FB ) + { + nf_idx = noise_adjust( t_audio, R, sfm_start, sfm_end, max( core_sfm, num_env_bands - 1 ) ); + push_indice( hBstr, IND_NF_IDX, nf_idx, 2 ); + } + else + { + nf_idx = noise_adjust( t_audio, R, sfm_start, sfm_end, core_sfm ); + push_indice( hBstr, IND_NF_IDX, nf_idx, 2 ); + } + } + + + /* updates */ + hHQ_core->prev_hqswb_clas = hqswb_clas; + + /* Prepare synthesis for LB generation in case of switch to ACELP */ + if ( hqswb_clas != HQ_HVQ ) + { + apply_envelope_enc( t_audio_q, ynrm, num_sfm, sfm_start, sfm_end ); + } + + if ( is_transient ) + { + de_interleave_spectrum( t_audio_q, length ); + } + + mvr2r( t_audio_q, t_audio, length ); + + + return; +} diff --git a/lib_enc/hq_lr_enc.c b/lib_enc/hq_lr_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..8aa39964b0d96ea7590b0c11a396ef057349db03 --- /dev/null +++ b/lib_enc/hq_lr_enc.c @@ -0,0 +1,1772 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "rom_enc.h" +#include "rom_com.h" +#include "prot.h" +#include "stl.h" +#include "basop_util.h" +#include "wmc_auto.h" + + +/*--------------------------------------------------------------------------* + * Local function prototypes + *--------------------------------------------------------------------------*/ + +static int16_t small_symbol_enc( BSTR_ENC_HANDLE hBstr, const int16_t *qbidx, const int16_t bands, int16_t *hLCmode, const int16_t flag_pack, const int16_t is_transient ); + +static int16_t small_symbol_enc_tran( BSTR_ENC_HANDLE hBstr, const int16_t *qbidx, const int16_t bands, int16_t *hLCmode, const int16_t flag_pack, const int16_t is_transient ); + +static float band_energy_quant( BSTR_ENC_HANDLE hBstr, const float *t_audio, const int16_t band_start[], const int16_t band_end[], float band_energy[], const int16_t bands, const Word32 L_qint, const Word16 eref_fx, const int16_t is_transient ); + +static int16_t p2a_threshold_quant( BSTR_ENC_HANDLE hBstr, const float *t_audio, const int16_t band_start[], const int16_t band_end[], const int16_t band_width[], const int16_t bands, const int16_t p2a_bands, const float p2a_th, int16_t *p2a_flags ); + +static void mdct_spectrum_fine_gain_enc( BSTR_ENC_HANDLE hBstr, const float ybuf[], float y2[], const int16_t band_start[], const int16_t band_end[], const int16_t k_sort[], const int16_t bands, const Word32 L_qint, const int16_t Ngq, const int16_t gqlevs, const int16_t gqbits ); + + +/*--------------------------------------------------------------------------* + * spt_shorten_domain_set() + * + * Track the spectral peak based on peak -avg analysis + *--------------------------------------------------------------------------*/ + +static void spt_shorten_domain_set( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + HQ_ENC_HANDLE hHQ_core, /* i/o: HQ core encoder handle */ + const float t_audio[], /* i : input spectrum */ + const int16_t p2a_flags[], /* i : p2a anlysis information */ + const int16_t new_band_start[], /* i : new band start position */ + const int16_t new_band_end[], /* i : new band end position */ + const int16_t new_band_width[], /* i : new subband band width */ + const int16_t bands, /* i : total number of subbands */ + int16_t band_start[], /* i/o: band start position */ + int16_t band_end[], /* i/o: band end position */ + int16_t band_width[], /* i : sub band band width */ + int16_t *bit_budget /* i/o: bit budget */ +) +{ + int16_t i, j, k; + int16_t kpos; + float max_y2; + int16_t max_y2_pos; + int16_t spt_shorten_flag[SPT_SHORTEN_SBNUM]; + + kpos = 0; + j = 0; + for ( k = bands - SPT_SHORTEN_SBNUM; k < bands; k++ ) + { + if ( p2a_flags[k] == 1 ) + { + spt_shorten_flag[j] = 0; + if ( hHQ_core->prev_SWB_peak_pos[kpos] != 0 ) + { + max_y2 = 0.0f; + max_y2_pos = 0; + for ( i = band_start[k]; i <= band_end[k]; i++ ) + { + if ( max_y2 < fabs( t_audio[i] ) ) + { + max_y2 = (float) fabs( t_audio[i] ); + max_y2_pos = i; + } + } + if ( max_y2_pos >= new_band_start[j] && max_y2_pos <= new_band_end[j] ) + { + band_start[k] = new_band_start[j]; + band_end[k] = new_band_end[j]; + band_width[k] = new_band_width[j]; + spt_shorten_flag[j] = 1; + } + } + push_indice( hBstr, IND_HQ2_SPT_SHORTEN, spt_shorten_flag[j], 1 ); + *bit_budget -= 1; + } + + kpos++; + j++; + } + + return; +} + +/*--------------------------------------------------------------------------* + * hq_lr_enc() + * + * HQ low rate encoding routine + *--------------------------------------------------------------------------*/ + +void hq_lr_enc( + Encoder_State *st, /* i/o: encoder state structure */ + float t_audio[], /* i/o: transform-domain coefs. */ + const int16_t inner_frame, /* i : inner frame length */ + int16_t *num_bits, /* i/o: number of available bits */ + const int16_t is_transient /* i : transient flag */ +) +{ + int16_t i, k1, k2; + int16_t bit_budget, pbits; + int16_t bands, length, ni_seed, gqlevs, gqbits, Ngq, p2a_bands; + int16_t p2a_flags[BANDS_MAX]; + int16_t band_start[BANDS_MAX], band_end[BANDS_MAX], band_width[BANDS_MAX]; + float band_energy[BANDS_MAX], Rk[BANDS_MAX]; + Word32 Rk_fx[BANDS_MAX]; + float ebits; + float p2a_th, ni_coef, ni_pd_th, pd_thresh, ld_slope; + Word32 L_qint; /* Q29 */ + Word16 eref_fx; /* Q10 */ + Word16 bit_alloc_weight_fx; /* Q13 */ + int16_t k_sort[BANDS_MAX]; + int16_t npulses[BANDS_MAX]; + int32_t inp_vector[L_FRAME48k]; + float y2[L_FRAME48k]; + float y2_ni[L_FRAME48k]; + int16_t hqswb_clas; + int16_t lowlength; + int16_t highlength; + float m[L_FRAME32k]; + int16_t har_bands; + float Ep[BANDS_MAX], enerH = 0.0f, enerL = 0.0f; + int16_t lowband, highband, bw_low = 0, bw_high = 20; + float band_energy_tmp[BANDS_MAX]; + int32_t bwe_br; + int16_t trans_bit, p2a_flags_tmp[BANDS_MAX]; + int16_t adjustFlag = 0; + int16_t prev_SWB_peak_pos_tmp[SPT_SHORTEN_SBNUM]; + int16_t k, j; + int16_t flag_spt; + int16_t org_band_start[SPT_SHORTEN_SBNUM]; + int16_t org_band_end[SPT_SHORTEN_SBNUM]; + int16_t org_band_width[SPT_SHORTEN_SBNUM]; + int16_t new_band_start[SPT_SHORTEN_SBNUM]; + int16_t new_band_end[SPT_SHORTEN_SBNUM]; + int16_t new_band_width[SPT_SHORTEN_SBNUM]; + int16_t bws_cnt = 0; + Word32 L_tmp, L_tmp2, L_tmp3; + Word16 exp, tmp, exp2, tmp1, tmp2, tmp3, alpha_fx, frac1; + Word32 enerH_fx; + Word32 enerL_fx; + Word32 Ep_fx[BANDS_MAX]; + Word32 Ep_avrg_fx, Ep_vari_fx; + Word32 Ep_avrgL_fx; + Word32 Ep_peak_fx; + Word32 Ep_tmp_fx[BANDS_MAX]; + Word16 gama_fx; /*Q15 0.85f; */ + Word16 beta_fx; /*Q14 1.05f; */ + Word32 L_band_energy[BANDS_MAX], L_band_energy_tmp[BANDS_MAX]; + UWord16 lo; + Word16 Q_band_energy; +#ifdef BASOP_NOGLOB + Flag Overflow; +#endif /* BASOP_NOGLOB */ + + BSTR_ENC_HANDLE hBstr = st->hBstr; + HQ_ENC_HANDLE hHQ_core = st->hHQ_core; + + set_f( y2, 0.0f, L_FRAME48k ); + set_l( inp_vector, 0, inner_frame ); + flag_spt = 0; + set_s( prev_SWB_peak_pos_tmp, 0, SPT_SHORTEN_SBNUM ); + + bwe_br = st->core_brate; + hqswb_clas = HQ_NORMAL; + if ( st->bwidth == SWB && ( bwe_br == HQ_16k40 || bwe_br == HQ_13k20 ) ) + { + if ( is_transient == 1 ) + { + hqswb_clas = HQ_TRANSIENT; + } + else + { + /* classification of HQ_HARMONIC and HQ_NORMAL frames for SWB BWE */ + hqswb_clas = peak_avrg_ratio( st->total_brate, t_audio, NUMC_N, &hHQ_core->mode_count, &hHQ_core->mode_count1 ); + } + + /* write the classification information into the bitstream */ + push_indice( hBstr, IND_HQ2_SWB_CLAS, hqswb_clas, 2 ); + ( *num_bits ) -= 2; + + if ( hqswb_clas == HQ_NORMAL ) + { + flag_spt = 1; + } + } + else + { + /* write the transient bit into the bitstream */ + push_indice( hBstr, IND_HQ2_SWB_CLAS, is_transient, 1 ); + + /* subtract one bit for the transient flag */ + ( *num_bits )--; + } + + /* Configure encoder for different bandwidths, bitrates, etc. */ + hq2_core_configure( inner_frame, *num_bits, is_transient, &bands, &length, band_width, band_start, band_end, &L_qint, &eref_fx, &bit_alloc_weight_fx, &gqlevs, &Ngq, &p2a_bands, &p2a_th, &pd_thresh, &ld_slope, &ni_coef, &ni_pd_th, bwe_br ); + + highlength = band_end[bands - 1]; + har_bands = bands; + + if ( st->bwidth == SWB && is_transient == 0 && ( bwe_br == HQ_16k40 || bwe_br == HQ_13k20 ) ) + { + /* reserve bits for HQ_NORMAL and HQ_HARMONIC modes */ + if ( hqswb_clas == HQ_NORMAL || hqswb_clas == HQ_HARMONIC ) + { + ( *num_bits ) -= get_usebit_npswb( hqswb_clas ); + } + } + + if ( ( bwe_br == HQ_16k40 || bwe_br == HQ_13k20 ) && st->bwidth == SWB ) + { + if ( hHQ_core->prev_hqswb_clas != HQ_NORMAL ) + { + j = 0; + for ( k = bands - SPT_SHORTEN_SBNUM; k < bands; k++ ) + { + hHQ_core->prev_SWB_peak_pos[j] = 0; + j++; + } + } + } + + /* Check if input frame is larger than coded bandwidth */ + if ( inner_frame > length && is_transient ) + { + /* If so, collapse transient frame (4 short transforms) to remove uncoded coefficients */ + for ( i = 1; i < NUM_TIME_SWITCHING_BLOCKS; i++ ) + { + k1 = i * length / NUM_TIME_SWITCHING_BLOCKS; + k2 = i * inner_frame / NUM_TIME_SWITCHING_BLOCKS; + + mvr2r( &t_audio[k2], &t_audio[k1], length / NUM_TIME_SWITCHING_BLOCKS ); + } + } + + /* Spectral energy calculation/quantization */ + ebits = band_energy_quant( hBstr, t_audio, band_start, band_end, band_energy, bands, L_qint, eref_fx, is_transient ); + + for ( i = 0; i < bands; i++ ) + { + L_band_energy[i] = (Word32) ( band_energy[i] * pow( 2.0f, SWB_BWE_LR_Qbe ) ); + } + + /* First pass bit budget for TCQ of spectral band information */ + gqbits = (int16_t) log2_f( (float) gqlevs ); + bit_budget = ( *num_bits ) - (int16_t) ceil( ebits ) - Ngq * gqbits; + + pbits = 0; + if ( st->bwidth == SWB && ( bwe_br == HQ_16k40 || bwe_br == HQ_13k20 ) ) + { + if ( hqswb_clas == HQ_HARMONIC ) + { + set_s( p2a_flags, 1, har_bands ); + } + else + { + /* High band tonality detector based on per band peak-to-average ratio */ + pbits = p2a_threshold_quant( hBstr, t_audio, band_start, band_end, band_width, bands, p2a_bands, p2a_th, p2a_flags ); + bit_budget -= pbits; + + if ( hqswb_clas == HQ_NORMAL ) + { + return_bits_normal2( &bit_budget, p2a_flags, bands, bits_lagIndices_modeNormal ); + } + } + } + else + { + /* High band tonality detector based on per band peak-to-average ratio */ + pbits = p2a_threshold_quant( hBstr, t_audio, band_start, band_end, band_width, bands, p2a_bands, p2a_th, p2a_flags ); + bit_budget -= pbits; + } + + if ( flag_spt == 1 ) + { + /* initialize the desired parameters for SPT */ + spt_shorten_domain_band_save( bands, band_start, band_end, band_width, org_band_start, org_band_end, org_band_width ); + spt_shorten_domain_pre( band_start, band_end, hHQ_core->prev_SWB_peak_pos, bands, bwe_br, new_band_start, new_band_end, new_band_width ); + spt_shorten_domain_set( hBstr, hHQ_core, t_audio, p2a_flags, new_band_start, new_band_end, new_band_width, bands, band_start, band_end, band_width, &bit_budget ); + } + +#define WMC_TOOL_SKIP + /* Estimate number of bits per band */ + Q_band_energy = SWB_BWE_LR_Qbe; + FOR( i = 0; i < bands; i++ ) + { + L_tmp = L_shl( L_band_energy[i], sub( 16, Q_band_energy ) ); /*Q16 */ + + frac1 = L_Extract_lc( L_tmp, &exp ); /* Extract exponent of L_tmp */ + L_tmp = Pow2( 30, frac1 ); + exp = sub( exp, 30 ); + Ep_fx[i] = L_shl( L_tmp, sub( exp, 6 ) ); /* Q -6 */ + Ep[i] = (float) ( Ep_fx[i] / pow( 2.0, -6 ) ); + } + + FOR( i = 0; i < bands; i++ ) + { + L_tmp2 = Ep_fx[i]; + L_tmp = L_max( 1, L_tmp2 ); + exp = norm_l( L_tmp ); + tmp = extract_h( L_shl( L_tmp, exp ) ); + + L_tmp3 = (Word32) band_width[i]; + exp2 = norm_l( L_tmp3 ); + tmp2 = extract_h( L_shl( L_tmp3, exp2 ) ); + + exp2 = sub( exp, exp2 ); /* Denormalize and substract */ + + tmp3 = sub( tmp2, tmp ); + IF( tmp3 > 0 ) + { + tmp2 = shr( tmp2, 1 ); + } + IF( tmp3 > 0 ) + { + exp2 = add( exp2, 1 ); + } + tmp = div_s( tmp2, tmp ); + L_tmp = L_deposit_h( tmp ); + L_tmp = Isqrt_lc1( L_tmp, &exp2 ); + move32(); /*Q(31-exp2) */ + Ep_tmp_fx[i] = L_shr( L_tmp, sub( 15, exp2 ) ); /*Q13 */ + } +#undef WMC_TOOL_SKIP + + if ( is_transient == 0 && inner_frame == L_FRAME8k && st->core_brate <= ACELP_13k20 ) + { +#define WMC_TOOL_SKIP + lowband = 6; + move16(); + trans_bit = 2; + move16(); + bit_budget = sub( bit_budget, trans_bit ); + gama_fx = 27852; /*Q15 0.85f; */ + beta_fx = 17203; + move16(); /*Q14 1.05f; */ + set_s( &p2a_flags_tmp[bands - trans_bit], 0, 2 ); + + IF( st->core_brate == ACELP_13k20 ) + { + beta_fx = 13107; + move16(); /*14 1.25f; */ + gama_fx = 31130; + move16(); /*0.95f; */ + mvs2s( &p2a_flags[sub( bands, trans_bit )], &p2a_flags_tmp[sub( bands, trans_bit )], trans_bit ); + } + + /* calculate the the low band/high band energy and the variance/avrage of the envelopes */ + Ep_vari_fx = 0; + move32(); + Ep_avrg_fx = 0; + move32(); + Ep_avrgL_fx = 0; + move32(); + Ep_peak_fx = 0; + move32(); + FOR( i = 0; i < bands; i++ ) + { + IF( sub( i, lowband ) >= 0 ) + { + Ep_vari_fx = L_add( Ep_vari_fx, L_abs( L_sub( Ep_tmp_fx[i], Ep_tmp_fx[sub( i, 1 )] ) ) ); /*Q15 */ + Ep_avrg_fx = L_add( Ep_avrg_fx, Ep_tmp_fx[i] ); /*Q15 */ + } + ELSE + { +#ifdef BASOP_NOGLOB + Ep_avrgL_fx = L_add_o( Ep_avrgL_fx, Ep_tmp_fx[i], &Overflow ); /*Q15 */ +#else + Ep_avrgL_fx = L_add( Ep_avrgL_fx, Ep_tmp_fx[i] ); /*Q15 */ +#endif + IF( L_sub( Ep_tmp_fx[i], Ep_peak_fx ) > 0 ) + { + Ep_peak_fx = Ep_tmp_fx[i]; + move32(); /*Q15 */ + } + } + } + /* modify the last p2a_bands subbands band_energies */ + k = bands; + mvl2l( L_band_energy, L_band_energy_tmp, k ); /*Q_band_energy */ + Mpy_32_16_ss( Ep_peak_fx, 24576, &L_tmp, &lo ); + Mpy_32_16_ss( Ep_peak_fx, shl( sub( bands, lowband ), 9 ), &L_tmp2, &lo ); + Mpy_32_16_ss( Ep_avrg_fx, 1126, &L_tmp3, &lo ); + + IF( ( ( L_sub( L_tmp, L_shr( Ep_avrgL_fx, 1 ) ) < 0 && st->core_brate == ACELP_13k20 ) || st->core_brate < ACELP_13k20 ) && + L_sub( L_tmp2, L_tmp3 ) < 0 && L_sub( L_tmp2, L_shr( Ep_avrg_fx, 7 ) ) > 0 ) + { + FOR( i = lowband; i < bands; i++ ) + { + Mpy_32_16_ss( Ep_avrg_fx, 24576, &L_tmp, &lo ); + IF( L_sub( L_shr( Ep_tmp_fx[i], 1 ), L_tmp ) < 0 ) + { + Mpy_32_16_ss( Ep_peak_fx, sub( bands, lowband ), &L_tmp, &lo ); + tmp = extract_h( L_shl( L_tmp, 14 ) ); /*Q-4 */ + IF( tmp != 0 ) + { + exp = norm_s( tmp ); + tmp = shl( tmp, exp ); /*Q(exp) */ + tmp = div_s( 16384, tmp ); /*Q(15+14-exp=29-exp) */ + exp = sub( 29, exp ); + } + ELSE + { + /*when the divisor is zero, happens rarely*/ + tmp = 0x7fff; + move16(); + exp = 0; + move16(); + } + Mpy_32_16_ss( Ep_avrg_fx, tmp, &L_tmp, &lo ); + L_tmp = L_shl( L_tmp, sub( 13, exp ) ); /*Q(13+exp-15 +13-exp +4 = 15) */ + L_tmp2 = L_add( L_tmp, 13107 ); /*15 */ + tmp2 = extract_l( L_min( L_max( L_tmp2, 16384 ), gama_fx ) ); /*15 = 15 */ + Mpy_32_16_ss( L_band_energy_tmp[i], tmp2, &L_band_energy_tmp[i], &lo ); + } + } + } + ELSE + { + j = 0; + FOR( i = sub( bands, trans_bit ); i < bands; i++ ) + { + alpha_fx = 16384; + move16(); /*Q14 */ + IF( sub( p2a_flags_tmp[i], 1 ) == 0 ) + { + Mpy_32_16_ss( Ep_tmp_fx[i], sub( bands, lowband ), &L_tmp, &lo ); + tmp = extract_h( L_shl( L_tmp, 14 ) ); /*Q-4 */ + IF( tmp != 0 ) + { + exp = norm_s( tmp ); + tmp = shl( tmp, exp ); /*Q(exp) */ + tmp = div_s( 16384, tmp ); /*Q(15+14-exp=29-exp) */ + exp = sub( 29, exp ); + } + ELSE + { + /*when the divisor is zero, happens rarely*/ + tmp = 0x7fff; + move16(); + exp = 0; + move16(); + } + Mpy_32_16_ss( Ep_vari_fx, 3277, &L_tmp, &lo ); + Mpy_32_16_ss( L_tmp, tmp, &L_tmp, &lo ); + L_tmp = L_shl( L_tmp, sub( 12, exp ) ); /*Q(13+exp-15 +12-exp +4 = 14) */ + + tmp2 = extract_h( Ep_avrg_fx ); /*Q13-16=-3 */ + IF( tmp2 != 0 ) + { + exp = norm_s( tmp2 ); + tmp2 = shl( tmp2, exp ); /*Q(exp) */ + tmp2 = div_s( 16384, tmp2 ); /*Q(15+14-exp=29-exp) */ + exp = sub( 29, exp ); + } + ELSE + { + tmp2 = 0x7fff; + move16(); + exp = 0; + move16(); + } + Mpy_32_16_ss( Ep_vari_fx, 6554, &L_tmp2, &lo ); + Mpy_32_16_ss( L_tmp2, tmp2, &L_tmp2, &lo ); + L_tmp2 = L_shl( L_tmp2, sub( 13, exp ) ); /*Q(13+exp-15 +13-exp +3 = 14) */ + L_tmp = L_min( L_tmp, L_tmp2 ); /*14 */ + tmp = extract_l( L_min( L_tmp, 13107 ) ); /*14 */ + alpha_fx = add( 16384, tmp ); + } + IF( sub( hHQ_core->last_bitalloc_max_band[j++], 1 ) == 0 ) + { + Mpy_32_16_ss( Ep_tmp_fx[i], sub( bands, lowband ), &L_tmp, &lo ); + tmp = extract_h( L_shl( L_tmp, 14 ) ); /*Q-2 */ + IF( tmp != 0 ) + { + exp = norm_s( tmp ); + tmp = shl( tmp, exp ); /*Q(exp) */ + tmp = div_s( 16384, tmp ); /*Q(15+14-exp=29-exp) */ + exp = sub( 29, exp ); + } + ELSE + { + tmp = 0x7fff; + move16(); + exp = 0; + move16(); + } + Mpy_32_16_ss( Ep_avrg_fx, tmp, &L_tmp, &lo ); +#ifndef BASOP_NOGLOB + L_tmp = L_shl( L_tmp, sub( 14, exp ) ); /*Q(13+exp-15 +14-exp+2 = 14) */ + L_tmp = L_max( L_tmp, 16384 ); /*14 */ + tmp = extract_l( L_min( L_tmp, beta_fx ) ); /*14 */ + alpha_fx = shl( mult( alpha_fx, tmp ), 1 ); /*14+14-15 +1=14 */ +#else /* BASOP_NOGLOB */ + L_tmp = L_shl_o( L_tmp, sub( 14, exp ), &Overflow ); /*Q(13+exp-15 +14-exp+2 = 14) */ + L_tmp = L_max( L_tmp, 16384 ); /*14 */ + tmp = extract_l( L_min( L_tmp, beta_fx ) ); /*14 */ + alpha_fx = shl( mult( alpha_fx, tmp ), 1 ); /*14+14-15 +1=14 */ +#endif /* BASOP_NOGLOB */ + } + ELSE + { + tmp2 = extract_h( Ep_avrg_fx ); /*13 -16 =-3 */ + IF( tmp2 != 0 ) + { + exp = norm_s( tmp2 ); + tmp2 = shl( tmp2, exp ); /*Q(exp) */ + tmp2 = div_s( 16384, tmp2 ); /*Q(15+14-exp=29-exp) */ + exp = sub( 29, exp ); + } + ELSE + { + /*when the divisor is zero, happens rarely*/ + tmp2 = 0x7fff; + move16(); + exp = 0; + move16(); + } + Mpy_32_16_ss( Ep_tmp_fx[i], tmp2, &L_tmp, &lo ); + L_tmp = L_shl( L_tmp, sub( 19, exp ) ); /*Q(13+exp-15 +19-exp +3 = 20) */ + Mpy_32_16_ss( L_tmp, shl( sub( bands, lowband ), 9 ), &L_tmp, &lo ); + L_tmp = L_max( L_tmp, 13926 ); /*14 */ + tmp2 = extract_l( L_min( L_tmp, 16384 ) ); /*14 */ + alpha_fx = shl( mult( alpha_fx, tmp2 ), 1 ); /*14+14-15+1 =14 */ + } + Mpy_32_16_ss( L_band_energy_tmp[i], alpha_fx, &L_tmp, &lo ); + L_band_energy_tmp[i] = L_shl( L_tmp, 1 ); /*Q(Q_band_energy+14-15 +1= Q_band_energy) */ + } + } + lowband = 3; + move16(); + Ep_avrg_fx = 0; + move32(); + Ep_avrgL_fx = 0; + move32(); + Ep_peak_fx = 0; + move32(); + FOR( i = 0; i < bands; i++ ) + { + IF( sub( i, lowband ) >= 0 ) + { +#ifdef BASOP_NOGLOB + Ep_avrg_fx = L_add_o( Ep_avrg_fx, Ep_tmp_fx[i], &Overflow ); /*Q15 */ +#else + Ep_avrg_fx = L_add( Ep_avrg_fx, Ep_tmp_fx[i] ); /*Q15 */ +#endif + } + ELSE + { + Ep_avrgL_fx = L_add( Ep_avrgL_fx, L_shr( Ep_tmp_fx[i], 1 ) ); /*Q12 */ + IF( L_sub( Ep_tmp_fx[i], Ep_peak_fx ) > 0 ) + { + Ep_peak_fx = Ep_tmp_fx[i]; + move32(); /*Q13 */ + } + } + } + Mpy_32_16_ss( Ep_peak_fx, 28262, &L_tmp, &lo ); + Mpy_32_16_ss( Ep_avrgL_fx, 24576, &L_tmp2, &lo ); + IF( L_sub( L_shr( Ep_avrg_fx, 2 ), L_tmp2 ) > 0 && L_sub( L_shr( Ep_avrg_fx, 4 ), L_tmp2 ) < 0 && L_sub( L_tmp, Ep_avrgL_fx ) > 0 ) + { + adjustFlag = 1; + move16(); + FOR( i = 0; i < lowband; i++ ) + { + tmp = extract_h( Ep_avrgL_fx ); /*Q-4 */ + IF( tmp != 0 ) + { + exp = norm_s( tmp ); + tmp = shl( tmp, exp ); /*Q(exp) */ + tmp = div_s( 16384, tmp ); /*Q(15+14-exp=29-exp) */ + exp = sub( 29, exp ); + } + ELSE + { + /*when the divisor is zero, happens rarely*/ + tmp = 0x7fff; + move16(); + exp = 0; + move16(); + } + Mpy_32_16_ss( Ep_peak_fx, tmp, &L_tmp, &lo ); + Mpy_32_16_ss( L_tmp, lowband, &L_tmp, &lo ); + Mpy_32_16_ss( L_tmp, 18842, &L_tmp, &lo ); +#ifndef BASOP_NOGLOB + L_tmp = L_shl( L_tmp, sub( 27, exp ) ); /*Q14 0.5 */ + tmp2 = extract_l( L_min( L_tmp, 19661 ) ); /*14 */ +#else /* BASOP_NOGLOB */ + L_tmp = L_shl_o( L_tmp, sub( 27, exp ), &Overflow ); /*Q14 0.5 */ + tmp2 = extract_l( L_min( L_tmp, 19661 ) ); /*14 */ +#endif /* BASOP_NOGLOB */ + Mpy_32_16_ss( L_band_energy_tmp[i], tmp2, &L_tmp, &lo ); + L_band_energy_tmp[i] = L_shl( L_tmp, 1 ); /*Q_band_energy */ + } + } +#undef WMC_TOOL_SKIP + + for ( i = 0; i < bands; i++ ) + { + band_energy_tmp[i] = (float) ( L_band_energy_tmp[i] / pow( 2.0f, SWB_BWE_LR_Qbe ) ); + } + + hq2_bit_alloc( band_energy_tmp, bands, Rk_fx, &bit_budget, p2a_flags, bit_alloc_weight_fx, band_width, *num_bits, hqswb_clas, st->bwidth, is_transient ); + + /* encode the last p2a_bands-1 subbands bit-allocation index of the previous frame */ + for ( i = 0; i < 2; i++ ) + { + push_indice( hBstr, IND_HQ2_LAST_BA_MAX_BAND, hHQ_core->last_bitalloc_max_band[i], 1 ); + } + } + else if ( is_transient == 0 && inner_frame == L_FRAME16k ) + { +#define WMC_TOOL_SKIP + bit_budget = sub( bit_budget, 2 ); /* bits in high bands to indicate the last 2 subbands is allocated bits or not */ + FOR( i = 0; i < bands; i++ ) + { +#ifndef BASOP_NOGLOB + Ep_tmp_fx[i] = L_shl( Ep_tmp_fx[i], 2 ); +#else /* BASOP_NOGLOB */ + Ep_tmp_fx[i] = L_shl_o( Ep_tmp_fx[i], 2, &Overflow ); +#endif /* BASOP_NOGLOB */ + } + IF( st->core_brate == ACELP_13k20 ) + { + lowband = 8; + move16(); + highband = 15; + move16(); + bw_low = sub( band_start[highband], band_start[lowband] ); + bw_high = sub( add( band_end[sub( bands, 1 )], 1 ), band_start[highband] ); + } + ELSE + { + lowband = 8; + move16(); + highband = 16; + move16(); + bw_low = sub( band_start[highband], band_start[lowband] ); + bw_high = sub( add( band_end[sub( bands, 1 )], 1 ), band_start[highband] ); + } + /* calculate the the low band/high band energy and the variance/avrage of the envelopes */ + enerL_fx = 0; + move32(); + enerH_fx = 0; + move32(); + Ep_vari_fx = 0; + move32(); + Ep_avrg_fx = 0; + move32(); + FOR( i = 0; i < bands; i++ ) + { + IF( sub( i, lowband ) >= 0 && add( sub( i, bands ), p2a_bands ) < 0 ) + { + Ep_vari_fx = L_add( Ep_vari_fx, L_abs( L_sub( Ep_tmp_fx[i], Ep_tmp_fx[sub( i, 1 )] ) ) ); /*Q15 */ +#ifndef BASOP_NOGLOB + Ep_avrg_fx = L_add( Ep_avrg_fx, Ep_tmp_fx[i] ); /*Q15 */ +#else /* BASOP_NOGLOB */ + Ep_avrg_fx = L_add_o( Ep_avrg_fx, Ep_tmp_fx[i], &Overflow ); /*Q15 */ +#endif /* BASOP_NOGLOB */ + } + + IF( sub( i, highband ) >= 0 ) + { + enerH_fx = L_add( enerH_fx, L_shl( Ep_fx[i], 2 ) ); /*Q0 */ + } + ELSE IF( sub( i, lowband ) >= 0 ) + { + enerL_fx = L_add( enerL_fx, L_shl( Ep_fx[i], 2 ) ); /*Q0 */ + } + } + enerL = (float) ( enerL_fx / pow( 2.0, -4 ) ); + enerH = (float) ( enerH_fx / pow( 2.0, -4 ) ); + /* modify the last p2a_bands subbands band_energies */ + k = bands; + mvl2l( L_band_energy, L_band_energy_tmp, k ); /*Q_band_energy */ + + L_tmp = L_max( enerH_fx, enerL_fx ); + tmp = s_max( bw_low, bw_high ); + i = norm_l( L_tmp ); + j = norm_s( tmp ); + Mpy_32_16_ss( L_shl( enerH_fx, i ), shl( bw_low, j ), &L_tmp, &lo ); + Mpy_32_16_ss( L_shl( enerL_fx, i ), shl( bw_high, j ), &L_tmp2, &lo ); + L_tmp2 = L_sub( L_tmp, L_tmp2 ); + + FOR( i = sub( bands, p2a_bands ); i < bands; i++ ) + { + IF( sub( p2a_flags[i], 1 ) == 0 || L_tmp2 > 0 ) + { + tmp = sub( bands, p2a_bands ); + tmp = sub( tmp, lowband ); /*Q0 */ + +#ifndef BASOP_NOGLOB + tmp1 = extract_h( L_shl( Ep_avrg_fx, 1 ) ); /*Q0 */ +#else + tmp1 = extract_h( L_shl_o( Ep_avrg_fx, 1, &Overflow ) ); /*Q0 */ +#endif + IF( tmp1 != 0 ) + { + exp = norm_s( tmp1 ); + tmp1 = shl( tmp1, exp ); /*Q(exp) */ + tmp1 = div_s( 16384, tmp1 ); /*Q(15+14-exp = 29-exp) */ + exp = sub( 29, exp ); + } + ELSE + { + tmp1 = 0x7fff; + move16(); + exp = 0; + move16(); + } + Mpy_32_16_ss( Ep_tmp_fx[i], tmp1, &L_tmp, &lo ); + Mpy_32_16_ss( L_tmp, tmp, &L_tmp, &lo ); + Mpy_32_16_ss( L_tmp, 16384, &L_tmp, &lo ); + L_tmp = L_shl( L_tmp, sub( 32, exp ) ); /*Q15 */ + tmp = extract_l( L_min( L_tmp, 6554 ) ); /*Q15 */ + Mpy_32_16_ss( Ep_vari_fx, tmp1, &L_tmp, &lo ); + Mpy_32_16_ss( L_tmp, tmp, &L_tmp, &lo ); + L_tmp = L_shl( L_tmp, sub( 15, exp ) ); /*Q15 */ + tmp = extract_l( L_shr( L_min( L_tmp, 13107 ), 1 ) ); /*Q14 */ + alpha_fx = add( tmp, 16384 ); /*Q14 */ + } + ELSE + { + alpha_fx = 16384; + move16(); /*Q14 */ + } + + IF( add( sub( i, bands ), p2a_bands ) > 0 ) + { + tmp = sub( bands, p2a_bands ); + IF( sub( hHQ_core->last_bitalloc_max_band[sub( i, add( tmp, 1 ) )], 1 ) == 0 ) + { + tmp = sub( tmp, lowband ); + Mpy_32_16_ss( Ep_tmp_fx[i], tmp, &L_tmp, &lo ); +#ifndef BASOP_NOGLOB + tmp = extract_h( L_shl( L_tmp, 16 ) ); /*Q0 */ +#else /* BASOP_NOGLOB */ + tmp = extract_h( L_shl_o( L_tmp, 16, &Overflow ) ); /*Q0 */ +#endif /* BASOP_NOGLOB */ + IF( tmp != 0 ) + { + exp = norm_s( tmp ); + tmp = shl( tmp, exp ); /*Q(exp) */ + tmp = div_s( 16384, tmp ); /*Q(15+14-exp=29-exp) */ + exp = sub( 29, exp ); + } + ELSE + { + tmp = 0x7fff; + move16(); + exp = 0; + move16(); + } + Mpy_32_16_ss( Ep_avrg_fx, tmp, &L_tmp, &lo ); + L_tmp = L_shl( L_tmp, sub( 14, exp ) ); /*Q14 */ + tmp = extract_l( L_min( L_max( L_tmp, 16384 ), 20480 ) ); /*Q14 */ + L_tmp = L_mult( alpha_fx, tmp ); /*Q(14+14+1=29) */ + alpha_fx = extract_l( L_shr( L_tmp, 15 ) ); /*Q14*/ + } + ELSE + { + tmp = sub( tmp, lowband ); + +#ifndef BASOP_NOGLOB + tmp1 = extract_h( L_shl( Ep_avrg_fx, 1 ) ); /*Q0 */ +#else + tmp1 = extract_h( L_shl_o( Ep_avrg_fx, 1, &Overflow ) ); /*Q0 */ +#endif + IF( tmp1 != 0 ) + { + exp = norm_s( tmp1 ); + tmp1 = shl( tmp1, exp ); /*Q(exp) */ + tmp1 = div_s( 16384, tmp1 ); /*Q(15+14-exp=29-exp) */ + exp = sub( 29, exp ); + } + ELSE + { + tmp1 = 0x7fff; + move16(); + exp = 0; + move16(); + } + Mpy_32_16_ss( Ep_tmp_fx[i], tmp1, &L_tmp, &lo ); + Mpy_32_16_ss( L_tmp, tmp, &L_tmp, &lo ); + L_tmp = L_shl( L_tmp, sub( 29, exp ) ); /*Q14 */ + tmp = extract_l( L_min( L_max( L_tmp, 13926 ), 16384 ) ); /*Q14 */ + L_tmp = L_mult( alpha_fx, tmp ); /*Q(14+14+1=29) */ + alpha_fx = extract_l( L_shr( L_tmp, 15 ) ); /*Q14 */ + } + } + Mpy_32_16_ss( L_band_energy_tmp[i], alpha_fx, &L_tmp, &lo ); + L_band_energy_tmp[i] = L_shl( L_tmp, 1 ); /*Q Q_band_energy */ + } + lowband = 6; + move16(); + Ep_avrg_fx = 0; + move32(); + Ep_avrgL_fx = 0; + move32(); + Ep_peak_fx = 0; + move32(); + FOR( i = 0; i < bands; i++ ) + { + IF( sub( i, lowband ) >= 0 ) + { +#ifndef BASOP_NOGLOB + Ep_avrg_fx = L_add( Ep_avrg_fx, Ep_tmp_fx[i] ); /*Q15 */ +#else /* BASOP_NOGLOB */ + Ep_avrg_fx = L_add_o( Ep_avrg_fx, Ep_tmp_fx[i], &Overflow ); /*Q15 */ +#endif /* BASOP_NOGLOB */ + } + ELSE + { +#ifndef BASOP_NOGLOB + Ep_avrgL_fx = L_add( Ep_avrgL_fx, Ep_tmp_fx[i] ); /*Q15 */ +#else /* BASOP_NOGLOB */ + Ep_avrgL_fx = L_add_o( Ep_avrgL_fx, Ep_tmp_fx[i], &Overflow ); /*Q15 */ +#endif /* BASOP_NOGLOB */ + IF( L_sub( Ep_tmp_fx[i], Ep_peak_fx ) > 0 ) + { + Ep_peak_fx = Ep_tmp_fx[i]; + move32(); /*Q15 */ + } + } + } + + Mpy_32_16_ss( Ep_peak_fx, 24576, &L_tmp, &lo ); + Mpy_32_16_ss( Ep_peak_fx, 19661, &L_tmp2, &lo ); + Mpy_32_16_ss( Ep_avrgL_fx, 24576, &L_tmp3, &lo ); + + IF( ( L_sub( L_shr( Ep_avrgL_fx, 1 ), Ep_avrg_fx ) > 0 && L_sub( L_tmp, L_shr( Ep_avrgL_fx, 2 ) ) > 0 && L_sub( L_shr( Ep_avrgL_fx, 1 ), L_tmp2 ) < 0 ) || + ( L_sub( L_shr( Ep_avrg_fx, 1 ), Ep_avrgL_fx ) > 0 && L_sub( L_shr( Ep_avrg_fx, 3 ), L_tmp3 ) < 0 && L_sub( L_tmp, L_shr( Ep_avrgL_fx, 2 ) ) > 0 ) ) + { + adjustFlag = 1; + move16(); + FOR( i = 0; i < lowband; i++ ) + { +#ifndef BASOP_NOGLOB + tmp = extract_h( L_shl( Ep_avrgL_fx, 1 ) ); /*Q0 */ +#else + tmp = extract_h( L_shl_o( Ep_avrgL_fx, 1, &Overflow ) ); /*Q0 */ +#endif + IF( tmp != 0 ) + { + exp = norm_s( tmp ); + tmp = shl( tmp, exp ); /*Q(exp) */ + tmp = div_s( 16384, tmp ); /*Q(15+14-exp=29-exp) */ + exp = sub( 29, exp ); + } + ELSE + { + tmp = 0x7fff; + move16(); + exp = 0; + move16(); + } + Mpy_32_16_ss( Ep_peak_fx, tmp, &L_tmp, &lo ); + Mpy_32_16_ss( L_tmp, lowband, &L_tmp, &lo ); + L_tmp = L_shl( L_tmp, sub( 28, exp ) ); /*Q14 0.5 */ + tmp = extract_l( L_min( L_tmp, 19661 ) ); /*Q14 */ + Mpy_32_16_ss( L_band_energy_tmp[i], tmp, &L_tmp, &lo ); + L_band_energy_tmp[i] = L_shl( L_tmp, 1 ); /*Q_band_energy */ + } + } +#undef WMC_TOOL_SKIP + + for ( i = 0; i < bands; i++ ) + { + band_energy_tmp[i] = (float) ( L_band_energy_tmp[i] / pow( 2.0f, SWB_BWE_LR_Qbe ) ); + } + + hq2_bit_alloc( band_energy_tmp, bands, Rk_fx, &bit_budget, p2a_flags, bit_alloc_weight_fx, band_width, *num_bits, hqswb_clas, st->bwidth, is_transient ); + + /* encode the last p2a_bands-1 subbands bit-allocation index of the previous frame */ + for ( i = 0; i < 2; i++ ) + { + push_indice( hBstr, IND_HQ2_LAST_BA_MAX_BAND, hHQ_core->last_bitalloc_max_band[i], 1 ); + } + } + else if ( st->bwidth == SWB && hqswb_clas == HQ_HARMONIC && ( bwe_br == HQ_16k40 || bwe_br == HQ_13k20 ) ) + { + /* bit allocation for harmonic mode */ + hq2_bit_alloc_har( band_energy, bit_budget, bands, Rk_fx, p2a_bands, bwe_br, p2a_flags, band_width ); + } + else + { + + /* estimate number of bits per band */ + hq2_bit_alloc( band_energy, bands, Rk_fx, &bit_budget, p2a_flags, bit_alloc_weight_fx, band_width, *num_bits, hqswb_clas, st->bwidth, is_transient ); + } + + tcq_core_LR_enc( hBstr, inp_vector, t_audio, y2, bit_budget, bands, band_start, band_end, band_width, Rk_fx, npulses, k_sort, p2a_flags, p2a_bands, hHQ_core->last_bitalloc_max_band, inner_frame, adjustFlag, is_transient ); + + if ( ( inner_frame == L_FRAME8k && st->core_brate <= ACELP_13k20 ) || inner_frame == L_FRAME16k ) + { + j = 0; + for ( i = 2; i > 0; i-- ) + { + if ( npulses[bands - i] > 0 ) + { + hHQ_core->last_bitalloc_max_band[j] = 1; + } + else + { + hHQ_core->last_bitalloc_max_band[j] = 0; + } + j++; + } + } + + /* Prepare floating Rk for next modules */ + for ( k = 0; k < bands; k++ ) + { + Rk[k] = WORD322FL_SCALE( Rk_fx[k], SWB_BWE_LR_QRk - 1 ); + } + + /* Denormalize the coded MDCT spectrum */ + mdct_spectrum_denorm( inp_vector, y2, band_start, band_end, band_width, band_energy, npulses, bands, ld_slope, pd_thresh ); + + /* Apply fine gain quantization to denormalized coded spectrum */ + mdct_spectrum_fine_gain_enc( hBstr, t_audio, y2, band_start, band_end, k_sort, bands, L_qint, Ngq, gqlevs, gqbits ); + + /* reStore the subband information*/ + if ( flag_spt == 1 ) + { + spt_shorten_domain_band_restore( bands, band_start, band_end, band_width, org_band_start, org_band_end, org_band_width ); + } + + /* Inject noise into components having relatively low pulse energy per band */ + ni_seed = npulses[0] + npulses[1] + npulses[2] + npulses[3]; + + for ( i = 0; i < band_end[bands - 1] + 1; i++ ) + y2_ni[i] = y2[i]; + hq2_noise_inject( y2_ni, band_start, band_end, band_width, Ep, Rk, npulses, ni_seed, bands, 0, bw_low, bw_high, enerL, enerH, hHQ_core->last_ni_gain, hHQ_core->last_env, &hHQ_core->last_max_pos_pulse, p2a_flags, p2a_bands, hqswb_clas, st->bwidth, bwe_br ); + + if ( st->bwidth == SWB && ( bwe_br == HQ_16k40 || bwe_br == HQ_13k20 ) ) + { + if ( hqswb_clas == HQ_NORMAL || hqswb_clas == HQ_HARMONIC ) + { + preset_hq2_swb( hqswb_clas, band_end, &har_bands, p2a_bands, length, bands, &lowlength, &highlength, m ); + + swb_bwe_enc_lr( st, y2, t_audio, m, bwe_br, bands, band_start, band_end, band_energy, p2a_flags, hqswb_clas, lowlength, highlength, hHQ_core->prev_frm_index, har_bands, &hHQ_core->prev_frm_hfe2, &hHQ_core->prev_stab_hfe2, band_width, y2_ni, &ni_seed ); + + post_hq2_swb( m, lowlength, highlength, hqswb_clas, har_bands, bands, p2a_flags, band_start, band_end, y2, npulses ); + + if ( hqswb_clas == HQ_NORMAL ) + { + spt_swb_peakpos_tmp_save( y2, bands, band_start, band_end, prev_SWB_peak_pos_tmp ); + for ( k = 0; k < SPT_SHORTEN_SBNUM; k++ ) + { + if ( p2a_flags[bands - SPT_SHORTEN_SBNUM + k] == 0 || npulses[bands - SPT_SHORTEN_SBNUM + k] == 0 ) + { + prev_SWB_peak_pos_tmp[k] = 0; + } + } + } + + mvr2r( y2_ni, y2, lowlength ); + } + else + { + mvr2r( y2_ni, y2, band_end[bands - 1] + 1 ); /* HQ_TRANSIENT */ + } + } + else + { + mvr2r( y2_ni, y2, band_end[bands - 1] + 1 ); /* NB, WB */ + } + + + updat_prev_frm( y2, t_audio, bwe_br, length, inner_frame, bands, st->bwidth, is_transient, hqswb_clas, &hHQ_core->prev_hqswb_clas, hHQ_core->prev_SWB_peak_pos, prev_SWB_peak_pos_tmp, &hHQ_core->prev_frm_hfe2, &hHQ_core->prev_stab_hfe2, bws_cnt ); + + if ( st->bwidth != SWB ) + { + /* reset HQ classifier memories */ + hHQ_core->mode_count = 0; + hHQ_core->mode_count1 = 0; + } + if ( hqswb_clas != HQ_HARMONIC && ( bwe_br == HQ_16k40 || bwe_br == HQ_13k20 ) && st->bwidth == SWB ) + { + hHQ_core->prev_frm_index[0] = -1; + hHQ_core->prev_frm_index[1] = -1; + } + /* update number of unused bits */ + *num_bits = 0; + + hHQ_core->hvq_hangover = 0; + + return; +} + +/*--------------------------------------------------------------------------* + * small_symbol_enc_tran() + * + * Huffman encoding of differential energies, estimating or packing bits + * if flag_pack = 0, LC mode info. is output else LC mode info. is input + * if flag_pack = 0, estimatng else packing bits + *--------------------------------------------------------------------------*/ + +/*! r: bits */ +static int16_t small_symbol_enc_tran( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const int16_t *qbidx, /* i : input of dequantized differential energy */ + const int16_t BANDS, /* i : number of bands */ + int16_t *hLCmode, /* i/o: LC mode info */ + const int16_t flag_pack, /* i : indicator of packing or estimating bits */ + const int16_t is_transient ) +{ + int16_t i, bits; + int16_t difidx[BANDS_MAX]; + + for ( i = 0; i < BANDS; i++ ) + { + difidx[i] = qbidx[i] + LRMDCT_BE_OFFSET; + } + + for ( i = 0; i < BANDS; ++i ) + { + if ( difidx[i] > LRMDCT_BE_LIMIT || difidx[i] < 0 ) + { + /* Huffman cannot encode this vector */ + return -1; + } + } + + /* Preparing lossless coding input */ + if ( flag_pack == 0 ) + { + /* estimating # of bits */ + bits = encode_envelope_indices( hBstr, BANDS, -1, difidx, hLCmode, flag_pack, LOW_RATE_HQ_CORE_TRAN, is_transient ); + bits += BITS_DE_FCOMP; /* xx bits for diff. energies + BITS_DE_FCOMP bits for first energies */ + } + else + { + bits = 0; + encode_envelope_indices( hBstr, BANDS, -1, difidx, hLCmode, flag_pack, LOW_RATE_HQ_CORE_TRAN, is_transient ); + } + + return bits + BITS_DE_HMODE; /* xx bits for diff. energies + 1 bit for LC coding mode */ +} + + +/*--------------------------------------------------------------------------* + * small_symbol_enc() + * + * Huffman encoding of differential energies, estimating or packing bits + * if flag_pack = 0, LC mode info. is output else LC mode info. is input + * if flag_pack = 0, estimatng else packing bits + *--------------------------------------------------------------------------*/ + +/*! r: bits */ +static int16_t small_symbol_enc( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const int16_t *qbidx, /* i : input of dequantized differential energy */ + const int16_t BANDS, /* i : number of bands */ + int16_t *hLCmode, /* i/o: LC mode info */ + const int16_t flag_pack, /* i : indicator of packing or estimating bits */ + const int16_t is_transient ) +{ + int16_t i, bits; + int16_t difidx[BANDS_MAX], LSB[BANDS_MAX]; + + /* Preparing lossless coding input */ + difidx[0] = qbidx[0] + DE_OFFSET0; + + for ( i = 1; i < BANDS; ++i ) + { + difidx[i] = qbidx[i] + DE_OFFSET1; + } + + for ( i = 0; i < BANDS; ++i ) + { + if ( difidx[i] >= DE_LIMIT || difidx[i] < 0 ) + { + /* Huffman cannot encode this vector */ + return -1; + } + } + + /* splitting MSB and LSB */ + for ( i = 0; i < BANDS; ++i ) + { + LSB[i] = difidx[i] & 1; + difidx[i] >>= 1; + } + + /* Preparing lossless coding input */ + if ( flag_pack == 0 ) + { + /* estimating # of bits */ + /* Encoding MSB bits */ + bits = encode_envelope_indices( hBstr, BANDS, -1, difidx, hLCmode, flag_pack, LOW_RATE_HQ_CORE, is_transient ); + bits += BITS_DE_FCOMP; /* xx bits for diff. energies + BITS_DE_FCOMP bits for first energies */ + + /* Encoding LSB bit packing */ + bits += BANDS; + } + else + { + /* Encoding MSB bits */ + bits = 0; + encode_envelope_indices( hBstr, BANDS, -1, difidx, hLCmode, flag_pack, LOW_RATE_HQ_CORE, is_transient ); + + /* Encoding LSB bit packing */ + for ( i = 0; i < BANDS; ++i ) + { + push_indice( hBstr, IND_HQ2_DIFF_ENERGY, LSB[i], BITS_DE_LSB ); + } + } + + return bits + BITS_DE_HMODE; /* xx bits for diff. energies + 1 bit for LC coding mode */ +} + + +/*--------------------------------------------------------------------------* + * large_symbol_enc() + * + * + *--------------------------------------------------------------------------*/ + +/*! r: bits */ +static int16_t large_symbol_enc( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + int16_t *qbidx, /* i : input of dequantized differential energy */ + const int16_t BANDS, /* i : number of bands */ + int16_t *hLCmode0, /* i/o: LC mode info */ + const int16_t flag_pack /* i : indicator of packing or estimating bits */ +) +{ + int16_t i, bits; + int16_t LSB1[BANDS_MAX]; + int16_t min_q = 513, max_q = -1, offset0; + int16_t min_bits, min_bits_pos; + int16_t tdifidx0[BANDS_MAX], tdifidx1[BANDS_MAX]; + int16_t basic_shift; + int16_t bitsmode0, bitsmode1; + int16_t lsbdepth1; + int16_t cnt_outlyer, pos_outlyer, cnt_outlyer0; + + cnt_outlyer0 = 0; + cnt_outlyer = 0; + bitsmode0 = 0; + bitsmode1 = 0; + pos_outlyer = 0; + lsbdepth1 = 0; + + if ( flag_pack == 0 || ( flag_pack == 1 && *hLCmode0 == 0 ) ) + { + if ( qbidx[0] > ABS_ENG_OFFSET - 1 || qbidx[0] < -ABS_ENG_OFFSET ) + { + cnt_outlyer0 = 2; + } + else if ( qbidx[0] > 3 || qbidx[0] < -4 ) + { + cnt_outlyer0 = 1; + } + else + { + cnt_outlyer0 = 0; + } + + cnt_outlyer = 0; + pos_outlyer = -1; + for ( i = 1; i < BANDS; ++i ) + { + if ( qbidx[i] > 3 || qbidx[i] < -4 ) + { + cnt_outlyer++; + pos_outlyer = i; + } + + if ( qbidx[i] > ABS_ENG_OFFSET - 1 || qbidx[i] < -ABS_ENG_OFFSET ) + { + cnt_outlyer++; + } + } + + if ( cnt_outlyer0 == 0 && cnt_outlyer <= 1 ) + { + bitsmode0 = BITS_DE_8SMODE + BITS_DE_8SMODE_N0 + BITS_DE_8SMODE_N1; + if ( cnt_outlyer == 1 ) + { + /* 01 */ + bitsmode0 += BITS_DE_8SPOS + BITS_ABS_ENG; + } + + for ( i = 0; i < pos_outlyer; ++i ) + { + tdifidx0[i] = qbidx[i]; + bitsmode0 += hessize[tdifidx0[i] + 4]; + } + + for ( i = pos_outlyer + 1; i < BANDS; ++i ) + { + tdifidx0[i] = qbidx[i]; + bitsmode0 += hessize[tdifidx0[i] + 4]; + } + } + else if ( cnt_outlyer0 == 1 && cnt_outlyer <= 1 ) + { + bitsmode0 = BITS_DE_8SMODE + BITS_DE_8SMODE_N0 + BITS_DE_8SMODE_N1; + tdifidx0[0] = qbidx[0]; + bitsmode0 += BITS_ABS_ENG; + if ( cnt_outlyer == 1 ) + { + /* 11 */ + bitsmode0 += BITS_DE_8SPOS + BITS_ABS_ENG; + } + else + { + pos_outlyer = 0; + } + + for ( i = 1; i < pos_outlyer; ++i ) + { + tdifidx0[i] = qbidx[i]; + bitsmode0 += hessize[tdifidx0[i] + 4]; + } + + for ( i = pos_outlyer + 1; i < BANDS; ++i ) + { + tdifidx0[i] = qbidx[i]; + bitsmode0 += hessize[tdifidx0[i] + 4]; + } + } + else + { + bitsmode0 = 20000; + } + } + + if ( flag_pack == 0 || ( flag_pack == 1 && *hLCmode0 == 1 ) ) + { + /* components 0 range : -256~255 */ + max_q = MINIMUM_ENERGY_LOWBRATE; + min_q = MAXIMUM_ENERGY_LOWBRATE; + for ( i = 0; i < BANDS; ++i ) + { + if ( qbidx[i] > max_q ) + { + max_q = qbidx[i]; + } + + if ( qbidx[i] < min_q ) + { + min_q = qbidx[i]; + } + } + + /* Counting bits for transmitting all components using same method */ + for ( i = 0;; ++i ) + { + if ( max_q <= ( ( 2 << ( i + 1 ) ) - 1 ) && min_q >= -( 2 << ( i + 1 ) ) ) + { + break; + } + } + basic_shift = i; + + min_bits = 1000; + min_bits_pos = basic_shift; + for ( offset0 = basic_shift; offset0 < basic_shift + 3; offset0++ ) + { + max_q = MINIMUM_ENERGY_LOWBRATE; + min_q = MAXIMUM_ENERGY_LOWBRATE; + + bitsmode1 = BITS_DE_8SMODE + BITS_MAX_DEPTH; + for ( i = 0; i < BANDS; ++i ) + { + bitsmode1 += ( hessize[( qbidx[i] >> offset0 ) + 4] + ( offset0 ) ); + } + + if ( min_bits > bitsmode1 ) + { + min_bits_pos = offset0; + min_bits = bitsmode1; + } + } + + bitsmode1 = min_bits; + lsbdepth1 = min_bits_pos; + + for ( i = 0; i < BANDS; ++i ) + { + LSB1[i] = qbidx[i] & ( ( 1 << lsbdepth1 ) - 1 ); + tdifidx1[i] = qbidx[i] >> lsbdepth1; + } + } + + /* Preparing lossless coding input */ + if ( flag_pack == 0 ) + { + /* estimating # of bits */ + /* Encoding MSB bits */ + if ( bitsmode0 < bitsmode1 ) + { + bits = bitsmode0; + *hLCmode0 = 0; + } + else + { + bits = bitsmode1; + *hLCmode0 = 1; + } + } + else + { + /* Encoding MSB bits */ + if ( *hLCmode0 == 0 ) + { + push_indice( hBstr, IND_HQ2_DENG_8SMODE, 0, BITS_DE_8SMODE ); + bits = BITS_DE_8SMODE; + if ( cnt_outlyer0 == 0 ) + { + push_indice( hBstr, IND_HQ2_DENG_8SMODE_N0, 0, BITS_DE_8SMODE_N0 ); + bits += BITS_DE_8SMODE_N0; + if ( cnt_outlyer == 1 ) + { + /* 01 */ + push_indice( hBstr, IND_HQ2_DENG_8SMODE_N1, 1, BITS_DE_8SMODE_N1 ); + bits += BITS_DE_8SMODE_N1; + push_indice( hBstr, IND_HQ2_DENG_8SPOS, pos_outlyer, BITS_DE_8SPOS ); + bits += BITS_DE_8SPOS; + push_indice( hBstr, IND_HQ2_DIFF_ENERGY, qbidx[pos_outlyer] + ABS_ENG_OFFSET, BITS_ABS_ENG ); + bits += BITS_ABS_ENG; + } + else + { + /* 00 */ + push_indice( hBstr, IND_HQ2_DENG_8SMODE_N1, 0, BITS_DE_8SMODE_N1 ); + bits += BITS_DE_8SMODE_N1; + } + + for ( i = 0; i < pos_outlyer; ++i ) + { + push_indice( hBstr, IND_HQ2_DIFF_ENERGY, hescode[tdifidx0[i] + 4], hessize[tdifidx0[i] + 4] ); + bitsmode0 += hessize[tdifidx0[i] + 4]; + } + + for ( i = pos_outlyer + 1; i < BANDS; ++i ) + { + push_indice( hBstr, IND_HQ2_DIFF_ENERGY, hescode[tdifidx0[i] + 4], hessize[tdifidx0[i] + 4] ); + bitsmode0 += hessize[tdifidx0[i] + 4]; + } + } + else if ( cnt_outlyer0 == 1 ) + { + push_indice( hBstr, IND_HQ2_DENG_8SMODE_N0, 1, BITS_DE_8SMODE_N0 ); + bits += BITS_DE_8SMODE_N0; + if ( cnt_outlyer == 1 ) + { + push_indice( hBstr, IND_HQ2_DENG_8SMODE_N1, 1, BITS_DE_8SMODE_N1 ); + bits += BITS_DE_8SMODE_N1; + push_indice( hBstr, IND_HQ2_DENG_8SPOS, pos_outlyer, BITS_DE_8SPOS ); + bits += BITS_DE_8SPOS; + push_indice( hBstr, IND_HQ2_DIFF_ENERGY, qbidx[0] + ABS_ENG_OFFSET, BITS_ABS_ENG ); + bits += BITS_ABS_ENG; + push_indice( hBstr, IND_HQ2_DIFF_ENERGY, qbidx[pos_outlyer] + ABS_ENG_OFFSET, BITS_ABS_ENG ); + bits += BITS_ABS_ENG; + } + else + { + push_indice( hBstr, IND_HQ2_DENG_8SMODE_N1, 0, BITS_DE_8SMODE_N1 ); + bits += BITS_DE_8SMODE_N1; + push_indice( hBstr, IND_HQ2_DIFF_ENERGY, qbidx[0] + ABS_ENG_OFFSET, BITS_ABS_ENG ); + bits += BITS_ABS_ENG; + } + + for ( i = 1; i < pos_outlyer; ++i ) + { + push_indice( hBstr, IND_HQ2_DIFF_ENERGY, hescode[tdifidx0[i] + 4], hessize[tdifidx0[i] + 4] ); + bits += hessize[tdifidx0[i] + 4]; + } + + for ( i = pos_outlyer + 1; i < BANDS; ++i ) + { + push_indice( hBstr, IND_HQ2_DIFF_ENERGY, hescode[tdifidx0[i] + 4], hessize[tdifidx0[i] + 4] ); + bits += hessize[tdifidx0[i] + 4]; + } + } + } + else + { + bits = BITS_DE_8SMODE + BITS_MAX_DEPTH; + push_indice( hBstr, IND_HQ2_DENG_8SMODE, 1, BITS_DE_8SMODE ); + push_indice( hBstr, IND_HQ2_DENG_8SDEPTH, lsbdepth1, BITS_MAX_DEPTH ); + + for ( i = 0; i < BANDS; ++i ) + { + push_indice( hBstr, IND_HQ2_DIFF_ENERGY, hescode[tdifidx1[i] + 4], hessize[tdifidx1[i] + 4] ); + bits += hessize[tdifidx1[i] + 4]; + } + + if ( lsbdepth1 > 0 ) + { + for ( i = 0; i < BANDS; ++i ) + { + push_indice( hBstr, IND_HQ2_DIFF_ENERGY, LSB1[i], lsbdepth1 ); + } + bits += BANDS * lsbdepth1; + } + } + } + + return bits; /* xx bits for diff. energies + 1 bit for LC coding mode */ +} + +/*-------------------------------------------------------------------* + * band_energy_quant() + * + * + *-------------------------------------------------------------------*/ + +static float band_energy_quant( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const float *t_audio, + const int16_t band_start[], + const int16_t band_end[], + float band_energy[], + const int16_t bands, + const Word32 L_qint, /* Q29 */ + const Word16 eref_fx, /* Q10 */ + const int16_t is_transient ) +{ + int16_t i, k; + float E; + int16_t ebits; + int16_t hLCmode0, hLCmode1, deng_bits; + int16_t bq1_temp[BANDS_MAX], bq2_temp[BANDS_MAX]; + int16_t bq0; + int16_t bq1[BANDS_MAX]; + int16_t bq2[BANDS_MAX]; + int16_t deng_cmode = 0; + int16_t hbits; + Word32 L_tmp; + Word32 L_band_energy[BANDS_MAX]; + Word16 exp_normd; + Word16 rev_qint_fx; + Word16 Qrev_qint; + + /* Calculate the band energies */ + for ( k = 0; k < bands; k++ ) + { + E = 0.0f; + for ( i = band_start[k]; i <= band_end[k]; i++ ) + { + E += t_audio[i] * t_audio[i]; + } + + band_energy[k] = (float) log2_f( E + 0.18e-1f ); + } + + if ( is_transient ) + { + reverse_transient_frame_energies( band_energy, bands ); + } + + /* Quantize the reference and band energies */ + for ( k = 0; k < bands; k++ ) + L_band_energy[k] = (Word32) ( band_energy[k] * pow( 2.0f, SWB_BWE_LR_Qbe ) ); + +#define WMC_TOOL_SKIP + exp_normd = norm_l( L_qint ); + rev_qint_fx = div_s( 0x4000, round_fx( L_shl( L_qint, exp_normd ) ) ); /* Q14-(29+exp_normd-16)+15 */ + Qrev_qint = sub( 14 - ( 29 - 16 ) + 15, exp_normd ); + + bq0 = round_fx( L_shl( L_mult( eref_fx, rev_qint_fx ), sub( 5, Qrev_qint ) ) ); /* 16-(10+Qrev_qint+1) */ + FOR( k = 0; k < bands; k++ ) + { + /*bq1[k] = round_f (band_energy[k] / qint); */ + L_tmp = L_mls( L_band_energy[k], rev_qint_fx ); /* Q14+Qrev_qint-15 */ + bq1[k] = round_fx( L_shl( L_tmp, sub( 17, Qrev_qint ) ) ); /* 16-(14+Qrev_qint-15) */ + } +#undef WMC_TOOL_SKIP + + if ( is_transient ) + { + mvs2s( bq1, bq1_temp, bands ); + + /* Calculate the differential energies */ + diffcod_lrmdct( bands, bq0, bq1_temp, bq2_temp, is_transient ); + } + + /* Calculate the differential energies */ + bq2[0] = bq1[0] - bq0; + for ( k = 1; k < bands; k++ ) + { + bq2[k] = bq1[k] - bq1[k - 1]; + } + + /* Modifying qbidx to be located in the range -256~255 */ + for ( i = 0; i < bands; ++i ) + { + if ( bq2[i] > MAXIMUM_ENERGY_LOWBRATE ) + { + bq2[i] = MAXIMUM_ENERGY_LOWBRATE; + } + if ( bq2[i] < MINIMUM_ENERGY_LOWBRATE ) + { + bq2[i] = MINIMUM_ENERGY_LOWBRATE; + } + } + + /* Get number of bits by Huffman0 coding */ + ebits = large_symbol_enc( hBstr, bq2, bands, &hLCmode0, 0 ); + + if ( is_transient ) + { + /* Get number of bits by Huffman coding */ + hbits = small_symbol_enc_tran( hBstr, bq2_temp, bands, &hLCmode1, 0, is_transient ); + } + else + { + /* Get number of bits by Huffman coding */ + hbits = small_symbol_enc( hBstr, bq2, bands, &hLCmode1, 0, is_transient ); + } + + /* comparing used bits */ + if ( ebits < hbits || hbits == -1 ) + { + deng_cmode = 0; + push_indice( hBstr, IND_HQ2_DENG_MODE, deng_cmode, BITS_DE_CMODE ); + large_symbol_enc( hBstr, bq2, bands, &hLCmode0, 1 ); + deng_bits = ebits + BITS_DE_CMODE; + } + else + { + /* setting energy difference coding mode and storing it */ + deng_cmode = 1; + push_indice( hBstr, IND_HQ2_DENG_MODE, deng_cmode, BITS_DE_CMODE ); + + deng_bits = hbits + BITS_DE_CMODE; + + /* packing indice */ + if ( is_transient ) + { + mvs2s( bq2_temp, bq2, bands ); + + small_symbol_enc_tran( hBstr, bq2, bands, &hLCmode1, 1, is_transient ); + } + else + { + small_symbol_enc( hBstr, bq2, bands, &hLCmode1, 1, is_transient ); + } + } + + /* Reconstruct quantized spectrum */ + bq1[0] = bq2[0] + bq0; + for ( k = 1; k < bands; k++ ) + { + bq1[k] = bq2[k] + bq1[k - 1]; + } + + for ( k = 0; k < bands; k++ ) + { +#define WMC_TOOL_SKIP + L_band_energy[k] = L_mls( L_qint, (Word16) bq1[k] ); + move32(); /* 29+0-15 -> Qbe(Q14) */ +#undef WMC_TOOL_SKIP + band_energy[k] = (float) ( L_band_energy[k] / pow( 2.0f, SWB_BWE_LR_Qbe ) ); + } + + if ( is_transient ) + { + reverse_transient_frame_energies( band_energy, bands ); + } + + return ( deng_bits ); +} + + +/*-------------------------------------------------------------------* + * p2a_threshold_quant() + * + * + *-------------------------------------------------------------------*/ + +static int16_t p2a_threshold_quant( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const float *t_audio, + const int16_t band_start[], + const int16_t band_end[], + const int16_t band_width[], + const int16_t bands, + const int16_t p2a_bands, + const float p2a_th, + int16_t *p2a_flags ) +{ + int16_t i, j, k; + float p, a, e; + float p2a; + + set_s( p2a_flags, 1, bands ); + + j = 0; + for ( k = bands - p2a_bands; k < bands; k++ ) + { + a = 0.0f; + p = 0.0f; + for ( i = band_start[k]; i <= band_end[k]; i++ ) + { + e = t_audio[i] * t_audio[i]; + if ( e > p ) + { + p = e; + } + a += e; + } + + if ( a > 0.0f ) + { + a /= band_width[k]; + p2a = 10.0f * (float) log10( p / a ); + + if ( p2a <= p2a_th ) + { + p2a_flags[k] = 0; + } + } + + push_indice( hBstr, IND_HQ2_P2A_FLAGS, p2a_flags[k], 1 ); + j++; + } + + return ( j ); +} + + +/*-------------------------------------------------------------------* + * mdct_spectrum_fine_gain_enc() + * + * + *-------------------------------------------------------------------*/ + +static void mdct_spectrum_fine_gain_enc( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const float ybuf[], + float y2[], + const int16_t band_start[], + const int16_t band_end[], + const int16_t k_sort[], + const int16_t bands, + const Word32 L_qint, + const int16_t Ngq, + const int16_t gqlevs, + const int16_t gqbits ) +{ + int16_t i, k, imin; + float Eyy, Exy, gamma; + float dmin, d; + float gain_table[MAX_GQLEVS]; + Word16 exp_normn, exp_normd; + Word16 delta_fx, Qdelta; + Word32 L_delta, L_q; + Word32 L_temp; + Word16 gain_table_fx[MAX_GQLEVS]; + Word16 Qgt; + Word16 temp_lo_fx, temp_hi_fx; + +#define WMC_TOOL_SKIP + /* Fine gain quantization on only the most significant energy bands */ + /*delta = qint / gqlevs; */ + exp_normn = norm_l( L_qint ); + exp_normn = sub( exp_normn, 1 ); + exp_normd = norm_s( gqlevs ); + delta_fx = div_l( L_shl( L_qint, exp_normn ), shl( gqlevs, exp_normd ) ); + Qdelta = add( sub( exp_normn, exp_normd ), 28 ); /* 29+exp_normn-(exp_normd)-1; */ + L_delta = L_shl( L_deposit_h( delta_fx ), sub( 13, Qdelta ) ); + /*q = (-qint + delta) / 2.0f; */ + L_q = L_shr( L_sub( L_delta, L_qint ), 1 ); + + FOR( i = 0; i < gqlevs; i++ ) + { + /*gain_table[i] = (float) pow (2.0f, q * 0.5f); */ + L_temp = L_shr( L_shr( L_q, 1 ), sub( 29, 16 ) ); + temp_lo_fx = L_Extract_lc( L_temp, &temp_hi_fx ); + Qgt = sub( 14, temp_hi_fx ); + gain_table_fx[i] = extract_l( Pow2( 14, temp_lo_fx ) ); /* Qgt */ + + /*q += delta; */ + L_q = L_add( L_q, L_delta ); + gain_table_fx[i] = shl( gain_table_fx[i], sub( 14, Qgt ) ); /* Qgt -> Q14 */ + gain_table[i] = (float) ( gain_table_fx[i] / pow( 2.0f, 14 ) ); + } +#undef WMC_TOOL_SKIP + + for ( k = bands - Ngq; k < bands; k++ ) + { + Eyy = 0.0f; + Exy = 0.0f; + for ( i = band_start[k_sort[k]]; i <= band_end[k_sort[k]]; i++ ) + { + Eyy += y2[i] * y2[i]; + Exy += ybuf[i] * y2[i]; + } + + if ( Eyy > 0.0f && Exy > 0.0f ) + { + gamma = Exy / Eyy; + dmin = FLT_MAX; + imin = -1; + for ( i = 0; i < gqlevs; i++ ) + { + d = (float) fabs( gamma - gain_table[i] ); + if ( d < dmin ) + { + dmin = d; + imin = i; + } + } + + gamma = gain_table[imin]; + + for ( i = band_start[k_sort[k]]; i <= band_end[k_sort[k]]; i++ ) + { + y2[i] *= gamma; + } + } + else + { + imin = 0; + } + + push_indice( hBstr, IND_HQ2_SUBBAND_GAIN, imin, gqbits ); + } + + return; +} diff --git a/lib_enc/hvq_enc.c b/lib_enc/hvq_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..54c50f31acd259744bb2da82340bd81a335137e2 --- /dev/null +++ b/lib_enc/hvq_enc.c @@ -0,0 +1,153 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "rom_enc.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*--------------------------------------------------------------------------* + * hvq_enc() + * + * Harmonic VQ encoder + *--------------------------------------------------------------------------*/ + +/*! r: Consumed bits */ +int16_t hvq_enc( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const int16_t bwidth, /* i : audio bandwidth */ + const int32_t core_brate, /* i : core bitrate */ + const int16_t hvq_bits, /* i : HVQ bit budget */ + const int16_t Npeaks, /* i : Number of peaks */ + const int16_t *ynrm, /* i : Envelope coefficients */ + int16_t *R, /* i/o: Bit allocation/updated bit allocation */ + int16_t *peaks, /* i/o: Peak pos. / Encoded peak pos. */ + float *nf_gains, /* i/o: Noise fill gains / Quant. nf gains */ + float *noise_level, /* o : Quantized noise level */ + const float *pe_gains, /* i : Peak gains */ + const float *coefs, /* i : spectrum coefficients */ + float *coefs_out /* o : encoded spectrum coefficients */ +) +{ + int16_t bin_th, q, j, i; + int16_t nf_cnt; + int16_t q_noise_level_idx[HVQ_BWE_NOISE_BANDS]; + float q_noise_level[HVQ_BWE_NOISE_BANDS]; + float d, nf, nf_mean, pe, pe_mean, nfpe; + int16_t bits_used; + float lb_nfpe; + + bits_used = 0; + + bin_th = HVQ_THRES_BIN_32k; + if ( core_brate < HQ_BWE_CROSSOVER_BRATE ) + { + bin_th = HVQ_THRES_BIN_24k; + } + + nf = 800; + pe = 800; + q = bin_th; + + /* Find HB noise level */ + for ( i = 0; i < HVQ_BWE_NOISE_BANDS; i++ ) + { + nf_cnt = 0; + nf_mean = EPSILON; + pe_mean = EPSILON; + for ( j = 0; j < ( L_FRAME32k - bin_th ) / HVQ_BWE_NOISE_BANDS; j++, q++ ) + { + d = (float) fabs( coefs[q] ); + + if ( d > pe ) + { + pe = HVQ_BWE_WEIGHT2 * pe + ( 1 - HVQ_BWE_WEIGHT2 ) * d; + } + else + { + pe = HVQ_BWE_WEIGHT1 * pe + ( 1 - HVQ_BWE_WEIGHT1 ) * d; + if ( d > nf ) + { + nf = HVQ_BWE_WEIGHT1 * nf + ( 1 - HVQ_BWE_WEIGHT1 ) * d; + } + else + { + nf = HVQ_BWE_WEIGHT2 * nf + ( 1 - HVQ_BWE_WEIGHT2 ) * d; + } + nf_mean += nf; + nf_cnt++; + } + + pe_mean += pe; + } + + if ( nf_cnt > 0 ) + { + nf_mean /= nf_cnt; + } + pe_mean /= ( L_FRAME32k - bin_th ) / HVQ_BWE_NOISE_BANDS; + + nfpe = HVQ_NFPE_FACTOR * nf_mean / pe_mean; + noise_level[i] = nfpe * nfpe * nfpe; + + q_noise_level_idx[i] = usquant( noise_level[i], &q_noise_level[i], 0.0f, 0.1f, 4 ); + push_indice( hBstr, IND_HVQ_BWE_NL, q_noise_level_idx[i], 2 ); + bits_used += 2; + + noise_level[i] = q_noise_level[i]; + } + + for ( i = 0; i < HVQ_NF_GROUPS; i++ ) + { + lb_nfpe = HVQ_LB_NFPE_FACTOR * nf_gains[i] / pe_gains[i]; + lb_nfpe = lb_nfpe * lb_nfpe * lb_nfpe; + + if ( lb_nfpe > 0.5f ) + { + lb_nfpe = 0.5f; + } + nf_gains[i] *= 2 * lb_nfpe; + } + + bits_used += peak_vq_enc( hBstr, bwidth, coefs, coefs_out, core_brate, hvq_bits - bits_used, Npeaks, ynrm, R, peaks, &nf_gains[0] ); + + + return bits_used; +} diff --git a/lib_enc/igf_enc.c b/lib_enc/igf_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..c1a2e29b8de3e3d6909c9ad2363cd2670b79c16c --- /dev/null +++ b/lib_enc/igf_enc.c @@ -0,0 +1,2037 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include "options.h" +#include +#include "prot.h" +#include "ivas_prot.h" +#include "cnst.h" +#include "stat_enc.h" +#include "wmc_auto.h" + + +/*-------------------------------------------------------------------* + * IGF_write_bit() + * + * write single bit to stream + *-------------------------------------------------------------------*/ + +static void IGF_write_bit( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + int16_t *bitCount, /* i/o: bit counter */ + const int16_t value /* i : value */ +) +{ + if ( hBstr ) + { + push_next_indice( hBstr, value, 1 ); + } + + ( *bitCount )++; + + return; +} + + +/*-------------------------------------------------------------------* + * IGF_write_bits() + * + * write bits to stream + *-------------------------------------------------------------------*/ + +static void IGF_write_bits( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + int16_t *bitCount, /* i/o: bit counter */ + const int16_t value, /* i/o: value */ + int16_t bits /* i : number of bits */ +) +{ + while ( bits-- ) + { + IGF_write_bit( hBstr, bitCount, ( ( value & ( 1 << bits ) ) == 0 ) ? 0 : 1 ); + } + + return; +} + + +/*-------------------------------------------------------------------* + * IGF_getCrest_new() + * + * crest factor calculation + *-------------------------------------------------------------------*/ + +/*! r: crest factor */ +static float IGF_getCrest_new( + const int16_t *logSpec, /* i : power spectrum */ + const int16_t start, /* i : start subband index */ + const int16_t stop /* i : stop subband index */ +) +{ + int16_t i; + int16_t x; + int32_t x_eff = 0; + int16_t x_max = 0; + float crest = 1.f; + + for ( i = start; i < stop; i++ ) + { + x = logSpec[i]; + x_eff += x * x; + + if ( x > x_max ) + { + x_max = x; + } + } + + x_eff /= ( stop - start ); + + if ( x_eff > 0 && x_max > 0 ) + { + crest = max( 1.f, (float) x_max / sqrtf( (float) x_eff ) ); + } + + return crest; +} + + +/*-------------------------------------------------------------------* + * IGF_getSFM_new() + * + * calculates spectral flatness measurement + *-------------------------------------------------------------------*/ + +/*! r: SFM value */ +static float IGF_getSFM_new( + const float *powerSpectrum, /* i : power spectrum */ + const int16_t *logSpec, /* i : log of power spectrum */ + const int16_t start, /* i : start subband index */ + const int16_t stop /* i : stop subband index */ +) +{ + int16_t n; + int16_t i; + int16_t num; + float denom; + float numf; + float tmp; + float sfm; + + num = 0; + denom = 1.f; + sfm = 1.f; + + for ( i = start; i < stop; i++ ) + { + tmp = powerSpectrum[i]; + n = logSpec[i /*-start*/]; + num += n; + denom += tmp; + } + + numf = (float) num / (float) ( stop - start ); + denom /= (float) ( stop - start ); + + if ( denom != 0 ) + { + sfm = min( ( powf( 2.0f, numf + 0.5f ) / denom ), 1.0f ); + } + + return sfm; +} + + +/*-------------------------------------------------------------------* + * IGF_getTilt() + * + * calculates spectral tilt + *-------------------------------------------------------------------*/ + +/*! r: spectral tilt value */ +static float IGF_getTilt( + const float *powerSpectrum, /* i : energies */ + const int16_t start, /* i : start subband index */ + const int16_t stop /* i : stop subband index */ +) +{ + int16_t i; + int16_t x; + int16_t width; + float y; + float mean_x, mean_y, mean_xy, mean_x2; + float slope; + + x = 1; + mean_x = mean_y = mean_xy = mean_x2 = 0.f; + + width = stop - start; + for ( i = start; i < stop; i++ ) + { + mean_x += x; + mean_x2 += x * x; + y = 20.f * log10f( max( 1.f, powerSpectrum[i] ) ); + mean_y += y; + mean_xy += y * x; + + x++; + } + mean_y /= width; + mean_x /= width; + mean_xy /= width; + mean_x2 /= width; + slope = ( mean_xy - mean_x * mean_y ) / ( mean_x2 - mean_x * mean_x ); + + return slope; +} + + +/*-------------------------------------------------------------------* + * IGF_getTNR() + * + * calculates tonal-to-noise ratio + *-------------------------------------------------------------------*/ + +/*! r: spectral tilt value */ +static float IGF_getTNR( + const float *powerSpectrum, /* i : energies */ + const int16_t start, /* i : start subband index */ + const int16_t stop, /* i : stop subband index */ + const float adap /* i : SFB width adaptation */ +) +{ + int16_t i; + int16_t width; + float avg = 0.f; + float tonal = 0.f; + float noise = EPSILON; + float tonalToNoise; + float rootSpec[300]; + + set_f( rootSpec, 0, 300 ); + + width = stop - start; + for ( i = start; i < stop; i++ ) + { + rootSpec[i - start] = sqrtf( powerSpectrum[i] ); + avg += rootSpec[i - start]; + } + avg /= width; + + for ( i = start; i < stop; i++ ) + { + float normSpec = rootSpec[i - start] / avg; + if ( normSpec > 1 + adap ) + { + tonal += rootSpec[i - start]; + } + else if ( normSpec < 1 ) + { + noise += rootSpec[i - start]; + } + } + + tonalToNoise = 20.f * log10f( max( 1e-018f, tonal / noise ) ); + + return tonalToNoise; +} + + +/*-------------------------------------------------------------------* + * IGF_getCrest() + * + * crest factor calculation + *-------------------------------------------------------------------*/ + +/*! r: crest factor */ +static float IGF_getCrest( + const float *powerSpectrum, /* i : power spectrum */ + const int16_t start, /* i : start subband index */ + const int16_t stop /* i : stop subband index */ +) +{ + int16_t i; + int16_t x; + int32_t x_eff = 0; + int16_t x_max = 0; + float crest = 1.f; + + for ( i = start; i < stop; i++ ) + { + x = max( 0, (int16_t) ( logf( max( FLT_MIN, powerSpectrum[i] ) ) * INV_LOG_2 ) ); + x_eff += x * x; + + if ( x > x_max ) + { + x_max = x; + } + } + + x_eff /= ( stop - start ); + + if ( x_eff > 0 && x_max > 0 ) + { + crest = max( 1.f, (float) x_max / sqrtf( (float) x_eff ) ); + } + + return crest; +} + + +/*-------------------------------------------------------------------* + * IGF_getSFM() + * + * calculates spectral flatness measurement + *-------------------------------------------------------------------*/ + +/*! r: SFM value */ +static float IGF_getSFM( + const float *powerSpectrum, /* i : energies */ + const int16_t start, /* i : start subband index */ + const int16_t stop /* i : stop subband index */ +) +{ + int16_t n; + int16_t i; + int16_t num; + float denom; + float numf; + float tmp; + float sfm; + + num = 0; + denom = 1.f; + sfm = 1.f; + + for ( i = start; i < stop; i++ ) + { + tmp = powerSpectrum[i]; + n = max( 0, (int16_t) ( logf( max( FLT_MIN, tmp ) ) * INV_LOG_2 ) ); + num += n; + denom += tmp; + } + + numf = (float) num / (float) ( stop - start ); + denom /= (float) ( stop - start ); + + if ( denom != 0 ) + { + sfm = min( ( powf( 2.0f, numf + 0.5f ) / denom ), 1.0f ); + } + + return sfm; +} + + +/*-------------------------------------------------------------------* + * IGF_CalculateEnvelope() + * + * envelope estimation + *-------------------------------------------------------------------*/ + +static void IGF_CalculateEnvelope( + const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i : instance handle of IGF Encoder */ + const float *pMDCTSpectrum, /* i : MDCT spectrum */ + const float *pPowerSpectrum, /* i : MDCT^2 + MDST^2 spectrum, or estimate */ + const int16_t igfGridIdx, /* i : IGF grid index */ + const int16_t isTransient, /* i : flag indicating if transient is detected */ + const int16_t last_core_acelp, /* i : indicator if last frame was ACELP core */ + const int16_t element_mode, /* i : IVAS element_mode */ + const float att /* i : attenuation */ +) +{ + IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData; + H_IGF_GRID hGrid; + int16_t *swb_offset; + int16_t sfb; /* this is the actual scalefactor band */ + int16_t width; /* this is width in subbands of the actual scalefactor band */ + int16_t tile_idx; + int16_t strt_cpy; + float gain; /* the gain which has to be applied to the source tile to get the destination energy */ + int16_t sb; + float sfbEnergyR; + float sfbEnergyC; /* the energy of the destination region of the tile */ + float sfbEnergyTileR; + float sfbEnergyTileC; /* the energy of the destination region of the tile */ + int16_t tmp; + float tmp_tb; + float tmp_sb; + int16_t sfbCnt; + + hPrivateData = &hIGFEnc->igfData; + hGrid = &hPrivateData->igfInfo.grid[(int16_t) igfGridIdx]; + swb_offset = hGrid->swb_offset; + + if ( element_mode > EVS_MONO ) + { + if ( igfGridIdx != IGF_GRID_LB_NORM ) + { + for ( sfbCnt = 0; sfbCnt < hGrid->sfbWrap[hGrid->nTiles] - hGrid->sfbWrap[0]; sfbCnt++ ) + { + /* reset filter */ + hPrivateData->prevSFM_FIR_SFB_TB[sfbCnt] = 0.f; + hPrivateData->prevSFM_IIR_SFB_TB[sfbCnt] = 0.f; + hPrivateData->prevSFM_FIR_SFB_SB[sfbCnt] = 0.f; + hPrivateData->prevSFM_IIR_SFB_SB[sfbCnt] = 0.f; + hPrivateData->prevDampingFactor_IIR[sfbCnt] = -1.f; + hPrivateData->dampingFactorSmoothing[sfbCnt] = 2; + } + } + } + + if ( pPowerSpectrum ) + { + for ( sb = hGrid->sbWrap[0]; sb < swb_offset[hGrid->sfbWrap[hGrid->nTiles]]; sb++ ) + { + hPrivateData->logSpec[sb] = max( 0, (int16_t) ( log( max( FLT_MIN, pPowerSpectrum[sb] ) ) * INV_LOG_2 ) ); + } + } + + for ( tile_idx = 0; tile_idx < hGrid->nTiles; tile_idx++ ) + { + strt_cpy = hGrid->sbWrap[tile_idx]; + + for ( sfb = hGrid->sfbWrap[tile_idx]; sfb < hGrid->sfbWrap[tile_idx + 1]; sfb++ ) + { + width = swb_offset[sfb + 1] - swb_offset[sfb]; + + sfbEnergyTileR = EPSILON; + sfbEnergyTileC = EPSILON; + sfbEnergyC = EPSILON; + + if ( pPowerSpectrum ) + { + tmp = strt_cpy; + for ( sb = swb_offset[sfb]; sb < swb_offset[sfb + 1]; sb++ ) + { + sfbEnergyC += pPowerSpectrum[sb]; + sfbEnergyTileR += pMDCTSpectrum[strt_cpy] * pMDCTSpectrum[strt_cpy]; + sfbEnergyTileC += pPowerSpectrum[strt_cpy]; + + strt_cpy++; + } + + sfbEnergyTileR /= width; + gain = (float) ( sfbEnergyTileR * ( sfbEnergyC / sfbEnergyTileC ) ); + + if ( element_mode > EVS_MONO ) + { + if ( !isTransient ) + { + float diffSFM; + float shiftedSFM = 0.f; + + tmp_tb = IGF_getSFM_new( pPowerSpectrum, hPrivateData->logSpec, swb_offset[sfb], swb_offset[sfb + 1] ) / IGF_getCrest_new( hPrivateData->logSpec, swb_offset[sfb], swb_offset[sfb + 1] ); + tmp_sb = IGF_getSFM_new( pPowerSpectrum, hPrivateData->logSpec, tmp, strt_cpy ) / IGF_getCrest_new( hPrivateData->logSpec, tmp, strt_cpy ); + + if ( last_core_acelp || hPrivateData->wasTransient ) + { + hPrivateData->prevSFM_FIR_SFB_TB[sfb] = hPrivateData->prevSFM_IIR_SFB_TB[sfb] = tmp_tb; + hPrivateData->prevSFM_FIR_SFB_SB[sfb] = hPrivateData->prevSFM_IIR_SFB_SB[sfb] = tmp_sb; + } + + hPrivateData->SFM_tb[sfb] = tmp_tb + hPrivateData->prevSFM_FIR_SFB_TB[sfb] + 0.5f * hPrivateData->prevSFM_IIR_SFB_TB[sfb]; + hPrivateData->SFM_tb[sfb] = min( 2.7f, hPrivateData->SFM_tb[sfb] ); + hPrivateData->SFM_sb[sfb] = tmp_sb + hPrivateData->prevSFM_FIR_SFB_SB[sfb] + 0.5f * hPrivateData->prevSFM_IIR_SFB_SB[sfb]; + hPrivateData->SFM_sb[sfb] = min( 2.7f, hPrivateData->SFM_sb[sfb] ); + + diffSFM = hPrivateData->SFM_sb[sfb] - hPrivateData->SFM_tb[sfb]; + + if ( diffSFM > 0.f && hPrivateData->SFM_tb[sfb] < 0.1f ) /* check whether target SFB is more tonal than source SFB */ + { + float currDampingFactor, dampingFactor; + float slope, threshold; + float tonalToNoise, adap; + float alpha; + + /* calculate spectral tilt to detect sudden drops (or increases) in energy in the current SFB */ + slope = IGF_getTilt( pPowerSpectrum, swb_offset[sfb], swb_offset[sfb + 1] ); + + /* determine whether strong tilt is due to a step in the spectrum (e.g. band limitation, no damping) + or a tonal component close the band border (apply damping) by calculating SFM for a shift of 1/2 SFB width*/ + threshold = 60.f / ( (float) width ); + if ( slope < -threshold ) + { + int16_t shift = width >> 1; + shiftedSFM = IGF_getSFM_new( pPowerSpectrum, hPrivateData->logSpec, swb_offset[sfb] - shift, swb_offset[sfb + 1] - shift ) / IGF_getCrest_new( hPrivateData->logSpec, swb_offset[sfb] - shift, swb_offset[sfb + 1] - shift ); + } + else if ( ( slope > 1.f * threshold ) && ( sfb != hGrid->sfbWrap[hGrid->nTiles] - 1 ) ) + { + int16_t shift = width >> 1; + shiftedSFM = IGF_getSFM_new( pPowerSpectrum, hPrivateData->logSpec, swb_offset[sfb] + shift, swb_offset[sfb + 1] + shift ) / IGF_getCrest_new( hPrivateData->logSpec, swb_offset[sfb] + shift, swb_offset[sfb + 1] + shift ); + } + + if ( shiftedSFM > 0.04f ) + { + currDampingFactor = 1.f; + } + else + { + alpha = min( 320.f / (float) swb_offset[sfb + 1], 1.25f ); + currDampingFactor = expf( 1.25f * alpha * logf( hPrivateData->SFM_tb[sfb] / hPrivateData->SFM_sb[sfb] ) ); + + + /* calculate tonal-to-noise ratio and reduce damping for low values*/ + adap = (float) width / 40.f; + tonalToNoise = IGF_getTNR( pPowerSpectrum, swb_offset[sfb], swb_offset[sfb + 1], adap ); + if ( ( tonalToNoise - ( 10 + adap ) ) < 0 ) + { + currDampingFactor += 0.03f * ( ( 10 + adap ) - tonalToNoise ); + } + } + + if ( last_core_acelp || hPrivateData->wasTransient || hPrivateData->prevDampingFactor_IIR[sfb] == -1 ) + { + hPrivateData->prevDampingFactor_IIR[sfb] = max( currDampingFactor, 0.1f ); + } + if ( last_core_acelp ) + { + hPrivateData->dampingFactorSmoothing[sfb] = 2; + } + + dampingFactor = ( currDampingFactor + hPrivateData->prevDampingFactor_IIR[sfb] ) / 2; + + gain *= min( dampingFactor + hPrivateData->dampingFactorSmoothing[sfb] * 0.1f, 1 ); + + hPrivateData->prevDampingFactor_IIR[sfb] = dampingFactor; + if ( hPrivateData->dampingFactorSmoothing[sfb] > 0 ) + { + hPrivateData->dampingFactorSmoothing[sfb]--; + } + } + else + { + hPrivateData->prevDampingFactor_IIR[sfb] = -1; + hPrivateData->dampingFactorSmoothing[sfb] = 1; + } + + hPrivateData->prevSFM_FIR_SFB_TB[sfb] = tmp_tb; + hPrivateData->prevSFM_IIR_SFB_TB[sfb] = hPrivateData->SFM_tb[sfb]; + hPrivateData->prevSFM_FIR_SFB_SB[sfb] = tmp_sb; + hPrivateData->prevSFM_IIR_SFB_SB[sfb] = hPrivateData->SFM_sb[sfb]; + } + else + { + hPrivateData->prevSFM_FIR_SFB_TB[sfb] = 0.f; + hPrivateData->prevSFM_IIR_SFB_TB[sfb] = 0.f; + hPrivateData->prevSFM_FIR_SFB_SB[sfb] = 0.f; + hPrivateData->prevSFM_IIR_SFB_SB[sfb] = 0.f; + hPrivateData->prevDampingFactor_IIR[sfb] = -1.f; + hPrivateData->dampingFactorSmoothing[sfb] = 2; + } + } + } + else + { + sfbEnergyR = EPSILON + sum2_f( pMDCTSpectrum + swb_offset[sfb], width ) / width; + gain = (float) ( sfbEnergyR ); + + if ( element_mode > EVS_MONO ) + { + hPrivateData->prevSFM_FIR_SFB_TB[sfb] = 0.f; + hPrivateData->prevSFM_IIR_SFB_TB[sfb] = 0.f; + hPrivateData->prevSFM_FIR_SFB_SB[sfb] = 0.f; + hPrivateData->prevSFM_IIR_SFB_SB[sfb] = 0.f; + hPrivateData->prevDampingFactor_IIR[sfb] = -1.f; + hPrivateData->dampingFactorSmoothing[sfb] = 2; + } + } + + gain *= att; + + gain = 0.5f + (float) ( 2.885390081777927f * logf( gain ) + 16.f ); + if ( !isTransient && ( hPrivateData->igfInfo.bitRateIndex == IGF_BITRATE_SWB_48000_CPE || hPrivateData->igfInfo.bitRateIndex == IGF_BITRATE_FB_48000_CPE ) ) + { + gain += 0.25f; /* better preservation of original HF band energy */ + } + if ( !isTransient && ( hPrivateData->igfInfo.bitRateIndex == IGF_BITRATE_SWB_64000_CPE || hPrivateData->igfInfo.bitRateIndex == IGF_BITRATE_FB_64000_CPE ) ) + { + gain += 0.125f; + } + gain = min( gain, 91.f ); /* 13+15+63, see arithcode encode residual */ + gain = max( gain, 0.f ); + + hPrivateData->igfScfQuantized[sfb] = (int16_t) ( gain ); + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * IGF_CalculateStereoEnvelope() + * + * envelope estimation + *-------------------------------------------------------------------*/ + +static void IGF_CalculateStereoEnvelope( + const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i : instance handle of IGF Encoder */ + const float *pMDCTSpectrum, /* i : MDCT spectrum */ + const float *pMDCTSpectrumMsInv, /* i : MDCT spectrum */ + const float *pPowerSpectrum, /* i : MDCT^2 + MDST^2 spectrum, or estimate */ + const float *pPowerSpectrumMsInv, /* i : inverse power spectrum */ + const int16_t igfGridIdx, /* i : IGF grid index */ + const int16_t coreMsMask[N_MAX], /* i : line wise ms Mask */ + const int16_t isTransient, /* i : flag indicating if transient is detected */ + const int16_t last_core_acelp /* i : indicator if last frame was ACELP core */ +) +{ + IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData; + H_IGF_GRID hGrid; + int16_t *swb_offset; + int16_t sfb; /* this is the actual scalefactor band */ + int16_t width; /* this is width in subbands of the actual scalefactor band */ + int16_t tile_idx; + int16_t strt_cpy; + float gain; /* the gain which has to be applied to the source tile to get the destination energy */ + int16_t sb; + float sfbEnergyR; + float sfbEnergyC; /* the energy of the destination region of the tile */ + float sfbEnergyTileR; + float sfbEnergyTileC; /* the energy of the destination region of the tile */ + int16_t tmp, x, y; + float mean_x, mean_y, mean_xy, mean_x2; + float slope; + float tmp_tb; + float tmp_sb; + int16_t sfbCnt; + float tileSrcSpec[MAX_IGF_SFB_LEN]; + + hPrivateData = &hIGFEnc->igfData; + hGrid = &hPrivateData->igfInfo.grid[(int16_t) igfGridIdx]; + swb_offset = hGrid->swb_offset; + + if ( igfGridIdx != IGF_GRID_LB_NORM ) + { + for ( sfbCnt = 0; sfbCnt < hGrid->sfbWrap[hGrid->nTiles] - hGrid->sfbWrap[0]; sfbCnt++ ) + { + /* reset filter */ + hPrivateData->prevSFM_FIR_SFB_TB[sfbCnt] = 0.f; + hPrivateData->prevSFM_IIR_SFB_TB[sfbCnt] = 0.f; + hPrivateData->prevSFM_FIR_SFB_SB[sfbCnt] = 0.f; + hPrivateData->prevSFM_IIR_SFB_SB[sfbCnt] = 0.f; + } + } + + if ( pPowerSpectrum ) + { + for ( sb = hGrid->sbWrap[0]; sb < swb_offset[hGrid->sfbWrap[hGrid->nTiles]]; sb++ ) + { + hPrivateData->logSpec[sb] = max( 0, (int16_t) ( logf( max( FLT_MIN, pPowerSpectrum[sb] ) ) * INV_LOG_2 ) ); + } + } + + for ( tile_idx = 0; tile_idx < hGrid->nTiles; tile_idx++ ) + { + strt_cpy = hGrid->sbWrap[tile_idx]; + + for ( sfb = hGrid->sfbWrap[tile_idx]; sfb < hGrid->sfbWrap[tile_idx + 1]; sfb++ ) + { + width = swb_offset[sfb + 1] - swb_offset[sfb]; + sfbEnergyTileR = EPSILON; + sfbEnergyTileC = EPSILON; + sfbEnergyC = EPSILON; + + if ( pPowerSpectrum ) + { + tmp = strt_cpy; + + for ( sb = swb_offset[sfb]; sb < swb_offset[sfb + 1]; sb++ ) + { + if ( coreMsMask[sb] != coreMsMask[strt_cpy] ) + { + sfbEnergyC += pPowerSpectrum[sb]; + sfbEnergyTileR += pMDCTSpectrumMsInv[strt_cpy] * pMDCTSpectrumMsInv[strt_cpy]; + sfbEnergyTileC += pPowerSpectrumMsInv[strt_cpy]; + tileSrcSpec[strt_cpy - tmp] = pPowerSpectrumMsInv[strt_cpy]; + } + else + { + sfbEnergyC += pPowerSpectrum[sb]; + sfbEnergyTileR += pMDCTSpectrum[strt_cpy] * pMDCTSpectrum[strt_cpy]; + sfbEnergyTileC += pPowerSpectrum[strt_cpy]; + tileSrcSpec[strt_cpy - tmp] = pPowerSpectrum[strt_cpy]; + } + strt_cpy++; + } + + sfbEnergyTileR /= width; + gain = (float) ( sfbEnergyTileR * ( sfbEnergyC / sfbEnergyTileC ) ); + + if ( !isTransient ) + { + float diffSFM; + float shiftedSFM = 0.f; + + tmp_tb = IGF_getSFM( pPowerSpectrum, swb_offset[sfb], swb_offset[sfb + 1] ) / IGF_getCrest( pPowerSpectrum, swb_offset[sfb], swb_offset[sfb + 1] ); + tmp_sb = IGF_getSFM( tileSrcSpec, 0, strt_cpy - tmp ) / IGF_getCrest( tileSrcSpec, 0, strt_cpy - tmp ); + + if ( last_core_acelp || hPrivateData->wasTransient ) + { + hPrivateData->prevSFM_FIR_SFB_TB[sfb] = hPrivateData->prevSFM_IIR_SFB_TB[sfb] = tmp_tb; + hPrivateData->prevSFM_FIR_SFB_SB[sfb] = hPrivateData->prevSFM_IIR_SFB_SB[sfb] = tmp_sb; + } + + hPrivateData->SFM_tb[sfb] = tmp_tb + hPrivateData->prevSFM_FIR_SFB_TB[sfb] + 0.5f * hPrivateData->prevSFM_IIR_SFB_TB[sfb]; + hPrivateData->SFM_tb[sfb] = min( 2.7f, hPrivateData->SFM_tb[sfb] ); + hPrivateData->SFM_sb[sfb] = tmp_sb + hPrivateData->prevSFM_FIR_SFB_SB[sfb] + 0.5f * hPrivateData->prevSFM_IIR_SFB_SB[sfb]; + hPrivateData->SFM_sb[sfb] = min( 2.7f, hPrivateData->SFM_sb[sfb] ); + + diffSFM = hPrivateData->SFM_sb[sfb] - hPrivateData->SFM_tb[sfb]; + + if ( diffSFM > 0.f && hPrivateData->SFM_tb[sfb] < 0.1f ) /* check whether target SFB is more tonal than source SFB */ + { + float currDampingFactor, dampingFactor, threshold, alpha; + + /* calculate spectral tilt to detect sudden drops (or increases) in energy in the current SFB */ + x = 1; + mean_x = mean_y = mean_xy = mean_x2 = 0; + for ( sb = swb_offset[sfb]; sb < swb_offset[sfb + 1]; sb++ ) + { + mean_x += x; + mean_x2 += x * x; + y = 20 * (int16_t) log10f( max( 1e-018f, pPowerSpectrum[sb] ) ); + mean_y += y; + mean_xy += y * x; + + x++; + } + mean_y /= width; + mean_x /= width; + mean_xy /= width; + mean_x2 /= width; + slope = ( mean_xy - mean_x * mean_y ) / ( mean_x2 - mean_x * mean_x ); + + /* determine whether strong tilt is due to a step in the spectrum (e.g. band limitation, no damping) + or a tonal component close the band border (apply damping) by calculating SFM for a shift of 1/2 SFB width*/ + threshold = 60.f / ( (float) width ); + if ( slope < -threshold ) + { + int16_t shift = width >> 1; + shiftedSFM = IGF_getSFM( pPowerSpectrum, swb_offset[sfb] - shift, swb_offset[sfb + 1] - shift ) / IGF_getCrest( pPowerSpectrum, swb_offset[sfb] - shift, swb_offset[sfb + 1] - shift ); + } + else if ( ( slope > 1.f * threshold ) && ( sfb != hGrid->sfbWrap[hGrid->nTiles] - 1 ) ) + { + int16_t shift = width >> 1; + shiftedSFM = IGF_getSFM( pPowerSpectrum, swb_offset[sfb] + shift, swb_offset[sfb + 1] + shift ) / IGF_getCrest( pPowerSpectrum, swb_offset[sfb] + shift, swb_offset[sfb + 1] + shift ); + } + + alpha = min( 320.f / (float) swb_offset[sfb + 1], 1.25f ); + currDampingFactor = expf( alpha * logf( hPrivateData->SFM_tb[sfb] / hPrivateData->SFM_sb[sfb] ) ); + + if ( shiftedSFM > 0.04f ) + { + currDampingFactor = 1.f; + } + + if ( last_core_acelp || hPrivateData->wasTransient || hPrivateData->prevDampingFactor_IIR[sfb] == -1 ) + { + hPrivateData->prevDampingFactor_IIR[sfb] = max( currDampingFactor, 0.1f ); + } + + { + float tonalToNoise; + float adap = ( (float) width ) / 30.f; + tonalToNoise = IGF_getTNR( pPowerSpectrum, swb_offset[sfb], swb_offset[sfb + 1], adap ); + if ( ( tonalToNoise - ( 10 + adap ) ) < 0 ) + { + currDampingFactor += 0.1f * ( ( 10 + adap ) - tonalToNoise ); + } + } + + dampingFactor = ( currDampingFactor + hPrivateData->prevDampingFactor_IIR[sfb] ) / 2; + dampingFactor = max( dampingFactor, hPrivateData->prevDampingFactor_IIR[sfb] / 2 ); + + gain *= min( dampingFactor + hPrivateData->dampingFactorSmoothing[sfb] * 0.1f, 1 ); + + hPrivateData->prevDampingFactor_IIR[sfb] = dampingFactor; + if ( hPrivateData->dampingFactorSmoothing[sfb] > 0 ) + { + hPrivateData->dampingFactorSmoothing[sfb]--; + } + } + else + { + hPrivateData->prevDampingFactor_IIR[sfb] = -1; + hPrivateData->dampingFactorSmoothing[sfb] = 1; + } + + hPrivateData->prevSFM_FIR_SFB_TB[sfb] = tmp_tb; + hPrivateData->prevSFM_IIR_SFB_TB[sfb] = hPrivateData->SFM_tb[sfb]; + hPrivateData->prevSFM_FIR_SFB_SB[sfb] = tmp_sb; + hPrivateData->prevSFM_IIR_SFB_SB[sfb] = hPrivateData->SFM_sb[sfb]; + } + else + { + hPrivateData->prevSFM_FIR_SFB_TB[sfb] = 0.f; + hPrivateData->prevSFM_IIR_SFB_TB[sfb] = 0.f; + hPrivateData->prevSFM_FIR_SFB_SB[sfb] = 0.f; + hPrivateData->prevSFM_IIR_SFB_SB[sfb] = 0.f; + + hPrivateData->dampingFactorSmoothing[sfb] = 2; + } + } + else + { + sfbEnergyR = EPSILON + sum2_f( pMDCTSpectrum + swb_offset[sfb], width ) / width; + gain = (float) ( sfbEnergyR ); + + hPrivateData->prevSFM_FIR_SFB_TB[sfb] = 0.f; + hPrivateData->prevSFM_IIR_SFB_TB[sfb] = 0.f; + hPrivateData->prevSFM_FIR_SFB_SB[sfb] = 0.f; + hPrivateData->prevSFM_IIR_SFB_SB[sfb] = 0.f; + } + + gain = 0.5f + (float) ( 2.885390081777927f * logf( gain ) + 16.f ); + if ( !isTransient && ( hPrivateData->igfInfo.bitRateIndex == IGF_BITRATE_SWB_48000_CPE || hPrivateData->igfInfo.bitRateIndex == IGF_BITRATE_FB_48000_CPE ) ) + { + gain += 0.25f; /* better preservation of original HF band energy */ + } + if ( !isTransient && ( hPrivateData->igfInfo.bitRateIndex == IGF_BITRATE_SWB_64000_CPE || hPrivateData->igfInfo.bitRateIndex == IGF_BITRATE_FB_64000_CPE ) ) + { + gain += 0.125f; + } + gain = min( gain, 91.f ); /* 13+15+63, see arithcode encode residual */ + gain = max( gain, 0.f ); + + hPrivateData->igfScfQuantized[sfb] = (int16_t) ( gain ); + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * IGF_WriteEnvelope() + * + * writes IGF SCF values + *-------------------------------------------------------------------*/ + +/*! r: number of bits writen */ +static int16_t IGF_WriteEnvelope( + const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i : instance handle of IGF Encoder */ + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + int16_t *pBitOffset, /* i : ptr to bitOffset counter */ + const int16_t igfGridIdx, /* i : igf grid index see declaration of IGF_GRID_IDX for details */ + const int16_t isIndepFlag, /* i : if 1 frame is independent, 0 = frame is coded with data from previous frame */ + int16_t *igfAllZero /* i : returns 1 if all IGF scfs are zero, else 0 */ +) +{ + IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData; + H_IGF_GRID hGrid; + int16_t totBitCount; + int16_t startBitCount; + int16_t sfb; + + startBitCount = *pBitOffset; + totBitCount = 0; + *igfAllZero = 1; + hPrivateData = &hIGFEnc->igfData; + hGrid = &hPrivateData->igfInfo.grid[igfGridIdx]; + + for ( sfb = hGrid->startSfb; sfb < hGrid->stopSfb; sfb++ ) + { + if ( hPrivateData->igfScfQuantized[sfb] != 0 ) + { + *igfAllZero = 0; + break; + } + } + + if ( *igfAllZero ) + { + IGF_write_bit( hBstr, pBitOffset, 1 ); + + if ( hBstr == NULL ) + { + IGFSCFEncoderSaveContextState( &hPrivateData->hIGFSCFArithEnc, igfGridIdx ); + } + + IGFSCFEncoderReset( &hPrivateData->hIGFSCFArithEnc ); + + if ( hBstr == NULL ) + { + IGFSCFEncoderRestoreContextState( &hPrivateData->hIGFSCFArithEnc, igfGridIdx ); + } + } + else + { + IGF_write_bit( hBstr, pBitOffset, 0 ); + + if ( hBstr == NULL ) + { + IGFSCFEncoderSaveContextState( &hPrivateData->hIGFSCFArithEnc, igfGridIdx ); + } + + *pBitOffset = IGFSCFEncoderEncode( &hPrivateData->hIGFSCFArithEnc, hBstr, *pBitOffset, &hPrivateData->igfScfQuantized[hGrid->startSfb], igfGridIdx, isIndepFlag ); + + if ( hBstr == NULL ) + { + IGFSCFEncoderRestoreContextState( &hPrivateData->hIGFSCFArithEnc, igfGridIdx ); + } + } + totBitCount = *pBitOffset - startBitCount; + + return totBitCount; +} + + +/*-------------------------------------------------------------------* + * IGF_ErodeSpectrum() + * + * identifies significant spectral content + *-------------------------------------------------------------------*/ + +/*! r: highPassEnergy */ +static float IGF_ErodeSpectrum( + const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i : instance handle of IGF Encoder */ + float *pSpectrum, /* i/o: MDCT spectrum */ + float *pPowerSpectrum, /* i/o: power spectrum */ + const int16_t igfGridIdx, /* i : IGF grid index */ + const int16_t mct_on /* i : flag mct block (1) or stereo (0) */ +) +{ + IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData; + H_IGF_GRID hGrid; + int16_t i; + int16_t igfBgn; + int16_t igfEnd; + float highPassEner; + float lastLine; + float nextLine; + float factor; + int16_t *igfScaleF; + int16_t startSfb; + int16_t stopSfb; + int16_t *swb_offset; + int16_t tmp; + int16_t sfb; + int16_t line; + + highPassEner = 0.f; + hPrivateData = &hIGFEnc->igfData; + hGrid = &hPrivateData->igfInfo.grid[(int16_t) igfGridIdx]; + igfBgn = hGrid->startLine; + igfEnd = hGrid->stopLine; + startSfb = hGrid->startSfb; + stopSfb = hGrid->stopSfb; + swb_offset = hGrid->swb_offset; + igfScaleF = hPrivateData->igfScfQuantized; + + if ( pPowerSpectrum == NULL ) + { + for ( i = igfBgn; i < hGrid->infoGranuleLen; i++ ) + { + pSpectrum[i] = 0.f; + } + return 0; + } + + if ( igfBgn > 0 ) + { + for ( i = 0; i < igfBgn; i++ ) + { + highPassEner += (float) i * pPowerSpectrum[i]; + } + + if ( hPrivateData->igfInfo.bitRateIndex == IGF_BITRATE_SWB_9600 || + hPrivateData->igfInfo.bitRateIndex == IGF_BITRATE_RF_SWB_13200 || + hPrivateData->igfInfo.bitRateIndex == IGF_BITRATE_SWB_13200 || + hPrivateData->igfInfo.bitRateIndex == IGF_BITRATE_SWB_16400_CPE ) + { + factor = 1.f; + } + else if ( mct_on && ( hPrivateData->igfInfo.bitRateIndex == IGF_BITRATE_SWB_48000_CPE || hPrivateData->igfInfo.bitRateIndex == IGF_BITRATE_SWB_64000_CPE ) ) + { + factor = 0.7f; + } + else + { + factor = 2.f; + } + highPassEner /= igfBgn * factor; /* for 9.6kbs use 1.f */ + lastLine = pSpectrum[i - 1]; + nextLine = ( pPowerSpectrum[i - 1] < highPassEner ) ? 0.0f : pSpectrum[i]; + + for ( /*i*/; i < igfEnd - 1; i++ ) + { + if ( pPowerSpectrum[i] < highPassEner ) + { + lastLine = pSpectrum[i]; + pSpectrum[i] = nextLine; + nextLine = 0.0f; + } + else + { + pSpectrum[i - 1] = lastLine; + lastLine = pSpectrum[i]; + nextLine = pSpectrum[i + 1]; + } + } + + /* i == igfEnd - 1 */ + if ( pPowerSpectrum[i] < highPassEner ) + { + pSpectrum[i] = 0.f; + } + } + + /* delete spectrum above igfEnd: */ + for ( i = igfEnd; i < hGrid->infoGranuleLen; i++ ) + { + pSpectrum[i] = 0.f; + pPowerSpectrum[i] = 0.f; + } + + if ( NULL != pPowerSpectrum ) + { + for ( sfb = startSfb; sfb < stopSfb; sfb++ ) + { + tmp = 0; + for ( line = swb_offset[sfb]; line < swb_offset[sfb + 1]; line++ ) + { + if ( pSpectrum[line] != 0.f ) + { + tmp++; + } + } + + if ( tmp && igfScaleF[sfb] ) + { + igfScaleF[sfb]--; + } + } + } + + return highPassEner; +} + + +/*-------------------------------------------------------------------* + * IGF_Whitening() + * + * calculates the IGF whitening levels by SFM and crest + *-------------------------------------------------------------------*/ + +static void IGF_Whitening( + const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i : | instance handle of IGF Encoder */ + float *powerSpectrum, /* i : Q31 | MDCT/MDST power spectrum */ + const int16_t igfGridIdx, /* i : Q0 | IGF grid index */ + const int16_t isTransient, /* i : Q0 | flag indicating if transient is detected */ + const int16_t last_core_acelp, /* i : Q0 | indicator if last frame was ACELP core */ + const int16_t isTNSActive, /* i : Q0 | indicator if TNS is active */ + const int16_t sp_aud_decision0, /* i : Q0 | first stage classifier decision */ + const int32_t brate, /* i : Q0 | bitrate */ + const int16_t element_mode /* i : Q0 | element mode */ +) +{ + IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData; + H_IGF_GRID hGrid; + int16_t p; + float tmp; + float SFM_src; + float SFM_tar; + int16_t num_Tiles; + float SFM; + + SFM = -1.f; + + hPrivateData = &hIGFEnc->igfData; + hGrid = &hPrivateData->igfInfo.grid[(int16_t) igfGridIdx]; + + if ( igfGridIdx != IGF_GRID_LB_NORM ) + { + for ( p = 0; p < hGrid->nTiles; p++ ) + { + /* reset filter */ + hPrivateData->prevSFM_FIR[p] = 0.f; + hPrivateData->prevSFM_IIR[p] = 0.f; + + /* preset values: */ + hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_OFF; + } + } + + for ( p = 0; p < IGF_MAX_TILES; p++ ) + { + /* update prev data: */ + hPrivateData->igfPrevWhiteningLevel[p] = hPrivateData->igfCurrWhiteningLevel[p]; + /* preset values: */ + hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_OFF; + } + + if ( !( isTransient || hPrivateData->wasTransient ) ) + { + if ( powerSpectrum ) + { + for ( p = 0; p < hGrid->nTiles; p++ ) + { + int16_t sb; + + if ( isTNSActive ) + { + for ( sb = hGrid->tile[p]; sb < hGrid->tile[p + 1]; sb++ ) + { + hPrivateData->logSpec[sb] = max( 0, (int16_t) ( logf( max( FLT_MIN, powerSpectrum[sb] ) ) * INV_LOG_2 ) ); + } + } + + /* if current tile contains only a single SFB, reuse already computed SFM values */ + if ( element_mode > EVS_MONO && ( hGrid->sfbWrap[p + 1] - hGrid->sfbWrap[p] ) == 1 ) + { + tmp = hPrivateData->SFM_tb[p]; + } + else + { + tmp = IGF_getSFM_new( powerSpectrum, hPrivateData->logSpec, hGrid->tile[p], hGrid->tile[p + 1] ) / IGF_getCrest_new( hPrivateData->logSpec, hGrid->tile[p], hGrid->tile[p + 1] ); + } + + if ( last_core_acelp || hPrivateData->wasTransient ) + { + hPrivateData->prevSFM_FIR[p] = hPrivateData->prevSFM_IIR[p] = tmp; + } + + if ( brate <= IVAS_48k && element_mode == IVAS_CPE_MDCT ) + { + num_Tiles = 0; + SFM_src = 0.f; + SFM_tar = 0.f; + + for ( sb = hGrid->sfbWrap[p]; sb < hGrid->sfbWrap[p + 1]; sb++ ) + { + num_Tiles++; + SFM_src += hPrivateData->SFM_sb[sb]; + SFM_tar += hPrivateData->SFM_tb[sb]; + } + + /* compute the average */ + SFM_src /= num_Tiles; + SFM_tar /= num_Tiles; + + if ( ( p > 0 ) && ( hPrivateData->igfInfo.bitRateIndex == IGF_BITRATE_SWB_48000_CPE || hPrivateData->igfInfo.bitRateIndex == IGF_BITRATE_FB_48000_CPE ) ) + { + if ( ( p == 1 ) && ( abs( hPrivateData->igfCurrWhiteningLevel[0] - hPrivateData->igfCurrWhiteningLevel[1] ) == 2 ) ) /* OFF vs. STRONG */ + { + hPrivateData->igfCurrWhiteningLevel[0] = IGF_WHITENING_MID; + } + hPrivateData->igfCurrWhiteningLevel[p] = hPrivateData->igfCurrWhiteningLevel[p - 1]; + } + else if ( sp_aud_decision0 ) + { + /* Music */ + /* whitening Off: when tonality of target is more than source or tonality of target is close to that of source */ + if ( ( SFM_tar <= SFM_src ) || ( SFM_tar <= ( SFM_src + 0.5f ) ) ) + { + hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_OFF; + } + + /* whitening mid: */ + if ( ( SFM_tar > ( SFM_src + 0.5f ) ) && ( SFM_tar <= ( SFM_src + 1.25f ) ) ) + { + hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_MID; + } + + /* whitening strong */ + if ( SFM_tar > ( SFM_src + 1.25f ) ) + { + hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_STRONG; + } + } + else + { + /* Speech */ + /* whitening Off: when tonality of target is more than source or tonality of target is close to that of source */ + if ( ( SFM_tar <= SFM_src ) || ( SFM_tar <= ( SFM_src + 0.1f ) ) ) + { + hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_OFF; + } + + /* whitening mid: */ + if ( ( SFM_tar > ( SFM_src + 0.1f ) ) && ( SFM_tar <= ( SFM_src + 0.5f ) ) ) + { + hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_MID; + } + + /* whitening strong */ + if ( SFM_tar > ( SFM_src + 0.5f ) ) + { + hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_STRONG; + } + } + + SFM = SFM_tar; + } + else + { + if ( element_mode > EVS_MONO && ( hGrid->sfbWrap[p + 1] - hGrid->sfbWrap[p] ) == 1 ) + { + SFM = tmp; + } + else + { + SFM = tmp + hPrivateData->prevSFM_FIR[p] + 0.5f * hPrivateData->prevSFM_IIR[p]; + SFM = min( 2.7f, SFM ); + } + + hPrivateData->prevSFM_FIR[p] = tmp; + hPrivateData->prevSFM_IIR[p] = SFM; + + if ( SFM > hGrid->whiteningThreshold[1][p] ) + { + hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_STRONG; + } + else if ( SFM > hGrid->whiteningThreshold[0][p] ) + { + hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_MID; + } + else + { + hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_OFF; + } + } + + if ( element_mode > EVS_MONO ) + { + if ( last_core_acelp ) /* reset */ + { + set_f( hPrivateData->igfPastSFM[p], -1.f, IGF_PAST_SFM_LEN ); + hPrivateData->igfWhiteningHangoverCnt[p] = 2; + } + else + { + /* check whether change in whitening level should be allowed or not (if SFM is inside a certain margin around thresholds) */ + if ( hPrivateData->igfCurrWhiteningLevel[p] != hPrivateData->igfPrevWhiteningLevel[p] && + ( ( SFM > hGrid->whiteningThreshold[0][p] - 0.15f && SFM < hGrid->whiteningThreshold[0][p] + 0.15f ) || + ( SFM > hGrid->whiteningThreshold[1][p] - 0.15f && SFM < hGrid->whiteningThreshold[1][p] + 0.15f ) ) ) + { + float mean_past_SFM = 0.f; + int16_t countable = 0; + int16_t i; + + /* compute mean of last (available) SFM values */ + for ( i = 0; i < IGF_PAST_SFM_LEN; i++ ) + { + if ( hPrivateData->igfPastSFM[p][i] >= 0.f ) + { + mean_past_SFM += hPrivateData->igfPastSFM[p][i]; + countable++; + } + } + if ( countable ) + { + mean_past_SFM /= countable; + + /* deny change in whitening level for small deviations from mean SFM */ + if ( fabs( SFM - mean_past_SFM ) < 0.2f ) + { + hPrivateData->igfCurrWhiteningLevel[p] = hPrivateData->igfPrevWhiteningLevel[p]; + } + } + } + } + + hPrivateData->igfPastSFM[p][hPrivateData->igfPastSFM_pos] = SFM; + } + } + + switch ( hPrivateData->igfInfo.bitRateIndex ) + { + case IGF_BITRATE_WB_9600: + case IGF_BITRATE_RF_WB_13200: + case IGF_BITRATE_WB_13200_CPE: + case IGF_BITRATE_WB_16400_CPE: + case IGF_BITRATE_RF_SWB_13200: + case IGF_BITRATE_SWB_9600: + case IGF_BITRATE_SWB_13200_CPE: + case IGF_BITRATE_SWB_16400: + case IGF_BITRATE_SWB_24400: + case IGF_BITRATE_SWB_24400_CPE: + case IGF_BITRATE_SWB_32000_CPE: + case IGF_BITRATE_SWB_32000: + case IGF_BITRATE_FB_16400: + case IGF_BITRATE_FB_24400: + case IGF_BITRATE_FB_24400_CPE: + case IGF_BITRATE_FB_32000_CPE: + case IGF_BITRATE_FB_32000: + hPrivateData->igfCurrWhiteningLevel[hGrid->nTiles - 1] = hPrivateData->igfCurrWhiteningLevel[hGrid->nTiles - 2]; + break; + default: + break; + } + } + else + { + for ( p = 0; p < hGrid->nTiles; p++ ) + { + hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_MID; + } + } + } + else + { + /* reset filter */ + for ( p = 0; p < IGF_MAX_TILES; p++ ) + { + hPrivateData->prevSFM_FIR[p] = 0.f; + hPrivateData->prevSFM_IIR[p] = 0.f; + } + } + + if ( element_mode > EVS_MONO ) + { + if ( SFM == -1.f ) /* reset */ + { + for ( p = 0; p < hGrid->nTiles; p++ ) + { + set_f( hPrivateData->igfPastSFM[p], -1.f, IGF_PAST_SFM_LEN ); + hPrivateData->igfWhiteningHangoverCnt[p] = 2; + } + } + + /* vibrato handling */ + for ( p = 0; p < hGrid->nTiles; p = p + 2 ) + { + if ( ( hPrivateData->igfPrevWhiteningLevel[p] == IGF_WHITENING_OFF && hPrivateData->igfCurrWhiteningLevel[p] != IGF_WHITENING_OFF ) || + ( hPrivateData->igfPrevWhiteningLevel[p + 1] == IGF_WHITENING_OFF && hPrivateData->igfCurrWhiteningLevel[p + 1] != IGF_WHITENING_OFF ) ) + { + int16_t i; + float pastSfm_a[4], pastSfm_b[4]; + float pastSfmDiffSum_a, pastSfmDiffSum_b; + + for ( i = 0; i < 4; i++ ) + { + pastSfm_a[i] = hPrivateData->igfPastSFM[p][( hPrivateData->igfPastSFM_pos + 4 - i ) % IGF_PAST_SFM_LEN]; + pastSfm_b[i] = hPrivateData->igfPastSFM[p + 1][( hPrivateData->igfPastSFM_pos + 4 - i ) % IGF_PAST_SFM_LEN]; + } + pastSfmDiffSum_a = pastSfmDiffSum_b = 0; + for ( i = 0; i < 3; i++ ) + { + if ( pastSfm_a[i + 1] != -1.f ) + { + pastSfmDiffSum_a += ( pastSfm_a[i] - pastSfm_a[i + 1] ); + pastSfmDiffSum_b += ( pastSfm_b[i] - pastSfm_b[i + 1] ); + } + else + { + break; + } + } + + /* if tonality oscillates between two tiles, turn whitening off in both */ + if ( ( ( pastSfmDiffSum_a > 0.f && pastSfmDiffSum_b < 0.f ) || + ( pastSfmDiffSum_a < 0.f && pastSfmDiffSum_b > 0.f ) ) && + ( fabs( pastSfmDiffSum_a - pastSfmDiffSum_b ) > 0.5f ) ) + { + hPrivateData->igfCurrWhiteningLevel[p] = hPrivateData->igfCurrWhiteningLevel[p + 1] = IGF_WHITENING_OFF; + } + } + } + + /* hangover */ + for ( p = 0; p < hGrid->nTiles; p++ ) + { + if ( hPrivateData->igfCurrWhiteningLevel[p] != hPrivateData->igfPrevWhiteningLevel[p] ) + { + hPrivateData->igfWhiteningHangoverCnt[p]++; + if ( hPrivateData->igfWhiteningHangoverCnt[p] == 3 ) + { + hPrivateData->igfWhiteningHangoverCnt[p] = 0; + } + else + { + hPrivateData->igfCurrWhiteningLevel[p] = hPrivateData->igfPrevWhiteningLevel[p]; + } + } + else + { + hPrivateData->igfWhiteningHangoverCnt[p] = 0; + } + } + + hPrivateData->igfPastSFM_pos = ( hPrivateData->igfPastSFM_pos + 1 ) % IGF_PAST_SFM_LEN; + } + + hPrivateData->wasTransient = isTransient; + + return; +} + + +/*-------------------------------------------------------------------* + * IGF_WriteWhiteningTile() + * + * write whitening levels into bitstream + *-------------------------------------------------------------------*/ + +/*! r: number of bits written */ +static int16_t IGF_WriteWhiteningTile( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + int16_t *pBitOffset, /* i : ptr to bitOffset counter */ + int16_t whiteningLevel /* i : whitening levels to write */ +) +{ + int16_t totBitCount; + int16_t startBitCount; + + totBitCount = 0; + startBitCount = *pBitOffset; + + if ( whiteningLevel == IGF_WHITENING_MID ) + { + IGF_write_bits( hBstr, pBitOffset, 0, 1 ); + } + else + { + IGF_write_bits( hBstr, pBitOffset, 1, 1 ); + if ( whiteningLevel == IGF_WHITENING_OFF ) + { + IGF_write_bits( hBstr, pBitOffset, 0, 1 ); + } + else + { + IGF_write_bits( hBstr, pBitOffset, 1, 1 ); + } + } + totBitCount = *pBitOffset - startBitCount; + + return totBitCount; +} + + +/*-------------------------------------------------------------------* + * IGF_WriteWhiteningLevels() + * + * writes the whitening levels + *-------------------------------------------------------------------*/ + +/*! r: total number of bits written */ +static int16_t IGF_WriteWhiteningLevels( + const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i : instance handle of IGF encoder */ + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + int16_t *pBitOffset, /* i : ptr to bitOffset counter */ + const int16_t igfGridIdx, /* i : igf grid index see declaration of IGF_GRID_IDX for details */ + const int16_t isIndepFlag /* i : if 1 frame is independent, 0 = frame is coded with data from previous frame */ +) +{ + IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData; + H_IGF_GRID hGrid; + int16_t p; + int16_t nTiles; + int16_t totBitCount; + int16_t isSame; + int16_t startBitCount; + + totBitCount = 0; + isSame = 1; + startBitCount = *pBitOffset; + hPrivateData = &hIGFEnc->igfData; + hGrid = &hPrivateData->igfInfo.grid[igfGridIdx]; + nTiles = hGrid->nTiles; + + if ( isIndepFlag ) + { + isSame = 0; + } + else + { + for ( p = 0; p < nTiles; p++ ) + { + if ( hPrivateData->igfCurrWhiteningLevel[p] != hPrivateData->igfPrevWhiteningLevel[p] ) + { + isSame = 0; + break; + } + } + } + + if ( isSame ) + { + IGF_write_bits( hBstr, pBitOffset, 1, 1 ); + } + else + { + if ( !isIndepFlag ) + { + IGF_write_bits( hBstr, pBitOffset, 0, 1 ); + } + + IGF_WriteWhiteningTile( hBstr, pBitOffset, hPrivateData->igfCurrWhiteningLevel[0] ); + + if ( hPrivateData->igfInfo.bitRateIndex == IGF_BITRATE_SWB_48000_CPE || hPrivateData->igfInfo.bitRateIndex == IGF_BITRATE_FB_48000_CPE ) + { + isSame = 1; + } + else + { + for ( p = 1; p < nTiles; p++ ) + { + isSame = 1; + if ( hPrivateData->igfCurrWhiteningLevel[p] != hPrivateData->igfCurrWhiteningLevel[p - 1] ) + { + isSame = 0; + break; + } + } + } + + if ( !isSame ) + { + IGF_write_bits( hBstr, pBitOffset, 1, 1 ); + + for ( p = 1; p < nTiles; p++ ) + { + IGF_WriteWhiteningTile( hBstr, pBitOffset, hPrivateData->igfCurrWhiteningLevel[p] ); + } + } + else if ( hPrivateData->igfInfo.bitRateIndex != IGF_BITRATE_SWB_48000_CPE && hPrivateData->igfInfo.bitRateIndex != IGF_BITRATE_FB_48000_CPE ) + { + IGF_write_bits( hBstr, pBitOffset, 0, 1 ); + } + } + + totBitCount = *pBitOffset - startBitCount; + + return totBitCount; +} + + +/*-------------------------------------------------------------------* + * IGF_WriteFlatteningTrigger() + * + * write flattening trigger + *-------------------------------------------------------------------*/ + +/*! r: number of bits written */ +static int16_t IGF_WriteFlatteningTrigger( + const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i : instance handle of IGF Encoder */ + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + int16_t *pBitOffset /* i : ptr to bitOffset counter */ +) +{ + int16_t totBitCount; + int16_t startBitCount; + int16_t flatteningTrigger; + + totBitCount = 0; + startBitCount = *pBitOffset; + flatteningTrigger = hIGFEnc->flatteningTrigger; + + IGF_write_bits( hBstr, pBitOffset, flatteningTrigger, 1 ); + + totBitCount = *pBitOffset - startBitCount; + + return totBitCount; +} + + +/*-------------------------------------------------------------------* + * IGF_UpdateInfo() + * + * updates the start/stop frequency of IGF according to igfGridIdx + *-------------------------------------------------------------------*/ + +static void IGF_UpdateInfo( + const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i : instance handle of IGF Encoder */ + const int16_t igfGridIdx /* i : IGF grid index */ +) +{ + H_IGF_GRID hGrid; + + hGrid = &hIGFEnc->igfData.igfInfo.grid[igfGridIdx]; + hIGFEnc->infoStartFrequency = hGrid->startFrequency; + hIGFEnc->infoStopFrequency = hGrid->stopFrequency; + hIGFEnc->infoStartLine = hGrid->startLine; + hIGFEnc->infoStopLine = hGrid->stopLine; + + return; +} + + +/*-------------------------------------------------------------------* + * IGFEncWriteBitstream() + * + * IGF bitstream writer + *-------------------------------------------------------------------*/ + +/*! r: number of bits written per frame */ +int16_t IGFEncWriteBitstream( + const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i : instance handle of IGF Encoder */ + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + int16_t *pBitOffset, /* i : ptr to bitOffset counter */ + const int16_t igfGridIdx, /* i : igf grid index see declaration of IGF_GRID_IDX for details */ + const int16_t isIndepFlag /* i : if 1 frame is independent, 0 = frame is coded with data from previous frame */ +) +{ + int16_t igfAllZero; + int16_t startBitCount = *pBitOffset; + + hIGFEnc->infoTotalBitsPerFrameWritten = 0; + if ( isIndepFlag ) + { + hIGFEnc->infoTotalBitsWritten = 0; + } + + IGF_WriteEnvelope( hIGFEnc, hBstr, pBitOffset, igfGridIdx, isIndepFlag, &igfAllZero ); + + IGF_WriteWhiteningLevels( hIGFEnc, hBstr, pBitOffset, igfGridIdx, isIndepFlag ); + + IGF_WriteFlatteningTrigger( hIGFEnc, hBstr, pBitOffset ); + + hIGFEnc->infoTotalBitsPerFrameWritten = ( *pBitOffset - startBitCount ); + hIGFEnc->infoTotalBitsWritten += hIGFEnc->infoTotalBitsPerFrameWritten; + + return hIGFEnc->infoTotalBitsPerFrameWritten; +} + + +/*-------------------------------------------------------------------* + * IGFEncSetMode() + * + * sets the IGF mode according to given bitrate + *-------------------------------------------------------------------*/ + +void IGFEncSetMode( + const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i/o: instance handle of IGF Encoder */ + const int32_t total_brate, /* i : encoder total bitrate */ + const int16_t bwidth, /* i : encoder audio bandwidth */ + const int16_t element_mode, /* i : IVAS element mode */ + const int16_t rf_mode /* i : flag to signal the RF mode */ +) +{ + int16_t i; + IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData; + + hPrivateData = &hIGFEnc->igfData; + hPrivateData->igfBitstreamBits = 0; + set_s( hPrivateData->igfScfQuantized, 0, IGF_MAX_SFB ); + set_s( hPrivateData->igfCurrWhiteningLevel, 0, IGF_MAX_TILES ); + set_s( hPrivateData->igfPrevWhiteningLevel, 0, IGF_MAX_TILES ); + set_s( hPrivateData->igfWhiteningHangoverCnt, 0, IGF_MAX_TILES ); + + for ( i = 0; i < IGF_MAX_TILES; i++ ) + { + set_f( hPrivateData->igfPastSFM[i], -1.f, IGF_PAST_SFM_LEN ); + } + + hPrivateData->igfPastSFM_pos = 0; + + for ( i = 0; i < IGF_BITBUFSIZE / 8; i++ ) + { + hPrivateData->igfBitstream[i] = 0; + } + + hPrivateData->wasTransient = 0; + set_f( hPrivateData->prevSFM_FIR, 0, IGF_MAX_TILES ); + set_f( hPrivateData->prevSFM_IIR, 0, IGF_MAX_TILES ); + set_s( hPrivateData->dampingFactorSmoothing, 2, IGF_MAX_SFB ); + set_f( hPrivateData->prevSFM_FIR_SFB_SB, 0, IGF_MAX_SFB ); + set_f( hPrivateData->prevSFM_IIR_SFB_SB, 0, IGF_MAX_SFB ); + set_f( hPrivateData->prevSFM_FIR_SFB_TB, 0, IGF_MAX_SFB ); + set_f( hPrivateData->prevSFM_IIR_SFB_TB, 0, IGF_MAX_SFB ); + set_f( hPrivateData->prevDampingFactor_IIR, -1, IGF_MAX_SFB ); + set_s( hPrivateData->logSpec, 0, L_FRAME_PLUS ); + set_f( hPrivateData->SFM_sb, 0.f, IGF_MAX_SFB ); + set_f( hPrivateData->SFM_tb, 0.f, IGF_MAX_SFB ); + + if ( IGFCommonFuncsIGFConfiguration( total_brate, bwidth, element_mode, &hPrivateData->igfInfo, rf_mode ) ) + { + IGFSCFEncoderOpen( &hPrivateData->hIGFSCFArithEnc, &hPrivateData->igfInfo, total_brate, bwidth, element_mode, rf_mode ); + + hIGFEnc->infoSamplingRate = hPrivateData->igfInfo.sampleRate; + hIGFEnc->infoStartFrequency = hPrivateData->igfInfo.grid[0].startFrequency; + hIGFEnc->infoStopFrequency = hPrivateData->igfInfo.grid[0].stopFrequency; + hIGFEnc->infoStartLine = hPrivateData->igfInfo.grid[0].startLine; + hIGFEnc->infoStopLine = hPrivateData->igfInfo.grid[0].stopLine; + } + else + { + /* IGF configuration failed -> error! */ + hIGFEnc->infoSamplingRate = 0; + hIGFEnc->infoStartFrequency = -1; + hIGFEnc->infoStopFrequency = -1; + hIGFEnc->infoStartLine = -1; + hIGFEnc->infoStopLine = -1; + IVAS_ERROR( IVAS_ERR_INTERNAL, "IGFEncSetMode: initialization error!" ); + } + + /* reset remaining variables */ + hIGFEnc->infoTotalBitsWritten = 0; + hIGFEnc->infoTotalBitsPerFrameWritten = 0; + hIGFEnc->flatteningTrigger = 0; + hIGFEnc->tns_predictionGain = 0; + set_f( hIGFEnc->spec_be_igf, 0, N_MAX_TCX - IGF_START_MN ); + + return; +} + + +/*-------------------------------------------------------------------* + * pack_bit() + * + * insert a bit into packed octet + *-------------------------------------------------------------------*/ + +static void pack_bit( + const int16_t bit, /* i : bit to be packed */ + uint8_t **pt, /* i/o: pointer to octet array into which bit will be placed */ + uint8_t *omask /* i/o: output mask to indicate where in the octet the bit is to be written */ +) +{ + if ( *omask == 0x80 ) + { + **pt = 0; + } + + if ( bit != 0 ) + { + **pt = **pt | *omask; + } + + *omask >>= 1; + if ( *omask == 0 ) + { + *omask = 0x80; + ( *pt )++; + } + + return; +} + + +/*-------------------------------------------------------------------* + * IGFEncConcatenateBitstream() + * + * IGF bitstream concatenation for TCX10 modes + *-------------------------------------------------------------------*/ + +void IGFEncConcatenateBitstream( + const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i : instance handle of IGF Encoder */ + const int16_t bsBits, /* i : number of IGF bits written to list of indices */ + BSTR_ENC_HANDLE hBstr /* i/o: bitstream handle */ +) +{ + int16_t i; + IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData; + Indice *ind_list; + uint8_t *pFrame; /* byte array with bit packet and byte aligned coded speech data */ + int16_t *pFrame_size; /* number of bits in the binary encoded access unit [bits] */ + int16_t k, nb_bits_written; + int32_t imask; + uint8_t omask; + + hPrivateData = &hIGFEnc->igfData; + + ind_list = &hBstr->ind_list[hBstr->nb_ind_tot - bsBits]; /* here, we assume that each bit has been written as a single indice */ + pFrame = hPrivateData->igfBitstream; + pFrame_size = &hPrivateData->igfBitstreamBits; + nb_bits_written = 0; + + omask = ( 0x80 >> ( *pFrame_size & 0x7 ) ); + pFrame += *pFrame_size >> 3; + + /* bitstream packing (conversion of individual indices into a serial stream) */ + for ( i = 0; i < bsBits; i++ ) + { + if ( ind_list[i].nb_bits > 0 ) + { + /* mask from MSB to LSB */ + imask = 1 << ( ind_list[i].nb_bits - 1 ); + + /* write bit by bit */ + for ( k = 0; k < ind_list[i].nb_bits; k++ ) + { + pack_bit( ind_list[i].value & imask, &pFrame, &omask ); + imask >>= 1; + } + nb_bits_written += ind_list[i].nb_bits; + + /* delete the indice */ + ind_list[i].nb_bits = -1; + } + } + + *pFrame_size += nb_bits_written; + + /* update list of indices */ + hBstr->nb_ind_tot -= bsBits; + hBstr->nb_bits_tot -= nb_bits_written; + + return; +} + + +/*-------------------------------------------------------------------* + * IGFEncResetTCX10BitCounter() + * + * IGF reset bitstream bit counter for TCX10 modes + *-------------------------------------------------------------------*/ + +void IGFEncResetTCX10BitCounter( + const IGF_ENC_INSTANCE_HANDLE hIGFEnc /* i : instance handle of IGF Encoder */ +) +{ + IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData; + + hPrivateData = &hIGFEnc->igfData; + hPrivateData->igfBitstreamBits = 0; + hIGFEnc->infoTotalBitsWritten = 0; + + return; +} + + +/*-------------------------------------------------------------------* + * IGFEncWriteConcatenatedBitstream() + * + * + *-------------------------------------------------------------------*/ + +/*! r: total number of bits written */ +int16_t IGFEncWriteConcatenatedBitstream( + const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i : instance handle of IGF Encoder */ + BSTR_ENC_HANDLE hBstr /* i/o: encoder bitstream handle */ +) +{ + IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData; + int16_t i; + int16_t bitsLeft; + UWord8 *pBitstream; + + hPrivateData = &hIGFEnc->igfData; + pBitstream = hPrivateData->igfBitstream; + + for ( i = 0; i < ( hPrivateData->igfBitstreamBits >> 3 ); i++ ) + { + push_next_indice( hBstr, pBitstream[i], 8 ); + } + + bitsLeft = hPrivateData->igfBitstreamBits & 0x7; + if ( bitsLeft > 0 ) + { + push_next_indice( hBstr, pBitstream[i] >> ( 8 - bitsLeft ), bitsLeft ); + } + + return hIGFEnc->infoTotalBitsWritten; +} + + +/*-------------------------------------------------------------------* + * IGFEncApplyMono() + * + * apply the IGF encoder, main encoder interface + *-------------------------------------------------------------------*/ + +void IGFEncApplyMono( + Encoder_State *st, /* i : Encoder state */ + const int16_t igfGridIdx, /* i : IGF grid index */ + float *pMDCTSpectrum, /* i/o: MDCT spectrum */ + float *pPowerSpectrum, /* i/o: MDCT^2 + MDST^2 spectrum, or estimate */ + const int16_t isTCX20, /* i : flag indicating if the input is TCX20 or TCX10/2xTCX5 */ + const int16_t isTNSActive, /* i : flag indicating if the TNS is active */ + const int16_t sp_aud_decision0, /* i : first stage switching decision */ + const int16_t vad_hover_flag /* i : VAD hangover flag */ +) +{ + float *pPowerSpectrumParameter; /* If it is NULL it informs a function that specific handling is needed */ + float att = 1.0f; + int16_t last_core_acelp; + + last_core_acelp = ( st->last_core == ACELP_CORE ); + + pPowerSpectrumParameter = !isTNSActive && isTCX20 ? pPowerSpectrum : NULL; + + IGF_UpdateInfo( st->hIGFEnc, igfGridIdx ); + + if ( st->element_mode == IVAS_CPE_DFT || st->element_mode == IVAS_CPE_TD ) + { + calculate_hangover_attenuation_gain( st, &att, vad_hover_flag ); + } + + + IGF_CalculateEnvelope( st->hIGFEnc, pMDCTSpectrum, pPowerSpectrumParameter, igfGridIdx, st->hTranDet->transientDetector.bIsAttackPresent, last_core_acelp, st->element_mode, att ); + + pPowerSpectrumParameter = isTCX20 ? pPowerSpectrum : NULL; + + IGF_Whitening( st->hIGFEnc, pPowerSpectrumParameter, igfGridIdx, st->hTranDet->transientDetector.bIsAttackPresent, last_core_acelp, isTNSActive, sp_aud_decision0, ( st->element_mode == IVAS_CPE_MDCT ? st->element_brate : st->total_brate ), st->element_mode ); + + IGF_ErodeSpectrum( st->hIGFEnc, pMDCTSpectrum, pPowerSpectrumParameter, igfGridIdx, 0 ); + + return; +} + + +/*-------------------------------------------------------------------* + * IGFEncApplyStereo() + * + * apply the IGF encoder, main encoder interface + *-------------------------------------------------------------------*/ + +void IGFEncApplyStereo( + STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct, /* i/o: MDCT stereo encoder structure */ + int16_t ms_mask[2][MAX_SFB], /* i : bandwise MS mask */ + const IGF_ENC_INSTANCE_HANDLE hIGFEnc[CPE_CHANNELS], /* i : instance handle of IGF Encoder */ + const int16_t igfGridIdx, /* i : IGF grid index */ + Encoder_State *sts[CPE_CHANNELS], /* i : Encoder state */ + float *pPowerSpectrum[CPE_CHANNELS], /* i/o: MDCT^2 + MDST^2 spectrum, or estimate */ + float *pPowerSpectrumMsInv[CPE_CHANNELS][NB_DIV], /* i/o: inverse power spectrum */ + float *inv_spectrum[CPE_CHANNELS][NB_DIV], /* i : inverse spectrum */ + const int16_t frameno, /* i : flag indicating index of current subfr. */ + const int16_t sp_aud_decision0, /* i : sp_aud_decision0 */ + const int32_t element_brate, /* i : element bitrate */ + const int16_t mct_on /* i : flag mct block (1) or stereo (0) */ +) +{ + float *pPowerSpectrumParameter[NB_DIV]; /* If it is NULL it informs a function that specific handling is needed */ + float *pPowerSpectrumParameterMsInv[NB_DIV]; + int16_t coreMsMask[N_MAX]; + int16_t sfb, ch, last_core_acelp; + STEREO_MDCT_BAND_PARAMETERS *sfbConf; + + /* assumptions: stereo filling was already done on the flattened spectra + * IGF region is always coded M/S, never L/R (to be done in the encoder) + * for residual bands with stereo filling infoTcxNoise is set to zero + * both channels have the same IGF configuration + */ + + /* sanity checks: check if both channels have the same configuration...*/ + assert( ( sts[0]->core == sts[1]->core ) ); + + /* initialization */ + sfbConf = ( sts[0]->core == TCX_20_CORE ) ? &hStereoMdct->stbParamsTCX20 : &hStereoMdct->stbParamsTCX10; + if ( sts[0]->last_core == ACELP_CORE ) + { + sfbConf = &hStereoMdct->stbParamsTCX20afterACELP; + } + + /* create line wise ms mask for the core bands */ + set_s( coreMsMask, 0, N_MAX ); + for ( sfb = 0; sfb < sfbConf->sfbCnt; sfb++ ) + { + set_s( &coreMsMask[sfbConf->sfbOffset[sfb]], ms_mask[frameno][sfb], sfbConf->sfbOffset[sfb + 1] - sfbConf->sfbOffset[sfb] ); + } + + if ( sts[0]->core == TCX_20_CORE && !sts[0]->hTcxEnc->fUseTns[frameno] && !sts[1]->hTcxEnc->fUseTns[frameno] ) + { + pPowerSpectrumParameter[0] = &pPowerSpectrum[0][0]; + pPowerSpectrumParameter[1] = &pPowerSpectrum[1][0]; + pPowerSpectrumParameterMsInv[0] = pPowerSpectrumMsInv[0][0]; + pPowerSpectrumParameterMsInv[1] = pPowerSpectrumMsInv[1][0]; + } + else + { + pPowerSpectrumParameter[0] = NULL; + pPowerSpectrumParameter[1] = NULL; + pPowerSpectrumParameterMsInv[0] = NULL; + pPowerSpectrumParameterMsInv[1] = NULL; + } + + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + last_core_acelp = ( sts[ch]->last_core == ACELP_CORE ); + + IGF_UpdateInfo( hIGFEnc[ch], igfGridIdx ); + + IGF_CalculateStereoEnvelope( hIGFEnc[ch], sts[ch]->hTcxEnc->spectrum[frameno], inv_spectrum[ch][frameno], pPowerSpectrumParameter[ch], pPowerSpectrumParameterMsInv[ch], igfGridIdx, coreMsMask, sts[ch]->hTranDet->transientDetector.bIsAttackPresent, last_core_acelp ); + + pPowerSpectrumParameter[ch] = sts[ch]->core == TCX_20_CORE ? pPowerSpectrum[ch] : NULL; + + IGF_Whitening( hIGFEnc[ch], pPowerSpectrumParameter[ch], igfGridIdx, sts[ch]->hTranDet->transientDetector.bIsAttackPresent, last_core_acelp, ( sts[0]->hTcxEnc->fUseTns[frameno] || sts[1]->hTcxEnc->fUseTns[frameno] ), sp_aud_decision0, element_brate, sts[ch]->element_mode ); + + IGF_ErodeSpectrum( hIGFEnc[ch], sts[ch]->hTcxEnc->spectrum[frameno], pPowerSpectrumParameter[ch], igfGridIdx, mct_on ); + } + + return; +} + + +/*-------------------------------------------------------------------* + * IGFSaveSpectrumForITF() + * + * + *-------------------------------------------------------------------*/ + +void IGFSaveSpectrumForITF( + IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i/o: instance handle of IGF Encoder */ + const int16_t igfGridIdx, /* i : IGF grid index */ + const float *pITFSpectrum /* i : MDCT spectrum */ +) +{ + IGF_UpdateInfo( hIGFEnc, igfGridIdx ); + + mvr2r( pITFSpectrum + IGF_START_MN, hIGFEnc->spec_be_igf, hIGFEnc->infoStopLine - IGF_START_MN ); + + return; +} + + +ivas_error IGF_Reconfig( + IGF_ENC_INSTANCE_HANDLE *hIGFEnc, /* i/o: instance handle of IGF Encoder */ + const int16_t igf, /* i : IGF on/off */ + const int16_t reset, /* i : reset flag */ + const int32_t brate, /* i : bitrate for configuration */ + const int16_t bwidth, /* i : signal bandwidth */ + const int16_t element_mode, /* i : IVAS element mode */ + const int16_t rf_mode /* i : flag to signal the RF mode */ +) +{ + ivas_error error; + + error = IVAS_ERR_OK; + + if ( igf && *hIGFEnc == NULL ) + { + if ( ( *hIGFEnc = (IGF_ENC_INSTANCE_HANDLE) malloc( sizeof( IGF_ENC_INSTANCE ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for hIGFEnc\n" ) ); + } + IGFEncSetMode( *hIGFEnc, brate, bwidth, element_mode, rf_mode ); + } + else if ( igf && reset ) + { + IGFEncSetMode( *hIGFEnc, brate, bwidth, element_mode, rf_mode ); + } + else if ( !igf && *hIGFEnc != NULL ) + { + free( *hIGFEnc ); + *hIGFEnc = NULL; + } + + return error; +} diff --git a/lib_enc/igf_scf_enc.c b/lib_enc/igf_scf_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..3c97808ef009009358ddd03f654d8676ba8cc353 --- /dev/null +++ b/lib_enc/igf_scf_enc.c @@ -0,0 +1,382 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "prot.h" +#include "stat_enc.h" +#include "stat_com.h" +#include "cnst.h" +#include "wmc_auto.h" + + +/*---------------------------------------------------------------------* + * IGFSCFEncoderOpen() + * + * initialization of an instance of this module, pass a ptr to a hPublicData + *---------------------------------------------------------------------*/ + +void IGFSCFEncoderOpen( + IGFSCFENC_INSTANCE_HANDLE hPublicData, /* i/o: handle to public data */ + H_IGF_INFO hIgfInfo, /* i : IGF info handle */ + const int32_t total_brate, /* i : total bitrate */ + const int16_t bwidth, /* i : audio bandwidth */ + const int16_t element_mode, /* i : IVAS element mode */ + const int16_t rf_mode /* i : flag to signal the RF mode */ +) +{ + + hPublicData->ptrBitIndex = 0; + hPublicData->bitCount = 0; + hPublicData->Tsave = 0; + hPublicData->contex_saved = 0; + hPublicData->acState.low = 0; + hPublicData->acState.high = 0; + hPublicData->acState.bits_to_follow = 0; + set_s( hPublicData->prev, 0, 64 ); + set_s( hPublicData->prevSave, 0, 64 ); + + hPublicData->scfCountLongBlock[0] = hIgfInfo->grid[0].swb_offset_len - 1; + hPublicData->scfCountLongBlock[1] = hIgfInfo->grid[1].swb_offset_len - 1; + hPublicData->scfCountLongBlock[2] = hIgfInfo->grid[2].swb_offset_len - 1; + hPublicData->t = 0; /* protect against the invalid request of starting encoding with a dependent block */ + + IGFCommonFuncsIGFGetCFTables( total_brate, bwidth, element_mode, rf_mode, &hPublicData->cf_se00, &hPublicData->cf_se01, &hPublicData->cf_off_se01, &hPublicData->cf_se02, &hPublicData->cf_off_se02, &hPublicData->cf_se10, &hPublicData->cf_off_se10, &hPublicData->cf_se11, &hPublicData->cf_off_se11 ); + + return; +} + + +/*---------------------------------------------------------------------* + * quant_ctx() + * + * + *---------------------------------------------------------------------*/ + +static int16_t quant_ctx( + const int16_t ctx ) +{ + /* + ctx ... -5 -4 -3 -2 -1 0 1 2 3 4 5 ... + Q(ctx)... -3 -3 -3 -2 -1 0 1 2 3 3 3 ... + */ + if ( abs( ctx ) <= 3 ) + { + return ctx; + } + else if ( ctx > 3 ) + { + return 3; + } + else /* ctx < -3 */ + { + return -3; + } +} + + +/*---------------------------------------------------------------------* + * arith_encode_bits() + * + * + *---------------------------------------------------------------------*/ + +static void arith_encode_bits( + IGFSCFENC_INSTANCE_HANDLE hPrivateData, /* i/o: instance handle */ + int16_t *ptr, /* i : pointer to expanded bit buffer, one bit in each short*/ + const int16_t x, /* i : value to encode */ + const int16_t nBits /* i : number of bits to encode */ +) +{ + int16_t i; + int16_t bit; + + for ( i = nBits - 1; i >= 0; --i ) + { + bit = ( x >> i ) & 1; + hPrivateData->ptrBitIndex = ari_encode_14bits_sign( ptr, hPrivateData->ptrBitIndex, MAX16B, /* disable the bit count limitation */ &hPrivateData->acState, bit ); + } + + return; +} + + +/*---------------------------------------------------------------------* + * arith_encode_residual() + * + * + *---------------------------------------------------------------------*/ + +static void arith_encode_residual( + IGFSCFENC_INSTANCE_HANDLE hPrivateData, /* i/o: instance handle */ + int16_t *ptr, /* i : pointer to expanded bit buffer, one bit in each short */ + int16_t x, /* i : prediction residual to encode */ + const uint16_t *cumulativeFrequencyTable, /* i : cumulative frequency table to be used */ + const int16_t tableOffset /* i : offset used to align the table */ +) +{ + int16_t extra; + + x += tableOffset; + if ( ( x >= IGF_MIN_ENC_SEPARATE ) && ( x <= IGF_MAX_ENC_SEPARATE ) ) + { + /* encode one of the IGF_SYMBOLS_IN_TABLE == 27 alphabet symbols using the new raw AC function */ + hPrivateData->ptrBitIndex = ari_encode_14bits_ext( ptr, hPrivateData->ptrBitIndex, &hPrivateData->acState, ( x - IGF_MIN_ENC_SEPARATE ) + 1, cumulativeFrequencyTable ); + + return; + } + else if ( x < IGF_MIN_ENC_SEPARATE ) + { + /* send escape code 0 to indicate x <= IGF_MIN_ENC_SEPARATE - 1 */ + extra = ( IGF_MIN_ENC_SEPARATE - 1 ) - x; + hPrivateData->ptrBitIndex = ari_encode_14bits_ext( ptr, hPrivateData->ptrBitIndex, &hPrivateData->acState, 0, cumulativeFrequencyTable ); + } + else + { + /* x > IGF_MAX_ENC_SEPARATE */ + /* send escape code (IGF_SYMBOLS_IN_TABLE - 1) to indicate x >= IGF_MAX_ENC_SEPARATE + 1 */ + extra = x - ( IGF_MAX_ENC_SEPARATE + 1 ); + hPrivateData->ptrBitIndex = ari_encode_14bits_ext( ptr, hPrivateData->ptrBitIndex, &hPrivateData->acState, IGF_SYMBOLS_IN_TABLE - 1, cumulativeFrequencyTable ); + } + + /* encode one of the tails of the distribution */ + if ( extra < 15 ) + { + /* encode extra with 4 bits if extra < 15 */ + arith_encode_bits( hPrivateData, ptr, extra, 4 ); + } + else + { + /* extra >= 15 */ + /* send escape code 15 to indicate extra >= 15 */ + arith_encode_bits( hPrivateData, ptr, 15, 4 ); + extra -= 15; + + if ( extra < 63 ) + { + /* encode additional extra with 6 bits */ + arith_encode_bits( hPrivateData, ptr, extra, 6 ); + } + else /* extra >= 63 */ + { + arith_encode_bits( hPrivateData, ptr, 63, 6 ); + extra -= 63; + /* encode safety extra with 7 bits */ + arith_encode_bits( hPrivateData, ptr, extra, 7 ); + } + } + + return; +} + + +/*---------------------------------------------------------------------* + * encode_sfe_vector() + * + * + *---------------------------------------------------------------------*/ + +static void encode_sfe_vector( + IGFSCFENC_INSTANCE_HANDLE hPrivateData, /* i/o: instance handle */ + int16_t *ptr, /* i : pointer to expanded bit buffer, one bit in each short */ + const int16_t t, /* i : frame counter reset to 0 at each independent frame */ + int16_t *prev_x, /* i : previous vector */ + int16_t *x, /* i : current vector to encode */ + const int16_t length /* i : number of elements to encode */ +) +{ + /* + f + ^ + | d a x + | c b + | e --> t + */ + int16_t f, pred; + int16_t ctx, ctx_f, ctx_t; + + for ( f = 0; f < length; f++ ) + { + if ( t == 0 ) + { + if ( f == 0 ) + { + /* encode one of the IGF_SYMBOLS_IN_TABLE == 27 alphabet symbols using the new raw AC function */ + hPrivateData->ptrBitIndex = ari_encode_14bits_ext( ptr, hPrivateData->ptrBitIndex, &hPrivateData->acState, x[f] >> 2, hPrivateData->cf_se00 ); + arith_encode_bits( hPrivateData, ptr, x[f] & 3, 2 ); /* LSBs as 2 bit raw */ + } + else if ( f == 1 ) + { + pred = x[f - 1]; /* pred = b */ + arith_encode_residual( hPrivateData, ptr, x[f] - pred, hPrivateData->cf_se01, hPrivateData->cf_off_se01 ); + } + else + { + /* f >= 2 */ + pred = x[f - 1]; /* pred = b */ + ctx = quant_ctx( x[f - 1] - x[f - 2] ); /* Q(b - e) */ + arith_encode_residual( hPrivateData, ptr, x[f] - pred, &hPrivateData->cf_se02[( IGF_SYMBOLS_IN_TABLE + 1 ) * ( IGF_CTX_OFFSET + ctx )], hPrivateData->cf_off_se02[IGF_CTX_OFFSET + ctx] ); + } + } + else + { + /* t == 1 */ + if ( f == 0 ) + { + pred = prev_x[f]; /* pred = a */ + arith_encode_residual( hPrivateData, ptr, x[f] - pred, hPrivateData->cf_se10, hPrivateData->cf_off_se10 ); + } + else + { + /* (t == 1) && (f >= 1) */ + pred = prev_x[f] + x[f - 1] - prev_x[f - 1]; /* pred = a + b - c */ + ctx_f = quant_ctx( prev_x[f] - prev_x[f - 1] ); /* Q(a - c) */ + ctx_t = quant_ctx( x[f - 1] - prev_x[f - 1] ); /* Q(b - c) */ + arith_encode_residual( hPrivateData, ptr, x[f] - pred, &hPrivateData->cf_se11[( IGF_SYMBOLS_IN_TABLE + 1 ) * IGF_CTX_COUNT * ( IGF_CTX_OFFSET + ctx_t ) + ( IGF_SYMBOLS_IN_TABLE + 1 ) * ( IGF_CTX_OFFSET + ctx_f )], hPrivateData->cf_off_se11[IGF_CTX_COUNT * ( IGF_CTX_OFFSET + ctx_t ) + ( IGF_CTX_OFFSET + ctx_f )] ); + } + } + } + + return; +} + + +/*---------------------------------------------------------------------* + * IGFSCFEncoderReset() + * + * Reset of Arith enc context memory + *---------------------------------------------------------------------*/ + +void IGFSCFEncoderReset( + IGFSCFENC_INSTANCE_HANDLE hPublicData /* i/o: handle to public data */ +) +{ + hPublicData->t = 0; + + /* we do not need to fill hPublicData->prev with zeros, because when t = 0 no previous information is used */ + + return; +} + + +/*---------------------------------------------------------------------* + * IGFSCFEncoderEncode() + * + * main IGF encoder function + *---------------------------------------------------------------------*/ + +int16_t IGFSCFEncoderEncode( + IGFSCFENC_INSTANCE_HANDLE hPublicData, /* i/o: handle to public data or NULL in case there was no instance created */ + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const int16_t bitCount, /* i : offset to the first bit in bitbuffer which should be readed by iisArithDecoderDecode function */ + int16_t *sfe, /* i : ptr to an array which contain quantized scalefactor energies */ + const int16_t igfGridIdx, /* i : igf grid index see declaration of IGF_GRID_IDX for details */ + const int16_t indepFlag /* i : if 1 frame is independent, 0 = frame is coded with data from previous frame */ +) +{ + int16_t ptr[IGF_BITBUFSIZE]; /* temporary expanded bit buffer, one bit in each short */ + int16_t i; + + /* insert data: */ + hPublicData->ptrBitIndex = 0; + hPublicData->bitCount = bitCount; + ari_start_encoding_14bits( &hPublicData->acState ); /* start AC encoding */ + + /* check if coder needs a reset and do it if necessary */ + if ( indepFlag ) + { + IGFSCFEncoderReset( hPublicData ); + } + + encode_sfe_vector( hPublicData, ptr, hPublicData->t, hPublicData->prev, sfe, hPublicData->scfCountLongBlock[igfGridIdx] ); + + hPublicData->ptrBitIndex = ari_done_encoding_14bits( ptr, hPublicData->ptrBitIndex, &hPublicData->acState ); /* finish AC encoding */ + hPublicData->bitCount = hPublicData->bitCount + hPublicData->ptrBitIndex; + + /* advancing history: */ + mvs2s( sfe, hPublicData->prev, hPublicData->scfCountLongBlock[igfGridIdx] ); + hPublicData->t++; + + /* copy the bits from the temporary bit buffer, if doRealEncoding is enabled */ + if ( hBstr ) + { + for ( i = 0; i < hPublicData->ptrBitIndex; ++i ) + { + push_next_indice( hBstr, ptr[i], 1 ); + } + } + + /* return next bit offset in the stream */ + return hPublicData->bitCount; +} + + +/*---------------------------------------------------------------------* + * IGFSCFEncoderSaveContextState() + * + * for a closed loop enc, the ArithEncoder needs to memorize the context + *---------------------------------------------------------------------*/ + +void IGFSCFEncoderSaveContextState( + IGFSCFENC_INSTANCE_HANDLE hPublicData, /* i/o: handle to public data or NULL in case there was no instance created */ + const int16_t igfGridIdx /* i : igf grid index see declaration of IGF_GRID_IDX for details */ +) +{ + hPublicData->Tsave = hPublicData->t; + + mvs2s( hPublicData->prev, hPublicData->prevSave, hPublicData->scfCountLongBlock[igfGridIdx] ); + + return; +} + + +/*---------------------------------------------------------------------* + * IGFSCFEncoderRestoreContextState() + * + * for a closed loop enc, the ArithEncoder needs to memorize the context + *---------------------------------------------------------------------*/ + +void IGFSCFEncoderRestoreContextState( + IGFSCFENC_INSTANCE_HANDLE hPublicData, /* i/o: handle to public data or NULL in case there was no instance created */ + const int16_t igfGridIdx /* i : igf grid index see declaration of IGF_GRID_IDX for details */ +) +{ + hPublicData->t = hPublicData->Tsave; + + mvs2s( hPublicData->prevSave, hPublicData->prev, hPublicData->scfCountLongBlock[igfGridIdx] ); + + return; +} diff --git a/lib_enc/init_enc.c b/lib_enc/init_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..7ac925cf08900e82bd65fb9842e78fda12fdb639 --- /dev/null +++ b/lib_enc/init_enc.c @@ -0,0 +1,925 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "rom_com.h" +#include "rom_enc.h" +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_cnst.h" +#include "wmc_auto.h" + +/*-----------------------------------------------------------------------* + * init_encoder() + * + * Initialization of state variables + *-----------------------------------------------------------------------*/ + +ivas_error init_encoder( + Encoder_State *st, /* i/o: state structure */ + Encoder_Struct *st_ivas, /* i/o: encoder state structure */ + const int16_t idchan, /* i : channel ID */ + const int16_t var_SID_rate_flag, /* i : flag for variable SID update rate */ + const int16_t interval_SID, /* i : interval for SID update */ + const int16_t vad_only_flag, /* i : flag to indicate front-VAD structure */ + const ISM_MODE ism_mode, /* i : ISM mode */ + const int32_t element_brate /* i : element bitrate */ +) +{ + int16_t i; + ivas_error error; + int32_t igf_brate; + + error = IVAS_ERR_OK; + + /*-----------------------------------------------------------------* + * General parameters + *-----------------------------------------------------------------*/ + + if ( st->Opt_AMR_WB ) + { + st->last_core = AMR_WB_CORE; + } + else + { + st->last_core = -1; + } + + st->L_frame = L_FRAME; + st->last_coder_type = GENERIC; + st->coder_type = GENERIC; + st->last_total_brate = st->total_brate; + st->last_bits_frame_nominal = -1; + st->last_total_brate_cng = -1; + st->last_core_brate = st->total_brate; + st->dtx_sce_sba = 0; + st->extl = -1; + st->last_extl = -1; + st->last_L_frame = L_FRAME; + st->rate_switching_reset = 0; + st->rate_switching_reset_16kHz = 0; + st->clas = UNVOICED_CLAS; + st->low_rate_mode = 0; + st->ini_frame = 0; + st->inactive_coder_type_flag = 0; + + st->coder_type_raw = VOICED; + st->last_coder_type_raw = st->coder_type_raw; + + st->flag_ACELP16k = set_ACELP_flag( st->element_mode, st->total_brate, st->total_brate, idchan, 0, -1, -1 ); + + st->is_ism_format = 0; + if ( ism_mode != ISM_MODE_NONE ) + { + st->is_ism_format = 1; + } + + /*-----------------------------------------------------------------* + * Bitstream + *-----------------------------------------------------------------*/ + + if ( !vad_only_flag ) + { + if ( ( st->hBstr = (BSTR_ENC_HANDLE) malloc( sizeof( BSTR_ENC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Bitstream structure\n" ) ); + } + + /* set pointer to the buffer of indices */ + st->hBstr->ind_list = st_ivas->ind_list; + st->hBstr->ivas_ind_list_zero = &st_ivas->ind_list; + st->hBstr->ivas_max_num_indices = &st_ivas->ivas_max_num_indices; + st->hBstr->nb_ind_tot = 0; + st->hBstr->nb_bits_tot = 0; + st->hBstr->st_ivas = st_ivas; + } + else + { + st->hBstr = NULL; + } + + /*-----------------------------------------------------------------* + * Pre-processing and ACELP core parameters + *-----------------------------------------------------------------*/ + + mvr2r( GEWB_Ave, st->mem_AR, M ); + mvr2r( GEWB_Ave, st->lsfoldbfi0, M ); + mvr2r( GEWB_Ave, st->lsfoldbfi1, M ); + mvr2r( GEWB_Ave, st->lsf_adaptive_mean, M ); + + st->next_force_safety_net = 0; + + st->pstreaklen = 0; + st->streaklimit = 1.0f; + set_f( st->mem_MA, 0, M ); + + init_gp_clip( st->clip_var ); + pitch_ol_init( &st->old_thres, &st->old_pitch, &st->delta_pit, &st->old_corr ); + set_f( st->old_wsp, 0, L_WSP_MEM ); + set_f( st->old_wsp2, 0, ( L_WSP_MEM - L_INTERPOL ) / OPL_DECIM ); + + st->mem_preemph = 0.0f; + st->mem_preemph16k = 0.0f; + st->mem_preemph_enc = 0.0; + + /* AVQ pre-quantizer memory */ + st->mem_preemp_preQ = 0.0f; + st->mem_deemp_preQ = 0.0f; + st->last_nq_preQ = 0; + st->last_code_preq = 0; + st->use_acelp_preq = 0; + st->last_harm_flag_acelp = 0; + + /* (Decimated) Weighted Speech Memory */ + st->mem_wsp_enc = 0.0; + st->mem_wsp = 0.0f; + + set_f( st->mem_decim2, 0, 3 ); + set_f( st->Bin_E, 0, L_FFT ); + + st->ee_old = 10.0f; + st->Nb_ACELP_frames = 0; + st->audio_frame_cnt = AUDIO_COUNTER_INI; /* Initialization of the audio frame counter mildly into the audio mode */ + + /* adaptive lag window memory */ + st->old_pitch_la = 0; + + if ( st->input_Fs == 8000 ) + { + st->min_band = 1; + st->max_band = 16; + } + else + { + st->min_band = 0; + st->max_band = 19; + } + + if ( st->Opt_AMR_WB ) + { + mvr2r( mean_isf_amr_wb, st->lsf_old, M ); + isf2isp( st->lsf_old, st->lsp_old1, M, INT_FS_12k8 ); + } + else + { + mvr2r( GEWB_Ave, st->lsf_old, M ); + lsf2lsp( st->lsf_old, st->lsp_old1, M, INT_FS_12k8 ); + } + + mvr2r( st->lsf_old, st->lsf_old1, M ); + mvr2r( st->lsp_old1, st->lsp_old, M ); + mvr2r( st->lsp_old, st->lsp_old16k, M ); + mvr2r( st->lsp_old, st->lspold_enc, M ); + + st->stab_fac = 0.0f; + + /* Bass post-filter memories - encoder side of MODE2 */ + st->bpf_off = 0; + st->pst_mem_deemp_err = 0.0f; + st->pst_lp_ener = 0.0f; + + /* TC coder type */ + st->tc_cnt = 0; + + /* find_uv() parameters */ + st->old_dE1 = 0.0f; + st->old_ind_deltaMax = 0; + set_f( st->old_enr_ssf, 0.0f, 2 * NB_SSF ); + st->spike_hyst = -1; + + /* stereo switching memories */ + st->mem_preemph_DFT = 0.0f; + set_f( st->inp_12k8_mem_stereo_sw, 0, STEREO_DFT_OVL_12k8 - L_MEM_RECALC_12K8 - L_FILT ); + st->mem_preemph16k_DFT = 0.0f; + set_f( st->inp_16k_mem_stereo_sw, 0, STEREO_DFT_OVL_16k - L_MEM_RECALC_16K - L_FILT16k ); + + st->sharpFlag = 0; + + /* Stationary noise UV modification */ + st->ge_sm = 10; + st->uv_count = 0; + st->act_count = 3; + mvr2r( st->lsp_old, st->lspold_s, M ); + st->noimix_seed = RANDOM_INITSEED; + st->min_alpha = 1; + st->exc_pe = 0; + + /* FEC */ + st->last_clas = UNVOICED_CLAS; + st->prev_fmerit = 0.0f; + st->fmerit_dt = 0.0f; + st->Last_pulse_pos = 0; + + for ( i = 0; i < 2 * NB_SUBFR16k; i++ ) + { + st->old_pitch_buf[i] = L_SUBFR; + } + + /* mode1 core switching */ + st->old_Es_pred = 0; + set_f( st->old_Aq_12_8 + 1, 0, M ); + st->old_Aq_12_8[0] = 1; + + /* stable short pitch detection */ + st->voicing0_sm = 0; + st->voicing_sm = 0; + st->LF_EnergyRatio_sm = 1; + st->predecision_flag = 0; + st->diff_sm = 0; + st->energy_sm = 0; + + set_s( st->pitch, L_SUBFR, 3 ); + set_f( st->voicing, 0.0f, 3 ); + + /*-----------------------------------------------------------------* + * General signal buffers + *-----------------------------------------------------------------*/ + + if ( !vad_only_flag ) + { + if ( ( st->hSignalBuf = (SIGNAL_BUFFERS_ENC_HANDLE) malloc( sizeof( SIGNAL_BUFFERS_ENC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Signal buffers\n" ) ); + } + + st->Bin_E_old = st->hSignalBuf->Bin_E_old; + st->mem_decim = st->hSignalBuf->mem_decim; + st->mem_decim16k = st->hSignalBuf->mem_decim16k; + st->old_inp_12k8 = st->hSignalBuf->old_inp_12k8; + st->old_inp_16k = st->hSignalBuf->old_inp_16k; + st->buf_speech_enc_pe = st->hSignalBuf->buf_speech_enc_pe; + st->buf_synth = st->hSignalBuf->buf_synth; + st->buf_speech_enc = st->hSignalBuf->buf_speech_enc; + st->buf_wspeech_enc = st->hSignalBuf->buf_wspeech_enc; + + /* initializations */ + set_f( st->Bin_E_old, 0, L_FFT / 2 ); + set_f( st->mem_decim, 0, 2 * L_FILT_MAX ); + set_f( st->mem_decim16k, 0, 2 * L_FILT_MAX ); + set_f( st->old_inp_12k8, 0, L_INP_MEM ); + set_f( st->old_inp_16k, 0, L_INP_MEM ); + + st->input_buff = st->hSignalBuf->input_buff; + set_zero( st->input_buff, L_FRAME48k + L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ) ); + st->old_input_signal = st->input_buff; + if ( st->element_mode == EVS_MONO ) + { + st->input = st->input_buff + st->input_Fs / FRAMES_PER_SEC + NS2SA( st->input_Fs, DELAY_FIR_RESAMPL_NS ); + } + else + { + st->input = st->input_buff + st->input_Fs / FRAMES_PER_SEC; + } + } + else + { + st->hSignalBuf = NULL; + st->Bin_E_old = NULL; + st->mem_decim = NULL; + st->mem_decim16k = NULL; + st->old_inp_12k8 = NULL; + st->old_inp_16k = NULL; + st->buf_speech_enc_pe = NULL; + st->buf_synth = NULL; + st->buf_speech_enc = NULL; + st->buf_wspeech_enc = NULL; + st->input_buff = NULL; + } + + /*-----------------------------------------------------------------* + * Noise estimator + *-----------------------------------------------------------------*/ + + if ( idchan == 0 || st->element_mode == IVAS_CPE_TD || st->element_mode == IVAS_CPE_MDCT || st->element_mode == EVS_MONO ) + { + if ( ( st->hNoiseEst = (NOISE_EST_HANDLE) malloc( sizeof( NOISE_EST_DATA ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Noise estimation\n" ); + } + + noise_est_init( st->hNoiseEst ); + } + else + { + st->hNoiseEst = NULL; + } + + /*-----------------------------------------------------------------* + * VAD + *-----------------------------------------------------------------*/ + + st->vad_flag = 1; + st->localVAD = 0; + + if ( ( idchan == 0 || st->element_mode == IVAS_CPE_TD || st->element_mode == IVAS_CPE_MDCT || st->element_mode == EVS_MONO ) && ( !vad_only_flag ) ) + { + if ( ( st->hVAD = (VAD_HANDLE) malloc( sizeof( VAD_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for VAD\n" ) ); + } + + wb_vad_init( st->hVAD ); + } + else + { + st->hVAD = NULL; + } + st->Pos_relE_cnt = 20; + + /* CLDFB-based VAD */ + if ( st->element_mode == EVS_MONO ) + { + if ( ( st->hVAD_CLDFB = (VAD_CLDFB_HANDLE) malloc( sizeof( T_CldfbVadState ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for CLDFB VAD\n" ) ); + } + + vad_init( st->hVAD_CLDFB ); + } + else + { + st->hVAD_CLDFB = NULL; + } + + /*-----------------------------------------------------------------* + * Speech/music classifier + *-----------------------------------------------------------------*/ + + if ( idchan == 0 || st->element_mode == IVAS_CPE_TD || st->element_mode == IVAS_CPE_MDCT || st->element_mode == EVS_MONO ) + { + if ( ( st->hSpMusClas = (SP_MUS_CLAS_HANDLE) malloc( sizeof( SP_MUS_CLAS_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Speech/music classifier\n" ) ); + } + + speech_music_clas_init( st->hSpMusClas ); + + st->sp_aud_decision0 = 0; + st->sp_aud_decision1 = 0; + st->sp_aud_decision2 = 0; + } + else + { + st->hSpMusClas = NULL; + } + + + /*-----------------------------------------------------------------* + * WB, SWB and FB bandwidth detector + *-----------------------------------------------------------------*/ + + st->lt_mean_NB = 0; + st->lt_mean_WB = 0; + st->lt_mean_SWB = 0; + st->count_WB = BWD_COUNT_MAX; + st->count_SWB = BWD_COUNT_MAX; + st->count_FB = BWD_COUNT_MAX; + st->bwidth = st->max_bwidth; + st->last_input_bwidth = st->bwidth; + st->last_bwidth = st->bwidth; + st->last_bwidth_cng = st->bwidth; + st->bwidth_sw_cnt = 0; + + + /*-----------------------------------------------------------------* + * DTX + *-----------------------------------------------------------------*/ + + st->lp_speech = 45.0f; /* Initialize the long-term active speech level in dB */ + st->lp_noise = 0.0f; + st->flag_noisy_speech_snr = 0; + st->fd_cng_reset_flag = 0; + st->cng_type = -1; + st->bckr_tilt_lt = 0.f; + st->active_cnt = 0; + + if ( ( ( idchan == 0 && st->Opt_DTX_ON ) || st->element_mode == EVS_MONO ) || ( st->element_mode == IVAS_CPE_MDCT && st->Opt_DTX_ON ) ) + { + if ( ( st->hDtxEnc = (DTX_ENC_HANDLE) malloc( sizeof( DTX_ENC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DTX variables\n" ) ); + } + dtx_enc_init( st, var_SID_rate_flag, interval_SID ); + } + else + { + st->hDtxEnc = NULL; + } + + /*-----------------------------------------------------------------* + * No other handles needed to be allocated for front-VAD structure + *-----------------------------------------------------------------*/ + + if ( vad_only_flag ) + { + st->hTdCngEnc = NULL; + st->cldfbAnaEnc = NULL; + st->hFdCngEnc = NULL; + st->hSC_VBR = NULL; + st->hAmrwb_IO = NULL; + st->hLPDmem = NULL; + st->hGSCEnc = NULL; + st->hBWE_TD = NULL; + st->cldfbSynTd = NULL; + st->hBWE_FD = NULL; + st->hHQ_core = NULL; + st->hRF = NULL; + st->hTECEnc = NULL; + st->hTcxEnc = NULL; + st->hTcxCfg = NULL; + st->hIGFEnc = NULL; + st->hPlcExt = NULL; + st->hTranDet = NULL; + + st->element_mode = IVAS_SCE; + st->idchan = 100; /* indicates hCoreCoderVAD */ + st->core = -1; + st->rf_mode = 0; + + return error; + } + + /*-----------------------------------------------------------------* + * LP-CNG + *-----------------------------------------------------------------*/ + + if ( ( ( idchan == 0 && st->Opt_DTX_ON && st->element_mode != IVAS_CPE_MDCT ) || st->element_mode == EVS_MONO ) && !( ism_mode == ISM_MODE_PARAM || ism_mode == ISM_MODE_DISC ) ) + { + if ( ( st->hTdCngEnc = (TD_CNG_ENC_HANDLE) malloc( sizeof( TD_CNG_ENC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DTX/TD CNG\n" ) ); + } + + td_cng_enc_init( st->hTdCngEnc, st->Opt_DTX_ON, st->max_bwidth ); + } + else + { + st->hTdCngEnc = NULL; + } + + /*-----------------------------------------------------------------* + * CLDFB & resampling tools parameters + *-----------------------------------------------------------------*/ + + if ( ( st->element_mode != IVAS_CPE_MDCT && idchan == 0 ) || ( st->element_mode == IVAS_CPE_MDCT && st->Opt_DTX_ON ) ) + { + if ( ( error = openCldfb( &st->cldfbAnaEnc, CLDFB_ANALYSIS, st->input_Fs, CLDFB_PROTOTYPE_1_25MS ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + st->cldfbAnaEnc = NULL; + } + + st->currEnergyLookAhead = 6.1e-5f; + + /*-----------------------------------------------------------------* + * SC-VBR parameters + *-----------------------------------------------------------------*/ + + if ( st->Opt_SC_VBR || st->element_mode == EVS_MONO ) + { + if ( ( st->hSC_VBR = (SC_VBR_ENC_HANDLE) malloc( sizeof( SC_VBR_ENC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SC-VBR\n" ) ); + } + + sc_vbr_enc_init( st->hSC_VBR ); + } + else + { + st->hSC_VBR = NULL; + } + + st->last_Opt_SC_VBR = 0; + + + /*-----------------------------------------------------------------* + * AMR-WB IO initialization + *-----------------------------------------------------------------*/ + + if ( st->Opt_AMR_WB || st->element_mode == EVS_MONO ) + { + if ( ( st->hAmrwb_IO = (AMRWB_IO_ENC_HANDLE) malloc( sizeof( AMRWB_IO_ENC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for AMR-WB IO\n" ) ); + } + + amr_wb_enc_init( st->hAmrwb_IO ); + } + else + { + st->hAmrwb_IO = NULL; + } + + /*-----------------------------------------------------------------* + * ACELP LPDmem + *-----------------------------------------------------------------*/ + + if ( ( idchan == 0 && st->element_mode != IVAS_CPE_MDCT ) || st->element_mode == IVAS_CPE_TD ) + { + if ( ( st->hLPDmem = (LPD_state_HANDLE) malloc( sizeof( LPD_state ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LPDmem\n" ) ); + } + + LPDmem_enc_init( st->hLPDmem ); + } + else + { + st->hLPDmem = NULL; + } + + /*-----------------------------------------------------------------* + * parameters for AC coder type (GSC) + *-----------------------------------------------------------------*/ + + st->GSC_noisy_speech = 0; + st->GSC_IVAS_mode = 0; + + if ( ( idchan == 0 && st->element_mode != IVAS_CPE_MDCT ) || st->element_mode == IVAS_CPE_TD ) + { + if ( ( st->hGSCEnc = (GSC_ENC_HANDLE) malloc( sizeof( GSC_ENC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for GSC\n" ) ); + } + + GSC_enc_init( st->hGSCEnc ); + } + else + { + st->hGSCEnc = NULL; + } + + /*-----------------------------------------------------------------* + * TBE parameters + *-----------------------------------------------------------------*/ + + if ( idchan == 0 && st->element_mode != IVAS_CPE_MDCT ) + { + if ( ( st->hBWE_TD = (TD_BWE_ENC_HANDLE) malloc( sizeof( TD_BWE_ENC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD BWE\n" ) ); + } + + if ( ( error = openCldfb( &st->cldfbSynTd, CLDFB_SYNTHESIS, 16000, CLDFB_PROTOTYPE_1_25MS ) ) != IVAS_ERR_OK ) + { + return error; + } + + InitSWBencBuffer( st->hBWE_TD ); + ResetSHBbuffer_Enc( st->hBWE_TD ); + } + else + { + st->hBWE_TD = NULL; + st->cldfbSynTd = NULL; + } + + /*-----------------------------------------------------------------* + * SWB BWE parameters + *-----------------------------------------------------------------*/ + + if ( idchan == 0 && st->element_mode != IVAS_CPE_MDCT ) + { + if ( ( st->hBWE_FD = (FD_BWE_ENC_HANDLE) malloc( sizeof( FD_BWE_ENC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for FD BWE\n" ) ); + } + + fd_bwe_enc_init( st->hBWE_FD ); + } + else + { + st->hBWE_FD = NULL; + } + + /*-----------------------------------------------------------------* + * HQ core parameters + *-----------------------------------------------------------------*/ + + if ( st->element_mode != IVAS_CPE_TD && st->element_mode != IVAS_CPE_MDCT && idchan == 0 ) + { + if ( ( st->hHQ_core = (HQ_ENC_HANDLE) malloc( sizeof( HQ_ENC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HQ core\n" ) ); + } + + HQ_core_enc_init( st->hHQ_core ); + } + else + { + st->hHQ_core = NULL; + } + + /* init memory for detect_transient(), used by HQ core and swb_bwe_enc */ + st->old_hpfilt_in = 0.0f; + st->old_hpfilt_out = 0.0f; + st->EnergyLT = 0.0f; + st->Energy_Old = 0; + st->TransientHangOver = 0; + + /*-----------------------------------------------------------------* + * Channel-aware mode + *-----------------------------------------------------------------*/ + + if ( !st->Opt_RF_ON || ( st->bwidth != WB && st->bwidth != SWB ) || st->total_brate != ACELP_13k20 ) + { + st->rf_mode = 0; + } + else + { + st->rf_mode = st->Opt_RF_ON; + } + + st->rf_mode_last = st->rf_mode; + + if ( st->Opt_RF_ON || st->element_mode == EVS_MONO ) + { + if ( ( st->hRF = (RF_ENC_HANDLE) malloc( sizeof( RF_ENC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for RF\n" ) ); + } + + /* initialize RF indice buffers */ + reset_rf_indices( st->hRF, st->L_frame, &st->rf_target_bits_write ); + } + else + { + st->hRF = NULL; + } + + /*-----------------------------------------------------------------* + * Temporal Envelope Coding + *-----------------------------------------------------------------*/ + + if ( st->element_mode == EVS_MONO ) + { + if ( ( st->hTECEnc = (TEC_ENC_HANDLE) malloc( sizeof( TEC_ENC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TEC\n" ) ); + } + } + else + { + st->hTECEnc = NULL; + } + /* note: initialization done later in init_coder_ace_plus() */ + + /*-----------------------------------------------------------------* + * TCX core + *-----------------------------------------------------------------*/ + + // ToDo: reduction possible for MCT_CHAN_MODE_LFE channel + if ( idchan == 0 || st->element_mode == IVAS_CPE_MDCT ) + { + if ( ( st->hTcxEnc = (TCX_ENC_HANDLE) malloc( sizeof( TCX_ENC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for hTcxEnc\n" ) ); + } + + /* Share the memories for 2xTCX10/4xTCX5 and for TCX20 */ + st->hTcxEnc->spectrum[0] = st->hTcxEnc->spectrum_long; + st->hTcxEnc->spectrum[1] = st->hTcxEnc->spectrum_long + N_TCX10_MAX; + + set_f( st->hTcxEnc->old_out, 0, L_FRAME32k ); + + /* MDCT selector */ + MDCT_selector_reset( st->hTcxEnc ); + + /* MDCT classifier */ + MDCT_classifier_reset( st->hTcxEnc ); + + if ( ( st->hTcxCfg = (TCX_CONFIG_HANDLE) malloc( sizeof( TCX_config ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for hTcxCfg\n" ) ); + } + } + else + { + st->hTcxEnc = NULL; + st->hTcxCfg = NULL; + } + + /*-----------------------------------------------------------------* + * IGF + *-----------------------------------------------------------------*/ + + igf_brate = st->total_brate; + if ( st->element_mode == IVAS_SCE && ( st_ivas->hEncoderConfig->ivas_format == ISM_FORMAT || st_ivas->hEncoderConfig->ivas_format == MASA_ISM_FORMAT ) ) + { + igf_brate = st->total_brate - ISM_NB_BITS_METADATA_NOMINAL * FRAMES_PER_SEC; + } + else if ( st->element_mode == IVAS_CPE_DFT || ( st->element_mode == IVAS_SCE && ( st_ivas->hEncoderConfig->ivas_format == SBA_FORMAT || + st_ivas->hEncoderConfig->ivas_format == SBA_ISM_FORMAT || + st_ivas->hEncoderConfig->ivas_format == MC_FORMAT || + st_ivas->hEncoderConfig->ivas_format == MASA_FORMAT ) ) ) + { + /* use nominal bitrates for DFT Stereo and (O)SBA, same as in stereo_dft_config()/ivas_spar_config() */ + if ( element_brate == IVAS_13k2 ) + { + igf_brate = ACELP_9k60; + } + else if ( element_brate == IVAS_16k4 ) + { + igf_brate = ACELP_13k20; + } + else if ( element_brate == IVAS_24k4 ) + { + igf_brate = ACELP_16k40; + } + else if ( element_brate == IVAS_32k ) + { + igf_brate = ACELP_24k40; + } + } + else if ( st->element_mode == IVAS_CPE_MDCT ) + { + igf_brate = element_brate; + } + + if ( st->codec_mode == MODE2 || st->element_mode > EVS_MONO ) + { + st->igf = getIgfPresent( st->element_mode, igf_brate, st->max_bwidth, st->rf_mode ); + } + else + { + st->igf = 0; + } + + if ( ( idchan == 0 || st->element_mode == IVAS_CPE_MDCT ) && ( st->igf || st->element_mode == EVS_MONO ) ) + { + if ( ( st->hIGFEnc = (IGF_ENC_INSTANCE_HANDLE) malloc( sizeof( IGF_ENC_INSTANCE ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for hIGFEnc\n" ) ); + } + } + else + { + st->hIGFEnc = NULL; + } + + /*-----------------------------------------------------------------* + * Mode 2 initialization + *-----------------------------------------------------------------*/ + + st->last_sr_core = st->last_L_frame * FRAMES_PER_SEC; + + + /* PLC encoder */ + if ( st->element_mode == EVS_MONO ) + { + if ( ( st->hPlcExt = (PLC_ENC_EVS_HANDLE) malloc( sizeof( PLC_ENC_EVS ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for hPlcExt\n" ) ); + } + } + else + { + st->hPlcExt = NULL; + } + + /* Init Mode 2 core coder */ + st->last_totalNoise = 0.f; + set_f( st->totalNoise_increase_hist, 0.f, TOTALNOISE_HIST_SIZE ); + st->totalNoise_increase_len = 0; + + init_coder_ace_plus( st, st->last_total_brate, 0 /* initialization value */ ); + + /*-----------------------------------------------------------------* + * FD-CNG encoder + *-----------------------------------------------------------------*/ + + if ( ( idchan == 0 && st->Opt_DTX_ON ) || st->element_mode == EVS_MONO || ( st->element_mode == IVAS_CPE_MDCT && st->Opt_DTX_ON ) ) + { + if ( ( error = createFdCngEnc( &st->hFdCngEnc ) ) != IVAS_ERR_OK ) + { + return error; + } + + initFdCngEnc( st->hFdCngEnc, st->input_Fs, st->cldfbAnaEnc->scale ); + + /* initialization for IVAS modes happens in first frame pre-processing */ + if ( st->element_mode == EVS_MONO ) + { + configureFdCngEnc( st->hFdCngEnc, st->bwidth, st->rf_mode && st->total_brate == ACELP_13k20 ? ACELP_9k60 : st->total_brate ); + } + } + else + { + st->hFdCngEnc = NULL; + } + + /*-----------------------------------------------------------------* + * Transient detector + *-----------------------------------------------------------------*/ + + if ( ( st->hTranDet = (TRAN_DET_HANDLE) malloc( sizeof( TRAN_DET_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Transient Detection\n" ) ); + } + + if ( st->element_mode > EVS_MONO ) + { + InitTransientDetection( (int16_t) ( st->input_Fs / FRAMES_PER_SEC ), 0, st->hTranDet, 1 ); + } + else + { + InitTransientDetection( (int16_t) ( st->input_Fs / FRAMES_PER_SEC ), NS2SA( st->input_Fs, DELAY_FIR_RESAMPL_NS ), st->hTranDet, 0 ); + } + + /*-----------------------------------------------------------------* + * IVAS parameters + *-----------------------------------------------------------------*/ + + st->tdm_LRTD_flag = 0; + st->cng_sba_flag = 0; + st->bits_frame_channel = 0; + st->side_bits_frame_channel = 0; + + return error; +} + + +/*-----------------------------------------------------------------------* + * LPDmem_enc_init() + * + * Initialization of ACELP LPDmem state variables + *-----------------------------------------------------------------------*/ + +void LPDmem_enc_init( + LPD_state_HANDLE hLPDmem /* i/o: LP memories */ +) +{ + set_zero( hLPDmem->syn, 1 + M ); + + set_f( hLPDmem->old_exc, 0, L_EXC_MEM ); + hLPDmem->mem_w0 = 0.0f; + set_f( hLPDmem->mem_syn, 0, M ); + set_f( hLPDmem->mem_syn1, 0, M ); + set_f( hLPDmem->mem_syn2, 0, M ); + set_zero( hLPDmem->mem_syn_r, L_SYN_MEM ); + set_f( hLPDmem->mem_syn3, 0, M ); + + hLPDmem->tilt_code = 0.0f; + hLPDmem->gc_threshold = 0.0f; + set_f( hLPDmem->dispMem, 0, 8 ); + + return; +} + + +/*-----------------------------------------------------------------------* + * destroy_cldfb_encoder() + * + * Free memory which was allocated in init_encoder() + *-----------------------------------------------------------------------*/ + +void destroy_cldfb_encoder( + Encoder_State *st /* i/o: Encoder static variables structure */ +) +{ + deleteCldfb( &st->cldfbSynTd ); + deleteCldfb( &st->cldfbAnaEnc ); + + deleteFdCngEnc( &st->hFdCngEnc ); + + return; +} diff --git a/lib_enc/inov_enc.c b/lib_enc/inov_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..2c99ebdac9a9d347cda8c047020a20c9439d5362 --- /dev/null +++ b/lib_enc/inov_enc.c @@ -0,0 +1,380 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "prot.h" +#include "ivas_prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*---------------------------------------------------------------------* + * inov_encode() + * + * Encode the algebraic innovation + *---------------------------------------------------------------------*/ + +void inov_encode( + Encoder_State *st, /* i/o: encoder state structure */ + const int32_t core_brate, /* i : core bitrate */ + const int16_t Opt_AMR_WB, /* i : flag indicating AMR-WB IO mode */ + const int16_t L_frame, /* i : length of the frame */ + const int16_t last_L_frame, /* i : length of the last frame */ + const int16_t coder_type, /* i : coding type */ + const int16_t bwidth, /* i : input signal bandwidth */ + const int16_t sharpFlag, /* i : formant sharpening flag */ + const int16_t i_subfr, /* i : subframe index */ + const int16_t tc_subfr, /* i : TC subframe index */ + const float *p_Aq, /* i : LP filter coefficients */ + const float gain_pit, /* i : adaptive excitation gain */ + float *cn, /* i/o: target vector in residual domain */ + const float *exc, /* i : pointer to excitation signal frame */ + float *h1, /* i/o: weighted filter input response */ + const float tilt_code, /* i : tilt of the excitation of previous subframe */ + const float pt_pitch, /* i : pointer to current subframe fractional pitch */ + const float *xn2, /* i : target vector for innovation search */ + float *code, /* o : algebraic excitation */ + float *y2, /* o : zero-memory filtered algebraic excitation */ + int16_t *unbits, /* o : number of unused bits for EVS_PI */ + const int16_t L_subfr /* i : subframe length */ +) +{ + float dn[2 * L_SUBFR]; /* Correlation between xn2 and h1 */ + int16_t nBits, cmpl_flag; + int16_t k; + float g1, g2; + float cn2[L_SUBFR]; + float Rw[L_SUBFR]; + int16_t i, acelpautoc; + BSTR_ENC_HANDLE hBstr = st->hBstr; + + if ( L_frame == L_FRAME ) + { + g1 = FORMANT_SHARPENING_G1; + g2 = FORMANT_SHARPENING_G2; + } + else + { + g1 = FORMANT_SHARPENING_G1_16k; + g2 = FORMANT_SHARPENING_G2_16k; + } + + /*----------------------------------------------------------------* + * Update target vector for codebook search in residual domain + * Preemphasize the impulse response and include fixed-gain pitch contribution into impulse resp. h1[] (pitch sharpenning) + * Correlation between target xn2[] and impulse response h1[] + *----------------------------------------------------------------*/ + + if ( core_brate > ACELP_13k20 && !Opt_AMR_WB && L_subfr == L_SUBFR ) + { + acelpautoc = 1; + + cb_shape( 1, 1, 0, sharpFlag, 0, g1, g2, p_Aq, h1, tilt_code, pt_pitch, L_SUBFR ); + + corr_xh( h1, Rw, h1, L_SUBFR ); + + for ( k = 0; k < L_SUBFR; k++ ) + { + cn2[k] = xn2[k]; + + for ( i = 0; i < k; i++ ) + { + cn2[k] -= cn2[i] * h1[k - i]; + } + } + + E_ACELP_toeplitz_mul( Rw, cn2, dn ); + mvr2r( cn2, cn, L_SUBFR ); + } + else + { + acelpautoc = 0; + + updt_tar( cn, cn, &exc[i_subfr], gain_pit, L_subfr ); + + cb_shape( 1, 1, 0, sharpFlag, 0, g1, g2, p_Aq, h1, tilt_code, pt_pitch, L_subfr ); + + corr_xh( xn2, dn, h1, L_subfr ); + } + + /*-----------------------------------------------------------------* + * Set complexity reduction flag to limit the number of iterations + * in algebraic innovation search + *-----------------------------------------------------------------*/ + + cmpl_flag = 0; + + if ( st->acelp_cfg.fcb_mode ) + { + /* set number of iterations in TD stereo, secondary channel */ + if ( st->element_mode == IVAS_CPE_TD && st->idchan == 1 ) + { + cmpl_flag = 1; + } + } + else + { + if ( L_frame == L_FRAME && coder_type == TRANSITION ) + { + if ( core_brate == ACELP_8k00 && i_subfr == 0 && tc_subfr < L_SUBFR ) + { + cmpl_flag = 3; + } + + if ( core_brate == ACELP_11k60 && ( ( i_subfr == 0 && tc_subfr < L_SUBFR ) || tc_subfr == TC_0_0 || ( i_subfr == 3 * L_SUBFR && tc_subfr == TC_0_64 ) ) ) + { + cmpl_flag = 3; + } + + if ( ( core_brate == ACELP_13k20 || core_brate == ACELP_12k15 ) && ( ( i_subfr == 0 && tc_subfr < L_SUBFR ) || tc_subfr <= TC_0_64 ) ) + { + cmpl_flag = 3; + } + } + + if ( L_frame == L_FRAME16k ) + { + if ( core_brate <= ACELP_32k ) + { + cmpl_flag = 4; + + if ( coder_type == TRANSITION && bwidth > WB ) + { + if ( i_subfr <= L_SUBFR ) + { + cmpl_flag -= 1; + } + else + { + cmpl_flag -= 2; + } + } + } + else if ( core_brate <= ACELP_48k ) + { + cmpl_flag = 3; + + if ( coder_type == TRANSITION ) + { + if ( i_subfr <= L_SUBFR ) + { + cmpl_flag -= 1; + } + else + { + cmpl_flag -= 2; + } + } + } + else + { + cmpl_flag = 4; + + if ( coder_type == TRANSITION ) + { + if ( i_subfr <= L_SUBFR ) + { + cmpl_flag -= 1; + } + else + { + cmpl_flag -= 2; + } + } + } + + if ( coder_type == INACTIVE ) + { + cmpl_flag = 4; + } + } + + /* reduce number of iterations in a frame where there is an internal sampling rate switch in order not to increase the WC complexity */ + if ( L_frame != st->last_L_frame && core_brate > ACELP_13k20 && ( core_brate < ACELP_32k || bwidth == WB ) ) + { + if ( cmpl_flag > 1 ) + { + cmpl_flag--; + } + } + } + + /*-----------------------------------------------------------------* + * Find and encode the algebraic innovation + *-----------------------------------------------------------------*/ + + set_f( y2, 0, L_SUBFR ); + + if ( !Opt_AMR_WB ) + { + if ( st->acelp_cfg.fcb_mode ) + { + if ( st->acelp_cfg.fixed_cdk_index[i_subfr / L_subfr] < ACELP_FIXED_CDK_NB ) + { + int16_t wordcnt, bitcnt; + int16_t prm[8]; + + if ( st->acelp_cfg.fixed_cdk_index[i_subfr / L_subfr] >= 0 ) + { + if ( L_subfr == 2 * L_SUBFR ) + { + nBits = st->acelp_cfg.fixed_cdk_index[i_subfr / L_subfr]; + + if ( nBits == 8 ) + { + acelp_1t64( hBstr, dn, h1, code, y2, L_subfr ); + } + else + { + acelp_fast( hBstr, nBits, dn, cn, h1, code, y2, L_subfr ); + } + } + else if ( ( st->idchan == 1 && st->acelp_cfg.fixed_cdk_index[i_subfr / L_SUBFR] <= 7 ) || ( st->idchan == 0 && st->acelp_cfg.fixed_cdk_index[i_subfr / L_SUBFR] <= 3 ) ) + { + if ( st->acelp_cfg.fixed_cdk_index[i_subfr / L_SUBFR] == 0 ) + { + acelp_1t64( hBstr, dn, h1, code, y2, L_subfr ); + } + else + { + acelp_fast( hBstr, st->acelp_cfg.fixed_cdk_index[i_subfr / L_SUBFR], dn, cn, h1, code, y2, L_SUBFR ); + } + } + else + { + E_ACELP_4t( dn, cn, h1, Rw, acelpautoc, code, st->acelp_cfg.fixed_cdk_index[i_subfr / L_SUBFR], prm, L_frame, last_L_frame, st->total_brate, i_subfr, cmpl_flag ); + + wordcnt = ACELP_FIXED_CDK_BITS( st->acelp_cfg.fixed_cdk_index[i_subfr / L_SUBFR] ) >> 4; + bitcnt = ACELP_FIXED_CDK_BITS( st->acelp_cfg.fixed_cdk_index[i_subfr / L_SUBFR] ) & 15; + + for ( i = 0; i < wordcnt; i++ ) + { + push_indice( hBstr, IND_ALG_CDBK_4T64, prm[i], 16 ); + } + if ( bitcnt ) + { + push_indice( hBstr, IND_ALG_CDBK_4T64, prm[i], bitcnt ); + } + + /* Generate weighted code */ + set_f( y2, 0.0f, L_SUBFR ); + for ( i = 0; i < L_SUBFR; i++ ) + { + /* Code is sparse, so check which samples are non-zero */ + if ( code[i] != 0 ) + { + for ( k = 0; k < L_SUBFR - i; k++ ) + { + y2[i + k] += code[i] * h1[k]; + } + } + } + } + } + else + { + set_f( code, 0.0f, L_SUBFR ); + set_f( y2, 0.0f, L_SUBFR ); + } + } + } + else + { + nBits = st->acelp_cfg.fixed_cdk_index[i_subfr / L_SUBFR]; + + if ( nBits == 7 ) + { + acelp_1t64( hBstr, dn, h1, code, y2, L_SUBFR ); + } + else if ( nBits == 12 ) + { + acelp_2t32( hBstr, dn, h1, code, y2 ); + } + else + { + *unbits += acelp_4t64( hBstr, dn, cn, h1, Rw, acelpautoc, code, y2, nBits, cmpl_flag, Opt_AMR_WB ); + } + } + } + else + { + if ( core_brate == ACELP_6k60 ) + { + acelp_2t32( hBstr, dn, h1, code, y2 ); + } + else if ( ( core_brate == ACELP_8k85 ) ) + { + acelp_4t64( hBstr, dn, cn, h1, Rw, acelpautoc, code, y2, 20, cmpl_flag, Opt_AMR_WB ); + } + else if ( core_brate == ACELP_12k65 ) + { + acelp_4t64( hBstr, dn, cn, h1, Rw, acelpautoc, code, y2, 36, cmpl_flag, Opt_AMR_WB ); + } + else if ( core_brate == ACELP_14k25 ) + { + acelp_4t64( hBstr, dn, cn, h1, Rw, acelpautoc, code, y2, 44, cmpl_flag, Opt_AMR_WB ); + } + else if ( core_brate == ACELP_15k85 ) + { + acelp_4t64( hBstr, dn, cn, h1, Rw, acelpautoc, code, y2, 52, cmpl_flag, Opt_AMR_WB ); + } + else if ( core_brate == ACELP_18k25 ) + { + acelp_4t64( hBstr, dn, cn, h1, Rw, acelpautoc, code, y2, 64, cmpl_flag, Opt_AMR_WB ); + } + else if ( core_brate == ACELP_19k85 ) + { + acelp_4t64( hBstr, dn, cn, h1, Rw, acelpautoc, code, y2, 72, cmpl_flag, Opt_AMR_WB ); + } + else if ( core_brate == ACELP_23k05 ) + { + acelp_4t64( hBstr, dn, cn, h1, Rw, acelpautoc, code, y2, 88, cmpl_flag, Opt_AMR_WB ); + } + else if ( core_brate == ACELP_23k85 ) + { + acelp_4t64( hBstr, dn, cn, h1, Rw, acelpautoc, code, y2, 88, cmpl_flag, Opt_AMR_WB ); + } + } + + /*----------------------------------------------------------------* + * Pitch sharpening + *----------------------------------------------------------------*/ + + cb_shape( 1, 1, 0, sharpFlag, 0, g1, g2, p_Aq, code, tilt_code, pt_pitch, L_subfr ); + + return; +} diff --git a/lib_enc/isf_enc_amr_wb.c b/lib_enc/isf_enc_amr_wb.c new file mode 100644 index 0000000000000000000000000000000000000000..b9479edefaf3188771a7539506b411f2e24b8846 --- /dev/null +++ b/lib_enc/isf_enc_amr_wb.c @@ -0,0 +1,523 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "rom_enc.h" +#include "rom_com.h" +#include "prot.h" +#include "wmc_auto.h" + +/*-----------------------------------------------------------------* + * Local constants + *-----------------------------------------------------------------*/ + +#define DICO1_NS_19b 16 /* codebook dimensions for SID ISF quantizers */ +#define DICO2_NS_19b 16 +#define DICO3_NS_19b 16 +#define DICO4_NS_19b 8 +#define DICO5_NS_19b 16 + +#define DICO1_NS_28b 64 +#define DICO2_NS_28b 64 +#define DICO3_NS_28b 64 +#define DICO4_NS_28b 32 +#define DICO5_NS_28b 32 + +#define N_SURV_MAX 4 /* maximum number of survivors */ + +/*---------------------------------------------------------------------* + * Local function prototypes + *---------------------------------------------------------------------*/ + +static void qisf_ns_28b( BSTR_ENC_HANDLE hBstr, float *isf ); +static void qisf_2s_46b( BSTR_ENC_HANDLE hBstr, float *isf, int16_t nb_surv, float *mem_AR, float *mem_MA ); +static void qisf_2s_36b( BSTR_ENC_HANDLE hBstr, float *isf, int16_t nb_surv, float *mem_AR, float *mem_MA ); +static void VQ_stage1( const float *x, const float *dico, const int16_t dim, const int16_t dico_size, int16_t *index, const int16_t surv ); +static int16_t sub_VQ( float *x, const float *dico, const int16_t dim, const int16_t dico_size, float *distance ); + + +/*-------------------------------------------------------------------* + * isf_enc_amr_wb() + * + * Quantization of ISF parameters in AMR-WB IO mode + *-------------------------------------------------------------------*/ + +void isf_enc_amr_wb( + Encoder_State *st, /* i/o: state structure */ + float *isf_new, /* i/o: quantized ISF vector */ + float *isp_new, /* i/o: ISP vector to quantize/quantized */ + float *Aq /* o : quantized A(z) for 4 subframes */ +) +{ + BSTR_ENC_HANDLE hBstr = st->hBstr; + + /*---------------------------------* + * ISF quantization of SID frames + *---------------------------------*/ + + if ( st->core_brate == SID_1k75 ) + { + qisf_ns_28b( hBstr, isf_new ); + + reorder_isf( isf_new, ISF_GAP, M, INT_FS_12k8 ); + + isf2isp( isf_new, isp_new, M, INT_FS_12k8 ); + + /* return if SID frame (conversion to A(z) done in the calling function) */ + return; + } + + /* check resonance for pitch clipping algorithm */ + gp_clip_test_lsf( st->element_mode, st->core_brate, isf_new, st->clip_var, 1 ); + + /*---------------------------------------* + * ISF quantization of all other frames + *---------------------------------------*/ + + if ( st->core_brate == ACELP_6k60 ) + { + qisf_2s_36b( hBstr, isf_new, 4, st->mem_AR, st->mem_MA ); + } + else if ( st->core_brate >= ACELP_8k85 ) + { + qisf_2s_46b( hBstr, isf_new, 4, st->mem_AR, st->mem_MA ); + } + + reorder_isf( isf_new, ISF_GAP, M, INT_FS_12k8 ); + + /* convert quantized ISFs back to ISPs */ + isf2isp( isf_new, isp_new, M, INT_FS_12k8 ); + + /*------------------------------------------------------------------* + * ISP interpolation + * A(z) calculation + *------------------------------------------------------------------*/ + + if ( st->rate_switching_reset ) + { + mvr2r( isf_new, st->lsf_old, M ); + mvr2r( isp_new, st->lsp_old, M ); + } + + int_lsp( L_FRAME, st->lsp_old, isp_new, Aq, M, interpol_isp_amr_wb, 1 ); + + /*------------------------------------------------------------------* + * Calculate ISF stability (distance between old ISF and current ISF) + *------------------------------------------------------------------*/ + + if ( st->last_core_brate != SID_1k75 ) + { + st->stab_fac = lsf_stab( isf_new, st->lsf_old, 1, st->L_frame ); + } + + return; +} + +/*-------------------------------------------------------------------* + * qisf_ns_28b() + * + * ISF quantizer for SID frames (only in AMR-WB IO mode) + *-------------------------------------------------------------------*/ + +static void qisf_ns_28b( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + float *isf /* i/o: unquantized/quantized ISF vector */ +) +{ + int16_t i, indice[5]; + float tmp; + + for ( i = 0; i < M; i++ ) + { + isf[i] -= mean_isf_noise_amr_wb[i]; + } + + indice[0] = sub_VQ( &isf[0], dico1_ns_28b, 2, DICO1_NS_28b, &tmp ); + indice[1] = sub_VQ( &isf[2], dico2_ns_28b, 3, DICO2_NS_28b, &tmp ); + indice[2] = sub_VQ( &isf[5], dico3_ns_28b, 3, DICO3_NS_28b, &tmp ); + indice[3] = sub_VQ( &isf[8], dico4_ns_28b, 4, DICO4_NS_28b, &tmp ); + indice[4] = sub_VQ( &isf[12], dico5_ns_28b + 4, 4, DICO5_NS_28b - 1, &tmp ) + 1; /* First vector has a problem -> do not allow */ + + /* write indices to array */ + push_indice( hBstr, IND_ISF_0_0, indice[0], 6 ); + push_indice( hBstr, IND_ISF_0_1, indice[1], 6 ); + push_indice( hBstr, IND_ISF_0_2, indice[2], 6 ); + push_indice( hBstr, IND_ISF_0_3, indice[3], 5 ); + push_indice( hBstr, IND_ISF_0_4, indice[4], 5 ); + + /* decoding the ISFs */ + disf_ns_28b( indice, isf ); + + return; +} + + +/*---------------------------------------------------------------------* + * qisf_2s_36b() + * + * ISF quantizer for AMR-WB 6k60 frames + * + * The ISF vector is quantized using two-stage MA-prediction VQ with split-by-2 + * in 1st stage and split-by-3 in the second stage. + *---------------------------------------------------------------------*/ + +static void qisf_2s_36b( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + float *isf, /* i/o: unquantized/quantized ISF vector */ + int16_t nb_surv, /* i : number of survivors (1, 2, 3 or 4) */ + float *mem_AR, /* o : quantizer memory for AR model */ + float *mem_MA /* i/o: quantizer memory for MA model */ +) +{ + int16_t i, k, indice[5], tmp_ind[2]; + int16_t surv1[N_SURV_MAX]; /* indices of survivors from 1st stage */ + float temp, min_err, distance, isf2[M]; + + /*------------------------------------------------------------------------* + * Subtract mean + *------------------------------------------------------------------------*/ + + for ( i = 0; i < M; i++ ) + { + isf[i] -= mean_isf_amr_wb[i] + MU_MA * mem_MA[i]; + } + + /*------------------------------------------------------------------------* + * Quantize ISFs 0 - 8 + *------------------------------------------------------------------------*/ + + VQ_stage1( &isf[0], dico1_isf, 9, SIZE_BK1, surv1, nb_surv ); + + distance = 1.0e30f; + if ( nb_surv > N_SURV_MAX ) + { + nb_surv = N_SURV_MAX; + } + + for ( k = 0; k < nb_surv; k++ ) + { + for ( i = 0; i < 9; i++ ) + { + isf2[i] = isf[i] - dico1_isf[i + surv1[k] * 9]; + } + + tmp_ind[0] = sub_VQ( &isf2[0], dico21_isf_36b, 5, SIZE_BK21_36b, &min_err ); + temp = min_err; + + tmp_ind[1] = sub_VQ( &isf2[5], dico22_isf_36b, 4, SIZE_BK22_36b, &min_err ); + temp += min_err; + + if ( temp < distance ) + { + distance = temp; + indice[0] = surv1[k]; + for ( i = 0; i < 2; i++ ) + { + indice[i + 2] = tmp_ind[i]; + } + } + } + + /*------------------------------------------------------------------------* + * Quantize ISFs 9 - 15 + *------------------------------------------------------------------------*/ + + VQ_stage1( &isf[9], dico2_isf, 7, SIZE_BK2, surv1, nb_surv ); + + distance = 1.0e30f; + for ( k = 0; k < nb_surv; k++ ) + { + for ( i = 0; i < 7; i++ ) + { + isf2[9 + i] = isf[9 + i] - dico2_isf[i + surv1[k] * 7]; + } + + tmp_ind[0] = sub_VQ( &isf2[9], dico23_isf_36b, 3, SIZE_BK23_36b, &min_err ); + temp = min_err; + if ( temp < distance ) + { + distance = temp; + indice[1] = surv1[k]; + indice[4] = tmp_ind[0]; + } + } + + /*------------------------------------------------------------------------* + * write indices to array + *------------------------------------------------------------------------*/ + + push_indice( hBstr, IND_ISF_0_0, indice[0], 8 ); + push_indice( hBstr, IND_ISF_0_1, indice[1], 8 ); + push_indice( hBstr, IND_ISF_1_0, indice[2], 7 ); + push_indice( hBstr, IND_ISF_1_1, indice[3], 7 ); + push_indice( hBstr, IND_ISF_1_2, indice[4], 6 ); + + /*------------------------------------------------------------------------* + * decoding the ISFs + *------------------------------------------------------------------------*/ + + disf_2s_36b( indice, isf, mem_AR, mem_MA ); + + return; +} + + +/*-------------------------------------------------------------------* + * qisf_2s_46b() + * + * ISF quantizer for all other AMR-WB frames + * + * The ISF vector is quantized using two-stage VQ with split-by-2 + * in 1st stage and split-by-5 in the second stage. + *-------------------------------------------------------------------*/ + +static void qisf_2s_46b( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + float *isf, /* i/o: unquantized/quantized ISF vector */ + int16_t nb_surv, /* i : number of survivors (1, 2, 3 or 4) */ + float *mem_AR, /* o : quantizer memory for AR model */ + float *mem_MA /* i/o: quantizer memory for MA model */ +) +{ + int16_t i, k, indice[7], tmp_ind[5]; + int16_t surv1[N_SURV_MAX]; /* indices of survivors from 1st stage */ + float temp, min_err, distance, isf2[M]; + + + /*------------------------------------------------------------------------* + * Subtract mean + *------------------------------------------------------------------------*/ + + for ( i = 0; i < M; i++ ) + { + isf[i] -= mean_isf_amr_wb[i] + MU_MA * mem_MA[i]; + } + + /*------------------------------------------------------------------------* + * Quantize ISFs 0 - 8 + *------------------------------------------------------------------------*/ + + VQ_stage1( &isf[0], dico1_isf, 9, SIZE_BK1, surv1, nb_surv ); + + distance = 1.0e30f; + if ( nb_surv > N_SURV_MAX ) + { + nb_surv = N_SURV_MAX; + } + + for ( k = 0; k < nb_surv; k++ ) + { + for ( i = 0; i < 9; i++ ) + { + isf2[i] = isf[i] - dico1_isf[i + surv1[k] * 9]; + } + + tmp_ind[0] = sub_VQ( &isf2[0], dico21_isf_46b, 3, SIZE_BK21, &min_err ); + temp = min_err; + tmp_ind[1] = sub_VQ( &isf2[3], dico22_isf_46b, 3, SIZE_BK22, &min_err ); + temp += min_err; + tmp_ind[2] = sub_VQ( &isf2[6], dico23_isf_46b, 3, SIZE_BK23, &min_err ); + temp += min_err; + if ( temp < distance ) + { + distance = temp; + indice[0] = surv1[k]; + for ( i = 0; i < 3; i++ ) + { + indice[i + 2] = tmp_ind[i]; + } + } + } + + /*------------------------------------------------------------------------* + * Quantize ISFs 9 - 15 + *------------------------------------------------------------------------*/ + + VQ_stage1( &isf[9], dico2_isf, 7, SIZE_BK2, surv1, nb_surv ); + + distance = 1.0e30f; + for ( k = 0; k < nb_surv; k++ ) + { + for ( i = 0; i < 7; i++ ) + { + isf2[9 + i] = isf[9 + i] - dico2_isf[i + surv1[k] * 7]; + } + tmp_ind[0] = sub_VQ( &isf2[9], dico24_isf_46b, 3, SIZE_BK24, &min_err ); + temp = min_err; + + tmp_ind[1] = sub_VQ( &isf2[12], dico25_isf_46b, 4, SIZE_BK25, &min_err ); + temp += min_err; + + if ( temp < distance ) + { + + distance = temp; + indice[1] = surv1[k]; + for ( i = 0; i < 2; i++ ) + { + indice[i + 5] = tmp_ind[i]; + } + } + } + + /*------------------------------------------------------------------------* + * write indices to array + *------------------------------------------------------------------------*/ + + push_indice( hBstr, IND_ISF_0_0, indice[0], 8 ); + push_indice( hBstr, IND_ISF_0_1, indice[1], 8 ); + push_indice( hBstr, IND_ISF_1_0, indice[2], 6 ); + push_indice( hBstr, IND_ISF_1_1, indice[3], 7 ); + push_indice( hBstr, IND_ISF_1_2, indice[4], 7 ); + push_indice( hBstr, IND_ISF_1_3, indice[5], 5 ); + push_indice( hBstr, IND_ISF_1_4, indice[6], 5 ); + + /*------------------------------------------------------------------------* + * decoding the ISFs + *------------------------------------------------------------------------*/ + + disf_2s_46b( indice, isf, mem_AR, mem_MA ); + + return; +} + +/*-------------------------------------------------------------------* + * VQ_stage1() + * + * 1st stage of ISF quantization + *-------------------------------------------------------------------*/ + +static void VQ_stage1( + const float *x, /* i : ISF vector */ + const float *dico, /* i : ISF codebook */ + const int16_t dim, /* i : codebook dimension */ + const int16_t dico_size, /* i : codebook size */ + int16_t *index, /* o : indices of best vector candidates */ + const int16_t surv /* i : nb of surviving best candidates */ +) +{ + float dist_min[N_SURV_MAX]; + float dist, temp; + const float *p_dico; + int16_t i, j, k, l; + + + for ( i = 0; i < surv; i++ ) + { + dist_min[i] = 1.0e30f; + index[i] = i; + } + + p_dico = dico; + + for ( i = 0; i < dico_size; i++ ) + { + dist = 0.0; + for ( j = 0; j < dim; j++ ) + { + temp = x[j] - *p_dico++; + dist += temp * temp; + } + + for ( k = 0; k < surv; k++ ) + { + if ( dist < dist_min[k] ) + { + for ( l = surv - 1; l > k; l-- ) + { + dist_min[l] = dist_min[l - 1]; + index[l] = index[l - 1]; + } + dist_min[k] = dist; + index[k] = i; + break; + } + } + } + return; +} + +/*-------------------------------------------------------------------* + * sub_VQ() + * + * Quantization of a subvector in Split-VQ of ISFs + *-------------------------------------------------------------------*/ + +/*! r: selected codebook vector index */ +static int16_t sub_VQ( + float *x, /* i/o: ISF vector */ + const float *dico, /* i : ISF codebook */ + const int16_t dim, /* i : codebook dimension */ + const int16_t dico_size, /* i : codebook size */ + float *distance /* o : quantization error (min. distance) */ +) +{ + float dist_min, dist, temp; + const float *p_dico; + int16_t i, j, index; + + + dist_min = 1.0e30f; + p_dico = dico; + + index = 0; + for ( i = 0; i < dico_size; i++ ) + { + dist = 0.0f; + for ( j = 0; j < dim; j++ ) + { + temp = x[j] - *p_dico++; + dist += temp * temp; + } + if ( dist < dist_min ) + { + dist_min = dist; + index = i; + } + } + + *distance = dist_min; + + /* Reading the selected vector */ + p_dico = &dico[index * dim]; + for ( j = 0; j < dim; j++ ) + { + x[j] = *p_dico++; + } + return index; +} diff --git a/lib_enc/ivas_agc_enc.c b/lib_enc/ivas_agc_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..7c72028a80e9ca3d779b9ba3654b99a5640f797c --- /dev/null +++ b/lib_enc/ivas_agc_enc.c @@ -0,0 +1,436 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + + +#include +#include "options.h" +#include "ivas_prot.h" +#include "prot.h" +#include +#include +#include "wmc_auto.h" + + +/*------------------------------------------------------------------------------------------* + * Local constants + *------------------------------------------------------------------------------------------*/ + +#define AGC_MIN_DELTA ( 4.656612873077393e-10f ) /*2^-31*/ + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_agc_enc_get_flag() + * + * This function determines if AGC is enabled or disabled. + *-----------------------------------------------------------------------------------------*/ + +/*! r: AGC enable flag */ +int16_t ivas_agc_enc_get_flag( + const int16_t nchan_transport /* i : number of transport channels */ +) +{ + int16_t agc_flag; + + /* AGC is enabled only if there is one transport channel. */ + agc_flag = (int16_t) ( nchan_transport == 1 ); + + + return agc_flag; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_agc_enc_init() + * + * AGC encoder initialization + *-----------------------------------------------------------------------------------------*/ + +static void ivas_agc_enc_init( + ivas_agc_enc_state_t *hAgcEnc, + const int16_t input_frame, + const int16_t nchan_inp, + const uint16_t delay ) +{ + int16_t i; + ivas_agc_enc_chan_state_t *ptrG = hAgcEnc->gain_state; + ivas_agc_chan_data_t *ptr = hAgcEnc->gain_data; + + hAgcEnc->agc_com.in_delay = delay; + hAgcEnc->agc_com.num_coeff = FOA_CHANNELS; + + ivas_agc_calcGainParams( &hAgcEnc->agc_com.absEmin, &hAgcEnc->agc_com.betaE, &hAgcEnc->agc_com.maxAttExp, hAgcEnc->agc_com.num_coeff ); + + ivas_agc_initWindowFunc( hAgcEnc->agc_com.winFunc, input_frame - hAgcEnc->agc_com.in_delay ); + + hAgcEnc->minDelta = AGC_MIN_DELTA; + hAgcEnc->smFact = 0.1f; + + for ( i = 0; i < nchan_inp; i++ ) + { + /* gain_state */ + ptrG->lastExp = 0; + ptrG->prevExp = 0; + ptrG->lastGain = 1.f; + ptrG->lastMaxAbs = 0.f; + ptrG->gainExpVal = 0; + ptrG->MaxAbsVal_del = 0.f; + ptrG->MaxAbsValIdx_del = 0; + ptrG++; + + /* gain_data */ + ptr->absGainExp = hAgcEnc->agc_com.absEmin; + ptr->absGainExpCurr = hAgcEnc->agc_com.absEmin; + ptr++; + } + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_spar_agc_enc_open() + * + * Allocate and initialize SPAR AGC encoder handle + *------------------------------------------------------------------------*/ + +ivas_error ivas_spar_agc_enc_open( + ivas_agc_enc_state_t **hAgcEnc, /* i/o: SPAR AGC encoder handle */ + const int32_t input_Fs, /* i : input sampling rate */ + const int16_t nchan_inp /* i : number of input channels */ +) +{ + ivas_agc_enc_state_t *hAgc; + int16_t input_frame, delay; + + if ( ( hAgc = (ivas_agc_enc_state_t *) malloc( sizeof( ivas_agc_enc_state_t ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR AGC encoder" ); + } + + input_frame = (int16_t) ( input_Fs / FRAMES_PER_SEC ); + delay = NS2SA( input_Fs, ( IVAS_ENC_DELAY_NS + IVAS_DEC_DELAY_NS ) ); + + if ( ( hAgc->agc_com.winFunc = (float *) malloc( sizeof( float ) * ( input_frame - delay ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR AGC encoder" ); + } + + if ( ( hAgc->gain_state = (ivas_agc_enc_chan_state_t *) malloc( sizeof( ivas_agc_enc_chan_state_t ) * nchan_inp ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR AGC encoder" ); + } + + if ( ( hAgc->gain_data = (ivas_agc_chan_data_t *) malloc( sizeof( ivas_agc_chan_data_t ) * nchan_inp ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR AGC encoder" ); + } + + ivas_agc_enc_init( hAgc, input_frame, nchan_inp, delay ); + + *hAgcEnc = hAgc; + + return IVAS_ERR_OK; +} + + +/*------------------------------------------------------------------------- + * ivas_spar_agc_enc_close() + * + * Deallocate SPAR AGC encoder handle + *------------------------------------------------------------------------*/ + +void ivas_spar_agc_enc_close( + ivas_agc_enc_state_t **hAgcEnc /* i/o: SPAR AGC encoder handle */ +) +{ + ivas_agc_enc_state_t *hAgc; + + if ( hAgcEnc == NULL || *hAgcEnc == NULL ) + { + return; + } + + hAgc = *hAgcEnc; + + free( hAgc->agc_com.winFunc ); + hAgc->agc_com.winFunc = NULL; + + free( hAgc->gain_state ); + hAgc->gain_state = NULL; + + free( hAgc->gain_data ); + hAgc->gain_data = NULL; + + free( *hAgcEnc ); + *hAgcEnc = NULL; + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_agc_enc_process() + * + * AGC encoder + *-----------------------------------------------------------------------------------------*/ + +void ivas_agc_enc_process( + ivas_agc_enc_state_t *hAgcEnc, /* i/o: AGC encoder handle */ + BSTR_ENC_HANDLE hMetaData, /* i/o: MetaData handle */ + float **ppPcm_in, /* i : input audio channels */ + float **ppPcm_out, /* o : output audio channels */ + const int16_t n_channels, /* i : number of channels */ + const ENCODER_CONFIG_HANDLE hEncoderConfig /* i : configuration structure */ +) +{ + int16_t i, j, idx, input_frame, offset; + int16_t per_ch_bit[FOA_CHANNELS], AGC_flag; + int16_t extendedExpVal = FALSE; + int16_t isGainAdjusted; + float gain; + ivas_agc_enc_state_t *pState = hAgcEnc; + + input_frame = (int16_t) ( hEncoderConfig->input_Fs / FRAMES_PER_SEC ); + offset = input_frame - pState->agc_com.in_delay; + + AGC_flag = 0; + + for ( i = 0; i < n_channels; i++ ) + { + float sampleAbsVal; + int16_t isClipped = FALSE; + int16_t clippedIdx = 0; + int16_t MaxAbsValIdx = 0; + float MaxAbsVal = pState->gain_state[i].MaxAbsVal_del; + float predMaxAbsVal = fabsf( ppPcm_in[i][offset] ); + + for ( j = 0; j < input_frame; j++ ) + { + sampleAbsVal = fabsf( ppPcm_in[i][j] ); + + if ( sampleAbsVal > MaxAbsVal ) + { + MaxAbsVal = sampleAbsVal; + MaxAbsValIdx = j; + } + + if ( j > offset ) + { + if ( sampleAbsVal > predMaxAbsVal ) + { + predMaxAbsVal = sampleAbsVal; + } + } + + ppPcm_out[i][j] = ppPcm_in[i][j] * pState->gain_state[i].lastGain; + + if ( !isClipped ) + { + if ( ( ppPcm_out[i][j] > ( 1.f - pState->minDelta ) * PCM16_TO_FLT_FAC ) || ( ppPcm_out[i][j] < MIN16B_FLT ) ) + { + clippedIdx = j; + isClipped = TRUE; + } + } + } + + pState->gain_state[i].MaxAbsVal_del = predMaxAbsVal; + + isGainAdjusted = FALSE; + if ( !isClipped ) + { + + if ( pState->gain_state[i].lastExp == AGC_EMAX || MaxAbsVal < FLT_MIN ) + { + pState->gain_state[i].gainExpVal = 0; + pState->gain_state[i].prevExp = pState->gain_state[i].lastExp; + isGainAdjusted = TRUE; + } + else + { + float smoothedMaxAbsVal, maxGain; + smoothedMaxAbsVal = pState->smFact * MaxAbsVal + ( 1.f - pState->smFact ) * pState->gain_state[i].lastMaxAbs; + pState->gain_state[i].lastMaxAbs = smoothedMaxAbsVal; + + maxGain = max( smoothedMaxAbsVal, MaxAbsVal ) * pState->gain_state[i].lastGain * 2.f; + + if ( maxGain < ( 1.f - pState->minDelta ) * PCM16_TO_FLT_FAC ) + { + pState->gain_state[i].gainExpVal = -1; + } + else + { + pState->gain_state[i].gainExpVal = 0; + } + } + } + else + { + pState->gain_state[i].lastMaxAbs = MaxAbsVal; + } + + if ( !isGainAdjusted ) + { + float actualMaxAbsVal = 0.f; + int16_t currMaxAttExp; + + currMaxAttExp = min( ( pState->gain_state[i].lastExp + pState->agc_com.absEmin ), pState->agc_com.maxAttExp ); + extendedExpVal = FALSE; + + if ( isClipped ) + { + int16_t isCompensated = FALSE; + actualMaxAbsVal = pState->gain_state[i].lastMaxAbs * pState->gain_state[i].lastGain; + idx = min( offset - 1, MaxAbsValIdx ); + pState->gain_state[i].gainExpVal = (int16_t) ceilf( -logf( actualMaxAbsVal * MDFT_NORM_SCALING ) / logf( pState->agc_com.winFunc[idx] ) ); + + while ( !isCompensated ) + { + float tmpSignal; + isCompensated = TRUE; + + for ( idx = clippedIdx; idx <= MaxAbsValIdx; idx++ ) + { + if ( idx >= offset ) + { + idx = MaxAbsValIdx; + tmpSignal = ppPcm_out[i][idx] * powf( pState->agc_com.winFunc[offset - 1], (float) pState->gain_state[i].gainExpVal ); + } + else + { + tmpSignal = ppPcm_out[i][idx] * powf( pState->agc_com.winFunc[idx], (float) pState->gain_state[i].gainExpVal ); + } + + if ( ( tmpSignal > ( 1.f - pState->minDelta ) * PCM16_TO_FLT_FAC ) || ( tmpSignal < MIN16B_FLT ) ) + { + isCompensated = FALSE; + break; + } + } + + if ( !isCompensated ) + { + pState->gain_state[i].gainExpVal++; + } + + if ( pState->gain_state[i].gainExpVal > currMaxAttExp ) + { + pState->gain_state[i].gainExpVal = min( pState->gain_state[i].gainExpVal, currMaxAttExp ); + break; + } + } + } + + for ( idx = 0; idx < input_frame; idx++ ) + { + if ( idx < offset ) + { + gain = powf( pState->agc_com.winFunc[idx], pState->gain_state[i].gainExpVal ); + } + else + { + + gain = powf( pState->agc_com.winFunc[offset - 1], pState->gain_state[i].gainExpVal ); + } + ppPcm_out[i][idx] *= gain; + } + + pState->gain_state[i].lastGain *= powf( pState->agc_com.winFunc[offset - 1], pState->gain_state[i].gainExpVal ); + /*safety check starts*/ + if ( pState->gain_state[i].gainExpVal == pState->agc_com.maxAttExp + 1 ) + { + extendedExpVal = TRUE; + } + /*safety check ends*/ + + pState->gain_state[i].prevExp = pState->gain_state[i].lastExp; + + pState->gain_state[i].lastExp -= pState->gain_state[i].gainExpVal; + if ( extendedExpVal ) + { + + pState->gain_state[i].gainExpVal = -1; + } + } + + pState->gain_data[i].absGainExp = pState->gain_state[i].prevExp + pState->agc_com.absEmin; + + if ( extendedExpVal && pState->gain_state[i].gainExpVal <= 0 ) + { + pState->gain_state[i].gainExpVal = pState->agc_com.maxAttExp + 1; + } + + pState->gain_data[i].absGainExpCurr = pState->gain_data[i].absGainExp - pState->gain_state[i].gainExpVal; + + if ( ( pState->gain_data[i].absGainExpCurr > pState->agc_com.absEmin ) || ( pState->gain_data[i].absGainExpCurr < 0 ) ) + { + assert( 0 ); + } + + if ( pState->gain_data[i].absGainExpCurr == pState->agc_com.absEmin ) + { + per_ch_bit[i] = 0; + } + else + { + per_ch_bit[i] = 1; + AGC_flag = 1; + } + } + + push_next_indice( hMetaData, AGC_flag, 1 ); + + /* encode AGC parameters */ + if ( AGC_flag == 1 ) + { + if ( n_channels > 1 ) + { + for ( i = 0; i < n_channels; i++ ) + { + push_next_indice( hMetaData, per_ch_bit[i], 1 ); + } + } + assert( AGC_BITS_PER_CH == ( pState->agc_com.betaE + 1 ) ); + + for ( i = 0; i < n_channels; i++ ) + { + if ( per_ch_bit[i] == 1 ) + { + push_next_indice( hMetaData, (uint16_t) pState->gain_data[i].absGainExpCurr, (int16_t) pState->agc_com.betaE ); + } + } + } + + + return; +} + diff --git a/lib_enc/ivas_core_enc.c b/lib_enc/ivas_core_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..b4d7ffc9e5b1788cc418dacbce680e275d80fd65 --- /dev/null +++ b/lib_enc/ivas_core_enc.c @@ -0,0 +1,465 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "ivas_cnst.h" +#include "ivas_prot.h" +#include "wmc_auto.h" +#include + + + +/*-------------------------------------------------------------------* + * ivas_core_enc() + * + * Principal IVAS core coder routine, where number of core channels is 1 or 2 + *-------------------------------------------------------------------*/ + +ivas_error ivas_core_enc( + SCE_ENC_HANDLE hSCE, /* i/o: SCE encoder structure */ + CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ + MCT_ENC_HANDLE hMCT, /* i/o: MCT encoder structure */ + const int16_t n_CoreChannels, /* i : number of core channels to be coded */ +#ifdef FIX_854_ARRAY_SIZE_MISMATCH + float old_inp_12k8[][L_INP_12k8], /* i : buffer of old input signal */ + float old_inp_16k[][L_INP], /* i : buffer of old input signal */ + float ener[], /* i : residual energy from Levinson-Durbin */ + float A[][NB_SUBFR16k * ( M + 1 )], /* i : A(z) unquantized for the 4 subframes */ + float Aw[][NB_SUBFR16k * ( M + 1 )], /* i : weighted A(z) unquantized for subframes */ + float epsP[][M + 1], /* i : LP prediction errors */ + float lsp_new[][M], /* i : LSPs at the end of the frame */ + float lsp_mid[][M], /* i : LSPs in the middle of the frame */ + const int16_t vad_hover_flag[], /* i : VAD hanglover flag */ + int16_t attack_flag[], /* i : attack flag (GSC or TC) */ + float realBuffer[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i/o: real buffer */ + float imagBuffer[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i/o: imag buffer */ + float old_wsp[][L_WSP], /* i : weighted input signal buffer */ + const int16_t loc_harm[], /* i : harmonicity flag */ + const float cor_map_sum[], /* i : speech/music clasif. parameter */ + const int16_t vad_flag_dtx[], /* i : HE-SAD flag with additional DTX HO */ + float enerBuffer[][CLDFB_NO_CHANNELS_MAX], /* i : energy buffer */ + float fft_buff[][2 * L_FFT], /* i : FFT buffer */ +#else + float old_inp_12k8[CPE_CHANNELS][L_INP_12k8], /* i : buffer of old input signal */ + float old_inp_16k[CPE_CHANNELS][L_INP], /* i : buffer of old input signal */ + float ener[CPE_CHANNELS], /* i : residual energy from Levinson-Durbin */ + float A[CPE_CHANNELS][NB_SUBFR16k * ( M + 1 )], /* i : A(z) unquantized for the 4 subframes */ + float Aw[CPE_CHANNELS][NB_SUBFR16k * ( M + 1 )], /* i : weighted A(z) unquantized for subframes */ + float epsP[CPE_CHANNELS][M + 1], /* i : LP prediction errors */ + float lsp_new[CPE_CHANNELS][M], /* i : LSPs at the end of the frame */ + float lsp_mid[CPE_CHANNELS][M], /* i : LSPs in the middle of the frame */ + const int16_t vad_hover_flag[CPE_CHANNELS], /* i : VAD hanglover flag */ + int16_t attack_flag[CPE_CHANNELS], /* i : attack flag (GSC or TC) */ + float realBuffer[CPE_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i/o: real buffer */ + float imagBuffer[CPE_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i/o: imag buffer */ + float old_wsp[CPE_CHANNELS][L_WSP], /* i : weighted input signal buffer */ + const int16_t loc_harm[CPE_CHANNELS], /* i : harmonicity flag */ + const float cor_map_sum[CPE_CHANNELS], /* i : speech/music clasif. parameter */ + const int16_t vad_flag_dtx[CPE_CHANNELS], /* i : HE-SAD flag with additional DTX HO */ + float enerBuffer[CPE_CHANNELS][CLDFB_NO_CHANNELS_MAX], /* i : energy buffer */ + float fft_buff[CPE_CHANNELS][2 * L_FFT], /* i : FFT buffer */ +#endif + const int16_t tdm_SM_or_LRTD_Pri, /* i : channel combination scheme flag */ + const int16_t ivas_format, /* i : IVAS format */ + const int16_t flag_16k_smc /* i : flag to indicate if the OL SMC is run at 16 kHz */ +) +{ + int16_t n, input_frame; + int16_t cpe_id, MCT_flag; + Encoder_State **sts, *st; + STEREO_ICBWE_ENC_HANDLE hStereoICBWE; + STEREO_TD_ENC_DATA_HANDLE hStereoTD; + float *inp[CPE_CHANNELS]; + float new_inp_resamp16k[CPE_CHANNELS][L_FRAME16k]; /* new input signal @16kHz, non pre-emphasised, used by the WB TBE/BWE */ + float old_syn_12k8_16k[CPE_CHANNELS][L_FRAME16k]; /* ACELP core synthesis at 12.8kHz or 16kHz to be used by the SWB BWE */ + float shb_speech[L_FRAME16k]; + float hb_speech[L_FRAME16k / 4]; + float *new_swb_speech; + float new_swb_speech_buffer[L_FRAME48k + STEREO_DFT_OVL_MAX]; + float bwe_exc_extended[CPE_CHANNELS][L_FRAME32k + NL_BUFF_OFFSET]; + float voice_factors[CPE_CHANNELS][NB_SUBFR16k]; + int16_t Voicing_flag[CPE_CHANNELS]; + float pitch_buf[CPE_CHANNELS][NB_SUBFR16k]; + int16_t unbits[CPE_CHANNELS]; + float tdm_lspQ_PCh[M], tdm_lsfQ_PCh[M]; + int16_t last_element_mode, tdm_Pitch_reuse_flag; + int32_t element_brate, last_element_brate, input_Fs; + int16_t diff_nBits; + ivas_error error; + int16_t max_num_indices_BWE; + + push_wmops( "ivas_core_enc" ); + + error = IVAS_ERR_OK; + + /*------------------------------------------------------------------* + * General initialization + *-----------------------------------------------------------------*/ + + if ( hSCE != NULL ) + { + cpe_id = -1; + MCT_flag = 0; + sts = hSCE->hCoreCoder; + hStereoTD = NULL; + hStereoICBWE = NULL; + element_brate = hSCE->element_brate; + last_element_brate = hSCE->last_element_brate; + last_element_mode = IVAS_SCE; + tdm_Pitch_reuse_flag = -1; + } + else + { + cpe_id = hCPE->cpe_id; + MCT_flag = 0; + if ( hMCT != NULL ) + { + MCT_flag = 1; + } + sts = hCPE->hCoreCoder; + hStereoICBWE = hCPE->hStereoICBWE; + element_brate = hCPE->element_brate; + last_element_brate = hCPE->last_element_brate; + last_element_mode = hCPE->last_element_mode; + + if ( hCPE->hStereoTD != NULL ) + { + hStereoTD = hCPE->hStereoTD; + tdm_Pitch_reuse_flag = hCPE->hStereoTD->tdm_Pitch_reuse_flag; + } + else + { + hStereoTD = NULL; + tdm_Pitch_reuse_flag = -1; + } + } + + input_Fs = sts[0]->input_Fs; + input_frame = (int16_t) ( input_Fs / FRAMES_PER_SEC ); + + set_f( new_swb_speech_buffer, 0, L_FRAME48k + STEREO_DFT_OVL_MAX ); + + for ( n = 0; n < n_CoreChannels; n++ ) + { + st = sts[n]; + + /*------------------------------------------------------------------* + * Initializiation per core-coder channel + *-----------------------------------------------------------------*/ + + + st->extl = -1; + unbits[n] = 0; + + st->element_brate = element_brate; + + /*---------------------------------------------------------------------* + * Pre-processing, incl. Decision matrix + *---------------------------------------------------------------------*/ + + if ( ( error = pre_proc_ivas( st, last_element_mode, element_brate, ivas_format == SBA_FORMAT ? last_element_brate : element_brate, input_frame, old_inp_12k8[n], old_inp_16k[n], &inp[n], &ener[n], A[n], Aw[n], epsP[n], lsp_new[n], lsp_mid[n], new_inp_resamp16k[n], &Voicing_flag[n], old_wsp[n], loc_harm[n], cor_map_sum[n], vad_flag_dtx[n], enerBuffer[n], fft_buff[n], MCT_flag, vad_hover_flag[n], flag_16k_smc ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( st->element_mode == IVAS_CPE_MDCT || st->element_mode == IVAS_SCE ) + { + st->enablePlcWaveadjust = 0; + } + } + + /*------------------------------------------------------------------* + * Sanity check in combined format coding + *-----------------------------------------------------------------*/ + + diff_nBits = 0; + if ( hCPE != NULL && hCPE->element_mode == IVAS_CPE_DFT && hCPE->brate_surplus > 0 ) + { + ivas_combined_format_brate_sanity( hCPE->element_brate, sts[0]->core, sts[0]->total_brate, &( sts[0]->core_brate ), &( sts[0]->inactive_coder_type_flag ), &diff_nBits ); + } + + /*---------------------------------------------------------------------* + * Core Encoding + *---------------------------------------------------------------------*/ + + for ( n = 0; n < n_CoreChannels; n++ ) + { + st = sts[n]; + + /* update pointer to the buffer of indices of the second channel */ + if ( n == 1 && st->element_mode == IVAS_CPE_TD ) + { + /* adjust the pointer to the buffer of indices of the secondary channel (make space for BWE indices) */ + max_num_indices_BWE = get_BWE_max_num_indices( sts[0]->extl_brate ); + st->hBstr->ind_list = sts[0]->hBstr->ind_list + sts[0]->hBstr->nb_ind_tot + max_num_indices_BWE; + + /* write TD stereo spatial parameters */ + move_indices( hStereoTD->tdm_hBstr_tmp.ind_list, st->hBstr->ind_list, hStereoTD->tdm_hBstr_tmp.nb_ind_tot ); + st->hBstr->nb_ind_tot += hStereoTD->tdm_hBstr_tmp.nb_ind_tot; + st->hBstr->nb_bits_tot += hStereoTD->tdm_hBstr_tmp.nb_bits_tot; + + reset_indices_enc( &hStereoTD->tdm_hBstr_tmp, MAX_IND_TDM_TMP ); + } + + /*---------------------------------------------------------------------* + * Write signaling info into the bitstream + *---------------------------------------------------------------------*/ + + if ( !MCT_flag || ( MCT_flag && cpe_id == 0 ) ) + { + ivas_signaling_enc( st, MCT_flag, element_brate, tdm_SM_or_LRTD_Pri, tdm_Pitch_reuse_flag ); + } + + /*---------------------------------------------------------------------* + * Preprocessing (preparing) for ACELP/HQ core switching + *---------------------------------------------------------------------*/ + + core_switching_pre_enc( st, old_inp_12k8[n], old_inp_16k[n], sts[0]->active_cnt, last_element_mode ); + + /*---------------------------------------------------------------------* + * ACELP core encoding + * TCX core encoding + * HQ core encoding + *---------------------------------------------------------------------*/ + + if ( st->core == ACELP_CORE ) + { + /* ACELP core encoder */ + if ( ( error = acelp_core_enc( st, inp[n], ener[n], A[n], Aw[n], epsP[n], lsp_new[n], lsp_mid[n], vad_hover_flag[0], attack_flag[n], bwe_exc_extended[n], voice_factors[n], old_syn_12k8_16k[n], pitch_buf[n], &unbits[n], hStereoTD, tdm_lsfQ_PCh ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( ( st->core == TCX_20_CORE || st->core == TCX_10_CORE ) && st->element_mode != IVAS_CPE_MDCT ) + { + /* TCX core encoder */ + stereo_tcx_core_enc( st, old_inp_12k8[n] + L_INP_MEM, old_inp_16k[n] + L_INP_MEM, Aw[n], lsp_new[n], lsp_mid[n], pitch_buf[n], last_element_mode, vad_hover_flag[0] ); + } + + if ( st->core == HQ_CORE ) + { + /* HQ core encoder */ + hq_core_enc( st, st->input, input_frame, NORMAL_HQ_CORE, Voicing_flag[n], vad_hover_flag[0] ); + } + + /*---------------------------------------------------------------------* + * TD stereo updates + *---------------------------------------------------------------------*/ + + if ( st->element_mode == IVAS_CPE_TD && n == 0 ) + { + td_stereo_param_updt( st->lsp_old, st->lsf_old, pitch_buf[0], tdm_lspQ_PCh, tdm_lsfQ_PCh, hStereoTD->tdm_Pri_pitch_buf, st->flag_ACELP16k, hStereoTD->tdm_use_IAWB_Ave_lpc ); + } + } + + + /*---------------------------------------------------------------------* + * MDCT stereo: joint TCX Core Encoding + *---------------------------------------------------------------------*/ + + if ( sts[0]->element_mode == IVAS_CPE_MDCT ) + { + if ( sts[0]->core_brate > SID_2k40 && sts[1]->core_brate > SID_2k40 ) + { + if ( MCT_flag ) + { + ivas_mdct_core_whitening_enc( hCPE, old_inp_16k, old_wsp, pitch_buf, hMCT->p_mdst_spectrum_long[cpe_id], hMCT->tnsBits[cpe_id], hMCT->p_orig_spectrum_long[cpe_id], + hMCT->tnsSize[cpe_id], hMCT->p_param[cpe_id], hMCT->hBstr, 1, hMCT->nchan_out_woLFE ); + } + else + { + stereo_mdct_core_enc( hCPE, old_inp_16k, old_wsp, pitch_buf ); + } + } + else if ( sts[0]->core_brate == SID_2k40 && sts[1]->core_brate == SID_2k40 ) + { + /* synch CNG configs between channels */ + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + st = sts[n]; + if ( ( st->hFdCngEnc->hFdCngCom->frameSize != st->L_frame ) || ( st->hFdCngEnc->hFdCngCom->CngBandwidth != st->bwidth ) ) + { + configureFdCngEnc( st->hFdCngEnc, max( st->bwidth, WB ), st->L_frame == L_FRAME16k ? ACELP_16k40 : ACELP_9k60 ); + } + } + + if ( sts[0]->cng_sba_flag ) + { + FdCngEncodeDiracMDCTStereoSID( hCPE ); + } + else + { + FdCngEncodeMDCTStereoSID( hCPE ); + } + } + } + + + /*---------------------------------------------------------------------* + * Postprocessing, BWEs and Updates + *---------------------------------------------------------------------*/ + + for ( n = 0; n < n_CoreChannels; n++ ) + { + st = sts[n]; + + /*---------------------------------------------------------------------* + * Postprocessing for ACELP/HQ core switching + *---------------------------------------------------------------------*/ + + core_switching_post_enc( st, old_inp_12k8[n], old_inp_16k[n], A[n] ); + + /*---------------------------------------------------------------------* + * WB TBE encoding + * WB BWE encoding + *---------------------------------------------------------------------*/ + + if ( input_Fs >= 16000 && st->bwidth < SWB && st->hBWE_TD != NULL ) + { + /* Common pre-processing for WB TBE and WB BWE */ + wb_pre_proc( st, last_element_mode, new_inp_resamp16k[n], hb_speech ); + } + + if ( st->extl == WB_TBE ) + { + /* WB TBE encoder */ + wb_tbe_enc( st, hb_speech, bwe_exc_extended[n], voice_factors[n], pitch_buf[n] ); + } + else if ( st->extl == WB_BWE && n == 0 && st->element_mode != IVAS_CPE_MDCT ) + { + /* WB BWE encoder */ + wb_bwe_enc( st, new_inp_resamp16k[n] ); + } + + /*---------------------------------------------------------------------* + * SWB(FB) TBE encoding + * SWB(FB) BWE encoding + *---------------------------------------------------------------------*/ + + new_swb_speech = new_swb_speech_buffer + STEREO_DFT_OVL_MAX; + + if ( !st->Opt_SC_VBR && input_Fs >= 32000 && st->hBWE_TD != NULL ) + { + /* Common pre-processing for SWB(FB) TBE and SWB(FB) BWE */ + swb_pre_proc( st, new_swb_speech, shb_speech, realBuffer[n], imagBuffer[n], hCPE ); + } + else if ( input_Fs >= 32000 ) + { + if ( st->hBWE_TD != NULL ) + { + InitSWBencBufferStates( st->hBWE_TD, shb_speech ); + } + } + + /* SWB TBE encoder */ + if ( st->extl == SWB_TBE || st->extl == FB_TBE ) + { + if ( st->core_brate != FRAME_NO_DATA && st->core_brate != SID_2k40 ) + { + float fb_exc[L_FRAME16k]; + + swb_tbe_enc( st, hStereoICBWE, shb_speech, bwe_exc_extended[n], voice_factors[n], fb_exc, pitch_buf[n] ); + + if ( st->extl == FB_TBE ) + { + /* FB TBE encoder */ + fb_tbe_enc( st, st->input, fb_exc ); + } + } + } + else if ( st->extl == SWB_BWE || st->extl == FB_BWE ) + { + /* SWB(FB) BWE encoder */ + swb_bwe_enc( st, last_element_mode, old_inp_12k8[n], old_inp_16k[n], old_syn_12k8_16k[n], new_swb_speech, shb_speech ); + } + + /*---------------------------------------------------------------------* + * SWB DTX/CNG encoding + *---------------------------------------------------------------------*/ + + if ( st->hTdCngEnc != NULL && st->Opt_DTX_ON && ( input_frame >= L_FRAME32k || st->element_mode == IVAS_CPE_DFT ) ) + { + /* SHB DTX/CNG encoder */ + swb_CNG_enc( st, shb_speech, old_syn_12k8_16k[n] ); + } + + /*-------------------------------------------------------------------* + * Inter-channel BWE encoding + *-------------------------------------------------------------------*/ + + if ( n == 0 && input_Fs >= 32000 && hStereoICBWE != NULL ) + { + stereo_icBWE_preproc( hCPE, input_frame, new_swb_speech_buffer /*tmp buffer*/ ); + + stereo_icBWE_enc( hCPE, shb_speech, new_swb_speech_buffer, voice_factors[0] ); + } + + /*---------------------------------------------------------------------* + * Channel-aware mode - write signaling information into the bitstream + *---------------------------------------------------------------------*/ + + signaling_enc_rf( st ); + + /*---------------------------------------------------------------------* + * Common updates + *---------------------------------------------------------------------*/ + + if ( !MCT_flag ) /* for MCT do this later, otherwise there can be a problem because TCX quant happens later and might get the wrong last_core on a bit rate switch */ + { + updt_enc_common( st ); + } + } + + /*------------------------------------------------------------------* + * Write potentially unused bits in combined format coding + *-----------------------------------------------------------------*/ + + if ( hCPE != NULL && hCPE->element_mode == IVAS_CPE_DFT && hCPE->brate_surplus > 0 ) + { + while ( diff_nBits > 0 ) + { + n = min( diff_nBits, 16 ); + push_indice( sts[0]->hBstr, IND_UNUSED, 0, n ); + diff_nBits -= n; + } + } + + + pop_wmops(); + + return error; +} diff --git a/lib_enc/ivas_core_pre_proc.c b/lib_enc/ivas_core_pre_proc.c new file mode 100644 index 0000000000000000000000000000000000000000..dd95f8dbe17a81c8a78370953060278e6a579f67 --- /dev/null +++ b/lib_enc/ivas_core_pre_proc.c @@ -0,0 +1,807 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "cnst.h" +#include "ivas_cnst.h" +#include "ivas_prot.h" +#include "rom_enc.h" +#include "rom_com.h" +#include "prot.h" +#include "wmc_auto.h" + + +/*-------------------------------------------------------------------* + * pre_proc_ivas() + * + * Pre-processing (Selection of internal Fs, classification, SC VBR decision, + * Decision matrix, Preprocessing at other Fs, core switching decision, ...) + *--------------------------------------------------------------------*/ + +ivas_error pre_proc_ivas( + Encoder_State *st, /* i/o: encoder state structure */ + const int16_t last_element_mode, /* i : last element mode */ + const int32_t element_brate, /* i : element bitrate */ + const int32_t last_element_brate, /* i : last element bitrate */ + const int16_t input_frame, /* i : frame length */ + float old_inp_12k8[], /* i/o: buffer of old input signal */ + float old_inp_16k[], /* i/o: buffer of old input signal @ 16kHz */ + float **inp, /* o : ptr. to inp. signal in the current frame*/ + float *ener, /* o : residual energy from Levinson-Durbin */ + float A[NB_SUBFR16k * ( M + 1 )], /* i/o: A(z) unquantized for the 4 subframes */ + float Aw[NB_SUBFR16k * ( M + 1 )], /* i/o: weighted A(z) unquantized for subframes */ + float epsP[M + 1], /* i/o: LP prediction errors */ + float lsp_new[M], /* i/o: LSPs at the end of the frame */ + float lsp_mid[M], /* i/o: LSPs in the middle of the frame */ + float *new_inp_resamp16k, /* o : new input signal @16kHz, non pre-emphasised, used by the WB TBE/BWE */ + int16_t *Voicing_flag, /* o : voicing flag for HQ FEC */ + const float old_wsp[], /* i : weighted input signal buffer */ + const int16_t loc_harm, /* i : harmonicity flag */ + const float cor_map_sum, /* i : speech/music clasif. parameter */ + const int16_t vad_flag_dtx, /* i : HE-SAD flag with additional DTX HO */ + const float enerBuffer[CLDFB_NO_CHANNELS_MAX], /* i : energy buffer */ + const float fft_buff[2 * L_FFT], /* i : FFT buffer */ + const int16_t MCT_flag, /* i : hMCT handle allocated (1) or not (0) */ + const int16_t vad_hover_flag, /* i : VAD hangover flag */ + const int16_t flag_16k_smc /* i : flag to indicate if the OL SMC is run at 16 kHz */ +) +{ + int16_t L_look, element_mode, lMemRecalc_12k8; + float *inp_12k8, *new_inp_12k8, *inp_16k; /* pointers to current frame and new data */ + const float *wsp; /* weighted input signal buffer */ + int32_t sr_core_tmp, total_brate_tmp; + ivas_error error; + + push_wmops( "pre_proc" ); + + error = IVAS_ERR_OK; + + /*----------------------------------------------------------------* + * Initialization + *----------------------------------------------------------------*/ + + element_mode = st->element_mode; + + new_inp_12k8 = old_inp_12k8 + L_INP_MEM; /* pointer to new samples of the input signal in 12.8kHz core */ + inp_12k8 = new_inp_12k8 - L_LOOK_12k8; + + if ( element_mode != IVAS_CPE_DFT ) + { + new_inp_12k8 -= L_FILT; + } + + wsp = old_wsp + L_WSP_MEM; /* pointer to the current frame of weighted signal in 12.8kHz core */ + + lMemRecalc_12k8 = 0; + if ( element_mode == IVAS_CPE_TD ) + { + lMemRecalc_12k8 = NS2SA( INT_FS_12k8, L_MEM_RECALC_NS ); + } + + /*----------------------------------------------------------------* + * Selection of internal ACELP Fs (12.8 kHz or 16 kHz) + *----------------------------------------------------------------*/ + + if ( st->core_brate == FRAME_NO_DATA ) + { + /* prevent "L_frame" changes in CNG segments */ + st->L_frame = st->last_L_frame; + } + else if ( st->core_brate == SID_2k40 && st->bwidth >= WB && st->hDtxEnc->first_CNG && ( st->hTdCngEnc != NULL && st->hTdCngEnc->act_cnt2 < MIN_ACT_CNG_UPD ) ) + { + /* prevent "L_frame" changes in SID frame after short segment of active frames */ + st->L_frame = st->hDtxEnc->last_CNG_L_frame; + } + else if ( ( ( st->element_mode == IVAS_CPE_MDCT && st->element_brate >= IVAS_64k && st->bwidth >= SWB ) || ( element_mode == IVAS_SCE && st->total_brate > MAX_ACELP_BRATE && st->bwidth >= SWB ) ) && st->core_brate != SID_2k40 ) + { + st->L_frame = L_FRAME32k; + } + else if ( st->bwidth >= SWB && st->total_brate > MAX_ACELP_BRATE_ISM && st->total_brate <= MAX_ACELP_BRATE && element_mode == IVAS_SCE && st->is_ism_format && st->tcxonly && st->core_brate != SID_2k40 ) + { + st->L_frame = L_FRAME25_6k; + } + else if ( st->flag_ACELP16k ) + { + st->L_frame = L_FRAME16k; + } + else + { + st->L_frame = L_FRAME; + } + + if ( st->hFdCngEnc != NULL && st->element_mode != IVAS_CPE_MDCT && ( ( st->hFdCngEnc->hFdCngCom->frameSize != st->L_frame ) || ( st->hFdCngEnc->hFdCngCom->CngBandwidth != st->input_bwidth ) ) ) + { + configureFdCngEnc( st->hFdCngEnc, max( st->input_bwidth, WB ), st->L_frame == L_FRAME16k ? ACELP_16k40 : ACELP_9k60 ); + } + + if ( st->ini_frame == 0 ) + { + /* avoid switching of internal ACELP Fs in the very first frame */ + st->last_L_frame = st->L_frame; + } + + if ( st->L_frame == L_FRAME ) + { + st->gamma = GAMMA1; + st->preemph_fac = PREEMPH_FAC; + } + else if ( st->L_frame == L_FRAME32k ) + { + st->gamma = GAMMA16k; + st->preemph_fac = PREEMPH_FAC_SWB; + } + else + { + st->gamma = GAMMA16k; + st->preemph_fac = PREEMPH_FAC_16k; + } + + st->sr_core = st->L_frame * FRAMES_PER_SEC; + st->encoderLookahead_enc = NS2SA( st->sr_core, ACELP_LOOK_NS ); + st->encoderPastSamples_enc = ( st->L_frame * 9 ) >> 4; + + + /*-----------------------------------------------------------------* + * coder_type rewriting in case of switching + * IC frames selection + * enforce TC frames in case of switching + *-----------------------------------------------------------------*/ + + /* enforce TRANSITION frames */ + if ( !( st->element_mode == IVAS_CPE_TD && st->idchan == 1 ) && st->last_L_frame != st->L_frame && st->core_brate != FRAME_NO_DATA && st->core_brate != SID_2k40 && st->last_core_brate != FRAME_NO_DATA && st->last_core_brate != SID_2k40 && st->coder_type_raw != VOICED ) + { + /* enforce TC frame in case of ACELP@12k8 <-> ACELP@16k core switching */ + st->coder_type = TRANSITION; + } + else if ( st->last_core == HQ_CORE && st->coder_type_raw != VOICED ) + { + /* enforce TC frame in case of HQ -> ACELP core switching */ + st->coder_type = TRANSITION; + } + else if ( st->last_core_brate <= SID_2k40 && st->cng_type == FD_CNG && !( element_mode == IVAS_CPE_TD ) ) + { + /* enforce TC frame in case of FD_CNG -> ACELP switching (past excitation not available) */ + st->coder_type = TRANSITION; + } + /* select INACTIVE frames */ + else if ( st->total_brate <= MAX_GSC_INACTIVE_BRATE && st->vad_flag == 0 && st->element_mode != IVAS_CPE_MDCT ) + { + /* inactive frames will be coded by GSC technology */ + /* except for the VBR mode. VBR mode uses NELP for that */ + if ( !( st->Opt_SC_VBR && vad_flag_dtx ) && ( st->idchan == 0 || element_mode != IVAS_CPE_TD ) ) + { + st->coder_type = INACTIVE; + st->hGSCEnc->noise_lev = NOISE_LEVEL_SP3; + } + } + else if ( st->total_brate > MAX_GSC_INACTIVE_BRATE && ( ( st->vad_flag == 0 && st->bwidth >= SWB && st->max_bwidth >= SWB ) || ( st->localVAD == 0 && ( st->bwidth <= WB || st->max_bwidth <= WB ) ) ) ) + { + /* inactive frames will be coded by AVQ technology */ + st->coder_type = INACTIVE; + } + + + /*---------------------------------------------------------------------* + * Decision matrix (selection of technologies) + *---------------------------------------------------------------------*/ + + st->mdct_sw = MODE1; + st->mdct_sw_enable = MODE1; + if ( ( st->total_brate <= MIN_BRATE_GSC_NOISY_FLAG || st->bwidth < SWB || st->flag_ACELP16k ) && st->GSC_IVAS_mode == 0 ) + { + st->GSC_noisy_speech = 0; + } + + /* core selection */ + ivas_decision_matrix_enc( st, element_brate, fft_buff, enerBuffer, last_element_mode ); + + if ( st->L_frame == L_FRAME16k && ( st->coder_type == VOICED || st->coder_type == UNVOICED ) ) /* VOICED and UNVOICED are not supported in ACELP@16k */ + { + st->coder_type = GENERIC; + } + + if ( st->core == TCX_20_CORE || st->core == HQ_CORE ) + { + st->Nb_ACELP_frames = 0; + /* Configure TCX with the same bitrate as given when (re-)initializing TCX */ + total_brate_tmp = st->total_brate; + st->total_brate = st->bits_frame_nominal * FRAMES_PER_SEC; + SetModeIndex( st, st->last_bits_frame_nominal * FRAMES_PER_SEC, last_element_mode, MCT_flag ); + + st->sr_core = getCoreSamplerateMode2( element_mode, st->total_brate, st->bwidth, st->flag_ACELP16k, st->rf_mode, st->is_ism_format ); + st->total_brate = total_brate_tmp; + + st->L_frame = (int16_t) ( st->sr_core / FRAMES_PER_SEC ); + st->encoderLookahead_enc = NS2SA( st->sr_core, ACELP_LOOK_NS ); + st->encoderPastSamples_enc = ( st->L_frame * 9 ) >> 4; + + if ( st->sr_core == INT_FS_12k8 ) + { + st->preemph_fac = PREEMPH_FAC; + st->gamma = GAMMA1; + } + else if ( st->sr_core == INT_FS_16k ) + { + st->preemph_fac = PREEMPH_FAC_16k; + st->gamma = GAMMA16k; + } + else /* st->sr_core >=25600 */ + { + st->preemph_fac = PREEMPH_FAC_SWB; + st->gamma = GAMMA16k; + } + + if ( st->vad_flag == 0 ) + { + st->coder_type = INACTIVE; + } + else if ( st->coder_type > GENERIC ) + { + st->coder_type = GENERIC; + } + if ( st->element_mode != IVAS_CPE_MDCT ) + { + SetTCXModeInfo( st, st->hTranDet, &st->hTcxCfg->tcx_curr_overlap_mode ); + } + } + else if ( st->element_mode == IVAS_CPE_MDCT ) + { + st->hTcxEnc->tfm_mem = 0.75f; + } + else if ( element_brate != last_element_brate ) + { + SetModeIndex( st, st->bits_frame_nominal * FRAMES_PER_SEC, element_mode, MCT_flag ); + + if ( st->extl != -1 && st->extl != IGF_BWE && st->igf == 1 ) + { + st->igf = 0; + } + } + + + /*-----------------------------------------------------------------* + * Update of ACELP harmonicity counter (used in ACELP transform codebook @32kbps) + *-----------------------------------------------------------------*/ + + if ( loc_harm == 1 && cor_map_sum > 50 && st->clas == VOICED_CLAS && st->coder_type == GENERIC ) + { + st->last_harm_flag_acelp++; + + if ( st->last_harm_flag_acelp > 10 ) + { + st->last_harm_flag_acelp = 10; + } + } + else + { + st->last_harm_flag_acelp = 0; + } + + /*-----------------------------------------------------------------* + * Update audio frames counter (used for UV decision) + *-----------------------------------------------------------------*/ + + if ( st->coder_type == AUDIO ) + { + st->audio_frame_cnt += AUDIO_COUNTER_STEP; + } + else if ( st->coder_type != INACTIVE ) + { + st->audio_frame_cnt--; + } + + if ( st->audio_frame_cnt > AUDIO_COUNTER_MAX ) + { + st->audio_frame_cnt = AUDIO_COUNTER_MAX; + } + + if ( st->audio_frame_cnt < 0 ) + { + st->audio_frame_cnt = 0; + } + + /*-----------------------------------------------------------------* + * Set formant sharpening flag + *-----------------------------------------------------------------*/ + + st->sharpFlag = 0; + + if ( st->coder_type == GENERIC || st->coder_type == VOICED || st->coder_type == TRANSITION ) + { + if ( element_brate >= FRMT_SHP_MIN_BRATE_IVAS && st->lp_noise > FORMANT_SHARPENING_NOISE_THRESHOLD ) + { + st->sharpFlag = 0; + } + else + { + st->sharpFlag = 1; + } + } + + /* channel-aware mode - due to lack of signaling bit, sharpFlag is 1 always in RF mode */ + if ( st->rf_mode && ( st->coder_type == VOICED || st->coder_type == GENERIC ) ) + { + st->sharpFlag = 1; + } + + /* TD stereo, secondary channel - due to lack of signaling bits, sharpFlag is always 1 */ + if ( element_mode == IVAS_CPE_TD && st->idchan == 1 ) + { + st->sharpFlag = 0; + if ( st->coder_type == GENERIC || st->coder_type == VOICED ) + { + st->sharpFlag = 1; + } + } + + /*-----------------------------------------------------------------* + * Set voicing flag for HQ FEC + *-----------------------------------------------------------------*/ + + if ( st->sp_aud_decision1 == 0 && ( st->coder_type == VOICED || st->coder_type == GENERIC ) ) + { + *Voicing_flag = 1; + } + else + { + *Voicing_flag = 0; + } + + /*-----------------------------------------------------------------* + * Compute core-coder buffers at internal sampling rate + *-----------------------------------------------------------------*/ + + sr_core_tmp = ( st->tcxonly == 0 ) ? INT_FS_16k : max( INT_FS_16k, st->sr_core ); /* indicates the ACELP sampling rate */ + + L_look = NS2SA( sr_core_tmp, ACELP_LOOK_NS ); /* lookahead at other sampling rate (16kHz, 25.6kHz, 32kHz) */ + + inp_16k = old_inp_16k + L_INP_MEM - L_look; + + if ( !flag_16k_smc ) + { + error = ivas_compute_core_buffers( st, &inp_16k, old_inp_16k, new_inp_resamp16k, input_frame, last_element_mode, sr_core_tmp, ener, A, Aw, epsP, lsp_new, lsp_mid ); + if ( error != IVAS_ERR_OK ) + { + return error; + } + } + + if ( !( st->L_frame == L_FRAME16k && element_mode != IVAS_CPE_MDCT ) ) + { + /* update signal buffers */ + mvr2r( new_inp_12k8, st->buf_speech_enc_pe + st->L_frame, L_FRAME ); + mvr2r( st->buf_speech_enc + L_FRAME32k, st->buf_speech_enc + st->L_frame, L_FRAME ); + + if ( element_mode == IVAS_CPE_DFT ) + { + mvr2r( st->buf_speech_enc + L_FRAME32k - STEREO_DFT_OVL_12k8, st->buf_speech_enc + st->L_frame - STEREO_DFT_OVL_12k8, STEREO_DFT_OVL_12k8 ); + } + else if ( element_mode == IVAS_CPE_TD || element_mode == IVAS_CPE_MDCT ) + { + mvr2r( st->buf_speech_enc + L_FRAME32k - lMemRecalc_12k8 - L_FILT, st->buf_speech_enc + st->L_frame - lMemRecalc_12k8 - L_FILT, lMemRecalc_12k8 + L_FILT ); + } + else if ( element_mode == IVAS_SCE ) + { + mvr2r( st->buf_speech_enc + L_FRAME32k - L_FILT, st->buf_speech_enc + st->L_frame - L_FILT, L_FILT ); + } + + if ( st->tcxonly == 0 ) + { + mvr2r( wsp, st->wspeech_enc, L_FRAME + L_LOOK_12k8 ); + } + } + + if ( flag_16k_smc ) + { + mvr2r( st->buf_speech_enc + L_FRAME16k, new_inp_resamp16k, L_FRAME16k ); + } + + /*-----------------------------------------------------------------* + * Updates + *-----------------------------------------------------------------*/ + + /* update old weighted speech buffer - for OL pitch analysis */ + mvr2r( &old_wsp[L_FRAME], st->old_wsp, L_WSP_MEM ); + + + /* set the pointer of the current frame for the ACELP core */ + if ( st->L_frame == L_FRAME ) + { + *inp = inp_12k8; + } + else + { + *inp = inp_16k; + } + + /* Update VAD hangover frame counter in active frames */ + if ( !( st->core_brate == SID_2k40 || st->core_brate == FRAME_NO_DATA ) && st->tcxonly == 0 ) + { + if ( st->hTdCngEnc != NULL && st->Opt_DTX_ON && vad_hover_flag ) + { + st->hTdCngEnc->burst_ho_cnt++; + if ( st->hTdCngEnc->burst_ho_cnt > HO_HIST_SIZE ) + { + st->hTdCngEnc->burst_ho_cnt = HO_HIST_SIZE; + } + } + else if ( st->hTdCngEnc != NULL && vad_flag_dtx ) + { + st->hTdCngEnc->burst_ho_cnt = 0; + } + } + + + pop_wmops(); + return error; +} + + +/*-------------------------------------------------------------------* + * ivas_compute_core_buffers() + * + * Compute core-coder buffers at internal sampling rate + *--------------------------------------------------------------------*/ + +ivas_error ivas_compute_core_buffers( + Encoder_State *st, /* i/o: encoder state structure */ + float **inp16k_out, /* o : ptr. to inp. signal in the current frame */ + float *old_inp_16k, /* i/o: buffer of old input signal @ 16kHz */ + float new_inp_resamp16k_out[], /* o : new input signal @16kHz, non pre-emphasised, used by the WB TBE/BWE */ + const int16_t input_frame, /* i : frame length */ + const int16_t last_element_mode, /* i : last element mode */ + const int32_t sr_core, /* i : core-coder sampling rate */ + float *ener, /* o : residual energy from Levinson-Durbin */ + float A[NB_SUBFR16k * ( M + 1 )], /* i/o: A(z) unquantized for the 4 subframes */ + float Aw[NB_SUBFR16k * ( M + 1 )], /* i/o: weighted A(z) unquantized for subframes */ + float epsP[M + 1], /* i/o: LP prediction errors */ + float lsp_new[M], /* i/o: LSPs at the end of the frame */ + float lsp_mid[M] /* i/o: LSPs in the middle of the frame */ +) +{ + float *inp_16k, *new_inp_16k; + float tmp, mem_decim16k_dummy[2 * L_FILT_MAX]; + const float *signal_in; + int16_t delay, element_mode; + float temp1F_icatdmResampBuf[L_FILT_MAX]; /* temp buffers for ICA TDM resamplers */ + float new_inp_resamp16k[L_FRAME16k]; + int16_t lMemRecalc, lMemRecalc_16k, L_frame_tmp, L_look; + int32_t input_Fs; + + signal_in = st->input; + + input_Fs = st->input_Fs; + element_mode = st->element_mode; + + lMemRecalc_16k = 0; + lMemRecalc = 0; + if ( element_mode == IVAS_CPE_TD ) + { + lMemRecalc_16k = NS2SA( INT_FS_16k, L_MEM_RECALC_NS ); + lMemRecalc = NS2SA( input_Fs, L_MEM_RECALC_NS ); + } + + /*---------------------------------------------------------------* + * Preprocessing at other sampling frequency rate (16/25.6/32kHz) + *----------------------------------------------------------------*/ + + L_frame_tmp = ( st->tcxonly == 0 ) ? L_FRAME16k : max( L_FRAME16k, st->L_frame ); + + L_look = NS2SA( sr_core, ACELP_LOOK_NS ); /* lookahead at other sampling rate (16kHz, 25.6kHz, 32kHz) */ + + new_inp_16k = old_inp_16k + L_INP_MEM; /* pointer to new samples of the input signal in 16kHz core */ + inp_16k = new_inp_16k - L_look; /* pointer to the current frame of input signal in 16kHz core */ + + /* shift the pointer back to take care of resampler memory update */ + if ( element_mode == IVAS_CPE_TD || element_mode == IVAS_SCE ) + { + new_inp_16k -= NS2SA( sr_core, DELAY_FIR_RESAMPL_NS ); + } + + if ( element_mode == IVAS_CPE_DFT ) + { + mvr2r( st->old_inp_16k, old_inp_16k, L_INP_MEM - STEREO_DFT_OVL_16k ); + } + else if ( element_mode == IVAS_CPE_TD ) + { + mvr2r( st->old_inp_16k, old_inp_16k, L_INP_MEM - L_MEM_RECALC_16K - L_FILT16k ); + } + else + { + mvr2r( st->old_inp_16k, old_inp_16k, L_INP_MEM - L_FILT16k ); + } + + /*---------------------------------------------------------------* + * Change the sampling frequency to 16/25.6/32 kHz + *----------------------------------------------------------------*/ + + if ( element_mode == IVAS_SCE ) + { + if ( input_Fs == sr_core ) + { + /* no resampling needed, only delay adjustment to account for the FIR resampling delay */ + delay = NS2SA( input_Fs, DELAY_FIR_RESAMPL_NS ); + mvr2r( st->mem_decim16k + delay, new_inp_16k, delay ); + mvr2r( signal_in, new_inp_16k + delay, input_frame ); + mvr2r( signal_in + input_frame - 2 * delay, st->mem_decim16k, 2 * delay ); + } + else if ( input_Fs == 32000 || input_Fs == 48000 ) + { + modify_Fs( signal_in, input_frame, input_Fs, new_inp_16k, sr_core, st->mem_decim16k, 0 ); + + mvr2r( st->mem_decim16k, mem_decim16k_dummy, 2 * L_FILT_MAX ); + set_f( temp1F_icatdmResampBuf, 0, L_FILT_MAX ); + modify_Fs( temp1F_icatdmResampBuf, NS2SA( input_Fs, DELAY_FIR_RESAMPL_NS ), input_Fs, new_inp_16k + NS2SA( sr_core, FRAME_SIZE_NS ), sr_core, mem_decim16k_dummy, 0 ); + } + } + else if ( element_mode == IVAS_CPE_TD ) + { + if ( input_Fs == sr_core ) + { + /* no resampling needed, only delay adjustment to account for the FIR resampling delay */ + delay = NS2SA( input_Fs, DELAY_FIR_RESAMPL_NS ); + mvr2r( st->mem_decim16k + delay, new_inp_16k - lMemRecalc - delay + L_FILT16k, delay ); + mvr2r( signal_in - lMemRecalc, new_inp_16k - lMemRecalc + L_FILT16k, input_frame + lMemRecalc ); + mvr2r( signal_in + input_frame - lMemRecalc - 2 * delay, st->mem_decim16k, 2 * delay ); + } + else if ( input_Fs == 32000 || input_Fs == 48000 ) + { + /* reconstruct past segment of input signal when switching from MDCT stereo */ + if ( last_element_mode == IVAS_CPE_MDCT /*|| st->idchan == 1*/ ) + { + int16_t length_inp = NS2SA( input_Fs, L_MEM_RECALC_SCH_NS - DELAY_FIR_RESAMPL_NS ); + int16_t length_16k = NS2SA( INT_FS_16k, L_MEM_RECALC_SCH_NS - DELAY_FIR_RESAMPL_NS ); + + mvr2r( signal_in - lMemRecalc - length_inp - 2 * NS2SA( input_Fs, DELAY_FIR_RESAMPL_NS ), st->mem_decim16k, 2 * NS2SA( input_Fs, DELAY_FIR_RESAMPL_NS ) ); + modify_Fs( signal_in - lMemRecalc - length_inp, length_inp, input_Fs, new_inp_16k - lMemRecalc_16k - length_16k, sr_core, st->mem_decim16k, 0 ); + } + + modify_Fs( signal_in - lMemRecalc, input_frame, input_Fs, new_inp_16k - ( lMemRecalc * sr_core ) / st->input_Fs, sr_core, st->mem_decim16k, 0 ); + mvr2r( st->mem_decim16k, mem_decim16k_dummy, 2 * L_FILT_MAX ); + + if ( lMemRecalc > 0 ) + { + modify_Fs( signal_in - lMemRecalc + input_frame, lMemRecalc, input_Fs, new_inp_16k + NS2SA( sr_core, FRAME_SIZE_NS ) - ( lMemRecalc * sr_core ) / st->input_Fs, sr_core, mem_decim16k_dummy, 0 ); + } + + set_f( temp1F_icatdmResampBuf, 0, L_FILT_MAX ); + modify_Fs( temp1F_icatdmResampBuf, NS2SA( input_Fs, DELAY_FIR_RESAMPL_NS ), input_Fs, new_inp_16k + NS2SA( sr_core, FRAME_SIZE_NS ), sr_core, mem_decim16k_dummy, 0 ); + } + } + else if ( st->idchan == 0 ) + { + /* update the FIR resampling filter memory, needed for switching to time-domain (FIR) resampling */ + mvr2r( signal_in + input_frame - NS2SA( input_Fs, L_MEM_RECALC_NS ) - 2 * NS2SA( input_Fs, DELAY_FIR_RESAMPL_NS ), st->mem_decim16k, 2 * NS2SA( input_Fs, DELAY_FIR_RESAMPL_NS ) ); + } + + /*------------------------------------------------* + * Update BWE memories * + *------------------------------------------------*/ + + if ( sr_core == INT_FS_16k && element_mode != IVAS_CPE_MDCT ) + { + delay = NS2SA( INT_FS_16k, DELAY_FD_BWE_ENC_12k8_NS ); + + if ( element_mode == IVAS_CPE_DFT ) + { + /* save input resampled at 16kHz, non-preemphasised.*/ + mvr2r( new_inp_16k, new_inp_resamp16k, L_FRAME16k ); + + if ( st->bwidth == WB ) + { + mvr2r( new_inp_16k - delay, st->hBWE_FD->old_input_wb, delay ); + mvr2r( new_inp_16k - STEREO_DFT_OVL_16k, st->hBWE_FD->old_wtda_swb + L_FRAME16k - STEREO_DFT_OVL_16k + delay, STEREO_DFT_OVL_16k - delay ); + } + } + else if ( element_mode == IVAS_CPE_TD ) + { + /* save input resampled at 16kHz, non-preemphasised */ + mvr2r( new_inp_16k + L_FILT16k, new_inp_resamp16k, L_FRAME16k ); + + if ( st->bwidth == WB && st->hBWE_FD != NULL ) + { + mvr2r( new_inp_16k + L_FILT16k - delay, st->hBWE_FD->old_input_wb, delay ); + mvr2r( new_inp_16k - L_MEM_RECALC_16K, st->hBWE_FD->old_wtda_swb + L_FRAME16k - L_MEM_RECALC_16K - L_FILT16k + delay, L_MEM_RECALC_16K + L_FILT16k - delay ); + } + } + else if ( element_mode == IVAS_SCE ) + { + /* save input resampled at 16kHz, non-preemphasised */ + mvr2r( new_inp_16k + L_FILT16k, new_inp_resamp16k, L_FRAME16k ); + + if ( st->bwidth == WB ) + { + mvr2r( new_inp_16k, st->hBWE_FD->old_input_wb + delay - L_FILT16k, L_FILT16k ); + /* all buffer st->hBWE_FD->old_wtda_swb is correct and does not need to be updated */ + } + } + } + else if ( sr_core > INT_FS_16k ) + { + /* reset the buffer, the signal is needed for WB BWEs */ + set_f( new_inp_resamp16k, 0.0f, L_FRAME16k ); + } + + /*------------------------------------------------------------------* + * Perform fixed preemphasis (16kHz signal) through 1 - g*z^-1 + *-----------------------------------------------------------------*/ + + if ( + st->tcxonly == 0 && + !( ( element_mode == IVAS_CPE_TD && st->idchan == 1 ) || element_mode == IVAS_CPE_MDCT ) ) + { + st->mem_preemph_enc = new_inp_16k[L_frame_tmp - 1]; + } + + if ( input_Fs > 8000 && sr_core == INT_FS_16k && element_mode != IVAS_CPE_MDCT ) + { + if ( element_mode == IVAS_CPE_DFT ) + { + mvr2r( new_inp_16k - STEREO_DFT_OVL_16k + L_FRAME16k, st->inp_16k_mem_stereo_sw, STEREO_DFT_OVL_16k - L_MEM_RECALC_16K - L_FILT16k ); /* update for TD/DFT stereo switching */ + + st->mem_preemph16k = st->mem_preemph16k_DFT; + st->mem_preemph16k_DFT = old_inp_16k[L_INP_MEM - STEREO_DFT_OVL_16k + L_FRAME16k - 1]; + + if ( st->L_frame == L_FRAME16k ) + { + mvr2r( new_inp_16k - STEREO_DFT_OVL_16k, st->buf_speech_enc + L_FRAME16k - STEREO_DFT_OVL_16k, L_FRAME16k + STEREO_DFT_OVL_16k ); + } + preemph( new_inp_16k - STEREO_DFT_OVL_16k, PREEMPH_FAC_16k, L_FRAME16k, &( st->mem_preemph16k ) ); + tmp = st->mem_preemph16k; + preemph( new_inp_16k - STEREO_DFT_OVL_16k + L_FRAME16k, PREEMPH_FAC_16k, STEREO_DFT_OVL_16k, &tmp ); + } + else if ( st->element_mode == IVAS_CPE_TD ) + { + if ( last_element_mode == IVAS_CPE_DFT ) + { + st->mem_preemph16k = st->mem_preemph16k_DFT; + mvr2r( st->inp_16k_mem_stereo_sw, new_inp_16k - L_MEM_RECALC_16K - ( STEREO_DFT_OVL_16k - L_MEM_RECALC_16K - L_FILT16k ), STEREO_DFT_OVL_16k - L_MEM_RECALC_16K - L_FILT16k ); + preemph( new_inp_16k - L_MEM_RECALC_16K - ( STEREO_DFT_OVL_16k - L_MEM_RECALC_16K - L_FILT16k ), PREEMPH_FAC_16k, STEREO_DFT_OVL_16k - L_MEM_RECALC_16K - L_FILT16k, &st->mem_preemph16k ); + } + + st->mem_preemph16k_DFT = old_inp_16k[L_INP_MEM - STEREO_DFT_OVL_16k + L_FRAME16k - 1]; + + /* preemphasise past segment of input signal when switching from MDCT stereo */ + if ( last_element_mode == IVAS_CPE_MDCT ) + { + int16_t length_16k = NS2SA( INT_FS_16k, L_MEM_RECALC_SCH_NS - DELAY_FIR_RESAMPL_NS ); + preemph( new_inp_16k - lMemRecalc_16k - length_16k, PREEMPH_FAC, length_16k, &st->mem_preemph16k ); + } + + if ( st->L_frame == L_FRAME16k ) + { + mvr2r( new_inp_16k - lMemRecalc_16k, st->buf_speech_enc + L_FRAME16k - lMemRecalc_16k - L_FILT16k, L_FRAME16k + lMemRecalc_16k + L_FILT16k ); + } + preemph( new_inp_16k - lMemRecalc_16k, PREEMPH_FAC_16k, L_FRAME16k, &( st->mem_preemph16k ) ); + tmp = st->mem_preemph16k; + preemph( new_inp_16k - lMemRecalc_16k + L_FRAME16k, PREEMPH_FAC_16k, lMemRecalc_16k + L_FILT16k, &tmp ); + } + else if ( element_mode == IVAS_SCE ) + { + preemph( new_inp_16k, PREEMPH_FAC_16k, L_FRAME16k, &( st->mem_preemph16k ) ); + tmp = st->mem_preemph16k; + preemph( new_inp_16k + L_FRAME16k, PREEMPH_FAC_16k, L_FILT16k, &tmp ); + } + } + else if ( input_Fs > 8000 ) /* keep memory up-to-date in case of bitrate switching */ + { + if ( element_mode == IVAS_CPE_DFT ) + { + st->mem_preemph16k = new_inp_16k[L_frame_tmp - STEREO_DFT_OVL_16k - 1]; + } + else if ( element_mode == IVAS_CPE_TD ) + { + st->mem_preemph16k = new_inp_16k[L_frame_tmp - lMemRecalc_16k - 1]; + } + else if ( element_mode == IVAS_CPE_MDCT ) + { + st->mem_preemph16k = 0; + } + else /* SCE */ + { + st->mem_preemph16k = new_inp_16k[L_frame_tmp - 1]; + } + st->mem_preemph16k_DFT = st->mem_preemph16k; + } + + /*-----------------------------------------------------------------* + * LP analysis at 16kHz if ACELP@16k core was selected + * update buffers + *-----------------------------------------------------------------*/ + + if ( st->L_frame == L_FRAME16k && element_mode != IVAS_CPE_MDCT ) + { + /* update signal buffers */ + if ( element_mode == IVAS_CPE_DFT ) + { + mvr2r( new_inp_16k - STEREO_DFT_OVL_16k, st->buf_speech_enc_pe + L_FRAME16k - STEREO_DFT_OVL_16k, L_FRAME16k + STEREO_DFT_OVL_16k ); + } + else if ( element_mode == IVAS_CPE_TD ) + { + mvr2r( new_inp_16k - lMemRecalc_16k, st->buf_speech_enc_pe + L_FRAME16k - lMemRecalc_16k - L_FILT16k, L_FRAME16k + lMemRecalc_16k + L_FILT16k ); + } + else + { + mvr2r( new_inp_resamp16k, st->buf_speech_enc + L_FRAME16k, L_FRAME16k ); + mvr2r( new_inp_16k, st->buf_speech_enc_pe + L_FRAME16k, L_FRAME16k ); + } + + /*--------------------------------------------------------------* + * LPC analysis + *---------------------------------------------------------------*/ + + if ( st->last_L_frame == L_FRAME ) + { + /* this is just an approximation, but it is sufficient */ + mvr2r( st->lsp_old1, st->lspold_enc, M ); + } + + analy_lp( inp_16k, L_FRAME16k, L_look, ener, A, epsP, lsp_new, lsp_mid, st->lspold_enc, st->pitch, st->voicing, INT_FS_16k, 0 ); + + /*--------------------------------------------------------------* + * Compute Weighted Input + *---------------------------------------------------------------*/ + + find_wsp( L_FRAME16k, L_SUBFR, NB_SUBFR16k, A, Aw, st->speech_enc_pe, PREEMPH_FAC_16k, st->wspeech_enc, &st->mem_wsp_enc, st->gamma, L_LOOK_16k ); + } + + /*-----------------------------------------------------------------* + * Updates + *-----------------------------------------------------------------*/ + + /* update old input signal @16kHz buffer */ + if ( ( element_mode == IVAS_CPE_TD && st->idchan == 1 ) || element_mode == IVAS_CPE_MDCT ) + { + set_f( st->old_inp_16k, 0, L_INP_MEM ); + } + else if ( input_Fs > 8000 && sr_core == INT_FS_16k ) + { + mvr2r( &old_inp_16k[L_frame_tmp], st->old_inp_16k, L_INP_MEM ); + } + else if ( input_Fs > 8000 ) + { + lerp( st->old_inp_12k8 + L_INP_MEM - L_INP_MEM * 4 / 5, st->old_inp_16k, L_INP_MEM, L_INP_MEM * 4 / 5 ); + } + + if ( inp16k_out != NULL ) + { + *inp16k_out = inp_16k; + } + + if ( new_inp_resamp16k_out != NULL ) + { + mvr2r( new_inp_resamp16k, new_inp_resamp16k_out, L_FRAME16k ); + } + + return IVAS_ERR_OK; +} diff --git a/lib_enc/ivas_core_pre_proc_front.c b/lib_enc/ivas_core_pre_proc_front.c new file mode 100644 index 0000000000000000000000000000000000000000..8a9c62e1f80652d8ed86cfa754f6cf12ffa0b21c --- /dev/null +++ b/lib_enc/ivas_core_pre_proc_front.c @@ -0,0 +1,881 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "cnst.h" +#include "ivas_cnst.h" +#include "rom_enc.h" +#include "rom_com.h" +#include "prot.h" +#include "ivas_prot.h" +#include "wmc_auto.h" +#include + + +/*---------------------------------------------------------------* + * Local constants + *---------------------------------------------------------------*/ + +#define SCE_SMC_THR 16000 + + +/*-------------------------------------------------------------------* + * Local function prototypes + *--------------------------------------------------------------------*/ + +static void calculate_energy_buffer( CPE_ENC_HANDLE hCPE, float enerBuffer_dft[], const int16_t no_channels, const int32_t input_Fs ); + + +/*-------------------------------------------------------------------* + * pre_proc_front_ivas() + * + * Front Pre-processing for IVAS + * (resampling, spectral analysis, LP analysis, VAD, OL pitch calculation, classification) + *--------------------------------------------------------------------*/ + +ivas_error pre_proc_front_ivas( + SCE_ENC_HANDLE hSCE, /* i/o: SCE encoder structure */ + CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ + const int32_t element_brate, /* i : SCE/CPE element bitrate */ + const int16_t nb_bits_metadata, /* i : number of metadata bits */ + const int16_t input_frame, /* i : frame length */ + const int16_t n, /* i : channel number */ + float old_inp_12k8[], /* o : buffer of old input signal */ + float old_inp_16k[], /* o : buffer of old input signal @16kHz */ + float *ener, /* o : residual energy from Levinson-Durbin */ + float *relE, /* o : frame relative energy */ + float A[NB_SUBFR16k * ( M + 1 )], /* o : A(z) unquantized for the 4 subframes */ + float Aw[NB_SUBFR16k * ( M + 1 )], /* o : weighted A(z) unquantized for subframes */ + float epsP[M + 1], /* o : LP prediction errors */ + float lsp_new[M], /* o : LSPs at the end of the frame */ + float lsp_mid[M], /* o : LSPs in the middle of the frame */ + int16_t *vad_hover_flag, /* o : VAD hangover flag */ + int16_t *attack_flag, /* o : flag signaling attack */ + float realBuffer[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i/o: real buffer */ + float imagBuffer[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i/o: imag buffer */ + float old_wsp[], /* o : weighted input signal buffer */ + float pitch_fr[NB_SUBFR], /* o : fractional pitch values */ + float voicing_fr[NB_SUBFR], /* o : fractional pitch gains */ + int16_t *loc_harm, /* o : harmonicity flag */ + float *cor_map_sum, /* o : speech/music clasif. parameter */ + int16_t *vad_flag_dtx, /* o : HE-SAD flag with additional DTX HO */ + float enerBuffer[CLDFB_NO_CHANNELS_MAX], /* o : energy buffer */ + float fft_buff[2 * L_FFT], /* o : FFT buffer */ + const float tdm_A_PCh[M + 1], /* i : unq. LP coeff. of primary channel */ + const float tdm_lsp_new_PCh[M], /* i : unq. LSPs of primary channel */ + const float currFlatness, /* i : flatness parameter */ + const int16_t tdm_ratio_idx, /* i : Current Ratio_L index */ + float fr_bands_LR[CPE_CHANNELS][2 * NB_BANDS], /* i : energy in frequency bands */ + const float Etot_LR[CPE_CHANNELS], /* i : total energy Left & Right channel */ + float lf_E_LR[CPE_CHANNELS][2 * VOIC_BINS], /* i : per bin spectrum energy in lf, LR channels */ + const int16_t localVAD_HE_SAD_LR[CPE_CHANNELS], /* i : HE-SAD flag without hangover, LR channels */ + float band_energies_LR[2 * NB_BANDS], /* o : energy in critical bands without minimum noise floor E_MIN */ + const int16_t flag_16k_smc, /* i : flag to indicate if the OL SMC is run at 16 kHz */ + const int16_t front_vad_flag, /* i : front-VAD flag to overwrite VAD decision */ + const int16_t force_front_vad, /* i : flag to force VAD decision */ + const int16_t front_vad_dtx_flag, /* i : front-VAD DTX flag to overwrite VAD decision*/ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const int32_t ivas_total_brate /* i : IVAS total bitrate - for setting the DTX */ +) +{ + float *inp_12k8, *new_inp_12k8; /* pointers to current frame and new data */ + float *wsp; /* weighted input signal buffer */ + float Etot; /* total energy */ + float fr_bands[2 * NB_BANDS]; /* energy in frequency bands */ + float lf_E[2 * VOIC_BINS]; /* per bin spectrum energy in lf */ + float tmpN[NB_BANDS]; /* Temporary noise update */ + float tmpE[NB_BANDS]; /* Temporary averaged energy of 2 sf. */ + float tmpN_LR[CPE_CHANNELS][NB_BANDS]; /* Temporary noise update */ + float tmpE_LR[CPE_CHANNELS][NB_BANDS]; /* Temporary averaged energy of 2 sf. */ + float cor_map_sum_LR[CPE_CHANNELS]; /* speech/music clasif. parameter */ + float non_staX_LR; /* non-stationarity for sp/mus classifier */ + float ncharX_LR; /* noise character for sp/mus classifier */ + float sp_div_LR; /* spectral diversity feature */ + float S_map_LR[L_FFT / 2]; /* short-term correlation map */ + float corr_shiftL; /* correlation shift */ + float corr_shiftR; /* correlation shift */ + int16_t loc_harmLR[CPE_CHANNELS]; /* harmonicity flag */ + int16_t lr_vad_enabled; /* LR VAD indicator */ + float ee[2]; /* Spectral tilt */ + float corr_shift; /* correlation shift */ + float sp_div, PS[128]; /* speech/music clasif. parameters */ + int16_t L_look; /* length of look-ahead */ + float snr_sum_he; /* HE SAD parameters */ + float hp_E[2]; /* Energy in HF */ + int16_t flag_spitch; + int16_t high_lpn_flag; + float lsf_new[M]; + float band_energies[2 * NB_BANDS]; /* energy in critical bands without minimum noise floor E_MIN */ + int16_t localVAD_HE_SAD; + float non_staX; + float stab_fac; + int16_t alw_pitch_lag_12k8[2]; + float alw_voicing[2]; + int16_t last_core_orig; + float dummy; + float mem_decim_dummy[2 * L_FILT_MAX]; /* dummy decimation filter memory */ + float S_map[L_FFT / 2]; + int16_t i, lMemRecalc, lMemRecalc_12k8; + int16_t smc_dec; + float ncharX, dE1X; + Encoder_State *st; + float *signal_in; + int16_t element_mode; + int32_t input_Fs, last_element_brate; + int16_t *tdm_SM_last_clas, tmpS; + float *res_cod_SNR_M, tmpF[STEREO_DFT_BAND_MAX]; + STEREO_CLASSIF_HANDLE hStereoClassif; + float temp1F_icatdmResampBuf[L_FILT_MAX]; /* temp buffers for ICA TDM resamplers */ + int16_t old_pitch1; /* previous frame OL pitch[1] @12.8 kHz */ + int16_t LR_localVAD; + ivas_error error; + + push_wmops( "pre_proc_front" ); + + /*------------------------------------------------------------------* + * Initialization + *------------------------------------------------------------------*/ + + error = IVAS_ERR_OK; + + tmpS = 0; + tdm_SM_last_clas = &tmpS; + set_f( tmpF, 0, STEREO_DFT_BAND_MAX ); + res_cod_SNR_M = tmpF; + + LR_localVAD = 0; + + if ( hSCE != NULL ) + { + st = hSCE->hCoreCoder[n]; + signal_in = hSCE->hCoreCoder[n]->input; + element_mode = IVAS_SCE; + last_element_brate = hSCE->element_brate; /* hack - the past parameter is not really needed */ + hStereoClassif = NULL; + lr_vad_enabled = 0; + } + else /* CPE */ + { + st = hCPE->hCoreCoder[n]; + signal_in = hCPE->hCoreCoder[n]->input; + element_mode = hCPE->element_mode; + last_element_brate = hCPE->last_element_brate; + hStereoClassif = hCPE->hStereoClassif; + lr_vad_enabled = 0; + if ( hCPE->hFrontVad[0] != NULL && hCPE->element_mode != IVAS_CPE_MDCT ) + { + lr_vad_enabled = 1; + } + + if ( lr_vad_enabled && n == 0 ) + { + /* Combine localVAD and vad_flag from LR processing */ + LR_localVAD = hCPE->hCoreCoder[0]->localVAD || hCPE->hCoreCoder[1]->localVAD; + } + + if ( hCPE->hStereoTD != NULL ) + { + tdm_SM_last_clas = &hCPE->hStereoTD->tdm_SM_last_clas[n]; + mvs2s( hCPE->hStereoTD->tdm_SM_last_clas, hCPE->hStereoTD->tdm_SM_last2_clas, CPE_CHANNELS ); + } + + if ( hCPE->hStereoDft != NULL ) + { + res_cod_SNR_M = hCPE->hStereoDft->res_cod_SNR_M; + } + } + + lMemRecalc_12k8 = 0; + lMemRecalc = 0; + if ( element_mode == IVAS_CPE_TD || element_mode == IVAS_CPE_MDCT ) + { + lMemRecalc = NS2SA( st->input_Fs, L_MEM_RECALC_NS ); + lMemRecalc_12k8 = NS2SA( INT_FS_12k8, L_MEM_RECALC_NS ); + } + + input_Fs = st->input_Fs; + + localVAD_HE_SAD = 0; + snr_sum_he = 0; + + corr_shiftL = 0; + corr_shiftR = 0; + + if ( hSCE != NULL ) + { + *vad_hover_flag = 0; + } + st->sp_aud_decision1 = 0; + st->sp_aud_decision2 = 0; + st->coder_type = GENERIC; + if ( st->hGSCEnc != NULL ) + { + st->hGSCEnc->noise_lev = NOISE_LEVEL_SP0; + } + *attack_flag = 0; + + if ( st->Opt_SC_VBR ) + { + st->hSC_VBR->bump_up = 0; + st->hSC_VBR->ppp_mode = 0; + st->hSC_VBR->nelp_mode = 0; + st->hSC_VBR->avoid_HQ_VBR_NB = 0; + } + + L_look = L_LOOK_12k8; /* lookahead at 12.8kHz */ + + new_inp_12k8 = old_inp_12k8 + L_INP_MEM; /* pointer to new samples of the input signal in 12.8kHz core */ + inp_12k8 = new_inp_12k8 - L_look; /* pointer to the current frame of input signal in 12.8kHz core */ + + if ( element_mode != IVAS_CPE_DFT ) + { + new_inp_12k8 -= L_FILT; + } + + if ( element_mode == IVAS_CPE_DFT ) + { + mvr2r( st->old_inp_12k8, old_inp_12k8, L_INP_MEM - STEREO_DFT_OVL_12k8 ); + } + else if ( element_mode == IVAS_CPE_TD ) + { + mvr2r( st->old_inp_12k8, old_inp_12k8, L_INP_MEM - lMemRecalc_12k8 - L_FILT ); + } + else + { + mvr2r( st->old_inp_12k8, old_inp_12k8, L_INP_MEM - L_FILT ); + } + + mvr2r( st->old_wsp, old_wsp, L_WSP_MEM ); + wsp = old_wsp + L_WSP_MEM; /* pointer to the current frame of weighted signal in 12.8kHz core */ + + st->rf_mode = st->Opt_RF_ON; + + last_core_orig = st->last_core; + + /*--------------------------------------------------------------* + * energy analysis + *---------------------------------------------------------------*/ + + if ( element_mode == IVAS_SCE || ( element_mode == IVAS_CPE_MDCT && st->Opt_DTX_ON ) ) + { + analysisCldfbEncoder( st, signal_in, input_frame, realBuffer, imagBuffer, enerBuffer ); + } + else if ( ( element_mode == IVAS_CPE_TD && st->idchan == 0 ) || ( st->idchan == 1 && st->tdm_LRTD_flag ) ) + { + /* cldfb analysis only for pri. channel */ + analysisCldfbEncoder( st, signal_in - NS2SA( input_Fs, L_MEM_RECALC_TBE_NS ), input_frame, realBuffer, imagBuffer, enerBuffer ); + } + else if ( element_mode == IVAS_CPE_DFT ) + { + calculate_energy_buffer( hCPE, enerBuffer, st->cldfbAnaEnc->no_channels, input_Fs ); + } + else + { + set_f( enerBuffer, 0, CLDFB_NO_CHANNELS_MAX ); + } + + /*----------------------------------------------------------------* + * Change the sampling frequency to 12.8 kHz + * (if not available from downsampled DMX) + *----------------------------------------------------------------*/ + + if ( element_mode == IVAS_SCE ) + { + modify_Fs( signal_in, input_frame, input_Fs, new_inp_12k8, INT_FS_12k8, st->mem_decim, ( st->max_bwidth == NB ) ); + + mvr2r( st->mem_decim, mem_decim_dummy, 2 * L_FILT_MAX ); + set_f( temp1F_icatdmResampBuf, 0, L_FILT_MAX ); + modify_Fs( temp1F_icatdmResampBuf, NS2SA( st->input_Fs, DELAY_FIR_RESAMPL_NS ), input_Fs, new_inp_12k8 + L_FRAME, INT_FS_12k8, mem_decim_dummy, 0 ); + } + else if ( element_mode == IVAS_CPE_TD || element_mode == IVAS_CPE_MDCT ) + { + /* reconstruct past segment of the Secondary channel input signal when switching from DFT stereo */ + if ( hCPE->last_element_mode == IVAS_CPE_DFT && st->idchan == 1 ) + { + int16_t length_inp = NS2SA( input_Fs, L_MEM_RECALC_SCH_NS ); + int16_t length_12k8 = NS2SA( INT_FS_12k8, L_MEM_RECALC_SCH_NS ); + + modify_Fs( signal_in - lMemRecalc - length_inp, length_inp, input_Fs, new_inp_12k8 - lMemRecalc_12k8 - length_12k8, INT_FS_12k8, st->mem_decim, 0 ); + } + + modify_Fs( signal_in - lMemRecalc, input_frame, input_Fs, new_inp_12k8 - lMemRecalc_12k8, INT_FS_12k8, st->mem_decim, ( st->max_bwidth == NB ) ); + mvr2r( st->mem_decim, mem_decim_dummy, 2 * L_FILT_MAX ); + + if ( lMemRecalc > 0 ) + { + modify_Fs( signal_in + input_frame - lMemRecalc, lMemRecalc, input_Fs, new_inp_12k8 + L_FRAME - lMemRecalc_12k8, INT_FS_12k8, mem_decim_dummy, ( st->max_bwidth == NB ) ); + } + set_f( temp1F_icatdmResampBuf, 0, L_FILT_MAX ); + modify_Fs( temp1F_icatdmResampBuf, NS2SA( input_Fs, DELAY_FIR_RESAMPL_NS ), input_Fs, new_inp_12k8 + L_FRAME, INT_FS_12k8, mem_decim_dummy, 0 ); + } + else /* DFT stereo */ + { + /* update the FIR resampling filter memory, needed for switching to time-domain (FIR) resampling */ + mvr2r( signal_in + input_frame - NS2SA( input_Fs, L_MEM_RECALC_NS ) - 2 * NS2SA( input_Fs, DELAY_FIR_RESAMPL_NS ), st->mem_decim, 2 * NS2SA( input_Fs, DELAY_FIR_RESAMPL_NS ) ); + } + + /* save input resampled at 12.8kHz, non-preemhasised */ + if ( element_mode == IVAS_CPE_DFT ) + { + mvr2r( new_inp_12k8 - STEREO_DFT_OVL_12k8, st->buf_speech_enc + L_FRAME32k - STEREO_DFT_OVL_12k8, L_FRAME + STEREO_DFT_OVL_12k8 ); + } + else if ( element_mode == IVAS_CPE_TD || element_mode == IVAS_CPE_MDCT ) + { + mvr2r( new_inp_12k8 - lMemRecalc_12k8, st->buf_speech_enc + L_FRAME32k - lMemRecalc_12k8 - L_FILT, L_FRAME + lMemRecalc_12k8 + L_FILT ); + } + else + { + mvr2r( new_inp_12k8, st->buf_speech_enc + L_FRAME32k, L_FRAME ); + } + + /*------------------------------------------------------------------* + * Perform fixed preemphasis (12.8 kHz signal) through 1 - g*z^-1 + *-----------------------------------------------------------------*/ + + if ( element_mode == IVAS_CPE_DFT ) + { + mvr2r( new_inp_12k8 - STEREO_DFT_OVL_12k8 + L_FRAME, st->inp_12k8_mem_stereo_sw, STEREO_DFT_OVL_12k8 - L_MEM_RECALC_12K8 - L_FILT ); /* memory for TD/DFT stereo switching */ + + st->mem_preemph = st->mem_preemph_DFT; + st->mem_preemph_DFT = old_inp_12k8[L_INP_MEM - STEREO_DFT_OVL_12k8 + L_FRAME - 1]; + + preemph( new_inp_12k8 - STEREO_DFT_OVL_12k8, PREEMPH_FAC, L_FRAME, &st->mem_preemph ); + dummy = st->mem_preemph; + preemph( new_inp_12k8 - STEREO_DFT_OVL_12k8 + L_FRAME, PREEMPH_FAC, STEREO_DFT_OVL_12k8, &dummy ); + } + else if ( element_mode == IVAS_CPE_TD || element_mode == IVAS_CPE_MDCT ) + { + if ( st->idchan == 0 ) + { + if ( hCPE->last_element_mode == IVAS_CPE_DFT ) + { + st->mem_preemph = st->mem_preemph_DFT; + mvr2r( st->inp_12k8_mem_stereo_sw, new_inp_12k8 - L_MEM_RECALC_12K8 - ( STEREO_DFT_OVL_12k8 - L_MEM_RECALC_12K8 - L_FILT ), STEREO_DFT_OVL_12k8 - L_MEM_RECALC_12K8 - L_FILT ); + preemph( new_inp_12k8 - L_MEM_RECALC_12K8 - ( STEREO_DFT_OVL_12k8 - L_MEM_RECALC_12K8 - L_FILT ), PREEMPH_FAC, STEREO_DFT_OVL_12k8 - L_MEM_RECALC_12K8 - L_FILT, &st->mem_preemph ); + } + + st->mem_preemph_DFT = old_inp_12k8[L_INP_MEM - STEREO_DFT_OVL_12k8 + L_FRAME - 1]; /* == inp_12k8[L_FRAME-1] */ + } + + /* preemphasise past segment of the Secondary channel input signal when switching from DFT stereo */ + if ( hCPE->last_element_mode == IVAS_CPE_DFT && st->idchan == 1 ) + { + int16_t length_12k8 = NS2SA( INT_FS_12k8, L_MEM_RECALC_SCH_NS ); + preemph( new_inp_12k8 - lMemRecalc_12k8 - length_12k8, PREEMPH_FAC, length_12k8, &st->mem_preemph ); + } + + preemph( new_inp_12k8 - lMemRecalc_12k8, PREEMPH_FAC, L_FRAME, &st->mem_preemph ); + dummy = st->mem_preemph; + preemph( new_inp_12k8 - lMemRecalc_12k8 + L_FRAME, PREEMPH_FAC, lMemRecalc_12k8 + L_FILT, &dummy ); + } + else /* IVAS_SCE or IVAS_CPE_MDCT */ + { + preemph( new_inp_12k8, PREEMPH_FAC, L_FRAME, &st->mem_preemph ); + dummy = st->mem_preemph; + preemph( new_inp_12k8 + L_FRAME, PREEMPH_FAC, L_FILT, &dummy ); + } + + /*-------------------------------------------------------------------------* + * Spectral analysis + *--------------------------------------------------------------------------*/ + + analy_sp( element_mode, hCPE, input_Fs, inp_12k8, st->Bin_E, st->Bin_E_old, fr_bands, lf_E, &Etot, st->min_band, st->max_band, band_energies, PS, fft_buff ); + + if ( hStereoClassif != NULL ) + { + if ( st->lp_speech - Etot > 25 ) + { + hStereoClassif->silence_flag = 2; + } + else + { + hStereoClassif->silence_flag = hStereoClassif->silence_flag - 1; + } + hStereoClassif->silence_flag = max( 0, hStereoClassif->silence_flag ); + } + + /*----------------------------------------------------------------* + * SAD (1-signal, 0-noise) + *----------------------------------------------------------------*/ + + noise_est_pre( Etot, st->ini_frame, st->hNoiseEst, st->idchan, element_mode, hCPE != NULL ? hCPE->last_element_mode : element_mode ); + + if ( element_mode == IVAS_CPE_TD && ( ( abs( hCPE->hStereoTD->tdm_last_ratio_idx - tdm_ratio_idx ) > 5 && st->idchan == 1 ) || abs( hCPE->hStereoTD->tdm_last_inst_ratio_idx - hCPE->hStereoTD->tdm_inst_ratio_idx ) > 10 ) ) + { + st->ini_frame = 1; + } + + st->vad_flag = wb_vad( st, fr_bands, &i, &i, &i, &snr_sum_he, &localVAD_HE_SAD, &( st->flag_noisy_speech_snr ), NULL, NULL, -1000.0f, -1000.0f ); + + + if ( force_front_vad == 1 || front_vad_flag == 1 ) + { + /* overwrite VAD decision with front-VAD decision if external VAD is set to 1*/ + st->vad_flag = front_vad_flag; + st->localVAD = front_vad_flag; + } + if ( ( hCPE != NULL && !( lr_vad_enabled && st->idchan == 0 ) ) || hSCE != NULL ) + { + *vad_flag_dtx = dtx_hangover_addition( st, st->vad_flag, st->lp_speech - st->lp_noise, 0, vad_hover_flag, NULL, NULL, NULL ); + } + else + { + /* This only applies to st->idchan==0 now */ + /* Add down mix stereo activity to LR vad_flag_dtx */ + *vad_flag_dtx = *vad_flag_dtx || st->vad_flag; + + + /* Determine hangover flag status based on LR localVAD and downmix localVAD */ + *vad_hover_flag = *vad_flag_dtx && !( LR_localVAD || st->localVAD ); + } + + if ( force_front_vad == 1 || front_vad_dtx_flag == 1 ) + { + /* overwrite VAD decision with front-VAD decision if external VAD is set to 1*/ + *vad_flag_dtx = front_vad_dtx_flag; + } + + /*----------------------------------------------------------------* + * NB/WB/SWB/FB bandwidth detector + *----------------------------------------------------------------*/ + + if ( st->idchan == 0 && element_mode != IVAS_CPE_MDCT ) + { + bw_detect( st, st->input, NULL, enerBuffer, ivas_format, 0 ); + } + + if ( element_mode != IVAS_CPE_MDCT ) /* in MDCT stereo, set_bw_stereo() is used instead */ + { + set_bw( element_mode, element_brate, st, MODE1 ); + } + + /* set the BW of the TD secondary channel in LRTD mode same as BW of the primary channel (only at higher bitrates) */ + if ( st->idchan == 1 && element_mode == IVAS_CPE_TD && st->tdm_LRTD_flag == 1 && st->bits_frame_channel >= IVAS_16k4 / FRAMES_PER_SEC ) + { + st->bwidth = hCPE->hCoreCoder[0]->bwidth; + } + + /*----------------------------------------------------------------* + * Noise energy down-ward update and total noise energy estimation + * Long-term energies and relative frame energy updates + * Correlation correction as a function of total noise level + *----------------------------------------------------------------*/ + + noise_est_down( fr_bands, st->hNoiseEst->bckr, tmpN, tmpE, st->min_band, st->max_band, &st->hNoiseEst->totalNoise, Etot, &st->hNoiseEst->Etot_last, &st->hNoiseEst->Etot_v_h2 ); + + if ( lr_vad_enabled && st->idchan == 0 ) + { + noise_est_down( fr_bands_LR[0], hCPE->hFrontVad[0]->hNoiseEst->bckr, tmpN_LR[0], tmpE_LR[0], st->min_band, st->max_band, &hCPE->hFrontVad[0]->hNoiseEst->totalNoise, Etot_LR[0], &hCPE->hFrontVad[0]->hNoiseEst->Etot_last, &hCPE->hFrontVad[0]->hNoiseEst->Etot_v_h2 ); + noise_est_down( fr_bands_LR[1], hCPE->hFrontVad[1]->hNoiseEst->bckr, tmpN_LR[1], tmpE_LR[1], st->min_band, st->max_band, &hCPE->hFrontVad[1]->hNoiseEst->totalNoise, Etot_LR[1], &hCPE->hFrontVad[1]->hNoiseEst->Etot_last, &hCPE->hFrontVad[1]->hNoiseEst->Etot_v_h2 ); + corr_shiftL = correlation_shift( hCPE->hFrontVad[0]->hNoiseEst->totalNoise ); + corr_shiftR = correlation_shift( hCPE->hFrontVad[1]->hNoiseEst->totalNoise ); + } + + *relE = Etot - st->lp_speech; + + corr_shift = correlation_shift( st->hNoiseEst->totalNoise ); + + /*----------------------------------------------------------------* + * FD-CNG Noise Estimator + *----------------------------------------------------------------*/ + + if ( st->hFdCngEnc != NULL ) + { + resetFdCngEnc( st ); + + if ( st->idchan == 0 || element_mode == IVAS_CPE_MDCT ) + { + if ( element_mode == IVAS_CPE_TD && lr_vad_enabled && band_energies_LR != NULL ) + { + perform_noise_estimation_enc( band_energies_LR, enerBuffer, st->hFdCngEnc, input_Fs, hCPE ); + } + else + { + perform_noise_estimation_enc( band_energies, enerBuffer, st->hFdCngEnc, input_Fs, hCPE ); + } + } + } + + /*-----------------------------------------------------------------* + * Select SID or FRAME_NO_DATA frame if DTX enabled + *-----------------------------------------------------------------*/ + + if ( hCPE != NULL && element_mode != IVAS_CPE_DFT && element_mode != IVAS_CPE_MDCT ) + { + *vad_flag_dtx = 1; + } + + if ( st->Opt_DTX_ON == 1 && *vad_flag_dtx == 0 && element_mode == IVAS_CPE_DFT && element_brate <= ACELP_16k40 && hCPE->hStereoDft->hConfig->force_mono_transmission == 1 ) /* force LP_CNG usage for MASA DTX when mono tranmission */ + { + st->cng_type = LP_CNG; + } + + dtx( st, ivas_total_brate, *vad_flag_dtx, inp_12k8 ); + + if ( hCPE != NULL && hCPE->hStereoDft != NULL && st->core_brate == SID_2k40 ) + { + /* Add another period of expected xcorr updates */ + hCPE->hStereoDft->expectedNumUpdates += st->hDtxEnc->max_SID; + } + + /*----------------------------------------------------------------* + * Adjust FD-CNG Noise Estimator + *----------------------------------------------------------------*/ + + if ( st->hFdCngEnc != NULL && ( st->ini_frame == 0 || last_element_brate != element_brate || st->last_bwidth != st->bwidth ) ) + { + int32_t total_brate; + + total_brate = ( element_mode == IVAS_SCE ) ? st->total_brate : st->bits_frame_nominal * FRAMES_PER_SEC; + configureFdCngEnc( st->hFdCngEnc, max( st->input_bwidth, WB ), total_brate ); + if ( hCPE != NULL ) + { + st->hFdCngEnc->hFdCngCom->CngBitrate = hCPE->element_brate - 1; + } + } + + if ( st->hFdCngEnc != NULL && st->Opt_DTX_ON ) + { + AdjustFirstSID( st ); + } + + /*----------------------------------------------------------------* + * LP analysis + *----------------------------------------------------------------*/ + + alw_pitch_lag_12k8[0] = st->old_pitch_la; + alw_pitch_lag_12k8[1] = st->old_pitch_la; + alw_voicing[0] = st->voicing[2]; + alw_voicing[1] = st->voicing[2]; + + i = 0; + if ( element_mode == IVAS_CPE_TD && st->idchan == 1 && hCPE->hStereoTD->tdm_low_rate_mode == 1 ) + { + i = 1; + } + + analy_lp( inp_12k8, L_FRAME, L_look, ener, A, epsP, lsp_new, lsp_mid, st->lsp_old1, alw_pitch_lag_12k8, alw_voicing, INT_FS_12k8, i ); + + lsp2lsf( lsp_new, lsf_new, M, INT_FS_12k8 ); + stab_fac = lsf_stab( lsf_new, st->lsf_old1, 0, L_FRAME ); + mvr2r( lsf_new, st->lsf_old1, M ); + + if ( element_mode == IVAS_CPE_TD && st->idchan == 1 ) + { + /*----------------------------------------------------------------* + * Comparison of the LP coefficents to determine if it is possible + * to reuse the primary channel LP coefficients in the secondary channel + *----------------------------------------------------------------*/ + + hCPE->hStereoTD->tdm_lp_reuse_flag = tdm_lp_comparison( hCPE->hStereoTD, hCPE->hStereoClassif, st, inp_12k8, tdm_A_PCh, A, M, tdm_lsp_new_PCh, lsp_new, L_FRAME, element_brate - nb_bits_metadata * FRAMES_PER_SEC ); + } + + /*----------------------------------------------------------------* + * Compute weighted input (for OL pitch analysis) + * OL pitch analysis + * stable high pitch detection + * 1/4 pitch precision improvement + *----------------------------------------------------------------*/ + + find_wsp( L_FRAME, L_SUBFR, NB_SUBFR, A, Aw, inp_12k8, TILT_FAC, wsp, &st->mem_wsp, GAMMA1, L_look ); + + if ( st->vad_flag == 0 ) + { + /* reset the OL pitch tracker memories during inactive frames */ + pitch_ol_init( &st->old_thres, &st->old_pitch, &st->delta_pit, &st->old_corr ); + } + + old_pitch1 = st->pitch[1]; + + pitch_ol( st->pitch, st->voicing, &st->old_pitch, &st->old_corr, corr_shift, &st->old_thres, &st->delta_pit, st->old_wsp2, wsp, st->mem_decim2, *relE, L_look, st->clas, st->input_bwidth, st->Opt_SC_VBR ); + + /* Updates for adaptive lag window memory */ + st->old_pitch_la = st->pitch[2]; + + /* Detection of very short stable pitch period */ + StableHighPitchDetect( &flag_spitch, st->pitch, st->voicing, st->Bin_E, wsp, st->localVAD, &st->voicing_sm, &st->voicing0_sm, &st->LF_EnergyRatio_sm, &st->predecision_flag, &st->diff_sm, &st->energy_sm ); + + /* 1/4 pitch precision improvement */ + if ( element_brate <= IVAS_32k ) + { + pitch_ol2( PIT_MIN_EXTEND, st->pitch[0], &pitch_fr[0], &voicing_fr[0], 0, wsp, 7 ); + pitch_ol2( PIT_MIN_EXTEND, st->pitch[0], &pitch_fr[1], &voicing_fr[1], L_SUBFR, wsp, 7 ); + pitch_ol2( PIT_MIN_EXTEND, st->pitch[1], &pitch_fr[2], &voicing_fr[2], 2 * L_SUBFR, wsp, 7 ); + pitch_ol2( PIT_MIN_EXTEND, st->pitch[1], &pitch_fr[3], &voicing_fr[3], 3 * L_SUBFR, wsp, 7 ); + } + else + { + pitch_fr[0] = st->pitch[0]; + pitch_fr[1] = st->pitch[0]; + pitch_fr[2] = st->pitch[1]; + pitch_fr[3] = st->pitch[1]; + + voicing_fr[0] = st->voicing[0]; + voicing_fr[1] = st->voicing[0]; + voicing_fr[2] = st->voicing[1]; + voicing_fr[3] = st->voicing[1]; + } + + /*------------------------------------------------------------------* + * Update estimated noise energy and voicing cut-off frequency + *-----------------------------------------------------------------*/ + + noise_est( st, old_pitch1, tmpN, epsP, Etot, *relE, corr_shift, tmpE, fr_bands, cor_map_sum, &ncharX, &sp_div, + &non_staX, loc_harm, lf_E, &st->hNoiseEst->harm_cor_cnt, st->hNoiseEst->Etot_l_lp, &dummy /*sp_floor*/, S_map, hStereoClassif, NULL, st->ini_frame ); + + if ( lr_vad_enabled && st->idchan == 0 ) + { + /* Run noise_est for Left and Right channel */ + *loc_harmLR = *loc_harm; + noise_est( st, old_pitch1, tmpN_LR[0], epsP, Etot_LR[0], Etot_LR[0] - hCPE->hFrontVad[0]->lp_speech, corr_shiftL, tmpE_LR[0], fr_bands_LR[0], &cor_map_sum_LR[0], &ncharX_LR, &sp_div_LR, + &non_staX_LR, loc_harmLR, lf_E_LR[0], &hCPE->hFrontVad[0]->hNoiseEst->harm_cor_cnt, hCPE->hFrontVad[0]->hNoiseEst->Etot_l_lp, &dummy, S_map_LR, NULL, hCPE->hFrontVad[0], hCPE->hFrontVad[0]->ini_frame ); + + /* Note: the index [0] in the last argument is intended, the ini_frame counter is only maintained in the zero-th channel's VAD handle */ + noise_est( st, old_pitch1, tmpN_LR[1], epsP, Etot_LR[1], Etot_LR[1] - hCPE->hFrontVad[1]->lp_speech, corr_shiftR, tmpE_LR[1], fr_bands_LR[1], &cor_map_sum_LR[1], &ncharX_LR, &sp_div_LR, + &non_staX_LR, loc_harmLR, lf_E_LR[1], &hCPE->hFrontVad[1]->hNoiseEst->harm_cor_cnt, hCPE->hFrontVad[1]->hNoiseEst->Etot_l_lp, &dummy, S_map_LR, NULL, hCPE->hFrontVad[1], hCPE->hFrontVad[0]->ini_frame ); + } + + /*------------------------------------------------------------------* + * Update parameters used in the VAD and DTX + *-----------------------------------------------------------------*/ + + vad_param_updt( st, corr_shift, corr_shift, A, old_pitch1, NULL, 1 ); + + if ( lr_vad_enabled && st->idchan == 0 ) + { + vad_param_updt( st, corr_shiftL, corr_shiftR, A, old_pitch1, &hCPE->hFrontVad[0], CPE_CHANNELS ); + } + + /*-----------------------------------------------------------------* + * Find spectral tilt + * UC and VC frame selection + *-----------------------------------------------------------------*/ + + find_tilt( fr_bands, st->hNoiseEst->bckr, ee, st->pitch, st->voicing, lf_E, corr_shift, st->input_bwidth, st->max_band, hp_E, MODE1, &( st->bckr_tilt_lt ), st->Opt_SC_VBR ); + + st->coder_type = find_uv( st, pitch_fr, voicing_fr, inp_12k8, ee, &dE1X, corr_shift, *relE, Etot, hp_E, &flag_spitch, last_core_orig, hStereoClassif ); + + /*-----------------------------------------------------------------* + * channel aware mode configuration * + *-----------------------------------------------------------------*/ + + st->rf_mode = 0; + st->rf_target_bits_write = 0; + + /*-----------------------------------------------------------------* + * Signal classification for FEC + * TC frame selection + *-----------------------------------------------------------------*/ + + st->clas = signal_clas( st, inp_12k8, ee, *relE, L_look, tdm_SM_last_clas ); + + select_TC( MODE1, st->tc_cnt, &st->coder_type, st->localVAD ); + + if ( st->Opt_SC_VBR ) + { + st->hSC_VBR->Local_VAD = st->localVAD; + } + + /*-----------------------------------------------------------------* + * Collect stereo classifier features + *-----------------------------------------------------------------*/ + + if ( hStereoClassif != NULL ) + { + stereo_classifier_features( hStereoClassif, st->idchan, element_mode, localVAD_HE_SAD, lsf_new, epsP, st->pitch, st->voicing, *cor_map_sum, non_staX, sp_div, st->clas ); + } + + /*----------------------------------------------------------------* + * 1st stage speech/music classification (GMM model) + *----------------------------------------------------------------*/ + + smc_dec = ivas_smc_gmm( st, hStereoClassif, localVAD_HE_SAD, Etot, lsp_new, *cor_map_sum, epsP, PS, non_staX, *relE, &high_lpn_flag, flag_spitch ); + + + /*----------------------------------------------------------------* + * VAD energy updates + * Update of old per-band energy spectrum + *----------------------------------------------------------------*/ + + long_enr( st, Etot, localVAD_HE_SAD, high_lpn_flag, NULL, 1, NULL, NULL ); + + mvr2r( fr_bands + NB_BANDS, st->hNoiseEst->enrO, NB_BANDS ); + + if ( lr_vad_enabled && st->idchan == 0 ) + { + long_enr( st, -1, localVAD_HE_SAD, high_lpn_flag, hCPE->hFrontVad, CPE_CHANNELS, localVAD_HE_SAD_LR, Etot_LR ); + + mvr2r( fr_bands_LR[0] + NB_BANDS, hCPE->hFrontVad[0]->hNoiseEst->enrO, NB_BANDS ); + mvr2r( fr_bands_LR[1] + NB_BANDS, hCPE->hFrontVad[1]->hNoiseEst->enrO, NB_BANDS ); + } + + /*----------------------------------------------------------------* + * SNR-based speech/music classification + * AC frame selection + *----------------------------------------------------------------*/ + + st->GSC_IVAS_mode = 0; + if ( st->idchan == 1 && element_mode == IVAS_CPE_TD ) + { + /* No speech/music classification in the secondary channel of TD stereo */ + st->sp_aud_decision1 = 0; + st->sp_aud_decision2 = 0; + + st->GSC_noisy_speech = 0; + if ( st->hGSCEnc != NULL ) + { + st->hGSCEnc->noise_lev = NOISE_LEVEL_SP3; + } + } + else if ( element_mode != IVAS_CPE_MDCT ) + { + /* SNR-based speech/music classification */ + if ( ( element_mode >= IVAS_CPE_DFT && element_brate >= IVAS_24k4 ) || ( element_mode == IVAS_SCE && element_brate >= SCE_SMC_THR ) ) + { + if ( flag_16k_smc ) + { + /* Compute core-coder buffers at internal sampling rate */ + error = ivas_compute_core_buffers( st, NULL, old_inp_16k, NULL, input_frame, IVAS_SCE /*last_element_mode*/, INT_FS_16k /*sr_core_tmp*/, ener, A, Aw, epsP, lsp_new, lsp_mid ); + if ( error != IVAS_ERR_OK ) + { + return error; + } + + smc_dec = ivas_acelp_tcx20_switching( st, st->speech_enc, st->wspeech_enc, non_staX, pitch_fr, voicing_fr, currFlatness, lsp_mid, stab_fac, res_cod_SNR_M, flag_16k_smc ); + } + else + { + smc_dec = ivas_acelp_tcx20_switching( st, inp_12k8, wsp, non_staX, pitch_fr, voicing_fr, currFlatness, lsp_mid, stab_fac, res_cod_SNR_M, flag_16k_smc ); + } + } + /* Switch to ACELP for non-harmonic transient signals */ + else if ( ( ( element_mode >= IVAS_CPE_DFT && element_brate <= IVAS_16k4 ) || ( element_mode == IVAS_SCE && element_brate < SCE_SMC_THR ) ) && ( loc_harm[0] != 1 ) && smc_dec == MUSIC ) + { + if ( element_mode == IVAS_SCE ) + { + if ( transient_analysis( st->hTranDet, st->hNoiseEst->cor_map, st->hNoiseEst->multi_harm_limit ) ) + { + smc_dec = SPEECH; + } + } + else if ( element_mode == IVAS_CPE_DFT ) + { + for ( i = 0; i < CPE_CHANNELS; i++ ) + { + if ( smc_dec != SPEECH && transient_analysis( hCPE->hCoreCoder[i]->hTranDet, st->hNoiseEst->cor_map, st->hNoiseEst->multi_harm_limit ) ) + { + smc_dec = SPEECH; /* overwrite initial music decision, initial SPEECH_MUSIC never changed */ + } + } + } + } + + /* 2nd stage speech/music classification (ACELP/GSC/TCX core selection) */ + ivas_smc_mode_selection( st, element_brate, smc_dec, *relE, Etot, attack_flag, inp_12k8, S_map, flag_spitch ); + } + + /*----------------------------------------------------------------* + * Final VAD correction (when HE-SAD is used instead of the normal VAD, + * rewrite the VAD flag by VAD flag with DTX hangover for further processing) + *----------------------------------------------------------------*/ + + if ( st->Opt_DTX_ON && element_mode != IVAS_CPE_DFT ) + { + st->vad_flag = *vad_flag_dtx; + } + + /*-----------------------------------------------------------------* + * Update old input signal buffer + *-----------------------------------------------------------------*/ + + mvr2r( &old_inp_12k8[L_FRAME], st->old_inp_12k8, L_INP_MEM ); + + pop_wmops(); + return error; +} + + +/*-------------------------------------------------------------------* + * calculate_energy_buffer() + * + * calculate DFT-based energies + *--------------------------------------------------------------------*/ + +static void calculate_energy_buffer( + CPE_ENC_HANDLE hCPE, /* i : CPE encoder structure */ + float enerBuffer_dft[], /* o : energy buffer */ + const int16_t no_channels, /* i : no. of used CLDFB channels */ + const int32_t input_Fs /* i : input sampling rate */ +) +{ + int16_t i, j; + float *pDFT_DMX, *p_nrg_DMX; + float nrg_DMX[CLDFB_NO_CHANNELS_MAX]; + float band_res_dft, chan_width_f, chan_width_bins; + int16_t start, stop; + + band_res_dft = ( (float) input_Fs ) / hCPE->hStereoDft->NFFT; + chan_width_f = 24000.f / CLDFB_NO_CHANNELS_MAX; + chan_width_bins = chan_width_f / band_res_dft; + + set_f( nrg_DMX, 0, CLDFB_NO_CHANNELS_MAX ); + + pDFT_DMX = hCPE->hStereoDft->DFT[0]; + start = 1; + p_nrg_DMX = nrg_DMX; + + *p_nrg_DMX += (float) ( pDFT_DMX[0] * pDFT_DMX[0] ); + for ( i = 0; i < no_channels; i++ ) + { + stop = (int16_t) ( ( i + 1 ) * chan_width_bins + 0.5f ); + for ( j = start; j < stop; j++ ) + { + *p_nrg_DMX += (float) ( pDFT_DMX[2 * j] * pDFT_DMX[2 * j] + pDFT_DMX[2 * j + 1] * pDFT_DMX[2 * j + 1] ); + } + start = stop; + p_nrg_DMX++; + } + + for ( i = 0; i < no_channels; i++ ) /* Consider only used channels, dependent on Fs */ + { + enerBuffer_dft[i] = nrg_DMX[i] / 3; + } + + /* Set remaining entries of enerBuffer to zero */ + for ( ; i < CLDFB_NO_CHANNELS_MAX; i++ ) + { + enerBuffer_dft[i] = 0.f; + } + + return; +} diff --git a/lib_enc/ivas_corecoder_enc_reconfig.c b/lib_enc/ivas_corecoder_enc_reconfig.c new file mode 100644 index 0000000000000000000000000000000000000000..bb79c0bd92c65b7a826453a78550a87f8a6b1d2e --- /dev/null +++ b/lib_enc/ivas_corecoder_enc_reconfig.c @@ -0,0 +1,491 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "ivas_cnst.h" +#include "prot.h" +#include "ivas_prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * ivas_corecoder_enc_reconfig() + * + * Allocate, initialize, and configure SCE/CPE/MCT handles in case of bitrate switching + *-------------------------------------------------------------------*/ + +ivas_error ivas_corecoder_enc_reconfig( + Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ + const int16_t nSCE_old, /* i : number of SCEs in previous frame */ + const int16_t nCPE_old, /* i : number of CPEs in previous frame */ + const int16_t nchan_transport_old, /* i : number of TCs in previous frame */ + const int32_t brate_SCE, /* i : bitrate to be set for the SCEs */ + const int32_t brate_CPE, /* i : bitrate to be set for the CPEs */ + const MC_MODE last_mc_mode /* i : switching between MC modes: last mode */ +) +{ + int16_t n, sce_id, cpe_id; + int16_t len_inp_memory, n_CoreCoder_existing, nSCE_existing, nCPE_existing; + float input_buff[MCT_MAX_BLOCKS][L_FRAME48k + NS2SA( 48000, IVAS_FB_ENC_DELAY_NS )]; + BSTR_ENC_HANDLE hBstr; + int16_t i, nb_bits; + Indice temp_ind_list[MAX_NUM_IND_TEMP_LIST]; + int16_t nb_bits_tot; + int16_t nchan_transport_real, nchan_transport_old_real; + ENCODER_CONFIG_HANDLE hEncoderConfig; + ivas_error error; + + /*-----------------------------------------------------------------* + * Initialization + *-----------------------------------------------------------------*/ + + hEncoderConfig = st_ivas->hEncoderConfig; + error = IVAS_ERR_OK; + + len_inp_memory = (int16_t) ( hEncoderConfig->input_Fs / FRAMES_PER_SEC ); + if ( hEncoderConfig->ivas_format == SBA_FORMAT ) + { + len_inp_memory += NS2SA( hEncoderConfig->input_Fs, IVAS_FB_ENC_DELAY_NS ); + } + + nchan_transport_old_real = nchan_transport_old; + nchan_transport_real = st_ivas->nchan_transport; + + if ( st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + { + nchan_transport_real += st_ivas->hEncoderConfig->nchan_ism; + } + + /*-----------------------------------------------------------------* + * Switching between SCE(s)/CPE(s)/MCT + *-----------------------------------------------------------------*/ + + if ( nchan_transport_real == nchan_transport_old_real && st_ivas->nSCE == nSCE_old && st_ivas->nCPE == nCPE_old ) /* in McMASA, nchan_transport may be the same, but nSCE/nCPE differs */ + { + for ( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) + { + copy_encoder_config( st_ivas, st_ivas->hSCE[sce_id]->hCoreCoder[0], 0 ); + st_ivas->hSCE[sce_id]->element_brate = brate_SCE; + st_ivas->hSCE[sce_id]->hCoreCoder[0]->total_brate = st_ivas->hSCE[sce_id]->element_brate; /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */ + } + + for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) + { + st_ivas->hCPE[cpe_id]->element_brate = brate_CPE; + + /* prepare bitstream buffers */ + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + copy_encoder_config( st_ivas, st_ivas->hCPE[cpe_id]->hCoreCoder[n], 0 ); + + st_ivas->hCPE[cpe_id]->hCoreCoder[n]->total_brate = st_ivas->hCPE[cpe_id]->element_brate / ( st_ivas->nCPE > 1 ? 1 : CPE_CHANNELS ); /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */ + } + } + + if ( st_ivas->nCPE > 1 ) + { + if ( ( error = mct_enc_reconfigure( st_ivas, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + else + { + + /* in SCE+CPE McMASA nchan_transport is still 2, fix the numbers */ + if ( hEncoderConfig->ivas_format == MC_FORMAT && last_mc_mode == MC_MODE_MCMASA ) + { + nchan_transport_old_real = nSCE_old + CPE_CHANNELS * nCPE_old; + } + + if ( hEncoderConfig->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCMASA ) + { + nchan_transport_real = st_ivas->nSCE + CPE_CHANNELS * st_ivas->nCPE; + } + + /* something in transport changes */ + hBstr = NULL; + + /* get the index list pointers */ + if ( nSCE_old ) + { + hBstr = st_ivas->hSCE[0]->hCoreCoder[0]->hBstr; + } + else if ( nCPE_old ) + { + hBstr = st_ivas->hCPE[0]->hCoreCoder[0]->hBstr; + } + + /* save bitstream information */ + nb_bits_tot = hBstr->nb_bits_tot; + i = 0; + nb_bits = 0; + while ( nb_bits < nb_bits_tot && i < MAX_NUM_IND_TEMP_LIST ) + { + if ( hBstr->ind_list[i].nb_bits > 0 ) + { + temp_ind_list[i].id = hBstr->ind_list[i].id; + temp_ind_list[i].value = hBstr->ind_list[i].value; + temp_ind_list[i].nb_bits = hBstr->ind_list[i].nb_bits; + hBstr->ind_list[i].nb_bits = -1; + } + + hBstr->nb_bits_tot = 0; + hBstr->nb_ind_tot = 0; + + nb_bits += temp_ind_list[i].nb_bits; + i++; + } + + for ( ; i < MAX_NUM_IND_TEMP_LIST; i++ ) + { + /* reset nb_bits of all other indices to -1 */ + temp_ind_list[i].nb_bits = -1; + } + + + if ( hEncoderConfig->ivas_format == MC_FORMAT && last_mc_mode == MC_MODE_MCMASA && st_ivas->mc_mode == MC_MODE_MCMASA ) + { + /* within McMASA we can modify the transport signals when switching */ + /* copy earlier dmx buffers */ + if ( nSCE_old > 0 ) + { + set_zero( input_buff[0], len_inp_memory ); + mvr2r( st_ivas->hSCE[0]->hCoreCoder[0]->input_buff, input_buff[0], len_inp_memory ); + } + + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + set_zero( input_buff[n + 1], len_inp_memory ); + if ( nCPE_old > 0 ) + { + mvr2r( st_ivas->hCPE[0]->hCoreCoder[n]->input_buff, input_buff[n + 1], len_inp_memory ); + } + } + + ivas_mcmasa_dmx_modify( len_inp_memory, input_buff, nSCE_old + CPE_CHANNELS * nCPE_old, st_ivas->nSCE + CPE_CHANNELS * st_ivas->nCPE ); + + n_CoreCoder_existing = 0; + } + else + { + n_CoreCoder_existing = min( nchan_transport_real, nchan_transport_old_real ); + } + + /* destroy superfluous core-coder elements */ + for ( sce_id = st_ivas->nSCE; sce_id < nSCE_old; sce_id++ ) + { + /* save input audio buffers */ + if ( n_CoreCoder_existing > sce_id ) + { + mvr2r( st_ivas->hSCE[sce_id]->hCoreCoder[0]->input_buff, input_buff[sce_id], len_inp_memory ); + } + + destroy_sce_enc( st_ivas->hSCE[sce_id] ); + st_ivas->hSCE[sce_id] = NULL; + } + + for ( cpe_id = st_ivas->nCPE; cpe_id < nCPE_old; cpe_id++ ) + { + /* save input audio buffers */ + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + if ( n_CoreCoder_existing > cpe_id * CPE_CHANNELS + n ) + { + mvr2r( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->input_buff, input_buff[( cpe_id - st_ivas->nCPE ) * CPE_CHANNELS + n], len_inp_memory ); + } + } + + destroy_cpe_enc( st_ivas->hCPE[cpe_id] ); + st_ivas->hCPE[cpe_id] = NULL; + } + + if ( st_ivas->nCPE <= 1 && st_ivas->hMCT != NULL ) + { + ivas_mct_enc_close( &( st_ivas->hMCT ) ); + } + + /* special case, if we have MCT now and had a single CPE before, remove the MDCT Stereo handles */ + if ( st_ivas->nCPE > 1 && nCPE_old == 1 ) + { + free( st_ivas->hCPE[0]->hStereoMdct ); + st_ivas->hCPE[0]->hStereoMdct = NULL; + } + + /* create missing core coder elements and set element bitrates for already existing ones */ + if ( st_ivas->nSCE > 0 ) + { + nSCE_existing = min( nSCE_old, st_ivas->nSCE ); + + for ( sce_id = 0; sce_id < nSCE_existing; sce_id++ ) + { + copy_encoder_config( st_ivas, st_ivas->hSCE[sce_id]->hCoreCoder[0], 0 ); + st_ivas->hSCE[sce_id]->element_brate = brate_SCE; + st_ivas->hSCE[sce_id]->hCoreCoder[0]->total_brate = st_ivas->hSCE[sce_id]->element_brate; /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */ + + ivas_destroy_MD_bstr_enc( &( st_ivas->hSCE[sce_id]->hMetaData ) ); + } + + for ( sce_id = nSCE_existing; sce_id < st_ivas->nSCE; sce_id++ ) + { + if ( ( error = create_sce_enc( st_ivas, sce_id, brate_SCE ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* propagate input audio buffers */ + if ( n_CoreCoder_existing > sce_id && hEncoderConfig->ivas_format != MASA_ISM_FORMAT ) + { + mvr2r( input_buff[sce_id], st_ivas->hSCE[sce_id]->hCoreCoder[0]->input_buff, len_inp_memory ); + } + + /* only reset indices if it is not the first index list, this already contains the IVAS format bits */ + if ( sce_id > 0 || hEncoderConfig->ivas_format == MASA_ISM_FORMAT ) + { + reset_indices_enc( st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr, st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->nb_ind_tot ); + } + } + + if ( st_ivas->hSCE[st_ivas->nSCE - 1]->hMetaData == NULL ) + { + if ( ( error = ivas_initialize_MD_bstr_enc( &( st_ivas->hSCE[st_ivas->nSCE - 1]->hMetaData ), st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + + if ( st_ivas->nCPE > 0 ) + { + nCPE_existing = min( nCPE_old, st_ivas->nCPE ); + + for ( cpe_id = 0; cpe_id < nCPE_existing; cpe_id++ ) + { + st_ivas->hCPE[cpe_id]->element_brate = brate_CPE; + + /* allocate buffer of indices */ + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + copy_encoder_config( st_ivas, st_ivas->hCPE[cpe_id]->hCoreCoder[n], 0 ); + st_ivas->hCPE[cpe_id]->hCoreCoder[n]->total_brate = st_ivas->hCPE[cpe_id]->element_brate / ( st_ivas->nCPE > 1 ? 1 : CPE_CHANNELS ); /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */ + + if ( ( cpe_id * CPE_CHANNELS + n > 0 ) || + ( st_ivas->mc_mode == MC_MODE_MCMASA && st_ivas->nSCE > 0 ) || + ( hEncoderConfig->ivas_format == MASA_ISM_FORMAT && st_ivas->nSCE > 0 ) ) + { + reset_indices_enc( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr, st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->nb_ind_tot ); + } + } + } + + for ( cpe_id = nCPE_existing; cpe_id < st_ivas->nCPE; cpe_id++ ) + { + if ( st_ivas->mc_mode == MC_MODE_MCMASA && st_ivas->hMcMasa->separateChannelEnabled ) + { + st_ivas->hEncoderConfig->element_mode_init = IVAS_CPE_MDCT; + } + + if ( ( error = create_cpe_enc( st_ivas, cpe_id, brate_CPE ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* propagate input audio buffers */ + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + if ( n_CoreCoder_existing > cpe_id * CPE_CHANNELS + n ) + { + mvr2r( input_buff[n], st_ivas->hCPE[cpe_id]->hCoreCoder[n]->input_buff, len_inp_memory ); + } + } + + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + /* only reset indices if it is not the first index list, this already contains the IVAS format bits */ + if ( cpe_id * CPE_CHANNELS + n > 0 || ( st_ivas->mc_mode == MC_MODE_MCMASA && st_ivas->nSCE > 0 ) ) + { + reset_indices_enc( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr, st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->nb_ind_tot ); + } + + if ( hEncoderConfig->Opt_DTX_ON ) + { + st_ivas->hCPE[cpe_id]->hCoreCoder[n]->cng_sba_flag = 1; + } + } + } + } + + /* restore bitstream - IVAS format bits should be written in the first core channel of the first SCE/CPE */ + i = 0; + nb_bits = 0; + if ( st_ivas->nSCE > 0 ) + { + while ( nb_bits < nb_bits_tot && i < MAX_NUM_IND_TEMP_LIST ) + { + if ( temp_ind_list[i].nb_bits > 0 ) + { + st_ivas->hSCE[0]->hCoreCoder[0]->hBstr->ind_list[i].id = temp_ind_list[i].id; + st_ivas->hSCE[0]->hCoreCoder[0]->hBstr->ind_list[i].value = temp_ind_list[i].value; + st_ivas->hSCE[0]->hCoreCoder[0]->hBstr->ind_list[i].nb_bits = temp_ind_list[i].nb_bits; + } + + nb_bits += temp_ind_list[i].nb_bits; + i++; + } + st_ivas->hSCE[0]->hCoreCoder[0]->hBstr->nb_ind_tot = i; + st_ivas->hSCE[0]->hCoreCoder[0]->hBstr->nb_bits_tot = nb_bits_tot; + } + else if ( st_ivas->nCPE > 0 ) + { + while ( nb_bits < nb_bits_tot && i < MAX_NUM_IND_TEMP_LIST ) + { + if ( temp_ind_list[i].nb_bits > 0 ) + { + st_ivas->hCPE[0]->hCoreCoder[0]->hBstr->ind_list[i].id = temp_ind_list[i].id; + st_ivas->hCPE[0]->hCoreCoder[0]->hBstr->ind_list[i].value = temp_ind_list[i].value; + st_ivas->hCPE[0]->hCoreCoder[0]->hBstr->ind_list[i].nb_bits = temp_ind_list[i].nb_bits; + } + + nb_bits += temp_ind_list[i].nb_bits; + i++; + } + st_ivas->hCPE[0]->hCoreCoder[0]->hBstr->nb_ind_tot = i; + st_ivas->hCPE[0]->hCoreCoder[0]->hBstr->nb_bits_tot = nb_bits_tot; + } + + + + if ( last_mc_mode == MC_MODE_MCMASA && st_ivas->mc_mode == MC_MODE_MCMASA ) + { + /* restore modified transport signal */ + if ( st_ivas->nSCE ) + { + mvr2r( input_buff[0], st_ivas->hSCE[0]->hCoreCoder[0]->input_buff, len_inp_memory ); + } + + if ( st_ivas->nCPE ) + { + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + mvr2r( input_buff[n + 1], st_ivas->hCPE[0]->hCoreCoder[n]->input_buff, len_inp_memory ); + } + } + } + + if ( st_ivas->nCPE > 1 && nCPE_old <= 1 ) + { + if ( nCPE_old == 1 ) + { + /* set correct nominal bitrates and igf config already here, needed for the correct init of the MDCT Stereo handles for MCT */ + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + st_ivas->hCPE[0]->hCoreCoder[n]->total_brate = st_ivas->hCPE[0]->element_brate; + st_ivas->hCPE[0]->hCoreCoder[n]->bits_frame_nominal = (int16_t) ( st_ivas->hCPE[0]->element_brate / FRAMES_PER_SEC ); + st_ivas->hCPE[0]->hCoreCoder[n]->igf = getIgfPresent( st_ivas->hCPE[0]->hCoreCoder[n]->element_mode, + st_ivas->hCPE[0]->hCoreCoder[n]->bits_frame_nominal * FRAMES_PER_SEC, + st_ivas->hCPE[0]->hCoreCoder[n]->bwidth, + st_ivas->hCPE[0]->hCoreCoder[n]->rf_mode ); + + if ( ( error = IGF_Reconfig( &st_ivas->hCPE[0]->hCoreCoder[n]->hIGFEnc, st_ivas->hCPE[0]->hCoreCoder[n]->igf, 1, st_ivas->hCPE[0]->element_brate, st_ivas->hCPE[0]->hCoreCoder[n]->bwidth, st_ivas->hCPE[0]->hCoreCoder[n]->element_mode, st_ivas->hCPE[0]->hCoreCoder[n]->rf_mode ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + + if ( ( error = create_mct_enc( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->hMCT != NULL && st_ivas->nCPE > 1 ) + { + if ( ( error = mct_enc_reconfigure( st_ivas, st_ivas->nchan_transport != nchan_transport_old ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* alllocate buffer for metadata indices */ + if ( st_ivas->nCPE > 0 ) + { + if ( st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData == NULL ) + { + if ( ( error = ivas_initialize_MD_bstr_enc( &( st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData ), st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + reset_indices_enc( st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData, st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData->nb_ind_tot ); + + for ( cpe_id = 0; cpe_id < st_ivas->nCPE - 1; cpe_id++ ) + { + ivas_destroy_MD_bstr_enc( &( st_ivas->hCPE[cpe_id]->hMetaData ) ); + } + } + + /* special case, if we have a single CPE and had MCT before we need to init the MDCT stereo handles here */ + if ( st_ivas->nCPE == 1 && nCPE_old > 1 ) + { + if ( ( st_ivas->hCPE[st_ivas->nCPE - 1]->hStereoMdct = (STEREO_MDCT_ENC_DATA_HANDLE) malloc( sizeof( STEREO_MDCT_ENC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MDCT Stereo \n" ) ); + } + + /* set correct nominal bitrates and igf config already here, needed for the correct init of the MDCT Stereo handle */ + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + st_ivas->hCPE[0]->hCoreCoder[n]->total_brate = st_ivas->hCPE[0]->element_brate; + st_ivas->hCPE[0]->hCoreCoder[n]->bits_frame_nominal = (int16_t) ( st_ivas->hCPE[0]->element_brate / FRAMES_PER_SEC ); + st_ivas->hCPE[0]->hCoreCoder[n]->igf = getIgfPresent( st_ivas->hCPE[0]->hCoreCoder[n]->element_mode, + st_ivas->hCPE[0]->hCoreCoder[n]->bits_frame_nominal * FRAMES_PER_SEC, + st_ivas->hCPE[0]->hCoreCoder[n]->bwidth, + st_ivas->hCPE[0]->hCoreCoder[n]->rf_mode ); + + if ( ( error = IGF_Reconfig( &st_ivas->hCPE[0]->hCoreCoder[n]->hIGFEnc, st_ivas->hCPE[0]->hCoreCoder[n]->igf, 1, st_ivas->hCPE[0]->element_brate, st_ivas->hCPE[0]->hCoreCoder[n]->bwidth, st_ivas->hCPE[0]->hCoreCoder[n]->element_mode, st_ivas->hCPE[0]->hCoreCoder[n]->rf_mode ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* reset mct_chan_mode */ + st_ivas->hCPE[0]->hCoreCoder[n]->mct_chan_mode = MCT_CHAN_MODE_REGULAR; + } + + initMdctStereoEncData( st_ivas->hCPE[st_ivas->nCPE - 1]->hStereoMdct, hEncoderConfig->ivas_format, st_ivas->hCPE[st_ivas->nCPE - 1]->element_mode, st_ivas->hCPE[st_ivas->nCPE - 1]->element_brate, hEncoderConfig->max_bwidth, 0, NULL, 1 ); + st_ivas->hCPE[st_ivas->nCPE - 1]->hStereoMdct->isSBAStereoMode = ( ( hEncoderConfig->ivas_format == SBA_FORMAT || hEncoderConfig->ivas_format == SBA_ISM_FORMAT ) && ( st_ivas->nchan_transport == 2 ) ); + } + } + + return error; +} diff --git a/lib_enc/ivas_cpe_enc.c b/lib_enc/ivas_cpe_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..e56b45c3b901ec3847f66301f20d850eeeb99f1d --- /dev/null +++ b/lib_enc/ivas_cpe_enc.c @@ -0,0 +1,1125 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include "options.h" +#include "cnst.h" +#include "ivas_cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_rom_com.h" +#include "wmc_auto.h" + + +/*--------------------------------------------------------------------------* + * Local function prototypes + *--------------------------------------------------------------------------*/ + +static void stereo_mode_combined_format_enc( const Encoder_Struct *st_ivas, CPE_ENC_HANDLE hCPE ); + + +/*-------------------------------------------------------------------* + * ivas_cpe_enc() + * + * Channel Pair Element (CPE) encoding routine + *-------------------------------------------------------------------*/ + +ivas_error ivas_cpe_enc( + Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ + const int16_t cpe_id, /* i : CPE # identifier */ + const float data_f_ch0[], /* i : input signal for channel 0 */ + const float data_f_ch1[], /* i : input signal for channel 1 */ + const int16_t input_frame, /* i : input frame length per channel */ + const int16_t nb_bits_metadata /* i : number of metadata bits */ +) +{ + CPE_ENC_HANDLE hCPE; + Encoder_State **sts; + int16_t n, n_CoreChannels; + float old_inp_12k8[CPE_CHANNELS][L_INP_12k8]; /* buffer of input signal @ 12k8 */ + float old_inp_16k[CPE_CHANNELS][L_INP]; /* buffer of input signal @ 16kHz */ + float ener[CPE_CHANNELS]; /* residual energy from Levinson-Durbin */ + float relE[CPE_CHANNELS]; /* frame relative energy */ + float A[CPE_CHANNELS][NB_SUBFR16k * ( M + 1 )]; /* A(z) unquantized for subframes */ + float Aw[CPE_CHANNELS][NB_SUBFR16k * ( M + 1 )]; /* weighted A(z) unquantized for subframes */ + float epsP[CPE_CHANNELS][M + 1]; /* LP prediction errors */ + float lsp_new[CPE_CHANNELS][M]; /* LSPs at the end of the frame */ + float lsp_mid[CPE_CHANNELS][M]; /* ISPs in the middle of the frame */ + int16_t vad_hover_flag[CPE_CHANNELS]; /* VAD hangover flag */ + int16_t attack_flag[CPE_CHANNELS]; /* attack flag (GSC or TC) */ + float realBuffer[CPE_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; /* real buffer */ + float imagBuffer[CPE_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; /* imag buffer */ + float old_wsp[CPE_CHANNELS][L_WSP]; /* old weighted input signal */ + float pitch_fr[CPE_CHANNELS][NB_SUBFR]; /* fractional pitch values */ + float voicing_fr[CPE_CHANNELS][NB_SUBFR]; /* fractional pitch gains */ + int16_t loc_harm[CPE_CHANNELS]; /* harmonicity flag */ + float cor_map_sum[CPE_CHANNELS]; /* speech/music clasif. parameter */ + int16_t vad_flag_dtx[CPE_CHANNELS]; /* HE-SAD flag with additional DTX HO */ + float enerBuffer[CPE_CHANNELS][CLDFB_NO_CHANNELS_MAX]; /* energy buffer */ + float currFlatness[CPE_CHANNELS]; /* flatness parameter */ + float fft_buff[CPE_CHANNELS][2 * L_FFT]; /* FFT buffer */ + int16_t tdm_ratio_idx, tdm_ratio_idx_SM; /* temp. TD stereo parameters */ + int16_t tdm_SM_or_LRTD_Pri; /* temp. TD stereo parameters */ + float tdm_last_ratio; /* temp. TD stereo parameters */ + int16_t nb_bits; /* number of DFT stereo side bits */ + float fr_bands[CPE_CHANNELS][2 * NB_BANDS]; /* energy in frequency bands */ + float Etot_LR[CPE_CHANNELS]; /* total energy */ + float lf_E[CPE_CHANNELS][2 * VOIC_BINS]; /* per bin spectrum energy in lf */ + int16_t localVAD_HE_SAD[CPE_CHANNELS]; /* HE-SAD flag without hangover, LR channels */ + float band_energies_LR[2 * NB_BANDS]; /* energy in critical bands without minimum noise floor E_MIN */ + float orig_input[CPE_CHANNELS][L_FRAME48k]; + float Etot_last[CPE_CHANNELS]; + int32_t tmp, input_Fs; + int16_t max_bwidth, ivas_format; + ENCODER_CONFIG_HANDLE hEncoderConfig; + int32_t ivas_total_brate; + ivas_error error; + int32_t cpe_brate; + int32_t element_brate_ref; +#ifdef NONBE_FIX_838_CRASH_24_4_WB + int16_t last_bits_frame_nominal; /* last_bits_frame_nominal for M or PCh channel */ +#endif + + error = IVAS_ERR_OK; + + push_wmops( "ivas_cpe_enc" ); + + hCPE = st_ivas->hCPE[cpe_id]; + sts = hCPE->hCoreCoder; + hEncoderConfig = st_ivas->hEncoderConfig; + max_bwidth = hEncoderConfig->max_bwidth; + ivas_format = hEncoderConfig->ivas_format; + input_Fs = hEncoderConfig->input_Fs; + ivas_total_brate = hEncoderConfig->ivas_total_brate; + element_brate_ref = hCPE->element_brate; +#ifdef NONBE_FIX_838_CRASH_24_4_WB + last_bits_frame_nominal = sts[0]->bits_frame_nominal; +#endif + + /*------------------------------------------------------------------* + * Initialization - general + *-----------------------------------------------------------------*/ + + tdm_SM_or_LRTD_Pri = 0; + tdm_ratio_idx = -1; + tdm_ratio_idx_SM = -1; + tdm_last_ratio = 0; + + + /*------------------------------------------------------------------* + * CPE initialization - core coder + *-----------------------------------------------------------------*/ + + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + sts[n]->idchan = n; + sts[n]->core = -1; + sts[n]->core_brate = -1; /* updated in dtx() */ + sts[n]->max_bwidth = max_bwidth; + if ( st_ivas->hMCT == NULL ) /*already updated before CPE call*/ + { + sts[n]->input_bwidth = sts[n]->last_input_bwidth; /* updated in BWD */ + sts[n]->bwidth = sts[n]->last_bwidth; /* updated in BWD */ + } + sts[n]->rate_switching_reset = 0; + } + + mvr2r( data_f_ch0, sts[0]->input, input_frame ); + if ( data_f_ch1 != NULL ) /*this may happen for cases with odd number of channels*/ + { + mvr2r( data_f_ch1, sts[1]->input, input_frame ); + } + + /*----------------------------------------------------------------* + * Stereo technology selection + * Front-VAD on input L and R channels + *----------------------------------------------------------------*/ + + if ( sts[0]->ini_frame > 0 && st_ivas->hMCT == NULL ) + { + hCPE->element_mode = select_stereo_mode( hCPE, ivas_format, ivas_total_brate ); + } + + stereo_mode_combined_format_enc( st_ivas, hCPE ); + + if ( ( error = front_vad( hCPE, NULL, hEncoderConfig, &hCPE->hFrontVad[0], st_ivas->hMCT != NULL, input_frame, vad_flag_dtx, fr_bands, Etot_LR, lf_E, localVAD_HE_SAD, vad_hover_flag, band_energies_LR, NULL, NULL ) ) != IVAS_ERR_OK ) + { + return error; + } + + sts[0]->element_mode = hCPE->element_mode; + sts[1]->element_mode = hCPE->element_mode; + + n_CoreChannels = 2; + if ( hCPE->element_mode == IVAS_CPE_DFT ) + { + n_CoreChannels = 1; /* in DFT stereo, only M channel is coded */ + + sts[1]->vad_flag = 0; + } + + /*----------------------------------------------------------------* + * dynamically allocate data structures depending on the actual stereo mode + *----------------------------------------------------------------*/ + + if ( ( error = stereo_memory_enc( hCPE, input_Fs, max_bwidth, &tdm_last_ratio, ivas_format, st_ivas->nchan_transport ) ) != IVAS_ERR_OK ) + { + return error; + } + + + /*----------------------------------------------------------------* + * Set TD stereo parameters + *----------------------------------------------------------------*/ + + if ( ( error = stereo_set_tdm( hCPE, input_frame ) ) != IVAS_ERR_OK ) + { + return error; + } + + /*----------------------------------------------------------------* + * Resets/updates in case of stereo switching + *----------------------------------------------------------------*/ + + stereo_switching_enc( hCPE, sts[0]->old_input_signal, input_frame ); + + /*----------------------------------------------------------------* + * Temporal inter-channel alignment, stereo adjustment + *----------------------------------------------------------------*/ + + stereo_tca_enc( hCPE, input_frame ); + + /*----------------------------------------------------------------* + * Input signal buffering - needed in IC-BWE and TD ITD in MDCT stereo + *----------------------------------------------------------------*/ + + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + mvr2r( sts[n]->input, orig_input[n], input_frame ); + + if ( hCPE->hStereoICBWE != NULL ) + { + hCPE->hStereoICBWE->dataChan[n] = &orig_input[n][0]; + } + } + + /*---------------------------------------------------------------* + * Time Domain Transient Detector + *---------------------------------------------------------------*/ + + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + if ( sts[n]->hTranDet == NULL ) + { + currFlatness[n] = 0; + continue; + } + + if ( !( ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMMC ) ) + { + RunTransientDetection( sts[n]->input, input_frame, sts[n]->hTranDet ); + } + currFlatness[n] = GetTCXAvgTemporalFlatnessMeasure( sts[n]->hTranDet, NSUBBLOCKS, 0 ); + } + + /* Synchonize detection for downmix-based stereo */ + if ( hCPE->element_mode == IVAS_CPE_DFT || hCPE->element_mode == IVAS_CPE_TD ) + { + set_transient_stereo( hCPE, currFlatness ); + } + + /*----------------------------------------------------------------* + * Configuration of stereo encoder + *----------------------------------------------------------------*/ + + for ( n = 0; n < n_CoreChannels; n++ ) + { + /* Force to MODE1 in IVAS */ + sts[n]->codec_mode = MODE1; + + sts[n]->element_mode = hCPE->element_mode; + } + + + if ( hCPE->element_mode != IVAS_CPE_MDCT && ( hCPE->element_brate != hCPE->last_element_brate || hCPE->last_element_mode != hCPE->element_mode || sts[0]->ini_frame == 0 || + ( ivas_total_brate != st_ivas->hEncoderConfig->last_ivas_total_brate ) || sts[0]->last_core_brate <= SID_2k40 ) ) /* If the last frame was SID or NO_DATA, we need to run stereo_dft_config here since VAD decision is not known yet */ + { + if ( st_ivas->hQMetaData != NULL ) + { + if ( ivas_format == MASA_ISM_FORMAT && st_ivas->ism_mode != ISM_MODE_NONE ) + { + stereo_dft_config( hCPE->hStereoDft == NULL ? NULL : hCPE->hStereoDft->hConfig, (int32_t) ( 0.70f * st_ivas->hQMetaData->bits_frame_nominal * FRAMES_PER_SEC ), &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); + } + else + { + stereo_dft_config( hCPE->hStereoDft == NULL ? NULL : hCPE->hStereoDft->hConfig, st_ivas->hQMetaData->bits_frame_nominal * FRAMES_PER_SEC, &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); + } + } + else + { + /* note; "bits_frame_nominal" needed in TD stereo as well */ + stereo_dft_config( hCPE->hStereoDft == NULL ? NULL : hCPE->hStereoDft->hConfig, hCPE->element_brate, &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); + } + } + + if ( hCPE->element_mode == IVAS_CPE_TD ) + { + if ( hCPE->hStereoTD->tdm_LRTD_flag ) + { + sts[0]->bits_frame_nominal = (int16_t) ( ( hCPE->element_brate >> 1 ) / FRAMES_PER_SEC ); + sts[1]->bits_frame_nominal = (int16_t) ( ( hCPE->element_brate >> 1 ) / FRAMES_PER_SEC ); + } + else + { + stereo_dft_config( NULL, hCPE->element_brate, &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); + } + } + + if ( hCPE->element_mode == IVAS_CPE_MDCT ) + { + /* compute bit-rate surplus per channel in combined format coding */ + int32_t brate_surplus[CPE_CHANNELS]; + if ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_DISC ) + { + brate_surplus[0] = ( ( hCPE->brate_surplus / FRAMES_PER_SEC ) >> 1 ) * FRAMES_PER_SEC; + brate_surplus[1] = hCPE->brate_surplus - brate_surplus[0]; + } + + /* this is just for initialization, the true values of "total_brate" and "bits_frame_channel" are set later */ + for ( n = 0; n < n_CoreChannels; n++ ) + { + if ( st_ivas->hMCT ) + { + int16_t lfe_bits; + lfe_bits = ( ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCT ? st_ivas->hLFE->lfe_bits : 0 ); + sts[n]->total_brate = hCPE->element_brate; + sts[n]->bits_frame_nominal = (int16_t) ( hCPE->element_brate / FRAMES_PER_SEC ); + sts[n]->bits_frame_channel = (int16_t) ( ( ivas_total_brate / FRAMES_PER_SEC - lfe_bits - nb_bits_metadata ) / st_ivas->hMCT->nchan_out_woLFE ); + } + else + { + sts[n]->bits_frame_nominal = (int16_t) ( hCPE->element_brate / FRAMES_PER_SEC ); + sts[n]->bits_frame_channel = (int16_t) ( ( hCPE->element_brate / FRAMES_PER_SEC ) / n_CoreChannels ); + sts[n]->total_brate = hCPE->element_brate / n_CoreChannels; + + /* subtract bit-rate for combined format coding */ + if ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_DISC ) + { + sts[n]->bits_frame_channel += (int16_t) ( brate_surplus[n] / FRAMES_PER_SEC ); + sts[n]->total_brate += brate_surplus[n]; + } + } + } + + /* reconfiguration in case of bitrate switching */ + if ( hCPE->element_brate != hCPE->last_element_brate && st_ivas->hMCT == NULL ) + { + initMdctStereoEncData( hCPE->hStereoMdct, ivas_format, hCPE->element_mode, hCPE->element_brate, max_bwidth, 0, NULL, 0 ); + hCPE->hStereoMdct->isSBAStereoMode = ( ( ivas_format == SBA_FORMAT || ivas_format == SBA_ISM_FORMAT ) && ( st_ivas->nchan_transport == 2 ) ); + } + } + + /*----------------------------------------------------------------* + * Stereo processing + * Stereo down-mix + *----------------------------------------------------------------*/ + + if ( hCPE->element_mode == IVAS_CPE_DFT ) + { + stereo_dft_hybrid_ITD_flag( hCPE->hStereoDft->hConfig, input_Fs, hCPE->hStereoDft->hItd->hybrid_itd_max ); + + /* Time Domain ITD compensation using extrapolation */ + stereo_td_itd( hCPE->hStereoDft->hItd, hCPE->hStereoDft->input_mem_itd, hCPE->hStereoDft->hConfig->hybrid_itd_flag, hCPE->hStereoDft->dft_ovl, sts, input_frame, hCPE->input_mem ); + + /* DFT on right and left input channels */ + stereo_dft_enc_analyze( sts, CPE_CHANNELS, input_frame, hCPE->hStereoDft, NULL, hCPE->hStereoDft->DFT, hCPE->input_mem ); + + sts[0]->total_brate = ( sts[0]->bits_frame_nominal + 10 ) * FRAMES_PER_SEC; /* add small overhead; st[0]->total_brate used in coder_type_modif() */ + /* Update DFT Stereo memories */ + stereo_dft_enc_update( hCPE->hStereoDft, sts[0]->max_bwidth ); + + /* DFT stereo processing */ + stereo_dft_enc_process( hCPE, vad_flag_dtx, vad_hover_flag, input_frame ); + } + else if ( hCPE->element_mode == IVAS_CPE_TD ) + { + /* Determine the energy ratio between the 2 channels */ + tdm_ratio_idx = stereo_tdm_ener_analysis( + ivas_format, + hCPE, input_frame, &tdm_SM_or_LRTD_Pri, &tdm_ratio_idx_SM ); + + /* Compute the downmix signal based on the ratio index */ + stereo_tdm_downmix( hCPE->hStereoTD, sts[0]->input, sts[1]->input, input_frame, tdm_ratio_idx, ( ( hCPE->hStereoTD->tdm_LRTD_flag == 0 ) ? tdm_SM_or_LRTD_Pri : 0 ), tdm_ratio_idx_SM ); + + /* signal the bitrate for BW selection in the SCh */ + sts[0]->bits_frame_channel = 0; + sts[1]->bits_frame_channel = (int16_t) ( hCPE->element_brate / FRAMES_PER_SEC ); + sts[1]->bits_frame_channel += (int16_t) ( hCPE->brate_surplus / FRAMES_PER_SEC ); + if ( st_ivas->hQMetaData != NULL ) + { + sts[1]->bits_frame_channel -= st_ivas->hQMetaData->metadata_max_bits; + } + + Etot_last[0] = sts[0]->hNoiseEst->Etot_last; + Etot_last[1] = sts[1]->hNoiseEst->Etot_last; + } + else if ( hCPE->element_mode == IVAS_CPE_MDCT ) + { + stereo_td_itd_mdct_stereo( hCPE, vad_flag_dtx, vad_hover_flag, input_frame ); + } + + /*----------------------------------------------------------------* + * DFT stereo: iDFT and resampling on both channels + *----------------------------------------------------------------*/ + + if ( hCPE->element_mode == IVAS_CPE_DFT ) + { + int32_t internal_Fs; + + internal_Fs = getTcxonly( IVAS_CPE_MDCT, sts[0]->bits_frame_nominal * FRAMES_PER_SEC, 0, sts[0]->is_ism_format ) == 0 ? INT_FS_16k : max( INT_FS_16k, sts[0]->sr_core ); + + /* iDFT at input sampling rate */ + stereo_dft_enc_synthesize( hCPE->hStereoDft, sts[0]->input, 0, input_Fs, input_Fs, 0 ); + + /* iDFT & resampling to 12.8kHz internal sampling rate */ + stereo_dft_enc_synthesize( hCPE->hStereoDft, old_inp_12k8[0] + L_INP_MEM, 0, input_Fs, INT_FS_12k8, 0 ); + + /* iDFT & resampling to 16kHz internal sampling rate for M channel */ + if ( input_Fs == internal_Fs ) + { + mvr2r( sts[0]->input - STEREO_DFT_OVL_16k, old_inp_16k[0] + L_INP_MEM - STEREO_DFT_OVL_16k, input_frame + STEREO_DFT_OVL_16k ); + } + else + { + stereo_dft_enc_synthesize( hCPE->hStereoDft, old_inp_16k[0] + L_INP_MEM, 0, input_Fs, internal_Fs, 0 ); + } + + /* DFT Stereo: iDFT of residual signal at 8kHz sampling rate */ + if ( hCPE->element_mode == IVAS_CPE_DFT && hCPE->hStereoDft->res_cod_mode[STEREO_DFT_OFFSET] ) + { + mvr2r( sts[1]->old_inp_12k8, old_inp_12k8[1], L_INP_MEM ); + stereo_dft_enc_synthesize( hCPE->hStereoDft, old_inp_12k8[1] + L_INP_MEM, 1, input_Fs, 8000, 0 ); + + /* update old input signal buffer */ + mvr2r( old_inp_12k8[1] + L_FRAME8k, sts[1]->old_inp_12k8, L_INP_MEM ); + } + + /* no iDFT at input sampling rate for Side channel -> reset the buffer */ + set_zero( sts[1]->input, input_frame ); + } + + + /*----------------------------------------------------------------* + * Front Pre-processing + *----------------------------------------------------------------*/ + + for ( n = 0; n < n_CoreChannels; n++ ) + { + error = pre_proc_front_ivas( NULL, hCPE, hCPE->element_brate, nb_bits_metadata, input_frame, n, old_inp_12k8[n], old_inp_16k[n], + &ener[n], &relE[n], A[n], Aw[n], epsP[n], lsp_new[n], lsp_mid[n], &vad_hover_flag[n], &attack_flag[n], + realBuffer[n], imagBuffer[n], old_wsp[n], pitch_fr[n], voicing_fr[n], &loc_harm[n], &cor_map_sum[n], &vad_flag_dtx[n], enerBuffer[n], + fft_buff[n], A[0], lsp_new[0], currFlatness[n], tdm_ratio_idx, fr_bands, Etot_LR, lf_E, localVAD_HE_SAD, band_energies_LR, 0, st_ivas->hSpar != NULL ? st_ivas->hSpar->front_vad_flag : 0, 0, 0, ivas_format, ivas_total_brate ); + if ( error != IVAS_ERR_OK ) + { + return error; + } + } + + /* sanity check -> DTX not supported for more than one SCEs/CPEs */ + if ( st_ivas->nSCE + st_ivas->nCPE > 1 ) + { + if ( sts[0]->core_brate == SID_2k40 || sts[0]->core_brate == FRAME_NO_DATA ) + { + sts[0]->core_brate = -1; + sts[0]->total_brate = hCPE->element_brate; + } + } + + /*----------------------------------------------------------------* + * Stereo DTX updates + *----------------------------------------------------------------*/ + + if ( ivas_format == MASA_FORMAT && nb_bits_metadata > 0 && hCPE->hCoreCoder[0]->Opt_DTX_ON ) + { + if ( hCPE->element_mode == IVAS_CPE_DFT || hCPE->element_mode == IVAS_CPE_TD ) + { + reset_metadata_spatial( ivas_format, hCPE->hMetaData, hCPE->element_brate, &tmp, sts[0]->core_brate, nb_bits_metadata ); + } + } + + /* MDCT stereo DTX: active/inactive frame decision; compute FD CNG coherence */ + if ( hCPE->element_mode == IVAS_CPE_MDCT && hEncoderConfig->Opt_DTX_ON ) + { + stereoFdCngCoherence( sts, hCPE->last_element_mode, fft_buff ); + + /* Reset metadata */ + if ( sts[0]->cng_sba_flag || ( ivas_format == SBA_FORMAT ) ) + { + reset_metadata_spatial( ivas_format, hCPE->hMetaData, hCPE->element_brate, &tmp, sts[0]->core_brate, nb_bits_metadata ); + } + } + + /*----------------------------------------------------------------* + * Core codec configuration + *----------------------------------------------------------------*/ + + /* IGF reconfiguration */ + for ( n = 0; n < n_CoreChannels; n++ ) + { +#ifdef NONBE_FIX_838_CRASH_24_4_WB + if ( ( hCPE->last_element_brate != hCPE->element_brate || hCPE->element_mode != hCPE->last_element_mode || ( hCPE->element_mode == IVAS_CPE_TD && sts[0]->bits_frame_nominal != last_bits_frame_nominal ) || sts[n]->last_bwidth != sts[n]->bwidth ) && ( n == 0 || hCPE->element_mode == IVAS_CPE_MDCT ) ) +#else + if ( ( hCPE->last_element_brate != hCPE->element_brate || sts[n]->last_bwidth != sts[n]->bwidth ) && ( n == 0 || hCPE->element_mode == IVAS_CPE_MDCT ) ) +#endif + { + int16_t igf; + igf = getIgfPresent( sts[n]->element_mode, sts[n]->bits_frame_nominal * FRAMES_PER_SEC, sts[n]->max_bwidth, sts[n]->rf_mode ); + if ( ( error = IGF_Reconfig( &sts[n]->hIGFEnc, igf, 0, sts[n]->bits_frame_nominal * FRAMES_PER_SEC, sts[n]->max_bwidth, sts[n]->element_mode, sts[n]->rf_mode ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + + if ( hCPE->element_mode == IVAS_CPE_MDCT && st_ivas->hMCT == NULL ) + { + /* set coded BW for MDCT stereo */ + set_bw_stereo( hCPE ); + + /* reconfiguration of MDCT stereo */ + if ( sts[0]->bwidth != sts[0]->last_bwidth || ( ( hCPE->last_element_brate != hCPE->element_brate || hCPE->last_element_mode != hCPE->element_mode ) && sts[0]->bwidth != sts[0]->max_bwidth ) ) + { + initMdctStereoEncData( hCPE->hStereoMdct, ivas_format, hCPE->element_mode, hCPE->element_brate, sts[0]->bwidth, 0, NULL, 0 ); + hCPE->hStereoMdct->isSBAStereoMode = ( ( ivas_format == SBA_FORMAT || ivas_format == SBA_ISM_FORMAT ) && ( st_ivas->nchan_transport == 2 ) ); + + if ( hCPE->element_brate <= MAX_MDCT_ITD_BRATE && ivas_format == STEREO_FORMAT ) + { + if ( ( error = initMdctItdHandling( hCPE->hStereoMdct, input_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + } + + /* set ACELP@12k8 / ACELP@16k flag for flexible ACELP core */ + for ( n = 0; n < n_CoreChannels; n++ ) + { + if ( ( sts[0]->core_brate == SID_2k40 || sts[0]->core_brate == FRAME_NO_DATA ) && hCPE->element_mode == IVAS_CPE_DFT ) + { + sts[n]->flag_ACELP16k = set_ACELP_flag( hCPE->element_mode, hCPE->element_brate, sts[n]->core_brate, n, sts[0]->tdm_LRTD_flag, sts[n]->bwidth, sts[n]->cng_type ); + } + else + { + sts[n]->flag_ACELP16k = set_ACELP_flag( hCPE->element_mode, hCPE->element_brate, sts[n]->total_brate, n, sts[0]->tdm_LRTD_flag, sts[n]->bwidth, sts[n]->cng_type ); + } + } + + /* configure TD stereo encoder */ + if ( hCPE->element_mode == IVAS_CPE_TD ) + { + tdm_ol_pitch_comparison( hCPE, pitch_fr, voicing_fr ); + + tdm_configure_enc( ivas_format, st_ivas->ism_mode, hCPE, Etot_last, tdm_SM_or_LRTD_Pri, tdm_ratio_idx, tdm_ratio_idx_SM, attack_flag[0], nb_bits_metadata ); + + if ( hEncoderConfig->Opt_DTX_ON ) + { + stereo_cng_upd_counters( hCPE->hStereoCng, hCPE->element_mode, -1, NULL, sts[0]->hTdCngEnc->burst_ho_cnt, NULL ); + } + } + + /* modify the coder_type depending on the total_brate per channel */ + for ( n = 0; n < n_CoreChannels; n++ ) + { + if ( ( hCPE->element_mode != IVAS_CPE_DFT && hCPE->element_mode != IVAS_CPE_TD ) || n == 0 ) /* modify coder_type of primary channel */ + { + /* limit coder_type depending on the bitrate */ + coder_type_modif( sts[n], relE[n] ); + } + } + + /*----------------------------------------------------------------* + * Write IVAS format signaling in SID frames + *----------------------------------------------------------------*/ + + if ( sts[0]->core_brate == SID_2k40 ) + { + ivas_write_format_sid( ivas_format, hCPE->element_mode, sts[0]->hBstr ); + } + + /*----------------------------------------------------------------* + * DFT Stereo residual coding + * DFT Stereo parameters writing into the bitstream + *----------------------------------------------------------------*/ + + cpe_brate = 0; + if ( hCPE->element_mode == IVAS_CPE_DFT ) + { + if ( hEncoderConfig->Opt_DTX_ON ) + { + if ( sts[0]->core_brate == SID_2k40 || sts[0]->core_brate == FRAME_NO_DATA ) + { + /* Reconfigure DFT Stereo for inactive frames */ + if ( sts[0]->core_brate == SID_2k40 ) + { + stereo_dft_config( hCPE->hStereoDft->hConfig, IVAS_SID_5k2, &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); + } + else + { + stereo_dft_config( hCPE->hStereoDft->hConfig, FRAME_NO_DATA, &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); + } + + stereo_dft_cng_side_gain( hCPE->hStereoDft, hCPE->hStereoCng, sts[0]->core_brate, sts[0]->last_core_brate, sts[0]->bwidth ); + } + else + { + stereo_cng_upd_counters( hCPE->hStereoCng, hCPE->element_mode, hCPE->hStereoDft->nbands, hCPE->hStereoDft->sidSideGain, sts[0]->hTdCngEnc->burst_ho_cnt, &hCPE->hStereoDft->coh_fade_counter ); + } + } + + /* Write stereo bitstream */ + cpe_brate = st_ivas->hCPE[0]->element_brate; + + /* DFT stereo side bits */ + if ( ( ivas_format == MASA_FORMAT || ivas_format == MASA_ISM_FORMAT ) && cpe_brate < MASA_STEREO_MIN_BITRATE && sts[0]->core_brate != SID_2k40 && sts[0]->core_brate != FRAME_NO_DATA ) + { + nb_bits = 0; /* Only mono downmix is transmitted in this case */ + } + else if ( ( ivas_format == MASA_FORMAT || ivas_format == MASA_ISM_FORMAT ) && ( sts[0]->core_brate == SID_2k40 || sts[0]->core_brate == FRAME_NO_DATA ) ) + { + nb_bits = hCPE->hMetaData->nb_bits_tot; + } + else + { + stereo_dft_enc_write_BS( hCPE, &nb_bits ); + } + + /* Residual coding in MDCT domain */ + if ( !( ( ivas_format == MASA_FORMAT || ivas_format == MASA_ISM_FORMAT ) && ( sts[0]->core_brate == SID_2k40 || sts[0]->core_brate == FRAME_NO_DATA ) ) ) + { + int16_t max_bits = (int16_t) ( hCPE->element_brate / FRAMES_PER_SEC - 0.8f * sts[0]->bits_frame_nominal ); + if ( ivas_format == MASA_FORMAT || ivas_format == MASA_ISM_FORMAT ) + { + max_bits -= nb_bits_metadata; + max_bits += (int16_t) ( hCPE->brate_surplus / FRAMES_PER_SEC ); + } + + stereo_dft_enc_res( hCPE->hStereoDft, old_inp_12k8[1] + L_INP_MEM - STEREO_DFT_OVL_8k, hCPE->hMetaData, &nb_bits, max_bits ); + } + if ( sts[0]->core_brate == FRAME_NO_DATA || sts[0]->core_brate == SID_2k40 ) + { + assert( ( nb_bits <= ( ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS ) ) && "Stereo DFT CNG: bit budget is violated" ); + } + else + { + assert( ( ( hCPE->element_brate / FRAMES_PER_SEC - nb_bits ) >= ( 0.8f * sts[0]->bits_frame_nominal ) ) && "Stereo DFT: bit budget is violated" ); + + /* Flexible total bitrate in M channel */ + sts[0]->total_brate = hCPE->element_brate - ( nb_bits * FRAMES_PER_SEC ); + } + + /* subtract metadata bitbudget */ + sts[0]->total_brate -= ( nb_bits_metadata * FRAMES_PER_SEC ); + + /* subtract bit-rate for combined format coding */ + if ( ivas_format == MASA_ISM_FORMAT && ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_DISC ) ) + { + sts[0]->total_brate += hCPE->brate_surplus; + } + } + + + /*----------------------------------------------------------------* + * Core Encoder + *----------------------------------------------------------------*/ + + if ( ( error = ivas_core_enc( NULL, hCPE, st_ivas->hMCT, n_CoreChannels, old_inp_12k8, old_inp_16k, ener, A, Aw, epsP, lsp_new, lsp_mid, vad_hover_flag, attack_flag, realBuffer, imagBuffer, old_wsp, loc_harm, cor_map_sum, vad_flag_dtx, enerBuffer, fft_buff, tdm_SM_or_LRTD_Pri, ivas_format, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + + /*----------------------------------------------------------------* + * Common updates + *----------------------------------------------------------------*/ + + hCPE->last_element_brate = hCPE->element_brate; + hCPE->last_element_mode = hCPE->element_mode; + + if ( ivas_format == MASA_ISM_FORMAT ) + { + hCPE->element_brate = element_brate_ref; + } + + if ( hCPE->element_mode == IVAS_CPE_MDCT && hCPE->hStereoMdct != NULL && hCPE->hStereoMdct->hItd != NULL ) + { + /* update input samples buffer */ + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + mvr2r( orig_input[n], sts[n]->old_input_signal, input_frame ); + } + } + else if ( hCPE->element_mode == IVAS_CPE_DFT ) + { + mvr2r( sts[0]->input, sts[0]->old_input_signal, input_frame ); + } + else if ( st_ivas->hMCT == NULL ) /* note: in MCT, input buffers are updated later in ivas_mct_enc() */ + { + /* update input samples buffer */ + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + mvr2r( sts[n]->input, sts[n]->old_input_signal, input_frame ); + } + } + + if ( hCPE->hFrontVad[0] != NULL ) + { + hCPE->hFrontVad[0]->ini_frame++; + hCPE->hFrontVad[0]->ini_frame = min( hCPE->hFrontVad[0]->ini_frame, MAX_FRAME_COUNTER ); + } + + /* Store previous attack detection flag */ + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + sts[n]->hTranDet->transientDetector.prev_bIsAttackPresent = sts[n]->hTranDet->transientDetector.bIsAttackPresent; + } + + + pop_wmops(); + return error; +} + + +/*------------------------------------------------------------------------- + * create_cpe_enc() + * + * Create, allocate and initialize IVAS encoder CPE handle + *-------------------------------------------------------------------------*/ + +ivas_error create_cpe_enc( + Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ + const int16_t cpe_id, /* i : CPE # identifier */ + const int32_t element_brate /* i : element bitrate */ +) +{ + int16_t n; + int16_t ivas_format, element_mode_init, max_bwidth; + int32_t input_Fs; + CPE_ENC_HANDLE hCPE; + Encoder_State *st; + ENCODER_CONFIG_HANDLE hEncoderConfig; + ivas_error error; + + error = IVAS_ERR_OK; + + hEncoderConfig = st_ivas->hEncoderConfig; + + ivas_format = hEncoderConfig->ivas_format; + element_mode_init = hEncoderConfig->element_mode_init; + input_Fs = hEncoderConfig->input_Fs; + max_bwidth = hEncoderConfig->max_bwidth; + + /*-----------------------------------------------------------------* + * Allocate CPE handle + *-----------------------------------------------------------------*/ + + if ( ( hCPE = (CPE_ENC_HANDLE) malloc( sizeof( CPE_ENC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for CPE\n" ) ); + } + + /*-----------------------------------------------------------------* + * Initialization - general parameters + *-----------------------------------------------------------------*/ + + hCPE->cpe_id = cpe_id; + hCPE->element_brate = element_brate; + hCPE->last_element_brate = hCPE->element_brate; + hCPE->element_mode = element_mode_init; + hCPE->last_element_mode = element_mode_init; + + hCPE->hStereoDft = NULL; + hCPE->hStereoTD = NULL; + hCPE->hStereoMdct = NULL; + hCPE->hStereoTCA = NULL; + hCPE->hStereoICBWE = NULL; + hCPE->hMetaData = NULL; + + hCPE->hStereoCng = NULL; + hCPE->hFrontVad[0] = NULL; + hCPE->hFrontVad[1] = NULL; + + hCPE->brate_surplus = 0; + + /*-----------------------------------------------------------------* + * Input memory buffer: allocate and initialize + *-----------------------------------------------------------------*/ + + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + if ( ivas_format == STEREO_FORMAT || ivas_format == MASA_FORMAT || ( ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCMASA ) || ivas_format == MASA_ISM_FORMAT ) + { + if ( ( hCPE->input_mem[n] = (float *) malloc( sizeof( float ) * NS2SA( input_Fs, STEREO_DFT_OVL_NS ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DFT stereo memory\n" ) ); + } + + set_zero( hCPE->input_mem[n], NS2SA( input_Fs, STEREO_DFT_OVL_NS ) ); + } + else + { + hCPE->input_mem[n] = NULL; + } + } + + /*-----------------------------------------------------------------* + * stereo classifier: allocate and initialize + *-----------------------------------------------------------------*/ + + if ( ( hCPE->hStereoClassif = (STEREO_CLASSIF_HANDLE) malloc( sizeof( STEREO_CLASSIF_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for stereo classifier structure\n" ) ); + } + + stereo_classifier_init( hCPE->hStereoClassif ); + + /*-----------------------------------------------------------------* + * Metadata: allocate and initialize + *-----------------------------------------------------------------*/ + + if ( cpe_id == ( st_ivas->nCPE - 1 ) ) + { + if ( ( error = ivas_initialize_MD_bstr_enc( &( hCPE->hMetaData ), st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /*-----------------------------------------------------------------* + * CoreCoder, 2 instances: allocate and initialize + *-----------------------------------------------------------------*/ + + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + if ( ( st = (ENC_CORE_HANDLE) malloc( sizeof( Encoder_State ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for CoreCoder structure\n" ) ); + } + + copy_encoder_config( st_ivas, st, 1 ); + + st->total_brate = hCPE->element_brate / ( st_ivas->nCPE > 1 ? 1 : CPE_CHANNELS ); /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */ + st->mct_chan_mode = MCT_CHAN_MODE_REGULAR; + + if ( ( error = init_encoder( st, st_ivas, n, hEncoderConfig->var_SID_rate_flag, hEncoderConfig->interval_SID, 0, ISM_MODE_NONE, hCPE->element_brate ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( st->hFdCngEnc != NULL ) + { + st->hFdCngEnc->hFdCngCom->CngBitrate = hCPE->element_brate - 1; + } + + hCPE->hCoreCoder[n] = st; + } + + /*-----------------------------------------------------------------* + * LR VAD initialization + *-----------------------------------------------------------------*/ + + if ( hEncoderConfig->Opt_DTX_ON ) + { + if ( hCPE->element_mode == IVAS_CPE_TD || hCPE->element_mode == IVAS_CPE_DFT ) + { + if ( ( hCPE->hStereoCng = (STEREO_CNG_ENC_HANDLE) malloc( sizeof( STEREO_CNG_ENC ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Stereo Cng for Unified/TD \n" ) ); + } + + stereo_enc_cng_init( hCPE->hStereoCng ); + } + } + else + { + hCPE->hStereoCng = NULL; + } + + if ( hEncoderConfig->Opt_DTX_ON && element_mode_init != IVAS_CPE_MDCT ) + { + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + if ( ( error = front_vad_create( &( hCPE->hFrontVad[n] ), hEncoderConfig ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + else + { + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + hCPE->hFrontVad[n] = NULL; + } + } + + /*-----------------------------------------------------------------* + * DFT stereo initialization + *-----------------------------------------------------------------*/ + + if ( hCPE->element_mode == IVAS_CPE_DFT ) + { + if ( ( error = stereo_dft_enc_create( &( hCPE->hStereoDft ), input_Fs, max_bwidth ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /*-----------------------------------------------------------------* + * Temporal inter-channel alignment initialization + *-----------------------------------------------------------------*/ + + if ( hCPE->element_mode != IVAS_CPE_MDCT ) + { + if ( ( hCPE->hStereoTCA = (STEREO_TCA_ENC_HANDLE) malloc( sizeof( STEREO_TCA_ENC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Stereo TCA\n" ) ); + } + + stereo_tca_init_enc( hCPE->hStereoTCA, input_Fs ); + } + + /*-----------------------------------------------------------------* + * Stereo IC BWE initialization + *-----------------------------------------------------------------*/ + + if ( hCPE->element_mode != IVAS_CPE_MDCT ) + { + if ( ( hCPE->hStereoICBWE = (STEREO_ICBWE_ENC_HANDLE) malloc( sizeof( STEREO_ICBWE_ENC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Stereo ICBWE \n" ) ); + } + + stereo_icBWE_init_enc( hCPE->hStereoICBWE ); + } + + /*-----------------------------------------------------------------* + * TD stereo initialization + *-----------------------------------------------------------------*/ + + if ( hCPE->element_mode == IVAS_CPE_TD ) + { + if ( ( hCPE->hStereoTD = (STEREO_TD_ENC_DATA_HANDLE) malloc( sizeof( STEREO_TD_ENC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD Stereo\n" ) ); + } + + stereo_td_init_enc( hCPE->hStereoTD, hCPE->last_element_mode ); + } + + /*-----------------------------------------------------------------* + * MDCT stereo initialization + *-----------------------------------------------------------------*/ + + if ( hCPE->element_mode == IVAS_CPE_MDCT && st_ivas->nCPE == 1 ) + { + if ( ( hCPE->hStereoMdct = (STEREO_MDCT_ENC_DATA_HANDLE) malloc( sizeof( STEREO_MDCT_ENC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MDCT Stereo \n" ) ); + } + + initMdctStereoEncData( hCPE->hStereoMdct, ivas_format, hCPE->element_mode, hCPE->element_brate, max_bwidth, 0, NULL, 1 ); + hCPE->hStereoMdct->isSBAStereoMode = ( ( ivas_format == SBA_FORMAT || ivas_format == SBA_ISM_FORMAT ) && ( st_ivas->nchan_transport == 2 ) ); + + if ( hCPE->element_mode == IVAS_CPE_MDCT && element_brate <= MAX_MDCT_ITD_BRATE && ivas_format == STEREO_FORMAT ) + { + if ( ( error = initMdctItdHandling( hCPE->hStereoMdct, input_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + + st_ivas->hCPE[cpe_id] = hCPE; + + return error; +} + + +/*------------------------------------------------------------------------- + * destroy_cpe_enc() + * + * Destroy and deallocate IVAS encoder CPE handle + *-------------------------------------------------------------------------*/ + +void destroy_cpe_enc( + CPE_ENC_HANDLE hCPE /* i/o: CPE encoder structure */ +) +{ + int16_t n; + Encoder_State *st; + + if ( hCPE->hStereoClassif != NULL ) + { + free( hCPE->hStereoClassif ); + hCPE->hStereoClassif = NULL; + } + + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + if ( hCPE->input_mem[n] != NULL ) + { + free( hCPE->input_mem[n] ); + hCPE->input_mem[n] = NULL; + } + } + + ivas_destroy_MD_bstr_enc( &( hCPE->hMetaData ) ); + + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + st = hCPE->hCoreCoder[n]; + + if ( st != NULL ) + { + destroy_core_enc( st ); + st = NULL; + } + } + + if ( hCPE->hStereoDft != NULL ) + { + stereo_dft_enc_destroy( &hCPE->hStereoDft ); + hCPE->hStereoDft = NULL; + } + + if ( hCPE->hStereoTD != NULL ) + { + free( hCPE->hStereoTD ); + hCPE->hStereoTD = NULL; + } + + if ( hCPE->hStereoMdct != NULL ) + { + stereo_mdct_enc_destroy( &hCPE->hStereoMdct ); + hCPE->hStereoMdct = NULL; + } + + if ( hCPE->hStereoTCA != NULL ) + { + free( hCPE->hStereoTCA ); + hCPE->hStereoTCA = NULL; + } + + if ( hCPE->hStereoICBWE != NULL ) + { + free( hCPE->hStereoICBWE ); + hCPE->hStereoICBWE = NULL; + } + + if ( hCPE->hStereoCng != NULL ) + { + free( hCPE->hStereoCng ); + hCPE->hStereoCng = NULL; + } + + if ( hCPE->hFrontVad[0] != NULL ) + { + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + front_vad_destroy( &hCPE->hFrontVad[n] ); + hCPE->hFrontVad[n] = NULL; + } + } + + free( hCPE ); + + return; +} + + +/*------------------------------------------------------------------------- + * stereo_mode_combined_format_enc() + * + * Set stereo format in a combined format + *-------------------------------------------------------------------------*/ + +static void stereo_mode_combined_format_enc( + const Encoder_Struct *st_ivas, /* i : encoder main structure */ + CPE_ENC_HANDLE hCPE /* i/o: CPE handle */ +) +{ + ENCODER_CONFIG_HANDLE hEncoderConfig; + int32_t element_brate_ref; + + hEncoderConfig = st_ivas->hEncoderConfig; + + if ( hEncoderConfig->ivas_format == MASA_ISM_FORMAT ) + { + element_brate_ref = hCPE->element_brate; + + if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC && + ( ( hEncoderConfig->nchan_ism == 3 && hEncoderConfig->ivas_total_brate == IVAS_96k ) || + ( hEncoderConfig->nchan_ism == 4 && hEncoderConfig->ivas_total_brate == IVAS_128k ) ) ) + { + if ( hCPE->element_brate + hCPE->brate_surplus > IVAS_64k ) + { + st_ivas->hMasa->data.hOmasaData->omasa_stereo_sw_cnt = 0; + } + else + { + st_ivas->hMasa->data.hOmasaData->omasa_stereo_sw_cnt++; + st_ivas->hMasa->data.hOmasaData->omasa_stereo_sw_cnt = min( st_ivas->hMasa->data.hOmasaData->omasa_stereo_sw_cnt, OMASA_STEREO_SW_CNT_MAX ); + } + + if ( st_ivas->hMasa->data.hOmasaData->omasa_stereo_sw_cnt < OMASA_STEREO_SW_CNT_MAX ) + { + hCPE->element_mode = IVAS_CPE_MDCT; + hCPE->element_brate = IVAS_64k; + hCPE->brate_surplus -= ( hCPE->element_brate - element_brate_ref ); + } + + /* write OMASA stereo mode signalling */ + if ( hCPE->element_mode == IVAS_CPE_MDCT ) + { + push_indice( hCPE->hCoreCoder[0]->hBstr, IND_SMODE_OMASA, 1, NBITS_ELEMENT_MODE ); + } + else + { + push_indice( hCPE->hCoreCoder[0]->hBstr, IND_SMODE_OMASA, 0, NBITS_ELEMENT_MODE ); + } + } + } + + return; +} diff --git a/lib_enc/ivas_decision_matrix_enc.c b/lib_enc/ivas_decision_matrix_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..afa2d2d0064f8532436b598fa8b4296da29b4fa1 --- /dev/null +++ b/lib_enc/ivas_decision_matrix_enc.c @@ -0,0 +1,487 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "cnst.h" +#include "ivas_cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_rom_com.h" +#include "wmc_auto.h" + + +/*-----------------------------------------------------------------* + * ivas_decision_matrix_enc() + * + * Core technology selection in the IVAS codec + * + * CPE + * bitrate 13.2 16.4 24.4 32 48 >48(*) + * ---------------------------------------------------------------------------------------- + * WB + * speech ACELP ACELP ACELP ACELP ACELP TCX + * music GSC/TCX GSC/TCX TCX/HQ TCX/HQ TCX/HQ TCX + * inactive ACELP-I/TCX ACELP-I/TCX ACELP-I/TCX ACELP-I/TCX ACELP-I/TCX TCX + * + * SWB + * speech ACELP ACELP ACELP ACELP ACELP TCX + * music GSC/TCX GSD/TCX TCX/HQ TCX/HQ TCX/HQ TCX + * inactive ACELP-I/TCX ACELP-I/TCX ACELP-I/TCX ACELP-I/TCX ACELP-I/TCX TCX + * + * FB + * speech ACELP ACELP TCX + * music TCX/HQ TCX/HQ TCX + * inactive ACELP-I/TCX ACELP-I/TCX TCX + * + * ACELP-I: GSC Inactive mode used for total_brate <= 28 kbps (total_brate), AVQ Inactive mode used otherwise + * (*): TCX core is selected when total_brate > 48kbps, not CPE bitrate + * Note: in MDCT stereo mode, TCX core is selected for all content + * -------------------------------------------------------------------------------------------------------------------------------------------------------------*/ + +void ivas_decision_matrix_enc( + Encoder_State *st, /* i : encoder state structure */ + const int32_t element_brate, /* i : element bitrate */ + const float fft_buff[], /* i : FFT buffer */ + const float enerBuffer[], /* i : energy buffer */ + const int16_t last_element_mode /* i : last element mode */ +) +{ + int32_t icbwe_brate; + /* init */ + icbwe_brate = 0; + + /* initialization */ + st->core = -1; + st->extl = -1; + st->extl_brate = 0; + if ( st->element_mode != IVAS_CPE_MDCT ) + { + st->igf = 0; + } + + /* SID and FRAME_NO_DATA frames */ + if ( st->Opt_DTX_ON && ( st->core_brate == SID_2k40 || st->core_brate == FRAME_NO_DATA ) ) + { + st->core = ACELP_CORE; + + if ( st->input_Fs >= 32000 && st->bwidth >= SWB ) + { + st->extl = SWB_CNG; + } + + st->rf_mode = 0; + + return; + } + + /*---------------------------------------------------------------------* + * Select the core + *---------------------------------------------------------------------*/ + + if ( st->element_mode == IVAS_SCE && st->low_rate_mode ) + { + /* ISM low-rate mode */ + st->core = ACELP_CORE; + st->coder_type = INACTIVE; + } + else if ( st->total_brate > MAX_ACELP_BRATE ) + { + /* highest bitrates */ + st->core = TCX_20_CORE; + } + else if ( st->element_mode == IVAS_CPE_MDCT ) + { + /* in MDCT stereo set TCX core */ + st->core = TCX_20_CORE; + } + else if ( st->coder_type == INACTIVE ) + { + /* inactive frames */ + if ( st->cng_type == FD_CNG && st->total_brate >= STEREO_TCX_MIN_RATE ) + { + st->core = TCX_20_CORE; + } + else + { + st->core = ACELP_CORE; + } + } + else if ( st->sp_aud_decision1 == 0 && st->sp_aud_decision2 == 0 ) + { + /* speech */ + st->core = ACELP_CORE; + } + else if ( st->sp_aud_decision1 == 1 && st->sp_aud_decision2 == 0 ) + { + /* music w. GSC core */ + st->core = ACELP_CORE; + } + else /* sp_aud_decision1 == 1 && *sp_aud_decision2 == 1 */ + { + /* music w. TCX or HQ core */ + st->core = TCX_20_CORE; + + if ( st->element_mode == IVAS_CPE_TD || st->sp_aud_decision0 == 0 ) + { + st->core = TCX_20_CORE; + } + else + { + /* select TCX core or HQ core using bits_frame_nominal to match the TCX configuration bitrate */ + st->core = mdct_classifier( st, fft_buff, enerBuffer, st->bits_frame_nominal * FRAMES_PER_SEC ); + } + } + + /* do not allow TD stereo ACELP core -> DFT stereo TCX core switching as it is on the WC complexity path */ + if ( ( ( st->last_core == ACELP_CORE && last_element_mode == IVAS_CPE_TD && st->element_mode == IVAS_CPE_DFT ) || ( st->tdm_LRTD_flag == 1 && st->total_brate <= IVAS_16k4 ) ) && st->core == TCX_20_CORE && st->total_brate <= MAX_ACELP_BRATE ) /* Override TCX in case of LRTD && primary channel has low bitrate*/ + { + st->core = ACELP_CORE; + } + + if ( st->is_ism_format && st->tcxonly ) + { + st->core = TCX_20_CORE; + } + + + /* TCX not available at low bitrates -> replace it by GSC */ + if ( st->core == TCX_20_CORE && st->total_brate < STEREO_TCX_MIN_RATE ) + { + st->core = ACELP_CORE; + st->coder_type = AUDIO; + st->sp_aud_decision2 = 0; + + if ( st->low_rate_mode ) + { + st->coder_type = INACTIVE; + } + } + + /* sanity check to avoid too low ACELP bitrate in case of "limitation to avoid too high bitrate in one active TCX channel" at element_brate = 32000 */ + if ( st->is_ism_format && st->flag_ACELP16k && !st->low_rate_mode && st->core == ACELP_CORE && st->total_brate < ACELP_16k_LOW_LIMIT + FB_TBE_1k8 ) + { + st->core = TCX_20_CORE; + } + + /*---------------------------------------------------------------------* + * Select ACELP and GSC extension layer + *---------------------------------------------------------------------*/ + + if ( st->core == ACELP_CORE ) + { + /* WB */ + if ( st->bwidth == WB ) + { + if ( st->total_brate < MIN_BRATE_WB_BWE || ( st->idchan == 1 && st->element_mode == IVAS_CPE_TD ) ) + { + st->extl = WB_BWE; + } + else if ( st->total_brate >= MIN_BRATE_WB_BWE && !st->flag_ACELP16k ) + { + if ( ( st->sp_aud_decision1 == 1 && st->sp_aud_decision2 == 0 ) || st->coder_type == INACTIVE ) + { + st->extl = WB_BWE; + st->extl_brate = WB_BWE_0k35; + } + else + { + st->extl = WB_TBE; + + if ( st->total_brate < MIN_BRATE_WB_TBE_1k05 || ( st->element_mode == IVAS_CPE_TD && st->total_brate < MIN_TDM_BRATE_WB_TBE_1k05 ) ) + { + st->extl_brate = WB_TBE_0k35; + } + else + { + st->extl_brate = WB_TBE_1k05; + } + } + } + } + + /* SWB and FB */ + else if ( st->bwidth == SWB || st->bwidth == FB ) + { + if ( st->total_brate >= MIN_BRATE_SWB_BWE /*&& (*coder_type != AUDIO || st->total_brate >= (MIN_BWE_PRI_BRATE+600))*/ + || ( st->total_brate >= MIN_MIN_BRATE_LRTD_SWB_BWE && st->element_mode == IVAS_CPE_TD && st->bwidth == SWB && st->tdm_LRTD_flag ) || ( element_brate < IVAS_16k4 && st->total_brate >= MIN_MIN_BRATE_LRTD_SWB_BWE && st->element_mode == IVAS_CPE_TD && st->bwidth == SWB ) ) + { + if ( ( ( ( st->sp_aud_decision1 == 1 && st->sp_aud_decision2 == 0 ) || st->coder_type == INACTIVE ) && !st->GSC_noisy_speech ) /* Note: SWB BWE is not used for GSC noisy speech */ ) + { + st->extl = SWB_BWE; + st->extl_brate = SWB_BWE_1k6; + + if ( st->bwidth == FB ) + { + st->extl = FB_BWE; + st->extl_brate = FB_BWE_1k8; + } + } + else + { + st->extl = SWB_TBE; + st->extl_brate = SWB_TBE_1k6; + + if ( st->total_brate >= MIN_BRATE_SWB_TBE_2k80 && st->flag_ACELP16k && st->element_mode == IVAS_SCE ) + { + st->extl_brate = SWB_TBE_2k8; + } + else if ( st->tdm_LRTD_flag == 1 && st->element_mode == IVAS_CPE_TD ) + { + if ( st->element_brate < IVAS_24k4 ) + { + st->extl_brate = SWB_TBE_1k10; + } + else + { + st->extl_brate = SWB_TBE_1k75; + } + } + else if ( st->total_brate < MIN_BRATE_SWB_TBE_1k60 ) + { + st->extl_brate = SWB_TBE_0k95; + } + + if ( st->bwidth == FB ) + { + st->extl = FB_TBE; + st->extl_brate = FB_TBE_1k8; + + if ( st->total_brate >= MIN_BRATE_SWB_TBE_2k80 && st->flag_ACELP16k && st->element_mode == IVAS_SCE ) + { + st->extl_brate = FB_TBE_3k0; + } + } + } + } + else + { + st->extl = WB_BWE; + st->extl_brate = 0; + } + + /* set IC-BWE bitrate */ + if ( st->element_mode == IVAS_CPE_TD && ( st->idchan == 0 ) && !st->tdm_LRTD_flag ) + { + icbwe_brate = STEREO_BITS_ICBWE * FRAMES_PER_SEC; + if ( st->flag_ACELP16k == 0 ) + { + icbwe_brate = ( STEREO_BITS_ICBWE - STEREO_ICBWE_SPBITS ) * FRAMES_PER_SEC; + } + } + else if ( st->element_mode == IVAS_CPE_DFT ) + { + icbwe_brate = STEREO_BITS_ICBWE_DFT * FRAMES_PER_SEC; + if ( st->flag_ACELP16k == 0 ) + { + icbwe_brate = ( STEREO_BITS_ICBWE_DFT - STEREO_ICBWE_SPBITS ) * FRAMES_PER_SEC; + } + } + + if ( st->element_mode >= IVAS_CPE_DFT && st->core == ACELP_CORE && ( st->extl == SWB_TBE || st->extl == FB_TBE ) && !( st->element_mode == IVAS_CPE_TD && st->tdm_LRTD_flag ) ) + { + icbwe_brate += STEREO_ICBWE_MSFLAG_BITS * FRAMES_PER_SEC; + } + } + } + + /* set core bitrate */ + st->core_brate = st->total_brate - st->extl_brate - icbwe_brate; + + if ( st->ini_frame == 0 ) + { + /* avoid core switching in the very first frame */ + st->last_core = st->core; + st->last_core_brate = st->core_brate; + st->last_extl = st->extl; + } + + /*-----------------------------------------------------------------* + * set inactive coder_type flag in ACELP core + *-----------------------------------------------------------------*/ + + st->inactive_coder_type_flag = 0; /* AVQ by default */ + if ( st->total_brate <= MAX_GSC_INACTIVE_BRATE ) + { + st->inactive_coder_type_flag = 1; /* GSC */ + } + + return; +} + + +/*---------------------------------------------------------------------* + * ivas_signaling_enc() + * + * write signaling information of SCE/CPE mode into the bitstream + *---------------------------------------------------------------------*/ + +void ivas_signaling_enc( + Encoder_State *st, /* i/o: encoder state structure */ + const int16_t MCT_flag, /* i : hMCT handle allocated (1) or not (0) */ + const int32_t element_brate, /* i : element bitrate */ + const int16_t tdm_SM_or_LRTD_Pri, /* i : channel combination scheme flag in TD stereo OR LRTD primary channel */ + const int16_t tdm_Pitch_reuse_flag /* i : primary channel pitch reuse flag in TD stereo */ +) +{ + int16_t ind; + BSTR_ENC_HANDLE hBstr = st->hBstr; + + if ( st->element_mode == IVAS_CPE_TD && st->idchan == 1 ) + { + /* minimal signaling for the secondary channel, most of the parameters are deduced from the primary channel */ + signaling_enc_secondary( st, tdm_SM_or_LRTD_Pri, tdm_Pitch_reuse_flag ); + } + else if ( st->element_mode == IVAS_SCE && st->low_rate_mode ) + { + /* ISM Low-rate mode -> do nothing -> always WB, ACELP core, IC coder_type */ + } + else if ( ( st->element_mode == IVAS_CPE_MDCT && st->idchan == 1 ) || st->core_brate <= SID_2k40 ) + { + /* do nothing */ + } + else + { + if ( st->idchan == 0 ) + { + /*-------------------------------------------------------------------------- + * Write element mode info + *--------------------------------------------------------------------------*/ + + if ( ( st->element_mode == IVAS_CPE_DFT || st->element_mode == IVAS_CPE_TD ) && !MCT_flag ) /* note: in MCT, the MDCT stereo is used exclusively */ + { + ind = st->element_mode - IVAS_CPE_DFT; + push_indice( hBstr, IND_SMODE, ind, NBITS_ELEMENT_MODE ); + } + + /*-------------------------------------------------------------------------- + * Write band-width info + *--------------------------------------------------------------------------*/ + + if ( st->element_mode == IVAS_SCE && element_brate < MIN_BRATE_SWB_SCE ) + { + /* only WB is supported */ + } + else if ( ( element_brate < MIN_BRATE_FB_STEREO && !st->is_ism_format ) || + ( element_brate < MIN_BRATE_FB_ISM && st->is_ism_format ) ) + { + /* WB and SWB are supported */ + ind = st->bwidth - WB; + push_indice( hBstr, IND_BWIDTH, ind, 1 ); + } + else + { + /* WB, SWB and FB are supported */ + push_indice( hBstr, IND_BWIDTH, st->bwidth, NBITS_BWIDTH ); + } + + if ( st->element_mode != IVAS_CPE_MDCT ) + { + /*-------------------------------------------------------------------------- + * Write ACELP/MDCT core selection bit + *--------------------------------------------------------------------------*/ + + if ( st->element_mode == IVAS_CPE_TD || st->total_brate >= STEREO_TCX_MIN_RATE ) + { + if ( st->core == ACELP_CORE ) + { + push_indice( hBstr, IND_CORE, 0, 1 ); + } + else + { + push_indice( hBstr, IND_CORE, 1, 1 ); + } + } + + /*-------------------------------------------------------------------------- + * Write core dependent signaling + *--------------------------------------------------------------------------*/ + + if ( st->core == ACELP_CORE ) + { + if ( element_brate < FRMT_SHP_MIN_BRATE_IVAS ) + { + push_indice( hBstr, IND_ACELP_SIGNALLING, st->coder_type, 3 ); + } + else + { + /* write coder type */ + push_indice( hBstr, IND_ACELP_SIGNALLING, st->coder_type, 3 ); + + /* write sharpening flag */ + push_indice( hBstr, IND_SHARP_FLAG, st->sharpFlag, 1 ); + } + + /* write extension layer flag to distinguish between TBE (0) and BWE (1) */ + if ( st->extl_brate > 0 ) + { + if ( st->extl == WB_TBE || st->extl == SWB_TBE || st->extl == FB_TBE ) + { + push_indice( hBstr, IND_BWE_FLAG, 0, 1 ); + } + else if ( st->extl == WB_BWE || st->extl == SWB_BWE || st->extl == FB_BWE ) + { + push_indice( hBstr, IND_BWE_FLAG, 1, 1 ); + } + } + } + else /* MDCT core */ + { + /* write TCX/HQ selection flag */ + if ( st->core == HQ_CORE ) + { + push_indice( hBstr, IND_MDCT_CORE, 0, 1 ); + } + else /* TCX20/TCX10 core */ + { + push_indice( hBstr, IND_MDCT_CORE, 1, 1 ); + } + + if ( st->core == HQ_CORE ) + { + if ( st->last_core == ACELP_CORE ) + { + push_indice( hBstr, IND_HQ_SWITCHING_FLG, 1, 1 ); + } + else + { + push_indice( hBstr, IND_HQ_SWITCHING_FLG, 0, 1 ); + } + } + } + } /* element_mode != IVAS_CPE_MDCT */ + } + } + + return; +} diff --git a/lib_enc/ivas_dirac_enc.c b/lib_enc/ivas_dirac_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..e8e770970787c0dc427bde8ee0b0f468ccfeabfd --- /dev/null +++ b/lib_enc/ivas_dirac_enc.c @@ -0,0 +1,986 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_cnst.h" +#include "ivas_rom_com.h" +#include "wmc_auto.h" + +/*------------------------------------------------------------------------- + * Local function prototypes + *------------------------------------------------------------------------*/ + +static void computeIntensityVector_enc( DIRAC_ENC_HANDLE hDirAC, float Cldfb_RealBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], float Cldfb_ImagBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], const int16_t enc_param_start_band, const int16_t num_frequency_bands, float intensity_real[DIRAC_NUM_DIMS][DIRAC_MAX_NBANDS] ); + + +/*------------------------------------------------------------------------- + * ivas_dirac_enc_open() + * + * Initialize DirAC handle + *------------------------------------------------------------------------*/ + +ivas_error ivas_dirac_enc_open( + Encoder_Struct *st_ivas /* i/o: IVAS encoder handle */ +) +{ + int16_t i, j; + DIRAC_ENC_HANDLE hDirAC; + int32_t dirac_slot_ns; + ivas_error error; + + error = IVAS_ERR_OK; + + if ( ( hDirAC = (DIRAC_ENC_HANDLE) malloc( sizeof( DIRAC_ENC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + + if ( ( hDirAC->hConfig = (DIRAC_CONFIG_DATA_HANDLE) malloc( sizeof( DIRAC_CONFIG_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC Config\n" ) ); + } + hDirAC->firstrun_sector_params = 1; + set_zero( hDirAC->sec_I_vec_smth_x[0], NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS ); + set_zero( hDirAC->sec_I_vec_smth_y[0], NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS ); + set_zero( hDirAC->sec_I_vec_smth_z[0], NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS ); + set_zero( hDirAC->azi_prev, NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS ); + set_zero( hDirAC->ele_prev, NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS ); + set_zero( hDirAC->energy_smth[0], NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS ); + /*-----------------------------------------------------------------* + * DirAC main configuration + *-----------------------------------------------------------------*/ + + st_ivas->hDirAC = hDirAC; + + if ( ( error = ivas_dirac_config( (void *) st_ivas, ENC ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* set FB config. */ + hDirAC->hFbMixer = NULL; + + for ( i = 0; i < DIRAC_MAX_NBANDS + 1; i++ ) + { + /* adapt band grouping to from CLDFB to MDFT bands */ + hDirAC->band_grouping[i] *= CLDFB_TO_MDFT_FAC; + } + dirac_slot_ns = DIRAC_SLOT_ENC_NS; + + /* initialize delay for SPAR/DirAC delay synchronization */ + + /* intensity 3-dim */ + for ( i = 0; i < DIRAC_NUM_DIMS; i++ ) + { + if ( ( hDirAC->direction_vector_m[i] = (float **) malloc( MAX_PARAM_SPATIAL_SUBFRAMES * sizeof( float * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + + for ( j = 0; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++ ) + { + if ( ( hDirAC->direction_vector_m[i][j] = (float *) malloc( DIRAC_MAX_NBANDS * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + set_f( hDirAC->direction_vector_m[i][j], 0.0f, DIRAC_MAX_NBANDS ); + } + } + + hDirAC->no_col_avg_diff = (int16_t) ( DIRAC_NO_COL_AVG_DIFF_NS / dirac_slot_ns ); + for ( i = 0; i < DIRAC_NUM_DIMS; i++ ) + { + if ( ( hDirAC->buffer_intensity_real[i] = (float **) malloc( hDirAC->no_col_avg_diff * sizeof( float * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + for ( j = 0; j < hDirAC->no_col_avg_diff; j++ ) + { + if ( ( hDirAC->buffer_intensity_real[i][j] = (float *) malloc( DIRAC_MAX_NBANDS * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + set_f( hDirAC->buffer_intensity_real[i][j], 0.0f, DIRAC_MAX_NBANDS ); + } + } + + if ( ( hDirAC->buffer_energy = (float *) malloc( DIRAC_MAX_NBANDS * hDirAC->no_col_avg_diff * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + set_f( hDirAC->buffer_energy, 0.0f, DIRAC_MAX_NBANDS * hDirAC->no_col_avg_diff ); + + if ( st_ivas->hQMetaData->useLowerRes ) + { + hDirAC->block_grouping[0] = 0; + hDirAC->block_grouping[1] = MAX_PARAM_SPATIAL_SUBFRAMES; + } + else + { + mvs2s( DirAC_block_grouping_5ms_MDFT, hDirAC->block_grouping, MAX_PARAM_SPATIAL_SUBFRAMES + 1 ); + } + + hDirAC->index_buffer_intensity = 0; + hDirAC->mono_frame_count = 0; + + st_ivas->hDirAC = hDirAC; + st_ivas->hSpar->enc_param_start_band = st_ivas->hDirAC->hConfig->enc_param_start_band; + + return error; +} + + +/*------------------------------------------------------------------------- + * ivas_dirac_enc_reconfigure() + * + * Reconfigure DirAC handle + *------------------------------------------------------------------------*/ + +ivas_error ivas_dirac_enc_reconfigure( + Encoder_Struct *st_ivas /* i/o: IVAS encoder handle */ +) +{ + DIRAC_ENC_HANDLE hDirAC; + ivas_error error; + + error = IVAS_ERR_OK; + + hDirAC = st_ivas->hDirAC; + + /*-----------------------------------------------------------------* + * DirAC main configuration + *-----------------------------------------------------------------*/ + + if ( ( error = ivas_dirac_config( (void *) st_ivas, ENC ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( st_ivas->hQMetaData->useLowerRes ) + { + hDirAC->block_grouping[0] = 0; + hDirAC->block_grouping[1] = MAX_PARAM_SPATIAL_SUBFRAMES; + } + else + { + mvs2s( DirAC_block_grouping_5ms_MDFT, hDirAC->block_grouping, MAX_PARAM_SPATIAL_SUBFRAMES + 1 ); + } + + return error; +} + + +/*------------------------------------------------------------------------- + * ivas_dirac_enc_close() + * + * Close DirAC encoder handle + *------------------------------------------------------------------------*/ + +void ivas_dirac_enc_close( + DIRAC_ENC_HANDLE *hDirAC_out, /* i/o: encoder DirAC handle */ + const int32_t input_Fs /* i : input sampling rate */ +) +{ + int16_t i, j; + DIRAC_ENC_HANDLE hDirAC; + + if ( hDirAC_out == NULL || *hDirAC_out == NULL ) + { + return; + } + + hDirAC = *hDirAC_out; + + if ( hDirAC->hFbMixer != NULL ) + { + ivas_FB_mixer_close( &hDirAC->hFbMixer, input_Fs, 0 ); + } + /* intensity 3-dim */ + for ( i = 0; i < DIRAC_NUM_DIMS; i++ ) + { + for ( j = 0; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++ ) + { + free( hDirAC->direction_vector_m[i][j] ); + hDirAC->direction_vector_m[i][j] = NULL; + } + + for ( j = 0; j < hDirAC->no_col_avg_diff; j++ ) + { + if ( hDirAC->buffer_intensity_real[i][j] != 0 ) + { + free( hDirAC->buffer_intensity_real[i][j] ); + hDirAC->buffer_intensity_real[i][j] = NULL; + } + } + + free( hDirAC->buffer_intensity_real[i] ); + hDirAC->buffer_intensity_real[i] = NULL; + + free( hDirAC->direction_vector_m[i] ); + hDirAC->direction_vector_m[i] = NULL; + } + + free( hDirAC->buffer_energy ); + hDirAC->buffer_energy = NULL; + + if ( hDirAC->hConfig != NULL ) + { + free( hDirAC->hConfig ); + hDirAC->hConfig = NULL; + } + + free( *hDirAC_out ); + *hDirAC_out = NULL; + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_dirac_enc() + * + * DirAC Encoder + * + *------------------------------------------------------------------------*/ + +ivas_error ivas_dirac_enc( + DIRAC_ENC_HANDLE hDirAC, /* i/o: encoder DirAC handle */ + IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ + BSTR_ENC_HANDLE hMetaData, /* i/o: Metadata bitstream handle */ + float *data_f[], /* i/o: SBA channels */ + float **ppIn_FR_real, /* o : real freq domain values */ + float **ppIn_FR_imag, /* o : imag freq domain values */ + const int16_t input_frame, /* i : input frame length */ + const int16_t dtx_vad, /* i : DTX vad flag */ + const IVAS_FORMAT ivas_format, /* i : ivas format */ + const int16_t hodirac_flag /* i : hodirac flag */ +) +{ + int16_t orig_dirac_bands; + float dir[3], avg_dir[3]; + float energySum, vecLen; + int16_t i, j, b, i_ts; + ivas_error error; + push_wmops( "ivas_dirac_enc" ); + + ivas_dirac_param_est_enc( hDirAC, hQMetaData->q_direction, hQMetaData->useLowerRes, data_f, ppIn_FR_real, ppIn_FR_imag, input_frame, ivas_format, hodirac_flag, hodirac_flag ? HOA2_CHANNELS : FOA_CHANNELS, &( hDirAC->mono_frame_count ), &( hQMetaData->dirac_mono_flag ) ); + + if ( hQMetaData->q_direction->cfg.nbands > 0 ) + { + orig_dirac_bands = hQMetaData->q_direction[0].cfg.nbands; + + if ( dtx_vad == 1 ) + { + /* WB 4TC mode bit : disable for now*/ + push_next_indice( hMetaData, 0, 1 ); + + /* Set Energy Ratio to 0.0 if the mono flag is set, before the metadata is encoded */ + if ( hQMetaData->dirac_mono_flag ) + { + for ( b = hQMetaData->q_direction->cfg.start_band; b < hQMetaData->q_direction->cfg.nbands; b++ ) + { + for ( i_ts = 0; i_ts < ( ( dtx_vad == 1 ) ? hQMetaData->q_direction[0].cfg.nblocks : 1 ); i_ts++ ) + { + hQMetaData->q_direction[0].band_data[b].energy_ratio[i_ts] = 0.0f; + hQMetaData->q_direction[0].band_data[b].azimuth[i_ts] = 0.0f; + hQMetaData->q_direction[0].band_data[b].elevation[i_ts] = 0.0f; + } + } + } + + if ( ( error = ivas_qmetadata_enc_encode( hMetaData, hQMetaData, hodirac_flag ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + hQMetaData->q_direction[0].cfg.nbands = DIRAC_DTX_BANDS; + + /* compute directions */ + for ( i = 0; i < hQMetaData->q_direction[0].cfg.nblocks; i++ ) + { + set_zero( dir, 3 ); + set_zero( avg_dir, 3 ); + energySum = 0.0f; + + /* combine all DirAC bands except the last one, handle last band separately, last band covers BW above WB */ + for ( j = 0; j < orig_dirac_bands - 1; j++ ) + { + ivas_qmetadata_azimuth_elevation_to_direction_vector( hQMetaData->q_direction[0].band_data[j].azimuth[i], hQMetaData->q_direction[0].band_data[j].elevation[i], &dir[0] ); + vecLen = hQMetaData->q_direction[0].band_data[j].energy_ratio[i] * hDirAC->buffer_energy[i * orig_dirac_bands + j]; + + avg_dir[0] += dir[0] * vecLen; + avg_dir[1] += dir[1] * vecLen; + avg_dir[2] += dir[2] * vecLen; + + energySum += hDirAC->buffer_energy[i * orig_dirac_bands + j]; + } + + ivas_qmetadata_direction_vector_to_azimuth_elevation( &avg_dir[0], &hQMetaData->q_direction[0].band_data[0].azimuth[i], &hQMetaData->q_direction[0].band_data[0].elevation[i] ); + hQMetaData->q_direction[0].band_data[0].energy_ratio[i] = sqrtf( dotp( avg_dir, avg_dir, 3 ) ) / ( energySum + EPSILON ); + + hQMetaData->q_direction[0].band_data[1].azimuth[i] = hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].azimuth[i]; + hQMetaData->q_direction[0].band_data[1].elevation[i] = hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].elevation[i]; + hQMetaData->q_direction[0].band_data[1].energy_ratio[i] = hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].energy_ratio[i]; + } + + /* 1 bit to indicate mode MD coding : temp solution*/ + push_next_indice( hMetaData, 1, 1 ); + + /* encode SID parameters */ + ivas_qmetadata_enc_sid_encode( hMetaData, hQMetaData, -1, SBA_FORMAT ); + } + + for ( b = hQMetaData->q_direction->cfg.start_band; b < hQMetaData->q_direction->cfg.nbands; b++ ) + { + for ( i_ts = 0; i_ts < ( ( dtx_vad == 1 ) ? hQMetaData->q_direction[0].cfg.nblocks : 1 ); i_ts++ ) + { + hQMetaData->q_direction->band_data[b].azimuth[i_ts] = hQMetaData->q_direction->band_data[b].q_azimuth[i_ts]; + hQMetaData->q_direction->band_data[b].elevation[i_ts] = hQMetaData->q_direction->band_data[b].q_elevation[i_ts]; + hQMetaData->q_direction[0].band_data[b].energy_ratio[0] = 1.0f - diffuseness_reconstructions[hQMetaData->q_direction[0].band_data[b].energy_ratio_index[0]]; + } + } + + if ( dtx_vad == 0 ) + { + for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + { + hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].azimuth[i] = hQMetaData->q_direction[0].band_data[1].azimuth[0]; + hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].elevation[i] = hQMetaData->q_direction[0].band_data[1].elevation[0]; + hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].energy_ratio[i] = hQMetaData->q_direction[0].band_data[1].energy_ratio[0]; + } + + for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + { + for ( j = orig_dirac_bands - 2; j >= 0; j-- ) + { + hQMetaData->q_direction[0].band_data[j].azimuth[i] = hQMetaData->q_direction[0].band_data[0].azimuth[0]; + hQMetaData->q_direction[0].band_data[j].elevation[i] = hQMetaData->q_direction[0].band_data[0].elevation[0]; + hQMetaData->q_direction[0].band_data[j].energy_ratio[i] = hQMetaData->q_direction[0].band_data[0].energy_ratio[0]; + } + } + + hQMetaData->q_direction->cfg.nbands = orig_dirac_bands; + } + } + pop_wmops(); + + return IVAS_ERR_OK; +} + + +/*------------------------------------------------------------------------- + * ivas_dirac_get_mono_flag() + * + * + *-------------------------------------------------------------------------*/ + +static int16_t ivas_dirac_get_mono_flag( + const int16_t *band_grouping, /* i : Band grouping for estimation */ + float Cldfb_RealBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], /* i : Real part of input signal */ + float Cldfb_ImagBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], /* i : Imag part of input signal */ + const int16_t nchan_ana, /* i : number of analysis channels */ + int16_t *mono_frame_count ) /* i/o: current number of mono frames count */ +{ + int16_t brange[2]; + int16_t i, j, ch_idx; + float other_ch_band_power; + float W_band_power; + int16_t any_mc_band = 0; + int16_t any_mono_band = 0; + int16_t local_mono_flag = 0; + float W_band_power_norm; + float threshold = 0; + + /* Banded Power Calculations */ + for ( i = 0; i < DIRAC_MAX_NBANDS; i++ ) + { + W_band_power = 0; + other_ch_band_power = 0; + + brange[0] = band_grouping[i]; + brange[1] = band_grouping[i + 1]; + + /* Loop over the W channel bins to calculate the power in the band */ + for ( j = brange[0]; j < brange[1]; j++ ) + { + W_band_power += ( Cldfb_RealBuffer[0][j] * Cldfb_RealBuffer[0][j] ) + ( Cldfb_ImagBuffer[0][j] * Cldfb_ImagBuffer[0][j] ); + } + + /* Loop over the other channels and bins to calculate the power in the band */ + for ( ch_idx = 1; ch_idx < nchan_ana; ch_idx++ ) + { + /* abs()^2 */ + for ( j = brange[0]; j < brange[1]; j++ ) + { + other_ch_band_power += ( Cldfb_RealBuffer[ch_idx][j] * Cldfb_RealBuffer[ch_idx][j] ) + ( Cldfb_ImagBuffer[ch_idx][j] * Cldfb_ImagBuffer[ch_idx][j] ); + } + } + if ( other_ch_band_power < EPSILON ) + { + if ( W_band_power > DIRAC_MONO_THRESH_SILENCE ) + { + any_mono_band = 1; + } + } + else + { + if ( ( W_band_power > DIRAC_MONO_THRESH_SILENCE ) || ( other_ch_band_power > DIRAC_MONO_THRESH_SILENCE ) ) + { + W_band_power_norm = min( W_band_power, DIRAC_MONO_NORM_FACTOR ) * DIRAC_MONO_ONE_ON_NORM_FACTOR; + threshold = max( W_band_power_norm * DIRAC_MONO_MAX_THRESH, DIRAC_MONO_MIN_THRESH ); + if ( W_band_power / other_ch_band_power > threshold ) + { + any_mono_band = 1; + } + else + { + any_mc_band = 1; + } + } + } + } + + /* If any band contains multi-channel content it's not mono */ + if ( any_mc_band ) + { + local_mono_flag = 0; + } + else + { + /* If any band contains mono content the frame is mono. */ + if ( any_mono_band ) + { + local_mono_flag = 1; + } + } + + /* Hysteresis - only after DIRAC_MONO_FRAME_THRESH frames on mono will the actual mono flag be set */ + if ( local_mono_flag ) + { + if ( *mono_frame_count < DIRAC_MONO_FRAME_THRESH ) + { + ( *mono_frame_count )++; + } + } + else + { + /* Instantaneously disable actual mono flag if multi-channel content is observed */ + if ( any_mc_band ) + { + *mono_frame_count = 0; + } + } + + /* Final check if there has been mono for DIRAC_MONO_FRAME_THRESH number of frames than the content is declared mono */ + if ( *mono_frame_count == DIRAC_MONO_FRAME_THRESH ) + { + return 1; + } + else + { + return 0; + } +} + + +/*------------------------------------------------------------------------- + * computeReferencePower_enc() + * + * + *-------------------------------------------------------------------------*/ + +void computeReferencePower_enc( + const int16_t *band_grouping, /* i : Band grouping for estimation */ + float Cldfb_RealBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], /* i : Real part of input signal */ + float Cldfb_ImagBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], /* i : Imag part of input signal */ + float *reference_power, /* o : Estimated power */ + const int16_t enc_param_start_band, /* i : first band to process */ + const int16_t num_freq_bands, /* i : Number of frequency bands */ + const IVAS_FORMAT ivas_format, /* i : ivas_format */ + int16_t ref_power_w, /* i : use 0 if hodirac is enabled */ + const int16_t nchan_ana, /* i : number of analysis channels */ + int16_t *mono_frame_count, /* i/o: Mono Frame Count */ + int16_t *dirac_mono_flag /* i/o: Mono Flag */ +) +{ + int16_t brange[2]; + int16_t ch_idx, i, j; + float reference_power_W[DIRAC_MAX_NBANDS]; + + if ( dirac_mono_flag != NULL ) + { + *dirac_mono_flag = ivas_dirac_get_mono_flag( band_grouping, Cldfb_RealBuffer, Cldfb_ImagBuffer, nchan_ana, mono_frame_count ); + } + + for ( i = 0; i < num_freq_bands; i++ ) + { + brange[0] = band_grouping[i + enc_param_start_band]; + brange[1] = band_grouping[i + enc_param_start_band + 1]; + + reference_power[i] = 0; + + reference_power_W[i] = 0; + for ( j = brange[0]; j < brange[1]; j++ ) + { + reference_power_W[i] += ( Cldfb_RealBuffer[0][j] * Cldfb_RealBuffer[0][j] ) + ( Cldfb_ImagBuffer[0][j] * Cldfb_ImagBuffer[0][j] ); + } + reference_power[i] += reference_power_W[i]; + + for ( ch_idx = 1; ch_idx < nchan_ana; ch_idx++ ) + { + /* abs()^2 */ + for ( j = brange[0]; j < brange[1]; j++ ) + { + reference_power[i] += ( Cldfb_RealBuffer[ch_idx][j] * Cldfb_RealBuffer[ch_idx][j] ) + ( Cldfb_ImagBuffer[ch_idx][j] * Cldfb_ImagBuffer[ch_idx][j] ); + } + } + } + + v_multc( reference_power, 0.5f, reference_power, num_freq_bands ); + + if ( ivas_format == SBA_FORMAT && ref_power_w == 1 ) + { + for ( i = 0; i < num_freq_bands; i++ ) + { + reference_power[i] = max( reference_power[i], reference_power_W[i] ); + } + } + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_dirac_param_est_enc() + * + * + *------------------------------------------------------------------------*/ + +void ivas_dirac_param_est_enc( + DIRAC_ENC_HANDLE hDirAC, + IVAS_QDIRECTION *q_direction, + const uint8_t useLowerRes, + float *data_f[], + float **pp_fr_real, + float **pp_fr_imag, + const int16_t input_frame, + const IVAS_FORMAT ivas_format, + const int16_t hodirac_flag, + const int16_t nchan_fb_in, + int16_t *mono_frame_count, + int16_t *dirac_mono_flag ) +{ + int16_t i, d, ts, index, l_ts, num_freq_bands; + int16_t band_m_idx, block_m_idx; + float dir_v[DIRAC_NUM_DIMS]; + float *pcm_in[DIRAC_MAX_ANA_CHANS]; + float Cldfb_RealBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX]; + float Cldfb_ImagBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX]; + float *p_Cldfb_RealBuffer[DIRAC_MAX_ANA_CHANS]; + float *p_Cldfb_ImagBuffer[DIRAC_MAX_ANA_CHANS]; + float intensity_real[DIRAC_NUM_DIMS][DIRAC_MAX_NBANDS]; + float direction_vector[DIRAC_NUM_DIMS][DIRAC_MAX_NBANDS]; + float diffuseness_vector[DIRAC_MAX_NBANDS]; + float renormalization_factor[DIRAC_MAX_NBANDS]; + float renormalization_factor_diff[DIRAC_MAX_NBANDS]; + float norm_tmp; + int16_t mrange[2]; + int16_t num_blocks; + float reference_power[CLDFB_NO_COL_MAX][DIRAC_NO_FB_BANDS_MAX]; + float azi_secs[2 * DIRAC_MAX_ANA_CHANS * DIRAC_MAX_NBANDS]; + float ele_secs[2 * DIRAC_MAX_ANA_CHANS * DIRAC_MAX_NBANDS]; + float diff_secs[2 * DIRAC_MAX_ANA_CHANS * DIRAC_MAX_NBANDS]; + float ene_secs[2 * DIRAC_MAX_ANA_CHANS * DIRAC_MAX_NBANDS]; + + push_wmops( "dirac_enc_param_est" ); + num_freq_bands = hDirAC->hConfig->nbands; + + /* Initialization */ + l_ts = input_frame / MAX_PARAM_SPATIAL_SUBFRAMES; + if ( useLowerRes ) + { + q_direction->cfg.nblocks = 1; + num_blocks = 1; + } + else + { + q_direction->cfg.nblocks = MAX_PARAM_SPATIAL_SUBFRAMES; + num_blocks = MAX_PARAM_SPATIAL_SUBFRAMES; + } + + /* Need to initialize renormalization_factors, direction_m and diffuseness_m */ + for ( i = 0; i < hDirAC->hConfig->nbands; i++ ) + { + renormalization_factor_diff[i] = 0; + hDirAC->diffuseness_m[i] = 0; + } + + set_zero( azi_secs, 2 * DIRAC_MAX_ANA_CHANS * DIRAC_MAX_NBANDS ); + set_zero( ele_secs, 2 * DIRAC_MAX_ANA_CHANS * DIRAC_MAX_NBANDS ); + set_zero( diff_secs, 2 * DIRAC_MAX_ANA_CHANS * DIRAC_MAX_NBANDS ); + set_zero( ene_secs, 2 * DIRAC_MAX_ANA_CHANS * DIRAC_MAX_NBANDS ); + + /* Copy current frame to memory for delay compensation */ + for ( i = 0; i < nchan_fb_in; i++ ) + { + pcm_in[i] = data_f[i]; + p_Cldfb_RealBuffer[i] = &Cldfb_RealBuffer[i][0]; + p_Cldfb_ImagBuffer[i] = &Cldfb_ImagBuffer[i][0]; + } + + /* do processing over all CLDFB time slots */ + for ( block_m_idx = 0; block_m_idx < num_blocks; block_m_idx++ ) + { + mrange[0] = hDirAC->block_grouping[block_m_idx]; + mrange[1] = hDirAC->block_grouping[block_m_idx + 1]; + + for ( band_m_idx = 0; band_m_idx < hDirAC->hConfig->nbands; band_m_idx++ ) + { + renormalization_factor[band_m_idx] = EPSILON; + hDirAC->direction_vector_m[0][block_m_idx][band_m_idx] = 0; + hDirAC->direction_vector_m[1][block_m_idx][band_m_idx] = 0; + hDirAC->direction_vector_m[2][block_m_idx][band_m_idx] = 0; + } + + for ( ts = mrange[0]; ts < mrange[1]; ts++ ) + { + if ( hDirAC->hFbMixer ) + { + ivas_fb_mixer_get_windowed_fr( hDirAC->hFbMixer, pcm_in, p_Cldfb_RealBuffer, p_Cldfb_ImagBuffer, l_ts, l_ts, hDirAC->hFbMixer->fb_cfg->num_in_chans ); + + ivas_fb_mixer_update_prior_input( hDirAC->hFbMixer, pcm_in, l_ts, hDirAC->hFbMixer->fb_cfg->num_in_chans ); + + for ( i = 0; i < nchan_fb_in; i++ ) + { + pcm_in[i] += l_ts; + } + } + else + { + for ( i = 0; i < nchan_fb_in; i++ ) + { + mvr2r( &pp_fr_real[i][ts * l_ts], Cldfb_RealBuffer[i], l_ts ); + mvr2r( &pp_fr_imag[i][ts * l_ts], Cldfb_ImagBuffer[i], l_ts ); + } + } + + computeReferencePower_enc( + hDirAC->band_grouping, + Cldfb_RealBuffer, + Cldfb_ImagBuffer, + reference_power[ts], + hDirAC->hConfig->enc_param_start_band, + num_freq_bands, + ivas_format, + hodirac_flag ? 0 : 1, + FOA_CHANNELS, + mono_frame_count, + dirac_mono_flag ); + + computeIntensityVector_enc( + hDirAC, + Cldfb_RealBuffer, + Cldfb_ImagBuffer, + hDirAC->hConfig->enc_param_start_band, + num_freq_bands, + intensity_real ); + + if ( !hodirac_flag ) + { + computeDirectionVectors( + intensity_real[0], + intensity_real[1], + intensity_real[2], + hDirAC->hConfig->enc_param_start_band, + num_freq_bands, + direction_vector[0], + direction_vector[1], + direction_vector[2] ); + } + + /* fill buffers of length "averaging_length" time slots for intensity and energy */ + hDirAC->index_buffer_intensity = ( hDirAC->index_buffer_intensity % hDirAC->no_col_avg_diff ) + 1; /* averaging_length = 32 */ + index = hDirAC->index_buffer_intensity; + for ( i = 0; i < DIRAC_NUM_DIMS; i++ ) + { + /* only real part needed */ + mvr2r( intensity_real[i], &( hDirAC->buffer_intensity_real[i][index - 1][0] ), num_freq_bands ); + } + mvr2r( reference_power[ts], &( hDirAC->buffer_energy[( index - 1 ) * num_freq_bands] ), num_freq_bands ); + + computeDiffuseness_mdft( hDirAC->buffer_intensity_real, hDirAC->buffer_energy, num_freq_bands, hDirAC->no_col_avg_diff, diffuseness_vector ); + + if ( hodirac_flag ) + { + calculate_hodirac_sector_parameters( + hDirAC, + Cldfb_RealBuffer, + Cldfb_ImagBuffer, + 0.20f, + hDirAC->band_grouping, + hDirAC->hConfig->nbands, + hDirAC->hConfig->enc_param_start_band, + azi_secs, + ele_secs, + diff_secs, + ene_secs ); + } + + if ( hodirac_flag ) + { + for ( band_m_idx = 0; band_m_idx < hDirAC->hConfig->nbands; band_m_idx++ ) + { + hDirAC->diffuseness_m[band_m_idx] += reference_power[ts][band_m_idx] * diffuseness_vector[band_m_idx]; + renormalization_factor_diff[band_m_idx] += reference_power[ts][band_m_idx]; + } + } + else + { + for ( band_m_idx = 0; band_m_idx < hDirAC->hConfig->nbands; band_m_idx++ ) + { + norm_tmp = reference_power[ts][band_m_idx] * ( 1 - diffuseness_vector[band_m_idx] ); + + hDirAC->direction_vector_m[0][block_m_idx][band_m_idx] += norm_tmp * direction_vector[0][band_m_idx]; + hDirAC->direction_vector_m[1][block_m_idx][band_m_idx] += norm_tmp * direction_vector[1][band_m_idx]; + hDirAC->direction_vector_m[2][block_m_idx][band_m_idx] += norm_tmp * direction_vector[2][band_m_idx]; + renormalization_factor[band_m_idx] += norm_tmp; + + hDirAC->diffuseness_m[band_m_idx] += reference_power[ts][band_m_idx] * diffuseness_vector[band_m_idx]; + renormalization_factor_diff[band_m_idx] += reference_power[ts][band_m_idx]; + } + } + } + + if ( !hodirac_flag ) + { + for ( band_m_idx = 0; band_m_idx < hDirAC->hConfig->nbands; band_m_idx++ ) + { + renormalization_factor[band_m_idx] = EPSILON; + for ( d = 0; d < DIRAC_NUM_DIMS; d++ ) + { + renormalization_factor[band_m_idx] += ( hDirAC->direction_vector_m[d][block_m_idx][band_m_idx] * hDirAC->direction_vector_m[d][block_m_idx][band_m_idx] ); + } + renormalization_factor[band_m_idx] = sqrtf( renormalization_factor[band_m_idx] ); + + if ( renormalization_factor[band_m_idx] > EPSILON ) + { + hDirAC->direction_vector_m[0][block_m_idx][band_m_idx] /= renormalization_factor[band_m_idx]; + hDirAC->direction_vector_m[1][block_m_idx][band_m_idx] /= renormalization_factor[band_m_idx]; + hDirAC->direction_vector_m[2][block_m_idx][band_m_idx] /= renormalization_factor[band_m_idx]; + } + else + { + hDirAC->direction_vector_m[0][block_m_idx][band_m_idx] = 1; + hDirAC->direction_vector_m[1][block_m_idx][band_m_idx] = 0; + hDirAC->direction_vector_m[2][block_m_idx][band_m_idx] = 0; + } + + /* save the elevation and azimuth values to be used later by the ivas_dirac_QuantizeParameters function */ + for ( d = 0; d < DIRAC_NUM_DIMS; d++ ) + { + dir_v[d] = hDirAC->direction_vector_m[d][block_m_idx][band_m_idx]; + } + + ivas_qmetadata_direction_vector_to_azimuth_elevation( + dir_v, + &q_direction->band_data[band_m_idx].azimuth[block_m_idx], + &q_direction->band_data[band_m_idx].elevation[block_m_idx] ); + } + } + + /* Sectors */ + if ( hodirac_flag ) + { + for ( band_m_idx = 0; band_m_idx < hDirAC->hConfig->nbands; band_m_idx++ ) + { + q_direction->band_data[band_m_idx].azimuth[block_m_idx] = azi_secs[band_m_idx]; + q_direction->band_data[band_m_idx].elevation[block_m_idx] = ele_secs[band_m_idx]; + // q_direction->band_data[band_m_idx].energy_ratio[block_m_idx] = 1.f - diffuseness_vector[band_m_idx]; // set later + + q_direction[1].band_data[band_m_idx].azimuth[block_m_idx] = azi_secs[num_freq_bands + band_m_idx]; + q_direction[1].band_data[band_m_idx].elevation[block_m_idx] = ele_secs[num_freq_bands + band_m_idx]; + q_direction[1].band_data[band_m_idx].energy_ratio[block_m_idx] = ( 1.f - diff_secs[band_m_idx] ) / ( ( 1.f - diff_secs[band_m_idx] ) + ( 1.f - diff_secs[num_freq_bands + band_m_idx] ) + EPSILON ); + } + } + } + + /* Diffuseness */ + for ( band_m_idx = 0; band_m_idx < hDirAC->hConfig->nbands; band_m_idx++ ) + { + if ( renormalization_factor_diff[band_m_idx] > EPSILON ) + { + hDirAC->diffuseness_m[band_m_idx] /= renormalization_factor_diff[band_m_idx]; + } + else + { + hDirAC->diffuseness_m[band_m_idx] = 0.f; + } + + /* set coherence to zero and convert diffuseness to energy ratio*/ + + set_f( q_direction->band_data[band_m_idx].energy_ratio, 1.f - hDirAC->diffuseness_m[band_m_idx], q_direction->cfg.nblocks ); + + for ( block_m_idx = 0; block_m_idx < q_direction->cfg.nblocks; block_m_idx++ ) + { + if ( q_direction->coherence_band_data != NULL ) + { + q_direction->coherence_band_data[band_m_idx].spread_coherence[block_m_idx] = 0; + } + } + } + + pop_wmops(); + return; +} + + +/*------------------------------------------------------------------------- + * computeIntensityVector_enc() + * + * + *------------------------------------------------------------------------*/ + +static void computeIntensityVector_enc( + DIRAC_ENC_HANDLE hDirAC, + float Cldfb_RealBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], /* i : Real part of input signal */ + float Cldfb_ImagBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], /* i : Imag part of input signal */ + const int16_t enc_param_start_band, + const int16_t num_frequency_bands, + float intensity_real[DIRAC_NUM_DIMS][DIRAC_MAX_NBANDS] ) +{ + /* Reminder + * X = a + ib; Y = c + id + * X*Y = ac - bd + i(ad +bc) + */ + int16_t i, j; + float real, img; + int16_t brange[2]; + + for ( i = 0; i < num_frequency_bands; i++ ) + { + brange[0] = hDirAC->band_grouping[i + enc_param_start_band]; + brange[1] = hDirAC->band_grouping[i + enc_param_start_band + 1]; + + intensity_real[0][i] = 0; + intensity_real[1][i] = 0; + intensity_real[2][i] = 0; + + for ( j = brange[0]; j < brange[1]; j++ ) + { + real = Cldfb_RealBuffer[0][j]; + img = Cldfb_ImagBuffer[0][j]; + intensity_real[0][i] += Cldfb_RealBuffer[3][j] * real + Cldfb_ImagBuffer[3][j] * img; + intensity_real[1][i] += Cldfb_RealBuffer[1][j] * real + Cldfb_ImagBuffer[1][j] * img; + intensity_real[2][i] += Cldfb_RealBuffer[2][j] * real + Cldfb_ImagBuffer[2][j] * img; + } + } + + return; +} + + +/*------------------------------------------------------------------------- + * computeDiffuseness_mdft() + * + * + *------------------------------------------------------------------------*/ + +void computeDiffuseness_mdft( + float **buffer_intensity[DIRAC_NUM_DIMS], + const float *buffer_energy, + const int16_t num_freq_bands, + const uint16_t no_col_avg_diff, + float *diffuseness ) +{ + float intensity_slow[DIRAC_NUM_DIMS * MASA_FREQUENCY_BANDS]; + float intensity_slow_abs[MASA_FREQUENCY_BANDS]; + float energy_slow[MASA_FREQUENCY_BANDS]; + int16_t i, j, k; + float tmp = 0; + float *p_tmp; + const float *p_tmp_c; + + /* Compute Intensity slow and energy slow */ + set_f( intensity_slow, 0.0f, DIRAC_NUM_DIMS * MASA_FREQUENCY_BANDS ); + set_f( intensity_slow_abs, 0.0f, MASA_FREQUENCY_BANDS ); + set_f( energy_slow, 0.0f, MASA_FREQUENCY_BANDS ); + + for ( i = 0; i < no_col_avg_diff; ++i ) + { + /* Energy slow */ + p_tmp_c = buffer_energy + i * num_freq_bands; + for ( k = 0; k < num_freq_bands; k++ ) + { + energy_slow[k] += *( p_tmp_c++ ); + } + + /* Intensity slow */ + for ( j = 0; j < DIRAC_NUM_DIMS; ++j ) + { + p_tmp = buffer_intensity[j][i]; + for ( k = 0; k < num_freq_bands; k++ ) + { + intensity_slow[j * num_freq_bands + k] += *( p_tmp++ ); + } + } + } + + /* intensity_slow.^2 + intensity_slow_abs*/ + for ( j = 0; j < DIRAC_NUM_DIMS; ++j ) + { + p_tmp = intensity_slow + j * num_freq_bands; + for ( k = 0; k < num_freq_bands; k++ ) + { + *( p_tmp ) *= ( *p_tmp ); + intensity_slow_abs[k] += *( p_tmp++ ); + } + } + + /* Compute Diffuseness */ + p_tmp = intensity_slow_abs; + for ( i = 0; i < num_freq_bands; ++i ) + { + tmp = sqrtf( *( p_tmp++ ) ) / ( energy_slow[i] + EPSILON ); + tmp = 1.0f - tmp; + diffuseness[i] = ( ( tmp < 1.0f ) ? ( ( tmp < 0.0f ) ? 0.f : tmp ) : 1.0f ); + } + + return; +} diff --git a/lib_enc/ivas_enc.c b/lib_enc/ivas_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..36fafd8af33b3226424b81a22d6699f968f1cb7c --- /dev/null +++ b/lib_enc/ivas_enc.c @@ -0,0 +1,534 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "cnst.h" +#include "ivas_cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_rom_com.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * ivas_enc() + * + * Principal IVAS encoder routine + *-------------------------------------------------------------------*/ + +ivas_error ivas_enc( + Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ + const int16_t *data, /* i : input signal */ + const int16_t n_samples /* i : number of input samples */ +) +{ + int16_t i, n, input_frame, n_samples_chan, nchan_inp; + int32_t input_Fs; + IVAS_FORMAT ivas_format; + ENCODER_CONFIG_HANDLE hEncoderConfig; + BSTR_ENC_HANDLE hMetaData; + int16_t nb_bits_metadata[MAX_SCE + 1]; + float *data_f[MAX_INPUT_CHANNELS + MAX_NUM_OBJECTS]; + int32_t ivas_total_brate; + ivas_error error; + error = IVAS_ERR_OK; + + push_wmops( "ivas_enc" ); + + /*------------------------------------------------------------------* + * Initialization - general + *-----------------------------------------------------------------*/ + + hEncoderConfig = st_ivas->hEncoderConfig; + + input_Fs = hEncoderConfig->input_Fs; + ivas_format = hEncoderConfig->ivas_format; + nchan_inp = hEncoderConfig->nchan_inp; + ivas_total_brate = hEncoderConfig->ivas_total_brate; + + input_frame = (int16_t) ( input_Fs / FRAMES_PER_SEC ); + n_samples_chan = n_samples / nchan_inp; + + set_s( nb_bits_metadata, 0, MAX_SCE + 1 ); + + /*----------------------------------------------------------------* + * convert 'short' input data to 'float' + *----------------------------------------------------------------*/ + + for ( n = 0; n < MAX_INPUT_CHANNELS + MAX_NUM_OBJECTS; n++ ) + { + data_f[n] = st_ivas->p_data_f[n]; + } + + n = 0; + while ( n < nchan_inp ) + { + for ( i = 0; i < n_samples_chan; i++ ) + { + data_f[n][i] = (float) data[i * nchan_inp + n]; + } + n++; + } + + if ( n_samples_chan < input_frame ) + { + for ( n = 0; n < nchan_inp; n++ ) + { + set_f( data_f[n] + n_samples_chan, 0.0f, input_frame - n_samples_chan ); + } + } + + + if ( ivas_format == SBA_FORMAT ) + { + if ( ( error = ivas_sba_enc_reconfigure( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( ivas_format == SBA_ISM_FORMAT ) + { + if ( ( error = ivas_osba_enc_reconfig( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /*----------------------------------------------------------------* + * HP filtering + *----------------------------------------------------------------*/ + + n = getNumChanAnalysis( st_ivas ); + + /* bypass EVS coding in float precision, emulating EVS encoder/decoder delay */ + for ( i = 0; i < n; i++ ) + { + if ( ( ivas_format == SBA_FORMAT ) && !( st_ivas->sba_analysis_order > 1 ) ) + { + hp20( data_f[HOA_keep_ind[st_ivas->hSpar->hMdEnc->HOA_md_ind[i]]], input_frame, st_ivas->mem_hp20_in[i], input_Fs ); + } + else if ( !( ivas_format == MC_FORMAT && i == LFE_CHANNEL ) ) + { + hp20( data_f[i], input_frame, st_ivas->mem_hp20_in[i], input_Fs ); + } + } + + /*----------------------------------------------------------------* + * write IVAS format signaling + *----------------------------------------------------------------*/ + + ivas_write_format( st_ivas ); + + /*----------------------------------------------------------------* + * Encoding + *----------------------------------------------------------------*/ + + if ( ivas_format == STEREO_FORMAT ) + { + st_ivas->hCPE[0]->element_brate = ivas_total_brate; + if ( ( error = ivas_cpe_enc( st_ivas, 0, data_f[0], data_f[1], input_frame, 0 /* no metadata */ ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( ivas_format == ISM_FORMAT ) + { + /* select ISM format mode; reconfigure the ISM format encoder */ + if ( ( error = ivas_ism_enc_config( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( st_ivas->ism_mode == ISM_MODE_PARAM ) + { + ivas_param_ism_enc( st_ivas, data_f, input_frame ); + + /* Stereo DMX generation */ + ivas_param_ism_stereo_dmx( st_ivas, data_f, input_frame ); + + /* Core coding of Stereo DMX */ + if ( ( error = ivas_ism_enc( st_ivas, data_f, input_frame, nb_bits_metadata, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->ism_mode == ISM_MODE_DISC ) + { + /* Analysis, decision about bitrates per channel & core coding */ + if ( ( error = ivas_ism_enc( st_ivas, data_f, input_frame, nb_bits_metadata, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + else if ( ivas_format == SBA_FORMAT || ivas_format == MASA_FORMAT ) + { + /* MASA configuration */ + if ( ivas_format == MASA_FORMAT ) + { + ivas_masa_enc_reconfigure( st_ivas ); + } + + /* SBA/MASA metadata encoding and SBA/MASA metadata bitstream writing */ + hMetaData = ( st_ivas->nSCE > 0 ) ? st_ivas->hSCE[st_ivas->nSCE - 1]->hMetaData : st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData; + + if ( st_ivas->hQMetaData != NULL && ivas_format == MASA_FORMAT ) + { + ivas_masa_estimate_energy( st_ivas->hMasa, data_f, input_frame, st_ivas->nchan_transport ); /* energy-estimation uses TF-resolution: 4x24 */ + + if ( ( error = ivas_masa_enc_config( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = ivas_masa_encode( st_ivas->hMasa, st_ivas->hQMetaData, hMetaData, &nb_bits_metadata[0], st_ivas->nchan_transport, ivas_format, ivas_total_brate, hEncoderConfig->Opt_DTX_ON, st_ivas->nchan_transport == 2 ? st_ivas->hCPE[0]->element_mode : -1, + ISM_MODE_NONE, -1, NULL, -1, NULL, 0, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( ivas_format == SBA_FORMAT ) + { + if ( ( error = ivas_spar_enc( st_ivas, data_f, input_frame, nb_bits_metadata, hMetaData ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( ivas_format == SBA_FORMAT ) + { + ivas_sba_getTCs( data_f, st_ivas, input_frame ); + } + + /* core-coding of transport channels */ + if ( st_ivas->nSCE == 1 ) + { + if ( ( error = ivas_sce_enc( st_ivas, 0, data_f[0], input_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->nCPE == 1 ) /* Stereo DMX */ + { + if ( ( error = ivas_cpe_enc( st_ivas, 0, data_f[0], data_f[1], input_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->nCPE > 1 ) /* FOA/HOA format */ + { + if ( ( error = ivas_mct_enc( st_ivas, data_f, input_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + else if ( ivas_format == MASA_ISM_FORMAT ) + { + float *data_separated_object; + int16_t idx_separated_object; + int16_t flag_omasa_ener_brate; + + flag_omasa_ener_brate = 0; + + /* Stereo transport is used also with monoMASA, duplicate mono if monoMASA */ + if ( ( st_ivas->hEncoderConfig->nchan_inp - hEncoderConfig->nchan_ism ) == 1 ) + { + v_multc( data_f[hEncoderConfig->nchan_ism], 1.0f / SQRT2, data_f[hEncoderConfig->nchan_ism], input_frame ); + mvr2r( data_f[hEncoderConfig->nchan_ism], data_f[hEncoderConfig->nchan_ism + 1], input_frame ); + } + + /* Estimate TF-tile energy for the input MASA stream */ + ivas_masa_estimate_energy( st_ivas->hMasa, &( data_f[hEncoderConfig->nchan_ism] ), input_frame, st_ivas->nchan_transport ); + + if ( ( error = ivas_omasa_enc_config( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + + set_s( nb_bits_metadata, 0, MAX_SCE + 1 ); + idx_separated_object = 0; + data_separated_object = data_f[hEncoderConfig->nchan_ism + CPE_CHANNELS]; + + /* put audio object data in SCE's */ + if ( st_ivas->ism_mode != ISM_MASA_MODE_DISC ) + { + /* Estimate MASA parameters for the objects */ + ivas_omasa_enc( st_ivas->hOMasa, st_ivas->hMasa, st_ivas->hIsmMetaData, data_f, input_frame, st_ivas->nchan_transport, hEncoderConfig->nchan_ism, st_ivas->ism_mode, data_separated_object, &idx_separated_object ); + } + + /* Encode ISMs transport channels */ + n = 0; + if ( st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) + { + if ( ( error = ivas_sce_enc( st_ivas, 0, data_separated_object, input_frame, nb_bits_metadata[1] ) ) != IVAS_ERR_OK ) /* there are no metadata bits in SCE in this mode */ + { + return error; + } + } + else if ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) + { + if ( ( error = ivas_ism_enc( st_ivas, &data_separated_object, input_frame, &nb_bits_metadata[1], 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC ) + { + flag_omasa_ener_brate = ivas_omasa_ener_brate( st_ivas->hEncoderConfig->nchan_ism, ivas_total_brate, data_f, input_frame ); + + /* Analysis, decision about bitrates per channel & core coding */ + if ( ( error = ivas_ism_enc( st_ivas, data_f, input_frame, &nb_bits_metadata[1], flag_omasa_ener_brate ) ) != IVAS_ERR_OK ) + { + return error; + } + n = st_ivas->hEncoderConfig->nchan_ism; + } + + hMetaData = st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData; + + if ( st_ivas->nSCE > 0 ) + { + /* update pointer to the buffer of indices (ISM indices were alredy written) */ + hMetaData->ind_list = st_ivas->hSCE[st_ivas->nSCE - 1]->hMetaData->ind_list + st_ivas->hSCE[st_ivas->nSCE - 1]->hMetaData->nb_ind_tot; + st_ivas->hCPE[0]->hCoreCoder[0]->hBstr->ind_list = st_ivas->hSCE[st_ivas->nSCE - 1]->hCoreCoder[0]->hBstr->ind_list + st_ivas->hSCE[st_ivas->nSCE - 1]->hCoreCoder[0]->hBstr->nb_ind_tot; + } + + /* Encode MASA parameters and write MASA metadata bitstream */ + if ( ( error = ivas_masa_encode( st_ivas->hMasa, st_ivas->hQMetaData, hMetaData, nb_bits_metadata, st_ivas->nchan_transport, ivas_format, ivas_total_brate, st_ivas->hEncoderConfig->Opt_DTX_ON, st_ivas->nchan_transport == 2 ? st_ivas->hCPE[0]->element_mode : -1, + st_ivas->ism_mode, hEncoderConfig->nchan_ism, st_ivas->hIsmMetaData, idx_separated_object, st_ivas->hOMasa, st_ivas->hIsmMetaData[0]->ism_imp, flag_omasa_ener_brate ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Configuration of combined-format bit-budget distribution */ + ivas_set_surplus_brate_enc( st_ivas ); + + /* Encode MASA transport channels */ + if ( ( ivas_cpe_enc( st_ivas, 0, data_f[n], data_f[n + 1], input_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( ivas_format == SBA_ISM_FORMAT ) + { + int16_t planar_sba_orig; + planar_sba_orig = hEncoderConfig->sba_planar; + + /* Analyze objects and determine needed audio signals */ + ivas_osba_enc( st_ivas->hOSba, st_ivas->hIsmMetaData, data_f, input_frame, hEncoderConfig->nchan_ism, st_ivas->ism_mode, st_ivas->sba_analysis_order, hEncoderConfig->input_Fs, hEncoderConfig->sba_planar ); + + if ( st_ivas->ism_mode == ISM_MODE_NONE ) + { + /*once SBA and ISM are combined into SBA signal then disable planar flag*/ + hEncoderConfig->sba_planar = 0; + if ( st_ivas->nchan_transport == 1 ) + { + hMetaData = st_ivas->hSCE[st_ivas->nSCE - 1]->hMetaData; + } + else + { + hMetaData = st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData; + } + + /* SBA metadata encoding and SBA metadata bitstream writing */ + if ( ( error = ivas_spar_enc( st_ivas, data_f, input_frame, nb_bits_metadata, hMetaData ) ) != IVAS_ERR_OK ) + { + return error; + } + + hEncoderConfig->sba_planar = planar_sba_orig; + } + else + { + n = hEncoderConfig->nchan_ism; + hMetaData = st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData; + + if ( ( error = ivas_ism_metadata_enc( &st_ivas->hEncoderConfig->ivas_total_brate, n, st_ivas->hEncoderConfig->nchan_ism, st_ivas->hIsmMetaData, NULL, hMetaData, &nb_bits_metadata[1], 0, st_ivas->ism_mode, NULL, st_ivas->hEncoderConfig->ism_extended_metadata_flag, -1, 0, NULL, st_ivas->hCPE[0]->hCoreCoder[0]->ini_frame ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* SBA metadata encoding and SBA metadata bitstream writing */ + if ( ( error = ivas_spar_enc( st_ivas, &data_f[n], input_frame, nb_bits_metadata, hMetaData ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* get SBA TCs */ + ivas_sba_getTCs( &data_f[n], st_ivas, input_frame ); + } + + /* core-coding of transport channels */ + if ( st_ivas->nSCE == 1 ) + { + if ( ( error = ivas_sce_enc( st_ivas, 0, data_f[0], input_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->nCPE == 1 ) /* Stereo DMX */ + { + if ( ( error = ivas_cpe_enc( st_ivas, 0, data_f[0], data_f[1], input_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->nCPE > 1 ) /* FOA/HOA format */ + { + if ( ( error = ivas_mct_enc( st_ivas, data_f, input_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + else if ( ivas_format == MC_FORMAT ) + { + /* select MC format mode; write MC LS setup; reconfigure the MC format encoder */ + if ( ( error = ivas_mc_enc_config( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + + hMetaData = ( st_ivas->nSCE > 0 ) ? st_ivas->hSCE[st_ivas->nSCE - 1]->hMetaData : st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData; + + /* LFE low pass filter */ + ivas_lfe_lpf_enc_apply( st_ivas->hLfeLpf, data_f[LFE_CHANNEL], input_frame ); + + /* LFE channel encoder */ + if ( st_ivas->mc_mode == MC_MODE_MCT ) + { + st_ivas->hLFE->hBstr = ( st_ivas->nSCE > 0 ) ? st_ivas->hSCE[0]->hCoreCoder[0]->hBstr : st_ivas->hCPE[0]->hCoreCoder[0]->hBstr; + + ivas_lfe_enc( st_ivas->hLFE, data_f[LFE_CHANNEL], input_frame, st_ivas->hLFE->hBstr ); + } + + if ( st_ivas->mc_mode == MC_MODE_MCT ) + { + if ( ( error = ivas_mct_enc( st_ivas, data_f, input_frame, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) + { + /* encode MC ParamUpmix parameters and write bitstream */ + ivas_mc_paramupmix_enc( st_ivas, hMetaData, data_f, input_frame ); + + st_ivas->hLFE->hBstr = ( st_ivas->nSCE > 0 ) ? st_ivas->hSCE[0]->hCoreCoder[0]->hBstr : st_ivas->hCPE[0]->hCoreCoder[0]->hBstr; + ivas_lfe_enc( st_ivas->hLFE, data_f[LFE_CHANNEL], input_frame, st_ivas->hLFE->hBstr ); + + if ( ( error = ivas_mct_enc( st_ivas, data_f, input_frame, hMetaData->nb_bits_tot ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->mc_mode == MC_MODE_PARAMMC ) + { + /* encode Parametric MC parameters and write bitstream */ + ivas_param_mc_enc( st_ivas, hMetaData, data_f, input_frame ); + + if ( st_ivas->nCPE == 1 ) /* Stereo DMX */ + { + if ( ( error = ivas_cpe_enc( st_ivas, 0, data_f[0], data_f[1], input_frame, hMetaData->nb_bits_tot ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->nCPE > 1 ) + { + if ( ( error = ivas_mct_enc( st_ivas, data_f, input_frame, hMetaData->nb_bits_tot ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + else if ( st_ivas->mc_mode == MC_MODE_MCMASA ) + { + if ( st_ivas->hMcMasa->separateChannelEnabled ) + { + hMetaData = st_ivas->hCPE[0]->hMetaData; /* Metadata is always with CPE in the case of separated channel */ + } + + ivas_mcmasa_enc( st_ivas->hMcMasa, st_ivas->hQMetaData, st_ivas->hMasa, data_f, input_frame, st_ivas->nchan_transport, nchan_inp ); + + if ( ( error = ivas_masa_encode( st_ivas->hMasa, st_ivas->hQMetaData, hMetaData, &nb_bits_metadata[0], st_ivas->nchan_transport, ivas_format, ivas_total_brate, 0, -1, + ISM_MODE_NONE, -1, NULL, -1, NULL, 0, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( st_ivas->hMcMasa->separateChannelEnabled ) + { + if ( ( error = ivas_sce_enc( st_ivas, 0, data_f[2], input_frame, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + + st_ivas->hCPE[0]->hCoreCoder[0]->hBstr->ind_list = st_ivas->hSCE[0]->hCoreCoder[0]->hBstr->ind_list + st_ivas->hSCE[0]->hCoreCoder[0]->hBstr->nb_ind_tot; + + if ( ( error = ivas_cpe_enc( st_ivas, 0, data_f[0], data_f[1], input_frame, hMetaData->nb_bits_tot ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + if ( st_ivas->nSCE == 1 ) + { + if ( ( error = ivas_sce_enc( st_ivas, 0, data_f[0], input_frame, hMetaData->nb_bits_tot ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->nCPE == 1 ) /* Stereo DMX */ + { + if ( ( error = ivas_cpe_enc( st_ivas, 0, data_f[0], data_f[1], input_frame, hMetaData->nb_bits_tot ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + } + } + + /*----------------------------------------------------------------* + * Common updates + *----------------------------------------------------------------*/ + + hEncoderConfig->last_ivas_total_brate = ivas_total_brate; + + + pop_wmops(); + return error; +} diff --git a/lib_enc/ivas_enc_cov_handler.c b/lib_enc/ivas_enc_cov_handler.c new file mode 100644 index 0000000000000000000000000000000000000000..d4e82c6d98aefe95dba1b79a699f1483f15626d6 --- /dev/null +++ b/lib_enc/ivas_enc_cov_handler.c @@ -0,0 +1,434 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_rom_com.h" +#include "wmc_auto.h" + +/*------------------------------------------------------------------------------------------* + * Local constants + *------------------------------------------------------------------------------------------*/ + +#define MIN_POOL_SIZE 24 +#define MAX_UPDATE_RATE 0.8f +#define MIN_POOL_SIZE_DTX 40 +#define MAX_UPDATE_RATE_DTX 0.4f + + +/*------------------------------------------------------------------------------------------* + * Local functions declarations + *------------------------------------------------------------------------------------------*/ + +static void ivas_band_cov( float **ppIn_FR_real, float **ppIn_FR_imag, const int16_t num_chans, const int16_t num_bins, int16_t stride, float **pFb_bin_to_band, const int16_t *pFb_start_bin_per_band, const int16_t *pFb_active_bins_per_band, const int16_t start_band, const int16_t end_band, float *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], const int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] ); + +/*------------------------------------------------------------------------- + * ivas_spar_covar_enc_open() + * + * Allocate and initialize SPAR Covar. encoder handle + *------------------------------------------------------------------------*/ + +ivas_error ivas_spar_covar_enc_open( + ivas_enc_cov_handler_state_t **hCovEnc, /* i/o: SPAR Covar. encoder handle */ + ivas_filterbank_t *pFb, /* i/o: FB handle */ + const int32_t input_Fs, /* i : input sampling rate */ + const int16_t nchan_inp, /* i : number of input channels */ + const COV_SMOOTHING_TYPE smooth_mode, /* i : Smooth covariance for SPAR or MC*/ + const int32_t ivas_total_brate /* i : IVAS total bitrate */ +) +{ + ivas_enc_cov_handler_state_t *hCovState; + ivas_cov_smooth_cfg_t cov_smooth_cfg; + ivas_error error; + + error = IVAS_ERR_OK; + + if ( ( hCovState = (ivas_enc_cov_handler_state_t *) malloc( sizeof( ivas_enc_cov_handler_state_t ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR COV encoder" ); + } + + cov_smooth_cfg.max_bands = IVAS_MAX_NUM_BANDS; + cov_smooth_cfg.max_update_rate = MAX_UPDATE_RATE; + cov_smooth_cfg.min_pool_size = MIN_POOL_SIZE; + if ( smooth_mode == COV_SMOOTH_MC ) + { + cov_smooth_cfg.max_update_rate = 1.0f; + cov_smooth_cfg.min_pool_size = 20; + } + + if ( ( error = ivas_spar_covar_smooth_enc_open( &hCovState->pCov_state, &cov_smooth_cfg, pFb, nchan_inp, smooth_mode, ivas_total_brate ) ) != IVAS_ERR_OK ) + { + return error; + } + + cov_smooth_cfg.max_update_rate = MAX_UPDATE_RATE_DTX; + cov_smooth_cfg.min_pool_size = MIN_POOL_SIZE_DTX; + + if ( ( error = ivas_spar_covar_smooth_enc_open( &hCovState->pCov_dtx_state, &cov_smooth_cfg, pFb, nchan_inp, smooth_mode, ivas_total_brate ) ) != IVAS_ERR_OK ) + { + return error; + } + + hCovState->num_bins = (int16_t) ( input_Fs / FRAMES_PER_SEC ); + hCovState->prior_dtx_present = 0; + + set_zero( hCovState->bb_var_lt, FOA_CHANNELS ); + hCovState->prior_var_flag = -1; + + *hCovEnc = hCovState; + + return error; +} + + +/*------------------------------------------------------------------------- + * ivas_spar_covar_enc_close() + * + * Deallocate SPAR Covar. encoder handle + *------------------------------------------------------------------------*/ + +void ivas_spar_covar_enc_close( + ivas_enc_cov_handler_state_t **hCovEnc, /* i/o: SPAR Covar. encoder handle */ + const int16_t nchan_inp /* i : number of input channels */ +) +{ + ivas_enc_cov_handler_state_t *hCovState; + + if ( hCovEnc == NULL || *hCovEnc == NULL ) + { + return; + } + + hCovState = *hCovEnc; + + ivas_spar_covar_smooth_enc_close( &hCovState->pCov_state, nchan_inp ); + + ivas_spar_covar_smooth_enc_close( &hCovState->pCov_dtx_state, nchan_inp ); + + free( *hCovEnc ); + *hCovEnc = NULL; + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_spar_get_activeW_flag() + * + * + *-----------------------------------------------------------------------------------------*/ + +static int16_t ivas_spar_get_activeW_flag( + ivas_enc_cov_handler_state_t *hCovEnc, + float *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], + float *cov_dtx_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], + const int16_t dtx_vad, + const int16_t nchan_inp, + const int16_t nchan_transport, + int16_t *res_ind, + const int16_t *dmx_order ) +{ + int16_t b, ch, num_bands, num_chs, activeW_flag; + float bb_var[FOA_CHANNELS], sm_fact, side_ch_var, en_ratio; + num_chs = min( nchan_inp, FOA_CHANNELS ); + num_bands = ivas_get_num_bands_from_bw_idx( SPAR_CONFIG_BW ); + + set_zero( bb_var, FOA_CHANNELS ); + + if ( dtx_vad == 1 ) + { + for ( ch = 0; ch < num_chs; ch++ ) + { + for ( b = 0; b < num_bands; b++ ) + { + bb_var[ch] += cov_real[ch][ch][b]; + } + } + } + else + { + for ( ch = 0; ch < num_chs; ch++ ) + { + for ( b = 0; b < num_bands; b++ ) + { + bb_var[ch] += cov_dtx_real[ch][ch][b]; + } + } + } + + if ( hCovEnc->prior_var_flag == -1 ) + { + for ( ch = 0; ch < num_chs; ch++ ) + { + hCovEnc->bb_var_lt[ch] = bb_var[ch]; + } + } + else + { + sm_fact = 0.5f; + for ( ch = 0; ch < num_chs; ch++ ) + { + hCovEnc->bb_var_lt[ch] = sm_fact * hCovEnc->bb_var_lt[ch] + ( 1 - sm_fact ) * bb_var[ch]; + } + } + + side_ch_var = 0.0f; + for ( ch = nchan_transport; ch < num_chs; ch++ ) + { + side_ch_var += hCovEnc->bb_var_lt[dmx_order[ch]]; + } + + if ( side_ch_var < ( IVAS_SPAR_SIDE_CH_DYN_ACTIVEW_THRESH * IVAS_SPAR_SIDE_CH_DYN_ACTIVEW_THRESH ) ) + { + activeW_flag = 0; + } + else + { + en_ratio = hCovEnc->bb_var_lt[0] / side_ch_var; + if ( en_ratio < ( IVAS_SPAR_DYN_ACTIVEW_THRESH * IVAS_SPAR_DYN_ACTIVEW_THRESH ) ) + { + activeW_flag = 1; + } + else + { + activeW_flag = 0; + } + } + + if ( activeW_flag ) + { + *res_ind = 0; + if ( nchan_transport == 2 ) + { + int16_t max_idx; + float max_val; + max_idx = nchan_transport; + max_val = hCovEnc->bb_var_lt[max_idx]; + for ( ch = nchan_transport + 1; ch < num_chs; ch++ ) + { + if ( hCovEnc->bb_var_lt[ch] > max_val ) + { + max_idx = ch; + max_val = hCovEnc->bb_var_lt[ch]; + } + } + *res_ind = max_idx; + } + else if ( nchan_transport == 3 ) + { + *res_ind = dmx_order[nchan_transport]; + } + } + + return activeW_flag; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_enc_cov_handler_process() + * + * Encoder covariance handler process call + *-----------------------------------------------------------------------------------------*/ + +void ivas_enc_cov_handler_process( + ivas_enc_cov_handler_state_t *hCovEnc, /* i/o: SPAR Covar. encoder handle */ + float **ppIn_FR_real, + float **ppIn_FR_imag, + float *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], + float *cov_dtx_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], + ivas_filterbank_t *pFb, /* i/o: FB handle */ + const int16_t start_band, + const int16_t end_band, + const int16_t num_ch, + const int16_t dtx_vad, + const int16_t transient_det[2], + const int16_t HOA_md_ind[IVAS_SPAR_MAX_CH], + int16_t *res_ind, + const int16_t *remix_order, + int16_t *dyn_active_w_flag, + const int16_t nchan_transport, + const int16_t is_sba + +) +{ + int16_t i, j; + int16_t dtx_cov_flag; + + dtx_cov_flag = ( dtx_vad == 1 ) ? 0 : 1; + + ivas_band_cov( ppIn_FR_real, ppIn_FR_imag, num_ch, hCovEnc->num_bins, + pFb->fb_bin_to_band.short_stride, + pFb->fb_bin_to_band.pp_short_stride_bin_to_band, + pFb->fb_bin_to_band.p_short_stride_start_bin_per_band, + pFb->fb_bin_to_band.p_short_stride_num_bins_per_band, + start_band, end_band, cov_real, HOA_md_ind ); + + if ( is_sba ) + { + *res_ind = 0; + if ( nchan_transport > 1 && nchan_transport <= ( FOA_CHANNELS - 1 ) ) + { + *dyn_active_w_flag = ivas_spar_get_activeW_flag( hCovEnc, cov_real, cov_real, dtx_vad, num_ch, nchan_transport, res_ind, remix_order ); + } + else + { + *dyn_active_w_flag = 0; + } + } + + for ( i = 0; i < num_ch; i++ ) + { + for ( j = 0; j < num_ch; j++ ) + { + mvr2r( cov_real[i][j], cov_dtx_real[i][j], pFb->filterbank_num_bands ); + } + } + + ivas_cov_smooth_process( hCovEnc->pCov_state, cov_real, pFb, start_band, end_band, num_ch, transient_det ); + + if ( dtx_cov_flag == 0 ) + { + for ( i = 0; i < num_ch; i++ ) + { + for ( j = 0; j < num_ch; j++ ) + { + mvr2r( cov_real[i][j], hCovEnc->pCov_dtx_state->pPrior_cov_real[i][j], pFb->filterbank_num_bands ); + mvr2r( cov_real[i][j], cov_dtx_real[i][j], pFb->filterbank_num_bands ); + } + } + + hCovEnc->prior_dtx_present = 1; + } + else + { + if ( ( transient_det[0] == 0 ) && ( transient_det[1] == 0 ) ) + { + ivas_cov_smooth_process( hCovEnc->pCov_dtx_state, cov_dtx_real, pFb, start_band, end_band, num_ch, transient_det ); + hCovEnc->prior_dtx_present = 1; + } + else + { + if ( hCovEnc->prior_dtx_present == 0 ) + { + ivas_cov_smooth_process( hCovEnc->pCov_dtx_state, cov_dtx_real, pFb, start_band, end_band, num_ch, transient_det ); + hCovEnc->prior_dtx_present = 1; + } + else + { + for ( i = 0; i < num_ch; i++ ) + { + for ( j = 0; j < num_ch; j++ ) + { + mvr2r( hCovEnc->pCov_dtx_state->pPrior_cov_real[i][j], cov_dtx_real[i][j], pFb->filterbank_num_bands ); + } + } + + hCovEnc->prior_dtx_present = 1; + } + } + } + + return; +} + + +static void ivas_band_cov( + float **ppIn_FR_real, + float **ppIn_FR_imag, + const int16_t num_chans, + const int16_t num_bins, + int16_t stride, + float **pFb_bin_to_band, + const int16_t *pFb_start_bin_per_band, + const int16_t *pFb_active_bins_per_band, + const int16_t start_band, + const int16_t end_band, + float *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], + const int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] ) +{ + int16_t i, j, k; + float pV_re[L_FRAME48k]; + int16_t m, start_bin, active_bins; + + for ( i = 0; i < num_chans; i++ ) + { + for ( j = i; j < num_chans; j++ ) + { + int16_t i1 = HOA_md_ind[i]; + int16_t j1 = HOA_md_ind[j]; + + for ( k = 0; k < num_bins; k++ ) + { + pV_re[k] = ppIn_FR_real[i1][k] * ppIn_FR_real[j1][k] + ppIn_FR_imag[i1][k] * ppIn_FR_imag[j1][k]; + } + + for ( k = start_band; k < end_band; k++ ) + { + float temp = 0.0f; + const float *p_bin_to_band = pFb_bin_to_band[k]; + float *cov_ptr = pV_re; + int16_t num_blocks; + + num_blocks = num_bins / stride; + start_bin = pFb_start_bin_per_band[k]; + active_bins = pFb_active_bins_per_band[k]; + + for ( int16_t blk = 0; blk < num_blocks; blk++ ) + { + /* optional: add temporal weight here */ + for ( m = start_bin; m < start_bin + active_bins; m++ ) + { + temp += cov_ptr[m] * ( p_bin_to_band[m - start_bin] ); + } + cov_ptr += stride; + } + cov_real[i][j][k] = temp * (float) num_blocks; + } + } + } + + for ( i = 0; i < num_chans; i++ ) + { + for ( j = 0; j < i; j++ ) + { + for ( k = start_band; k < end_band; k++ ) + { + cov_real[i][j][k] = cov_real[j][i][k]; + } + } + } + + return; +} diff --git a/lib_enc/ivas_entropy_coder.c b/lib_enc/ivas_entropy_coder.c new file mode 100644 index 0000000000000000000000000000000000000000..e118c72712c574be77f72c411f120ddff7ea9505 --- /dev/null +++ b/lib_enc/ivas_entropy_coder.c @@ -0,0 +1,403 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "ivas_cnst.h" +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_rom_com.h" +#include "math.h" +#include +#include "wmc_auto.h" + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_get_dyn_freq_model() + * + * Chooses frequency model dynamically + *-----------------------------------------------------------------------------------------*/ + +static ivas_error ivas_get_dyn_freq_model( + int16_t *pInput, + const int16_t length, + int16_t *model_index, + ivas_arith_t *pArith, + int16_t **ppCum_freq ) +{ + float curr_dist[IVAS_MAX_QUANT_LEVELS]; + int16_t i, n[IVAS_MAX_QUANT_LEVELS + 1], model_idx; + float curr_bps, curr_bps_min, curr_bps_new; + int16_t range = pArith->range; + int16_t m, offset = -pArith->vals[0]; + ivas_error error; + + error = IVAS_ERR_OK; + + for ( i = 0; i < range + 1; i++ ) + { + n[i] = 0; + } + + for ( i = 0; i < length; i++ ) + { + n[pInput[i] + offset] += 1; + } + + curr_bps = 0; + for ( i = 0; i < range; i++ ) + { + curr_dist[i] = (float) n[i]; + curr_bps -= ( curr_dist[i] * pArith->saved_dist_arr[0][i] ); + } + curr_bps_min = curr_bps; + + model_idx = 0; + + for ( m = 0; m < pArith->num_models - 1; m++ ) + { + curr_bps_new = 0; + for ( i = 0; i < range; i++ ) + { + curr_bps_new -= ( curr_dist[i] * pArith->saved_dist_arr[m + 1][i] ); + } + + if ( curr_bps_new < curr_bps_min ) + { + model_idx = m; + curr_bps_min = curr_bps_new; + } + } + + if ( curr_bps_min < curr_bps ) + { + *ppCum_freq = pArith->cum_freq[model_idx + 1]; + model_idx = model_idx + 1; + } + else + { + model_idx = 0; + *ppCum_freq = pArith->cum_freq[0]; + } + + *model_index = model_idx; + + return error; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_arith_encode_array() + * + * Arith encoding of an array of symbols + *-----------------------------------------------------------------------------------------*/ + +static int16_t ivas_arith_encode_array( + int16_t *pInput, + ivas_arith_t *pArith, + BSTR_ENC_HANDLE hMetaData, + const int16_t in_len, + const int16_t wc_strat_arith ) +{ + int16_t model_index, i, ind; + int16_t *pCum_freq = NULL; + Tastat as; + + if ( in_len > 0 && pArith->range > 1 ) + { + if ( pArith->dyn_model_bits > 0 ) + { + ivas_get_dyn_freq_model( pInput, in_len, &model_index, pArith, &pCum_freq ); + if ( ( hMetaData->nb_bits_tot + pArith->dyn_model_bits ) > wc_strat_arith ) + { + return -1; + } + + push_next_indice( hMetaData, model_index, pArith->dyn_model_bits ); + } + else + { + pCum_freq = pArith->cum_freq[0]; + } + + ari_start_encoding_14bits( &as ); + + for ( i = 0; i < in_len; i++ ) + { + ind = pInput[i] - pArith->vals[0]; + + ivas_ari_encode_14bits_ext( hMetaData, &as, ind, (const uint16_t *) pCum_freq ); + if ( hMetaData->nb_bits_tot > wc_strat_arith ) + { + return -1; + } + } + + ivas_ari_done_encoding_14bits( hMetaData, &as ); + if ( hMetaData->nb_bits_tot > wc_strat_arith ) + { + return -1; + } + } + + return 0; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_arithCoder_encode_array_diff() + * + * Differential arith encoding + *-----------------------------------------------------------------------------------------*/ + +static int16_t ivas_arithCoder_encode_array_diff( + ivas_arith_t *pArith_diff, + int16_t *pIn_new, + int16_t *pIn_old_scratch, + const int16_t length, + BSTR_ENC_HANDLE hMetaData, + const int16_t wc_strat_arith ) +{ + int16_t n; + int16_t arith_result; + + if ( length > 0 ) + { + for ( n = 0; n < length; n++ ) + { + pIn_old_scratch[n] = pIn_new[n] - pIn_old_scratch[n]; + } + + ivas_wrap_arround( pIn_old_scratch, pArith_diff->vals[0], pArith_diff->vals[pArith_diff->range - 1], length ); + + arith_result = ivas_arith_encode_array( pIn_old_scratch, pArith_diff, hMetaData, length, wc_strat_arith ); + if ( arith_result < 0 ) + { + return -1; + } + } + + return 0; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_huffman_encode() + * + * ivas_huffman_encode + *-----------------------------------------------------------------------------------------*/ + +void ivas_huffman_encode( + ivas_huffman_cfg_t *huff_cfg, + int16_t in, + int16_t *hcode, + int16_t *hlen ) +{ + int16_t min_sym_val; + const int16_t *codebook; + + min_sym_val = huff_cfg->codebook[0]; + + codebook = &huff_cfg->codebook[3 * ( in - min_sym_val )]; + *hlen = codebook[1]; + *hcode = codebook[2]; + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function arith_encode_cell_array() + * + * Arithmetic encode a cell array + *-----------------------------------------------------------------------------------------*/ + +static int16_t arith_encode_cell_array( + ivas_cell_dim_t *pCell_dims, + BSTR_ENC_HANDLE hMetaData, + const int16_t nB, + ivas_arith_t *pArith, + int16_t *pSymbol, + const int16_t wc_strat_arith ) +{ + int16_t total_symbol_len = 0; + int16_t i; + int16_t arith_result; + + for ( i = 0; i < nB; i++ ) + { + total_symbol_len += ( pCell_dims[i].dim1 * pCell_dims[i].dim2 ); + } + + assert( total_symbol_len <= ( IVAS_MAX_INPUT_LEN ) ); + + if ( total_symbol_len > 0 ) + { + if ( pArith->range > 1 ) + { + arith_result = ivas_arith_encode_array( pSymbol, pArith, hMetaData, total_symbol_len, wc_strat_arith ); + if ( arith_result < 0 ) + { + return -1; + } + } + } + + return 0; +} + + +/*-----------------------------------------------------------------------------------------* + * Function arith_encode_cell_array_diff() + * + * Arithmetic encode a cell array - differential + *-----------------------------------------------------------------------------------------*/ + +static int16_t arith_encode_cell_array_diff( + const ivas_cell_dim_t *pCell_dims, + BSTR_ENC_HANDLE hMetaData, + int16_t nB, + ivas_arith_t *pArith_diff, + int16_t *pSymbol_old, + int16_t *pSymbol, + const int16_t wc_strat_arith ) +{ + int16_t i, total_symbol_len; + int16_t arith_result; + + total_symbol_len = 0; + for ( i = 0; i < nB; i++ ) + { + total_symbol_len += ( pCell_dims[i].dim1 * pCell_dims[i].dim2 ); + } + + assert( total_symbol_len <= ( IVAS_MAX_INPUT_LEN ) ); + + if ( total_symbol_len > 0 ) + { + if ( pArith_diff->range > 1 ) + { + arith_result = ivas_arithCoder_encode_array_diff( pArith_diff, pSymbol, pSymbol_old, total_symbol_len, hMetaData, wc_strat_arith ); + if ( arith_result < 0 ) + { + return -1; + } + } + } + + return 0; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_arith_encode_cmplx_cell_array() + * + * Arithmetic encode a cell array + *-----------------------------------------------------------------------------------------*/ + +int16_t ivas_arith_encode_cmplx_cell_array( + ivas_arith_t *pArith_re, + ivas_arith_t *pArith_re_diff, + const int16_t *pDo_diff, + const int16_t nB, + int16_t *pSymbol_re, + int16_t *pSymbol_old_re, + ivas_cell_dim_t *pCell_dims, + BSTR_ENC_HANDLE hMetaData, + const int16_t any_diff, + const int16_t wc_strat_arith ) +{ + int16_t input_old[IVAS_MAX_INPUT_LEN]; + int16_t input_new[IVAS_MAX_INPUT_LEN]; + int16_t input[IVAS_MAX_INPUT_LEN]; + ivas_cell_dim_t cell_dim[IVAS_MAX_NUM_BANDS], cell_dim_diff[IVAS_MAX_NUM_BANDS]; + int16_t len, idx, i, j, idx1; + int16_t total_len; + int16_t arith_result; + + idx1 = 0; + if ( any_diff == 1 ) + { + idx = 0; + total_len = 0; + for ( i = 0; i < nB; i++ ) + { + len = ( pCell_dims[i].dim1 * pCell_dims[i].dim2 ); + if ( pDo_diff[i] != 0 ) + { + for ( j = 0; j < len; j++ ) + { + input_old[idx] = pSymbol_old_re[total_len + j]; + input_new[idx++] = pSymbol_re[total_len + j]; + } + cell_dim_diff[i].dim1 = pCell_dims[i].dim1; + cell_dim_diff[i].dim2 = pCell_dims[i].dim2; + cell_dim[i].dim1 = 0; + cell_dim[i].dim2 = 0; + } + else + { + for ( j = 0; j < len; j++ ) + { + input[idx1++] = pSymbol_re[total_len + j]; + } + cell_dim_diff[i].dim1 = 0; + cell_dim_diff[i].dim2 = 0; + cell_dim[i].dim1 = pCell_dims[i].dim1; + cell_dim[i].dim2 = pCell_dims[i].dim2; + } + total_len += len; + } + + arith_result = arith_encode_cell_array( cell_dim, hMetaData, nB, pArith_re, input, wc_strat_arith ); + if ( arith_result < 0 ) + { + return -1; + } + + arith_result = arith_encode_cell_array_diff( cell_dim_diff, hMetaData, nB, pArith_re_diff, input_old, input_new, wc_strat_arith ); + if ( arith_result < 0 ) + { + return -1; + } + } + else + { + arith_result = arith_encode_cell_array( pCell_dims, hMetaData, nB, pArith_re, pSymbol_re, wc_strat_arith ); + if ( arith_result < 0 ) + { + return -1; + } + } + + return 0; +} diff --git a/lib_enc/ivas_front_vad.c b/lib_enc/ivas_front_vad.c new file mode 100644 index 0000000000000000000000000000000000000000..4dcf2cd61ff4db7e664b27e7b82d1806ff67f171 --- /dev/null +++ b/lib_enc/ivas_front_vad.c @@ -0,0 +1,483 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "cnst.h" +#include "ivas_cnst.h" +#include "rom_enc.h" +#include "rom_com.h" +#include "prot.h" +#include "ivas_prot.h" +#include +#include "wmc_auto.h" +#include + + +/*-----------------------------------------------------------------------------------------* + * Function front_vad() + * + * Standalone front-VAD module + *-----------------------------------------------------------------------------------------*/ + +ivas_error front_vad( + CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure, nullable */ + Encoder_State *st, /* i/o: encoder state structure */ + const ENCODER_CONFIG_HANDLE hEncoderConfig, /* i : configuration structure */ + FRONT_VAD_ENC_HANDLE *hFrontVads, /* i/o: FrontVad handles */ + const int16_t MCT_flag, /* i : hMCT handle allocated (1) or not (0) */ + const int16_t input_frame, /* i : frame length */ + int16_t vad_flag_dtx[], /* o : HE-SAD flag with additional DTX HO */ + float fr_bands[][2 * NB_BANDS], /* i : energy in frequency bands */ + float Etot_LR[], /* o : total energy Left & Right channel */ + float lf_E[][2 * VOIC_BINS], /* i : per bin spectrum energy in lf, LR channels */ + int16_t localVAD_HE_SAD[], /* o : HE-SAD flag without hangover, LR channels */ + int16_t vad_hover_flag[], /* o : VAD hangover flag */ + float band_energies_LR[2 * NB_BANDS], /* o : energy in critical bands without minimum noise floor E_MIN*/ + float *PS_out, /* o : energy spectrum */ + float *Bin_E_out /* o : log-energy spectrum of the current frame */ +) +{ + ENC_CORE_HANDLE *sts; + float band_energies[2 * NB_BANDS]; /* energy in critical bands without minimum noise floor E_MIN */ + float PS[L_FRAME / 2]; /* speech/music clasif. parameters */ + float snr_sum_he; /* HE SAD parameters */ + float Bin_E[L_FFT]; /* per bin log energy spectrum for mid-frame */ + float Bin_E_old[L_FFT / 2]; /* old per bin log energy spectrum for mid-frame */ + float fft_buffLR[2 * L_FFT]; /* fft buffer */ + int16_t n, n_chan, dummy; + int16_t element_mode, last_element_mode; + ivas_error error; + + error = IVAS_ERR_OK; + push_wmops( "front_vad" ); + + if ( hCPE != NULL ) + { + n_chan = CPE_CHANNELS; + sts = &hCPE->hCoreCoder[0]; + element_mode = hCPE->element_mode; + last_element_mode = hCPE->last_element_mode; + } + else if ( st != NULL ) + { + n_chan = 1; + sts = &st; + element_mode = IVAS_SCE; + last_element_mode = IVAS_SCE; + } + else + { + assert( 0 && "Either CPE or SCE must be given!" ); + return IVAS_ERR_INTERNAL_FATAL; + } + + snr_sum_he = 0; + for ( n = 0; n < n_chan; n++ ) + { + localVAD_HE_SAD[n] = 0; + vad_hover_flag[n] = 0; + vad_flag_dtx[n] = 1; + } + + /*------------------------------------------------------------------* + * Allocate/deallocate hFrontVad handles in case of element_mode change + *-----------------------------------------------------------------*/ + + if ( sts[0]->ini_frame > 0 && MCT_flag == 0 && last_element_mode != element_mode ) + { + if ( element_mode == IVAS_CPE_MDCT ) + { + if ( hFrontVads[0] != NULL ) + { + for ( n = 0; n < n_chan; n++ ) + { + front_vad_destroy( &hFrontVads[n] ); + hFrontVads[n] = NULL; + } + } + } + else + { + if ( sts[0]->Opt_DTX_ON && hFrontVads[0] == NULL ) + { + for ( n = 0; n < n_chan; n++ ) + { + if ( ( error = front_vad_create( &hFrontVads[n], hEncoderConfig ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + } + } + + /* Only run VAD if DTX is on and TD stereo or unified stereo is selected */ + if ( hFrontVads[0] != NULL && element_mode != IVAS_CPE_MDCT ) + { + + /*------------------------------------------------------------------* + * VAD + *-----------------------------------------------------------------*/ + + set_zero( band_energies_LR, 2 * NB_BANDS ); + + for ( n = 0; n < n_chan; n++ ) + { + FRONT_VAD_ENC_HANDLE hFrontVad; + hFrontVad = hFrontVads[n]; + + /* Move previous frame 12k8 signal */ + mvr2r( hFrontVad->buffer_12k8 + L_FFT, hFrontVad->buffer_12k8, L_FFT / 2 ); + + /* Resample to 12k8 */ + modify_Fs( sts[n]->input, input_frame, sts[0]->input_Fs, hFrontVad->buffer_12k8 + L_FFT / 2, INT_FS_12k8, hFrontVad->mem_decim, ( sts[0]->max_bwidth == NB ) ); + + /* Preemphasis */ + preemph( hFrontVad->buffer_12k8 + L_FFT / 2, PREEMPH_FAC, L_FRAME, &hFrontVad->mem_preemph ); + + analy_sp( IVAS_CPE_TD, hCPE, sts[0]->input_Fs, hFrontVad->buffer_12k8 + L_FFT / 2 - 3 * ( L_SUBFR / 2 ), Bin_E, Bin_E_old, fr_bands[n], lf_E[n], &Etot_LR[n], sts[0]->min_band, sts[0]->max_band, band_energies, PS, fft_buffLR ); + + /* add up energies for later calculating average of channel energies */ + v_add( &band_energies[0], &band_energies_LR[0], &band_energies_LR[0], 2 * NB_BANDS ); + + noise_est_pre( Etot_LR[n], hFrontVads[0]->ini_frame, hFrontVad->hNoiseEst, 0, 0, 0 ); + + /* wb_vad */ + hFrontVad->hVAD->vad_flag = wb_vad( sts[n], fr_bands[n], &dummy, &dummy, &dummy, &snr_sum_he, &localVAD_HE_SAD[n], &dummy, hFrontVad->hVAD, hFrontVad->hNoiseEst, hFrontVad->lp_speech, hFrontVad->lp_noise ); + + if ( n == 0 && n_chan > 1 && last_element_mode == IVAS_CPE_DFT ) + { + sts[1]->last_coder_type = sts[0]->last_coder_type; + } + + /* DTX hangover addition */ + vad_flag_dtx[n] = dtx_hangover_addition( sts[n], hFrontVad->hVAD->vad_flag, hFrontVad->lp_speech - hFrontVad->lp_noise, 0 /* <- no cldfb addition */, &vad_hover_flag[n], hFrontVad->hVAD, hFrontVad->hNoiseEst, &hFrontVads[n]->rem_dtx_ho ); + + if ( n_chan == 1 ) + { + sts[n]->vad_flag = hFrontVad->hVAD->vad_flag; + } + } + + if ( n_chan == CPE_CHANNELS ) + { + /* get average channel energies, adding up was already done, so only need to scale by number of channels */ + v_multc( &band_energies_LR[0], 0.5f, &band_energies_LR[0], 2 * NB_BANDS ); + + /* Logical OR between L and R decisions */ + vad_flag_dtx[0] = vad_flag_dtx[0] || vad_flag_dtx[1]; + } + + if ( sts[0]->hFdCngEnc != NULL ) + { + resetFdCngEnc( sts[0] ); + } + + /* Part of DTX to decide if SID/NO_DATA */ + if ( vad_flag_dtx[0] == 0 && sts[0]->ini_frame > 2 ) /* CNG coding starts after 3 frames */ + { + if ( sts[0]->fd_cng_reset_flag == 0 ) + { + if ( hCPE != NULL ) + { + hCPE->element_mode = IVAS_CPE_DFT; + sts[1]->active_cnt = 0; + } + } + else + { + vad_flag_dtx[0] = 1; + } + } + else + { + vad_flag_dtx[0] = 1; + } + } + + if ( PS_out != NULL ) + { + mvr2r( PS, PS_out, L_FRAME / 2 ); + } + + if ( Bin_E_out != NULL ) + { + mvr2r( Bin_E, Bin_E_out, L_FRAME ); + } + + pop_wmops(); + return error; +} + + +/*-----------------------------------------------------------------------------------------* + * Function front_vad_create() + * + * Allocate and initialize Standalone front-VAD module + *-----------------------------------------------------------------------------------------*/ + +ivas_error front_vad_create( + FRONT_VAD_ENC_HANDLE *hFrontVad_out, /* i/o: front-VAD handle */ + const ENCODER_CONFIG_HANDLE hEncoderConfig /* i : configuration structure */ +) +{ + FRONT_VAD_ENC_HANDLE hFrontVad; + + if ( ( hFrontVad = (FRONT_VAD_ENC_HANDLE) malloc( sizeof( FRONT_VAD_ENC ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for front-VAD structure \n" ) ); + } + + if ( ( hFrontVad->hNoiseEst = (NOISE_EST_HANDLE) malloc( sizeof( NOISE_EST_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Noise estimation\n" ) ); + } + noise_est_init( hFrontVad->hNoiseEst ); + + if ( ( hFrontVad->hVAD = (VAD_HANDLE) malloc( sizeof( VAD_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for VAD\n" ) ); + } + wb_vad_init( hFrontVad->hVAD ); + + hFrontVad->lp_speech = 45.0f; /* Initialize the long-term active speech level in dB */ + hFrontVad->lp_noise = 0.0f; /* Initialize the long-term noise level in dB */ + set_f( hFrontVad->mem_decim, 0, 2 * L_FILT_MAX ); + set_f( hFrontVad->buffer_12k8, 0, 3 * L_FRAME / 2 ); + hFrontVad->mem_preemph = 0; + hFrontVad->ini_frame = 0; + hFrontVad->hVAD->vad_flag = 1; + + /* allocate delay buffer to compensate for filterbank delay */ + hFrontVad->delay_samples = NS2SA( hEncoderConfig->input_Fs, IVAS_FB_ENC_DELAY_NS ); + hFrontVad->delay_buf = NULL; + if ( hFrontVad->delay_samples > 0 ) + { + if ( ( hFrontVad->delay_buf = (float *) malloc( hFrontVad->delay_samples * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for VAD delay buffer\n" ) ); + } + set_f( hFrontVad->delay_buf, 0, hFrontVad->delay_samples ); + } + + *hFrontVad_out = hFrontVad; + + return IVAS_ERR_OK; +} + + +/*-----------------------------------------------------------------------------------------* + * Function front_vad_destroy() + * + * Deallocate Standalone front-VAD module + *-----------------------------------------------------------------------------------------*/ + +void front_vad_destroy( + FRONT_VAD_ENC_HANDLE *hFrontVad /* i/o: front-VAD handle */ +) +{ + if ( *hFrontVad != NULL ) + { + free( ( *hFrontVad )->hNoiseEst ); + ( *hFrontVad )->hNoiseEst = NULL; + + free( ( *hFrontVad )->hVAD ); + ( *hFrontVad )->hVAD = NULL; + + if ( ( *hFrontVad )->delay_buf != NULL ) + { + free( ( *hFrontVad )->delay_buf ); + ( *hFrontVad )->delay_buf = NULL; + } + + free( *hFrontVad ); + *hFrontVad = NULL; + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function front_vad_spar() + * + * Standalone front-VAD module for SPAR + *-----------------------------------------------------------------------------------------*/ + +ivas_error front_vad_spar( + SPAR_ENC_HANDLE hSpar, /* i/o: SPAR encoder structure */ + const float *omni_in, /* i : omnidirectional input signal */ + ENCODER_CONFIG_HANDLE hEncoderConfig, /* i : encoder configuration handle */ + const int16_t input_frame /* i : input frame length */ +) +{ + FRONT_VAD_ENC_HANDLE hFrontVad; + float input[L_FRAME48k]; + int16_t vad_flag_dtx[1]; + float fr_bands[1][2 * NB_BANDS]; + float Etot[1]; + float lf_E[1][2 * VOIC_BINS]; + int16_t localVAD_HE_SAD[1]; + int16_t vad_hover_flag[1]; + float band_energies[2 * NB_BANDS]; + int16_t high_lpn_flag; + Encoder_State *st; + float tmpN[NB_BANDS], tmpE[NB_BANDS]; + float corr_shift, dummy, res_energy; + float A[NB_SUBFR16k * ( M + 1 )], Aw[NB_SUBFR16k * ( M + 1 )]; + float epsP[M + 1]; + float lsp_new[M]; + float lsp_mid[M]; + int16_t alw_pitch_lag_12k8[2]; + float alw_voicing[2]; + float cor_map_sum; + float ncharX; + float sp_div; + float non_staX; + int16_t loc_harm; + float S_map[L_FFT / 2]; + float *inp_12k8; + float old_wsp[L_WSP]; + float *wsp; + float relE; + int16_t flag_spitch; + float PS[L_FRAME / 2]; + int16_t old_pitch; + ivas_error error; + + push_wmops( "front_vad_SPAR" ); + error = IVAS_ERR_OK; + hFrontVad = hSpar->hFrontVad; + st = hSpar->hCoreCoderVAD; + + if ( hEncoderConfig->Opt_DTX_ON && hEncoderConfig->ivas_total_brate <= SBA_DTX_BITRATE_THRESHOLD ) + { + /*------------------------------------------------------------------* + * Initialization + *-----------------------------------------------------------------*/ + + inp_12k8 = hFrontVad->buffer_12k8; + mvr2r( st->old_wsp, old_wsp, L_WSP_MEM ); + wsp = old_wsp + L_WSP_MEM; + + st->core_brate = -1; /* updated in dtx() */ + st->input_bwidth = st->last_input_bwidth; + + /*------------------------------------------------------------------* + * compensate for SPAR filterbank delay + *-----------------------------------------------------------------*/ + + st->input = input; + mvr2r( omni_in, st->input, input_frame ); + + delay_signal( st->input, input_frame, hFrontVad->delay_buf, hFrontVad->delay_samples ); + + /*------------------------------------------------------------------* + * Front-VAD + *-----------------------------------------------------------------*/ + + if ( ( error = front_vad( NULL, st, hEncoderConfig, &hFrontVad, 0 /* MCT_flag */, input_frame, vad_flag_dtx, fr_bands, Etot, lf_E, localVAD_HE_SAD, vad_hover_flag, band_energies, &PS[0], &st->Bin_E[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + + noise_est_down( fr_bands[0], hFrontVad->hNoiseEst->bckr, tmpN, tmpE, st->min_band, st->max_band, &hFrontVad->hNoiseEst->totalNoise, Etot[0], &hFrontVad->hNoiseEst->Etot_last, &hFrontVad->hNoiseEst->Etot_v_h2 ); + corr_shift = correlation_shift( hFrontVad->hNoiseEst->totalNoise ); + dtx( st, hEncoderConfig->ivas_total_brate, vad_flag_dtx[0], inp_12k8 ); + /* linear prediction analysis */ + alw_pitch_lag_12k8[0] = st->old_pitch_la; + alw_pitch_lag_12k8[1] = st->old_pitch_la; + alw_voicing[0] = st->voicing[2]; + alw_voicing[1] = st->voicing[2]; + analy_lp( inp_12k8, L_FRAME, L_LOOK_12k8, &res_energy, A, epsP, lsp_new, lsp_mid, st->lsp_old1, alw_pitch_lag_12k8, alw_voicing, INT_FS_12k8, 0 /* <-- sec_chan_low_rate */ ); + + relE = Etot[0] - st->lp_speech; + + find_wsp( L_FRAME, L_SUBFR, NB_SUBFR, A, Aw, inp_12k8, TILT_FAC, wsp, &st->mem_wsp, GAMMA1, L_LOOK_12k8 ); + + if ( st->vad_flag == 0 ) + { + /* reset the OL pitch tracker memories during inactive frames */ + pitch_ol_init( &st->old_thres, &st->old_pitch, &st->delta_pit, &st->old_corr ); + } + + old_pitch = st->pitch[1]; + pitch_ol( st->pitch, st->voicing, &st->old_pitch, &st->old_corr, corr_shift, &st->old_thres, &st->delta_pit, st->old_wsp2, wsp, st->mem_decim2, relE, L_LOOK_12k8, st->clas, st->input_bwidth, st->Opt_SC_VBR ); + + /* Updates for adaptive lag window memory */ + st->old_pitch_la = st->pitch[2]; + + /* Detection of very short stable pitch period */ + StableHighPitchDetect( &flag_spitch, st->pitch, st->voicing, st->Bin_E, wsp, st->localVAD, &st->voicing_sm, &st->voicing0_sm, &st->LF_EnergyRatio_sm, &st->predecision_flag, &st->diff_sm, &st->energy_sm ); + + if ( st->hSpMusClas != NULL ) + { + int16_t dummy_int; + dummy_int = 0; + loc_harm = multi_harm( st->Bin_E, hFrontVad->hNoiseEst->old_S, hFrontVad->hNoiseEst->cor_map, &hFrontVad->hNoiseEst->multi_harm_limit, st->total_brate, st->bwidth, ( st->hGSCEnc != NULL ) ? &st->hGSCEnc->cor_strong_limit : &dummy_int, &st->hSpMusClas->mean_avr_dyn, &st->hSpMusClas->last_sw_dyn, &cor_map_sum, &dummy, S_map ); + } + + noise_est( st, old_pitch, tmpN, epsP, Etot[0], Etot[0] - hFrontVad->lp_speech, corr_shift, tmpE, fr_bands[0], &cor_map_sum, &ncharX, &sp_div, &non_staX, &loc_harm, lf_E[0], &hFrontVad->hNoiseEst->harm_cor_cnt, hFrontVad->hNoiseEst->Etot_l_lp, &dummy, S_map, NULL, hFrontVad, hFrontVad->ini_frame ); + + vad_param_updt( st, corr_shift, corr_shift, A, st->pitch[1], &hFrontVad, 1 ); + + /* 1st stage speech/music classification (GMM model) */ + /* run only to get 'high_lpn_flag' parameter */ + ivas_smc_gmm( st, NULL, localVAD_HE_SAD[0], Etot[0], lsp_new, cor_map_sum, epsP, PS, non_staX, relE, &high_lpn_flag, flag_spitch ); + + /* long-term energy update */ + long_enr( st, -1, localVAD_HE_SAD[0], high_lpn_flag, &hFrontVad, 1, localVAD_HE_SAD, Etot ); + + /* increase ini_frame counter */ + hFrontVad->ini_frame = min( hFrontVad->ini_frame + 1, MAX_FRAME_COUNTER ); + st->ini_frame = hFrontVad->ini_frame; + + hSpar->front_vad_flag = st->vad_flag; + hSpar->front_vad_dtx_flag = 1; + if ( st->core_brate == SID_2k40 || st->core_brate == FRAME_NO_DATA ) + { + hSpar->front_vad_dtx_flag = 0; + } + hSpar->force_front_vad = 1; + st->last_core = 0; + } + else + { + hSpar->front_vad_flag = 1; + hSpar->front_vad_dtx_flag = 0; + hSpar->force_front_vad = 0; + } + + pop_wmops(); + return error; +} diff --git a/lib_enc/ivas_init_enc.c b/lib_enc/ivas_init_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..ba4e0eaa1a6904be7ca1891195168396f66f28f2 --- /dev/null +++ b/lib_enc/ivas_init_enc.c @@ -0,0 +1,1253 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include "options.h" +#include "ivas_cnst.h" +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_stat_enc.h" +#include "ivas_rom_com.h" +#include "wmc_auto.h" + + +/*-------------------------------------------------------------------* + * ivas_write_format() + * + * Write IVAS format signaling + *-------------------------------------------------------------------*/ + +void ivas_write_format( + Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ +) +{ + int16_t ind, nBits, extra_bits; + + ind = 0; + nBits = IVAS_FORMAT_SIGNALING_NBITS; + extra_bits = ( IVAS_FORMAT_SIGNALING_NBITS_EXTENDED - IVAS_FORMAT_SIGNALING_NBITS ); + + switch ( st_ivas->hEncoderConfig->ivas_format ) + { + case STEREO_FORMAT: + ind = 0; + break; + case ISM_FORMAT: + ind = 2; + if ( st_ivas->hEncoderConfig->ivas_total_brate >= IVAS_24k4 ) + { + ind = 4; + nBits += extra_bits; + } + break; + case MC_FORMAT: + ind = 1; + break; + case SBA_FORMAT: + ind = 6; + nBits += extra_bits; + break; + case MASA_FORMAT: + ind = 7; + nBits += extra_bits; + break; + case MASA_ISM_FORMAT: + if ( st_ivas->ism_mode == ISM_MODE_NONE ) + { + ind = 7; /* send MASA format */ + nBits += extra_bits; + } + else + { + ind = 10; + nBits += extra_bits + IVAS_COMBINED_FORMAT_SIGNALLING_BITS; + } + break; + case SBA_ISM_FORMAT: + if ( st_ivas->hEncoderConfig->ivas_total_brate < IVAS_24k4 ) + { + ind = 6; /* send SBA format */ + nBits += extra_bits; + } + else + { + ind = 11; /* 1011 */ + nBits += extra_bits + IVAS_COMBINED_FORMAT_SIGNALLING_BITS; + } + break; + default: + assert( !"Invalid format. Aborting." ); + break; + } + + if ( st_ivas->hSCE[0] != NULL ) + { + push_indice( st_ivas->hSCE[0]->hCoreCoder[0]->hBstr, IND_IVAS_FORMAT, ind, nBits ); + } + else if ( st_ivas->hCPE[0] != NULL ) + { + push_indice( st_ivas->hCPE[0]->hCoreCoder[0]->hBstr, IND_IVAS_FORMAT, ind, nBits ); + } + + return; +} + + +/*-------------------------------------------------------------------* + * ivas_write_format_sid() + * + * Write IVAS format signaling in SID frames + *-------------------------------------------------------------------*/ + +void ivas_write_format_sid( + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const int16_t element_mode, /* i : element bitrate */ + BSTR_ENC_HANDLE hBstr /* i/o: encoder bitstream handle */ +) +{ + int16_t ind = 0; /* to avoid compilation warning */ + + switch ( ivas_format ) + { + case STEREO_FORMAT: + if ( element_mode == IVAS_CPE_MDCT ) + { + ind = SID_MDCT_STEREO; + } + else if ( element_mode == IVAS_CPE_DFT ) + { + ind = SID_DFT_STEREO; + } + else + { + assert( !"Wrong stereo mode for SID format signaling" ); + } + break; + case ISM_FORMAT: + ind = SID_ISM; + break; + case MC_FORMAT: + ind = SID_MULTICHANNEL; + break; + case SBA_FORMAT: + switch ( element_mode ) + { + case IVAS_SCE: + ind = SID_SBA_1TC; + break; + case IVAS_CPE_MDCT: + ind = SID_SBA_2TC; + break; + default: + assert( !"Wrong element mode for SBA DTX!" ); + break; + } + break; + case MASA_FORMAT: + if ( element_mode == IVAS_SCE ) + { + ind = SID_MASA_1TC; + } + else + { + ind = SID_MASA_2TC; + } + break; + default: + assert( !"Reserved SID format symbol written." ); + break; + } + + push_indice( hBstr, IND_IVAS_FORMAT, ind, SID_FORMAT_NBITS ); + + return; +} + + +/*-------------------------------------------------------------------* + * getNumChanAnalysis() + * + * get number of input channels used for analysis/coding + *-------------------------------------------------------------------*/ + +/*! r: number of channels to be analysed */ +int16_t getNumChanAnalysis( + Encoder_Struct *st_ivas /* i : IVAS encoder structure */ +) +{ + int16_t n; + + n = st_ivas->nSCE + CPE_CHANNELS * st_ivas->nCPE; + if ( st_ivas->hEncoderConfig->ivas_format == SBA_FORMAT ) + { + n = ( st_ivas->sba_analysis_order + 1 ) * ( st_ivas->sba_analysis_order + 1 ); + } + else if ( st_ivas->hEncoderConfig->ivas_format == MC_FORMAT && ( st_ivas->mc_mode == MC_MODE_PARAMMC || st_ivas->mc_mode == MC_MODE_MCMASA ) ) + { + n = st_ivas->hEncoderConfig->nchan_inp; + } + else if ( st_ivas->hEncoderConfig->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) + { + n = st_ivas->hEncoderConfig->nchan_inp; + } + else if ( st_ivas->hEncoderConfig->ivas_format == ISM_FORMAT && st_ivas->ism_mode == ISM_MODE_PARAM ) + { + n = st_ivas->hEncoderConfig->nchan_inp; + } + else if ( st_ivas->hEncoderConfig->ivas_format == MASA_ISM_FORMAT ) + { + n = st_ivas->hEncoderConfig->nchan_inp; + } + else if ( st_ivas->hEncoderConfig->ivas_format == SBA_ISM_FORMAT ) + { + n = st_ivas->hEncoderConfig->nchan_ism + ( st_ivas->sba_analysis_order + 1 ) * ( st_ivas->sba_analysis_order + 1 ); + } + + return n; +} + + +/*-------------------------------------------------------------------* + * copy_encoder_config() + * + * Copy configuration structrue to the state structrure + *-------------------------------------------------------------------*/ + +void copy_encoder_config( + Encoder_Struct *st_ivas, /* i : IVAS encoder structure */ + Encoder_State *st, /* o : encoder state structure */ + const int16_t flag_all /* i : flag 1==update all, 0=partial update*/ +) +{ + if ( flag_all ) + { + st->input_Fs = st_ivas->hEncoderConfig->input_Fs; + + st->last_codec_mode = st_ivas->last_codec_mode; + st->last_total_brate = st_ivas->hEncoderConfig->last_ivas_total_brate; + + st->Opt_DTX_ON = st_ivas->hEncoderConfig->Opt_DTX_ON; + + st->last_Opt_SC_VBR = st_ivas->hEncoderConfig->last_Opt_SC_VBR; + } + + st->Opt_AMR_WB = st_ivas->hEncoderConfig->Opt_AMR_WB; + st->Opt_SC_VBR = st_ivas->hEncoderConfig->Opt_SC_VBR; + + st->codec_mode = st_ivas->codec_mode; + st->max_bwidth = st_ivas->hEncoderConfig->max_bwidth; + + st->Opt_RF_ON = st_ivas->hEncoderConfig->Opt_RF_ON; + st->rf_fec_offset = st_ivas->hEncoderConfig->rf_fec_offset; + st->rf_fec_indicator = st_ivas->hEncoderConfig->rf_fec_indicator; + + st->element_mode = st_ivas->hEncoderConfig->element_mode_init; + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_initialize_handles_enc() + * + * NULL initialization of handles + *-------------------------------------------------------------------------*/ + +void ivas_initialize_handles_enc( + Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ +) +{ + int16_t i; + + for ( i = 0; i < MAX_SCE; i++ ) + { + st_ivas->hSCE[i] = NULL; + } + + for ( i = 0; i < MAX_CPE; i++ ) + { + st_ivas->hCPE[i] = NULL; + } + + st_ivas->mem_hp20_in = NULL; + + /* ISM metadata handles */ + for ( i = 0; i < MAX_NUM_OBJECTS; i++ ) + { + st_ivas->hIsmMetaData[i] = NULL; + } + + /* ISM DTX handle */ + st_ivas->hISMDTX = NULL; + + /* Q Metadata handle */ + st_ivas->hQMetaData = NULL; + + /* DirAC handle */ + st_ivas->hDirAC = NULL; + + /* ParamISM handle */ + st_ivas->hParamIsm = NULL; + /* SPAR handle */ + st_ivas->hSpar = NULL; + + /* MASA encoder handle */ + st_ivas->hMasa = NULL; + + /* MCT handle */ + st_ivas->hMCT = NULL; + + /* MC Param-Upmix handle */ + st_ivas->hMCParamUpmix = NULL; + + /* Parametric MC handle */ + st_ivas->hParamMC = NULL; + + /* Multi-channel MASA handle */ + st_ivas->hMcMasa = NULL; + + /* Stereo downmix for EVS encoder handle */ + st_ivas->hStereoDmxEVS = NULL; + + /* LFE handle */ + st_ivas->hLFE = NULL; + + /* LFE low pass filter handle */ + st_ivas->hLfeLpf = NULL; + + /* Object MASA handle */ + st_ivas->hOMasa = NULL; + + /* OSBA handle */ + st_ivas->hOSba = NULL; + + return; +} + + +/*-------------------------------------------------------------------* + * ivas_init_encoder() + * + * Initialize IVAS encoder state structure + *-------------------------------------------------------------------*/ + +ivas_error ivas_init_encoder( + Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ +) +{ + int16_t i, n; + int16_t nchan_inp_buff; + int16_t sce_id, cpe_id; + IVAS_FORMAT ivas_format; + int32_t input_Fs, ivas_total_brate; + int32_t element_brate_tmp[MAX_NUM_OBJECTS]; + ENCODER_CONFIG_HANDLE hEncoderConfig; + ivas_error error; + + error = IVAS_ERR_OK; + + hEncoderConfig = st_ivas->hEncoderConfig; + ivas_format = hEncoderConfig->ivas_format; + input_Fs = hEncoderConfig->input_Fs; + ivas_total_brate = hEncoderConfig->ivas_total_brate; + + hEncoderConfig->last_ivas_total_brate = ivas_total_brate; + + if ( ivas_format != MONO_FORMAT ) + { + /* In IVAS, ensure that minimum coded bandwidth is WB */ + hEncoderConfig->max_bwidth = max( hEncoderConfig->max_bwidth, WB ); + } + st_ivas->ism_mode = ISM_MODE_NONE; + st_ivas->mc_mode = MC_MODE_NONE; + + st_ivas->nchan_transport = -1; + + /*-----------------------------------------------------------------* + * Allocate floating-point input audio buffers + *-----------------------------------------------------------------*/ + + nchan_inp_buff = hEncoderConfig->nchan_inp; + if ( ivas_format == MONO_FORMAT ) + { + nchan_inp_buff = 0; + } + else if ( ivas_format == MASA_ISM_FORMAT ) + { + if ( hEncoderConfig->nchan_inp - hEncoderConfig->nchan_ism == 1 ) /* mono is duplicated in monoMASA */ + { + nchan_inp_buff++; + } + + nchan_inp_buff++; /* for *data_separated_object */ + } + + for ( n = 0; n < nchan_inp_buff; n++ ) + { + /* note: these are intra-frame heap memories */ + if ( ( st_ivas->p_data_f[n] = (float *) malloc( ( input_Fs / FRAMES_PER_SEC ) * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for floating-point input audio buffer!\n" ) ); + } + } + for ( ; n < MAX_INPUT_CHANNELS + MAX_NUM_OBJECTS; n++ ) + { + st_ivas->p_data_f[n] = NULL; + } + + /*-----------------------------------------------------------------* + * Allocate and initialize buffer of indices + *-----------------------------------------------------------------*/ + + /* set the maximum allowed number of indices in the list */ + st_ivas->ivas_max_num_indices = get_ivas_max_num_indices( ivas_format, ivas_total_brate ); + + /* allocate buffer of indices */ + if ( ( st_ivas->ind_list = (INDICE_HANDLE) malloc( st_ivas->ivas_max_num_indices * sizeof( Indice ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for buffer of indices!\n" ) ); + } + + /* reset the list of indices */ + for ( i = 0; i < st_ivas->ivas_max_num_indices; i++ ) + { + st_ivas->ind_list[i].nb_bits = -1; + } + + /* set the maximum allowed number of metadata indices in the list */ + st_ivas->ivas_max_num_indices_metadata = get_ivas_max_num_indices_metadata( st_ivas->hEncoderConfig->ivas_format, st_ivas->hEncoderConfig->ivas_total_brate ); + + /* allocate buffer of metadata indices */ + if ( st_ivas->ivas_max_num_indices_metadata > 0 ) + { + if ( ( st_ivas->ind_list_metadata = (INDICE_HANDLE) malloc( st_ivas->ivas_max_num_indices_metadata * sizeof( Indice ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for buffer of metadata indices!\n" ) ); + } + + /* reset the list of metadata indices */ + for ( i = 0; i < st_ivas->ivas_max_num_indices_metadata; i++ ) + { + st_ivas->ind_list_metadata[i].nb_bits = -1; + } + } + else + { + st_ivas->ind_list_metadata = NULL; + } + + /*-----------------------------------------------------------------* + * Allocate and initialize SCE/CPE and other handles + *-----------------------------------------------------------------*/ + + if ( ivas_format == MONO_FORMAT ) + { + st_ivas->nSCE = 1; /* in mono, there is always only one SCE */ + st_ivas->nCPE = 0; + st_ivas->nchan_transport = 1; + sce_id = 0; + + if ( ( error = create_sce_enc( st_ivas, sce_id, ivas_total_brate ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* prepare stereo downmix for EVS */ + if ( hEncoderConfig->stereo_dmx_evs == 1 ) + { + if ( ( error = stereo_dmx_evs_init_encoder( &( st_ivas->hStereoDmxEVS ), input_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + else if ( ivas_format == STEREO_FORMAT ) + { + st_ivas->nSCE = 0; + st_ivas->nCPE = 1; /* in stereo, there is always only one CPE */ + st_ivas->nchan_transport = CPE_CHANNELS; + cpe_id = 0; + + if ( ( error = create_cpe_enc( st_ivas, cpe_id, ivas_total_brate ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( ivas_format == ISM_FORMAT ) + { + st_ivas->ism_mode = ivas_ism_mode_select( hEncoderConfig->nchan_inp, ivas_total_brate ); + + if ( ( error = ivas_ism_metadata_enc_create( st_ivas, hEncoderConfig->nchan_inp, element_brate_tmp ) ) != IVAS_ERR_OK ) + { + return error; + } + + for ( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) + { + if ( ( error = create_sce_enc( st_ivas, sce_id, element_brate_tmp[sce_id] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( st_ivas->ism_mode == ISM_MODE_PARAM ) + { + if ( ( error = ivas_param_ism_enc_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( st_ivas->hEncoderConfig->Opt_DTX_ON ) + { + if ( ( error = ivas_ism_dtx_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + else if ( ivas_format == SBA_FORMAT || ivas_format == MASA_FORMAT ) + { + if ( ( error = ivas_qmetadata_open( &( st_ivas->hQMetaData ) ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ivas_format == SBA_FORMAT ) + { + st_ivas->sba_analysis_order = ivas_sba_get_analysis_order( ivas_total_brate, st_ivas->hEncoderConfig->sba_order ); + + if ( ( error = ivas_spar_enc_open( st_ivas, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = ivas_dirac_enc_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + st_ivas->nchan_transport = hEncoderConfig->nchan_inp; + + if ( ( error = ivas_masa_enc_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + for ( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) + { + if ( ( error = create_sce_enc( st_ivas, sce_id, ivas_total_brate / st_ivas->nchan_transport ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ivas_format == SBA_FORMAT && st_ivas->hEncoderConfig->Opt_DTX_ON ) + { + st_ivas->hSCE[sce_id]->hCoreCoder[0]->dtx_sce_sba = 1; + } + } + + for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) + { + if ( ( error = create_cpe_enc( st_ivas, cpe_id, ( ivas_total_brate / st_ivas->nchan_transport ) * CPE_CHANNELS ) ) != IVAS_ERR_OK ) + { + return error; + } + + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + if ( hEncoderConfig->Opt_DTX_ON ) + { + st_ivas->hCPE[cpe_id]->hCoreCoder[n]->cng_sba_flag = 1; + } + } + } + + if ( st_ivas->nCPE > 1 ) + { + if ( ( error = create_mct_enc( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + else if ( ivas_format == MASA_ISM_FORMAT ) + { + int32_t ism_total_brate; + int16_t k; + + st_ivas->ism_mode = ivas_omasa_ism_mode_select( ivas_total_brate, hEncoderConfig->nchan_ism ); + st_ivas->nchan_transport = 2; + + if ( ( error = ivas_ism_metadata_enc_create( st_ivas, hEncoderConfig->nchan_ism, element_brate_tmp ) ) != IVAS_ERR_OK ) + { + return error; + } + + k = 0; + while ( k < SIZE_IVAS_BRATE_TBL && ivas_total_brate != ivas_brate_tbl[k] ) + { + k++; + } + + ism_total_brate = 0; + for ( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) + { + ism_total_brate += sep_object_brate[k - 2][st_ivas->nSCE - 1]; + if ( ( error = create_sce_enc( st_ivas, sce_id, sep_object_brate[k - 2][st_ivas->nSCE - 1] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( ( error = ivas_qmetadata_open( &( st_ivas->hQMetaData ) ) ) != IVAS_ERR_OK ) + { + return error; + } + if ( ( error = ivas_masa_enc_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( st_ivas->ism_mode != ISM_MASA_MODE_DISC ) + { + if ( ( error = ivas_omasa_enc_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( ivas_total_brate - ism_total_brate >= MIN_BRATE_MDCT_STEREO ) + { + st_ivas->hEncoderConfig->element_mode_init = IVAS_CPE_MDCT; + } + else + { + st_ivas->hEncoderConfig->element_mode_init = IVAS_CPE_DFT; + } + + if ( ( error = create_cpe_enc( st_ivas, 0, ivas_total_brate - ism_total_brate ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( ivas_format == SBA_ISM_FORMAT ) + { + st_ivas->ism_mode = ISM_MODE_NONE; + + if ( ivas_total_brate >= IVAS_256k ) + { + st_ivas->ism_mode = ISM_SBA_MODE_DISC; + } + + if ( ( error = ivas_ism_metadata_enc_create( st_ivas, hEncoderConfig->nchan_ism, element_brate_tmp ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* allocate and initialize SBA handles */ + if ( ( error = ivas_qmetadata_open( &( st_ivas->hQMetaData ) ) ) != IVAS_ERR_OK ) + { + return error; + } + + st_ivas->sba_analysis_order = ivas_sba_get_analysis_order( ivas_total_brate, st_ivas->hEncoderConfig->sba_order ); + + if ( ( error = ivas_spar_enc_open( st_ivas, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = ivas_dirac_enc_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( st_ivas->ism_mode == ISM_MODE_NONE ) + { + /* allocate and initialize SBA core-coders */ + if ( st_ivas->nchan_transport == 1 ) + { + if ( ( error = create_sce_enc( st_ivas, 0, ivas_total_brate ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) + { + if ( ( error = create_cpe_enc( st_ivas, cpe_id, ( ivas_total_brate / st_ivas->nchan_transport ) * CPE_CHANNELS ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( st_ivas->nCPE > 1 ) + { + if ( ( error = create_mct_enc( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + else + { + /* allocate and initialize MCT core coder */ + st_ivas->nCPE += ( st_ivas->hEncoderConfig->nchan_ism + 1 ) >> 1; + + for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) + { + if ( ( error = create_cpe_enc( st_ivas, cpe_id, ( ivas_total_brate / st_ivas->nchan_transport ) * CPE_CHANNELS ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( ( error = create_mct_enc( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( ( error = ivas_osba_enc_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( ivas_format == MC_FORMAT ) + { + st_ivas->mc_mode = ivas_mc_mode_select( hEncoderConfig->mc_input_setup, ivas_total_brate ); + + if ( ( error = ivas_create_lfe_lpf_enc( &st_ivas->hLfeLpf, hEncoderConfig->input_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( st_ivas->mc_mode == MC_MODE_MCT ) + { + st_ivas->nSCE = 0; + st_ivas->nCPE = hEncoderConfig->nchan_inp / CPE_CHANNELS; + + for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) + { + if ( ( error = create_cpe_enc( st_ivas, cpe_id, ( ivas_total_brate / ( hEncoderConfig->nchan_inp - 1 ) * CPE_CHANNELS ) ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( ( error = create_mct_enc( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = ivas_create_lfe_enc( &st_ivas->hLFE, input_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } + + st_ivas->nchan_transport = ivas_mc_ls_setup_get_num_channels( st_ivas->hEncoderConfig->mc_input_setup ); + } + else if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) + { + st_ivas->nSCE = 0; + st_ivas->nCPE = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS / 2; + st_ivas->nchan_transport = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS; + + if ( ( error = ivas_mc_paramupmix_enc_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + + for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) + { + if ( ( error = create_cpe_enc( st_ivas, cpe_id, ( ivas_total_brate / st_ivas->nCPE ) ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( ( error = create_mct_enc( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = ivas_create_lfe_enc( &st_ivas->hLFE, input_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->mc_mode == MC_MODE_PARAMMC ) + { + if ( ( error = ivas_param_mc_enc_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + + for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) + { + if ( ( error = create_cpe_enc( st_ivas, cpe_id, ivas_total_brate / ( st_ivas->nCPE + st_ivas->nSCE ) ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( st_ivas->nCPE > 1 ) + { + if ( ( error = create_mct_enc( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + else if ( st_ivas->mc_mode == MC_MODE_MCMASA ) + { + int32_t brate_sce, brate_cpe; + + ivas_mcmasa_setNumTransportChannels( &( st_ivas->nchan_transport ), &( hEncoderConfig->element_mode_init ), ivas_total_brate ); + + if ( ( error = ivas_qmetadata_open( &( st_ivas->hQMetaData ) ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = ivas_masa_enc_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = ivas_mcmasa_enc_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + + ivas_mcmasa_split_brate( st_ivas->hMcMasa->separateChannelEnabled, ivas_total_brate, st_ivas->nSCE, st_ivas->nCPE, &brate_sce, &brate_cpe ); + + for ( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) + { + if ( ( error = create_sce_enc( st_ivas, sce_id, brate_sce ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) + { + hEncoderConfig->element_mode_init = IVAS_CPE_MDCT; + + if ( ( error = create_cpe_enc( st_ivas, cpe_id, brate_cpe ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + } + + /*-----------------------------------------------------------------* + * Allocate and initialize HP20 filter memories + *-----------------------------------------------------------------*/ + + /* set number of input channels used for analysis/coding */ + n = getNumChanAnalysis( st_ivas ); + + if ( n > 0 ) + { + if ( ( st_ivas->mem_hp20_in = (float **) malloc( n * sizeof( float * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HP20 filter memory\n" ) ); + } + } + else + { + st_ivas->mem_hp20_in = NULL; + } + + for ( i = 0; i < n; i++ ) + { + if ( ( st_ivas->mem_hp20_in[i] = (float *) malloc( L_HP20_MEM * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HP20 filter memory\n" ) ); + } + + set_f( st_ivas->mem_hp20_in[i], 0.0f, L_HP20_MEM ); + } + + return error; +} + + +/*------------------------------------------------------------------------- + * destroy_core_enc() + * + * Close core encoder handles + *-------------------------------------------------------------------------*/ + +void destroy_core_enc( + ENC_CORE_HANDLE hCoreCoder /* i/o: core encoder structure */ +) +{ + int16_t i; + + destroy_cldfb_encoder( hCoreCoder ); + + if ( hCoreCoder->hSignalBuf != NULL ) + { + free( hCoreCoder->hSignalBuf ); + hCoreCoder->hSignalBuf = NULL; + } + + if ( hCoreCoder->hBstr != NULL ) + { + /* reset buffer of indices */ + for ( i = 0; i < hCoreCoder->hBstr->nb_ind_tot; i++ ) + { + hCoreCoder->hBstr->ind_list[i].nb_bits = -1; + } + free( hCoreCoder->hBstr ); + hCoreCoder->hBstr = NULL; + } + + if ( hCoreCoder->hLPDmem != NULL ) + { + free( hCoreCoder->hLPDmem ); + hCoreCoder->hLPDmem = NULL; + } + + if ( hCoreCoder->hTranDet != NULL ) + { + free( hCoreCoder->hTranDet ); + hCoreCoder->hTranDet = NULL; + } + + if ( hCoreCoder->hNoiseEst != NULL ) + { + free( hCoreCoder->hNoiseEst ); + hCoreCoder->hNoiseEst = NULL; + } + + if ( hCoreCoder->hVAD != NULL ) + { + free( hCoreCoder->hVAD ); + hCoreCoder->hVAD = NULL; + } + + if ( hCoreCoder->hVAD_CLDFB != NULL ) + { + free( hCoreCoder->hVAD_CLDFB ); + hCoreCoder->hVAD_CLDFB = NULL; + } + + if ( hCoreCoder->hTdCngEnc != NULL ) + { + free( hCoreCoder->hTdCngEnc ); + hCoreCoder->hTdCngEnc = NULL; + } + + if ( hCoreCoder->hDtxEnc != NULL ) + { + free( hCoreCoder->hDtxEnc ); + hCoreCoder->hDtxEnc = NULL; + } + + if ( hCoreCoder->hSpMusClas != NULL ) + { + free( hCoreCoder->hSpMusClas ); + hCoreCoder->hSpMusClas = NULL; + } + + if ( hCoreCoder->hGSCEnc != NULL ) + { + free( hCoreCoder->hGSCEnc ); + hCoreCoder->hGSCEnc = NULL; + } + + if ( hCoreCoder->hSC_VBR != NULL ) + { + free( hCoreCoder->hSC_VBR ); + hCoreCoder->hSC_VBR = NULL; + } + + if ( hCoreCoder->hAmrwb_IO != NULL ) + { + free( hCoreCoder->hAmrwb_IO ); + hCoreCoder->hAmrwb_IO = NULL; + } + + if ( hCoreCoder->hBWE_TD != NULL ) + { + free( hCoreCoder->hBWE_TD ); + hCoreCoder->hBWE_TD = NULL; + } + + if ( hCoreCoder->hBWE_FD != NULL ) + { + free( hCoreCoder->hBWE_FD ); + hCoreCoder->hBWE_FD = NULL; + } + + if ( hCoreCoder->hRF != NULL ) + { + free( hCoreCoder->hRF ); + hCoreCoder->hRF = NULL; + } + + if ( hCoreCoder->hTECEnc != NULL ) + { + free( hCoreCoder->hTECEnc ); + hCoreCoder->hTECEnc = NULL; + } + + if ( hCoreCoder->hTcxEnc != NULL ) + { + free( hCoreCoder->hTcxEnc ); + hCoreCoder->hTcxEnc = NULL; + } + + if ( hCoreCoder->hTcxCfg != NULL ) + { + free( hCoreCoder->hTcxCfg ); + hCoreCoder->hTcxCfg = NULL; + } + + if ( hCoreCoder->hIGFEnc != NULL ) + { + free( hCoreCoder->hIGFEnc ); + hCoreCoder->hIGFEnc = NULL; + } + + if ( hCoreCoder->hPlcExt != NULL ) + { + free( hCoreCoder->hPlcExt ); + hCoreCoder->hPlcExt = NULL; + } + + if ( hCoreCoder->hHQ_core != NULL ) + { + free( hCoreCoder->hHQ_core ); + hCoreCoder->hHQ_core = NULL; + } + + free( hCoreCoder ); + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_destroy_enc() + * + * Close IVAS encoder handles + *-------------------------------------------------------------------------*/ + +void ivas_destroy_enc( + Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ +) +{ + int16_t i, n, nchan_inp; + nchan_inp = st_ivas->hEncoderConfig->nchan_inp; + + /* SCE handles */ + for ( i = 0; i < MAX_SCE; i++ ) + { + if ( st_ivas->hSCE[i] != NULL ) + { + destroy_sce_enc( st_ivas->hSCE[i] ); + st_ivas->hSCE[i] = NULL; + } + } + + /* CPE handles */ + for ( i = 0; i < MAX_CPE; i++ ) + { + if ( st_ivas->hCPE[i] != NULL ) + { + destroy_cpe_enc( st_ivas->hCPE[i] ); + st_ivas->hCPE[i] = NULL; + } + } + + /* HP20 filter handles */ + if ( st_ivas->mem_hp20_in != NULL ) + { + n = getNumChanAnalysis( st_ivas ); + + for ( i = 0; i < n; i++ ) + { + free( st_ivas->mem_hp20_in[i] ); + st_ivas->mem_hp20_in[i] = NULL; + } + free( st_ivas->mem_hp20_in ); + st_ivas->mem_hp20_in = NULL; + } + + /* ISM metadata handles */ + ivas_ism_metadata_close( st_ivas->hIsmMetaData, 0 ); + + /* ISM DTX Handle */ + if ( st_ivas->hISMDTX != NULL ) + { + free( st_ivas->hISMDTX ); + st_ivas->hISMDTX = NULL; + } + + /* Q Metadata handle */ + ivas_qmetadata_close( &( st_ivas->hQMetaData ) ); + + /* DirAC handle */ + ivas_dirac_enc_close( &( st_ivas->hDirAC ), st_ivas->hEncoderConfig->input_Fs ); + + /* ParamISM handle */ + ivas_param_ism_enc_close( &( st_ivas->hParamIsm ), st_ivas->hEncoderConfig->input_Fs ); + + /* SPAR handle */ + ivas_spar_enc_close( &( st_ivas->hSpar ), st_ivas->hEncoderConfig->input_Fs, nchan_inp, 0 ); + + /* MASA handle */ + ivas_masa_enc_close( &( st_ivas->hMasa ) ); + + /* MCT handle */ + ivas_mct_enc_close( &( st_ivas->hMCT ) ); + + /* LFE handle */ + ivas_lfe_enc_close( &( st_ivas->hLFE ) ); + + /* LFE low pass filter state */ + ivas_lfe_lpf_enc_close( &( st_ivas->hLfeLpf ) ); + + /* Param-Upmix MC handle */ + ivas_mc_paramupmix_enc_close( &( st_ivas->hMCParamUpmix ), st_ivas->hEncoderConfig->input_Fs ); + + /* Parametric MC handle */ + ivas_param_mc_enc_close( &( st_ivas->hParamMC ), st_ivas->hEncoderConfig->input_Fs ); + + /* Multi-channel MASA handle */ + ivas_mcmasa_enc_close( &( st_ivas->hMcMasa ), st_ivas->hEncoderConfig->input_Fs ); + + /* OMASA handle */ + ivas_omasa_enc_close( &( st_ivas->hOMasa ) ); + + /* OSBA handle */ + ivas_osba_enc_close( &( st_ivas->hOSba ) ); + + /* Stereo downmix for EVS encoder handle */ + stereo_dmx_evs_close_encoder( &( st_ivas->hStereoDmxEVS ) ); + + /* Encoder configuration handle */ + if ( st_ivas->hEncoderConfig != NULL ) + { + free( st_ivas->hEncoderConfig ); + st_ivas->hEncoderConfig = NULL; + } + + /* Buffer of indices */ + if ( st_ivas->ind_list != NULL ) + { + free( st_ivas->ind_list ); + } + + if ( st_ivas->ind_list_metadata != NULL ) + { + free( st_ivas->ind_list_metadata ); + } + + /* floating-point input audio buffers */ + for ( n = 0; n < MAX_INPUT_CHANNELS + MAX_NUM_OBJECTS; n++ ) + { + if ( st_ivas->p_data_f[n] != NULL ) + { + free( st_ivas->p_data_f[n] ); + st_ivas->p_data_f[n] = NULL; + } + } + + /* main IVAS handle */ + free( st_ivas ); + + return; +} + +/*------------------------------------------------------------------------- + * ivas_initialize_MD_bstr_enc() + * + * Allocate and initialize SCE/CPE MD bitstream handle + *-------------------------------------------------------------------------*/ + +ivas_error ivas_initialize_MD_bstr_enc( + BSTR_ENC_HANDLE *hMetaData_out, /* o : encoder MD bitstream handle */ + Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ +) +{ + BSTR_ENC_HANDLE hMetaData; + + if ( ( hMetaData = (BSTR_ENC_HANDLE) malloc( sizeof( BSTR_ENC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MetaData structure\n" ) ); + } + + /* set pointer to the buffer of metadata indices */ + hMetaData->ind_list = st_ivas->ind_list_metadata; + hMetaData->ivas_ind_list_zero = &st_ivas->ind_list_metadata; + hMetaData->ivas_max_num_indices = &st_ivas->ivas_max_num_indices_metadata; + hMetaData->st_ivas = st_ivas; + + reset_indices_enc( hMetaData, st_ivas->ivas_max_num_indices_metadata ); + + *hMetaData_out = hMetaData; + + return IVAS_ERR_OK; +} + + +/*------------------------------------------------------------------------- + * ivas_destroy_MD_bstr_enc() + * + * Destroy SCE/CPE MD bitstream handle + *-------------------------------------------------------------------------*/ + +void ivas_destroy_MD_bstr_enc( + BSTR_ENC_HANDLE *hMetaData /* i/o: encoder MD bitstream handle */ +) +{ + if ( hMetaData == NULL || *hMetaData == NULL ) + { + return; + } + + free( *hMetaData ); + *hMetaData = NULL; + + return; +} diff --git a/lib_enc/ivas_ism_dtx_enc.c b/lib_enc/ivas_ism_dtx_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..60737e73105163e964b25005beaf9d1007ab18bd --- /dev/null +++ b/lib_enc/ivas_ism_dtx_enc.c @@ -0,0 +1,411 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include "options.h" +#include "ivas_cnst.h" +#include "prot.h" +#include "ivas_prot.h" +#include "wmc_auto.h" + + +/*-----------------------------------------------------------------------* + * Local constants + *-----------------------------------------------------------------------*/ + +#define MD_MAX_DIFF_AZIMUTH 10 +#define MD_MAX_DIFF_ELEVATION 10 + + +/*-------------------------------------------------------------------* + * ivas_ism_dtx_open() + * + * Open ISM DTX handle + *-------------------------------------------------------------------*/ + +ivas_error ivas_ism_dtx_open( + Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ +) +{ + ivas_error error; + ISM_DTX_HANDLE hISMDTX; + int16_t i; + + error = IVAS_ERR_OK; + + /* Assign memory to DirAC handle */ + if ( ( hISMDTX = (ISM_DTX_HANDLE) malloc( sizeof( ISM_DTX_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for ISM DTX Handle \n" ) ); + } + + hISMDTX->dtx_flag = 0; + hISMDTX->sce_id_dtx = 0; + hISMDTX->cnt_SID_ISM = -1; + + for ( i = 0; i < MAX_NUM_OBJECTS; i++ ) + { + set_f( hISMDTX->long_term_energy_stereo_dmx_enc[i], 0.0f, PARAM_ISM_HYS_BUF_SIZE ); + } + + set_f( hISMDTX->coh, 0.0f, MAX_NUM_OBJECTS ); + + st_ivas->hISMDTX = hISMDTX; + + return error; +} + + +/*-------------------------------------------------------------------* + * ivas_ism_get_dtx_enc() + * + * Analysis and decision about DTX in ISM format + *-------------------------------------------------------------------*/ + +/*! r: indication of DTX frame */ +int16_t ivas_ism_dtx_enc( + ISM_DTX_HANDLE hISMDTX, /* i/o: ISM DTX handle */ + SCE_ENC_HANDLE hSCE[MAX_SCE], /* i/o: SCE encoder structure */ + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + const int16_t nchan_ism, /* i : number of objects */ + const int16_t nchan_transport, /* i : number of transport channels */ + int16_t vad_flag[MAX_NUM_OBJECTS], /* i : VAD flag */ + ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ + int16_t md_diff_flag[], /* o : metadata differential flag */ + int16_t *sid_flag /* o : indication of SID frame */ +) +{ + int16_t ch, dtx_flag; + int16_t nBits, nBits_MD_max; + int16_t nBits_azimuth, nBits_elevation, nBits_coh, nBits_sce_id; + float lp_noise[MAX_NUM_OBJECTS], lp_noise_variation, lp_noise_mean; + float lp_noise_max; + float tmp1, tmp2; + + /* initialization */ + for ( ch = 0; ch < nchan_transport; ch++ ) + { + hSCE[ch]->hCoreCoder[0]->low_rate_mode = 0; + } + + /*------------------------------------------------------------------* + * compute global ISM DTX flag + *-----------------------------------------------------------------*/ + + /* compute global ISM based on localVAD */ + dtx_flag = 1; + for ( ch = 0; ch < nchan_transport; ch++ ) + { + dtx_flag &= !vad_flag[ch]; + } + + /* compute global ISM based on long-term background noise */ + /* one of the channels is active -> no DTX */ + for ( ch = 0; ch < nchan_transport; ch++ ) + { + lp_noise[ch] = hSCE[ch]->hCoreCoder[0]->lp_noise; + } + + lp_noise_variation = var( lp_noise, nchan_transport ); + lp_noise_mean = mean( lp_noise, nchan_transport ); + + if ( lp_noise_mean > 50 || ( lp_noise_mean > 25 && lp_noise_variation > 32 ) ) + { + dtx_flag = 0; + } + + + /* default DTX is applied at lower bitrates; otherwise DTX is applied only in silence */ + maximum( lp_noise, nchan_transport, &lp_noise_max ); + + if ( !( ( nchan_ism == 1 && ivas_total_brate <= IVAS_24k4 ) || + ( nchan_ism == 2 && ivas_total_brate <= IVAS_48k ) || + ( nchan_ism == 3 && ivas_total_brate <= IVAS_80k ) || + ( nchan_ism == 4 && ivas_total_brate <= IVAS_96k ) || + lp_noise_max < 15 ) ) + { + dtx_flag = 0; + } + + /*------------------------------------------------------------------* + * Reset the bitstream + *-----------------------------------------------------------------*/ + + if ( dtx_flag ) + { + /* reset the bitstream (IVAS format signaling was already written) */ + reset_indices_enc( hSCE[0]->hCoreCoder[0]->hBstr, hSCE[0]->hCoreCoder[0]->hBstr->nb_ind_tot ); + } + + /*------------------------------------------------------------------* + * decide about SID metadata to be sent or not (per object) + * estimate the MD bit-budget consumption + *-----------------------------------------------------------------*/ + + if ( dtx_flag ) + { + ivas_get_ism_sid_quan_bitbudget( nchan_ism, &nBits_azimuth, &nBits_elevation, &tmp1, &tmp2, &nBits_coh, &nBits_sce_id ); + + nBits = 0; + for ( ch = 0; ch < nchan_ism; ch++ ) + { + /* check difference between current and last metadata */ + md_diff_flag[ch] = 0; + if ( fabsf( hIsmMeta[ch]->azimuth - hIsmMeta[ch]->last_azimuth ) > MD_MAX_DIFF_AZIMUTH ) + { + md_diff_flag[ch] = 1; + } + + if ( fabsf( hIsmMeta[ch]->elevation - hIsmMeta[ch]->last_elevation ) > MD_MAX_DIFF_ELEVATION ) + { + md_diff_flag[ch] = 1; + } + + /* estimate SID metadata bit-budget */ + nBits++; /* number of objects */ + nBits++; /* SID metadata flag */ + if ( md_diff_flag[ch] == 1 ) + { + nBits += nBits_azimuth; + nBits += nBits_elevation; + } + } + + /* calculate maximum available MD bit-budget */ + nBits_MD_max = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC; + nBits_MD_max -= SID_FORMAT_NBITS; + if ( nchan_transport > 1 ) + { + nBits_MD_max -= nBits_sce_id; + } + + for ( ch = 0; ch < nchan_transport - 1; ch++ ) + { + nBits_MD_max -= nBits_coh; /* coherence */ + } + + if ( nchan_ism > 3 ) + { + nBits_MD_max--; /* ism_mode flag */ + } + + /* too many metadata bits -> switch to active coding */ + if ( nBits > nBits_MD_max ) + { + dtx_flag = 0; + } + } + + /*------------------------------------------------------------------* + * set core_brate for all channels + * get 'sid_flag' value + *-----------------------------------------------------------------*/ + + *sid_flag = 0; + + if ( !dtx_flag ) + { + /* at least one of the channels is active -> no DTX */ + for ( ch = 0; ch < nchan_transport; ch++ ) + { + hSCE[ch]->hCoreCoder[0]->core_brate = -1; + set_bw( IVAS_SCE, hSCE[ch]->element_brate, hSCE[ch]->hCoreCoder[0], MODE1 ); + } + + hISMDTX->cnt_SID_ISM = -1; + + /* IVAS format signaling was erased in dtx() */ + if ( hSCE[0]->hCoreCoder[0]->hBstr->nb_bits_tot == 0 ) + { + /* replicate ivas_write_format() */ + int16_t ind = 2; + nBits = IVAS_FORMAT_SIGNALING_NBITS; + if ( ivas_total_brate >= IVAS_24k4 ) + { + ind = 4; + nBits = IVAS_FORMAT_SIGNALING_NBITS_EXTENDED; + } + + push_indice( hSCE[0]->hCoreCoder[0]->hBstr, IND_IVAS_FORMAT, ind, nBits ); + } + } + else /* ism_dtx_flag == 1 */ + { + for ( ch = 0; ch < nchan_transport; ch++ ) + { + hSCE[ch]->hCoreCoder[0]->cng_type = FD_CNG; + } + + /* * update the global SID counter */ + hISMDTX->cnt_SID_ISM++; + if ( hISMDTX->cnt_SID_ISM >= hSCE[0]->hCoreCoder[0]->hDtxEnc->max_SID ) + { + /* adaptive SID update interval */ + hSCE[0]->hCoreCoder[0]->hDtxEnc->max_SID = hSCE[0]->hCoreCoder[0]->hDtxEnc->interval_SID; + hISMDTX->cnt_SID_ISM = 0; + } + + /* encode SID in one channel only */ + for ( ch = 0; ch < nchan_transport; ch++ ) + { + hSCE[ch]->hCoreCoder[0]->core_brate = FRAME_NO_DATA; + } + + if ( hISMDTX->cnt_SID_ISM == 0 ) + { + hSCE[hISMDTX->sce_id_dtx]->hCoreCoder[0]->core_brate = SID_2k40; + *sid_flag = 1; + } + } + + if ( dtx_flag == 1 && *sid_flag == 0 ) + { + set_s( md_diff_flag, 0, nchan_transport ); + } + + return dtx_flag; +} + +/*-------------------------------------------------------------------* + * ivas_ism_get_sce_id_dtx() + * + * + *-------------------------------------------------------------------*/ + +void ivas_ism_get_sce_id_dtx( + ISM_DTX_HANDLE hISMDTX, /* i/o: ISM DTX handle */ + SCE_ENC_HANDLE hSCE[MAX_SCE], /* i/o: SCE encoder structure */ + const int16_t nchan_transport, /* i : number of transport channels */ + const int16_t input_frame /* i : input frame length per channel */ +) +{ + float tmp_energy[MAX_NUM_OBJECTS]; + int16_t i, j; + + if ( nchan_transport == 1 ) + { + hISMDTX->sce_id_dtx = 0; + + return; + } + + /* Initialize*/ + set_f( tmp_energy, 0.0f, MAX_NUM_OBJECTS ); + + /* compute long term energy parameter */ + for ( j = 0; j < nchan_transport; j++ ) + { + for ( i = 0; i < ( PARAM_ISM_HYS_BUF_SIZE - 1 ); i++ ) + { + hISMDTX->long_term_energy_stereo_dmx_enc[j][i] = hISMDTX->long_term_energy_stereo_dmx_enc[j][i + 1]; + } + + hISMDTX->long_term_energy_stereo_dmx_enc[j][PARAM_ISM_HYS_BUF_SIZE - 1] = sum2_f( hSCE[j]->hCoreCoder[0]->input, input_frame ); + + tmp_energy[j] = sum_f( hISMDTX->long_term_energy_stereo_dmx_enc[j], PARAM_ISM_HYS_BUF_SIZE ); + } + + /* determine the sce_id */ + hISMDTX->sce_id_dtx = 0; + for ( j = 1; j < nchan_transport; j++ ) + { + if ( tmp_energy[j] > tmp_energy[hISMDTX->sce_id_dtx] ) + { + hISMDTX->sce_id_dtx = j; + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * ivas_ism_coh_estim_dtx_enc() + * + * + *-------------------------------------------------------------------*/ + +void ivas_ism_coh_estim_dtx_enc( + ISM_DTX_HANDLE hISMDTX, /* i/o: ISM DTX handle */ + SCE_ENC_HANDLE hSCE[MAX_SCE], /* i/o: SCE encoder structure */ + const int16_t nchan_transport, /* i : number of transport channels */ + const int16_t input_frame /* i : input frame length */ + +) +{ + Encoder_State *st, *st_id0; + int16_t sce_id, i; + float acorr_ene[MAX_NUM_OBJECTS], xcorr_ene; + + if ( nchan_transport == 1 ) + { + hISMDTX->coh[0] = 0.f; + return; + } + + /* Compute Coherence */ + acorr_ene[hISMDTX->sce_id_dtx] = 0.0f; + st_id0 = hSCE[hISMDTX->sce_id_dtx]->hCoreCoder[0]; + + for ( i = 0; i < input_frame; i++ ) + { + acorr_ene[hISMDTX->sce_id_dtx] += st_id0->input[i] * st_id0->input[i]; + } + + for ( sce_id = 0; sce_id < nchan_transport; sce_id++ ) + { + if ( sce_id == hISMDTX->sce_id_dtx ) + { + hISMDTX->coh[sce_id] = 1.0f; + continue; + } + + st = hSCE[sce_id]->hCoreCoder[0]; + + acorr_ene[sce_id] = 0.0f; + xcorr_ene = 0.0f; + + for ( i = 0; i < input_frame; i++ ) + { + acorr_ene[sce_id] += st->input[i] * st->input[i]; + xcorr_ene += st_id0->input[i] * st->input[i]; + } + + hISMDTX->coh[sce_id] = fabsf( xcorr_ene ) / ( sqrtf( ( acorr_ene[hISMDTX->sce_id_dtx] * acorr_ene[sce_id] ) + EPSILON ) ); + + /* ensure value of coherence is between [0,1] */ + hISMDTX->coh[sce_id] = check_bounds( hISMDTX->coh[sce_id], 0.0f, 1.0f ); + } + + return; +} diff --git a/lib_enc/ivas_ism_enc.c b/lib_enc/ivas_ism_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..8960038f1d22abc3393ae071a0bac989303a0626 --- /dev/null +++ b/lib_enc/ivas_ism_enc.c @@ -0,0 +1,448 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "ivas_cnst.h" +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_stat_enc.h" +#include "wmc_auto.h" + + +/*-------------------------------------------------------------------* + * ivas_ism_enc() + * + * ISM CoreCoders encoding routine + *-------------------------------------------------------------------*/ + +ivas_error ivas_ism_enc( + Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ + float *data[MAX_NUM_OBJECTS], /* i : input signal */ + const int16_t input_frame, /* i : input frame length per channel */ + int16_t *nb_bits_metadata, /* i : number of metadata bits */ + const int16_t flag_omasa_ener_brate /* i : less bitrate for objects in OMASA flag */ +) +{ + SCE_ENC_HANDLE hSCE; + Encoder_State *st; + int16_t sce_id; + float old_inp_12k8[MAX_NUM_OBJECTS][1][L_INP_12k8]; /* buffer of input signal @ 12k8 */ + float old_inp_16k[MAX_NUM_OBJECTS][1][L_INP]; /* buffer of input signal @ 16kHz */ + int16_t vad_flag[MAX_NUM_OBJECTS]; /* VAD flag */ + float ener[MAX_NUM_OBJECTS][1]; /* residual energy from Levinson-Durbin */ + float relE[MAX_NUM_OBJECTS][1]; /* frame relative energy */ + float A[MAX_NUM_OBJECTS][1][NB_SUBFR16k * ( M + 1 )]; /* A(z) unquantized for subframes */ + float Aw[MAX_NUM_OBJECTS][1][NB_SUBFR16k * ( M + 1 )]; /* weighted A(z) unquantized for subframes */ + float epsP[MAX_NUM_OBJECTS][1][M + 1]; /* LP prediction errors */ + float lsp_new[MAX_NUM_OBJECTS][1][M]; /* LSPs at the end of the frame */ + float lsp_mid[MAX_NUM_OBJECTS][1][M]; /* ISPs in the middle of the frame */ + int16_t vad_hover_flag[MAX_NUM_OBJECTS][1]; /* VAD hangover flag */ + int16_t attack_flag[MAX_NUM_OBJECTS][1]; /* attack flag (GSC or TC) */ + float realBuffer[MAX_NUM_OBJECTS][1][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; /* real buffer */ + float imagBuffer[MAX_NUM_OBJECTS][1][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; /* imag buffer */ + float old_wsp[MAX_NUM_OBJECTS][1][L_WSP]; /* old weighted input signal */ + float pitch_fr[MAX_NUM_OBJECTS][1][NB_SUBFR]; /* fractional pitch values */ + float voicing_fr[MAX_NUM_OBJECTS][1][NB_SUBFR]; /* fractional pitch gains */ + int16_t loc_harm[MAX_NUM_OBJECTS][1]; /* harmonicity flag */ + float cor_map_sum[MAX_NUM_OBJECTS][1]; /* speech/music clasif. parameter */ + int16_t vad_flag_dtx[MAX_NUM_OBJECTS][1]; /* HE-SAD flag with additional DTX HO */ + float enerBuffer[MAX_NUM_OBJECTS][1][CLDFB_NO_CHANNELS_MAX]; /* energy buffer */ + float currFlatness[1]; /* flatness parameter */ + float fft_buff[MAX_NUM_OBJECTS][1][2 * L_FFT]; /* FFT buffer */ + float fr_bands[1][2 * NB_BANDS]; /* energy in frequency bands */ + float Etot_LR[1]; /* total energy; correlation shift */ + float lf_E[1][2 * VOIC_BINS]; /* per bin spectrum energy in lf */ + int16_t localVAD_HE_SAD[1]; /* local HE VAD */ + int16_t nchan_ism, dtx_flag, sid_flag, flag_noisy_speech; + int16_t md_diff_flag[MAX_NUM_OBJECTS]; + Encoder_State *prev_st = NULL; + int32_t ism_total_brate_ref, ism_total_brate; + int16_t i, nchan_transport_ism; + ivas_error error; + + push_wmops( "ivas_ism_enc" ); + + /*------------------------------------------------------------------* + * Initialization + *-----------------------------------------------------------------*/ + + error = IVAS_ERR_OK; + + dtx_flag = 0; + sid_flag = 0; + flag_noisy_speech = 0; + + nchan_ism = st_ivas->hEncoderConfig->nchan_ism; + set_s( md_diff_flag, 1, nchan_ism ); + + nchan_transport_ism = st_ivas->nchan_transport; + if ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) + { + nchan_transport_ism = 1; + nchan_ism = 1; + } + else if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC ) + { + nchan_transport_ism = st_ivas->hEncoderConfig->nchan_ism; + } + + /*------------------------------------------------------------------* + * Preprocesing + *-----------------------------------------------------------------*/ + + for ( sce_id = 0; sce_id < nchan_transport_ism; sce_id++ ) + { + hSCE = st_ivas->hSCE[sce_id]; + st = hSCE->hCoreCoder[0]; + + /*------------------------------------------------------------------* + * Initialization - general + *-----------------------------------------------------------------*/ + + mvr2r( data[sce_id], st->input, input_frame ); + + st->element_mode = IVAS_SCE; + + /*------------------------------------------------------------------* + * SCE initialization - core coder + *-----------------------------------------------------------------*/ + + st->idchan = 0; + st->core = -1; + st->core_brate = -1; /* updated in dtx() */ + st->max_bwidth = st_ivas->hEncoderConfig->max_bwidth; + st->input_bwidth = st->last_input_bwidth; /* updated in BWD */ + st->bwidth = st->last_bwidth; /* updated in BWD */ + st->rate_switching_reset = 0; + + /*---------------------------------------------------------------* + * Time Domain Transient Detector + *---------------------------------------------------------------*/ + + RunTransientDetection( st->input, input_frame, st->hTranDet ); + currFlatness[0] = GetTCXAvgTemporalFlatnessMeasure( st->hTranDet, NSUBBLOCKS, 0 ); + + /*----------------------------------------------------------------* + * Configuration of core encoder + *----------------------------------------------------------------*/ + + /* Force to MODE1 in IVAS */ + st->codec_mode = MODE1; + + st->bits_frame_nominal = (int16_t) ( ( hSCE->element_brate / FRAMES_PER_SEC ) - ISM_NB_BITS_METADATA_NOMINAL ); + + /*----------------------------------------------------------------* + * Front Pre-processing + *----------------------------------------------------------------*/ + + error = pre_proc_front_ivas( hSCE, NULL, hSCE->element_brate, nb_bits_metadata[sce_id], input_frame, 0, old_inp_12k8[sce_id][0], old_inp_16k[sce_id][0], + &ener[sce_id][0], &relE[sce_id][0], A[sce_id][0], Aw[sce_id][0], epsP[sce_id][0], lsp_new[sce_id][0], lsp_mid[sce_id][0], &vad_hover_flag[sce_id][0], &attack_flag[sce_id][0], + realBuffer[sce_id][0], imagBuffer[sce_id][0], old_wsp[sce_id][0], pitch_fr[sce_id][0], voicing_fr[sce_id][0], &loc_harm[sce_id][0], &cor_map_sum[sce_id][0], &vad_flag_dtx[sce_id][0], enerBuffer[sce_id][0], + fft_buff[sce_id][0], A[sce_id][0], lsp_new[sce_id][0], currFlatness[0], 0, fr_bands, Etot_LR, lf_E, localVAD_HE_SAD, NULL, 0, 0, 0, 0, ISM_FORMAT, st_ivas->hEncoderConfig->ivas_total_brate ); + if ( error != IVAS_ERR_OK ) + { + return error; + } + + if ( st_ivas->hEncoderConfig->Opt_DTX_ON ) + { + vad_flag[sce_id] = vad_flag_dtx[sce_id][0]; + } + else + { + vad_flag[sce_id] = st->vad_flag; + } + } + + /*------------------------------------------------------------------* + * DTX analysis + *-----------------------------------------------------------------*/ + + if ( st_ivas->hEncoderConfig->Opt_DTX_ON ) + { + /* compute the dominant sce_id using long term energy */ + ivas_ism_get_sce_id_dtx( st_ivas->hISMDTX, st_ivas->hSCE, st_ivas->nchan_transport, input_frame ); + + /* analysis and decision about DTX */ + dtx_flag = ivas_ism_dtx_enc( st_ivas->hISMDTX, st_ivas->hSCE, st_ivas->hEncoderConfig->ivas_total_brate, nchan_ism, st_ivas->nchan_transport, vad_flag, st_ivas->hIsmMetaData, md_diff_flag, &sid_flag ); + + if ( sid_flag ) + { + /* estimate coherence between objects */ + ivas_ism_coh_estim_dtx_enc( st_ivas->hISMDTX, st_ivas->hSCE, st_ivas->nchan_transport, input_frame ); + } + + } + + /*------------------------------------------------------------------* + * Analysis of objects, configuration and decision about bitrates per channel + * Metadata quantization and encoding + *-----------------------------------------------------------------*/ + + if ( st_ivas->ism_mode == ISM_MODE_PARAM ) + { + ivas_param_ism_compute_noisy_speech_flag( st_ivas ); + flag_noisy_speech = st_ivas->hParamIsm->flag_noisy_speech; + } + + if ( dtx_flag ) + { + ivas_ism_metadata_sid_enc( st_ivas->hISMDTX, flag_noisy_speech, nchan_ism, st_ivas->nchan_transport, st_ivas->ism_mode, st_ivas->hIsmMetaData, sid_flag, md_diff_flag, st_ivas->hSCE[st_ivas->nSCE - 1]->hMetaData, nb_bits_metadata ); + } + else if ( st_ivas->ism_mode == ISM_MODE_PARAM ) + { + if ( ( error = ivas_ism_metadata_enc( &st_ivas->hEncoderConfig->ivas_total_brate, nchan_ism, nchan_transport_ism, st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->hSCE[st_ivas->nSCE - 1]->hMetaData, + nb_bits_metadata, vad_flag, st_ivas->ism_mode, st_ivas->hParamIsm, st_ivas->hEncoderConfig->ism_extended_metadata_flag, -1, 0, NULL, st_ivas->hSCE[0]->hCoreCoder[0]->ini_frame ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else /* ISM_MODE_DISC */ + { + if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC || st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) + { + ism_total_brate = 0; + for ( i = 0; i < st_ivas->nSCE; i++ ) + { + ism_total_brate += st_ivas->hSCE[i]->element_brate; + } + } + else + { + ism_total_brate = st_ivas->hEncoderConfig->ivas_total_brate; + } + + ism_total_brate_ref = ism_total_brate; + + if ( ( error = ivas_ism_metadata_enc( &ism_total_brate, nchan_ism, nchan_transport_ism, st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->hSCE[st_ivas->nSCE - 1]->hMetaData, + nb_bits_metadata, vad_flag, st_ivas->ism_mode, NULL, st_ivas->hEncoderConfig->ism_extended_metadata_flag, st_ivas->hMasa != NULL ? st_ivas->hMasa->data.hOmasaData->lp_noise_CPE : 0, flag_omasa_ener_brate, st_ivas->hMasa != NULL ? &( st_ivas->hMasa->data.hOmasaData->omasa_stereo_sw_cnt ) : NULL, st_ivas->hSCE[0]->hCoreCoder[0]->ini_frame ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( st_ivas->hEncoderConfig->ivas_format == MASA_ISM_FORMAT ) + { + st_ivas->hCPE[0]->brate_surplus = ism_total_brate_ref - ism_total_brate; + } + } + + update_last_metadata( nchan_ism, st_ivas->hIsmMetaData, md_diff_flag ); + + /*----------------------------------------------------------------* + * Write IVAS format signaling in SID frames + *----------------------------------------------------------------*/ + + st = st_ivas->hSCE[0]->hCoreCoder[0]; + + if ( sid_flag ) + { + ivas_write_format_sid( st_ivas->hEncoderConfig->ivas_format, IVAS_SCE, st->hBstr ); + } + + /*only metadata encoding is needed for this case*/ + if ( st_ivas->hEncoderConfig->ivas_format == SBA_ISM_FORMAT ) + { + assert( st_ivas->ism_mode != ISM_MODE_NONE ); + return error; + } + + /*------------------------------------------------------------------* + * CoreCoders encoding + *-----------------------------------------------------------------*/ + + for ( sce_id = 0; sce_id < nchan_transport_ism; sce_id++ ) + { + hSCE = st_ivas->hSCE[sce_id]; + st = hSCE->hCoreCoder[0]; + + /* update pointer to the buffer of indices of the next channel */ + if ( sce_id > 0 ) + { + st->hBstr->ind_list = prev_st->hBstr->ind_list + prev_st->hBstr->nb_ind_tot; + } + + if ( st->low_rate_mode ) + { + st->bwidth = WB; + } + + /*----------------------------------------------------------------* + * Core codec configuration + *----------------------------------------------------------------*/ + + /* IGF reconfiguration */ + if ( hSCE->last_element_brate != hSCE->element_brate || st->last_bwidth != st->bwidth ) + { + int16_t igf; + igf = getIgfPresent( st->element_mode, st->bits_frame_nominal * FRAMES_PER_SEC, st->max_bwidth, st->rf_mode ); + if ( ( error = IGF_Reconfig( &st->hIGFEnc, igf, 0, st->bits_frame_nominal * FRAMES_PER_SEC, st->max_bwidth, st->element_mode, st->rf_mode ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* set ACELP@12k8 / ACELP@16k flag for flexible ACELP core */ + if ( st->core_brate == SID_2k40 || st->core_brate == FRAME_NO_DATA ) + { + st->flag_ACELP16k = set_ACELP_flag( IVAS_SCE, hSCE->element_brate, st->core_brate, 0, 0, -1, -1 ); + } + else if ( st->low_rate_mode ) + { + st->flag_ACELP16k = 0; + } + else + { + st->flag_ACELP16k = set_ACELP_flag( IVAS_SCE, hSCE->element_brate, st->total_brate, 0, 0, -1, -1 ); + } + + /* modify the coder_type depending on the total_brate per channel */ + coder_type_modif( st, relE[sce_id][0] ); + + /*----------------------------------------------------------------* + * Encoder + *----------------------------------------------------------------*/ + + if ( !dtx_flag || ( dtx_flag && sce_id == st_ivas->hISMDTX->sce_id_dtx ) ) + { + if ( ( error = ivas_core_enc( hSCE, NULL, NULL, 1, old_inp_12k8[sce_id], old_inp_16k[sce_id], ener[sce_id], A[sce_id], Aw[sce_id], epsP[sce_id], lsp_new[sce_id], lsp_mid[sce_id], vad_hover_flag[sce_id], attack_flag[sce_id], realBuffer[sce_id], imagBuffer[sce_id], old_wsp[sce_id], loc_harm[sce_id], cor_map_sum[sce_id], vad_flag_dtx[sce_id], enerBuffer[sce_id], fft_buff[sce_id], 0, ISM_FORMAT, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /*----------------------------------------------------------------* + * Common updates + *----------------------------------------------------------------*/ + + /* update input samples buffer */ + mvr2r( st->input, st->old_input_signal, input_frame ); + + hSCE->last_element_brate = hSCE->element_brate; + + /* Store previous attack detection flag */ + st->hTranDet->transientDetector.prev_bIsAttackPresent = st->hTranDet->transientDetector.bIsAttackPresent; + + prev_st = st; + } + + if ( dtx_flag ) + { + for ( sce_id = 0; sce_id < nchan_transport_ism; sce_id++ ) + { + if ( sce_id != st_ivas->hISMDTX->sce_id_dtx ) + { + st_ivas->hSCE[sce_id]->hCoreCoder[0]->last_core = st_ivas->hSCE[st_ivas->hISMDTX->sce_id_dtx]->hCoreCoder[0]->last_core; + st_ivas->hSCE[sce_id]->hCoreCoder[0]->last_core_brate = st_ivas->hSCE[st_ivas->hISMDTX->sce_id_dtx]->hCoreCoder[0]->core_brate; + st_ivas->hSCE[sce_id]->hCoreCoder[0]->last_L_frame = st_ivas->hSCE[st_ivas->hISMDTX->sce_id_dtx]->hCoreCoder[0]->last_L_frame; + } + } + } + + pop_wmops(); + + return error; +} + + +/*------------------------------------------------------------------------- + * ivas_ism_enc_config() + * + * - select ISM format mode + * - reconfigure the ISM format encoder + *-------------------------------------------------------------------------*/ + +ivas_error ivas_ism_enc_config( + Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ +) +{ + ivas_error error; + ISM_MODE last_ism_mode; + int16_t nchan_transport_old; + int16_t nSCE_old, nCPE_old; + + error = IVAS_ERR_OK; + last_ism_mode = st_ivas->ism_mode; + + /* select ISM format mode */ + st_ivas->ism_mode = ivas_ism_mode_select( st_ivas->hEncoderConfig->nchan_inp, st_ivas->hEncoderConfig->ivas_total_brate ); + + /* ISM bit-rate switching */ + if ( ( st_ivas->ism_mode != last_ism_mode ) || ( st_ivas->hEncoderConfig->ivas_total_brate != st_ivas->hEncoderConfig->last_ivas_total_brate ) ) + { + int32_t element_brate_tmp[MAX_NUM_OBJECTS]; + + nchan_transport_old = st_ivas->nchan_transport; + + /* Reset and Initialize */ + if ( st_ivas->ism_mode == ISM_MODE_PARAM ) + { + st_ivas->nchan_transport = MAX_PARAM_ISM_WAVE; + } + else + { + st_ivas->nchan_transport = st_ivas->hEncoderConfig->nchan_inp; + } + + nCPE_old = st_ivas->nCPE; + nSCE_old = st_ivas->nSCE; + st_ivas->nSCE = st_ivas->nchan_transport; + st_ivas->nCPE = 0; + + if ( ( error = ivas_ism_config( st_ivas->hEncoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hEncoderConfig->nchan_inp, NULL, 0, NULL, NULL, element_brate_tmp, NULL, NULL, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = ivas_corecoder_enc_reconfig( st_ivas, nSCE_old, nCPE_old, nchan_transport_old, st_ivas->hEncoderConfig->ivas_total_brate / st_ivas->nchan_transport, ( st_ivas->hEncoderConfig->ivas_total_brate / st_ivas->nchan_transport ) * CPE_CHANNELS, MC_MODE_NONE ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( st_ivas->ism_mode == ISM_MODE_PARAM && last_ism_mode == ISM_MODE_DISC ) + { + /* Allocate and Initialize the memory used by ParamISM when switch from Discrete ISM */ + if ( ( error = ivas_param_ism_enc_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( st_ivas->ism_mode == ISM_MODE_DISC && last_ism_mode == ISM_MODE_PARAM ) + { + /* Deallocate the memory used by ParamISM when switch to Discrete ISM */ + ivas_param_ism_enc_close( &( st_ivas->hParamIsm ), st_ivas->hEncoderConfig->input_Fs ); + } + } + + return error; +} diff --git a/lib_enc/ivas_ism_metadata_enc.c b/lib_enc/ivas_ism_metadata_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..d272953a6abe2d0d88ebc5cb01766ae61a9581ea --- /dev/null +++ b/lib_enc/ivas_ism_metadata_enc.c @@ -0,0 +1,1359 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include +#include "options.h" +#include "ivas_cnst.h" +#include "ivas_prot.h" +#include "ivas_rom_com.h" +#include "prot.h" +#include +#include "wmc_auto.h" + + +/*-----------------------------------------------------------------------* + * Local constants + *-----------------------------------------------------------------------*/ + +#define ISM_NUM_PARAM 5 /* number of coded metadata parameters */ + +#define ISM_MAX_AZIMUTH_DIFF_IDX ( ISM_AZIMUTH_NBITS - 1 /*zero*/ - 1 /*sign*/ ) +#define ISM_MAX_ELEVATION_DIFF_IDX ( ISM_ELEVATION_NBITS - 1 /*zero*/ - 1 /*sign*/ ) +#define ISM_MAX_RADIUS_DIFF_IDX ( ISM_RADIUS_NBITS - 1 /*zero*/ - 1 /*sign*/ ) + +#define ISM_FEC_MAX 10 +#define ISM_MD_FEC_DIFF 10 +#define ISM_MD_INC_DIFF_CNT_MAX 6 +#define ISM_MD_FEC_CNT_MAX 25 +#define ISM_MD_RAD_FEC_DIFF 1 +#define INTER_OBJECT_PARAM_CHECK ( ( ISM_FEC_MAX / 2 ) - 2 ) /* note: constant must be less than (ISM_FEC_MAX / number of coded parameters) */ + + +/*-----------------------------------------------------------------------* + * Local function declarations + *-----------------------------------------------------------------------*/ + +static void encode_angle_indices( BSTR_ENC_HANDLE hBstr, ISM_METADATA_ANGLE_HANDLE angle, const int16_t last_ism_metadata_flag, const int16_t ini_frame, const int16_t idx_angle1_abs, const int16_t idx_angle2_abs, int16_t *flag_abs_angle1, int16_t *flag_abs_angle2 ); + +static void encode_radius( BSTR_ENC_HANDLE hBstr, int16_t *last_radius_idx, int16_t *radius_diff_cnt, const int16_t last_ism_metadata_flag, const int16_t idx_radius_abs, int16_t *flag_abs_radius ); + + +/*-------------------------------------------------------------------------* + * ivas_set_ism_metadata() + * + * Set metadata of one ISM MD handle + *-------------------------------------------------------------------------*/ + +ivas_error ivas_set_ism_metadata( + ISM_METADATA_HANDLE hIsmMeta, /* o : ISM metadata handle */ + const float azimuth, /* i : azimuth value */ + const float elevation, /* i : elevation */ + const float radius_meta, /* i : radius */ + const float yaw, /* i : yaw */ + const float pitch, /* i : pitch */ + const int16_t non_diegetic_flag /* i : non-diegetic object flag*/ +) +{ + if ( hIsmMeta == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + hIsmMeta->ism_metadata_flag = 1; + + /* save read metadata parameters to the internal codec structure */ + hIsmMeta->azimuth = azimuth; + hIsmMeta->elevation = elevation; + hIsmMeta->radius = radius_meta; + hIsmMeta->yaw = yaw; + hIsmMeta->pitch = pitch; + hIsmMeta->non_diegetic_flag = non_diegetic_flag; + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------------* + * rate_ism_importance() + * + * Rate importance of particular ISM streams + *-------------------------------------------------------------------------*/ + +static void rate_ism_importance( + const int16_t nchan_transport, /* i : number of transported channels */ + ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ + SCE_ENC_HANDLE hSCE[], /* i/o: SCE encoder handles */ + const int16_t lowrate_metadata_flag[MAX_NUM_OBJECTS], /* i : low-rate MD flag */ + int16_t ism_imp[] /* o : ISM importance flags */ +) +{ + int16_t ch, ctype; + + for ( ch = 0; ch < nchan_transport; ch++ ) + { + ctype = hSCE[ch]->hCoreCoder[0]->coder_type_raw; + + if ( hSCE[ch]->hCoreCoder[0]->tcxonly ) + { + if ( hSCE[ch]->hCoreCoder[0]->localVAD == 0 ) + { + ctype = INACTIVE; + } + else if ( ctype == UNVOICED ) + { + ctype = GENERIC; + } + } + + if ( ( hIsmMeta[ch]->ism_metadata_flag == 0 || lowrate_metadata_flag[ch] == 1 ) && hSCE[ch]->hCoreCoder[0]->localVAD == 0 ) + { + ism_imp[ch] = ISM_NO_META; + } + else if ( ctype == INACTIVE || ctype == UNVOICED ) + { + ism_imp[ch] = ISM_LOW_IMP; + } + else if ( ctype == VOICED ) + { + ism_imp[ch] = ISM_MEDIUM_IMP; + } + else /* GENERIC */ + { + ism_imp[ch] = ISM_HIGH_IMP; + } + } + + return; +} + + +/*-------------------------------------------------------------------------* + * ivas_ism_metadata_enc() + * + * quantize and encode ISM metadata + *-------------------------------------------------------------------------*/ + +ivas_error ivas_ism_metadata_enc( + int32_t *ism_total_brate, /* i/o: ISM total bitrate */ + const int16_t nchan_ism, /* i : number of ISM channels */ + const int16_t nchan_transport, /* i : number of transport channels */ + ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ + SCE_ENC_HANDLE hSCE[], /* i/o: SCE encoder handles */ + BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ + int16_t nb_bits_metadata[], /* o : number of metadata bits */ + const int16_t vad_flag[], /* i : VAD flag */ + const int16_t ism_mode, /* i : ISM mode */ + const PARAM_ISM_CONFIG_HANDLE hParamIsm, /* i : Param ISM Enc Handle */ + const int16_t ism_extended_metadata_flag, /* i : Extended metadata flag */ + const float lp_noise_CPE, + const int16_t flag_omasa_ener_brate, /* i : less bitrate for objects in OMASA flag */ + int16_t *omasa_stereo_sw_cnt, + const int16_t ini_frame ) +{ + int16_t i, ch, nb_bits_start = 0; + int16_t flag_abs_azimuth[MAX_NUM_OBJECTS]; + int16_t flag_abs_elevation[MAX_NUM_OBJECTS]; + int16_t idx_angle1_abs = 0; + int16_t idx_angle2_abs = 0; + int16_t flag_abs_yaw[MAX_NUM_OBJECTS]; + int16_t flag_abs_pitch[MAX_NUM_OBJECTS]; + int16_t idx_radius_abs = 0, flag_abs_radius[MAX_NUM_OBJECTS]; + float valQ; + ISM_METADATA_HANDLE hIsmMetaData; + int32_t element_brate[MAX_NUM_OBJECTS], total_brate[MAX_NUM_OBJECTS]; + int16_t ism_metadata_flag_global; + int16_t non_diegetic_flag_global; + int16_t ism_imp[MAX_NUM_OBJECTS]; + int16_t null_metadata_flag[MAX_NUM_OBJECTS]; + int16_t lowrate_metadata_flag[MAX_NUM_OBJECTS]; + int16_t nbands, nblocks; + ivas_error error; + + error = IVAS_ERR_OK; + push_wmops( "ism_meta_enc" ); + + /* initialization */ + ism_metadata_flag_global = 0; + non_diegetic_flag_global = 0; + set_s( nb_bits_metadata, 0, nchan_transport ); + set_s( flag_abs_azimuth, 0, nchan_ism ); + set_s( flag_abs_elevation, 0, nchan_ism ); + set_s( flag_abs_yaw, 0, nchan_ism ); + set_s( flag_abs_pitch, 0, nchan_ism ); + set_s( flag_abs_radius, 0, nchan_ism ); + set_s( null_metadata_flag, 0, nchan_ism ); + set_s( lowrate_metadata_flag, 0, nchan_ism ); + + if ( ism_mode == ISM_MASA_MODE_DISC || ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) + { + /*----------------------------------------------------------------* + * Rate importance of particular ISM streams in combined format coding + *----------------------------------------------------------------*/ + + ivas_set_ism_importance_interformat( *ism_total_brate, nchan_transport, hIsmMeta, hSCE, lp_noise_CPE, ism_imp ); + } + else + { + /*----------------------------------------------------------------* + * Set Metadata presence / importance flag + *----------------------------------------------------------------*/ + + for ( ch = 0; ch < nchan_ism; ch++ ) + { + if ( ism_mode == ISM_MODE_PARAM ) + { + hIsmMeta[ch]->ism_metadata_flag = 1; + } + else if ( ism_mode == ISM_MODE_DISC || ism_mode == ISM_MASA_MODE_DISC || ism_mode == ISM_SBA_MODE_DISC ) + { + null_metadata_flag[ch] = !hIsmMeta[ch]->ism_metadata_flag; + + if ( hIsmMeta[ch]->ism_metadata_flag == 1 ) + { + if ( ism_mode != ISM_SBA_MODE_DISC ) + { + /* In case of low level noise for low bitrate inactive frames, do not sent metadata */ + hIsmMeta[ch]->ism_metadata_flag = vad_flag[ch] || hSCE[ch]->hCoreCoder[0]->lp_noise > 10 || hSCE[ch]->hCoreCoder[0]->tcxonly; + } + + /* in inactive frames, send MD 1) in ISM_MD_INC_DIFF_CNT_MAX consecutive frames when MD significantly change, 2) at least every ISM_MD_FEC_DIFF frames */ + if ( hIsmMeta[ch]->ism_metadata_flag == 0 ) + { + if ( ( fabsf( hIsmMeta[ch]->azimuth - hIsmMeta[ch]->last_true_azimuth ) > ISM_MD_FEC_DIFF ) || + ( fabsf( hIsmMeta[ch]->elevation - hIsmMeta[ch]->last_true_elevation ) > ISM_MD_FEC_DIFF ) || ( fabsf( hIsmMeta[ch]->radius - hIsmMeta[ch]->last_true_radius ) > ISM_MD_RAD_FEC_DIFF ) ) + { + + lowrate_metadata_flag[ch] = 1; + + hIsmMeta[ch]->ism_md_inc_diff_cnt = 0; + } + else if ( hIsmMeta[ch]->ism_md_inc_diff_cnt < ISM_MD_INC_DIFF_CNT_MAX ) + { + + lowrate_metadata_flag[ch] = 1; + + if ( hIsmMeta[ch]->ism_md_inc_diff_cnt % 2 == 0 ) + { + hIsmMeta[ch]->position_angle.angle1_diff_cnt = ISM_FEC_MAX; + } + else + { + hIsmMeta[ch]->position_angle.angle2_diff_cnt = ISM_FEC_MAX; + } + } + else if ( hIsmMeta[ch]->ism_md_fec_cnt_enc == ISM_MD_FEC_CNT_MAX ) + { + + lowrate_metadata_flag[ch] = 1; + + hIsmMeta[ch]->position_angle.angle1_diff_cnt = ISM_FEC_MAX; + } + } + } + } + } + + /*----------------------------------------------------------------* + * Rate importance of particular ISM streams + *----------------------------------------------------------------*/ + + if ( ism_mode != ISM_SBA_MODE_DISC ) + { + rate_ism_importance( nchan_transport, hIsmMeta, hSCE, lowrate_metadata_flag, ism_imp ); + } + } + + /*----------------------------------------------------------------* + * Write ISM common signaling + *----------------------------------------------------------------*/ + + if ( ism_mode != ISM_MASA_MODE_DISC && ism_mode != ISM_MASA_MODE_MASA_ONE_OBJ && ism_mode != ISM_SBA_MODE_DISC ) + { + /* write number of objects - unary coding */ + for ( ch = 1; ch < nchan_ism; ch++ ) + { + push_indice( hBstr, IND_ISM_NUM_OBJECTS, 1, 1 ); + } + push_indice( hBstr, IND_ISM_NUM_OBJECTS, 0, 1 ); + } + + for ( ch = 0; ch < nchan_ism; ch++ ) + { + ism_metadata_flag_global |= hIsmMeta[ch]->ism_metadata_flag; + ism_metadata_flag_global |= lowrate_metadata_flag[ch]; + non_diegetic_flag_global |= hIsmMeta[ch]->non_diegetic_flag; + } + + /* write extended metadata presence flag */ + if ( ( ism_mode == ISM_MODE_DISC || ism_mode == ISM_SBA_MODE_DISC ) && *ism_total_brate >= ISM_EXTENDED_METADATA_BRATE ) + { + push_indice( hBstr, IND_ISM_EXTENDED_FLAG, ism_extended_metadata_flag, ISM_EXTENDED_METADATA_BITS ); + + /* Write global non-diegetic object flag */ + if ( ism_extended_metadata_flag ) + { + push_indice( hBstr, IND_ISM_EXTENDED_NDP_FLAG, non_diegetic_flag_global, ISM_EXTENDED_METADATA_BITS ); + } + } + + /* write ISM metadata flag (one per object) */ + for ( ch = 0; ch < nchan_transport; ch++ ) + { + if ( ism_mode == ISM_MASA_MODE_DISC || ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) + { + /* flags will be written in ivas_masa_encode() */ + hIsmMeta[ch]->ism_imp = ism_imp[ch]; + hIsmMeta[ch]->ism_md_null_flag = null_metadata_flag[ch]; + hIsmMeta[ch]->ism_md_lowrate_flag = lowrate_metadata_flag[ch]; + } + else + { + if ( null_metadata_flag[ch] ) + { + /* signal NULL metadata frame */ + push_indice( hBstr, IND_ISM_MD_NULL_FLAG, 1, ISM_METADATA_MD_FLAG_BITS ); + + /* write the ISM class to ISM_NO_META and again the true ISM class */ + if ( ism_mode != ISM_SBA_MODE_DISC ) + { + push_indice( hBstr, IND_ISM_METADATA_FLAG, ISM_NO_META, ISM_METADATA_FLAG_BITS ); + push_indice( hBstr, IND_ISM_MD_INACTIVE_FLAG, ism_imp[ch], ISM_METADATA_FLAG_BITS ); + } + else + { + push_indice( hBstr, IND_ISM_METADATA_FLAG, ISM_NO_META, 1 ); + } + } + else if ( ism_mode != ISM_SBA_MODE_DISC ) + { + push_indice( hBstr, IND_ISM_METADATA_FLAG, ism_imp[ch], ISM_METADATA_FLAG_BITS ); + + if ( ism_imp[ch] == ISM_NO_META ) + { + /* signal low-rate ISM_NO_META frame */ + push_indice( hBstr, IND_ISM_MD_NULL_FLAG, 0, ISM_METADATA_MD_FLAG_BITS ); + + /* signal presence of MD in low-rate ISM_NO_META frame */ + push_indice( hBstr, IND_ISM_MD_INACTIVE_FLAG, lowrate_metadata_flag[ch], ISM_METADATA_INACTIVE_FLAG_BITS ); + } + } + else /*ism_mode == ISM_SBA_MODE_DISC*/ + { + /* all objects are considered active*/ + push_indice( hBstr, IND_ISM_METADATA_FLAG, 1, 1 ); + } + } + } + + + if ( ism_metadata_flag_global ) + { + /*----------------------------------------------------------------* + * Metadata quantization and coding, loop over all objects + *----------------------------------------------------------------*/ + + int16_t total_bits_metadata = 0; + int16_t bits_metadata_ism = 0; + int16_t nb_bits_objcod_written; + + if ( ism_mode == ISM_MODE_PARAM ) + { + nb_bits_start = hBstr->nb_bits_tot; + } + + for ( ch = 0; ch < nchan_ism; ch++ ) + { + hIsmMetaData = hIsmMeta[ch]; + if ( ism_mode == ISM_MODE_DISC || ism_mode == ISM_MASA_MODE_DISC || ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || ism_mode == ISM_SBA_MODE_DISC ) + { + nb_bits_start = hBstr->nb_bits_tot; + } + + if ( hIsmMeta[ch]->ism_metadata_flag || lowrate_metadata_flag[ch] ) + { + /*----------------------------------------------------------------* + * Quantize and encode azimuth and elevation + *----------------------------------------------------------------*/ + + if ( ism_extended_metadata_flag && non_diegetic_flag_global ) + { + /* Write non-diegetic flag for each object */ + push_indice( hBstr, IND_ISM_NDP_FLAG, hIsmMeta[ch]->non_diegetic_flag, ISM_METADATA_IS_NDP_BITS ); + } + + if ( hIsmMeta[ch]->non_diegetic_flag && ism_extended_metadata_flag ) + { + /* Map azimuth to panning range [-90:90] */ + if ( hIsmMetaData->azimuth > 90.0f ) + { + hIsmMetaData->azimuth = 180.0f - hIsmMetaData->azimuth; + } + + if ( hIsmMetaData->azimuth < -90.0f ) + { + hIsmMetaData->azimuth = -180.0f - hIsmMetaData->azimuth; + } + + idx_angle1_abs = ism_quant_meta( hIsmMetaData->azimuth, &valQ, ism_azimuth_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_AZIMUTH_NBITS ); + encode_angle_indices( hBstr, &( hIsmMetaData->position_angle ), hIsmMetaData->last_ism_metadata_flag, hSCE[0]->hCoreCoder[0]->ini_frame, idx_angle1_abs, 0, &flag_abs_azimuth[ch], NULL ); + } + else + { + if ( ism_mode == ISM_MODE_DISC || ism_mode == ISM_MASA_MODE_DISC || ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || ism_mode == ISM_SBA_MODE_DISC ) + { + idx_angle1_abs = ism_quant_meta( hIsmMetaData->azimuth, &valQ, ism_azimuth_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_AZIMUTH_NBITS ); + idx_angle2_abs = ism_quant_meta( hIsmMetaData->elevation, &valQ, ism_elevation_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_ELEVATION_NBITS ); + } + else /* ISM_MODE_PARAM */ + { + idx_angle1_abs = hParamIsm->azi_index[ch]; + idx_angle2_abs = hParamIsm->ele_index[ch]; + } + encode_angle_indices( hBstr, &( hIsmMetaData->position_angle ), hIsmMetaData->last_ism_metadata_flag, ini_frame, idx_angle1_abs, idx_angle2_abs, &flag_abs_azimuth[ch], &flag_abs_elevation[ch] ); + + /*----------------------------------------------------------------* + * Quantize and encode radius, yaw, and pitch + *----------------------------------------------------------------*/ + if ( ( ism_mode == ISM_MODE_DISC || ism_mode == ISM_SBA_MODE_DISC ) && ism_extended_metadata_flag ) + { + idx_angle1_abs = ism_quant_meta( hIsmMetaData->yaw, &valQ, ism_azimuth_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_AZIMUTH_NBITS ); + idx_angle2_abs = ism_quant_meta( hIsmMetaData->pitch, &valQ, ism_elevation_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_ELEVATION_NBITS ); + idx_radius_abs = usquant( hIsmMetaData->radius, &valQ, ISM_RADIUS_MIN, ISM_RADIUS_DELTA, 1 << ISM_RADIUS_NBITS ); + + encode_angle_indices( hBstr, &( hIsmMetaData->orientation_angle ), hIsmMetaData->last_ism_metadata_flag, ini_frame, idx_angle1_abs, idx_angle2_abs, &flag_abs_yaw[ch], &flag_abs_pitch[ch] ); + encode_radius( hBstr, &hIsmMetaData->last_radius_idx, &hIsmMetaData->radius_diff_cnt, hIsmMetaData->last_ism_metadata_flag, idx_radius_abs, &flag_abs_radius[ch] ); + } + } + + /* save number of metadata bits written */ + if ( ism_mode == ISM_MODE_DISC || ism_mode == ISM_MASA_MODE_DISC || ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || ism_mode == ISM_SBA_MODE_DISC ) + { + nb_bits_metadata[ch] = hBstr->nb_bits_tot - nb_bits_start; + } + + /* Updates */ + hIsmMeta[ch]->last_true_azimuth = hIsmMeta[ch]->azimuth; + hIsmMeta[ch]->last_true_elevation = hIsmMeta[ch]->elevation; + hIsmMeta[ch]->last_true_radius = hIsmMeta[ch]->radius; + } + } + + /*----------------------------------------------------------------* + * inter-object logic minimizing the use of several absolutely coded + * indexes in the same frame + *----------------------------------------------------------------*/ + + i = 0; + while ( i == 0 || i < nchan_ism / INTER_OBJECT_PARAM_CHECK ) + { + int16_t num, abs_num, abs_first, abs_next, pos_zero; + int16_t abs_matrice[INTER_OBJECT_PARAM_CHECK * ISM_NUM_PARAM]; + + num = min( INTER_OBJECT_PARAM_CHECK, nchan_ism - i * INTER_OBJECT_PARAM_CHECK ); + i++; + + set_s( abs_matrice, 0, INTER_OBJECT_PARAM_CHECK * ISM_NUM_PARAM ); + + for ( ch = 0; ch < num; ch++ ) + { + if ( flag_abs_azimuth[ch] == 1 ) + { + abs_matrice[ch * ISM_NUM_PARAM] = 1; + } + + if ( flag_abs_elevation[ch] == 1 ) + { + abs_matrice[ch * ISM_NUM_PARAM + 1] = 1; + } + } + abs_num = sum_s( abs_matrice, INTER_OBJECT_PARAM_CHECK * ISM_NUM_PARAM ); + + abs_first = 0; + while ( abs_num > 1 ) + { + /* find first "1" entry */ + while ( abs_matrice[abs_first] == 0 ) + { + abs_first++; + } + + /* find next "1" entry */ + abs_next = abs_first + 1; + while ( abs_matrice[abs_next] == 0 ) + { + abs_next++; + } + + /* find "0" position */ + pos_zero = 0; + while ( abs_matrice[pos_zero] == 1 ) + { + pos_zero++; + } + + ch = abs_next / ISM_NUM_PARAM; + + if ( abs_next % ISM_NUM_PARAM == 0 ) + { + hIsmMeta[ch]->position_angle.angle1_diff_cnt = abs_num - 1; + } + + if ( abs_next % ISM_NUM_PARAM == 1 ) + { + hIsmMeta[ch]->position_angle.angle2_diff_cnt = abs_num - 1; + /*hIsmMeta[ch]->elevation_diff_cnt = min( hIsmMeta[ch]->elevation_diff_cnt, ISM_FEC_MAX );*/ + } + + abs_first++; + abs_num--; + } + } + + if ( ism_mode == ISM_SBA_MODE_DISC ) + { + int16_t md_diff_flag[MAX_NUM_OBJECTS]; + + set_s( md_diff_flag, 1, nchan_ism ); + for ( ch = 0; ch < nchan_ism; ch++ ) + { + hIsmMeta[ch]->last_ism_metadata_flag = hIsmMeta[ch]->ism_metadata_flag; + + if ( hIsmMeta[ch]->ism_metadata_flag == 0 ) + { + hIsmMeta[ch]->ism_md_fec_cnt_enc++; + } + else + { + hIsmMeta[ch]->ism_md_fec_cnt_enc = 0; + } + hIsmMeta[ch]->ism_md_inc_diff_cnt++; + hIsmMeta[ch]->ism_md_inc_diff_cnt = min( hIsmMeta[ch]->ism_md_inc_diff_cnt, ISM_MD_INC_DIFF_CNT_MAX ); + } + + update_last_metadata( nchan_ism, hIsmMeta, md_diff_flag ); + + pop_wmops(); + return error; + } + if ( ism_mode == ISM_MODE_PARAM ) + { + /* Keep the metdata transmission as is during active parts */ + /* But send the flag with 1 bit */ + push_next_indice( hBstr, hParamIsm->flag_noisy_speech, 1 ); + + /* Loop over multiwave to write the object indices into bitstream */ + for ( ch = 0; ch < MAX_PARAM_ISM_WAVE; ch++ ) + { + for ( nbands = 0; nbands < hParamIsm->nbands; nbands++ ) + { + for ( nblocks = 0; nblocks < hParamIsm->nblocks[nbands]; nblocks++ ) + { + push_next_indice( hBstr, hParamIsm->obj_indices[nbands][nblocks][ch], PARAM_ISM_OBJ_IND_NBITS ); + } + } + } + + /* Loop over bands to write the power ratio's indices into bitstream */ + for ( nbands = 0; nbands < hParamIsm->nbands; nbands++ ) + { + for ( nblocks = 0; nblocks < hParamIsm->nblocks[nbands]; nblocks++ ) + { + push_next_indice( hBstr, hParamIsm->power_ratios_idx[nbands][nblocks], PARAM_ISM_POW_RATIO_NBITS ); + } + } + + /* total metadata bits */ + total_bits_metadata = hBstr->nb_bits_tot - nb_bits_start; + + /* bits per ISM*/ + bits_metadata_ism = (int16_t) ( total_bits_metadata / nchan_transport ); + + /* Divide the metadata bits into n_Isms*/ + nb_bits_objcod_written = 0; + for ( ch = 0; ch < nchan_transport; ch++ ) + { + if ( ch == nchan_transport - 1 ) + { + nb_bits_metadata[ch] = total_bits_metadata - nb_bits_objcod_written; + } + else + { + nb_bits_metadata[ch] = bits_metadata_ism; + nb_bits_objcod_written += bits_metadata_ism; + } + } + } + } + else if ( ism_mode == ISM_SBA_MODE_DISC ) + { + pop_wmops(); + return error; + } + + /*----------------------------------------------------------------* + * Take into account the combined format bit-budget distribution + *----------------------------------------------------------------*/ + + if ( ism_mode == ISM_MASA_MODE_DISC || ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) + { + int16_t bits_ism, bits_element[MAX_NUM_OBJECTS]; + int16_t brate_limit_flag; + int32_t ism_total_brate_ref; + ism_total_brate_ref = *ism_total_brate; + brate_limit_flag = calculate_brate_limit_flag( ism_imp, nchan_ism ); + + bits_ism = (int16_t) ( *ism_total_brate / FRAMES_PER_SEC ); + set_s( bits_element, bits_ism / nchan_ism, nchan_ism ); + bits_element[nchan_ism - 1] += bits_ism % nchan_ism; + bitbudget_to_brate( bits_element, element_brate, nchan_ism ); + + *ism_total_brate = 0; + for ( ch = 0; ch < nchan_ism; ch++ ) + { + *ism_total_brate += ivas_interformat_brate( ism_mode, nchan_ism, hSCE[ch]->element_brate, ism_imp[ch], brate_limit_flag ); + + if ( ism_imp[ch] > 1 && flag_omasa_ener_brate == 1 && brate_limit_flag >= 0 ) + { + *ism_total_brate -= ADJUST_ISM_BRATE_NEG; + } + + if ( brate_limit_flag == -1 && ism_imp[ch] >= 1 && nchan_ism >= 3 && ( ism_total_brate_ref - *ism_total_brate > IVAS_48k ) ) + { + *ism_total_brate += ADJUST_ISM_BRATE_POS; + } + } + ism_metadata_flag_global = 1; + + if ( ism_mode == ISM_MASA_MODE_DISC ) + { + brate_limit_flag = 0; + for ( int16_t n = 0; n < nchan_ism; n++ ) + { + brate_limit_flag += ism_imp[n]; + } + + if ( brate_limit_flag >= nchan_ism * ISM_HIGH_IMP - 2 ) + { + *omasa_stereo_sw_cnt = OMASA_STEREO_SW_CNT_MAX; + } + } + } + + /*----------------------------------------------------------------* + * Configuration and decision about bitrates per channel + *----------------------------------------------------------------*/ + + if ( ism_mode == ISM_MASA_MODE_DISC || ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) + { + if ( ( error = ivas_ism_config( *ism_total_brate, nchan_transport, nchan_ism, hIsmMeta, ism_extended_metadata_flag, null_metadata_flag, ism_imp, element_brate, total_brate, nb_bits_metadata, 1 ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + if ( ( error = ivas_ism_config( *ism_total_brate, nchan_transport, nchan_ism, hIsmMeta, ism_extended_metadata_flag, null_metadata_flag, ism_imp, element_brate, total_brate, nb_bits_metadata, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + for ( ch = 0; ch < nchan_ism; ch++ ) + { + hIsmMeta[ch]->last_ism_metadata_flag = hIsmMeta[ch]->ism_metadata_flag; + + if ( hIsmMeta[ch]->ism_metadata_flag == 0 ) + { + hIsmMeta[ch]->ism_md_fec_cnt_enc++; + } + else + { + hIsmMeta[ch]->ism_md_fec_cnt_enc = 0; + } + hIsmMeta[ch]->ism_md_inc_diff_cnt++; + hIsmMeta[ch]->ism_md_inc_diff_cnt = min( hIsmMeta[ch]->ism_md_inc_diff_cnt, ISM_MD_INC_DIFF_CNT_MAX ); + } + + for ( ch = 0; ch < nchan_transport; ch++ ) + { + hSCE[ch]->hCoreCoder[0]->low_rate_mode = 0; + if ( ism_mode == ISM_MODE_DISC ) + { + if ( ism_imp[ch] == ISM_NO_META && ( ( total_brate[ch] < ACELP_8k00 && element_brate[ch] < SCE_CORE_16k_LOW_LIMIT ) || + ( total_brate[ch] <= ACELP_16k_LOW_LIMIT && element_brate[ch] >= SCE_CORE_16k_LOW_LIMIT ) ) ) + { + hSCE[ch]->hCoreCoder[0]->low_rate_mode = 1; + } + + hSCE[ch]->element_brate = element_brate[ch]; + } + else if ( ism_mode == ISM_MASA_MODE_DISC || ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) + { + if ( ism_imp[ch] == ISM_INACTIVE_IMP ) + { + hSCE[ch]->hCoreCoder[0]->low_rate_mode = 1; + } + } + + hSCE[ch]->hCoreCoder[0]->total_brate = total_brate[ch]; + + /* write metadata only in active frames */ + if ( hSCE[0]->hCoreCoder[0]->core_brate > SID_2k40 ) + { + reset_indices_enc( hSCE[ch]->hMetaData, hSCE[ch]->hMetaData->nb_ind_tot ); + } + } + + pop_wmops(); + + return error; +} + + +/*------------------------------------------------------------------------- + * ivas_ism_metadata_enc_create() + * + * Create, allocate, initialize and configure IVAS encoder ISM metadata handles + *-------------------------------------------------------------------------*/ + +ivas_error ivas_ism_metadata_enc_create( + Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ + const int16_t n_ISms, /* i : number of objects */ + int32_t element_brate_tmp[] /* o : element bitrate per object */ +) +{ + int16_t ch, nchan_transport; + ivas_error error; + + nchan_transport = st_ivas->nchan_transport; + if ( st_ivas->hEncoderConfig->ivas_format == MASA_ISM_FORMAT ) + { + nchan_transport = MAX_PARAM_ISM_WAVE; + ivas_set_omasa_TC( st_ivas->ism_mode, n_ISms, &st_ivas->nSCE, &st_ivas->nCPE ); + } + else if ( st_ivas->hEncoderConfig->ivas_format == SBA_ISM_FORMAT ) + { + nchan_transport = n_ISms; + } + else + { + if ( st_ivas->ism_mode == ISM_MODE_NONE ) + { + nchan_transport = st_ivas->nchan_transport; + + if ( nchan_transport == 1 ) + { + st_ivas->nSCE = 1; + st_ivas->nCPE = 0; + } + else + { + st_ivas->nSCE = 0; + st_ivas->nCPE = 1; + } + } + else if ( st_ivas->ism_mode == ISM_MODE_PARAM ) + { + nchan_transport = 2; + } + else + { + nchan_transport = n_ISms; + } + + st_ivas->nchan_transport = nchan_transport; + st_ivas->nSCE = nchan_transport; + st_ivas->nCPE = 0; + } + + /* allocate ISM metadata handles */ + for ( ch = 0; ch < n_ISms; ch++ ) + { + if ( ( st_ivas->hIsmMetaData[ch] = (ISM_METADATA_HANDLE) malloc( sizeof( ISM_METADATA_FRAME ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for ISM MetaData\n" ) ); + } + st_ivas->hIsmMetaData[ch]->position_angle.last_angle1_idx = 0; + st_ivas->hIsmMetaData[ch]->position_angle.angle1_diff_cnt = ISM_FEC_MAX; + st_ivas->hIsmMetaData[ch]->position_angle.last_angle2_idx = 0; + st_ivas->hIsmMetaData[ch]->position_angle.angle2_diff_cnt = ISM_FEC_MAX - 1; + st_ivas->hIsmMetaData[ch]->orientation_angle.last_angle1_idx = 0; + st_ivas->hIsmMetaData[ch]->orientation_angle.angle1_diff_cnt = ISM_FEC_MAX - 2; + st_ivas->hIsmMetaData[ch]->orientation_angle.last_angle2_idx = 0; + st_ivas->hIsmMetaData[ch]->orientation_angle.angle2_diff_cnt = ISM_FEC_MAX - 2; + st_ivas->hIsmMetaData[ch]->last_radius_idx = 0; + st_ivas->hIsmMetaData[ch]->radius_diff_cnt = ISM_FEC_MAX - 2; + st_ivas->hIsmMetaData[ch]->last_ism_metadata_flag = 0; + + st_ivas->hIsmMetaData[ch]->ism_imp = -1; + st_ivas->hIsmMetaData[ch]->ism_md_null_flag = 0; + st_ivas->hIsmMetaData[ch]->ism_md_lowrate_flag = 0; + st_ivas->hIsmMetaData[ch]->q_azimuth_old = 0.0f; + st_ivas->hIsmMetaData[ch]->q_elevation_old = 0.0f; + + ivas_ism_reset_metadata( st_ivas->hIsmMetaData[ch] ); + + st_ivas->hIsmMetaData[ch]->last_azimuth = 0.0f; + st_ivas->hIsmMetaData[ch]->last_elevation = 0.0f; + + st_ivas->hIsmMetaData[ch]->last_true_azimuth = 0.0f; + st_ivas->hIsmMetaData[ch]->last_true_elevation = 0.0f; + st_ivas->hIsmMetaData[ch]->ism_md_fec_cnt_enc = 0; + st_ivas->hIsmMetaData[ch]->ism_md_inc_diff_cnt = ISM_MD_INC_DIFF_CNT_MAX; + st_ivas->hIsmMetaData[ch]->last_true_radius = 1.0f; + } + + if ( st_ivas->hEncoderConfig->ivas_format == MASA_ISM_FORMAT ) + { + if ( st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) + { + if ( ( error = ivas_ism_config( st_ivas->hEncoderConfig->ivas_total_brate, nchan_transport, 1, NULL, 0, NULL, NULL, element_brate_tmp, NULL, NULL, 1 ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC ) + { + if ( ( error = ivas_ism_config( st_ivas->hEncoderConfig->ivas_total_brate, nchan_transport, n_ISms, NULL, 0, NULL, NULL, element_brate_tmp, NULL, NULL, 1 ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + else + { + if ( ( error = ivas_ism_config( st_ivas->hEncoderConfig->ivas_total_brate, nchan_transport, n_ISms, NULL, 0, NULL, NULL, element_brate_tmp, NULL, NULL, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + return IVAS_ERR_OK; +} + + +/*------------------------------------------------------------------------- + * encode_radius() + * + * Radius index encoding + *-------------------------------------------------------------------------*/ + +static void encode_radius( + BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ + int16_t *last_radius_idx, /* i/o: last radius index */ + int16_t *radius_diff_cnt, /* i/o: radius diff coding counter */ + const int16_t last_ism_metadata_flag, /* last frame ism_metadata_flag */ + const int16_t idx_radius_abs, /* i : Azimuth index */ + int16_t *flag_abs_radius /* o : Radius encoding mode */ +) +{ + int16_t idx_radius, nbits_diff_radius, diff; + + idx_radius = idx_radius_abs; + nbits_diff_radius = 0; + *flag_abs_radius = 0; /* differential coding by default */ + + if ( *radius_diff_cnt == ISM_FEC_MAX /* make differential encoding in ISM_FEC_MAX consecutive frames at maximum (in order to control the decoding in FEC) */ + || last_ism_metadata_flag == 0 /* If last frame had no metadata coded, do not use differential coding */ + ) + { + *flag_abs_radius = 1; + } + + diff = idx_radius_abs - *last_radius_idx; + + /* try differential coding */ + if ( *flag_abs_radius == 0 ) + { + if ( diff == 0 ) + { + idx_radius = 0; + nbits_diff_radius = 1; + } + else if ( ABSVAL( diff ) <= ISM_MAX_RADIUS_DIFF_IDX ) + { + idx_radius = 1 << 1; + nbits_diff_radius = 1; + + if ( diff < 0 ) + { + idx_radius += 1; /* negative sign */ + diff *= -1; + } + else + { + idx_radius += 0; /* positive sign */ + } + + idx_radius = idx_radius << diff; + nbits_diff_radius++; + + /* unary coding of "diff */ + idx_radius += ( ( 1 << diff ) - 1 ); + nbits_diff_radius += diff; + + if ( nbits_diff_radius < ISM_RADIUS_NBITS ) + { + /* add stop bit */ + idx_radius = idx_radius << 1; + nbits_diff_radius++; + } + } + else + { + *flag_abs_radius = 1; + } + } + + /* update counter */ + if ( *flag_abs_radius == 0 ) + { + ( *radius_diff_cnt )++; + *radius_diff_cnt = min( *radius_diff_cnt, ISM_FEC_MAX ); + } + else + { + *radius_diff_cnt = 0; + } + + /* Write radius */ + push_indice( hBstr, IND_ISM_RADIUS_DIFF_FLAG, *flag_abs_radius, 1 ); + + if ( *flag_abs_radius ) + { + push_indice( hBstr, IND_ISM_RADIUS, idx_radius, ISM_RADIUS_NBITS ); + } + else + { + push_indice( hBstr, IND_ISM_RADIUS, idx_radius, nbits_diff_radius ); + } + + /* Updates */ + *last_radius_idx = idx_radius_abs; + + return; +} + + +/*----------------------------------------------------------------* + * encode_angle_indices() + * + * Encoding of an angle + *----------------------------------------------------------------*/ + +static void encode_angle_indices( + BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ + ISM_METADATA_ANGLE_HANDLE angle, /* i/o: angle handle */ + const int16_t last_ism_metadata_flag, /* i : last frame ism_metadata_flag */ + const int16_t ini_frame, /* i : initialization frames counter */ + const int16_t idx_angle1_abs, /* i : Azimuth index */ + const int16_t idx_angle2_abs, /* i : Elevation index */ + int16_t *flag_abs_angle1, /* o : Azimuth/yaw encoding mode */ + int16_t *flag_abs_angle2 /* o : Elevation/pitch encoding mode */ +) +{ + int16_t idx_angle1, nbits_diff_angle1, diff; + int16_t idx_angle2, nbits_diff_angle2; + + /*----------------------------------------------------------------* + * Azimuth/yaw index encoding + *----------------------------------------------------------------*/ + + idx_angle1 = idx_angle1_abs; + + nbits_diff_angle1 = 0; + + *flag_abs_angle1 = 0; /* differential coding by default */ + if ( angle->angle1_diff_cnt == ISM_FEC_MAX /* make differential encoding in ISM_FEC_MAX consecutive frames at maximum (in order to control the decoding in FEC) */ + || last_ism_metadata_flag == 0 /* If last frame had no metadata coded, do not use differential coding */ + ) + { + *flag_abs_angle1 = 1; + } + + /* try differential coding */ + if ( *flag_abs_angle1 == 0 ) + { + diff = idx_angle1_abs - angle->last_angle1_idx; + + /* azimuth is on a circle - check for diff coding for -180° -> 180° and vice versa changes */ + if ( abs( diff ) > ( ( 1 << ISM_AZIMUTH_NBITS ) - 1 ) - ISM_MAX_AZIMUTH_DIFF_IDX ) + { + if ( diff > 0 ) + { + diff -= ( 1 << ISM_AZIMUTH_NBITS ) - 1; + } + else + { + diff += ( 1 << ISM_AZIMUTH_NBITS ) - 1; + } + } + + if ( diff == 0 ) + { + idx_angle1 = 0; + nbits_diff_angle1 = 1; + } + else if ( ABSVAL( diff ) < ISM_MAX_AZIMUTH_DIFF_IDX ) /* when diff bits >= abs bits, prefer abs */ + { + idx_angle1 = 1 << 1; + nbits_diff_angle1 = 1; + + if ( diff < 0 ) + { + idx_angle1 += 1; /* negative sign */ + diff *= -1; + } + else + { + idx_angle1 += 0; /* positive sign */ + } + + idx_angle1 = idx_angle1 << diff; + nbits_diff_angle1++; + + /* unary coding of "diff */ + idx_angle1 += ( ( 1 << diff ) - 1 ); + nbits_diff_angle1 += diff; + + if ( nbits_diff_angle1 < ISM_AZIMUTH_NBITS - 1 ) + { + /* add stop bit - only for codewords shorter than ISM_AZIMUTH_NBITS */ + idx_angle1 = idx_angle1 << 1; + nbits_diff_angle1++; + } + } + else + { + *flag_abs_angle1 = 1; + } + } + + /* update counter */ + if ( *flag_abs_angle1 == 0 ) + { + angle->angle1_diff_cnt++; + angle->angle1_diff_cnt = min( angle->angle1_diff_cnt, ISM_FEC_MAX ); + } + else + { + angle->angle1_diff_cnt = 0; + } + + /* Write azimuth/yaw */ + push_indice( hBstr, IND_ISM_AZIMUTH_DIFF_FLAG, *flag_abs_angle1, 1 ); + + if ( *flag_abs_angle1 ) + { + push_indice( hBstr, IND_ISM_AZIMUTH, idx_angle1, ISM_AZIMUTH_NBITS ); + } + else + { + push_indice( hBstr, IND_ISM_AZIMUTH, idx_angle1, nbits_diff_angle1 ); + } + + /*----------------------------------------------------------------* + * Elevation/pitch index encoding + *----------------------------------------------------------------*/ + + if ( flag_abs_angle2 ) + { + idx_angle2 = idx_angle2_abs; + nbits_diff_angle2 = 0; + *flag_abs_angle2 = 0; /* differential coding by default */ + if ( angle->angle2_diff_cnt == ISM_FEC_MAX /* make differential encoding in ISM_FEC_MAX consecutive frames at maximum (in order to control the decoding in FEC) */ + || last_ism_metadata_flag == 0 /* If last frame had no metadata coded, do not use differential coding */ + ) + { + *flag_abs_angle2 = 1; + } + + /* note: elevation/pitch is coded starting from the second frame only (it is meaningless in the init_frame) */ + if ( ini_frame == 0 ) + { + *flag_abs_angle2 = 1; + angle->last_angle2_idx = idx_angle2_abs; + } + + diff = idx_angle2_abs - angle->last_angle2_idx; + + /* avoid absolute coding of elevation/pitch if absolute coding was already used for azimuth/yaw */ + if ( *flag_abs_angle1 == 1 ) + { + int16_t diff_orig = diff; + + *flag_abs_angle2 = 0; + + + if ( diff >= 0 ) + { + diff = min( diff, ISM_MAX_ELEVATION_DIFF_IDX ); + } + else + { + diff = -1 * min( -diff, ISM_MAX_ELEVATION_DIFF_IDX ); + } + + if ( last_ism_metadata_flag == 0 || abs( diff_orig - diff ) > ISM_MAX_ELEVATION_DIFF_IDX ) + { + angle->angle2_diff_cnt = ISM_FEC_MAX - 1; + } + } + + /* try differential coding */ + if ( *flag_abs_angle2 == 0 ) + { + if ( diff == 0 ) + { + idx_angle2 = 0; + nbits_diff_angle2 = 1; + } + else if ( ABSVAL( diff ) <= ISM_MAX_ELEVATION_DIFF_IDX ) + { + idx_angle2 = 1 << 1; + nbits_diff_angle2 = 1; + + if ( diff < 0 ) + { + idx_angle2 += 1; /* negative sign */ + diff *= -1; + } + else + { + idx_angle2 += 0; /* positive sign */ + } + + idx_angle2 = idx_angle2 << diff; + nbits_diff_angle2++; + + /* unary coding of "diff */ + idx_angle2 += ( ( 1 << diff ) - 1 ); + nbits_diff_angle2 += diff; + + if ( nbits_diff_angle2 < ISM_ELEVATION_NBITS ) + { + /* add stop bit */ + idx_angle2 = idx_angle2 << 1; + nbits_diff_angle2++; + } + } + else + { + *flag_abs_angle2 = 1; + } + } + + /* update counter */ + if ( *flag_abs_angle2 == 0 ) + { + angle->angle2_diff_cnt++; + angle->angle2_diff_cnt = min( angle->angle2_diff_cnt, ISM_FEC_MAX ); + } + else + { + angle->angle2_diff_cnt = 0; + } + + /* Write elevation */ + if ( *flag_abs_angle1 == 0 ) /* do not write "flag_abs_elevation/pitch" if "flag_abs_azimuth/yaw == 1" */ + { + push_indice( hBstr, IND_ISM_ELEVATION_DIFF_FLAG, *flag_abs_angle2, 1 ); + } + + if ( *flag_abs_angle2 ) + { + push_indice( hBstr, IND_ISM_ELEVATION, idx_angle2, ISM_ELEVATION_NBITS ); + } + else + { + push_indice( hBstr, IND_ISM_ELEVATION, idx_angle2, nbits_diff_angle2 ); + } + } + + /*----------------------------------------------------------------* + * Updates + *----------------------------------------------------------------*/ + + angle->last_angle1_idx = idx_angle1_abs; + angle->last_angle2_idx = idx_angle2_abs; + + return; +} + + +/*-------------------------------------------------------------------* + * ivas_ism_metadata_sid_enc() + * + * Quantize and encode ISM metadata in SID frame + *-------------------------------------------------------------------*/ + +void ivas_ism_metadata_sid_enc( + ISM_DTX_HANDLE hISMDTX, /* i/o: ISM DTX handle */ + const int16_t flag_noisy_speech, /* i : noisy speech flag */ + const int16_t nchan_ism, /* i : number of objects */ + const int16_t nchan_transport, /* i : number of transport channels */ + const ISM_MODE ism_mode, /* i : ISM mode */ + ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ + const int16_t sid_flag, /* i : indication of SID frame */ + const int16_t md_diff_flag[], /* i : metadata differental flag */ + BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ + int16_t nb_bits_metadata[] /* o : number of metadata bits */ +) +{ + int16_t i, ch, nBits, nBits_start, nBits_unused; + float q_step, q_step_border; + int16_t idx, idx_azimuth, idx_elevation; + int16_t nBits_azimuth, nBits_elevation, nBits_coh, nBits_sce_id; + float valQ; + ISM_METADATA_HANDLE hIsmMetaData; + + if ( sid_flag ) + { + nBits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC; + nBits -= SID_FORMAT_NBITS; + nBits_start = hBstr->nb_bits_tot; + + /*----------------------------------------------------------------* + * Write ISm common signaling + *----------------------------------------------------------------*/ + + /* write number of objects - unary coding */ + for ( ch = 1; ch < nchan_ism; ch++ ) + { + push_indice( hBstr, IND_ISM_NUM_OBJECTS, 1, 1 ); + } + push_indice( hBstr, IND_ISM_NUM_OBJECTS, 0, 1 ); + + /* write SID metadata flag (one per object) */ + for ( ch = 0; ch < nchan_ism; ch++ ) + { + push_indice( hBstr, IND_ISM_METADATA_FLAG, md_diff_flag[ch], 1 ); + } + + /*----------------------------------------------------------------* + * Set quantization bits based on the number of coded objects + *----------------------------------------------------------------*/ + + ivas_get_ism_sid_quan_bitbudget( nchan_ism, &nBits_azimuth, &nBits_elevation, &q_step, &q_step_border, &nBits_coh, &nBits_sce_id ); + + /*----------------------------------------------------------------* + * Spatial parameters, loop over TCs - 1 + *----------------------------------------------------------------*/ + + /* write ISM mode flag to explicitly signal number of spatial parameters */ + if ( nchan_ism > 2 ) + { + if ( ism_mode == ISM_MODE_DISC ) + { + push_indice( hBstr, IND_ISM_MD_INACTIVE_FLAG, 0, 1 ); + } + else + { + push_indice( hBstr, IND_ISM_MD_INACTIVE_FLAG, 1, 1 ); + } + + if ( ism_mode == ISM_MODE_PARAM ) + { + /* write noisy speech flag */ + push_indice( hBstr, IND_ISM_NOISY_SPEECH_FLAG, flag_noisy_speech, 1 ); + nBits_sce_id = 1; + } + } + + if ( nchan_transport > 1 ) + { + /* write sce id */ + push_indice( hBstr, IND_ISM_SCE_ID_DTX, hISMDTX->sce_id_dtx, nBits_sce_id ); + + /* quantize and write coherence */ + for ( ch = 0; ch < nchan_transport; ch++ ) + { + if ( ch == hISMDTX->sce_id_dtx ) + { + continue; + } + + idx = (int16_t) ( hISMDTX->coh[ch] * ( ( 1 << nBits_coh ) - 1 ) + 0.5f ); + assert( ( idx >= 0 ) && ( idx <= ( ( 1 << nBits_coh ) - 1 ) ) ); + push_indice( hBstr, IND_ISM_DTX_COH_SCA, idx, nBits_coh ); + } + } + + /*----------------------------------------------------------------* + * Metadata quantization and coding, loop over all objects + *----------------------------------------------------------------*/ + + for ( ch = 0; ch < nchan_ism; ch++ ) + { + if ( md_diff_flag[ch] == 1 ) + { + hIsmMetaData = hIsmMeta[ch]; + + idx_azimuth = ism_quant_meta( hIsmMetaData->azimuth, &valQ, ism_azimuth_borders, q_step, q_step_border, 1 << nBits_azimuth ); + idx_elevation = ism_quant_meta( hIsmMetaData->elevation, &valQ, ism_elevation_borders, q_step, q_step_border, 1 << nBits_elevation ); + + push_indice( hBstr, IND_ISM_AZIMUTH, idx_azimuth, nBits_azimuth ); + push_indice( hBstr, IND_ISM_ELEVATION, idx_elevation, nBits_elevation ); + + /* update last indexes to correspond to active frames coding */ + if ( nBits_azimuth > ISM_AZIMUTH_NBITS ) + { + hIsmMetaData->position_angle.last_angle1_idx = idx_azimuth >> ( nBits_azimuth - ISM_AZIMUTH_NBITS ); + hIsmMetaData->position_angle.last_angle2_idx = idx_elevation >> ( nBits_elevation - ISM_ELEVATION_NBITS ); + } + else + { + hIsmMetaData->position_angle.last_angle1_idx = idx_azimuth << ( ISM_AZIMUTH_NBITS - nBits_azimuth ); + hIsmMetaData->position_angle.last_angle2_idx = idx_elevation << ( ISM_ELEVATION_NBITS - nBits_elevation ); + } + + hIsmMetaData->ism_md_fec_cnt_enc = 0; + hIsmMeta[ch]->ism_md_inc_diff_cnt = ISM_MD_INC_DIFF_CNT_MAX; + } + } + + /* Write unused (padding) bits */ + nBits_unused = nBits - hBstr->nb_bits_tot; + while ( nBits_unused > 0 ) + { + i = min( nBits_unused, 16 ); + push_indice( hBstr, IND_UNUSED, 0, i ); + nBits_unused -= i; + } + + nb_bits_metadata[0] = hBstr->nb_bits_tot - nBits_start; + } + + return; +} diff --git a/lib_enc/ivas_ism_param_enc.c b/lib_enc/ivas_ism_param_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..dd30d582818e0f82f7b9a2da0e8fc307c4d79161 --- /dev/null +++ b/lib_enc/ivas_ism_param_enc.c @@ -0,0 +1,540 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include +#include "options.h" +#include "ivas_prot.h" +#include "prot.h" +#include "cnst.h" +#include "ivas_cnst.h" +#include "ivas_rom_com.h" +#include "wmc_auto.h" + +/*------------------------------------------------------------------------- + * Local function definitions + *------------------------------------------------------------------------*/ + + +static void ivas_param_ism_compute_obj_parameters( + const int16_t nchan_ism, /* i : number of ISM channels */ + float reference_power_obj[MAX_NUM_OBJECTS][PARAM_ISM_MDFT_NO_SLOTS][DIRAC_NO_FB_BANDS_MAX], /* i : Reference power */ + PARAM_ISM_CONFIG_HANDLE hParamIsm /* i/o: Param ISM Enc Handle */ +) +{ + int16_t i, b, m, br, mr; + int16_t brange_start, brange_end, mrange_start, mrange_end, time_merge_fac; + float power_ratios_m[MAX_PARAM_ISM_NBANDS][MAX_PARAM_ISM_NBLOCKS]; + float ref_power_local_frame[MAX_NUM_OBJECTS]; + float tmp_ratio; + + set_f( ref_power_local_frame, 0, MAX_NUM_OBJECTS ); + + assert( nchan_ism == 3 || nchan_ism == 4 ); + + for ( b = 0; b < hParamIsm->nbands; b++ ) + { + /* current frequency band borders */ + brange_start = hParamIsm->band_grouping[b]; + brange_end = hParamIsm->band_grouping[b + 1]; + + /* time slots to aggregate for current block */ + time_merge_fac = PARAM_ISM_MDFT_NO_SLOTS / hParamIsm->nblocks[b]; + + for ( m = 0; m < hParamIsm->nblocks[b]; m++ ) + { + int16_t index_1, index_2; + float ref_power_local[MAX_NUM_OBJECTS]; + + /* initialize to 0 so unused entries are not considered later */ + set_f( ref_power_local, 0, MAX_NUM_OBJECTS ); + + /* current block borders */ + mrange_start = m * time_merge_fac; + mrange_end = ( m + 1 ) * time_merge_fac; + + /* for each object, sum up reference power within current T/F tile */ + + for ( i = 0; i < nchan_ism; i++ ) + { + for ( mr = mrange_start; mr < mrange_end; mr++ ) + { + for ( br = brange_start; br < brange_end; br++ ) + { + ref_power_local[i] += reference_power_obj[i][mr][br]; + } + } + /* Sum up T/F tiles per object */ + ref_power_local_frame[i] += ref_power_local[i]; + } + + /* find two dominant objects and derive object indices for current T/F tile */ + if ( ref_power_local[0] >= ref_power_local[1] ) + { + index_1 = 0; + index_2 = 1; + } + else + { + index_1 = 1; + index_2 = 0; + } + + for ( i = MAX_PARAM_ISM_WAVE; i < nchan_ism; i++ ) + { + if ( ref_power_local[i] > ref_power_local[index_1] ) + { + index_2 = index_1; + index_1 = i; + } + else if ( ref_power_local[i] > ref_power_local[index_2] ) + { + index_2 = i; + } + } + + /* Copy the quantized indices */ + hParamIsm->obj_indices[b][m][0] = index_1; + hParamIsm->obj_indices[b][m][1] = index_2; + + /* Compute power ratios */ + if ( ( ref_power_local[index_1] + ref_power_local[index_2] ) == 0.f ) + { + power_ratios_m[b][m] = 0.5; + } + else + { + power_ratios_m[b][m] = ref_power_local[index_1] / ( ref_power_local[index_1] + ref_power_local[index_2] ); + } + assert( ( power_ratios_m[b][m] >= 0.5 ) && ( power_ratios_m[b][m] <= 1 ) ); + + /* Quantize power ratios */ + /* Power ratio range [0.5,1] is mapped to [0,1] first, rounding via truncation float->integer */ + hParamIsm->power_ratios_idx[b][m] = (int16_t) ( ( ( power_ratios_m[b][m] - 0.5f ) * 2 ) * ( ( 1 << PARAM_ISM_POW_RATIO_NBITS ) - 1 ) + 0.5f ); + assert( ( hParamIsm->power_ratios_idx[b][m] >= 0 ) && ( hParamIsm->power_ratios_idx[b][m] <= ( ( 1 << PARAM_ISM_POW_RATIO_NBITS ) - 1 ) ) ); + } + } + + /* Check if objects have roughly equal power by comparing reference power of first object against all others*/ + hParamIsm->flag_equal_energy = 1; + for ( i = 1; i < nchan_ism; i++ ) + { + if ( ref_power_local_frame[i] != 0.0f ) + { + tmp_ratio = ref_power_local_frame[0] / ref_power_local_frame[i]; + + if ( ( tmp_ratio > 0.975f ) && ( tmp_ratio < 1.025f ) ) + { + hParamIsm->flag_equal_energy &= 1; + } + else + { + hParamIsm->flag_equal_energy &= 0; + break; + } + } + } + + return; +} + + +static void ivas_param_ism_enc_quantize_DOA( + const int16_t nchan_ism, /* i : number of ISM channels */ + ISM_METADATA_HANDLE hIsmMetaData[MAX_NUM_OBJECTS], /* i : ISM metadata */ + PARAM_ISM_CONFIG_HANDLE hParamIsm /* i/o: Param ISM encoder handle */ +) +{ + int16_t i, azi_idx, ele_idx; + float valQ; + + + /* Loop over objects */ + for ( i = 0; i < nchan_ism; i++ ) + { + /* Quantize the elevation and obtain quantized elevation value and index */ + ele_idx = ism_quant_meta( hIsmMetaData[i]->elevation, &valQ, ism_elevation_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_ELEVATION_NBITS ); + + /* Obtain the index of quantized azimuth values */ + azi_idx = ism_quant_meta( hIsmMetaData[i]->azimuth, &valQ, ism_azimuth_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_AZIMUTH_NBITS ); + + /*Replace azimuth with quantized values */ + hIsmMetaData[i]->azimuth = valQ; + + /* Copy the quantized indices */ + hParamIsm->azi_index[i] = azi_idx; + hParamIsm->ele_index[i] = ele_idx; + } + + return; +} + + +/*-------------------------------------------------------------------------* + * ivas_param_ism_stereo_dmx() + * + * Downmix input channels to stereo + *-------------------------------------------------------------------------*/ + +void ivas_param_ism_stereo_dmx( + Encoder_Struct *st_ivas, /* i : IVAS encoder structure */ + float *data[MAX_NUM_OBJECTS], /* i/o: input signal/stereo dmx */ + const int16_t input_frame /* i : Length of input frame */ +) +{ + int16_t i, j; + float alpha, azi_shift, tmp, tmp_1; + float cardioid_left[MAX_NUM_OBJECTS], cardioid_right[MAX_NUM_OBJECTS]; + float stereo_dmx[2][L_FRAME48k]; + float dmx_gain, ene_dmx, ene_data, grad; + float last_dmx_gain; + float last_cardioid_left; + ISM_METADATA_HANDLE hIsmMetaData; + + push_wmops( "ivas_param_ism_st_dmx" ); + + /*Initialization*/ + alpha = 0.5; + azi_shift = 0; + dmx_gain = 0; + ene_dmx = 0; + ene_data = 0; + last_dmx_gain = st_ivas->hParamIsm->last_dmx_gain; + + /* Set the stereo dmx to zero */ + set_zero( stereo_dmx[0], L_FRAME48k ); + set_zero( stereo_dmx[1], L_FRAME48k ); + + /* Loop over all objects */ + for ( i = 0; i < st_ivas->hEncoderConfig->nchan_ism; i++ ) + { + hIsmMetaData = st_ivas->hIsmMetaData[i]; + last_cardioid_left = st_ivas->hParamIsm->last_cardioid_left[i]; + /*Compute the Cardioids for the corresponding object direction */ + tmp = hIsmMetaData->azimuth * ( EVS_PI / 180 ); + tmp_1 = ( EVS_PI / 2 ) + azi_shift; + cardioid_left[i] = alpha + ( 1 - alpha ) * cosf( tmp - tmp_1 ); + if ( st_ivas->hSCE[0]->hCoreCoder[0]->ini_frame > 0 ) + { + float last_cardioid_right; + last_cardioid_right = 1.0f - last_cardioid_left; + /* Smoothing */ + cardioid_left[i] = 0.75f * cardioid_left[i] + 0.25f * last_cardioid_left; + grad = ( cardioid_left[i] - last_cardioid_left ) * 2.0f / (float) input_frame; /* for the right cardioid, multiply with -1 */ + /* Cardioids sum up to 1 */ + cardioid_right[i] = 1.0f - cardioid_left[i]; /* corresponds to: alpha + ( 1 - alpha ) * cosf( tmp + tmp_1 ); */ + /* Loop over all samples */ + for ( j = 0; j < input_frame / 2; j++ ) + { + tmp = data[i][j]; + stereo_dmx[0][j] += ( ( last_cardioid_left + j * grad ) * tmp ); /* DMX Left */ + stereo_dmx[1][j] += ( ( last_cardioid_right + j * grad * ( -1.0f ) ) * tmp ); /* DMX Right */ + ene_data += ( tmp * tmp ); /* energy of all objects combined */ + } + for ( ; j < input_frame; j++ ) + { + tmp = data[i][j]; + stereo_dmx[0][j] += cardioid_left[i] * tmp; /* DMX Left */ + stereo_dmx[1][j] += cardioid_right[i] * tmp; /* DMX Right */ + ene_data += ( tmp * tmp ); /* energy of all objects combined */ + } + } + else + { + /* Cardioids sum up to 1 */ + cardioid_right[i] = 1.0f - cardioid_left[i]; /* corresponds to: alpha + ( 1 - alpha ) * cosf( tmp + tmp_1 ); */ + /* Loop over all samples */ + for ( j = 0; j < input_frame; j++ ) + { + tmp = data[i][j]; + stereo_dmx[0][j] += cardioid_left[i] * tmp; /* DMX Left */ + stereo_dmx[1][j] += cardioid_right[i] * tmp; /* DMX Right */ + ene_data += ( tmp * tmp ); /* energy of all objects combined */ + } + } + st_ivas->hParamIsm->last_cardioid_left[i] = cardioid_left[i]; + } + + /* Energy compensation */ + for ( j = 0; j < input_frame; j++ ) + { + ene_dmx += stereo_dmx[0][j] * stereo_dmx[0][j] + stereo_dmx[1][j] * stereo_dmx[1][j]; + } + dmx_gain = sqrtf( ene_data / ( ene_dmx + EPSILON ) ); + /* Smoothing */ + if ( st_ivas->hSCE[0]->hCoreCoder[0]->ini_frame > 0 ) + { + dmx_gain = 0.75f * dmx_gain + 0.25f * last_dmx_gain; + /* 10ms ramp */ + grad = ( dmx_gain - last_dmx_gain ) * 2.0f / (float) input_frame; /* slope between two consecutive gains, 480 samples length */ + for ( i = 0; i < ( input_frame / 2 ); i++ ) + { + stereo_dmx[0][i] *= ( last_dmx_gain + i * grad ); + stereo_dmx[1][i] *= ( last_dmx_gain + i * grad ); + } + for ( ; i < input_frame; i++ ) + { + stereo_dmx[0][i] *= dmx_gain; + stereo_dmx[1][i] *= dmx_gain; + } + } + else + { + for ( j = 0; j < input_frame; j++ ) + { + stereo_dmx[0][j] *= dmx_gain; + stereo_dmx[1][j] *= dmx_gain; + } + } + st_ivas->hParamIsm->last_dmx_gain = dmx_gain; + + /* Copy the stereo dmx to data variable */ + mvr2r( stereo_dmx[0], data[0], input_frame ); + mvr2r( stereo_dmx[1], data[1], input_frame ); + + pop_wmops(); + + return; +} + + +/*-------------------------------------------------------------------------* + * ivas_param_ism_enc_open() + * + * Open Param ISM handle + *-------------------------------------------------------------------------*/ + +ivas_error ivas_param_ism_enc_open( + Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ +) +{ + int16_t i; + IVAS_FB_CFG *fb_cfg; + PARAM_ISM_CONFIG_HANDLE hParamIsm; + int16_t max_bins; + int32_t input_Fs; + ivas_error error; + + error = IVAS_ERR_OK; + + + /* Assign memory to Param Object handle */ + if ( ( hParamIsm = (PARAM_ISM_CONFIG_HANDLE) malloc( sizeof( PARAM_ISM_CONFIG_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param ISM\n" ) ); + } + + input_Fs = st_ivas->hEncoderConfig->input_Fs; + + + /* set FB config. */ + if ( ( error = ivas_fb_set_cfg( &fb_cfg, ISM_FORMAT, st_ivas->hEncoderConfig->nchan_inp, 0, 0, input_Fs, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Allocate and initialize FB mixer handle */ + if ( ( error = ivas_FB_mixer_open( &( hParamIsm->hFbMixer ), input_Fs, fb_cfg, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + + ivas_param_ism_config( hParamIsm, st_ivas->hEncoderConfig->nchan_inp ); + + /* Assign memories for Band and Block grouping */ + hParamIsm->nbands = MAX_PARAM_ISM_NBANDS; + + max_bins = (int16_t) ( ( MDFT_FB_BANDS_240 * input_Fs ) / 48000 ); + for ( i = 0; i < ( hParamIsm->nbands + 1 ); i++ ) + { + hParamIsm->band_grouping[i] = CLDFB_TO_MDFT_FAC * Param_ISM_band_grouping[i]; + if ( ( Param_ISM_band_grouping[i] * CLDFB_TO_MDFT_FAC ) > max_bins ) + { + hParamIsm->band_grouping[i] = max_bins; + } + } + + set_s( hParamIsm->noisy_speech_buffer, 0, PARAM_ISM_HYS_BUF_SIZE ); + + st_ivas->hParamIsm = hParamIsm; + + return error; +} + + +/*-------------------------------------------------------------------------* + * ivas_param_ism_enc_close() + * + * Close Param ISM encoder handle + *-------------------------------------------------------------------------*/ + +void ivas_param_ism_enc_close( + PARAM_ISM_CONFIG_HANDLE *hParamIsm, /* i/o: ParamISM handle */ + const int32_t input_Fs /* i : input sampling_rate */ +) +{ + if ( hParamIsm == NULL || *hParamIsm == NULL ) + { + return; + } + + ivas_FB_mixer_close( &( *hParamIsm )->hFbMixer, input_Fs, 0 ); + + free( ( *hParamIsm ) ); + ( *hParamIsm ) = NULL; + + return; +} + + +/*-------------------------------------------------------------------------* + * ivas_param_ism_enc() + * + * Parametric ISM encoder + *-------------------------------------------------------------------------*/ + +void ivas_param_ism_enc( + Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ + float *data[MAX_NUM_OBJECTS], /* i : input signal */ + const int16_t input_frame /* i : input frame length per channel */ +) +{ + int16_t i, j, ts, l_ts; + int16_t nchan_ism; + int16_t num_time_slots; + float *pcm_in[MAX_NUM_OBJECTS]; + float fb_RealBuffer[MAX_NUM_OBJECTS][DIRAC_NO_FB_BANDS_MAX]; + float fb_ImagBuffer[MAX_NUM_OBJECTS][DIRAC_NO_FB_BANDS_MAX]; + float *p_fb_RealBuffer[MAX_NUM_OBJECTS]; + float *p_fb_ImagBuffer[MAX_NUM_OBJECTS]; + float reference_power_obj[MAX_NUM_OBJECTS][PARAM_ISM_MDFT_NO_SLOTS][DIRAC_NO_FB_BANDS_MAX]; + PARAM_ISM_CONFIG_HANDLE hParamIsm; + + nchan_ism = st_ivas->hEncoderConfig->nchan_ism; + hParamIsm = st_ivas->hParamIsm; + + push_wmops( "ivas_param_ism_enc" ); + + l_ts = input_frame / PARAM_ISM_MDFT_NO_SLOTS; + num_time_slots = PARAM_ISM_MDFT_NO_SLOTS; + + for ( i = 0; i < nchan_ism; i++ ) + { + pcm_in[i] = data[i]; + + set_zero( fb_RealBuffer[i], DIRAC_NO_FB_BANDS_MAX ); + set_zero( fb_ImagBuffer[i], DIRAC_NO_FB_BANDS_MAX ); + p_fb_RealBuffer[i] = &fb_RealBuffer[i][0]; + p_fb_ImagBuffer[i] = &fb_ImagBuffer[i][0]; + } + + for ( ts = 0; ts < num_time_slots; ts++ ) + { + ivas_fb_mixer_get_windowed_fr( hParamIsm->hFbMixer, pcm_in, p_fb_RealBuffer, p_fb_ImagBuffer, l_ts, l_ts, hParamIsm->hFbMixer->fb_cfg->num_in_chans ); + + ivas_fb_mixer_update_prior_input( hParamIsm->hFbMixer, pcm_in, l_ts, hParamIsm->hFbMixer->fb_cfg->num_in_chans ); + + for ( i = 0; i < nchan_ism; i++ ) + { + pcm_in[i] += l_ts; + for ( j = 0; j < DIRAC_NO_FB_BANDS_MAX; j++ ) + { + reference_power_obj[i][ts][j] = fb_RealBuffer[i][j] * fb_RealBuffer[i][j] + fb_ImagBuffer[i][j] * fb_ImagBuffer[i][j]; + } + } + } + + /* Quantize DOAs */ + ivas_param_ism_enc_quantize_DOA( nchan_ism, st_ivas->hIsmMetaData, hParamIsm ); + + /* Compute object indices and power ratios */ + ivas_param_ism_compute_obj_parameters( nchan_ism, reference_power_obj, hParamIsm ); + + pop_wmops(); + return; +} + + +/*-------------------------------------------------------------------* + * ivas_param_ism_compute_noisy_speech_flag() + * + * + *-------------------------------------------------------------------*/ + +void ivas_param_ism_compute_noisy_speech_flag( + Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ +) +{ + int16_t i; + + /* Move the Noisy speech buffer */ + for ( i = 0; i < ( PARAM_ISM_HYS_BUF_SIZE - 1 ); i++ ) + { + st_ivas->hParamIsm->noisy_speech_buffer[i] = st_ivas->hParamIsm->noisy_speech_buffer[i + 1]; + } + + /* Set flag_noisy_speech to 0 for cases where object energies are not roughly equal */ + if ( !st_ivas->hParamIsm->flag_equal_energy ) + { + st_ivas->hParamIsm->noisy_speech_buffer[i] = 0; + st_ivas->hParamIsm->flag_noisy_speech = 0; + } + else + { + /* For the current frame, make a decision based on some core-coder flags */ + if ( st_ivas->hSCE[0]->hCoreCoder[0]->flag_noisy_speech_snr && st_ivas->hSCE[1]->hCoreCoder[0]->flag_noisy_speech_snr ) + { + if ( st_ivas->hSCE[0]->hCoreCoder[0]->vad_flag || st_ivas->hSCE[1]->hCoreCoder[0]->vad_flag ) + { + st_ivas->hParamIsm->noisy_speech_buffer[i] = 0; + } + else + { + st_ivas->hParamIsm->noisy_speech_buffer[i] = 1; + } + } + else + { + st_ivas->hParamIsm->noisy_speech_buffer[i] = 0; + } + + /* Do a decision based on hysteresis */ + st_ivas->hParamIsm->flag_noisy_speech = 1; + for ( i = 0; i < PARAM_ISM_HYS_BUF_SIZE; i++ ) + { + st_ivas->hParamIsm->flag_noisy_speech = st_ivas->hParamIsm->flag_noisy_speech && st_ivas->hParamIsm->noisy_speech_buffer[i]; + } + } + + return; +} diff --git a/lib_enc/ivas_lfe_enc.c b/lib_enc/ivas_lfe_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..0c7a1a21a41826c47866ecc48c2f4a28a15d289a --- /dev/null +++ b/lib_enc/ivas_lfe_enc.c @@ -0,0 +1,550 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "math.h" +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_cnst.h" +#include "ivas_rom_com.h" +#include "wmc_auto.h" + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_lfe_arith_coding() + * + * LFE Arithmetic coding block. Writes encoded data to bitstream. + *-----------------------------------------------------------------------------------------*/ + +static void ivas_lfe_arith_coding( + LFE_ENC_HANDLE hLFE, + BSTR_ENC_HANDLE hBstr, + const int16_t quant_strategy, + int16_t *values ) +{ + Tastat as; + int16_t index, i; + int16_t max_value, offset; + uint16_t num_ele_per_grp; + int16_t num_groups; + index = 0; + num_ele_per_grp = IVAS_LFE_NUM_COEFFS_IN_SUBGRP << 1; + num_groups = ivas_lfe_num_dct_pass_bins_tbl[quant_strategy] >> 1; + + for ( i = 0; i < num_groups; i++ ) + { + max_value = ivas_lfe_num_ele_in_coder_models[quant_strategy][i]; + ari_start_encoding_14bits( &as ); + offset = 4 * i; + + for ( index = 0; index < num_ele_per_grp; index++ ) + { + if ( values[index + offset] > max_value ) + { + values[index + offset] = max_value; + } + ivas_ari_encode_14bits_ext( hBstr, &as, values[index + offset], hLFE->cum_freq_models[quant_strategy][i] ); + } + + ivas_ari_done_encoding_14bits( hBstr, &as ); + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_lfe_enc_quant() + * + * LFE quatization block, calls arithmetic coding block inside + *-----------------------------------------------------------------------------------------*/ + +static void ivas_lfe_enc_quant( + LFE_ENC_HANDLE hLFE, + float *pLfe_dct, + BSTR_ENC_HANDLE hBstr ) +{ + int16_t bits_written; + int16_t nb_ind_tot; + uint16_t quant_strategy, write_bit; + int16_t num_quant_strategies; + int16_t shift_bits; + int16_t values[IVAS_LFE_MAX_NUM_DCT_COEFFS << 1]; + float temp_lfe_dct[IVAS_LFE_MAX_NUM_DCT_COEFFS]; + int16_t target_bits; + int16_t base2_num_bits_tot; + int16_t coding_strategy; + int16_t bits_written_arith_enc; + int16_t next_ind_pos_arith_enc; + int16_t num_ele_per_grp = IVAS_LFE_NUM_COEFFS_IN_SUBGRP << 1; + + target_bits = (int16_t) ( IVAS_LFE_BITRATE_5000 / FRAMES_PER_SEC ); + + write_bit = 0; + num_quant_strategies = IVAS_MAX_NUM_QUANT_STRATS; + shift_bits = IVAS_LFE_SHIFT_BITS; + bits_written = hBstr->nb_bits_tot; + nb_ind_tot = hBstr->nb_ind_tot; + + + for ( quant_strategy = 0; quant_strategy < num_quant_strategies; quant_strategy++ ) + { + float lfe_abs_sum; + int16_t num_dct_pass_bins; + int16_t max_of_vals, num_groups; + int16_t shift; + uint16_t min_shift, i, j; + uint16_t max_shift; + uint16_t max_value, num_lfe_ele; + uint16_t all_zeros_dct; + + lfe_abs_sum = 0; + coding_strategy = 0; + num_dct_pass_bins = ivas_lfe_num_dct_pass_bins_tbl[quant_strategy]; + max_of_vals = 0; + num_groups = num_dct_pass_bins >> 1; + shift = 0; + min_shift = ivas_lfe_min_shift_tbl[quant_strategy]; + max_shift = min_shift * IVAS_LFE_SHIFTS_PER_DOUBLE + ( 1 << shift_bits ) - 1; + num_lfe_ele = num_dct_pass_bins * IVAS_LFE_NUM_COEFFS_IN_SUBGRP; + all_zeros_dct = 0; + max_value = ivas_lfe_num_ele_in_coder_models[quant_strategy][0]; + + mvr2r( &pLfe_dct[IVAS_LFE_MAX_NUM_DCT_PASS_BINS], &pLfe_dct[num_dct_pass_bins], num_dct_pass_bins ); + + for ( i = 0; i < num_groups; i++ ) + { + temp_lfe_dct[4 * i] = pLfe_dct[2 * i]; + lfe_abs_sum += fabsf( temp_lfe_dct[4 * i] ); + temp_lfe_dct[4 * i + 1] = pLfe_dct[2 * i + 1]; + lfe_abs_sum += fabsf( temp_lfe_dct[4 * i + 1] ); + + temp_lfe_dct[4 * i + 2] = pLfe_dct[2 * i + num_dct_pass_bins]; + lfe_abs_sum += fabsf( temp_lfe_dct[4 * i + 2] ); + temp_lfe_dct[4 * i + 3] = pLfe_dct[2 * i + num_dct_pass_bins + 1]; + lfe_abs_sum += fabsf( temp_lfe_dct[4 * i + 3] ); + } + + if ( lfe_abs_sum <= IVAS_LFE_ABS_SUM_FLT_THR ) + { + shift = max_shift; + } + else + { + shift = (int16_t) floor( IVAS_LFE_SHIFTS_PER_DOUBLE * log2_f( max_value / lfe_abs_sum ) ); + } + + shift = max( min_shift * IVAS_LFE_SHIFTS_PER_DOUBLE, min( max_shift, shift ) ); + + while ( 1 ) + { + if ( shift == max_shift ) + { + /* write all LFE bits as 0 */ + all_zeros_dct = 1; + break; + } + else + { + max_of_vals = 0; + for ( i = 0; i < num_lfe_ele; i++ ) + { + float temp; + temp = temp_lfe_dct[i] * powf( 2, ( (float) shift / IVAS_LFE_SHIFTS_PER_DOUBLE ) ); + + if ( temp < 0 ) + { + values[i] = (int16_t) ( temp - 0.5f ); + } + else + { + values[i] = (int16_t) ( temp + 0.5f ); + } + + if ( max_of_vals < abs( values[i] ) ) + { + max_of_vals = (int16_t) abs( values[i] ); + } + } + } + if ( max_of_vals <= max_value ) + { + break; + } + shift = shift - 1; + } + + if ( shift < min_shift * IVAS_LFE_SHIFTS_PER_DOUBLE ) + { + continue; + } + + if ( all_zeros_dct != 1 ) + { + push_next_indice( hBstr, all_zeros_dct, 1 ); + push_next_indice( hBstr, quant_strategy, 1 ); + push_next_indice( hBstr, shift - min_shift * IVAS_LFE_SHIFTS_PER_DOUBLE, shift_bits ); + } + else + { + push_next_indice( hBstr, all_zeros_dct, 1 ); + hLFE->lfe_bits = hBstr->nb_bits_tot - bits_written; + return; + } + + for ( i = 0; i < num_lfe_ele; i++ ) + { + if ( values[i] < 0 ) + { + write_bit = 1; + values[i] = values[i] + 1; + } + else + { + write_bit = 0; + } + + values[i] = (int16_t) abs( values[i] ); + + push_next_indice( hBstr, write_bit, 1 ); + } + + bits_written_arith_enc = hBstr->nb_bits_tot; + next_ind_pos_arith_enc = hBstr->nb_ind_tot; + push_next_indice( hBstr, coding_strategy, 1 ); + base2_num_bits_tot = hBstr->nb_bits_tot - bits_written; + + ivas_lfe_arith_coding( hLFE, hBstr, quant_strategy, values ); + + for ( i = 0; i < num_groups; i++ ) + { + int16_t base2_num_bits = hLFE->lfe_enc_indices_coeffs_tbl[quant_strategy][i]; + base2_num_bits_tot += ( num_ele_per_grp * base2_num_bits ); + } + + if ( ( base2_num_bits_tot ) < ( hBstr->nb_bits_tot - bits_written ) ) + { + if ( quant_strategy == ( num_quant_strategies - 1 ) || ( ( target_bits + IVAS_LFE_ID_BITS ) >= base2_num_bits_tot ) ) + { + /* reset bits buffer and code the indices with base 2 coding */ + for ( j = hBstr->nb_ind_tot - 1; j >= next_ind_pos_arith_enc; j-- ) + { + hBstr->ind_list[j].nb_bits = -1; + } + hBstr->nb_ind_tot = next_ind_pos_arith_enc; + hBstr->nb_bits_tot = bits_written_arith_enc; + coding_strategy = 1; + push_next_indice( hBstr, coding_strategy, 1 ); + + for ( i = 0; i < num_groups; i++ ) + { + int16_t base2_write_bits = hLFE->lfe_enc_indices_coeffs_tbl[quant_strategy][i]; + int16_t offset = 4 * i; + max_value = ivas_lfe_num_ele_in_coder_models[quant_strategy][i]; + + for ( j = 0; j < num_ele_per_grp; j++ ) + { + if ( values[j + offset] > max_value ) + { + values[j + offset] = max_value; + } + push_next_indice( hBstr, values[j + offset], base2_write_bits ); + } + } + break; + } + } + else + { + if ( ( target_bits + IVAS_LFE_ID_BITS ) >= ( hBstr->nb_bits_tot - bits_written ) ) + { + break; + } + else + { + if ( quant_strategy < ( num_quant_strategies - 1 ) ) + { + for ( j = hBstr->nb_ind_tot - 1; j >= nb_ind_tot; j-- ) + { + hBstr->ind_list[j].nb_bits = -1; + } + + hBstr->nb_bits_tot = bits_written; + hBstr->nb_ind_tot = nb_ind_tot; + } + } + } + } + + /* bits spent for LFE coding */ + hLFE->lfe_bits = hBstr->nb_bits_tot - bits_written; + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_lfe_enc() + * + * LFE channel encoder + *-----------------------------------------------------------------------------------------*/ + +void ivas_lfe_enc( + LFE_ENC_HANDLE hLFE, /* i/o: LFE encoder handle */ + float data_lfe_ch[], /* i : input LFE signal */ + const int16_t input_frame, /* i : input frame length per channel */ + BSTR_ENC_HANDLE hBstr /* i/o: bitstream handle */ +) +{ + float t_audio[L_FRAME48k]; + float wtda_audio[L_FRAME48k]; + float lfe_dct[IVAS_LFE_MAX_NUM_DCT_COEFFS]; + int16_t num_dct_pass_bins; + int16_t fade_len, full_len, dct_len, zero_pad_len; + const float *pWindow_coeffs; + + /* Initializations */ + num_dct_pass_bins = IVAS_LFE_MAX_NUM_DCT_PASS_BINS; + fade_len = hLFE->pWindow_state->fade_len; + full_len = hLFE->pWindow_state->full_len; + dct_len = hLFE->pWindow_state->dct_len; + zero_pad_len = hLFE->pWindow_state->zero_pad_len; + pWindow_coeffs = hLFE->pWindow_state->pWindow_coeffs; + + /* Windowing */ + ivas_dct_windowing( fade_len, full_len, dct_len, zero_pad_len, pWindow_coeffs, input_frame, wtda_audio, hLFE->old_wtda_audio, data_lfe_ch ); + + ivas_mdct( wtda_audio, t_audio, dct_len ); + + mvr2r( t_audio, lfe_dct, num_dct_pass_bins ); + + /* windowing */ + ivas_dct_windowing( fade_len, full_len, dct_len, zero_pad_len, pWindow_coeffs, input_frame, wtda_audio, hLFE->old_wtda_audio, data_lfe_ch + dct_len ); + + /* mdct */ + ivas_mdct( wtda_audio, t_audio, dct_len ); + + mvr2r( t_audio, lfe_dct + num_dct_pass_bins, num_dct_pass_bins ); + + ivas_lfe_enc_quant( hLFE, lfe_dct, hBstr ); + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_create_lfe_enc() + * + * Create, allocate and initialize IVAS encoder LFE handle + *-------------------------------------------------------------------------*/ + +ivas_error ivas_create_lfe_enc( + LFE_ENC_HANDLE *hLFE_out, /* o : IVAS LFE encoder structure */ + const int32_t input_Fs /* i : input sampling rate */ +) +{ + int16_t input_frame; + LFE_ENC_HANDLE hLFE; + int16_t i, j; + + input_frame = (int16_t) ( input_Fs / FRAMES_PER_SEC ); + + /*-----------------------------------------------------------------* + * Allocate LFE handle + *-----------------------------------------------------------------*/ + + if ( ( hLFE = (LFE_ENC_HANDLE) malloc( sizeof( LFE_ENC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LFE\n" ) ); + } + + /* initializations */ + hLFE->lfe_bits = 0; + + hLFE->pWindow_state = NULL; + hLFE->hBstr = NULL; + + /*-----------------------------------------------------------------* + * Input memory buffer: allocate and initialize + *-----------------------------------------------------------------*/ + + if ( ( hLFE->old_wtda_audio = (float *) malloc( sizeof( float ) * NS2SA( input_Fs, IVAS_LFE_FADE_NS ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LFE memory\n" ) ); + } + + set_zero( hLFE->old_wtda_audio, NS2SA( input_Fs, IVAS_LFE_FADE_NS ) ); + + /*-----------------------------------------------------------------* + * LFE Window: allocate and initialize + *-----------------------------------------------------------------*/ + + if ( ( hLFE->pWindow_state = (LFE_WINDOW_HANDLE) malloc( sizeof( LFE_WINDOW_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LFE window structure\n" ) ); + } + + ivas_lfe_window_init( hLFE->pWindow_state, input_Fs, input_frame ); + + /* Initialization for entropy coding */ + hLFE->cum_freq_models[0][0] = ivas_str_lfe_freq_models.entropy_coder_model_fine_sg1; + hLFE->cum_freq_models[0][1] = ivas_str_lfe_freq_models.entropy_coder_model_fine_sg2; + hLFE->cum_freq_models[0][2] = ivas_str_lfe_freq_models.entropy_coder_model_fine_sg3; + hLFE->cum_freq_models[0][3] = ivas_str_lfe_freq_models.entropy_coder_model_fine_sg4; + hLFE->cum_freq_models[1][0] = ivas_str_lfe_freq_models.entropy_coder_model_coarse_sg1; + hLFE->cum_freq_models[1][1] = ivas_str_lfe_freq_models.entropy_coder_model_coarse_sg2; + hLFE->cum_freq_models[1][2] = ivas_str_lfe_freq_models.entropy_coder_model_coarse_sg3; + hLFE->cum_freq_models[1][3] = &ivas_str_lfe_freq_models.entropy_coder_model_coarse_sg4; + + /* Initialization base2 bits for each subgroup for no entropy coding */ + for ( i = 0; i < IVAS_MAX_NUM_QUANT_STRATS; i++ ) + { + for ( j = 0; j < IVAS_MAX_NUM_DCT_COEF_GROUPS; j++ ) + { + hLFE->lfe_enc_indices_coeffs_tbl[i][j] = + (int16_t) ceilf( log2f( (float) ( ivas_lfe_num_ele_in_coder_models[i][j] + 1 ) ) ); + } + } + + *hLFE_out = hLFE; + + return IVAS_ERR_OK; +} + + +/*------------------------------------------------------------------------- + * ivas_lfe_enc_close() + * + * Destroy IVAS cncoder LFE handle + *-------------------------------------------------------------------------*/ + +void ivas_lfe_enc_close( + LFE_ENC_HANDLE *hLFE /* i/o: LFE encoder handle */ +) +{ + if ( hLFE == NULL || *hLFE == NULL ) + { + return; + } + + if ( ( *hLFE )->old_wtda_audio != NULL ) + { + free( ( *hLFE )->old_wtda_audio ); + ( *hLFE )->old_wtda_audio = NULL; + } + if ( ( *hLFE )->pWindow_state ) + { + free( ( *hLFE )->pWindow_state ); + ( *hLFE )->pWindow_state = NULL; + } + + free( ( *hLFE ) ); + ( *hLFE ) = NULL; + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_create_lfe_lpf_enc() + * + * Create, allocate and initialize IVAS encoder LFE low pass filter state handle + *-------------------------------------------------------------------------*/ + +ivas_error ivas_create_lfe_lpf_enc( + ivas_filters_process_state_t **hLfeLpf, /* o : LFE LPF handle */ + const int32_t input_Fs /* i : input sampling rate */ +) +{ + const float *filt_coeff; + + if ( hLfeLpf == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_UNEXPECTED_NULL_POINTER, "Can not allocate memory for LFE LPF\n" ) ); + } + + /*-----------------------------------------------------------------* + * Allocate LFE LPF handle + *-----------------------------------------------------------------*/ + + if ( ( *hLfeLpf = (ivas_filters_process_state_t *) malloc( sizeof( ivas_filters_process_state_t ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LFE LPF\n" ) ); + } + + ivas_lfe_lpf_select_filt_coeff( input_Fs, IVAS_FILTER_ORDER_4, &filt_coeff ); + + ivas_filters_init( *hLfeLpf, filt_coeff, IVAS_FILTER_ORDER_4 ); + + return IVAS_ERR_OK; +} + + +/*------------------------------------------------------------------------- + * ivas_lfe_lpf_enc_close() + * + * Destroy IVAS cncoder LFE low pass filter state + *-------------------------------------------------------------------------*/ + +void ivas_lfe_lpf_enc_close( + ivas_filters_process_state_t **hLfeLpf /* i/o: LFE LPF handle */ +) +{ + if ( hLfeLpf == NULL || *hLfeLpf == NULL ) + { + return; + } + + free( ( *hLfeLpf ) ); + ( *hLfeLpf ) = NULL; + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_lfe_lpf_enc_apply() + * + * Apply IVAS cncoder LFE low pass filter + *-------------------------------------------------------------------------*/ + +void ivas_lfe_lpf_enc_apply( + ivas_filters_process_state_t *hLfeLpf, /* i/o: LFE LPF handle */ + float data_lfe_ch[], /* i/o: LFE signal */ + const int16_t input_frame /* i : input frame length per channel */ +) +{ + ivas_filter_process( hLfeLpf, data_lfe_ch, input_frame ); + + return; +} diff --git a/lib_enc/ivas_masa_enc.c b/lib_enc/ivas_masa_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..84e835b2fcc06ac6d3cc1dd31d081cfbcec916bc --- /dev/null +++ b/lib_enc/ivas_masa_enc.c @@ -0,0 +1,3669 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include "options.h" +#include "ivas_cnst.h" +#include "ivas_prot.h" +#include "ivas_rom_com.h" +#include "ivas_stat_enc.h" +#include "wmc_auto.h" +#include "prot.h" + + +/*-----------------------------------------------------------------------* + * Local function prototypes + *-----------------------------------------------------------------------*/ + +static void combine_freqbands_and_subframes( MASA_ENCODER_HANDLE hMasa ); + +static void find_n_largest( const float *input, int16_t *largestIndices, const int16_t numElements, const int16_t numLargest ); + +static void move_metadata_to_qmetadata( const MASA_ENCODER_HANDLE hMasa, IVAS_QMETADATA_HANDLE hQMeta ); + +static void detect_metadata_composition( const MASA_ENCODER_HANDLE hMasa, uint8_t *joinedSubframes, uint8_t *coherencePresent, uint8_t *isTwoDir ); + +static void compensate_energy_ratios( MASA_ENCODER_HANDLE hMasa ); + +static int16_t encode_lfe_to_total_energy_ratio( MASA_ENCODER_HANDLE hMasa, BSTR_ENC_HANDLE hMetaData, const int32_t ivas_total_brate ); + +static void ivas_encode_masaism_metadata( MASA_ENCODER_HANDLE hMasa, IVAS_QMETADATA_HANDLE hQMetaData, BSTR_ENC_HANDLE hMetaData, ISM_METADATA_HANDLE hIsmMeta[], const int16_t nchan_ism, const int16_t low_bitrate_mode, const int16_t omasa_nbands, const int16_t omasa_nblocks, const int16_t idx_separated_object, const int16_t ism_imp ); + +static void reduce_metadata_further( MASA_ENCODER_HANDLE hMasa, IVAS_QMETADATA_HANDLE hqmetadata, const IVAS_FORMAT ivas_format ); + +static void average_masa_metadata( MASA_METADATA_FRAME *masaMetadata, float energy[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], const SPHERICAL_GRID_DATA *sphGrid, const uint8_t useSphGrid ); + +static void copy_masa_metadata_subframe( const MASA_METADATA_HANDLE hMetaFrom, const uint8_t sfFrom, MASA_METADATA_HANDLE hMetaTo, const uint8_t sfTo ); + +static void copy_masa_metadata( const MASA_METADATA_HANDLE hMetaFrom, MASA_METADATA_HANDLE hMetaTo ); + +static uint8_t are_masa_subframes_similar( const MASA_METADATA_HANDLE frame1, const uint8_t sf1_idx, const MASA_METADATA_HANDLE frame2, const uint8_t sf2_idx ); + +static void detect_framing_async( MASA_ENCODER_HANDLE hMasa ); + +static void masa_metadata_direction_alignment( MASA_ENCODER_HANDLE hMasa ); + + +/*-----------------------------------------------------------------------* + * Local constants + *-----------------------------------------------------------------------*/ + +#define LOWBITRATE_ONSET_ALPHA 0.2f /* Onset values are for processing in frames */ +#define LOWBITRATE_ONSET_BETA 0.92f +#define LOWBITRATE_ONSET_GAIN 1.4f +#define LOWBITRATE_NUM_BANDS 5 + + +/*-----------------------------------------------------------------------* + * ivas_masa_enc_open() + * + * open and initialize MASA encoder + *-----------------------------------------------------------------------*/ + +ivas_error ivas_masa_enc_open( + Encoder_Struct *st_ivas /* i/o: IVAS encoder handle */ +) +{ + int16_t i; + MASA_ENCODER_HANDLE hMasa; + ENCODER_CONFIG_HANDLE hEncoderConfig; + ivas_error error; + int32_t ism_total_brate; + + error = IVAS_ERR_OK; + + if ( ( hMasa = (MASA_ENCODER_HANDLE) malloc( sizeof( MASA_ENCODER ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA encoder\n" ) ); + } + + hEncoderConfig = st_ivas->hEncoderConfig; + + generate_gridEq( &( hMasa->data.Sph_Grid16 ) ); + + if ( hEncoderConfig->ivas_format == MASA_FORMAT || hEncoderConfig->ivas_format == MASA_ISM_FORMAT ) + { + hMasa->data.num_Cldfb_instances = st_ivas->nchan_transport; + } + else + { + hMasa->data.num_Cldfb_instances = 0; + } + + for ( i = 0; i < hMasa->data.num_Cldfb_instances; i++ ) + { + if ( ( error = openCldfb( &( hMasa->data.cldfbAnaEnc[i] ), CLDFB_ANALYSIS, hEncoderConfig->input_Fs, CLDFB_PROTOTYPE_5_00MS ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + ism_total_brate = 0; + if ( hEncoderConfig->ivas_format == MASA_ISM_FORMAT && st_ivas->nSCE > 0 && ( st_ivas->ism_mode == ISM_MASA_MODE_DISC || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) ) + { + for ( i = 0; i < st_ivas->nSCE; i++ ) + { + ism_total_brate += st_ivas->hSCE[i]->element_brate; + } + } + + ivas_masa_set_elements( st_ivas->hEncoderConfig->ivas_total_brate, st_ivas->mc_mode, st_ivas->nchan_transport, st_ivas->hQMetaData, &hEncoderConfig->element_mode_init, &st_ivas->nSCE, &st_ivas->nCPE, hEncoderConfig->ivas_format, st_ivas->ism_mode, ism_total_brate ); + + mvs2s( DirAC_block_grouping, hMasa->config.block_grouping, MAX_PARAM_SPATIAL_SUBFRAMES + 1 ); + mvs2s( MASA_band_grouping_24, hMasa->config.band_grouping, MASA_FREQUENCY_BANDS + 1 ); + + + hMasa->data.onset_detector_1 = 0.0f; + hMasa->data.onset_detector_2 = 0.0f; + + set_zero( hMasa->data.lfeToTotalEnergyRatio, MAX_PARAM_SPATIAL_SUBFRAMES ); + hMasa->data.prevq_lfeToTotalEnergyRatio = 0.0f; + hMasa->data.prevq_lfeIndex = 0; + + hMasa->data.sync_state.prev_sim_stop = 0; + hMasa->data.sync_state.prev_offset = 0; + hMasa->data.sync_state.frame_mode = MASA_FRAME_4SF; + + set_zero( hMasa->data.dir_align_state.previous_azi_dir1, MASA_FREQUENCY_BANDS ); + set_zero( hMasa->data.dir_align_state.previous_ele_dir1, MASA_FREQUENCY_BANDS ); + set_zero( hMasa->data.dir_align_state.previous_azi_dir2, MASA_FREQUENCY_BANDS ); + set_zero( hMasa->data.dir_align_state.previous_ele_dir2, MASA_FREQUENCY_BANDS ); + + if ( hEncoderConfig->ivas_format == MASA_ISM_FORMAT ) + { + OMASA_ENCODER_DATA_HANDLE hOmasaData; + + if ( ( hOmasaData = (OMASA_ENCODER_DATA_HANDLE) malloc( sizeof( OMASA_ENCODER_DATA_STATE ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for OMASA data encoder\n" ) ); + } + for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + { + set_f( hOmasaData->masa_to_total_energy_ratio[i], 0, MASA_FREQUENCY_BANDS ); + } + hOmasaData->lp_noise_CPE = -1; + hOmasaData->omasa_stereo_sw_cnt = OMASA_STEREO_SW_CNT_MAX; + + hMasa->data.hOmasaData = hOmasaData; + } + else + { + hMasa->data.hOmasaData = NULL; + } + + st_ivas->hMasa = hMasa; + + return error; +} + + +/*-----------------------------------------------------------------------* + * ivas_masa_enc_close() + * + * close MASA encoder + *-----------------------------------------------------------------------*/ + +void ivas_masa_enc_close( + MASA_ENCODER_HANDLE *hMasa /* i/o: MASA metadata structure */ +) +{ + int16_t i; + + if ( hMasa == NULL || *hMasa == NULL ) + { + return; + } + + for ( i = 0; i < ( *hMasa )->data.num_Cldfb_instances; i++ ) + { + deleteCldfb( &( ( *hMasa )->data.cldfbAnaEnc[i] ) ); + } + + if ( ( *hMasa )->data.hOmasaData != NULL ) + { + free( ( *hMasa )->data.hOmasaData ); + ( *hMasa )->data.hOmasaData = NULL; + } + + free( ( *hMasa ) ); + ( *hMasa ) = NULL; + + return; +} + + +/*-----------------------------------------------------------------------* + * ivas_masa_encode() + * + * main MASA encoder function + *-----------------------------------------------------------------------*/ + +ivas_error ivas_masa_encode( + MASA_ENCODER_HANDLE hMasa, /* i/o: MASA encoder structure */ + IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ + BSTR_ENC_HANDLE hMetaData, /* i/o: Metadata bitstream handle */ + int16_t *nb_bits_metadata, /* o : number of metadata bits written */ + const int16_t nchan_transport, /* i : number of MASA input/transport channels */ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + const int16_t Opt_DTX_ON, /* i : DTX on flag */ + const int16_t element_mode, /* i : element mode */ + const ISM_MODE ism_mode, /* i : ISM format mode */ + const int16_t nchan_ism, /* i : number of ISM channels */ + ISM_METADATA_HANDLE hIsmMetaData[MAX_NUM_OBJECTS], /* i : ISM metadata handle */ + const int16_t idx_separated_object, /* i : index of the separated object */ + OMASA_ENC_HANDLE hOMasa, /* i : OMASA encoder handle */ + const int16_t ism_imp, /* i : importance of separated object */ + const int16_t flag_omasa_ener_brate /* i : less bitrate for objects in OMASA flag */ +) +{ + MASA_DIRECTIONAL_SPATIAL_META *h_orig_metadata; + int16_t i, j; + int16_t masa_sid_descriptor; + int16_t low_bitrate_mode; + int32_t masa_total_brate; + ivas_error error; + + masa_sid_descriptor = -1; + h_orig_metadata = NULL; + low_bitrate_mode = 0; + + if ( ivas_format == MASA_FORMAT || ivas_format == MASA_ISM_FORMAT ) + { + /* Create the MASA SID descriptor for the metadata and CPE mode, in order to have the SID frame self-contained. */ + if ( Opt_DTX_ON && hQMetaData != NULL ) + { + if ( nchan_transport == 2 ) /* this is MASA format in CPE only */ + { + masa_sid_descriptor = 0; /* for IVAS_CPE_DFT */ + if ( element_mode == IVAS_CPE_MDCT ) + { + masa_sid_descriptor = 1; + } + } + } + + /* Validate and compensate ratios as necessary */ + compensate_energy_ratios( hMasa ); + + if ( Opt_DTX_ON ) + { + if ( ( h_orig_metadata = (MASA_DIRECTIONAL_SPATIAL_META *) malloc( MASA_MAXIMUM_DIRECTIONS * sizeof( MASA_DIRECTIONAL_SPATIAL_META ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA encoder\n" ) ); + } + + for ( i = 0; i < MASA_MAXIMUM_DIRECTIONS; i++ ) + { + for ( j = 0; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++ ) + { + mvr2r( hMasa->masaMetadata.directional_meta[i].azimuth[j], h_orig_metadata[i].azimuth[j], MASA_FREQUENCY_BANDS ); + mvr2r( hMasa->masaMetadata.directional_meta[i].elevation[j], h_orig_metadata[i].elevation[j], MASA_FREQUENCY_BANDS ); + mvr2r( hMasa->masaMetadata.directional_meta[i].energy_ratio[j], h_orig_metadata[i].energy_ratio[j], MASA_FREQUENCY_BANDS ); + mvs2s( (int16_t *) ( hMasa->masaMetadata.directional_meta[i].spherical_index[j] ), (int16_t *) ( h_orig_metadata[i].spherical_index[j] ), MASA_FREQUENCY_BANDS ); + } + } + } + + if ( ( ivas_format == MASA_FORMAT || ivas_format == MASA_ISM_FORMAT ) && ivas_total_brate >= IVAS_384k ) + { + hMasa->config.mergeRatiosOverSubframes = 0; + } + + /* Combine frequency bands and sub-frames */ + combine_freqbands_and_subframes( hMasa ); + } + + if ( hMasa->config.numberOfDirections == 2 && hMasa->config.numTwoDirBands < hMasa->config.numCodingBands && ( ivas_format == MASA_FORMAT || ivas_format == MASA_ISM_FORMAT ) ) + { + if ( ( ivas_format == MASA_ISM_FORMAT && ism_mode != ISM_MODE_NONE && ism_mode != ISM_MASA_MODE_MASA_ONE_OBJ ) || ( ivas_format != MASA_ISM_FORMAT ) ) + { + /* Combine directions */ + ivas_masa_combine_directions( hMasa ); + } + + /* If we joined all bands, then metadata is now one directional. */ + if ( hMasa->config.numTwoDirBands == 0 ) + { + hMasa->config.numberOfDirections = 1; + hMasa->masaMetadata.descriptive_meta.numberOfDirections = 0; + hQMetaData->no_directions = 1; + } + } + + /* Reset qmetadata bit budget */ + hQMetaData->metadata_max_bits = hMasa->config.max_metadata_bits; + if ( ivas_format == MASA_FORMAT || ivas_format == MASA_ISM_FORMAT ) + { + if ( ivas_format == MASA_ISM_FORMAT && ism_mode != ISM_MODE_NONE ) + { + /* write the number of objects in ISM_MASA format*/ + push_next_indice( hMetaData, nchan_ism - 1, NO_BITS_MASA_ISM_NO_OBJ ); + hQMetaData->metadata_max_bits -= NO_BITS_MASA_ISM_NO_OBJ; + + /* write index of separated object if needed */ + if ( ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ && nchan_ism > 1 ) + { + push_next_indice( hMetaData, idx_separated_object, NO_BITS_MASA_ISM_NO_OBJ ); + hQMetaData->metadata_max_bits -= NO_BITS_MASA_ISM_NO_OBJ; + } + + /* write ISM importance flag (one per object) */ + if ( ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) + { + push_next_indice( hMetaData, hIsmMetaData[0]->ism_imp, ISM_METADATA_FLAG_BITS ); + hQMetaData->metadata_max_bits -= ISM_METADATA_FLAG_BITS; + } + else if ( ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) + { + if ( hIsmMetaData[0]->ism_md_null_flag ) + { + /* signal NULL metadata frame */ + push_next_indice( hMetaData, 1, ISM_METADATA_MD_FLAG_BITS ); + hQMetaData->metadata_max_bits -= ISM_METADATA_MD_FLAG_BITS; + + /* write the ISM class to ISM_NO_META and again the true ISM class */ + push_next_indice( hMetaData, ISM_NO_META, ISM_METADATA_FLAG_BITS ); + hQMetaData->metadata_max_bits -= ISM_METADATA_FLAG_BITS; + push_next_indice( hMetaData, hIsmMetaData[0]->ism_imp, ISM_METADATA_FLAG_BITS ); + hQMetaData->metadata_max_bits -= ISM_METADATA_FLAG_BITS; + } + else + { + push_next_indice( hMetaData, hIsmMetaData[0]->ism_imp, ISM_METADATA_FLAG_BITS ); + hQMetaData->metadata_max_bits -= ISM_METADATA_FLAG_BITS; + + if ( hIsmMetaData[0]->ism_imp == ISM_NO_META ) + { + /* signal low-rate ISM_NO_META frame */ + push_next_indice( hMetaData, 0, ISM_METADATA_MD_FLAG_BITS ); + hQMetaData->metadata_max_bits -= ISM_METADATA_MD_FLAG_BITS; + + /* signal presence of MD in low-rate ISM_NO_META frame */ + push_next_indice( hMetaData, hIsmMetaData[0]->ism_md_lowrate_flag, ISM_METADATA_INACTIVE_FLAG_BITS ); + hQMetaData->metadata_max_bits -= ISM_METADATA_INACTIVE_FLAG_BITS; + } + } + } + else if ( ism_mode == ISM_MASA_MODE_DISC ) + { + for ( i = 0; i < nchan_ism; i++ ) + { + if ( hIsmMetaData[i]->ism_md_null_flag ) + { + /* signal NULL metadata frame */ + push_next_indice( hMetaData, 1, ISM_METADATA_MD_FLAG_BITS ); + hQMetaData->metadata_max_bits -= ISM_METADATA_MD_FLAG_BITS; + + /* write the ISM class to ISM_NO_META and again the true ISM class */ + push_next_indice( hMetaData, ISM_NO_META, ISM_METADATA_FLAG_BITS ); + hQMetaData->metadata_max_bits -= ISM_METADATA_FLAG_BITS; + push_next_indice( hMetaData, hIsmMetaData[i]->ism_imp, ISM_METADATA_FLAG_BITS ); + hQMetaData->metadata_max_bits -= ISM_METADATA_FLAG_BITS; + } + else + { + push_next_indice( hMetaData, hIsmMetaData[i]->ism_imp, ISM_METADATA_FLAG_BITS ); + hQMetaData->metadata_max_bits -= ISM_METADATA_FLAG_BITS; + + if ( hIsmMetaData[i]->ism_imp == ISM_NO_META ) + { + /* signal low-rate ISM_NO_META frame */ + push_next_indice( hMetaData, 0, ISM_METADATA_MD_FLAG_BITS ); + hQMetaData->metadata_max_bits -= ISM_METADATA_MD_FLAG_BITS; + + /* signal presence of MD in low-rate ISM_NO_META frame */ + push_next_indice( hMetaData, hIsmMetaData[i]->ism_md_lowrate_flag, ISM_METADATA_INACTIVE_FLAG_BITS ); + hQMetaData->metadata_max_bits -= ISM_METADATA_INACTIVE_FLAG_BITS; + } + } + } + + if ( ivas_total_brate == IVAS_128k && nchan_ism >= 3 ) + { + push_next_indice( hMetaData, flag_omasa_ener_brate, 1 ); + hQMetaData->metadata_max_bits -= 1; + } + } + } + else + { + /* write the number of MASA transport channels */ + push_next_indice( hMetaData, nchan_transport - 1, MASA_TRANSP_BITS ); + hQMetaData->metadata_max_bits -= MASA_TRANSP_BITS; + } + + if ( ivas_format == MASA_ISM_FORMAT && ism_mode == ISM_MODE_NONE ) + { + /* signal MASA_ISM_FORMAT to decoder */ + push_next_indice( hMetaData, 1, 1 ); + /* write reserved bit */ + push_next_indice( hMetaData, 0, MASA_HEADER_BITS - 1 ); + hQMetaData->metadata_max_bits -= MASA_HEADER_BITS; + } + else + { + /* the MASA_ISM_FORMAT is not signalled here */ + /* write reserved bits */ + push_next_indice( hMetaData, 0, MASA_HEADER_BITS ); + hQMetaData->metadata_max_bits -= MASA_HEADER_BITS; + } + /* write number of directions */ + push_next_indice( hMetaData, hQMetaData->no_directions - 1, 1 ); + hQMetaData->metadata_max_bits -= 1; + + /* write subframe mode */ + push_next_indice( hMetaData, hQMetaData->q_direction[0].cfg.nblocks == 1 ? 1 : 0, MASA_SUBFRAME_BITS ); + hQMetaData->metadata_max_bits -= MASA_SUBFRAME_BITS; + } + + if ( ivas_format == MC_FORMAT ) + { + int16_t lfeBitsWritten; + lfeBitsWritten = encode_lfe_to_total_energy_ratio( hMasa, hMetaData, ivas_total_brate ); + hQMetaData->metadata_max_bits -= lfeBitsWritten; + } + + /* Move data from encoder to qmetadata */ + if ( ivas_format == MASA_FORMAT || ivas_format == MASA_ISM_FORMAT ) + { + move_metadata_to_qmetadata( hMasa, hQMetaData ); + } + + if ( hMasa->config.max_metadata_bits < MINIMUM_BIT_BUDGET_NORMAL_META && !hMasa->config.joinedSubframes ) + { + reduce_metadata_further( hMasa, hQMetaData, ivas_format ); + + low_bitrate_mode = ( ivas_total_brate <= 32000 ); + + /* Write low bitrate mode. 1 signals that we have merged through time, 0 signals merge through frequency. */ + push_next_indice( hMetaData, hQMetaData->q_direction[0].cfg.nblocks == 1 ? 1 : 0, MASA_LOWBITRATE_MODE_BITS ); + hQMetaData->metadata_max_bits -= MASA_LOWBITRATE_MODE_BITS; + } + + /* Encode MASA+ISM metadata */ + if ( ivas_format == MASA_ISM_FORMAT && ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) + { + /* encode MASA/ISM energy ratios */ + ivas_encode_masaism_metadata( hMasa, hQMetaData, hMetaData, hIsmMetaData, nchan_ism, low_bitrate_mode, hOMasa->nCodingBands, hOMasa->nSubframes, idx_separated_object, ism_imp ); + } + else + { + if ( ivas_format == MASA_ISM_FORMAT ) + { + hMasa->data.hOmasaData->masa_to_total_energy_ratio[0][0] = -1; /* signals NOT to adjust the energy ratios */ + } + } + + /* Encode metadata */ + masa_total_brate = ivas_total_brate; + if ( ivas_format == MASA_ISM_FORMAT && ism_mode == ISM_MASA_MODE_DISC ) + { + masa_total_brate = calculate_cpe_brate_MASA_ISM( ism_mode, ivas_total_brate, nchan_ism ); + } + + if ( masa_total_brate >= IVAS_384k ) + { + if ( masa_total_brate >= IVAS_512k ) + { + if ( ( error = ivas_qmetadata_enc_encode_hr_384_512( hMetaData, hQMetaData, 16, 4 ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + if ( ( error = ivas_qmetadata_enc_encode_hr_384_512( hMetaData, hQMetaData, 11, 3 ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + else + { + if ( ( error = ivas_qmetadata_enc_encode( hMetaData, hQMetaData, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( ivas_format == MASA_ISM_FORMAT && ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) + { + /* Modify spatial metadata based on the MASA-to-total energy ratios */ + ivas_omasa_modify_masa_energy_ratios( hQMetaData, hMasa->data.hOmasaData->masa_to_total_energy_ratio ); + } + + *nb_bits_metadata = hMetaData->nb_bits_tot; + + if ( ivas_format == MASA_FORMAT && Opt_DTX_ON ) + { + /* save old values */ + uint8_t numCodingBands = hMasa->config.numCodingBands; + uint8_t numTwoDirBands = hMasa->config.numTwoDirBands; + int16_t nbands = hQMetaData->q_direction[0].cfg.nbands; + uint8_t numberOfDirections = hMasa->config.numberOfDirections; + uint8_t numberOfDirectionsMeta = hMasa->masaMetadata.descriptive_meta.numberOfDirections; + uint16_t numberOfDirectionsQMetaData = hQMetaData->no_directions; + + if ( !( hMasa->config.numberOfDirections == 1 && hQMetaData->q_direction->cfg.nbands == 5 ) ) + { + for ( i = 0; i < MASA_MAXIMUM_DIRECTIONS; i++ ) + { + for ( j = 0; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++ ) + { + mvr2r( h_orig_metadata[i].azimuth[j], hMasa->masaMetadata.directional_meta[i].azimuth[j], MASA_FREQUENCY_BANDS ); + mvr2r( h_orig_metadata[i].elevation[j], hMasa->masaMetadata.directional_meta[i].elevation[j], MASA_FREQUENCY_BANDS ); + mvr2r( h_orig_metadata[i].energy_ratio[j], hMasa->masaMetadata.directional_meta[i].energy_ratio[j], MASA_FREQUENCY_BANDS ); + } + } + + /* Force to have 5 bands and 1 direction */ + hMasa->config.numCodingBands = 5; + hMasa->config.numTwoDirBands = 0; + combine_freqbands_and_subframes( hMasa ); + hQMetaData->q_direction[0].cfg.nbands = 5; + + if ( hMasa->config.numberOfDirections == 2 && hMasa->config.numTwoDirBands < hMasa->config.numCodingBands ) + { + /* Combine directions */ + ivas_masa_combine_directions( hMasa ); + + /* If we joined all bands, then metadata is now one directional. */ + if ( hMasa->config.numTwoDirBands == 0 ) + { + hMasa->config.numberOfDirections = 1; + hMasa->masaMetadata.descriptive_meta.numberOfDirections = 0; + hQMetaData->no_directions = 1; + } + } + + move_metadata_to_qmetadata( hMasa, hQMetaData ); + + for ( j = hQMetaData->q_direction[0].cfg.start_band; j < hQMetaData->q_direction[0].cfg.nbands; ++j ) + { + hQMetaData->q_direction[0].band_data[j].energy_ratio_index[0] = masa_sq( 1.0f - hQMetaData->q_direction[0].band_data[j].energy_ratio[0], diffuseness_thresholds, DIRAC_DIFFUSE_LEVELS ); + } + } + + free( h_orig_metadata ); + + ivas_qmetadata_enc_sid_encode( hMetaData, hQMetaData, masa_sid_descriptor, ivas_format ); + + /* restore old values */ + hMasa->config.numCodingBands = numCodingBands; + hMasa->config.numTwoDirBands = numTwoDirBands; + hQMetaData->q_direction[0].cfg.nbands = nbands; + hMasa->config.numberOfDirections = numberOfDirections; + hMasa->masaMetadata.descriptive_meta.numberOfDirections = numberOfDirectionsMeta; + hQMetaData->no_directions = numberOfDirectionsQMetaData; + } + + return IVAS_ERR_OK; +} + + +/*-----------------------------------------------------------------------* + * ivas_masa_estimate_energy() + * + * + *-----------------------------------------------------------------------*/ + +void ivas_masa_estimate_energy( + MASA_ENCODER_HANDLE hMasa, /* i/o: MASA encoder structure */ + float *data_f[], /* i : Input audio channels */ + const int16_t input_frame, /* i : frame length */ + const int16_t nchan_transport /* i : number of MASA input/transport channels */ +) +{ + float Input_RealBuffer[MASA_MAX_TRANSPORT_CHANNELS][CLDFB_NO_CHANNELS_MAX]; + float Input_ImagBuffer[MASA_MAX_TRANSPORT_CHANNELS][CLDFB_NO_CHANNELS_MAX]; + int16_t block_m_idx, band_m_idx; + int16_t mrange[2], brange[2]; + int16_t i, j, ts, l_ts, maxBin; + + maxBin = (int16_t) ( (float) CLDFB_NO_CHANNELS_MAX * (float) input_frame / L_FRAME48k + 0.5f ); + + l_ts = input_frame / CLDFB_NO_COL_MAX; + + for ( block_m_idx = 0; block_m_idx < MAX_PARAM_SPATIAL_SUBFRAMES; block_m_idx++ ) + { + mrange[0] = hMasa->config.block_grouping[block_m_idx]; + mrange[1] = hMasa->config.block_grouping[block_m_idx + 1]; + + set_zero( hMasa->data.energy[block_m_idx], MASA_FREQUENCY_BANDS ); + + for ( ts = mrange[0]; ts < mrange[1]; ts++ ) + { + for ( i = 0; i < nchan_transport; i++ ) + { + cldfbAnalysis_ts( &( data_f[i][l_ts * ts] ), Input_RealBuffer[i], Input_ImagBuffer[i], l_ts, hMasa->data.cldfbAnaEnc[i] ); + } + + for ( band_m_idx = 0; band_m_idx < MASA_FREQUENCY_BANDS; band_m_idx++ ) + { + brange[0] = hMasa->config.band_grouping[band_m_idx]; + brange[1] = hMasa->config.band_grouping[band_m_idx + 1]; + + for ( i = 0; i < nchan_transport; i++ ) + { + if ( brange[0] > maxBin ) + { + hMasa->data.energy[block_m_idx][band_m_idx] = 0; + continue; + } + else if ( brange[1] >= maxBin ) + { + brange[1] = maxBin; + } + + for ( j = brange[0]; j < brange[1]; j++ ) + { + hMasa->data.energy[block_m_idx][band_m_idx] += Input_RealBuffer[i][j] * Input_RealBuffer[i][j] + Input_ImagBuffer[i][j] * Input_ImagBuffer[i][j]; + } + } + } + } + } + + return; +} + + +/*-----------------------------------------------------------------------* + * ivas_masa_enc_config() + * + * Frame-by-frame configuration of MASA encoder + *-----------------------------------------------------------------------*/ + +ivas_error ivas_masa_enc_config( + Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ +) +{ + int16_t i; + MASA_ENCODER_HANDLE hMasa; + IVAS_QMETADATA_HANDLE hQMetaData; + IVAS_FORMAT ivas_format; + uint8_t joinedSubframes; + uint8_t coherencePresent; + uint8_t isActualTwoDir; /* Flag to tell that when there are two directions present in metadata, they both contain meaningful information. */ + int32_t ivas_total_brate; + uint8_t maxBand; + int16_t maxBin, sf; + ivas_error error; + int32_t ism_total_brate; + int32_t masa_total_brate; + + error = IVAS_ERR_OK; + + hMasa = st_ivas->hMasa; + hQMetaData = st_ivas->hQMetaData; + ivas_format = st_ivas->hEncoderConfig->ivas_format; + ivas_total_brate = st_ivas->hEncoderConfig->ivas_total_brate; + + ism_total_brate = 0; + if ( ivas_format == MASA_ISM_FORMAT && st_ivas->nSCE > 0 && ( st_ivas->ism_mode == ISM_MASA_MODE_DISC || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) ) + { + for ( i = 0; i < st_ivas->nSCE; i++ ) + { + ism_total_brate += st_ivas->hSCE[i]->element_brate; + } + } + + ivas_masa_set_elements( ivas_total_brate, st_ivas->mc_mode, st_ivas->nchan_transport, hQMetaData, &st_ivas->hEncoderConfig->element_mode_init, &st_ivas->nSCE, &st_ivas->nCPE, ivas_format, st_ivas->ism_mode, ism_total_brate ); + + hQMetaData->is_masa_ivas_format = 1; + + if ( ivas_format == MASA_FORMAT || ivas_format == MASA_ISM_FORMAT ) + { + masa_metadata_direction_alignment( hMasa ); + + detect_framing_async( hMasa ); /* detect the offset, set 1sf/4sf mode based on this. potentially also shift the metadata using a history buffer */ + + if ( hMasa->data.sync_state.frame_mode == MASA_FRAME_1SF && hMasa->data.sync_state.prev_offset != 0 ) + { + /* average over sub-frames */ + average_masa_metadata( &( hMasa->masaMetadata ), hMasa->data.energy, &( hMasa->data.Sph_Grid16 ), ivas_total_brate == IVAS_512k ? TRUE : FALSE ); + } + + /* Inspect metadata for parameter changes that affect coding. */ + detect_metadata_composition( hMasa, &joinedSubframes, &coherencePresent, &isActualTwoDir ); + hMasa->config.joinedSubframes = joinedSubframes; + hMasa->config.coherencePresent = coherencePresent; + hMasa->config.numberOfDirections = ( hMasa->masaMetadata.descriptive_meta.numberOfDirections + 1 ) == 2 && isActualTwoDir ? 2 : 1; + } + else if ( ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCMASA ) + { + /* For McMASA, these are set only once as this function is called only once. */ + hMasa->config.joinedSubframes = 0; + hMasa->config.numberOfDirections = 1; + } + + if ( ivas_format == MASA_ISM_FORMAT ) + { + ivas_masa_set_coding_config( &( hMasa->config ), hMasa->data.band_mapping, st_ivas->hCPE[0]->element_brate, st_ivas->nchan_transport, MC_MODE_NONE ); + } + else + { + ivas_masa_set_coding_config( &( hMasa->config ), hMasa->data.band_mapping, ivas_total_brate, st_ivas->nchan_transport, ( ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCMASA ) ); + } + + /* Setup importance weights for two-direction band selection. */ + if ( hMasa->config.numberOfDirections == 2 ) + { + set_f( hMasa->data.importanceWeight, 1.0f, hMasa->config.numCodingBands ); + + if ( hMasa->config.numCodingBands == 5 ) + { + hMasa->data.importanceWeight[4] = 0.7f; + } + else if ( hMasa->config.numCodingBands == 8 ) + { + hMasa->data.importanceWeight[7] = 0.7f; + } + else if ( hMasa->config.numCodingBands == 10 ) + { + hMasa->data.importanceWeight[8] = 0.7f; + hMasa->data.importanceWeight[9] = 0.1f; + } + else if ( hMasa->config.numCodingBands == 12 ) + { + hMasa->data.importanceWeight[10] = 0.7f; + hMasa->data.importanceWeight[11] = 0.1f; + } + else if ( hMasa->config.numCodingBands == 18 ) + { + hMasa->data.importanceWeight[14] = 0.8f; + hMasa->data.importanceWeight[15] = 0.5f; + hMasa->data.importanceWeight[16] = 0.2f; + hMasa->data.importanceWeight[17] = 0.0f; + } + else if ( hMasa->config.numCodingBands == 24 ) + { + hMasa->data.importanceWeight[20] = 0.8f; + hMasa->data.importanceWeight[21] = 0.5f; + hMasa->data.importanceWeight[22] = 0.2f; + hMasa->data.importanceWeight[23] = 0.0f; + } + + if ( hMasa->config.numTwoDirBands == hMasa->config.numCodingBands ) + { + set_c( (int8_t *) hMasa->data.twoDirBands, 1, hMasa->config.numCodingBands ); + } + } + else + { + set_c( (int8_t *) hMasa->data.twoDirBands, 0, hMasa->config.numCodingBands ); + } + + /* Set qmeta to correct values */ + if ( ( error = ivas_qmetadata_allocate_memory( hQMetaData, hMasa->config.numCodingBands, hMasa->config.numberOfDirections == 2 && hMasa->config.numTwoDirBands != 0 ? 2 : 1, hMasa->config.useCoherence ) ) != IVAS_ERR_OK ) + { + return error; + } + + for ( i = 0; i < hQMetaData->no_directions; i++ ) + { + hQMetaData->q_direction[i].cfg.nbands = hMasa->config.numCodingBands; + hQMetaData->q_direction[i].cfg.nblocks = hMasa->config.joinedSubframes == TRUE ? 1 : 4; + + if ( ivas_format == MC_FORMAT ) + { + hQMetaData->q_direction[i].cfg.mc_ls_setup = st_ivas->hEncoderConfig->mc_input_setup; + } + else + { + /* Just to be sure that this default value is maintained */ + hQMetaData->q_direction[i].cfg.mc_ls_setup = MC_LS_SETUP_INVALID; + } + } + + hQMetaData->all_coherence_zero = !hMasa->config.coherencePresent; + + ivas_set_qmetadata_maxbit_req( hQMetaData, ivas_format ); + + /* Find maximum band usable */ + maxBin = (int16_t) ( st_ivas->hEncoderConfig->input_Fs * INV_CLDFB_BANDWIDTH ); + maxBand = 0; + while ( maxBand <= MASA_FREQUENCY_BANDS && MASA_band_grouping_24[maxBand] <= maxBin ) + { + maxBand++; + } + maxBand--; + + st_ivas->hQMetaData->q_direction->cfg.inactiveBands = 0; + masa_total_brate = ivas_total_brate; + if ( ivas_format == MASA_ISM_FORMAT && st_ivas->ism_mode == ISM_MASA_MODE_DISC ) + { + masa_total_brate = calculate_cpe_brate_MASA_ISM( st_ivas->ism_mode, ivas_total_brate, st_ivas->hEncoderConfig->nchan_ism ); + } + if ( masa_total_brate >= IVAS_384k && ( ivas_format == MASA_FORMAT || ivas_format == MASA_ISM_FORMAT ) ) + { + int16_t continueLoop; + continueLoop = 1; + while ( maxBand > 5 && continueLoop ) + { + for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) + { + if ( hMasa->data.energy[sf][maxBand - 1] > 100000 ) + { + continueLoop = 0; + break; + } + } + if ( continueLoop ) + { + maxBand--; + } + } + + if ( maxBand < MASA_MAXIMUM_CODING_SUBBANDS ) + { + st_ivas->hQMetaData->q_direction->cfg.inactiveBands = MASA_MAXIMUM_CODING_SUBBANDS - maxBand; + } + else + { + st_ivas->hQMetaData->q_direction->cfg.inactiveBands = 0; + } + } + + masa_sample_rate_band_correction( &( hMasa->config ), hMasa->data.band_mapping, hQMetaData, maxBand, masa_total_brate >= IVAS_384k, NULL ); + + if ( hMasa->config.numTwoDirBands >= hMasa->config.numCodingBands ) + { + hMasa->config.numTwoDirBands = hMasa->config.numCodingBands; + set_c( (int8_t *) hMasa->data.twoDirBands, 1, hMasa->config.numCodingBands ); + } + + /* Transmit stereo signals using a mono downmix at lowest bitrates */ + if ( ( ivas_format == MASA_FORMAT || ivas_format == MASA_ISM_FORMAT ) && st_ivas->nCPE == 1 && st_ivas->hCPE[0]->hStereoDft != NULL && st_ivas->hCPE[0]->hStereoDft->hConfig != NULL ) + { + st_ivas->hCPE[0]->hStereoDft->hConfig->force_mono_transmission = ( ivas_total_brate - ism_total_brate < MASA_STEREO_MIN_BITRATE ) ? 1 : 0; + } + + if ( ivas_format == MASA_ISM_FORMAT && ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_DISC ) ) + { + if ( st_ivas->hCPE[0]->element_mode == IVAS_CPE_DFT || st_ivas->hMasa->data.hOmasaData->omasa_stereo_sw_cnt < OMASA_STEREO_SW_CNT_MAX ) + { + st_ivas->hMasa->data.hOmasaData->lp_noise_CPE = st_ivas->hCPE[0]->hCoreCoder[0]->lp_noise; + } + else + { + st_ivas->hMasa->data.hOmasaData->lp_noise_CPE = ( st_ivas->hCPE[0]->hCoreCoder[0]->lp_noise + st_ivas->hCPE[0]->hCoreCoder[1]->lp_noise ) / CPE_CHANNELS; + } + } + + return error; +} + + +/*-----------------------------------------------------------------------* + * ivas_masa_surrcoh_signicant() + * + * Determine if surrounding coherence is significant in this frame and should be encoded + *-----------------------------------------------------------------------*/ + +uint8_t ivas_masa_surrcoh_signicant( + float surroundingCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i : Surround coherence */ + float diffuse_to_total_ratio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i : Diffuse to total ratio */ + const int16_t nSubFrames, /* i : Number of sub frames */ + const int16_t nBands /* i : Number of frequency bands */ +) +{ + float significanceMeasure1, significanceMeasure2, significanceMeasure; + float surrCohToTotal, surrCohToTotalSum, surrCohToTotalTimesDiffSum, diffSum; + int16_t sf, band; + float surrCohSignificanceCoef = 0.4f; + float threshold = 0.1f; + + for ( sf = 0; sf < nSubFrames; sf++ ) + { + surrCohToTotalSum = 0.0f; + surrCohToTotalTimesDiffSum = 0.0f; + diffSum = 0.0f; + for ( band = 0; band < nBands; band++ ) + { + surrCohToTotal = diffuse_to_total_ratio[sf][band] * surroundingCoherence[sf][band]; + surrCohToTotalSum += surrCohToTotal; + surrCohToTotalTimesDiffSum += diffuse_to_total_ratio[sf][band] * surrCohToTotal; + diffSum += diffuse_to_total_ratio[sf][band]; + } + significanceMeasure1 = surrCohToTotalSum / (float) nBands; + significanceMeasure2 = surrCohSignificanceCoef * surrCohToTotalTimesDiffSum / ( diffSum + EPSILON ); + significanceMeasure = max( significanceMeasure1, significanceMeasure2 ); + + if ( significanceMeasure > threshold ) + { + return 1; /* Surrounding coherence was significant in at least one subframe */ + } + } + + return 0; /* Surrounding coherence was not significant in any subframe */ +} + + +/*-----------------------------------------------------------------------* + * Local functions + *-----------------------------------------------------------------------*/ + +static void combine_freqbands_and_subframes( + MASA_ENCODER_HANDLE hMasa ) +{ + int16_t i, j, k, m; + float aziRad, eleRad; + float x[MASA_MAXIMUM_DIRECTIONS][MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + float y[MASA_MAXIMUM_DIRECTIONS][MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + float z[MASA_MAXIMUM_DIRECTIONS][MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + float vecLen; + float xSum, ySum, zSum; + float energySum; + float spreadCohSum; + float surrCohSum; + float energyRatioSum; + float surrCohTemp; + float energyRatioTemp; + float energy[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + int16_t brange[2]; + uint8_t numCodingBands; + uint8_t numSf; + uint8_t numDirections; + MASA_METADATA_HANDLE hMeta; + uint8_t mergeRatiosOverSubframes; + uint8_t computeCoherence; + + numCodingBands = hMasa->config.numCodingBands; + numDirections = hMasa->config.numberOfDirections; + numSf = hMasa->config.joinedSubframes == TRUE ? 1 : MAX_PARAM_SPATIAL_SUBFRAMES; + hMeta = &( hMasa->masaMetadata ); + + mergeRatiosOverSubframes = hMasa->config.mergeRatiosOverSubframes; + computeCoherence = hMasa->config.useCoherence && hMasa->config.coherencePresent; + + /* If metadata subframes are joined then we need all energy to be in the first subframe for combining. + * This optimizes following computations a bit. + * Note: If energy is used elsewhere, then this can cause problems and local energy should be used. */ + if ( numSf == 1 ) + { + for ( j = 1; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++ ) + { + for ( k = 0; k < MASA_FREQUENCY_BANDS; k++ ) + { + hMasa->data.energy[0][k] += hMasa->data.energy[j][k]; + } + } + } + + if ( numCodingBands <= MAX_REDUCED_NBANDS ) + { + /* reduce metadata *frequency* resolution. time resolution is not touched */ + for ( i = 0; i < numDirections; i++ ) + { + for ( j = 0; j < numSf; j++ ) /* NB: for numSf==1, operates only on first sub-frame */ + { + for ( k = 0; k < MASA_FREQUENCY_BANDS; k++ ) + { + aziRad = hMeta->directional_meta[i].azimuth[j][k] / 180.0f * EVS_PI; + eleRad = hMeta->directional_meta[i].elevation[j][k] / 180.0f * EVS_PI; + vecLen = hMeta->directional_meta[i].energy_ratio[j][k] * hMasa->data.energy[j][k]; + + x[i][j][k] = cosf( aziRad ) * cosf( eleRad ) * vecLen; + y[i][j][k] = sinf( aziRad ) * cosf( eleRad ) * vecLen; + z[i][j][k] = sinf( eleRad ) * vecLen; + } + } + } + + for ( i = 0; i < numDirections; i++ ) + { + for ( j = 0; j < numSf; j++ ) + { + for ( k = 0; k < numCodingBands; k++ ) + { + brange[0] = hMasa->data.band_mapping[k]; + brange[1] = hMasa->data.band_mapping[k + 1]; + + xSum = 0.0f; + ySum = 0.0f; + zSum = 0.0f; + energySum = 0.0f; + spreadCohSum = 0.0f; + + for ( m = brange[0]; m < brange[1]; m++ ) + { + xSum += x[i][j][m]; + ySum += y[i][j][m]; + zSum += z[i][j][m]; + energySum += hMasa->data.energy[j][m]; + } + + aziRad = atan2f( ySum, xSum ); + eleRad = atan2f( zSum, sqrtf( xSum * xSum + ySum * ySum ) ); + + hMeta->directional_meta[i].azimuth[j][k] = aziRad / EVS_PI * 180.0f; + hMeta->directional_meta[i].elevation[j][k] = eleRad / EVS_PI * 180.0f; + + vecLen = sqrtf( xSum * xSum + ySum * ySum + zSum * zSum ); + hMeta->directional_meta[i].energy_ratio[j][k] = vecLen / ( energySum + EPSILON ); + + if ( computeCoherence ) + { + for ( m = brange[0]; m < brange[1]; m++ ) + { + spreadCohSum += hMeta->directional_meta[i].spread_coherence[j][m] * hMasa->data.energy[j][m]; + } + hMeta->directional_meta[i].spread_coherence[j][k] = spreadCohSum / ( energySum + EPSILON ); + + if ( i == 0 ) + { + surrCohSum = 0.0f; + for ( m = brange[0]; m < brange[1]; m++ ) + { + surrCohSum += hMeta->common_meta.surround_coherence[j][m] * hMasa->data.energy[j][m]; + } + hMeta->common_meta.surround_coherence[j][k] = surrCohSum / ( energySum + EPSILON ); + } + } + + if ( i == 0 ) + { + energy[j][k] = energySum; + } + } + } + } + } + else if ( mergeRatiosOverSubframes ) /* keep frequency resolution */ + { + for ( j = 0; j < numSf; j++ ) + { + for ( k = 0; k < numCodingBands; k++ ) + { + energy[j][k] = hMasa->data.energy[j][k]; + } + } + } + + if ( mergeRatiosOverSubframes ) + { + for ( k = 0; k < numCodingBands; k++ ) + { + energySum = 0.0f; + for ( j = 0; j < numSf; j++ ) + { + energySum += energy[j][k]; + } + + if ( computeCoherence ) + { + surrCohSum = 0.0f; + for ( j = 0; j < numSf; j++ ) + { + surrCohSum += energy[j][k] * hMeta->common_meta.surround_coherence[j][k]; + } + surrCohTemp = surrCohSum / ( energySum + EPSILON ); + + for ( j = 0; j < numSf; j++ ) + { + hMeta->common_meta.surround_coherence[j][k] = surrCohTemp; + } + } + + for ( i = 0; i < numDirections; i++ ) + { + energyRatioSum = 0.0f; + for ( j = 0; j < numSf; j++ ) + { + energyRatioSum += energy[j][k] * hMeta->directional_meta[i].energy_ratio[j][k]; + } + energyRatioTemp = energyRatioSum / ( energySum + EPSILON ); + + for ( j = 0; j < numSf; j++ ) + { + hMeta->directional_meta[i].energy_ratio[j][k] = energyRatioTemp; + } + } + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * ivas_masa_combine_directions() + * + * + *-------------------------------------------------------------------*/ + +void ivas_masa_combine_directions( + MASA_ENCODER_HANDLE hMasa ) +{ + int16_t i, j, k; + uint8_t numCodingBands; + uint8_t numSf; + uint8_t numDirections; + uint8_t computeCoherence; + MASA_METADATA_HANDLE hMeta; + + float aziRad; + float eleRad; + float x[MASA_MAXIMUM_DIRECTIONS][MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + float y[MASA_MAXIMUM_DIRECTIONS][MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + float z[MASA_MAXIMUM_DIRECTIONS][MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + float vecLen; + float xSum[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + float ySum[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + float zSum[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + float sumVecLen[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + float tempImportance; + float importance[MASA_FREQUENCY_BANDS]; + int16_t indicesOfLargest[MASA_FREQUENCY_BANDS]; + + float ambience1dir; + float ambience2dir; + float ambienceIncrease; + float ratioSum; + float origSurrCohEne; + float newSurrCohEne; + + numCodingBands = hMasa->config.numCodingBands; + numDirections = hMasa->config.numberOfDirections; + numSf = hMasa->config.joinedSubframes == TRUE ? 1 : MAX_PARAM_SPATIAL_SUBFRAMES; + + hMeta = &( hMasa->masaMetadata ); + + computeCoherence = hMasa->config.useCoherence && hMasa->config.coherencePresent; + + for ( i = 0; i < numDirections; i++ ) + { + for ( j = 0; j < numSf; j++ ) + { + for ( k = 0; k < numCodingBands; k++ ) + { + aziRad = hMeta->directional_meta[i].azimuth[j][k] / 180.0f * EVS_PI; + eleRad = hMeta->directional_meta[i].elevation[j][k] / 180.0f * EVS_PI; + vecLen = hMeta->directional_meta[i].energy_ratio[j][k]; + + x[i][j][k] = cosf( aziRad ) * cosf( eleRad ) * vecLen; + y[i][j][k] = sinf( aziRad ) * cosf( eleRad ) * vecLen; + z[i][j][k] = sinf( eleRad ) * vecLen; + } + } + } + + /* Compute sum vector */ + for ( j = 0; j < numSf; j++ ) + { + for ( k = 0; k < numCodingBands; k++ ) + { + xSum[j][k] = x[0][j][k] + x[1][j][k]; + ySum[j][k] = y[0][j][k] + y[1][j][k]; + zSum[j][k] = z[0][j][k] + z[1][j][k]; + sumVecLen[j][k] = sqrtf( xSum[j][k] * xSum[j][k] + ySum[j][k] * ySum[j][k] + zSum[j][k] * zSum[j][k] ); + } + } + + /* Estimate the importance of having two directions instead of one */ + for ( i = 0; i < numCodingBands; i++ ) + { + importance[i] = 0.0f; + for ( j = 0; j < numSf; j++ ) + { + tempImportance = hMeta->directional_meta[0].energy_ratio[j][i] + hMeta->directional_meta[1].energy_ratio[j][i] - sumVecLen[j][i]; + importance[i] += tempImportance; + } + importance[i] /= (float) numSf; + importance[i] *= hMasa->data.importanceWeight[i]; + } + + /* Determine bands where to use two directions */ + find_n_largest( importance, indicesOfLargest, numCodingBands, hMasa->config.numTwoDirBands ); + + for ( i = 0; i < numCodingBands; i++ ) + { + hMasa->data.twoDirBands[i] = 0; + } + + for ( i = 0; i < hMasa->config.numTwoDirBands; i++ ) + { + hMasa->data.twoDirBands[indicesOfLargest[i]] = 1; + } + + /* Combine directions on the remaining bands */ + for ( i = 0; i < numCodingBands; i++ ) + { + if ( hMasa->data.twoDirBands[i] == 0 ) + { + for ( j = 0; j < numSf; j++ ) + { + aziRad = atan2f( ySum[j][i], xSum[j][i] ); + eleRad = atan2f( zSum[j][i], sqrtf( xSum[j][i] * xSum[j][i] + ySum[j][i] * ySum[j][i] ) ); + + hMeta->directional_meta[0].azimuth[j][i] = aziRad / EVS_PI * 180.0f; + hMeta->directional_meta[0].elevation[j][i] = eleRad / EVS_PI * 180.0f; + + ratioSum = hMeta->directional_meta[0].energy_ratio[j][i] + hMeta->directional_meta[1].energy_ratio[j][i]; + if ( computeCoherence ) + { + hMeta->directional_meta[0].spread_coherence[j][i] = + ( hMeta->directional_meta[0].spread_coherence[j][i] * hMeta->directional_meta[0].energy_ratio[j][i] + hMeta->directional_meta[1].spread_coherence[j][i] * hMeta->directional_meta[1].energy_ratio[j][i] ) / ( ratioSum + EPSILON ); + } + + ambience2dir = 1.0f - ratioSum; + hMeta->directional_meta[0].energy_ratio[j][i] = sumVecLen[j][i] / ( hMeta->directional_meta[0].energy_ratio[j][i] + hMeta->directional_meta[1].energy_ratio[j][i] + ambience2dir / 2.0f ); + hMeta->directional_meta[1].energy_ratio[j][i] = 0.0f; + if ( computeCoherence ) + { + ambience1dir = 1.0f - hMeta->directional_meta[0].energy_ratio[j][i]; + ambienceIncrease = max( ambience1dir - ambience2dir, 0.0f ); + + origSurrCohEne = ambience2dir * hMeta->common_meta.surround_coherence[j][i]; + newSurrCohEne = ambienceIncrease * hMeta->directional_meta[0].spread_coherence[j][i]; + hMeta->common_meta.surround_coherence[j][i] = min( 1.0f, ( origSurrCohEne + newSurrCohEne ) / ( ambience1dir + EPSILON ) ); + } + } + } + } + + return; +} + + +static void find_n_largest( + const float *input, + int16_t *largestIndices, + const int16_t numElements, + const int16_t numLargest ) +{ + int16_t i, j; + float largestValue; + int16_t largestIndex; + float values[MASA_FREQUENCY_BANDS]; + + for ( j = 0; j < numElements; j++ ) + { + values[j] = input[j]; + } + + for ( i = 0; i < numLargest; i++ ) + { + largestValue = values[0]; + largestIndex = 0; + for ( j = 1; j < numElements; j++ ) + { + if ( values[j] > largestValue ) + { + largestValue = values[j]; + largestIndex = j; + } + } + largestIndices[i] = largestIndex; + values[largestIndex] = -1.0f; + } + + return; +} + + +static void move_metadata_to_qmetadata( + const MASA_ENCODER_HANDLE hMasa, + IVAS_QMETADATA_HANDLE hQMeta ) +{ + int16_t dir, sf, band; + uint8_t numCodingBands; + uint8_t numDirections; + uint8_t numSf; + MASA_METADATA_HANDLE hMeta; + + numCodingBands = hMasa->config.numCodingBands; + numDirections = hMasa->config.numberOfDirections; + numSf = hMasa->config.joinedSubframes == TRUE ? 1 : 4; + hMeta = &( hMasa->masaMetadata ); + + for ( dir = 0; dir < numDirections; dir++ ) + { + for ( sf = 0; sf < numSf; sf++ ) + { + for ( band = 0; band < numCodingBands; band++ ) + { + hQMeta->q_direction[dir].band_data[band].azimuth[sf] = hMeta->directional_meta[dir].azimuth[sf][band]; + hQMeta->q_direction[dir].band_data[band].elevation[sf] = hMeta->directional_meta[dir].elevation[sf][band]; + hQMeta->q_direction[dir].band_data[band].energy_ratio[sf] = hMeta->directional_meta[dir].energy_ratio[sf][band]; + hQMeta->q_direction[dir].band_data[band].spherical_index[sf] = hMeta->directional_meta[dir].spherical_index[sf][band]; + if ( hQMeta->q_direction[dir].coherence_band_data != NULL ) + { + hQMeta->q_direction[dir].coherence_band_data[band].spread_coherence[sf] = (uint8_t) roundf( hMeta->directional_meta[dir].spread_coherence[sf][band] * UINT8_MAX ); + } + } + } + } + + for ( sf = 0; sf < numSf; sf++ ) + { + for ( band = 0; band < numCodingBands; band++ ) + { + if ( hQMeta->surcoh_band_data != NULL ) + { + hQMeta->surcoh_band_data[band].surround_coherence[sf] = (uint8_t) roundf( hMeta->common_meta.surround_coherence[sf][band] * UINT8_MAX ); + } + } + } + + if ( numDirections > 1 ) + { + for ( band = 0; band < numCodingBands; band++ ) + { + hQMeta->twoDirBands[band] = hMasa->data.twoDirBands[band]; + } + hQMeta->numTwoDirBands = hMasa->config.numTwoDirBands; + } + + /* Copy spread coherence for DCT-based coding */ + if ( numSf == 1 && hMasa->config.useCoherence ) + { + for ( dir = 0; dir < numDirections; dir++ ) + { + for ( sf = 1; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) + { + for ( band = 0; band < numCodingBands; band++ ) + { + hQMeta->q_direction[dir].coherence_band_data[band].spread_coherence[sf] = hQMeta->q_direction[dir].coherence_band_data[band].spread_coherence[0]; + } + } + } + } + + return; +} + + +/* This function studies parametric MASA metadata to provide information for codec configuration */ +static void detect_metadata_composition( + const MASA_ENCODER_HANDLE hMasa, /* i : MASA encoder data */ + uint8_t *joinedSubframes, /* o : Result of subframe composition */ + uint8_t *coherencePresent, /* o : Result of coherence presence */ + uint8_t *isTwoDir /* o : Result of two direction check */ +) +{ + MASA_METADATA_FRAME *hMeta; + int8_t sf, band, dir, numDir; + int16_t nSubFrames; + uint8_t dirValid[2] = { FALSE, FALSE }; + uint8_t cohPresent = FALSE; + uint8_t sfDiffer = FALSE; + uint8_t sfSimilar; + + hMeta = &( hMasa->masaMetadata ); + numDir = hMeta->descriptive_meta.numberOfDirections + 1; + + *isTwoDir = FALSE; + + /* First check for valid two directions */ + if ( numDir == 1 ) + { + dirValid[0] = TRUE; + } + else + { + /* Default assumption */ + *isTwoDir = TRUE; + + /* Check for direct-to-total ratio values */ + for ( dir = 0; dir < numDir; dir++ ) + { + sf = 0; + while ( !dirValid[dir] && sf < MAX_PARAM_SPATIAL_SUBFRAMES ) + { + band = 0; + while ( !dirValid[dir] && band < MASA_FREQUENCY_BANDS ) + { + if ( hMeta->directional_meta[dir].energy_ratio[sf][band] >= MASA_RATIO_THRESHOLD ) + { + dirValid[dir] = TRUE; + } + band++; + } + sf++; + } + } + + if ( dirValid[1] == FALSE ) + { + /* This handles also case where both are false. Then we just use first dir metadata. */ + *isTwoDir = FALSE; + } + else if ( dirValid[0] == FALSE && dirValid[1] == TRUE ) + { + *isTwoDir = FALSE; + /* Copy data to first direction */ + for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) + { + for ( band = 0; band < MASA_FREQUENCY_BANDS; band++ ) + { + hMeta->directional_meta[0].azimuth[sf][band] = hMeta->directional_meta[1].azimuth[sf][band]; + hMeta->directional_meta[0].elevation[sf][band] = hMeta->directional_meta[1].elevation[sf][band]; + hMeta->directional_meta[0].energy_ratio[sf][band] = hMeta->directional_meta[1].energy_ratio[sf][band]; + hMeta->directional_meta[0].spread_coherence[sf][band] = hMeta->directional_meta[1].spread_coherence[sf][band]; + } + } + } + + if ( *isTwoDir == FALSE ) + { + /* Further checks will be done with just one direction */ + numDir = 1; + } + } + + /* Check if data over subframes is identical. Check is done by comparing to first subframe. */ + sfSimilar = TRUE; + sf = 1; + while ( ( sfSimilar == TRUE ) && ( sf < MAX_PARAM_SPATIAL_SUBFRAMES ) ) + { + sfSimilar = are_masa_subframes_similar( hMeta, 0, hMeta, sf ); + sf++; + } + sfDiffer = sfSimilar == TRUE ? FALSE : TRUE; + + /* Further checks can be done with just one subframe if they are identical */ + nSubFrames = sfDiffer == TRUE ? MAX_PARAM_SPATIAL_SUBFRAMES : 1; + + /* Check spread coherence */ + dir = 0; + while ( cohPresent == FALSE && dir < numDir ) + { + sf = 0; + while ( cohPresent == FALSE && sf < nSubFrames ) + { + band = 0; + while ( cohPresent == FALSE && band < MASA_FREQUENCY_BANDS ) + { + /* Check coherences for presence of coherence */ + if ( hMeta->directional_meta[dir].spread_coherence[sf][band] >= MASA_COHERENCE_THRESHOLD ) + { + cohPresent = TRUE; + } + band++; + } + sf++; + } + dir++; + } + + /* Check surround coherence separately if we do not have already knowledge of coherence */ + if ( cohPresent == FALSE ) + { + cohPresent = ivas_masa_surrcoh_signicant( hMeta->common_meta.surround_coherence, hMeta->common_meta.diffuse_to_total_ratio, nSubFrames, MASA_FREQUENCY_BANDS ); + } + + /* Set output flags */ + *joinedSubframes = sfDiffer == TRUE ? FALSE : TRUE; + *coherencePresent = cohPresent; + + return; +} + + +/* Check and compensate energy ratios. This function verifies that energy ratios follow the principle of summing to one. + * In addition, it implements simple remainder-to-total handling where remainder energy is proportionally added to other + * ratios. */ +static void compensate_energy_ratios( + MASA_ENCODER_HANDLE hMasa ) +{ + int16_t sf, band, dir; + float ratioSum; + MASA_METADATA_HANDLE hMeta; + uint8_t numDirs; + + hMeta = &( hMasa->masaMetadata ); + numDirs = hMeta->descriptive_meta.numberOfDirections + 1; + + for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) + { + for ( band = 0; band < MASA_FREQUENCY_BANDS; band++ ) + { + /* Remainder is always set to zero and energy removal is compensated in following steps + * to other ratios. */ + hMeta->common_meta.remainder_to_total_ratio[sf][band] = 0.0f; + + ratioSum = 0; + for ( dir = 0; dir < numDirs; dir++ ) + { + ratioSum += hMeta->directional_meta[dir].energy_ratio[sf][band]; + } + ratioSum += hMeta->common_meta.diffuse_to_total_ratio[sf][band]; + + if ( ratioSum == 0.0f ) + { + for ( dir = 0; dir < numDirs; dir++ ) + { + hMeta->directional_meta[dir].energy_ratio[sf][band] = 0.0f; + } + hMeta->common_meta.diffuse_to_total_ratio[sf][band] = 1.0f; + } + else if ( ratioSum != 1.0f ) + { + for ( dir = 0; dir < numDirs; dir++ ) + { + hMeta->directional_meta[dir].energy_ratio[sf][band] /= ratioSum; + } + hMeta->common_meta.diffuse_to_total_ratio[sf][band] /= ratioSum; + } + } + } + + return; +} + + +/* If the bit budget is very low, reduce metadata further to either 1 subframe and 5 bands, or 1 band and 4 subframes, based on which works better */ +static void reduce_metadata_further( + MASA_ENCODER_HANDLE hMasa, + IVAS_QMETADATA_HANDLE hqmetadata, + const IVAS_FORMAT ivas_format ) +{ + int16_t sf; + int16_t band; + int16_t selectedBand; + float energy[MAX_PARAM_SPATIAL_SUBFRAMES][LOWBITRATE_NUM_BANDS]; + float totalEnergySum; + uint8_t numCodingBands; + uint8_t computeCoherence; + float onset_filter; + float bandEnergy; + uint8_t mergeOverFreqBands; + float meanRatio; + + numCodingBands = hMasa->config.numCodingBands; + computeCoherence = hMasa->config.useCoherence && hMasa->config.coherencePresent; + + /* Set default values */ + selectedBand = 0; + mergeOverFreqBands = 0; + + /* Get energy for the input data in 4-subframe, 5-band format */ + totalEnergySum = 0.0f; + if ( ivas_format == MASA_FORMAT || ivas_format == MASA_ISM_FORMAT ) /* Energy data is in 4-subframe, 24-band format */ + { + for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) + { + int16_t brange[2]; + float eneSum; + int16_t m; + + for ( band = 0; band < numCodingBands; band++ ) + { + brange[0] = hMasa->data.band_mapping[band]; + brange[1] = hMasa->data.band_mapping[band + 1]; + + eneSum = 0.0f; + for ( m = brange[0]; m < brange[1]; m++ ) + { + eneSum += hMasa->data.energy[sf][m]; + } + energy[sf][band] = eneSum; + totalEnergySum += eneSum; + } + } + } + else /* Energy data is already in 4-subframe, 5-band format */ + { + for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) + { + for ( band = 0; band < numCodingBands; band++ ) + { + energy[sf][band] = hMasa->data.energy[sf][band]; + totalEnergySum += energy[sf][band]; + } + } + } + + /* Determine onsets */ + hMasa->data.onset_detector_1 = hMasa->data.onset_detector_1 * LOWBITRATE_ONSET_ALPHA; + hMasa->data.onset_detector_1 = max( hMasa->data.onset_detector_1, totalEnergySum ); + + hMasa->data.onset_detector_2 = LOWBITRATE_ONSET_BETA * hMasa->data.onset_detector_2 + ( 1.0f - LOWBITRATE_ONSET_BETA ) * hMasa->data.onset_detector_1; + hMasa->data.onset_detector_2 = LOWBITRATE_ONSET_GAIN * min( hMasa->data.onset_detector_1, hMasa->data.onset_detector_2 ); + + onset_filter = min( max( hMasa->data.onset_detector_2 / ( hMasa->data.onset_detector_1 + EPSILON ), 0.0f ), 1.0f ); + + /* If we have onset, continue checking if we should reduce in frequency instead of time. */ + if ( onset_filter < 0.99f ) + { + /* Determine one frequency band to use to represent all frequency bands */ + for ( band = numCodingBands - 1; band >= 0; band-- ) + { + float threshold; + float bandRatio; + + threshold = totalEnergySum / ( MAX_PARAM_SPATIAL_SUBFRAMES * LOWBITRATE_NUM_BANDS ) * 0.5f; /* Average energy multiplied with energy ratio of 0.5f */ + bandRatio = hqmetadata->q_direction[0].band_data[band].energy_ratio[0]; + + bandEnergy = 0.0f; + for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) + { + bandEnergy += energy[sf][band]; + } + + if ( bandEnergy / MAX_PARAM_SPATIAL_SUBFRAMES * bandRatio > threshold ) + { + selectedBand = band; + break; + } + } + + /* Determine if to merge over frequency instead of time */ + meanRatio = 0.0f; + for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) + { + for ( band = 0; band < numCodingBands; band++ ) + { + meanRatio += hqmetadata->q_direction[0].band_data[band].energy_ratio[sf] * energy[sf][band]; + } + } + meanRatio /= ( totalEnergySum + EPSILON ); + + /* If the ratio of the selected band is larger than the average ratio of all bands and if there is an onset, merge over frequency bands. + * Otherwise, merge over subframes. */ + if ( hqmetadata->q_direction[0].band_data[selectedBand].energy_ratio[0] > meanRatio ) + { + mergeOverFreqBands = 1; + } + else + { + mergeOverFreqBands = 0; + } + } + else + { + mergeOverFreqBands = 0; + } + + /* Merge values over subframes or frequency bands, depending on which one is less important */ + if ( !mergeOverFreqBands ) /* Merge values over subframes */ + { + float xSum, ySum, zSum; + float bandSumEnergy; + float aziRad, eleRad; + float x, y, z; + float veclen; + + for ( band = 0; band < numCodingBands; band++ ) + { + xSum = 0.0f; + ySum = 0.0f; + zSum = 0.0f; + bandSumEnergy = 0.0f; + + for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) + { + aziRad = hqmetadata->q_direction[0].band_data[band].azimuth[sf] / 180.0f * EVS_PI; + eleRad = hqmetadata->q_direction[0].band_data[band].elevation[sf] / 180.0f * EVS_PI; + veclen = hqmetadata->q_direction[0].band_data[band].energy_ratio[sf] * energy[sf][band]; + + x = cosf( aziRad ) * cosf( eleRad ) * veclen; + y = sinf( aziRad ) * cosf( eleRad ) * veclen; + z = sinf( eleRad ) * veclen; + + xSum += x; + ySum += y; + zSum += z; + + bandSumEnergy += energy[sf][band]; + } + + aziRad = atan2f( ySum, xSum ); + eleRad = atan2f( zSum, sqrtf( xSum * xSum + ySum * ySum ) ); + + hqmetadata->q_direction[0].band_data[band].azimuth[0] = aziRad / EVS_PI * 180.0f; + hqmetadata->q_direction[0].band_data[band].elevation[0] = eleRad / EVS_PI * 180.0f; + + /* Energy ratio is already merged through time */ + + if ( computeCoherence && hqmetadata->q_direction[0].coherence_band_data != NULL ) + { + float spreadCoh; + float spreadCohSum = 0.0f; + for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) + { + spreadCoh = (float) hqmetadata->q_direction[0].coherence_band_data[band].spread_coherence[sf] / 255.0f; + spreadCohSum += spreadCoh * energy[sf][band]; + } + hqmetadata->q_direction[0].coherence_band_data[band].spread_coherence[0] = (uint8_t) roundf( spreadCohSum / ( bandSumEnergy + EPSILON ) * 255.0f ); + + /* Copy spread coherence to the rest of subframes for the coherence coding algorithm. */ + for ( sf = 1; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) + { + for ( band = 0; band < numCodingBands; band++ ) + { + hqmetadata->q_direction[0].coherence_band_data[band].spread_coherence[sf] = hqmetadata->q_direction[0].coherence_band_data[band].spread_coherence[0]; + } + } + + /* Surround coherence is already merged through time */ + } + } + + hqmetadata->q_direction->cfg.nblocks = 1; + hMasa->config.joinedSubframes = 1; + } + else /* Merge values over frequency bands */ + { + /* Use the selected frequency band to represent all data */ + for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) + { + hqmetadata->q_direction[0].band_data[0].azimuth[sf] = hqmetadata->q_direction[0].band_data[selectedBand].azimuth[sf]; + hqmetadata->q_direction[0].band_data[0].elevation[sf] = hqmetadata->q_direction[0].band_data[selectedBand].elevation[sf]; + hqmetadata->q_direction[0].band_data[0].energy_ratio[sf] = hqmetadata->q_direction[0].band_data[selectedBand].energy_ratio[sf]; + if ( hqmetadata->q_direction[0].coherence_band_data != NULL ) + { + hqmetadata->q_direction[0].coherence_band_data[0].spread_coherence[sf] = hqmetadata->q_direction[0].coherence_band_data[selectedBand].spread_coherence[sf]; + } + if ( hqmetadata->surcoh_band_data != NULL ) + { + hqmetadata->surcoh_band_data[0].surround_coherence[sf] = hqmetadata->surcoh_band_data[selectedBand].surround_coherence[sf]; + } + } + + /* Copy coherence to rest of bands for the coherence coding algorithm. */ + for ( band = 1; band < numCodingBands; band++ ) + { + if ( hqmetadata->q_direction[0].coherence_band_data != NULL ) + { + for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) + { + hqmetadata->q_direction[0].coherence_band_data[band].spread_coherence[sf] = hqmetadata->q_direction[0].coherence_band_data[0].spread_coherence[sf]; + } + } + if ( hqmetadata->q_direction[0].coherence_band_data != NULL ) + { + for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) + { + hqmetadata->surcoh_band_data[band].surround_coherence[sf] = hqmetadata->surcoh_band_data[0].surround_coherence[sf]; + } + } + } + + hqmetadata->q_direction[0].cfg.nbands = 1; + } + + return; +} + + +static int16_t encode_lfe_to_total_energy_ratio( + MASA_ENCODER_HANDLE hMasa, /* i/o: MASA encoder structure */ + BSTR_ENC_HANDLE hMetaData, /* i/o: Metadata bitstream handle */ + const int32_t ivas_total_brate /* i : IVAS total bitrate */ +) +{ + int16_t i; + float xq; + int16_t VQLevels; + float maxLFESubFrameEner; + float log2LFEaverage; + float log2LFEratio[4]; + float xqv[4]; + float linearLFEaverage; + int16_t lfeToTotalEnergyRatioIndices[3]; + int16_t lfeAdaptiveVQBits; + int16_t lfeBitsWritten; + + VQLevels = 0; + lfeAdaptiveVQBits = 0; + + /* Determine maximum amount of LFE energy in any subframe */ + maxLFESubFrameEner = 0.0f; + for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + { + if ( hMasa->data.lfeToTotalEnergyRatio[i] > maxLFESubFrameEner ) + { + maxLFESubFrameEner = hMasa->data.lfeToTotalEnergyRatio[i]; + } + } + + /* Set default values for the indices */ + for ( i = 0; i < 3; i++ ) + { + lfeToTotalEnergyRatioIndices[i] = 0; + } + + /* Check if there is enough energy in any subframe. If not, send only 1 bit (0) and abort. */ + /* If there is enough LFE energy at least in one subframe, quantize it. */ + if ( maxLFESubFrameEner > 0.005f ) + { + /* Convert energy to log2 domain, and clamp it to reasonable values */ + log2LFEaverage = 0.0f; + for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + { + log2LFEratio[i] = log2f( max( 0.001f, hMasa->data.lfeToTotalEnergyRatio[i] ) ); + if ( log2LFEratio[i] > 1.0f ) /* Corresponds to linear value 2.0f */ + { + log2LFEratio[i] = 1.0f; + } + else if ( log2LFEratio[i] < -9.0f ) + { + log2LFEratio[i] = -9.0f; + } + log2LFEaverage += 0.25f * log2LFEratio[i]; + } + + if ( ivas_total_brate == IVAS_13k2 ) + { + /* Calculate adaptive 1-bit LFE quantizer index */ + linearLFEaverage = exp2f( log2LFEaverage ); /* Convert back to linear domain */ + if ( ( linearLFEaverage > MCMASA_LFE_1BIT_THRES ) && ( linearLFEaverage > ( 0.5f * ( MCMASA_LFE_BETA + hMasa->data.prevq_lfeToTotalEnergyRatio ) + 0.5f * ( MCMASA_LFE_ALPHA * hMasa->data.prevq_lfeToTotalEnergyRatio ) ) ) ) + { + lfeToTotalEnergyRatioIndices[0] = 1; + if ( hMasa->data.prevq_lfeIndex == 1 ) + { + hMasa->data.prevq_lfeToTotalEnergyRatio = hMasa->data.prevq_lfeToTotalEnergyRatio + MCMASA_LFE_THETA * MCMASA_LFE_BETA; /* larger "bump-up" to LFE-to-total energy ratio */ + } + else + { + hMasa->data.prevq_lfeToTotalEnergyRatio = hMasa->data.prevq_lfeToTotalEnergyRatio + MCMASA_LFE_BETA; /* default "bump-up" to LFE-to-total energy ratio */ + } + } + else + { + hMasa->data.prevq_lfeToTotalEnergyRatio = MCMASA_LFE_ALPHA * hMasa->data.prevq_lfeToTotalEnergyRatio; /* exponential decay */ + } + + if ( hMasa->data.prevq_lfeToTotalEnergyRatio > 1.0f ) + { + hMasa->data.prevq_lfeToTotalEnergyRatio = 1.0f; + } + hMasa->data.prevq_lfeIndex = lfeToTotalEnergyRatioIndices[0]; /* Update to previous frame's index memories */ + } + else /* Bitrate >= 16.4 kbps */ + { + /* Do 1st stage scalar quantization */ + lfeToTotalEnergyRatioIndices[0] = 1; + lfeToTotalEnergyRatioIndices[1] = usquant( log2LFEaverage, &xq, MCMASA_LFE_QLOW, MCMASA_LFE_DELTA, 8 ); + + if ( ivas_total_brate >= IVAS_24k4 ) /* Vector quantization is applied if bitrate >= 24.4 kbps */ + { + /* Remove scalar value from the vector*/ + for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + { + log2LFEratio[i] -= xq; + } + + /* Vector quantize residual with energy adaptive bit allocation */ + switch ( lfeToTotalEnergyRatioIndices[1] ) + { + case 0: + case 1: + VQLevels = 0; + lfeAdaptiveVQBits = 0; + break; + case 2: + VQLevels = 2; + lfeAdaptiveVQBits = 1; + break; + case 3: + VQLevels = 4; + lfeAdaptiveVQBits = 2; + break; + case 4: + VQLevels = 8; + lfeAdaptiveVQBits = 3; + break; + default: + VQLevels = 16; + lfeAdaptiveVQBits = 4; + } + + if ( VQLevels > 0 ) + { + lfeToTotalEnergyRatioIndices[2] = vquant( log2LFEratio, 0, xqv, McMASA_LFEGain_vectors, 4, VQLevels ); + } + } + } + } + + /* Write first LFE bit */ + lfeBitsWritten = 0; + push_next_indice( hMetaData, lfeToTotalEnergyRatioIndices[0], 1 ); + lfeBitsWritten += 1; + + if ( lfeToTotalEnergyRatioIndices[0] == 1 && ivas_total_brate >= IVAS_16k4 ) + { + /* If bitrate >= 16.4kbit/s, send 1-bit on/off + 3-bit scalar */ + push_next_indice( hMetaData, lfeToTotalEnergyRatioIndices[1], 3 ); + lfeBitsWritten += 3; + + /* If bitrate >= 24.4kbit/s, use adaptive 1 + (3.. 7) bit quantizer */ + if ( ivas_total_brate >= IVAS_24k4 ) + { + /* Vector quantize residual with energy adaptive bit allocation */ + if ( lfeAdaptiveVQBits > 0 ) + { + push_next_indice( hMetaData, lfeToTotalEnergyRatioIndices[2], lfeAdaptiveVQBits ); + lfeBitsWritten += lfeAdaptiveVQBits; + } + } + } + + return lfeBitsWritten; +} + + +/*-------------------------------------------------------------------* + * ivas_masa_enc_reconfigure() + * + * Reconfigure IVAS MASA encoder + *-------------------------------------------------------------------*/ + +void ivas_masa_enc_reconfigure( + Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ +) +{ + int16_t n, tmp; + int16_t sce_id, cpe_id; + int32_t ivas_total_brate; + int32_t ism_total_brate; + + ivas_total_brate = st_ivas->hEncoderConfig->ivas_total_brate; + + ism_total_brate = 0; + if ( st_ivas->hEncoderConfig->ivas_format == MASA_ISM_FORMAT && st_ivas->nSCE > 0 && ( st_ivas->ism_mode == ISM_MASA_MODE_DISC || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) ) + { + for ( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) + { + ism_total_brate += st_ivas->hSCE[sce_id]->element_brate; + } + } + + if ( ivas_total_brate != st_ivas->hEncoderConfig->last_ivas_total_brate ) + { + for ( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) + { + copy_encoder_config( st_ivas, st_ivas->hSCE[sce_id]->hCoreCoder[0], 0 ); + st_ivas->hSCE[sce_id]->element_brate = ivas_total_brate / st_ivas->nchan_transport; + st_ivas->hSCE[sce_id]->hCoreCoder[0]->total_brate = st_ivas->hSCE[sce_id]->element_brate; /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */ + } + + for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) + { + st_ivas->hCPE[cpe_id]->element_brate = ( ivas_total_brate / st_ivas->nchan_transport ) * CPE_CHANNELS; + + /* prepare bitstream buffers */ + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + copy_encoder_config( st_ivas, st_ivas->hCPE[cpe_id]->hCoreCoder[n], 0 ); + st_ivas->hCPE[cpe_id]->hCoreCoder[n]->total_brate = st_ivas->hCPE[cpe_id]->element_brate / ( st_ivas->nCPE > 1 ? 1 : CPE_CHANNELS ); /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */ + } + + if ( ivas_total_brate - ism_total_brate < MASA_STEREO_MIN_BITRATE || ivas_total_brate - ism_total_brate < MIN_BRATE_MDCT_STEREO ) + { + st_ivas->hCPE[cpe_id]->element_mode = IVAS_CPE_DFT; + } + else + { + st_ivas->hCPE[cpe_id]->element_mode = IVAS_CPE_MDCT; + } + } + + ivas_masa_set_elements( ivas_total_brate, st_ivas->mc_mode, st_ivas->nchan_transport, st_ivas->hQMetaData, &tmp, &tmp, &tmp, st_ivas->hEncoderConfig->ivas_format, st_ivas->ism_mode, ism_total_brate ); + } + + return; +} + + +/*-------------------------------------------------------------------* + * average_masa_metadata() + * + * Average MASA metadata frame subframe contents: applies aggregation over time + *-------------------------------------------------------------------*/ + +static void average_masa_metadata( + MASA_METADATA_FRAME *hMeta, + float energy[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], + const SPHERICAL_GRID_DATA *Sph_Grid16, + const uint8_t useSphGrid ) +{ + int16_t i, j, k; + float azi_rad, ele_rad; + uint8_t numDirections; + + /* use the nominal values without data-adaptivity */ + numDirections = hMeta->descriptive_meta.numberOfDirections + 1; + + /* azi/ele/nrg into vectors for each sub-frame and band */ + for ( i = 0; i < numDirections; i++ ) + { + for ( k = 0; k < MASA_FREQUENCY_BANDS; k++ ) + { + float x_sum, y_sum, z_sum, energy_sum, vec_len, spread_coh_sum, surr_coh_sum; + + x_sum = 0.0f; + y_sum = 0.0f; + z_sum = 0.0f; + energy_sum = 0.0f; + spread_coh_sum = 0.0f; + surr_coh_sum = 0.0f; + for ( j = 0; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++ ) + { + azi_rad = hMeta->directional_meta[i].azimuth[j][k] / 180.0f * EVS_PI; + ele_rad = hMeta->directional_meta[i].elevation[j][k] / 180.0f * EVS_PI; + vec_len = hMeta->directional_meta[i].energy_ratio[j][k] * energy[j][k]; + + /* energy-weighted sum over subframes */ + x_sum += cosf( azi_rad ) * cosf( ele_rad ) * vec_len; + y_sum += sinf( azi_rad ) * cosf( ele_rad ) * vec_len; + z_sum += sinf( ele_rad ) * vec_len; + + energy_sum += energy[j][k]; + + spread_coh_sum += hMeta->directional_meta[i].spread_coherence[j][k] * energy[j][k]; + if ( i == 0 ) + { + /* this is in common metadata and not in each direction */ + surr_coh_sum += hMeta->common_meta.surround_coherence[j][k] * energy[j][k]; + } + } + + /* the data from the combined sub-frames is written into the first sub-frame band */ + j = 0; + hMeta->directional_meta[i].azimuth[j][k] = atan2f( y_sum, x_sum ) / EVS_PI * 180.0f; + hMeta->directional_meta[i].elevation[j][k] = atan2f( z_sum, sqrtf( x_sum * x_sum + y_sum * y_sum ) ) / EVS_PI * 180.0f; + if ( useSphGrid == TRUE ) + { + hMeta->directional_meta[i].spherical_index[j][k] = index_theta_phi_16( &( hMeta->directional_meta[i].elevation[j][k] ), + &( hMeta->directional_meta[i].azimuth[j][k] ), Sph_Grid16 ); + } + vec_len = sqrtf( x_sum * x_sum + y_sum * y_sum + z_sum * z_sum ); + hMeta->directional_meta[i].energy_ratio[j][k] = vec_len / ( energy_sum + EPSILON ); + + hMeta->directional_meta[i].spread_coherence[j][k] = spread_coh_sum / ( energy_sum + EPSILON ); + if ( i == 0 ) + { + hMeta->common_meta.surround_coherence[j][k] = surr_coh_sum / ( energy_sum + EPSILON ); + } + + /* copy the same value to all subframes */ + for ( j = 1; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++ ) + { + hMeta->directional_meta[i].azimuth[j][k] = hMeta->directional_meta[i].azimuth[0][k]; + hMeta->directional_meta[i].elevation[j][k] = hMeta->directional_meta[i].elevation[0][k]; + hMeta->directional_meta[i].energy_ratio[j][k] = hMeta->directional_meta[i].energy_ratio[0][k]; + hMeta->directional_meta[i].spread_coherence[j][k] = hMeta->directional_meta[i].spread_coherence[0][k]; + if ( i == 0 ) + { + hMeta->common_meta.surround_coherence[j][k] = hMeta->common_meta.surround_coherence[0][k]; + } + } + } + } + + for ( k = 0; k < MASA_FREQUENCY_BANDS; k++ ) + { + for ( j = 0; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++ ) + { + if ( numDirections == 2 ) + { + hMeta->common_meta.diffuse_to_total_ratio[j][k] = max( 0.0f, 1.0f - hMeta->directional_meta[1].energy_ratio[j][k] - hMeta->directional_meta[0].energy_ratio[j][k] ); + } + else + { + hMeta->common_meta.diffuse_to_total_ratio[j][k] = max( 0.0f, 1.0f - hMeta->directional_meta[0].energy_ratio[j][k] ); + } + hMeta->common_meta.remainder_to_total_ratio[j][k] = 0.0f; + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * copy_masa_metadata_subframe() + * + * Copy MASA metadata frame subframe contents + *-------------------------------------------------------------------*/ + +static void copy_masa_metadata_subframe( + const MASA_METADATA_HANDLE hMetaFrom, /* i : MASA frame metdata to be copied */ + const uint8_t sfFrom, /* i : subframe index of the copy source */ + MASA_METADATA_HANDLE hMetaTo, /* o : MASA frame metadata copy destination */ + const uint8_t sfTo /* i : subframe index of the copy target */ +) +{ + uint8_t dir; + + /* directional metadata */ + for ( dir = 0; dir < MASA_MAXIMUM_DIRECTIONS; dir++ ) + { + mvr2r( hMetaFrom->directional_meta[dir].azimuth[sfFrom], hMetaTo->directional_meta[dir].azimuth[sfTo], MASA_FREQUENCY_BANDS ); + mvr2r( hMetaFrom->directional_meta[dir].elevation[sfFrom], hMetaTo->directional_meta[dir].elevation[sfTo], MASA_FREQUENCY_BANDS ); + mvr2r( hMetaFrom->directional_meta[dir].energy_ratio[sfFrom], hMetaTo->directional_meta[dir].energy_ratio[sfTo], MASA_FREQUENCY_BANDS ); + mvr2r( hMetaFrom->directional_meta[dir].spread_coherence[sfFrom], hMetaTo->directional_meta[dir].spread_coherence[sfTo], MASA_FREQUENCY_BANDS ); + } + + /* common metadata */ + mvr2r( hMetaFrom->common_meta.diffuse_to_total_ratio[sfFrom], hMetaTo->common_meta.diffuse_to_total_ratio[sfTo], MASA_FREQUENCY_BANDS ); + mvr2r( hMetaFrom->common_meta.surround_coherence[sfFrom], hMetaTo->common_meta.surround_coherence[sfTo], MASA_FREQUENCY_BANDS ); + mvr2r( hMetaFrom->common_meta.remainder_to_total_ratio[sfFrom], hMetaTo->common_meta.remainder_to_total_ratio[sfTo], MASA_FREQUENCY_BANDS ); + + return; +} + + +/*-------------------------------------------------------------------* + * copy_masa_metadata() + * + * Copy MASA metada frame contents + *-------------------------------------------------------------------*/ + +static void copy_masa_metadata( + const MASA_METADATA_HANDLE hMetaFrom, /* i : MASA frame metadata to be copied */ + MASA_METADATA_HANDLE hMetaTo /* o : MASA frame metadata copy destination */ +) +{ + uint8_t sf, byte_idx; + + /* descriptive metadata */ + for ( byte_idx = 0; byte_idx < 8; byte_idx++ ) + { + hMetaTo->descriptive_meta.formatDescriptor[byte_idx] = hMetaFrom->descriptive_meta.formatDescriptor[byte_idx]; + } + + hMetaTo->descriptive_meta.numberOfDirections = hMetaFrom->descriptive_meta.numberOfDirections; + hMetaTo->descriptive_meta.numberOfChannels = hMetaFrom->descriptive_meta.numberOfChannels; + hMetaTo->descriptive_meta.sourceFormat = hMetaFrom->descriptive_meta.sourceFormat; + hMetaTo->descriptive_meta.transportDefinition = hMetaFrom->descriptive_meta.transportDefinition; + hMetaTo->descriptive_meta.channelAngle = hMetaFrom->descriptive_meta.channelAngle; + hMetaTo->descriptive_meta.channelDistance = hMetaFrom->descriptive_meta.channelDistance; + hMetaTo->descriptive_meta.channelLayout = hMetaFrom->descriptive_meta.channelLayout; + + /* directional and common metadata */ + for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) + { + copy_masa_metadata_subframe( hMetaFrom, sf, hMetaTo, sf ); + } + + return; +} + + +/*-------------------------------------------------------------------* + * are_masa_subframes_similar() + * + * Compare the similarity of MASA metadata in two sub-frames + *-------------------------------------------------------------------*/ + +/* r: similarity decision */ +static uint8_t are_masa_subframes_similar( + const MASA_METADATA_HANDLE frame1, /* i : MASA metadata frame 1 */ + const uint8_t sf1_idx, /* i : index of the subframe of frame1 to inspect */ + const MASA_METADATA_HANDLE frame2, /* i : MASA metadata frame 2 */ + const uint8_t sf2_idx /* i : index of the subframe of frame2 to inspect */ +) +{ + uint8_t num_dir; + uint8_t dir; + uint8_t band_idx; + uint8_t sf_differ; + + num_dir = frame1->descriptive_meta.numberOfDirections; + dir = 0; + band_idx = 0; + sf_differ = FALSE; + + if ( num_dir != frame2->descriptive_meta.numberOfDirections ) + { + sf_differ = TRUE; + } + else + { + /* check per-direction metadata */ + dir = 0; + band_idx = 0; + + while ( ( sf_differ == FALSE ) && ( dir <= num_dir ) ) + { + band_idx = 0; + while ( ( sf_differ == FALSE ) && ( band_idx < MASA_FREQUENCY_BANDS ) ) + { + float azi_dif; + azi_dif = fabsf( frame1->directional_meta[dir].azimuth[sf1_idx][band_idx] - frame2->directional_meta[dir].azimuth[sf2_idx][band_idx] ); + azi_dif = azi_dif > 180.0f ? 360.0f - azi_dif : azi_dif; + + if ( azi_dif > MASA_ANGLE_TOLERANCE ) + { + sf_differ = TRUE; + break; + } + + if ( fabsf( frame1->directional_meta[dir].elevation[sf1_idx][band_idx] - frame2->directional_meta[dir].elevation[sf2_idx][band_idx] ) > MASA_ANGLE_TOLERANCE ) + { + sf_differ = TRUE; + break; + } + + if ( fabsf( frame1->directional_meta[dir].energy_ratio[sf1_idx][band_idx] - frame2->directional_meta[dir].energy_ratio[sf2_idx][band_idx] ) > MASA_RATIO_TOLERANCE ) + { + sf_differ = TRUE; + break; + } + + if ( fabsf( frame1->directional_meta[dir].spread_coherence[sf1_idx][band_idx] - frame2->directional_meta[dir].spread_coherence[sf2_idx][band_idx] ) > MASA_COHERENCE_TOLERANCE ) + { + sf_differ = TRUE; + break; + } + + band_idx++; + } + dir++; + } + + /* check the common metadata */ + while ( ( sf_differ == FALSE ) && ( band_idx < MASA_FREQUENCY_BANDS ) ) + { + if ( fabsf( frame1->common_meta.surround_coherence[sf1_idx][band_idx] - frame2->common_meta.surround_coherence[sf2_idx][band_idx] ) > MASA_COHERENCE_TOLERANCE ) + { + sf_differ = TRUE; + break; + } + + band_idx++; + } + } + + if ( sf_differ ) + { + return FALSE; + } + else + { + return TRUE; + } +} + + +/*-------------------------------------------------------------------* + * detect_framing_async() + * + * Compare the similarity of MASA metadata in two sub-frames + * Analysis result is stored in hMasa->data.sync_state, and + * potentially hMasa->masaMetadata is modified + *-------------------------------------------------------------------*/ + +static void detect_framing_async( + MASA_ENCODER_HANDLE hMasa /* i/o: MASA encoder structure */ +) +{ + MASA_METADATA_HANDLE current_meta; + MASA_METADATA_HANDLE previous_meta; + MASA_SYNC_HANDLE sync_state; + MASA_FRAME_MODE frame_mode; + uint8_t n_sim_start, n_sim_stop, sf_idx; + uint8_t found_offset; + + current_meta = &( hMasa->masaMetadata ); /* metadata from current frame */ + sync_state = &( hMasa->data.sync_state ); /* synchronization structure */ + previous_meta = &( sync_state->previous_metadata ); + + /* check current frame, how many are similar from the start and from the end */ + n_sim_start = 1; + for ( sf_idx = n_sim_start; sf_idx < MAX_PARAM_SPATIAL_SUBFRAMES; sf_idx++ ) + { + if ( are_masa_subframes_similar( current_meta, 0, current_meta, sf_idx ) == TRUE ) + { + n_sim_start = sf_idx + 1; + } + else + { + break; + } + } + + /* number of similar sub-frames starting from the end of the frame */ + if ( n_sim_start == MAX_PARAM_SPATIAL_SUBFRAMES ) /* shortcut */ + { + n_sim_stop = n_sim_start; + } + else + { + n_sim_stop = 1; + for ( sf_idx = 2; sf_idx < MAX_PARAM_SPATIAL_SUBFRAMES; sf_idx++ ) + { + /* we need to check only the two middle sub-frames, as all being the same would have taken the shortcut above */ + if ( are_masa_subframes_similar( current_meta, MAX_PARAM_SPATIAL_SUBFRAMES - 1, current_meta, MAX_PARAM_SPATIAL_SUBFRAMES - sf_idx ) == TRUE ) + { + n_sim_stop = sf_idx; + } + else + { + break; + } + } + } + + frame_mode = MASA_FRAME_4SF; /* default mode: 4sf */ + if ( sync_state->prev_offset > MAX_PARAM_SPATIAL_SUBFRAMES - 2 ) + { + /* earlier offset was large => reset the offset */ + found_offset = 0; + } + else + { + /* keep previous offset unless something else is found. alternatively, we could reset always */ + found_offset = sync_state->prev_offset; + } + + if ( ( n_sim_start == MAX_PARAM_SPATIAL_SUBFRAMES ) && ( n_sim_stop == MAX_PARAM_SPATIAL_SUBFRAMES ) ) + { + /* full frame consists of similar sub-frames */ + frame_mode = MASA_FRAME_1SF; + if ( ( sync_state->prev_sim_stop != 0 ) && ( are_masa_subframes_similar( current_meta, 0, previous_meta, MAX_PARAM_SPATIAL_SUBFRAMES - 1 ) == TRUE ) ) + { + /* > 4 sub-frames of similar data */ + if ( sync_state->prev_sim_stop < 3 ) + { + /* can nicely align the framing with the earlier data and a small offset */ + found_offset = sync_state->prev_sim_stop; + } + else + { + /* too many similar sub-frames to determine the offset accurately => keep earlier value */ + found_offset = sync_state->prev_offset; + } + } + else + { + /* earlier window was different => reset the offset */ + found_offset = 0; + } + } + else if ( n_sim_stop == 3 ) + { + /* first sub-frame different that the rest 3 + => make a risky guess that the future sf would be the same too and we're in an offset case */ + frame_mode = MASA_FRAME_1SF; + found_offset = 3; + } + else if ( ( sync_state->prev_sim_stop > 0 ) && ( are_masa_subframes_similar( current_meta, 0, previous_meta, MAX_PARAM_SPATIAL_SUBFRAMES - 1 ) == TRUE ) ) + { + /* seeing data similar to past */ + if ( ( n_sim_start > 1 ) && ( n_sim_start + sync_state->prev_sim_stop >= MAX_PARAM_SPATIAL_SUBFRAMES ) ) + { + /* with the past, would have at least one long frame similar subframes */ + frame_mode = MASA_FRAME_1SF; + + if ( sync_state->prev_offset == 0 ) + { + found_offset = min( 2, sync_state->prev_sim_stop ); + } + else + { + found_offset = sync_state->prev_offset; + } + } + } + + /* keep the original contents of the frame, but then perform interpolation later */ + /* just copy current frame to storage */ + copy_masa_metadata( current_meta, previous_meta ); + + sync_state->prev_sim_stop = n_sim_stop; + sync_state->prev_offset = found_offset; + sync_state->frame_mode = frame_mode; + + return; +} + + +/*-------------------------------------------------------------------* + * masa_metadata_direction_alignment() + * + * In 2dir MASA metadata, determine the ordering of the directional + * fields such that the azi/ele change across time is minimized. + *-------------------------------------------------------------------*/ + +static void masa_metadata_direction_alignment( + MASA_ENCODER_HANDLE hMasa /* i/o: MASA encoder handle */ +) +{ + uint8_t band, n_dirs; + MASA_DIR_ALIGN_HANDLE hAlignState; + MASA_METADATA_HANDLE hMeta; + + hAlignState = &( hMasa->data.dir_align_state ); + hMeta = &( hMasa->masaMetadata ); + + n_dirs = hMeta->descriptive_meta.numberOfDirections + 1; /* 1-based */ + for ( band = 0; band < MASA_FREQUENCY_BANDS; band++ ) + { + uint8_t sf; + float diff_swap, diff_no_swap; + + /* trade 2*(cos+sin) against storing the values between frames */ + float prev_ele_dir1_sin, prev_ele_dir2_sin; + float prev_ele_dir1_cos, prev_ele_dir2_cos; + + prev_ele_dir1_sin = sinf( hAlignState->previous_ele_dir1[band] ); + prev_ele_dir2_sin = sinf( hAlignState->previous_ele_dir2[band] ); + + prev_ele_dir1_cos = cosf( hAlignState->previous_ele_dir1[band] ); + prev_ele_dir2_cos = cosf( hAlignState->previous_ele_dir2[band] ); + + for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) + { + float azi_rad1, ele_rad1; + float azi_rad2, ele_rad2; + float cos_ele1, cos_ele2; + float sin_ele1, sin_ele2; + + azi_rad1 = hMeta->directional_meta[0].azimuth[sf][band] * PI_OVER_180; + ele_rad1 = hMeta->directional_meta[0].elevation[sf][band] * PI_OVER_180; + + if ( n_dirs > 1 ) + { + azi_rad2 = hMeta->directional_meta[1].azimuth[sf][band] * PI_OVER_180; + ele_rad2 = hMeta->directional_meta[1].elevation[sf][band] * PI_OVER_180; + + /* quick checks to detect constant data and earlier flip */ + if ( fabsf( azi_rad1 - hAlignState->previous_azi_dir1[band] ) < EPSILON && + fabsf( azi_rad2 - hAlignState->previous_azi_dir2[band] ) < EPSILON && + fabsf( ele_rad1 - hAlignState->previous_ele_dir1[band] ) < EPSILON && + fabsf( ele_rad2 - hAlignState->previous_ele_dir2[band] ) < EPSILON ) + { + diff_swap = 1.0f; + diff_no_swap = 0.0f; + /* cached values that will be used for the short-cuts and over-written by the real computations, if done */ + sin_ele1 = prev_ele_dir1_sin; + sin_ele2 = prev_ele_dir2_sin; + cos_ele1 = prev_ele_dir1_cos; + cos_ele2 = prev_ele_dir2_cos; + } + else if ( fabsf( azi_rad1 - hAlignState->previous_azi_dir2[band] ) < EPSILON && + fabsf( azi_rad2 - hAlignState->previous_azi_dir1[band] ) < EPSILON && + fabsf( ele_rad1 - hAlignState->previous_ele_dir2[band] ) < EPSILON && + fabsf( ele_rad2 - hAlignState->previous_ele_dir1[band] ) < EPSILON ) + { + diff_swap = 0.0f; + diff_no_swap = 1.0f; + /* cached values that will be used for the short-cuts and over-written by the real computations, if done */ + sin_ele1 = prev_ele_dir2_sin; + sin_ele2 = prev_ele_dir1_sin; + cos_ele1 = prev_ele_dir2_cos; + cos_ele2 = prev_ele_dir1_cos; + } + else + { + /* angular distance of the two vectors */ + /* pre-compute values for re-use */ + sin_ele1 = sinf( ele_rad1 ); + sin_ele2 = sinf( ele_rad2 ); + + cos_ele1 = cosf( ele_rad1 ); + cos_ele2 = cosf( ele_rad2 ); + + diff_no_swap = acosf( cos_ele1 * prev_ele_dir1_cos * cosf( azi_rad1 - hAlignState->previous_azi_dir1[band] ) + sin_ele1 * prev_ele_dir1_sin ) + + acosf( cos_ele2 * prev_ele_dir2_cos * cosf( azi_rad2 - hAlignState->previous_azi_dir2[band] ) + sin_ele2 * prev_ele_dir2_sin ); + + diff_swap = acosf( cos_ele1 * prev_ele_dir2_cos * cosf( azi_rad1 - hAlignState->previous_azi_dir2[band] ) + sin_ele1 * prev_ele_dir2_sin ) + + acosf( cos_ele2 * prev_ele_dir1_cos * cosf( azi_rad2 - hAlignState->previous_azi_dir1[band] ) + sin_ele2 * prev_ele_dir1_sin ); + } + } + else + { + /* 1dir */ + sin_ele1 = sinf( ele_rad1 ); + cos_ele1 = cosf( ele_rad1 ); + + azi_rad2 = 0.0f; + ele_rad2 = 0.0f; + + sin_ele2 = 0.0f; /* sin(0) */ + cos_ele2 = 1.0f; /* cos(0) */ + + diff_swap = 1.0f; + diff_no_swap = 0.0f; + } + + if ( n_dirs > 1 && diff_no_swap > diff_swap ) + { + /* swap the metadata of the two directions in this TF-tile */ + float tmp_val; + uint16_t tmp_int_val; + tmp_val = hMeta->directional_meta[0].azimuth[sf][band]; + hMeta->directional_meta[0].azimuth[sf][band] = hMeta->directional_meta[1].azimuth[sf][band]; + hMeta->directional_meta[1].azimuth[sf][band] = tmp_val; + + tmp_val = hMeta->directional_meta[0].elevation[sf][band]; + hMeta->directional_meta[0].elevation[sf][band] = hMeta->directional_meta[1].elevation[sf][band]; + hMeta->directional_meta[1].elevation[sf][band] = tmp_val; + tmp_int_val = hMeta->directional_meta[0].spherical_index[sf][band]; + hMeta->directional_meta[0].spherical_index[sf][band] = hMeta->directional_meta[1].spherical_index[sf][band]; + hMeta->directional_meta[1].spherical_index[sf][band] = tmp_int_val; + tmp_val = hMeta->directional_meta[0].energy_ratio[sf][band]; + hMeta->directional_meta[0].energy_ratio[sf][band] = hMeta->directional_meta[1].energy_ratio[sf][band]; + hMeta->directional_meta[1].energy_ratio[sf][band] = tmp_val; + + tmp_val = hMeta->directional_meta[0].spread_coherence[sf][band]; + hMeta->directional_meta[0].spread_coherence[sf][band] = hMeta->directional_meta[1].spread_coherence[sf][band]; + hMeta->directional_meta[1].spread_coherence[sf][band] = tmp_val; + + hAlignState->previous_azi_dir1[band] = azi_rad2; + hAlignState->previous_ele_dir1[band] = ele_rad2; + + hAlignState->previous_azi_dir2[band] = azi_rad1; + hAlignState->previous_ele_dir2[band] = ele_rad1; + + prev_ele_dir1_cos = cos_ele2; + prev_ele_dir1_sin = sin_ele2; + + prev_ele_dir2_cos = cos_ele1; + prev_ele_dir2_sin = sin_ele1; + } + else + { + hAlignState->previous_azi_dir1[band] = azi_rad1; + hAlignState->previous_ele_dir1[band] = ele_rad1; + + hAlignState->previous_azi_dir2[band] = azi_rad2; + hAlignState->previous_ele_dir2[band] = ele_rad2; + + prev_ele_dir1_cos = cos_ele1; + prev_ele_dir1_sin = sin_ele1; + + prev_ele_dir2_cos = cos_ele2; + prev_ele_dir2_sin = sin_ele2; + } + } /* sf */ + } /* band */ + + return; +} + + +/*-------------------------------------------------------------------* + * ivas_merge_masa_metadata() + * + * + *-------------------------------------------------------------------*/ + +void ivas_merge_masa_metadata( + MASA_ENCODER_HANDLE hMasa, /* i/o: MASA enc handle. source for MASA metadata and combined metadata will be here */ + OMASA_SPATIAL_META_HANDLE hOMasaMeta /* i : ISM-object metadata to be merged with the MASA metadata */ +) +{ + int16_t sf, band; + uint8_t numCodingBands; + uint8_t numDirections; + uint8_t numSf; + MASA_METADATA_HANDLE hMeta; + float energyTimesRatioISM; + float energyTimesRatioMASA[2]; + float total_diff_nrg; + float eneBand; + float energyMerged[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + + numCodingBands = hMasa->config.numCodingBands; + numDirections = hMasa->config.numberOfDirections; + numSf = hMasa->config.joinedSubframes == TRUE ? 1 : 4; + hMeta = &( hMasa->masaMetadata ); + + for ( sf = 0; sf < numSf; sf++ ) + { + for ( band = 0; band < numCodingBands; band++ ) + { + int16_t merge_dest; + float dir_sum; + uint8_t band_n_dirs; + if ( numDirections == 1 || ( numDirections == 2 && hMasa->data.twoDirBands[band] == 0 ) ) + { + band_n_dirs = 1; + } + else + { + band_n_dirs = 2; + } + + /* Compute energies */ + eneBand = hMasa->data.energy[sf][band]; + energyMerged[sf][band] = eneBand + hMasa->data.hOmasaData->energy_ism[sf][band]; + + /* Compute weights */ + energyTimesRatioMASA[0] = eneBand * hMeta->directional_meta[0].energy_ratio[sf][band]; + if ( band_n_dirs == 2 ) + { + energyTimesRatioMASA[1] = eneBand * hMeta->directional_meta[1].energy_ratio[sf][band]; + } + else + { + energyTimesRatioMASA[1] = 0.0f; + } + + /* target is original MASA diffuseness */ + total_diff_nrg = eneBand * hMeta->common_meta.diffuse_to_total_ratio[sf][band]; + + /* criterion is mean of ISM ratio and new ratio */ + energyTimesRatioISM = ( hOMasaMeta->directional_meta[0].energy_ratio[sf][band] + ( 1.0f - total_diff_nrg / ( EPSILON + eneBand + hMasa->data.hOmasaData->energy_ism[sf][band] ) ) ) / 2.0f * hMasa->data.hOmasaData->energy_ism[sf][band]; + + /* Determine combined metadata based on the weights */ + merge_dest = -1; + if ( ( band_n_dirs == 1 && energyTimesRatioMASA[0] < energyTimesRatioISM ) || + ( band_n_dirs == 2 && energyTimesRatioMASA[0] < energyTimesRatioMASA[1] && energyTimesRatioMASA[0] < energyTimesRatioISM ) ) + { + /* 1dir and ISM the most energetic, or 2dir and ISM the more energetic than MASA1 */ + merge_dest = 0; + } + else if ( band_n_dirs == 2 && energyTimesRatioMASA[1] <= energyTimesRatioMASA[0] && energyTimesRatioMASA[1] < energyTimesRatioISM ) + { + /* 2dir and ISM the most energetic and MASA2 the least energetic */ + merge_dest = 1; + } + + if ( merge_dest >= 0 ) /* replace one MASA with ISM */ + { + hMeta->directional_meta[merge_dest].azimuth[sf][band] = hOMasaMeta->directional_meta[0].azimuth[sf][band]; + hMeta->directional_meta[merge_dest].elevation[sf][band] = hOMasaMeta->directional_meta[0].elevation[sf][band]; + /* limit with the earlier direct-energy ratio */ + dir_sum = 1.0f - total_diff_nrg / ( EPSILON + eneBand + hMasa->data.hOmasaData->energy_ism[sf][band] ); /* new dir ratio */ + hMeta->directional_meta[merge_dest].energy_ratio[sf][band] = min( dir_sum, hOMasaMeta->directional_meta[0].energy_ratio[sf][band] ); /* clip with original ISM dir */ + hMeta->common_meta.diffuse_to_total_ratio[sf][band] = 1.0f - hMeta->directional_meta[merge_dest].energy_ratio[sf][band]; + + if ( hMasa->config.useCoherence ) + { + hMeta->directional_meta[merge_dest].spread_coherence[sf][band] = hOMasaMeta->directional_meta[0].spread_coherence[sf][band]; + hMeta->common_meta.surround_coherence[sf][band] = hOMasaMeta->common_meta.surround_coherence[sf][band]; + } + + /* recompute direct energy ratios to match the diffuse ratio */ + float direct_quota, direct_scaler; + direct_quota = 1.0f - hMeta->common_meta.diffuse_to_total_ratio[sf][band]; + if ( band_n_dirs == 1 ) + { + hMeta->directional_meta[0].energy_ratio[sf][band] = direct_quota; + } + else + { + dir_sum = hMeta->directional_meta[0].energy_ratio[sf][band] + hMeta->directional_meta[1].energy_ratio[sf][band]; + direct_scaler = direct_quota / ( EPSILON + dir_sum ); + hMeta->directional_meta[0].energy_ratio[sf][band] *= direct_scaler; + hMeta->directional_meta[1].energy_ratio[sf][band] *= direct_scaler; + } + } + } + } + + for ( sf = 0; sf < numSf; sf++ ) + { + for ( band = 0; band < numCodingBands; band++ ) + { + hMasa->data.energy[sf][band] = energyMerged[sf][band]; + } + } + + return; +} + + +static void quantize_ratio_ism_vector( + const float *ratio_ism, + int16_t *idx, + const int16_t nchan_ism, + const float masa_to_total_energy_ratio, + const int16_t idx_sep_object ) +{ + int16_t i, j, best_i, best_i2; + float dist, div, tmp, dist2, best_dist; + int16_t part_idx_sum, max_sum_idx; + float ratio_ism_loc[MAX_NUM_OBJECTS]; + int16_t no_ism_loc; + + max_sum_idx = ( 1 << PARAM_ISM_POW_RATIO_NBITS ) - 1; + + if ( idx_sep_object > -1 ) + { + if ( ratio_ism[idx_sep_object] < 1.0f / (float) ( max_sum_idx ) ) + { + /* take it out from quantize function */ + mvr2r( ratio_ism, ratio_ism_loc, idx_sep_object ); + mvr2r( &ratio_ism[idx_sep_object + 1], &ratio_ism_loc[idx_sep_object], nchan_ism - idx_sep_object - 1 ); + no_ism_loc = nchan_ism - 1; + } + else + { + no_ism_loc = nchan_ism; + mvr2r( ratio_ism, ratio_ism_loc, nchan_ism ); + } + } + else + { + no_ism_loc = nchan_ism; + mvr2r( ratio_ism, ratio_ism_loc, nchan_ism ); + } + + if ( nchan_ism > 1 ) + { + if ( masa_to_total_energy_ratio >= MASA2TOTAL_THR ) + { + distribute_evenly_ism( idx, max_sum_idx, nchan_ism ); + } + else + { + if ( no_ism_loc > 1 ) + { + + dist = 0.0f; + div = 1.0f / (float) ( max_sum_idx ); + + part_idx_sum = 0; + + for ( i = 0; i < no_ism_loc; i++ ) + { + idx[i] = (int16_t) ( ( ratio_ism_loc[i] ) * ( max_sum_idx ) ); + part_idx_sum += idx[i]; + + tmp = ( ratio_ism_loc[i] - ( idx[i] * div ) ); + dist += ( tmp * tmp ); + } + + best_dist = dist; + best_i2 = -1; + while ( part_idx_sum < max_sum_idx ) + { + best_i = -1; + /* check which index to increase by 1 for a possible improvement */ + + for ( i = 0; i < no_ism_loc; i++ ) + { + idx[i]++; + dist2 = 0.0f; + + for ( j = 0; j < no_ism_loc; j++ ) + { + tmp = ( ratio_ism_loc[i] - ( idx[i] * div ) ); + dist2 += ( tmp * tmp ); + } + + if ( dist2 < best_dist ) + { + best_i2 = best_i; + best_i = i; + best_dist = dist2; + } + idx[i]--; + } + if ( best_i > -1 ) + { + idx[best_i]++; + part_idx_sum++; + } + else + { + if ( best_i2 > -1 ) + { + idx[best_i2]++; + part_idx_sum++; + } + else + { + idx[no_ism_loc - 1] += max_sum_idx - part_idx_sum; + part_idx_sum = max_sum_idx; + } + } + } + assert( sum_s( idx, no_ism_loc ) == max_sum_idx ); + } + else + { + idx[0] = max_sum_idx; + } + + if ( no_ism_loc < nchan_ism ) + { + /* insert back the ratio of the separated object */ + for ( i = nchan_ism - 1; i > idx_sep_object; i-- ) + { + idx[i] = idx[i - 1]; + } + idx[idx_sep_object] = 0; + } + } + } + else + { + idx[0] = (int16_t) ( ( ratio_ism[0] ) * ( ( 1 << PARAM_ISM_POW_RATIO_NBITS ) - 1 ) + 0.5f ); + } + + return; +} + + +static int16_t index_slice_enum( + const int16_t *ratio_ism_idx, + const int16_t nchan_ism ) +{ + int16_t i; + int16_t x, index; + int16_t base; + + if ( nchan_ism == 2 ) + { + index = ratio_ism_idx[0]; + } + else + { + x = ratio_ism_idx[nchan_ism - 2]; + base = 10; + for ( i = nchan_ism - 3; i >= 0; i-- ) + { + x += ratio_ism_idx[i] * base; + base *= 10; + } + + index = 0; + i = 0; + while ( i <= x ) + { + if ( valid_ratio_index( i, 7, nchan_ism - 1 ) ) + { + index++; + } + i++; + } + index--; + } + + return index; +} + + +static void transform_difference_index( + const int16_t *diff_idx, + int16_t *idx, + const int16_t len ) +{ + int16_t i; + for ( i = 0; i < len; i++ ) + { + if ( diff_idx[i] <= 0 ) + { + idx[i] = -2 * diff_idx[i]; + } + else + { + idx[i] = 2 * diff_idx[i] - 1; + } + } + + return; +} + + +static void transform_index_and_GR_encode( + int16_t *diff_idx, /* i : differenc eindex to encode */ + const int16_t len, /* i : input length */ + const int16_t GR_order, /* i : GR order */ + BSTR_ENC_HANDLE hMetaData /* i/o: metadata bitstream handle */ +) +{ + int16_t i; + int16_t idx[IVAS_MAX_NUM_OBJECTS]; + + /* transform difference index into positive */ + transform_difference_index( diff_idx, idx, len ); + + /* GR encoding */ + for ( i = 0; i < len; i++ ) + { + ivas_qmetadata_encode_extended_gr( hMetaData, idx[i], 100, GR_order ); + } + + return; +} + + +static int16_t try_differential( + const int16_t numCodingBands, + const float *masa_to_total_energy_ratio, + int16_t ratio_ism_idx[MASA_FREQUENCY_BANDS][MAX_NUM_OBJECTS], + const int16_t nchan_ism, + const int16_t bits_index, + int16_t *p_b_signif ) +{ + int16_t b, i; + int16_t nbits0; + int16_t b_signif; + int16_t ratio_ism_idx_ref[MAX_NUM_OBJECTS]; + int16_t diff_idx[MAX_NUM_OBJECTS]; + + b_signif = 0; + while ( ( b_signif < numCodingBands ) && ( masa_to_total_energy_ratio[b_signif] >= MASA2TOTAL_THR ) ) + { + b_signif++; + } + + nbits0 = 0; + + if ( b_signif < numCodingBands ) + { + nbits0 = bits_index; + mvs2s( ratio_ism_idx[b_signif], ratio_ism_idx_ref, nchan_ism ); + + for ( b = b_signif + 1; b < numCodingBands; b++ ) + { + if ( masa_to_total_energy_ratio[b] < MASA2TOTAL_THR ) + { + v_sub_s( ratio_ism_idx[b], ratio_ism_idx_ref, diff_idx, nchan_ism ); + mvs2s( ratio_ism_idx[b], ratio_ism_idx_ref, nchan_ism ); + + /* transform difference index into positive */ + transform_difference_index( diff_idx, diff_idx, nchan_ism - 1 ); + + /* GR encoding */ + for ( i = 0; i < nchan_ism - 1; i++ ) + { + nbits0 += ivas_qmetadata_encode_extended_gr_length( diff_idx[i], 100, 0 ); + } + } + } + } + *p_b_signif = b_signif; + + return nbits0; +} + + +static void differential_coding_first_subframe( + BSTR_ENC_HANDLE hMetaData, + const float *masa_to_total_energy_ratio, + const int16_t b_signif, + int16_t ratio_ism_idx[MASA_FREQUENCY_BANDS][MAX_NUM_OBJECTS], + const int16_t nchan_ism, + const int16_t numCodingBands, + const int16_t bits_index ) +{ + int16_t index, b; + int16_t ratio_ism_idx_ref[MAX_NUM_OBJECTS]; + int16_t diff_idx[MAX_NUM_OBJECTS]; + + /* differential encoding*/ + push_next_indice( hMetaData, 0, 1 ); + + if ( b_signif < numCodingBands ) + { + index = index_slice_enum( ratio_ism_idx[b_signif], nchan_ism ); + push_next_indice( hMetaData, index, bits_index ); + + mvs2s( ratio_ism_idx[b_signif], ratio_ism_idx_ref, nchan_ism ); + + for ( b = b_signif + 1; b < numCodingBands; b++ ) + { + if ( masa_to_total_energy_ratio[b] < MASA2TOTAL_THR ) + { + v_sub_s( ratio_ism_idx[b], ratio_ism_idx_ref, diff_idx, nchan_ism ); + mvs2s( ratio_ism_idx[b], ratio_ism_idx_ref, nchan_ism ); + + /* transform difference index into positive */ + transform_index_and_GR_encode( diff_idx, nchan_ism - 1, 0, hMetaData ); + } + } + } + + return; +} + + +static void independent_coding_ratio_ism_idx( + int16_t ratio_ism_idx[MASA_FREQUENCY_BANDS][MAX_NUM_OBJECTS], /* i : ISM ratios */ + const float *masa_to_total_energy_ratio, /* i : MASA to total ratios */ + const int16_t nchan_ism, /* i : number of objects */ + const int16_t numCodingBands, /* i : number of subbands */ + const int16_t bits_index, /* i : number of bits per index */ + BSTR_ENC_HANDLE hMetaData /* i/o: metadata bitstream handle */ +) +{ + int16_t b, index; + + for ( b = 0; b < numCodingBands; b++ ) + { + if ( masa_to_total_energy_ratio[b] < MASA2TOTAL_THR ) + { + index = index_slice_enum( ratio_ism_idx[b], nchan_ism ); + push_next_indice( hMetaData, index, bits_index ); + } + } + + return; +} + + +static void remove_sep_obj( + int16_t *diff_idx, /* i/o: array of difference of indexes */ + const int16_t nchan_ism, /* i : number of objects */ + const int16_t idx_sep_obj /* i : index of separated object, to be taken out of array */ +) +{ + int16_t i; + + for ( i = idx_sep_obj; i < nchan_ism - 1; i++ ) + { + diff_idx[i] = diff_idx[i + 1]; + } + + return; +} + + +static void estimate_bits_subband_ism_ratio( + const int16_t *ratio_ism_idx, + const int16_t *ratio_ism_idx_ref, /* ( i/o ) */ + const int16_t nchan_ism, + const int16_t shift_one, + const int16_t idx_sep_obj, + int16_t *p_nbits0, + int16_t *p_nbits1 ) +{ + int16_t diff_idx[MAX_NUM_OBJECTS]; + int16_t nbits0, nbits1; + int16_t i; + + nbits0 = 0; + nbits1 = 0; + + /* take difference with respect to previous subframe */ + v_sub_s( ratio_ism_idx, ratio_ism_idx_ref, diff_idx, nchan_ism ); + + if ( shift_one ) + { + remove_sep_obj( diff_idx, nchan_ism, idx_sep_obj ); + } + + /* transform difference index into positive */ + transform_difference_index( diff_idx, diff_idx, nchan_ism - 1 - shift_one ); + + /* GR encoding */ + for ( i = 0; i < nchan_ism - 1 - shift_one; i++ ) + { + nbits0 += ivas_qmetadata_encode_extended_gr_length( diff_idx[i], 100, 0 ); + nbits1 += ivas_qmetadata_encode_extended_gr_length( diff_idx[i], 100, 1 ); + } + + *p_nbits0 = nbits0; + *p_nbits1 = nbits1; + + return; +} + + +static int16_t encode_ratio_ism_subframe( + int16_t ratio_ism_idx[MASA_FREQUENCY_BANDS][MAX_NUM_OBJECTS], + const int16_t nchan_ism, + const uint8_t numCodingBands, + const int16_t sf, + int16_t ratio_ism_idx_prev_sf[MASA_FREQUENCY_BANDS][MAX_NUM_OBJECTS], + BSTR_ENC_HANDLE hMetaData, + const float *masa_to_total_energy_ratio, + const int16_t shift_one, + const int16_t idx_separated_obj ) +{ + int16_t b, b_signif; + int16_t diff_idx[MAX_NUM_OBJECTS]; + int16_t nbits, nbits0, nbits1, GR_order, GR_order_sb; + int16_t differential_subframe; + int16_t ratio_ism_idx_ref[MAX_NUM_OBJECTS]; + int16_t bits_index; + int16_t nbits00, nbits11; + int16_t idx_sep_obj_local; + + idx_sep_obj_local = idx_separated_obj; + if ( idx_separated_obj > -1 ) + { + if ( idx_separated_obj == nchan_ism - 1 ) + { + idx_sep_obj_local = 0; + } + } + nbits = 0; + nbits0 = 0; + nbits1 = 0; + + differential_subframe = 1; /* the differences are taken with respect to previous subframe */ + + /* first subframe */ + bits_index = 0; + if ( sf == 0 ) + { + bits_index = bits_index_ism_ratio( nchan_ism ); + + nbits = 0; + for ( b = 0; b < numCodingBands; b++ ) + { + if ( masa_to_total_energy_ratio[b] < MASA2TOTAL_THR ) + { + nbits += bits_index; + } + } + + nbits0 = try_differential( numCodingBands, masa_to_total_energy_ratio, ratio_ism_idx, nchan_ism, bits_index, &b_signif ); + + if ( nbits <= nbits0 && nbits > 0 ) + { + /* independent encoding */ + push_next_indice( hMetaData, 1, 1 ); + independent_coding_ratio_ism_idx( ratio_ism_idx, masa_to_total_energy_ratio, nchan_ism, numCodingBands, bits_index, hMetaData ); + nbits = nbits + 1; + } + else + { + if ( nbits > 0 ) + { + differential_coding_first_subframe( hMetaData, masa_to_total_energy_ratio, b_signif, ratio_ism_idx, nchan_ism, numCodingBands, bits_index ); + nbits = nbits0 + 1; + } + } + + } + else + { + /* not first subframe */ + if ( shift_one == 1 && nchan_ism == 2 ) + { + nbits = 0; + } + else + { + nbits0 = 0; + nbits1 = 0; + + for ( b = 0; b < numCodingBands; b++ ) + { + if ( masa_to_total_energy_ratio[b] < MASA2TOTAL_THR ) + { + estimate_bits_subband_ism_ratio( ratio_ism_idx[b], ratio_ism_idx_prev_sf[b], nchan_ism, shift_one, idx_sep_obj_local, &nbits00, &nbits11 ); + nbits0 += nbits00; + nbits1 += nbits11; + } + } + if ( nbits0 < nbits1 ) + { + GR_order = 0; + nbits = nbits0; + } + else + { + GR_order = 1; + nbits = nbits1; + } + + if ( numCodingBands > 1 ) + { + /* try the difference from subband to subband; first subband is compared to previous subframe first subband*/ + /* take difference with respect to previous subframe only for first subband */ + nbits0 = 0; + nbits1 = 0; + b_signif = 0; + while ( ( b_signif < numCodingBands ) && ( masa_to_total_energy_ratio[b_signif] >= MASA2TOTAL_THR ) ) + { + b_signif++; + } + + if ( b_signif < numCodingBands ) + { + estimate_bits_subband_ism_ratio( ratio_ism_idx[b_signif], ratio_ism_idx_prev_sf[b_signif], nchan_ism, shift_one, idx_sep_obj_local, &nbits0, &nbits1 ); + + mvs2s( ratio_ism_idx[b_signif], ratio_ism_idx_ref, nchan_ism ); + + for ( b = b_signif + 1; b < numCodingBands; b++ ) + { + if ( masa_to_total_energy_ratio[b] < MASA2TOTAL_THR ) + { + estimate_bits_subband_ism_ratio( ratio_ism_idx[b], ratio_ism_idx_ref, nchan_ism, shift_one, idx_sep_obj_local, &nbits00, &nbits11 ); + nbits0 += nbits00; + nbits1 += nbits11; + mvs2s( ratio_ism_idx[b], ratio_ism_idx_ref, nchan_ism ); + } + } + + if ( nbits0 < nbits1 ) + { + GR_order_sb = 0; + } + else + { + GR_order_sb = 1; + nbits0 = nbits1; + } + + if ( nbits0 < nbits ) + { + differential_subframe = 0; + nbits = nbits0; + GR_order = GR_order_sb; + } + + if ( nbits > 0 ) + { + /* write prediction type */ + push_next_indice( hMetaData, differential_subframe, 1 ); + /* write GR order */ + push_next_indice( hMetaData, GR_order, 1 ); + nbits++; /* for the prediction type */ + nbits++; /* for GR_order */ + + /* write data */ + if ( differential_subframe ) + { + for ( b = 0; b < numCodingBands; b++ ) + { + if ( masa_to_total_energy_ratio[b] < MASA2TOTAL_THR ) + { + /* take difference with respect to previous subframe */ + v_sub_s( ratio_ism_idx[b], ratio_ism_idx_prev_sf[b], diff_idx, nchan_ism ); + + if ( shift_one ) + { + remove_sep_obj( diff_idx, nchan_ism, idx_sep_obj_local ); + } + + transform_index_and_GR_encode( diff_idx, nchan_ism - 1 - shift_one, GR_order, hMetaData ); + } + } + } + else + { + v_sub_s( ratio_ism_idx[b_signif], ratio_ism_idx_prev_sf[b_signif], diff_idx, nchan_ism ); + + if ( shift_one ) + { + remove_sep_obj( diff_idx, nchan_ism, idx_sep_obj_local ); + } + + transform_index_and_GR_encode( diff_idx, nchan_ism - 1 - shift_one, GR_order, hMetaData ); + + mvs2s( ratio_ism_idx[b_signif], ratio_ism_idx_ref, nchan_ism - shift_one ); + + for ( b = b_signif + 1; b < numCodingBands; b++ ) + { + /* take difference with respect to previous subband */ + if ( masa_to_total_energy_ratio[b] < MASA2TOTAL_THR ) + { + v_sub_s( ratio_ism_idx[b], ratio_ism_idx_ref, diff_idx, nchan_ism ); + + if ( shift_one ) + { + remove_sep_obj( diff_idx, nchan_ism, idx_sep_obj_local ); + } + + transform_index_and_GR_encode( diff_idx, nchan_ism - 1 - shift_one, GR_order, hMetaData ); + + mvs2s( ratio_ism_idx[b], ratio_ism_idx_ref, nchan_ism - shift_one ); + } + } + } + } + } + } + else + { + /* only differential wrt previous subframe is possible */ + /* write the differential to subframe case and no bit to signal the difference type */ + + if ( nbits > 0 ) + { + /* write GR order */ + push_next_indice( hMetaData, GR_order, 1 ); + nbits++; /* for GR_order */ + /* write data */ + /* only one subband */ + if ( masa_to_total_energy_ratio[0] < MASA2TOTAL_THR ) + { + /* take difference with respect to previous subframe */ + v_sub_s( ratio_ism_idx[0], ratio_ism_idx_prev_sf[0], diff_idx, nchan_ism ); + + if ( shift_one ) + { + remove_sep_obj( diff_idx, nchan_ism, idx_sep_obj_local ); + } + + transform_index_and_GR_encode( diff_idx, nchan_ism - 1 - shift_one, GR_order, hMetaData ); + } + } + } + + } + } + + return nbits; +} + + +static void ivas_encode_masaism_metadata( + MASA_ENCODER_HANDLE hMasa, + IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ + BSTR_ENC_HANDLE hMetaData, /* i/o: metadata bitstream handle */ + ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ + const int16_t nchan_ism, /* i : number of ISM channels */ + const int16_t low_bitrate_mode, /* i : is low bitrate more? 1/0 */ + const int16_t omasa_nbands, + const int16_t omasa_nblocks, + const int16_t idx_separated_object, + const int16_t ism_imp ) +{ + int16_t sf, band; + uint8_t numCodingBands; + uint8_t numSf; + int16_t brange[2]; + float eneBand; + int16_t bin; + int16_t obj; + int16_t bits_ism[MAX_NUM_OBJECTS]; + uint16_t idx_sph; + float theta_q, phi_q; + uint16_t index_theta, index_phi; + float ratio_ism[MASA_FREQUENCY_BANDS][MAX_NUM_OBJECTS]; + int16_t ratio_ism_idx[MASA_FREQUENCY_BANDS][MAX_NUM_OBJECTS], ratio_ism_idx_prev_sf[MASA_FREQUENCY_BANDS][MAX_NUM_OBJECTS]; + float step; + int16_t inv_step; + float energy_ism, energy_ism_ind[MAX_NUM_OBJECTS]; + int16_t tmp, rotate; + int16_t n_ism_tmp, i; + OMASA_ENCODER_DATA_HANDLE hOmasaData = hMasa->data.hOmasaData; + int16_t nbands_work; + + /* use the values from hQMetaData */ + numCodingBands = (uint8_t) hQMetaData->q_direction->cfg.nbands; + numSf = (int8_t) hQMetaData->q_direction->cfg.nblocks; + nbands_work = min( numCodingBands, omasa_nbands ); + if ( numCodingBands == 1 ) + { + for ( sf = 0; sf < numSf; sf++ ) + { + if ( sum_f( hOmasaData->energy_ism[sf], omasa_nbands ) == 0.0f ) + { + hOmasaData->masa_to_total_energy_ratio[sf][0] = 1.0f; + } + else + { + brange[0] = hMasa->data.band_mapping[0]; + brange[1] = hMasa->data.band_mapping[omasa_nbands]; + eneBand = 0.0f; + for ( bin = brange[0]; bin < brange[1]; bin++ ) + { + eneBand += hMasa->data.energy[sf][bin]; + } + + energy_ism = 0.0f; + for ( obj = 0; obj < nchan_ism; obj++ ) + { + energy_ism_ind[obj] = 0.0f; + } + + for ( band = 0; band < omasa_nbands; band++ ) + { + energy_ism += hOmasaData->energy_ism[sf][band]; + for ( obj = 0; obj < nchan_ism; obj++ ) + { + energy_ism_ind[obj] += hOmasaData->energy_ism[sf][band] * hOmasaData->energy_ratio_ism[sf][band][obj]; + } + } + + for ( obj = 0; obj < nchan_ism; obj++ ) + { + hOmasaData->energy_ratio_ism[sf][0][obj] = energy_ism_ind[obj] / energy_ism; + } + hOmasaData->masa_to_total_energy_ratio[sf][0] = eneBand / ( eneBand + energy_ism + EPSILON ); + } + } + } + else if ( numSf == 1 ) + { + for ( band = 0; band < nbands_work; band++ ) + { + energy_ism = 0.0f; /* ISM energy for current subband */ + for ( obj = 0; obj < nchan_ism; obj++ ) + { + energy_ism_ind[obj] = 0.0f; + } + for ( sf = 0; sf < omasa_nblocks; sf++ ) + { + energy_ism += hOmasaData->energy_ism[sf][band]; + for ( obj = 0; obj < nchan_ism; obj++ ) + { + energy_ism_ind[obj] += hOmasaData->energy_ism[sf][band] * hOmasaData->energy_ratio_ism[sf][band][obj]; + } + } + + if ( energy_ism == 0.0f ) + { + hOmasaData->masa_to_total_energy_ratio[0][band] = 1.0f; + } + else + { + for ( obj = 0; obj < nchan_ism; obj++ ) + { + hOmasaData->energy_ratio_ism[0][band][obj] = energy_ism_ind[obj] / energy_ism; + } + brange[0] = hMasa->data.band_mapping[band]; + brange[1] = hMasa->data.band_mapping[band + 1]; + + eneBand = 0.0f; + for ( sf = 0; sf < omasa_nblocks; sf++ ) + { + for ( bin = brange[0]; bin < brange[1]; bin++ ) + { + eneBand += hMasa->data.energy[sf][bin]; + } + } + hOmasaData->masa_to_total_energy_ratio[0][band] = eneBand / ( eneBand + energy_ism + EPSILON ); + } + } + for ( band = nbands_work; band < numCodingBands; band++ ) + { + hOmasaData->masa_to_total_energy_ratio[0][band] = 1.0f; + + for ( obj = 0; obj < nchan_ism; obj++ ) + { + hOmasaData->energy_ratio_ism[0][band][obj] = hOmasaData->energy_ratio_ism[0][nbands_work - 1][obj]; + } + } + } + else + { + for ( sf = 0; sf < numSf; sf++ ) + { + for ( band = 0; band < nbands_work; band++ ) + { + if ( hOmasaData->energy_ism[sf][band] == 0.0f ) + { + hOmasaData->masa_to_total_energy_ratio[sf][band] = 1.0f; + } + else + { + brange[0] = hMasa->data.band_mapping[band]; + brange[1] = hMasa->data.band_mapping[band + 1]; + + eneBand = 0.0f; + for ( bin = brange[0]; bin < brange[1]; bin++ ) + { + eneBand += hMasa->data.energy[sf][bin]; + } + hOmasaData->masa_to_total_energy_ratio[sf][band] = eneBand / ( eneBand + hOmasaData->energy_ism[sf][band] + EPSILON ); + } + } + for ( band = nbands_work; band < numCodingBands; band++ ) + { + hOmasaData->masa_to_total_energy_ratio[sf][band] = 1.0f; + + for ( obj = 0; obj < nchan_ism; obj++ ) + { + hOmasaData->energy_ratio_ism[sf][band][obj] = hOmasaData->energy_ratio_ism[sf][nbands_work - 1][obj]; + } + } + } + } + ivas_omasa_encode_masa_to_total( hOmasaData->masa_to_total_energy_ratio, hMetaData, low_bitrate_mode, numCodingBands, numSf ); + + /* quantize ism_ratios */ + if ( nchan_ism > 1 ) + { + inv_step = ( ( 1 << PARAM_ISM_POW_RATIO_NBITS ) - 1 ); + step = 1.0f / inv_step; + + rotate = 0; + n_ism_tmp = 0; + + for ( sf = 0; sf < numSf; sf++ ) + { + for ( band = 0; band < numCodingBands; band++ ) + { + for ( obj = 0; obj < nchan_ism; obj++ ) + { + assert( ( hOmasaData->energy_ratio_ism[sf][band][obj] >= 0 ) && ( hOmasaData->energy_ratio_ism[sf][band][obj] <= 1 ) ); + ratio_ism[band][obj] = hOmasaData->energy_ratio_ism[sf][band][obj]; + } + + /* Quantize ISM ratios */ + quantize_ratio_ism_vector( ratio_ism[band], ratio_ism_idx[band], nchan_ism, hOmasaData->masa_to_total_energy_ratio[sf][band], idx_separated_object ); + if ( n_ism_tmp == numCodingBands && ratio_ism_idx[band][idx_separated_object] != 0 && hOmasaData->masa_to_total_energy_ratio[sf][band] < MASA2TOTAL_THR ) + { + i = 0; + while ( ratio_ism_idx[band][idx_separated_object] > 0 ) + { + if ( i != idx_separated_object ) + { + ratio_ism_idx[band][i]++; + ratio_ism_idx[band][idx_separated_object]--; + } + i++; + if ( i == nchan_ism ) + { + i = 0; + } + } + } + + /* reconstructed values */ + reconstruct_ism_ratios( ratio_ism_idx[band], nchan_ism, step, hMasa->data.hOmasaData->q_energy_ratio_ism[sf][band] ); + } + + if ( ( nchan_ism > 2 ) && ( idx_separated_object == nchan_ism - 1 ) ) + { + /* rotate components */ + rotate = 1; + for ( band = 0; band < numCodingBands; band++ ) + { + if ( hOmasaData->masa_to_total_energy_ratio[sf][band] < MASA2TOTAL_THR ) + { + tmp = ratio_ism_idx[band][nchan_ism - 1]; + ratio_ism_idx[band][nchan_ism - 1] = ratio_ism_idx[band][0]; + ratio_ism_idx[band][0] = tmp; + if ( sf == 0 && tmp == 0 ) + { + n_ism_tmp += 1; + } + + if ( n_ism_tmp == numCodingBands ) + { + assert( tmp == 0 ); + } + } + } + } + else + { + if ( idx_separated_object > -1 ) + { + for ( band = 0; band < numCodingBands; band++ ) + { + if ( hOmasaData->masa_to_total_energy_ratio[sf][band] < MASA2TOTAL_THR ) + { + if ( ratio_ism_idx[band][idx_separated_object] == 0 && sf == 0 ) + { + n_ism_tmp++; + } + } + } + } + } + + /* encode data for current subframe */ + if ( sf > 0 && n_ism_tmp == numCodingBands ) + { + encode_ratio_ism_subframe( ratio_ism_idx, nchan_ism, numCodingBands, sf, ratio_ism_idx_prev_sf, hMetaData, hOmasaData->masa_to_total_energy_ratio[sf], 1, idx_separated_object ); + } + else + { + encode_ratio_ism_subframe( ratio_ism_idx, nchan_ism, numCodingBands, sf, ratio_ism_idx_prev_sf, hMetaData, hOmasaData->masa_to_total_energy_ratio[sf], 0, idx_separated_object ); + } + + /* calculate quantized ISM ratios */ + /* save previous subframe indexes */ + for ( band = 0; band < numCodingBands; band++ ) + { + mvs2s( ratio_ism_idx[band], ratio_ism_idx_prev_sf[band], nchan_ism ); + } + + if ( rotate ) + { + for ( band = 0; band < numCodingBands; band++ ) + { + if ( hOmasaData->masa_to_total_energy_ratio[sf][band] < MASA2TOTAL_THR ) + { + tmp = ratio_ism_idx[band][nchan_ism - 1]; + ratio_ism_idx[band][nchan_ism - 1] = ratio_ism_idx[band][0]; + ratio_ism_idx[band][0] = tmp; + } + } + } + } + } + + calculate_nbits_meta( nchan_ism, hOmasaData->q_energy_ratio_ism, hOmasaData->masa_to_total_energy_ratio, numSf, numCodingBands, bits_ism, idx_separated_object, ism_imp ); + + /* quantize directions */ + for ( obj = 0; obj < nchan_ism; obj++ ) + { + if ( bits_ism[obj] < 8 ) + { + /* check is same as previous */ + if ( ( fabs( hIsmMeta[obj]->elevation - hIsmMeta[obj]->q_elevation_old ) < 0.01f ) && ( fabs( hIsmMeta[obj]->azimuth - hIsmMeta[obj]->q_azimuth_old ) < 0.01f ) ) + { + push_next_indice( hMetaData, 1, 1 ); + /* the old stays the same */ + } + else + { + push_next_indice( hMetaData, 0, 1 ); + idx_sph = quantize_direction( hIsmMeta[obj]->elevation, hIsmMeta[obj]->azimuth, bits_ism[obj], &theta_q, &phi_q, &index_theta, &index_phi, MC_LS_SETUP_INVALID ); + push_next_indice( hMetaData, idx_sph, bits_ism[obj] ); + hIsmMeta[obj]->q_elevation_old = hIsmMeta[obj]->elevation; + hIsmMeta[obj]->q_azimuth_old = hIsmMeta[obj]->azimuth; + } + } + else + { + idx_sph = quantize_direction( hIsmMeta[obj]->elevation, hIsmMeta[obj]->azimuth, bits_ism[obj], &theta_q, &phi_q, &index_theta, &index_phi, MC_LS_SETUP_INVALID ); + push_next_indice( hMetaData, idx_sph, bits_ism[obj] ); + hIsmMeta[obj]->q_elevation_old = hIsmMeta[obj]->elevation; + hIsmMeta[obj]->q_azimuth_old = hIsmMeta[obj]->azimuth; + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * ivas_merge_masa_transports() + * + * Merge MASA transport channels + *-------------------------------------------------------------------*/ + +void ivas_merge_masa_transports( + float data_in_f1[][L_FRAME48k], + float *data_in_f2[], + float *data_out_f[], + const int16_t input_frame, + const int16_t num_transport_channels ) +{ + int16_t i, j; + + for ( i = 0; i < num_transport_channels; i++ ) + { + for ( j = 0; j < input_frame; j++ ) + { + data_out_f[i][j] = data_in_f1[i][j] + data_in_f2[i][j]; + } + } + + return; +} diff --git a/lib_enc/ivas_mc_param_enc.c b/lib_enc/ivas_mc_param_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..5a90fc89a29ab0ad68a76582cf64aa04da100072 --- /dev/null +++ b/lib_enc/ivas_mc_param_enc.c @@ -0,0 +1,1871 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include "options.h" +#include "cnst.h" +#include "rom_enc.h" +#include "ivas_rom_enc.h" +#include "rom_com.h" +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_cnst.h" +#include "ivas_rom_com.h" +#include "wmc_auto.h" + + +/*------------------------------------------------------------------------- + * Local function prototypes + *------------------------------------------------------------------------*/ + +static void ivas_param_mc_dmx( PARAM_MC_ENC_HANDLE hParamMC, float *data_f[], float data_dmx[][L_FRAME48k], const int16_t input_frame, const int16_t nchan_input, const int16_t nchan_transport ); + +static void ivas_param_mc_param_est_enc( PARAM_MC_ENC_HANDLE hParamMC, float *data_f[], float Cy_sum[][MAX_CICP_CHANNELS][MAX_CICP_CHANNELS], float Cx_sum[][PARAM_MC_MAX_TRANSPORT_CHANS][PARAM_MC_MAX_TRANSPORT_CHANS], const int16_t input_frame, const int16_t nchan_input, const int16_t nchan_transport ); + +static void ivas_param_mc_parameter_quantizer( const float *x, const int16_t L, const int16_t sz_quantizer, const float *quantizer, int16_t *quant_idx, float *y ); + +static void ivas_param_mc_transient_detection( PARAM_MC_ENC_HANDLE hParamMC, TRAN_DET_HANDLE hTranDet, int16_t *bAttackPresent, int16_t *attackIdx ); + +static void ivas_param_mc_enc_find_icc_map( PARAM_MC_ENC_HANDLE hParamMC, float Cx_sum[][PARAM_MC_MAX_TRANSPORT_CHANS][PARAM_MC_MAX_TRANSPORT_CHANS], float Cy_sum[][MAX_CICP_CHANNELS][MAX_CICP_CHANNELS], float ILD_q[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_SZ_ILD_MAP], const int16_t nchan_input, const int16_t nchan_transport ); + +static void ivas_param_mc_quantize_iccs( PARAM_MC_ENC_HANDLE hParamMC, float Cy[MAX_CICP_CHANNELS][MAX_CICP_CHANNELS], const int16_t freq_idx, const int16_t nchan_input, int16_t *ICC_idx_out ); + +static void ivas_param_mc_quantize_ilds( PARAM_MC_ENC_HANDLE hParamMC, float Cy[MAX_CICP_CHANNELS][MAX_CICP_CHANNELS], float Cx[PARAM_MC_MAX_TRANSPORT_CHANS][PARAM_MC_MAX_TRANSPORT_CHANS], const int16_t freq_idx, const int16_t nchan_input, const int16_t nchan_transport, int16_t *ILD_idx_out, float ILD_q[PARAM_MC_SZ_ILD_MAP] ); + +static void ivas_param_mc_write_bs( const PARAM_MC_ENC_HANDLE hParamMC, int16_t *ILD_idx, int16_t *ICC_idx, uint16_t bit_buffer[PARAM_MC_MAX_BITS], int16_t *bit_pos ); + +static void ivas_param_mc_dec2bin( const int16_t val, const int16_t N, uint16_t bits[PARAM_MC_MAX_BITS] ); + +static void ivas_param_mc_encode_parameter( int16_t *idx_in, HANDLE_IVAS_PARAM_MC_METADATA hMetadataPMC, HANDLE_PARAM_MC_PARAMETER_CODING_INFO hParameterCodingInfo, const int16_t nbands, const int16_t band_step, const int16_t map_size_wo_lfe, const int16_t map_size, uint16_t bit_buffer[PARAM_MC_MAX_BITS], int16_t *bit_pos ); + +static void ivas_param_mc_range_encoder( const int16_t *seq_in, const int16_t num_symbols, const uint16_t *cum_freq, const uint16_t *sym_freq, const uint16_t tot_shift, const int16_t max_nb_bits, uint16_t *bit_buffer, int16_t *bit_pos ); + +/*------------------------------------------------------------------------- + * ivas_param_mc_enc_open() + * + * Initialize Parametric MC encoder handle + *------------------------------------------------------------------------*/ + +ivas_error ivas_param_mc_enc_open( + Encoder_Struct *st_ivas /* i/o: IVAS encoder handle */ +) +{ + int16_t i, k, l; + IVAS_FB_CFG *fb_cfg; + PARAM_MC_ENC_HANDLE hParamMC; + uint16_t config_index; + MC_LS_SETUP mc_input_setup; + int16_t max_bwidth, nchan_inp; + int32_t input_Fs, ivas_total_brate; + ivas_error error; + + error = IVAS_ERR_OK; + + /* Sanity Checks */ + if ( ( hParamMC = (PARAM_MC_ENC_HANDLE) malloc( sizeof( PARAM_MC_ENC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Paramtric MC\n" ) ); + } + + mc_input_setup = st_ivas->hEncoderConfig->mc_input_setup; + max_bwidth = st_ivas->hEncoderConfig->max_bwidth; + input_Fs = st_ivas->hEncoderConfig->input_Fs; + nchan_inp = st_ivas->hEncoderConfig->nchan_inp; + ivas_total_brate = st_ivas->hEncoderConfig->ivas_total_brate; + + /* Preparing Config */ + hParamMC->lfe_index = LFE_CHANNEL; + st_ivas->nchan_transport = ivas_param_mc_getNumTransportChannels( ivas_total_brate, mc_input_setup ); + + /* get configuration index */ + config_index = ivas_param_mc_get_configuration_index( mc_input_setup, ivas_total_brate ); + + /* set core coder dependent on the number of transport channels */ + switch ( st_ivas->nchan_transport ) + { + case 4: + case 3: + st_ivas->nCPE = 2; + st_ivas->nSCE = 0; + st_ivas->hEncoderConfig->element_mode_init = IVAS_CPE_MDCT; + break; + case 2: + st_ivas->nCPE = 1; + st_ivas->nSCE = 0; + st_ivas->hEncoderConfig->element_mode_init = IVAS_CPE_MDCT; + break; + } + + /* get dmx factors */ + hParamMC->dmx_factors = ivas_param_mc_conf[config_index].dmx_fac; + + /* set FB config. */ + if ( ( error = ivas_fb_set_cfg( &fb_cfg, MC_FORMAT, nchan_inp, 0, 0, input_Fs, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Allocate and initialize FB mixer handle */ + if ( ( error = ivas_FB_mixer_open( &( hParamMC->hFbMixer ), input_Fs, fb_cfg, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* open/init parameter coding */ + ivas_param_mc_metadata_open( mc_input_setup, hParamMC->lfe_index, ivas_total_brate, &hParamMC->hMetadataPMC ); + + /* init icc index states */ + for ( i = 0; i < PARAM_MC_PARAMETER_FRAMES; i++ ) + { + set_s( hParamMC->icc_map_index[i], -1, PARAM_MC_SZ_ICC_MAP ); + + for ( l = 0; l < hParamMC->hMetadataPMC.icc_mapping_conf->icc_map_size_lfe; l++ ) + { + for ( k = 0; k < hParamMC->hMetadataPMC.icc_map_size_full; k++ ) + { + if ( hParamMC->hMetadataPMC.icc_mapping[i][l][0] == hParamMC->hMetadataPMC.icc_map_full[0][k] && hParamMC->hMetadataPMC.icc_mapping[i][l][1] == hParamMC->hMetadataPMC.icc_map_full[1][k] ) + { + hParamMC->icc_map_index[i][l] = k; + } + } + } + } + + /* Band Grouping */ + if ( hParamMC->hMetadataPMC.num_parameter_bands == 20 ) + { + mvs2s( param_mc_band_grouping_20, hParamMC->band_grouping, 20 + 1 ); + } + else if ( hParamMC->hMetadataPMC.num_parameter_bands == 14 ) + { + mvs2s( param_mc_band_grouping_14, hParamMC->band_grouping, 14 + 1 ); + } + else if ( hParamMC->hMetadataPMC.num_parameter_bands == 10 ) + { + mvs2s( param_mc_band_grouping_10, hParamMC->band_grouping, 10 + 1 ); + } + else + { + assert( 0 && "nbands must be 20, 14, or 10!" ); + } + + /* set max parameter band for abs cov */ + i = 0; + while ( hParamMC->band_grouping[i] <= PARAM_MC_MAX_BAND_ABS_COV_ENC ) + { + hParamMC->max_param_band_abs_cov = ( i++ ); + } + + /* parameter band grouping: 60 band CLDFB to 240 band MDFT resolution */ + for ( i = 0; i < hParamMC->hMetadataPMC.num_parameter_bands + 1; i++ ) + { + hParamMC->band_grouping[i] *= PARAM_MC_CLDFB_TO_MDFT_FAC; + } + + /* set correct coded band width */ + hParamMC->hMetadataPMC.coded_bwidth = max_bwidth; + hParamMC->hMetadataPMC.last_coded_bwidth = max_bwidth; + ivas_param_mc_set_coded_bands( &hParamMC->hMetadataPMC ); + + /* initialize offset for transient detection */ + hParamMC->transient_detector_delay = ( NSUBBLOCKS_SHIFT + 1 ) + NSUBBLOCKS + 1 - (int16_t) ceilf( (float) NS2SA( input_Fs, DELAY_DIRAC_ENC_CMP_NS ) / (float) NS2SA( input_Fs, 2 * DIRAC_SLOT_NS ) ); + + /* Init total/dmx ener factors */ + set_f( hParamMC->ener_fac, 0.0f, PARAM_MC_MAX_PARAMETER_BANDS ); + + /* init previous ILDs */ + for ( i = 0; i < PARAM_MC_MAX_PARAMETER_BANDS; i++ ) + { + set_zero( hParamMC->prev_ilds[i], PARAM_MC_SZ_ILD_MAP ); + } + + st_ivas->hParamMC = hParamMC; + + return error; +} + + +/*------------------------------------------------------------------------- + * ivas_param_mc_enc_reconfig() + * + * Reconfigure Parametric MC encoder + *------------------------------------------------------------------------*/ + +ivas_error ivas_param_mc_enc_reconfig( + Encoder_Struct *st_ivas /* i/o: IVAS encoder handle */ +) +{ + int16_t i, k, l; + PARAM_MC_ENC_HANDLE hParamMC; + uint16_t config_index; + MC_LS_SETUP mc_input_setup; + int16_t max_bwidth; + int32_t input_Fs, ivas_total_brate; + ivas_error error; + + error = IVAS_ERR_OK; + + mc_input_setup = st_ivas->hEncoderConfig->mc_input_setup; + max_bwidth = st_ivas->hEncoderConfig->max_bwidth; + input_Fs = st_ivas->hEncoderConfig->input_Fs; + ivas_total_brate = st_ivas->hEncoderConfig->ivas_total_brate; + hParamMC = st_ivas->hParamMC; + + /* Preparing Config */ + st_ivas->nchan_transport = ivas_param_mc_getNumTransportChannels( ivas_total_brate, mc_input_setup ); + + /* get configuration index */ + config_index = ivas_param_mc_get_configuration_index( mc_input_setup, ivas_total_brate ); + + /* set core coder dependent on the number of transport channels */ + switch ( st_ivas->nchan_transport ) + { + case 4: + case 3: + st_ivas->nCPE = 2; + st_ivas->nSCE = 0; + st_ivas->hEncoderConfig->element_mode_init = IVAS_CPE_MDCT; + break; + case 2: + st_ivas->nCPE = 1; + st_ivas->nSCE = 0; + st_ivas->hEncoderConfig->element_mode_init = IVAS_CPE_MDCT; + break; + } + + /* get dmx factors */ + hParamMC->dmx_factors = ivas_param_mc_conf[config_index].dmx_fac; + + /* deallocate the full icc map, gets newly allocated in the metadata open function */ + for ( i = 0; i < 2; i++ ) + { + if ( hParamMC->hMetadataPMC.icc_map_full[i] != NULL ) + { + free( hParamMC->hMetadataPMC.icc_map_full[i] ); + hParamMC->hMetadataPMC.icc_map_full[i] = NULL; + } + } + + /* open/init parameter coding */ + ivas_param_mc_metadata_open( mc_input_setup, hParamMC->lfe_index, ivas_total_brate, &hParamMC->hMetadataPMC ); + + /* init icc index states */ + for ( i = 0; i < PARAM_MC_PARAMETER_FRAMES; i++ ) + { + set_s( hParamMC->icc_map_index[i], -1, PARAM_MC_SZ_ICC_MAP ); + + for ( l = 0; l < hParamMC->hMetadataPMC.icc_mapping_conf->icc_map_size_lfe; l++ ) + { + for ( k = 0; k < hParamMC->hMetadataPMC.icc_map_size_full; k++ ) + { + if ( hParamMC->hMetadataPMC.icc_mapping[i][l][0] == hParamMC->hMetadataPMC.icc_map_full[0][k] && hParamMC->hMetadataPMC.icc_mapping[i][l][1] == hParamMC->hMetadataPMC.icc_map_full[1][k] ) + { + hParamMC->icc_map_index[i][l] = k; + } + } + } + } + + /* Band Grouping */ + if ( hParamMC->hMetadataPMC.num_parameter_bands == 20 ) + { + mvs2s( param_mc_band_grouping_20, hParamMC->band_grouping, 20 + 1 ); + } + else if ( hParamMC->hMetadataPMC.num_parameter_bands == 14 ) + { + mvs2s( param_mc_band_grouping_14, hParamMC->band_grouping, 14 + 1 ); + } + else if ( hParamMC->hMetadataPMC.num_parameter_bands == 10 ) + { + mvs2s( param_mc_band_grouping_10, hParamMC->band_grouping, 10 + 1 ); + } + else + { + assert( 0 && "nbands must be 20, 14, or 10!" ); + } + + /* set max parameter band for abs cov */ + i = 0; + while ( hParamMC->band_grouping[i] <= PARAM_MC_MAX_BAND_ABS_COV_ENC ) + { + hParamMC->max_param_band_abs_cov = ( i++ ); + } + + /* parameter band grouping: 60 band CLDFB to 240 band MDFT resolution */ + for ( i = 0; i < hParamMC->hMetadataPMC.num_parameter_bands + 1; i++ ) + { + hParamMC->band_grouping[i] *= PARAM_MC_CLDFB_TO_MDFT_FAC; + } + + /* set correct coded band width */ + hParamMC->hMetadataPMC.coded_bwidth = max_bwidth; + hParamMC->hMetadataPMC.last_coded_bwidth = max_bwidth; + ivas_param_mc_set_coded_bands( &hParamMC->hMetadataPMC ); + + /* initialize offset for transient detection */ + hParamMC->transient_detector_delay = ( NSUBBLOCKS_SHIFT + 1 ) + NSUBBLOCKS + 1 - (int16_t) ceilf( (float) NS2SA( input_Fs, DELAY_DIRAC_ENC_CMP_NS ) / (float) NS2SA( input_Fs, 2 * DIRAC_SLOT_NS ) ); + + /* Init total/dmx ener factors */ + set_f( hParamMC->ener_fac, 0.0f, PARAM_MC_MAX_PARAMETER_BANDS ); + + + return error; +} + + +/*------------------------------------------------------------------------- + * ivas_param_mc_enc_close() + * + * Close Parametric MC encoder handle + *------------------------------------------------------------------------*/ + +void ivas_param_mc_enc_close( + PARAM_MC_ENC_HANDLE *hParamMC, /* i/o: Parametric MC encoder handle */ + const int32_t sampling_rate ) +{ + if ( hParamMC == NULL || *hParamMC == NULL ) + { + return; + } + + ivas_param_mc_metadata_close( &( *hParamMC )->hMetadataPMC ); + + ivas_FB_mixer_close( &( *hParamMC )->hFbMixer, sampling_rate, 0 ); + + free( ( *hParamMC ) ); + ( *hParamMC ) = NULL; + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_param_mc_enc() + * + * Parametric MC Encoder main encoding function + *------------------------------------------------------------------------*/ + +void ivas_param_mc_enc( + Encoder_Struct *st_ivas, /* i/o: IVAS Encoder handle */ + BSTR_ENC_HANDLE hMetaData, /* i/o: IVAS Metadata bitstream handle */ + float *data_f[], /* i/o: input/transport MC data */ + const int16_t input_frame /* i : input frame length */ +) +{ + int16_t k; + float Cy_sum[PARAM_MC_MAX_PARAMETER_BANDS][MAX_CICP_CHANNELS][MAX_CICP_CHANNELS]; + float Cx_sum[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS][PARAM_MC_MAX_TRANSPORT_CHANS]; + float ILD_q[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_SZ_ILD_MAP]; + int16_t ILD_idx[PARAM_MC_MAX_PARAMETER_BANDS * PARAM_MC_SZ_ILD_MAP]; + int16_t ICC_idx[PARAM_MC_MAX_PARAMETER_BANDS * PARAM_MC_SZ_ICC_MAP]; + uint16_t bit_buffer[PARAM_MC_MAX_BITS]; + int16_t bit_pos; + int16_t band_step; + float data_dmx[PARAM_MC_MAX_TRANSPORT_CHANS][L_FRAME48k]; + int16_t ch; + int16_t band; + PARAM_MC_ENC_HANDLE hParamMC; + int16_t nchan_inp; + + push_wmops( "param_mc_enc" ); + + /* initializations */ + hParamMC = st_ivas->hParamMC; + bit_pos = 0; + band_step = 1; + nchan_inp = st_ivas->hEncoderConfig->nchan_inp; + + for ( band = 0; band < PARAM_MC_MAX_PARAMETER_BANDS; band++ ) + { + for ( ch = 0; ch < MAX_CICP_CHANNELS; ch++ ) + { + set_zero( Cy_sum[band][ch], MAX_CICP_CHANNELS ); + } + for ( ch = 0; ch < PARAM_MC_MAX_TRANSPORT_CHANS; ch++ ) + { + set_zero( Cx_sum[band][ch], PARAM_MC_MAX_TRANSPORT_CHANS ); + } + } + + for ( band = 0; band < PARAM_MC_MAX_PARAMETER_BANDS; band++ ) + { + set_zero( ILD_q[band], PARAM_MC_SZ_ILD_MAP ); + } + set_s( ILD_idx, 0, PARAM_MC_MAX_PARAMETER_BANDS * PARAM_MC_SZ_ILD_MAP ); + set_s( ICC_idx, 0, PARAM_MC_MAX_PARAMETER_BANDS * PARAM_MC_SZ_ICC_MAP ); + + /* update parameter frame index */ + hParamMC->hMetadataPMC.param_frame_idx = ( hParamMC->hMetadataPMC.param_frame_idx + 1 ) % PARAM_MC_PARAMETER_FRAMES; + + /* DMX generation*/ + ivas_param_mc_dmx( hParamMC, data_f, data_dmx, input_frame, nchan_inp, st_ivas->nchan_transport ); + + /* Transient Detector */ + switch ( st_ivas->nchan_transport ) + { + case 2: + case 3: + case 4: + { + int16_t bAttackPresent[PARAM_MC_MAX_TRANSPORT_CHANS]; + int16_t attackIdx[PARAM_MC_MAX_TRANSPORT_CHANS]; + + set_s( attackIdx, -1, PARAM_MC_MAX_TRANSPORT_CHANS ); + set_s( bAttackPresent, 0, PARAM_MC_MAX_TRANSPORT_CHANS ); + + for ( ch = 0; ch < st_ivas->nchan_transport; ch++ ) + { + int16_t cpe_idx = ch / 2; + + RunTransientDetection( data_dmx[ch], input_frame, st_ivas->hCPE[cpe_idx]->hCoreCoder[ch - cpe_idx * CPE_CHANNELS]->hTranDet ); + + ivas_param_mc_transient_detection( hParamMC, st_ivas->hCPE[cpe_idx]->hCoreCoder[ch - cpe_idx * CPE_CHANNELS]->hTranDet, &bAttackPresent[ch], &attackIdx[ch] ); + } + + /* if more than one attack, use the earlier */ + hParamMC->hMetadataPMC.bAttackPresent = 0; + hParamMC->hMetadataPMC.attackIndex = 16; + + for ( ch = 0; ch < st_ivas->nchan_transport; ch++ ) + { + hParamMC->hMetadataPMC.bAttackPresent = max( hParamMC->hMetadataPMC.bAttackPresent, bAttackPresent[ch] ); + } + + if ( hParamMC->hMetadataPMC.bAttackPresent ) + { + for ( ch = 0; ch < st_ivas->nchan_transport; ch++ ) + { + hParamMC->hMetadataPMC.attackIndex = min( hParamMC->hMetadataPMC.attackIndex, attackIdx[ch] ); + } + } + else + { + hParamMC->hMetadataPMC.attackIndex = 0; + } + } + break; + } + + /* Encoding */ + /* parameter estimation*/ + ivas_param_mc_param_est_enc( hParamMC, data_f, Cy_sum, Cx_sum, input_frame, nchan_inp, st_ivas->nchan_transport ); + + band_step = hParamMC->hMetadataPMC.bAttackPresent ? PARAM_MC_TRANSIENT_BAND_STEP : 1; + + + /* ILD parameter quantization */ + for ( k = 0; k < hParamMC->hMetadataPMC.nbands_coded; k += band_step ) + { + ivas_param_mc_quantize_ilds( hParamMC, Cy_sum[k], Cx_sum[k], k, nchan_inp, st_ivas->nchan_transport, ILD_idx, ILD_q[k] ); + } + + /* get icc map */ + if ( hParamMC->hMetadataPMC.flag_use_adaptive_icc_map == 1 ) + { + ivas_param_mc_enc_find_icc_map( hParamMC, Cx_sum, Cy_sum, ILD_q, nchan_inp, st_ivas->nchan_transport ); + } + else + { + ivas_param_mc_default_icc_map( hParamMC->hMetadataPMC.icc_mapping_conf, hParamMC->hMetadataPMC.icc_mapping[hParamMC->hMetadataPMC.param_frame_idx] ); + } + + /* ICC parameter quantization */ + for ( k = 0; k < hParamMC->hMetadataPMC.nbands_coded; k += band_step ) + { + ivas_param_mc_quantize_iccs( hParamMC, Cy_sum[k], k, nchan_inp, ICC_idx ); + } + + /* time domain DMX generation*/ + /* just copy data_dmx generated above, contains already the downmix */ + for ( ch = 0; ch < st_ivas->nchan_transport; ch++ ) + { + mvr2r( data_dmx[ch], data_f[ch], input_frame ); + } + + /* we have to run the transient detector on the second channel of the last CPE if we + have an odd number of transport channels */ + if ( st_ivas->nchan_transport > 2 ) + { + for ( ; ch < st_ivas->nCPE * CPE_CHANNELS; ch++ ) + { + int16_t cpe_idx = ch / 2; + + set_zero( data_f[ch], input_frame ); + + RunTransientDetection( data_f[ch], input_frame, st_ivas->hCPE[cpe_idx]->hCoreCoder[ch - cpe_idx * CPE_CHANNELS]->hTranDet ); + } + } + + /* write Parametric MC side info bitstream into temporary buffer*/ + ivas_param_mc_write_bs( hParamMC, ILD_idx, ICC_idx, bit_buffer, &bit_pos ); + + /* push the Parametric MC side info from the temporary buffer into the medatdata bitstream*/ + push_next_bits( hMetaData, bit_buffer, bit_pos ); + + /* updates */ + hParamMC->hMetadataPMC.last_coded_bwidth = hParamMC->hMetadataPMC.coded_bwidth; + + pop_wmops(); + + return; +} + + +/*****************************************************************************************/ +/* local functions */ +/*****************************************************************************************/ + +/*------------------------------------------------------------------------- + * ivas_param_mc_dmx() + * + * Computes the time domain down mix signal + *------------------------------------------------------------------------*/ + +static void ivas_param_mc_dmx( + PARAM_MC_ENC_HANDLE hParamMC, /* i/o: Parametric MC encoder handle */ + float *data_f[], /* i : Input frame */ + float data_dmx[][L_FRAME48k], /* o : Down mixed frame */ + const int16_t input_frame, /* i : Input frame length */ + const int16_t nchan_input, /* i : number of input channels */ + const int16_t nchan_transport /* i : number of transport channels */ +) +{ + int16_t i; + const int16_t *idx; + int16_t dmx_ch; + int16_t inp_ch; + const float *p_dmx_fac; + + idx = Param_MC_index; + for ( i = 0; i < input_frame; i++ ) + { + p_dmx_fac = hParamMC->dmx_factors; + for ( dmx_ch = 0; dmx_ch < nchan_transport; dmx_ch++ ) + { + float *dmx_sample = &data_dmx[idx[dmx_ch]][i]; + *dmx_sample = 0.0f; + for ( inp_ch = 0; inp_ch < nchan_input; inp_ch++ ) + { + ( *dmx_sample ) += data_f[idx[inp_ch]][i] * ( *( p_dmx_fac++ ) ); + } + } + } + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_param_mc_param_est_enc() + * + * run the CLDFB analysis on the input signal + * estimate the input and down mix covariances + *------------------------------------------------------------------------*/ + +static void ivas_param_mc_param_est_enc( + PARAM_MC_ENC_HANDLE hParamMC, /* i/o: Parametric MC encoder handle */ + float *data_f[], /* i : Input frame in the time domain */ + float Cy_sum[][MAX_CICP_CHANNELS][MAX_CICP_CHANNELS], /* o : Covariance matrix for the original frame */ + float Cx_sum[][PARAM_MC_MAX_TRANSPORT_CHANS][PARAM_MC_MAX_TRANSPORT_CHANS], /* o : Covariance matrix for the downmixed frame */ + const int16_t input_frame, /* i : Input frame length */ + const int16_t nchan_input, /* i : number of input channels */ + const int16_t nchan_transport /* i : number of transport channels */ +) +{ + int16_t i, cur_cldfb_band, cur_param_band, ch_idx1, ch_idx2, inp_ch; + int16_t ts; + int16_t l_ts; + int16_t num_time_slots; + int16_t num_parameter_bands; + int16_t brange[2]; + int16_t band_step; + const int16_t *map_ls = Param_MC_index; /* Loudspeakers mapping */ + int16_t idx_ls; + float *pcm_in[MAX_CICP_CHANNELS]; + float slot_frame_f_real[MAX_CICP_CHANNELS][DIRAC_NO_FB_BANDS_MAX]; /* Output of the MDFT FB - real part */ + float slot_frame_f_imag[MAX_CICP_CHANNELS][DIRAC_NO_FB_BANDS_MAX]; /* Output of the MDFT FB - imag part */ + float *p_slot_frame_f_real[MAX_CICP_CHANNELS]; /* Output of the MDFT FB - real part */ + float *p_slot_frame_f_imag[MAX_CICP_CHANNELS]; /* Output of the MDFT FB - imag part */ + + float dmx_real[PARAM_MC_MAX_TRANSPORT_CHANS]; /* Downmix channel - Real Part */ + float dmx_imag[PARAM_MC_MAX_TRANSPORT_CHANS]; /* Downmix channel - Imag Part */ + float a, b, c, d; /* Tmp complex values */ + float Cy_sum_imag[PARAM_MC_MAX_PARAM_BAND_ABS_COV_ENC][MAX_CICP_CHANNELS][MAX_CICP_CHANNELS]; + float Cx_sum_imag[PARAM_MC_MAX_PARAM_BAND_ABS_COV_ENC][PARAM_MC_MAX_TRANSPORT_CHANS][PARAM_MC_MAX_TRANSPORT_CHANS]; + float real_part, imag_part; + int16_t start_ts; + const float *p_dmx_fac; + + push_wmops( "param_mc_prm_est" ); + + /* initializations */ + l_ts = input_frame / PARAM_MC_MDFT_NO_SLOTS; + num_time_slots = PARAM_MC_MDFT_NO_SLOTS; + start_ts = hParamMC->hMetadataPMC.bAttackPresent ? hParamMC->hMetadataPMC.attackIndex : 0; + num_parameter_bands = hParamMC->hMetadataPMC.nbands_coded; + band_step = 1; + + for ( cur_param_band = 0; cur_param_band < PARAM_MC_MAX_PARAM_BAND_ABS_COV_ENC; cur_param_band++ ) + { + for ( ch_idx1 = 0; ch_idx1 < MAX_CICP_CHANNELS; ch_idx1++ ) + { + set_zero( Cy_sum_imag[cur_param_band][ch_idx1], MAX_CICP_CHANNELS ); + } + + for ( ch_idx1 = 0; ch_idx1 < PARAM_MC_MAX_TRANSPORT_CHANS; ch_idx1++ ) + { + set_zero( Cx_sum_imag[cur_param_band][ch_idx1], PARAM_MC_MAX_TRANSPORT_CHANS ); + } + } + + /* Copy current frame to memory for delay compensation */ + for ( i = 0; i < nchan_input; i++ ) + { + idx_ls = map_ls[i]; + pcm_in[i] = data_f[idx_ls]; + p_slot_frame_f_real[i] = &slot_frame_f_real[i][0]; + p_slot_frame_f_imag[i] = &slot_frame_f_imag[i][0]; + } + + for ( ts = 0; ts < start_ts; ts++ ) + { + ivas_fb_mixer_update_prior_input( hParamMC->hFbMixer, pcm_in, l_ts, hParamMC->hFbMixer->fb_cfg->num_in_chans ); + for ( i = 0; i < nchan_input; i++ ) + { + pcm_in[i] += l_ts; + } + } + + for ( ts = start_ts; ts < num_time_slots; ts++ ) + { + ivas_fb_mixer_get_windowed_fr( hParamMC->hFbMixer, pcm_in, p_slot_frame_f_real, p_slot_frame_f_imag, l_ts, l_ts, hParamMC->hFbMixer->fb_cfg->num_in_chans ); + + ivas_fb_mixer_update_prior_input( hParamMC->hFbMixer, pcm_in, l_ts, hParamMC->hFbMixer->fb_cfg->num_in_chans ); + + for ( i = 0; i < nchan_input; i++ ) + { + pcm_in[i] += l_ts; + } + /* Computing the downmix */ + for ( cur_param_band = 0; cur_param_band < hParamMC->max_param_band_abs_cov; cur_param_band++ ) + { + brange[0] = hParamMC->band_grouping[cur_param_band]; + brange[1] = hParamMC->band_grouping[cur_param_band + 1]; + + for ( cur_cldfb_band = brange[0]; cur_cldfb_band < brange[1]; cur_cldfb_band++ ) + { + /* Cx for DMX */ + /* Real Part */ + p_dmx_fac = hParamMC->dmx_factors; + + for ( ch_idx1 = 0; ch_idx1 < nchan_transport; ++ch_idx1 ) + { + dmx_real[ch_idx1] = 0.0f; + dmx_imag[ch_idx1] = 0.0f; + for ( inp_ch = 0; inp_ch < nchan_input; inp_ch++ ) + { + dmx_real[ch_idx1] += slot_frame_f_real[inp_ch][cur_cldfb_band] * ( *p_dmx_fac ); + dmx_imag[ch_idx1] += slot_frame_f_imag[inp_ch][cur_cldfb_band] * ( *p_dmx_fac ); + p_dmx_fac++; + } + } + + /* Cx for transport channels */ + for ( ch_idx1 = 0; ch_idx1 < nchan_transport; ++ch_idx1 ) + { + for ( ch_idx2 = 0; ch_idx2 < nchan_transport; ++ch_idx2 ) + { + a = dmx_real[ch_idx1]; + b = dmx_imag[ch_idx1]; + c = dmx_real[ch_idx2]; + d = dmx_imag[ch_idx2]; + + /* (a-ib)(c+id) = ac + bd + i(ad-bc) */ + Cx_sum[cur_param_band][ch_idx1][ch_idx2] += a * c + b * d; + Cx_sum_imag[cur_param_band][ch_idx1][ch_idx2] += a * d - b * c; + } + } + + /* Cy for input channels */ + for ( ch_idx1 = 0; ch_idx1 < nchan_input; ++ch_idx1 ) + { + for ( ch_idx2 = ch_idx1; ch_idx2 < nchan_input; ++ch_idx2 ) + { + a = slot_frame_f_real[ch_idx1][cur_cldfb_band]; + b = slot_frame_f_imag[ch_idx1][cur_cldfb_band]; + c = slot_frame_f_real[ch_idx2][cur_cldfb_band]; + d = slot_frame_f_imag[ch_idx2][cur_cldfb_band]; + + /* (a-ib)(c+id) = ac + bd + i(ad-bc) */ + Cy_sum[cur_param_band][ch_idx1][ch_idx2] += a * c + b * d; + Cy_sum_imag[cur_param_band][ch_idx1][ch_idx2] += a * d - b * c; + } + } + } + } + + for ( ; cur_param_band < num_parameter_bands; cur_param_band++ ) + { + brange[0] = hParamMC->band_grouping[cur_param_band]; + brange[1] = hParamMC->band_grouping[cur_param_band + 1]; + + for ( cur_cldfb_band = brange[0]; cur_cldfb_band < brange[1]; cur_cldfb_band++ ) + { + /* Cx for DMX */ + /* Real Part */ + p_dmx_fac = hParamMC->dmx_factors; + + for ( ch_idx1 = 0; ch_idx1 < nchan_transport; ++ch_idx1 ) + { + dmx_real[ch_idx1] = 0.0f; + dmx_imag[ch_idx1] = 0.0f; + + for ( inp_ch = 0; inp_ch < nchan_input; inp_ch++ ) + { + dmx_real[ch_idx1] += slot_frame_f_real[inp_ch][cur_cldfb_band] * ( *p_dmx_fac ); + dmx_imag[ch_idx1] += slot_frame_f_imag[inp_ch][cur_cldfb_band] * ( *p_dmx_fac ); + p_dmx_fac++; + } + } + + /* Cx for transport channels */ + for ( ch_idx1 = 0; ch_idx1 < nchan_transport; ++ch_idx1 ) + { + for ( ch_idx2 = 0; ch_idx2 < nchan_transport; ++ch_idx2 ) + { + a = dmx_real[ch_idx1]; + b = dmx_imag[ch_idx1]; + c = dmx_real[ch_idx2]; + d = dmx_imag[ch_idx2]; + + /* (a-ib)(c+id) = ac + bd + i(ad-bc) */ + Cx_sum[cur_param_band][ch_idx1][ch_idx2] += a * c + b * d; + } + } + + /* Cy for input channels */ + for ( ch_idx1 = 0; ch_idx1 < nchan_input; ++ch_idx1 ) + { + for ( ch_idx2 = ch_idx1; ch_idx2 < nchan_input; ++ch_idx2 ) + { + a = slot_frame_f_real[ch_idx1][cur_cldfb_band]; + b = slot_frame_f_imag[ch_idx1][cur_cldfb_band]; + c = slot_frame_f_real[ch_idx2][cur_cldfb_band]; + d = slot_frame_f_imag[ch_idx2][cur_cldfb_band]; + + /* (a-ib)(c+id) = ac + bd + i(ad-bc) */ + Cy_sum[cur_param_band][ch_idx1][ch_idx2] += a * c + b * d; + } + } + } + } + } + + /* make sure energy and correlation is zero above the relevant LFE bands for LFE + * avoids wrong energy in case of band combining at transients */ + if ( hParamMC->lfe_index >= 0 ) + { + for ( cur_param_band = PARAM_MC_MAX_BAND_LFE; cur_param_band < hParamMC->max_param_band_abs_cov; cur_param_band++ ) + { + for ( ch_idx1 = 0; ch_idx1 < nchan_input; ++ch_idx1 ) + { + Cy_sum[cur_param_band][hParamMC->lfe_index][ch_idx1] = 0.0f; + Cy_sum[cur_param_band][ch_idx1][hParamMC->lfe_index] = 0.0f; + Cy_sum_imag[cur_param_band][hParamMC->lfe_index][ch_idx1] = 0.0f; + Cy_sum_imag[cur_param_band][ch_idx1][hParamMC->lfe_index] = 0.0f; + } + } + + for ( ; cur_param_band < num_parameter_bands; cur_param_band++ ) + { + for ( ch_idx1 = 0; ch_idx1 < nchan_input; ++ch_idx1 ) + { + Cy_sum[cur_param_band][hParamMC->lfe_index][ch_idx1] = 0.0f; + Cy_sum[cur_param_band][ch_idx1][hParamMC->lfe_index] = 0.0f; + } + } + } + + if ( !hParamMC->hMetadataPMC.bAttackPresent ) + { + const PARAM_MC_ILD_MAPPING *h_ild_mapping; + int16_t ild_attack; + ild_attack = 0; + h_ild_mapping = hParamMC->hMetadataPMC.ild_mapping_conf; + /* create ILDs for to non transmitted parameter bands (only lower half) */ + for ( cur_param_band = 0; cur_param_band < hParamMC->hMetadataPMC.num_parameter_bands / 2; cur_param_band++ ) + { + float ILD[PARAM_MC_SZ_ILD_MAP]; + int16_t k; + int16_t num_ilds_to_code; + + if ( cur_param_band >= PARAM_MC_MAX_BAND_LFE ) + { + num_ilds_to_code = hParamMC->hMetadataPMC.ild_mapping_conf->ild_map_size_wo_lfe; + } + else + { + num_ilds_to_code = hParamMC->hMetadataPMC.ild_mapping_conf->ild_map_size_lfe; + } + if ( hParamMC->hMetadataPMC.param_frame_idx != hParamMC->hMetadataPMC.coding_band_mapping[cur_param_band] ) + { + float Nrg[MAX_CICP_CHANNELS]; + + /* get ICLDs */ + for ( k = 0; k < nchan_input; ++k ) + { + Nrg[k] = Cy_sum[cur_param_band][k][k]; + } + for ( k = 0; k < num_ilds_to_code; ++k ) + { + float ref_ener = 0.0f; + int16_t ref_channel_cnt; + int16_t ref_channel_idx; + + for ( ref_channel_cnt = 0; ref_channel_cnt < h_ild_mapping->num_ref_channels[k]; ref_channel_cnt++ ) + { + ref_channel_idx = h_ild_mapping->ref_channel_idx[k][ref_channel_cnt]; + ref_ener += Cx_sum[cur_param_band][ref_channel_idx][ref_channel_idx]; + } + ILD[k] = 10.0f * log10f( ( Nrg[h_ild_mapping->ild_index[k]] + EPSILON ) / ( hParamMC->hMetadataPMC.ild_factors[k] * ref_ener + EPSILON ) ); + if ( hParamMC->prev_ilds[cur_param_band][k] - ILD[k] > param_mc_ild_diff_threshold[cur_param_band] ) + { + ild_attack++; + } + } + } + } + /* check if the ILDs change too much -> go into transient mode... */ + if ( ild_attack > PARAM_MC_NUM_ATTACK_ILD_THRESH ) + { + hParamMC->hMetadataPMC.bAttackPresent = 1; + } + } + + + if ( hParamMC->hMetadataPMC.bAttackPresent ) + { + /* combine bands */ + for ( cur_param_band = 1; cur_param_band < hParamMC->max_param_band_abs_cov; cur_param_band += 2 ) + { + for ( ch_idx1 = 0; ch_idx1 < nchan_transport; ++ch_idx1 ) + { + for ( ch_idx2 = 0; ch_idx2 < nchan_transport; ++ch_idx2 ) + { + Cx_sum[cur_param_band - 1][ch_idx1][ch_idx2] += Cx_sum[cur_param_band][ch_idx1][ch_idx2]; + Cx_sum_imag[cur_param_band - 1][ch_idx1][ch_idx2] += Cx_sum_imag[cur_param_band][ch_idx1][ch_idx2]; + } + } + + for ( ch_idx1 = 0; ch_idx1 < nchan_input; ++ch_idx1 ) + { + for ( ch_idx2 = ch_idx1; ch_idx2 < nchan_input; ++ch_idx2 ) + { + Cy_sum[cur_param_band - 1][ch_idx1][ch_idx2] += Cy_sum[cur_param_band][ch_idx1][ch_idx2]; + Cy_sum_imag[cur_param_band - 1][ch_idx1][ch_idx2] += Cy_sum_imag[cur_param_band][ch_idx1][ch_idx2]; + } + } + } + + for ( ; cur_param_band < num_parameter_bands; cur_param_band += 2 ) + { + if ( cur_param_band < num_parameter_bands ) + { + for ( ch_idx1 = 0; ch_idx1 < nchan_transport; ++ch_idx1 ) + { + for ( ch_idx2 = 0; ch_idx2 < nchan_transport; ++ch_idx2 ) + { + Cx_sum[cur_param_band - 1][ch_idx1][ch_idx2] += Cx_sum[cur_param_band][ch_idx1][ch_idx2]; + } + } + + for ( ch_idx1 = 0; ch_idx1 < nchan_input; ++ch_idx1 ) + { + for ( ch_idx2 = ch_idx1; ch_idx2 < nchan_input; ++ch_idx2 ) + { + Cy_sum[cur_param_band - 1][ch_idx1][ch_idx2] += Cy_sum[cur_param_band][ch_idx1][ch_idx2]; + } + } + } + } + + band_step = 2; + } + + + /* map complex covariances to real values */ + for ( cur_param_band = 0; cur_param_band < hParamMC->max_param_band_abs_cov; cur_param_band += band_step ) + { + /* Cx for transport channels */ + for ( ch_idx1 = 0; ch_idx1 < nchan_transport; ch_idx1++ ) + { + for ( ch_idx2 = 0; ch_idx2 < nchan_transport; ch_idx2++ ) + { + real_part = Cx_sum[cur_param_band][ch_idx1][ch_idx2]; + imag_part = Cx_sum_imag[cur_param_band][ch_idx1][ch_idx2]; + + /* (a-ib)(c+id) = ac + bd + i(ad-bc) */ + Cx_sum[cur_param_band][ch_idx1][ch_idx2] = sqrtf( real_part * real_part + imag_part * imag_part ); + } + } + + /* Cy for transport channels */ + for ( ch_idx1 = 0; ch_idx1 < nchan_input; ch_idx1++ ) + { + for ( ch_idx2 = ch_idx1; ch_idx2 < nchan_input; ch_idx2++ ) + { + real_part = Cy_sum[cur_param_band][ch_idx1][ch_idx2]; + imag_part = Cy_sum_imag[cur_param_band][ch_idx1][ch_idx2]; + Cy_sum[cur_param_band][ch_idx1][ch_idx2] = sqrtf( real_part * real_part + imag_part * imag_part ); + } + } + } + + if ( Cy_sum[0][LFE_CHANNEL][LFE_CHANNEL] < PARAM_MC_LFE_ON_THRESH ) + { + hParamMC->hMetadataPMC.lfe_on = 0; + } + else + { + hParamMC->hMetadataPMC.lfe_on = 1; + } + + pop_wmops(); + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_param_mc_enc_find_icc_map() + * + * decide which ICCs out of all possible ICCs should be sent + *------------------------------------------------------------------------*/ + +static void ivas_param_mc_enc_find_icc_map( + PARAM_MC_ENC_HANDLE hParamMC, /* i/o: Parametric MC encoder handle */ + float Cx_sum[][PARAM_MC_MAX_TRANSPORT_CHANS][PARAM_MC_MAX_TRANSPORT_CHANS], /* i : Covariance matrix for the downmixed frame */ + float Cy_sum[][MAX_CICP_CHANNELS][MAX_CICP_CHANNELS], /* i : Covariance matrix for the original frame */ + float ILD_q[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_SZ_ILD_MAP], /* i : quantized ILDs */ + const int16_t nchan_input, /* i : number of input channels */ + const int16_t nchan_transport /* i : number of transport channels */ +) +{ + float Cproto_band[MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS]; + float Cx_band[PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS]; + float mat_mult_buffer1[MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS]; + float mapped_error[55]; /* max number of possible mappings for 7.1+4 */ + int16_t icc_map_index[PARAM_MC_SZ_ICC_MAP]; + int16_t map_idx; + float *sorted_error_desc[PARAM_MC_SZ_ICC_MAP]; + int16_t cur_param_band, k, m, i; + int16_t bandstep; + int16_t last_element, el; + int16_t num_parameter_bands; + int16_t ch_idx1, ch_idx2; + int16_t icc_map_size; + int16_t icc_map_size_wo_lfe; + float Nrqq[MAX_OUTPUT_CHANNELS]; + float a[MAX_OUTPUT_CHANNELS]; + float Cy_band[MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS]; + + /* Initialisations */ + num_parameter_bands = hParamMC->hMetadataPMC.nbands_coded; + bandstep = hParamMC->hMetadataPMC.bAttackPresent ? 2 : 1; + set_f( mapped_error, 0.0f, 55 ); + set_s( icc_map_index, -1, PARAM_MC_SZ_ICC_MAP ); + icc_map_size_wo_lfe = hParamMC->hMetadataPMC.icc_mapping_conf->icc_map_size_wo_lfe; + icc_map_size = hParamMC->hMetadataPMC.icc_mapping_conf->icc_map_size_lfe; + + set_zero( Cy_band, nchan_input * nchan_input ); + + /* Estimate the target covariance like in the decoder using the + * already available qunantised ICLDs */ + for ( cur_param_band = 0; cur_param_band < num_parameter_bands; cur_param_band += bandstep ) + { + if ( hParamMC->hMetadataPMC.bAttackPresent || hParamMC->hMetadataPMC.coding_band_mapping[cur_param_band] == hParamMC->hMetadataPMC.param_frame_idx ) + { + /* transfer Cx_sum band to columnwise matrix */ + for ( ch_idx1 = 0; ch_idx1 < nchan_transport; ++ch_idx1 ) + { + for ( ch_idx2 = 0; ch_idx2 < nchan_transport; ++ch_idx2 ) + { + Cx_band[ch_idx1 + nchan_transport * ch_idx2] = Cx_sum[cur_param_band][ch_idx1][ch_idx2]; + } + } + + /* get estimated Cy from Cx and proto matrix */ + matrix_product( hParamMC->dmx_factors, nchan_input, nchan_transport, 0, + Cx_band, nchan_transport, nchan_transport, 0, + mat_mult_buffer1 ); + + matrix_product( mat_mult_buffer1, nchan_input, nchan_transport, 0, + hParamMC->dmx_factors, nchan_input, nchan_transport, 1, + Cproto_band ); + + set_zero( Nrqq, MAX_OUTPUT_CHANNELS ); + + /*get back Nrg*/ + for ( k = 0; k < nchan_input; k++ ) + { + float ref_ener = 0.0f; + int16_t ref_channel_cnt; + int16_t ref_channel_idx; + + for ( ref_channel_cnt = 0; ref_channel_cnt < hParamMC->hMetadataPMC.ild_mapping_conf->num_ref_channels[k]; ref_channel_cnt++ ) + { + ref_channel_idx = hParamMC->hMetadataPMC.ild_mapping_conf->ref_channel_idx[k][ref_channel_cnt]; + ref_ener += Cx_band[ref_channel_idx + ref_channel_idx * nchan_transport]; + } + Nrqq[hParamMC->hMetadataPMC.ild_mapping_conf->ild_index[k]] = powf( 10, ILD_q[cur_param_band][k] / 10.0f ) * hParamMC->hMetadataPMC.ild_factors[k] * ref_ener; + } + + /* apply quantized ICLDs in the estimated covariance */ + for ( k = 0; k < nchan_input; k++ ) + { + a[k] = sqrtf( Nrqq[k] ) / ( sqrtf( Cproto_band[k + nchan_input * k] ) + EPSILON ); + v_multc( Cproto_band + k * nchan_input, a[k], Cproto_band + k * nchan_input, nchan_input ); + } + + for ( k = 0; k < nchan_input; k++ ) + { + int16_t l; + float *Cyp = Cproto_band + k; + float ap = a[k]; + + for ( l = 0; l < nchan_input; l++ ) + { + ( *Cyp ) *= ap; + Cyp += nchan_input; + } + } + + /* transfer Cy_sum band to columnwise matrix */ + for ( ch_idx1 = 0; ch_idx1 < nchan_input; ++ch_idx1 ) + { + for ( ch_idx2 = 0; ch_idx2 < nchan_input; ++ch_idx2 ) + { + Cy_band[ch_idx1 + nchan_transport * ch_idx2] = Cy_sum[cur_param_band][ch_idx1][ch_idx2]; + } + } + + /* apply quantized ICLDs on the input covariance */ + for ( k = 0; k < nchan_input; k++ ) + { + a[k] = sqrtf( Nrqq[k] ) / ( sqrtf( Cy_band[k + nchan_input * k] ) + EPSILON ); + v_multc( Cy_band + k * nchan_input, a[k], Cy_band + k * nchan_input, nchan_input ); + } + + for ( k = 0; k < nchan_input; k++ ) + { + int16_t l; + float *Cyp = Cy_band + k; + float ap = a[k]; + + for ( l = 0; l < nchan_input; l++ ) + { + ( *Cyp ) *= ap; + Cyp += nchan_input; + } + } + + /* for all possible mappings, get the cumulated error between estimated and real Cy */ + for ( map_idx = 0; map_idx < hParamMC->hMetadataPMC.icc_map_size_full - 1; map_idx++ ) + { + int16_t idx0 = hParamMC->hMetadataPMC.icc_map_full[0][map_idx]; + int16_t idx1 = hParamMC->hMetadataPMC.icc_map_full[1][map_idx]; + mapped_error[map_idx] += fabsf( Cproto_band[idx0 + idx1 * nchan_input] - Cy_band[idx0 + idx1 * nchan_input] ); + } + } + } + + /* put a small bias on the error for the past transmitted indices*/ + if ( !hParamMC->hMetadataPMC.bAttackPresent ) + { + for ( i = 0; i < icc_map_size_wo_lfe; i++ ) + { + mapped_error[hParamMC->icc_map_index[hParamMC->hMetadataPMC.param_frame_idx][i]] *= PARAM_MC_ICC_ERROR_BIAS_FAC; + } + } + + /* get the mappings with the biggest expected errors as those who will be transmitted */ + for ( i = 0; i < hParamMC->hMetadataPMC.icc_map_size_full - 1; i++ ) + { + for ( k = 0; k < icc_map_size_wo_lfe; k++ ) + { + if ( icc_map_index[k] == -1 ) + { + /* not filled yet, take the value */ + icc_map_index[k] = i; + sorted_error_desc[k] = &mapped_error[i]; + break; + } + else if ( mapped_error[i] > *sorted_error_desc[k] ) + { + /* push all others down and insert value here */ + for ( m = icc_map_size_wo_lfe - 1; m >= k + 1; m-- ) + { + icc_map_index[m] = icc_map_index[m - 1]; + sorted_error_desc[m] = sorted_error_desc[m - 1]; + } + icc_map_index[k] = i; + sorted_error_desc[k] = &mapped_error[i]; + break; + } + } + } + + /* the indices in ascending order, simple bubble sort */ + for ( last_element = icc_map_size_wo_lfe - 1; last_element >= 0; last_element-- ) + { + for ( el = 0; el < last_element; el++ ) + { + if ( icc_map_index[el] > icc_map_index[el + 1] ) + { + int16_t swp_el = icc_map_index[el]; + icc_map_index[el] = icc_map_index[el + 1]; + icc_map_index[el + 1] = swp_el; + } + } + } + + /* last icc map element is always the C/LFE icc */ + icc_map_index[icc_map_size - 1] = hParamMC->hMetadataPMC.icc_map_size_full - 1; + + /* create map and map index, map index is sorted in ascending order*/ + if ( hParamMC->hMetadataPMC.bAttackPresent ) + { + for ( k = 0; k < PARAM_MC_PARAMETER_FRAMES; k++ ) + { + for ( i = 0; i < icc_map_size; i++ ) + { + hParamMC->hMetadataPMC.icc_mapping[k][i][0] = hParamMC->hMetadataPMC.icc_map_full[0][icc_map_index[i]]; + hParamMC->hMetadataPMC.icc_mapping[k][i][1] = hParamMC->hMetadataPMC.icc_map_full[1][icc_map_index[i]]; + } + mvs2s( icc_map_index, hParamMC->icc_map_index[k], icc_map_size ); + } + } + else + { + for ( i = 0; i < icc_map_size; i++ ) + { + hParamMC->hMetadataPMC.icc_mapping[hParamMC->hMetadataPMC.param_frame_idx][i][0] = hParamMC->hMetadataPMC.icc_map_full[0][icc_map_index[i]]; + hParamMC->hMetadataPMC.icc_mapping[hParamMC->hMetadataPMC.param_frame_idx][i][1] = hParamMC->hMetadataPMC.icc_map_full[1][icc_map_index[i]]; + } + + mvs2s( icc_map_index, hParamMC->icc_map_index[hParamMC->hMetadataPMC.param_frame_idx], icc_map_size ); + } + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_param_mc_quantize_ilds() + * + * Quantize the ILD parameters + *------------------------------------------------------------------------*/ + +static void ivas_param_mc_quantize_ilds( + PARAM_MC_ENC_HANDLE hParamMC, /* i/o: Parametric MC encoder handle */ + float Cy[MAX_CICP_CHANNELS][MAX_CICP_CHANNELS], /* i : Covariance matrix of the input */ + float Cx[PARAM_MC_MAX_TRANSPORT_CHANS][PARAM_MC_MAX_TRANSPORT_CHANS], /* i : Covariance matrix of the dmx */ + const int16_t freq_idx, /* i : frequency index being processed */ + const int16_t nchan_input, /* i : number of input channels */ + const int16_t nchan_transport, /* i : number of transport channels */ + int16_t *ILD_idx_out, /* o : ILD indices */ + float ILD_q[PARAM_MC_SZ_ILD_MAP] /* o : Quanzited ILD matrix */ +) +{ + int16_t k; + int16_t Ny; + int16_t num_ilds_to_code; + int16_t ild_map_size; + float Nrg[MAX_CICP_CHANNELS]; + float ILD[PARAM_MC_SZ_ILD_MAP]; + const PARAM_MC_ILD_MAPPING *h_ild_mapping; + float tot_ener, dmx_ener, ener_fac, delta_fac; + int16_t ILD_idx[PARAM_MC_SZ_ILD_MAP]; + + push_wmops( "param_mc_prm_q" ); + + /* Initialization */ + set_zero( Nrg, MAX_CICP_CHANNELS ); + set_zero( ILD, PARAM_MC_SZ_ILD_MAP ); + + Ny = nchan_input; + + h_ild_mapping = hParamMC->hMetadataPMC.ild_mapping_conf; + ild_map_size = hParamMC->hMetadataPMC.ild_mapping_conf->ild_map_size_lfe; + if ( freq_idx >= PARAM_MC_MAX_BAND_LFE ) + { + num_ilds_to_code = hParamMC->hMetadataPMC.ild_mapping_conf->ild_map_size_wo_lfe; + } + else + { + num_ilds_to_code = hParamMC->hMetadataPMC.ild_mapping_conf->ild_map_size_lfe; + } + + /* Downsampling */ + if ( ( hParamMC->hMetadataPMC.bAttackPresent == 0 ) && ( hParamMC->hMetadataPMC.param_frame_idx != hParamMC->hMetadataPMC.coding_band_mapping[freq_idx] ) ) + { + pop_wmops(); + + return; + } + + /* get ICLDs */ + for ( k = 0; k < Ny; ++k ) + { + Nrg[k] = Cy[k][k]; + } + + /* limit ILDs if DMX energy is lower than sum of channel energies */ + tot_ener = 0.0f; + dmx_ener = 0.0f; + + for ( k = 0; k < ild_map_size; k++ ) + { + if ( k != hParamMC->lfe_index || hParamMC->hMetadataPMC.lfe_on ) + { + tot_ener += Nrg[k]; + } + } + + for ( k = 0; k < nchan_transport; k++ ) + { + dmx_ener += Cx[k][k]; + } + ener_fac = 10.0f * log10f( ( tot_ener + EPSILON ) / ( dmx_ener + EPSILON ) ); + + if ( ener_fac > PARAM_MC_ENER_LIMIT_INTRAFRAME ) + { + float limit_fac; + limit_fac = powf( 10.0f, ( ( 0.3f * logf( ener_fac - PARAM_MC_ENER_LIMIT_INTRAFRAME + 1.0f ) - ( ener_fac - PARAM_MC_ENER_LIMIT_INTRAFRAME ) ) / 10.0f ) ); + v_multc( Nrg, limit_fac, Nrg, num_ilds_to_code ); + } + + /* limit ILD jumps in non-tranient frames */ + tot_ener = 0.0f; + dmx_ener = 0.0f; + + for ( k = 0; k < ild_map_size; k++ ) + { + if ( k != hParamMC->lfe_index || hParamMC->hMetadataPMC.lfe_on ) + { + tot_ener += Nrg[k]; + } + } + + for ( k = 0; k < nchan_transport; k++ ) + { + dmx_ener += Cx[k][k]; + } + + ener_fac = 10.0f * log10f( ( tot_ener + EPSILON ) / ( dmx_ener + EPSILON ) ); + delta_fac = ener_fac - hParamMC->ener_fac[freq_idx]; + + if ( !hParamMC->hMetadataPMC.bAttackPresent && ( delta_fac > PARAM_MC_ENER_LIMIT_INTERFRAME ) && ( delta_fac < PARAM_MC_ENER_LIMIT_MAX_DELTA_FAC ) ) + { + float limit_fac; + limit_fac = powf( 10.0f, ( ( 0.3f * logf( delta_fac - PARAM_MC_ENER_LIMIT_INTERFRAME + 1.0f ) - ( delta_fac - PARAM_MC_ENER_LIMIT_INTERFRAME ) ) / 10.0f ) ); + v_multc( Nrg, limit_fac, Nrg, num_ilds_to_code ); + ener_fac += 10.0f * log10f( limit_fac ); + } + + hParamMC->ener_fac[freq_idx] = ener_fac; + + /* update also combined bands ener_fac when in transient frame */ + if ( hParamMC->hMetadataPMC.bAttackPresent && ( ( freq_idx + 1 ) < hParamMC->hMetadataPMC.nbands_coded ) ) + { + hParamMC->ener_fac[freq_idx + 1] = ener_fac; + } + + for ( k = 0; k < num_ilds_to_code; ++k ) + { + float ref_ener = 0.0f; + int16_t ref_channel_cnt; + int16_t ref_channel_idx; + + for ( ref_channel_cnt = 0; ref_channel_cnt < h_ild_mapping->num_ref_channels[k]; ref_channel_cnt++ ) + { + ref_channel_idx = h_ild_mapping->ref_channel_idx[k][ref_channel_cnt]; + ref_ener += Cx[ref_channel_idx][ref_channel_idx]; + } + ILD[k] = 10.0f * log10f( ( Nrg[h_ild_mapping->ild_index[k]] + EPSILON ) / ( hParamMC->hMetadataPMC.ild_factors[k] * ref_ener + EPSILON ) ); + hParamMC->prev_ilds[freq_idx][k] = ILD[k]; + if ( hParamMC->hMetadataPMC.bAttackPresent && ( ( freq_idx + 1 ) < hParamMC->hMetadataPMC.nbands_coded ) ) + { + hParamMC->prev_ilds[freq_idx + 1][k] = ILD[k]; + } + } + + + /* quantize parameters */ + ivas_param_mc_parameter_quantizer( ILD, num_ilds_to_code, hParamMC->hMetadataPMC.ild_coding.quantizer_size, hParamMC->hMetadataPMC.ild_coding.quantizer, ILD_idx, ILD_q ); + + /* Save current quantized ICLDs */ + mvs2s( ILD_idx, ILD_idx_out + freq_idx * ild_map_size, num_ilds_to_code ); + + pop_wmops(); + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_param_mc_quantize_iccs() + * + * Quantize the ILD parameters + *------------------------------------------------------------------------*/ + +static void ivas_param_mc_quantize_iccs( + PARAM_MC_ENC_HANDLE hParamMC, /* i/o: Parametric MC encoder handle */ + float Cy[MAX_CICP_CHANNELS][MAX_CICP_CHANNELS], /* i : Covariance matrix of the input */ + const int16_t freq_idx, /* i : frequency index being processed */ + const int16_t nchan_input, /* i : number of input channels */ + int16_t *ICC_idx_out /* o : quantizer indices */ +) +{ + int16_t i, k; + int16_t Ny; + int16_t num_iccs_to_code; + int16_t icc_map_size; + float a; + int16_t tmp_map[2]; + float Nrg[MAX_CICP_CHANNELS]; + float ICC_vect[PARAM_MC_SZ_ICC_MAP]; + float ICC_vect_q[PARAM_MC_SZ_ICC_MAP]; + int16_t ICC_idx[PARAM_MC_SZ_ICC_MAP]; + + /* Initialization */ + set_zero( Nrg, MAX_CICP_CHANNELS ); + set_zero( ICC_vect, PARAM_MC_SZ_ICC_MAP ); + set_zero( ICC_vect_q, PARAM_MC_SZ_ICC_MAP ); + + Ny = nchan_input; + + /* Downsampling */ + if ( ( hParamMC->hMetadataPMC.bAttackPresent == 0 ) && ( hParamMC->hMetadataPMC.param_frame_idx != hParamMC->hMetadataPMC.coding_band_mapping[freq_idx] ) ) + { + return; + } + + icc_map_size = hParamMC->hMetadataPMC.icc_mapping_conf->icc_map_size_lfe; + num_iccs_to_code = icc_map_size; + + if ( freq_idx >= PARAM_MC_MAX_BAND_LFE ) + { + num_iccs_to_code = hParamMC->hMetadataPMC.icc_mapping_conf->icc_map_size_wo_lfe; + } + + /* Get ICC matrix from Cy */ + for ( k = 0; k < Ny; ++k ) + { + Nrg[k] = Cy[k][k]; + a = 1.0f / ( sqrtf( Nrg[k] ) + EPSILON ); + + for ( i = k; i < Ny; ++i ) + { + Cy[k][i] = Cy[k][i] * a; + } + + for ( i = 0; i <= k; i++ ) + { + Cy[i][k] = Cy[i][k] * a; + } + } + + /* set ICCs for zero channels to 1 to avoid artifacts in the decoded signal */ + for ( k = 0; k < Ny; ++k ) + { + if ( Nrg[k] == 0.0f ) + { + for ( i = k; i < Ny; ++i ) + { + Cy[k][i] = 1.0f; + } + + for ( i = 0; i <= k; ++i ) + { + Cy[i][k] = 1.0f; + } + } + } + + /* Reduce set of parameters and quantize them */ + for ( k = 0; k < num_iccs_to_code; ++k ) + { + tmp_map[0] = hParamMC->hMetadataPMC.icc_mapping[hParamMC->hMetadataPMC.param_frame_idx][k][0]; + tmp_map[1] = hParamMC->hMetadataPMC.icc_mapping[hParamMC->hMetadataPMC.param_frame_idx][k][1]; + ICC_vect[k] = Cy[tmp_map[0]][tmp_map[1]]; + } + + /* Quantization */ + ivas_param_mc_parameter_quantizer( ICC_vect, num_iccs_to_code, hParamMC->hMetadataPMC.icc_coding.quantizer_size, hParamMC->hMetadataPMC.icc_coding.quantizer, ICC_idx, ICC_vect_q ); + + /* Save current quantized ICCs */ + mvs2s( ICC_idx, ICC_idx_out + freq_idx * icc_map_size, num_iccs_to_code ); + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_param_mc_parameter_quantizer() + * + * Parameter Quantization + *------------------------------------------------------------------------*/ + +static void ivas_param_mc_parameter_quantizer( + const float *x, /* i : input sequence */ + const int16_t L, /* i : input length */ + const int16_t sz_quantizer, /* i : quantizer size */ + const float *quantizer, /* i : quantizer table */ + int16_t *quant_idx, /* o : quant indices */ + float *y /* o : output sequence */ +) +{ + int16_t idx, i; + int16_t idx_min; + float tmp_min; + + set_f( y, 0.0f, L ); + idx_min = 0; + + for ( idx = 0; idx < L; ++idx ) + { + tmp_min = 1000.0f; + for ( i = 0; i < sz_quantizer; ++i ) + { + if ( fabsf( x[idx] - quantizer[i] ) < tmp_min ) + { + tmp_min = fabsf( x[idx] - quantizer[i] ); + idx_min = i; + } + } + + y[idx] = quantizer[idx_min]; + quant_idx[idx] = idx_min; + } + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_param_mc_transient_detection() + * + * Detect if the current frame has a transient + *------------------------------------------------------------------------*/ + +static void ivas_param_mc_transient_detection( + PARAM_MC_ENC_HANDLE hParamMC, /* i : Parametric MC encoder handle */ + TRAN_DET_HANDLE hTranDet, /* i : Transient detector handle from core coder for a transport channel */ + int16_t *pbIsAttackPresent, /* o : Flag for indicating a found transient */ + int16_t *pAttackIndex /* o : Attack position (0 if no attack) */ +) +{ + int16_t i; + int16_t bIsAttackPresent, attackIndex; + float *pSubblockNrg; + float *pAccSubblockNrg; + float attackRatioThreshold; + + push_wmops( "param_mc_trn_det" ); + + attackRatioThreshold = hTranDet->transientDetector.attackRatioThreshold; + pSubblockNrg = &hTranDet->subblockEnergies.subblockNrg[hParamMC->transient_detector_delay]; + pAccSubblockNrg = &hTranDet->subblockEnergies.accSubblockNrg[hParamMC->transient_detector_delay]; + + bIsAttackPresent = FALSE; + attackIndex = 16; + + /* Search for the last attack in the subblocks, + * if we had an attack very late in the last frame, + * make the current frame also a transient one... */ + if ( ( pSubblockNrg[-1] > pAccSubblockNrg[-1] * attackRatioThreshold ) || ( pSubblockNrg[-2] > pAccSubblockNrg[-2] * attackRatioThreshold ) ) + { + bIsAttackPresent = TRUE; + attackIndex = 0; + } + + for ( i = 0; i < NSUBBLOCKS; i++ ) + { + if ( pSubblockNrg[i] > pAccSubblockNrg[i] * attackRatioThreshold ) + { + bIsAttackPresent = TRUE; + attackIndex = i; + } + } + + /* avoid post-echos on click sounds (very short transients) due to TNS aliasing */ + *pAttackIndex = attackIndex; + *pbIsAttackPresent = bIsAttackPresent; + + pop_wmops(); + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_param_mc_entropy_encoder() + * + * Write the metadata bitstream + *------------------------------------------------------------------------*/ + +static void ivas_param_mc_write_bs( + const PARAM_MC_ENC_HANDLE hParamMC, /* i/o: Parametric MC encoder Handle */ + int16_t *ILD_idx, /* i : ILD quantizer indices sequence */ + int16_t *ICC_idx, /* i : ICC quantizer indices sequence */ + uint16_t bit_buffer[PARAM_MC_MAX_BITS], /* o : Output bit buffer */ + int16_t *bit_pos /* o : Number of bits used */ +) +{ + int16_t i, pos; + int16_t nbands; + int16_t band_step; + int16_t seq_tmp[PARAM_MC_MAX_PARAMETER_BANDS * PARAM_MC_SZ_ILD_MAP]; + float seq_tmp_uni[PARAM_MC_MAX_PARAMETER_BANDS * PARAM_MC_SZ_ILD_MAP]; + int16_t icc_map_size_wo_lfe; + int16_t icc_map_size; + int16_t ild_map_size_wo_lfe; + int16_t ild_map_size; + + push_wmops( "param_mc_prm_enc" ); + + /* Init */ + set_zero( seq_tmp_uni, PARAM_MC_MAX_PARAMETER_BANDS * PARAM_MC_SZ_ILD_MAP ); + set_s( seq_tmp, 0, PARAM_MC_MAX_PARAMETER_BANDS * PARAM_MC_SZ_ILD_MAP ); + nbands = hParamMC->hMetadataPMC.nbands_in_param_frame[hParamMC->hMetadataPMC.param_frame_idx]; + icc_map_size_wo_lfe = hParamMC->hMetadataPMC.icc_mapping_conf->icc_map_size_wo_lfe; + icc_map_size = hParamMC->hMetadataPMC.icc_mapping_conf->icc_map_size_lfe; + ild_map_size_wo_lfe = hParamMC->hMetadataPMC.ild_mapping_conf->ild_map_size_wo_lfe; + ild_map_size = hParamMC->hMetadataPMC.ild_mapping_conf->ild_map_size_lfe; + + /*-----------------------------------------------------------------* + * Signaling bits + *-----------------------------------------------------------------*/ + + /* reserved bit */ + bit_buffer[( *bit_pos )++] = hParamMC->hMetadataPMC.lfe_on; + + /* write coded band width */ + i = hParamMC->hMetadataPMC.coded_bwidth; + for ( pos = 0; pos < 2; pos++ ) + { + bit_buffer[( *bit_pos )++] = (uint16_t) ( ( i >> pos ) & 1 ); + } + + /* write param frame indicator */ + bit_buffer[( *bit_pos )++] = hParamMC->hMetadataPMC.param_frame_idx; + + /* write transient frame indicator */ + bit_buffer[( *bit_pos )++] = hParamMC->hMetadataPMC.bAttackPresent; + + band_step = 1; + if ( hParamMC->hMetadataPMC.bAttackPresent ) + { + band_step = PARAM_MC_TRANSIENT_BAND_STEP; + for ( pos = 2; pos >= 0; --pos ) + { + bit_buffer[( *bit_pos )++] = (uint16_t) ( ( hParamMC->hMetadataPMC.attackIndex >> pos ) & 1 ); + } + nbands = hParamMC->hMetadataPMC.nbands_coded / band_step + ( ( hParamMC->hMetadataPMC.nbands_coded % band_step ) ? 1 : 0 ); + } + + /* Encoding of the ICC mapping done as simple bitmap */ + if ( hParamMC->hMetadataPMC.flag_use_adaptive_icc_map == 1 ) + { + uint16_t *bit_buffer_icc_mapping = &bit_buffer[*bit_pos]; + + for ( i = 0; i < hParamMC->hMetadataPMC.icc_map_size_full - 1; i++ ) + { + bit_buffer_icc_mapping[i] = 0; + } + + for ( i = 0; i < icc_map_size_wo_lfe; i++ ) + { + bit_buffer_icc_mapping[hParamMC->icc_map_index[hParamMC->hMetadataPMC.param_frame_idx][i]] = 1; + } + + *bit_pos += hParamMC->hMetadataPMC.icc_map_size_full - 1; + } + + ivas_param_mc_encode_parameter( ICC_idx, &hParamMC->hMetadataPMC, &hParamMC->hMetadataPMC.icc_coding, + nbands, band_step, icc_map_size_wo_lfe, icc_map_size, bit_buffer, bit_pos ); + + ivas_param_mc_encode_parameter( ILD_idx, &hParamMC->hMetadataPMC, &hParamMC->hMetadataPMC.ild_coding, + nbands, band_step, ild_map_size_wo_lfe, ild_map_size, bit_buffer, bit_pos ); + pop_wmops(); + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_param_mc_encode_parameter() + * + * (entropy) encode a sequence of parameter indices + *------------------------------------------------------------------------*/ + +static void ivas_param_mc_encode_parameter( + int16_t *quant_idx, /* i : indices sequence to encode */ + HANDLE_IVAS_PARAM_MC_METADATA hMetadataPMC, /* i : Parametric MC metadata handle */ + HANDLE_PARAM_MC_PARAMETER_CODING_INFO hParameterCodingInfo, /* i : parameter quantization and coding info */ + const int16_t nbands, /* i : number of parameter bands to encode */ + const int16_t band_step, /* i : parameter band step */ + const int16_t map_size_wo_lfe, /* i : number of parameters per band (w/o LFE) */ + const int16_t map_size, /* i : number of parameters per band */ + uint16_t bit_buffer[PARAM_MC_MAX_BITS], /* o : Output bit buffer */ + int16_t *bit_pos /* o : Number of bits used */ +) +{ + int16_t sz_seq; + int16_t idx_prev; + int16_t idx_offset; + int16_t bit_cnt_uni; + int16_t bit_cnt_range; + int16_t bit_cnt_range_diff; + int16_t bit_cnt_range_min; + int16_t bit_pos_tmp; + int16_t i, j; + int16_t idx; + int16_t seq_delta[PARAM_MC_MAX_PARAMETER_BANDS * PARAM_MC_MAX_VAL_MAP_SIZE]; + int16_t seq[PARAM_MC_MAX_PARAMETER_BANDS * PARAM_MC_MAX_VAL_MAP_SIZE]; + uint16_t tmp_bit_buffer[PARAM_MC_MAX_BITS]; + uint16_t tmp_bit_buffer_diff[PARAM_MC_MAX_BITS]; + + /* Inits */ + sz_seq = nbands * ( map_size_wo_lfe ); + + /* Computing Delta Sequence */ + idx_prev = hParameterCodingInfo->quantizer_size / 2 + hParameterCodingInfo->quantizer_size % 2 - 1; + idx_offset = hParameterCodingInfo->quantizer_size - 1; + + for ( j = 0; j < map_size_wo_lfe; ++j ) + { + int16_t coding_band = 0; + + for ( i = 0; i < hMetadataPMC->nbands_coded; i += band_step ) + { + if ( hMetadataPMC->bAttackPresent || hMetadataPMC->param_frame_idx == hMetadataPMC->coding_band_mapping[i] ) + { + idx = quant_idx[i * map_size + j]; + seq[coding_band + j * nbands] = idx; + seq_delta[coding_band + j * nbands] = idx - idx_prev + idx_offset; + idx_prev = idx; + coding_band++; + } + } + } + + /* LFE */ + if ( hMetadataPMC->lfe_on ) + { + for ( i = 0; i < PARAM_MC_MAX_BAND_LFE; i += band_step ) + { + if ( hMetadataPMC->bAttackPresent || hMetadataPMC->param_frame_idx == hMetadataPMC->coding_band_mapping[i] ) + { + /* LFE ICC/ILDs are always the last ones in coding band 0 */ + int16_t n_lfe_idx, k; + n_lfe_idx = map_size - map_size_wo_lfe; + for ( k = 0; k < n_lfe_idx; k++ ) + { + idx = quant_idx[( i + 1 ) * map_size - n_lfe_idx + k]; + seq[sz_seq] = idx; + seq_delta[sz_seq] = idx - idx_prev + idx_offset; + idx_prev = idx; + sz_seq++; + } + } + } + } + + + bit_cnt_uni = sz_seq * hParameterCodingInfo->uni_bits - 1; /* -1 for the additional diff/direct signaling bit for the range encoder*/ + + /* code the direct index sequence */ + ivas_param_mc_range_encoder( seq, sz_seq, hParameterCodingInfo->cum_freq, hParameterCodingInfo->sym_freq, PARAM_MC_RANGE_CODER_TOT_SHIFT, bit_cnt_uni, &tmp_bit_buffer[0], &bit_cnt_range ); + + /* Coding the delta index sequence */ + ivas_param_mc_range_encoder( seq_delta, sz_seq, hParameterCodingInfo->cum_freq_delta, hParameterCodingInfo->sym_freq_delta, PARAM_MC_RANGE_CODER_TOT_SHIFT, bit_cnt_uni, &tmp_bit_buffer_diff[0], &bit_cnt_range_diff ); + + bit_cnt_range_min = min( bit_cnt_range, bit_cnt_range_diff ); + + /* uniform fallback */ + if ( bit_cnt_range_min > bit_cnt_uni ) + { + /* Uniform coding is used */ + bit_buffer[( *bit_pos )++] = 0; + bit_pos_tmp = 0; + + for ( i = 0; i < sz_seq; ++i ) + { + ivas_param_mc_dec2bin( seq[i], hParameterCodingInfo->uni_bits, &bit_buffer[*( bit_pos ) + bit_pos_tmp] ); + bit_pos_tmp += hParameterCodingInfo->uni_bits; + } + *bit_pos = *bit_pos + bit_pos_tmp; + } + else + { + /* Range Coding is used */ + bit_buffer[( *bit_pos )++] = 1; + if ( bit_cnt_range_diff < bit_cnt_range ) + { + bit_buffer[( *bit_pos )++] = 1; + for ( i = 0; i < bit_cnt_range_diff; i++ ) + { + bit_buffer[( *bit_pos )++] = tmp_bit_buffer_diff[i]; + } + } + else + { + bit_buffer[( *bit_pos )++] = 0; + for ( i = 0; i < bit_cnt_range; i++ ) + { + bit_buffer[( *bit_pos )++] = tmp_bit_buffer[i]; + } + } + } + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_param_mc_dec2bin() + * + * Decimal to binary routine + *------------------------------------------------------------------------*/ + +static void ivas_param_mc_dec2bin( + const int16_t val, /* i : value to encode */ + const int16_t N, /* i : number of bits for encoding the value */ + uint16_t bits[PARAM_MC_MAX_BITS] ) /* o : encoded bits buffer */ +{ + int16_t idx; + + idx = 0; + /* convert value to bitstream, MSB first */ + for ( idx = 0; idx < N; idx++ ) + { + bits[idx] = ( val >> ( N - 1 - idx ) ) & 1; + } + + return; +} + + +/*-------------------------------------------------------------------* + * ivas_param_mc_range_encoder() + * + * Parametric MC Range encoder + *-------------------------------------------------------------------*/ + +static void ivas_param_mc_range_encoder( + const int16_t *seq_in, /* i : input sequence */ + const int16_t num_symbols, /* i : Number of symbole to encode */ + const uint16_t *cum_freq, /* i : cumulated frequencies */ + const uint16_t *sym_freq, /* i : symbol frequencies */ + const uint16_t tot_shift, /* i : max cumulative freq as power of 2 */ + const int16_t max_nb_bits, /* i : Maximum number of bits allowed */ + uint16_t *bit_buffer, /* o : output bit buffer */ + int16_t *bit_pos /* o : number of bits used */ +) +{ + RangeUniEncState rc_st_enc; + int16_t rc_tot_bits; /* No. of bits returned by range coder */ + int16_t i; + uint8_t k, byte; + uint16_t *bits; + + /* Initialize range encoder */ + rc_uni_enc_init( &rc_st_enc ); + + /* Main loop over the length of the sequence */ + for ( i = 0; i < num_symbols; ++i ) + { + rc_uni_enc_encode_symbol_fastS( &rc_st_enc, (uint16_t) seq_in[i], cum_freq, sym_freq, tot_shift ); + + if ( rc_uni_enc_virtual_finish( &rc_st_enc ) > max_nb_bits ) + { + /* we alread have exceeded the maximum number of bits allowed, i.e. the uniform fallback */ + *bit_pos = MAX_BITS_PER_FRAME; + return; + } + } + + /* Finish range encoder */ + rc_tot_bits = rc_uni_enc_finish( &rc_st_enc ); /* No. of bits consumed by range coder */ + + /* Push range coded bits from byte_buffer to bitstream */ + + /* 1) Push all complete bytes, one byte at a time */ + for ( i = 0; i < ( rc_tot_bits >> 3 ); ++i ) + { + /* use rc_st_enc.byte_buffer */ + bits = &bit_buffer[i * 8]; + + byte = rc_st_enc.byte_buffer[i]; + + bits[0] = ( byte >> 7 ) & 1; + bits[1] = ( byte >> 6 ) & 1; + bits[2] = ( byte >> 5 ) & 1; + bits[3] = ( byte >> 4 ) & 1; + bits[4] = ( byte >> 3 ) & 1; + bits[5] = ( byte >> 2 ) & 1; + bits[6] = ( byte >> 1 ) & 1; + bits[7] = byte & 1; + } + + /* 2) Push remaining bits */ + if ( ( rc_tot_bits & 7 ) != 0 ) + { + uint8_t rem_bits = rc_tot_bits & 7; + + bits = &bit_buffer[i * 8]; + byte = rc_st_enc.byte_buffer[i]; + + for ( k = 0; k < rem_bits; k++ ) + { + bits[k] = ( byte >> ( 7 - k ) ) & 1; + } + } + + /* Update output number of bits */ + *bit_pos = rc_tot_bits; + + return; +} diff --git a/lib_enc/ivas_mc_paramupmix_enc.c b/lib_enc/ivas_mc_paramupmix_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..11a38d4d5284592a89359b9dda7ca6896a452075 --- /dev/null +++ b/lib_enc/ivas_mc_paramupmix_enc.c @@ -0,0 +1,842 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include "options.h" +#include "cnst.h" +#include "rom_enc.h" +#include "rom_com.h" +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_cnst.h" +#include "ivas_rom_com.h" +#include "ivas_rom_enc.h" +#include "wmc_auto.h" + +/*------------------------------------------------------------------------- + * Local function prototypes + *------------------------------------------------------------------------*/ + +static void ivas_mc_paramupmix_dmx( MC_PARAMUPMIX_ENC_HANDLE hMCParamUpmix, float *data_f[], const int16_t input_frame ); + +static void ivas_mc_paramupmix_param_est_enc( MC_PARAMUPMIX_ENC_HANDLE hMCParamUpmix, float *input_frame_t[], const int16_t input_frame, float alphas[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS], float betas[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS] ); + +static void get_huff_table( const PAR_TYPE par_type, const QUANT_TYPE quant_type, HUFF_TAB *df0, HUFF_TAB *df, HUFF_TAB *dt ); + +static void write_huff_bits( const int32_t value, const uint16_t length, uint16_t bit_buffer[MC_PARAMUPMIX_MAX_BITS], int16_t *bit_pos ); + +static void huffman_encode( const int16_t bdfOnly, const int16_t bdtAllowed, const int16_t nv, const int16_t ivStart, const int32_t *vqPrev, const int32_t *vq, const PAR_TYPE parType, const QUANT_TYPE quant_type, const int16_t nq, uint16_t bit_buffer[MC_PARAMUPMIX_MAX_BITS], int16_t *bit_pos ); + +static void put_ec_data( MC_PARAMUPMIX_ENC_HANDLE hMCParamUpmix, const int16_t ch, const float pars[IVAS_MAX_NUM_BANDS], const float alphas[IVAS_MAX_NUM_BANDS], const PAR_TYPE parType, uint16_t bit_buffer[MC_PARAMUPMIX_MAX_BITS], int16_t *bit_pos ); + +static void quantize_alpha( const int16_t nv, const float *alpha, const QUANT_TYPE quant_type, int16_t *pnq, int32_t aq[IVAS_MAX_NUM_BANDS], float *adeq ); + +static void quantize_pars( const int16_t nv, const float *v, const int16_t nq, const float *data, int32_t vq[IVAS_MAX_NUM_BANDS], float *vdeq ); + +static void quantize_pars( const int16_t nv, const float *v, const int16_t nq, const float *data, int32_t vq[IVAS_MAX_NUM_BANDS], float *vdeq ); + + +/*------------------------------------------------------------------------- + * ivas_mc_paramupmix_enc() + * + * MC ParamUpmix Encoder main encoding function + *------------------------------------------------------------------------*/ + +void ivas_mc_paramupmix_enc( + Encoder_Struct *st_ivas, /* i/o: IVAS Encoder handle */ + BSTR_ENC_HANDLE hBStr, /* i/o: IVAS Metadata bitstream handle */ + float *data_f[], /* i/o: input/transport MC data */ + const int16_t input_frame /* i : input frame length */ +) +{ + MC_PARAMUPMIX_ENC_HANDLE hMCParamUpmix; + int16_t i; + float alphas[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS]; + float betas[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS]; + uint16_t bit_buffer[MC_PARAMUPMIX_MAX_BITS]; + int16_t bit_pos; + + push_wmops( "mc_paramupmix_enc" ); + + hMCParamUpmix = st_ivas->hMCParamUpmix; + bit_pos = 0; + + /* Parameter estimation */ + ivas_mc_paramupmix_param_est_enc( hMCParamUpmix, data_f, input_frame, alphas, betas ); + + for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ ) + { + put_ec_data( hMCParamUpmix, i, alphas[i], NULL, ALPHA, bit_buffer, &bit_pos ); + put_ec_data( hMCParamUpmix, i, betas[i], alphas[i], BETA, bit_buffer, &bit_pos ); + } + + /* push the PARAM UPMIX MC side info from the temporary buffer into the medatdata bitstream*/ + push_next_bits( hBStr, bit_buffer, bit_pos ); + + /* DMX generation*/ + ivas_mc_paramupmix_dmx( hMCParamUpmix, data_f, input_frame ); + + pop_wmops(); + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_mc_paramupmix_enc_open() + * + * Initialize MC ParamUpmix encoder handle + *------------------------------------------------------------------------*/ + +ivas_error ivas_mc_paramupmix_enc_open( + Encoder_Struct *st_ivas /* i/o: IVAS encoder handle */ +) +{ + IVAS_FB_CFG *fb_cfg; + MC_PARAMUPMIX_ENC_HANDLE hMCParamUpmix; + int32_t input_Fs; + int32_t input_frame; + int16_t i, k, b, j; + ivas_error error; + + error = IVAS_ERR_OK; + input_Fs = st_ivas->hEncoderConfig->input_Fs; + input_frame = (int32_t) st_ivas->hEncoderConfig->input_Fs / FRAMES_PER_SEC; + + /* Sanity Checks */ + if ( ( hMCParamUpmix = (MC_PARAMUPMIX_ENC_HANDLE) malloc( sizeof( MC_PARAMUPMIX_ENC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MC_MODE_PARAMUPMIX\n" ) ); + } + for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ ) + { + for ( k = 0; k < MC_PARAMUPMIX_NCH; k++ ) + { + if ( ( hMCParamUpmix->midside[i][k] = (float *) malloc( sizeof( float ) * input_frame ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MC_MODE_PARAMUPMIX\n" ) ); + } + set_zero( hMCParamUpmix->midside[i][k], (int16_t) input_frame ); + } + } + hMCParamUpmix->first_frame = 1; + + /* MC_LS_SETUP_5_1_2 is the only current configuration */ + st_ivas->nchan_transport = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS; + + /* set core coder dependent on the number of transport channels */ + switch ( st_ivas->nchan_transport ) + { + case 8: + st_ivas->nCPE = 4; + st_ivas->nSCE = 0; + st_ivas->hEncoderConfig->element_mode_init = IVAS_CPE_MDCT; + break; + } + + /* Transient Detector handle */ + for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH; i++ ) + { + if ( ( error = ivas_transient_det_open( &( hMCParamUpmix->hTranDet[i] ), input_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* set FB config. */ + /* need to set num output channels to a value > 0 to get pFb != NULL */ + if ( ( error = ivas_fb_set_cfg( &fb_cfg, MC_FORMAT, MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH, MC_PARAMUPMIX_COMBINATIONS, 0, input_Fs, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + + fb_cfg->remix_order = mc_paramupmix_fb_remix_order; + /* override latency, could be moved to ivas_fb_set_cfg */ + /* assuming parameters are calculated at end of frame, compensate for MCT delay and half of decoder fb */ + /* still 1.5ms off, since MCT delay is not large enough */ + /* param at end of frame */ + fb_cfg->prior_input_length = (int16_t) ( NS2SA( input_Fs, 12000000L ) + NS2SA( input_Fs, DELAY_FB_4_NS / 2 ) - input_frame / 2 - NS2SA( input_Fs, DELAY_FB_1_NS / 2 ) ); + fb_cfg->prior_input_length = (int16_t) max( fb_cfg->prior_input_length, input_frame / MAX_PARAM_SPATIAL_SUBFRAMES ); + + /* Allocate and initialize FB mixer handle */ + if ( ( error = ivas_FB_mixer_open( &( hMCParamUpmix->hFbMixer ), input_Fs, fb_cfg, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + + for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ ) + { + /* Covariance handle */ + if ( ( error = ivas_spar_covar_enc_open( &( hMCParamUpmix->hCovEnc[i] ), hMCParamUpmix->hFbMixer->pFb, input_Fs, MC_PARAMUPMIX_NCH + 1, COV_SMOOTH_MC, st_ivas->hEncoderConfig->ivas_total_brate ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + for ( b = 0; b < MC_PARAMUPMIX_COMBINATIONS; b++ ) + { + if ( ( hMCParamUpmix->cov_real[b] = (float ***) malloc( MC_PARAMUPMIX_NCH * sizeof( float ** ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR cov real matrix" ); + } + for ( i = 0; i < MC_PARAMUPMIX_NCH; i++ ) + { + if ( ( hMCParamUpmix->cov_real[b][i] = (float **) malloc( MC_PARAMUPMIX_NCH * sizeof( float * ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR cov real matrix" ); + } + for ( j = 0; j < MC_PARAMUPMIX_NCH; j++ ) + { + if ( ( hMCParamUpmix->cov_real[b][i][j] = (float *) malloc( IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR cov real matrix" ); + } + } + } + + if ( ( hMCParamUpmix->cov_dtx_real[b] = (float ***) malloc( MC_PARAMUPMIX_NCH * sizeof( float ** ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR cov dtx real matrix" ); + } + for ( i = 0; i < MC_PARAMUPMIX_NCH; i++ ) + { + if ( ( hMCParamUpmix->cov_dtx_real[b][i] = (float **) malloc( MC_PARAMUPMIX_NCH * sizeof( float * ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR cov dtx real matrix" ); + } + for ( j = 0; j < MC_PARAMUPMIX_NCH; j++ ) + { + if ( ( hMCParamUpmix->cov_dtx_real[b][i][j] = (float *) malloc( IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR cov dtx real matrix" ); + } + } + } + } + + st_ivas->hMCParamUpmix = hMCParamUpmix; + + return error; +} + + +/*------------------------------------------------------------------------- + * ivas_mc_paramupmix_enc_close() + * + * Close MC Param-Upmix encoder handle + *------------------------------------------------------------------------*/ + +void ivas_mc_paramupmix_enc_close( + MC_PARAMUPMIX_ENC_HANDLE *hMCParamUpmix, /* i/o: MC Param-Upmix encoder handle */ + const int32_t input_Fs /* i : input sampling rate */ +) +{ + int16_t i, k; + int16_t b, j; + + if ( hMCParamUpmix == NULL || *hMCParamUpmix == NULL ) + { + return; + } + + for ( b = 0; b < MC_PARAMUPMIX_COMBINATIONS; b++ ) + { + if ( ( *hMCParamUpmix )->cov_real[b] != NULL ) + { + for ( i = 0; i < MC_PARAMUPMIX_NCH; i++ ) + { + if ( ( *hMCParamUpmix )->cov_real[b][i] != NULL ) + { + for ( j = 0; j < MC_PARAMUPMIX_NCH; j++ ) + { + if ( ( *hMCParamUpmix )->cov_real[b][i][j] != NULL ) + { + free( ( *hMCParamUpmix )->cov_real[b][i][j] ); + } + } + free( ( *hMCParamUpmix )->cov_real[b][i] ); + } + } + free( ( *hMCParamUpmix )->cov_real[b] ); + } + + if ( ( *hMCParamUpmix )->cov_dtx_real[b] != NULL ) + { + for ( i = 0; i < MC_PARAMUPMIX_NCH; i++ ) + { + if ( ( *hMCParamUpmix )->cov_dtx_real[b][i] != NULL ) + { + for ( j = 0; j < MC_PARAMUPMIX_NCH; j++ ) + { + if ( ( *hMCParamUpmix )->cov_dtx_real[b][i][j] != NULL ) + { + free( ( *hMCParamUpmix )->cov_dtx_real[b][i][j] ); + } + } + free( ( *hMCParamUpmix )->cov_dtx_real[b][i] ); + } + } + free( ( *hMCParamUpmix )->cov_dtx_real[b] ); + } + } + + for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ ) + { + for ( k = 0; k < MC_PARAMUPMIX_NCH; k++ ) + { + free( ( *hMCParamUpmix )->midside[i][k] ); + } + } + + for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH; i++ ) + { + ivas_transient_det_close( &( *hMCParamUpmix )->hTranDet[i] ); + } + + if ( ( *hMCParamUpmix )->hFbMixer != NULL ) + { + ivas_FB_mixer_close( &( *hMCParamUpmix )->hFbMixer, input_Fs, 0 ); + } + + for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ ) + { + /* Covariance handle */ + if ( ( *hMCParamUpmix )->hCovEnc[i] != NULL ) + { + ivas_spar_covar_enc_close( &( *hMCParamUpmix )->hCovEnc[i], ( MC_PARAMUPMIX_NCH + 1 ) ); + } + } + + free( *hMCParamUpmix ); + *hMCParamUpmix = NULL; + + return; +} + + +/*****************************************************************************************/ +/* local functions */ +/*****************************************************************************************/ + +static void get_huff_table( + const PAR_TYPE par_type, + const QUANT_TYPE quant_type, + HUFF_TAB *df0, + HUFF_TAB *df, + HUFF_TAB *dt ) +{ + switch ( par_type ) + { + case ALPHA: + df0->value = huff_alpha_table[quant_type].df0.value; + df0->length = huff_alpha_table[quant_type].df0.length; + df->value = huff_alpha_table[quant_type].df.value; + df->length = huff_alpha_table[quant_type].df.length; + dt->value = huff_alpha_table[quant_type].dt.value; + dt->length = huff_alpha_table[quant_type].dt.length; + break; + case BETA: + df0->value = huff_beta_table[quant_type].df0.value; + df0->length = huff_beta_table[quant_type].df0.length; + df->value = huff_beta_table[quant_type].df.value; + df->length = huff_beta_table[quant_type].df.length; + dt->value = huff_beta_table[quant_type].dt.value; + dt->length = huff_beta_table[quant_type].dt.length; + break; + } + + return; +} + + +static void write_huff_bits( + const int32_t value, + const uint16_t length, + uint16_t bit_buffer[MC_PARAMUPMIX_MAX_BITS], + int16_t *bit_pos ) +{ + int16_t k; + + for ( k = length - 1; k >= 0; k-- ) + { + bit_buffer[( *bit_pos )++] = (uint16_t) ( ( value >> k ) & 1 ); + } + + return; +} + + +static void huffman_encode( + const int16_t bdfOnly, + const int16_t bdtAllowed, + const int16_t nv, + const int16_t ivStart, + const int32_t *vqPrev, + const int32_t *vq, + const PAR_TYPE parType, + const QUANT_TYPE quant_type, + const int16_t nq, + uint16_t bit_buffer[MC_PARAMUPMIX_MAX_BITS], + int16_t *bit_pos ) +{ + int16_t iv, ndf, ndt; + int32_t icode; + int16_t offset; + HUFF_TAB df0, df, dt; + + get_huff_table( parType, quant_type, &df0, &df, &dt ); + + offset = nq - 1; /* range [-(nquant - 1), nquant - 1] */ + + /* Get code length for time and freq diff coding */ + ndf = 0; + ndt = 0; + for ( iv = ivStart; iv < nv; iv++ ) + { + if ( iv == ivStart ) + { + icode = vq[iv]; + ndf += df0.length[icode]; + } + else + { + icode = vq[iv] - vq[iv - 1] + offset; + ndf += df.length[icode]; + } + + icode = vq[iv] - vqPrev[iv] + offset; + ndt += dt.length[icode]; + } + + if ( !bdtAllowed ) /* Time diff not allowed due to conformance or other reason even if bdfOnly = 0 */ + { + ndt = ndf + 1; + } + + /* Write the bitstream */ + if ( bdfOnly || ndf < ndt ) + { + bit_buffer[( *bit_pos )++] = (uint16_t) 0 & 1; + for ( iv = ivStart; iv < nv; iv++ ) + { + if ( iv == ivStart ) + { + icode = vq[iv]; + write_huff_bits( df0.value[icode], df0.length[icode], bit_buffer, bit_pos ); + } + else + { + icode = vq[iv] - vq[iv - 1] + offset; + write_huff_bits( df.value[icode], df.length[icode], bit_buffer, bit_pos ); + } + } + } + else + { + bit_buffer[( *bit_pos )++] = (uint16_t) 1 & 1; + for ( iv = ivStart; iv < nv; iv++ ) + { + icode = vq[iv] - vqPrev[iv] + offset; + write_huff_bits( dt.value[icode], dt.length[icode], bit_buffer, bit_pos ); + } + } + + return; +} + + +static void quantize_pars( + const int16_t nv, + const float *v, + const int16_t nq, + const float *data, + int32_t vq[IVAS_MAX_NUM_BANDS], + float *vdeq ) +{ + int16_t iv, iq, iq0, iq1; + + for ( iv = 0; iv < nv; iv++ ) + { + iq0 = 0; + iq1 = nq - 1; + + while ( iq1 - iq0 > 1 ) + { + iq = ( iq0 + iq1 ) / 2; + if ( v[iv] < data[iq] ) + { + iq1 = iq; + } + else + { + iq0 = iq; + } + } + + if ( fabs( v[iv] - data[iq0] ) < fabs( v[iv] - data[iq1] ) ) + { + vq[iv] = iq0; + vdeq[iv] = data[iq0]; + } + else + { + vq[iv] = iq1; + vdeq[iv] = data[iq1]; + } + } + + return; +} + + +static void quantize_alpha( + const int16_t nv, + const float *alpha, + const QUANT_TYPE quant_type, + int16_t *pnq, + int32_t aq[IVAS_MAX_NUM_BANDS], + float *adeq ) +{ + int16_t nq; + const float *data; + + nq = ivas_mc_paramupmix_alpha_quant_table[quant_type].nquant; + data = ivas_mc_paramupmix_alpha_quant_table[quant_type].data; + + quantize_pars( nv, alpha, nq, data, aq, adeq ); + + *pnq = nq; + + return; +} + + +static void quantize_beta( + const int16_t nv, + const float *beta, + const int32_t aq[IVAS_MAX_NUM_BANDS], + const QUANT_TYPE quant_type, + int16_t *pnq, + int32_t bq[IVAS_MAX_NUM_BANDS], + float *bdeq ) +{ + int16_t iv, iq, iq0, iq1; + const ACPL_QUANT_TABLE *tables = ivas_mc_paramupmix_beta_quant_table[quant_type]; + ACPL_QUANT_TABLE quant_table; + + for ( iv = 0; iv < nv; iv++ ) + { + quant_table = tables[ivas_param_upmx_mx_qmap[quant_type][aq[iv]]]; + + iq0 = 0; + iq1 = quant_table.nquant - 1; + + while ( iq1 - iq0 > 1 ) + { + iq = ( iq0 + iq1 ) / 2; + if ( beta[iv] < quant_table.data[iq] ) + { + iq1 = iq; + } + else + { + iq0 = iq; + } + } + + if ( fabs( beta[iv] - quant_table.data[iq0] ) < fabs( beta[iv] - quant_table.data[iq1] ) ) + { + bq[iv] = iq0; + bdeq[iv] = quant_table.data[iq0]; + } + else + { + bq[iv] = iq1; + bdeq[iv] = quant_table.data[iq1]; + } + } + + *pnq = ivas_mc_paramupmix_beta_quant_table[quant_type][0].nquant; + + return; +} + + +static void put_ec_data( + MC_PARAMUPMIX_ENC_HANDLE hMCParamUpmix, + const int16_t ch, + const float pars[IVAS_MAX_NUM_BANDS], + const float alphas[IVAS_MAX_NUM_BANDS], + const PAR_TYPE parType, + uint16_t bit_buffer[MC_PARAMUPMIX_MAX_BITS], + int16_t *bit_pos ) +{ + int16_t npar = IVAS_MAX_NUM_BANDS; + int16_t onlyFreq = 1; + int16_t nq; + QUANT_TYPE quant_type = FINE; + int32_t alphaQuant[IVAS_MAX_NUM_BANDS]; + int32_t betaQuant[IVAS_MAX_NUM_BANDS]; + float alphaDequant[IVAS_MAX_NUM_BANDS]; + float betaDequant[IVAS_MAX_NUM_BANDS]; + + if ( parType == ALPHA ) + { + quantize_alpha( npar, pars, quant_type, &nq, alphaQuant, alphaDequant ); + } + else + { + quantize_alpha( npar, alphas, quant_type, &nq, alphaQuant, alphaDequant ); + quantize_beta( npar, pars, alphaQuant, quant_type, &nq, betaQuant, betaDequant ); + } + + if ( hMCParamUpmix->first_frame ) + { + mvl2l( &( alphaQuant[0] ), &( hMCParamUpmix->alpha_quant_prev[ch][0] ), IVAS_MAX_NUM_BANDS ); + if ( parType == BETA ) + { + mvl2l( &( betaQuant[0] ), &( hMCParamUpmix->beta_quant_prev[ch][0] ), IVAS_MAX_NUM_BANDS ); + if ( ch == ( MC_PARAMUPMIX_COMBINATIONS - 1 ) ) + { + hMCParamUpmix->first_frame = 0; + } + } + } + + /* Always one parameter set per frame for transient frames. Original PS framing is used internally. */ + if ( parType == ALPHA ) + { + huffman_encode( onlyFreq, 1, npar, 0, hMCParamUpmix->alpha_quant_prev[ch], alphaQuant, ALPHA, quant_type, nq, bit_buffer, bit_pos ); + } + else + { + huffman_encode( onlyFreq, 1, npar, 0, hMCParamUpmix->beta_quant_prev[ch], betaQuant, BETA, quant_type, nq, bit_buffer, bit_pos ); + } + + if ( parType == ALPHA ) + { + mvl2l( alphaQuant, hMCParamUpmix->alpha_quant_prev[ch], IVAS_MAX_NUM_BANDS ); + } + else + { + mvl2l( betaQuant, hMCParamUpmix->beta_quant_prev[ch], IVAS_MAX_NUM_BANDS ); + } + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_mc_paramupmix_dmx() + * + * Computes the time domain down mix signal + *------------------------------------------------------------------------*/ + +static void ivas_mc_paramupmix_dmx( + MC_PARAMUPMIX_ENC_HANDLE hMCParamUpmix, /* i/o: MC ParamUpmix encoder handle */ + float *data_f[], /* i/o: Input, downmix out */ + const int16_t input_frame /* i : Input frame length */ +) +{ + int16_t i, l; + const int16_t chan1s[4] = { 4, 5, 8, 9 }; + const int16_t chan2s[4] = { 6, 7, 10, 11 }; + const int16_t chanOut[4] = { 4, 5, 6, 7 }; + const int16_t chanZero[4] = { 8, 9, 10, 11 }; + + /* boxes = { 0 1 2 3 [4 6] [5 7] [8 10] [9 11] }; */ + /* 9+11 -> 7 */ + /* 8+10 -> 6 */ + /* 5+7 -> 5 */ + /* 4+6 -> 4 */ + for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ ) + { + for ( l = 0; l < input_frame; l++ ) + { + /* mid */ + hMCParamUpmix->midside[i][0][l] = ( data_f[chan1s[i]][l] + data_f[chan2s[i]][l] ) * 0.5f; + /* side */ + hMCParamUpmix->midside[i][1][l] = ( data_f[chan1s[i]][l] - data_f[chan2s[i]][l] ) * 0.5f; + data_f[chanOut[i]][l] = hMCParamUpmix->midside[i][0][l]; + } + } + + for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ ) + { + set_zero( data_f[chanZero[i]], input_frame ); + } + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_mc_paramupmix_param_est_enc() + * + * run the CLDFB analysis on the input signal + * estimate the input and down mix covariances + *------------------------------------------------------------------------*/ + +static void ivas_mc_paramupmix_param_est_enc( + MC_PARAMUPMIX_ENC_HANDLE hMCParamUpmix, /* i/o: MC Param-Upmix encoder handle */ + float *data_f[], /* i : Input frame in the time domain */ + const int16_t input_frame, /* i : Input frame length */ + float alphas[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS], + float betas[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS] ) +{ + float *pcm_in[MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH]; + float fr_realbuffer[MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH][L_FRAME48k]; + float fr_imagbuffer[MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH][L_FRAME48k]; + float FR_Real_Mid[L_FRAME48k], FR_Imag_Mid[L_FRAME48k]; + float *p_fr_realbuffer[MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH]; + float *p_fr_imagbuffer[MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH]; + float *pp_in_fr_real[MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH]; + float *pp_in_fr_imag[MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH]; + float *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; + float *cov_dtx_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; + float rxx, rxy, ryy, cmat, rxxest, drxx, wetaux; + int16_t l_ts; + int16_t b, i, j, ts, bnd; + int16_t maxbands; + int16_t transient_det[MC_PARAMUPMIX_COMBINATIONS][2]; + int16_t transient_det_l[2], transient_det_r[2]; + const int16_t chan1s[MC_PARAMUPMIX_COMBINATIONS] = { 4, 5, 8, 9 }; + const int16_t chan2s[MC_PARAMUPMIX_COMBINATIONS] = { 6, 7, 10, 11 }; + const int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; + + for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ ) + { + pcm_in[2 * i] = data_f[chan1s[i]]; + pcm_in[2 * i + 1] = data_f[chan2s[i]]; + } + + /*-----------------------------------------------------------------------------------------* + * Transient detector + *-----------------------------------------------------------------------------------------*/ + + for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ ) + { + ivas_transient_det_process( hMCParamUpmix->hTranDet[2 * i], pcm_in[2 * i], input_frame, transient_det_l ); + ivas_transient_det_process( hMCParamUpmix->hTranDet[2 * i + 1], pcm_in[2 * i + 1], input_frame, transient_det_r ); + transient_det[i][0] = transient_det_l[0] || transient_det_r[0]; + transient_det[i][1] = transient_det_l[0] || transient_det_r[0]; + /* should probably be transient_det_l[1] || transient_det_r[1] , but choosing 0 reproduces the before merge state */ + } + + for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH; i++ ) + { + p_fr_realbuffer[i] = fr_realbuffer[i]; + p_fr_imagbuffer[i] = fr_imagbuffer[i]; + } + + /* prepare Parameter MDFT analysis */ + for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH; i++ ) + { + pp_in_fr_real[i] = p_fr_realbuffer[i]; + pp_in_fr_imag[i] = p_fr_imagbuffer[i]; + } + + l_ts = input_frame / MAX_PARAM_SPATIAL_SUBFRAMES; + for ( ts = 0; ts < MAX_PARAM_SPATIAL_SUBFRAMES; ts++ ) + { + ivas_fb_mixer_get_windowed_fr( hMCParamUpmix->hFbMixer, pcm_in, pp_in_fr_real, pp_in_fr_imag, l_ts, l_ts, hMCParamUpmix->hFbMixer->fb_cfg->num_in_chans ); + + ivas_fb_mixer_update_prior_input( hMCParamUpmix->hFbMixer, pcm_in, l_ts, hMCParamUpmix->hFbMixer->fb_cfg->num_in_chans ); + + for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH; i++ ) + { + pcm_in[i] += l_ts; + pp_in_fr_real[i] += l_ts; + pp_in_fr_imag[i] += l_ts; + } + } + + /*-----------------------------------------------------------------------------------------* + * Covariance process + *-----------------------------------------------------------------------------------------*/ + + for ( b = 0; b < MC_PARAMUPMIX_COMBINATIONS; b++ ) + { + pp_in_fr_real[0] = p_fr_realbuffer[2 * b]; + pp_in_fr_imag[0] = p_fr_imagbuffer[2 * b]; + pp_in_fr_real[1] = FR_Real_Mid; + pp_in_fr_imag[1] = FR_Imag_Mid; + + v_add( pp_in_fr_real[0], p_fr_realbuffer[2 * b + 1], pp_in_fr_real[1], L_FRAME48k ); + v_add( pp_in_fr_imag[0], p_fr_imagbuffer[2 * b + 1], pp_in_fr_imag[1], L_FRAME48k ); + + for ( i = 0; i < MC_PARAMUPMIX_NCH; i++ ) + { + for ( j = 0; j < MC_PARAMUPMIX_NCH; j++ ) + { + cov_real[i][j] = hMCParamUpmix->cov_real[b][i][j]; + cov_dtx_real[i][j] = hMCParamUpmix->cov_dtx_real[b][i][j]; + } + } + + ivas_enc_cov_handler_process( hMCParamUpmix->hCovEnc[b], pp_in_fr_real, pp_in_fr_imag, cov_real, cov_dtx_real, hMCParamUpmix->hFbMixer->pFb, 0, hMCParamUpmix->hFbMixer->pFb->filterbank_num_bands, MC_PARAMUPMIX_NCH, 0 /*dtx_vad*/, transient_det[b], HOA_md_ind, NULL, NULL, NULL, 0, 0 ); + } + + maxbands = hMCParamUpmix->hFbMixer->pFb->filterbank_num_bands; + for ( b = 0; b < MC_PARAMUPMIX_COMBINATIONS; b++ ) + { + for ( bnd = 0; bnd < maxbands; bnd++ ) + { + rxy = hMCParamUpmix->cov_real[b][1][0][bnd]; + ryy = hMCParamUpmix->cov_real[b][1][1][bnd]; + cmat = rxy / ( ryy + EPSILON ); + alphas[b][bnd] = 2.0f * cmat - 1.0f; + + rxx = hMCParamUpmix->cov_real[b][0][0][bnd]; + rxxest = cmat * cmat * ryy; + drxx = rxx - rxxest; + drxx = max( drxx, 0.0f ); + wetaux = sqrtf( drxx / ( ryy + EPSILON ) ); + betas[b][bnd] = 2.0f * wetaux; + } + } + + if ( maxbands < IVAS_MAX_NUM_BANDS ) + { + for ( b = 0; b < MC_PARAMUPMIX_COMBINATIONS; b++ ) + { + for ( bnd = maxbands; bnd < IVAS_MAX_NUM_BANDS; bnd++ ) + { + alphas[b][bnd] = 0.0f; + betas[b][bnd] = 0.0f; + } + } + } + + return; +} diff --git a/lib_enc/ivas_mcmasa_enc.c b/lib_enc/ivas_mcmasa_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..a67a9440b0c858a65e97eaa6aa5a09716d6a438e --- /dev/null +++ b/lib_enc/ivas_mcmasa_enc.c @@ -0,0 +1,1734 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include +#include +#include "ivas_cnst.h" +#include "ivas_prot.h" +#include "options.h" +#include "prot.h" +#include "ivas_rom_com.h" +#include "ivas_rom_enc.h" +#include "wmc_auto.h" + + +/*------------------------------------------------------------------------- + * Local constants + *------------------------------------------------------------------------*/ + +#define NEAR_HORIZONTAL_PLANE_ELEVATION 17.5f +#define VERTICAL_ENERGY_RATIO_OFFSET 0.15f + + +/*------------------------------------------------------------------------- + * Local function prototypes + *------------------------------------------------------------------------*/ + +/* Structure for covariance matrix */ +typedef struct +{ + float xr[MCMASA_MAX_ANA_CHANS][MCMASA_MAX_ANA_CHANS]; + float xi[MCMASA_MAX_ANA_CHANS][MCMASA_MAX_ANA_CHANS]; +} CovarianceMatrix; + +static void ivas_mcmasa_dmx( MCMASA_ENC_HANDLE hMcMasa, float *data_f[], const int16_t input_frame, const int16_t nchan_transport, const int16_t nchan_inp ); + +static void compute_cov_mtx( float sr[MCMASA_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], float si[MCMASA_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], const int16_t freq, const int16_t N, CovarianceMatrix *COVls ); + +static void computeIntensityVector_enc( const int16_t *band_grouping, float Cldfb_RealBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], float Cldfb_ImagBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], const int16_t enc_param_start_band, const int16_t num_frequency_bands, float intensity_real[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS] ); + +static void computeVerticalDiffuseness( float **buffer_intensity, const float *buffer_energy, const int16_t averaging_length, const int16_t num_freq_bands, float *diffuseness ); + +static void computeEvenLayout( const float *ls_azimuth, float *ls_azimuth_even, const int16_t numChannels ); + +static void computeLfeEnergy( MCMASA_ENC_HANDLE hMcMasa, float *data_f[], const int16_t input_frame ); + + +/*--------------------------------------------------------------------------* + * ivas_mcmasa_enc_open() + * + * + *--------------------------------------------------------------------------*/ + +ivas_error ivas_mcmasa_enc_open( + Encoder_Struct *st_ivas /* i/o: IVAS encoder handle */ +) +{ + int16_t i, j; + float tmp_f; + MCMASA_ENC_HANDLE hMcMasa; + MASA_ENCODER_HANDLE hMasa; + float ls_azimuth[MCMASA_MAX_ANA_CHANS]; + float ls_elevation[MCMASA_MAX_ANA_CHANS]; + float ls_azimuth_even[MCMASA_MAX_ANA_CHANS]; + int16_t numAnalysisChannels; + float left_min, right_min, azi_diff; + const int16_t *band_mapping; + int16_t maxBin, input_frame; + int16_t nchan_inp; + int32_t input_Fs; + int32_t dirac_slot_ns; + IVAS_FB_CFG *fb_cfg, *fb_cfgLfe; + ivas_error error; + + error = IVAS_ERR_OK; + + assert( st_ivas->hMasa != NULL && "MASA encoder handle is not present" ); + hMasa = st_ivas->hMasa; + + if ( ( hMcMasa = (MCMASA_ENC_HANDLE) malloc( sizeof( MCMASA_ENC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for McMasa\n" ) ); + } + + nchan_inp = st_ivas->hEncoderConfig->nchan_inp; + input_Fs = st_ivas->hEncoderConfig->input_Fs; + + /* Determine if to separate some channels from the analysis */ + ivas_mcmasa_set_separate_channel_mode( &( hMcMasa->separateChannelEnabled ), &( hMcMasa->separateChannelIndex ), st_ivas->hEncoderConfig->ivas_total_brate ); + + numAnalysisChannels = nchan_inp - 1; + if ( hMcMasa->separateChannelEnabled ) + { + numAnalysisChannels = nchan_inp - 2; + } + + /* With McMASA, we config MASA encoder only in init as we know the input and there are no frame-by-frame changes currently. */ + if ( ( error = ivas_masa_enc_config( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + + + /* Determine the number of bands */ + hMcMasa->nbands = st_ivas->hMasa->config.numCodingBands; + hMcMasa->nCodingBands = st_ivas->hMasa->config.numCodingBands; + + /* Determine band grouping */ + if ( hMcMasa->nbands == 24 ) + { + for ( i = 0; i < hMcMasa->nbands + 1; i++ ) + { + hMcMasa->band_grouping[i] = MASA_band_grouping_24[i] * CLDFB_TO_MDFT_FAC; + } + } + else + { + band_mapping = hMasa->data.band_mapping; + for ( i = 0; i < hMcMasa->nbands + 1; i++ ) + { + hMcMasa->band_grouping[i] = MASA_band_grouping_24[band_mapping[i]] * CLDFB_TO_MDFT_FAC; + } + } + + maxBin = (int16_t) ( input_Fs * INV_CLDFB_BANDWIDTH * CLDFB_TO_MDFT_FAC + 0.5f ); + + for ( i = 1; i < hMcMasa->nbands + 1; i++ ) + { + if ( hMcMasa->band_grouping[i] >= maxBin ) + { + hMcMasa->band_grouping[i] = maxBin; + hMcMasa->nbands = i; + break; + } + } + + /* initialize delay compensation */ + hMcMasa->num_samples_delay_comp = NS2SA( input_Fs, DELAY_DIRAC_ENC_CMP_NS ); +#ifdef DISABLE_DIRAC_DELAY_COMP + hMcMasa->num_samples_delay_comp = 0; /* disable delay compensation by setting to 0 */ +#endif + tmp_f = (float) hMcMasa->num_samples_delay_comp / (float) ( NS2SA( input_Fs, DIRAC_SLOT_ENC_NS ) ); + hMcMasa->num_slots_delay_comp = (int16_t) ( tmp_f ); + + if ( tmp_f > (float) hMcMasa->num_slots_delay_comp ) + { + hMcMasa->num_slots_delay_comp++; + hMcMasa->offset_comp = -hMcMasa->num_samples_delay_comp; + hMcMasa->num_samples_delay_comp = hMcMasa->num_slots_delay_comp * NS2SA( input_Fs, DIRAC_SLOT_ENC_NS ); + hMcMasa->offset_comp += hMcMasa->num_samples_delay_comp; + } + else + { + hMcMasa->offset_comp = 0; + } + + /* set FB config. */ + if ( ( error = ivas_fb_set_cfg( &fb_cfg, MASA_FORMAT, numAnalysisChannels, 0, 0, input_Fs, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Allocate and initialize FB mixer handle */ + if ( ( error = ivas_FB_mixer_open( &( hMcMasa->hFbMixer ), input_Fs, fb_cfg, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + + + if ( hMcMasa->separateChannelEnabled ) + { + /* TD Energy calculation with LP */ + if ( ( hMcMasa->delay_buffer_lfe[0] = (float *) malloc( NS2SA( input_Fs, DELAY_DIRAC_ENC_CMP_NS + DIRAC_SLOT_ENC_NS ) * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for McMasa\n" ) ); + } + set_zero( hMcMasa->delay_buffer_lfe[0], NS2SA( input_Fs, DELAY_DIRAC_ENC_CMP_NS + DIRAC_SLOT_ENC_NS ) ); + + if ( ( hMcMasa->delay_buffer_lfe[1] = (float *) malloc( NS2SA( input_Fs, DELAY_DIRAC_ENC_CMP_NS + DIRAC_SLOT_ENC_NS ) * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for McMasa\n" ) ); + } + set_zero( hMcMasa->delay_buffer_lfe[1], NS2SA( input_Fs, DELAY_DIRAC_ENC_CMP_NS + DIRAC_SLOT_ENC_NS ) ); + hMcMasa->hFbMixerLfe = NULL; + } + else + { + /* Allocate and initialize FB mixer handle for LFE channel */ + if ( ( error = ivas_fb_set_cfg( &fb_cfgLfe, MASA_FORMAT, 1, 0, 0, input_Fs, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = ivas_FB_mixer_open( &( hMcMasa->hFbMixerLfe ), input_Fs, fb_cfgLfe, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + + hMcMasa->delay_buffer_lfe[0] = NULL; + hMcMasa->delay_buffer_lfe[1] = NULL; + } + + if ( hMcMasa->separateChannelEnabled ) + { + int16_t bufferSize; + + /* Ring buffer for the filterbank of the LFE analysis. + * The filterbank is using moving average lowpass filter with the crossover of 120 Hz. */ + bufferSize = (int16_t) ( ( input_Fs / FRAMES_PER_SEC ) / MAX_PARAM_SPATIAL_SUBFRAMES ); + for ( i = 0; i < 2; i++ ) + { + if ( ( hMcMasa->lfeAnaRingBuffer[i] = (float *) malloc( bufferSize * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for McMasa\n" ) ); + } + set_zero( hMcMasa->lfeAnaRingBuffer[i], bufferSize ); + hMcMasa->lowpassSum[i] = 0.0f; + } + hMcMasa->ringBufferPointer = 0; + hMcMasa->ringBufferSize = bufferSize; + } + + + dirac_slot_ns = DIRAC_SLOT_ENC_NS; + + /* intensity 3-dim */ + for ( i = 0; i < DIRAC_NUM_DIMS; i++ ) + { + if ( ( hMcMasa->direction_vector_m[i] = (float **) malloc( MAX_PARAM_SPATIAL_SUBFRAMES * sizeof( float * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for McMasa\n" ) ); + } + + for ( j = 0; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++ ) + { + if ( ( hMcMasa->direction_vector_m[i][j] = (float *) malloc( hMcMasa->nbands * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for McMasa\n" ) ); + } + } + } + + hMcMasa->no_col_avg_diff = (int8_t) ( DIRAC_NO_COL_AVG_DIFF_NS / dirac_slot_ns ); + for ( i = 0; i < DIRAC_NUM_DIMS; i++ ) + { + if ( ( hMcMasa->buffer_intensity_real[i] = (float **) malloc( hMcMasa->no_col_avg_diff * sizeof( float * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for McMasa\n" ) ); + } + + for ( j = 0; j < hMcMasa->no_col_avg_diff; j++ ) + { + if ( ( hMcMasa->buffer_intensity_real[i][j] = (float *) malloc( hMcMasa->nbands * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for McMasa\n" ) ); + } + set_zero( hMcMasa->buffer_intensity_real[i][j], hMcMasa->nbands ); + } + } + + if ( ( hMcMasa->buffer_intensity_real_vert = (float **) malloc( hMcMasa->no_col_avg_diff * sizeof( float * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for McMasa\n" ) ); + } + + for ( j = 0; j < hMcMasa->no_col_avg_diff; j++ ) + { + if ( ( hMcMasa->buffer_intensity_real_vert[j] = (float *) malloc( hMcMasa->nbands * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for McMasa\n" ) ); + } + set_zero( hMcMasa->buffer_intensity_real_vert[j], hMcMasa->nbands ); + } + + if ( ( hMcMasa->buffer_energy = (float *) malloc( hMcMasa->nbands * hMcMasa->no_col_avg_diff * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for McMasa\n" ) ); + } + set_zero( hMcMasa->buffer_energy, hMcMasa->nbands * hMcMasa->no_col_avg_diff ); + + if ( st_ivas->hEncoderConfig->mc_input_setup == MC_LS_SETUP_5_1 ) + { + mvr2r( ls_azimuth_CICP6, ls_azimuth, nchan_inp - 1 ); + mvr2r( ls_elevation_CICP6, ls_elevation, nchan_inp - 1 ); + hMcMasa->numHorizontalChannels = 5; + hMcMasa->isHorizontalSetup = 1; + } + else if ( st_ivas->hEncoderConfig->mc_input_setup == MC_LS_SETUP_7_1 ) + { + mvr2r( ls_azimuth_CICP12, ls_azimuth, nchan_inp - 1 ); + mvr2r( ls_elevation_CICP12, ls_elevation, nchan_inp - 1 ); + hMcMasa->numHorizontalChannels = 7; + hMcMasa->isHorizontalSetup = 1; + } + else if ( st_ivas->hEncoderConfig->mc_input_setup == MC_LS_SETUP_5_1_2 ) + { + mvr2r( ls_azimuth_CICP14, ls_azimuth, nchan_inp - 1 ); + mvr2r( ls_elevation_CICP14, ls_elevation, nchan_inp - 1 ); + hMcMasa->numHorizontalChannels = 5; + hMcMasa->isHorizontalSetup = 0; + } + else if ( st_ivas->hEncoderConfig->mc_input_setup == MC_LS_SETUP_5_1_4 ) + { + mvr2r( ls_azimuth_CICP16, ls_azimuth, nchan_inp - 1 ); + mvr2r( ls_elevation_CICP16, ls_elevation, nchan_inp - 1 ); + hMcMasa->numHorizontalChannels = 5; + hMcMasa->isHorizontalSetup = 0; + } + else + { + mvr2r( ls_azimuth_CICP19, ls_azimuth, nchan_inp - 1 ); + mvr2r( ls_elevation_CICP19, ls_elevation, nchan_inp - 1 ); + hMcMasa->numHorizontalChannels = 7; + hMcMasa->isHorizontalSetup = 0; + } + + if ( hMcMasa->separateChannelEnabled ) + { + mvr2r( &ls_azimuth[hMcMasa->separateChannelIndex + 1], &ls_azimuth[hMcMasa->separateChannelIndex], numAnalysisChannels - hMcMasa->separateChannelIndex ); + mvr2r( &ls_elevation[hMcMasa->separateChannelIndex + 1], &ls_elevation[hMcMasa->separateChannelIndex], numAnalysisChannels - hMcMasa->separateChannelIndex ); + hMcMasa->numHorizontalChannels--; + } + + computeEvenLayout( ls_azimuth, ls_azimuth_even, hMcMasa->numHorizontalChannels ); + if ( !hMcMasa->isHorizontalSetup ) + { + computeEvenLayout( &ls_azimuth[hMcMasa->numHorizontalChannels], &ls_azimuth_even[hMcMasa->numHorizontalChannels], numAnalysisChannels - hMcMasa->numHorizontalChannels ); + } + + for ( i = 0; i < numAnalysisChannels; i++ ) + { + hMcMasa->chnlToFoaMtx[0][i] = 1.0f; + hMcMasa->chnlToFoaMtx[1][i] = sinf( ls_azimuth[i] * PI_OVER_180 ) * cosf( ls_elevation[i] * PI_OVER_180 ); + hMcMasa->chnlToFoaMtx[2][i] = sinf( ls_elevation[i] * PI_OVER_180 ); + hMcMasa->chnlToFoaMtx[3][i] = cosf( ls_azimuth[i] * PI_OVER_180 ) * cosf( ls_elevation[i] * PI_OVER_180 ); + + hMcMasa->chnlToFoaEvenMtx[0][i] = 1.0f; + hMcMasa->chnlToFoaEvenMtx[1][i] = sinf( ls_azimuth_even[i] * PI_OVER_180 ); + hMcMasa->chnlToFoaEvenMtx[2][i] = 0.0f; + hMcMasa->chnlToFoaEvenMtx[3][i] = cosf( ls_azimuth_even[i] * PI_OVER_180 ); + } + + hMcMasa->combineRatios = hMasa->config.mergeRatiosOverSubframes; + + mvr2r( ls_azimuth, hMcMasa->ls_azimuth, numAnalysisChannels ); + + for ( i = 0; i < hMcMasa->numHorizontalChannels; i++ ) + { + left_min = 360.0f; + right_min = -360.0f; + + for ( j = 0; j < hMcMasa->numHorizontalChannels; j++ ) + { + azi_diff = ls_azimuth[j] - ls_azimuth[i]; + + if ( azi_diff > 180.0f ) + { + azi_diff -= 360.0f; + } + else if ( azi_diff < -180.0f ) + { + azi_diff += 360.0f; + } + + if ( azi_diff < left_min && azi_diff > 0.0f ) + { + hMcMasa->leftNearest[i] = j; + left_min = azi_diff; + } + + if ( azi_diff > right_min && azi_diff < 0.0f ) + { + hMcMasa->rightNearest[i] = j; + right_min = azi_diff; + } + } + } + + hMcMasa->prevMultiChEne = 0.0f; + hMcMasa->prevDownmixEne = 0.0f; + hMcMasa->prevEQ = 1.0f; + input_frame = (int16_t) ( input_Fs / FRAMES_PER_SEC ); + for ( i = 0; i < input_frame; i++ ) + { + hMcMasa->interpolator[i] = ( (float) i ) / ( (float) input_frame ); + } + + mvs2s( DirAC_block_grouping_5ms_MDFT, hMcMasa->block_grouping, MAX_PARAM_SPATIAL_SUBFRAMES + 1 ); + + hMcMasa->index_buffer_intensity = 0; + + st_ivas->hMcMasa = hMcMasa; + + return error; +} + + +/*------------------------------------------------------------------------- + * ivas_mcmasa_enc_reconfig() + * + * Reconfigure McMASA encoder + *------------------------------------------------------------------------*/ + +ivas_error ivas_mcmasa_enc_reconfig( + Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ +) +{ + int32_t ivas_total_brate; + ivas_error error; + + error = IVAS_ERR_OK; + + ivas_total_brate = st_ivas->hEncoderConfig->ivas_total_brate; + + if ( ivas_total_brate != st_ivas->hEncoderConfig->last_ivas_total_brate ) + { + /* bitrate changed, may need to do something */ + + /* brute-force solution: close McMASA and re-instantiate with new settings */ + ivas_masa_enc_close( &( st_ivas->hMasa ) ); + ivas_mcmasa_enc_close( &( st_ivas->hMcMasa ), st_ivas->hEncoderConfig->input_Fs ); + + /* Determine if to separate some channels from the analysis */ + ivas_mcmasa_setNumTransportChannels( &( st_ivas->nchan_transport ), &( st_ivas->hEncoderConfig->element_mode_init ), ivas_total_brate ); + + if ( ( error = ivas_masa_enc_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = ivas_mcmasa_enc_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* core SCE, CPE reconfiguration happens later */ + } + + return error; +} + +/*--------------------------------------------------------------------------* + * ivas_mcmasa_enc_close() + * + * + *--------------------------------------------------------------------------*/ + +void ivas_mcmasa_enc_close( + MCMASA_ENC_HANDLE *hMcMasa, /* i/o: encoder McMASA handle */ + const int32_t input_Fs /* i : input sampling rate */ +) +{ + int16_t i, j; + + if ( hMcMasa == NULL || *hMcMasa == NULL ) + { + return; + } + + if ( ( *hMcMasa )->separateChannelEnabled ) + { + free( ( *hMcMasa )->delay_buffer_lfe[0] ); + free( ( *hMcMasa )->delay_buffer_lfe[1] ); + + for ( i = 0; i < 2; i++ ) + { + free( ( *hMcMasa )->lfeAnaRingBuffer[i] ); + } + } + + ivas_FB_mixer_close( &( *hMcMasa )->hFbMixer, input_Fs, 0 ); + + if ( !( *hMcMasa )->separateChannelEnabled ) + { + ivas_FB_mixer_close( &( *hMcMasa )->hFbMixerLfe, input_Fs, 0 ); + } + + /* intensity 3-dim */ + for ( i = 0; i < DIRAC_NUM_DIMS; i++ ) + { + for ( j = 0; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++ ) + { + free( ( *hMcMasa )->direction_vector_m[i][j] ); + ( *hMcMasa )->direction_vector_m[i][j] = NULL; + } + + for ( j = 0; j < ( *hMcMasa )->no_col_avg_diff; j++ ) + { + free( ( *hMcMasa )->buffer_intensity_real[i][j] ); + ( *hMcMasa )->buffer_intensity_real[i][j] = NULL; + } + + free( ( *hMcMasa )->buffer_intensity_real[i] ); + ( *hMcMasa )->buffer_intensity_real[i] = NULL; + + free( ( *hMcMasa )->direction_vector_m[i] ); + ( *hMcMasa )->direction_vector_m[i] = NULL; + } + + for ( j = 0; j < ( *hMcMasa )->no_col_avg_diff; j++ ) + { + free( ( *hMcMasa )->buffer_intensity_real_vert[j] ); + ( *hMcMasa )->buffer_intensity_real_vert[j] = NULL; + } + free( ( *hMcMasa )->buffer_intensity_real_vert ); + ( *hMcMasa )->buffer_intensity_real_vert = NULL; + + free( ( *hMcMasa )->buffer_energy ); + ( *hMcMasa )->buffer_energy = NULL; + + free( ( *hMcMasa ) ); + ( *hMcMasa ) = NULL; + + return; +} + + +/*--------------------------------------------------------------------------* + * ivas_mcmasa_enc() + * + * Multichannel MASA encoder + *--------------------------------------------------------------------------*/ + +void ivas_mcmasa_enc( + MCMASA_ENC_HANDLE hMcMasa, /* i/o: Encoder McMASA handle */ + IVAS_QMETADATA_HANDLE hQMeta, /* o : Qmetadata handle */ + MASA_ENCODER_HANDLE hMasa, /* i/o: Encoder MASA handle */ + float *data_f[], /* i : Input frame of audio */ + const int16_t input_frame, /* i : Input frame size */ + const int16_t nchan_transport, /* i : Number of transport channels */ + const int16_t nchan_inp /* i : Number of input channels */ +) +{ + int16_t i, j, k; + int16_t nBands = hMcMasa->nbands; + int16_t nBlocks = MAX_PARAM_SPATIAL_SUBFRAMES; + uint8_t fixedDistance = 0; + float elevation_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + float azimuth_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + float energyRatio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + float spreadCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + float surroundingCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + float separatedChannelSignal[L_FRAME48k]; + + /* Compute low frequency energy */ + computeLfeEnergy( hMcMasa, data_f, input_frame ); + + /* Sum center and LFE, move surround channels */ + v_add( data_f[2], data_f[3], data_f[2], input_frame ); + for ( i = 4; i < nchan_inp; i++ ) + { + mvr2r( data_f[i], data_f[i - 1], input_frame ); + } + + if ( hMcMasa->separateChannelEnabled ) + { + /* Identify channel to separate */ + i = hMcMasa->separateChannelIndex; + + /* Separate the identified channel */ + mvr2r( data_f[i], separatedChannelSignal, input_frame ); + + /* Move the remaining channels in order to perform the analysis without the separated channel */ + for ( i = ( hMcMasa->separateChannelIndex + 1 ); i < ( nchan_inp - 1 ); i++ ) + { + mvr2r( data_f[i], data_f[i - 1], input_frame ); + } + } + + /* Analysis */ + ivas_mcmasa_param_est_enc( hMcMasa, hMasa, data_f, elevation_m_values, azimuth_m_values, energyRatio, spreadCoherence, surroundingCoherence, input_frame, nchan_inp ); + + /* Determine LFE-to-total energy ratio */ + for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + { + hMasa->data.lfeToTotalEnergyRatio[i] = hMcMasa->lfeLfEne[i] / ( EPSILON + hMcMasa->totalLfEne[i] ); + } + + /* Set analyzed values to the MASA struct */ + for ( i = 0; i < nBands; i++ ) + { + for ( j = 0; j < nBlocks; j++ ) + { + if ( hMcMasa->combineRatios ) + { + k = 0; + } + else + { + k = j; + } + + hQMeta->q_direction[0].band_data[i].azimuth[j] = azimuth_m_values[j][i]; + hQMeta->q_direction[0].band_data[i].elevation[j] = elevation_m_values[j][i]; + hQMeta->q_direction[0].band_data[i].energy_ratio[j] = energyRatio[k][i]; + hQMeta->q_direction[0].band_data[i].distance[j] = fixedDistance; + + if ( hQMeta->surcoh_band_data != NULL ) + { + hQMeta->q_direction[0].coherence_band_data[i].spread_coherence[j] = (uint8_t) roundf( spreadCoherence[j][i] * UINT8_MAX ); + hQMeta->surcoh_band_data[i].surround_coherence[j] = (uint8_t) roundf( surroundingCoherence[k][i] * UINT8_MAX ); + } + } + } + + /* At lower sampling rates, set zeros for higher bands that were not analyzed */ + if ( nBands < hMcMasa->nCodingBands ) + { + for ( i = nBands; i < hMcMasa->nCodingBands; i++ ) + { + for ( j = 0; j < nBlocks; j++ ) + { + hQMeta->q_direction[0].band_data[i].azimuth[j] = 0.0f; + hQMeta->q_direction[0].band_data[i].elevation[j] = 0.0f; + hQMeta->q_direction[0].band_data[i].energy_ratio[j] = 0.0f; + hQMeta->q_direction[0].band_data[i].distance[j] = 0; + + if ( hQMeta->surcoh_band_data != NULL ) + { + hQMeta->q_direction[0].coherence_band_data[i].spread_coherence[j] = 0; + hQMeta->surcoh_band_data[i].surround_coherence[j] = 0; + } + } + } + } + + /* Downmix */ + ivas_mcmasa_dmx( hMcMasa, data_f, input_frame, nchan_transport, nchan_inp ); + + if ( hMcMasa->separateChannelEnabled ) + { + /* Put separated channel back to data_f to first empty channel after the transport audio signals for encoding */ + mvr2r( separatedChannelSignal, data_f[2], input_frame ); + } + + /* Update mcMASA-relevant coding parameters */ + /* These are reset to default values as they may be modified during later processing. */ + hMasa->config.joinedSubframes = FALSE; + hQMeta->q_direction[0].cfg.nbands = hMcMasa->nbands; + hQMeta->q_direction[0].cfg.nblocks = MAX_PARAM_SPATIAL_SUBFRAMES; + hQMeta->all_coherence_zero = 1; + + /* Check spread coherence */ + i = 0; + while ( i < nBlocks && hQMeta->all_coherence_zero ) + { + j = 0; + while ( j < nBands && hQMeta->all_coherence_zero ) + { + if ( spreadCoherence[i][j] > MASA_COHERENCE_THRESHOLD ) + { + hQMeta->all_coherence_zero = 0; + } + j++; + } + i++; + } + + /* Check surrounding coherence */ + if ( hQMeta->all_coherence_zero ) + { + float diffuse_to_total_ratio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + uint8_t cohSignificant; + int16_t nSubFrames; + + nSubFrames = hMcMasa->combineRatios ? 1 : MAX_PARAM_SPATIAL_SUBFRAMES; + for ( i = 0; i < nSubFrames; i++ ) + { + for ( j = 0; j < nBands; j++ ) + { + diffuse_to_total_ratio[i][j] = fmaxf( 0.0f, 1.0f - energyRatio[i][j] ); + } + } + + cohSignificant = ivas_masa_surrcoh_signicant( surroundingCoherence, diffuse_to_total_ratio, nSubFrames, nBands ); + if ( cohSignificant ) + { + hQMeta->all_coherence_zero = 0; + } + } + hMasa->config.coherencePresent = !hQMeta->all_coherence_zero; + + return; +} + + +/*--------------------------------------------------------------------------* + * ivas_mcmasa_param_est_enc() + * + * Estimate metadata parameters for McMASA + *--------------------------------------------------------------------------*/ + +void ivas_mcmasa_param_est_enc( + MCMASA_ENC_HANDLE hMcMasa, /* i : McMASA encoder structure */ + MASA_ENCODER_HANDLE hMasa, /* i : MASA encoder structure */ + float *data_f[], /* i : Audio frame in MC-format */ + float elevation_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* o : Estimated elevation */ + float azimuth_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* o : Estimated azimuth */ + float energyRatio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* o : Estimated direct-to-total ratio */ + float spreadCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* o : Estimated spread coherence */ + float surroundingCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* o : Estimated surround coherence */ + const int16_t input_frame, /* i : Input frame size */ + const int16_t nchan_inp /* i : Number of input channels */ +) +{ + float reference_power[MDFT_NO_COL_MAX][DIRAC_NO_FB_BANDS_MAX]; + int16_t ts, i, j, d; + int16_t num_freq_bins, num_freq_bands, index; + float dir_v[DIRAC_NUM_DIMS]; + int16_t l_ts; + float *pcm_in[MCMASA_MAX_ANA_CHANS]; + float Chnl_RealBuffer[MCMASA_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX]; + float Chnl_ImagBuffer[MCMASA_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX]; + float *p_Chnl_RealBuffer[MCMASA_MAX_ANA_CHANS]; + float *p_Chnl_ImagBuffer[MCMASA_MAX_ANA_CHANS]; + float Foa_RealBuffer[FOA_CHANNELS][DIRAC_NO_FB_BANDS_MAX]; + float Foa_ImagBuffer[FOA_CHANNELS][DIRAC_NO_FB_BANDS_MAX]; + float FoaEven_RealBuffer[FOA_CHANNELS][DIRAC_NO_FB_BANDS_MAX]; + float FoaEven_ImagBuffer[FOA_CHANNELS][DIRAC_NO_FB_BANDS_MAX]; + float intensity_real[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS]; + float intensity_even_real[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS]; + float direction_vector[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS]; + float diffuseness_vector[MASA_FREQUENCY_BANDS]; + float vertical_diffuseness_vector[MASA_FREQUENCY_BANDS]; + float diffuseness_m[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + float coherentEnergyRatio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + int16_t band_m_idx, block_m_idx; + float renormalization_factor_diff[MASA_FREQUENCY_BANDS]; + float norm_tmp; + int16_t mrange[2], brange[2]; + int16_t numSubFramesForRatio; + CovarianceMatrix COVls[MASA_FREQUENCY_BANDS]; + float absCOVls[MCMASA_MAX_ANA_CHANS][MCMASA_MAX_ANA_CHANS]; + float lsEnergy[MCMASA_MAX_ANA_CHANS]; + float lsEnergySum, maxEne; + int16_t loudestCh; + float surrCoh, tempCoh, tempCoh2; + int16_t i1, i2, i3; + float angleDist, minAngleDist; + float currentAzi; + float lsEnergyRelation; + float tempLsEnergyRelation; + float stereoness, cohwideness, spreadCoh; + float stereoRatio, cohPanRatio; + float stereoCoh, cohPanCoh, cohRatio; + float renormalization_factor_coh[MASA_FREQUENCY_BANDS]; + int16_t numAnalysisChannels; + + num_freq_bins = input_frame / MDFT_NO_COL_MAX; + num_freq_bands = hMcMasa->nbands; + l_ts = input_frame / MDFT_NO_COL_MAX; + + numAnalysisChannels = nchan_inp - 1; + if ( hMcMasa->separateChannelEnabled ) + { + numAnalysisChannels = nchan_inp - 2; + } + + if ( hMcMasa->combineRatios ) + { + /* Need to initialize renormalization_factors, and variables to be normalized */ + set_zero( renormalization_factor_diff, hMcMasa->nbands ); + set_zero( diffuseness_m[0], hMcMasa->nbands ); + set_zero( renormalization_factor_coh, hMcMasa->nbands ); + set_zero( surroundingCoherence[0], hMcMasa->nbands ); + set_zero( coherentEnergyRatio[0], hMcMasa->nbands ); + } + + /* Copy current frame to memory for delay compensation */ + for ( i = 0; i < numAnalysisChannels; i++ ) + { + pcm_in[i] = data_f[i]; + p_Chnl_RealBuffer[i] = &Chnl_RealBuffer[i][0]; + p_Chnl_ImagBuffer[i] = &Chnl_ImagBuffer[i][0]; + } + + /* do processing over all CLDFB time slots */ + for ( block_m_idx = 0; block_m_idx < MAX_PARAM_SPATIAL_SUBFRAMES; block_m_idx++ ) + { + mrange[0] = hMcMasa->block_grouping[block_m_idx]; + mrange[1] = hMcMasa->block_grouping[block_m_idx + 1]; + + for ( band_m_idx = 0; band_m_idx < hMcMasa->nbands; band_m_idx++ ) + { + hMcMasa->direction_vector_m[0][block_m_idx][band_m_idx] = 0; + hMcMasa->direction_vector_m[1][block_m_idx][band_m_idx] = 0; + hMcMasa->direction_vector_m[2][block_m_idx][band_m_idx] = 0; + } + + /* Reset variable */ + for ( i = 0; i < hMcMasa->nbands; i++ ) + { + for ( j = 0; j < numAnalysisChannels; j++ ) + { + set_zero( COVls[i].xr[j], numAnalysisChannels ); + set_zero( COVls[i].xi[j], numAnalysisChannels ); + } + } + + for ( ts = mrange[0]; ts < mrange[1]; ts++ ) + { + ivas_fb_mixer_get_windowed_fr( hMcMasa->hFbMixer, pcm_in, p_Chnl_RealBuffer, p_Chnl_ImagBuffer, l_ts, l_ts, hMcMasa->hFbMixer->fb_cfg->num_in_chans ); + + ivas_fb_mixer_update_prior_input( hMcMasa->hFbMixer, pcm_in, l_ts, hMcMasa->hFbMixer->fb_cfg->num_in_chans ); + + for ( i = 0; i < numAnalysisChannels; i++ ) + { + pcm_in[i] += l_ts; + } + + /* Compute covariance matrix */ + for ( i = 0; i < num_freq_bands; i++ ) + { + brange[0] = hMcMasa->band_grouping[i]; + brange[1] = hMcMasa->band_grouping[i + 1]; + for ( j = brange[0]; j < brange[1]; j++ ) + { + compute_cov_mtx( Chnl_RealBuffer, Chnl_ImagBuffer, j, numAnalysisChannels, &( COVls[i] ) ); + } + + /* Store energies for guiding metadata encoding */ + hMasa->data.energy[block_m_idx][i] = 0.0f; + for ( j = 0; j < numAnalysisChannels; j++ ) + { + hMasa->data.energy[block_m_idx][i] += COVls[i].xr[j][j]; + } + } + + if ( !hMcMasa->separateChannelEnabled ) + { + /* Compute low frequency energy */ + for ( i = 0; i < numAnalysisChannels; i++ ) + { + for ( j = 0; j < CLDFB_TO_MDFT_FAC; j++ ) + { + hMcMasa->totalLfEne[block_m_idx] += Chnl_RealBuffer[i][j] * Chnl_RealBuffer[i][j] + Chnl_ImagBuffer[i][j] * Chnl_ImagBuffer[i][j]; + } + } + } + + /* Compute standard FOA */ + /* W */ + v_add( Chnl_RealBuffer[0], Chnl_RealBuffer[1], Foa_RealBuffer[0], num_freq_bins ); + v_add( Chnl_ImagBuffer[0], Chnl_ImagBuffer[1], Foa_ImagBuffer[0], num_freq_bins ); + for ( i = 2; i < numAnalysisChannels; i++ ) + { + v_add( Chnl_RealBuffer[i], Foa_RealBuffer[0], Foa_RealBuffer[0], num_freq_bins ); + v_add( Chnl_ImagBuffer[i], Foa_ImagBuffer[0], Foa_ImagBuffer[0], num_freq_bins ); + } + + /* Y */ + v_multc( Chnl_RealBuffer[0], hMcMasa->chnlToFoaMtx[1][0], Foa_RealBuffer[1], num_freq_bins ); + v_multc( Chnl_ImagBuffer[0], hMcMasa->chnlToFoaMtx[1][0], Foa_ImagBuffer[1], num_freq_bins ); + for ( i = 1; i < numAnalysisChannels; i++ ) + { + v_multc_acc( Chnl_RealBuffer[i], hMcMasa->chnlToFoaMtx[1][i], Foa_RealBuffer[1], num_freq_bins ); + v_multc_acc( Chnl_ImagBuffer[i], hMcMasa->chnlToFoaMtx[1][i], Foa_ImagBuffer[1], num_freq_bins ); + } + + /* Z */ + if ( hMcMasa->isHorizontalSetup ) + { + /* Set zero for horizontal setups */ + set_zero( Foa_RealBuffer[2], num_freq_bins ); + set_zero( Foa_ImagBuffer[2], num_freq_bins ); + } + else + { + v_multc( Chnl_RealBuffer[0], hMcMasa->chnlToFoaMtx[2][0], Foa_RealBuffer[2], num_freq_bins ); + v_multc( Chnl_ImagBuffer[0], hMcMasa->chnlToFoaMtx[2][0], Foa_ImagBuffer[2], num_freq_bins ); + for ( i = 1; i < numAnalysisChannels; i++ ) + { + v_multc_acc( Chnl_RealBuffer[i], hMcMasa->chnlToFoaMtx[2][i], Foa_RealBuffer[2], num_freq_bins ); + v_multc_acc( Chnl_ImagBuffer[i], hMcMasa->chnlToFoaMtx[2][i], Foa_ImagBuffer[2], num_freq_bins ); + } + } + + /* X */ + v_multc( Chnl_RealBuffer[0], hMcMasa->chnlToFoaMtx[3][0], Foa_RealBuffer[3], num_freq_bins ); + v_multc( Chnl_ImagBuffer[0], hMcMasa->chnlToFoaMtx[3][0], Foa_ImagBuffer[3], num_freq_bins ); + for ( i = 1; i < numAnalysisChannels; i++ ) + { + v_multc_acc( Chnl_RealBuffer[i], hMcMasa->chnlToFoaMtx[3][i], Foa_RealBuffer[3], num_freq_bins ); + v_multc_acc( Chnl_ImagBuffer[i], hMcMasa->chnlToFoaMtx[3][i], Foa_ImagBuffer[3], num_freq_bins ); + } + + /* Compute even FOA */ + /* W */ + mvr2r( Foa_RealBuffer[0], FoaEven_RealBuffer[0], num_freq_bins ); + mvr2r( Foa_ImagBuffer[0], FoaEven_ImagBuffer[0], num_freq_bins ); + + /* Y */ + v_multc( Chnl_RealBuffer[0], hMcMasa->chnlToFoaEvenMtx[1][0], FoaEven_RealBuffer[1], num_freq_bins ); + v_multc( Chnl_ImagBuffer[0], hMcMasa->chnlToFoaEvenMtx[1][0], FoaEven_ImagBuffer[1], num_freq_bins ); + for ( i = 1; i < numAnalysisChannels; i++ ) + { + v_multc_acc( Chnl_RealBuffer[i], hMcMasa->chnlToFoaEvenMtx[1][i], FoaEven_RealBuffer[1], num_freq_bins ); + v_multc_acc( Chnl_ImagBuffer[i], hMcMasa->chnlToFoaEvenMtx[1][i], FoaEven_ImagBuffer[1], num_freq_bins ); + } + + /* Z (even setups are handled as horizontal) */ + set_zero( FoaEven_RealBuffer[2], num_freq_bins ); + set_zero( FoaEven_ImagBuffer[2], num_freq_bins ); + + /* X */ + v_multc( Chnl_RealBuffer[0], hMcMasa->chnlToFoaEvenMtx[3][0], FoaEven_RealBuffer[3], num_freq_bins ); + v_multc( Chnl_ImagBuffer[0], hMcMasa->chnlToFoaEvenMtx[3][0], FoaEven_ImagBuffer[3], num_freq_bins ); + for ( i = 1; i < numAnalysisChannels; i++ ) + { + v_multc_acc( Chnl_RealBuffer[i], hMcMasa->chnlToFoaEvenMtx[3][i], FoaEven_RealBuffer[3], num_freq_bins ); + v_multc_acc( Chnl_ImagBuffer[i], hMcMasa->chnlToFoaEvenMtx[3][i], FoaEven_ImagBuffer[3], num_freq_bins ); + } + + /* Direction estimation */ + computeIntensityVector_enc( + hMcMasa->band_grouping, + Foa_RealBuffer, + Foa_ImagBuffer, + 0, + num_freq_bands, + intensity_real ); + + computeDirectionVectors( + intensity_real[0], + intensity_real[1], + intensity_real[2], + 0, + num_freq_bands, + direction_vector[0], + direction_vector[1], + direction_vector[2] ); + + /* Power and intensity estimation for diffuseness */ + computeIntensityVector_enc( + hMcMasa->band_grouping, + FoaEven_RealBuffer, + FoaEven_ImagBuffer, + 0, + num_freq_bands, + intensity_even_real ); + + computeReferencePower_enc( hMcMasa->band_grouping, + FoaEven_RealBuffer, + FoaEven_ImagBuffer, + reference_power[ts], + 0, + num_freq_bands, + MC_FORMAT, + 0, + FOA_CHANNELS, + NULL, + NULL ); + + /* Fill buffers of length "averaging_length" time slots for intensity and energy */ + hMcMasa->index_buffer_intensity = ( hMcMasa->index_buffer_intensity % hMcMasa->no_col_avg_diff ) + 1; /* averaging_length = 32 */ + index = hMcMasa->index_buffer_intensity; + for ( i = 0; i < DIRAC_NUM_DIMS; i++ ) + { + /* only real part needed */ + mvr2r( intensity_even_real[i], &( hMcMasa->buffer_intensity_real[i][index - 1][0] ), num_freq_bands ); + } + mvr2r( reference_power[ts], &( hMcMasa->buffer_energy[( index - 1 ) * num_freq_bands] ), num_freq_bands ); + + computeDiffuseness_mdft( hMcMasa->buffer_intensity_real, hMcMasa->buffer_energy, num_freq_bands, hMcMasa->no_col_avg_diff, diffuseness_vector ); + + /* Compute vertical diffuseness, and tune original diffuseness if needed */ + if ( !hMcMasa->isHorizontalSetup ) + { + mvr2r( intensity_real[2], &( hMcMasa->buffer_intensity_real_vert[index - 1][0] ), num_freq_bands ); + computeVerticalDiffuseness( hMcMasa->buffer_intensity_real_vert, hMcMasa->buffer_energy, hMcMasa->no_col_avg_diff, num_freq_bands, vertical_diffuseness_vector ); + v_min( diffuseness_vector, vertical_diffuseness_vector, diffuseness_vector, num_freq_bands ); + } + + for ( band_m_idx = 0; band_m_idx < hMcMasa->nbands; band_m_idx++ ) + { + norm_tmp = reference_power[ts][band_m_idx] * ( 1 - diffuseness_vector[band_m_idx] ); + + hMcMasa->direction_vector_m[0][block_m_idx][band_m_idx] += norm_tmp * direction_vector[0][band_m_idx]; + hMcMasa->direction_vector_m[1][block_m_idx][band_m_idx] += norm_tmp * direction_vector[1][band_m_idx]; + hMcMasa->direction_vector_m[2][block_m_idx][band_m_idx] += norm_tmp * direction_vector[2][band_m_idx]; + + if ( hMcMasa->combineRatios ) + { + diffuseness_m[0][band_m_idx] += reference_power[ts][band_m_idx] * diffuseness_vector[band_m_idx]; + renormalization_factor_diff[band_m_idx] += reference_power[ts][band_m_idx]; + } + else + { + diffuseness_m[block_m_idx][band_m_idx] = diffuseness_vector[band_m_idx]; + } + } + } + + for ( band_m_idx = 0; band_m_idx < hMcMasa->nbands; band_m_idx++ ) + { + for ( d = 0; d < DIRAC_NUM_DIMS; d++ ) + { + dir_v[d] = hMcMasa->direction_vector_m[d][block_m_idx][band_m_idx]; + } + ivas_qmetadata_direction_vector_to_azimuth_elevation( dir_v, &azimuth_m_values[block_m_idx][band_m_idx], &elevation_m_values[block_m_idx][band_m_idx] ); + } + + /* Coherence processing */ + for ( band_m_idx = 0; band_m_idx < hMcMasa->nbands; band_m_idx++ ) + { + /* Compute absolute values */ + for ( i = 0; i < numAnalysisChannels; i++ ) + { + for ( j = i; j < numAnalysisChannels; j++ ) + { + absCOVls[i][j] = sqrtf( ( COVls[band_m_idx].xr[i][j] * COVls[band_m_idx].xr[i][j] + COVls[band_m_idx].xi[i][j] * COVls[band_m_idx].xi[i][j] ) ); + } + lsEnergy[i] = absCOVls[i][i]; + } + + /* Find loudest channel */ + maxEne = lsEnergy[0]; + loudestCh = 0; + for ( i = 1; i < numAnalysisChannels; i++ ) + { + if ( lsEnergy[i] > maxEne ) + { + maxEne = lsEnergy[i]; + loudestCh = i; + } + } + + /* Compute surrounding coherence */ + surrCoh = 1.0f; + for ( i = 0; i < numAnalysisChannels; i++ ) + { + if ( i != loudestCh ) + { + if ( i < loudestCh ) + { + i1 = i; + i2 = loudestCh; + } + else + { + i1 = loudestCh; + i2 = i; + } + tempCoh = absCOVls[i1][i2] / ( sqrtf( ( lsEnergy[i1] * lsEnergy[i2] + EPSILON ) ) ); + surrCoh = ( surrCoh < tempCoh ) ? surrCoh : tempCoh; + } + } + surrCoh = surrCoh * surrCoh; + surrCoh = ( surrCoh < 1.0f ) ? surrCoh : 1.0f; + surrCoh = ( surrCoh > 0.0f ) ? surrCoh : 0.0f; + + /* Compute spread coherence */ + if ( elevation_m_values[block_m_idx][band_m_idx] < NEAR_HORIZONTAL_PLANE_ELEVATION ) /* Computed only near horizontal plane */ + { + minAngleDist = 180.0f; + i1 = 0; + currentAzi = azimuth_m_values[block_m_idx][band_m_idx]; + for ( i = 0; i < hMcMasa->numHorizontalChannels; i++ ) + { + angleDist = fabsf( currentAzi - hMcMasa->ls_azimuth[i] ); + if ( angleDist > 180.0f ) + { + angleDist = fabsf( angleDist - 360.0f ); + } + if ( angleDist < minAngleDist ) + { + minAngleDist = angleDist; + i1 = i; + } + } + i2 = hMcMasa->leftNearest[i1]; + i3 = hMcMasa->rightNearest[i1]; + + if ( i2 < i3 ) + { + stereoCoh = absCOVls[i2][i3] / ( sqrtf( lsEnergy[i2] * lsEnergy[i3] + EPSILON ) ); + } + else + { + stereoCoh = absCOVls[i3][i2] / ( sqrtf( lsEnergy[i2] * lsEnergy[i3] + EPSILON ) ); + } + lsEnergyRelation = ( lsEnergy[i2] + lsEnergy[i3] ) / ( lsEnergy[i1] + lsEnergy[i2] + lsEnergy[i3] + EPSILON ); + stereoness = stereoCoh * lsEnergyRelation; + + if ( i1 < i2 ) + { + tempCoh = absCOVls[i1][i2] / ( sqrtf( lsEnergy[i1] * lsEnergy[i2] + EPSILON ) ); + } + else + { + tempCoh = absCOVls[i2][i1] / ( sqrtf( lsEnergy[i1] * lsEnergy[i2] + EPSILON ) ); + } + if ( i1 < i3 ) + { + tempCoh2 = absCOVls[i1][i3] / ( sqrtf( lsEnergy[i1] * lsEnergy[i3] + EPSILON ) ); + } + else + { + tempCoh2 = absCOVls[i3][i1] / ( sqrtf( lsEnergy[i1] * lsEnergy[i3] + EPSILON ) ); + } + cohPanCoh = ( tempCoh < tempCoh2 ) ? tempCoh : tempCoh2; + lsEnergyRelation = lsEnergy[i2] / ( lsEnergy[i1] + EPSILON ); + tempLsEnergyRelation = lsEnergy[i1] / ( lsEnergy[i2] + EPSILON ); + lsEnergyRelation = ( lsEnergyRelation < tempLsEnergyRelation ) ? lsEnergyRelation : tempLsEnergyRelation; + tempLsEnergyRelation = lsEnergy[i3] / ( lsEnergy[i1] + EPSILON ); + lsEnergyRelation = ( lsEnergyRelation < tempLsEnergyRelation ) ? lsEnergyRelation : tempLsEnergyRelation; + tempLsEnergyRelation = lsEnergy[i1] / ( lsEnergy[i3] + EPSILON ); + lsEnergyRelation = ( lsEnergyRelation < tempLsEnergyRelation ) ? lsEnergyRelation : tempLsEnergyRelation; + cohwideness = cohPanCoh * lsEnergyRelation; + + spreadCoh = ( cohwideness > stereoness ) ? cohwideness : stereoness; + if ( spreadCoh > 0.5f ) + { + if ( cohwideness > stereoness ) + { + tempCoh = stereoness - ( cohwideness - 0.5f ); + spreadCoh = ( tempCoh > 0.5f ) ? tempCoh : 0.5f; + } + } + spreadCoh = ( spreadCoh < 1.0f ) ? spreadCoh : 1.0f; + spreadCoh = ( spreadCoh > 0.0f ) ? spreadCoh : 0.0f; + + /* Compute energy ratio tuning parameter */ + lsEnergySum = sum_f( lsEnergy, numAnalysisChannels ) + EPSILON; + lsEnergyRelation = ( lsEnergy[i2] + lsEnergy[i3] ) / lsEnergySum; + stereoRatio = stereoCoh * lsEnergyRelation - surrCoh; + + lsEnergyRelation = ( lsEnergy[i1] + lsEnergy[i2] + lsEnergy[i3] ) / lsEnergySum; + cohPanRatio = cohPanCoh * lsEnergyRelation - surrCoh; + + cohRatio = ( stereoRatio > cohPanRatio ) ? stereoRatio : cohPanRatio; + cohRatio = ( cohRatio < 1.0f ) ? cohRatio : 1.0f; + cohRatio = ( cohRatio > 0.0f ) ? cohRatio : 0.0f; + } + else /* Otherwise, set spread coherence to zero */ + { + spreadCoh = 0.0f; + cohRatio = 0.0f; + lsEnergySum = sum_f( lsEnergy, numAnalysisChannels ); + } + + /* Store values */ + spreadCoherence[block_m_idx][band_m_idx] = spreadCoh; + + if ( hMcMasa->combineRatios ) + { + surroundingCoherence[0][band_m_idx] += lsEnergySum * surrCoh; + coherentEnergyRatio[0][band_m_idx] += lsEnergySum * cohRatio; + renormalization_factor_coh[band_m_idx] += lsEnergySum; + } + else + { + surroundingCoherence[block_m_idx][band_m_idx] = surrCoh; + coherentEnergyRatio[block_m_idx][band_m_idx] = cohRatio; + } + } + } + + if ( hMcMasa->combineRatios ) + { + for ( band_m_idx = 0; band_m_idx < hMcMasa->nbands; band_m_idx++ ) + { + if ( renormalization_factor_diff[band_m_idx] > EPSILON ) + { + diffuseness_m[0][band_m_idx] /= renormalization_factor_diff[band_m_idx]; + } + else + { + diffuseness_m[0][band_m_idx] = 0.f; + } + if ( renormalization_factor_coh[band_m_idx] > EPSILON ) + { + surroundingCoherence[0][band_m_idx] /= renormalization_factor_coh[band_m_idx]; + coherentEnergyRatio[0][band_m_idx] /= renormalization_factor_coh[band_m_idx]; + } + else + { + surroundingCoherence[0][band_m_idx] = 0.f; + coherentEnergyRatio[0][band_m_idx] = 0.f; + } + } + } + + /* Determine energy ratios */ + if ( hMcMasa->combineRatios ) + { + numSubFramesForRatio = 1; + } + else + { + numSubFramesForRatio = MAX_PARAM_SPATIAL_SUBFRAMES; + } + + for ( i = 0; i < numSubFramesForRatio; i++ ) + { + for ( j = 0; j < hMcMasa->nbands; j++ ) + { + energyRatio[i][j] = 1.0f - diffuseness_m[i][j]; + energyRatio[i][j] = ( energyRatio[i][j] > coherentEnergyRatio[i][j] ) ? energyRatio[i][j] : coherentEnergyRatio[i][j]; + } + } + + return; +} + + +/*--------------------------------------------------------------------------* + * ivas_mcmasa_dmx_modify() + * + * + *--------------------------------------------------------------------------*/ + +void ivas_mcmasa_dmx_modify( + const int16_t n_samples, /* i : input frame length in samples */ + float dmx[][L_FRAME48k + NS2SA( 48000, IVAS_FB_ENC_DELAY_NS )], /* i/o: downmix signal to be transformed into another format */ + const int16_t n_chnls_dmx_old, /* i : number of downmix channels in the old format */ + const int16_t n_chnls_dmx_new ) /* i : number of downmix channels in the target format */ +{ + /* assumed data ordering in **dmx: [sce][cpe_chnl0][cpe_chnl1], i.e., [c][l][r] */ + int16_t i; + + assert( ( n_chnls_dmx_old == 1 || n_chnls_dmx_old == 2 || n_chnls_dmx_old == 3 ) && "Input downmix may contain only 1-3 channels." ); + assert( ( n_chnls_dmx_new == 1 || n_chnls_dmx_new == 2 || n_chnls_dmx_new == 3 ) && "Output downmix may contain only 1-3 channels." ); + + if ( n_chnls_dmx_old == n_chnls_dmx_new ) + { + /* same dmx layout -> nothing to do */ + return; + } + + if ( n_chnls_dmx_old == 1 ) + { + /* split mono energy into identical channels */ + for ( i = 0; i < n_samples; i++ ) + { + if ( n_chnls_dmx_new == 2 ) + { + dmx[1][i] = dmx[0][i] * INV_SQRT2; + dmx[2][i] = dmx[1][i]; + } + else if ( n_chnls_dmx_new == 3 ) + { + dmx[0][i] = dmx[0][i] * INV_SQRT3; + } + } + } + else if ( n_chnls_dmx_old == 2 ) + { + for ( i = 0; i < n_samples; i++ ) + { + if ( n_chnls_dmx_new == 1 ) + { + /* sum l and r */ + dmx[0][i] = dmx[1][i] + dmx[2][i]; + } + else if ( n_chnls_dmx_new == 3 ) + { + dmx[0][i] = 0.5f * ( dmx[1][i] + dmx[2][i] ); + dmx[1][i] = dmx[1][i] - dmx[0][i]; + dmx[2][i] = dmx[2][i] - dmx[0][i]; + } + } + } + else if ( n_chnls_dmx_old == 3 ) + { + for ( i = 0; i < n_samples; i++ ) + { + if ( n_chnls_dmx_new == 1 ) + { + /* sum all channels */ + dmx[0][i] = dmx[0][i] + dmx[1][i] + dmx[2][i]; + } + else if ( n_chnls_dmx_new == 2 ) + { + /* mix center into sides */ + dmx[0][i] *= INV_SQRT2; + dmx[1][i] += dmx[0][i]; + dmx[2][i] += dmx[0][i]; + } + } + } + + return; +} + + +/*--------------------------------------------------------------------------* + * Local functions + *--------------------------------------------------------------------------*/ + +/* Compute downmix */ +static void ivas_mcmasa_dmx( + MCMASA_ENC_HANDLE hMcMasa, + float *data_f[], + const int16_t input_frame, + const int16_t nchan_transport, + const int16_t nchan_inp ) +{ + int16_t i, j; + int16_t numAnalysisChannels; + float dmx_c; + float multiChEne, downmixEne; + float prevEQ, currEQ, instEQ; + float alpha; + + numAnalysisChannels = nchan_inp - 1; + if ( hMcMasa->separateChannelEnabled ) + { + numAnalysisChannels = nchan_inp - 2; + } + + multiChEne = 0.0f; + for ( j = 0; j < numAnalysisChannels; j++ ) + { + for ( i = 0; i < input_frame; i++ ) + { + multiChEne += data_f[j][i] * data_f[j][i]; + } + } + + if ( nchan_transport == 2 ) + { + int16_t numSideChannels; /* Channels other than left, right, center */ + int16_t leftIndex, rightIndex; + + numSideChannels = numAnalysisChannels / 2 - 1; + for ( j = 0; j < numSideChannels; j++ ) + { + if ( hMcMasa->separateChannelEnabled ) + { + leftIndex = j * 2 + 2; + rightIndex = j * 2 + 3; + } + else + { + leftIndex = j * 2 + 3; + rightIndex = j * 2 + 4; + } + + for ( i = 0; i < input_frame; i++ ) + { + data_f[0][i] += data_f[leftIndex][i]; + data_f[1][i] += data_f[rightIndex][i]; + } + } + + if ( !hMcMasa->separateChannelEnabled ) + { + for ( i = 0; i < input_frame; i++ ) + { + dmx_c = INV_SQRT2 * data_f[2][i]; + data_f[0][i] += dmx_c; + data_f[1][i] += dmx_c; + } + } + } + else if ( nchan_transport == 1 ) + { + for ( i = 0; i < input_frame; i++ ) + { + for ( j = 1; j < numAnalysisChannels; j++ ) + { + data_f[0][i] += data_f[j][i]; + } + } + } + + downmixEne = 0.0f; + for ( j = 0; j < nchan_transport; j++ ) + { + for ( i = 0; i < input_frame; i++ ) + { + downmixEne += data_f[j][i] * data_f[j][i]; + } + } + + alpha = 0.1f; + hMcMasa->prevMultiChEne = alpha * multiChEne + ( 1.0f - alpha ) * hMcMasa->prevMultiChEne; + hMcMasa->prevDownmixEne = alpha * downmixEne + ( 1.0f - alpha ) * hMcMasa->prevDownmixEne; + + prevEQ = hMcMasa->prevEQ; + currEQ = sqrtf( hMcMasa->prevMultiChEne / ( hMcMasa->prevDownmixEne + EPSILON ) ); + hMcMasa->prevEQ = currEQ; + + for ( i = 0; i < input_frame; i++ ) + { + instEQ = hMcMasa->interpolator[i] * currEQ + ( 1.0f - hMcMasa->interpolator[i] ) * prevEQ; + for ( j = 0; j < nchan_transport; j++ ) + { + data_f[j][i] *= instEQ; + } + } + + return; +} + + +/* Compute covariance matrix, i.e., xT * conj(x), and accumulate to the output */ +static void compute_cov_mtx( + float sr[MCMASA_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], /* i : Input matrix, real, s[ch][freq] */ + float si[MCMASA_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], /* i : Input matrix, imag, s[ch][freq] */ + const int16_t freq, /* i : Freq to process */ + const int16_t N, /* i : Number of channels */ + CovarianceMatrix *COVls /* o : Output matrix, contains upper part of cov mtx */ +) +{ + int16_t i, j; + float a, b, c, d; + + for ( i = 0; i < N; i++ ) + { + a = sr[i][freq]; + b = si[i][freq]; + for ( j = i; j < N; j++ ) + { + c = sr[j][freq]; + d = si[j][freq]; + COVls->xr[i][j] += a * c + b * d; + COVls->xi[i][j] += b * c - a * d; + } + } + + return; +} + + +static void computeIntensityVector_enc( + const int16_t *band_grouping, + float Cldfb_RealBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], + float Cldfb_ImagBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], + const int16_t enc_param_start_band, /* i : first band to process */ + const int16_t num_frequency_bands, + float intensity_real[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS] ) +{ + /* Reminder + * X = a + ib; Y = c + id + * X*Y = ac - bd + i(ad +bc) + */ + int16_t i, j; + float real, img; + int16_t brange[2]; + + for ( i = enc_param_start_band; i < enc_param_start_band + num_frequency_bands; i++ ) + { + brange[0] = band_grouping[i]; + brange[1] = band_grouping[i + 1]; + + intensity_real[0][i] = 0; + intensity_real[1][i] = 0; + intensity_real[2][i] = 0; + + for ( j = brange[0]; j < brange[1]; j++ ) + { + real = Cldfb_RealBuffer[0][j]; + img = Cldfb_ImagBuffer[0][j]; + intensity_real[0][i] += Cldfb_RealBuffer[3][j] * real + Cldfb_ImagBuffer[3][j] * img; + intensity_real[1][i] += Cldfb_RealBuffer[1][j] * real + Cldfb_ImagBuffer[1][j] * img; + intensity_real[2][i] += Cldfb_RealBuffer[2][j] * real + Cldfb_ImagBuffer[2][j] * img; + } + } + + return; +} + + +/*------------------------------------------------------------------------- + * computeVerticalDiffuseness() + * + * + *------------------------------------------------------------------------*/ + +static void computeVerticalDiffuseness( + float **buffer_intensity, /* i : Intensity vectors */ + const float *buffer_energy, /* i : Energy */ + const int16_t averaging_length, /* i : Averaging length */ + const int16_t num_freq_bands, /* i : Number of frequency bands */ + float *diffuseness /* o : Estimated diffuseness */ +) +{ + float intensity_slow[MASA_FREQUENCY_BANDS]; + float intensity_slow_abs[MASA_FREQUENCY_BANDS]; + float energy_slow[MASA_FREQUENCY_BANDS]; + int16_t i, k; + float tmp = 0; + const float *p_tmp_c; + + /* Set variables to zero */ + set_f( intensity_slow, 0.0f, MASA_FREQUENCY_BANDS ); + set_f( energy_slow, 0.0f, MASA_FREQUENCY_BANDS ); + + for ( i = 0; i < averaging_length; ++i ) + { + /* Energy slow */ + p_tmp_c = buffer_energy + i * num_freq_bands; + for ( k = 0; k < num_freq_bands; k++ ) + { + energy_slow[k] += *( p_tmp_c++ ); + } + + /* Intensity slow */ + for ( k = 0; k < num_freq_bands; k++ ) + { + intensity_slow[k] += buffer_intensity[i][k]; + } + } + + /* Compute absolute value */ + for ( k = 0; k < num_freq_bands; k++ ) + { + intensity_slow_abs[k] = fabsf( intensity_slow[k] ); + } + + /* Compute Diffuseness */ + for ( i = 0; i < num_freq_bands; ++i ) + { + tmp = intensity_slow_abs[i] / ( energy_slow[i] + EPSILON ); + tmp = ( tmp - VERTICAL_ENERGY_RATIO_OFFSET ) / ( 1.0f - VERTICAL_ENERGY_RATIO_OFFSET ); /* Tuned to avoid effect due to ambience of vertically un-even setups */ + tmp = 1.0f - tmp; + diffuseness[i] = ( ( tmp < 1.0f ) ? ( ( tmp < 0.0f ) ? 0.f : tmp ) : 1.0f ); + } + + return; +} + + +static void computeEvenLayout( + const float *ls_azimuth, + float *ls_azimuth_even, + const int16_t numChannels ) +{ + int16_t i; + int16_t j; + float ls_azimuth_temp[MCMASA_MAX_ANA_CHANS]; + float ls_azimuth_even_ordered[MCMASA_MAX_ANA_CHANS]; + int16_t ls_azimuth_order[MCMASA_MAX_ANA_CHANS]; + float smallestAzimuth; + int16_t smallestAzimuthIndex; + float lsSpacing; + uint8_t oddLayout; + float startAzimuth; + int16_t numChannelsHalf; + + lsSpacing = 360.0f / (float) numChannels; + oddLayout = numChannels % 2; + numChannelsHalf = numChannels / 2; + + mvr2r( ls_azimuth, ls_azimuth_temp, numChannels ); + for ( i = 0; i < numChannels; i++ ) + { + smallestAzimuth = 1000.0f; + smallestAzimuthIndex = 0; + for ( j = 0; j < numChannels; j++ ) + { + if ( ls_azimuth_temp[j] < smallestAzimuth ) + { + smallestAzimuth = ls_azimuth_temp[j]; + smallestAzimuthIndex = j; + } + } + ls_azimuth_order[i] = smallestAzimuthIndex; + ls_azimuth_temp[smallestAzimuthIndex] = 1000.0f; + } + + if ( oddLayout ) + { + startAzimuth = -lsSpacing * ( (float) numChannelsHalf ); + } + else + { + startAzimuth = -lsSpacing * ( (float) numChannelsHalf - 0.5f ); + } + + for ( i = 0; i < numChannels; i++ ) + { + ls_azimuth_even_ordered[i] = (float) i * lsSpacing + startAzimuth; + } + + for ( i = 0; i < numChannels; i++ ) + { + ls_azimuth_even[ls_azimuth_order[i]] = roundf( ls_azimuth_even_ordered[i] ); + } + + return; +} + +static void computeLfeEnergy( + MCMASA_ENC_HANDLE hMcMasa, + float *data_f[], + const int16_t input_frame ) +{ + int16_t l_ts; + int16_t block_m_idx; + int16_t mrange[2]; + int16_t separateChannelIndex; + int16_t lfeChannelIndex; + float *pcm_in[1]; + + + l_ts = input_frame / MDFT_NO_COL_MAX; + separateChannelIndex = hMcMasa->separateChannelIndex; + lfeChannelIndex = LFE_CHANNEL; + + if ( hMcMasa->separateChannelEnabled ) + { + mvr2r( data_f[lfeChannelIndex], &( hMcMasa->delay_buffer_lfe[0][hMcMasa->num_samples_delay_comp - hMcMasa->offset_comp] ), hMcMasa->offset_comp ); + mvr2r( data_f[separateChannelIndex], &( hMcMasa->delay_buffer_lfe[1][hMcMasa->num_samples_delay_comp - hMcMasa->offset_comp] ), hMcMasa->offset_comp ); + } + else + { + pcm_in[0] = &data_f[lfeChannelIndex][0]; + } + + /* Reset variables */ + set_zero( hMcMasa->lfeLfEne, MAX_PARAM_SPATIAL_SUBFRAMES ); + set_zero( hMcMasa->totalLfEne, MAX_PARAM_SPATIAL_SUBFRAMES ); + + /* Compute low-frequency energies */ + if ( hMcMasa->separateChannelEnabled ) /* Using low-pass filter */ + { + float lowpassCoef; + int16_t i, j; + float delayedInputSignal[2][L_FRAME48k]; + float lowPassSignal[2][L_FRAME48k]; + + mvr2r( &( hMcMasa->delay_buffer_lfe[0][0] ), &( delayedInputSignal[0][0] ), hMcMasa->num_slots_delay_comp * l_ts ); + mvr2r( data_f[lfeChannelIndex] + hMcMasa->offset_comp, &( delayedInputSignal[0][hMcMasa->num_slots_delay_comp * l_ts] ), ( MDFT_NO_COL_MAX - hMcMasa->num_slots_delay_comp ) * l_ts ); + mvr2r( &( hMcMasa->delay_buffer_lfe[1][0] ), &( delayedInputSignal[1][0] ), hMcMasa->num_slots_delay_comp * l_ts ); + mvr2r( data_f[separateChannelIndex] + hMcMasa->offset_comp, &( delayedInputSignal[1][hMcMasa->num_slots_delay_comp * l_ts] ), ( MDFT_NO_COL_MAX - hMcMasa->num_slots_delay_comp ) * l_ts ); + + lowpassCoef = 1.0f / ( (float) hMcMasa->ringBufferSize ); + + for ( i = 0; i < input_frame; i++ ) + { + for ( j = 0; j < 2; j++ ) + { + hMcMasa->lowpassSum[j] += lowpassCoef * delayedInputSignal[j][i] - lowpassCoef * hMcMasa->lfeAnaRingBuffer[j][hMcMasa->ringBufferPointer]; + lowPassSignal[j][i] = hMcMasa->lowpassSum[j]; + hMcMasa->lfeAnaRingBuffer[j][hMcMasa->ringBufferPointer] = delayedInputSignal[j][i]; + } + + hMcMasa->ringBufferPointer--; + if ( hMcMasa->ringBufferPointer < 0 ) + { + hMcMasa->ringBufferPointer = hMcMasa->ringBufferSize - 1; + } + } + + for ( block_m_idx = 0; block_m_idx < MAX_PARAM_SPATIAL_SUBFRAMES; block_m_idx++ ) + { + mrange[0] = hMcMasa->block_grouping[block_m_idx] * l_ts; + mrange[1] = hMcMasa->block_grouping[block_m_idx + 1] * l_ts; + + for ( i = mrange[0]; i < mrange[1]; i++ ) + { + hMcMasa->lfeLfEne[block_m_idx] += lowPassSignal[0][i] * lowPassSignal[0][i]; + hMcMasa->totalLfEne[block_m_idx] += lowPassSignal[1][i] * lowPassSignal[1][i]; + } + hMcMasa->totalLfEne[block_m_idx] += hMcMasa->lfeLfEne[block_m_idx]; + } + } + else /* Using CLDFB */ + { + int16_t ts; + int16_t i; + float Chnl_RealBuffer[2][DIRAC_NO_FB_BANDS_MAX]; + float Chnl_ImagBuffer[2][DIRAC_NO_FB_BANDS_MAX]; + float *p_Chnl_RealBuffer[2]; + float *p_Chnl_ImagBuffer[2]; + + p_Chnl_RealBuffer[0] = &Chnl_RealBuffer[0][0]; + p_Chnl_RealBuffer[1] = &Chnl_RealBuffer[1][0]; + p_Chnl_ImagBuffer[0] = &Chnl_ImagBuffer[0][0]; + p_Chnl_ImagBuffer[1] = &Chnl_ImagBuffer[1][0]; + + for ( block_m_idx = 0; block_m_idx < MAX_PARAM_SPATIAL_SUBFRAMES; block_m_idx++ ) + { + mrange[0] = hMcMasa->block_grouping[block_m_idx]; + mrange[1] = hMcMasa->block_grouping[block_m_idx + 1]; + + for ( ts = mrange[0]; ts < mrange[1]; ts++ ) + { + ivas_fb_mixer_get_windowed_fr( hMcMasa->hFbMixerLfe, pcm_in, p_Chnl_RealBuffer, p_Chnl_ImagBuffer, l_ts, l_ts, hMcMasa->hFbMixerLfe->fb_cfg->num_in_chans ); + + ivas_fb_mixer_update_prior_input( hMcMasa->hFbMixerLfe, pcm_in, l_ts, hMcMasa->hFbMixerLfe->fb_cfg->num_in_chans ); + + pcm_in[0] += l_ts; + + /* Compute low frequency energy for LFE, for other channels it is computed in ivas_chnl_param_est_enc() */ + for ( i = 0; i < CLDFB_TO_MDFT_FAC; i++ ) + { + hMcMasa->lfeLfEne[block_m_idx] += Chnl_RealBuffer[0][i] * Chnl_RealBuffer[0][i] + Chnl_ImagBuffer[0][i] * Chnl_ImagBuffer[0][i]; + } + } + } + } + + if ( hMcMasa->separateChannelEnabled ) + { + mvr2r( data_f[lfeChannelIndex] + ( input_frame - hMcMasa->num_samples_delay_comp + hMcMasa->offset_comp ), &( hMcMasa->delay_buffer_lfe[0][0] ), ( hMcMasa->num_samples_delay_comp - hMcMasa->offset_comp ) ); + mvr2r( data_f[separateChannelIndex] + ( input_frame - hMcMasa->num_samples_delay_comp + hMcMasa->offset_comp ), &( hMcMasa->delay_buffer_lfe[1][0] ), ( hMcMasa->num_samples_delay_comp - hMcMasa->offset_comp ) ); + } + + return; +} diff --git a/lib_enc/ivas_mct_core_enc.c b/lib_enc/ivas_mct_core_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..84aef1d46015d1295adf49798dc7376b094d3439 --- /dev/null +++ b/lib_enc/ivas_mct_core_enc.c @@ -0,0 +1,543 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include "options.h" +#include "cnst.h" +#include "prot.h" +#include "ivas_prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + + +/*----------------------------------------------------------* + * FindChannelRatio() + * + * find ratio of channel energy to total energy for + * bit distribution + *----------------------------------------------------------*/ + +static void FindChannelRatio( + Encoder_State **sts, /* i/o: encoder state structure */ + int16_t chBitRatios[MCT_MAX_CHANNELS], /* o : bit-disctribution channel ratios */ + const int16_t nChannels /* i : number of channels to be coded */ +) +{ + float sum_nrg, chRatio; + int16_t i; + float nrg[MCT_MAX_CHANNELS]; + + set_f( nrg, 0, MCT_MAX_CHANNELS ); + + getChannelEnergies( sts, nrg, nChannels ); + + /*calculate total energy without LFE*/ + sum_nrg = 0; + for ( i = 0; i < nChannels; i++ ) + { + if ( sts[i]->mct_chan_mode != MCT_CHAN_MODE_IGNORE ) + { + sum_nrg += nrg[i]; + } + } + sum_nrg = 1.0f / max( sum_nrg, EPSILON ); + + for ( i = 0; i < nChannels; i++ ) + { + if ( sts[i]->mct_chan_mode != MCT_CHAN_MODE_IGNORE ) + { + chRatio = nrg[i] * sum_nrg; + chBitRatios[i] = min( BITRATE_MCT_RATIO_RANGE - 1, max( 1, (uint16_t) ( BITRATE_MCT_RATIO_RANGE * chRatio + 0.5f ) ) ); + } + else if ( sts[i]->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) + { + chBitRatios[i] = 0; + } + } + + + return; +} + + +/*----------------------------------------------------------* + * AdjustChannelRatios() + * + * adjust ratio of channels for bit distribution + *----------------------------------------------------------*/ + +static void AdjustChannelRatios( + int16_t chBitRatios[MCT_MAX_CHANNELS], /* o : bit-disctribution channel ratios */ + const int16_t nChannels, /* i/o: number of channels */ + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + const int16_t nAvailBits, /* i : number of available bits */ + const int16_t sba_order /* i : Ambisonic (SBA) order */ +) +{ + int16_t force_ch_bit_ratios[IVAS_SPAR_MAX_DMX_CHS]; + int32_t temp_brs[IVAS_SPAR_MAX_DMX_CHS]; + float cur_ratio, tar_ratio, sum_ratio, sum_tar_ratio; + int16_t ratio_diff, i; + + ivas_spar_bitrate_dist( temp_brs, nAvailBits, ivas_total_brate, sba_order, (int16_t) FB ); + + sum_ratio = 0.0f; + for ( i = 0; i < nChannels; i++ ) + { + sum_ratio += (float) temp_brs[i]; + } + for ( i = 0; i < nChannels; i++ ) + { + cur_ratio = temp_brs[i] / sum_ratio; + force_ch_bit_ratios[i] = min( BITRATE_MCT_RATIO_RANGE - 1, max( 1, (uint16_t) ( BITRATE_MCT_RATIO_RANGE * cur_ratio + 0.5f ) ) ); + } + + /* adjust the ratios further based on received chBitRatios[]*/ + ratio_diff = 0; + sum_ratio = 0.0f; + sum_tar_ratio = 0.0f; + for ( i = 0; i < nChannels; i++ ) + { + sum_ratio += (float) chBitRatios[i]; + sum_tar_ratio += (float) force_ch_bit_ratios[i]; + } + for ( i = 3; i < nChannels; i++ ) + { + cur_ratio = (float) chBitRatios[i] / ( sum_ratio + FLT_MIN ); + tar_ratio = (float) force_ch_bit_ratios[i] / ( sum_tar_ratio + FLT_MIN ); + + tar_ratio = min( tar_ratio, cur_ratio ); + chBitRatios[i] = (int16_t) ( tar_ratio * sum_tar_ratio ); + chBitRatios[i] = max( 1, chBitRatios[i] ); + assert( chBitRatios[i] < ( BITRATE_MCT_RATIO_RANGE - 1 ) ); + ratio_diff += force_ch_bit_ratios[i] - chBitRatios[i]; + } + + for ( i = 0; i < min( 3, nChannels ); i++ ) + { + assert( force_ch_bit_ratios[i] >= 0 ); + chBitRatios[i] = min( BITRATE_MCT_RATIO_RANGE - 1, force_ch_bit_ratios[i] ); + } + chBitRatios[1] += ratio_diff; + + /* make sure final ratios are within range*/ + sum_ratio = 0.0f; + for ( i = 0; i < nChannels; i++ ) + { + sum_ratio += (float) chBitRatios[i]; + } + for ( i = 0; i < nChannels; i++ ) + { + cur_ratio = chBitRatios[i] / sum_ratio; + chBitRatios[i] = min( BITRATE_MCT_RATIO_RANGE - 1, max( 1, (uint16_t) ( BITRATE_MCT_RATIO_RANGE * cur_ratio + 0.5f ) ) ); + } + + return; +} + + +/*-------------------------------------------------------------------* + * ivas_mct_core_enc() + * + * joint mct encoding + *-------------------------------------------------------------------*/ + +void ivas_mct_core_enc( + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + MCT_ENC_HANDLE hMCT, /* i/o: MCT encoder structure */ + CPE_ENC_HANDLE hCPE[MCT_MAX_BLOCKS], /* i/o: CPE encoder structures */ + const int16_t nChannels, /* i : number of channels to be coded */ + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + const int16_t switch_bw, /* i : flag bandwidth switch occurance */ + const int16_t lfe_bits, /* i : bits spent for LFE */ + const int16_t sba_order /* i : Ambisonic (SBA) order */ +) +{ + int16_t ch, ch_core, nSubframes, L_subframeTCX; + int16_t i, cpe_id, n, nAvailBits; + int16_t nCPE; + float *orig_spectrum[MCT_MAX_CHANNELS][2]; /* Pointers to MDCT output for a short block (L/R) */ + float powerSpec[MCT_MAX_CHANNELS][L_FRAME48k]; + float powerSpecMsInv_long[MCT_MAX_CHANNELS][L_FRAME48k]; /* MS inv power spectrum, also inverse MDST spectrum */ + float *powerSpecMsInv[MCT_MAX_CHANNELS][2]; + float *inv_mdst_spectrum[MCT_MAX_CHANNELS][2]; + float *inv_spectrum[MCT_MAX_CHANNELS][2]; + float *mdst_spectrum[MCT_MAX_CHANNELS][2]; + float inv_spectrum_long[MCT_MAX_CHANNELS][L_FRAME48k]; /* quantized MDCT spectrum, inv ms mask mdst spectrum, scratch for MS spectra in the MS decision */ + int16_t total_side_bits; + int16_t chBitRatios[MCT_MAX_CHANNELS]; + Encoder_State *sts[MCT_MAX_CHANNELS]; + Encoder_State *st; + int16_t sp_aud_decision0[MCT_MAX_CHANNELS]; + BSTR_ENC_HANDLE hBstr; + float mdst; + + + push_wmops( "mct_encoding" ); + + /*--------------------------------------------------------------* + * Initialization + *---------------------------------------------------------------*/ + + total_side_bits = 0; + + nCPE = nChannels / CPE_CHANNELS; + + /*in case of odd number of channels*/ + if ( ( nCPE * CPE_CHANNELS ) != nChannels ) + { + nCPE++; + } + + for ( ch = 0; ch < nChannels; ch++ ) + { + inv_mdst_spectrum[ch][0] = powerSpecMsInv[ch][0] = powerSpecMsInv_long[ch]; + inv_mdst_spectrum[ch][1] = powerSpecMsInv[ch][1] = powerSpecMsInv_long[ch] + N_TCX10_MAX; + inv_spectrum[ch][0] = inv_spectrum_long[ch]; + inv_spectrum[ch][1] = inv_spectrum_long[ch] + N_TCX10_MAX; + } + + for ( cpe_id = 0, i = 0; cpe_id < nCPE; cpe_id++ ) + { + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + sts[i] = hCPE[cpe_id]->hCoreCoder[ch]; + if ( hCPE[cpe_id]->hCoreCoder[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) + { + i++; + continue; + } + + mdst_spectrum[i][0] = hMCT->p_mdst_spectrum_long[cpe_id][ch]; + mdst_spectrum[i][1] = hMCT->p_mdst_spectrum_long[cpe_id][ch] + N_TCX10_MAX; + orig_spectrum[i][0] = hMCT->p_orig_spectrum_long[cpe_id][ch]; + orig_spectrum[i][1] = hMCT->p_orig_spectrum_long[cpe_id][ch] + N_TCX10_MAX; + + sp_aud_decision0[i] = hCPE[cpe_id]->hCoreCoder[0]->sp_aud_decision0; + + sts[i]->hTcxEnc->tns_ms_flag[0] = 0; + sts[i]->hTcxEnc->tns_ms_flag[1] = 0; + + i++; + } + } + + hBstr = sts[0]->hBstr; + + for ( ch = 0; ch < (int16_t) ( hMCT->nchan_out_woLFE * 0.5 ); ch++ ) + { + ch_core = ch * CPE_CHANNELS; + + if ( switch_bw ) + { + initMdctStereoEncData( hMCT->hBlockData[ch]->hStereoMdct, ivas_format, sts[ch_core]->element_mode, sts[ch_core]->element_brate, sts[ch_core]->bwidth, + sts[ch_core]->igf, sts[ch_core]->hIGFEnc->igfData.igfInfo.grid, 0 ); + } + + if ( sts[ch_core]->igf ) + { + /* calculate the igf start band from the igf start line */ + stereo_mdct_init_igf_start_band( &hMCT->hBlockData[ch]->hStereoMdct->stbParamsTCX20, 1.0f, sts[ch_core]->bwidth, sts[ch_core]->total_brate ); + + stereo_mdct_init_igf_start_band( &hMCT->hBlockData[ch]->hStereoMdct->stbParamsTCX10, 0.5f, sts[ch_core]->bwidth, sts[ch_core]->total_brate ); + } + else + { + hMCT->hBlockData[ch]->hStereoMdct->stbParamsTCX20.sfbIgfStart = -1; + hMCT->hBlockData[ch]->hStereoMdct->stbParamsTCX10.sfbIgfStart = -1; + hMCT->hBlockData[ch]->hStereoMdct->stbParamsTCX10.nBandsStereoCore = hMCT->hBlockData[ch]->hStereoMdct->stbParamsTCX10.sfbCnt; + hMCT->hBlockData[ch]->hStereoMdct->stbParamsTCX20.nBandsStereoCore = hMCT->hBlockData[ch]->hStereoMdct->stbParamsTCX20.sfbCnt; + } + } + + for ( ch = 0; ch < nChannels; ch++ ) + { + st = sts[ch]; + + if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) + { + continue; + } + + nSubframes = ( st->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; + + for ( n = 0; n < nSubframes; n++ ) + { + st->side_bits_frame_channel += NBITS_TCX_GAIN + NOISE_FILL_RANGES * NBITS_NOISE_FILL_LEVEL; + } + + /* Add estimated stereo bits */ + st->side_bits_frame_channel += NBBITS_MCT_RATIO; + } + + /*--------------------------------------------------------------* + * MCT algorithm + *---------------------------------------------------------------*/ + + apply_MCT_enc( hMCT, sts, mdst_spectrum, inv_spectrum, inv_mdst_spectrum, nChannels ); + + /*--------------------------------------------------------------* + * Power spectrum calculation for Noise Estimation + *---------------------------------------------------------------*/ + + for ( ch = 0; ch < nChannels; ch++ ) + { + if ( sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) + { + continue; + } + nSubframes = ( sts[ch]->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; + L_subframeTCX = sts[ch]->hTcxEnc->L_frameTCX / nSubframes; + /* in MCT only relevant for bitrate switching from non-MCT bitrates */ + if ( sts[ch]->last_core == ACELP_CORE ) + { + L_subframeTCX += L_subframeTCX / 4; + } + + for ( n = 0; n < nSubframes; n++ ) + { + if ( sts[ch]->hTcxEnc->tns_ms_flag[n] ) + { + /* power spectrum: MDCT^2 + MDST^2 */ + for ( i = 0; i < L_subframeTCX; i++ ) + { + powerSpec[ch][i + n * L_subframeTCX] = mdst_spectrum[ch][n][i] * mdst_spectrum[ch][n][i] + sts[ch]->hTcxEnc->spectrum[n][i] * sts[ch]->hTcxEnc->spectrum[n][i]; + powerSpecMsInv[ch][n][i] = inv_mdst_spectrum[ch][n][i] * inv_mdst_spectrum[ch][n][i] + inv_spectrum[ch][n][i] * inv_spectrum[ch][n][i]; + } + } + else + { + if ( hMCT->currBlockDataCnt > 0 ) + { + /* power spectrum: MDCT^2 + MDST^2 */ + powerSpecMsInv[ch][n][0] = inv_spectrum[ch][n][0] * inv_spectrum[ch][n][0]; + + for ( i = 1; i < L_subframeTCX - 1; i++ ) + { + mdst = ( inv_spectrum[ch][n][i + 1] - inv_spectrum[ch][n][i - 1] ); /* An MDST estimate */ + powerSpecMsInv[ch][n][i] = mdst * mdst + inv_spectrum[ch][n][i] * inv_spectrum[ch][n][i]; + } + + powerSpecMsInv[ch][n][L_subframeTCX - 1] = inv_spectrum[ch][n][L_subframeTCX - 1] * inv_spectrum[ch][n][L_subframeTCX - 1]; + } + + /* power spectrum: MDCT^2 + MDST^2 */ + powerSpec[ch][n * L_subframeTCX] = sts[ch]->hTcxEnc->spectrum[n][0] * sts[ch]->hTcxEnc->spectrum[n][0]; + + for ( i = 1; i < L_subframeTCX - 1; i++ ) + { + mdst = ( sts[ch]->hTcxEnc->spectrum[n][i + 1] - sts[ch]->hTcxEnc->spectrum[n][i - 1] ); /* An MDST estimate */ + powerSpec[ch][i + n * L_subframeTCX] = mdst * mdst + sts[ch]->hTcxEnc->spectrum[n][i] * sts[ch]->hTcxEnc->spectrum[n][i]; + } + powerSpec[ch][L_subframeTCX - 1 + n * L_subframeTCX] = sts[ch]->hTcxEnc->spectrum[n][L_subframeTCX - 1] * sts[ch]->hTcxEnc->spectrum[n][L_subframeTCX - 1]; + } + } + } + + for ( ch = 0; ch < nChannels; ch++ ) + { + st = sts[ch]; + if ( sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) + { + continue; + } + nSubframes = ( st->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; + L_subframeTCX = st->hTcxEnc->L_frameTCX / nSubframes; + /* in MCT only relevant for bitrate switching from non-MCT bitrates */ + if ( st->last_core == ACELP_CORE ) + { + L_subframeTCX += L_subframeTCX / 4; + } + + if ( ( st->hTcxEnc->tcxMode == TCX_20 ) && ( st->total_brate < HQ_96k || st->igf ) ) + { + /*-----------------------------------------------------------* + * Compute noise-measure flags for spectrum filling * + * and quantization (0: tonal, 1: noise-like). * + * Detect low pass if present. * + *-----------------------------------------------------------*/ + + ComputeSpectrumNoiseMeasure( powerSpec[ch], st->hTcxEnc->L_frameTCX, st->hTcxEnc->nmStartLine, ( st->L_frame * st->last_sr_core != st->L_frame_past * st->sr_core ) || ( st->last_core != TCX_20_CORE ), st->hTcxEnc->memQuantZeros, st->hTcxEnc->L_frameTCX ); + } + + st->hTcxEnc->measuredBwRatio = 1.f; /* No bandwidth limit for the noise filling */ + } + + if ( sts[0]->igf ) + { + if ( hMCT->currBlockDataCnt > 0 ) + { + mctStereoIGF_enc( hMCT, sts, orig_spectrum, powerSpec, powerSpecMsInv, inv_spectrum, sp_aud_decision0 ); + } + else + { + for ( ch = 0; ch < nChannels; ch++ ) + { + st = sts[ch]; + + /* update the pointer to the buffer of indices of the second channel */ + if ( ch > 0 ) + { + st->hBstr->ind_list = sts[0]->hBstr->ind_list + sts[0]->hBstr->nb_ind_tot; + } + if ( + sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) + { + continue; + } + nSubframes = ( st->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; + L_subframeTCX = st->hTcxEnc->L_frameTCX / nSubframes; + + if ( st->igf ) + { + for ( n = 0; n < nSubframes; n++ ) + { + ProcessIGF( st, st->hTcxEnc->spectrum[n], orig_spectrum[ch][n], &powerSpec[ch][n * L_subframeTCX], st->core == TCX_20_CORE, n, sp_aud_decision0[ch], 0 ); + } + } + } + } + + /*write IGF data to bitstream*/ + for ( ch = 0; ch < nChannels; ch++ ) + { + st = sts[ch]; + if ( + sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) + { + continue; + } + enc_prm_igf_mdct( st, hBstr ); + } + } + + /* correct side bits per channel*/ + for ( ch = 0; ch < nChannels; ch++ ) + { + st = sts[ch]; + + if ( sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) + { + continue; + } + + st->side_bits_frame_channel -= NBBITS_MCT_RATIO; /* Subtract estimated stereo bits */ + total_side_bits += st->side_bits_frame_channel; + } + + /*--------------------------------------------------------------* + * Bitrate distribution among channels and MCT bitstream writing + *---------------------------------------------------------------*/ + + write_mct_bitstream( sts, hMCT, nChannels ); + + FindChannelRatio( sts, chBitRatios, nChannels ); + + nAvailBits = (int16_t) ( ( ivas_total_brate / FRAMES_PER_SEC ) - NBITS_BWIDTH - hMCT->nBitsMCT - lfe_bits ); + + + /* subtract IVAS format signaling bits */ + if ( ivas_format == MC_FORMAT ) + { + nAvailBits -= IVAS_FORMAT_SIGNALING_NBITS; + nAvailBits -= MC_LS_SETUP_BITS; + } + else if ( ivas_format == SBA_FORMAT || ivas_format == SBA_ISM_FORMAT ) + { + nAvailBits -= IVAS_FORMAT_SIGNALING_NBITS_EXTENDED; + nAvailBits -= SBA_ORDER_BITS + SBA_PLANAR_BITS; + if ( ivas_format == SBA_ISM_FORMAT && nChannels > 4 ) + { + nAvailBits -= IVAS_COMBINED_FORMAT_SIGNALLING_BITS; + } + } + + for ( cpe_id = 0, i = 0; cpe_id < nCPE; cpe_id++ ) + { + if ( hCPE[cpe_id]->hMetaData != NULL ) + { + nAvailBits -= hCPE[cpe_id]->hMetaData->nb_bits_tot; + } + } + + /*substract bits needed for the bitrate ratios */ + for ( ch = 0; ch < nChannels; ch++ ) + { + if ( + sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) + { + continue; + } + nAvailBits -= NBBITS_MCT_RATIO; + } + nAvailBits -= total_side_bits + hMCT->nchan_out_woLFE; /* if MC 1 extra bit that was initially send to signal LFE_off */ + + + if ( hMCT->hbr_mct ) + { + assert( ivas_total_brate >= IVAS_256k ); + AdjustChannelRatios( chBitRatios, nChannels, ivas_total_brate, nAvailBits, sba_order ); + } + + for ( ch = 0; ch < nChannels; ch++ ) + { + if ( sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) + { + continue; + } + + push_next_indice( hBstr, chBitRatios[ch], NBBITS_MCT_RATIO ); + } + + /*distribute bits amongst channels*/ + splitAvailableBitsMCT( (void **) sts, nAvailBits, chBitRatios, ENC, nChannels ); + + for ( cpe_id = 0; cpe_id < nCPE; cpe_id++ ) + { + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + st = hCPE[cpe_id]->hCoreCoder[ch]; + if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) + { + continue; + } + st->total_brate = ( st->bits_frame_channel + st->side_bits_frame_channel ) * FRAMES_PER_SEC; + + } + } + + + pop_wmops(); + + return; +} diff --git a/lib_enc/ivas_mct_enc.c b/lib_enc/ivas_mct_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..e18b52bea15c3a81f728a9a9b927852808589f98 --- /dev/null +++ b/lib_enc/ivas_mct_enc.c @@ -0,0 +1,923 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include "options.h" +#include +#include "cnst.h" +#include "ivas_cnst.h" +#include "prot.h" +#include "ivas_prot.h" +#include "wmc_auto.h" + + +/*-----------------------------------------------------------------------* + * Local function prototypes + *-----------------------------------------------------------------------*/ + +static ivas_error ivas_mc_enc_reconfig( Encoder_Struct *st_ivas, const int16_t last_mc_mode ); + + +/*-------------------------------------------------------------------* + * set_mct_enc_params() + * + * Set hMCT handle parameters + *-------------------------------------------------------------------*/ + +static void set_mct_enc_params( + MCT_ENC_HANDLE hMCT, /* i/o: MCT encoder structure */ + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + const IVAS_FORMAT ivas_format, /* i : IVAS_format */ + const uint16_t b_nchan_change /* i : flag indicating different channel count */ +) +{ + int16_t n; + + if ( b_nchan_change ) + { + hMCT->currBlockDataCnt = 0; + + /*Initialize bits required to signal channel-pair index*/ + hMCT->bitsChannelPairIndex = max( 1, (int16_t) ( floorf( ( logf( (float) hMCT->nchan_out_woLFE * ( hMCT->nchan_out_woLFE - 1 ) / 2 - 1 ) * INV_LOG_2 ) ) + 1 ) ); + + set_s( hMCT->lowE_ch, 0, MCT_MAX_CHANNELS ); + + for ( n = 0; n < MCT_MAX_CHANNELS; n++ ) + { + set_f( hMCT->lastxCorrMatrix[n], 0, MCT_MAX_CHANNELS ); + } + } + + hMCT->hbr_mct = 0; + if ( ivas_format == SBA_FORMAT && ivas_total_brate >= IVAS_256k ) + { + hMCT->hbr_mct = 1; + } + + return; +} + +/*-------------------------------------------------------------------* + * map_input_to_cpe_channels() + * + * for MC_MODE map input channels to cpe channels + * mid channel (ch==2) is mapped to last odd-channel CPE + * all channels after LFE are mapped to cpe_id=1 and onwards + * E.g. for 5_1 and for 3 CPEs: + * cpe_id 0: L=data[0] R=data[1] + * cpe_id 1: L=data[4] R=data[5] + * cpe_id 2: L=data[2] (mid) R=NULL + *-------------------------------------------------------------------*/ + +static void map_input_to_cpe_channels( + const Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ + float *pdata[MAX_INPUT_CHANNELS], /* o : mapped input pointers */ + float *data[MCT_MAX_CHANNELS] /* i : input channel data */ +) +{ + int16_t i, n; + int16_t nchan_transport; + + nchan_transport = st_ivas->nchan_transport; + if ( st_ivas->hEncoderConfig->ivas_format == SBA_ISM_FORMAT && st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + { + nchan_transport += st_ivas->hEncoderConfig->nchan_ism; + } + i = 0; + + for ( n = 0; n < LFE_CHANNEL - 1; n++ ) + { + pdata[i] = data[n]; + i++; + } + if ( st_ivas->hEncoderConfig->ivas_format == MC_FORMAT && ( st_ivas->mc_mode == MC_MODE_MCT || st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) ) + { + for ( n = LFE_CHANNEL + 1; n < nchan_transport; n++ ) + { + pdata[i] = data[n]; + i++; + } + pdata[i] = data[LFE_CHANNEL - 1]; + } + else + { + for ( ; n < nchan_transport; n++ ) + { + pdata[i] = data[n]; + i++; + } + } + + /* odd channel CPE*/ + if ( ( nchan_transport < st_ivas->nCPE * CPE_CHANNELS ) || ( ( st_ivas->mc_mode == MC_MODE_MCT || st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) && st_ivas->hMCT->nchan_out_woLFE < st_ivas->nCPE * CPE_CHANNELS ) ) + + { + pdata[st_ivas->nCPE * CPE_CHANNELS - 1] = NULL; + } + + return; +} + + +/*-------------------------------------------------------------------* + * ivas_mct_enc() + * + * Multi-Channel Coding Tool (MCT) encoding routine + *-------------------------------------------------------------------*/ + +ivas_error ivas_mct_enc( + Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ + float *data[MCT_MAX_CHANNELS], /* i : input signal buffers */ + const int16_t input_frame, /* i : input frame length per channel */ + const int16_t nb_bits_metadata /* i : number of metadata bits */ +) +{ + int16_t n, cpe_id; + MCT_ENC_HANDLE hMCT; + CPE_ENC_HANDLE hCPE; + float mdst_spectrum_long[MCT_MAX_BLOCKS][CPE_CHANNELS][L_FRAME48k]; + float orig_spectrum_long[MCT_MAX_BLOCKS][CPE_CHANNELS][L_FRAME48k]; + int16_t switch_bw; + IVAS_FORMAT ivas_format; + int16_t max_bwidth; + int32_t ivas_total_brate; + ivas_error error; + float *pdata[MAX_INPUT_CHANNELS]; + + error = IVAS_ERR_OK; + + push_wmops( "ivas_mct_enc" ); + + /* Initialization */ + hMCT = st_ivas->hMCT; + hMCT->hBstr = st_ivas->hCPE[0]->hCoreCoder[0]->hBstr; /* pointer to write MCT side bits */ + + ivas_format = st_ivas->hEncoderConfig->ivas_format; + max_bwidth = st_ivas->hEncoderConfig->max_bwidth; + ivas_total_brate = st_ivas->hEncoderConfig->ivas_total_brate; + + + for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) + { + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + hCPE = st_ivas->hCPE[cpe_id]; + hMCT->p_mdst_spectrum_long[cpe_id][n] = mdst_spectrum_long[cpe_id][n]; + hMCT->p_orig_spectrum_long[cpe_id][n] = orig_spectrum_long[cpe_id][n]; + hCPE->hCoreCoder[n]->input_bwidth = hCPE->hCoreCoder[n]->last_input_bwidth; /* updated in BWD */ + hCPE->hCoreCoder[n]->bwidth = hCPE->hCoreCoder[n]->last_bwidth; /* updated in BWD */ + /* reset channel mode from previous state*/ + if ( ( hCPE->cpe_id * CPE_CHANNELS + n ) >= hMCT->nchan_out_woLFE ) + { + hCPE->hCoreCoder[n]->mct_chan_mode = MCT_CHAN_MODE_IGNORE; + } + else + { + hCPE->hCoreCoder[n]->mct_chan_mode = MCT_CHAN_MODE_REGULAR; + } + } + } + + /* reconfiguration in case of bitrate switching */ + if ( ivas_total_brate != st_ivas->hEncoderConfig->last_ivas_total_brate ) + { + int32_t cp_bitrate; + cp_bitrate = ivas_total_brate / hMCT->nchan_out_woLFE * CPE_CHANNELS; + + if ( st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + { + cp_bitrate = ivas_total_brate / st_ivas->nchan_transport * CPE_CHANNELS; + } + + for ( n = 0; n < (int16_t) ( hMCT->nchan_out_woLFE * 0.5 ); n++ ) + { + initMdctStereoEncData( hMCT->hBlockData[n]->hStereoMdct, ivas_format, IVAS_CPE_MDCT, cp_bitrate, max_bwidth, st_ivas->hCPE[0]->hCoreCoder[0]->igf, st_ivas->hCPE[0]->hCoreCoder[0]->igf ? st_ivas->hCPE[0]->hCoreCoder[0]->hIGFEnc->igfData.igfInfo.grid : NULL, 0 ); + } + } + + /* set coded audio band-width */ + switch_bw = set_bw_mct( st_ivas->hCPE, st_ivas->nCPE ); + + /*for MC and MCT remove pointer to LFE input that has been processed separately */ + map_input_to_cpe_channels( st_ivas, pdata, data ); + + /* pre-processing */ + for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) + { + if ( ( error = ivas_cpe_enc( st_ivas, cpe_id, pdata[cpe_id * CPE_CHANNELS], pdata[cpe_id * CPE_CHANNELS + 1], input_frame, nb_bits_metadata ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* joint MCT encoding */ + ivas_mct_core_enc( ivas_format, hMCT, st_ivas->hCPE, hMCT->nchan_out_woLFE, ivas_total_brate, switch_bw, ( ivas_format == MC_FORMAT && ( st_ivas->mc_mode == MC_MODE_MCT || st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) ) ? (int16_t) st_ivas->hLFE->lfe_bits : 0, st_ivas->hEncoderConfig->sba_order ); + + /* Spectrum quantization and coding */ + for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) + { + hCPE = st_ivas->hCPE[cpe_id]; + + if ( cpe_id > 0 ) + { + hCPE->hCoreCoder[0]->hBstr->ind_list = st_ivas->hCPE[cpe_id - 1]->hCoreCoder[1]->hBstr->ind_list + st_ivas->hCPE[cpe_id - 1]->hCoreCoder[1]->hBstr->nb_ind_tot; + } + + ivas_mdct_quant_coder( hCPE, hMCT->tnsBits[cpe_id], hMCT->tnsSize[cpe_id], hMCT->p_param[cpe_id], 1 ); + + /* update input samples buffer (as done in ivas_cpe_enc() for other than MCT coding) */ + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + mvr2r( hCPE->hCoreCoder[n]->input, hCPE->hCoreCoder[n]->old_input_signal, input_frame ); + + /* common encoder updates */ + updt_enc_common( hCPE->hCoreCoder[n] ); + } + } + + pop_wmops(); + return error; +} + + +/*------------------------------------------------------------------------- + * create_mct_enc() + * + * Create, allocate and initialize IVAS encoder MCT handle + *-------------------------------------------------------------------------*/ + +ivas_error create_mct_enc( + Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ +) +{ + MCT_ENC_HANDLE hMCT; + int16_t n; + int32_t cp_bitrate; + int16_t max_blocks; + int16_t cpe_id; + IVAS_FORMAT ivas_format; + int32_t ivas_total_brate; + + ivas_format = st_ivas->hEncoderConfig->ivas_format; + ivas_total_brate = st_ivas->hEncoderConfig->ivas_total_brate; + + /*-----------------------------------------------------------------* + * Allocate MCT handle + *-----------------------------------------------------------------*/ + + if ( ( hMCT = (MCT_ENC_HANDLE) malloc( sizeof( MCT_ENC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MCT\n" ) ); + } + + /*-----------------------------------------------------------------* + * Allocate and initialize MCT BlockData handles + *-----------------------------------------------------------------*/ + + /* Determine active channels */ + if ( ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCT ) + { + hMCT->nchan_out_woLFE = st_ivas->hEncoderConfig->nchan_inp - 1; /* LFE channel is coded separately */ + } + else if ( ivas_format == SBA_FORMAT || ivas_format == SBA_ISM_FORMAT ) + { + hMCT->nchan_out_woLFE = ivas_get_sba_num_TCs( ivas_total_brate, st_ivas->sba_analysis_order ); + if ( ivas_format == SBA_ISM_FORMAT && st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + { + hMCT->nchan_out_woLFE += st_ivas->hEncoderConfig->nchan_ism; + } + } + else if ( ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMMC ) + { + hMCT->nchan_out_woLFE = ivas_param_mc_getNumTransportChannels( ivas_total_brate, st_ivas->hEncoderConfig->mc_input_setup ); + } + else if ( ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) + { + hMCT->nchan_out_woLFE = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS - 1; + } +#ifndef FIX_785_REMOVE_DEAD_CODE + else if ( ivas_format == SBA_FORMAT ) + { + hMCT->nchan_out_woLFE = ivas_sba_get_nchan( st_ivas->sba_analysis_order, st_ivas->hEncoderConfig->sba_planar ); + } +#endif + + cp_bitrate = ivas_total_brate / hMCT->nchan_out_woLFE * CPE_CHANNELS; + if ( st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + { + cp_bitrate = ivas_total_brate / st_ivas->nchan_transport * CPE_CHANNELS; + } + + for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) + { + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + st_ivas->hCPE[cpe_id]->hCoreCoder[n]->mct_chan_mode = MCT_CHAN_MODE_REGULAR; + } + } + + /* in case we have an uneven number of transport channels, indicate last channel ID as inactive */ + if ( hMCT->nchan_out_woLFE % 2 ) + { + st_ivas->hCPE[st_ivas->nCPE - 1]->hCoreCoder[1]->mct_chan_mode = MCT_CHAN_MODE_IGNORE; + } + + /*Initialize MCT block data */ + max_blocks = hMCT->nchan_out_woLFE / CPE_CHANNELS; + + for ( n = 0; n < max_blocks; n++ ) + { + assert( st_ivas->hEncoderConfig->element_mode_init == IVAS_CPE_MDCT && "MCT is not supported for other stereo modes" ); + + if ( ( hMCT->hBlockData[n] = (MCT_BLOCK_DATA_HANDLE) malloc( sizeof( MCT_BLOCK_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MCT block data structure\n" ) ); + } + + /*Initialize all parameters to zero*/ + hMCT->hBlockData[n]->isActive = 0; + hMCT->hBlockData[n]->ch1 = 0; + hMCT->hBlockData[n]->ch2 = 0; + + /*-----------------------------------------------------------------* + * MDCT stereo initialization + *-----------------------------------------------------------------*/ + + if ( ( hMCT->hBlockData[n]->hStereoMdct = (STEREO_MDCT_ENC_DATA_HANDLE) malloc( sizeof( STEREO_MDCT_ENC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MDCT Stereo \n" ) ); + } + + initMdctStereoEncData( hMCT->hBlockData[n]->hStereoMdct, ivas_format, IVAS_CPE_MDCT, cp_bitrate, st_ivas->hEncoderConfig->max_bwidth, st_ivas->hCPE[0]->hCoreCoder[0]->igf, st_ivas->hCPE[0]->hCoreCoder[0]->igf ? st_ivas->hCPE[0]->hCoreCoder[0]->hIGFEnc->igfData.igfInfo.grid : NULL, 1 ); + } + + for ( ; n < MCT_MAX_BLOCKS; n++ ) + { + hMCT->hBlockData[n] = NULL; + } + + /*-----------------------------------------------------------------* + * Initializations + *-----------------------------------------------------------------*/ + + set_mct_enc_params( hMCT, ivas_total_brate, ivas_format, 1 ); + + st_ivas->hMCT = hMCT; + + return IVAS_ERR_OK; +} + + +/*------------------------------------------------------------------------- + * mct_enc_reconfigure() + * + * Reconfigure IVAS encoder MCT handle + *-------------------------------------------------------------------------*/ + +ivas_error mct_enc_reconfigure( + Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ + const uint16_t b_nchan_change /* i : flag indicating different channel count */ +) +{ + MCT_ENC_HANDLE hMCT; + Encoder_State *st; + int16_t n, cpe_id, max_blocks; + int32_t ivas_total_brate, cp_bitrate; + IVAS_FORMAT ivas_format; + ivas_error error; + + error = IVAS_ERR_OK; + + hMCT = st_ivas->hMCT; + ivas_format = st_ivas->hEncoderConfig->ivas_format; + ivas_total_brate = st_ivas->hEncoderConfig->ivas_total_brate; + + /*-----------------------------------------------------------------* + * Allocate and initialize MCT BlockData handles + *-----------------------------------------------------------------*/ + + if ( b_nchan_change ) + { + /* Determine active channels */ + if ( ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCT ) + { + hMCT->nchan_out_woLFE = st_ivas->hEncoderConfig->nchan_inp - 1; /* LFE channel is coded separately */ + } + else if ( ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) + { + hMCT->nchan_out_woLFE = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS - 1; + } + else if ( ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMMC ) + { + hMCT->nchan_out_woLFE = ivas_param_mc_getNumTransportChannels( ivas_total_brate, st_ivas->hEncoderConfig->mc_input_setup ); + } + else if ( ivas_format == SBA_FORMAT || ivas_format == SBA_ISM_FORMAT ) + { + hMCT->nchan_out_woLFE = st_ivas->nchan_transport; + if ( st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + { + hMCT->nchan_out_woLFE += st_ivas->hEncoderConfig->nchan_ism; + } + } + } + + cp_bitrate = ivas_total_brate / hMCT->nchan_out_woLFE * CPE_CHANNELS; + if ( st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + { + cp_bitrate = ivas_total_brate / st_ivas->nchan_transport * CPE_CHANNELS; + } + + for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) + { + st_ivas->hCPE[cpe_id]->element_brate = cp_bitrate; + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + st_ivas->hCPE[cpe_id]->hCoreCoder[n]->mct_chan_mode = MCT_CHAN_MODE_REGULAR; + } + } + + /* in case we have an uneven number of transport channels, indicate last channel ID as inactive */ + if ( hMCT->nchan_out_woLFE % 2 ) + { + st_ivas->hCPE[st_ivas->nCPE - 1]->hCoreCoder[1]->mct_chan_mode = MCT_CHAN_MODE_IGNORE; + } + + /* set correct nominal bitrates and igf config already here, otherwise we + * run into a number of problems; only do it when the bitrate changes */ + if ( ivas_total_brate != st_ivas->hEncoderConfig->last_ivas_total_brate ) + { + for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) + { + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + st = st_ivas->hCPE[cpe_id]->hCoreCoder[n]; + + st->total_brate = st_ivas->hCPE[cpe_id]->element_brate; + + if ( st->mct_chan_mode != MCT_CHAN_MODE_IGNORE ) + { + st->bits_frame_nominal = (int16_t) ( st_ivas->hCPE[cpe_id]->element_brate / FRAMES_PER_SEC ); + st->igf = getIgfPresent( st->element_mode, st->bits_frame_nominal * FRAMES_PER_SEC, st->bwidth, st->rf_mode ); + + if ( ( error = IGF_Reconfig( &st->hIGFEnc, st->igf, 1, st_ivas->hCPE[cpe_id]->element_brate, st->bwidth, st->element_mode, st->rf_mode ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + } + } + + /* Initialize MCT block data */ + max_blocks = hMCT->nchan_out_woLFE / CPE_CHANNELS; + + for ( n = 0; n < max_blocks; n++ ) + { + uint16_t mem_init = 0; + assert( st_ivas->hEncoderConfig->element_mode_init == IVAS_CPE_MDCT && "MCT is not supported for other stereo modes" ); + + if ( b_nchan_change ) + { + if ( hMCT->hBlockData[n] == NULL ) + { + mem_init = 1; + if ( ( hMCT->hBlockData[n] = (MCT_BLOCK_DATA_HANDLE) malloc( sizeof( MCT_BLOCK_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MCT block data structure\n" ) ); + } + + /*Initialize all parameters to zero*/ + hMCT->hBlockData[n]->isActive = 0; + hMCT->hBlockData[n]->ch1 = 0; + hMCT->hBlockData[n]->ch2 = 0; + + /*-----------------------------------------------------------------* + * MDCT stereo initialization + *-----------------------------------------------------------------*/ + + if ( ( hMCT->hBlockData[n]->hStereoMdct = (STEREO_MDCT_ENC_DATA_HANDLE) malloc( sizeof( STEREO_MDCT_ENC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MDCT Stereo \n" ) ); + } + } + } + + initMdctStereoEncData( hMCT->hBlockData[n]->hStereoMdct, ivas_format, IVAS_CPE_MDCT, cp_bitrate, st_ivas->hEncoderConfig->max_bwidth, st_ivas->hCPE[0]->hCoreCoder[0]->igf, st_ivas->hCPE[0]->hCoreCoder[0]->igf ? st_ivas->hCPE[0]->hCoreCoder[0]->hIGFEnc->igfData.igfInfo.grid : NULL, mem_init ); + } + + for ( ; n < MCT_MAX_BLOCKS; n++ ) + { + /* deallocate no longer needed blocks */ + if ( hMCT->hBlockData[n] != NULL ) + { + if ( hMCT->hBlockData[n]->hStereoMdct != NULL ) + { + free( hMCT->hBlockData[n]->hStereoMdct ); + hMCT->hBlockData[n]->hStereoMdct = NULL; + } + + free( hMCT->hBlockData[n] ); + hMCT->hBlockData[n] = NULL; + } + } + + /*-----------------------------------------------------------------* + * Initializations + *-----------------------------------------------------------------*/ + + set_mct_enc_params( hMCT, ivas_total_brate, ivas_format, b_nchan_change ); + + return error; +} + + +/*------------------------------------------------------------------------- + * ivas_mct_enc_close() + * + * Close MCT + *-------------------------------------------------------------------------*/ + +void ivas_mct_enc_close( + MCT_ENC_HANDLE *hMCT /* i/o: MCT encoder structure */ +) +{ + int16_t n, maxBlocks; + + if ( hMCT == NULL || *hMCT == NULL ) + { + return; + } + + maxBlocks = ( *hMCT )->nchan_out_woLFE / 2; + + for ( n = 0; n < maxBlocks; n++ ) + { + if ( ( *hMCT )->hBlockData[n] != NULL ) + { + if ( ( *hMCT )->hBlockData[n]->hStereoMdct != NULL ) + { + free( ( *hMCT )->hBlockData[n]->hStereoMdct ); + ( *hMCT )->hBlockData[n]->hStereoMdct = NULL; + } + + free( ( *hMCT )->hBlockData[n] ); + ( *hMCT )->hBlockData[n] = NULL; + } + } + + free( ( *hMCT ) ); + ( *hMCT ) = NULL; + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_mc_enc_config() + * + * - select MC format mode + * - write MC LS setup + * - reconfigure the MC format encoder + *-------------------------------------------------------------------------*/ + +ivas_error ivas_mc_enc_config( + Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ +) +{ + Encoder_State *st0; /* used for bitstream handling */ + MC_MODE last_mc_mode; + ivas_error error; + + error = IVAS_ERR_OK; + + last_mc_mode = st_ivas->mc_mode; + + /* select MC format mode */ + st_ivas->mc_mode = ivas_mc_mode_select( st_ivas->hEncoderConfig->mc_input_setup, st_ivas->hEncoderConfig->ivas_total_brate ); + + /* write MC LS setup */ + st0 = ( st_ivas->nSCE > 0 ) ? st_ivas->hSCE[0]->hCoreCoder[0] : st_ivas->hCPE[0]->hCoreCoder[0]; + push_indice( st0->hBstr, IND_SMODE, st_ivas->hEncoderConfig->mc_input_setup, MC_LS_SETUP_BITS ); + + /* MC format switching */ + if ( st_ivas->hEncoderConfig->last_ivas_total_brate != st_ivas->hEncoderConfig->ivas_total_brate || st_ivas->mc_mode != last_mc_mode ) + { + if ( ( error = ivas_mc_enc_reconfig( st_ivas, last_mc_mode ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + return error; +} + + +/*------------------------------------------------------------------------- + * ivas_mc_enc_reconfig() + * + * Reconfigure the MC format encoder + *-------------------------------------------------------------------------*/ + +static ivas_error ivas_mc_enc_reconfig( + Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ + const int16_t last_mc_mode /* i : last frame mc mode */ +) +{ + int16_t nchan_transport_old, nSCE_old, nCPE_old; + ivas_error error; + int32_t new_brate_SCE, new_brate_CPE; + + error = IVAS_ERR_OK; + + nchan_transport_old = st_ivas->nchan_transport; + nSCE_old = st_ivas->nSCE; + nCPE_old = st_ivas->nCPE; + + /*-----------------------------------------------------------------* + * Reconfigure MC modules + *-----------------------------------------------------------------*/ + + if ( st_ivas->mc_mode == MC_MODE_MCT ) + { + st_ivas->nSCE = 0; + st_ivas->nCPE = st_ivas->hEncoderConfig->nchan_inp / 2; + + st_ivas->nchan_transport = ivas_mc_ls_setup_get_num_channels( st_ivas->hEncoderConfig->mc_input_setup ); + + if ( last_mc_mode != MC_MODE_MCT ) + { + if ( st_ivas->hLFE != NULL ) + { + /* LFE handle */ + ivas_lfe_enc_close( &( st_ivas->hLFE ) ); + } + + /* create LFE handle */ + if ( ( error = ivas_create_lfe_enc( &st_ivas->hLFE, st_ivas->hEncoderConfig->input_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } + + /*De-allocate handles for other MC modes*/ + ivas_param_mc_enc_close( &( st_ivas->hParamMC ), st_ivas->hEncoderConfig->input_Fs ); + + ivas_mc_paramupmix_enc_close( &( st_ivas->hMCParamUpmix ), st_ivas->hEncoderConfig->input_Fs ); + + /* De-allocate McMasa-related handles */ + ivas_mcmasa_enc_close( &( st_ivas->hMcMasa ), st_ivas->hEncoderConfig->input_Fs ); + + ivas_masa_enc_close( &( st_ivas->hMasa ) ); + + ivas_qmetadata_close( &st_ivas->hQMetaData ); + } + } + else if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) + { + st_ivas->nSCE = 0; + st_ivas->nCPE = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS / 2; + st_ivas->nchan_transport = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS; + + if ( last_mc_mode != MC_MODE_PARAMUPMIX ) + { + if ( st_ivas->hLFE != NULL ) + { + /* LFE handle */ + ivas_lfe_enc_close( &( st_ivas->hLFE ) ); + } + + /* create LFE handle */ + if ( ( error = ivas_create_lfe_enc( &st_ivas->hLFE, st_ivas->hEncoderConfig->input_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( last_mc_mode != MC_MODE_PARAMUPMIX ) + { + if ( ( error = ivas_mc_paramupmix_enc_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /*De-allocate handles for other MC modes*/ + ivas_param_mc_enc_close( &st_ivas->hParamMC, st_ivas->hEncoderConfig->input_Fs ); + + /* De-allocate McMasa-related handles */ + ivas_mcmasa_enc_close( &( st_ivas->hMcMasa ), st_ivas->hEncoderConfig->input_Fs ); + + ivas_masa_enc_close( &( st_ivas->hMasa ) ); + + ivas_qmetadata_close( &st_ivas->hQMetaData ); + } + else if ( st_ivas->mc_mode == MC_MODE_PARAMMC ) + { + if ( last_mc_mode != MC_MODE_PARAMMC ) + { + if ( ( error = ivas_param_mc_enc_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + if ( ( error = ivas_param_mc_enc_reconfig( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* De-allocate McMasa-related handles */ + ivas_mcmasa_enc_close( &( st_ivas->hMcMasa ), st_ivas->hEncoderConfig->input_Fs ); + + if ( st_ivas->hMasa != NULL ) + { + ivas_masa_enc_close( &( st_ivas->hMasa ) ); + st_ivas->hMasa = NULL; + } + + ivas_mc_paramupmix_enc_close( &( st_ivas->hMCParamUpmix ), st_ivas->hEncoderConfig->input_Fs ); + + if ( last_mc_mode == MC_MODE_PARAMUPMIX && st_ivas->hLFE != NULL ) + { + /* LFE handle */ + ivas_lfe_enc_close( &( st_ivas->hLFE ) ); + } + + ivas_qmetadata_close( &st_ivas->hQMetaData ); + + /* De-allocate MCT handle if last mode was MCT */ + if ( last_mc_mode == MC_MODE_MCT && st_ivas->nchan_transport <= CPE_CHANNELS ) + { + ivas_mct_enc_close( &( st_ivas->hMCT ) ); + } + + if ( last_mc_mode == MC_MODE_MCT && st_ivas->hLFE != NULL ) + { + /* LFE handle */ + ivas_lfe_enc_close( &( st_ivas->hLFE ) ); + } + } + else if ( st_ivas->mc_mode == MC_MODE_MCMASA ) + { + if ( last_mc_mode != MC_MODE_MCMASA ) + { + ivas_mcmasa_setNumTransportChannels( &( st_ivas->nchan_transport ), &( st_ivas->hEncoderConfig->element_mode_init ), st_ivas->hEncoderConfig->ivas_total_brate ); + + if ( ( error = ivas_qmetadata_open( &( st_ivas->hQMetaData ) ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = ivas_masa_enc_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = ivas_mcmasa_enc_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + /* reconfigure McMASA instance */ + if ( ( error = ivas_mcmasa_enc_reconfig( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + ivas_param_mc_enc_close( &( st_ivas->hParamMC ), st_ivas->hEncoderConfig->input_Fs ); + + ivas_mc_paramupmix_enc_close( &( st_ivas->hMCParamUpmix ), st_ivas->hEncoderConfig->input_Fs ); + + if ( last_mc_mode == MC_MODE_PARAMUPMIX && st_ivas->hLFE != NULL ) + { + /* LFE handle */ + ivas_lfe_enc_close( &( st_ivas->hLFE ) ); + } + + if ( last_mc_mode == MC_MODE_MCT ) + { + /* LFE handle */ + ivas_lfe_enc_close( &( st_ivas->hLFE ) ); + + ivas_mct_enc_close( &( st_ivas->hMCT ) ); + } + } + + if ( st_ivas->mc_mode != MC_MODE_MCMASA ) + { + if ( st_ivas->nchan_transport == 1 ) + { + st_ivas->hEncoderConfig->element_mode_init = IVAS_SCE; + } + else + { + st_ivas->hEncoderConfig->element_mode_init = IVAS_CPE_MDCT; + } + } + + /*-----------------------------------------------------------------* + * Reconfigure core coder + *-----------------------------------------------------------------*/ + + /* special case: MCT->ParamMC with more than 2 TC, CPE 1 stays, but has the wrong mct_chan_mode in channel 1 + and might have IGF and TranDet static memory not allocated and the bit stream index list not set, + set correct mct_chan_mode and init missing static mem + do it here since it is _very_ MC specific */ + if ( last_mc_mode == MC_MODE_MCT && st_ivas->mc_mode == MC_MODE_PARAMMC && st_ivas->nchan_transport > CPE_CHANNELS ) + { + Encoder_State *st = st_ivas->hCPE[1]->hCoreCoder[1]; + + if ( st_ivas->nchan_transport == 3 ) + { + st->mct_chan_mode = MCT_CHAN_MODE_IGNORE; + } + else + { + st->mct_chan_mode = MCT_CHAN_MODE_REGULAR; + } + + if ( st->hTranDet == NULL ) + { + if ( ( st->hTranDet = (TRAN_DET_HANDLE) malloc( sizeof( TRAN_DET_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Transient Detection\n" ) ); + } + + InitTransientDetection( (int16_t) ( st->input_Fs / FRAMES_PER_SEC ), NS2SA( st->input_Fs, DELAY_FIR_RESAMPL_NS ), st->hTranDet, 0 ); + } + + if ( st->hIGFEnc == NULL ) + { + if ( ( st->hIGFEnc = (IGF_ENC_INSTANCE_HANDLE) malloc( sizeof( IGF_ENC_INSTANCE ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for hIGFEnc\n" ) ); + } + } + + st->igf = getIgfPresent( st->element_mode, st->total_brate, st->bwidth, st->rf_mode ); + + /* set last core to TCX20 */ + st->last_core = TCX_20_CORE; + } + + if ( st_ivas->mc_mode == MC_MODE_MCMASA ) + { + ivas_mcmasa_split_brate( st_ivas->hMcMasa->separateChannelEnabled, st_ivas->hEncoderConfig->ivas_total_brate, st_ivas->nSCE, st_ivas->nCPE, &new_brate_SCE, &new_brate_CPE ); + } + else if ( st_ivas->mc_mode == MC_MODE_MCT ) + { + new_brate_SCE = 0; + new_brate_CPE = ( st_ivas->hEncoderConfig->ivas_total_brate / ( st_ivas->nchan_transport - 1 ) ) * CPE_CHANNELS; + } + else if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) + { + new_brate_SCE = 0; + new_brate_CPE = ( st_ivas->hEncoderConfig->ivas_total_brate / ( st_ivas->nchan_transport - 1 ) ) * CPE_CHANNELS; + } + else + { + new_brate_SCE = 0; /*st_ivas->hEncoderConfig->ivas_total_brate / st_ivas->nchan_transport;*/ + new_brate_CPE = ( st_ivas->hEncoderConfig->ivas_total_brate / st_ivas->nchan_transport ) * CPE_CHANNELS; + } + + if ( ( error = ivas_corecoder_enc_reconfig( st_ivas, nSCE_old, nCPE_old, nchan_transport_old, new_brate_SCE, new_brate_CPE, last_mc_mode ) ) != IVAS_ERR_OK ) + { + return error; + } + + return error; +} diff --git a/lib_enc/ivas_mct_enc_mct.c b/lib_enc/ivas_mct_enc_mct.c new file mode 100644 index 0000000000000000000000000000000000000000..ee2690507282cacd3f5a3ea247ae004cb022844a --- /dev/null +++ b/lib_enc/ivas_mct_enc_mct.c @@ -0,0 +1,845 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include +#include "ivas_cnst.h" +#include "ivas_prot.h" +#include "prot.h" +#include "wmc_auto.h" +#include + + +/*--------------------------------------------------------------* + * Local constants + *---------------------------------------------------------------*/ + +#define SPAR_CORR_THRES 0.9f +#define DEFAULT_CORR_THRES 0.3f + +/*------------------------------------------------------------------------- + * getChannelEnergies() + * + * Calculate energy for each cahnnel + *-------------------------------------------------------------------------*/ + +void getChannelEnergies( + Encoder_State **sts, /* i/o: Encoder state structure */ + float nrg[MCT_MAX_CHANNELS], /* o : buffer with energies for each channel */ + const int16_t nchan /* i : number of channels */ +) +{ + int16_t ch, n; + int16_t nSubframes, L_subframe; + Encoder_State *st; + + /* Calculate energies per channel */ + for ( ch = 0; ch < nchan; ch++ ) + { + st = sts[ch]; + if ( st->mct_chan_mode != MCT_CHAN_MODE_IGNORE ) + { + nSubframes = ( st->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; + L_subframe = st->hTcxEnc->L_frameTCX / nSubframes; + + nrg[ch] = 0; + for ( n = 0; n < nSubframes; n++ ) + { + nrg[ch] += sum2_f( st->hTcxEnc->spectrum[n], L_subframe ); + } + nrg[ch] = sqrtf( nrg[ch] ); + } + } + + return; +} + + +/*------------------------------------------------------------------------- + * getNextBestCorrelation() + * + * find channel pair with highest cross-correlation + *-------------------------------------------------------------------------*/ + +static void getNextBestCorrelation( + float xCorrMatrix[][MCT_MAX_CHANNELS], /* i : cross-correlation matrix */ + int16_t *_ch1, /* o : first channel of selected channel-pair */ + int16_t *_ch2, /* o : second channel of selected channel-pair */ + float *max_corr, /* o : normalized cross correlation value of selected channel pair */ + const int16_t sortInd, + const int16_t nChannels ) +{ + float tmp_corrVals[( MCT_MAX_CHANNELS * ( MCT_MAX_CHANNELS - 1 ) ) / 2]; + int16_t i; + int16_t ch1, ch2; + + set_f( tmp_corrVals, 0, ( MCT_MAX_CHANNELS * ( MCT_MAX_CHANNELS - 1 ) ) / 2 ); + + /* first sort correlation matrix */ + i = 0; + for ( ch1 = 0; ch1 < nChannels; ch1++ ) + { + for ( ch2 = ch1 + 1; ch2 < nChannels; ch2++ ) + { + if ( fabsf( xCorrMatrix[ch1][ch2] ) > 0 ) + { + assert( i < ( MCT_MAX_CHANNELS * ( MCT_MAX_CHANNELS - 1 ) ) / 2 ); + tmp_corrVals[i] = fabsf( xCorrMatrix[ch1][ch2] ); + i++; + } + } + } + + /* sort values */ + v_sort( tmp_corrVals, 0, ( ( nChannels * ( nChannels - 1 ) ) / 2 ) - 1 ); + + /* get max, or 2nd max and so on depending on sortInd value */ + *max_corr = tmp_corrVals[( nChannels * ( nChannels - 1 ) ) / 2 - 1 - sortInd]; + + /*find channel pair for this max_corr*/ + for ( ch1 = 0; ch1 < nChannels; ch1++ ) + { + for ( ch2 = ch1 + 1; ch2 < nChannels; ch2++ ) + { + if ( fabsf( xCorrMatrix[ch1][ch2] ) == *max_corr ) + { + *_ch1 = ch1; + *_ch2 = ch2; + *max_corr = xCorrMatrix[ch1][ch2]; /* assign to max_corr its actual value */ + break; + } + } + } + + return; +} + + +/*-----------------------------------------------------------------------* + * getCorrelationMatrix() + * + * calculates the cross correlation matrix for all active + * channels + *-----------------------------------------------------------------------*/ + +static void getCorrelationMatrix( + Encoder_State **sts, /* i : core coder handle */ + MCT_ENC_HANDLE hMCT, /* i : MCT handle */ + float xCorrMatrix[MCT_MAX_CHANNELS][MCT_MAX_CHANNELS] /* o : cross-correlation matrix */ +) +{ + int16_t ch1, ch2, n, nchan; + float tmp; + + nchan = hMCT->nchan_out_woLFE; + + /* correlation */ + for ( ch1 = 0; ch1 < nchan; ch1++ ) + { + for ( ch2 = ch1; ch2 < nchan; ch2++ ) + { + xCorrMatrix[ch1][ch2] = 0; + + if ( sts[ch1]->core == sts[ch2]->core && sts[ch1]->mct_chan_mode != MCT_CHAN_MODE_IGNORE && + sts[ch2]->mct_chan_mode != MCT_CHAN_MODE_IGNORE ) + { + int16_t nSubframes = ( sts[ch1]->core == TCX_20_CORE ? 1 : NB_DIV ); + int16_t L_subframe = sts[ch1]->hTcxEnc->L_frameTCX / nSubframes; + + for ( n = 0; n < nSubframes; n++ ) + { + xCorrMatrix[ch1][ch2] += dotp( sts[ch1]->hTcxEnc->spectrum[n], sts[ch2]->hTcxEnc->spectrum[n], L_subframe ); + } + } + } + } + + /* normalize */ + for ( ch1 = 0; ch1 < nchan; ch1++ ) + { + for ( ch2 = ch1 + 1; ch2 < nchan; ch2++ ) + { + tmp = sqrtf( xCorrMatrix[ch1][ch1] * xCorrMatrix[ch2][ch2] ); + + if ( tmp > 0.f ) + { + xCorrMatrix[ch1][ch2] /= tmp; + } + else + { + xCorrMatrix[ch1][ch2] = 0.f; + } + + } + } + + return; +} + + +/*-----------------------------------------------------------------* + * getBestCorrelation() + * + * searches for the best correlated channel pair + *------------------------------------------------------------------*/ + +static void getBestCorrelation( + MCT_ENC_HANDLE hMCT, /* i : MCT handle */ + int16_t *_ch1, /* o : first channel of selected channel-pair */ + int16_t *_ch2, /* o : second channel of selected channel-pair */ + float *max_corr, /* o : normalized cross correlation value of selected channel pair */ + float xCorrMatrix[MCT_MAX_CHANNELS][MCT_MAX_CHANNELS] ) /* i : cross-correlation matrix */ +{ + int16_t ch1, ch2; + + *_ch1 = -1; + *_ch2 = -1; + *max_corr = 0.f; + + for ( ch1 = 0; ch1 < ( hMCT->nchan_out_woLFE ); ch1++ ) + { + for ( ch2 = ch1 + 1; ch2 < ( hMCT->nchan_out_woLFE ); ch2++ ) + { + if ( fabsf( *max_corr ) < fabsf( xCorrMatrix[ch1][ch2] ) ) + { + *max_corr = xCorrMatrix[ch1][ch2]; + + *_ch1 = ch1; + *_ch2 = ch2; + } + } + } + + return; +} + + +/*----------------------------------------------------------------------* + * getBlockValues() + * stereo processing for the channels of current block + *----------------------------------------------------------------------*/ + +static void getBlockValues( + Encoder_State **sts, /* i/o: core coder handle */ + const int16_t ch1, /* i : first channel of channel-pair */ + const int16_t ch2, /* i : second channel of channel-pair */ + MCT_BLOCK_DATA *hBlock, /* i : stereo block handle */ + float *mdst_spectrum[MCT_MAX_CHANNELS][2], /* i/o: MDST spectrum */ + float *inv_spectrum[MCT_MAX_CHANNELS][2], /* i/o: inverse spectrum */ + float *inv_mdst_spectrum[MCT_MAX_CHANNELS][2] /* i/o: invers MDST spectrum */ +) +{ + int16_t n; + float *p_mdst_spectrum[2][2]; + float *p_inv_spectrum[2][2]; + float *p_inv_mdst_spectrum[2][2]; + Encoder_State *p_st[2]; + + /* init return values: */ + hBlock->isActive = 1; + + /* map vectors to current block channels */ + for ( n = 0; n < 2; n++ ) + { + p_mdst_spectrum[0][n] = mdst_spectrum[ch1][n]; + p_mdst_spectrum[1][n] = mdst_spectrum[ch2][n]; + p_inv_spectrum[0][n] = inv_spectrum[ch1][n]; + p_inv_spectrum[1][n] = inv_spectrum[ch2][n]; + p_inv_mdst_spectrum[0][n] = inv_mdst_spectrum[ch1][n]; + p_inv_mdst_spectrum[1][n] = inv_mdst_spectrum[ch2][n]; + } + p_st[0] = sts[ch1]; + p_st[1] = sts[ch2]; + + stereo_coder_tcx( hBlock->hStereoMdct, p_st, hBlock->mask, p_mdst_spectrum, p_inv_spectrum, p_inv_mdst_spectrum, 1 ); + + if ( ( sts[ch1]->core == TCX_20_CORE && hBlock->hStereoMdct->mdct_stereo_mode[0] == SMDCT_DUAL_MONO ) || ( sts[ch1]->core == TCX_10_CORE && hBlock->hStereoMdct->mdct_stereo_mode[0] == SMDCT_DUAL_MONO && hBlock->hStereoMdct->mdct_stereo_mode[1] == SMDCT_DUAL_MONO ) ) + { + hBlock->isActive = 0; + } + + return; +} + + +/*-------------------------------------------------------------------* + * updateCorrelationMatrix() + * + * updates the cross correlation matrix with modified spectra after + * stereo block processing + *-------------------------------------------------------------------*/ + +static void updateCorrelationMatrix( + Encoder_State **sts, + MCT_ENC_HANDLE hMCT, + const int16_t _ch1, + const int16_t _ch2, + float xCorrMatrix[MCT_MAX_CHANNELS][MCT_MAX_CHANNELS] ) +{ + int16_t ch1, ch2, n; + + /* correlation: */ + for ( ch1 = 0; ch1 < ( hMCT->nchan_out_woLFE ); ch1++ ) + { + for ( ch2 = ch1; ch2 < ( hMCT->nchan_out_woLFE ); ch2++ ) + { + if ( sts[ch1]->core == sts[ch2]->core && sts[ch1]->mct_chan_mode != MCT_CHAN_MODE_IGNORE && + sts[ch2]->mct_chan_mode != MCT_CHAN_MODE_IGNORE ) + { + int16_t nSubframes = ( sts[ch1]->core == TCX_20_CORE ? 1 : NB_DIV ); + + if ( ch1 == _ch1 || ch2 == _ch2 || ch1 == _ch2 || ch2 == _ch1 ) + { + for ( n = 0; n < nSubframes; n++ ) + { + xCorrMatrix[ch1][ch2] = 0; /*disable combinations with channels already processed */ + } + } + } + } + } + + return; +} + + +/*----------------------------------------------------------* + * channelPairToIndex() + * get the index of each channel pair + *----------------------------------------------------------*/ + +static int16_t channelPairToIndex( + const int16_t chIdx1, + const int16_t chIdx2, + const int16_t nChannels ) +{ + int16_t ch1, ch2; + int16_t pairIdx; + + pairIdx = 0; + + for ( ch2 = 1; ch2 < nChannels; ch2++ ) + { + for ( ch1 = 0; ch1 < ch2; ch1++ ) + { + if ( ch1 == chIdx1 && ch2 == chIdx2 ) + { + return pairIdx; + } + else + { + pairIdx++; + } + } + } + + return -1; +} + + +/*--------------------------------------------------------------------* + * getGlobalILD() + * get broadband ILD to mean energy and normalize channels with ratio + *--------------------------------------------------------------------*/ + +static void getGlobalILD( + Encoder_State **sts, + MCT_ENC_HANDLE hMCT, + float *mdst_spectrum[MCT_MAX_CHANNELS][2], + const int16_t nchan ) +{ + int16_t k, ch, nSubframes, L_subframe; + float nrg[MCT_MAX_CHANNELS]; + float meanE = 0.f, ratio, qratio; + int16_t cnt = 0; + + /*Initializations*/ + set_s( hMCT->lowE_ch, 0, nchan ); + + getChannelEnergies( sts, nrg, nchan ); + + /*calculate total energy without LFE*/ + for ( ch = 0; ch < nchan; ch++ ) + { + if ( sts[ch]->mct_chan_mode != MCT_CHAN_MODE_IGNORE ) + { + meanE += nrg[ch]; + cnt++; + } + } + + /*calculate mean energy*/ + assert( cnt >= 2 ); + meanE = max( meanE / cnt, EPSILON ); + for ( ch = 0; ch < nchan; ch++ ) + { + if ( sts[ch]->mct_chan_mode != MCT_CHAN_MODE_IGNORE ) + { + nSubframes = ( sts[ch]->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; + L_subframe = sts[ch]->hTcxEnc->L_frameTCX / nSubframes; + + if ( nrg[ch] > meanE ) /*change it to meanE if final solution*/ + { + ratio = meanE / nrg[ch]; + hMCT->mc_global_ild[ch] = max( 1, min( SMDCT_ILD_RANGE - 1, (int16_t) ( SMDCT_ILD_RANGE * ratio + 0.5f ) ) ); + qratio = (float) hMCT->mc_global_ild[ch] / SMDCT_ILD_RANGE; + } + else + { + ratio = nrg[ch] / meanE; + hMCT->lowE_ch[ch] = 1; + hMCT->mc_global_ild[ch] = max( 1, min( SMDCT_ILD_RANGE - 1, (int16_t) ( SMDCT_ILD_RANGE * ratio + 0.5f ) ) ); + qratio = (float) SMDCT_ILD_RANGE / hMCT->mc_global_ild[ch]; + } + + for ( k = 0; k < nSubframes; k++ ) + { + v_multc( sts[ch]->hTcxEnc->spectrum[k], qratio, sts[ch]->hTcxEnc->spectrum[k], L_subframe ); + v_multc( mdst_spectrum[ch][k], qratio, mdst_spectrum[ch][k], L_subframe ); + } + } + } + + + return; +} + + +/*--------------------------------------------------------------------* + * apply_MCT_enc() + * + * apply MCT algorithm to input channels + *--------------------------------------------------------------------*/ + +void apply_MCT_enc( + MCT_ENC_HANDLE hMCT, /* i/o: MCT encoder structure */ + Encoder_State **sts, /* i/o: encoder state structure */ + float *mdst_spectrum[MCT_MAX_CHANNELS][NB_DIV], /* i/o: MDST spectrum */ + float *inv_spectrum[MCT_MAX_CHANNELS][NB_DIV], /* i/o: inverse spectrum */ + float *inv_mdst_spectrum[MCT_MAX_CHANNELS][NB_DIV], /* i/o: inverse MDST spectrum */ + const int16_t nchan /* i : number of channels */ +) +{ + int16_t ch, k, ch1, ch2, nSubframes, L_subframeTCX; + float max_corr, qratio; + int16_t forceKeepTree, pair; + float sumCorrDiff, thr; + float xCorrMatrix[MCT_MAX_CHANNELS][MCT_MAX_CHANNELS]; + int16_t currBlockDataCnt; + int16_t cpEle[MCT_MAX_CHANNELS]; + int16_t inactiveBlockDetected; + int16_t tmp_ch1, tmp_ch2; + float tmp_max_corr; + int16_t count_active_ch = 0; + + push_wmops( "mct_core_enc_mct" ); + + forceKeepTree = 1; + inactiveBlockDetected = 0; + set_s( cpEle, 0, MCT_MAX_CHANNELS ); + + /*Determine active channels*/ + for ( ch = 0; ch < nchan; ch++ ) + { + if ( sts[ch]->mct_chan_mode != MCT_CHAN_MODE_IGNORE ) + { + count_active_ch++; + } + else + { + hMCT->mc_global_ild[ch] = 0; + } + } + + /*there should be at least one cp*/ + if ( count_active_ch >= CPE_CHANNELS ) + { + /*Normalize energies with global ILD*/ + getGlobalILD( sts, hMCT, mdst_spectrum, nchan ); + getCorrelationMatrix( sts, hMCT, xCorrMatrix ); + + /*check if previous tree should be kept*/ + sumCorrDiff = 0.0f; + thr = 0.15f * (float) ( count_active_ch ) * ( count_active_ch - 1 ) / 2.0f; + for ( ch2 = 1; ch2 < nchan; ch2++ ) + { + for ( ch1 = 0; ch1 < ch2; ch1++ ) + { + if ( sts[ch1]->mct_chan_mode != MCT_CHAN_MODE_IGNORE && + sts[ch2]->mct_chan_mode != MCT_CHAN_MODE_IGNORE ) + { + sumCorrDiff += fabsf( hMCT->lastxCorrMatrix[ch1][ch2] - xCorrMatrix[ch1][ch2] ); + } + } + } + + if ( sumCorrDiff > thr ) + { + forceKeepTree = 0; + } + + /* check if keepTree is applied on unallowed blocks (e.g. channel pairs with different cores) */ + if ( forceKeepTree ) + { + if ( !hMCT->currBlockDataCnt ) + { + forceKeepTree = 0; + } + else + { + for ( pair = 0; pair < hMCT->currBlockDataCnt; pair++ ) + { + if ( xCorrMatrix[hMCT->hBlockData[pair]->ch1][hMCT->hBlockData[pair]->ch2] == 0.0f ) + { + forceKeepTree = 0; + } + } + } + } + + /*save initial correlation matrix for next frame*/ + for ( ch1 = 0; ch1 < nchan; ch1++ ) + { + for ( ch2 = ch1; ch2 < nchan; ch2++ ) + { + hMCT->lastxCorrMatrix[ch1][ch2] = xCorrMatrix[ch1][ch2]; + } + } + + + currBlockDataCnt = 0; + while ( currBlockDataCnt < hMCT->nchan_out_woLFE ) + { + /* find best fitting channel pair: */ + ch1 = -1; + ch2 = -1; + max_corr = 0.f; + + if ( !forceKeepTree ) + { + getNextBestCorrelation( xCorrMatrix, &ch1, &ch2, &max_corr, inactiveBlockDetected, nchan ); + } + else + { + getBestCorrelation( hMCT, &tmp_ch1, &tmp_ch2, &tmp_max_corr, xCorrMatrix ); + + if ( currBlockDataCnt == hMCT->currBlockDataCnt ) + { + break; + } + else + { + ch1 = hMCT->hBlockData[currBlockDataCnt]->ch1; + ch2 = hMCT->hBlockData[currBlockDataCnt]->ch2; + + /*don't allow forcing of channel-pair if their correlation is under the threshold*/ + max_corr = xCorrMatrix[ch1][ch2]; + if ( fabsf( max_corr ) <= 0.3f ) + { + ch1 = tmp_ch1; + ch2 = tmp_ch2; + max_corr = tmp_max_corr; + forceKeepTree = 0; + } + } + } + + if ( ( fabsf( max_corr ) > DEFAULT_CORR_THRES && !hMCT->hbr_mct ) || ( fabsf( max_corr ) > SPAR_CORR_THRES && hMCT->hbr_mct ) ) + { + if ( !forceKeepTree ) + { + /*save channel pair*/ + hMCT->hBlockData[currBlockDataCnt]->ch1 = ch1; + hMCT->hBlockData[currBlockDataCnt]->ch2 = ch2; + } + + /* calculate all related values: */ + assert( sts[ch1]->mct_chan_mode != MCT_CHAN_MODE_IGNORE && sts[ch2]->mct_chan_mode != MCT_CHAN_MODE_IGNORE ); + + getBlockValues( sts, ch1, ch2, hMCT->hBlockData[currBlockDataCnt], mdst_spectrum, inv_spectrum, inv_mdst_spectrum ); + + if ( hMCT->hBlockData[currBlockDataCnt]->isActive == 0 ) + { + inactiveBlockDetected++; + if ( inactiveBlockDetected > hMCT->nchan_out_woLFE / 2 ) + { + break; + } + forceKeepTree = 0; + + continue; /* skip inactive blocks where stereo mode is dual-mono */ + } + + updateCorrelationMatrix( sts, hMCT, ch1, ch2, xCorrMatrix ); + cpEle[ch1] = 1; + cpEle[ch2] = 1; + + currBlockDataCnt++; + } + else + { + break; + } + } + + /*save number of blocks for next frame*/ + hMCT->currBlockDataCnt = currBlockDataCnt; + + for ( ch = 0; ch < nchan; ch++ ) + { + if ( sts[ch]->mct_chan_mode != MCT_CHAN_MODE_IGNORE ) + { + if ( ( !cpEle[ch] ) || hMCT->currBlockDataCnt == 0 ) + { + nSubframes = ( sts[ch]->core == TCX_20_CORE ) ? 1 : NB_DIV; + L_subframeTCX = sts[ch]->hTcxEnc->L_frameTCX / nSubframes; + + if ( hMCT->lowE_ch[ch] ) + { + qratio = (float) hMCT->mc_global_ild[ch] / SMDCT_ILD_RANGE; + } + else + { + qratio = (float) SMDCT_ILD_RANGE / hMCT->mc_global_ild[ch]; + } + + for ( k = 0; k < nSubframes; k++ ) + { + v_multc( sts[ch]->hTcxEnc->spectrum[k], qratio, sts[ch]->hTcxEnc->spectrum[k], L_subframeTCX ); + v_multc( mdst_spectrum[ch][k], qratio, mdst_spectrum[ch][k], L_subframeTCX ); + set_zero( inv_spectrum[ch][k], L_subframeTCX ); + } + hMCT->mc_global_ild[ch] = 0; + } + } + } + } + else + { + hMCT->currBlockDataCnt = 0; + for ( ch = 0; ch < nchan; ch++ ) + { + hMCT->mc_global_ild[ch] = 0; + } + } + + pop_wmops(); + + return; +} + + +/*--------------------------------------------------------------------* + * write_mct_bitstream() + * + * write mct metadata to bitstream + *--------------------------------------------------------------------*/ + +void write_mct_bitstream( + Encoder_State **sts, /* i/o: encoder state structure */ + MCT_ENC_HANDLE hMCT, /* i/o: MCT encoder structure */ + const int16_t nchan /* i : number of channels */ +) +{ + int16_t pair, ch; + int16_t channelPairIndex; + int16_t nbits_start; + MCT_BLOCK_DATA_HANDLE hBlock; + Encoder_State *p_st[2]; + BSTR_ENC_HANDLE hBstr = sts[0]->hBstr; + + nbits_start = hBstr->nb_bits_tot; + + push_next_indice( hBstr, hMCT->currBlockDataCnt, MCT_NUM_BLOCK_DATA_BITS ); + + /* first write core info and overlap mode for all channels */ + for ( ch = 0; ch < nchan; ch++ ) + { + if ( hMCT->currBlockDataCnt && sts[ch]->mct_chan_mode != MCT_CHAN_MODE_IGNORE ) + { + push_next_indice( hBstr, hMCT->mc_global_ild[ch], SMDCT_GLOBAL_ILD_BITS ); + } + } + + if ( hMCT->currBlockDataCnt ) + { + for ( ch = 0; ch < nchan; ch++ ) + { + if ( sts[ch]->mct_chan_mode != MCT_CHAN_MODE_IGNORE ) + { + push_next_indice( hBstr, hMCT->lowE_ch[ch], 1 ); + } + } + } + + /* Do for each stereo block */ + for ( pair = hMCT->currBlockDataCnt - 1; pair >= 0; pair-- ) + { + hBlock = hMCT->hBlockData[pair]; + + /*calculate channel pair index and write it to BS*/ + channelPairIndex = channelPairToIndex( hBlock->ch1, hBlock->ch2, nchan ); + push_next_indice( hBstr, channelPairIndex, hMCT->bitsChannelPairIndex ); + + /*point to encoder states of actual channels to write block pair bits*/ + p_st[0] = sts[hBlock->ch1]; + p_st[1] = sts[hBlock->ch2]; + + /*then business as usual for each block pair */ + write_stereo_to_bitstream( hMCT->hBlockData[pair]->hStereoMdct, p_st, hBlock->mask, 1, hBstr ); + } + + hMCT->nBitsMCT = hBstr->nb_bits_tot - nbits_start; + + return; +} + + +/*--------------------------------------------------------------------* + * mctStereoIGF_enc() + * + * IGF analysis of channels after MCT processing + *--------------------------------------------------------------------*/ + +void mctStereoIGF_enc( + MCT_ENC_HANDLE hMCT, /* i/o: MCT encoder structure */ + Encoder_State **sts, /* i/o: encoder state structure */ + float *orig_spectrum[MCT_MAX_CHANNELS][2], /* i : MDCT spectrum for ITF */ + float powerSpec[MCT_MAX_CHANNELS][L_FRAME48k], /* i/o: MDCT^2 + MDST^2 spectrum,or estimate*/ + float *powerSpecMsInv[MCT_MAX_CHANNELS][NB_DIV], /* i : same as above but for inverse spect.*/ + float *inv_spectrum[MCT_MAX_CHANNELS][NB_DIV], /* i : inverse spectrum */ + const int16_t sp_aud_decision0[MCT_MAX_CHANNELS] /* i : speech audio decision */ +) +{ + int16_t b, nSubframes, L_subframeTCX; + int16_t p_ch[2], n, ch, ch1, ch2; + Encoder_State *p_st[NB_DIV]; + Encoder_State *st; + float *p_powerSpecMsInv[CPE_CHANNELS][NB_DIV]; + float *p_inv_spectrum[CPE_CHANNELS][NB_DIV]; + float *p_orig_spectrum[CPE_CHANNELS][NB_DIV]; + float *p_powerSpec[NB_DIV]; + int16_t singleChEle[MCT_MAX_CHANNELS]; + + L_subframeTCX = 0; /* to avoid compilation warning */ + set_s( singleChEle, 1, hMCT->nchan_out_woLFE ); + + for ( b = 0; b < hMCT->currBlockDataCnt; b++ ) + { + ch1 = hMCT->hBlockData[b]->ch1; + ch2 = hMCT->hBlockData[b]->ch2; + + p_ch[0] = ch1; + p_ch[1] = ch2; + + singleChEle[hMCT->hBlockData[b]->ch1] = 0; + singleChEle[hMCT->hBlockData[b]->ch2] = 0; + + /* point to encoder states of actual channels to write block pair bits */ + p_st[0] = sts[ch1]; + p_st[1] = sts[ch2]; + + if ( ch1 > 0 ) + { + sts[ch1]->hBstr->ind_list = sts[0]->hBstr->ind_list + sts[0]->hBstr->nb_ind_tot; + } + + if ( ch2 > 0 ) + { + sts[ch2]->hBstr->ind_list = sts[0]->hBstr->ind_list + sts[0]->hBstr->nb_ind_tot; + } + + p_powerSpec[0] = powerSpec[ch1]; + p_powerSpec[1] = powerSpec[ch2]; + + /* Band-wise M/S for MDST */ + nSubframes = p_st[0]->hTcxEnc->tcxMode == TCX_20 ? 1 : NB_DIV; + for ( n = 0; n < nSubframes; n++ ) + { + p_orig_spectrum[0][n] = orig_spectrum[ch1][n]; + p_orig_spectrum[1][n] = orig_spectrum[ch2][n]; + p_powerSpecMsInv[0][n] = powerSpecMsInv[ch1][n]; + p_powerSpecMsInv[1][n] = powerSpecMsInv[ch2][n]; + p_inv_spectrum[0][n] = inv_spectrum[ch1][n]; + p_inv_spectrum[1][n] = inv_spectrum[ch2][n]; + + if ( hMCT->hBlockData[b]->hStereoMdct->mdct_stereo_mode[n] != hMCT->hBlockData[b]->hStereoMdct->IGFStereoMode[n] || + hMCT->hBlockData[b]->hStereoMdct->mdct_stereo_mode[n] == SMDCT_BW_MS ) + { + ProcessStereoIGF( hMCT->hBlockData[b]->hStereoMdct, p_st, hMCT->hBlockData[b]->mask, p_orig_spectrum, p_powerSpec, p_powerSpecMsInv, p_inv_spectrum, n, sp_aud_decision0[ch1], p_st[0]->total_brate, 1 ); + } + else + { + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + st = p_st[ch]; + + L_subframeTCX = st->hTcxEnc->L_frameTCX / nSubframes; + + ProcessIGF( st, st->hTcxEnc->spectrum[n], (float *) orig_spectrum[p_ch[ch]][n], &powerSpec[p_ch[ch]][n * L_subframeTCX], st->core == TCX_20_CORE, n, sp_aud_decision0[ch1], 0 ); + } + } + } + } + + /* channel elements that are coded separately detected */ + if ( sum_s( singleChEle, ( hMCT->nchan_out_woLFE ) ) != 0 ) + { + for ( ch = 0; ch < ( hMCT->nchan_out_woLFE ); ch++ ) + { + if ( singleChEle[ch] ) + { + st = sts[ch]; + + if ( + st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) + { + continue; + } + + if ( ch > 0 ) + { + st->hBstr->ind_list = sts[0]->hBstr->ind_list + sts[0]->hBstr->nb_ind_tot; + } + + nSubframes = st->hTcxEnc->tcxMode == TCX_20 ? 1 : NB_DIV; + for ( n = 0; n < nSubframes; n++ ) + { + ProcessIGF( st, st->hTcxEnc->spectrum[n], (float *) orig_spectrum[ch][n], &powerSpec[ch][n * L_subframeTCX], st->core == TCX_20_CORE, n, sp_aud_decision0[ch], 0 ); + } + } + } + } + + return; +} diff --git a/lib_enc/ivas_mdct_core_enc.c b/lib_enc/ivas_mdct_core_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..368b76e9475cc0d19e3b2a036802507688407b5d --- /dev/null +++ b/lib_enc/ivas_mdct_core_enc.c @@ -0,0 +1,1367 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include "ivas_cnst.h" +#include +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "ivas_prot.h" +#include "rom_com.h" +#include "ivas_rom_com.h" +#include "wmc_auto.h" + +/*--------------------------------------------------------------* + * Local constants + *---------------------------------------------------------------*/ + +#define MAX_STE_PRE_NRG 0.875f +#define MIN_STE_PRE_LEN 36 +#define SILENT_CHANNEL_THRES 100 + + +/*--------------------------------------------------------------* + * enc_prm_pre_mdct() + * + * encode all side parameters up to MDCT whitening + *---------------------------------------------------------------*/ + +static void enc_prm_pre_mdct( + Encoder_State *st, /* i/o: encoder state structure */ + int16_t param[], /* i : parameters */ + const int16_t *no_param_tns, /* i : number of TNS parameters per subframe */ + int16_t p_param[2], /* o : pointer to parameters for next round of bs writing */ + const int16_t MCT_flag, /* i : hMCT handle allocated (1) or not (0) */ + BSTR_ENC_HANDLE hBstr /* i/o: encoder bitstream handle */ +) +{ + int16_t nbits_start; + + nbits_start = hBstr->nb_bits_tot; + + /*--------------------------------------------------------------------------------* + * Header + *--------------------------------------------------------------------------------*/ + + writeTCXMode( st, hBstr, MCT_flag, &nbits_start ); + + /* write last_core for core switching and error concealment */ + push_next_indice( hBstr, st->last_core != ACELP_CORE, 1 ); + + writeTCXWindowing( hBstr, st->hTcxCfg->tcx_curr_overlap_mode ); + if ( st->core == TCX_10_CORE ) + { + writeTCXWindowing( hBstr, st->hTcxCfg->tcx_last_overlap_mode ); + } + push_next_indice( hBstr, st->hTcxEnc->kernel_type[0], st->last_core != ACELP_CORE ? 2 : 1 ); + if ( st->core == TCX_10_CORE ) + { + assert( ( st->hTcxEnc->kernel_type[0] & 1 ) == ( st->hTcxEnc->kernel_type[1] >> 1 ) ); + push_next_indice( hBstr, st->hTcxEnc->kernel_type[1] & 1, 1 ); + } + + st->glr_reset = 0; + + /*--------------------------------------------------------------------------------* + * TCX20/TCX10 parameters + *--------------------------------------------------------------------------------*/ + + writeTCXparam( st, hBstr, NULL, param, 0, 0, 0, no_param_tns, p_param, NULL, 0 ); + + st->side_bits_frame_channel = hBstr->nb_bits_tot - nbits_start; + + + return; +} + +/*--------------------------------------------------------------* + * kernel_switch_detect() + * + * complex-valued detection method for transform kernel switching + *---------------------------------------------------------------*/ + +static int16_t kernel_switch_detect( + float *sigR0, /* i/o: MDCT samples of the 1st (left) channel */ + float *sigR1, /* i/o: MDCT samples of the 2nd (right) channel */ + float *sigI0, /* i/o: MDST samples of the 1st (left) channel */ + float *sigI1, /* i/o: MDST samples of the 2nd (right) channel */ + const int16_t nSamplesCore, /* i : number of core-coded samples below IGF */ + const int16_t nSamplesMax, /* i : transform length (number of MCLT lines) */ + const int16_t tcxTransType, /* i : TCX transform type (2*5, 1*10, or 1*20) */ + float *switchCovPrev, /* i/o: previous transform's correlation value */ + const uint32_t bitRateMode /* i : stereo bitrate mode (bps * L_frame) */ +) +{ + int16_t maxLength, anaLength, s; + float cov00, cov90, sumR0, sumR1, sumI0, sumI1; + + maxLength = ( nSamplesCore > 0 && nSamplesCore < nSamplesMax ) ? nSamplesCore : nSamplesMax; + anaLength = min( maxLength, (int16_t) ( bitRateMode >> 17 ) & 0xFFFE ); + s = ( nSamplesMax < 512 ? 2 : 4 ); /* exclude DC offset */ + + cov00 = 0.f; + cov90 = 0.f; + sumR0 = 0.f; + sumR1 = 0.f; + sumI0 = 0.f; + sumI1 = 0.f; + + if ( tcxTransType == TCX_5 ) + { + assert( nSamplesMax < 512 ); + anaLength >>= 1; + for ( s = 1; s < anaLength; s++ ) + { + cov00 += sigR0[s] * sigR1[s] + sigI0[s] * sigI1[s]; + cov90 += sigR0[s] * sigI1[s] - sigI0[s] * sigR1[s]; + sumR0 += sigR0[s] * sigR0[s]; + sumR1 += sigR1[s] * sigR1[s]; + sumI0 += sigI0[s] * sigI0[s]; + sumI1 += sigI1[s] * sigI1[s]; + } + anaLength += ( nSamplesMax >> 1 ); + s = 1 + ( nSamplesMax >> 1 ); /* 2nd TCX-5 spectrum is stacked onto 1st */ + } + for ( ; s < anaLength; s++ ) + { + cov00 += sigR0[s] * sigR1[s] + sigI0[s] * sigI1[s]; + cov90 += sigR0[s] * sigI1[s] - sigI0[s] * sigR1[s]; + sumR0 += sigR0[s] * sigR0[s]; + sumR1 += sigR1[s] * sigR1[s]; + sumI0 += sigI0[s] * sigI0[s]; + sumI1 += sigI1[s] * sigI1[s]; + } + + cov00 /= ( sqrtf( sumR0 * sumR1 ) + sqrtf( sumI0 * sumI1 ) + 1.f ); + cov90 /= ( sqrtf( sumR0 * sumI1 ) + sqrtf( sumI0 * sumR1 ) + 1.f ); + sumI0 = max( 0.f, fabsf( cov90 ) - fabsf( cov00 ) ); + sumI1 = ( switchCovPrev != NULL ? fabsf( *switchCovPrev ) : 0.f ); + s = ( cov90 < 0.f ? -1 : 1 ); + + if ( switchCovPrev != NULL ) /* update the decision smoothing history */ + { + *switchCovPrev = ( 0.875f * sumI1 + 0.125f * sumI0 ) * s; + } + + return ( ( sumI0 > 0.5f - 0.25f * sumI1 || fabsf( cov90 ) > 0.75f - 0.5f * sumI1 ) && ( sumI1 > 0.0625f ) ? s : 0 ); /* final decision */ +} + + +static void kernel_switch_trafo( + const float *x, + float *y, + const int16_t l, + const int16_t m, + const int16_t r, + const uint16_t kernelType ) +{ + const float signLeft = ( kernelType >= MDCT_II ? -1.f : 1.f ); + const float signRight = ( kernelType & 1 ? 1.f : -1.f ); + int16_t i; + float inputBuffer[N_MAX]; + + /* Init */ + for ( i = 0; i < m / 2; i++ ) + { + inputBuffer[m / 2 + r / 2 + i] = -1.0f * x[l + m / 2 - 1 - i]; + } + + for ( i = 0; i < l / 2; i++ ) + { + inputBuffer[m / 2 + r / 2 + m / 2 + i] = signLeft * x[i] - x[l - 1 - i]; + } + + for ( i = 0; i < m / 2; i++ ) + { + inputBuffer[m / 2 + r / 2 - 1 - i] = -1.0f * x[l + m / 2 + i]; + } + + for ( i = 0; i < r / 2; i++ ) + { + inputBuffer[m / 2 + r / 2 - 1 - m / 2 - i] = -1.0f * x[l + m + i] + signRight * x[l + m + r - 1 - i]; + } + + edxt( inputBuffer, y, l / 2 + m + r / 2, kernelType, FALSE ); + + v_multc( y, sqrtf( (float) NORM_MDCT_FACTOR / ( l / 2 + m + r / 2 ) ), y, l / 2 + m + r / 2 ); + + return; +} + + +static void kernel_switch_update_transforms( + float *sigR, /* i/o: MDCT samples of the given channel */ + float *sigI, /* i/o: MDST samples of the given channel */ + const int16_t tcxTransType, /* i : TCX transform type, cf also above */ + TCX_CONFIG_HANDLE hTcxCfg, /* i : TCX configuration handle, pointer */ + const int16_t bwidthSwCnt, /* i : bandwidth switching counter in st */ + const uint16_t kernelType, /* i : TCX transform kernel type (0 - 3) */ + const float *tcxTimeSignal, /* i : hTcxEnc->new_speech_TCX buf in st */ + const float *speech_TCX, /* i : hTcxEnc->speech_TCX buffer in st */ + float *windowedTimeSignal, /* i/o: windowed input and scratch buffer */ + const int16_t L_subframe /* i : transform length (number of bins) */ +) +{ + int16_t s, nSubframes; + + s = L_subframe; + nSubframes = ( tcxTransType == TCX_20 ? 1 : NB_DIV ); + + if ( kernelType == MDCT_IV ) /* no updates required here! */ + { + return; + } + + if ( kernelType == MDST_IV ) /* swap real and imag. parts */ + { + for ( s = L_subframe - 1; s >= 0; s-- ) + { + const float sigTemp = -sigR[s]; + + sigR[s] = sigI[s]; + sigI[s] = sigTemp; + } + + return; + } + + /* MDCT/MDST-II as real part, keep imag. part for speedup */ + if ( tcxTransType == TCX_20 && hTcxCfg->tcx_last_overlap_mode != TRANSITION_OVERLAP ) + { + wtda_ext( tcxTimeSignal, windowedTimeSignal, (int16_t) windowedTimeSignal[0], (int16_t) windowedTimeSignal[1], s, kernelType ); + + edxt( windowedTimeSignal, sigR, s, kernelType, FALSE ); + + v_multc( sigR, sqrtf( (float) NORM_MDCT_FACTOR / s ), sigR, s ); + } + else /* 2 TCX5 subframes or 1 TCX10 or 1 transitory TCX20 */ + { + const float sign = ( kernelType >= MDCT_II ? 1.f : -1.f ); + const int16_t minWindowLen = hTcxCfg->tcx_mdct_window_min_lengthFB - 1; + int16_t i, leftOverlap = 0, rightOverlap = 0; + const float *left_win, *right_win; + + tcx_get_windows( hTcxCfg, (int16_t) windowedTimeSignal[0], (int16_t) windowedTimeSignal[1], &leftOverlap, &left_win, &rightOverlap, &right_win, 1 ); + if ( speech_TCX != NULL && tcxTransType != TCX_20 && (int16_t) windowedTimeSignal[0] == FULL_OVERLAP && s - leftOverlap > minWindowLen ) + { + for ( i = minWindowLen; i >= 0; i-- ) /* outer left folding of shortened long ALDO slope */ + { + windowedTimeSignal[2 + leftOverlap + i] += sign * speech_TCX[-1 - i] * hTcxCfg->tcx_aldo_window_1_FB[leftOverlap / 2 + minWindowLen - i] * hTcxCfg->tcx_mdct_window_minimumFB[minWindowLen - i]; + } + } + + if ( tcxTransType == TCX_5 ) + { + float tcx5Win[N_TCX10_MAX / 2 + L_MDCT_OVLP_MAX]; /* temporary buffer for TCX5 windowing */ + + assert( L_subframe == nSubframes * hTcxCfg->tcx5SizeFB ); + + /* Outer left folding */ + for ( i = 0; i < leftOverlap / 2; i++ ) + { + windowedTimeSignal[2 + leftOverlap / 2 + i] += sign * windowedTimeSignal[2 + leftOverlap / 2 - 1 - i]; + } + + s = hTcxCfg->tcx5SizeFB; /* obtain 1st TCX5 again */ + nSubframes *= 2; + WindowSignal( hTcxCfg, leftOverlap / 2, RECTANGULAR_OVERLAP, MIN_OVERLAP, &leftOverlap, &rightOverlap, windowedTimeSignal + 2, &s, tcx5Win, 0, 1 ); + kernel_switch_trafo( tcx5Win, sigR, leftOverlap, s /* L_subfr. */ - ( leftOverlap + rightOverlap ) / 2, rightOverlap, kernelType ); + + if ( kernelType & 1 ) /* 2nd TCX5 is kernelType 3 */ + { + for ( i = L_subframe - 1; i >= s; i-- ) + { + const float sigTemp = -sigR[i]; + + sigR[i] = sigI[i]; + sigI[i] = sigTemp; + } + } + } + else /* tcxTransType != TCX_5 */ + { + kernel_switch_trafo( windowedTimeSignal + 2, sigR, leftOverlap, s - ( leftOverlap + rightOverlap ) / 2, rightOverlap, kernelType ); + } + } + + /* high-band gain control, in case of bandwidth switching */ + if ( bwidthSwCnt > 0 ) + { + v_multc( sigR + L_FRAME16k / nSubframes, (float) bwidthSwCnt / (float) BWS_TRAN_PERIOD, sigR + L_FRAME16k / nSubframes, s - L_FRAME16k / nSubframes ); + } + + return; +} + + +static void applyStereoPreProcessingCplx( + float *mdctSample1, + float *mdctSample2, + float *mdstSample1, + float *mdstSample2, + const float factIn, + const float factDe, + const float sign ) +{ + const float valI1 = *mdstSample1; + const float valI2 = *mdstSample2; + const float valR1 = *mdctSample1; + const float valR2 = *mdctSample2; + float absR1, absR2; + float dmxI1, dmxR1, dmxI2, dmxR2; + float n, d; + + absR1 = fabsf( valR1 ); + absR2 = fabsf( valR2 ); + dmxR1 = valR1 * factDe + sign * valR2 * factIn; /* cross */ + dmxR2 = valR2 * factDe + sign * valR1 * factIn; /* -talk */ + + if ( fabsf( dmxR1 ) < absR1 + absR2 ) /* avoid destructive summations */ + { + if ( absR1 * factDe < absR2 * factIn ) + { + dmxR1 = valR2 * factIn - sign * valR1 * factDe; + dmxI1 = valI2 * factIn - sign * valI1 * factDe; + } + else + { + dmxR1 = valR1 * factDe - sign * valR2 * factIn; + dmxI1 = valI1 * factDe - sign * valI2 * factIn; + } + } + else + { + dmxI1 = valI1 * factDe + sign * valI2 * factIn; + } + + if ( fabsf( dmxR2 ) < absR1 + absR2 ) /* avoid destructive summations */ + { + if ( absR1 * factIn < absR2 * factDe ) + { + dmxR2 = valR2 * factDe - sign * valR1 * factIn; + dmxI2 = valI2 * factDe - sign * valI1 * factIn; + } + else + { + dmxR2 = valR1 * factIn - sign * valR2 * factDe; + dmxI2 = valI1 * factIn - sign * valI2 * factDe; + } + } + else + { + dmxI2 = valI2 * factDe + sign * valI1 * factIn; + } + + n = valR1 * valR1 + valI1 * valI1; /* maintain spectral magnitude (1) */ + d = dmxR1 * dmxR1 + dmxI1 * dmxI1; + d = sqrtf( n / max( 1.f, d ) ); + *mdctSample1 = dmxR1 * d; + *mdstSample1 = dmxI1 * d; + + n = valR2 * valR2 + valI2 * valI2; /* maintain spectral magnitude (2) */ + d = dmxR2 * dmxR2 + dmxI2 * dmxI2; + d = sqrtf( n / max( 1.f, d ) ); + *mdctSample2 = dmxR2 * d; + *mdstSample2 = dmxI2 * d; + + return; +} + + +/*--------------------------------------------------------------* + * enc_ste_pre_mdct() + * + * encoder-side complex-valued stereo pre-processing (crosstalk) + *---------------------------------------------------------------*/ + +static uint16_t enc_ste_pre_mdct( + float *sigR0, /* i/o: MDCT samples of the 1st (left) channel */ + float *sigR1, /* i/o: MDCT samples of the 2nd (right) channel */ + float *sigI0, /* i/o: MDST samples of the 1st (left) channel */ + float *sigI1, /* i/o: MDST samples of the 2nd (right) channel */ + const int16_t nSamplesCore, /* i : number of core-coded samples below IGF */ + const int16_t nSamplesMax, /* i : transform length (number of MCLT lines) */ + const int16_t limitWeight, /* i : 1 means the pre-processing is softened */ + const uint16_t corrIdxPrev, /* i : previous transform's correlation index */ + const uint32_t bitRateMode /* i : stereo bitrate mode (bps * L_frame) */ +) +{ + int16_t fadeInLen, fadeInOff, nSampProc, preproLen; + float maxSqrValue, stepWeightI, stepWeightD; + float corr, sumL, sumR, chanCorrSign, xTalkI, xTalkD; + float sumMagnL, sumMagnR, sumPrdLR, sumPrdLL, sumPrdRR; + int16_t s; + + fadeInLen = ( nSamplesMax < 512 ? ( nSamplesMax < 256 ? 10 : 20 ) : 40 ); /* 1000Hz transition */ + fadeInOff = ( ( bitRateMode * 3 ) >> 19 ) & ( nSamplesMax < 512 ? 0xFFFF : 0xFFFE ); /* offset */ + nSampProc = ( nSamplesCore > 0 && nSamplesCore < nSamplesMax ) ? nSamplesCore : nSamplesMax; + preproLen = nSampProc - fadeInOff; + maxSqrValue = 16777216.f * preproLen * preproLen; + stepWeightI = ( limitWeight > 0 ? 1.f : 2.f ); /* crosstalk weight */ + stepWeightD = 4.f - stepWeightI; /* decrement, i.e., 1 - crosstalk */ + corr = 0.f, sumL = 0.f, sumR = 0.f; + sumMagnL = 0.f, sumMagnR = 0.f, sumPrdLR = 0.f, sumPrdLL = 0.f, sumPrdRR = 0.f; + + if ( fadeInOff + fadeInLen + MIN_STE_PRE_LEN >= nSampProc ) + { + return 0; + } + + for ( s = fadeInOff; s < nSampProc; s++ ) + { + float absMagnL, absMagnR; + absMagnL = sqrtf( sigR0[s] * sigR0[s] + sigI0[s] * sigI0[s] ); + absMagnR = sqrtf( sigR1[s] * sigR1[s] + sigI1[s] * sigI1[s] ); + + corr += sigR0[s] * sigR1[s] + sigI0[s] * sigI1[s]; + sumL += sigR0[s] + sigI0[s]; + sumR += sigR1[s] + sigI1[s]; + + sumMagnL += absMagnL; + sumMagnR += absMagnR; + sumPrdLR += absMagnL * absMagnR; + sumPrdLL += absMagnL * absMagnL; + sumPrdRR += absMagnR * absMagnR; + } + corr *= 2.f * preproLen; + corr -= sumL * sumR; + chanCorrSign = ( corr < -maxSqrValue ) ? -1.f : 1.f; + + sumL = sumMagnL / (float) preproLen; /* inter-channel correlation of magnitude */ + sumR = sumMagnR / (float) preproLen; + corr = sumPrdLR + sumL * sumR * preproLen - sumMagnL * sumR - sumMagnR * sumL; + sumL = sumPrdLL + sumL * sumL * preproLen - sumMagnL * sumL - sumMagnL * sumL; + sumR = sumPrdRR + sumR * sumR * preproLen - sumMagnR * sumR - sumMagnR * sumR; + corr = ( ( corr <= 0.f ) || ( sumL * sumR <= 0.f ) ? 0.f : ( corr * corr ) / ( sumL * sumR ) ); + + if ( ( corr > 0.75f && corrIdxPrev == 0 ) || /* processing weight fade-in/-out */ + ( corr <= 0.75f && corrIdxPrev > 0 ) ) + { + stepWeightI = 1.f; + stepWeightD = 4.f - stepWeightI; + } + + if ( corr <= 0.75f && corrIdxPrev == 0 ) /* bypass all processing, just return */ + { + return 0; + } + + sigR0 += fadeInOff + 1; /* stereo pre-processing starts with an offset of one! */ + sigR1 += fadeInOff + 1; + sigI0 += fadeInOff + 1; + sigI1 += fadeInOff + 1; + xTalkI = stepWeightI; + xTalkD = stepWeightD * ( 2 * fadeInLen - 1 ); + + for ( s = fadeInLen - 1; s > 0; s--, sigR0++, sigR1++, sigI0++, sigI1++ ) + { + applyStereoPreProcessingCplx( sigR0, sigR1, sigI0, sigI1, xTalkI, xTalkD, chanCorrSign ); + xTalkI += stepWeightI; + xTalkD -= stepWeightD; + } + + for ( s = preproLen - fadeInLen; s > 0; s--, sigR0++, sigR1++, sigI0++, sigI1++ ) + { + applyStereoPreProcessingCplx( sigR0, sigR1, sigI0, sigI1, xTalkI, xTalkD, chanCorrSign ); + } + + if ( nSampProc < nSamplesMax ) /* fade-out of processing at start of IGF range */ + { + for ( s = min( fadeInLen, nSamplesMax - nSampProc ) - 1; s > 0; s--, sigR0++, sigR1++, sigI0++, sigI1++ ) + { + xTalkI -= stepWeightI; + xTalkD += stepWeightD; + applyStereoPreProcessingCplx( sigR0, sigR1, sigI0, sigI1, xTalkI, xTalkD, chanCorrSign ); + } + } + + return ( corr > 0.75f ? 1 : 0 ); +} + + +/*--------------------------------------------------------------* + * enc_prm_igf_mdct() + * + * write igf parameters to bitstream + *---------------------------------------------------------------*/ + +void enc_prm_igf_mdct( + Encoder_State *st, /* i : Encoder state handle */ + BSTR_ENC_HANDLE hBstr /* i/o: Bitstream handle */ +) +{ + int16_t nbits_start, total_nbbits; + + nbits_start = hBstr->nb_bits_tot; + + if ( st->core == TCX_20_CORE ) + { + st->hIGFEnc->infoTotalBitsPerFrameWritten = 0; + + IGFEncWriteBitstream( st->hIGFEnc, hBstr, &st->hIGFEnc->infoTotalBitsPerFrameWritten, ( st->last_core == ACELP_CORE ) ? IGF_GRID_LB_TRAN : IGF_GRID_LB_NORM, 1 ); + } + else + { + IGFEncWriteConcatenatedBitstream( st->hIGFEnc, hBstr ); + } + + total_nbbits = hBstr->nb_bits_tot - nbits_start; + st->side_bits_frame_channel += total_nbbits; + + return; +} + + +/*-------------------------------------------------------------------* + * ivas_mdct_core_whitening_enc() + * + * MCT preprocessing up to whitening the core spectrum + *-------------------------------------------------------------------*/ + +void ivas_mdct_core_whitening_enc( + CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ + float new_samples[CPE_CHANNELS][L_INP], /* i : new samples */ + float old_wsp[CPE_CHANNELS][L_WSP], /* i : 12.8kHz weighted speech (for LTP */ + float pitch_buf[CPE_CHANNELS][NB_SUBFR16k], /* o : floating pitch for each subframe */ + float *mdst_spectrum_long[CPE_CHANNELS], /* o : buffer for MDST spectrum */ + int16_t tnsBits[CPE_CHANNELS][NB_DIV], /* o : buffer TNS bits */ + float *orig_spectrum_long[CPE_CHANNELS], /* o : origingal spectrum w/o whitening */ + int16_t tnsSize[CPE_CHANNELS][NB_DIV], /* o : number of tns parameters put into prm */ + int16_t p_param[CPE_CHANNELS][NB_DIV], /* o : pointer to the parameter table */ + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const int16_t mct_on, /* i : flag mct block (1) or stereo (0) */ + const int16_t nChannels /* i : total number of coded channels */ +) +{ + int16_t n, ch, nSubframes, L_subframe, L_subframeTCX, tcx_subframe_coded_lines; + float A_q[CPE_CHANNELS][NB_DIV][M + 1]; + int16_t sns_vq_indices[CPE_CHANNELS * NB_DIV * SNS_MSVQ_NSTAGES_TCX10]; + int16_t sns_stereo_mode[NB_DIV]; + int16_t idx; + int16_t param_lpc[CPE_CHANNELS][NPRM_LPC_NEW]; + int16_t param_core[CPE_CHANNELS][2 * NPRM_DIV]; + int16_t ltpBits[CPE_CHANNELS]; + int16_t i, T_op[CPE_CHANNELS][3]; + float *orig_spectrum[CPE_CHANNELS][NB_DIV]; /* Pointers to MDCT output for a short block (L/R) */ + float temp_buffer[15 * L_FRAME48k / 8]; + float *windowedSignal[CPE_CHANNELS]; + float *powerSpec = orig_spectrum_long[0]; + float *mdst_spectrum[CPE_CHANNELS][NB_DIV]; + float nrg; + Encoder_State *st, **sts; + float scf[CPE_CHANNELS][NB_DIV][M]; + float scf_q[CPE_CHANNELS][NB_DIV][M]; + float chE[2], chE_tot; + int8_t sns_low_br_mode; + int16_t nbits_start_sns; + int16_t num_sns; + int8_t skipped_first_channel; + int16_t zero_side_flag[NB_DIV]; + + push_wmops( "mdct_core_whitening" ); + + /*--------------------------------------------------------------* + * Initialization + *---------------------------------------------------------------*/ + + sts = hCPE->hCoreCoder; + + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + stereo_tcx_init_enc( sts[ch] ); + + set_s( tnsSize[ch], 0, 2 ); + set_s( tnsBits[ch], 0, 2 ); + ltpBits[ch] = 0; + + for ( i = 0; i < 3; i++ ) + { + T_op[ch][i] = sts[ch]->pitch[i]; + + /* check minimum pitch for quantization */ + if ( T_op[ch][i] < PIT_MIN_SHORTER ) + { + T_op[ch][i] *= 2; + } + } + } + + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + orig_spectrum[ch][0] = orig_spectrum_long[ch]; + orig_spectrum[ch][1] = orig_spectrum_long[ch] + N_TCX10_MAX; + mdst_spectrum[ch][0] = mdst_spectrum_long[ch]; + mdst_spectrum[ch][1] = mdst_spectrum_long[ch] + N_TCX10_MAX; + } + + windowedSignal[0] = orig_spectrum_long[0]; /* NOTE temporarily available */ + windowedSignal[1] = temp_buffer; /* orig_spectrum_long isn't long enough */ + + /*--------------------------------------------------------------* + * TCX20/TCX10 switching decision + *---------------------------------------------------------------*/ + + if ( mct_on ) + { + sts[0]->hTcxEnc->tfm_mem = sts[1]->hTcxEnc->tfm_mem = sqrtf( 0.5f * ( sts[0]->hTcxEnc->tfm_mem * sts[0]->hTcxEnc->tfm_mem + sts[1]->hTcxEnc->tfm_mem * sts[1]->hTcxEnc->tfm_mem ) ); /* RMS */ + sts[0]->hTcxEnc->tcxltp_norm_corr_past = sts[1]->hTcxEnc->tcxltp_norm_corr_past = 0.5f * ( sts[0]->hTcxEnc->tcxltp_norm_corr_past + sts[1]->hTcxEnc->tcxltp_norm_corr_past ); + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + st = sts[ch]; + SetTCXModeInfo( st, st->hTranDet, &st->hTcxCfg->tcx_curr_overlap_mode ); + } + } + + sts[0]->core = sts[0]->hTcxEnc->tcxMode; + sts[1]->core = sts[1]->hTcxEnc->tcxMode; + + /*--------------------------------------------------------------* + * Core Signal Analysis: MDCT, TNS + *---------------------------------------------------------------*/ + + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + st = sts[ch]; + if ( ( hCPE->cpe_id * CPE_CHANNELS + ch ) >= nChannels ) + { + continue; + } + SetCurrentPsychParams( st->core, 0, st->hTcxCfg ); + + /* tcx ltp analysis on the 12.8kHz weighted speech, saves preproc resampling to sr_core */ + tcx_ltp_encode( st, st->hTcxEnc->tcxMode, L_FRAME, old_wsp[ch] + L_WSP_MEM + L_LOOK_12k8, NULL, old_wsp[ch] + L_WSP_MEM + L_LOOK_12k8, T_op[ch], ¶m_core[ch][1 + NOISE_FILL_RANGES], <pBits[ch], NULL, 0, IVAS_CPE_MDCT ); + + core_signal_analysis_high_bitrate( new_samples[ch] + L_INP_MEM, T_op[ch], NULL, NULL, st, mdst_spectrum[ch], tnsSize[ch], tnsBits[ch], param_core[ch], <pBits[ch], windowedSignal[ch], st->L_frame, st->hTcxEnc->L_frameTCX, hCPE->last_element_mode, 0 ); + + /* BWD in MDCT domain */ + if ( st->hTcxCfg->tcx_last_overlap_mode != TRANSITION_OVERLAP ) + { + nSubframes = ( st->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; + + for ( n = 0; n < nSubframes; n++ ) + { + bw_detect( st, NULL, st->hTcxEnc->spectrum[n], NULL, MC_FORMAT /*just cannot be ISM_FORMAT*/, mct_on ); + + if ( nSubframes == NB_DIV && n == 0 ) + { + st->last_input_bwidth = st->input_bwidth; + } + } + } + + if ( st->last_core == ACELP_CORE ) /* reset past kernel info */ + { + st->hTcxEnc->kernel_switch_corr_past = 0.f; + st->hTcxEnc->kernel_symmetry_past = 0; + } + } + + /*--------------------------------------------------------------* + * Transform Kernel Switching, Stereo Pre-Processing, and TNS + *---------------------------------------------------------------*/ + + sts[0]->hTcxEnc->fUseTns[1] = 0; + + if ( sts[0]->element_brate < IVAS_80k && sts[0]->core == sts[1]->core && sts[0]->element_mode == IVAS_CPE_MDCT && !mct_on && !hCPE->hStereoMdct->isSBAStereoMode ) + { + int16_t nSampCore; + int32_t totalRate; + TCX_ENC_HANDLE hTcxEnc0, hTcxEnc1; + + nSampCore = ( sts[0]->igf ) ? max( sts[0]->hIGFEnc->infoStartLine, sts[1]->hIGFEnc->infoStartLine ) : 0; + totalRate = sts[0]->element_brate; + hTcxEnc0 = sts[0]->hTcxEnc; + hTcxEnc1 = sts[1]->hTcxEnc; + + init_tcx_enc_info( sts[0], &L_subframe, &L_subframeTCX, &tcx_subframe_coded_lines ); + + if ( nSampCore == 0 ) + { + nSampCore = tcx_subframe_coded_lines; + } + + nrg = 0.25f * ( hTcxEnc0->tcxltp_norm_corr_past + hTcxEnc0->tcxltp_norm_corr_mem + /* tcxltp_norm_corr_past already contains the */ + hTcxEnc1->tcxltp_norm_corr_past + hTcxEnc1->tcxltp_norm_corr_mem ); /* normalized correlation of the current frame */ + + L_subframe = max( 512, L_subframe ); + nSubframes = ( hTcxEnc0->tcxMode == TCX_20 ) ? 1 : NB_DIV; + + for ( n = 0; n < nSubframes; n++ ) + { + if ( hTcxEnc0->transform_type[n] == hTcxEnc1->transform_type[n] ) + { + const int16_t switchKernel = /* these 4 transform types can be applied: 0 = MDCT-IV, 1 = MDST-II, 2 = MDCT-II, 3 = MDST-IV */ + kernel_switch_detect( hTcxEnc0->spectrum[n], hTcxEnc1->spectrum[n], mdst_spectrum[0][n], mdst_spectrum[1][n], nSampCore / nSubframes, + L_subframeTCX / nSubframes, hTcxEnc0->transform_type[n], &hTcxEnc0->kernel_switch_corr_past, ( totalRate * L_subframe ) / nSubframes ); + if ( switchKernel ) /* apply MDST-IV coding in one of the channels */ + { + hTcxEnc0->kernel_type[n] = ( hTcxEnc0->kernel_symmetry_past ? 3 : 1 ) - max( 0, switchKernel ); + hTcxEnc1->kernel_type[n] = ( hTcxEnc1->kernel_symmetry_past ? 2 : 0 ) + max( 0, switchKernel ); + } + else /* switchKernel == 0, switch back to MDCT-IV in both channels */ + { + hTcxEnc0->kernel_type[n] = ( hTcxEnc0->kernel_symmetry_past ? 2 : 0 ); + hTcxEnc1->kernel_type[n] = ( hTcxEnc1->kernel_symmetry_past ? 2 : 0 ); + } + } + else + { + hTcxEnc0->kernel_switch_corr_past = 0.f; /* don't update the kernel switching state, postpone it to when data is available */ + hTcxEnc0->kernel_type[n] = ( hTcxEnc0->kernel_symmetry_past ? 3 : 0 ); + hTcxEnc1->kernel_type[n] = ( hTcxEnc1->kernel_symmetry_past ? 3 : 0 ); + } + hTcxEnc0->kernel_symmetry_past = hTcxEnc0->kernel_type[n] & 1; + hTcxEnc1->kernel_symmetry_past = hTcxEnc1->kernel_type[n] & 1; + + kernel_switch_update_transforms( hTcxEnc0->spectrum[n], mdst_spectrum[0][n], hTcxEnc0->transform_type[n], sts[0]->hTcxCfg, sts[0]->bwidth_sw_cnt, hTcxEnc0->kernel_type[n], + hTcxEnc0->new_speech_TCX, ( n == 1 ? NULL : hTcxEnc0->speech_TCX ), windowedSignal[0] + n * L_FRAME48k, L_subframeTCX / nSubframes ); + kernel_switch_update_transforms( hTcxEnc1->spectrum[n], mdst_spectrum[1][n], hTcxEnc1->transform_type[n], sts[1]->hTcxCfg, sts[1]->bwidth_sw_cnt, hTcxEnc1->kernel_type[n], + hTcxEnc1->new_speech_TCX, ( n == 1 ? NULL : hTcxEnc1->speech_TCX ), windowedSignal[1] + n * L_FRAME48k, L_subframeTCX / nSubframes ); + } + for ( n = 0; n < nSubframes; n++ ) + { + if ( hTcxEnc0->transform_type[n] == hTcxEnc1->transform_type[n] && /* do not combine TCX-5 and TCX-10 as this causes artifacts */ + sts[0]->hTcxCfg->tcx_curr_overlap_mode == sts[1]->hTcxCfg->tcx_curr_overlap_mode && + sts[0]->hTcxCfg->tcx_last_overlap_mode == sts[1]->hTcxCfg->tcx_last_overlap_mode ) + { + if ( hTcxEnc0->transform_type[n] == TCX_5 ) + { + const int16_t tcx5SizeFB = sts[1]->hTcxCfg->tcx5SizeFB; + + hTcxEnc0->enc_ste_pre_corr_past = + enc_ste_pre_mdct( hTcxEnc0->spectrum[n], hTcxEnc1->spectrum[n], mdst_spectrum[0][n], mdst_spectrum[1][n], nSampCore / ( 2 * NB_DIV ), + L_subframeTCX / ( 2 * NB_DIV ), ( nrg > MAX_STE_PRE_NRG ? 1 : 0 ), hTcxEnc0->enc_ste_pre_corr_past, ( totalRate * L_subframe ) / ( 2 * NB_DIV ) ); + + hTcxEnc0->enc_ste_pre_corr_past = + enc_ste_pre_mdct( hTcxEnc0->spectrum[n] + tcx5SizeFB, hTcxEnc1->spectrum[n] + tcx5SizeFB, mdst_spectrum[0][n] + tcx5SizeFB, mdst_spectrum[1][n] + tcx5SizeFB, nSampCore / ( 2 * NB_DIV ), + L_subframeTCX / ( 2 * NB_DIV ), ( nrg > MAX_STE_PRE_NRG ? 1 : 0 ), hTcxEnc0->enc_ste_pre_corr_past, ( totalRate * L_subframe ) / ( 2 * NB_DIV ) ); + } + else + { + hTcxEnc0->enc_ste_pre_corr_past = + enc_ste_pre_mdct( hTcxEnc0->spectrum[n], hTcxEnc1->spectrum[n], mdst_spectrum[0][n], mdst_spectrum[1][n], nSampCore / nSubframes, + L_subframeTCX / nSubframes, ( nrg > MAX_STE_PRE_NRG ? 1 : 0 ), hTcxEnc0->enc_ste_pre_corr_past, ( totalRate * L_subframe ) / nSubframes ); + } + } + else + { + hTcxEnc0->enc_ste_pre_corr_past = 0; + } + } + } + else + { + sts[0]->hTcxEnc->enc_ste_pre_corr_past = 0; + sts[0]->hTcxEnc->kernel_switch_corr_past = 0.f; + + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + TCX_ENC_HANDLE hTcxEncCh = sts[ch]->hTcxEnc; + + if ( ( hCPE->cpe_id * CPE_CHANNELS + ch ) >= nChannels ) + { + hTcxEncCh->kernel_symmetry_past = hTcxEncCh->kernel_type[0] = 0; + + continue; + } + + init_tcx_enc_info( sts[ch], &L_subframe, &L_subframeTCX, &tcx_subframe_coded_lines ); + nSubframes = ( hTcxEncCh->tcxMode == TCX_20 ) ? 1 : NB_DIV; + + for ( n = 0; n < nSubframes; n++ ) + { + hTcxEncCh->kernel_type[n] = ( hTcxEncCh->kernel_symmetry_past && sts[ch]->element_mode == IVAS_CPE_MDCT ? 3 - mct_on : 0 ); + hTcxEncCh->kernel_symmetry_past = hTcxEncCh->kernel_type[n] & 1; + + kernel_switch_update_transforms( hTcxEncCh->spectrum[n], mdst_spectrum[ch][n], hTcxEncCh->transform_type[n], sts[ch]->hTcxCfg, sts[ch]->bwidth_sw_cnt, hTcxEncCh->kernel_type[n], + hTcxEncCh->new_speech_TCX, ( n /*1*/ ? NULL : hTcxEncCh->speech_TCX ), windowedSignal[ch] + n * L_FRAME48k, L_subframeTCX / nSubframes ); + } + } + } + + TNSAnalysisStereo( sts, mdst_spectrum, 0, tnsSize, tnsBits, param_core, mct_on ); + + /*--------------------------------------------------------------* + * Envelope Quantization and FDNS + *---------------------------------------------------------------*/ + + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + if ( ( hCPE->cpe_id * CPE_CHANNELS + ch ) >= nChannels ) + { + continue; + } + + st = sts[ch]; + nSubframes = ( st->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; + + if ( mct_on ) + { + set_zero( chE, NB_DIV ); + } + + init_tcx_enc_info( st, &L_subframe, &L_subframeTCX, &tcx_subframe_coded_lines ); + + L_subframe = L_subframe / nSubframes; + L_subframeTCX = ( mct_on ? L_subframeTCX / nSubframes : L_subframe ); + tcx_subframe_coded_lines = tcx_subframe_coded_lines / nSubframes; + + for ( n = 0; n < nSubframes; n++ ) + { + if ( st->hTcxEnc->fUseTns[n] ) + { + for ( i = 0; i < L_subframeTCX; i++ ) + { + powerSpec[i] = ( st->hTcxEnc->spectrum[n][i] * st->hTcxEnc->spectrum[n][i] ); + } + } + else + { + for ( i = 0; i < L_subframeTCX; i++ ) + { + powerSpec[i] = ( mdst_spectrum[ch][n][i] * mdst_spectrum[ch][n][i] + st->hTcxEnc->spectrum[n][i] * st->hTcxEnc->spectrum[n][i] ); + } + } + + if ( mct_on ) + { + chE[n] = sum_f( powerSpec, L_subframeTCX ); + } + + sns_compute_scf( powerSpec, st->hTcxCfg->psychParamsCurrent, st->L_frame, scf[ch][n] ); + } + + /* MCT: detect whether there are silent channels and set mct_chan_mode accordingly */ + if ( mct_on ) + { + chE_tot = sum_f( chE, NB_DIV ); + + if ( chE_tot < SILENT_CHANNEL_THRES && nSubframes == 1 ) + { + st->mct_chan_mode = MCT_CHAN_MODE_IGNORE; + st->bits_frame_channel = 0; + } + else + { + st->mct_chan_mode = MCT_CHAN_MODE_REGULAR; + } + } + } + + /* set low br mode, if possible. Can later be discarded, depending on the stereo mode used for SNS parameter decoding */ + if ( hCPE->element_brate == IVAS_48k && !( ( sts[0]->core == TCX_20 && sts[1]->core == TCX_20 ) ) ) + { + sns_low_br_mode = !sts[0]->sp_aud_decision0; + } + else + { + sns_low_br_mode = 0; + } + + if ( !mct_on && sts[0]->sr_core == 25600 && ( ( hCPE->element_brate == IVAS_48k || hCPE->element_brate == IVAS_64k ) ) ) + { + quantize_sns( scf, scf_q, sts, sns_vq_indices, zero_side_flag, sns_stereo_mode ); + } + else + { + if ( sts[0]->hTcxEnc->tcxMode == TCX_20 && sts[1]->hTcxEnc->tcxMode == TCX_20 && + sts[0]->mct_chan_mode == MCT_CHAN_MODE_REGULAR && sts[1]->mct_chan_mode == MCT_CHAN_MODE_REGULAR ) + { + sns_avq_cod_stereo( scf[0][0], scf[1][0], sts[0]->L_frame, scf_q[0][0], scf_q[1][0], param_lpc[0], param_lpc[1] ); + } + else + { + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + param_lpc[ch][0] = ch; + if ( sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) + { + continue; + } + st = sts[ch]; + + if ( st->hTcxEnc->tcxMode == TCX_20 ) + { + sns_avq_cod( scf[ch][0], NULL, scf_q[ch][0], NULL, ¶m_lpc[ch][1], st->hTcxEnc->tcxMode, st->L_frame, sns_low_br_mode ); + } + else + { + sns_avq_cod( scf[ch][1], scf[ch][0], scf_q[ch][1], scf_q[ch][0], ¶m_lpc[ch][1], st->hTcxEnc->tcxMode, st->L_frame, sns_low_br_mode ); + } + } + } + } + + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + if ( sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) + { + continue; + } + st = sts[ch]; + nSubframes = ( st->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; + init_tcx_enc_info( st, &L_subframe, &L_subframeTCX, &tcx_subframe_coded_lines ); + + L_subframe = L_subframe / nSubframes; + L_subframeTCX = L_subframeTCX / nSubframes; + tcx_subframe_coded_lines = tcx_subframe_coded_lines / nSubframes; + + for ( n = 0; n < nSubframes; n++ ) + { + mvr2r( st->hTcxEnc->spectrum[n], orig_spectrum[ch][n], L_subframeTCX ); + + /* Shape spectrum */ + ShapeSpectrum( st->hTcxCfg, A_q[ch][n], NULL, L_subframe, tcx_subframe_coded_lines, st->hTcxEnc->spectrum[n], st->hTcxEnc->fUseTns[n], st, scf_q[ch][n] ); + } + } + + /*--------------------------------------------------------------* + * TNS + *---------------------------------------------------------------*/ + + /* first deinterleave once more */ + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + if ( sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) + { + continue; + } + st = sts[ch]; + nSubframes = ( st->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; + + for ( n = 0; n < nSubframes; n++ ) + { + if ( st->hTcxEnc->transform_type[n] == TCX_5 ) + { + tcx5SpectrumDeinterleaving( st->hTcxCfg->tcx5SizeFB, st->hTcxEnc->spectrum[n] ); + tcx5SpectrumDeinterleaving( st->hTcxCfg->tcx5SizeFB, mdst_spectrum[ch][n] ); + } + } + } + + TNSAnalysisStereo( sts, mdst_spectrum, 1, tnsSize, tnsBits, param_core, mct_on ); + + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + if ( sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) + { + continue; + } + + st = sts[ch]; + nSubframes = ( st->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; + + init_tcx_enc_info( st, &L_subframe, &L_subframeTCX, &tcx_subframe_coded_lines ); + + L_subframe = L_subframe / nSubframes; + L_subframeTCX = L_subframeTCX / nSubframes; + tcx_subframe_coded_lines = tcx_subframe_coded_lines / nSubframes; + + for ( n = 0; n < nSubframes; n++ ) + { + if ( !st->hTcxEnc->fUseTns[n] ) + { + ShapeSpectrum( st->hTcxCfg, A_q[ch][n], NULL, L_subframe, tcx_subframe_coded_lines, mdst_spectrum[ch][n], st->hTcxEnc->fUseTns[n], st, scf_q[ch][n] ); + } + } + } + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + /*no need to write last channel bit in case of odd channels*/ + if ( ( hCPE->cpe_id * CPE_CHANNELS + ch ) >= nChannels ) + { + continue; + } + + st = sts[ch]; + + if ( mct_on ) /* signal bits should be written only for MCT*/ + { + if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) + { + push_next_indice( hBstr, 1, 1 ); + } + else + { + assert( st->mct_chan_mode == MCT_CHAN_MODE_REGULAR ); + push_next_indice( hBstr, 0, 1 ); + } + } + } + + /* write bitstream with info up to here */ + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + st = sts[ch]; + + if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) + { + st->side_bits_frame_channel = 0; + /*dummy initialization to prevent range coder crashing in case all channels are silent and bits are distributed to channel 0 */ + *p_param[ch] = 1 + NOISE_FILL_RANGES + LTPSIZE + tnsSize[ch][0] + NPRM_CTX_HM; + continue; + } + + enc_prm_pre_mdct( st, param_core[ch], ( ( ( ch > 0 ) && ( sts[0]->hTcxEnc->fUseTns[0] + sts[0]->hTcxEnc->fUseTns[1] > 0 ) && !mct_on ) ? tnsSize[ch] : NULL ), p_param[ch], mct_on, hBstr ); + + if ( ch > 0 && sts[0]->hTcxEnc->fUseTns[0] + sts[0]->hTcxEnc->fUseTns[1] > 0 && !mct_on ) + { + if ( st->hTcxEnc->tnsData[0].nFilters < 0 ) + { + tnsBits[ch][0] = 1; + } + else + { + tnsBits[ch][0]++; + } + + if ( st->core == TCX_10_CORE ) + { + if ( st->hTcxEnc->tnsData[1].nFilters < 0 ) + { + tnsBits[ch][1] = 1; + } + else + { + tnsBits[ch][1]++; + } + } + } + } + + /*--------------------------------------------------------------------------------* + * SNS parameters + *--------------------------------------------------------------------------------*/ + + if ( !mct_on && sts[0]->sr_core == 25600 && ( ( hCPE->element_brate == IVAS_48k || hCPE->element_brate == IVAS_64k ) ) ) + { + idx = 0; + + if ( sts[0]->core == sts[1]->core ) + { + nSubframes = ( sts[0]->core == TCX_20_CORE ) ? 1 : NB_DIV; + + /* push all stereo mode bits first */ + for ( n = 0; n < nSubframes; ++n ) + { + push_next_indice( hBstr, sns_stereo_mode[n], 1 ); + sts[0]->side_bits_frame_channel++; + } + + /* zero side flags only get transmitted if needed */ + for ( n = 0; n < nSubframes; ++n ) + { + if ( sns_stereo_mode[n] == SNS_STEREO_MODE_MS ) + { + push_next_indice( hBstr, zero_side_flag[n], 1 ); + sts[0]->side_bits_frame_channel++; + } + } + } + + for ( ch = 0; ch < CPE_CHANNELS; ++ch ) + { + st = sts[ch]; + nbits_start_sns = hBstr->nb_bits_tot; + nSubframes = ( st->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; + for ( n = 0; n < nSubframes; ++n ) + { + const int16_t is_side = ch == 1 && sns_stereo_mode[n] == SNS_STEREO_MODE_MS; + const int16_t *bits = ( nSubframes == 1 ) ? ivas_sns_cdbks_tcx20_bits : ivas_sns_cdbks_tcx10_bits; + int16_t nStages = ( ( nSubframes == 1 ) ? SNS_MSVQ_NSTAGES_TCX20 : SNS_MSVQ_NSTAGES_TCX10 ); + + if ( is_side ) + { + if ( zero_side_flag[n] ) + { + continue; + } + nStages = SNS_MSVQ_NSTAGES_SIDE; + bits = ( sts[ch]->core == TCX_20_CORE ) ? ivas_sns_cdbks_side_tcx20_bits : ivas_sns_cdbks_side_tcx10_bits; + } + for ( int16_t j = 0; j < nStages; ++j, ++idx ) + { + push_next_indice( hBstr, sns_vq_indices[idx], bits[j] ); + } + } + st->side_bits_frame_channel += hBstr->nb_bits_tot - nbits_start_sns; + } + } + else + { + /* write SNS parameter separately since at the decoder, both channels' cores need to be decoded before, so the joint SNS decoding can be done */ + skipped_first_channel = 0; + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + st = sts[ch]; + + if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) + { + skipped_first_channel = 1; + continue; + } + + nbits_start_sns = hBstr->nb_bits_tot; + + num_sns = ( st->core == TCX_20_CORE ) ? 1 : NB_DIV; + + if ( ch == 0 || skipped_first_channel ) + { + push_next_indice( hBstr, param_lpc[0][0] >> 1, 1 ); + + if ( st->element_brate == IVAS_48k && !( ( sts[0]->core == TCX_20 && sts[1]->core == TCX_20 ) ) ) + { + /* write classifier decision to signal low br mode for SNS encoding, for all other configs, low_br mode is not possible */ + push_next_indice( hBstr, sns_low_br_mode, 1 ); + } + } + encode_lpc_avq( hBstr, num_sns, param_lpc[ch], st->core, st->element_mode ); + + st->side_bits_frame_channel += hBstr->nb_bits_tot - nbits_start_sns; + } + } + + + /*update pitch buffer*/ + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + st = sts[ch]; + if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) + { + continue; + } + if ( param_core[ch][1 + NOISE_FILL_RANGES] != 0 ) + { + set_f( pitch_buf[ch], ( st->hTcxEnc->tcxltp_pitch_int + (float) st->hTcxEnc->tcxltp_pitch_fr / (float) st->pit_res_max ) * (float) st->sr_core / (float) INT_FS_12k8, NB_SUBFR16k ); + } + else + { + set_f( pitch_buf[ch], L_SUBFR, NB_SUBFR16k ); + } + } + + pop_wmops(); + return; +} + + +/*--------------------------------------------------------------* + * ivas_mdct_quant_coder() + * + * Spectrum quantization and coding + *---------------------------------------------------------------*/ + +void ivas_mdct_quant_coder( + CPE_ENC_HANDLE hCPE, /* i/o: Encoder CPE handle */ + int16_t tnsBits[CPE_CHANNELS][NB_DIV], /* i : bits needed for TNS parameters */ + int16_t tnsSize[CPE_CHANNELS][NB_DIV], /* i : size of TNS */ + int16_t p_param[CPE_CHANNELS][NB_DIV], /* i : pointer to parameter array */ + const int16_t MCT_flag /* i : hMCT handle allocated (1) or not (0) */ +) +{ + Encoder_State *st, **sts; + int16_t bitsAvailable, target_bits, nSubframes, ch, n; + int16_t L_frameTCX[CPE_CHANNELS][NB_DIV]; /* full frame length */ + int16_t L_frame[CPE_CHANNELS][NB_DIV]; /* frame length */ + int16_t L_spec[CPE_CHANNELS][NB_DIV]; /* length of the coded spectrum */ + int16_t tcx_offset[CPE_CHANNELS][NB_DIV]; /* folding point offset relative to the end of the previous frame */ + int16_t noiseFillingBorder[CPE_CHANNELS][NB_DIV]; /* noise filling border */ + float fac_ns[CPE_CHANNELS][NB_DIV]; /* noise filling level */ + int16_t nf_seed[CPE_CHANNELS][NB_DIV]; /* noise filling random seed */ + int16_t hm_active[CPE_CHANNELS][NB_DIV]; /* flag indicating if the harmonic model is active */ + float ener[CPE_CHANNELS][NB_DIV]; /* energy of the quantized spectrum */ + float gain_tcx[CPE_CHANNELS][NB_DIV]; /* global gain */ + float quantized_spectrum_long[CPE_CHANNELS][N_MAX]; /* quantized MDCT spectrum, inv ms mask mdst spectrum, scratch for MS spectra in the MS decision */ + float *quantized_spectrum[CPE_CHANNELS][NB_DIV]; + int16_t param_core[CPE_CHANNELS][2 * NPRM_DIV]; + int16_t ignore_chan[CPE_CHANNELS]; + int16_t target_bitsTCX10[CPE_CHANNELS][NB_DIV]; + int16_t nbits_start, total_nbbits; + + push_wmops( "mdct_core_Q" ); + sts = hCPE->hCoreCoder; + + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + set_f( fac_ns[ch], 0.0f, NB_DIV ); + set_s( nf_seed[ch], 0, NB_DIV ); + set_s( hm_active[ch], 0, NB_DIV ); + set_f( ener[ch], 0.0f, NB_DIV ); + set_f( gain_tcx[ch], 0.0f, NB_DIV ); + } + + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + quantized_spectrum[ch][0] = quantized_spectrum_long[ch]; + quantized_spectrum[ch][1] = quantized_spectrum_long[ch] + N_TCX10_MAX; + + st = sts[ch]; + + if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) + { + ignore_chan[ch] = 1; + continue; + } + + nSubframes = ( st->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; + ignore_chan[ch] = 0; + + bitsAvailable = st->bits_frame_channel + nSubframes * ( NBITS_TCX_GAIN + NOISE_FILL_RANGES * NBITS_NOISE_FILL_LEVEL ) + tnsBits[ch][0] + tnsBits[ch][1]; + + /* calculate TCX10 target bits before to assure minimum amount is distributed between subframes */ + if ( st->hTcxEnc->tcxMode == TCX_10 ) + { + int16_t nTnsBitsTCX10Tmp[2]; + nTnsBitsTCX10Tmp[0] = tnsBits[ch][0]; + nTnsBitsTCX10Tmp[1] = tnsBits[ch][1]; + + ivas_mdct_tcx10_bit_distribution( target_bitsTCX10[ch], bitsAvailable, nTnsBitsTCX10Tmp ); + } + + for ( n = 0; n < nSubframes; n++ ) + { + if ( nSubframes == 2 ) + { + target_bits = target_bitsTCX10[ch][n]; + } + else + { + target_bits = bitsAvailable / nSubframes - tnsBits[ch][n]; + } + + assert( target_bits >= NBITS_TCX_GAIN + NOISE_FILL_RANGES * NBITS_NOISE_FILL_LEVEL + SMDCT_MINIMUM_ARITH_BITS ); + + /*-----------------------------------------------------------* + * Quantize the MDCT spectrum * + *-----------------------------------------------------------*/ + + QuantizeTCXSpectrum( st, n, st->hTcxEnc->spectrum[n], NULL, NULL, tnsSize[ch][n], target_bits, 0, &L_frameTCX[ch][n], + &L_frame[ch][n], &L_spec[ch][n], &tcx_offset[ch][n], &noiseFillingBorder[ch][n], quantized_spectrum[ch][n], NULL, + &hm_active[ch][n], NULL, &nf_seed[ch][n], &ener[ch][n], &gain_tcx[ch][n], param_core[ch] + n * NPRM_DIV ); + } + } + + EstimateStereoTCXNoiseLevel( sts, quantized_spectrum, gain_tcx, L_frame, noiseFillingBorder, hm_active, ignore_chan, fac_ns, param_core, MCT_flag ); + + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + st = sts[ch]; + + /* update the pointer to the buffer of indices of the second channel */ + if ( ch > 0 ) + { + st->hBstr->ind_list = sts[0]->hBstr->ind_list + sts[0]->hBstr->nb_ind_tot; + } + if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) + { + /*Enable appropriate upadte of tcx_curr_overlap_mode even for uncoded channel index 1*/ + L_frameTCX[ch][0] = ( st->core == TCX_10_CORE ) ? st->hTcxEnc->L_frameTCX >> 1 : st->hTcxEnc->L_frameTCX; + L_frameTCX[ch][1] = ( st->core == TCX_10_CORE ) ? st->hTcxEnc->L_frameTCX >> 1 : st->hTcxEnc->L_frameTCX; + + L_frame[ch][0] = st->L_frame; + L_frame[ch][1] = st->L_frame; + } + nSubframes = ( st->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; + + for ( n = 0; n < nSubframes; n++ ) + { + /* Update L_frame_past */ + st->L_frame_past = L_frame[ch][n]; + + /* Update overlap */ + if ( ( ( ( L_frameTCX[ch][n] == st->hTcxEnc->L_frameTCX >> 1 ) && n > 0 ) || ( st->hTcxCfg->tcx_last_overlap_mode == TRANSITION_OVERLAP ) ) && ( st->hTcxCfg->tcx_curr_overlap_mode == FULL_OVERLAP ) ) + { + st->hTcxCfg->tcx_curr_overlap_mode = ALDO_WINDOW; + } + } + + /*--------------------------------------------------------------* + * Generate Bitstream + *---------------------------------------------------------------*/ + + if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) + { + continue; + } + nbits_start = st->hBstr->nb_bits_tot; + + writeTCXparam( st, st->hBstr, NULL, param_core[ch], 0, 0, 0, NULL, p_param[ch], target_bitsTCX10[ch], 1 ); + + total_nbbits = st->hBstr->nb_bits_tot - nbits_start - nSubframes * ( NBITS_TCX_GAIN + NOISE_FILL_RANGES * NBITS_NOISE_FILL_LEVEL ); + + assert( st->bits_frame_channel == total_nbbits ); + } + + pop_wmops(); + return; +} + + +/*--------------------------------------------------------------* + * init_tcx_enc_info() + * + * Initialize TCX parameters + *---------------------------------------------------------------*/ + +void init_tcx_enc_info( + Encoder_State *st, /* i/o: coder memory state */ + int16_t *L_frame, + int16_t *L_frameTCX, + int16_t *L_spec ) +{ + TCX_ENC_HANDLE hTcxEnc = st->hTcxEnc; + TCX_CONFIG_HANDLE hTcxCfg = st->hTcxCfg; + int16_t tcx_offset, tcx_offsetFB; + + /* Init lengths */ + tcx_offset = hTcxCfg->tcx_offset; + tcx_offsetFB = hTcxCfg->tcx_offsetFB; + *L_frame = st->L_frame; + *L_frameTCX = hTcxEnc->L_frameTCX; + *L_spec = st->hTcxCfg->tcx_coded_lines; + + if ( st->last_core == ACELP_CORE ) + { + /* if past frame is ACELP */ + *L_frame += tcx_offset; + *L_frameTCX += tcx_offsetFB; + *L_spec += st->hTcxCfg->tcx_coded_lines >> 2; + + assert( hTcxCfg->lfacNext <= 0 ); + *L_frame -= hTcxCfg->lfacNext; + *L_frameTCX -= hTcxCfg->lfacNextFB; + } + + return; +} diff --git a/lib_enc/ivas_omasa_enc.c b/lib_enc/ivas_omasa_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..34c073e9134f113b686aae6537086a71f849f257 --- /dev/null +++ b/lib_enc/ivas_omasa_enc.c @@ -0,0 +1,1135 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include "options.h" +#include +#include +#include +#include "ivas_cnst.h" +#include "ivas_prot.h" +#include "prot.h" +#include "ivas_rom_com.h" +#include "ivas_rom_enc.h" +#include "wmc_auto.h" + + +/*------------------------------------------------------------------------- + * Local function prototypes + *------------------------------------------------------------------------*/ + +static void ivas_omasa_param_est_enc( OMASA_ENC_HANDLE hOMasa, OMASA_ENCODER_DATA_HANDLE hOmasaData, ISM_METADATA_HANDLE hIsmMeta[], float *data_f[], float elevation_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], float azimuth_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], float energyRatio[MASA_FREQUENCY_BANDS], float spreadCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], float surroundingCoherence[MASA_FREQUENCY_BANDS], float diffuseness_m[MASA_FREQUENCY_BANDS], const int16_t input_frame, const int16_t nchan_inp ); + +static void ivas_omasa_energy_and_ratio_est( OMASA_ENC_HANDLE hOMasa, OMASA_ENCODER_DATA_HANDLE hOmasaData, float *data_f[], const int16_t input_frame, const int16_t nchan_inp ); + +static void ivas_omasa_dmx( float *data_in_f[], float data_out_f[][L_FRAME48k], const int16_t input_frame, const int16_t nchan_transport, const int16_t nchan_ism, ISM_METADATA_HANDLE hIsmMeta[], float prev_gains[][MASA_MAX_TRANSPORT_CHANNELS], const float interpolator[L_FRAME48k] ); + +static void computeIntensityVector_enc( const int16_t *band_grouping, float Cldfb_RealBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], float Cldfb_ImagBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], const int16_t num_frequency_bands, float intensity_real[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS] ); + +static void computeReferencePower_omasa( const int16_t *band_grouping, float Cldfb_RealBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], float Cldfb_ImagBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], float *reference_power, const int16_t enc_param_start_band, const int16_t num_freq_bands ); + +/*--------------------------------------------------------------------------* + * ivas_omasa_enc_open() + * + * Allocate and initialize OMASA handle + *--------------------------------------------------------------------------*/ + +ivas_error ivas_omasa_enc_open( + Encoder_Struct *st_ivas /* i/o: IVAS encoder handle */ +) +{ + int16_t i, j; + OMASA_ENC_HANDLE hOMasa; + int16_t numAnalysisChannels; + int16_t input_frame; + ivas_error error; + + error = IVAS_ERR_OK; + + assert( st_ivas->hMasa != NULL && "MASA encoder handle is not present" ); + + if ( ( hOMasa = (OMASA_ENC_HANDLE) malloc( sizeof( OMASA_ENC_STATE ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for OMASA encoder\n" ) ); + } + + numAnalysisChannels = st_ivas->hEncoderConfig->nchan_ism; + + /* open/initialize CLDFB */ + hOMasa->num_Cldfb_instances = numAnalysisChannels; + for ( i = 0; i < hOMasa->num_Cldfb_instances; i++ ) + { + if ( ( error = openCldfb( &( hOMasa->cldfbAnaEnc[i] ), CLDFB_ANALYSIS, st_ivas->hEncoderConfig->input_Fs, CLDFB_PROTOTYPE_5_00MS ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* intensity 3-dim */ + for ( i = 0; i < DIRAC_NUM_DIMS; i++ ) + { + hOMasa->direction_vector_m[i] = (float **) malloc( MAX_PARAM_SPATIAL_SUBFRAMES * sizeof( float * ) ); + + for ( j = 0; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++ ) + { + if ( ( hOMasa->direction_vector_m[i][j] = (float *) malloc( MASA_FREQUENCY_BANDS * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for OMASA data\n" ) ); + } + set_zero( hOMasa->direction_vector_m[i][j], MASA_FREQUENCY_BANDS ); + } + } + + for ( i = 0; i < DIRAC_NUM_DIMS; i++ ) + { + for ( j = 0; j < DIRAC_NO_COL_AVG_DIFF; j++ ) + { + if ( ( hOMasa->buffer_intensity_real[i][j] = (float *) malloc( MASA_FREQUENCY_BANDS * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for OMASA data\n" ) ); + } + set_zero( hOMasa->buffer_intensity_real[i][j], MASA_FREQUENCY_BANDS ); + } + } + + set_zero( hOMasa->buffer_energy, DIRAC_NO_COL_AVG_DIFF * MASA_FREQUENCY_BANDS ); + + for ( i = 0; i < MAX_NUM_OBJECTS; i++ ) + { +#ifdef NONBE_FIX_819_DOUBLE_PREC_COMB_FORMATS + set_f( hOMasa->prev_object_dm_gains[i], INV_SQRT_2, MASA_MAX_TRANSPORT_CHANNELS ); +#else + set_f( hOMasa->prev_object_dm_gains[i], (float) sqrt( 0.5 ), MASA_MAX_TRANSPORT_CHANNELS ); +#endif + } + set_zero( hOMasa->broadband_energy_sm, MAX_NUM_OBJECTS + MASA_MAX_TRANSPORT_CHANNELS ); + set_zero( hOMasa->broadband_energy_prev, MAX_NUM_OBJECTS + MASA_MAX_TRANSPORT_CHANNELS ); + hOMasa->prev_selected_object = 0; + hOMasa->changing_object = 0; + + input_frame = (int16_t) ( st_ivas->hEncoderConfig->input_Fs / FRAMES_PER_SEC ); + for ( i = 0; i < input_frame; i++ ) + { + hOMasa->interpolator[i] = ( (float) i ) / ( (float) input_frame ); + hOMasa->fade_out_gain[i] = ( 1.0f + cosf( ( (float) i ) / ( (float) input_frame ) * EVS_PI ) ) / 2.0f; + hOMasa->fade_in_gain[i] = 1.0f - hOMasa->fade_out_gain[i]; + } + + hOMasa->index_buffer_intensity = 0; + + st_ivas->hOMasa = hOMasa; + + return error; +} + + +/*--------------------------------------------------------------------------* + * ivas_omasa_enc_close() + * + * Close OMASA handle + *--------------------------------------------------------------------------*/ + +void ivas_omasa_enc_close( + OMASA_ENC_HANDLE *hOMasa /* i/o: encoder OMASA handle */ +) +{ + int16_t i, j; + + if ( hOMasa == NULL || *hOMasa == NULL ) + { + return; + } + + for ( i = 0; i < ( *hOMasa )->num_Cldfb_instances; i++ ) + { + deleteCldfb( &( ( *hOMasa )->cldfbAnaEnc[i] ) ); + } + + for ( i = 0; i < DIRAC_NUM_DIMS; i++ ) + { + for ( j = 0; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++ ) + { + free( ( *hOMasa )->direction_vector_m[i][j] ); + ( *hOMasa )->direction_vector_m[i][j] = NULL; + } + + for ( j = 0; j < DIRAC_NO_COL_AVG_DIFF; j++ ) + { + free( ( *hOMasa )->buffer_intensity_real[i][j] ); + ( *hOMasa )->buffer_intensity_real[i][j] = NULL; + } + + free( ( *hOMasa )->direction_vector_m[i] ); + ( *hOMasa )->direction_vector_m[i] = NULL; + } + + free( *hOMasa ); + ( *hOMasa ) = NULL; + + return; +} + + +/*--------------------------------------------------------------------------* + * ivas_omasa_enc_config() + * + * oMASA encoder configuration + *--------------------------------------------------------------------------*/ + +ivas_error ivas_omasa_enc_config( + Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ +) +{ + int16_t k, sce_id, nSCE_old; + int32_t ivas_total_brate, ism_total_brate; + ENCODER_CONFIG_HANDLE hEncoderConfig; + ivas_error error; + + hEncoderConfig = st_ivas->hEncoderConfig; + ivas_total_brate = hEncoderConfig->ivas_total_brate; + nSCE_old = st_ivas->nSCE; + + st_ivas->ism_mode = ivas_omasa_ism_mode_select( ivas_total_brate, hEncoderConfig->nchan_ism ); + st_ivas->nchan_transport = 2; + + /* reconfiguration in case of bitrate switching */ + if ( hEncoderConfig->last_ivas_total_brate != ivas_total_brate ) + { + ivas_set_omasa_TC( st_ivas->ism_mode, hEncoderConfig->nchan_ism, &st_ivas->nSCE, &st_ivas->nCPE ); + + k = 0; + while ( k < SIZE_IVAS_BRATE_TBL && ivas_total_brate != ivas_brate_tbl[k] ) + { + k++; + } + + ism_total_brate = 0; + for ( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) + { + ism_total_brate += sep_object_brate[k - 2][st_ivas->nSCE - 1]; + } + + if ( st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) + { + if ( ( error = ivas_ism_config( st_ivas->hEncoderConfig->ivas_total_brate, st_ivas->nchan_transport, 1, NULL, 0, NULL, NULL, NULL, NULL, NULL, 1 ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC ) + { + if ( ( error = ivas_ism_config( st_ivas->hEncoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->nSCE, NULL, 0, NULL, NULL, NULL, NULL, NULL, 1 ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* reconfigure core-coders for ISMs */ + if ( ( error = ivas_corecoder_enc_reconfig( st_ivas, nSCE_old, 1, 2, st_ivas->nSCE > 0 ? sep_object_brate[k - 2][st_ivas->nSCE - 1] : 0, ivas_total_brate - ism_total_brate, MC_MODE_NONE ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* re-write IVAS format signalling - actual 'ism_mode' was not known before */ + if ( st_ivas->nSCE > 0 ) + { + reset_indices_enc( st_ivas->hSCE[0]->hCoreCoder[0]->hBstr, st_ivas->hSCE[0]->hCoreCoder[0]->hBstr->nb_bits_tot ); + } + else + { + reset_indices_enc( st_ivas->hCPE[0]->hCoreCoder[0]->hBstr, st_ivas->hCPE[0]->hCoreCoder[0]->hBstr->nb_bits_tot ); + } + + ivas_write_format( st_ivas ); + + if ( st_ivas->ism_mode != ISM_MASA_MODE_DISC && st_ivas->hOMasa == NULL ) + { + if ( ( error = ivas_omasa_enc_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC && st_ivas->hOMasa != NULL ) + { + ivas_omasa_enc_close( &( st_ivas->hOMasa ) ); + st_ivas->hOMasa = NULL; + } + + st_ivas->hCPE[0]->element_brate = ivas_total_brate - ism_total_brate; + + if ( ivas_total_brate - ism_total_brate >= MIN_BRATE_MDCT_STEREO ) + { + hEncoderConfig->element_mode_init = IVAS_CPE_MDCT; + } + else + { + hEncoderConfig->element_mode_init = IVAS_CPE_DFT; + } + } + + /* Configure MASA encoder based on frame parameters */ + if ( ( error = ivas_masa_enc_config( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( st_ivas->ism_mode != ISM_MASA_MODE_DISC ) + { + /* Configure oMASA analysis based on MASA config */ + ivas_omasa_set_config( st_ivas->hOMasa, st_ivas->hMasa, st_ivas->hEncoderConfig->input_Fs, st_ivas->ism_mode ); + } + + return IVAS_ERR_OK; +} + + +/*--------------------------------------------------------------------------* + * ivas_omasa_set_config() + * + * Frame-by-frame config for oMASA + *--------------------------------------------------------------------------*/ + +void ivas_omasa_set_config( + OMASA_ENC_HANDLE hOMasa, /* i/o: OMASA encoder handle */ + MASA_ENCODER_HANDLE hMasa, /* i : MASA encoder handle */ + const int32_t input_Fs, /* i : Input sample rate */ + const ISM_MODE ism_mode /* i : ISM mode */ +) +{ + uint8_t i, maxBin; + + /* Determine the number of bands */ + if ( ism_mode == ISM_MODE_NONE || ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) + { + /* use full resolution for the ISM+MASA merge and reduce later */ + hOMasa->nbands = 24; + } + else + { + hOMasa->nbands = hMasa->config.numCodingBands; + } + + hOMasa->nCodingBands = hMasa->config.numCodingBands; + + /* Determine the number of subframes */ + hOMasa->nSubframes = hMasa->config.joinedSubframes == TRUE ? 1 : MAX_PARAM_SPATIAL_SUBFRAMES; + + /* Determine band grouping */ + if ( hOMasa->nbands == 24 ) + { + mvs2s( MASA_band_grouping_24, hOMasa->band_grouping, 24 + 1 ); + } + else + { + for ( i = 0; i < hOMasa->nbands + 1; i++ ) + { + hOMasa->band_grouping[i] = MASA_band_grouping_24[hMasa->data.band_mapping[i]]; + } + } + + maxBin = (uint8_t) ( input_Fs * INV_CLDFB_BANDWIDTH + 0.5f ); + + for ( i = 1; i < hOMasa->nbands + 1; i++ ) + { + if ( hOMasa->band_grouping[i] >= maxBin ) + { + hOMasa->band_grouping[i] = maxBin; + hOMasa->nbands = i; + break; + } + } + + mvs2s( DirAC_block_grouping, hOMasa->block_grouping, MAX_PARAM_SPATIAL_SUBFRAMES + 1 ); + if ( hOMasa->nSubframes == 1 ) + { + hOMasa->block_grouping[1] = hOMasa->block_grouping[MAX_PARAM_SPATIAL_SUBFRAMES]; + } + + return; +} + + +/*--------------------------------------------------------------------------* + * ivas_omasa_enc() + * + * Main OMASA encoding function + *--------------------------------------------------------------------------*/ + +void ivas_omasa_enc( + OMASA_ENC_HANDLE hOMasa, /* i/o: OMASA encoder handle */ + MASA_ENCODER_HANDLE hMasa, /* i/o: MASA encoder handle */ + ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handle */ + float *data_in_f[], /* i/o: Input / transport audio signals */ + const int16_t input_frame, /* i : Input frame size */ + const int16_t nchan_transport, /* i : Number of transport channels */ + const int16_t nchan_ism, /* i : Number of objects for parameter analysis */ + const ISM_MODE ism_mode, /* i : ISM mode */ + float *data_separated_object, /* o : Separated object audio signal */ + int16_t *idx_separated_object /* o : Index of the separated object */ +) +{ + int16_t i, j; + float data_out_f[MASA_MAX_TRANSPORT_CHANNELS][L_FRAME48k]; + + /* Determine separated object (when applicable) */ + if ( ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) + { + float broadband_energy[MAX_NUM_OBJECTS + MASA_MAX_TRANSPORT_CHANNELS]; + int16_t loudest_object; + int16_t selected_object; + int16_t nchan_all_inp; + float alpha; + uint8_t fade_out_separate_object; + uint8_t fade_in_separate_object; + + /* Estimate broadband energies */ + nchan_all_inp = nchan_ism + nchan_transport; + set_zero( broadband_energy, nchan_all_inp ); + for ( i = 0; i < nchan_all_inp; i++ ) + { + for ( j = 0; j < input_frame; j++ ) + { + broadband_energy[i] += data_in_f[i][j] * data_in_f[i][j]; + } + } + + /* Temporal averaging */ + alpha = 0.8f; + for ( i = 0; i < nchan_all_inp; i++ ) + { + hOMasa->broadband_energy_sm[i] = ( 1.0f - alpha ) * broadband_energy[i] + alpha * hOMasa->broadband_energy_sm[i]; + } + + /* Determine loudest object */ + loudest_object = 0; + for ( i = 1; i < nchan_ism; i++ ) + { + if ( hOMasa->broadband_energy_sm[i] > hOMasa->broadband_energy_sm[loudest_object] ) + { + loudest_object = i; + } + } + + /* Determine object to separate */ + selected_object = hOMasa->prev_selected_object; + fade_out_separate_object = 0; + fade_in_separate_object = 0; + if ( hOMasa->changing_object ) + { + hOMasa->changing_object = 0; + selected_object = loudest_object; + fade_in_separate_object = 1; + } + else + { + if ( loudest_object != hOMasa->prev_selected_object ) + { + float selected_ene; + float total_ene; + float selected_ratio; + float adaptive_threshold_dB; + float ratio_objects_dB; + float hardswitch_threshold = 0.25f; + + /* Compute the energy of the current and the previous selected object in the current and the previous frame */ + selected_ene = broadband_energy[loudest_object] + broadband_energy[hOMasa->prev_selected_object] + hOMasa->broadband_energy_prev[loudest_object] + hOMasa->broadband_energy_prev[hOMasa->prev_selected_object]; + + /* Compute the energy of all objects and MASA channels in the current and the previous frame */ + total_ene = 0.0f; + for ( i = 0; i < nchan_all_inp; i++ ) + { + total_ene += broadband_energy[i] + hOMasa->broadband_energy_prev[i]; + } + + /* Compute the ratio */ + selected_ratio = selected_ene / ( total_ene + EPSILON ); + + adaptive_threshold_dB = selected_ratio * 9.0f + 1.0f; /* selected ratio = 0 -> 1 dB, selected ratio = 1 -> 10 dB */ + ratio_objects_dB = 10.0f * log10f( hOMasa->broadband_energy_sm[loudest_object] / ( hOMasa->broadband_energy_sm[hOMasa->prev_selected_object] + EPSILON ) ); + + /* Adaptively determine whether to change the separated object. If they are quiet compared to the total energy, change easier, as other signals mask the change. */ + if ( ratio_objects_dB > adaptive_threshold_dB ) + { + if ( selected_ratio < hardswitch_threshold ) /* If low level compared to all audio channels, perform hardswitch */ + { + selected_object = loudest_object; + } + else /* If high level compared to all audio channels, perform switch via fade out fade in */ + { + hOMasa->changing_object = 1; + fade_out_separate_object = 1; + } + } + } + } + + /* Set values for next frame */ + for ( i = 0; i < nchan_all_inp; i++ ) + { + hOMasa->broadband_energy_prev[i] = broadband_energy[i]; + } + hOMasa->prev_selected_object = selected_object; + + /* Separate the selected object */ + *idx_separated_object = selected_object; + mvr2r( data_in_f[selected_object], data_separated_object, input_frame ); + if ( fade_out_separate_object ) + { + v_mult( data_separated_object, hOMasa->fade_out_gain, data_separated_object, input_frame ); + v_mult( data_in_f[selected_object], hOMasa->fade_in_gain, data_in_f[selected_object], input_frame ); + } + else if ( fade_in_separate_object ) + { + v_mult( data_separated_object, hOMasa->fade_in_gain, data_separated_object, input_frame ); + v_mult( data_in_f[selected_object], hOMasa->fade_out_gain, data_in_f[selected_object], input_frame ); + } + else + { + set_zero( data_in_f[selected_object], input_frame ); + } + } + + /* Analysis */ + if ( ism_mode == ISM_MODE_NONE || ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) + { + OMASA_SPATIAL_META OMasaMeta; /* working memory for the ISM-object MASA-parameters */ + OMASA_SPATIAL_META_HANDLE hOMasaMeta; + uint8_t n_bands_orig, n_subframes_orig; + uint8_t numCodingBands_orig, joinedSubframes_orig; + + hOMasaMeta = &OMasaMeta; + hOMasaMeta->num_dirs = 1; + + /* merge MASA directions before adding ISM to the mixture */ + if ( hMasa->config.numberOfDirections == 2 ) + { + n_bands_orig = hMasa->config.numCodingBands; + hMasa->config.numCodingBands = MASA_FREQUENCY_BANDS; + + ivas_masa_combine_directions( hMasa ); + + hMasa->config.numCodingBands = (int8_t) n_bands_orig; + } + + /* force computation into high resolution */ + + n_subframes_orig = hOMasa->nSubframes; + hOMasa->nSubframes = MAX_PARAM_SPATIAL_SUBFRAMES; + + /* Estimate MASA parameters from the objects */ + /* NB: only first direction is populated */ + /* NB2: in energy_ratios and surround_coherence only first sub-frame contains valid data */ + ivas_omasa_param_est_enc( hOMasa, hMasa->data.hOmasaData, hIsmMeta, data_in_f, hOMasaMeta->directional_meta[0].elevation, hOMasaMeta->directional_meta[0].azimuth, hOMasaMeta->directional_meta[0].energy_ratio[0], hOMasaMeta->directional_meta[0].spread_coherence, hOMasaMeta->common_meta.surround_coherence[0], + hOMasaMeta->common_meta.diffuse_to_total_ratio[0], input_frame, nchan_ism ); + + /* copy energy_ratios and surrCoh from first sub-frame to the remaining ones */ + for ( i = 1; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + { + mvr2r( hOMasaMeta->directional_meta[0].energy_ratio[0], hOMasaMeta->directional_meta[0].energy_ratio[i], MASA_FREQUENCY_BANDS ); + mvr2r( hOMasaMeta->common_meta.surround_coherence[0], hOMasaMeta->common_meta.surround_coherence[i], MASA_FREQUENCY_BANDS ); + mvr2r( hOMasaMeta->common_meta.diffuse_to_total_ratio[0], hOMasaMeta->common_meta.diffuse_to_total_ratio[i], MASA_FREQUENCY_BANDS ); + } + + /* restore resolution parameters */ + hOMasa->nSubframes = n_subframes_orig; + + /* perform MASA+ISM merge in full resolution */ + numCodingBands_orig = hMasa->config.numCodingBands; + joinedSubframes_orig = hMasa->config.joinedSubframes; + + hMasa->config.numCodingBands = hOMasa->nbands; + hMasa->config.joinedSubframes = 0; + + ivas_merge_masa_metadata( hMasa, hOMasaMeta ); /* => merge result in hMasa->masaMetadata */ + + hMasa->config.numCodingBands = numCodingBands_orig; + hMasa->config.joinedSubframes = joinedSubframes_orig; + } + else if ( ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) + { + /* Estimate energies and ratios */ + ivas_omasa_energy_and_ratio_est( hOMasa, hMasa->data.hOmasaData, data_in_f, input_frame, nchan_ism ); + } + + /* Downmix */ + ivas_omasa_dmx( data_in_f, data_out_f, input_frame, nchan_transport, nchan_ism, hIsmMeta, hOMasa->prev_object_dm_gains, hOMasa->interpolator ); + + /* Move the ISM metadata to the first entry for encoding in the MASA_ONE_OBJ mode */ + if ( ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) + { + hIsmMeta[0]->azimuth = hIsmMeta[*idx_separated_object]->azimuth; + hIsmMeta[0]->elevation = hIsmMeta[*idx_separated_object]->elevation; + } + + /* Merge transport signals */ + ivas_merge_masa_transports( data_out_f, &( data_in_f[nchan_ism] ), data_in_f, input_frame, nchan_transport ); + + return; +} + + +/*-------------------------------------------------------------------------* + * ivas_set_ism_importance_interformat() + * + * Set the importance of particular ISM streams in combined-format coding + *-------------------------------------------------------------------------*/ + +void ivas_set_ism_importance_interformat( + const int32_t ism_total_brate, /* i/o: ISms total bitrate */ + const int16_t nchan_transport, /* i : number of transported channels */ + ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ + SCE_ENC_HANDLE hSCE[], /* i/o: SCE encoder handles */ + const float lp_noise_CPE, /* i : LP filtered total noise estimation */ + int16_t ism_imp[] /* o : ISM importance flags */ +) +{ + Encoder_State *st; + int16_t ch, ctype, active_flag; + + for ( ch = 0; ch < nchan_transport; ch++ ) + { + st = hSCE[ch]->hCoreCoder[0]; + + active_flag = st->vad_flag; + + if ( active_flag == 0 ) + { + if ( st->lp_noise > 15 || lp_noise_CPE - st->lp_noise < 30 ) + { + active_flag = 1; + } + } + + /* do not use the low-rate core-coder mode at highest bit-rates */ + if ( ism_total_brate / nchan_transport > IVAS_48k ) + { + active_flag = 1; + } + + ctype = hSCE[ch]->hCoreCoder[0]->coder_type_raw; + + st->low_rate_mode = 0; + if ( active_flag == 0 ) + { + ism_imp[ch] = ISM_INACTIVE_IMP; + st->low_rate_mode = 1; + } + else if ( ctype == INACTIVE || ctype == UNVOICED ) + { + ism_imp[ch] = ISM_LOW_IMP; + } + else if ( ctype == VOICED ) + { + ism_imp[ch] = ISM_MEDIUM_IMP; + } + else /* GENERIC */ + { + ism_imp[ch] = ISM_HIGH_IMP; + } + + hIsmMeta[ch]->ism_metadata_flag = active_flag; /* flag is needed for the MD coding */ + } + + return; +} + + +/*--------------------------------------------------------------------------* + * ivas_set_surplus_brate_enc() + * + * set bit-rate surplus in combined format coding + *--------------------------------------------------------------------------*/ + +void ivas_set_surplus_brate_enc( + Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ +) +{ + if ( st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) + { + st_ivas->hCPE[0]->brate_surplus = st_ivas->hSCE[0]->element_brate - ivas_interformat_brate( ISM_MASA_MODE_PARAM_ONE_OBJ, 1, st_ivas->hSCE[0]->element_brate, st_ivas->hIsmMetaData[0]->ism_imp, 0 ); + /* note: ISM st->total_brate is iset in ivas_sce_enc() */ + } + else if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC || st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) + { + /* it is already set in ivas_ism_enc() */ + } + else + { + st_ivas->hCPE[0]->brate_surplus = 0; + } + + + return; +} + + +/*--------------------------------------------------------------------------* + * ivas_omasa_ener_brate() + * + * + *--------------------------------------------------------------------------*/ + +/*! r: OMASA energy bitrate flag */ +int16_t ivas_omasa_ener_brate( + const int16_t nchan_ism, /* i : number of ISMs */ + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + float *data_f[], /* i : Input / transport audio signals */ + const int16_t input_frame /* i : Input frame size */ +) +{ + int16_t i, flag_omasa_ener_brate; + float energy_ism, energy_masa; + + flag_omasa_ener_brate = 0; + + if ( nchan_ism >= 3 && ivas_total_brate == IVAS_128k ) + { + energy_ism = 0.0f; + for ( i = 0; i < nchan_ism; i++ ) + { + energy_ism += sum2_f( data_f[i], input_frame ); + } + + energy_masa = 0.0f; + for ( i = nchan_ism; i < nchan_ism + MASA_MAXIMUM_DIRECTIONS; i++ ) + { + energy_masa += sum2_f( data_f[i], input_frame ); + } + + energy_ism = energy_ism / ( energy_masa + 1.0f ) * 2.0f / (float) ( nchan_ism ); + + if ( energy_ism < 1.0f ) + { + flag_omasa_ener_brate = 1; + } + } + + return flag_omasa_ener_brate; +} + + +/*--------------------------------------------------------------------------* + * Local functions + *--------------------------------------------------------------------------*/ + +/* Estimate MASA parameters from the objects */ +static void ivas_omasa_param_est_enc( + OMASA_ENC_HANDLE hOMasa, + OMASA_ENCODER_DATA_HANDLE hOmasaData, + ISM_METADATA_HANDLE hIsmMeta[], + float *data_f[], + float elevation_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], + float azimuth_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], + float energyRatio[MASA_FREQUENCY_BANDS], + float spreadCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], + float surroundingCoherence[MASA_FREQUENCY_BANDS], + float diffuseness_m[MASA_FREQUENCY_BANDS], + const int16_t input_frame, + const int16_t nchan_ism ) +{ + float reference_power[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + int16_t ts, i, j, d, k; + int16_t num_freq_bins, num_freq_bands, index; + float dir_v[DIRAC_NUM_DIMS]; + int16_t l_ts; + float Chnl_RealBuffer[MCMASA_MAX_ANA_CHANS][CLDFB_NO_CHANNELS_MAX]; + float Chnl_ImagBuffer[MCMASA_MAX_ANA_CHANS][CLDFB_NO_CHANNELS_MAX]; + float Foa_RealBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX]; + float Foa_ImagBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX]; + float intensity_real[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS]; + float direction_vector[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS]; + float diffuseness_vector[MASA_FREQUENCY_BANDS]; + int16_t band_m_idx, block_m_idx; + float renormalization_factor_diff[MASA_FREQUENCY_BANDS]; + float norm_tmp; + int16_t mrange[2], brange[2]; + + num_freq_bins = hOMasa->cldfbAnaEnc[0]->no_channels; + num_freq_bands = hOMasa->nbands; + l_ts = input_frame / CLDFB_NO_COL_MAX; + + /* Need to initialize renormalization_factors, and variables to be normalized */ + set_zero( renormalization_factor_diff, hOMasa->nbands ); + set_zero( diffuseness_m, hOMasa->nbands ); + + /* Compute ISM to FOA matrices */ + for ( i = 0; i < nchan_ism; i++ ) + { + hOMasa->chnlToFoaMtx[0][i] = 1.0f; + hOMasa->chnlToFoaMtx[1][i] = sinf( ( hIsmMeta[i]->azimuth / 180.0f * EVS_PI ) ) * cosf( ( hIsmMeta[i]->elevation / 180.0f * EVS_PI ) ); + hOMasa->chnlToFoaMtx[2][i] = sinf( ( hIsmMeta[i]->elevation / 180.0f * EVS_PI ) ); + hOMasa->chnlToFoaMtx[3][i] = cosf( ( hIsmMeta[i]->azimuth / 180.0f * EVS_PI ) ) * cosf( ( hIsmMeta[i]->elevation / 180.0f * EVS_PI ) ); + } + + /* do processing over all CLDFB time slots */ + for ( block_m_idx = 0; block_m_idx < hOMasa->nSubframes; block_m_idx++ ) + { + mrange[0] = hOMasa->block_grouping[block_m_idx]; + mrange[1] = hOMasa->block_grouping[block_m_idx + 1]; + + for ( band_m_idx = 0; band_m_idx < hOMasa->nbands; band_m_idx++ ) + { + hOMasa->direction_vector_m[0][block_m_idx][band_m_idx] = 0.0f; + hOMasa->direction_vector_m[1][block_m_idx][band_m_idx] = 0.0f; + hOMasa->direction_vector_m[2][block_m_idx][band_m_idx] = 0.0f; + } + + set_zero( hOmasaData->energy_ism[block_m_idx], num_freq_bands ); + + for ( ts = mrange[0]; ts < mrange[1]; ts++ ) + { + for ( i = 0; i < nchan_ism; i++ ) + { + cldfbAnalysis_ts( &( data_f[i][l_ts * ts] ), Chnl_RealBuffer[i], Chnl_ImagBuffer[i], l_ts, hOMasa->cldfbAnaEnc[i] ); + } + + /* Compute energy */ + for ( i = 0; i < num_freq_bands; i++ ) + { + brange[0] = hOMasa->band_grouping[i]; + brange[1] = hOMasa->band_grouping[i + 1]; + for ( j = brange[0]; j < brange[1]; j++ ) + { + for ( k = 0; k < nchan_ism; k++ ) + { + hOmasaData->energy_ism[block_m_idx][i] += Chnl_RealBuffer[k][j] * Chnl_RealBuffer[k][j] + Chnl_ImagBuffer[k][j] * Chnl_ImagBuffer[k][j]; + } + } + } + + /* Compute FOA */ + /* W */ + mvr2r( Chnl_RealBuffer[0], Foa_RealBuffer[0], num_freq_bins ); + mvr2r( Chnl_ImagBuffer[0], Foa_ImagBuffer[0], num_freq_bins ); + for ( i = 1; i < nchan_ism; i++ ) + { + v_add( Chnl_RealBuffer[i], Foa_RealBuffer[0], Foa_RealBuffer[0], num_freq_bins ); + v_add( Chnl_ImagBuffer[i], Foa_ImagBuffer[0], Foa_ImagBuffer[0], num_freq_bins ); + } + + /* Y */ + v_multc( Chnl_RealBuffer[0], hOMasa->chnlToFoaMtx[1][0], Foa_RealBuffer[1], num_freq_bins ); + v_multc( Chnl_ImagBuffer[0], hOMasa->chnlToFoaMtx[1][0], Foa_ImagBuffer[1], num_freq_bins ); + for ( i = 1; i < nchan_ism; i++ ) + { + v_multc_acc( Chnl_RealBuffer[i], hOMasa->chnlToFoaMtx[1][i], Foa_RealBuffer[1], num_freq_bins ); + v_multc_acc( Chnl_ImagBuffer[i], hOMasa->chnlToFoaMtx[1][i], Foa_ImagBuffer[1], num_freq_bins ); + } + + /* Z */ + v_multc( Chnl_RealBuffer[0], hOMasa->chnlToFoaMtx[2][0], Foa_RealBuffer[2], num_freq_bins ); + v_multc( Chnl_ImagBuffer[0], hOMasa->chnlToFoaMtx[2][0], Foa_ImagBuffer[2], num_freq_bins ); + for ( i = 1; i < nchan_ism; i++ ) + { + v_multc_acc( Chnl_RealBuffer[i], hOMasa->chnlToFoaMtx[2][i], Foa_RealBuffer[2], num_freq_bins ); + v_multc_acc( Chnl_ImagBuffer[i], hOMasa->chnlToFoaMtx[2][i], Foa_ImagBuffer[2], num_freq_bins ); + } + + /* X */ + v_multc( Chnl_RealBuffer[0], hOMasa->chnlToFoaMtx[3][0], Foa_RealBuffer[3], num_freq_bins ); + v_multc( Chnl_ImagBuffer[0], hOMasa->chnlToFoaMtx[3][0], Foa_ImagBuffer[3], num_freq_bins ); + for ( i = 1; i < nchan_ism; i++ ) + { + v_multc_acc( Chnl_RealBuffer[i], hOMasa->chnlToFoaMtx[3][i], Foa_RealBuffer[3], num_freq_bins ); + v_multc_acc( Chnl_ImagBuffer[i], hOMasa->chnlToFoaMtx[3][i], Foa_ImagBuffer[3], num_freq_bins ); + } + + /* Direction estimation */ + computeIntensityVector_enc( hOMasa->band_grouping, Foa_RealBuffer, Foa_ImagBuffer, num_freq_bands, intensity_real ); + computeDirectionVectors( intensity_real[0], intensity_real[1], intensity_real[2], 0, num_freq_bands, direction_vector[0], direction_vector[1], direction_vector[2] ); + + /* Power estimation for diffuseness */ + computeReferencePower_omasa( hOMasa->band_grouping, Foa_RealBuffer, Foa_ImagBuffer, reference_power[ts], 0, num_freq_bands ); + + /* Fill buffers of length "averaging_length" time slots for intensity and energy */ + hOMasa->index_buffer_intensity = ( hOMasa->index_buffer_intensity % DIRAC_NO_COL_AVG_DIFF ) + 1; /* averaging_length = 32 */ + index = hOMasa->index_buffer_intensity; + for ( i = 0; i < DIRAC_NUM_DIMS; i++ ) + { + /* only real part needed */ + mvr2r( intensity_real[i], &( hOMasa->buffer_intensity_real[i][index - 1][0] ), num_freq_bands ); + } + mvr2r( reference_power[ts], &( hOMasa->buffer_energy[( index - 1 ) * num_freq_bands] ), num_freq_bands ); + + computeDiffuseness( hOMasa->buffer_intensity_real, hOMasa->buffer_energy, num_freq_bands, diffuseness_vector ); + + for ( band_m_idx = 0; band_m_idx < hOMasa->nbands; band_m_idx++ ) + { + norm_tmp = reference_power[ts][band_m_idx] * ( 1 - diffuseness_vector[band_m_idx] ); + + hOMasa->direction_vector_m[0][block_m_idx][band_m_idx] += norm_tmp * direction_vector[0][band_m_idx]; + hOMasa->direction_vector_m[1][block_m_idx][band_m_idx] += norm_tmp * direction_vector[1][band_m_idx]; + hOMasa->direction_vector_m[2][block_m_idx][band_m_idx] += norm_tmp * direction_vector[2][band_m_idx]; + + diffuseness_m[band_m_idx] += reference_power[ts][band_m_idx] * diffuseness_vector[band_m_idx]; + renormalization_factor_diff[band_m_idx] += reference_power[ts][band_m_idx]; + } + } + + for ( band_m_idx = 0; band_m_idx < hOMasa->nbands; band_m_idx++ ) + { + for ( d = 0; d < DIRAC_NUM_DIMS; d++ ) + { + dir_v[d] = hOMasa->direction_vector_m[d][block_m_idx][band_m_idx]; + } + + ivas_qmetadata_direction_vector_to_azimuth_elevation( dir_v, &azimuth_m_values[block_m_idx][band_m_idx], &elevation_m_values[block_m_idx][band_m_idx] ); + } + + /* Set coherences to zero, as this mode is used at lowest bit rates where the coherences are not transmitted */ + for ( band_m_idx = 0; band_m_idx < hOMasa->nbands; band_m_idx++ ) + { + spreadCoherence[block_m_idx][band_m_idx] = 0.0f; + surroundingCoherence[band_m_idx] = 0.0f; + } + } + + /* Determine energy ratios */ + for ( band_m_idx = 0; band_m_idx < hOMasa->nbands; band_m_idx++ ) + { + if ( renormalization_factor_diff[band_m_idx] > EPSILON ) + { + diffuseness_m[band_m_idx] /= renormalization_factor_diff[band_m_idx]; + } + else + { + diffuseness_m[band_m_idx] = 0.0f; + } + + energyRatio[band_m_idx] = 1.0f - diffuseness_m[band_m_idx]; + } + + return; +} + + +/* Estimate energies and ratios */ +static void ivas_omasa_energy_and_ratio_est( + OMASA_ENC_HANDLE hOMasa, + OMASA_ENCODER_DATA_HANDLE hOmasaData, + float *data_f[], + const int16_t input_frame, + const int16_t nchan_ism ) +{ + int16_t ts, i, j, k; + int16_t num_freq_bands; + int16_t l_ts; + float Chnl_RealBuffer[MAX_NUM_OBJECTS][CLDFB_NO_CHANNELS_MAX]; + float Chnl_ImagBuffer[MAX_NUM_OBJECTS][CLDFB_NO_CHANNELS_MAX]; + int16_t block_m_idx; + int16_t mrange[2], brange[2]; + float tftile_energy; + float ism_ratio_sum; + + num_freq_bands = hOMasa->nbands; + l_ts = input_frame / CLDFB_NO_COL_MAX; + + /* do processing over all CLDFB time slots */ + for ( block_m_idx = 0; block_m_idx < hOMasa->nSubframes; block_m_idx++ ) + { + mrange[0] = hOMasa->block_grouping[block_m_idx]; + mrange[1] = hOMasa->block_grouping[block_m_idx + 1]; + + /* Reset variable */ + for ( i = 0; i < hOMasa->nbands; i++ ) + { + set_zero( hOmasaData->energy_ratio_ism[block_m_idx][i], nchan_ism ); + } + set_zero( hOmasaData->energy_ism[block_m_idx], num_freq_bands ); + + /* Compute CLDFB */ + for ( ts = mrange[0]; ts < mrange[1]; ts++ ) + { + for ( i = 0; i < nchan_ism; i++ ) + { + cldfbAnalysis_ts( &( data_f[i][l_ts * ts] ), Chnl_RealBuffer[i], Chnl_ImagBuffer[i], l_ts, hOMasa->cldfbAnaEnc[i] ); + } + + /* Compute energy */ + for ( i = 0; i < num_freq_bands; i++ ) + { + brange[0] = hOMasa->band_grouping[i]; + brange[1] = hOMasa->band_grouping[i + 1]; + for ( j = brange[0]; j < brange[1]; j++ ) + { + for ( k = 0; k < nchan_ism; k++ ) + { + tftile_energy = Chnl_RealBuffer[k][j] * Chnl_RealBuffer[k][j] + Chnl_ImagBuffer[k][j] * Chnl_ImagBuffer[k][j]; + hOmasaData->energy_ism[block_m_idx][i] += tftile_energy; + hOmasaData->energy_ratio_ism[block_m_idx][i][k] += tftile_energy; + } + } + } + } + + /* Compute ISM energy ratios */ + for ( i = 0; i < num_freq_bands; i++ ) + { + ism_ratio_sum = 0.0f; + for ( j = 0; j < nchan_ism; j++ ) + { + hOmasaData->energy_ratio_ism[block_m_idx][i][j] /= ( hOmasaData->energy_ism[block_m_idx][i] + EPSILON ); + ism_ratio_sum += hOmasaData->energy_ratio_ism[block_m_idx][i][j]; + } + + if ( ism_ratio_sum == 0.0f ) + { + float temp_ism_ratio = 1.0f / ( (float) nchan_ism ); + for ( j = 0; j < nchan_ism; j++ ) + { + hOmasaData->energy_ratio_ism[block_m_idx][i][j] = temp_ism_ratio; + } + } + } + } + + return; +} + + +/* Compute downmix */ +static void ivas_omasa_dmx( + float *data_in_f[], + float data_out_f[][L_FRAME48k], + const int16_t input_frame, + const int16_t nchan_transport, + const int16_t nchan_ism, + ISM_METADATA_HANDLE hIsmMeta[], + float prev_gains[][MASA_MAX_TRANSPORT_CHANNELS], + const float interpolator[L_FRAME48k] ) +{ + int16_t i, j, k; + float azimuth, elevation; + float gains[MASA_MAX_TRANSPORT_CHANNELS]; + float g1, g2; + + for ( i = 0; i < nchan_transport; i++ ) + { + set_zero( data_out_f[i], input_frame ); + } + + for ( i = 0; i < nchan_ism; i++ ) + { + azimuth = hIsmMeta[i]->azimuth; + elevation = hIsmMeta[i]->elevation; + + ivas_get_stereo_panning_gains( azimuth, elevation, gains ); + + /* Downmix using the panning gains */ + for ( j = 0; j < nchan_transport; j++ ) + { + if ( fabsf( gains[j] ) > 0.0 || fabsf( prev_gains[i][j] ) > 0.0f ) + { + for ( k = 0; k < input_frame; k++ ) + { + g1 = interpolator[k]; + g2 = 1.0f - g1; + data_out_f[j][k] += ( g1 * gains[j] + g2 * prev_gains[i][j] ) * data_in_f[i][k]; + } + } + prev_gains[i][j] = gains[j]; + } + } + + return; +} + + +static void computeIntensityVector_enc( + const int16_t *band_grouping, + float Cldfb_RealBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], + float Cldfb_ImagBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], + const int16_t num_frequency_bands, + float intensity_real[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS] ) +{ + /* Reminder + * X = a + ib; Y = c + id + * X*Y = ac - bd + i(ad +bc) + */ + int16_t i, j; + float real, img; + int16_t brange[2]; + + for ( i = 0; i < num_frequency_bands; i++ ) + { + brange[0] = band_grouping[i]; + brange[1] = band_grouping[i + 1]; + + intensity_real[0][i] = 0; + intensity_real[1][i] = 0; + intensity_real[2][i] = 0; + + for ( j = brange[0]; j < brange[1]; j++ ) + { + real = Cldfb_RealBuffer[0][j]; + img = Cldfb_ImagBuffer[0][j]; + intensity_real[0][i] += Cldfb_RealBuffer[3][j] * real + Cldfb_ImagBuffer[3][j] * img; /* Intensity is XYZ order, audio is WYZX order. */ + intensity_real[1][i] += Cldfb_RealBuffer[1][j] * real + Cldfb_ImagBuffer[1][j] * img; + intensity_real[2][i] += Cldfb_RealBuffer[2][j] * real + Cldfb_ImagBuffer[2][j] * img; + } + } + + return; +} + + +static void computeReferencePower_omasa( + const int16_t *band_grouping, /* i : Band grouping for estimation */ + float Cldfb_RealBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], /* i : Real part of input signal */ + float Cldfb_ImagBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], /* i : Imag part of input signal */ + float *reference_power, /* o : Estimated power */ + const int16_t enc_param_start_band, /* i : first band to process */ + const int16_t num_freq_bands /* i : Number of frequency bands */ +) +{ + int16_t brange[2]; + int16_t ch_idx, i, j; + + for ( i = 0; i < num_freq_bands; i++ ) + { + brange[0] = band_grouping[i + enc_param_start_band]; + brange[1] = band_grouping[i + enc_param_start_band + 1]; + reference_power[i] = 0; + + for ( ch_idx = 0; ch_idx < FOA_CHANNELS; ch_idx++ ) + { + /* abs()^2 */ + for ( j = brange[0]; j < brange[1]; j++ ) + { + reference_power[i] += ( Cldfb_RealBuffer[ch_idx][j] * Cldfb_RealBuffer[ch_idx][j] ) + ( Cldfb_ImagBuffer[ch_idx][j] * Cldfb_ImagBuffer[ch_idx][j] ); + } + } + } + + v_multc( reference_power, 0.5f, reference_power, num_freq_bands ); + + return; +} diff --git a/lib_enc/ivas_osba_enc.c b/lib_enc/ivas_osba_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..fb360a01000fa8623ea26d131c17a176fbae9c38 --- /dev/null +++ b/lib_enc/ivas_osba_enc.c @@ -0,0 +1,493 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include "options.h" +#include +#include +#include +#include "ivas_cnst.h" +#include "ivas_prot.h" +#include "prot.h" +#include "ivas_rom_com.h" +#include "ivas_rom_enc.h" +#include "wmc_auto.h" + + +/*------------------------------------------------------------------------- + * Local function prototypes + *------------------------------------------------------------------------*/ + +static void ivas_osba_render_ism_to_sba( float *data_in_f[], float data_out_f[][L_FRAME48k], const int16_t input_frame, const int16_t nchan_sba, const int16_t nchan_ism, ISM_METADATA_HANDLE hIsmMeta[], float prev_gains[][MAX_INPUT_CHANNELS], const float interpolator[L_FRAME48k] ); + +/*-------------------------------------------------------------------* + * ivas_merge_sba_transports() + * + * Merge SBA transport channels + *-------------------------------------------------------------------*/ + +static void ivas_merge_sba_transports( + float data_in_f1[][L_FRAME48k], + float *data_in_f2[], + float *data_out_f[], + const int16_t input_frame, + const int16_t sba_analysis_order ) +{ + int16_t i, j, nchan_sba; + + nchan_sba = ( sba_analysis_order + 1 ) * ( sba_analysis_order + 1 ); + + for ( i = 0; i < nchan_sba; i++ ) + { + for ( j = 0; j < input_frame; j++ ) + { + data_out_f[i][j] = data_in_f1[i][j] + data_in_f2[i][j]; + } + } + + return; +} + +/*--------------------------------------------------------------------------* + * ivas_osba_enc_open() + * + * Allocate and initialize OMASA handle + *--------------------------------------------------------------------------*/ + +ivas_error ivas_osba_enc_open( + Encoder_Struct *st_ivas /* i/o: IVAS encoder handle */ +) +{ + int16_t i; + OSBA_ENC_HANDLE hOSba; + int16_t input_frame; + ivas_error error; + int16_t len; + error = IVAS_ERR_OK; + + + if ( ( hOSba = (OSBA_ENC_HANDLE) malloc( sizeof( OSBA_ENC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for OMASA encoder\n" ) ); + } + + for ( i = 0; i < MAX_NUM_OBJECTS; i++ ) + { +#ifdef NONBE_FIX_819_DOUBLE_PREC_COMB_FORMATS + set_f( hOSba->prev_object_dm_gains[i], INV_SQRT_2, MAX_INPUT_CHANNELS ); +#else + set_f( hOSba->prev_object_dm_gains[i], (float) sqrt( 0.5 ), MAX_INPUT_CHANNELS ); +#endif + } + + len = NS2SA( st_ivas->hEncoderConfig->input_Fs, IVAS_FB_ENC_DELAY_NS ); + + for ( i = 0; i < st_ivas->hEncoderConfig->nchan_ism; i++ ) + { + if ( ( hOSba->input_data_mem[i] = (float *) malloc( len * sizeof( float ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for OSBA input buffers" ); + } + set_f( hOSba->input_data_mem[i], 0.0f, len ); + } + + for ( ; i < MAX_NUM_OBJECTS; i++ ) + { + hOSba->input_data_mem[i] = NULL; + } + + input_frame = (int16_t) ( st_ivas->hEncoderConfig->input_Fs / FRAMES_PER_SEC ); + for ( i = 0; i < input_frame; i++ ) + { + hOSba->interpolator[i] = ( (float) i ) / ( (float) input_frame ); + } + + st_ivas->hOSba = hOSba; + + return error; +} + + +/*--------------------------------------------------------------------------* + * ivas_omasa_enc_close() + * + * Close OMASA handle + *--------------------------------------------------------------------------*/ + +void ivas_osba_enc_close( + OSBA_ENC_HANDLE *hOSba /* i/o: encoder OSBA handle */ +) +{ + if ( hOSba == NULL || *hOSba == NULL ) + { + return; + } + + for ( int16_t n = 0; n < MAX_NUM_OBJECTS; n++ ) + { + if ( ( *hOSba )->input_data_mem[n] != NULL ) + { + free( ( *hOSba )->input_data_mem[n] ); + ( *hOSba )->input_data_mem[n] = NULL; + } + } + + free( *hOSba ); + ( *hOSba ) = NULL; + + return; +} + + +/*--------------------------------------------------------------------------* + * ivas_osba_enc_reconfig() + * + * oSBA encoder reconfiguration + *--------------------------------------------------------------------------*/ + +ivas_error ivas_osba_enc_reconfig( + Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ +) +{ + + int16_t n, nSCE_old, nCPE_old, nchan_transport_old; + ISM_MODE old_ism_mode; + int32_t ivas_total_brate; + ivas_error error; + ENCODER_CONFIG_HANDLE hEncoderConfig; + + error = IVAS_ERR_OK; + hEncoderConfig = st_ivas->hEncoderConfig; + ivas_total_brate = hEncoderConfig->ivas_total_brate; + + if ( ivas_total_brate != hEncoderConfig->last_ivas_total_brate ) + { + DIRAC_ENC_HANDLE hDirAC = st_ivas->hDirAC; + SPAR_ENC_HANDLE hSpar; + int16_t analysis_order_old; + int16_t spar_reconfig_flag; + int16_t nbands_old; + int16_t ndir_old; + + spar_reconfig_flag = 0; + old_ism_mode = st_ivas->ism_mode; + if ( ivas_total_brate >= IVAS_256k ) + { + st_ivas->ism_mode = ISM_SBA_MODE_DISC; + } + else + { + st_ivas->ism_mode = ISM_MODE_NONE; + } + nchan_transport_old = st_ivas->nchan_transport; + nCPE_old = st_ivas->nCPE; + nSCE_old = st_ivas->nSCE; + st_ivas->sba_analysis_order = ivas_sba_get_analysis_order( ivas_total_brate, hEncoderConfig->sba_order ); + analysis_order_old = ivas_sba_get_analysis_order( hEncoderConfig->last_ivas_total_brate, hEncoderConfig->sba_order ); + nbands_old = st_ivas->hQMetaData->q_direction->cfg.nbands; + ndir_old = st_ivas->hQMetaData->no_directions; + + if ( ( analysis_order_old != st_ivas->sba_analysis_order ) || ( old_ism_mode != st_ivas->ism_mode ) ) + { + int16_t i, n_old; + float **old_mem_hp20_in; + + n_old = st_ivas->hEncoderConfig->nchan_ism + ( analysis_order_old + 1 ) * ( analysis_order_old + 1 ); + n = st_ivas->hEncoderConfig->nchan_ism + ( st_ivas->sba_analysis_order + 1 ) * ( st_ivas->sba_analysis_order + 1 ); + + if ( n > n_old ) + { + /* save old mem_hp_20 pointer */ + old_mem_hp20_in = st_ivas->mem_hp20_in; + st_ivas->mem_hp20_in = NULL; + + if ( ( st_ivas->mem_hp20_in = (float **) malloc( n * sizeof( float * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HP20 filter memory\n" ) ); + } + + for ( i = 0; i < n_old; i++ ) + { + st_ivas->mem_hp20_in[i] = old_mem_hp20_in[i]; + old_mem_hp20_in[i] = NULL; + } + /* create additional hp20 memories */ + for ( ; i < n; i++ ) + { + if ( ( st_ivas->mem_hp20_in[i] = (float *) malloc( L_HP20_MEM * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HP20 filter memory\n" ) ); + } + + set_f( st_ivas->mem_hp20_in[i], 0.0f, L_HP20_MEM ); + } + + free( old_mem_hp20_in ); + old_mem_hp20_in = NULL; + } + else if ( n < n_old ) + { + /* save old mem_hp_20 pointer */ + old_mem_hp20_in = st_ivas->mem_hp20_in; + st_ivas->mem_hp20_in = NULL; + + if ( ( st_ivas->mem_hp20_in = (float **) malloc( n * sizeof( float * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HP20 filter memory\n" ) ); + } + + for ( i = 0; i < n; i++ ) + { + st_ivas->mem_hp20_in[i] = old_mem_hp20_in[i]; + old_mem_hp20_in[i] = NULL; + } + /* remove superfluous hp20 memories */ + for ( ; i < n_old; i++ ) + { + free( old_mem_hp20_in[i] ); + old_mem_hp20_in[i] = NULL; + } + + free( old_mem_hp20_in ); + old_mem_hp20_in = NULL; + } + } + + ivas_spar_config( ivas_total_brate, min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ), &st_ivas->nchan_transport, &st_ivas->nSCE, &st_ivas->nCPE, &st_ivas->hSpar->core_nominal_brate, -1 ); + + hSpar = st_ivas->hSpar; + + if ( st_ivas->nchan_transport == 1 ) + { + hEncoderConfig->element_mode_init = IVAS_SCE; + } + else + { + hEncoderConfig->element_mode_init = IVAS_CPE_MDCT; + } + if ( nchan_transport_old != st_ivas->nchan_transport || ( ivas_total_brate < IVAS_512k && hEncoderConfig->last_ivas_total_brate >= IVAS_512k ) || ( ivas_total_brate >= IVAS_512k && hEncoderConfig->last_ivas_total_brate < IVAS_512k ) ) + { + /* FB mixer handle */ + if ( hDirAC->hFbMixer != NULL ) + { + ivas_FB_mixer_close( &( hDirAC->hFbMixer ), hEncoderConfig->input_Fs, 0 ); + hDirAC->hFbMixer = NULL; + } + spar_reconfig_flag = 1; + ivas_spar_enc_close( &( st_ivas->hSpar ), hEncoderConfig->input_Fs, hEncoderConfig->nchan_inp, spar_reconfig_flag ); + + if ( ( error = ivas_spar_enc_open( st_ivas, spar_reconfig_flag ) ) != IVAS_ERR_OK ) + { + return error; + } + } + st_ivas->hSpar->spar_reconfig_flag = spar_reconfig_flag; + if ( ( error = ivas_dirac_enc_reconfigure( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + if ( st_ivas->hQMetaData->q_direction->cfg.nbands != nbands_old || st_ivas->hQMetaData->no_directions != ndir_old ) + { + int16_t dir, j, i; + IVAS_QDIRECTION *q_direction = st_ivas->hQMetaData->q_direction; + for ( dir = 0; dir < st_ivas->hQMetaData->no_directions; dir++ ) + { + for ( j = 0; j < q_direction[dir].cfg.nbands; j++ ) + { + for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + { + q_direction[dir].band_data[j].energy_ratio_index[i] = 0; + q_direction[dir].band_data[j].energy_ratio_index_mod[i] = 0; + } + } + } + } + hSpar->enc_param_start_band = hDirAC->hConfig->enc_param_start_band; + + /*-----------------------------------------------------------------* + * Allocate, initialize, and configure SCE/CPE/MCT handles + *-----------------------------------------------------------------*/ + + if ( old_ism_mode == ISM_MODE_NONE && st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + { + st_ivas->nCPE += ( st_ivas->hEncoderConfig->nchan_ism + 1 ) >> 1; + } + else if ( old_ism_mode == ISM_SBA_MODE_DISC && st_ivas->ism_mode == ISM_MODE_NONE ) + { + nchan_transport_old += st_ivas->hEncoderConfig->nchan_ism; + } + else if ( st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + { + st_ivas->nCPE += ( st_ivas->hEncoderConfig->nchan_ism + 1 ) >> 1; + nCPE_old = st_ivas->nCPE; + nchan_transport_old = st_ivas->nchan_transport; + nchan_transport_old += st_ivas->hEncoderConfig->nchan_ism; + } + + if ( ( error = ivas_corecoder_enc_reconfig( st_ivas, nSCE_old, nCPE_old, nchan_transport_old, ivas_total_brate / st_ivas->nchan_transport, ( ivas_total_brate / st_ivas->nchan_transport ) * CPE_CHANNELS, MC_MODE_NONE ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + return error; +} + + +/*--------------------------------------------------------------------------* + * ivas_osba_enc() + * + * Main OSBA encoding function + *--------------------------------------------------------------------------*/ + +void ivas_osba_enc( + OSBA_ENC_HANDLE hOSba, /* i/o: OSBA encoder handle */ + ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handle */ + float *data_in_f[], /* i/o: Input / transport audio signals */ + const int16_t input_frame, /* i : Input frame size */ + const int16_t nchan_ism, /* i : Number of objects for parameter analysis */ + const ISM_MODE ism_mode, /* i : ISM mode */ + const int16_t sba_analysis_order, /* i : SBA order evaluated in DirAC/SPAR encoder */ + const int32_t input_Fs, /* i : input sampling rate */ + const int16_t sba_planar /* i : planar SBA flag */ +) +{ + float data_out_f[MAX_INPUT_CHANNELS][L_FRAME48k]; + int16_t n, delay_s; + delay_s = NS2SA( input_Fs, IVAS_FB_ENC_DELAY_NS ); + + if ( ism_mode == ISM_MODE_NONE ) + { + /*keep the delay buffer up to date*/ + for ( n = 0; n < nchan_ism; n++ ) + { + mvr2r( &data_in_f[n][input_frame - delay_s], hOSba->input_data_mem[n], delay_s ); + } + + /* Convert ISM to SBA */ + ivas_osba_render_ism_to_sba( data_in_f, data_out_f, input_frame, sba_analysis_order, nchan_ism, hIsmMeta, hOSba->prev_object_dm_gains, hOSba->interpolator ); + + if ( sba_planar ) + { + ivas_sba_zero_vert_comp( &( data_in_f[nchan_ism] ), sba_analysis_order, sba_planar, input_frame ); + } + + /* Merge SBA signals */ + ivas_merge_sba_transports( data_out_f, &( data_in_f[nchan_ism] ), data_in_f, input_frame, sba_analysis_order ); + } + else + { + int16_t azimuth, elevation; + /* delay ISM input channels to match the SBA encoder delay */ + for ( n = 0; n < nchan_ism; n++ ) + { + delay_signal( data_in_f[n], input_frame, hOSba->input_data_mem[n], delay_s ); + + + /*keep prev gain upto date for bitrate switching*/ + azimuth = (int16_t) floorf( hIsmMeta[n]->azimuth + 0.5f ); + elevation = (int16_t) floorf( hIsmMeta[n]->elevation + 0.5f ); + ivas_dirac_dec_get_response( azimuth, elevation, hOSba->prev_object_dm_gains[n], sba_analysis_order ); + } + } + + /* Set the number of objects */ + hOSba->nchan_ism = nchan_ism; + + return; +} + + +/*--------------------------------------------------------------------------* + * Local functions + *--------------------------------------------------------------------------*/ + +/* Render ISMs to SBA */ +static void ivas_osba_render_ism_to_sba( + float *data_in_f[], + float data_out_f[][L_FRAME48k], + const int16_t input_frame, + const int16_t sba_analysis_order, + const int16_t nchan_ism, + ISM_METADATA_HANDLE hIsmMeta[], + float prev_gains[][MAX_INPUT_CHANNELS], + const float interpolator[L_FRAME48k] ) +{ + int16_t i, j, k; + int16_t azimuth, elevation; + float gains[MAX_INPUT_CHANNELS]; + float g1, g2; + float output_gain; + + int16_t nchan_sba; + + nchan_sba = ( sba_analysis_order + 1 ) * ( sba_analysis_order + 1 ); + + for ( i = 0; i < nchan_sba; i++ ) + { + set_zero( data_out_f[i], input_frame ); + } + + for ( i = 0; i < nchan_ism; i++ ) + { + azimuth = (int16_t) floorf( hIsmMeta[i]->azimuth + 0.5f ); + elevation = (int16_t) floorf( hIsmMeta[i]->elevation + 0.5f ); + + ivas_dirac_dec_get_response( azimuth, elevation, gains, sba_analysis_order ); + + /* Render using the sh gains */ + for ( j = 0; j < nchan_sba; j++ ) + { + if ( fabsf( gains[j] ) > 0.0 || fabsf( prev_gains[i][j] ) > 0.0f ) + { + for ( k = 0; k < input_frame; k++ ) + { + g1 = interpolator[k]; + g2 = 1.0f - g1; + data_out_f[j][k] += ( g1 * gains[j] + g2 * prev_gains[i][j] ) * data_in_f[i][k]; + } + } + prev_gains[i][j] = gains[j]; + } + } + + /* Gain with loudness-matching gains */ + output_gain = 0.7499f; + for ( j = 0; j < nchan_sba; j++ ) + { + for ( k = 0; k < input_frame; k++ ) + { + data_out_f[j][k] *= output_gain; + } + } + + return; +} diff --git a/lib_enc/ivas_pca_enc.c b/lib_enc/ivas_pca_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..c3cdd6b2de9acfda53ba63bb02ffc07f249cce98 --- /dev/null +++ b/lib_enc/ivas_pca_enc.c @@ -0,0 +1,595 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_cnst.h" +#include +#include +#include "wmc_auto.h" + + +/*-----------------------------------------------------------------------* + * Local constants + *-----------------------------------------------------------------------*/ + +#define IVAS_PCA_SM_FAC 0.0234375f +#define IVAS_PCA_N_ITER_QR 10 + + +/*-----------------------------------------------------------------------* + * Local function definitions + *-----------------------------------------------------------------------*/ + +static void ivas_bitstream_write_int32( + BSTR_ENC_HANDLE hMetaData, + const int32_t val, + const int16_t bits ) +{ + /* MSBs */ + push_next_indice( hMetaData, (uint16_t) ( val >> 16 ), bits - 16 ); + + /* LSBs */ + push_next_indice( hMetaData, (uint16_t) ( val & 0x0000FFFF ), 16 ); + + return; +} + + +static void pca_enc_reset( + PCA_ENC_STATE *hPCA ) +{ + int16_t i; + + /* reset states for interpolation and multiplexing */ + eye_matrix( hPCA->prev_eigVec, FOA_CHANNELS, 1.0f ); + set_zero( hPCA->prev_ql, IVAS_PCA_INTERP ); + hPCA->prev_ql[0] = 1.0f; + set_zero( hPCA->prev_qr, IVAS_PCA_INTERP ); + hPCA->prev_qr[0] = 1.0f; + + for ( i = 0; i < FOA_CHANNELS; i++ ) + { + hPCA->prev_D[i] = 0.25f; + } + + eye_matrix( hPCA->mem_eigVec_interp, FOA_CHANNELS, 1.0f ); + set_zero( hPCA->old_r_sm, FOA_CHANNELS * FOA_CHANNELS ); + + return; +} + + +static void pca_transform_sub( + float *eigVec, + float *transformed_data[8], /* i : input/transformed audio channels */ + const int16_t start, + const int16_t len, + const int16_t n_channels ) +{ + int16_t i, j, k; + float temp; + float buffer_data[FOA_CHANNELS]; + for ( j = 0; j < len; j++ ) + { + for ( k = 0; k < n_channels; k++ ) + { + buffer_data[k] = transformed_data[k][j + start]; + } + for ( k = 0; k < n_channels; k++ ) + { + temp = 0.0f; + for ( i = 0; i < n_channels; i++ ) + { + temp += eigVec[i * IVAS_PCA_INTERP + k] * buffer_data[i]; + } + transformed_data[k][j + start] = temp; + } + } + + return; +} + +static void pca_enc_transform( + PCA_ENC_STATE *hPCA, + float *ql, + float *qr, + float *transformed_data[8], /* i : input/transformed audio channels */ + const int16_t input_frame, + const int16_t n_channels ) +{ + float eigVec_interp[FOA_CHANNELS * FOA_CHANNELS]; /* eigenvectors in current frame */ + float ql_interp[IVAS_PCA_LEN_INTERP_Q], qr_interp[IVAS_PCA_LEN_INTERP_Q]; + int16_t time_slot; + int16_t slot_len; + + quat_shortestpath( hPCA->prev_ql, ql, hPCA->prev_qr, qr ); + + pca_interp_preproc( hPCA->prev_ql, hPCA->prev_qr, ql, qr, IVAS_PCA_N_SLOTS, ql_interp, qr_interp ); + + slot_len = (int16_t) ( input_frame / IVAS_PCA_N_SLOTS ); + + for ( time_slot = 0; time_slot < IVAS_PCA_N_SLOTS; time_slot++ ) + { + /* convert from double quaternion to 4D matrix */ + dquat2mat( &ql_interp[IVAS_PCA_INTERP * time_slot], &qr_interp[IVAS_PCA_INTERP * time_slot], eigVec_interp ); + pca_transform_sub( eigVec_interp, transformed_data, slot_len * time_slot, slot_len, n_channels ); + } + + return; +} + + +static void pca_update_state( + PCA_ENC_STATE *hPCA, + float *ql, + float *qr, + float *eigVec, + const int16_t n_channels ) +{ + mvr2r( qr, hPCA->prev_qr, IVAS_PCA_INTERP ); + mvr2r( ql, hPCA->prev_ql, IVAS_PCA_INTERP ); + mvr2r( eigVec, hPCA->prev_eigVec, n_channels * n_channels ); + + return; +} + + +static void swap_eigvec( + float *eigVec, + const int16_t i, + const int16_t j ) +{ + float eigVec_tmp[FOA_CHANNELS]; + int16_t k; + + for ( k = 0; k < FOA_CHANNELS; k++ ) + { + eigVec_tmp[k] = eigVec[k * FOA_CHANNELS + i]; + } + for ( k = 0; k < FOA_CHANNELS; k++ ) + { + eigVec[k * FOA_CHANNELS + i] = eigVec[k * FOA_CHANNELS + j]; + } + for ( k = 0; k < FOA_CHANNELS; k++ ) + { + eigVec[k * FOA_CHANNELS + j] = eigVec_tmp[k]; + } + + return; +} + + +static void sort4_D_eigVec( + float *D, + float *eigVec ) +{ + float tempr; + + if ( D[0] < D[1] ) + { + SWAP( D[0], D[1] ); + swap_eigvec( eigVec, 0, 1 ); + } + + if ( D[2] < D[3] ) + { + SWAP( D[2], D[3] ); + swap_eigvec( eigVec, 2, 3 ); + } + + if ( D[0] < D[2] ) + { + SWAP( D[0], D[2] ); + swap_eigvec( eigVec, 0, 2 ); + } + + if ( D[1] < D[3] ) + { + SWAP( D[1], D[3] ); + swap_eigvec( eigVec, 1, 3 ); + } + + if ( D[1] < D[2] ) + { + SWAP( D[1], D[2] ); + swap_eigvec( eigVec, 1, 2 ); + } + + /* swap last 2 values */ + SWAP( D[2], D[3] ); + swap_eigvec( eigVec, 2, 3 ); + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_pca_enc_init() + * + * Initialize PCA encoder + *------------------------------------------------------------------------*/ + +void ivas_pca_enc_init( + PCA_ENC_STATE *hPCA /* i/o: PCA encoder structure */ +) +{ + hPCA->prev_bypass_decision = PCA_MODE_INACTIVE; + pca_enc_reset( hPCA ); + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_pca_enc() + * + * PCA encoder + *------------------------------------------------------------------------*/ + +void ivas_pca_enc( + const ENCODER_CONFIG_HANDLE hEncoderConfig, /* i : configuration structure */ + PCA_ENC_STATE *hPCA, /* i : PCA encoder structure */ + BSTR_ENC_HANDLE hMetaData, /* i/o: MetaData handle */ + float *data_f[8], /* i : input/transformed audio channels */ + const int16_t input_frame, /* i : input frame length */ + const int16_t n_channels /* i : number of channels */ +) +{ + int16_t i, j, k, l; + int16_t len_subfr; + float r[FOA_CHANNELS * FOA_CHANNELS]; /* covariance matrix */ + float eigVec[FOA_CHANNELS * FOA_CHANNELS]; /* eigenvectors in current frame */ + float eigVec_tmp[FOA_CHANNELS * FOA_CHANNELS]; /* transpose / tmp matrix for permutation */ + float cost_mtx[FOA_CHANNELS * FOA_CHANNELS]; /* cost matrix */ + int16_t path[FOA_CHANNELS]; + float D[FOA_CHANNELS]; /* eigenvalues in current frame */ + float ql[IVAS_PCA_INTERP], qr[IVAS_PCA_INTERP]; + float det; + float temp; + float *ptr_sig[FOA_CHANNELS]; + int32_t index[2]; + float fac_D, sum_D; + float fac_cost; + float r_sm[16]; + float alpha; + float D_tmp[FOA_CHANNELS]; + int32_t ivas_total_brate; + float min_dot, dotl, dotr; + float min_dot2; + int16_t bypass_decision; + float dist_alt; + + ivas_total_brate = hEncoderConfig->ivas_total_brate; + + /* if PCA is disabled, just pass-through */ + if ( hEncoderConfig->Opt_PCA_ON == 0 ) + { + /* write by-pass indicator */ + push_next_indice( hMetaData, PCA_MODE_INACTIVE, 1 ); + + return; + } + + /* handle bitrate switching */ + if ( ivas_total_brate != PCA_BRATE ) + { + pca_enc_reset( hPCA ); + + if ( hEncoderConfig->last_ivas_total_brate != PCA_BRATE ) + { + eye_matrix( hPCA->mem_eigVec_interp, FOA_CHANNELS, 1.0f ); + /* copy input data into output directly as previous frame was already in by-pass mode */ + for ( k = 0; k < n_channels; k++ ) + { + // ToDo: TBV + } + } + else + { + /* set PCA by-pass mode in current frame and interpolate transform as previous frame used PCA */ + pca_enc_transform( hPCA, ql, qr, data_f, input_frame, n_channels ); + } + + pca_update_state( hPCA, ql, qr, eigVec, n_channels ); + + hPCA->prev_bypass_decision = PCA_MODE_INACTIVE; + + return; + } + + /*-----------------------------------------------------------------* + * Covariance + *-----------------------------------------------------------------*/ + + len_subfr = input_frame / 2; + + for ( i = 0; i < input_frame; i += len_subfr ) + { + for ( k = 0; k < FOA_CHANNELS; k++ ) + { + ptr_sig[k] = &data_f[k][i]; + } + + cov_subfr( ptr_sig, r, n_channels, input_frame / 2 ); + + alpha = IVAS_PCA_SM_FAC; + for ( k = 0; k < 16; k++ ) + { + r_sm[k] = alpha * r[k] + ( 1.f - alpha ) * hPCA->old_r_sm[k]; + hPCA->old_r_sm[k] = r_sm[k]; + } + } + + /* conditioning */ + for ( k = 0; k < FOA_CHANNELS; k++ ) + { + temp = r_sm[k * FOA_CHANNELS + k]; + + + if ( temp < IVAS_PCA_COV_THRES ) + { + temp = IVAS_PCA_COV_THRES; + } + r_sm[k * FOA_CHANNELS + k] = temp; /* pointer reuse */ + } + + /*-----------------------------------------------------------------* + * Eigenvalue decomposition + *-----------------------------------------------------------------*/ + + eig_qr( r_sm, IVAS_PCA_N_ITER_QR, eigVec, D, n_channels ); + + /* force positive eigenvalues */ + sum_D = 0.0; + for ( k = 0; k < n_channels; k++ ) + { + if ( D[k] < 0.f ) + { + D[k] = -D[k]; + + for ( l = 0; l < n_channels; l++ ) + { + eigVec[l * n_channels + k] = -eigVec[l * n_channels + k]; + } + } + sum_D += D[k]; + } + + /* normalize */ + fac_D = 1 / sum_D; + for ( k = 0; k < n_channels; k++ ) + { + D[k] *= fac_D; + } + + /* sorting (sanity check) with SPAR inversion of last two channels */ + sort4_D_eigVec( D, eigVec ); + + /* normalize and compute amount of decorrelation */ + dist_alt = 0.0; + for ( k = 0; k < FOA_CHANNELS; k++ ) + { + dist_alt += logf( r[k * FOA_CHANNELS + k] * fac_D + 1e-8f ); + dist_alt -= logf( D[k] + 1e-8f ); + } + + /*-----------------------------------------------------------------* + * Eigenvector alignment + *-----------------------------------------------------------------*/ + + if ( hPCA->prev_bypass_decision == PCA_MODE_ACTIVE ) + { + /* compute absolute cost matrix */ + for ( k = 0; k < n_channels; k++ ) /* column */ + { + for ( l = 0; l < n_channels; l++ ) /* row */ + { + fac_cost = hPCA->prev_D[l] * D[k]; + temp = 0.0; + for ( i = 0; i < n_channels; i++ ) /* row */ + { + temp += hPCA->prev_eigVec[i * n_channels + l] * eigVec[i * n_channels + k]; + } + if ( temp < 0 ) + { + temp = -temp; + } + cost_mtx[k * n_channels + l] = temp * fac_cost; + } + } + + /* find optimal permutation */ + exhst_4x4( cost_mtx, path, 1 ); + } + else + { + /* no alignment needed if previous PCA is inactive */ + for ( i = 0; i < 4; i++ ) + { + path[i] = i; + } + } + + /* permute eigenvectors */ + for ( k = 0; k < n_channels; k++ ) + { + j = path[k]; + /* copy j-th column to column k */ + for ( l = 0; l < n_channels; l++ ) + { + eigVec_tmp[l * n_channels + k] = eigVec[l * n_channels + j]; + } + D_tmp[k] = D[j]; + } + + for ( k = 0; k < n_channels * n_channels; k++ ) + { + eigVec[k] = eigVec_tmp[k]; + } + + /* check for sign inversions */ + for ( k = 0; k < n_channels; k++ ) /* column */ + { + temp = 0.0; + for ( i = 0; i < n_channels; i++ ) /* row */ + { + temp += hPCA->prev_eigVec[i * n_channels + k] * eigVec[i * n_channels + k]; + } + + if ( temp < 0 ) + { + for ( i = 0; i < n_channels; i++ ) + { + eigVec[i * n_channels + k] = -eigVec[i * n_channels + k]; + } + } + } + + /* force rotation matrix(det = +1) */ + det = mat_det4( eigVec ); + if ( det < 0 ) + { + swap_eigvec( eigVec, 2, 3 ); + temp = D_tmp[3]; + D_tmp[3] = D_tmp[2]; + D_tmp[2] = temp; + } + + /* update state */ + for ( k = 0; k < n_channels; k++ ) + { + hPCA->prev_D[k] = D_tmp[k]; + } + + /*-----------------------------------------------------------------* + * Rotation matrix parametrization and quantization + *-----------------------------------------------------------------*/ + + /* convert frrm rotation matrix to double quaternion */ + mat2dquat( eigVec, ql, qr ); + + dotl = dotp( hPCA->prev_ql, ql, 4 ); + dotr = dotp( hPCA->prev_qr, qr, 4 ); + if ( dotl < dotr ) + { + min_dot = dotl; + } + else + { + min_dot = dotr; + } + + if ( ql[0] < qr[0] ) + { + min_dot2 = ql[0]; + } + else + { + min_dot2 = qr[0]; + } + + bypass_decision = PCA_MODE_ACTIVE; + if ( dist_alt < IVAS_PCA_THRES_DIST_ALT ) + { + bypass_decision = PCA_MODE_INACTIVE; + } + if ( min_dot < IVAS_PCA_THRES_MIN_DOT ) + { + bypass_decision = PCA_MODE_INACTIVE; + } + if ( min_dot2 < IVAS_PCA_THRES_MIN_DOT2 ) + { + bypass_decision = PCA_MODE_INACTIVE; + } + + /* if PCA is inactive */ + if ( bypass_decision == PCA_MODE_INACTIVE ) + { + eye_matrix( eigVec, 4, 1. ); + set_zero( ql, 4 ); + set_zero( qr, 4 ); + ql[0] = 1.; + qr[0] = 1.; + + /* write by-pass indicator */ + push_next_indice( hMetaData, PCA_MODE_INACTIVE, 1 ); + if ( hPCA->prev_bypass_decision == PCA_MODE_INACTIVE ) + { + eye_matrix( hPCA->mem_eigVec_interp, FOA_CHANNELS, 1.0f ); + } + else + { + /* set PCA by-pass mode in current frame and interpolate transform as previous frame used PCA */ + pca_enc_transform( hPCA, ql, qr, data_f, input_frame, n_channels ); + } + + pca_update_state( hPCA, ql, qr, eigVec, n_channels ); + hPCA->prev_bypass_decision = PCA_MODE_INACTIVE; + + return; + } + + /* force ql to have first component with positive sign */ + if ( ql[0] < 0 ) + { + for ( i = 0; i < 4; i++ ) + { + ql[i] = -ql[i]; + qr[i] = -qr[i]; + } + } + + /* quantize double quaternion */ + pca_enc_s3( ql, &index[0] ); + pca_enc_s3( qr, &index[1] ); + + /* write bypass flag to bitstream to indicate active mode */ + push_next_indice( hMetaData, PCA_MODE_ACTIVE, 1 ); + + ivas_bitstream_write_int32( hMetaData, index[0], IVAS_PCA_QBITS - 1 ); + ivas_bitstream_write_int32( hMetaData, index[1], IVAS_PCA_QBITS ); + + /* transform */ + pca_enc_transform( hPCA, ql, qr, data_f, input_frame, n_channels ); + + /*-----------------------------------------------------------------* + * update state for next frame + *-----------------------------------------------------------------*/ + + hPCA->prev_bypass_decision = bypass_decision; + pca_update_state( hPCA, ql, qr, eigVec, n_channels ); + + return; +} diff --git a/lib_enc/ivas_qmetadata_enc.c b/lib_enc/ivas_qmetadata_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..ece5a286ab8e0038ce415a43e51516e1ee64958c --- /dev/null +++ b/lib_enc/ivas_qmetadata_enc.c @@ -0,0 +1,5828 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include "options.h" +#include +#include "ivas_cnst.h" +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_rom_com.h" +#include "ivas_stat_enc.h" +#include "wmc_auto.h" +#include "prot.h" + + +/*-----------------------------------------------------------------------* + * Local function prototypes + *-----------------------------------------------------------------------*/ + + +static void ivas_qmetadata_quantize_diffuseness_nrg_ratios( IVAS_QMETADATA_HANDLE hQMetaData, int16_t *needed_bits, int16_t *nbits_diff, int16_t *dfRatioBits, const int16_t hodirac_flag ); + +static int16_t ivas_qmetadata_entropy_encode_diffuseness( BSTR_ENC_HANDLE hMetaData, IVAS_QDIRECTION *q_direction, uint16_t *diffuseness_index_max_ec_frame ); + +static void ivas_qmetadata_reorder_2dir_bands( IVAS_QMETADATA_HANDLE hQMetaData ); + +static int16_t ivas_qmetadata_entropy_encode_df_ratio( BSTR_ENC_HANDLE hMetaData, IVAS_QDIRECTION *q_direction, int16_t *df_ratio_bits ); + +static int16_t ivas_qmetadata_entropy_encode_dir( BSTR_ENC_HANDLE hMetaData, IVAS_QDIRECTION *q_direction, const uint16_t diffuseness_index_max_ec_frame, const int16_t nbands, const int16_t start_band, const int16_t direction_bits_raw, int16_t max_bits, const int16_t hrmasa_flag ); + +static int16_t ivas_qmetadata_raw_encode_dir( BSTR_ENC_HANDLE hMetaData, IVAS_QDIRECTION *q_direction, const int16_t nbands, const int16_t start_band ); + +int16_t ivas_qmetadata_encode_extended_gr_length( const uint16_t value, const uint16_t alphabet_size, const int16_t gr_param ); + +static int16_t ivas_qmetadata_get_optimal_gr_param( uint16_t *unsigned_data, const int16_t count, const int16_t gr_param_count, int16_t *opt_gr_size ); + +static int16_t ivas_qmetadata_encode_quasi_uniform_length( const uint16_t value, const uint16_t alphabet_size ); + +static void ivas_qmetadata_encode_quasi_uniform( BSTR_ENC_HANDLE hMetaData, const uint16_t value, const uint16_t alphabet_size ); + +static int16_t ivas_qmetadata_reorder_elevation_index( const int16_t elevation_index, const int16_t avg_elevation_index, const int16_t elevation_alphabet ); + +static int16_t ivas_qmetadata_reorder_azimuth_index( const int16_t azimuth_index, const int16_t avg_azimuth_index, const int16_t azimuth_alphabet ); + +static ivas_error requantize_direction_EC_3( int16_t *extra_bits, IVAS_QDIRECTION *q_direction, const int16_t coding_subbands, BSTR_ENC_HANDLE hMetaData, float elevation_orig[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES], float azimuth_orig[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES], int16_t *ind_order ); + +static void calculate_two_distances( float *el, int16_t *bits, const int16_t total_bits, const int16_t len, float *p_d1, float *p_d2 ); + +static void joint_encoding( IVAS_QDIRECTION *q_direction, const int16_t j, const int16_t next_j, const int16_t coding_subbands, int16_t *bits_dir0, const int16_t allowed_bits, BSTR_ENC_HANDLE hMetaData, int16_t *diff ); + +static ivas_error write_ec_direction( int16_t *num_bits_written, BSTR_ENC_HANDLE hMetaData, IVAS_QDIRECTION *q_direction, const int16_t j_idx, const int16_t len, const int16_t GR_ord_elevation, const int16_t GR_ord_azimuth, const int16_t use_context, const int16_t same ); + +static int16_t write_fixed_rate_direction( BSTR_ENC_HANDLE hMetaData, IVAS_QDIRECTION *q_direction, const int16_t j_idx, const int16_t len ); + +static int16_t ivas_qmetadata_quantize_coherence( IVAS_QMETADATA *hQMetaData, const int16_t idx_d, const int16_t all_coherence_zero, BSTR_ENC_HANDLE hMetaData, const int16_t write_flag, int16_t *indice_coherence, const int16_t hrmasa_flag ); + +static void dct4_transform( uint8_t *v, float *dct_v ); + +static float quantize_DCT_0_coh( const float x, const int16_t j, const float *coherence_cb, const float delta_var, const int16_t no_cb, IVAS_QDIRECTION *q_direction, uint16_t *idx_x, int16_t *p_no_cb, const int16_t hrmasa_flag ); + +static int16_t encode_coherence_indexesDCT0( uint16_t *idx_dct, const int16_t len, int16_t *no_cb_vec, BSTR_ENC_HANDLE hMetaData, const int16_t indice_coherence, const int16_t nbits, const int16_t nbits1 ); + +static int16_t encode_coherence_indexesDCT1( uint16_t *idx_dct, const int16_t len, BSTR_ENC_HANDLE hMetaData ); + +static uint64_t create_combined_index( uint16_t *idx_dct, const int16_t len, const int16_t *no_cb_vec ); + +static int16_t encode_surround_coherence( IVAS_QMETADATA *hQMetaData, BSTR_ENC_HANDLE hMetaData ); + +static int16_t write_fixed_rate_direction( BSTR_ENC_HANDLE hMetaData, IVAS_QDIRECTION *q_direction, const int16_t j_idx, const int16_t len ); + +static int16_t common_direction( IVAS_QDIRECTION *q_direction, const int16_t band_idx, const int16_t len, const int16_t bits_allowed, BSTR_ENC_HANDLE hMetaData, float *elevation_orig, float *azimuth_orig ); + +static int16_t ivas_diffuseness_huff_ec_encode( BSTR_ENC_HANDLE hMetaData, const uint16_t idx ); + +static void ivas_diffuseness_huff_ec_prepare( IVAS_QDIRECTION *q_direction, int16_t *best_av, uint16_t *avr_idx, int16_t *diffuseness_bits_huff ); + +static int16_t coherence_coding_length( const uint16_t *idx_sur_coh_shift, const uint8_t idx_shift_len, const int16_t coding_subbands, const int16_t *no_cv, uint16_t *mr_idx, int16_t *no_cv_shift, int16_t *p_min_idx, int16_t *GR_ord, int16_t *nbits_fr, int16_t *nbits_fr1 ); + +static int16_t write_2dir_info( BSTR_ENC_HANDLE hMetaData, uint8_t *twoDirBands, const int16_t n, const int16_t k ); + +static void transform_azimuth_dir2( IVAS_QMETADATA_HANDLE hQMetaData, int16_t *dir2_bands ); + +static int16_t calc_var_azi( const IVAS_QDIRECTION *q_direction, const int16_t diffuseness_index_max_ec_frame, const float avg_azimuth, float *avg_azimuth_out ); + +static int16_t ivas_qmetadata_entropy_encode_diffuseness_hr( BSTR_ENC_HANDLE hMetaData, IVAS_QDIRECTION *q_direction, uint16_t *diffuseness_index_max_ec_frame ); + +static void ivas_qmetadata_quantize_diffuseness_nrg_ratios_hr_512( IVAS_QMETADATA_HANDLE hQMetaData, int16_t *needed_bits, const int16_t bits_dir_hr, BSTR_ENC_HANDLE hMetaData ); + +static int16_t encode_surround_coherence_hr( IVAS_QMETADATA *hQMetaData, BSTR_ENC_HANDLE hMetaData ); + +static int16_t ivas_qmetadata_quantize_coherence_hr_512( IVAS_QMETADATA *hQMetaData, const int16_t idx_d, const int16_t all_coherence_zero, BSTR_ENC_HANDLE hMetaData, const int16_t bits_coh ); + +static int16_t write_stream_dct_coeffs_omasa( int16_t *q_idx, const int16_t len_stream, BSTR_ENC_HANDLE hMetaData, const int16_t first_line, const int16_t low_bitrate_mode ); + +static int16_t find_optimal_GR_order( const int16_t *q_idx, const int16_t len, int16_t *GR ); + +static int16_t find_optimal_GR_orders( const int16_t *q_idx, const int16_t len, const int16_t len_max_GR1, int16_t *GR1, int16_t *GR2, int16_t *i_min ); + + +/*-----------------------------------------------------------------------* + * ivas_qmetadata_enc_encode() + * + * Main function for quantizing and coding Spatial Metadata + *-----------------------------------------------------------------------*/ + +ivas_error ivas_qmetadata_enc_encode( + BSTR_ENC_HANDLE hMetaData, /* i/o: metadata bitstream handle */ + IVAS_QMETADATA *hQMetaData, /* i/o: metadata handle */ + const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ +) +{ + int16_t i, bit_pos_start, bit_pos_start_coh; + int16_t next_ind_start; + uint16_t diffuseness_index_max_ec_frame; + uint16_t diffuseness_index_max_ec_frame_pre[QMETADATA_MAX_NO_DIRECTIONS]; + int16_t bits_dir_raw_pre[QMETADATA_MAX_NO_DIRECTIONS]; + int16_t bits_diff_sum; + int16_t bits_diff[QMETADATA_MAX_NO_DIRECTIONS], bits_coherence[QMETADATA_MAX_NO_DIRECTIONS]; + int16_t bits_dir[QMETADATA_MAX_NO_DIRECTIONS], bits_dir_raw; + int16_t extra_bits; + IVAS_QDIRECTION *q_direction; + int16_t nbands, nblocks, start_band; + int16_t ndirections, d; + float azimuth_orig[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES], elevation_orig[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES]; + int16_t all_coherence_zero; + int16_t bit_pos_0, total_bits_1dir, bits_no_dirs_coh; + int16_t bits_signaling[QMETADATA_MAX_NO_DIRECTIONS]; + int16_t indice_coherence; + int16_t bits_dir_bands[MASA_MAXIMUM_CODING_SUBBANDS], raw_flag[MASA_MAXIMUM_CODING_SUBBANDS]; + int16_t diff_bits, bits_ec, next_ind_raw_flag; + int16_t dfRatio_bits[MASA_MAXIMUM_CODING_SUBBANDS]; + int16_t bits_surround_coh, no_TF; + int16_t dir2_bands[MASA_MAXIMUM_TWO_DIR_BANDS]; + int16_t ind_order[MASA_MAXIMUM_CODING_SUBBANDS]; + int16_t reduce_bits; + ivas_error error; + + error = IVAS_ERR_OK; + + + + /* Save initial position in bitstream */ + bit_pos_0 = hMetaData->nb_bits_tot; + bit_pos_start = bit_pos_0; + + ndirections = hQMetaData->no_directions; + extra_bits = 0; + + /* Check if coherence should be encoded */ + all_coherence_zero = 1; + bits_no_dirs_coh = 0; + + if ( hQMetaData->coherence_flag ) + { + all_coherence_zero = hQMetaData->all_coherence_zero; + + push_next_indice( hMetaData, all_coherence_zero, 1 ); /* signal coherence */ + bits_no_dirs_coh += 1; + } + + if ( ndirections > 1 ) + { + /* Reorder 2dir bands for more efficient encoding. */ + if ( !hodirac_flag ) + { + ivas_qmetadata_reorder_2dir_bands( hQMetaData ); + } + d = 0; + for ( i = hQMetaData->q_direction[1].cfg.start_band; i < hQMetaData->q_direction[1].cfg.nbands; i++ ) + { + if ( hQMetaData->twoDirBands[i] == 1 ) + { + mvr2r( hQMetaData->q_direction[1].band_data[i].azimuth, hQMetaData->q_direction[1].band_data[d].azimuth, hQMetaData->q_direction[1].cfg.nblocks ); + mvr2r( hQMetaData->q_direction[1].band_data[i].elevation, hQMetaData->q_direction[1].band_data[d].elevation, hQMetaData->q_direction[1].cfg.nblocks ); + mvr2r( hQMetaData->q_direction[1].band_data[i].energy_ratio, hQMetaData->q_direction[1].band_data[d].energy_ratio, hQMetaData->q_direction[1].cfg.nblocks ); + + dir2_bands[d] = i; + + if ( hQMetaData->coherence_flag ) + { + mvc2c( hQMetaData->q_direction[1].coherence_band_data[i].spread_coherence, hQMetaData->q_direction[1].coherence_band_data[d].spread_coherence, hQMetaData->q_direction[1].cfg.nblocks ); + } + d++; + } + } + + bits_no_dirs_coh += write_2dir_info( hMetaData, hQMetaData->twoDirBands, hQMetaData->q_direction[0].cfg.nbands, hQMetaData->numTwoDirBands ); + + for ( i = d; i < hQMetaData->q_direction[0].cfg.nbands; i++ ) + { + set_f( hQMetaData->q_direction[1].band_data[i].energy_ratio, 0.0f, hQMetaData->q_direction[1].cfg.nblocks ); + } + + hQMetaData->q_direction[1].cfg.nbands = hQMetaData->numTwoDirBands; + } + + /*Quantization of the Diffuseness */ + ivas_qmetadata_quantize_diffuseness_nrg_ratios( hQMetaData, bits_dir_raw_pre, bits_diff, dfRatio_bits, hodirac_flag ); + + bits_diff_sum = 0; + bits_diff[0] = ivas_qmetadata_entropy_encode_diffuseness( hMetaData, &( hQMetaData->q_direction[0] ), &diffuseness_index_max_ec_frame_pre[0] ); + bits_diff_sum += bits_diff[0]; + + if ( ndirections == 2 ) + { + bits_diff[1] = ivas_qmetadata_entropy_encode_df_ratio( hMetaData, &( hQMetaData->q_direction[1] ), dfRatio_bits ); + bits_diff_sum += bits_diff[1]; + } + + /* 2dir energy ratio encoding reuses index memory. Now that diffRatio and dFRatio have been encoded, + * we retrieve index_dirRatio1Inv and index_dirRatio1Inv for further parameter encoding. This is + * necessary only for bands that have two concurrent directions. */ + if ( hQMetaData->no_directions == 2 ) + { + int16_t j, k, dir2band, index_dirRatio1Inv, index_dirRatio2Inv; + + dir2band = 0; + for ( j = hQMetaData->q_direction[0].cfg.start_band; j < hQMetaData->q_direction[0].cfg.nbands; ++j ) + { + if ( hQMetaData->twoDirBands[j] == 1 ) + { + index_dirRatio1Inv = masa_sq( 1.0f - hQMetaData->q_direction[0].band_data[j].energy_ratio[0], diffuseness_thresholds, DIRAC_DIFFUSE_LEVELS ); + index_dirRatio2Inv = masa_sq( 1.0f - hQMetaData->q_direction[1].band_data[dir2band].energy_ratio[0], diffuseness_thresholds, DIRAC_DIFFUSE_LEVELS ); + + for ( k = 0; k < hQMetaData->q_direction[0].cfg.nblocks; k++ ) + { + hQMetaData->q_direction[0].band_data[j].energy_ratio_index[k] = index_dirRatio1Inv; + } + + for ( k = 0; k < hQMetaData->q_direction[1].cfg.nblocks; k++ ) + { + hQMetaData->q_direction[1].band_data[dir2band].energy_ratio_index[k] = index_dirRatio2Inv; + } + + dir2band++; + } + } + } + + /* Encode surround coherence */ + if ( ndirections == 2 ) + { + no_TF = hQMetaData->q_direction[0].cfg.nbands * hQMetaData->q_direction[0].cfg.nblocks + hQMetaData->q_direction[1].cfg.nbands * hQMetaData->q_direction[1].cfg.nblocks; + if ( ( all_coherence_zero == 0 ) && ( hQMetaData->metadata_max_bits - bits_no_dirs_coh - 4.3f * no_TF - sum_s( bits_diff, ndirections ) >= MASA_MIN_BITS_SURR_COH ) ) + { + bits_surround_coh = encode_surround_coherence( hQMetaData, hMetaData ); + } + else + { + bits_surround_coh = 0; + for ( i = 0; i < hQMetaData->q_direction[0].cfg.nbands; i++ ) + { + if ( hQMetaData->surcoh_band_data != NULL ) + { + set_c( (int8_t *) hQMetaData->surcoh_band_data[i].surround_coherence, 0, hQMetaData->q_direction[0].cfg.nblocks ); + } + } + } + bits_no_dirs_coh += bits_surround_coh; + total_bits_1dir = ( ( hQMetaData->metadata_max_bits - bits_no_dirs_coh ) * hQMetaData->q_direction[0].cfg.nbands * hQMetaData->q_direction[0].cfg.nblocks ) / no_TF; + } + else + { + no_TF = hQMetaData->q_direction[0].cfg.nbands * hQMetaData->q_direction[0].cfg.nblocks; + if ( ( all_coherence_zero == 0 ) && ( hQMetaData->metadata_max_bits - bits_no_dirs_coh - 4.3f * no_TF - bits_diff[0] >= MASA_MIN_BITS_SURR_COH ) ) + { + bits_surround_coh = encode_surround_coherence( hQMetaData, hMetaData ); + } + else + { + bits_surround_coh = 0; + for ( i = 0; i < hQMetaData->q_direction[0].cfg.nbands; i++ ) + { + if ( hQMetaData->surcoh_band_data != NULL ) + { + set_c( (int8_t *) hQMetaData->surcoh_band_data[i].surround_coherence, 0, hQMetaData->q_direction[0].cfg.nblocks ); + } + } + } + total_bits_1dir = hQMetaData->metadata_max_bits - bits_no_dirs_coh - bits_surround_coh; + } + + /* Loop over number of directions*/ + for ( d = 0; d < ndirections; d++ ) + { + q_direction = &( hQMetaData->q_direction[d] ); + + if ( d == 1 ) + { + transform_azimuth_dir2( hQMetaData, dir2_bands ); + } + + nbands = q_direction->cfg.nbands; + nblocks = q_direction->cfg.nblocks; + start_band = q_direction->cfg.start_band; + diffuseness_index_max_ec_frame = diffuseness_index_max_ec_frame_pre[0]; + bits_dir_raw = bits_dir_raw_pre[d]; + + /* This sets bit budget correctly for the second direction */ + if ( d == 0 ) + { + bits_diff[d] = bits_diff_sum; + } + else + { + bits_diff[d] = 0; + } + + + bits_signaling[d] = 0; + + /*Coherence */ + bits_coherence[d] = 0; + bit_pos_start_coh = hMetaData->nb_bits_tot; + + if ( all_coherence_zero == 0 ) + { + bits_coherence[d] = ivas_qmetadata_quantize_coherence( hQMetaData, d, all_coherence_zero, hMetaData, 0, &indice_coherence, 0 ); + } + + if ( q_direction->cfg.mc_ls_setup == MC_LS_SETUP_5_1 || q_direction->cfg.mc_ls_setup == MC_LS_SETUP_7_1 ) + { + q_direction->not_in_2D = 0; + /* Quantize directions*/ + quantize_direction_frame2D( q_direction, azimuth_orig, elevation_orig ); + } + else + { + /* Quantize directions*/ + quantize_direction_frame( q_direction, azimuth_orig, elevation_orig, 0 ); + } + + /* Signalling 2D*/ + push_next_indice( hMetaData, ( q_direction->not_in_2D > 0 ), 1 ); /*2D flag*/ + bits_signaling[d] = 1; + + /* Save state of metadata bitstream buffer after writing energy ratios, number of dirs and save space for coherence*/ + bit_pos_start = hMetaData->nb_bits_tot; + next_ind_start = hMetaData->nb_ind_tot; + + /* Encode quantized directions with EC frame-wise*/ + if ( total_bits_1dir + bits_surround_coh <= hQMetaData->qmetadata_max_bit_req ) + { + push_next_indice( hMetaData, 0, 1 ); /*Write 1 bit to signal EC frame-wise (EC1)*/ + bits_signaling[d]++; + } + + next_ind_raw_flag = hMetaData->nb_ind_tot; + push_next_indice( hMetaData, 0, 1 ); /* Raw coding flag*/ + + bits_dir_bands[0] = ivas_qmetadata_raw_encode_dir( NULL, q_direction, q_direction->cfg.nbands, q_direction->cfg.start_band ); + + reduce_bits = hQMetaData->is_masa_ivas_format ? ( total_bits_1dir - ( bits_diff[d] + bits_coherence[d] + bits_signaling[d] ) - 1 ) : MASA_MAX_BITS; + bits_ec = ivas_qmetadata_entropy_encode_dir( hMetaData, q_direction, diffuseness_index_max_ec_frame, q_direction->cfg.nbands, q_direction->cfg.start_band, bits_dir_bands[0], reduce_bits, 0 ); + + if ( bits_ec < 0 ) + { + hMetaData->ind_list[next_ind_raw_flag].value = 1; /*rewrite flag*/ + bits_ec = ivas_qmetadata_raw_encode_dir( hMetaData, q_direction, q_direction->cfg.nbands, q_direction->cfg.start_band ); + } + bits_dir[d] = bits_ec + 1; + extra_bits = hQMetaData->metadata_max_bits - ( hMetaData->nb_bits_tot - bit_pos_0 ); + + /* Encode quantized directions with EC band-wise */ + if ( ( total_bits_1dir + bits_surround_coh <= hQMetaData->qmetadata_max_bit_req ) && ( bits_dir[d] + bits_diff[d] + bits_coherence[d] + bits_signaling[d] > total_bits_1dir ) && q_direction->cfg.nblocks > 1 ) + { + restore_metadata_buffer( hMetaData, next_ind_start, bit_pos_start ); + + /* Write signaling */ + push_next_indice( hMetaData, 1, 1 ); /*Write 1 bit to signal no EC frame-wise (EC1)*/ + push_next_indice( hMetaData, 0, 1 ); /*Write 1 bit to signal EC band-wise (EC2)*/ + bits_signaling[d] = 3; + + /* Write raw flags */ + next_ind_raw_flag = hMetaData->nb_ind_tot; + for ( i = start_band; i < nbands; i++ ) + { + push_next_indice( hMetaData, 0, 1 ); /* Raw coding flag*/ + } + + bits_dir[d] = 0; + diff_bits = bits_diff[d] + bits_coherence[d] + bits_signaling[d] - total_bits_1dir; + for ( i = start_band; i < nbands; i++ ) + { + bits_dir_bands[i] = ivas_qmetadata_raw_encode_dir( NULL, q_direction, i + 1, i ); + + /* Write ec bits */ + bits_ec = ivas_qmetadata_entropy_encode_dir( hMetaData, q_direction, diffuseness_index_max_ec_frame, i + 1, i, bits_dir_bands[i], MASA_MAX_BITS, 0 ); + + if ( bits_ec >= 0 ) + { + bits_dir_bands[i] = bits_ec; + raw_flag[i] = 0; + } + else + { + raw_flag[i] = 1; + } + diff_bits += bits_dir_bands[i] + 1; + } + + small_requantize_direction_frame( q_direction, azimuth_orig, elevation_orig, raw_flag, bits_dir_bands, &diff_bits ); + + for ( i = start_band; i < nbands; i++ ) + { + if ( raw_flag[i] ) + { + /* Rewrite raw flag value */ + hMetaData->ind_list[next_ind_raw_flag + i - start_band].value = 1; + + /* Write ec bits */ + bits_ec = ivas_qmetadata_raw_encode_dir( hMetaData, q_direction, i + 1, i ); + } + bits_dir[d] += bits_dir_bands[i] + 1; + } + + extra_bits = hQMetaData->metadata_max_bits - ( hMetaData->nb_bits_tot - bit_pos_0 ); + + + } + + /* Requantized directions */ + if ( ( total_bits_1dir + bits_surround_coh <= hQMetaData->qmetadata_max_bit_req ) && ( bits_dir[d] + bits_diff[d] + bits_coherence[d] + bits_signaling[d] > total_bits_1dir ) ) + { + + /*Bit budget exceeded, bit reduction strategy?*/ + extra_bits = 0; + + restore_metadata_buffer( hMetaData, next_ind_start, bit_pos_start ); + + push_next_indice( hMetaData, 1, 1 ); /*Write 1 bit to signal no EC frame-wise (EC1)*/ + if ( nblocks > 1 ) + { + push_next_indice( hMetaData, 1, 1 ); /*Write 1 bit to signal requantization stage (EC3)*/ + bits_signaling[d] = 3; + } + else + { + bits_signaling[d] = 2; + } + + if ( hQMetaData->is_masa_ivas_format == 0 ) + { + reduce_bits = bits_dir_raw - ( total_bits_1dir - bits_diff[d] - bits_coherence[d] - bits_signaling[d] ); + ind_order[0] = -1; + } + else + { + ind_order[0] = 0; + reduce_bits = min( nbands * nblocks + MASA_BIT_REDUCT_PARAM, bits_dir_raw - ( total_bits_1dir - bits_diff[d] - bits_coherence[d] - bits_signaling[d] ) ); + + if ( reduce_bits > bits_dir_raw - nbands * nblocks ) + { + reduce_bits = bits_dir_raw - nbands * nblocks; + } + } + + only_reduce_bits_direction( &extra_bits, q_direction, reduce_bits, nbands, nblocks, ind_order ); + bits_dir[d] = hMetaData->nb_bits_tot; + requantize_direction_EC_3( &extra_bits, q_direction, nbands, hMetaData, elevation_orig, azimuth_orig, ind_order ); + bits_dir[d] = hMetaData->nb_bits_tot - bits_dir[d]; + } + + /* finalize writing coherence */ + if ( ( bits_coherence[d] > 0 ) && ( all_coherence_zero == 0 ) && ( nblocks > 1 ) ) + { + bit_pos_start = hMetaData->nb_bits_tot; + hMetaData->nb_bits_tot = bit_pos_start_coh; + ivas_qmetadata_quantize_coherence( hQMetaData, d, all_coherence_zero, hMetaData, 1, &indice_coherence, 0 ); + hMetaData->nb_bits_tot = bit_pos_start; + } + + if ( d == 0 ) + { + total_bits_1dir = hQMetaData->metadata_max_bits - ( hMetaData->nb_bits_tot - bit_pos_0 ); + } + + /* Save quantized DOAs */ + for ( i = start_band; i < nbands; i++ ) + { + mvr2r( q_direction->band_data[i].azimuth, q_direction->band_data[i].q_azimuth, nblocks ); + mvr2r( q_direction->band_data[i].elevation, q_direction->band_data[i].q_elevation, nblocks ); + } + + /* Copy original DOAs back to q_direction*/ + for ( i = start_band; i < nbands; i++ ) + { + mvr2r( azimuth_orig[i], q_direction->band_data[i].azimuth, nblocks ); + mvr2r( elevation_orig[i], q_direction->band_data[i].elevation, nblocks ); + } + } + + return error; +} + + +/*-----------------------------------------------------------------------* + * ivas_qmetadata_enc_encode_hr_384_512() + * + * Main function for quantizing and coding Spatial Metadata at HRs + *-----------------------------------------------------------------------*/ + +ivas_error ivas_qmetadata_enc_encode_hr_384_512( + BSTR_ENC_HANDLE hMetaData, /* i/o: metadata bitstream handle */ + IVAS_QMETADATA *hQMetaData, /* i/o: metadata handle */ + const int16_t bits_sph_idx, + const int16_t bits_sp_coh ) +{ + int16_t i, j; + int16_t bits_diff[QMETADATA_MAX_NO_DIRECTIONS]; + IVAS_QDIRECTION *q_direction; + int16_t nbands, nblocks, start_band; + int16_t ndirections, d; + int16_t all_coherence_zero; + int16_t bits_ec; + float azimuth_orig[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES], elevation_orig[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES]; + ivas_error error; + + error = IVAS_ERR_OK; + + + ndirections = hQMetaData->no_directions; + + /* Check if coherence should be encoded */ + all_coherence_zero = 1; + if ( hQMetaData->q_direction->cfg.inactiveBands > 0 ) + { + push_next_indice( hMetaData, 1, 1 ); + /* write the number of inactive higher bands */ + ivas_qmetadata_encode_extended_gr( hMetaData, hQMetaData->q_direction->cfg.inactiveBands - 1, MASA_MAXIMUM_CODING_SUBBANDS, 1 ); + } + else + { + /* no change */ + push_next_indice( hMetaData, 0, 1 ); + } + if ( hQMetaData->coherence_flag ) + { + all_coherence_zero = hQMetaData->all_coherence_zero; + push_next_indice( hMetaData, all_coherence_zero, 1 ); /* signal coherence */ + } + + /* encode 2 direction subbands position */ + if ( ndirections == 2 && bits_sph_idx == 11 ) + { + write_2dir_info( hMetaData, hQMetaData->twoDirBands, hQMetaData->q_direction[0].cfg.nbands, hQMetaData->numTwoDirBands ); + d = 0; + for ( i = hQMetaData->q_direction[1].cfg.start_band; i < hQMetaData->q_direction[1].cfg.nbands; i++ ) + { + if ( hQMetaData->twoDirBands[i] == 1 ) + { + mvr2r( hQMetaData->q_direction[1].band_data[i].azimuth, hQMetaData->q_direction[1].band_data[d].azimuth, hQMetaData->q_direction[1].cfg.nblocks ); + mvr2r( hQMetaData->q_direction[1].band_data[i].elevation, hQMetaData->q_direction[1].band_data[d].elevation, hQMetaData->q_direction[1].cfg.nblocks ); + mvr2r( hQMetaData->q_direction[1].band_data[i].energy_ratio, hQMetaData->q_direction[1].band_data[d].energy_ratio, hQMetaData->q_direction[1].cfg.nblocks ); + + if ( hQMetaData->coherence_flag ) + { + mvc2c( hQMetaData->q_direction[1].coherence_band_data[i].spread_coherence, hQMetaData->q_direction[1].coherence_band_data[d].spread_coherence, hQMetaData->q_direction[1].cfg.nblocks ); + } + d++; + } + } + for ( i = hQMetaData->numTwoDirBands; i < hQMetaData->q_direction[0].cfg.nbands; i++ ) + { + set_f( hQMetaData->q_direction[1].band_data[i].energy_ratio, 0.0f, hQMetaData->q_direction[1].cfg.nblocks ); + } + + hQMetaData->q_direction[1].cfg.nbands = hQMetaData->numTwoDirBands; + } + + /*Quantization and encoding of the Diffuseness */ + ivas_qmetadata_quantize_diffuseness_nrg_ratios_hr_512( hQMetaData, bits_diff, bits_sph_idx, hMetaData ); + + /* Encode surround coherence */ + if ( all_coherence_zero == 0 ) + { + encode_surround_coherence_hr( hQMetaData, hMetaData ); + } + else + { + for ( i = 0; i < hQMetaData->q_direction[0].cfg.nbands; i++ ) + { + if ( hQMetaData->surcoh_band_data != NULL ) + { + set_c( (int8_t *) hQMetaData->surcoh_band_data[i].surround_coherence, 0, hQMetaData->q_direction[0].cfg.nblocks ); + } + } + } + + /* Loop over number of directions*/ + for ( d = 0; d < ndirections; d++ ) + { + q_direction = &( hQMetaData->q_direction[d] ); + + nbands = q_direction->cfg.nbands; + nblocks = q_direction->cfg.nblocks; + start_band = q_direction->cfg.start_band; + + + q_direction->not_in_2D = 0; + + /*Coherence */ + if ( all_coherence_zero == 0 ) + { + ivas_qmetadata_quantize_coherence_hr_512( hQMetaData, d, all_coherence_zero, hMetaData, bits_sp_coh ); + } + + /* write the spherical indexes */ + bits_ec = hMetaData->nb_bits_tot; + if ( bits_sph_idx == 11 ) + { + /* do the quantization */ + quantize_direction_frame( q_direction, azimuth_orig, elevation_orig, 1 ); + } + + for ( i = start_band; i < nbands; i++ ) + { + for ( j = 0; j < nblocks; j++ ) + { + push_next_indice( hMetaData, q_direction->band_data[i].spherical_index[j], bits_sph_idx ); + } + } + bits_ec = hMetaData->nb_bits_tot - bits_ec; + + + /* Save quantized DOAs */ + if ( bits_sph_idx == 11 ) + { + for ( i = start_band; i < nbands; i++ ) + { + mvr2r( azimuth_orig[i], q_direction->band_data[i].azimuth, nblocks ); + mvr2r( elevation_orig[i], q_direction->band_data[i].elevation, nblocks ); + } + } + else + { + for ( i = start_band; i < nbands; i++ ) + { + mvr2r( q_direction->band_data[i].azimuth, q_direction->band_data[i].q_azimuth, nblocks ); + mvr2r( q_direction->band_data[i].elevation, q_direction->band_data[i].q_elevation, nblocks ); + } + } + } + + if ( hQMetaData->q_direction->cfg.inactiveBands > 0 ) + { + hQMetaData->q_direction[0].cfg.nbands += hQMetaData->q_direction->cfg.inactiveBands; + if ( ndirections > 1 ) + { + hQMetaData->q_direction[1].cfg.nbands += hQMetaData->q_direction->cfg.inactiveBands; + } + } + + return error; +} + + +/*-----------------------------------------------------------------------* + * ivas_qmetadata_enc_sid_encode() + * + * Main function for coding SID for Spatial Metadata + *-----------------------------------------------------------------------*/ + +/*! r: number of bits written */ +void ivas_qmetadata_enc_sid_encode( + BSTR_ENC_HANDLE hMetaData, /* i/o: metadata bitstream handle */ + IVAS_QMETADATA *q_metadata, /* i/o: metadata handle */ + const int16_t masa_sid_descriptor, /* i : description of MASA SID coding structure */ + const int16_t ivas_format /* i : IVAS format */ +) +{ + int16_t b, m; + int16_t bit_pos_start; + IVAS_QDIRECTION *q_direction; + int16_t nbands, nblocks, start_band; + float avg_direction_vector[3]; + float direction_vector[3]; + float avg_azimuth[MASA_MAXIMUM_CODING_SUBBANDS]; + float avg_elevation[MASA_MAXIMUM_CODING_SUBBANDS]; + int16_t bits_dir, bits_diff, bits_delta; + int16_t metadata_sid_bits; /* bits allocated to SID for metadata */ + + if ( ivas_format == SBA_FORMAT ) + { + metadata_sid_bits = (int16_t) ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - ( SPAR_DTX_BANDS * SPAR_SID_BITS_TAR_PER_BAND ) - 2 - SID_FORMAT_NBITS; /* -1 for inactive mode header bit*/ + } + else + { + metadata_sid_bits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; + } + + + /* Save initial position in bitstream */ + bit_pos_start = hMetaData->nb_bits_tot; + + /* write for MASA the number of transport channels used at coding and the CPE mode DFT/MDCT */ + if ( masa_sid_descriptor > -1 ) + { + push_next_indice( hMetaData, masa_sid_descriptor, 1 ); + } + + /* Code for one direction: diffuseness and average DOA(s)*/ + q_direction = &( q_metadata->q_direction[0] ); + nbands = q_direction->cfg.nbands; + nblocks = q_direction->cfg.nblocks; + start_band = 0; /*Start always with band 0 for SID*/ + + /* sanity checks*/ + assert( q_metadata->no_directions == 1 && "Qmetadata SID: only one direction supported!" ); + if ( ivas_format == SBA_FORMAT ) + { + assert( ( q_direction->cfg.nbands == DIRAC_DTX_BANDS ) && "Qmetadata SID: only 2 bands supported!" ); + } + else + { + assert( ( q_direction->cfg.nbands == 5 ) && "Qmetadata SID: only 5 bands supported!" ); + } + + if ( ivas_format != SBA_FORMAT ) + { + /* Signalling 2D*/ + push_next_indice( hMetaData, ( q_direction->not_in_2D > 0 ), 1 ); /*2D flag*/ + } + else + { + q_direction->not_in_2D = 1; /* force for merged modes */ + } + + /*Encode the quantized diffuseness in raw coding*/ + bits_dir = 0; + bits_diff = 0; + if ( ivas_format != SBA_FORMAT ) + { + for ( b = start_band; b < nbands; b++ ) + { + q_direction->band_data[b].energy_ratio_index[0] = max( q_direction->band_data[b].energy_ratio_index[0], 4 ); + bits_diff += ivas_qmetadata_encode_quasi_uniform_length( q_direction->band_data[b].energy_ratio_index[0] - 4, DIRAC_DIFFUSE_LEVELS - 4 ); + q_direction->band_data[b].bits_sph_idx[0] = bits_direction_masa[q_direction->band_data[b].energy_ratio_index[0]]; + + if ( q_direction->not_in_2D == 0 ) + { + q_direction->band_data[b].azimuth_m_alphabet[0] = 1 << ( min( 8, q_direction->band_data[b].bits_sph_idx[0] ) ); + bits_dir += ivas_qmetadata_encode_quasi_uniform_length( q_direction->band_data[b].azimuth_m_alphabet[0] - 1, q_direction->band_data[b].azimuth_m_alphabet[0] ); + } + else + { + bits_dir += q_direction->band_data[b].bits_sph_idx[0]; + } + } + + /* Reduce bit demand by increasing diffuseness*/ + bits_delta = metadata_sid_bits - ( hMetaData->nb_bits_tot - bit_pos_start ) - bits_diff - bits_dir; + if ( bits_delta > 0 ) + { + while ( bits_delta > 0 ) + { + for ( b = start_band; b < nbands && ( bits_delta > 0 ); b++ ) + { + if ( q_direction->band_data[b].bits_sph_idx[0] < 11 ) + { + bits_delta -= 1; + q_direction->band_data[b].bits_sph_idx[0]++; + } + } + } + + if ( q_direction->not_in_2D == 0 ) + { + for ( b = start_band; b < nbands; b++ ) + { + q_direction->band_data[b].azimuth_m_alphabet[0] = 1 << ( min( 8, q_direction->band_data[b].bits_sph_idx[0] ) ); + } + } + } + else + { + while ( bits_delta < 0 ) + { + for ( b = nbands - 1; b >= start_band && ( bits_delta < 0 ); b-- ) + { + if ( q_direction->band_data[b].bits_sph_idx[0] >= 4 ) + { + bits_delta += 1; + q_direction->band_data[b].bits_sph_idx[0]--; + if ( q_direction->not_in_2D == 0 ) + { + q_direction->band_data[b].azimuth_m_alphabet[0] = 1 << ( min( 8, q_direction->band_data[b].bits_sph_idx[0] ) ); + } + } + } + } + } + } + else + { + for ( b = start_band; b < nbands; b++ ) + { + q_direction->band_data[b].energy_ratio_index[0] = max( q_direction->band_data[b].energy_ratio_index[0], 4 ); + bits_diff += ivas_qmetadata_encode_quasi_uniform_length( q_direction->band_data[b].energy_ratio_index[0] - 4, DIRAC_DIFFUSE_LEVELS - 4 ); + q_direction->band_data[b].bits_sph_idx[0] = bits_direction_masa[q_direction->band_data[b].energy_ratio_index[0]]; + + if ( q_direction->not_in_2D == 0 ) + { + q_direction->band_data[b].azimuth_m_alphabet[0] = 1 << ( min( 5, q_direction->band_data[b].bits_sph_idx[0] ) ); + bits_dir += ivas_qmetadata_encode_quasi_uniform_length( q_direction->band_data[b].azimuth_m_alphabet[0] - 1, q_direction->band_data[b].azimuth_m_alphabet[0] ); + } + else + { + bits_dir += q_direction->band_data[b].bits_sph_idx[0]; + } + } + + /* Reduce bit demand by increasing diffuseness*/ + bits_delta = metadata_sid_bits - ( hMetaData->nb_bits_tot - bit_pos_start ) - bits_diff - bits_dir; + + while ( bits_delta < 0 && ( q_direction->not_in_2D > 0 ) ) + { + for ( b = nbands - 1; b >= start_band && ( bits_delta < 0 ); b-- ) + { + if ( q_direction->band_data[b].energy_ratio_index[0] < ( DIRAC_DIFFUSE_LEVELS - 1 ) ) + { + bits_delta += q_direction->band_data[b].bits_sph_idx[0]; + q_direction->band_data[b].energy_ratio_index[0]++; + q_direction->band_data[b].bits_sph_idx[0] = bits_direction_masa[q_direction->band_data[b].energy_ratio_index[0]]; + bits_delta -= q_direction->band_data[b].bits_sph_idx[0]; + } + } + } + } + assert( ( bits_delta >= 0 ) && "Bit budget in Qmetadata SID is violated!!!" ); + + /*Code diffuseness*/ + for ( b = start_band; b < nbands; b++ ) + { + ivas_qmetadata_encode_quasi_uniform( hMetaData, q_direction->band_data[b].energy_ratio_index[0] - 4, DIRAC_DIFFUSE_LEVELS - 4 ); + } + + /* Compute and Quantize an average direction per band*/ + for ( b = start_band; b < nbands; b++ ) + { + set_zero( avg_direction_vector, 3 ); + for ( m = 0; m < nblocks; m++ ) + { + /*compute the average direction */ + ivas_qmetadata_azimuth_elevation_to_direction_vector( q_direction->band_data[b].azimuth[m], q_direction->band_data[b].elevation[m], direction_vector ); + v_add( avg_direction_vector, direction_vector, avg_direction_vector, 3 ); + } + + ivas_qmetadata_direction_vector_to_azimuth_elevation( avg_direction_vector, &avg_azimuth[b], &avg_elevation[b] ); + + /* Quantize the average direction */ + if ( q_direction->not_in_2D == 0 ) + { + avg_elevation[b] = 0; + q_direction->band_data[b].spherical_index[0] = quantize_direction2D( avg_azimuth[b], q_direction->band_data[b].azimuth_m_alphabet[0], &avg_azimuth[b], + &q_direction->band_data[b].azimuth_index[0], q_direction->cfg.mc_ls_setup ); + } + else + { + q_direction->band_data[b].spherical_index[0] = quantize_direction( avg_elevation[b], avg_azimuth[b], q_direction->band_data[b].bits_sph_idx[0], &avg_elevation[b], &avg_azimuth[b], + &q_direction->band_data[b].elevation_index[0], &q_direction->band_data[b].azimuth_index[0], q_direction->cfg.mc_ls_setup ); + } + + /* Save quantized DOAs */ + q_direction->band_data[b].q_azimuth[0] = avg_azimuth[b]; + q_direction->band_data[b].q_elevation[0] = avg_elevation[b]; + + if ( q_direction->band_data[b].azimuth_index[0] == MASA_NO_INDEX ) + { + q_direction->band_data[b].azimuth_index[0] = 0; + } + } + + /* quantize average elevation and azimuth angles */ + if ( q_direction->not_in_2D > 0 ) + { + for ( b = start_band; b < nbands; b++ ) + { + push_next_indice( hMetaData, q_direction->band_data[b].spherical_index[0], q_direction->band_data[b].bits_sph_idx[0] ); + } + } + else + { + for ( b = start_band; b < nbands; b++ ) + { + ivas_qmetadata_encode_quasi_uniform( hMetaData, q_direction->band_data[b].azimuth_index[0], q_direction->band_data[b].azimuth_m_alphabet[0] ); + } + } + + + /* fill bits*/ + assert( ( hMetaData->nb_bits_tot - bit_pos_start ) <= metadata_sid_bits && "Too many written bits!" ); + while ( ( hMetaData->nb_bits_tot - bit_pos_start ) < metadata_sid_bits ) + { + push_next_indice( hMetaData, 0, 1 ); /*fill bit*/ + } + + return; +} + + +/*------------------------------------------------------------------------- + * reset_metadata_spatial() + * + * Reset metadata in spatial formats + *------------------------------------------------------------------------*/ + +void reset_metadata_spatial( + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + BSTR_ENC_HANDLE hMetaData, /* i/o: metadata bitstream handle */ + const int32_t element_brate, /* i : element bitrate */ + int32_t *total_brate, /* o : total bitrate */ + const int32_t core_brate, /* i : core bitrate */ + const int16_t nb_bits_metadata /* i : number of meatdata bits */ +) +{ + int16_t i, next_ind_sid, last_ind_sid; + int16_t j; + int16_t metadata_sid_bits; + + if ( core_brate == SID_2k40 || core_brate == FRAME_NO_DATA ) + { + if ( ( ivas_format == SBA_FORMAT || ivas_format == MASA_FORMAT ) && core_brate != FRAME_NO_DATA ) + { + if ( ivas_format == SBA_FORMAT ) + { + hMetaData->ind_list[0].value = 1; + metadata_sid_bits = (int16_t) ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; + + while ( hMetaData->nb_bits_tot < metadata_sid_bits ) + { + push_next_indice( hMetaData, 0, 1 ); /*fill bit*/ + } + } + else + { + /* Reset metadata and keep only SID metadata*/ + last_ind_sid = hMetaData->nb_ind_tot; + next_ind_sid = hMetaData->nb_ind_tot; + while ( hMetaData->nb_bits_tot > nb_bits_metadata ) + { + next_ind_sid--; + hMetaData->nb_bits_tot -= hMetaData->ind_list[next_ind_sid].nb_bits; + } + + hMetaData->nb_bits_tot = 0; + + for ( i = 0; i < next_ind_sid; i++ ) + { + hMetaData->ind_list[i].nb_bits = -1; + } + + for ( j = 0, i = next_ind_sid; i < last_ind_sid; i++, j++ ) + { + hMetaData->ind_list[j].value = hMetaData->ind_list[i].value; + hMetaData->ind_list[j].nb_bits = hMetaData->ind_list[i].nb_bits; + hMetaData->nb_bits_tot += hMetaData->ind_list[j].nb_bits; + hMetaData->ind_list[i].nb_bits = -1; + } + + hMetaData->nb_ind_tot = j; + } + } + else + { + /*Reset metadata*/ + reset_indices_enc( hMetaData, hMetaData->nb_ind_tot ); + } + + *total_brate = element_brate; + } + else if ( ivas_format != SBA_FORMAT ) + { + /* Reset SID metadata bits*/ + while ( hMetaData->nb_bits_tot > nb_bits_metadata ) + { + hMetaData->nb_ind_tot--; + hMetaData->nb_bits_tot -= hMetaData->ind_list[hMetaData->nb_ind_tot].nb_bits; + hMetaData->ind_list[hMetaData->nb_ind_tot].nb_bits = -1; + } + } + + return; +} + + +/*------------------------------------------------------------------------- + * quantize_direction2D() + * + * + *------------------------------------------------------------------------*/ + +/*! r: quantized spherical index */ +int16_t quantize_direction2D( + float phi, /* i : input azimuth value */ + const int16_t no_cw, /* i : number of bits */ + float *phi_q, /* o : quantized azimuth value */ + uint16_t *index_phi, /* o : quantized azimuth index */ + const MC_LS_SETUP mc_format /* i : channel format if in MC-mode */ +) +{ + int16_t idx_sph; + uint16_t id_phi; + if ( no_cw < 2 ) + { + *phi_q = 0; + + return 0; + } + + if ( mc_format != MC_LS_SETUP_INVALID ) + { + id_phi = quantize_phi_chan_compand( phi + 180, phi_q, no_cw, 0, mc_format ); + } + else + { + id_phi = quantize_phi( phi + 180, 0, phi_q, no_cw ); + } + *phi_q -= 180; + *index_phi = ivas_qmetadata_reorder_generic( id_phi - ( no_cw >> 1 ) ); + + idx_sph = id_phi; + + return idx_sph; +} + + +static void ivas_qmetadata_quantize_diffuseness_nrg_ratios_hr_512( + IVAS_QMETADATA_HANDLE hQMetaData, + int16_t *needed_bits, + const int16_t bits_dir_hr, + BSTR_ENC_HANDLE hMetaData ) +{ + int16_t j, k; + int16_t index; + + needed_bits[0] = 0; + needed_bits[1] = 0; + + for ( j = hQMetaData->q_direction[0].cfg.start_band; j < hQMetaData->q_direction[0].cfg.nbands; ++j ) + { + for ( k = 0; k < hQMetaData->q_direction[0].cfg.nblocks; k++ ) + { + index = masa_sq( 1.0f - hQMetaData->q_direction[0].band_data[j].energy_ratio[k], diffuseness_thresholds_hr, HR_MASA_ER_LEVELS ); + push_next_indice( hMetaData, index, MASA_BITS_ER_HR ); + hQMetaData->q_direction[0].band_data[j].energy_ratio_index[k] = index; + hQMetaData->q_direction[0].band_data[j].energy_ratio_index_mod[k] = index; + hQMetaData->q_direction[0].band_data[j].energy_ratio[k] = 1.0f - diffuseness_reconstructions_hr[index]; + needed_bits[0] += MASA_BITS_ER_HR; + hQMetaData->q_direction[0].band_data[j].bits_sph_idx[k] = bits_dir_hr; + } + } + + if ( hQMetaData->no_directions == 2 ) + { + float ratioSum; + if ( bits_dir_hr == 16 ) + { + for ( j = hQMetaData->q_direction[1].cfg.start_band; j < hQMetaData->q_direction[1].cfg.nbands; j++ ) + { + for ( k = 0; k < hQMetaData->q_direction[1].cfg.nblocks; k++ ) + { + index = masa_sq( 1.0f - hQMetaData->q_direction[1].band_data[j].energy_ratio[k], diffuseness_thresholds_hr, HR_MASA_ER_LEVELS ); + push_next_indice( hMetaData, index, MASA_BITS_ER_HR ); + hQMetaData->q_direction[1].band_data[j].energy_ratio_index[k] = index; + hQMetaData->q_direction[1].band_data[j].energy_ratio[k] = 1.0f - diffuseness_reconstructions_hr[index]; + + ratioSum = hQMetaData->q_direction[0].band_data[j].energy_ratio[k] + hQMetaData->q_direction[1].band_data[j].energy_ratio[k]; + if ( ratioSum > 1.0f ) + { + hQMetaData->q_direction[0].band_data[j].energy_ratio[k] /= ratioSum; + hQMetaData->q_direction[1].band_data[j].energy_ratio[k] /= ratioSum; + } + + needed_bits[1] += MASA_BITS_ER_HR; + hQMetaData->q_direction[1].band_data[j].bits_sph_idx[k] = bits_dir_hr; + } + } + } + else + { + int16_t pos_2dir_band[MASA_MAXIMUM_CODING_SUBBANDS]; + k = 0; + for ( j = hQMetaData->q_direction[0].cfg.start_band; j < hQMetaData->q_direction[0].cfg.nbands; j++ ) + { + if ( hQMetaData->twoDirBands[j] == 1 ) + { + pos_2dir_band[k] = j; + k++; + } + else + { + pos_2dir_band[k] = 0; + } + } + for ( j = hQMetaData->q_direction[1].cfg.start_band; j < hQMetaData->q_direction[1].cfg.nbands; j++ ) + { + for ( k = 0; k < hQMetaData->q_direction[1].cfg.nblocks; k++ ) + { + index = masa_sq( 1.0f - hQMetaData->q_direction[1].band_data[j].energy_ratio[k], diffuseness_thresholds_hr, HR_MASA_ER_LEVELS ); + push_next_indice( hMetaData, index, MASA_BITS_ER_HR ); + hQMetaData->q_direction[1].band_data[j].energy_ratio_index[k] = index; + hQMetaData->q_direction[1].band_data[j].energy_ratio[k] = 1.0f - diffuseness_reconstructions_hr[index]; + + ratioSum = hQMetaData->q_direction[0].band_data[pos_2dir_band[j]].energy_ratio[k] + hQMetaData->q_direction[1].band_data[j].energy_ratio[k]; + + if ( ratioSum > 1.0f ) + { + hQMetaData->q_direction[0].band_data[pos_2dir_band[j]].energy_ratio[k] /= ratioSum; + hQMetaData->q_direction[1].band_data[j].energy_ratio[k] /= ratioSum; + } + + needed_bits[1] += MASA_BITS_ER_HR; + hQMetaData->q_direction[1].band_data[j].bits_sph_idx[k] = bits_dir_hr; + } + } + } + } + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_qmetadata_entropy_encode_diffuseness() + * + * encode diffuseness + *------------------------------------------------------------------------*/ + +static int16_t ivas_qmetadata_entropy_encode_diffuseness_hr( + BSTR_ENC_HANDLE hMetaData, + IVAS_QDIRECTION *q_direction, + uint16_t *diffuseness_index_max_ec_frame ) +{ + int16_t start_bit_pos; + int16_t diffuseness_bits_raw; + int16_t b; + int16_t min_diffuseness_m_index, max_diffuseness_m_index; + int16_t nbands; + int16_t start_band; + + nbands = q_direction->cfg.nbands; + start_band = q_direction->cfg.start_band; + + start_bit_pos = hMetaData->nb_bits_tot; + + if ( nbands == 1 ) + { + /* If there is only one band, diffuseness should be coded directly as raw with no signaling. */ + push_next_indice( hMetaData, q_direction->band_data[0].energy_ratio_index[0], MASA_BITS_ER_HR ); + *diffuseness_index_max_ec_frame = 10; + return ( hMetaData->nb_bits_tot - start_bit_pos ); + } + + /* compute the number of raw coding bits */ + diffuseness_bits_raw = 0; + for ( b = start_band; b < nbands; b++ ) + { + diffuseness_bits_raw += ivas_qmetadata_encode_quasi_uniform_length( q_direction->band_data[b].energy_ratio_index[0], HR_MASA_ER_LEVELS ); + } + + min_diffuseness_m_index = q_direction->band_data[start_band].energy_ratio_index[0]; + max_diffuseness_m_index = q_direction->band_data[start_band].energy_ratio_index[0]; + + for ( b = start_band; b < nbands; b++ ) + { + if ( q_direction->band_data[b].energy_ratio_index[0] < min_diffuseness_m_index ) + { + min_diffuseness_m_index = q_direction->band_data[b].energy_ratio_index[0]; + } + + if ( q_direction->band_data[b].energy_ratio_index[0] > max_diffuseness_m_index ) + { + max_diffuseness_m_index = q_direction->band_data[b].energy_ratio_index[0]; + } + } + + /* Use similarity coding approach or raw coding when there is a low number of bands. */ + /* one bit is used to indicate whether diffuseness values are entropy coded or coded raw */ + if ( min_diffuseness_m_index == max_diffuseness_m_index ) /* all values are equal */ + { + push_next_indice( hMetaData, 0, 1 ); /* dif_use_raw_coding */ + push_next_indice( hMetaData, 1, 1 ); /* dif_have_unique_value */ + ivas_qmetadata_encode_quasi_uniform( hMetaData, min_diffuseness_m_index, HR_MASA_ER_LEVELS ); /* dif_unique_value */ + } + else if ( min_diffuseness_m_index + 1 == max_diffuseness_m_index ) /* only two consecutive values are present */ + { + push_next_indice( hMetaData, 0, 1 ); /* dif_use_raw_coding */ + push_next_indice( hMetaData, 0, 1 ); /* dif_have_unique_value */ + ivas_qmetadata_encode_quasi_uniform( hMetaData, min_diffuseness_m_index, HR_MASA_ER_LEVELS - 1 ); /* dif_min_value */ + + for ( b = start_band; b < nbands; b++ ) + { + push_next_indice( hMetaData, q_direction->band_data[b].energy_ratio_index[0] - min_diffuseness_m_index, 1 ); /* dif_bit_offset_values */ + } + } + else /* raw coding */ + { + push_next_indice( hMetaData, 1, 1 ); /* dif_use_raw_coding */ + + for ( b = start_band; b < nbands; b++ ) + { + ivas_qmetadata_encode_quasi_uniform( hMetaData, q_direction->band_data[b].energy_ratio_index[0], HR_MASA_ER_LEVELS ); /* dif_values */ + } + } + + *diffuseness_index_max_ec_frame = 10; + /* adaptively select the diffuseness_index_max_ec threshold */ + if ( min_diffuseness_m_index > 10 ) + { + *diffuseness_index_max_ec_frame = HR_MASA_ER_LEVELS - 1; + } + + return ( hMetaData->nb_bits_tot - start_bit_pos ); +} + + +/*------------------------------------------------------------------------- + * ivas_qmetadata_quantize_diffuseness_nrg_ratios() + * + * Quantize diffuseness + *------------------------------------------------------------------------*/ + +static void ivas_qmetadata_quantize_diffuseness_nrg_ratios( + IVAS_QMETADATA_HANDLE hQMetaData, + int16_t *needed_bits, + int16_t *nbits_diff, + int16_t *dfRatioBits, + const int16_t hodirac_flag ) +{ + int16_t j, k, dir2band; + int16_t index_dirRatio1Inv, index_dirRatio2Inv, index_dirRatio1Inv_mod, index_dirRatio2Inv_mod; + int16_t index_diff; + + nbits_diff[0] = 0; + nbits_diff[1] = 0; + needed_bits[0] = 0; + needed_bits[1] = 0; + dir2band = 0; + + for ( j = hQMetaData->q_direction[0].cfg.start_band; j < hQMetaData->q_direction[0].cfg.nbands; ++j ) + { + if ( hQMetaData->no_directions == 2 && hQMetaData->twoDirBands[j] == 1 ) + { + float diffRatio, dfRatio, dfRatioQ, diffRatioQ, dirRatio1Q, dirRatio2Q; + float dirRatio1, dirRatio2, sumRatio; + int16_t dfRatio_index, dfRatio_qsteps, dfRatio_bits; + + /* With 2dir metadata, we quantize and transmit diffuse-to-total ratio (diffRatio) and + * distribution factor of direct-to-total ratios (dFRatio). This is more efficient and + * accurate than simple separate quantization of each direct-to-total ratio or their + * separate inverses. */ + if ( hodirac_flag ) + { + /* already encoded as total and ratios in HO-DirAC */ + diffRatio = 1.f - hQMetaData->q_direction[0].band_data[j].energy_ratio[0]; + dfRatio = hQMetaData->q_direction[1].band_data[dir2band].energy_ratio[0]; + } + else + { + dirRatio1 = hQMetaData->q_direction[0].band_data[j].energy_ratio[0]; + dirRatio2 = hQMetaData->q_direction[1].band_data[dir2band].energy_ratio[0]; + sumRatio = dirRatio1 + dirRatio2; + diffRatio = 1.0f - sumRatio; + dfRatio = sumRatio < EPSILON ? 0.5f : dirRatio1 / sumRatio; + } + + + index_diff = masa_sq( diffRatio, diffuseness_thresholds, DIRAC_DIFFUSE_LEVELS ); + diffRatioQ = diffuseness_reconstructions[index_diff]; + + if ( hodirac_flag ) + { + dfRatio_bits = ivas_get_df_ratio_bits_hodirac( index_diff ); + } + else + { + dfRatio_bits = ivas_get_df_ratio_bits( index_diff ); + } + + dfRatioBits[dir2band] = dfRatio_bits; + + dfRatio_qsteps = ( 1 << dfRatio_bits ); + if ( hodirac_flag ) + { + dfRatio_index = usquant( dfRatio, &dfRatioQ, 0.0f, 1.f / ( dfRatio_qsteps - 1 ), dfRatio_qsteps ); + dirRatio1Q = 1.f - diffRatioQ; + dirRatio2Q = dfRatioQ; + } + else + { + dfRatio_index = usquant( dfRatio, &dfRatioQ, 0.5f, 0.5f / ( dfRatio_qsteps - 1 ), dfRatio_qsteps ); + + /* Direction quantization requires also separately quantized direct-to-total ratios. Thus, we calculate them. */ + dirRatio1Q = dfRatioQ * ( 1.0f - diffRatioQ ); + dirRatio2Q = ( 1.0f - diffRatioQ ) - dirRatio1Q; + } + + index_dirRatio1Inv = masa_sq( 1.0f - dirRatio1Q, diffuseness_thresholds, DIRAC_DIFFUSE_LEVELS ); + + /* Note: To save memory, we store temporarily index_diff and dfRatio_index into first and second direction + * energy ratio index variables until they have been encoded. index_dirRatio1Inv and index_dirRatio2Inv are + * then later retrieved for further use in encoding. */ + for ( k = 0; k < hQMetaData->q_direction[0].cfg.nblocks; k++ ) + { + hQMetaData->q_direction[0].band_data[j].energy_ratio_index[k] = index_diff; + hQMetaData->q_direction[0].band_data[j].energy_ratio[k] = dirRatio1Q; + } + nbits_diff[0] += MASA_BITS_ER; + + if ( hodirac_flag ) + { + float tmp; + index_dirRatio2Inv = usquant( dirRatio2Q, &tmp, 0.0f, 1.f / ( DIRAC_DIFFUSE_LEVELS - 1 ), DIRAC_DIFFUSE_LEVELS ); + } + else + { + index_dirRatio2Inv = masa_sq( 1.0f - dirRatio2Q, diffuseness_thresholds, DIRAC_DIFFUSE_LEVELS ); + } + + for ( k = 0; k < hQMetaData->q_direction[1].cfg.nblocks; k++ ) + { + hQMetaData->q_direction[1].band_data[dir2band].energy_ratio_index[k] = dfRatio_index; + hQMetaData->q_direction[1].band_data[dir2band].energy_ratio[k] = dirRatio2Q; + } + nbits_diff[1] += dfRatio_bits; + + /* Obtain compensated direct-to-total ratios for direction quantization. This compensates for the + * fact that with 2dir data, it is harder to achieve separate high direct-to-total ratio values + * which are assumed by the direction quantization system. In practice, this improves direction + * accuracy when it is perceptual meaningful. */ + masa_compensate_two_dir_energy_ratio_index( index_dirRatio1Inv, index_dirRatio2Inv, &index_dirRatio1Inv_mod, &index_dirRatio2Inv_mod, hodirac_flag ); + + for ( k = 0; k < hQMetaData->q_direction[0].cfg.nblocks; k++ ) + { + hQMetaData->q_direction[0].band_data[j].energy_ratio_index_mod[k] = index_dirRatio1Inv_mod; + hQMetaData->q_direction[0].band_data[j].bits_sph_idx[k] = bits_direction_masa[index_dirRatio1Inv_mod]; + } + needed_bits[0] += hQMetaData->q_direction[0].cfg.nblocks * bits_direction_masa[index_dirRatio1Inv_mod]; + + for ( k = 0; k < hQMetaData->q_direction[1].cfg.nblocks; k++ ) + { + hQMetaData->q_direction[1].band_data[dir2band].energy_ratio_index_mod[k] = index_dirRatio2Inv_mod; + hQMetaData->q_direction[1].band_data[dir2band].bits_sph_idx[k] = bits_direction_masa[index_dirRatio2Inv_mod]; + } + needed_bits[1] += hQMetaData->q_direction[1].cfg.nblocks * bits_direction_masa[index_dirRatio2Inv_mod]; + + dir2band++; + } + else + { + index_dirRatio1Inv = masa_sq( 1.0f - hQMetaData->q_direction[0].band_data[j].energy_ratio[0], diffuseness_thresholds, DIRAC_DIFFUSE_LEVELS ); + + for ( k = 0; k < hQMetaData->q_direction[0].cfg.nblocks; k++ ) + { + hQMetaData->q_direction[0].band_data[j].energy_ratio_index[k] = index_dirRatio1Inv; + hQMetaData->q_direction[0].band_data[j].energy_ratio_index_mod[k] = index_dirRatio1Inv; + hQMetaData->q_direction[0].band_data[j].energy_ratio[k] = 1.0f - diffuseness_reconstructions[index_dirRatio1Inv]; + hQMetaData->q_direction[0].band_data[j].bits_sph_idx[k] = bits_direction_masa[index_dirRatio1Inv]; + } + + nbits_diff[0] += MASA_BITS_ER; + + needed_bits[0] += hQMetaData->q_direction[0].cfg.nblocks * bits_direction_masa[index_dirRatio1Inv]; + } + } + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_diffuseness_huff_ec_encode() + * + * + *------------------------------------------------------------------------*/ + +static int16_t ivas_diffuseness_huff_ec_encode( + BSTR_ENC_HANDLE hMetaData, + const uint16_t idx ) +{ + int16_t nbits; + nbits = 0; + if ( idx <= DIFF_EC_HUFF_GR0_LIMIT ) + { + if ( idx > 0 ) + { + push_next_indice( hMetaData, ( 1 << idx ) - 1, idx ); + nbits += idx; + } + push_next_indice( hMetaData, 0, 1 ); + nbits += 1; + } + else + { + push_next_indice( hMetaData, 511, DIFF_EC_HUFF_GR0_LIMIT + 1 ); + push_next_indice( hMetaData, idx - DIFF_EC_HUFF_GR0_LIMIT - 1, 2 ); + nbits += DIFF_EC_HUFF_GR0_LIMIT + 3; + } + return nbits; +} + + +/*------------------------------------------------------------------------- + * ivas_diffuseness_huff_ec_prepare() + * + * + *------------------------------------------------------------------------*/ + +static void ivas_diffuseness_huff_ec_prepare( + IVAS_QDIRECTION *q_direction, + int16_t *best_av, + uint16_t *avr_idx, + int16_t *diffuseness_bits_huff ) +{ + int16_t bits; + int16_t av_crt; + int16_t av; + int16_t sh_idx; + uint16_t ui_sh_idx[MASA_MAXIMUM_CODING_SUBBANDS]; + int16_t b, start_band, nbands; + + start_band = q_direction->cfg.start_band; + nbands = q_direction->cfg.nbands; + + *diffuseness_bits_huff = 0; + av = 0; + for ( b = start_band; b < nbands; b++ ) + { + av += q_direction->band_data[b].energy_ratio_index[0]; + } + av = (int16_t) ( 0.5f + av / (float) nbands ); + *best_av = av; + + *diffuseness_bits_huff = MAX16B; + for ( av_crt = av - 1; av_crt <= av + 1; av_crt++ ) + { + bits = 0; + for ( b = start_band; b < nbands; b++ ) + { + sh_idx = q_direction->band_data[b].energy_ratio_index[0] - av_crt; + ui_sh_idx[b] = ( sh_idx <= 0 ) ? ( -2 * sh_idx ) : sh_idx * 2 - 1; + if ( ui_sh_idx[b] >= 2 * DIRAC_DIFFUSE_LEVELS - 3 ) + { + bits = 100; /* to avoid difference larger than 6 in absolute value */ + } + + bits += ( ui_sh_idx[b] <= DIFF_EC_HUFF_GR0_LIMIT ) ? ( ui_sh_idx[b] + 1 ) : 11; + } + + if ( bits < *diffuseness_bits_huff ) + { + *diffuseness_bits_huff = bits; + mvs2s( (int16_t *) ui_sh_idx, (int16_t *) avr_idx, nbands ); + *best_av = av_crt; + } + } + + *diffuseness_bits_huff += MASA_BITS_ER; /* for the average */ + + return; +} + +/*------------------------------------------------------------------------- + * ivas_qmetadata_entropy_encode_diffuseness() + * + * encode diffuseness + *------------------------------------------------------------------------*/ + +static int16_t ivas_qmetadata_entropy_encode_diffuseness( + BSTR_ENC_HANDLE hMetaData, + IVAS_QDIRECTION *q_direction, + uint16_t *diffuseness_index_max_ec_frame ) +{ + int16_t start_bit_pos; + int16_t diffuseness_bits_raw; + int16_t b; + int16_t min_diffuseness_m_index, max_diffuseness_m_index; + int16_t nbands; + int16_t start_band; + + nbands = q_direction->cfg.nbands; + start_band = q_direction->cfg.start_band; + + start_bit_pos = hMetaData->nb_bits_tot; + + if ( nbands == 1 ) + { + /* If there is only one band, diffuseness should be coded directly as raw with no signaling. */ + push_next_indice( hMetaData, q_direction->band_data[0].energy_ratio_index[0], MASA_BITS_ER ); + *diffuseness_index_max_ec_frame = 5; + return ( hMetaData->nb_bits_tot - start_bit_pos ); + } + + /* compute the number of raw coding bits */ + diffuseness_bits_raw = 0; + for ( b = start_band; b < nbands; b++ ) + { + diffuseness_bits_raw += ivas_qmetadata_encode_quasi_uniform_length( q_direction->band_data[b].energy_ratio_index[0], DIRAC_DIFFUSE_LEVELS ); + } + + min_diffuseness_m_index = q_direction->band_data[start_band].energy_ratio_index[0]; + max_diffuseness_m_index = q_direction->band_data[start_band].energy_ratio_index[0]; + + for ( b = start_band; b < nbands; b++ ) + { + if ( q_direction->band_data[b].energy_ratio_index[0] < min_diffuseness_m_index ) + { + min_diffuseness_m_index = q_direction->band_data[b].energy_ratio_index[0]; + } + + if ( q_direction->band_data[b].energy_ratio_index[0] > max_diffuseness_m_index ) + { + max_diffuseness_m_index = q_direction->band_data[b].energy_ratio_index[0]; + } + } + + if ( nbands < DIFF_EC_HUFF_BAND_LIMIT ) + { + /* Use similarity coding approach or raw coding when there is a low number of bands. */ + /* one bit is used to indicate whether diffuseness values are entropy coded or coded raw */ + if ( min_diffuseness_m_index == max_diffuseness_m_index ) /* all values are equal */ + { + push_next_indice( hMetaData, 0, 1 ); /* dif_use_raw_coding */ + push_next_indice( hMetaData, 1, 1 ); /* dif_have_unique_value */ + ivas_qmetadata_encode_quasi_uniform( hMetaData, min_diffuseness_m_index, DIRAC_DIFFUSE_LEVELS ); /* dif_unique_value */ + } + else if ( min_diffuseness_m_index + 1 == max_diffuseness_m_index ) /* only two consecutive values are present */ + { + push_next_indice( hMetaData, 0, 1 ); /* dif_use_raw_coding */ + push_next_indice( hMetaData, 0, 1 ); /* dif_have_unique_value */ + ivas_qmetadata_encode_quasi_uniform( hMetaData, min_diffuseness_m_index, DIRAC_DIFFUSE_LEVELS - 1 ); /* dif_min_value */ + + for ( b = start_band; b < nbands; b++ ) + { + push_next_indice( hMetaData, q_direction->band_data[b].energy_ratio_index[0] - min_diffuseness_m_index, 1 ); /* dif_bit_offset_values */ + } + } + else /* raw coding */ + { + push_next_indice( hMetaData, 1, 1 ); /* dif_use_raw_coding */ + + for ( b = start_band; b < nbands; b++ ) + { + ivas_qmetadata_encode_quasi_uniform( hMetaData, q_direction->band_data[b].energy_ratio_index[0], DIRAC_DIFFUSE_LEVELS ); /* dif_values */ + } + } + } + else + { + /* Use Huffman-coding approach or raw coding when there is a high number of bands. */ + int16_t diffuseness_bits_huff; + int16_t best_av; + uint16_t avr_idx[MASA_MAXIMUM_CODING_SUBBANDS]; + + /* First, obtain average indices and bit usage for Huffman-coding. */ + ivas_diffuseness_huff_ec_prepare( q_direction, &best_av, avr_idx, &diffuseness_bits_huff ); + + /* If there is benefit, use Huffman-coding. Otherwise, use raw coding. */ + if ( diffuseness_bits_huff < diffuseness_bits_raw ) + { + /* Signal Huffman EC */ + push_next_indice( hMetaData, 0, 1 ); + push_next_indice( hMetaData, best_av, MASA_BITS_ER ); + for ( b = start_band; b < nbands; b++ ) + { + ivas_diffuseness_huff_ec_encode( hMetaData, avr_idx[b] ); + } + } + else + { + /* Signal raw */ + push_next_indice( hMetaData, 1, 1 ); + for ( b = start_band; b < nbands; b++ ) + { + ivas_qmetadata_encode_quasi_uniform( hMetaData, q_direction->band_data[b].energy_ratio_index[0], DIRAC_DIFFUSE_LEVELS ); /* dif_values */ + } + } + } + + *diffuseness_index_max_ec_frame = 5; + /* adaptively select the diffuseness_index_max_ec threshold */ + if ( min_diffuseness_m_index > 5 ) + { + *diffuseness_index_max_ec_frame = DIRAC_DIFFUSE_LEVELS - 1; + } + + + return ( hMetaData->nb_bits_tot - start_bit_pos ); +} + + +/*------------------------------------------------------------------------- + * ivas_qmetadata_entropy_encode_df_ratio() + * + * encode dfRatio + *------------------------------------------------------------------------*/ + +static int16_t ivas_qmetadata_entropy_encode_df_ratio( + BSTR_ENC_HANDLE hMetaData, + IVAS_QDIRECTION *q_direction, + int16_t *df_ratio_bits ) +{ + int16_t start_bit_pos; + int16_t bits_raw; + int16_t b; + int16_t min_index, max_index; + int16_t nbands, start_band; + int16_t max_df_ratio_bits; + int16_t ec_mode = 0; + int16_t max_alphabet_size; + + nbands = q_direction->cfg.nbands; + start_band = q_direction->cfg.start_band; + + start_bit_pos = hMetaData->nb_bits_tot; + + if ( nbands == 1 ) + { + /* If there is only one band, ratio should be coded directly as raw with no signaling. */ + push_next_indice( hMetaData, q_direction->band_data[0].energy_ratio_index[0], df_ratio_bits[0] ); + + return ( hMetaData->nb_bits_tot - start_bit_pos ); + } + + /* compute the number of raw coding bits */ + bits_raw = 0; + max_df_ratio_bits = 0; + for ( b = start_band; b < nbands; b++ ) + { + bits_raw += df_ratio_bits[b]; + max_df_ratio_bits = max( df_ratio_bits[b], max_df_ratio_bits ); + } + + min_index = q_direction->band_data[start_band].energy_ratio_index[0]; + max_index = q_direction->band_data[start_band].energy_ratio_index[0]; + for ( b = start_band; b < nbands; b++ ) + { + if ( q_direction->band_data[b].energy_ratio_index[0] < min_index ) + { + min_index = q_direction->band_data[b].energy_ratio_index[0]; + } + + if ( q_direction->band_data[b].energy_ratio_index[0] > max_index ) + { + max_index = q_direction->band_data[b].energy_ratio_index[0]; + } + } + + /* Decide what modes are possible */ + if ( bits_raw >= max_df_ratio_bits + 2 + nbands ) + { + ec_mode = 2; + } + else if ( bits_raw >= max_df_ratio_bits + 1 ) + { + ec_mode = 1; + } + else + { + ec_mode = 0; + } + max_alphabet_size = 1 << max_df_ratio_bits; + + if ( min_index == max_index && ec_mode > 0 ) /* all values are equal */ + { + push_next_indice( hMetaData, 0, 1 ); /* Signal between EC and raw */ + if ( ec_mode > 1 ) + { + /* Only use bit for signaling if necessary */ + push_next_indice( hMetaData, 0, 1 ); /* Signal between one value or bandwise diff mode */ + } + + ivas_qmetadata_encode_quasi_uniform( hMetaData, min_index, max_alphabet_size ); + } + else if ( min_index + 1 == max_index && ec_mode > 1 ) /* only two consecutive values are present */ + { + push_next_indice( hMetaData, 0, 1 ); + push_next_indice( hMetaData, 1, 1 ); + ivas_qmetadata_encode_quasi_uniform( hMetaData, min_index, max_alphabet_size - 1 ); + + for ( b = start_band; b < nbands; b++ ) + { + push_next_indice( hMetaData, q_direction->band_data[b].energy_ratio_index[0] - min_index, 1 ); /* Band-wise offset values */ + } + } + else /* raw coding */ + { + if ( ec_mode > 0 ) + { + push_next_indice( hMetaData, 1, 1 ); /* Only signal raw mode if not implicitly using it */ + } + + for ( b = start_band; b < nbands; b++ ) + { + ivas_qmetadata_encode_quasi_uniform( hMetaData, q_direction->band_data[b].energy_ratio_index[0], 1 << df_ratio_bits[b] ); /* dif_values */ + } + } + + return ( hMetaData->nb_bits_tot - start_bit_pos ); +} + + +/*------------------------------------------------------------------------- + * restore_metadata_buffer() + * + * Restore metadata buffer + *------------------------------------------------------------------------*/ + +void restore_metadata_buffer( + BSTR_ENC_HANDLE hMetaData, + const int16_t next_ind_start, + const int16_t bit_pos_start ) +{ + int16_t i; + + for ( i = next_ind_start; i < hMetaData->nb_ind_tot; i++ ) + { + hMetaData->ind_list[i].nb_bits = -1; + } + hMetaData->nb_bits_tot = bit_pos_start; + hMetaData->nb_ind_tot = next_ind_start; + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_qmetadata_encode_quasi_uniform() + * + * encode value using a quasi-uniform code of b or b + 1 bits, where b = floor(log2(alphabet_size)) + *------------------------------------------------------------------------*/ + +static void ivas_qmetadata_encode_quasi_uniform( + BSTR_ENC_HANDLE hMetaData, + const uint16_t value, + const uint16_t alphabet_size ) +{ + int16_t bits; + uint16_t tresh; + + bits = 30 - norm_l( alphabet_size ); /* bits = floor(log2(alphabet_size)) */ + tresh = ( 1U << ( bits + 1 ) ) - alphabet_size; + + if ( value < tresh ) + { + push_next_indice( hMetaData, value, bits ); + } + else /* value >= tresh */ + { + push_next_indice( hMetaData, value + tresh, bits + 1 ); + } + + return; +} + + +/*-----------------------------------------------------------------------* + * GR encoder function definitions + *-----------------------------------------------------------------------*/ +/*------------------------------------------------------------------------- + * GR_bits_new() + * + * + *------------------------------------------------------------------------*/ + +/*! r: number of bits using Golomb Rice code */ +static int16_t GR_bits_new( + uint16_t *data, /* i : data to encode with GR */ + int16_t *no_symb, /* i : number of symbols for each component*/ + const int16_t no_data, /* i : number of input data */ + const int16_t GR_order, /* i : GR order to be used */ + const int16_t check_two_orders, /* i : check also coding with GR_order-1 */ + int16_t *real_GR_ord /* o : the GR order that has been used */ +) +{ + int16_t nbits = 0, i; + int16_t nbits1 = 0; + int16_t nb; + + for ( i = 0; i < no_data; i++ ) + { + nb = ivas_qmetadata_encode_extended_gr_length( data[i], no_symb[i], GR_order ); + nbits += nb; + } + + if ( check_two_orders == 1 ) + { + for ( i = 0; i < no_data; i++ ) + { + nb = ivas_qmetadata_encode_extended_gr_length( data[i], no_symb[i], GR_order - 1 ); + nbits1 += nb; + } + + if ( nbits1 < nbits ) + { + nbits = nbits1 + 1; + *real_GR_ord = GR_order - 1; + } + else + { + nbits += 1; + *real_GR_ord = GR_order; + } + } + else + { + *real_GR_ord = GR_order; + } + + return nbits; +} + + +/*------------------------------------------------------------------------- + * GR_bits_azimuth_context() + * + * Encoding azimuth indexes with GR code using context + *------------------------------------------------------------------------*/ + +/*! r: numer of bits used for coding */ +static int16_t GR_bits_azimuth_context( + uint16_t *data_in, /* i : data to be encoded */ + int16_t *no_symb, /* i : number of symbols for each component */ + const int16_t no_data_in, /* i : number of input data */ + const int16_t GR_order, /* i : GR order (GR_order or GR_order-1 are used ) */ + const uint16_t *bits_dir, /* i : bits for encoding the direction for each TF tile */ + int16_t *real_GR_ord, /* o : which GR order has been used */ + int16_t *p_use_context /* o : flag telling if context has been used or not */ +) +{ + int16_t i, nbits, nbits1, use_context; + uint16_t cdata[MAX_PARAM_SPATIAL_SUBFRAMES]; + uint16_t data[MAX_PARAM_SPATIAL_SUBFRAMES]; + int16_t min_val, max_val; + int16_t real_GR_ord1; + int16_t no_symb_local[MAX_PARAM_SPATIAL_SUBFRAMES]; + int16_t no_data = 0; + + for ( i = 0; i < no_data_in; i++ ) + { + if ( data_in[i] < MASA_NO_INDEX ) + { + no_symb_local[no_data] = no_symb[i]; + data[no_data++] = data_in[i]; + } + } + + if ( no_data == 0 ) + { + *p_use_context = -3; /* corresponding to nothing to be written */ + return 0; + } + + nbits = 0; + use_context = 0; + + for ( i = 0; i < no_data; i++ ) + { + if ( ( bits_dir[i] <= 1 ) ) + { + nbits += bits_dir[i]; + use_context = 1; + } + else + { + *real_GR_ord = GR_order - ( bits_dir[i] == 2 ); + nbits += ivas_qmetadata_encode_extended_gr_length( data[i], no_symb_local[i], *real_GR_ord ); + } + } + + real_GR_ord1 = 0; + if ( use_context == 0 ) + { + nbits = GR_bits_new( data, no_symb_local, no_data, GR_order, 1, real_GR_ord ); + nbits1 = nbits; + + min_val = data[0]; + for ( i = 1; i < no_data; i++ ) + { + if ( data[i] < min_val ) + { + min_val = data[i]; + } + } + for ( i = 0; i < no_data; i++ ) + { + cdata[i] = data[i] - min_val; + } + + maximum_s( no_symb_local, no_data, &max_val ); + nbits1 = GR_bits_new( cdata, no_symb_local, no_data, GR_order - 1, 1, &real_GR_ord1 ) + ivas_qmetadata_encode_extended_gr_length( min_val, max_val, MASA_GR_ORD_AZ ); + + if ( nbits1 < nbits ) + { + nbits = nbits1 + 1; + use_context = -2; + *real_GR_ord = real_GR_ord1; + } + else + { + nbits = nbits + 1; + use_context = -1; + } + } + + *p_use_context = use_context; + + return nbits; +} + + +/*------------------------------------------------------------------------- + * mean_removed_GR_new() + * + * Golomb Rice encoding with mean removing + *------------------------------------------------------------------------*/ + +/*! r: number of bits used */ +static int16_t mean_removed_GR_new( + const uint16_t *idx, /* i : data to encode */ + const int16_t max_no_symb, + const int16_t len, /* i : number of data */ + const int16_t adapt_GR, /* i : flag for telling to use or nor two GR order values */ + int16_t *GR_ord, /* i/o: GR order */ + uint16_t *p_av, /* o : average index */ + uint16_t *mr_idx /* o : mean removed indexes */ +) +{ + int16_t av, i, nbits; + int16_t sh_idx[MASA_MAXIMUM_CODING_SUBBANDS]; + int16_t max_ns[MASA_MAXIMUM_CODING_SUBBANDS]; + + av = (int16_t) ( 0.5f + sum_s( (const int16_t *) idx, len ) / (float) len ); + *p_av = av; + for ( i = 0; i < len; i++ ) + { + max_ns[i] = 2 * ( max_no_symb ); + sh_idx[i] = idx[i] - av; + } + + for ( i = 0; i < len; i++ ) + { + if ( sh_idx[i] < 0 ) + { + sh_idx[i] = -2 * sh_idx[i]; + } + else if ( sh_idx[i] > 0 ) + { + sh_idx[i] = sh_idx[i] * 2 - 1; + } + else + { + sh_idx[i] = 0; + } + mr_idx[i] = (uint16_t) sh_idx[i]; + } + + nbits = GR_bits_new( mr_idx, max_ns, len, *GR_ord, adapt_GR, GR_ord ); + + return nbits; +} + + +/*------------------------------------------------------------------------- + * ivas_qmetadata_encode_quasi_uniform_length() + * + *------------------------------------------------------------------------*/ + +static int16_t ivas_qmetadata_encode_quasi_uniform_length( + const uint16_t value, + const uint16_t alphabet_size ) +{ + int16_t bits; + uint16_t tresh; + + bits = 30 - norm_l( alphabet_size ); /* bits = floor(log2(alphabet_size)) */ + tresh = ( 1U << ( bits + 1 ) ) - alphabet_size; + + if ( value >= tresh ) + { + bits++; + } + + return bits; +} + + +/*------------------------------------------------------------------------- + * ivas_qmetadata_entropy_encode_dir() + * + * Main function for entropy coding of the directions + *------------------------------------------------------------------------*/ + +static int16_t ivas_qmetadata_entropy_encode_dir( + BSTR_ENC_HANDLE hMetaData, + IVAS_QDIRECTION *q_direction, + const uint16_t diffuseness_index_max_ec_frame, + const int16_t nbands, + const int16_t start_band, + const int16_t direction_bits_raw, + int16_t max_bits, + const int16_t hrmasa_flag ) +{ + uint16_t diff_idx_min; + int16_t i, j; + int16_t nblocks; + + float avg_direction_vector[3], direction_vector[3], avg_azimuth, avg_elevation; + int16_t avg_azimuth_alphabet, avg_elevation_alphabet; + uint16_t avg_azimuth_index, avg_elevation_index; + int16_t avg_elevation_index_projected; + int16_t avg_azimuth_index_projected; + uint16_t avg_elevation_index_initial, avg_elevation_offset; + uint16_t avg_azimuth_index_initial, avg_azimuth_offset; + int16_t elevation_bits_ec_best, azimuth_bits_ec_best; + + int16_t gr_param_elevation_best = 0, avg_elevation_index_best = 0; + uint16_t dist_elevation_indexes_best[MAX_PARAM_SPATIAL_SUBFRAMES * MASA_MAXIMUM_CODING_SUBBANDS]; + int16_t gr_param_azimuth_best, avg_azimuth_index_best; + uint16_t dist_azimuth_indexes_best[MAX_PARAM_SPATIAL_SUBFRAMES * MASA_MAXIMUM_CODING_SUBBANDS]; + + uint16_t idx, dist_count; + int16_t direction_bits_ec; + + uint16_t dist_elevation_indexes[MAX_PARAM_SPATIAL_SUBFRAMES * MASA_MAXIMUM_CODING_SUBBANDS]; + uint16_t dist_elevation_alphabets[MAX_PARAM_SPATIAL_SUBFRAMES * MASA_MAXIMUM_CODING_SUBBANDS]; + uint16_t dist_azimuth_indexes[MAX_PARAM_SPATIAL_SUBFRAMES * MASA_MAXIMUM_CODING_SUBBANDS]; + uint16_t dist_azimuth_alphabets[MAX_PARAM_SPATIAL_SUBFRAMES * MASA_MAXIMUM_CODING_SUBBANDS]; + int16_t all_zero_dist_elevation_indexes = 1, all_zero_dist_azimuth_indexes = 1; + int16_t gr_param_elevation, gr_size_elevation, egr_size_elevation, gr_param_azimuth, gr_size_azimuth; + int16_t egr_size_azimuth, elevation_bits_ec, azimuth_bits_ec; + + float abs_theta; + float theta_cb[MAX_NO_THETA]; + int16_t sign_th, no_th; + int16_t avg_azimuth_index_upd = 0, use_adapt_avg; + int16_t make_gain = 0; + int16_t bits_gained = 0; + nblocks = q_direction->cfg.nblocks; + + /* estimate the number of bits for entropy coding of the direction values */ + direction_bits_ec = 0; + diff_idx_min = DIRAC_DIFFUSE_LEVELS; + idx = 0; + dist_count = 0; + set_zero( avg_direction_vector, 3 ); + + for ( i = start_band; i < nbands; i++ ) + { + if ( hrmasa_flag ) + { + diff_idx_min = 0; // min( q_direction->band_data[i].energy_ratio_index_mod[0]>>1, diff_idx_min ); + } + else + { + diff_idx_min = min( q_direction->band_data[i].energy_ratio_index_mod[0], diff_idx_min ); + } + + if ( q_direction->band_data[i].energy_ratio_index_mod[0] > diffuseness_index_max_ec_frame ) + { + /* estimate the raw part */ + if ( q_direction->not_in_2D > 0 ) + { + for ( j = 0; j < nblocks; j++ ) + { + direction_bits_ec += q_direction->band_data[i].bits_sph_idx[j]; + } + } + else + { + for ( j = 0; j < nblocks; j++ ) + { + direction_bits_ec += ivas_qmetadata_encode_quasi_uniform_length( q_direction->band_data[i].azimuth_index[j], q_direction->band_data[i].azimuth_m_alphabet[j] ); + } + } + } + else + { + dist_count += nblocks; + + for ( j = 0; j < nblocks; j++ ) + { + /*compute the average direction */ + ivas_qmetadata_azimuth_elevation_to_direction_vector( q_direction->band_data[i].azimuth[j], q_direction->band_data[i].elevation[j], direction_vector ); + v_add( avg_direction_vector, direction_vector, avg_direction_vector, 3 ); + } + } + } + + /* quantize average elevation and azimuth angles using the best angle spacing and equatorial precision */ + ivas_qmetadata_direction_vector_to_azimuth_elevation( avg_direction_vector, &avg_azimuth, &avg_elevation ); + + if ( q_direction->cfg.mc_ls_setup != MC_LS_SETUP_INVALID ) + { + avg_elevation_alphabet = no_theta_masa[bits_direction_masa[diff_idx_min] - 3]; + avg_azimuth_alphabet = no_phi_masa[bits_direction_masa[diff_idx_min] - 1][0]; /* average azimuth is quantized on the equatorial plane */ + } + else + { + avg_elevation_alphabet = no_theta_masa[bits_direction_masa[diff_idx_min] - 3] * 2 - 1; + avg_azimuth_alphabet = no_phi_masa[bits_direction_masa[diff_idx_min] - 1][0]; /* average azimuth is quantized on the equatorial plane */ + } + + no_th = no_theta_masa[bits_direction_masa[diff_idx_min] - 3]; + + for ( i = 0; i < no_th; i++ ) + { + theta_cb[i] = i * delta_theta_masa[bits_direction_masa[diff_idx_min] - 3]; + } + + if ( theta_cb[i - 1] > 90 ) + { + theta_cb[i - 1] = 90; + } + + if ( avg_elevation < 0 ) + { + abs_theta = -avg_elevation; + sign_th = -1; + } + else + { + abs_theta = avg_elevation; + sign_th = 1; + } + + avg_elevation_index = squant( abs_theta, &avg_elevation, theta_cb, no_th ); + + if ( q_direction->cfg.mc_ls_setup != MC_LS_SETUP_INVALID ) + { + assert( avg_elevation >= 0 ); + } + else + { + if ( sign_th < 0 ) + { + avg_elevation_index = ( avg_elevation_alphabet >> 1 ) - avg_elevation_index; + } + else + { + avg_elevation_index += ( avg_elevation_alphabet >> 1 ); + } + avg_elevation *= sign_th; + } + + avg_azimuth_index = (uint16_t) ( quantize_phi( avg_azimuth + 180, 0, &avg_azimuth, avg_azimuth_alphabet ) ); + + /* Elevation only if not 2D */ + if ( q_direction->not_in_2D > 0 ) + { + avg_elevation_index_initial = avg_elevation_index; + elevation_bits_ec_best = MAX16B; + avg_elevation_index_best = -1; /* out of range value */ + gr_param_elevation_best = -1; /* out of range value */ + + for ( avg_elevation_offset = 0; avg_elevation_offset < q_direction->cfg.search_effort; avg_elevation_offset++ ) + { + if ( q_direction->cfg.mc_ls_setup != MC_LS_SETUP_INVALID ) + { + avg_elevation_index = avg_elevation_index_initial + avg_elevation_offset; + } + else + { + avg_elevation_index = (uint16_t) ( avg_elevation_index_initial + ivas_qmetadata_dereorder_generic( avg_elevation_offset ) ); + } + avg_elevation_index = (uint16_t) ( ( avg_elevation_index + avg_elevation_alphabet ) % avg_elevation_alphabet ); + + all_zero_dist_elevation_indexes = 1; + if ( q_direction->cfg.mc_ls_setup != MC_LS_SETUP_INVALID ) + { + elevation_bits_ec = ivas_qmetadata_encode_quasi_uniform_length( avg_elevation_index, avg_elevation_alphabet ); + } + else + { + elevation_bits_ec = ivas_qmetadata_encode_quasi_uniform_length( ivas_qmetadata_reorder_generic( avg_elevation_index - ( avg_elevation_alphabet >> 1 ) ), avg_elevation_alphabet ); + } + idx = 0; + for ( i = start_band; i < nbands; i++ ) + { + if ( q_direction->band_data[i].energy_ratio_index_mod[0] <= diffuseness_index_max_ec_frame ) + { + for ( j = 0; j < nblocks; j++ ) + { + /* project the quantized average elevation to the same grid as the current sample */ + if ( q_direction->cfg.mc_ls_setup != MC_LS_SETUP_INVALID ) + { + avg_elevation_index_projected = ivas_chan_project_elevation_index( avg_elevation_index, avg_elevation_alphabet, q_direction->band_data[i].elevation_m_alphabet[j] ); + } + else + { + avg_elevation_index_projected = ivas_dirac_project_elevation_index( avg_elevation_index, avg_elevation_alphabet, q_direction->band_data[i].elevation_m_alphabet[j] ); + } + + if ( q_direction->cfg.mc_ls_setup != MC_LS_SETUP_INVALID ) + { + if ( q_direction->band_data[i].elevation_index[j] - avg_elevation_index_projected > 0 ) + { + dist_elevation_indexes[idx] = 2 * ( q_direction->band_data[i].elevation_index[j] - avg_elevation_index_projected ) - 1; + } + else + { + dist_elevation_indexes[idx] = -2 * ( q_direction->band_data[i].elevation_index[j] - avg_elevation_index_projected ); + } + } + else + { + dist_elevation_indexes[idx] = ivas_qmetadata_reorder_elevation_index( q_direction->band_data[i].elevation_index[j], avg_elevation_index_projected, q_direction->band_data[i].elevation_m_alphabet[j] ); + } + if ( q_direction->cfg.mc_ls_setup != MC_LS_SETUP_INVALID ) + { + dist_elevation_alphabets[idx] = 2 * q_direction->band_data[i].elevation_m_alphabet[j] - 1; + } + else + { + dist_elevation_alphabets[idx] = q_direction->band_data[i].elevation_m_alphabet[j]; + } + + if ( dist_elevation_indexes[idx] != 0 ) + { + all_zero_dist_elevation_indexes = 0; + } + idx++; + } + } + } + + if ( all_zero_dist_elevation_indexes ) + { + egr_size_elevation = 0; + gr_param_elevation = 4; + } + else + { + gr_param_elevation = ivas_qmetadata_get_optimal_gr_param( dist_elevation_indexes, idx, 4, &gr_size_elevation ); + egr_size_elevation = 0; + for ( i = 0; i < idx; i++ ) + { + egr_size_elevation += ivas_qmetadata_encode_extended_gr_length( dist_elevation_indexes[i], dist_elevation_alphabets[i], gr_param_elevation ); + } + } + elevation_bits_ec += ivas_qmetadata_encode_quasi_uniform_length( gr_param_elevation, 4 + 1 ) + egr_size_elevation; + + if ( elevation_bits_ec < elevation_bits_ec_best ) + { + elevation_bits_ec_best = elevation_bits_ec; + avg_elevation_index_best = avg_elevation_index; + gr_param_elevation_best = gr_param_elevation; + for ( idx = 0; idx < dist_count; idx++ ) + { + dist_elevation_indexes_best[idx] = dist_elevation_indexes[idx]; + } + } + } + + direction_bits_ec += elevation_bits_ec_best; + } + + /*Azimuth*/ + use_adapt_avg = 0; + if ( ( nbands - start_band >= 5 ) && ( q_direction->cfg.mc_ls_setup != MC_LS_SETUP_INVALID ) && ( nblocks > 1 ) ) + { + use_adapt_avg = calc_var_azi( q_direction, diffuseness_index_max_ec_frame, avg_azimuth - 180, &avg_azimuth ); + avg_azimuth_index = (uint16_t) ( quantize_phi( avg_azimuth + 180, 0, &avg_azimuth, avg_azimuth_alphabet ) ); + } + avg_azimuth_index_initial = avg_azimuth_index; /* avg_azimuth_index;*/ + azimuth_bits_ec_best = MAX16B; + avg_azimuth_index_best = -1; /* out of range value */ + gr_param_azimuth_best = -1; /* out of range value */ + + for ( avg_azimuth_offset = 0; avg_azimuth_offset < q_direction->cfg.search_effort; avg_azimuth_offset++ ) + { + set_zero( avg_direction_vector, 3 ); + avg_azimuth_index = (uint16_t) ( avg_azimuth_index_initial + ivas_qmetadata_dereorder_generic( avg_azimuth_offset ) ); + avg_azimuth_index = (uint16_t) ( ( avg_azimuth_index + avg_azimuth_alphabet ) % avg_azimuth_alphabet ); + all_zero_dist_azimuth_indexes = 1; + azimuth_bits_ec = ivas_qmetadata_encode_quasi_uniform_length( ivas_qmetadata_reorder_generic( avg_azimuth_index - ( avg_azimuth_alphabet >> 1 ) ), avg_azimuth_alphabet ); + + idx = 0; + for ( i = start_band; i < nbands; i++ ) + { + if ( q_direction->band_data[i].energy_ratio_index_mod[0] <= diffuseness_index_max_ec_frame ) + { + for ( j = 0; j < nblocks; j++ ) + { + + if ( ( idx > MASA_LIMIT_IDX_AVG_AZI ) && ( q_direction->cfg.mc_ls_setup != MC_LS_SETUP_INVALID ) && ( use_adapt_avg == 1 ) ) + { + avg_azimuth_index_projected = ivas_dirac_project_azimuth_index( avg_azimuth_index_upd, avg_azimuth_alphabet, q_direction->band_data[i].azimuth_m_alphabet[j] ); + } + else + { + if ( ( q_direction->cfg.mc_ls_setup != MC_LS_SETUP_INVALID ) && ( use_adapt_avg == 1 ) ) + { + ivas_qmetadata_azimuth_elevation_to_direction_vector( q_direction->band_data[i].azimuth[j], q_direction->band_data[i].elevation[j], direction_vector ); + if ( idx < 4 ) + { + v_add( avg_direction_vector, direction_vector, avg_direction_vector, 3 ); + } + } + /* project the quantized average azimuth angle to the same grid as the current sample */ + avg_azimuth_index_projected = ivas_dirac_project_azimuth_index( avg_azimuth_index, avg_azimuth_alphabet, q_direction->band_data[i].azimuth_m_alphabet[j] ); + } + dist_azimuth_indexes[idx] = ivas_qmetadata_reorder_azimuth_index( ivas_qmetadata_dereorder_generic( q_direction->band_data[i].azimuth_index[j] ) + ( q_direction->band_data[i].azimuth_m_alphabet[j] >> 1 ), avg_azimuth_index_projected, q_direction->band_data[i].azimuth_m_alphabet[j] ); + dist_azimuth_alphabets[idx] = q_direction->band_data[i].azimuth_m_alphabet[j]; + + if ( dist_azimuth_indexes[idx] != 0 ) + { + all_zero_dist_azimuth_indexes = 0; + } + + if ( ( idx >= MASA_LIMIT_IDX_AVG_AZI ) && ( q_direction->cfg.mc_ls_setup != MC_LS_SETUP_INVALID ) && ( use_adapt_avg == 1 ) ) + { + if ( idx % nblocks == 0 ) + { + v_multc( avg_direction_vector, 0.5f, avg_direction_vector, 3 ); + } + + /*compute the average direction per already coded subband */ + ivas_qmetadata_azimuth_elevation_to_direction_vector( q_direction->band_data[i].azimuth[j], q_direction->band_data[i].elevation[j], direction_vector ); + v_add( avg_direction_vector, direction_vector, avg_direction_vector, 3 ); + ivas_qmetadata_direction_vector_to_azimuth_elevation( avg_direction_vector, &avg_azimuth, &avg_elevation ); + avg_azimuth_index_upd = quantize_phi( avg_azimuth + 180, 0, &avg_azimuth, avg_azimuth_alphabet ); + } + idx++; + } + } + } + + if ( all_zero_dist_azimuth_indexes ) + { + egr_size_azimuth = 0; + gr_param_azimuth = 5; + } + else + { + /* estimate the ExtendedGR part for azimuth */ + gr_param_azimuth = ivas_qmetadata_get_optimal_gr_param( dist_azimuth_indexes, idx, 5, &gr_size_azimuth ); + egr_size_azimuth = 0; + for ( i = 0; i < idx; i++ ) + { + egr_size_azimuth += ivas_qmetadata_encode_extended_gr_length( dist_azimuth_indexes[i], dist_azimuth_alphabets[i], gr_param_azimuth ); + } + } + + azimuth_bits_ec += ivas_qmetadata_encode_quasi_uniform_length( gr_param_azimuth, 5 + 1 ) + egr_size_azimuth; + + if ( azimuth_bits_ec < azimuth_bits_ec_best ) + { + azimuth_bits_ec_best = azimuth_bits_ec; + avg_azimuth_index_best = avg_azimuth_index; + gr_param_azimuth_best = gr_param_azimuth; + + for ( idx = 0; idx < dist_count; idx++ ) + { + dist_azimuth_indexes_best[idx] = dist_azimuth_indexes[idx]; + } + } + } + + if ( ( q_direction->cfg.mc_ls_setup != MC_LS_SETUP_INVALID ) && ( dist_count > 4 ) && ( gr_param_azimuth_best != 5 ) && ( nblocks > 1 ) ) + { + azimuth_bits_ec_best += 1; + } + + direction_bits_ec += azimuth_bits_ec_best; + + /*Decision raw or EC*/ + /* one bit is used to indicate whether the direction values are entropy coded or coded raw */ + if ( direction_bits_ec < direction_bits_raw ) /* entropy coding is better */ + { + + /* encode the raw part first */ + for ( i = start_band; i < nbands; i++ ) + { + if ( q_direction->band_data[i].energy_ratio_index_mod[0] > diffuseness_index_max_ec_frame ) + { + if ( q_direction->not_in_2D > 0 ) + { + for ( j = 0; j < nblocks; j++ ) + { + push_next_indice( hMetaData, q_direction->band_data[i].spherical_index[j], q_direction->band_data[i].bits_sph_idx[j] ); + } + } + else + { + for ( j = 0; j < nblocks; j++ ) + { + ivas_qmetadata_encode_quasi_uniform( hMetaData, q_direction->band_data[i].azimuth_index[j], q_direction->band_data[i].azimuth_m_alphabet[j] ); + } + } + } + } + + if ( nbands > 1 && direction_bits_ec - max_bits > 0 && direction_bits_ec - max_bits < nblocks * nbands ) + { + make_gain = 1; + } + + if ( q_direction->not_in_2D > 0 ) + { + /* encode the ExtendedGR part for elevation */ + if ( q_direction->cfg.mc_ls_setup != MC_LS_SETUP_INVALID ) + { + ivas_qmetadata_encode_quasi_uniform( hMetaData, avg_elevation_index_best, avg_elevation_alphabet ); + } + else + { + ivas_qmetadata_encode_quasi_uniform( hMetaData, ivas_qmetadata_reorder_generic( avg_elevation_index_best - ( avg_elevation_alphabet >> 1 ) ), avg_elevation_alphabet ); + } + + ivas_qmetadata_encode_quasi_uniform( hMetaData, gr_param_elevation_best, 4 + 1 ); + + if ( gr_param_elevation_best != 4 ) /* not all zero */ + { + for ( idx = 0; idx < dist_count; idx++ ) + { + ivas_qmetadata_encode_extended_gr( hMetaData, dist_elevation_indexes_best[idx], dist_elevation_alphabets[idx], gr_param_elevation_best ); + } + } + } + + /* encode the ExtendedGR part for azimuth */ + ivas_qmetadata_encode_quasi_uniform( hMetaData, ivas_qmetadata_reorder_generic( avg_azimuth_index_best - ( avg_azimuth_alphabet >> 1 ) ), avg_azimuth_alphabet ); + + ivas_qmetadata_encode_quasi_uniform( hMetaData, gr_param_azimuth_best, 5 + 1 ); + + if ( gr_param_azimuth_best != 5 ) /* not all zero */ + { + for ( idx = 0; idx < min( nblocks, dist_count ); idx++ ) + { + if ( make_gain == 1 && bits_gained < direction_bits_ec - max_bits && dist_azimuth_alphabets[idx] > 40 ) + { + if ( dist_azimuth_indexes_best[idx] > 1 ) + { + ivas_qmetadata_encode_extended_gr( hMetaData, dist_azimuth_indexes_best[idx] - 2, dist_azimuth_alphabets[idx], gr_param_azimuth_best ); + bits_gained += ivas_qmetadata_encode_extended_gr_length( dist_azimuth_indexes_best[idx], dist_azimuth_alphabets[idx], gr_param_azimuth_best ) - + ivas_qmetadata_encode_extended_gr_length( dist_azimuth_indexes_best[idx] - 2, dist_azimuth_alphabets[idx], gr_param_azimuth_best ); + } + else if ( dist_azimuth_indexes_best[idx] == 1 ) + { + ivas_qmetadata_encode_extended_gr( hMetaData, dist_azimuth_indexes_best[idx] - 1, dist_azimuth_alphabets[idx], gr_param_azimuth_best ); + bits_gained += ivas_qmetadata_encode_extended_gr_length( dist_azimuth_indexes_best[idx], dist_azimuth_alphabets[idx], gr_param_azimuth_best ) - + ivas_qmetadata_encode_extended_gr_length( dist_azimuth_indexes_best[idx] - 1, dist_azimuth_alphabets[idx], gr_param_azimuth_best ); + } + else + { + ivas_qmetadata_encode_extended_gr( hMetaData, dist_azimuth_indexes_best[idx], dist_azimuth_alphabets[idx], gr_param_azimuth_best ); + } + } + else + { + ivas_qmetadata_encode_extended_gr( hMetaData, dist_azimuth_indexes_best[idx], dist_azimuth_alphabets[idx], gr_param_azimuth_best ); + } + } + + if ( dist_count > nblocks ) + { + if ( ( q_direction->cfg.mc_ls_setup != MC_LS_SETUP_INVALID ) && ( nblocks > 1 ) ) + { + push_next_indice( hMetaData, use_adapt_avg, 1 ); + } + for ( idx = nblocks; idx < dist_count; idx++ ) + { + if ( make_gain == 1 && bits_gained < direction_bits_ec - max_bits && dist_azimuth_alphabets[idx] > 40 ) + { + if ( dist_azimuth_indexes_best[idx] > 1 ) + { + ivas_qmetadata_encode_extended_gr( hMetaData, dist_azimuth_indexes_best[idx] - 2, dist_azimuth_alphabets[idx], gr_param_azimuth_best ); + bits_gained += ivas_qmetadata_encode_extended_gr_length( dist_azimuth_indexes_best[idx], dist_azimuth_alphabets[idx], gr_param_azimuth_best ) - + ivas_qmetadata_encode_extended_gr_length( dist_azimuth_indexes_best[idx] - 2, dist_azimuth_alphabets[idx], gr_param_azimuth_best ); + } + else if ( dist_azimuth_indexes_best[idx] == 1 ) + { + ivas_qmetadata_encode_extended_gr( hMetaData, dist_azimuth_indexes_best[idx] - 1, dist_azimuth_alphabets[idx], gr_param_azimuth_best ); + bits_gained += ivas_qmetadata_encode_extended_gr_length( dist_azimuth_indexes_best[idx], dist_azimuth_alphabets[idx], gr_param_azimuth_best ) - + ivas_qmetadata_encode_extended_gr_length( dist_azimuth_indexes_best[idx] - 1, dist_azimuth_alphabets[idx], gr_param_azimuth_best ); + } + else + { + ivas_qmetadata_encode_extended_gr( hMetaData, dist_azimuth_indexes_best[idx], dist_azimuth_alphabets[idx], gr_param_azimuth_best ); + } + } + else + { + ivas_qmetadata_encode_extended_gr( hMetaData, dist_azimuth_indexes_best[idx], dist_azimuth_alphabets[idx], gr_param_azimuth_best ); + } + } + } + } + + direction_bits_ec -= bits_gained; + } + else + { + direction_bits_ec = -1; + } + + return direction_bits_ec; +} + + +/*------------------------------------------------------------------------- + * ivas_qmetadata_raw_encode_dir() + * + * Main function for raw coding of the directions (writing and bit estimation) + *------------------------------------------------------------------------*/ + +static int16_t ivas_qmetadata_raw_encode_dir( + BSTR_ENC_HANDLE hMetaData, + IVAS_QDIRECTION *q_direction, + const int16_t nbands, + const int16_t start_band ) +{ + int16_t i, j; + int16_t direction_bits_raw; + int16_t start_bits = 0; /*To avoid compiler warning*/ + + direction_bits_raw = 0; + if ( hMetaData != NULL ) + { + start_bits = hMetaData->nb_bits_tot; + } + + if ( q_direction->not_in_2D > 0 ) + { + for ( i = start_band; i < nbands; i++ ) + { + if ( hMetaData != NULL ) + { + for ( j = 0; j < q_direction->cfg.nblocks; j++ ) + { + push_next_indice( hMetaData, q_direction->band_data[i].spherical_index[j], q_direction->band_data[i].bits_sph_idx[j] ); + } + } + else + { + direction_bits_raw += q_direction->cfg.nblocks * q_direction->band_data[i].bits_sph_idx[0]; + } + } + } + else + { + for ( i = start_band; i < nbands; i++ ) + { + for ( j = 0; j < q_direction->cfg.nblocks; j++ ) + { + if ( hMetaData != NULL ) + { + ivas_qmetadata_encode_quasi_uniform( hMetaData, q_direction->band_data[i].azimuth_index[j], q_direction->band_data[i].azimuth_m_alphabet[j] ); + } + else + { + direction_bits_raw += ivas_qmetadata_encode_quasi_uniform_length( + q_direction->band_data[i].azimuth_index[j], q_direction->band_data[i].azimuth_m_alphabet[j] ); + } + } + } + } + + if ( hMetaData != NULL ) + { + direction_bits_raw = hMetaData->nb_bits_tot - start_bits; + } + + return direction_bits_raw; +} + + +/*------------------------------------------------------------------------- + * ivas_qmetadata_get_optimal_gr_param() + * + * + *------------------------------------------------------------------------*/ + +static int16_t ivas_qmetadata_get_optimal_gr_param( + uint16_t *unsigned_data, + const int16_t count, + const int16_t gr_param_count, + int16_t *opt_gr_size ) +{ + int16_t opt_bits, bits, idx; + int16_t opt_gr_param; + int16_t p; + + opt_bits = MAX16B; + opt_gr_param = -1; + + for ( p = 0; p < gr_param_count; p++ ) + { + bits = count * ( 1 + p ); /* terminating zero bit and the lsb bits */ + for ( idx = 0; idx < count; idx++ ) + { + bits += unsigned_data[idx] >> p; /* leading one bits */ + } + + if ( bits < opt_bits ) + { + opt_gr_param = p; + opt_bits = bits; + } + } + + *opt_gr_size = opt_bits; + + return opt_gr_param; +} + + +/*------------------------------------------------------------------------- + * ivas_qmetadata_encode_extended_gr_length() + * + * + *------------------------------------------------------------------------*/ + +int16_t +ivas_qmetadata_encode_extended_gr_length( + const uint16_t value, + const uint16_t alphabet_size, + const int16_t gr_param ) +{ + uint16_t msb_alphabet_size; + int16_t bits; + uint16_t msb, lsb; + + + msb_alphabet_size = ( alphabet_size + ( 1U << gr_param ) - 1 ) >> gr_param; + + if ( msb_alphabet_size <= 3 ) + { + /* EncodeQuasiUniform is always equal or better than Limited GR with up to 3 msb values */ + bits = ivas_qmetadata_encode_quasi_uniform_length( value, alphabet_size ); + } + else + { + msb = value >> gr_param; + + bits = msb; /* leading one bits */ + if ( msb < msb_alphabet_size - 1 ) + { + bits += 1 + gr_param; /* terminating zero bit, if not the largest msb (Limited GR), and the lsb bits */ + } + else + { + lsb = value & ( ( 1U << gr_param ) - 1 ); + bits += ivas_qmetadata_encode_quasi_uniform_length( lsb, alphabet_size - ( ( msb_alphabet_size - 1 ) << gr_param ) ); + } + } + + return bits; +} + + +/*------------------------------------------------------------------------- + * ivas_qmetadata_reorder_elevation_index() + * + * + *------------------------------------------------------------------------*/ + +static int16_t ivas_qmetadata_reorder_elevation_index( + const int16_t elevation_index, + const int16_t avg_elevation_index, + const int16_t elevation_alphabet ) +{ + int16_t elevation_alphabet_half; + int16_t elevation_index_reordered; + + elevation_alphabet_half = elevation_alphabet >> 1; + elevation_index_reordered = elevation_index - avg_elevation_index; + + /* reduce the distance for the index elevation to the range [-elevation_alphabet_half, elevation_alphabet_half] */ + if ( elevation_index_reordered < -elevation_alphabet_half ) + { + elevation_index_reordered += elevation_alphabet; + } + else if ( elevation_index_reordered > elevation_alphabet_half ) + { + elevation_index_reordered -= elevation_alphabet; + } + + /* fold reduced signed distance value for converting to unsigned */ + elevation_index_reordered = ivas_qmetadata_reorder_generic( elevation_index_reordered ); + + return elevation_index_reordered; +} + + +/*------------------------------------------------------------------------- + * ivas_qmetadata_reorder_azimuth_index() + * + * + *------------------------------------------------------------------------*/ + +static int16_t ivas_qmetadata_reorder_azimuth_index( + const int16_t azimuth_index, + const int16_t avg_azimuth_index, + const int16_t azimuth_alphabet ) +{ + int16_t azimuth_alphabet_half; + int16_t azimuth_index_reordered; + + azimuth_index_reordered = azimuth_index - avg_azimuth_index; + + if ( ( azimuth_alphabet != 1 ) && ( ( azimuth_alphabet & 0x01 ) == 1 ) ) + { + return ( ivas_qmetadata_reorder_elevation_index( azimuth_index, avg_azimuth_index, azimuth_alphabet ) ); + } + else if ( azimuth_alphabet != 1 ) + { + azimuth_alphabet_half = azimuth_alphabet >> 1; + /* reduce the distance for the index azimuth to the range [-azimuth_alphabet_half, azimuth_alphabet_half - 1] */ + if ( azimuth_index_reordered < -azimuth_alphabet_half ) + { + azimuth_index_reordered += azimuth_alphabet; + } + else if ( azimuth_index_reordered > azimuth_alphabet_half - 1 ) + { + azimuth_index_reordered -= azimuth_alphabet; + } + /* fold reduced signed distance value for converting to unsigned */ + azimuth_index_reordered = ivas_qmetadata_reorder_generic( azimuth_index_reordered ); + } + else + { + /* for North and South poles, a single azimuth direction exists */ + azimuth_index_reordered = 0; + + } + + return azimuth_index_reordered; +} + + +/*------------------------------------------------------------------------- + * ivas_qmetadata_encode_extended_gr() + * + * + *------------------------------------------------------------------------*/ + +void ivas_qmetadata_encode_extended_gr( + BSTR_ENC_HANDLE hMetaData, + const uint16_t value, + const uint16_t alphabet_size, + const int16_t gr_param ) +{ + uint16_t msb_alphabet_size; + uint16_t msb, lsb, cnt; + + + msb_alphabet_size = ( alphabet_size + ( 1U << gr_param ) - 1 ) >> gr_param; + + if ( msb_alphabet_size <= 3 ) + { + /* EncodeQuasiUniform is always equal or better than Limited GR with up to 3 msb values */ + ivas_qmetadata_encode_quasi_uniform( hMetaData, value, alphabet_size ); + } + else + { + msb = value >> gr_param; + lsb = value & ( ( 1U << gr_param ) - 1 ); + + for ( cnt = 0; cnt < msb; cnt++ ) + { + /* leading one bits */ + push_next_indice( hMetaData, 1, 1 ); + } + + if ( msb < msb_alphabet_size - 1 ) + { + push_next_indice( hMetaData, 0, 1 ); /* terminating zero bit, if not the largest msb (Limited GR) */ + if ( gr_param > 0 ) + { + push_next_indice( hMetaData, lsb, gr_param ); + } + } + else + { + ivas_qmetadata_encode_quasi_uniform( hMetaData, lsb, alphabet_size - ( ( msb_alphabet_size - 1 ) << gr_param ) ); + } + } + + return; +} + + +/*-----------------------------------------------------------------------* + * Local functions (EC3, requantize directions) + *-----------------------------------------------------------------------*/ + +static int16_t truncGR0( + float *data, + float *data_hat, + uint16_t *data_idx, + const int16_t len, + const int16_t bits_allowed, + float *st, + float *ct ) +{ + int16_t i; + int16_t bits; + const int16_t remap3b[8] = { 1, 6, 2, 4, 0, 5, 3, 7 }; + const int16_t remap2b[4] = { 1, 2, 0, 3 }; + float diff[MAX_PARAM_SPATIAL_SUBFRAMES]; + int16_t indx[MAX_PARAM_SPATIAL_SUBFRAMES]; + + bits = 0; + set_f( data_hat, 0.0f, len ); + set_f( diff, 10000.0f, len ); + + if ( bits_allowed <= len + 1 ) + { + bits = min( bits_allowed, len ); + set_f( data_hat, 0.0f, len ); + /*set_s(data_idx, 0, len); */ + for ( i = 0; i < bits; i++ ) + { + if ( fabsf( data[i] ) <= 90 ) + { + data_idx[i] = 0; + data_hat[i] = 0.0f; + } + else + { + data_idx[i] = 1; + data_hat[i] = -180.0f; + } + } + + return bits; + } + + for ( i = 0; i < len; i++ ) + { + data_idx[i] = quantize_phi( data[i] + 180, 0, &data_hat[i], 8 ); + data_hat[i] -= 180; + data_idx[i] = remap3b[data_idx[i]]; + bits += ivas_qmetadata_encode_extended_gr_length( data_idx[i], 8, 0 ); + diff[i] = -st[i] - ct[i] * cosf( PI_OVER_180 * ( data[i] - data_hat[i] ) ); /*(data[i] - data_hat[i])*(data[i] - data_hat[i]);*/ + } + + i = 0; + if ( bits > bits_allowed ) + { + sort_desc_ind( diff, len, indx ); + for ( i = len - 1; i >= 0; i-- ) + { + if ( data_idx[indx[i]] > 3 ) + { + bits -= ivas_qmetadata_encode_extended_gr_length( data_idx[indx[i]], 8, 0 ); + data_idx[indx[i]] = quantize_phi( data[indx[i]] + 180, 0, &data_hat[indx[i]], 4 ); + data_hat[indx[i]] -= 180; + data_idx[indx[i]] = remap2b[data_idx[indx[i]]]; + bits += ivas_qmetadata_encode_extended_gr_length( data_idx[indx[i]], 8, 0 ); + diff[indx[i]] = -st[i] - ct[i] * cosf( PI_OVER_180 * ( data[indx[i]] - data_hat[indx[i]] ) ); + } + if ( bits <= bits_allowed ) + { + break; + } + } + } + + if ( bits > bits_allowed ) + { + sort_desc_ind( diff, len, indx ); + for ( i = len - 1; i >= 0; i-- ) + { + + if ( data_idx[indx[i]] > 1 ) + { + bits -= ivas_qmetadata_encode_extended_gr_length( data_idx[indx[i]], 8, 0 ); + if ( fabsf( data[indx[i]] ) <= 90 ) + { + data_idx[indx[i]] = 0; + data_hat[indx[i]] = 0; + } + else + { + data_idx[indx[i]] = 1; + data_hat[indx[i]] = -180; + } + + bits += ivas_qmetadata_encode_extended_gr_length( data_idx[indx[i]], 8, 0 ); + diff[indx[i]] = -st[i] - ct[i] * cosf( PI_OVER_180 * ( data[indx[i]] - data_hat[indx[i]] ) ); + } + + if ( bits <= bits_allowed ) + { + break; + } + } + } + + if ( bits > bits_allowed ) + { + + + sort_desc_ind( diff, len, indx ); + for ( i = len - 1; i >= 0; i-- ) + { + + if ( data_idx[indx[i]] > 0 ) + { + bits -= data_idx[indx[i]]; + data_idx[indx[i]] = 0; + data_hat[indx[i]] = 0; + } + if ( bits <= bits_allowed ) + { + break; + } + } + } + + return bits; +} + + +/*-------------------------------------------------------------------* + * truncGR0_chan() + * + * + *-------------------------------------------------------------------*/ + +static int16_t truncGR0_chan( + const float *data, + float *data_hat, + uint16_t *data_idx, + const int16_t len, + const int16_t bits_allowed, + float *st, + float *ct ) +{ + int16_t i, idx_crt; + int16_t bits; + float diff[MAX_PARAM_SPATIAL_SUBFRAMES], sort_diff[MAX_PARAM_SPATIAL_SUBFRAMES], min_diff, sum_diff; + int16_t indx[MAX_PARAM_SPATIAL_SUBFRAMES]; + + bits = 0; + set_f( data_hat, 0.0f, len ); + set_f( diff, 10000.0f, len ); + + if ( bits_allowed <= len + 1 ) + { + bits = min( bits_allowed, len ); + set_f( data_hat, 0.0f, len ); + /*set_s(data_idx, 0, len); */ + for ( i = 0; i < bits; i++ ) + { + if ( fabsf( data[i] ) <= 90 ) + { + data_idx[i] = 0; + data_hat[i] = 0.0f; + } + else + { + data_idx[i] = 1; + data_hat[i] = -180.0f; + } + } + return bits; + } + + for ( i = 0; i < len; i++ ) + { + data_idx[i] = quantize_phi_chan_lbr( data[i], &data_hat[i], 9 ); + + bits += ivas_qmetadata_encode_extended_gr_length( data_idx[i], 9, 0 ); + diff[i] = -st[i] - ct[i] * cosf( ( data[i] - data_hat[i] ) * PI_OVER_180 ); + } + + while ( bits > bits_allowed ) + { + min_diff = 1000.0f; + idx_crt = -1; + mvr2r( diff, sort_diff, len ); + for ( i = 0; i < len; i++ ) + { + if ( data_idx[i] > 0 ) + { + sort_diff[i] = -st[i] - ct[i] * cosf( ( fabsf( data[i] ) - cb_azi_chan[( ( data_idx[i] + 1 ) >> 1 ) - 1] ) * PI_OVER_180 ); + sum_diff = sum_f( sort_diff, len ); + + if ( sum_diff < min_diff ) + { + min_diff = sum_diff; + idx_crt = i; + } + sort_diff[i] = diff[i]; + } + } + + if ( idx_crt > -1 ) + { + bits -= ivas_qmetadata_encode_extended_gr_length( data_idx[idx_crt], 9, 0 ); + data_idx[idx_crt] = quantize_phi_chan_lbr( data[idx_crt], &data_hat[idx_crt], data_idx[idx_crt] + 1 ); + bits += ivas_qmetadata_encode_extended_gr_length( data_idx[idx_crt], 9, 0 ); + diff[idx_crt] = -st[idx_crt] - ct[idx_crt] * cosf( ( data[idx_crt] - data_hat[idx_crt] ) * PI_OVER_180 ); + } + else + { + break; + } + } + + if ( bits > bits_allowed ) + { + mvr2r( diff, sort_diff, len ); + sort_desc_ind( sort_diff, len, indx ); + + for ( i = len - 1; i >= 0; i-- ) + { + idx_crt = indx[i]; + if ( data_idx[idx_crt] > 0 ) + { + bits -= ivas_qmetadata_encode_extended_gr_length( data_idx[idx_crt], 9, 0 ); + data_idx[idx_crt] = 0; + data_hat[idx_crt] = 0; + bits += 1; + } + + if ( bits <= bits_allowed ) + { + break; + } + } + } + + return bits; +} + + +/*-------------------------------------------------------------------* + * common_direction() + * + * + *-------------------------------------------------------------------*/ + +static int16_t common_direction( + IVAS_QDIRECTION *q_direction, + const int16_t band_idx, + const int16_t len, + const int16_t bits_allowed, + BSTR_ENC_HANDLE hMetaData, + float *elevation_orig, + float *azimuth_orig ) +{ + int16_t nbits; + int16_t no_th, i, id_th, k; + float theta_cb[5]; + float dist, best_dist; + float ct[MAX_PARAM_SPATIAL_SUBFRAMES], st[MAX_PARAM_SPATIAL_SUBFRAMES]; + + nbits = 0; + + if ( bits_allowed == 0 ) + { + for ( i = 0; i < len; i++ ) + { + q_direction->band_data[band_idx].elevation[i] = 0; + q_direction->band_data[band_idx].azimuth[i] = 0; + } + + return 0; + } + + if ( bits_allowed <= len + 1 ) + { + set_f( q_direction->band_data[band_idx].elevation, 0.0f, len ); + set_f( st, 0.0f, len ); + + for ( i = 0; i < len; i++ ) + { + ct[i] = cosf( elevation_orig[i] * PI_OVER_180 ); + } + + if ( q_direction->cfg.mc_ls_setup != MC_LS_SETUP_INVALID ) + { + nbits = truncGR0_chan( azimuth_orig, q_direction->band_data[band_idx].azimuth, q_direction->band_data[band_idx].azimuth_index, len, bits_allowed, st, ct ); + } + else + { + nbits = truncGR0( azimuth_orig, q_direction->band_data[band_idx].azimuth, q_direction->band_data[band_idx].azimuth_index, len, bits_allowed, st, ct ); + } + + for ( i = 0; i < nbits; i++ ) + { + push_next_indice( hMetaData, q_direction->band_data[band_idx].azimuth_index[i], 1 ); + } + + return nbits; + } + + no_th = no_theta_masa[0] + 3; /* only 5 values for theta; the lat 2 are +/-90 */ + + theta_cb[0] = 0; + theta_cb[1] = delta_theta_masa[2]; + theta_cb[2] = -theta_cb[1]; + theta_cb[3] = 90.0f; + theta_cb[4] = -90.0f; + best_dist = 900000.0f; + id_th = 0; + + for ( i = 0; i < no_th; i++ ) + { + dist = 0.0f; + for ( k = 0; k < len; k++ ) + { + dist += ( elevation_orig[k] - theta_cb[i] ) * ( elevation_orig[k] - theta_cb[i] ); + } + if ( dist < best_dist ) + { + id_th = i; + best_dist = dist; + } + } + + set_f( q_direction->band_data[band_idx].elevation, theta_cb[id_th], len ); + + for ( i = 0; i < len; i++ ) + { + q_direction->band_data[band_idx].elevation_index[i] = id_th; + } + + if ( id_th == 0 ) + { + push_next_indice( hMetaData, 0, 1 ); /* average theta index */ + set_f( st, 0.0f, len ); + + for ( i = 0; i < len; i++ ) + { + ct[i] = cosf( elevation_orig[i] * PI_OVER_180 ); + } + + if ( q_direction->cfg.mc_ls_setup != MC_LS_SETUP_INVALID ) + { + nbits = truncGR0_chan( azimuth_orig, q_direction->band_data[band_idx].azimuth, q_direction->band_data[band_idx].azimuth_index, len, bits_allowed - 1, st, ct ) + 1; + } + else + { + nbits = truncGR0( azimuth_orig, q_direction->band_data[band_idx].azimuth, q_direction->band_data[band_idx].azimuth_index, len, bits_allowed - 1, st, ct ) + 1; + } + } + else + { + if ( id_th >= 3 ) + { + /* theta is 90 or -90; only theta is sent */ + push_next_indice( hMetaData, id_th + 11, 4 ); /* average theta index */ + set_f( q_direction->band_data[band_idx].azimuth, 0.0f, len ); + for ( i = 0; i < len; i++ ) + { + q_direction->band_data[band_idx].azimuth_index[i] = 0; + } + nbits = 4; + + return nbits; + } + + set_f( st, sinf( theta_cb[id_th] * PI_OVER_180 ), len ); + set_f( ct, cosf( theta_cb[id_th] * PI_OVER_180 ), len ); + + for ( i = 0; i < len; i++ ) + { + st[i] *= sinf( elevation_orig[i] * PI_OVER_180 ); + ct[i] *= cosf( elevation_orig[i] * PI_OVER_180 ); + q_direction->band_data[band_idx].azimuth_index[i] = 0; + } + + if ( id_th == 1 ) + { + push_next_indice( hMetaData, 2, 2 ); /* average theta index */ + } + else + { + assert( id_th == 2 ); + push_next_indice( hMetaData, 6, 3 ); /* average theta index */ + } + + if ( q_direction->cfg.mc_ls_setup != MC_LS_SETUP_INVALID ) + { + nbits = truncGR0_chan( azimuth_orig, q_direction->band_data[band_idx].azimuth, q_direction->band_data[band_idx].azimuth_index, len, bits_allowed - ( id_th + 1 ), st, ct ) + ( id_th + 1 ); + } + else + { + nbits = truncGR0( azimuth_orig, q_direction->band_data[band_idx].azimuth, q_direction->band_data[band_idx].azimuth_index, len, bits_allowed - ( id_th + 1 ), st, ct ) + ( id_th + 1 ); + } + } + + if ( bits_allowed - ( id_th + 1 ) <= len + 1 ) + { + + for ( i = 0; i < min( len, bits_allowed - ( id_th + 1 ) ); i++ ) + { + push_next_indice( hMetaData, q_direction->band_data[band_idx].azimuth_index[i], 1 ); + } + } + else + { + if ( q_direction->cfg.mc_ls_setup != MC_LS_SETUP_INVALID ) + { + for ( i = 0; i < len; i++ ) + { + ivas_qmetadata_encode_extended_gr( hMetaData, q_direction->band_data[band_idx].azimuth_index[i], 9, 0 ); + } + } + else + { + for ( i = 0; i < len; i++ ) + { + ivas_qmetadata_encode_extended_gr( hMetaData, q_direction->band_data[band_idx].azimuth_index[i], 8, 0 ); + } + } + } + + return nbits; +} + + +/*-------------------------------------------------------------------* + * encode_directions_subband() + * + * + *-------------------------------------------------------------------*/ + +static int16_t encode_directions_subband( + IVAS_QDIRECTION *q_direction, + int16_t coding_subbands, + BSTR_ENC_HANDLE hMetaData, + const int16_t j, + const int16_t next_j, + const int16_t no_subframes, + const int16_t last_subband, + int16_t *p_diff, + float *elevation_orig, + float *azimuth_orig ) +{ + int16_t allowed_bits, use_vq, max_nb_idx, k; + int16_t diff; + float d1, d2; + int16_t nbits; + int16_t *bits_dir0; + + nbits = 0; + diff = *p_diff; + bits_dir0 = (int16_t *) q_direction->band_data[j].bits_sph_idx; + allowed_bits = sum_s( bits_dir0, no_subframes ); + + if ( allowed_bits > 0 ) + { + use_vq = 0; + max_nb_idx = 0; + + for ( k = 0; k < no_subframes; k++ ) + { + if ( bits_dir0[k] > use_vq ) + { + use_vq = bits_dir0[k]; + max_nb_idx = k; + } + } + + if ( no_subframes > 1 ) + { + if ( ( use_vq > 1 ) && ( use_vq <= LIMIT_USE_COMMON ) ) + { + bits_dir0[max_nb_idx] -= 1; + allowed_bits -= 1; + } + } + if ( no_subframes > 1 ) + { + if ( use_vq <= LIMIT_USE_COMMON ) + { + /* calculate the two distances */ + calculate_two_distances( q_direction->band_data[j].elevation, bits_dir0, allowed_bits, no_subframes, &d1, &d2 ); + if ( ( ( use_vq > 1 ) && ( d2 <= d1 ) ) || ( use_vq <= 1 ) ) + { + if ( use_vq > 1 ) + { + push_next_indice( hMetaData, 1, 1 ); /* signal VQ */ + } + + diff += common_direction( q_direction, j, no_subframes, allowed_bits, hMetaData, elevation_orig, azimuth_orig ) - allowed_bits; + + if ( last_subband == 0 ) + { + update_bits_next_block( q_direction, &diff, next_j, coding_subbands, no_subframes ); + } + } + else + { + push_next_indice( hMetaData, 0, 1 ); + + if ( last_subband == 0 ) + { + mvr2r( elevation_orig, q_direction->band_data[j].elevation, no_subframes ); + mvr2r( azimuth_orig, q_direction->band_data[j].azimuth, no_subframes ); + joint_encoding( q_direction, j, next_j, coding_subbands, bits_dir0, allowed_bits, hMetaData, &diff ); + } + else + { + for ( k = 0; k < no_subframes; k++ ) + { + /* requantize the direction */ + q_direction->band_data[j].spherical_index[k] = quantize_direction( elevation_orig[k], azimuth_orig[k], q_direction->band_data[j].bits_sph_idx[k], &q_direction->band_data[j].elevation[k], &q_direction->band_data[j].azimuth[k], + &q_direction->band_data[j].elevation_index[k], &q_direction->band_data[j].azimuth_index[k], q_direction->cfg.mc_ls_setup ); + } + + if ( allowed_bits > 0 ) + { + nbits = write_fixed_rate_direction( hMetaData, q_direction, j, no_subframes ); + } + } + } + } + else + { + /* there is only joint coding */ + mvr2r( elevation_orig, q_direction->band_data[j].elevation, no_subframes ); + mvr2r( azimuth_orig, q_direction->band_data[j].azimuth, no_subframes ); + + if ( last_subband == 0 ) + { + joint_encoding( q_direction, j, next_j, coding_subbands, bits_dir0, allowed_bits, hMetaData, &diff ); + } + else + { + for ( k = 0; k < no_subframes; k++ ) + { + /* requantize the direction */ + q_direction->band_data[j].spherical_index[k] = quantize_direction( elevation_orig[k], azimuth_orig[k], q_direction->band_data[j].bits_sph_idx[k], &q_direction->band_data[j].elevation[k], &q_direction->band_data[j].azimuth[k], + &q_direction->band_data[j].elevation_index[k], &q_direction->band_data[j].azimuth_index[k], q_direction->cfg.mc_ls_setup ); + } + + if ( allowed_bits > 0 ) + { + nbits = write_fixed_rate_direction( hMetaData, q_direction, j, no_subframes ); + } + } + } + } + else + { + /* 1 subframe case */ + /* there is only joint coding */ + mvr2r( elevation_orig, q_direction->band_data[j].elevation, no_subframes ); + mvr2r( azimuth_orig, q_direction->band_data[j].azimuth, no_subframes ); + + if ( last_subband == 0 ) + { + joint_encoding( q_direction, j, next_j, coding_subbands, bits_dir0, allowed_bits, hMetaData, &diff ); + } + else + { + for ( k = 0; k < no_subframes; k++ ) + { + /* requantize the direction */ + q_direction->band_data[j].spherical_index[k] = quantize_direction( elevation_orig[k], azimuth_orig[k], q_direction->band_data[j].bits_sph_idx[k], &q_direction->band_data[j].elevation[k], &q_direction->band_data[j].azimuth[k], + &q_direction->band_data[j].elevation_index[k], &q_direction->band_data[j].azimuth_index[k], q_direction->cfg.mc_ls_setup ); + } + + if ( allowed_bits > 0 ) + { + nbits = write_fixed_rate_direction( hMetaData, q_direction, j, no_subframes ); + } + } + } + } + else + { + set_f( q_direction->band_data[j].elevation, 0.0f, no_subframes ); + set_f( q_direction->band_data[j].azimuth, 0.0f, no_subframes ); + } + + *p_diff = diff; + + return nbits; +} + + +/*-------------------------------------------------------------------* + * calc_var_azi() + * + * + *-------------------------------------------------------------------*/ + +static int16_t calc_var_azi( + const IVAS_QDIRECTION *q_direction, + const int16_t diffuseness_index_max_ec_frame, + const float avg_azimuth, + float *avg_azimuth_out ) +{ + float var_band, dif; + float avg_direction_vector_band[3], avg_azimuth_band[24], direction_vector[3]; + float avg_elevation; + int16_t i, j, idx; + + idx = 0; + set_zero( avg_azimuth_band, 24 ); + + for ( i = 0; i < q_direction->cfg.nbands; i++ ) + { + set_zero( avg_direction_vector_band, 3 ); + if ( q_direction->band_data[i].energy_ratio_index_mod[0] <= diffuseness_index_max_ec_frame ) + { + for ( j = 0; j < q_direction->cfg.nblocks; j++ ) + { + /*compute the average direction */ + ivas_qmetadata_azimuth_elevation_to_direction_vector( q_direction->band_data[i].azimuth[j], q_direction->band_data[i].elevation[j], direction_vector ); + v_add( avg_direction_vector_band, direction_vector, avg_direction_vector_band, 3 ); + } + ivas_qmetadata_direction_vector_to_azimuth_elevation( avg_direction_vector_band, &avg_azimuth_band[idx], &avg_elevation ); + idx++; + } + } + + var_band = 0.0f; + + for ( i = 0; i < idx; i++ ) + { + dif = ( avg_azimuth_band[idx] - avg_azimuth ); + if ( dif < 0 ) + { + dif = -dif; + } + if ( dif > 180 ) + { + dif = 360 - dif; + } + + var_band += dif * dif; + } + + if ( idx > 0 ) + { + var_band = var_band / idx; + } + + if ( var_band <= VAR_AZI_THRESH ) + { + *avg_azimuth_out = avg_azimuth; + return 0; + } + else + { + *avg_azimuth_out = avg_azimuth_band[0]; + return 1; + } +} + + +/*-------------------------------------------------------------------* + * requantize_direction_EC_3() + * + * + *-------------------------------------------------------------------*/ + +static ivas_error requantize_direction_EC_3( + int16_t *extra_bits, + IVAS_QDIRECTION *q_direction, + const int16_t coding_subbands, + BSTR_ENC_HANDLE hMetaData, + float elevation_orig[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES], + float azimuth_orig[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES], + int16_t *ind_order ) +{ + /* gradually increase the bits following the performance of the EC layer*/ + int16_t j, k; + int16_t use_vq; + int16_t diff, allowed_bits, nbits, last_j; + int16_t no_subframes, start_band; + float st[MAX_PARAM_SPATIAL_SUBFRAMES], ct[MAX_PARAM_SPATIAL_SUBFRAMES]; + int16_t *bits_dir0; + + nbits = 0; + no_subframes = q_direction->cfg.nblocks; + start_band = q_direction->cfg.start_band; + + if ( q_direction->not_in_2D > MASA_LIMIT_2D ) + { + j = ind_order[coding_subbands - 1]; + bits_dir0 = (int16_t *) q_direction->band_data[j].bits_sph_idx; + allowed_bits = sum_s( bits_dir0, no_subframes ); + last_j = j - ( allowed_bits == 0 ); + diff = 0; + if ( coding_subbands == 1 ) + { + last_j = start_band; + } + for ( j = 0; j < last_j; j++ ) + { + k = ind_order[j]; + encode_directions_subband( q_direction, coding_subbands, hMetaData, k, ind_order[j + 1], no_subframes, 0, &diff, elevation_orig[k], azimuth_orig[k] ); + } + + /* last subbands to be written in fixed rate */ + for ( j = last_j; j < coding_subbands; j++ ) + { + k = ind_order[j]; + encode_directions_subband( q_direction, coding_subbands, hMetaData, k, 0, no_subframes, 1, &diff, elevation_orig[k], azimuth_orig[k] ); + } + } + else /* 2D */ + { + diff = 0; + nbits = 0; + for ( j = start_band; j < coding_subbands; j++ ) + { + bits_dir0 = (int16_t *) q_direction->band_data[j].bits_sph_idx; + allowed_bits = sum_s( bits_dir0, no_subframes ); + use_vq = 0; + + for ( k = 0; k < no_subframes; k++ ) + { + if ( bits_dir0[k] > use_vq ) + { + use_vq = bits_dir0[k]; + } + } + + if ( ( use_vq <= 3 ) && ( allowed_bits <= 11 ) ) + { + set_f( st, 0.0f, no_subframes ); + + for ( k = 0; k < no_subframes; k++ ) + { + ct[k] = cosf( elevation_orig[j][k] * PI_OVER_180 ); + } + + if ( q_direction->cfg.mc_ls_setup != MC_LS_SETUP_INVALID ) + { + nbits += truncGR0_chan( azimuth_orig[j], q_direction->band_data[j].azimuth, q_direction->band_data[j].azimuth_index, no_subframes, allowed_bits, st, ct ); + } + else + { + nbits += truncGR0( azimuth_orig[j], q_direction->band_data[j].azimuth, q_direction->band_data[j].azimuth_index, no_subframes, allowed_bits, st, ct ); + } + + if ( allowed_bits <= no_subframes + 1 ) + { + for ( k = 0; k < min( no_subframes, allowed_bits ); k++ ) + { + push_next_indice( hMetaData, q_direction->band_data[j].azimuth_index[k], 1 ); + } + } + else + { + for ( k = 0; k < no_subframes; k++ ) + { + ivas_qmetadata_encode_extended_gr( hMetaData, q_direction->band_data[j].azimuth_index[k], q_direction->cfg.mc_ls_setup != MC_LS_SETUP_INVALID ? 9 : 8, 0 ); + } + } + } + else + { + for ( k = 0; k < no_subframes; k++ ) + { + /* requantize the direction */ + q_direction->band_data[j].spherical_index[k] = quantize_direction2D( azimuth_orig[j][k], 1 << q_direction->band_data[j].bits_sph_idx[k], &q_direction->band_data[j].azimuth[k], + &q_direction->band_data[j].azimuth_index[k], q_direction->cfg.mc_ls_setup ); + q_direction->band_data[j].elevation_index[k] = 0; + } + nbits += write_fixed_rate_direction( hMetaData, q_direction, j, no_subframes ); + } + } + } + + *extra_bits = -diff; + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * write_fixed_rate_direction() + * + * writing of the spherical indexes + *-------------------------------------------------------------------*/ + +/*! r: number of bits written */ +static int16_t write_fixed_rate_direction( + BSTR_ENC_HANDLE hMetaData, /* i : MASA metadata structure */ + IVAS_QDIRECTION *qdirection, /* i/o: quantized directional parameters */ + const int16_t j_idx, /* i : index of subband for which the data is written */ + const int16_t len /* i : number of data */ +) +{ + int16_t nbits, i; + + nbits = 0; + for ( i = 0; i < len; i++ ) + { + push_next_indice( hMetaData, qdirection->band_data[j_idx].spherical_index[i], qdirection->band_data[j_idx].bits_sph_idx[i] ); + nbits += qdirection->band_data[j_idx].bits_sph_idx[i]; + } + + return nbits; +} + + +/*-------------------------------------------------------------------* + * joint_encoding() + * + * joint encoding of elevation and azimuth + *-------------------------------------------------------------------*/ + +static void joint_encoding( + IVAS_QDIRECTION *q_direction, /* i/o: quantized directional parameters */ + const int16_t j, /* i : subband index */ + const int16_t next_j, /* i : next subband index */ + const int16_t coding_subbands, /* i : total number of subband */ + int16_t *bits_dir0, /* i/o: number of bits for each tile in each subband */ + const int16_t allowed_bits, /* i : maximum number of bits available for the current subband */ + BSTR_ENC_HANDLE hMetaData, /* i/o: metadata bitstream handle */ + int16_t *diff /* o : bits to be given/taken to next subband */ +) +{ + int16_t k; + int16_t GR_ord_azimuth, use_context, GR_ord_elevation; + uint8_t method; + int16_t nbits; + int16_t same; + uint16_t data[MAX_PARAM_SPATIAL_SUBFRAMES]; + int16_t len_data = 0; + int16_t no_symb_ele[MAX_PARAM_SPATIAL_SUBFRAMES]; + + for ( k = 0; k < q_direction->cfg.nblocks; k++ ) + { + q_direction->band_data[j].bits_sph_idx[k] = bits_dir0[k]; + + /* requantize the direction */ + q_direction->band_data[j].spherical_index[k] = quantize_direction( q_direction->band_data[j].elevation[k], q_direction->band_data[j].azimuth[k], q_direction->band_data[j].bits_sph_idx[k], &q_direction->band_data[j].elevation[k], + &q_direction->band_data[j].azimuth[k], &q_direction->band_data[j].elevation_index[k], &q_direction->band_data[j].azimuth_index[k], q_direction->cfg.mc_ls_setup ); + + if ( bits_dir0[k] >= 3 ) + { + if ( q_direction->cfg.mc_ls_setup != MC_LS_SETUP_INVALID ) + { + q_direction->band_data[j].elevation_m_alphabet[k] = no_theta_masa[bits_dir0[k] - 3]; + q_direction->band_data[j].azimuth_m_alphabet[k] = no_phi_masa[bits_dir0[k] - 1][q_direction->band_data[j].elevation_index[k]]; + } + else + { + q_direction->band_data[j].elevation_m_alphabet[k] = no_theta_masa[bits_dir0[k] - 3] * 2 - 1; + q_direction->band_data[j].azimuth_m_alphabet[k] = no_phi_masa[bits_dir0[k] - 1][( q_direction->band_data[j].elevation_index[k] + 1 ) >> 1]; + } + assert( q_direction->band_data[j].elevation_index[k] != MASA_NO_INDEX ); + } + else if ( bits_dir0[k] > 0 ) + { + q_direction->band_data[j].elevation_m_alphabet[k] = 1; + q_direction->band_data[j].azimuth_m_alphabet[k] = no_phi_masa[bits_dir0[k] - 1][0]; + } + else + { + q_direction->band_data[j].elevation_m_alphabet[k] = 1; + q_direction->band_data[j].azimuth_m_alphabet[k] = 1; + } + } + + for ( k = 0; k < q_direction->cfg.nblocks; k++ ) + { + if ( q_direction->band_data[j].bits_sph_idx[k] <= 2 ) + { + q_direction->band_data[j].elevation_index[k] = MASA_NO_INDEX; + } + else + { + no_symb_ele[len_data] = q_direction->band_data[j].elevation_m_alphabet[k]; + data[len_data++] = q_direction->band_data[j].elevation_index[k]; + } + } + + + /* encode indexes for current subband and count the number of bits */ + + if ( q_direction->cfg.nblocks == 1 && q_direction->band_data[j].bits_sph_idx[0] <= MASA_MIN_BITS_TF + 1 ) + { + /* encode with fixed rate only if only one subframe and very low number of bits */ + nbits = write_fixed_rate_direction( hMetaData, q_direction, j, q_direction->cfg.nblocks ); + } + else + { + + if ( len_data > 0 ) + { + nbits = GR_bits_new( data, no_symb_ele, len_data, MASA_GR_ORD_EL, 1, &GR_ord_elevation ); + } + else + { + nbits = 0; + GR_ord_elevation = MASA_GR_ORD_EL; + } + + same = 1; + for ( k = 1; k < q_direction->cfg.nblocks; k++ ) + { + if ( q_direction->band_data[j].elevation_index[k] != q_direction->band_data[j].elevation_index[0] ) + { + same = 0; + } + } + if ( same == 1 && q_direction->band_data[j].elevation_index[0] < 4 ) + { + nbits = 3; + } + else + { + same = 0; + nbits += 1; + } + + nbits += GR_bits_azimuth_context( q_direction->band_data[j].azimuth_index, + q_direction->band_data[j].azimuth_m_alphabet, q_direction->cfg.nblocks, MASA_GR_ORD_AZ, + q_direction->band_data[j].bits_sph_idx, &GR_ord_azimuth, &use_context ); + + if ( allowed_bits == 0 ) + { + nbits = 0; + } + else + { + if ( nbits >= allowed_bits ) + { + nbits = allowed_bits + 1; /* fixed rate encoding */ + method = 1; + push_next_indice( hMetaData, method, 1 ); + + /* write current subband data */ + nbits = 1 + write_fixed_rate_direction( hMetaData, q_direction, j, q_direction->cfg.nblocks ); + } + else + { + nbits += 1; /* EC coding */ + method = 0; + push_next_indice( hMetaData, method, 1 ); + + /* write current subband data */ + write_ec_direction( &nbits, hMetaData, q_direction, j, q_direction->cfg.nblocks, GR_ord_elevation, GR_ord_azimuth, use_context, same ); + nbits++; + } + } + } + *diff += nbits - allowed_bits; + update_bits_next_block( q_direction, diff, next_j, coding_subbands, q_direction->cfg.nblocks ); + + return; +} + + +/*-------------------------------------------------------------------* + * calculate_two_distances() + * + * calculate estimated distortions if encoding with VQ or not + *-------------------------------------------------------------------*/ + +static void calculate_two_distances( + float *el, /* i : elevation values */ + int16_t *bits, /* i : number of bits for each tile */ + const int16_t total_bits, /* i : total number of bits for subband */ + const int16_t len, /* i : number of tiles */ + float *p_d1, /* o : first distortion */ + float *p_d2 /* o : second distortion */ +) +{ + int16_t i; + float d1, d2, el_av; + const float cos_delta_phi_cb[] = { 0.848f, 0.8988f, 0.9272f, 0.9563f, 0.9744f, 0.9816f, 0.9877f, 0.9925f }; + float var_el; + + d1 = 0.0f; + d2 = 0.0f; + + el_av = mean( el, len ); + if ( total_bits > 9 ) + { + for ( i = 0; i < len; i++ ) + { + if ( bits[i] > 2 ) + { + if ( fabsf( el[i] ) < fabsf( ( fabsf( el[i] ) - 45 ) ) ) + { + /* el_hat = 0*/ + if ( bits[i] == 3 ) + { + d1 += 1 - 0.7f * cosf( el[i] * PI_OVER_180 ); + } + else + { + d1 += 1 - 0.92f * cosf( el[i] * PI_OVER_180 ); + } + } + else + { + if ( bits[i] == 3 ) + { + d1 += 1 - sinf( el[i] * PI_OVER_180 ) * 0.7f * sign( el[i] ); + } + else + { + d1 += 1 - 0.7f * 0.92f * cosf( el[i] * PI_OVER_180 ) - sinf( fabsf( el[i] * PI_OVER_180 ) ) * 0.7f; + } + } + } + else + { + if ( bits[i] == 2 ) + { + d1 += 1 - cosf( el[i] * PI_OVER_180 ) * 0.7f; + } + else + { + d1 += 1; + } + } + d2 += 1 - sinf( el_av * PI_OVER_180 ) * sinf( el[i] * PI_OVER_180 ) - cosf( el[i] * PI_OVER_180 ) * cosf( el_av * PI_OVER_180 ) * cos_delta_phi_cb[total_bits - 9]; + } + } + + var_el = var( el, len ); + if ( var_el > 1300.0f ) + { + d2 = d1 + 0.1f; + } + + *p_d1 = d1; + *p_d2 = d2; + + return; +} + + +/*-------------------------------------------------------------------* + * write_ec_direction() + * + * write metadata using entropy encoding + *-------------------------------------------------------------------*/ + +/*! r: number of bits written */ +static ivas_error write_ec_direction( + int16_t *num_bits_written, /* o : Number of bits written */ + BSTR_ENC_HANDLE hMetaData, /* i : MASA metadata structure */ + IVAS_QDIRECTION *qdirection, /* i : quantized directional info */ + const int16_t j_idx, /* i : index of subband to encode and write */ + const int16_t len, /* i : number of tiles */ + const int16_t GR_ord_elevation, /* i : GR order for elevation encoding */ + const int16_t GR_ord_azimuth, /* i : GR order for azimuth encoding */ + const int16_t use_context, /* i : flag for context usiage in azimuth encoding */ + const int16_t same /* i : flag if elevation indexes are the same or not */ +) +{ + int16_t i, nbits, bits_crt, nr_NO_INDEX; + uint16_t data; + int16_t min_val, max_val; + + nr_NO_INDEX = 0; + + nbits = 0; + + /* write elevation */ + for ( i = 0; i < len; i++ ) + { + data = qdirection->band_data[j_idx].elevation_index[i]; + if ( ( data == MASA_NO_INDEX ) || ( qdirection->band_data[j_idx].bits_sph_idx[i] == 0 ) ) + { + nr_NO_INDEX += 1; + } + } + + if ( nr_NO_INDEX < len ) + { + if ( same == 1 ) + { + push_next_indice( hMetaData, 1, 1 ); + nbits += 1; + push_next_indice( hMetaData, qdirection->band_data[j_idx].elevation_index[0], 2 ); + nbits += 2; + } + else + { + push_next_indice( hMetaData, 0, 1 ); + nbits += 1; + + push_next_indice( hMetaData, 1 - ( GR_ord_elevation == MASA_GR_ORD_EL ), 1 ); + nbits += 1; + + for ( i = 0; i < len; i++ ) + { + data = qdirection->band_data[j_idx].elevation_index[i]; + if ( data < MASA_NO_INDEX ) + { + bits_crt = hMetaData->nb_bits_tot; + ivas_qmetadata_encode_extended_gr( hMetaData, data, qdirection->band_data[j_idx].elevation_m_alphabet[i], GR_ord_elevation ); + nbits += hMetaData->nb_bits_tot - bits_crt; + } + } + } + } + + /* write azimuth */ + if ( use_context < 0 ) + { + if ( use_context == -1 ) + { + /* regular GR coding */ + push_next_indice( hMetaData, 0, 1 ); + nbits += 1; + push_next_indice( hMetaData, 1 - ( GR_ord_azimuth == MASA_GR_ORD_AZ ), 1 ); + nbits += 1; + + for ( i = 0; i < len; i++ ) + { + data = qdirection->band_data[j_idx].azimuth_index[i]; + if ( data < MASA_NO_INDEX ) + { + bits_crt = hMetaData->nb_bits_tot; + ivas_qmetadata_encode_extended_gr( hMetaData, data, qdirection->band_data[j_idx].azimuth_m_alphabet[i], GR_ord_azimuth ); + nbits += hMetaData->nb_bits_tot - bits_crt; + } + } + } + else if ( use_context == -2 ) + { + /* min removed GR coding */ + push_next_indice( hMetaData, 1, 1 ); + nbits += 1; + push_next_indice( hMetaData, 1 - ( GR_ord_azimuth == MASA_GR_ORD_AZ - 1 ), 1 ); + nbits += 1; + + /* find min */ + min_val = MASA_NO_INDEX; + for ( i = 0; i < len; i++ ) + { + if ( qdirection->band_data[j_idx].azimuth_index[i] < min_val ) + { + min_val = qdirection->band_data[j_idx].azimuth_index[i]; + } + } + + + /* write min*/ + bits_crt = hMetaData->nb_bits_tot; + maximum_s( qdirection->band_data[j_idx].azimuth_m_alphabet, len, &max_val ); + ivas_qmetadata_encode_extended_gr( hMetaData, min_val, max_val, MASA_GR_ORD_AZ ); + nbits += hMetaData->nb_bits_tot - bits_crt; + + for ( i = 0; i < len; i++ ) + { + data = qdirection->band_data[j_idx].azimuth_index[i] - min_val; + if ( data < MASA_NO_INDEX - min_val ) + { + bits_crt = hMetaData->nb_bits_tot; + ivas_qmetadata_encode_extended_gr( hMetaData, data, qdirection->band_data[j_idx].azimuth_m_alphabet[i], GR_ord_azimuth ); + nbits += hMetaData->nb_bits_tot - bits_crt; + } + } + } + } + else + { + for ( i = 0; i < len; i++ ) + { + data = qdirection->band_data[j_idx].azimuth_index[i]; + if ( data < MASA_NO_INDEX ) + { + switch ( qdirection->band_data[j_idx].bits_sph_idx[i] ) + { + case 0: + break; + case 1: + nbits += 1; + push_next_indice( hMetaData, data, 1 ); + break; + case 2: + bits_crt = hMetaData->nb_bits_tot; + ivas_qmetadata_encode_extended_gr( hMetaData, data, qdirection->band_data[j_idx].azimuth_m_alphabet[i], MASA_GR_ORD_AZ - 1 ); + nbits += hMetaData->nb_bits_tot - bits_crt; + break; + default: + bits_crt = hMetaData->nb_bits_tot; + ivas_qmetadata_encode_extended_gr( hMetaData, data, qdirection->band_data[j_idx].azimuth_m_alphabet[i], MASA_GR_ORD_AZ ); + nbits += hMetaData->nb_bits_tot - bits_crt; + break; + } + } + } + } + + *num_bits_written = nbits; + return IVAS_ERR_OK; +} + + +/*-----------------------------------------------------------------------* + * Local functions (coherence Q and coding) + *-----------------------------------------------------------------------*/ + +/*! r: index */ +static uint64_t create_combined_index( + uint16_t *idx_dct, /* i : indexes to combine */ + const int16_t len, /* i : number of indexes */ + const int16_t *no_cb_vec /* i : how many codewords for each position */ +) +{ + int16_t i; + uint64_t idx, base; + + base = 1; + idx = 0; + for ( i = 0; i < len; i++ ) + { + idx += base * idx_dct[i]; + base *= no_cb_vec[i]; + } + + return idx; +} + + +/*-----------------------------------------------------------------------* + * encoding DCT0 coeffs with joint index + *-----------------------------------------------------------------------*/ + +/*! r: number of bits written */ +static int16_t encode_coherence_indexesDCT0( + uint16_t *idx_dct, /* i : indexes to be encoded */ + const int16_t len, /* i : number of indexes */ + int16_t *no_cb_vec, /* i : number of codewords for each position */ + BSTR_ENC_HANDLE hMetaData, + const int16_t indice_coherence, + const int16_t nbits, + const int16_t nbits1 ) +{ + int16_t i; + uint64_t idx; + int16_t no_idx16; + int16_t k; + int16_t half_len, j; + uint64_t idx1; + + /* calculate bits for dct0 components with joint encoding */ + if ( nbits1 > 0 ) + { + half_len = len / 2; + idx = create_combined_index( idx_dct, half_len, no_cb_vec ); + idx1 = create_combined_index( &idx_dct[half_len], half_len, &no_cb_vec[half_len] ); + } + else + { + idx = create_combined_index( idx_dct, len, no_cb_vec ); + idx1 = 0; + } + + if ( nbits % 16 == 0 ) + { + no_idx16 = nbits / 16; + } + else + { + no_idx16 = (int16_t) round_f( ( nbits / 16.0f + 0.5f ) ); + } + + k = nbits; + i = 0; + for ( i = 0; i < no_idx16 - 1; i++ ) + { + k -= 16; + hMetaData->ind_list[indice_coherence + i].value = ( ( idx >> k ) & 65535 ); /* 16 bits */ + } + hMetaData->ind_list[indice_coherence + i].value = ( idx & ( ( 1 << k ) - 1 ) ); + + if ( nbits1 > 0 ) + { + if ( nbits1 % 16 == 0 ) + { + no_idx16 = nbits1 / 16; + } + else + { + no_idx16 = (int16_t) round_f( ( nbits1 / 16.0f + 0.5f ) ); + } + + k = nbits1; + + for ( j = i + 1; j < no_idx16 + i; j++ ) + { + k -= 16; + hMetaData->ind_list[indice_coherence + j].value = ( ( idx1 >> k ) & 65535 ); /* 16 bits */ + } + hMetaData->ind_list[indice_coherence + j].value = ( idx1 & ( ( 1 << k ) - 1 ) ); + } + + return nbits + nbits1; +} + + +/*-------------------------------------------------------------------* + * coherence_coding_length() + * + * + *-------------------------------------------------------------------*/ + +static int16_t coherence_coding_length( + const uint16_t *idx_sur_coh_shift, + const uint8_t idx_shift_len, + const int16_t coding_subbands, + const int16_t *no_cv, + uint16_t *mr_idx, + int16_t *no_cv_shift, + int16_t *p_min_idx, + int16_t *GR_ord, + int16_t *nbits_fr, + int16_t *nbits_fr1 ) +{ + int16_t half_coding_subbands; + int16_t j; + int16_t nbits; + uint64_t no_cb; + int16_t min_idx; + + half_coding_subbands = 0; + + if ( sum_s( no_cv, coding_subbands ) > MASA_COH_LIMIT_2IDX ) + { + + no_cb = 1; + half_coding_subbands = coding_subbands / 2; + for ( j = 0; j < half_coding_subbands; j++ ) + { + no_cb *= no_cv[j]; + } + *nbits_fr = (int16_t) ceilf( logf( (float) no_cb ) * INV_LOG_2 ); + no_cb = 1; + for ( j = half_coding_subbands; j < coding_subbands; j++ ) + { + no_cb *= no_cv[j]; + } + *nbits_fr1 = (int16_t) ceilf( logf( (float) no_cb ) * INV_LOG_2 ); + } + else + { + no_cb = 1; + for ( j = 0; j < coding_subbands; j++ ) + { + no_cb *= no_cv[j]; + } + *nbits_fr = (int16_t) ceilf( logf( (float) no_cb ) * INV_LOG_2 ); + *nbits_fr1 = 0; + } + + + minimum_s( (const int16_t *) idx_sur_coh_shift, (int16_t) idx_shift_len, &min_idx ); + for ( j = 0; j < idx_shift_len; j++ ) + { + mr_idx[j] = idx_sur_coh_shift[j] - min_idx; + no_cv_shift[j] -= min_idx; + } + nbits = min_idx + 1 + GR_bits_new( mr_idx, no_cv_shift, idx_shift_len, *GR_ord, 1, GR_ord ); + *p_min_idx = min_idx; + + return nbits; +} + + +/*-------------------------------------------------------------------* + * encode_spread_coherence_1sf() + * + * Encoding spread coherence for 1 subframe bands + *-------------------------------------------------------------------*/ + +/*! r: number of bits written */ +static int16_t encode_spread_coherence_1sf( + IVAS_QMETADATA *q_metadata, /* i : quantized metadata */ + const int16_t idx_d, /* i : current direction index */ + BSTR_ENC_HANDLE hMasaMetaData, /* i/o: metadata bitstream handle */ + const int16_t hrmasa_flag /* i : flag indicating high-rate MASA MD coding */ +) +{ + int16_t i, j, k; + int16_t idx_ER; + int16_t nbits, nbits_fr; + uint16_t idx_sp_coh[MASA_MAXIMUM_CODING_SUBBANDS]; + uint16_t mr_idx_sp_coh[MASA_MAXIMUM_CODING_SUBBANDS]; + int16_t GR_ord, bits_GR; + uint64_t idx, idx1; + int16_t no_idx16; + int16_t no_cv[MASA_MAXIMUM_CODING_SUBBANDS]; + IVAS_QDIRECTION *q_direction; + int16_t half_coding_subbands, nbits_fr1, coding_subbands; + uint16_t idx_sp_coh_shift[MASA_MAXIMUM_CODING_SUBBANDS]; + uint8_t idx_shift; + int16_t max_val = 0, nbits_max; + int16_t extra_cv; + int16_t no_cv_shift[MASA_MAXIMUM_CODING_SUBBANDS], min_idx; + + coding_subbands = q_metadata->q_direction[idx_d].cfg.nbands; + q_direction = &( q_metadata->q_direction[idx_d] ); + nbits = 0; + GR_ord = 1; + idx_shift = 0; + + /* number of codevectors added dependent on number of subbands */ + extra_cv = coding_subbands / MASA_FACTOR_CV_COH; + for ( j = 0; j < coding_subbands; j++ ) + { + if ( hrmasa_flag ) + { + idx_ER = 7 - ( q_direction->band_data[j].energy_ratio_index_mod[0] >> 1 ) + extra_cv; + } + else + { + idx_ER = 7 - q_direction->band_data[j].energy_ratio_index_mod[0] + extra_cv; + } + + if ( idx_ER > 0 ) + { + idx_sp_coh[j] = (uint16_t) roundf( q_direction->coherence_band_data[j].spread_coherence[0] / ( 255.0f / (float) idx_ER ) ); + q_direction->coherence_band_data[j].spread_coherence[0] = (uint8_t) roundf( idx_sp_coh[j] * ( 255.0f / (float) idx_ER ) ); + } + else + { + idx_sp_coh[j] = 0; + q_direction->coherence_band_data[j].spread_coherence[0] = 0; + } + no_cv[j] = idx_ER + 1; + + no_cv_shift[idx_shift] = no_cv[j]; + idx_sp_coh_shift[idx_shift++] = idx_sp_coh[j]; + } + + if ( sum_s( no_cv, coding_subbands ) == coding_subbands ) + { + return 0; + } + + nbits_max = 0; + if ( coding_subbands > MASA_LIMIT_NO_BANDS_SUR_COH ) + { + j = maximum_s( (int16_t *) idx_sp_coh, coding_subbands, &max_val ); + for ( j = 0; j < coding_subbands; j++ ) + { + if ( no_cv[j] > max_val + 1 ) + { + no_cv[j] = max_val + 1; + } + } + nbits_max = MASA_MAX_NO_CV_SUR_COH - max_val + extra_cv; + } + + nbits = coherence_coding_length( idx_sp_coh_shift, idx_shift, coding_subbands, no_cv, + mr_idx_sp_coh, no_cv_shift, &min_idx, &GR_ord, &nbits_fr, &nbits_fr1 ); + half_coding_subbands = 0; + idx1 = 0; + + if ( nbits_fr + nbits_fr1 + nbits_max < nbits ) + { + /* write flag*/ + push_next_indice( hMasaMetaData, 0, 1 ); + + /* create combined index */ + nbits = nbits_fr + nbits_fr1 + 1; + + if ( coding_subbands > MASA_LIMIT_NO_BANDS_SUR_COH ) + { + /* write max value*/ + bits_GR = hMasaMetaData->nb_bits_tot; + ivas_qmetadata_encode_extended_gr( hMasaMetaData, MASA_MAX_NO_CV_SUR_COH - max_val - 1 + extra_cv, MASA_MAX_NO_CV_SUR_COH + extra_cv, 0 ); + nbits += hMasaMetaData->nb_bits_tot - bits_GR; + } + + if ( nbits_fr1 > 0 ) + { + half_coding_subbands = coding_subbands / 2; + idx = create_combined_index( idx_sp_coh, half_coding_subbands, no_cv ); + idx1 = create_combined_index( &idx_sp_coh[half_coding_subbands], half_coding_subbands, &no_cv[half_coding_subbands] ); + } + else + { + idx = create_combined_index( idx_sp_coh, coding_subbands, no_cv ); + } + + if ( nbits_fr % 16 == 0 ) + { + no_idx16 = nbits_fr / 16; + } + else + { + no_idx16 = (int16_t) round_f( ( nbits_fr / 16.0f + 0.5f ) ); + } + + /* write combined index */ + k = nbits_fr; + for ( i = 0; i < no_idx16 - 1; i++ ) + { + k -= 16; + push_next_indice( hMasaMetaData, ( ( idx >> k ) & 65535 ), 16 ); /* 16 bits */ + } + + push_next_indice( hMasaMetaData, ( idx & ( ( 1 << k ) - 1 ) ), k ); + + if ( nbits_fr1 > 0 ) + { + if ( nbits_fr1 % 16 == 0 ) + { + no_idx16 = nbits_fr1 / 16; + } + else + { + no_idx16 = (int16_t) round_f( ( nbits_fr1 / 16.0f + 0.5f ) ); + } + + assert( no_idx16 <= 4 ); + + k = nbits_fr1; + for ( i = 0; i < no_idx16 - 1; i++ ) + { + k -= 16; + push_next_indice( hMasaMetaData, ( ( idx1 >> k ) & 65535 ), 16 ); /* 16 bits */ + } + push_next_indice( hMasaMetaData, ( idx1 & ( ( 1 << k ) - 1 ) ), k ); + } + } + else + { + /* write flag */ + nbits = 1; + + /* write flag*/ + push_next_indice( hMasaMetaData, 1, 1 ); + + /* write GR_ord */ + push_next_indice( hMasaMetaData, GR_ord, 1 ); + nbits += 1; + + /* write the min */ + bits_GR = hMasaMetaData->nb_bits_tot; + ivas_qmetadata_encode_extended_gr( hMasaMetaData, min_idx, MASA_MAX_NO_CV_SUR_COH + extra_cv, 0 ); + nbits += hMasaMetaData->nb_bits_tot - bits_GR; + + /* write GR data */ + for ( j = 0; j < idx_shift; j++ ) + { + bits_GR = hMasaMetaData->nb_bits_tot; + ivas_qmetadata_encode_extended_gr( hMasaMetaData, mr_idx_sp_coh[j], no_cv_shift[j], GR_ord ); + nbits += hMasaMetaData->nb_bits_tot - bits_GR; + } + } + + return nbits; +} + + +/*-------------------------------------------------------------------* + * encode_surround_coherence() + * + * encoding surround coherence + *-------------------------------------------------------------------*/ + +/*! r: number of bits written */ +static int16_t encode_surround_coherence( + IVAS_QMETADATA *hQMetaData, /* i : quantized metadata */ + BSTR_ENC_HANDLE hMetaData /* i/o: metadata bitstream handle */ +) +{ + int16_t i, j, k; + int16_t idx_ER, idx16; + int16_t nbits, nbits_fr; + uint16_t idx_sur_coh[MASA_MAXIMUM_CODING_SUBBANDS]; + uint16_t mr_idx_sur_coh[MASA_MAXIMUM_CODING_SUBBANDS]; + int16_t GR_ord, bits_GR; + uint64_t idx, idx1; + int16_t no_idx16; + int16_t no_cv[MASA_MAXIMUM_CODING_SUBBANDS]; + float error_ratio_surr; + IVAS_QDIRECTION *q_direction; + int16_t half_coding_subbands, nbits_fr1, coding_subbands; + int16_t all_coherence_zero; + uint16_t idx_sur_coh_shift[MASA_MAXIMUM_CODING_SUBBANDS]; + uint8_t idx_shift; + int16_t max_val = 0, nbits_max; + int16_t no_cv_shift[MASA_MAXIMUM_CODING_SUBBANDS], min_idx; + + coding_subbands = hQMetaData->q_direction[0].cfg.nbands; + all_coherence_zero = hQMetaData->all_coherence_zero; + q_direction = &( hQMetaData->q_direction[0] ); + nbits = 0; + + if ( all_coherence_zero == 1 ) + { + nbits = 0; + } + else + { + GR_ord = 1; + k = 0; + idx_shift = 0; + for ( j = 0; j < coding_subbands; j++ ) + { + if ( hQMetaData->no_directions == 2 ) + { + k += hQMetaData->twoDirBands[j]; + idx16 = max( k - 1, 0 ); + error_ratio_surr = 1.0f - q_direction[0].band_data[j].energy_ratio[0] - q_direction[1].band_data[idx16].energy_ratio[0] * hQMetaData->twoDirBands[j]; + } + else + { + error_ratio_surr = 1.0f - q_direction[0].band_data[j].energy_ratio[0]; + } + + if ( error_ratio_surr <= 0 ) + { + error_ratio_surr = 0; + idx_sur_coh[j] = 0; + no_cv[j] = 1; + hQMetaData->surcoh_band_data[j].surround_coherence[0] = 0; /* sur_coherence_cb_masa[idx_cb_sur_coh_masa[DIRAC_DIFFUSE_LEVELS - 1] * MASA_MAX_NO_CV_SUR_COH]; */ + } + else + { + idx_ER = masa_sq( error_ratio_surr, diffuseness_thresholds, DIRAC_DIFFUSE_LEVELS ); + + idx_sur_coh[j] = squant_int( hQMetaData->surcoh_band_data[j].surround_coherence[0], &hQMetaData->surcoh_band_data[j].surround_coherence[0], + &sur_coherence_cb_masa[idx_cb_sur_coh_masa[idx_ER] * MASA_MAX_NO_CV_SUR_COH], idx_cb_sur_coh_masa[idx_ER] + 2 ); + + no_cv[j] = idx_cb_sur_coh_masa[idx_ER] + 2; + no_cv_shift[idx_shift] = no_cv[j]; + idx_sur_coh_shift[idx_shift++] = idx_sur_coh[j]; + } + } + + if ( sum_s( no_cv, coding_subbands ) == coding_subbands ) + { + return 0; + } + + nbits_max = 0; + if ( coding_subbands > MASA_LIMIT_NO_BANDS_SUR_COH ) + { + j = maximum_s( (int16_t *) idx_sur_coh, coding_subbands, &max_val ); + for ( j = 0; j < coding_subbands; j++ ) + { + if ( no_cv[j] > max_val + 1 ) + { + no_cv[j] = max_val + 1; + } + } + nbits_max = MASA_MAX_NO_CV_SUR_COH - max_val; /* encoded with GR0 as max_no_vals - no_vals*/ + } + + nbits = coherence_coding_length( idx_sur_coh_shift, idx_shift, coding_subbands, no_cv, + mr_idx_sur_coh, no_cv_shift, &min_idx, &GR_ord, &nbits_fr, &nbits_fr1 ); + half_coding_subbands = coding_subbands / 2; + idx1 = 0; + + /* should check how to encode the average - check distribution */ + if ( nbits_fr + nbits_fr1 + nbits_max < nbits ) + { + /* write flag*/ + push_next_indice( hMetaData, 0, 1 ); + + /* create combined index */ + nbits = nbits_fr + nbits_fr1 + 1; + if ( coding_subbands > MASA_LIMIT_NO_BANDS_SUR_COH ) + { + /* write max value*/ + bits_GR = hMetaData->nb_bits_tot; + ivas_qmetadata_encode_extended_gr( hMetaData, MASA_MAX_NO_CV_SUR_COH - max_val - 1, MASA_MAX_NO_CV_SUR_COH, 0 ); + nbits += hMetaData->nb_bits_tot - bits_GR; + } + + if ( nbits_fr1 > 0 ) + { + idx = create_combined_index( idx_sur_coh, half_coding_subbands, no_cv ); + idx1 = create_combined_index( &idx_sur_coh[half_coding_subbands], half_coding_subbands, &no_cv[half_coding_subbands] ); + } + else + { + idx = create_combined_index( idx_sur_coh, coding_subbands, no_cv ); + } + + if ( nbits_fr % 16 == 0 ) + { + no_idx16 = nbits_fr / 16; + } + else + { + no_idx16 = (int16_t) round_f( ( nbits_fr / 16.0f + 0.5f ) ); + } + + /* write combined index */ + k = nbits_fr; + for ( i = 0; i < no_idx16 - 1; i++ ) + { + k -= 16; + push_next_indice( hMetaData, ( ( idx >> k ) & 65535 ), 16 ); /* 16 bits */ + } + + push_next_indice( hMetaData, ( idx & ( ( 1 << k ) - 1 ) ), k ); + + if ( nbits_fr1 > 0 ) + { + if ( nbits_fr1 % 16 == 0 ) + { + no_idx16 = nbits_fr1 / 16; + } + else + { + no_idx16 = (int16_t) round_f( ( nbits_fr1 / 16.0f + 0.5f ) ); + } + + assert( no_idx16 <= 4 ); + + k = nbits_fr1; + for ( i = 0; i < no_idx16 - 1; i++ ) + { + k -= 16; + push_next_indice( hMetaData, ( ( idx1 >> k ) & 65535 ), 16 ); /* 16 bits */ + } + + push_next_indice( hMetaData, ( idx1 & ( ( 1 << k ) - 1 ) ), k ); + } + } + else + { + /* write flag */ + nbits = 1; + + /* write flag*/ + push_next_indice( hMetaData, 1, 1 ); + + /* write GR_ord */ + push_next_indice( hMetaData, GR_ord, 1 ); + nbits += 1; + + /* write the min */ + bits_GR = hMetaData->nb_bits_tot; + ivas_qmetadata_encode_extended_gr( hMetaData, min_idx, MASA_MAX_NO_CV_SUR_COH, 0 ); + nbits += hMetaData->nb_bits_tot - bits_GR; + + /* write GR data */ + for ( j = 0; j < idx_shift; j++ ) + { + bits_GR = hMetaData->nb_bits_tot; + + ivas_qmetadata_encode_extended_gr( hMetaData, mr_idx_sur_coh[j], no_cv_shift[j], GR_ord ); + + nbits += hMetaData->nb_bits_tot - bits_GR; + } + } + } + + return nbits; +} + + +static int16_t encode_surround_coherence_hr( + IVAS_QMETADATA *hQMetaData, /* i : quantized metadata */ + BSTR_ENC_HANDLE hMetaData /* i/o: metadata bitstream handle */ +) +{ + int16_t i, j, k, sf; + int16_t nbits, nbits_fr, nbits_sf; + uint16_t idx_sur_coh[MASA_MAXIMUM_CODING_SUBBANDS]; + uint16_t mr_idx_sur_coh[MASA_MAXIMUM_CODING_SUBBANDS]; + int16_t GR_ord, bits_GR; + uint64_t idx, idx1; + int16_t no_idx16; + int16_t no_cv[MASA_MAXIMUM_CODING_SUBBANDS]; + float error_ratio_surr; + IVAS_QDIRECTION *q_direction; + int16_t half_coding_subbands, nbits_fr1, coding_subbands; + int16_t all_coherence_zero; + uint16_t idx_sur_coh_shift[MASA_MAXIMUM_CODING_SUBBANDS]; + uint8_t idx_shift; + int16_t max_val = 0, nbits_max; + int16_t no_cv_shift[MASA_MAXIMUM_CODING_SUBBANDS], min_idx; + int16_t idx16; + + coding_subbands = hQMetaData->q_direction[0].cfg.nbands; + all_coherence_zero = hQMetaData->all_coherence_zero; + q_direction = &( hQMetaData->q_direction[0] ); + nbits = 0; + + if ( all_coherence_zero == 1 ) + { + nbits = 0; + } + else + { + for ( sf = 0; sf < hQMetaData->q_direction[0].cfg.nblocks; sf++ ) + { + GR_ord = 1; + k = 0; + idx_shift = 0; + for ( j = 0; j < coding_subbands; j++ ) + { + if ( hQMetaData->no_directions == 2 ) + { + k += hQMetaData->twoDirBands[j]; + idx16 = max( k - 1, 0 ); + error_ratio_surr = 1.0f - q_direction[0].band_data[j].energy_ratio[sf] - q_direction[1].band_data[idx16].energy_ratio[sf] * hQMetaData->twoDirBands[j]; + } + else + { + error_ratio_surr = 1.0f - q_direction[0].band_data[j].energy_ratio[sf]; + } + + + if ( error_ratio_surr <= 0 ) + { + error_ratio_surr = 0; + idx_sur_coh[j] = 0; + no_cv[j] = 1; + hQMetaData->surcoh_band_data[j].surround_coherence[sf] = 0; /* sur_coherence_cb_masa[idx_cb_sur_coh_masa[DIRAC_DIFFUSE_LEVELS - 1] * MASA_MAX_NO_CV_SUR_COH]; */ + } + else + { + idx_sur_coh[j] = squant_int( hQMetaData->surcoh_band_data[j].surround_coherence[sf], &hQMetaData->surcoh_band_data[j].surround_coherence[sf], + &sur_coherence_cb_masa[idx_cb_sur_coh_masa[7] * MASA_MAX_NO_CV_SUR_COH], idx_cb_sur_coh_masa[7] + 2 ); + no_cv[j] = idx_cb_sur_coh_masa[7] + 2; + no_cv_shift[idx_shift] = no_cv[j]; + idx_sur_coh_shift[idx_shift++] = idx_sur_coh[j]; + } + } + + if ( sum_s( no_cv, coding_subbands ) != coding_subbands ) + { + nbits_max = 0; + if ( coding_subbands > MASA_LIMIT_NO_BANDS_SUR_COH ) + { + j = maximum_s( (int16_t *) idx_sur_coh, coding_subbands, &max_val ); + for ( j = 0; j < coding_subbands; j++ ) + { + if ( no_cv[j] > max_val + 1 ) + { + no_cv[j] = max_val + 1; + } + } + nbits_max = MASA_MAX_NO_CV_SUR_COH - max_val; /* encoded with GR0 as max_no_vals - no_vals*/ + } + if ( max_val == 0 ) + { + for ( j = 0; j < coding_subbands; j++ ) + { + hQMetaData->surcoh_band_data[j].surround_coherence[sf] = 0; + } + } + nbits_sf = coherence_coding_length( idx_sur_coh_shift, idx_shift, coding_subbands, no_cv, + mr_idx_sur_coh, no_cv_shift, &min_idx, &GR_ord, &nbits_fr, &nbits_fr1 ); + half_coding_subbands = coding_subbands / 2; + idx1 = 0; + + /* should check how to encode the average - check distribution */ + if ( nbits_fr + nbits_fr1 + nbits_max < nbits_sf ) + { + /* write flag*/ + push_next_indice( hMetaData, 0, 1 ); + + /* create combined index */ + nbits += nbits_fr + nbits_fr1 + 1; + if ( coding_subbands > MASA_LIMIT_NO_BANDS_SUR_COH ) + { + /* write max value*/ + bits_GR = hMetaData->nb_bits_tot; + ivas_qmetadata_encode_extended_gr( hMetaData, MASA_MAX_NO_CV_SUR_COH - max_val - 1, MASA_MAX_NO_CV_SUR_COH, 0 ); + nbits += hMetaData->nb_bits_tot - bits_GR; + } + + if ( nbits_fr1 > 0 ) + { + idx = create_combined_index( idx_sur_coh, half_coding_subbands, no_cv ); + idx1 = create_combined_index( &idx_sur_coh[half_coding_subbands], half_coding_subbands, &no_cv[half_coding_subbands] ); + } + else + { + idx = create_combined_index( idx_sur_coh, coding_subbands, no_cv ); + } + + if ( nbits_fr % 16 == 0 ) + { + no_idx16 = nbits_fr / 16; + } + else + { + no_idx16 = (int16_t) round_f( ( nbits_fr / 16.0f + 0.5f ) ); + } + + /* write combined index */ + k = nbits_fr; + for ( i = 0; i < no_idx16 - 1; i++ ) + { + k -= 16; + push_next_indice( hMetaData, ( ( idx >> k ) & 65535 ), 16 ); /* 16 bits */ + } + + push_next_indice( hMetaData, ( idx & ( ( 1 << k ) - 1 ) ), k ); + + if ( nbits_fr1 > 0 ) + { + if ( nbits_fr1 % 16 == 0 ) + { + no_idx16 = nbits_fr1 / 16; + } + else + { + no_idx16 = (int16_t) round_f( ( nbits_fr1 / 16.0f + 0.5f ) ); + } + + assert( no_idx16 <= 4 ); + + k = nbits_fr1; + for ( i = 0; i < no_idx16 - 1; i++ ) + { + k -= 16; + push_next_indice( hMetaData, ( ( idx1 >> k ) & 65535 ), 16 ); /* 16 bits */ + } + + push_next_indice( hMetaData, ( idx1 & ( ( 1 << k ) - 1 ) ), k ); + } + } + else + { + /* write flag */ + nbits += 1; + + /* write flag*/ + push_next_indice( hMetaData, 1, 1 ); + + /* write GR_ord */ + push_next_indice( hMetaData, GR_ord, 1 ); + nbits += 1; + + /* write the min */ + bits_GR = hMetaData->nb_bits_tot; + ivas_qmetadata_encode_extended_gr( hMetaData, min_idx, MASA_MAX_NO_CV_SUR_COH, 0 ); + nbits += hMetaData->nb_bits_tot - bits_GR; + + /* write GR data */ + for ( j = 0; j < idx_shift; j++ ) + { + bits_GR = hMetaData->nb_bits_tot; + + ivas_qmetadata_encode_extended_gr( hMetaData, mr_idx_sur_coh[j], no_cv_shift[j], GR_ord ); + + nbits += hMetaData->nb_bits_tot - bits_GR; + } + } + } + } + } + + return nbits; +} + + +/*-------------------------------------------------------------------* + * quantize_DCT_0_coh() + * + * quanization of DCT component of order zero for transformed coherence vector + *-------------------------------------------------------------------*/ + +/*! r: quantized value */ +static float quantize_DCT_0_coh( + const float x, /* i : input value */ + const int16_t j, /* i : subband index */ + const float *coherence_cb, /* i : coherence codebook */ + const float delta_var, /* i : azimuth variance threshold */ + const int16_t no_cb, /* i : maximum number of codewords */ + IVAS_QDIRECTION *q_direction, /* i : quantized metadata */ + uint16_t *idx_x, /* o : codewords index */ + int16_t *p_no_cb, /* o : actual number of codewords dependent on energy ratio value */ + const int16_t hrmasa_flag /* i : flag indicating high-rate MASA MD coding */ +) +{ + float var_azi, xhat; + int16_t idx_sub_cb, idx; + int16_t min_index; + /* quantize first DCT component */ + var_azi = var( q_direction->band_data[j].azimuth, q_direction->cfg.nblocks ); + + if ( hrmasa_flag ) + { + minimum_s( (int16_t *) ( q_direction->band_data[j].energy_ratio_index ), q_direction->cfg.nblocks, &min_index ); + min_index = min_index >> 1; + } + else + { + min_index = q_direction->band_data[j].energy_ratio_index[0]; + } + + if ( var_azi < delta_var ) + { + idx_sub_cb = no_cb * min_index; + } + else + { + idx_sub_cb = no_cb * ( min_index + DIRAC_DIFFUSE_LEVELS ); + } + + idx = squant( x, &xhat, &coherence_cb[idx_sub_cb], len_cb_dct0_masa[min_index] ); + + *p_no_cb = len_cb_dct0_masa[min_index]; + *idx_x = idx; + + return xhat; +} + + +/*-------------------------------------------------------------------* + * encode_coherence_indexesDCT1() + * + * Encoding DCT1 coeffs with joint index or EC + *-------------------------------------------------------------------*/ + +/*! r: number of bits written */ +static int16_t encode_coherence_indexesDCT1( + uint16_t *idx_dct, /* i : data to be encoded */ + const int16_t len, /* i : number of data */ + BSTR_ENC_HANDLE hMetaData /* i : metadata handle */ +) +{ + int16_t i, nbits, GR_ord; + uint16_t av; + uint16_t mr_idx_dct[MASA_MAXIMUM_CODING_SUBBANDS]; + + GR_ord = 0; + nbits = 0; + + nbits = mean_removed_GR_new( idx_dct, MASA_NO_CV_COH1, len, 0, &GR_ord, &av, mr_idx_dct ); + + for ( i = 0; i < len; i++ ) + { + ivas_qmetadata_encode_extended_gr( hMetaData, mr_idx_dct[i], 2 * MASA_NO_CV_COH1, GR_ord ); + } + + nbits += len_huf_masa[av]; + + push_next_indice( hMetaData, huff_code_av_masa[av], len_huf_masa[av] ); + + return nbits; +} + + +/*-------------------------------------------------------------------* + * dct4_transform() + * + * 4D implementation of DCT transform + *-------------------------------------------------------------------*/ + +static void dct4_transform( + uint8_t *v, /* i : input 4D vector */ + float *dct_v /* o : output transformed vector */ +) +{ + float a, b, c, d; + + a = ( v[0] + v[3] ) / 256.0f; + b = ( v[1] + v[2] ) / 256.0f; + c = ( v[0] - v[3] ) / 256.0f; + d = ( v[1] - v[2] ) / 256.0f; + + dct_v[0] = 0.5f * ( a + b ); + dct_v[1] = 0.653281482438188f * c + 0.270598050073099f * d; + dct_v[2] = 0.5f * ( a - b ); + dct_v[3] = 0.270598050073099f * c - 0.653281482438188f * d; + + return; +} + + +/*-------------------------------------------------------------------* + * ivas_qmetadata_quantize_coherence_hr_512() + * + * + *-------------------------------------------------------------------*/ + +static int16_t ivas_qmetadata_quantize_coherence_hr_512( + IVAS_QMETADATA *hQMetaData, /* i/o: quantized metadata */ + const int16_t idx_d, /* i : current direction index */ + const int16_t all_coherence_zero, /* i : all coherence is zero - flag */ + BSTR_ENC_HANDLE hMetaData, /* i : metadata handle */ + const int16_t bits_coh ) +{ + int16_t j, k; + int16_t nbands, nblocks; + int16_t nbits; + int16_t nbits1, nbits0, nbits_av; + uint16_t idx_coh[MASA_MAXIMUM_CODING_SUBBANDS]; + IVAS_QDIRECTION *q_direction; + int16_t cbsize; + float delta, tmp; + int16_t min_idx, GR_param, GR_param_av; + uint16_t av, mr_idx[MASA_MAXIMUM_CODING_SUBBANDS]; + + q_direction = &( hQMetaData->q_direction[idx_d] ); + nbands = q_direction->cfg.nbands; + nblocks = q_direction->cfg.nblocks; + nbits = 0; + + if ( all_coherence_zero == 1 ) + { + return nbits; + } + nbits = hMetaData->nb_bits_tot; + + cbsize = 1 << bits_coh; + delta = 256.0f / cbsize; + + for ( k = 0; k < nblocks; k++ ) + { + min_idx = 0; + for ( j = 0; j < nbands; j++ ) + { + idx_coh[j] = usquant( (float) ( q_direction->coherence_band_data[j].spread_coherence[k] ), &tmp, delta / 2.0f, delta, cbsize ); + q_direction->coherence_band_data[j].spread_coherence[k] = (uint8_t) ( idx_coh[j] * delta + delta / 2.0f ); + if ( idx_coh[j] < min_idx ) + { + min_idx = idx_coh[j]; + } + } + + nbits0 = 0; + nbits1 = 0; + for ( j = 0; j < nbands; j++ ) + { + idx_coh[j] = idx_coh[j] - min_idx; + nbits0 += ivas_qmetadata_encode_extended_gr_length( idx_coh[j], cbsize - min_idx, 0 ); + nbits1 += ivas_qmetadata_encode_extended_gr_length( idx_coh[j], cbsize - min_idx, 1 ); + } + if ( nbits0 < nbits1 ) + { + GR_param = 0; + nbits1 = nbits0; + } + else + { + GR_param = 1; + } + + GR_param_av = 1; + nbits_av = mean_removed_GR_new( idx_coh, cbsize, nbands, 1, &GR_param_av, &av, mr_idx ); + + if ( nbits_av < nbits1 ) + { + nbits1 = nbits_av; + GR_param = GR_param_av; + + /* use average removed */ + push_next_indice( hMetaData, 1, 1 ); + + /* write average */ + push_next_indice( hMetaData, av, bits_coh ); + + /* write GR param */ + push_next_indice( hMetaData, GR_param, 1 ); + + for ( j = 0; j < nbands; j++ ) + { + ivas_qmetadata_encode_extended_gr( hMetaData, mr_idx[j], 2 * cbsize, GR_param ); + } + } + else + { + /* use min removed */ + push_next_indice( hMetaData, 0, 1 ); + + /* write min index */ + push_next_indice( hMetaData, min_idx, bits_coh ); + + /* write GR param */ + push_next_indice( hMetaData, GR_param, 1 ); + + for ( j = 0; j < nbands; j++ ) + { + ivas_qmetadata_encode_extended_gr( hMetaData, idx_coh[j], cbsize - min_idx, GR_param ); + } + } + } + + nbits = hMetaData->nb_bits_tot - nbits; + return nbits; +} + + +/*-------------------------------------------------------------------* + * ivas_qmetadata_quantize_coherence() + * + * + *-------------------------------------------------------------------*/ + +/*! r: number of bits written */ +static int16_t ivas_qmetadata_quantize_coherence( + IVAS_QMETADATA *hQMetaData, /* i/o: quantized metadata */ + const int16_t idx_d, /* i : current direction index */ + const int16_t all_coherence_zero, /* i : all coherence is zero - flag */ + BSTR_ENC_HANDLE hMetaData, /* i : metadata handle */ + const int16_t write_flag, /* i : flag to actually write the data or not */ + int16_t *indice_coherence, + const int16_t hrmasa_flag /* i : flag indicating high-rate MASA MD coding */ +) +{ + int16_t j, k; + float dct_coh[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES]; + uint16_t idx_dct[MAX_PARAM_SPATIAL_SUBFRAMES * MASA_MAXIMUM_CODING_SUBBANDS]; + int16_t coding_subbands; + int16_t nbits; + uint64_t no_cb; + int16_t MASA_grouping[MASA_MAXIMUM_CODING_SUBBANDS]; + int16_t nbits1; + int16_t coding_subbands_0, d; + int16_t two_dir_band[MASA_MAXIMUM_CODING_SUBBANDS]; + int16_t no_cb_vec[MASA_MAXIMUM_CODING_SUBBANDS]; + IVAS_QDIRECTION *q_direction; + int16_t min_index; + min_index = 0; + q_direction = &( hQMetaData->q_direction[idx_d] ); + coding_subbands = q_direction->cfg.nbands; + nbits = 0; + + if ( all_coherence_zero == 1 ) + { + return nbits; + } + + if ( hQMetaData->q_direction[idx_d].cfg.nblocks == 1 ) + { + nbits = encode_spread_coherence_1sf( hQMetaData, idx_d, hMetaData, hrmasa_flag ); + + return nbits; + } + else + { + k = 0; + no_cb = 1; + coding_subbands_0 = hQMetaData->q_direction[0].cfg.nbands; + if ( coding_subbands_0 <= 5 ) + { + for ( j = 0; j < 5; j++ ) + { + MASA_grouping[j] = j; + } + } + else + { + if ( coding_subbands_0 <= 8 ) + { + mvs2s( MASA_grouping_8_to_5, MASA_grouping, 8 ); + } + else if ( coding_subbands_0 <= 12 ) + { + mvs2s( MASA_grouping_12_to_5, MASA_grouping, 12 ); + } + else if ( coding_subbands_0 <= 18 ) + { + mvs2s( MASA_grouping_18_to_5, MASA_grouping, 18 ); + } + else + { + if ( coding_subbands_0 <= 24 ) + { + mvs2s( MASA_grouping_24_to_5, MASA_grouping, 24 ); + } + } + } + + if ( coding_subbands < coding_subbands_0 ) + { + d = 0; + for ( j = 0; j < coding_subbands_0; j++ ) + { + if ( hQMetaData->twoDirBands[j] == 1 ) + { + two_dir_band[d++] = j; + } + } + } + + for ( j = 0; j < coding_subbands; j++ ) + { + /* DCT transform */ + dct4_transform( hQMetaData->q_direction[idx_d].coherence_band_data[j].spread_coherence, dct_coh[j] ); + + if ( hrmasa_flag ) + { + minimum_s( (int16_t *) ( q_direction->band_data[j].energy_ratio_index ), q_direction->cfg.nblocks, &min_index ); + no_cb_vec[j] = len_cb_dct0_masa[min_index >> 1]; + } + else + { + no_cb_vec[j] = len_cb_dct0_masa[q_direction->band_data[j].energy_ratio_index[0]]; + } + + if ( write_flag ) + { + /* quantize first DCT parameter */ + dct_coh[j][0] = quantize_DCT_0_coh( dct_coh[j][0], j, coherence_cb0_masa, MASA_DELTA_AZI_DCT0, MASA_NO_CV_COH, q_direction, &idx_dct[k], &no_cb_vec[j], hrmasa_flag ); + } + + if ( coding_subbands < coding_subbands_0 ) + { + idx_dct[k + coding_subbands] = squant( dct_coh[j][1], &dct_coh[j][1], &coherence_cb1_masa[MASA_grouping[two_dir_band[j]] * MASA_NO_CV_COH1], MASA_NO_CV_COH1 ); + } + else + { + idx_dct[k + coding_subbands] = squant( dct_coh[j][1], &dct_coh[j][1], &coherence_cb1_masa[MASA_grouping[j] * MASA_NO_CV_COH1], MASA_NO_CV_COH1 ); + } + k++; + + dct_coh[j][2] = 0.0f; + dct_coh[j][3] = 0.0f; + } + + nbits1 = 0; + if ( sum_s( no_cb_vec, coding_subbands ) > MASA_COH_LIMIT_2IDX ) + { + /* make two indxes */ + no_cb = 1; + + for ( j = 0; j < coding_subbands / 2; j++ ) + { + no_cb *= no_cb_vec[j]; + } + + nbits = (int16_t) ceilf( logf( (float) no_cb ) * INV_LOG_2 ); + no_cb = 1; + + for ( j = coding_subbands / 2; j < coding_subbands; j++ ) + { + no_cb *= no_cb_vec[j]; + } + nbits1 = (int16_t) ceilf( logf( (float) no_cb ) * INV_LOG_2 ); + } + else + { + no_cb = 1; + + for ( j = 0; j < coding_subbands; j++ ) + { + no_cb *= no_cb_vec[j]; + } + + nbits = (int16_t) ceilf( logf( (float) no_cb ) * INV_LOG_2 ); + } + + if ( write_flag ) + { + for ( j = 0; j < coding_subbands; j++ ) + { + /* inverse DCT transform */ + invdct4_transform( dct_coh[j], q_direction->coherence_band_data[j].spread_coherence ); + } + + nbits = encode_coherence_indexesDCT0( idx_dct, coding_subbands, no_cb_vec, hMetaData, *indice_coherence, nbits, nbits1 ); + } + else + { + /* write dummy data now and save the position */ + *indice_coherence = hMetaData->nb_ind_tot; + k = nbits; + while ( k > 0 ) + { + push_next_indice( hMetaData, 0, min( 16, k ) ); + k -= 16; + } + + if ( nbits1 > 0 ) + { + k = nbits1; + while ( k > 0 ) + { + push_next_indice( hMetaData, 0, min( 16, k ) ); + k -= 16; + } + } + nbits += nbits1; + set_s( no_cb_vec, MASA_NO_CV_COH1, coding_subbands ); + nbits += encode_coherence_indexesDCT1( &idx_dct[coding_subbands], coding_subbands, hMetaData ); + + return nbits; + } + } + + return nbits; +} + + +/*-------------------------------------------------------------------* + * ivas_qmetadata_reorder_2dir_bands() + * + * Reorders metadata on 2dir bands such that direct-to-total ratio of first direction is + * always larger or equal to direct-to-total ratio of second direction. + *-------------------------------------------------------------------*/ + +static void ivas_qmetadata_reorder_2dir_bands( + IVAS_QMETADATA_HANDLE hQMetaData ) +{ + int16_t nbands; + int16_t nsubframes; + int16_t band, sf; + + nbands = hQMetaData->q_direction[0].cfg.nbands; + nsubframes = hQMetaData->q_direction[0].cfg.nblocks; + + for ( band = 0; band < nbands; band++ ) + { + if ( hQMetaData->twoDirBands[band] == 1 ) + { + if ( hQMetaData->q_direction[0].band_data[band].energy_ratio[0] < hQMetaData->q_direction[1].band_data[band].energy_ratio[0] ) + { + uint16_t uint16_tmp = 0; + float flt_tmp = 0; + uint8_t uint8_tmp = 0; + + for ( sf = 0; sf < nsubframes; sf++ ) + { + uint16_tmp = hQMetaData->q_direction[0].band_data[band].spherical_index[sf]; + hQMetaData->q_direction[0].band_data[band].spherical_index[sf] = hQMetaData->q_direction[1].band_data[band].spherical_index[sf]; + hQMetaData->q_direction[1].band_data[band].spherical_index[sf] = uint16_tmp; + + flt_tmp = hQMetaData->q_direction[0].band_data[band].azimuth[sf]; + hQMetaData->q_direction[0].band_data[band].azimuth[sf] = hQMetaData->q_direction[1].band_data[band].azimuth[sf]; + hQMetaData->q_direction[1].band_data[band].azimuth[sf] = flt_tmp; + + flt_tmp = hQMetaData->q_direction[0].band_data[band].elevation[sf]; + hQMetaData->q_direction[0].band_data[band].elevation[sf] = hQMetaData->q_direction[1].band_data[band].elevation[sf]; + hQMetaData->q_direction[1].band_data[band].elevation[sf] = flt_tmp; + + uint8_tmp = hQMetaData->q_direction[0].band_data[band].distance[sf]; + hQMetaData->q_direction[0].band_data[band].distance[sf] = hQMetaData->q_direction[1].band_data[band].distance[sf]; + hQMetaData->q_direction[1].band_data[band].distance[sf] = uint8_tmp; + + if ( hQMetaData->coherence_flag ) + { + uint8_tmp = hQMetaData->q_direction[0].coherence_band_data[band].spread_coherence[sf]; + hQMetaData->q_direction[0].coherence_band_data[band].spread_coherence[sf] = hQMetaData->q_direction[1].coherence_band_data[band].spread_coherence[sf]; + hQMetaData->q_direction[1].coherence_band_data[band].spread_coherence[sf] = uint8_tmp; + } + } + if ( hQMetaData->coherence_flag ) + { + flt_tmp = hQMetaData->q_direction[0].band_data[band].energy_ratio[0]; + hQMetaData->q_direction[0].band_data[band].energy_ratio[0] = hQMetaData->q_direction[1].band_data[band].energy_ratio[0]; + hQMetaData->q_direction[1].band_data[band].energy_ratio[0] = flt_tmp; + } + } + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * write_2dir_info() + * + * + *-------------------------------------------------------------------*/ + +static int16_t write_2dir_info( + BSTR_ENC_HANDLE hMetaData, + uint8_t *twoDirBands, + const int16_t n, + const int16_t k ) +{ + int16_t nbits; + int16_t p[MASA_MAXIMUM_CODING_SUBBANDS]; + uint16_t dif_p[MASA_MAXIMUM_CODING_SUBBANDS]; + int16_t i, j; + + j = 0; + p[0] = 0; + for ( i = 0; i < n; i++ ) + { + if ( twoDirBands[i] == 1 ) + { + p[j] = i; + j++; + } + } + + dif_p[0] = p[0]; + for ( i = 1; i < j; i++ ) + { + dif_p[i] = p[i] - p[i - 1] - 1; + } + + j = hMetaData->nb_bits_tot; + for ( i = 0; i < k; i++ ) + { + ivas_qmetadata_encode_extended_gr( hMetaData, dif_p[i], 24, 0 ); + } + nbits = hMetaData->nb_bits_tot - j; + + return nbits; +} + + +/*-------------------------------------------------------------------* + * transform_azimuth_dir2() + * + * + *-------------------------------------------------------------------*/ + +static void transform_azimuth_dir2( + IVAS_QMETADATA_HANDLE hQMetaData, + int16_t *dir2_bands ) +{ + int16_t i, b; + + for ( i = hQMetaData->q_direction[1].cfg.start_band; i < hQMetaData->q_direction[1].cfg.nbands; i++ ) + { + if ( hQMetaData->q_direction[0].band_data[dir2_bands[i]].energy_ratio_index[0] < 7 ) + { + /* transform azimuth */ + for ( b = 0; b < hQMetaData->q_direction[1].cfg.nblocks; b++ ) + { + hQMetaData->q_direction[1].band_data[i].azimuth[b] = hQMetaData->q_direction[1].band_data[i].azimuth[b] - hQMetaData->q_direction[0].band_data[dir2_bands[i]].azimuth[b] + 180; + if ( hQMetaData->q_direction[1].band_data[i].azimuth[b] >= 180 ) + { + hQMetaData->q_direction[1].band_data[i].azimuth[b] -= 360; + } + if ( hQMetaData->q_direction[1].band_data[i].azimuth[b] < -180 ) + { + hQMetaData->q_direction[1].band_data[i].azimuth[b] += 360; + } + if ( hQMetaData->q_direction[1].band_data[i].azimuth[b] >= 180 ) + { + hQMetaData->q_direction[1].band_data[i].azimuth[b] -= 360; + } + if ( hQMetaData->q_direction[1].band_data[i].azimuth[b] < -180 ) + { + hQMetaData->q_direction[1].band_data[i].azimuth[b] += 360; + } + } + } + } + + return; +} + + + +static int16_t divide_GR_orders( + const int16_t *q_idx, + const int16_t GR1, + const int16_t GR2, + const int16_t len, + const int16_t len_max_GR1, + int16_t *i_min ) +{ + int16_t nb_GR_min; + int16_t i, j, nb_GR; + nb_GR_min = 1000; + *i_min = -1; + for ( i = 0; i < min( len_max_GR1, len ); i++ ) + { + nb_GR = 0; + + for ( j = 0; j <= i; j++ ) + { + nb_GR += ivas_qmetadata_encode_extended_gr_length( q_idx[j], 100, GR1 ); + } + for ( j = i + 1; j < len; j++ ) + { + nb_GR += ivas_qmetadata_encode_extended_gr_length( q_idx[j], 100, GR2 ); + } + + if ( nb_GR < nb_GR_min ) + { + nb_GR_min = nb_GR; + *i_min = i + 1; + } + } + + return nb_GR_min; +} + + +static int16_t find_optimal_GR_order( + const int16_t *q_idx, + const int16_t len, + int16_t *GR ) +{ + int16_t nb_GR_0, nb_GR_1; + int16_t i; + /* find optimum length of the part encoded with GR2 */ + nb_GR_0 = 0; + nb_GR_1 = 0; + for ( i = 0; i < len; i++ ) + { + nb_GR_0 += ivas_qmetadata_encode_extended_gr_length( q_idx[i], 100, 0 ); + nb_GR_1 += ivas_qmetadata_encode_extended_gr_length( q_idx[i], 100, 1 ); + } + + if ( nb_GR_0 < nb_GR_1 ) + { + *GR = 0; + return nb_GR_0; + } + else + { + *GR = 1; + + return nb_GR_1; + } +} + + +static int16_t find_optimal_GR_orders( + const int16_t *q_idx, + const int16_t len, + const int16_t len_max_GR1, + int16_t *GR1, + int16_t *GR2, + int16_t *i_min ) +{ + int16_t nb_GR_20, nb_GR_21, nb_GR_10, nb_GR_min; + int16_t i_min_20, i_min_21, i_min_10; + /* find optimum length of the part encoded with GR2 */ + nb_GR_20 = divide_GR_orders( q_idx, 2, 0, len, len_max_GR1, &i_min_20 ); + nb_GR_21 = divide_GR_orders( q_idx, 2, 1, len, len_max_GR1, &i_min_21 ); + nb_GR_10 = divide_GR_orders( q_idx, 1, 0, len, len_max_GR1, &i_min_10 ); + + if ( nb_GR_20 < nb_GR_21 && nb_GR_20 < nb_GR_10 ) + { + *GR1 = 2; + *GR2 = 0; + nb_GR_min = nb_GR_20; + *i_min = i_min_20; + } + else + { + if ( nb_GR_21 < nb_GR_20 && nb_GR_21 < nb_GR_10 ) + { + *GR1 = 2; + *GR2 = 1; + nb_GR_min = nb_GR_21; + *i_min = i_min_21; + } + else + { + *GR1 = 1; + *GR2 = 0; + nb_GR_min = nb_GR_10; + *i_min = i_min_10; + } + } + + return nb_GR_min; +} + + +static int16_t write_stream_dct_coeffs_omasa( + int16_t *q_idx, /* i : array of indexes to be written */ + const int16_t len_stream, /* i : array length */ + BSTR_ENC_HANDLE hMetaData, /* i/o: metadata bitstream */ + const int16_t first_line, /* i : is first line of the matrix? 1/0 */ + const int16_t low_bitrate_mode /* i : is low bitrate mode? if yes, limit the number of bits written */ +) +{ + int16_t nb_bits = 0, bits_pos; + uint16_t nb_GR_min; + int16_t i, j; + int16_t changed, update_needed; + + int16_t GR1, GR2, i_min; + int16_t max_bits; + + bits_pos = hMetaData->nb_bits_tot; + if ( low_bitrate_mode == 1 ) + { + max_bits = 50; + } + else + { + max_bits = 1000; + } + + /* write DCT 0 component */ + /* write sign only if not the very first DCT coeff */ + if ( first_line == 0 ) + { + if ( q_idx[0] > 0 ) + { + push_next_indice( hMetaData, 1, 1 ); + push_next_indice( hMetaData, q_idx[0], BITS_MASA2TOTTAL_DCT0 ); + } + else + { + push_next_indice( hMetaData, 0, 1 ); + push_next_indice( hMetaData, -q_idx[0], BITS_MASA2TOTTAL_DCT0 ); + } + nb_bits += BITS_MASA2TOTTAL_DCT0 + 1; + } + else + { + push_next_indice( hMetaData, q_idx[0], BITS_MASA2TOTTAL_DCT0 ); + nb_bits += BITS_MASA2TOTTAL_DCT0; + } + + if ( q_idx[0] != 0 ) + { + i_min = 1; + GR2 = 0; + if ( len_stream >= 8 ) + { + nb_GR_min = find_optimal_GR_orders( &q_idx[1], len_stream - 1, 15, &GR1, &GR2, &i_min ); + } + else + { + nb_GR_min = find_optimal_GR_order( &q_idx[1], len_stream - 1, &GR1 ); + } + + assert( nb_GR_min < 1000 ); + changed = 1; + update_needed = 0; + while ( len_stream >= 8 && nb_GR_min > max_bits && changed >= 1 ) + { + update_needed = 1; + changed = 0; + for ( j = len_stream - 1; j > 6; j-- ) + { + if ( q_idx[j] >= 2 ) + { + + if ( j > i_min ) + { + changed = 1; + nb_GR_min -= ivas_qmetadata_encode_extended_gr_length( q_idx[j], 100, GR2 ); + q_idx[j] -= 2; + nb_GR_min += ivas_qmetadata_encode_extended_gr_length( q_idx[j], 100, GR2 ); + } + else + { + changed = 1; + nb_GR_min -= ivas_qmetadata_encode_extended_gr_length( q_idx[j], 100, GR1 ); + q_idx[j] -= 2; + nb_GR_min += ivas_qmetadata_encode_extended_gr_length( q_idx[j], 100, 0 ); + } + } + else if ( q_idx[j] == 1 ) + { + if ( j > i_min ) + { + changed = 1; + nb_GR_min -= ivas_qmetadata_encode_extended_gr_length( q_idx[j], 100, GR2 ); + q_idx[j] -= 1; + + nb_GR_min += ivas_qmetadata_encode_extended_gr_length( q_idx[j], 100, GR2 ); + } + else + { + changed = 1; + nb_GR_min -= ivas_qmetadata_encode_extended_gr_length( q_idx[j], 100, GR1 ); + q_idx[j] -= 1; + nb_GR_min += ivas_qmetadata_encode_extended_gr_length( q_idx[j], 100, 0 ); + } + } + if ( nb_GR_min < max_bits ) + { + break; + } + } + } + + if ( update_needed == 1 ) + { + /* re-calculate */ + /* find optimum length of the part encoded with GR2 */ + nb_GR_min = find_optimal_GR_orders( &q_idx[1], len_stream - 1, 15, &GR1, &GR2, &i_min ); + } + + if ( len_stream >= 8 ) + { + /* write number of indexes encoded with GR2 on 4 bits */ + push_next_indice( hMetaData, i_min, 4 ); + nb_bits += 4; + /* write GR orders */ + push_next_indice( hMetaData, GR1 - 1, 1 ); + nb_bits += 1; + if ( GR1 == 2 ) + { + push_next_indice( hMetaData, GR2, 1 ); + nb_bits += 1; + } + + /* write GR data */ + for ( i = 1; i <= i_min; i++ ) + { + ivas_qmetadata_encode_extended_gr( hMetaData, q_idx[i], 100, GR1 ); + } + + for ( i = i_min + 1; i < len_stream; i++ ) + { + ivas_qmetadata_encode_extended_gr( hMetaData, q_idx[i], 100, GR2 ); + } + } + else + { + /* len_stream <= 8 */ + /* write GR order */ + push_next_indice( hMetaData, GR1, 1 ); + nb_bits += 1; + for ( i = 1; i < len_stream; i++ ) + { + ivas_qmetadata_encode_extended_gr( hMetaData, q_idx[i], 100, GR1 ); + } + } + + nb_bits += nb_GR_min; + + assert( nb_bits == ( hMetaData->nb_bits_tot - bits_pos ) ); + } + + return nb_bits; +} + + +/*------------------------------------------------------------------------- + * ivas_omasa_encode_masa_to_total() + * + *------------------------------------------------------------------------*/ + +void ivas_omasa_encode_masa_to_total( + float masa_to_total_energy_ratio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], + BSTR_ENC_HANDLE hMetaData, + const int16_t low_bitrate_mode, + const int16_t nbands, + const int16_t nblocks ) +{ + int16_t i, j, k; + float data[MAX_PARAM_SPATIAL_SUBFRAMES * MASA_FREQUENCY_BANDS]; + float q_dct_data[MAX_PARAM_SPATIAL_SUBFRAMES * MASA_FREQUENCY_BANDS]; + float step = STEP_M2T; + int16_t q_idx[MAX_PARAM_SPATIAL_SUBFRAMES * MASA_FREQUENCY_BANDS]; + float dct_data_tmp[MAX_PARAM_SPATIAL_SUBFRAMES * MASA_FREQUENCY_BANDS]; + float dct_data[MAX_PARAM_SPATIAL_SUBFRAMES * MASA_FREQUENCY_BANDS]; + int16_t bits_pos, nb_bits; + int16_t n_streams, len_stream; + + + bits_pos = hMetaData->nb_bits_tot; + k = 0; + for ( i = 0; i < nbands; i++ ) + { + for ( j = 0; j < nblocks; j++ ) + { + data[k] = masa_to_total_energy_ratio[j][i]; + k++; + } + } + + /* DCT2 transform */ + n_streams = 1; + len_stream = nbands * nblocks; + switch ( len_stream ) + { + case 4: + matrix_product( dct4, nblocks, nblocks, 0, data, 1, nblocks, 1, dct_data ); + n_streams = 1; + len_stream = 4; + break; + case 5: + matrix_product( dct5, nbands, nbands, 0, data, 1, nbands, 1, dct_data ); + n_streams = 1; + len_stream = nbands; + break; + case 8: + matrix_product( dct8, nbands, nbands, 0, data, 1, nbands, 1, dct_data ); + n_streams = 1; + len_stream = nbands; + break; + case 12: + matrix_product( dct12, nbands, nbands, 0, data, 1, nbands, 1, dct_data ); + n_streams = 1; + len_stream = nbands; + break; + case 20: + matrix_product( dct5, nbands, nbands, 0, data, nblocks, nbands, 1, dct_data_tmp ); + matrix_product( dct_data_tmp, nbands, nblocks, 0, dct4, nblocks, nblocks, 1, dct_data ); + n_streams = 1; + len_stream = nbands * nblocks; + break; + case 32: + matrix_product( dct8, nbands, nbands, 0, data, nblocks, nbands, 1, dct_data_tmp ); + matrix_product( dct_data_tmp, nbands, nblocks, 0, dct4, nblocks, nblocks, 1, dct_data ); + n_streams = nblocks; + len_stream = nbands; + break; + default: + printf( "Incorrect number of coefficients for OMASA.\n" ); + break; + } + + for ( k = 0; k < n_streams; k++ ) + { + j = k * len_stream; + /* quantize with fixed common step */ + q_idx[j] = (int16_t) rintf( dct_data[j] / step ); + + if ( q_idx[j] > ( ( 1 << BITS_MASA2TOTTAL_DCT0 ) - 1 ) ) /* limit DCT0 to BITS_MASA2TOTTAL_DCT0 bit representation */ + { + q_idx[j] = ( ( 1 << BITS_MASA2TOTTAL_DCT0 ) - 1 ); + } + + q_dct_data[j] = step * q_idx[j]; + + if ( q_idx[j] == 0 ) + { + set_s( &q_idx[j], 0, len_stream ); + set_zero( &q_dct_data[j], len_stream ); + } + else + { + for ( i = 1; i < len_stream; i++ ) + { + q_idx[j + i] = (int16_t) rintf( dct_data[j + i] / step ); + q_dct_data[j + i] = step * q_idx[j + i]; + if ( q_idx[j + i] <= 0 ) + { + q_idx[j + i] = -2 * q_idx[j + i]; + } + else + { + q_idx[j + i] = 2 * q_idx[j + i] - 1; + } + } + } + } + + /* write data */ + nb_bits = 0; + for ( i = 0; i < n_streams; i++ ) + { + nb_bits += write_stream_dct_coeffs_omasa( &q_idx[i * len_stream], len_stream, hMetaData, ( i == 0 ), low_bitrate_mode ); + } + + /* reconstruct masa2total */ + q_dct_data[0] = q_idx[0] * step; + for ( i = 1; i < len_stream; i++ ) + { + if ( ( q_idx[i] % 2 ) == 0 ) + { + q_dct_data[i] = -( q_idx[i] >> 1 ) * step; + } + else + { + q_dct_data[i] = ( ( q_idx[i] + 1 ) >> 1 ) * step; + } + } + + /* inverse DCT2 transform */ + switch ( len_stream ) + { + case 4: + matrix_product( dct4, nblocks, nblocks, 1, q_dct_data, nblocks, 1, 0, dct_data_tmp ); + mvr2r( dct_data_tmp, q_dct_data, nblocks ); + break; + case 5: + matrix_product( dct5, nbands, nbands, 1, q_dct_data, nbands, 1, 0, dct_data_tmp ); + mvr2r( dct_data_tmp, q_dct_data, nbands ); + break; + case 8: + matrix_product( dct8, nbands, nbands, 1, q_dct_data, nbands, 1, 0, dct_data_tmp ); + mvr2r( dct_data_tmp, q_dct_data, nbands ); + break; + case 12: + matrix_product( dct12, nbands, nbands, 1, q_dct_data, nbands, 1, 0, dct_data_tmp ); + mvr2r( dct_data_tmp, q_dct_data, nbands ); + break; + case 20: + matrix_product( dct5, nbands, nbands, 1, q_dct_data, nbands, nblocks, 0, dct_data_tmp ); + matrix_product( dct_data_tmp, nbands, nblocks, 0, dct4, nblocks, nblocks, 0, q_dct_data ); /* reuse of variable*/ + break; + case 32: + matrix_product( dct8, nbands, nbands, 1, q_dct_data, nbands, nblocks, 0, dct_data_tmp ); + matrix_product( dct_data_tmp, nbands, nblocks, 0, dct4, nblocks, nblocks, 0, q_dct_data ); + break; + default: + printf( "Incorrect number of coefficients for OMASA.\n" ); + break; + } + + k = 0; + for ( i = 0; i < nblocks; i++ ) + { + for ( j = 0; j < nbands; j++ ) + { + masa_to_total_energy_ratio[i][j] = max( 0.0f, q_dct_data[k] ); + masa_to_total_energy_ratio[i][j] = min( 1.0f, masa_to_total_energy_ratio[i][j] ); + k++; + } + } + assert( nb_bits == ( hMetaData->nb_bits_tot - bits_pos ) ); + + + return; +} diff --git a/lib_enc/ivas_qspherical_enc.c b/lib_enc/ivas_qspherical_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..cb245538cbdeb46ffdf06757f79003bf242d74c0 --- /dev/null +++ b/lib_enc/ivas_qspherical_enc.c @@ -0,0 +1,661 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include "options.h" +#include +#include "ivas_cnst.h" +#include "ivas_prot.h" +#include "ivas_rom_com.h" +#include "ivas_stat_enc.h" +#include "wmc_auto.h" +#include "prot.h" + + +/*-----------------------------------------------------------------------* + * Local function prototypes + *-----------------------------------------------------------------------*/ + +static float quantize_theta_phi( float *theta_cb, const int16_t no_th, const int16_t *no_phi_loc, const float abs_theta, int16_t *id_phi, int16_t *id_phi_remap, float *phi_hat, const float phi, const int16_t no_bits, int16_t *id_theta, float *phi_q, const int16_t remap, const MC_LS_SETUP mc_format ); + +static float direction_distance_cp( float theta, float theta_hat, float theta_hat1, const float phi, const float phi_hat, const float phi_hat1, float *d1 ); + +/*-------------------------------------------------------------------* + * quantize_direction_frame() + * + * + *----------------------------------------------------------------------*/ + +void quantize_direction_frame( + IVAS_QDIRECTION *q_direction, /* i/o: quantized direction structure */ + float azimuth_orig[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES], + float elevation_orig[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES], + const int16_t hrmasa_flag /* i : flag indicating high-rate MASA MD coding*/ +) +{ + int16_t i, j; + uint16_t idx; + + /* Quantize directions */ + q_direction->not_in_2D = 0; + for ( i = q_direction->cfg.start_band; i < q_direction->cfg.nbands; i++ ) + { + idx = q_direction->band_data[i].energy_ratio_index_mod[0]; + for ( j = 0; j < q_direction->cfg.nblocks; j++ ) + { + if ( azimuth_orig != NULL ) + { + azimuth_orig[i][j] = q_direction->band_data[i].azimuth[j]; + } + + if ( elevation_orig != NULL ) + { + elevation_orig[i][j] = q_direction->band_data[i].elevation[j]; + } + + /* requantize the direction */ + q_direction->band_data[i].spherical_index[j] = quantize_direction( q_direction->band_data[i].elevation[j], + q_direction->band_data[i].azimuth[j], + q_direction->band_data[i].bits_sph_idx[j], + &q_direction->band_data[i].elevation[j], + &q_direction->band_data[i].azimuth[j], &q_direction->band_data[i].elevation_index[j], + &q_direction->band_data[i].azimuth_index[j], + q_direction->cfg.mc_ls_setup ); + + q_direction->not_in_2D += q_direction->band_data[i].elevation_index[j]; + + if ( hrmasa_flag ) + { + if ( q_direction->cfg.mc_ls_setup != MC_LS_SETUP_INVALID ) + { + q_direction->band_data[i].elevation_m_alphabet[j] = no_theta_masa[bits_direction_masa[0] - 3]; + q_direction->band_data[i].azimuth_m_alphabet[j] = no_phi_masa[bits_direction_masa[0] - 1][q_direction->band_data[i].elevation_index[j]]; + } + else + { + q_direction->band_data[i].elevation_m_alphabet[j] = no_theta_masa[bits_direction_masa[0] - 3] * 2 - 1; + q_direction->band_data[i].azimuth_m_alphabet[j] = no_phi_masa[bits_direction_masa[0] - 1][( q_direction->band_data[i].elevation_index[j] + 1 ) >> 1]; + } + } + else + { + if ( q_direction->cfg.mc_ls_setup != MC_LS_SETUP_INVALID ) + { + q_direction->band_data[i].elevation_m_alphabet[j] = no_theta_masa[bits_direction_masa[idx] - 3]; + q_direction->band_data[i].azimuth_m_alphabet[j] = no_phi_masa[bits_direction_masa[idx] - 1][q_direction->band_data[i].elevation_index[j]]; + } + else + { + q_direction->band_data[i].elevation_m_alphabet[j] = no_theta_masa[bits_direction_masa[idx] - 3] * 2 - 1; + q_direction->band_data[i].azimuth_m_alphabet[j] = no_phi_masa[bits_direction_masa[idx] - 1][( q_direction->band_data[i].elevation_index[j] + 1 ) >> 1]; + } + } + + if ( q_direction->band_data[i].azimuth_index[j] == MASA_NO_INDEX ) + { + q_direction->band_data[i].azimuth_index[j] = 0; + } + + if ( q_direction->band_data[i].bits_sph_idx[j] <= 2 ) + { + q_direction->band_data[i].elevation_index[j] = 0; + } + else + { + if ( q_direction->cfg.mc_ls_setup == MC_LS_SETUP_INVALID ) + { + /*deorder elevation indexing*/ + if ( ( q_direction->band_data[i].elevation_index[j] & 1 ) != 0 ) + { + q_direction->band_data[i].elevation_index[j] = ( ( q_direction->band_data[i].elevation_index[j] + 1 ) >> 1 ) + ( q_direction->band_data[i].elevation_m_alphabet[j] >> 1 ); + } + else + { + q_direction->band_data[i].elevation_index[j] = -( ( q_direction->band_data[i].elevation_index[j] ) >> 1 ) + ( q_direction->band_data[i].elevation_m_alphabet[j] >> 1 ); + } + } + } + } + } + + if ( q_direction->not_in_2D > 0 ) + { + q_direction->not_in_2D = 1 + MASA_LIMIT_2D; + } + + return; +} + + +/*-------------------------------------------------------------------* + * quantize_direction_frame2D() + * + * + *----------------------------------------------------------------------*/ + +void quantize_direction_frame2D( + IVAS_QDIRECTION *q_direction, /* i/o: quantized direction structure */ + float azimuth_orig[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES], + float elevation_orig[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES] ) +{ + int16_t i, j; + uint16_t idx; + /* Quantize directions */ + q_direction->not_in_2D = 0; + for ( i = q_direction->cfg.start_band; i < q_direction->cfg.nbands; i++ ) + { + idx = q_direction->band_data[i].energy_ratio_index[0]; + for ( j = 0; j < q_direction->cfg.nblocks; j++ ) + { + if ( azimuth_orig != NULL ) + { + azimuth_orig[i][j] = q_direction->band_data[i].azimuth[j]; + } + if ( elevation_orig != NULL ) + { + elevation_orig[i][j] = q_direction->band_data[i].elevation[j]; + } + q_direction->band_data[i].azimuth_m_alphabet[j] = no_phi_masa[bits_direction_masa[idx] - 1][0]; + + /* requantize the direction */ + q_direction->band_data[i].spherical_index[j] = quantize_direction2D( q_direction->band_data[i].azimuth[j], + q_direction->band_data[i].azimuth_m_alphabet[j], + &q_direction->band_data[i].azimuth[j], + &q_direction->band_data[i].azimuth_index[j], + q_direction->cfg.mc_ls_setup ); + + q_direction->band_data[i].elevation_m_alphabet[j] = 1; + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * small_requantize_direction_frame() + * + * + *----------------------------------------------------------------------*/ + +void small_requantize_direction_frame( + IVAS_QDIRECTION *q_direction, /* i/o: quantized direction structure */ + float azimuth_orig[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES], + float elevation_orig[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES], + const int16_t raw_flag[MASA_MAXIMUM_CODING_SUBBANDS], + int16_t bits_dir_bands[MASA_MAXIMUM_CODING_SUBBANDS], + int16_t *diff ) +{ + int16_t i, j; + uint16_t bits_dir[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES]; + + if ( ( *diff > 0 ) && ( q_direction->not_in_2D > 0 ) ) + { + for ( i = q_direction->cfg.start_band; i < q_direction->cfg.nbands; i++ ) + { + for ( j = 0; j < q_direction->cfg.nblocks; j++ ) + { + bits_dir[i][j] = q_direction->band_data[i].bits_sph_idx[j]; + } + } + + small_reduction_direction( q_direction, bits_dir, raw_flag, diff ); + + if ( *diff <= 0 ) + { + for ( i = q_direction->cfg.start_band; i < q_direction->cfg.nbands; i++ ) + { + if ( raw_flag[i] == 1 ) + { + bits_dir_bands[i] = 0; + for ( j = 0; j < q_direction->cfg.nblocks; j++ ) + { + bits_dir_bands[i] += bits_dir[i][j]; + q_direction->band_data[i].bits_sph_idx[j] = bits_dir[i][j]; + + /* requantize the direction */ + q_direction->band_data[i].spherical_index[j] = quantize_direction( + elevation_orig[i][j], azimuth_orig[i][j], + q_direction->band_data[i].bits_sph_idx[j], + &q_direction->band_data[i].elevation[j], &q_direction->band_data[i].azimuth[j], + &q_direction->band_data[i].elevation_index[j], &q_direction->band_data[i].azimuth_index[j], + q_direction->cfg.mc_ls_setup ); + + if ( q_direction->band_data[i].azimuth_index[j] == MASA_NO_INDEX ) + { + q_direction->band_data[i].azimuth_index[j] = 0; + } + } + } + } + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * quantize_direction() + * + * + *----------------------------------------------------------------------*/ + +/*! r: quantized spherical index */ +uint16_t quantize_direction( + const float theta, /* i : input elevation value */ + float phi, /* i : input azimuth value */ + const int16_t no_bits, /* i : number of bits */ + float *theta_q, /* o : quantized elevation */ + float *phi_q, /* o : quantized azimuth */ + uint16_t *index_theta, /* o : quantized elevation index */ + uint16_t *index_phi, /* o : quantized azimuth index */ + const MC_LS_SETUP mc_format /* i : channel format if in MC-mode */ +) +{ + float abs_theta, theta_hat, phi_hat; + int16_t i, sign_th; + int16_t cum_n[500]; + int16_t id_th, id_phi; + float theta_cb[MAX_NO_THETA]; + int16_t no_th; + uint16_t idx_sph; + int16_t id_phi_remap; + + if ( no_bits == 0 ) + { + *theta_q = 0; + *phi_q = 0; + *index_theta = MASA_NO_INDEX; + *index_phi = MASA_NO_INDEX; + return 0; + } + + if ( no_bits == 1 ) + { + *theta_q = 0; + *index_theta = MASA_NO_INDEX; + if ( ( phi < -90 ) || ( phi > 90 ) ) + { + *phi_q = -180; + *index_phi = 1; + + return 1; + } + else + { + *phi_q = 0; + *index_phi = 0; + + return 0; + } + } + + if ( no_bits == 2 ) + { + *theta_q = 0; + *index_theta = MASA_NO_INDEX; + if ( mc_format != MC_LS_SETUP_INVALID ) + { + id_phi = quantize_phi_chan_lbr( phi, &phi_hat, no_phi_masa[no_bits - 1][0] ); + phi_hat += 180; + idx_sph = id_phi; + *phi_q = phi_hat - 180; + id_phi_remap = id_phi; + *index_phi = id_phi_remap; + } + else + { + id_phi = quantize_phi( phi + 180, 0, &phi_hat, no_phi_masa[no_bits - 1][0] ); + idx_sph = id_phi; + *phi_q = phi_hat - 180; + id_phi_remap = ivas_qmetadata_reorder_generic( id_phi - ( no_phi_masa[no_bits - 1][0] >> 1 ) ); + *index_phi = id_phi_remap; + } + + return idx_sph; + } + + no_th = no_theta_masa[no_bits - 3]; + + for ( i = 0; i < no_th; i++ ) + { + theta_cb[i] = i * delta_theta_masa[no_bits - 3]; + } + + if ( theta_cb[i - 1] > 90 ) + { + theta_cb[i - 1] = 90; + } + + phi = phi + 180; + + if ( theta < 0 ) + { + abs_theta = -theta; + sign_th = -1; + } + else + { + abs_theta = theta; + sign_th = 1; + } + + theta_hat = quantize_theta_phi( theta_cb, no_th, no_phi_masa[no_bits - 1], abs_theta, &id_phi, + &id_phi_remap, &phi_hat, phi, no_bits, &id_th, phi_q, 1, mc_format ); + + if ( mc_format != MC_LS_SETUP_INVALID ) + { + /* indexing only for upper hemisphere */ + cum_n[0] = no_phi_masa[no_bits - 1][0]; + for ( i = 1; i < no_th; i++ ) + { + cum_n[i] = cum_n[i - 1] + no_phi_masa[no_bits - 1][i]; + } + + if ( id_phi < MASA_NO_INDEX ) + { + if ( id_th == 0 ) + { + idx_sph = id_phi; + } + else + { + idx_sph = cum_n[id_th - 1] + id_phi; + } + } + else + { + if ( id_th == 0 ) + { + idx_sph = 0; + } + else + { + idx_sph = cum_n[id_th - 1]; + } + } + *theta_q = theta_hat; + if ( theta_hat == 90 ) + { + *phi_q = 0; + id_phi = MASA_NO_INDEX; + } + else + { + *phi_q = phi_hat - 180; + } + *index_theta = id_th; + *index_phi = id_phi_remap; + } + else + { + /* Starting from Equator, alternating positive and negative */ + cum_n[0] = no_phi_masa[no_bits - 1][0]; + for ( i = 1; i < no_th; i++ ) + { + cum_n[2 * i - 1] = cum_n[2 * i - 2] + no_phi_masa[no_bits - 1][i]; + cum_n[2 * i] = cum_n[2 * i - 1] + no_phi_masa[no_bits - 1][i]; + } + + if ( no_th > 0 ) + { + assert( abs( cum_n[2 * ( no_th - 1 )] ) < 32768 ); + } + + if ( id_th == 0 ) + { + if ( id_phi < MASA_NO_INDEX ) + { + idx_sph = id_phi; + } + else + { + idx_sph = 0; + } + } + else + { + if ( sign_th > 0 ) + { + if ( id_phi < MASA_NO_INDEX ) + { + idx_sph = cum_n[2 * id_th - 2] + id_phi; + } + else + { + idx_sph = cum_n[2 * id_th - 2]; + } + + id_th = 2 * id_th - 1; + } + else + { + if ( id_phi < MASA_NO_INDEX ) + { + idx_sph = cum_n[2 * id_th - 1] + id_phi; + } + else + { + idx_sph = cum_n[2 * id_th - 1]; + } + id_th = 2 * id_th; + } + } + + *theta_q = sign_th * theta_hat; + if ( theta_hat == 90 ) + { + *phi_q = 0; + id_phi = MASA_NO_INDEX; + } + else + { + *phi_q = phi_hat - 180; + } + + *index_theta = id_th; + *index_phi = id_phi_remap; + } + + return idx_sph; +} + + +/*-------------------------------------------------------------------* + * direction_distance_cp() + * + * quantization distortion calculated on the sphere + *----------------------------------------------------------------------*/ + +/*! r: distortion value */ +static float direction_distance_cp( + float theta, /* i : elevation absolute value */ + float theta_hat, /* i : quantized elevation value in absolute value */ + float theta_hat1, /* i : quantized elevation value in absolute value */ + const float phi, /* i : azimuth value */ + const float phi_hat, /* i : quantized azimuth value */ + const float phi_hat1, /* i : quantized azimuth value */ + float *d1 ) +{ + float d, ct, st, st1, st2; + + theta *= PI_OVER_180; + theta_hat *= PI_OVER_180; + theta_hat1 *= PI_OVER_180; + st = sinf( theta ); + ct = cosf( theta ); + st1 = sinf( theta_hat ); + st2 = sinf( theta_hat1 ); + + d = st * st1 + ct * ( sqrtf( 1 - st1 * st1 ) ) * cosf( ( phi - phi_hat ) * PI_OVER_180 ); + *d1 = st * st2 + ct * ( sqrtf( 1 - st2 * st2 ) ) * cosf( ( phi - phi_hat1 ) * PI_OVER_180 ); + + return d; +} + + +/*-------------------------------------------------------------------* + * quantize_theta_phi() + * + * joint quantization of elevation and azimuth + *----------------------------------------------------------------------*/ + +/*! r: quantized elevation value */ +static float quantize_theta_phi( + float *theta_cb, /* i : elevation codebook */ + const int16_t no_th, /* i : elevation codebook size */ + const int16_t *no_phi_loc, /* i : number of azimuth values for each elevation codeword*/ + const float abs_theta, /* i : absolute value of elevation to be quantized */ + int16_t *id_phi, /* o : azimuth index */ + int16_t *id_phi_remap, /* o : remapped azimuth index */ + float *phi_hat, /* o : quantized azimuth value */ + const float phi, /* i : input azimuth value; to be quantized */ + const int16_t no_bits, /* i : number of bits used for quantization */ + int16_t *id_theta, /* o : elevation index */ + float *phi_q, /* o : rotated quantized azimuth */ + const int16_t remap, /* i : flag for remapping */ + const MC_LS_SETUP mc_format /* i : channel format if in MC-mode */ +) +{ + float theta_hat, theta_hat1, phi_hat1; + int16_t id_th, id_th1, id_th2, id_ph, id_ph1; + float d, d1; + + id_th = (int16_t) ( abs_theta / delta_theta_masa[no_bits - 3] ); + if ( id_th >= no_th ) + { + id_th = no_th - 1; + } + theta_hat = theta_cb[id_th]; + if ( id_th < no_th - 1 ) + { + id_th += squant( abs_theta, &theta_hat, &theta_cb[id_th], 2 ); + } + + if ( no_th > 1 ) + { + if ( ( no_th < 6 ) && mc_format == MC_LS_SETUP_INVALID ) + { + if ( id_th == 0 ) + { + id_th1 = 1; + } + else if ( id_th == no_th - 1 ) + { + id_th1 = no_th - 2; + } + else + { + id_th1 = id_th - 1; + id_th2 = id_th + 1; + + if ( fabsf( abs_theta - theta_cb[id_th1] ) > fabsf( abs_theta - theta_cb[id_th2] ) ) + { + id_th1 = id_th2; + } + } + } + else + { + id_th1 = id_th; + } + + if ( no_phi_loc[id_th] > 1 ) + { + /* Note: (id_th % 2 == 1) must be equal to id_th % 2 */ + if ( mc_format != MC_LS_SETUP_INVALID ) + { + id_ph = quantize_phi_chan_compand( phi, phi_hat, no_phi_loc[id_th], ( theta_cb[id_th] > MC_MASA_THR_ELEVATION ), mc_format ); + *id_phi_remap = id_ph; + } + else + { + id_ph = quantize_phi( phi, ( id_th % 2 == 1 ), phi_hat, no_phi_loc[id_th] ); + } + } + else + { + id_ph = MASA_NO_INDEX; + *id_phi_remap = MASA_NO_INDEX; + *phi_hat = 180; + *phi_q = 0; + } + + if ( ( no_phi_loc[id_th1] > 1 ) && ( id_ph < MASA_NO_INDEX ) && ( no_th < 6 ) && ( mc_format == MC_LS_SETUP_INVALID ) ) + { + theta_hat1 = theta_cb[id_th1]; + + id_ph1 = quantize_phi( phi, ( id_th1 % 2 == 1 ), &phi_hat1, no_phi_loc[id_th1] ); + + d = direction_distance_cp( abs_theta, theta_hat, theta_hat1, phi, *phi_hat, phi_hat1, &d1 ); + + if ( d1 > d ) + { + *phi_hat = phi_hat1; + id_ph = id_ph1; + theta_hat = theta_cb[id_th1]; + id_th = id_th1; + } + } + } + else + { + if ( mc_format != MC_LS_SETUP_INVALID ) + { + id_ph = quantize_phi_chan_compand( phi, phi_hat, no_phi_loc[id_th], 0, mc_format ); + *id_phi_remap = id_ph; + } + else + { + id_ph = quantize_phi( phi, ( id_th % 2 == 1 ), phi_hat, no_phi_loc[id_th] ); + } + } + + if ( remap ) + { + if ( id_ph < MASA_NO_INDEX ) + { + *id_phi_remap = ivas_qmetadata_reorder_generic( id_ph - ( no_phi_loc[id_th] >> 1 ) ); + } + } + else + { + *id_phi_remap = id_ph; + } + + *id_phi = id_ph; + *id_theta = id_th; + + return theta_hat; +} diff --git a/lib_enc/ivas_range_uni_enc.c b/lib_enc/ivas_range_uni_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..6781c750a3e4780ef1c6da6a1106d4bf24311a54 --- /dev/null +++ b/lib_enc/ivas_range_uni_enc.c @@ -0,0 +1,316 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "ivas_prot.h" +#include "ivas_cnst.h" +#include "ivas_stat_enc.h" +#include "cnst.h" +#include "rom_com.h" +#include +#include "options.h" +#include "prot.h" +#include "wmc_auto.h" + + +/* + * After finalizing the range encoder, the produced bits are available in the + * rc_st_enc->byte_buffer member array. The bits are packed into bytes, MSB first, as + * byte_buffer[0].bit[7], ..., byte_buffer[0].bit[0], byte_buffer[1].bit[7], ... + * The last byte may contain less than 8 bits. The total bit count is returned + * by the rc_uni_enc_finish function but can also be computed afterwards as + * total_bit_count = (rc_st_enc->byte_count - 1) * 8 + rc_st_enc->last_byte_bit_count + */ + +/*-------------------------------------------------------------------* + * Local function prototypes + *-------------------------------------------------------------------*/ + +static void rc_uni_enc_shift( RangeUniEncState *rc_st_enc ); + + +/*-------------------------------------------------------------------* + * rc_uni_enc_init() + * + * Initalize the range encoder + *-------------------------------------------------------------------*/ + +void rc_uni_enc_init( + RangeUniEncState *rc_st_enc /* i/o: RC state handle */ +) +{ + rc_st_enc->rc_low = 0; + rc_st_enc->rc_range = 0xFFFFFFFF; + rc_st_enc->rc_cache = -1; + rc_st_enc->rc_carry = 0; + rc_st_enc->rc_carry_count = 0; + + rc_st_enc->byte_count = 0; + rc_st_enc->last_byte_bit_count = -1; + + return; +} + +/*-------------------------------------------------------------------* + * rc_uni_enc_encode_fast() + * + * Encode given cumulative frequency and frequency when total frequency is a power of 2 + *-------------------------------------------------------------------*/ + +void rc_uni_enc_encode_fast( + RangeUniEncState *rc_st_enc, /* i/o: RC state handle */ + const uint16_t cum_freq, /* i : Cumulative frequency up to symbol */ + const uint16_t sym_freq, /* i : Symbol frequency */ + const uint16_t tot_shift /* i : Total frequency as a power of 2 */ +) +{ + uint32_t r, tmp; + + r = rc_st_enc->rc_range >> tot_shift; + tmp = r * cum_freq; + + rc_st_enc->rc_low += tmp; + if ( rc_st_enc->rc_low < tmp ) + { + rc_st_enc->rc_carry = 1; + } + + rc_st_enc->rc_range = r * sym_freq; + + /* rc_range was shifted right by up to 16, so at most two renormalizations are needed */ + if ( rc_st_enc->rc_range < 0x01000000 ) + { + rc_st_enc->rc_range <<= 8; + rc_uni_enc_shift( rc_st_enc ); + if ( rc_st_enc->rc_range < 0x01000000 ) + { + rc_st_enc->rc_range <<= 8; + rc_uni_enc_shift( rc_st_enc ); + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * rc_uni_enc_encode_symbol_fastS() + * + * Encode an alphabet symbol when total frequency is a power of 2 + *-------------------------------------------------------------------*/ + +void rc_uni_enc_encode_symbol_fastS( + RangeUniEncState *rc_st_enc, /* i/o: Encoder state */ + const uint16_t symbol, /* i : Symbol to encode */ + const uint16_t cum_freq[], /* i : Cumulative frequency up to symbol */ + const uint16_t sym_freq[], /* i : Symbol frequency */ + const uint16_t tot_shift /* i : Total frequency as a power of 2 */ +) +{ + rc_uni_enc_encode_fast( rc_st_enc, cum_freq[symbol], sym_freq[symbol], tot_shift ); + + return; +} + + +/*-------------------------------------------------------------------* + * rc_uni_enc_finish() + * + * Finalize the range encoder + *-------------------------------------------------------------------*/ + +/*! r: Total number of bits produced */ +int16_t rc_uni_enc_finish( + RangeUniEncState *rc_st_enc /* i/o: RC state handle */ +) +{ + int16_t total_bit_count; + uint32_t val, mask; + int16_t bits; + + /* floor(log2(x)) = floor(log2(x >> 24)) + 24, for any x >= 2 ^ 24 */ + /* 32 - floor(log2(y)) = norm_ul(y) + 1 = norm_l(y >> 24) - 22 */ + bits = norm_l( rc_st_enc->rc_range >> 24 ) - 22; /* bits = 32 - floor(log2(rc_range)) */ + /* completely equivalent with norm_ul(rc_st_enc->rc_range) + 1, but norm_l is faster */ + + bits++; /* conservative number of bits, because the decoder only has rc_range available */ + + + mask = 0xFFFFFFFFu >> bits; + val = ( rc_st_enc->rc_low + mask ) & ~mask; + + if ( val < rc_st_enc->rc_low ) + { + rc_st_enc->rc_carry = 1; + } + + rc_st_enc->rc_low = val; + + while ( bits > 0 ) + { + rc_uni_enc_shift( rc_st_enc ); + bits -= 8; + } + + bits += 8; + + if ( rc_st_enc->rc_carry_count > 0 ) + { + /* rc_carry_count > 0, therefore the last call to rc_uni_enc_shift incremented rc_carry_count */ + if ( rc_st_enc->rc_cache >= 0 ) /* may actually be always true, but it is difficult to prove formally */ + { + rc_st_enc->byte_buffer[rc_st_enc->byte_count++] = (uint8_t) ( rc_st_enc->rc_cache + rc_st_enc->rc_carry ); + } + + while ( rc_st_enc->rc_carry_count > 1 ) + { + rc_st_enc->byte_buffer[rc_st_enc->byte_count++] = (uint8_t) ( rc_st_enc->rc_carry + 0xFF ); + rc_st_enc->rc_carry_count--; + } + /* pack the last 1 to 8 bits into the MSB of the last byte, with zero padding into the LSB */ + rc_st_enc->byte_buffer[rc_st_enc->byte_count++] = (uint8_t) ( ( rc_st_enc->rc_carry + 0xFF ) & ( 0xFFu << ( 8 - bits ) ) ); + rc_st_enc->last_byte_bit_count = bits; + } + else + { + /* rc_carry_count == 0, therefore the last call to rc_uni_enc_shift wrote into rc_cache */ + /* pack the last 1 to 8 bits into the MSB of the last byte, with zero padding into the LSB */ + rc_st_enc->byte_buffer[rc_st_enc->byte_count++] = (uint8_t) ( ( rc_st_enc->rc_cache + rc_st_enc->rc_carry ) & ( 0xFFu << ( 8 - bits ) ) ); + rc_st_enc->last_byte_bit_count = bits; + } + + + total_bit_count = ( ( rc_st_enc->byte_count - 1 ) << 3 ) + rc_st_enc->last_byte_bit_count; + + return total_bit_count; +} + + +/*-------------------------------------------------------------------* + * rc_uni_enc_virtual_finish() + * + * Get the total number of bits that would be produced by finalization + *-------------------------------------------------------------------*/ + +/*! r: Total number of bits produced */ +int16_t rc_uni_enc_virtual_finish( + RangeUniEncState *rc_st_enc /* i : RC state handle */ +) +{ + + /* + byte_count bytes have already been written to the byte_buffer array + 1 byte is pending if rc_cache >= 0, consisting of rc_cache or rc_cache + 1 + the pending byte bits are computed as 8 - 8 * ((uint16_t) rc_st_enc->rc_cache >> 15) + rc_carry_count bytes are pending, consisting of 0x00 or 0xFF + bits bits will be additionally written during the finalization procedure + bits is computed as norm_l(rc_st_enc->rc_range >> 24) - 21, as in rc_uni_enc_finish + */ + return ( ( rc_st_enc->byte_count + rc_st_enc->rc_carry_count ) << 3 ) + + norm_l( rc_st_enc->rc_range >> 24 ) - 13 - 8 * ( (uint16_t) rc_st_enc->rc_cache >> 15 ); +} + + +/*-------------------------------------------------------------------* + * rc_uni_enc_shift() + * + * Shift a byte out to bitstream (internal function) + *-------------------------------------------------------------------*/ + +static void rc_uni_enc_shift( + RangeUniEncState *rc_st_enc /* i/o: RC state handle */ +) +{ + if ( ( rc_st_enc->rc_low < 0xFF000000u ) || rc_st_enc->rc_carry ) + { + if ( rc_st_enc->rc_cache >= 0 ) + { + rc_st_enc->byte_buffer[rc_st_enc->byte_count++] = (uint8_t) ( rc_st_enc->rc_cache + rc_st_enc->rc_carry ); + } + + while ( rc_st_enc->rc_carry_count > 0 ) + { + rc_st_enc->byte_buffer[rc_st_enc->byte_count++] = (uint8_t) ( rc_st_enc->rc_carry + 0xFF ); + rc_st_enc->rc_carry_count--; + } + + rc_st_enc->rc_cache = (int16_t) ( rc_st_enc->rc_low >> 24 ); + rc_st_enc->rc_carry = 0; + } + else + { + rc_st_enc->rc_carry_count++; + } + + rc_st_enc->rc_low <<= 8; + + return; +} + + +/*-------------------------------------------------------------------* + * rc_uni_enc_encode_bits() + * + * Encode up to 16 bits with uniform probability + *-------------------------------------------------------------------*/ + +void rc_uni_enc_encode_bits( + RangeUniEncState *rc_st_enc, /* i/o: RC state handle */ + const uint16_t value, /* i : Value to encode */ + const int16_t bits /* i : Number of bits */ +) +{ + uint32_t tmp; + + rc_st_enc->rc_range >>= bits; + tmp = rc_st_enc->rc_range * value; + + rc_st_enc->rc_low += tmp; + if ( rc_st_enc->rc_low < tmp ) + { + rc_st_enc->rc_carry = 1; + } + + /* rc_range was shifted right by up to 16, so at most two renormalizations are needed */ + if ( rc_st_enc->rc_range < 0x01000000 ) + { + rc_st_enc->rc_range <<= 8; + rc_uni_enc_shift( rc_st_enc ); + if ( rc_st_enc->rc_range < 0x01000000 ) + { + rc_st_enc->rc_range <<= 8; + rc_uni_enc_shift( rc_st_enc ); + } + } + + return; +} diff --git a/lib_enc/ivas_rom_enc.c b/lib_enc/ivas_rom_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..07e5c5c5fd750de4356ab11b9934872797d1a364 --- /dev/null +++ b/lib_enc/ivas_rom_enc.c @@ -0,0 +1,844 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "cnst.h" +#include "ivas_cnst.h" +#include +#include "wmc_auto.h" + +/* clang-format off */ + + +/*----------------------------------------------------------------------------------* +* Stereo classifiers ROM tables +*----------------------------------------------------------------------------------*/ + +/* UNCLR classifier in TD stereo: list of selected features */ +const int16_t unclr_isel_td[SIZE_UNCLR_ISEL_TD] = +{ + E_corrLagStats0, E_ica_instTargetGain, E_sum_prod, E_tdm_es_em, E_m_corrL_corrR, E_d_corrL_corrR, E_corrEst0, E_corrLagMax, E_corrEstMax, E_corrEst_ncorr +}; + +/* UNCLR classifier in TD stereo:: mean & scale for feature normalization */ +const float unclr_mean_td[SIZE_UNCLR_ISEL_TD] = +{ + 5.074380f, 4.997180f, 6.392375f, 1.542880f, 1.060308f, 7.301348f, 0.000628f, 38.998173f, 0.001354f, 0.588078f +}; + +const float unclr_scale_td[SIZE_UNCLR_ISEL_TD] = +{ + 42.281556f, 0.960498f, 1.846462f, 2.370811f, 0.738786f, 1.301314f, 0.001185f, 20.638149f, 0.009281f, 0.348742f +}; + +/* UNCLR classifier in TD stereo: classifier parameters for logistic regression */ +const float unclr_coef_td[SIZE_UNCLR_ISEL_TD] = +{ + -0.179304f, -2.443089f, -3.531498f, 1.439316f, 0.688796f, 2.913693f, 0.039382f, -0.040637f, -4.519369f, -0.438573f +}; + +/* UNCLR classifier in DFT stereo: list of selected features */ +const int16_t unclr_isel_dft[SIZE_UNCLR_ISEL_DFT] = +{ + E_gainILD, E_gainIPD, E_angle_rot, E_g_pred, E_cohSNR, E_d_prodL_prodR, E_sum_xcorr, E_xcorr_itd_value +}; + +/* UNCLR classifier in DFT stereo: mean & scale for normalization */ +const float unclr_mean_dft[SIZE_UNCLR_ISEL_DFT] = +{ + 0.424806f, -4.660972f, 0.537442f, 24.190099f, 35.192984f, 2.753954f, -3238.908177f, 0.287240f +}; + +const float unclr_scale_dft[SIZE_UNCLR_ISEL_DFT] = +{ + 0.338259f, 3.372571f, 0.545282f, 2.976819f, 73.266110f, 3.250287f, 278.725735f, 0.226197f +}; + +/* UNCLR classifier in DFT stereo: classifier parameters for logistic regression */ +const float unclr_coef_dft[SIZE_UNCLR_ISEL_DFT] = +{ + 0.457185f, -1.589460f, -0.349225f, -1.361723f, 4.198681f, 1.514662f, -0.822283f, -3.048849f +}; + +/* xtalk clasifier in TD stereo: list of selected features */ +const int16_t xtalk_isel_td[SIZE_XTALK_ISEL_TD] = +{ + E_d_clas, E_d_voicing, E_sum_d_LSF, E_d_lepsP_13, E_d_cor_map_sum, E_d_nchar, E_d_non_sta, E_d_sp_div, E_sum_prod, E_tdm_es_em, E_m_corrL_corrR, E_corrEst0, E_corrEst_ncorr, E_corrLagStats0, E_ica_corr_value0, E_diff_corrLM_corrRM, E_tdm_LT_es_em +}; + +const float xtalk_mean_td[SIZE_XTALK_ISEL_TD] = +{ + 0.597295f, 0.131934f, 1363.371521f, 0.638677f, 7.585252f, 0.154930f, 3.756674f, 0.586091f, + 6.652016f, 1.751437f, 0.691171f, 0.000635f, 0.706242f, 10.449559f, 0.001793f, 0.018677f, + -2.173592f, +}; + +const float xtalk_scale_td[SIZE_XTALK_ISEL_TD] = +{ + 1.135851f, 0.077901f, 492.796683f, 0.573300f, 5.836897f, 0.400097f, 4.251400f, 0.627058f, + 1.385744f, 1.849872f, 0.537935f, 0.001305f, 0.278421f, 63.178669f, 0.002675f, 0.657621f, + 2.104726f +}; + +const float xtalk_coef_td[SIZE_XTALK_ISEL_TD] = +{ + 0.056173f, 0.132854f, 0.101365f, -0.165130f, 0.032372f, 0.082887f, -0.074870f, 0.031933f, + 1.379376f, -1.570864f, -0.074181f, -0.068519f, 0.066952f, -0.016555f, -4.145916f, 0.003024f, + 0.553536f +}; + +const int16_t xtalk_isel_dft[SIZE_XTALK_ISEL_DFT] = +{ + E_clas, E_gainILD, E_gainIPD, E_angle_rot, E_g_pred, E_d_prodL_prodR, E_sum_xcorr, E_xcorr_itd_value, E_gphat_d_itd2, E_gphat_ratio_m1_m2, E_gphat_m2_m2 +}; + +const float xtalk_mean_dft[SIZE_XTALK_ISEL_DFT] = +{ + 1.852478f, 0.211747f, -3.253483f, 0.758069f, 23.766095f, 1.634010f, -3115.264805f, 0.423402f, + 14.629498f, 0.000570f, 0.011686f +}; + +const float xtalk_scale_dft[SIZE_XTALK_ISEL_DFT] = +{ + 1.507352f, 0.159956f, 2.497517f, 0.469123f, 2.825375f, 0.932028f, 261.555949f, 0.205413f, + 35.216496f, 0.001153f, 0.025744f +}; + +const float xtalk_coef_dft[SIZE_XTALK_ISEL_DFT] = +{ + -0.082911f, -0.057949f, 0.089754f, -0.167106f, 1.289470f, 0.054620f, 0.667244f, -0.358486f, + 0.032200f, 1.141818f, 1.824479f +}; + + +/*----------------------------------------------------------------------------------* + * Stereo IC-BWE ROM tables + *----------------------------------------------------------------------------------*/ + +const float icbwe_thr_TDM[7] = { -1.22828f, -1.55314f, -0.998893f, 0.856996f, 0.836244f, 0.872327f, 0.972167f }; +const float icbwe_thr_DFT[7] = { -1.19952f, -1.42293f, -1.074940f, -1.63089f, 0.889989f, 0.893530f, 0.975288f }; +const float icbwe_regressionValuesTDM[8] = { 0.104430f, 0.025943f, 0.50332f, 0.12767f, 0.80566f, 0.27640f, 0.98366f, 0.35556f }; +const float icbwe_regressionValuesDFT[8] = { 0.030371f, 0.155500f, 0.52510f, 0.10623f, 0.79167f, 0.23188f, 0.98325f, 0.00000f }; + + +/*----------------------------------------------------------------------------------* + * DFT stereo ROM tables + *----------------------------------------------------------------------------------*/ + +/* DFT stereo ITD ROM table */ +const int16_t itd_vad_band_tbl[STEREO_DFT_ITD_VAD_BAND_NUM+1] = +{ + 5, 8, 11, 16, 21, 26, 30, 37, 43, 51, 59, + 69, 80, 93, 107, 126, 147, 176, 211, 254, 320 +}; + +const int16_t ild_q[16] = +{ + 0,2,4,6,8,10,13,16,19,22,25,30,35,40,45,50 +}; + +/* table of values of the analysis window cross-correlation function at 32kHz (stride 8) */ +const float Wn_table[50] = +{ + 1.0000000f, 0.9992902f, 0.9975037f, 0.9948399f, 0.9914063f, 0.9872797f, 0.9825207f, 0.9771799f, + 0.9713015f, 0.9649245f, 0.9580846f, 0.9508143f, 0.9431443f, 0.9351030f, 0.9267174f, 0.9180131f, + 0.9090145f, 0.8997447f, 0.8902261f, 0.8804801f, 0.8705271f, 0.8603868f, 0.8500779f, 0.8396186f, + 0.8290262f, 0.8183170f, 0.8075067f, 0.7966103f, 0.7856416f, 0.7746140f, 0.7635394f, 0.7524292f, + 0.7412935f, 0.7301411f, 0.7189796f, 0.7078147f, 0.6966495f, 0.6854842f, 0.6743189f, 0.6631536f, + 0.6519884f, 0.6408231f, 0.6296578f, 0.6184926f, 0.6073273f, 0.5961620f, 0.5849968f, 0.5738315f, + 0.5626662f, 0.5515010f +}; + + +const float win_ana_8k[STEREO_DFT_OVL_8k] = { + 0.1059233f, 0.1834491f, 0.2367920f, 0.2801055f, 0.3175031f, 0.3508655f, 0.3812388f, 0.4092752f, 0.4354137f, 0.4599658f, 0.4831618f, 0.5051779f, 0.5261516f, 0.5461931f, + 0.5653920f, 0.5838222f, 0.6015455f, 0.6186141f, 0.6350726f, 0.6509591f, 0.6663070f, 0.6811452f, 0.6954990f, 0.7093909f, 0.7228406f, 0.7358659f, 0.7484825f, 0.7607045f, + 0.7725446f, 0.7840144f, 0.7951242f, 0.8058834f, 0.8163005f, 0.8263834f, 0.8361392f, 0.8455743f, 0.8546946f, 0.8635057f, 0.8720126f, 0.8802198f, 0.8881316f, 0.8957518f, + 0.9030841f, 0.9101318f, 0.9168978f, 0.9233852f, 0.9295963f, 0.9355338f, 0.9411997f, 0.9465961f, 0.9517249f, 0.9565878f, 0.9611865f, 0.9655225f, 0.9695970f, 0.9734113f, + 0.9769666f, 0.9802639f, 0.9833041f, 0.9860882f, 0.9886168f, 0.9908907f, 0.9929104f, 0.9946765f, 0.9961895f, 0.9974497f, 0.9984575f, 0.9992131f, 0.9997167f, 0.9999685f +}; + +const float win_ana_12k8[STEREO_DFT_OVL_12k8] = { + 0.0837402f, 0.1450376f, 0.1872304f, 0.2215122f, 0.2511383f, 0.2775984f, 0.3017218f, 0.3240268f, 0.3448624f, 0.3644768f, 0.3830541f, 0.4007353f, 0.4176308f, 0.4338293f, + 0.4494032f, 0.4644124f, 0.4789072f, 0.4929302f, 0.5065180f, 0.5197022f, 0.5325102f, 0.5449661f, 0.5570911f, 0.5689042f, 0.5804221f, 0.5916599f, 0.6026310f, 0.6133477f, + 0.6238210f, 0.6340610f, 0.6440769f, 0.6538770f, 0.6634690f, 0.6728599f, 0.6820563f, 0.6910641f, 0.6998889f, 0.7085358f, 0.7170096f, 0.7253147f, 0.7334552f, 0.7414351f, + 0.7492578f, 0.7569267f, 0.7644450f, 0.7718156f, 0.7790413f, 0.7861246f, 0.7930681f, 0.7998740f, 0.8065444f, 0.8130814f, 0.8194870f, 0.8257629f, 0.8319109f, 0.8379325f, + 0.8438293f, 0.8496028f, 0.8552543f, 0.8607852f, 0.8661966f, 0.8714897f, 0.8766657f, 0.8817256f, 0.8866704f, 0.8915011f, 0.8962185f, 0.9008235f, 0.9053169f, 0.9096996f, + 0.9139721f, 0.9181354f, 0.9221899f, 0.9261364f, 0.9299754f, 0.9337076f, 0.9373334f, 0.9408535f, 0.9442682f, 0.9475780f, 0.9507835f, 0.9538850f, 0.9568830f, 0.9597777f, + 0.9625697f, 0.9652591f, 0.9678465f, 0.9703319f, 0.9727159f, 0.9749986f, 0.9771802f, 0.9792612f, 0.9812416f, 0.9831216f, 0.9849016f, 0.9865817f, 0.9881621f, 0.9896429f, + 0.9910243f, 0.9923065f, 0.9934895f, 0.9945735f, 0.9955587f, 0.9964450f, 0.9972326f, 0.9979216f, 0.9985121f, 0.9990040f, 0.9993975f, 0.9996926f, 0.9998894f, 0.9999877f +}; + +const float win_ana_16k[STEREO_DFT_OVL_16k] = { + 0.0748996f, 0.1297273f, 0.1674702f, 0.1981409f, 0.2246518f, 0.2483359f, 0.2699355f, 0.2899147f, 0.3085859f, 0.3261718f, 0.3428373f, 0.3587088f, 0.3738855f, 0.3884471f, + 0.4024586f, 0.4159739f, 0.4290383f, 0.4416903f, 0.4539628f, 0.4658842f, 0.4774796f, 0.4887705f, 0.4997764f, 0.5105143f, 0.5209995f, 0.5312456f, 0.5412649f, 0.5510687f, + 0.5606670f, 0.5700690f, 0.5792832f, 0.5883171f, 0.5971780f, 0.6058722f, 0.6144058f, 0.6227843f, 0.6310130f, 0.6390964f, 0.6470392f, 0.6548454f, 0.6625189f, 0.6700633f, + 0.6774820f, 0.6847781f, 0.6919547f, 0.6990145f, 0.7059601f, 0.7127940f, 0.7195186f, 0.7261361f, 0.7326485f, 0.7390578f, 0.7453658f, 0.7515744f, 0.7576852f, 0.7636998f, + 0.7696197f, 0.7754464f, 0.7811811f, 0.7868252f, 0.7923800f, 0.7978465f, 0.8032260f, 0.8085194f, 0.8137279f, 0.8188523f, 0.8238936f, 0.8288528f, 0.8337305f, 0.8385278f, + 0.8432452f, 0.8478836f, 0.8524437f, 0.8569262f, 0.8613317f, 0.8656608f, 0.8699141f, 0.8740923f, 0.8781958f, 0.8822253f, 0.8861811f, 0.8900638f, 0.8938739f, 0.8976117f, + 0.9012778f, 0.9048726f, 0.9083963f, 0.9118496f, 0.9152326f, 0.9185457f, 0.9217893f, 0.9249638f, 0.9280693f, 0.9311063f, 0.9340749f, 0.9369756f, 0.9398085f, 0.9425739f, + 0.9452721f, 0.9479033f, 0.9504677f, 0.9529655f, 0.9553969f, 0.9577622f, 0.9600615f, 0.9622951f, 0.9644630f, 0.9665655f, 0.9686028f, 0.9705749f, 0.9724820f, 0.9743244f, + 0.9761020f, 0.9778151f, 0.9794637f, 0.9810480f, 0.9825681f, 0.9840241f, 0.9854162f, 0.9867443f, 0.9880086f, 0.9892091f, 0.9903460f, 0.9914194f, 0.9924292f, 0.9933757f, + 0.9942587f, 0.9950785f, 0.9958349f, 0.9965282f, 0.9971583f, 0.9977253f, 0.9982292f, 0.9986700f, 0.9990478f, 0.9993626f, 0.9996144f, 0.9998033f, 0.9999292f, 0.9999921f +}; + +const float win_ana_32k[STEREO_DFT_OVL_32k] = { + 0.0529622f, 0.0917327f, 0.1184251f, 0.1401203f, 0.1588781f, 0.1756418f, 0.1909367f, 0.2050914f, 0.2183273f, 0.2308022f, 0.2426331f, 0.2539096f, 0.2647024f, 0.2750681f, + 0.2850529f, 0.2946952f, 0.3040274f, 0.3130769f, 0.3218673f, 0.3304190f, 0.3387497f, 0.3468753f, 0.3548095f, 0.3625647f, 0.3701518f, 0.3775808f, 0.3848606f, 0.3919992f, + 0.3990041f, 0.4058820f, 0.4126390f, 0.4192807f, 0.4258123f, 0.4322386f, 0.4385641f, 0.4447928f, 0.4509286f, 0.4569750f, 0.4629354f, 0.4688128f, 0.4746101f, 0.4803301f, + 0.4859752f, 0.4915480f, 0.4970507f, 0.5024854f, 0.5078541f, 0.5131587f, 0.5184011f, 0.5235829f, 0.5287058f, 0.5337712f, 0.5387807f, 0.5437357f, 0.5486374f, 0.5534872f, + 0.5582862f, 0.5630356f, 0.5677365f, 0.5723899f, 0.5769968f, 0.5815583f, 0.5860751f, 0.5905483f, 0.5949786f, 0.5993669f, 0.6037139f, 0.6080204f, 0.6122871f, 0.6165148f, + 0.6207040f, 0.6248554f, 0.6289696f, 0.6330473f, 0.6370889f, 0.6410952f, 0.6450665f, 0.6490034f, 0.6529064f, 0.6567761f, 0.6606128f, 0.6644170f, 0.6681891f, 0.6719296f, + 0.6756389f, 0.6793174f, 0.6829654f, 0.6865834f, 0.6901716f, 0.6937305f, 0.6972603f, 0.7007615f, 0.7042343f, 0.7076790f, 0.7110959f, 0.7144854f, 0.7178476f, 0.7211830f, + 0.7244917f, 0.7277740f, 0.7310301f, 0.7342604f, 0.7374650f, 0.7406442f, 0.7437982f, 0.7469272f, 0.7500315f, 0.7531112f, 0.7561666f, 0.7591979f, 0.7622051f, 0.7651886f, + 0.7681486f, 0.7710851f, 0.7739984f, 0.7768886f, 0.7797560f, 0.7826006f, 0.7854226f, 0.7882223f, 0.7909996f, 0.7937548f, 0.7964881f, 0.7991995f, 0.8018892f, 0.8045574f, + 0.8072041f, 0.8098295f, 0.8124337f, 0.8150168f, 0.8175790f, 0.8201204f, 0.8226411f, 0.8251411f, 0.8276207f, 0.8300798f, 0.8325187f, 0.8349374f, 0.8373360f, 0.8397146f, + 0.8420733f, 0.8444122f, 0.8467314f, 0.8490310f, 0.8513110f, 0.8535716f, 0.8558128f, 0.8580348f, 0.8602375f, 0.8624211f, 0.8645856f, 0.8667312f, 0.8688579f, 0.8709657f, + 0.8730548f, 0.8751252f, 0.8771769f, 0.8792101f, 0.8812248f, 0.8832211f, 0.8851990f, 0.8871586f, 0.8891000f, 0.8910231f, 0.8929281f, 0.8948151f, 0.8966840f, 0.8985350f, + 0.9003680f, 0.9021832f, 0.9039805f, 0.9057601f, 0.9075220f, 0.9092663f, 0.9109928f, 0.9127019f, 0.9143934f, 0.9160674f, 0.9177239f, 0.9193631f, 0.9209849f, 0.9225894f, + 0.9241766f, 0.9257466f, 0.9272994f, 0.9288350f, 0.9303534f, 0.9318548f, 0.9333392f, 0.9348065f, 0.9362568f, 0.9376902f, 0.9391066f, 0.9405062f, 0.9418889f, 0.9432548f, + 0.9446039f, 0.9459362f, 0.9472518f, 0.9485506f, 0.9498328f, 0.9510983f, 0.9523472f, 0.9535795f, 0.9547953f, 0.9559944f, 0.9571771f, 0.9583432f, 0.9594929f, 0.9606261f, + 0.9617429f, 0.9628432f, 0.9639272f, 0.9649948f, 0.9660460f, 0.9670810f, 0.9680996f, 0.9691019f, 0.9700880f, 0.9710578f, 0.9720113f, 0.9729487f, 0.9738699f, 0.9747748f, + 0.9756637f, 0.9765363f, 0.9773929f, 0.9782333f, 0.9790576f, 0.9798658f, 0.9806580f, 0.9814341f, 0.9821941f, 0.9829381f, 0.9836661f, 0.9843781f, 0.9850741f, 0.9857542f, + 0.9864182f, 0.9870663f, 0.9876985f, 0.9883147f, 0.9889149f, 0.9894993f, 0.9900678f, 0.9906203f, 0.9911570f, 0.9916778f, 0.9921827f, 0.9926718f, 0.9931450f, 0.9936024f, + 0.9940439f, 0.9944696f, 0.9948794f, 0.9952735f, 0.9956517f, 0.9960142f, 0.9963608f, 0.9966916f, 0.9970067f, 0.9973060f, 0.9975895f, 0.9978572f, 0.9981091f, 0.9983453f, + 0.9985657f, 0.9987704f, 0.9989593f, 0.9991324f, 0.9992898f, 0.9994315f, 0.9995574f, 0.9996676f, 0.9997620f, 0.9998407f, 0.9999036f, 0.9999508f, 0.9999823f, 0.9999980f +}; + +const float win_ana_48k[STEREO_DFT_OVL_MAX] = { + 0.0432434f, 0.0748996f, 0.0966946f, 0.1144098f, 0.1297273f, 0.1434172f, 0.1559088f, 0.1674702f, 0.1782823f, 0.1884740f, 0.1981409f, 0.2073563f, 0.2161779f, 0.2246518f, + 0.2328160f, 0.2407019f, 0.2483359f, 0.2557404f, 0.2629347f, 0.2699355f, 0.2767575f, 0.2834135f, 0.2899147f, 0.2962713f, 0.3024923f, 0.3085859f, 0.3145594f, 0.3204193f, + 0.3261718f, 0.3318223f, 0.3373759f, 0.3428373f, 0.3482106f, 0.3534999f, 0.3587088f, 0.3638406f, 0.3688985f, 0.3738855f, 0.3788042f, 0.3836573f, 0.3884471f, 0.3931758f, + 0.3978457f, 0.4024586f, 0.4070164f, 0.4115210f, 0.4159739f, 0.4203768f, 0.4247311f, 0.4290383f, 0.4332998f, 0.4375167f, 0.4416903f, 0.4458218f, 0.4499123f, 0.4539628f, + 0.4579743f, 0.4619478f, 0.4658842f, 0.4697845f, 0.4736493f, 0.4774796f, 0.4812760f, 0.4850395f, 0.4887705f, 0.4924700f, 0.4961384f, 0.4997764f, 0.5033847f, 0.5069638f, + 0.5105143f, 0.5140367f, 0.5175316f, 0.5209995f, 0.5244408f, 0.5278560f, 0.5312456f, 0.5346100f, 0.5379496f, 0.5412649f, 0.5445563f, 0.5478241f, 0.5510687f, 0.5542905f, + 0.5574898f, 0.5606670f, 0.5638224f, 0.5669563f, 0.5700690f, 0.5731609f, 0.5762322f, 0.5792832f, 0.5823142f, 0.5853254f, 0.5883171f, 0.5912897f, 0.5942432f, 0.5971780f, + 0.6000943f, 0.6029923f, 0.6058722f, 0.6087343f, 0.6115788f, 0.6144058f, 0.6172156f, 0.6200084f, 0.6227843f, 0.6255436f, 0.6282864f, 0.6310130f, 0.6337234f, 0.6364178f, + 0.6390964f, 0.6417595f, 0.6444070f, 0.6470392f, 0.6496563f, 0.6522583f, 0.6548454f, 0.6574178f, 0.6599756f, 0.6625189f, 0.6650479f, 0.6675626f, 0.6700633f, 0.6725500f, + 0.6750229f, 0.6774820f, 0.6799275f, 0.6823595f, 0.6847781f, 0.6871835f, 0.6895756f, 0.6919547f, 0.6943208f, 0.6966740f, 0.6990145f, 0.7013422f, 0.7036574f, 0.7059601f, + 0.7082504f, 0.7105283f, 0.7127940f, 0.7150476f, 0.7172891f, 0.7195186f, 0.7217363f, 0.7239420f, 0.7261361f, 0.7283185f, 0.7304892f, 0.7326485f, 0.7347963f, 0.7369327f, + 0.7390578f, 0.7411716f, 0.7432743f, 0.7453658f, 0.7474463f, 0.7495159f, 0.7515744f, 0.7536222f, 0.7556591f, 0.7576852f, 0.7597007f, 0.7617056f, 0.7636998f, 0.7656836f, + 0.7676569f, 0.7696197f, 0.7715723f, 0.7735144f, 0.7754464f, 0.7773681f, 0.7792797f, 0.7811811f, 0.7830725f, 0.7849539f, 0.7868252f, 0.7886867f, 0.7905383f, 0.7923800f, + 0.7942119f, 0.7960341f, 0.7978465f, 0.7996493f, 0.8014424f, 0.8032260f, 0.8050000f, 0.8067644f, 0.8085194f, 0.8102650f, 0.8120011f, 0.8137279f, 0.8154453f, 0.8171534f, + 0.8188523f, 0.8205419f, 0.8222224f, 0.8238936f, 0.8255558f, 0.8272088f, 0.8288528f, 0.8304877f, 0.8321136f, 0.8337305f, 0.8353385f, 0.8369376f, 0.8385278f, 0.8401091f, + 0.8416815f, 0.8432452f, 0.8448001f, 0.8463462f, 0.8478836f, 0.8494123f, 0.8509324f, 0.8524437f, 0.8539465f, 0.8554406f, 0.8569262f, 0.8584032f, 0.8598717f, 0.8613317f, + 0.8627832f, 0.8642262f, 0.8656608f, 0.8670870f, 0.8685047f, 0.8699141f, 0.8713152f, 0.8727079f, 0.8740923f, 0.8754684f, 0.8768363f, 0.8781958f, 0.8795472f, 0.8808903f, + 0.8822253f, 0.8835520f, 0.8848706f, 0.8861811f, 0.8874834f, 0.8887777f, 0.8900638f, 0.8913419f, 0.8926119f, 0.8938739f, 0.8951278f, 0.8963738f, 0.8976117f, 0.8988417f, + 0.9000637f, 0.9012778f, 0.9024840f, 0.9036822f, 0.9048726f, 0.9060550f, 0.9072296f, 0.9083963f, 0.9095552f, 0.9107063f, 0.9118496f, 0.9129850f, 0.9141127f, 0.9152326f, + 0.9163447f, 0.9174491f, 0.9185457f, 0.9196346f, 0.9207158f, 0.9217893f, 0.9228551f, 0.9239133f, 0.9249638f, 0.9260066f, 0.9270418f, 0.9280693f, 0.9290892f, 0.9301015f, + 0.9311063f, 0.9321034f, 0.9330930f, 0.9340749f, 0.9350494f, 0.9360163f, 0.9369756f, 0.9379274f, 0.9388717f, 0.9398085f, 0.9407378f, 0.9416596f, 0.9425739f, 0.9434808f, + 0.9443802f, 0.9452721f, 0.9461566f, 0.9470337f, 0.9479033f, 0.9487655f, 0.9496203f, 0.9504677f, 0.9513076f, 0.9521402f, 0.9529655f, 0.9537833f, 0.9545938f, 0.9553969f, + 0.9561927f, 0.9569811f, 0.9577622f, 0.9585360f, 0.9593024f, 0.9600615f, 0.9608134f, 0.9615579f, 0.9622951f, 0.9630250f, 0.9637477f, 0.9644630f, 0.9651711f, 0.9658720f, + 0.9665655f, 0.9672519f, 0.9679309f, 0.9686028f, 0.9692674f, 0.9699247f, 0.9705749f, 0.9712178f, 0.9718535f, 0.9724820f, 0.9731033f, 0.9737175f, 0.9743244f, 0.9749241f, + 0.9755166f, 0.9761020f, 0.9766802f, 0.9772512f, 0.9778151f, 0.9783718f, 0.9789213f, 0.9794637f, 0.9799990f, 0.9805271f, 0.9810480f, 0.9815619f, 0.9820686f, 0.9825681f, + 0.9830606f, 0.9835459f, 0.9840241f, 0.9844953f, 0.9849593f, 0.9854162f, 0.9858660f, 0.9863087f, 0.9867443f, 0.9871728f, 0.9875942f, 0.9880086f, 0.9884158f, 0.9888160f, + 0.9892091f, 0.9895952f, 0.9899741f, 0.9903460f, 0.9907109f, 0.9910687f, 0.9914194f, 0.9917631f, 0.9920997f, 0.9924292f, 0.9927518f, 0.9930672f, 0.9933757f, 0.9936771f, + 0.9939714f, 0.9942587f, 0.9945390f, 0.9948122f, 0.9950785f, 0.9953376f, 0.9955898f, 0.9958349f, 0.9960730f, 0.9963041f, 0.9965282f, 0.9967453f, 0.9969553f, 0.9971583f, + 0.9973543f, 0.9975433f, 0.9977253f, 0.9979003f, 0.9980682f, 0.9982292f, 0.9983831f, 0.9985301f, 0.9986700f, 0.9988030f, 0.9989289f, 0.9990478f, 0.9991598f, 0.9992647f, + 0.9993626f, 0.9994536f, 0.9995375f, 0.9996144f, 0.9996844f, 0.9997473f, 0.9998033f, 0.9998523f, 0.9998942f, 0.9999292f, 0.9999572f, 0.9999781f, 0.9999921f, 0.9999991f +}; + +const float win_syn_8k[STEREO_DFT_OVL_8k] = { + 0.0011884f, 0.0061737f, 0.0132770f, 0.0219768f, 0.0320069f, 0.0431939f, 0.0554104f, 0.0685561f, 0.0825479f, 0.0973143f, 0.1127919f, 0.1289238f, 0.1456574f, 0.1629441f, + 0.1807378f, 0.1989949f, 0.2176735f, 0.2367334f, 0.2561357f, 0.2758425f, 0.2958170f, 0.3160233f, 0.3364260f, 0.3569906f, 0.3776832f, 0.3984704f, 0.4193193f, 0.4401978f, + 0.4610741f, 0.4819169f, 0.5026954f, 0.5233794f, 0.5439391f, 0.5643452f, 0.5845689f, 0.6045821f, 0.6243569f, 0.6438663f, 0.6630836f, 0.6819827f, 0.7005383f, 0.7187255f, + 0.7365200f, 0.7538984f, 0.7708375f, 0.7873153f, 0.8033101f, 0.8188011f, 0.8337681f, 0.8481918f, 0.8620536f, 0.8753355f, 0.8880206f, 0.9000925f, 0.9115358f, 0.9223360f, + 0.9324792f, 0.9419526f, 0.9507440f, 0.9588425f, 0.9662377f, 0.9729202f, 0.9788816f, 0.9841143f, 0.9886119f, 0.9923686f, 0.9953796f, 0.9976412f, 0.9991505f, 0.9999056f +}; + +const float win_syn_12k8[STEREO_DFT_OVL_12k8] = { + 0.0005872f, 0.0030510f, 0.0065634f, 0.0108691f, 0.0158394f, 0.0213920f, 0.0274676f, 0.0340207f, 0.0410145f, 0.0484183f, 0.0562057f, 0.0643536f, 0.0728413f, 0.0816501f, + 0.0907629f, 0.1001639f, 0.1098384f, 0.1197723f, 0.1299525f, 0.1403665f, 0.1510023f, 0.1618484f, 0.1728935f, 0.1841270f, 0.1955383f, 0.2071173f, 0.2188540f, 0.2307386f, + 0.2427616f, 0.2549137f, 0.2671857f, 0.2795684f, 0.2920531f, 0.3046309f, 0.3172931f, 0.3300312f, 0.3428367f, 0.3557012f, 0.3686166f, 0.3815746f, 0.3945671f, 0.4075861f, + 0.4206237f, 0.4336721f, 0.4467234f, 0.4597700f, 0.4728043f, 0.4858187f, 0.4988057f, 0.5117581f, 0.5246683f, 0.5375293f, 0.5503338f, 0.5630748f, 0.5757453f, 0.5883383f, + 0.6008469f, 0.6132645f, 0.6255843f, 0.6377997f, 0.6499043f, 0.6618916f, 0.6737551f, 0.6854888f, 0.6970865f, 0.7085420f, 0.7198494f, 0.7310029f, 0.7419966f, 0.7528248f, + 0.7634821f, 0.7739629f, 0.7842618f, 0.7943737f, 0.8042932f, 0.8140155f, 0.8235355f, 0.8328484f, 0.8419495f, 0.8508342f, 0.8594981f, 0.8679368f, 0.8761460f, 0.8841216f, + 0.8918596f, 0.8993562f, 0.9066077f, 0.9136103f, 0.9203606f, 0.9268553f, 0.9330910f, 0.9390648f, 0.9447737f, 0.9502148f, 0.9553854f, 0.9602830f, 0.9649051f, 0.9692495f, + 0.9733140f, 0.9770966f, 0.9805954f, 0.9838088f, 0.9867351f, 0.9893729f, 0.9917208f, 0.9937779f, 0.9955429f, 0.9970151f, 0.9981937f, 0.9990782f, 0.9996681f, 0.9999631f +}; + +const float win_syn_16k[STEREO_DFT_OVL_16k] = { + 0.0004202f, 0.0021832f, 0.0046969f, 0.0077790f, 0.0113378f, 0.0153150f, 0.0196689f, 0.0243675f, 0.0293852f, 0.0347008f, 0.0402962f, 0.0461558f, 0.0522656f, 0.0586132f, + 0.0651874f, 0.0719777f, 0.0789748f, 0.0861695f, 0.0935536f, 0.1011193f, 0.1088590f, 0.1167656f, 0.1248324f, 0.1330527f, 0.1414203f, 0.1499291f, 0.1585732f, 0.1673468f, + 0.1762443f, 0.1852603f, 0.1943895f, 0.2036266f, 0.2129665f, 0.2224042f, 0.2319348f, 0.2415533f, 0.2512551f, 0.2610353f, 0.2708893f, 0.2808125f, 0.2908003f, 0.3008483f, + 0.3109520f, 0.3211069f, 0.3313088f, 0.3415533f, 0.3518362f, 0.3621531f, 0.3724999f, 0.3828724f, 0.3932665f, 0.4036781f, 0.4141031f, 0.4245374f, 0.4349772f, 0.4454184f, + 0.4558570f, 0.4662892f, 0.4767110f, 0.4871187f, 0.4975085f, 0.5078764f, 0.5182189f, 0.5285321f, 0.5388124f, 0.5490561f, 0.5592596f, 0.5694193f, 0.5795316f, 0.5895930f, + 0.5996000f, 0.6095492f, 0.6194370f, 0.6292602f, 0.6390153f, 0.6486990f, 0.6583081f, 0.6678392f, 0.6772892f, 0.6866548f, 0.6959330f, 0.7051206f, 0.7142146f, 0.7232119f, + 0.7321095f, 0.7409045f, 0.7495941f, 0.7581752f, 0.7666451f, 0.7750011f, 0.7832403f, 0.7913601f, 0.7993578f, 0.8072309f, 0.8149767f, 0.8225927f, 0.8300765f, 0.8374257f, + 0.8446379f, 0.8517106f, 0.8586418f, 0.8654291f, 0.8720703f, 0.8785634f, 0.8849062f, 0.8910966f, 0.8971328f, 0.9030128f, 0.9087347f, 0.9142967f, 0.9196970f, 0.9249339f, + 0.9300057f, 0.9349108f, 0.9396477f, 0.9442148f, 0.9486107f, 0.9528340f, 0.9568834f, 0.9607576f, 0.9644553f, 0.9679754f, 0.9713168f, 0.9744784f, 0.9774592f, 0.9802583f, + 0.9828748f, 0.9853079f, 0.9875568f, 0.9896207f, 0.9914991f, 0.9931914f, 0.9946969f, 0.9960153f, 0.9971462f, 0.9980891f, 0.9988438f, 0.9994100f, 0.9997876f, 0.9999764f +}; + +const float win_syn_32k[STEREO_DFT_OVL_32k] = { + 0.0001486f, 0.0007719f, 0.0016609f, 0.0027511f, 0.0040104f, 0.0054186f, 0.0069609f, 0.0086267f, 0.0104070f, 0.0122948f, 0.0142840f, 0.0163696f, 0.0185470f, 0.0208123f, + 0.0231620f, 0.0255929f, 0.0281021f, 0.0306869f, 0.0333450f, 0.0360740f, 0.0388720f, 0.0417369f, 0.0446669f, 0.0476603f, 0.0507154f, 0.0538306f, 0.0570046f, 0.0602359f, + 0.0635232f, 0.0668651f, 0.0702604f, 0.0737080f, 0.0772066f, 0.0807552f, 0.0843527f, 0.0879981f, 0.0916903f, 0.0954283f, 0.0992113f, 0.1030382f, 0.1069082f, 0.1108203f, + 0.1147737f, 0.1187676f, 0.1228011f, 0.1268733f, 0.1309836f, 0.1351311f, 0.1393150f, 0.1435345f, 0.1477890f, 0.1520777f, 0.1563998f, 0.1607546f, 0.1651415f, 0.1695597f, + 0.1740086f, 0.1784874f, 0.1829955f, 0.1875322f, 0.1920969f, 0.1966888f, 0.2013075f, 0.2059521f, 0.2106222f, 0.2153170f, 0.2200359f, 0.2247784f, 0.2295437f, 0.2343314f, + 0.2391407f, 0.2439712f, 0.2488221f, 0.2536930f, 0.2585831f, 0.2634920f, 0.2684191f, 0.2733638f, 0.2783254f, 0.2833035f, 0.2882975f, 0.2933068f, 0.2983309f, 0.3033691f, + 0.3084211f, 0.3134861f, 0.3185636f, 0.3236532f, 0.3287542f, 0.3338661f, 0.3389884f, 0.3441206f, 0.3492621f, 0.3544124f, 0.3595709f, 0.3647371f, 0.3699106f, 0.3750908f, + 0.3802771f, 0.3854691f, 0.3906662f, 0.3958679f, 0.4010738f, 0.4062832f, 0.4114958f, 0.4167109f, 0.4219282f, 0.4271470f, 0.4323670f, 0.4375875f, 0.4428081f, 0.4480284f, + 0.4532478f, 0.4584658f, 0.4636819f, 0.4688957f, 0.4741067f, 0.4793144f, 0.4845184f, 0.4897180f, 0.4949129f, 0.5001027f, 0.5052867f, 0.5104646f, 0.5156359f, 0.5208001f, + 0.5259568f, 0.5311054f, 0.5362456f, 0.5413769f, 0.5464988f, 0.5516109f, 0.5567127f, 0.5618038f, 0.5668837f, 0.5719520f, 0.5770082f, 0.5820519f, 0.5870826f, 0.5921000f, + 0.5971036f, 0.6020929f, 0.6070675f, 0.6120270f, 0.6169710f, 0.6218990f, 0.6268107f, 0.6317055f, 0.6365831f, 0.6414431f, 0.6462850f, 0.6511084f, 0.6559130f, 0.6606983f, + 0.6654639f, 0.6702094f, 0.6749345f, 0.6796386f, 0.6843215f, 0.6889827f, 0.6936218f, 0.6982385f, 0.7028324f, 0.7074030f, 0.7119500f, 0.7164731f, 0.7209718f, 0.7254458f, + 0.7298946f, 0.7343180f, 0.7387156f, 0.7430869f, 0.7474317f, 0.7517496f, 0.7560402f, 0.7603032f, 0.7645382f, 0.7687449f, 0.7729229f, 0.7770719f, 0.7811916f, 0.7852815f, + 0.7893415f, 0.7933711f, 0.7973700f, 0.8013379f, 0.8052744f, 0.8091793f, 0.8130523f, 0.8168929f, 0.8207010f, 0.8244762f, 0.8282181f, 0.8319265f, 0.8356012f, 0.8392417f, + 0.8428478f, 0.8464192f, 0.8499556f, 0.8534568f, 0.8569224f, 0.8603522f, 0.8637459f, 0.8671032f, 0.8704238f, 0.8737076f, 0.8769541f, 0.8801632f, 0.8833347f, 0.8864681f, + 0.8895634f, 0.8926202f, 0.8956384f, 0.8986176f, 0.9015576f, 0.9044582f, 0.9073192f, 0.9101403f, 0.9129213f, 0.9156620f, 0.9183622f, 0.9210216f, 0.9236401f, 0.9262174f, + 0.9287533f, 0.9312477f, 0.9337003f, 0.9361109f, 0.9384793f, 0.9408054f, 0.9430890f, 0.9453299f, 0.9475279f, 0.9496828f, 0.9517945f, 0.9538628f, 0.9558875f, 0.9578684f, + 0.9598056f, 0.9616986f, 0.9635475f, 0.9653520f, 0.9671121f, 0.9688276f, 0.9704983f, 0.9721241f, 0.9737049f, 0.9752406f, 0.9767310f, 0.9781761f, 0.9795757f, 0.9809296f, + 0.9822379f, 0.9835003f, 0.9847169f, 0.9858874f, 0.9870119f, 0.9880901f, 0.9891221f, 0.9901077f, 0.9910470f, 0.9919397f, 0.9927858f, 0.9935853f, 0.9943381f, 0.9950441f, + 0.9957033f, 0.9963157f, 0.9968811f, 0.9973995f, 0.9978710f, 0.9982954f, 0.9986728f, 0.9990030f, 0.9992861f, 0.9995221f, 0.9997109f, 0.9998525f, 0.9999469f, 0.9999941f +}; + +const float win_syn_48k[STEREO_DFT_OVL_MAX] = { + 0.0000809f, 0.0004202f, 0.0009041f, 0.0014976f, 0.0021832f, 0.0029499f, 0.0037898f, 0.0046969f, 0.0056666f, 0.0066951f, 0.0077790f, 0.0089156f, 0.0101026f, 0.0113378f, + 0.0126194f, 0.0139456f, 0.0153150f, 0.0167262f, 0.0181779f, 0.0196689f, 0.0211982f, 0.0227647f, 0.0243675f, 0.0260057f, 0.0276785f, 0.0293852f, 0.0311249f, 0.0328970f, + 0.0347008f, 0.0365356f, 0.0384010f, 0.0402962f, 0.0422208f, 0.0441741f, 0.0461558f, 0.0481652f, 0.0502020f, 0.0522656f, 0.0543556f, 0.0564716f, 0.0586132f, 0.0607800f, + 0.0629715f, 0.0651874f, 0.0674273f, 0.0696909f, 0.0719777f, 0.0742876f, 0.0766200f, 0.0789748f, 0.0813515f, 0.0837498f, 0.0861695f, 0.0886102f, 0.0910717f, 0.0935536f, + 0.0960557f, 0.0985777f, 0.1011193f, 0.1036802f, 0.1062602f, 0.1088590f, 0.1114763f, 0.1141120f, 0.1167656f, 0.1194371f, 0.1221261f, 0.1248324f, 0.1275558f, 0.1302959f, + 0.1330527f, 0.1358259f, 0.1386151f, 0.1414203f, 0.1442412f, 0.1470775f, 0.1499291f, 0.1527957f, 0.1556771f, 0.1585732f, 0.1614836f, 0.1644082f, 0.1673468f, 0.1702991f, + 0.1732650f, 0.1762443f, 0.1792367f, 0.1822421f, 0.1852603f, 0.1882911f, 0.1913342f, 0.1943895f, 0.1974568f, 0.2005359f, 0.2036266f, 0.2067287f, 0.2098421f, 0.2129665f, + 0.2161018f, 0.2192478f, 0.2224042f, 0.2255710f, 0.2287479f, 0.2319348f, 0.2351314f, 0.2383377f, 0.2415533f, 0.2447782f, 0.2480122f, 0.2512551f, 0.2545067f, 0.2577668f, + 0.2610353f, 0.2643120f, 0.2675967f, 0.2708893f, 0.2741895f, 0.2774973f, 0.2808125f, 0.2841348f, 0.2874641f, 0.2908003f, 0.2941432f, 0.2974925f, 0.3008483f, 0.3042102f, + 0.3075781f, 0.3109520f, 0.3143315f, 0.3177165f, 0.3211069f, 0.3245026f, 0.3279032f, 0.3313088f, 0.3347191f, 0.3381340f, 0.3415533f, 0.3449769f, 0.3484045f, 0.3518362f, + 0.3552716f, 0.3587106f, 0.3621531f, 0.3655989f, 0.3690479f, 0.3724999f, 0.3759547f, 0.3794123f, 0.3828724f, 0.3863349f, 0.3897997f, 0.3932665f, 0.3967353f, 0.4002059f, + 0.4036781f, 0.4071518f, 0.4106268f, 0.4141031f, 0.4175804f, 0.4210585f, 0.4245374f, 0.4280170f, 0.4314969f, 0.4349772f, 0.4384576f, 0.4419381f, 0.4454184f, 0.4488984f, + 0.4523780f, 0.4558570f, 0.4593353f, 0.4628127f, 0.4662892f, 0.4697645f, 0.4732385f, 0.4767110f, 0.4801820f, 0.4836513f, 0.4871187f, 0.4905842f, 0.4940475f, 0.4975085f, + 0.5009671f, 0.5044231f, 0.5078764f, 0.5113269f, 0.5147745f, 0.5182189f, 0.5216601f, 0.5250979f, 0.5285321f, 0.5319627f, 0.5353895f, 0.5388124f, 0.5422312f, 0.5456458f, + 0.5490561f, 0.5524619f, 0.5558631f, 0.5592596f, 0.5626512f, 0.5660378f, 0.5694193f, 0.5727955f, 0.5761663f, 0.5795316f, 0.5828913f, 0.5862451f, 0.5895930f, 0.5929349f, + 0.5962706f, 0.5996000f, 0.6029230f, 0.6062395f, 0.6095492f, 0.6128521f, 0.6161481f, 0.6194370f, 0.6227188f, 0.6259932f, 0.6292602f, 0.6325196f, 0.6357714f, 0.6390153f, + 0.6422513f, 0.6454792f, 0.6486990f, 0.6519105f, 0.6551136f, 0.6583081f, 0.6614939f, 0.6646710f, 0.6678392f, 0.6709984f, 0.6741484f, 0.6772892f, 0.6804206f, 0.6835425f, + 0.6866548f, 0.6897574f, 0.6928502f, 0.6959330f, 0.6990058f, 0.7020683f, 0.7051206f, 0.7081625f, 0.7111939f, 0.7142146f, 0.7172246f, 0.7202237f, 0.7232119f, 0.7261890f, + 0.7291549f, 0.7321095f, 0.7350527f, 0.7379845f, 0.7409045f, 0.7438129f, 0.7467095f, 0.7495941f, 0.7524666f, 0.7553270f, 0.7581752f, 0.7610110f, 0.7638343f, 0.7666451f, + 0.7694432f, 0.7722286f, 0.7750011f, 0.7777606f, 0.7805070f, 0.7832403f, 0.7859603f, 0.7886669f, 0.7913601f, 0.7940397f, 0.7967056f, 0.7993578f, 0.8019961f, 0.8046205f, + 0.8072309f, 0.8098271f, 0.8124090f, 0.8149767f, 0.8175299f, 0.8200686f, 0.8225927f, 0.8251021f, 0.8275968f, 0.8300765f, 0.8325413f, 0.8349911f, 0.8374257f, 0.8398451f, + 0.8422492f, 0.8446379f, 0.8470110f, 0.8493687f, 0.8517106f, 0.8540369f, 0.8563473f, 0.8586418f, 0.8609203f, 0.8631828f, 0.8654291f, 0.8676592f, 0.8698729f, 0.8720703f, + 0.8742512f, 0.8764156f, 0.8785634f, 0.8806944f, 0.8828087f, 0.8849062f, 0.8869867f, 0.8890502f, 0.8910966f, 0.8931259f, 0.8951380f, 0.8971328f, 0.8991103f, 0.9010703f, + 0.9030128f, 0.9049378f, 0.9068451f, 0.9087347f, 0.9106066f, 0.9124606f, 0.9142967f, 0.9161149f, 0.9179150f, 0.9196970f, 0.9214609f, 0.9232065f, 0.9249339f, 0.9266429f, + 0.9283335f, 0.9300057f, 0.9316593f, 0.9332944f, 0.9349108f, 0.9365086f, 0.9380875f, 0.9396477f, 0.9411890f, 0.9427114f, 0.9442148f, 0.9456992f, 0.9471645f, 0.9486107f, + 0.9500377f, 0.9514455f, 0.9528340f, 0.9542032f, 0.9555530f, 0.9568834f, 0.9581944f, 0.9594858f, 0.9607576f, 0.9620098f, 0.9632424f, 0.9644553f, 0.9656485f, 0.9668219f, + 0.9679754f, 0.9691091f, 0.9702229f, 0.9713168f, 0.9723907f, 0.9734446f, 0.9744784f, 0.9754922f, 0.9764858f, 0.9774592f, 0.9784125f, 0.9793456f, 0.9802583f, 0.9811508f, + 0.9820230f, 0.9828748f, 0.9837063f, 0.9845173f, 0.9853079f, 0.9860780f, 0.9868277f, 0.9875568f, 0.9882653f, 0.9889533f, 0.9896207f, 0.9902675f, 0.9908936f, 0.9914991f, + 0.9920839f, 0.9926480f, 0.9931914f, 0.9937140f, 0.9942159f, 0.9946969f, 0.9951572f, 0.9955967f, 0.9960153f, 0.9964132f, 0.9967901f, 0.9971462f, 0.9974814f, 0.9977957f, + 0.9980891f, 0.9983616f, 0.9986131f, 0.9988438f, 0.9990535f, 0.9992422f, 0.9994100f, 0.9995568f, 0.9996827f, 0.9997876f, 0.9998715f, 0.9999344f, 0.9999764f, 0.9999974f +}; + +const float win_mdct_8k[STEREO_DFT_OVL_8k] = { + 0.0112197f, 0.0336536f, 0.0560704f, 0.0784591f, 0.1008082f, 0.1231066f, 0.1453430f, 0.1675062f, 0.1895851f, 0.2115685f, 0.2334454f, 0.2552047f, 0.2768355f, 0.2983269f, + 0.3196681f, 0.3408484f, 0.3618570f, 0.3826834f, 0.4033172f, 0.4237478f, 0.4439651f, 0.4639588f, 0.4837189f, 0.5032354f, 0.5224986f, 0.5414986f, 0.5602260f, 0.5786713f, + 0.5968252f, 0.6146786f, 0.6322225f, 0.6494480f, 0.6663466f, 0.6829096f, 0.6991287f, 0.7149958f, 0.7305029f, 0.7456422f, 0.7604060f, 0.7747869f, 0.7887777f, 0.8023713f, + 0.8155609f, 0.8283398f, 0.8407016f, 0.8526402f, 0.8641494f, 0.8752234f, 0.8858568f, 0.8960441f, 0.9057802f, 0.9150603f, 0.9238795f, 0.9322336f, 0.9401183f, 0.9475296f, + 0.9544637f, 0.9609173f, 0.9668870f, 0.9723699f, 0.9773632f, 0.9818643f, 0.9858710f, 0.9893813f, 0.9923935f, 0.9949059f, 0.9969173f, 0.9984268f, 0.9994336f, 0.9999371f +}; + + +/*----------------------------------------------------------------------------------* + * ECLVQ Stereo ROM tables + *----------------------------------------------------------------------------------*/ + +/* approximation table for log2(1 + x) in Q10 format, with x in [0, 1] in Q6 format */ +const int16_t log2_1px_table[65] = +{ + 0, 23, 45, 68, 90, 111, 132, 153, 174, 194, 214, 234, 254, 273, 292, 311, + 330, 348, 366, 384, 402, 419, 436, 454, 470, 487, 504, 520, 536, 552, 568, 584, + 599, 614, 629, 644, 659, 674, 689, 703, 717, 731, 745, 759, 773, 787, 800, 813, + 827, 840, 853, 866, 879, 891, 904, 916, 929, 941, 953, 965, 977, 989, 1001, 1012, + 1024 +}; + +/* table with log2(T(2 ^ param)), where T(x) = x * (exp(0.5 / x) - exp(-0.5 / x)), for param = -2 .. 10 */ +/* the last two entries present are zero, like all values for larger param values */ +const float log2TB[ECSQ_log2TB_SIZE] = +{ + 0.858721f, 0.232908f, 0.059619f, 0.014997f, 0.003755f, 0.000939f, 0.000235f, 0.000059f, 0.000015f, 0.000004f, 0.000001f, 0.000000f, 0.000000f +}; + +/* precomuputed table for log_2(factorial(i)), for i in {0, .., ECSQ_SEGMENT_SIZE} */ +const float ECSQ_log2_fact[1 + ECSQ_SEGMENT_SIZE] = +{ + 0.0000000f, 0.0000000f, 1.0000000f, 2.5849625f, 4.5849625f, 6.9068906f, 9.4918531f, 12.2992080f, 15.2992080f +}; + +const uint16_t ECSQ_tab_param[ECSQ_CONFIG_COUNT][1 + ECSQ_PARAM_COUNT] = +{ + { 16384, 15360, 14336, 13312, 12288, 11264, 10240, 9216, 8192, 7168, 6144, 5120, 4096, 3072, 2048, 1024, 0 }, /* un-optimized (reserved) */ + { 16384, 7090, 365, 171, 73, 38, 21, 13, 9, 7, 6, 5, 4, 3, 2, 1, 0 }, /* 34 kbps target SNR */ + { 16384, 12134, 1602, 336, 53, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 }, /* 34 kbps target bits */ + { 16384, 7111, 487, 186, 73, 37, 20, 12, 8, 7, 6, 5, 4, 3, 2, 1, 0 }, /* 44 kbps target SNR */ + { 16384, 11086, 1762, 628, 79, 31, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 }, /* 44 kbps target bits */ + { 16384, 6940, 633, 186, 74, 38, 21, 13, 9, 7, 6, 5, 4, 3, 2, 1, 0 }, /* 56 kbps target SNR */ + { 16384, 10548, 1936, 774, 117, 41, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 } /* 56 kbps target bits */ +}; + +const uint16_t ECSQ_tab_vals[ECSQ_PARAM_COUNT - 1][1 + ECSQ_TAB_VALS_SIZE] = +{ + { 16384, 9939, 3659, 1349, 499, 186, 71, 29, 14, 8, 6, 5, 4, 3, 2, 1, 0 }, /* param = 0 */ + { 16384, 12760, 7739, 4694, 2847, 1727, 1048, 636, 386, 234, 142, 86, 52, 32, 20, 12, 0 }, /* param = 1 */ + { 16384, 14459, 11261, 8770, 6830, 5319, 4142, 3226, 2512, 1956, 1523, 1186, 924, 720, 561, 437, 0 }, /* param = 2 */ + { 16384, 13583, 10578, 8238, 6416, 4997, 3892, 3031, 2361, 1839, 1432, 1115, 868, 676, 526, 410, 0 }, /* param = 3 */ + { 16384, 13165, 10253, 7985, 6219, 4843, 3772, 2938, 2288, 1782, 1388, 1081, 842, 656, 511, 398, 0 }, /* param = 4 */ + { 16384, 12961, 10094, 7861, 6122, 4768, 3713, 2891, 2251, 1753, 1365, 1063, 828, 645, 502, 391, 0 }, /* param = 5 */ + { 16384, 12860, 10015, 7800, 6075, 4731, 3685, 2870, 2235, 1741, 1356, 1056, 822, 640, 498, 388, 0 }, /* param = 6 */ + { 16384, 12810, 9976, 7769, 6050, 4712, 3670, 2858, 2226, 1734, 1351, 1052, 819, 638, 497, 387, 0 }, /* param = 7 */ + { 16384, 12785, 9957, 7754, 6039, 4703, 3663, 2853, 2222, 1731, 1348, 1050, 818, 637, 496, 386, 0 }, /* param = 8 */ + { 16384, 12772, 9947, 7747, 6033, 4699, 3660, 2851, 2221, 1730, 1348, 1050, 818, 637, 496, 386, 0 }, /* param = 9 */ + { 16384, 12766, 9942, 7743, 6030, 4696, 3657, 2848, 2218, 1727, 1345, 1047, 815, 635, 494, 385, 0 }, /* param = 10 */ + { 16384, 12763, 9940, 7741, 6029, 4695, 3656, 2847, 2217, 1726, 1344, 1046, 814, 634, 494, 385, 0 }, /* param = 11 */ + { 16384, 12761, 9938, 7740, 6028, 4695, 3657, 2848, 2218, 1727, 1345, 1047, 815, 635, 494, 385, 0 }, /* param = 12 */ + { 16384, 12761, 9938, 7740, 6028, 4695, 3657, 2848, 2218, 1727, 1345, 1047, 815, 635, 494, 385, 0 }, /* param = 13 */ + { 16384, 12761, 9938, 7740, 6028, 4695, 3657, 2848, 2218, 1727, 1345, 1047, 815, 635, 494, 385, 0 } /* param = 14 */ +}; + +/* table for uniform coding of absolute values in {0, +-1} */ +static const uint16_t ECSQ_tab_abs_1bit[1 + 2] = +{ + 16384, 10922, 0 +}; + +/* table for uniform coding of absolute values in {0, +-1, +-2, +-3} */ +static const uint16_t ECSQ_tab_abs_2bit[1 + 4] = +{ + 16384, 14046, 9364, 4682, 0 +}; + +/* table for uniform coding of absolute values in {0, +-1, ..., +-7} */ +static const uint16_t ECSQ_tab_abs_3bit[1 + 8] = +{ + 16384, 15288, 13104, 10920, 8736, 6552, 4368, 2184, 0 +}; + +/* table for uniform coding of absolute values in {0, +-1, ..., +-15} */ +static const uint16_t ECSQ_tab_abs_4bit[1 + 16] = +{ + 16384, 15870, 14812, 13754, 12696, 11638, 10580, 9522, 8464, 7406, 6348, 5290, 4232, 3174, 2116, 1058, 0 +}; + +/* array of tables for uniform coding of absolute values */ +const uint16_t * const ECSQ_tab_abs_lsbs[1 + 4] = +{ + NULL, ECSQ_tab_abs_1bit, ECSQ_tab_abs_2bit, ECSQ_tab_abs_3bit, ECSQ_tab_abs_4bit +}; + + +/*------------------------------------------------------------------------- + * Range Coder ROM tables + *------------------------------------------------------------------------*/ + +/* Bit-estimation table which maps entropy directly to the bit-demand */ +const float ari_bit_estimate_s17_LC[RANGE_N_CONTEXT][RANGE_N_SYMBOLS] = +{ + { 10.0f,9.0458f,7.2721f,7.5406f,9.1926f,8.1926f,6.8401f,7.0575f,7.625f,7.0458f,7.1671f,7.2858f,7.9776f,7.3418f,7.4454f,7.5571f,0.1254f }, + { 1.1465f,5.2088f,8.6077f,10.3f,1.9756f,4.6491f,7.8301f,10.093f,3.6624f,5.4416f,8.1671f,10.0f,5.0085f,6.3135f,8.8707f,10.541f,3.9312f }, + { 1.9092f,3.0465f,4.9804f,6.5571f,3.0349f,3.0256f,4.5758f,5.9447f,4.8528f,4.4843f,5.5283f,6.625f,6.3634f,5.71f,6.5002f,7.4764f,3.2048f }, + { 2.4711f,2.8785f,4.6803f,6.4226f,2.9366f,2.7019f,4.1189f,5.6381f,4.6713f,4.1022f,5.0782f,6.3065f,6.3205f,5.6206f,6.2996f,7.3276f,3.6513f }, + { 2.3766f,3.1655f,4.6917f,6.0931f,2.9542f,3.0458f,4.3816f,5.6163f,4.2468f,4.1846f,5.4647f,6.5488f,5.415f,5.2318f,6.3779f,7.3853f,3.1189f }, + { 3.7521f,3.5344f,4.6917f,5.8003f,3.686f,3.1483f,4.0604f,5.0458f,4.8915f,4.1655f,4.8151f,5.5991f,5.9944f,5.2056f,5.6557f,6.2926f,1.8304f }, + { 3.2195f,3.1219f,4.5304f,5.9666f,3.2577f,2.7997f,3.9583f,5.2552f,4.7031f,4.0342f,4.8427f,5.8656f,6.0871f,5.3135f,5.9179f,6.7332f,2.6206f }, + { 3.885f,3.3598f,4.4922f,5.776f,3.455f,2.8288f,3.7712f,4.9474f,4.5182f,3.8151f,4.5488f,5.5654f,5.7616f,5.0458f,5.612f,6.3634f,2.5162f }, + { 0.50765f,3.4282f,7.0458f,9.6077f,3.2145f,4.4454f,7.2858f,9.415f,6.4226f,6.9339f,8.9556f,10.83f,8.6424f,8.7905f,10.3f,11.678f,7.6077f }, + { 1.0294f,2.6786f,5.6646f,7.9776f,2.822f,3.3835f,5.7905f,7.7712f,5.7568f,5.8251f,7.5081f,9.142f,7.8503f,7.7521f,8.9556f,10.3f,6.0458f }, + { 4.2961f,3.7712f,4.6781f,5.6646f,3.9099f,3.2219f,3.9666f,4.8604f,4.8326f,4.059f,4.6013f,5.367f,5.8151f,4.986f,5.415f,6.0285f,1.7544f }, + { 1.4401f,2.4264f,5.4882f,7.9125f,2.5421f,2.9039f,5.3853f,7.5081f,5.6513f,5.4226f,6.902f,8.5081f,8.0458f,7.5081f,8.4764f,9.6781f,5.9072f }, + { 1.7918f,2.472f,4.6141f,6.4226f,2.9152f,2.8921f,4.5612f,6.1296f,5.2219f,4.8941f,6.0871f,7.3853f,6.9447f,6.5324f,7.4922f,8.5737f,4.432f }, + { 4.4589f,3.9804f,4.8604f,5.7332f,4.2154f,3.5222f,4.1846f,4.9179f,5.1639f,4.3543f,4.8102f,5.4075f,5.9944f,5.1545f,5.5202f,6.0342f,1.3503f }, + { 2.0498f,2.5298f,4.2269f,5.6381f,3.231f,3.0834f,4.317f,5.4647f,5.2056f,4.8176f,5.8102f,6.8102f,6.625f,6.2451f,7.0811f,7.8503f,3.4706f }, + { 2.5596f,2.6507f,4.6939f,6.5081f,2.7826f,2.5643f,4.1735f,5.8503f,4.8376f,4.2451f,5.2619f,6.5737f,6.5821f,5.8301f,6.5571f,7.5906f,3.9152f }, + { 5.1926f,4.5243f,5.1389f,5.7954f,4.6424f,3.8579f,4.3347f,4.9366f,5.2823f,4.4301f,4.7688f,5.2619f,5.9285f,5.0313f,5.3065f,5.7146f,1.1033f }, + { 14.0f,14.0f,3.3992f,4.5675f,14.0f,14.0f,3.7227f,4.7169f,3.6152f,3.8364f,4.5365f,5.3276f,4.7688f,4.8579f,5.3927f,6.0285f,1.2545f }, + { 2.7146f,2.7628f,4.6917f,6.5243f,2.8157f,2.5748f,4.2023f,5.8503f,4.7473f,4.2121f,5.317f,6.5991f,6.4531f,5.7568f,6.5488f,7.4922f,3.3734f }, + { 4.1529f,3.6546f,4.6381f,5.7332f,3.7485f,3.0976f,3.9165f,4.8993f,4.7285f,3.9735f,4.5906f,5.4188f,5.776f,4.9666f,5.4378f,6.1052f,1.9413f }, + { 2.6446f,3.1679f,4.8351f,6.2451f,3.1553f,2.9359f,4.2351f,5.5162f,4.7521f,4.1782f,5.0693f,6.1296f,6.0811f,5.3853f,6.0056f,6.8707f,2.6125f }, + { 0.54814f,3.1243f,7.4454f,10.83f,3.0509f,4.2755f,7.8503f,10.678f,7.0693f,7.5081f,9.8301f,12.0f,10.093f,10.093f,11.678f,13.0f,9.5406f }, + { 5.5162f,4.8759f,5.4608f,6.0113f,4.9972f,4.2154f,4.6403f,5.1296f,5.6034f,4.7285f,5.0142f,5.4188f,6.1608f,5.2285f,5.4764f,5.7954f,0.84076f }, + { 2.1963f,3.432f,5.2088f,6.3634f,3.2918f,3.2048f,4.5633f,5.7239f,4.9259f,4.4113f,5.2318f,6.142f,6.0634f,5.415f,6.1862f,6.8003f,2.3481f }, + { 14.0f,14.0f,4.6826f,5.3706f,14.0f,14.0f,4.6962f,5.2653f,4.7712f,4.793f,5.2023f,5.6601f,5.5041f,5.4188f,5.7426f,6.1358f,0.56889f }, + { 4.0796f,5.2585f,7.0811f,8.0931f,3.957f,4.5385f,6.1671f,7.2318f,4.9721f,5.1327f,6.4075f,7.3561f,5.6293f,5.6034f,6.6962f,7.4922f,0.64052f }, + { 0.64768f,3.3153f,6.4301f,8.7905f,3.0969f,4.0085f,6.5654f,8.5406f,5.9179f,6.2252f,8.0931f,9.7521f,7.8707f,7.9556f,9.415f,11.0f,6.625f }, + { 1.1906f,2.6747f,5.7954f,8.2451f,2.6513f,3.0999f,5.5529f,7.6601f,5.6871f,5.4608f,6.902f,8.415f,8.0693f,7.4764f,8.4454f,9.5406f,6.0634f }, + { 3.6579f,3.8707f,5.1514f,6.1296f,3.9874f,3.5874f,4.5122f,5.3779f,5.2451f,4.5447f,5.1113f,5.7239f,6.1113f,5.3205f,5.7426f,6.2056f,1.2965f }, + { 1.7247f,2.5344f,5.1327f,7.2858f,2.6441f,2.7748f,4.8126f,6.6871f,5.1959f,4.8226f,6.1052f,7.5737f,7.2721f,6.6781f,7.5081f,8.6781f,4.9666f }, + { 1.7643f,2.2939f,5.3347f,7.7332f,2.4701f,2.6753f,5.0811f,7.2186f,5.5821f,5.1894f,6.5654f,8.142f,7.9339f,7.2451f,8.142f,9.2451f,5.5949f }, + { 1.7909f,2.8483f,5.0142f,6.8401f,2.8164f,2.8681f,4.5821f,6.2384f,4.9366f,4.5324f,5.7008f,7.0342f,6.6962f,6.0931f,6.9776f,8.0458f,4.0634f }, + { 2.2845f,2.7019f,4.3982f,5.8553f,3.0909f,2.8649f,4.183f,5.5365f,4.9749f,4.4416f,5.4454f,6.4764f,6.4226f,5.9179f,6.6962f,7.625f,3.4706f }, + { 2.673f,2.755f,4.3871f,5.8251f,3.1475f,2.8114f,4.0961f,5.3816f,4.9583f,4.3761f,5.3454f,6.3634f,6.5406f,5.8707f,6.5162f,7.2996f,2.9468f }, + { 6.2926f,5.4764f,5.9179f,6.3706f,5.625f,4.7616f,5.0841f,5.4686f,6.1113f,5.2154f,5.4301f,5.7285f,6.5737f,5.6381f,5.8151f,6.0516f,0.55615f }, + { 2.9818f,2.856f,4.5263f,6.1798f,3.0021f,2.6098f,3.9461f,5.4301f,4.6359f,4.0242f,4.9232f,6.1358f,6.2518f,5.4922f,6.1735f,7.1052f,3.3798f }, + { 3.3391f,3.0774f,4.4922f,5.9666f,3.1616f,2.6702f,3.8364f,5.2154f,4.5571f,3.8669f,4.7239f,5.8759f,6.0056f,5.2121f,5.8915f,6.8003f,3.0321f }, + { 7.5243f,6.6077f,6.4764f,6.8604f,6.7521f,5.8201f,5.7664f,6.0752f,6.7905f,5.9393f,6.0991f,6.2996f,7.1545f,6.3205f,6.4226f,6.6077f,0.30358f }, + { 2.8954f,3.5895f,5.0901f,6.2186f,3.5263f,3.3048f,4.4378f,5.4454f,4.9502f,4.3048f,5.0458f,5.8656f,6.0227f,5.2186f,5.7954f,6.4454f,1.8335f }, + { 3.7473f,3.3734f,4.5675f,5.8102f,3.5091f,2.9205f,3.885f,5.0285f,4.6736f,3.9353f,4.6381f,5.5821f,5.8604f,5.0546f,5.5779f,6.3135f,2.2905f }, + { 0.37589f,3.7869f,7.5081f,10.193f,3.4696f,5.0056f,7.9556f,10.093f,6.7521f,7.4922f,9.6077f,11.415f,9.0f,9.2996f,11.0f,12.415f,8.142f }, + { 3.3752f,3.3454f,4.6781f,5.9339f,3.3752f,2.957f,4.0737f,5.2023f,4.6871f,4.0648f,4.8528f,5.8052f,5.8863f,5.1576f,5.7473f,6.5081f,2.2343f }, + { 4.7784f,4.1592f,4.8967f,5.7008f,4.2552f,3.5061f,4.0961f,4.8301f,4.9776f,4.1608f,4.6185f,5.2219f,5.7857f,4.9046f,5.2721f,5.7712f,1.4347f }, + { 0.82118f,2.7186f,5.6871f,7.8503f,3.1181f,3.8052f,6.1174f,7.9125f,6.2789f,6.3276f,7.9556f,9.415f,8.3853f,8.1926f,9.415f,10.678f,6.1798f }, + { 0.82664f,2.7456f,6.5821f,9.6781f,2.7509f,3.6141f,6.7054f,9.2451f,6.4686f,6.5906f,8.415f,10.415f,9.4764f,9.0458f,10.093f,11.415f,7.9556f }, + { 1.2706f,2.7658f,5.6293f,8.0227f,2.6304f,3.0796f,5.4531f,7.5571f,5.2687f,5.2121f,6.902f,8.5406f,7.3853f,7.0575f,8.2996f,9.4764f,5.3525f }, + { 1.1912f,2.3382f,5.0634f,7.0f,3.0306f,3.3716f,5.4264f,7.0811f,6.0693f,5.8503f,7.2056f,8.5406f,8.142f,7.7905f,8.8301f,9.8301f,5.3853f }, + { 1.6951f,2.632f,5.2552f,7.4608f,2.5965f,2.8102f,5.0113f,6.9447f,5.0752f,4.8326f,6.3489f,7.8915f,7.0342f,6.5906f,7.6424f,8.8707f,4.4882f }, + { 2.1385f,2.6613f,4.9072f,6.9232f,2.6753f,2.643f,4.5182f,6.3347f,4.8376f,4.455f,5.7712f,7.1926f,6.7332f,6.1671f,7.0811f,8.1671f,4.0429f }, + { 1.4562f,2.3043f,4.4378f,6.1862f,3.2501f,3.278f,4.902f,6.2926f,5.71f,5.4301f,6.6513f,7.6601f,7.5906f,7.0931f,8.0227f,8.8707f,4.5344f }, + { 2.4268f,2.8553f,4.7808f,6.5821f,2.8573f,2.706f,4.3048f,5.9393f,4.6917f,4.2485f,5.3135f,6.5906f,6.3853f,5.7054f,6.4922f,7.4454f,3.3798f }, + { 2.9909f,2.8843f,4.5222f,6.1235f,3.0538f,2.6928f,4.0342f,5.5002f,4.745f,4.1894f,5.1052f,6.2653f,6.3347f,5.5991f,6.3065f,7.1174f,2.8817f }, + { 1.7899f,2.3512f,4.1374f,5.5324f,3.4047f,3.251f,4.5243f,5.6917f,5.4843f,5.1608f,6.1052f,7.0342f,7.1296f,6.6513f,7.3853f,8.1671f,3.7344f }, + { 2.3396f,3.1798f,4.8028f,6.1671f,3.2277f,2.9686f,4.1766f,5.4378f,4.8077f,4.1782f,5.0285f,6.0227f,6.2121f,5.4339f,6.0693f,6.9339f,2.9125f }, + { 3.16f,2.9944f,4.3779f,5.5447f,3.555f,3.0656f,4.0357f,5.017f,5.1358f,4.4764f,5.1576f,5.9556f,6.4001f,5.6601f,6.142f,6.7521f,2.1573f }, + { 2.0382f,2.5137f,5.0516f,7.2585f,2.5514f,2.6109f,4.6894f,6.6424f,5.0199f,4.6446f,5.9888f,7.5243f,7.0693f,6.4764f,7.3853f,8.5406f,4.5612f }, + { 3.4853f,3.2401f,4.5243f,5.7192f,3.5426f,3.0465f,4.0014f,5.0487f,4.9502f,4.2468f,4.8759f,5.7616f,6.1735f,5.415f,5.902f,6.5324f,2.0553f }, + { 0.20305f,4.2687f,9.3561f,13.0f,4.0946f,6.1483f,10.193f,13.0f,8.8301f,9.8301f,12.415f,14.0f,12.415f,12.415f,14.0f,14.0f,13.0f }, + { 14.0f,14.0f,2.6513f,4.5843f,14.0f,14.0f,3.1846f,4.8351f,2.5509f,3.135f,4.3798f,5.6871f,4.3816f,4.7077f,5.612f,6.6781f,2.4306f }, + { 3.027f,3.0035f,4.6713f,6.2585f,3.0568f,2.7054f,4.0414f,5.4922f,4.6713f,4.059f,5.0056f,6.1358f,6.1608f,5.4378f,6.0871f,6.9556f,2.842f }, + { 1.1109f,2.4828f,6.0871f,8.9556f,2.5737f,3.1838f,6.1483f,8.6077f,6.1735f,6.1174f,7.9125f,9.7521f,8.9556f,8.5737f,9.6781f,11.0f,7.2056f }, + { 2.4212f,2.5943f,4.7784f,6.7239f,2.7025f,2.5695f,4.3908f,6.1483f,4.902f,4.4416f,5.6601f,7.0f,6.8003f,6.1545f,6.9666f,7.9556f,3.7204f }, + { 0.92268f,3.07f,6.2252f,8.5737f,2.7604f,3.5365f,6.1296f,8.2186f,5.4493f,5.6337f,7.4922f,9.1926f,7.3853f,7.2721f,8.7146f,10.093f,5.6469f }, + { 1.2858f,2.9245f,5.1959f,6.8503f,2.9659f,3.2823f,5.0458f,6.4686f,5.1703f,5.0458f,6.3065f,7.6781f,6.8301f,6.5324f,7.6601f,8.7521f,4.3982f } +}; + + +/*----------------------------------------------------------------------------------* + * Stereo downmix to EVS ROM tables + *----------------------------------------------------------------------------------*/ + + +const float Stereo_dmx_s_wnd_coef_16k[L_FRAME16k >> 4] = { + 0.00154133327f, 0.0138150426f, 0.0380602330f, 0.0736799166f, 0.119797014f, 0.175276011f, 0.238750681f, 0.308658302f, 0.383277327f, 0.460770488f, + 0.539229512f, 0.616722703f, 0.691341758f, 0.761249363f, 0.824724138f, 0.880203009f, 0.926320136f, 0.961939812f, 0.986184955f, 0.998458624f, +}; + +const float Stereo_dmx_s_wnd_coef_32k[L_FRAME32k >> 4] = { + 0.000385481922f, 0.00346577191f, 0.00960735977f, 0.0187723786f, 0.0309043285f, 0.0459284224f, 0.0637519881f, 0.0842651874f, 0.107341543f, 0.132838756f, + 0.160599619f, 0.190453023f, 0.222214893f, 0.255689442f, 0.290670186f, 0.326941460f, 0.364279807f, 0.402454913f, 0.441231340f, 0.480370134f, + 0.519629955f, 0.558768749f, 0.597545147f, 0.635720134f, 0.673058629f, 0.709329903f, 0.744310737f, 0.777785182f, 0.809546947f, 0.839400351f, + 0.867161214f, 0.892658472f, 0.915734828f, 0.936248004f, 0.954071581f, 0.969095647f, 0.981227636f, 0.990392625f, 0.996534228f, 0.999614537f +}; + +const float Stereo_dmx_s_wnd_coef_48k[L_FRAME48k >> 4] = { + 0.000171337553f, 0.00154133327f, 0.00427756971f, 0.00837254710f, 0.0138150426f, 0.0205901340f, 0.0286792554f, 0.0380602330f, 0.0487073623f, 0.0605914444f, + 0.0736799166f, 0.0879369006f, 0.103323318f, 0.119797014f, 0.137312800f, 0.155822709f, 0.175276011f, 0.195619285f, 0.216796920f, 0.238750681f, + 0.261420637f, 0.284744442f, 0.308658302f, 0.333096594f, 0.357992321f, 0.383277327f, 0.408882231f, 0.434736967f, 0.460770488f, 0.486911595f, + 0.513088524f, 0.539229512f, 0.565263212f, 0.591117799f, 0.616722703f, 0.642007649f, 0.666903436f, 0.691341758f, 0.715255499f, 0.738579512f, + 0.761249363f, 0.783203125f, 0.804380774f, 0.824724138f, 0.844177306f, 0.862687230f, 0.880203009f, 0.896676719f, 0.912063122f, 0.926320136f, + 0.939408541f, 0.951292694f, 0.961939812f, 0.971320748f, 0.979409873f, 0.986184955f, 0.991627395f, 0.995722473f, 0.998458624f, 0.999828696f +}; + +const float Stereo_dmx_wnd_coef_32k[L_FRAME32k] = { + 0.00245436677f, 0.00736304140f, 0.0122715384f, 0.0171797406f, 0.0220875274f, 0.0269947834f, 0.0319013894f, 0.0368072242f, 0.0417121723f, 0.0466161147f, + 0.0515189394f, 0.0564205162f, 0.0613207407f, 0.0662194863f, 0.0711166263f, 0.0760120600f, 0.0809056610f, 0.0857973173f, 0.0906868950f, 0.0955742970f, + 0.100459389f, 0.105342068f, 0.110222206f, 0.115099691f, 0.119974405f, 0.124846220f, 0.129715025f, 0.134580702f, 0.139443144f, 0.144302234f, + 0.149157837f, 0.154009849f, 0.158858150f, 0.163702622f, 0.168543145f, 0.173379615f, 0.178211913f, 0.183039904f, 0.187863469f, 0.192682534f, + 0.197496951f, 0.202306598f, 0.207111374f, 0.211911172f, 0.216705844f, 0.221495330f, 0.226279438f, 0.231058136f, 0.235831216f, 0.240598634f, + 0.245360270f, 0.250115991f, 0.254865676f, 0.259609222f, 0.264346480f, 0.269077420f, 0.273801833f, 0.278519720f, 0.283230811f, 0.287935138f, + 0.292632490f, 0.297322810f, 0.302005947f, 0.306681842f, 0.311350316f, 0.316011310f, 0.320664674f, 0.325310320f, 0.329948068f, 0.334577978f, + 0.339199722f, 0.343813360f, 0.348418683f, 0.353015631f, 0.357604057f, 0.362183869f, 0.366754949f, 0.371317208f, 0.375870496f, 0.380414754f, + 0.384949833f, 0.389475614f, 0.393992066f, 0.398498982f, 0.402996302f, 0.407483906f, 0.411961704f, 0.416429579f, 0.420887381f, 0.425335079f, + 0.429772556f, 0.434199631f, 0.438616246f, 0.443022311f, 0.447417706f, 0.451802254f, 0.456176013f, 0.460538715f, 0.464890391f, 0.469230741f, + 0.473559886f, 0.477877617f, 0.482183754f, 0.486478329f, 0.490761191f, 0.495032281f, 0.499291331f, 0.503538370f, 0.507773340f, 0.511996031f, + 0.516206384f, 0.520404339f, 0.524589717f, 0.528762460f, 0.532922447f, 0.537069619f, 0.541203856f, 0.545324981f, 0.549433053f, 0.553527832f, + 0.557609320f, 0.561677337f, 0.565731823f, 0.569772661f, 0.573799849f, 0.577813148f, 0.581812501f, 0.585797846f, 0.589769125f, 0.593726158f, + 0.597668886f, 0.601597190f, 0.605511069f, 0.609410286f, 0.613294840f, 0.617164612f, 0.621019602f, 0.624859512f, 0.628684402f, 0.632494152f, + 0.636288643f, 0.640067816f, 0.643831551f, 0.647579789f, 0.651312411f, 0.655029356f, 0.658730507f, 0.662415802f, 0.666085124f, 0.669738412f, + 0.673375487f, 0.676996410f, 0.680601001f, 0.684189200f, 0.687760890f, 0.691316068f, 0.694854558f, 0.698376238f, 0.701881170f, 0.705369174f, + 0.708840191f, 0.712294042f, 0.715730846f, 0.719150305f, 0.722552538f, 0.725937307f, 0.729304552f, 0.732654333f, 0.735986352f, 0.739300668f, + 0.742597163f, 0.745875776f, 0.749136388f, 0.752379000f, 0.755603433f, 0.758809745f, 0.761997640f, 0.765167236f, 0.768318474f, 0.771451116f, + 0.774565160f, 0.777660608f, 0.780737281f, 0.783795059f, 0.786834061f, 0.789854050f, 0.792855084f, 0.795836926f, 0.798799634f, 0.801743090f, + 0.804667175f, 0.807571888f, 0.810457170f, 0.813322961f, 0.816169143f, 0.818995655f, 0.821802378f, 0.824589312f, 0.827356398f, 0.830103517f, + 0.832830667f, 0.835537791f, 0.838224769f, 0.840891480f, 0.843537927f, 0.846164107f, 0.848769844f, 0.851355195f, 0.853920043f, 0.856464267f, + 0.858987868f, 0.861490726f, 0.863972843f, 0.866434216f, 0.868874609f, 0.871294141f, 0.873692691f, 0.876070142f, 0.878426433f, 0.880761623f, + 0.883075595f, 0.885368288f, 0.887639642f, 0.889889598f, 0.892118156f, 0.894325078f, 0.896510601f, 0.898674488f, 0.900816679f, 0.902937233f, + 0.905035973f, 0.907112896f, 0.909168005f, 0.911201119f, 0.913212419f, 0.915201664f, 0.917168796f, 0.919113874f, 0.921036780f, 0.922937512f, + 0.924816012f, 0.926672220f, 0.928506076f, 0.930317640f, 0.932106674f, 0.933873355f, 0.935617447f, 0.937339008f, 0.939038038f, 0.940714359f, + 0.942368090f, 0.943999112f, 0.945607364f, 0.947192788f, 0.948755443f, 0.950295210f, 0.951812088f, 0.953306019f, 0.954777062f, 0.956224978f, + 0.957649887f, 0.959051788f, 0.960430562f, 0.961786151f, 0.963118553f, 0.964427769f, 0.965713739f, 0.966976464f, 0.968215883f, 0.969431996f, + 0.970624745f, 0.971794069f, 0.972939968f, 0.974062443f, 0.975161433f, 0.976236939f, 0.977288902f, 0.978317380f, 0.979322255f, 0.980303526f, + 0.981261134f, 0.982195139f, 0.983105481f, 0.983992159f, 0.984855056f, 0.985694289f, 0.986509740f, 0.987301409f, 0.988069296f, 0.988813400f, + 0.989533663f, 0.990230083f, 0.990902662f, 0.991551340f, 0.992176116f, 0.992776990f, 0.993353963f, 0.993906975f, 0.994436026f, 0.994941175f, + 0.995422304f, 0.995879471f, 0.996312618f, 0.996721745f, 0.997106910f, 0.997467995f, 0.997805059f, 0.998118103f, 0.998407125f, 0.998672009f, + 0.998912871f, 0.999129653f, 0.999322414f, 0.999491036f, 0.999635577f, 0.999756038f, 0.999852419f, 0.999924719f, 0.999972880f, 0.999996960f, + 0.999996960f, 0.999972880f, 0.999924719f, 0.999852419f, 0.999756038f, 0.999635577f, 0.999491036f, 0.999322355f, 0.999129653f, 0.998912871f, + 0.998672009f, 0.998407066f, 0.998118103f, 0.997805059f, 0.997467995f, 0.997106910f, 0.996721745f, 0.996312618f, 0.995879471f, 0.995422304f, + 0.994941175f, 0.994436026f, 0.993906975f, 0.993353963f, 0.992776990f, 0.992176116f, 0.991551340f, 0.990902603f, 0.990230083f, 0.989533663f, + 0.988813400f, 0.988069296f, 0.987301409f, 0.986509740f, 0.985694289f, 0.984855056f, 0.983992159f, 0.983105481f, 0.982195139f, 0.981261134f, + 0.980303526f, 0.979322195f, 0.978317380f, 0.977288902f, 0.976236939f, 0.975161433f, 0.974062383f, 0.972939968f, 0.971794069f, 0.970624685f, + 0.969431937f, 0.968215883f, 0.966976464f, 0.965713739f, 0.964427769f, 0.963118494f, 0.961786091f, 0.960430503f, 0.959051728f, 0.957649887f, + 0.956224918f, 0.954777002f, 0.953306079f, 0.951812088f, 0.950295210f, 0.948755443f, 0.947192788f, 0.945607305f, 0.943999052f, 0.942368090f, + 0.940714359f, 0.939037979f, 0.937338948f, 0.935617387f, 0.933873296f, 0.932106674f, 0.930317581f, 0.928506076f, 0.926672220f, 0.924815953f, + 0.922937512f, 0.921036780f, 0.919113815f, 0.917168736f, 0.915201545f, 0.913212359f, 0.911201119f, 0.909167886f, 0.907112896f, 0.905035913f, + 0.902937233f, 0.900816679f, 0.898674428f, 0.896510541f, 0.894325078f, 0.892118096f, 0.889889598f, 0.887639582f, 0.885368228f, 0.883075476f, + 0.880761623f, 0.878426373f, 0.876070142f, 0.873692632f, 0.871294081f, 0.868874550f, 0.866434216f, 0.863972843f, 0.861490667f, 0.858987749f, + 0.856464148f, 0.853919983f, 0.851355135f, 0.848769784f, 0.846163988f, 0.843537807f, 0.840891421f, 0.838224769f, 0.835537791f, 0.832830667f, + 0.830103517f, 0.827356339f, 0.824589312f, 0.821802318f, 0.818995535f, 0.816169024f, 0.813322842f, 0.810457170f, 0.807571888f, 0.804667115f, + 0.801743090f, 0.798799574f, 0.795836866f, 0.792855084f, 0.789854050f, 0.786834002f, 0.783794999f, 0.780737102f, 0.777660549f, 0.774565101f, + 0.771450996f, 0.768318295f, 0.765167117f, 0.761997640f, 0.758809745f, 0.755603492f, 0.752379000f, 0.749136329f, 0.745875657f, 0.742597163f, + 0.739300609f, 0.735986292f, 0.732654154f, 0.729304433f, 0.725937247f, 0.722552478f, 0.719150245f, 0.715730846f, 0.712294042f, 0.708840072f, + 0.705369234f, 0.701881170f, 0.698376238f, 0.694854438f, 0.691315889f, 0.687760890f, 0.684189141f, 0.680600941f, 0.676996291f, 0.673375309f, + 0.669738352f, 0.666085184f, 0.662415802f, 0.658730507f, 0.655029297f, 0.651312292f, 0.647579789f, 0.643831551f, 0.640067756f, 0.636288524f, + 0.632493973f, 0.628684342f, 0.624859452f, 0.621019423f, 0.617164493f, 0.613294840f, 0.609410226f, 0.605511129f, 0.601597250f, 0.597668827f, + 0.593726039f, 0.589769006f, 0.585797846f, 0.581812441f, 0.577813029f, 0.573799670f, 0.569772482f, 0.565731764f, 0.561677217f, 0.557609320f, + 0.553527832f, 0.549432993f, 0.545324862f, 0.541203856f, 0.537069559f, 0.532922387f, 0.528762341f, 0.524589539f, 0.520404279f, 0.516206324f, + 0.511995912f, 0.507773161f, 0.503538132f, 0.499291241f, 0.495032310f, 0.490761220f, 0.486478329f, 0.482183695f, 0.477877438f, 0.473559886f, + 0.469230711f, 0.464890242f, 0.460538566f, 0.456175804f, 0.451802224f, 0.447417587f, 0.443022132f, 0.438616246f, 0.434199572f, 0.429772437f, + 0.425335139f, 0.420887381f, 0.416429490f, 0.411961585f, 0.407483727f, 0.402996272f, 0.398498893f, 0.393991917f, 0.389475435f, 0.384949595f, + 0.380414665f, 0.375870585f, 0.371317238f, 0.366754919f, 0.362183779f, 0.357603908f, 0.353015631f, 0.348418653f, 0.343813270f, 0.339199573f, + 0.334577739f, 0.329948068f, 0.325310200f, 0.320664495f, 0.316011310f, 0.311350256f, 0.306681722f, 0.302006006f, 0.297322810f, 0.292632431f, + 0.287935019f, 0.283230633f, 0.278519690f, 0.273801804f, 0.269077301f, 0.264346302f, 0.259608954f, 0.254865587f, 0.250116080f, 0.245360300f, + 0.240598619f, 0.235831141f, 0.231057972f, 0.226279467f, 0.221495286f, 0.216705769f, 0.211911023f, 0.207111165f, 0.202306569f, 0.197496846f, + 0.192682371f, 0.187863261f, 0.183039844f, 0.178211793f, 0.173379675f, 0.168543145f, 0.163702562f, 0.158858031f, 0.154009670f, 0.149157837f, + 0.144302174f, 0.139443025f, 0.134580523f, 0.129714787f, 0.124846153f, 0.119974270f, 0.115099736f, 0.110222198f, 0.105341993f, 0.100459255f, + 0.0955743343f, 0.0906868801f, 0.0857972279f, 0.0809055194f, 0.0760118514f, 0.0711165965f, 0.0662193894f, 0.0613205843f, 0.0564203039f, 0.0515186638f, + 0.0466160178f, 0.0417122506f, 0.0368072391f, 0.0319013409f, 0.0269946754f, 0.0220873598f, 0.0171797480f, 0.0122714853f, 0.00736292684f, 0.00245419098f +}; + +const float Stereo_dmx_wnd_coef_48k[L_FRAME48k] = { + 0.00163624552f, 0.00490871910f, 0.00818113983f, 0.0114534730f, 0.0147256833f, 0.0179977361f, 0.0212695971f, 0.0245412290f, 0.0278125983f, 0.0310836714f, + 0.0343544111f, 0.0376247801f, 0.0408947468f, 0.0441642813f, 0.0474333353f, 0.0507018827f, 0.0539698936f, 0.0572373196f, 0.0605041310f, 0.0637703016f, + 0.0670357868f, 0.0703005567f, 0.0735645667f, 0.0768277943f, 0.0800902024f, 0.0833517388f, 0.0866123885f, 0.0898721218f, 0.0931308791f, 0.0963886455f, + 0.0996453837f, 0.102901049f, 0.106155604f, 0.109409027f, 0.112661287f, 0.115912341f, 0.119162142f, 0.122410677f, 0.125657901f, 0.128903762f, + 0.132148281f, 0.135391355f, 0.138632968f, 0.141873136f, 0.145111740f, 0.148348823f, 0.151584297f, 0.154818162f, 0.158050373f, 0.161280856f, + 0.164509654f, 0.167736664f, 0.170961902f, 0.174185291f, 0.177406818f, 0.180626437f, 0.183844119f, 0.187059864f, 0.190273583f, 0.193485275f, + 0.196694881f, 0.199902371f, 0.203107744f, 0.206310928f, 0.209511906f, 0.212710649f, 0.215907112f, 0.219101235f, 0.222293034f, 0.225482464f, + 0.228669465f, 0.231854036f, 0.235036105f, 0.238215655f, 0.241392657f, 0.244567066f, 0.247738868f, 0.250908017f, 0.254074484f, 0.257238209f, + 0.260399193f, 0.263557374f, 0.266712755f, 0.269865274f, 0.273014903f, 0.276161611f, 0.279305339f, 0.282446116f, 0.285583824f, 0.288718522f, + 0.291850090f, 0.294978559f, 0.298103839f, 0.301225930f, 0.304344803f, 0.307460397f, 0.310572743f, 0.313681751f, 0.316787392f, 0.319889635f, + 0.322988451f, 0.326083839f, 0.329175681f, 0.332264036f, 0.335348845f, 0.338430017f, 0.341507554f, 0.344581485f, 0.347651720f, 0.350718200f, + 0.353780955f, 0.356839925f, 0.359895051f, 0.362946332f, 0.365993738f, 0.369037211f, 0.372076690f, 0.375112236f, 0.378143758f, 0.381171227f, + 0.384194613f, 0.387213886f, 0.390229046f, 0.393239975f, 0.396246701f, 0.399249226f, 0.402247399f, 0.405241340f, 0.408230871f, 0.411216080f, + 0.414196879f, 0.417173237f, 0.420145124f, 0.423112512f, 0.426075369f, 0.429033697f, 0.431987405f, 0.434936464f, 0.437880874f, 0.440820634f, + 0.443755597f, 0.446685851f, 0.449611336f, 0.452531993f, 0.455447793f, 0.458358735f, 0.461264789f, 0.464165837f, 0.467061967f, 0.469953090f, + 0.472839147f, 0.475720167f, 0.478596091f, 0.481466919f, 0.484332532f, 0.487192988f, 0.490048259f, 0.492898166f, 0.495742917f, 0.498582304f, + 0.501416385f, 0.504245043f, 0.507068336f, 0.509886205f, 0.512698591f, 0.515505493f, 0.518306911f, 0.521102786f, 0.523893058f, 0.526677668f, + 0.529456615f, 0.532230020f, 0.534997642f, 0.537759542f, 0.540515661f, 0.543266058f, 0.546010554f, 0.548749268f, 0.551482081f, 0.554209054f, + 0.556930006f, 0.559644997f, 0.562354028f, 0.565056980f, 0.567753971f, 0.570444822f, 0.573129594f, 0.575808227f, 0.578480661f, 0.581146955f, + 0.583806932f, 0.586460710f, 0.589108169f, 0.591749430f, 0.594384253f, 0.597012758f, 0.599634886f, 0.602250516f, 0.604859710f, 0.607462525f, + 0.610058725f, 0.612648487f, 0.615231633f, 0.617808223f, 0.620378077f, 0.622941375f, 0.625498056f, 0.628047943f, 0.630591154f, 0.633127630f, + 0.635657310f, 0.638180137f, 0.640696168f, 0.643205345f, 0.645707667f, 0.648203015f, 0.650691390f, 0.653172910f, 0.655647278f, 0.658114731f, + 0.660575151f, 0.663028479f, 0.665474653f, 0.667913795f, 0.670345724f, 0.672770441f, 0.675188005f, 0.677598298f, 0.680001378f, 0.682397127f, + 0.684785664f, 0.687166810f, 0.689540565f, 0.691906929f, 0.694265962f, 0.696617484f, 0.698961616f, 0.701298177f, 0.703627348f, 0.705948830f, + 0.708262801f, 0.710569263f, 0.712868035f, 0.715159237f, 0.717442751f, 0.719718635f, 0.721986711f, 0.724247098f, 0.726499736f, 0.728744626f, + 0.730981648f, 0.733210862f, 0.735432267f, 0.737645686f, 0.739851296f, 0.742048979f, 0.744238734f, 0.746420443f, 0.748594224f, 0.750759959f, + 0.752917647f, 0.755067289f, 0.757208824f, 0.759342313f, 0.761467636f, 0.763584793f, 0.765693724f, 0.767794549f, 0.769887090f, 0.771971405f, + 0.774047434f, 0.776115239f, 0.778174698f, 0.780225754f, 0.782268524f, 0.784302890f, 0.786328912f, 0.788346410f, 0.790355563f, 0.792356193f, + 0.794348359f, 0.796332002f, 0.798307180f, 0.800273776f, 0.802231789f, 0.804181218f, 0.806122005f, 0.808054149f, 0.809977651f, 0.811892509f, + 0.813798666f, 0.815696120f, 0.817584813f, 0.819464803f, 0.821335912f, 0.823198318f, 0.825051904f, 0.826896608f, 0.828732491f, 0.830559433f, + 0.832377613f, 0.834186733f, 0.835986972f, 0.837778270f, 0.839560628f, 0.841333985f, 0.843098283f, 0.844853640f, 0.846599817f, 0.848336995f, + 0.850065112f, 0.851784110f, 0.853493989f, 0.855194688f, 0.856886268f, 0.858568668f, 0.860241890f, 0.861905873f, 0.863560677f, 0.865206122f, + 0.866842389f, 0.868469357f, 0.870086968f, 0.871695340f, 0.873294353f, 0.874884009f, 0.876464248f, 0.878035188f, 0.879596710f, 0.881148815f, + 0.882691383f, 0.884224594f, 0.885748327f, 0.887262523f, 0.888767302f, 0.890262544f, 0.891748250f, 0.893224299f, 0.894690871f, 0.896147847f, + 0.897595227f, 0.899033010f, 0.900461137f, 0.901879668f, 0.903288484f, 0.904687643f, 0.906077147f, 0.907456934f, 0.908827007f, 0.910187364f, + 0.911537945f, 0.912878752f, 0.914209783f, 0.915530980f, 0.916842461f, 0.918144047f, 0.919435859f, 0.920717835f, 0.921989918f, 0.923252106f, + 0.924504459f, 0.925746918f, 0.926979423f, 0.928201973f, 0.929414630f, 0.930617392f, 0.931810081f, 0.932992756f, 0.934165537f, 0.935328305f, + 0.936480999f, 0.937623739f, 0.938756406f, 0.939879060f, 0.940991580f, 0.942094028f, 0.943186462f, 0.944268763f, 0.945340872f, 0.946402907f, + 0.947454870f, 0.948496580f, 0.949528158f, 0.950549603f, 0.951560915f, 0.952561915f, 0.953552783f, 0.954533458f, 0.955503881f, 0.956464112f, + 0.957414031f, 0.958353758f, 0.959283173f, 0.960202336f, 0.961111188f, 0.962009788f, 0.962898076f, 0.963776052f, 0.964643717f, 0.965501070f, + 0.966348052f, 0.967184663f, 0.968010962f, 0.968826830f, 0.969632387f, 0.970427573f, 0.971212327f, 0.971986651f, 0.972750604f, 0.973504126f, + 0.974247217f, 0.974979877f, 0.975702107f, 0.976413906f, 0.977115214f, 0.977806091f, 0.978486478f, 0.979156435f, 0.979815841f, 0.980464756f, + 0.981103182f, 0.981731117f, 0.982348502f, 0.982955396f, 0.983551800f, 0.984137595f, 0.984712899f, 0.985277653f, 0.985831857f, 0.986375451f, + 0.986908555f, 0.987431049f, 0.987942994f, 0.988444328f, 0.988935113f, 0.989415288f, 0.989884853f, 0.990343809f, 0.990792215f, 0.991229951f, + 0.991657078f, 0.992073655f, 0.992479563f, 0.992874801f, 0.993259430f, 0.993633449f, 0.993996799f, 0.994349539f, 0.994691610f, 0.995023012f, + 0.995343804f, 0.995653868f, 0.995953321f, 0.996242106f, 0.996520221f, 0.996787608f, 0.997044384f, 0.997290432f, 0.997525871f, 0.997750580f, + 0.997964621f, 0.998167932f, 0.998360574f, 0.998542547f, 0.998713851f, 0.998874426f, 0.999024272f, 0.999163449f, 0.999291956f, 0.999409735f, + 0.999516785f, 0.999613166f, 0.999698818f, 0.999773800f, 0.999838054f, 0.999891579f, 0.999934435f, 0.999966562f, 0.999987960f, 0.999998689f, + 0.999998689f, 0.999987960f, 0.999966562f, 0.999934435f, 0.999891579f, 0.999838054f, 0.999773800f, 0.999698818f, 0.999613166f, 0.999516785f, + 0.999409735f, 0.999291956f, 0.999163449f, 0.999024272f, 0.998874426f, 0.998713851f, 0.998542547f, 0.998360574f, 0.998167932f, 0.997964621f, + 0.997750580f, 0.997525871f, 0.997290432f, 0.997044384f, 0.996787608f, 0.996520162f, 0.996242106f, 0.995953321f, 0.995653868f, 0.995343745f, + 0.995023012f, 0.994691610f, 0.994349539f, 0.993996799f, 0.993633449f, 0.993259430f, 0.992874801f, 0.992479503f, 0.992073596f, 0.991657078f, + 0.991229951f, 0.990792215f, 0.990343809f, 0.989884853f, 0.989415288f, 0.988935113f, 0.988444328f, 0.987942994f, 0.987431049f, 0.986908555f, + 0.986375451f, 0.985831797f, 0.985277653f, 0.984712899f, 0.984137595f, 0.983551741f, 0.982955396f, 0.982348502f, 0.981731117f, 0.981103182f, + 0.980464756f, 0.979815781f, 0.979156375f, 0.978486478f, 0.977806091f, 0.977115214f, 0.976413906f, 0.975702167f, 0.974979877f, 0.974247217f, + 0.973504126f, 0.972750604f, 0.971986651f, 0.971212268f, 0.970427513f, 0.969632387f, 0.968826830f, 0.968010902f, 0.967184663f, 0.966347992f, + 0.965501010f, 0.964643717f, 0.963776052f, 0.962898076f, 0.962009788f, 0.961111248f, 0.960202336f, 0.959283173f, 0.958353698f, 0.957414031f, + 0.956464052f, 0.955503821f, 0.954533398f, 0.953552783f, 0.952561915f, 0.951560855f, 0.950549603f, 0.949528158f, 0.948496580f, 0.947454810f, + 0.946402907f, 0.945340872f, 0.944268644f, 0.943186402f, 0.942094028f, 0.940991521f, 0.939879000f, 0.938756347f, 0.937623739f, 0.936481059f, + 0.935328305f, 0.934165537f, 0.932992816f, 0.931810021f, 0.930617273f, 0.929414630f, 0.928201973f, 0.926979363f, 0.925746858f, 0.924504459f, + 0.923252106f, 0.921989858f, 0.920717835f, 0.919435859f, 0.918144047f, 0.916842401f, 0.915531039f, 0.914209723f, 0.912878692f, 0.911537826f, + 0.910187304f, 0.908826947f, 0.907456875f, 0.906077087f, 0.904687583f, 0.903288484f, 0.901879609f, 0.900461137f, 0.899032950f, 0.897595286f, + 0.896147847f, 0.894690871f, 0.893224299f, 0.891748130f, 0.890262425f, 0.888767183f, 0.887262583f, 0.885748327f, 0.884224534f, 0.882691383f, + 0.881148815f, 0.879596710f, 0.878035188f, 0.876464248f, 0.874883950f, 0.873294294f, 0.871695280f, 0.870087028f, 0.868469357f, 0.866842330f, + 0.865206063f, 0.863560557f, 0.861905754f, 0.860241890f, 0.858568668f, 0.856886268f, 0.855194628f, 0.853493869f, 0.851784110f, 0.850065112f, + 0.848336995f, 0.846599758f, 0.844853640f, 0.843098342f, 0.841333985f, 0.839560628f, 0.837778270f, 0.835986972f, 0.834186673f, 0.832377613f, + 0.830559492f, 0.828732491f, 0.826896548f, 0.825051844f, 0.823198259f, 0.821335852f, 0.819464624f, 0.817584813f, 0.815696061f, 0.813798606f, + 0.811892450f, 0.809977591f, 0.808054030f, 0.806121826f, 0.804181159f, 0.802231669f, 0.800273657f, 0.798307061f, 0.796332061f, 0.794348359f, + 0.792356133f, 0.790355623f, 0.788346469f, 0.786328912f, 0.784302890f, 0.782268524f, 0.780225694f, 0.778174579f, 0.776115119f, 0.774047494f, + 0.771971405f, 0.769887090f, 0.767794490f, 0.765693665f, 0.763584673f, 0.761467457f, 0.759342313f, 0.757208824f, 0.755067229f, 0.752917588f, + 0.750759840f, 0.748594046f, 0.746420264f, 0.744238496f, 0.742048919f, 0.739851236f, 0.737645745f, 0.735432208f, 0.733210862f, 0.730981588f, + 0.728744507f, 0.726499796f, 0.724247098f, 0.721986711f, 0.719718575f, 0.717442691f, 0.715159178f, 0.712867975f, 0.710569263f, 0.708262861f, + 0.705948830f, 0.703627229f, 0.701298118f, 0.698961437f, 0.696617365f, 0.694265783f, 0.691906929f, 0.689540505f, 0.687166691f, 0.684785485f, + 0.682397008f, 0.680001199f, 0.677598119f, 0.675188124f, 0.672770500f, 0.670345724f, 0.667913795f, 0.665474653f, 0.663028419f, 0.660575032f, + 0.658114791f, 0.655647337f, 0.653172851f, 0.650691390f, 0.648202896f, 0.645707548f, 0.643205225f, 0.640696049f, 0.638180137f, 0.635657251f, + 0.633127570f, 0.630591094f, 0.628047824f, 0.625497878f, 0.622941196f, 0.620378077f, 0.617808104f, 0.615231514f, 0.612648308f, 0.610058606f, + 0.607462287f, 0.604859710f, 0.602250636f, 0.599634945f, 0.597012818f, 0.594384313f, 0.591749430f, 0.589108169f, 0.586460650f, 0.583806813f, + 0.581146955f, 0.578480661f, 0.575808167f, 0.573129535f, 0.570444763f, 0.567753851f, 0.565056860f, 0.562354028f, 0.559644997f, 0.556929946f, + 0.554208934f, 0.551481962f, 0.548749089f, 0.546010375f, 0.543265820f, 0.540515602f, 0.537759423f, 0.534997463f, 0.532229841f, 0.529456675f, + 0.526677608f, 0.523892939f, 0.521102846f, 0.518306971f, 0.515505552f, 0.512698591f, 0.509886146f, 0.507068276f, 0.504244924f, 0.501416445f, + 0.498582333f, 0.495742887f, 0.492898136f, 0.490048110f, 0.487192839f, 0.484332353f, 0.481466681f, 0.478596061f, 0.475720108f, 0.472839057f, + 0.469952941f, 0.467061788f, 0.464165628f, 0.461264521f, 0.458358675f, 0.455447704f, 0.452532053f, 0.449611366f, 0.446685851f, 0.443755567f, + 0.440820515f, 0.437880963f, 0.434936523f, 0.431987405f, 0.429033667f, 0.426075339f, 0.423112422f, 0.420145005f, 0.417173088f, 0.414196908f, + 0.411216080f, 0.408230841f, 0.405241221f, 0.402247280f, 0.399249017f, 0.396246493f, 0.393239945f, 0.390228957f, 0.387213796f, 0.384194493f, + 0.381171048f, 0.378143549f, 0.375111997f, 0.372076422f, 0.369037300f, 0.365993798f, 0.362946361f, 0.359895051f, 0.356839865f, 0.353780866f, + 0.350718081f, 0.347651780f, 0.344581515f, 0.341507554f, 0.338429958f, 0.335348725f, 0.332263887f, 0.329175502f, 0.326083839f, 0.322988421f, + 0.319889575f, 0.316787302f, 0.313681602f, 0.310572565f, 0.307460219f, 0.304344565f, 0.301225871f, 0.298103720f, 0.294978380f, 0.291849911f, + 0.288718283f, 0.285583586f, 0.282446027f, 0.279305458f, 0.276161671f, 0.273014933f, 0.269865274f, 0.266712725f, 0.263557315f, 0.260399073f, + 0.257238269f, 0.254074514f, 0.250908017f, 0.247738823f, 0.244566977f, 0.241392523f, 0.238215476f, 0.235035881f, 0.231854007f, 0.228669405f, + 0.225482360f, 0.222292900f, 0.219101071f, 0.215906888f, 0.212710381f, 0.209511846f, 0.206310824f, 0.203107595f, 0.199902192f, 0.196694881f, + 0.193485230f, 0.190273508f, 0.187059984f, 0.183844209f, 0.180626482f, 0.177406818f, 0.174185246f, 0.170961812f, 0.167736545f, 0.164509490f, + 0.161280900f, 0.158050358f, 0.154818118f, 0.151584208f, 0.148348689f, 0.145111576f, 0.141872913f, 0.138632968f, 0.135391295f, 0.132148176f, + 0.128903642f, 0.125657722f, 0.122410461f, 0.119161889f, 0.115912043f, 0.112661190f, 0.109408893f, 0.106155664f, 0.102901056f, 0.0996453464f, + 0.0963885784f, 0.0931307673f, 0.0898722038f, 0.0866124406f, 0.0833517462f, 0.0800901577f, 0.0768277124f, 0.0735644475f, 0.0703003928f, 0.0670358241f, + 0.0637702942f, 0.0605040900f, 0.0572372340f, 0.0539697632f, 0.0507017188f, 0.0474331267f, 0.0441640280f, 0.0408946946f, 0.0376246870f, 0.0343542770f, + 0.0310834963f, 0.0278123822f, 0.0245409720f, 0.0212692991f, 0.0179976355f, 0.0147257810f, 0.0114535289f, 0.00818115473f, 0.00490869302f, 0.00163617858f +}; + + +const HUFF_TABLE huff_alpha_table[2] = +{ + { /* Alfa Fine */ + { /* df0 */ + { 0x0002ce, 0x000b5e, 0x0004fe, 0x0005ae, 0x00027e, 0x0002de, 0x00016a, 0x0000b2, 0x00004a, 0x00004b, + 0x0000b6, 0x00004e, 0x000024, 0x00002e, 0x00000a, 0x000006, 0x000000, 0x000007, 0x000008, 0x00002f, + 0x000026, 0x000058, 0x0000b4, 0x00009e, 0x00016e, 0x000166, 0x0002df, 0x0002cf, 0x00027c, 0x00027d, + 0x0004ff, 0x000b5f, 0x0002d6 }, + { 10, 12, 11, 11, 10, 10, 9, 8, 7, 7, + 8, 7, 6, 6, 4, 3, 1, 3, 4, 6, + 6, 7, 8, 8, 9, 9, 10, 10, 10, 10, + 11, 12, 10 } + }, + { /* df */ + { 0x0011de, 0x011ffe, 0x013dea, 0x013df6, 0x008eea, 0x013df7, 0x013dee, 0x013deb, 0x013dec, 0x008eee, + 0x008ffe, 0x009efe, 0x0047fe, 0x004f7c, 0x0023fe, 0x0011fe, 0x0013fe, 0x0008f6, 0x0009ee, 0x000476, + 0x00047a, 0x0004f6, 0x00023a, 0x00027a, 0x00027e, 0x00013e, 0x00009a, 0x00004c, 0x00004e, 0x000012, + 0x00000a, 0x000006, 0x000000, 0x000007, 0x00000b, 0x000010, 0x000022, 0x000046, 0x00009b, 0x00013c, + 0x00011c, 0x00023e, 0x00023c, 0x0004fe, 0x00047e, 0x0009fe, 0x0008fe, 0x0008f7, 0x0013ff, 0x0011df, + 0x0027bc, 0x004f7e, 0x004776, 0x009efa, 0x009ef4, 0x013dfe, 0x008eeb, 0x008ee8, 0x013dff, 0x008ee9, + 0x008eef, 0x011fff, 0x013ded, 0x013def, 0x0011dc }, + { 13, 17, 17, 17, 16, 17, 17, 17, 17, 16, + 16, 16, 15, 15, 14, 13, 13, 12, 12, 11, + 11, 11, 10, 10, 10, 9, 8, 7, 7, 5, + 4, 3, 1, 3, 4, 5, 6, 7, 8, 9, + 9, 10, 10, 11, 11, 12, 12, 12, 13, 13, + 14, 15, 15, 16, 16, 17, 16, 16, 17, 16, + 16, 17, 17, 17, 13 } + }, + { /* dt */ + { 0x00eeee, 0x03b3ee, 0x03b3f6, 0x03b3fc, 0x01d9bc, 0x01d9bd, 0x01d9b2, 0x03b3fe, 0x01d9be, 0x01d9f6, + 0x01d9fc, 0x00ecda, 0x00ecfa, 0x00eeef, 0x00766e, 0x007776, 0x003b3a, 0x003bba, 0x001d9a, 0x001ddc, + 0x001dde, 0x000eec, 0x000764, 0x000772, 0x0003b0, 0x0003b8, 0x0001da, 0x0001de, 0x000072, 0x000038, + 0x00001e, 0x000006, 0x000000, 0x000002, 0x00001f, 0x00003a, 0x000073, 0x0001df, 0x0001db, 0x0003ba, + 0x0003b1, 0x000773, 0x000765, 0x000eed, 0x000ecc, 0x001d9e, 0x001d9c, 0x003bbe, 0x003b3b, 0x00777e, + 0x00767c, 0x00eefe, 0x00ecfc, 0x00ecd8, 0x01d9fd, 0x01d9fa, 0x01d9bf, 0x01d9b6, 0x01d9b3, 0x03b3fd, + 0x01d9b7, 0x03b3ff, 0x03b3ef, 0x03b3f7, 0x00eeff }, + { 16, 18, 18, 18, 17, 17, 17, 18, 17, 17, + 17, 16, 16, 16, 15, 15, 14, 14, 13, 13, + 13, 12, 11, 11, 10, 10, 9, 9, 7, 6, + 5, 3, 1, 2, 5, 6, 7, 9, 9, 10, + 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, + 15, 16, 16, 16, 17, 17, 17, 17, 17, 18, + 17, 18, 18, 18, 16 } + } + }, /* End Alfa Fine */ + { /* Alfa Coarse */ + { /* df0 */ + { 0x0003be, 0x0003fe, 0x0001fe, 0x0000fe, 0x00003e, 0x00003a, 0x00001e, 0x000002, 0x000000, 0x000006, + 0x00001c, 0x00007e, 0x000076, 0x0000ee, 0x0001de, 0x0003ff, 0x0003bf }, + { 10, 10, 9, 8, 6, 6, 5, 2, 1, 3, + 5, 7, 7, 8, 9, 10, 10 } + }, + { /* df */ + { 0x007c76, 0x03e3fe, 0x01f1f6, 0x01f1f7, 0x00f8ea, 0x007c74, 0x007c7c, 0x001f1c, 0x000f9e, 0x0007ce, + 0x0003e2, 0x0001f0, 0x0000fa, 0x00007e, 0x00000e, 0x000006, 0x000000, 0x000002, 0x00001e, 0x00007f, + 0x0000fb, 0x0001f2, 0x0003e6, 0x0007c6, 0x000f9f, 0x001f1e, 0x007c7e, 0x00f8fe, 0x00f8fa, 0x01f1fe, + 0x00f8eb, 0x03e3ff, 0x007c77 }, + { 15, 18, 17, 17, 16, 15, 15, 13, 12, 11, + 10, 9, 8, 7, 4, 3, 1, 2, 5, 7, + 8, 9, 10, 11, 12, 13, 15, 16, 16, 17, + 16, 18, 15 } + }, + { /* dt */ + { 0x003efc, 0x00fbfa, 0x007ddc, 0x00fbfe, 0x007dde, 0x007dfc, 0x003ef6, 0x001f76, 0x000fba, 0x000fbe, + 0x0003ec, 0x0001f2, 0x0000f8, 0x00007e, 0x00001e, 0x000006, 0x000000, 0x000002, 0x00000e, 0x00007f, + 0x0000fa, 0x0001f3, 0x0003ed, 0x0007dc, 0x000fbc, 0x001f7a, 0x003ef7, 0x007dfe, 0x007ddf, 0x00fbff, + 0x007ddd, 0x00fbfb, 0x003efd }, + { 14, 16, 15, 16, 15, 15, 14, 13, 12, 12, + 10, 9, 8, 7, 5, 3, 1, 2, 4, 7, + 8, 9, 10, 11, 12, 13, 14, 15, 15, 16, + 15, 16, 14 } + } + } /* End Alfa Coarse */ +}; + +const HUFF_TABLE huff_beta_table[2] = +{ + { /* Beta Fine */ + { /* df0 */ + { 0x000000, 0x000002, 0x000006, 0x00000e, 0x00001e, 0x00003e, 0x00007e, 0x0000fe, 0x0000ff }, + { 1, 2, 3, 4, 5, 6, 7, 8, 8 } + }, + { /* df */ + { 0x001f1e, 0x000f8e, 0x0003e2, 0x0001f2, 0x0000fa, 0x00007e, 0x00001e, 0x000006, 0x000000, 0x000002, + 0x00000e, 0x00007f, 0x0000fb, 0x0001f3, 0x0001f0, 0x0007c6, 0x001f1f }, + { 13, 12, 10, 9, 8, 7, 5, 3, 1, 2, + 4, 7, 8, 9, 9, 11, 13 } + }, + { /* dt */ + { 0x007dfe, 0x003efe, 0x000fbe, 0x0003ee, 0x0000fa, 0x00007e, 0x00001e, 0x000006, 0x000000, 0x000002, + 0x00000e, 0x00007f, 0x00007c, 0x0001f6, 0x0007de, 0x001f7e, 0x007dff }, + { 15, 14, 12, 10, 8, 7, 5, 3, 1, 2, + 4, 7, 7, 9, 11, 13, 15 } + } + }, /* End Beta Fine */ + { /* Beta Coarse */ + { /* df0 */ + { 0x000000, 0x000002, 0x000006, 0x00000e, 0x00000f }, + { 1, 2, 3, 4, 4 } + }, + { /* df */ + { 0x0000fe, 0x00003e, 0x00000e, 0x000006, 0x000000, 0x000002, 0x00001e, 0x00007e, 0x0000ff }, + { 8, 6, 4, 3, 1, 2, 5, 7, 8 } + }, + { /* dt */ + { 0x0000fe, 0x00007e, 0x00001e, 0x000006, 0x000000, 0x000002, 0x00000e, 0x00003e, 0x0000ff }, + { 8, 7, 5, 3, 1, 2, 4, 6, 8 } + } + } /* End Beta Coarse */ +}; + +const int16_t mc_paramupmix_fb_remix_order[4] = {0, 1, 2, 3}; + +/*----------------------------------------------------------------------------------* + * ParamMC ROM tables + *----------------------------------------------------------------------------------*/ +const float param_mc_ild_diff_threshold[20] = { 8.0f, 8.0f, 10.0f, 20.0f, + 20.0f, 20.0f, 20.0f, 20.0f, + 20.0f, 20.0f, 20.0f, 20.0f }; + +/* clang-format on */ diff --git a/lib_enc/ivas_rom_enc.h b/lib_enc/ivas_rom_enc.h new file mode 100644 index 0000000000000000000000000000000000000000..c0c42f724639e4f9ef25e180c69be249d2cce570 --- /dev/null +++ b/lib_enc/ivas_rom_enc.h @@ -0,0 +1,136 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#ifndef IVAS_ROM_ENC_H +#define IVAS_ROM_ENC_H + +#include +#include "options.h" +#include "cnst.h" +#include "ivas_cnst.h" + + +/*----------------------------------------------------------------------------------* + * Stereo classifiers + *----------------------------------------------------------------------------------*/ + +extern const int16_t unclr_isel_td[]; +extern const float unclr_mean_td[]; +extern const float unclr_scale_td[]; +extern const float unclr_coef_td[]; + +extern const int16_t xtalk_isel_td[]; +extern const float xtalk_mean_td[]; +extern const float xtalk_scale_td[]; +extern const float xtalk_coef_td[]; + +extern const int16_t xtalk_isel_dft[]; +extern const float xtalk_mean_dft[]; +extern const float xtalk_scale_dft[]; +extern const float xtalk_coef_dft[]; + +extern const int16_t unclr_isel_dft[]; +extern const float unclr_mean_dft[]; +extern const float unclr_scale_dft[]; +extern const float unclr_coef_dft[]; + +/*----------------------------------------------------------------------------------* + * Stereo IC-BWE ROM tables + *----------------------------------------------------------------------------------*/ + +extern const float icbwe_thr_TDM[]; +extern const float icbwe_thr_DFT[]; +extern const float icbwe_regressionValuesTDM[]; +extern const float icbwe_regressionValuesDFT[]; + +/*----------------------------------------------------------------------------------* + * DFT stereo ROM tables + *----------------------------------------------------------------------------------*/ + +extern const int16_t itd_vad_band_tbl[]; +extern const int16_t ild_q[]; + +extern const float Wn_table[]; + +extern const float win_ana_8k[STEREO_DFT_OVL_8k]; +extern const float win_ana_12k8[STEREO_DFT_OVL_12k8]; +extern const float win_ana_16k[STEREO_DFT_OVL_16k]; +extern const float win_ana_32k[STEREO_DFT_OVL_32k]; +extern const float win_ana_48k[STEREO_DFT_OVL_MAX]; + +extern const float win_syn_8k[STEREO_DFT_OVL_8k]; +extern const float win_syn_12k8[STEREO_DFT_OVL_12k8]; +extern const float win_syn_16k[STEREO_DFT_OVL_16k]; +extern const float win_syn_32k[STEREO_DFT_OVL_32k]; +extern const float win_syn_48k[STEREO_DFT_OVL_MAX]; + +extern const float win_mdct_8k[STEREO_DFT_OVL_8k]; + +/*----------------------------------------------------------------------------------* + * Range Coder ROM tables + *----------------------------------------------------------------------------------*/ + +extern const float ari_bit_estimate_s17_LC[RANGE_N_CONTEXT][RANGE_N_SYMBOLS]; + +/*----------------------------------------------------------------------------------* + * ECLVQ Stereo ROM tables + *----------------------------------------------------------------------------------*/ + +extern const int16_t log2_1px_table[65]; +extern const float log2TB[ECSQ_log2TB_SIZE]; +extern const float ECSQ_log2_fact[1 + ECSQ_SEGMENT_SIZE]; +extern const uint16_t ECSQ_tab_param[ECSQ_CONFIG_COUNT][1 + ECSQ_PARAM_COUNT]; +extern const uint16_t *const ECSQ_tab_abs_lsbs[1 + 4]; +extern const uint16_t ECSQ_tab_vals[ECSQ_PARAM_COUNT - 1][1 + ECSQ_TAB_VALS_SIZE]; + + +/*----------------------------------------------------------------------------------* + * Stereo downmix to EVS ROM tables + *----------------------------------------------------------------------------------*/ + +extern const float Stereo_dmx_s_wnd_coef_16k[L_FRAME16k >> 4]; +extern const float Stereo_dmx_s_wnd_coef_32k[L_FRAME32k >> 4]; +extern const float Stereo_dmx_s_wnd_coef_48k[L_FRAME48k >> 4]; +extern const float Stereo_dmx_wnd_coef_32k[L_FRAME32k]; +extern const float Stereo_dmx_wnd_coef_48k[L_FRAME48k]; + +extern const HUFF_TABLE huff_alpha_table[2]; +extern const HUFF_TABLE huff_beta_table[2]; +extern const int16_t mc_paramupmix_fb_remix_order[4]; + +/*----------------------------------------------------------------------------------* + * ParamMC ROM tables + *----------------------------------------------------------------------------------*/ +extern const float param_mc_ild_diff_threshold[20]; + + +#endif diff --git a/lib_enc/ivas_sba_enc.c b/lib_enc/ivas_sba_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..d81b73c6fe945770f5caf8a2865664569097910d --- /dev/null +++ b/lib_enc/ivas_sba_enc.c @@ -0,0 +1,251 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include +#include "options.h" +#include "cnst.h" +#include "ivas_cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_rom_com.h" +#include "wmc_auto.h" + + +/*-------------------------------------------------------------------* + * ivas_sba_getTCs() + * + * Get TCs from Ambisonics signal in ACN + *-------------------------------------------------------------------*/ + +void ivas_sba_getTCs( + float *sba_data[], /* i : SBA signals */ + Encoder_Struct *st_ivas, /* i/o: Encoder struct */ + const int16_t input_frame /* i : frame length */ +) +{ + if ( st_ivas->hEncoderConfig->sba_planar ) + { + ivas_sba_zero_vert_comp( sba_data, st_ivas->sba_analysis_order, st_ivas->hEncoderConfig->sba_planar, input_frame ); + } + + st_ivas->nchan_transport = ivas_get_sba_num_TCs( st_ivas->hEncoderConfig->ivas_total_brate, st_ivas->sba_analysis_order ); + + if ( st_ivas->nchan_transport >= 3 ) + { + /*convert WYZX downmix to WYXZ*/ + int16_t i = 0; + float temp; + for ( i = 0; i < input_frame; i++ ) + { + temp = sba_data[2][i]; + sba_data[2][i] = sba_data[3][i]; + sba_data[3][i] = temp; + } + } + + + return; +} + +/*-------------------------------------------------------------------* + * ivas_sba_enc_reconfigure() + * + * Reconfigure IVAS SBA encoder + *-------------------------------------------------------------------*/ + +ivas_error ivas_sba_enc_reconfigure( + Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ +) +{ + int16_t n, nSCE_old, nCPE_old, nchan_transport_old; + int32_t ivas_total_brate; + ivas_error error; + ENCODER_CONFIG_HANDLE hEncoderConfig; + + error = IVAS_ERR_OK; + hEncoderConfig = st_ivas->hEncoderConfig; + ivas_total_brate = hEncoderConfig->ivas_total_brate; + + if ( ivas_total_brate != hEncoderConfig->last_ivas_total_brate ) + { + DIRAC_ENC_HANDLE hDirAC = st_ivas->hDirAC; + SPAR_ENC_HANDLE hSpar; + int16_t analysis_order_old; + int16_t spar_reconfig_flag; + int16_t nbands_old; + int16_t ndir_old; + + spar_reconfig_flag = 0; + nchan_transport_old = st_ivas->nchan_transport; + nCPE_old = st_ivas->nCPE; + nSCE_old = st_ivas->nSCE; + st_ivas->sba_analysis_order = ivas_sba_get_analysis_order( ivas_total_brate, hEncoderConfig->sba_order ); + analysis_order_old = ivas_sba_get_analysis_order( hEncoderConfig->last_ivas_total_brate, hEncoderConfig->sba_order ); + nbands_old = st_ivas->hQMetaData->q_direction->cfg.nbands; + ndir_old = st_ivas->hQMetaData->no_directions; + + if ( analysis_order_old != st_ivas->sba_analysis_order ) + { + int16_t i, n_old; + float **old_mem_hp20_in; + + n_old = ( analysis_order_old + 1 ) * ( analysis_order_old + 1 ); + n = ( st_ivas->sba_analysis_order + 1 ) * ( st_ivas->sba_analysis_order + 1 ); + + if ( n > n_old ) + { + /* save old mem_hp_20 pointer */ + old_mem_hp20_in = st_ivas->mem_hp20_in; + st_ivas->mem_hp20_in = NULL; + + if ( ( st_ivas->mem_hp20_in = (float **) malloc( n * sizeof( float * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HP20 filter memory\n" ) ); + } + + for ( i = 0; i < n_old; i++ ) + { + st_ivas->mem_hp20_in[i] = old_mem_hp20_in[i]; + old_mem_hp20_in[i] = NULL; + } + /* create additional hp20 memories */ + for ( ; i < n; i++ ) + { + if ( ( st_ivas->mem_hp20_in[i] = (float *) malloc( L_HP20_MEM * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HP20 filter memory\n" ) ); + } + + set_f( st_ivas->mem_hp20_in[i], 0.0f, L_HP20_MEM ); + } + + free( old_mem_hp20_in ); + old_mem_hp20_in = NULL; + } + else if ( n < n_old ) + { + /* save old mem_hp_20 pointer */ + old_mem_hp20_in = st_ivas->mem_hp20_in; + st_ivas->mem_hp20_in = NULL; + + if ( ( st_ivas->mem_hp20_in = (float **) malloc( n * sizeof( float * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HP20 filter memory\n" ) ); + } + + for ( i = 0; i < n; i++ ) + { + st_ivas->mem_hp20_in[i] = old_mem_hp20_in[i]; + old_mem_hp20_in[i] = NULL; + } + /* remove superfluous hp20 memories */ + for ( ; i < n_old; i++ ) + { + free( old_mem_hp20_in[i] ); + old_mem_hp20_in[i] = NULL; + } + + free( old_mem_hp20_in ); + old_mem_hp20_in = NULL; + } + } + + ivas_spar_config( ivas_total_brate, min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ), &st_ivas->nchan_transport, &st_ivas->nSCE, &st_ivas->nCPE, &st_ivas->hSpar->core_nominal_brate, -1 ); + + hSpar = st_ivas->hSpar; + + if ( st_ivas->nchan_transport == 1 ) + { + hEncoderConfig->element_mode_init = IVAS_SCE; + } + else + { + hEncoderConfig->element_mode_init = IVAS_CPE_MDCT; + } + + if ( nchan_transport_old != st_ivas->nchan_transport || ( ivas_total_brate < IVAS_512k && hEncoderConfig->last_ivas_total_brate >= IVAS_512k ) || ( ivas_total_brate >= IVAS_512k && hEncoderConfig->last_ivas_total_brate < IVAS_512k ) ) + { + /* FB mixer handle */ + if ( hDirAC->hFbMixer != NULL ) + { + ivas_FB_mixer_close( &( hDirAC->hFbMixer ), hEncoderConfig->input_Fs, 0 ); + hDirAC->hFbMixer = NULL; + } + spar_reconfig_flag = 1; + ivas_spar_enc_close( &( st_ivas->hSpar ), hEncoderConfig->input_Fs, hEncoderConfig->nchan_inp, spar_reconfig_flag ); + + if ( ( error = ivas_spar_enc_open( st_ivas, spar_reconfig_flag ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + st_ivas->hSpar->spar_reconfig_flag = spar_reconfig_flag; + + if ( ( error = ivas_dirac_enc_reconfigure( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( st_ivas->hQMetaData->q_direction->cfg.nbands != nbands_old || st_ivas->hQMetaData->no_directions != ndir_old ) + { + int16_t dir, j, i; + IVAS_QDIRECTION *q_direction = st_ivas->hQMetaData->q_direction; + for ( dir = 0; dir < st_ivas->hQMetaData->no_directions; dir++ ) + { + for ( j = 0; j < q_direction[dir].cfg.nbands; j++ ) + { + for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + { + q_direction[dir].band_data[j].energy_ratio_index[i] = 0; + q_direction[dir].band_data[j].energy_ratio_index_mod[i] = 0; + } + } + } + } + hSpar->enc_param_start_band = hDirAC->hConfig->enc_param_start_band; + + /*-----------------------------------------------------------------* + * Allocate, initialize, and configure SCE/CPE/MCT handles + *-----------------------------------------------------------------*/ + + if ( ( error = ivas_corecoder_enc_reconfig( st_ivas, nSCE_old, nCPE_old, nchan_transport_old, ivas_total_brate / st_ivas->nchan_transport, ( ivas_total_brate / st_ivas->nchan_transport ) * CPE_CHANNELS, MC_MODE_NONE ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + return error; +} diff --git a/lib_enc/ivas_sce_enc.c b/lib_enc/ivas_sce_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..082b0ba34bba5ff103aecc62dff6a61e76b5b245 --- /dev/null +++ b/lib_enc/ivas_sce_enc.c @@ -0,0 +1,386 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "cnst.h" +#include "ivas_cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_rom_com.h" +#include "wmc_auto.h" + + +/*-------------------------------------------------------------------* + * ivas_sce_enc() + * + * Single Channel Element (SCE) encoding routine + *-------------------------------------------------------------------*/ + +ivas_error ivas_sce_enc( + Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ + const int16_t sce_id, /* i : SCE # identifier */ + const float data_f[], /* i : input signal for single channel */ + const int16_t input_frame, /* i : input frame length per channel */ + const int16_t nb_bits_metadata /* i : number of metadata bits */ +) +{ + float old_inp_12k8[1][L_INP_12k8]; /* buffer of input signal @ 12k8 */ + float old_inp_16k[1][L_INP]; /* buffer of input signal @ 16kHz */ + float ener[1]; /* residual energy from Levinson-Durbin */ + float relE[1]; /* frame relative energy */ + float A[1][NB_SUBFR16k * ( M + 1 )]; /* A(z) unquantized for subframes */ + float Aw[1][NB_SUBFR16k * ( M + 1 )]; /* weighted A(z) unquantized for subframes */ + float epsP[1][M + 1]; /* LP prediction errors */ + float lsp_new[1][M]; /* LSPs at the end of the frame */ + float lsp_mid[1][M]; /* ISPs in the middle of the frame */ + int16_t vad_hover_flag[1]; /* VAD hangover flag */ + int16_t attack_flag[1]; /* attack flag (GSC or TC) */ + float realBuffer[1][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; /* real buffer */ + float imagBuffer[1][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; /* imag buffer */ + float old_wsp[1][L_WSP]; /* old weighted input signal */ + float pitch_fr[1][NB_SUBFR]; /* fractional pitch values */ + float voicing_fr[1][NB_SUBFR]; /* fractional pitch gains */ + int16_t loc_harm[1]; /* harmonicity flag */ + float cor_map_sum[1]; /* speech/music clasif. parameter */ + int16_t vad_flag_dtx[1]; /* HE-SAD flag with additional DTX HO */ + float enerBuffer[1][CLDFB_NO_CHANNELS_MAX]; /* energy buffer */ + float currFlatness[1]; /* flatness parameter */ + float fft_buff[1][2 * L_FFT]; /* FFT buffer */ + float fr_bands[1][2 * NB_BANDS]; /* energy in frequency bands */ + float Etot_LR[1]; /* total energy */ + float lf_E[1][2 * VOIC_BINS]; /* per bin spectrum energy in lf */ + int16_t localVAD_HE_SAD[1]; /* local HE SAD */ + SCE_ENC_HANDLE hSCE; + Encoder_State *st; + IVAS_FORMAT ivas_format; + ivas_error error; + int16_t flag_16k_smc; + + push_wmops( "ivas_sce_enc" ); + + error = IVAS_ERR_OK; + + hSCE = st_ivas->hSCE[sce_id]; + st = hSCE->hCoreCoder[0]; + ivas_format = st_ivas->hEncoderConfig->ivas_format; + + /*------------------------------------------------------------------* + * Initialization - general + *-----------------------------------------------------------------*/ + + mvr2r( data_f, st->input, input_frame ); + + st->element_mode = IVAS_SCE; + + /*------------------------------------------------------------------* + * SCE initialization - core coder + *-----------------------------------------------------------------*/ + + st->idchan = 0; + st->core = -1; + st->core_brate = -1; /* updated in dtx() */ + st->max_bwidth = st_ivas->hEncoderConfig->max_bwidth; + st->input_bwidth = st->last_input_bwidth; /* updated in BWD */ + st->bwidth = st->last_bwidth; /* updated in BWD */ + st->rate_switching_reset = 0; + + /*---------------------------------------------------------------* + * Time Domain Transient Detector + *---------------------------------------------------------------*/ + + if ( ivas_format != MC_FORMAT || st_ivas->mc_mode != MC_MODE_PARAMMC ) + { + RunTransientDetection( st->input, input_frame, st->hTranDet ); + } + + currFlatness[0] = GetTCXAvgTemporalFlatnessMeasure( st->hTranDet, NSUBBLOCKS, 0 ); + + /*----------------------------------------------------------------* + * Configuration of core encoder + *----------------------------------------------------------------*/ + + /* Force to MODE1 in IVAS */ + st->codec_mode = MODE1; + + /* set "bits_frame_nominal" */ + if ( st_ivas->hQMetaData != NULL && st_ivas->hSpar == NULL ) + { + if ( ( ( st_ivas->mc_mode == MC_MODE_MCMASA ) && ( st_ivas->hEncoderConfig->ivas_total_brate >= MCMASA_SEPARATE_BRATE ) ) || ( st_ivas->ism_mode >= ISM_MASA_MODE_MASA_ONE_OBJ ) ) + { + st->bits_frame_nominal = (int16_t) ( hSCE->element_brate / FRAMES_PER_SEC ); + } + else + { + st->bits_frame_nominal = st_ivas->hQMetaData->bits_frame_nominal; + } + } + else if ( st_ivas->hSpar != NULL ) + { + st->bits_frame_nominal = (int16_t) ( st_ivas->hSpar->core_nominal_brate / FRAMES_PER_SEC ); + } + else + { + st->bits_frame_nominal = (int16_t) ( ( hSCE->element_brate / FRAMES_PER_SEC ) - ISM_NB_BITS_METADATA_NOMINAL ); + } + + /* set "total_brate" */ + st->total_brate = hSCE->element_brate - nb_bits_metadata * FRAMES_PER_SEC; + + /* set flag for sampling rate of OL S/M classifier */ + flag_16k_smc = 0; + if ( st_ivas->hEncoderConfig->ivas_format == SBA_FORMAT && ( st_ivas->hEncoderConfig->ivas_total_brate == IVAS_24k4 || st_ivas->hEncoderConfig->ivas_total_brate == IVAS_32k ) && hSCE->element_brate == hSCE->last_element_brate ) + { + flag_16k_smc = 1; + } + + + /*----------------------------------------------------------------* + * Front Pre-processing + *----------------------------------------------------------------*/ + + error = pre_proc_front_ivas( hSCE, NULL, hSCE->element_brate, nb_bits_metadata, input_frame, 0, old_inp_12k8[0], old_inp_16k[0], + &ener[0], &relE[0], A[0], Aw[0], epsP[0], lsp_new[0], lsp_mid[0], &vad_hover_flag[0], &attack_flag[0], + realBuffer[0], imagBuffer[0], old_wsp[0], pitch_fr[0], voicing_fr[0], &loc_harm[0], &cor_map_sum[0], &vad_flag_dtx[0], enerBuffer[0], + fft_buff[0], A[0], lsp_new[0], currFlatness[0], 0, fr_bands, Etot_LR, lf_E, localVAD_HE_SAD, NULL, flag_16k_smc, + st_ivas->hSpar != NULL ? st_ivas->hSpar->front_vad_flag : 0, st_ivas->hSpar != NULL ? st_ivas->hSpar->force_front_vad : 0, st_ivas->hSpar != NULL ? st_ivas->hSpar->front_vad_dtx_flag : 0, ivas_format, st_ivas->hEncoderConfig->ivas_total_brate ); + if ( error != IVAS_ERR_OK ) + { + return error; + } + + /* sanity check -> DTX not supported for more than one SCEs/CPEs */ + if ( st_ivas->nSCE + st_ivas->nCPE > 1 ) + { + if ( st->core_brate == SID_2k40 || st->core_brate == FRAME_NO_DATA ) + { + st->core_brate = -1; + st->total_brate = hSCE->element_brate - nb_bits_metadata * FRAMES_PER_SEC; + } + } + + /*----------------------------------------------------------------* + * Reset metadata + *----------------------------------------------------------------*/ + + reset_metadata_spatial( ivas_format, hSCE->hMetaData, hSCE->element_brate, &st->total_brate, st->core_brate, nb_bits_metadata ); + + /*----------------------------------------------------------------* + * Combined format coding: get the ISM importance and the bit-rate + *----------------------------------------------------------------*/ + + if ( ivas_format == MASA_ISM_FORMAT && st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) + { + ivas_set_ism_importance_interformat( hSCE->element_brate, 1, st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->hMasa->data.hOmasaData->lp_noise_CPE, &st_ivas->hIsmMetaData[0]->ism_imp ); + + st->total_brate = ivas_interformat_brate( ISM_MASA_MODE_PARAM_ONE_OBJ, 1, hSCE->element_brate, st_ivas->hIsmMetaData[0]->ism_imp, 0 ) - nb_bits_metadata * FRAMES_PER_SEC; + } + + /*----------------------------------------------------------------* + * Write IVAS format signaling in SID frames + *----------------------------------------------------------------*/ + + if ( st->core_brate == SID_2k40 ) + { + ivas_write_format_sid( ivas_format, IVAS_SCE, st->hBstr ); + } + + /*----------------------------------------------------------------* + * Core codec configuration + *----------------------------------------------------------------*/ + + /* IGF reconfiguration */ + if ( hSCE->last_element_brate != hSCE->element_brate || st->last_bwidth != st->bwidth ) + { + int16_t igf; + igf = getIgfPresent( st->element_mode, st->bits_frame_nominal * FRAMES_PER_SEC, st->max_bwidth, st->rf_mode ); + if ( ( error = IGF_Reconfig( &st->hIGFEnc, igf, 0, st->bits_frame_nominal * FRAMES_PER_SEC, st->max_bwidth, st->element_mode, st->rf_mode ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* set ACELP@12k8 / ACELP@16k flag for flexible ACELP core */ + if ( st->core_brate == SID_2k40 || st->core_brate == FRAME_NO_DATA ) + { + st->flag_ACELP16k = set_ACELP_flag( IVAS_SCE, hSCE->element_brate, st->core_brate, 0, 0, -1, -1 ); + } + else if ( st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ && st->low_rate_mode ) + { + st->flag_ACELP16k = 0; + } + else + { + st->flag_ACELP16k = set_ACELP_flag( IVAS_SCE, hSCE->element_brate, st->total_brate, 0, 0, -1, -1 ); + } + + /* modify the coder_type depending on the total_brate per channel */ + coder_type_modif( st, relE[0] ); + + /*----------------------------------------------------------------* + * Encoder + *----------------------------------------------------------------*/ + + if ( ( error = ivas_core_enc( hSCE, NULL, NULL, 1, old_inp_12k8, old_inp_16k, ener, A, Aw, epsP, lsp_new, lsp_mid, vad_hover_flag, attack_flag, realBuffer, imagBuffer, old_wsp, loc_harm, cor_map_sum, vad_flag_dtx, enerBuffer, fft_buff, 0, ivas_format, flag_16k_smc ) ) != IVAS_ERR_OK ) + { + return error; + } + + /*----------------------------------------------------------------* + * Common updates + *----------------------------------------------------------------*/ + + /* update input samples buffer */ + mvr2r( st->input, st->old_input_signal, input_frame ); + + hSCE->last_element_brate = hSCE->element_brate; + + /* Store previous attack detection flag */ + st->hTranDet->transientDetector.prev_bIsAttackPresent = st->hTranDet->transientDetector.bIsAttackPresent; + + + pop_wmops(); + + return error; +} + + +/*------------------------------------------------------------------------- + * create_sce_enc() + * + * Create, allocate and initialize IVAS encoder SCE handle + *-------------------------------------------------------------------------*/ + +ivas_error create_sce_enc( + Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ + const int16_t sce_id, /* i : SCE # identifier */ + const int32_t element_brate /* i : element bitrate */ +) +{ + SCE_ENC_HANDLE hSCE; + Encoder_State *st; + ivas_error error; + + error = IVAS_ERR_OK; + + /*-----------------------------------------------------------------* + * Allocate SCE handle + *-----------------------------------------------------------------*/ + + if ( ( hSCE = (SCE_ENC_HANDLE) malloc( sizeof( SCE_ENC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SCE\n" ) ); + } + + /*-----------------------------------------------------------------* + * Initialization - general parameters + *-----------------------------------------------------------------*/ + + hSCE->sce_id = sce_id; + hSCE->element_brate = element_brate; + hSCE->last_element_brate = hSCE->element_brate; + + /*-----------------------------------------------------------------* + * Metadata: allocate and initialize + *-----------------------------------------------------------------*/ + + if ( st_ivas->hEncoderConfig->ivas_format != MONO_FORMAT && sce_id == ( st_ivas->nSCE - 1 ) ) + { + if ( ( error = ivas_initialize_MD_bstr_enc( &( hSCE->hMetaData ), st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + hSCE->hMetaData = NULL; + } + + /*-----------------------------------------------------------------* + * Core Coder, 1 instance: allocate and initialize + *-----------------------------------------------------------------*/ + + if ( ( st = (ENC_CORE_HANDLE) malloc( sizeof( Encoder_State ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for CoreCoder structure\n" ) ); + } + + copy_encoder_config( st_ivas, st, 1 ); + + if ( st_ivas->hEncoderConfig->ivas_format == MASA_ISM_FORMAT && ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_DISC ) ) + { + st->element_mode = IVAS_SCE; + } + + st->total_brate = hSCE->element_brate; /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */ + st->mct_chan_mode = MCT_CHAN_MODE_REGULAR; + + if ( ( error = init_encoder( st, st_ivas, 0, st_ivas->hEncoderConfig->var_SID_rate_flag, st_ivas->hEncoderConfig->interval_SID, 0, st_ivas->ism_mode, hSCE->element_brate ) ) != IVAS_ERR_OK ) + { + return error; + } + + hSCE->hCoreCoder[0] = st; + + st_ivas->hSCE[sce_id] = hSCE; + + return error; +} + + +/*------------------------------------------------------------------------- + * destroy_sce_enc() + * + * Destroy and deallocate IVAS encoder SCE handle + *-------------------------------------------------------------------------*/ + +void destroy_sce_enc( + SCE_ENC_HANDLE hSCE /* i/o: SCE encoder structure */ +) +{ + Encoder_State *st; + + st = hSCE->hCoreCoder[0]; + + if ( st != NULL ) + { + destroy_core_enc( st ); + st = NULL; + } + + ivas_destroy_MD_bstr_enc( &( hSCE->hMetaData ) ); + + free( hSCE ); + + return; +} diff --git a/lib_enc/ivas_sns_enc.c b/lib_enc/ivas_sns_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..5b455060ab91ca8715dbc30b50ab6aabde5d5c38 --- /dev/null +++ b/lib_enc/ivas_sns_enc.c @@ -0,0 +1,495 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "ivas_prot.h" +#include "rom_com.h" +#include "ivas_rom_com.h" +#include "ivas_cnst.h" +#include "wmc_auto.h" + + +/*------------------------------------------------------------------- + * sns_1st_cod() + * + * + *-------------------------------------------------------------------*/ + +/* r : codebook index */ +static int16_t sns_1st_cod( + const float *sns, /* i : vector to quantize */ + const int16_t L_frame, + const int16_t core, + float *snsq /* o : quantized sns */ +) +{ + int16_t index; + const int16_t split_len = M / 2; + const int16_t *means; + const float means_fix2float = 1.f / powf( 2, SNS_MEANS_BITS_4_FRAC ); + + /* remove means */ + means = NULL; + switch ( L_frame ) + { + case L_FRAME16k: + means = &sns_1st_means_16k[core - 1][0]; + break; + case L_FRAME25_6k: + means = &sns_1st_means_25k6[core - 1][0]; + break; + case L_FRAME32k: + means = &sns_1st_means_32k[core - 1][0]; + break; + default: + assert( !"illegal frame length in sns_1st_cod" ); + } + + for ( int16_t i = 0; i < M; ++i ) + { + snsq[i] = sns[i] - means[i] * means_fix2float; + } + + index = 0; + for ( int16_t split = 0; split < 2; ++split ) + { + const int16_t *cdbk_ptr; + int16_t j0, j1, index_split; + float dist_min; + const float cdbk_fix2float = 1.f / powf( 2, SNS_CDBKS_BITS_4_FRAC ); + const int16_t *const cdbk = &sns_1st_cdbk[split][core - 1][0]; + + j0 = split * split_len; + j1 = j0 + split_len; + + cdbk_ptr = cdbk; + dist_min = 1.0e30f; + index_split = 0; + for ( int16_t i = 0; i < 32; ++i ) + { + float dist; + + dist = 0.f; + for ( int16_t j = j0; j < j1; ++j ) + { + float tmp; + + tmp = snsq[j] - ( *cdbk_ptr++ ) * cdbk_fix2float; + dist += tmp * tmp; + } + + if ( dist < dist_min ) + { + dist_min = dist; + index_split = i; + } + } + + /* set quantized vector */ + cdbk_ptr = &cdbk[index_split * split_len]; + for ( int16_t j = j0; j < j1; ++j ) + { + snsq[j] = ( *cdbk_ptr++ ) * cdbk_fix2float + means[j] * means_fix2float; + } + + /* for second split shift by five bits to store both indices as one 10 bit value */ + if ( split == 1 ) + { + index_split <<= 5; + } + + index += index_split; + } + + return index; +} + + +/*------------------------------------------------------------------- + * sns_2st_cod() + * + * + *-------------------------------------------------------------------*/ + +/* r : number of allocated bits */ +static int16_t sns_2st_cod( + const float *sns, /* i : normalized vector to quantize */ + float *snsq, /* i/o: i:1st stage o:1st+2nd stage */ + int16_t *indx /* o : index[] (4 bits per words) */ +) +{ + int16_t i, nbits; + float x[M]; + int16_t nq, xq[M]; + float scale = 1.0f / 2.5f; + + for ( i = 0; i < M; i++ ) + { + x[i] = ( sns[i] - snsq[i] ) / scale; + } + + /* quantize */ + AVQ_cod_lpc( x, xq, indx, 2 ); + + for ( i = 0; i < M; i++ ) + { + snsq[i] += scale * (float) xq[i]; + } + + /* total number of bits using entropic code to index the quantizer number */ + nbits = 0; + + for ( i = 0; i < 2; i++ ) + { + nq = indx[i]; + nbits += ( 2 + ( nq * 4 ) ); /* 2 bits to specify Q2,Q3,Q4,ext */ + + if ( nq > 6 ) + { + nbits += nq - 3; /* unary code (Q7=1110, ...) */ + } + else if ( nq > 4 ) + { + nbits += nq - 4; /* Q5=0, Q6=10 */ + } + else if ( nq == 0 ) + { + nbits += 3; /* Q0=110 */ + } + } + + return ( nbits ); +} + + +/*------------------------------------------------------------------- + * sns_avq_cod() + * + * Stereo noise-shaping AVQ encoder for 1 channel + *-------------------------------------------------------------------*/ + +void sns_avq_cod( + const float *sns, /* i : Input sns vectors */ + const float *snsmid, /* i : Input mid-sns vectors */ + float *sns_q, /* o : Quantized LFS vectors */ + float *snsmid_q, /* o : Quantized mid-LFS vectors */ + int16_t *index, /* o : Quantization indices */ + const int16_t core, /* i : core */ + const int16_t L_frame, + const int16_t low_brate_mode /* i : flag low bit operating mode */ +) +{ + int16_t i; + float snsmid_q0[M]; + int16_t indxt[256], nbits, nbt, nit; + + index[0] = sns_1st_cod( sns, L_frame, core, sns_q ); + nit = 1 + 2; + if ( !low_brate_mode ) + { + nbt = sns_2st_cod( sns, sns_q, &index[1] ); + nit += index[1] + index[2]; + } + else + { + index[1] = SNS_LOW_BR_MODE; + index[2] = 0; + } + + index += nit; + nit = 0; + *index = 0; + + if ( core == TCX_10_CORE ) + { + index++; + + index[0] = sns_1st_cod( snsmid, L_frame, core, snsmid_q ); + nit = 1 + 2; + if ( !low_brate_mode ) + { + nbits = sns_2st_cod( snsmid, snsmid_q, &index[1] ); + nit += index[1] + index[2]; + } + else + { + index[1] = SNS_LOW_BR_MODE; + index[2] = 0; + nbits = 0; + } + + + nbt = 10 + nbits; + + if ( !low_brate_mode ) + { + for ( i = 0; i < M; i++ ) + { + snsmid_q0[i] = sns_q[i]; + } + nbits = sns_2st_cod( snsmid, snsmid_q0, indxt ); + if ( nbits < nbt ) + { + nbt = nbits; + nit = 2 + indxt[0] + indxt[1]; + index[-1] = 1; + + for ( i = 0; i < M; i++ ) + { + snsmid_q[i] = snsmid_q0[i]; + } + + for ( i = 0; i < nit; i++ ) + { + index[i] = indxt[i]; + } + } + } + index += nit; + } + + return; +} + + +/*------------------------------------------------------------------- + * sns_avq_cod_stereo() + * + * Stereo noise-shaping AVQ encoder for 2 channels + *-------------------------------------------------------------------*/ + +void sns_avq_cod_stereo( + const float *snsl, /* i : Input sns vector (left channel) */ + const float *snsr, /* i : Input sns vector (right channel) */ + const int16_t L_frame, + float *snsl_q, /* o : Quantized sns vector (left channel) */ + float *snsr_q, /* o : Quantized sns vector (right channel) */ + int16_t *indexl, /* o : Quantization indices (left channel) */ + int16_t *indexr /* o : Quantization indices (right channel) */ +) +{ + int16_t i, flag_zero; + float mid[M], side[M], mid_q[M], side_q[M], ener_side; + + /* Compute side */ + ener_side = 0.f; + for ( i = 0; i < M; i++ ) + { + side[i] = snsl[i] - snsr[i]; + ener_side += side[i] * side[i]; + } + + if ( ener_side < 12.f ) + { + /* MS coding */ + *indexl++ = 2; + *indexr++ = 3; + + /* Compute mid */ + for ( i = 0; i < M; i++ ) + { + mid[i] = ( snsl[i] + snsr[i] ) * 0.5f; + } + + /* Quantize mid */ + indexl[0] = sns_1st_cod( mid, L_frame, TCX_20_CORE, mid_q ); + sns_2st_cod( mid, mid_q, &indexl[1] ); + + /* Quantize side */ + indexr[0] = -1; + for ( i = 0; i < M; i++ ) + { + side_q[i] = 0.f; + } + sns_2st_cod( side, side_q, &indexr[1] ); + + /* Detect zero side */ + flag_zero = 1; + for ( i = 0; i < M; i++ ) + { + if ( side_q[i] != 0 ) + { + flag_zero = 0; + break; + } + } + if ( flag_zero ) + { + indexr[0] = -2; + } + + /* Go back to LR */ + for ( i = 0; i < M; i++ ) + { + snsl_q[i] = mid_q[i] + side_q[i] * 0.5f; + snsr_q[i] = mid_q[i] - side_q[i] * 0.5f; + } + } + else + { + /* LR coding */ + *indexl++ = 0; + *indexr++ = 1; + + /* Quantize left */ + indexl[0] = sns_1st_cod( snsl, L_frame, TCX_20_CORE, snsl_q ); + sns_2st_cod( snsl, snsl_q, &indexl[1] ); + + /* Quantize right */ + indexr[0] = sns_1st_cod( snsr, L_frame, TCX_20_CORE, snsr_q ); + sns_2st_cod( snsr, snsr_q, &indexr[1] ); + } + + return; +} + +int16_t quantize_sns( + float sns_in[CPE_CHANNELS][NB_DIV][M], + float snsQ_out[CPE_CHANNELS][NB_DIV][M], + Encoder_State **sts, + int16_t *indices, + int16_t *zero_side_flag, + int16_t *sns_stereo_mode ) +{ + int16_t nSubframes, k, ch, i; + int16_t nbits, idxIndices; + Encoder_State *st; + float weights[M]; + + nbits = 0; + idxIndices = 0; + set_f( weights, 1.0f, M ); + + sns_stereo_mode[0] = SNS_STEREO_MODE_LR; + sns_stereo_mode[1] = SNS_STEREO_MODE_LR; + zero_side_flag[0] = 0; + zero_side_flag[1] = 0; + + /* use snsQ_out as buffer, move input vectors */ + for ( ch = 0; ch < CPE_CHANNELS; ++ch ) + { + nSubframes = ( sts[ch]->core == TCX_20_CORE ) ? 1 : NB_DIV; + for ( k = 0; k < nSubframes; ++k ) + { + mvr2r( sns_in[ch][k], snsQ_out[ch][k], M ); + } + } + + /* stereo mode decision */ + if ( sts[0]->core == sts[1]->core ) + { + nSubframes = ( sts[0]->core == TCX_20_CORE ) ? 1 : NB_DIV; + + for ( k = 0; k < nSubframes; ++k ) + { + float side[M]; + float ener_side; + + v_sub( snsQ_out[0][k], snsQ_out[1][k], side, M ); + ener_side = dotp( side, side, M ); + + sns_stereo_mode[k] = ener_side < 12.f; + zero_side_flag[k] = ener_side < 1.f; + + if ( sns_stereo_mode[k] == SNS_STEREO_MODE_MS ) + { + convertToMS( M, snsQ_out[0][k], snsQ_out[1][k], 0.5f ); + } + } + } + + /* run MSVQ */ + for ( ch = 0; ch < CPE_CHANNELS; ++ch ) + { + st = sts[ch]; + nSubframes = ( st->core == TCX_20_CORE ) ? 1 : NB_DIV; + + for ( k = 0; k < nSubframes; ++k ) + { + const int16_t is_side = ch == 1 && sns_stereo_mode[k] == SNS_STEREO_MODE_MS; + const float *const *cdbks = ( nSubframes == 1 ) ? ivas_sns_cdbks_tcx20 : ivas_sns_cdbks_tcx10; + const int16_t *levels = ( nSubframes == 1 ) ? ivas_sns_cdbks_tcx20_levels : ivas_sns_cdbks_tcx10_levels; + const int16_t *bits = ( nSubframes == 1 ) ? ivas_sns_cdbks_tcx20_bits : ivas_sns_cdbks_tcx10_bits; + int16_t nStages = ( ( nSubframes == 1 ) ? SNS_MSVQ_NSTAGES_TCX20 : SNS_MSVQ_NSTAGES_TCX10 ); + float *snsQ = snsQ_out[ch][k]; + const float *sns_ptr = snsQ_out[ch][k]; + + if ( is_side ) + { + const float *const *side_cdbks = ( st->core == TCX_20_CORE ) ? ivas_sns_cdbks_side_tcx20 : ivas_sns_cdbks_side_tcx10; + const int16_t *side_levels = ( st->core == TCX_20_CORE ) ? ivas_sns_cdbks_side_tcx20_levels : ivas_sns_cdbks_side_tcx10_levels; + + if ( zero_side_flag[k] ) + { + set_zero( snsQ, M ); + continue; + } + + nStages = SNS_MSVQ_NSTAGES_SIDE; + bits = ( st->core == TCX_20_CORE ) ? ivas_sns_cdbks_side_tcx20_bits : ivas_sns_cdbks_side_tcx10_bits; + msvq_enc( side_cdbks, NULL, NULL, snsQ, side_levels, 3, nStages, weights, M, M, 0, NULL, &indices[idxIndices] ); + msvq_dec( side_cdbks, NULL, NULL, nStages, M, M, &indices[idxIndices], 0, NULL, snsQ, NULL ); + } + else + { + msvq_enc( cdbks, NULL, NULL, sns_ptr, levels, 3, nStages, weights, M, M, 0, NULL, &indices[idxIndices] ); + msvq_dec( cdbks, NULL, NULL, nStages, M, M, &indices[idxIndices], 0, NULL, snsQ, NULL ); + } + idxIndices += nStages; + + for ( i = 0; i < nStages; ++i ) + { + nbits += bits[i]; + } + } + } + + /* get back to L/F representation */ + if ( sns_stereo_mode[0] == SNS_STEREO_MODE_MS || sns_stereo_mode[1] == SNS_STEREO_MODE_MS ) + { + nSubframes = ( sts[0]->core == TCX_20_CORE ) ? 1 : NB_DIV; + for ( k = 0; k < nSubframes; ++k ) + { + if ( sns_stereo_mode[k] == SNS_STEREO_MODE_MS ) + { + convertToMS( M, snsQ_out[0][k], snsQ_out[1][k], 1.f ); + } + } + } + + return nbits; +} diff --git a/lib_enc/ivas_spar_encoder.c b/lib_enc/ivas_spar_encoder.c new file mode 100644 index 0000000000000000000000000000000000000000..3e4dce43c093bd7e0831f8d993c5e49b8e35cd31 --- /dev/null +++ b/lib_enc/ivas_spar_encoder.c @@ -0,0 +1,838 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "ivas_prot.h" +#include "ivas_rom_com.h" +#include "ivas_stat_com.h" +#include "prot.h" +#include "math.h" +#include +#include "wmc_auto.h" + + +/*-------------------------------------------------------------------* + * Local function prototypes + *--------------------------------------------------------------------*/ + +static ivas_error ivas_spar_enc_process( Encoder_Struct *st_ivas, const ENCODER_CONFIG_HANDLE hEncoderConfig, BSTR_ENC_HANDLE hMetaData, const int16_t front_vad_flag, float *data_f[] ); + + +/*------------------------------------------------------------------------- + * ivas_spar_enc_open() + * + * Allocate and initialize SPAR encoder handle and sub-handles + *------------------------------------------------------------------------*/ + +ivas_error ivas_spar_enc_open( + Encoder_Struct *st_ivas, /* i/o: IVAS encoder handle */ + const int16_t spar_reconfig_flag /* i : SPAR reconfiguration flag */ +) +{ + SPAR_ENC_HANDLE hSpar; + ENCODER_CONFIG_HANDLE hEncoderConfig; + IVAS_FB_CFG *fb_cfg; + int16_t nchan_inp, nchan_transport, sba_order_internal; + int16_t nchan_fb_in; + int16_t table_idx, active_w_mixing; + int32_t input_Fs, ivas_total_brate; + ivas_error error; + + hEncoderConfig = st_ivas->hEncoderConfig; + error = IVAS_ERR_OK; + hSpar = st_ivas->hSpar; + + if ( !spar_reconfig_flag ) + { + /* SPAR encoder handle */ + if ( ( hSpar = (SPAR_ENC_HANDLE) malloc( sizeof( SPAR_ENC_DATA ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR encoder" ); + } + } + + hSpar->spar_reconfig_flag = 0; + input_Fs = hEncoderConfig->input_Fs; + sba_order_internal = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ); + nchan_inp = ivas_sba_get_nchan_metadata( sba_order_internal, hEncoderConfig->ivas_total_brate ); + assert( nchan_inp <= hEncoderConfig->nchan_inp ); + ivas_total_brate = hEncoderConfig->ivas_total_brate; + + nchan_fb_in = 0; + if ( st_ivas->sba_analysis_order == 1 ) + { + nchan_fb_in = FOA_CHANNELS; + } + else if ( st_ivas->sba_analysis_order == 2 ) + { + nchan_fb_in = 9; + } + else if ( st_ivas->sba_analysis_order == 3 ) + { + nchan_fb_in = 11; + } + else + { + assert( 0 && "sba_order must be 1,2, or 3!" ); + } + + nchan_transport = ivas_get_sba_num_TCs( hEncoderConfig->ivas_total_brate, sba_order_internal ); + + table_idx = ivas_get_spar_table_idx( ivas_total_brate, sba_order_internal, SPAR_CONFIG_BW, NULL, NULL ); + + /* MD handle */ + if ( ( error = ivas_spar_md_enc_open( &( hSpar->hMdEnc ), hEncoderConfig, sba_order_internal ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* set FB config. */ + active_w_mixing = ivas_spar_br_table_consts[table_idx].active_w; + if ( ( error = ivas_fb_set_cfg( &fb_cfg, SBA_FORMAT, nchan_inp, nchan_transport, active_w_mixing, input_Fs, nchan_fb_in ) ) != IVAS_ERR_OK ) + { + return error; + } + fb_cfg->remix_order = remix_order_set[hSpar->hMdEnc->spar_md_cfg.remix_unmix_order]; + + /* FB mixer handle */ + if ( ( error = ivas_FB_mixer_open( &( hSpar->hFbMixer ), input_Fs, fb_cfg, spar_reconfig_flag ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Covariance handle */ + if ( ( error = ivas_spar_covar_enc_open( &( hSpar->hCovEnc ), hSpar->hFbMixer->pFb, input_Fs, nchan_inp, COV_SMOOTH_SPAR, hEncoderConfig->ivas_total_brate ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( !spar_reconfig_flag ) + { + /* Transient Detector handle */ + if ( ( error = ivas_transient_det_open( &( hSpar->hTranDet ), input_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* initialization */ + hSpar->hMdEnc->table_idx = -1; + + /* AGC handle */ + hSpar->AGC_Enable = ivas_agc_enc_get_flag( nchan_transport ); + + hSpar->hAgcEnc = NULL; + if ( hSpar->AGC_Enable ) + { + if ( ( error = ivas_spar_agc_enc_open( &hSpar->hAgcEnc, input_Fs, nchan_inp ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* PCA handle */ + hSpar->hPCA = NULL; + if ( hEncoderConfig->Opt_PCA_ON ) + { + if ( ( hSpar->hPCA = (PCA_ENC_STATE *) malloc( sizeof( PCA_ENC_STATE ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR PCA encoder" ); + } + ivas_pca_enc_init( hSpar->hPCA ); + } + + /* initialization */ + hSpar->hMdEnc->table_idx = -1; + + /*-----------------------------------------------------------------* + * Configuration - set SPAR high-level parameters + *-----------------------------------------------------------------*/ + + ivas_spar_config( hEncoderConfig->ivas_total_brate, min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ), &st_ivas->nchan_transport, &st_ivas->nSCE, &st_ivas->nCPE, &hSpar->core_nominal_brate, -1 ); + + if ( st_ivas->nchan_transport == 1 ) + { + hEncoderConfig->element_mode_init = IVAS_SCE; + } + else + { + hEncoderConfig->element_mode_init = IVAS_CPE_MDCT; + } + + /*-----------------------------------------------------------------* + * Allocate and initialize Front-VAD handle + *-----------------------------------------------------------------*/ + + if ( !spar_reconfig_flag ) + { + hSpar->front_vad_flag = 0; + hSpar->front_vad_dtx_flag = 0; + hSpar->force_front_vad = 0; + + if ( hEncoderConfig->Opt_DTX_ON ) + { + if ( ( error = front_vad_create( &( hSpar->hFrontVad ), hEncoderConfig ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( hSpar->hCoreCoderVAD = (ENC_CORE_HANDLE) malloc( sizeof( Encoder_State ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for CoreCoder structure\n" ) ); + } + + copy_encoder_config( st_ivas, hSpar->hCoreCoderVAD, 1 ); + + hSpar->hCoreCoderVAD->total_brate = hEncoderConfig->ivas_total_brate; /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */ + hSpar->hCoreCoderVAD->mct_chan_mode = MCT_CHAN_MODE_IGNORE; + + if ( ( error = init_encoder( hSpar->hCoreCoderVAD, st_ivas, 0, hEncoderConfig->var_SID_rate_flag, hEncoderConfig->interval_SID, 1, st_ivas->ism_mode, hSpar->hCoreCoderVAD->total_brate ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + hSpar->hCoreCoderVAD = NULL; + hSpar->hFrontVad = NULL; + } + } + + /*-----------------------------------------------------------------* + * Final assignment + *-----------------------------------------------------------------*/ + + st_ivas->hSpar = hSpar; + + return error; +} + + +/*------------------------------------------------------------------------- + * ivas_spar_enc_close() + * + * Deallocate SPAR encoder handle + *------------------------------------------------------------------------*/ + +void ivas_spar_enc_close( + SPAR_ENC_HANDLE *hSpar, /* i/o: SPAR encoder handle */ + const int32_t input_Fs, /* i : input sampling rate */ + const int16_t nchan_inp, /* i : number of input channels */ + const int16_t spar_reconfig_flag /* i : SPAR reconfiguration flag */ +) +{ + int16_t num_chans; + + if ( hSpar == NULL || *hSpar == NULL ) + { + return; + } + + if ( !spar_reconfig_flag ) + { + /* core-coder-VAD handle */ + if ( ( *hSpar )->hCoreCoderVAD != NULL ) + { + destroy_core_enc( ( *hSpar )->hCoreCoderVAD ); + ( *hSpar )->hCoreCoderVAD = NULL; + } + + /* front-VAD handle */ + if ( ( *hSpar )->hFrontVad != NULL ) + { + front_vad_destroy( &( *hSpar )->hFrontVad ); + ( *hSpar )->hFrontVad = NULL; + } + } + + num_chans = ( *hSpar )->hFbMixer->fb_cfg->num_in_chans; + assert( num_chans <= nchan_inp ); + + /* MD handle */ + ivas_spar_md_enc_close( &( *hSpar )->hMdEnc ); + + /* Covar. State handle */ + ivas_spar_covar_enc_close( &( *hSpar )->hCovEnc, num_chans ); + + /* FB mixer handle */ + ivas_FB_mixer_close( &( *hSpar )->hFbMixer, input_Fs, spar_reconfig_flag ); + + /* AGC */ + ivas_spar_agc_enc_close( &( *hSpar )->hAgcEnc ); + + /* PCA */ + if ( ( *hSpar )->hPCA != NULL ) + { + free( ( *hSpar )->hPCA ); + ( *hSpar )->hPCA = NULL; + } + + if ( !spar_reconfig_flag ) + { + /* Trans Det handle */ + ivas_transient_det_close( &( *hSpar )->hTranDet ); + free( ( *hSpar ) ); + ( *hSpar ) = NULL; + } + + return; +} + + +/*-------------------------------------------------------------------* + * ivas_spar_enc() + * + * Principal IVAS SPAR encoder routine + *-------------------------------------------------------------------*/ + +ivas_error ivas_spar_enc( + Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ + float *data_f[], /* i/o: input/transport audio channels */ + const int16_t input_frame, /* i : input frame length */ + int16_t *nb_bits_metadata, /* i : number of MD bits written */ + BSTR_ENC_HANDLE hMetaData /* o : MetaData handle */ +) +{ + ENCODER_CONFIG_HANDLE hEncoderConfig; + Encoder_State *st0; /* used for bitstream handling */ + ivas_error error; + + error = IVAS_ERR_OK; + hEncoderConfig = st_ivas->hEncoderConfig; + st0 = ( st_ivas->nSCE > 0 ) ? st_ivas->hSCE[0]->hCoreCoder[0] : st_ivas->hCPE[0]->hCoreCoder[0]; + + /* Write SBA signaling bits */ + if ( hEncoderConfig->ivas_format == SBA_FORMAT || ( hEncoderConfig->ivas_format == SBA_ISM_FORMAT && st_ivas->ism_mode == ISM_SBA_MODE_DISC ) ) + { + /* Write SBA planar flag */ + push_indice( st0->hBstr, IND_SMODE, hEncoderConfig->sba_planar, SBA_PLANAR_BITS ); + + /* Write SBA order */ + push_indice( st0->hBstr, IND_SMODE, hEncoderConfig->sba_order, SBA_ORDER_BITS ); + } + else /* ism_mode == ISM_MODE_NONE */ + { + if ( hEncoderConfig->ivas_total_brate < IVAS_24k4 ) + { + /* Write SBA planar flag */ + push_indice( st0->hBstr, IND_SMODE, hEncoderConfig->sba_planar, SBA_PLANAR_BITS ); + + /* hack to indicate OSBA bitstream at VLBR */ + push_indice( st0->hBstr, IND_SMODE, 0, SBA_ORDER_BITS ); + } + else + { + /* Write SBA order */ + push_indice( st0->hBstr, IND_SMODE, hEncoderConfig->sba_order, SBA_ORDER_BITS ); + } + } + + if ( hEncoderConfig->ivas_format == SBA_ISM_FORMAT ) + { + /* write the number of objects in ISM_SBA format*/ + push_indice( hMetaData, IND_ISM_NUM_OBJECTS, hEncoderConfig->nchan_ism - 1, NO_BITS_MASA_ISM_NO_OBJ ); + } + + /* front VAD */ + if ( ( error = front_vad_spar( st_ivas->hSpar, data_f[0], hEncoderConfig, input_frame ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( hEncoderConfig->sba_planar ) + { + ivas_sba_zero_vert_comp( data_f, st_ivas->sba_analysis_order, hEncoderConfig->sba_planar, input_frame ); + } + + /* SPAR encoder */ + if ( ( error = ivas_spar_enc_process( st_ivas, hEncoderConfig, hMetaData, st_ivas->hSpar->front_vad_flag, data_f ) ) != IVAS_ERR_OK ) + { + return error; + } + + *nb_bits_metadata = hMetaData->nb_bits_tot; + + /* Force IVAS front pre-proc decision for higher bitrates */ + if ( hEncoderConfig->ivas_total_brate > SBA_DTX_BITRATE_THRESHOLD || hEncoderConfig->Opt_DTX_ON == 0 ) + { + st_ivas->hSpar->front_vad_flag = 0; + } + + return error; +} + + +/*-------------------------------------------------------------------* + * ivas_spar_cov_md_process() + * + * Process call for SPAR covariance and MD encoder + *-------------------------------------------------------------------*/ + +static ivas_error ivas_spar_cov_md_process( + const ENCODER_CONFIG_HANDLE hEncoderConfig, + SPAR_ENC_HANDLE hSpar, + const IVAS_QMETADATA_HANDLE hQMetaData, + BSTR_ENC_HANDLE hMetaData, + const int16_t nchan_inp, + const int16_t sba_order, + float *ppIn_FR_real[IVAS_SPAR_MAX_CH], + float *ppIn_FR_imag[IVAS_SPAR_MAX_CH], + const int16_t transient_det[2], + const int16_t dtx_vad, + const int16_t nchan_transport, + int16_t *dyn_active_w_flag ) +{ + int16_t i, j, i_ts, b, table_idx; + int16_t active_w_vlbr; + /* note: the actual dimensions of matrixes correspond to num_channels = ivas_sba_get_nchan_metadata( sba_order, ivas_total_brate ); */ + float *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; + float *cov_dtx_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; + float cov_real_buf[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS]; + float cov_dtx_real_buf[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS]; + ivas_error error; + + error = IVAS_ERR_OK; + + active_w_vlbr = ( hEncoderConfig->ivas_total_brate < IVAS_24k4 ) ? 1 : 0; + + /*-----------------------------------------------------------------------------------------* + * Set SPAR bitrates + *-----------------------------------------------------------------------------------------*/ + + table_idx = ivas_get_spar_table_idx( hEncoderConfig->ivas_total_brate, sba_order, SPAR_CONFIG_BW, NULL, NULL ); + + if ( hSpar->hMdEnc->table_idx != table_idx ) + { + hSpar->hMdEnc->table_idx = table_idx; + if ( hEncoderConfig->ivas_total_brate != hEncoderConfig->last_ivas_total_brate && !hSpar->spar_reconfig_flag ) + { + if ( ( error = ivas_spar_md_enc_init( hSpar->hMdEnc, hEncoderConfig, sba_order ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + ivas_spar_set_bitrate_config( &hSpar->hMdEnc->spar_md_cfg, table_idx, ( hSpar->hMdEnc->spar_hoa_md_flag ) ? IVAS_MAX_NUM_BANDS : SPAR_DIRAC_SPLIT_START_BAND, hSpar->hMdEnc->spar_hoa_dirac2spar_md_flag, 1, hEncoderConfig->Opt_PCA_ON, hSpar->AGC_Enable ); + } + } + + /*-----------------------------------------------------------------------------------------* + * Covariance process + *-----------------------------------------------------------------------------------------*/ + + for ( i = 0; i < nchan_inp; i++ ) + { + for ( j = 0; j < nchan_inp; j++ ) + { + cov_real[i][j] = cov_real_buf[i][j]; + cov_dtx_real[i][j] = cov_dtx_real_buf[i][j]; + for ( b = hSpar->hFbMixer->pFb->filterbank_num_bands; b < IVAS_MAX_NUM_BANDS; b++ ) + { + cov_real[i][j][b] = 0.0f; + cov_dtx_real[i][j][b] = 0.0f; + } + } + } + + ivas_enc_cov_handler_process( hSpar->hCovEnc, ppIn_FR_real, ppIn_FR_imag, cov_real, cov_dtx_real, hSpar->hFbMixer->pFb, 0, hSpar->hFbMixer->pFb->filterbank_num_bands, nchan_inp, dtx_vad, transient_det, hSpar->hMdEnc->HOA_md_ind, + &hSpar->hMdEnc->spar_md.res_ind, remix_order_set[hSpar->hMdEnc->spar_md_cfg.remix_unmix_order], dyn_active_w_flag, nchan_transport, 1 ); + + if ( nchan_transport > 1 && nchan_transport <= ( FOA_CHANNELS - 1 ) ) + { + push_next_indice( hMetaData, *dyn_active_w_flag, 1 ); + if ( ( *dyn_active_w_flag == 1 ) && ( nchan_transport == 2 ) ) + { + push_next_indice( hMetaData, hSpar->hMdEnc->spar_md.res_ind - nchan_transport, 1 ); + } + hSpar->front_vad_flag = ( *dyn_active_w_flag == 1 ) ? 1 : hSpar->front_vad_flag; + } + else + { + if ( nchan_transport == FOA_CHANNELS ) + { + push_next_indice( hMetaData, 0, 1 ); + } + } + + /*-----------------------------------------------------------------------------------------* + * MetaData encoder + *-----------------------------------------------------------------------------------------*/ + + if ( hSpar->hMdEnc->spar_hoa_md_flag == 0 ) + { + if ( ( error = ivas_spar_md_enc_process( hSpar->hMdEnc, hEncoderConfig, cov_real, cov_dtx_real, hMetaData, dtx_vad, nchan_inp, sba_order, hSpar->hFbMixer->prior_mixer, *dyn_active_w_flag, hQMetaData->dirac_mono_flag ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( hSpar->hMdEnc->spar_hoa_dirac2spar_md_flag ) + { + float azi_dirac[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES]; + float ele_dirac[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES]; + float diffuseness[IVAS_MAX_NUM_BANDS]; + float Wscale_d[IVAS_MAX_NUM_BANDS]; + int16_t d_start_band, d_end_band; + int16_t dirac_band_idx; + + d_start_band = hSpar->enc_param_start_band; + d_end_band = IVAS_MAX_NUM_BANDS; + + for ( b = d_start_band; b < d_end_band; b++ ) + { + dirac_band_idx = hSpar->dirac_to_spar_md_bands[b] - d_start_band; + for ( i_ts = 0; i_ts < hQMetaData->q_direction->cfg.nblocks; i_ts++ ) + { + azi_dirac[b][i_ts] = hQMetaData->q_direction->band_data[dirac_band_idx].azimuth[i_ts]; + ele_dirac[b][i_ts] = hQMetaData->q_direction->band_data[dirac_band_idx].elevation[i_ts]; + } + diffuseness[b] = 1.0f - hQMetaData->q_direction->band_data[dirac_band_idx].energy_ratio[0]; + } + + if ( d_start_band >= 6 && dtx_vad == 1 ) + { + mvr2r( hSpar->hMdEnc->spar_md.band_coeffs[d_start_band - 1].P_quant_re, hSpar->hMdEnc->spar_md.band_coeffs[d_start_band - 1].P_re, IVAS_SPAR_MAX_CH - 1 ); + } + + for ( b = d_start_band; b < d_end_band; b++ ) + { + Wscale_d[b] = 1.0f; + for ( i = 1; i < nchan_inp; i++ ) + { + Wscale_d[b] += cov_real[i][i][b] / max( EPSILON, cov_real[0][0][b] ); + } + Wscale_d[b] = Wscale_d[b] / ( 1.0f + (float) sba_order ); /*DirAC normalized signal variance sums to 1 + order*/ + Wscale_d[b] = sqrtf( Wscale_d[b] ); + Wscale_d[b] = min( 2.0f, max( Wscale_d[b], 1.0f ) ); + } + + ivas_get_spar_md_from_dirac( azi_dirac, ele_dirac, diffuseness, 1, hSpar->hMdEnc->mixer_mat, &hSpar->hMdEnc->spar_md, &hSpar->hMdEnc->spar_md_cfg, d_start_band, d_end_band, ( hSpar->hMdEnc->spar_hoa_md_flag ) ? 1 : sba_order, dtx_vad, Wscale_d, hQMetaData->useLowerRes, active_w_vlbr, *dyn_active_w_flag ); + } + + if ( hSpar->hMdEnc->spar_hoa_md_flag ) + { + error = ivas_spar_md_enc_process( hSpar->hMdEnc, hEncoderConfig, cov_real, cov_dtx_real, hMetaData, dtx_vad, nchan_inp, sba_order, hSpar->hFbMixer->prior_mixer, *dyn_active_w_flag, hQMetaData->dirac_mono_flag ); + } + + return error; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_spar_enc_process() + * + * Process call for SPAR encoder + *-----------------------------------------------------------------------------------------*/ + +static ivas_error ivas_spar_enc_process( + Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ + const ENCODER_CONFIG_HANDLE hEncoderConfig, /* i : configuration structure */ + BSTR_ENC_HANDLE hMetaData, /* i/o: MetaData handle */ + const int16_t front_vad_flag, /* i : front-VAD decision */ + float *data_f[] /* i/o: input/transport audio channels */ +) +{ + float pcm_tmp[DIRAC_MAX_ANA_CHANS][L_FRAME48k * 2]; + float *p_pcm_tmp[DIRAC_MAX_ANA_CHANS]; + int16_t i, j, input_frame, dtx_vad; + int16_t transient_det[2]; + int16_t hodirac_flag; + int32_t ivas_total_brate, input_Fs; + int16_t nchan_inp, sba_order, nchan_transport; + int16_t in_out_mixer_map[IVAS_MAX_FB_MIXER_OUT_CH][IVAS_MAX_SPAR_FB_MIXER_IN_CH]; + ivas_error error; + const int16_t *order; + SPAR_ENC_HANDLE hSpar = st_ivas->hSpar; + IVAS_QMETADATA_HANDLE hQMetaData = st_ivas->hQMetaData; + int16_t ts, l_ts, num_del_samples, b, i_ts; + + float *ppIn_FR_real[IVAS_SPAR_MAX_CH], *ppIn_FR_imag[IVAS_SPAR_MAX_CH]; + float wyzx_del_buf[FOA_CHANNELS][IVAS_FB_1MS_48K_SAMP]; + int16_t dyn_active_w_flag; + int16_t nchan_fb_in; + + push_wmops( "ivas_spar_enc_process" ); + + /*-----------------------------------------------------------------------------------------* + * Initialization + *-----------------------------------------------------------------------------------------*/ + + error = IVAS_ERR_OK; + + input_Fs = hEncoderConfig->input_Fs; + ivas_total_brate = hEncoderConfig->ivas_total_brate; + num_del_samples = hSpar->hFbMixer->fb_cfg->fb_latency; + + input_frame = (int16_t) ( input_Fs / FRAMES_PER_SEC ); + sba_order = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ); + nchan_inp = ivas_sba_get_nchan_metadata( sba_order, hEncoderConfig->ivas_total_brate ); + assert( nchan_inp <= hEncoderConfig->nchan_inp ); + + nchan_fb_in = hSpar->hFbMixer->fb_cfg->nchan_fb_in; + nchan_transport = st_ivas->nchan_transport; + + for ( i = FOA_CHANNELS + 1; i < nchan_fb_in; i++ ) + { + mvr2r( data_f[HOA_keep_ind[i]], data_f[i], input_frame ); + } + + /*-----------------------------------------------------------------------------------------* + * Transient detector + *-----------------------------------------------------------------------------------------*/ + + ivas_transient_det_process( hSpar->hTranDet, data_f[0], input_frame, transient_det ); + + if ( ivas_total_brate < IVAS_24k4 ) + { + transient_det[1] = 0; + } + + /* store previous input samples for W in local buffer */ + assert( num_del_samples <= IVAS_FB_1MS_48K_SAMP ); + if ( hSpar->hFbMixer->fb_cfg->active_w_mixing == 0 ) + { + /* fill delay (1 ms) buffer for all Transport channels */ + for ( i = 0; i < FOA_CHANNELS; i++ ) + { + int16_t idx = hSpar->hFbMixer->fb_cfg->remix_order[i]; + mvr2r( &hSpar->hFbMixer->ppFilterbank_prior_input[idx][hSpar->hFbMixer->fb_cfg->prior_input_length - num_del_samples], wyzx_del_buf[idx], num_del_samples ); + } + } + + /*-----------------------------------------------------------------------------------------* + * FB mixer ingest + *-----------------------------------------------------------------------------------------*/ + + for ( i = 0; i < nchan_fb_in; i++ ) + { + p_pcm_tmp[i] = pcm_tmp[i]; + } + + /* run Filter Bank overlapping MDFT analysis first, then we can use the temporary buffer for Parameter MDFT analysis*/ + ivas_fb_mixer_pcm_ingest( hSpar->hFbMixer, data_f, p_pcm_tmp, input_frame, hSpar->hMdEnc->HOA_md_ind ); + + /* prepare Parameter MDFT analysis */ + for ( i = 0; i < nchan_fb_in; i++ ) + { + ppIn_FR_real[i] = p_pcm_tmp[i]; + ppIn_FR_imag[i] = p_pcm_tmp[i] + input_frame; + p_pcm_tmp[i] = data_f[i]; + } + + l_ts = input_frame / MAX_PARAM_SPATIAL_SUBFRAMES; + + for ( ts = 0; ts < MAX_PARAM_SPATIAL_SUBFRAMES; ts++ ) + { + ivas_fb_mixer_get_windowed_fr( hSpar->hFbMixer, p_pcm_tmp, ppIn_FR_real, ppIn_FR_imag, l_ts, l_ts, nchan_fb_in ); + + ivas_fb_mixer_update_prior_input( hSpar->hFbMixer, p_pcm_tmp, l_ts, nchan_fb_in ); + + for ( i = 0; i < nchan_fb_in; i++ ) + { + p_pcm_tmp[i] += l_ts; + ppIn_FR_real[i] += l_ts; + ppIn_FR_imag[i] += l_ts; + } + } + + /* turn pointers back to the local buffer, needed for the following processing */ + for ( i = 0; i < nchan_fb_in; i++ ) + { + ppIn_FR_real[i] = pcm_tmp[i]; + ppIn_FR_imag[i] = pcm_tmp[i] + input_frame; + p_pcm_tmp[i] = pcm_tmp[i]; + } + + dtx_vad = ( hEncoderConfig->Opt_DTX_ON == 1 ) ? front_vad_flag : 1; + + /*-----------------------------------------------------------------------------------------* + * DirAC encoding + *-----------------------------------------------------------------------------------------*/ + + hodirac_flag = ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ); + + if ( ( error = ivas_dirac_enc( st_ivas->hDirAC, hQMetaData, hMetaData, data_f, ppIn_FR_real, ppIn_FR_imag, input_frame, dtx_vad, hEncoderConfig->ivas_format, hodirac_flag ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Set Energy Ratio to 0.0 if the mono flag has been set */ + if ( hQMetaData->dirac_mono_flag ) + { + for ( b = hQMetaData->q_direction->cfg.start_band; b < hQMetaData->q_direction->cfg.nbands; b++ ) + { + for ( i_ts = 0; i_ts < ( ( dtx_vad == 1 ) ? hQMetaData->q_direction[0].cfg.nblocks : 1 ); i_ts++ ) + { + hQMetaData->q_direction[0].band_data[b].energy_ratio[i_ts] = 0.0f; + } + } + } + + /*-----------------------------------------------------------------------------------------* + * Covariance and MD processing + *-----------------------------------------------------------------------------------------*/ + + if ( ( error = ivas_spar_cov_md_process( hEncoderConfig, st_ivas->hSpar, st_ivas->hQMetaData, hMetaData, nchan_inp, sba_order, ppIn_FR_real, ppIn_FR_imag, transient_det, dtx_vad, nchan_transport, &dyn_active_w_flag ) ) != IVAS_ERR_OK ) + { + return error; + } + + /*-----------------------------------------------------------------------------------------* + * FB mixer + *-----------------------------------------------------------------------------------------*/ + + ivas_fb_mixer_get_in_out_mapping( hSpar->hFbMixer->fb_cfg, in_out_mixer_map ); + +#ifdef DEBUG_SPAR_DIRAC_WRITE_OUT_PRED_PARS + { + static FILE *fid = 0; + int16_t band = 9; + if ( !fid ) + { + fid = fopen( "pred_coeffs_enc.txt", "wt" ); + } + fprintf( fid, "%.6f\n", hSpar->hMdEnc->mixer_mat[1][0][band] ); + } +#endif + + ivas_fb_mixer_process( hSpar->hFbMixer, hSpar->hMdEnc->mixer_mat, p_pcm_tmp, input_frame, in_out_mixer_map ); + + if ( hSpar->hFbMixer->fb_cfg->active_w_mixing == 0 ) + { + + /*cross fade between new active W channels and old passive W channel*/ + if ( dyn_active_w_flag == 1 ) + { + if ( hSpar->hMdEnc->spar_md.prior_dyn_active_w_flag != dyn_active_w_flag ) + { + float new_w[L_FRAME48k]; + + /* delayed W */ + mvr2r( wyzx_del_buf[0], p_pcm_tmp[0], num_del_samples ); + mvr2r( data_f[0], p_pcm_tmp[0] + num_del_samples, input_frame - num_del_samples ); + + mvr2r( wyzx_del_buf[hSpar->hMdEnc->spar_md.res_ind], new_w, num_del_samples ); + mvr2r( data_f[hSpar->hMdEnc->spar_md.res_ind], &new_w[num_del_samples], input_frame - num_del_samples ); + + if ( hSpar->hMdEnc->spar_md.prior_dyn_active_w_flag == 0 && dyn_active_w_flag == 1 ) + { + ivas_fb_mixer_cross_fading( hSpar->hFbMixer, p_pcm_tmp, p_pcm_tmp[0], new_w, 0, input_frame, 0 ); + } + else if ( hSpar->hMdEnc->spar_md.prior_dyn_active_w_flag == 1 && dyn_active_w_flag == 0 ) + { + ivas_fb_mixer_cross_fading( hSpar->hFbMixer, p_pcm_tmp, new_w, p_pcm_tmp[0], 0, input_frame, 0 ); + } + } + else + { + mvr2r( wyzx_del_buf[hSpar->hMdEnc->spar_md.res_ind], p_pcm_tmp[0], num_del_samples ); + mvr2r( data_f[hSpar->hMdEnc->spar_md.res_ind], p_pcm_tmp[0] + num_del_samples, input_frame - num_del_samples ); + } + } + else + { + /* delayed W */ + mvr2r( wyzx_del_buf[0], p_pcm_tmp[0], num_del_samples ); + mvr2r( data_f[0], p_pcm_tmp[0] + num_del_samples, input_frame - num_del_samples ); + } + + for ( i = 1; i < hSpar->hFbMixer->fb_cfg->num_out_chans; i++ ) + { + int16_t idx = hSpar->hFbMixer->fb_cfg->remix_order[i]; + + /* delayed, reorderd and accumulated with (negative) prediction from W */ + v_add( wyzx_del_buf[idx], p_pcm_tmp[i], p_pcm_tmp[i], num_del_samples ); + v_add( data_f[idx], p_pcm_tmp[i] + num_del_samples, p_pcm_tmp[i] + num_del_samples, input_frame - num_del_samples ); + } + } + + /*-----------------------------------------------------------------------------------------* + * PCA encoder + *-----------------------------------------------------------------------------------------*/ + + if ( hSpar->hPCA != NULL ) + { + ivas_pca_enc( hEncoderConfig, hSpar->hPCA, hMetaData, p_pcm_tmp, input_frame, FOA_CHANNELS ); + } + else + { + if ( ivas_total_brate == PCA_BRATE && sba_order == SBA_FOA_ORDER ) + { + /* write PCA bypass bit */ + push_next_indice( hMetaData, PCA_MODE_INACTIVE, 1 ); + } + } + + + /*-----------------------------------------------------------------------------------------* + * AGC + *-----------------------------------------------------------------------------------------*/ + + if ( dtx_vad == 1 ) + { + if ( hSpar->AGC_Enable != 0 ) + { + ivas_agc_enc_process( hSpar->hAgcEnc, hMetaData, p_pcm_tmp, p_pcm_tmp, hSpar->hFbMixer->fb_cfg->num_out_chans, hEncoderConfig ); + } + } + + + /*-----------------------------------------------------------------------------------------* + * Re-order the dmx back to ACN/SN3D format + *-----------------------------------------------------------------------------------------*/ + + order = remix_order_set[hSpar->hMdEnc->spar_md_cfg.remix_unmix_order]; + + for ( j = 0; j < nchan_transport; j++ ) + { + if ( st_ivas->nchan_transport < 3 ) + { + mvr2r( p_pcm_tmp[j], data_f[j], input_frame ); + } + else + { + mvr2r( p_pcm_tmp[j], data_f[order[j]], input_frame ); + } + } + for ( ; j < IVAS_SPAR_MAX_DMX_CHS; j++ ) + { + set_f( data_f[order[j]], 0.0f, input_frame ); + } + + hSpar->hMdEnc->spar_md.prior_dyn_active_w_flag = dyn_active_w_flag; + + pop_wmops(); + + return error; +} diff --git a/lib_enc/ivas_spar_md_enc.c b/lib_enc/ivas_spar_md_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..422cc4b0557a3067a96a83176d7cc1d2253e586c --- /dev/null +++ b/lib_enc/ivas_spar_md_enc.c @@ -0,0 +1,1588 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "prot.h" +#include "ivas_prot.h" +#include "math.h" +#include "ivas_rom_com.h" +#include +#include "wmc_auto.h" + +/*------------------------------------------------------------------------------------------* + * PreProcessor + *------------------------------------------------------------------------------------------*/ + +static const float pr_boost_range[2] = { 0.1f, 0.4f }; + +typedef enum ivas_strats_t +{ + START, + BASE, + BASE_DIFF, + BASE_NOEC, + FOUR_A, + FOUR_B, + FOUR_C, + FOUR_D, + NO_STRAT +} ivas_strats_t; + + +/*------------------------------------------------------------------------------------------* + * Static functions declaration + *------------------------------------------------------------------------------------------*/ + +static void ivas_band_mixer( float *cov_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], const int16_t num_ch, int16_t *num_bands, int16_t red_band_fact ); + +static int16_t ivas_get_huffman_coded_bs( ivas_spar_md_enc_state_t *hMdEnc, BSTR_ENC_HANDLE hMetaData, const int16_t nB, const int16_t qsi, const int16_t bands_bw ); + +static int16_t ivas_get_arith_coded_bs( ivas_spar_md_enc_state_t *hMdEnc, BSTR_ENC_HANDLE hMetaData, const int16_t *pDo_diff, const int16_t bands_bw, const int16_t nB, const int16_t qsi, const int16_t strat, const int32_t ivas_total_brate ); + +static void ivas_spar_set_enc_config( ivas_spar_md_enc_state_t *hMdEnc, int16_t *max_freq_per_chan, const int16_t nchan_transport, float *pFC, const int16_t nchan_inp ); + +static void ivas_select_next_strat( ivas_strats_t prior_strat, ivas_strats_t cs[MAX_QUANT_STRATS], const int16_t dmx_switch, const int16_t dtx_vad ); + +static void ivas_store_prior_coeffs( ivas_spar_md_enc_state_t *hMdEnc, const int16_t num_bands, const int16_t strat, const int16_t dtx_vad, const int16_t qsi ); + +static void ivas_write_spar_md_bitstream( ivas_spar_md_enc_state_t *hMdEnc, const int16_t nB, const int16_t bands_bw, BSTR_ENC_HANDLE hMetaData, const int32_t ivas_total_brate, const int16_t strat, const int16_t qsi ); + +static void ivas_spar_quant_pred_coeffs_dtx( ivas_spar_md_t *pSpar_md, const float *pValues, const int16_t ndm, int16_t *pIndex, const int16_t dim1, float *pQuant ); + +static void ivas_quant_p_per_band_dtx( float *pP_mat, const int16_t num_dec, const int16_t num_dmx, int16_t *ppIdx_pd, float *pP_out, const int16_t num_ch ); + +static void ivas_write_parameter_bitstream_dtx( ivas_spar_md_t *pSpar_md, BSTR_ENC_HANDLE hMetaData, int16_t *num_dmx, int16_t *num_dec, const int16_t num_bands ); + +static void ivas_quant_p_per_band( ivas_band_coeffs_t *pband_coeffs, ivas_band_coeffs_ind_t *pBand_coeffs_idx, ivas_quant_strat_t *pQs, const int16_t num_ch ); + +static void ivas_quant_c_per_band( ivas_band_coeffs_t *pband_coeffs, ivas_band_coeffs_ind_t *pBand_coeffs_idx, ivas_quant_strat_t *pQs, const int16_t ndec, const int16_t ndm ); + +static void ivas_quant_pred_coeffs_per_band( ivas_band_coeffs_t *pband_coeffs, ivas_band_coeffs_ind_t *pBand_coeffs_idx, ivas_quant_strat_t *pQs, const int16_t num_ch ); + + +/*------------------------------------------------------------------------- + * ivas_spar_md_enc_open() + * + * Allocate and initialize SPAR MD encoder handle + *------------------------------------------------------------------------*/ + +ivas_error ivas_spar_md_enc_open( + ivas_spar_md_enc_state_t **hMdEnc_in, /* i/o: SPAR MD encoder handle */ + const ENCODER_CONFIG_HANDLE hEncoderConfig, /* i : configuration structure */ + const int16_t sba_order /* i : Ambisonic (SBA) order */ +) +{ + ivas_spar_md_enc_state_t *hMdEnc; + ivas_error error; + int16_t num_channels, i, j; + error = IVAS_ERR_OK; + + if ( ( hMdEnc = (ivas_spar_md_enc_state_t *) malloc( sizeof( ivas_spar_md_enc_state_t ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD encoder" ); + } + + num_channels = ivas_sba_get_nchan_metadata( sba_order, hEncoderConfig->ivas_total_brate ); + + if ( ( hMdEnc->spar_md.band_coeffs = (ivas_band_coeffs_t *) malloc( IVAS_MAX_NUM_BANDS * sizeof( ivas_band_coeffs_t ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for band_coeffs in SPAR MD" ); + } + if ( ( hMdEnc->mixer_mat = (float ***) malloc( num_channels * sizeof( float ** ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); + } + for ( i = 0; i < num_channels; i++ ) + { + if ( ( hMdEnc->mixer_mat[i] = (float **) malloc( num_channels * sizeof( float * ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); + } + for ( j = 0; j < num_channels; j++ ) + { + if ( ( hMdEnc->mixer_mat[i][j] = (float *) malloc( IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); + } + } + } + + if ( ( hMdEnc->mixer_mat_local = (float ***) malloc( num_channels * sizeof( float ** ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); + } + for ( i = 0; i < num_channels; i++ ) + { + if ( ( hMdEnc->mixer_mat_local[i] = (float **) malloc( num_channels * sizeof( float * ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); + } + for ( j = 0; j < num_channels; j++ ) + { + if ( ( hMdEnc->mixer_mat_local[i][j] = (float *) malloc( IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); + } + } + } + + if ( ( error = ivas_spar_md_enc_init( hMdEnc, hEncoderConfig, sba_order ) ) != IVAS_ERR_OK ) + { + return error; + } + + *hMdEnc_in = hMdEnc; + + return error; +} + + +/*------------------------------------------------------------------------- + * ivas_spar_md_enc_close() + * + * Deallocate SPAR MD encoder handle + *------------------------------------------------------------------------*/ + +void ivas_spar_md_enc_close( + ivas_spar_md_enc_state_t **hMdEnc_in /* i/o: SPAR MD encoder handle */ +) +{ + int16_t num_channels, i, j; + ivas_spar_md_enc_state_t *hMdEnc; + + if ( hMdEnc_in == NULL || *hMdEnc_in == NULL ) + { + return; + } + + hMdEnc = *hMdEnc_in; + num_channels = hMdEnc->num_umx_ch; + + if ( hMdEnc->spar_md.band_coeffs != NULL ) + { + free( hMdEnc->spar_md.band_coeffs ); + hMdEnc->spar_md.band_coeffs = NULL; + } + if ( hMdEnc->mixer_mat != NULL ) + { + for ( i = 0; i < num_channels; i++ ) + { + for ( j = 0; j < num_channels; j++ ) + { + free( hMdEnc->mixer_mat[i][j] ); + } + free( hMdEnc->mixer_mat[i] ); + } + free( hMdEnc->mixer_mat ); + } + + if ( hMdEnc->mixer_mat_local != NULL ) + { + for ( i = 0; i < num_channels; i++ ) + { + + for ( j = 0; j < num_channels; j++ ) + { + free( hMdEnc->mixer_mat_local[i][j] ); + } + free( hMdEnc->mixer_mat_local[i] ); + } + free( hMdEnc->mixer_mat_local ); + } + + free( *hMdEnc_in ); + *hMdEnc_in = NULL; + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_spar_md_enc_init() + * + * SPAR MD encoder initialization + *-----------------------------------------------------------------------------------------*/ + +ivas_error ivas_spar_md_enc_init( + ivas_spar_md_enc_state_t *hMdEnc, /* o : MD encoder handle */ + const ENCODER_CONFIG_HANDLE hEncoderConfig, /* i : configuration structure */ + const int16_t sba_order /* i : Ambisonic (SBA) order */ +) +{ + float pFC[IVAS_MAX_NUM_BANDS]; + int16_t table_idx; + float PR_minmax[2]; + int16_t num_channels, i, j, k; + + ivas_sba_get_spar_hoa_md_flag( sba_order, hEncoderConfig->ivas_total_brate, &hMdEnc->spar_hoa_md_flag, &hMdEnc->spar_hoa_dirac2spar_md_flag ); + num_channels = ivas_sba_get_nchan_metadata( sba_order, hEncoderConfig->ivas_total_brate ); + ivas_sba_get_spar_hoa_ch_ind( num_channels, hEncoderConfig->ivas_total_brate, hMdEnc->HOA_md_ind ); + table_idx = ivas_get_spar_table_idx( hEncoderConfig->ivas_total_brate, sba_order, SPAR_CONFIG_BW, NULL, NULL ); + + hMdEnc->spar_md.prior_dyn_active_w_flag = 0; + + ivas_spar_set_bitrate_config( &hMdEnc->spar_md_cfg, table_idx, ( hMdEnc->spar_hoa_md_flag ) ? IVAS_MAX_NUM_BANDS : SPAR_DIRAC_SPLIT_START_BAND, + hMdEnc->spar_hoa_dirac2spar_md_flag, 1, hEncoderConfig->Opt_PCA_ON, ivas_agc_enc_get_flag( ivas_spar_br_table_consts[table_idx].nchan_transport ) ); + + /* get FB coefficients */ + for ( i = 0; i < IVAS_MAX_NUM_BANDS; i++ ) + { + pFC[i] = ivas_fb_fcs_12band_1ms[i] * hEncoderConfig->input_Fs * 0.5f; + } + + ivas_spar_set_enc_config( hMdEnc, hMdEnc->spar_md_cfg.max_freq_per_chan, hMdEnc->spar_md_cfg.nchan_transport, pFC, num_channels ); + + if ( hMdEnc->spar_md_cfg.nchan_transport != 2 && ( ( hMdEnc->spar_md_cfg.remix_unmix_order == 1 ) || ( hMdEnc->spar_md_cfg.remix_unmix_order == 2 ) ) ) + { + return IVAS_ERR_INTERNAL; + } + + ivas_spar_arith_coeffs_com_init( &hMdEnc->arith_coeffs, &hMdEnc->spar_md_cfg, table_idx, ENC ); + ivas_spar_huff_coeffs_com_init( &hMdEnc->huff_coeffs, NULL, table_idx, ENC ); + + if ( hEncoderConfig->Opt_DTX_ON == 1 ) + { + /* DTX quant init */ + PR_minmax[0] = hMdEnc->spar_md_cfg.quant_strat[0].PR.min; + PR_minmax[1] = hMdEnc->spar_md_cfg.quant_strat[0].PR.max; + ivas_spar_quant_dtx_init( &hMdEnc->spar_md, PR_minmax ); + } + + hMdEnc->spar_md_cfg.prior_strat = START; + hMdEnc->spar_md_cfg.prev_quant_idx = -1; + + for ( i = 0; i < num_channels; i++ ) + { + for ( j = 0; j < num_channels; j++ ) + { + for ( k = 0; k < IVAS_MAX_NUM_BANDS; k++ ) + { + hMdEnc->mixer_mat[i][j][k] = 0; + } + } + } + + ivas_clear_band_coeffs( hMdEnc->spar_md.band_coeffs, IVAS_MAX_NUM_BANDS ); + ivas_clear_band_coeff_idx( hMdEnc->spar_md.band_coeffs_idx, IVAS_MAX_NUM_BANDS ); + ivas_clear_band_coeff_idx( hMdEnc->spar_md_prior.band_coeffs_idx, IVAS_MAX_NUM_BANDS ); + ivas_clear_band_coeff_idx( hMdEnc->spar_md_prior.band_coeffs_idx_mapped, IVAS_MAX_NUM_BANDS ); + + return IVAS_ERR_OK; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_spar_set_enc_config() + * + * Set configuration for SPAR MD encoder + *-----------------------------------------------------------------------------------------*/ + +static void ivas_spar_set_enc_config( + ivas_spar_md_enc_state_t *hMdEnc, + int16_t *max_freq_per_chan, + const int16_t nchan_transport, + float *pFC, + const int16_t nchan_inp ) +{ + int16_t i, j; + int16_t tmp_dmx_ch; + + for ( i = 0; i < nchan_transport; i++ ) + { + if ( max_freq_per_chan != NULL ) + { + hMdEnc->spar_md_cfg.max_freq_per_chan[i] = ( max_freq_per_chan[i] != 0 ) ? max_freq_per_chan[i] : max_freq_per_chan[0]; + } + else + { + hMdEnc->spar_md_cfg.max_freq_per_chan[i] = IVAS_SPAR_FOA_DFLT_FREQ_PER_CHAN; + } + } + hMdEnc->num_umx_ch = nchan_inp; + hMdEnc->num_decorr = nchan_inp - 1; + + for ( i = 0; i < IVAS_MAX_NUM_BANDS; i++ ) + { + tmp_dmx_ch = 0; + for ( j = 0; j < nchan_transport; j++ ) + { + if ( pFC[i] < hMdEnc->spar_md_cfg.max_freq_per_chan[j] ) + { + tmp_dmx_ch += 1; + } + } + + hMdEnc->spar_md_cfg.num_dmx_chans_per_band[i] = tmp_dmx_ch; + hMdEnc->spar_md_cfg.num_decorr_per_band[i] = hMdEnc->num_umx_ch - tmp_dmx_ch; + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_band_limit_dmx_matrix() + * + * Band limit downmix matrix + *-----------------------------------------------------------------------------------------*/ + +static void ivas_band_limit_dmx_matrix( + ivas_spar_md_enc_state_t *hMdEnc, /* i/o: SPAR MD encoder handle */ + const int16_t num_ch, + const int16_t num_bands, + const int16_t bands_bw ) +{ + int16_t i, j, b, ndm; + + for ( b = 0; b < num_bands; b++ ) + { + ndm = hMdEnc->spar_md_cfg.num_dmx_chans_per_band[b * bands_bw]; + + for ( i = ndm; i < num_ch; i++ ) + { + for ( j = 0; j < num_ch; j++ ) + { + hMdEnc->mixer_mat[i][j][b] = 0; + } + } + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_band_mixing() + * + * Band mixing downmix matrix + *-----------------------------------------------------------------------------------------*/ + +static void ivas_band_mixing( + ivas_spar_md_enc_state_t *hMdEnc, /* i/o: SPAR MD encoder handle */ + const int16_t num_ch, + const int16_t num_bands, + const int16_t nchan_transport, + const int16_t upmixed_bands ) +{ + int16_t i, j, k, b; + int16_t red_band_fact; + + red_band_fact = upmixed_bands / num_bands; + + for ( i = 0; i < nchan_transport; i++ ) + { + for ( j = 0; j < num_ch; j++ ) + { + for ( k = num_bands - 1; k >= 0; k-- ) + { + for ( b = red_band_fact - 1; b >= 0; b-- ) + { + hMdEnc->mixer_mat[i][j][red_band_fact * k + b] = hMdEnc->mixer_mat[i][j][k]; + } + } + for ( k = red_band_fact * num_bands; k < upmixed_bands; k++ ) + { + hMdEnc->mixer_mat[i][j][k] = hMdEnc->mixer_mat[i][j][( red_band_fact * num_bands ) - 1]; + } + } + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function write_metadata_buffer() + * + * + *-----------------------------------------------------------------------------------------*/ + +static void write_metadata_buffer( + BSTR_ENC_HANDLE hMetaData_tmp, + BSTR_ENC_HANDLE hMetaData, + const int16_t bit_pos_start, + const int16_t next_ind_start ) +{ + int16_t i; + + if ( hMetaData->nb_bits_tot > 0 ) + { + restore_metadata_buffer( hMetaData, next_ind_start, bit_pos_start ); + } + + for ( i = 0; i < hMetaData_tmp->nb_ind_tot; i++ ) + { + push_next_indice( hMetaData, hMetaData_tmp->ind_list[i].value, hMetaData_tmp->ind_list[i].nb_bits ); + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_spar_md_enc_process() + * + * SPAR FoA Meta Data generation process + *-----------------------------------------------------------------------------------------*/ + +ivas_error ivas_spar_md_enc_process( + ivas_spar_md_enc_state_t *hMdEnc, /* i/o: SPAR MD encoder handle */ + const ENCODER_CONFIG_HANDLE hEncoderConfig, /* i : configuration structure */ + float *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], + float *cov_dtx_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], + BSTR_ENC_HANDLE hMetaData, /* i/o: MetaData handle */ + const int16_t dtx_vad, + const int16_t nchan_inp, + const int16_t sba_order, /* i : Ambisonic (SBA) order */ + float *prior_mixer[IVAS_MAX_FB_MIXER_OUT_CH][IVAS_MAX_SPAR_FB_MIXER_IN_CH], /* i : prior mixer_matrix */ + const int16_t dyn_active_w_flag, /* i : flag to indicate dynamic active W */ + const int16_t dirac_mono_flag /* i : flag to indicate mono only mode in SBA */ +) +{ + float pred_coeffs_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS]; + float dm_fv_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS]; + int16_t i, j, b, qsi, ndm, ndec, num_ch, num_quant_strats; + float pred_coeffs_re_local[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS]; + int16_t k, bwidth, num_bands, num_bands_full, num_bands_bw; + int16_t active_w, nchan_transport, dmx_switch, strat; + int16_t nB, bands_bw, packed_ok = 0; + ivas_strats_t cs[MAX_CODING_STRATS]; + int16_t code_strat; + int16_t bit_pos_start, next_ind_start; + BSTR_ENC_DATA hMetaData_tmp; + Indice *ind_list_tmp; + int16_t md_indices_allocated; + int16_t max_num_indices_tmp; + float Wscale[IVAS_MAX_NUM_BANDS]; + + /*extra 16 bits for arithmetic coder as overshoot check is after a symbol is written*/ + md_indices_allocated = hMdEnc->spar_md_cfg.max_bits_per_blk + IVAS_SPAR_ARITH_OVERSHOOT_BITS; + if ( ( ind_list_tmp = (Indice *) malloc( sizeof( Indice ) * md_indices_allocated ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD encoder indices" ); + } + + num_quant_strats = hMdEnc->spar_md_cfg.num_quant_strats; + num_ch = ivas_sba_get_nchan_metadata( sba_order, hEncoderConfig->ivas_total_brate ); + active_w = ( hMdEnc->spar_md_cfg.active_w == 1 ) || ( dyn_active_w_flag == 1 ); + nchan_transport = hMdEnc->spar_md_cfg.nchan_transport; + + bwidth = ivas_get_bw_idx_from_sample_rate( hEncoderConfig->input_Fs ); + bwidth = min( bwidth, hEncoderConfig->max_bwidth ); + int16_t active_w_vlbr; + active_w_vlbr = ( hEncoderConfig->ivas_total_brate < IVAS_24k4 ) ? 1 : 0; + num_bands = ivas_get_num_bands_from_bw_idx( SPAR_CONFIG_BW ); + if ( hMdEnc->spar_hoa_md_flag == 0 ) + { + num_bands = min( num_bands, SPAR_DIRAC_SPLIT_START_BAND ); + } + num_bands_full = num_bands; + num_bands_bw = ivas_get_num_bands_from_bw_idx( bwidth ); + + if ( dtx_vad == 0 ) + { + for ( i = 0; i < nchan_inp; i++ ) + { + for ( j = 0; j < nchan_inp; j++ ) + { + cov_real[i][j] = cov_dtx_real[i][j]; + } + } + } + + for ( i = 0; i < nchan_inp; i++ ) + { + for ( j = 0; j < nchan_inp; j++ ) + { + for ( k = num_bands_bw; k < IVAS_MAX_NUM_BANDS; k++ ) + { + cov_real[i][j][k] = 0; + } + } + } + + if ( hEncoderConfig->ivas_total_brate == BRATE_SPAR_Q_STRAT && sba_order == SBA_FOA_ORDER ) + { + /* make sure that qsi is always 0 (temporary bits are '00') */ + num_quant_strats = 1; + } + + hMetaData_tmp.ind_list = ind_list_tmp; + hMetaData_tmp.nb_bits_tot = 0; + max_num_indices_tmp = MAX_BITS_METADATA; + hMetaData_tmp.ivas_max_num_indices = &max_num_indices_tmp; + hMetaData_tmp.ivas_ind_list_zero = (Indice **) ( &hMetaData_tmp.ind_list ); + hMetaData_tmp.st_ivas = NULL; + + /* Save state of metadata bitstream buffer */ + bit_pos_start = hMetaData->nb_bits_tot; + next_ind_start = hMetaData->nb_ind_tot; + + dmx_switch = 0; + + if ( dtx_vad == 0 ) + { + nB = SPAR_DTX_BANDS; + bands_bw = num_bands / nB; + + ivas_band_mixer( cov_real, num_ch, &num_bands, bands_bw ); + } + else if ( hEncoderConfig->ivas_total_brate < IVAS_24k4 ) + { + bands_bw = 2; + nB = num_bands / bands_bw; + + ivas_band_mixer( cov_real, num_ch, &num_bands, bands_bw ); + } + else + { + nB = num_bands; + bands_bw = 1; + } + if ( hMdEnc->spar_hoa_md_flag && hMdEnc->spar_hoa_dirac2spar_md_flag ) + { + for ( b = SPAR_DIRAC_SPLIT_START_BAND; b < num_bands; b++ ) + { + for ( i = 0; i < DIRAC_TO_SPAR_HBR_PRED_CHS; i++ ) + { + pred_coeffs_re_local[i][b] = hMdEnc->spar_md.band_coeffs[b].pred_re[i]; + } + } + } + + ivas_compute_spar_params( cov_real, dm_fv_re, 0, hMdEnc->mixer_mat, 0, nB, dtx_vad, num_ch, bands_bw, active_w, active_w_vlbr, &hMdEnc->spar_md_cfg, &hMdEnc->spar_md, Wscale, 0, dyn_active_w_flag ); + + if ( dirac_mono_flag ) + { + int16_t i_ts; + int16_t num_md_sub_frames = 1; + + ndec = hMdEnc->spar_md_cfg.num_decorr_per_band[0]; + ndm = hMdEnc->spar_md_cfg.num_dmx_chans_per_band[0]; + + for ( i_ts = 0; i_ts < num_md_sub_frames; i_ts++ ) + { + for ( b = 0; b < IVAS_MAX_NUM_BANDS; b++ ) + { + for ( j = 0; j < ndm + ndec - 1; j++ ) + { + hMdEnc->spar_md.band_coeffs[b + i_ts * IVAS_MAX_NUM_BANDS].pred_re[j] = 0.0f; + } + for ( j = 0; j < ndec; j++ ) + { + for ( k = 0; k < ndm - 1; k++ ) + { + hMdEnc->spar_md.band_coeffs[b + i_ts * IVAS_MAX_NUM_BANDS].C_re[j][k] = 0.0f; + } + } + + for ( j = 0; j < ndec; j++ ) + { + hMdEnc->spar_md.band_coeffs[b + i_ts * IVAS_MAX_NUM_BANDS].P_re[j] = 0.0f; + } + } + } + } + + for ( i = 0; i < num_ch; i++ ) + { + for ( j = 0; j < num_ch; j++ ) + { + for ( b = 0; b < num_bands; b++ ) + { + hMdEnc->mixer_mat_local[i][j][b] = hMdEnc->mixer_mat[i][j][b]; + } + } + } + code_strat = 0; + for ( qsi = 0; qsi < num_quant_strats; qsi++ ) + { + for ( b = 0; b < num_bands; b++ ) + { + ndm = hMdEnc->spar_md_cfg.num_dmx_chans_per_band[b * bands_bw]; + ndec = hMdEnc->spar_md_cfg.num_decorr_per_band[b * bands_bw]; + + if ( dtx_vad == 1 ) + { + if ( ndm != num_ch ) + { + ivas_quant_p_per_band( &hMdEnc->spar_md.band_coeffs[b], &hMdEnc->spar_md.band_coeffs_idx[b], &hMdEnc->spar_md_cfg.quant_strat[qsi], num_ch ); + } + ivas_quant_pred_coeffs_per_band( &hMdEnc->spar_md.band_coeffs[b], &hMdEnc->spar_md.band_coeffs_idx[b], &hMdEnc->spar_md_cfg.quant_strat[qsi], num_ch ); + if ( active_w_vlbr ) + { + for ( i = 0; i < 3; i++ ) + { + int16_t i2; + i2 = 0; + switch ( i ) /* PRED (Y,Z,X) and DECD (Y,X,Z) coeffs are in different orders */ + { + case 0: + i2 = 0; + break; + case 1: + i2 = 2; + break; + case 2: + i2 = 1; + break; + } + if ( ( hMdEnc->spar_md.band_coeffs_idx[b].pred_index_re[i] == 0 ) && ( hMdEnc->spar_md.band_coeffs_idx[b].decd_index_re[i2] == 0 ) && ( hMdEnc->spar_md.band_coeffs[b].pred_re[i] != 0.0f ) && ( cov_real[i + 1][i + 1][b] != 0.0f ) ) + { + /* bump up the Pred coeff */ + float PR_uq, PR_step; + ivas_quant_strat_t qs; + qs = hMdEnc->spar_md_cfg.quant_strat[qsi]; + PR_uq = hMdEnc->spar_md.band_coeffs[b].pred_re[i]; + PR_step = ( qs.PR.max - qs.PR.min ) / ( qs.PR.q_levels[0] - 1 ); + + int16_t PR_sign; + PR_sign = ( PR_uq > 0 ) - ( PR_uq < 0 ); + + hMdEnc->spar_md.band_coeffs_idx[b].pred_index_re[i] = PR_sign; + + /* deindex the modified coefficient */ + hMdEnc->spar_md.band_coeffs[b].pred_quant_re[i] = PR_sign * PR_step; + } + } + } + } + else + { + if ( ndm != num_ch ) + { + ivas_quant_p_per_band_dtx( hMdEnc->spar_md.band_coeffs[b].P_re, ndec, ndm, &hMdEnc->spar_md.band_coeffs_idx[b].decd_index_re[0], hMdEnc->spar_md.band_coeffs[b].P_quant_re, num_ch ); + } + + for ( i = 0; i < num_ch - 1; i++ ) + { + hMdEnc->spar_md.band_coeffs[b].pred_quant_re[i] = 0; + } + ivas_spar_quant_pred_coeffs_dtx( &hMdEnc->spar_md, hMdEnc->spar_md.band_coeffs[b].pred_re, ndm, hMdEnc->spar_md.band_coeffs_idx[b].pred_index_re, num_ch - 1, hMdEnc->spar_md.band_coeffs[b].pred_quant_re ); + } + } + + for ( i = 0; i < num_ch - 1; i++ ) + { + for ( b = 0; b < num_bands; b++ ) + { + pred_coeffs_re[i][b] = Wscale[b] * hMdEnc->spar_md.band_coeffs[b].pred_quant_re[i]; + } + } + + if ( hMdEnc->spar_hoa_md_flag && hMdEnc->spar_hoa_dirac2spar_md_flag ) + { + for ( b = SPAR_DIRAC_SPLIT_START_BAND; b < num_bands; b++ ) + { + for ( i = 0; i < DIRAC_TO_SPAR_HBR_PRED_CHS; i++ ) + { + /* Use the prediction coeffs computed based on DirAC MD to generate mixer matrix */ + pred_coeffs_re[i][b] = pred_coeffs_re_local[i][b]; + hMdEnc->spar_md.band_coeffs[b].pred_quant_re[i] = 0; + hMdEnc->spar_md.band_coeffs_idx[b].pred_index_re[i] = 0; + } + } + } + + ivas_create_fullr_dmx_mat( pred_coeffs_re, dm_fv_re, hMdEnc->mixer_mat, num_ch, 0, num_bands, active_w, &hMdEnc->spar_md_cfg ); + + for ( b = 0; b < num_bands; b++ ) + { + ndm = hMdEnc->spar_md_cfg.num_dmx_chans_per_band[b * bands_bw]; + ndec = hMdEnc->spar_md_cfg.num_decorr_per_band[b * bands_bw]; + + for ( i = 0; i < num_ch; i++ ) + { + hMdEnc->mixer_mat[0][i][b] *= Wscale[b]; + } + + if ( ( ndm != num_ch ) && ( ndm != 1 ) ) + { + ivas_calc_c_p_coeffs( &hMdEnc->spar_md, cov_real, 0, hMdEnc->mixer_mat, num_ch, ndm, b, dtx_vad, 0, dyn_active_w_flag ); + + if ( dirac_mono_flag ) + { + ndec = hMdEnc->spar_md_cfg.num_decorr_per_band[0]; + ndm = hMdEnc->spar_md_cfg.num_dmx_chans_per_band[0]; + for ( j = 0; j < ndec; j++ ) + { + for ( k = 0; k < ndm - 1; k++ ) + { + hMdEnc->spar_md.band_coeffs[b].C_re[j][k] = 0.0f; + } + } + } + + ivas_quant_c_per_band( &hMdEnc->spar_md.band_coeffs[b], &hMdEnc->spar_md.band_coeffs_idx[b], + &hMdEnc->spar_md_cfg.quant_strat[qsi], ndec, ndm ); + } + } + + /* band limit downmix matrix */ + ivas_band_limit_dmx_matrix( hMdEnc, num_ch, num_bands, bands_bw ); + + /* band mixing */ + if ( bands_bw > 1 ) + { + ivas_band_mixing( hMdEnc, num_ch, num_bands, nchan_transport, num_bands_full ); + } + + if ( dtx_vad == 0 ) + { + ivas_write_parameter_bitstream_dtx( &hMdEnc->spar_md, hMetaData, hMdEnc->spar_md_cfg.num_dmx_chans_per_band, hMdEnc->spar_md_cfg.num_decorr_per_band, num_bands ); + break; + } + + ivas_select_next_strat( hMdEnc->spar_md_cfg.prior_strat, cs, dmx_switch, dtx_vad ); + + for ( i = 0; i < MAX_CODING_STRATS; i++ ) + { + strat = cs[i]; + if ( strat != NO_STRAT ) + { + reset_indices_enc( &hMetaData_tmp, md_indices_allocated ); + + ivas_write_spar_md_bitstream( hMdEnc, num_bands, bands_bw, &hMetaData_tmp, hEncoderConfig->ivas_total_brate, strat, qsi ); + + /*write to main buffer if its a valid bitstream*/ + if ( hMetaData_tmp.nb_bits_tot > 0 ) + { + if ( hMetaData->nb_bits_tot == bit_pos_start || hMetaData_tmp.nb_bits_tot < ( hMetaData->nb_bits_tot - bit_pos_start ) ) + { + write_metadata_buffer( &hMetaData_tmp, hMetaData, bit_pos_start, next_ind_start ); + code_strat = strat; + } + + if ( hMetaData->nb_bits_tot - bit_pos_start + ( ( ( hEncoderConfig->ivas_total_brate == IVAS_256k ) && ( sba_order == SBA_FOA_ORDER ) ) ? 1 : 0 ) <= hMdEnc->spar_md_cfg.tgt_bits_per_blk ) + { + packed_ok = 1; + break; + } + } + } + } + + if ( packed_ok == 1 ) + { + break; + } + + /*only if valid bitstream was written to main buffer*/ + if ( hMetaData->nb_bits_tot > bit_pos_start ) + { + if ( hMetaData->nb_bits_tot - bit_pos_start + ( ( ( hEncoderConfig->ivas_total_brate == IVAS_256k ) && ( sba_order == SBA_FOA_ORDER ) ) ? 1 : 0 ) <= hMdEnc->spar_md_cfg.max_bits_per_blk ) + { + packed_ok = 1; + break; + } + } + } + + + /* Reuse mixer matrix values for unsent bands */ + if ( ( hEncoderConfig->ivas_total_brate < IVAS_24k4 ) && ( code_strat > 3 ) ) + { + for ( b = 0; b < num_bands * bands_bw; b += 2 * bands_bw ) + { + if ( ( b == 0 ) && ( code_strat % 2 == 0 ) ) + { + b += 2; + } + for ( i = 0; i < 1; i++ ) + { + for ( j = 0; j < 4; j++ ) + { + hMdEnc->mixer_mat[i][j][b] = prior_mixer[i][j][b]; + hMdEnc->mixer_mat[i][j][b + 1] = prior_mixer[i][j][b + 1]; + } + } + } + } + + ivas_store_prior_coeffs( hMdEnc, num_bands, code_strat, dtx_vad, qsi ); + + hMdEnc->spar_md.dtx_vad = dtx_vad; + hMdEnc->spar_md.num_bands = num_bands; + + free( ind_list_tmp ); + + return IVAS_ERR_OK; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_band_mixer() + * + * band mixer + *-----------------------------------------------------------------------------------------*/ + +static void ivas_band_mixer( + float *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], + const int16_t num_ch, + int16_t *num_bands, + int16_t red_band_fact ) +{ + int16_t i, j, k, b, orig_band, rem_band; + float avg_cov; + + orig_band = *num_bands; + *num_bands /= red_band_fact; + rem_band = orig_band - ( *num_bands * red_band_fact ); + + for ( i = 0; i < num_ch; i++ ) + { + for ( j = 0; j < num_ch; j++ ) + { + for ( k = 0; k < *num_bands - 1; k++ ) + { + avg_cov = 0.0f; + for ( b = 0; b < red_band_fact; b++ ) + { + avg_cov += cov_real[i][j][red_band_fact * k + b]; + } + cov_real[i][j][k] = avg_cov; + } + + avg_cov = 0.0f; + for ( b = 0; b < red_band_fact + rem_band; b++ ) + { + avg_cov += cov_real[i][j][red_band_fact * ( *num_bands - 1 ) + b]; + } + + cov_real[i][j][*num_bands - 1] = avg_cov; + } + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_write_spar_md_bitstream() + * + * Write MD parameters into bitstream + *-----------------------------------------------------------------------------------------*/ + +static void ivas_write_spar_md_bitstream( + ivas_spar_md_enc_state_t *hMdEnc, + const int16_t nB, + const int16_t bands_bw, + BSTR_ENC_HANDLE hMetaData, + const int32_t ivas_total_brate, + const int16_t strat, + const int16_t qsi ) +{ + int16_t no_ec, i; + int16_t do_diff[IVAS_MAX_NUM_BANDS]; + int16_t entropy_coding_result; + + if ( strat == NO_STRAT ) + { + return; + } + + /* write quant strat */ + if ( ivas_total_brate >= BRATE_SPAR_Q_STRAT ) + { + push_next_indice( hMetaData, qsi >> 1, hMdEnc->spar_md_cfg.quant_strat_bits - 1 ); + } + else + { + push_next_indice( hMetaData, qsi, hMdEnc->spar_md_cfg.quant_strat_bits ); + } + + no_ec = 0; + + if ( ivas_total_brate < IVAS_24k4 ) + { + switch ( strat ) + { + case BASE: + push_next_indice( hMetaData, bands_bw - 1, SPAR_NUM_CODING_STRAT_BITS ); + break; + case BASE_NOEC: + push_next_indice( hMetaData, bands_bw + 1, SPAR_NUM_CODING_STRAT_BITS ); + no_ec = 1; + break; + case FOUR_A: + case FOUR_C: + case FOUR_B: + case FOUR_D: + push_next_indice( hMetaData, strat, SPAR_NUM_CODING_STRAT_BITS ); + break; + } + /* for LBR SBA 40MS MD never do time diff */ + for ( i = 0; i < nB; i++ ) + { + do_diff[i] = 0; + } + } + else + { + switch ( strat ) + { + case BASE: + push_next_indice( hMetaData, bands_bw - 1, SPAR_NUM_CODING_STRAT_BITS ); + for ( i = 0; i < nB; i++ ) + { + do_diff[i] = 0; + } + break; + case BASE_NOEC: + push_next_indice( hMetaData, bands_bw + 1, SPAR_NUM_CODING_STRAT_BITS ); + for ( i = 0; i < nB; i++ ) + { + do_diff[i] = 0; + } + no_ec = 1; + break; + case FOUR_A: + push_next_indice( hMetaData, 4, SPAR_NUM_CODING_STRAT_BITS ); + for ( i = 0; i < nB; i++ ) + { + do_diff[i] = ( ( ( i + 1 ) & 3 ) != 0 ); + } + ivas_map_prior_coeffs_quant( &hMdEnc->spar_md_prior, &hMdEnc->spar_md_cfg, qsi, nB ); + break; + case FOUR_B: + push_next_indice( hMetaData, 5, SPAR_NUM_CODING_STRAT_BITS ); + for ( i = 0; i < nB; i++ ) + { + do_diff[i] = ( ( ( i + 1 ) & 3 ) != 1 ); + } + ivas_map_prior_coeffs_quant( &hMdEnc->spar_md_prior, &hMdEnc->spar_md_cfg, qsi, nB ); + break; + case FOUR_C: + push_next_indice( hMetaData, 6, SPAR_NUM_CODING_STRAT_BITS ); + for ( i = 0; i < nB; i++ ) + { + do_diff[i] = ( ( ( i + 1 ) & 3 ) != 2 ); + } + ivas_map_prior_coeffs_quant( &hMdEnc->spar_md_prior, &hMdEnc->spar_md_cfg, qsi, nB ); + break; + case FOUR_D: + push_next_indice( hMetaData, 7, SPAR_NUM_CODING_STRAT_BITS ); + for ( i = 0; i < nB; i++ ) + { + do_diff[i] = ( ( ( i + 1 ) & 3 ) != 3 ); + } + ivas_map_prior_coeffs_quant( &hMdEnc->spar_md_prior, &hMdEnc->spar_md_cfg, qsi, nB ); + break; + } + } + + if ( no_ec == 1 ) + { + entropy_coding_result = + ivas_get_huffman_coded_bs( hMdEnc, hMetaData, nB, qsi, + bands_bw ); + } + else + { + entropy_coding_result = + ivas_get_arith_coded_bs( hMdEnc, hMetaData, do_diff, bands_bw, nB, qsi, + strat, ivas_total_brate ); + } + + if ( entropy_coding_result < 0 ) + { + hMetaData->nb_bits_tot = 0; + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_get_huffman_coded_bs() + * + * Generate huffman coded bitstream + *-----------------------------------------------------------------------------------------*/ +static int16_t ivas_get_huffman_coded_bs( + ivas_spar_md_enc_state_t *hMdEnc, + BSTR_ENC_HANDLE hMetaData, + const int16_t nB, + const int16_t qsi, + const int16_t bands_bw ) +{ + int16_t i, j; + int16_t pred_coeff_dim, pred_offset; + + for ( i = 0; i < nB; i++ ) + { + int16_t code, len; + int16_t ndm, ndec; + ndm = hMdEnc->spar_md_cfg.num_dmx_chans_per_band[i * bands_bw]; + ndec = hMdEnc->spar_md_cfg.num_decorr_per_band[i * bands_bw]; + + pred_coeff_dim = ndm + ndec - 1; + pred_offset = 0; + if ( hMdEnc->spar_hoa_md_flag && hMdEnc->spar_hoa_dirac2spar_md_flag ) + { + if ( i >= SPAR_DIRAC_SPLIT_START_BAND ) + { + pred_offset = DIRAC_TO_SPAR_HBR_PRED_CHS; + } + } + + for ( j = pred_offset; j < pred_coeff_dim; j++ ) + { + ivas_huffman_encode( &hMdEnc->huff_coeffs.pred_huff_re[qsi], hMdEnc->spar_md.band_coeffs_idx[i].pred_index_re[j], &code, &len ); + if ( ( hMetaData->nb_bits_tot + len ) > hMdEnc->spar_md_cfg.max_bits_per_blk ) + { + return -1; + } + push_next_indice( hMetaData, code, len ); + } + + for ( j = 0; j < ndec * ( ndm - 1 ); j++ ) + { + ivas_huffman_encode( &hMdEnc->huff_coeffs.drct_huff_re[qsi], hMdEnc->spar_md.band_coeffs_idx[i].drct_index_re[j], &code, &len ); + if ( ( hMetaData->nb_bits_tot + len ) > hMdEnc->spar_md_cfg.max_bits_per_blk ) + { + return -1; + } + push_next_indice( hMetaData, code, len ); + } + + for ( j = 0; j < ndec; j++ ) + { + ivas_huffman_encode( &hMdEnc->huff_coeffs.decd_huff_re[qsi], hMdEnc->spar_md.band_coeffs_idx[i].decd_index_re[j], &code, &len ); + if ( ( hMetaData->nb_bits_tot + len ) > hMdEnc->spar_md_cfg.max_bits_per_blk ) + { + return -1; + } + push_next_indice( hMetaData, code, len ); + } + } + + return 0; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_get_arith_coded_bs() + * + * Generate arithmetic coded bitstream + *-----------------------------------------------------------------------------------------*/ +static int16_t ivas_get_arith_coded_bs( + ivas_spar_md_enc_state_t *hMdEnc, + BSTR_ENC_HANDLE hMetaData, + const int16_t *pDo_diff, + const int16_t bands_bw, + const int16_t nB, + const int16_t qsi, + const int16_t strat, + const int32_t ivas_total_brate ) +{ + int16_t i, any_diff; + int16_t j; + ivas_cell_dim_t pred_cell_dims[IVAS_MAX_NUM_BANDS]; + ivas_cell_dim_t drct_cell_dims[IVAS_MAX_NUM_BANDS]; + ivas_cell_dim_t decd_cell_dims[IVAS_MAX_NUM_BANDS]; + ivas_cell_dim_t decx_cell_dims[IVAS_MAX_NUM_BANDS]; + int16_t symbol_arr_re[IVAS_MAX_INPUT_LEN]; + int16_t symbol_arr_old_re[IVAS_MAX_INPUT_LEN]; + int16_t arith_result; + + for ( i = 0; i < nB; i++ ) + { + int16_t ndm, ndec; + ndm = hMdEnc->spar_md_cfg.num_dmx_chans_per_band[bands_bw * i]; + ndec = hMdEnc->spar_md_cfg.num_decorr_per_band[bands_bw * i]; + + if ( ( ivas_total_brate < IVAS_24k4 ) && ( strat > 3 ) && ( ( ( i % 2 == 1 ) && ( strat % 2 == 0 ) ) || ( ( i % 2 == 0 ) && ( strat % 2 == 1 ) ) ) ) + { + pred_cell_dims[i].dim1 = 0; + pred_cell_dims[i].dim2 = 0; + drct_cell_dims[i].dim1 = 0; + drct_cell_dims[i].dim2 = 0; + decd_cell_dims[i].dim1 = 0; + decd_cell_dims[i].dim2 = 0; + decx_cell_dims[i].dim1 = 0; + decx_cell_dims[i].dim2 = 0; + } + else + { + pred_cell_dims[i].dim1 = ndm + ndec - 1; + if ( hMdEnc->spar_hoa_md_flag && hMdEnc->spar_hoa_dirac2spar_md_flag ) + { + if ( i >= SPAR_DIRAC_SPLIT_START_BAND ) + { + pred_cell_dims[i].dim1 -= ( FOA_CHANNELS - 1 ); + } + } + pred_cell_dims[i].dim2 = 1; + drct_cell_dims[i].dim1 = ndec; + drct_cell_dims[i].dim2 = ndm - 1; + decd_cell_dims[i].dim1 = ndec; + decd_cell_dims[i].dim2 = 1; + decx_cell_dims[i].dim1 = ( ndec * ( ndec - 1 ) ) >> 1; + decx_cell_dims[i].dim2 = 1; + } + } + + any_diff = 0; + for ( i = 0; i < nB; i++ ) + { + if ( pDo_diff[i] != 0 ) + { + any_diff = 1; + break; + } + } + if ( hMdEnc->spar_hoa_md_flag && hMdEnc->spar_hoa_dirac2spar_md_flag ) + { + for ( i = 0; i < nB; i++ ) + { + if ( i >= SPAR_DIRAC_SPLIT_START_BAND ) + { + for ( j = 0; j < pred_cell_dims[i].dim1; j++ ) + { + hMdEnc->spar_md.band_coeffs_idx[i].pred_index_re[j] = + hMdEnc->spar_md.band_coeffs_idx[i].pred_index_re[j + DIRAC_TO_SPAR_HBR_PRED_CHS]; + + if ( any_diff == 1 ) + { + hMdEnc->spar_md_prior.band_coeffs_idx_mapped[i].pred_index_re[j] = + hMdEnc->spar_md_prior.band_coeffs_idx_mapped[i].pred_index_re[j + DIRAC_TO_SPAR_HBR_PRED_CHS]; + } + } + } + } + } + ivas_copy_band_coeffs_idx_to_arr( hMdEnc->spar_md.band_coeffs_idx, nB, symbol_arr_re, pred_cell_dims, PRED_COEFF ); + + if ( any_diff == 1 ) + { + ivas_copy_band_coeffs_idx_to_arr( hMdEnc->spar_md_prior.band_coeffs_idx_mapped, nB, symbol_arr_old_re, pred_cell_dims, PRED_COEFF ); + } + + arith_result = ivas_arith_encode_cmplx_cell_array( &hMdEnc->arith_coeffs.pred_arith_re[qsi], &hMdEnc->arith_coeffs.pred_arith_re_diff[qsi], pDo_diff, nB, + symbol_arr_re, symbol_arr_old_re, pred_cell_dims, hMetaData, any_diff, hMdEnc->spar_md_cfg.max_bits_per_blk ); + if ( arith_result < 0 ) + { + return -1; + } + + if ( hMdEnc->spar_hoa_md_flag && hMdEnc->spar_hoa_dirac2spar_md_flag ) + { + for ( i = 0; i < nB; i++ ) + { + if ( i >= SPAR_DIRAC_SPLIT_START_BAND ) + { + for ( j = pred_cell_dims[i].dim1 - 1; j >= 0; j-- ) + { + hMdEnc->spar_md.band_coeffs_idx[i].pred_index_re[j + DIRAC_TO_SPAR_HBR_PRED_CHS] = + hMdEnc->spar_md.band_coeffs_idx[i].pred_index_re[j]; + } + for ( j = 0; j < DIRAC_TO_SPAR_HBR_PRED_CHS; j++ ) + { + hMdEnc->spar_md.band_coeffs_idx[i].pred_index_re[j] = 0; + } + } + } + } + + ivas_copy_band_coeffs_idx_to_arr( hMdEnc->spar_md.band_coeffs_idx, nB, symbol_arr_re, drct_cell_dims, DRCT_COEFF ); + + if ( any_diff == 1 ) + { + ivas_copy_band_coeffs_idx_to_arr( hMdEnc->spar_md_prior.band_coeffs_idx_mapped, nB, symbol_arr_old_re, drct_cell_dims, DRCT_COEFF ); + } + + + arith_result = ivas_arith_encode_cmplx_cell_array( &hMdEnc->arith_coeffs.drct_arith_re[qsi], &hMdEnc->arith_coeffs.drct_arith_re_diff[qsi], pDo_diff, nB, + symbol_arr_re, symbol_arr_old_re, drct_cell_dims, hMetaData, any_diff, hMdEnc->spar_md_cfg.max_bits_per_blk ); + if ( arith_result < 0 ) + { + return -1; + } + + ivas_copy_band_coeffs_idx_to_arr( hMdEnc->spar_md.band_coeffs_idx, nB, symbol_arr_re, decd_cell_dims, DECD_COEFF ); + + if ( any_diff == 1 ) + { + ivas_copy_band_coeffs_idx_to_arr( hMdEnc->spar_md_prior.band_coeffs_idx_mapped, nB, symbol_arr_old_re, decd_cell_dims, DECD_COEFF ); + } + + arith_result = ivas_arith_encode_cmplx_cell_array( &hMdEnc->arith_coeffs.decd_arith_re[qsi], &hMdEnc->arith_coeffs.decd_arith_re_diff[qsi], pDo_diff, nB, + symbol_arr_re, symbol_arr_old_re, decd_cell_dims, hMetaData, any_diff, hMdEnc->spar_md_cfg.max_bits_per_blk ); + if ( arith_result < 0 ) + { + return -1; + } + + ivas_copy_band_coeffs_idx_to_arr( hMdEnc->spar_md.band_coeffs_idx, nB, symbol_arr_re, decx_cell_dims, DECX_COEFF ); + + if ( any_diff == 1 ) + { + ivas_copy_band_coeffs_idx_to_arr( hMdEnc->spar_md_prior.band_coeffs_idx_mapped, nB, symbol_arr_old_re, decx_cell_dims, DECX_COEFF ); + } + + return 0; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_select_next_strat() + * + * Select next strategy + *-----------------------------------------------------------------------------------------*/ + +static void ivas_select_next_strat( + ivas_strats_t prior_strat, + ivas_strats_t cs[MAX_QUANT_STRATS], + const int16_t dmx_switch, + const int16_t dtx_vad ) +{ + cs[0] = BASE; + cs[1] = BASE_NOEC; + if ( dmx_switch == 0 && dtx_vad ) + { + switch ( prior_strat ) + { + case START: + cs[2] = NO_STRAT; + break; + case BASE: + cs[2] = FOUR_A; + break; + case BASE_DIFF: + cs[2] = FOUR_A; + break; + case BASE_NOEC: + cs[2] = FOUR_A; + break; + case FOUR_A: + cs[2] = FOUR_B; + break; + case FOUR_B: + cs[2] = FOUR_C; + break; + case FOUR_C: + cs[2] = FOUR_D; + break; + case FOUR_D: + cs[2] = FOUR_A; + break; + default: + assert( !"bad value of prior_strat" ); + } + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_store_prior_coeffs() + * + * Store prior coeffs + *-----------------------------------------------------------------------------------------*/ + +static void ivas_store_prior_coeffs( + ivas_spar_md_enc_state_t *hMdEnc, + const int16_t num_bands, + const int16_t strat, + const int16_t dtx_vad, + const int16_t qsi ) +{ + int16_t i, j, b; + if ( dtx_vad == 0 ) + { + hMdEnc->spar_md_cfg.prior_strat = START; + } + else + { + hMdEnc->spar_md_cfg.prior_strat = strat; + } + + hMdEnc->spar_md_cfg.prev_quant_idx = qsi; + + for ( i = 0; i < num_bands; i++ ) + { + b = i; + + for ( j = 0; j < IVAS_SPAR_MAX_CH - 1; j++ ) + { + hMdEnc->spar_md_prior.band_coeffs_idx[i].pred_index_re[j] = hMdEnc->spar_md.band_coeffs_idx[b].pred_index_re[j]; + hMdEnc->spar_md_prior.band_coeffs_idx[i].decd_index_re[j] = hMdEnc->spar_md.band_coeffs_idx[b].decd_index_re[j]; + } + for ( j = 0; j < IVAS_SPAR_MAX_C_COEFF; j++ ) + { + hMdEnc->spar_md_prior.band_coeffs_idx[i].drct_index_re[j] = hMdEnc->spar_md.band_coeffs_idx[b].drct_index_re[j]; + } + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_spar_quant_pred_coeffs_dtx() + * + * Calculate quantization pred coeffs + *-----------------------------------------------------------------------------------------*/ + +static void ivas_spar_quant_pred_coeffs_dtx( + ivas_spar_md_t *pSpar_md, + const float *pValues, + const int16_t ndm, + int16_t *pIndex, + const int16_t dim1, + float *pQuant ) +{ + int16_t i; + int16_t q_lvl; + float pr_min_max[2]; + + pr_min_max[0] = pSpar_md->min_max[0]; + pr_min_max[1] = pSpar_md->min_max[1]; + + for ( i = 0; i < dim1; i++ ) + { + q_lvl = dtx_pr_real_q_levels[ndm - 1][i]; + ivas_quantise_real_values( &pValues[i], q_lvl, pr_min_max[0], pr_min_max[1], &pIndex[i], &pQuant[i], 1 ); + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_quant_p_per_band_dtx() + * + * Calculate quantization p + *-----------------------------------------------------------------------------------------*/ + +static void ivas_quant_p_per_band_dtx( + float *pP_mat, + const int16_t num_dec, + const int16_t num_dmx, + int16_t *ppIdx_pd, + float *pP_out, + const int16_t num_ch ) +{ + int16_t i; + int16_t dim = num_ch - num_dmx; + + if ( num_dec == num_ch - 1 ) + { + for ( i = 0; i < dim; i++ ) + { + if ( pP_mat[i] < pr_boost_range[1] && pP_mat[i] > pr_boost_range[0] ) + { + pP_mat[i] = pr_boost_range[1]; + } + } + } + + if ( dim != num_dec ) + { + assert( !"Not Supported!" ); + } + + for ( i = 0; i < dim; i++ ) + { + ivas_quantise_real_values( &pP_mat[i], dtx_pd_real_q_levels[num_ch - num_dec - 1][i], dtx_pd_real_min_max[0], dtx_pd_real_min_max[1], &ppIdx_pd[i], &pP_out[i], 1 ); + } + + return; +} + +/*-----------------------------------------------------------------------------------------* + * Function ivas_write_parameter_bitstream_dtx() + * + * Write MD DTX parameters into bitstream + *-----------------------------------------------------------------------------------------*/ + +static void ivas_write_parameter_bitstream_dtx( + ivas_spar_md_t *pSpar_md, + BSTR_ENC_HANDLE hMetaData, + int16_t *num_dmx, + int16_t *num_dec, + const int16_t num_bands ) +{ + int16_t i, j; + float val; + int16_t idx; + float pr_min_max[2]; + int16_t zero_pad_bits, sid_bits_len; + sid_bits_len = hMetaData->nb_bits_tot; + pr_min_max[0] = pSpar_md->min_max[0]; + pr_min_max[1] = pSpar_md->min_max[1]; + + for ( i = 0; i < num_bands; i++ ) + { + int16_t ndm = num_dmx[i]; + int16_t ndec = num_dec[i]; + + for ( j = 0; j < FOA_CHANNELS - 1; j++ ) + { + int16_t pr, pd; + int16_t pr_q_lvls, pd_q_lvls, pr_pd_bits; + int16_t pr_idx_1, pr_idx_2, pd_idx_1, pd_idx_2; + uint16_t value; + + pr_idx_1 = pr_pr_idx_pairs[ndm - 1][j][0]; + pr_idx_2 = pr_pr_idx_pairs[ndm - 1][j][1]; + pd_idx_1 = pr_pd_idx_pairs[ndm - 1][j][0]; + pd_idx_2 = pr_pd_idx_pairs[ndm - 1][j][1]; + + if ( pr_idx_1 != 0 || pd_idx_1 != 0 || pr_idx_2 != 0 || pd_idx_2 != 0 ) + { + pr_q_lvls = dtx_pr_real_q_levels[ndm - 1][pd_idx_1 - 1]; + pr = pSpar_md->band_coeffs_idx[i].pred_index_re[pd_idx_1 - 1]; + + if ( ( j + 1 ) > ndec ) + { + pd_q_lvls = 1; + pd = 0; + } + else + { + pd_q_lvls = dtx_pd_real_q_levels[ndm - 1][pd_idx_2 - 1]; + pd = pSpar_md->band_coeffs_idx[i].decd_index_re[pd_idx_2 - 1]; + } + val = dtx_pd_real_min_max[0]; + ivas_quantise_real_values( &val, pd_q_lvls, dtx_pd_real_min_max[0], dtx_pd_real_min_max[1], &idx, &val, 1 ); + + pd -= idx; + + val = pr_min_max[0]; + ivas_quantise_real_values( &val, pr_q_lvls, pr_min_max[0], pr_min_max[1], &idx, &val, 1 ); + + pr -= idx; + pr_pd_bits = ivas_get_bits_to_encode( pd_q_lvls * pr_q_lvls ); + + value = (uint16_t) ( pr * pd_q_lvls + pd ); + + push_next_indice( hMetaData, value, pr_pd_bits ); + } + } + } + + sid_bits_len = hMetaData->nb_bits_tot - sid_bits_len; + zero_pad_bits = ( SPAR_DTX_BANDS * SPAR_SID_BITS_TAR_PER_BAND ) - sid_bits_len; + assert( zero_pad_bits >= 0 ); + if ( num_dmx[0] == 2 ) + { + zero_pad_bits -= 1; + } + + while ( zero_pad_bits > 0 ) + { + j = min( zero_pad_bits, 16 ); + push_next_indice( hMetaData, 0, j ); + zero_pad_bits -= j; + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_quant_pred_coeffs_per_band() + * + * Quantization of prediction coefficients + *-----------------------------------------------------------------------------------------*/ + +static void ivas_quant_pred_coeffs_per_band( + ivas_band_coeffs_t *pband_coeffs, + ivas_band_coeffs_ind_t *pBand_coeffs_idx, + ivas_quant_strat_t *pQs, + const int16_t num_ch ) +{ + ivas_quantise_real_values( pband_coeffs->pred_re, pQs->PR.q_levels[0], pQs->PR.min, pQs->PR.max, pBand_coeffs_idx->pred_index_re, pband_coeffs->pred_quant_re, ( num_ch - 1 ) ); + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_quant_c_per_band() + * + * Quantization of cross prediction c coeffs for each band + *-----------------------------------------------------------------------------------------*/ + +static void ivas_quant_c_per_band( + ivas_band_coeffs_t *pband_coeffs, + ivas_band_coeffs_ind_t *pBand_coeffs_idx, + ivas_quant_strat_t *pQs, + const int16_t ndec, + const int16_t ndm ) +{ + int16_t i; + int16_t j, k; + float C_re[IVAS_SPAR_MAX_C_COEFF]; + k = 0; + for ( i = 0; i < ndec; i++ ) + { + for ( j = 0; j < ndm - 1; j++ ) + { + C_re[k] = pband_coeffs->C_re[i][j]; + k++; + } + } + ivas_quantise_real_values( C_re, pQs->C.q_levels[0], pQs->C.min, pQs->C.max, pBand_coeffs_idx->drct_index_re, C_re, ndec * ( ndm - 1 ) ); + k = 0; + for ( i = 0; i < ndec; i++ ) + { + for ( j = 0; j < ndm - 1; j++ ) + { + pband_coeffs->C_quant_re[i][j] = C_re[k]; + k++; + } + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_quant_p_per_band() + * + * Quantization of decorrelation p coeffs for each band + *-----------------------------------------------------------------------------------------*/ + +static void ivas_quant_p_per_band( + ivas_band_coeffs_t *pband_coeffs, + ivas_band_coeffs_ind_t *pBand_coeffs_idx, + ivas_quant_strat_t *pQs, + const int16_t num_ch ) +{ + ivas_quantise_real_values( pband_coeffs->P_re, pQs->P_r.q_levels[0], pQs->P_r.min, pQs->P_r.max, pBand_coeffs_idx->decd_index_re, pband_coeffs->P_quant_re, num_ch - 1 ); + + return; +} diff --git a/lib_enc/ivas_stat_enc.h b/lib_enc/ivas_stat_enc.h new file mode 100644 index 0000000000000000000000000000000000000000..eae9c41dd020fc758c4ca5c1b8182be8c9e9c663 --- /dev/null +++ b/lib_enc/ivas_stat_enc.h @@ -0,0 +1,1231 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#ifndef IVAS_STAT_ENC_H +#define IVAS_STAT_ENC_H + +#include +#include "options.h" +#include "cnst.h" +#include "ivas_cnst.h" +#include "stat_enc.h" +#include "ivas_stat_com.h" + +/*----------------------------------------------------------------------------------* + * DFT Stereo encoder structures + *----------------------------------------------------------------------------------*/ + +typedef struct stereo_itd_data_struct +{ + int16_t prev_itd; + float itd[STEREO_DFT_ENC_DFT_NB]; + float deltaItd[STEREO_DFT_ENC_DFT_NB]; + int16_t td_itd[STEREO_DFT_ENC_DFT_NB]; + int16_t td_itd_32k[STEREO_DFT_ENC_DFT_NB]; + int16_t itd_index[STEREO_DFT_ENC_DFT_NB]; + float xcorr_smooth[STEREO_DFT_N_32k_ENC]; + float lp_phat_peak; /* low-pass GCC PHAT peak value */ + int16_t itd_hangover; /* ITD hangover counter */ + int16_t itd_cnt; /* Consecutive valid ITD counter */ + float prev_sum_nrg_L_lb; + float prev_xcorr_lb[STEREO_DFT_XCORR_LB_MAX]; + float E_band_n[STEREO_DFT_ITD_VAD_BAND_NUM]; + int16_t vad_frm_cnt; + int16_t pre_vad; + int16_t itd_nonzero_cnt; + float acorr_L[STEREO_DFT_BAND_MAX]; + float acorr_R[STEREO_DFT_BAND_MAX]; + float cohSNR; + float itd_thres; + int16_t valid_itd_cnt; /* Extra variable to store value of itd_cnt for fine-control decision making */ + + int16_t detected_itd_flag; + int16_t itd_tracking; + float prev_max; + int16_t prev_index; + float prev_avg_max; + float currFlatness; + + /* Xtalk classifier */ + float prev_m1; + float prev_m2; + int16_t prev_itd1; + int16_t prev_itd2; + + /*flag for hybrid ITD for very large ITDs*/ + int16_t hybrid_itd_max; +} ITD_DATA, *ITD_DATA_HANDLE; + +typedef struct dft_ana_struct +{ + /*Sizes*/ + int16_t N; /* Size of the frame and hop */ + int16_t NFFT; /* Size of the FFT=frame size+overlap */ + + /*FFT*/ + int16_t dft_ovl; /* Overlap size */ + int16_t dft_zp; /* Zero padding */ + + const float *win_ana; /* DFT analysis window */ + const float *dft_trigo; + const float *dft_trigo_32k; + int16_t dft_trigo_step; + +} DFT_ANA, *DFT_ANA_HANDLE; + +/* State of the range encoder */ +typedef struct +{ + uint32_t rc_low; + uint32_t rc_range; + int16_t rc_cache; + int16_t rc_carry; + int16_t rc_carry_count; + + uint8_t byte_buffer[RANGE_UNI_BUFFER_BYTES_MAX]; + int16_t byte_count; + int16_t last_byte_bit_count; + +} RangeUniEncState; + + +typedef struct stereo_dft_enc_data_struct +{ + STEREO_DFT_CONFIG_DATA_HANDLE hConfig; + + /*Sizes*/ + int16_t N; /* Size of the frame and hop */ + int16_t NFFT; /* Size of the FFT=frame size+overlap */ + + /*FFT*/ + float DFT[CPE_CHANNELS][STEREO_DFT_N_MAX_ENC]; + int16_t dft_ovl; /* Overlap size */ + int16_t dft_zp; /* Zero padding */ + + const float *win; /* DFT window */ + const float *win_8k; /* DFT window */ + const float *win_12k8; /* DFT window */ + const float *win_16k; /* DFT window */ + const float *win_32k; /* DFT window */ + + const float *win_ana; /* DFT analysis window */ + const float *win_ana_8k; /* DFT analysis window */ + const float *win_ana_12k8; /* DFT analysis window */ + const float *win_ana_16k; /* DFT analysis window */ + const float *win_ana_32k; /* DFT analysis window */ + + const float *win_mdct_8k; /* DFT analysis window */ + + const float *dft_trigo; + const float *dft_trigo_8k; + const float *dft_trigo_12k8; + const float *dft_trigo_16k; + const float *dft_trigo_32k; + int16_t dft_trigo_step; + + float output_mem_res_8k[STEREO_DFT_OVL_8k]; + + /*I/O channel buffers */ + float output_mem_dmx[STEREO_DFT_OVL_MAX]; + float output_mem_dmx_12k8[STEREO_DFT_OVL_12k8]; + float output_mem_dmx_16k[STEREO_DFT_OVL_16k]; /*can hold 16, 12.8 or 32kHz signals*/ + float output_mem_dmx_32k[STEREO_DFT_OVL_32k]; /*can hold 16, 12.8 or 32kHz signals*/ + float output_mem_dmx_16k_shb[STEREO_DFT_OVL_16k]; + float input_mem_itd[CPE_CHANNELS][STEREO_DFT_OVL_MAX]; + + /*Bands*/ + int16_t band_res[STEREO_DFT_ENC_DFT_NB]; + int16_t band_limits[STEREO_DFT_BAND_MAX + 1]; + int16_t nbands; + int16_t band_limits_dmx[STEREO_DFT_BAND_MAX + 1]; + int16_t nbands_dmx; + + /*Stereo parameters*/ + float past_nrgL[STEREO_DFT_NRG_PAST_LEN * STEREO_DFT_BAND_MAX]; + float past_nrgR[STEREO_DFT_NRG_PAST_LEN * STEREO_DFT_BAND_MAX]; + float past_dot_prod_real[STEREO_DFT_NRG_PAST_LEN * STEREO_DFT_BAND_MAX]; + float past_dot_prod_imag[STEREO_DFT_NRG_PAST_LEN * STEREO_DFT_BAND_MAX]; + int16_t nrg_past_pos; + + /*Side Gain*/ + float side_gain[STEREO_DFT_ENC_DFT_NB * STEREO_DFT_BAND_MAX]; + int16_t side_gain_flag_1; + int16_t side_gain_flag_2; + int16_t side_gain_index_ECDiff[STEREO_DFT_BAND_MAX]; + int16_t side_gain_index_ECprevious[STEREO_DFT_BAND_MAX]; + int16_t side_gain_index_EC[STEREO_DFT_BAND_MAX]; + int16_t side_gain_counter; + float side_gain_bitdiff_lp; + + /* Stereo CNG */ + float sidSideGain[STEREO_DFT_ERB4_BANDS]; + float win_ana_energy; + float xspec_smooth[STEREO_DFT_N_32k_ENC]; + float Spd_L_smooth[STEREO_DFT_N_32k_ENC / 2]; + float Spd_R_smooth[STEREO_DFT_N_32k_ENC / 2]; + float sid_gipd; + int16_t coh_fade_counter; + float prev_sid_gipd; + int16_t prev_sid_no_ipd_flag; + + /*IPD*/ + float gipd[STEREO_DFT_ENC_DFT_NB]; + int16_t gipd_band_max; + int16_t gipd_index; + int16_t no_ipd_flag; /* flag to indicate when group IPD gets used */ + int16_t prev_no_ipd_flag; /* flag from previous frame */ + int16_t no_ipd_cnt; /* counter */ + int16_t no_ipd_cnt1; /* counter */ + int16_t attackPresent; + int16_t wasTransient; + float gainIPD_sm; /* long-term gain IPD for NIPD detection */ + float sfm; + float sum_dot_prod_real; + float sum_dot_prod_img; + float dot_prod_real_smooth[STEREO_DFT_BAND_MAX]; + float dot_prod_img_smooth[STEREO_DFT_BAND_MAX]; + float ipd_buf[STEREO_DFT_BAND_MAX][STEREO_DFT_IPD_BUF_LEN]; + float prev_gipd; + + /*ITD*/ + ITD_DATA_HANDLE hItd; + + float voicing_lt; + + + int16_t currentNumUpdates; + int16_t expectedNumUpdates; /* Expected number of frames before use of ITD estimate */ + int16_t resetFrames; + + /* energy buffers for ICBWE */ + float nrg_L[2]; + float nrg_R[2]; + float nrg_DMX[2]; + + /*Residual prediction*/ + int16_t res_pred_mode[STEREO_DFT_ENC_DFT_NB]; /* mode from 0 (off) to 1 (on) */ + float res_pred_gain[STEREO_DFT_ENC_DFT_NB * STEREO_DFT_BAND_MAX]; /*prediction gain for the residual HFs */ + int16_t res_pred_band_min; /* Band min for prediction of residual */ + int16_t res_pred_flag_1; + int16_t res_pred_flag_2; + int16_t res_pred_counter; + float res_pred_gain_f[STEREO_DFT_BAND_MAX]; + int16_t res_pred_index_EC[STEREO_DFT_BAND_MAX]; + int16_t res_pred_index_ECDiff[STEREO_DFT_BAND_MAX]; + int16_t res_pred_index_ECprevious[STEREO_DFT_BAND_MAX]; + int16_t reverb_flag; + float pre_sub_nrg_DMX[STEREO_DFT_BAND_MAX]; + float diff_l_h_sm; + float diff_r_h_sm; + float prev_fac2; + + /*Residual coding*/ + int16_t res_cod_mode[STEREO_DFT_ENC_DFT_NB]; /* mode from 0 (off) to 3 */ + int16_t res_cod_band_max; /* Band max for coding of residual */ + int16_t res_cod_line_max; /* Maximum number of MDCT lines to code for the residual coding */ + float res_cod_NRG_M[STEREO_DFT_BAND_MAX]; + float res_cod_NRG_S[STEREO_DFT_BAND_MAX]; + float res_cod_SNR_M[STEREO_DFT_BAND_MAX]; + float old_snr; + int16_t first_frm_flag; /* ADAP first frame flag */ + + /* flags and data for adaptive wideband residual coding */ + float res_dmx_ratio_lt; /* long term energy ratio between RES and DMX */ + int16_t hangover_cnt0; /* counter 0 for hangover */ + int16_t hangover_cnt1; /* counter 1 for hangover */ + float dmx_res_all_prev; /* energy of the previous frame */ + int16_t last_res_cod_mode_modify_flag; /* a flag to indicate whether the res_cod_mode_flag has been modified for the switching frame in which res_cod_mode_flag should be swithced from 1 to 0 */ + int16_t res_cod_sw_flag; /* a flag to indicate whether it is a switching frame */ + float switch_fade_factor; /* Adaptive fade factor for switch frame */ + + /*misc*/ + float icbweRefEner; + float lbEner; + int16_t flip_sign; + +} STEREO_DFT_ENC_DATA, *STEREO_DFT_ENC_DATA_HANDLE; + + +/*----------------------------------------------------------------------------------* + * MDCT Stereo encoder structure + *----------------------------------------------------------------------------------*/ + +typedef struct stereo_mdct_enc_data_structure +{ + /* static members */ + STEREO_MDCT_BAND_PARAMETERS stbParamsTCX20; /* stereo frequency band parameters for TCX20 */ + STEREO_MDCT_BAND_PARAMETERS stbParamsTCX10; /* stereo frequency band parameters for TCX10 */ + STEREO_MDCT_BAND_PARAMETERS stbParamsTCX20afterACELP; /* stereo frequency band parameters for transition frames */ + + /* only intraframe */ + int16_t mdct_stereo_mode[2]; /* mdct stereo mode: LR, MS, band-wise MS */ + int16_t global_ild[2]; /* Quantized ILD for the whole spectrum */ + int16_t split_ratio; /* Ratio of bitrate (1 to 7), split_ratio = 8 * 1st chn bitrate / (1st + 2nd chn bitrate) */ + + int16_t IGFStereoMode[2]; /* MDCT stereo mode for IGF */ + + ITD_DATA_HANDLE hItd; + DFT_ANA_HANDLE hDft_ana; + + int16_t sw_uncorr; + + int16_t isSBAStereoMode; + +} STEREO_MDCT_ENC_DATA, *STEREO_MDCT_ENC_DATA_HANDLE; + + +/*----------------------------------------------------------------------------------* + * TD Stereo encoder structure + *----------------------------------------------------------------------------------*/ + +typedef struct stereo_td_enc_data_structure +{ + BSTR_ENC_DATA tdm_hBstr_tmp; /* temporary bitstream structure holding TD stereo spatial parameters */ + Indice tdm_ind_list_tmp[MAX_IND_TDM_TMP]; /* temporary list of indices holding TD stereo spatial parameters */ + int16_t max_ind_tdm_tmp; /* maximum number of indices in the temporary list of indices holding TD stereo spatial parameters */ + + int16_t tdm_lp_reuse_flag; /* Flag that indicate if it is possible to reuse the LP coefficient from the primary channel or not */ + int16_t tdm_low_rate_mode; /* secondary channel low rate mode flag */ + float tdm_Pri_pitch_buf[NB_SUBFR]; + int16_t tdm_Pitch_reuse_flag; + + float tdm_lt_corr_RM; /* Long term right-mono correlation */ + float tdm_lt_corr_LM; /* Long term left-mono correlation */ + float tdm_last_diff_lt_corr; /* long term correlation difference mem */ + float tdm_last_ratio; /* Last TDM ratio */ + + float tdm_lt_rms_L; /* Left channel long term rms */ + float tdm_lt_rms_R; /* Right channel long term rms */ + float tdm_last_ener_lt_R; /* Right channel long term energy */ + float tdm_last_ener_lt_L; /* Left channel long term energy */ + + int16_t tdm_last_ratio_idx; /* last TDM ratio index */ + int16_t tdm_last_SM_flag; /* Flag to signal a SM encoding scheme -> better for some music item */ + int16_t tdm_ratio_transition_mov_flag; /* Flag that indicates that L-R energy is changing */ + int16_t tdm_ratio_transition_cnt; /* Counter */ + int16_t tdm_hyst_cnt; /* Counter */ + int16_t tdm_prev_stable_idx; /* Previous Transmitted ratio index*/ + int16_t tdm_prev_desired_idx; /* Previous Transmitted ratio index*/ + float tdm_LT_es_em; /* Long term evoluation of the side to mono energy ratio */ + int16_t tdm_use_IAWB_Ave_lpc; /* Flag to indicate the usage of mean inactive LP coefficients */ + + /* NOOP parameters */ + float tdm_lt_corr_RM_SM; /* Long term right-mono correlation in SM mode*/ + float tdm_lt_corr_LM_SM; /* Long term left-mono correlation in SM mode*/ + float tdm_last_diff_lt_corr_SM; /* long term correlation difference mem in SM mode*/ + float tdm_last_ratio_SM; /* Last TDM ratio in SM mode*/ + + float tdm_lt_rms_L_SM; /* Left channel long term rms in SM mode*/ + float tdm_lt_rms_R_SM; /* Right channel long term rms in SM mode*/ + float tdm_last_ener_lt_R_SM; /* Right channel long term energy in SM mode*/ + float tdm_last_ener_lt_L_SM; /* Left channel long term energy in SM mode*/ + + int16_t tdm_last_ratio_idx_SM; /* last TDM ratio index in SM mode*/ + int16_t tdm_last_SM_flag_noop; /* Flag to signal a SM encoding scheme -> better for some music item in SM mode*/ + int16_t tdm_noop_mov_flag; /* Flag that indicates that L-R energy is changing in SM mode*/ + int16_t tdm_noop_cnt; /* Counter in SM mode*/ + int16_t tdm_hyst_cnt_SM; /* Counter in SM mode*/ + int16_t tdm_prev_stable_idx_SM; /* Previous Transmitted ratio index in SM mode*/ + int16_t tdm_prev_desired_idx_SM; /* Previous Transmitted ratio index in SM mode*/ + float tdm_LT_es_em_SM; /* Long term evoluation of the side to mono energy ratio in SM mode*/ + int16_t tdm_NOOP_cnt; /* Counter for channel combination scheme */ + int16_t tdm_SM_flag; /* Flag for channel combination scheme */ + int16_t tdm_SM_last2_clas[2]; /* Class of the frame immediately prior to the previous frame */ + int16_t tdm_SM_last_clas[2]; /* Class of the previous frame */ + int16_t tdm_SM_modi_flag; /* Flag that indicates to modify ratio */ + int16_t tdm_SM_reset_flag; /* Flag that indicates to reset the parameters for SM mode */ + + int16_t tdm_FD2LRTD_SW_cnt; /* Count the number of frames following a FD to LRTD switching */ + int16_t tdm_LRTD_flag; /* LRTD stereo mode flag */ + int16_t prev_fr_LRTD_TD_dec; /* At the beginning of a frame, contains the previous LRTD decision that might have been modified during last frame */ + int16_t tdm_inst_ratio_idx; /* Instantaneous correlation ratio index */ + int16_t tdm_last_inst_ratio_idx; /* previous frame instantaneous correlation ratio index */ + int16_t tdm_vad_hangover_cnt; /* Count the number of frames where hangover_cnt >= 5 in both primary and secondary channel */ + int16_t tdm_ini_frame_cnt; /* Count the number of frame to decide how to evaluate the local VAD of primary and secondary channel */ + int16_t tdm_last_LRTD_frame_cnt; /* Count the number of frame since the last LRTD frame */ + int16_t tdm_last_LRTD_PriCh_cnt; /* Count the number of frame since the primary channel changed */ + int16_t flag_skip_DMX; /* flag that indicates whether the TD downmixing is skipped */ + +} STEREO_TD_ENC_DATA, *STEREO_TD_ENC_DATA_HANDLE; + + +/*----------------------------------------------------------------------------------* + * ICA Stereo encoder structure + *----------------------------------------------------------------------------------*/ + +typedef struct stereo_tca_enc_data_structure +{ + int16_t refChanIndx; /* reference channel index in current frame */ + int16_t prevRefChanIndx; /* reference channel index in previous frame */ + int16_t indx_ica_NCShift; /* ICA target channel inter-channel corrstats */ + int16_t indx_ica_gD; /* ICA target gain */ + float targetGain; /* gain norm applied on target (or right) channel in current frame */ + float instTargetGain; /* instantaneous gain norm applied on target (or right) channel in current frame */ + float prevTargetGain; /* gain norm applied on target (or right) channel in previous frame */ + float corrStatsSmoothFac; /* gD/corrStats smoothing based on corrStats */ + + int16_t lMemRecalc; + int16_t lMemRecalc_12k8; + int16_t lMemRecalc_16k; + + int16_t corrLagStats[3]; /* corr lag stats in current frame */ + int16_t prevCorrLagStats[3]; /* corr lag stats in previous frame */ + + float memChanL[L_MEM_RECALC_48K + L_MEM_RECALC_48k_SCH]; /* left channel input to correct at the cross-over */ + float memChanR[L_MEM_RECALC_48K + L_MEM_RECALC_48k_SCH]; /* right channel input to correct at the cross-over */ + + float memChanL_DS[ADDED_MEM_DS]; /* left channel input speech memory for downmix */ + float memChanR_DS[ADDED_MEM_DS]; /* right channel input speech memory for downmix */ + float mem_tempF; + float memdecim[12]; /* memory for pre-rmphasis filter for resampling */ + float corrEstPrev[3][2 * L_NCSHIFT_DS + 1]; /* Prev correlation vector */ + float corrEstLT[2 * L_NCSHIFT_DS + 1]; /* Long term correlation vector smoothed */ + + float ica_envVarLT; + float C_mem[2 * L_NCSHIFT_DS + 1]; + float E1_mem, E2_mem; + float delay_0_mem[MAX_DELAYREGLEN]; + float smooth_dist_reg_prv_corr; + int16_t LRTD_G_ATT_cnt; + +} STEREO_TCA_ENC_DATA, *STEREO_TCA_ENC_HANDLE; + + +/*----------------------------------------------------------------------------------* + * Stereo IC_BWE encoder structure + *----------------------------------------------------------------------------------*/ + +typedef struct stereo_icbwe_enc_data_structure +{ + int16_t prev_refChanIndx_bwe; + int16_t refChanIndx_bwe; + /* SHB speech resampler memory */ + float memHPF[8]; + float mem_decim_shb_ch0[2 * L_FILT_MAX]; + + /* SHB speech non-ref channel */ + float mem_shb_speech_ref[L_LOOK_16k]; + float mem_shb_speech_nonref[L_LOOK_16k]; + + /* unscaled & scaled SHB synthesis memory */ + float mem_lpc_shbsynth_nonref[LPC_SHB_ORDER]; + + /* inter-channel BWE spectral shape adj. */ + float prevSpecMapping; + float memShbSpecMapping; + float memShbSpecXcorr[6]; + float prevgsMapping; + + float prevRefEner; + float prevNonRefEner; + + float memGsEnerMap[2]; + + float dec_2over3_mem[L_FILT_2OVER3]; + float dec_2over3_mem_lp[L_FILT_2OVER3_LP]; + float icbwe_inp_mem[CPE_CHANNELS][NS2SA( 48000, L_MEM_RECALC_TBE_NS )]; + float *dataChan[CPE_CHANNELS]; + float memModifyFs_icbwe[CPE_CHANNELS][2 * L_FILT32k]; + + float mem_nrg_L[CPE_CHANNELS]; + float mem_nrg_R[CPE_CHANNELS]; + float mem_nrg_DMX[CPE_CHANNELS]; + float gDes_pastFrame; + float icbweRefEner; + + float shbSynthRef[L_FRAME16k]; + float nlExc16k[L_FRAME16k]; + float mixExc16k[L_FRAME16k]; + float lpSHBRef[LPC_SHB_ORDER + 1]; + + int16_t MSFlag; + +} STEREO_ICBWE_ENC_DATA, *STEREO_ICBWE_ENC_HANDLE; + + +/*----------------------------------------------------------------------------------* + * stereo classifiers structure + *----------------------------------------------------------------------------------*/ + +typedef struct ivas_stereo_classifier_data_structure +{ + /* features for xtalk classifier and UNCLR classifier */ + int16_t clas_ch1; + int16_t pitch_ch1[3]; + float voicing_ch1[3]; + float cor_map_sum_ch1; + float lsf_ch1[M]; + float lepsP_ch1; + float dE1_ch1, dE1_ch2; + float nchar_ch1, nchar_ch2; + float non_sta_ch1; + float sp_div_ch1; + float ps_diff_ch1, ps_diff_ch2; + float ps_sta_ch1, ps_sta_ch2; + float prev_g_IPD; + float prev_IPD; + float prev_ratio_m1_m2; + float ratio_L; + int16_t vad_flag_glob; + int16_t vad_relE; + + int16_t aEn_raw[CPE_CHANNELS]; /* raw aEn for local relative energy estimation */ + float ave_ener_L; /* average energy of the L channel */ + float ave_ener_R; /* average energy of the R channel */ + float Etot_dn; /* average energy in dB - lower bound */ + float Etot_up; /* average energy in dB - upper bound */ + float relE_buf[UNCLR_L_RELE]; /* running buffer for relative energy */ + float Etot_buf[UNCLR_L_ETOT]; /* running buffer for average energy in dB */ + float relE_0_1; /* relative energy in the current frame normalized to (0,1) */ + float relE_0_1_LT; + + int16_t unclr_sw_enable_cnt[CPE_CHANNELS]; /* UNCLR classifier - counter of frames suitable for UNCLR switching */ + + float unclr_relE_0_1_LT[UNCLR_RC_ORDER]; + float unclr_wscore; + int16_t unclr_decision; /* UNCLR stereo classifier decision (0/1) */ + float unclr_fv[SSC_MAX_NFEA]; /* UNCLR - feature vector */ + int16_t unclr_corrLagMax_prev; + + float xtalk_score_buf[XTALK_SCORE_BUF_LEN]; + int16_t xtalk_decision; /* xtalk stereo classifier decision (0/1) */ + float xtalk_fv[SSC_MAX_NFEA]; /* xtalk - feature vector */ + float xtalk_wscore; + float xtalk_score; + float xtalk_score_wrelE; + + int16_t lrtd_mode; + int16_t prev_lrtd_mode; + + float is_speech; + int16_t silence_flag; + +} STEREO_CLASSIF_DATA, *STEREO_CLASSIF_HANDLE; + + +/*----------------------------------------------------------------------------------* + * ISM DTX structure + *----------------------------------------------------------------------------------*/ + +typedef struct +{ + int16_t dtx_flag; + int16_t sce_id_dtx; + + int16_t cnt_SID_ISM; + + float long_term_energy_stereo_dmx_enc[MAX_NUM_OBJECTS][PARAM_ISM_HYS_BUF_SIZE]; + float coh[MAX_NUM_OBJECTS]; + +} ISM_DTX_DATA, *ISM_DTX_HANDLE; + +/*----------------------------------------------------------------------------------* + * Front-VAD structure + *----------------------------------------------------------------------------------*/ + +typedef struct front_vad_enc +{ + int16_t ini_frame; /* initialization frames counter */ + float lp_speech; /* long term speech average */ + float lp_noise; /* long term noise average */ + float mem_decim[2 * L_FILT_MAX]; /* decimation filter memory */ + float buffer_12k8[3 * L_FRAME / 2]; /* 12k8 signal buffer */ + float mem_preemph; /* preemph filter memory */ + NOISE_EST_HANDLE hNoiseEst; /* Noise estimation handle */ + VAD_HANDLE hVAD; /* VAD handle */ + float *delay_buf; + int16_t delay_samples; + int16_t rem_dtx_ho; /* Remaining hangover frames */ + +} FRONT_VAD_ENC, *FRONT_VAD_ENC_HANDLE; + + +/*----------------------------------------------------------------------------------* + * DirAC encoder structure + *----------------------------------------------------------------------------------*/ + +typedef struct ivas_dirac_enc_data_structure +{ + DIRAC_CONFIG_DATA_HANDLE hConfig; + + IVAS_FB_MIXER_HANDLE hFbMixer; + + /* DirAC parameter estimation */ + float **direction_vector[DIRAC_NUM_DIMS]; + float **direction_vector_m[DIRAC_NUM_DIMS]; /* Average direction vector */ + float diffuseness_m[DIRAC_MAX_NBANDS]; + int16_t band_grouping[DIRAC_MAX_NBANDS + 1]; + int16_t block_grouping[5]; + int16_t firstrun_sector_params; + + float sec_I_vec_smth_x[NUM_ANA_SECTORS][IVAS_MAX_NUM_BANDS]; + float sec_I_vec_smth_y[NUM_ANA_SECTORS][IVAS_MAX_NUM_BANDS]; + float sec_I_vec_smth_z[NUM_ANA_SECTORS][IVAS_MAX_NUM_BANDS]; + + float energy_smth[NUM_ANA_SECTORS][IVAS_MAX_NUM_BANDS]; + float azi_prev[NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS]; + float ele_prev[NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS]; + + + /* diffuseness */ + int16_t index_buffer_intensity; + int16_t no_col_avg_diff; + float **buffer_intensity_real[DIRAC_NUM_DIMS]; + float *buffer_energy; + + /* Frame count for detecting mono */ + int16_t mono_frame_count; + +} DIRAC_ENC_DATA, *DIRAC_ENC_HANDLE; + +/*----------------------------------------------------------------------------------* + * SPAR encoder structures + *----------------------------------------------------------------------------------*/ + +/* AGC structures */ +typedef struct ivas_agc_enc_chan_state_t +{ + int16_t lastExp; + int16_t prevExp; + float lastGain; + float lastMaxAbs; + int16_t gainExpVal; + float MaxAbsVal_del; + int16_t MaxAbsValIdx_del; + +} ivas_agc_enc_chan_state_t; + +typedef struct ivas_agc_enc_state_t +{ + ivas_agc_com_state_t agc_com; + float minDelta; + float smFact; + ivas_agc_enc_chan_state_t *gain_state; + ivas_agc_chan_data_t *gain_data; + +} ivas_agc_enc_state_t; + +/* covariance structures */ +typedef struct ivas_enc_cov_handler_state_t +{ + ivas_cov_smooth_state_t *pCov_state; + ivas_cov_smooth_state_t *pCov_dtx_state; + int16_t num_bins; + int16_t prior_dtx_present; + float bb_var_lt[FOA_CHANNELS]; + int16_t prior_var_flag; + +} ivas_enc_cov_handler_state_t; + + +/* SPAR MD structures */ +typedef struct ivas_spar_md_enc_state_t +{ + ivas_spar_md_t spar_md; + ivas_spar_md_prev_t spar_md_prior; + int16_t num_umx_ch; + int16_t num_decorr; + + float ***mixer_mat; + float ***mixer_mat_local; + ivas_spar_md_com_cfg spar_md_cfg; + ivas_arith_coeffs_t arith_coeffs; + ivas_huff_coeffs_t huff_coeffs; + int16_t table_idx; + int16_t spar_hoa_md_flag; + int16_t spar_hoa_dirac2spar_md_flag; + int16_t HOA_md_ind[IVAS_SPAR_MAX_CH]; +} ivas_spar_md_enc_state_t; + +/* PCA structure */ +typedef struct +{ + int16_t prev_bypass_decision; + float prev_eigVec[FOA_CHANNELS * FOA_CHANNELS]; + float prev_ql[IVAS_PCA_INTERP]; + float prev_qr[IVAS_PCA_INTERP]; + float prev_D[IVAS_PCA_INTERP]; + float mem_eigVec_interp[FOA_CHANNELS * FOA_CHANNELS]; + float old_r_sm[FOA_CHANNELS * FOA_CHANNELS]; + +} PCA_ENC_STATE; + +/* SPAR main structure */ +typedef struct ivas_spar_enc_lib_t +{ + ivas_spar_md_enc_state_t *hMdEnc; + IVAS_FB_MIXER_HANDLE hFbMixer; + ivas_enc_cov_handler_state_t *hCovEnc; + ivas_trans_det_state_t *hTranDet; + ivas_agc_enc_state_t *hAgcEnc; + int16_t dirac_to_spar_md_bands[DIRAC_MAX_NBANDS]; + int16_t enc_param_start_band; + int16_t AGC_Enable; + PCA_ENC_STATE *hPCA; + int32_t core_nominal_brate; /* Nominal bitrate for core coding */ + FRONT_VAD_ENC_HANDLE hFrontVad; /* front-VAD handle */ + ENC_CORE_HANDLE hCoreCoderVAD; /* core-coder handle for front-VAD module */ + + int16_t spar_reconfig_flag; + int16_t front_vad_flag; + int16_t front_vad_dtx_flag; + int16_t force_front_vad; + + float *input_data_mem[MAX_NUM_OBJECTS]; + +} SPAR_ENC_DATA, *SPAR_ENC_HANDLE; + + +/*----------------------------------------------------------------------------------* + * Parametric MC encoder structures + *----------------------------------------------------------------------------------*/ + +typedef struct ivas_param_mc_enc_data_structure +{ + IVAS_FB_MIXER_HANDLE hFbMixer; + int16_t transient_detector_delay; + const float *dmx_factors; + + /* Multichannel Specific Parameters */ + IVAS_PARAM_MC_METADATA hMetadataPMC; + int16_t band_grouping[PARAM_MC_MAX_PARAMETER_BANDS + 1]; + int16_t lfe_index; + int16_t icc_map_index[PARAM_MC_PARAMETER_FRAMES][PARAM_MC_SZ_ICC_MAP]; + int16_t max_param_band_abs_cov; + float prev_ilds[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_SZ_ILD_MAP]; + + float ener_fac[PARAM_MC_MAX_PARAMETER_BANDS]; + +} PARAM_MC_ENC_DATA, *PARAM_MC_ENC_HANDLE; + +/*----------------------------------------------------------------------------------* + * MC ParamUpmix Mode encoder structures + *----------------------------------------------------------------------------------*/ + +typedef struct ivas_mc_paramupmix_enc_data_structure +{ + ivas_trans_det_state_t *hTranDet[MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH]; + IVAS_FB_MIXER_HANDLE hFbMixer; + ivas_enc_cov_handler_state_t *hCovEnc[MC_PARAMUPMIX_COMBINATIONS]; + float ***cov_real[MC_PARAMUPMIX_COMBINATIONS]; + float ***cov_dtx_real[MC_PARAMUPMIX_COMBINATIONS]; + float *midside[MC_PARAMUPMIX_COMBINATIONS][MC_PARAMUPMIX_NCH]; /* hold PCM of mid-side data */ + int32_t alpha_quant_prev[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS]; + int32_t beta_quant_prev[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS]; + int16_t first_frame; + +} MC_PARAMUPMIX_ENC_DATA, *MC_PARAMUPMIX_ENC_HANDLE; + + +/*----------------------------------------------------------------------------------* + * Object MASA (OMASA) encoder structure + *----------------------------------------------------------------------------------*/ + +typedef struct ivas_omasa_enc_state_structure +{ + uint8_t nbands; + uint8_t nCodingBands; + uint8_t nSubframes; + + /* CLDFB analysis */ + int16_t num_Cldfb_instances; + HANDLE_CLDFB_FILTER_BANK cldfbAnaEnc[MAX_NUM_OBJECTS]; + + /* DirAC parameter estimation */ + float **direction_vector_m[DIRAC_NUM_DIMS]; /* Average direction vector */ + int16_t band_grouping[MASA_FREQUENCY_BANDS + 1]; + int16_t block_grouping[5]; + + /* diffuseness */ + int16_t index_buffer_intensity; + float *buffer_intensity_real[DIRAC_NUM_DIMS][DIRAC_NO_COL_AVG_DIFF]; + float buffer_energy[DIRAC_NO_COL_AVG_DIFF * MASA_FREQUENCY_BANDS]; + + float chnlToFoaMtx[DIRAC_MAX_ANA_CHANS][MCMASA_MAX_ANA_CHANS]; + + float interpolator[L_FRAME48k]; + + float prev_object_dm_gains[MAX_NUM_OBJECTS][MASA_MAX_TRANSPORT_CHANNELS]; + float broadband_energy_sm[MAX_NUM_OBJECTS + MASA_MAX_TRANSPORT_CHANNELS]; + float broadband_energy_prev[MAX_NUM_OBJECTS + MASA_MAX_TRANSPORT_CHANNELS]; + int16_t prev_selected_object; + uint8_t changing_object; + float fade_out_gain[L_FRAME48k]; + float fade_in_gain[L_FRAME48k]; + +} OMASA_ENC_STATE, *OMASA_ENC_HANDLE; + + +typedef struct ivas_omasa_encoder_one_data_struct +{ + float energy_ism[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + float energy_ratio_ism[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS][MAX_NUM_OBJECTS]; + float q_energy_ratio_ism[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS][MAX_NUM_OBJECTS]; + float masa_to_total_energy_ratio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + float lp_noise_CPE; /* LP filtered total noise estimation */ + int16_t omasa_stereo_sw_cnt; + +} OMASA_ENCODER_DATA_STATE, *OMASA_ENCODER_DATA_HANDLE; + + +/*----------------------------------------------------------------------------------* + * MASA encoder structures + *----------------------------------------------------------------------------------*/ + +typedef struct ivas_masa_dir_align_struct +{ + float previous_azi_dir1[MASA_FREQUENCY_BANDS]; + float previous_ele_dir1[MASA_FREQUENCY_BANDS]; + + float previous_azi_dir2[MASA_FREQUENCY_BANDS]; + float previous_ele_dir2[MASA_FREQUENCY_BANDS]; + +} MASA_DIR_ALIGN_STATE, *MASA_DIR_ALIGN_HANDLE; + +/* structure storing MASA framing sync detection and compensation data */ +typedef struct ivas_masa_sync_struct +{ + MASA_METADATA_FRAME previous_metadata; + uint8_t prev_sim_stop; + uint8_t prev_offset; + MASA_FRAME_MODE frame_mode; + +} MASA_SYNC_STATE, *MASA_SYNC_HANDLE; + +typedef struct ivas_masa_encoder_data_struct +{ + float energy[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + + int16_t num_Cldfb_instances; + HANDLE_CLDFB_FILTER_BANK cldfbAnaEnc[MAX_NUM_ENC_CLDFB_INSTANCES]; + int16_t band_mapping[MASA_FREQUENCY_BANDS + 1]; + uint8_t twoDirBands[MASA_FREQUENCY_BANDS]; + float importanceWeight[MASA_FREQUENCY_BANDS]; + SPHERICAL_GRID_DATA Sph_Grid16; + float lfeToTotalEnergyRatio[MAX_PARAM_SPATIAL_SUBFRAMES]; + float prevq_lfeToTotalEnergyRatio; + int16_t prevq_lfeIndex; + + float onset_detector_1; + float onset_detector_2; + + MASA_SYNC_STATE sync_state; + + MASA_DIR_ALIGN_STATE dir_align_state; + + OMASA_ENCODER_DATA_HANDLE hOmasaData; + +} MASA_ENCODER_DATA; + +typedef struct ivas_masa_encoder_struct +{ + MASA_METADATA_FRAME masaMetadata; /* MASA metadata frame storage during processing before unified metadata coding */ + MASA_CODEC_CONFIG config; /* Configuration of MASA encoding */ + MASA_ENCODER_DATA data; /* Data storage for MASA encoding */ + +} MASA_ENCODER, *MASA_ENCODER_HANDLE; + + +/*----------------------------------------------------------------------------------* + * Multichannel MASA (McMASA) encoder structure + *----------------------------------------------------------------------------------*/ + +typedef struct ivas_mcmasa_enc_data_structure +{ + int16_t nbands; + int16_t nCodingBands; + + /* delay compensation */ + float *delay_buffer_lfe[2]; /* Delay buffer for LFE estimation */ + + int16_t num_samples_delay_comp; + int16_t num_slots_delay_comp; + int16_t offset_comp; + + IVAS_FB_MIXER_HANDLE hFbMixer; + IVAS_FB_MIXER_HANDLE hFbMixerLfe; + + /* DirAC parameter estimation */ + float **direction_vector_m[DIRAC_NUM_DIMS]; /* Average direction vector */ + int16_t band_grouping[MASA_FREQUENCY_BANDS + 1]; + int16_t block_grouping[5]; + + /* diffuseness */ + int16_t index_buffer_intensity; + int8_t no_col_avg_diff; + float **buffer_intensity_real[DIRAC_NUM_DIMS]; + float **buffer_intensity_real_vert; + float *buffer_energy; + + float chnlToFoaMtx[FOA_CHANNELS][MCMASA_MAX_ANA_CHANS]; + float chnlToFoaEvenMtx[FOA_CHANNELS][MCMASA_MAX_ANA_CHANS]; + float ls_azimuth[MCMASA_MAX_ANA_CHANS]; + int16_t leftNearest[MCMASA_MAX_ANA_CHANS]; + int16_t rightNearest[MCMASA_MAX_ANA_CHANS]; + int16_t numHorizontalChannels; + uint8_t isHorizontalSetup; + uint8_t combineRatios; + + float prevMultiChEne; + float prevDownmixEne; + float prevEQ; + float interpolator[L_FRAME48k]; + + uint8_t separateChannelEnabled; + int16_t separateChannelIndex; + + /* LFE coding */ + float lfeLfEne[MAX_PARAM_SPATIAL_SUBFRAMES]; + float totalLfEne[MAX_PARAM_SPATIAL_SUBFRAMES]; + float *lfeAnaRingBuffer[2]; + int16_t ringBufferPointer; + float lowpassSum[2]; + int16_t ringBufferSize; + +} MCMASA_ENC_DATA, *MCMASA_ENC_HANDLE; + +/*----------------------------------------------------------------------------------* + * Object SBA (OSBA) encoder structure + *----------------------------------------------------------------------------------*/ + +typedef struct ivas_osba_enc_data_structure +{ + + float interpolator[L_FRAME48k]; + float prev_object_dm_gains[MAX_NUM_OBJECTS][MAX_INPUT_CHANNELS]; + + int16_t nchan_ism; + float *input_data_mem[MAX_NUM_OBJECTS]; + +} OSBA_ENC_DATA, *OSBA_ENC_HANDLE; + +/*----------------------------------------------------------------------------------* + * Stereo CNG handle + *----------------------------------------------------------------------------------*/ + +typedef struct stereo_cng_enc +{ + int16_t prev_sg_average_counter; /* Counter for sidegain averaging */ + int16_t sg_active_cnt; /* Counter for sidegain averaging */ + int16_t sg_average_counter; /* Counter for sidegain averaging */ + float sg_average[STEREO_DFT_ERB4_BANDS]; /* Sidegain average */ + float prev_sg_average[STEREO_DFT_ERB4_BANDS]; /* Previous sidegain average */ + float mem_cohBand[STEREO_DFT_BAND_MAX / 2]; /* Coherence memory */ + float prev_cohBand[2 * ( STEREO_DFT_BAND_MAX / 2 )]; /* Previous coherence */ + int16_t cng_counter; /* Counter for cng period length */ + int16_t td_active; /* TD-stereo indication */ + int16_t first_SID_after_TD; /* Set if first SID frame after TD stereo */ + int16_t first_SID; /* Set if first SID frame since codec start */ + +} STEREO_CNG_ENC, *STEREO_CNG_ENC_HANDLE; + + +/*----------------------------------------------------------------------------------* + * SCE encoder structure + *----------------------------------------------------------------------------------*/ + +typedef struct sce_enc_data_structure +{ + int16_t sce_id; /* SCE # identifier */ + int32_t element_brate; /* SCE element total bitrate in bps */ + int32_t last_element_brate; /* last SCE element bitrate in bps */ + + BSTR_ENC_HANDLE hMetaData; /* Metadata bitstream handle */ + + ENC_CORE_HANDLE hCoreCoder[1]; /* core coder handle */ + +} SCE_ENC_DATA, *SCE_ENC_HANDLE; + + +/*----------------------------------------------------------------------------------* + * CPE encoder structure + *----------------------------------------------------------------------------------*/ + +typedef struct cpe_enc_data_structure +{ + int16_t cpe_id; /* CPE # identifier */ + + int32_t element_brate; /* CPE element total bitrate in bps */ + int32_t last_element_brate; /* last CPE element total bitrate in bps */ + int16_t element_mode; /* element mode, in CPE it can be IVAS_CPE_DFT, IVAS_CPE_TD or IVAS_CPE_MDCT */ + int16_t last_element_mode; /* last element mode */ + + BSTR_ENC_HANDLE hMetaData; /* Metadata bitstream handle */ + + ENC_CORE_HANDLE hCoreCoder[CPE_CHANNELS]; /* core coder handle */ + + /* stereo data handles */ + STEREO_CLASSIF_HANDLE hStereoClassif; /* stereo classifiers handle */ + STEREO_DFT_ENC_DATA_HANDLE hStereoDft; /* DFT stereo data handle */ + STEREO_TD_ENC_DATA_HANDLE hStereoTD; /* TD stereo data handle */ + STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct; /* MDCT stereo data handle */ + STEREO_TCA_ENC_HANDLE hStereoTCA; /* Stereo TCA Encoder handle */ + STEREO_ICBWE_ENC_HANDLE hStereoICBWE; /* Stereo inter-channel BWE handle */ + STEREO_CNG_ENC_HANDLE hStereoCng; /* Stereo CNG data structure */ + FRONT_VAD_ENC_HANDLE hFrontVad[CPE_CHANNELS]; + + float *input_mem[CPE_CHANNELS]; /* input channels buffers memory; needed to be up-to-date for TD->DFT stereo switching */ + + int32_t brate_surplus; /* bitrate surplus for bitrate adaptation in combined format coding */ + +} CPE_ENC_DATA, *CPE_ENC_HANDLE; + + +/*----------------------------------------------------------------------------------* + * MCT structure + *----------------------------------------------------------------------------------*/ + +typedef struct mct_block_data_struct +{ + int16_t isActive; + int16_t ch1, ch2; + int16_t mask[2][MAX_SFB]; + STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct; /* MDCT stereo data handle */ + +} MCT_BLOCK_DATA, *MCT_BLOCK_DATA_HANDLE; + +typedef struct mct_enc_data_structure +{ + BSTR_ENC_HANDLE hBstr; /* bitstream handle for side bits - in MCT, side bits are written at the beginning of the bitstream */ + + int16_t nchan_out_woLFE; /* number of active channels within multi-channel configuration */ + int16_t currBlockDataCnt; + int16_t bitsChannelPairIndex; /* bits needed to code channel pair index, depends on number of active channels */ + MCT_BLOCK_DATA_HANDLE hBlockData[MCT_MAX_BLOCKS]; + + float lastxCorrMatrix[MCT_MAX_CHANNELS][MCT_MAX_CHANNELS]; + int16_t lowE_ch[MCT_MAX_CHANNELS]; + uint16_t mc_global_ild[MCT_MAX_CHANNELS]; + int16_t nBitsMCT; /* number of bits spent on mct side info */ + /* pointers to local buffers */ + float *p_mdst_spectrum_long[MCT_MAX_BLOCKS][CPE_CHANNELS]; + float *p_orig_spectrum_long[MCT_MAX_BLOCKS][CPE_CHANNELS]; + int16_t tnsBits[MCT_MAX_BLOCKS][CPE_CHANNELS][NB_DIV]; /* number of tns bits in the frame */ + int16_t tnsSize[MCT_MAX_BLOCKS][CPE_CHANNELS][NB_DIV]; /* number of tns parameters put into prm */ + int16_t p_param[MCT_MAX_BLOCKS][CPE_CHANNELS][NB_DIV]; + + int16_t hbr_mct; + +} MCT_ENC_DATA, *MCT_ENC_HANDLE; + + +/*----------------------------------------------------------------------------------* + * Stereo downmix for EVS encoder structure + *----------------------------------------------------------------------------------*/ + +typedef struct stereo_dmx_evs_phase_only_correlation_structure +{ + float P[L_FRAME48k]; + float peakQ[CPE_CHANNELS]; + float peak_width[CPE_CHANNELS]; + float confidence; + + int16_t ispeak[CPE_CHANNELS]; + int16_t itdLR[CPE_CHANNELS]; + int16_t shift_limit; + + const float *wnd; + float eps; + const float *sin; + +} STEREO_DMX_EVS_POC_DATA, *STEREO_DMX_EVS_POC_HANDLE; + +typedef struct stereo_dmx_evs_correlation_filter_structure +{ + int16_t init_frmCntr; + float isd_rate_s; + float iccr_s; + float ipd_ff[STEREO_DMX_EVS_NB_SUBBAND_MAX]; + float Pr[STEREO_DMX_EVS_NB_SUBBAND_MAX]; + float Pi[STEREO_DMX_EVS_NB_SUBBAND_MAX]; + float rfft_ipd_coef[L_FRAME48k / 2 + 1]; + + int16_t pha_len; + int16_t fad_len; + + float win[STEREO_DMX_EVS_PHA_LEN_MAX]; + float fad_g[STEREO_DMX_EVS_FAD_LEN_MAX]; + float *p_prev_taps[CPE_CHANNELS], prev_taps[CPE_CHANNELS][STEREO_DMX_EVS_PHA_LEN_MAX]; + float *p_curr_taps[CPE_CHANNELS], curr_taps[CPE_CHANNELS][STEREO_DMX_EVS_PHA_LEN_MAX]; + + float data_mem[CPE_CHANNELS][STEREO_DMX_EVS_PHA_LEN_MAX]; + + STEREO_DMX_EVS_PHA curr_pha; + STEREO_DMX_EVS_PHA prev_pha; + int16_t pha_hys_cnt; + + int16_t prc_thres; + STEREO_DMX_EVS_PRC curr_prc; + STEREO_DMX_EVS_PRC prev_prc; + int16_t prc_hys_cnt; + float fad_g_prc[L_FRAME48k]; + int16_t fad_len_prc; + + float trns_aux_energy[CPE_CHANNELS]; + float crst_fctr; + +} STEREO_DMX_EVS_PHA_DATA, *STEREO_DMX_EVS_PHA_HANDLE; + +typedef struct stereo_dmx_evs_enc_data_structure +{ + STEREO_DMX_EVS_POC_HANDLE hPOC; + STEREO_DMX_EVS_PHA_HANDLE hPHA; + + float itd; + + float pre_dmx_energy[1]; + float aux_dmx_energy[CPE_CHANNELS]; + + float dmx_weight[1 + CPE_CHANNELS]; + + const float *s_wnd; + +} STEREO_DMX_EVS_ENC_DATA, *STEREO_DMX_EVS_ENC_HANDLE; + + +/*----------------------------------------------------------------------------------* + * LFE encoder structures + *----------------------------------------------------------------------------------*/ + +typedef struct ivas_lfe_enc_data_structure +{ + LFE_WINDOW_HANDLE pWindow_state; + BSTR_ENC_HANDLE hBstr; /* pointer to encoder bitstream handle */ + const uint16_t *cum_freq_models[IVAS_MAX_NUM_QUANT_STRATS][IVAS_MAX_NUM_DCT_COEF_GROUPS]; + int16_t lfe_enc_indices_coeffs_tbl[IVAS_MAX_NUM_QUANT_STRATS][IVAS_MAX_NUM_DCT_COEF_GROUPS]; + int16_t lfe_bits; + float *old_wtda_audio; + +} LFE_ENC_DATA, *LFE_ENC_HANDLE; + + +/* clang-format off */ +/*----------------------------------------------------------------------------------* + * Encoder configuration structure (includes commandline-related parameters) + *----------------------------------------------------------------------------------*/ + +typedef struct encoder_config_structure +{ + int32_t ivas_total_brate; /* IVAS total bitrate in bps */ + int32_t last_ivas_total_brate; /* IVAS last total bitrate in bps */ + int32_t input_Fs; /* input signal sampling frequency in Hz */ + int16_t nchan_inp; /* number of input audio channels */ + int16_t max_bwidth; /* maximum encoded bandwidth */ + IVAS_FORMAT ivas_format; /* IVAS format */ + int16_t is_binaural; /* flag indicating if input is binaural audio */ + + int16_t element_mode_init; /* element mode used at initialization */ + int16_t stereo_dmx_evs; /* flag to indicate that stereo downmix for EVS encoder */ + int16_t nchan_ism; /* number of ISM channels */ + int16_t sba_order; /* Ambisonic (SBA) order */ + int16_t sba_planar; /* Ambisonic (SBA) planar flag */ + MC_LS_SETUP mc_input_setup; /* multichannel input ls setup */ + int16_t ism_extended_metadata_flag; /* flag indicating extended metadata encoding, including radius and orientation (yaw, pitch) in ISM format */ + + int16_t Opt_AMR_WB; /* flag indicating AMR-WB IO mode */ + + int16_t Opt_DTX_ON; /* flag indicating DTX operation */ + int16_t interval_SID; /* CNG and DTX - interval of SID update, default 8 */ + int16_t var_SID_rate_flag; /* CNG and DTX - flag for variable SID rate */ + + int16_t Opt_RF_ON; /* flag indicating RF (channel-aware) mode */ + int16_t rf_fec_offset; /* RF FEC offset */ + int16_t rf_fec_indicator; /* RF FEC indicator */ + + int16_t Opt_SC_VBR; /* flag indicating SC-VBR mode */ + int16_t last_Opt_SC_VBR; /* flag indicating prev frame's SC-VBR mode */ + + /* temp. development parameters */ + int16_t Opt_PCA_ON; /* flag indicating PCA operation in SBA */ + + +} ENCODER_CONFIG, *ENCODER_CONFIG_HANDLE; + + +/*----------------------------------------------------------------------------------* + * + * Main IVAS encoder structure + * =========================== + *----------------------------------------------------------------------------------*/ + +typedef struct +{ + ENCODER_CONFIG_HANDLE hEncoderConfig; /* Encoder configuration structure */ + + float *p_data_f[MAX_INPUT_CHANNELS+MAX_NUM_OBJECTS]; /* floating-point input audio buffers */ + + Indice *ind_list; /* List of indices */ + int16_t ivas_max_num_indices; /* Maximum allowed number of indices in the list */ + Indice *ind_list_metadata; /* List of indices for metadata */ + int16_t ivas_max_num_indices_metadata; /* Maximum allowed number of indices in the list of metadata */ + + /* high-level encoder parameters */ + int16_t nchan_transport; /* number of transport channels */ + int16_t sba_analysis_order; /* Ambisonic (SBA) order used for analysis and coding */ + int16_t codec_mode; /* Mode1 or Mode2 of core codec */ + int16_t last_codec_mode; /* previous frame Mode 1 or 2 */ + float **mem_hp20_in; /* input signals HP filter memories */ + + /* core-encoder modules */ + int16_t nSCE; /* number of total SCEs */ + int16_t nCPE; /* number of total CPEs */ + SCE_ENC_HANDLE hSCE[MAX_SCE]; /* SCE handles */ + CPE_ENC_HANDLE hCPE[MCT_MAX_BLOCKS]; /* CPE handles */ + + /* multichannel modules */ + ISM_METADATA_HANDLE hIsmMetaData[MAX_NUM_OBJECTS]; /* ISM metadata handles (storage for one frame of read ISM metadata) */ + ISM_DTX_HANDLE hISMDTX; /* ISM DTX handle */ + DIRAC_ENC_HANDLE hDirAC; /* DirAC data handle */ + PARAM_ISM_CONFIG_HANDLE hParamIsm; /* Parametric ISM handle */ + SPAR_ENC_HANDLE hSpar; /* SPAR encoder handle */ + MASA_ENCODER_HANDLE hMasa; /* MASA encoder data and configuration */ + IVAS_QMETADATA_HANDLE hQMetaData; /* Metadata handle for q_metadata parametric spatial coding DirAC/MASA*/ + MCT_ENC_HANDLE hMCT; /* MCT handle */ + PARAM_MC_ENC_HANDLE hParamMC; /* Parametric MC handle */ + MC_PARAMUPMIX_ENC_HANDLE hMCParamUpmix; /* MC Param-Upmix handle */ + MCMASA_ENC_HANDLE hMcMasa; /* Multi-channel MASA data handle */ + OSBA_ENC_HANDLE hOSba; /* Object-SBA data handle */ + OMASA_ENC_HANDLE hOMasa; /* Object-MASA data handle */ + LFE_ENC_HANDLE hLFE; /* LFE data handle */ + ivas_filters_process_state_t *hLfeLpf; /* low pass filter state for LFE */ + + ISM_MODE ism_mode; /* ISM format mode */ + MC_MODE mc_mode; /* MC format mode */ + + /* Stereo downmix for EVS module */ + STEREO_DMX_EVS_ENC_HANDLE hStereoDmxEVS; /* Stereo downmix for EVS encoder handle */ + +} Encoder_Struct; + +/* clang-format on */ + +#endif /* IVAS_STAT_ENC_H */ diff --git a/lib_enc/ivas_stereo_adapt_GR_enc.c b/lib_enc/ivas_stereo_adapt_GR_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..c8816da9c5082fc5e4e912f7f4ec9cd5e34f0459 --- /dev/null +++ b/lib_enc/ivas_stereo_adapt_GR_enc.c @@ -0,0 +1,587 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "cnst.h" +#include "ivas_prot.h" +#include "prot.h" +#include "stat_enc.h" +#include "wmc_auto.h" +#include "ivas_rom_com.h" + + +/*---------------------------------------------------------------------* + * Local function prototypes + *---------------------------------------------------------------------*/ + +static int16_t adapt_GR_sg( const int16_t *in, const int16_t len, const int16_t no_symb, int16_t *nbits, int16_t *in_enc, const int16_t *map0, const int16_t no_GR_ord ); + + +/*---------------------------------------------------------------------* + * calculate_diff() + * + * calculate difference wrt previous frame and maps it to positive integer + *---------------------------------------------------------------------*/ + +static void calculate_diff( + const int16_t *in, /* i : current frame values */ + const int16_t *prev, /* i : previous frmae values */ + int16_t *in_diff, /* o : difference values */ + const int16_t len /* i : vector length */ +) +{ + int16_t i, tmp; + + for ( i = 0; i < len; i++ ) + { + tmp = in[i] - prev[i]; + if ( tmp > 0 ) + { + in_diff[i] = 2 * tmp - 1; + } + else + { + if ( tmp < 0 ) + { + in_diff[i] = -2 * tmp; + } + else + { + in_diff[i] = 0; + } + } + } + + return; +} + + +/*---------------------------------------------------------------------* + * calculate_bit_diff() + * + * estimates the GR number of bits for encoding differential values + * selects between GR order 0 or 1 + *---------------------------------------------------------------------*/ + +/*! r: number of bits */ +static int16_t calculate_bit_diff( + int16_t *in_diff, /* i : values to be encoded */ + int16_t len, /* i : number of params */ + int16_t *flag_diff /* o : selected GR order */ +) +{ + int16_t i, nb, nb1; + + nb = 0; + nb1 = 0; + for ( i = 0; i < len; i++ ) + { + nb += in_diff[i]; + nb1 += ( ( in_diff[i] ) >> 1 ); + } + nb += len; + nb1 += 2 * len; + + if ( nb1 < nb ) + { + nb = nb1 + 1; + *flag_diff = 1; /* GR order for differential coding */ + } + else + { + nb = nb + 1; + *flag_diff = 0; + } + + return nb; +} + + +/*---------------------------------------------------------------------* + * adapt_GR_ief() + * + * adaptive GR coding considering also the differential case + *---------------------------------------------------------------------*/ + +/*! r: used GR order */ +int16_t adapt_GR_ief( + const int16_t *in, /* i : vector to encode */ + int16_t *in_diff, /* o : encoded symbols in case of differential encoding */ + const int16_t *prev, /* i : previous frame data */ + const int16_t len, /* i : input vector length */ + const int16_t no_symb, /* i : number of symbols */ + int16_t *nbits, /* o : number of used bits */ + int16_t *in_enc, /* o : symbold actually encoded after adapt_GR */ + const int16_t *map0, /* i : mapping array */ + const int16_t no_GR_ord, /* i : number of GR order to try 2: 0,1; 3:0,1,2 */ + int16_t *nbits_diff, /* o : number bits in diff encoding */ + const int16_t side_gain_counter, /* i : number of frames since last abs coding */ + float *side_gain_bitdiff_lp, /* i/o: LP-filtered bit difference between abs/diff */ + const int16_t try_diff /* i : diff coding allowed 1/0 */ +) +{ + int16_t nb_diff, flag, flag_diff; + int16_t bitdiff; + + flag = adapt_GR_sg( in, len, no_symb, nbits, in_enc, map0, no_GR_ord ); + + if ( try_diff ) /* inter-frame prediction allowed */ + { + calculate_diff( in, prev, in_diff, len ); + nb_diff = calculate_bit_diff( in_diff, len, &flag_diff ); + *nbits_diff = nb_diff; + bitdiff = min( 5 * len, *nbits ) - ( nb_diff + 1 ); + *side_gain_bitdiff_lp = STEREO_DFT_BITDIFF_LP_FAC * ( (float) bitdiff ) + ( 1.0f - STEREO_DFT_BITDIFF_LP_FAC ) * ( *side_gain_bitdiff_lp ); + if ( bitdiff > STEREO_DFT_BITDIFF_ABS_SELECT * ( *side_gain_bitdiff_lp ) * ( (float) side_gain_counter ) / ( (float) ( STEREO_DFT_FEC_THRESHOLD + 1 ) ) ) + { + flag = no_GR_ord + flag_diff; + *nbits = nb_diff + 1; + } + } + else + { + *nbits_diff = 100; + flag_diff = -1; + } + + return flag; +} + + +/*---------------------------------------------------------------------* + * adapt_GR_rpg1_ief() + * + * use adaptive GR for RPG's considering also the differential case + *---------------------------------------------------------------------*/ + +/*! r: used GR order */ +int16_t adapt_GR_rpg1_ief( + const int16_t *in, /* i : res pred gains input vector */ + int16_t *in_diff, /* o : encoded symbols in case of differential encoding */ + const int16_t *prev, /* i : previous frame data */ + const int16_t len, /* i : input vector length */ + const int16_t no_symb, /* i : number of symbols */ + int16_t *nbits, /* o : number of used bits */ + int16_t *in_enc, /* o : symbold actually encoded after adapt_GR */ + const int16_t *maps, /* i : mapping array */ + int16_t *nbits_diff, /* o : estimated no of bits for differential encoding */ + const int16_t no_GR_ord, /* i : number of GR order to try 2: 0,1; 3:0,1,2 */ + const int16_t try_diff /* i : diff coding allowed 1/0 */ +) +{ + const int16_t *map0; + int16_t s, i, GR_ord, flag_diff, nb_diff; + + map0 = &maps[8 * NO_SYMB_GR_PRED_G]; + + if ( in[0] == 0 ) + { + s = 0; + for ( i = 0; i < len; i++ ) + { + s += in[i]; + } + + if ( s == 0 ) + { + /* encode only the first zero with GR1 */ + *nbits = ( ( map0[0] ) >> 1 ) + 2; + in_enc[0] = map0[0]; + } + else + { + *nbits = 1000; /* large number such that the plain coding will be selected */ + } + GR_ord = 1; + } + else + { + GR_ord = adapt_GR_sg( in, len, no_symb, nbits, in_enc, maps, no_GR_ord ); + } + + if ( try_diff ) + { + calculate_diff( in, prev, in_diff, len ); + nb_diff = calculate_bit_diff( in_diff, len, &flag_diff ); + *nbits_diff = nb_diff; + + if ( ( nb_diff + 1 ) < *nbits ) /* there is one more bit to signal differential coding */ + { + GR_ord = no_GR_ord + flag_diff; + + *nbits = nb_diff + 1; + } + } + else + { + *nbits_diff = 100; + } + + return GR_ord; +} + + +/*---------------------------------------------------------------------* + * adapt_GR_sg() + * + * adaptive GR coding + *---------------------------------------------------------------------*/ + +/*! r: GR order */ +static int16_t adapt_GR_sg( + const int16_t *in, /* i : data to be encoded */ + const int16_t len, /* i : number of params to be encoded */ + const int16_t no_symb, /* i : max number of symbols */ + int16_t *nbits, /* o : estimated number of bits */ + int16_t *in_enc, /* o : mapped symbols */ + const int16_t *map0, /* i : mapping */ + const int16_t no_GR_ord /* i : number of GR orders to be tested (2 or 3)*/ +) +{ + const int16_t *map; + int16_t nbits0, nbits1, nbits2, symb, map_symb, i, nb0, nb1, nb2; + + if ( no_symb == NO_SYMB_GR_SIDE_G ) + { + map = &map0[15 * no_symb]; + } + else + { + map = &( map0[8 * no_symb] ); + } + + set_s( in_enc, 0, len ); + + nbits1 = 0; + nbits0 = 0; + nbits2 = 0; + + for ( i = 0; i < len; i++ ) + { + symb = in[i]; + map_symb = map[symb]; + + if ( i == 0 ) + { + /* GR order is 1 for first band*/ + nb0 = ( map_symb >> 1 ) + 1; + nb2 = nb0 - 2; + } + else + { + nb0 = map_symb; + nb2 = ( ( map_symb ) >> 2 ); + } + nb1 = ( ( map_symb ) >> 1 ); + + in_enc[i] = map_symb; + nbits0 += nb0; + nbits1 += nb1; + nbits2 += nb2; + + /* update counts */ + map = &( map0[symb * no_symb] ); + } + + if ( no_GR_ord == 2 ) + { + nbits0 += len + 1; + nbits1 += 2 * len + 1; + if ( ( nbits0 <= nbits1 ) ) + { + *nbits = nbits0; + return 0; + } + else + { + *nbits = nbits1; + return 1; + } + } + else + { + if ( no_GR_ord == 3 ) + { + nbits0 += len + 2; + nbits1 += 2 * len + 1; + nbits2 += 3 * len + 2; + + if ( ( nbits1 <= nbits2 ) && ( nbits1 <= nbits0 ) ) + { + *nbits = nbits1; + return 1; + } + + if ( ( nbits0 <= nbits2 ) && ( nbits0 <= nbits1 ) ) + { + *nbits = nbits0; + return 0; + } + + if ( ( nbits2 <= nbits0 ) && ( nbits2 <= nbits1 ) ) + { + *nbits = nbits2; + return 2; + } + } + else + { + IVAS_ERROR( IVAS_ERR_INTERNAL, "Wrong number of GR orders!" ); + } + } + + return -1; +} + + +/*---------------------------------------------------------------------* + * write_GR0() + * + * write data with GR order 0 + *---------------------------------------------------------------------*/ + +/*! r: number of bits written */ +int16_t write_GR0( + BSTR_ENC_HANDLE hBstr, /* i/o: Encoder bitstream handle */ + const int16_t ind, /* i : bitstream index */ + const int16_t *in, /* i : data to be encoded */ + const int16_t len /* i : input data length */ +) +{ + int16_t nb = 0, i, n, val; + + for ( i = 0; i < len; i++ ) + { + n = in[i] + 1; + + if ( n < 16 ) + { + val = ( 1 << in[i] ) - 1; + val = 2 * val; + push_indice( hBstr, ind, val, n ); + } + else + { + push_indice( hBstr, ind, 16383, 14 ); + push_indice( hBstr, ind, ( 1 << ( n - 15 ) ) - 1, n - 15 ); + push_indice( hBstr, ind, 0, 1 ); + } + nb += n; + } + + return nb; +} + + +/*---------------------------------------------------------------------* + * write_GR1() + * + * write data with GR order 1 + *---------------------------------------------------------------------*/ + +/*! r: number of bits written */ +int16_t write_GR1( + BSTR_ENC_HANDLE hBstr, /* i/o: Encoder bitstream handle */ + const int16_t ind, /* i : bitstream index */ + const int16_t *in, /* i : data to be encoded */ + const int16_t len /* i : input data length */ +) +{ + int16_t nb = 0, i, n, val; + + for ( i = 0; i < len; i++ ) + { + n = ( in[i] >> 1 ); + if ( n < 14 ) + { + val = ( 1 << n ) - 1; + val = 4 * val + ( in[i] & 1 ); + push_indice( hBstr, ind, val, n + 2 ); + } + else + { + push_indice( hBstr, ind, 16383, 14 ); + if ( n > 14 ) + { + push_indice( hBstr, ind, ( 1 << ( n - 14 ) ) - 1, n - 14 ); /* 1 n times */ + } + push_indice( hBstr, ind, 0, 1 ); + push_indice( hBstr, ind, in[i] & 1, 1 ); + } + nb += n + 2; + } + + return nb; +} + + +/*---------------------------------------------------------------------* + * write_GR2() + * + * write data with GR order 2 + *---------------------------------------------------------------------*/ + +/*! r: number of bits written */ +static int16_t write_GR2( + BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ + const int16_t ind, /* i : bitstream index */ + const int16_t *in, /* i : data to be encoded */ + const int16_t len /* i : input data length */ +) +{ + int16_t nb = 0, i, n; + + for ( i = 0; i < len; i++ ) + { + n = ( in[i] >> 2 ); + if ( n < 14 ) + { + if ( n > 0 ) + { + push_indice( hBstr, ind, ( 1 << n ) - 1, n ); /* 1 n times */ + } + push_indice( hBstr, ind, 0, 1 ); + push_indice( hBstr, ind, in[i] & 3, 2 ); + } + else + { + push_indice( hBstr, ind, 16383, 14 ); + if ( n > 14 ) + { + push_indice( hBstr, ind, ( 1 << ( n - 14 ) ) - 1, n - 14 ); /* 1 n times */ + } + push_indice( hBstr, ind, 0, 1 ); + push_indice( hBstr, ind, in[i] & 3, 2 ); + } + nb += n + 3; + } + + return nb; +} + + +/*---------------------------------------------------------------------* + * write_bitstream_GR() + * + * generic GR encoder for GR order 0 or 1 + *---------------------------------------------------------------------*/ + +/*! r: number of bits written */ +int16_t write_bitstream_GR( + BSTR_ENC_HANDLE hBstr, /* i/o: Encoder bitstream handle */ + const int16_t ind, /* i : bitstream index */ + const int16_t *in, /* i : input vector */ + const int16_t len, /* i : input vector length */ + const int16_t GR_ord /* i : GR order */ +) +{ + int16_t nb = 0; + + push_indice( hBstr, ind, GR_ord, 1 ); + nb += 1; + + if ( GR_ord == 0 ) + { + nb += write_GR0( hBstr, ind, in, len ); + } + else + { + nb += write_GR1( hBstr, ind, in, len ); + } + + return nb; +} + + +/*---------------------------------------------------------------------* + * write_bitstream_adapt_GR() + * + * write encoded data using adaptive GR + *---------------------------------------------------------------------*/ + +/*! r: number of bits written */ +int16_t write_bitstream_adapt_GR( + BSTR_ENC_HANDLE hBstr, /* i/o: Encoder bitstream handle */ + const int16_t ind, /* i : bitstream index */ + const int16_t *in, /* i : values to be written in bitstream */ + const int16_t len, /* i : values vector length */ + const int16_t GR_ord, /* i : GR order to be used */ + const int16_t no_GR_ord /* i : speech/music 0/1 */ +) +{ + int16_t nb = 0; + + nb = 0; + /* first component first */ + nb += write_GR1( hBstr, ind, in, 1 ); + + /* write the GR order */ + if ( no_GR_ord == 2 ) + { + push_indice( hBstr, ind, GR_ord, 1 ); + nb += 1; + } + else + { + if ( GR_ord == 1 ) + { + push_indice( hBstr, ind, 0, 1 ); /* GR order = 1*/ + nb += 1; + } + else + { + push_indice( hBstr, ind, 1, 1 ); + push_indice( hBstr, ind, GR_ord >> 1, 1 ); /* '10' for GR ord = 0; '11' for GR ord 2 */ + nb += 2; + } + } + + if ( GR_ord == 0 ) + { + + nb += write_GR0( hBstr, ind, &in[1], len - 1 ); + } + else + { + if ( GR_ord == 1 ) + { + nb += write_GR1( hBstr, ind, &in[1], len - 1 ); + } + else + { + nb += write_GR2( hBstr, ind, &in[1], len - 1 ); + } + } + + return nb; +} diff --git a/lib_enc/ivas_stereo_classifier.c b/lib_enc/ivas_stereo_classifier.c new file mode 100644 index 0000000000000000000000000000000000000000..087bd8e3f313cce6c0294684cb2170d0c6ae6ce7 --- /dev/null +++ b/lib_enc/ivas_stereo_classifier.c @@ -0,0 +1,1145 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include "options.h" +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_rom_com.h" +#include "ivas_rom_enc.h" +#include "ivas_cnst.h" +#include "wmc_auto.h" + + +/*-------------------------------------------------------------------* + * Local constants + *-------------------------------------------------------------------*/ + +#define RC_FACT_UP 0.3f +#define RC_FACT_DOWN 0.7f +#define UNCLR_SCORE_THR 4.0f +#define XTALK_SCORE_THR_DFT 4.0f +#define XTALK_SCORE_THR_TD_UP 3.0f +#define XTALK_SCORE_THR_TD_DN 4.0f + +#define UNCLR_INTERCEPT_TD 0.780313f +#define UNCLR_INTERCEPT_DFT 1.226513f +#define XTALK_INTERCEPT_TD -1.770983f +#define XTALK_INTERCEPT_DFT -0.758556f + +#define EDGE_MAX_LEN 30 /* maximum length of buffer for edge detection */ +#define REDGE_MAX_LEN 30 /* maximum length of buffer for rising edge detection */ + +#define CLASSIFIER_ITD_THRES 8 /* ITD threshold in samples that enables classifier to switch */ + + +/*-------------------------------------------------------------------* + * Local function prototypes + *-------------------------------------------------------------------*/ + +static void rc_filter( const float x, float *y, const int16_t order, const float tau ); + +static void edge_detect( const float *inp, const int16_t len, const float inp_min, const float inp_max, float *edge_str, int16_t *edge_type ); + +static float redge_detect( const float *inp, const int16_t len, const float inp_min, const float inp_max ); + + +/*-------------------------------------------------------------------* + * Function select_stereo_mode() + * + * Select stereo technology based on output of stereo classifiers + *-------------------------------------------------------------------*/ + +/*! r: element mode */ +int16_t select_stereo_mode( + CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const int32_t ivas_total_brate /* i : IVAS total brate */ +) +{ + int16_t element_mode; + STEREO_CLASSIF_HANDLE hStereoClassif; + int16_t is_speech; + int16_t stereo_switching_flag; + + /* initialization */ + element_mode = hCPE->element_mode; + hStereoClassif = hCPE->hStereoClassif; + + /* set binary flag to prevent LRTD mode on music */ + hStereoClassif->is_speech = 0.97f * hStereoClassif->is_speech + 0.03f * hCPE->hCoreCoder[0]->hSpMusClas->past_dlp[0]; + is_speech = ( hStereoClassif->is_speech < 1.0f && hCPE->hCoreCoder[0]->hSpMusClas->wdlp_xtalk < 0.0f ); + + /* set binary flag indicating LRTD mode based on unclr/xtalk classifiers' decisions */ + hStereoClassif->prev_lrtd_mode = hStereoClassif->lrtd_mode; + hStereoClassif->unclr_decision = ( hStereoClassif->unclr_decision && hCPE->hCoreCoder[0]->flag_noisy_speech_snr == 0 && hCPE->element_brate > IVAS_16k4 ); + hStereoClassif->lrtd_mode = ( ( hStereoClassif->unclr_decision | hStereoClassif->xtalk_decision ) && is_speech ); + + stereo_switching_flag = 1; + if ( hCPE->element_brate >= MIN_BRATE_MDCT_STEREO || ( ivas_format >= MASA_FORMAT && ivas_total_brate < MASA_STEREO_MIN_BITRATE ) + ) + { + stereo_switching_flag = 0; + } + + if ( hCPE->element_brate >= MIN_BRATE_MDCT_STEREO && !( hCPE->element_brate == IVAS_48k && ivas_total_brate == IVAS_32k ) ) /* the second condition for PARAM mode OMASA */ + { + hStereoClassif->prev_lrtd_mode = 0; + hStereoClassif->lrtd_mode = 0; + element_mode = IVAS_CPE_MDCT; + } + else if ( hCPE->element_brate < MIN_BRATE_MDCT_STEREO && hCPE->last_element_mode == IVAS_CPE_MDCT ) + { + hStereoClassif->lrtd_mode = 0; + element_mode = IVAS_CPE_DFT; + + if ( hCPE->element_brate > IVAS_13k2 && hCPE->hCoreCoder[0]->hSpMusClas->past_dlp[0] < 1.0f && hCPE->hCoreCoder[0]->hSpMusClas->wdlp_xtalk < -0.01f && hCPE->hCoreCoder[0]->vad_flag == 1 && ( hCPE->hStereoMdct->sw_uncorr || hStereoClassif->xtalk_decision ) ) + { + hStereoClassif->lrtd_mode = 1; + element_mode = IVAS_CPE_TD; + } + } + + /* set the element mode */ + if ( hStereoClassif->lrtd_mode == 1 && stereo_switching_flag == 1 ) + { + element_mode = IVAS_CPE_TD; + } + else if ( element_mode < IVAS_CPE_MDCT ) + { + if ( element_mode == IVAS_CPE_TD ) + { + if ( hCPE->hStereoTD->prev_fr_LRTD_TD_dec > 0 && is_speech ) + { + /* if unclr_decision goes from 1->0 on active content, continue in LRTD mode */ + hStereoClassif->lrtd_mode = 1; + } + else if ( stereo_switching_flag == 1 ) + { + element_mode = IVAS_CPE_DFT; + } + } + else if ( stereo_switching_flag == 1 ) + { + element_mode = IVAS_CPE_DFT; + } + } + + /* switch from LRTD to DFT when xtalk_decision goes from 0->1 (note: this special case is not handled in the xtalk classifier) */ + if ( hCPE->last_element_mode == IVAS_CPE_TD && element_mode == IVAS_CPE_TD && hStereoClassif->xtalk_decision == 1 ) + { + if ( hCPE->hStereoTD->prev_fr_LRTD_TD_dec == 0 && hCPE->hStereoTD->tdm_FD2LRTD_SW_cnt > 15 && hCPE->hStereoTD->tdm_last_LRTD_frame_cnt > 3 && hCPE->hCoreCoder[0]->clas < VOICED_CLAS && ( hCPE->element_brate >= IVAS_16k4 || hStereoClassif->xtalk_wscore < 0.01f ) ) + { + if ( stereo_switching_flag == 1 ) + { + element_mode = IVAS_CPE_DFT; + } + hStereoClassif->xtalk_decision = 0; + hStereoClassif->lrtd_mode = 0; + } + } + + if ( hCPE->last_element_mode != element_mode ) + { + if ( hCPE->last_element_mode != IVAS_CPE_DFT && hCPE->last_element_mode != IVAS_CPE_TD ) + { + int16_t lrtd_mode = hStereoClassif->lrtd_mode; + /* reset stereo classifier when switching from MDCT stereo to Unified stereo */ + stereo_classifier_init( hCPE->hStereoClassif ); + + hStereoClassif->lrtd_mode = lrtd_mode; + } + else + { + /* reset UNCLR classifier parameters */ + set_f( hStereoClassif->unclr_fv, -1.0f, SSC_MAX_NFEA ); + hStereoClassif->unclr_corrLagMax_prev = 0; + + /* reset xtalk classifier parameters */ + set_f( hStereoClassif->xtalk_fv, -1.0f, SSC_MAX_NFEA ); + } + } + + if ( element_mode == IVAS_CPE_TD && hCPE->hCoreCoder[0]->Opt_DTX_ON ) + { + hCPE->hStereoCng->td_active = 1; + hCPE->hStereoCng->first_SID_after_TD = 1; + } + + return ( element_mode ); +} + + +/*-------------------------------------------------------------------* + * Function stereo_classifier_init() + * + * Initialize stereo classifier handle + *-------------------------------------------------------------------*/ + +void stereo_classifier_init( + STEREO_CLASSIF_HANDLE hStereoClassif /* i/o: stereo classifier structure */ +) +{ + /* initialization of features for xtalk classifier and UNCLR classifier */ + hStereoClassif->clas_ch1 = 0; + set_s( hStereoClassif->pitch_ch1, 0, 3 ); + set_f( hStereoClassif->voicing_ch1, 0.0f, 3 ); + hStereoClassif->cor_map_sum_ch1 = 0.0f; + set_f( hStereoClassif->lsf_ch1, 0.0f, M ); + hStereoClassif->lepsP_ch1 = 0.0f; + hStereoClassif->dE1_ch1 = 0.0f; + hStereoClassif->dE1_ch2 = 0.0f; + hStereoClassif->nchar_ch1 = 0.0f; + hStereoClassif->nchar_ch2 = 0.0f; + hStereoClassif->non_sta_ch1 = 0.0f; + hStereoClassif->sp_div_ch1 = 0.0f; + hStereoClassif->ps_diff_ch1 = 0.0f; + hStereoClassif->ps_diff_ch2 = 0.0f; + hStereoClassif->ps_sta_ch1 = 0.0f; + hStereoClassif->ps_sta_ch2 = 0.0f; + hStereoClassif->prev_g_IPD = 0.5f; + hStereoClassif->prev_IPD = 0.0f; + hStereoClassif->prev_ratio_m1_m2 = 0.0f; + set_f( hStereoClassif->xtalk_score_buf, 0.0f, XTALK_SCORE_BUF_LEN ); + hStereoClassif->ratio_L = 0.5f; + hStereoClassif->vad_flag_glob = 0; + hStereoClassif->vad_relE = 0; + hStereoClassif->is_speech = 0.0f; + + set_s( hStereoClassif->aEn_raw, 0, CPE_CHANNELS ); + + hStereoClassif->Etot_dn = 0.0f; + hStereoClassif->Etot_up = 0.0f; + + set_f( hStereoClassif->relE_buf, 0.0f, UNCLR_L_RELE ); + set_f( hStereoClassif->Etot_buf, 0.0f, UNCLR_L_ETOT ); + set_f( hStereoClassif->unclr_relE_0_1_LT, 0.0f, UNCLR_RC_ORDER ); + + hStereoClassif->unclr_sw_enable_cnt[0] = 0; + hStereoClassif->unclr_sw_enable_cnt[1] = 0; + + hStereoClassif->unclr_decision = 0; + hStereoClassif->unclr_wscore = 0.0f; + + set_f( hStereoClassif->unclr_fv, -1.0f, SSC_MAX_NFEA ); + hStereoClassif->unclr_corrLagMax_prev = 0; + hStereoClassif->ave_ener_L = 0; + hStereoClassif->ave_ener_R = 0; + hStereoClassif->relE_0_1 = 0.01f; + hStereoClassif->relE_0_1_LT = 0.01f; + + set_f( hStereoClassif->xtalk_fv, -1.0f, SSC_MAX_NFEA ); + hStereoClassif->xtalk_wscore = 0.0f; + hStereoClassif->xtalk_decision = 0; + hStereoClassif->xtalk_score_wrelE = 0.0f; + + hStereoClassif->lrtd_mode = 0; + hStereoClassif->prev_lrtd_mode = 0; + + hStereoClassif->silence_flag = 0; + + return; +} + + +/*-----------------------------------------------------------------* + * stereo_classifier_features() + * + * Collect features for stereo classifiers + *-----------------------------------------------------------------*/ + +void stereo_classifier_features( + STEREO_CLASSIF_HANDLE hStereoClassif, /* i/o: stereo classifier structure */ + const int16_t idchan, /* i : channel ID */ + const int16_t element_mode, /* i : element mode */ + const int16_t vad_flag, /* i : VAD flag */ + const float lsf_new[], /* i : LSFs at the end of the frame */ + const float epsP[], /* i : LP analysis residual energies for each iteration*/ + const int16_t pitch[], /* i : open-loop pitch values for quantiz. */ + const float voicing[], /* i : OL maximum normalized correlation */ + const float cor_map_sum, /* i : speech/music clasif. parameter */ + const float non_staX, /* i : unbound non-stationarity for sp/mu clas. */ + const float sp_div, /* i : spectral diversity feature */ + const int16_t clas /* i : signal class */ +) +{ + int16_t i, clas_ch2; + float lepsP_ch2, ener_l, ener_r; + + /* combine VAD flags from both channels */ + if ( idchan == 0 ) + { + hStereoClassif->vad_flag_glob = vad_flag; + } + else + { + hStereoClassif->vad_flag_glob |= vad_flag; + } + + if ( ( element_mode == IVAS_CPE_DFT && idchan == 0 ) || ( element_mode == IVAS_CPE_TD && idchan == 1 ) ) + { + /* update Etot_up and Etot_dn based on aEn */ + ener_l = 10.0f * log10f( hStereoClassif->ave_ener_L + 1.0f ); + ener_r = 10.0f * log10f( hStereoClassif->ave_ener_R + 1.0f ); + mvr2r( &hStereoClassif->Etot_buf[0], &hStereoClassif->Etot_buf[1], UNCLR_L_ETOT - 1 ); + hStereoClassif->Etot_buf[0] = max( 0, max( ener_l, ener_r ) ); + + if ( hStereoClassif->aEn_raw[0] == 6 || ( element_mode == IVAS_CPE_TD && hStereoClassif->aEn_raw[1] == 6 ) ) + { + /* active signal, update upper bound */ + if ( hStereoClassif->Etot_buf[0] < hStereoClassif->Etot_up ) + { + /* energy decreases -> slower update */ + hStereoClassif->Etot_up = 0.99f * hStereoClassif->Etot_up + 0.01f * hStereoClassif->Etot_buf[0]; + } + else + { + /* energy increases -> faster update */ + hStereoClassif->Etot_up = 0.95f * hStereoClassif->Etot_up + 0.05f * hStereoClassif->Etot_buf[0]; + } + } + else if ( ( element_mode == IVAS_CPE_DFT && hStereoClassif->aEn_raw[0] == 0 ) || + ( element_mode == IVAS_CPE_TD && hStereoClassif->aEn_raw[0] == 0 && hStereoClassif->aEn_raw[1] == 0 ) ) + { + /* inactive signal, update lower bound */ + if ( hStereoClassif->Etot_buf[0] < hStereoClassif->Etot_dn ) + { + /* energy decreases -> faster update */ + hStereoClassif->Etot_dn = 0.9f * hStereoClassif->Etot_dn + 0.1f * hStereoClassif->Etot_buf[0]; + } + else + { + /* energy increases -> slower update */ + hStereoClassif->Etot_dn = 0.95f * hStereoClassif->Etot_dn + 0.05f * hStereoClassif->Etot_buf[0]; + } + + if ( hStereoClassif->Etot_dn < 30.0f ) + { + /* do not decrease below lower bound threshold */ + hStereoClassif->Etot_dn = 30.0f; + } + } + + /* upper bound is too low and close to lower bound -> update it */ + if ( hStereoClassif->Etot_up < hStereoClassif->Etot_dn + 20.0f ) + { + hStereoClassif->Etot_up = hStereoClassif->Etot_dn + 20.0f; + } + + /* normalize Etot to (0,1) */ + hStereoClassif->relE_0_1 = lin_interp( hStereoClassif->Etot_buf[0], hStereoClassif->Etot_dn, 0.0f, hStereoClassif->Etot_up, 0.9f, 1 ); + + /* update relE_buf */ + mvr2r( &hStereoClassif->relE_buf[0], &hStereoClassif->relE_buf[1], UNCLR_L_RELE - 1 ); + hStereoClassif->relE_buf[0] = hStereoClassif->relE_0_1; + + if ( hStereoClassif->relE_0_1 >= hStereoClassif->relE_buf[1] ) + { + hStereoClassif->relE_0_1_LT = 0.9f * hStereoClassif->relE_0_1_LT + 0.1f * hStereoClassif->relE_0_1; + } + else + { + hStereoClassif->relE_0_1_LT = 0.95f * hStereoClassif->relE_0_1_LT + 0.05f * hStereoClassif->relE_0_1; + } + + /* estimate VAD flag based on relative energy */ + if ( hStereoClassif->relE_0_1_LT < 0.1f ) + { + hStereoClassif->vad_relE = 0; + } + else + { + hStereoClassif->vad_relE = 1; + } + + /* combine classical VAD flag with VAD flag based on relative energy */ + hStereoClassif->vad_flag_glob &= hStereoClassif->vad_relE; + } + + if ( idchan == 0 ) + { + mvr2r( lsf_new, hStereoClassif->lsf_ch1, M ); + hStereoClassif->lepsP_ch1 = logf( epsP[13] + 1e-5f ) - logf( epsP[0] + 1e-5f ); + + hStereoClassif->xtalk_fv[E_lsf_1] = lsf_new[0]; + hStereoClassif->xtalk_fv[E_lsf_4] = lsf_new[3]; + hStereoClassif->xtalk_fv[E_lsf_9] = lsf_new[8]; + hStereoClassif->xtalk_fv[E_lsf_14] = lsf_new[13]; + hStereoClassif->xtalk_fv[E_lepsP_13] = hStereoClassif->lepsP_ch1; + } + else + { + hStereoClassif->xtalk_fv[E_sum_d_LSF] = 0; + for ( i = 0; i < M; i++ ) + { + hStereoClassif->xtalk_fv[E_sum_d_LSF] += fabsf( lsf_new[i] - hStereoClassif->lsf_ch1[i] ); + } + + if ( hStereoClassif->vad_flag_glob && ( hStereoClassif->ratio_L > 0.0f && hStereoClassif->ratio_L < 1.0f ) ) + { + hStereoClassif->xtalk_fv[E_sum_d_LSF] = 0.0f; + } + lepsP_ch2 = logf( epsP[13] + 1e-5f ) - logf( epsP[0] + 1e-5f ); + hStereoClassif->xtalk_fv[E_d_lepsP_13] = fabsf( hStereoClassif->lepsP_ch1 - lepsP_ch2 ); + } + + if ( idchan == 0 ) + { + mvs2s( pitch, hStereoClassif->pitch_ch1, 3 ); + mvr2r( voicing, hStereoClassif->voicing_ch1, 3 ); + + hStereoClassif->xtalk_fv[E_pitch] = 1 / 3.0f * ( pitch[0] + pitch[1] + pitch[2] ); + hStereoClassif->xtalk_fv[E_voicing] = 1 / 3.0f * ( voicing[0] + voicing[1] + voicing[2] ); + } + else + { + hStereoClassif->xtalk_fv[E_d_pitch] = 0; + hStereoClassif->xtalk_fv[E_d_voicing] = 0; + for ( i = 0; i < 3; i++ ) + { + hStereoClassif->xtalk_fv[E_d_pitch] += (float) abs( pitch[i] - hStereoClassif->pitch_ch1[i] ); + hStereoClassif->xtalk_fv[E_d_voicing] += fabsf( voicing[i] - hStereoClassif->voicing_ch1[i] ); + } + hStereoClassif->xtalk_fv[E_d_pitch] /= 3.0f; + hStereoClassif->xtalk_fv[E_d_voicing] /= 3.0f; + } + + if ( idchan == 0 ) + { + hStereoClassif->cor_map_sum_ch1 = cor_map_sum; + hStereoClassif->non_sta_ch1 = non_staX; + hStereoClassif->sp_div_ch1 = sp_div; + + hStereoClassif->xtalk_fv[E_cor_map_sum] = cor_map_sum; + hStereoClassif->xtalk_fv[E_nchar] = logf( hStereoClassif->nchar_ch1 + 1.0f ); + hStereoClassif->xtalk_fv[E_non_sta] = non_staX; + hStereoClassif->xtalk_fv[E_sp_div] = logf( sp_div + 1.0f ); + } + else + { + hStereoClassif->xtalk_fv[E_d_cor_map_sum] = fabsf( hStereoClassif->cor_map_sum_ch1 - cor_map_sum ); + hStereoClassif->xtalk_fv[E_d_nchar] = fabsf( logf( hStereoClassif->nchar_ch1 + 1.0f ) - logf( hStereoClassif->nchar_ch2 + 1.0f ) ); + hStereoClassif->xtalk_fv[E_d_non_sta] = fabsf( hStereoClassif->non_sta_ch1 - non_staX ); + hStereoClassif->xtalk_fv[E_d_sp_div] = fabsf( logf( hStereoClassif->sp_div_ch1 + 1.0f ) - logf( sp_div + 1.0f ) ); + } + + if ( idchan == 0 ) + { + hStereoClassif->xtalk_fv[E_dE1] = logf( hStereoClassif->dE1_ch1 + 1.0f ); + } + else + { + hStereoClassif->xtalk_fv[E_d_dE1] = fabsf( logf( hStereoClassif->dE1_ch1 + 1.0f ) - logf( hStereoClassif->dE1_ch2 + 1.0f ) ); + } + + if ( idchan == 0 ) + { + if ( clas > VOICED_CLAS ) + { + hStereoClassif->clas_ch1 = VOICED_CLAS; + } + else if ( clas < VOICED_CLAS ) + { + hStereoClassif->clas_ch1 = UNVOICED_CLAS; + } + else + { + hStereoClassif->clas_ch1 = clas; + } + + hStereoClassif->xtalk_fv[E_clas] = hStereoClassif->clas_ch1; + } + else + { + if ( clas > VOICED_CLAS ) + { + clas_ch2 = VOICED_CLAS; + } + else if ( clas < VOICED_CLAS ) + { + clas_ch2 = UNVOICED_CLAS; + } + else + { + clas_ch2 = clas; + } + + hStereoClassif->xtalk_fv[E_d_clas] = (float) abs( hStereoClassif->clas_ch1 - clas_ch2 ); + } + + if ( idchan == 0 ) + { + hStereoClassif->xtalk_fv[E_ps_diff] = hStereoClassif->ps_diff_ch1; + hStereoClassif->xtalk_fv[E_ps_sta] = hStereoClassif->ps_sta_ch1; + } + else + { + hStereoClassif->xtalk_fv[E_d_ps_diff] = fabsf( hStereoClassif->ps_diff_ch1 - hStereoClassif->ps_diff_ch2 ); + hStereoClassif->xtalk_fv[E_d_ps_sta] = fabsf( hStereoClassif->ps_sta_ch1 - hStereoClassif->ps_sta_ch2 ); + } + + return; +} + + +/*-------------------------------------------------------------------* + * Function unclr_classifier_td() + * + * Classify current TD frame as uncorrelated L/R (1) or normal (0) + *-------------------------------------------------------------------*/ + +void unclr_classifier_td( + CPE_ENC_HANDLE hCPE /* i/o: CPE encoder structure */ +) +{ + int16_t i, ind; + float relE_ST, edge, edge_0_1; + float score, fvn[SSC_MAX_NFEA]; + STEREO_CLASSIF_HANDLE hStereoClassif = hCPE->hStereoClassif; + + set_f( fvn, -1.0f, SSC_MAX_NFEA ); + + /* calcualte raw score based on LR */ + score = UNCLR_INTERCEPT_TD; + for ( i = 0; i < SIZE_UNCLR_ISEL_TD; i++ ) + { + ind = unclr_isel_td[i]; + + /* mean & std removal */ + fvn[i] = ( hStereoClassif->unclr_fv[ind] - unclr_mean_td[i] ) / unclr_scale_td[i]; + + /* LR */ + score += fvn[i] * unclr_coef_td[i]; + } + + + /* normalize score to -1:+1 */ + if ( score > UNCLR_SCORE_THR ) + { + score = UNCLR_SCORE_THR; + } + else if ( score < -UNCLR_SCORE_THR ) + { + score = -UNCLR_SCORE_THR; + } + score /= 2 * UNCLR_SCORE_THR; + + /* weight raw score with relative energy */ + score *= hStereoClassif->relE_0_1; + + /* rising edge detection on relE */ + relE_ST = mean( hStereoClassif->relE_buf, UNCLR_L_RELE ); + if ( hStereoClassif->relE_0_1 > relE_ST ) + { + rc_filter( hStereoClassif->relE_0_1, hStereoClassif->unclr_relE_0_1_LT, UNCLR_RC_ORDER, RC_FACT_UP ); + } + else + { + rc_filter( hStereoClassif->relE_0_1, hStereoClassif->unclr_relE_0_1_LT, UNCLR_RC_ORDER, RC_FACT_DOWN ); + } + + edge = hStereoClassif->relE_0_1 - hStereoClassif->unclr_relE_0_1_LT[UNCLR_RC_ORDER - 1]; + edge_0_1 = lin_interp( edge, 0.0f, 0.95f, 1.0f, 0.9f, 1 ); + + /* LT average */ + hStereoClassif->unclr_wscore = edge_0_1 * hStereoClassif->unclr_wscore + ( 1 - edge_0_1 ) * score; + + /* binary decision w. hysteresis (switch the decision only when coder_type is GC, UC or IC) */ + if ( ( ( hStereoClassif->unclr_decision == 0 && hStereoClassif->unclr_wscore > 0.1f ) || ( hStereoClassif->unclr_decision == 1 && hStereoClassif->unclr_wscore < -0.07f ) ) && ( hStereoClassif->unclr_sw_enable_cnt[0] > 0 || hStereoClassif->unclr_sw_enable_cnt[1] > 0 ) ) + { + /* let's switch the binary decision */ + hStereoClassif->unclr_decision = !hStereoClassif->unclr_decision; + } + + + return; +} + + +/*-------------------------------------------------------------------* + * Function unclr_classifier_dft() + * + * Classifies current DFT frame as uncorrelated L/R (1) or normal stereo (0) + *-------------------------------------------------------------------*/ + +void unclr_classifier_dft( + CPE_ENC_HANDLE hCPE /* i/o: CPE encoder structure */ +) +{ + int16_t i, ind; + float edge, relE_ST, edge_0_1; + float score, fvn[SSC_MAX_NFEA]; + + STEREO_CLASSIF_HANDLE hStereoClassif = hCPE->hStereoClassif; + + /* calculate raw score based on LR */ + score = UNCLR_INTERCEPT_DFT; + for ( i = 0; i < SIZE_UNCLR_ISEL_DFT; i++ ) + { + ind = unclr_isel_dft[i]; + + /* mean & std removal */ + fvn[i] = ( hStereoClassif->unclr_fv[ind] - unclr_mean_dft[i] ) / unclr_scale_dft[i]; + + /* LR */ + score += fvn[i] * unclr_coef_dft[i]; + } + + + /* normalize score to -1:+1 */ + if ( score > UNCLR_SCORE_THR ) + { + score = UNCLR_SCORE_THR; + } + else if ( score < -UNCLR_SCORE_THR ) + { + score = -UNCLR_SCORE_THR; + } + score /= 2 * UNCLR_SCORE_THR; + + /* weight raw score with relative energy */ + score *= hStereoClassif->relE_0_1; + + if ( !hStereoClassif->vad_flag_glob ) + { + score = 0; + } + + /* rising edge detector on relE */ + relE_ST = mean( hStereoClassif->relE_buf, UNCLR_L_RELE ); + if ( hStereoClassif->relE_0_1 > relE_ST ) + { + rc_filter( hStereoClassif->relE_0_1, hStereoClassif->unclr_relE_0_1_LT, UNCLR_RC_ORDER, RC_FACT_UP ); + } + else + { + rc_filter( hStereoClassif->relE_0_1, hStereoClassif->unclr_relE_0_1_LT, UNCLR_RC_ORDER, RC_FACT_DOWN ); + } + + edge = hStereoClassif->relE_0_1 - hStereoClassif->unclr_relE_0_1_LT[UNCLR_RC_ORDER - 1]; + edge_0_1 = lin_interp( edge, 0.0f, 0.95f, 1.0f, 0.9f, 1 ); + + /* LT average */ + hStereoClassif->unclr_wscore = edge_0_1 * hStereoClassif->unclr_wscore + ( 1 - edge_0_1 ) * score; + + /* binary decision w. hysteresis (switch the decision only when coder_type is GC, UC or IC) */ + if ( ( ( hStereoClassif->unclr_decision == 0 && hStereoClassif->unclr_wscore > 0.1f ) || ( hStereoClassif->unclr_decision == 1 && hStereoClassif->unclr_wscore < -0.07f ) ) && ( hStereoClassif->unclr_sw_enable_cnt[0] > 0 ) ) + { + /* let's switch the binary decision */ + hStereoClassif->unclr_decision = !hStereoClassif->unclr_decision; + } + + + return; +} + + +/*-------------------------------------------------------------------* + * Function xtalk_classifier_td() + * + * Classify current TD frame as cross-talk frame (1) or normal stereo frame (0) + *-------------------------------------------------------------------*/ + +void xtalk_classifier_td( + CPE_ENC_HANDLE hCPE /* i/o: CPE encoder structure */ +) +{ + int16_t i, ind, edge_type; + float score, fvn[SSC_MAX_NFEA]; + float edge, edge_0_1, wedge, scr_min, scr_max, wrelE; + + + STEREO_CLASSIF_HANDLE hStereoClassif = hCPE->hStereoClassif; + + set_f( fvn, -1.0f, SSC_MAX_NFEA ); + + /* calcualte raw score based on LR */ + score = XTALK_INTERCEPT_TD; + for ( i = 0; i < SIZE_XTALK_ISEL_TD; i++ ) + { + ind = xtalk_isel_td[i]; + + /* mean & std removal */ + fvn[i] = ( hStereoClassif->xtalk_fv[ind] - xtalk_mean_td[i] ) / xtalk_scale_td[i]; + + /* LR */ + score += fvn[i] * xtalk_coef_td[i]; + } + + /* normalize raw score to -1:+1 */ + if ( score > XTALK_SCORE_THR_TD_UP ) + { + score = 1.0f; + } + else if ( score < -XTALK_SCORE_THR_TD_DN ) + { + score = -1.0f; + } + else if ( score > 0.0f ) + { + score /= XTALK_SCORE_THR_TD_UP; + } + else + { + score /= XTALK_SCORE_THR_TD_DN; + } + + if ( hCPE->last_element_mode == IVAS_CPE_DFT ) + { + /* overwrite score if we have just switched from DFT stereo */ + score = hStereoClassif->xtalk_score; + } + else + { + hStereoClassif->xtalk_score = score; + } + + if ( !hStereoClassif->vad_flag_glob ) + { + /* reset score to 0 in inactive segments */ + score = 0; + } + + + /* weight raw score with relative energy */ + wrelE = lin_interp( hStereoClassif->relE_0_1, 0.5f, 0.95f, 0.9f, 0.0f, 1 ); + hStereoClassif->xtalk_score_wrelE = wrelE * hStereoClassif->xtalk_score_wrelE + ( 1 - wrelE ) * score; + score = hStereoClassif->xtalk_score_wrelE; + + /* rising edge detector on raw score -> yields 1 if strong rising edge is detected in the raw score buffer */ + mvr2r( &hStereoClassif->xtalk_score_buf[0], &hStereoClassif->xtalk_score_buf[1], XTALK_SCORE_BUF_LEN - 1 ); + hStereoClassif->xtalk_score_buf[0] = score; + + minimum( hStereoClassif->xtalk_score_buf, XTALK_SCORE_BUF_LEN, &scr_min ); + maximum( hStereoClassif->xtalk_score_buf, XTALK_SCORE_BUF_LEN, &scr_max ); + + if ( ( ( scr_min < 0.0f && scr_max > 0.2f ) || ( scr_max - scr_min > 0.5f ) ) ) + { + /* test rising edge (use 0 as edge_type because of newer->older buffer samples ordering) */ + edge_type = 0; + edge_detect( hStereoClassif->xtalk_score_buf, XTALK_SCORE_BUF_LEN, -0.2f, 1.0f, &edge, &edge_type ); + + if ( edge_type == 0 && edge < 0.3f ) + { + /* normalize edge to 0-1 interval */ + edge_0_1 = lin_interp( 1 - edge, 1.0f, 1.0f, 0.6f, 0.0f, 1 ); + } + else + { + edge_0_1 = 0; + } + } + else + { + edge_0_1 = 0.0f; + } + + /* weight raw score based on rising edge detector */ + wedge = lin_interp( edge_0_1, 0.0f, 0.9f, 1.0f, 0.5f, 1 ); + + hStereoClassif->xtalk_wscore = wedge * hStereoClassif->xtalk_wscore + ( 1 - wedge ) * score; + + if ( !hStereoClassif->vad_flag_glob ) + { + hStereoClassif->xtalk_wscore = 0; + } + + /* binary decision w. hysteresis (switch the decision only when coder_type is GC, UC or IC) */ + if ( ( hStereoClassif->unclr_decision == 0 && hStereoClassif->xtalk_decision == 0 && hStereoClassif->xtalk_wscore > 0.03f ) /*|| (hStereoClassif->xtalk_decision == 1 && hStereoClassif->xtalk_wscore < 0.00f)*/ && ( hStereoClassif->unclr_sw_enable_cnt[0] > 0 || hStereoClassif->unclr_sw_enable_cnt[1] > 0 ) ) + { + /* let's switch the binary decision */ + hStereoClassif->xtalk_decision = !hStereoClassif->xtalk_decision; + } + + + return; +} + + +/*-------------------------------------------------------------------* + * Function xtalk_classifier_dft() + * + * Classify current DFT frame as cross-talk frame (1) or normal stereo frame (0) + *-------------------------------------------------------------------*/ + +void xtalk_classifier_dft( + CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ + const int16_t itd, /* i : ITD from DFT stereo - used as a feature */ + const float gcc_phat[] /* i : GPHAT cross-channel correlation function*/ +) +{ + int16_t i, ind, itd2, thr; + float score, m1, m2; + STEREO_CLASSIF_HANDLE hStereoClassif; + ITD_DATA_HANDLE hItd; + float fvn[SSC_MAX_NFEA], edge, edge_0_1, wedge; + float ratio_m1_m2, m2_m2, d_itd2, itd1_flip; + float scr_min, scr_max; + + hStereoClassif = hCPE->hStereoClassif; + hItd = ( hCPE->hStereoDft != NULL ) ? hCPE->hStereoDft->hItd : hCPE->hStereoMdct->hItd; + + m1 = 0.0f; + m2 = 0.0f; + + itd2 = 0; + thr = ( hCPE->element_brate >= IVAS_32k ? 2 : 1 ) * CLASSIFIER_ITD_THRES; + + if ( itd > thr ) + { + m1 = fabsf( gcc_phat[itd + XTALK_PHAT_LEN] ); + m2 = fabsf( gcc_phat[0] ); + itd2 = -XTALK_PHAT_LEN; + for ( i = 1; i < XTALK_PHAT_LEN - thr; i++ ) + { + if ( fabsf( gcc_phat[i] ) > m2 ) + { + itd2 = -XTALK_PHAT_LEN + i; + m2 = fabsf( gcc_phat[i] ); + } + } + } + else if ( itd < -thr ) + { + m1 = fabsf( gcc_phat[itd + XTALK_PHAT_LEN] ); + m2 = fabsf( gcc_phat[XTALK_PHAT_LEN + thr + 1] ); + itd2 = thr + 1; + for ( i = XTALK_PHAT_LEN + thr + 2; i < 2 * XTALK_PHAT_LEN + 1; i++ ) + { + if ( fabsf( gcc_phat[i] ) > m2 ) + { + itd2 = -XTALK_PHAT_LEN + i; + m2 = fabsf( gcc_phat[i] ); + } + } + } + + ratio_m1_m2 = fabsf( m1 * m2 ) / fabsf( m1 + m2 + 1.0f ); + m2_m2 = hItd->prev_m2 * m2; + d_itd2 = (float) abs( itd2 - hItd->prev_itd2 ); + itd1_flip = (float) ( max( itd, hItd->prev_itd1 ) * ( -min( itd, hItd->prev_itd1 ) ) ); + + + hStereoClassif->xtalk_fv[E_gphat_d_itd2] = d_itd2; + hStereoClassif->xtalk_fv[E_gphat_itd1_flip] = itd1_flip; + hStereoClassif->xtalk_fv[E_gphat_ratio_m1_m2] = ratio_m1_m2 * hStereoClassif->prev_ratio_m1_m2; + hStereoClassif->xtalk_fv[E_gphat_m2_m2] = m2_m2; + + hStereoClassif->prev_ratio_m1_m2 = ratio_m1_m2; + + set_f( fvn, -1.0f, SSC_MAX_NFEA ); + + /* calcualte raw score based on LR */ + score = XTALK_INTERCEPT_DFT; + for ( i = 0; i < SIZE_XTALK_ISEL_DFT; i++ ) + { + ind = xtalk_isel_dft[i]; + + /* mean & std removal */ + fvn[i] = ( hStereoClassif->xtalk_fv[ind] - xtalk_mean_dft[i] ) / xtalk_scale_dft[i]; + + /* LR */ + score += fvn[i] * xtalk_coef_dft[i]; + } + + /* normalize score to -1:+1 */ + if ( score > XTALK_SCORE_THR_DFT ) + { + score = 1.0f; + } + else if ( score < -XTALK_SCORE_THR_DFT ) + { + score = -1.0f; + } + else + { + score /= XTALK_SCORE_THR_DFT; + } + + /* raw score */ + hStereoClassif->xtalk_score = score; + + if ( !hStereoClassif->vad_flag_glob ) + { + score = 0; + } + + + + /* rising edge detector on raw score -> yields 1 if strong rising edge is detected in the given buffer */ + mvr2r( &hStereoClassif->xtalk_score_buf[0], &hStereoClassif->xtalk_score_buf[1], XTALK_SCORE_BUF_LEN - 1 ); + hStereoClassif->xtalk_score_buf[0] = score; + + minimum( hStereoClassif->xtalk_score_buf, XTALK_SCORE_BUF_LEN, &scr_min ); + maximum( hStereoClassif->xtalk_score_buf, XTALK_SCORE_BUF_LEN, &scr_max ); + + if ( scr_min < 0.2f && scr_max > 0.0f ) + { + edge = redge_detect( hStereoClassif->xtalk_score_buf, XTALK_SCORE_BUF_LEN, -0.2f, 1.0f ); + edge_0_1 = lin_interp( 1 - edge, 1.0f, 1.0f, 0.83f, 0.0f, 1 ); + } + else + { + edge_0_1 = 0.0f; + } + + /* weight raw score based on rising edge detector */ + wedge = lin_interp( edge_0_1, 0.0f, 0.95f, 1.0f, 0.3f, 1 ); + hStereoClassif->xtalk_wscore = wedge * hStereoClassif->xtalk_wscore + ( 1 - wedge ) * score; + + if ( ( itd == 0 ) || ( hCPE->hCoreCoder[0]->vad_flag == 0 ) ) + { + hStereoClassif->xtalk_decision = 0; + } + else if ( hCPE->element_brate >= IVAS_24k4 && + hStereoClassif->xtalk_decision == 0 && ( ( m1 * 0.8 < m2 && hItd->prev_m1 * 0.8 < hItd->prev_m2 && abs( itd2 - hItd->prev_itd2 ) < 4 && m1 > 0.15 && hItd->prev_m1 > 0.15 ) || ( hStereoClassif->xtalk_wscore > 0.8 ) || ( itd > thr && hItd->prev_itd1 < -thr && hStereoClassif->silence_flag == 0 ) || ( hItd->prev_itd1 > thr && itd < -thr && hStereoClassif->silence_flag == 0 ) ) && + hCPE->hCoreCoder[0]->vad_flag == 1 && hCPE->hCoreCoder[0]->flag_noisy_speech_snr == 0 && hCPE->hCoreCoder[0]->hNoiseEst->aEn_inac_cnt > 15 ) + { + hStereoClassif->xtalk_decision = 1; + } + else if ( hCPE->element_brate >= IVAS_16k4 && hStereoClassif->xtalk_decision == 0 && abs( itd ) > STEREO_DFT_ITD_MAX && ( hCPE->hCoreCoder[0]->lp_speech - hCPE->hCoreCoder[0]->lp_noise ) > 25.0f ) + { + hStereoClassif->xtalk_decision = 1; + } + + + /* updates */ + hItd->prev_m1 = m1; + hItd->prev_m2 = m2; + hItd->prev_itd1 = itd; + hItd->prev_itd2 = itd2; + + return; +} + + +/*-------------------------------------------------------------------* + * Function rc_filter() + * + * + *-------------------------------------------------------------------*/ + +static void rc_filter( + const float x, + float *y, + const int16_t order, + const float tau ) +{ + int16_t i; + + y[0] = tau * y[0] + ( 1 - tau ) * x; + for ( i = 1; i < order; i++ ) + { + y[i] = tau * y[i] + ( 1 - tau ) * y[i - 1]; + } + + return; +} + + +/*-------------------------------------------------------------------* + * Function edge_detect() + * + * Rising/falling edge detection algorithm + * Analyzes the input buffer and outputs strength and type of the detected edge (rising or falling) + * Set edge_type to 0/1/2 when calling this function to specify the edge type you want to detect. The returned value will be modified + * according to the edge type detected (-1 indicates that no edge has been detected) + *-------------------------------------------------------------------*/ + +static void edge_detect( + const float *inp, /* i : input buffer */ + const int16_t len, /* i : length of the input buffer */ + const float inp_min, /* i : minimum value for edge detection */ + const float inp_max, /* i : maximum value for edge detection */ + float *edge_str, /* o : edge strength (from 0 to Inf) */ + int16_t *edge_type /* i/o: edge type (to be) detected: 0 = falling, 1 = rising, 2 = both */ +) +{ + int16_t i, j, et; + float y, err, edge_slope, edge[EDGE_MAX_LEN]; + float edge_min, err0; + + et = -1; + edge_min = 1e7f; + + if ( *edge_type == 0 || *edge_type == 2 ) + { + /* falling edge detection */ + set_f( edge, 0.0f, EDGE_MAX_LEN ); + + /* set error at 0th index */ + if ( inp[0] > inp_max ) + { + err0 = 0.0f; + } + else + { + /* inhibits edge smearing effect */ + err0 = powf( inp[0] - inp_max, 2 ); + } + + /* test edges on intervals from 2 to len */ + for ( i = 1; i < len; i++ ) + { + edge_slope = ( inp_max - inp_min ) / i; + edge[i] = err0; + for ( j = 1; j <= i; j++ ) + { + y = inp_max - edge_slope * j; + err = y - check_bounds( inp[j], inp_min, inp_max ); + edge[i] += err * err; + } + + edge[i] /= i + 1; + + if ( edge[i] < edge_min ) + { + edge_min = edge[i]; + et = 0; + } + } + } + + if ( *edge_type == 1 || *edge_type == 2 ) + { + /* rising edge detection */ + set_f( edge, 0.0f, EDGE_MAX_LEN ); + + /* set error at 0th index */ + if ( inp[0] < inp_min ) + { + err0 = 0.0f; + } + else + { + /* inhibits edge smearing effect */ + err0 = powf( inp[0] - inp_min, 2 ); + } + + /* test edges on intervals from 2 to len */ + for ( i = 1; i <= len; i++ ) + { + edge_slope = ( inp_max - inp_min ) / i; + edge[i] = err0; + for ( j = 1; j < i; j++ ) + { + y = inp_min + edge_slope * j; + err = y - check_bounds( inp[j], inp_min, inp_max ); + edge[i] += err * err; + } + + edge[i] /= i + 1; + + if ( edge[i] < edge_min ) + { + edge_min = edge[i]; + et = 1; + } + } + } + + *edge_str = edge_min; + *edge_type = et; + + return; +} + + +/*-------------------------------------------------------------------* + * Function redge_detect() + * + * Rising edge detection algorithm + * Analyzes the input buffer and outputs value close to 1 when it detects strong rising edge + *-------------------------------------------------------------------*/ + +/*! r: rising edge strength normalized to 0-1 */ +static float redge_detect( + const float *inp, /* i : input buffer (ordered from newest to oldest values)*/ + const int16_t len, /* i : length of the input buffer */ + const float inp_min, /* i : minimum value for edge detection */ + const float inp_max /* i : maximum value for edge detection */ +) +{ + int16_t i, j; + float y, err, edge_slope, edge[REDGE_MAX_LEN]; + float edge_min, err0; + + set_f( edge, 0.0f, REDGE_MAX_LEN ); + edge_min = 1e7f; + + /* test rising edges on intervals from 2 to len */ + if ( inp[0] > inp_max ) + { + err0 = 0.0f; + } + else + { + err0 = powf( inp[0] - inp_max, 2 ); + } + for ( i = 1; i < len; i++ ) + { + edge_slope = ( inp_max - inp_min ) / i; + edge[i] = err0; + for ( j = 1; j < i; j++ ) + { + y = inp_max - edge_slope * j; + if ( inp[j] == inp[j - 1] && inp[j] == inp_max ) + { + /* we are saturated at inp_max */ + err = 0.0f; + } + else if ( inp[j] < inp_min ) + { + /* we are below inp_min */ + err = y - inp_min; + } + else + { + err = y - inp[j]; + } + err = err * err; + edge[i] += err; + } + + edge[i] /= i + 1; + + if ( edge[i] < edge_min ) + { + edge_min = edge[i]; + } + } + + return edge_min; +} diff --git a/lib_enc/ivas_stereo_cng_enc.c b/lib_enc/ivas_stereo_cng_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..10a87659a60237a0a214f25c17124fc8383590d1 --- /dev/null +++ b/lib_enc/ivas_stereo_cng_enc.c @@ -0,0 +1,524 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "rom_enc.h" +#include "rom_com.h" +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_cnst.h" +#include "ivas_rom_com.h" +#include "wmc_auto.h" + + +/*------------------------------------------------------------------- + * Local constants + *-------------------------------------------------------------------*/ + +#define COH_FADE_MAX 4 +#define COH_FADE_UPDATES 2 + + +/*--------------------------------------------------------------- + * stereo_dft_enc_sid_calc_coh() + * + * Encodes the coherence in SID frames + * ---------------------------------------------------------------*/ + +void stereo_dft_enc_sid_calc_coh( + STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i/o: DFT stereo handle */ + float prev_cohBand[2 * ( STEREO_DFT_BAND_MAX / 2 )], /* i/o: Previous coherence */ + int16_t *td_active, /* i/o: TD stereo mode indicator */ + int16_t *first_SID, /* i/o: First SID indicator */ + float *cohBand /* i/o: Coherence per band */ +) +{ + int16_t b, k; + float coh_weight; + float coh_weight_sum; + float xspec_scale; + /* Cluster the coherence into bands using a weighted average. The coherence is weighted with the energy spectrum of the + mixdown signal. */ + for ( b = 0; b < hStereoDft->nbands; b++ ) + { + cohBand[b] = 0; + coh_weight_sum = 0; + + if ( hStereoDft->coh_fade_counter == 0 && !*first_SID ) + { + for ( k = hStereoDft->band_limits[b]; k < hStereoDft->band_limits[b + 1]; k++ ) + { + xspec_scale = sqrtf( ( prev_cohBand[b] * ( hStereoDft->Spd_L_smooth[k] * hStereoDft->Spd_R_smooth[k] ) ) / ( hStereoDft->xspec_smooth[2 * k] * hStereoDft->xspec_smooth[2 * k] + hStereoDft->xspec_smooth[2 * k + 1] * hStereoDft->xspec_smooth[2 * k + 1] + EPSILON ) ); + hStereoDft->xspec_smooth[2 * k] *= xspec_scale; + hStereoDft->xspec_smooth[2 * k + 1] *= xspec_scale; + } + + cohBand[b] = prev_cohBand[b]; + } + else + { + for ( k = hStereoDft->band_limits[b]; k < hStereoDft->band_limits[b + 1]; k++ ) + { + coh_weight = hStereoDft->DFT[0][2 * k] * hStereoDft->DFT[0][2 * k] + hStereoDft->DFT[0][2 * k + 1] * hStereoDft->DFT[0][2 * k + 1]; + cohBand[b] += coh_weight * ( hStereoDft->xspec_smooth[2 * k] * hStereoDft->xspec_smooth[2 * k] + hStereoDft->xspec_smooth[2 * k + 1] * hStereoDft->xspec_smooth[2 * k + 1] ) / ( hStereoDft->Spd_L_smooth[k] * hStereoDft->Spd_R_smooth[k] + EPSILON ); + coh_weight_sum += coh_weight; + } + if ( coh_weight_sum > 0 ) + { + cohBand[b] = cohBand[b] / coh_weight_sum; + } + } + } + + if ( *first_SID ) + { + mvr2r( cohBand, prev_cohBand, hStereoDft->nbands ); + mvr2r( prev_cohBand, &( prev_cohBand[STEREO_DFT_BAND_MAX / 2] ), hStereoDft->nbands ); + *first_SID = 0; + } + + if ( hStereoDft->coh_fade_counter < COH_FADE_MAX && ( *td_active || hStereoDft->currentNumUpdates < COH_FADE_UPDATES ) ) + { + for ( b = 0; b < hStereoDft->nbands; b++ ) + { + cohBand[b] = ( cohBand[b] * hStereoDft->coh_fade_counter + prev_cohBand[b] * ( COH_FADE_MAX - hStereoDft->coh_fade_counter ) ) / COH_FADE_MAX; + } + hStereoDft->coh_fade_counter++; + if ( hStereoDft->coh_fade_counter > 0 ) + { + mvr2r( &prev_cohBand[STEREO_DFT_BAND_MAX / 2], prev_cohBand, hStereoDft->nbands ); + } + mvr2r( cohBand, &prev_cohBand[STEREO_DFT_BAND_MAX / 2], hStereoDft->nbands ); + } + else + { + if ( hStereoDft->coh_fade_counter > 0 ) + { + mvr2r( &prev_cohBand[STEREO_DFT_BAND_MAX / 2], prev_cohBand, hStereoDft->nbands ); + } + mvr2r( cohBand, &prev_cohBand[STEREO_DFT_BAND_MAX / 2], hStereoDft->nbands ); + hStereoDft->coh_fade_counter = COH_FADE_MAX; + *td_active = 0; + } + + return; +} + + +/*--------------------------------------------------------------- + * stereo_dft_enc_sid_coh() + * + * Encodes the coherence in SID frames + * ---------------------------------------------------------------*/ + +void stereo_dft_enc_sid_coh( + BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ + float *mem_cohBand, /* i/o: Coherence memory */ + const int16_t nbands, /* i : number of DFT stereo bands */ + int16_t *nb_bits, /* i/o: number of bits written */ + float *cohBand /* i/o: Coherence per band */ +) +{ + int16_t b, k; + int16_t zeropad; + int16_t nr_of_sid_stereo_bits; + int16_t coh_pred_index; + float min_pred_err; + float pred_err; + int16_t res_index; + int16_t i; + float tmp; + const float *pptr; + float pred; + float cohBandq[STEREO_DFT_BAND_MAX / 2]; /* Reconstructed coherence values for intra-frame prediction */ + const float *alphaptr; + int16_t nbbits_test; + int16_t prev_nbbits_test; + int16_t alpha_step; + int16_t alpha_level; + int16_t n; + + nr_of_sid_stereo_bits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; + zeropad = 0; + + /* Encode coherence vector. Find best fixed predictor by minimizing prediction error on input vector. + The prediction is formed by a linear combination of the previous values + in the vector. Hence, prediction is only done for coefficient 1 and up. + If not enough bits for at least one bit for encoding prediction + residual then skip the coding and write zeroes to the bitstream if needed. + In this case the decoder will set alpha to 0, i.e. reuse previous coherence */ + + if ( ( nr_of_sid_stereo_bits - *nb_bits - STEREO_DFT_N_COH_ALPHA_BITS - STEREO_DFT_PRED_NBITS ) > 0 ) + { + min_pred_err = 1e6f; + coh_pred_index = -1; + pptr = dft_cng_coh_pred[0]; + for ( k = 0; k < STEREO_DFT_N_COH_PRED; k++ ) + { + pred_err = 0; + for ( b = 1; b < nbands; b++ ) /* Set b=1 to skip first coefficient (same error would otherwise be added for all predictors: (cohBand[0] - 0).^2) */ + { + pred = 0; + for ( i = 0; i < b; i++ ) + { + pred += ( *pptr++ ) * cohBand[i]; + } + tmp = cohBand[b] - pred; + pred_err += tmp * tmp; + } + if ( pred_err < min_pred_err ) /* Store best candidate */ + { + min_pred_err = pred_err; + coh_pred_index = k; + } + } + + push_next_indice( hBstr, coh_pred_index, STEREO_DFT_PRED_NBITS ); /* Write selected predictor to bitstream */ + ( *nb_bits ) += STEREO_DFT_PRED_NBITS; + + /* Pick two different alphas (one low and one high) as a function + of the number of available bits. */ + alpha_step = 0; + for ( i = 0; i < STEREO_DFT_N_COH_ALPHA_STEPS - 1; i++ ) + { + if ( nr_of_sid_stereo_bits - *nb_bits - STEREO_DFT_N_COH_ALPHA_BITS > dft_cng_coh_alpha_start[i] ) + { + alpha_step = i + 1; + } + } + + /* Calculate the number of encoded bits. */ + alphaptr = dft_cng_alpha_bits[alpha_step]; + alpha_level = 0; + prev_nbbits_test = 100; + for ( i = 0; i < STEREO_DFT_N_COH_ALPHA_LEVELS; i++ ) + { + nbbits_test = 0; + pptr = dft_cng_coh_pred[coh_pred_index]; + pred = 0.4f; + for ( b = 0; b < nbands; b++ ) + { + for ( n = 0; n < b; n++ ) + { + pred += ( *pptr++ ) * cohBandq[n]; + } + + pred = ( *alphaptr ) * pred + ( 1 - ( *alphaptr ) ) * mem_cohBand[b]; + pred_err = cohBand[b] - pred; + res_index = usquant( pred_err, &pred_err, -0.4f, 0.1f, 9 ); + res_index = dft_cng_coh_i2u[res_index]; + nbbits_test += res_index + 1; + res_index = dft_cng_coh_u2i[res_index]; + pred_err = usdequant( res_index, -0.4f, 0.1f ); + cohBandq[b] = pred + pred_err; + if ( cohBandq[b] > 1 ) + { + cohBandq[b] = 1; + } + else if ( cohBandq[b] < 0 ) + { + cohBandq[b] = 0; + } + pred = 0; + } + + if ( nbbits_test < nr_of_sid_stereo_bits - *nb_bits - STEREO_DFT_N_COH_ALPHA_BITS ) + { + alpha_level = i; + } + + if ( nbbits_test < prev_nbbits_test ) + { + alpha_level = i; + } + + prev_nbbits_test = nbbits_test; + alphaptr++; + } + + /* Do the actual encoding using the selected predictor and alpha */ + push_next_indice( hBstr, alpha_level, STEREO_DFT_N_COH_ALPHA_BITS ); /* Write selected alpha index to bitstream */ + ( *nb_bits ) += STEREO_DFT_N_COH_ALPHA_BITS; + alphaptr = &dft_cng_alpha_bits[alpha_step][alpha_level]; + pptr = dft_cng_coh_pred[coh_pred_index]; /* Set pointer to selected predictor */ + pred = 0.4f; + + for ( b = 0; b < nbands; b++ ) + { + /* Intra-frame prediction using quantized values */ + for ( i = 0; i < b; i++ ) + { + pred += ( *pptr++ ) * cohBandq[i]; + } + /* Weighted intra/inter-frame prediction */ + pred = ( *alphaptr ) * pred + ( 1 - ( *alphaptr ) ) * mem_cohBand[b]; + pred_err = cohBand[b] - pred; + res_index = usquant( pred_err, &pred_err, -0.4f, 0.1f, 9 ); /* Quantize prediction residual */ + res_index = dft_cng_coh_i2u[res_index]; /* Convert to unary codeword - res_index+1 now equal to codeword + length in bits with the following order: + [0.0, 0.1, -0.1, 0.2, -0.2, 0.3, -0.3, 0.4, -0.4] */ + /* Bit rate truncation */ + while ( res_index + 1 + *nb_bits > nr_of_sid_stereo_bits && res_index > 0 ) + { + res_index = max( 0, res_index - 2 ); /* Reduce step by one, keeping sign. */ + } + /* Write residual index to bitstream */ + if ( res_index + 1 + *nb_bits <= nr_of_sid_stereo_bits ) /* If the bit limit is reached, res_index = 0 is assumed for remaining indices */ + { + *nb_bits += write_GR0( hBstr, IND_STEREO_DFT_SID_COH, &res_index, 1 ); + } + + /* Reconstruct */ + res_index = dft_cng_coh_u2i[res_index]; + pred_err = usdequant( res_index, -0.4f, 0.1f ); + cohBandq[b] = pred + pred_err; /* Store for intra-frame prediction */ + if ( cohBandq[b] > 1 ) + { + cohBandq[b] = 1; + } + else if ( cohBandq[b] < 0 ) + { + cohBandq[b] = 0; + } + + mem_cohBand[b] = cohBandq[b]; /* Update memory for next frame */ + pred = 0; + } + } + + /* Zero pad up to max number of bits to get constant bitrate */ + for ( k = *nb_bits; k < nr_of_sid_stereo_bits; k++ ) + { + push_next_indice( hBstr, zeropad, 1 ); + ( *nb_bits )++; + } + + + return; +} + + +/*------------------------------------------------------------------------- + * stereo_dft_cng_side_gain() + * + * Calculate CNG side gain + *-------------------------------------------------------------------------*/ + +void stereo_dft_cng_side_gain( + STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i/o: DFT stereo handle */ + STEREO_CNG_ENC_HANDLE hStereoCng, /* i/o: Stereo CNG data structure */ + const int32_t core_brate, /* i : core bitrate */ + const int32_t last_core_brate, /* i : last core bitrate */ + const int16_t bwidth /* i : audio band-width */ +) +{ + int16_t b; + int16_t sgSum; + int16_t band_limits_full[STEREO_DFT_BAND_MAX + 1]; + float prev_weight; + int16_t NFFT_inner; + int16_t nbands_full; + float tmp; + + NFFT_inner = ( STEREO_DFT_N_MAX_ENC * inner_frame_tbl[bwidth] ) / L_FRAME48k; + nbands_full = hStereoDft->nbands; + + /* Calculate side gain average. First average in an inactive period */ + /* uses a weighted sum of the current average and the one from the */ + /* previous inactive segment */ + + /* Inactive frame => Update both sets of averages */ + for ( b = 0; b < nbands_full; b++ ) + { + hStereoCng->sg_average[b] += hStereoDft->sidSideGain[b]; + } + hStereoCng->sg_average_counter++; + + hStereoCng->cng_counter++; + hStereoCng->cng_counter = min( hStereoCng->cng_counter, STEREO_DFT_SG_ACT_CNT_MAX ); + + if ( core_brate == SID_2k40 ) + { + /* SID frame */ + if ( last_core_brate == FRAME_NO_DATA || hStereoCng->first_SID ) + { + /* If first ever SID frame or not the first SID in an inactive segment */ + /* Calculate average only based on current sg_average */ + /* Copy current sum to previous */ + for ( b = 0; b < hStereoDft->nbands; b++ ) + { + hStereoCng->prev_sg_average[b] = hStereoCng->sg_average[b]; + hStereoCng->sg_average[b] = hStereoCng->sg_average[b] / (float) hStereoCng->sg_average_counter; + } + + hStereoCng->prev_sg_average_counter = hStereoCng->sg_average_counter; + } + else + { + /* If first SID in a new inactive segment */ + /* Calculate weighting factor based on the time since the last inactive segment */ + prev_weight = 0.8f * (float) ( STEREO_DFT_SG_ACT_CNT_MAX - hStereoCng->sg_active_cnt ) / (float) STEREO_DFT_SG_ACT_CNT_MAX + 0.2f; + + /* Calculate weighted average between prev and current sg */ + /* Set prev_sg sum to current. */ + for ( b = 0; b < hStereoDft->nbands; b++ ) + { + tmp = hStereoCng->sg_average[b]; + hStereoCng->sg_average[b] = ( hStereoCng->sg_average[b] + prev_weight * hStereoCng->prev_sg_average[b] ) / ( (float) hStereoCng->sg_average_counter + prev_weight * (float) hStereoCng->prev_sg_average_counter ); + hStereoCng->prev_sg_average[b] = tmp; + } + hStereoCng->prev_sg_average_counter = hStereoCng->sg_average_counter; + } + + /* Use coarse band partitioning in inactive frames */ + /* Rescale bands to the coarser partitioning taking the band size into account */ + mvs2s( hStereoDft->band_limits, band_limits_full, STEREO_DFT_BAND_MAX + 1 ); + hStereoDft->nbands = stereo_dft_band_config( hStereoDft->band_limits, hStereoDft->hConfig->band_res, min( STEREO_DFT_N_32k_ENC, NFFT_inner ), ENC ); + if ( nbands_full > hStereoDft->nbands + 1 ) + { + for ( b = 0; b < hStereoDft->nbands; b++ ) + { + hStereoDft->sidSideGain[b] = hStereoCng->sg_average[2 * b] * ( band_limits_full[2 * b + 1] - band_limits_full[2 * b] ); + sgSum = band_limits_full[2 * b + 1] - band_limits_full[2 * b]; + if ( ( 2 * b + 1 ) < nbands_full ) + { + hStereoDft->sidSideGain[b] += hStereoCng->sg_average[2 * b + 1] * ( band_limits_full[2 * b + 2] - band_limits_full[2 * b + 1] ); + sgSum += band_limits_full[2 * b + 2] - band_limits_full[2 * b + 1]; + } + hStereoDft->sidSideGain[b] = hStereoDft->sidSideGain[b] / sgSum; + stereo_dft_quantize_res_gains( &hStereoDft->sidSideGain[b], NULL, NULL, NULL, hStereoDft->side_gain_index_EC + b, NULL ); + } + } + else + { + for ( b = 0; b < hStereoDft->nbands; b++ ) + { + stereo_dft_quantize_res_gains( &hStereoCng->sg_average[b], NULL, NULL, NULL, hStereoDft->side_gain_index_EC + b, NULL ); + } + } + /* Restart SID avg after sending SID */ + hStereoCng->sg_average_counter = 0; + set_zero( hStereoCng->sg_average, STEREO_DFT_BAND_MAX ); + } + else + { + for ( b = 0; b < nbands_full; b++ ) + { + hStereoCng->prev_sg_average[b] += hStereoDft->sidSideGain[b]; + } + + hStereoCng->prev_sg_average_counter++; + } + + hStereoCng->sg_active_cnt = 0; + hStereoCng->first_SID_after_TD = 0; + + return; +} + + +/*--------------------------------------------------------------- + * stereo_enc_cng_init() + * + * Initializes counters and averages + * ---------------------------------------------------------------*/ + +void stereo_enc_cng_init( + STEREO_CNG_ENC_HANDLE hStereoCng /* i/o: stereo CNG encoder structure */ +) +{ + hStereoCng->sg_average_counter = 0; + set_zero( hStereoCng->sg_average, STEREO_DFT_BAND_MAX ); + hStereoCng->prev_sg_average_counter = 0; + set_zero( hStereoCng->prev_sg_average, STEREO_DFT_BAND_MAX ); + hStereoCng->sg_active_cnt = 0; + hStereoCng->first_SID = 1; + set_f( hStereoCng->mem_cohBand, 0.5f, STEREO_DFT_BAND_MAX / 2 ); + set_zero( hStereoCng->prev_cohBand, 2 * ( STEREO_DFT_BAND_MAX / 2 ) ); + hStereoCng->td_active = 0; + hStereoCng->first_SID_after_TD = 1; + hStereoCng->cng_counter = 0; + + return; +} + + +/*------------------------------------------------------------------------- + * stereo_cng_upd_counters() + * + * Update Stereo CNG counters + *-------------------------------------------------------------------------*/ + +void stereo_cng_upd_counters( + STEREO_CNG_ENC_HANDLE hStereoCng, /* i/o: Stereo CNG data structure */ + const int32_t element_mode, /* i : element mode */ + const int16_t nbands, /* i : Number of bands in active */ + const float sidSideGain[], /* i : SID side gains */ + const int16_t burst_ho_count, /* i : Hang-over count */ + int16_t *coh_fade_counter /* i : Coherence fade counter */ +) +{ + int16_t b; + + /* Update sg avg in hangover frames, reset in active frames */ + if ( burst_ho_count > 0 && element_mode == IVAS_CPE_DFT ) + { + for ( b = 0; b < nbands; b++ ) + { + hStereoCng->sg_average[b] += sidSideGain[b]; + } + hStereoCng->sg_average_counter++; + } + else + { + hStereoCng->sg_average_counter = 0; + set_zero( hStereoCng->sg_average, STEREO_DFT_BAND_MAX ); + } + + /* Increment active counter, stop at max value */ + hStereoCng->sg_active_cnt++; + hStereoCng->sg_active_cnt = min( hStereoCng->sg_active_cnt, STEREO_DFT_SG_ACT_CNT_MAX ); + + if ( hStereoCng->sg_active_cnt > STEREO_DFT_CNG_ITD_CNT ) + { + hStereoCng->cng_counter = 0; + } + + if ( element_mode == IVAS_CPE_DFT ) + { + *coh_fade_counter = 0; + } + return; +} diff --git a/lib_enc/ivas_stereo_dft_enc.c b/lib_enc/ivas_stereo_dft_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..1233ace356a5ae5cd4e61e7ed03fc3e3ac637b2c --- /dev/null +++ b/lib_enc/ivas_stereo_dft_enc.c @@ -0,0 +1,3193 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include "options.h" +#include +#include "cnst.h" +#include "rom_enc.h" +#include "rom_com.h" +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_cnst.h" +#include "ivas_rom_com.h" +#include "ivas_rom_enc.h" +#include "wmc_auto.h" + + +/*-------------------------------------------------------------------* + * Local constants + *-------------------------------------------------------------------*/ + +#define STEREO_DFT_NRG_PAST_MAX_BAND 9 +#define STEREO_DFT_NRG_PAST_MAX_BAND_LB 4 +#define STEREO_DFT_DMX_CROSSOVER ( int16_t )( 132 * ( (float) ( STEREO_DFT_N_NS_ENC ) / STEREO_DFT_N_NS ) + 0.5f ) /* crossover bin between binwise and bandwise DMX */ +#define ITD_VAD_E_BAND_N_INIT 200000 +#define ITD_SID_PREV_FRAMES 5 + + +/*------------------------------------------------------------------------- + * Local function prototypes + *------------------------------------------------------------------------*/ + +static void stereo_dft_enc_open( STEREO_DFT_ENC_DATA_HANDLE hStereoDft, const int32_t input_Fs, const int16_t max_bwidth ); + +static void stereo_dft_enc_compute_prm( STEREO_DFT_ENC_DATA_HANDLE hStereoDft, float *DFT_L, float *DFT_R, int16_t k_offset, int16_t flag_quant, const int16_t sp_aud_decision0, const int16_t vad_flag, float *bin_nrgL, float *bin_nrgR, float *dot_prod_nrg_ratio ); + +static float stereo_dft_calc_mean_bipd( float *pIpd, float ipd_buf[STEREO_DFT_IPD_BUF_LEN] ); + +static float stereo_dft_calc_mean_ipd_change( float *pIpd, float *ipd_smooth, int16_t gipd_band_max ); + +static void stereo_dft_gipd_stabilization( float *pgIpd, float prev_gipd, float ipd_mean_change ); + +static void stereo_dft_enc_get_nipd_flag( STEREO_DFT_ENC_DATA_HANDLE hStereoDft, const int16_t sp_aud_decision0, const float gainIPD ); + +static void stereo_dft_enc_get_reverb_flag( STEREO_DFT_ENC_DATA_HANDLE hStereoDft, float *pPredGain, float *sub_nrg_DMX, const float *sub_nrg_L, const float *sub_nrg_R, const int16_t k_offset, const float *bin_nrgL, const float *bin_nrgR ); + +static float stereo_dft_gain_offset( const float c, const int16_t itd ); + +static void side_gain_mode_decision( STEREO_DFT_ENC_DATA_HANDLE hStereoDft, int16_t encoded_ind_GR[], const int16_t sp_aud_decision0, const int32_t last_core_brate ); + +static void res_pred_gain_mode_decision( STEREO_DFT_ENC_DATA_HANDLE hStereoDft, int16_t encoded_ind_pred_GR[], const int16_t k_offset, const int32_t last_core_brate ); + +static void stereo_dft_enc_calculate_nrg_for_icbwe( STEREO_DFT_ENC_DATA_HANDLE hStereoDft, const float *DMX, const int32_t input_Fs ); + +static void stereo_dft_enc_get_res_cod_mode_flag( STEREO_DFT_ENC_DATA_HANDLE hStereoDft, const float res_nrg_all_curr, const float dmx_nrg_all_curr, float *res_dmx_ratio, float *frame_nrg_ratio ); + + +/*------------------------------------------------------------------------- + * stereo_dft_quantize_res_gains() + * + * Joint quantization routine for residual gains + *------------------------------------------------------------------------*/ + +void stereo_dft_quantize_res_gains( + const float *g, + const float *r, + float *gq, + float *rq, + int16_t *ig, + int16_t *ir ) +{ + int8_t sign; + int16_t min_ind, i; + float min_val, old_val, gg, rr; + int16_t level, index; + float ild; + + gg = *g; + + if ( rq != NULL ) + { + rr = *r; + } + else + { + rr = 0; + } + + if ( gg < 0 ) + { + gg = -gg; + sign = -1; + } + else + { + sign = 1; + } + + + gg = min( gg, 1 - EPSILON ); + rr = min( rr, sqrtf( 1 - gg * gg ) - EPSILON ); + + /* we calculate the ILD ... */ + ild = 10.f * log10f( ( ( 1 + gg ) * ( 1 + gg ) + rr * rr ) / ( ( 1 - gg ) * ( 1 - gg ) + rr * rr ) ); + + /* ... which is truncated to the range [0,50] ... */ + ild = ild > 50 ? 50 : ild; + + /* ... and determine the optimal ILD quantization ...*/ + min_ind = 0; + old_val = fabsf( ild_q[0] - ild ); + + for ( i = 1; i < 16; i++ ) + { + min_val = fabsf( ild_q[i] - ild ); + if ( min_val < old_val ) + { + min_ind = i; + } + else + { + break; + } + old_val = min_val; + } + + /* ... which determines the quantization level: */ + level = min_ind; + + /* Now we look for the closest quantization point in the corresponding column of res_gain_energy_q*/ + old_val = FLT_MAX; + min_ind = 0; + index = -1; + for ( i = 0; i < 8; i++ ) + { + min_val = ( gg - dft_res_gains_q[8 * level + i][0] ) * ( gg - dft_res_gains_q[8 * level + i][0] ) + ( rr - dft_res_gains_q[8 * level + i][1] ) * ( rr - dft_res_gains_q[8 * level + i][1] ); + + min_ind = min_val < old_val ? i : min_ind; + old_val = min_val < old_val ? min_val : old_val; + + index = min_ind; + } + + /* and here we are: */ + if ( rq != NULL ) + { + *gq = dft_res_gains_q[8 * level + index][0] * sign; + *rq = dft_res_gains_q[8 * level + index][1]; + + *ir = index; + } + *ig = sign < 0 ? 15 - level : 15 + level; + + return; +} + +/*------------------------------------------------------------------------- + * stereo_dft_quantize_ipd() + * + * Quantize the IPD between [-PI, PI] on 3 or 4 bits + *------------------------------------------------------------------------*/ + +static void stereo_dft_quantize_ipd( + const float *in, + float *out, + int16_t *ind, + const int16_t bits ) +{ + int16_t max_ind; + float delta; + + if ( bits == 2 ) /* New 2-bit phase quantization for the highest frequency band only */ + { + delta = EVS_PI / 2.0f; + max_ind = 3; + } + else if ( bits == 3 ) + { + delta = EVS_PI / 4.f; + max_ind = 7; + } + else if ( bits == 4 ) + { + delta = EVS_PI / 8.f; + max_ind = 15; + } + else + { + delta = EVS_PI / 4.f; + max_ind = 7; + assert( 0 ); + } + + *ind = (int16_t) ( ( ( *in + EVS_PI ) / delta ) + 0.5f ); + + /*modulo 2*PI*/ + if ( *ind == max_ind + 1 ) + { + *ind = 0; + } + + /*Sanity check since no saturation can normally happen*/ + *ind = min( max( *ind, 0 ), max_ind ); + + *out = *ind * delta - EVS_PI; + + return; +} + + +/*------------------------------------------------------------------------- + * stereo_dft_enc_create() + * + * Create DFT stereo handle + *------------------------------------------------------------------------*/ + +ivas_error stereo_dft_enc_create( + STEREO_DFT_ENC_DATA_HANDLE *hStereoDft, /* i/o: encoder DFT stereo handle */ + const int32_t input_Fs, /* i : input sampling rate */ + const int16_t max_bwidth /* i : maximum encoded bandwidth */ +) +{ + STEREO_DFT_ENC_DATA_HANDLE hStereoDft_loc; + int16_t tmpS; + + if ( *hStereoDft != NULL ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error: DFT Stereo memory already allocated\n" ); + } + + if ( ( hStereoDft_loc = (STEREO_DFT_ENC_DATA_HANDLE) malloc( sizeof( STEREO_DFT_ENC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DFT Stereo\n" ) ); + } + + if ( ( hStereoDft_loc->hConfig = (STEREO_DFT_CONFIG_DATA_HANDLE) malloc( sizeof( STEREO_DFT_CONFIG_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DFT Stereo Config\n" ) ); + } + + if ( ( hStereoDft_loc->hItd = (ITD_DATA_HANDLE) malloc( sizeof( ITD_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for ITD data\n" ) ); + } + + hStereoDft_loc->hConfig->force_mono_transmission = 0; + + stereo_dft_config( hStereoDft_loc->hConfig, IVAS_24k4, &tmpS, &tmpS ); + + stereo_dft_enc_open( hStereoDft_loc, input_Fs, max_bwidth ); + + stereo_dft_hybrid_ITD_flag( hStereoDft_loc->hConfig, input_Fs, + hStereoDft_loc->hItd->hybrid_itd_max ); + + *hStereoDft = hStereoDft_loc; + + return IVAS_ERR_OK; +} + + +/*------------------------------------------------------------------------- + * stereo_dft_enc_open() + * + * Initialize DFT stereo handle + *------------------------------------------------------------------------*/ + +static void stereo_dft_enc_open( + STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i/o: encoder DFT stereo handle */ + const int32_t input_Fs, /* i : input sampling rate */ + const int16_t max_bwidth /* i : maximum encoded bandwidth */ +) +{ + int16_t NFFT_inner; + float win[STEREO_DFT_OVL_MAX]; + + /*Sizes*/ + hStereoDft->N = (int16_t) ( STEREO_DFT_HOP_MAX_ENC * input_Fs / 48000 ); + assert( ( ( input_Fs / FRAMES_PER_SEC ) / hStereoDft->N ) == 1 ); + + /*Init. DFT sizes*/ + hStereoDft->NFFT = (int16_t) ( STEREO_DFT_N_MAX_ENC * input_Fs / 48000 ); + hStereoDft->dft_ovl = (int16_t) ( STEREO_DFT_OVL_MAX * input_Fs / 48000 ); + mdct_window_sine( win, input_Fs, hStereoDft->dft_ovl, FULL_OVERLAP, IVAS_CPE_DFT ); + + hStereoDft->win_ana_energy = (float) hStereoDft->N - hStereoDft->dft_ovl; + hStereoDft->win_ana_energy += 2 * sum_f( win, hStereoDft->dft_ovl ); + hStereoDft->win_ana_energy = hStereoDft->win_ana_energy / hStereoDft->NFFT; + set_f( hStereoDft->output_mem_dmx_32k, 0, STEREO_DFT_OVL_32k ); + + hStereoDft->dft_zp = (int16_t) ( STEREO_DFT_ZP_MAX_ENC * input_Fs / 48000 ); + + hStereoDft->dft_trigo_8k = dft_trigo_32k; + hStereoDft->dft_trigo_12k8 = dft_trigo_12k8; + hStereoDft->dft_trigo_16k = dft_trigo_32k; + hStereoDft->dft_trigo_32k = dft_trigo_32k; + + hStereoDft->win_ana_8k = win_ana_8k; + hStereoDft->win_ana_12k8 = win_ana_12k8; + hStereoDft->win_ana_16k = win_ana_16k; + hStereoDft->win_ana_32k = win_ana_32k; + + hStereoDft->win_8k = win_syn_8k; + hStereoDft->win_12k8 = win_syn_12k8; + hStereoDft->win_16k = win_syn_16k; + hStereoDft->win_32k = win_syn_32k; + + if ( input_Fs == 16000 ) + { + hStereoDft->dft_trigo = dft_trigo_32k; + hStereoDft->dft_trigo_step = STEREO_DFT_TRIGO_SRATE_16k_STEP; + hStereoDft->win_ana = win_ana_16k; + hStereoDft->win = win_syn_16k; + } + else if ( input_Fs == 32000 ) + { + hStereoDft->dft_trigo = dft_trigo_32k; + hStereoDft->dft_trigo_step = STEREO_DFT_TRIGO_SRATE_32k_STEP; + hStereoDft->win_ana = win_ana_32k; + hStereoDft->win = win_syn_32k; + } + else + { + assert( input_Fs == 48000 ); + hStereoDft->dft_trigo = dft_trigo_48k; + hStereoDft->dft_trigo_step = STEREO_DFT_TRIGO_SRATE_48k_STEP; + hStereoDft->win_ana = win_ana_48k; + hStereoDft->win = win_syn_48k; + } + + hStereoDft->win_mdct_8k = win_mdct_8k; + + /*I/O Buffers*/ + set_zero( hStereoDft->output_mem_dmx, STEREO_DFT_OVL_MAX ); + set_zero( hStereoDft->output_mem_dmx_12k8, STEREO_DFT_OVL_12k8 ); + set_zero( hStereoDft->output_mem_dmx_16k, STEREO_DFT_OVL_16k ); + set_zero( hStereoDft->output_mem_dmx_16k_shb, STEREO_DFT_OVL_16k ); + set_zero( hStereoDft->output_mem_res_8k, STEREO_DFT_OVL_8k ); + + /*Bands: find the number of bands, Nyquist freq. is not taken into account*/ + NFFT_inner = STEREO_DFT_N_MAX_ENC * inner_frame_tbl[max_bwidth] / L_FRAME48k; + hStereoDft->nbands = stereo_dft_band_config( hStereoDft->band_limits, hStereoDft->hConfig->band_res, NFFT_inner, ENC ); + hStereoDft->nbands_dmx = stereo_dft_band_config( hStereoDft->band_limits_dmx, 1, NFFT_inner, ENC ); + + /*Set configuration*/ + set_s( hStereoDft->band_res, hStereoDft->hConfig->band_res, STEREO_DFT_ENC_DFT_NB ); + if ( hStereoDft->hConfig->ada_wb_res_cod_mode && hStereoDft->NFFT == STEREO_DFT_N_16k_ENC ) + { + /* residual coding is only applied for 16 kHz sampling rate */ + set_s( hStereoDft->res_cod_mode, hStereoDft->hConfig->ada_wb_res_cod_mode, STEREO_DFT_ENC_DFT_NB ); + } + else + { + set_s( hStereoDft->res_cod_mode, hStereoDft->hConfig->res_cod_mode, STEREO_DFT_ENC_DFT_NB ); + } + set_s( hStereoDft->res_pred_mode, hStereoDft->hConfig->res_pred_mode, STEREO_DFT_ENC_DFT_NB ); + + /* reset DFT stereo memories */ + stereo_dft_enc_reset( hStereoDft ); + + return; +} + +/*------------------------------------------------------------------------- + * stereo_dft_enc_reset() + * + * Reset DFT stereo memories + *------------------------------------------------------------------------*/ + +void stereo_dft_enc_reset( + STEREO_DFT_ENC_DATA_HANDLE hStereoDft /* i/o: encoder stereo handle */ +) +{ + int16_t i; + /*reset parameters*/ + set_zero( hStereoDft->side_gain, STEREO_DFT_ENC_DFT_NB * STEREO_DFT_BAND_MAX ); + set_s( hStereoDft->side_gain_index_EC, 15, STEREO_DFT_BAND_MAX ); + set_s( hStereoDft->side_gain_index_ECDiff, 0, STEREO_DFT_BAND_MAX ); + set_s( hStereoDft->side_gain_index_ECprevious, 15, STEREO_DFT_BAND_MAX ); + hStereoDft->side_gain_counter = 0; + hStereoDft->side_gain_bitdiff_lp = STEREO_DFT_BITDIFF_INIT; + set_zero( hStereoDft->gipd, STEREO_DFT_ENC_DFT_NB ); + set_zero( hStereoDft->dot_prod_real_smooth, STEREO_DFT_BAND_MAX ); + set_zero( hStereoDft->dot_prod_img_smooth, STEREO_DFT_BAND_MAX ); + for ( i = 0; i < STEREO_DFT_BAND_MAX; i++ ) + { + set_zero( hStereoDft->ipd_buf[i], STEREO_DFT_IPD_BUF_LEN ); + } + hStereoDft->prev_gipd = 0.f; + hStereoDft->gipd_index = 0; + set_zero( hStereoDft->res_pred_gain, STEREO_DFT_ENC_DFT_NB * STEREO_DFT_BAND_MAX ); + set_s( hStereoDft->res_pred_index_EC, 0, STEREO_DFT_BAND_MAX ); + set_s( hStereoDft->res_pred_index_ECDiff, 0, STEREO_DFT_BAND_MAX ); + set_s( hStereoDft->res_pred_index_ECprevious, 0, STEREO_DFT_BAND_MAX ); + hStereoDft->res_pred_counter = 0; + set_zero( hStereoDft->past_nrgL, STEREO_DFT_NRG_PAST_LEN * STEREO_DFT_BAND_MAX ); + set_zero( hStereoDft->past_nrgR, STEREO_DFT_NRG_PAST_LEN * STEREO_DFT_BAND_MAX ); + set_zero( hStereoDft->past_dot_prod_real, STEREO_DFT_NRG_PAST_LEN * STEREO_DFT_BAND_MAX ); + set_zero( hStereoDft->past_dot_prod_imag, STEREO_DFT_NRG_PAST_LEN * STEREO_DFT_BAND_MAX ); + hStereoDft->nrg_past_pos = 0; + + hStereoDft->res_dmx_ratio_lt = 1.0f; + hStereoDft->hangover_cnt0 = 0; + hStereoDft->hangover_cnt1 = 0; + hStereoDft->dmx_res_all_prev = EPSILON; + hStereoDft->last_res_cod_mode_modify_flag = 0; + hStereoDft->res_cod_sw_flag = 0; + hStereoDft->switch_fade_factor = 0.5f; + hStereoDft->res_cod_mode[STEREO_DFT_OFFSET - 1] = STEREO_DFT_RES_COD_1kHz; + for ( i = 0; i < STEREO_DFT_BAND_MAX; i++ ) + { + hStereoDft->res_cod_NRG_M[i] = 0; + hStereoDft->res_cod_NRG_S[i] = 0; + } + hStereoDft->old_snr = 0.f; + + + hStereoDft->reverb_flag = 0; + set_zero( hStereoDft->pre_sub_nrg_DMX, STEREO_DFT_BAND_MAX ); + hStereoDft->diff_l_h_sm = 0.0f; + hStereoDft->diff_r_h_sm = 0.0f; + hStereoDft->prev_fac2 = 1.0f; + + set_zero( hStereoDft->res_pred_gain_f, STEREO_DFT_BAND_MAX ); + + /*misc*/ + hStereoDft->no_ipd_flag = 1; /* Initialization of the no IPD variables */ + hStereoDft->prev_no_ipd_flag = 1; + hStereoDft->no_ipd_cnt = 0; + hStereoDft->no_ipd_cnt1 = 0; + hStereoDft->attackPresent = 0; + hStereoDft->wasTransient = 0; + hStereoDft->gainIPD_sm = 1.f; + + + hStereoDft->voicing_lt = 0; + + hStereoDft->flip_sign = 1; + + hStereoDft->sfm = 0.f; + hStereoDft->sum_dot_prod_real = 0.f; + hStereoDft->sum_dot_prod_img = 0.f; + + /*Coherence*/ + set_f( hStereoDft->xspec_smooth, 1.0f, STEREO_DFT_N_32k_ENC ); + set_f( hStereoDft->Spd_L_smooth, 1.0f, STEREO_DFT_N_32k_ENC / 2 ); + set_f( hStereoDft->Spd_R_smooth, 1.0f, STEREO_DFT_N_32k_ENC / 2 ); + + hStereoDft->currentNumUpdates = 0; + hStereoDft->expectedNumUpdates = FIXED_SID_RATE; + hStereoDft->resetFrames = 0; + hStereoDft->sid_gipd = 0; + hStereoDft->prev_sid_gipd = 0; + hStereoDft->prev_sid_no_ipd_flag = 1; + + hStereoDft->coh_fade_counter = 0; + + /* Xtalk classifier */ + hStereoDft->hItd->prev_m1 = 0; + hStereoDft->hItd->prev_m2 = 0; + hStereoDft->hItd->prev_itd1 = 0; + hStereoDft->hItd->prev_itd2 = 0; + + hStereoDft->first_frm_flag = 1; + + + stereo_enc_itd_init( hStereoDft->hItd ); + + return; +} + + +/*------------------------------------------------------------------------- + * stereo_enc_itd_init() + * + * initialize ITD struct + *------------------------------------------------------------------------*/ + +void stereo_enc_itd_init( + ITD_DATA_HANDLE hItd /* i/o: encoder ITD handle */ +) +{ + hItd->prev_itd = 0; + set_zero( hItd->itd, STEREO_DFT_ENC_DFT_NB ); + set_zero( hItd->deltaItd, STEREO_DFT_ENC_DFT_NB ); + set_s( hItd->td_itd, 0, STEREO_DFT_ENC_DFT_NB ); + set_s( hItd->td_itd_32k, 0, STEREO_DFT_ENC_DFT_NB ); + set_s( hItd->itd_index, 0, STEREO_DFT_ENC_DFT_NB ); + set_zero( hItd->xcorr_smooth, STEREO_DFT_N_32k_ENC ); + hItd->lp_phat_peak = 0.f; + hItd->itd_hangover = 0; + hItd->itd_cnt = 0; + hItd->prev_sum_nrg_L_lb = 0.f; + set_zero( hItd->prev_xcorr_lb, STEREO_DFT_XCORR_LB_MAX ); + set_f( hItd->E_band_n, (float) ITD_VAD_E_BAND_N_INIT, STEREO_DFT_ITD_VAD_BAND_NUM ); + hItd->vad_frm_cnt = 0; + hItd->pre_vad = 0; + hItd->itd_nonzero_cnt = 0; + set_zero( hItd->acorr_L, STEREO_DFT_BAND_MAX ); + set_zero( hItd->acorr_R, STEREO_DFT_BAND_MAX ); + hItd->cohSNR = 15.f; + hItd->itd_thres = 0.f; + hItd->valid_itd_cnt = 0; + + hItd->detected_itd_flag = 0; + hItd->itd_tracking = 0; + hItd->prev_max = 0.f; + hItd->prev_index = 0; + hItd->prev_avg_max = 0.f; + hItd->currFlatness = 0.f; + + /* Xtalk classifier */ + hItd->prev_m1 = 0; + hItd->prev_m2 = 0; + hItd->prev_itd1 = 0; + hItd->prev_itd2 = 0; + + hItd->hybrid_itd_max = 0; + return; +} + + +/*-------------------------------------------------------------------------- + * stereo_dft_enc_update() + * + * Update DFT stereo memories for new frame + *--------------------------------------------------------------------------*/ + +void stereo_dft_enc_update( + STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i/o: encoder stereo handle */ + const int16_t max_bwidth /* i : maximum encoded bandwidth */ +) +{ + int16_t i, k_offset; + int16_t NFFT_inner; + + /* Initialization */ + k_offset = STEREO_DFT_OFFSET; /*Add an offset at encoder*/ + + /* Update the parameters and serial */ + for ( i = 0; i < k_offset * STEREO_DFT_BAND_MAX; i++ ) + { + hStereoDft->side_gain[i] = hStereoDft->side_gain[STEREO_DFT_BAND_MAX + i]; + hStereoDft->res_pred_gain[i] = hStereoDft->res_pred_gain[STEREO_DFT_BAND_MAX + i]; + } + + for ( i = 0; i < k_offset; i++ ) + { + hStereoDft->gipd[i] = hStereoDft->gipd[i + 1]; + } + + /*Update configurations*/ + for ( i = 0; i < k_offset; i++ ) + { + hStereoDft->band_res[i] = hStereoDft->band_res[i + 1]; + hStereoDft->hItd->itd[i] = hStereoDft->hItd->itd[i + 1]; + hStereoDft->res_cod_mode[i] = hStereoDft->res_cod_mode[i + 1]; + hStereoDft->res_pred_mode[i] = hStereoDft->res_pred_mode[i + 1]; + } + + /*Set new configurations*/ + hStereoDft->band_res[k_offset] = hStereoDft->hConfig->band_res; + + if ( hStereoDft->hConfig->ada_wb_res_cod_mode && hStereoDft->NFFT == STEREO_DFT_N_16k_ENC ) + { + hStereoDft->res_cod_mode[k_offset] = hStereoDft->hConfig->ada_wb_res_cod_mode; + } + else + { + hStereoDft->res_cod_mode[k_offset] = hStereoDft->hConfig->res_cod_mode; + } + hStereoDft->res_pred_mode[k_offset] = hStereoDft->hConfig->res_pred_mode; + + hStereoDft->last_res_cod_mode_modify_flag = hStereoDft->res_cod_sw_flag; + hStereoDft->res_cod_sw_flag = 0; + + /* update band limits in case of rate switching assuming max_bwidth as BWD output not yet know here */ + NFFT_inner = STEREO_DFT_N_MAX_ENC * inner_frame_tbl[max_bwidth] / L_FRAME48k; + + hStereoDft->nbands = stereo_dft_band_config( hStereoDft->band_limits, hStereoDft->hConfig->band_res, NFFT_inner, ENC ); + hStereoDft->nbands_dmx = stereo_dft_band_config( hStereoDft->band_limits_dmx, 1, NFFT_inner, ENC ); + + /*Compute main parameters*/ + hStereoDft->gipd_band_max = dft_band_ipd[1][3]; + hStereoDft->res_cod_band_max = dft_band_res_cod[hStereoDft->hConfig->band_res][hStereoDft->res_cod_mode[k_offset]]; + hStereoDft->res_cod_line_max = (int16_t) ( 0.5f + ( hStereoDft->band_limits[hStereoDft->res_cod_band_max] - 1 ) * 2.f * hStereoDft->N / (float) ( hStereoDft->NFFT ) ); + hStereoDft->res_cod_line_max = 8 * ( hStereoDft->res_cod_line_max / 8 ); + hStereoDft->res_pred_band_min = max( STEREO_DFT_RES_PRED_BAND_MIN, hStereoDft->res_cod_band_max ); + + + return; +} + + +/*------------------------------------------------------------------------- + * stereo_dft_enc_destroy() + * + * destroy DFT stereo handle + *-------------------------------------------------------------------------*/ + +void stereo_dft_enc_destroy( + STEREO_DFT_ENC_DATA_HANDLE *hStereoDft /* i/o: encoder DFT stereo handle */ +) +{ + if ( ( *hStereoDft )->hConfig != NULL ) + { + free( ( *hStereoDft )->hConfig ); + ( *hStereoDft )->hConfig = NULL; + } + + if ( ( *hStereoDft )->hItd != NULL ) + { + free( ( *hStereoDft )->hItd ); + ( *hStereoDft )->hItd = NULL; + } + + free( *hStereoDft ); + *hStereoDft = NULL; + + return; +} + + +/*------------------------------------------------------------------------- + * stereo_dft_enc_analyze() + * + * DFT analysis on a 20ms frame + *-------------------------------------------------------------------------*/ + +void stereo_dft_enc_analyze( + Encoder_State **sts, /* i/o: encoder state structure */ + const int16_t n_channels, /* i : number of input channels */ + const int16_t input_frame, /* i : input frame length */ + STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i/o: encoder stereo handle */ + STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct, /* i/o: encoder MDCT stereo handle */ + float DFT[CPE_CHANNELS][STEREO_DFT_N_MAX_ENC], /* o : DFT buffers */ + float *input_mem[CPE_CHANNELS] /* i/o: input buffer memory */ +) +{ + int16_t i, n; + float *pDFT_L, *pDFT_R; + int16_t N, NFFT; + int16_t dft_zp, dft_ovl; + const float *pWin, *pTrigo; + int16_t offset; + float *input[CPE_CHANNELS], *mem[CPE_CHANNELS]; + float trigo_enc[STEREO_DFT_N_MAX_ENC / 2 + 1]; + int16_t trigo_step; + + + push_wmops( "DFT_analysis" ); + + /*-----------------------------------------------------------------* + * Initialization + *-----------------------------------------------------------------*/ + + for ( n = 0; n < n_channels; n++ ) + { + input[n] = sts[n]->input; + mem[n] = input_mem[n]; + } + + + /*-----------------------------------------------------------------* + * DFT Analysis + *-----------------------------------------------------------------*/ + + pDFT_L = DFT[0]; + pDFT_R = DFT[1]; + + if ( hStereoDft != NULL ) + { + N = hStereoDft->N; + NFFT = hStereoDft->NFFT; + dft_zp = hStereoDft->dft_zp; + dft_ovl = hStereoDft->dft_ovl; + offset = -dft_ovl; + pWin = hStereoDft->win_ana; + pTrigo = hStereoDft->dft_trigo; + trigo_step = hStereoDft->dft_trigo_step; + } + else + { + N = hStereoMdct->hDft_ana->N; + NFFT = hStereoMdct->hDft_ana->NFFT; + dft_zp = hStereoMdct->hDft_ana->dft_zp; + dft_ovl = hStereoMdct->hDft_ana->dft_ovl; + offset = -dft_ovl; + pWin = hStereoMdct->hDft_ana->win_ana; + pTrigo = hStereoMdct->hDft_ana->dft_trigo; + trigo_step = hStereoMdct->hDft_ana->dft_trigo_step; + } + + for ( i = 0; i < NFFT / 4; i++ ) + { + trigo_enc[i] = pTrigo[i * trigo_step]; + trigo_enc[NFFT / 2 - i] = pTrigo[i * trigo_step]; + } + trigo_enc[NFFT / 4] = pTrigo[NFFT / 4 * trigo_step]; + + /*Forwards FFT: L and R*/ + /*zero padding*/ + for ( i = 0; i < dft_zp; i++ ) + { + pDFT_L[i] = 0.f; + pDFT_L[NFFT - 1 - i] = 0.f; + + pDFT_R[i] = 0.f; + pDFT_R[NFFT - 1 - i] = 0.f; + } + + /*overlapping parts*/ + for ( i = 0; i < dft_ovl; i++ ) + { + pDFT_L[dft_zp + i] = mem[0][i] * pWin[i]; + pDFT_L[dft_zp + N + dft_ovl - 1 - i] = input[0][offset + N + dft_ovl - 1 - i] * pWin[i]; + + pDFT_R[dft_zp + i] = mem[1][i] * pWin[i]; + pDFT_R[dft_zp + N + dft_ovl - 1 - i] = input[1][offset + N + dft_ovl - 1 - i] * pWin[i]; + } + + /*middle part*/ + for ( i = 0; i < N - dft_ovl; i++ ) + { + pDFT_L[dft_zp + dft_ovl + i] = input[0][offset + dft_ovl + i]; + + pDFT_R[dft_zp + dft_ovl + i] = input[1][offset + dft_ovl + i]; + } + + rfft( pDFT_L, trigo_enc, NFFT, -1 ); + rfft( pDFT_R, trigo_enc, NFFT, -1 ); + + /* update pointers to overlap memory */ + for ( n = 0; n < n_channels; n++ ) + { + mem[n] = &input[n][N - dft_ovl]; + } + + if ( hStereoDft != NULL && hStereoDft->hConfig->hybrid_itd_flag && hStereoDft->hItd->td_itd[STEREO_DFT_OFFSET] ) + { + for ( n = 0; n < n_channels; n++ ) + { + mvr2r( hStereoDft->input_mem_itd[n], input_mem[n], dft_ovl ); + } + } + else + { + for ( n = 0; n < n_channels; n++ ) + { + mvr2r( input[n] + input_frame - dft_ovl, input_mem[n], dft_ovl ); + } + } + + pop_wmops(); + return; +} + + +/*------------------------------------------------------------------------- + * stereo_dft_enc_synthesize() + * + * Inverse DFT on a 20ms frame + *-------------------------------------------------------------------------*/ + +float stereo_dft_enc_synthesize( + STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i/o: encoder stereo handle */ + float *output, /* o : output synthesis */ + const int16_t chan, /* i : channel number */ + const int32_t input_Fs, /* i : input sampling rate */ + const int32_t output_sampling_rate, /* i : output sampling rate */ + const int16_t L_frame /* i : frame length at internal Fs */ +) +{ + int16_t i, j, sign; + float *pDFT_in; + int16_t offset, NFFT, N, ovl, zp; + float fac; + float *mem; + const float *trigo, *win, *win_ana; + float tmp[STEREO_DFT_N_MAX_ENC]; + float nrg; + float trigo_enc[STEREO_DFT_N_MAX_ENC / 2 + 1]; + int16_t trigo_step; + + + /*-----------------------------------------------------------------* + * Initialization + *-----------------------------------------------------------------*/ + + if ( L_frame > 0 ) + { + assert( ( output_sampling_rate == 16000 ) && "High-band generation only possible at 16kHz!" ); + } + nrg = 0.f; + + hStereoDft->icbweRefEner = 0; + hStereoDft->lbEner = 0; + + if ( chan == 0 ) + { + pDFT_in = hStereoDft->DFT[0]; + } + else + { + pDFT_in = hStereoDft->DFT[1]; + } + + if ( output_sampling_rate == input_Fs ) + { + assert( chan == 0 ); + + NFFT = hStereoDft->NFFT; + fac = 1.f; + N = hStereoDft->N; + ovl = hStereoDft->dft_ovl; + zp = hStereoDft->dft_zp; + trigo = hStereoDft->dft_trigo; + trigo_step = hStereoDft->dft_trigo_step; + if ( L_frame > 0 ) + { + mem = hStereoDft->output_mem_dmx_16k_shb; + } + else + { + mem = hStereoDft->output_mem_dmx; + } + win = hStereoDft->win; + win_ana = hStereoDft->win_ana; + + push_wmops( "DFT_synth_fs" ); + } + else if ( output_sampling_rate == INT_FS_12k8 ) + { + assert( chan == 0 ); + + NFFT = STEREO_DFT_N_12k8_ENC; + N = STEREO_DFT_HOP_12k8_ENC; + zp = STEREO_DFT_ZP_12k8_ENC; + fac = (float) ( NFFT ) / (float) ( hStereoDft->NFFT ); + ovl = STEREO_DFT_OVL_12k8; + trigo = hStereoDft->dft_trigo_12k8; + trigo_step = STEREO_DFT_TRIGO_SRATE_12k8_STEP; + mem = hStereoDft->output_mem_dmx_12k8; + win = hStereoDft->win_12k8; + win_ana = hStereoDft->win_ana_12k8; + + push_wmops( "DFT_synth_12k8" ); + } + else if ( output_sampling_rate == 16000 ) + { + assert( chan == 0 ); + + NFFT = STEREO_DFT_N_16k_ENC; + N = STEREO_DFT_HOP_16k_ENC; + zp = STEREO_DFT_ZP_16k_ENC; + fac = (float) ( NFFT ) / (float) ( hStereoDft->NFFT ); + ovl = STEREO_DFT_OVL_16k; + trigo = hStereoDft->dft_trigo_16k; + trigo_step = STEREO_DFT_TRIGO_SRATE_16k_STEP; + if ( L_frame > 0 ) + { + mem = hStereoDft->output_mem_dmx_16k_shb; + + push_wmops( "DFT_synth_16k_shb" ); + } + else + { + mem = hStereoDft->output_mem_dmx_16k; + + push_wmops( "DFT_synth_16k" ); + } + win = hStereoDft->win_16k; + win_ana = hStereoDft->win_ana_16k; + } + else if ( output_sampling_rate == 32000 ) + { + assert( chan == 0 ); + + NFFT = STEREO_DFT_N_32k_ENC; + N = STEREO_DFT_HOP_32k_ENC; + zp = STEREO_DFT_ZP_32k_ENC; + fac = (float) ( NFFT ) / (float) ( hStereoDft->NFFT ); + ovl = STEREO_DFT_OVL_32k; + trigo = hStereoDft->dft_trigo_32k; + trigo_step = STEREO_DFT_TRIGO_SRATE_32k_STEP; + mem = hStereoDft->output_mem_dmx_32k; + win = hStereoDft->win_32k; + win_ana = hStereoDft->win_ana_32k; + + push_wmops( "DFT_synth_32k" ); + } + else if ( output_sampling_rate == 8000 ) + { + assert( chan == 1 ); + + NFFT = STEREO_DFT_N_8k_ENC; + N = STEREO_DFT_HOP_8k_ENC; + zp = STEREO_DFT_ZP_8k_ENC; + fac = (float) ( NFFT ) / (float) ( hStereoDft->NFFT ); + ovl = STEREO_DFT_OVL_8k; + trigo = hStereoDft->dft_trigo_8k; + trigo_step = STEREO_DFT_TRIGO_SRATE_8k_STEP; + mem = hStereoDft->output_mem_res_8k; + win = hStereoDft->win_8k; + win_ana = hStereoDft->win_ana_8k; + + push_wmops( "DFT_synth_8k" ); + } + else + { + assert( 0 && "DFT stereo: sampling rate not supported!" ); + NFFT = -1; /* to avoid compilation warning */ + fac = -1; /* to avoid compilation warning */ + N = -1; /* to avoid compilation warning */ + zp = -1; /* to avoid compilation warning */ + win = NULL; /* to avoid compilation warning */ + trigo = NULL; /* to avoid compilation warning */ + trigo_step = -1; /* to avoid compilation warning */ + ovl = -1; /* to avoid compilation warning */ + mem = NULL; /* to avoid compilation warning */ + win_ana = NULL; /* to avoid compilation warning */ + } + + offset = 0; + + for ( i = 0; i < NFFT / 4; i++ ) + { + trigo_enc[i] = trigo[i * trigo_step]; + trigo_enc[NFFT / 2 - i] = trigo[i * trigo_step]; + } + trigo_enc[NFFT / 4] = trigo[NFFT / 4 * trigo_step]; + + /*-----------------------------------------------------------------* + * Synthesizing & resampling + *-----------------------------------------------------------------*/ + + offset = -ovl; + + if ( L_frame == L_FRAME || L_frame == L_FRAME16k ) + { + for ( i = (int16_t) ( 200 * ( (float) ( STEREO_DFT_N_NS_ENC ) / STEREO_DFT_N_NS ) ); i < (int16_t) ( 400 * ( (float) ( STEREO_DFT_N_NS_ENC ) / STEREO_DFT_N_NS ) ); i++ ) + { + hStereoDft->icbweRefEner += pDFT_in[2 * i] * pDFT_in[2 * i] + pDFT_in[2 * i + 1] * pDFT_in[2 * i + 1]; + } + for ( i = 0; i < (int16_t) ( 200 * ( (float) ( STEREO_DFT_N_NS_ENC ) / STEREO_DFT_N_NS ) ); i++ ) + { + hStereoDft->lbEner += pDFT_in[2 * i] * pDFT_in[2 * i] + pDFT_in[2 * i + 1] * pDFT_in[2 * i + 1]; + } + hStereoDft->icbweRefEner *= fac; + hStereoDft->lbEner *= fac; + } + + /*Flip?*/ + if ( L_frame == L_FRAME ) + { + /* 6 to 14 kHz SHB target signal*/ + j = 2; + set_zero( tmp, STEREO_DFT_N_MAX_ENC ); + sign = hStereoDft->flip_sign; + + for ( i = (int16_t) ( 350 * ( (float) ( STEREO_DFT_N_NS_ENC ) / STEREO_DFT_N_NS ) ); i >= (int16_t) 150 * ( (float) ( STEREO_DFT_N_NS_ENC ) / STEREO_DFT_N_NS ); i-- ) + { + /* alternate sign between frames for even starting index */ + tmp[j++] = sign * pDFT_in[2 * i] * fac; + tmp[j++] = -sign * pDFT_in[2 * i + 1] * fac; + } + hStereoDft->flip_sign = -sign; + + for ( i = 0; i <= (int16_t) 100 * ( (float) ( STEREO_DFT_N_NS_ENC ) / STEREO_DFT_N_NS ); i++ ) + { + nrg += tmp[2 * i] * tmp[2 * i]; + nrg += tmp[2 * i + 1] * tmp[2 * i + 1]; + } + } + else if ( L_frame == L_FRAME16k ) + { + /* 7.5 - 15.5 kHz SHB target signal*/ + j = 2; + set_zero( tmp, STEREO_DFT_N_MAX_ENC ); + for ( i = (int16_t) ( 400 * ( (float) ( STEREO_DFT_N_NS_ENC ) / STEREO_DFT_N_NS ) ) - 1; i >= (int16_t) 200 * ( (float) ( STEREO_DFT_N_NS_ENC ) / STEREO_DFT_N_NS ); i-- ) + { + tmp[j++] = pDFT_in[2 * i] * fac; + tmp[j++] = -1.f * pDFT_in[2 * i + 1] * fac; + } + + for ( i = 0; i <= (int16_t) 100 * ( (float) ( STEREO_DFT_N_NS_ENC ) / STEREO_DFT_N_NS ); i++ ) + { + nrg += tmp[2 * i] * tmp[2 * i]; + nrg += tmp[2 * i + 1] * tmp[2 * i + 1]; + } + } + else if ( fac != 1.f ) + { + /*Copy and scale*/ + tmp[0] = pDFT_in[0] * fac; + tmp[1] = 0.f; + for ( i = 2; i < NFFT; i++ ) + { + tmp[i] = pDFT_in[i] * fac; + } + + if ( fac < 1.f ) + { + tmp[1] = 0.f; /*Nyquist is set to 0*/ + tmp[0] = 0.f; /*DC is set to 0*/ + } + } + else + { + for ( i = 0; i < NFFT; i++ ) + { + tmp[i] = pDFT_in[i]; + } + } + + /*Reconstruct */ + /*IFFT*/ + rfft( tmp, trigo_enc, NFFT, +1 ); + + for ( i = 0; i < ovl; i++ ) + { + output[offset + i] = mem[i] + tmp[zp + i] * win[i]; + mem[i] = tmp[zp + N + i] * win[ovl - 1 - i]; + } + + /*Middle->Copy*/ + for ( i = 0; i < N - ovl; i++ ) + { + output[offset + ovl + i] = tmp[zp + ovl + i]; + } + + /*-----------------------------------------------------------------* + * Lookahead: redress signal + *-----------------------------------------------------------------*/ + + for ( i = 0; i < ovl; i++ ) + { + float ifft_deviation = tmp[zp + N + ovl]; + output[offset + N + i] = ( tmp[zp + N + i] - ifft_deviation ) / win_ana[ovl - 1 - i] + ifft_deviation; + } + + + pop_wmops(); + return ( nrg ); +} + + +/*------------------------------------------------------------------------- + * stereo_dft_enc_process() + * + * DFT-based stereo main processing function: + * 1) compute/encode stereo parameters + * 2) Mid/Side computation + *-------------------------------------------------------------------------*/ + +void stereo_dft_enc_process( + CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ + const int16_t vad_flag_dtx[], /* i : VAD dtx flags */ + const int16_t vad_hover_flag[], /* i : VAD hangover flags */ + const int16_t input_frame /* i : input frame length */ +) +{ + int16_t i, j, b; + float *pDFT_L, *pDFT_R; + float *pDFT_DMX; + float *pDFT_RES; + int16_t k_offset; + float *pgIpd; + float *pSideGain; + float c, alpha, g; + float wL, wR, wS; + float tmp; + float s, c1, s1; + float fac_att; + STEREO_DFT_ENC_DATA_HANDLE hStereoDft; + float DFT_DMX[STEREO_DFT_N_MAX_ENC]; + float DFT_RES[STEREO_DFT_N_8k_ENC]; + int32_t input_Fs; + float bin_nrgL[STEREO_DFT_N_MAX_ENC]; + float bin_nrgR[STEREO_DFT_N_MAX_ENC]; + float *pNrgL, *pNrgR; + float res_nrg_all_curr, dmx_nrg_all_curr; + float res_dmx_ratio, frame_nrg_ratio; + float dot_prod_nrg_ratio[STEREO_DFT_BAND_MAX]; /* contains only dot product for higher bands */ + float sum_nrg_L2, sum_nrg_R2, dot_prod_real2; + float sum_nrg_Mid, sum_abs; + + /*------------------------------------------------------------------* + * Initialization + *-----------------------------------------------------------------*/ + + input_Fs = input_frame * FRAMES_PER_SEC; + + hStereoDft = hCPE->hStereoDft; + + wL = 0; /* avoid compilation warning */ + wR = 0; /* avoid compilation warning */ + + /* Initialization */ + k_offset = STEREO_DFT_OFFSET; /*Add an offset at encoder*/ + + hStereoDft->gipd_band_max = dft_band_ipd[1][3]; + hStereoDft->res_cod_band_max = dft_band_res_cod[hStereoDft->band_res[k_offset]][hStereoDft->res_cod_mode[k_offset]]; + hStereoDft->res_cod_line_max = (int16_t) ( 0.5f + ( hStereoDft->band_limits[hStereoDft->res_cod_band_max] - 1 ) * 2.f * input_frame / (float) ( hStereoDft->NFFT ) ); + hStereoDft->res_cod_line_max = 8 * ( hStereoDft->res_cod_line_max / 8 ); + + hStereoDft->res_pred_band_min = max( STEREO_DFT_RES_PRED_BAND_MIN, hStereoDft->res_cod_band_max ); + + + hStereoDft->voicing_lt = 0.75f * hStereoDft->voicing_lt + 0.25f * hCPE->hCoreCoder[0]->voicing[0]; + hStereoDft->voicing_lt = 0.75f * hStereoDft->voicing_lt + 0.25f * hCPE->hCoreCoder[0]->voicing[1]; + + /*------------------------------------------------------------------* + * Compute stereo parameters + *-----------------------------------------------------------------*/ + + /*ITD in Frequency domain*/ + fac_att = 1.0f; + + pDFT_L = hStereoDft->DFT[0]; + pDFT_R = hStereoDft->DFT[1]; + + { + stereo_dft_enc_compute_itd( hCPE, pDFT_L, pDFT_R, k_offset, input_frame, vad_flag_dtx, vad_hover_flag, bin_nrgL, bin_nrgR ); + if ( hCPE->element_mode == IVAS_CPE_MDCT ) + { + return; + } + + if ( hStereoDft->hItd->deltaItd[k_offset] != 0 && hStereoDft->hConfig->dmx_active ) + { + /*time shift channels*/ + alpha = -2.0f * EVS_PI * hStereoDft->hItd->deltaItd[k_offset] / hStereoDft->NFFT; + c = 1.f; /*cos(0)*/ + s = 0.f; /*sin(0)*/ + c1 = cosf( alpha ); + s1 = sinf( alpha ); + + if ( alpha >= 0 ) + { + for ( i = 1; i < hStereoDft->NFFT / 2; i++ ) + { + tmp = s * c1 + c * s1; + c = c * c1 - s * s1; + s = tmp; + + /*time shift of L*/ + tmp = pDFT_L[2 * i] * c - pDFT_L[2 * i + 1] * s; + pDFT_L[2 * i + 1] = pDFT_L[2 * i] * s + pDFT_L[2 * i + 1] * c; + pDFT_L[2 * i] = tmp; + } + } + else + { + for ( i = 1; i < hStereoDft->NFFT / 2; i++ ) + { + tmp = s * c1 + c * s1; + c = c * c1 - s * s1; + s = tmp; + + /*time shift of R*/ + tmp = pDFT_R[2 * i] * c + pDFT_R[2 * i + 1] * s; + pDFT_R[2 * i + 1] = -pDFT_R[2 * i] * s + pDFT_R[2 * i + 1] * c; + pDFT_R[2 * i] = tmp; + } + } + + if ( fabsf( hStereoDft->hItd->deltaItd[k_offset] * 32000.f / input_Fs ) > 80.0f ) + { + fac_att = min( 1.0f, max( 0.2f, 2.6f - 0.02f * fabsf( hStereoDft->hItd->deltaItd[1] ) * 32000.f / input_Fs ) ); + } + } + + /* compute remaining binwise energies for FB mode (ITD function only computes energies up to 16 kHz) */ + for ( i = STEREO_DFT_N_32k_ENC / 2; i < hStereoDft->NFFT / 2; i++ ) + { + bin_nrgL[i] = pDFT_L[2 * i] * pDFT_L[2 * i] + pDFT_L[2 * i + 1] * pDFT_L[2 * i + 1]; + bin_nrgR[i] = pDFT_R[2 * i] * pDFT_R[2 * i] + pDFT_R[2 * i + 1] * pDFT_R[2 * i + 1]; + } + } + + /* DFT stereo parameters */ + stereo_dft_enc_compute_prm( hStereoDft, pDFT_L, pDFT_R, k_offset, 1, hCPE->hCoreCoder[0]->sp_aud_decision0, hCPE->hCoreCoder[0]->vad_flag, bin_nrgL, bin_nrgR, dot_prod_nrg_ratio ); + + if ( vad_flag_dtx[0] == 0 ) + { + if ( hCPE->hStereoCng->cng_counter == 0 && !hCPE->hStereoCng->first_SID_after_TD ) + { + hStereoDft->sid_gipd = hStereoDft->prev_sid_gipd; + hStereoDft->no_ipd_flag = hStereoDft->prev_sid_no_ipd_flag; + } + + if ( hCPE->hStereoCng->cng_counter > ITD_SID_PREV_FRAMES ) + { + hStereoDft->prev_sid_gipd = hStereoDft->sid_gipd; + hStereoDft->prev_sid_no_ipd_flag = hStereoDft->no_ipd_flag; + } + } + + /*----------------------------------------------------------------* + * UNCLR classifier (detection of uncorrelated L and R channels) + *----------------------------------------------------------------*/ + + unclr_classifier_dft( hCPE ); + + /*------------------------------------------------------------------* + * Channel mapping: computation of DMX and RES + *-----------------------------------------------------------------*/ + + res_nrg_all_curr = EPSILON; + dmx_nrg_all_curr = EPSILON; + + pDFT_DMX = DFT_DMX; + pDFT_RES = DFT_RES; + pNrgL = bin_nrgL; + pNrgR = bin_nrgR; + + set_zero( pDFT_DMX, STEREO_DFT_N_MAX_ENC ); + set_zero( pDFT_RES, STEREO_DFT_N_8k_ENC ); + + pgIpd = hStereoDft->gipd + k_offset; + pSideGain = hStereoDft->side_gain + k_offset * STEREO_DFT_BAND_MAX; + + if ( hStereoDft->hConfig->dmx_active ) + { + /*Active DMX*/ + alpha = 0; /* to avoid compilation warning */ + g = 1.f; + + /*Apply active DMX*/ + pDFT_DMX[0] = 0.f; + pDFT_RES[0] = 0.f; + for ( b = 0; b < hStereoDft->nbands_dmx; b++ ) + { + g = pSideGain[b]; + + if ( pgIpd[0] != 0.f ) + { + c = cosf( pgIpd[0] ); + s = sinf( pgIpd[0] ); + for ( i = hStereoDft->band_limits_dmx[b]; i < hStereoDft->band_limits_dmx[b + 1]; i++ ) + { + /*rotate L*/ + tmp = pDFT_L[2 * i] * c + pDFT_L[2 * i + 1] * s; + pDFT_L[2 * i + 1] = pDFT_L[2 * i + 1] * c - pDFT_L[2 * i] * s; + pDFT_L[2 * i] = tmp; + } + } + + if ( b < hStereoDft->res_cod_band_max && vad_flag_dtx[0] ) + { + + /*Get the previous frame energy*/ + if ( hStereoDft->hConfig->ada_wb_res_cod_mode ) + { + /*Calculate the energy of RES and DMX*/ + /* 90% of old frame ... */ + dmx_nrg_all_curr += hStereoDft->res_cod_NRG_M[b] * 0.9f; + res_nrg_all_curr += hStereoDft->res_cod_NRG_S[b] * 0.9f; + } + hStereoDft->res_cod_NRG_M[b] = EPSILON; + hStereoDft->res_cod_NRG_S[b] = EPSILON; + + for ( i = hStereoDft->band_limits[b]; i < hStereoDft->band_limits[b + 1]; i++ ) + { + pDFT_DMX[2 * i] = ( pDFT_L[2 * i] + pDFT_R[2 * i] ) * 0.5f; + pDFT_DMX[2 * i + 1] = ( pDFT_L[2 * i + 1] + pDFT_R[2 * i + 1] ) * 0.5f; + + pDFT_RES[2 * i] = ( pDFT_L[2 * i] - pDFT_R[2 * i] ) * 0.5f; + pDFT_RES[2 * i + 1] = ( pDFT_L[2 * i + 1] - pDFT_R[2 * i + 1] ) * 0.5f; + + /*Prediction of RES with DMX*/ + pDFT_RES[2 * i] = pDFT_RES[2 * i] - g * pDFT_DMX[2 * i]; + pDFT_RES[2 * i + 1] = pDFT_RES[2 * i + 1] - g * pDFT_DMX[2 * i + 1]; + + pDFT_RES[2 * i] *= fac_att; + pDFT_RES[2 * i + 1] *= fac_att; + + /*Energy of the DMX and RES*/ + hStereoDft->res_cod_NRG_M[b] += pDFT_DMX[2 * i] * pDFT_DMX[2 * i] + pDFT_DMX[2 * i + 1] * pDFT_DMX[2 * i + 1]; + hStereoDft->res_cod_NRG_S[b] += pDFT_RES[2 * i] * pDFT_RES[2 * i] + pDFT_RES[2 * i + 1] * pDFT_RES[2 * i + 1]; + } + + if ( hStereoDft->hConfig->ada_wb_res_cod_mode ) + { + /*Calculate the energy of RES and DMX*/ + /* ... + 10% of current frame. */ + dmx_nrg_all_curr += hStereoDft->res_cod_NRG_M[b] * 0.1f; + res_nrg_all_curr += hStereoDft->res_cod_NRG_S[b] * 0.1f; + } + } + else + { + int16_t upper_border; + int16_t triple_bin; + float frac_dot_prod; /* fraction of dot product according to energy ratio of current bins and whole band */ + float Sr, Si; + float comb_nrgL, comb_nrgR; + + upper_border = min( STEREO_DFT_DMX_CROSSOVER, hStereoDft->band_limits_dmx[b + 1] ); + + triple_bin = 0; + if ( upper_border > hStereoDft->band_limits_dmx[b] && ( upper_border - hStereoDft->band_limits_dmx[b] ) % 2 ) + { + /* if odd number of bins in band, combine last 3 bins */ + triple_bin = 1; + upper_border -= 3; + } + + for ( i = hStereoDft->band_limits_dmx[b]; i < upper_border; i += 2 ) + { + comb_nrgL = pNrgL[i] + pNrgL[i + 1]; + comb_nrgR = pNrgR[i] + pNrgR[i + 1]; + Sr = ( pDFT_L[2 * i] + pDFT_R[2 * i] ) * ( pDFT_L[2 * i] + pDFT_R[2 * i] ) + ( pDFT_L[2 * i + 2] + pDFT_R[2 * i + 2] ) * ( pDFT_L[2 * i + 2] + pDFT_R[2 * i + 2] ); + Si = ( pDFT_L[2 * i + 1] + pDFT_R[2 * i + 1] ) * ( pDFT_L[2 * i + 1] + pDFT_R[2 * i + 1] ) + ( pDFT_L[2 * i + 3] + pDFT_R[2 * i + 3] ) * ( pDFT_L[2 * i + 3] + pDFT_R[2 * i + 3] ); + + sum_abs = sqrtf( comb_nrgL ) + sqrtf( comb_nrgR ) + EPSILON; + frac_dot_prod = ( comb_nrgL + comb_nrgR ) * dot_prod_nrg_ratio[b]; + wR = sqrtf( 0.5f * ( comb_nrgL + comb_nrgR ) + frac_dot_prod ) / sum_abs; + + wL = wR + sqrtf( 2.f ) * ( 1.f - ( sqrtf( Sr + Si ) / sum_abs ) ); + + /*DMX Mapping*/ + pDFT_DMX[2 * i] = ( wL * pDFT_L[2 * i] + wR * pDFT_R[2 * i] ) * INV_SQRT_2; + pDFT_DMX[2 * i + 1] = ( wL * pDFT_L[2 * i + 1] + wR * pDFT_R[2 * i + 1] ) * INV_SQRT_2; + pDFT_DMX[2 * i + 2] = ( wL * pDFT_L[2 * i + 2] + wR * pDFT_R[2 * i + 2] ) * INV_SQRT_2; + pDFT_DMX[2 * i + 3] = ( wL * pDFT_L[2 * i + 3] + wR * pDFT_R[2 * i + 3] ) * INV_SQRT_2; + } + + if ( triple_bin ) + { + comb_nrgL = comb_nrgR = 0.f; + Sr = Si = 0.f; + for ( j = i; j < i + 3; j++ ) + { + comb_nrgL += pNrgL[j]; + comb_nrgR += pNrgR[j]; + Sr += ( pDFT_L[2 * j] + pDFT_R[2 * j] ) * ( pDFT_L[2 * j] + pDFT_R[2 * j] ); + Si += ( pDFT_L[2 * j + 1] + pDFT_R[2 * j + 1] ) * ( pDFT_L[2 * j + 1] + pDFT_R[2 * j + 1] ); + } + + sum_abs = sqrtf( comb_nrgL ) + sqrtf( comb_nrgR ) + EPSILON; + frac_dot_prod = ( comb_nrgL + comb_nrgR ) * dot_prod_nrg_ratio[b]; + wR = sqrtf( 0.5f * ( comb_nrgL + comb_nrgR ) + frac_dot_prod ) / sum_abs; + wL = wR + sqrtf( 2.f ) * ( 1.f - ( sqrtf( Sr + Si ) / sum_abs ) ); + + for ( j = i; j < i + 3; j++ ) + { + pDFT_DMX[2 * j] = ( wL * pDFT_L[2 * j] + wR * pDFT_R[2 * j] ) * INV_SQRT_2; + pDFT_DMX[2 * j + 1] = ( wL * pDFT_L[2 * j + 1] + wR * pDFT_R[2 * j + 1] ) * INV_SQRT_2; + } + i += 3; + } + + if ( i < hStereoDft->band_limits_dmx[b + 1] ) + { + sum_nrg_L2 = EPSILON; + sum_nrg_R2 = EPSILON; + dot_prod_real2 = EPSILON; + for ( j = hStereoDft->band_limits_dmx[b]; j < hStereoDft->band_limits_dmx[b + 1]; j++ ) + { + sum_nrg_L2 += pDFT_L[2 * j] * pDFT_L[2 * j] + pDFT_L[2 * j + 1] * pDFT_L[2 * j + 1]; + sum_nrg_R2 += pDFT_R[2 * j] * pDFT_R[2 * j] + pDFT_R[2 * j + 1] * pDFT_R[2 * j + 1]; + dot_prod_real2 += pDFT_L[2 * j] * pDFT_R[2 * j] + pDFT_L[2 * j + 1] * pDFT_R[2 * j + 1]; + } + + sum_nrg_Mid = max( 0.f, sum_nrg_L2 + sum_nrg_R2 + 2.f * dot_prod_real2 ); + sum_abs = sqrtf( sum_nrg_L2 ) + sqrtf( sum_nrg_R2 ) + EPSILON; + wR = sqrtf( 0.5f * ( sum_nrg_L2 + sum_nrg_R2 ) + dot_prod_nrg_ratio[b] ) / sum_abs; + wL = wR + sqrtf( 2.f ) * ( 1.f - sqrtf( sum_nrg_Mid ) / sum_abs ); + } + + for ( ; i < hStereoDft->band_limits_dmx[b + 1]; i++ ) + { + /*DMX Mapping*/ + pDFT_DMX[2 * i] = ( wL * pDFT_L[2 * i] + wR * pDFT_R[2 * i] ) * INV_SQRT_2; + pDFT_DMX[2 * i + 1] = ( wL * pDFT_L[2 * i + 1] + wR * pDFT_R[2 * i + 1] ) * INV_SQRT_2; + } + } + } + + for ( i = hStereoDft->band_limits_dmx[b]; i < hStereoDft->NFFT / 2; i++ ) + { + pDFT_DMX[2 * i] = 0.f; + pDFT_DMX[2 * i + 1] = 0.f; + } + + /*Nyquist Freq.*/ + if ( hStereoDft->band_limits_dmx[b] >= hStereoDft->NFFT / 2 ) + { + pDFT_DMX[1] = ( pDFT_L[1] + pDFT_R[1] ) * 0.5f; + } + else + { + pDFT_DMX[1] = 0.f; + } + + /* DC component */ + pDFT_DMX[0] = ( pDFT_L[0] + pDFT_R[0] ) * 0.5f; + } + else + { + /*passive DMX*/ + assert( hStereoDft->nbands == hStereoDft->nbands_dmx && "Don't use coarser stereo parameter resolution for residual coding bitrates!" ); + for ( i = 0; i < hStereoDft->band_limits[hStereoDft->res_cod_band_max]; i++ ) + { + pDFT_DMX[i] = ( pDFT_L[i] + pDFT_R[i] ) * 0.5f; + pDFT_RES[i] = ( pDFT_L[i] - pDFT_R[i] ) * 0.5f; + } + for ( ; i < hStereoDft->NFFT; i++ ) + { + pDFT_DMX[i] = ( pDFT_L[i] + pDFT_R[i] ) * 0.5f; + } + } + + /*------------------------------------------------------------------* + * Recalculate RES and DMX + *-----------------------------------------------------------------*/ + + if ( hStereoDft->NFFT == STEREO_DFT_N_16k_ENC && hStereoDft->hConfig->ada_wb_res_cod_mode ) + { + stereo_dft_enc_get_res_cod_mode_flag( hStereoDft, res_nrg_all_curr, dmx_nrg_all_curr, &res_dmx_ratio, &frame_nrg_ratio ); + + if ( hStereoDft->res_cod_sw_flag ) + { + int16_t res_cod_band_max; + + res_cod_band_max = dft_band_res_cod[hStereoDft->band_res[k_offset]][hStereoDft->hConfig->ada_wb_res_cod_mode]; + + /* Recalculate RES and DMX */ + for ( b = 0; b < res_cod_band_max; b++ ) + { + sum_nrg_L2 = EPSILON; + sum_nrg_R2 = EPSILON; + dot_prod_real2 = EPSILON; + for ( j = hStereoDft->band_limits_dmx[b]; j < hStereoDft->band_limits_dmx[b + 1]; j++ ) + { + sum_nrg_L2 += pDFT_L[2 * j] * pDFT_L[2 * j] + pDFT_L[2 * j + 1] * pDFT_L[2 * j + 1]; + sum_nrg_R2 += pDFT_R[2 * j] * pDFT_R[2 * j] + pDFT_R[2 * j + 1] * pDFT_R[2 * j + 1]; + dot_prod_real2 += pDFT_L[2 * j] * pDFT_R[2 * j] + pDFT_L[2 * j + 1] * pDFT_R[2 * j + 1]; + } + + sum_nrg_Mid = max( 0.f, sum_nrg_L2 + sum_nrg_R2 + 2.f * dot_prod_real2 ); + wL = 0.5f * max( sqrtf( sum_nrg_L2 ) + sqrtf( sum_nrg_R2 ) - sqrtf( sum_nrg_Mid ), 0 ) * inv_sqrt( sum_nrg_L2 + EPSILON ); + wS = 1; + + if ( hStereoDft->res_cod_sw_flag ) + { + wL *= ( 1 - hStereoDft->switch_fade_factor ); + wS = hStereoDft->switch_fade_factor; + } + + for ( i = hStereoDft->band_limits[b]; i < hStereoDft->band_limits[b + 1]; i++ ) + { + /*DMX Recalculation*/ + DFT_DMX[2 * i] += wL * pDFT_L[2 * i]; + DFT_DMX[2 * i + 1] += wL * pDFT_L[2 * i + 1]; + + /*RES Recalculation*/ + DFT_RES[2 * i] *= wS; + DFT_RES[2 * i + 1] *= wS; + } + } + } + } + + if ( input_Fs >= 32000 ) + { + stereo_dft_enc_calculate_nrg_for_icbwe( hStereoDft, DFT_DMX, input_Fs ); + } + + mvr2r( DFT_DMX, hStereoDft->DFT[0], STEREO_DFT_N_MAX_ENC ); + mvr2r( DFT_RES, hStereoDft->DFT[1], STEREO_DFT_N_8k_ENC ); + set_zero( hStereoDft->DFT[1] + STEREO_DFT_N_8k_ENC, STEREO_DFT_N_MAX_ENC - STEREO_DFT_N_8k_ENC ); + + return; +} + + +/*------------------------------------------------------------------------- + * stereo_dft_enc_get_res_cod_mode_flag() + * + * Get the residual signal coding flag + *-------------------------------------------------------------------------*/ + +static void stereo_dft_enc_get_res_cod_mode_flag( + STEREO_DFT_ENC_DATA_HANDLE hStereoDft, + const float res_nrg_all_curr, + const float dmx_nrg_all_curr, + float *res_dmx_ratio, + float *frame_nrg_ratio ) +{ + int16_t b, k_offset; + float dmx_res_all, g; + int16_t fast_update_flag; + int16_t prev_res_cod_mode_flag, res_cod_mode_flag; + + k_offset = STEREO_DFT_OFFSET; /*Add an offset at encoder*/ + + /*Calculate energy ratio between residual signal and downmix signal */ + *res_dmx_ratio = 0; + + for ( b = 0; b < hStereoDft->res_cod_band_max; b++ ) + { + g = fabsf( hStereoDft->side_gain[(k_offset) *STEREO_DFT_BAND_MAX + b] ); + *res_dmx_ratio = max( hStereoDft->res_cod_NRG_S[b] / ( hStereoDft->res_cod_NRG_S[b] + ( 1 - g ) * ( 1 - g ) * hStereoDft->res_cod_NRG_M[b] + 1 ), *res_dmx_ratio ); + } + *res_dmx_ratio = check_bounds( *res_dmx_ratio, 0, 1 ); /*should always be satisfied*/ + + /*Calculate the total energy of RES and DMX*/ + dmx_res_all = res_nrg_all_curr + dmx_nrg_all_curr; + + /*Calculate the energy ratio of the inter-frame */ + *frame_nrg_ratio = dmx_res_all / hStereoDft->dmx_res_all_prev; + *frame_nrg_ratio = min( 5.0f, max( 0.2f, *frame_nrg_ratio ) ); + + /* Get fast update flag */ + fast_update_flag = 0; + if ( ( *frame_nrg_ratio > 3.2f && *res_dmx_ratio < 0.1f ) || ( *frame_nrg_ratio < 0.21f && *res_dmx_ratio > 0.4f ) ) + { + fast_update_flag = 1; + } + + /* Calculate long term energy ratio between residual signal and downmix signal */ + if ( fast_update_flag ) + { + hStereoDft->res_dmx_ratio_lt = *res_dmx_ratio * 0.2f + hStereoDft->res_dmx_ratio_lt * 0.8f; + } + else + { + hStereoDft->res_dmx_ratio_lt = *res_dmx_ratio * 0.05f + hStereoDft->res_dmx_ratio_lt * 0.95f; + } + + /*Get the residual signal coding initial flag */ + if ( hStereoDft->res_dmx_ratio_lt > 0.01f ) + { + res_cod_mode_flag = 1; + } + else + { + res_cod_mode_flag = 0; + } + + /* Get the residual signal coding flag */ + if ( hStereoDft->first_frm_flag ) + { + prev_res_cod_mode_flag = res_cod_mode_flag; + hStereoDft->first_frm_flag = 0; + } + else + { + prev_res_cod_mode_flag = hStereoDft->res_cod_mode[STEREO_DFT_OFFSET - 1]; + } + if ( res_cod_mode_flag != prev_res_cod_mode_flag ) + { + if ( prev_res_cod_mode_flag == 1 ) + { + if ( hStereoDft->hangover_cnt0 < 5 && hStereoDft->last_res_cod_mode_modify_flag == 0 && fast_update_flag == 0 ) + { + res_cod_mode_flag = prev_res_cod_mode_flag; + hStereoDft->hangover_cnt0++; + } + else + { + /* reset hangover */ + hStereoDft->hangover_cnt0 = 0; + } + } + else + { + if ( *frame_nrg_ratio > 2.5f || *frame_nrg_ratio < 0.21f ) + { + /* reset hangover */ + hStereoDft->hangover_cnt1 = 0; + } + else + { + if ( hStereoDft->hangover_cnt1 < 5 ) + { + res_cod_mode_flag = prev_res_cod_mode_flag; + hStereoDft->hangover_cnt1++; + } + else + { + /* reset hangover */ + hStereoDft->hangover_cnt1 = 0; + } + } + } + } + + /* handle switching frames */ + if ( res_cod_mode_flag != prev_res_cod_mode_flag && hStereoDft->last_res_cod_mode_modify_flag == 0 ) + { + hStereoDft->res_cod_sw_flag = 1; + + /* Update switch_fade_factor */ + if ( *frame_nrg_ratio > 3.2f && *res_dmx_ratio < 0.1f ) + { + hStereoDft->switch_fade_factor = 0.75f; + } + else if ( *frame_nrg_ratio < 0.21f && *res_dmx_ratio > 0.4f ) + { + hStereoDft->switch_fade_factor = 0.25f; + } + else + { + hStereoDft->switch_fade_factor = 0.5f; + } + + if ( res_cod_mode_flag == 0 ) + { + res_cod_mode_flag = 1; + } + } + + /*update previous frame's total energy of RES and DMX */ + hStereoDft->dmx_res_all_prev = dmx_res_all; + + /* update residual coding mode */ + hStereoDft->res_cod_mode[STEREO_DFT_OFFSET] = res_cod_mode_flag; + if ( !hStereoDft->res_cod_mode[STEREO_DFT_OFFSET] ) + { + hStereoDft->res_cod_band_max = 0; + hStereoDft->res_cod_line_max = 0; + } + + /*Update residual signal memory when switching from not coding residual signal to coding it*/ + if ( prev_res_cod_mode_flag == 0 && res_cod_mode_flag == 1 ) + { + set_zero( hStereoDft->output_mem_res_8k, STEREO_DFT_OVL_8k ); + } + + return; +} + + +/*------------------------------------------------------------------------- + * stereo_dft_enc_res() + * + * Code the residual signal + *-------------------------------------------------------------------------*/ + +void stereo_dft_enc_res( + STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i/o: encoder stereo handle */ + const float *input_8k, /* i : input buffer sampled at 8kHz*/ + BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ + int16_t *nb_bits, /* o : number of bits written */ + const int16_t max_bits ) +{ + int16_t i, b; + RangeUniEncState range_uni_enc_state; + ECSQ_instance ecsq_inst; + float MDCT_RES[L_FRAME8k]; + float win[L_FRAME8k + STEREO_DFT_OVL_8k]; + int16_t global_gain_index; + int16_t total_bit_count; + float max_snr; + float panning_gain, panning_gain_min; + float res_cod_gain[10]; + float in_phase_ratio; + assert( hStereoDft->res_cod_line_max <= L_FRAME8k ); + + if ( hStereoDft->res_cod_mode[STEREO_DFT_OFFSET] ) + { + /* Windowing */ + /* overlapping parts */ + /*input_8k-=STEREO_DFT_OVL_8k;*/ + for ( i = 0; i < STEREO_DFT_OVL_8k; i++ ) + { + win[i] = input_8k[i] * hStereoDft->win_mdct_8k[i]; + win[L_FRAME8k + i] = input_8k[L_FRAME8k + i] * hStereoDft->win_mdct_8k[STEREO_DFT_OVL_8k - 1 - i]; + } + /* middle part */ + for ( ; i < L_FRAME8k; i++ ) + { + win[i] = input_8k[i]; + } + + /* MDCT analysis */ + TCX_MDCT( win, MDCT_RES, STEREO_DFT_OVL_8k, L_FRAME8k - STEREO_DFT_OVL_8k, STEREO_DFT_OVL_8k, IVAS_CPE_DFT ); + + /*Compute the DMX to RES for each band*/ + max_snr = 0.f; /*minimum gain for residual coding -> no coding*/ + for ( b = 0; b < hStereoDft->res_cod_band_max; b++ ) + { + /*Get side gain information and it is we*/ + panning_gain = hStereoDft->side_gain[STEREO_DFT_OFFSET * STEREO_DFT_BAND_MAX + b]; + panning_gain_min = 1.f - fabsf( panning_gain ); + + in_phase_ratio = ( panning_gain_min * panning_gain_min * hStereoDft->res_cod_NRG_M[b] ) / ( panning_gain_min * panning_gain_min * hStereoDft->res_cod_NRG_M[b] + hStereoDft->res_cod_NRG_S[b] + 1 ); + in_phase_ratio = check_bounds( in_phase_ratio, 0, 1 ); + res_cod_gain[b] = in_phase_ratio * STEREO_DFT_RES_COD_SNR_MIN + ( 1 - in_phase_ratio ) * STEREO_DFT_RES_COD_SNR_MAX; + + /*get the maximum through bands*/ + if ( res_cod_gain[b] > max_snr ) + { + max_snr = res_cod_gain[b]; + } + } + + /*Smooth max_snr because of several perturbations in computation*/ + hStereoDft->old_snr = 0.2f * max_snr + 0.8f * hStereoDft->old_snr; + max_snr = hStereoDft->old_snr; + + if ( max_snr < STEREO_DFT_RES_COD_SNR_MIN ) + { + max_snr = STEREO_DFT_RES_COD_SNR_MIN; + } + + push_wmops( "residual_encode" ); + /* residual encoding */ + ECSQ_init_instance( &ecsq_inst, 0 /*dummy index*/, &range_uni_enc_state ); + rc_uni_enc_init( &range_uni_enc_state ); + + ecsq_inst.bit_count_estimate = 0; + ecsq_inst.config_index = 2 * hStereoDft->res_cod_mode[STEREO_DFT_OFFSET] - 1; + + /* 7 bits (STEREO_DFT_RES_GLOBAL_GAIN_BITS) for global_gain_index, 2 bits for closing of the arithmetic coder, 8 safety bits to account for the size estimation accuracy */ + ECSQ_encode_target_SNR( &ecsq_inst, MDCT_RES, hStereoDft->res_cod_line_max, max_snr, max_bits - ( *nb_bits ) - STEREO_DFT_RES_GLOBAL_GAIN_BITS - 2 - 8, NULL, &global_gain_index ); + if ( global_gain_index != ECSQ_GLOBAL_GAIN_INDEX_ALL_ZERO ) + { + total_bit_count = rc_uni_enc_finish( &range_uni_enc_state ); + + if ( total_bit_count <= max_bits - *nb_bits - STEREO_DFT_RES_GLOBAL_GAIN_BITS ) + { + int16_t idx; + uint8_t *byte_buffer; + + /* Global gain */ + push_indice( hBstr, IND_STEREO_DFT_RESIDUAL_GLOBAL_GAIN, global_gain_index, STEREO_DFT_RES_GLOBAL_GAIN_BITS ); + ( *nb_bits ) += STEREO_DFT_RES_GLOBAL_GAIN_BITS; + + /* Push arithmetic coded bits */ + byte_buffer = range_uni_enc_state.byte_buffer; + for ( idx = 0; idx < ( total_bit_count >> 3 ); ++idx ) + { + push_indice( hBstr, IND_STEREO_DFT_RESIDUAL_COD, byte_buffer[idx], 8 ); + } + if ( ( total_bit_count & 7 ) != 0 ) + { + /* move the last 1 to 7 bits from the MSB position of the last byte to the LSB postion */ + push_indice( hBstr, IND_STEREO_DFT_RESIDUAL_COD, byte_buffer[idx] >> ( 8 - ( total_bit_count & 7 ) ), total_bit_count & 7 ); + } + ( *nb_bits ) += total_bit_count; + } + else + { + /* Global gain -> 127*/ + global_gain_index = ECSQ_GLOBAL_GAIN_INDEX_ALL_ZERO; + push_indice( hBstr, IND_STEREO_DFT_RESIDUAL_GLOBAL_GAIN, global_gain_index, STEREO_DFT_RES_GLOBAL_GAIN_BITS ); + ( *nb_bits ) += STEREO_DFT_RES_GLOBAL_GAIN_BITS; + } + } + else + { + /* Global gain -> 127*/ + push_indice( hBstr, IND_STEREO_DFT_RESIDUAL_GLOBAL_GAIN, global_gain_index, STEREO_DFT_RES_GLOBAL_GAIN_BITS ); + ( *nb_bits ) += STEREO_DFT_RES_GLOBAL_GAIN_BITS; + } + + pop_wmops(); + } + + + return; +} + + +/*------------------------------------------------------------------------- + * stereo_dft_enc_write_BS() + * + * Write DFT stereo bitstream + *-------------------------------------------------------------------------*/ + +void stereo_dft_enc_write_BS( + CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ + int16_t *nb_bits /* o : number of bits written */ +) +{ + int16_t b, k_offset, itd, nb, nbands, sp_aud_decision0; + int16_t NFFT_inner, nbands_full; + int16_t no_GR_ord; + int16_t encoded_ind_GR[STEREO_DFT_BAND_MAX]; + int16_t encoded_ind_pred_GR[STEREO_DFT_BAND_MAX]; + int16_t sid_gIpd_index, sid_itd; + float cohBand[STEREO_DFT_BAND_MAX / 2]; + BSTR_ENC_HANDLE hBstr; + STEREO_DFT_ENC_DATA_HANDLE hStereoDft; + int32_t core_brate; + + /*------------------------------------------------------------------* + * Initialization + *-----------------------------------------------------------------*/ + + hStereoDft = hCPE->hStereoDft; + hBstr = hCPE->hMetaData; + core_brate = hCPE->hCoreCoder[0]->core_brate; + + sp_aud_decision0 = 0; + if ( hCPE->last_element_mode == IVAS_CPE_DFT ) + { + sp_aud_decision0 = hCPE->hCoreCoder[0]->sp_aud_decision0; + } + + *nb_bits = 0; + k_offset = STEREO_DFT_OFFSET; + + nbands_full = hStereoDft->nbands; + + if ( core_brate == FRAME_NO_DATA || core_brate == SID_2k40 ) + { + NFFT_inner = min( STEREO_DFT_N_32k_ENC, STEREO_DFT_N_MAX_ENC * inner_frame_tbl[hCPE->hCoreCoder[0]->bwidth] / L_FRAME48k ); + hStereoDft->band_res[k_offset] = hStereoDft->hConfig->band_res; + hStereoDft->res_pred_mode[k_offset] = 0; + hStereoDft->res_cod_mode[k_offset] = 0; + } + else + { + NFFT_inner = STEREO_DFT_N_MAX_ENC * inner_frame_tbl[hCPE->hCoreCoder[0]->bwidth] / L_FRAME48k; + } + + /* set number of bands according to bandwidth after BWD */ + hStereoDft->nbands = stereo_dft_band_config( hStereoDft->band_limits, hStereoDft->band_res[k_offset], NFFT_inner, ENC ); + + if ( core_brate == FRAME_NO_DATA ) + { + /* No data frame */ + ( *nb_bits ) = 0; + return; + } + + /* attack present */ + /* attackPresent not sent in inactive frames, receiver assumes = 0 */ + if ( core_brate != SID_2k40 ) + { + push_indice( hBstr, IND_STEREO_DFT_ATTACK_PRESENT, hStereoDft->attackPresent, 1 ); + ( *nb_bits )++; + } + + /* Writing coding residual coding mode into bitstream */ + if ( hStereoDft->hConfig->ada_wb_res_cod_mode && hCPE->hCoreCoder[0]->bwidth == WB ) + { + push_indice( hBstr, IND_STEREO_DFT_RES_COD, hStereoDft->res_cod_mode[k_offset], 1 ); + ( *nb_bits )++; + hStereoDft->res_cod_band_max = dft_band_res_cod[hStereoDft->hConfig->band_res][hStereoDft->res_cod_mode[k_offset]]; + hStereoDft->res_pred_band_min = max( STEREO_DFT_RES_PRED_BAND_MIN, hStereoDft->res_cod_band_max ); + } + + + if ( nbands_full < hStereoDft->nbands ) + { + hStereoDft->reverb_flag = 0; + } + + /* Side gains */ + hStereoDft->side_gain_flag_1 = 0; /* EC coding by default */ + side_gain_mode_decision( hStereoDft, encoded_ind_GR, sp_aud_decision0, hCPE->hCoreCoder[0]->last_core_brate ); + + /* residual pred. gains */ + hStereoDft->res_pred_flag_1 = 0; /* EC coding by default */ + + res_pred_gain_mode_decision( hStereoDft, encoded_ind_pred_GR, k_offset, hCPE->hCoreCoder[0]->last_core_brate ); + + /*------------------------------------------------------------------* + * write ITD indices + *-----------------------------------------------------------------*/ + + if ( core_brate != SID_2k40 ) + { + push_indice( hBstr, IND_STEREO_DFT_ITD_MODE, ( hStereoDft->hItd->itd[k_offset] != 0 ), STEREO_DFT_ITD_MODE_NBITS ); + ( *nb_bits ) += STEREO_DFT_ITD_MODE_NBITS; /*ITD mode flag: 1bit*/ + } + + if ( core_brate != SID_2k40 ) + { + if ( hStereoDft->hItd->itd[k_offset] ) + { + itd = hStereoDft->hItd->itd_index[k_offset]; + if ( itd > 255 ) + { + itd -= 256; + + if ( itd < 20 ) + { + push_indice( hBstr, IND_STEREO_DFT_ITD_HUFF, 1, 1 ); /* use Huffman*/ + push_indice( hBstr, IND_STEREO_DFT_ITD_NEG, 1, 1 ); /* negative */ + push_indice( hBstr, IND_STEREO_DFT_ITD_COD, dft_code_itd[itd], dft_len_itd[itd] ); + ( *nb_bits ) += dft_len_itd[itd] + 2; + } + else + { + push_indice( hBstr, IND_STEREO_DFT_ITD_HUFF, 0, 1 ); /* don't use Huffman */ + push_indice( hBstr, IND_STEREO_DFT_ITD_NEG, 1, 1 ); /* negative */ + push_indice( hBstr, IND_STEREO_DFT_ITD_COD, itd, STEREO_DFT_ITD_NBITS - 1 ); + ( *nb_bits ) += STEREO_DFT_ITD_NBITS + 1; + } + } + else + { + if ( itd < 20 ) + { + push_indice( hBstr, IND_STEREO_DFT_ITD_HUFF, 1, 1 ); /* use Huffman*/ + push_indice( hBstr, IND_STEREO_DFT_ITD_NEG, 0, 1 ); /* positive */ + push_indice( hBstr, IND_STEREO_DFT_ITD_COD, dft_code_itd[itd], dft_len_itd[itd] ); + ( *nb_bits ) += dft_len_itd[itd] + 2; + } + else + { + /* don't use Huffman and positive*/ + push_indice( hBstr, IND_STEREO_DFT_ITD_COD, itd, STEREO_DFT_ITD_NBITS + 1 ); + ( *nb_bits ) += STEREO_DFT_ITD_NBITS + 1; + } + } + } + } + +#ifdef DEBUG_MODE_DFT_BITS + fprintf( ITD_bits, "%d ", *nb_bits ); +#endif + + /*------------------------------------------------------------------* + * write Side gain indices + *-----------------------------------------------------------------*/ + + /* Side Gain flag 1 */ + nb = 0; + if ( hStereoDft->side_gain_flag_1 > 0 ) + { + push_indice( hBstr, IND_STEREO_DFT_SIDEGAIN_FLAG, hStereoDft->side_gain_flag_1, 2 ); + nb += 2; + } + else + { + push_indice( hBstr, IND_STEREO_DFT_SIDEGAIN_FLAG, hStereoDft->side_gain_flag_1, STEREO_DFT_FLAG_BITS ); + nb += STEREO_DFT_FLAG_BITS; + } + + no_GR_ord = 3; + + if ( hStereoDft->side_gain_flag_1 == 0 ) + { + nb += write_bitstream_adapt_GR( hBstr, IND_STEREO_DFT_SIDEGAINS, encoded_ind_GR, hStereoDft->nbands, hStereoDft->side_gain_flag_2, no_GR_ord ); + } + else + { + if ( hStereoDft->side_gain_flag_1 == 2 ) + { + nb += write_bitstream_GR( hBstr, IND_STEREO_DFT_SIDEGAINS, hStereoDft->side_gain_index_ECDiff, hStereoDft->nbands, hStereoDft->side_gain_flag_2 - no_GR_ord ); + } + else + { + for ( b = 0; b < hStereoDft->nbands; b++ ) + { + /*ILD*/ + push_indice( hBstr, IND_STEREO_DFT_SIDEGAINS, hStereoDft->side_gain_index_EC[b], STEREO_DFT_SIDEGAIN_NBITS ); + nb += STEREO_DFT_SIDEGAIN_NBITS; + } + } + } + + /* nb bits are used for side gain*/ + ( *nb_bits ) += nb; +#ifdef DEBUG_MODE_DFT_BITS + fprintf( SG_bits, "%d ", nb ); +#endif + nb = 0; + + if ( core_brate == SID_2k40 ) + { + stereo_dft_enc_sid_calc_coh( hStereoDft, hCPE->hStereoCng->prev_cohBand, &hCPE->hStereoCng->td_active, &hCPE->hStereoCng->first_SID, cohBand ); + + if ( *nb_bits <= ( ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS - STEREO_DFT_ITD_MODE_NBITS - STEREO_DFT_SID_ITD_NBITS - 1 ) ) + { + if ( hStereoDft->hItd->itd[k_offset] != 0 ) + { + /* Re-quantize ITD with lower resolution for Stereo CNG */ + itd = hStereoDft->hItd->itd_index[k_offset]; + if ( itd > 255 ) + { + itd -= 256; + } + itd = itd >> STEREO_DFT_SID_ITD_FAC; + + sid_itd = itd && 1; + } + else + { + sid_itd = 0; + } + + push_indice( hBstr, IND_STEREO_DFT_ITD_MODE, sid_itd, STEREO_DFT_ITD_MODE_NBITS ); + ( *nb_bits ) += STEREO_DFT_ITD_MODE_NBITS; /*ITD mode flag: 1bit*/ + + if ( sid_itd ) + { + itd = hStereoDft->hItd->itd_index[k_offset]; + if ( itd > 255 ) + { + itd -= 256; + itd = itd >> STEREO_DFT_SID_ITD_FAC; + + if ( itd > ( ( 1 << STEREO_DFT_SID_ITD_NBITS ) - 1 ) ) + { + itd = ( 1 << STEREO_DFT_SID_ITD_NBITS ) - 1; + } + + push_indice( hBstr, IND_STEREO_DFT_ITD_NEG, 1, 1 ); /* negative */ + push_indice( hBstr, IND_STEREO_DFT_ITD_COD, itd, STEREO_DFT_SID_ITD_NBITS ); + ( *nb_bits ) += STEREO_DFT_SID_ITD_NBITS + 1; + } + else + { + itd = itd >> STEREO_DFT_SID_ITD_FAC; + + if ( itd > ( ( 1 << STEREO_DFT_SID_ITD_NBITS ) - 1 ) ) + { + itd = ( 1 << STEREO_DFT_SID_ITD_NBITS ) - 1; + } + + push_indice( hBstr, IND_STEREO_DFT_ITD_NEG, 0, 1 ); /* Positive */ + push_indice( hBstr, IND_STEREO_DFT_ITD_COD, itd, STEREO_DFT_SID_ITD_NBITS ); + ( *nb_bits ) += STEREO_DFT_SID_ITD_NBITS + 1; + } + + } + } + } + + /*------------------------------------------------------------------* + * write IPD indices + *-----------------------------------------------------------------*/ + + if ( core_brate != SID_2k40 ) + { + push_indice( hBstr, IND_STEREO_DFT_NO_IPD_FLAG, hStereoDft->no_ipd_flag, STEREO_DFT_FLAG_BITS ); + nb += STEREO_DFT_FLAG_BITS; /*IPD mode flag: 1bit*/ + + if ( hStereoDft->no_ipd_flag == 0 ) + { + push_indice( hBstr, IND_STEREO_DFT_GIPD, hStereoDft->gipd_index, STEREO_DFT_GIPD_NBITS ); + nb += STEREO_DFT_GIPD_NBITS; + } + } + else if ( *nb_bits <= ( ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS - STEREO_DFT_FLAG_BITS - STEREO_DFT_SID_GIPD_NBITS ) ) + { + push_indice( hBstr, IND_STEREO_DFT_NO_IPD_FLAG, hStereoDft->no_ipd_flag, STEREO_DFT_FLAG_BITS ); + nb += STEREO_DFT_FLAG_BITS; /*IPD mode flag: 1bit*/ + + if ( hStereoDft->no_ipd_flag == 0 ) + { + stereo_dft_quantize_ipd( &hStereoDft->sid_gipd, &hStereoDft->sid_gipd, &sid_gIpd_index, STEREO_DFT_SID_GIPD_NBITS ); + push_indice( hBstr, IND_STEREO_DFT_GIPD, sid_gIpd_index, STEREO_DFT_SID_GIPD_NBITS ); + nb += STEREO_DFT_SID_GIPD_NBITS; + } + } + + +#ifdef DEBUG_MODE_DFT_BITS + fprintf( IPD_bits, "%d ", nb ); +#endif + ( *nb_bits ) += nb; + + /*----------------------------------------------------------------* + * Residual prediction + *----------------------------------------------------------------*/ + + nb = 0; /* bits for residual pred gains */ + if ( hStereoDft->res_pred_mode[k_offset] ) + { + if ( hStereoDft->attackPresent == 0 ) + { + nbands = min( hStereoDft->nbands, STEREO_DFT_RES_PRED_BAND_MAX ); + b = hStereoDft->res_pred_band_min; + + /*Adaptive SF*/ + if ( hStereoDft->hConfig->res_cod_mode == STEREO_DFT_RES_COD_OFF ) + { + /*read flag*/ + push_indice( hBstr, IND_STEREO_DFT_REVERB_MODE, hStereoDft->reverb_flag, STEREO_DFT_REVERB_MODE_NBITS ); + nb += STEREO_DFT_REVERB_MODE_NBITS; + if ( hStereoDft->reverb_flag ) + { + nbands -= STEREO_DFT_RES_PRED_BAND_MIN_CONST; + } + } + + /* Res Pred Gain flag 0 */ + if ( hStereoDft->res_pred_flag_1 > 0 ) + { + push_indice( hBstr, IND_STEREO_DFT_RES_PRED_FLAG, hStereoDft->res_pred_flag_1, 2 ); + nb += 2; /*pred gain mode flag: 2 bits*/ + } + else + { + push_indice( hBstr, IND_STEREO_DFT_RES_PRED_FLAG, hStereoDft->res_pred_flag_1, STEREO_DFT_FLAG_BITS ); + nb += STEREO_DFT_FLAG_BITS; /*pred gain mode flag: 1bit*/ + } + + no_GR_ord = 2; + if ( hStereoDft->res_pred_flag_1 == 0 ) + { + if ( encoded_ind_pred_GR[0] == dft_maps_rpg[8 * NO_SYMB_GR_PRED_G] ) + { + nb += write_GR1( hBstr, IND_STEREO_DFT_PRED_GAIN_COD, encoded_ind_pred_GR, 1 ); + } + else + { + nb += write_bitstream_adapt_GR( hBstr, IND_STEREO_DFT_PRED_GAIN_COD, encoded_ind_pred_GR, nbands - hStereoDft->res_pred_band_min, hStereoDft->res_pred_flag_2, 2 ); + } + } + else + { + if ( hStereoDft->res_pred_flag_1 == 2 ) + { + nb += write_bitstream_GR( hBstr, IND_STEREO_DFT_PRED_GAIN_COD, &hStereoDft->res_pred_index_ECDiff[hStereoDft->res_pred_band_min], nbands - hStereoDft->res_pred_band_min, hStereoDft->res_pred_flag_2 - no_GR_ord ); + } + else + { + for ( b = hStereoDft->res_pred_band_min; b < nbands; b++ ) + { + push_indice( hBstr, IND_STEREO_DFT_PRED_GAIN_COD, hStereoDft->res_pred_index_EC[b], STEREO_DFT_RES_GAINS_BITS ); + nb += STEREO_DFT_RES_GAINS_BITS; + } + } + } + + } + else + { + set_s( hStereoDft->res_pred_index_ECprevious, 0, hStereoDft->nbands - hStereoDft->res_pred_band_min ); + } + } + else + { + set_s( hStereoDft->res_pred_index_ECprevious, 0, hStereoDft->nbands - hStereoDft->res_pred_band_min ); + } + + ( *nb_bits ) += nb; + + if ( core_brate == SID_2k40 ) + { + stereo_dft_enc_sid_coh( hBstr, hCPE->hStereoCng->mem_cohBand, hStereoDft->nbands, nb_bits, cohBand ); + } + + + return; +} + + +/*------------------------------------------------------------------------- + * stereo_dft_enc_compute_prm() + * + * Compute stereo parameters: IPD and SIDE_GAIN + * SIDE_GAIN: Interchannel Level Difference + * IPD: Interchannel Phase Difference: angle(L)-angle(R) = acos(/(|L|.|R|)) or atan2(Img(L.R*)/Re(L.R*)) + *------------------------------------------------------------------------*/ + +static void stereo_dft_enc_compute_prm( + STEREO_DFT_ENC_DATA_HANDLE hStereoDft, + float *DFT_L, + float *DFT_R, + int16_t k_offset, + int16_t flag_quant, + const int16_t sp_aud_decision0, + const int16_t vad_flag, + float *bin_nrgL, + float *bin_nrgR, + float *dot_prod_nrg_ratio ) +{ + int16_t b, i; + int16_t b2; + float *pDFT_L, *pDFT_R; + float sum_nrg_L, sum_nrg_R; + float dot_prod_real, dot_prod_img; + float sum_nrg_L2, sum_nrg_R2; + float dot_prod_real2, dot_prod_img2; + float *pPredGain; + float *pSideGain; + float sum_energy_L, sum_energy_R; + float g, c; + float abs_L_R; + float abs_L_R2; + float gain_IPD; + float sub_nrg_DMX[STEREO_DFT_BAND_MAX]; + float sub_nrg_DMX2; + float sub_nrg_L[STEREO_DFT_BAND_MAX]; + float sub_nrg_R[STEREO_DFT_BAND_MAX]; + float diff_ipd; + float *pNrgL, *pNrgR; + float reg; + float *pgIpd, sum_dot_prod_real, sum_dot_prod_img; + float sum_past_nrgL, sum_past_nrgL2; + float sum_past_nrgR, sum_past_nrgR2; + float sum_past_dpr, sum_past_dpr2; + float sum_past_dpi, sum_past_dpi2; + float sum_past_dot_prod_abs, sum_past_dot_prod_abs2; + float sum_past_nrg_dmx; + int16_t pos; + float pIpd[STEREO_DFT_BAND_MAX]; + float ipd_smooth[STEREO_DFT_BAND_MAX]; + float ipd_mean_change; + + /*------------------------------------------------------------------* + * Initialization + *-----------------------------------------------------------------*/ + + sum_past_dot_prod_abs2 = 0.0f; + pos = hStereoDft->nrg_past_pos; + + set_f( sub_nrg_DMX, 0, STEREO_DFT_BAND_MAX ); + set_f( sub_nrg_L, 0, STEREO_DFT_BAND_MAX ); + set_f( sub_nrg_R, 0, STEREO_DFT_BAND_MAX ); + + pSideGain = hStereoDft->side_gain + k_offset * STEREO_DFT_BAND_MAX; + pgIpd = hStereoDft->gipd + k_offset; + pPredGain = hStereoDft->res_pred_gain + k_offset * STEREO_DFT_BAND_MAX; + gain_IPD = EPSILON; + sum_energy_L = EPSILON; /* Set the accumulations for the no IPD Calculation */ + sum_energy_R = EPSILON; + sum_dot_prod_real = EPSILON; + sum_dot_prod_img = EPSILON; + sub_nrg_DMX2 = 0.f; + + /*------------------------------------------------------------------* + * Band-wise processing + *-----------------------------------------------------------------*/ + + b2 = 0; + for ( b = 0; b < hStereoDft->nbands; b++ ) + { + pPredGain[b] = 1.f; + sum_nrg_L = EPSILON; + sum_nrg_R = EPSILON; + dot_prod_real = EPSILON; + dot_prod_img = EPSILON; + sum_past_nrgL = 0; + sum_past_nrgR = 0; + sum_past_dpr = 0; + sum_past_dpi = 0; + + while ( hStereoDft->band_limits_dmx[b2] < hStereoDft->band_limits[b + 1] ) + { + pDFT_L = DFT_L; + pDFT_R = DFT_R; + pNrgL = bin_nrgL; + pNrgR = bin_nrgR; + + sum_nrg_L2 = EPSILON; + sum_nrg_R2 = EPSILON; + dot_prod_real2 = EPSILON; + dot_prod_img2 = EPSILON; + + for ( i = hStereoDft->band_limits_dmx[b2]; i < hStereoDft->band_limits_dmx[b2 + 1]; i++ ) + { + sum_nrg_L2 += pNrgL[i]; + sum_nrg_R2 += pNrgR[i]; + + /* compute dot product*/ + dot_prod_real2 += pDFT_L[2 * i] * pDFT_R[2 * i] + pDFT_L[2 * i + 1] * pDFT_R[2 * i + 1]; + dot_prod_img2 += pDFT_L[2 * i + 1] * pDFT_R[2 * i] - pDFT_L[2 * i] * pDFT_R[2 * i + 1]; + } + abs_L_R2 = sqrtf( dot_prod_real2 * dot_prod_real2 + dot_prod_img2 * dot_prod_img2 ); + sub_nrg_DMX2 = sum_nrg_L2 + sum_nrg_R2 + 2 * abs_L_R2; + + if ( b2 < hStereoDft->gipd_band_max ) + { + hStereoDft->dot_prod_real_smooth[b2] = 0.5f * hStereoDft->dot_prod_real_smooth[b2] + 0.5f * dot_prod_real2; + hStereoDft->dot_prod_img_smooth[b2] = 0.5f * hStereoDft->dot_prod_img_smooth[b2] + 0.5f * dot_prod_img2; + pIpd[b2] = (float) atan2( hStereoDft->dot_prod_img_smooth[b2], hStereoDft->dot_prod_real_smooth[b2] ); + + ipd_smooth[b2] = stereo_dft_calc_mean_bipd( &pIpd[b2], hStereoDft->ipd_buf[b2] ); + + gain_IPD += ( sum_nrg_L2 + sum_nrg_R2 + 2 * dot_prod_real2 ) / sub_nrg_DMX2 / hStereoDft->gipd_band_max; + } + + sum_past_nrgL2 = EPSILON; + sum_past_nrgR2 = EPSILON; + sum_past_dpr2 = EPSILON; + sum_past_dpi2 = EPSILON; + if ( ( hStereoDft->band_res[k_offset] == STEREO_DFT_BAND_RES_HIGH && b2 < STEREO_DFT_NRG_PAST_MAX_BAND ) || + ( hStereoDft->band_res[k_offset] == STEREO_DFT_BAND_RES_LOW && b2 < 2 * STEREO_DFT_NRG_PAST_MAX_BAND_LB ) ) + { + hStereoDft->past_nrgL[b2 * STEREO_DFT_NRG_PAST_LEN + pos] = sum_nrg_L2; + hStereoDft->past_nrgR[b2 * STEREO_DFT_NRG_PAST_LEN + pos] = sum_nrg_R2; + hStereoDft->past_dot_prod_real[b2 * STEREO_DFT_NRG_PAST_LEN + pos] = dot_prod_real2; + hStereoDft->past_dot_prod_imag[b2 * STEREO_DFT_NRG_PAST_LEN + pos] = dot_prod_img2; + + for ( i = 0; i < STEREO_DFT_NRG_PAST_LEN; i++ ) + { + sum_past_nrgL2 += hStereoDft->past_nrgL[b2 * STEREO_DFT_NRG_PAST_LEN + i]; + sum_past_nrgR2 += hStereoDft->past_nrgR[b2 * STEREO_DFT_NRG_PAST_LEN + i]; + sum_past_dpr2 += hStereoDft->past_dot_prod_real[b2 * STEREO_DFT_NRG_PAST_LEN + i]; + sum_past_dpi2 += hStereoDft->past_dot_prod_imag[b2 * STEREO_DFT_NRG_PAST_LEN + i]; + } + + if ( hStereoDft->attackPresent ) + { + /* omit transient frames from past part of parameter estimation in following frames */ + int16_t prev_pos = ( pos + STEREO_DFT_NRG_PAST_LEN - 1 ) % STEREO_DFT_NRG_PAST_LEN; + hStereoDft->past_nrgL[b2 * STEREO_DFT_NRG_PAST_LEN + pos] = hStereoDft->past_nrgL[b2 * STEREO_DFT_NRG_PAST_LEN + prev_pos]; + hStereoDft->past_nrgR[b2 * STEREO_DFT_NRG_PAST_LEN + pos] = hStereoDft->past_nrgR[b2 * STEREO_DFT_NRG_PAST_LEN + prev_pos]; + hStereoDft->past_dot_prod_real[b2 * STEREO_DFT_NRG_PAST_LEN + pos] = hStereoDft->past_dot_prod_real[b2 * STEREO_DFT_NRG_PAST_LEN + prev_pos]; + hStereoDft->past_dot_prod_imag[b2 * STEREO_DFT_NRG_PAST_LEN + pos] = hStereoDft->past_dot_prod_imag[b2 * STEREO_DFT_NRG_PAST_LEN + prev_pos]; + } + + sum_past_dot_prod_abs2 = sqrtf( sum_past_dpr2 * sum_past_dpr2 + sum_past_dpi2 * sum_past_dpi2 ); + dot_prod_nrg_ratio[b2] = sum_past_dot_prod_abs2 / ( sum_past_nrgL2 + sum_past_nrgR2 + EPSILON ); + } + else + { + sum_past_nrgL2 += sum_nrg_L2; + sum_past_nrgR2 += sum_nrg_R2; + dot_prod_nrg_ratio[b2] = sqrtf( dot_prod_real2 * dot_prod_real2 + dot_prod_img2 * dot_prod_img2 ); + if ( b2 == 2 * STEREO_DFT_NRG_PAST_MAX_BAND_LB ) /* hStereoDft->band_res[k_offset] == 2 */ + { + dot_prod_nrg_ratio[b2] /= ( sum_nrg_L2 + sum_nrg_R2 + EPSILON ); + } + } + sum_nrg_L += sum_nrg_L2; + sum_nrg_R += sum_nrg_R2; + dot_prod_real += dot_prod_real2; + dot_prod_img += dot_prod_img2; + + sum_past_nrgL += sum_past_nrgL2; + sum_past_nrgR += sum_past_nrgR2; + sum_past_dpr += sum_past_dpr2; + sum_past_dpi += sum_past_dpi2; + + b2++; + } + sum_energy_L += sum_nrg_L; /* Energies of the individual Band for Left and Right */ + sum_energy_R += sum_nrg_R; + sum_dot_prod_real += dot_prod_real; + sum_dot_prod_img += dot_prod_img; + + /* compute side and residual gains over two frames */ + abs_L_R = sqrtf( dot_prod_real * dot_prod_real + dot_prod_img * dot_prod_img ); + + if ( hStereoDft->band_res[k_offset] == STEREO_DFT_BAND_RES_LOW && b < 4 ) + { + sum_past_dot_prod_abs = sqrtf( sum_past_dpr * sum_past_dpr + sum_past_dpi * sum_past_dpi ); + } + else if ( hStereoDft->band_res[k_offset] == STEREO_DFT_BAND_RES_HIGH && b < 9 ) + { + sum_past_dot_prod_abs = sum_past_dot_prod_abs2; + } + else + { + sum_past_dot_prod_abs = abs_L_R; + } + + c = sqrtf( sum_past_nrgL / sum_past_nrgR ); + sum_past_nrg_dmx = sum_past_nrgL + sum_past_nrgR + 2 * sum_past_dot_prod_abs; + sub_nrg_DMX[b] = sum_nrg_L + sum_nrg_R + 2 * abs_L_R; + + sub_nrg_L[b] = sum_nrg_L; + sub_nrg_R[b] = sum_nrg_R; + + if ( ( hStereoDft->res_pred_mode[k_offset] && b >= hStereoDft->res_pred_band_min ) || ( b < hStereoDft->res_cod_band_max ) ) + { + g = ( sum_past_nrgL - sum_past_nrgR ) / ( sum_past_nrg_dmx ); + pSideGain[b] = g; + } + else + { + g = 0.0f; /* to avoid compilation warning */ + pSideGain[b] = ( c - 1 ) / ( c + 1 ); + } + + if ( hStereoDft->res_pred_mode[k_offset] && b >= hStereoDft->res_pred_band_min && !( hStereoDft->attackPresent ) ) + { + /*(1-g)^2*L*L' + (1+g)^2*R*R' - 2(1-g^2)*abs(L*R')*/ + pPredGain[b] = max( 0, ( ( 1 - g ) * sum_past_nrgL + ( 1 + g ) * sum_past_nrgR - 2 * sum_past_dot_prod_abs ) ); + + /*Normalized with energy of DMX*/ + + /*Regularized gain computation by adding a coherent low energy contribution->avoid singularity for very low energy signals */ + + reg = ( hStereoDft->band_limits[b + 1] - hStereoDft->band_limits[b] ) * sqrtf( STEREO_DFT_N_32k_ENC ); + reg *= reg; + + pPredGain[b] = sqrtf( pPredGain[b] / ( reg + sum_past_nrg_dmx ) ); + + if ( hStereoDft->hItd->deltaItd[k_offset] != 0 ) + { + float gain_offset, conversion_factor; + int16_t dItd32; + + /* factor for converting deltaItd to 32kHz */ + conversion_factor = 1.f; + if ( hStereoDft->NFFT == STEREO_DFT_N_16k_ENC ) + { + conversion_factor = 2.f; + } + else if ( hStereoDft->NFFT == STEREO_DFT_N_MAX_ENC ) + { + conversion_factor = 2.f / 3; + } + dItd32 = (int16_t) floor( conversion_factor * hStereoDft->hItd->deltaItd[k_offset] + 0.5f ); + + gain_offset = stereo_dft_gain_offset( c, dItd32 ); + pPredGain[b] = max( 0, pPredGain[b] - gain_offset ); + } + + /*Limiter for active speech*/ + if ( sp_aud_decision0 == 0 && vad_flag ) + { + /*Avoid jump of residual prediction gain when ITD is changing*/ + if ( hStereoDft->hItd->deltaItd[k_offset] != hStereoDft->hItd->deltaItd[0] ) + { + pPredGain[b] = min( hStereoDft->res_pred_gain_f[b], pPredGain[b] ); + } + + /*Limiter*/ + hStereoDft->res_pred_gain_f[b] = 0.9f * hStereoDft->res_pred_gain_f[b] + 0.1f * pPredGain[b]; + pPredGain[b] = min( 1.1f * hStereoDft->res_pred_gain_f[b], pPredGain[b] ); + } + else + { + hStereoDft->res_pred_gain_f[b] = pPredGain[b]; + } + } + else + { + pPredGain[b] = 0.f; + } + + + if ( b2 == hStereoDft->gipd_band_max ) + { + ipd_mean_change = stereo_dft_calc_mean_ipd_change( pIpd, ipd_smooth, hStereoDft->gipd_band_max ); + hStereoDft->sum_dot_prod_real = ( 1.f - hStereoDft->sfm ) * hStereoDft->sum_dot_prod_real + hStereoDft->sfm * sum_dot_prod_real; + hStereoDft->sum_dot_prod_img = ( 1.f - hStereoDft->sfm ) * hStereoDft->sum_dot_prod_img + hStereoDft->sfm * sum_dot_prod_img; + + pgIpd[0] = (float) atan2( hStereoDft->sum_dot_prod_img, hStereoDft->sum_dot_prod_real ); + + stereo_dft_gipd_stabilization( &pgIpd[0], hStereoDft->prev_gipd, ipd_mean_change ); + hStereoDft->prev_gipd = pgIpd[0]; + } + } + + hStereoDft->nrg_past_pos = ( pos + 1 ) % STEREO_DFT_NRG_PAST_LEN; + + + /*------------------------------------------------------------------* + * Compute IPDs + *-----------------------------------------------------------------*/ + + stereo_dft_enc_get_nipd_flag( hStereoDft, sp_aud_decision0, gain_IPD ); + + + if ( flag_quant ) + { + if ( hStereoDft->no_ipd_flag == 0 ) + { + hStereoDft->sid_gipd = *pgIpd; + stereo_dft_quantize_ipd( pgIpd, pgIpd, &( hStereoDft->gipd_index ), STEREO_DFT_GIPD_NBITS ); + } + else + { + pgIpd[0] = 0; + } + } + diff_ipd = pgIpd[0] - pgIpd[-1]; + + if ( diff_ipd < -EVS_PI ) + { + pgIpd[0] += PI2; + } + else if ( diff_ipd > EVS_PI ) + { + pgIpd[0] -= PI2; + } + + if ( !hStereoDft->attackPresent ) + { + if ( hStereoDft->wasTransient ) + { + pgIpd[0] = 0.8f * pgIpd[0] + 0.2f * pgIpd[-1]; + } + else + { + pgIpd[0] = 0.5f * pgIpd[0] + 0.5f * pgIpd[-1]; + } + } + + c = sqrtf( sum_energy_L / sum_energy_R ); + g = fabsf( ( c - 1 ) / ( c + 1 ) ); + if ( g > 0.8f ) + { + g = max( 0.f, -10.f * g + 9.0f ); + for ( b = 0; b < hStereoDft->nbands; b++ ) + { + pPredGain[b] *= g; + } + } + + if ( hStereoDft->hConfig->band_res == STEREO_DFT_BAND_RES_LOW ) + { + hStereoDft->reverb_flag = 1; + } + else + { + stereo_dft_enc_get_reverb_flag( hStereoDft, pPredGain, sub_nrg_DMX, sub_nrg_L, sub_nrg_R, k_offset, bin_nrgL, bin_nrgR ); + } + + + /*------------------------------------------------------------------* + * Compute Side gains + *-----------------------------------------------------------------*/ + + for ( b = 0; b < hStereoDft->nbands; b++ ) + { + hStereoDft->sidSideGain[b] = *( pSideGain + b ); + + /* Quantization */ + if ( flag_quant ) + { + stereo_dft_quantize_res_gains( pSideGain + b, pPredGain + b, pSideGain + b, pPredGain + b, hStereoDft->side_gain_index_EC + b, hStereoDft->res_pred_index_EC + b ); + } + + + if ( !hStereoDft->attackPresent ) + { + if ( b < hStereoDft->res_cod_band_max ) + { + pSideGain[b] = dft_res_cod_alpha[b] * pSideGain[b] + ( 1 - dft_res_cod_alpha[b] ) * pSideGain[b - STEREO_DFT_BAND_MAX]; + } + } + } + + /*------------------------------------------------------------------* + * simulate prediction of parameters at the decoder + *-----------------------------------------------------------------*/ + + if ( hStereoDft->reverb_flag ) + { + int16_t ipred, bpred0, bpred1, max_dev, sum_abs_dev; + + ipred = 0; + max_dev = 0; + sum_abs_dev = 0; + + /* parameters for bred0 <= b < bpred1 are estimated from parameters of + the remaining bands with ptrans0 <= b < btrans1. */ + bpred1 = ( hStereoDft->nbands > 10 ) ? STEREO_DFT_RES_PRED_BAND_MAX - 2 : hStereoDft->nbands; + if ( hStereoDft->band_res[k_offset] == STEREO_DFT_BAND_RES_LOW ) + { + bpred1 = min( bpred1, 6 ); + } + bpred0 = bpred1 - STEREO_DFT_RES_PRED_BAND_MIN_CONST; + + /* get estimate (currently the maximal index) */ + for ( b = hStereoDft->res_pred_band_min; b < bpred0; b++ ) + { + ipred = max( ipred, hStereoDft->res_pred_index_EC[b] ); + } + + /* check prediction error */ + for ( b = bpred0; b < bpred1; b++ ) + { + max_dev = (int16_t) max( max_dev, abs( ipred - hStereoDft->res_pred_index_EC[b] ) ); + sum_abs_dev += (int16_t) abs( ipred - hStereoDft->res_pred_index_EC[b] ); + } + + hStereoDft->reverb_flag = ( max_dev <= 1 && sum_abs_dev <= 2 ); + + if ( hStereoDft->reverb_flag && hStereoDft->nbands > 10 ) /*SWB and FB*/ + { + for ( b = STEREO_DFT_RES_PRED_BAND_MAX - 1; b >= STEREO_DFT_RES_PRED_BAND_MAX - 2; b-- ) + { + hStereoDft->res_pred_index_EC[b - STEREO_DFT_RES_PRED_BAND_MIN_CONST] = hStereoDft->res_pred_index_EC[b]; + } + } + } + + assert( hStereoDft->nbands <= 13 ); /* always use band_limits_erb4 and not band_limits_erb2 */ + + return; +} + + +/*---------------------------------------------------------------------* + * side_gain_mode_decision() + * + * + *---------------------------------------------------------------------*/ + +static void side_gain_mode_decision( + STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i : DFT stereo encoder handle */ + int16_t encoded_ind_GR[], + const int16_t sp_aud_decision0, /* i : Speech/audio decision 0 */ + const int32_t last_core_brate /* i : Last core bitrate */ +) +{ + int16_t try_diff, nb_diff, no_GR_ord, n_bits, i; + + try_diff = sp_aud_decision0; + if ( try_diff ) + { + if ( hStereoDft->side_gain_counter == STEREO_DFT_FEC_THRESHOLD ) + { + try_diff = 0; + hStereoDft->side_gain_counter = 0; + } + } + else + { + hStereoDft->side_gain_counter = 0; + } + + /* If last frame SID/NO_DATA do not use differential coding */ + if ( last_core_brate <= SID_2k40 ) + { + try_diff = 0; + } + no_GR_ord = 3; + hStereoDft->side_gain_flag_2 = adapt_GR_ief( hStereoDft->side_gain_index_EC, hStereoDft->side_gain_index_ECDiff, hStereoDft->side_gain_index_ECprevious, + hStereoDft->nbands, NO_SYMB_GR_SIDE_G, &n_bits, encoded_ind_GR, dft_maps_sg, no_GR_ord, &nb_diff, + hStereoDft->side_gain_counter, &hStereoDft->side_gain_bitdiff_lp, try_diff ); + + + for ( i = 0; i < hStereoDft->nbands; i++ ) + { + hStereoDft->side_gain_index_ECprevious[i] = hStereoDft->side_gain_index_EC[i]; + } + + if ( n_bits > ( hStereoDft->nbands * STEREO_DFT_SIDE_GAIN_NBITS - 1 ) ) + { + /* use fixed rate */ + hStereoDft->side_gain_flag_1 = 3; + hStereoDft->side_gain_counter = 0; + } + else + { + if ( hStereoDft->side_gain_flag_2 >= no_GR_ord ) + { + hStereoDft->side_gain_flag_1 = 2; + hStereoDft->side_gain_counter += 1; + } + else + { + hStereoDft->side_gain_flag_1 = 0; + hStereoDft->side_gain_counter = 0; + } + } + + return; +} + + +/*---------------------------------------------------------------------* + * res_pred_gain_mode_decision() + * + * + *---------------------------------------------------------------------*/ + +static void res_pred_gain_mode_decision( + STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i : DFT stereo encoder handle */ + int16_t encoded_ind_pred_GR[], + const int16_t k_offset, /* i : Parameter offset */ + const int32_t last_core_brate /* i : Last core bitrate */ +) +{ + int16_t nb_diff, try_diff, no_GR_ord, i, n_bits; + int16_t nbands; + + /* Residual Prediction Gain */ + if ( hStereoDft->res_pred_mode[k_offset] ) + { + if ( hStereoDft->attackPresent == 0 ) + { + nbands = min( hStereoDft->nbands, STEREO_DFT_RES_PRED_BAND_MAX ); + + if ( hStereoDft->reverb_flag ) + { + nbands -= STEREO_DFT_RES_PRED_BAND_MIN_CONST; + } + + try_diff = 1; + if ( hStereoDft->res_pred_counter == STEREO_DFT_FEC_THRESHOLD ) + { + try_diff = 0; + hStereoDft->res_pred_counter = 0; + } + + /* If last frame SID/NO_DATA do not use differential coding */ + if ( last_core_brate <= SID_2k40 ) + { + try_diff = 0; + } + + no_GR_ord = 2; + + hStereoDft->res_pred_flag_2 = adapt_GR_rpg1_ief( &hStereoDft->res_pred_index_EC[hStereoDft->res_pred_band_min], &hStereoDft->res_pred_index_ECDiff[hStereoDft->res_pred_band_min], &hStereoDft->res_pred_index_ECprevious[hStereoDft->res_pred_band_min], nbands - hStereoDft->res_pred_band_min, NO_SYMB_GR_PRED_G, &n_bits, encoded_ind_pred_GR, dft_maps_rpg, &nb_diff, no_GR_ord, try_diff ); + + for ( i = 0; i < nbands; i++ ) + { + hStereoDft->res_pred_index_ECprevious[i] = hStereoDft->res_pred_index_EC[i]; + } + + for ( ; i < hStereoDft->nbands; i++ ) + { + hStereoDft->res_pred_index_ECprevious[i] = 0; + } + + if ( n_bits > ( nbands - hStereoDft->res_pred_band_min ) * STEREO_DFT_RES_GAINS_BITS - 1 ) + { + hStereoDft->res_pred_flag_1 = 3; + hStereoDft->res_pred_counter = 0; + } + else + { + if ( hStereoDft->res_pred_flag_2 > 1 ) + { + /* differential coding */ + hStereoDft->res_pred_flag_1 = 2; + hStereoDft->res_pred_counter += 1; + } + else + { + hStereoDft->res_pred_counter = 0; + hStereoDft->res_pred_flag_1 = 0; + } + } + } + else + { + set_s( hStereoDft->res_pred_index_ECprevious, 0, hStereoDft->nbands ); + } + } + else + { + set_s( hStereoDft->res_pred_index_ECprevious, 0, hStereoDft->nbands ); + } + + return; +} + + +/*------------------------------------------------------------------------- + * stereo_dft_calc_mean_bipd() + * + * Calculate mean of previous bandwise IPD values + *------------------------------------------------------------------------*/ + +static float stereo_dft_calc_mean_bipd( + float *pIpd, /* i : current bandwise IPD */ + float ipd_buf[STEREO_DFT_IPD_BUF_LEN] /* i/o: previous bandwise IPDs */ +) +{ + int16_t i; + float ipd_smooth; + float diff_to_last; + + assert( *pIpd <= EVS_PI && *pIpd >= -EVS_PI ); + + ipd_smooth = 0.f; + for ( i = 0; i < STEREO_DFT_IPD_BUF_LEN; i++ ) + { + if ( i == 0 ) + { + diff_to_last = ipd_buf[0]; + } + else + { + diff_to_last = fabsf( ipd_buf[i] - ipd_smooth ); + } + if ( diff_to_last > EVS_PI ) + { + if ( ipd_buf[i] > 0 ) + { + ipd_buf[i] -= 2 * EVS_PI; + } + else + { + ipd_buf[i] += 2 * EVS_PI; + } + } + ipd_smooth = ( i / (float) ( i + 1 ) ) * ipd_smooth + ( 1 / (float) ( i + 1 ) ) * ipd_buf[i]; + if ( ipd_smooth < -EVS_PI ) + { + ipd_smooth += 2 * EVS_PI; + } + else if ( ipd_smooth > EVS_PI ) + { + ipd_smooth -= 2 * EVS_PI; + } + } + + for ( i = 0; i < STEREO_DFT_IPD_BUF_LEN - 1; i++ ) + { + ipd_buf[i] = ipd_buf[i + 1]; + } + ipd_buf[STEREO_DFT_IPD_BUF_LEN - 1] = *pIpd; + + + return ipd_smooth; +} + + +/*------------------------------------------------------------------------- + * stereo_dft_calc_mean_ipd_change() + * + * Calculate mean IPD change over all bands + *------------------------------------------------------------------------*/ + +static float stereo_dft_calc_mean_ipd_change( + float *pIpd, /* i : bandwise IPDs */ + float *ipd_smooth, /* i : mean of previous bandwise IPDs */ + int16_t gipd_band_max /* i : number of IPD bands */ +) +{ + int16_t b; + float ipd_mean_change; + float ipd_change[STEREO_DFT_BAND_MAX]; + + ipd_mean_change = 0.f; + for ( b = 0; b < gipd_band_max; b++ ) + { + ipd_change[b] = fabsf( pIpd[b] - ipd_smooth[b] ); + if ( ipd_change[b] > EVS_PI ) + { + ipd_change[b] = 2 * EVS_PI - ipd_change[b]; + } + ipd_mean_change += ipd_change[b]; + } + ipd_mean_change /= gipd_band_max; + + + return ipd_mean_change; +} + + +/*------------------------------------------------------------------------- + * stereo_dft_gipd_stabilization() + * + * stabilize global IPD based on stability of bandwise IPDs + *------------------------------------------------------------------------*/ + +static void stereo_dft_gipd_stabilization( + float *pgIpd, /* i/o: global IPD to be stabilized */ + float prev_gipd, /* i : previous global IPD */ + float ipd_mean_change /* i : mean of previous bandwise IPDs */ +) +{ + float diff_gipd; + + if ( ipd_mean_change < 0.3f ) + { + *pgIpd = prev_gipd; + } + else + { + diff_gipd = fabsf( *pgIpd - prev_gipd ); + if ( diff_gipd > EVS_PI ) + { + diff_gipd = 2 * EVS_PI - diff_gipd; + } + if ( diff_gipd > ipd_mean_change ) + { + if ( *pgIpd > prev_gipd ) + { + if ( *pgIpd - prev_gipd < EVS_PI ) + { + *pgIpd = prev_gipd + ipd_mean_change; + } + else + { + *pgIpd = prev_gipd - ipd_mean_change; + if ( *pgIpd < -EVS_PI ) + { + *pgIpd += 2 * EVS_PI; + } + } + } + else + { + if ( prev_gipd - *pgIpd < EVS_PI ) + { + *pgIpd = prev_gipd - ipd_mean_change; + } + else + { + *pgIpd = prev_gipd + ipd_mean_change; + if ( *pgIpd > EVS_PI ) + { + *pgIpd -= 2 * EVS_PI; + } + } + } + } + } + return; +} + + +/*------------------------------------------------------------------------- + * stereo_dft_enc_get_nipd_flag() + * + * + *------------------------------------------------------------------------*/ + +static void stereo_dft_enc_get_nipd_flag( + STEREO_DFT_ENC_DATA_HANDLE hStereoDft, + const int16_t sp_aud_decision0, + const float gainIPD ) +{ + hStereoDft->gainIPD_sm = 0.5f * hStereoDft->gainIPD_sm + 0.5f * gainIPD; /* to decide on use of no IPD */ + + hStereoDft->no_ipd_flag = 0; /* Set flag initially to zero - subband IPD */ + + if ( hStereoDft->gainIPD_sm >= 0.75f || ( hStereoDft->prev_no_ipd_flag && ( sp_aud_decision0 || hStereoDft->voicing_lt > 0.98f ) ) ) + { + hStereoDft->no_ipd_flag = 1; /* Set the flag */ + } + + + /* hangover between the group IPD and subband IPD */ + if ( hStereoDft->prev_no_ipd_flag != hStereoDft->no_ipd_flag && hStereoDft->no_ipd_cnt < 5 ) + { + hStereoDft->no_ipd_flag = hStereoDft->prev_no_ipd_flag; + hStereoDft->no_ipd_cnt++; + } + else + { + hStereoDft->no_ipd_cnt = 0; + } + + hStereoDft->prev_no_ipd_flag = hStereoDft->no_ipd_flag; /* Save the no IPD flag for the next frame */ + + + return; +} + + +/*--------------------------------------------------------------- + * stereo_dft_enc_get_reverb_flag() + * + * + * ---------------------------------------------------------------*/ + +static void stereo_dft_enc_get_reverb_flag( + STEREO_DFT_ENC_DATA_HANDLE hStereoDft, + float *pPredGain, + float *sub_nrg_DMX, + const float *sub_nrg_L, + const float *sub_nrg_R, + const int16_t k_offset, + const float *bin_nrgL, + const float *bin_nrgR ) +{ + int16_t i, b, b1, index_min, nbands; + float nrg_DMX_min; + float norm_r, norm_l, norm_dmx; + float diff_l_l, diff_r_l, diff_l_h, diff_r_h; + float ener_l, ener_r, ener_dmx; + float nrg_DMX_max_avrg, nrg_DMX_min_avrg; + float fac; + + hStereoDft->reverb_flag = 0; + if ( hStereoDft->res_pred_mode[k_offset] && hStereoDft->hConfig->res_cod_mode == STEREO_DFT_RES_COD_OFF ) + { + diff_r_l = EPSILON; + diff_l_l = EPSILON; + diff_r_h = EPSILON; + diff_l_h = EPSILON; + + for ( b = 0; b <= min( hStereoDft->nbands, 6 ); b++ ) /* choose the subbands used for stereo filling */ + { + norm_dmx = ( ( hStereoDft->band_limits[b + 1] - hStereoDft->band_limits[b] ) / sub_nrg_DMX[b] ); + norm_l = ( ( hStereoDft->band_limits[b + 1] - hStereoDft->band_limits[b] ) / sub_nrg_L[b] ); + norm_r = ( ( hStereoDft->band_limits[b + 1] - hStereoDft->band_limits[b] ) / sub_nrg_R[b] ); + + for ( i = hStereoDft->band_limits[b]; i < hStereoDft->band_limits[b + 1]; i++ ) /* normalization on each subbands */ + { + ener_l = bin_nrgL[i]; + ener_r = bin_nrgR[i]; + ener_dmx = ( ener_l + ener_r + 2 * sqrtf( ener_l * ener_r ) ) * norm_dmx; /*approximation of nrg of DMX per line*/ + ener_l *= norm_l; + ener_r *= norm_r; + + diff_l_l += fabsf( ener_l - ener_dmx ); + diff_r_l += fabsf( ener_r - ener_dmx ); + } + } + if ( hStereoDft->nbands <= 10 ) + { + for ( ; b < min( hStereoDft->nbands, 10 ); b++ ) /* choose the subbands used for stereo filling */ + { + norm_dmx = ( ( hStereoDft->band_limits[b + 1] - hStereoDft->band_limits[b] ) / sub_nrg_DMX[b] ); + norm_l = ( ( hStereoDft->band_limits[b + 1] - hStereoDft->band_limits[b] ) / sub_nrg_L[b] ); + norm_r = ( ( hStereoDft->band_limits[b + 1] - hStereoDft->band_limits[b] ) / sub_nrg_R[b] ); + + for ( i = hStereoDft->band_limits[b]; i < hStereoDft->band_limits[b + 1]; i++ ) /* normalization on each subbands */ + { + ener_l = bin_nrgL[i]; + ener_r = bin_nrgR[i]; + ener_dmx = ( ener_l + ener_r + 2 * sqrtf( ener_l * ener_r ) ) * norm_dmx; /*approximation of nrg of DMX per line*/ + ener_l *= norm_l; + ener_r *= norm_r; + + diff_l_h += fabsf( ener_l - ener_dmx ); + diff_r_h += fabsf( ener_r - ener_dmx ); + } + } + } + + for ( b = 0; b < hStereoDft->nbands; b++ ) /* choose the subbands used for stereo filling */ + { + sub_nrg_DMX[b] /= ( hStereoDft->band_limits[b + 1] - hStereoDft->band_limits[b] ); + sub_nrg_DMX[b] = 0.6f * hStereoDft->pre_sub_nrg_DMX[b] + 0.4f * sub_nrg_DMX[b]; + hStereoDft->pre_sub_nrg_DMX[b] = sub_nrg_DMX[b]; + } + + /* adaptively select the subbands to predict based on the energy */ + nbands = ( hStereoDft->nbands > 10 ) ? ( hStereoDft->nbands - 2 ) : hStereoDft->nbands; + nrg_DMX_min_avrg = 0.0f; + for ( b = 2; b < STEREO_DFT_RES_PRED_BAND_MIN_RED; b++ ) + { + nrg_DMX_min = sub_nrg_DMX[b]; + index_min = b; + + for ( b1 = 2; b1 < nbands; b1++ ) + { + if ( nrg_DMX_min > sub_nrg_DMX[b1] ) + { + nrg_DMX_min = sub_nrg_DMX[b1]; + index_min = b1; + } + } + + nrg_DMX_min_avrg += nrg_DMX_min; + sub_nrg_DMX[index_min] = FLT_MAX; + } + + nrg_DMX_max_avrg = 0.0f; + for ( b = 2, b1 = STEREO_DFT_RES_PRED_BAND_MIN_RED; b < nbands; b++ ) + { + if ( sub_nrg_DMX[b] != FLT_MAX ) + { + nrg_DMX_max_avrg += sub_nrg_DMX[b]; + } + } + + if ( hStereoDft->nbands <= 10 ) /*WB*/ + { + if ( hStereoDft->res_pred_mode[0] == STEREO_DFT_RESPRED_OFF || hStereoDft->hConfig->res_cod_mode != STEREO_DFT_RES_COD_OFF ) + { + hStereoDft->diff_l_h_sm = diff_l_h; + hStereoDft->diff_r_h_sm = diff_r_h; + } + else + { + hStereoDft->diff_l_h_sm = 0.9f * hStereoDft->diff_l_h_sm + 0.1f * diff_l_h; + hStereoDft->diff_r_h_sm = 0.9f * hStereoDft->diff_r_h_sm + 0.1f * diff_r_h; + } + + if ( hStereoDft->diff_l_h_sm > 120.0f || hStereoDft->diff_r_h_sm > 120.0f ) + { + hStereoDft->reverb_flag = 1; + } + } + else /*SWB/FB*/ + { + if ( 3 * nrg_DMX_max_avrg > 64 * 5 * nrg_DMX_min_avrg ) + { + hStereoDft->reverb_flag = 1; + } + } + + /*Stereo Filling gain damping*/ + fac = ( ( diff_l_l > diff_r_l ) ? diff_r_l / diff_l_l : diff_l_l / diff_r_l ); + fac = fac > 0.25f ? 1.0f : 4.f * fac; + fac = 0.98f * hStereoDft->prev_fac2 + 0.02f * fac; + hStereoDft->prev_fac2 = fac; + + for ( b = 0; b < hStereoDft->nbands; b++ ) + { + if ( b < 5 ) + { + pPredGain[b] *= max( 0.5f, fac ); + } + else + { + pPredGain[b] *= min( 1.0f, max( 0.75f, 0.5f + fac ) ); + } + } + } + + + return; +} + +/*--------------------------------------------------------------- + * stereo_dft_gain_offset() + * + * c = gain between L and R, itd = itd in samples @ 32kHz + * ---------------------------------------------------------------*/ + +static float stereo_dft_gain_offset( + const float c, + const int16_t itd ) +{ + float wnt, go, alpha; + int16_t tau, k0; + + tau = (int16_t) min( abs( itd ), 160 ); + /* Wn_table contains every 8th sample of the window's cross-correlation + * function @ 32kHz from which the values are interpolated: */ + k0 = tau >> 3; + alpha = ( tau & 7 ) / 8.f; + wnt = ( 1 - alpha ) * Wn_table[k0] + alpha * Wn_table[k0 + 1]; + + go = sqrtf( 8 * c * c / ( ( 1 + c ) * ( 1 + c ) ) * ( 1 - wnt ) / ( 1 + c * c + 2 * c * wnt ) ); + + return go; +} + +/*--------------------------------------------------------------- + * stereo_dft_enc_calculate_nrg_for_icbwe() + * + * calculate energy of downmix and left and right channel in the + * SHB region for later use in ICBWE + * ---------------------------------------------------------------*/ + +static void stereo_dft_enc_calculate_nrg_for_icbwe( + STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i/o: encoder DFT stereo handle */ + const float *DMX, /* i : DFT Stereo downmix */ + const int32_t input_Fs /* i : input sampling rate */ +) +{ + float *pDFT_L, *pDFT_R, bandResDft; + int16_t i, shbBins[3]; + + bandResDft = ( (float) input_Fs ) / hStereoDft->NFFT; + shbBins[0] = (int16_t) ( 6400 / bandResDft ); + shbBins[1] = (int16_t) ( 10400 / bandResDft ); + shbBins[2] = (int16_t) ( 14400 / bandResDft ); + assert( shbBins[1] <= hStereoDft->NFFT / 2 ); + + set_f( hStereoDft->nrg_L, EPSILON, 2 ); + set_f( hStereoDft->nrg_R, EPSILON, 2 ); + set_f( hStereoDft->nrg_DMX, EPSILON, 2 ); + + pDFT_L = hStereoDft->DFT[0]; + pDFT_R = hStereoDft->DFT[1]; + + for ( i = shbBins[0]; i < shbBins[1]; i++ ) + { + hStereoDft->nrg_L[0] += pDFT_L[2 * i] * pDFT_L[2 * i] + pDFT_L[2 * i + 1] * pDFT_L[2 * i + 1]; + hStereoDft->nrg_R[0] += pDFT_R[2 * i] * pDFT_R[2 * i] + pDFT_R[2 * i + 1] * pDFT_R[2 * i + 1]; + hStereoDft->nrg_DMX[0] += DMX[2 * i] * DMX[2 * i] + DMX[2 * i + 1] * DMX[2 * i + 1]; + } + for ( ; i < shbBins[2]; i++ ) + { + hStereoDft->nrg_L[1] += pDFT_L[2 * i] * pDFT_L[2 * i] + pDFT_L[2 * i + 1] * pDFT_L[2 * i + 1]; + hStereoDft->nrg_R[1] += pDFT_R[2 * i] * pDFT_R[2 * i] + pDFT_R[2 * i + 1] * pDFT_R[2 * i + 1]; + hStereoDft->nrg_DMX[1] += DMX[2 * i] * DMX[2 * i] + DMX[2 * i + 1] * DMX[2 * i + 1]; + } + + return; +} diff --git a/lib_enc/ivas_stereo_dft_enc_itd.c b/lib_enc/ivas_stereo_dft_enc_itd.c new file mode 100644 index 0000000000000000000000000000000000000000..3d0fe1465427084c5174947b4584833d43deff9e --- /dev/null +++ b/lib_enc/ivas_stereo_dft_enc_itd.c @@ -0,0 +1,1343 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include "options.h" +#include +#include "cnst.h" +#include "rom_enc.h" +#include "rom_com.h" +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_cnst.h" +#include "ivas_rom_com.h" +#include "ivas_rom_enc.h" +#include "wmc_auto.h" + + +/*------------------------------------------------------------------------- + * Local constants + *------------------------------------------------------------------------*/ + +#define LP_GCC_PHAT_UP 0.9f /* LP filter coefficient, going up */ +#define LP_GCC_PHAT_DOWN 0.1f /* LP filter coefficient, going down */ +#define ITD_CNT_MAX 2 /* Minimum number of consecutive ITD estimates for ITD hangover */ +#define ITD_HO_GCC_PHAT_MAX 0.6f /* LP GCC PHAT value which gives zero hangover */ +#define ITD_HO_GCC_PHAT_MIN 0.3f /* LP GCC PHAT value which gives ITD_HO_MAX ITD hangover frames */ +#define ITD_HO_MAX 6 /* Maximum number of ITD hangover frames */ +#define ITD_HO_GCC_PHAT_INCL ( -( ITD_HO_MAX - 1 ) / ( ITD_HO_GCC_PHAT_MAX - ITD_HO_GCC_PHAT_MIN ) ) +#define ITD_HO_GCC_PHAT_OFFS ( -ITD_HO_GCC_PHAT_INCL * ITD_HO_GCC_PHAT_MAX + 1 ) +#define SFM_PROD_GRP 4 /*maximum grouping of products for calculating SFM in ITD estimation*/ +#define B_DENOM 0.083333333333333f +#define L_SAMPLES 20 +#define SUBDIV ( 2 * STEREO_DFT_ITD_MAX_ANA / L_SAMPLES ) +#define DENOM 0.05f + +#define XSPEC_ALPHA ( 1.f / 32 ) +#define CORR_FILT 0.8f +#define CORR_RESET_FRAMES_MAX 20 + +#define ITD_VAD_NOISE_INIT_FRAMES 30 +#define ITD_VAD_THRSHOLD 0.001f +#define ITD_VAD_MS_SNR_UPDATE_THRESH 15.0f +#define HIGHT_SNR_VOICE_TH 10000.0f +#define MAX_ITD_VAD_HANGOVER 10 + +#define XCORR_LB_NUM_BANDS 3 +#define XCORR_LB_BAND_WIDTH 8 + +#define ITD_MAX_MDCT 80 + + +/*------------------------------------------------------------------------- + * set_band_limits() + * + * configure bands as used in DFT Stereo + *------------------------------------------------------------------------*/ + +static void set_band_limits( + int16_t *nbands, + int16_t band_limits[STEREO_DFT_BAND_MAX + 1], + int16_t NFFT ) +{ + band_limits[0] = 1; + *nbands = 0; + while ( band_limits[( *nbands )++] < NFFT / 2 ) + { + band_limits[*nbands] = (int16_t) round_f( dft_band_limits_erb4[*nbands] * ( (float) ( STEREO_DFT_N_NS_ENC ) / STEREO_DFT_N_NS ) ); + } + ( *nbands )--; + band_limits[*nbands] = NFFT / 2; /*Nyquist Freq*/ + + return; +} + + +/*------------------------------------------------------------------------- + * stereo_dft_hybrid_ITD_flag() + * + * Get the hybrid ITD flag + *------------------------------------------------------------------------*/ + +void stereo_dft_hybrid_ITD_flag( + STEREO_DFT_CONFIG_DATA_HANDLE hConfig, /* o : DFT stereo configuration */ + const int32_t input_Fs, /* i : CPE element sampling rate */ + const int16_t hybrid_itd_max /* i : flag for hybrid ITD for very large ITDs */ +) +{ + if ( hConfig != NULL ) + { + if ( hConfig->res_cod_mode || ( hConfig->ada_wb_res_cod_mode && input_Fs == 16000 ) || ( hybrid_itd_max == 1 ) ) + { + hConfig->hybrid_itd_flag = 1; + } + else + { + hConfig->hybrid_itd_flag = 0; + } + } + else + { + assert( 0 && "Stereo Dft Config Data Handle is uninitialized" ); + } + + return; +} + + +/*------------------------------------------------------------------------- + * stereo_dft_quantize_itd() + * + * Quantize the ITD + *------------------------------------------------------------------------*/ + +static void stereo_dft_quantize_itd( + const int16_t in, + float *out, + const int32_t input_Fs, + int16_t *ind ) +{ + int16_t itd; + + itd = (int16_t) ( sign( in ) * 0.5f + in ); + + /*Limit ITD*/ + if ( ( ABSVAL( itd ) > STEREO_DFT_ITD_MAX ) || ( ABSVAL( itd ) < STEREO_DFT_ITD_MIN ) ) + { + itd = 0; + } + else + { + *ind = ( ( itd < 0 ) << ( STEREO_DFT_ITD_NBITS - 1 ) ) + ABSVAL( itd ) - STEREO_DFT_ITD_MIN; + } + + /*Convert back @ fs*/ + *out = (float) ( itd * input_Fs ) / ( (float) ( STEREO_DFT_ITD_FS ) ); + + return; +} + + +/*------------------------------------------------------------------------- + * itd_vad_ms_snr_calc() + * + * + *-------------------------------------------------------------------------*/ + +static float itd_vad_ms_snr_calc( + float E_band_n[STEREO_DFT_ITD_VAD_BAND_NUM], + float *Spd, + float *E_band ) +{ + float snr[STEREO_DFT_ITD_VAD_BAND_NUM]; + float msnr[STEREO_DFT_ITD_VAD_BAND_NUM]; + float ms_snr; + int16_t i, j; + + for ( i = 0; i < STEREO_DFT_ITD_VAD_BAND_NUM; i++ ) + { + E_band[i] = 0; + for ( j = itd_vad_band_tbl[i]; j < itd_vad_band_tbl[i + 1]; j++ ) + { + E_band[i] += Spd[j]; + } + E_band[i] = E_band[i] / ( itd_vad_band_tbl[i + 1] - itd_vad_band_tbl[i] ); + } + + ms_snr = 0; + for ( i = 0; i < STEREO_DFT_ITD_VAD_BAND_NUM; i++ ) + { + snr[i] = E_band[i] / E_band_n[i]; + if ( snr[i] < 1 ) + { + snr[i] = 1; + } + msnr[i] = snr[i] - 1.0f; + if ( msnr[i] < 6 ) + { + msnr[i] = powf( msnr[i], 2 ) / 6.0f; + } + ms_snr += msnr[i]; + } + + return ( ms_snr ); +} + + +/*------------------------------------------------------------------------- + * itd_vad_background_update() + * + * + *-------------------------------------------------------------------------*/ + +static void itd_vad_background_update( + float E_band_n[STEREO_DFT_ITD_VAD_BAND_NUM], + int16_t *vad_frm_cnt, + const float ms_snr, + float *E_band ) +{ + int16_t i; + float energy; + + energy = 0.0f; + for ( i = 0; i < STEREO_DFT_ITD_VAD_BAND_NUM; i++ ) + { + energy += E_band[i] / (float) STEREO_DFT_ITD_VAD_BAND_NUM; + } + + if ( *vad_frm_cnt < ITD_VAD_NOISE_INIT_FRAMES ) + { + ( *vad_frm_cnt )++; + } + + if ( ( *vad_frm_cnt < ITD_VAD_NOISE_INIT_FRAMES ) && energy < 40000000 ) + { + for ( i = 0; i < STEREO_DFT_ITD_VAD_BAND_NUM; i++ ) + { + /* using the init values as frame (-1) values */ + E_band_n[i] = ( E_band_n[i] * ( (float) ( *vad_frm_cnt ) ) + E_band[i] ) / ( (float) ( *vad_frm_cnt + 1 ) ); + } + } + else + { + if ( ms_snr < ITD_VAD_MS_SNR_UPDATE_THRESH ) + { + for ( i = 0; i < STEREO_DFT_ITD_VAD_BAND_NUM; i++ ) + { + E_band_n[i] = 0.96f * E_band_n[i] + 0.04f * E_band[i]; + if ( E_band_n[i] < 1.0f ) + { + E_band_n[i] = 1.0f; + } + } + } + } + + return; +} + +/*------------------------------------------------------------------------- + * stereo_dft_enc_itd_vad() + * + * + *-------------------------------------------------------------------------*/ + +static int16_t stereo_dft_enc_itd_vad( + float E_band_n[STEREO_DFT_ITD_VAD_BAND_NUM], + int16_t *vad_frm_cnt, + float *Spd_L, + float *Spd_R, + float *mssnr ) +{ + int16_t i; + float E_band[STEREO_DFT_ITD_VAD_BAND_NUM]; + int16_t vad_flag_itd; + + float Spd[STEREO_DFT_N_16k_ENC / 2 + 1]; + + for ( i = 0; i <= STEREO_DFT_N_16k_ENC / 2; i++ ) + { + Spd[i] = 0.5f * ( Spd_L[i] + Spd_R[i] ); + } + + *mssnr = itd_vad_ms_snr_calc( E_band_n, Spd, E_band ); + + itd_vad_background_update( E_band_n, vad_frm_cnt, *mssnr, E_band ); + + if ( *mssnr < ITD_VAD_THRSHOLD ) + { + vad_flag_itd = 0; + } + else + { + vad_flag_itd = 1; + } + + return ( vad_flag_itd ); +} + + +/*------------------------------------------------------------------------- + * calc_mean_E_ratio() + * + * calculates mean energy of main-to-background signal ratio + *-------------------------------------------------------------------------*/ + +static float calc_mean_E_ratio( + ITD_DATA_HANDLE hItd, + int16_t nbands, + int16_t band_limits[], + const float sfm, + const float nrg_L[STEREO_DFT_N_32k_ENC / 2], + const float nrg_R[STEREO_DFT_N_32k_ENC / 2], + float *total_mEr ) +{ + float sum_xcorr[2]; + float Sxcorr; + float Er[STEREO_DFT_BAND_MAX], fi[STEREO_DFT_BAND_MAX], a, acorr; + float sum_nrg_L, sum_nrg_R; + int16_t b, i; + float sum_Er; + float total_fi; + float grand_nrg_L, grand_nrg_R, grand_sum_xcorr_real, grand_sum_xcorr_img; + + grand_nrg_L = 0.0f; + grand_nrg_R = 0.0f; + grand_sum_xcorr_real = 0.0f; + grand_sum_xcorr_img = 0.0f; + + /*take bands up to 32kHz bandwidth as ITD is always calculated at 32kHz sampling rate*/ + nbands -= ( band_limits[nbands] > STEREO_DFT_N_32k_ENC / 2 ); + + sum_Er = 0; + for ( b = 0; b < nbands; b++ ) + { + /*reset buffers*/ + sum_xcorr[0] = 0.f; + sum_xcorr[1] = 0.f; + sum_nrg_L = 0.f; + sum_nrg_R = 0.f; + + for ( i = band_limits[b]; i < min( band_limits[b + 1], STEREO_DFT_N_32k_ENC / 2 ); i++ ) + { + sum_xcorr[0] += hItd->xcorr_smooth[2 * i]; + sum_xcorr[1] += hItd->xcorr_smooth[2 * i + 1]; + sum_nrg_L += nrg_L[i]; + sum_nrg_R += nrg_R[i]; + } + + Sxcorr = sum_xcorr[0] * sum_xcorr[0] + sum_xcorr[1] * sum_xcorr[1]; + hItd->acorr_L[b] = ( 1.f - sfm ) * hItd->acorr_L[b] + sfm * sum_nrg_L; + hItd->acorr_R[b] = ( 1.f - sfm ) * hItd->acorr_R[b] + sfm * sum_nrg_R; + + a = hItd->acorr_L[b] - hItd->acorr_R[b]; + acorr = hItd->acorr_L[b] + hItd->acorr_R[b]; + fi[b] = sqrtf( a * a + 4 * Sxcorr ); + Er[b] = ( acorr + fi[b] ) / ( acorr - fi[b] + EPSILON ); + sum_Er += Er[b]; + + grand_nrg_L += sum_nrg_L; + grand_nrg_R += sum_nrg_R; + grand_sum_xcorr_real += sum_xcorr[0]; + grand_sum_xcorr_img += sum_xcorr[1]; + } + + Sxcorr = grand_sum_xcorr_real * grand_sum_xcorr_real + grand_sum_xcorr_img * grand_sum_xcorr_img; + a = grand_nrg_L - grand_nrg_R; + acorr = grand_nrg_L + grand_nrg_R; + total_fi = sqrtf( a * a + 4 * Sxcorr ); + *total_mEr = ( acorr + total_fi ) / ( acorr - total_fi + EPSILON ); + + return ( sum_Er * B_DENOM ); +} + + +/*------------------------------------------------------------------------- + * resetEstimates() + * + * resets long term estimates to initial values. + *-------------------------------------------------------------------------*/ + +static void resetEstimates( + ITD_DATA_HANDLE hItd ) +{ + set_zero( hItd->xcorr_smooth, STEREO_DFT_N_32k_ENC ); + set_zero( hItd->acorr_L, STEREO_DFT_BAND_MAX ); + set_zero( hItd->acorr_R, STEREO_DFT_BAND_MAX ); + hItd->cohSNR = 15; + + return; +} + +/*------------------------------------------------------------------------- + * td_sm_filter() + * + * time-domain smoothing filter for smoothing the cross-correlation vector + *-------------------------------------------------------------------------*/ + +static void td_sm_filter( + float *x, + float *y, + const int16_t L ) +{ + int16_t i; + float tmp_x[STEREO_DFT_N_32k_ENC + 1]; + float a0, a1; + + set_f( tmp_x, 0, STEREO_DFT_N_32k_ENC + 1 ); + mvr2r( x, tmp_x, L ); + + a0 = 0.5f; + a1 = 0.25f; + + y[0] = a0 * tmp_x[0] + a1 * x[1]; + for ( i = 1; i < L; i++ ) + { + y[i] = a1 * tmp_x[i + 1] + a0 * tmp_x[i] + a1 * tmp_x[i - 1]; + } + + return; +} + +/*------------------------------------------------------------------------- + * peak_detect() + * + * function for calculating the threshold for peak detection of the + * cross-correlation vector + *-------------------------------------------------------------------------*/ + +static float peak_detect( + float *xcorr_itd, + float *max_max, + int16_t *index, + int16_t *zero_itd_flag, + const float snr, + const int16_t vad, + float *second_max, + int16_t *second_max_lag, + const float prev_itd, + const int16_t flag_noisy_speech_snr, + const int16_t detected_itd_flag, + float *prev_max, + int16_t *prev_index, + float *prev_avg_max, + float *total_max ) +{ + int16_t i; + float tmp_max[SUBDIV], tmp_xcorr_itd[2 * STEREO_DFT_ITD_MAX_ANA + 1], tmp_xcorr_itd_sm[2 * STEREO_DFT_ITD_MAX_ANA + 1]; + int16_t index_subd[SUBDIV], ind; + float avg_max, max_low, max_high, sum_max, tmp_max_max; + float thres_diff; + float wfac; + int16_t d, i1, i2; + + wfac = 2.5f; + if ( snr > 50.f ) + { + wfac = 3.f; + } + + /*detect maxima outside the [-5, 5] ms boundaries */ + maximum( xcorr_itd, STEREO_DFT_N_32k_ENC / 2 - STEREO_DFT_ITD_MAX_ANA, &max_low ); + maximum( xcorr_itd + STEREO_DFT_N_32k_ENC / 2 + STEREO_DFT_ITD_MAX_ANA + 1, STEREO_DFT_N_32k_ENC / 2 - STEREO_DFT_ITD_MAX_ANA - 1, &max_high ); + + /* create temp buffer that includes xcorr within [-5, 5] ms */ + mvr2r( xcorr_itd + STEREO_DFT_N_32k_ENC / 2 - STEREO_DFT_ITD_MAX_ANA, tmp_xcorr_itd, 2 * STEREO_DFT_ITD_MAX_ANA + 1 ); + + *index = maximumAbs( tmp_xcorr_itd, 2 * STEREO_DFT_ITD_MAX_ANA + 1, max_max ); + *total_max = *max_max; + + d = max( 2, (int16_t) round_f( fabsf( prev_itd ) / 16.f ) ); + i1 = max( 0, (int16_t) prev_itd + STEREO_DFT_ITD_MAX_ANA - d ); + i2 = min( 2 * STEREO_DFT_ITD_MAX_ANA, (int16_t) prev_itd + STEREO_DFT_ITD_MAX_ANA + d ); + *second_max_lag = maximumAbs( tmp_xcorr_itd + i1, i2 - i1 + 1, second_max ); + *second_max_lag += i1; + + + /*if maximum is out of boundaries signal zero itd OR maximum value is negative*/ + *zero_itd_flag = ( *max_max < max_low || *max_max < max_high ); + + if ( *zero_itd_flag ) + { + return 0; + } + else + { + sum_max = 0; + + if ( snr >= 25.f ) + { + /*apply smoothing filter*/ + td_sm_filter( tmp_xcorr_itd, tmp_xcorr_itd_sm, 2 * STEREO_DFT_ITD_MAX_ANA + 1 ); + + /*subdivide the area of interest and look for local maxima*/ + for ( i = 0; i < SUBDIV - 1; i++ ) + { + index_subd[i] = maximumAbs( &tmp_xcorr_itd_sm[i * L_SAMPLES], L_SAMPLES, &tmp_max[i] ); + sum_max += tmp_max[i]; + } + + index_subd[i] = maximumAbs( &tmp_xcorr_itd_sm[i * L_SAMPLES], L_SAMPLES + 1, &tmp_max[i] ); + sum_max += tmp_max[i]; + + ind = maximumAbs( tmp_max, SUBDIV, &tmp_max_max ); + + /*final position of maxmimum*/ + *index = index_subd[ind] + ind * L_SAMPLES; + *max_max = tmp_max_max; + /*calculate average of all maxima to determine the threshold*/ + avg_max = sum_max * DENOM; + + d = max( 2, (int16_t) round_f( fabsf( prev_itd ) / 16.f ) ); + i1 = max( 0, (int16_t) prev_itd + STEREO_DFT_ITD_MAX_ANA - d ); + i2 = min( 2 * STEREO_DFT_ITD_MAX_ANA, (int16_t) prev_itd + STEREO_DFT_ITD_MAX_ANA + d ); + *second_max_lag = maximumAbs( tmp_xcorr_itd_sm + i1, i2 - i1 + 1, second_max ); + *second_max_lag += i1; + } + else + { + /*determine weight for threshold depending on snr value*/ + if ( snr <= 20.f && snr > 15.f ) + { + wfac = snr * 0.1f + 0.5f; + } + else + { + wfac = 2.5f; + } + + for ( i = 0; i < SUBDIV - 1; i++ ) + { + index_subd[i] = maximumAbs( &tmp_xcorr_itd[i * L_SAMPLES], L_SAMPLES, &tmp_max[i] ); + sum_max += tmp_max[i]; + } + + index_subd[i] = maximumAbs( &tmp_xcorr_itd[i * L_SAMPLES], L_SAMPLES + 1, &tmp_max[i] ); + sum_max += tmp_max[i]; + + /*calculate average of all maxima to determine the threshold*/ + avg_max = sum_max * DENOM; + } + + /*relax threshold if threshold is very close to max: when 7 0.f && ( ( thres_diff < 0.05f && ( snr <= 15 && snr > 7.f ) ) || ( thres_diff < 0.01f && ( snr > 15.f && snr < 30.f ) ) ) ) + { + wfac = 2.0f; + } + + if ( flag_noisy_speech_snr == 1 ) + { + if ( vad == 0 ) + { + wfac = 2.5f; + } + else if ( detected_itd_flag == 0 && *max_max > 1.5f * avg_max && *prev_max > 1.5f * *prev_avg_max && abs( *index - *prev_index ) <= 2 ) + { + wfac = 1.5f; + } + else + { + wfac = 2.0f; + } + } + *prev_max = *max_max; + *prev_avg_max = avg_max; + *prev_index = *index; + + return ( wfac * avg_max ); + } +} + + +/*------------------------------------------------------------------------- + * Compute stereo parameter: ITD + * ITD: Interchannel Time Difference + *------------------------------------------------------------------------*/ + +void stereo_dft_enc_compute_itd( + CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ + float *DFT_L, + float *DFT_R, + const int16_t k_offset, + const int16_t input_frame, + const int16_t vad_flag_dtx[], + const int16_t vad_hover_flag[], + float *bin_nrgL, + float *bin_nrgR ) +{ + int16_t i, j; + STEREO_DFT_ENC_DATA_HANDLE hStereoDft; + ITD_DATA_HANDLE hItd; + float *pDFT_L, *pDFT_R; + float abs_L, abs_R, prod_L, prod_R, sum_abs_L, sum_abs_R; + float log_prod_L, log_prod_R; + float sum_nrg_L, sum_nrg_R; + float sfm_L, sfm_R; + float xcorr[STEREO_DFT_N_32k_ENC]; + int16_t itd, itd_td; + float xcorr_itd[STEREO_DFT_N_32k_ENC]; + float tmpf1, tmpf2, tmpf3; + float thres, alpha; + int16_t index; + float xcorr_max, sum_nrg_L_lb, par_L[XCORR_LB_NUM_BANDS], par_L_avrg, sum_nrg_L_tmp; + float xcorr_lb[STEREO_DFT_XCORR_LB_MAX]; + float num_cor, den_cor_cur, den_cor_prev, cor_lb_avrg; + float cor_lb[XCORR_LB_NUM_BANDS]; + float Spd_L[STEREO_DFT_N_32k_ENC / 2 + 1]; + float Spd_R[STEREO_DFT_N_32k_ENC / 2 + 1]; + int16_t vad_flag_itd; + float mssnr; + int16_t itd_cal_flag; + int16_t NFFT, NFFT_mid; + int16_t zero_itd; + float mEr; + float cohSNR; + float *pNrgL, *pNrgR; + float second_max; + int16_t second_max_lag; + int16_t fc_condition_1, fc_condition_2, fc_condition_3, fc_condition_4, fc_condition_5, fc_condition_6_a, fc_condition_6_b, fc_condition_6_c; + int16_t fc_condition_1234; + int16_t split, shift, flag_noisy_speech_snr; + float gcc_phat[2 * XTALK_PHAT_LEN + 1]; + float grand_dot_prod_real, grand_dot_prod_img; + float xcorr_abs[STEREO_DFT_N_32k_ENC], sum_xcorr, prod_LL, prod_RR, total_mEr, total_max; + STEREO_CLASSIF_HANDLE hStereoClassif; + const float *dft_trigo32k; + float trigo_enc[STEREO_DFT_N_32k_ENC / 2 + 1]; + + float cng_xcorr_filt; + + int16_t prev_itd_max; + int16_t itd_max_flip; + + if ( hCPE->element_mode == IVAS_CPE_DFT ) + { + hStereoDft = hCPE->hStereoDft; + hItd = hCPE->hStereoDft->hItd; + NFFT = min( STEREO_DFT_N_32k_ENC, hStereoDft->NFFT ); + dft_trigo32k = hStereoDft->dft_trigo_32k; + } + else + { + hStereoDft = NULL; + hItd = hCPE->hStereoMdct->hItd; + NFFT = min( STEREO_DFT_N_32k_ENC, hCPE->hStereoMdct->hDft_ana->NFFT ); + dft_trigo32k = hCPE->hStereoMdct->hDft_ana->dft_trigo_32k; + } + hStereoClassif = hCPE->hStereoClassif; + + for ( i = 0; i < STEREO_DFT_N_32k_ENC / 4; i++ ) + { + trigo_enc[i] = dft_trigo32k[i]; + trigo_enc[STEREO_DFT_N_32k_ENC / 2 - i] = dft_trigo32k[i]; + } + trigo_enc[STEREO_DFT_N_32k_ENC / 4] = dft_trigo32k[STEREO_DFT_N_32k_ENC / 4]; + + flag_noisy_speech_snr = hCPE->hCoreCoder[0]->flag_noisy_speech_snr; /* flag from the previous frame */ + + /* initializations to avoid compilation warnings */ + sum_nrg_L = 0.0f; + sum_nrg_R = 0.0f; + sum_nrg_L_lb = 0.0f; + mssnr = 0.0f; + sfm_L = 0.0f; + + + NFFT_mid = (int16_t) ( ( min( STEREO_DFT_N_16k_ENC, NFFT ) ) * 0.5f ); + + pDFT_L = DFT_L; + pDFT_R = DFT_R; + pNrgL = bin_nrgL; + pNrgR = bin_nrgR; + xcorr[0] = 0.f; + xcorr[1] = 0.f; + log_prod_L = logf( max( FLT_MIN, ABSVAL( pDFT_L[0] ) ) ); + log_prod_R = logf( max( FLT_MIN, ABSVAL( pDFT_R[0] ) ) ); + prod_L = 1.0f; + prod_R = 1.0f; + sum_nrg_L = pDFT_L[0] * pDFT_L[0] + FLT_MIN; + sum_nrg_R = pDFT_R[0] * pDFT_R[0] + FLT_MIN; + sum_abs_L = ABSVAL( pDFT_L[0] ) + EPSILON; + sum_abs_R = ABSVAL( pDFT_R[0] ) + EPSILON; + xcorr_lb[0] = pDFT_L[0] * pDFT_L[0] + EPSILON; + sum_nrg_L_lb = xcorr_lb[0]; + prod_LL = 1.0f; + prod_RR = 1.0f; + grand_dot_prod_real = EPSILON; + grand_dot_prod_img = EPSILON; + + for ( i = 1, j = 0; i < NFFT_mid; i++, j++ ) + { + xcorr[2 * i] = pDFT_L[2 * i] * pDFT_R[2 * i] + pDFT_L[2 * i + 1] * pDFT_R[2 * i + 1]; + xcorr[2 * i + 1] = pDFT_L[2 * i + 1] * pDFT_R[2 * i] - pDFT_L[2 * i] * pDFT_R[2 * i + 1]; + + pNrgL[i] = pDFT_L[2 * i] * pDFT_L[2 * i] + pDFT_L[2 * i + 1] * pDFT_L[2 * i + 1]; + pNrgR[i] = pDFT_R[2 * i] * pDFT_R[2 * i] + pDFT_R[2 * i + 1] * pDFT_R[2 * i + 1]; + + Spd_L[i] = pNrgL[i]; + Spd_R[i] = pNrgR[i]; + + abs_L = sqrtf( pNrgL[i] ); + abs_R = sqrtf( pNrgR[i] ); + + sum_nrg_L += pNrgL[i]; + sum_nrg_R += pNrgR[i]; + + sum_abs_L += abs_L; + sum_abs_R += abs_R; + prod_L *= abs_L; + prod_R *= abs_R; + + grand_dot_prod_real += xcorr[2 * i]; + grand_dot_prod_img += xcorr[2 * i + 1]; + xcorr_abs[i] = sqrtf( xcorr[2 * i] * xcorr[2 * i] + xcorr[2 * i + 1] * xcorr[2 * i + 1] ); + /* VM: prod_LL tends to overflow, better to replace with sum(log(prod_L)) and retrain the classifier */ + prod_LL = prod_L; + prod_RR = prod_R; + + if ( j == SFM_PROD_GRP || i == NFFT_mid - 1 ) + { + prod_L = max( FLT_MIN, prod_L ); + prod_R = max( FLT_MIN, prod_R ); + log_prod_L += logf( prod_L ); + log_prod_R += logf( prod_R ); + prod_L = 1; + prod_R = 1; + j = 0; + } + } + + /* collect UNCLR classifier parameters */ + { + float IPD, d_IPD, g_IPD, g_ILD, angle_rot, g_side, g_pred, abs_L_R, grand_nrg_DMX; + + if ( hCPE->last_element_mode != IVAS_CPE_DFT ) + { + hStereoClassif->prev_g_IPD = 0.5f; + hStereoClassif->prev_IPD = 0.0f; + } + + + abs_L_R = sqrtf( grand_dot_prod_real * grand_dot_prod_real + grand_dot_prod_img * grand_dot_prod_img ); + grand_nrg_DMX = sum_nrg_L + sum_nrg_R + 2 * abs_L_R; + + g_ILD = sqrtf( sum_nrg_L / ( sum_nrg_R + 1.0f ) ); + g_ILD = fabsf( ( g_ILD - 1 ) / ( g_ILD + 1 ) ); + hStereoClassif->unclr_fv[E_gainILD] = g_ILD; + hStereoClassif->xtalk_fv[E_gainILD] = g_ILD; + + IPD = atan2f( grand_dot_prod_img, grand_dot_prod_real ); + hStereoClassif->unclr_fv[E_IPD] = IPD; + hStereoClassif->xtalk_fv[E_IPD] = IPD; + + d_IPD = fabsf( IPD - hStereoClassif->prev_IPD ); + hStereoClassif->unclr_fv[E_d_IPD] = IPD; /* VM: need to replace IPD by d_IPD and re-train the UNCLR classifier for DFT stereo */ + hStereoClassif->xtalk_fv[E_d_IPD] = d_IPD; + hStereoClassif->prev_IPD = IPD; + + g_IPD = ( sum_nrg_L + sum_nrg_R + 2 * grand_dot_prod_real ) / grand_nrg_DMX; + if ( g_IPD >= 1.0f ) + { + g_IPD = hStereoClassif->prev_g_IPD; + } + else + { + hStereoClassif->prev_g_IPD = g_IPD; + } + g_IPD = logf( 1.0f - g_IPD ); + hStereoClassif->unclr_fv[E_gainIPD] = g_IPD; + hStereoClassif->xtalk_fv[E_gainIPD] = g_IPD; + + angle_rot = fabsf( atanf( 2.0f * ( grand_dot_prod_real ) / ( sum_nrg_L - sum_nrg_R + 1.0f ) ) ); + hStereoClassif->unclr_fv[E_angle_rot] = angle_rot; + hStereoClassif->xtalk_fv[E_angle_rot] = angle_rot; + + g_side = fabsf( sum_nrg_L - sum_nrg_R ) / ( grand_nrg_DMX ); + g_side = max( 0.01f, min( g_side, 0.99f ) ); + hStereoClassif->unclr_fv[E_g_side] = g_side; + hStereoClassif->xtalk_fv[E_g_side] = g_side; + + g_pred = logf( max( 0, ( ( 1 - g_side ) * sum_nrg_L + ( 1 + g_side ) * sum_nrg_R - 2 * abs_L_R ) ) + 1.0f ); + g_pred = max( 14.0f, g_pred ); + hStereoClassif->unclr_fv[E_g_pred] = g_pred; + hStereoClassif->xtalk_fv[E_g_pred] = g_pred; + } + + mvr2r( &Spd_L[1], &xcorr_lb[1], STEREO_DFT_XCORR_LB_MAX - 1 ); + sum_nrg_L_lb = sum_nrg_L_lb + sum_f( &Spd_L[1], 11 ); + + vad_flag_itd = stereo_dft_enc_itd_vad( hItd->E_band_n, &( hItd->vad_frm_cnt ), Spd_L, Spd_R, &mssnr ); + + vad_flag_itd = vad_flag_itd && vad_flag_dtx[0]; + + if ( sum_nrg_L < EPSILON ) + { + sfm_L = 0; + } + else + { + sfm_L = expf( log_prod_L / ( NFFT_mid ) ) / ( sum_abs_L / ( NFFT_mid ) ); + } + + if ( sum_nrg_R < EPSILON ) + { + sfm_R = 0; + } + else + { + sfm_R = expf( log_prod_R / ( NFFT_mid ) ) / ( sum_abs_R / ( NFFT_mid ) ); + } + + if ( sfm_R > sfm_L ) + { + sfm_L = sfm_R; + } + if ( hCPE->element_mode == IVAS_CPE_DFT ) + { + hStereoDft->sfm = sfm_L; + } + + for ( ; i < NFFT / 2; i++ ) + { + xcorr[2 * i] = pDFT_L[2 * i] * pDFT_R[2 * i] + pDFT_L[2 * i + 1] * pDFT_R[2 * i + 1]; + xcorr[2 * i + 1] = pDFT_L[2 * i + 1] * pDFT_R[2 * i] - pDFT_L[2 * i] * pDFT_R[2 * i + 1]; + + pNrgL[i] = pDFT_L[2 * i] * pDFT_L[2 * i] + pDFT_L[2 * i + 1] * pDFT_L[2 * i + 1]; + pNrgR[i] = pDFT_R[2 * i] * pDFT_R[2 * i] + pDFT_R[2 * i + 1] * pDFT_R[2 * i + 1]; + /* Calculate L and R energy power spectrum */ + Spd_L[i] = pNrgL[i]; + Spd_R[i] = pNrgR[i]; + } + + for ( ; i < STEREO_DFT_N_32k_ENC / 2; i++ ) + { + xcorr[2 * i] = 0.f; + xcorr[2 * i + 1] = 0.f; + } + + hItd->xcorr_smooth[0] = 0.f; + hItd->xcorr_smooth[1] = 0.f; + xcorr[0] = sign( hItd->xcorr_smooth[0] ); + xcorr[1] = sign( hItd->xcorr_smooth[1] ); + + + if ( hCPE->element_mode == IVAS_CPE_DFT && ( hItd->td_itd[k_offset] - hItd->td_itd[k_offset - 1] ) ) + { + float alphaD, c, s, c1, s1, ctmp, vtmp; + alphaD = -2.f * EVS_PI * ( (float) hItd->td_itd[k_offset] - hItd->td_itd[k_offset - 1] ) / hStereoDft->NFFT; + c1 = cosf( alphaD ); + s1 = sinf( alphaD ); + c = 1.f; /* cos(0) */ + s = 0.f; /* sin(0) */ + + for ( i = 1; i < NFFT / 2; i++ ) + { + ctmp = c; + c = c * c1 - s * s1; + s = ctmp * s1 + s * c1; + vtmp = hItd->xcorr_smooth[2 * i] * c - hItd->xcorr_smooth[2 * i + 1] * s; + hItd->xcorr_smooth[2 * i + 1] = hItd->xcorr_smooth[2 * i] * s + hItd->xcorr_smooth[2 * i + 1] * c; + hItd->xcorr_smooth[2 * i] = vtmp; + } + } + + tmpf3 = 2.f; + if ( flag_noisy_speech_snr ) + { + alpha = -0.8f; + } + else + { + alpha = -1.0f; + } + + if ( hCPE->hCoreCoder[0]->Opt_DTX_ON && hCPE->element_mode == IVAS_CPE_DFT ) + { + if ( hCPE->hFrontVad[0] != NULL ) + { + /* Determine if we are in hangover */ + if ( vad_hover_flag[0] && vad_hover_flag[1] ) + { + /* Determine if we are in the first DTX hangover frame (also triggers for VAD hangover frame) */ + if ( hStereoDft->resetFrames > CORR_RESET_FRAMES_MAX ) + { + /* Reset cross spectrum when there is hangover */ + set_f( hStereoDft->xspec_smooth, 0.0f, STEREO_DFT_N_32k_ENC ); + hStereoDft->resetFrames = 0; + hStereoDft->currentNumUpdates = 0; + /* Expected minimum number of updates including first SID */ + hStereoDft->expectedNumUpdates = 1 + min( hCPE->hFrontVad[0]->rem_dtx_ho, hCPE->hFrontVad[1]->rem_dtx_ho ); + } + else if ( hStereoDft->currentNumUpdates >= hStereoDft->expectedNumUpdates ) + { + hStereoDft->expectedNumUpdates += 1 + min( hCPE->hFrontVad[0]->rem_dtx_ho, hCPE->hFrontVad[1]->rem_dtx_ho ); + } + cng_xcorr_filt = max( min( CORR_FILT, 10.0f * CORR_FILT / ( hStereoDft->expectedNumUpdates + hStereoDft->currentNumUpdates ) ), sfm_L ); + hStereoDft->currentNumUpdates++; + for ( i = 1; i < NFFT / 2; i++ ) + { + /* Low pass filter cross L/R power spectrum */ + hStereoDft->xspec_smooth[2 * i] = ( 1.f - cng_xcorr_filt ) * hStereoDft->xspec_smooth[2 * i] + cng_xcorr_filt * xcorr[2 * i]; + hStereoDft->xspec_smooth[2 * i + 1] = ( 1.f - cng_xcorr_filt ) * hStereoDft->xspec_smooth[2 * i + 1] + cng_xcorr_filt * xcorr[2 * i + 1]; + + /* Low pass filter L/R power spectrum */ + /* Calculate coherence as cross spectral density divided by L*R power spectrum */ + hStereoDft->Spd_L_smooth[i] = ( 1.f - cng_xcorr_filt ) * hStereoDft->Spd_L_smooth[i] + cng_xcorr_filt * Spd_L[i]; + hStereoDft->Spd_R_smooth[i] = ( 1.f - cng_xcorr_filt ) * hStereoDft->Spd_R_smooth[i] + cng_xcorr_filt * Spd_R[i]; + } + } + else if ( vad_flag_dtx[0] == 0 ) + { + hStereoDft->resetFrames = 0; + } + else + { + if ( hStereoDft->resetFrames < CORR_RESET_FRAMES_MAX + 1 ) + { + hStereoDft->resetFrames++; + } + if ( !vad_hover_flag[0] && !vad_hover_flag[1] ) + { + hStereoDft->expectedNumUpdates = hStereoDft->currentNumUpdates; + } + } + } + if ( ( vad_flag_dtx[0] == 0 ) || ( hCPE->hFrontVad[0] == NULL && ( hCPE->hCoreCoder[0]->last_core_brate == SID_2k40 || hCPE->hCoreCoder[0]->last_core_brate == FRAME_NO_DATA ) ) || hCPE->hStereoCng->first_SID_after_TD ) + { + if ( vad_flag_dtx[0] == 0 ) + { + /* expectedNumUpdates updated after call to dtx() in SID frames */ + cng_xcorr_filt = max( min( CORR_FILT, 10.0f * CORR_FILT / ( hStereoDft->expectedNumUpdates + hStereoDft->currentNumUpdates ) ), sfm_L ); + hStereoDft->currentNumUpdates++; + hStereoDft->sfm = cng_xcorr_filt; + } + else /* use sfm for active frames */ + { + cng_xcorr_filt = sfm_L; + } + + /* Copy state of xspec_smooth to xcorr_smooth in first CNG frame */ + if ( hCPE->hStereoCng->cng_counter == 0 && vad_flag_dtx[0] == 0 ) + { + mvr2r( hStereoDft->xspec_smooth, hItd->xcorr_smooth, NFFT ); + } + for ( i = 1; i < NFFT / 2; i++ ) + { + /* Low pass filter cross L/R power spectrum */ + hStereoDft->xspec_smooth[2 * i] = ( 1.f - XSPEC_ALPHA ) * hStereoDft->xspec_smooth[2 * i] + XSPEC_ALPHA * xcorr[2 * i]; + hStereoDft->xspec_smooth[2 * i + 1] = ( 1.f - XSPEC_ALPHA ) * hStereoDft->xspec_smooth[2 * i + 1] + XSPEC_ALPHA * xcorr[2 * i + 1]; + hItd->xcorr_smooth[2 * i] = ( 1.f - cng_xcorr_filt ) * hItd->xcorr_smooth[2 * i] + cng_xcorr_filt * xcorr[2 * i]; + hItd->xcorr_smooth[2 * i + 1] = ( 1.f - cng_xcorr_filt ) * hItd->xcorr_smooth[2 * i + 1] + cng_xcorr_filt * xcorr[2 * i + 1]; + tmpf1 = sqrtf( hItd->xcorr_smooth[i * 2] * hItd->xcorr_smooth[i * 2] + hItd->xcorr_smooth[i * 2 + 1] * hItd->xcorr_smooth[i * 2 + 1] ); + tmpf1 += EPSILON; + tmpf2 = tmpf1; + tmpf1 = powf( tmpf1, alpha ); + tmpf3 += tmpf2 * tmpf1; + xcorr[2 * i] = hItd->xcorr_smooth[2 * i] * tmpf1; + xcorr[2 * i + 1] = hItd->xcorr_smooth[2 * i + 1] * tmpf1; + + /* Low pass filter L/R power spectrum */ + /* Calculate coherence as cross spectral density divided by L*R power spectrum */ + hStereoDft->Spd_L_smooth[i] = ( 1.f - XSPEC_ALPHA ) * hStereoDft->Spd_L_smooth[i] + XSPEC_ALPHA * Spd_L[i]; + hStereoDft->Spd_R_smooth[i] = ( 1.f - XSPEC_ALPHA ) * hStereoDft->Spd_R_smooth[i] + XSPEC_ALPHA * Spd_R[i]; + } + } + else + { + for ( i = 1; i < NFFT / 2; i++ ) + { + hItd->xcorr_smooth[2 * i] = ( 1.f - sfm_L ) * hItd->xcorr_smooth[2 * i] + sfm_L * xcorr[2 * i]; + hItd->xcorr_smooth[2 * i + 1] = ( 1.f - sfm_L ) * hItd->xcorr_smooth[2 * i + 1] + sfm_L * xcorr[2 * i + 1]; + tmpf1 = sqrtf( hItd->xcorr_smooth[i * 2] * hItd->xcorr_smooth[i * 2] + hItd->xcorr_smooth[i * 2 + 1] * hItd->xcorr_smooth[i * 2 + 1] ); + tmpf1 += EPSILON; + tmpf2 = tmpf1; + tmpf1 = powf( tmpf1, alpha ); + tmpf3 += tmpf2 * tmpf1; + xcorr[2 * i] = hItd->xcorr_smooth[2 * i] * tmpf1; + xcorr[2 * i + 1] = hItd->xcorr_smooth[2 * i + 1] * tmpf1; + } + } + } + else + { + for ( i = 1; i < NFFT / 2; i++ ) + { + hItd->xcorr_smooth[2 * i] = ( 1.f - sfm_L ) * hItd->xcorr_smooth[2 * i] + sfm_L * xcorr[2 * i]; + hItd->xcorr_smooth[2 * i + 1] = ( 1.f - sfm_L ) * hItd->xcorr_smooth[2 * i + 1] + sfm_L * xcorr[2 * i + 1]; + tmpf1 = sqrtf( hItd->xcorr_smooth[i * 2] * hItd->xcorr_smooth[i * 2] + hItd->xcorr_smooth[i * 2 + 1] * hItd->xcorr_smooth[i * 2 + 1] ); + tmpf1 += EPSILON; + tmpf2 = tmpf1; + tmpf1 = powf( tmpf1, alpha ); + tmpf3 += tmpf2 * tmpf1; + xcorr[2 * i] = hItd->xcorr_smooth[2 * i] * tmpf1; + xcorr[2 * i + 1] = hItd->xcorr_smooth[2 * i + 1] * tmpf1; + } + } + tmpf1 = (float) ( NFFT / 2 + 1 ) / tmpf3; + for ( i = 0; i < NFFT; i++ ) + { + xcorr[i] *= tmpf1; + } + /*calculate mean E ratio of main to background signal for cohSNR*/ + if ( hCPE->element_mode == IVAS_CPE_DFT ) + { + mEr = calc_mean_E_ratio( hItd, hStereoDft->nbands, hStereoDft->band_limits, sfm_L, pNrgL, pNrgR, &total_mEr ); + } + else + { + int16_t nbands; + int16_t band_limits[STEREO_DFT_BAND_MAX + 1]; + + set_s( band_limits, 0, STEREO_DFT_BAND_MAX + 1 ); + set_band_limits( &nbands, band_limits, hCPE->hStereoMdct->hDft_ana->NFFT ); + mEr = calc_mean_E_ratio( hItd, nbands, band_limits, sfm_L, pNrgL, pNrgR, &total_mEr ); + } + + /*calculate total cohSNR for frame in dB*/ + cohSNR = 20 * log10f( mEr ); + + /* collect UNCLR classifier parameters */ + { + float es_em, d_prodL_prodR; + + if ( total_mEr < 1.0f ) + { + hStereoClassif->unclr_fv[E_cohSNR] = 0; + } + else + { + hStereoClassif->unclr_fv[E_cohSNR] = 20 * log10f( total_mEr ); + } + + es_em = fabsf( sum_nrg_L - sum_nrg_R ) / ( sum_nrg_L + sum_nrg_R + 1e-5f ); + hStereoClassif->unclr_fv[E_es_em] = es_em; + hStereoClassif->xtalk_fv[E_es_em] = es_em; + + d_prodL_prodR = logf( max( prod_LL, prod_RR ) / ( min( prod_LL, prod_RR ) + 1e-5f ) + 1.0f ); + hStereoClassif->unclr_fv[E_d_prodL_prodR] = d_prodL_prodR; + hStereoClassif->xtalk_fv[E_d_prodL_prodR] = d_prodL_prodR; + + sum_xcorr = 0.0f; + for ( i = 1; i < NFFT_mid; i++ ) + { + xcorr_abs[i] = logf( xcorr_abs[i] / ( sum_nrg_L + sum_nrg_R + 1e-5f ) + 1e-5f ); + sum_xcorr += xcorr_abs[i]; + } + + hStereoClassif->unclr_fv[E_sum_xcorr] = sum_xcorr; + hStereoClassif->xtalk_fv[E_sum_xcorr] = sum_xcorr; + + } + + /* reset estimates when silence is detected*/ + if ( ( sum_nrg_L && sum_nrg_R ) < EPSILON ) + { + resetEstimates( hItd ); + } + + /*smooth cohSNR with time */ + if ( ( hItd->cohSNR - cohSNR ) < 10.0f ) + { + tmpf1 = max( 0.05f, min( 0.25f, sfm_L * 0.5f ) ); + hItd->cohSNR = ( 1.f - tmpf1 ) * hItd->cohSNR + tmpf1 * cohSNR; + } + else + { + hItd->cohSNR = hItd->cohSNR - 0.05f; + } + + cohSNR = hItd->cohSNR; + + rfft( xcorr, trigo_enc, STEREO_DFT_N_32k_ENC, +1 ); + + itd_td = hItd->td_itd_32k[k_offset]; /* This ITD always operates at 32kHz*/ + shift = ( STEREO_DFT_N_32k_ENC / 2 - itd_td ) % STEREO_DFT_N_32k_ENC; + split = STEREO_DFT_N_32k_ENC - shift; + + mvr2r( &xcorr[0], &xcorr_itd[shift], split ); + mvr2r( &xcorr[split], &xcorr_itd[0], shift ); + + mvr2r( &xcorr_itd[STEREO_DFT_N_32k_ENC / 2 - XTALK_PHAT_LEN], gcc_phat, 2 * XTALK_PHAT_LEN + 1 ); + + + thres = peak_detect( xcorr_itd, &tmpf1, &index, &zero_itd, cohSNR, hCPE->hCoreCoder[0]->vad_flag, &second_max, &second_max_lag, hItd->prev_itd, flag_noisy_speech_snr, hItd->detected_itd_flag, &hItd->prev_max, &hItd->prev_index, &hItd->prev_avg_max, &total_max ); + + hStereoClassif->ave_ener_L = sum_nrg_L / ( NFFT_mid * NFFT_mid ); + hStereoClassif->ave_ener_R = sum_nrg_R / ( NFFT_mid * NFFT_mid ); + + if ( hCPE->hCoreCoder[0]->input_Fs == 16000 ) + { + total_max *= 2.0f; + } + hStereoClassif->unclr_fv[E_xcorr_itd_value] = total_max; + hStereoClassif->xtalk_fv[E_xcorr_itd_value] = total_max; + + + /*for tonal music items increase thresholing by a factor up to 2.*/ + if ( hCPE->hCoreCoder[0]->sp_aud_decision0 && ( index - STEREO_DFT_ITD_MAX_ANA ) != hItd->prev_itd && !flag_noisy_speech_snr && hCPE->hCoreCoder[0]->vad_flag && tmpf1 < 0.3 ) + { + thres *= 1.0f + 1.f * min( 1.f, max( 0.f, ( -1.0f * sfm_L + 0.5f ) / ( 0.5f - 0.2f ) ) ); + } + + + itd_cal_flag = 0; + /*smooth threshold value depending on sfm for music items*/ + if ( hCPE->hCoreCoder[0]->ini_frame == 0 || hCPE->last_element_mode != IVAS_CPE_DFT || !hCPE->hCoreCoder[0]->sp_aud_decision0 || flag_noisy_speech_snr || cohSNR < 20 ) + { + hItd->itd_thres = thres; + } + else + { + hItd->itd_thres = ( 1.0f - sfm_L ) * hItd->itd_thres + sfm_L * thres; + } + + if ( flag_noisy_speech_snr == 0 && hCPE->hCoreCoder[0]->vad_flag == 1 && hItd->detected_itd_flag == 0 && ( hItd->currFlatness < 1.5f || hCPE->hCoreCoder[0]->sp_aud_decision0 == 1 ) ) + { + hItd->itd_thres *= 1.5f; + } + if ( hCPE->hCoreCoder[0]->vad_flag == 0 || hItd->detected_itd_flag == 0 ) + { + hItd->itd_tracking = 0; + } + else if ( abs( hItd->prev_itd ) > 2 ) + { + hItd->itd_tracking = 1; + } + + if ( hItd->itd_tracking == 1 && ( second_max > hItd->itd_thres || tmpf1 - second_max < min( tmpf1 * 0.5f, 0.2f ) ) ) + { + index = second_max_lag; + } + + if ( hItd->itd_tracking == 1 && abs( hItd->prev_itd - ( index - STEREO_DFT_ITD_MAX_ANA ) ) <= max( 2, (int16_t) round_f( abs( hItd->prev_itd ) / 16.f ) ) ) + { + hItd->itd_thres *= 0.75f; + } + + if ( tmpf1 > hItd->itd_thres && !zero_itd ) + { + /* LP filter GCC PHAT peak to follow peak envelope */ + if ( tmpf1 > hItd->lp_phat_peak ) + { + alpha = LP_GCC_PHAT_UP; + } + else + { + alpha = LP_GCC_PHAT_DOWN; + } + hItd->lp_phat_peak = alpha * tmpf1 + ( 1 - alpha ) * hItd->lp_phat_peak; + hItd->itd_cnt++; + if ( hItd->itd_cnt > ITD_CNT_MAX || hItd->itd_hangover > 0 ) + { + /* If max count is reached, or if an ITD candidate is found during hangover, + set itd_cnt = ITD_CNT_MAX to ensure hangover is applied */ + hItd->itd_cnt = ITD_CNT_MAX; + } + hItd->itd_hangover = 0; + + itd = index - STEREO_DFT_ITD_MAX_ANA; + hItd->itd_nonzero_cnt = 0; /* (1+0+9) <= hItd->itd_nonzero_cnt <= (1+6+3) */ + itd_cal_flag = 1; /* Indicates P>T case */ + hItd->valid_itd_cnt = hItd->itd_cnt; /* Store last non-zero value (when P>T) before reset */ + hItd->detected_itd_flag = 1; + } + else + { + /* Set prev_itd hangover period */ + if ( hItd->itd_cnt == ITD_CNT_MAX ) + { + hItd->itd_hangover = max( 0, min( ITD_HO_MAX, (int16_t) ( hItd->lp_phat_peak * ITD_HO_GCC_PHAT_INCL + ITD_HO_GCC_PHAT_OFFS ) ) ); + } + + if ( hItd->itd_hangover > 0 ) + { + itd = hItd->prev_itd; + if ( hItd->itd_nonzero_cnt < MAX_ITD_VAD_HANGOVER ) + { + hItd->itd_nonzero_cnt++; + } + hItd->itd_hangover--; + hItd->detected_itd_flag = 1; + } + else + { + itd = 0; + hItd->detected_itd_flag = 0; + } + + /* Reset */ + hItd->itd_cnt = 0; + hItd->lp_phat_peak = 0.0f; + } + + { + /* stereo Xtalk classifier */ + xtalk_classifier_dft( hCPE, itd, gcc_phat ); + } + + /*avoid enabling ITD fine control for music*/ + if ( !hCPE->hCoreCoder[0]->sp_aud_decision0 || flag_noisy_speech_snr || cohSNR < 20 ) + { + /* ITD fine control base on vad and correlation parameters */ + cor_lb_avrg = 0.0f; + par_L_avrg = 0.0f; + for ( i = 0; i < XCORR_LB_NUM_BANDS; i++ ) + { + num_cor = xcorr_lb[i * XCORR_LB_BAND_WIDTH] * hItd->prev_xcorr_lb[i * XCORR_LB_BAND_WIDTH]; + den_cor_cur = xcorr_lb[i * XCORR_LB_BAND_WIDTH] * xcorr_lb[i * XCORR_LB_BAND_WIDTH] + 1.0f; + den_cor_prev = hItd->prev_xcorr_lb[i * XCORR_LB_BAND_WIDTH] * hItd->prev_xcorr_lb[i * XCORR_LB_BAND_WIDTH] + 1.0f; + xcorr_max = xcorr_lb[i * XCORR_LB_BAND_WIDTH]; + sum_nrg_L_tmp = xcorr_lb[i * XCORR_LB_BAND_WIDTH]; + for ( j = 1; j < XCORR_LB_BAND_WIDTH; j++ ) + { + num_cor += xcorr_lb[i * XCORR_LB_BAND_WIDTH + j] * hItd->prev_xcorr_lb[i * XCORR_LB_BAND_WIDTH + j]; + den_cor_cur += xcorr_lb[i * XCORR_LB_BAND_WIDTH + j] * xcorr_lb[i * XCORR_LB_BAND_WIDTH + j]; + den_cor_prev += hItd->prev_xcorr_lb[i * XCORR_LB_BAND_WIDTH + j] * hItd->prev_xcorr_lb[i * XCORR_LB_BAND_WIDTH + j]; + if ( xcorr_lb[i * XCORR_LB_BAND_WIDTH + j] > xcorr_max ) + { + xcorr_max = xcorr_lb[i * XCORR_LB_BAND_WIDTH + j]; + } + sum_nrg_L_tmp += xcorr_lb[i * XCORR_LB_BAND_WIDTH + j]; + } + cor_lb[i] = num_cor / ( sqrtf( den_cor_cur ) * sqrtf( den_cor_prev ) ); + cor_lb_avrg += cor_lb[i]; + par_L[i] = xcorr_max / ( sum_nrg_L_tmp + FLT_MIN ); + par_L_avrg += par_L[i]; + } + cor_lb_avrg /= XCORR_LB_NUM_BANDS; + par_L_avrg /= XCORR_LB_NUM_BANDS; + + /*Breakdown of fine-control conditions */ + fc_condition_1 = abs( hItd->prev_itd ) > 0.2f * abs( itd ); + fc_condition_2 = cor_lb_avrg > 0.85f; + fc_condition_3 = ( cor_lb_avrg > 0.7f && ( cor_lb[0] > 0.9f || cor_lb[1] > 0.9f || cor_lb[2] > 0.9f ) && hItd->prev_sum_nrg_L_lb > 0.5f * sum_nrg_L_lb && hItd->prev_sum_nrg_L_lb < 2.0f * sum_nrg_L_lb ); + fc_condition_4 = par_L_avrg > 0.6f; + fc_condition_5 = hItd->prev_itd != 0; + fc_condition_6_a = itd * hItd->prev_itd < 0; /* ITD sign change */ + fc_condition_6_b = itd * hItd->prev_itd == 0; /* ITD jump to zero */ + fc_condition_6_c = abs( itd - hItd->prev_itd ) > 0.5f * ( ( abs( itd ) > abs( hItd->prev_itd ) ) ? abs( itd ) : abs( hItd->prev_itd ) ); /* Magnitude of the ITD jump */ + + /* Combining conditions 1,2,3,4 */ + fc_condition_1234 = fc_condition_1 && ( fc_condition_2 || fc_condition_3 || fc_condition_4 ); + + if ( ( fc_condition_1234 && ( ( fc_condition_5 && fc_condition_6_b ) || fc_condition_6_c ) ) || ( fc_condition_1234 && fc_condition_6_a ) ) + { + itd = hItd->prev_itd; + + if ( hItd->itd_nonzero_cnt < MAX_ITD_VAD_HANGOVER ) + { + hItd->itd_nonzero_cnt++; + } + hItd->detected_itd_flag = 1; + } + + /* stop the fine control when inactive or very high mssnr is detected*/ + if ( mssnr < 6e-7f * HIGHT_SNR_VOICE_TH || mssnr > 200 * HIGHT_SNR_VOICE_TH ) + { + hItd->itd_nonzero_cnt = MAX_ITD_VAD_HANGOVER; + } + + if ( vad_flag_itd ) + { + /* Fine-control for hangover if set HR period = 0 or if HR period expires */ + /* However fine-control shouldn't be used when HR is disabled because itd_cnt < 2 - hence the extra last condition */ + if ( hItd->itd_hangover == 0 && hItd->prev_itd != 0 && itd == 0 && itd_cal_flag != 1 && hItd->itd_nonzero_cnt < MAX_ITD_VAD_HANGOVER && hItd->valid_itd_cnt == ITD_CNT_MAX && hItd->pre_vad == 1 ) + { + itd = hItd->prev_itd; + hItd->itd_nonzero_cnt++; + hItd->detected_itd_flag = 1; + } + hItd->pre_vad = 1; + } + else + { + hItd->pre_vad = 0; + } + + if ( itd == 0 && itd_cal_flag != 1 ) + { + hItd->itd_nonzero_cnt = 0; + } + + hItd->prev_sum_nrg_L_lb = sum_nrg_L_lb; + mvr2r( xcorr_lb, hItd->prev_xcorr_lb, STEREO_DFT_XCORR_LB_MAX ); + } + /*save previous flag*/ + prev_itd_max = hItd->hybrid_itd_max; + /* enable hybrid ITD handling for very large ITDs*/ + hItd->hybrid_itd_max = ( abs( itd ) > STEREO_DFT_ITD_MAX && abs( itd ) < STEREO_DFT_ITD_MAX_ANA && !hCPE->hCoreCoder[0]->sp_aud_decision0 && hCPE->element_brate < IVAS_32k ); + /* Update memory */ + hItd->prev_itd = itd; + + itd = check_bounds_s( itd, -STEREO_DFT_ITD_MAX, STEREO_DFT_ITD_MAX ); + + /*Inverse the time diff*/ + hItd->itd[k_offset] = -1.f * itd; + + /* collect UNCLR classifier parameters */ + hStereoClassif->unclr_fv[E_ITD] = hItd->itd[k_offset]; + + + /* limit ITD range for MDCT stereo even more */ + if ( hCPE->element_mode == IVAS_CPE_MDCT && fabsf( hItd->itd[k_offset] ) > ITD_MAX_MDCT ) + { + itd = 0; + } + + stereo_dft_quantize_itd( -1 * itd, hItd->itd + k_offset, input_frame * FRAMES_PER_SEC, hItd->itd_index + k_offset ); + + hItd->deltaItd[k_offset] = hItd->itd[k_offset] - hItd->td_itd[k_offset]; + + if ( hItd->hybrid_itd_max ) + { + /*check if there is an ITD flip*/ + itd_max_flip = ( hItd->itd[k_offset] * hItd->itd[k_offset - 1] < 0 ); + + if ( hItd->deltaItd[k_offset - 1] != 0 && itd_max_flip == 0 ) + { + int16_t tmp_itd = (int16_t) floor( ( ( hItd->prev_itd ) * ( (float) input_frame / 640 ) ) + 0.5f ); + hItd->deltaItd[k_offset] = -1.0f * tmp_itd - hItd->td_itd[k_offset]; + } + } + /*signal change for next frame*/ + if ( prev_itd_max == 1 && hItd->hybrid_itd_max == 0 ) + { + hItd->hybrid_itd_max = -1; + } + + + return; +} diff --git a/lib_enc/ivas_stereo_dft_td_itd.c b/lib_enc/ivas_stereo_dft_td_itd.c new file mode 100644 index 0000000000000000000000000000000000000000..3a043ec5459e66ab25626a33cabe610a10be3536 --- /dev/null +++ b/lib_enc/ivas_stereo_dft_td_itd.c @@ -0,0 +1,397 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "rom_com.h" +#include "ivas_prot.h" +#include "ivas_rom_com.h" +#include "ivas_stat_enc.h" +#include "ivas_cnst.h" +#include "wmc_auto.h" + + +/*-------------------------------------------------------------------* + * Local constants + *-------------------------------------------------------------------*/ + +#define STEREO_DFT_CHANNEL_EXTR_LPC_ORDER 10 +#define STEREO_DFT_CHANNEL_EXTR_LPC_VEC_LIMIT 320 + + +/*--------------------------------------------------------------- + * stereo_td_get_td_itd() + * + * + * ---------------------------------------------------------------*/ + +static void stereo_td_get_td_itd( + int16_t *td_itd, /* o : td_itd in samples at sampling frequency */ + int16_t *td_itd_32, /* o : td_itd in samples at 32kHz */ + const float itd, /* i : itd in samples at sampling frequency */ + const int32_t input_Fs /* i : sampling frequency */ +) +{ + /* *td_itd is the closest integer to itd that transforms into an integer value * + * under the transform x -> (32000/fs) x. */ + int16_t d; + + if ( input_Fs == 32000 ) + { + *td_itd_32 = *td_itd = (int16_t) itd; + } + else + { + assert( ( input_Fs % 16000 ) == 0 && "sampling frequency should be divisible by 16000" ); + d = (int16_t) ( input_Fs / 16000 ); + *td_itd_32 = 2 * (int16_t) floor( itd / d + 0.5f ); + *td_itd = ( ( *td_itd_32 ) / 2 ) * d; + } + + return; +} + +/*--------------------------------------------------------------- + * stereo_td_channel_extrapolate() + * + * + * ---------------------------------------------------------------*/ + +static void stereo_td_channel_extrapolate( + Encoder_State **sts, + const int16_t dft_ovl, + const float shift_mem[], + float shift_input[], + const int16_t input_frame, + const int16_t itd_shift, + const int16_t lagging_channel, + float *input_mem[CPE_CHANNELS] /* i/o: input buffer memory */ +) +{ + int16_t leading_channel, i, size_ovl, pred_ovlp; + float g, nsr, g_lpc, dot_lead_lag, dot_lead_lead, dot_lag_lag; + float window[STEREO_DFT_CHANNEL_EXTR_LPC_VEC_LIMIT], mem_zero[STEREO_DFT_CHANNEL_EXTR_LPC_ORDER]; + float residual[STEREO_DFT_CHANNEL_EXTR_LPC_VEC_LIMIT + ( STEREO_DFT_ITD_MAX * L_FRAME48k ) / L_FRAME32k]; + float r[STEREO_DFT_CHANNEL_EXTR_LPC_ORDER + 1]; + float A[STEREO_DFT_CHANNEL_EXTR_LPC_ORDER + 1]; + float shift_combined[L_FRAME48k + L_FRAME48k]; + int16_t flag; + int16_t pitch_lag; + int16_t res_shift; + int16_t pitch0; + + set_f( shift_combined, 0.0f, L_FRAME48k + L_FRAME48k ); + set_f( residual, 0.0f, STEREO_DFT_CHANNEL_EXTR_LPC_VEC_LIMIT + ( STEREO_DFT_ITD_MAX * input_frame ) / L_FRAME32k ); + + leading_channel = ( lagging_channel + 1 ) % 2; + if ( sts[0]->element_mode == IVAS_CPE_DFT ) + { + size_ovl = dft_ovl; + pitch0 = sts[0]->pitch[0]; + } + else + { + size_ovl = input_frame; + pitch0 = sts[lagging_channel]->pitch[0]; + } + + pred_ovlp = input_frame / 10; + + /*get pitch lag from previous frame */ + pitch_lag = (int16_t) ( pitch0 * ( (float) input_frame / L_FRAME ) ); + + /* compute the parameters g, nsr and g_lpc */ + dot_lead_lag = EPSILON; + dot_lead_lead = EPSILON; + dot_lag_lag = EPSILON; + for ( i = 0; i < size_ovl; i++ ) + { + shift_combined[i] = shift_mem[i]; + dot_lead_lag += input_mem[leading_channel][i] * shift_mem[i]; + dot_lead_lead += input_mem[leading_channel][i] * input_mem[leading_channel][i]; + dot_lag_lag += shift_mem[i] * shift_mem[i]; + } + for ( i = 0; i < input_frame - itd_shift; i++ ) + { + shift_combined[i + size_ovl] = shift_input[i]; + dot_lead_lag += sts[leading_channel]->input[i] * shift_input[i]; + dot_lead_lead += sts[leading_channel]->input[i] * sts[leading_channel]->input[i]; + dot_lag_lag += shift_input[i] * shift_input[i]; + } + + g = dot_lead_lag / dot_lead_lead; + nsr = 1 - ( ( dot_lead_lag * dot_lead_lag ) / ( dot_lead_lead * dot_lag_lag ) ); + + g = check_bounds( g, -1, 1.5f ); + nsr = check_bounds( nsr, 0.0f, 1 ); + g_lpc = sqrtf( nsr ); + + /* rectangular window */ + set_f( window, 1.0f, STEREO_DFT_CHANNEL_EXTR_LPC_VEC_LIMIT ); + set_zero( mem_zero, STEREO_DFT_CHANNEL_EXTR_LPC_ORDER ); + + /* get the LPC filter */ + autocorr( shift_combined + input_frame + size_ovl - itd_shift - STEREO_DFT_CHANNEL_EXTR_LPC_VEC_LIMIT, r, STEREO_DFT_CHANNEL_EXTR_LPC_ORDER, STEREO_DFT_CHANNEL_EXTR_LPC_VEC_LIMIT, window, 0, 0, 0 ); + + /* Ensure R[0] isn't zero when entering Levinson-Durbin */ + r[0] = max( r[0], 1.0e-8f ); + for ( i = 0; i <= STEREO_DFT_CHANNEL_EXTR_LPC_ORDER; i++ ) + { + r[i] = r[i] * wac_swb[i]; + } + + /* Ensure R[0] isn't zero when entering Levinson-Durbin */ + r[0] += 1.0e-8f; + + flag = lev_dur( A, r, STEREO_DFT_CHANNEL_EXTR_LPC_ORDER, NULL ); + + if ( flag == 1 ) + { + g_lpc = 0.0f; + } + else + { + /* get the residual */ + fir( shift_combined + input_frame + size_ovl - itd_shift - STEREO_DFT_CHANNEL_EXTR_LPC_VEC_LIMIT, A, residual, mem_zero, STEREO_DFT_CHANNEL_EXTR_LPC_VEC_LIMIT, STEREO_DFT_CHANNEL_EXTR_LPC_ORDER, 0 ); + + /* extend the residual */ + /* to prevent out of bound reading */ + + res_shift = ( pitch_lag < PIT_MAX ? pitch_lag : itd_shift ); + + for ( i = STEREO_DFT_CHANNEL_EXTR_LPC_VEC_LIMIT; i < STEREO_DFT_CHANNEL_EXTR_LPC_VEC_LIMIT + itd_shift; i++ ) + { + residual[i] = residual[i - res_shift]; + } + + /* perform sythesis */ + syn_filt( A, STEREO_DFT_CHANNEL_EXTR_LPC_ORDER, residual, shift_combined + input_frame + size_ovl - STEREO_DFT_CHANNEL_EXTR_LPC_VEC_LIMIT - itd_shift, STEREO_DFT_CHANNEL_EXTR_LPC_VEC_LIMIT + itd_shift, mem_zero, 0 ); + } + + mvr2r( shift_combined + size_ovl, shift_input, input_frame ); + + /* use this synthesis part to replace the zeros in the lagging channel */ + for ( i = input_frame - itd_shift; i < input_frame; i++ ) + { + shift_input[i] = ( g_lpc * shift_input[i] ) + ( g * sts[leading_channel]->input[i] ); + } + + /* smooth transition (currently done by blending over linearly, could be replaced by something more elaborate.) */ + for ( i = input_frame - itd_shift - pred_ovlp; i < input_frame - itd_shift; i++ ) + { + shift_input[i] = ( i - input_frame + itd_shift + pred_ovlp ) * ( ( g_lpc * shift_input[i] ) + ( g * sts[leading_channel]->input[i] ) ) / pred_ovlp + ( input_frame - itd_shift - i ) * shift_input[i] / pred_ovlp; + } + + return; +} + + +/*--------------------------------------------------------------- + * stereo_td_itd() + * + * + * ---------------------------------------------------------------*/ + +void stereo_td_itd( + ITD_DATA *hITD, /* i/o: ITD data structure */ + float input_mem_itd[CPE_CHANNELS][STEREO_DFT_OVL_MAX], /* o : ITD memory (only used in DFT Stereo) */ + const int16_t hybrid_itd_flag, /* i : flag for hybrid TD/FD ITD processing */ + const int16_t dft_ovl, /* i : size of DFT overlap */ + Encoder_State **sts, /* i/o: Encoder state structure */ + const int16_t input_frame, /* i : input frame length */ + float *input_mem[CPE_CHANNELS] /* i/o: input buffer memory */ +) +{ + int16_t i, ch, n; + int16_t size_ovl, k_offset; + int16_t shift[2]; + int16_t itd, itd_max; + float shift_input[L_FRAME48k]; + float shift_mem[L_FRAME48k]; + float *mdct_mem[CPE_CHANNELS]; + + k_offset = STEREO_DFT_OFFSET; + set_f( shift_input, 0.0f, input_frame ); + if ( sts[0]->element_mode == IVAS_CPE_MDCT ) + { + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + mdct_mem[n] = sts[n]->old_input_signal; + } + } + if ( sts[0]->element_mode == IVAS_CPE_DFT ) + { + /* Update the parameters */ + for ( i = 0; i < k_offset; i++ ) + { + hITD->deltaItd[i] = hITD->deltaItd[i + 1]; + hITD->td_itd[i] = hITD->td_itd[i + 1]; + hITD->td_itd_32k[i] = hITD->td_itd_32k[i + 1]; + } + } + /*reset TD ITDs in case of hybrid itd_max change - turn hybrid ITD off*/ + if ( hITD->hybrid_itd_max == -1 && hybrid_itd_flag == 0 ) + { + hITD->td_itd[k_offset] = 0; + hITD->td_itd_32k[k_offset] = 0; + } + if ( hybrid_itd_flag == 0 ) + { + return; + } + stereo_td_get_td_itd( &( hITD->td_itd[k_offset] ), &( hITD->td_itd_32k[k_offset] ), hITD->itd[k_offset], sts[0]->input_Fs ); + +/* initializations*/ + { + size_ovl = dft_ovl; + + itd_max = ( STEREO_DFT_ITD_MAX * input_frame ) / L_FRAME32k; + + assert( ( fabsf( hITD->itd[k_offset] ) <= itd_max ) && "ITD value is too high!" ); + assert( ( fabsf( hITD->itd[k_offset - 1] ) <= itd_max ) && "ITD value is too high!" ); + + itd = hITD->td_itd[k_offset]; + + /*Time shift with current ITD*/ + if ( itd < 0 ) + { + shift[1] = 0; + shift[0] = -itd; + ch = 0; + } + else + { + shift[1] = itd; + shift[0] = 0; + ch = 1; + } + + /* extrapolate lagging channel */ + if ( shift[ch] > 0 ) + { + if ( sts[0]->element_mode == IVAS_CPE_DFT ) + { + /* store last part of signal before extrapolation */ + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + mvr2r( sts[n]->input + input_frame - dft_ovl, input_mem_itd[n], dft_ovl ); + } + + /*shift past part*/ + mvr2r( input_mem[ch] + shift[ch], shift_mem, size_ovl - shift[ch] ); + mvr2r( sts[ch]->input, shift_mem + size_ovl - shift[ch], shift[ch] ); + } + else + { + /*shift past part*/ + mvr2r( mdct_mem[ch] + shift[ch], shift_mem, input_frame - shift[ch] ); + mvr2r( sts[ch]->input, shift_mem + input_frame - shift[ch], shift[ch] ); + } + /*shift current part*/ + mvr2r( sts[ch]->input + shift[ch], shift_input, input_frame - shift[ch] ); + if ( sts[0]->element_mode == IVAS_CPE_DFT ) + { + /*Extrapolate current frame*/ + stereo_td_channel_extrapolate( sts, dft_ovl, shift_mem, shift_input, input_frame, shift[ch], ch, input_mem ); + } + else + { + /*Extrapolate current frame*/ + stereo_td_channel_extrapolate( sts, 0, shift_mem, shift_input, input_frame, shift[ch], ch, mdct_mem ); + } + + /* write back the extrapolated signal into sts[ch]->input */ + mvr2r( shift_input, sts[ch]->input, input_frame ); + if ( sts[0]->element_mode == IVAS_CPE_DFT ) + { + mvr2r( shift_mem, input_mem[ch], size_ovl ); + } + else + { + mvr2r( shift_mem, mdct_mem[ch], input_frame ); + } + } + } + + return; +} + + +/*--------------------------------------------------------------- + * stereo_td_itd_mdct_stereo() + * + * Time-domain ITD in MDCT stereo + * ---------------------------------------------------------------*/ + +void stereo_td_itd_mdct_stereo( + CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder handle */ + const int16_t vad_flag_dtx[], /* i : VAD dtx flags */ + const int16_t vad_hover_flag[], /* i : VAD hangover flags */ + const int16_t input_frame /* i : frame length */ +) +{ + int16_t i; + float bin_nrgL[STEREO_DFT_N_32k_ENC]; + float bin_nrgR[STEREO_DFT_N_32k_ENC]; + float DFT[CPE_CHANNELS][STEREO_DFT_N_MAX_ENC]; + STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct; + + if ( hCPE->hStereoMdct != NULL && hCPE->hStereoMdct->hItd != NULL ) + { + hStereoMdct = hCPE->hStereoMdct; + + hCPE->hStereoMdct->hItd->td_itd_32k[STEREO_DFT_OFFSET] = 0; + hStereoMdct->hItd->td_itd[STEREO_DFT_OFFSET] = 0; + + /* Update the parameters */ + for ( i = 0; i < STEREO_DFT_OFFSET; i++ ) + { + hStereoMdct->hItd->deltaItd[i] = hStereoMdct->hItd->deltaItd[i + 1]; + hStereoMdct->hItd->td_itd[i] = hStereoMdct->hItd->td_itd[i + 1]; + hStereoMdct->hItd->td_itd_32k[i] = hStereoMdct->hItd->td_itd_32k[i + 1]; + } + + stereo_dft_enc_analyze( hCPE->hCoreCoder, CPE_CHANNELS, input_frame, NULL, hStereoMdct, DFT, hCPE->input_mem ); + + /*call ITD function*/ + stereo_dft_enc_compute_itd( hCPE, DFT[0], DFT[1], STEREO_DFT_OFFSET, input_frame, vad_flag_dtx, vad_hover_flag, bin_nrgL, bin_nrgR ); + + /* Time Domain ITD compensation using extrapolation */ + stereo_td_itd( hStereoMdct->hItd, NULL, 1, hStereoMdct->hDft_ana->dft_ovl, hCPE->hCoreCoder, input_frame, hCPE->input_mem ); + } + + return; +} diff --git a/lib_enc/ivas_stereo_dmx_evs.c b/lib_enc/ivas_stereo_dmx_evs.c new file mode 100644 index 0000000000000000000000000000000000000000..5ac6fe18075ae144d591e7792110702ffab5f9f2 --- /dev/null +++ b/lib_enc/ivas_stereo_dmx_evs.c @@ -0,0 +1,1653 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include "options.h" +#include "cnst.h" +#include "ivas_cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_rom_com.h" +#include "ivas_rom_enc.h" +#include "wmc_auto.h" + + +/*-----------------------------------------------------------------------* + * Local constants + *-----------------------------------------------------------------------*/ + +#define STEREO_DMX_EVS_FIND_POC_PEAK_TAU 4 +#define STEREO_DMX_EVS_FIND_POC_PEAK_TAU2 8 + +#define STEREO_DMX_EVS_POC_GAMMA 0.75f +#define STEREO_DMX_EVS_POC_SMOOTH 1.25f +#define STEREO_DMX_EVS_POC_FORGETTING 0.78f +#define STEREO_DMX_EVS_TARGET_POC_FORGETTING 0.79f +#define STEREO_DMX_EVS_POC_W_FORGETTING 0.875f +#define STEREO_DMX_EVS_SHIFT_LIMIT 5.625f /* ms */ + +#define STEREO_DMX_EVS_DMX_EGY_FORGETTING 0.25f +#define STEREO_DMX_EVS_CORR_FORGETTING 0.78f + +#define Q_BAND 0.25f + + +#define STEREO_DMX_EVS_ISD_FORGETTING 0.95f +#define STEREO_DMX_EVS_ISD_THRES_H 1.69f +#define STEREO_DMX_EVS_ISD_THRES_L 0.9f +#define STEREO_DMX_EVS_ISD_DIST_THRES_IPD 0.5f + +#define STEREO_DMX_EVS_ISD_DIST_HYST_L 0.36f +#define STEREO_DMX_EVS_ISD_DIST_HYST_H 0.43f + +#define STEREO_DMX_EVS_ICCR_FORGETTING 0.7f +#define STEREO_DMX_EVS_ICCR_HYST_L 0.75f +#define STEREO_DMX_EVS_ICCR_HYST_H 0.85f + +#define STEREO_DMX_EVS_SWTCH_HYS_THRES 1 +#define STEREO_DMX_EVS_LR_EGY 15.0f +#define STEREO_DMX_EVS_ILDS_EGY 10000.0f +#define STEREO_DMX_EVS_ILD_PRC 0.1f + +#define STEREO_DMX_EVS_SWTCH_PRC_THRES_16 55 +#define STEREO_DMX_EVS_SWTCH_PRC_THRES_32 19 +#define STEREO_DMX_EVS_SWTCH_PRC_THRES_48 29 + +#define STEREO_DMX_EVS_SWTCH_PRC_HYS_THRES 1 +#define STEREO_DMX_EVS_FADE_LEN_PRC 20.0f + +#define STEREO_DMX_EVS_NB_SBFRM 5 +#define STEREO_DMX_EVS_TRNS_DTC_INST 75.0f +#define STEREO_DMX_EVS_CRST_FCTR_16 80.0f +#define STEREO_DMX_EVS_CRST_FCTR_32 40.0f +#define STEREO_DMX_EVS_CRST_FCTR_48 35.0f + +#define STEREO_DMX_EVS_TRNS_EGY_FORGETTING 0.75f + + +/*-----------------------------------------------------------------------* + * Local function prototypes + *-----------------------------------------------------------------------*/ + +static void estimate_itd_wnd_fft( const float *input, float *specr, float *speci, const float *rfft_coef, const float *wnd, const int16_t input_frame ); +static void calc_poc( STEREO_DMX_EVS_POC_HANDLE hPOC, STEREO_DMX_EVS_PHA_HANDLE hPHA, const float wnd[], const float rfft_coef[], const float specLr[], const float specLi[], const float specRr[], const float specRi[], const int16_t input_frame ); +static ivas_error estimate_itd( float *corr, STEREO_DMX_EVS_POC_HANDLE hPOC, STEREO_DMX_EVS_PHA_HANDLE hPHA, const float srcL[], const float srcR[], float itd[], const int16_t input_frame ); +static void weighted_ave( const float src1[], const float src2[], float dst[], const float gain, const float old_gain, const int16_t input_frame, const float wnd[] ); +static void adapt_gain( const float src[], float dst[], const float gain, const float old_gain, const int16_t input_frame, const float wnd[] ); +static void create_M_signal( const float srcL[], const float srcR[], float dmx[], const float w_curr, const int16_t input_frame, const float wnd[], float *w_prev, float *dmx_energy, float *src_energy ); +static float find_poc_peak( STEREO_DMX_EVS_POC_HANDLE hPOC, float itd[], const int16_t input_frame, const float ratio ); +static void calc_energy( const float src1[], const float src2[], float energy[], const int16_t input_frame, const float ratio ); + +/*-------------------------------------------------------------------* + * estimate_itd_wnd_fft() + * + * Transforms input signal from time domain into frequency domain. + * The input signal is windowed before being transformed. + *-------------------------------------------------------------------*/ + +void estimate_itd_wnd_fft( + const float *input, /* i : input signal */ + float *specr, /* o : real-part spectra */ + float *speci, /* o : imaginary-part spectra */ + const float *rfft_coef, /* i : rfft coef */ + const float *wnd, /* i : window coef */ + const int16_t input_frame /* i : input frame length per channel */ +) +{ + int16_t n0, i; + float rfft_buf[L_FRAME48k]; + int16_t step, bias; + + n0 = input_frame >> 1; + if ( input_frame == L_FRAME16k ) + { + step = 3; + bias = 1; + } + else + { + step = 1; + bias = 0; + } + + for ( i = 0; i < input_frame; i++ ) + { + /* window */ + rfft_buf[i] = input[i] * wnd[i * step + bias]; + } + + rfft( rfft_buf, rfft_coef, input_frame, -1 ); + + for ( i = 1; i < n0; i++ ) + { + specr[i] = rfft_buf[i * 2]; + speci[i] = rfft_buf[i * 2 + 1]; + } + + specr[0] = rfft_buf[0]; + specr[n0] = rfft_buf[1]; + speci[0] = 0.f; + speci[n0] = 0.f; + + return; +} + + +/*-------------------------------------------------------------------* + * calc_poc() + * + * calculate phase only correlation + *-------------------------------------------------------------------*/ + +static void calc_poc( + STEREO_DMX_EVS_POC_HANDLE hPOC, /* i/o: phase only correlation structure */ + STEREO_DMX_EVS_PHA_HANDLE hPHA, /* i/o: correlation filter structure */ + const float wnd[], /* i : window coef */ + const float rfft_coef[], /* i : RFFT coef */ + const float specLr[], /* i : Lch real-part spectra */ + const float specLi[], /* i : Lch imaginary-part input signal */ + const float specRr[], /* i : Rch real-part spectra */ + const float specRi[], /* i : Rch imaginary-part input signal */ + const int16_t input_frame /* i : input frame length per channel */ +) +{ + int16_t i, n1, n2; + int16_t n0, *itdLR; + const float *s; + float *P; + float tmp1, tmp2, Lr, Li, Rr, Ri, gamma, igamma, iN; + + float specPOr[L_FRAME48k / 2 + 1], specPOi[L_FRAME48k / 2]; /*real and imaginary values for searching phase angle*/ + float tmpPOC1[L_FRAME48k], tmpPOC2[L_FRAME48k]; + float rfft_buf[L_FRAME48k]; + int16_t step, bias; + int16_t mult_angle; + int16_t j; + int16_t end; + + int16_t cos_step, cos_max; + float eps_cos, eps_sin, EPS; + + int16_t isd_cnt_h, isd_cnt_l, ild_cnt, n, freq_8k, freq_ipd_max, nsbd, input_frame_pha; + float Nr, Ni, Dr, Di, tPr, tPi, Pn, energy, isd_rate; + float eneL, eneR, IPDr, IPDi, tIPDr, tIPDi, ICCr; + float *Pr, *Pi, *ipd_ff, *p_curr_taps; + float rfft_pha_buf[L_FRAME48k], tEr[STEREO_DMX_EVS_NB_SUBBAND_MAX], tEl[STEREO_DMX_EVS_NB_SUBBAND_MAX]; + + /* Initialization */ + iN = 1.0f / (float) input_frame; + s = hPOC->sin; + P = hPOC->P; + n0 = input_frame / 2; + itdLR = hPOC->itdLR; + + Pr = hPHA->Pr; + Pi = hPHA->Pi; + nsbd = n0 / STEREO_DMX_EVS_SUBBAND_SIZE; + input_frame_pha = input_frame / STEREO_DMX_EVS_SUBBAND_SIZE; + + igamma = STEREO_DMX_EVS_POC_GAMMA * iN; + gamma = 1.0f - igamma; + + step = 1; + bias = 0; + cos_step = 2; + cos_max = n0; + mult_angle = 3; + + if ( input_frame == L_FRAME16k ) + { + step = 3; + bias = 1; + cos_step = 4; + cos_max = input_frame; + mult_angle = 2; /*****/ + } + if ( input_frame == L_FRAME32k ) + { + mult_angle = 2; + } + + end = min( n0, 320 ); + specPOr[0] = sign( specLr[0] * specRr[0] ) * wnd[bias]; + specPOi[0] = 0.0f; + EPS = hPOC->eps; + if ( input_frame == L_FRAME48k ) + { + for ( i = 1; i < n0 / 2; i++ ) + { + eps_cos = s[cos_max - i * cos_step /*cos_max - i_for*/] * EPS; + eps_sin = s[i * cos_step /*i_for*/] * EPS; + Lr = specLr[i] + specRr[i] * eps_cos + specRi[i] * eps_sin; + Li = specLi[i] - specRr[i] * eps_sin + specRi[i] * eps_cos; + Rr = specRr[i] + specLr[i] * eps_cos + specLi[i] * eps_sin; + Ri = specRi[i] - specLr[i] * eps_sin + specLi[i] * eps_cos; + + specPOr[i] = ( Lr * Rr + Li * Ri ); + specPOi[i] = ( Lr * Ri - Li * Rr ); + j = n0 - i; + if ( j < 320 ) + { + Lr = specLr[j] - specRr[j] * eps_cos + specRi[j] * eps_sin; + Li = specLi[j] - specRr[j] * eps_sin - specRi[j] * eps_cos; + Rr = specRr[j] - specLr[j] * eps_cos + specLi[j] * eps_sin; + Ri = specRi[j] - specLr[j] * eps_sin - specLi[j] * eps_cos; + + specPOr[j] = ( Lr * Rr + Li * Ri ); + specPOi[j] = ( Lr * Ri - Li * Rr ); + } + } + } + else /* 16kHz and 32 kHz*/ + { + for ( i = 1; i < n0 / 2; i++ ) + { + eps_cos = s[cos_max - i * cos_step /*cos_max - i_for*/] * EPS; + eps_sin = s[i * cos_step /*i_for*/] * EPS; + + Lr = specLr[i] + specRr[i] * eps_cos + specRi[i] * eps_sin; + Li = specLi[i] - specRr[i] * eps_sin + specRi[i] * eps_cos; + Rr = specRr[i] + specLr[i] * eps_cos + specLi[i] * eps_sin; + Ri = specRi[i] - specLr[i] * eps_sin + specLi[i] * eps_cos; + specPOr[i] = ( Lr * Rr + Li * Ri ); + specPOi[i] = ( Lr * Ri - Li * Rr ); + + j = n0 - i; + Lr = specLr[j] - specRr[j] * eps_cos + specRi[j] * eps_sin; + Li = specLi[j] - specRr[j] * eps_sin - specRi[j] * eps_cos; + Rr = specRr[j] - specLr[j] * eps_cos + specLi[j] * eps_sin; + Ri = specRi[j] - specLr[j] * eps_sin - specLi[j] * eps_cos; + specPOr[j] = ( Lr * Rr + Li * Ri ); + specPOi[j] = ( Lr * Ri - Li * Rr ); + } + } + { + /* i=n0/2*/ + Lr = specLr[i] + specRi[i] * EPS; + Li = specLi[i] - specRr[i] * EPS; + Rr = specRr[i] + specLi[i] * EPS; + Ri = specRi[i] - specLr[i] * EPS; + specPOr[i] = ( Lr * Rr + Li * Ri ); + specPOi[i] = ( Lr * Ri - Li * Rr ); + } + /* complex spectrum (specPOr[i], specPOi[i]) are placed on an unit circle without using srqt()*/ + for ( i = 1; i < 10; i++ ) /*search from 4 angles */ + { + tmp1 = wnd[i * step + bias] * gamma; + + specPOr[i] = sign( specPOr[i] ) * 0.866f * tmp1; /* low angles are more frequent for low frequency */ + specPOi[i] = sign( specPOi[i] ) * 0.5f * tmp1; + gamma -= igamma; + } + for ( ; i < n0 >> 4; i++ ) /*search from 4 angles */ + { + tmp1 = wnd[i * step + bias] * gamma * 0.7071f; + + specPOr[i] = sign( specPOr[i] ) * tmp1; + specPOi[i] = sign( specPOi[i] ) * tmp1; /* low accuracy is adequate for low frequency */ + gamma -= igamma; + } + + for ( ; i < n0 >> 3; i++ ) /* binary search from 8 angles */ + { + tmp1 = wnd[i * step + bias] * gamma; + + if ( ( specPOr[i] - specPOi[i] ) * ( specPOr[i] + specPOi[i] ) > 0 ) + { + specPOr[i] = sign( specPOr[i] ) * tmp1 * /*0.923880f*/ s[120 * mult_angle]; /* cos(PI/8)*/ + specPOi[i] = sign( specPOi[i] ) * tmp1 * /*0.382683f*/ s[40 * mult_angle]; + } + else + { + specPOr[i] = sign( specPOr[i] ) * tmp1 * /*0.382683f*/ s[40 * mult_angle]; /* cos(PI*3/8)*/ + specPOi[i] = sign( specPOi[i] ) * tmp1 * /*0.923880f*/ s[120 * mult_angle]; + } + gamma -= igamma; + } + for ( ; i < end; i++ ) /* binary search from 16 angles */ + { + tmp1 = wnd[i * step + bias] * gamma; + if ( ( specPOr[i] - specPOi[i] ) * ( specPOr[i] + specPOi[i] ) > 0 ) + { + if ( ( specPOr[i] * 0.414213f - specPOi[i] ) * ( specPOr[i] * 0.414213f + specPOi[i] ) > 0 ) /*tan(PI/8)*/ + { + specPOr[i] = sign( specPOr[i] ) * tmp1 /*0.980785f */ * s[140 * mult_angle]; /* cos(PI/16)*/ + specPOi[i] = sign( specPOi[i] ) * tmp1 /*0.195090f */ * s[20 * mult_angle]; + } + else + { + specPOr[i] = sign( specPOr[i] ) * tmp1 /* 0.831470f */ * s[100 * mult_angle]; /*cos(PI*3/16)*/ + specPOi[i] = sign( specPOi[i] ) * tmp1 /* 0.555570f*/ * s[60 * mult_angle]; + } + } + else + { + if ( ( specPOr[i] - specPOi[i] * 0.414213f ) * ( specPOr[i] + specPOi[i] * 0.414213f ) > 0 ) /*tan(PI/8)*/ + { + specPOr[i] = sign( specPOr[i] ) * tmp1 /** 0.555570f*/ * s[60 * mult_angle]; /*cos(PI*5/16)*/ + specPOi[i] = sign( specPOi[i] ) * tmp1 /** 0.831470f*/ * s[100 * mult_angle]; + } + else + { + specPOr[i] = sign( specPOr[i] ) * tmp1 /** 0.195090f*/ * s[20 * mult_angle]; /*cos(PI*7/16)*/ + specPOi[i] = sign( specPOi[i] ) * tmp1 /** 0.980785f*/ * s[140 * mult_angle]; + } + } + gamma -= igamma; + } + + if ( i < n0 ) + { + gamma -= igamma * ( n0 - 320 ); + } + for ( ; i < n0; i++ ) /*neglect higher frequency bins when 48 kHz samplng*/ + { + specPOr[i] = 0.f; + specPOi[i] = 0.f; + } + specPOr[n0] = sign( specLr[n0] * specRr[n0] ) * wnd[i * step + bias] * gamma; + + + hPHA->init_frmCntr--; + if ( hPHA->init_frmCntr < 0 ) + { + hPHA->init_frmCntr = 0; + } + freq_8k = L_FRAME16k / 2; + freq_ipd_max = (int16_t) ( freq_8k * 5000.0f / ( 8000.0f * STEREO_DMX_EVS_SUBBAND_SIZE ) ); + + /* Memorize the filters N-1 */ + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + if ( hPHA->p_curr_taps[n] ) + { + hPHA->p_prev_taps[n] = hPHA->prev_taps[n]; + mvr2r( hPHA->p_curr_taps[n], hPHA->p_prev_taps[n], hPHA->pha_len ); + } + else + { + hPHA->p_prev_taps[n] = NULL; + } + } + + /* ISD */ + isd_cnt_l = 0; + isd_cnt_h = 0; + for ( i = 1; i <= freq_8k; i++ ) + { + Nr = ( specLr[i] - specRr[i] ); + Ni = ( specLi[i] - specRi[i] ); + Dr = ( specLr[i] + specRr[i] ); + Di = ( specLi[i] + specRi[i] ); + if ( ( Nr * Nr + Ni * Ni ) > STEREO_DMX_EVS_ISD_THRES_H * ( Dr * Dr + Di * Di ) ) + { + isd_cnt_h++; + } + if ( ( Nr * Nr + Ni * Ni ) < STEREO_DMX_EVS_ISD_THRES_L * ( Dr * Dr + Di * Di ) ) + { + isd_cnt_l++; + } + } + + isd_rate = (float) isd_cnt_h / (float) freq_8k; + hPHA->isd_rate_s = STEREO_DMX_EVS_ISD_FORGETTING * hPHA->isd_rate_s + ( 1.0f - STEREO_DMX_EVS_ISD_FORGETTING ) * isd_rate; + + if ( hPHA->isd_rate_s > STEREO_DMX_EVS_ISD_DIST_HYST_H ) + { + if ( hPHA->curr_pha != STEREO_DMX_EVS_PHA_IPD ) + { + if ( hPHA->prev_pha == STEREO_DMX_EVS_PHA_IPD ) + { + hPHA->pha_hys_cnt += 1; + } + else + { + hPHA->pha_hys_cnt = 0; + } + + if ( hPHA->pha_hys_cnt >= STEREO_DMX_EVS_SWTCH_HYS_THRES ) + { + hPHA->curr_pha = STEREO_DMX_EVS_PHA_IPD; + } + } + + hPHA->prev_pha = STEREO_DMX_EVS_PHA_IPD; + } + else if ( hPHA->isd_rate_s < STEREO_DMX_EVS_ISD_DIST_HYST_L ) + { + if ( hPHA->curr_pha != STEREO_DMX_EVS_PHA_IPD2 ) + { + if ( hPHA->prev_pha == STEREO_DMX_EVS_PHA_IPD2 ) + { + hPHA->pha_hys_cnt += 1; + } + else + { + hPHA->pha_hys_cnt = 0; + } + + if ( hPHA->pha_hys_cnt >= STEREO_DMX_EVS_SWTCH_HYS_THRES ) + { + hPHA->curr_pha = STEREO_DMX_EVS_PHA_IPD2; + } + } + hPHA->prev_pha = STEREO_DMX_EVS_PHA_IPD2; + } + + ipd_ff = hPHA->ipd_ff; + + Nr = 0; + Ni = 0; + eneL = 0; + eneR = 0; + + for ( n = 1, i = 1; n < nsbd; n++ ) + { + tPr = 0.0f; + tPi = 0.0f; + tEr[n] = 0.0f; + tEl[n] = 0.0f; + + for ( j = 0; j < STEREO_DMX_EVS_SUBBAND_SIZE; j++, i++ ) + { + /* Energy */ + tEl[n] += specLr[i] * specLr[i] + specLi[i] * specLi[i]; + tEr[n] += specRr[i] * specRr[i] + specRi[i] * specRi[i]; + + /* IPD */ + IPDr = specLr[i] * specRr[i] + specLi[i] * specRi[i]; + IPDi = specLi[i] * specRr[i] - specLr[i] * specRi[i]; + tPr += IPDr; + tPi += IPDi; + + /* ICCr */ + Pn = (float) inv_sqrt( ( IPDr * IPDr + IPDi * IPDi ) + EPSILON ); + IPDr *= Pn; + IPDi *= Pn; + + tIPDr = ( specRr[i] * IPDr - specRi[i] * IPDi ); + tIPDi = ( specRr[i] * IPDi + specRi[i] * IPDr ); + + Nr += ( specLr[i] * tIPDr + specLi[i] * tIPDi ); + Ni += ( specLi[i] * tIPDr - specLr[i] * tIPDi ); + + eneL += ( specLr[i] * specLr[i] + specLi[i] * specLi[i] ); + eneR += ( specRr[i] * specRr[i] + specRi[i] * specRi[i] ); + } + + Pn = (float) inv_sqrt( ( tPr * tPr + tPi * tPi ) + EPSILON ); + tPr *= Pn; + tPi *= Pn; + + if ( hPHA->init_frmCntr == 0 ) + { + Pr[n] = ipd_ff[n] * Pr[n] + ( 1.0f - ipd_ff[n] ) * tPr; + Pi[n] = ipd_ff[n] * Pi[n] + ( 1.0f - ipd_ff[n] ) * tPi; + Pn = (float) inv_sqrt( ( Pr[n] * Pr[n] + Pi[n] * Pi[n] ) + EPSILON ); + Pr[n] *= Pn; + Pi[n] *= Pn; + } + else + { + Pr[n] = tPr; + Pi[n] = tPi; + } + + Pr[n] = ( Pr[n] > 1.0f ) ? 1.0f : Pr[n]; + Pr[n] = ( Pr[n] < -1.0f ) ? -1.0f : Pr[n]; + } + ICCr = (float) sqrt( ( Nr * Nr + Ni * Ni ) / ( eneL * eneR + EPSILON ) ); + hPHA->iccr_s = STEREO_DMX_EVS_ICCR_FORGETTING * hPHA->iccr_s + ( 1.0f - STEREO_DMX_EVS_ICCR_FORGETTING ) * ICCr; + + if ( hPHA->curr_pha == STEREO_DMX_EVS_PHA_IPD ) + { + hPHA->p_curr_taps[0] = NULL; + hPHA->p_curr_taps[1] = hPHA->curr_taps[1]; + + rfft_pha_buf[0] = 1.; + rfft_pha_buf[1] = 1.; + + ild_cnt = 0; + for ( i = 1; i < nsbd; i++ ) + { + rfft_pha_buf[i * 2] = Pr[i]; + rfft_pha_buf[i * 2 + 1] = Pi[i]; + if ( ( tEr[i] > STEREO_DMX_EVS_LR_EGY * tEl[i] ) || ( tEl[i] > STEREO_DMX_EVS_LR_EGY * tEr[i] ) ) + { + ild_cnt++; + tEr[i] = 1; + } + else + { + tEr[i] = -1; + } + } + if ( ild_cnt > nsbd * STEREO_DMX_EVS_ILD_PRC ) + { + for ( i = 1; i < nsbd; i++ ) + { + if ( tEr[i] > 0 ) + { + rfft_pha_buf[i * 2] = 1.; + rfft_pha_buf[i * 2 + 1] = 0.; + } + } + } + + rfft( rfft_pha_buf, hPHA->rfft_ipd_coef, input_frame_pha, +1 ); + mvr2r( rfft_pha_buf, hPHA->p_curr_taps[1], hPHA->pha_len ); + } + else + { + if ( ( hPHA->iccr_s < STEREO_DMX_EVS_ICCR_HYST_L ) || ( ( hPHA->iccr_s < STEREO_DMX_EVS_ICCR_HYST_H ) && ( hPHA->p_curr_taps[0] != NULL ) ) ) + { + /* IPDn */ + + set_f( &( Pr[freq_ipd_max] ), 1.0f, ( nsbd - freq_ipd_max ) ); + set_f( &( Pi[freq_ipd_max] ), 0.0f, ( nsbd - freq_ipd_max ) ); + + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + hPHA->p_curr_taps[n] = hPHA->curr_taps[n]; + } + + rfft_pha_buf[0] = 1.; + rfft_pha_buf[1] = 1.; + + ild_cnt = 0; + isd_rate = (float) isd_cnt_l / freq_8k; + for ( i = 1; i < nsbd; i++ ) + { + rfft_pha_buf[i * 2] = (float) sqrt( ( 1.0f + Pr[i] ) / 2.0f ); + rfft_pha_buf[i * 2 + 1] = (float) sqrt( ( 1.0f - Pr[i] ) / 2.0f ) * sign( Pi[i] ); + if ( isd_rate > STEREO_DMX_EVS_ISD_DIST_THRES_IPD ) + { + rfft_pha_buf[i * 2 + 1] = (float) sqrt( ( 1.0f - rfft_pha_buf[i * 2] ) / 2.0f ) * sign( rfft_pha_buf[i * 2 + 1] ); + rfft_pha_buf[i * 2] = (float) sqrt( ( 1.0f + rfft_pha_buf[i * 2] ) / 2.0f ); + } + + if ( ( tEr[i] > STEREO_DMX_EVS_LR_EGY * tEl[i] ) || ( tEl[i] > STEREO_DMX_EVS_LR_EGY * tEr[i] ) ) + { + ild_cnt++; + tEr[i] = 1; + } + else + { + tEr[i] = -1; + } + } + if ( ild_cnt > nsbd * STEREO_DMX_EVS_ILD_PRC ) + { + for ( i = 1; i < nsbd; i++ ) + { + if ( tEr[i] > 0 ) + { + rfft_pha_buf[i * 2] = 1.; + rfft_pha_buf[i * 2 + 1] = 0.; + } + } + } + + rfft( rfft_pha_buf, hPHA->rfft_ipd_coef, input_frame_pha, +1 ); + mvr2r( rfft_pha_buf, hPHA->p_curr_taps[1], hPHA->pha_len ); + + /* PHA L2R */ + p_curr_taps = hPHA->p_curr_taps[0]; + p_curr_taps[0] = rfft_pha_buf[0]; + for ( i = 1; i < hPHA->pha_len; i++ ) + { + p_curr_taps[i] = rfft_pha_buf[input_frame_pha - i]; + } + } + else + { + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + hPHA->p_curr_taps[n] = NULL; + } + } + } + + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + if ( hPHA->p_curr_taps[n] ) + { + for ( i = 0; i < hPHA->pha_len; i++ ) + { + hPHA->p_curr_taps[n][i] *= hPHA->win[i]; + } + + energy = 0.; + for ( i = 0; i < hPHA->pha_len; i++ ) + { + energy += hPHA->p_curr_taps[n][i] * hPHA->p_curr_taps[n][i]; + } + energy = (float) inv_sqrt( energy + EPSILON ); + for ( i = 0; i < hPHA->pha_len; i++ ) + { + hPHA->p_curr_taps[n][i] *= energy; + } + } + } + + + rfft_buf[0] = specPOr[0]; + rfft_buf[1] = specPOr[n0]; + for ( i = 1; i < n0; i++ ) + { + rfft_buf[i * 2] = specPOr[i]; + rfft_buf[i * 2 + 1] = specPOi[i]; + } + + rfft( rfft_buf, rfft_coef, input_frame, +1 ); + + tmp1 = rfft_buf[0]; + tmpPOC1[n0] = tmp1 * tmp1; + + for ( i = 1; i < hPOC->shift_limit + 1; i++ ) + { + n1 = n0 + i; + n2 = n0 - i; + + tmp1 = rfft_buf[i]; + tmpPOC1[n1] = tmp1 * tmp1; + + tmp1 = rfft_buf[input_frame - i]; + tmpPOC1[n2] = tmp1 * tmp1; + } + + tmp1 = STEREO_DMX_EVS_POC_SMOOTH * tmpPOC1[n0] + 0.5f * ( 1.0f - STEREO_DMX_EVS_POC_SMOOTH ) * ( tmpPOC1[n0 - 1] + tmpPOC1[n0 + 1] ); + tmpPOC2[n0] = max( tmp1, 0.0f ); + + for ( i = 1; i < hPOC->shift_limit; i++ ) + { + n1 = n0 + i; + n2 = n0 - i; + tmp1 = STEREO_DMX_EVS_POC_SMOOTH * tmpPOC1[n1] + 0.5f * ( 1.0f - STEREO_DMX_EVS_POC_SMOOTH ) * ( tmpPOC1[n1 - 1] + tmpPOC1[n1 + 1] ); + tmp2 = STEREO_DMX_EVS_POC_SMOOTH * tmpPOC1[n2] + 0.5f * ( 1.0f - STEREO_DMX_EVS_POC_SMOOTH ) * ( tmpPOC1[n2 - 1] + tmpPOC1[n2 + 1] ); + tmpPOC2[n1] = max( tmp1, 0.0f ); + tmpPOC2[n2] = max( tmp2, 0.0f ); + } + + P[n0] = P[n0] * STEREO_DMX_EVS_POC_FORGETTING + tmpPOC2[n0] * ( 1.0f - STEREO_DMX_EVS_POC_FORGETTING ); + + for ( i = 1; i < hPOC->shift_limit; i++ ) + { + n1 = n0 + i; + n2 = n0 - i; + + if ( i == -itdLR[1] ) + { + P[n1] = P[n1] * STEREO_DMX_EVS_TARGET_POC_FORGETTING + tmpPOC2[n1] * ( 1.0f - STEREO_DMX_EVS_TARGET_POC_FORGETTING ); + } + else + { + P[n1] = P[n1] * STEREO_DMX_EVS_POC_FORGETTING + tmpPOC2[n1] * ( 1.0f - STEREO_DMX_EVS_POC_FORGETTING ); + } + + if ( i == itdLR[0] ) + { + P[n2] = P[n2] * STEREO_DMX_EVS_TARGET_POC_FORGETTING + tmpPOC2[n2] * ( 1.0f - STEREO_DMX_EVS_TARGET_POC_FORGETTING ); + } + else + { + P[n2] = P[n2] * STEREO_DMX_EVS_POC_FORGETTING + tmpPOC2[n2] * ( 1.0f - STEREO_DMX_EVS_POC_FORGETTING ); + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * find_poc_peak() + * + * find peak phase only correlation + *-------------------------------------------------------------------*/ + +static float find_poc_peak( + STEREO_DMX_EVS_POC_HANDLE hPOC, /* i/o: phase only correlation structure */ + float itd[], /* o : estimated itd */ + const int16_t input_frame, /* i : input frame length per channel */ + const float ratio /* i : adapting ratio */ +) +{ + int16_t itd_cand[CPE_CHANNELS], i, n, cnt[CPE_CHANNELS], Lh, peak_range, *on, *itdLR, prev_off[CPE_CHANNELS]; + float Q[CPE_CHANNELS], aQ[CPE_CHANNELS], cQ[CPE_CHANNELS], width, eps, cconfidence, *peak_width, *peakQ; + float *P, tmpf; + float eps2; + + /* Initialization */ + Lh = input_frame / 2; + on = hPOC->ispeak; + itdLR = hPOC->itdLR; + width = 0.38f; + eps = 1.0f / (float) input_frame; + peak_width = hPOC->peak_width; + peakQ = hPOC->peakQ; + Q[0] = hPOC->P[Lh]; + Q[1] = 0.0f; + itd_cand[0] = itd_cand[1] = 0; + P = hPOC->P; + + for ( i = 1; i < hPOC->shift_limit; i++ ) /*find peaks of POC P[] with positive and negative ITD */ + { + if ( P[Lh - i] > Q[0] ) + { + Q[0] = P[Lh - i]; + itd_cand[0] = i; + } + if ( P[Lh + i] > Q[1] ) + { + Q[1] = P[Lh + i]; + itd_cand[1] = -i; + } + } + + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + prev_off[n] = !on[n]; + + aQ[n] = Q[n] * width; + cnt[n] = 0; + cQ[n] = P[Lh - itd_cand[n]]; + + peak_range = (int16_t) ( abs( itd_cand[n] ) + hPOC->shift_limit / STEREO_DMX_EVS_FIND_POC_PEAK_TAU ) / STEREO_DMX_EVS_FIND_POC_PEAK_TAU2; + + for ( i = 1; i <= peak_range; i++ ) + { + cnt[n] += ( P[Lh - itd_cand[n] + i] > aQ[n] ) + ( P[Lh - itd_cand[n] - i] > aQ[n] ); + cQ[n] += P[Lh - itd_cand[n] + i] + P[Lh - itd_cand[n] - i]; + } + + peak_width[n] = peak_width[n] * ratio + (float) cnt[n] * ( 1.0f - ratio ); + eps2 = eps * peak_width[n] * 0.25f; + Q[n] = ( 1.0f - ( cQ[n] / ( peak_range * 2 + 1 ) + eps2 ) / ( Q[n] + eps2 ) ); + Q[n] = max( Q[n], 0.0f ); + + if ( on[n] ) /*if channel n was active (likely to be preceding) in the previous frame*/ + { + tmpf = ( 0.3f - 0.2f * (float) abs( itd_cand[n] ) / (float) hPOC->shift_limit ) * peakQ[n]; + if ( Q[n] < tmpf ) + { + itdLR[n] = 0; + on[n] = 0; + peakQ[n] = 0.0f; + Q[n] = 0.0f; + } + else if ( Q[n] > 1.25f * peakQ[n] ) + { + itdLR[n] = itd_cand[n]; + } + + peakQ[n] = max( peakQ[n], Q[n] ); + } + else /*if channel n was not active (not likely to be preceding) in the previous frame*/ + { + tmpf = ( 0.75f - 0.2f * (float) abs( itd_cand[n] ) / (float) hPOC->shift_limit ); + + if ( Q[n] < tmpf ) + { + itdLR[n] = 0; + Q[n] = 0.0f; + } + else + { + itdLR[n] = itd_cand[n]; + on[n] = 1; + } + } + } + + if ( ( on[0] && prev_off[0] ) && ( on[1] && prev_off[1] ) ) /*if both channels have newly detected as active (possibility of preceding), select channel by peakness Q[] of POC */ + { + *itd = ( Q[0] > Q[1] ) ? (float) itdLR[0] : (float) itdLR[1]; + } + else if ( ( on[0] && prev_off[0] ) && ( Q[0] > ( Q[1] - 0.1 ) ) ) /* if channel 0 becomes active, select channel 0*/ + { + *itd = (float) itdLR[0]; + } + else if ( ( on[1] && prev_off[1] ) && ( Q[1] > ( Q[0] - 0.1 ) ) ) /*if channel 1 becomes active, selsect channel 1*/ + { + *itd = (float) itdLR[1]; + } + else if ( Q[0] > ( Q[1] + Q_BAND ) ) /* if no status change, use Q[]*/ + { + *itd = (float) itdLR[0]; + } + else if ( Q[1] > ( Q[0] + Q_BAND ) ) /* if no status change, use Q[]*/ + { + *itd = (float) itdLR[1]; + } + else if ( *itd == 0.0 ) /*if no channels are likely to be preceding, follow the status of the previous frame*/ + { + *itd = 0; + } + else /*follow the status of the previous frame*/ + { + *itd = ( *itd > 0 ) ? (float) itdLR[0] : (float) itdLR[1]; + } + + cconfidence = sqrtf( fabsf( Q[0] - Q[1] ) ); /*higher value indicates higher confidence for one preceding channel*/ + + return hPOC->confidence = hPOC->confidence * STEREO_DMX_EVS_CORR_FORGETTING + cconfidence * ( 1.0f - STEREO_DMX_EVS_CORR_FORGETTING ); +} + + +/*-------------------------------------------------------------------* + * estimate_itd() + * + * estimate itd + *-------------------------------------------------------------------*/ + +static ivas_error estimate_itd( + float *corr, /* o : correlation */ + STEREO_DMX_EVS_POC_HANDLE hPOC, /* i/o: phase only correlation structure */ + STEREO_DMX_EVS_PHA_HANDLE hPHA, /* i/o: correlation filter structure */ + const float srcL[], /* i : Lch input signal */ + const float srcR[], /* i : Rch input signal */ + float itd[], /* o : estimated itd */ + const int16_t input_frame /* i : input frame length per channel */ +) +{ + float specLr[L_FRAME48k / 2 + 1], specLi[L_FRAME48k / 2 + 1], specRr[L_FRAME48k / 2 + 1], specRi[L_FRAME48k / 2 + 1]; + float rfft_coef[L_FRAME48k]; + const float *p_w; + int16_t n, n0, n1; + int16_t rfft_coef_step; + ivas_error error; + + error = IVAS_ERR_OK; + + n0 = input_frame >> 1; + n1 = input_frame >> 2; + + if ( input_frame == L_FRAME16k ) + { + p_w = dft_trigo_32k; + rfft_coef_step = 4; + } + else if ( input_frame == L_FRAME32k ) + { + p_w = dft_trigo_32k; + rfft_coef_step = 2; + } + else if ( input_frame == L_FRAME48k ) + { + p_w = dft_trigo_48k; + rfft_coef_step = 2; + } + else + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "failed estimate_itd()\n" ); + } + + for ( n = 0; n < n1; n++ ) + { + rfft_coef[n] = p_w[n * rfft_coef_step]; + rfft_coef[n0 - n] = p_w[n * rfft_coef_step]; + } + rfft_coef[n1] = p_w[n1 * rfft_coef_step]; + + estimate_itd_wnd_fft( srcL, specLr, specLi, rfft_coef, hPOC->wnd, input_frame ); + estimate_itd_wnd_fft( srcR, specRr, specRi, rfft_coef, hPOC->wnd, input_frame ); + + calc_poc( hPOC, hPHA, hPOC->wnd, rfft_coef, specLr, specLi, specRr, specRi, input_frame ); + *corr = find_poc_peak( hPOC, itd, input_frame, STEREO_DMX_EVS_POC_W_FORGETTING ); + + return error; +} + + +/*-------------------------------------------------------------------* + * weighted_ave() + * + * create weighted downmix signal + *-------------------------------------------------------------------*/ + +static void weighted_ave( + const float src1[], /* i : Lch input signal */ + const float src2[], /* i : Rch input signal */ + float dst[], /* o : output signal */ + const float gain, /* i : adapting gain */ + const float old_gain, /* i : adapting prev gain */ + const int16_t input_frame, /* i : input frame length per channel */ + const float wnd[] /* i : window coef */ +) +{ + int16_t i, len; + float gain_tmp = 0.f, gain_sub; + + len = input_frame >> 4; + gain_sub = gain - old_gain; + + for ( i = 0; i < len; i++ ) + { + gain_tmp = old_gain + gain_sub * wnd[i]; + dst[i] = src1[i] * gain_tmp + src2[i] * ( 1.0f - gain_tmp ); + } + for ( ; i < input_frame; i++ ) + { + dst[i] = src1[i] * gain + src2[i] * ( 1.0f - gain_tmp ); + } + + return; +} + + +/*-------------------------------------------------------------------* + * calc_energy() + * + * calculate energy + *-------------------------------------------------------------------*/ + +static void calc_energy( + const float src1[], /* i : Lch input signal */ + const float src2[], /* i : Rch input signal */ + float energy[], /* o : calculated energy */ + const int16_t input_frame, /* i : input frame length per channel */ + const float ratio /* i : adapting ratio */ +) +{ + float E, wnd, wnd_diff; + int16_t i, adaptlen; + + /* Initialization */ + E = 0.0f; + adaptlen = input_frame >> 4; + wnd = 0.5f / (float) adaptlen; + wnd_diff = 1.0f / (float) adaptlen; + + for ( i = 0; i < adaptlen; i++ ) + { + E += ( src1[i] * wnd ) * ( src2[i] * wnd ); + + wnd += wnd_diff; + } + for ( ; i < input_frame - adaptlen; i++ ) + { + E += src1[i] * src2[i]; + } + for ( ; i < input_frame; i++ ) + { + wnd -= wnd_diff; + + E += ( src1[i] * wnd ) * ( src2[i] * wnd ); + } + + *energy = *energy * ratio + ( E / (float) input_frame ) * ( 1.0f - ratio ); + + return; +} + + +/*-------------------------------------------------------------------* + * adapt_gain() + * + * adapt gain to the signal + *-------------------------------------------------------------------*/ + +static void adapt_gain( + const float src[], /* i : input signal */ + float dst[], /* o : output signal */ + const float gain, /* i : adapting gain */ + const float old_gain, /* i : adapting prev gain */ + const int16_t input_frame, /* i : input frame length per channel */ + const float wnd[] /* i : window coef */ +) +{ + int16_t i, len; + float gain_tmp, gain_sub; + + len = input_frame >> 4; + gain_sub = gain - old_gain; + + for ( i = 0; i < len; i++ ) + { + gain_tmp = old_gain + gain_sub * wnd[i]; + dst[i] = src[i] * gain_tmp; + } + for ( ; i < input_frame; i++ ) + { + dst[i] = src[i] * gain; + } + + return; +} + + +/*-------------------------------------------------------------------* + * create_M_signal() + * + * create downmix signal + *-------------------------------------------------------------------*/ + +static void create_M_signal( + const float srcL[], /* i : Lch input signal */ + const float srcR[], /* i : Rch input signal */ + float dmx[], /* o : output signal */ + const float w_curr, /* i : adapting weight */ + const int16_t input_frame, /* i : input frame length per channel */ + const float wnd[], /* i : window coef */ + float *w_prev, /* i/o: adapting prev weight */ + float *dmx_energy, /* i/o: downmix signal energy */ + float *src_energy /* i/o: input signal energy */ +) +{ + float weighted[L_FRAME48k], eps, amp_mod[CPE_CHANNELS], Lbias; + + /* Initialization */ + eps = 1024.0f; + Lbias = ( w_prev[2] == 0 ) ? 4.0f : 0.25f; + + weighted_ave( srcL, srcR, dmx, w_curr, w_prev[0], input_frame, wnd ); + + calc_energy( srcL, srcL, src_energy, input_frame, STEREO_DMX_EVS_DMX_EGY_FORGETTING ); + calc_energy( srcR, srcR, src_energy + 1, input_frame, STEREO_DMX_EVS_DMX_EGY_FORGETTING ); + calc_energy( dmx, dmx, dmx_energy, input_frame, STEREO_DMX_EVS_DMX_EGY_FORGETTING ); + + if ( src_energy[0] * Lbias > src_energy[1] ) + { + amp_mod[0] = 1.0f - sqrtf( ( dmx_energy[0] + eps ) / ( src_energy[0] + eps ) ); + amp_mod[0] = max( amp_mod[0], 0.0f ); + amp_mod[1] = 0.0f; + } + else + { + amp_mod[1] = 1.0f - sqrtf( ( dmx_energy[0] + eps ) / ( src_energy[1] + eps ) ); + amp_mod[1] = max( amp_mod[1], 0.0f ); + amp_mod[0] = 0.0f; + } + + adapt_gain( srcL, weighted, amp_mod[0], w_prev[1], input_frame, wnd ); + v_add( dmx, weighted, dmx, input_frame ); + adapt_gain( srcR, weighted, amp_mod[1], w_prev[2], input_frame, wnd ); + v_add( dmx, weighted, dmx, input_frame ); + + w_prev[0] = w_curr; + w_prev[1] = amp_mod[0]; + w_prev[2] = amp_mod[1]; + + return; +} + + +/*-------------------------------------------------------------------* + * stereo_dmx_evs_enc() + * + * Stereo downmix for EVS encoder routine + *-------------------------------------------------------------------*/ + +void stereo_dmx_evs_enc( + STEREO_DMX_EVS_ENC_HANDLE hStereoDmxEVS, /* i/o: Stereo downmix for EVS encoder handle */ + const int32_t input_Fs, /* i : input sampling rate */ + int16_t data[CPE_CHANNELS * L_FRAME48k], /* i/o: input signal */ + const int16_t n_samples, /* i : number of input samples */ + const bool is_binaural /* i : indication that input is binaural audio */ +) +{ + int16_t n; + float dmx_weight, corr; + float data_f[CPE_CHANNELS][L_FRAME48k]; + + int16_t k, m, pha_len, fad_len; + float mem_prev[STEREO_DMX_EVS_FAD_LEN_MAX], data_mem[STEREO_DMX_EVS_DATA_LEN_MAX]; + float *p_data_mem, *p_prev_taps, *p_curr_taps, *fad_g, *p_data; + float dmx_poc_data[L_FRAME48k], dmx_pha_data[L_FRAME48k], *p_dmx_data, ftmp; + STEREO_DMX_EVS_PRC curr_prc; + int16_t input_subframe, is_transient; + float *p_sub_frame, subframe_energy[STEREO_DMX_EVS_NB_SBFRM]; + + int16_t input_frame; + + if ( is_binaural ) + { + /* use of is_binaural flag is to be considered */ + } + + input_frame = (int16_t) ( input_Fs / FRAMES_PER_SEC ); + + for ( n = 0; n < input_frame; n++ ) + { + data_f[0][n] = (float) data[2 * n]; + data_f[1][n] = (float) data[2 * n + 1]; + } + if ( n_samples < input_frame ) + { + set_f( data_f[0] + n_samples, 0.0f, input_frame - n_samples ); + set_f( data_f[1] + n_samples, 0.0f, input_frame - n_samples ); + } + + + input_subframe = n_samples / STEREO_DMX_EVS_NB_SBFRM; + is_transient = 0; + for ( k = 0; k < CPE_CHANNELS; k++ ) + { + ftmp = 0; + for ( m = 0; m < STEREO_DMX_EVS_NB_SBFRM; m++ ) + { + p_sub_frame = &( data_f[k][m * input_subframe] ); + subframe_energy[m] = 0; + for ( n = 0; n < input_subframe; n++ ) + { + subframe_energy[m] += p_sub_frame[n] * p_sub_frame[n]; + } + + if ( subframe_energy[m] / ( hStereoDmxEVS->hPHA->trns_aux_energy[k] + EPSILON ) > hStereoDmxEVS->hPHA->crst_fctr ) + { + is_transient = 1; + } + + if ( hStereoDmxEVS->hPHA->init_frmCntr == 0 ) + { + hStereoDmxEVS->hPHA->trns_aux_energy[k] = STEREO_DMX_EVS_TRNS_EGY_FORGETTING * hStereoDmxEVS->hPHA->trns_aux_energy[k] + ( 1.0f - STEREO_DMX_EVS_TRNS_EGY_FORGETTING ) * subframe_energy[m]; + } + else + { + hStereoDmxEVS->hPHA->trns_aux_energy[k] = 0.5f * hStereoDmxEVS->hPHA->trns_aux_energy[k] + 0.5f * subframe_energy[m]; + } + + ftmp += subframe_energy[m]; + } + + for ( m = 1; m < STEREO_DMX_EVS_NB_SBFRM; m++ ) + { + if ( subframe_energy[m] / ( subframe_energy[m - 1] + EPSILON ) > STEREO_DMX_EVS_TRNS_DTC_INST ) + { + is_transient = 1; + } + } + } + + estimate_itd( &corr, hStereoDmxEVS->hPOC, hStereoDmxEVS->hPHA, data_f[0], data_f[1], &hStereoDmxEVS->itd, input_frame ); + + /* poc */ + + if ( hStereoDmxEVS->itd ) + { + dmx_weight = ( ( hStereoDmxEVS->itd > 0 ) ? ( -1 ) : 1 ) * 0.5f * corr + 0.5f; + } + else + { + dmx_weight = 0.5f; + } + + create_M_signal( data_f[0], data_f[1], dmx_poc_data, dmx_weight, input_frame, hStereoDmxEVS->s_wnd, + hStereoDmxEVS->dmx_weight, hStereoDmxEVS->pre_dmx_energy, hStereoDmxEVS->aux_dmx_energy ); + + /* pha */ + + pha_len = hStereoDmxEVS->hPHA->pha_len; + fad_len = hStereoDmxEVS->hPHA->fad_len; + fad_g = hStereoDmxEVS->hPHA->fad_g; + + set_zero( dmx_pha_data, n_samples ); + set_zero( mem_prev, fad_len ); + + for ( k = 0; k < CPE_CHANNELS; k++ ) + { + p_data = data_f[k]; + mvr2r( hStereoDmxEVS->hPHA->data_mem[k], data_mem, pha_len ); + mvr2r( &( p_data[n_samples - pha_len] ), hStereoDmxEVS->hPHA->data_mem[k], pha_len ); + p_data_mem = &( data_mem[pha_len] ); + mvr2r( p_data, p_data_mem, n_samples ); + + p_prev_taps = hStereoDmxEVS->hPHA->p_prev_taps[k]; + if ( p_prev_taps ) + { + for ( n = 0; n < fad_len; n++ ) + { + for ( ftmp = 0, m = 0; m < pha_len; m++ ) + { + ftmp += p_data_mem[n - m] * p_prev_taps[m]; + } + mem_prev[n] += ftmp * INV_SQRT_2; + } + } + else + { + for ( n = 0; n < fad_len; n++ ) + { + mem_prev[n] += p_data[n] * INV_SQRT_2; + } + } + + p_curr_taps = hStereoDmxEVS->hPHA->p_curr_taps[k]; + if ( p_curr_taps ) + { + for ( n = 0; n < n_samples; n++ ) + { + for ( ftmp = 0, m = 0; m < pha_len; m++ ) + { + ftmp += p_data_mem[n - m] * p_curr_taps[m]; + } + dmx_pha_data[n] += ftmp * INV_SQRT_2; + } + } + else + { + for ( n = 0; n < n_samples; n++ ) + { + dmx_pha_data[n] += p_data[n] * INV_SQRT_2; + } + } + } + + for ( n = 0, m = ( fad_len - 1 ); n < fad_len; n++, m-- ) + { + dmx_pha_data[n] *= fad_g[n]; + dmx_pha_data[n] += ( mem_prev[n] ) * fad_g[m]; + } + + /* prc switch */ + + curr_prc = hStereoDmxEVS->hPHA->curr_prc; + if ( abs( (int16_t) hStereoDmxEVS->itd ) > hStereoDmxEVS->hPHA->prc_thres ) + { + if ( hStereoDmxEVS->hPHA->curr_prc != STEREO_DMX_EVS_PRC_POC ) + { + if ( hStereoDmxEVS->hPHA->prev_prc == STEREO_DMX_EVS_PRC_POC ) + { + hStereoDmxEVS->hPHA->prc_hys_cnt += 1; + } + else + { + hStereoDmxEVS->hPHA->prc_hys_cnt = 0; + } + + if ( hStereoDmxEVS->hPHA->prc_hys_cnt >= STEREO_DMX_EVS_SWTCH_PRC_HYS_THRES ) + { + hStereoDmxEVS->hPHA->curr_prc = STEREO_DMX_EVS_PRC_POC; + } + } + hStereoDmxEVS->hPHA->prev_prc = STEREO_DMX_EVS_PRC_POC; + } + else + { + if ( hStereoDmxEVS->hPHA->curr_prc != STEREO_DMX_EVS_PRC_PHA ) + { + if ( hStereoDmxEVS->hPHA->prev_prc == STEREO_DMX_EVS_PRC_PHA ) + { + hStereoDmxEVS->hPHA->prc_hys_cnt += 1; + } + else + { + hStereoDmxEVS->hPHA->prc_hys_cnt = 0; + } + + if ( hStereoDmxEVS->hPHA->prc_hys_cnt >= STEREO_DMX_EVS_SWTCH_PRC_HYS_THRES ) + { + hStereoDmxEVS->hPHA->curr_prc = STEREO_DMX_EVS_PRC_PHA; + } + } + hStereoDmxEVS->hPHA->prev_prc = STEREO_DMX_EVS_PRC_PHA; + } + + if ( ( is_transient == 1 ) || ( hStereoDmxEVS->aux_dmx_energy[0] > STEREO_DMX_EVS_ILDS_EGY * hStereoDmxEVS->aux_dmx_energy[1] ) || ( hStereoDmxEVS->aux_dmx_energy[1] > STEREO_DMX_EVS_ILDS_EGY * hStereoDmxEVS->aux_dmx_energy[0] ) || ( ( hStereoDmxEVS->hPHA->p_curr_taps[0] == NULL ) && ( hStereoDmxEVS->hPHA->p_curr_taps[1] == NULL ) ) ) + { + hStereoDmxEVS->hPHA->curr_prc = STEREO_DMX_EVS_PRC_POC; + hStereoDmxEVS->hPHA->prc_hys_cnt = 0; + } + + if ( hStereoDmxEVS->hPHA->curr_prc == STEREO_DMX_EVS_PRC_POC ) + { + p_dmx_data = dmx_poc_data; + + if ( curr_prc != hStereoDmxEVS->hPHA->curr_prc ) + { + fad_len = hStereoDmxEVS->hPHA->fad_len_prc; + fad_g = hStereoDmxEVS->hPHA->fad_g_prc; + + for ( n = 0, m = ( fad_len - 1 ); n < fad_len; n++, m-- ) + { + p_dmx_data[n] *= fad_g[n]; + p_dmx_data[n] += fad_g[m] * dmx_pha_data[n]; + } + } + } + else + { + p_dmx_data = dmx_pha_data; + + if ( curr_prc != hStereoDmxEVS->hPHA->curr_prc ) + { + fad_len = hStereoDmxEVS->hPHA->fad_len_prc; + fad_g = hStereoDmxEVS->hPHA->fad_g_prc; + + for ( n = 0, m = ( fad_len - 1 ); n < fad_len; n++, m-- ) + { + p_dmx_data[n] *= fad_g[n]; + p_dmx_data[n] += fad_g[m] * dmx_poc_data[n]; + } + } + } + + mvr2s( p_dmx_data, data, n_samples ); + + + return; +} + + +/*-------------------------------------------------------------------* + * stereo_dmx_evs_init_encoder() + * + * open and initialize stereo downmix for EVS encoder + *-------------------------------------------------------------------*/ + +ivas_error stereo_dmx_evs_init_encoder( + STEREO_DMX_EVS_ENC_HANDLE *hStereoDmxEVS_out, /* o : Stereo downmix for EVS encoder handle */ + const int32_t input_Fs /* i : input sampling rate */ +) +{ + STEREO_DMX_EVS_ENC_HANDLE hStereoDmxEVS; + int16_t n, input_frame; + + int16_t m, len, pha_len, fad_len, fad_len2, trans_len, itrh, rfft_ipd_coef_step, n0, input_frame_pha; + float *win, *fad_g, fad_r, tmp_r, a_min, a_max, a_step, *ipd_ff; + const float *p_ipd_w; + + input_frame = (int16_t) ( input_Fs / FRAMES_PER_SEC ); + + hStereoDmxEVS = NULL; + if ( ( hStereoDmxEVS = (STEREO_DMX_EVS_ENC_HANDLE) malloc( sizeof( STEREO_DMX_EVS_ENC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for STEREO_DMX_EVS_ENC_DATA\n" ) ); + } + + hStereoDmxEVS->itd = 0.0f; + hStereoDmxEVS->pre_dmx_energy[0] = 0.0f; + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + hStereoDmxEVS->aux_dmx_energy[n] = 0.0f; + } + + hStereoDmxEVS->dmx_weight[0] = 0.5f; + hStereoDmxEVS->dmx_weight[1] = 0.0f; + hStereoDmxEVS->dmx_weight[2] = 0.0f; + + if ( input_frame == L_FRAME16k ) + { + hStereoDmxEVS->s_wnd = Stereo_dmx_s_wnd_coef_16k; + } + else if ( input_frame == L_FRAME32k ) + { + hStereoDmxEVS->s_wnd = Stereo_dmx_s_wnd_coef_32k; + } + else if ( input_frame == L_FRAME48k ) + { + hStereoDmxEVS->s_wnd = Stereo_dmx_s_wnd_coef_48k; + } + else + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "invalid frame length\n" ); + } + + hStereoDmxEVS->hPOC = NULL; + if ( ( hStereoDmxEVS->hPOC = (STEREO_DMX_EVS_POC_HANDLE) malloc( sizeof( STEREO_DMX_EVS_POC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for STEREO_DMX_EVS_POC_DATA\n" ) ); + } + + hStereoDmxEVS->hPOC->shift_limit = (int16_t) ( STEREO_DMX_EVS_SHIFT_LIMIT * input_Fs / 1000 ); + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + hStereoDmxEVS->hPOC->peakQ[n] = 0.0f; + hStereoDmxEVS->hPOC->peak_width[n] = (float) hStereoDmxEVS->hPOC->shift_limit / 2; + hStereoDmxEVS->hPOC->ispeak[n] = 0; + hStereoDmxEVS->hPOC->itdLR[n] = 0; + } + set_f( hStereoDmxEVS->hPOC->P, 0.0f, L_FRAME48k ); + + if ( input_frame == L_FRAME16k ) + { + hStereoDmxEVS->hPOC->wnd = Stereo_dmx_wnd_coef_48k; + } + else if ( input_frame == L_FRAME32k ) + { + hStereoDmxEVS->hPOC->wnd = Stereo_dmx_wnd_coef_32k; + } + else if ( input_frame == L_FRAME48k ) + { + hStereoDmxEVS->hPOC->wnd = Stereo_dmx_wnd_coef_48k; + } + else + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "invalid frame length\n" ); + } + hStereoDmxEVS->hPOC->eps = 2.0f * EVS_PI / ( (float) input_frame ); + + if ( input_frame == L_FRAME16k ) + { + hStereoDmxEVS->hPOC->sin = dft_trigo_32k; + } + else if ( input_frame == L_FRAME32k ) + { + hStereoDmxEVS->hPOC->sin = dft_trigo_32k; + } + else if ( input_frame == L_FRAME48k ) + { + hStereoDmxEVS->hPOC->sin = dft_trigo_48k; + } + else + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "invalid frame length\n" ); + } + + hStereoDmxEVS->hPOC->confidence = 0.0f; + + hStereoDmxEVS->hPHA = NULL; + if ( ( hStereoDmxEVS->hPHA = (STEREO_DMX_EVS_PHA_HANDLE) malloc( sizeof( STEREO_DMX_EVS_PHA_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for STEREO_DMX_EVS_CORFILT_DATA\n" ) ); + } + + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + hStereoDmxEVS->hPHA->p_curr_taps[n] = NULL; + hStereoDmxEVS->hPHA->p_prev_taps[n] = NULL; + + set_zero( hStereoDmxEVS->hPHA->data_mem[n], STEREO_DMX_EVS_PHA_LEN_MAX ); + set_zero( hStereoDmxEVS->hPHA->curr_taps[n], STEREO_DMX_EVS_PHA_LEN_MAX ); + } + + if ( input_Fs == 16000 ) + { + len = STEREO_DMX_EVS_PHA_LEN_16; + hStereoDmxEVS->hPHA->fad_len = STEREO_DMX_EVS_FAD_LEN_16; + hStereoDmxEVS->hPHA->prc_thres = STEREO_DMX_EVS_SWTCH_PRC_THRES_16; + hStereoDmxEVS->hPHA->crst_fctr = STEREO_DMX_EVS_CRST_FCTR_16; + } + else if ( input_Fs == 32000 ) + { + len = STEREO_DMX_EVS_PHA_LEN_32; + hStereoDmxEVS->hPHA->fad_len = STEREO_DMX_EVS_FAD_LEN_32; + hStereoDmxEVS->hPHA->prc_thres = STEREO_DMX_EVS_SWTCH_PRC_THRES_32; + hStereoDmxEVS->hPHA->crst_fctr = STEREO_DMX_EVS_CRST_FCTR_32; + } + else if ( input_Fs == 48000 ) + { + len = STEREO_DMX_EVS_PHA_LEN_48; + hStereoDmxEVS->hPHA->fad_len = STEREO_DMX_EVS_FAD_LEN_48; + hStereoDmxEVS->hPHA->prc_thres = STEREO_DMX_EVS_SWTCH_PRC_THRES_48; + hStereoDmxEVS->hPHA->crst_fctr = STEREO_DMX_EVS_CRST_FCTR_48; + } + else + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "invalid sampling frequency\n" ); + } + + hStereoDmxEVS->hPHA->pha_len = len / 2; + hStereoDmxEVS->hPHA->init_frmCntr = (int16_t) ( FRAMES_PER_SEC * 0.2f ); + hStereoDmxEVS->hPHA->isd_rate_s = 0.0f; + hStereoDmxEVS->hPHA->iccr_s = 0.0f; + + pha_len = hStereoDmxEVS->hPHA->pha_len; + fad_len = hStereoDmxEVS->hPHA->fad_len; + + trans_len = (int16_t) ( (float) pha_len / 20.0f ); + set_f( hStereoDmxEVS->hPHA->win, 1.8f, pha_len - trans_len ); + hStereoDmxEVS->hPHA->win[0] = 1.0f; + tmp_r = 1.0f / ( ( trans_len * 2 ) + 1 ); + win = &( hStereoDmxEVS->hPHA->win[pha_len - trans_len] ); + for ( n = 0; n < trans_len; n++ ) + { + win[n] = ( 0.5f * ( 1.0f + cosf( ( PI2 * ( n + 1 ) ) * tmp_r ) ) ) * 1.8f; + } + + fad_g = hStereoDmxEVS->hPHA->fad_g; + fad_r = 1.0f / (float) ( fad_len + 1 ); + fad_len2 = fad_len / 2; + for ( n = 0, m = ( fad_len - 1 ); n < fad_len2; n++, m-- ) + { + fad_g[n] = (float) ( n + 1 ) * fad_r; + fad_g[m] = 1.0f - fad_g[n]; + } + + hStereoDmxEVS->hPHA->curr_pha = STEREO_DMX_EVS_PHA_IPD; + hStereoDmxEVS->hPHA->prev_pha = STEREO_DMX_EVS_PHA_IPD; + hStereoDmxEVS->hPHA->pha_hys_cnt = 0; + + /* Compute the forgetting factor */ + a_min = 0.8576958985908941f; + a_max = 0.9440608762859234f; + itrh = (int16_t) ( ( 3000 * input_frame ) / ( input_Fs * STEREO_DMX_EVS_SUBBAND_SIZE ) ); /* 3kHz */ + n0 = L_FRAME16k / ( 2 * STEREO_DMX_EVS_SUBBAND_SIZE ); + a_step = ( a_min - a_max ) / ( n0 + 1 - itrh ); + ipd_ff = hStereoDmxEVS->hPHA->ipd_ff; + for ( n = 0; n < itrh; n++ ) + { + ipd_ff[n] = a_max; + } + for ( ; n < ( n0 + 1 ); n++ ) /* 8kHz */ + { + ipd_ff[n] = a_max + ( n - itrh ) * a_step; + } + for ( ; n < STEREO_DMX_EVS_NB_SUBBAND_MAX; n++ ) + { + ipd_ff[n] = a_min; + } + set_f( hStereoDmxEVS->hPHA->Pr, 1.0, STEREO_DMX_EVS_NB_SUBBAND_MAX ); + set_zero( hStereoDmxEVS->hPHA->Pi, STEREO_DMX_EVS_NB_SUBBAND_MAX ); + + n0 = input_frame / ( 4 * STEREO_DMX_EVS_SUBBAND_SIZE ); + input_frame_pha = input_frame / ( 2 * STEREO_DMX_EVS_SUBBAND_SIZE ); + + if ( input_frame == L_FRAME16k ) + { + p_ipd_w = dft_trigo_32k; + rfft_ipd_coef_step = 4; + } + else if ( input_frame == L_FRAME32k ) + { + p_ipd_w = dft_trigo_32k; + rfft_ipd_coef_step = 2; + } + else if ( input_frame == L_FRAME48k ) + { + p_ipd_w = dft_trigo_48k; + rfft_ipd_coef_step = 2; + } + else + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "invalid sampling frequency\n" ); + } + + win = hStereoDmxEVS->hPHA->rfft_ipd_coef; + len = rfft_ipd_coef_step * STEREO_DMX_EVS_SUBBAND_SIZE; + for ( n = 0; n < n0; n++ ) + { + win[n] = p_ipd_w[n * len]; + win[input_frame_pha - n] = p_ipd_w[n * len]; + } + win[n0] = p_ipd_w[n0 * len]; + + hStereoDmxEVS->hPHA->curr_prc = STEREO_DMX_EVS_PRC_POC; + hStereoDmxEVS->hPHA->prev_prc = STEREO_DMX_EVS_PRC_POC; + hStereoDmxEVS->hPHA->prc_hys_cnt = 0; + + hStereoDmxEVS->hPHA->fad_len_prc = (int16_t) ( STEREO_DMX_EVS_FADE_LEN_PRC * (float) input_Fs / 1000.0f ); + fad_len = hStereoDmxEVS->hPHA->fad_len_prc; + fad_g = hStereoDmxEVS->hPHA->fad_g_prc; + fad_r = 1.0f / (float) ( fad_len + 1 ); + fad_len2 = fad_len / 2; + for ( n = 0, m = ( fad_len - 1 ); n < fad_len2; n++, m-- ) + { + fad_g[n] = (float) ( n + 1 ) * fad_r; + fad_g[m] = 1.0f - fad_g[n]; + } + + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + hStereoDmxEVS->hPHA->trns_aux_energy[n] = 0.0f; + } + + *hStereoDmxEVS_out = hStereoDmxEVS; + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * stereo_dmx_evs_close_encoder() + * + * close stereo downmix for EVS encoder + *-------------------------------------------------------------------*/ + +void stereo_dmx_evs_close_encoder( + STEREO_DMX_EVS_ENC_HANDLE *hStereoDmxEVS /* i/o: Stereo downmix for EVS encoder handle */ +) +{ + if ( hStereoDmxEVS == NULL || *hStereoDmxEVS == NULL ) + { + return; + } + + if ( ( *hStereoDmxEVS )->hPOC != NULL ) + { + free( ( *hStereoDmxEVS )->hPOC ); + ( *hStereoDmxEVS )->hPOC = NULL; + } + + if ( ( *hStereoDmxEVS )->hPHA != NULL ) + { + free( ( *hStereoDmxEVS )->hPHA ); + ( *hStereoDmxEVS )->hPHA = NULL; + } + + free( ( *hStereoDmxEVS ) ); + ( *hStereoDmxEVS ) = NULL; + + return; +} diff --git a/lib_enc/ivas_stereo_eclvq_enc.c b/lib_enc/ivas_stereo_eclvq_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..663101ca4a28a1967981580aceafe5fb9ead8e3b --- /dev/null +++ b/lib_enc/ivas_stereo_eclvq_enc.c @@ -0,0 +1,834 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include +#include "ivas_prot.h" +#include "ivas_cnst.h" +#include "ivas_rom_com.h" +#include "ivas_rom_enc.h" +#include +#include "prot.h" +#include "wmc_auto.h" +/* used only for norm_s in the code_length_from_count function */ +#include "stl.h" + + +/*--------------------------------------------------------------- + * log_base2() + * + * + * ---------------------------------------------------------------*/ + +static double log_base2( + double x ) +{ + return log( x ) * INV_LOG_2; +} + +/*--------------------------------------------------------------- + * get_sign() + * + * + * ---------------------------------------------------------------*/ + +static int16_t get_sign( int16_t n ) +{ + return (uint16_t) n >> 15; /* extract the sign bit */ +} + + +/*--------------------------------------------------------------- + * ECSQ_quantize_vector() + * + * + * ---------------------------------------------------------------*/ + +void ECSQ_quantize_vector( + const float *input, + const float global_gain, + const int16_t N, + int16_t *output ) +{ + int16_t i; + float inv_global_gain; + + inv_global_gain = 1.0f / global_gain; + for ( i = 0; i < N; ++i ) + { + output[i] = (int16_t) round_f( input[i] * inv_global_gain ); + } + + return; +} + +/*--------------------------------------------------------------- + * ECSQ_compute_optimal_gain() + * + * compute the optimal global gain for dequantization of output + * if all the values in output are zero, it returns 0 + * ---------------------------------------------------------------*/ + +float ECSQ_compute_optimal_gain( + const float *input, + const int16_t N, + const int16_t *output ) +{ + int16_t i; + float sum_sq_output; + float sum_input_output; + float optimal_global_gain; + + sum_sq_output = 0.0f; + sum_input_output = 0.0f; + for ( i = 0; i < N; ++i ) + { + sum_sq_output += (float) output[i] * (float) output[i]; + sum_input_output += input[i] * (float) output[i]; + } + + optimal_global_gain = 0.0f; + if ( sum_sq_output != 0.0f ) + { + optimal_global_gain = sum_input_output / sum_sq_output; + } + + return optimal_global_gain; +} + +/*--------------------------------------------------------------- + * ECSQ_quantize_gain() + * + * quantize global gain + * ---------------------------------------------------------------*/ + +static int16_t ECSQ_quantize_gain( + float global_gain ) +{ + int16_t index; + + + global_gain = max( global_gain, 1.0f ); /* because always index >= 0 anyway */ + + /* min gain = 1 (index 0), max gain ~= 29145 (index 126), domain range ~= 90 dB, resolution 90 / 127 ~= 0.7 dB */ + /* value 127 (ECSQ_GLOBAL_GAIN_INDEX_ALL_ZERO) is reserved and indicates that all values in the vector are zero */ + + index = (int16_t) ( ECLVQ_GLOBAL_GAIN_FACTOR * log10f( global_gain ) + 0.4898f ); + + /* for MSE quantization, the value f in (0, 1) is the middle between consecutive quantization points in the linear scale */ + /* 10 ^ (inv_global_gain_factor * f) - 1 = 10 ^ inv_global_gain_factor - 10 ^ (inv_global_gain_factor * f) */ + /* f = 0.5102, and when applying floor to convert to integer, 1 - f = 0.4898 must be used as the offset */ + + index = (int16_t) min( max( index, 0 ), 126 ); + + return index; +} + +/*--------------------------------------------------------------- + * arith_encode_bit() + * + * + * ---------------------------------------------------------------*/ + +static void arith_encode_bit( + ECSQ_instance *ecsq_inst, + const int16_t bit ) +{ + RangeUniEncState *rc_st_enc; + rc_st_enc = (RangeUniEncState *) ecsq_inst->ac_handle; + + + ecsq_inst->bit_count_estimate += 1024; /* 1024 eq 1 << 10, 22Q10 fixed-point representation */ + + if ( ecsq_inst->encoding_active ) + { + /* call to the actual AC */ + rc_uni_enc_encode_bits( rc_st_enc, bit, 1 ); + } + + return; +} + +/*--------------------------------------------------------------- + * arith_encode_bits() + * + * + * ---------------------------------------------------------------*/ + +static void arith_encode_bits( + ECSQ_instance *ecsq_inst, + const uint16_t n, + int16_t size ) +{ + RangeUniEncState *rc_st_enc; + rc_st_enc = (RangeUniEncState *) ecsq_inst->ac_handle; + + + ecsq_inst->bit_count_estimate += size << 10; /* 22Q10 fixed-point representation */ + + if ( ecsq_inst->encoding_active ) + { + rc_uni_enc_encode_bits( rc_st_enc, n, size ); + } + + return; +} + + +/*--------------------------------------------------------------- + * code_length_from_count() + * + * + * ---------------------------------------------------------------*/ + +static int16_t code_length_from_count( + const int16_t c ) +{ + /* compute the approximation of code length, 14 - log2(c), in 22Q10 fixed-point representation */ + /* with c in {1, ..., 2 ^ 14}, representing a probability count in 14-bit AC implementations */ + int16_t c_norm; + int16_t res; + +#define WMC_TOOL_SKIP + c_norm = norm_s( (int16_t) c ); /* equivalent with 14 - floor(log_base2(c)) */ +#undef WMC_TOOL_SKIP + + /* compute linear approximation of log2(1 + x), for x in [0, 1], using a look-up table with 64 entries */ + /* normalize to {16384, ..., 32767}, subtract MSB bit, and convert to Q6 for indexing log2_1px_table */ + res = ( c_norm << 10 ) - log2_1px_table[( ( c << c_norm ) - ( 1 << 14 ) + ( 1 << 7 ) ) >> 8]; + + + /* |(14 - log2(c)) - res / (1 << 10)| < 0.0113, for c in {1, ..., 2 ^ 14} */ + /* complexity: 1 norm_s, 2 adds, 3 shifts, 1 table lookup */ + return res; +} + +/*--------------------------------------------------------------- + * arith_encode_bit_prob() + * + * encoding for one bit with the probabilies prob_0 = count0 / 2 ^ ECSQ_PROB_BITS and prob_1 = 1 - prob_0 + * ---------------------------------------------------------------*/ + +static void arith_encode_bit_prob( + ECSQ_instance *ecsq_inst, + const int16_t count0, + const int16_t bit ) +{ + int16_t count; + RangeUniEncState *rc_st_enc; + rc_st_enc = (RangeUniEncState *) ecsq_inst->ac_handle; + + + count = ECSQ_PROB_TOTAL - count0; + + if ( bit == 0 ) + { + count = count0; + } + + ecsq_inst->bit_count_estimate += code_length_from_count( count ); /* 22Q10 fixed-point representation */ + + if ( ecsq_inst->encoding_active ) + { + /* call to the actual AC */ + rc_uni_enc_encode_fast( rc_st_enc, bit * count0, count, 14 ); + } + + return; +} + +/*--------------------------------------------------------------- + * arith_encode_prob() + * + * + * ---------------------------------------------------------------*/ + +static void arith_encode_prob( + ECSQ_instance *ecsq_inst, + const uint16_t table[], + const int16_t table_size, + const int16_t symbol ) +{ + int16_t count; + RangeUniEncState *rc_st_enc; + + rc_st_enc = (RangeUniEncState *) ecsq_inst->ac_handle; + + count = table_size; /* just to avoid warning when DEBUGGING is deactivated */ + + count = table[symbol] - table[symbol + 1]; + + ecsq_inst->bit_count_estimate += code_length_from_count( count ); /* 22Q10 fixed-point representation */ + + if ( ecsq_inst->encoding_active ) + { + /* call to the actual AC */ + rc_uni_enc_encode_fast( rc_st_enc, ECSQ_PROB_TOTAL - table[symbol], count, 14 ); + } + + return; +} + +/*--------------------------------------------------------------- + * arith_encode_elias_mod() + * + * + * ---------------------------------------------------------------*/ + +static void arith_encode_elias_mod( + ECSQ_instance *ecsq_inst, + const int16_t n ) +{ + int16_t i; + + if ( n <= 1 ) + { + /* code for 0 is 10 and code for 1 is 11 */ + arith_encode_bit( ecsq_inst, 1 ); + arith_encode_bit( ecsq_inst, n ); + } + else /* n >= 2 */ + { + /* code consists of n_bits zero bits, an one bit, and n_bits data bits */ + int16_t n_bits; + + /* n_bits is floor(log_2(n)), the number of bits after the leading one bit */ + n_bits = 30 - norm_l( n ); + for ( i = 0; i < n_bits; i++ ) + { + arith_encode_bit( ecsq_inst, 0 ); + } + arith_encode_bit( ecsq_inst, 1 ); + + /* encode the n_bits data bits at once */ + arith_encode_bits( ecsq_inst, n - ( 1 << n_bits ), n_bits ); + } + + return; +} + +/*--------------------------------------------------------------- + * arith_encode_prob_escape() + * + * + * ---------------------------------------------------------------*/ + +static void arith_encode_prob_escape( + ECSQ_instance *ecsq_inst, + const uint16_t table[], + const int16_t table_size, + const int16_t symbol ) +{ + if ( symbol < table_size - 1 ) + { + arith_encode_prob( ecsq_inst, table, table_size, symbol ); + } + else + { + arith_encode_prob( ecsq_inst, table, table_size, table_size - 1 ); /* escape symbol */ + /* encode the additional value using a modified Elias integer code */ + arith_encode_elias_mod( ecsq_inst, symbol - ( table_size - 1 ) ); + } + + return; +} + + +/*--------------------------------------------------------------- + * get_best_param() + * + * + * ---------------------------------------------------------------*/ + +static int16_t get_best_param( + int16_t *x, + const int16_t start_offset, + const int16_t stop_offset, + float *avg_abs_sum, + int16_t *N0 ) +{ + int16_t v; + int16_t val; + int32_t sum_abs; + int16_t count; + int16_t count0; + int16_t param; + + const float offset = INV_LOG_2; /* offset = 1 / ln(2) and log2(offset) ~ 0.528766 */ + + sum_abs = 0; + count = stop_offset - start_offset + 1; + count0 = 0; + + /* compute sum(abs(x[v])) and sum(x[v] == 0) */ + for ( v = start_offset; v <= stop_offset; ++v ) + { + + val = x[v]; + sum_abs += abs( val ); + if ( val == 0 ) + { + ++count0; + } + } + + + /* the vector has at most ECSQ_NONZERO_MAX values of +-1 and the rest are zeros */ + if ( ( count - count0 <= ECSQ_NONZERO_MAX ) && ( sum_abs == count - count0 ) ) + { + *avg_abs_sum = ( sum_abs + 0.25f * count0 ) / count; + *N0 = count0; + + return ECSQ_ALL_ZERO_PARAM; + } + + *avg_abs_sum = ( sum_abs + 0.25f * count0 ) / count; + *N0 = count0; + + /* the best Laplace integer parameter is floor(log2(avg_abs_sum) + log2(offset)) */ + param = (int16_t) floor( log_base2( *avg_abs_sum * offset ) ); + + /* limit param value to the available exponent range */ + param = max( ECSQ_ALL_ZERO_PARAM + 1, param ); + param = min( param, ECSQ_ALL_ZERO_PARAM + ECSQ_PARAM_COUNT - 1 ); + + return param; +} + + +/*--------------------------------------------------------------- + * get_est_size() + * + * + * ---------------------------------------------------------------*/ + +#define ECSQ_log2TB_FIRST_PARAM -2 + +static float get_est_size( + const int16_t N, + float avg_abs_sum, + const int16_t N0, + int16_t param ) +{ + float size; + float two_to_param; + + two_to_param = (float) ( 1 << abs( param ) ); + if ( param < 0 ) + { + two_to_param = 1.0f / two_to_param; + } + + if ( param != ECSQ_ALL_ZERO_PARAM ) /* not all values are zeros */ + { + int16_t index; + index = param - ECSQ_log2TB_FIRST_PARAM; + index = min( index, ECSQ_log2TB_SIZE - 2 ); + + + /* the estimated size in bits is N * log2(2 * 2 ^ param) + */ + /* + N * log2(e) * (avg_abs_sum / 2 ^ param) - (N - N0) * log2(T(2 ^ param)) - */ + /* - N0 * log2(T(2 * 2 ^ param)) */ + size = N * ( 1 + param + INV_LOG_2 * ( avg_abs_sum / two_to_param ) ); + size -= ( N - N0 ) * log2TB[index]; + size -= N0 * log2TB[index + 1]; + } + else + { + /* used for all zero values or for very low entropy with number of nonzeros <= ECSQ_NONZERO_MAX */ + int16_t nonzero; + float required_avg_abs_sum; + + nonzero = N - N0; + + required_avg_abs_sum = ( nonzero + 0.25f * N0 ) / N; /* the vector must have nonzero +-1 and N0 zeros */ + + if ( ( avg_abs_sum == required_avg_abs_sum ) && ( nonzero <= ECSQ_NONZERO_MAX ) ) + { + size = 2.0f; /* log_base2(1 + ECSQ_NONZERO_MAX), indicate the nonzero count */ + + /* the number of bits for the nonzero mask is log2(nchoosek(N, nonzero)) */ + size += ECSQ_log2_fact[N] - ECSQ_log2_fact[N - nonzero] - ECSQ_log2_fact[nonzero]; + + size += (float) nonzero; /* indicate the signs for nonzero values */ + } + else + { + /* the method cannot be used, return a huge value so that it will never be chosen */ + size = 1.0e11f; + } + } + + return size; +} + +/*--------------------------------------------------------------- + * ECSQ_encode_raw() + * + * encode input, which contains a concatenation of quantized RE8 integer-valued vectors; + * the return value is the approximate number of bits written, expressed in 22Q10 fixed-point representation + * ---------------------------------------------------------------*/ + +static int32_t ECSQ_encode_raw( + ECSQ_instance *ecsq_inst, + int16_t *input, + const int16_t N ) +{ + int32_t bit_count_estimate_initial; + + float total_size; + int16_t segment_count; + + int16_t seg_length, seg_start, seg_stop, segment, seg_count0; + int32_t est_size; + + int16_t est_param, first_param, last_param, param; + float best_size, test_size; + int16_t best_param, best_params[ECSQ_VECTOR_SIZE_MAX / ECSQ_SEGMENT_SIZE]; + int16_t saved_seg_count0[ECSQ_VECTOR_SIZE_MAX / ECSQ_SEGMENT_SIZE]; + + float avg_abs_sum; + const float scale_Q10 = 1.0f / 1024.0f; + int16_t i, idx, shift, val, sym, nonzero, left0, left1, count, count0, lsbs; + int16_t param_zb, best_param_zb; /* zero-based parameter index for coding */ + const uint16_t *tab_vals, *tab_abs_lsbs; + + bit_count_estimate_initial = ecsq_inst->bit_count_estimate; + + + total_size = 0.0f; + segment_count = ( N + ECSQ_SEGMENT_SIZE - 1 ) / ECSQ_SEGMENT_SIZE; + + for ( segment = 0; segment < segment_count; ++segment ) + { + seg_start = segment * ECSQ_SEGMENT_SIZE; + seg_stop = min( seg_start + ECSQ_SEGMENT_SIZE, N ) - 1; + seg_length = seg_stop - seg_start + 1; + + est_param = get_best_param( input, seg_start, seg_stop, &avg_abs_sum, &seg_count0 ); + saved_seg_count0[segment] = seg_count0; + + /* find the best param around est_param for the current segment count */ + best_size = 1.0e10f; + best_param = -1000; + + if ( est_param == ECSQ_ALL_ZERO_PARAM ) /* all values are zero */ + { + first_param = ECSQ_ALL_ZERO_PARAM; + last_param = ECSQ_ALL_ZERO_PARAM + 2 * ECSQ_PARAM_SEARCH_RANGE; + } + else + { + first_param = max( ECSQ_ALL_ZERO_PARAM, est_param - ECSQ_PARAM_SEARCH_RANGE ); + last_param = min( est_param + ECSQ_PARAM_SEARCH_RANGE, ECSQ_ALL_ZERO_PARAM + ECSQ_PARAM_COUNT - 1 ); + } + + for ( param = first_param; param <= last_param; ++param ) + { + param_zb = param - ECSQ_ALL_ZERO_PARAM; + count = ECSQ_tab_param[ecsq_inst->config_index][param_zb] - ECSQ_tab_param[ecsq_inst->config_index][param_zb + 1]; + test_size = scale_Q10 * code_length_from_count( count ); + + test_size += get_est_size( seg_length, avg_abs_sum, seg_count0, param ); + + if ( test_size < best_size ) + { + best_param = param; + best_size = test_size; + } + } + + best_params[segment] = best_param; + total_size += best_size; + } + + if ( !ecsq_inst->encoding_active ) /* only size estimation is needed */ + { + est_size = (int32_t) ( total_size * 1024.0 + 0.5 ); /* 22Q10 fixed-point representation */ + + return est_size; + } + + /* encode with the best parameters: best_params[] */ + for ( segment = 0; segment < segment_count; ++segment ) + { + seg_start = segment * ECSQ_SEGMENT_SIZE; + seg_stop = seg_start + ECSQ_SEGMENT_SIZE - 1; + seg_length = ECSQ_SEGMENT_SIZE; + if ( segment == segment_count - 1 ) + { + seg_stop = N - 1; + seg_length = seg_stop - seg_start + 1; + } + + best_param_zb = best_params[segment] - ECSQ_ALL_ZERO_PARAM; + shift = max( 0, best_param_zb - 3 ); /* first nonzero shift of 1 is used for param 3 */ + + arith_encode_prob( ecsq_inst, ECSQ_tab_param[ecsq_inst->config_index], ECSQ_PARAM_COUNT, best_param_zb ); + + /* encode the actual values if not using the ECSQ_ALL_ZERO_PARAM parameter */ + if ( best_param_zb != 0 ) + { + tab_vals = ECSQ_tab_vals[best_param_zb - 1]; + idx = min( shift, 4 ); + tab_abs_lsbs = ECSQ_tab_abs_lsbs[idx]; + + for ( i = seg_start; i <= seg_stop; ++i ) + { + val = input[i]; + sym = (int16_t) abs( val ); + + if ( shift != 0 ) + { + lsbs = sym & ( ( 1 << shift ) - 1 ); + sym = sym >> shift; + + arith_encode_prob_escape( ecsq_inst, tab_vals, ECSQ_TAB_VALS_SIZE, sym ); + + if ( ( sym > 0 ) || ( shift > 4 ) ) + { + arith_encode_bits( ecsq_inst, lsbs, shift ); + } + else /* (sym == 0) && (shift <= 4) */ + { + arith_encode_prob( ecsq_inst, tab_abs_lsbs, 1 << shift, lsbs ); + } + } + else /* shift == 0 */ + { + arith_encode_prob_escape( ecsq_inst, tab_vals, ECSQ_TAB_VALS_SIZE, sym ); + } + + if ( val != 0 ) + { + arith_encode_bit( ecsq_inst, get_sign( val ) ); + } + } + } + else + { + nonzero = seg_length - saved_seg_count0[segment]; + + + arith_encode_bits( ecsq_inst, nonzero, 2 ); /* log_base2(ECSQ_NONZERO_MAX + 1) == 2 */ + + left1 = nonzero; + left0 = seg_length - nonzero; + + for ( i = seg_start; i <= seg_stop; ++i ) + { + val = input[i]; + sym = (int16_t) abs( val ); + + + if ( left1 == 0 ) + { + } + else if ( left0 == 0 ) + { + } + else + { + count0 = left0 * ECSQ_tab_inverse[left0 + left1]; /* left0 * round(ECSQ_PROB_TOTAL / (left0 + left1)) */ + arith_encode_bit_prob( ecsq_inst, count0, sym ); + } + + if ( sym != 0 ) + { + arith_encode_bit( ecsq_inst, get_sign( val ) ); + --left1; + } + else + { + --left0; + } + } + } + } + + + return ecsq_inst->bit_count_estimate - bit_count_estimate_initial; +} + + +/*--------------------------------------------------------------- + * ECSQ_encode_target_SNR() + * + * encode input with an approximate target of target_SNR signal-to-noise ratio, and ensure no more than max_bits are used; + * the computed global gain index is returned into global_gain_index_output; + * if global_gain_index_output == ECSQ_GLOBAL_GAIN_INDEX_ALL_ZERO, nothing is written and the function returns 0; + * if output pointer is not NULL, it will contain the dequantized vector, as it will be available at the decoder side; + * the return value is the approximate number of bits written, expressed in 22Q10 fixed-point representation + * ---------------------------------------------------------------*/ + +#define ECSQ_MAX_BITS_ITERATIONS 2 + +int32_t ECSQ_encode_target_SNR( + ECSQ_instance *ecsq_inst, + const float *input, + const int16_t N, + const float target_SNR, + const int16_t max_bits, + float *output, + int16_t *global_gain_index_output ) +{ + int16_t global_gain_index; + int16_t global_gain_index_last; /* used to potentially save one call to ECSQ_quantize_vector */ + int16_t quantized_input[ECSQ_VECTOR_SIZE_MAX]; + int16_t saved_encoding_active; + int32_t saved_bit_count_estimate; + int32_t test_size, adjust_size; + int16_t i, iteration; + float global_gain, adjust_global_gain_index; + int32_t max_bits_fixpt; + float sum_squared, target_ratio, target_sum_squared_error; + const float global_gain_step = powf( 10.0f, ECLVQ_INV_GLOBAL_GAIN_FACTOR ); + + max_bits_fixpt = max_bits * 1024; /* max_bits_fixpt is in 22Q10 fixed-point representation */ + + if ( target_SNR <= 0.0f ) + { + /* a target SNR of 0.0 dB is already achieved by quantizing all values in the vector to zero */ + *global_gain_index_output = ECSQ_GLOBAL_GAIN_INDEX_ALL_ZERO; + if ( output != NULL ) + { + set_f( output, 0.0f, N ); + } + + return 0; /* nothing is coded when global gain index is ECSQ_GLOBAL_GAIN_INDEX_ALL_ZERO */ + } + + sum_squared = 0.0f; + for ( i = 0; i < N; ++i ) + { + sum_squared += input[i] * input[i]; + } + + if ( sum_squared < 0.25f ) /* all the values in the input vector will always be quantized to zero */ + { + /* the condition above holds because sum(input[i] ^ 2) < 0.25 => max(abs(input[i])) < 0.5 */ + *global_gain_index_output = ECSQ_GLOBAL_GAIN_INDEX_ALL_ZERO; + if ( output != NULL ) + { + set_f( output, 0.0f, N ); + } + + return 0; /* nothing is coded when global gain index is ECSQ_GLOBAL_GAIN_INDEX_ALL_ZERO */ + } + + /* save internal state and activate size evaluation only */ + saved_encoding_active = ecsq_inst->encoding_active; + saved_bit_count_estimate = ecsq_inst->bit_count_estimate; + ecsq_inst->encoding_active = 0; + + /* target_ratio is the target ratio between the sum squared values of input and sum squared values of quantization error */ + target_ratio = powf( 10.0f, target_SNR / 10.0f ); + target_sum_squared_error = sum_squared / target_ratio; + /* the mean of squared quantization error for uniform scalar quantization is 1 / 12, approximately 0.0833 */ + /* when including global_gain, the relationship is target_sum_squared_error ~ (0.0833 * N) * global_gain ^ 2 */ + /* the representable range for global_gain is from 1 (global_gain_index 0) to 29145 (global_gain_index 126) inclusive */ + global_gain = sqrtf( target_sum_squared_error / ( 0.0833f * (float) N ) ); + /* quantize the estimated global_gain */ + global_gain_index = ECSQ_quantize_gain( global_gain ); + + iteration = 0; + + /* do the quantization with the dequantized estimated global_gain_index found */ + global_gain = ECSQ_dequantize_gain( global_gain_index ); + global_gain_index_last = global_gain_index; + ECSQ_quantize_vector( input, global_gain, N, quantized_input ); + + test_size = ECSQ_encode_raw( ecsq_inst, quantized_input, N ); + + ++iteration; + while ( ( test_size > max_bits_fixpt ) && ( iteration < ECSQ_MAX_BITS_ITERATIONS ) ) + { + adjust_size = test_size - max_bits_fixpt; + /* assume doubling the quantization step size will reduce the entropy with (up to) one bit */ + adjust_global_gain_index = (int16_t) ceil( adjust_size / ( 1024.0f * N * log_base2( global_gain_step ) ) ); + global_gain_index = min( (int16_t) ( global_gain_index + adjust_global_gain_index ), 126 ); + + global_gain = ECSQ_dequantize_gain( global_gain_index ); + global_gain_index_last = global_gain_index; + ECSQ_quantize_vector( input, global_gain, N, quantized_input ); + + test_size = ECSQ_encode_raw( ecsq_inst, quantized_input, N ); + + ++iteration; + } + + if ( test_size > max_bits_fixpt ) + { + /* further increase the quantization step with the smallest increment for global_gain_index */ + global_gain_index = (int16_t) min( global_gain_index + 1, 126 ); + } + + /* restore internal state */ + ecsq_inst->encoding_active = saved_encoding_active; + ecsq_inst->bit_count_estimate = saved_bit_count_estimate; + + /* do the quantization with the dequantized final global_gain_index found */ + global_gain = ECSQ_dequantize_gain( global_gain_index ); + + if ( global_gain_index != global_gain_index_last ) + { + ECSQ_quantize_vector( input, global_gain, N, quantized_input ); + } + + global_gain = ECSQ_compute_optimal_gain( input, N, quantized_input ); + + if ( global_gain == 0.0f ) /* all values in quantized_input are zero */ + { + *global_gain_index_output = ECSQ_GLOBAL_GAIN_INDEX_ALL_ZERO; + if ( output != NULL ) + { + set_f( output, 0.0f, N ); + } + + return 0; /* nothing is coded when global gain index is ECSQ_GLOBAL_GAIN_INDEX_ALL_ZERO */ + } + + global_gain_index = ECSQ_quantize_gain( global_gain ); + *global_gain_index_output = global_gain_index; + + + if ( output != NULL ) + { + global_gain = ECSQ_dequantize_gain( global_gain_index ); + ECSQ_dequantize_vector( quantized_input, global_gain, N, output ); + } + + ECSQ_encode_raw( ecsq_inst, quantized_input, N ); + + return ecsq_inst->bit_count_estimate - saved_bit_count_estimate; +} diff --git a/lib_enc/ivas_stereo_ica_enc.c b/lib_enc/ivas_stereo_ica_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..4d698dfde88f416b8a47b52d10a62cbab38502b4 --- /dev/null +++ b/lib_enc/ivas_stereo_ica_enc.c @@ -0,0 +1,1387 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include "options.h" +#include +#include "cnst.h" +#include "ivas_cnst.h" +#include "prot.h" +#include "ivas_prot.h" +#include "wmc_auto.h" +#include "rom_com.h" +#include "ivas_rom_com.h" + + +/*--------------------------------------------------------------- + * Local function prototypes + * ---------------------------------------------------------------*/ + +static void unclr_calc_corr_features( STEREO_CLASSIF_HANDLE hStereoClassif, STEREO_TCA_ENC_HANDLE hStereoTCA, const float buf1[], const float buf2[], const int16_t length, const float corrEst[], const int16_t lagSearchRange[], float *corrEst_ncorr ); + + +/*-------------------------------------------------------------------* + * Local constants + *-------------------------------------------------------------------*/ + +#define XL_BIAS 0.20f +#define XH_BIAS 0.40f +#define XL_WIDTH 0.12f +#define XH_WIDTH 0.15f /* 0.25 is MAX */ +#define YL_DIST 7.0f +#define YH_DIST 9.0f +#define SMOOTH_DIST_FACTOR 0.4f +#define SMOOTH_ENV_FACTOR 0.6f + +#define A_BIAS ( ( XH_BIAS - XL_BIAS ) / ( YH_DIST - YL_DIST ) ) +#define B_BIAS ( XH_BIAS - ( A_BIAS * YH_DIST ) ) +#define A_WIDTH ( ( XH_WIDTH - XL_WIDTH ) / ( YH_DIST - YL_DIST ) ) +#define B_WIDTH ( XH_WIDTH - ( A_WIDTH * YH_DIST ) ) + + +/*--------------------------------------------------------------- + * tcaTargetCh_LA() + * + * Temporal channel adjustment of LA samples in target channel + * ---------------------------------------------------------------*/ + +static void tcaTargetCh_LA( + STEREO_TCA_ENC_HANDLE hStereoTCA, + float *ptrChanL, + float *ptrChanR, + const int16_t currentNCShift, + const int16_t input_frame ) +{ + int16_t i, j; + int16_t tempS; + float tempF1, tempF2, gAdj; + + float *ref, *target; + float win[240]; /* 5 ms at 48 kHz */ + + if ( hStereoTCA->refChanIndx == L_CH_INDX ) + { + ref = ptrChanL; + target = ptrChanR; + } + else + { + ref = ptrChanR; + target = ptrChanL; + } + + tempS = NS2SA( input_frame * FRAMES_PER_SEC, L_SAMPLES_LA_NS ); + tempF1 = 0.0f; + tempF2 = 0.0f; + for ( i = 0; i < ( input_frame - currentNCShift ); i++ ) + { + tempF1 += fabsf( ref[i] ); + tempF2 += fabsf( target[i + currentNCShift] ); + } + gAdj = ( tempF1 == 0 ) ? 1.0f : tempF2 / max( tempF1, 0.00001f ); + + tempF1 = EVS_PI / ( 2.0f * (float) tempS ); + for ( i = 0; i < tempS; i++ ) + { + win[i] = sinf( tempF1 * ( 0.5f + (float) i ) ); + } + + j = 0; + for ( i = ( input_frame - currentNCShift - tempS ); i < input_frame - currentNCShift; i++, j++ ) + { + target[i + currentNCShift] = ( win[j] * gAdj ) * ref[i] + ( 1.0f - win[j] ) * target[i + currentNCShift]; + } + for ( ; i < input_frame; i++, j++ ) + { + target[i + currentNCShift] = gAdj * ref[i]; + } + + return; +} + +/*--------------------------------------------------------------- + * spectral_balancer() + * + * Spectral-balancer to take care of the low-freq rumble and + * compensate for the pre-emphasis. + * ---------------------------------------------------------------*/ + +void spectral_balancer( + float *signal, + float *mem, + const int16_t lg, + const int16_t coeff_set ) +{ + int16_t i; + float x0, x1, x2, y0, y1, y2; + float a1, a2, b0, b1, b2; + + y1 = mem[0]; + y2 = mem[1]; + x0 = mem[2]; + x1 = mem[3]; + + /* hp filter 60Hz at 3dB for 8000KHz sampling rate + 1. [b,a] = butter(1, 60.0/8000.0, 'high'); + 2. spectral_balancing_filter + < maybe not needed>> + b =[1, -1] [1, -0.6] + a =[1, -0.95395255590776329] [1, 0.5] */ + if ( coeff_set == 0 ) + { + a1 = 0.747789178258504f; + a2 = -0.272214937925007f; + b0 = 0.505001029045878f; + b1 = -1.01000205809176f; + b2 = 0.505001029045878f; + } + else + { + a1 = -0.13456126833218354f; + a2 = -0.38813694706072926f; + b0 = 1.0f; + b1 = -1.9980666374183167f; + b2 = 1.0f; + } + + for ( i = 0; i < lg; i++ ) + { + x2 = x1; + x1 = x0; + x0 = signal[i]; + y0 = ( y1 * a1 ) + ( y2 * a2 ) + ( x0 * b0 ) + ( x1 * b1 ) + ( x2 * b2 ); + signal[i] = y0; + y2 = y1; + y1 = y0; + } + + mem[0] = ( ( y1 > 1e-10 ) | ( y1 < -1e-10 ) ) ? y1 : 0; + mem[1] = ( ( y2 > 1e-10 ) | ( y2 < -1e-10 ) ) ? y2 : 0; + mem[2] = ( ( x0 > 1e-10 ) | ( x0 < -1e-10 ) ) ? x0 : 0; + mem[3] = ( ( x1 > 1e-10 ) | ( x1 < -1e-10 ) ) ? x1 : 0; + + return; +} + + +/*--------------------------------------------------------------- + * deEmphResample() + * + * De-emphasize and resample the L and R channels. + * ---------------------------------------------------------------*/ + +static void deEmphResample( + STEREO_TCA_ENC_HANDLE hStereoTCA, /* i/o: Stereo TCA encoder handle */ + const float *tempChan1, /* i : Stereo data */ + const float *tempChan2, /* i : Stereo data */ + float *chan1, + float *chan2, + const int16_t input_frame, + const int16_t dsFactor ) +{ + float buf1[L_FRAME48k], buf2[L_FRAME48k]; + float tempBuf1[2 * L_FRAME_DS], tempBuf2[2 * L_FRAME_DS]; + int16_t i; + int16_t dsFac1, dsFac2; + + /* Estimate first and second stage downsample factors */ + dsFac1 = ( dsFactor >> 1 ); + dsFac2 = dsFactor / dsFac1; + + /* convert stereo data to two distinct channels, e.g., L, R */ + mvr2r( tempChan1, buf1, input_frame ); + mvr2r( tempChan2, buf2, input_frame ); + + /* De-emphasis, 1/(1-mu z^-1), and resample, stage 1 */ + deemph( buf1, PREEMPH_FAC_16k, input_frame, &hStereoTCA->memdecim[0] ); + deemph( buf2, PREEMPH_FAC_16k, input_frame, &hStereoTCA->memdecim[1] ); + + for ( i = 0; i < ( input_frame / dsFac1 ); i++ ) + { + tempBuf1[i] = buf1[i * dsFac1]; + tempBuf2[i] = buf2[i * dsFac1]; + } + + /* De-emphasis, 1/(1-mu z^-1), and resample, stage 2 */ + deemph( tempBuf1, PREEMPH_FAC_16k, ( input_frame / dsFac1 ), &hStereoTCA->memdecim[2] ); + deemph( tempBuf2, PREEMPH_FAC_16k, ( input_frame / dsFac1 ), &hStereoTCA->memdecim[3] ); + + for ( i = 0; i < ( input_frame / dsFactor ); i++ ) + { + chan1[i] = tempBuf1[i * dsFac2]; + chan2[i] = tempBuf2[i * dsFac2]; + } + + spectral_balancer( chan1, &hStereoTCA->memdecim[4], input_frame / dsFactor, 0 ); /*4 mem */ + spectral_balancer( chan2, &hStereoTCA->memdecim[8], input_frame / dsFactor, 0 ); /*4 mem */ + + return; +} + +/*--------------------------------------------------------------- + * utilCrossCorr_mod() + * + * Biased crossCorr estimation between buf1, buf2 over the + * lag range of (lagSearchRange[0], lagSearchRange[1]). + * ---------------------------------------------------------------*/ + +static void utilCrossCorr_mod( + STEREO_TCA_ENC_HANDLE hStereoTCA, /* i/o: ICA Stereo Encoder handle */ + const float *buf1, + const float *buf2, + float *corrEst, /* o : correlation estimate */ + const int16_t *lagSearchRange, + const int16_t len ) +{ + float C, E1, E2; + int16_t i, j; + float Inv_Tot_E; + + E1 = sum2_f( buf1, len ); + E2 = sum2_f( buf2, len ); + + Inv_Tot_E = 1.0f / ( ( 2.0f * (float) len ) * sqrtf( ( E1 + hStereoTCA->E1_mem ) * ( E2 + hStereoTCA->E2_mem ) + 0.000000001f ) ); + + hStereoTCA->E1_mem = E1; + hStereoTCA->E2_mem = E2; + + for ( i = lagSearchRange[0], j = 0; i <= 0; i++, j++ ) + { + C = dotp( buf1, buf2 + i, len ); + corrEst[j] = ( C + hStereoTCA->C_mem[j] ) * Inv_Tot_E; + hStereoTCA->C_mem[j] = C; + } + + for ( ; i <= lagSearchRange[1]; i++, j++ ) + { + C = dotp( buf1 - i, buf2, len ); + corrEst[j] = ( C + hStereoTCA->C_mem[j] ) * Inv_Tot_E; + hStereoTCA->C_mem[j] = C; + } + + return; +} + + +/*--------------------------------------------------------------- + * utilCrossCorr() + * + * crossCorr estimation between buf1, buf2 over the + * lag range of (lagSearchRange[0], lagSearchRange[1]). + * ---------------------------------------------------------------*/ + +static void utilCrossCorr( + const float *buf1, + const float *buf2, + const float *win, + float *corrEst, /* o : correlation estimate */ + const int16_t *lagSearchRange, + const int16_t len, + const int16_t winSymmFlag ) +{ + float tempBuf1[L_FRAME48k]; + float tempBuf2[L_FRAME48k]; + float temp, scale; + int16_t i, j; + + /* Apply windowing */ + if ( win != NULL ) + { + if ( winSymmFlag == 0 ) + { + v_mult( buf1, win, tempBuf1, len ); + v_mult( buf2, win, tempBuf2, len ); + } + else + { + v_mult( buf1, win, tempBuf1, ( len >> 1 ) ); + v_mult( buf2, win, tempBuf2, ( len >> 1 ) ); + + for ( i = ( len >> 1 ); i < len; i++ ) + { + tempBuf1[i] = win[len - 1 - i] * buf1[i]; + tempBuf2[i] = win[len - 1 - i] * buf2[i]; + } + } + } + else + { + mvr2r( buf1, tempBuf1, len ); + mvr2r( buf2, tempBuf2, len ); + } + + temp = sum2_f( tempBuf1, len ); + temp *= sum2_f( tempBuf2, len ); + scale = ( temp == 0 ) ? 1.0f : inv_sqrt( temp ); + + /* starting point of lag search range should be less than the ending point */ + assert( lagSearchRange[0] <= lagSearchRange[1] ); + + /* first part of noncausal corr est. */ + for ( i = lagSearchRange[0], j = 0; i <= min( 0, lagSearchRange[1] ); i++, j++ ) + { + temp = dotp( tempBuf1 - i, tempBuf2, ( len + i ) ); + corrEst[j] = temp / ( len + i ); + } + + /* second part of noncausal corr est. */ + for ( ; i <= lagSearchRange[1]; i++, j++ ) + { + temp = dotp( tempBuf1, tempBuf2 + i, ( len - i ) ); + corrEst[j] = temp / ( len - i ); + } + v_multc( corrEst, scale, corrEst, j ); + + return; +} + +/*--------------------------------------------------------------- + * corrStatsEst() + * + * Non-causal shift estimation to encode future samples. + * ---------------------------------------------------------------*/ + +static void corrStatsEst( + STEREO_TCA_ENC_HANDLE hStereoTCA, /* i/o: Stereo TCA Encoder handle */ + const float *buf1, /* i : channel 1 */ + const float *buf2, /* i : channel 2 */ + const int16_t bufLenDS, /* i : buffer length */ + const int16_t dsFactor, /* i : buffer length */ + const int16_t vad_flag1, /* i : VAD flag channel 1 */ + const int16_t vad_flag2, /* i : VAD flag channel 2 */ + STEREO_CLASSIF_HANDLE hStereoClassif /* i/o: stereo classifier handle */ +) +{ + int16_t lagSearchRange[2]; + float corrEst[2 * L_NCSHIFT_DS + 1]; + int16_t corrLagStats[3]; + float *tempRK; + const float *winInterp; + float rInterp[MAX_INTERPOLATE]; + int16_t interpMin, interpMax, interpLen; + int16_t i, j, k, m; + float tempF, alpha; + float win_bias; + int16_t tempLen, win_width; + float loc_weight_win[4 * L_NCSHIFT_DS + 1]; + float X_hat, Y_hat, XY_hat, X_SQR_hat; + float alpha_reg, beta_reg, reg_prv_corr, dist_reg_prv_corr, bias_par, width_par; + float k1, k2, temp_A, temp_B; + int16_t stmp; + float corrEst_ncorr; + + /* init of regression parameters*/ + X_hat = 0; + X_SQR_hat = 0; + XY_hat = 0; + + /* Initializations */ + alpha = 0.7f; + lagSearchRange[0] = -L_NCSHIFT_DS; + lagSearchRange[1] = L_NCSHIFT_DS; + tempLen = ( 2 * L_NCSHIFT_DS + 1 ); + + set_s( corrLagStats, 0, 3 ); + + /* First iteration of xcorr estimation */ + utilCrossCorr_mod( hStereoTCA, buf1, buf2, corrEst, lagSearchRange, bufLenDS - L_XCORRMEM_DS ); + + /* calculate features for the UNCLR classifier */ + unclr_calc_corr_features( hStereoClassif, hStereoTCA, buf1, buf2, bufLenDS - L_XCORRMEM_DS, corrEst, lagSearchRange, &corrEst_ncorr ); + + for ( i = 1; i < 3; i++ ) + { + v_add( hStereoTCA->corrEstPrev[i], hStereoTCA->corrEstPrev[0], hStereoTCA->corrEstPrev[0], tempLen ); + } + + /* back up the corrEst */ + for ( i = 0; i < 2; i++ ) + { + mvr2r( hStereoTCA->corrEstPrev[i + 1], hStereoTCA->corrEstPrev[i], tempLen ); + } + mvr2r( corrEst, hStereoTCA->corrEstPrev[2], tempLen ); + + temp_A = sumAbs( buf1, L_FRAME_DS - L_XCORRMEM_DS ) + sumAbs( buf2, L_FRAME_DS - L_XCORRMEM_DS ); + temp_B = sumAbs( buf1 + ( L_FRAME_DS - L_XCORRMEM_DS ), L_XCORRMEM_DS ) + sumAbs( buf2 + ( L_FRAME_DS - L_XCORRMEM_DS ), L_XCORRMEM_DS ); + tempF = temp_A + temp_B + hStereoTCA->mem_tempF; + hStereoTCA->mem_tempF = temp_B; + + alpha = 0.93f; + if ( tempF > 4.0f * hStereoTCA->ica_envVarLT ) + { + alpha = 0.83f; + } + else if ( tempF > 2.0f * hStereoTCA->ica_envVarLT ) + { + alpha = 0.85f; + } + else if ( tempF > hStereoTCA->ica_envVarLT ) + { + alpha = 0.90f; + } + + hStereoTCA->corrStatsSmoothFac = alpha; + + /* long term corr Stats estimation */ + v_multc( hStereoTCA->corrEstLT, alpha, hStereoTCA->corrEstLT, 2 * L_NCSHIFT_DS + 1 ); + v_multc( corrEst, 1.0f - alpha, corrEst, 2 * L_NCSHIFT_DS + 1 ); + v_add( hStereoTCA->corrEstLT, corrEst, hStereoTCA->corrEstLT, 2 * L_NCSHIFT_DS + 1 ); + + hStereoTCA->ica_envVarLT = SMOOTH_ENV_FACTOR * hStereoTCA->ica_envVarLT + ( 1 - SMOOTH_ENV_FACTOR ) * tempF; + + mvr2r( hStereoTCA->corrEstLT, corrEst, 2 * L_NCSHIFT_DS + 1 ); + Y_hat = hStereoTCA->delay_0_mem[0]; + /* Note: keep X_hat and X_SQR_hat calculations inside the loop to allow future tuning of MAX_DELAYREGLEN */ + for ( i = 1; i < MAX_DELAYREGLEN; i++ ) + { + X_hat += (float) i; + Y_hat += hStereoTCA->delay_0_mem[i]; + XY_hat += i * hStereoTCA->delay_0_mem[i]; + X_SQR_hat += (float) ( i * i ); + } + X_hat *= INV_MAX_DELAYREGLEN; + Y_hat *= INV_MAX_DELAYREGLEN; + XY_hat *= INV_MAX_DELAYREGLEN; + X_SQR_hat *= INV_MAX_DELAYREGLEN; + + beta_reg = 0; + tempF = X_SQR_hat - ( X_hat * X_hat ); + if ( tempF != 0 ) + { + beta_reg = ( XY_hat - X_hat * Y_hat ) / tempF; + } + alpha_reg = ( Y_hat - beta_reg * X_hat ); + reg_prv_corr = beta_reg * MAX_DELAYREGLEN + alpha_reg; + + if ( TRUNC( reg_prv_corr ) <= -L_NCSHIFT_DS ) + { + reg_prv_corr = -L_NCSHIFT_DS + 1; + } + + if ( TRUNC( reg_prv_corr ) >= L_NCSHIFT_DS ) + { + reg_prv_corr = L_NCSHIFT_DS - 1; + } + + bias_par = A_BIAS * hStereoTCA->smooth_dist_reg_prv_corr + B_BIAS; + bias_par = min( bias_par, XH_BIAS ); + bias_par = max( bias_par, XL_BIAS ); + + width_par = A_WIDTH * hStereoTCA->smooth_dist_reg_prv_corr + B_WIDTH; + width_par = min( width_par, XH_WIDTH ); + width_par = max( width_par, XL_WIDTH ); + + win_width = (int16_t) ( width_par * ( 4 * L_NCSHIFT_DS + 1 ) ); + win_bias = bias_par; + k1 = 0.5f * ( 1.0f + win_bias ); + k2 = 0.5f * ( 1.0f - win_bias ); + + for ( i = 0; i < ( 2 * L_NCSHIFT_DS - 2 * win_width ); i++ ) + { + loc_weight_win[i] = win_bias; + } + + for ( i = ( 2 * L_NCSHIFT_DS - 2 * win_width ); i <= ( 2 * L_NCSHIFT_DS + 2 * win_width ); i++ ) + { + loc_weight_win[i] = k1 + k2 * cosf( EVS_PI * ( ( i - 2 * L_NCSHIFT_DS ) / ( 2.0f * win_width ) ) ); + } + + for ( i = ( 2 * L_NCSHIFT_DS + 2 * win_width ); i < ( 4 * L_NCSHIFT_DS + 1 ); i++ ) + { + loc_weight_win[i] = win_bias; + } + + for ( i = 0, j = L_NCSHIFT_DS - TRUNC( reg_prv_corr ); i < 2 * L_NCSHIFT_DS + 1; i++, j++ ) + { + corrEst[i] *= loc_weight_win[j]; + } + + if ( hStereoTCA->prevTargetGain < 0.8f && vad_flag1 ) + { + /* ch 2 is prev reference channel */ + v_multc( corrEst, 1.2f, corrEst, L_NCSHIFT_DS + 1 ); + v_multc( corrEst + L_NCSHIFT_DS + 1, 0.833f, corrEst + L_NCSHIFT_DS + 1, L_NCSHIFT_DS ); + } + else if ( hStereoTCA->prevTargetGain > 1.2f && vad_flag1 ) + { + /* ch 1 is prev reference channel */ + v_multc( corrEst, 0.833f, corrEst, L_NCSHIFT_DS ); + v_multc( corrEst + L_NCSHIFT_DS, 1.2f, corrEst + L_NCSHIFT_DS, L_NCSHIFT_DS + 1 ); + } + + if ( corrEst_ncorr > 0.8f && vad_flag1 ) + { + i = max( 0, hStereoTCA->prevCorrLagStats[0] - 1 + L_NCSHIFT_DS ); + j = min( 2 * L_NCSHIFT_DS, hStereoTCA->prevCorrLagStats[0] + 1 + L_NCSHIFT_DS ); + k = j - i + 1; + v_multc( corrEst + i, 1.2f, corrEst + i, k ); + } + + /* Initial corr lag estimate */ + corrLagStats[0] = maximum( corrEst, ( lagSearchRange[1] - lagSearchRange[0] + 1 ), &tempF ); + corrLagStats[0] += lagSearchRange[0]; + + stmp = corrLagStats[0] * dsFactor; + hStereoClassif->unclr_fv[E_corrLagStats0] = (float) stmp; + hStereoClassif->xtalk_fv[E_corrLagStats0] = (float) stmp; + hStereoClassif->xtalk_fv[E_ica_corr_value0] = tempF; + + if ( vad_flag1 == 0 && alpha > 0.7f ) + { + corrLagStats[0] = 0; + } + + dist_reg_prv_corr = fabsf( reg_prv_corr - corrLagStats[0] ); + + if ( vad_flag1 == 1 && vad_flag2 == 1 ) + { + hStereoTCA->smooth_dist_reg_prv_corr = SMOOTH_DIST_FACTOR * hStereoTCA->smooth_dist_reg_prv_corr + ( 1.0f - SMOOTH_DIST_FACTOR ) * dist_reg_prv_corr; + + mvr2r( &( hStereoTCA->delay_0_mem[1] ), &( hStereoTCA->delay_0_mem[0] ), MAX_DELAYREGLEN - 1 ); + + hStereoTCA->delay_0_mem[MAX_DELAYREGLEN - 1] = 0.2f * hStereoTCA->delay_0_mem[MAX_DELAYREGLEN - 1] + 0.8f * corrLagStats[0]; + + if ( fabsf( reg_prv_corr - hStereoTCA->delay_0_mem[0] ) > 25 ) + { + set_f( &( hStereoTCA->delay_0_mem[0] ), hStereoTCA->delay_0_mem[MAX_DELAYREGLEN - 1], MAX_DELAYREGLEN - 1 ); + } + } + else + { + hStereoTCA->smooth_dist_reg_prv_corr = 0.; + } + + if ( vad_flag1 == 0 || vad_flag2 == 0 ) + { + corrLagStats[0] = TRUNC( hStereoTCA->delay_0_mem[MAX_DELAYREGLEN - 1] ); + } + + /* second iteration of xcorr update @ inputFs with interp*/ + tempRK = hStereoTCA->corrEstLT - lagSearchRange[0] + corrLagStats[0]; + set_f( rInterp, 0, MAX_INTERPOLATE ); + + /* select the Rk interp sinc window */ + winInterp = ica_sincInterp4 + SINC_ORDER1; + if ( dsFactor == 2 ) + { + winInterp = ica_sincInterp2 + SINC_ORDER1; + } + else if ( dsFactor == 6 ) + { + winInterp = ica_sincInterp6 + SINC_ORDER1; + } + + corrLagStats[1] = corrLagStats[0] * dsFactor; + + interpMin = max( -( dsFactor - 1 ), -corrLagStats[1] - L_NCSHIFT_DS * dsFactor ); + interpMax = min( ( dsFactor - 1 ), L_NCSHIFT_DS * dsFactor - corrLagStats[1] ); + interpLen = interpMax - interpMin + 1; + + for ( i = interpMin, k = 0; i <= interpMax; i++, k++ ) + { + rInterp[k] = 0.0f; + for ( j = -SINC_ORDER1 / dsFactor; j <= SINC_ORDER1 / dsFactor; j++ ) + { + m = j * dsFactor; + if ( ( m - i >= -SINC_ORDER1 ) && ( m - i <= SINC_ORDER1 ) ) + { + if ( j > lagSearchRange[1] - corrLagStats[0] ) + { + rInterp[k] += winInterp[m - i] * tempRK[lagSearchRange[1] - corrLagStats[0]]; + } + else if ( j < lagSearchRange[0] - corrLagStats[0] ) + { + rInterp[k] += winInterp[m - i] * tempRK[lagSearchRange[0] - corrLagStats[0]]; + } + else + { + rInterp[k] += winInterp[m - i] * tempRK[j]; + } + } + } + } + corrLagStats[1] += ( maximum( rInterp, interpLen, &tempF ) + interpMin ); + + /* save corr lag stats for the current frame */ + mvs2s( corrLagStats, hStereoTCA->corrLagStats, 3 ); + + return; +} + + +/*--------------------------------------------------------------- + * Function estDownmixGain() + * + * Down mix gain estimation module; convert L/R to M/S. + * ---------------------------------------------------------------*/ + +static void estDownmixGain( + STEREO_TCA_ENC_HANDLE hStereoTCA, /* i/o: Stereo TCA Encoder handle */ + const float *chan1, /* i : reference signal */ + const float *chan2, /* i/o: target signal to be scaled */ + const int16_t ncShift, /* i : shift */ + const int16_t length, /* i : input frame length */ + const int16_t element_mode, /* i : element mode */ + STEREO_CLASSIF_HANDLE hStereoClassif, /* i/o: stereo classifier handle */ + const int16_t tdm_LRTD_flag /* i : LRTD stereo mode flag */ +) +{ + int16_t i, i1, i2; + float tempN, tempD; + float alpha, currentGain; + float unclr_instTargetGain; + + if ( hStereoTCA->refChanIndx == L_CH_INDX ) + { + i1 = 0; + i2 = ncShift; + } + else + { + i1 = ncShift; + i2 = 0; + } + + /* abs sample sum estimation */ + tempN = 0; + tempD = 0; + for ( i = 0, tempN = 0.0f, tempD = 0.0f; i < length; i++ ) + { + tempN += fabsf( chan1[i1 + i] ); + tempD += fabsf( chan2[i2 + i] ); + } + + alpha = hStereoTCA->corrStatsSmoothFac; + currentGain = ( tempD == 0 ) ? ( hStereoTCA->prevTargetGain ) : ( tempN / tempD ); + currentGain = max( 1e-5f, currentGain ); + hStereoTCA->instTargetGain = currentGain; + currentGain = (alpha) *log10f( hStereoTCA->prevTargetGain ) + ( 1.0f - alpha ) * log10f( currentGain ); + + if ( element_mode == IVAS_CPE_TD && hStereoClassif != NULL ) + { + tempD = powf( 10, currentGain ); + unclr_instTargetGain = log10f( tempN / ( tempD + 1e-5f ) + 1.0f ); + hStereoClassif->unclr_fv[E_ica_instTargetGain] = unclr_instTargetGain; + } + + if ( tdm_LRTD_flag == 1 ) + { + currentGain = 0.0f; + } + else if ( hStereoTCA->LRTD_G_ATT_cnt > 1 ) /* lrtd_mode == 1 but tdm_LRTD_flag still 0 */ + { + currentGain /= ( (float) hStereoTCA->LRTD_G_ATT_cnt ); + } + + /* quantize the target gain */ + hStereoTCA->indx_ica_gD = (int16_t) usquant( currentGain, &tempD, STEREO_TCA_GDMIN, STEREO_TCA_GDSTEP, 1 << STEREO_BITS_TCA_GD ); + hStereoTCA->targetGain = powf( 10, tempD ); + + return; +} + +/*--------------------------------------------------------------- + * Function icaMemUpdate() + * + * Recalculates the memories corresponding to the previous frame. + * ---------------------------------------------------------------*/ + +static void icaMemUpdate( + Encoder_State **sts, /* i/o: encoder state structure */ + CPE_ENC_HANDLE hCPE, /* i : CPE encoder structure */ + float *bufChanL, /* i/o: L signal correction from previous frame */ + float *bufChanR, /* i/o: R signal correction from previous frame */ + const int16_t lMemRecalc, /* i : memory length at input Sampling Rate */ + const int16_t lMemRecalc_SCh, /* i : SCh memory length at input Sampling Rate*/ + const int16_t input_frame /* i : frame length */ +) +{ + float *ptr1, *ptr2; + int16_t i; + float ratio_L, One_m_Ratio; + + if ( hCPE->element_mode == IVAS_CPE_TD ) + { + /* Recalc of the memories - Downmix @ inputFs */ + /*----------------------------------------------------------------* + * Create first part of the mixture using the old ratios + *----------------------------------------------------------------*/ + + if ( hCPE->hStereoTD->tdm_last_SM_flag ) + { + ratio_L = hCPE->hStereoTD->tdm_last_ratio_SM; + One_m_Ratio = ratio_L - 1.0f; + } + else + { + ratio_L = hCPE->hStereoTD->tdm_last_ratio; + One_m_Ratio = 1.0f - ratio_L; + } + + ptr1 = sts[0]->input - lMemRecalc - lMemRecalc_SCh; + ptr2 = sts[1]->input - lMemRecalc - lMemRecalc_SCh; + + if ( hCPE->last_element_mode == IVAS_CPE_TD ) + { + if ( hCPE->hStereoTD->flag_skip_DMX ) + { + for ( i = lMemRecalc_SCh; i < lMemRecalc + lMemRecalc_SCh; i++ ) + { + ptr1[i] = bufChanL[i]; + ptr2[i] = bufChanR[i]; + } + } + else + { + for ( i = lMemRecalc_SCh; i < lMemRecalc + lMemRecalc_SCh; i++ ) + { + ptr1[i] = bufChanR[i] * One_m_Ratio + bufChanL[i] * ratio_L; + ptr2[i] = bufChanL[i] * One_m_Ratio - bufChanR[i] * ratio_L; + } + } + } + else + { + float fac, incr, tmp1, tmp2; + + /* reset the past input signal (the signal is used in SWB BWE) */ + set_f( sts[1]->input - input_frame, 0, input_frame ); + + if ( hCPE->hStereoTD->flag_skip_DMX ) + { + /* reconstruction of the Secondary channel past segment */ + for ( i = 0; i < lMemRecalc_SCh; i++ ) + { + ptr2[i] = bufChanL[i] * One_m_Ratio + bufChanR[i] * ratio_L; + } + + /* overlap-add smoothing to equalize for different DMX signal energy between DFT and TD stereo */ + fac = 1.0f / (float) lMemRecalc; + incr = fac; + + for ( i = lMemRecalc_SCh; i < lMemRecalc + lMemRecalc_SCh; i++ ) + { + tmp1 = bufChanL[i]; + tmp2 = bufChanR[i]; + + ptr1[i] = ( 1.0f - fac ) * ptr1[i] + fac * tmp1; + /*ptr2[i] = (1.0f - fac) * ptr2[i] + fac * tmp2;*/ /* the secondary channel (downmixed) buffer of DFT stereo is empty ! */ + ptr2[i] = tmp2; + + fac += incr; + } + } + else + { + /* reconstruction of the Secondary channel past segment */ + for ( i = 0; i < lMemRecalc_SCh; i++ ) + { + ptr2[i] = bufChanL[i] * One_m_Ratio - bufChanR[i] * ratio_L; + } + + /* overlap-add smoothing to equalize for different DMX signal energy between DFT and TD stereo */ + fac = 1.0f / (float) lMemRecalc; + incr = fac; + + for ( i = lMemRecalc_SCh; i < lMemRecalc + lMemRecalc_SCh; i++ ) + { + tmp1 = bufChanR[i] * One_m_Ratio + bufChanL[i] * ratio_L; + tmp2 = bufChanL[i] * One_m_Ratio - bufChanR[i] * ratio_L; + + ptr1[i] = ( 1.0f - fac ) * ptr1[i] + fac * tmp1; + /*ptr2[i] = (1.0f - fac) * ptr2[i] + fac * tmp2;*/ /* the secondary channel (downmixed) buffer of DFT stereo is empty ! */ + ptr2[i] = tmp2; + + fac += incr; + } + } + } + } + + if ( hCPE->hStereoICBWE != NULL ) + { + assert( L_MEM_RECALC_TBE_NS <= L_MEM_RECALC_NS ); + i = NS2SA( sts[0]->input_Fs, L_MEM_RECALC_TBE_NS ); + mvr2r( bufChanL + lMemRecalc + lMemRecalc_SCh - i, hCPE->hStereoICBWE->icbwe_inp_mem[0], i ); + mvr2r( bufChanR + lMemRecalc + lMemRecalc_SCh - i, hCPE->hStereoICBWE->icbwe_inp_mem[1], i ); + } + + return; +} + +/*--------------------------------------------------------------- + * stereo_tca_enc() + * + * Stereo temporal inter-channel adjustment/allocation processing module; + * Downmix, convert L/R to M/S. + * ---------------------------------------------------------------*/ + +void stereo_tca_enc( + CPE_ENC_HANDLE hCPE, /* i : CPE encoder structure */ + const int16_t input_frame /* i : length of a frame per channel */ +) +{ + /* temp variables */ + int16_t i, dsFactor, lMemRecalc; + Encoder_State **sts; + STEREO_TCA_ENC_HANDLE hStereoTCA; + + /* Buffers, input Left and right channels @ input_Fs*/ + int16_t lMemRecalc_SCh; + float bufChanL[L_MEM_RECALC_48K + L_MEM_RECALC_48k_SCH + L_FRAME48k + L_NCSHIFTMAX]; + float bufChanR[L_MEM_RECALC_48K + L_MEM_RECALC_48k_SCH + L_FRAME48k + L_NCSHIFTMAX]; + float input_mem_loc[2][NS2SA( 48000, L_MEM_RECALC_NS + L_MEM_RECALC_SCH_NS )]; + float *ptrChanL, *ptrChanR; + + /* Buffers at internal sampling rate, i.e., CORR_INTER_FS */ + float bufChanL_DS[L_FRAME_DS + ADDED_MEM_DS]; + float bufChanR_DS[L_FRAME_DS + ADDED_MEM_DS]; + float *ptrChanL_DS, *ptrChanR_DS; + float *target; + int16_t target_idx; + + int16_t prevNCShift, currentNCShift; + int16_t tempLag[2]; + float corrEstStage2[N_MAX_SHIFT_CHANGE + 1]; + + /* temp variables */ + float tempF, tempF1; + int16_t tempS, tempS_buff[3]; + int16_t maxCorrStatsDev, L_shift_adapt; + int16_t musicMode = 0, neighborLimit; + int32_t input_Fs; + int16_t prev_ICA_flag; + + /* initialization */ + sts = hCPE->hCoreCoder; + hStereoTCA = hCPE->hStereoTCA; + + input_Fs = sts[0]->input_Fs; + + lMemRecalc = NS2SA( input_Fs, L_MEM_RECALC_NS ); + lMemRecalc_SCh = NS2SA( input_Fs, L_MEM_RECALC_SCH_NS ); + + if ( hCPE->element_mode == IVAS_CPE_MDCT ) + { + return; + } + + /* populate L/R memories into current buffers */ + mvr2r( hStereoTCA->memChanL, bufChanL, lMemRecalc + lMemRecalc_SCh ); + mvr2r( hStereoTCA->memChanR, bufChanR, lMemRecalc + lMemRecalc_SCh ); + + /* pointers to the current frame */ + ptrChanL = bufChanL + lMemRecalc + lMemRecalc_SCh; + ptrChanR = bufChanR + lMemRecalc + lMemRecalc_SCh; + + /* copy interleaved stereo data to two channels, e.g., L, R */ + mvr2r( sts[0]->input, ptrChanL, input_frame ); + mvr2r( sts[1]->input, ptrChanR, input_frame ); + + /* UNCLR classifier update */ + if ( hCPE->hStereoClassif->lrtd_mode == 0 ) /* Normal TD mode, no attenuation */ + { + hStereoTCA->LRTD_G_ATT_cnt = 1; + } + else if ( hCPE->hStereoTD != NULL ) + { + if ( hCPE->hStereoTD->tdm_LRTD_flag == 0 ) /* lrtd_mode == 1, but in td section */ + { + hStereoTCA->LRTD_G_ATT_cnt++; + hStereoTCA->LRTD_G_ATT_cnt = min( 1000, hStereoTCA->LRTD_G_ATT_cnt ); + } + } + + if ( hCPE->element_mode != IVAS_CPE_TD ) + { + hStereoTCA->refChanIndx = L_CH_INDX; + hStereoTCA->corrStatsSmoothFac = 0.7f; + estDownmixGain( hStereoTCA, ptrChanL, ptrChanR, 0, input_frame, hCPE->element_mode, NULL, 0 ); + hStereoTCA->prevTargetGain = hStereoTCA->targetGain; + + /* back up the L/R missing target */ + mvr2r( bufChanL + input_frame, hStereoTCA->memChanL, lMemRecalc + lMemRecalc_SCh ); + mvr2r( bufChanR + input_frame, hStereoTCA->memChanR, lMemRecalc + lMemRecalc_SCh ); + + hStereoTCA->lMemRecalc = 0; + hStereoTCA->lMemRecalc_12k8 = 0; + hStereoTCA->lMemRecalc_16k = 0; + + return; + } + else if ( hCPE->last_element_mode != IVAS_CPE_TD ) + { + tempF = hStereoTCA->targetGain; + tempF1 = hStereoTCA->prevTargetGain; + tempS = hStereoTCA->prevRefChanIndx; + mvs2s( hStereoTCA->prevCorrLagStats, tempS_buff, 3 ); + stereo_tca_init_enc( hStereoTCA, input_Fs ); + hStereoTCA->targetGain = tempF; + hStereoTCA->prevTargetGain = tempF1; + + if ( hCPE->hStereoClassif->lrtd_mode == 1 ) + { + hStereoTCA->targetGain = min( hStereoTCA->targetGain, 1.0f ); + hStereoTCA->prevTargetGain = min( hStereoTCA->prevTargetGain, 1.0f ); + + hStereoTCA->prevTargetGain = 1; + } + + hStereoTCA->prevRefChanIndx = tempS; + mvs2s( tempS_buff, hStereoTCA->prevCorrLagStats, 3 ); + + /* populate memory */ + if ( hCPE->last_element_mode == IVAS_CPE_MDCT ) + { + mvr2r( sts[0]->input - lMemRecalc - lMemRecalc_SCh, bufChanL, lMemRecalc + lMemRecalc_SCh ); + mvr2r( sts[1]->input - lMemRecalc - lMemRecalc_SCh, bufChanR, lMemRecalc + lMemRecalc_SCh ); + } + } + + /* populate L/R DS memories into current buffers */ + mvr2r( hStereoTCA->memChanL_DS, bufChanL_DS, ADDED_MEM_DS ); + mvr2r( hStereoTCA->memChanR_DS, bufChanR_DS, ADDED_MEM_DS ); + + /* pointers to the current frame of DS */ + ptrChanL_DS = bufChanL_DS + ADDED_MEM_DS; + ptrChanR_DS = bufChanR_DS + ADDED_MEM_DS; + + /* resample factor */ + dsFactor = (int16_t) ( input_Fs / CORR_INTER_FS ); + + /* resample the stereo channels */ + deEmphResample( hStereoTCA, ptrChanL, ptrChanR, ptrChanL_DS, ptrChanR_DS, input_frame, dsFactor ); + + + /* inter-channel corrStats estimation */ + corrStatsEst( hStereoTCA, bufChanL_DS + ADDED_MEM_DS, bufChanR_DS + ADDED_MEM_DS, ( L_FRAME_DS + L_XCORRMEM_DS ), dsFactor, hCPE->hCoreCoder[0]->vad_flag, hCPE->hCoreCoder[1]->vad_flag, hCPE->hStereoClassif ); + + /*-----------------------------------------------------------------* + * refine the ICA stats + *-----------------------------------------------------------------*/ + + prev_ICA_flag = 0; + if ( hCPE->hStereoTD->prev_fr_LRTD_TD_dec && abs( hStereoTCA->prevCorrLagStats[2] ) != 0 ) + { + prev_ICA_flag = 1; + } + + if ( hCPE->hStereoTD->prev_fr_LRTD_TD_dec == 0 || prev_ICA_flag == 1 ) + { + /* initialize the refinement search for NC-shift */ + hStereoTCA->corrLagStats[2] = hStereoTCA->corrLagStats[1]; + + maxCorrStatsDev = N_MAX_SHIFT_CHANGE; + if ( hStereoTCA->corrStatsSmoothFac <= 0.7f ) + { + maxCorrStatsDev = 160; /* L_NCSHIFT_MAX @ 32kHz */ + } + + if ( input_Fs < 32000 ) + { + maxCorrStatsDev = (int16_t) ( maxCorrStatsDev * input_Fs / 32000.0f ); + } + + musicMode = ( hCPE->hCoreCoder[0]->sp_aud_decision0 == 1 || sts[0]->last_core > ACELP_CORE ); + if ( musicMode ) + { + maxCorrStatsDev = 1; + set_s( hStereoTCA->corrLagStats + 1, 0, 2 ); + } + + tempS = ( hStereoTCA->corrLagStats[1] - hStereoTCA->prevCorrLagStats[2] ); + if ( abs( tempS ) > maxCorrStatsDev ) + { + hStereoTCA->corrLagStats[2] = hStereoTCA->prevCorrLagStats[2] + ( ( tempS > 0 ) ? maxCorrStatsDev : -maxCorrStatsDev ); + } + + neighborLimit = maxCorrStatsDev; + + /* refine and search based on the corrlag stats */ + if ( tempS != 0 && dsFactor != 1 && prev_ICA_flag == 0 ) + { + tempF = 0; + if ( !musicMode ) + { + tempLag[0] = min( hStereoTCA->corrLagStats[2], hStereoTCA->prevCorrLagStats[2] ); + tempLag[1] = max( hStereoTCA->corrLagStats[2], hStereoTCA->prevCorrLagStats[2] ); + + neighborLimit = min( 3, maxCorrStatsDev ); + if ( hStereoTCA->prevCorrLagStats[2] < hStereoTCA->corrLagStats[2] ) + { + tempLag[1] = min( tempLag[1], tempLag[0] + neighborLimit ); + } + else + { + tempLag[0] = max( tempLag[0], tempLag[1] - neighborLimit ); + } + + utilCrossCorr( ptrChanL, ptrChanR, NULL, corrEstStage2, tempLag, input_frame, 0 ); + + hStereoTCA->corrLagStats[2] = maximum( corrEstStage2, ( tempLag[1] - tempLag[0] + 1 ), &tempF ); + hStereoTCA->corrLagStats[2] += tempLag[0]; + } + + if ( abs( tempS ) > neighborLimit ) + { + tempLag[0] = hStereoTCA->corrLagStats[1]; + tempLag[1] = hStereoTCA->corrLagStats[1]; + utilCrossCorr( ptrChanL, ptrChanR, NULL, &tempF1, tempLag, input_frame, 0 ); + + if ( tempF1 > tempF || musicMode ) + { + hStereoTCA->corrLagStats[2] = hStereoTCA->prevCorrLagStats[2] + ( ( tempS > 0 ) ? min( (int16_t) abs( tempS ), maxCorrStatsDev ) : max( (int16_t) -abs( tempS ), -maxCorrStatsDev ) ); + } + } + + /* restrict the reference channel for +/- variation */ + if ( ( hStereoTCA->corrLagStats[2] < 0 && hStereoTCA->prevCorrLagStats[2] > 0 ) || ( hStereoTCA->corrLagStats[2] > 0 && hStereoTCA->prevCorrLagStats[2] < 0 ) ) + { + hStereoTCA->corrLagStats[2] = 0; + } + } + + if ( hCPE->hStereoTD->prev_fr_LRTD_TD_dec /*hCPE->hStereoClassif->lrtd_mode*/ == 1 ) /* Content is considered as uncorrelated -> ICA shift is turned off */ + { + hStereoTCA->corrLagStats[2] = 0; + + if ( hCPE->hStereoTD->tdm_LRTD_flag == 1 && prev_ICA_flag == 0 ) + { + hStereoTCA->prevCorrLagStats[2] = 0; + } + } + + /* Perform the following: + 1. adjust samples, + 2. interp shift variation, + 3. gain estimation */ + prevNCShift = (int16_t) abs( hStereoTCA->prevCorrLagStats[2] ); + currentNCShift = (int16_t) abs( hStereoTCA->corrLagStats[2] ); + + if ( hStereoTCA->prevRefChanIndx == L_CH_INDX ) + { + mvr2r( ptrChanL - lMemRecalc - lMemRecalc_SCh, input_mem_loc[0], lMemRecalc + lMemRecalc_SCh ); + v_multc( ptrChanR + prevNCShift - lMemRecalc - lMemRecalc_SCh, hStereoTCA->prevTargetGain, input_mem_loc[1], lMemRecalc + lMemRecalc_SCh ); + } + else + { + mvr2r( ptrChanL + prevNCShift - lMemRecalc - lMemRecalc_SCh, input_mem_loc[0], lMemRecalc + lMemRecalc_SCh ); + v_multc( ptrChanR - lMemRecalc - lMemRecalc_SCh, hStereoTCA->prevTargetGain, input_mem_loc[1], lMemRecalc + lMemRecalc_SCh ); + } + + target = ptrChanR; + target_idx = R_CH_INDX; + /* identify target signal to correct for shift variations */ + if ( ( prevNCShift == 0 && hStereoTCA->corrLagStats[2] < 0 ) || ( hStereoTCA->prevRefChanIndx == R_CH_INDX ) ) + { + target = ptrChanL; + target_idx = L_CH_INDX; + } + + /* target signal adjustment for temporal shift variations */ + if ( ( prevNCShift - currentNCShift ) != 0 ) + { + L_shift_adapt = L_SHIFT_ADAPT_16k; + if ( input_Fs > INT_FS_16k ) + { + L_shift_adapt = L_SHIFT_ADAPT_MAX; + } + + /* Note!! : Always keep the assert (prevNCShift>>1) below according to the equation used here to get tempS */ + tempS = ( currentNCShift >> 1 ); + if ( abs( currentNCShift - prevNCShift ) <= min( N_MAX_SHIFT_CHANGE, N_MAX_SHIFT_CHANGE * input_Fs / 32000.0f ) ) + { + adjustTargetSignal( ( target - tempS ), prevNCShift, currentNCShift, L_shift_adapt, 0 ); + } + else + { + tempS = min( max( tempS, prevNCShift - currentNCShift + L_shift_adapt - input_frame ), prevNCShift - currentNCShift + lMemRecalc ); + adjustTargetSignal( ( target - tempS ), prevNCShift, currentNCShift, L_shift_adapt, 1 ); + } + + if ( target_idx == L_CH_INDX ) + { + mvr2r( target - tempS, &( input_mem_loc[target_idx][lMemRecalc + lMemRecalc_SCh - tempS - currentNCShift] ), currentNCShift + tempS ); + } + else + { + v_multc( target - tempS, hStereoTCA->prevTargetGain, &( input_mem_loc[target_idx][lMemRecalc + lMemRecalc_SCh - tempS - currentNCShift] ), currentNCShift + tempS ); + } + } + + /* reference channel index */ + if ( hStereoTCA->corrLagStats[2] >= 0 ) + { + hStereoTCA->refChanIndx = L_CH_INDX; + } + else + { + hStereoTCA->refChanIndx = R_CH_INDX; + } + + /* Estimate and quantize the gain for scaling */ + estDownmixGain( hStereoTCA, ptrChanL, ptrChanR, currentNCShift, ( input_frame - currentNCShift ), hCPE->element_mode, hCPE->hStereoClassif, hCPE->hStereoTD->tdm_LRTD_flag ); + + /* quantize the corrStats */ + hStereoTCA->indx_ica_NCShift = (int16_t) usquant( ( (float) currentNCShift ) / dsFactor, &tempF, 0, 1.0f, 1 << STEREO_BITS_TCA_CORRSTATS ); + } + else + { + hStereoTCA->refChanIndx = L_CH_INDX; + hStereoTCA->corrLagStats[2] = 0; + hStereoTCA->prevCorrLagStats[2] = 0; + hStereoTCA->indx_ica_NCShift = 0; + + currentNCShift = 0; /* only to avoid compilation warning */ + target = ptrChanL; /* only to avoid compilation warning */ + target_idx = L_CH_INDX; /* only to avoid compilation warning */ + + mvr2r( ptrChanL - lMemRecalc - lMemRecalc_SCh, input_mem_loc[0], lMemRecalc + lMemRecalc_SCh ); + v_multc( ptrChanR - lMemRecalc - lMemRecalc_SCh, hStereoTCA->prevTargetGain, input_mem_loc[1], lMemRecalc + lMemRecalc_SCh ); + + /* Estimate and quantize the gain for scaling */ + estDownmixGain( hStereoTCA, ptrChanL, ptrChanR, 0, input_frame, hCPE->element_mode, hCPE->hStereoClassif, hCPE->hStereoTD->tdm_LRTD_flag ); + } + + /*-----------------------------------------------------------------* + * updates and memory backups + *-----------------------------------------------------------------*/ + + /* back up the L/R missing target */ + mvr2r( bufChanL + input_frame, hStereoTCA->memChanL, lMemRecalc + lMemRecalc_SCh ); + mvr2r( bufChanR + input_frame, hStereoTCA->memChanR, lMemRecalc + lMemRecalc_SCh ); + + if ( currentNCShift != 0 ) + { + /* Temporal channel adjustment of the LA samples based on the NC shift */ + tcaTargetCh_LA( hStereoTCA, ptrChanL, ptrChanR, currentNCShift, input_frame ); + } + + /* Update of changed samples corresponding to the memory */ + icaMemUpdate( sts, hCPE, input_mem_loc[0], input_mem_loc[1], lMemRecalc, lMemRecalc_SCh, input_frame ); + + /* populate the st->input target buffer */ + if ( hCPE->hStereoTD->prev_fr_LRTD_TD_dec == 0 || prev_ICA_flag == 1 ) + { + mvr2r( target + currentNCShift, sts[target_idx]->input, input_frame ); + } + + if ( hCPE->element_mode != IVAS_CPE_DFT ) + { + /* Scale the Right channel with the gain */ + int16_t j; + int16_t l_ica_ovl = NS2SA( input_Fs, STEREO_L_TCA_OVLP_NS ); + float winSlope = 1.0f / (float) l_ica_ovl; + + tempF1 = hStereoTCA->targetGain; + tempF = hStereoTCA->prevTargetGain; + + for ( i = 0, j = 0; i < l_ica_ovl; i++, j++ ) + { + sts[1]->input[i] = ( 1.0f - j * winSlope ) * tempF * sts[1]->input[i] + ( j * winSlope ) * tempF1 * sts[1]->input[i]; + } + for ( ; i < input_frame; i++ ) + { + sts[1]->input[i] *= tempF1; + } + } + + /* update L/R DS memories */ + mvr2r( bufChanL_DS + L_FRAME_DS, hStereoTCA->memChanL_DS, ADDED_MEM_DS ); + mvr2r( bufChanR_DS + L_FRAME_DS, hStereoTCA->memChanR_DS, ADDED_MEM_DS ); + + /* save the reference channel index for next frame */ + hStereoTCA->prevRefChanIndx = hStereoTCA->refChanIndx; + + /* save the corr lag stats for next frame */ + mvs2s( hStereoTCA->corrLagStats, hStereoTCA->prevCorrLagStats, 3 ); + + /* save the target gain for next frame */ + hStereoTCA->prevTargetGain = hStereoTCA->targetGain; + + return; +} + +/*-------------------------------------------------------------------* + * stereo_tca_init_enc() + * + * Stereo temporal inter-channel adjustment (ICA) encoder initialization + *-------------------------------------------------------------------*/ + +void stereo_tca_init_enc( + STEREO_TCA_ENC_HANDLE hStereoTCA, /* i/o: Stereo ICA handle */ + const int32_t input_Fs /* i : input sampling frequency */ +) +{ + hStereoTCA->lMemRecalc = NS2SA( input_Fs, L_MEM_RECALC_NS ); + hStereoTCA->lMemRecalc_12k8 = (int16_t) ( ( hStereoTCA->lMemRecalc * INT_FS_12k8 ) / input_Fs ); + hStereoTCA->lMemRecalc_16k = (int16_t) ( ( hStereoTCA->lMemRecalc * INT_FS_16k ) / input_Fs ); + + hStereoTCA->refChanIndx = L_CH_INDX; + hStereoTCA->prevRefChanIndx = L_CH_INDX; + + hStereoTCA->targetGain = 1.0f; + hStereoTCA->prevTargetGain = 1.0f; + hStereoTCA->instTargetGain = 1.0f; + hStereoTCA->corrStatsSmoothFac = 0.7f; + + set_s( hStereoTCA->corrLagStats, 0, 3 ); + set_s( hStereoTCA->prevCorrLagStats, 0, 3 ); + + set_f( hStereoTCA->memChanL, 0.0f, L_MEM_RECALC_48K + L_MEM_RECALC_48k_SCH ); + set_f( hStereoTCA->memChanR, 0.0f, L_MEM_RECALC_48K + L_MEM_RECALC_48k_SCH ); + set_f( hStereoTCA->memChanL_DS, 0.0f, ADDED_MEM_DS ); + set_f( hStereoTCA->memChanR_DS, 0.0f, ADDED_MEM_DS ); + hStereoTCA->mem_tempF = 0.; + set_f( hStereoTCA->corrEstPrev[0], 0.0f, 2 * L_NCSHIFT_DS + 1 ); + set_f( hStereoTCA->corrEstPrev[1], 0.0f, 2 * L_NCSHIFT_DS + 1 ); + set_f( hStereoTCA->corrEstPrev[2], 0.0f, 2 * L_NCSHIFT_DS + 1 ); + + set_f( hStereoTCA->corrEstLT, 0.0f, 2 * L_NCSHIFT_DS + 1 ); + set_f( hStereoTCA->memdecim, 0.0f, 12 ); + hStereoTCA->ica_envVarLT = 2000.0f; + + set_f( hStereoTCA->C_mem, 0.0f, 2 * L_NCSHIFT_DS + 1 ); + hStereoTCA->E1_mem = 0.0f; + hStereoTCA->E2_mem = 0.0f; + set_f( hStereoTCA->delay_0_mem, 0.0f, MAX_DELAYREGLEN ); + hStereoTCA->smooth_dist_reg_prv_corr = 1.0f; + hStereoTCA->LRTD_G_ATT_cnt = 1; + + return; +} + + +/*-------------------------------------------------------------------* + * Function unclr_calc_corr_features() + * + *-------------------------------------------------------------------*/ + +static void unclr_calc_corr_features( + STEREO_CLASSIF_HANDLE hStereoClassif, /* i/o: stereo classifier handle */ + STEREO_TCA_ENC_HANDLE hStereoTCA, /* i/o: ICA Stereo Encoder handle */ + const float buf1[], /* i : left channel */ + const float buf2[], /* i : right channel */ + const int16_t length, /* i : length of input signal buffers */ + const float corrEst[], /* i : buffer containing inter-channel correlation values */ + const int16_t lagSearchRange[], /* i : minimum and maximum lags for corrEst[] */ + float *corrEst_ncorr /* o : norm. x-correlation btw. current and previous correlation buffers */ +) +{ + int16_t i, corrLagMax, d_corrLagMax, tempLen; + float num, den; + float corrL, corrR, ener, ener_side, mono_i, side_i, ic_Lm, ic_Rm, tdm_es_em, m_corrL_corrR, d_corrL_corrR; + float prod_i, sum_prod, corrEstMax; + + corrL = 1.0f; + corrR = 1.0f; + ener = 1.0f; + ener_side = 1.0f; + sum_prod = 0.0f; + + for ( i = 0; i < length; i++ ) + { + mono_i = ( buf1[i] + buf2[i] ) / 2.0f; + corrL += buf1[i] * mono_i; + corrR += buf2[i] * mono_i; + ener += mono_i * mono_i; + side_i = ( buf1[i] - buf2[i] ) / 2.0f; + ener_side += side_i * side_i; + prod_i = buf1[i] * buf2[i]; + sum_prod += prod_i; + } + + /* average energy of L and R channels */ + hStereoClassif->ave_ener_L = hStereoTCA->E1_mem / length; + hStereoClassif->ave_ener_R = hStereoTCA->E2_mem / length; + + /* unnormalized L/R correlation */ + sum_prod = log10f( fabsf( sum_prod ) + 1.0f ); + hStereoClassif->unclr_fv[E_sum_prod] = sum_prod; + hStereoClassif->xtalk_fv[E_sum_prod] = sum_prod; + + /* S/M energy ratio */ + tdm_es_em = fabsf( 10.0f * ( log10f( sqrtf( ener_side / L_FRAME_DS ) ) - log10f( sqrtf( ener / L_FRAME_DS ) ) ) ); + hStereoClassif->unclr_fv[E_tdm_es_em] = tdm_es_em; + hStereoClassif->xtalk_fv[E_tdm_es_em] = tdm_es_em; + + /* L/R correlation values (zero lag, maximum) */ + corrLagMax = maximum( corrEst, ( lagSearchRange[1] - lagSearchRange[0] + 1 ), &corrEstMax ); + d_corrLagMax = corrLagMax - hStereoClassif->unclr_corrLagMax_prev; + hStereoClassif->unclr_fv[E_d_corrLagMax] = (float) d_corrLagMax; + hStereoClassif->unclr_corrLagMax_prev = corrLagMax; + hStereoClassif->xtalk_fv[E_d_corrLagMax] = (float) d_corrLagMax; + + if ( corrEstMax < 0 ) + { + corrEstMax = 0; + } + + hStereoClassif->unclr_fv[E_corrEst0] = corrEst[abs( lagSearchRange[0] )]; + hStereoClassif->unclr_fv[E_corrEstMax] = corrEstMax; + hStereoClassif->unclr_fv[E_corrLagMax] = corrLagMax; + hStereoClassif->xtalk_fv[E_corrEst0] = corrEst[abs( lagSearchRange[0] )]; + hStereoClassif->xtalk_fv[E_corrEstMax] = corrEstMax; + hStereoClassif->xtalk_fv[E_corrLagMax] = corrLagMax; + + /* L/M and R/M correlation */ + if ( corrL < 0 ) + { + corrL = 0; + } + + if ( corrR < 0 ) + { + corrR = 0; + } + + ic_Lm = corrL / ener; + ic_Rm = corrR / ener; + m_corrL_corrR = max( fabsf( ic_Lm ), fabsf( ic_Rm ) ) - min( fabsf( ic_Lm ), fabsf( ic_Rm ) ); + d_corrL_corrR = log10f( fabsf( corrL - corrR ) + 1.0f ); + + hStereoClassif->unclr_fv[E_m_corrL_corrR] = m_corrL_corrR; + hStereoClassif->unclr_fv[E_d_corrL_corrR] = d_corrL_corrR; + hStereoClassif->xtalk_fv[E_m_corrL_corrR] = m_corrL_corrR; + + /* norm. x-correlation btw. current and previous correlation buffers */ + tempLen = ( 2 * L_NCSHIFT_DS + 1 ); + num = dotp( corrEst, hStereoTCA->corrEstPrev[2], tempLen ); + den = sqrtf( sum2_f( corrEst, tempLen ) * sum2_f( hStereoTCA->corrEstPrev[2], tempLen ) ); + + *corrEst_ncorr = ( den == 0 ) ? 0.0f : ( num / den ); + hStereoClassif->unclr_fv[E_corrEst_ncorr] = *corrEst_ncorr; + hStereoClassif->xtalk_fv[E_corrEst_ncorr] = *corrEst_ncorr; + + return; +} diff --git a/lib_enc/ivas_stereo_icbwe_enc.c b/lib_enc/ivas_stereo_icbwe_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..d4d70a344d3d77fe6329bcfba61a5a3567ad3c37 --- /dev/null +++ b/lib_enc/ivas_stereo_icbwe_enc.c @@ -0,0 +1,814 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "ivas_cnst.h" +#include "prot.h" +#include "ivas_prot.h" +#include "wmc_auto.h" +#include "rom_com.h" +#include "ivas_rom_com.h" + +/*-------------------------------------------------------------------* + * ic_bwe_enc_reset() + * + * core switching reset of IC BWE memory + *-------------------------------------------------------------------*/ + +static void ic_bwe_enc_reset( + STEREO_ICBWE_ENC_HANDLE hStereoICBWE /* i/o: Stereo ICBWE handle */ +) +{ + /* unscaled & scaled SHB synthesis memory */ + set_f( hStereoICBWE->mem_lpc_shbsynth_nonref, 0, LPC_SHB_ORDER ); + + /* inter-channel BWE spectral shape adj. */ + hStereoICBWE->prevSpecMapping = 0; + hStereoICBWE->prevgsMapping = 1.0f; + set_f( &( hStereoICBWE->memShbSpecMapping ), 0, 1 ); + set_f( hStereoICBWE->memShbSpecXcorr, 0, 6 ); + set_f( hStereoICBWE->memGsEnerMap, 1.0f, 2 ); + set_f( hStereoICBWE->mem_nrg_L, 0, 2 ); + set_f( hStereoICBWE->mem_nrg_R, 0, 2 ); + set_f( hStereoICBWE->mem_nrg_DMX, 0, 2 ); + hStereoICBWE->gDes_pastFrame = 1.0f; + hStereoICBWE->icbweRefEner = 0.0f; + + return; +} + +/*--------------------------------------------------------------------------* + * ic_bwe_specMapping() + * + * Encode and apply the spectral shape mapping of ref to the non-ref channel + *---------------------------------------------------------------------------*/ + +static int16_t ic_bwe_enc_specMapping( + const float *shb_frame_target, /* i : target shb */ + float *shb_synth_nonref, /* o : non-ref shb synth */ + float *specMapping, /* i/o: current frame's mapping */ + float *memShbSpecMapping, /* i/o: ic bwe filtering memory */ + float *memShbSpecXcorr /* i/o: ic bwe spec mapping scorr memory */ +) +{ + int16_t idx; + float Txx1 = 0, Txx2 = 0, Txx3 = 0, T_desired = 0; + float T_nonref_target; + float temp, temp0, temp1, temp2, temp3, alpha; + float a, b, c; + float u, u1, u2; + + alpha = 0.5f; + /* Calculate rxx(1)/rxx(0) of the non ref target */ + temp0 = dotp( shb_frame_target, shb_frame_target, L_FRAME16k - 1 ); + temp1 = dotp( shb_frame_target, shb_frame_target + 1, L_FRAME16k - 1 ); + + /* Smoothing */ + temp0 = alpha * memShbSpecXcorr[0] + ( 1 - alpha ) * temp0; + temp1 = alpha * memShbSpecXcorr[1] + ( 1 - alpha ) * temp1; + memShbSpecXcorr[0] = temp0; + memShbSpecXcorr[1] = temp1; + + T_nonref_target = ( temp0 != 0 ) ? ( temp1 / temp0 ) : ( 0 ); + + /* Calculate rxx(1)/rxx(0) of the non ref synth */ + temp0 = dotp( shb_synth_nonref, shb_synth_nonref, L_FRAME16k - 3 ); + temp1 = dotp( shb_synth_nonref, shb_synth_nonref + 1, L_FRAME16k - 3 ); + temp2 = dotp( shb_synth_nonref, shb_synth_nonref + 2, L_FRAME16k - 3 ); + temp3 = dotp( shb_synth_nonref, shb_synth_nonref + 3, L_FRAME16k - 3 ); + + /* Smoothing */ + temp0 = alpha * memShbSpecXcorr[2] + ( 1 - alpha ) * temp0; + temp1 = alpha * memShbSpecXcorr[3] + ( 1 - alpha ) * temp1; + temp2 = alpha * memShbSpecXcorr[4] + ( 1 - alpha ) * temp2; + temp3 = alpha * memShbSpecXcorr[5] + ( 1 - alpha ) * temp3; + + memShbSpecXcorr[2] = temp0; + memShbSpecXcorr[3] = temp1; + memShbSpecXcorr[4] = temp2; + memShbSpecXcorr[5] = temp3; + + if ( temp0 != 0 ) + { + Txx1 = temp1 / temp0; + Txx2 = temp2 / temp0; + Txx3 = temp3 / temp0; + } + + T_desired = T_nonref_target; + + a = 2 * Txx2 * T_desired - Txx3 - Txx1; + b = ( 2 * T_desired * Txx1 - Txx2 - 1.0f ); + c = ( T_desired - Txx1 ); + + u = *specMapping; + temp = ( b * b - 4 * a * c ); + if ( temp >= 0 && a != 0 ) + { + temp = sqrtf( temp ); + u1 = ( -b + temp ) / ( 2 * a ); + u2 = ( -b - temp ) / ( 2 * a ); + + if ( fabsf( u1 ) < 1.0f && fabsf( u2 ) < 1.0f ) + { + u = min( u1, u2 ); + } + else if ( fabsf( u1 ) < 1.0f ) + { + u = u1; + } + else if ( fabsf( u2 ) < 1.0f ) + { + u = u2; + } + } + u = max( min( u, 0 ), -0.6f ); + + /* Quantize spec. mapping **/ + idx = (int16_t) usquant( u, specMapping, -0.6f, 0.2f, 1 << STEREO_ICBWE_SPBITS ); + + /* IC-BWE spec mapping */ + deemph( shb_synth_nonref, *specMapping, L_FRAME16k, memShbSpecMapping ); + + return idx; +} + +/*----------------------------------------------------------------------* + * ic_bwe_gsMapping() + * + * Encode and apply the gain shape mapping of ref to the non-ref channel + *-----------------------------------------------------------------------*/ + +/*! r: return quant. index value */ +static int16_t ic_bwe_enc_gsMapping( + const float relG_targ, /* i : gDes, rel gain target */ + const float *shbSynth, /* i : ref synth signal */ + float *synthSHB_nonref, /* i : nonref synth signal */ + float *gsMapping, /* i/o: gs mapping */ + float *memEner, + const int16_t element_mode /* i : element mode */ +) +{ + int16_t i; + int16_t idx = 0; + float temp1, temp2; + float alpha; + float prev_gsMapping; + + alpha = 0; + prev_gsMapping = *gsMapping; + + /* rel gain of synth signals */ + for ( i = 0, temp1 = 0, temp2 = 0; i < L_FRAME16k; i++ ) + { + temp1 += fabsf( shbSynth[i] ); + temp2 += fabsf( synthSHB_nonref[i] ); + } + temp1 = alpha * memEner[0] + ( 1 - alpha ) * temp1; + temp2 = alpha * memEner[1] + ( 1 - alpha ) * temp2; + + memEner[0] = temp1; + memEner[1] = temp2; + + *gsMapping = ( temp2 == 0 ) ? ( *gsMapping ) : ( ( relG_targ * temp1 ) / temp2 ); + temp2 = ( 0.0f ) * log10f( prev_gsMapping ) + ( 1.0f ) * log10f( *gsMapping ); /* no impact from prev_gsMapping */ + + /* quantize the IC-BWE GS mapping*/ + if ( element_mode == IVAS_CPE_TD ) + { + idx = squant( temp2, gsMapping, icbwe_gsMapping_tbl, 1 << STEREO_ICBWE_GSBITS ); + } + else + { + idx = squant( temp2, gsMapping, icbwe_gsMappingDFT_tbl, 1 << STEREO_ICBWE_GSBITS_DFT ); + } + + *gsMapping = powf( 10, *gsMapping ); + + return idx; +} + + +/*----------------------------------------------------------------------* + * icbwe_dft_stereo_param() + * + * Estimate ICBWE parameters in DFT stereo + *-----------------------------------------------------------------------*/ + +static void icbwe_dft_stereo_param( + STEREO_ICBWE_ENC_HANDLE hStereoICBWE, /* i/o: */ + STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i : */ + Encoder_State *st, /* i/o: */ + float *shb_synth_nonref /* i/o: */ +) +{ + float slopeILD, normFac, gDes, alpha; + int16_t gsIndx, spIndx; + float *nrg_L, *nrg_R, *nrg_DMX; + float sum_nrg_L, sum_nrg_R, sum_nrg_DMX; + const float slope_table[4] = { -2.17141801027151f, -1.29118591145892f, -0.588623666024448f, 0 }; + const float spec_table[4] = { -0.6f, -0.4f, -0.2f, 0 }; + + BSTR_ENC_HANDLE hBstr = st->hBstr; + + normFac = 2.5f; /* 1000 * (10/((14400+10400)/2 - (6400+10400)/2)) */ + + nrg_L = hStereoDft->nrg_L; + nrg_R = hStereoDft->nrg_R; + nrg_DMX = hStereoDft->nrg_DMX; + + alpha = 0.0f; + hStereoICBWE->mem_nrg_L[0] = alpha * hStereoICBWE->mem_nrg_L[0] + ( 1 - alpha ) * nrg_L[0]; + hStereoICBWE->mem_nrg_R[0] = alpha * hStereoICBWE->mem_nrg_R[0] + ( 1 - alpha ) * nrg_R[0]; + hStereoICBWE->mem_nrg_DMX[0] = alpha * hStereoICBWE->mem_nrg_DMX[0] + ( 1 - alpha ) * nrg_DMX[0]; + hStereoICBWE->mem_nrg_L[1] = alpha * hStereoICBWE->mem_nrg_L[1] + ( 1 - alpha ) * nrg_L[1]; + hStereoICBWE->mem_nrg_R[1] = alpha * hStereoICBWE->mem_nrg_R[1] + ( 1 - alpha ) * nrg_R[1]; + hStereoICBWE->mem_nrg_DMX[1] = alpha * hStereoICBWE->mem_nrg_DMX[1] + ( 1 - alpha ) * nrg_DMX[1]; + + sum_nrg_L = sum_f( hStereoICBWE->mem_nrg_L, 2 ); + sum_nrg_R = sum_f( hStereoICBWE->mem_nrg_R, 2 ); + sum_nrg_DMX = sum_f( hStereoICBWE->mem_nrg_DMX, 2 ); + + /* refChanIndex_bwe refinement */ + if ( ( sum_nrg_R < 0.64f * sum_nrg_L && hStereoICBWE->refChanIndx_bwe == hStereoICBWE->prev_refChanIndx_bwe ) || sum_nrg_R < 0.36f * sum_nrg_L ) + { + hStereoICBWE->refChanIndx_bwe = L_CH_INDX; + } + else if ( ( sum_nrg_L < 0.64f * sum_nrg_R && hStereoICBWE->refChanIndx_bwe == hStereoICBWE->prev_refChanIndx_bwe ) || sum_nrg_L < 0.36f * sum_nrg_R ) + { + hStereoICBWE->refChanIndx_bwe = R_CH_INDX; + } + + /* Initialization of spIndx */ + slopeILD = 0; + spIndx = squant( slopeILD, &slopeILD, slope_table, 1 << STEREO_ICBWE_SPBITS_DFT ); + + if ( ( st->extl == SWB_TBE || st->extl == WB_TBE || st->extl == FB_TBE ) && st->flag_ACELP16k == 1 ) + { + /* Spec Mapping Estimate */ + slopeILD = normFac * ( log10f( ( hStereoICBWE->mem_nrg_L[1] * hStereoICBWE->mem_nrg_R[0] ) / ( hStereoICBWE->mem_nrg_R[1] * hStereoICBWE->mem_nrg_L[0] ) ) ); + slopeILD = ( hStereoICBWE->refChanIndx_bwe == L_CH_INDX ) ? ( -slopeILD ) : ( slopeILD ); + spIndx = squant( slopeILD, &slopeILD, slope_table, 1 << STEREO_ICBWE_SPBITS_DFT ); + if ( spec_table[spIndx] * hStereoICBWE->prevSpecMapping < 0 ) + { + slopeILD = 0; + spIndx = squant( slopeILD, &slopeILD, slope_table, 1 << STEREO_ICBWE_SPBITS_DFT ); + } + hStereoICBWE->prevSpecMapping = spec_table[spIndx]; + + /* ic bwe spec mapping application */ + deemph( shb_synth_nonref, hStereoICBWE->prevSpecMapping, L_FRAME16k, &hStereoICBWE->memShbSpecMapping ); + } + else + { + hStereoICBWE->memShbSpecMapping = 0; + hStereoICBWE->prevSpecMapping = 0; + } + + /* gsMapping estimate */ + + gDes = ( hStereoICBWE->refChanIndx_bwe == L_CH_INDX ) ? ( sum_nrg_R / sum_nrg_DMX ) : ( sum_nrg_L / sum_nrg_DMX ); + gDes = sqrtf( gDes ); + + alpha = 0.5f; + /* Geometric Mean */ + hStereoICBWE->gDes_pastFrame = powf( hStereoICBWE->gDes_pastFrame, alpha ) * powf( gDes, 1 - alpha ); + + gsIndx = ic_bwe_enc_gsMapping( hStereoICBWE->gDes_pastFrame, hStereoICBWE->shbSynthRef, shb_synth_nonref, &( hStereoICBWE->prevgsMapping ), hStereoICBWE->memGsEnerMap, st->element_mode ); + hStereoICBWE->gDes_pastFrame = gDes; + + push_indice( hBstr, IND_STEREO_ICBWE_REF, hStereoICBWE->refChanIndx_bwe, STEREO_ICBWE_REFBITS ); + if ( st->flag_ACELP16k == 1 ) + { + push_indice( hBstr, IND_STEREO_ICBWE_SP, spIndx, STEREO_ICBWE_SPBITS_DFT ); + } + + /* IC BWE GS mapping */ + push_indice( hBstr, IND_STEREO_ICBWE_GS, gsIndx, STEREO_ICBWE_GSBITS_DFT ); + + return; +} + + +/*-------------------------------------------------------------------* + * stereo_icBWE_enc() + * + * Encode the spatial mapping of reference to the non-reference channels in HB + *-------------------------------------------------------------------*/ + +void stereo_icBWE_enc( + CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ + const float shb_speech_ref[], /* i : SHB speech ref channel */ + float shb_speech_nonref[], /* i/o: SHB speech non-ref channel */ + const float *voice_factors /* i : voicing factors */ +) +{ + int16_t i, j, k, nbSubFr; + STEREO_DFT_ENC_DATA_HANDLE hStereoDft; + STEREO_ICBWE_ENC_HANDLE hStereoICBWE; + BSTR_ENC_HANDLE hBstr; + Encoder_State *st; + int16_t spIndx, gsIndx; + float shb_frame_ref[L_LOOK_16k + L_FRAME16k]; + float excSHB_nonref[L_FRAME16k]; + float shb_frame_nonref[L_LOOK_16k + L_FRAME16k]; + float shb_synth_nonref[L_FRAME16k]; + + float nlMixFac[NB_SUBFR16k]; + float temp1, temp2; + float gDes, gTarget; + int16_t nonRefMemLen, refMemLen; + + /* initialization */ + hStereoDft = hCPE->hStereoDft; + hStereoICBWE = hCPE->hStereoICBWE; + st = hCPE->hCoreCoder[0]; + hBstr = st->hBstr; + + gTarget = hCPE->hStereoTCA->targetGain; /* i : gain norm for target (or R) channel */ + + nonRefMemLen = L_MEM_RECALC_TBE_16K + L_FILT16k; + + if ( st->element_mode == IVAS_CPE_TD ) + { + refMemLen = L_MEM_RECALC_TBE_16K + 20; + } + else if ( st->element_mode == IVAS_CPE_DFT && st->core_brate > SID_2k40 ) + { + refMemLen = 20; + } + else + { + ic_bwe_enc_reset( hStereoICBWE ); + + return; + } + + if ( st->element_mode == IVAS_CPE_DFT ) + { + /* memory resets */ + set_f( hStereoICBWE->mem_shb_speech_nonref, 0, L_LOOK_16k ); + set_f( shb_speech_nonref, 0, L_FRAME16k ); + + /* core switching reset */ + if ( st->last_core != ACELP_CORE || st->core != ACELP_CORE || st->bwidth < SWB || st->extl == -1 ) + { + ic_bwe_enc_reset( hStereoICBWE ); + if ( st->core != ACELP_CORE || st->bwidth < SWB || st->input_Fs < 32000 || st->extl == -1 ) + { + return; + } + } + + set_f( hStereoICBWE->memShbSpecXcorr, 0, 6 ); + + hStereoICBWE->prevRefEner = 0; + hStereoICBWE->prevNonRefEner = 0; + + /* SHB frame buffer offsets for TBE processing << re-adjust check >>*/ + set_f( shb_frame_ref, 0, L_LOOK_16k + L_FRAME16k ); + mvr2r( hStereoICBWE->mem_shb_speech_ref, shb_frame_ref, L_LOOK_16k ); + + /* shb_frame_ref_ICBWE @ (8.75 - shb_speech_delay (=1.25) ms) after shb_speech */ + mvr2r( shb_speech_ref, shb_frame_ref + L_LOOK_16k - refMemLen, L_FRAME16k ); + mvr2r( shb_frame_ref + L_FRAME16k, hStereoICBWE->mem_shb_speech_ref, L_LOOK_16k ); + + if ( ( st->extl == SWB_TBE || st->extl == FB_TBE ) && st->flag_ACELP16k == 1 ) + { + mvr2r( voice_factors, nlMixFac, NB_SUBFR16k ); + /*if( gDes < 0.5f || gDes > 2.0f )*/ + if ( gTarget < 0.5f || gTarget > 2.0f ) + { + v_multc( voice_factors, 0.5f, nlMixFac, NB_SUBFR16k ); + } + + nbSubFr = ( st->flag_ACELP16k == 0 ) ? NB_SUBFR : NB_SUBFR16k; + for ( i = 0, k = 0; i < nbSubFr; i++ ) + { + if ( st->coder_type == UNVOICED || hStereoICBWE->MSFlag == 1 ) + { + temp1 = 0; + temp2 = 1.0f; + } + else + { + temp1 = sqrtf( nlMixFac[i] ); + temp2 = sqrtf( 1.0f - nlMixFac[i] ); + } + + for ( j = 0; j < ( L_FRAME16k / nbSubFr ); j++, k++ ) + { + excSHB_nonref[k] = temp1 * hStereoICBWE->nlExc16k[k] + temp2 * hStereoICBWE->mixExc16k[k]; + } + } + + /* LP synthesis */ + syn_filt( hStereoICBWE->lpSHBRef, LPC_SHB_ORDER, excSHB_nonref, shb_synth_nonref, L_FRAME16k, hStereoICBWE->mem_lpc_shbsynth_nonref, 1 ); + } + else + { + mvr2r( shb_frame_ref, hStereoICBWE->shbSynthRef, L_FRAME16k ); + mvr2r( shb_frame_ref, shb_synth_nonref, L_FRAME16k ); + set_f( hStereoICBWE->mem_lpc_shbsynth_nonref, 0, 10 ); + } + + icbwe_dft_stereo_param( hStereoICBWE, hStereoDft, st, shb_synth_nonref ); + } + else + { + /* SHB frame buffer offsets for TBE processing << re-adjust check >>*/ + set_f( shb_frame_ref, 0, L_LOOK_16k + L_FRAME16k ); + mvr2r( hStereoICBWE->mem_shb_speech_ref, shb_frame_ref, L_LOOK_16k ); + + /* shb_frame_ref_ICBWE @ (8.75 - shb_speech_delay (=1.25) ms) after shb_speech */ + mvr2r( shb_speech_ref, shb_frame_ref + L_LOOK_16k - refMemLen, L_FRAME16k ); + mvr2r( shb_frame_ref + L_FRAME16k, hStereoICBWE->mem_shb_speech_ref, L_LOOK_16k ); + + set_f( shb_frame_nonref, 0, L_LOOK_16k + L_FRAME16k ); + mvr2r( hStereoICBWE->mem_shb_speech_nonref, shb_frame_nonref, L_LOOK_16k ); + mvr2r( shb_speech_nonref, shb_frame_nonref + L_LOOK_16k - nonRefMemLen, L_FRAME16k ); + mvr2r( shb_frame_nonref + L_FRAME16k, hStereoICBWE->mem_shb_speech_nonref, L_LOOK_16k ); + + /* core switching reset */ + if ( st->last_core != ACELP_CORE || st->core != ACELP_CORE || st->bwidth < SWB || st->element_mode != IVAS_CPE_TD || st->extl == -1 ) + { + ic_bwe_enc_reset( hStereoICBWE ); + + if ( st->core != ACELP_CORE || st->bwidth < SWB || st->input_Fs < 32000 || st->element_mode != IVAS_CPE_TD || st->extl == -1 ) + { + return; + } + } + + /* resets done here. Need to move them to a separate function */ + if ( ( hStereoICBWE->prev_refChanIndx_bwe != hStereoICBWE->refChanIndx_bwe ) || ( st->last_extl != st->extl ) || st->flag_ACELP16k != 1 ) + { + hStereoICBWE->prevSpecMapping = 0; + hStereoICBWE->memShbSpecMapping = 0; + set_f( hStereoICBWE->memShbSpecXcorr, 0, 6 ); + } + + /* voice fac adjustment based on IC intensities */ + /*temp2 = (float)sqrt(sum2_f(shb_frame_ref + L_LOOK_16k - refMemLen, L_FRAME16k));*/ + temp2 = hStereoICBWE->icbweRefEner; + temp1 = sqrtf( sum2_f( shb_frame_nonref + L_LOOK_16k - refMemLen, L_FRAME16k ) ); + /*temp1 = 0.8f*hStereoICBWE->prevNonRefEner + 0.2f*temp1;*/ + /*temp2 = 0.8f*hStereoICBWE->prevRefEner + 0.2f*temp2;*/ + gDes = ( temp2 == 0 ) ? 1.0f : ( temp1 / temp2 ); + hStereoICBWE->gDes_pastFrame = powf( hStereoICBWE->gDes_pastFrame, 0.5f ) * powf( gDes, 1 - 0.5f ); + + hStereoICBWE->prevRefEner = temp2; + hStereoICBWE->prevNonRefEner = temp1; + + if ( ( st->extl == SWB_TBE || st->extl == FB_TBE ) && st->flag_ACELP16k == 1 ) + { + mvr2r( voice_factors, nlMixFac, NB_SUBFR16k ); + + if ( gTarget < 0.5f || gTarget > 2.0f ) + { + v_multc( voice_factors, 0.5f, nlMixFac, NB_SUBFR16k ); + } + + nbSubFr = ( st->flag_ACELP16k == 0 ) ? NB_SUBFR : NB_SUBFR16k; + for ( i = 0, k = 0; i < nbSubFr; i++ ) + { + if ( st->coder_type == UNVOICED || hStereoICBWE->MSFlag == 1 ) + { + temp1 = 0; + temp2 = 1.0f; + } + else + { + temp1 = sqrtf( nlMixFac[i] ); + temp2 = sqrtf( 1.0f - nlMixFac[i] ); + } + + for ( j = 0; j < ( L_FRAME16k / nbSubFr ); j++, k++ ) + { + excSHB_nonref[k] = temp1 * hStereoICBWE->nlExc16k[k] + temp2 * hStereoICBWE->mixExc16k[k]; + } + } + + /* LP synthesis */ + syn_filt( hStereoICBWE->lpSHBRef, LPC_SHB_ORDER, excSHB_nonref, shb_synth_nonref, L_FRAME16k, hStereoICBWE->mem_lpc_shbsynth_nonref, 1 ); + } + else + { + mvr2r( shb_frame_ref, hStereoICBWE->shbSynthRef, L_FRAME16k ); + mvr2r( shb_frame_ref, shb_synth_nonref, L_FRAME16k ); + set_f( hStereoICBWE->mem_lpc_shbsynth_nonref, 0, 10 ); + } + + if ( ( st->extl == SWB_TBE || st->extl == WB_TBE || st->extl == FB_TBE ) && st->flag_ACELP16k == 1 ) + { + /* IC BWE spectral mapping */ + spIndx = ic_bwe_enc_specMapping( shb_frame_nonref, shb_synth_nonref, &( hStereoICBWE->prevSpecMapping ), &( hStereoICBWE->memShbSpecMapping ), hStereoICBWE->memShbSpecXcorr ); + } + else + { + spIndx = 3; + hStereoICBWE->prevSpecMapping = 0; + } + + push_indice( hBstr, IND_STEREO_ICBWE_REF, hStereoICBWE->refChanIndx_bwe, STEREO_ICBWE_REFBITS ); + + if ( st->flag_ACELP16k == 1 ) + { + push_indice( hBstr, IND_STEREO_ICBWE_SP, spIndx, STEREO_ICBWE_SPBITS ); + } + else + { + hStereoICBWE->prevSpecMapping = -0.6f; + } + + /* IC BWE GS mapping */ + gsIndx = ic_bwe_enc_gsMapping( hStereoICBWE->gDes_pastFrame, hStereoICBWE->shbSynthRef, shb_synth_nonref, &( hStereoICBWE->prevgsMapping ), hStereoICBWE->memGsEnerMap, st->element_mode ); + hStereoICBWE->gDes_pastFrame = gDes; + push_indice( hBstr, IND_STEREO_ICBWE_GS, gsIndx, STEREO_ICBWE_GSBITS ); + } + + /* IC-BWE updates */ + hStereoICBWE->prev_refChanIndx_bwe = hStereoICBWE->refChanIndx_bwe; + + return; +} + +/*-------------------------------------------------------------------* + * stereo_icBWE_init_enc() + * + * Stereo (inter-channel) BWE mapping - encoder initialization + *-------------------------------------------------------------------*/ + +void stereo_icBWE_init_enc( + STEREO_ICBWE_ENC_HANDLE hStereoICBWE /* i/o: Stereo inter-channel BWE handle */ +) +{ + /* SHB speech resampler memory */ + set_f( hStereoICBWE->mem_decim_shb_ch0, 0, ( 2 * L_FILT_MAX ) ); + + /* SHB ref channel */ + set_f( hStereoICBWE->mem_shb_speech_ref, 0, L_LOOK_16k ); + + /* SHB non-ref channel */ + set_f( hStereoICBWE->mem_shb_speech_nonref, 0, L_LOOK_16k ); + + /* unscaled & scaled SHB synthesis memory */ + set_f( hStereoICBWE->mem_lpc_shbsynth_nonref, 0, LPC_SHB_ORDER ); + + /* inter-channel BWE spectral shape adj. */ + hStereoICBWE->prevSpecMapping = 0; + hStereoICBWE->prevgsMapping = 1.0f; + set_f( &( hStereoICBWE->memShbSpecMapping ), 0, 1 ); + set_f( hStereoICBWE->memShbSpecXcorr, 0, 6 ); + + hStereoICBWE->prevNonRefEner = 1.0f; + hStereoICBWE->prevRefEner = 1.0f; + + set_f( hStereoICBWE->memGsEnerMap, 1.0f, 2 ); + + set_f( hStereoICBWE->dec_2over3_mem, 0, L_FILT_2OVER3 ); + set_f( hStereoICBWE->dec_2over3_mem_lp, 0, L_FILT_2OVER3_LP ); + set_f( hStereoICBWE->memHPF, 0, 8 ); + + /* BWE ref channel */ + hStereoICBWE->refChanIndx_bwe = L_CH_INDX; + hStereoICBWE->prev_refChanIndx_bwe = L_CH_INDX; + + set_f( hStereoICBWE->memModifyFs_icbwe[0], 0, 2 * L_FILT32k ); + set_f( hStereoICBWE->memModifyFs_icbwe[1], 0, 2 * L_FILT32k ); + + set_f( hStereoICBWE->mem_nrg_L, 0, 2 ); + set_f( hStereoICBWE->mem_nrg_R, 0, 2 ); + set_f( hStereoICBWE->mem_nrg_DMX, 0, 2 ); + hStereoICBWE->gDes_pastFrame = 1.0f; + hStereoICBWE->icbweRefEner = 0.0f; + + hStereoICBWE->MSFlag = 0; + + return; +} + + +/*-------------------------------------------------------------------* + * findRefChanBWE() + * + * Inter-channel BWE pre-proc of the non-ref channel + *-------------------------------------------------------------------*/ + +static void findRefChanBWE( + const float *input0, + const float *input1, + int16_t *refChanIndx_bwe, + const int16_t input_frame, + float *mem0, + float *mem1 ) +{ + float inp0[L_FRAME48k], inp1[L_FRAME48k]; + float tempF, tempF1; + + mvr2r( input0, inp0, input_frame ); + mvr2r( input1, inp1, input_frame ); + + spectral_balancer( inp0, mem0, input_frame, 1 ); + spectral_balancer( inp1, mem1, input_frame, 1 ); + + tempF = sum2_f( inp0, input_frame ); + tempF1 = sum2_f( inp1, input_frame ); + + if ( tempF1 < 0.64f * tempF ) + { + *refChanIndx_bwe = L_CH_INDX; + } + else if ( tempF < 0.64f * tempF1 ) + { + *refChanIndx_bwe = R_CH_INDX; + } + + return; +} + + +/*-------------------------------------------------------------------* + * stereo_icBWE_preproc() + * + * Inter-channel BWE pre-proc of the non-ref channel + *-------------------------------------------------------------------*/ + +void stereo_icBWE_preproc( + CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ + const int16_t input_frame, /* i : input frame length */ + float shb_speech_nonref[] /* o : SHB speech non-ref channel */ +) +{ + int16_t i, refChanIndx_bwe; + STEREO_TCA_ENC_HANDLE hStereoTCA; + STEREO_ICBWE_ENC_HANDLE hStereoICBWE; + Encoder_State *st; + float temp_inp[L_FRAME48k]; + float tempSHB[L_FRAME16k]; + float temp_in[L_FRAME48k]; + int16_t /*nonRefOffset,*/ nonRefMemLen; + float gD; + int32_t input_Fs; + + /* initialization */ + hStereoTCA = hCPE->hStereoTCA; /* Stereo TCA encoder handle */ + hStereoICBWE = hCPE->hStereoICBWE; /* Stereo IC BWE encoder handle */ + st = hCPE->hCoreCoder[0]; + input_Fs = st->input_Fs; + + /*nonRefOffset = NS2SA(st_ivas->input_Fs, ACELP_LOOK_NS - L_MEM_RECALC_TBE_NS);*/ + nonRefMemLen = NS2SA( input_Fs, L_MEM_RECALC_TBE_NS ); + + if ( hCPE->element_mode == IVAS_CPE_MDCT || st->core != ACELP_CORE || st->extl == -1 || input_Fs < 32000 ) + { + set_f( hStereoICBWE->dec_2over3_mem, 0, L_FILT_2OVER3 ); + set_f( hStereoICBWE->dec_2over3_mem_lp, 0, L_FILT_2OVER3_LP ); + set_f( hStereoICBWE->mem_decim_shb_ch0, 0, ( 2 * L_FILT_MAX ) ); + set_f( shb_speech_nonref, 0, L_FRAME16k ); + set_f( hStereoICBWE->memHPF, 0, 8 ); + hStereoICBWE->refChanIndx_bwe = hStereoICBWE->prev_refChanIndx_bwe = L_CH_INDX; + + if ( hCPE->element_mode >= IVAS_CPE_DFT && input_Fs >= 32000 ) + { + set_f( temp_inp, 0, L_FRAME48k ); + mvr2r( hStereoICBWE->dataChan[0], temp_inp + nonRefMemLen, input_frame - nonRefMemLen ); + + if ( input_Fs == 48000 ) + { + mvr2r( temp_inp, temp_in, L_FRAME48k ); + set_f( temp_inp, 0, L_FRAME48k ); + i = 2 * L_FILT48k + L_FILT_2OVER3; + decimate_2_over_3_allpass( temp_in + ( input_frame - i ), i, temp_inp + ( 2 * ( input_frame - i ) ) / 3, hStereoICBWE->dec_2over3_mem, hStereoICBWE->dec_2over3_mem_lp ); + } + /* flip the spectrum */ + for ( i = 0; i < L_FRAME32k; i += 2 ) + { + temp_inp[i] *= -1.0f; + } + mvr2r( temp_inp + L_FRAME32k - 2 * L_FILT32k, hStereoICBWE->memModifyFs_icbwe[0], 2 * L_FILT32k ); + + set_f( temp_inp, 0, L_FRAME48k ); + mvr2r( hStereoICBWE->dataChan[1], temp_inp + nonRefMemLen, input_frame - nonRefMemLen ); + + if ( input_Fs == 48000 ) + { + mvr2r( temp_inp, temp_in, L_FRAME48k ); + set_f( temp_inp, 0, L_FRAME48k ); + i = 2 * L_FILT48k + L_FILT_2OVER3; + /* IVAS-219: the same filter memories are used for both channels; the continuity is thus lost; shouldn't the memories be separated? */ + decimate_2_over_3_allpass( temp_in + ( input_frame - i ), i, temp_inp + ( 2 * ( input_frame - i ) ) / 3, hStereoICBWE->dec_2over3_mem, hStereoICBWE->dec_2over3_mem_lp ); + } + /* flip the spectrum */ + for ( i = 0; i < input_frame; i += 2 ) + { + temp_inp[i] *= -1.0f; + } + mvr2r( temp_inp + L_FRAME32k - 2 * L_FILT32k, hStereoICBWE->memModifyFs_icbwe[1], 2 * L_FILT32k ); + } + + return; + } + + if ( hCPE->element_mode != IVAS_CPE_TD ) + { + /* initial estimate of refChanIndx_bwe */ + gD = hStereoTCA->targetGain; + + refChanIndx_bwe = hStereoTCA->refChanIndx; + if ( ( gD > 1.0f && refChanIndx_bwe == R_CH_INDX ) || ( gD < 1.0f && refChanIndx_bwe == L_CH_INDX ) ) + { + refChanIndx_bwe = !( hStereoTCA->refChanIndx ); + } + hStereoICBWE->refChanIndx_bwe = refChanIndx_bwe; + + set_f( hStereoICBWE->dec_2over3_mem, 0, L_FILT_2OVER3 ); + set_f( hStereoICBWE->dec_2over3_mem_lp, 0, L_FILT_2OVER3_LP ); + set_f( hStereoICBWE->mem_decim_shb_ch0, 0, ( 2 * L_FILT_MAX ) ); + set_f( shb_speech_nonref, 0, L_FRAME16k ); + set_f( hStereoICBWE->memHPF, 0, 8 ); + + return; + } + + gD = hStereoTCA->targetGain; + + refChanIndx_bwe = hStereoTCA->refChanIndx; + if ( ( gD > 1.0f && refChanIndx_bwe == R_CH_INDX ) || ( gD < 1.0f && refChanIndx_bwe == L_CH_INDX ) ) + { + refChanIndx_bwe = !( hStereoTCA->refChanIndx ); + } + + findRefChanBWE( hStereoICBWE->dataChan[0], hStereoICBWE->dataChan[1], &refChanIndx_bwe, input_frame, &hStereoICBWE->memHPF[0], &hStereoICBWE->memHPF[4] ); + + hStereoICBWE->refChanIndx_bwe = refChanIndx_bwe; + + if ( refChanIndx_bwe == R_CH_INDX ) + { + mvr2r( hStereoICBWE->icbwe_inp_mem[0], temp_inp, nonRefMemLen ); + mvr2r( hStereoICBWE->dataChan[0], temp_inp + nonRefMemLen, input_frame - nonRefMemLen ); + } + else + { + mvr2r( hStereoICBWE->icbwe_inp_mem[1], temp_inp, nonRefMemLen ); + mvr2r( hStereoICBWE->dataChan[1], temp_inp + nonRefMemLen, input_frame - nonRefMemLen ); + } + + if ( input_Fs == 48000 ) + { + /*printf("\n Non-ref target HB generation for 48 kHz sample rate needs alignment verification \n");*/ + mvr2r( temp_inp, temp_in, L_FRAME48k ); + set_f( temp_inp, 0, L_FRAME48k ); + decimate_2_over_3_allpass( temp_in, L_FRAME48k, temp_inp, hStereoICBWE->dec_2over3_mem, hStereoICBWE->dec_2over3_mem_lp ); + } + + /* flip the spectrum */ + for ( i = 0; i < input_frame; i += 2 ) + { + temp_inp[i] *= -1.0f; + } + + if ( hCPE->element_mode >= IVAS_CPE_DFT && input_Fs >= 32000 && ( st->last_core != ACELP_CORE || st->last_extl == -1 ) ) + { + mvr2r( hStereoICBWE->memModifyFs_icbwe[!refChanIndx_bwe], hStereoICBWE->mem_decim_shb_ch0, 2 * L_FILT32k ); + } + + /* IVAS-219: Re-wire the shb nonref estimation through a lite CLDFB */ + modify_Fs( temp_inp, L_FRAME32k, 32000, tempSHB, 16000, hStereoICBWE->mem_decim_shb_ch0, 0 ); + + mvr2r( tempSHB, shb_speech_nonref, L_FRAME16k ); + + return; +} diff --git a/lib_enc/ivas_stereo_mdct_core_enc.c b/lib_enc/ivas_stereo_mdct_core_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..579438a3f46ec23cf68dd8809f5f8166bb9596b1 --- /dev/null +++ b/lib_enc/ivas_stereo_mdct_core_enc.c @@ -0,0 +1,439 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "ivas_prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * sync_tcx_mode() + * + * Synchronize under certain conditions the tcx modes and set overlap + * windows accordingly + *-------------------------------------------------------------------*/ + +static void sync_tcx_mode( + Encoder_State **st /* i/o: Encoder state */ +) +{ + const float prevAccNrg0 = st[0]->hTranDet->subblockEnergies.accSubblockNrg[st[0]->hTranDet->subblockEnergies.nDelay]; + const float prevAccNrg1 = st[1]->hTranDet->subblockEnergies.accSubblockNrg[st[1]->hTranDet->subblockEnergies.nDelay]; + const float lastAccNrg0 = st[0]->hTranDet->subblockEnergies.accSubblockNrg[st[0]->hTranDet->subblockEnergies.nDelay + st[0]->hTranDet->transientDetector.nSubblocksToCheck]; + const float lastAccNrg1 = st[1]->hTranDet->subblockEnergies.accSubblockNrg[st[1]->hTranDet->subblockEnergies.nDelay + st[1]->hTranDet->transientDetector.nSubblocksToCheck]; + + if ( ( st[0]->hTcxEnc->tcxMode == st[1]->hTcxEnc->tcxMode ) && ( st[0]->element_brate == IVAS_48k ) && + ( st[0]->hTcxCfg->tcx_curr_overlap_mode != st[1]->hTcxCfg->tcx_curr_overlap_mode ) ) + { + if ( ( st[0]->hTcxCfg->tcx_curr_overlap_mode == FULL_OVERLAP ) || ( st[1]->hTcxCfg->tcx_curr_overlap_mode == FULL_OVERLAP ) ) /* synchronize overlaps */ + { + st[0]->hTcxCfg->tcx_curr_overlap_mode = st[1]->hTcxCfg->tcx_curr_overlap_mode = max( st[0]->hTcxCfg->tcx_curr_overlap_mode, st[1]->hTcxCfg->tcx_curr_overlap_mode ); + } + else + { + st[0]->hTcxCfg->tcx_curr_overlap_mode = st[1]->hTcxCfg->tcx_curr_overlap_mode = min( st[0]->hTcxCfg->tcx_curr_overlap_mode, st[1]->hTcxCfg->tcx_curr_overlap_mode ); + } + } + + if ( ( prevAccNrg0 * 25.0f > prevAccNrg1 ) && ( prevAccNrg1 * 25.0f > prevAccNrg0 ) && /* 14 dB */ + ( lastAccNrg0 * 16.0f > lastAccNrg1 ) && ( lastAccNrg1 * 16.0f > lastAccNrg0 ) ) /* 12 dB */ + { + st[0]->hTcxEnc->tcxMode = st[1]->hTcxEnc->tcxMode = max( st[0]->hTcxEnc->tcxMode, st[1]->hTcxEnc->tcxMode ); /* synchronize TCX mode of both channels */ + + if ( st[0]->hTcxEnc->tcxMode == TCX_10 ) + { + if ( st[0]->hTcxCfg->tcx_curr_overlap_mode == ALDO_WINDOW ) + { + st[0]->hTcxCfg->tcx_curr_overlap_mode = st[1]->hTcxCfg->tcx_curr_overlap_mode; + } + + if ( st[0]->hTcxCfg->tcx_last_overlap_mode == ALDO_WINDOW ) + { + st[0]->hTcxCfg->tcx_last_overlap_mode = st[1]->hTcxCfg->tcx_last_overlap_mode; + } + } + + if ( st[1]->hTcxEnc->tcxMode == TCX_10 ) + { + if ( st[1]->hTcxCfg->tcx_curr_overlap_mode == ALDO_WINDOW ) + { + st[1]->hTcxCfg->tcx_curr_overlap_mode = st[0]->hTcxCfg->tcx_curr_overlap_mode; + } + + if ( st[1]->hTcxCfg->tcx_last_overlap_mode == ALDO_WINDOW ) + { + st[1]->hTcxCfg->tcx_last_overlap_mode = st[0]->hTcxCfg->tcx_last_overlap_mode; + } + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * stereo_mdct_core_enc() + * + * joint stereo mdct core encoder + *-------------------------------------------------------------------*/ + +void stereo_mdct_core_enc( + CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ + float new_samples[CPE_CHANNELS][L_INP], /* i : new samples */ + float old_wsp[CPE_CHANNELS][L_WSP], /* i : 12.8kHz weighted speech (for LTP */ + float pitch_buf[CPE_CHANNELS][NB_SUBFR16k] /* o : floating pitch for each subframe */ +) +{ + int16_t i, ch, nSubframes, L_subframeTCX; + int16_t n, nAvailBits; + int16_t tnsSize[CPE_CHANNELS][NB_DIV]; /* number of tns parameters put into prm */ + int16_t tnsBits[CPE_CHANNELS][NB_DIV]; /* number of tns bits in the frame */ + float *p_orig_spectrum_long[CPE_CHANNELS], orig_spectrum_long[CPE_CHANNELS][N_MAX]; /* MDCT output (L/R). */ + float *orig_spectrum[CPE_CHANNELS][NB_DIV]; /* Pointers to MDCT output for a short block (L/R) */ + float powerSpec[CPE_CHANNELS][N_MAX]; + float *p_powerSpec[CPE_CHANNELS]; + float powerSpecMsInv_long[CPE_CHANNELS][N_MAX]; /* MS inv power spectrum, also inverse MDST spectrum */ + float *powerSpecMsInv[CPE_CHANNELS][NB_DIV]; + float quantized_spectrum_long[CPE_CHANNELS][N_MAX]; /* quantized MDCT spectrum, inv ms mask mdst spectrum, scratch for MS spectra in the MS decision */ + float *quantized_spectrum[CPE_CHANNELS][NB_DIV]; + float *inv_mdst_spectrum[CPE_CHANNELS][NB_DIV]; + float *inv_spectrum[CPE_CHANNELS][NB_DIV]; + float *p_mdst_spectrum_long[CPE_CHANNELS], mdst_spectrum_long[CPE_CHANNELS][N_MAX]; + float *mdst_spectrum[CPE_CHANNELS][NB_DIV]; + Encoder_State *st, **sts; + STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct; + BSTR_ENC_HANDLE hBstr; + int16_t ms_mask[2][MAX_SFB]; + int16_t p_param[CPE_CHANNELS][NB_DIV]; + int16_t stereo_bits; + int16_t meta_bits, signal_bits; + + push_wmops( "stereo_mdct_core_enc" ); + + L_subframeTCX = 0; /* to avoid compilation warning */ + + /*--------------------------------------------------------------* + * Set pointers + *---------------------------------------------------------------*/ + + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + p_mdst_spectrum_long[ch] = mdst_spectrum_long[ch]; + p_orig_spectrum_long[ch] = orig_spectrum_long[ch]; + } + + sts = hCPE->hCoreCoder; + hStereoMdct = hCPE->hStereoMdct; + hBstr = sts[0]->hBstr; + + meta_bits = hCPE->hMetaData->nb_bits_tot; + signal_bits = hBstr->nb_bits_tot; + + /*--------------------------------------------------------------* + * Initialization + *---------------------------------------------------------------*/ + + sts[0]->hTcxEnc->tfm_mem = sts[1]->hTcxEnc->tfm_mem = sqrtf( 0.5f * ( sts[0]->hTcxEnc->tfm_mem * sts[0]->hTcxEnc->tfm_mem + sts[1]->hTcxEnc->tfm_mem * sts[1]->hTcxEnc->tfm_mem ) ); /* RMS */ + sts[0]->hTcxEnc->tcxltp_norm_corr_past = sts[1]->hTcxEnc->tcxltp_norm_corr_past = 0.5f * ( sts[0]->hTcxEnc->tcxltp_norm_corr_past + sts[1]->hTcxEnc->tcxltp_norm_corr_past ); + + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + st = sts[ch]; + SetTCXModeInfo( st, st->hTranDet, &st->hTcxCfg->tcx_curr_overlap_mode ); + } + + /* adaptively sync tcx modes*/ + if ( ( hCPE->last_element_mode == IVAS_CPE_MDCT ) && ( abs( sts[0]->hTcxCfg->tcx_last_overlap_mode - sts[1]->hTcxCfg->tcx_last_overlap_mode ) > 2 || + sts[0]->hTcxCfg->tcx_last_overlap_mode == sts[1]->hTcxCfg->tcx_last_overlap_mode || + sts[0]->hTcxCfg->tcx_last_overlap_mode + sts[1]->hTcxCfg->tcx_last_overlap_mode == 5 ) ) /* disable syncing for stereo switching or large diff in last frame overlap */ + { + sync_tcx_mode( sts ); + } + + if ( hCPE->hCoreCoder[0]->igf ) + { + initMdctStereoEncData( hCPE->hStereoMdct, STEREO_FORMAT, IVAS_CPE_MDCT, hCPE->element_brate, hCPE->hCoreCoder[0]->bwidth, hCPE->hCoreCoder[0]->igf, hCPE->hCoreCoder[0]->hIGFEnc->igfData.igfInfo.grid, 0 ); + + stereo_mdct_init_igf_start_band( &( hCPE->hStereoMdct->stbParamsTCX20 ), 1.0f, hCPE->hCoreCoder[0]->bwidth, hCPE->element_brate ); + stereo_mdct_init_igf_start_band( &( hCPE->hStereoMdct->stbParamsTCX10 ), 0.5f, hCPE->hCoreCoder[0]->bwidth, hCPE->element_brate ); + stereo_mdct_init_igf_start_band( &( hCPE->hStereoMdct->stbParamsTCX20afterACELP ), 1.25f, hCPE->hCoreCoder[0]->bwidth, hCPE->element_brate ); + } + else + { + hCPE->hStereoMdct->stbParamsTCX20.sfbIgfStart = -1; + hCPE->hStereoMdct->stbParamsTCX10.sfbIgfStart = -1; + hCPE->hStereoMdct->stbParamsTCX10.nBandsStereoCore = hCPE->hStereoMdct->stbParamsTCX10.sfbCnt; + hCPE->hStereoMdct->stbParamsTCX20.nBandsStereoCore = hCPE->hStereoMdct->stbParamsTCX20.sfbCnt; + } + + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + orig_spectrum[ch][0] = orig_spectrum_long[ch]; + orig_spectrum[ch][1] = orig_spectrum_long[ch] + N_TCX10_MAX; + quantized_spectrum[ch][0] = quantized_spectrum_long[ch]; + quantized_spectrum[ch][1] = quantized_spectrum_long[ch] + N_TCX10_MAX; + inv_mdst_spectrum[ch][0] = powerSpecMsInv[ch][0] = powerSpecMsInv_long[ch]; + inv_mdst_spectrum[ch][1] = powerSpecMsInv[ch][1] = powerSpecMsInv_long[ch] + N_TCX10_MAX; + inv_spectrum[ch][0] = quantized_spectrum[ch][0]; + inv_spectrum[ch][1] = quantized_spectrum[ch][1]; + mdst_spectrum[ch][0] = mdst_spectrum_long[ch]; + mdst_spectrum[ch][1] = mdst_spectrum_long[ch] + N_TCX10_MAX; + sts[ch]->hTcxEnc->tns_ms_flag[0] = 0; + sts[ch]->hTcxEnc->tns_ms_flag[1] = 0; + } + + /*--------------------------------------------------------------* + * MDCT core preprocessing: + * - initialization + * - Core Signal Analysis: MDCT, TNS + * - Envelope Quantization and FDNS + * - TNS + *---------------------------------------------------------------*/ + + ivas_mdct_core_whitening_enc( hCPE, new_samples, old_wsp, pitch_buf, p_mdst_spectrum_long, + tnsBits, p_orig_spectrum_long, tnsSize, p_param, hBstr, 0, CPE_CHANNELS ); + + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + st = sts[ch]; + nSubframes = ( st->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; + + for ( n = 0; n < nSubframes; n++ ) + { + st->side_bits_frame_channel += NBITS_TCX_GAIN + NOISE_FILL_RANGES * NBITS_NOISE_FILL_LEVEL; + } + } + + sts[0]->side_bits_frame_channel += SMDCT_NBBITS_SPLIT_RATIO; + + + /*--------------------------------------------------------------* + * Stereo Processing + *---------------------------------------------------------------*/ + + if ( !hStereoMdct->isSBAStereoMode ) + { + stereo_coder_tcx( hStereoMdct, sts, ms_mask, mdst_spectrum, inv_spectrum, inv_mdst_spectrum, 0 ); + } + + /*--------------------------------------------------------------* + * Power spectrum calculation + *---------------------------------------------------------------*/ + + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + nSubframes = ( sts[ch]->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; + L_subframeTCX = sts[ch]->hTcxEnc->L_frameTCX / nSubframes; + if ( sts[ch]->last_core == ACELP_CORE ) + { + L_subframeTCX += L_subframeTCX / 4; + } + + for ( n = 0; n < nSubframes; n++ ) + { + if ( sts[ch]->hTcxEnc->tns_ms_flag[n] ) + { + /* power spectrum: MDCT^2 + MDST^2 */ + for ( i = 0; i < L_subframeTCX; i++ ) + { + powerSpecMsInv[ch][n][i] = inv_mdst_spectrum[ch][n][i] * inv_mdst_spectrum[ch][n][i] + inv_spectrum[ch][n][i] * inv_spectrum[ch][n][i]; + powerSpec[ch][i + n * L_subframeTCX] = mdst_spectrum[ch][n][i] * mdst_spectrum[ch][n][i] + sts[ch]->hTcxEnc->spectrum[n][i] * sts[ch]->hTcxEnc->spectrum[n][i]; + } + } + else + { + if ( hStereoMdct->mdct_stereo_mode[n] != SMDCT_DUAL_MONO ) + { + /* power spectrum: MDCT^2 + MDST^2 */ + powerSpecMsInv[ch][n][0] = inv_spectrum[ch][n][0] * inv_spectrum[ch][n][0]; + for ( i = 1; i < L_subframeTCX - 1; i++ ) + { + float mdst = ( inv_spectrum[ch][n][i + 1] - inv_spectrum[ch][n][i - 1] ); /* An MDST estimate */ + powerSpecMsInv[ch][n][i] = mdst * mdst + inv_spectrum[ch][n][i] * inv_spectrum[ch][n][i]; + } + powerSpecMsInv[ch][n][L_subframeTCX - 1] = inv_spectrum[ch][n][L_subframeTCX - 1] * inv_spectrum[ch][n][L_subframeTCX - 1]; + } + + /* power spectrum: MDCT^2 + MDST^2 */ + powerSpec[ch][n * L_subframeTCX] = sts[ch]->hTcxEnc->spectrum[n][0] * sts[ch]->hTcxEnc->spectrum[n][0]; + for ( i = 1; i < L_subframeTCX - 1; i++ ) + { + float mdst = ( sts[ch]->hTcxEnc->spectrum[n][i + 1] - sts[ch]->hTcxEnc->spectrum[n][i - 1] ); /* An MDST estimate */ + powerSpec[ch][i + n * L_subframeTCX] = mdst * mdst + sts[ch]->hTcxEnc->spectrum[n][i] * sts[ch]->hTcxEnc->spectrum[n][i]; + } + powerSpec[ch][L_subframeTCX - 1 + n * L_subframeTCX] = sts[ch]->hTcxEnc->spectrum[n][L_subframeTCX - 1] * sts[ch]->hTcxEnc->spectrum[n][L_subframeTCX - 1]; + } + } + } + + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + st = sts[ch]; + nSubframes = ( st->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; + L_subframeTCX = st->hTcxEnc->L_frameTCX / nSubframes; + if ( st->last_core == ACELP_CORE ) + { + L_subframeTCX += L_subframeTCX / 4; + } + + if ( ( st->hTcxEnc->tcxMode == TCX_20 ) && ( st->element_brate < HQ_96k || st->igf ) ) + { + /*-----------------------------------------------------------* + * Compute noise-measure flags for spectrum filling * + * and quantization (0: tonal, 1: noise-like). * + * Detect low pass if present. * + *-----------------------------------------------------------*/ + + ComputeSpectrumNoiseMeasure( powerSpec[ch], L_subframeTCX, st->hTcxEnc->nmStartLine * ( L_subframeTCX / st->hTcxEnc->L_frameTCX ), + ( st->L_frame * st->last_sr_core != st->L_frame_past * st->sr_core ) || ( st->last_core != TCX_20_CORE ), st->hTcxEnc->memQuantZeros, L_subframeTCX ); + } + + st->hTcxEnc->measuredBwRatio = 1.f; /* No bandwidth limit for the noise filling */ + } + + /*--------------------------------------------------------------* + * IGF + *---------------------------------------------------------------*/ + + if ( sts[0]->igf || sts[1]->igf ) + { + if ( sts[0]->hTcxEnc->tcxMode == sts[1]->hTcxEnc->tcxMode ) + { + /* Band-wise M/S for MDST */ + nSubframes = ( sts[0]->hTcxEnc->tcxMode == TCX_20 || sts[1]->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; + for ( n = 0; n < nSubframes; n++ ) + { + if ( ( hStereoMdct->mdct_stereo_mode[n] != hStereoMdct->IGFStereoMode[n] || hStereoMdct->mdct_stereo_mode[n] == SMDCT_BW_MS ) && !hStereoMdct->isSBAStereoMode ) + { + p_powerSpec[0] = powerSpec[0]; + p_powerSpec[1] = powerSpec[1]; + ProcessStereoIGF( hStereoMdct, sts, ms_mask, orig_spectrum, p_powerSpec, powerSpecMsInv, inv_spectrum, n, hCPE->hCoreCoder[0]->sp_aud_decision0, hCPE->hCoreCoder[0]->element_brate, 0 ); + } + else + { + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + st = sts[ch]; + /* update the pointer to the buffer of indices of the second channel */ + if ( ch == 1 ) + { + st->hBstr->ind_list = sts[0]->hBstr->ind_list + sts[0]->hBstr->nb_ind_tot; + } + ProcessIGF( st, st->hTcxEnc->spectrum[n], orig_spectrum[ch][n], &powerSpec[ch][n * L_subframeTCX], st->core == TCX_20_CORE, n, hCPE->hCoreCoder[0]->sp_aud_decision0, 0 ); + } + } + } + } + else + { + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + st = sts[ch]; + + /* update the pointer to the buffer of indices of the second channel */ + if ( ch == 1 ) + { + st->hBstr->ind_list = sts[0]->hBstr->ind_list + sts[0]->hBstr->nb_ind_tot; + } + + nSubframes = ( st->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; + if ( st->igf ) + { + for ( n = 0; n < nSubframes; n++ ) + { + ProcessIGF( st, st->hTcxEnc->spectrum[n], orig_spectrum[ch][n], &powerSpec[ch][n * L_subframeTCX], st->core == TCX_20_CORE, n, hCPE->hCoreCoder[0]->sp_aud_decision0, 0 ); + } + } + } + } + + /*write IGF data to bitstream*/ + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + st = sts[ch]; + enc_prm_igf_mdct( st, hBstr ); + } + } + + /* correct side bits per channel*/ + sts[0]->side_bits_frame_channel -= SMDCT_NBBITS_SPLIT_RATIO; + if ( !hStereoMdct->isSBAStereoMode ) + { + stereo_bits = write_stereo_to_bitstream( hStereoMdct, sts, ms_mask, 0, hBstr ); + } + else + { + stereo_bits = 0; + } + + /*--------------------------------------------------------------* + * Split available bits between channels + *---------------------------------------------------------------*/ + + FindSplitRatio( hCPE, sts ); + + assert( hStereoMdct->split_ratio > 0 && hStereoMdct->split_ratio < SMDCT_BITRATE_RATIO_RANGE ); + + /* Split available bits between channels */ + nAvailBits = sts[0]->bits_frame_channel + sts[1]->bits_frame_channel - hBstr->nb_bits_tot - sts[0]->core * ( NBITS_TCX_GAIN + NOISE_FILL_RANGES * NBITS_NOISE_FILL_LEVEL + SMDCT_MINIMUM_ARITH_BITS ) - sts[1]->core * ( NBITS_TCX_GAIN + NOISE_FILL_RANGES * NBITS_NOISE_FILL_LEVEL + SMDCT_MINIMUM_ARITH_BITS ); + + /* remove metadata bits */ + nAvailBits -= meta_bits; + + nAvailBits -= SMDCT_NBBITS_SPLIT_RATIO; + splitAvailableBits( nAvailBits, hStereoMdct->split_ratio, hStereoMdct->isSBAStereoMode, &sts[0]->bits_frame_channel, &sts[1]->bits_frame_channel ); + + sts[0]->bits_frame_channel += sts[0]->core * SMDCT_MINIMUM_ARITH_BITS; + sts[1]->bits_frame_channel += sts[1]->core * SMDCT_MINIMUM_ARITH_BITS; + + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + sts[ch]->total_brate = ( sts[ch]->bits_frame_channel + sts[ch]->side_bits_frame_channel ) * FRAMES_PER_SEC; + } + stereo_bits += SMDCT_NBBITS_SPLIT_RATIO; + assert( ( sts[0]->total_brate + sts[1]->total_brate + ( stereo_bits + signal_bits + meta_bits ) * FRAMES_PER_SEC ) == hCPE->element_brate + hCPE->brate_surplus ); + assert( hStereoMdct->split_ratio > 0 && hStereoMdct->split_ratio < SMDCT_BITRATE_RATIO_RANGE ); + + push_next_indice( hBstr, hStereoMdct->split_ratio, SMDCT_NBBITS_SPLIT_RATIO ); + + + ivas_mdct_quant_coder( hCPE, tnsBits, tnsSize, p_param, 0 ); + + pop_wmops(); + + return; +} diff --git a/lib_enc/ivas_stereo_mdct_igf_enc.c b/lib_enc/ivas_stereo_mdct_igf_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..1924028bcf9ff6ae1ea8f3470f59e5b5090ada01 --- /dev/null +++ b/lib_enc/ivas_stereo_mdct_igf_enc.c @@ -0,0 +1,271 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include "options.h" +#include +#include "prot.h" +#include "cnst.h" +#include "stat_enc.h" +#include "ivas_stat_enc.h" +#include "ivas_prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * Local constants + *-------------------------------------------------------------------*/ + +#define IGF_PATCH_MS 1 +#define IGF_PATCH_LR 0 +#define TARGET_COH_THRESHOLD 0.6f +#define SOURCE_COH_THRESHOLD 0.7f +#define PANNING_THRESHOLD 0.07f + + +/*-------------------------------------------------------------------* + * calcCoh() + * + * + *-------------------------------------------------------------------*/ + +static float calcCoh( + const float *sig1, + const float *sig2, + const int16_t nSamples, + float *corr, + float *predCoeff ) +{ + float coh, ener1, ener2, cEner, cc; + + coh = 0.0f; + ener1 = dotp( sig1, sig1, nSamples ); + ener2 = dotp( sig2, sig2, nSamples ); + cEner = sqrtf( ener1 * ener2 ); + cc = dotp( sig1, sig2, nSamples ); + + if ( corr != NULL ) + { + *corr = cc; + } + + if ( cEner > 0.0f ) + { + coh = cc / cEner; + } + + if ( predCoeff != NULL ) + { + *predCoeff = 0.f; + if ( ener1 > 0.0f ) + { + *predCoeff = cc / ener1; + } + } + + return coh; +} + + +/*-------------------------------------------------------------------* + * IGF_MsStereoDecision() + * + * + *-------------------------------------------------------------------*/ + +static void IGF_MsStereoDecision( + STEREO_MDCT_BAND_PARAMETERS *sfbParam, + H_IGF_GRID hGrid, + const float *specL, + const float *specR, + int16_t *igfStereoMode, /* output*/ + int16_t *msMask, /* output*/ + const int16_t mdct_stereo_mode ) +{ + int16_t sfb; + int16_t msMaskTrueSomewhere, msMaskFalseSomewhere; + int16_t numMsMaskTrue, numMsMaskFalse, numMsMaskThresh, numMsMaskMSForLR; + int16_t tile_idx; + int16_t strt_cpy; + float thresh; + + thresh = TARGET_COH_THRESHOLD; + if ( mdct_stereo_mode == SMDCT_MS_FULL ) + { + thresh *= 0.7f; /* lower threshold if core is already MS */ + } + + for ( tile_idx = 0; tile_idx < hGrid->nTiles; tile_idx++ ) + { + strt_cpy = hGrid->sbWrap[tile_idx]; + + for ( sfb = hGrid->sfbWrap[tile_idx]; sfb < hGrid->sfbWrap[tile_idx + 1]; sfb++ ) + { + int16_t width = hGrid->swb_offset[sfb + 1] - hGrid->swb_offset[sfb]; + float cc_src, cc_target, pc_target, pc_src; + float coh_src = calcCoh( &specL[strt_cpy], &specR[strt_cpy], width, &cc_src, &pc_src ); + float coh_target = calcCoh( &specL[hGrid->swb_offset[sfb]], &specR[hGrid->swb_offset[sfb]], width, &cc_target, &pc_target ); + + strt_cpy += width; + if ( fabsf( coh_target ) > thresh ) + { + /* target is very coherent */ + if ( fabsf( coh_src ) > SOURCE_COH_THRESHOLD ) + { + if ( fabsf( pc_target - pc_src ) < PANNING_THRESHOLD && fabsf( pc_target - 1.0f ) > 2.0f * PANNING_THRESHOLD ) /* same position but not close to the MID */ + { + /* same for the source, stereo pos are close, stay on LR */ + msMask[sfb] = IGF_PATCH_LR; + } + else + { + msMask[sfb] = IGF_PATCH_MS; + } + } + else + { + /* we need to get the coherent patch, do MS */ + msMask[sfb] = IGF_PATCH_MS; + } + } + else + { + /* target is not coherent, stick to LR patching */ + msMask[sfb] = IGF_PATCH_LR; + } + } + } + + msMaskTrueSomewhere = 0; + msMaskFalseSomewhere = 0; + numMsMaskTrue = 0; + numMsMaskFalse = 0; + numMsMaskThresh = ( sfbParam->sfbCnt - sfbParam->nBandsStereoCore ) / 4; + numMsMaskMSForLR = 0; + + for ( tile_idx = 0; tile_idx < hGrid->nTiles; tile_idx++ ) + { + for ( sfb = hGrid->sfbWrap[tile_idx]; sfb < hGrid->sfbWrap[tile_idx + 1]; sfb++ ) + { + switch ( msMask[sfb] ) + { + case IGF_PATCH_LR: + msMask[sfb] = 0; + numMsMaskFalse++; + msMaskFalseSomewhere = 1; + break; + case IGF_PATCH_MS: + msMask[sfb] = 1; + numMsMaskTrue++; + msMaskTrueSomewhere = 1; + break; + default: + assert( 0 ); + break; + } + } + } + + if ( msMaskTrueSomewhere ) + { + if ( msMaskFalseSomewhere ) + { + *igfStereoMode = SMDCT_BW_MS; + + if ( numMsMaskFalse <= numMsMaskThresh ) + { + *igfStereoMode = SMDCT_MS_FULL; + set_s( &msMask[0], 1, sfbParam->sfbCnt - sfbParam->nBandsStereoCore ); + } + else if ( numMsMaskTrue <= numMsMaskThresh && !numMsMaskMSForLR ) + { + *igfStereoMode = SMDCT_DUAL_MONO; + set_s( &msMask[0], 0, sfbParam->sfbCnt - sfbParam->nBandsStereoCore ); + } + } + else + { + *igfStereoMode = SMDCT_MS_FULL; + set_s( &msMask[0], 1, sfbParam->sfbCnt - sfbParam->nBandsStereoCore ); + } + } + else + { + *igfStereoMode = SMDCT_DUAL_MONO; + set_s( &msMask[0], 0, sfbParam->sfbCnt - sfbParam->nBandsStereoCore ); + } + + return; +} + + +/*-------------------------------------------------------------------* + * IGFEncStereoEncoder() + * + * + *-------------------------------------------------------------------*/ + +void IGFEncStereoEncoder( + STEREO_MDCT_BAND_PARAMETERS *sfbParam, /* i/o: sfb parameters for the right channel */ + const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i : IGF handle */ + const float *mdctSpectrumL, /* i : left spectrum */ + const float *mdctSpectrumR, /* i : right spectrum */ + int16_t *msMask, /* i/o: MS mask */ + int16_t *igfStereoMode, /* o : IGF stereo mode */ + const int16_t mdct_stereo_mode, /* i : MDCT stereo mode */ + const int16_t isTCX20, /* i : flag for indicating TCX20 */ + const int16_t isTransition /* i : flag for transtition */ +) +{ + int16_t igfGridIdx; + H_IGF_GRID hGrid; + + if ( isTransition && isTCX20 ) + { + igfGridIdx = IGF_GRID_LB_TRAN; + } + else if ( isTCX20 ) + { + igfGridIdx = IGF_GRID_LB_NORM; + } + else + { + /* It is short block */ + igfGridIdx = IGF_GRID_LB_SHORT; + } + + hGrid = &hIGFEnc->igfData.igfInfo.grid[igfGridIdx]; + + IGF_MsStereoDecision( sfbParam, hGrid, mdctSpectrumL, mdctSpectrumR, igfStereoMode, msMask + sfbParam->nBandsStereoCore, mdct_stereo_mode ); + + return; +} diff --git a/lib_enc/ivas_stereo_mdct_stereo_enc.c b/lib_enc/ivas_stereo_mdct_stereo_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..78d950c74dafbb62e7835ad8d452d317a19c9af0 --- /dev/null +++ b/lib_enc/ivas_stereo_mdct_stereo_enc.c @@ -0,0 +1,1115 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include "options.h" +#include +#include "ivas_cnst.h" +#include "ivas_prot.h" +#include "prot.h" +#include "ivas_rom_com.h" +#include "ivas_rom_enc.h" +#include "wmc_auto.h" +#include "stat_enc.h" + + +/*-------------------------------------------------------------------* + * Local constants + *-------------------------------------------------------------------*/ + +#define OFFSET_BITS_TCX20 126 +#define OFFSET_BITS_TCX10 222 + + +/*-------------------------------------------------------------------* + * Local function prototypes + *-------------------------------------------------------------------*/ + +static void convertToBwMS( const int16_t startLine, const int16_t stopLine, float x0[], float x1[], const float norm_fac ); + +void convertToMS( const int16_t L_frame, float x0[], float x1[], const float norm_fac ); + +static float GetChannelEnergyRatio( Encoder_State **st, const int16_t iFirstSubframe, const int16_t iLastSubframe, const uint8_t ratioInRmsDomain ); + +static void MsStereoDecision( STEREO_MDCT_BAND_PARAMETERS *sfbParam, float *specL, float *specR, float *specM, float *specS, int16_t *mdct_stereo_mode, int16_t *msMask, const int16_t nBitsAvailable ); + + +/*-------------------------------------------------------------------* + * dft_ana_init() + * + * Initialization function for dft analysis handle within + * MDCT-stereo + *-------------------------------------------------------------------*/ + +static void dft_ana_init( + DFT_ANA_HANDLE hDft_ana, /*i : DFT analysis handle */ + const int32_t input_Fs /*i : Input sampling frequency */ +) +{ + hDft_ana->N = (int16_t) ( STEREO_DFT_HOP_MAX_ENC * input_Fs / 48000 ); + hDft_ana->NFFT = (int16_t) ( STEREO_DFT_N_MAX_ENC * input_Fs / 48000 ); + hDft_ana->dft_ovl = (int16_t) ( STEREO_DFT_OVL_MAX * input_Fs / 48000 ); + hDft_ana->dft_zp = (int16_t) ( STEREO_DFT_ZP_MAX_ENC * input_Fs / 48000 ); + + hDft_ana->dft_trigo_32k = dft_trigo_32k; + + if ( input_Fs == 16000 ) + { + hDft_ana->dft_trigo = dft_trigo_32k; + hDft_ana->dft_trigo_step = STEREO_DFT_TRIGO_SRATE_16k_STEP; + hDft_ana->win_ana = win_ana_16k; + } + else if ( input_Fs == 32000 ) + { + hDft_ana->dft_trigo = dft_trigo_32k; + hDft_ana->dft_trigo_step = STEREO_DFT_TRIGO_SRATE_32k_STEP; + hDft_ana->win_ana = win_ana_32k; + } + else + { + assert( input_Fs == 48000 ); + hDft_ana->dft_trigo = dft_trigo_48k; + hDft_ana->dft_trigo_step = STEREO_DFT_TRIGO_SRATE_48k_STEP; + hDft_ana->win_ana = win_ana_48k; + } + + return; +} + + +/*-------------------------------------------------------------------* + * write_itd_data() + * + * Bitstream writing of ITDs + *-------------------------------------------------------------------*/ + +static void write_itd_data( + ITD_DATA_HANDLE hItd, /* i : ITD data handle */ + BSTR_ENC_HANDLE hBstr /* i/o: bitstream handle */ +) +{ + int16_t k_offset; + int16_t itd; + + k_offset = 1; + + push_next_indice( hBstr, ( hItd->itd[k_offset] != 0 ), STEREO_DFT_ITD_MODE_NBITS ); + + if ( hItd->itd[k_offset] ) + { + itd = hItd->itd_index[k_offset]; + if ( itd > 255 ) + { + itd -= 256; + + if ( itd < 20 ) + { + push_next_indice( hBstr, 1, 1 ); /* use Huffman*/ + push_next_indice( hBstr, 1, 1 ); /* negative */ + push_next_indice( hBstr, dft_code_itd[itd], dft_len_itd[itd] ); + } + else + { + push_next_indice( hBstr, 0, 1 ); /* don't use Huffman */ + push_next_indice( hBstr, 1, 1 ); /* negative */ + push_next_indice( hBstr, itd, STEREO_DFT_ITD_NBITS - 1 ); + } + } + else + { + if ( itd < 20 ) + { + push_next_indice( hBstr, 1, 1 ); /* use Huffman*/ + push_next_indice( hBstr, 0, 1 ); /* positive */ + push_next_indice( hBstr, dft_code_itd[itd], dft_len_itd[itd] ); + } + else + { + /* don't use Huffman and positive*/ + push_next_indice( hBstr, itd, STEREO_DFT_ITD_NBITS + 1 ); + } + } + } + return; +} + + +/*-------------------------------------------------------------------* + * stereo_coder_tcx() + * + * + *-------------------------------------------------------------------*/ + +void stereo_coder_tcx( + STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct, /* i/o: Stereo MDCT encoder structure */ + Encoder_State **sts, /* i/o: encoder state structure */ + int16_t ms_mask[NB_DIV][MAX_SFB], /* i : bandwise MS mask */ + float *mdst_spectrum[CPE_CHANNELS][NB_DIV], /* i/o: MDST spectrum */ + float *inv_spectrum[CPE_CHANNELS][NB_DIV], /* i/o: inverse spectrum */ + float *inv_mdst_spectrum[CPE_CHANNELS][NB_DIV], /* i/o: inverse MDST spectrum */ + const int16_t mct_on /* i : flag mct block (1) or stereo (0) */ +) +{ + STEREO_MDCT_BAND_PARAMETERS *sfbConf = NULL; + float nrgRatio[CPE_CHANNELS]; + float nonQNrgRatio[CPE_CHANNELS]; + int16_t k; + int16_t nSubframes, L_frameTCX; + int16_t nAvailBitsMS[NB_DIV]; + push_wmops( "stereo_coder_tcx" ); + + set_s( nAvailBitsMS, 0, NB_DIV ); + + nSubframes = ( sts[0]->core == TCX_20_CORE && sts[1]->core == TCX_20_CORE ) ? 1 : NB_DIV; + L_frameTCX = sts[0]->hTcxEnc->L_frameTCX / nSubframes; + + set_s( &ms_mask[0][0], 0, MAX_SFB ); + set_s( &ms_mask[1][0], 0, MAX_SFB ); + + if ( !mct_on ) + { + if ( sts[0]->core == sts[1]->core ) + { + for ( k = 0; k < nSubframes; k++ ) + { + nonQNrgRatio[k] = GetChannelEnergyRatio( sts, k, k, 1 ); + + hStereoMdct->global_ild[k] = max( 1, min( SMDCT_ILD_RANGE - 1, (int16_t) ( SMDCT_ILD_RANGE * nonQNrgRatio[k] + 0.5f ) ) ); + nrgRatio[k] = (float) SMDCT_ILD_RANGE / hStereoMdct->global_ild[k] - 1; /* nrgRatio = nrg[1]/nrg[0] */ + + nonQNrgRatio[k] = max( 0.5f / SMDCT_ILD_RANGE, min( ( SMDCT_ILD_RANGE - 0.5f ) / SMDCT_ILD_RANGE, nonQNrgRatio[k] ) ); + nonQNrgRatio[k] = 1.0f / nonQNrgRatio[k] - 1.0f; + } + } + else + { + nonQNrgRatio[0] = nonQNrgRatio[1] = GetChannelEnergyRatio( sts, 0, nSubframes - 1, + 1 ); + hStereoMdct->global_ild[0] = max( 1, min( SMDCT_ILD_RANGE - 1, (int16_t) ( SMDCT_ILD_RANGE * nonQNrgRatio[0] + 0.5f ) ) ); + nrgRatio[0] = nrgRatio[1] = (float) SMDCT_ILD_RANGE / hStereoMdct->global_ild[0] - 1; /* nrgRatio = nrg[1]/nrg[0] */ + nonQNrgRatio[0] = nonQNrgRatio[1] = max( 0.5f / SMDCT_ILD_RANGE, min( ( SMDCT_ILD_RANGE - 0.5f ) / SMDCT_ILD_RANGE, nonQNrgRatio[0] ) ); + nonQNrgRatio[0] = nonQNrgRatio[1] = 1.0f / nonQNrgRatio[0] - 1.0f; + } + + for ( k = 0; k < nSubframes; k++ ) + { + if ( ( nrgRatio[k] > 1.0f ) && ( k < ( ( sts[1]->core == TCX_20_CORE ) ? 1 : NB_DIV ) ) ) + { + L_frameTCX = sts[1]->hTcxEnc->L_frameTCX + ( ( sts[1]->last_core == 0 ) ? sts[1]->hTcxEnc->L_frameTCX / 4 : 0 ); + L_frameTCX /= ( ( sts[1]->core == TCX_20_CORE ) ? 1 : NB_DIV ); + + v_multc( sts[1]->hTcxEnc->spectrum[k], 1.0f / nrgRatio[k], sts[1]->hTcxEnc->spectrum[k], L_frameTCX ); + v_multc( mdst_spectrum[1][k], 1.0f / nrgRatio[k], mdst_spectrum[1][k], L_frameTCX ); + } + else if ( ( nrgRatio[k] < 1.0f ) && k < ( ( sts[0]->core == TCX_20_CORE ) ? 1 : NB_DIV ) ) + { + L_frameTCX = sts[0]->hTcxEnc->L_frameTCX + ( ( sts[0]->last_core == 0 ) ? sts[0]->hTcxEnc->L_frameTCX / 4 : 0 ); + L_frameTCX /= ( ( sts[0]->core == TCX_20_CORE ) ? 1 : NB_DIV ); + + v_multc( sts[0]->hTcxEnc->spectrum[k], nrgRatio[k], sts[0]->hTcxEnc->spectrum[k], L_frameTCX ); + v_multc( mdst_spectrum[0][k], nrgRatio[k], mdst_spectrum[0][k], L_frameTCX ); + } + } + } + + if ( + ( sts[0]->hTcxEnc->transform_type[0] != sts[1]->hTcxEnc->transform_type[0] ) || ( sts[0]->hTcxEnc->transform_type[1] != sts[1]->hTcxEnc->transform_type[1] ) || ( sts[0]->last_core != sts[1]->last_core && ( sts[0]->last_core == ACELP_CORE || sts[1]->last_core == ACELP_CORE ) ) || sts[0]->last_core == ACELP_CORE || sts[1]->last_core == ACELP_CORE ) + { + hStereoMdct->mdct_stereo_mode[0] = SMDCT_DUAL_MONO; + hStereoMdct->mdct_stereo_mode[1] = SMDCT_DUAL_MONO; + + + if ( sts[0]->igf ) + { + hStereoMdct->IGFStereoMode[0] = SMDCT_DUAL_MONO; + hStereoMdct->IGFStereoMode[1] = SMDCT_DUAL_MONO; + } + hStereoMdct->sw_uncorr = 1; + + pop_wmops(); + return; + } + else /* decide based on signal */ + { + for ( k = 0; k < nSubframes; k++ ) + { + sfbConf = ( sts[0]->core == TCX_20_CORE ) ? &hStereoMdct->stbParamsTCX20 : &hStereoMdct->stbParamsTCX10; + if ( sts[0]->last_core == ACELP_CORE ) + { + sfbConf = &hStereoMdct->stbParamsTCX20afterACELP; + } + if ( ( sts[0]->element_brate < IVAS_80k ) && ( sts[0]->core == sts[1]->core ) && !mct_on ) /* band-wise HF ILD alignment to increase channel compaction */ + { + int16_t sfb = 1; + + while ( ( sfb < sfbConf->nBandsStereoCore ) && ( sfbConf->sfbOffset[sfb + 1] - sfbConf->sfbOffset[sfb] < 12 ) ) + { + sfb++; /* find start offset */ + } + + for ( sfb--; sfb < sfbConf->nBandsStereoCore; sfb++ ) /* start one SFB early for the fade-in */ + { + const int16_t startLine = sfbConf->sfbOffset[sfb]; + const int16_t endLine = sfbConf->sfbOffset[sfb + 1]; + const int16_t sfbWidth = endLine - startLine; + + nrgRatio[0] = sum2_f( &sts[0]->hTcxEnc->spectrum[k][startLine], sfbWidth ); + nrgRatio[1] = sum2_f( &sts[1]->hTcxEnc->spectrum[k][startLine], sfbWidth ); + + if ( !sts[0]->hTcxEnc->fUseTns[k] && !sts[1]->hTcxEnc->fUseTns[k] ) /* no TNS in either ch */ + { + nrgRatio[0] += sum2_f( &mdst_spectrum[0][k][startLine], sfbWidth ); + nrgRatio[1] += sum2_f( &mdst_spectrum[1][k][startLine], sfbWidth ); + } + if ( ( nrgRatio[0] > 0.f ) && ( nrgRatio[1] > 0.f ) && ( nrgRatio[0] != nrgRatio[1] ) ) + { + float fTemp = 0.5f * ( nrgRatio[0] + nrgRatio[1] ); + nrgRatio[0] = sqrtf( fTemp / nrgRatio[0] ); + nrgRatio[1] = sqrtf( fTemp / nrgRatio[1] ); + + nrgRatio[0] = max( 0.25f, min( 4.f, nrgRatio[0] ) ); + nrgRatio[1] = max( 0.25f, min( 4.f, nrgRatio[1] ) ); + + if ( ( sfbWidth < 12 && sfb + 1 < sfbConf->nBandsStereoCore ) || ( sts[0]->element_brate > IVAS_48k ) ) /* attenuate ILD alignment in the first SFB or at 64k */ + { + nrgRatio[0] = powf( nrgRatio[0], 0.25f ); + nrgRatio[1] = powf( nrgRatio[1], 0.25f ); + } + else + { + nrgRatio[0] = sqrtf( nrgRatio[0] ); + nrgRatio[1] = sqrtf( nrgRatio[1] ); + } + v_multc( &sts[0]->hTcxEnc->spectrum[k][startLine], nrgRatio[0], &sts[0]->hTcxEnc->spectrum[k][startLine], sfbWidth ); + v_multc( &mdst_spectrum[0][k][startLine], nrgRatio[0], &mdst_spectrum[0][k][startLine], sfbWidth ); + + v_multc( &sts[1]->hTcxEnc->spectrum[k][startLine], nrgRatio[1], &sts[1]->hTcxEnc->spectrum[k][startLine], sfbWidth ); + v_multc( &mdst_spectrum[1][k][startLine], nrgRatio[1], &mdst_spectrum[1][k][startLine], sfbWidth ); + } + } + } + + /* set mask to zero */ + set_s( &ms_mask[k][0], 0, MAX_SFB ); + + nAvailBitsMS[k] = ( ( mct_on ? 2 * sts[0]->bits_frame_channel : sts[0]->bits_frame_nominal ) - sts[0]->side_bits_frame_channel - sts[1]->side_bits_frame_channel - ( nSubframes == 2 ? OFFSET_BITS_TCX10 : OFFSET_BITS_TCX20 ) ) / nSubframes; + + MsStereoDecision( sfbConf, sts[0]->hTcxEnc->spectrum[k], sts[1]->hTcxEnc->spectrum[k], inv_spectrum[0][k], inv_spectrum[1][k], &hStereoMdct->mdct_stereo_mode[k], &ms_mask[k][0], nAvailBitsMS[k] ); + + if ( sts[0]->igf ) + { + IGFEncStereoEncoder( sfbConf, sts[0]->hIGFEnc, sts[0]->hTcxEnc->spectrum[k], sts[1]->hTcxEnc->spectrum[k], &ms_mask[k][0], + &hStereoMdct->IGFStereoMode[k], hStereoMdct->mdct_stereo_mode[k], sts[0]->core == TCX_20_CORE, sts[0]->last_core == ACELP_CORE ); + } + else + { + hStereoMdct->IGFStereoMode[k] = hStereoMdct->mdct_stereo_mode[k]; + } + + if ( hStereoMdct->mdct_stereo_mode[k] != SMDCT_DUAL_MONO || hStereoMdct->IGFStereoMode[k] != SMDCT_DUAL_MONO ) + { + ms_inv_mask_processing( hStereoMdct, sts, ms_mask, k, sts[0]->hTcxEnc->spectrum[k], sts[1]->hTcxEnc->spectrum[k], inv_spectrum[0][k], inv_spectrum[1][k], sfbConf->sfbCnt ); + ms_processing( hStereoMdct, sts, ms_mask, k, sts[0]->hTcxEnc->spectrum[k], sts[1]->hTcxEnc->spectrum[k], sfbConf->sfbCnt ); + + if ( !sts[0]->hTcxEnc->fUseTns[k] && !sts[1]->hTcxEnc->fUseTns[k] ) + { + sts[0]->hTcxEnc->tns_ms_flag[k] = 1; + sts[1]->hTcxEnc->tns_ms_flag[k] = 1; + ms_inv_mask_processing( hStereoMdct, sts, ms_mask, k, mdst_spectrum[0][k], mdst_spectrum[1][k], inv_mdst_spectrum[0][k], inv_mdst_spectrum[1][k], -1 ); + ms_processing( hStereoMdct, sts, ms_mask, k, mdst_spectrum[0][k], mdst_spectrum[1][k], sfbConf->sfbCnt ); + } + } + } /* for k */ + + } + /* for bitrate switching determine correlation depending on m/s decision */ + { + int16_t ms_bands[2]; + float sw_uncorr[2], sw_uncorr_mean; + for ( k = 0; k < nSubframes; k++ ) + { + sfbConf = ( sts[0]->core == TCX_20_CORE ) ? &hStereoMdct->stbParamsTCX20 : &hStereoMdct->stbParamsTCX10; + ms_bands[k] = sum_s( ms_mask[k], sfbConf->nBandsStereoCore ); + sw_uncorr[k] = ( 1.0f - (float) ms_bands[k] / sfbConf->nBandsStereoCore ); + } + if ( sts[0]->core == TCX_20_CORE ) + { + sw_uncorr_mean = sw_uncorr[0]; + } + else + { + sw_uncorr_mean = ( sw_uncorr[0] + sw_uncorr[1] ) * 0.5f; + } + hStereoMdct->sw_uncorr = ( sw_uncorr_mean > 0.6f ); + } + + pop_wmops(); + + + return; +} + + +/*-------------------------------------------------------------------* + * ms_processing() + * + * + *-------------------------------------------------------------------*/ + +void ms_processing( + STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct, /* i/o: Stereo MDCT encoder structure */ + Encoder_State **sts, /* i/o: Encoder state structure */ + int16_t ms_mask[NB_DIV][MAX_SFB], /* i : bandwise MS mask */ + const int16_t iSubframe, /* i : subframe number */ + float x_0[], /* i/o: spectrum 1 */ + float x_1[], /* i/o: spectrum 1 */ + int16_t maxSfb /* i : number of stereo frequency bands*/ +) +{ + int16_t sfb; + STEREO_MDCT_BAND_PARAMETERS *sfbConf; + + sfbConf = ( sts[0]->core == TCX_20_CORE ) ? &hStereoMdct->stbParamsTCX20 : &hStereoMdct->stbParamsTCX10; + + if ( sts[0]->last_core == ACELP_CORE ) + { + assert( sts[1]->last_core == ACELP_CORE ); + sfbConf = &hStereoMdct->stbParamsTCX20afterACELP; + } + + if ( maxSfb == -1 ) + { + maxSfb = sfbConf->sfbCnt; + } + + for ( sfb = 0; sfb < maxSfb; sfb++ ) + { + if ( ms_mask[iSubframe][sfb] ) + { + convertToBwMS( sfbConf->sfbOffset[sfb], sfbConf->sfbOffset[sfb + 1], x_0, x_1, SQRT2_OVER_2 ); + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * ms_inv_mask_processing() + * + * + *-------------------------------------------------------------------*/ + +void ms_inv_mask_processing( + STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct, /* i/o: Stereo MDCT encoder structure */ + Encoder_State **sts, /* i/o: Encoder state structure */ + int16_t ms_mask[NB_DIV][MAX_SFB], /* i : bandwise MS mask */ + const int16_t iSubframe, /* i : subframe number */ + const float x_0[], /* i : spectrum 1 */ + const float x_1[], /* i : spectrum 2 */ + float x_inv_0[], /* o : inverse spectrum 1 */ + float x_inv_1[], /* o : inverse spectrum 2 */ + int16_t maxSfb /* i : number of stereo frequency bands*/ +) +{ + int16_t sfb; + STEREO_MDCT_BAND_PARAMETERS *sfbConf; + int16_t nSubframes, L_subframeTCX; + + nSubframes = ( sts[0]->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; + L_subframeTCX = sts[0]->hTcxEnc->L_frameTCX / nSubframes; + sfbConf = ( sts[0]->core == TCX_20_CORE ) ? &hStereoMdct->stbParamsTCX20 : &hStereoMdct->stbParamsTCX10; + + if ( sts[0]->last_core == ACELP_CORE ) + { + assert( sts[1]->last_core == ACELP_CORE ); + sfbConf = &hStereoMdct->stbParamsTCX20afterACELP; + } + + if ( maxSfb == -1 ) + { + maxSfb = sfbConf->sfbCnt; + } + + for ( sfb = 0; sfb < maxSfb; sfb++ ) + { + mvr2r( &x_0[sfbConf->sfbOffset[sfb]], &x_inv_0[sfbConf->sfbOffset[sfb]], sfbConf->sfbOffset[sfb + 1] - sfbConf->sfbOffset[sfb] ); + mvr2r( &x_1[sfbConf->sfbOffset[sfb]], &x_inv_1[sfbConf->sfbOffset[sfb]], sfbConf->sfbOffset[sfb + 1] - sfbConf->sfbOffset[sfb] ); + + if ( ms_mask[iSubframe][sfb] == 0 ) + { + convertToBwMS( sfbConf->sfbOffset[sfb], sfbConf->sfbOffset[sfb + 1], x_inv_0, x_inv_1, SQRT2_OVER_2 ); + } + } + + /* set rest of inverse spectrum to zero */ + if ( L_subframeTCX > sfbConf->sfbOffset[maxSfb] ) + { + set_zero( &x_inv_0[sfbConf->sfbOffset[maxSfb]], L_subframeTCX - sfbConf->sfbOffset[maxSfb] ); + set_zero( &x_inv_1[sfbConf->sfbOffset[maxSfb]], L_subframeTCX - sfbConf->sfbOffset[maxSfb] ); + } + + return; +} + + +/*-------------------------------------------------------------------* + * write_stereo_to_bitstream() + * + * + *-------------------------------------------------------------------*/ + +int16_t write_stereo_to_bitstream( + STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct, /* i/o: Stereo MDCT encoder structure */ + Encoder_State **sts, /* i/o: Encoder state structure */ + int16_t ms_mask[NB_DIV][MAX_SFB], /* i : bandwise MS mask */ + const int16_t mct_on, /* i : flag mct block (1) or stereo (0)*/ + BSTR_ENC_HANDLE hBstr /* i/o: bitstream handle */ +) +{ + int16_t i, k, nSubframes; + uint16_t mdct_stereo_mode, stereo_mode_bits; + STEREO_MDCT_BAND_PARAMETERS *sfbConf; + int16_t start_bits = hBstr->nb_bits_tot; + + if ( !mct_on ) + { + assert( ( ( sts[0]->hTcxEnc->transform_type[0] == sts[1]->hTcxEnc->transform_type[0] ) && ( sts[0]->hTcxEnc->transform_type[1] == sts[1]->hTcxEnc->transform_type[1] ) ) || ( ( hStereoMdct->mdct_stereo_mode[0] == SMDCT_DUAL_MONO ) && ( hStereoMdct->mdct_stereo_mode[1] == SMDCT_DUAL_MONO ) ) ); + } + + nSubframes = ( sts[0]->core == TCX_10_CORE || ( sts[0]->core != sts[1]->core ) ) ? NB_DIV : 1; + sfbConf = ( sts[0]->core == TCX_20_CORE ) ? &hStereoMdct->stbParamsTCX20 : &hStereoMdct->stbParamsTCX10; + + if ( sts[0]->last_core == ACELP_CORE ) + { + assert( sts[1]->ini_frame == 0 || sts[1]->last_core == ACELP_CORE ); + sfbConf = &hStereoMdct->stbParamsTCX20afterACELP; + } + + if ( hStereoMdct->hItd != NULL ) + { + write_itd_data( hStereoMdct->hItd, hBstr ); + } + + for ( k = 0; k < nSubframes; k++ ) + { + mdct_stereo_mode = 0; + stereo_mode_bits = 1; + + switch ( hStereoMdct->mdct_stereo_mode[k] ) + { + case SMDCT_DUAL_MONO: + mdct_stereo_mode = 0; + stereo_mode_bits = 1; + break; + case SMDCT_MS_FULL: + mdct_stereo_mode = 2; + stereo_mode_bits = 2; + break; + case SMDCT_BW_MS: + mdct_stereo_mode = 3; + stereo_mode_bits = 2; + break; + default: + assert( !"Not supported MDCT stereo mode\n" ); + } + + push_next_indice( hBstr, mdct_stereo_mode, stereo_mode_bits ); + + if ( !mct_on ) + { + if ( ( sts[0]->core == sts[1]->core ) || ( k == 0 ) ) + { + push_next_indice( hBstr, hStereoMdct->global_ild[k], SMDCT_GLOBAL_ILD_BITS ); + } + } + + if ( hStereoMdct->mdct_stereo_mode[k] == SMDCT_BW_MS ) + { + for ( i = 0; i < sfbConf->nBandsStereoCore; i++ ) + { + push_next_indice( hBstr, ms_mask[k][i] ? 1 : 0, 1 ); + } + } + + if ( sts[0]->igf ) + { + mdct_stereo_mode = 0; + stereo_mode_bits = 1; + switch ( hStereoMdct->IGFStereoMode[k] ) + { + case SMDCT_DUAL_MONO: + mdct_stereo_mode = 0; + stereo_mode_bits = 1; + break; + case SMDCT_MS_FULL: + mdct_stereo_mode = 2; + stereo_mode_bits = 2; + break; + case SMDCT_BW_MS: + mdct_stereo_mode = 3; + stereo_mode_bits = 2; + break; + default: + assert( !"Not supported MDCT stereo mode\n" ); + } + + push_next_indice( hBstr, mdct_stereo_mode, stereo_mode_bits ); + + + if ( hStereoMdct->IGFStereoMode[k] == SMDCT_BW_MS ) + { + for ( i = sfbConf->nBandsStereoCore; i < sfbConf->sfbCnt; i++ ) + { + push_next_indice( hBstr, ms_mask[k][i] ? 1 : 0, 1 ); + } + } + } + } + + return ( hBstr->nb_bits_tot - start_bits ); +} + +/*-------------------------------------------------------------------* + * Band-wise M/S stereo processing + * + * + *-------------------------------------------------------------------*/ + +static void convertToBwMS( + const int16_t startLine, /* i : start line of sfb */ + const int16_t stopLine, /* i : stop line of sfb */ + float x0[], /* i/o: mid/left channel coefficients */ + float x1[], /* i/o: side/right channel coefficients */ + const float norm_fac /* i : normalization factor */ +) +{ + int16_t j; + float tmpValue; + + for ( j = startLine; j < stopLine; j++ ) + { + tmpValue = x0[j]; + x0[j] = ( x0[j] + x1[j] ) * norm_fac; + x1[j] = ( tmpValue - x1[j] ) * norm_fac; + } + + return; +} + +/*-------------------------------------------------------------------* + * convertToMS() + * + * + *-------------------------------------------------------------------*/ + +void convertToMS( + const int16_t L_frame, /* i : frame length */ + float x0[], /* i/o: mid/left channel coefficients */ + float x1[], /* i/o: side/right channel coefficients */ + const float norm_fac /* i : normalization factor */ +) +{ + convertToBwMS( 0, L_frame, x0, x1, norm_fac ); + + return; +} + +/*-------------------------------------------------------------------* + * SQ_gain_estimate_stereo() + * + * + *-------------------------------------------------------------------*/ + +/*! r: SQ gain */ +static float SQ_gain_estimate_stereo( + float xL[], /* i : L vector to quantize */ + float xR[], /* i : R vector to quantize */ + const int16_t nbitsSQ, /* i : number of bits targeted */ + const int16_t lg /* i : vector size (2048 max) */ +) +{ + int16_t i, q, iter; + float ener, tmp, target, fac, offset; + float en[N_MAX / 2]; + int16_t lg2, lg_4, lg2_4; + + lg_4 = lg >> 2; + lg2_4 = 2 * lg_4; + lg2 = lg2_4 << 2; + i = 0; + + set_f( en, 0.01f, N_MAX / 2 ); + + /* energy of quadruples with 9dB offset */ + /* ignore that we may take no all lines into account, max. 3 lines at the upper end of the spectrum can be missed (if lg is not a multiple of 4, happens also in SQGain()*/ + for ( q = 0; q < lg_4; q++ ) + { + ener = 0.01f + xL[i] * xL[i] + xL[i + 1] * xL[i + 1] + xL[i + 2] * xL[i + 2] + xL[i + 3] * xL[i + 3]; + en[q] = log10f( ener ); /* saves a MAC */ + i += 4; + } + i = 0; + for ( ; q < lg2_4; q++ ) + { + ener = 0.01f + xR[i] * xR[i] + xR[i + 1] * xR[i + 1] + xR[i + 2] * xR[i + 2] + xR[i + 3] * xR[i + 3]; + en[q] = log10f( ener ); /* saves a MAC */ + i += 4; + } + + /* SQ scale: 4 bits / 6 dB per quadruple */ + target = 0.15f * (float) ( nbitsSQ - ( lg2 >> 4 ) ); + fac = 12.8f; + offset = fac; + + /* find offset (0 to 128 dB with step of 0.125dB) */ + for ( iter = 0; iter < 10; iter++ ) + { + fac *= 0.5f; + offset -= fac; + ener = 0.0f; + + for ( i = 0; i < lg2_4; i++ ) + { + tmp = en[i] - offset; + + /* avoid SV with 1 bin of amp < 0.5f */ + if ( tmp > 0.3f ) + { + ener += tmp; + + /* if ener is above target -> break and increase offset */ + if ( ener > target ) + { + offset += fac; + break; + } + } + } + } + + /* return gain */ + return powf( 10.0f, 0.45f + 0.5f * offset ); +} + +/*-------------------------------------------------------------------* + * QuantSpecEstimateBits() + * + * + *-------------------------------------------------------------------*/ + +static int16_t QuantSpecEstimateBits( + float *spec, + float G, + const int16_t length, + const int16_t nBitsAvailable, + int16_t sqQ[] ) +{ + int16_t stop, sqBits, nEncoded; + int16_t lastnz; + + tcx_scalar_quantization( spec, sqQ, length, G, 0.5f, NULL, 1 ); + + stop = 0; + + sqBits = RCcontextMapping_encode2_estimate_no_mem_s17_LCS( sqQ, length, &lastnz, &nEncoded, nBitsAvailable, &stop, 0, NULL ); + + if ( stop != 0 ) + { + sqBits = stop; + } + + return sqBits; +} + +/*-------------------------------------------------------------------* + * context_update() + * + * + *-------------------------------------------------------------------*/ + +static void context_update( + HANDLE_RC_CONTEXT_MEM ctxSrc, + HANDLE_RC_CONTEXT_MEM ctxTarget, + const int16_t endLine ) +{ + int16_t last_nz; + + /* check if last_nz of target is smaller than endLine, save and update */ + last_nz = max( ctxTarget->lastnz, endLine ); + + mvc2c( (uint8_t *) ctxSrc, (uint8_t *) ctxTarget, sizeof( RC_CONTEXT_MEM ) ); + ctxTarget->lastnz = last_nz; + + return; +} + +/*-------------------------------------------------------------------* + * GetChannelEnergyRatio() + * + * + *-------------------------------------------------------------------*/ + +static float GetChannelEnergyRatio( + Encoder_State **sts, /* i/o: Encoder state structure */ + const int16_t iFirstSubframe, + const int16_t iLastSubframe, + const uint8_t ratioInRmsDomain ) +{ + int16_t ch, n, i; + float nrg[2]; + + /* Calculate energies per channel */ + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + const Encoder_State *st = sts[ch]; + const int16_t nSubframes = ( st->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; + int16_t L_subframeTCX = st->hTcxEnc->L_frameTCX / nSubframes; + + if ( st->last_core == ACELP_CORE ) + { + L_subframeTCX += L_subframeTCX / 4; + } + assert( iFirstSubframe >= 0 && iFirstSubframe <= iLastSubframe ); + + nrg[ch] = 0; + for ( n = iFirstSubframe; n <= min( nSubframes - 1, iLastSubframe ); n++ ) + { + for ( i = 0; i < L_subframeTCX; i++ ) + { + nrg[ch] += st->hTcxEnc->spectrum[n][i] * st->hTcxEnc->spectrum[n][i]; + } + } + if ( ratioInRmsDomain ) + { + nrg[ch] = sqrtf( nrg[ch] ); + } + } + + return ( nrg[0] + nrg[1] ) > 0 ? nrg[0] / ( nrg[0] + nrg[1] ) : -1.0f; +} + +/*-------------------------------------------------------------------* + * FindSplitRatio() + * + * + *-------------------------------------------------------------------*/ + +void FindSplitRatio( + CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ + Encoder_State **sts /* i/o: Encoder state structure */ +) +{ + const uint8_t highRateMdctStereo = ( sts[0]->element_brate < IVAS_80k && sts[0]->core == sts[1]->core && sts[0]->element_mode == IVAS_CPE_MDCT && sts[0]->hTcxEnc->enc_ste_pre_corr_past ? 0 : 1 ); + float ratio; + + /* Calculate split ratio and quantize it */ + hCPE->hStereoMdct->split_ratio = SMDCT_EQUAL_RATIO_RANGE; /* Equal bits to both channels */ + + ratio = GetChannelEnergyRatio( sts, 0, 1, highRateMdctStereo ); + + if ( ratio >= 0 ) + { + hCPE->hStereoMdct->split_ratio = (uint16_t) ( SMDCT_BITRATE_RATIO_RANGE * ratio + 0.5f ); + /* Tuning to get closer to the optimal split ratio */ + if ( ratio < 8.0f / 9.0f && hCPE->hStereoMdct->split_ratio > SMDCT_EQUAL_RATIO_RANGE + ( SMDCT_BITRATE_RATIO_RANGE >> 4 ) ) + { + hCPE->hStereoMdct->split_ratio -= SMDCT_BITRATE_RATIO_RANGE >> 3; + } + if ( ratio > 1.0f / 9.0f && hCPE->hStereoMdct->split_ratio < SMDCT_EQUAL_RATIO_RANGE - ( SMDCT_BITRATE_RATIO_RANGE >> 4 ) ) + { + hCPE->hStereoMdct->split_ratio += SMDCT_BITRATE_RATIO_RANGE >> 3; + } + + hCPE->hStereoMdct->split_ratio = min( SMDCT_BITRATE_RATIO_RANGE - 1, max( 1, hCPE->hStereoMdct->split_ratio ) ); + } + + return; +} + +/*-------------------------------------------------------------------* + * MsStereoDecision() + * + * + *-------------------------------------------------------------------*/ + +static void MsStereoDecision( + STEREO_MDCT_BAND_PARAMETERS *sfbParam, + float *specL, + float *specR, + float *specM, /* scratch buffer for M, use buffer for inverse MS mask spectrum */ + float *specS, /* scratch buffer for M, use buffer for inverse MS mask spectrum */ + int16_t *mdct_stereo_mode, /* output */ + int16_t *msMask, /* output */ + const int16_t nBitsAvailable ) +{ + int16_t length = sfbParam->sfbOffset[sfbParam->nBandsStereoCore]; + + int16_t bitsL, bitsR, bitsM, bitsS; + int16_t bitsBW, bitsLR, bitsMS; + float G; + float GLR; + int16_t sfb, i; + int16_t nMSOn; /* Number of MS active bands */ + int16_t quantSpecL[N_MAX]; + int16_t quantSpecR[N_MAX]; + int16_t quantSpecM[N_MAX]; + int16_t quantSpecS[N_MAX]; + RC_CONTEXT_MEM ctxMem[4]; + HANDLE_RC_CONTEXT_MEM ctxL, ctxR, ctxM, ctxS; + + set_s( quantSpecL, 0, N_MAX ); + set_s( quantSpecR, 0, N_MAX ); + set_s( quantSpecM, 0, N_MAX ); + set_s( quantSpecS, 0, N_MAX ); + + assert( nBitsAvailable > 0 ); + + ctxL = &ctxMem[0]; + ctxR = &ctxMem[1]; + ctxM = &ctxMem[2]; + ctxS = &ctxMem[3]; + + GLR = SQ_gain_estimate_stereo( specL, specR, nBitsAvailable, length ); + + for ( i = 0; i < length; i++ ) + { + specM[i] = ( specL[i] + specR[i] ) * SQRT2_OVER_2; + specS[i] = ( specL[i] - specR[i] ) * SQRT2_OVER_2; + } + + G = 0.5f * GLR; /* seems to be favourable to underestimate a bit */ + + /* do the full spectrum estimates already here, as side effect we get the quantized spectra... */ + bitsLR = QuantSpecEstimateBits( specL, G, length, nBitsAvailable, quantSpecL ) + QuantSpecEstimateBits( specR, G, length, nBitsAvailable, quantSpecR ); + bitsMS = QuantSpecEstimateBits( specM, G, length, nBitsAvailable, quantSpecM ) + QuantSpecEstimateBits( specS, G, length, nBitsAvailable, quantSpecS ); + + /* clean-up MS scratch buffers */ + set_zero( specM, length ); + set_zero( specS, length ); + + nMSOn = 0; + bitsBW = 0; + + RCcontextMapping_encode2_estimate_bandWise_start( quantSpecL, length, nBitsAvailable, ctxL ); + RCcontextMapping_encode2_estimate_bandWise_start( quantSpecR, length, nBitsAvailable, ctxR ); + + bitsBW += RCcontextMapping_encode2_estimate_bandWise_start( quantSpecM, length, nBitsAvailable, ctxM ); + bitsBW += RCcontextMapping_encode2_estimate_bandWise_start( quantSpecS, length, nBitsAvailable, ctxS ); + + /*find_max_lastnz(ctxL,ctxR,ctxM,ctxS);*/ + + for ( sfb = 0; sfb < sfbParam->nBandsStereoCore; sfb++ ) + { + const int16_t startline = sfbParam->sfbOffset[sfb]; + const int16_t endline = sfbParam->sfbOffset[sfb + 1]; + + bitsL = RCcontextMapping_encode2_estimate_bandWise( quantSpecL, startline, endline, ctxL ); + bitsR = RCcontextMapping_encode2_estimate_bandWise( quantSpecR, startline, endline, ctxR ); + bitsM = RCcontextMapping_encode2_estimate_bandWise( quantSpecM, startline, endline, ctxM ); + bitsS = RCcontextMapping_encode2_estimate_bandWise( quantSpecS, startline, endline, ctxS ); + + if ( bitsM + bitsS <= bitsL + bitsR ) + { + msMask[sfb] = 1; + ++nMSOn; + context_update( ctxM, ctxL, endline ); + context_update( ctxS, ctxR, endline ); + bitsBW += bitsM + bitsS; + } + else + { + msMask[sfb] = 0; + context_update( ctxL, ctxM, endline ); + context_update( ctxR, ctxS, endline ); + bitsBW += bitsL + bitsR; + } + } + + bitsBW += sfbParam->nBandsStereoCore; /* Signaling bits */ + + if ( bitsLR < bitsBW ) + { + nMSOn = 0; + set_s( msMask, 0, sfbParam->sfbCnt ); + bitsBW = bitsLR; + } + + if ( bitsMS < bitsBW ) + { + nMSOn = sfbParam->nBandsStereoCore; + set_s( msMask, 1, sfbParam->sfbCnt ); + } + + *mdct_stereo_mode = SMDCT_BW_MS; + if ( nMSOn == sfbParam->nBandsStereoCore ) + { + *mdct_stereo_mode = SMDCT_MS_FULL; + } + else if ( nMSOn == 0 ) + { + *mdct_stereo_mode = SMDCT_DUAL_MONO; + } + + return; +} + + +/*-----------------------------------------------------------------------* + * initMdctStereoEncData() + * + * initialize encoder mdct stereo structure + *-----------------------------------------------------------------------*/ + +void initMdctStereoEncData( + STEREO_MDCT_ENC_DATA *hStereoMdct, /* i/o: mdct stereo parameters structure */ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const int16_t element_mode, /* i : element mode */ + const int32_t element_brate, /* i : element bitrate */ + const int16_t bwidth, /* i : bandwidth */ + const int16_t igf, /* i : flag indicating IGF activity */ + const H_IGF_GRID hIgfGrid, /* i : IGF grid setup */ + const int16_t mem_init /* i : initialize memory after malloc */ +) +{ + int16_t tcx_coded_lines; + + tcx_coded_lines = getNumTcxCodedLines( bwidth ); + + /*initialize mdct stereo mode*/ + set_s( hStereoMdct->mdct_stereo_mode, -1, 2 ); + + /*Initialize sfb parameteres for TCX20 */ + stereo_mdct_init_bands( tcx_coded_lines, TCX_20_CORE, element_brate, igf, igf ? &hIgfGrid[IGF_GRID_LB_NORM] : NULL, &hStereoMdct->stbParamsTCX20.sfbOffset[0], &hStereoMdct->stbParamsTCX20.sfbCnt ); + + /*Initialize sfb parameteres for TCX10 */ + stereo_mdct_init_bands( tcx_coded_lines, TCX_10_CORE, element_brate, igf, igf ? &hIgfGrid[IGF_GRID_LB_SHORT] : NULL, + &hStereoMdct->stbParamsTCX10.sfbOffset[0], &hStereoMdct->stbParamsTCX10.sfbCnt ); + + /*Initialize sfb parameteres for transitions */ + stereo_mdct_init_bands( tcx_coded_lines, -1, element_brate, igf, igf ? &hIgfGrid[IGF_GRID_LB_TRAN] : NULL, + &hStereoMdct->stbParamsTCX20afterACELP.sfbOffset[0], &hStereoMdct->stbParamsTCX20afterACELP.sfbCnt ); + + set_s( hStereoMdct->IGFStereoMode, -1, 2 ); + + + hStereoMdct->split_ratio = SMDCT_EQUAL_RATIO_RANGE; + set_s( hStereoMdct->global_ild, SMDCT_ILD_RANGE >> 1, 2 ); + + if ( mem_init ) + { + hStereoMdct->hItd = NULL; + hStereoMdct->hDft_ana = NULL; + } + + if ( !( element_mode == IVAS_CPE_MDCT && element_brate <= MAX_MDCT_ITD_BRATE && ivas_format == STEREO_FORMAT ) ) + { + if ( hStereoMdct->hDft_ana != NULL ) + { + free( hStereoMdct->hDft_ana ); + hStereoMdct->hDft_ana = NULL; + } + + if ( hStereoMdct->hItd != NULL ) + { + free( hStereoMdct->hItd ); + hStereoMdct->hItd = NULL; + } + } + + return; +} + +/*-----------------------------------------------------------------------* + * initMdctItdHandling() + * + * initialize encoder mdct ITD handling structures + *-----------------------------------------------------------------------*/ + +ivas_error initMdctItdHandling( + STEREO_MDCT_ENC_DATA *hStereoMdct, /* i/o: mdct stereo parameters structure */ + const int32_t input_Fs /* i : input sampling rate */ +) +{ + if ( hStereoMdct->hItd == NULL ) + { + if ( ( hStereoMdct->hItd = (ITD_DATA_HANDLE) malloc( sizeof( ITD_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for ITD data\n" ) ); + } + } + + if ( hStereoMdct->hDft_ana == NULL ) + { + if ( ( hStereoMdct->hDft_ana = (DFT_ANA_HANDLE) malloc( sizeof( DFT_ANA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for ITD data\n" ) ); + } + } + + /*Initialize ITD parameters*/ + stereo_enc_itd_init( hStereoMdct->hItd ); + + /*Initialize DFT analysis parameters*/ + dft_ana_init( hStereoMdct->hDft_ana, input_Fs ); + + return IVAS_ERR_OK; +} + +/*------------------------------------------------------------------------- + * stereo_mdct_enc_destroy() + * + * destroy MDCT stereo handle + *-------------------------------------------------------------------------*/ + +void stereo_mdct_enc_destroy( + STEREO_MDCT_ENC_DATA_HANDLE *hStereoMdct /* i/o: encoder MDCT stereo handle */ +) +{ + if ( ( *hStereoMdct )->hDft_ana != NULL ) + { + free( ( *hStereoMdct )->hDft_ana ); + ( *hStereoMdct )->hDft_ana = NULL; + } + + if ( ( *hStereoMdct )->hItd != NULL ) + { + free( ( *hStereoMdct )->hItd ); + ( *hStereoMdct )->hItd = NULL; + } + + free( *hStereoMdct ); + *hStereoMdct = NULL; + + return; +} diff --git a/lib_enc/ivas_stereo_switching_enc.c b/lib_enc/ivas_stereo_switching_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..5b173936c351f77145659782a73d6fd52a0ff38c --- /dev/null +++ b/lib_enc/ivas_stereo_switching_enc.c @@ -0,0 +1,830 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_rom_com.h" +#include "assert.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * Function allocate_CoreCoder_enc() + * + * Allocate CoreCoder modules + *-------------------------------------------------------------------*/ + +static ivas_error allocate_CoreCoder_enc( + ENC_CORE_HANDLE st /* i/o: Core encoder state structure */ +) +{ + if ( st->hLPDmem == NULL && st->element_mode != IVAS_CPE_MDCT ) + { + if ( ( st->hLPDmem = (LPD_state_HANDLE) malloc( sizeof( LPD_state ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LPDmem\n" ) ); + } + LPDmem_enc_init( st->hLPDmem ); + } + + if ( st->hGSCEnc == NULL && st->element_mode != IVAS_CPE_MDCT ) + { + if ( ( st->hGSCEnc = (GSC_ENC_HANDLE) malloc( sizeof( GSC_ENC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for GSC\n" ) ); + } + GSC_enc_init( st->hGSCEnc ); + } + + if ( st->hNoiseEst == NULL ) + { + if ( ( st->hNoiseEst = (NOISE_EST_HANDLE) malloc( sizeof( NOISE_EST_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Noise estimation\n" ) ); + } + noise_est_init( st->hNoiseEst ); + } + + if ( st->hVAD == NULL ) + { + if ( ( st->hVAD = (VAD_HANDLE) malloc( sizeof( VAD_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for VAD\n" ) ); + } + wb_vad_init( st->hVAD ); + } + + if ( st->hSpMusClas == NULL ) + { + if ( ( st->hSpMusClas = (SP_MUS_CLAS_HANDLE) malloc( sizeof( SP_MUS_CLAS_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Speech/music classifier\n" ) ); + } + speech_music_clas_init( st->hSpMusClas ); + } + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * Function deallocate_CoreCoder_TCX_enc() + * + * Deallocate CoreCoder TCX modules + *-------------------------------------------------------------------*/ + +static void deallocate_CoreCoder_TCX_enc( + ENC_CORE_HANDLE st /* i/o: Core encoder state structure */ +) +{ + if ( st->hTcxEnc != NULL ) + { + free( st->hTcxEnc ); + st->hTcxEnc = NULL; + } + + if ( st->hTcxCfg != NULL ) + { + free( st->hTcxCfg ); + st->hTcxCfg = NULL; + } + + if ( st->hIGFEnc != NULL ) + { + free( st->hIGFEnc ); + st->hIGFEnc = NULL; + } + + if ( st->hHQ_core != NULL ) + { + free( st->hHQ_core ); + st->hHQ_core = NULL; + } + + return; +} + + +/*-------------------------------------------------------------------* + * Function deallocate_CoreCoder_enc() + * + * Deallocate CoreCoder modules + *-------------------------------------------------------------------*/ + +static void deallocate_CoreCoder_enc( + ENC_CORE_HANDLE st /* i/o: Core encoder state structure */ +) +{ + if ( st->hLPDmem != NULL ) + { + free( st->hLPDmem ); + st->hLPDmem = NULL; + } + + if ( st->hGSCEnc != NULL ) + { + free( st->hGSCEnc ); + st->hGSCEnc = NULL; + } + + if ( st->hNoiseEst != NULL && st->element_mode != IVAS_CPE_MDCT ) + { + free( st->hNoiseEst ); + st->hNoiseEst = NULL; + } + + if ( st->hVAD != NULL && st->element_mode != IVAS_CPE_MDCT ) + { + free( st->hVAD ); + st->hVAD = NULL; + } + + if ( st->hSpMusClas != NULL && st->element_mode != IVAS_CPE_MDCT ) + { + free( st->hSpMusClas ); + st->hSpMusClas = NULL; + } + + if ( st->cldfbAnaEnc != NULL ) + { + deleteCldfb( &st->cldfbAnaEnc ); + } + + if ( st->hBWE_TD != NULL ) + { + free( st->hBWE_TD ); + st->hBWE_TD = NULL; + } + + if ( st->cldfbSynTd != NULL ) + { + deleteCldfb( &st->cldfbSynTd ); + } + + if ( st->hBWE_FD != NULL ) + { + free( st->hBWE_FD ); + st->hBWE_FD = NULL; + } + + if ( st->element_mode != IVAS_CPE_MDCT ) + { + deallocate_CoreCoder_TCX_enc( st ); + } + + return; +} + + +/*-------------------------------------------------------------------* + * Function stereo_memory_enc() + * + * Dynamically allocate/deallocate data structures depending on the actual CPE mode + *-------------------------------------------------------------------*/ + +ivas_error stereo_memory_enc( + CPE_ENC_HANDLE hCPE, /* i : CPE encoder structure */ + const int32_t input_Fs, /* i : input sampling rate */ + const int16_t max_bwidth, /* i : maximum audio bandwidth */ + float *tdm_last_ratio, /* o : TD stereo last ratio */ + const IVAS_FORMAT ivas_format, /* i : ivas format */ + const int16_t nchan_transport /* i : number transport chans */ +) +{ + Encoder_State *st; + ivas_error error; + + error = IVAS_ERR_OK; + + assert( hCPE->last_element_mode >= IVAS_CPE_DFT && "Switching from SCE to CPE is not a valid configuration!" ); + + /*--------------------------------------------------------------* + * save parameters from structures that will be freed + *---------------------------------------------------------------*/ + + if ( hCPE->last_element_mode == IVAS_CPE_TD ) + { + *tdm_last_ratio = hCPE->hStereoTD->tdm_last_ratio; /* note: this must be set to local variable before data structures are allocated/deallocated */ + } + + if ( hCPE->hStereoTCA != NULL && hCPE->last_element_mode == IVAS_CPE_DFT ) + { + set_s( hCPE->hStereoTCA->prevCorrLagStats, (int16_t) hCPE->hStereoDft->hItd->itd[1], 3 ); + hCPE->hStereoTCA->prevRefChanIndx = ( hCPE->hStereoDft->hItd->itd[1] >= 0 ) ? ( L_CH_INDX ) : ( R_CH_INDX ); + } + + /*--------------------------------------------------------------* + * allocate/deallocate data structures + *---------------------------------------------------------------*/ + + if ( hCPE->element_mode != hCPE->last_element_mode ) + { + /*--------------------------------------------------------------* + * switching CPE mode to DFT stereo + *---------------------------------------------------------------*/ + + if ( hCPE->element_mode == IVAS_CPE_DFT ) + { + /* deallocate data structure of the previous CPE mode */ + if ( hCPE->hStereoTD != NULL ) + { + free( hCPE->hStereoTD ); + hCPE->hStereoTD = NULL; + } + + if ( hCPE->hStereoMdct != NULL ) + { + stereo_mdct_enc_destroy( &( hCPE->hStereoMdct ) ); + hCPE->hStereoMdct = NULL; + } + + /* deallocate CoreCoder secondary channel */ + deallocate_CoreCoder_enc( hCPE->hCoreCoder[1] ); + + /* allocate DFT stereo data structure */ + if ( ( error = stereo_dft_enc_create( &( hCPE->hStereoDft ), input_Fs, max_bwidth ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* allocate ICBWE structure */ + if ( hCPE->hStereoICBWE == NULL ) + { + if ( ( hCPE->hStereoICBWE = (STEREO_ICBWE_ENC_HANDLE) malloc( sizeof( STEREO_ICBWE_ENC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Stereo ICBWE \n" ) ); + } + + stereo_icBWE_init_enc( hCPE->hStereoICBWE ); + } + + /* allocate HQ core in M channel */ + st = hCPE->hCoreCoder[0]; + if ( st->hHQ_core == NULL ) + { + if ( ( st->hHQ_core = (HQ_ENC_HANDLE) malloc( sizeof( HQ_ENC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HQ core\n" ) ); + } + + HQ_core_enc_init( st->hHQ_core ); + } + } + + /*--------------------------------------------------------------* + * switching CPE mode to TD stereo + *---------------------------------------------------------------*/ + + if ( hCPE->element_mode == IVAS_CPE_TD ) + { + /* deallocate data structure of the previous CPE mode */ + if ( hCPE->hStereoDft != NULL ) + { + stereo_dft_enc_destroy( &( hCPE->hStereoDft ) ); + hCPE->hStereoDft = NULL; + } + + if ( hCPE->hStereoMdct != NULL ) + { + stereo_mdct_enc_destroy( &( hCPE->hStereoMdct ) ); + hCPE->hStereoMdct = NULL; + } + + /* deallocated TCX/IGF structures for second channel */ + deallocate_CoreCoder_TCX_enc( hCPE->hCoreCoder[1] ); + + /* allocate TD stereo data structure */ + if ( hCPE->hStereoTD != NULL ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error: TD Stereo memory already allocated\n" ); + } + + if ( ( hCPE->hStereoTD = (STEREO_TD_ENC_DATA_HANDLE) malloc( sizeof( STEREO_TD_ENC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD Stereo\n" ) ); + } + + stereo_td_init_enc( hCPE->hStereoTD, hCPE->last_element_mode ); + + /* allocate secondary channel */ + if ( ( error = allocate_CoreCoder_enc( hCPE->hCoreCoder[1] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /*--------------------------------------------------------------* + * allocate DFT/TD stereo structures after MDCT stereo frame + *---------------------------------------------------------------*/ + + if ( hCPE->last_element_mode == IVAS_CPE_MDCT && ( hCPE->element_mode == IVAS_CPE_DFT || hCPE->element_mode == IVAS_CPE_TD ) ) + { + /* Deallocate MDCT CNG structures */ + deleteCldfb( &hCPE->hCoreCoder[0]->cldfbAnaEnc ); + deleteCldfb( &hCPE->hCoreCoder[1]->cldfbAnaEnc ); + + if ( hCPE->element_mode == IVAS_CPE_DFT ) + { + if ( hCPE->hCoreCoder[1]->hDtxEnc != NULL ) + { + free( hCPE->hCoreCoder[1]->hDtxEnc ); + hCPE->hCoreCoder[1]->hDtxEnc = NULL; + } + + if ( hCPE->hCoreCoder[1]->hFdCngEnc != NULL ) + { + deleteFdCngEnc( &hCPE->hCoreCoder[1]->hFdCngEnc ); + } + } + + if ( hCPE->hCoreCoder[0]->Opt_DTX_ON && hCPE->hCoreCoder[0]->hTdCngEnc == NULL ) + { + if ( ( hCPE->hCoreCoder[0]->hTdCngEnc = (TD_CNG_ENC_HANDLE) malloc( sizeof( TD_CNG_ENC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DTX/TD CNG\n" ) ); + } + + td_cng_enc_init( hCPE->hCoreCoder[0]->hTdCngEnc, hCPE->hCoreCoder[0]->Opt_DTX_ON, hCPE->hCoreCoder[0]->max_bwidth ); + } + + /* allocate TCA data structure */ + if ( hCPE->hStereoTCA != NULL ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error: TCA Stereo memory already allocated\n" ); + } + + if ( ( hCPE->hStereoTCA = (STEREO_TCA_ENC_HANDLE) malloc( sizeof( STEREO_TCA_ENC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Stereo TCA\n" ) ); + } + + stereo_tca_init_enc( hCPE->hStereoTCA, input_Fs ); + + st = hCPE->hCoreCoder[0]; + + /* allocate primary channel substructures */ + if ( ( error = allocate_CoreCoder_enc( st ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* allocate CLDFB for primary channel */ + if ( st->cldfbAnaEnc == NULL ) + { + if ( ( error = openCldfb( &st->cldfbAnaEnc, CLDFB_ANALYSIS, input_Fs, CLDFB_PROTOTYPE_1_25MS ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* allocate BWEs for primary channel */ + if ( st->hBWE_TD == NULL ) + { + if ( ( st->hBWE_TD = (TD_BWE_ENC_HANDLE) malloc( sizeof( TD_BWE_ENC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD BWE\n" ) ); + } + + if ( st->cldfbSynTd == NULL ) + { + if ( ( error = openCldfb( &st->cldfbSynTd, CLDFB_SYNTHESIS, 16000, CLDFB_PROTOTYPE_1_25MS ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + InitSWBencBuffer( st->hBWE_TD ); + ResetSHBbuffer_Enc( st->hBWE_TD ); + + if ( ( st->hBWE_FD = (FD_BWE_ENC_HANDLE) malloc( sizeof( FD_BWE_ENC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for FD BWE\n" ) ); + } + + fd_bwe_enc_init( st->hBWE_FD ); + } + + /* allocate stereo CNG structure */ + if ( hCPE->hStereoCng == NULL ) + { + if ( ( hCPE->hStereoCng = (STEREO_CNG_ENC_HANDLE) malloc( sizeof( STEREO_CNG_ENC ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Stereo Cng for Unified/TD\n" ) ); + } + + stereo_enc_cng_init( hCPE->hStereoCng ); + } + } + + /*--------------------------------------------------------------* + * switching CPE mode to MDCT stereo + *---------------------------------------------------------------*/ + + if ( hCPE->element_mode == IVAS_CPE_MDCT ) + { + int16_t i; + + /* deallocate data structure of the previous CPE mode */ + if ( hCPE->hStereoDft != NULL ) + { + stereo_dft_enc_destroy( &( hCPE->hStereoDft ) ); + hCPE->hStereoDft = NULL; + } + + if ( hCPE->hStereoTD != NULL ) + { + free( hCPE->hStereoTD ); + hCPE->hStereoTD = NULL; + } + + if ( hCPE->hStereoTCA != NULL ) + { + free( hCPE->hStereoTCA ); + hCPE->hStereoTCA = NULL; + } + + if ( hCPE->hStereoICBWE != NULL ) + { + free( hCPE->hStereoICBWE ); + hCPE->hStereoICBWE = NULL; + } + + for ( i = 0; i < CPE_CHANNELS; i++ ) + { + /* deallocate core-coder substructures */ + deallocate_CoreCoder_enc( hCPE->hCoreCoder[i] ); + } + + if ( hCPE->last_element_mode == IVAS_CPE_DFT ) + { + /* allocate secondary channel */ + if ( ( error = allocate_CoreCoder_enc( hCPE->hCoreCoder[1] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* allocate TCX/IGF structures for second channel */ + st = hCPE->hCoreCoder[1]; + + if ( ( st->hTcxEnc = (TCX_ENC_HANDLE) malloc( sizeof( TCX_ENC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for hTcxEnc\n" ) ); + } + st->hTcxEnc->spectrum[0] = st->hTcxEnc->spectrum_long; + st->hTcxEnc->spectrum[1] = st->hTcxEnc->spectrum_long + N_TCX10_MAX; + set_f( st->hTcxEnc->old_out, 0, L_FRAME32k ); + set_f( st->hTcxEnc->spectrum_long, 0, N_MAX ); + st->hTcxEnc->tfm_mem = 0.75f; + + if ( hCPE->last_element_mode == IVAS_CPE_DFT ) + { + st->last_core = ACELP_CORE; /* needed to set-up TCX core in SetTCXModeInfo() */ + } + + if ( ( st->hTcxCfg = (TCX_CONFIG_HANDLE) malloc( sizeof( TCX_config ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for hTcxCfg\n" ) ); + } + + if ( ( st->hIGFEnc = (IGF_ENC_INSTANCE_HANDLE) malloc( sizeof( IGF_ENC_INSTANCE ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for hIGFEnc\n" ) ); + } + st->igf = getIgfPresent( st->element_mode, st->total_brate, st->bwidth, st->rf_mode ); + + /* allocate and initialize MDCT stereo structure */ + if ( ( hCPE->hStereoMdct = (STEREO_MDCT_ENC_DATA_HANDLE) malloc( sizeof( STEREO_MDCT_ENC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MDCT Stereo \n" ) ); + } + + initMdctStereoEncData( hCPE->hStereoMdct, ivas_format, hCPE->element_mode, hCPE->element_brate, hCPE->hCoreCoder[0]->max_bwidth, 0, NULL, 1 ); + + hCPE->hStereoMdct->isSBAStereoMode = ( ivas_format == SBA_FORMAT && nchan_transport == 2 ); + + if ( hCPE->element_mode == IVAS_CPE_MDCT && hCPE->element_brate <= MAX_MDCT_ITD_BRATE && ivas_format == STEREO_FORMAT ) + { + if ( ( error = initMdctItdHandling( hCPE->hStereoMdct, input_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* allocate/deallocate and initialize DTX/CNG structures */ + if ( hCPE->hCoreCoder[0]->Opt_DTX_ON ) + { + for ( i = 0; i < CPE_CHANNELS; i++ ) + { + st = hCPE->hCoreCoder[i]; + if ( ( error = openCldfb( &st->cldfbAnaEnc, CLDFB_ANALYSIS, st->input_Fs, CLDFB_PROTOTYPE_1_25MS ) ) != IVAS_ERR_OK ) + { + return error; + } + + st->currEnergyLookAhead = 6.1e-5f; + + if ( st->hDtxEnc == NULL ) + { + if ( ( st->hDtxEnc = (DTX_ENC_HANDLE) malloc( sizeof( DTX_ENC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DTX variables\n" ) ); + } + } + dtx_enc_init( st, 0, FIXED_SID_RATE ); + + if ( st->hTdCngEnc != NULL ) + { + free( st->hTdCngEnc ); + st->hTdCngEnc = NULL; + } + + if ( st->hFdCngEnc == NULL ) + { + if ( ( error = createFdCngEnc( &st->hFdCngEnc ) ) != IVAS_ERR_OK ) + { + return error; + } + + initFdCngEnc( st->hFdCngEnc, st->input_Fs, st->cldfbAnaEnc->scale ); + configureFdCngEnc( st->hFdCngEnc, st->bwidth, st->rf_mode && st->total_brate == ACELP_13k20 ? ACELP_9k60 : st->total_brate ); + } + } + } + } + } + + if ( ivas_format == STEREO_FORMAT && hCPE->element_mode == IVAS_CPE_MDCT && hCPE->element_brate <= MAX_MDCT_ITD_BRATE && hCPE->last_element_brate > MAX_MDCT_ITD_BRATE ) + { + /* allocate MDCT stereo ITD handling structure */ + if ( ( error = initMdctItdHandling( hCPE->hStereoMdct, input_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + return error; +} + + +/*-------------------------------------------------------------------* + * Function stereo_switching_enc() + * + * Handling of memories in case of CPE modes switching + *-------------------------------------------------------------------*/ + +void stereo_switching_enc( + CPE_ENC_HANDLE hCPE, /* i : CPE encoder structure */ + float old_input_signal_pri[], /* i : old input signal of primary channel */ + const int16_t input_frame /* i : input frame length */ +) +{ + int16_t i, n, dft_ovl, offset; + float tmpF; + Encoder_State **sts; + + sts = hCPE->hCoreCoder; + dft_ovl = STEREO_DFT_OVL_MAX * input_frame / L_FRAME48k; + + /* update DFT analysis overlap memory */ + if ( hCPE->element_mode > IVAS_CPE_DFT && hCPE->input_mem[0] != NULL && hCPE->element_mode != IVAS_CPE_MDCT ) + { + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + mvr2r( sts[n]->input + input_frame - dft_ovl, hCPE->input_mem[n], dft_ovl ); + } + } + + /* save original stereo input (MDCT overlap part) for both channels in unused old input of right channel for possible DFT->MDCT transition */ + if ( hCPE->element_mode == IVAS_CPE_DFT ) + { + mvr2r( sts[0]->input + sts[0]->input_Fs / FRAMES_PER_SEC - sts[0]->encoderLookahead_FB, sts[1]->input - 2 * sts[0]->encoderLookahead_FB, sts[0]->encoderLookahead_FB ); + mvr2r( sts[1]->input + sts[1]->input_Fs / FRAMES_PER_SEC - sts[1]->encoderLookahead_FB, sts[1]->input - sts[1]->encoderLookahead_FB, sts[1]->encoderLookahead_FB ); + } + + /* TD/MDCT -> DFT stereo switching */ + if ( hCPE->element_mode == IVAS_CPE_DFT && hCPE->last_element_mode != IVAS_CPE_DFT ) + { + /* window DFT synthesis overlap memory @input_Fs, primary channel */ + for ( i = 0; i < dft_ovl; i++ ) + { + hCPE->hStereoDft->output_mem_dmx[i] = old_input_signal_pri[input_frame - dft_ovl + i] * hCPE->hStereoDft->win[dft_ovl - 1 - i]; + } + + /* reset 48kHz BWE overlap memory */ + set_f( hCPE->hStereoDft->output_mem_dmx_32k, 0, STEREO_DFT_OVL_32k ); + + stereo_dft_enc_reset( hCPE->hStereoDft ); + + /* update ITD parameters */ + if ( hCPE->element_mode == IVAS_CPE_DFT && hCPE->last_element_mode == IVAS_CPE_TD ) + { + set_f( hCPE->hStereoDft->hItd->itd, hCPE->hStereoTCA->prevCorrLagStats[2], STEREO_DFT_ENC_DFT_NB ); + } + + /* Update the side_gain[] parameters */ + if ( hCPE->hStereoTCA != NULL && hCPE->last_element_mode != IVAS_CPE_MDCT ) + { + tmpF = usdequant( hCPE->hStereoTCA->indx_ica_gD, STEREO_TCA_GDMIN, STEREO_TCA_GDSTEP ); + for ( i = 0; i < STEREO_DFT_BAND_MAX; i++ ) + { + hCPE->hStereoDft->side_gain[STEREO_DFT_BAND_MAX + i] = tmpF; + } + } + + /* do not allow differential coding of DFT side parameters */ + hCPE->hStereoDft->res_pred_counter = STEREO_DFT_FEC_THRESHOLD; + + /* update DFT synthesis overlap memory @12.8kHz */ + for ( i = 0; i < STEREO_DFT_OVL_12k8; i++ ) + { + hCPE->hStereoDft->output_mem_dmx_12k8[i] = sts[0]->buf_speech_enc[L_FRAME32k + L_FRAME - STEREO_DFT_OVL_12k8 + i] * hCPE->hStereoDft->win_12k8[STEREO_DFT_OVL_12k8 - 1 - i]; + } + + /* update DFT synthesis overlap memory @16kHz, primary channel only */ + lerp( hCPE->hStereoDft->output_mem_dmx, hCPE->hStereoDft->output_mem_dmx_16k, STEREO_DFT_OVL_16k, dft_ovl ); + + /* reset DFT synthesis overlap memory @8kHz, secondary channel */ + set_f( hCPE->hStereoDft->output_mem_res_8k, 0, STEREO_DFT_OVL_8k ); + + hCPE->hCoreCoder[1]->vad_flag = 0; + } + + /* MDCT -> TD stereo switching */ + if ( hCPE->element_mode == IVAS_CPE_TD && hCPE->last_element_mode == IVAS_CPE_MDCT ) + { + hCPE->hStereoTD->tdm_last_ratio_idx = LRTD_STEREO_LEFT_IS_PRIM; + hCPE->hStereoTD->tdm_last_ratio_idx_SM = LRTD_STEREO_LEFT_IS_PRIM; + hCPE->hStereoTD->tdm_last_SM_flag = 0; + hCPE->hStereoTD->tdm_last_inst_ratio_idx = LRTD_STEREO_MID_IS_PRIM; + hCPE->hStereoTD->tdm_last_ratio = tdm_ratio_tabl[LRTD_STEREO_LEFT_IS_PRIM]; + } + /* DFT -> TD stereo switching */ + else if ( hCPE->element_mode == IVAS_CPE_TD && hCPE->last_element_mode == IVAS_CPE_DFT ) + { + hCPE->hStereoTD->tdm_last_ratio_idx = LRTD_STEREO_MID_IS_PRIM; + hCPE->hStereoTD->tdm_last_ratio_idx_SM = LRTD_STEREO_MID_IS_PRIM; + hCPE->hStereoTD->tdm_last_SM_flag = 0; + hCPE->hStereoTD->tdm_last_inst_ratio_idx = LRTD_STEREO_MID_IS_PRIM; + + /* First frame after DFT frame AND the content is uncorrelated or xtalk -> the primary channel is forced to left */ + if ( hCPE->hStereoClassif->lrtd_mode == 1 ) + { + set_zero( sts[1]->input - input_frame, input_frame ); + + hCPE->hStereoTD->tdm_last_ratio = tdm_ratio_tabl[LRTD_STEREO_LEFT_IS_PRIM]; + hCPE->hStereoTD->tdm_last_ratio_idx = LRTD_STEREO_LEFT_IS_PRIM; + + if ( hCPE->hStereoTCA->instTargetGain < 0.05f && ( hCPE->hCoreCoder[0]->vad_flag || hCPE->hCoreCoder[1]->vad_flag ) ) /* but if there is no content in the L channel -> the primary channel is forced to right */ + { + hCPE->hStereoTD->tdm_last_ratio = tdm_ratio_tabl[LRTD_STEREO_RIGHT_IS_PRIM]; + hCPE->hStereoTD->tdm_last_ratio_idx = LRTD_STEREO_RIGHT_IS_PRIM; + } + } + } + + /* no secondary channel in the previous frame -> memory resets */ + if ( hCPE->element_mode > IVAS_CPE_DFT && hCPE->last_element_mode == IVAS_CPE_DFT ) + { + if ( sts[0]->cldfbAnaEnc != NULL ) + { + offset = sts[0]->cldfbAnaEnc->p_filter_length - sts[0]->cldfbAnaEnc->no_channels; + mvr2r( old_input_signal_pri + input_frame - offset - NS2SA( input_frame * FRAMES_PER_SEC, L_MEM_RECALC_TBE_NS ), sts[0]->cldfbAnaEnc->cldfb_state, offset ); + } + + if ( sts[0]->cldfbSynTd != NULL ) + { + cldfb_reset_memory( sts[0]->cldfbSynTd ); + sts[0]->currEnergyLookAhead = 6.1e-5f; + } + + if ( hCPE->hStereoICBWE == NULL && sts[1]->cldfbAnaEnc != NULL ) + { + offset = sts[1]->cldfbAnaEnc->p_filter_length - sts[1]->cldfbAnaEnc->no_channels; + + if ( hCPE->hStereoTD != NULL && hCPE->hStereoTD->tdm_last_ratio_idx == LRTD_STEREO_LEFT_IS_PRIM ) + { + v_multc( hCPE->hCoreCoder[1]->old_input_signal + input_frame - offset - NS2SA( input_frame * FRAMES_PER_SEC, L_MEM_RECALC_TBE_NS ), -1.0f, sts[1]->cldfbAnaEnc->cldfb_state, offset ); + } + else + { + mvr2r( hCPE->hCoreCoder[1]->old_input_signal + input_frame - offset - NS2SA( input_frame * FRAMES_PER_SEC, L_MEM_RECALC_TBE_NS ), sts[1]->cldfbAnaEnc->cldfb_state, offset ); + } + + if ( sts[1]->cldfbSynTd != NULL ) + { + cldfb_reset_memory( sts[1]->cldfbSynTd ); + sts[1]->currEnergyLookAhead = 6.1e-5f; + } + } + + sts[1]->last_extl = -1; + + /* no secondary channel in the previous frame -> memory resets */ + set_zero( sts[1]->old_inp_12k8, L_INP_MEM ); + set_zero( sts[1]->mem_decim, 2 * L_FILT_MAX ); + sts[1]->mem_preemph = 0; + + set_zero( sts[1]->buf_speech_enc, L_PAST_MAX_32k + L_FRAME32k + L_NEXT_MAX_32k ); + set_zero( sts[1]->buf_speech_enc_pe, L_PAST_MAX_32k + L_FRAME32k + L_NEXT_MAX_32k ); + + if ( sts[1]->hTcxEnc != NULL ) + { + set_zero( sts[1]->hTcxEnc->buf_speech_ltp, L_PAST_MAX_32k + L_FRAME32k + L_NEXT_MAX_32k ); + } + set_zero( sts[1]->buf_wspeech_enc, L_FRAME16k + L_SUBFR + L_FRAME16k + L_NEXT_MAX_16k ); + set_zero( sts[1]->buf_synth, OLD_SYNTH_SIZE_ENC + L_FRAME32k ); + sts[1]->mem_wsp = 0.0f; + sts[1]->mem_wsp_enc = 0.0f; + init_gp_clip( sts[1]->clip_var ); + + set_f( sts[1]->Bin_E, 0, L_FFT ); + set_f( sts[1]->Bin_E_old, 0, L_FFT / 2 ); + + /* sts[1]->hLPDmem reset already done in allocation of handles */ + + sts[1]->last_L_frame = sts[0]->last_L_frame; + + pitch_ol_init( &sts[1]->old_thres, &sts[1]->old_pitch, &sts[1]->delta_pit, &sts[1]->old_corr ); + set_zero( sts[1]->old_wsp, L_WSP_MEM ); + set_zero( sts[1]->old_wsp2, ( L_WSP_MEM - L_INTERPOL ) / OPL_DECIM ); + set_zero( sts[1]->mem_decim2, 3 ); + mvs2s( sts[0]->pitch, sts[1]->pitch, 3 ); + + sts[1]->Nb_ACELP_frames = 0; + + /* populate PCh memories into the SCh */ + if ( sts[0]->hLPDmem != NULL ) + { + mvr2r( sts[0]->hLPDmem->old_exc, sts[1]->hLPDmem->old_exc, L_EXC_MEM ); + } + mvr2r( sts[0]->lsf_old, sts[1]->lsf_old, M ); + mvr2r( sts[0]->lsp_old, sts[1]->lsp_old, M ); + mvr2r( sts[0]->lsf_old1, sts[1]->lsf_old1, M ); + mvr2r( sts[0]->lsp_old1, sts[1]->lsp_old1, M ); + + sts[1]->GSC_noisy_speech = 0; + if ( hCPE->element_mode == IVAS_CPE_MDCT ) + { + /* cross-fade overlap region of DFT Stereo downmix and original stereo channels */ + tmpF = 1.f / sts[0]->encoderLookahead_FB; + for ( i = 0; i < sts[0]->encoderLookahead_FB; i++ ) + { + sts[1]->input[-sts[0]->encoderLookahead_FB + i] = ( ( sts[0]->encoderLookahead_FB - i ) * sts[0]->input[-sts[0]->encoderLookahead_FB + i] + i * sts[1]->input[-sts[0]->encoderLookahead_FB + i] ) * tmpF; + sts[0]->input[-sts[0]->encoderLookahead_FB + i] = ( ( sts[0]->encoderLookahead_FB - i ) * sts[0]->input[-sts[0]->encoderLookahead_FB + i] + i * sts[1]->input[-2 * sts[0]->encoderLookahead_FB + i] ) * tmpF; + } + /* restore continuous signal in right channel (part of old_output was used to store original left channel) */ + mvr2r( sts[0]->input - sts[0]->hTcxEnc->L_frameTCX, sts[1]->input - sts[0]->hTcxEnc->L_frameTCX, sts[0]->hTcxEnc->L_frameTCX - sts[0]->encoderLookahead_FB ); + + sts[1]->last_core = sts[0]->last_core; + sts[1]->last_coder_type = sts[0]->last_coder_type; + sts[1]->last_bwidth = sts[0]->last_bwidth; + } + } + else if ( hCPE->element_mode == IVAS_CPE_TD && hCPE->last_element_mode == IVAS_CPE_MDCT ) + { + set_f( sts[0]->hLPDmem->old_exc, 0.0f, L_EXC_MEM ); + set_f( sts[1]->hLPDmem->old_exc, 0.0f, L_EXC_MEM ); + } + + /* TD/DFT -> MDCT stereo switching (there is no TCX in the TD stereo secondary channel, or DFT stereo) */ + if ( hCPE->element_mode == IVAS_CPE_MDCT && hCPE->last_element_mode != IVAS_CPE_MDCT ) + { + sts[1]->hTcxCfg->last_aldo = sts[0]->hTcxCfg->last_aldo; + sts[1]->hTcxCfg->tcx_curr_overlap_mode = sts[0]->hTcxCfg->tcx_curr_overlap_mode; + } + + return; +} diff --git a/lib_enc/ivas_stereo_td_analysis.c b/lib_enc/ivas_stereo_td_analysis.c new file mode 100644 index 0000000000000000000000000000000000000000..01f8a992cc96b9c0bd5f4c971d86ea483d0b53ae --- /dev/null +++ b/lib_enc/ivas_stereo_td_analysis.c @@ -0,0 +1,1454 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_rom_com.h" +#include "ivas_cnst.h" +#include "rom_enc.h" +#include "wmc_auto.h" + + +/*-------------------------------------------------------------------* + * Local constants + *-------------------------------------------------------------------*/ + +#define RMS_MIN 1500 /* Minimum energy for ratio index*/ +#define RMS_MIN2 1000 /* Minimum energy for LR encoding*/ +#define CORR_THRES 0.95f /* Maximal open loop correlation */ +#define DT_ENER_THR 200 /* Energy variation threshold */ + +#define ALP_REF 0.8f /* smoothing factor */ +#define BET_REF ( 1.0f - ALP_REF ) + +#define ALP1 0.5f /* smoothing factor in case of correlation are going in different directions */ +#define BET1 ( 1.0f - ALP1 ) /* increase the update rate */ + +#define ALP2 0.2f /* smoothing factor in case of correlation are going in different directions in SM mode*/ +#define BET2 ( 1.0f - ALP2 ) /* increase the update rate in SM mode*/ +#define RATIO_MAX 1.5f /* Maximum correlation ratio */ + +#define LIMIT_ADAP_FAC 0.15f +#define MIN_ADAP_FAC 0.1f +#define M_ADAP 0.0009f +#define B_ADAP 0.16f + +#define PC_LIMIT 64 +#define RATIO_PG_HR 0.94f +#define RATIO_PG 0.92f +#define PG2ND 3.0f +#define EUCLDST 0.04f +#define RATIO_PG2 0.86f +#define PG2ND2 3.0f +#define EUCLDST2 0.08f + +#define RMS_THR 100 +#define RATIO_PG_LRTD 0.96f + +#define IVAS_BRATE_OMASA_STEREO_SW_THR 15000 + + +/*-------------------------------------------------------------------* + * Local function prototypes + *-------------------------------------------------------------------*/ + +static int16_t stereo_tdm_ener_analysis_SM( CPE_ENC_HANDLE hCPE, Encoder_State **sts, const int16_t input_frame, int16_t *tdm_SM_flag ); + +static void Get_corr_n( const float L[], const float R[], float *ic_Lm, float *ic_Rm, const int16_t len, float *es_em, const int16_t tdm_SM_calc_flag ); + +static int16_t stereo_smooth_LR_transition( int16_t *tdm_prev_stable_idx, int16_t *tdm_ratio_transition_mov_flag, int16_t tdm_last_ratio_idx, int16_t *tdm_prev_desired_idx, int16_t *tdm_ratio_transition_cnt, const int16_t tdm_SM_flag, int16_t desired_idx ); + +static int16_t limit_idx_Dwnmix( const int16_t idx_in, const int16_t unclr_decision, const int16_t inst_idx, const int16_t previous_idx, const int16_t tdm_last_LRTD_PriCh_cnt, const int16_t tdm_last_LRTD_frame_cnt ); + +static int16_t limit_idx_NoDwnmix( const int16_t idx_in, const int16_t side_can_change, const float d_lt_corr_raw ); + +static void Get_LR_rms( const float *Left_in, const float *Right_in, const int16_t input_frame, float *rms_L, float *rms_R ); + +static int16_t Get_dt_lt_ener( CPE_ENC_HANDLE hCPE, const int16_t IsSideMono, const int16_t input_frame, const int16_t tdm_last_SM_flag, const float rms_L, const float rms_R, float *tdm_lt_rms_L, float *tdm_lt_rms_R, float *tdm_last_ener_lt_L, float *tdm_last_ener_lt_R, float *tdm_LT_es_em, int16_t *tdm_hyst_cnt, int16_t *tdm_NOOP_SM_flag_loc, float *ener_R_dt, float *ener_L_dt, float *corr_LM, float *corr_RM ); + +static void NOOP_decision( CPE_ENC_HANDLE hCPE, const int16_t tdm_NOOP_flag_loc, const int16_t tmp_SM_flag, const float rms_L, const float rms_R, int16_t *tdm_SM_flag_loc ); + +static float Comp_diff_lt_corr( CPE_ENC_HANDLE hCPE, const int16_t IsSideMono, const float rms_L, const float rms_R, const float ener_L_dt, const float ener_R_dt, float corr_LM, float corr_RM, const float tdm_lt_rms_L, const float tdm_lt_rms_R, float *tdm_lt_corr_LM, float *tdm_lt_corr_RM, float *tdm_last_diff_lt_corr, float *inst_ratio_L_out, float *diff_lt_corr ); + +/*-------------------------------------------------------------------* + * Function stereo_tdm_ener_analysis() + * + *-------------------------------------------------------------------*/ + +int16_t stereo_tdm_ener_analysis( + const int16_t ivas_format, /* i : IVAS format */ + CPE_ENC_HANDLE hCPE, /* i : CPE structure */ + const int16_t input_frame, /* i : Number of samples */ + int16_t *tdm_SM_or_LRTD_Pri, /* o : channel combination scheme flag in TD stereo OR LRTD primary channel */ + int16_t *tdm_ratio_idx_SM /* o : TDM ratio index for SM mode */ +) +{ + float rms_R, rms_L; + float corr_RM, corr_LM, diff_lt_corr = 0, ratio_L, dist; + int16_t i, side_can_change; + int16_t idx, tdm_SM_flag_loc; + int16_t tmp_SM_flag; + float ener_R_dt, ener_L_dt; + int16_t desired_idx; + float rms_thd; + int16_t tdm_NOOP_flag_loc, tdm_NOOP_flag; + STEREO_TD_ENC_DATA_HANDLE hStereoTD; + Encoder_State **sts; + const float *Left_in, *Right_in; + float d_lt_corr_raw; + float inst_ratio_L = 0; + int16_t tdm_LRTD_pri_side; + + hStereoTD = hCPE->hStereoTD; + sts = hCPE->hCoreCoder; + Left_in = sts[0]->input; /* Left channel */ + Right_in = sts[1]->input; /* Right channel */ + + desired_idx = 0; + + /*----------------------------------------------------------------* + * Compute L and R energy and Long term RMS of each channel + *----------------------------------------------------------------*/ + + Get_LR_rms( Left_in, Right_in, input_frame, &rms_L, &rms_R ); + + /*----------------------------------------------------------------* + * Compute the 1st order energy difference difference + * Compute the gain of L&R channel compared to mono + * - estimate the long term evolution of the L to Mono gain + * - estimate the long term evolution of the R to Mono gain + * - estimate the long term difference between the long term + * - evolution of the L and R to Mono gain + *----------------------------------------------------------------*/ + + tdm_SM_flag_loc = hStereoTD->tdm_last_SM_flag; + + tmp_SM_flag = Get_dt_lt_ener( hCPE, 0, input_frame, hStereoTD->tdm_last_SM_flag, rms_L, rms_R, &hStereoTD->tdm_lt_rms_L, &hStereoTD->tdm_lt_rms_R, &hStereoTD->tdm_last_ener_lt_L, &hStereoTD->tdm_last_ener_lt_R, + &hStereoTD->tdm_LT_es_em, &hStereoTD->tdm_hyst_cnt, &tdm_NOOP_flag_loc, &ener_R_dt, &ener_L_dt, &corr_LM, &corr_RM ); + + hStereoTD->tdm_SM_reset_flag = 0; + + /*----------------------------------------------------------------* + * Check if the signal has Near Out Of Phase characteristics + * and trigger side/mono configuration if needed + *----------------------------------------------------------------*/ + + NOOP_decision( hCPE, tdm_NOOP_flag_loc, tmp_SM_flag, rms_L, rms_R, &tdm_SM_flag_loc ); + + /*----------------------------------------------------------------* + * Adjust stereo downmixing adaptation rate factor + * in function of the signal energy. If signal energy is low, + * adaptation rate factor is lower. This prevent stereo image + * move on speech offset + *----------------------------------------------------------------*/ + + d_lt_corr_raw = Comp_diff_lt_corr( hCPE, 0, rms_L, rms_R, ener_L_dt, ener_R_dt, corr_LM, corr_RM, hStereoTD->tdm_lt_rms_L, hStereoTD->tdm_lt_rms_R, &hStereoTD->tdm_lt_corr_LM, + &hStereoTD->tdm_lt_corr_RM, &hStereoTD->tdm_last_diff_lt_corr, &inst_ratio_L, &diff_lt_corr ); + + /*----------------------------------------------------------------* + * UNCLR classifier (detection of uncorrelated L and R channels) + * Xtalk classifier (detection of cross-talk L and R channels) + *----------------------------------------------------------------*/ + + unclr_classifier_td( hCPE ); + xtalk_classifier_td( hCPE ); + + /* switch to LRTD on cross-talk segments where two speakers are weakly correlated */ + hStereoTD->prev_fr_LRTD_TD_dec = hCPE->hStereoClassif->lrtd_mode; + + /*----------------------------------------------------------------* + * When the energies of channels are low enough, compute the ratio + * of L and R needed to create new mono/side signals + *----------------------------------------------------------------*/ + + if ( ivas_format == MASA_ISM_FORMAT ) + { + + if ( ( hCPE->hStereoClassif->lrtd_mode == 1 || hCPE->hStereoTD->prev_fr_LRTD_TD_dec == 1 ) && ( hCPE->element_brate - 50 * FRAMES_PER_SEC + hCPE->brate_surplus + hCPE->brate_surplus < IVAS_BRATE_OMASA_STEREO_SW_THR ) ) + { + hStereoTD->prev_fr_LRTD_TD_dec = 0; + } + } + + rms_thd = RMS_MIN; + if ( hCPE->hStereoClassif->lrtd_mode == 1 ) + { + rms_thd *= .25f; + if ( hStereoTD->tdm_lt_rms_L <= 75 || hStereoTD->tdm_lt_rms_R <= 75 /*|| sts[0]->last_coder_type == TRANSITION */ ) + { + rms_thd *= .03125f; + } + else if ( sts[0]->hVAD->hangover_cnt >= 8 && sts[1]->hVAD->hangover_cnt >= 8 ) + { + rms_thd /= .2f; + } + + /* Overwrite the LR decision flag in case the signals is already considered as S/M or when the signal is very similar between left and right channel */ + if ( tdm_SM_flag_loc == 1 ) + { + hStereoTD->prev_fr_LRTD_TD_dec = 0; + } + else if ( hStereoTD->tdm_LRTD_flag == 1 && hStereoTD->tdm_FD2LRTD_SW_cnt > 10 && + ( hCPE->hStereoClassif->vad_flag_glob == 0 || ( hCPE->hStereoClassif->unclr_decision == 0 && ( hCPE->hStereoClassif->xtalk_score < -0.8f || hCPE->hStereoClassif->xtalk_wscore < -0.13f ) ) || + ( hCPE->hStereoClassif->unclr_decision == 1 && sts[0]->last_clas == UNVOICED_CLAS && sts[1]->last_clas == UNVOICED_CLAS && fabsf( hCPE->hStereoClassif->unclr_wscore ) < 0.005f ) ) ) + { + /* This forces the LRTD to switch to TD when inactive content happens on both channel */ + hStereoTD->prev_fr_LRTD_TD_dec = 0; + } + else if ( hStereoTD->tdm_LRTD_flag == 0 && + ( hCPE->hStereoClassif->vad_flag_glob == 0 || ( hCPE->hStereoClassif->unclr_decision == 0 && ( hCPE->hStereoClassif->xtalk_score <= 0.0f || hCPE->hStereoClassif->xtalk_wscore <= 0.1f ) ) || + ( hCPE->hStereoClassif->unclr_decision == 1 && ( sts[0]->last_clas == UNVOICED_CLAS && sts[1]->last_clas == UNVOICED_CLAS ) && fabsf( hCPE->hStereoClassif->unclr_wscore ) < 0.025f ) + /* (sts[0]->last_clas == UNVOICED_CLAS && sts[1]->last_clas == UNVOICED_CLAS && hCPE->hStereoClassif->xtalk_wscore <= 0.0f)*/ ) ) + { + /* This forces the LRTD to switch to TD when inactive content happens on both channel */ + hStereoTD->prev_fr_LRTD_TD_dec = 0; + } + } + + side_can_change = 0; + + /* update LRTD->DFT stereo hangover counters */ + if ( hStereoTD->prev_fr_LRTD_TD_dec == 1 ) + { + hStereoTD->tdm_last_LRTD_frame_cnt = 0; + } + else + { + hStereoTD->tdm_last_LRTD_frame_cnt++; + hStereoTD->tdm_last_LRTD_frame_cnt = min( hStereoTD->tdm_last_LRTD_frame_cnt, 100 ); + } + + if ( hCPE->last_element_mode != IVAS_CPE_TD ) + { + side_can_change = 1; + } + + if ( hStereoTD->prev_fr_LRTD_TD_dec == 1 && side_can_change == 0 ) + { + if ( ( hStereoTD->tdm_lt_rms_L <= rms_thd && hStereoTD->tdm_lt_rms_R <= 2 * rms_thd ) || + ( hStereoTD->tdm_lt_rms_R <= rms_thd && hStereoTD->tdm_lt_rms_L <= 2 * rms_thd ) || + ( sts[0]->hVAD->hangover_cnt != 0 && sts[1]->hNoiseEst->Etot_last < 12 ) || + ( sts[1]->hVAD->hangover_cnt != 0 && sts[0]->hNoiseEst->Etot_last < 12 ) || + ( sts[0]->hSpMusClas->past_dec[0] != sts[1]->hSpMusClas->past_dec[0] ) ) + { + if ( ( ( rms_L < RMS_THR && rms_R < RMS_THR && fabsf( rms_R - rms_L ) < RMS_THR / 2.0f && fabsf( d_lt_corr_raw ) > 0.3f ) || + ( fabsf( sts[0]->old_corr - sts[1]->old_corr ) < 0.15f && sts[0]->old_corr > 0.7f && sts[0]->old_corr < 0.85f && fabsf( rms_L - rms_R ) < rms_thd && fabsf( d_lt_corr_raw ) > 0.3f ) ) /* Both channels are low energy, clean background switching is allowed */ + ) + { + side_can_change = 1; + } + } + } + else if ( side_can_change == 0 ) /*if( hStereoTD->prev_fr_LRTD_TD_dec == 0 )*/ + { + if ( ( ( sts[0]->old_corr < CORR_THRES && sts[1]->old_corr < CORR_THRES ) || ( hStereoTD->tdm_lt_rms_L <= RMS_MIN2 && hStereoTD->tdm_lt_rms_R <= RMS_MIN2 ) ) && + ( ( ( hStereoTD->tdm_lt_rms_L <= rms_thd && hStereoTD->tdm_lt_rms_R <= 2 * rms_thd ) || ( hStereoTD->tdm_lt_rms_R <= rms_thd && hStereoTD->tdm_lt_rms_L <= 2 * rms_thd ) ) || + ( hCPE->hStereoClassif->lrtd_mode == 1 && ( sts[0]->tdm_LRTD_flag == 0 || ( sts[0]->tdm_LRTD_flag == 1 && ( ( rms_L < 2 * rms_thd && rms_R < 2 * rms_thd ) || ( sts[0]->hSpMusClas->past_dec[0] != sts[1]->hSpMusClas->past_dec[0] ) ) ) ) ) /* Even if the UNCLR is set to 1, the content should be encoded with TD, lower swichting requierment */ + ) ) + { + side_can_change = 1; + } + } + + if ( hCPE->hStereoClassif->xtalk_wscore >= 0.05f && hStereoTD->prev_fr_LRTD_TD_dec == 0 && hCPE->hStereoClassif->lrtd_mode == 1 ) + { + side_can_change = 0; + } + if ( hCPE->last_element_mode == IVAS_CPE_MDCT || hStereoTD->flag_skip_DMX == 1 ) + { + desired_idx = LRTD_STEREO_LEFT_IS_PRIM; + hStereoTD->tdm_prev_desired_idx = LRTD_STEREO_LEFT_IS_PRIM; + ratio_L = 1.0f; + hStereoTD->tdm_prev_stable_idx = LRTD_STEREO_LEFT_IS_PRIM; + hStereoTD->tdm_ratio_transition_mov_flag = 0; + hStereoTD->tdm_last_ratio_idx = LRTD_STEREO_LEFT_IS_PRIM; + hStereoTD->tdm_ratio_transition_cnt = 0; + idx = TDM_NQ; /* Reserved quantizer index for special case */ + } + else if ( side_can_change || sts[1]->ini_frame <= 1 ) + { + ratio_L = max( diff_lt_corr, -RATIO_MAX ); + ratio_L = min( ratio_L, RATIO_MAX ); + ratio_L = 0.667f * ratio_L + 1.0f; + + if ( hCPE->hStereoClassif->lrtd_mode == 1 && ( hCPE->last_element_mode != IVAS_CPE_TD || hStereoTD->tdm_FD2LRTD_SW_cnt < 4 ) ) + { + ratio_L = hCPE->hStereoTD->tdm_last_ratio; /* note: the last_ratio is set in before in stereo_set_tdm() */ + } + else + { + ratio_L = ( 1.0f - cosf( EVS_PI * ratio_L / 2.0f ) ) / 2.0f; + } + + if ( hStereoTD->tdm_LRTD_flag == 1 || ( hCPE->hStereoClassif->lrtd_mode == 1 && ( hCPE->hStereoClassif->prev_lrtd_mode == 0 || abs( hCPE->hStereoTCA->indx_ica_gD - 20 ) > 2 ) ) ) + { + if ( ratio_L >= 0.53f ) /* small hysteresis is used to prevent undesired switching during inactive segment */ + { + desired_idx = LRTD_STEREO_LEFT_IS_PRIM - 1; + } + else if ( ratio_L < 0.47f ) + { + desired_idx = LRTD_STEREO_RIGHT_IS_PRIM + 1; + } + else if ( rms_L - rms_R > 10 ) + { + desired_idx = LRTD_STEREO_LEFT_IS_PRIM - 1; + } + else + { + desired_idx = LRTD_STEREO_RIGHT_IS_PRIM + 1; + } + + if ( desired_idx != hStereoTD->tdm_prev_desired_idx && hStereoTD->tdm_last_LRTD_frame_cnt == 1 && sts[0]->last_coder_type <= UNVOICED ) /* TD transtionning to FD, we don't want an inversion of channels on the first transition frame */ + { + desired_idx = hStereoTD->tdm_prev_desired_idx; + } + else + { + hStereoTD->tdm_prev_desired_idx = desired_idx; + } + idx = desired_idx; + } + else + { + if ( hCPE->element_brate >= IVAS_48k && sts[0]->hVAD->hangover_cnt != 0 && max( hStereoTD->tdm_lt_rms_L, hStereoTD->tdm_lt_rms_R ) < 512.0f ) + { + ratio_L = check_bounds( ratio_L, 0.3f, 0.7f ); + } + + if ( ( hCPE->hStereoTCA->instTargetGain > 1.2f || hCPE->hStereoTCA->targetGain > 1.0f ) && ratio_L < 0.4f ) + { + ratio_L = 0.4f; + } + else if ( ( hCPE->hStereoTCA->instTargetGain < 0.8f || hCPE->hStereoTCA->targetGain < 1.0f ) && ratio_L > 0.6f ) + { + ratio_L = 0.6f; + } + + dist = fabsf( ratio_L - tdm_ratio_tabl[0] ); + + desired_idx = 0; + for ( i = 1; i < TDM_NQ; i++ ) + { + if ( fabsf( ratio_L - tdm_ratio_tabl[i] ) <= dist ) + { + dist = fabsf( ratio_L - tdm_ratio_tabl[i] ); + desired_idx = i; + } + } + + idx = stereo_smooth_LR_transition( &hStereoTD->tdm_prev_stable_idx, &hStereoTD->tdm_ratio_transition_mov_flag, hStereoTD->tdm_last_ratio_idx, &hStereoTD->tdm_prev_desired_idx, &hStereoTD->tdm_ratio_transition_cnt, tdm_SM_flag_loc, desired_idx ); + + /* Change the switching level in case of dual mono (in case the scenario still accept left right switching */ + /* This logic is needed in case the content is exactly the same in the 2 channel and it is expected to get back to LRTD, to prevent the secondary channel to be completely empty */ + if ( hCPE->hStereoClassif->lrtd_mode == 1 ) + { + if ( idx <= LRTD_STEREO_MID_IS_PRIM ) + { + idx = min( idx, LRTD_STEREO_MID_IS_PRIM - 1 ); + } + else + { + idx = max( idx, LRTD_STEREO_MID_IS_PRIM + 1 ); + } + + hStereoTD->tdm_prev_desired_idx = idx; + } + /* 0 and 30 are reserved to signal L-R only coding */ + } + } + else + { + idx = hStereoTD->tdm_last_ratio_idx; + } + + hStereoTD->tdm_inst_ratio_idx = LRTD_STEREO_RIGHT_IS_PRIM; + tdm_LRTD_pri_side = -1; + if ( hStereoTD->tdm_FD2LRTD_SW_cnt < 5 ) + { + desired_idx = 15; + } + else + { + desired_idx = 0; + dist = fabsf( inst_ratio_L - tdm_ratio_tabl[0] ); + + for ( i = 1; i < TDM_NQ; i++ ) + { + if ( fabsf( inst_ratio_L - tdm_ratio_tabl[i] ) <= dist ) + { + dist = fabsf( inst_ratio_L - tdm_ratio_tabl[i] ); + desired_idx = i; + } + } + } + + if ( ( sts[1]->lp_speech - sts[1]->lp_noise ) < 50.0f ) /* likely presence of noisy content */ + { + /* pointing in the right direction, inverse it else do nothing */ + if ( ( idx > LRTD_STEREO_MID_IS_PRIM && desired_idx > LRTD_STEREO_MID_IS_PRIM ) || ( idx < LRTD_STEREO_MID_IS_PRIM && desired_idx < LRTD_STEREO_MID_IS_PRIM ) ) + { + int16_t idx_offet; + idx_offet = 5; + if ( desired_idx > LRTD_STEREO_MID_IS_PRIM ) /* slightly Favor the 2nd channel */ + { + idx_offet *= -1; + } + desired_idx += idx_offet; + desired_idx = check_bounds_s( desired_idx, 0, 30 ); + } + } + + if ( sts[1]->clas != UNVOICED_CLAS || sts[0]->clas != UNVOICED_CLAS ) + { + desired_idx = check_bounds_s( desired_idx, 5, 25 ); + } + + hStereoTD->tdm_inst_ratio_idx = desired_idx; + if ( /*hCPE->last_element_mode == IVAS_CPE_MDCT ||*/ hStereoTD->flag_skip_DMX == 1 ) + { + /*force tdm_inst_ratio_idx to the reserved index */ + hStereoTD->tdm_inst_ratio_idx = idx; + tdm_LRTD_pri_side = 1; /* left channel */ + } + else if ( hStereoTD->tdm_LRTD_flag == 1 ) + { + idx = limit_idx_NoDwnmix( idx, side_can_change, d_lt_corr_raw ); + hStereoTD->tdm_prev_stable_idx = LRTD_STEREO_LEFT_IS_PRIM; + tdm_LRTD_pri_side = 0; /* right channel */ + if ( idx != LRTD_STEREO_RIGHT_IS_PRIM ) + { + tdm_LRTD_pri_side = 1; /* left channel */ + hStereoTD->tdm_prev_stable_idx = LRTD_STEREO_RIGHT_IS_PRIM; + } + } + else + { + idx = limit_idx_Dwnmix( idx, ( hCPE->hStereoClassif->unclr_decision || ( sts[0]->flag_noisy_speech_snr == 1 && hCPE->hStereoClassif->xtalk_wscore > 0.1f ) ), desired_idx, hStereoTD->tdm_last_ratio_idx, hStereoTD->tdm_last_LRTD_PriCh_cnt, hStereoTD->tdm_last_LRTD_frame_cnt ); + } + + if ( abs( hStereoTD->tdm_last_ratio_idx - idx ) > LRTD_STEREO_MID_IS_PRIM ) + { + hStereoTD->tdm_last_LRTD_PriCh_cnt = 0; + } + else + { + hStereoTD->tdm_last_LRTD_PriCh_cnt++; + } + ratio_L = tdm_ratio_tabl[idx]; + + if ( hStereoTD->tdm_SM_modi_flag == 1 && hStereoTD->tdm_LRTD_flag == 0 ) + { + idx = (int16_t) ( ( hStereoTD->tdm_last_ratio_idx + ( LRTD_STEREO_MID_IS_PRIM + 1 ) ) * 0.5 ); + ratio_L = tdm_ratio_tabl[idx]; + } + + if ( ( hStereoTD->tdm_ratio_transition_mov_flag == 1 && hStereoTD->tdm_ratio_transition_cnt >= 31 ) || ( ( hStereoTD->tdm_last_SM_flag == tdm_SM_flag_loc ) && ( idx == hStereoTD->tdm_prev_stable_idx ) ) ) + { + hStereoTD->tdm_ratio_transition_cnt = 0; + hStereoTD->tdm_ratio_transition_mov_flag = 0; + } + + if ( hStereoTD->tdm_ratio_transition_mov_flag == 0 || tdm_SM_flag_loc == 0 ) + { + hStereoTD->tdm_prev_stable_idx = idx; + } + + /* NOOP ratio calculation */ + if ( tdm_SM_flag_loc ) + { + if ( hStereoTD->tdm_SM_reset_flag ) + { + hStereoTD->tdm_lt_corr_RM_SM = 0.01f; + hStereoTD->tdm_lt_corr_LM_SM = 0.01f; + hStereoTD->tdm_last_ratio_SM = hStereoTD->tdm_last_ratio; + hStereoTD->tdm_last_ratio_idx_SM = hStereoTD->tdm_last_ratio_idx; + hStereoTD->tdm_lt_rms_L_SM = 40.0f; + hStereoTD->tdm_lt_rms_R_SM = 40.0f; + hStereoTD->tdm_last_diff_lt_corr_SM = 0; + hStereoTD->tdm_last_ener_lt_R_SM = 0; + hStereoTD->tdm_last_ener_lt_L_SM = 0; + + hStereoTD->tdm_noop_mov_flag = 0; + hStereoTD->tdm_noop_cnt = 0; + hStereoTD->tdm_last_SM_flag_noop = 0; + hStereoTD->tdm_prev_stable_idx_SM = 0; + hStereoTD->tdm_prev_desired_idx_SM = 0; + hStereoTD->tdm_LT_es_em_SM = 0.1f; + hStereoTD->tdm_hyst_cnt_SM = 0; + } + + *tdm_ratio_idx_SM = stereo_tdm_ener_analysis_SM( hCPE, sts, input_frame, &tdm_NOOP_flag ); + } + else + { + *tdm_ratio_idx_SM = LRTD_STEREO_MID_IS_PRIM; + tdm_NOOP_flag = 1; + } + + sts[0]->tdm_LRTD_flag = hStereoTD->tdm_LRTD_flag; + sts[1]->tdm_LRTD_flag = hStereoTD->tdm_LRTD_flag; + + /* set channel combination scheme flag */ + *tdm_SM_or_LRTD_Pri = tdm_SM_flag_loc; + if ( hCPE->hStereoTD->tdm_LRTD_flag == 1 ) + { + *tdm_SM_or_LRTD_Pri = tdm_LRTD_pri_side; + } + + hCPE->hStereoClassif->ratio_L = ratio_L; + + + return ( idx ); +} + +/*-------------------------------------------------------------------* + * Function Get_LR_rms() + * + * Get current frame left and right rms values + *-------------------------------------------------------------------*/ + +static void Get_LR_rms( + const float *Left_in, + const float *Right_in, + const int16_t input_frame, + float *rms_L, + float *rms_R ) +{ + float ener_l, ener_r; + int16_t i; + + ener_l = 0.01f; + ener_r = 0.01f; + + for ( i = 0; i < input_frame; i++ ) + { + ener_l += Left_in[i] * Left_in[i]; + ener_r += Right_in[i] * Right_in[i]; + } + *rms_L = sqrtf( ener_l / input_frame ); + *rms_R = sqrtf( ener_r / input_frame ); + + return; +} + + +/*-------------------------------------------------------------------* + * Function Get_dt_lt_ener() + * + * Compute the gain of L&R channel compared to mono + * - estimate the long term evolution of the L to Mono gain + * - estimate the long term evolution of the R to Mono gain + * - estimate the long term difference between the long term + * - evolution of the L and R to Mono gain + *-------------------------------------------------------------------*/ + +static int16_t Get_dt_lt_ener( + CPE_ENC_HANDLE hCPE, + const int16_t IsSideMono, + const int16_t input_frame, + const int16_t tdm_last_SM_flag, + const float rms_L, + const float rms_R, + float *tdm_lt_rms_L, + float *tdm_lt_rms_R, + float *tdm_last_ener_lt_L, + float *tdm_last_ener_lt_R, + float *tdm_LT_es_em, + int16_t *tdm_hyst_cnt, + int16_t *tdm_NOOP_SM_flag_loc, + float *ener_R_dt, + float *ener_L_dt, + float *corr_LM, + float *corr_RM ) +{ + Encoder_State **sts; + const float *Left_in, *Right_in; + float es_em; + int16_t tmp_SM_flag, tdm_SM_flag_loc; + + sts = hCPE->hCoreCoder; + Left_in = sts[0]->input; /* Left channel */ + Right_in = sts[1]->input; /* Right channel */ + + tdm_SM_flag_loc = tdm_last_SM_flag; + + if ( hCPE->last_element_mode != IVAS_CPE_TD && IsSideMono == 0 ) /* last coding mode not TD and normal mono/side case, quick update of lt energy */ + { + *tdm_lt_rms_L = .9f * rms_L; + *tdm_lt_rms_R = .9f * rms_R; + sts[1]->hNoiseEst->Etot_last = 0.9f * ( sts[0]->hNoiseEst->Etot_last ); + sts[1]->hVAD->hangover_cnt = 0; + } + else + { + *tdm_lt_rms_L = 0.6f * *tdm_lt_rms_L + 0.4f * rms_L; + *tdm_lt_rms_R = 0.6f * *tdm_lt_rms_R + 0.4f * rms_R; + } + + /*----------------------------------------------------------------* + * Compute the 1st order energy difference difference + *----------------------------------------------------------------*/ + + *ener_R_dt = *tdm_lt_rms_R - *tdm_last_ener_lt_R; + *tdm_last_ener_lt_R = *tdm_lt_rms_R; + + *ener_L_dt = *tdm_lt_rms_L - *tdm_last_ener_lt_L; + *tdm_last_ener_lt_L = *tdm_lt_rms_L; + + /*----------------------------------------------------------------* + * Compute the gain of L&R channel compared to mono + * - estimate the long term evolution of the L to Mono gain + * - estimate the long term evolution of the R to Mono gain + * - estimate the long term difference between the long term + * - evolution of the L and R to Mono gain + *----------------------------------------------------------------*/ + + Get_corr_n( Left_in, Right_in, corr_LM, corr_RM, input_frame, &es_em, IsSideMono ); + + hCPE->hStereoClassif->xtalk_fv[E_diff_corrLM_corrRM] = *corr_LM - *corr_RM; + + if ( sts[0]->hVAD->hangover_cnt != 0 ) + { + *tdm_LT_es_em = 0.9f * *tdm_LT_es_em; + } + else + { + *tdm_LT_es_em = 0.9f * *tdm_LT_es_em + 0.1f * es_em; + } + + hCPE->hStereoClassif->xtalk_fv[E_tdm_LT_es_em] = *tdm_LT_es_em; + + tmp_SM_flag = 0; + if ( min( sts[0]->old_corr, sts[1]->old_corr ) < 0.85f && max( sts[0]->old_corr, sts[1]->old_corr < 0.92f ) && + ( *tdm_LT_es_em > 2.0f || es_em > 2.5f ) && ( sts[0]->hVAD->hangover_cnt <= 1 && sts[1]->hVAD->hangover_cnt <= 3 && sts[0]->tdm_LRTD_flag == 0 ) ) + { + tmp_SM_flag = 1; + } + if ( IsSideMono == 0 ) + { + *tdm_NOOP_SM_flag_loc = tdm_SM_flag_loc; + } + + if ( tmp_SM_flag != tdm_SM_flag_loc ) + { + if ( ( *tdm_hyst_cnt )++ >= 2 && tmp_SM_flag == 1 && ( sts[0]->tdm_pc > PC_LIMIT || sts[1]->tdm_pc > PC_LIMIT ) ) + { + *tdm_NOOP_SM_flag_loc = tmp_SM_flag; + *tdm_hyst_cnt = 0; + } + else if ( ( *tdm_hyst_cnt )++ >= 20 && tmp_SM_flag == 0 && + ( sts[0]->tdm_pc > PC_LIMIT || sts[1]->tdm_pc > PC_LIMIT ) && ( *tdm_LT_es_em <= 0.5f || es_em < -10.0f ) ) + { + *tdm_NOOP_SM_flag_loc = tmp_SM_flag; + *tdm_hyst_cnt = 0; + } + } + else + { + *tdm_hyst_cnt = 0; + } + + return tmp_SM_flag; +} + + +/*-------------------------------------------------------------------* + * Function NOOP_decision() + * + * Set Near Out Of Phase decision + *-------------------------------------------------------------------*/ + +static void NOOP_decision( + CPE_ENC_HANDLE hCPE, + const int16_t tdm_NOOP_flag_loc, + const int16_t tmp_SM_flag, + const float rms_L, + const float rms_R, + int16_t *tdm_SM_flag_loc ) +{ + int16_t tdm_NOOP_switch_flag; + STEREO_TD_ENC_DATA_HANDLE hStereoTD; + Encoder_State **sts; + + hStereoTD = hCPE->hStereoTD; + sts = hCPE->hCoreCoder; + + tdm_NOOP_switch_flag = 0; + hStereoTD->tdm_NOOP_cnt++; + if ( hCPE->hCoreCoder[0]->sp_aud_decision0 == 0 ) + { + if ( ( ( hStereoTD->tdm_SM_last2_clas[0] > VOICED_TRANSITION && ( hStereoTD->tdm_SM_last_clas[0] == UNVOICED_CLAS || hStereoTD->tdm_SM_last_clas[0] == VOICED_TRANSITION ) ) || + ( hStereoTD->tdm_SM_last2_clas[1] > VOICED_TRANSITION && ( hStereoTD->tdm_SM_last_clas[1] == UNVOICED_CLAS || hStereoTD->tdm_SM_last_clas[1] == VOICED_TRANSITION ) ) ) && + ( !( sts[0]->last_coder_type_raw == VOICED || sts[1]->last_coder_type_raw == VOICED ) && hStereoTD->tdm_NOOP_cnt > 5 ) ) + { + tdm_NOOP_switch_flag = 1; + hStereoTD->tdm_NOOP_cnt = 0; + } + else if ( ( hStereoTD->tdm_SM_last_clas[0] == UNVOICED_CLAS || hStereoTD->tdm_SM_last_clas[1] == UNVOICED_CLAS ) && + ( !( sts[0]->last_coder_type_raw == VOICED || sts[1]->last_coder_type_raw == VOICED ) ) && ( rms_L < 400.0f && rms_R < 400.0f ) && ( hStereoTD->tdm_NOOP_cnt > 5 ) ) + { + tdm_NOOP_switch_flag = 1; + hStereoTD->tdm_NOOP_cnt = 0; + } + } + else + { + if ( sts[0]->ee_old < 5000.f && sts[1]->ee_old < 5000.f ) + { + tdm_NOOP_switch_flag = 1; + } + } + + if ( *tdm_SM_flag_loc != tdm_NOOP_flag_loc ) + { + hStereoTD->tdm_SM_flag = 1; + if ( hCPE->hCoreCoder[0]->sp_aud_decision0 == 0 ) + { + if ( tdm_NOOP_switch_flag == 1 ) + { + *tdm_SM_flag_loc = tdm_NOOP_flag_loc; + if ( *tdm_SM_flag_loc ) + { + hStereoTD->tdm_SM_reset_flag = 1; + } + hStereoTD->tdm_SM_flag = 0; + } + } + else + { + if ( tdm_NOOP_switch_flag == 1 ) + { + *tdm_SM_flag_loc = tdm_NOOP_flag_loc; + if ( *tdm_SM_flag_loc ) + { + hStereoTD->tdm_SM_reset_flag = 1; + } + hStereoTD->tdm_SM_flag = 0; + } + } + + if ( tdm_NOOP_flag_loc == 1 ) + { + hStereoTD->tdm_hyst_cnt = 2; + } + else + { + hStereoTD->tdm_hyst_cnt = 20; + } + } + + if ( hStereoTD->tdm_SM_flag > 0 && tdm_NOOP_switch_flag == 1 && *tdm_SM_flag_loc != tmp_SM_flag ) + { + *tdm_SM_flag_loc = !( *tdm_SM_flag_loc ); + hStereoTD->tdm_SM_flag = 0; + if ( *tdm_SM_flag_loc ) + { + hStereoTD->tdm_SM_reset_flag = 1; + } + } + + if ( hStereoTD->tdm_SM_modi_flag == 1 ) + { + *tdm_SM_flag_loc = 1; + hStereoTD->tdm_SM_modi_flag = 0; + hStereoTD->tdm_SM_reset_flag = 1; + } + else + { + if ( *tdm_SM_flag_loc == 1 && hStereoTD->tdm_SM_reset_flag == 1 && hStereoTD->tdm_last_ratio < 0.5 ) + { + hStereoTD->tdm_SM_reset_flag = 0; + *tdm_SM_flag_loc = 0; + hStereoTD->tdm_SM_modi_flag = 1; + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * Function Comp_diff_lt_corr() + * + * Adjust stereo downmixing adaptation rate factor + * in function of the signal energy. + *-------------------------------------------------------------------*/ + +static float Comp_diff_lt_corr( + CPE_ENC_HANDLE hCPE, + const int16_t IsSideMono, + const float rms_L, + const float rms_R, + const float ener_L_dt, + const float ener_R_dt, + float corr_LM, + float corr_RM, + const float tdm_lt_rms_L, + const float tdm_lt_rms_R, + float *tdm_lt_corr_LM, + float *tdm_lt_corr_RM, + float *tdm_last_diff_lt_corr, + float *inst_ratio_L_out, + float *diff_lt_corr ) +{ + float adaprate, adaprate_tmp, madaprate, d_lt_corr_raw, diff_lt_corr_tmp; + float d_lt_corr, inst_ratio_L, diff_lt_corr_LM_tmp, diff_lt_corr_RM_tmp; + Encoder_State **sts; + + sts = hCPE->hCoreCoder; + + /*----------------------------------------------------------------* + * Adjust stereo downmixing adaptation rate factor + * in function of the signal energy. If signal energy is low, + * adaptation rate factor is lower. This prevent stereo image + * move on speech offset + *----------------------------------------------------------------*/ + + if ( IsSideMono == 0 && hCPE->hStereoClassif->lrtd_mode == 1 && ( ( tdm_lt_rms_R > 2.0f * tdm_lt_rms_L ) || ( tdm_lt_rms_L > 2.0f * tdm_lt_rms_R ) ) ) + { + adaprate = M_ADAP * max( tdm_lt_rms_R, tdm_lt_rms_L ) + B_ADAP; + } + else + { + adaprate = M_ADAP * min( tdm_lt_rms_R, tdm_lt_rms_L ) + B_ADAP; + } + + adaprate = check_bounds( adaprate, MIN_ADAP_FAC, 1.0f ); + + /*----------------------------------------------------------------* + * In case of unvoiced content (expect when it is part of an onset), + * the adaptation rate is minimal. + *----------------------------------------------------------------*/ + + if ( sts[0]->ini_frame > 2 && + ( ( sts[0]->last_clas <= VOICED_TRANSITION && sts[0]->hVAD->hangover_cnt == 0 ) || + ( sts[1]->last_clas <= VOICED_TRANSITION && sts[1]->hVAD->hangover_cnt == 0 ) ) ) + { + adaprate = min( adaprate, LIMIT_ADAP_FAC ); + } + + d_lt_corr_raw = 0.0f; + if ( IsSideMono == 0 ) + { + if ( hCPE->last_element_mode != IVAS_CPE_TD || ( ( tdm_lt_rms_R < 1.0f || tdm_lt_rms_L < 1.0f ) && hCPE->hStereoClassif->lrtd_mode == 1 && max( tdm_lt_rms_R, tdm_lt_rms_L ) < 10.0f ) ) + { + adaprate = 0.98f; /* speed up the adaptation of the long term values to the current values after coming from DFT */ + } + adaprate_tmp = max( adaprate, 0.8f ); + madaprate = 1.0f - adaprate_tmp; /* madaprate has temporary value, will updated few lines below */ + + d_lt_corr_raw = ( adaprate_tmp * corr_LM + madaprate * *tdm_lt_corr_LM ) - + ( adaprate_tmp * corr_RM + madaprate * *tdm_lt_corr_RM ); /* Short term smooth correlation differences to mono */ + inst_ratio_L = 0.0f; + /*inst_ratio_L = max(diff_lt_corr,-RATIO_MAX);*/ + inst_ratio_L = max( d_lt_corr_raw, -RATIO_MAX ); + inst_ratio_L = min( inst_ratio_L, RATIO_MAX ); + inst_ratio_L = 0.667f * inst_ratio_L + 1.0f; + *inst_ratio_L_out = ( 1.0f - cosf( EVS_PI * inst_ratio_L / 2.0f ) ) / 2.0f; + } + madaprate = 1.0f - adaprate; + corr_RM = adaprate * corr_RM + madaprate * *tdm_lt_corr_RM; + corr_LM = adaprate * corr_LM + madaprate * *tdm_lt_corr_LM; + diff_lt_corr_LM_tmp = ( ALP_REF * *tdm_lt_corr_LM + BET_REF * corr_LM ); + diff_lt_corr_RM_tmp = ( ALP_REF * *tdm_lt_corr_RM + BET_REF * corr_RM ); + diff_lt_corr_tmp = diff_lt_corr_LM_tmp - diff_lt_corr_RM_tmp; + + d_lt_corr = diff_lt_corr_tmp - *tdm_last_diff_lt_corr; + *tdm_last_diff_lt_corr = diff_lt_corr_tmp; + + /*----------------------------------------------------------------* + * Correct the estimation depending of channels energies evolution + *----------------------------------------------------------------*/ + + if ( IsSideMono == 1 && ( ( rms_L < RMS_MIN2 && rms_R < RMS_MIN2 ) && ( ( tdm_lt_rms_L < 0.8f * rms_L ) && ( tdm_lt_rms_R < 0.8f * rms_R ) ) && + ( ( tdm_lt_rms_L > 2.0f * tdm_lt_rms_R ) || ( tdm_lt_rms_L < 0.5f * tdm_lt_rms_R ) ) ) ) + { + *tdm_lt_corr_LM = ALP2 * *tdm_lt_corr_LM + BET2 * corr_LM; + *tdm_lt_corr_RM = ALP2 * *tdm_lt_corr_RM + BET2 * corr_RM; + + *tdm_lt_corr_LM *= 2.5f; + *tdm_lt_corr_RM *= 2.5f; + } + else if ( ( !( ( ener_R_dt > DT_ENER_THR && ener_L_dt < DT_ENER_THR ) || ( ener_R_dt < DT_ENER_THR && ener_L_dt > DT_ENER_THR ) ) /* Energy are going in the same direction */ + && ( fabsf( d_lt_corr ) < 0.31f /* small difference regarding the difference gain evolution */ + || tdm_lt_rms_L > 2 * RMS_MIN2 || tdm_lt_rms_R > 2 * RMS_MIN2 ) ) /* Energy of at least one of the channel is not low */ + ) + { + /* Use estimated results */ + *tdm_lt_corr_LM = diff_lt_corr_LM_tmp; + *tdm_lt_corr_RM = diff_lt_corr_RM_tmp; + } + else + { + *tdm_lt_corr_LM = ALP1 * *tdm_lt_corr_LM + BET1 * corr_LM; + *tdm_lt_corr_RM = ALP1 * *tdm_lt_corr_RM + BET1 * corr_RM; + } + + *diff_lt_corr = *tdm_lt_corr_LM - *tdm_lt_corr_RM; /* update the difference */ + + return d_lt_corr_raw; +} + + +/*-------------------------------------------------------------------* + * Function limit_idx_Dnwmix() + * + * + *-------------------------------------------------------------------*/ + +static int16_t limit_idx_Dwnmix( + const int16_t idx_in, + const int16_t unclr_decision, + const int16_t inst_idx, + const int16_t previous_idx, + const int16_t tdm_last_LRTD_PriCh_cnt, + const int16_t tdm_last_LRTD_frame_cnt ) +{ + int16_t idx; + + idx = idx_in; + idx = check_bounds_s( idx, 1, 29 ); + + if ( unclr_decision == 1 && tdm_last_LRTD_frame_cnt > 1 ) + { + if ( tdm_last_LRTD_PriCh_cnt > 0 ) + { + if ( idx <= LRTD_STEREO_MID_IS_PRIM && ( inst_idx < LRTD_STEREO_MID_IS_PRIM + 2 ) ) + { + idx = min( 1, idx ); + } + else if ( idx >= LRTD_STEREO_MID_IS_PRIM && ( inst_idx > LRTD_STEREO_MID_IS_PRIM - 2 ) ) + { + idx = max( 29, idx ); + } + else if ( inst_idx < LRTD_STEREO_MID_IS_PRIM - 4 ) + { + idx = min( 1, idx ); + } + else if ( inst_idx > LRTD_STEREO_MID_IS_PRIM + 4 ) + { + idx = max( 29, idx ); + } + else + { + idx = previous_idx; + } + } + else + { + idx = previous_idx; + } + } + + return idx; +} + + +/*-------------------------------------------------------------------* + * Function limit_idx_NoDwnmix() + * + *-------------------------------------------------------------------*/ + +static int16_t limit_idx_NoDwnmix( + const int16_t idx_in, /* i : Index */ + const int16_t side_can_change, /* i : Primary and secondary channel allowed to change ? */ + const float d_lt_corr_raw /* i : Raw corrrelation differences */ +) +{ + int16_t idx; + + idx = idx_in; + if ( side_can_change == 0 && idx_in > 10 && idx_in < 20 ) + { + idx = 30; + if ( d_lt_corr_raw < -0.1f ) + { + idx = 0; + } + } + else + { + if ( idx <= 15 ) + { + idx = 0; + } + else + { + idx = 30; + } + } + + return idx; +} + + +/*-------------------------------------------------------------------* + * Function stereo_tdm_ener_analysis_SM() + * + * + *-------------------------------------------------------------------*/ + +static int16_t stereo_tdm_ener_analysis_SM( + CPE_ENC_HANDLE hCPE, /* i : CPE encoder structure */ + Encoder_State **sts, /* i/o: Encoder static variables structure */ + const int16_t input_frame, /* i : Number of samples */ + int16_t *tdm_SM_flag /* i/o: channel combination scheme flag */ +) +{ + float rms_R, rms_L; + float corr_RM, corr_LM, diff_lt_corr, ratio_L, dist; + int16_t i, side_can_change; + int16_t idx, tdm_SM_flag_loc; + float es_em = 0.01f; + float ener_R_dt, ener_L_dt; + int16_t desired_idx = 0; + STEREO_TD_ENC_DATA_HANDLE hStereoTD; + + hStereoTD = hCPE->hStereoTD; + + /*----------------------------------------------------------------* + * set SM flag + *----------------------------------------------------------------*/ + + /* Simple logic to set SM flag, should be done in the frequency domain for low SM correlation signal, especially for music item such as Music_1_org_s */ + tdm_SM_flag_loc = hStereoTD->tdm_last_SM_flag_noop; + + /*----------------------------------------------------------------* + * Compute L and R energy and Long term RMS of each channel + *----------------------------------------------------------------*/ + + Get_LR_rms( sts[0]->input, sts[1]->input, input_frame, &rms_L, &rms_R ); + + /*----------------------------------------------------------------* + * Compute the 1st order energy difference difference + * Compute the gain of L&R channel compared to mono + * - estimate the long term evolution of the L to Mono gain + * - estimate the long term evolution of the R to Mono gain + * - estimate the long term difference between the long term + * - evolution of the L and R to Mono gain + *----------------------------------------------------------------*/ + + Get_dt_lt_ener( hCPE, 1, input_frame, hStereoTD->tdm_last_SM_flag_noop, rms_L, rms_R, + &hStereoTD->tdm_lt_rms_L_SM, &hStereoTD->tdm_lt_rms_R_SM, &hStereoTD->tdm_last_ener_lt_L_SM, &hStereoTD->tdm_last_ener_lt_R_SM, &hStereoTD->tdm_LT_es_em_SM, &hStereoTD->tdm_hyst_cnt_SM, &tdm_SM_flag_loc, + &ener_R_dt, &ener_L_dt, &corr_LM, &corr_RM ); + + hStereoTD->tdm_SM_reset_flag = 0; + + /*----------------------------------------------------------------* + * Adjust stereo downmixing adaptation rate factor + * in function of the signal energy. If signal energy is low, + * adaptation rate factor is lower. This prevent stereo image + * move on speech offset + *----------------------------------------------------------------*/ + + Comp_diff_lt_corr( hCPE, 1, rms_L, rms_R, ener_L_dt, ener_R_dt, corr_LM, corr_RM, hStereoTD->tdm_lt_rms_L_SM, hStereoTD->tdm_lt_rms_R_SM, &hStereoTD->tdm_lt_corr_LM_SM, + &hStereoTD->tdm_lt_corr_RM_SM, &( hStereoTD->tdm_last_diff_lt_corr_SM ), NULL, &diff_lt_corr ); + + side_can_change = 0; + + /*----------------------------------------------------------------* + * When the energies of channels are low enough, compute the ratio + * of L and R needed to create new mono/side signals + *----------------------------------------------------------------*/ + + if ( ( hStereoTD->tdm_lt_rms_L_SM <= RMS_MIN && hStereoTD->tdm_lt_rms_R_SM <= 2 * RMS_MIN ) || ( hStereoTD->tdm_lt_rms_R_SM <= RMS_MIN && hStereoTD->tdm_lt_rms_L_SM <= 2 * RMS_MIN ) ) + { + if ( ( sts[0]->old_corr < CORR_THRES && sts[1]->old_corr < CORR_THRES ) || ( hStereoTD->tdm_lt_rms_L_SM <= RMS_MIN2 && hStereoTD->tdm_lt_rms_R_SM <= RMS_MIN2 ) ) + { + side_can_change = 1; + } + } + + if ( ( hStereoTD->tdm_lt_rms_L_SM <= RMS_MIN2 && hStereoTD->tdm_lt_rms_R_SM <= 2 * RMS_MIN2 ) || ( hStereoTD->tdm_lt_rms_R_SM <= RMS_MIN2 && hStereoTD->tdm_lt_rms_L_SM <= 2 * RMS_MIN2 ) ) + { + if ( ( ( hStereoTD->tdm_last_SM_flag_noop != tdm_SM_flag_loc ) && hStereoTD->tdm_noop_cnt == 0 ) || + hStereoTD->tdm_noop_mov_flag == 1 || hStereoTD->tdm_prev_desired_idx_SM != hStereoTD->tdm_prev_stable_idx_SM ) + { + hStereoTD->tdm_noop_mov_flag = 1; + if ( hStereoTD->tdm_last_ratio_idx_SM != 0 && hStereoTD->tdm_last_ratio_idx_SM != ( TDM_NQ - 1 ) ) + { + side_can_change = 1; + } + } + } + + if ( side_can_change == 0 && tdm_SM_flag_loc == 1 && es_em > 15.0f ) + { + side_can_change = 1; + } + + if ( side_can_change ) + { + ratio_L = max( diff_lt_corr, -RATIO_MAX ); + ratio_L = min( ratio_L, RATIO_MAX ); + + if ( ratio_L > 0.5f * RATIO_MAX ) + { + ratio_L = 1.08f * ratio_L + 0.38f; + } + else if ( ratio_L < -0.5f * RATIO_MAX ) + { + ratio_L = 0.64f * ratio_L + 1.28f; + } + else + { + ratio_L = 0.26f * ratio_L + 0.995f; + } + + ratio_L = ( 1.0f - cosf( EVS_PI * ratio_L / 2.0f ) ) / 2.0f; + + dist = fabsf( ratio_L - tdm_ratio_tabl[0] ); + + desired_idx = 0; + for ( i = 1; i < TDM_NQ; i++ ) + { + if ( fabsf( ratio_L - tdm_ratio_tabl[i] ) <= dist ) + { + dist = fabsf( ratio_L - tdm_ratio_tabl[i] ); + desired_idx = i; + } + } + + idx = stereo_smooth_LR_transition( &hStereoTD->tdm_prev_stable_idx_SM, &hStereoTD->tdm_noop_mov_flag, hStereoTD->tdm_last_ratio_idx_SM, &hStereoTD->tdm_prev_desired_idx_SM, &hStereoTD->tdm_noop_cnt, tdm_SM_flag_loc, desired_idx ); + + idx = (int16_t) ( idx * 0.8f + hStereoTD->tdm_last_ratio_idx_SM * 0.2f ); + + ratio_L = tdm_ratio_tabl[idx]; + } + else + { + ratio_L = hStereoTD->tdm_last_ratio_SM; + idx = hStereoTD->tdm_last_ratio_idx_SM; + } + + if ( ( hStereoTD->tdm_noop_mov_flag == 1 && hStereoTD->tdm_noop_cnt >= 31 ) || ( ( hStereoTD->tdm_last_SM_flag_noop == tdm_SM_flag_loc ) && ( idx == hStereoTD->tdm_prev_stable_idx_SM ) ) ) + { + hStereoTD->tdm_noop_cnt = 0; + hStereoTD->tdm_noop_mov_flag = 0; + } + + if ( hStereoTD->tdm_noop_mov_flag == 0 || tdm_SM_flag_loc == 0 ) + { + hStereoTD->tdm_prev_stable_idx_SM = idx; + } + + hStereoTD->tdm_last_SM_flag_noop = tdm_SM_flag_loc; + *tdm_SM_flag = tdm_SM_flag_loc; + + return ( idx ); +} + + +/*-------------------------------------------------------------------* + * tdm_lp_comparison() + * + * Perform the comparison of the 2 sets of LP coefficients + *-------------------------------------------------------------------*/ + +/*! r: replication decision; 1 = Use old LP */ +int16_t tdm_lp_comparison( + STEREO_TD_ENC_DATA_HANDLE hStereoTD, /* i/o: TD stereo encoder handle */ + STEREO_CLASSIF_HANDLE hStereoClassif, /* i/o: stereo classifier structure */ + Encoder_State *st, /* i/o: Encoder structure */ + const float *speech, /* i : Current speech frame */ + const float *A_PCh, /* i : primary channel LP coefficients */ + const float *A_SCh, /* i : secondary channel LP coeff. */ + const int16_t m, /* i : filter length */ + const float *isp_PCh, /* i : primary channel LSPs */ + const float *isp_SCh, /* i : secondary channel LSPs */ + const int16_t L_frame, /* i : frame length */ + const int32_t element_brate_wo_meta /* i : element bitrate without metadata*/ +) +{ + float predgain_SCh, pred_gain_reuse_PCh, ener_sig; + float res[L_FRAME16k]; + int16_t LP_mode; + float dist, ftmp; + int16_t i; + + /* Find prediction gain for current LP filter */ + residu( A_SCh, m, speech, res, L_frame ); + ener_sig = log10f( sum2_f( speech, L_frame ) + 0.01f ); + predgain_SCh = 10.0f * ( ener_sig - log10f( sum2_f( res, L_frame ) + 0.01f ) ); + + /* Find prediction gain when resuing the Primary Channel LP filter */ + residu( A_PCh, m, speech, res, L_frame ); + pred_gain_reuse_PCh = 10.0f * ( ener_sig - log10f( sum2_f( res, L_frame ) + 0.01f ) ); + + /* Find Euclidian distance between the 2 filters */ + dist = 0; + for ( i = 0; i < m; i++ ) + { + ftmp = isp_SCh[i] - isp_PCh[i]; + dist += ftmp * ftmp; + } + ener_sig *= 10.0f; + + /* Verification of the filters similartiies and prediction gain obtained for each channel */ + /* Threshold are more relax if alpha is close to 0.5 (Valid if ICA is used ) */ + if ( ( ( pred_gain_reuse_PCh >= RATIO_PG * predgain_SCh && dist < EUCLDST ) /* Prediction gain are close & Euclidian dist is small */ + || ( predgain_SCh < PG2ND && dist < EUCLDST2 ) ) /* Prediction gain if the secondary channel is low & Euclidian dist is not too large */ + || ( hStereoTD->tdm_last_ratio_idx >= ( LRTD_STEREO_MID_IS_PRIM - 2 ) && hStereoTD->tdm_last_ratio_idx <= ( LRTD_STEREO_MID_IS_PRIM + 2 ) && /* ratio between 0.4 and 0.6 */ + ( ( pred_gain_reuse_PCh >= RATIO_PG2 * predgain_SCh && dist < EUCLDST2 ) || predgain_SCh < PG2ND2 ) ) /* Prediction gain are not far & Euclidian dist is not too large or Prediction gain if the secondary channel is low */ + || ener_sig <= 30.0f /* secondary channel has low energy */ + ) + { + LP_mode = 1; + + if ( ( element_brate_wo_meta >= IVAS_48k && !( pred_gain_reuse_PCh >= RATIO_PG_HR * predgain_SCh && dist < EUCLDST ) ) || + ( hStereoClassif->lrtd_mode == 1 && element_brate_wo_meta < IVAS_16k4 && !( pred_gain_reuse_PCh >= RATIO_PG_HR * predgain_SCh && dist < EUCLDST / 2.0f ) ) || + ( hStereoClassif->lrtd_mode == 1 && element_brate_wo_meta >= IVAS_16k4 && !( pred_gain_reuse_PCh >= RATIO_PG_LRTD * predgain_SCh && dist < EUCLDST / 4.0f ) ) || st->tc_cnt > 0 ) + { + LP_mode = 0; + } + } + else + { + /* Prediction or and filters are too different -> quantize the difference*/ + LP_mode = 0; + } + + return LP_mode; +} + + +/*-------------------------------------------------------------------* + * tdm_ol_pitch_comparison() + * + * Perform the comparison of the 2 sets of OL pitch + *-------------------------------------------------------------------*/ + +/*! r: replication decision; 1 = Use old LP */ +void tdm_ol_pitch_comparison( + CPE_ENC_HANDLE hCPE, /* i : CPE encoder structure */ + float pitch_fr[CPE_CHANNELS][NB_SUBFR], /* i/o: fractional pitch values */ + float voicing_fr[CPE_CHANNELS][NB_SUBFR] /* i/o: fractional pitch gains */ +) +{ + int16_t tmp_diff; + int16_t diff_thr = 6; + Encoder_State *st0, *st1; + + st0 = hCPE->hCoreCoder[0]; /* Encoder structure - primary channel */ + st1 = hCPE->hCoreCoder[1]; /* Encoder structure - secondary channel */ + + if ( hCPE->element_brate > IVAS_13k2 ) + { + diff_thr = 3; + } + + if ( hCPE->element_brate >= IVAS_48k || hCPE->hStereoTD->tdm_LRTD_flag == 1 ) + { + diff_thr = 1; + } + + hCPE->hStereoTD->tdm_Pitch_reuse_flag = 0; + + if ( ( ( st0->sp_aud_decision1 == 0 && st0->sp_aud_decision2 == 0 ) && /* Pitch is not recycled in case of music coding*/ + ( hCPE->element_brate <= IVAS_16k4 || ( hCPE->element_brate <= IVAS_24k4 && st0->coder_type == VOICED && st1->coder_type == VOICED ) ) ) || + hCPE->element_brate < IVAS_13k2 ) + { + if ( hCPE->hStereoClassif->lrtd_mode == 1 ) + { + float voicmin[4]; + + minimum( st0->voicing, 3, voicmin ); + minimum( st1->voicing, 3, voicmin + 1 ); + minimum( voicing_fr[0], 4, voicmin + 2 ); + minimum( voicing_fr[1], 4, voicmin + 3 ); + + tmp_diff = 10; + if ( voicmin[0] >= .9f && voicmin[1] >= .9f && voicmin[2] >= .85f && voicmin[3] >= .85f ) + { + tmp_diff = (int16_t) ( abs( ( st0->pitch[0] - st1->pitch[0] ) ) + abs( ( st0->pitch[1] - st1->pitch[1] ) ) + abs( ( st0->pitch[2] - st1->pitch[2] ) ) ); + } + } + else + { + tmp_diff = (int16_t) abs( ( st0->pitch[0] + st0->pitch[1] + st0->pitch[2] ) - ( st1->pitch[0] + st1->pitch[1] + st1->pitch[2] ) ); + } + + if ( tmp_diff <= diff_thr ) + { + hCPE->hStereoTD->tdm_Pitch_reuse_flag = 1; + + /* 1/4 pitch precision update*/ + mvs2s( st0->pitch, st1->pitch, 3 ); + mvr2r( st0->voicing, st1->voicing, 3 ); + + /* Update some parameters accordingly */ + st1->old_corr = st0->old_corr; + st1->old_thres = st0->old_thres; + st1->delta_pit = st0->delta_pit; + + /* Updates for adaptive lag window memory */ + st1->old_pitch_la = st0->old_pitch_la; + /* 1/4 pitch precision update*/ + mvr2r( pitch_fr[0], pitch_fr[1], NB_SUBFR ); + mvr2r( voicing_fr[0], voicing_fr[1], NB_SUBFR ); + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * Function Get_corr_n() + * + * + *-------------------------------------------------------------------*/ + +static void Get_corr_n( + const float L[], /* i : Left signal */ + const float R[], /* i : Right signal */ + float *ic_Lm, /* o : Right signal */ + float *ic_Rm, /* o : Right signal */ + const int16_t len, /* i : segment length */ + float *es_em, /* o : return the difference between the side and mono energy */ + const int16_t tdm_SM_calc_flag /* i : Flag that indicates that it is for SM mode */ +) +{ + float corrL, corrR, ener, mono_i; + int16_t i; + float ener_side, side_i; + + corrL = 0; + corrR = 0; + ener = 1e-6f; + ener_side = 1e-6f; + + /*----------------------------------------------------------------* + * Find the normalized correlation between: left/mono and right/mono based + *----------------------------------------------------------------*/ + + if ( tdm_SM_calc_flag ) + { + for ( i = 0; i < len; i++ ) + { + mono_i = ( L[i] - R[i] ) / 2.0f; + corrL += fabsf( L[i] ) * fabsf( mono_i ); + corrR += fabsf( R[i] ) * fabsf( mono_i ); + ener += mono_i * mono_i; + side_i = ( L[i] + R[i] ) / 2.0f; + ener_side += side_i * side_i; + } + } + else + { + for ( i = 0; i < len; i++ ) + { + mono_i = ( L[i] + R[i] ) / 2.0f; + corrL += L[i] * mono_i; + corrR += R[i] * mono_i; + ener += mono_i * mono_i; + side_i = ( L[i] - R[i] ) / 2.0f; + ener_side += side_i * side_i; + } + } + + *ic_Lm = corrL / ener; + *ic_Rm = corrR / ener; + + *es_em = 10 * ( log10f( sqrtf( ener_side / len ) ) - log10f( sqrtf( ener / len ) ) ); + + return; +} + + +/*-------------------------------------------------------------------* + * Function stereo_smooth_LR_transition() + * + *-------------------------------------------------------------------*/ + +/*! r: smoothed position */ +static int16_t stereo_smooth_LR_transition( + int16_t *tdm_prev_stable_idx, /* i/o: Previous Transmitted ratio index */ + int16_t *tdm_ratio_transition_mov_flag, /* i/o: Flag that indicates that L-R energy is changing */ + int16_t tdm_last_ratio_idx, /* i : last TDM ratio index */ + int16_t *tdm_prev_desired_idx, /* i/o: Previous Transmitted ratio index */ + int16_t *tdm_ratio_transition_cnt, /* i/o: Counter */ + const int16_t tdm_SM_flag, /* i : channel combination scheme flag for current frame */ + int16_t desired_idx /* i : desired final position */ +) +{ + int16_t idx; + + if ( tdm_SM_flag == 1 ) + { + desired_idx = 15; + } + + if ( desired_idx != *tdm_prev_stable_idx ) + { + *tdm_ratio_transition_mov_flag = 1; + } + + if ( *tdm_ratio_transition_mov_flag == 1 ) + { + if ( desired_idx != *tdm_prev_desired_idx ) + { + *tdm_prev_stable_idx = tdm_last_ratio_idx; + *tdm_ratio_transition_cnt = 0; + } + + *tdm_ratio_transition_cnt += 4; + if ( desired_idx < *tdm_prev_stable_idx - 2 ) + { + idx = *tdm_prev_stable_idx - *tdm_ratio_transition_cnt; + idx = max( desired_idx, idx ); + } + else if ( desired_idx > *tdm_prev_stable_idx + 2 ) + { + idx = *tdm_prev_stable_idx + *tdm_ratio_transition_cnt; + idx = min( desired_idx, idx ); + } + else + { + idx = desired_idx; + } + } + else + { + idx = desired_idx; + } + + *tdm_prev_desired_idx = desired_idx; + + return idx; +} diff --git a/lib_enc/ivas_stereo_td_enc.c b/lib_enc/ivas_stereo_td_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..7a72d612e8c634285d659a8ae2d0c6980c5c2e36 --- /dev/null +++ b/lib_enc/ivas_stereo_td_enc.c @@ -0,0 +1,822 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_rom_com.h" +#include "wmc_auto.h" +#include "math.h" + + +/*-------------------------------------------------------------------* + * stereo_td_init_enc() + * + * Initialize TD stereo encoder + *-------------------------------------------------------------------*/ + +void stereo_td_init_enc( + STEREO_TD_ENC_DATA_HANDLE hStereoTD, /* i/o: TD stereo encoder handle */ + const int16_t last_element_mode /* i : last element mode */ +) +{ + hStereoTD->tdm_lt_corr_RM = 0.01f; + hStereoTD->tdm_lt_corr_LM = 0.01f; + hStereoTD->tdm_last_ratio = 0.5f; + hStereoTD->tdm_last_ratio_idx = LRTD_STEREO_MID_IS_PRIM; + hStereoTD->tdm_lt_rms_L = 40.0f; + hStereoTD->tdm_lt_rms_R = 40.0f; + hStereoTD->tdm_last_diff_lt_corr = 0; + hStereoTD->tdm_last_ener_lt_R = 0; + hStereoTD->tdm_last_ener_lt_L = 0; + + hStereoTD->tdm_ratio_transition_mov_flag = 0; + hStereoTD->tdm_ratio_transition_cnt = 0; + hStereoTD->tdm_noop_mov_flag = 0; + hStereoTD->tdm_noop_cnt = 0; + hStereoTD->tdm_last_SM_flag = 0; + + hStereoTD->tdm_last_ratio_idx = LRTD_STEREO_MID_IS_PRIM; + hStereoTD->tdm_prev_stable_idx = LRTD_STEREO_MID_IS_PRIM; + hStereoTD->tdm_prev_desired_idx = LRTD_STEREO_MID_IS_PRIM; + hStereoTD->tdm_FD2LRTD_SW_cnt = 0; + hStereoTD->tdm_LT_es_em = 0.1f; + hStereoTD->tdm_hyst_cnt = 0; + /* NOOP parameters */ + hStereoTD->tdm_lt_corr_RM_SM = 0.01f; + hStereoTD->tdm_lt_corr_LM_SM = 0.01f; + hStereoTD->tdm_last_ratio_SM = 0.5f; + hStereoTD->tdm_last_ratio_idx_SM = 0; + hStereoTD->tdm_lt_rms_L_SM = 40.0f; + hStereoTD->tdm_lt_rms_R_SM = 40.0f; + hStereoTD->tdm_last_diff_lt_corr_SM = 0; + hStereoTD->tdm_last_ener_lt_R_SM = 0; + hStereoTD->tdm_last_ener_lt_L_SM = 0; + hStereoTD->tdm_noop_mov_flag = 0; + hStereoTD->tdm_NOOP_cnt = 0; + hStereoTD->tdm_last_SM_flag_noop = 0; + hStereoTD->tdm_last_ratio_idx_SM = LRTD_STEREO_MID_IS_PRIM; + hStereoTD->tdm_prev_stable_idx_SM = LRTD_STEREO_MID_IS_PRIM; + hStereoTD->tdm_prev_desired_idx_SM = LRTD_STEREO_MID_IS_PRIM; + hStereoTD->tdm_LT_es_em_SM = 0.1f; + hStereoTD->tdm_hyst_cnt_SM = 0; + hStereoTD->tdm_noop_cnt = 0; + hStereoTD->tdm_SM_flag = 0; + hStereoTD->tdm_SM_last_clas[0] = VOICED_CLAS; + hStereoTD->tdm_SM_last_clas[1] = VOICED_CLAS; + hStereoTD->tdm_SM_last2_clas[0] = VOICED_CLAS; + hStereoTD->tdm_SM_last2_clas[1] = VOICED_CLAS; + hStereoTD->tdm_SM_modi_flag = 0; + hStereoTD->tdm_SM_reset_flag = 0; + hStereoTD->prev_fr_LRTD_TD_dec = 0; + hStereoTD->tdm_LRTD_flag = 0; + hStereoTD->tdm_inst_ratio_idx = LRTD_STEREO_RIGHT_IS_PRIM; + hStereoTD->tdm_last_inst_ratio_idx = LRTD_STEREO_MID_IS_PRIM; + hStereoTD->tdm_last_LRTD_frame_cnt = 0; + hStereoTD->tdm_vad_hangover_cnt = 0; + hStereoTD->tdm_ini_frame_cnt = 0; + hStereoTD->tdm_last_LRTD_PriCh_cnt = 0; + + hStereoTD->flag_skip_DMX = 0; + if ( last_element_mode == IVAS_CPE_MDCT ) + { + hStereoTD->flag_skip_DMX = 1; + hStereoTD->prev_fr_LRTD_TD_dec = 1; + hStereoTD->tdm_last_ratio = 1.0f; + hStereoTD->tdm_last_ratio_idx = LRTD_STEREO_LEFT_IS_PRIM; + hStereoTD->tdm_prev_stable_idx = LRTD_STEREO_LEFT_IS_PRIM; + hStereoTD->tdm_prev_desired_idx = LRTD_STEREO_LEFT_IS_PRIM; + } + + hStereoTD->tdm_hBstr_tmp.ind_list = hStereoTD->tdm_ind_list_tmp; + hStereoTD->tdm_hBstr_tmp.ivas_ind_list_zero = (Indice **) ( &hStereoTD->tdm_hBstr_tmp.ind_list ); + hStereoTD->max_ind_tdm_tmp = MAX_IND_TDM_TMP; + hStereoTD->tdm_hBstr_tmp.ivas_max_num_indices = &hStereoTD->max_ind_tdm_tmp; + hStereoTD->tdm_hBstr_tmp.st_ivas = NULL; + reset_indices_enc( &hStereoTD->tdm_hBstr_tmp, MAX_IND_TDM_TMP ); + + return; +} + + +/*-------------------------------------------------------------------* + * stereo_set_tdm() + * + * Set TD stereo encoder parameters + *-------------------------------------------------------------------*/ + +ivas_error stereo_set_tdm( + CPE_ENC_HANDLE hCPE, /* i : CPE encoder structure */ + const int16_t input_frame /* i : input frame length per channel */ +) +{ + Encoder_State **sts; + sts = hCPE->hCoreCoder; + ivas_error error; + + error = IVAS_ERR_OK; + + /* initialize TD stereo parameters */ + if ( hCPE->hStereoTD != NULL ) + { + hCPE->hStereoTD->tdm_lp_reuse_flag = 0; + hCPE->hStereoTD->tdm_low_rate_mode = 0; + hCPE->hStereoTD->tdm_Pitch_reuse_flag = 0; + + if ( hCPE->hStereoClassif->lrtd_mode == 1 ) + { + /* initialize this flag when uncorrelated L&R channels have been detected in the previous frame */ + if ( hCPE->hStereoTD->prev_fr_LRTD_TD_dec == 1 || hCPE->last_element_mode != IVAS_CPE_TD || hCPE->hStereoTD->tdm_FD2LRTD_SW_cnt < 5 ) + { + hCPE->hStereoTD->tdm_LRTD_flag = 1; + } + else + { + hCPE->hStereoTD->tdm_LRTD_flag = 0; + } + } + else + { + hCPE->hStereoTD->tdm_LRTD_flag = hCPE->hStereoTD->prev_fr_LRTD_TD_dec; + } + + + /* normal TD / LRTD switching */ + if ( hCPE->hStereoTD->tdm_LRTD_flag == 0 ) + { + Encoder_State *st; + st = hCPE->hCoreCoder[1]; + + /* deallocate CLDFB ana for secondary channel */ + if ( st->cldfbAnaEnc != NULL ) + { + deleteCldfb( &st->cldfbAnaEnc ); + } + + /* deallocate BWEs for secondary channel */ + if ( st->hBWE_TD != NULL ) + { + if ( st->hBWE_TD != NULL ) + { + free( st->hBWE_TD ); + st->hBWE_TD = NULL; + } + + deleteCldfb( &st->cldfbSynTd ); + + if ( st->hBWE_FD != NULL ) + { + free( st->hBWE_FD ); + st->hBWE_FD = NULL; + } + } + + /* allocate ICBWE structure */ + if ( hCPE->hStereoICBWE == NULL ) + { + if ( ( hCPE->hStereoICBWE = (STEREO_ICBWE_ENC_HANDLE) malloc( sizeof( STEREO_ICBWE_ENC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Stereo ICBWE \n" ) ); + } + + stereo_icBWE_init_enc( hCPE->hStereoICBWE ); + } + } + else /* tdm_LRTD_flag == 1 */ + { + Encoder_State *st; + st = hCPE->hCoreCoder[1]; + + /* deallocate ICBWE structure */ + if ( hCPE->hStereoICBWE != NULL ) + { + free( hCPE->hStereoICBWE ); + hCPE->hStereoICBWE = NULL; + } + + /* allocate CLDFB ana for secondary channel */ + if ( st->cldfbAnaEnc == NULL ) + { + if ( ( error = openCldfb( &st->cldfbAnaEnc, CLDFB_ANALYSIS, st->input_Fs, CLDFB_PROTOTYPE_1_25MS ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* allocate BWEs for secondary channel */ + if ( st->hBWE_TD == NULL ) + { + if ( ( st->hBWE_TD = (TD_BWE_ENC_HANDLE) malloc( sizeof( TD_BWE_ENC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD BWE\n" ) ); + } + + if ( ( error = openCldfb( &st->cldfbSynTd, CLDFB_SYNTHESIS, 16000, CLDFB_PROTOTYPE_1_25MS ) ) != IVAS_ERR_OK ) + { + return error; + } + + InitSWBencBuffer( st->hBWE_TD ); + ResetSHBbuffer_Enc( st->hBWE_TD ); + + if ( ( st->hBWE_FD = (FD_BWE_ENC_HANDLE) malloc( sizeof( FD_BWE_ENC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for FD BWE\n" ) ); + } + + fd_bwe_enc_init( st->hBWE_FD ); + } + } + + if ( hCPE->hStereoClassif->lrtd_mode == 0 ) + { + hCPE->hStereoTD->tdm_FD2LRTD_SW_cnt = 0; + } + hCPE->hStereoTD->tdm_FD2LRTD_SW_cnt = min( 100, hCPE->hStereoTD->tdm_FD2LRTD_SW_cnt + 1 ); + stereo_tdm_prep_dwnmx( hCPE, sts[1]->input, input_frame ); + } + else + { + hCPE->hCoreCoder[0]->tdm_LRTD_flag = 0; + hCPE->hCoreCoder[1]->tdm_LRTD_flag = 0; + } + + return error; +} + + +/*-------------------------------------------------------------------* + * tdm_configure_enc() + * + * Configure TD stereo encoder + *-------------------------------------------------------------------*/ + +void tdm_configure_enc( + const int16_t ivas_format, /* i : IVAS format */ + const int16_t ism_mode, /* i : ISM mode in combined format */ + CPE_ENC_HANDLE hCPE, /* i : CPE encoder structure */ + const float Etot_last[CPE_CHANNELS], /* i/o: Energy of last frame */ + const int16_t tdm_SM_or_LRTD_Pri, /* i : channel combination scheme flag in TD stereo OR LRTD primary channel */ + const int16_t tdm_ratio_idx, /* i : ratio index */ + const int16_t tdm_ratio_idx_SM, /* i : ratio index in SM mode */ + const int16_t attack_flag, /* i : Primary channel attack flag */ + const int16_t nb_bits_metadata /* i : number of metadata bits */ +) +{ + int16_t tdm_ratio_bit_alloc_idx, mod_ct; + STEREO_TD_ENC_DATA_HANDLE hStereoTD; + Encoder_State **sts; + int16_t loc_coder_tyape_raw0; + + hStereoTD = hCPE->hStereoTD; + sts = hCPE->hCoreCoder; + loc_coder_tyape_raw0 = sts[0]->coder_type_raw; + + /*----------------------------------------------------------------* + * Overwrite certain decisions depending on the input + *----------------------------------------------------------------*/ + + hStereoTD->tdm_use_IAWB_Ave_lpc = 0; /* Flag initialisation */ + sts[0]->hSpMusClas->tdm_lt_Etot = 0.1f * Etot_last[0] + 0.9f * sts[0]->hSpMusClas->tdm_lt_Etot; + sts[1]->hSpMusClas->tdm_lt_Etot = 0.1f * Etot_last[1] + 0.9f * sts[1]->hSpMusClas->tdm_lt_Etot; + + if ( hCPE->hStereoClassif->lrtd_mode == 0 && ( ( sts[1]->hSpMusClas->tdm_lt_Etot < 0 && hCPE->hCoreCoder[1]->vad_flag == 0 ) /* very clean signal */ + || ( hCPE->hCoreCoder[1]->vad_flag == 0 || ( Etot_last[1] < 30.0f && ( sts[0]->hSpMusClas->tdm_lt_Etot - sts[1]->hSpMusClas->tdm_lt_Etot ) > 26.0f ) ) ) ) + { + sts[1]->coder_type = INACTIVE; + + if ( hStereoTD->tdm_lp_reuse_flag == 0 && hCPE->hCoreCoder[0]->vad_flag != 0 ) + { + hStereoTD->tdm_use_IAWB_Ave_lpc = 1; + } + hStereoTD->tdm_lp_reuse_flag = 1; + } + else if ( ( ( hCPE->hCoreCoder[1]->vad_flag == 0 ) || ( hCPE->hCoreCoder[0]->vad_flag == 0 && Etot_last[1] < 30.0f && ( sts[0]->hSpMusClas->tdm_lt_Etot - sts[1]->hSpMusClas->tdm_lt_Etot ) > 26.0f ) ) && ( hCPE->hStereoClassif->lrtd_mode == 1 ) /* && NO_DTX */ ) /* boths channels are inactive but not DTX used*/ + { + sts[1]->coder_type = INACTIVE; + if ( tdm_ratio_idx > 1 && tdm_ratio_idx < 29 ) + { + if ( hStereoTD->tdm_lp_reuse_flag == 0 && hCPE->hCoreCoder[0]->vad_flag != 0 ) + { + hStereoTD->tdm_use_IAWB_Ave_lpc = 1; + } + hStereoTD->tdm_lp_reuse_flag = 1; + } + } + else if ( !( sts[1]->sp_aud_decision0 ) && sts[1]->tc_cnt <= 0 && ( sts[1]->coder_type_raw == UNVOICED || ( hStereoTD->tdm_LRTD_flag == 1 && hStereoTD->tdm_lp_reuse_flag == 0 && ( hCPE->hCoreCoder[1]->vad_flag == 0 || ( Etot_last[1] < 30.0f && ( sts[0]->hSpMusClas->tdm_lt_Etot - sts[1]->hSpMusClas->tdm_lt_Etot ) > 26.0f ) ) ) ) ) + { + sts[1]->coder_type = UNVOICED; + if ( hStereoTD->tdm_LRTD_flag == 1 ) + { + hStereoTD->tdm_lp_reuse_flag = 0; + } + } + else if ( ( sts[1]->coder_type < AUDIO && sts[1]->coder_type != UNVOICED ) || /* TC and VC are not supported in secondary channel */ + ( ( sts[1]->coder_type == AUDIO && hCPE->element_brate <= IVAS_24k4 ) || ( sts[0]->sp_aud_decision1 == 1 && hCPE->element_brate >= IVAS_16k4 ) || ( sts[1]->sp_aud_decision0 == 1 && hCPE->element_brate > IVAS_13k2 ) ) ) + { + sts[1]->coder_type = GENERIC; + } + else if ( sts[1]->coder_type == GENERIC && sts[1]->coder_type_raw == UNVOICED ) + { + hStereoTD->tdm_lp_reuse_flag = 0; + } + + if ( hCPE->element_brate > IVAS_24k4 && hCPE->hStereoClassif->lrtd_mode == 1 ) + { + if ( sts[1]->coder_type == UNVOICED ) + { + sts[1]->coder_type = GENERIC; + } + + if ( sts[0]->coder_type == UNVOICED ) + { + sts[0]->coder_type = GENERIC; + loc_coder_tyape_raw0 = GENERIC; + } + } + + if ( hCPE->element_brate >= IVAS_24k4 && hCPE->hStereoClassif->lrtd_mode == 0 && sts[0]->coder_type == UNVOICED ) + { + sts[0]->coder_type = GENERIC; + loc_coder_tyape_raw0 = GENERIC; + } + + if ( sts[1]->coder_type != GENERIC ) + { + hStereoTD->tdm_Pitch_reuse_flag = 0; + } + + if ( attack_flag != 0 ) + { + if ( sts[1]->coder_type != INACTIVE ) + { + hStereoTD->tdm_lp_reuse_flag = 0; /* Do not allow the LP filter reusing on TC or attack in the primary channel */ + } + } + + if ( tdm_SM_or_LRTD_Pri && hStereoTD->tdm_LRTD_flag == 0 ) + { + tdm_ratio_bit_alloc_idx = tdm_ratio_idx_SM; + } + else + { + tdm_ratio_bit_alloc_idx = tdm_ratio_idx; + } + + if ( ( hCPE->hStereoClassif->lrtd_mode == 1 && sts[1]->coder_type >= UNVOICED && abs( hStereoTD->tdm_last_ratio_idx - tdm_ratio_bit_alloc_idx ) > 15 ) /* channel inversion in lrtd */ + || ( hStereoTD->tdm_FD2LRTD_SW_cnt < 4 && hStereoTD->tdm_last_LRTD_frame_cnt < 4 ) ) + { + sts[1]->coder_type = GENERIC; + } + + if ( hCPE->element_brate - nb_bits_metadata * FRAMES_PER_SEC + hCPE->brate_surplus < 12000 ) + { + if ( sts[1]->coder_type == UNVOICED ) + { + sts[1]->coder_type = GENERIC; + } + hStereoTD->tdm_lp_reuse_flag = 1; + + if ( hCPE->element_brate - nb_bits_metadata * FRAMES_PER_SEC + hCPE->brate_surplus < 11000 ) + { + sts[1]->coder_type = INACTIVE; + } + } + + if ( hCPE->element_brate - nb_bits_metadata * FRAMES_PER_SEC + hCPE->brate_surplus < 14700 ) + { + if ( sts[0]->coder_type == TRANSITION ) + { + sts[0]->coder_type = GENERIC; + } + } + + mod_ct = AUDIO; + if ( hCPE->element_brate < IVAS_24k4 ) + { + mod_ct = sts[0]->coder_type; + /* Only sure TRANSITION coding modes are important for bit allocation, otherwise mod_ct is set to AUDIO only to easy debugging if needed */ + if ( ( ( sts[0]->last_L_frame >= L_FRAME16k && sts[0]->flag_ACELP16k == 0 ) || ( sts[0]->last_L_frame == L_FRAME && sts[0]->flag_ACELP16k == 1 ) ) && sts[0]->last_core_brate != FRAME_NO_DATA && sts[0]->last_core_brate != SID_2k40 && sts[0]->coder_type_raw != VOICED /*in case of CNG, this code is not reached sts[0]->core_brate != FRAME_NO_DATA && sts[0]->core_brate != SID_2k40 &&*/ ) + { + mod_ct = TRANSITION; + } + else if ( sts[0]->sp_aud_decision1 == 1 || sts[0]->sp_aud_decision2 == 1 || mod_ct != TRANSITION ) + { + mod_ct = AUDIO; + } + } + + /* Correction of tdm_inst_ratio_idx in case of TC in the seecondary channel */ + if ( hStereoTD->flag_skip_DMX == 0 && hStereoTD->tdm_LRTD_flag == 1 && sts[1]->tc_cnt > 1 /*&& abs(hStereoTD->tdm_inst_ratio_idx-LRTD_STEREO_MID_IS_PRIM) > 5*/ ) + { + if ( tdm_SM_or_LRTD_Pri == 0 ) /* Primary is right */ + { + hStereoTD->tdm_inst_ratio_idx += LRTD_STEREO_QUARTER_RANGE; + } + else if ( tdm_SM_or_LRTD_Pri == 1 ) /* Primary is left */ + { + hStereoTD->tdm_inst_ratio_idx -= LRTD_STEREO_QUARTER_RANGE; + } + hStereoTD->tdm_inst_ratio_idx = check_bounds_s( hStereoTD->tdm_inst_ratio_idx, 8, 22 ); + } + + /*----------------------------------------------------------------* + * bitbudget distribution between channels (taking into account also metadata bitbudget) + *----------------------------------------------------------------*/ + + tdm_bit_alloc( ivas_format, ism_mode, hCPE->element_brate - nb_bits_metadata * FRAMES_PER_SEC + hCPE->brate_surplus, + hStereoTD->tdm_lp_reuse_flag, &( sts[0]->total_brate ), &( sts[1]->total_brate ), + &( hStereoTD->tdm_low_rate_mode ), sts[1]->coder_type, tdm_ratio_bit_alloc_idx, hStereoTD->tdm_Pitch_reuse_flag, + sts[0]->bwidth, sts[1]->bwidth, sts[0]->flag_ACELP16k, hStereoTD->tdm_LRTD_flag, mod_ct, hStereoTD->tdm_inst_ratio_idx ); + + if ( sts[0]->GSC_IVAS_mode > 0 && sts[0]->total_brate <= STEREO_GSC_BIT_RATE_ALLOC ) + { + sts[0]->GSC_IVAS_mode = 0; + } + if ( sts[1]->GSC_IVAS_mode > 0 && ( sts[1]->total_brate <= STEREO_GSC_BIT_RATE_ALLOC || hStereoTD->tdm_low_rate_mode == 1 ) ) + { + sts[1]->GSC_IVAS_mode = 0; + } + + if ( sts[0]->coder_type == GENERIC && loc_coder_tyape_raw0 == UNVOICED ) + { + if ( sts[0]->total_brate <= MAX_UNVOICED_BRATE ) + { + sts[0]->coder_type = UNVOICED; + } + } + + /*----------------------------------------------------------------* + * Bitstream writing + *----------------------------------------------------------------*/ + + /* transmit the ratio index */ + if ( tdm_SM_or_LRTD_Pri && hStereoTD->tdm_LRTD_flag == 0 ) + { + push_indice( &hStereoTD->tdm_hBstr_tmp, IND_STEREO_TD_ALPHA, tdm_ratio_idx_SM, TDM_RATIO_BITS ); + } + else + { + if ( hStereoTD->tdm_LRTD_flag == 1 ) + { + push_indice( &hStereoTD->tdm_hBstr_tmp, IND_STEREO_TD_ALPHA, hStereoTD->tdm_inst_ratio_idx, TDM_RATIO_BITS ); + } + else + { + push_indice( &hStereoTD->tdm_hBstr_tmp, IND_STEREO_TD_ALPHA, tdm_ratio_idx, TDM_RATIO_BITS ); + } + } + + /* LPC reuse flag */ + if ( sts[1]->coder_type == INACTIVE && tdm_ratio_idx < 29 && tdm_ratio_idx > 1 ) + { + /* normal TD, tdm_lp_reuse_flag always on, tdm_use_IAWB_Ave_lpc varies tdm_ratio_idx<29 && tdm_ratio_idx> 1*/ + push_indice( &hStereoTD->tdm_hBstr_tmp, IND_STEREO_LPC_REUSE, hStereoTD->tdm_use_IAWB_Ave_lpc, TDM_LP_REUSE_BITS ); + } + else + { + push_indice( &hStereoTD->tdm_hBstr_tmp, IND_STEREO_LPC_REUSE, hStereoTD->tdm_lp_reuse_flag, TDM_LP_REUSE_BITS ); + } + + /* LRTD flag */ + push_indice( &hStereoTD->tdm_hBstr_tmp, IND_STEREO_LRTD_FLAG, hStereoTD->tdm_LRTD_flag, TDM_LR_CONTENT_BITS ); + + /* Stereo ICA parameters */ + if ( hStereoTD->tdm_LRTD_flag == 0 ) + { + push_indice( &hStereoTD->tdm_hBstr_tmp, IND_STEREO_REFCHAN, hCPE->hStereoTCA->refChanIndx, STEREO_BITS_TCA_CHAN ); + push_indice( &hStereoTD->tdm_hBstr_tmp, IND_STEREO_CORRSTATS, hCPE->hStereoTCA->indx_ica_NCShift, STEREO_BITS_TCA_CORRSTATS ); + push_indice( &hStereoTD->tdm_hBstr_tmp, IND_STEREO_GD, hCPE->hStereoTCA->indx_ica_gD, STEREO_BITS_TCA_GD ); + } + + + /*----------------------------------------------------------------* + * Updates + *----------------------------------------------------------------*/ + + hStereoTD->tdm_last_ratio_idx = tdm_ratio_idx; + hStereoTD->tdm_last_ratio_idx_SM = tdm_ratio_idx_SM; + hStereoTD->tdm_last_SM_flag = tdm_SM_or_LRTD_Pri; + + if ( hStereoTD->tdm_LRTD_flag == 1 ) + { + hStereoTD->tdm_last_SM_flag = 0; + } + + hStereoTD->tdm_last_inst_ratio_idx = hStereoTD->tdm_inst_ratio_idx; + + return; +} + + +/*-------------------------------------------------------------------* + * signaling_enc_secondary() + * + * Signalling of the secondary channel + *-------------------------------------------------------------------*/ + +ivas_error signaling_enc_secondary( + Encoder_State *st, /* i/o: Encoder structure */ + const int16_t tdm_SM_or_LRTD_Pri, /* i : channel combination scheme flag OR LRTD primary channel */ + const int16_t tdm_Pitch_reuse_flag /* i : primary channel pitch reuse flag*/ +) +{ + int16_t ind; + BSTR_ENC_HANDLE hBstr = st->hBstr; + ivas_error error; + + error = IVAS_ERR_OK; + + /* The secondary channel band-witdh is always the same as the primary channel bandwidth */ + + ind = st->coder_type; + if ( tdm_Pitch_reuse_flag == 1 ) /* possible only for bitrate <= 24400 */ + { + ind = 3; + } + else if ( st->coder_type == GENERIC ) + { + ind = 2; + } + else if ( st->coder_type == AUDIO ) + { + ind -= 2; + } + + ind <<= 1; + ind += tdm_SM_or_LRTD_Pri; /* addition of the channel combination scheme flag value or the LRTD primary channel*/ + push_indice( hBstr, IND_STEREO_2ND_CODER_T, ind, TDM_SECONDARY_SIGNALLING ); + + /* write extension layer flag to distinguish between TBE (0) and BWE (1) */ + if ( st->extl_brate > 0 ) + { + if ( st->extl == WB_TBE || st->extl == SWB_TBE || st->extl == FB_TBE ) + { + push_indice( hBstr, IND_BWE_FLAG, 0, 1 ); + } + else if ( st->extl == WB_BWE || st->extl == SWB_BWE || st->extl == FB_BWE ) + { + push_indice( hBstr, IND_BWE_FLAG, 1, 1 ); + } + } + + return error; +} + +/*-------------------------------------------------------------------* + * Function tdm_downmix_plain() + * + * downmix Left+Right to Primary+Secondary channel + *-------------------------------------------------------------------*/ + +static void tdm_downmix_plain( + float FR_Y[], /* o : primary channel */ + float LR_X[], /* o : secondary channel */ + const float Left_in[], /* i : Left channel */ + const float Right_in[], /* i : Right channel */ + const float ratio_L, /* i : mixing ratio */ + const float One_m_Ratio, /* i : 1 - mixing ration */ + const int16_t start_index, /* i : start index */ + const int16_t end_index /* i : end index */ +) +{ + int16_t i; + + for ( i = start_index; i < end_index; i++ ) + { + FR_Y[i] = ( Right_in[i] * One_m_Ratio + ( Left_in[i] * ratio_L ) ); + LR_X[i] = ( Left_in[i] * One_m_Ratio - ( Right_in[i] * ratio_L ) ); + } + + return; +} + +/*-------------------------------------------------------------------* + * Function tdm_downmix_fade() + * + * downmix Left+Right to Primary+Secondary channel with fade in/out + *-------------------------------------------------------------------*/ + +static void tdm_downmix_fade( + float FR_Y[], /* o : primary channel */ + float LR_X[], /* o : secondary channel */ + const float Left_in[], /* i : Left channel */ + const float Right_in[], /* i : Right channel */ + const float ratio_L, /* i : mixing ratio */ + const float One_m_Ratio, /* i : 1 - mixing ratio */ + const float OldRatio_L, /* i : old mixing ratio */ + const float One_m_OldRatio, /* i : 1 - old mixing ratio */ + const int16_t start_index, /* i : start index */ + const int16_t end_index /* i : end index */ +) +{ + int16_t i; + float step, fade_in, fade_out; + + step = 1.0f / (float) ( end_index - start_index ); + fade_out = 1.0f; + fade_in = 0.0f; + + for ( i = start_index; i < end_index; i++ ) + { + FR_Y[i] = ( Right_in[i] * One_m_OldRatio + Left_in[i] * OldRatio_L ) * fade_out + ( Right_in[i] * One_m_Ratio + Left_in[i] * ratio_L ) * fade_in; + LR_X[i] = ( Left_in[i] * One_m_OldRatio - Right_in[i] * OldRatio_L ) * fade_out + ( Left_in[i] * One_m_Ratio - Right_in[i] * ratio_L ) * fade_in; + + fade_in += step; + fade_out -= step; + } + + return; +} + +/*-------------------------------------------------------------------* + * Function stereo_tdm_downmix() + * + * Compute the TD stereo downmix signal based on the ratio index + *-------------------------------------------------------------------*/ + +void stereo_tdm_downmix( + STEREO_TD_ENC_DATA_HANDLE hStereoTD, /* i : TD stereo IVAS encoder structure */ + float *Left_in, /* i/o: Left channel -> Primary channel */ + float *Right_in, /* i/o: Right channel -> Secondary channel */ + const int16_t input_frame, /* i : Number of samples */ + const int16_t tdm_ratio_idx, /* i : TDM ratio index */ + const int16_t tdm_SM_flag, /* i : channel combination scheme flag */ + const int16_t tdm_ratio_idx_SM /* i : TDM ratio index for SM mode */ +) +{ + float FR_Y[L_FRAME48k], LR_X[L_FRAME48k]; + int16_t i, tdm_n_OVA; + int16_t stereo_tdm_coder_type; + + tdm_n_OVA = NS2SA( input_frame * FRAMES_PER_SEC, TDM_L_NOVA_NS ); + + if ( hStereoTD->flag_skip_DMX ) + { + stereo_tdm_coder_type = 10; /* no DMX */ + mvr2r( Left_in, FR_Y, input_frame ); + mvr2r( Right_in, LR_X, input_frame ); + } + else if ( tdm_SM_flag == 1 ) + { + if ( hStereoTD->tdm_last_SM_flag == 0 ) + { + stereo_tdm_coder_type = 0; /* mode 1 : Switching from YX scheme to SM scheme*/ + } + else + { + stereo_tdm_coder_type = 1; /* mode 2 : SM scheme*/ + } + } + else + { + if ( hStereoTD->tdm_last_SM_flag == 1 ) + { + stereo_tdm_coder_type = 2; /* mode 3 : Switching from SM scheme to YX scheme*/ + } + else + { + stereo_tdm_coder_type = 3; /* mode 4 : YX scheme*/ + } + } + + switch ( stereo_tdm_coder_type ) + { + case ( 0 ): + { + /* Switching from YX scheme to SM scheme */ + tdm_downmix_fade( FR_Y, LR_X, Left_in, Right_in, tdm_ratio_tabl[tdm_ratio_idx_SM], tdm_ratio_tabl[tdm_ratio_idx_SM] - 1.0f, hStereoTD->tdm_last_ratio, 1.0f - hStereoTD->tdm_last_ratio, 0, tdm_n_OVA ); + + /* Create new mixture of using the ratio computed above and formular for SM scheme */ + tdm_downmix_plain( FR_Y, LR_X, Left_in, Right_in, tdm_ratio_tabl[tdm_ratio_idx_SM], tdm_ratio_tabl[tdm_ratio_idx_SM] - 1.0f, tdm_n_OVA, input_frame ); + } + break; + case ( 1 ): + { + /* Create new mixture of using the ratio computed above and formular for SM scheme */ + if ( tdm_ratio_tabl[tdm_ratio_idx_SM] == hStereoTD->tdm_last_ratio_SM ) + { + tdm_downmix_plain( FR_Y, LR_X, Left_in, Right_in, tdm_ratio_tabl[tdm_ratio_idx_SM], tdm_ratio_tabl[tdm_ratio_idx_SM] - 1.0f, 0, input_frame ); + } + else + { + tdm_downmix_fade( FR_Y, LR_X, Left_in, Right_in, tdm_ratio_tabl[tdm_ratio_idx_SM], tdm_ratio_tabl[tdm_ratio_idx_SM] - 1.0f, hStereoTD->tdm_last_ratio_SM, hStereoTD->tdm_last_ratio_SM - 1.0f, 0, tdm_n_OVA ); + tdm_downmix_plain( FR_Y, LR_X, Left_in, Right_in, tdm_ratio_tabl[tdm_ratio_idx_SM], tdm_ratio_tabl[tdm_ratio_idx_SM] - 1.0f, tdm_n_OVA, input_frame ); + } + } + break; + case ( 2 ): + { + /* Switching from SM scheme to YX scheme */ + tdm_downmix_fade( FR_Y, LR_X, Left_in, Right_in, tdm_ratio_tabl[tdm_ratio_idx], 1.0f - tdm_ratio_tabl[tdm_ratio_idx], hStereoTD->tdm_last_ratio_SM, hStereoTD->tdm_last_ratio_SM - 1.0f, 0, tdm_n_OVA ); + + /* Create new mixture of using the ratio computed above and formular for YX scheme */ + tdm_downmix_plain( FR_Y, LR_X, Left_in, Right_in, tdm_ratio_tabl[tdm_ratio_idx], 1.0f - tdm_ratio_tabl[tdm_ratio_idx], tdm_n_OVA, input_frame ); + } + break; + case ( 3 ): + { + /* Create new mixture of using the ratio computed above and formular for YX scheme */ + if ( tdm_ratio_tabl[tdm_ratio_idx] == hStereoTD->tdm_last_ratio ) + { + tdm_downmix_plain( FR_Y, LR_X, Left_in, Right_in, tdm_ratio_tabl[tdm_ratio_idx], 1.0f - tdm_ratio_tabl[tdm_ratio_idx], 0, input_frame ); + } + else + { + tdm_downmix_fade( FR_Y, LR_X, Left_in, Right_in, tdm_ratio_tabl[tdm_ratio_idx], 1.0f - tdm_ratio_tabl[tdm_ratio_idx], hStereoTD->tdm_last_ratio, 1.0f - hStereoTD->tdm_last_ratio, 0, tdm_n_OVA ); + tdm_downmix_plain( FR_Y, LR_X, Left_in, Right_in, tdm_ratio_tabl[tdm_ratio_idx], 1.0f - tdm_ratio_tabl[tdm_ratio_idx], tdm_n_OVA, input_frame ); + } + } + break; + default: + break; + } + + for ( i = 0; i < input_frame; i++ ) + { + Left_in[i] = FR_Y[i]; + Right_in[i] = LR_X[i]; + } + + hStereoTD->tdm_last_ratio = tdm_ratio_tabl[tdm_ratio_idx]; + hStereoTD->tdm_last_ratio_SM = tdm_ratio_tabl[tdm_ratio_idx_SM]; + + return; +} + +/*-------------------------------------------------------------------* + * Function stereo_tdm_prep_dwnmx() + * + * Reactivate downmixing after bitrate switching from MDCT to lower rate + *-------------------------------------------------------------------*/ + +void stereo_tdm_prep_dwnmx( + CPE_ENC_HANDLE hCPE, /* i : CPE encoder structure */ + const float *input1, /* i : right channel input */ + const int16_t input_frame /* i : frame lenght */ +) +{ +#define USER_ENER + float mener; + int16_t i, sw_pos, enr_len; + Encoder_State **sts; + sts = hCPE->hCoreCoder; + + i = input_frame / L_FRAME16k; + + sw_pos = 22 * i; + enr_len = 6 * i; + if ( hCPE->element_mode == IVAS_CPE_TD ) + { + if ( hCPE->hStereoTD->flag_skip_DMX == 1 ) /* hStereoTD is defined only if element mode == TD */ + { + if ( hCPE->last_element_mode == IVAS_CPE_TD ) + { + mener = sum2_f( input1 + input_frame - sw_pos, enr_len ) + EPSILON; + mener = sqrtf( mener / enr_len ); + if ( mener < 10.0f && ( sts[1]->vad_flag == 0 || sts[1]->coder_type_raw == UNVOICED ) ) + { + hCPE->hStereoTD->flag_skip_DMX = 0; /* Can start using the TD downmix whenever the right channel is sufficiently low energy to limit switching artefacts */ + } + } + else if ( hCPE->last_element_mode == IVAS_CPE_DFT || hCPE->last_element_brate == IVAS_13k2 ) /* Just security check, should not happened */ + { + hCPE->hStereoTD->flag_skip_DMX = 0; + } + } + } + + return; +} diff --git a/lib_enc/ivas_tcx_core_enc.c b/lib_enc/ivas_tcx_core_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..ef239607e60100ecaccab863b3298cab99472f38 --- /dev/null +++ b/lib_enc/ivas_tcx_core_enc.c @@ -0,0 +1,830 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "rom_com.h" +#include "basop_proto_func.h" +#include "wmc_auto.h" +#include "ivas_prot.h" + +/*-------------------------------------------------------------------* + * stereo_tcx_init_enc() + * + * Initialize stereo TCX encoder + *-------------------------------------------------------------------*/ + +void stereo_tcx_init_enc( + Encoder_State *st /* i/o: encoder state structure */ +) +{ + int16_t prev_IsTNSAllowed; + assert( st->core_brate != SID_2k40 && st->core_brate != FRAME_NO_DATA ); + + /* Get the raw coder type from signal analysis*/ + st->coder_type = st->coder_type_raw; + if ( !st->localVAD ) + { + st->coder_type = INACTIVE; + } + else if ( st->coder_type > GENERIC ) + { + st->coder_type = GENERIC; + } + + if ( st->tcxonly ) + { + st->coder_type = GENERIC; + } + + st->hTcxCfg->coder_type = st->coder_type; + if ( !st->tcxonly && !st->localVAD && st->hTcxCfg->coder_type == GENERIC ) + { + st->hTcxCfg->coder_type = UNVOICED; + } + + /*sampling rate*/ + st->sr_core = getCoreSamplerateMode2( st->element_mode, st->bits_frame_nominal * FRAMES_PER_SEC, st->bwidth, st->flag_ACELP16k, st->rf_mode, st->is_ism_format ); + st->fscale = sr2fscale( st->sr_core ); + + /*frame size*/ + st->L_frame = (int16_t) ( st->sr_core / FRAMES_PER_SEC ); + st->hTcxEnc->L_frameTCX = (int16_t) ( st->input_Fs / FRAMES_PER_SEC ); + + if ( ( st->L_frame == L_FRAME16k && ( st->bits_frame_nominal * FRAMES_PER_SEC ) <= MAX_ACELP_BRATE ) || ( st->tcxonly && ( st->sr_core == INT_FS_16k || st->sr_core == INT_FS_16k ) ) ) + { + st->nb_subfr = NB_SUBFR16k; + } + else + { + st->nb_subfr = NB_SUBFR; + } + + /*TCX tools*/ + st->hTcxCfg->ctx_hm = getCtxHm( st->element_mode, st->bits_frame_nominal * FRAMES_PER_SEC, st->rf_mode ); + st->hTcxCfg->resq = getResq( st->bits_frame_nominal * FRAMES_PER_SEC ); + st->hTcxEnc->tcx_lpc_shaped_ari = getTcxLpcShapedAri( st->bits_frame_nominal * FRAMES_PER_SEC, st->rf_mode, st->element_mode ); + st->igf = getIgfPresent( st->element_mode, st->bits_frame_nominal * FRAMES_PER_SEC, st->bwidth, st->rf_mode ); + prev_IsTNSAllowed = st->hTcxCfg->fIsTNSAllowed; + if ( st->element_mode != EVS_MONO ) + { + st->hTcxCfg->fIsTNSAllowed = getTnsAllowed( st->bits_frame_nominal * FRAMES_PER_SEC, st->igf, st->element_mode ); + } + if ( !prev_IsTNSAllowed && st->hTcxCfg->fIsTNSAllowed && st->element_mode == IVAS_CPE_DFT ) /* may happen in unified stereo when switching stereo technologies */ + { + InitTnsConfigs( st->bwidth, st->hTcxCfg->tcx_coded_lines, st->hTcxCfg->tnsConfig, st->hIGFEnc->infoStopFrequency, st->bits_frame_nominal * FRAMES_PER_SEC, st->element_mode, 0 ); + + SetAllowTnsOnWhite( st->hTcxCfg->tnsConfig, 0 ); + } + st->core_brate = st->total_brate; + + return; +} + + +/*-------------------------------------------------------------------* + * stereo_tcx_core_enc() + * + * Stereo TCX encoder + *-------------------------------------------------------------------*/ + +void stereo_tcx_core_enc( + Encoder_State *st, /* i/o: encoder state structure */ + const float new_samples_12k8[], /* i : buffer of input signal @12.8 kHz */ + const float new_samples_16k[], /* i : buffer of input signal @16 kHz */ + const float Aw[], /* i : weighted A(z) unquant. for subframes*/ + float lsp_new[], /* i : LSPs at the end of the frame */ + float lsp_mid[], /* i : LSPs in the middle of the frame */ + float pitch_buf[NB_SUBFR16k], /* o : floating pitch for each subframe */ + const int16_t last_element_mode, /* i : last element mode */ + const int16_t vad_hover_flag /* i : VAD hangover flag */ +) +{ + TCX_ENC_HANDLE hTcxEnc; + int16_t i, n; + + /*size and windowing*/ + const float *p_new_samples; + int16_t n_subframes; + int16_t last_core_orig; + + /*Bits*/ + int16_t nbits_start, total_nbbits, nbits_header; + int16_t target_bits[2], bitsAvailable; + int16_t nbits_lpc[2]; + int16_t tnsSize[2]; /* number of tns parameters put into prm */ + int16_t tnsBits[2]; /* number of tns bits in the frame */ + int16_t ltpBits; + + /*Parameters*/ + int16_t param_lpc[NPRM_LPC_NEW]; + int16_t param_core[2 * NPRM_DIV]; + int16_t bits_param_lpc[10], no_param_lpc; + + /*LPC*/ + float lsf_q[M], lsp_q[M], lsp[M], lsf[M]; + float lspmid_q[M]; + float A_q[M + 1]; + float gainlpc[2][FDNS_NPTS]; + float lsp_tcx_q[M], lsf_tcx_q[M]; + int16_t tcx_lpc_cdk; + Word16 A_q_ind[M + 1]; /*for LPC-based AC*/ + Word16 lspq_ind[M]; /*for LPC-based AC*/ + + /*TCX-LTP*/ + int16_t T_op[3]; + + /*HM*/ + int16_t indexBuffer[2 * ( ( N_MAX / 2 ) + 1 )]; + CONTEXT_HM_CONFIG hm_cfg[2]; + + /* bitstream */ + BSTR_ENC_HANDLE hBstr = st->hBstr; + + + push_wmops( "stereo_tcx_core_enc" ); + + /*Sanity check*/ + assert( st->mdct_sw == MODE1 && "MDCT switching should be in TCX MODE 1\n" ); + assert( st->rf_mode == 0 && "Channel aware not supported! " ); + + no_param_lpc = 0; + n_subframes = 1; + + hTcxEnc = st->hTcxEnc; + + /*--------------------------------------------------------------* + * Configuration of TCX + *---------------------------------------------------------------*/ + + stereo_tcx_init_enc( st ); + + /*--------------------------------------------------------------* + * Initialization + *---------------------------------------------------------------*/ + + /* Subtract the bits of common header */ + st->bits_frame_core = (int16_t) ( st->total_brate / FRAMES_PER_SEC ) - hBstr->nb_bits_tot; + + /*Get Bits of TCX header*/ + nbits_header = 3; /* Coder types (2) + last_core for bfi (1) */ + + if ( st->tcxonly ) + { + /* TCX20/10 flag */ + nbits_header++; + } + + /* bits for TCX overlap mode (1 bit: full, 2 bits: half or no overlap) */ + nbits_header += ( st->hTcxCfg->tcx_curr_overlap_mode == HALF_OVERLAP || st->hTcxCfg->tcx_curr_overlap_mode == MIN_OVERLAP ) ? 2 : 1; + + hm_cfg[0].indexBuffer = &indexBuffer[0]; + hm_cfg[1].indexBuffer = &indexBuffer[N_MAX / 2 + 1]; + + set_s( tnsSize, 0, 2 ); + set_s( tnsBits, 0, 2 ); + set_s( nbits_lpc, 0, 2 ); + ltpBits = 0; + + for ( i = 0; i < 3; i++ ) + { + T_op[i] = st->pitch[i]; + + /* check minimum pitch for quantization */ + if ( T_op[i] < PIT_MIN_SHORTER ) + { + T_op[i] *= 2; + } + + /* convert pitch values to core sampling-rate */ + if ( st->L_frame != L_FRAME ) + { + T_op[i] = (int16_t) ( T_op[i] * (float) st->L_frame / (float) L_FRAME + 0.5f ); + } + } + + if ( st->L_frame == L_FRAME ) + { + p_new_samples = new_samples_12k8; + } + else + { + p_new_samples = new_samples_16k; + } + + /*--------------------------------------------------------------* + * TCX20/TCX10 switching decision + *---------------------------------------------------------------*/ + + if ( hTcxEnc->tcxMode == TCX_10 ) + { + st->core = TCX_10_CORE; + n_subframes = 2; + nbits_header += ( st->hTcxCfg->tcx_last_overlap_mode == HALF_OVERLAP || st->hTcxCfg->tcx_last_overlap_mode == MIN_OVERLAP ) ? 2 : 1; + } + else if ( hTcxEnc->tcxMode == TCX_20 ) + { + st->core = TCX_20_CORE; + n_subframes = 1; + } + + nbits_start = hBstr->nb_bits_tot; + + /*--------------------------------------------------------------------------------* + * Write TCX signaling + *--------------------------------------------------------------------------------*/ + + /* TCX20/TCX10 and coder type */ + writeTCXMode( st, hBstr, 0, /* MCT_flag */ &nbits_start ); + + /* write last_core for error concealment */ + push_next_indice( hBstr, ( st->last_core != ACELP_CORE || st->core == TCX_10_CORE ), 1 ); + + /* write TCX overlap mode (1 bit: full, 2 bits: half or no overlap) */ + writeTCXWindowing( hBstr, st->hTcxCfg->tcx_curr_overlap_mode ); + if ( st->core == TCX_10_CORE ) + { + writeTCXWindowing( hBstr, st->hTcxCfg->tcx_last_overlap_mode ); + } + + assert( nbits_header == ( hBstr->nb_bits_tot - nbits_start ) ); + + /*--------------------------------------------------------------* + * Core Signal Analysis: MDCT, TNS, LPC analysis + *---------------------------------------------------------------*/ + + core_signal_analysis_high_bitrate( p_new_samples, T_op, lsp_new, lsp_mid, st, NULL, tnsSize, tnsBits, param_core, <pBits, NULL, st->L_frame, hTcxEnc->L_frameTCX, last_element_mode, vad_hover_flag ); + + bitsAvailable = st->bits_frame_core - nbits_header; + if ( st->igf ) + { + bitsAvailable -= st->hIGFEnc->infoTotalBitsWritten; + } + + /*--------------------------------------------------------------* + * Envelope Quantization and FDNS + *---------------------------------------------------------------*/ + + if ( !st->enableTcxLpc ) + { + if ( st->envWeighted ) + { + /* Unweight the envelope */ + E_LPC_lsp_unweight( st->lsp_old, st->lsp_old, st->lsf_old, 1.0f / st->gamma ); + st->envWeighted = 0; + } + + lpc_quantization( st, lsp_new, lsp_mid, lsp_q, lsf_q, lspmid_q, AUDIO, 0, /*No acelp->no need to compute any mid-LPC*/ + param_lpc, nbits_lpc, bits_param_lpc, &no_param_lpc ); + + /*--------------------------------------------------------------* + * Rate switching + *--------------------------------------------------------------*/ + + if ( st->rate_switching_reset ) + { + mvr2r( lsp_q, st->lsp_old, M ); + mvr2r( lsf_q, st->lsf_old, M ); + } + } + + last_core_orig = st->last_core; + for ( n = 0; n < n_subframes; n++ ) + { + /* Get the envelope */ + if ( st->enableTcxLpc ) + { + tcx_lpc_cdk = tcxlpc_get_cdk( st->hTcxCfg->coder_type ); + + /* Get the envelope corresponding to the current frame */ + E_LPC_int_lpc_tcx( st->lspold_enc, lsp_new, A_q ); + + /* Weight the envelope */ + weight_a( A_q, A_q, st->gamma, M ); + + /* Convert to lsp and lsf */ + a2lsp_stab( A_q, lsp, lsp_new ); + lsp2lsf( lsp, lsf, M, INT_FS_12k8 ); + + /* Quantize */ + Q_lsf_tcxlpc( lsf, lsf_tcx_q, lspq_ind, param_lpc, st->narrowBand, tcx_lpc_cdk, st->mem_MA, st->hTcxCfg->coder_type, st->Bin_E ); + + /* Account for consumed bits */ + nbits_lpc[0] = TCXLPC_NUMBITS; + if ( param_lpc[0] ) + { + nbits_lpc[0] += TCXLPC_IND_NUMBITS; + } + + /* Convert quantized lsf to lsp and A */ + lsf2lsp( lsf_tcx_q, lsp_tcx_q, M, INT_FS_12k8 ); + lsp2a_stab( lsp_tcx_q, A_q, M ); + } + else if ( !st->tcxonly ) + { + E_LPC_int_lpc_tcx( st->lsp_old, lsp_q, A_q ); + } + else if ( n + 2 == n_subframes ) /* First TCX10/5 subframe */ + { + lsp2a_stab( lspmid_q, A_q, M ); + } + else + { + lsp2a_stab( lsp_q, A_q, M ); + } + + if ( hTcxEnc->tcx_lpc_shaped_ari ) + { + basop_E_LPC_f_lsp_a_conversion( lspq_ind, A_q_ind, M ); + } + + bitsAvailable -= nbits_lpc[n]; + + /* Shape spectrum */ + ShapeSpectrum( st->hTcxCfg, A_q, gainlpc[n], st->L_frame / n_subframes, st->hTcxCfg->tcx_coded_lines / n_subframes, hTcxEnc->spectrum[n], hTcxEnc->fUseTns[n], st, NULL ); + + st->last_core = st->core; + } + + st->last_core = last_core_orig; + + /*--------------------------------------------------------------------------------* + * Write LPC parameters + *--------------------------------------------------------------------------------*/ + + writeLPCparam( st, hBstr, param_lpc, bits_param_lpc, no_param_lpc, &total_nbbits ); + + assert( total_nbbits == ( nbits_lpc[0] + nbits_lpc[1] ) ); + + /*--------------------------------------------------------------* + * Run TCX10/20 Core + *---------------------------------------------------------------*/ + + hTcxEnc->measuredBwRatio = 1.f; + + for ( n = 0; n < n_subframes; n++ ) + { + target_bits[n] = ( bitsAvailable + ( n_subframes - 1 ) - n ) / n_subframes - tnsBits[n]; + + if ( st->enablePlcWaveadjust && ( n == n_subframes - 1 ) ) + { + target_bits[n] -= 1; + } + if ( n == 0 ) + { + target_bits[n] -= ltpBits; + } + + /* Run TCX20/10 encoder */ + QuantizeSpectrum( st, A_q, A_q_ind, gainlpc[n], st->synth + n * st->L_frame / n_subframes, target_bits[n], tnsSize[n], param_core + n * NPRM_DIV, n, &hm_cfg[n], vad_hover_flag ); + } + + /* Update tcx overlap mode */ + st->hTcxCfg->tcx_last_overlap_mode = st->hTcxCfg->tcx_curr_overlap_mode; + + coder_tcx_post( st, A_q, Aw ); + + if ( st->enableTcxLpc ) + { + E_LPC_lsp_unweight( lsp_tcx_q, lsp_q, lsf_q, 1.0f / st->gamma ); /* Update lsf_q for encoderSideLossSimulation() */ + } + + /* Update lsp/lsf memory */ + if ( st->enableTcxLpc && st->core != ACELP_CORE ) + { + /* Update lsf / lsp memory */ + mvr2r( lsf_tcx_q, st->lsf_old, M ); + mvr2r( lsp_tcx_q, st->lsp_old, M ); + st->envWeighted = 1; + + /* Update ACELP quantizer state */ + lsf_update_memory( st->narrowBand, st->lsf_old, st->mem_MA, st->mem_MA ); + st->pstreaklen = 0; + st->streaklimit = 1.0f; + /* check resonance for pitch clipping algorithm */ + gp_clip_test_lsf( st->element_mode, st->core_brate, st->lsf_old, st->clip_var, 0 ); + mvr2r( st->lsf_old, st->mem_AR, M ); + } + else + { + mvr2r( lsf_q, st->lsf_old, M ); + mvr2r( lsp_q, st->lsp_old, M ); + } + + if ( st->Opt_DTX_ON && !st->tcxonly && st->hTdCngEnc != NULL ) + { + /* update CNG parameters in active frames */ + if ( st->bwidth == NB && st->enableTcxLpc && st->core != ACELP_CORE ) + { + float buf[L_LP], res[L_FRAME], A[M + 1], r[M + 1], tmp, lsptmp[M]; + + assert( st->L_frame == L_FRAME ); + + mvr2r( st->synth + L_FRAME - L_LP, buf, L_LP ); + tmp = st->synth[L_FRAME - L_LP - 1]; + preemph( buf, st->preemph_fac, L_LP, &tmp ); + autocorr( buf, r, M, L_LP, LP_assym_window, 0, 0, 0 ); + lag_wind( r, M, INT_FS_12k8, LAGW_WEAK ); + lev_dur( A, r, M, NULL ); + a2lsp_stab( A, lsptmp, lsp_new ); + + residu( A, M, buf + L_LP - L_FRAME, res, L_FRAME ); + + cng_params_upd( lsptmp, res, st->L_frame, &st->hTdCngEnc->ho_circ_ptr, st->hTdCngEnc->ho_ener_circ, &st->hTdCngEnc->ho_circ_size, st->hTdCngEnc->ho_lsp_circ, ENC, st->hTdCngEnc->ho_env_circ, &st->hTdCngEnc->cng_buf_cnt, st->hTdCngEnc->cng_exc2_buf, st->hTdCngEnc->cng_brate_buf, st->hDtxEnc->last_active_brate, st->element_mode, st->hFdCngEnc->hFdCngCom->CngBandwidth ); + } + else + { + cng_params_upd( lsp_new, st->hLPDmem->old_exc + L_EXC_MEM - st->L_frame, st->L_frame, &st->hTdCngEnc->ho_circ_ptr, st->hTdCngEnc->ho_ener_circ, &st->hTdCngEnc->ho_circ_size, st->hTdCngEnc->ho_lsp_circ, ENC, st->hTdCngEnc->ho_env_circ, &st->hTdCngEnc->cng_buf_cnt, st->hTdCngEnc->cng_exc2_buf, st->hTdCngEnc->cng_brate_buf, st->hDtxEnc->last_active_brate, st->element_mode, st->hFdCngEnc->hFdCngCom->CngBandwidth ); + } + + if ( st->L_frame == L_FRAME ) + { + /* store LSPs@16k, potentially to be used in CNG@16k */ + mvr2r( st->lsp_old16k, &( st->hTdCngEnc->ho_lsp_circ2[( st->hTdCngEnc->ho_circ_ptr ) * M] ), M ); + } + + /* Set 16k LSP flag for CNG buffer */ + st->hTdCngEnc->ho_16k_lsp[st->hTdCngEnc->ho_circ_ptr] = ( st->L_frame == L_FRAME ? 0 : 1 ); + + /* efficient DTX hangover control */ + if ( st->hTdCngEnc->burst_ho_cnt > 1 ) + { + dtx_hangover_control( st, lsp_new ); + } + } + + + /*--------------------------------------------------------------------------------* + * Encode TCX20/10 parameters + *--------------------------------------------------------------------------------*/ + + writeTCXparam( st, hBstr, hm_cfg, param_core, nbits_header, nbits_start, nbits_lpc[0] + nbits_lpc[1], NULL, NULL, NULL, -1 ); + + total_nbbits = hBstr->nb_bits_tot - nbits_start; + + + if ( param_core[1 + NOISE_FILL_RANGES] != 0 ) + { + set_f( pitch_buf, hTcxEnc->tcxltp_pitch_int + (float) hTcxEnc->tcxltp_pitch_fr / (float) st->pit_res_max, NB_SUBFR16k ); + } + else + { + set_f( pitch_buf, L_SUBFR, NB_SUBFR16k ); + } + + pop_wmops(); + return; +} + + +/*-------------------------------------------------------------------* + * ivas_acelp_tcx20_switching() + * + * Open-loop ACELP/TCX20 core decision + *-------------------------------------------------------------------*/ + +/*! r: S/M decision (0=speech or noise,1=unclear,2=music) */ +int16_t ivas_acelp_tcx20_switching( + Encoder_State *st, /* i/o: encoder state structure */ + const float *inp, /* i : new input signal */ + const float *wsp, /* i : input weighted signal */ + const float non_staX, /* i : unbound non-stationarity for sp/mu clas.*/ + const float *pitch_fr, /* i : fraction pitch values */ + const float *voicing_fr, /* i : fractional voicing values */ + const float currFlatness, /* i : flatness */ + const float lsp_mid[M], /* i : LSPs at the middle of the frame */ + const float stab_fac, /* i : LP filter stability */ + float *res_cod_SNR_M, + const int16_t flag_16k_smc /* i : flag to compute parameters with 16kHz core */ +) +{ + TCX_ENC_HANDLE hTcxEnc = st->hTcxEnc; + int16_t i, j; + float A_q_tcx[NB_SUBFR16k * ( M + 1 )]; + float dsnr, snr_tcx, snr_acelp; + int16_t iter; + float xn_buf[L_MDCT_OVLP_MAX + L_FRAME_PLUS + L_MDCT_OVLP_MAX]; + float window[L_LOOK_16k]; + float Ap[M + 1]; + float gainlpc[FDNS_NPTS]; + float en[N_MAX / 4]; + float sqGain, ener, tmp, fac, offset; + int16_t L_frame, L_frame_tmp, L_loop; + int16_t overlap; + int16_t tcx_offset; + float *x; + float target; + int16_t T0; + float gain, noise, scale; + float *pt_ener_sfr, ener_sfr[NB_SUBFR16k]; + float pitch_fr_local[4], voicing_fr_local[4]; + int16_t smc_dec_ol; + float y[N_MAX]; + + /* Initialization */ + L_frame = flag_16k_smc ? st->L_frame : L_FRAME; + L_frame_tmp = L_frame; + + x = hTcxEnc->spectrum_long; + + /* Check minimum pitch for quantization */ + for ( i = 0; i < 4; i++ ) + { + pitch_fr_local[i] = pitch_fr[i]; + voicing_fr_local[i] = voicing_fr[i]; + } + + lsp2a_stab( lsp_mid, A_q_tcx, M ); + + /*--------------------------------------------------------------* + * Estimate TCX SNR + *---------------------------------------------------------------*/ + + target = 850.f; + if ( flag_16k_smc ) + { + tcx_offset = st->hTcxCfg->tcx_offset; + + if ( st->last_core == ACELP_CORE ) + { + L_frame += tcx_offset; + + if ( st->hTcxCfg->lfacNext < 0 ) + { + L_frame -= st->hTcxCfg->lfacNext; + tcx_offset = st->hTcxCfg->lfacNext; + } + else + { + tcx_offset = 0; + } + } + + overlap = st->hTcxCfg->tcx_mdct_window_delay; + mvr2r( st->hTcxCfg->tcx_mdct_window, window, L_LOOK_16k ); + } + else + { + overlap = L_LOOK_12k8; + tcx_offset = ( overlap >> 1 ); + mdct_window_sine( window, INT_FS_12k8, overlap, FULL_OVERLAP, st->element_mode ); + + if ( st->last_core == ACELP_CORE ) + { + L_frame += L_frame / 4; + tcx_offset -= L_frame / 4; + } + } + mvr2r( inp - ( overlap >> 1 ) + tcx_offset, xn_buf, L_frame + overlap ); + + if ( st->last_core == ACELP_CORE ) + { + if ( ( tcx_offset < 0 && flag_16k_smc ) || !flag_16k_smc ) + { + set_f( xn_buf, 0.0f, overlap >> 1 ); + } + } + else + { + for ( i = 0; i < overlap; i++ ) + { + xn_buf[i] *= window[i]; + } + } + + for ( i = 0; i < overlap; i++ ) + { + xn_buf[L_frame + i] *= window[overlap - 1 - i]; + } + + TCX_MDCT( xn_buf, x, overlap, L_frame - overlap, overlap, st->element_mode ); + + for ( i = 0; i < L_frame; i++ ) + { + x[i] *= (float) L_frame * inv_sqrt( 2 * NORM_MDCT_FACTOR ); + y[i] = x[i]; + } + + weight_a( A_q_tcx, Ap, GAMMA1, M ); + + lpc2mdct( Ap, M, gainlpc, FDNS_NPTS, 0 ); + + mdct_preShaping( x, L_frame, gainlpc ); + + for ( i = 0; i < L_frame; i += 4 ) + { + ener = 0.01f + x[i] * x[i] + x[i + 1] * x[i + 1] + x[i + 2] * x[i + 2] + x[i + 3] * x[i + 3]; + en[i / 4] = 9.0f + 10.0f * log10f( ener ); + } + + fac = 128.0f; + offset = fac; + + for ( iter = 0; iter < 10; iter++ ) + { + fac *= 0.5f; + offset -= fac; + ener = 0.0f; + + for ( i = 0; i < L_frame / 4; i++ ) + { + tmp = en[i] - offset; + + if ( tmp > 3.0f ) + { + ener += tmp; + } + + if ( ener > target ) + { + offset += fac; + break; + } + } + } + + if ( offset <= 32.f ) + { + offset = -128.f; + } + + sqGain = powf( 10.0f, offset / 20.0f ); + ener = sqGain * sqGain / 12.f * sqrtf( 2.f ) / (float) L_frame; + + if ( !flag_16k_smc ) + { + const int16_t *bands; + const int16_t bands_20[8] = { 0, 5, 9, 19, 34, 51, 81, 111 }; + const int16_t bands_25[8] = { 0, 4, 7, 15, 28, 40, 65, 89 }; + float nrg_s, nrg_n; + + /*Approximate SNR of TCX*/ + set_f( x, sqrtf( ener ), L_frame ); + mdct_noiseShaping( x, L_frame, gainlpc, FDNS_NPTS ); + + if ( st->last_core != ACELP_CORE ) + { + /*25Hz resolution*/ + bands = bands_25; + } + else + { + /*20Hz resolution*/ + bands = bands_20; + } + + for ( iter = 0; iter < 7; iter++ ) + { + nrg_s = 1e-6f; + nrg_n = 1e-6f; + for ( i = bands[iter]; i < bands[iter + 1]; i++ ) + { + nrg_s += y[i] * y[i]; + nrg_n += x[i] * x[i]; + } + res_cod_SNR_M[iter] = nrg_s / nrg_n; + } + } + + snr_tcx = 0.0f; + pt_ener_sfr = ener_sfr; + + L_loop = flag_16k_smc ? L_frame_tmp : L_frame; + + for ( i = 0; i < L_loop; i += L_SUBFR ) + { + *pt_ener_sfr = sum2_f( wsp + i, L_SUBFR ) + 1e-6f; + snr_tcx += log10f( *pt_ener_sfr / ( ener * L_SUBFR ) ); + pt_ener_sfr++; + } + snr_tcx *= ( (float) ( 10 * L_SUBFR ) ) / (float) L_loop; + + + /*--------------------------------------------------------------* + * Estimate ACELP SNR + *---------------------------------------------------------------*/ + + if ( flag_16k_smc ) + { + scale = 0.092f; + } + else + { + scale = 0.059f; + } + + snr_acelp = 0.0f; + fac = flag_16k_smc ? (float) st->sr_core / (float) INT_FS_12k8 : 1.0f; + L_loop = flag_16k_smc ? L_frame_tmp : L_FRAME; + + pt_ener_sfr = ener_sfr; + for ( i = 0; i < L_loop; i += L_SUBFR ) + { + T0 = (int16_t) ( ( fac * pitch_fr_local[(int16_t) ( (float) ( i / L_SUBFR ) / fac + 0.5f )] ) + 0.5f ); + gain = get_gain( wsp + i, wsp + i - T0, L_SUBFR, NULL ); + noise = 1e-6f; + for ( j = 0; j < L_SUBFR; j++ ) + { + tmp = wsp[i + j] - gain * wsp[i + j - T0]; + noise += tmp * tmp; + } + + noise *= scale; + snr_acelp += log10f( *pt_ener_sfr / noise ); + pt_ener_sfr++; + } + + snr_acelp *= ( (float) ( 10 * L_SUBFR ) ) / (float) L_loop; + + + /*--------------------------------------------------------------* + * Switching Decision + *---------------------------------------------------------------*/ + + dsnr = 0.0f; + /* hysteresis for very small SNR differences between ACELP and TCX */ + + /* try to use TCX instead of ACELP on temporally stationary frames */ + if ( ( snr_acelp > snr_tcx ) && ( snr_acelp < snr_tcx + 2.0f ) && + ( st->prevTempFlatness + currFlatness < 3.25f || stab_fac == 1.0f || + ( !flag_16k_smc && st->sp_aud_decision0 > 0 && st->prevTempFlatness + currFlatness < 20.f ) ) && + ( st->Nb_ACELP_frames <= 6 ) ) + { + dsnr = -2.0f; + } + + /* try to use ACELP instead of TCX on transient and "buzzy" frames */ + if ( ( snr_acelp < snr_tcx ) && + ( snr_acelp > snr_tcx - 2.0f ) && + ( st->prevTempFlatness + currFlatness > 3.25f ) && + ( st->Nb_ACELP_frames >= 6 ) ) + { + dsnr = 2.0f; + } + if ( ( !flag_16k_smc ) && ( offset < 74.0f ) && ( non_staX > 5.0f ) && ( snr_acelp >= snr_tcx - 4 ) && st->Nb_ACELP_frames >= 1 && ( ( ( st->hSpMusClas->lps > st->hSpMusClas->lpm ) && mean( voicing_fr_local, 4 ) >= 0.3f ) || ( st->Nb_ACELP_frames >= 6 && ( st->hSpMusClas->lps > st->hSpMusClas->lpm - 1.5f ) ) ) && ( st->sp_aud_decision0 == 0 ) && st->vad_flag ) + { + /* Fine tuned across various databases based on various metrics to detect TCX frames in speech.*/ + dsnr = 4.0f; + } + + if ( st->flag_noisy_speech_snr ) + { + + if ( st->vad_flag || st->Opt_DTX_ON ) + { + dsnr += 2.f; + } + else + { + dsnr -= 2.f; + } + } + + /* Select ACELP or TCX */ + if ( ( snr_acelp + dsnr > snr_tcx ) && ( st->sp_aud_decision0 == 0 || st->prevTempFlatness + currFlatness > 3.25f ) ) + { + smc_dec_ol = 0; + } + else + { + smc_dec_ol = 2; + } + + + st->prevTempFlatness = currFlatness; + + return smc_dec_ol; +} diff --git a/lib_enc/ivas_td_low_rate_enc.c b/lib_enc/ivas_td_low_rate_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..40d10e4850b73f2639a120cb17fecd6f08b79222 --- /dev/null +++ b/lib_enc/ivas_td_low_rate_enc.c @@ -0,0 +1,349 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "cnst.h" +#include "stat_enc.h" +#include "rom_com.h" +#include "ivas_rom_com.h" +#include "ivas_cnst.h" +#include "prot.h" +#include "ivas_prot.h" +#include "wmc_auto.h" + + +/*-------------------------------------------------------------------* + * tdm_low_rate_enc() + * + * Encode secondary channel of TD Stereo with a low-bitrate encoder + *-------------------------------------------------------------------*/ + +void tdm_low_rate_enc( + Encoder_State *st, /* i/o: State structure */ + const float Aq[], /* i : 12k8 Lp coefficient */ + const float *res, /* i : residual signal */ + float *synth, /* i/o: core synthesis */ + float *exc, /* i/o: current non-enhanced excitation */ + float *pitch_buf, /* i/o: floating pitch values for each subframe */ + float *voice_factors, /* o : voicing factors */ + float *bwe_exc, /* o : excitation for SWB TBE */ + const int16_t attack_flag, /* i : GSC attack flag */ + const float *lsf_new, /* i : current frame ISF vector */ + float *tmp_noise /* o : long-term noise energy */ +) +{ + const float *p_Aq; + int16_t i_subfr, nb_subfr, last_pit_bin; + int16_t tmp_nb_bits_tot; + float dct_res[L_FRAME], dct_epit[L_FRAME]; + float exc_wo_nf[L_FRAME]; + LPD_state_HANDLE hLPDmem = st->hLPDmem; + + /*---------------------------------------------------------------* + * Initialization + *---------------------------------------------------------------*/ + + nb_subfr = 2; + + st->GSC_IVAS_mode = 0; + st->GSC_noisy_speech = 1; + st->hGSCEnc->noise_lev = 14; + + hLPDmem->tilt_code = 0.0f; + set_f( dct_epit, 0, L_FRAME ); + set_f( pitch_buf, L_SUBFR, NB_SUBFR ); + last_pit_bin = L_FRAME / 2; + + /*---------------------------------------------------------------* + * DCT transform of the residual and create a subsample residual + *---------------------------------------------------------------*/ + + edct( res, dct_res, L_FRAME, st->element_mode ); + + /*--------------------------------------------------------------------------------------* + * GSC encoder + *--------------------------------------------------------------------------------------*/ + + /* Find the current total number of bits used */ + tmp_nb_bits_tot = st->hBstr->nb_bits_tot; + + if ( st->extl_brate > 0 ) + { + /* subtract 1 bit for TBE/BWE BWE flag (bit counted in extl_brate) */ + tmp_nb_bits_tot--; + } + + gsc_enc( st, dct_res, dct_epit, last_pit_bin, tmp_nb_bits_tot, nb_subfr, lsf_new, exc_wo_nf, tmp_noise ); + + /*--------------------------------------------------------------------------------------* + * iDCT transform + *--------------------------------------------------------------------------------------*/ + + edct( dct_epit, exc, L_FRAME, st->element_mode ); + + edct( exc_wo_nf, exc_wo_nf, L_FRAME, st->element_mode ); + + /*--------------------------------------------------------------------------------------* + * Remove potential pre-echo in case an onset has been detected + *--------------------------------------------------------------------------------------*/ + + pre_echo_att( &st->hGSCEnc->Last_frame_ener, exc, attack_flag, st->last_coder_type, st->L_frame ); + + /*--------------------------------------------------------------------------------------* + * Update BWE excitation + *--------------------------------------------------------------------------------------*/ + + if ( st->hBWE_TD != NULL ) + { + set_f( voice_factors, 0.0f, NB_SUBFR ); + + if ( st->tdm_LRTD_flag ) + { + interp_code_5over2( exc, bwe_exc, L_FRAME ); + } + else + { + set_f( bwe_exc, 0, L_FRAME32k ); + } + } + + /*--------------------------------------------------------------------------------------* + * Synthesis + *--------------------------------------------------------------------------------------*/ + + p_Aq = Aq; + for ( i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR ) + { + syn_filt( p_Aq, M, &exc_wo_nf[i_subfr], &synth[i_subfr], L_SUBFR, hLPDmem->mem_syn, 1 ); + p_Aq += ( M + 1 ); + } + + /*--------------------------------------------------------------------------------------* + * Updates + *--------------------------------------------------------------------------------------*/ + mvr2r( exc_wo_nf, exc, L_FRAME ); + + return; +} + + +/*-------------------------------------------------------------------* + * encod_gen_2sbfr() + * + * Encode GC, 2 subframes mode + *-------------------------------------------------------------------*/ + +void encod_gen_2sbfr( + Encoder_State *st, /* i/o: state structure */ + const float speech[], /* i : input speech */ + const float Aw[], /* i : weighted A(z) unquantized for subframes */ + const float Aq[], /* i : LP coefficients */ + const float *res, /* i : residual signal */ + float *syn, /* i/o: core synthesis */ + float *exc, /* i/o: current non-enhanced excitation */ + float *exc2, /* i/o: current enhanced excitation */ + float *pitch_buf, /* i/o: floating pitch values for each subframe */ + float *voice_factors, /* o : voicing factors */ + float *bwe_exc, /* o : excitation for SWB TBE */ + const int16_t tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag */ + const float tdm_Pri_pitch_buf[] /* i : pitch values for primary channel */ +) +{ + float xn[2 * L_SUBFR]; /* Target vector for pitch search */ + float xn2[2 * L_SUBFR]; /* Target vector for codebook search */ + float cn[2 * L_SUBFR]; /* Target vector in residual domain */ + float h1[2 * L_SUBFR + ( M + 1 )]; /* Impulse response vector */ + float code[2 * L_SUBFR]; /* Fixed codebook excitation */ + float y1[2 * L_SUBFR]; /* Filtered adaptive excitation */ + float y2[2 * L_SUBFR]; /* Filtered algebraic excitation */ + float gain_pit; /* Pitch gain */ + float voice_fac; /* Voicing factor */ + float gain_code; /* Gain of code */ + float gain_inov; /* inovation gain */ + int16_t L_frame, coder_type; /* L_frame; coder type */ + int16_t i, i_subfr; /* tmp variables */ + int16_t T0, T0_frac; /* close loop integer pitch and fractional part */ + int16_t T0_min, T0_max; /* pitch variables */ + float *pt_pitch; /* pointer to floating pitch buffer */ + float g_corr[6]; /* ACELP correl, values + gain pitch */ + float gains_mem[2 * ( NB_SUBFR - 1 )]; /* pitch gain and code gain from previous subframes */ + int16_t clip_gain; /* LSF clip gain */ + const float *p_Aw, *p_Aq; /* pointer to LP filter coeff. vector*/ + float norm_gain_code; + int16_t pitch_limit_flag; + float error; + + LPD_state_HANDLE hLPDmem = st->hLPDmem; + + /*------------------------------------------------------------------* + * Initializations + *------------------------------------------------------------------*/ + + gain_pit = 0; + gain_code = 0; + error = 0.0f; + + T0_max = PIT_MAX; + T0_min = PIT_MIN; + + L_frame = L_FRAME; + coder_type = GENERIC; + + p_Aw = Aw; + p_Aq = Aq; + pt_pitch = pitch_buf; + + /*------------------------------------------------------------------* + * ACELP subframe loop + *------------------------------------------------------------------*/ + + for ( i_subfr = 0; i_subfr < L_frame; i_subfr += 2 * L_SUBFR ) + { + /*----------------------------------------------------------------* + * Find the the excitation search target "xn" and innovation + * target in residual domain "cn" + * Compute impulse response, h1[], of weighted synthesis filter + *----------------------------------------------------------------*/ + + mvr2r( &res[i_subfr], &exc[i_subfr], 2 * L_SUBFR ); + + find_targets( speech, hLPDmem->mem_syn, i_subfr, &hLPDmem->mem_w0, p_Aq, res, 2 * L_SUBFR, p_Aw, st->preemph_fac, xn, cn, h1 ); + + /*------------------------------------------------------------------------* + * Close-loop pitch search on the 1st and 3rd subfr only and quantization + * Adaptive exc. construction + *------------------------------------------------------------------------*/ + + *pt_pitch = pit_encode( st->hBstr, st->acelp_cfg.pitch_bits, st->core_brate, 0, L_frame, coder_type, &pitch_limit_flag, i_subfr, exc, 2 * L_SUBFR, st->pitch, &T0_min, &T0_max, &T0, &T0_frac, h1, xn, tdm_Pitch_reuse_flag, tdm_Pri_pitch_buf ); + + tbe_celp_exc( st->element_mode, st->idchan, bwe_exc, L_frame, 2 * L_SUBFR, i_subfr, T0, T0_frac, &error, st->tdm_LRTD_flag ); + + /*-----------------------------------------------------------------* + * Find adaptive exitation + *-----------------------------------------------------------------*/ + + pred_lt4( &exc[i_subfr], &exc[i_subfr], T0, T0_frac, 2 * L_SUBFR + 1, inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + + /*-----------------------------------------------------------------* + * Gain clipping test to avoid unstable synthesis on frame erasure + *-----------------------------------------------------------------*/ + + clip_gain = gp_clip( st->element_mode, st->core_brate, st->voicing, i_subfr, coder_type, xn, st->clip_var ); + + /*-----------------------------------------------------------------* + * LP filtering of the adaptive excitation, codebook target computation + *-----------------------------------------------------------------*/ + + lp_filt_exc_enc( MODE1, coder_type, i_subfr, exc, h1, xn, y1, xn2, 2 * L_SUBFR, L_frame, g_corr, clip_gain, &gain_pit, &st->acelp_cfg.ltf_mode ); + + /* update long-term pitch gain for speech/music classifier */ + st->hSpMusClas->lowrate_pitchGain = 0.9f * st->hSpMusClas->lowrate_pitchGain + 0.1f * gain_pit; + + /*-----------------------------------------------------------------* + * Innovation encoding + *-----------------------------------------------------------------*/ + + inov_encode( st, st->core_brate, 0, L_frame, st->last_L_frame, coder_type, st->bwidth, st->sharpFlag, i_subfr, -1, p_Aq, gain_pit, cn, exc, h1, hLPDmem->tilt_code, *pt_pitch, xn2, code, y2, &i, 2 * L_SUBFR ); + + /*-----------------------------------------------------------------* + * Gain encoding + *-----------------------------------------------------------------*/ + + gain_enc_lbr( st->hBstr, st->acelp_cfg.gains_mode, coder_type, i_subfr, xn, y1, y2, code, &gain_pit, &gain_code, &gain_inov, &norm_gain_code, g_corr, gains_mem, clip_gain, 2 * L_SUBFR ); + + if ( st->Opt_SC_VBR ) + { + if ( st->hSC_VBR->last_ppp_mode == 1 ) + { + /* SC-VBR - all other st->clip_var values will be updated even in a PPP frame */ + st->clip_var[1] = gain_pit; + } + } + + /*-----------------------------------------------------------------* + * update LP-filtered gains for the case of frame erasures + *-----------------------------------------------------------------*/ + + gp_clip_test_gain_pit( st->element_mode, st->core_brate, gain_pit, st->clip_var ); + + hLPDmem->tilt_code = est_tilt( exc + i_subfr, gain_pit, code, gain_code, &voice_fac, 2 * L_SUBFR, 0 ); + + /*-----------------------------------------------------------------* + * Update memory of the weighting filter + *-----------------------------------------------------------------*/ + + hLPDmem->mem_w0 = xn[2 * L_SUBFR - 1] - ( gain_pit * y1[2 * L_SUBFR - 1] ) - ( gain_code * y2[2 * L_SUBFR - 1] ); + + /*-----------------------------------------------------------------* + * Construct adaptive part of the excitation + * Save the non-enhanced excitation for FEC_exc + *-----------------------------------------------------------------*/ + + for ( i = 0; i < 2 * L_SUBFR; i++ ) + { + exc2[i + i_subfr] = gain_pit * exc[i + i_subfr]; + exc[i + i_subfr] = exc2[i + i_subfr] + gain_code * code[i]; + } + + /*-----------------------------------------------------------------* + * Prepare TBE excitation + *-----------------------------------------------------------------*/ + + prep_tbe_exc( L_frame, L_SUBFR, i_subfr, gain_pit, gain_code, code, voice_fac, &voice_factors[i_subfr / L_SUBFR], bwe_exc, 0, NULL, T0, coder_type, st->core_brate, st->element_mode, st->idchan, st->hBWE_TD != NULL, st->tdm_LRTD_flag ); + + voice_factors[i_subfr / L_SUBFR + 1] = voice_factors[i_subfr / L_SUBFR]; + + /*-----------------------------------------------------------------* + * Synthesize speech to update mem_syn[]. + * Update A(z) filters + *-----------------------------------------------------------------*/ + + syn_filt( p_Aq, M, &exc[i_subfr], &syn[i_subfr], 2 * L_SUBFR, hLPDmem->mem_syn, 1 ); + + p_Aw += 2 * ( M + 1 ); + p_Aq += 2 * ( M + 1 ); + + pt_pitch++; + *pt_pitch = *( pt_pitch - 1 ); + pt_pitch++; + } + + /* SC-VBR */ + if ( st->Opt_SC_VBR ) + { + st->hSC_VBR->prev_ppp_gain_pit = gain_pit; + st->hSC_VBR->prev_tilt_code = hLPDmem->tilt_code; + } + + return; +} diff --git a/lib_enc/lead_indexing.c b/lib_enc/lead_indexing.c new file mode 100644 index 0000000000000000000000000000000000000000..31116dfd1c0277835a626b5d4892abae9e46f34c --- /dev/null +++ b/lib_enc/lead_indexing.c @@ -0,0 +1,208 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "rom_com.h" +#include "prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * Local function prototypes + *-------------------------------------------------------------------*/ + +static int16_t fcb_encode_pos( const int16_t pos_vector[], const int16_t pulse_num, const int16_t pos_num ); + + +/*-------------------------------------------------------------------* + * re8_compute_base_index: + * + * Compute base index for RE8 + *-------------------------------------------------------------------*/ + +void re8_compute_base_index( + const int16_t *x, /* i : Elemen of Q2, Q3 or Q4 */ + const int16_t ka, /* i : Identifier of the absolute leader related to x */ + uint16_t *I /* o : index */ +) +{ + int16_t i, j, k1, m; + int16_t setor_8p[8], setor_8p_temp[8]; + int16_t sign_8p; + int16_t code_index, code_level, code_area; + uint16_t offset; + const int16_t *a1, *a2; + + a1 = vals_a[ka]; + a2 = vals_q[ka]; + + /* the sign process */ + + sign_8p = 0; + m = 0; + code_index = 0; + k1 = a2[0]; + + if ( ( a2[1] == 2 ) && ( a1[0] ^ 1 ) && ( ka != 5 ) ) + { + for ( i = 0; i < 8; i++ ) + { + if ( x[i] != 0 ) + { + sign_8p = sign_8p * 2; + setor_8p_temp[m] = i; + m++; + } + if ( x[i] < 0 ) + { + sign_8p += 1; + } + } + + code_index = fcb_encode_pos( setor_8p_temp, 8, m ); + code_index = ( code_index << k1 ) + sign_8p; + + offset = Is[ka]; + + + *I = offset + code_index; + } + else + { + for ( i = 0; i < 8; i++ ) + { + setor_8p[i] = (int16_t) abs( x[i] ); + + if ( x[i] < 0 ) + { + sign_8p = sign_8p * 2 + 1; + m++; + } + if ( x[i] > 0 ) + { + sign_8p = sign_8p * 2; + m++; + } + } + + if ( k1 != m ) + { + sign_8p = sign_8p >> 1; + } + + /* code level by level */ + + code_level = a2[1]; + code_area = 8; + + if ( a2[2] != 1 ) + { + for ( j = 0; j < code_level - 1; j++ ) + { + m = 0; + + for ( i = 0; i < code_area; i++ ) + { + if ( setor_8p[i] != a1[j] ) + { + setor_8p_temp[m] = i; + setor_8p[m] = setor_8p[i]; + m++; + } + } + code_index *= select_table22[m][code_area]; + + code_index += fcb_encode_pos( setor_8p_temp, code_area, m ); + + code_area = m; + } + } + else + { + for ( i = 0; i < code_area; i++ ) + { + if ( setor_8p[i] == a1[1] ) + { + code_index += i; + } + } + } + + code_index = ( code_index << k1 ) + sign_8p; + + offset = Is[ka]; + + *I = offset + code_index; + } + + return; +} + +/*-------------------------------------------------------------------* + * fcb_encode_pos: + * + * Base function to compute base index for RE8 + *-------------------------------------------------------------------*/ + +/*! r: Code index */ +static int16_t fcb_encode_pos( + const int16_t pos_vector[], /* i : Position vectort */ + const int16_t pulse_num, /* i : Pulse number */ + const int16_t pos_num /* i : Position number */ +) +{ + int16_t i, j; + int16_t code_index; + int16_t temp, temp1; + const int16_t *select_table23; + + temp = pulse_num - 1; + + select_table23 = select_table22[pos_num]; + + code_index = select_table23[pulse_num] - select_table23[pulse_num - pos_vector[0]]; + + for ( i = 0, j = 1; i < pos_num - 1; i++, j++ ) + { + temp1 = pos_num - j; + + select_table23 = select_table22[temp1]; + + code_index += select_table23[temp - pos_vector[i]] - select_table23[pulse_num - pos_vector[j]]; + } + + return code_index; +} diff --git a/lib_enc/lib_enc.c b/lib_enc/lib_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..238de3ab101405383a65fed62ed5058d4ebdef00 --- /dev/null +++ b/lib_enc/lib_enc.c @@ -0,0 +1,2177 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include "lib_enc.h" +#include "ivas_prot.h" +#include "prot.h" +#include +#include +#include +#include +#include "wmc_auto.h" +#include "options.h" + +/*---------------------------------------------------------------------* + * Local struct + *---------------------------------------------------------------------*/ + +struct IVAS_ENC +{ + Encoder_Struct *st_ivas; + ENC_CORE_HANDLE hCoreCoder; + bool isConfigured; + bool switchingActive; /* flag for configuration changes during encoding - currently only used with mono */ + int16_t Opt_RF_ON_loc; + int16_t rf_fec_offset_loc; + bool ismMetadataProvided[MAX_NUM_OBJECTS]; + bool maxBandwidthUser; /* Was a specific max bandwith selected by the user? */ + IVAS_ENC_BANDWIDTH newBandwidthApi; /* maximum encoded bandwidth, as set on API level */ + bool extMetadataApi; /* External metadata requested, to be checked against current bit rate */ +}; + +/*---------------------------------------------------------------------* + * Local functions + *---------------------------------------------------------------------*/ + +static ivas_error configureEncoder( IVAS_ENC_HANDLE hIvasEnc, const int32_t inputFs, const int32_t initBitrate, const IVAS_ENC_BANDWIDTH initBandwidth, const IVAS_ENC_DTX_CONFIG dtxConfig, const IVAS_ENC_CHANNEL_AWARE_CONFIG caConfig ); +static ivas_error setBandwidth( IVAS_ENC_HANDLE hIvasEnc, const IVAS_ENC_BANDWIDTH maxBandwidth ); +static ivas_error setBitrate( IVAS_ENC_HANDLE hIvasEnc, const int32_t totalBitrate ); +static ivas_error setChannelAwareConfig( IVAS_ENC_HANDLE hIvasEnc, const IVAS_ENC_CHANNEL_AWARE_CONFIG caConfig ); +static int16_t getInputBufferSize( const Encoder_Struct *st_ivas ); +static ivas_error doCommonConfigureChecks( IVAS_ENC_HANDLE hIvasEnc ); +static ivas_error doCommonSetterChecks( IVAS_ENC_HANDLE hIvasEnc ); +static ivas_error sanitizeBandwidth( const IVAS_ENC_HANDLE hIvasEnc ); +static ivas_error sanitizeBitrateISM( const ENCODER_CONFIG_HANDLE hEncoderConfig, const bool extMetadataApi ); +static void init_encoder_config( ENCODER_CONFIG_HANDLE hEncoderConfig ); +static void resetIsmMetadataProvidedFlags( IVAS_ENC_HANDLE hIvasEnc ); +static ivas_error bandwidthApiToInternal( const IVAS_ENC_BANDWIDTH maxBandwidth, int16_t *internalMaxBandwidth ); +static ivas_error fecIndicatorApiToInternal( const IVAS_ENC_FEC_INDICATOR fecIndicator, int16_t *fecIndicatorInternal ); + + +/*---------------------------------------------------------------------* + * IVAS_ENC_Open() + * + * Open IVAS encoder + *---------------------------------------------------------------------*/ + +ivas_error IVAS_ENC_Open( + IVAS_ENC_HANDLE *phIvasEnc /* i/o: pointer to an encoder handle to be opened */ +) +{ + Encoder_Struct *st_ivas; + + if ( phIvasEnc == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + /*-----------------------------------------------------------------* + * Allocate and initialize IVAS application encoder handle + *-----------------------------------------------------------------*/ + + if ( ( *phIvasEnc = (IVAS_ENC_HANDLE) malloc( sizeof( struct IVAS_ENC ) ) ) == NULL ) + { + return IVAS_ERR_FAILED_ALLOC; + } + + ( *phIvasEnc )->hCoreCoder = NULL; + ( *phIvasEnc )->isConfigured = false; + ( *phIvasEnc )->switchingActive = false; + ( *phIvasEnc )->maxBandwidthUser = false; + resetIsmMetadataProvidedFlags( *phIvasEnc ); + + /*-----------------------------------------------------------------* + * Allocate IVAS-codec encoder state + *-----------------------------------------------------------------*/ + + if ( ( ( *phIvasEnc )->st_ivas = (Encoder_Struct *) malloc( sizeof( Encoder_Struct ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for IVAS encoder structure" ); + } + + if ( ( ( *phIvasEnc )->st_ivas->hEncoderConfig = (ENCODER_CONFIG_HANDLE) malloc( sizeof( ENCODER_CONFIG ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for Encoder config structure" ); + } + + /*-----------------------------------------------------------------* + * Initialize IVAS-codec encoder state + *-----------------------------------------------------------------*/ + + st_ivas = ( *phIvasEnc )->st_ivas; + + /* initialize encoder Config. handle */ + init_encoder_config( st_ivas->hEncoderConfig ); + + /* initialize pointers to handles to NULL */ + ivas_initialize_handles_enc( st_ivas ); + + st_ivas->ind_list = NULL; + st_ivas->ind_list_metadata = NULL; + + /* set high-level parameters */ + st_ivas->mc_mode = MC_MODE_NONE; + st_ivas->ism_mode = ISM_MODE_NONE; + st_ivas->sba_analysis_order = 0; + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * IVAS_ENC_Close() + * + * + *---------------------------------------------------------------------*/ + +void IVAS_ENC_Close( + IVAS_ENC_HANDLE *phIvasEnc /* i/o: pointer to IVAS encoder handle */ +) +{ + /* Free all memory */ + if ( phIvasEnc == NULL || *phIvasEnc == NULL ) + { + return; + } + + if ( ( *phIvasEnc )->isConfigured ) + { + ivas_destroy_enc( ( *phIvasEnc )->st_ivas ); + } + else + { + if ( ( *phIvasEnc )->st_ivas->hEncoderConfig ) + { + free( ( *phIvasEnc )->st_ivas->hEncoderConfig ); + ( *phIvasEnc )->st_ivas->hEncoderConfig = NULL; + } + free( ( *phIvasEnc )->st_ivas ); + } + + ( *phIvasEnc )->st_ivas = NULL; + + free( *phIvasEnc ); + + *phIvasEnc = NULL; + phIvasEnc = NULL; + + return; +} + + +/*---------------------------------------------------------------------* + * IVAS_ENC_ConfigureForMono() + * + * Configure and initialize the mono encoder. + *---------------------------------------------------------------------*/ + +ivas_error IVAS_ENC_ConfigureForMono( + IVAS_ENC_HANDLE hIvasEnc, /* i/o: IVAS encoder handle */ + const int32_t inputFs, /* i : input sampling frequency */ + const int32_t bitrate, /* i : requested bitrate of the output bitstream */ + const bool max_bwidth_user, /* i : shows if bandwidth limitation was set by the user (true) or if default bandwidth was used (false) */ + const IVAS_ENC_BANDWIDTH maxBandwidth, /* i : bandwidth limitation */ + const IVAS_ENC_DTX_CONFIG dtxConfig, /* i : configuration of DTX, can by set to default by using IVAS_ENC_GetDefaultDtxConfig() */ + const IVAS_ENC_CHANNEL_AWARE_CONFIG caConfig, /* i : configuration of channel-aware mode, can by set to default by using IVAS_ENC_GetDefaultChannelAwareConfig() */ + const bool downmixFromStereo, /* i : if true, the encoder accepts a stereo input and internally downmixes it to mono before encoding */ + const bool is_binaural /* i : if true, the input is binaural audio */ +) +{ + ivas_error error; + + error = IVAS_ERR_OK; + + if ( ( error = doCommonConfigureChecks( hIvasEnc ) ) != IVAS_ERR_OK ) + { + return error; + } + + hIvasEnc->st_ivas->hEncoderConfig->ivas_format = MONO_FORMAT; + hIvasEnc->st_ivas->hEncoderConfig->is_binaural = (int16_t) is_binaural; + + if ( downmixFromStereo ) + { + hIvasEnc->st_ivas->hEncoderConfig->stereo_dmx_evs = 1; + } + hIvasEnc->maxBandwidthUser = max_bwidth_user; + + error = configureEncoder( hIvasEnc, inputFs, bitrate, maxBandwidth, dtxConfig, caConfig ); + + return error; +} + + +/*---------------------------------------------------------------------* + * IVAS_ENC_ConfigureForStereo() + * + * Configure and initialize the stereo encoder. + *---------------------------------------------------------------------*/ + +ivas_error IVAS_ENC_ConfigureForStereo( + IVAS_ENC_HANDLE hIvasEnc, /* i/o: IVAS encoder handle */ + const int32_t inputFs, /* i : input sampling frequency */ + const int32_t bitrate, /* i : requested bitrate of the output bitstream */ + const bool max_bwidth_user, /* i : shows if bandwidth limitation was set by the user (true) or if default bandwidth was used (false) */ + const IVAS_ENC_BANDWIDTH maxBandwidth, /* i : bandwidth limitation */ + const IVAS_ENC_DTX_CONFIG dtxConfig, /* i : configuration of DTX, can by set to default by using IVAS_ENC_GetDefaultDtxConfig() */ + const bool is_binaural /* i : flag indicating if input is binaural audio */ +) +{ + Encoder_Struct *st_ivas; + ENCODER_CONFIG_HANDLE hEncoderConfig; + + ivas_error error; + + if ( ( error = doCommonConfigureChecks( hIvasEnc ) ) != IVAS_ERR_OK ) + { + return error; + } + + st_ivas = hIvasEnc->st_ivas; + hEncoderConfig = st_ivas->hEncoderConfig; + hEncoderConfig->nchan_inp = 2; + hEncoderConfig->ivas_format = STEREO_FORMAT; + hEncoderConfig->is_binaural = (int16_t) is_binaural; + + + hIvasEnc->maxBandwidthUser = max_bwidth_user; + + error = configureEncoder( hIvasEnc, inputFs, bitrate, maxBandwidth, dtxConfig, IVAS_ENC_GetDefaultChannelAwareConfig() ); + + return error; +} + + +/*---------------------------------------------------------------------* + * IVAS_ENC_ConfigureForMASAObjects() + * + * Configure and initialize the combined MASA and ISM encoder. + *---------------------------------------------------------------------*/ + +ivas_error IVAS_ENC_ConfigureForMASAObjects( + IVAS_ENC_HANDLE hIvasEnc, /* i/o: IVAS encoder handle */ + const int32_t inputFs, /* i : input sampling frequency */ + const int32_t bitrate, /* i : requested bitrate of the ouput bitstream */ + const IVAS_ENC_BANDWIDTH maxBandwidth, /* i : bandwidth limitation */ + const IVAS_ENC_DTX_CONFIG dtxConfig, /* i : configuration of DTX, can by set to default by using IVAS_ENC_GetDefaultDtxConfig() */ + const uint16_t numObjects, /* i : number of objects to be encoded */ + const int16_t masaVariant /* i : index specifying the number of MASA transport channels */ +) +{ + Encoder_Struct *st_ivas; + ivas_error error; + + if ( ( error = doCommonConfigureChecks( hIvasEnc ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( numObjects > MAX_NUM_OBJECTS ) + { + return IVAS_ERR_TOO_MANY_INPUTS; + } + st_ivas = hIvasEnc->st_ivas; + switch ( masaVariant ) + { + case IVAS_ENC_MASA_2CH: + st_ivas->hEncoderConfig->nchan_inp = CPE_CHANNELS + numObjects; + st_ivas->hEncoderConfig->element_mode_init = IVAS_CPE_DFT; /* initialization only, might be changed later based on element_brate */ + break; + case IVAS_ENC_MASA_1CH: + st_ivas->hEncoderConfig->nchan_inp = 1 + numObjects; + st_ivas->hEncoderConfig->element_mode_init = IVAS_CPE_DFT; /* initialization only, might be changed later based on element_brate */ + break; + default: + return IVAS_ERR_INVALID_MASA_CONFIG; + break; + } + + st_ivas = hIvasEnc->st_ivas; + + /* Currently this is true but it is already shown in descriptive metadata that there can be inequality for this. */ + st_ivas->nchan_transport = st_ivas->hEncoderConfig->nchan_inp - numObjects; + st_ivas->hEncoderConfig->ivas_format = MASA_ISM_FORMAT; + st_ivas->hEncoderConfig->nchan_ism = numObjects; + + return configureEncoder( hIvasEnc, inputFs, bitrate, maxBandwidth, dtxConfig, IVAS_ENC_GetDefaultChannelAwareConfig() ); +} + + +/*---------------------------------------------------------------------* + * IVAS_ENC_ConfigureForObjects() + * + * Configure and initialize the ISM encoder. + *---------------------------------------------------------------------*/ + +ivas_error IVAS_ENC_ConfigureForObjects( + IVAS_ENC_HANDLE hIvasEnc, /* i/o: IVAS encoder handle */ + const int32_t inputFs, /* i : input sampling frequency */ + const int32_t bitrate, /* i : requested bitrate of the output bitstream */ + const bool max_bwidth_user, /* i : shows if bandwidth limitation was set by the user (true) or if default bandwidth was used (false) */ + const IVAS_ENC_BANDWIDTH maxBandwidth, /* i : bandwidth limitation */ + const IVAS_ENC_DTX_CONFIG dtxConfig, /* i : configuration of DTX, can by set to default by using IVAS_ENC_GetDefaultDtxConfig() */ + const uint16_t numObjects, /* i : number of objects to be encoded */ + const bool ism_extended_metadata /* i : Extended metadata used (true/false), where extended metadata includes radius and orientation */ +) +{ + Encoder_Struct *st_ivas; + ivas_error error; + + if ( ( error = doCommonConfigureChecks( hIvasEnc ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( numObjects > MAX_NUM_OBJECTS ) + { + return IVAS_ERR_TOO_MANY_INPUTS; + } + + st_ivas = hIvasEnc->st_ivas; + st_ivas->hEncoderConfig->ivas_format = ISM_FORMAT; + st_ivas->hEncoderConfig->element_mode_init = IVAS_SCE; + st_ivas->hEncoderConfig->nchan_inp = numObjects; + st_ivas->hEncoderConfig->nchan_ism = numObjects; + st_ivas->hEncoderConfig->ism_extended_metadata_flag = ism_extended_metadata; + hIvasEnc->extMetadataApi = ( ism_extended_metadata == 1 ); + hIvasEnc->maxBandwidthUser = max_bwidth_user; + + error = configureEncoder( hIvasEnc, inputFs, bitrate, maxBandwidth, dtxConfig, IVAS_ENC_GetDefaultChannelAwareConfig() ); + + return error; +} + + +/*---------------------------------------------------------------------* + * IVAS_ENC_FeedObjectMetadata() + * + * + *---------------------------------------------------------------------*/ + +ivas_error IVAS_ENC_FeedObjectMetadata( + IVAS_ENC_HANDLE hIvasEnc, /* i/o: IVAS encoder handle */ + const uint16_t ismIndex, /* i : object index */ + const IVAS_ISM_METADATA metadata /* i : object metadata handle for current frame */ +) +{ + ivas_error error; + + error = IVAS_ERR_OK; + + if ( !hIvasEnc->isConfigured ) + { + return IVAS_ERR_NOT_CONFIGURED; + } + + if ( hIvasEnc->st_ivas->hEncoderConfig->ivas_format != ISM_FORMAT && hIvasEnc->st_ivas->hEncoderConfig->ivas_format != MASA_ISM_FORMAT && hIvasEnc->st_ivas->hEncoderConfig->ivas_format != SBA_ISM_FORMAT ) + { + return IVAS_ERR_METADATA_NOT_EXPECTED; + } + + if ( ismIndex > hIvasEnc->st_ivas->hEncoderConfig->nchan_inp ) + { + return IVAS_ERR_INVALID_INDEX; + } + + error = ivas_set_ism_metadata( hIvasEnc->st_ivas->hIsmMetaData[ismIndex], metadata.azimuth, metadata.elevation, metadata.radius, metadata.yaw, metadata.pitch, metadata.non_diegetic_flag ); + + if ( error != IVAS_ERR_OK ) + { + return error; + } + + hIvasEnc->ismMetadataProvided[ismIndex] = true; + + return error; +} + + +/*---------------------------------------------------------------------* + * IVAS_ENC_ConfigureForAmbisonics() + * + * Configure and initialize the SBA encoder. + *---------------------------------------------------------------------*/ + +ivas_error IVAS_ENC_ConfigureForAmbisonics( + IVAS_ENC_HANDLE hIvasEnc, /* i/o: IVAS encoder handle */ + const int32_t inputFs, /* i : input sampling frequency */ + const int32_t bitrate, /* i : requested bitrate of the output bitstream */ + const bool max_bwidth_user, /* i : shows if bandwidth limitation was set by the user (true) or if default bandwidth was used (false) */ + const IVAS_ENC_BANDWIDTH maxBandwidth, /* i : bandwidth limitation */ + const IVAS_ENC_DTX_CONFIG dtxConfig, /* i : configuration of DTX, can by set to default by using IVAS_ENC_GetDefaultDtxConfig() */ + const IVAS_ENC_SBA_ORDER order, /* i : order of the Ambisonics input */ + const bool isPlanar, /* i : if true, input is treated as planar Ambisonics */ + const bool Opt_PCA_ON /* i : PCA option flag */ +) +{ + ENCODER_CONFIG_HANDLE hEncoderConfig; + ivas_error error; + + if ( ( error = doCommonConfigureChecks( hIvasEnc ) ) != IVAS_ERR_OK ) + { + return error; + } + + hEncoderConfig = hIvasEnc->st_ivas->hEncoderConfig; + + hEncoderConfig->ivas_format = SBA_FORMAT; + hEncoderConfig->element_mode_init = IVAS_SCE; /* Just needs to be something not mono, will be set later */ + hEncoderConfig->sba_planar = isPlanar; + hEncoderConfig->sba_order = order; + + /* Input in ACN/SN3D in all cases (3D and planar): get number of channels */ + hEncoderConfig->nchan_inp = ivas_sba_get_nchan( hEncoderConfig->sba_order, 0 ); /*planar input arg. deliberately set to zero since input always in ACN/SN3D*/ + + + hEncoderConfig->Opt_PCA_ON = (int16_t) Opt_PCA_ON; + + hIvasEnc->maxBandwidthUser = max_bwidth_user; + + error = configureEncoder( hIvasEnc, inputFs, bitrate, maxBandwidth, dtxConfig, IVAS_ENC_GetDefaultChannelAwareConfig() ); + + + return error; +} + +/*---------------------------------------------------------------------* + * IVAS_ENC_ConfigureForSBAObjects() + * + * Configure and initialize the combined SBA and ISM encoder. + *---------------------------------------------------------------------*/ + +ivas_error IVAS_ENC_ConfigureForSBAObjects( + IVAS_ENC_HANDLE hIvasEnc, /* i/o: IVAS encoder handle */ + const int32_t inputFs, /* i : input sampling frequency */ + const int32_t bitrate, /* i : requested bitrate of the ouput bitstream */ + const IVAS_ENC_BANDWIDTH maxBandwidth, /* i : bandwidth limitation */ + const IVAS_ENC_DTX_CONFIG dtxConfig, /* i : configuration of DTX, can by set to default by using IVAS_ENC_GetDefaultDtxConfig() */ + const uint16_t numObjects, /* i : number of objects to be encoded */ + const IVAS_ENC_SBA_ORDER order, /* i : order of the Ambisonics input */ + const bool isPlanar, /* i : if true, input is treated as planar Ambisonics */ + const bool Opt_PCA_ON /* i : PCA option flag */ +) +{ + Encoder_Struct *st_ivas; + ivas_error error; + + if ( ( error = doCommonConfigureChecks( hIvasEnc ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( numObjects > MAX_NUM_OBJECTS ) + { + return IVAS_ERR_TOO_MANY_INPUTS; + } + st_ivas = hIvasEnc->st_ivas; + + st_ivas->hEncoderConfig->element_mode_init = IVAS_SCE; /* Just needs to be something not mono, will be set later */ + st_ivas->hEncoderConfig->sba_planar = isPlanar; + st_ivas->hEncoderConfig->sba_order = order; + + /* Input in ACN/SN3D in all cases (3D and planar): get number of channels */ + /*Input file will always contain all channels for a given order irrespective of planar flag*/ + st_ivas->hEncoderConfig->nchan_inp = ivas_sba_get_nchan( st_ivas->hEncoderConfig->sba_order, 0 ) + numObjects; + + st_ivas->hEncoderConfig->Opt_PCA_ON = (int16_t) Opt_PCA_ON; + + /* Currently this is true but it is already shown in descriptive metadata that there can be inequality for this. */ + st_ivas->nchan_transport = st_ivas->hEncoderConfig->nchan_inp - numObjects; + st_ivas->hEncoderConfig->ivas_format = SBA_ISM_FORMAT; + st_ivas->hEncoderConfig->nchan_ism = numObjects; + + return configureEncoder( hIvasEnc, inputFs, bitrate, maxBandwidth, dtxConfig, IVAS_ENC_GetDefaultChannelAwareConfig() ); +} + + +/*---------------------------------------------------------------------* + * IVAS_ENC_ConfigureForMasa() + * + * Configure and initialize the MASA encoder. + *---------------------------------------------------------------------*/ + +ivas_error IVAS_ENC_ConfigureForMasa( + IVAS_ENC_HANDLE hIvasEnc, /* i/o: IVAS encoder handle */ + const int32_t inputFs, /* i : input sampling frequency */ + const int32_t bitrate, /* i : requested bitrate of the output bitstream */ + const bool max_bwidth_user, /* i : shows if bandwidth limitation was set by the user (true) or if default bandwidth was used (false) */ + const IVAS_ENC_BANDWIDTH maxBandwidth, /* i : bandwidth limitation */ + const IVAS_ENC_DTX_CONFIG dtxConfig, /* i : configuration of DTX, can by set to default by using IVAS_ENC_GetDefaultDtxConfig() */ + const IVAS_ENC_MASA_VARIANT masaVariant /* i : type of MASA input (either 1 or 2 channels) */ +) +{ + ENCODER_CONFIG_HANDLE hEncoderConfig; + ivas_error error; + + if ( ( error = doCommonConfigureChecks( hIvasEnc ) ) != IVAS_ERR_OK ) + { + return error; + } + + hEncoderConfig = hIvasEnc->st_ivas->hEncoderConfig; + + hEncoderConfig->ivas_format = MASA_FORMAT; + + switch ( masaVariant ) + { + case IVAS_ENC_MASA_1CH: + hEncoderConfig->nchan_inp = 1; + hEncoderConfig->element_mode_init = IVAS_SCE; + break; + case IVAS_ENC_MASA_2CH: + hEncoderConfig->nchan_inp = 2; + hEncoderConfig->element_mode_init = IVAS_CPE_DFT; /* initialization only, might be changed later based on element_brate */ + break; + default: + return IVAS_ERR_INVALID_MASA_CONFIG; + break; + } + + hIvasEnc->maxBandwidthUser = max_bwidth_user; + + error = configureEncoder( hIvasEnc, inputFs, bitrate, maxBandwidth, dtxConfig, IVAS_ENC_GetDefaultChannelAwareConfig() ); + + return error; +} + + +/*---------------------------------------------------------------------* + * IVAS_ENC_FeedMasaMetadata() + * + * + *---------------------------------------------------------------------*/ + +ivas_error IVAS_ENC_FeedMasaMetadata( + IVAS_ENC_HANDLE hIvasEnc, /* i/o: IVAS encoder handle */ + IVAS_MASA_METADATA_HANDLE hMasaMetadata /* i : MASA metadata for current frame */ +) +{ + if ( !hIvasEnc->isConfigured ) + { + return IVAS_ERR_NOT_CONFIGURED; + } + + if ( hIvasEnc->st_ivas->hEncoderConfig->ivas_format != MASA_FORMAT && hIvasEnc->st_ivas->hEncoderConfig->ivas_format != MASA_ISM_FORMAT ) + { + return IVAS_ERR_METADATA_NOT_EXPECTED; + } + + hIvasEnc->st_ivas->hMasa->masaMetadata = *hMasaMetadata; + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * IVAS_ENC_ConfigureForMultichannel() + * + * Configure and initialize the MC encoder. + *---------------------------------------------------------------------*/ + +ivas_error IVAS_ENC_ConfigureForMultichannel( + IVAS_ENC_HANDLE hIvasEnc, /* i/o: IVAS encoder handle */ + const int32_t inputFs, /* i : input sampling frequency */ + const int32_t bitrate, /* i : requested bitrate of the output bitstream */ + const bool max_bwidth_user, /* i : shows if bandwidth limitation was set by the user (true) or if default bandwidth was used (false) */ + const IVAS_ENC_BANDWIDTH maxBandwidth, /* i : bandwidth limitation */ + const IVAS_ENC_DTX_CONFIG dtxConfig, /* i : configuration of DTX, can by set to default by using IVAS_ENC_GetDefaultDtxConfig() */ + const IVAS_ENC_MC_LAYOUT mcLayout /* i : inpu MC layput */ +) +{ + ENCODER_CONFIG_HANDLE hEncoderConfig; + ivas_error error; + + if ( ( error = doCommonConfigureChecks( hIvasEnc ) ) != IVAS_ERR_OK ) + { + return error; + } + + hEncoderConfig = hIvasEnc->st_ivas->hEncoderConfig; + + hEncoderConfig->ivas_format = MC_FORMAT; + hEncoderConfig->element_mode_init = IVAS_CPE_MDCT; /*just for initialization*/ + + switch ( mcLayout ) + { + case IVAS_ENC_MC_5_1: + hEncoderConfig->mc_input_setup = MC_LS_SETUP_5_1; + break; + case IVAS_ENC_MC_7_1: + hEncoderConfig->mc_input_setup = MC_LS_SETUP_7_1; + break; + case IVAS_ENC_MC_5_1_2: + hEncoderConfig->mc_input_setup = MC_LS_SETUP_5_1_2; + break; + case IVAS_ENC_MC_5_1_4: + hEncoderConfig->mc_input_setup = MC_LS_SETUP_5_1_4; + break; + case IVAS_ENC_MC_7_1_4: + hEncoderConfig->mc_input_setup = MC_LS_SETUP_7_1_4; + break; + default: + return IVAS_ERR_INVALID_MC_LAYOUT; + break; + } + + hEncoderConfig->nchan_inp = ivas_mc_ls_setup_get_num_channels( hEncoderConfig->mc_input_setup ); + + hIvasEnc->maxBandwidthUser = max_bwidth_user; + + error = configureEncoder( hIvasEnc, inputFs, bitrate, maxBandwidth, dtxConfig, IVAS_ENC_GetDefaultChannelAwareConfig() ); + + return error; +} + + +/*---------------------------------------------------------------------* + * configureEncoder() + * + * Configure the IVAS encoder. + *---------------------------------------------------------------------*/ + +static ivas_error configureEncoder( + IVAS_ENC_HANDLE hIvasEnc, + const int32_t inputFs, + const int32_t initBitrate, + const IVAS_ENC_BANDWIDTH initBandwidth, + const IVAS_ENC_DTX_CONFIG dtxConfig, + const IVAS_ENC_CHANNEL_AWARE_CONFIG caConfig ) +{ + Encoder_Struct *st_ivas; + ENCODER_CONFIG_HANDLE hEncoderConfig; + ivas_error error; + int32_t cpe_brate; + + error = IVAS_ERR_OK; + + st_ivas = hIvasEnc->st_ivas; + hEncoderConfig = st_ivas->hEncoderConfig; + + /*-----------------------------------------------------------------* + * Bandwidth limitation + *-----------------------------------------------------------------*/ + + if ( ( error = setBandwidth( hIvasEnc, initBandwidth ) ) != IVAS_ERR_OK ) + { + return error; + } + + /*-----------------------------------------------------------------* + * DTX/CNG + *-----------------------------------------------------------------*/ + + if ( dtxConfig.enabled ) + { + hEncoderConfig->Opt_DTX_ON = 1; + + if ( dtxConfig.variable_SID_rate ) + { + hEncoderConfig->var_SID_rate_flag = 1; + hEncoderConfig->interval_SID = 0; + } + else + { + hEncoderConfig->var_SID_rate_flag = 0; + + if ( dtxConfig.SID_interval >= 3 && dtxConfig.SID_interval <= 100 ) + { + hEncoderConfig->interval_SID = dtxConfig.SID_interval; + } + else + { + return IVAS_ERR_INVALID_DTX_UPDATE_RATE; + } + } + } + else + { + hEncoderConfig->Opt_DTX_ON = 0; + } + + /*-----------------------------------------------------------------* + * Bitrate + *-----------------------------------------------------------------*/ + + hEncoderConfig->ivas_total_brate = initBitrate; + + /* SC-VBR at 5.90 kbps */ + if ( hEncoderConfig->ivas_total_brate == ACELP_5k90 ) + { + hEncoderConfig->ivas_total_brate = ACELP_7k20; + hEncoderConfig->Opt_SC_VBR = 1; + hEncoderConfig->last_Opt_SC_VBR = hEncoderConfig->Opt_SC_VBR; + + if ( hEncoderConfig->max_bwidth != NB ) + { + hEncoderConfig->max_bwidth = WB; + } + } + + /* check if the entered bitrate is supported */ + if ( hEncoderConfig->ivas_format != UNDEFINED_FORMAT && hEncoderConfig->ivas_format != MONO_FORMAT ) /* IVAS */ + { + if ( !is_IVAS_bitrate( hEncoderConfig->ivas_total_brate ) ) + { + if ( hEncoderConfig->Opt_SC_VBR ) + { + return IVAS_ERROR( IVAS_ERR_INVALID_BITRATE, "Incorrect bitrate specification in IVAS [bps]: %d", ACELP_5k90 ); + } + else + { + return IVAS_ERROR( IVAS_ERR_INVALID_BITRATE, "Incorrect bitrate specification in IVAS [bps]: %d", hEncoderConfig->ivas_total_brate ); + } + } + + if ( hEncoderConfig->ivas_format == STEREO_FORMAT ) + { + { + hEncoderConfig->element_mode_init = IVAS_CPE_DFT; + if ( hEncoderConfig->ivas_total_brate >= MIN_BRATE_MDCT_STEREO ) + { + hEncoderConfig->element_mode_init = IVAS_CPE_MDCT; + } + } + + if ( ( hEncoderConfig->element_mode_init == IVAS_CPE_TD || hEncoderConfig->element_mode_init == IVAS_CPE_DFT ) && hEncoderConfig->ivas_total_brate > IVAS_48k ) + { + return IVAS_ERROR( IVAS_ERR_INVALID_BITRATE, "Too high bitrate for TD/DFT Stereo specified in IVAS: %d", hEncoderConfig->ivas_total_brate ); + } + + if ( hEncoderConfig->element_mode_init == IVAS_CPE_MDCT && hEncoderConfig->ivas_total_brate < IVAS_48k ) + { + return IVAS_ERROR( IVAS_ERR_INVALID_BITRATE, "Too low bitrate for MDCT Stereo specified in IVAS: %d", hEncoderConfig->ivas_total_brate ); + } + + if ( hEncoderConfig->ivas_total_brate > IVAS_256k ) + { + return IVAS_ERROR( IVAS_ERR_INVALID_BITRATE, "Too high bitrate for Stereo specified in IVAS: %d", hEncoderConfig->ivas_total_brate ); + } + } + else if ( hEncoderConfig->ivas_format == ISM_FORMAT ) + { + if ( ( error = sanitizeBitrateISM( hEncoderConfig, hIvasEnc->extMetadataApi ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( hEncoderConfig->ivas_format == SBA_FORMAT ) + { + /* nothing */ + } + else if ( hEncoderConfig->ivas_format == MASA_FORMAT ) + { + /* adapt element_mode according to the bitrate */ + if ( hEncoderConfig->nchan_inp == 2 && hEncoderConfig->element_mode_init != IVAS_SCE ) + { + if ( hEncoderConfig->ivas_total_brate >= IVAS_48k ) + { + hEncoderConfig->element_mode_init = IVAS_CPE_MDCT; + } + else if ( hEncoderConfig->ivas_total_brate < MASA_STEREO_MIN_BITRATE ) + { + hEncoderConfig->element_mode_init = IVAS_CPE_DFT; + } + } + } + else if ( hEncoderConfig->ivas_format == MASA_ISM_FORMAT ) + { + st_ivas->ism_mode = ivas_omasa_ism_mode_select( st_ivas->hEncoderConfig->ivas_total_brate, hEncoderConfig->nchan_ism ); + + cpe_brate = calculate_cpe_brate_MASA_ISM( st_ivas->ism_mode, st_ivas->hEncoderConfig->ivas_total_brate, hEncoderConfig->nchan_ism ); + + /*adapt element_mode according to the bit-rate*/ + if ( hEncoderConfig->element_mode_init != IVAS_SCE ) + { + if ( cpe_brate >= IVAS_48k ) + { + hEncoderConfig->element_mode_init = IVAS_CPE_MDCT; + } + } + } + else if ( hEncoderConfig->ivas_format == SBA_ISM_FORMAT ) + { + st_ivas->ism_mode = ISM_MODE_NONE; + } + } + else /* EVS mono */ + { + hEncoderConfig->ivas_format = MONO_FORMAT; + hEncoderConfig->element_mode_init = EVS_MONO; + + if ( !is_EVS_bitrate( hEncoderConfig->ivas_total_brate, &hEncoderConfig->Opt_AMR_WB ) ) + { + return IVAS_ERROR( IVAS_ERR_INVALID_BITRATE, "Incorrect bitrate specification in EVS mono: %d", hEncoderConfig->ivas_total_brate ); + } + + if ( hEncoderConfig->stereo_dmx_evs == 1 ) + { + hEncoderConfig->nchan_inp = 2; + } + } + + /*-----------------------------------------------------------------* + * Input sampling frequency + *-----------------------------------------------------------------*/ + + if ( inputFs != 8000 && inputFs != 16000 && inputFs != 32000 && inputFs != 48000 ) + { + return IVAS_ERR_INVALID_SAMPLING_RATE; + } + + hEncoderConfig->input_Fs = inputFs; + + /*-----------------------------------------------------------------* + * Channel-aware mode + *-----------------------------------------------------------------*/ + + if ( ( error = setChannelAwareConfig( hIvasEnc, caConfig ) ) != IVAS_ERR_OK ) + { + return error; + } + + /*-----------------------------------------------------------------* + * Set codec mode + *-----------------------------------------------------------------*/ + + st_ivas->codec_mode = MODE1; /* Note: in IVAS, set MODE1 */ + + if ( hEncoderConfig->ivas_format == MONO_FORMAT ) + { + if ( hEncoderConfig->Opt_AMR_WB ) + { + st_ivas->codec_mode = MODE1; + } + else + { + st_ivas->codec_mode = get_codec_mode( hEncoderConfig->ivas_total_brate ); + } + } + + if ( hEncoderConfig->ivas_total_brate == IVAS_13k2 && hEncoderConfig->Opt_RF_ON == 1 ) + { + st_ivas->codec_mode = MODE2; + } + + st_ivas->last_codec_mode = st_ivas->codec_mode; + + /*-----------------------------------------------------------------* + * Sanity checks + *-----------------------------------------------------------------*/ + + assert( hEncoderConfig->ivas_format != UNDEFINED_FORMAT && "\n IVAS format undefined" ); + + if ( ( hEncoderConfig->ivas_format != MONO_FORMAT || hEncoderConfig->stereo_dmx_evs ) && hEncoderConfig->input_Fs == 8000 ) + { + return IVAS_ERROR( IVAS_ERR_INVALID_SAMPLING_RATE, "8kHz input sampling rate is not supported in IVAS." ); + } + + if ( hEncoderConfig->Opt_DTX_ON && hEncoderConfig->ivas_format != MONO_FORMAT && + ( ( hEncoderConfig->ivas_format == SBA_FORMAT && ivas_get_sba_num_TCs( hEncoderConfig->ivas_total_brate, 1 ) > 2 ) || + hEncoderConfig->ivas_format == MC_FORMAT || hEncoderConfig->ivas_format == MASA_ISM_FORMAT || hEncoderConfig->ivas_format == SBA_ISM_FORMAT ) ) + { + return IVAS_ERROR( IVAS_ERR_DTX_NOT_SUPPORTED, "DTX is not supported in this IVAS format and element mode." ); + } + + + if ( hEncoderConfig->Opt_PCA_ON && !( hEncoderConfig->ivas_format == SBA_FORMAT && hEncoderConfig->ivas_total_brate == PCA_BRATE && hEncoderConfig->sba_order == SBA_FOA_ORDER ) ) + { + return IVAS_ERROR( IVAS_ERR_NOT_SUPPORTED_OPTION, "PCA supported at SBA FOA 256 kbps only." ); + } + + if ( ( error = sanitizeBandwidth( hIvasEnc ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( hEncoderConfig->is_binaural && !( ( hEncoderConfig->ivas_format == MONO_FORMAT && hEncoderConfig->stereo_dmx_evs ) || hEncoderConfig->ivas_format == STEREO_FORMAT ) ) + { + return IVAS_ERROR( IVAS_ERR_NOT_SUPPORTED_OPTION, "'-binaural' option is supported only with '-stereo' or '-stereo_dmx_evs'" ); + } + + /*-----------------------------------------------------------------* + * Finalize initialization + *-----------------------------------------------------------------*/ + + if ( ( error = ivas_init_encoder( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( hEncoderConfig->ivas_format == MONO_FORMAT ) + { + hIvasEnc->hCoreCoder = st_ivas->hSCE[0]->hCoreCoder[0]; /* Note: this is needed for switching in EVS mono */ + } + else + { + hIvasEnc->hCoreCoder = NULL; + } + + hIvasEnc->Opt_RF_ON_loc = hEncoderConfig->Opt_RF_ON; + hIvasEnc->rf_fec_offset_loc = hEncoderConfig->rf_fec_offset; + + hIvasEnc->isConfigured = true; + + return error; +} + + +/*---------------------------------------------------------------------* + * IVAS_ENC_GetDelay() + * + * + *---------------------------------------------------------------------*/ + +ivas_error IVAS_ENC_GetDelay( + const IVAS_ENC_HANDLE hIvasEnc, /* i : IVAS encoder handle */ + int16_t *delay /* o : encoder delay */ +) +{ + ENCODER_CONFIG_HANDLE hEncoderConfig; + + hEncoderConfig = hIvasEnc->st_ivas->hEncoderConfig; + + if ( !hIvasEnc->isConfigured ) + { + return IVAS_ERR_NOT_CONFIGURED; + } + + if ( delay == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + *delay = NS2SA( hEncoderConfig->input_Fs, get_delay( ENC, hEncoderConfig->input_Fs, hEncoderConfig->ivas_format, NULL ) ); + + *delay *= hEncoderConfig->nchan_inp; + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * getInputBufferSize() + * + * + *---------------------------------------------------------------------*/ + +static int16_t getInputBufferSize( + const Encoder_Struct *st_ivas /* i : IVAS encoder handle */ +) +{ + return (int16_t) ( st_ivas->hEncoderConfig->input_Fs * st_ivas->hEncoderConfig->nchan_inp / FRAMES_PER_SEC ); +} + +/*---------------------------------------------------------------------* + * IVAS_ENC_GetNumInChannels() + * + * + *---------------------------------------------------------------------*/ +ivas_error IVAS_ENC_GetNumInChannels( + const IVAS_ENC_HANDLE hIvasEnc, /* i/o: IVAS encoder handle */ + int16_t *numInChannels /* o : total number of samples expected in the input buffer for current encoder configuration */ +) +{ + if ( hIvasEnc == NULL || numInChannels == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + if ( !hIvasEnc->isConfigured ) + { + return IVAS_ERR_NOT_CONFIGURED; + } + + *numInChannels = hIvasEnc->st_ivas->hEncoderConfig->nchan_inp; + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * IVAS_ENC_GetInputBufferSize() + * + * + *---------------------------------------------------------------------*/ + +ivas_error IVAS_ENC_GetInputBufferSize( + const IVAS_ENC_HANDLE hIvasEnc, /* i : IVAS encoder handle */ + int16_t *inputBufferSize /* o : total number of samples expected in the input buffer for current encoder configuration */ +) +{ + if ( !hIvasEnc->isConfigured ) + { + return IVAS_ERR_NOT_CONFIGURED; + } + + if ( inputBufferSize == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + *inputBufferSize = getInputBufferSize( hIvasEnc->st_ivas ); + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * IVAS_ENC_EncodeFrameToSerial() + * + * Main function to encode one frame to a serial bitstream + *---------------------------------------------------------------------*/ + +ivas_error IVAS_ENC_EncodeFrameToSerial( + IVAS_ENC_HANDLE hIvasEnc, /* i/o: IVAS encoder handle */ + int16_t *inputBuffer, /* i : PCM input */ + int16_t inputBufferSize, /* i : total number of samples in the input buffer. Related function: IVAS_ENC_GetInputBufferSize() */ + uint16_t *outputBitStream, /* o : pointer to serial output bitstream. The array must already be allocated and be of size at least IVAS_MAX_BITS_PER_FRAME */ + uint16_t *numOutBits /* o : number of bits written to output bitstream. Each bit is stored as a single uint16_t value */ +) +{ + Encoder_Struct *st_ivas; + ENCODER_CONFIG_HANDLE hEncoderConfig; + ENC_CORE_HANDLE hCoreCoder; + int16_t i; + int16_t n, ch; + ivas_error error; + + error = IVAS_ERR_OK; + + if ( !hIvasEnc->isConfigured ) + { + return IVAS_ERR_NOT_CONFIGURED; + } + + st_ivas = hIvasEnc->st_ivas; + hEncoderConfig = st_ivas->hEncoderConfig; + hCoreCoder = hIvasEnc->hCoreCoder; + + if ( inputBufferSize != getInputBufferSize( st_ivas ) ) + { + return IVAS_ERR_INVALID_INPUT_BUFFER_SIZE; + } + + if ( ( error = sanitizeBandwidth( hIvasEnc ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( hEncoderConfig->ivas_format == ISM_FORMAT ) + { + for ( i = 0; i < hEncoderConfig->nchan_inp; ++i ) + { + if ( !hIvasEnc->ismMetadataProvided[i] ) + { + ivas_ism_reset_metadata_API( hIvasEnc->st_ivas->hIsmMetaData[i] ); + } + } + resetIsmMetadataProvidedFlags( hIvasEnc ); + } + + if ( ( hEncoderConfig->Opt_RF_ON && ( hEncoderConfig->ivas_total_brate != ACELP_13k20 || hEncoderConfig->input_Fs == 8000 || hEncoderConfig->max_bwidth == NB ) ) || hEncoderConfig->rf_fec_offset == 0 ) + { + if ( hEncoderConfig->ivas_total_brate == ACELP_13k20 && hEncoderConfig->ivas_format == MONO_FORMAT ) + { + st_ivas->codec_mode = MODE1; + reset_rf_indices( hCoreCoder->hRF, hCoreCoder->L_frame, &( hCoreCoder->rf_target_bits_write ) ); + } + hEncoderConfig->Opt_RF_ON = 0; + hEncoderConfig->rf_fec_offset = 0; + hIvasEnc->switchingActive = true; + } + + if ( hIvasEnc->Opt_RF_ON_loc && hIvasEnc->rf_fec_offset_loc != 0 && L_sub( hEncoderConfig->ivas_total_brate, ACELP_13k20 ) == 0 && L_sub( hEncoderConfig->input_Fs, 8000 ) != 0 && hEncoderConfig->max_bwidth != NB ) + { + st_ivas->codec_mode = MODE2; + if ( hEncoderConfig->Opt_RF_ON == 0 && hEncoderConfig->ivas_format == MONO_FORMAT ) + { + reset_rf_indices( hCoreCoder->hRF, hCoreCoder->L_frame, &( hCoreCoder->rf_target_bits_write ) ); + } + hEncoderConfig->Opt_RF_ON = 1; + hEncoderConfig->rf_fec_offset = hIvasEnc->rf_fec_offset_loc; + hIvasEnc->switchingActive = true; + } + + /* in case of 8kHz sampling rate or when in "max_band NB" mode, limit the total bitrate to 24.40 kbps */ + if ( ( ( hEncoderConfig->input_Fs == 8000 ) || ( hEncoderConfig->max_bwidth == NB ) ) && ( hEncoderConfig->ivas_total_brate > ACELP_24k40 ) ) + { + hEncoderConfig->ivas_total_brate = ACELP_24k40; + st_ivas->codec_mode = MODE2; + hIvasEnc->switchingActive = true; + } + + /*-----------------------------------------------------------------* + * Re-allocate and re-initialize buffer of indices if IVAS total bitrate has changed + *-----------------------------------------------------------------*/ + + if ( hEncoderConfig->ivas_total_brate != hEncoderConfig->last_ivas_total_brate ) + { + /* de-allocate old buffer of indices */ + free( st_ivas->ind_list ); + + /* set the maximum allowed number of indices in the list */ + st_ivas->ivas_max_num_indices = get_ivas_max_num_indices( hEncoderConfig->ivas_format, hEncoderConfig->ivas_total_brate ); + + /* allocate new buffer of indices */ + if ( ( st_ivas->ind_list = (INDICE_HANDLE) malloc( st_ivas->ivas_max_num_indices * sizeof( Indice ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for buffer of indices!\n" ) ); + } + + /* reset the list of indices */ + for ( i = 0; i < st_ivas->ivas_max_num_indices; i++ ) + { + st_ivas->ind_list[i].nb_bits = -1; + } + + /* de-allocate old buffer of metadata indices */ + if ( st_ivas->ind_list_metadata != NULL ) + { + free( st_ivas->ind_list_metadata ); + } + + /* set the maximum allowed number of metadata indices in the list */ + st_ivas->ivas_max_num_indices_metadata = get_ivas_max_num_indices_metadata( hEncoderConfig->ivas_format, hEncoderConfig->ivas_total_brate ); + + if ( st_ivas->ivas_max_num_indices_metadata > 0 ) + { + /* allocate new buffer of metadata indices */ + if ( ( st_ivas->ind_list_metadata = (INDICE_HANDLE) malloc( st_ivas->ivas_max_num_indices_metadata * sizeof( Indice ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for buffer of metadata indices!\n" ) ); + } + + /* reset the list of metadata indices */ + for ( i = 0; i < st_ivas->ivas_max_num_indices_metadata; i++ ) + { + st_ivas->ind_list_metadata[i].nb_bits = -1; + } + } + else + { + st_ivas->ind_list_metadata = NULL; + } + + /* set pointers to the new buffers of indices in each element */ + for ( n = 0; n < st_ivas->nSCE; n++ ) + { + st_ivas->hSCE[n]->hCoreCoder[0]->hBstr->ind_list = st_ivas->ind_list; + st_ivas->hSCE[n]->hCoreCoder[0]->hBstr->ivas_ind_list_zero = &st_ivas->ind_list; + + if ( st_ivas->hSCE[n]->hMetaData != NULL ) + { + st_ivas->hSCE[n]->hMetaData->ind_list = st_ivas->ind_list_metadata; + st_ivas->hSCE[n]->hMetaData->ivas_ind_list_zero = &st_ivas->ind_list_metadata; + } + } + + for ( n = 0; n < st_ivas->nCPE; n++ ) + { + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + st_ivas->hCPE[n]->hCoreCoder[ch]->hBstr->ind_list = st_ivas->ind_list; + st_ivas->hCPE[n]->hCoreCoder[ch]->hBstr->ivas_ind_list_zero = &st_ivas->ind_list; + } + + if ( st_ivas->hCPE[n]->hMetaData != NULL ) + { + st_ivas->hCPE[n]->hMetaData->ind_list = st_ivas->ind_list_metadata; + st_ivas->hCPE[n]->hMetaData->ivas_ind_list_zero = &st_ivas->ind_list_metadata; + } + } + } + + if ( hIvasEnc->switchingActive && hEncoderConfig->ivas_format == MONO_FORMAT ) + { + copy_encoder_config( st_ivas, hCoreCoder, 0 ); + hEncoderConfig->last_ivas_total_brate = hEncoderConfig->ivas_total_brate; + } + + /* run the main encoding routine */ + if ( hEncoderConfig->ivas_format == MONO_FORMAT ) /* EVS mono */ + { + hCoreCoder->total_brate = hEncoderConfig->ivas_total_brate; /* needed in case of bitrate switching */ + + if ( hEncoderConfig->stereo_dmx_evs == 1 ) + { + inputBufferSize /= 2; + stereo_dmx_evs_enc( st_ivas->hStereoDmxEVS, hEncoderConfig->input_Fs, inputBuffer, inputBufferSize, hEncoderConfig->is_binaural ); + } + + if ( hEncoderConfig->Opt_AMR_WB ) + { + amr_wb_enc( hCoreCoder, inputBuffer, st_ivas->mem_hp20_in[0], inputBufferSize ); + } + else + { + if ( ( error = evs_enc( hCoreCoder, inputBuffer, st_ivas->mem_hp20_in[0], inputBufferSize ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + else /* IVAS */ + { + if ( ( error = ivas_enc( st_ivas, inputBuffer, inputBufferSize ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* write indices into bitstream buffer */ + write_indices_ivas( st_ivas, outputBitStream, numOutBits ); + + /* Reset switching flag before next call - can be set to "true" by some setters */ + hIvasEnc->switchingActive = false; + + return error; +} + + +/*---------------------------------------------------------------------* + * IVAS_ENC_EncodeFrameToCompact() + * + * Main function to encode one frame to a compact bitstream (bytestream) + *---------------------------------------------------------------------*/ + +ivas_error IVAS_ENC_EncodeFrameToCompact( + IVAS_ENC_HANDLE hIvasEnc, /* i/o: IVAS encoder handle */ + int16_t *inputBuffer, /* i : PCM input */ + const int16_t inputBufferSize, /* i : total number of samples in the input buffer. Related function: IVAS_ENC_GetInputBufferSize() */ + uint8_t *outputBitStream, /* o : pointer to compact output bitstream. The array must already be allocated. */ + uint16_t *numOutBits /* o : number of bits written to output bitstream */ +) +{ + ivas_error error; + uint16_t bitstream[IVAS_MAX_BITS_PER_FRAME]; + + if ( ( error = IVAS_ENC_EncodeFrameToSerial( hIvasEnc, inputBuffer, inputBufferSize, bitstream, numOutBits ) ) != IVAS_ERR_OK ) + { + return error; + } + + convertSerialToBytestream( bitstream, *numOutBits, outputBitStream ); + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * IVAS_ENC_SetBandwidth() + * + * + *---------------------------------------------------------------------*/ + +ivas_error IVAS_ENC_SetBandwidth( + IVAS_ENC_HANDLE hIvasEnc, /* i/o: IVAS encoder handle */ + const IVAS_ENC_BANDWIDTH maxBandwidth /* i : bandwidth limitation to be used */ +) +{ + ivas_error error; + + /* Do additional checks for user-facing function */ + if ( ( error = doCommonSetterChecks( hIvasEnc ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Use internal function to set bandiwdth */ + return setBandwidth( hIvasEnc, maxBandwidth ); +} + + +/*---------------------------------------------------------------------* + * IVAS_ENC_SetBitrate() + * + * + *---------------------------------------------------------------------*/ + +ivas_error IVAS_ENC_SetBitrate( + IVAS_ENC_HANDLE hIvasEnc, /* i/o: IVAS encoder handle */ + const int32_t totalBitrate /* i : requested bitrate of the output bitstream */ +) +{ + ivas_error error; + + /* Do additional checks for user-facing function */ + if ( ( error = doCommonSetterChecks( hIvasEnc ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Use internal function to set bitrate */ + return setBitrate( hIvasEnc, totalBitrate ); +} + + +/*---------------------------------------------------------------------* + * IVAS_ENC_SetChannelAwareConfig() + * + * Sets the configuration of channel-aware mode. Since CA mode is only + * supported at 13.2 kbps, this function has no effect at other bitrates. + *---------------------------------------------------------------------*/ + +ivas_error IVAS_ENC_SetChannelAwareConfig( + IVAS_ENC_HANDLE hIvasEnc, /* i/o: IVAS encoder handle */ + const IVAS_ENC_CHANNEL_AWARE_CONFIG rfConfig /* i : configuration of channel-aware mode */ +) +{ + ivas_error error; + + /* Do additional checks for user-facing function */ + if ( ( error = doCommonSetterChecks( hIvasEnc ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Use internal function to set CA config */ + return setChannelAwareConfig( hIvasEnc, rfConfig ); +} + + + + +/*---------------------------------------------------------------------* + * IVAS_ENC_GetDefaultBandwidth() + * + * + *---------------------------------------------------------------------*/ + +IVAS_ENC_BANDWIDTH IVAS_ENC_GetDefaultBandwidth( const bool isEVS ) +{ + IVAS_ENC_BANDWIDTH bwidth = IVAS_ENC_BANDWIDTH_FB; + + if ( isEVS ) + { + bwidth = IVAS_ENC_BANDWIDTH_SWB; + } + + return bwidth; +} + + +/*---------------------------------------------------------------------* + * IVAS_ENC_GetDefaultDtxConfig() + * + * + *---------------------------------------------------------------------*/ + +IVAS_ENC_DTX_CONFIG IVAS_ENC_GetDefaultDtxConfig( void ) +{ + IVAS_ENC_DTX_CONFIG defaultDtxConfig; + defaultDtxConfig.enabled = false; + defaultDtxConfig.SID_interval = 0; + defaultDtxConfig.variable_SID_rate = false; + + return defaultDtxConfig; +} + + +/*---------------------------------------------------------------------* + * IVAS_ENC_GetDefaultChannelAwareConfig() + * + * + *---------------------------------------------------------------------*/ + +IVAS_ENC_CHANNEL_AWARE_CONFIG IVAS_ENC_GetDefaultChannelAwareConfig( void ) +{ + IVAS_ENC_CHANNEL_AWARE_CONFIG defaultCaConfig; + defaultCaConfig.channelAwareModeEnabled = 0; + defaultCaConfig.fec_indicator = IVAS_ENC_FEC_HI; + defaultCaConfig.fec_offset = 0; + + return defaultCaConfig; +} + + +/*---------------------------------------------------------------------* + * IVAS_ENC_GetErrorMessage() + * + * + *---------------------------------------------------------------------*/ + +const char *IVAS_ENC_GetErrorMessage( + ivas_error error /* i : encoder error code enum */ +) +{ + return ivas_error_to_string( error ); +} + + +/*---------------------------------------------------------------------* + * Local functions + *---------------------------------------------------------------------*/ + +static ivas_error printConfigInfo_enc( + IVAS_ENC_HANDLE hIvasEnc, + const int16_t channelAwareModeEnabled ) +{ + Encoder_Struct *st_ivas; + ENCODER_CONFIG_HANDLE hEncoderConfig; + int16_t newBandwidthApi; + ivas_error error; + + st_ivas = hIvasEnc->st_ivas; + hEncoderConfig = st_ivas->hEncoderConfig; + + /*-----------------------------------------------------------------* + * Print input signal sampling frequency + *-----------------------------------------------------------------*/ + + fprintf( stdout, "Input sampling rate: %d Hz\n", hEncoderConfig->input_Fs ); + + /*-----------------------------------------------------------------* + * Print bitrate + *-----------------------------------------------------------------*/ + + if ( st_ivas->hEncoderConfig->Opt_SC_VBR ) + { + fprintf( stdout, "Average bitrate: %.2f kbps\n", (float) ACELP_5k90 / 1000 ); + } + else + { + fprintf( stdout, "Bitrate: %.2f kbps\n", (float) hEncoderConfig->ivas_total_brate / 1000 ); + } + + /*-----------------------------------------------------------------* + * Print IVAS format + *-----------------------------------------------------------------*/ + + if ( hEncoderConfig->ivas_format == MONO_FORMAT ) + { + if ( hEncoderConfig->stereo_dmx_evs ) + { + fprintf( stdout, "IVAS format: stereo downmix to bit-exact EVS mono\n" ); + } + else + { + fprintf( stdout, "IVAS format: bit-exact EVS mono\n" ); + } + } + else if ( hEncoderConfig->ivas_format == STEREO_FORMAT ) + { + if ( hEncoderConfig->element_mode_init != IVAS_CPE_MDCT ) + { + fprintf( stdout, "IVAS format: stereo - Unified stereo\n" ); + } + else + { + fprintf( stdout, "IVAS format: stereo - MDCT stereo\n" ); + } + } + else if ( hEncoderConfig->ivas_format == ISM_FORMAT ) + { + if ( hEncoderConfig->ivas_total_brate <= ACELP_32k && hEncoderConfig->nchan_inp > 2 ) + { + fprintf( stdout, "IVAS format: Param-ISM (%i streams)\n", hEncoderConfig->nchan_inp ); + } + else + { + fprintf( stdout, "IVAS format: ISM (%i streams)\n", hEncoderConfig->nchan_inp ); + } + } + else if ( hEncoderConfig->ivas_format == SBA_FORMAT ) + { + fprintf( stdout, "IVAS format: Scene Based Audio, Ambisonic order %i %s ", hEncoderConfig->sba_order, hEncoderConfig->sba_planar ? "(Planar)" : "" ); + if ( hEncoderConfig->Opt_PCA_ON ) + { + fprintf( stdout, "- PCA configured with signal adaptive decision " ); + } + + fprintf( stdout, "\n" ); + } + else if ( hEncoderConfig->ivas_format == MASA_FORMAT ) + { + fprintf( stdout, "IVAS format: MASA format\n" ); + } + else if ( hEncoderConfig->ivas_format == MC_FORMAT ) + { + if ( hEncoderConfig->mc_input_setup == MC_LS_SETUP_5_1 ) + { + fprintf( stdout, "IVAS mode: Multi-Channel 5.1 \n" ); + } + else if ( hEncoderConfig->mc_input_setup == MC_LS_SETUP_7_1 ) + { + fprintf( stdout, "IVAS mode: Multi-Channel 7.1 \n" ); + } + else if ( hEncoderConfig->mc_input_setup == MC_LS_SETUP_5_1_2 ) + { + fprintf( stdout, "IVAS mode: Multi-Channel 5.1+2 \n" ); + } + else if ( hEncoderConfig->mc_input_setup == MC_LS_SETUP_5_1_4 ) + { + fprintf( stdout, "IVAS mode: Multi-Channel 5.1+4\n" ); + } + else if ( hEncoderConfig->mc_input_setup == MC_LS_SETUP_7_1_4 ) + { + fprintf( stdout, "IVAS mode: Multi-Channel 7.1+4\n" ); + } + } + else if ( hEncoderConfig->ivas_format == SBA_ISM_FORMAT ) + { + fprintf( stdout, "IVAS format: combined ISM and SBA (%i ISM stream(s))\n", hEncoderConfig->nchan_ism ); + } + else if ( hEncoderConfig->ivas_format == MASA_ISM_FORMAT ) + { + fprintf( stdout, "IVAS format: combined ISM and MASA (%i ISM stream(s))\n", hEncoderConfig->nchan_ism ); + } + + if ( hEncoderConfig->is_binaural ) + { + fprintf( stdout, "Optional indication: binaural audio\n" ); + } + + /*-----------------------------------------------------------------* + * Print CNG update interval, if DTX is activated + *-----------------------------------------------------------------*/ + + if ( hEncoderConfig->Opt_DTX_ON ) + { + if ( hEncoderConfig->var_SID_rate_flag ) + { + fprintf( stdout, "DTX: ON, variable CNG update interval\n" ); + } + else + { + fprintf( stdout, "DTX: ON, CNG update interval = %d frames\n", hEncoderConfig->interval_SID ); + } + } + + /*-----------------------------------------------------------------* + * Print potential limitation of audio bandwidth + *-----------------------------------------------------------------*/ + + if ( ( error = bandwidthApiToInternal( hIvasEnc->newBandwidthApi, &newBandwidthApi ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( st_ivas->hEncoderConfig->Opt_SC_VBR && !hEncoderConfig->Opt_DTX_ON ) + { + return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "\nError: SC-VBR 5900 bps not supported without DTX\n\n" ); + } + + if ( hEncoderConfig->ivas_format == MONO_FORMAT ) + { + if ( newBandwidthApi != hEncoderConfig->max_bwidth ) + { + if ( newBandwidthApi == FB ) + { + fprintf( stdout, "\nFB coding not supported below %.2f kbps. ", ACELP_16k40 / 1000.f ); + if ( hEncoderConfig->max_bwidth == WB ) + { + fprintf( stdout, "Switching to WB.\n" ); + } + else + { + fprintf( stdout, "Switching to SWB.\n" ); + } + } + else if ( newBandwidthApi == SWB ) + { + fprintf( stdout, "\nSWB coding not supported below %.2f kbps. Switching to WB.\n", ACELP_9k60 / 1000.f ); + } + } + + /* in case of 8kHz input sampling or "-max_band NB", require the total bitrate to be below 24.40 kbps */ + if ( ( newBandwidthApi == NB || hEncoderConfig->input_Fs == 8000 ) && hEncoderConfig->ivas_total_brate > ACELP_24k40 ) + { + fprintf( stdout, "\nError: Unsupported mode NB %d bps, NB mode supports rates 5900-24400 bps\n\n", hEncoderConfig->ivas_total_brate ); + return IVAS_ERR_INVALID_BITRATE; + } + } + else + { + if ( newBandwidthApi != hEncoderConfig->max_bwidth ) + { + if ( hEncoderConfig->ivas_format == ISM_FORMAT ) + { + fprintf( stdout, "\nFB coding not supported below %.2f kbps for %i objects. Switching to SWB.\n", hEncoderConfig->nchan_ism * MIN_BRATE_FB_ISM / 1000.f, hEncoderConfig->nchan_ism ); + } + else + { + fprintf( stdout, "\nFB coding not supported below %.2f kbps. Switching to SWB.\n", MIN_BRATE_FB_STEREO / 1000.f ); + } + } + } + + /*-----------------------------------------------------------------* + * Print Channel-aware limitation + *-----------------------------------------------------------------*/ + + if ( channelAwareModeEnabled ) + { + if ( hEncoderConfig->Opt_RF_ON == 0 ) + { + fprintf( stdout, "\nChannel-aware mode is supported at 13.2 kbps 32/48 kHz only. Switching to normal mode.\n" ); + } + } + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * setBitrate() + * + * + *---------------------------------------------------------------------*/ + +static ivas_error setBitrate( + IVAS_ENC_HANDLE hIvasEnc, + const int32_t totalBitrate ) +{ + Encoder_Struct *st_ivas; + ENCODER_CONFIG_HANDLE hEncoderConfig; + ivas_error error; + + st_ivas = hIvasEnc->st_ivas; + hEncoderConfig = st_ivas->hEncoderConfig; + + hEncoderConfig->ivas_total_brate = totalBitrate; + hIvasEnc->switchingActive = true; + + /* channel-aware mode is supported only at 13.20 kbps */ + if ( hEncoderConfig->Opt_RF_ON && hEncoderConfig->ivas_total_brate != ACELP_13k20 ) + { + assert( 0 && "\nChannel-aware mode is supported only at 13.20 kbps\n" ); + hEncoderConfig->Opt_RF_ON = 0; + } + + if ( hEncoderConfig->ivas_total_brate == ACELP_5k90 ) + { + st_ivas->hEncoderConfig->Opt_SC_VBR = 1; + hEncoderConfig->ivas_total_brate = ACELP_7k20; + } + else + { + st_ivas->hEncoderConfig->Opt_SC_VBR = 0; + } + + /* check if the entered bitrate is supported */ + if ( hEncoderConfig->element_mode_init > EVS_MONO ) + { + if ( !is_IVAS_bitrate( hEncoderConfig->ivas_total_brate ) ) + { + return IVAS_ERROR( IVAS_ERR_INVALID_BITRATE, "Incorrect bitrate specification in IVAS: %d", hEncoderConfig->ivas_total_brate ); + } + } + else + { + if ( !is_EVS_bitrate( hEncoderConfig->ivas_total_brate, &hEncoderConfig->Opt_AMR_WB ) ) + { + return IVAS_ERROR( IVAS_ERR_INVALID_BITRATE, "Incorrect bitrate specification in EVS mono: %d", hEncoderConfig->ivas_total_brate ); + } + + /* in case of 8kHz signal, limit the total bitrate to 24.40 kbps */ + if ( hEncoderConfig->input_Fs == 8000 && hEncoderConfig->ivas_total_brate > ACELP_24k40 ) + { + hEncoderConfig->ivas_total_brate = ACELP_24k40; + } + } + + if ( hEncoderConfig->ivas_format == ISM_FORMAT ) + { + if ( ( error = sanitizeBitrateISM( hEncoderConfig, hIvasEnc->extMetadataApi ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + st_ivas->codec_mode = MODE1; + + if ( hEncoderConfig->element_mode_init == EVS_MONO ) + { + if ( hEncoderConfig->Opt_AMR_WB ) + { + st_ivas->codec_mode = MODE1; + } + else + { + st_ivas->codec_mode = get_codec_mode( hEncoderConfig->ivas_total_brate ); + } + } + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * setChannelAwareConfig() + * + * + *---------------------------------------------------------------------*/ + +static ivas_error setChannelAwareConfig( + IVAS_ENC_HANDLE hIvasEnc, + const IVAS_ENC_CHANNEL_AWARE_CONFIG caConfig ) +{ + int16_t newFecIndicator; + ivas_error error; + Encoder_Struct *st_ivas; + ENCODER_CONFIG_HANDLE hEncoderConfig; + + st_ivas = hIvasEnc->st_ivas; + hEncoderConfig = st_ivas->hEncoderConfig; + + /* channel-aware mode is supported only at 13.20 kbps and with WB or SWB bandwidth */ + if ( ( caConfig.channelAwareModeEnabled && st_ivas->hEncoderConfig->ivas_total_brate != ACELP_13k20 ) || ( hEncoderConfig->Opt_RF_ON && hEncoderConfig->input_Fs == 8000 ) ) + { + hEncoderConfig->Opt_RF_ON = 0; + hEncoderConfig->rf_fec_offset = 0; + return IVAS_ERR_OK; + } + + if ( caConfig.channelAwareModeEnabled ) + { + hEncoderConfig->Opt_RF_ON = 1; + + /* Convert FEC indicator from API type */ + if ( ( error = fecIndicatorApiToInternal( caConfig.fec_indicator, &newFecIndicator ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Set new values only if they differ from current values */ + if ( ( newFecIndicator != hEncoderConfig->rf_fec_indicator || caConfig.fec_offset != hEncoderConfig->rf_fec_offset ) ) + { + hEncoderConfig->rf_fec_indicator = newFecIndicator; + + /* Check if new FEC offset has a valid value */ + if ( caConfig.fec_offset == 0 || caConfig.fec_offset == 2 || caConfig.fec_offset == 3 || caConfig.fec_offset == 5 || caConfig.fec_offset == 7 ) + { + hEncoderConfig->rf_fec_offset = caConfig.fec_offset; + } + else + { + return IVAS_ERR_INVALID_FEC_OFFSET; + } + + hIvasEnc->switchingActive = true; + } + + /* Save a copy of FEC offset value - needed during encoding */ + hIvasEnc->rf_fec_offset_loc = hEncoderConfig->rf_fec_offset; + } + else + { + hEncoderConfig->Opt_RF_ON = 0; + } + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * doCommonConfigureChecks() + * + * + *---------------------------------------------------------------------*/ + +static ivas_error doCommonConfigureChecks( + IVAS_ENC_HANDLE hIvasEnc ) +{ + if ( hIvasEnc == NULL || hIvasEnc->st_ivas == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + if ( hIvasEnc->isConfigured ) + { + return IVAS_ERR_RECONFIGURE_NOT_SUPPORTED; + } + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * doCommonSetterChecks() + * + * + *---------------------------------------------------------------------*/ + +static ivas_error doCommonSetterChecks( + IVAS_ENC_HANDLE hIvasEnc ) +{ + if ( hIvasEnc == NULL || hIvasEnc->st_ivas == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + /* Currently settings can be changed only after configuration step */ + if ( !hIvasEnc->isConfigured ) + { + return IVAS_ERR_NOT_CONFIGURED; + } + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * sanitizeBandwidth() + * + * + *---------------------------------------------------------------------*/ + +static ivas_error sanitizeBandwidth( + const IVAS_ENC_HANDLE hIvasEnc ) +{ + ENCODER_CONFIG_HANDLE hEncoderConfig; + int16_t max_bwidth_tmp; + + hEncoderConfig = hIvasEnc->st_ivas->hEncoderConfig; + + max_bwidth_tmp = hIvasEnc->newBandwidthApi; + + /* Prevent st_ivas->max_bwidth from being higher than Fs/2 */ + if ( hEncoderConfig->input_Fs == 8000 && max_bwidth_tmp > NB ) + { + max_bwidth_tmp = NB; + } + else if ( hEncoderConfig->input_Fs == 16000 && max_bwidth_tmp > WB ) + { + max_bwidth_tmp = WB; + } + else if ( hEncoderConfig->input_Fs == 32000 && max_bwidth_tmp > SWB ) + { + max_bwidth_tmp = SWB; + } + + /* NB coding not supported in IVAS. Switching to WB. */ + if ( max_bwidth_tmp == NB && hEncoderConfig->ivas_format != UNDEFINED_FORMAT && hEncoderConfig->ivas_format != MONO_FORMAT ) + { + if ( hEncoderConfig->input_Fs >= 16000 ) + { + max_bwidth_tmp = WB; + } + else + { + return IVAS_ERR_INVALID_BITRATE; + } + } + + if ( hEncoderConfig->ivas_format == MONO_FORMAT ) + { +#if 0 // IVAS_fmToDo: temporary disabled to keep EVS bit-exactness -> to be verified + if ( max_bwidth_tmp == FB && hEncoderConfig->ivas_total_brate < ACELP_16k40 ) + { + if ( hEncoderConfig->ivas_total_brate < ACELP_9k60 ) + { + max_bwidth_tmp = WB; + } + else + { + max_bwidth_tmp = SWB; + } + } + + if ( max_bwidth_tmp == SWB && hEncoderConfig->ivas_total_brate < ACELP_9k60 ) + { + max_bwidth_tmp = WB; + } + + /* in case of 8kHz input sampling or "-max_band NB", require the total bitrate to be below 24.40 kbps */ + if ( ( max_bwidth_tmp == NB || hEncoderConfig->input_Fs == 8000 ) && hEncoderConfig->ivas_total_brate > ACELP_24k40 ) + { + if ( hEncoderConfig->input_Fs >= 16000 ) + { + max_bwidth_tmp = WB; + } + else + { + return IVAS_ERR_INVALID_BITRATE; + } + } +#endif + } + else + { + if ( max_bwidth_tmp == FB && ( ( hEncoderConfig->ivas_format != ISM_FORMAT && hEncoderConfig->ivas_total_brate < MIN_BRATE_FB_STEREO ) || + ( hEncoderConfig->ivas_format == ISM_FORMAT && hEncoderConfig->ivas_total_brate / hEncoderConfig->nchan_ism < MIN_BRATE_FB_ISM ) ) ) + { + max_bwidth_tmp = SWB; + } + } + + if ( hEncoderConfig->max_bwidth != max_bwidth_tmp ) + { + hEncoderConfig->max_bwidth = max_bwidth_tmp; + hIvasEnc->switchingActive = true; + } + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * sanitizeBitrateISM() + * + * + *---------------------------------------------------------------------*/ + +static ivas_error sanitizeBitrateISM( + const ENCODER_CONFIG_HANDLE hEncoderConfig, + const bool extMetadataApi ) +{ + if ( hEncoderConfig->ivas_total_brate > IVAS_128k && hEncoderConfig->nchan_inp == 1 ) + { + return IVAS_ERROR( IVAS_ERR_INVALID_BITRATE, "Too high bitrate for 1 ISM specified in IVAS: %d", hEncoderConfig->ivas_total_brate ); + } + + if ( hEncoderConfig->ivas_total_brate > IVAS_256k && hEncoderConfig->nchan_inp == 2 ) + { + return IVAS_ERROR( IVAS_ERR_INVALID_BITRATE, "Too high bitrate for 2 ISM specified in IVAS: %d", hEncoderConfig->ivas_total_brate ); + } + + if ( hEncoderConfig->ivas_total_brate > IVAS_384k && hEncoderConfig->nchan_inp == 3 ) + { + return IVAS_ERROR( IVAS_ERR_INVALID_BITRATE, "Too high bitrate for 3 ISM specified in IVAS: %d", hEncoderConfig->ivas_total_brate ); + } + + if ( hEncoderConfig->ivas_total_brate < IVAS_16k4 && hEncoderConfig->nchan_inp == 2 ) + { + return IVAS_ERROR( IVAS_ERR_INVALID_BITRATE, "Too low bitrate for 2 ISM specified in IVAS: %d", hEncoderConfig->ivas_total_brate ); + } + + if ( hEncoderConfig->ivas_total_brate < IVAS_24k4 && hEncoderConfig->nchan_inp == 3 ) + { + return IVAS_ERROR( IVAS_ERR_INVALID_BITRATE, "Too low bitrate for 3 ISM specified in IVAS: %d", hEncoderConfig->ivas_total_brate ); + } + + if ( hEncoderConfig->ivas_total_brate < IVAS_24k4 && hEncoderConfig->nchan_inp == 4 ) + { + return IVAS_ERROR( IVAS_ERR_INVALID_BITRATE, "Too low bitrate for 4 ISM specified in IVAS: %d", hEncoderConfig->ivas_total_brate ); + } + + if ( extMetadataApi ) + { + hEncoderConfig->ism_extended_metadata_flag = ( hEncoderConfig->ivas_total_brate >= ISM_EXTENDED_METADATA_BRATE ); + } + else + { + hEncoderConfig->ism_extended_metadata_flag = 0; + } + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * setBandwidth() + * + * + *---------------------------------------------------------------------*/ + +static ivas_error setBandwidth( + IVAS_ENC_HANDLE hIvasEnc, + const IVAS_ENC_BANDWIDTH maxBandwidth ) +{ + ivas_error error; + int16_t newBandwidth; + ENCODER_CONFIG_HANDLE hEncoderConfig; + + hEncoderConfig = hIvasEnc->st_ivas->hEncoderConfig; + + /* Convert bandwidth from API type */ + if ( ( error = bandwidthApiToInternal( maxBandwidth, &newBandwidth ) ) != IVAS_ERR_OK ) + { + return error; + } + + hIvasEnc->newBandwidthApi = newBandwidth; + + /* NB coding not supported in IVAS. Switching to WB. */ + if ( newBandwidth == NB && hEncoderConfig->ivas_format != UNDEFINED_FORMAT && hEncoderConfig->ivas_format != MONO_FORMAT ) + { + newBandwidth = WB; + } + + if ( hEncoderConfig->max_bwidth != newBandwidth ) + { + hEncoderConfig->max_bwidth = newBandwidth; + hIvasEnc->switchingActive = true; + } + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * resetIsmMetadataProvidedFlags() + * + * + *---------------------------------------------------------------------*/ + +static void resetIsmMetadataProvidedFlags( + IVAS_ENC_HANDLE hIvasEnc ) +{ + int16_t i; + + for ( i = 0; i < MAX_NUM_OBJECTS; ++i ) + { + hIvasEnc->ismMetadataProvided[i] = false; + } + + return; +} + + +/*---------------------------------------------------------------------* + * bandwidthApiToInternal() + * + * + *---------------------------------------------------------------------*/ + +static ivas_error bandwidthApiToInternal( + const IVAS_ENC_BANDWIDTH maxBandwidth, + int16_t *internalMaxBandwidth ) +{ + switch ( maxBandwidth ) + { + case IVAS_ENC_BANDWIDTH_NB: + *internalMaxBandwidth = NB; + break; + case IVAS_ENC_BANDWIDTH_WB: + *internalMaxBandwidth = WB; + break; + case IVAS_ENC_BANDWIDTH_SWB: + *internalMaxBandwidth = SWB; + break; + case IVAS_ENC_BANDWIDTH_FB: + *internalMaxBandwidth = FB; + break; + case IVAS_ENC_BANDWIDTH_UNDEFINED: + default: + return IVAS_ERR_INVALID_BANDWIDTH; + break; + } + + return IVAS_ERR_OK; +} + + + +/*---------------------------------------------------------------------* + * fecIndicatorApiToInternal() + * + * + *---------------------------------------------------------------------*/ + +static ivas_error fecIndicatorApiToInternal( + const IVAS_ENC_FEC_INDICATOR fecIndicator, + int16_t *fecIndicatorInternal ) +{ + switch ( fecIndicator ) + { + case IVAS_ENC_FEC_LO: + *fecIndicatorInternal = 0; + break; + case IVAS_ENC_FEC_HI: + *fecIndicatorInternal = 1; + break; + default: + return IVAS_ERR_INTERNAL; + break; + } + + return IVAS_ERR_OK; +} + + + +/*---------------------------------------------------------------------* + * IVAS_ENC_PrintConfig() + * + * + *---------------------------------------------------------------------*/ + +ivas_error IVAS_ENC_PrintConfig( + const IVAS_ENC_HANDLE hIvasEnc, /* i : IVAS encoder handle */ + const int16_t channelAwareModeEnabled /* i : channel-aware mode enabled flag */ +) +{ + return printConfigInfo_enc( hIvasEnc, channelAwareModeEnabled ); +} + + +/*---------------------------------------------------------------------* + * IVAS_ENC_PrintDisclaimer() + * + * Print IVAS disclaimer to console + *---------------------------------------------------------------------*/ + +void IVAS_ENC_PrintDisclaimer( void ) +{ + print_disclaimer( stderr ); + + return; +} + + +/*---------------------------------------------------------------------* + * init_encoder_config() + * + * Initialize Encoder Config. handle + *---------------------------------------------------------------------*/ + +static void init_encoder_config( + ENCODER_CONFIG_HANDLE hEncoderConfig /* o : configuration structure */ +) +{ + hEncoderConfig->ivas_total_brate = ACELP_12k65; + hEncoderConfig->max_bwidth = SWB; + hEncoderConfig->input_Fs = 16000; + hEncoderConfig->nchan_inp = 1; + hEncoderConfig->element_mode_init = EVS_MONO; + hEncoderConfig->ivas_format = UNDEFINED_FORMAT; + hEncoderConfig->is_binaural = 0; + hEncoderConfig->Opt_SC_VBR = 0; + hEncoderConfig->last_Opt_SC_VBR = 0; + hEncoderConfig->Opt_AMR_WB = 0; + hEncoderConfig->Opt_DTX_ON = 0; + hEncoderConfig->Opt_RF_ON = 0; + hEncoderConfig->rf_fec_offset = 0; + hEncoderConfig->rf_fec_indicator = 1; + hEncoderConfig->interval_SID = FIXED_SID_RATE; + hEncoderConfig->var_SID_rate_flag = 1; + hEncoderConfig->mc_input_setup = MC_LS_SETUP_INVALID; + hEncoderConfig->stereo_dmx_evs = 0; + hEncoderConfig->nchan_ism = 0; + hEncoderConfig->sba_order = 0; + hEncoderConfig->sba_planar = 0; + hEncoderConfig->ism_extended_metadata_flag = 0; + hEncoderConfig->Opt_PCA_ON = 0; + + return; +} diff --git a/lib_enc/lib_enc.h b/lib_enc/lib_enc.h new file mode 100644 index 0000000000000000000000000000000000000000..b57a1375a68e8ee92866b7a53eb8cd2993f3af07 --- /dev/null +++ b/lib_enc/lib_enc.h @@ -0,0 +1,337 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#ifndef LIB_ENC_H +#define LIB_ENC_H + +#include "common_api_types.h" +#include + + +/*---------------------------------------------------------------------* + * Encoder enums + *---------------------------------------------------------------------*/ + +/* Possible input formats to the encoder */ +typedef enum _IVAS_ENC_INPUT_FORMAT +{ + IVAS_ENC_INPUT_MONO = 0x0001, + IVAS_ENC_INPUT_STEREO, + IVAS_ENC_INPUT_ISM, + IVAS_ENC_INPUT_SBA, + IVAS_ENC_INPUT_MASA, + IVAS_ENC_INPUT_MC, + IVAS_ENC_INPUT_MASA_ISM, + IVAS_ENC_INPUT_SBA_ISM, + IVAS_ENC_INPUT_UNKNOWN = 0xffff +} IVAS_ENC_INPUT_FORMAT; + +typedef enum _IVAS_ENC_BANDWIDTH +{ + IVAS_ENC_BANDWIDTH_NB, + IVAS_ENC_BANDWIDTH_WB, + IVAS_ENC_BANDWIDTH_SWB, + IVAS_ENC_BANDWIDTH_FB, + IVAS_ENC_BANDWIDTH_UNDEFINED = 0xffff +} IVAS_ENC_BANDWIDTH; + +typedef struct _IVAS_ENC_DTX_CONFIG +{ + bool enabled; + bool variable_SID_rate; + int16_t SID_interval; +} IVAS_ENC_DTX_CONFIG; + +typedef enum _IVAS_ENC_SBA_ORDER +{ + IVAS_ENC_SBA_FOA = 1, + IVAS_ENC_SBA_HOA2 = 2, + IVAS_ENC_SBA_HOA3 = 3, + IVAS_ENC_SBA_ORDER_UNDEFINED = 0xffff +} IVAS_ENC_SBA_ORDER; + +typedef enum _IVAS_ENC_MC_LAYOUT +{ + IVAS_ENC_MC_5_1 = 6, + IVAS_ENC_MC_7_1 = 12, + IVAS_ENC_MC_5_1_2 = 14, + IVAS_ENC_MC_5_1_4 = 16, + IVAS_ENC_MC_7_1_4 = 19, + IVAS_ENC_MC_UNDEFINED = 0xffff +} IVAS_ENC_MC_LAYOUT; + +typedef enum _IVAS_ENC_MASA_VARIANT +{ + IVAS_ENC_MASA_1CH = 1, + IVAS_ENC_MASA_2CH = 2, + IVAS_ENC_MASA_UNDEFINED = 0xffff +} IVAS_ENC_MASA_VARIANT; + +typedef enum _IVAS_ENC_COMPLEXITY_LEVEL +{ + IVAS_ENC_COMPLEXITY_LEVEL_ONE = 1, + IVAS_ENC_COMPLEXITY_LEVEL_TWO = 2, + IVAS_ENC_COMPLEXITY_LEVEL_THREE = 3 +} IVAS_ENC_COMPLEXITY_LEVEL; + +typedef enum _IVAS_ENC_COMBINED_FORMAT +{ + IVAS_ENC_MASA_ISM = 1, + IVAS_ENC_COMBINED_UNDEFINED = 0xffff +} IVAS_ENC_COMBINED_FORMAT; + + +/*---------------------------------------------------------------------* + * Encoder structures + *---------------------------------------------------------------------*/ + +typedef struct IVAS_ENC *IVAS_ENC_HANDLE; + +/* clang-format off */ +/*---------------------------------------------------------------------* + * Encoder function declarations + *---------------------------------------------------------------------*/ + +/* Open, configure, close functions - should be called once per encoder lifetime */ + +/*! r: error code */ +ivas_error IVAS_ENC_Open( + IVAS_ENC_HANDLE *phIvasEnc /* i/o: pointer to an encoder handle to be opened */ +); + +/*! r: error code */ +ivas_error IVAS_ENC_ConfigureForMono( + IVAS_ENC_HANDLE hIvasEnc, /* i/o: IVAS encoder handle */ + const int32_t inputFs, /* i : input sampling frequency */ + const int32_t bitrate, /* i : requested bitrate of the output bitstream */ + const bool max_bwidth_user, /* i : shows if bandwidth limitation was set by the user (true) or if default bandwidth was used (false) */ + const IVAS_ENC_BANDWIDTH maxBandwidth, /* i : bandwidth limitation */ + const IVAS_ENC_DTX_CONFIG dtxConfig, /* i : configuration of DTX, can by set to default by using IVAS_ENC_GetDefaultDtxConfig() */ + const IVAS_ENC_CHANNEL_AWARE_CONFIG caConfig, /* i : configuration of channel-aware mode, can by set to default by using IVAS_ENC_GetDefaultChannelAwareConfig() */ + const bool downmixFromStereo, /* i : if true, the encoder accepts a stereo input and internally downmixes it to mono before encoding */ + const bool is_binaural /* i : if true, the input is binaural audio */ +); + +/*! r: error code */ +ivas_error IVAS_ENC_ConfigureForStereo( + IVAS_ENC_HANDLE hIvasEnc, /* i/o: IVAS encoder handle */ + const int32_t inputFs, /* i : input sampling frequency */ + const int32_t bitrate, /* i : requested bitrate of the output bitstream */ + const bool max_bwidth_user, /* i : shows if bandwidth limitation was set by the user (true) or if default bandwidth was used (false) */ + const IVAS_ENC_BANDWIDTH maxBandwidth, /* i : bandwidth limitation */ + const IVAS_ENC_DTX_CONFIG dtxConfig, /* i : configuration of DTX, can by set to default by using IVAS_ENC_GetDefaultDtxConfig() */ + const bool is_binaural /* i : flag indicating if input is binaural audio */ +); + +/*! r: error code */ +ivas_error IVAS_ENC_ConfigureForObjects( + IVAS_ENC_HANDLE hIvasEnc, /* i/o: IVAS encoder handle */ + const int32_t inputFs, /* i : input sampling frequency */ + const int32_t bitrate, /* i : requested bitrate of the output bitstream */ + const bool max_bwidth_user, /* i : shows if bandwidth limitation was set by the user (true) or if default bandwidth was used (false) */ + const IVAS_ENC_BANDWIDTH maxBandwidth, /* i : bandwidth limitation */ + const IVAS_ENC_DTX_CONFIG dtxConfig, /* i : configuration of DTX, can by set to default by using IVAS_ENC_GetDefaultDtxConfig() */ + const uint16_t numObjects, /* i : number of objects to be encoded */ + const bool ism_extended_metadata /* i : Extended metadata used (true/false), where extended metadata includes radius and orientation */ +); + +/*! r: encoder error code */ +ivas_error IVAS_ENC_ConfigureForMASAObjects( + IVAS_ENC_HANDLE hIvasEnc, /* i/o: IVAS encoder handle */ + const int32_t inputFs, /* i : input sampling frequency */ + const int32_t bitrate, /* i : requested bitrate of the ouput bitstream */ + const IVAS_ENC_BANDWIDTH maxBandwidth, /* i : bandwidth limitation */ + const IVAS_ENC_DTX_CONFIG dtxConfig, /* i : configuration of DTX, can by set to default by using IVAS_ENC_GetDefaultDtxConfig() */ + const uint16_t numObjects, /* i : number of objects to be encoded */ + const int16_t masaVariant /* i : index specifying the number of MASA transport channels */ +); + +/*! r: encoder error code */ +ivas_error IVAS_ENC_ConfigureForSBAObjects( + IVAS_ENC_HANDLE hIvasEnc, /* i/o: IVAS encoder handle */ + const int32_t inputFs, /* i : input sampling frequency */ + const int32_t bitrate, /* i : requested bitrate of the ouput bitstream */ + const IVAS_ENC_BANDWIDTH maxBandwidth, /* i : bandwidth limitation */ + const IVAS_ENC_DTX_CONFIG dtxConfig, /* i : configuration of DTX, can by set to default by using IVAS_ENC_GetDefaultDtxConfig() */ + const uint16_t numObjects, /* i : number of objects to be encoded */ + const IVAS_ENC_SBA_ORDER order, /* i : order of the Ambisonics input */ + const bool isPlanar, /* i : if true, input is treated as planar Ambisonics */ + const bool Opt_PCA_ON /* i : PCA option flag */ +); + +/*! r: error code */ +ivas_error IVAS_ENC_ConfigureForAmbisonics( + IVAS_ENC_HANDLE hIvasEnc, /* i/o: IVAS encoder handle */ + const int32_t inputFs, /* i : input sampling frequency */ + const int32_t bitrate, /* i : requested bitrate of the output bitstream */ + const bool max_bwidth_user, /* i : shows if bandwidth limitation was set by the user (true) or if default bandwidth was used (false) */ + const IVAS_ENC_BANDWIDTH maxBandwidth, /* i : bandwidth limitation */ + const IVAS_ENC_DTX_CONFIG dtxConfig, /* i : configuration of DTX, can by set to default by using IVAS_ENC_GetDefaultDtxConfig() */ + const IVAS_ENC_SBA_ORDER order, /* i : order of the Ambisonics input */ + const bool isPlanar, /* i : if true, input is treated as planar Ambisonics */ + const bool Opt_PCA_ON /* i : PCA option flag */ +); + +/*! r: error code */ +ivas_error IVAS_ENC_ConfigureForMasa( + IVAS_ENC_HANDLE hIvasEnc, /* i/o: IVAS encoder handle */ + const int32_t inputFs, /* i : input sampling frequency */ + const int32_t bitrate, /* i : requested bitrate of the output bitstream */ + const bool max_bwidth_user, /* i : shows if bandwidth limitation was set by the user (true) or if default bandwidth was used (false) */ + const IVAS_ENC_BANDWIDTH maxBandwidth, /* i : bandwidth limitation */ + const IVAS_ENC_DTX_CONFIG dtxConfig, /* i : configuration of DTX, can by set to default by using IVAS_ENC_GetDefaultDtxConfig() */ + const IVAS_ENC_MASA_VARIANT masaVariant /* i : type of MASA input (either 1 or 2 channels) */ +); + +/*! r: encoder error code */ +ivas_error IVAS_ENC_ConfigureForMultichannel( + IVAS_ENC_HANDLE hIvasEnc, /* i/o: IVAS encoder handle */ + const int32_t inputFs, /* i : input sampling frequency */ + const int32_t bitrate, /* i : requested bitrate of the output bitstream */ + const bool max_bwidth_user, /* i : shows if bandwidth limitation was set by the user (true) or if default bandwidth was used (false) */ + const IVAS_ENC_BANDWIDTH maxBandwidth, /* i : bandwidth limitation */ + const IVAS_ENC_DTX_CONFIG dtxConfig, /* i : configuration of DTX, can by set to default by using IVAS_ENC_GetDefaultDtxConfig() */ + const IVAS_ENC_MC_LAYOUT mcLayout /* i : input MC layout */ +); + +void IVAS_ENC_Close( + IVAS_ENC_HANDLE *phIvasEnc /* i/o: pointer to IVAS encoder handle */ +); + +/* Encoding functions - should be called with a configured encoder handle */ + +/*! r: error code */ +ivas_error IVAS_ENC_FeedObjectMetadata( + IVAS_ENC_HANDLE hIvasEnc, /* i/o: IVAS encoder handle */ + const uint16_t ismIndex, /* i : object index */ + const IVAS_ISM_METADATA metadata /* i : object metadata handle for current frame */ +); + +/*! r: error code */ +ivas_error IVAS_ENC_FeedMasaMetadata( + IVAS_ENC_HANDLE hIvasEnc, /* i/o: IVAS encoder handle */ + IVAS_MASA_METADATA_HANDLE hMasaMetadata /* i : MASA metadata for current frame */ +); + +/*! r: error code */ +ivas_error IVAS_ENC_EncodeFrameToSerial( + IVAS_ENC_HANDLE hIvasEnc, /* i/o: IVAS encoder handle */ + int16_t *inputBuffer, /* i : PCM input */ + int16_t inputBufferSize, /* i : total number of samples in the input buffer. Related function: IVAS_ENC_GetInputBufferSize() */ + uint16_t *outputBitStream, /* o : pointer to serial output bitstream. The array must already be allocated and be of size at least IVAS_MAX_BITS_PER_FRAME */ + uint16_t *numOutBits /* o : number of bits written to output bitstream. Each bit is stored as a single uint16_t value */ +); + +/*! r: error code */ +ivas_error IVAS_ENC_EncodeFrameToCompact( + IVAS_ENC_HANDLE hIvasEnc, /* i/o: IVAS encoder handle */ + int16_t *inputBuffer, /* i : PCM input */ + const int16_t inputBufferSize, /* i : total number of samples in the input buffer. Related function: IVAS_ENC_GetInputBufferSize() */ + uint8_t *outputBitStream, /* o : pointer to compact output bitstream. The array must already be allocated. */ + uint16_t *numOutBits /* o : number of bits written to output bitstream */ +); + +/* Setter functions - apply changes to encoder configuration */ + +/*! r: error code */ +ivas_error IVAS_ENC_SetBandwidth( + IVAS_ENC_HANDLE hIvasEnc, /* i/o: IVAS encoder handle */ + const IVAS_ENC_BANDWIDTH maxBandwidth /* i : bandwidth limitation to be used */ +); + +/*! r: error code */ +ivas_error IVAS_ENC_SetBitrate( + IVAS_ENC_HANDLE hIvasEnc, /* i/o: IVAS encoder handle */ + const int32_t totalBitrate /* i : requested bitrate of the output bitstream */ +); + +/*! r: error code */ +ivas_error IVAS_ENC_SetChannelAwareConfig( + IVAS_ENC_HANDLE hIvasEnc, /* i/o: IVAS encoder handle */ + const IVAS_ENC_CHANNEL_AWARE_CONFIG rfConfig /* i : configuration of channel-aware mode */ +); + + +/* Getter functions - retrieve information from an encoder through a handle */ + +/*! r: encoder error code */ +ivas_error IVAS_ENC_GetDelay( + const IVAS_ENC_HANDLE hIvasEnc, /* i : IVAS encoder handle */ + int16_t *delay /* o : encoder delay */ +); + +/*! r: encoder error code */ +ivas_error IVAS_ENC_GetNumInChannels( + const IVAS_ENC_HANDLE hIvasEnc, /* i/o: IVAS encoder handle */ + int16_t *numInChannels /* o : total number of samples expected in the input buffer for current encoder configuration */ +); + +/*! r: encoder error code */ +ivas_error IVAS_ENC_GetInputBufferSize( + const IVAS_ENC_HANDLE hIvasEnc, /* i/o: IVAS encoder handle */ + int16_t *inputBufferSize /* o : total number of samples expected in the input buffer for current encoder configuration */ +); + +/* Utility functions */ +/*! r: default bandwidth for the encoder */ +IVAS_ENC_BANDWIDTH IVAS_ENC_GetDefaultBandwidth( + const bool isEvs /* i : EVS or IVAS mode */ +); + +/*! r: default DTX config for the encoder */ +IVAS_ENC_DTX_CONFIG IVAS_ENC_GetDefaultDtxConfig( + void +); + +/*! r: default channel-aware mode config for the encoder */ +IVAS_ENC_CHANNEL_AWARE_CONFIG IVAS_ENC_GetDefaultChannelAwareConfig( + void +); + +/*! r: pointer to an error message string */ +const char *IVAS_ENC_GetErrorMessage( + ivas_error error /* i : error code enum */ +); + + +ivas_error IVAS_ENC_PrintConfig( + const IVAS_ENC_HANDLE hIvasEnc, /* i : IVAS encoder handle */ + const int16_t channelAwareModeEnabled /* i : channel-aware mode enabled flag */ +); + +void IVAS_ENC_PrintDisclaimer( + void +); + +/* clang-format on */ + +#endif /* LIB_ENC_H */ diff --git a/lib_enc/long_enr.c b/lib_enc/long_enr.c new file mode 100644 index 0000000000000000000000000000000000000000..118630d2992e17f6f3a2ad9ef116316ec1608752 --- /dev/null +++ b/lib_enc/long_enr.c @@ -0,0 +1,163 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * long_enr() + * + * Compute relative energy, long-term average total noise energy and total active speech energy + *-------------------------------------------------------------------*/ + +void long_enr( + Encoder_State *st, /* i/o: encoder state structure */ + const float Etot, /* i : total channel energy */ + const int16_t localVAD_HE_SAD, /* i : HE-SAD flag without hangover */ + const int16_t high_lpn_flag, /* i : sp/mus LPN flag */ + FRONT_VAD_ENC_HANDLE hFrontVad[CPE_CHANNELS], /* i/o: front-VAD handles */ + const int16_t n_chan, /* i : number of channels */ + const int16_t localVAD_HE_SAD_LR[CPE_CHANNELS], /* i : HE-SAD flag without hangover LR channels */ + const float Etot_LR[CPE_CHANNELS] /* i : total channel energy LR channels */ +) +{ + float tmp; + int16_t n; + + /*-----------------------------------------------------------------* + * Compute long term estimate of total noise energy + * and total active speech energy + *-----------------------------------------------------------------*/ + + if ( hFrontVad != NULL ) + { + if ( hFrontVad[0]->ini_frame < 4 ) + { + for ( n = 0; n < n_chan; n++ ) + { + hFrontVad[n]->lp_noise = hFrontVad[n]->hNoiseEst->totalNoise; + tmp = hFrontVad[n]->lp_noise + 10.0f; + + if ( hFrontVad[n]->lp_speech < tmp ) + { + hFrontVad[n]->lp_speech = tmp; + } + } + } + else + { + float smooth_prev, smooth_curr; + + if ( hFrontVad[0]->ini_frame < 150 ) + { + smooth_prev = 0.95f; + smooth_curr = 0.05f; + } + else + { + smooth_prev = 0.98f; + smooth_curr = 0.02f; + } + + for ( n = 0; n < n_chan; n++ ) + { + hFrontVad[n]->lp_noise = smooth_prev * hFrontVad[n]->lp_noise + smooth_curr * hFrontVad[n]->hNoiseEst->totalNoise; + + if ( localVAD_HE_SAD_LR[n] && !high_lpn_flag ) + { + if ( ( hFrontVad[n]->lp_speech - Etot_LR[n] ) < 10.0f ) + { + hFrontVad[n]->lp_speech = 0.98f * hFrontVad[n]->lp_speech + 0.02f * Etot_LR[n]; + } + else + { + hFrontVad[n]->lp_speech = hFrontVad[n]->lp_speech - 0.05f; + } + } + } + } + + /* Update */ + for ( n = 0; n < n_chan; n++ ) + { + hFrontVad[n]->hNoiseEst->Etot_last = Etot_LR[n]; + } + } + else + { + if ( st->ini_frame < 4 ) + { + st->lp_noise = st->hNoiseEst->totalNoise; + tmp = st->lp_noise + 10.0f; + + if ( st->lp_speech < tmp ) + { + st->lp_speech = tmp; + } + } + else + { + if ( st->ini_frame < 150 ) + { + st->lp_noise = 0.95f * st->lp_noise + 0.05f * st->hNoiseEst->totalNoise; + } + else + { + st->lp_noise = 0.98f * st->lp_noise + 0.02f * st->hNoiseEst->totalNoise; + } + + if ( localVAD_HE_SAD && !high_lpn_flag ) + { + if ( ( st->lp_speech - Etot ) < 10.0f ) + { + st->lp_speech = 0.98f * st->lp_speech + 0.02f * Etot; + } + else + { + st->lp_speech = st->lp_speech - 0.05f; + } + } + } + + /* Update */ + st->hNoiseEst->Etot_last = Etot; + } + + return; +} diff --git a/lib_enc/lp_exc_e.c b/lib_enc/lp_exc_e.c new file mode 100644 index 0000000000000000000000000000000000000000..07b1954f5ae56bda299f595176f9987c258347ac --- /dev/null +++ b/lib_enc/lp_exc_e.c @@ -0,0 +1,299 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * Local constants + *-------------------------------------------------------------------*/ + +#define GAIN_PIT_MAX 1.2f +#define ACELP_GAINS_CONST 0.8f /* adaptive codebook gain constraint */ + + +/*-------------------------------------------------------------------* + * Local function prototypes + *-------------------------------------------------------------------*/ + +static float adpt_enr( const int16_t codec_mode, const float *exc, const float *h1, float *y1, const int16_t L_subfr, float *gain, float *g_corr, const int16_t clip_gain, const float *xn, float *xn2, int16_t use_prev_sf_pit_gain ); + + +/*-------------------------------------------------------------------* + * lp_filt_exc_enc() + * + * Low-pass filtering of the adaptive excitation + * Innovation target construction + * Gain quantization limitation + *-------------------------------------------------------------------*/ + +int16_t lp_filt_exc_enc( + const int16_t codec_mode, /* i : codec mode */ + const int16_t coder_type, /* i : coding type */ + const int16_t i_subfr, /* i : subframe index */ + float *exc, /* i/o: pointer to excitation signal frame */ + const float *h1, /* i : weighted filter input response */ + const float *xn, /* i : target vector */ + float *y1, /* o : zero-memory filtered adaptive excitation */ + float *xn2, /* o : target vector for innovation search */ + const int16_t L_subfr, /* i : length of vectors for gain quantization */ + const int16_t L_frame, /* i : frame size */ + float *g_corr, /* o : ACELP correlation values */ + const int16_t clip_gain, /* i : adaptive gain clipping flag */ + float *gain_pit, /* o : adaptive excitation gain */ + int16_t *lp_flag /* i/o: mode selection */ +) +{ + float ener, ener_tmp, gain1, gain2, g_corr2[2], exc_tmp[L_FRAME16k], xn2_tmp[L_FRAME16k]; + float y1_tmp[L_FRAME16k]; + int16_t select, i; + int16_t use_prev_sf_pit_gain; + + gain1 = 0.0f; + gain2 = 0.0f; + ener = 0.0f; + ener_tmp = 0.0f; + use_prev_sf_pit_gain = 0; + + /*----------------------------------------------------------------* + * Find energy of the fixed cb. target with respect to adaptive + * exc. filtering + * Find flag about splitting the gain quantizer in half + * - find the target energy if adaptive exc. is not filtered + * - filter the adaptive excitation and find the target energy + * if the exc. is filtered. + *----------------------------------------------------------------*/ + + if ( codec_mode == MODE2 && coder_type == 100 ) + { + use_prev_sf_pit_gain = 1; + } + + if ( *lp_flag == FULL_BAND || *lp_flag == NORMAL_OPERATION ) + { + if ( use_prev_sf_pit_gain == 1 ) + { + ener = adpt_enr( codec_mode, &exc[i_subfr], h1, y1, L_subfr, gain_pit, g_corr, clip_gain, xn, xn2, use_prev_sf_pit_gain ); + } + else + { + ener = adpt_enr( codec_mode, &exc[i_subfr], h1, y1, L_subfr, &gain1, g_corr, clip_gain, xn, xn2, use_prev_sf_pit_gain ); + } + } + + /*----------------------------------------------------------------* + * Find energy of the fixed cb. target with respect to adaptive + * exc. filtering + * filter the adaptive excitation and find the target energy + * if the exc. is filtered. + *----------------------------------------------------------------*/ + + if ( *lp_flag == LOW_PASS || *lp_flag == NORMAL_OPERATION ) + { + if ( codec_mode == MODE2 && L_frame == L_FRAME16k ) + { + for ( i = 0; i < L_subfr; i++ ) + { + exc_tmp[i] = (float) ( 0.21f * exc[i - 1 + i_subfr] + 0.58f * exc[i + i_subfr] + 0.21f * exc[i + 1 + i_subfr] ); + } + } + else + { + for ( i = 0; i < L_subfr; i++ ) + { + exc_tmp[i] = (float) ( 0.18f * exc[i - 1 + i_subfr] + 0.64f * exc[i + i_subfr] + 0.18f * exc[i + 1 + i_subfr] ); + } + } + + if ( use_prev_sf_pit_gain == 1 ) + { + ener_tmp = adpt_enr( codec_mode, exc_tmp, h1, y1_tmp, L_subfr, gain_pit, g_corr2, clip_gain, xn, xn2_tmp, use_prev_sf_pit_gain ); + } + else + { + ener_tmp = adpt_enr( codec_mode, exc_tmp, h1, y1_tmp, L_subfr, &gain2, g_corr2, clip_gain, xn, xn2_tmp, use_prev_sf_pit_gain ); + } + } + + /*-----------------------------------------------------------------* + * use the best prediction (minimize quadratic error) + *-----------------------------------------------------------------*/ + + if ( ( ( ener_tmp < ener ) && ( *lp_flag == NORMAL_OPERATION ) ) || ( *lp_flag == LOW_PASS ) ) + { + /* use the LP filter for pitch excitation prediction */ + select = LOW_PASS; + mvr2r( exc_tmp, &exc[i_subfr], L_subfr ); + mvr2r( y1_tmp, y1, L_subfr ); + mvr2r( xn2_tmp, xn2, L_subfr ); + + if ( use_prev_sf_pit_gain == 0 ) + { + *gain_pit = gain2; + g_corr[0] = g_corr2[0]; + g_corr[1] = g_corr2[1]; + } + } + else + { + /* no LP filter used for pitch excitation prediction */ + select = FULL_BAND; + if ( use_prev_sf_pit_gain == 0 ) + { + *gain_pit = gain1; + } + } + + return ( select ); +} + +/*-------------------------------------------------------------------* + * adpt_enr() + * + * Find the adaptive excitation energy + * This serves to decide about the filtering of the adaptive excitation + *-------------------------------------------------------------------*/ + +static float adpt_enr( + const int16_t codec_mode, /* i : codec mode */ + const float *exc, /* i : Excitation vector */ + const float *h1, /* i : impuls response */ + float *y1, /* o : zero-memory filtered adpt. excitation */ + const int16_t L_subfr, /* i : vector length */ + float *gain, /* o : subframe adaptive gain */ + float *g_corr, /* o : correlations for adptive gain */ + const int16_t clip_gain, /* i : adaptive gain clipping flag */ + const float *xn, /* i : adaptive codebook target */ + float *xn2, /* o : algebraic codebook target */ + int16_t use_prev_sf_pit_gain /* i : flag to use prev sf pitch gain or not */ +) +{ + float ener; + + conv( exc, h1, y1, L_subfr ); + if ( use_prev_sf_pit_gain == 0 ) + { + *gain = corr_xy1( xn, y1, g_corr, L_subfr, codec_mode == MODE2 ); + + /* clip gain, if necessary to avoid problems at decoder */ + if ( clip_gain == 1 && *gain > 0.95f ) + { + *gain = 0.95f; + } + + if ( clip_gain == 2 && *gain > 0.65f ) + { + *gain = 0.65f; + } + } + + /* find energy of new target xn2[] */ + updt_tar( xn, xn2, y1, *gain, L_subfr ); + ener = dotp( xn2, xn2, L_subfr ); + + return ener; +} + +/*-------------------------------------------------------------------* + * corr_xy1() + * + * Find the correlations between the target xn[] and the filtered adaptive + * codebook excitation y1[]. ( and -2 ) + *-------------------------------------------------------------------*/ + +/*! r: pitch gain (0..GAIN_PIT_MAX) */ +float corr_xy1( + const float xn[], /* i : target signal */ + const float y1[], /* i : filtered adaptive codebook excitation */ + float g_corr[], /* o : correlations and -2 */ + const int16_t L_subfr, /* i : subframe length */ + const int16_t norm_flag /* i : flag for constraining pitch contribution */ +) +{ + float temp1, temp2, gain, gain_p_snr; + + /*-----------------------------------------------------------------* + * Find the ACELP correlations and the pitch gain + * (for current subframe) + *-----------------------------------------------------------------*/ + + /* Compute scalar product */ + temp1 = dotp( xn, y1, L_subfr ); + + /* Compute scalar product */ + temp2 = dotp( y1, y1, L_subfr ) + 0.01f; + + g_corr[0] = temp2; + g_corr[1] = -2.0f * temp1 + 0.01f; + + /* find pitch gain and bound it by [0,GAIN_PIT_MAX] */ + if ( norm_flag ) + { + gain = ( temp1 + 0.01f ) / temp2; + } + else + { + gain = temp1 / temp2; + } + + if ( gain < 0.0f ) + { + gain = 0.0f; + } + if ( gain > GAIN_PIT_MAX ) + { + gain = GAIN_PIT_MAX; + } + + /* Limit the energy of pitch contribution */ + if ( norm_flag ) + { + /* Compute scalar product */ + temp1 = dotp( xn, xn, L_subfr ); + gain_p_snr = (float) ( ACELP_GAINS_CONST * sqrt( temp1 / temp2 ) ); + + if ( gain > gain_p_snr ) + { + gain = gain_p_snr; + } + } + + return gain; +} diff --git a/lib_enc/lsf_enc.c b/lib_enc/lsf_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..c327579726f8d666ae32f35d46f52aac7662bca8 --- /dev/null +++ b/lib_enc/lsf_enc.c @@ -0,0 +1,2080 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "rom_enc.h" +#include "rom_com.h" +#include "prot.h" +#include "basop_proto_func.h" +#include "ivas_prot.h" +#include "ivas_rom_com.h" +#include "wmc_auto.h" + +/*-----------------------------------------------------------------* + * Local constants + *-----------------------------------------------------------------*/ + +#define MSVQ_MAXCNT 3000 + + +/*---------------------------------------------------------------------* + * Local function prototypes + *---------------------------------------------------------------------*/ + +static void lsfq_CNG( BSTR_ENC_HANDLE hBstr, const float *lsf, const float *wghts, float *qlsf ); + +static void lsf_mid_enc( BSTR_ENC_HANDLE hBstr, int16_t nb_bits, const int32_t int_fs, const float qisp0[], const float qisp1[], float isp[], const int16_t coder_type, const int16_t bwidth, const float Bin_Ener[], const int16_t ppp_mode, const int16_t nelp_mode ); + +static float vq_lvq_lsf_enc( const int16_t pred_flag, const int16_t mode, const float u[], const int16_t *levels, const int16_t stages, const float w[], int16_t Idx[], const float *lsf, const float *pred, float *resq, float *lsfq ); + +static float qlsf_ARSN_tcvq_Enc_16k( const float *x, float *y, int16_t *indice, const float *w, const int16_t nBits, const int16_t safety_net ); + + +/*-------------------------------------------------------------------* + * lsf_enc() + * + * Quantization of LSF vector + *-------------------------------------------------------------------*/ + +void lsf_enc( + Encoder_State *st, /* i/o: state structure */ + float *lsf_new, /* o : quantized LSF vector */ + float *lsp_new, /* i/o: LSP vector to quantize/quantized */ + float *lsp_mid, /* i/o: mid-frame LSP vector */ + float *Aq, /* o : quantized A(z) for 4 subframes */ + const int16_t tdm_low_rate_mode, /* i : secondary channel low rate mode flag */ + const int16_t GSC_IVAS_mode, /* i : GSC IVAS mode */ + const float tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel */ +) +{ + int16_t i, nBits, force_sf, no_param_lpc; + float fec_lsf[M], stab; + int16_t param_lpc[NPRM_LPC_NEW]; + int16_t coder_type, ppp_mode, nelp_mode; + + if ( st->core_brate == SID_2k40 || st->core_brate == SID_1k75 ) + { + coder_type = INACTIVE; + } + else + { + coder_type = st->coder_type; + } + + if ( coder_type == AUDIO && GSC_IVAS_mode > 0 ) + { + coder_type = GENERIC; + } + + + /* initialize */ + no_param_lpc = 0; + + if ( st->Opt_SC_VBR ) + { + ppp_mode = st->hSC_VBR->ppp_mode; + nelp_mode = st->hSC_VBR->nelp_mode; + } + else + { + ppp_mode = 0; + nelp_mode = 0; + } + + /* convert LSPs to LSFs */ + lsp2lsf( lsp_new, lsf_new, M, st->sr_core ); + + /* check resonance for pitch clipping algorithm */ + gp_clip_test_lsf( st->element_mode, st->core_brate, lsf_new, st->clip_var, 0 ); + + /*-------------------------------------------------------------------------------------* + * Find the number of bits for LSF quantization + *-------------------------------------------------------------------------------------*/ + + nBits = 0; + if ( st->core_brate == SID_2k40 ) + { + nBits = LSF_BITS_CNG; + } + else + { + if ( nelp_mode == 0 && ppp_mode == 0 ) + { + nBits = st->acelp_cfg.lsf_bits; + } + else if ( nelp_mode == 1 ) + { + if ( st->bwidth == NB ) + { + nBits = 32; /* Stole 1 bit for SID/NELP harmonization*/ + } + else if ( st->bwidth == WB ) + { + nBits = 30; /* Stole 1 bit for SID/NELP harmonization */ + } + } + else if ( ppp_mode == 1 ) + { + + /*The LSF bit scaling does not work here. */ + nBits = 26; /*Stole 1 bit for SID PPP harmonization*/ + } + } + + + force_sf = 0; + if ( st->Nb_ACELP_frames < 3 && st->core_brate != SID_2k40 ) + { + /* first three ACELP frames after an HQ frame shall be processed only with safety-net quantizer */ + force_sf = 1; + } + + if ( st->next_force_safety_net == 1 ) + { + /* in case of unstable filter, choose safety-net to help FEC */ + force_sf = 1; + st->next_force_safety_net = 0; + } + + /*-------------------------------------------------------------------------------------* + * LSF quantization + *-------------------------------------------------------------------------------------*/ + + lsf_end_enc( st, lsf_new, lsf_new, nBits, coder_type, force_sf, param_lpc, &no_param_lpc, NULL, st->coder_type_raw, tdm_lsfQ_PCh ); + + /* convert quantized LSFs back to LSPs */ + lsf2lsp( lsf_new, lsp_new, M, st->sr_core ); + + if ( st->last_core == HQ_CORE && st->core == ACELP_CORE ) + { + /* don't use old LSF values if this is the first ACELP frame after HQ frames */ + mvr2r( lsf_new, st->lsf_old, M ); + } + + /* set seed_acelp used in UC mode */ + if ( coder_type == UNVOICED && st->element_mode > EVS_MONO ) + { + st->seed_acelp = 0; + for ( i = no_param_lpc - 1; i >= 0; i-- ) + { + /* rightshift before *seed_acelp+param_lpc[i] to avoid overflows*/ + st->seed_acelp = (int16_t) ( ( ( ( st->seed_acelp ) >> 1 ) + param_lpc[i] ) * 31821L + 13849L ); + } + } + + if ( st->core_brate == SID_2k40 ) + { + /* return if SID frame (conversion to A(z) done in the calling function) */ + return; + } + + /*-------------------------------------------------------------------------------------* + * FEC - enforce safety-net in the next frame in case of unstable filter + *-------------------------------------------------------------------------------------*/ + + if ( st->last_L_frame != st->L_frame ) + { + /* FEC - in case of core switching, use old LSFs that have been smoothed with adaptive mean */ + mvr2r( st->lsf_old, st->lsfoldbfi1, M ); + mvr2r( st->lsf_old, st->lsfoldbfi0, M ); + mvr2r( st->lsf_old, st->lsf_adaptive_mean, M ); + } + + FEC_lsf_estim_enc( st, fec_lsf ); + + /* FEC - calculate LSF stability */ + stab = lsf_stab( lsf_new, fec_lsf, 0, st->L_frame ); + + if ( st->L_frame == L_FRAME16k && stab < STAB_FAC_LIMIT && coder_type == GENERIC ) + { + st->next_force_safety_net = 1; + } + else + { + if ( stab < STAB_FAC_LIMIT && ( st->clas == VOICED_CLAS || ( st->clas < VOICED_CLAS && coder_type == AUDIO ) ) ) + { + st->next_force_safety_net = 1; + } + } + + /* FEC - update adaptive LSF mean vector */ + for ( i = 0; i < M; i++ ) + { + st->lsf_adaptive_mean[i] = ( st->lsfoldbfi1[i] + st->lsfoldbfi0[i] + lsf_new[i] ) / 3; + } + + /* FEC - update LSF memories */ + mvr2r( st->lsfoldbfi0, st->lsfoldbfi1, M ); + mvr2r( lsf_new, st->lsfoldbfi0, M ); + + /*-------------------------------------------------------------------------------------* + * Mid-frame LSF encoding + * LSP interpolation and conversion of LSPs to A(z) + *-------------------------------------------------------------------------------------*/ + + if ( st->rate_switching_reset ) + { + /*extrapolation in case of unstable LSF convert*/ + mvr2r( lsp_new, st->lsp_old, M ); + mvr2r( lsf_new, st->lsf_old, M ); + } + + /* Mid-frame LSF encoding */ + lsf_mid_enc( st->hBstr, st->acelp_cfg.mid_lsf_bits, st->sr_core, st->lsp_old, lsp_new, lsp_mid, coder_type, st->bwidth, st->Bin_E_old, ppp_mode, nelp_mode ); + + if ( st->last_core == HQ_CORE && st->core == ACELP_CORE ) + { + /* don't use old LSP/LSF values if this is the first ACELP frame after HQ frames */ + mvr2r( lsp_mid, st->lsp_old, M ); + lsp2lsf( lsp_mid, st->lsf_old, M, st->sr_core ); + } + + if ( tdm_low_rate_mode == 1 && coder_type > UNVOICED ) + { + if ( st->active_cnt == 1 ) + { + mvr2r( lsp_mid, st->lsp_old, M ); + lsp2lsf( lsp_mid, st->lsf_old, M, st->sr_core ); + mvr2r( lsp_new, lsp_mid, M ); + } + + /* LSP interpolation and conversion of LSPs to A(z) - two-subframe mode */ + int_lsp4( st->L_frame, st->lsp_old, lsp_mid, lsp_new, Aq, M, -2 ); + } + else + { + /* LSP interpolation and conversion of LSPs to A(z) */ + int_lsp4( st->L_frame, st->lsp_old, lsp_mid, lsp_new, Aq, M, 0 ); + } + + /*------------------------------------------------------------------* + * Check LSF stability (distance between old LSFs and current LSFs) + *------------------------------------------------------------------*/ + + if ( st->core_brate != SID_2k40 ) + { + st->stab_fac = lsf_stab( lsf_new, st->lsf_old, 0, st->L_frame ); + } + + return; +} + + +/*-------------------------------------------------------------------* + * lsfq_CNG() + * + * LSF quantizer for SID frames (uses 29 bits, 4 for VQ, 25 for LVQ) + * Note: + * The sampling frequency of the LP-CNG frame can be determined by checking the value of the highest order LSF + * coefficient (last coefficient of lsf). If the last LSF coefficient (lsf[M-1]) is larger than 6350 + * the decoded frame is WB2 with sampling rate of 16 kHz, otherwise it is sampled at 12.8kHz and contains + * either NB or WB LSF data. + *-------------------------------------------------------------------*/ + +static void lsfq_CNG( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const float *lsf, + const float *wghts, + float *qlsf_out ) +{ + int16_t i, j, idx_cv, idx_lvq[3]; + float min_dist, dist, dd[M], ddq[M]; + const float *p_cb; + int16_t first_cb, last_cb; + int16_t idx_lead_cng[2], idx_scale_cng[2]; + + float qlsf[M]; + idx_cv = 0; + + /* quantize first stage with 4 bits */ + if ( lsf[M - 1] > WB_LIMIT_LSF ) /* 16kHz sampled LSF vector*/ + { + p_cb = &CNG_SN1[0]; + first_cb = 0; + last_cb = 6; + } + else /* 12.8kHz sampled LSF vector*/ + { + p_cb = &CNG_SN1[6 * M]; + first_cb = 6; + last_cb = M; + } + + min_dist = 1.0e30f; + for ( i = first_cb; i < last_cb; i++ ) + { + dist = 0.0f; + for ( j = 0; j < M; j++ ) + { + dist += wghts[j] * ( *p_cb ) * ( *p_cb - 2 * lsf[j] ); + p_cb++; + } + + if ( dist < min_dist ) + { + min_dist = dist; + idx_cv = i; + } + } + + /* calculate difference */ + for ( i = 0; i < M; i++ ) + { + dd[i] = lsf[i] - CNG_SN1[idx_cv * M + i]; + } + + /* quantize the difference with LVQ */ + mslvq_cng( idx_cv, dd, qlsf, ddq, idx_lead_cng, idx_scale_cng, wghts ); + + index_lvq( ddq, idx_lead_cng, idx_scale_cng, START_CNG + idx_cv, idx_lvq, 0 ); + + v_add( qlsf, &CNG_SN1[idx_cv * M], qlsf, M ); + /* write the VQ index to the bitstream */ + push_indice( hBstr, IND_ISF_0_0, idx_cv, 4 ); + + /* write the LVQ index to the bitstream */ + push_indice( hBstr, IND_ISF_0_1, idx_lvq[0], LEN_INDICE ); + push_indice( hBstr, IND_ISF_0_1, idx_lvq[1], LSF_BITS_CNG - 4 - LEN_INDICE ); + + mvr2r( qlsf, qlsf_out, M ); + + return; +} + +/*-------------------------------------------------------------------* + * qlsf_Mode_Select() + * + * Mode selection for LSF quantizer + *-------------------------------------------------------------------*/ + +static int16_t qlsf_Mode_Select( + const float *lsf, /* i : LSF vector */ + const float *w, /* i : weighting vector */ + const float *pred1, /* i : prediction vector */ + const float streaklimit, /* i : predictive streak limit */ + const float op_loop_thr /* i : Open-loop Threshold */ +) +{ + int16_t i; + int16_t safety_net; + float pred_pow2[M], En; + + /* calculate the prediction residual */ + for ( i = 0; i < M; i++ ) + { + pred_pow2[i] = lsf[i] - pred1[i]; + } + + /* calculate its energy */ + v_mult( pred_pow2, pred_pow2, pred_pow2, M ); + En = dotp( pred_pow2, w, M ); + + /* choose the mode */ + if ( En > streaklimit * op_loop_thr ) + { + /* Safety-net */ + safety_net = 1; + } + else + { + /* Predictive */ + safety_net = 0; + } + + return safety_net; +} + + +/*-------------------------------------------------------------------* + * lsf_end_enc() + * + * Quantization of LSF parameters + *-------------------------------------------------------------------*/ + +void lsf_end_enc( + Encoder_State *st, /* i/o: encoder state structure */ + const float *lsf, /* i : LSF in the frequency domain (0..6400) */ + float *qlsf, /* o : quantized LSF */ + const int16_t nBits_in, /* i : number of bits to spend on ISF quantization */ + const int16_t coder_type_org, /* i : coding type */ + const int16_t force_sf, /* i : Force safety-net usage (if possible), due to filter instability, MDCT-core switching etc. */ + int16_t *lpc_param, + int16_t *no_indices, + int16_t *bits_param_lpc, + const int16_t coder_type_raw, + const float tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel */ +) +{ + int16_t i; + int16_t Idx0[MAX_VQ_STAGES + 3]; /* Optimal codebook indices for safety-net quantizer */ + int16_t Idx1[MAX_VQ_STAGES + 3]; /* Optimal codebook indices for predictive quantizer */ + int16_t indice[MAX_VQ_STAGES + 3]; /* Temp. array of indice for vector de-quantizer */ + int16_t mode_lvq = 0, mode_lvq_p = 0; + int16_t bits0[MAX_VQ_STAGES], bits1[MAX_VQ_STAGES]; + const int16_t *Bit_alloc1 = NULL; + float Err[2]; /* Quantization error for safety-net(0) and predictive(1) quantizers */ + float Tmp[M]; /* Temporary target vector (mean and prediction removed) */ + float pred0[M]; /* Prediction for the safety-net quantizer (usually mean) */ + float pred1[M]; /* Prediction for the predictive quantizer */ + float pred2[M]; /* Prediction for the predictive quantizer */ + float wghts[M]; /* Weighting used for quantizer (currently GSM based) */ + int16_t stages0; /* Amount of stages used by safety-net quantizer */ + int16_t stages1; /* Amount of stages used by predictive quantizer */ + int16_t levels0[MAX_VQ_STAGES]; /* Sizes of different codebook stages for safety-net quantizer */ + int16_t levels1[MAX_VQ_STAGES]; /* Sizes of different codebook stages for predictive quantizer */ + int16_t predmode; /* 0: safety-net only, 1: predictive only, 2: best of the two */ + int16_t safety_net, cumleft, num_bits; + int16_t *Idx, stages, *bits; + float Tmp1[M], Tmp2[M]; /* Temporary target vectors for MA and AR quantizers respectively */ + float abs_threshold; /* Absolute Error value that is considered as "good enough" (in practice close to SD of 1.0dB)*/ + float lsfq[M * 2], resq[M * 2]; + int16_t coder_type; + int16_t nBits; + int16_t TCQIdx0[M + 2]; /* Optimal codebook indices for VQ-TCQ quantizer */ + int16_t *TCQIdx; + int16_t flag_1bit_gran; + BSTR_ENC_HANDLE hBstr = st->hBstr; + float pred3[M]; + int16_t dummy, dummy_v[5]; + + flag_1bit_gran = ( st->element_mode > EVS_MONO ); + nBits = nBits_in; + + if ( coder_type_org == GENERIC && st->sr_core == INT_FS_16k && st->codec_mode == MODE1 && ( st->idchan == 0 ) /* this bit is used only for primary channel or mono */ ) + { + if ( coder_type_raw == VOICED ) + { + coder_type = VOICED; /* Reflect Inactive mode */ + if ( flag_1bit_gran == 1 ) + { + nBits--; + } + } + else + { + nBits--; /* This is for real Generic*/ + coder_type = coder_type_org; + } + } + else + { + coder_type = coder_type_org; + } + + + /*--------------------------------------------------------------------------------* + * Calculate the number of stages and levels for each stage based on allowed bit budget + * Set absolute threshold for codebook-type decision logic + *--------------------------------------------------------------------------------*/ + + if ( st->bwidth == NB ) + { + abs_threshold = SFNETLOWLIMIT_NB; + } + else + { + abs_threshold = SFNETLOWLIMIT_WB; + } + + Unified_weighting( &st->Bin_E[L_FFT / 2], lsf, wghts, st->bwidth == NB, coder_type == UNVOICED, st->sr_core, M ); + + /*--------------------------------------------------------------------------------* + * LSF quantization of SID frames + *--------------------------------------------------------------------------------*/ + + if ( st->core_brate == SID_2k40 ) + { + lsfq_CNG( st->hBstr, lsf, wghts, qlsf ); + v_sort( qlsf, 0, M - 1 ); + reorder_lsf( qlsf, MODE1_LSF_GAP, M, st->sr_core ); + + return; + } + + find_pred_mode( &predmode, coder_type, st->bwidth, st->sr_core, &mode_lvq, &mode_lvq_p, st->total_brate ); + + /*----------------------------------------------------------------* + * Calculate number of stages and levels for each stage based on the allowed bit allocation + * (subtract one bit for LSF predictor selection) + *----------------------------------------------------------------*/ + + lsf_allocate( nBits - ( predmode >> 1 ), mode_lvq, mode_lvq_p, &stages0, &stages1, levels0, levels1, bits0, bits1 ); + + /*--------------------------------------------------------------------------------* + * LSF quantization of all other frames but SID frames + * Select safety-net or predictive mode + *--------------------------------------------------------------------------------*/ + + Err[0] = FLT_MAX; + Err[1] = FLT_MAX; + /* for mem_MA update */ + for ( i = 0; i < M; i++ ) + { + pred1[i] = ModeMeans[mode_lvq][i] + MU_MA * st->mem_MA[i]; + } + + /* TD stereo SCh: perform intra-frame prediction with pulling-to-mean */ + if ( st->tdm_LRTD_flag == 0 && st->idchan == 1 && tdm_lsfQ_PCh != NULL ) + { + /* if secondary channel predmode is set to be > 2 */ + predmode += 3; + + tdm_SCh_LSF_intra_pred( st->element_brate, tdm_lsfQ_PCh, pred3 ); + } + + if ( predmode == 0 ) /* Safety-net only */ + { + /* Subtract only mean */ + mvr2r( ModeMeans[mode_lvq], pred0, M ); + v_sub( lsf, pred0, Tmp, M ); + + /* LVQ quantization (safety-net only) */ + Err[0] = vq_lvq_lsf_enc( 0, mode_lvq, Tmp, levels0, stages0, wghts, Idx0, lsf, pred0, resq, lsfq ); + safety_net = 1; + st->pstreaklen = 0; /* Streak is ended with safety-net */ + } + else if ( predmode == 1 ) /* only MA prediction */ + { + v_sub( lsf, pred1, Tmp1, M ); + Err[1] = vq_lvq_lsf_enc( 2, mode_lvq_p, Tmp1, levels1, stages1, wghts, Idx1, lsf, pred1, resq, lsfq ); + + safety_net = 0; + } + else /* Switched Safety-Net/AR prediction */ + { + if ( predmode == 2 ) + { + /* Subtract mean and AR prediction */ + mvr2r( ModeMeans[mode_lvq], pred0, M ); + + /* subtract only mean */ + v_sub( lsf, pred0, Tmp, M ); + + for ( i = 0; i < M; i++ ) + { + /* subtract mean and AR prediction */ + pred2[i] = pred0[i] + Predictors[mode_lvq_p][i] * ( st->mem_AR[i] - pred0[i] ); + Tmp2[i] = lsf[i] - pred2[i]; + } + + /* Adaptive scaling factor (multiplier) is updated in order to reduce the amount of consecutive predictive frames in + case of possible frame erasure. AR-predictive usage for VOICED mode is allowed to be higher than other modes. */ + if ( ( ( st->pstreaklen > ( STREAKLEN + 3 ) ) && ( coder_type == VOICED ) ) || ( ( st->pstreaklen > ( STREAKLEN ) ) && ( coder_type != VOICED ) ) ) + { + /* update the adaptive scaling factor to become smaller with increasing number of concecutive predictive frames. */ + st->streaklimit *= STREAKMULT; + } + + if ( st->pstreaklen == 0 ) + { + /* reset the adaptive scaling factor */ + st->streaklimit = 1.0f; + } + + /* VOICED_WB@16kHz */ + if ( st->sr_core == INT_FS_16k && coder_type == VOICED && flag_1bit_gran == 0 ) + { + /* select safety_net or predictive in open loop*/ + safety_net = qlsf_Mode_Select( lsf, wghts, pred2, st->streaklimit, OP_LOOP_THR_HVO ); + + if ( force_sf == 1 ) + { + safety_net = 1; + } + + if ( safety_net ) + { + /* Safety-net - BC-TCQ quantization : SN */ + Err[0] = qlsf_ARSN_tcvq_Enc_16k( Tmp, lsfq, TCQIdx0, wghts, nBits - 1, safety_net ); + st->pstreaklen = 0; + } + else + { + /* predictive - BC-TCQ quantization : AR */ + /* For consistency Err[1] contains predictive error */ + Err[1] = qlsf_ARSN_tcvq_Enc_16k( Tmp2, lsfq, TCQIdx0, wghts, nBits - 1, safety_net ); + ( st->pstreaklen )++; + } + } + /* all other frames (not VOICED@16kHz) */ + else + { + /* safety-net */ + Err[0] = vq_lvq_lsf_enc( 0, mode_lvq, Tmp, levels0, stages0, wghts, Idx0, lsf, pred0, resq, lsfq ); + /* Predictive quantizer is calculated only if it can be selected, this saves computation */ + if ( !force_sf || Err[0] > abs_threshold ) + { + Err[1] = vq_lvq_lsf_enc( 2, mode_lvq_p, Tmp2, levels1, stages1, wghts, Idx1, lsf, pred2, &resq[M], &lsfq[M] ); + } + /* Select whether to use safety-net or predictive LSF quantizer. The decision is based on following: + if the non-predictive (safety-net) quantization error (Err[0]) is low enough it is selected + or if the predictively quantized error (Err[1]) is by at least adaptive margin smaller than non-predictive quantizer. + or if the in case of frame erasure the resulting concealed predictive LSF would be unstable safety-net is selected */ + if ( force_sf || Err[0] * ( st->streaklimit ) < PREFERSFNET * Err[1] || Err[0] < abs_threshold ) + { + safety_net = 1; + st->pstreaklen = 0; /* Reset the consecutive predictive frame counter */ + } + else + { + safety_net = 0; + ( st->pstreaklen )++; /* Increase the consecutive predictive frame counter by one */ + } + } + } + else /* of "if (predmode==2)" */ + { + mvr2r( ModeMeans[mode_lvq], pred0, M ); + + if ( predmode == 4 ) + { + mode_lvq_p = 9; /* force to Generic WB with AR*/ + } + + for ( i = 0; i < M; i++ ) + { + /* subtract mean and AR prediction */ + pred2[i] = pred0[i] + Predictors[mode_lvq_p][i] * ( st->mem_AR[i] - pred0[i] ); + Tmp[i] = lsf[i] - pred2[i]; + Tmp2[i] = lsf[i] - pred3[i]; + } + + /* Adaptive scaling factor (multiplier) is updated in order to reduce the amount of consecutive predictive frames in + case of possible frame erasure. AR-predictive usage for VOICED mode is allowed to be higher than other modes. */ + if ( st->pstreaklen > ( STREAKLEN ) ) + { + /* update the adaptive scaling factor to become smaller with increasing number of concecutive predictive frames. */ + st->streaklimit *= STREAKMULT; + } + + if ( st->pstreaklen == 0 ) + { + /* reset the adaptive scaling factor */ + st->streaklimit = 1.0f; + } + + /* intra pred */ + /* use G AR pred for the intra mode (as a safety mode, this is why the indexes 0/1 are interchanged)*/ + + lsf_allocate( nBits - 1, mode_lvq, 9, &stages1, &stages0, levels1, levels0, bits1, bits0 ); + + Err[0] = vq_lvq_lsf_enc( 2, 9, Tmp2, levels0, stages0, wghts, Idx0, lsf, pred3, &resq[M], &lsfq[M] ); + + if ( force_sf ) + { + safety_net = 1; /* intra-frame prediction */ + st->pstreaklen = 0; /* Reset the consecutive predictive frame counter */ + } + else + { /* try also the inter frame prediction */ + + /* AR inter-frame prediction */ + lsf_allocate( nBits - 1, mode_lvq, mode_lvq_p, &dummy, &stages1, dummy_v, levels1, dummy_v, bits1 ); + + Err[1] = vq_lvq_lsf_enc( 2, mode_lvq_p, Tmp, levels1, stages1, wghts, Idx1, lsf, pred2, resq, lsfq ); + + if ( Err[0] * ( st->streaklimit ) < PREFERSFNET * Err[1] ) + { + safety_net = 1; + st->pstreaklen = 0; /* Reset the consecutive predictive frame counter */ + } + else + { + safety_net = 0; + ( st->pstreaklen )++; /* Increase the consecutive predictive frame counter by one */ + } + } + } + } + + /*--------------------------------------------------------------------------* + * Write indices to array + *--------------------------------------------------------------------------*/ + + if ( st->codec_mode == MODE1 && st->core == ACELP_CORE ) + { + /* write coder_type bit for VOICED@16kHz or GENERIC@16kHz */ + if ( coder_type_org == GENERIC && st->sr_core == INT_FS_16k && st->idchan == 0 ) + { + /* VOICED =2 and GENERIC=3, so "coder_type-2" means VOICED =0 and GENERIC=1*/ + push_indice( hBstr, IND_LSF_PREDICTOR_SELECT_BIT, coder_type - 2, 1 ); + } + + /* write predictor selection bit */ + if ( predmode >= 2 ) + { + push_indice( hBstr, IND_LSF_PREDICTOR_SELECT_BIT, safety_net, 1 ); + } + + if ( coder_type == VOICED && st->sr_core == INT_FS_16k && flag_1bit_gran == 0 ) + { + /* BC-TCVQ (only for VOICED@16kHz) */ + TCQIdx = &TCQIdx0[1]; + Bit_alloc1 = &BC_TCVQ_BIT_ALLOC_40B[1]; + for ( i = 0; i < M / 2 + 3; i++ ) + { + push_indice( hBstr, IND_LSF, TCQIdx[i], Bit_alloc1[i] ); + } + } + else + { + cumleft = nBits; + if ( predmode >= 2 ) + { + /* subtract predictor selection bit */ + cumleft = nBits - 1; + } + + if ( safety_net ) + { + stages = stages0; + Idx = Idx0; + bits = bits0; + } + else + { + stages = stages1; + Idx = Idx1; + bits = bits1; + } + + for ( i = 0; i < stages - 1; i++ ) + { + indice[i] = Idx[i]; + num_bits = bits[i]; + cumleft -= num_bits; + + push_indice( hBstr, IND_LSF, indice[i], num_bits ); + } + + while ( cumleft > 0 ) + { + indice[i] = Idx[i]; + + if ( cumleft > LEN_INDICE ) + { + num_bits = LEN_INDICE; + } + else + { + num_bits = cumleft; + } + + cumleft -= num_bits; + + push_indice( hBstr, IND_LSF, indice[i], num_bits ); + + i++; + } + } + } + else + { + if ( coder_type == VOICED && st->sr_core == INT_FS_16k && flag_1bit_gran == 0 ) + { + /* BC-TCVQ (only for VOICED@16kHz) */ + /* Number of quantization indices */ + *no_indices = 10; + for ( i = 0; i < *no_indices; i++ ) + { + lpc_param[i] = TCQIdx0[i]; + bits_param_lpc[i] = BC_TCVQ_BIT_ALLOC_40B[i]; + } + } + else + { + /* Number of quantization indices */ + + /* there are 31 bits */ + if ( safety_net == 1 ) + { + Idx = Idx0; + *no_indices = stages0 + 1; + for ( i = 0; i < stages0; i++ ) + { + lpc_param[i] = Idx[i]; + indice[i] = Idx[i]; + bits_param_lpc[i] = bits0[i]; + } + lpc_param[stages0] = Idx[stages0]; + indice[stages0] = Idx[stages0]; + + bits_param_lpc[stages0 - 1] = LEN_INDICE; + bits_param_lpc[stages0] = bits0[stages0 - 1] - LEN_INDICE; + } + else + { + *no_indices = stages1 + 1; + Idx = Idx1; + for ( i = 0; i < stages1; i++ ) + { + lpc_param[i] = Idx[i]; + indice[i] = Idx[i]; + bits_param_lpc[i] = bits1[i]; + } + lpc_param[stages1] = Idx[stages1]; + indice[stages1] = Idx[stages1]; + + bits_param_lpc[stages1 - 1] = LEN_INDICE; + bits_param_lpc[stages1] = bits1[stages1 - 1] - LEN_INDICE; + } + if ( predmode == 2 ) + { + for ( i = *no_indices; i > 0; i-- ) + { + lpc_param[i] = lpc_param[i - 1]; + bits_param_lpc[i] = bits_param_lpc[i - 1]; + } + lpc_param[0] = safety_net; /* put the safety net info on the last param */ + bits_param_lpc[0] = 1; + *no_indices = *no_indices + 1; + } + } + } + + + /*--------------------------------------------------------------------------* + * De-quantize encoded LSF vector + *--------------------------------------------------------------------------*/ + + if ( safety_net ) + { + /* Safety-net */ + if ( coder_type == VOICED && st->sr_core == INT_FS_16k && flag_1bit_gran == 0 ) + { + /* BC-TCQ */ + mvr2r( lsfq, st->mem_MA, M ); + v_add( lsfq, pred0, qlsf, M ); + } + else + { + if ( st->tdm_LRTD_flag == 0 && st->idchan == 1 && tdm_lsfQ_PCh != NULL ) + { + /* intra mode*/ + vq_dec_lvq( 0, qlsf, &indice[0], stages0, M, 9, /*mode_lvq_p,*/ levels0[stages0 - 1] ); + v_add( qlsf, pred3, qlsf, M ); + v_sub( qlsf, pred1, st->mem_MA, M ); + } + else + { + vq_dec_lvq( 1, qlsf, &indice[0], stages0, M, mode_lvq, levels0[stages0 - 1] ); + + v_add( qlsf, pred0, qlsf, M ); + v_sub( qlsf, pred1, st->mem_MA, M ); + } + } + } + else + { + if ( coder_type == VOICED && st->sr_core == INT_FS_16k && flag_1bit_gran == 0 ) + { + /* BC-TCVQ */ + mvr2r( lsfq, st->mem_MA, M ); + v_add( lsfq, pred2, qlsf, M ); + } + else + { + /* LVQ */ + vq_dec_lvq( 0, qlsf, &indice[0], stages1, M, mode_lvq_p, levels1[stages1 - 1] ); + if ( predmode == 1 ) + { + mvr2r( qlsf, st->mem_MA, M ); + v_add( qlsf, pred1, qlsf, M ); + } + else + { + v_add( qlsf, pred2, qlsf, M ); + v_sub( qlsf, pred1, st->mem_MA, M ); + } + } + } + + /*--------------------------------------------------------------------------* + * Sort the quantized vector + * Verify stability + * Update AR-predictor memory + *--------------------------------------------------------------------------*/ + + /* Sort the quantized vector to ascending order */ + v_sort( qlsf, 0, M - 1 ); + + /* Verify stability by adding minimum separation */ + reorder_lsf( qlsf, MODE1_LSF_GAP, M, st->sr_core ); + + /* Update predictor memories */ + mvr2r( qlsf, st->mem_AR, M ); + + return; +} + + +/*-------------------------------------------------------------------* + * first_VQstages() + * + * + *-------------------------------------------------------------------*/ +void first_VQstages( + const float *const *cb, + const float u[], /* i : vector to be encoded (prediction and mean removed) */ + const int16_t *levels, /* i : number of levels in each stage */ + const int16_t stagesVQ, /* i : number of stages */ + const float w[], /* i : weights */ + const int16_t N, /* i : vector dimension */ + const int16_t max_inner, /* i : maximum number of swaps in inner loop */ + int16_t indices_VQstage[] ) +{ + float ftmp, resid_buf[2 * LSFMBEST * M], *resid[2], dist_buf[2 * LSFMBEST], *dist[2]; + float en, tmp, Tmp[M], *pTmp; + int16_t *pTmp_short, idx_buf[2 * LSFMBEST * MAX_VQ_STAGES], parents[LSFMBEST], counter = 0, j, m, s, c, c2, p_max, *indices[2]; + int16_t maxC = LSFMBEST; + + /*float dd[16];*/ + const float *cb_stage, *cbp; + + /* Set pointers to previous (parent) and current node (parent node is indexed [0], current node is indexed [1]) */ + indices[0] = idx_buf; + indices[1] = idx_buf + maxC * stagesVQ; + resid[0] = resid_buf; + resid[1] = resid_buf + maxC * N; + dist[0] = dist_buf; + dist[1] = dist_buf + maxC; + + set_s( idx_buf, 0, 2 * stagesVQ * maxC ); + set_s( parents, 0, maxC ); + + /* Set up inital distance vector */ + for ( tmp = 0, j = 0; j < N; j++ ) + { + tmp += u[j] * u[j] * w[j]; + } + set_f( dist[1], tmp, maxC ); + + /* Set up inital error (residual) vectors */ + pTmp = resid[1]; + for ( c = 0; c < maxC; c++ ) + { + mvr2r( u, pTmp, N ); + pTmp += N; + } + + /*----------------------------------------------------------------* + * LSF quantization + *----------------------------------------------------------------*/ + + /* Loop over all stages */ + for ( m = 1, s = 0; s < stagesVQ; s++ ) + { + /* set codebook pointer to point to first stage */ + cbp = cb[s]; + + /* save pointer to the beginning of the current stage */ + cb_stage = cbp; + + /* swap pointers to parent and current nodes */ + pTmp_short = indices[0]; + indices[0] = indices[1]; + indices[1] = pTmp_short; + + pTmp = resid[0]; + resid[0] = resid[1]; + resid[1] = pTmp; + + pTmp = dist[0]; + dist[0] = dist[1]; + dist[1] = pTmp; + + /* p_max points to maximum distortion node (worst of best) */ + p_max = 0; + + /* set distortions to a large value */ + set_f( dist[1], 99e10f, maxC ); + + for ( j = 0; j < levels[s]; j++ ) + { + /* compute weighted codebook element and its energy */ + for ( c2 = 0; c2 < N; c2++ ) + { + Tmp[c2] = w[c2] * cbp[c2]; + } + + en = cbp[0] * Tmp[0]; + for ( c2 = 1; c2 < N; c2++ ) + { + en += cbp[c2] * Tmp[c2]; + } + cbp += N; + + /* iterate over all parent nodes */ + for ( c = 0; c < m; c++ ) + { + pTmp = &resid[0][c * N]; + tmp = pTmp[0] * Tmp[0]; + for ( c2 = 1; c2 < N; c2++ ) + { + tmp += pTmp[c2] * Tmp[c2]; + } + tmp = en - 2.0f * tmp; + tmp += dist[0][c]; + + if ( tmp <= dist[1][p_max] ) + { + /* replace worst */ + dist[1][p_max] = tmp; + indices[1][p_max * stagesVQ + s] = j; + parents[p_max] = c; + + /* limit number of times inner loop is entered */ + if ( counter < max_inner ) + { + counter++; + if ( counter < max_inner ) + { + /* find new worst */ + p_max = maximum( dist[1], maxC, &ftmp ); + } + else + { + /* find minimum distortion */ + p_max = minimum( dist[1], maxC, &ftmp ); + } + } + } + } + } + + /*------------------------------------------------------------* + * Compute error vectors for each node + *------------------------------------------------------------*/ + + for ( c = 0; c < maxC; c++ ) + { + /* subtract codebook entry from the residual vector of the parent node */ + pTmp = resid[1] + c * N; + mvr2r( resid[0] + parents[c] * N, pTmp, N ); + v_sub( pTmp, cb_stage + ( indices[1][c * stagesVQ + s] ) * N, pTmp, N ); + + /* get indices that were used for parent node */ + mvs2s( indices[0] + parents[c] * stagesVQ, indices[1] + c * stagesVQ, s ); + } + + m = maxC; + } + + mvs2s( indices[1], indices_VQstage, maxC * stagesVQ ); + + return; +} + +/*--------------------------------------------------------------------------- + * vq_enc_lsf_lvq() + * + * Multi-stage VQ encoder for LSF quantization. Trained codebooks are used in initial stages + * and lattice-VQ quantization is applied on residual vector in other stages. + * + * Note: + * Compared to normal multistage VQ resulting LSF vector is reordered to ascending order before + * weighted error calculation (spectral distortion) at the final stage. + * + * Returns: + * Weighted error + *--------------------------------------------------------------------------*/ + +static float vq_lvq_lsf_enc( + const int16_t pred_flag, + const int16_t mode, + const float u[], + const int16_t levels[], + const int16_t stages, + const float w[], + int16_t Idx[], + const float *lsf, + const float *pred, + float *resq, + float *lsfq ) +{ + int16_t i; + const float *const *cb, *cb_stage; + float cand[LSFMBEST][M]; + int16_t maxC = LSFMBEST, stagesVQ; + int16_t mode_glb, j, indices_firstVQ[LSFMBEST * MAX_VQ_STAGES], c2; + float dd[M]; + float quant[LSFMBEST][M], diff[M]; + float lat_cv[LSFMBEST][M], e[LSFMBEST], ftmp, tmp; + int16_t idx_lead[LSFMBEST][2], idx_scale[LSFMBEST][2]; + + stagesVQ = stages - 1; + /* Codebook selection */ + if ( pred_flag == 0 ) /* safety net*/ + { + cb = &Quantizers[CB_lsf[mode]]; + if ( mode < 6 ) /* for NB */ + { + mode_glb = offset_lvq_modes_SN[mode] + offset_in_lvq_mode_SN[mode][levels[stagesVQ] - min_lat_bits_SN[mode]]; + } + else + { + mode_glb = offset_lvq_modes_SN[mode] + levels[stagesVQ] - min_lat_bits_SN[mode]; /* there is granularity of 1 bit */ + } + } + else /* pred */ + { + cb = &Quantizers_p[CB_p_lsf[mode]]; + if ( ( mode < 6 ) || ( mode == 12 ) ) /* for NB or I 16k */ + { + mode_glb = offset_lvq_modes_pred[mode] + offset_in_lvq_mode_pred[mode][levels[stagesVQ] - min_lat_bits_pred[mode]]; + } + else + { + mode_glb = offset_lvq_modes_pred[mode] + levels[stagesVQ] - min_lat_bits_pred[mode]; + } + } + + if ( stagesVQ > 0 ) + { + /* first VQ stages */ + first_VQstages( cb, u, levels, stagesVQ, w, M, MSVQ_MAXCNT, indices_firstVQ ); + } + + for ( i = 0; i < maxC; i++ ) + { + mvr2r( pred, cand[i], M ); + for ( j = 0; j < stagesVQ; j++ ) + { + Idx[j] = indices_firstVQ[i * stagesVQ + j]; + } + + for ( j = 0; j < stagesVQ; j++ ) + { + cb_stage = cb[j]; + v_add( cand[i], cb_stage + Idx[j] * M, cand[i], M ); + } + + + /* LVQ quantization */ + v_sub( lsf, cand[i], dd, M ); + mslvq( dd, quant[i], lat_cv[i], idx_lead[i], idx_scale[i], w, mode, mode_glb, pred_flag ); + v_add( cand[i], quant[i], cand[i], M ); + + /* arrange the LSF candidate vector prior to selection to an ascending order*/ + v_sort( cand[i], 0, M - 1 ); + + /* calculate the spectral distortion using weighted MSE of sorted LSF vector*/ + v_sub( cand[i], lsf, diff, M ); + v_mult( diff, diff, diff, M ); + e[i] = dotp( diff, w, M ); + } + + /* find the optimal candidate */ + c2 = minimum( e, maxC, &ftmp ); + set_f( resq, 0.0f, M ); + for ( j = 0; j < stagesVQ; j++ ) + { + Idx[j] = indices_firstVQ[c2 * stagesVQ + j]; + cb_stage = cb[j]; + v_add( resq, cb_stage + Idx[j] * M, resq, M ); + } + v_add( resq, quant[c2], resq, M ); /* quantized prediction residual */ + + mvr2r( cand[c2], lsfq, M ); + index_lvq( lat_cv[c2], idx_lead[c2], idx_scale[c2], mode_glb, &Idx[stagesVQ], pred_flag ); + + tmp = e[c2]; + + return tmp; +} + + +/*--------------------------------------------------------------------------- + * BcTcvq_1st() + * + * + *--------------------------------------------------------------------------*/ + +static void BcTcvq_1st( + /*const*/ float x[][2], + const float CB[][128][2], + int16_t s[][16], + int16_t c[][16], + float cDist[][16], + float Q[][16][2], + /*const*/ float W[][2] ) +{ + int16_t state, prev_state; + int16_t index, bestCode; + float dist, minDist; + + for ( state = 0; state < NUM_STATE; state += 2 ) + { + prev_state = NTRANS[0][state]; + index = NTRANS[2][state]; + + minDist = ( x[0][0] - CB[0][index][0] ) * ( x[0][0] - CB[0][index][0] ) * W[0][0]; + minDist += ( x[0][1] - CB[0][index][1] ) * ( x[0][1] - CB[0][index][1] ) * W[0][1]; + bestCode = index; + + for ( index = index + 8; index < 128; index += 8 ) + { + dist = ( x[0][0] - CB[0][index][0] ) * ( x[0][0] - CB[0][index][0] ) * W[0][0]; + dist += ( x[0][1] - CB[0][index][1] ) * ( x[0][1] - CB[0][index][1] ) * W[0][1]; + + if ( dist < minDist ) + { + minDist = dist; + bestCode = index; + } + } + + /* Update */ + s[0][state] = prev_state; + c[0][state] = bestCode; + cDist[0][state] = minDist; + Q[0][state][0] = CB[0][bestCode][0]; + Q[0][state][1] = CB[0][bestCode][1]; + } + + return; +} + +/*--------------------------------------------------------------------------- + * BcTcvq_2nd() + * + * + *--------------------------------------------------------------------------*/ + +static void BcTcvq_2nd( + /*const*/ float x[][2], + const float CB[][128][2], + int16_t s[][16], + int16_t c[][16], + float cDist[][16], + float Q[][16][2], + /*const*/ float W[][2], + const float itc[][2][2] ) +{ + int16_t state, prev_state; + int16_t index, bestCode; + float dist, minDist; + float pred[N_DIM], target[N_DIM]; + + for ( state = 0; state < NUM_STATE; state++ ) + { + prev_state = NTRANS[0][state]; + index = NTRANS[2][state]; + + /* Prediction */ + pred[0] = itc[0][0][0] * Q[0][prev_state][0] + itc[0][0][1] * Q[0][prev_state][1]; + pred[1] = itc[0][1][0] * Q[0][prev_state][0] + itc[0][1][1] * Q[0][prev_state][1]; + target[0] = x[1][0] - pred[0]; + target[1] = x[1][1] - pred[1]; + + minDist = ( target[0] - CB[1][index][0] ) * ( target[0] - CB[1][index][0] ) * W[1][0]; + minDist += ( target[1] - CB[1][index][1] ) * ( target[1] - CB[1][index][1] ) * W[1][1]; + bestCode = index; + + for ( index = index + 8; index < 128; index += 8 ) + { + dist = ( target[0] - CB[1][index][0] ) * ( target[0] - CB[1][index][0] ) * W[1][0]; + dist += ( target[1] - CB[1][index][1] ) * ( target[1] - CB[1][index][1] ) * W[1][1]; + + if ( dist < minDist ) + { + minDist = dist; + bestCode = index; + } + } + + /* Update */ + s[1][state] = prev_state; + c[1][state] = bestCode; + cDist[1][state] = cDist[0][prev_state] + minDist; + Q[1][state][0] = CB[1][bestCode][0] + pred[0]; + Q[1][state][1] = CB[1][bestCode][1] + pred[1]; + } + + return; +} + + +/*--------------------------------------------------------------------------- + * BcTcvq_SubBlock() + * + * + *--------------------------------------------------------------------------*/ + +static void BcTcvq_SubBlock( + /*const*/ float x[][2], + const float CB[][64][2], + int16_t s[][16], + int16_t c[][16], + float cDist[][16], + float Q[][16][2], + const int16_t stage, + /*const*/ float W[][2], + const float itc[][2][2] ) +{ + int16_t stage1, stage2, state, prev_state, branch; + int16_t index, bestCode, brCode[N_DIM]; + float dist, minDist, brDist[N_DIM]; + float pred[N_DIM], target[N_DIM], brQuant[N_DIM][N_DIM]; + + stage1 = stage - 1; + stage2 = stage - 2; + + for ( state = 0; state < NUM_STATE; state++ ) + { + + /* 1st brarnch search */ + prev_state = NTRANS[0][state]; + index = NTRANS[2][state]; + + /* Prediction */ + pred[0] = itc[stage1][0][0] * Q[stage1][prev_state][0] + itc[stage1][0][1] * Q[stage1][prev_state][1]; + pred[1] = itc[stage1][1][0] * Q[stage1][prev_state][0] + itc[stage1][1][1] * Q[stage1][prev_state][1]; + target[0] = x[stage][0] - pred[0]; + target[1] = x[stage][1] - pred[1]; + + minDist = ( target[0] - CB[stage2][index][0] ) * ( target[0] - CB[stage2][index][0] ) * W[stage][0]; + minDist += ( target[1] - CB[stage2][index][1] ) * ( target[1] - CB[stage2][index][1] ) * W[stage][1]; + bestCode = index; + + for ( index = index + 8; index < 64; index += 8 ) + { + dist = ( target[0] - CB[stage2][index][0] ) * ( target[0] - CB[stage2][index][0] ) * W[stage][0]; + dist += ( target[1] - CB[stage2][index][1] ) * ( target[1] - CB[stage2][index][1] ) * W[stage][1]; + + if ( dist < minDist ) + { + minDist = dist; + bestCode = index; + } + } + + brCode[0] = bestCode; + brDist[0] = cDist[stage1][prev_state] + minDist; + brQuant[0][0] = CB[stage2][bestCode][0] + pred[0]; + brQuant[0][1] = CB[stage2][bestCode][1] + pred[1]; + + /* 2nd branch search */ + prev_state = NTRANS[1][state]; + index = NTRANS[3][state]; + + /* Prediction */ + pred[0] = itc[stage1][0][0] * Q[stage1][prev_state][0] + itc[stage1][0][1] * Q[stage1][prev_state][1]; + pred[1] = itc[stage1][1][0] * Q[stage1][prev_state][0] + itc[stage1][1][1] * Q[stage1][prev_state][1]; + target[0] = x[stage][0] - pred[0]; + target[1] = x[stage][1] - pred[1]; + + minDist = ( target[0] - CB[stage2][index][0] ) * ( target[0] - CB[stage2][index][0] ) * W[stage][0]; + minDist += ( target[1] - CB[stage2][index][1] ) * ( target[1] - CB[stage2][index][1] ) * W[stage][1]; + bestCode = index; + + for ( index = index + 8; index < 64; index += 8 ) + { + + dist = ( target[0] - CB[stage2][index][0] ) * ( target[0] - CB[stage2][index][0] ) * W[stage][0]; + dist += ( target[1] - CB[stage2][index][1] ) * ( target[1] - CB[stage2][index][1] ) * W[stage][1]; + + if ( dist < minDist ) + { + minDist = dist; + bestCode = index; + } + } + + brCode[1] = bestCode; + brDist[1] = cDist[stage1][prev_state] + minDist; + brQuant[1][0] = CB[stage2][bestCode][0] + pred[0]; + brQuant[1][1] = CB[stage2][bestCode][1] + pred[1]; + + /* Select Best branch */ + branch = 1; + + if ( brDist[0] <= brDist[1] ) + { + branch = 0; + } + + /* Update */ + s[stage][state] = NTRANS[branch][state]; + c[stage][state] = brCode[branch]; + cDist[stage][state] = brDist[branch]; + Q[stage][state][0] = brQuant[branch][0]; + Q[stage][state][1] = brQuant[branch][1]; + } + + return; +} + + +/*--------------------------------------------------------------------------- + * BcTcvq_FixSearch() + * + * + *--------------------------------------------------------------------------*/ + +static float BcTcvq_FixSearch( + /*const*/ float x[][2], + const float CB[][32][2], + int16_t c[][4], + float Q[][16][2], + const int16_t FixBranch[][4][4], + const int16_t stage, + const int16_t inis, + const int16_t fins, + int16_t *prev_state, + /*const*/ float W[][2], + const float itc[][2][2] ) +{ + int16_t stage1, stage4, branch; + int16_t index, bestCode; + float dist, minDist; + float pred[N_DIM], target[N_DIM]; + + stage1 = stage - 1; + stage4 = stage - 4; + + branch = FixBranch[inis >> 2][fins][stage4]; + index = NTRANS2[branch + 2][*prev_state]; + + /* Prediction */ + pred[0] = itc[stage1][0][0] * Q[stage1][*prev_state][0] + itc[stage1][0][1] * Q[stage1][*prev_state][1]; + pred[1] = itc[stage1][1][0] * Q[stage1][*prev_state][0] + itc[stage1][1][1] * Q[stage1][*prev_state][1]; + target[0] = x[stage][0] - pred[0]; + target[1] = x[stage][1] - pred[1]; + + minDist = ( target[0] - CB[stage4][index][0] ) * ( target[0] - CB[stage4][index][0] ) * W[stage][0]; + minDist += ( target[1] - CB[stage4][index][1] ) * ( target[1] - CB[stage4][index][1] ) * W[stage][1]; + bestCode = index; + + for ( index = index + 8; index < 32; index += 8 ) + { + dist = ( target[0] - CB[stage4][index][0] ) * ( target[0] - CB[stage4][index][0] ) * W[stage][0]; + dist += ( target[1] - CB[stage4][index][1] ) * ( target[1] - CB[stage4][index][1] ) * W[stage][1]; + + if ( dist < minDist ) + { + minDist = dist; + bestCode = index; + } + } + + /* Update */ + *prev_state = NTRANS2[branch][*prev_state]; + c[fins][stage4] = bestCode; + Q[stage][*prev_state][0] = CB[stage4][bestCode][0] + pred[0]; + Q[stage][*prev_state][1] = CB[stage4][bestCode][1] + pred[1]; + + return minDist; +} + +/*--------------------------------------------------------------------------- + * optimalPath() + * + * + *--------------------------------------------------------------------------*/ + +static int16_t optimalPath( + /*const*/ float cDist[][16], + /*const*/ float blockDist[], + /*const*/ int16_t blockCodeword[][4], + int16_t bestCodeword[], + /*const*/ int16_t codeWord[][16], + int16_t bestState[], + int16_t preState[][16] ) +{ + int16_t stage, state; + float opDist[NUM_STATE]; + float minDist; + int16_t fBlock; + int16_t prev_state; + + for ( state = 0; state < NUM_STATE; state++ ) + { + opDist[state] = cDist[3][state] + blockDist[state]; + } + + minDist = opDist[0]; + fBlock = 0; + + for ( state = 1; state < NUM_STATE; state++ ) + { + if ( opDist[state] < minDist ) + { + minDist = opDist[state]; + fBlock = state; + } + } + + prev_state = bestState[4] = fBlock; + + for ( stage = N_STAGE_VQ - 5; stage >= 0; stage-- ) + { + bestCodeword[stage] = codeWord[stage][prev_state]; + bestState[stage] = preState[stage][prev_state]; + prev_state = bestState[stage]; + } + + for ( stage = 0; stage < 4; stage++ ) + { + bestCodeword[stage + 4] = blockCodeword[fBlock][stage]; + } + + return fBlock; +} + +/*--------------------------------------------------------------------------- + * quantEnc() + * + * + *--------------------------------------------------------------------------*/ + +static void quantEnc( + float *y, + const int16_t c[], + const float CB_SUB1[][128][2], + const float CB_SUB2[][64][2], + const float CB_SUB3[][32][2], + const float itc[][2][2] ) +{ + int16_t i, j; + int16_t stage; + float pred[N_DIM], Y[8][2]; + + /* stage #1 */ + Y[0][0] = CB_SUB1[0][c[0]][0]; + Y[0][1] = CB_SUB1[0][c[0]][1]; + + /* stage #2 */ + pred[0] = itc[0][0][0] * Y[0][0] + itc[0][0][1] * Y[0][1]; + pred[1] = itc[0][1][0] * Y[0][0] + itc[0][1][1] * Y[0][1]; + Y[1][0] = CB_SUB1[1][c[1]][0] + pred[0]; + Y[1][1] = CB_SUB1[1][c[1]][1] + pred[1]; + + /* stage #3 - #4 */ + for ( stage = 2; stage < N_STAGE_VQ - 4; stage++ ) + { + pred[0] = itc[stage - 1][0][0] * Y[stage - 1][0] + itc[stage - 1][0][1] * Y[stage - 1][1]; + pred[1] = itc[stage - 1][1][0] * Y[stage - 1][0] + itc[stage - 1][1][1] * Y[stage - 1][1]; + + Y[stage][0] = CB_SUB2[stage - 2][c[stage]][0] + pred[0]; + Y[stage][1] = CB_SUB2[stage - 2][c[stage]][1] + pred[1]; + } + + /* stage #5 - #8 */ + for ( stage = N_STAGE_VQ - 4; stage < N_STAGE_VQ; stage++ ) + { + pred[0] = itc[stage - 1][0][0] * Y[stage - 1][0] + itc[stage - 1][0][1] * Y[stage - 1][1]; + pred[1] = itc[stage - 1][1][0] * Y[stage - 1][0] + itc[stage - 1][1][1] * Y[stage - 1][1]; + + Y[stage][0] = CB_SUB3[stage - 4][c[stage]][0] + pred[0]; + Y[stage][1] = CB_SUB3[stage - 4][c[stage]][1] + pred[1]; + } + + /* Transform Vector to Scalar */ + for ( i = 0; i < N_STAGE_VQ; i++ ) + { + for ( j = 0; j < N_DIM; j++ ) + { + y[i * N_DIM + j] = Y[i][j]; + } + } + + return; +} + +/*--------------------------------------------------------------------------- + * buildCode() + * + * + *--------------------------------------------------------------------------*/ + +static void buildCode( int16_t *ind, const int16_t fins, const int16_t c[], const int16_t s[] ) +{ + int16_t stage; + int16_t BrIndex[4]; + + set_s( BrIndex, 0, ( N_STAGE_VQ - 4 ) ); + + + for ( stage = N_STAGE_VQ - 4; stage >= 1; stage-- ) + { + if ( s[stage] > 7 ) + { + BrIndex[stage - 1] = 1; + } + } + ind[0] = fins; + + /* stage #1 - #2 */ + for ( stage = 0; stage < 2; stage++ ) + { + ind[stage + 1] = BrIndex[stage] << 4; + ind[stage + 1] += c[stage] >> 3; + } + + /* stage #3 - #4 */ + for ( stage = 2; stage < N_STAGE_VQ - 4; stage++ ) + { + ind[stage + 1] = BrIndex[stage] << 3; + ind[stage + 1] += c[stage] >> 3; + } + + /* Stage #5 - #8 */ + for ( stage = N_STAGE_VQ - 4; stage < N_STAGE_VQ; stage++ ) + { + ind[stage + 1] = c[stage] >> 3; + } + + return; +} + +/*--------------------------------------------------------------------------- + * BcTcvq() + * + * + *--------------------------------------------------------------------------*/ + +static void BcTcvq( int16_t snFlag, const float *x, float *y, const float *weight, int16_t *ind ) +{ + float X[N_STAGE_VQ][N_DIM], W[N_STAGE_VQ][N_DIM]; + + /* Count Variable */ + int16_t i, j; + + /* TCVQ Structure */ + int16_t stage, state, prev_state; + int16_t preState[N_STAGE_VQ][NUM_STATE]; + int16_t codeWord[N_STAGE_VQ][NUM_STATE]; + float acumDist[N_STAGE_VQ - 4][NUM_STATE]; + int16_t inis, fins, ptr_fins; + int16_t fBlock; + int16_t fState[NUM_STATE]; + int16_t fCodeword[4][4]; + int16_t iniBlock[NUM_STATE]; + int16_t blockCodeword[NUM_STATE][4]; + + /* Prediction variable */ + float quant[N_STAGE_VQ][NUM_STATE][N_DIM]; + + /* Distortion variable */ + float minDist; + float fDist; + float blockDist[NUM_STATE]; + + /* Decoding variable */ + int16_t bestCodeword[N_STAGE_VQ]; + int16_t bestState[N_STAGE_VQ]; + + /* Code Share variable */ + const float( *TCVQ_CB_SUB1 )[128][2], ( *TCVQ_CB_SUB2 )[64][2], ( *TCVQ_CB_SUB3 )[32][2]; + const float( *IntraCoeff )[2][2]; + + /* Memoryless Module */ + if ( snFlag ) + { + TCVQ_CB_SUB1 = SN_TCVQ_CB_SUB1; + TCVQ_CB_SUB2 = SN_TCVQ_CB_SUB2; + TCVQ_CB_SUB3 = SN_TCVQ_CB_SUB3; + IntraCoeff = SN_IntraCoeff; + } + else /* Memory Module */ + { + TCVQ_CB_SUB1 = AR_TCVQ_CB_SUB1; + TCVQ_CB_SUB2 = AR_TCVQ_CB_SUB2; + TCVQ_CB_SUB3 = AR_TCVQ_CB_SUB3; + IntraCoeff = AR_IntraCoeff; + } + + /* Transform Scalar to Vector */ + for ( i = 0; i < N_STAGE_VQ; i++ ) + { + for ( j = 0; j < N_DIM; j++ ) + { + X[i][j] = x[( N_DIM * i ) + j]; + W[i][j] = weight[( N_DIM * i ) + j]; + } + } + + /* Initialzie */ + for ( i = 0; i < N_STAGE_VQ - 4; i++ ) + { + for ( j = 0; j < NUM_STATE; j++ ) + { + acumDist[i][j] = 0.f; + } + } + + /* BcTcvq Search */ + /* stage #1 */ + BcTcvq_1st( X, TCVQ_CB_SUB1, preState, codeWord, acumDist, quant, W ); + + /* stage #2 */ + BcTcvq_2nd( X, TCVQ_CB_SUB1, preState, codeWord, acumDist, quant, W, IntraCoeff ); + + /* stage #3 - #4 */ + for ( stage = 2; stage < N_STAGE_VQ - 4; stage++ ) + { + BcTcvq_SubBlock( X, TCVQ_CB_SUB2, preState, codeWord, acumDist, quant, stage, W, IntraCoeff ); + } + + /* Search initial state at each block */ + for ( state = 0; state < NUM_STATE; state++ ) + { + prev_state = state; + + for ( stage = N_STAGE_VQ - 5; stage >= 0; stage-- ) + { + prev_state = preState[stage][prev_state]; + } + iniBlock[state] = prev_state; + } + + /* stage #5 - #8 */ + for ( state = 0; state < NUM_STATE; state++ ) + { + inis = iniBlock[state]; + ptr_fins = inis >> 2; + + minDist = FLT_MAX; + + for ( i = 0; i < 4; i++ ) + { + fins = ptr_fins * 4 + i; + + prev_state = state; + fDist = BcTcvq_FixSearch( X, TCVQ_CB_SUB3, fCodeword, quant, FixBranch_tbl, N_STAGE_VQ - 4, inis, i, &prev_state, W, IntraCoeff ); + + for ( stage = N_STAGE_VQ - 3; stage < N_STAGE_VQ; stage++ ) + { + fDist += BcTcvq_FixSearch( X, TCVQ_CB_SUB3, fCodeword, quant, FixBranch_tbl, stage, inis, i, &prev_state, W, IntraCoeff ); + } + + if ( fDist < minDist ) + { + minDist = fDist; + blockDist[state] = minDist; + fState[state] = fins; + + for ( j = 0; j < 4; j++ ) + { + blockCodeword[state][j] = fCodeword[i][j]; + } + } + } + } + + /* Select optimal path */ + fBlock = optimalPath( acumDist, blockDist, blockCodeword, bestCodeword, codeWord, bestState, preState ); + + /* Select Quantized Value */ + quantEnc( y, bestCodeword, TCVQ_CB_SUB1, TCVQ_CB_SUB2, TCVQ_CB_SUB3, IntraCoeff ); + + /* Buid Code for Decoder */ + buildCode( ind, fState[fBlock], bestCodeword, bestState ); + + return; +} + + +/*--------------------------------------------------------------------------- + * SVQ_2d() + * + * + *--------------------------------------------------------------------------*/ + +static int16_t SVQ_2d( + const float *x, + float *y, + const float *W, + const float CB[][8], + const int16_t Size ) +{ + int16_t i, j; + int16_t index = 0; + float distortion; + float temp; + + temp = FLT_MAX; + + for ( i = 0; i < Size; i++ ) + { + distortion = 0.0; + for ( j = 0; j < 8; j++ ) + { + distortion += ( x[j] - CB[i][j] ) * ( x[j] - CB[i][j] ) * W[j]; + } + + if ( distortion < temp ) + { + temp = distortion; + index = i; + } + } + + for ( i = 0; i < M / 2; i++ ) + { + y[i] = CB[index][i]; + } + + return index; +} + + +/*--------------------------------------------------------------------------- + * qlsf_ARSN_tcvq_Enc_16k() + * + * Predictive BC-TCQ encoder for LSF quantization + *--------------------------------------------------------------------------*/ + +static float qlsf_ARSN_tcvq_Enc_16k( + const float *x, /* i : Vector to be encoded */ + float *y, /* o : Quantized LSF vector */ + int16_t *indice, /* o : Indices */ + const float *w, /* i : LSF Weights */ + const int16_t nBits, /* i : number of bits */ + const int16_t safety_net /* i : safety_net flag */ +) +{ + int16_t i; + float temp_f; + float yy[M]; + float error_svq[M], error_svq_q[M]; + float x_q[M]; + if ( safety_net == 1 ) + { + indice[0] = 1; + BcTcvq( 1, x, x_q, w, &indice[1] ); + + if ( nBits > 30 ) + { + /* SVQ */ + for ( i = 0; i < M; i++ ) + { + error_svq[i] = ( x[i] - x_q[i] ) * scale_inv_ARSN[i]; + } + + /* 5bits 1st Split VQ for Residual*/ + indice[10] = SVQ_2d( error_svq, error_svq_q, w, AR_SVQ_CB1, 32 ); + /* 4bits 2nd Split VQ for Residual*/ + indice[11] = SVQ_2d( &error_svq[8], &error_svq_q[8], &w[8], AR_SVQ_CB2, 16 ); + + for ( i = 0; i < M; i++ ) + { + x_q[i] = x_q[i] + ( error_svq_q[i] * scale_ARSN[i] ); + } + } + } + else + { + indice[0] = 0; + BcTcvq( 0, x, x_q, w, &indice[1] ); + + if ( nBits > 30 ) + { + /* SVQ */ + for ( i = 0; i < M; i++ ) + { + error_svq[i] = x[i] - x_q[i]; + } + + /* 5bits 1st Split VQ for Residual*/ + indice[10] = SVQ_2d( error_svq, error_svq_q, w, AR_SVQ_CB1, 32 ); + /* 4bits 2nd Split VQ for Residual*/ + indice[11] = SVQ_2d( &error_svq[8], &error_svq_q[8], &w[8], AR_SVQ_CB2, 16 ); + + for ( i = 0; i < M; i++ ) + { + x_q[i] = x_q[i] + error_svq_q[i]; + } + } + } + + v_sub( x_q, x, yy, M ); + v_mult( yy, yy, yy, M ); + temp_f = dotp( yy, w, M ); + + /* Recover the quantized LSF */ + mvr2r( x_q, y, M ); + + return temp_f; +} + +/*-------------------------------------------------------------------* + * lsf_mid_enc() + * + * Mid-frame LSF quantization + --------------------------------------------------------------------*/ + +static void lsf_mid_enc( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + int16_t nb_bits, /* i : number of bits */ + const int32_t int_fs, /* i : internal (ACELP) sampling frequency */ + const float qlsp0[], /* i : quantized LSPs from frame beginning */ + const float qlsp1[], /* i : quantized LSPs from frame end */ + float lsp[], /* i/o: mid-frame LSP */ + const int16_t coder_type, /* i : coding type */ + const int16_t bwidth, /* i : input signal bandwidth */ + const float Bin_Ener[], /* i : per bin log energy spectrum */ + const int16_t ppp_mode, + const int16_t nelp_mode ) +{ + float ftemp, lsf[M], qlsf[M], qlsf1[M], qlsf0[M], wghts[M], err, err_min; + int16_t j, k, idx, size = 0; + const float *ratio = 0; + + /* convert LSPs to LSFs */ + lsp2lsf( lsp, lsf, M, int_fs ); + lsp2lsf( qlsp0, qlsf0, M, int_fs ); + lsp2lsf( qlsp1, qlsf1, M, int_fs ); + + Unified_weighting( Bin_Ener, lsf, wghts, bwidth == NB, coder_type == UNVOICED, (int32_t) ( int_fs ), M ); + + /* codebook selection, number of bits, size of the codebook */ + if ( ppp_mode == 0 && nelp_mode == 0 ) + { + /* codebook selection */ + if ( coder_type == VOICED ) + { + switch ( nb_bits ) + { + case 5: + { + ratio = tbl_mid_voi_wb_5b; + break; + } + case 4: + { + ratio = tbl_mid_voi_wb_4b; + break; + } + case 1: + { + ratio = tbl_mid_voi_wb_1b; + break; + } + } + } + else if ( coder_type == UNVOICED ) + { + ratio = tbl_mid_unv_wb_5b; + } + else + { + /* GENERIC, TRANSITION, AUDIO and INACTIVE */ + switch ( nb_bits ) + { + case 5: + { + ratio = tbl_mid_gen_wb_5b; + break; + } + case 4: + { + ratio = tbl_mid_gen_wb_4b; + break; + } + case 2: + { + ratio = tbl_mid_gen_wb_2b; + break; + } + } + } + + size = 1 << nb_bits; + } + else if ( ppp_mode == 1 ) + { + ratio = tbl_mid_voi_wb_1b; + nb_bits = 1; + size = 2; + } + else if ( nelp_mode == 1 ) + { + ratio = tbl_mid_unv_wb_4b; + nb_bits = 4; + size = 16; + } + + /* loop over codevectors */ + err_min = 1e30f; + idx = 0; + for ( k = 0; k < size; k++ ) + { + err = 0; + + for ( j = 0; j < M; j++ ) + { + qlsf[j] = ( 1.0f - ratio[k * M + j] ) * qlsf0[j] + ratio[k * M + j] * qlsf1[j]; + + if ( j > 0 && j < M && qlsf[j] < qlsf[j - 1] + LSF_GAP_MID ) + { + qlsf[j] = qlsf[j - 1] + LSF_GAP_MID; + } + + ftemp = lsf[j] - qlsf[j]; + err += wghts[j] * ftemp * ftemp; + } + + if ( err < err_min ) + { + err_min = err; + idx = k; + } + } + + /* calculate the quantized LSF vector */ + for ( j = 0; j < M; j++ ) + { + qlsf[j] = ( 1.0f - ratio[idx * M + j] ) * qlsf0[j] + ratio[idx * M + j] * qlsf1[j]; + + if ( j > 0 && j < M && qlsf[j] < qlsf[j - 1] + LSF_GAP_MID ) + { + qlsf[j] = qlsf[j - 1] + LSF_GAP_MID; + } + } + + reorder_lsf( qlsf, LSF_GAP_MID, M, int_fs ); + + /* convert LSFs back to LSPs */ + lsf2lsp( qlsf, lsp, M, int_fs ); + + push_indice( hBstr, IND_MID_FRAME_LSF_INDEX, idx, nb_bits ); + + return; +} diff --git a/lib_enc/lsf_msvq_ma_enc.c b/lib_enc/lsf_msvq_ma_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..b825109dd3a037e3c70c16ee8fbe6847738e6557 --- /dev/null +++ b/lib_enc/lsf_msvq_ma_enc.c @@ -0,0 +1,862 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "ivas_prot.h" +#include "prot.h" +#include "rom_com.h" +#include "rom_enc.h" +#include "basop_proto_func.h" +#include "wmc_auto.h" + + +/*--------------------------------------------------------------------------* + * Local constants + *--------------------------------------------------------------------------*/ + +#define kMaxC 8 + + +/*--------------------------------------------------------------------------* + * msvq_encmsvq_stage1_dct_search() + * + * stage1 search in a segmentwise truncated dct N domain without weights + *--------------------------------------------------------------------------*/ + +/*! r: (p_max , best candidate sofar ) */ +int16_t msvq_stage1_dct_search( + const float *u, /* i : target */ + const int16_t N, /* i : target length and IDCT synthesis length */ + const int16_t maxC_st1, /* i : number of final stage 1 candidates to provide */ + const DCTTYPE dcttype, /* e.g. DCT_T2_16_XX, DCT_T2_24_XX; */ + const int16_t max_dct_trunc, /* i : maximum of truncation lenghts */ + float *invTrfMatrix, /* i : IDCT synthesis matrix for dim N */ + const float *midQ_truncQ, /* i : midQ vector */ + const float *dct_invScaleF, /* i : global inv scale factors */ + const float *dct_scaleF, /* i : global scale factors */ + const Word16 n_segm, /* i : number of segments */ + const Word16 *cols_per_segment, /* i : remaining length per segment */ + const Word16 *trunc_dct_cols_per_segment, /* i : trunc length per segment */ + const Word16 *entries_per_segment, /* i : number of rows per segment */ + const Word16 *cum_entries_per_segment, /* i : number of cumulative entries */ + const Word8 *const W8Qx_dct_sections[], /* i : Word8(byte) segment table ptrs */ + const Word16 *col_syn_shift[], /* i : columnwise syn shift tables */ + const Word8 *segm_neighbour_fwd, /* i : circular neighbour list fwd */ + const Word8 *segm_neighbour_rev, /* i : circular neighbour list reverse */ + const Word16 npost_check, /* i : number of neigbours to check , should be even */ + float *st1_mse_ptr, /* i : dynRAM buffer for MSEs */ + int16_t *indices_st1_local, /* o : selected cand indices */ + float *st1_syn_vec_ptr, /* i/o: buffer for IDCT24 synthesis */ + float *dist1_ptr /* o : resulting stage 1 MSEs in DCT-N domain */ +) +{ + float dct_target[FDCNG_VQ_DCT_MAXTRUNC]; + float u_mr[FDCNG_VQ_MAX_LEN]; + float u_mr_scaled[FDCNG_VQ_MAX_LEN]; + float mse_trunc_segm[FDCNG_VQ_DCT_NSEGM]; + float tmp, check_mse; + float mse; /* Word32 in BASOP */ + + int16_t p_max, c, c2, segm, j_full, j, i; + int16_t n_ana, p_mins[2], idx_min[2]; + + const Word8 *cbpW8; + const Word16 *dct_col_shift_tab; + + float *st1_mse_pair; + int16_t *st1_idx_pair; + + float tmp2; + int16_t check_ind[FDCNG_VQ_DCT_NPOST]; + assert( ( npost_check % 2 == 0 ) && ( npost_check <= FDCNG_VQ_DCT_NPOST ) ); + + assert( n_segm <= FDCNG_VQ_DCT_NSEGM ); + + n_ana = N; /* VQ stage#1 core is currently always using stored DCT N coeffs */ + assert( n_ana >= max_dct_trunc ); /* check for FDCNGVQ WB , SWB, FB operation */ + + /* remove mid stage#1 vector, in original input domain */ + v_sub( u, midQ_truncQ, u_mr, n_ana ); + + v_multc( u_mr, dct_invScaleF[1], u_mr_scaled, n_ana ); /* scale up target to upscaled W8x storage domain */ + /* 16.0-->scale up from Q0 to search domain in Q4, not really needed in BASOP , impl. by shifts */ + + dctT2_N_apply_matrix( (const float *) u_mr_scaled, dct_target, min( max_dct_trunc, n_ana ), n_ana, invTrfMatrix, max_dct_trunc, dcttype ); + + /* init search state ptr's at the top */ + set_f( dist1_ptr, FLT_MAX, maxC_st1 ); + st1_mse_pair = &( dist1_ptr[0] ); /* req. ptr post upd +=2 */ + st1_idx_pair = &( indices_st1_local[0] ); /* req. ptr post upd +=2 */ + set_f( mse_trunc_segm, 0.0f, n_segm ); + + for ( segm = 0; segm < n_segm; segm++ ) + { /* point to a new paired location for each segment */ + p_max = 0; /* req. to point to one of 1 or 0, this init can potentially be omitted here,as p_max is always 1 or 0 */ + + /* compute segment common trunction error in dctN domain */ + mse_trunc_segm[segm] += sum2_f( (const float *) ( &( dct_target[cols_per_segment[segm]] ) ), trunc_dct_cols_per_segment[segm] ); + + cbpW8 = W8Qx_dct_sections[segm]; /* Word8 column variable Qx storage , table ptr init */ + + for ( j = 0; j < entries_per_segment[segm]; j++ ) + { + /* unweighted segmented search DCT domain loop */ + j_full = j + cum_entries_per_segment[segm]; /* or simply use j_full++ */ + + mse = mse_trunc_segm[segm]; /* init mse with with common mse truncation part, in BASOP a move32() */ + + dct_col_shift_tab = col_syn_shift[segm]; /* ptr init */ + + for ( c2 = 0; c2 < cols_per_segment[segm]; c2++ ) + { +#define WMC_TOOL_SKIP + tmp = dct_target[c2] - (float) shl( (Word16) cbpW8[c2], dct_col_shift_tab[c2] ); /* note: BASOP shift left defined for signed integers */ + LOGIC( 1 ); + SHIFT( 1 ); + ADD( 1 ); /* in BASOP: s_and(for W8->W16), shl(), sub()*/ +#undef WMC_TOOL_SKIP + mse += tmp * tmp; /* L_mac or L_mac0() square Word16 -> Word32*/ + } + st1_mse_ptr[j_full] = mse; /* save MSE in shared dynamic RAM, move32() in BASOP */ + +#define WMC_TOOL_SKIP + cbpW8 += cols_per_segment[segm]; /* fixed pointer increment for each segment */ +#undef WMC_TOOL_SKIP + + /* overwrite with a new worst index at p_max */ + + /* Note: The three inner loop if's below are not 100% properly instrumented by WMC tool */ + if ( mse < st1_mse_pair[p_max] ) /* L_sub */ + { + st1_idx_pair[p_max] = j_full; /* move16, single BASOP */ + } /* BASOP 2 ops */ + + if ( st1_idx_pair[p_max] == j_full ) + { /* idx updated --> also update mse */ + st1_mse_pair[p_max] = mse; /* move32(), single BASOP */ + } /* BASOP 3 ops */ + + /* avoid WC costly candidate list management by always updating p_max, + as we have only a pair in each segment to maintain */ + p_max = 0; /* move16() */ + if ( ( st1_mse_pair[0] - st1_mse_pair[1] ) < 0 ) /* L_sub()*/ + { + p_max = 1; /* move16() */ + } /* BASOP 3 ops ,Note 2 ops possible in BASOP with L_sub and L_lshr */ + + /* Note: logical shift right not available in ANSI-C */ + /* p_max = (st1_mse_pair[0] - st1_mse_pair[1]) ">>>" 31; */ + /* in java logical shift right is available as >>> , in BASOP it is available as L_lshr */ + + /* Cost: weighted sum with cond moves ('if') => 8 in float , 7 in BASOP with L_lshr */ + } /* j in section */ + + st1_mse_pair += 2; /* req. ptr init */ + st1_idx_pair += 2; /* req. ptr init */ + + } /* next segment */ + + for ( j = 0; j < maxC_st1; j++ ) + { + /* compute_full mse using stored DCT24 domain MSE's */ + /* calculate MSE from stage1 inner using existing inner DCT domain variables */ + dist1_ptr[j] *= dct_scaleF[2]; /* multiplication to get the DCT inner MSE scale to the correct input domain */ + } + + assert( ( maxC_st1 >= 3 ) ); + assert( ( maxC_st1 <= 8 ) ); + + p_max = maximum( dist1_ptr, maxC_st1, NULL ); /* establish current worst candidate for MSVQ stage#2 among all maxC_st1 candidates so far */ + + p_mins[0] = minimum( dist1_ptr, maxC_st1, NULL ); /* find best entry among all maxC_pre */ + tmp = dist1_ptr[p_mins[0]]; + dist1_ptr[p_mins[0]] = FLT_MAX; /* exclude 1st */ + + p_mins[1] = minimum( dist1_ptr, maxC_st1, NULL ); /* find 2nd best entry */ + tmp2 = dist1_ptr[p_mins[1]]; + dist1_ptr[p_mins[1]] = FLT_MAX; /* exclude 2nd */ + + dist1_ptr[p_mins[0]] = tmp; /* restore 1st */ + dist1_ptr[p_mins[1]] = tmp2; /* restore 2nd */ + + idx_min[0] = indices_st1_local[p_mins[0]]; + idx_min[1] = indices_st1_local[p_mins[1]]; + + + /* use global exclusion list to never reselect the two (best) global MSE values sofar */ + st1_mse_ptr[idx_min[0]] = FLT_MAX; /* move32() */ + st1_mse_ptr[idx_min[1]] = FLT_MAX; /* move32() */ + + /* circular MSE-neigbour list in use to potentially replace some segment search candidates */ + /* using both 1st and 2nd best neighbours in fwd and rev directions */ + check_ind[0] = segm_neighbour_fwd[idx_min[0]]; + check_ind[1] = segm_neighbour_rev[idx_min[0]]; + + check_ind[2] = segm_neighbour_fwd[idx_min[1]]; + check_ind[3] = segm_neighbour_rev[idx_min[1]]; + + check_ind[4] = segm_neighbour_fwd[check_ind[0]]; + check_ind[5] = segm_neighbour_rev[check_ind[1]]; + + check_ind[6] = segm_neighbour_fwd[check_ind[2]]; + check_ind[FDCNG_VQ_DCT_NPOST - 1] = segm_neighbour_rev[check_ind[3]]; + + for ( i = 0; i < npost_check; i++ ) + { + /* move MSE from DCT-inner loop search to input synthesis domain */ + /* multiplication by fdcng_dct_scaleF[2] to get the float outer loop scale correct in IDCT synthesis domain */ + check_mse = st1_mse_ptr[check_ind[i]] * dct_scaleF[2]; + + if ( check_mse < dist1_ptr[p_max] ) + { /* new winner , replace worst */ + dist1_ptr[p_max] = check_mse; + indices_st1_local[p_max] = check_ind[i]; + st1_mse_ptr[check_ind[i]] = FLT_MAX; /* exclude, BASOP: move32() */ + p_max = maximum( dist1_ptr, maxC_st1, NULL ); /* establish a new current worst candidate among all maxC */ + } + } + + /* extract the selected stage one vectors in DCT_N domain , apply IDCT_N and scale up */ + /* always extract full length signal(e.g. 24) to be able to update WB(e.g. N_in==21) candidate MSE values */ + /* in the case that only a part of the IDCT N vector is in final use */ + + /* note: synthesis not yet fully parameterized/generalized for other IDCT lengths */ + assert( N == 24 ); + { + for ( c = 0; c < maxC_st1; c++ ) + { + dec_FDCNG_MSVQ_stage1( indices_st1_local[c], N, invTrfMatrix, dcttype + 1, &( st1_syn_vec_ptr[c * N] ), NULL ); + } + } + + return p_max; /*ptr to worst performing candidate */ +} + + +/*--------------------------------------------------------------------------* + * msvq_stage1_dct_recalc_candidates_fdcng_wb() + * + * recalc MSE for fdcng WB(0..20) coeffs , + essentially subtract res21^2 ,res22^2, res23^2 that was included in stage1 MSE in the DCT24 domain truncated search, + excludes the waveform contributions at pos 21,22,23 to the MSE, important to keep the WB MSEs update for the subsequent stages + *--------------------------------------------------------------------------*/ + +/*! r: (updated p_max) */ +int16_t msvq_stage1_dct_recalc_candidates_fdcng_wb( + const float *st1_syn_vec_ptr, /* i : IDCT24 synthesis vectors */ + const float *u, /* i : target signal */ + const int16_t maxC_st1, /* i : number of candidates in stage1 */ + float *dist_ptr /* i/o: updated MSE vector for stage1 */ +) +{ + int16_t p_max_local, c; + const float *p2; + float res24, high_diff[FDCNG_VQ_MAX_LEN - FDCNG_VQ_MAX_LEN_WB]; + + for ( c = 0; c < maxC_st1; c++ ) + { /* point to extended synthesis part */ + p2 = (const float *) &( st1_syn_vec_ptr[c * FDCNG_VQ_MAX_LEN + FDCNG_VQ_MAX_LEN_WB] ); /* ptr init to synthesis candidate c */ + /* for stage#1 use "u" instead of the shortened resid[0], to access the extended/extrapolated input target */ + v_sub( p2, &( u[FDCNG_VQ_MAX_LEN_WB] ), high_diff, FDCNG_VQ_MAX_LEN - FDCNG_VQ_MAX_LEN_WB ); + res24 = dotp( high_diff, high_diff, FDCNG_VQ_MAX_LEN - FDCNG_VQ_MAX_LEN_WB ); /* sum squared over top env. values above WB coeffs */ + + dist_ptr[c] -= res24; /* remove DCT24 high band error contribution */ + } + + /* finally update p_max, as it may potentially change, + due to the core DCT24 search originally optimizing over the longer basis vectors than DCT21 */ + p_max_local = maximum( dist_ptr, maxC_st1, NULL ); + + return p_max_local; +} + + +/*--------------------------------------------------------------------------* + * msvq_enc() + * + * MSVQ encoder + *--------------------------------------------------------------------------*/ + +void msvq_enc( + const float *const *cb, /* i : Codebook (indexed cb[*stages][levels][p]) */ + const int16_t dims[], /* i : Dimension of each codebook stage (NULL: full dim.) */ + const int16_t offs[], /* i : Starting dimension of each codebook stage (NULL: 0) */ + const float u[], /* i : Vector to be encoded (prediction and mean removed) */ + const int16_t *levels, /* i : Number of levels in each stage */ + const int16_t maxC, /* i : Tree search size (number of candidates kept from one stage to the next == M-best) */ + const int16_t stages, /* i : Number of stages */ + const float w[], /* i : Weights */ + const int16_t N, /* i : Vector dimension */ + const int16_t maxN, /* i : Codebook dimension */ + const int16_t applyDCT_flag, /* i : applyDCT flag */ + float *invTrfMatrix, /* i/o: synthesis matrix */ + int16_t Idx[] /* o : Indices */ +) +{ + float *resid[2], *dist[2]; + float en, tmp, *pTmp, *p1; + const float *cb_stage, *cbp, *p2; + int16_t *indices[2]; + int16_t j, m, s, c, c2, p_max, i; + float resid_buf[2 * LSFMBEST_MAX * M_MAX], dist_buf[2 * LSFMBEST_MAX], Tmp[M_MAX]; + int16_t idx_buf[2 * LSFMBEST_MAX * MAX_VQ_STAGES_USED], parents[LSFMBEST_MAX]; + int16_t n, maxn, start; + float *st1_syn_vec_ptr; /* ptr to buffer in dynRAM */ + float *st1_mse_ptr; /* ptr to buffer in existing dRAM used for stage 1 candidate analysis */ + int16_t indices_st1_local[FDCNG_VQ_DCT_NSEGM * 2]; /* after stage#1 DCT search this is copied to the global indices[1][s*stages] structure */ + assert( maxC <= LSFMBEST_MAX ); + assert( ( LSFMBEST_MAX * M_MAX ) > ( N * maxC ) ); + /* top of resid_buf is resid[1] and used for stage#1 residuals (input target u), + we here reuse resid[0] part of the buffer for stage#1 DCT dynamic RAM needs */ + st1_mse_ptr = &( resid_buf[1 * LSFMBEST_MAX * M_MAX] ) - ( levels[0] ); /* reuse top of residual resid[0] scratch RAM for stage1 MSEs */ + + st1_syn_vec_ptr = &( resid_buf[1 * LSFMBEST_MAX * M_MAX] ) - FDCNG_VQ_MAX_LEN * maxC; /* reuse top of resid[0] scratch RAM for residual */ + + + /*----------------------------------------------------------------* + * Allocate memory for previous (parent) and current nodes. + * Parent node is indexed [0], current node is indexed [1]. + *----------------------------------------------------------------*/ + + indices[0] = idx_buf; + indices[1] = idx_buf + maxC * stages; + set_s( idx_buf, 0, 2 * stages * maxC ); + + resid[0] = resid_buf; + pTmp = resid_buf + maxC * N; + resid[1] = pTmp; + + dist[0] = dist_buf; + dist[1] = dist_buf + maxC; + set_s( parents, 0, maxC ); + + /* Set up initial distance vector */ + for ( tmp = 0.0, j = 0; j < N; j++ ) + { + tmp += u[j] * u[j] * w[j]; + } + set_f( dist[1], tmp, maxC ); + + /* Set up initial error (residual) vectors */ + for ( c = 0; c < maxC; c++ ) + { + for ( i = 0; i < N; i++ ) + { + *pTmp++ = u[i]; + } + } + + /* Loop over all stages */ + for ( m = 1, s = 0; s < stages; s++ ) + { + /* codebook pointer is set to point to first stage */ + cbp = cb[s]; + /* Save pointer to beginning of current stage */ + cb_stage = cbp; + + /* Set up pointers to parent and current nodes */ +#define WMC_TOOL_SKIP + swap( indices[0], indices[1], int16_t * ); + MOVE( 3 ); + swap( resid[0], resid[1], float * ); + MOVE( 3 ); + swap( dist[0], dist[1], float * ); + MOVE( 3 ); +#undef WMC_TOOL_SKIP + + /* p_max points to maximum distortion node (worst of best) */ + p_max = 0; + + if ( dims ) + { + n = dims[s]; + maxn = dims[s]; + } + else + { + n = N; + maxn = maxN; + } + + if ( offs ) + { + start = offs[s]; + } + else + { + start = 0; + } + + set_zero( Tmp, start ); + set_zero( Tmp + start + n, N - ( start + n ) ); + /* Set distortions to a large value */ + for ( j = 0; j < maxC; j++ ) + { + dist[1][j] = FLT_MAX; + } + + if ( !s && applyDCT_flag != 0 ) /* means: m==1 */ + { + /* stage 1 candidates search in truncated dct24 domain without any weights */ + assert( N == FDCNG_VQ_MAX_LEN || N == FDCNG_VQ_MAX_LEN_WB ); /* 21 and 24 allowed */ + assert( maxC == 2 * FDCNG_VQ_DCT_NSEGM ); + + p_max = msvq_stage1_dct_search( u, FDCNG_VQ_MAX_LEN, maxC, DCT_T2_24_XX, FDCNG_VQ_DCT_MAXTRUNC, invTrfMatrix, cdk1r_tr_midQ_truncQ, fdcng_dct_invScaleF, fdcng_dct_scaleF, FDCNG_VQ_DCT_NSEGM, + cdk1_ivas_cols_per_segment, cdk1_ivas_trunc_dct_cols_per_segment, cdk1_ivas_entries_per_segment, cdk1_ivas_cum_entries_per_segment, cdk_37bits_ivas_stage1_W8Qx_dct_sections, + stage1_dct_col_syn_shift, cdk1_ivas_segm_neighbour_fwd, cdk1_ivas_segm_neighbour_rev, FDCNG_VQ_DCT_NPOST, st1_mse_ptr, indices_st1_local, st1_syn_vec_ptr, dist[1] ); + + + /* move established stage#1 indices to the global MSVQ list structure */ + for ( c = 0; c < maxC; c++ ) + { + indices[1][c * stages] = indices_st1_local[c]; + } + } + else + /* non-DCT Stage #1 code below */ + if ( !s ) /* means: m==1 */ + { + /* This loop is identical to the one below, except, that the inner loop over c=0..m is hardcoded to c=0, since m=1. */ + /* dist[0][0] */ + for ( j = 0; j < levels[s]; j++ ) + { + en = 0.0f; + /* w,Tmp */ + /* Compute weighted codebook element and its energy */ + for ( c2 = 0; c2 < n; c2++ ) + { + Tmp[start + c2] = w[start + c2] * cbp[c2]; + en += cbp[c2] * Tmp[start + c2]; + } + cbp += maxn; /* pointer is incremented */ + + pTmp = &resid[0][0]; + /* Tmp */ + tmp = ( *pTmp++ ) * Tmp[0]; + for ( c2 = 1; c2 < N; c2++ ) + { + tmp += ( *pTmp++ ) * Tmp[c2]; + } + tmp = en - 2.0f * tmp; + tmp += dist[0][0]; + if ( tmp < dist[1][p_max] ) + { + /* Replace worst */ + dist[1][p_max] = tmp; + indices[1][p_max * stages] = j; + parents[p_max] = 0; + + p_max = 0; + for ( c2 = 1; c2 < maxC; c2++ ) + { + if ( dist[1][c2] > dist[1][p_max] ) + { + p_max = c2; + } + } + } /* if (tmp <= dist[1][p_max]) */ + } /* for (j=0; j dist[1][p_max] ) + { + p_max = c2; + } + } + } /* if (tmp <= dist[1][p_max]) */ + } /* for(c=0; c 0 && j < N && pred[j] < pred[j - 1] + LSF_GAP_MID ) + { + pred[j] = pred[j - 1] + LSF_GAP_MID; + } + + tmp = lsf[j] - pred[j]; + err += wghts[j] * tmp * tmp; + } + + if ( err < err_min ) + { + err_min = err; + *idx = k; + } + } + + return; +} + + +/*--------------------------------------------------------------------------* + * Q_lsf_tcxlpc() + * + * + *--------------------------------------------------------------------------*/ + +/*! r: number of indices */ +int16_t Q_lsf_tcxlpc( + /* const */ float lsf[], /* i : original lsf */ + float lsf_q[], /* o : quantized lsf */ + Word16 lsp_q_ind[], /* o : quantized lsp (w/o MA prediction) */ + int16_t indices[], /* o : VQ indices */ + const int16_t narrowband, /* i : narrowband flag */ + const int16_t cdk, /* i : codebook selector */ + const float mem_MA[], /* i : MA memory */ + const int16_t coder_type, /* i : acelp extended mode */ + const float *Bin_Ener /* i : Spectrum energy */ +) +{ + float weights[M]; + float pred[M16k]; + int16_t i, NumIndices; + const float *means; + Word16 lsf_q_ind[M16k]; + float lsf_rem[M]; + float lsf_rem_q[M]; + Word16 lsf_rem_q_ind[M]; + + Unified_weighting( &Bin_Ener[L_FFT / 2], lsf, weights, narrowband, coder_type == UNVOICED, 12800, M ); + + NumIndices = 0; + + /* Put disabled flag */ + indices[NumIndices++] = 0; + + /* Inter-frame prediction */ + means = lsf_means[narrowband]; + for ( i = 0; i < M; ++i ) + { + pred[i] = means[i] + MU_MA * mem_MA[i]; + } + + /* Subtract prediction */ + for ( i = 0; i < M; ++i ) + { + lsf[i] -= pred[i]; + } + + + msvq_enc( lsf_codebook[narrowband][cdk], lsf_dims, lsf_offs, lsf, lsf_numlevels, kMaxC, TCXLPC_NUMSTAGES, weights, M, M, 0, NULL, indices + NumIndices ); + msvq_dec( lsf_codebook[narrowband][cdk], lsf_dims, lsf_offs, TCXLPC_NUMSTAGES, M, M, indices + NumIndices, 0, NULL, lsf_q, lsf_q_ind ); + + NumIndices += TCXLPC_NUMSTAGES; + + /* Update flag */ + indices[0] = lsf_ind_is_active( lsf_q_ind, lsf_means[narrowband], narrowband, cdk ); + + /* Get residual vector */ + for ( i = 0; i < M; ++i ) + { + lsf_rem[i] = ( pred[i] + lsf[i] ) - ( lsf_means[narrowband][i] + lsf_q_ind[i] / (float) ( 2.0f * 1.28f ) ); + } + /* Quantize using extra stage(s) */ + msvq_enc( lsf_ind_codebook[narrowband][cdk], lsf_ind_dims, lsf_ind_offs, lsf_rem, lsf_ind_numlevels, kMaxC, TCXLPC_IND_NUMSTAGES, weights, M, M, 0, NULL, indices + NumIndices ); + + /* Only add contribution if flag is enabled */ + if ( indices[0] ) + { + /* Decode */ + msvq_dec( lsf_ind_codebook[narrowband][cdk], lsf_ind_dims, lsf_ind_offs, TCXLPC_IND_NUMSTAGES, M, M, indices + NumIndices, 0, NULL, lsf_rem_q, lsf_rem_q_ind ); + NumIndices += TCXLPC_IND_NUMSTAGES; + + /* Add to MA-removed vector */ + for ( i = 0; i < M; ++i ) + { + lsf_q_ind[i] = add( lsf_q_ind[i], lsf_rem_q_ind[i] ); + } + } + + /* Add inter-frame prediction */ + for ( i = 0; i < M; ++i ) + { + lsf_q[i] += pred[i]; + lsf[i] += pred[i]; + } + + reorder_lsf( lsf_q, TCXLPC_LSF_GAP, M, INT_FS_12k8 ); + for ( i = 0; i < M; ++i ) + { + lsf_q_ind[i] = add( lsf_q_ind[i], LSFM( lsf_means[narrowband][i] ) ); + move16(); + } + + basop_reorder_lsf( lsf_q_ind, LSF_GAP_VAL( TCXLPC_LSF_GAP ), M, INT_FS_FX ); + if ( lsp_q_ind ) + { + basop_lsf2lsp( lsf_q_ind, lsp_q_ind ); + } + + return NumIndices; +} + + +/*--------------------------------------------------------------------------* + * enc_lsf_tcxlpc() + * + * + *--------------------------------------------------------------------------*/ + +/*! r: number of bits written */ +int16_t enc_lsf_tcxlpc( + const int16_t **indices, /* i : Ptr to VQ indices */ + BSTR_ENC_HANDLE hBstr /* i/o: encoder bitstream handle */ +) +{ + int16_t i, NumBits, flag; + + /* Read flag */ + flag = ( *indices )[0]; + ++*indices; + + NumBits = TCXLPC_NUMBITS; + for ( i = 0; i < TCXLPC_NUMSTAGES; ++i ) + { + push_next_indice( hBstr, **indices, lsf_numbits[i] ); + ++*indices; + } + if ( flag ) + { + NumBits += TCXLPC_IND_NUMBITS; + for ( i = 0; i < TCXLPC_IND_NUMSTAGES; ++i ) + { + push_next_indice( hBstr, **indices, lsf_ind_numbits[i] ); + ++*indices; + } + } + + return NumBits; +} + + +/*--------------------------------------------------------------------------* + * lsf_bctcvq_encprm() + * + * + *--------------------------------------------------------------------------*/ + +int16_t lsf_bctcvq_encprm( + BSTR_ENC_HANDLE hBstr, + const int16_t *param_lpc, + const int16_t *bits_param_lpc, + const int16_t no_indices ) +{ + int16_t i, nbits_lpc; + + nbits_lpc = 0; + + for ( i = 0; i < no_indices; i++ ) + { + push_next_indice( hBstr, *param_lpc, bits_param_lpc[i] ); + param_lpc++; + nbits_lpc += bits_param_lpc[i]; + } + + return nbits_lpc; +} diff --git a/lib_enc/ltd_stable.c b/lib_enc/ltd_stable.c new file mode 100644 index 0000000000000000000000000000000000000000..a6222a411f11a1e43573879233718d283f85a885 --- /dev/null +++ b/lib_enc/ltd_stable.c @@ -0,0 +1,133 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * ltd_stable() + * + * + *-------------------------------------------------------------------*/ + +void ltd_stable( + float frames_power[], /* i/o: energy of several frames */ + float ltd_stable_rate[], /* o : time-domain stable rate */ + const float frame_energy, /* i : current frame energy */ + const int16_t frameloop /* i : number of frames */ +) +{ + int16_t i; + float tmp; + float mid_frame_amp[28]; + float seg_amp; + float dif, apow; + + frames_power[0] = (float) ( sqrt( frame_energy ) + 0.001 ); + + if ( frameloop < 3 ) + { + for ( i = 1; i < POWER_NUM; i++ ) + { + frames_power[i] = frames_power[0]; + } + } + + for ( i = 0; i < 20; i++ ) + { + mid_frame_amp[i] = frames_power[2 * i] + frames_power[2 * i + 1]; + } + seg_amp = 0; + for ( i = 0; i < 20; i++ ) + { + seg_amp += mid_frame_amp[i]; + } + seg_amp = seg_amp / 20; + dif = 0; + apow = 0; + for ( i = 0; i < 20; i++ ) + { + tmp = mid_frame_amp[i] - seg_amp; + dif += tmp * tmp; + apow += mid_frame_amp[i] * mid_frame_amp[i]; + } + tmp = dif / ( apow + 0.0001f ); + ltd_stable_rate[0] = dif / ( apow + FLT_MIN ); + + + seg_amp = 0; + for ( i = 0; i < 14; i++ ) + { + seg_amp += mid_frame_amp[i]; + } + seg_amp = seg_amp / 14; + dif = 0; + apow = 0; + for ( i = 0; i < 14; i++ ) + { + tmp = mid_frame_amp[i] - seg_amp; + dif += tmp * tmp; + apow += mid_frame_amp[i] * mid_frame_amp[i]; + } + ltd_stable_rate[1] = dif / ( apow + 0.0001f ); + + seg_amp = 0; + for ( i = 0; i < 8; i++ ) + { + seg_amp += mid_frame_amp[i]; + } + seg_amp = seg_amp / 8; + dif = 0; + apow = 0; + for ( i = 0; i < 8; i++ ) + { + tmp = mid_frame_amp[i] - seg_amp; + dif += tmp * tmp; + apow += mid_frame_amp[i] * mid_frame_amp[i]; + } + ltd_stable_rate[2] = (float) ( dif / ( apow + 0.0001f ) ); + ltd_stable_rate[3] = 0.90f * ltd_stable_rate[3] + 0.1f * ltd_stable_rate[2]; + + for ( i = POWER_NUM - 1; i > 0; i-- ) + { + frames_power[i] = frames_power[i - 1]; + } + + return; +} diff --git a/lib_enc/mdct_classifier.c b/lib_enc/mdct_classifier.c new file mode 100644 index 0000000000000000000000000000000000000000..976c642a281d6b115adeb21adcc4149eaf949af1 --- /dev/null +++ b/lib_enc/mdct_classifier.c @@ -0,0 +1,366 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "prot.h" +#include "wmc_auto.h" +#include + + +/*--------------------------------------------------------------------------* + * Local constants + *--------------------------------------------------------------------------*/ + +#define SMOOTH_FILT_COEFF 0.8f +#define THRESH_UP 1.6f +#define THRESH_DOWN 1.1f +#define HQ_LOCAL 3 +#define TCX_LOCAL 1 + +#define GAIN2_START_WB 6 +#define GAIN3_START_WB 12 +#define GAIN4_START_WB 9 +#define H1_START_WB 17 +#define H2_START_WB 14 +#define H_LENGTH_WB 3 +#define GAIN2_START_SWB 8 +#define GAIN3_START_SWB 16 +#define GAIN4_START_SWB 12 +#define H1_START_SWB 25 +#define H2_START_SWB 20 +#define H_LENGTH_SWB 5 + + +/*-------------------------------------------------------------------* + * mdct_classifier() + * + * MDCT signal classifier for HQ_CORE/TCX_20_CORE + *-------------------------------------------------------------------*/ + +/*! r: HQ_CORE/TCX_20_CORE decision */ +int16_t mdct_classifier( + Encoder_State *st, /* i/o: Encoder state variable */ + const float *fft_buff, /* i : FFT spectrum from fft_rel */ + const float enerBuffer[], /* i : energy buffer */ + const int32_t brate /* i : current brate, IVAS: nominal bitrate, EVS: st->total_brate */ +) +{ + int16_t c; + float X[129]; + int16_t k; + float y[2]; + float nf; + float pe; + int16_t np; + float max_cand; + int16_t max_i; + float p_energy; + float n_energy; + int16_t d_acc; + int16_t pos_last; + float clas_sec; + int16_t clas_final; + int16_t i; + float gain1, gain2, gain3, gain11, gain4; + float peak_l, peak_h, avrg_l, avrg_h, peak_H1, avrg_H1, peak_H2, avrg_H2; + int16_t condition1, condition2; + int16_t condition3, condition4; + int16_t gain2_start, gain3_start, gain4_start, H1_start, H2_start, H_length; + TCX_ENC_HANDLE hTcxEnc = st->hTcxEnc; + + if ( st->input_Fs == 32000 || st->input_Fs == 48000 ) + { + gain2_start = GAIN2_START_SWB; + gain3_start = GAIN3_START_SWB; + gain4_start = GAIN4_START_SWB; + H1_start = H1_START_SWB; + H2_start = H2_START_SWB; + H_length = H_LENGTH_SWB; + } + else if ( st->input_Fs == 16000 ) + { + gain2_start = GAIN2_START_WB; + gain3_start = GAIN3_START_WB; + gain4_start = GAIN4_START_WB; + H1_start = H1_START_WB; + H2_start = H2_START_WB; + H_length = H_LENGTH_WB; + } + else + { + assert( !"Unknown sampling frequency in MDCT_classifier" ); + H1_start = -1; /* to avoid compilation warning */ + H2_start = -1; /* to avoid compilation warning */ + H_length = -1; /* to avoid compilation warning */ + gain2_start = -1; /* to avoid compilation warning */ + gain3_start = -1; /* to avoid compilation warning */ + gain4_start = -1; /* to avoid compilation warning */ + } + + if ( st->element_mode != IVAS_CPE_DFT ) + { + for ( k = 0; k < 127; k++ ) + { + X[1 + k] = fft_buff[1 + k] * fft_buff[1 + k] + fft_buff[255 - k] * fft_buff[255 - k]; + } + + for ( k = 0; k < 2; k++ ) + { + y[k] = fft_buff[k << 7] * fft_buff[k << 7]; + } + + for ( k = 0; k < 2; k++ ) + { + X[k << 7] = y[k]; + } + } + else + { + float norm_val; + + norm_val = ( L_FFT * L_FFT ) / 4.f; + for ( k = 0; k < 128; k++ ) + { + X[k + 1] = st->Bin_E_old[k] * norm_val; + } + X[0] = X[1]; + } + + nf = X[0]; + pe = X[0]; + np = 0; + max_cand = -1.0F; + max_i = 0; + p_energy = 0.0F; + n_energy = 0.0F; + d_acc = 0; + pos_last = -1; + + for ( k = 0; k < 128; k++ ) + { + if ( X[k + 1] > nf ) + { + nf = 0.9578F * nf + 0.0422F * X[k + 1]; + } + else + { + nf = 0.6472F * nf + 0.3528F * X[k + 1]; + } + + if ( X[k + 1] > pe ) + { + pe = 0.42237F * pe + 0.57763F * X[k + 1]; + } + else + { + pe = 0.80285F * pe + 0.19715F * X[k + 1]; + } + + if ( X[k + 1] > pe * 0.64F ) + { + if ( X[k + 1] > max_cand ) + { + max_cand = X[k + 1]; + max_i = (int16_t) ( 2 + k ); + } + } + else + { + if ( max_i > 0 ) + { + if ( np > 0 ) + { + d_acc = (int16_t) ( (int16_t) ( d_acc + max_i ) - pos_last ); + } + np++; + pos_last = max_i; + } + + max_cand = -1.0F; + max_i = 0; + } + + p_energy += pe * pe; + n_energy += nf * nf; + } + + if ( np > 1 ) + { + nf = (float) d_acc / ( (float) np - 1.0F ); + } + else + { + nf = 0.0F; + } + gain1 = 0.0f; + gain2 = 0.0f; + gain3 = 0.0f; + + for ( i = 0; i < gain2_start; i++ ) + { + gain1 += enerBuffer[i] / gain2_start; + gain2 += enerBuffer[gain2_start + i] / gain2_start; + gain3 += enerBuffer[gain3_start + i] / gain2_start; + } + + gain11 = gain2_start * ( gain1 - enerBuffer[0] / gain2_start ) / ( gain2_start - 1 ); + gain4 = 0.0f; + for ( i = 0; i < gain4_start; i++ ) + { + gain4 += enerBuffer[gain4_start + i] / gain4_start; + } + + peak_H1 = enerBuffer[H1_start]; + avrg_H1 = enerBuffer[H1_start]; + for ( i = 1; i < H_length; i++ ) + { + if ( enerBuffer[H1_start + i] > peak_H1 ) + { + peak_H1 = enerBuffer[H1_start + i]; + } + avrg_H1 += enerBuffer[H1_start + i]; + } + + peak_H2 = enerBuffer[H2_start]; + avrg_H2 = enerBuffer[H2_start]; + for ( i = 1; i < H_length; i++ ) + { + if ( enerBuffer[H2_start + i] > peak_H2 ) + { + peak_H2 = enerBuffer[H2_start + i]; + } + avrg_H2 += enerBuffer[H2_start + i]; + } + + peak_l = 0.0f; + avrg_l = EPSILON; + peak_h = 0.0f; + avrg_h = EPSILON; + for ( i = 0; i < 32; i++ ) + { + avrg_l += X[20 + i]; + avrg_h += X[96 + i]; + if ( X[20 + i] > peak_l ) + { + peak_l = X[20 + i]; + } + if ( X[96 + i] > peak_h ) + { + peak_h = X[96 + i]; + } + } + + condition1 = nf > 12.0F; + condition2 = p_energy - n_energy * 147.87276f > 0; + condition3 = gain3 > 1.2f * gain2 || + ( gain3 >= 0.8f * gain2 && 5 * peak_H1 > 2.0f * avrg_H1 ) || + ( 2.6f * peak_l * avrg_h < peak_h * avrg_l || peak_l * avrg_h > 2.6f * peak_h * avrg_l ); + condition4 = ( gain4 > 0.8f * gain11 && 2.56f * peak_l * avrg_h > peak_h * avrg_l && peak_l * avrg_h < 5.12f * peak_h * avrg_l ) || + ( gain4 > 0.3f * gain11 && 32 * peak_h < 1.5f * avrg_h && 5 * peak_H2 < 1.5f * avrg_H2 ) || + ( 2.56f * peak_l * avrg_h < peak_h * avrg_l && 32 * peak_h > 1.5f * avrg_h ) || ( peak_l * avrg_h > 2.56f * peak_h * avrg_l && 32 * peak_h < 1.5f * avrg_h ); + + if ( ( ( brate >= HQ_MDCTCLASS_CROSSOVER_BRATE ) && st->input_Fs > 16000 && ( ( !condition1 && condition2 ) || ( condition1 && !condition2 ) || condition3 ) ) || ( ( ( brate < HQ_MDCTCLASS_CROSSOVER_BRATE ) || st->input_Fs == 16000 ) && condition4 ) ) + { + c = HQ_LOCAL; + } + else + { + c = TCX_LOCAL; + } + + /* Smooth decision from instantaneous decision*/ + clas_sec = ( SMOOTH_FILT_COEFF * hTcxEnc->clas_sec_old ) + ( ( 1 - SMOOTH_FILT_COEFF ) * c ); + + /* Do thresholding with hysteresis */ + if ( ( hTcxEnc->clas_final_old == HQ_CORE || hTcxEnc->clas_final_old == TCX_20_CORE ) && ( ( hTcxEnc->last_gain1 > 0.5f * gain1 && hTcxEnc->last_gain1 < 2.0f * gain1 ) && ( hTcxEnc->last_gain2 > 0.5f * gain2 && hTcxEnc->last_gain2 < 2.0f * gain2 ) ) ) + { + clas_final = hTcxEnc->clas_final_old; + } + else if ( clas_sec > hTcxEnc->clas_sec_old && clas_sec > THRESH_UP ) /* Going up? */ + { + clas_final = HQ_CORE; + } + else if ( clas_sec < THRESH_DOWN ) /* Going down */ + { + clas_final = TCX_20_CORE; + } + else + { + clas_final = hTcxEnc->clas_final_old; + } + + /* Prevent the usage of HQ_CORE on noisy-speech or inactive */ + if ( ( st->mdct_sw_enable == MODE2 || st->element_mode > EVS_MONO ) && ( st->flag_noisy_speech_snr == 1 || st->vad_flag == 0 ) && clas_final == HQ_CORE ) + { + clas_final = TCX_20_CORE; + } + + /* Restrict usage of HQ_core to supported operating range */ + /* EVS: brate == st->total_brate */ + /* IVAS: brate is the nominal bitrate while st->total_brate may fluctuate. This sets a hard limit for HQ at HQ_16k40 */ + if ( st->total_brate <= HQ_16k40 || brate < HQ_16k40 || st->bwidth == NB || brate > IVAS_48k ) + { + clas_final = TCX_20_CORE; + } + + /* Memory update */ + hTcxEnc->clas_sec_old = clas_sec; + hTcxEnc->clas_final_old = clas_final; + hTcxEnc->last_gain1 = gain1; + hTcxEnc->last_gain2 = gain2; + + return clas_final; +} + +/*--------------------------------------------------------------------------* + * MDCT_classifier_reset() + * + * reset MDCT classifier memories + *--------------------------------------------------------------------------*/ + +void MDCT_classifier_reset( + TCX_ENC_HANDLE hTcxEnc /* i/o: TCX Encoder Handle */ +) +{ + hTcxEnc->clas_sec_old = 1.0f; + hTcxEnc->clas_final_old = 1; + hTcxEnc->last_gain1 = 0.0f; + hTcxEnc->last_gain2 = 0.0f; + + return; +} diff --git a/lib_enc/mdct_selector.c b/lib_enc/mdct_selector.c new file mode 100644 index 0000000000000000000000000000000000000000..ebe268fc7ef37faef537045559f97634005f28b2 --- /dev/null +++ b/lib_enc/mdct_selector.c @@ -0,0 +1,289 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "rom_enc.h" +#include "rom_com.h" +#include "prot.h" +#include "wmc_auto.h" + +/*-----------------------------------------------------------------* + * Local constants + *-----------------------------------------------------------------*/ + +#define MDCT_SW_SIG_LINE_THR 2.85f /* Significant spectral line threshold above Etot (dB) */ +#define MDCT_SW_SIG_PEAK_THR 36.0f /* Significant peak threshold below Etot (dB) */ +#define MDCT_SW_HI_SPARSE_THR 0.25f /* Max. ratio of significant spectral lines for the spectrum to be considered sparse */ +#define MDCT_SW_HI_ENER_LO_THR 7.5f /* Hi band low energy threshold (dB) */ +#define MDCT_SW_1_VOICING_THR 0.9f /* Voicing threshold */ +#define MDCT_SW_1_HI_ENER_LO_THR 12.5f /* Hi band low energy threshold (dB) */ +#define MDCT_SW_1_SIG_HI_LEVEL_THR 28.0f /* High signal level threshold above noise floor (dB) */ +#define MDCT_SW_1_SIG_LO_LEVEL_THR 22.5f /* Low signal level threshold above noise floor (dB) */ +#define MDCT_SW_1_COR_THR 80.0f /* Threshold on cor_map_sum to indicate strongly tonal signal */ +#define MDCT_SW_1_SPARSENESS_THR 0.65f /* Threshold on spectrum sparseness */ + +#define MDCT_SW_2_VOICING_THR 0.6f /* Voicing threshold */ +#define MDCT_SW_2_HI_ENER_LO_THR 9.5f /* Hi band low energy threshold (dB) */ +#define MDCT_SW_2_SIG_HI_LEVEL_THR 19.0f /* High signal level threshold above noise floor (dB) */ +#define MDCT_SW_2_SIG_LO_LEVEL_THR 23.5f /* Low signal level threshold above noise floor (dB) */ +#define MDCT_SW_2_COR_THR 62.5f /* Threshold on cor_map_sum to indicate strongly tonal signal */ +#define MDCT_SW_2_SPARSENESS_THR 0.4f /* Threshold on spectrum sparseness */ + +#define MDCT_SW_HYST_FAC 0.8f /* Hysteresis tolerance factor */ + + +/*--------------------------------------------------------------------------* + * get_sparseness() + * + * + *--------------------------------------------------------------------------*/ + +static float get_sparseness( + const float Bin_E[], + int16_t n, + float thr ) +{ + int16_t num_max, i; + + thr = (float) ( thr * log( 10 ) ); /* Convert to 10*log() domain from 10*log10() domain */ + + thr = max( thr, 3.0f ); /* Set an absolute minimum for close to silent signals */ + + num_max = 0; + for ( i = 1; i < n - 1; ++i ) + { + if ( Bin_E[i] > max( max( Bin_E[i - 1], Bin_E[i + 1] ), thr ) ) + { + ++num_max; + } + } + + return 1.0f - num_max / (float) ( ( n - 2 ) / 2 ); +} + +/*--------------------------------------------------------------------------* + * MDCT_selector() + * + * + *--------------------------------------------------------------------------*/ + +void MDCT_selector( + Encoder_State *st, /* i/o: Encoder State */ + const float sp_floor, /* i : Noise floor estimate */ + const float Etot, /* i : Total energy */ + const float cor_map_sum, /* i : sum of correlation map */ + const float enerBuffer[] /* i : energy buffer */ +) +{ + TCX_ENC_HANDLE hTcxEnc = st->hTcxEnc; + + if ( st->mdct_sw_enable == MODE1 || st->mdct_sw_enable == MODE2 ) + { + float hi_ener, frame_voicing, sparseness; + int16_t peak_count; + int16_t prefer_tcx, prefer_hq_core, switching_point, hi_sparse, sparse; + int16_t lob_cldfb, hib_cldfb, lob_fft, hib_fft; + int16_t i; + float sig_lo_level_thr, sig_hi_level_thr, cor_thr, voicing_thr, sparseness_thr, hi_ener_lo_thr; + int16_t last_core; + + if ( st->bwidth == NB ) + { + lob_cldfb = 3200 / 400; + hib_cldfb = 4000 / 400; + lob_fft = ( L_FFT / 2 ) / 2; /* 3.2 KHz */ + hib_fft = ( 40 * ( L_FFT / 2 ) ) / 64; /* 4.0 KHz */ + } + else if ( st->bwidth == WB ) + { + lob_cldfb = 4800 / 400; + hib_cldfb = 8000 / 400; + lob_fft = 3 * L_FFT / 2 / 4; /* 4.8 KHz */ + hib_fft = L_FFT / 2; /* 6.4 KHz (should be 8 KHz) */ + } + else + { + lob_cldfb = 6400 / 400; + hib_cldfb = 16000 / 400; + if ( st->bwidth == FB ) + { + hib_cldfb = 24000 / 400; + } + lob_fft = L_FFT / 2; /* 6.4 KHz */ + hib_fft = L_FFT / 2; /* 6.4 KHz (should be 8 KHz) */ + } + + /* st->last_core is reset to TCX_20_CORE in init_acelp() => fix it here */ + last_core = st->last_core; + if ( st->last_codec_mode == MODE1 && last_core == TCX_20_CORE ) + { + last_core = HQ_CORE; + } + + /* Voicing */ + frame_voicing = ( st->voicing[0] + st->voicing[1] ) * 0.5f; + + /* Spectral sparseness */ + sparseness = get_sparseness( st->Bin_E, lob_fft, Etot - MDCT_SW_SIG_PEAK_THR ); + + /* Hi band energy */ + hi_ener = (float) log10( mean( &enerBuffer[lob_cldfb], hib_cldfb - lob_cldfb ) + 0.0001f ); + + /* Hi band sparseness */ + if ( st->bwidth >= SWB ) + { + /* For SWB, assume hi band sparseness based on 4.8 KHz-6.4 KHz band */ + lob_fft = 3 * L_FFT / 2 / 4; /* 4.8 KHz */ + } + + peak_count = 0; + for ( i = lob_fft; i < hib_fft; ++i ) + { + if ( st->Bin_E[i] >= Etot + MDCT_SW_SIG_LINE_THR * LOG_10 ) + { + ++peak_count; + } + } + hi_sparse = peak_count <= anint( ( hib_fft - lob_fft ) * MDCT_SW_HI_SPARSE_THR ); + sparse = peak_count <= anint( ( hib_fft - lob_fft ) * MDCT_SW_HI_SPARSE_THR / MDCT_SW_HYST_FAC ); + + /* Hysteresis */ + if ( hTcxEnc->prev_hi_sparse > 0 && sparse > 0 && min( min( st->voicing[0], st->voicing[1] ), st->voicing[2] ) >= MDCT_SW_1_VOICING_THR ) + { + hi_sparse = 1; + } + + /* Allowed switching point? */ + switching_point = ( last_core != HQ_CORE && last_core != TCX_20_CORE ) || /* previous core was non-MDCT */ + ( hTcxEnc->prev_hi_ener <= MDCT_SW_HI_ENER_LO_THR || hi_ener <= MDCT_SW_HI_ENER_LO_THR ) || /* hi band is close to silent */ + ( last_core == HQ_CORE && ( st->mdct_sw_enable == MODE1 || ( hi_sparse > 0 && hTcxEnc->prev_hi_sparse >= 0 && hTcxEnc->prev_hi_sparse <= 1 ) ) ) || /* HQ_CORE and hi band became sparse */ + ( last_core == TCX_20_CORE && ( hi_sparse == 0 && hTcxEnc->prev_hi_sparse > 0 ) ); /* TCX and hi band became dense */ + + if ( st->mdct_sw_enable == MODE1 ) + { + sig_lo_level_thr = MDCT_SW_1_SIG_LO_LEVEL_THR; + sig_hi_level_thr = MDCT_SW_1_SIG_HI_LEVEL_THR; + cor_thr = MDCT_SW_1_COR_THR; + voicing_thr = MDCT_SW_1_VOICING_THR; + sparseness_thr = MDCT_SW_1_SPARSENESS_THR; + hi_ener_lo_thr = MDCT_SW_1_HI_ENER_LO_THR; + } + else + { + /* st->mdct_sw_enable == MODE2 */ + sig_lo_level_thr = MDCT_SW_2_SIG_LO_LEVEL_THR; + sig_hi_level_thr = MDCT_SW_2_SIG_HI_LEVEL_THR; + cor_thr = MDCT_SW_2_COR_THR; + voicing_thr = MDCT_SW_2_VOICING_THR; + sparseness_thr = MDCT_SW_2_SPARSENESS_THR; + hi_ener_lo_thr = MDCT_SW_2_HI_ENER_LO_THR; + } + + prefer_tcx = ( Etot - sp_floor >= sig_hi_level_thr ) && /* noise floor is low */ + ( cor_map_sum >= cor_thr || frame_voicing >= voicing_thr || sparseness >= sparseness_thr ) && /* strong tonal components */ + ( hi_ener <= hi_ener_lo_thr || hi_sparse > 0 ); /* high freqs have low energy or are sparse */ + + prefer_hq_core = ( Etot - sp_floor < sig_lo_level_thr ) || /* noise floor is very high */ + ( cor_map_sum < cor_thr * MDCT_SW_HYST_FAC && frame_voicing < voicing_thr * MDCT_SW_HYST_FAC && sparseness < sparseness_thr * MDCT_SW_HYST_FAC ) || /* too weak tonal components */ + ( st->mdct_sw_enable == MODE1 && !prefer_tcx && st->hTranDet->transientDetector.bIsAttackPresent ); + + /* Prefer HQ_CORE on transients */ + if ( st->mdct_sw_enable == MODE2 && st->hTranDet->transientDetector.bIsAttackPresent ) + { + prefer_tcx = 0; + prefer_hq_core = 1; + } + + if ( switching_point && ( prefer_tcx || prefer_hq_core ) ) + { + if ( prefer_tcx ) + { + st->core = TCX_20_CORE; + } + else /* prefer_hq_core */ + { + st->core = HQ_CORE; + } + } + else if ( last_core == HQ_CORE || last_core == TCX_20_CORE ) + { + st->core = last_core; + } + + /* Prevent the usage of HQ_CORE on noisy-speech or inactive */ + if ( st->mdct_sw_enable == MODE2 && st->core == HQ_CORE && ( st->flag_noisy_speech_snr == 1 || st->vad_flag == 0 ) ) + { + st->core = TCX_20_CORE; + } + + + /* Update memories */ + if ( hi_sparse <= 0 ) + { + hTcxEnc->prev_hi_sparse = hi_sparse; + } + else + { + hTcxEnc->prev_hi_sparse += hi_sparse; + if ( hTcxEnc->prev_hi_sparse >= 2 ) + { + hTcxEnc->prev_hi_sparse = 2; + } + } + hTcxEnc->prev_hi_ener = hi_ener; + } + + return; +} + +/*--------------------------------------------------------------------------* + * MDCT_selector_reset() + * + * reset MDCT selector memories + *--------------------------------------------------------------------------*/ + +void MDCT_selector_reset( + TCX_ENC_HANDLE hTcxEnc /* i/o: TCX Encoder Handle */ +) +{ + hTcxEnc->prev_hi_ener = 0; + hTcxEnc->prev_hi_sparse = -1; + + return; +} diff --git a/lib_enc/mslvq_enc.c b/lib_enc/mslvq_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..e4e98ea1e63e79e1b27af55cc2f97aedffb34973 --- /dev/null +++ b/lib_enc/mslvq_enc.c @@ -0,0 +1,846 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "prot.h" +#include "rom_com.h" +#include "cnst.h" +#include "wmc_auto.h" +#include "ivas_prot.h" + +/*-----------------------------------------------------------------* + * Local function prototypes + *-----------------------------------------------------------------*/ + +static float quantize_data( float *data, const float *w_in, float *qin, float *cv_out, int16_t *idx_lead, int16_t *idx_scale, const float *sigma, const float *inv_sigma, const float *scales, Word8 *no_leaders ); +static float q_data( float *pTmp1, const float *w1, float *quant, float *cv_out, int16_t *idx_lead, int16_t *idx_scale, const float *p_inv_sigma, const float *p_sigma, const float *p_scales, Word8 *no_leaders ); +static void prepare_data( float *xsort, int16_t *sign, float *data, float *w, const float *w_in, const float *sigma, const float *inv_sigma, int16_t *p_sig ); +static float calculate_min_dist( float cv_pot[LATTICE_DIM], const float *scale, const float *w, int16_t *p_best_scale, int16_t *p_best_idx, Word8 *no_leaders, int16_t sig, int16_t *indx ); +static int16_t find_pos( float *c, const int16_t len, float arg, int16_t *p ); +static void take_out_val( float *v, float *v_out, const float val, const int16_t len ); +static UWord32 index_leaders( float *cv, int16_t idx_lead, const int16_t dim ); +static UWord32 c2idx( const int16_t n, int16_t *p, const int16_t k ); +static UWord32 encode_sign_pc1( const int16_t parity, float *cv ); +static UWord32 encode_comb( float *cv, const int16_t idx_lead ); + + +/*-----------------------------------------------------------------* + * mslvq() + * + * Encodes the LSF residual + *-----------------------------------------------------------------*/ + +float mslvq( + float *pTmp, /* i : M-dimensional input vector */ + float *quant, /* o : quantized vector */ + float *cv_out, /* o : corresponding 8-dim lattice codevectors (without the scaling) */ + int16_t *idx_lead, /* o : leader index for each 8-dim subvector */ + int16_t *idx_scale, /* o : scale index for each subvector */ + const float *w, /* i : weights for LSF quantization */ + const int16_t mode, /* i : number indicating the coding type (V/UV/G...)*/ + const int16_t mode_glb, /* i : LVQ coding mode */ + const int16_t pred_flag /* i : prediction flag (0: safety net, 1,2 - predictive )*/ +) +{ + float dist; + const float *p_scales, *p_sigma, *p_inv_sigma; + int16_t i, tmp, tmp1; + Word8 p_no_lead[MAX_NO_SCALES * 2]; + + dist = 0.0f; + + if ( pred_flag == 0 ) + { + p_sigma = sigma_MSLVQ[mode]; + /* inverse sigma is precomputed to save complexity */ + p_inv_sigma = inv_sigma_MSLVQ[mode]; + p_scales = scales[mode_glb]; + + tmp = no_lead_idx[mode_glb][0]; + tmp1 = no_lead_idx[mode_glb][1]; + if ( ( tmp <= LIMIT_LEADER ) && ( tmp < tmp1 - 2 ) ) + { + tmp += DELTA_LEADER; + } + for ( i = 0; i < MAX_NO_SCALES; i++ ) + { + p_no_lead[i] = (int16_t) leaders_short[tmp][i]; + p_no_lead[i + MAX_NO_SCALES] = (int16_t) leaders_short[tmp1][i]; + } + } + else + { + if ( pred_flag >= 5 ) + { + /* assert( pred_flag >= 12 && pred_flag <= 15 ); */ + /* pred_flag is here the number of bits for MSLVQ */ + + p_sigma = &sigma_BWE[mode_glb * LATTICE_DIM]; + + /* inverse sigma is precomputed to save complexity */ + p_inv_sigma = &inv_sigma_BWE[mode_glb * LATTICE_DIM]; + + if ( mode_glb == 0 ) + { + p_scales = &scales_BWE[( pred_flag - mslvq_SHB_min_bits[mode_glb] ) * 3]; + for ( i = 0; i < MAX_NO_SCALES; i++ ) + { + p_no_lead[i] = no_lead_BWE[i + ( pred_flag - mslvq_SHB_min_bits[mode_glb] ) * 3]; + } + } + else + { + p_scales = &scales_BWE_3b[( pred_flag - mslvq_SHB_min_bits[mode_glb] ) * 3]; + for ( i = 0; i < MAX_NO_SCALES; i++ ) + { + p_no_lead[i] = no_lead_BWE_3b[i + ( pred_flag - mslvq_SHB_min_bits[mode_glb] ) * 3]; + } + } + } + else + { + p_sigma = sigma_p[mode]; + + /* inverse sigma is precomputed to save complexity */ + p_inv_sigma = inv_sigma_p[mode]; + p_scales = scales_p[mode_glb]; + + tmp = no_lead_p_idx[mode_glb][0]; + tmp1 = no_lead_p_idx[mode_glb][1]; + + if ( ( tmp <= LIMIT_LEADER ) && ( tmp < tmp1 - 2 ) ) + { + tmp += DELTA_LEADER; + } + + if ( ( tmp == LIMIT_LEADER ) && ( tmp1 == 0 ) ) + { + tmp += DELTA_LEADER; + tmp1 += DELTA_LEADER; + } + + for ( i = 0; i < MAX_NO_SCALES; i++ ) + { + p_no_lead[i] = (int16_t) leaders_short[tmp][i]; + p_no_lead[i + MAX_NO_SCALES] = (int16_t) leaders_short[tmp1][i]; + } + } + } + + /* first subvector */ + dist += quantize_data( pTmp, w, quant, cv_out, idx_lead, idx_scale, p_sigma, p_inv_sigma, p_scales, p_no_lead ); + + if ( pred_flag < 5 ) + { + /* second subvector */ + dist += quantize_data( pTmp + LATTICE_DIM, w + LATTICE_DIM, quant + LATTICE_DIM, cv_out + LATTICE_DIM, &idx_lead[1], &idx_scale[1], p_sigma + LATTICE_DIM, p_inv_sigma + LATTICE_DIM, p_scales + MAX_NO_SCALES, p_no_lead + MAX_NO_SCALES ); + } + + return dist; +} + + +/*-----------------------------------------------------------------* + * q_data() + * + * (used for LSF quantization in CNG) + *-----------------------------------------------------------------*/ + +static float q_data( + float *pTmp1, + const float *w1, + float *quant, + float *cv_out, + int16_t *idx_lead, + int16_t *idx_scale, + const float *p_sigma, + const float *p_inv_sigma, + const float *p_scales, + Word8 *p_no_lead ) +{ + float dist = 0.0f; + /* first subvector */ + dist += quantize_data( pTmp1, w1, quant, cv_out, idx_lead, idx_scale, p_sigma, p_inv_sigma, p_scales, p_no_lead ); + /* second subvector */ + dist += quantize_data( pTmp1 + LATTICE_DIM, w1 + LATTICE_DIM, quant + LATTICE_DIM, cv_out + LATTICE_DIM, &idx_lead[1], &idx_scale[1], p_sigma + LATTICE_DIM, p_inv_sigma + LATTICE_DIM, p_scales + MAX_NO_SCALES, p_no_lead + MAX_NO_SCALES ); + + return dist; +} + +/*-----------------------------------------------------------------* + * mslvq_cng() + * + * Encodes the LSF residual in SID frames + *-----------------------------------------------------------------*/ + +float mslvq_cng( + int16_t idx_cv, /* i : index of cv from previous stage */ + float *pTmp, /* i : 16 dimensional input vector */ + float *quant, /* o : quantized vector */ + float *cv_out, /* o : corresponding 8-dim lattice codevectors (without the scaling) */ + int16_t *idx_lead, /* o : leader index for each 8-dim subvector */ + int16_t *idx_scale, /* o : scale index for each subvector */ + const float *w /* i : weights for LSF quantization */ +) +{ + float dist; + const float *p_scales, *p_sigma, *p_inv_sigma; + Word8 p_no_lead[MAX_NO_SCALES * 2]; + int16_t no_scales[2]; + int16_t mode_glb, mode, i; + float pTmp1[M], w1[M]; + + dist = 0.0f; + mode = LVQ_COD_MODES + idx_cv; + + /* for CNG there is only one bitrate but several quantizer structures, depending on the previous VQ stage */ + mode_glb = START_CNG + idx_cv; + + p_sigma = sigma_MSLVQ[mode]; + p_inv_sigma = inv_sigma_MSLVQ[mode]; + p_scales = scales[mode_glb]; + + no_scales[0] = 0; + no_scales[1] = 0; + + for ( i = 0; i < MAX_NO_SCALES; i++ ) + { + p_no_lead[i] = (int16_t) leaders_short[no_lead_idx[mode_glb][0]][i]; + p_no_lead[i + MAX_NO_SCALES] = (int16_t) leaders_short[no_lead_idx[mode_glb][1]][i]; + + if ( p_scales[i] > 0.0f ) + { + no_scales[0] += 1; + } + if ( p_scales[i + MAX_NO_SCALES] > 0.0f ) + { + no_scales[1] += 1; + } + } + + /* check if LSF component permutation is needed or not */ + if ( cng_sort[idx_cv] ) + { + /* change order in subvecs */ + for ( i = 0; i < M; i++ ) + { + pTmp1[i] = pTmp[i]; + w1[i] = w[i]; + } + /* sorting the quantizer input and the corresponding weights according to the specified permutations */ + permute( pTmp1, perm_MSLVQ[idx_cv] ); + permute( w1, perm_MSLVQ[idx_cv] ); + + dist = q_data( pTmp1, w1, quant, cv_out, idx_lead, idx_scale, p_sigma, p_inv_sigma, p_scales, p_no_lead ); + /* permute back */ + permute( quant, perm_MSLVQ[idx_cv] ); + } + else + { + dist = q_data( pTmp, w, quant, cv_out, idx_lead, idx_scale, p_sigma, p_inv_sigma, p_scales, p_no_lead ); + } + + return dist; +} +/*-----------------------------------------------------------------* + * prepare_data() + * + *-----------------------------------------------------------------*/ + +static void prepare_data( + float *xsort, + int16_t *sign, + float *data, + float *w, + const float *w_in, + const float *sigma, + const float *inv_sigma, + int16_t *p_sig ) +{ + int16_t j, sig; + float s, inv_s; + + /* scale data */ + for ( j = 0; j < LATTICE_DIM; j++ ) + { + s = sigma[j]; + inv_s = inv_sigma[j]; + xsort[j] = data[j] * inv_s; + w[j] = w_in[j] * ( s * s ); + } + + sig = 1; + for ( j = 0; j < LATTICE_DIM; j++ ) + { + if ( xsort[j] < 0 ) + { + sign[j] = -1; + sig = -sig; + xsort[j] = -xsort[j]; + } + else + { + sign[j] = 1; + } + } + *p_sig = sig; + + return; +} + +/*-----------------------------------------------------------------* + * calculate_min_dist() + * + *-----------------------------------------------------------------*/ + +static float calculate_min_dist( + float cv_pot[LATTICE_DIM], + const float *scale, + const float *w, + int16_t *p_best_scale, + int16_t *p_best_idx, + Word8 *no_leaders, + int16_t sig, + int16_t *indx ) +{ + int16_t k, l, j, best_scale = -1, best_idx = -1; + float s, s2, tmp_dist, min_dist, wx[LATTICE_DIM], wind[LATTICE_DIM]; + float sum1[NO_LEADERS], sum2[NO_LEADERS]; + const float *pl_crt; + float p; + + /* compare first with the origin */ + min_dist = 0.0f; + for ( j = 0; j < LATTICE_DIM; j++ ) + { + /* sorting the weight based on the ordering indx[] of the input vector */ + wind[j] = w[indx[j]]; + wx[j] = 2.0f * wind[j] * cv_pot[j]; + } + s = scale[0]; + s2 = s * s; + pl_crt = &pl_HQ[0]; + + for ( j = 0; j < no_leaders[0]; j++ ) + { + sum1[j] = 0; + sum2[j] = 0; + l = 0; + while ( l < LATTICE_DIM - 1 ) + { + p = *pl_crt; + if ( p ) + { + sum1[j] += wx[l] * p; + sum2[j] += wind[l] * p * p; + pl_crt++; + l++; + } + else + { + pl_crt += LATTICE_DIM - l; + l = LATTICE_DIM; + } + } + if ( ( l - LATTICE_DIM + 1 ) == 0 ) + { + p = *pl_crt; + /* if it went up to 7th position */ + if ( pl_par[j] ) + { + if ( sig != pl_par[j] ) + { + sum1[j] -= wx[l] * p; + sum2[j] += wind[l] * p * p; + pl_crt++; + } + else + { + sum1[j] += wx[l] * p; + sum2[j] += wind[l] * p * p; + pl_crt++; + } + } + else + { + sum1[j] += wx[l] * p; + sum2[j] += wind[l] * p * p; + pl_crt++; + } + } + /* distance between the potential codevector and the input calculated in ordered space */ + tmp_dist = s2 * sum2[j] - s * sum1[j]; + if ( tmp_dist < min_dist ) + { + min_dist = tmp_dist; + best_scale = 0; + best_idx = j; + } + } + + tmp_dist = min_dist + 1.0f; + + for ( k = 1; k < MAX_NO_SCALES; k++ ) + { + s = scale[k]; + + if ( s > 0.0f ) + { + s2 = s * s; + for ( j = 0; j < no_leaders[k]; j++ ) + { + /* distance between the potential codevector and the input calculated in ordered space */ + tmp_dist = s2 * sum2[j] - s * sum1[j]; + if ( tmp_dist < min_dist ) + { + min_dist = tmp_dist; + best_scale = k; + best_idx = j; + } + } + } + } + *p_best_scale = best_scale; + *p_best_idx = best_idx; + + return min_dist; +} + + +/*-----------------------------------------------------------------* + * quantize_data() + * + *-----------------------------------------------------------------*/ + +static float quantize_data( + float *data, /* i : residual LSF data to quantize */ + const float *w_in, /* i : weights */ + float *qin, /* o : quantized output (scaled) */ + float *cv_out, /* o : codevectors */ + int16_t *idx_lead, /* o : leader indexes for each subvector */ + int16_t *idx_scale, /* o : scale indexes for each subvector */ + const float *sigma, /* i : standard deviation */ + const float *inv_sigma, /* i : inverse of standard deviation */ + const float *scale, /* i : scales for each truncation */ + Word8 *no_leaders /* i : number of leader vectors for each truncation of each subvector */ +) +{ + int16_t j; + float w[LATTICE_DIM], min_dist = 0; + int16_t best_idx = 0, best_scale = -1; + float s; + float cv_pot[LATTICE_DIM]; + int16_t indx[LATTICE_DIM]; + int16_t sig, sign[LATTICE_DIM]; + int16_t smallest; + int16_t id[LATTICE_DIM]; + + if ( scale[0] > 0.0f ) + { + prepare_data( cv_pot, sign, data, w, w_in, sigma, inv_sigma, &sig ); + /* sorting of the input vector based on its absolute values; indx: permutation corresponding to the sorting */ + sort_desc_ind( cv_pot, LATTICE_DIM, indx ); + smallest = indx[LATTICE_DIM - 1]; + min_dist = calculate_min_dist( cv_pot, scale, w, &best_scale, &best_idx, no_leaders, sig, indx ); + if ( best_scale > -1 ) + { + for ( j = 0; j < LATTICE_DIM; j++ ) + { + id[indx[j]] = j; + } + for ( j = 0; j < LATTICE_DIM; j++ ) + { + cv_out[j] = sign[j] * pl_HQ[best_idx * LATTICE_DIM + id[j]]; + } + if ( pl_par[best_idx] ) + { + if ( sig - pl_par[best_idx] != 0 ) + { + cv_out[smallest] = -cv_out[smallest]; + } + } + s = scale[best_scale]; + for ( j = 0; j < LATTICE_DIM; j++ ) + { + qin[j] = cv_out[j] * s * sigma[j]; + } + *idx_lead = best_idx; + *idx_scale = best_scale; + } + else + { + for ( j = 0; j < LATTICE_DIM; j++ ) + { + qin[j] = 0; + } + + *idx_lead = best_idx; + *idx_scale = best_scale; + } + } + else + { + *idx_lead = 0; + *idx_scale = -1; + for ( j = 0; j < LATTICE_DIM; j++ ) + { + cv_out[j] = 0; + qin[j] = 0; + } + } + + return min_dist; +} + +/*-----------------------------------------------------------------* + * index_lvq() + * + * sorts in descending order and computes indices in the sorted vector + *-----------------------------------------------------------------*/ + +void index_lvq( + float *quant, /* i : codevector to be indexed (2 8-dim subvectors) */ + int16_t *idx_lead, /* i : leader class index for each subvector */ + int16_t *idx_scale, /* i : scale index for each subvector */ + const int16_t mode, /* i : integer signaling the quantizer structure for the current bitrate */ + int16_t *index, /* o : encoded index (represented on 3 short each with 15 bits ) */ + const int16_t prediction_flag ) +{ + UWord32 index1, index2, tmp, idx[2]; + UWord32 offset_scale1[MAX_NO_SCALES + 1], offset_scale2[MAX_NO_SCALES + 1]; + + + index1 = 0; + create_offset( offset_scale1, offset_scale2, mode, prediction_flag ); + + /* for first subvector */ + if ( idx_scale[0] > -1 ) + { + /* create offset */ + index1 = encode_comb( quant, idx_lead[0] ) + table_no_cv[idx_lead[0]] + offset_scale1[idx_scale[0]]; + } + + /* for second subvector */ + index2 = 0; + if ( idx_scale[1] > -1 ) + { + index2 = encode_comb( &quant[LATTICE_DIM], idx_lead[1] ) + table_no_cv[idx_lead[1]] + offset_scale2[idx_scale[1]]; + } + + multiply32_32_64( index1, offset_scale2[MAX_NO_SCALES], idx ); + + tmp = idx[0] + index2; + if ( tmp < idx[0] || tmp < index2 ) + { + idx[1] += 1; + } + + idx[0] = tmp; + + /* convert to 3 short */ + index[0] = (int16_t) ( ( idx[0] ) & ( 0xffff >> 1 ) ); + index[1] = (int16_t) ( ( idx[0] ) >> 15 ) & ( 0xffff >> 1 ); + index[2] = (int16_t) ( ( idx[0] ) >> 30 ) + ( ( ( idx[1] ) << 2 ) & ( 0xffff >> 1 ) ); + + return; +} + + +/*-----------------------------------------------------------------* + * encode_comb() + * + * creates an index for the lattice codevector + *-----------------------------------------------------------------*/ + +/*! r: index of the absolute valued codevector */ +static UWord32 encode_comb( + float *cv, /* i : codevector to be indexed */ + const int16_t idx_lead /* i : leader class index, to know the values */ +) +{ + UWord32 idx_sign; + UWord32 idx_ld_class; + + idx_sign = encode_sign_pc1( pl_par[idx_lead], cv ); + idx_ld_class = index_leaders( cv, idx_lead, LATTICE_DIM ); + + return idx_sign * (UWord32) pi0[idx_lead] + idx_ld_class; +} + + +/*-----------------------------------------------------------------* + * index_leaders() + * + * gives the index in a class of leaders without considering the sign yet + *-----------------------------------------------------------------*/ + +/*! r: index */ +static UWord32 index_leaders( + float *cv, /* i : codevector to be indexed */ + int16_t idx_lead, /* i : leader class index */ + const int16_t dim /* i : vector dimension */ +) +{ + UWord32 index; + int16_t p[LATTICE_DIM]; + int16_t i, no_vals_loc, nr, dim_loc; + float cv_copy[LATTICE_DIM], val_crt; + + no_vals_loc = no_vals[idx_lead]; + + if ( no_vals_loc == 1 ) + { + return 0; + } + + for ( i = 0; i < LATTICE_DIM; i++ ) + { + cv_copy[i] = (float) fabs( cv[i] ); + } + + val_crt = vals[idx_lead][0]; + nr = find_pos( cv_copy, dim, val_crt, p ); + index = c2idx( LATTICE_DIM, p, nr ); + + if ( no_vals_loc == 2 ) + { + return index; + } + + take_out_val( cv_copy, cv_copy, val_crt, dim ); + dim_loc = dim - no_vals_ind[idx_lead][0]; + index *= C_VQ[dim_loc][no_vals_ind[idx_lead][1]]; + val_crt = vals[idx_lead][1]; + nr = find_pos( cv_copy, dim_loc, val_crt, p ); + index += c2idx( dim_loc, p, nr ); + + if ( no_vals_loc == 3 ) + { + return index; + } + + take_out_val( cv_copy, cv_copy, val_crt, dim_loc ); + dim_loc = dim_loc - no_vals_ind[idx_lead][1]; + index *= C_VQ[dim_loc][no_vals_ind[idx_lead][2]]; + val_crt = vals[idx_lead][2]; + nr = find_pos( cv_copy, dim_loc, val_crt, p ); + index += c2idx( dim_loc, p, nr ); + /* maximum 4 values */ + + return index; +} + +/*-----------------------------------------------------------------* + * find_pos() + * + * Finds the positions in vector c for which the vector components are equal to 'arg'. + * It returns the number of such positions and their values in the array 'p'. + *-----------------------------------------------------------------*/ + +/*! r: number of positions */ +int16_t find_pos( + float *c, /* i : input vector */ + const int16_t len, /* i : input vector dim */ + float arg, /* i : argument to be compared with */ + int16_t *p /* o : vector of positions */ +) +{ + int16_t i = 0, j = 0; + + /* how many (j) and which (p) positions are in the relation pred(arg,c[i]) */ + for ( i = 0; i < len; i++ ) + { + if ( (int16_t) ( arg * 10 ) == (int16_t) ( c[i] * 10 ) ) + { + p[j++] = i; + } + } + + return j; +} + +/*-----------------------------------------------------------------* + * encode_sign_pc1() + * + * Creates an index for signs of the significant codevector components + * Gives the index of the signs - binary representation where negative sign stands for 1 + * and positive sign stands for 1. + *-----------------------------------------------------------------*/ + +/*! r: index of signs */ +static UWord32 encode_sign_pc1( + const int16_t parity, /* i : parity of the leader class to which the codevector belongs */ + float *cv /* i : input codevector */ +) +{ + UWord32 idx_sign; + int16_t cnt, i, len = LATTICE_DIM; + + idx_sign = 0; + cnt = 0; + + if ( parity ) + { + len -= 1; + } + + for ( i = 0; i < len; i++ ) + { + if ( cv[i] < 0 ) + { + idx_sign += ( 1 << cnt ); + cnt++; + } + + if ( cv[i] > 0 ) + { + cnt++; + } + } + + return idx_sign; +} + +/*-----------------------------------------------------------------* + * take_out_val() + * + * removes the value val from the vector v + *-----------------------------------------------------------------*/ + +static void take_out_val( + float *v, /* i : input vector */ + float *v_out, /* o : output vector without the value val*/ + const float val, /* i : value to be removed */ + const int16_t len /* i : input vector length */ +) +{ + int16_t i, cnt; + + cnt = 0; + + for ( i = 0; i < len; i++ ) + { + if ( (int16_t) ( v[i] * 10 ) != (int16_t) ( val * 10 ) ) + { + v_out[cnt++] = v[i]; + } + } + + return; +} + + +/*-----------------------------------------------------------------* + * c2idx() + * + *-----------------------------------------------------------------*/ + +static UWord32 c2idx( + const int16_t n, + int16_t *p, + const int16_t k ) +{ + int16_t i, p0; + UWord32 skip; + + if ( k == 1 ) + { + return (UWord32) ( p[0] ); + } + else + { + skip = 0; + for ( i = 1; i <= p[0]; i++ ) + { + skip += C_VQ[n - i][k - 1]; + } + + p0 = p[0]; + for ( i = 1; i < k; i++ ) + { + p[i] -= p0 + 1; + } + + return skip + c2idx( n - p0 - 1, p + 1, k - 1 ); + } +} + +/*-----------------------------------------------------------------* + * index_lvq_SHB() + * + *-----------------------------------------------------------------*/ + +UWord32 index_lvq_SHB( + const int16_t idx_lead, + const int16_t idx_scale, + const int16_t nbits, + float *lat_cv, + const int16_t mode ) +{ + uint16_t i; + const Word8 *p_no_lead; + UWord32 index; + + if ( mode == 0 ) + { + p_no_lead = &no_lead_BWE[( nbits - mslvq_SHB_min_bits[0] ) * 3]; + } + else + { + p_no_lead = &no_lead_BWE_3b[( nbits - mslvq_SHB_min_bits[1] ) * 3]; + } + + index = 0; + if ( idx_lead > -1 ) + { + index = 1; + for ( i = 0; i < idx_scale; i++ ) + { + index += table_no_cv[p_no_lead[i]]; + } + + if ( idx_lead > 0 ) + { + index += table_no_cv[idx_lead]; + } + + index += encode_comb( lat_cv, idx_lead ); + } + + return index; +} diff --git a/lib_enc/multi_harm.c b/lib_enc/multi_harm.c new file mode 100644 index 0000000000000000000000000000000000000000..18c354a97768b9b0d2c549c10852442ab6eff883 --- /dev/null +++ b/lib_enc/multi_harm.c @@ -0,0 +1,326 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "wmc_auto.h" + +/*-----------------------------------------------------------------* + * Local constants + *-----------------------------------------------------------------*/ + +#define THR_CORR_MAX 60 /* upper threshold of multi-harm. correlation */ +#define THR_CORR_MIN 49 /* lower threshold of multi-harm. correlation */ +#define THR_CORR_STEP 0.2f /* step for the threshold of multi-harm. correlation */ + +/*---------------------------------------------------------------------* + * multi_harm() + * + * Perform multi-harmonic analysis, information used for UV and VAD decision + *---------------------------------------------------------------------*/ + +/*! r: frame multi-harmonicity (1-harmonic, 0-not) */ +int16_t multi_harm( + const float Bin_E[], /* i : log-energy spectrum of the current frame */ + float old_S[], /* i/o: prev. log-energy spectrum w. subtracted floor */ + float cor_map_LT[], /* i/o: LT correlation map */ + float *multi_harm_limit, /* i/o: multi harminic threshold */ + const int32_t total_brate, /* i : total bitrate */ + const int16_t bwidth, /* i : input signal bandwidth */ + int16_t *cor_strong_limit, /* i/o: HF correlation indicator */ + float *st_mean_avr_dyn, /* i/o: long term average dynamic */ + float *st_last_sw_dyn, /* i/o: last dynamic */ + float *cor_map_sum, /* i : sum of correlation map */ + float *sp_floor, /* o : noise floor estimate */ + float S_map[] /* o : short-term correlation map */ +) +{ + int16_t i, j, k, L, stemp, N_mins, ind_mins[L_FFT / 4], *pt_mins, harm; + float ftemp, ftemp2, flor, step, corx2, cory2, corxy, cor, cor_map_LT_sum, cor_strong, S[L_FFT / 2]; + float mean_dyn; + + /*------------------------------------------------------------------* + * initialization + *------------------------------------------------------------------*/ + + if ( bwidth == NB ) + { + /* length of the useful part of the spectrum (up to 4kHz) */ + L = 76; + } + else + { + /* length of the useful part of the spectrum (up to 6.4kHz) */ + L = L_FFT / 2; + } + + mvr2r( Bin_E, S, L ); + + /*------------------------------------------------------------------* + * searching of spectral maxima and minima + *------------------------------------------------------------------*/ + + pt_mins = ind_mins; + + /* index of the first minimum */ + if ( Bin_E[0] < Bin_E[1] ) + + { + *pt_mins++ = 0; + } + + for ( i = 1; i < L - 1; i++ ) + { + /* minimum found */ + if ( Bin_E[i] < Bin_E[i - 1] && Bin_E[i] < Bin_E[i + 1] ) + { + *pt_mins++ = i; + } + } + + /* index of the last minimum */ + if ( Bin_E[L - 1] < Bin_E[L - 2] ) + { + *pt_mins++ = L - 1; + } + + /* total number of minimas found */ + N_mins = (int16_t) ( pt_mins - ind_mins - 1 ); + + /*------------------------------------------------------------------* + * calculation of the spectral floor + * subtraction of the spectral floor + *------------------------------------------------------------------*/ + + set_f( S, 0, L ); + if ( N_mins > 0 ) + { + *sp_floor = 0; + for ( i = 0; i < N_mins; ++i ) + { + *sp_floor += Bin_E[ind_mins[i]]; + } + *sp_floor /= (float) N_mins; + set_f( S, 0, ind_mins[0] ); + set_f( &S[ind_mins[N_mins]], 0, L - ind_mins[N_mins] ); + + pt_mins = ind_mins; + flor = 0; + step = 0; + + for ( i = ind_mins[0]; i < ind_mins[N_mins]; i++ ) + { + /* we are at the end of the next minimum */ + if ( i == *pt_mins ) + { + pt_mins++; + flor = Bin_E[i]; + + /* calculate the new step */ + step = ( Bin_E[*pt_mins] - Bin_E[i] ) / ( *pt_mins - i ); + } + + /* subtract the floor */ + if ( Bin_E[i] > flor ) + { + S[i] = Bin_E[i] - flor; + } + else + { + S[i] = 0; + } + + /* update the floor */ + flor += step; + } + } + else + { + *sp_floor = Bin_E[0]; + } + *sp_floor *= 1.0f / logf( 10.0f ); + + /* calculate the maximum dynamic per band */ + mean_dyn = mean( &S[L - 40], 40 ); + mean_dyn = 0.6f * *st_mean_avr_dyn + 0.4f * mean_dyn; + + if ( mean_dyn < 9.6f && *cor_strong_limit != 0 ) + { + *cor_strong_limit = 0; + *st_last_sw_dyn = mean_dyn; + } + else if ( ( mean_dyn - *st_last_sw_dyn ) > 4.5f ) + { + *cor_strong_limit = 1; + } + + if ( total_brate < ACELP_9k60 || total_brate > ACELP_16k40 ) + { + *cor_strong_limit = 1; + } + + *st_mean_avr_dyn = mean_dyn; + + /*------------------------------------------------------------------* + * calculation of the correlation map + *------------------------------------------------------------------*/ + + if ( N_mins > 0 ) + { + corx2 = 0; + corxy = 0; + stemp = ind_mins[0]; + ftemp = old_S[stemp]; + cory2 = ftemp * ftemp; + k = 1; + for ( i = stemp + 1; i <= ind_mins[N_mins]; i++ ) + { + if ( i == ind_mins[k] ) + { + /* include the last peak point (new minimum) to the corr. sum */ + ftemp = old_S[i]; + cory2 += ftemp * ftemp; + + /* calculation of the norm. peak correlation */ + if ( ( corx2 == 0 ) || ( cory2 == 0 ) ) + { + cor = 0; + } + else + { + cor = corxy * corxy / ( corx2 * cory2 ); + } + + /* save the norm. peak correlation in the correlation map */ + for ( j = ind_mins[k - 1]; j < ind_mins[k]; j++ ) + { + old_S[j] = S[j]; + S[j] = cor; + } + + corx2 = 0; + cory2 = 0; + corxy = 0; + + k++; + } + + ftemp = S[i]; + ftemp2 = old_S[i]; + corx2 += ftemp * ftemp; + cory2 += ftemp2 * ftemp2; + corxy += ftemp * ftemp2; + } + + mvr2r( S, old_S, ind_mins[0] ); + mvr2r( &S[ind_mins[N_mins]], &old_S[ind_mins[N_mins]], L - ind_mins[N_mins] ); + } + + /*------------------------------------------------------------------* + * updating of the long-term correlation map + * summation of the long-term correlation map + *------------------------------------------------------------------*/ + + cor_strong = 0; + *cor_map_sum = 0; + + for ( i = 0; i < L; i++ ) + { + *cor_map_sum += S[i]; + cor_map_LT[i] = M_ALPHA * cor_map_LT[i] + ( 1 - M_ALPHA ) * S[i]; + if ( cor_map_LT[i] > 0.95f ) + { + cor_strong = 1; + } + } + + /* summation of the LT correlation map */ + cor_map_LT_sum = sum_f( cor_map_LT, L ); + + if ( bwidth == NB ) + { + cor_map_LT_sum *= 1.53f; + *cor_map_sum *= 1.53f; + } + + /* final decision about multi-harmonicity */ + if ( ( cor_map_LT_sum > *multi_harm_limit ) || ( cor_strong == 1 ) ) + { + harm = 1; + } + else + { + harm = 0; + } + + /*------------------------------------------------------------------* + * updating of the decision threshold + *------------------------------------------------------------------*/ + + if ( cor_map_LT_sum > THR_CORR ) + { + *multi_harm_limit -= THR_CORR_STEP; + } + else + { + *multi_harm_limit += THR_CORR_STEP; + } + + if ( *multi_harm_limit > THR_CORR_MAX ) + { + *multi_harm_limit = THR_CORR_MAX; + } + + if ( *multi_harm_limit < THR_CORR_MIN ) + { + *multi_harm_limit = THR_CORR_MIN; + } + + if ( N_mins <= 0 ) + { + set_f( old_S, 0, L ); + } + + if ( S_map != 0 ) + { + mvr2r( S, S_map, L ); + } + + return harm; +} diff --git a/lib_enc/nelp_enc.c b/lib_enc/nelp_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..1c065a51733de510a854ff14f2fd90cdd5dd5854 --- /dev/null +++ b/lib_enc/nelp_enc.c @@ -0,0 +1,444 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * quantize_uvg() + * + * Quantize unvoiced gains + *--------------------------------------------------------------------*/ + +static void quantize_uvg( + float *G, /* i : unvoiced gain */ + int16_t *iG1, /* i : gain 1 index */ + int16_t *iG2, /* i : gain 2 index */ + float *quantG, /* o : quantized gain */ + const int16_t bwidth ) +{ + float G1[2], G2[10]; + int16_t i, j, k; + float mse, mmse; + const float( *UVG1CB )[2] = NULL; + const float( *UVG2CB1 )[5] = NULL; + const float( *UVG2CB2 )[5] = NULL; + + if ( bwidth == NB ) + { + UVG1CB = UVG1CB_NB; + UVG2CB1 = UVG2CB1_NB; + UVG2CB2 = UVG2CB2_NB; + } + else if ( bwidth == WB || bwidth == SWB ) + { + UVG1CB = UVG1CB_WB; + UVG2CB1 = UVG2CB1_WB; + UVG2CB2 = UVG2CB2_WB; + } + + for ( i = 0; i < 2; i++ ) + { + G1[i] = 0; + for ( j = 0; j < 5; j++ ) + { + G1[i] += SQR( G[i * 5 + j] ); + } + G1[i] = (float) log10( sqrt( G1[i] / 5 ) ); + } + + mmse = (float) 1e30; + *iG1 = 0; + + for ( i = 0; i < UVG1_CBSIZE; i++ ) + { + mse = SQR( G1[0] - ( UVG1CB[i][0] ) ) + SQR( G1[1] - ( UVG1CB[i][1] ) ); + if ( mse < mmse ) + { + *iG1 = i; + mmse = mse; + } + } + + G1[0] = (float) pow( 10.0, ( UVG1CB[*iG1][0] ) ); + G1[1] = (float) pow( 10.0, ( UVG1CB[*iG1][1] ) ); + + for ( i = 0; i < 2; i++ ) + { + for ( j = 0; j < 5; j++ ) + { + G2[i * 5 + j] = G[i * 5 + j] / G1[i]; + } + } + + for ( i = 0; i < 2; i++ ) + { + mmse = (float) 1e30; + iG2[i] = 0; + for ( j = 0; j < UVG2_CBSIZE; j++ ) + { + mse = 0; + for ( k = 0; k < 5; k++ ) + { + if ( i == 0 ) + { + mse += SQR( G2[i * 5 + k] - UVG2CB1[j][k] ); + } + else if ( i == 1 ) + { + mse += SQR( G2[i * 5 + k] - UVG2CB2[j][k] ); + } + } + + if ( mse < mmse ) + { + mmse = mse; + iG2[i] = j; + } + } + } + + mvr2r( G, G2, 10 ); + + dequantize_uvg( *iG1, iG2, quantG, bwidth ); + + return; +} + + +/*-------------------------------------------------------------------* + * nelp_encoder() + * + * NELP encoder + *--------------------------------------------------------------------*/ + +void nelp_encoder( + Encoder_State *st, /* i/o: encoder state */ + float *in, /* i : residual signal */ + float *exc, /* o : NELP quantized excitation signal */ + const int16_t reduce_gains ) +{ + int16_t i, j; + float *ptr = exc; + int16_t lag = 25; /* to cover 25*9 + 31 */ + float Gains[10], gain_fac; + int16_t iG1, iG2[2], fid; + float fdbck, var_dB, tmp; + float E1 = 0, E2, E3, R, EL1 = 0, EH1 = 0, EL2, EH2, RL, RH; + float filtRes[L_FRAME]; + float ptr_tmp[L_FRAME]; + int16_t rf_flag; + + SC_VBR_ENC_HANDLE hSC_VBR = st->hSC_VBR; + BSTR_ENC_HANDLE hBstr = st->hBstr; + + rf_flag = st->rf_mode; + + if ( ( hSC_VBR->last_nelp_mode == 1 ) && ( st->bwidth != st->last_bwidth ) ) + { + hSC_VBR->last_nelp_mode = 0; + } + + if ( st->bwidth == NB ) + { + if ( hSC_VBR->last_nelp_mode != 1 ) + { + set_f( hSC_VBR->bp1_filt_mem_nb, 0, 7 * 2 ); + } + } + else if ( st->bwidth == WB || st->bwidth == SWB ) + { + if ( hSC_VBR->last_nelp_mode != 1 ) + { + set_f( hSC_VBR->bp1_filt_mem_wb, 0, 4 * 2 ); + } + } + + if ( hSC_VBR->last_nelp_mode != 1 ) + { + if ( st->bwidth == WB || st->bwidth == SWB ) + { + set_f( hSC_VBR->shape1_filt_mem, 0, 20 ); + set_f( hSC_VBR->shape2_filt_mem, 0, 20 ); + set_f( hSC_VBR->shape3_filt_mem, 0, 20 ); + set_f( hSC_VBR->txlpf1_filt1_mem, 0, 20 ); + set_f( hSC_VBR->txlpf1_filt2_mem, 0, 20 ); + set_f( hSC_VBR->txhpf1_filt1_mem, 0, 20 ); + set_f( hSC_VBR->txhpf1_filt2_mem, 0, 20 ); + } + } + + /* Start Unvoiced/NELP Processing */ + if ( st->bwidth == WB || st->bwidth == SWB ) + { + for ( i = 0, E1 = 0.001f; i < L_FRAME; i++ ) + { + E1 += SQR( in[i] ); + } + + polezero_filter( in, filtRes, L_FRAME, txlpf1_num_coef, txlpf1_den_coef, 10, hSC_VBR->txlpf1_filt1_mem ); + + for ( i = 0, EL1 = 0.001f; i < L_FRAME; i++ ) + { + EL1 += SQR( filtRes[i] ); + } + + polezero_filter( in, filtRes, L_FRAME, txhpf1_num_coef, txhpf1_den_coef, 10, hSC_VBR->txhpf1_filt1_mem ); + + for ( i = 0, EH1 = 0.001f; i < L_FRAME; i++ ) + { + EH1 += SQR( filtRes[i] ); + } + } + + for ( i = 0; i < 9; i++ ) + { + for ( j = i * lag, Gains[i] = 0.001f; j < ( i + 1 ) * lag; j++ ) + { + Gains[i] += SQR( in[j] ); + } + + Gains[i] = (float) sqrt( Gains[i] / lag ); + } + + for ( j = i * lag, Gains[i] = 0.001f; j < L_FRAME; j++ ) + { + Gains[i] += SQR( in[j] ); + } + + Gains[i] = (float) sqrt( Gains[i] / ( L_FRAME - ( lag * i ) ) ); + + if ( reduce_gains == 1 ) + { + for ( i = 0; i < 10; i++ ) + { + Gains[i] = ( Gains[i] * 0.6f ); + } + } + + if ( hSC_VBR->last_nelp_mode != 1 ) /* if prev frame was not NELP then init mem*/ + { + hSC_VBR->nelp_gain_mem = Gains[0]; + } + + tmp = (float) ( 20.0 * ( log10( Gains[0] ) - log10( hSC_VBR->nelp_gain_mem ) ) ); + var_dB = tmp * tmp; + for ( i = 1; i < 10; i++ ) + { + tmp = (float) ( 20.0 * ( log10( Gains[i] ) - log10( Gains[i - 1] ) ) ); + var_dB += tmp * tmp; + } + + if ( hSC_VBR->last_nelp_mode != 1 ) + { + var_dB *= 0.111f; + } + else + { + var_dB *= 0.1f; + } + + fdbck = (float) ( 0.82f / ( 1.0f + exp( 0.25f * ( var_dB - 20.0f ) ) ) ); + + for ( i = 0; i < 10; i++ ) + { + Gains[i] = (float) ( ( 1.0f - fdbck ) * Gains[i] + fdbck * hSC_VBR->nelp_gain_mem ); + hSC_VBR->nelp_gain_mem = Gains[i]; + } + + quantize_uvg( Gains, &iG1, iG2, Gains, (int16_t) st->bwidth ); + + if ( rf_flag ) + { + st->hRF->rf_indx_nelp_iG1[0] = (int16_t) iG1; + st->hRF->rf_indx_nelp_iG2[0][0] = (int16_t) iG2[0]; + st->hRF->rf_indx_nelp_iG2[0][1] = (int16_t) iG2[1]; + } + else + { + push_indice( hBstr, IND_IG1, iG1, 5 ); + push_indice( hBstr, IND_IG2A, iG2[0], 6 ); + push_indice( hBstr, IND_IG2B, iG2[1], 6 ); + } + + if ( st->bwidth == WB || st->bwidth == SWB ) + { + gain_fac = 1.16f; + } + else + { + gain_fac = 1.37f; + } + + generate_nelp_excitation( &( hSC_VBR->nelp_enc_seed ), Gains, ptr, gain_fac ); + + if ( st->bwidth == WB || st->bwidth == SWB ) + { + polezero_filter( ptr, ptr_tmp, L_FRAME, bp1_num_coef_wb, bp1_den_coef_wb, 4, hSC_VBR->bp1_filt_mem_wb ); + mvr2r( ptr_tmp, ptr, L_FRAME ); + } + else if ( st->bwidth == NB ) + { + polezero_filter( ptr, ptr_tmp, L_FRAME, bp1_num_coef_nb_fx_order7, bp1_den_coef_nb_fx_order7, 7, hSC_VBR->bp1_filt_mem_nb ); + mvr2r( ptr_tmp, ptr, L_FRAME ); + } + + for ( i = 0, E3 = 0.001f; i < L_FRAME; i++ ) + { + E3 += SQR( ptr[i] ); + } + + if ( st->bwidth == WB || st->bwidth == SWB ) + { + polezero_filter( ptr, ptr_tmp, L_FRAME, shape1_num_coef, shape1_den_coef, 10, hSC_VBR->shape1_filt_mem ); + mvr2r( ptr_tmp, ptr, L_FRAME ); + + for ( i = 0, E2 = 0.001f; i < L_FRAME; i++ ) + { + E2 += SQR( ptr[i] ); + } + + R = (float) sqrt( E1 / E2 ); + + for ( i = 0; i < L_FRAME; i++ ) + { + filtRes[i] = R * ptr[i]; + } + + polezero_filter( filtRes, ptr_tmp, L_FRAME, txlpf1_num_coef, txlpf1_den_coef, 10, hSC_VBR->txlpf1_filt2_mem ); + mvr2r( ptr_tmp, filtRes, L_FRAME ); + + for ( i = 0, EL2 = 0.001f; i < L_FRAME; i++ ) + { + EL2 += SQR( filtRes[i] ); + } + + for ( i = 0; i < L_FRAME; i++ ) + { + filtRes[i] = R * ptr[i]; + } + + polezero_filter( filtRes, ptr_tmp, L_FRAME, txhpf1_num_coef, txhpf1_den_coef, 10, hSC_VBR->txhpf1_filt2_mem ); + mvr2r( ptr_tmp, filtRes, L_FRAME ); + + for ( i = 0, EH2 = 0.001f; i < L_FRAME; i++ ) + { + EH2 += SQR( filtRes[i] ); + } + + RL = (float) 10.0f * (float) log10( EL1 / EL2 ); + RH = (float) 10.0f * (float) log10( EH1 / EH2 ); + + fid = 0; + if ( RL < -3 ) + { + fid = 1; + } + else if ( RH < -3 ) + { + fid = 2; + } + + if ( rf_flag == 0 ) + { + + switch ( fid ) + { + case 1: + /* Update other filter memory */ + polezero_filter( ptr, filtRes, L_FRAME, shape3_num_coef, shape3_den_coef, 10, hSC_VBR->shape3_filt_mem ); + + /* filter the residual to desired shape */ + polezero_filter( ptr, ptr_tmp, L_FRAME, shape2_num_coef, shape2_den_coef, 10, hSC_VBR->shape2_filt_mem ); + + mvr2r( ptr_tmp, ptr, L_FRAME ); + + break; + case 2: + /* Update other filter memory */ + polezero_filter( ptr, filtRes, L_FRAME, shape2_num_coef, shape2_den_coef, 10, hSC_VBR->shape2_filt_mem ); + + /* filter the residual to desired shape */ + polezero_filter( ptr, ptr_tmp, L_FRAME, shape3_num_coef, shape3_den_coef, 10, hSC_VBR->shape3_filt_mem ); + + mvr2r( ptr_tmp, ptr, L_FRAME ); + + break; + default: + /* Update other filter memory */ + polezero_filter( ptr, filtRes, L_FRAME, shape2_num_coef, shape2_den_coef, 10, hSC_VBR->shape2_filt_mem ); + polezero_filter( ptr, filtRes, L_FRAME, shape3_num_coef, shape3_den_coef, 10, hSC_VBR->shape3_filt_mem ); + + break; + } + + for ( i = 0, E2 = 0.001f; i < L_FRAME; i++ ) + { + E2 += SQR( ptr[i] ); + } + + R = (float) sqrt( E3 / E2 ); + for ( i = 0; i < L_FRAME; i++ ) + { + ptr[i] *= R; + } + } + + if ( rf_flag ) + { + st->hRF->rf_indx_nelp_fid[0] = (int16_t) fid; + } + else + { + push_indice( hBstr, IND_NELP_FID, fid, 2 ); + } + } + + if ( rf_flag == 0 ) + { + for ( i = 0; i < L_FRAME; i++ ) + { + exc[i] = ptr[i]; + } + } + + return; +} diff --git a/lib_enc/nois_est.c b/lib_enc/nois_est.c new file mode 100644 index 0000000000000000000000000000000000000000..b35b3612b569285381e7c7a171dcaee9e660dad0 --- /dev/null +++ b/lib_enc/nois_est.c @@ -0,0 +1,1004 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "wmc_auto.h" + +/*-----------------------------------------------------------------* + * Local constants + *-----------------------------------------------------------------*/ + +#define ALPHA 0.1f + +#define COR_MIN8 0.65f +#define COR_MAX8 0.7f +#define TH_PC8 14 +#define TH_EPS8 10.4f +#define TH_STA8 5.0e5f +#define K_8 0.0091f +#define C_8 0.3185f +#define ALPHA_MAX8 0.999f +#define THR_NCHAR8 1.0f + +#define COR_MIN16 0.52f +#define COR_MAX16 0.85f +#define TH_PC16 4 +#define TH_EPS16 1.6f +/* 10.0e5f causes problems with music - as the noise estimate starts to track the music */ +#define TH_STA16 3.5e5f +#define K_16 0.0245f +#define C_16 -0.235f +#define ALPHA_MAX16 0.99f +#define THR_NCHAR16 1.0f + +#define TH_PC 12 +#define TH_PRED 0.8f +#define THR_SPDIV 5 + +#define HC_CNT 20 /* limit for harm corr count */ +#define HC_CNT_SLOW 80 /* limit for harm corr count slow */ +#define BCKR_SLOW_UPDATE_SCALE 0.1f /* step size for slow bckr update */ + +#define HE_LT_THR1 10.0f +#define HE_LT_THR2 30.0f +#define HE_LT_CNT 30 + +/*-----------------------------------------------------------------* + * noise_est_init() + * + * Initialization of Noise estimator + *-----------------------------------------------------------------*/ + +void noise_est_init( + NOISE_EST_HANDLE hNoiseEst /* i/o: Noise estimation handle */ +) +{ + int16_t i; + + for ( i = 0; i < NB_BANDS; i++ ) + { + hNoiseEst->fr_bands1[i] = 1e-5f; + hNoiseEst->fr_bands2[i] = 1e-5f; + hNoiseEst->ave_enr2[i] = E_MIN; + + hNoiseEst->enrO[i] = E_MIN; + hNoiseEst->bckr[i] = E_MIN; + hNoiseEst->ave_enr[i] = E_MIN; + } + + hNoiseEst->totalNoise = 0.0f; + hNoiseEst->first_noise_updt = 0; + hNoiseEst->first_noise_updt_cnt = 0; + + hNoiseEst->aEn = 6; + hNoiseEst->aEn_inac_cnt = 0; + hNoiseEst->harm_cor_cnt = 0; + hNoiseEst->bg_cnt = 0; + hNoiseEst->lt_tn_track = 0.20f; + hNoiseEst->lt_tn_dist = 0.0f; + hNoiseEst->lt_Ellp_dist = 0.0f; + hNoiseEst->lt_haco_ev = 0.4f; + hNoiseEst->low_tn_track_cnt = 0; + + hNoiseEst->Etot_st_est = 20.0f; + hNoiseEst->Etot_sq_st_est = 400.0f; + + hNoiseEst->epsP_0_2_lp = 1.0f; + hNoiseEst->epsP_0_2_ad_lp = 0.0f; + hNoiseEst->epsP_2_16_lp = 1.0f; + hNoiseEst->epsP_2_16_lp2 = 1.0f; + hNoiseEst->epsP_2_16_dlp_lp = 0.0f; + hNoiseEst->epsP_2_16_dlp_lp2 = 0.0f; + hNoiseEst->lt_aEn_zero = 0.0f; + + /* Tonal detector */ + for ( i = 0; i < L_FFT / 2; i++ ) + { + hNoiseEst->old_S[i] = 1; + } + set_f( hNoiseEst->cor_map, 0, L_FFT / 2 ); + hNoiseEst->act_pred = 1; + hNoiseEst->noise_char = 0; + hNoiseEst->multi_harm_limit = THR_CORR; + + hNoiseEst->Etot_lp = 0.0f; + hNoiseEst->Etot_h = 0.0f; + hNoiseEst->Etot_l = 0.0f; + hNoiseEst->Etot_l_lp = 0.0f; + hNoiseEst->Etot_last = 0.0f; + hNoiseEst->Etot_v_h2 = 0.0f; + hNoiseEst->sign_dyn_lp = 0.0f; + + return; +} + + +/*-----------------------------------------------------------------* + * noise_est_pre() + * + * Track energy and signal dynamics + *-----------------------------------------------------------------*/ + +void noise_est_pre( + const float Etot, /* i : Energy of current frame */ + const int16_t ini_frame, /* i : Frame number (init) */ + NOISE_EST_HANDLE hNoiseEst, /* i/o: Noise estimation data handle*/ + const int16_t idchan, /* i : channel ID */ + const int16_t element_mode, /* i : element mode */ + const int16_t last_element_mode /* i : last element mode */ +) +{ + if ( ini_frame <= 1 || ( idchan == 1 && element_mode == IVAS_CPE_TD && last_element_mode == IVAS_CPE_DFT ) ) + { + hNoiseEst->Etot_lp = Etot; + hNoiseEst->Etot_h = Etot; + hNoiseEst->Etot_l = Etot; + hNoiseEst->Etot_l_lp = Etot; + hNoiseEst->Etot_last = Etot; + hNoiseEst->Etot_v_h2 = 0.0f; + hNoiseEst->sign_dyn_lp = 0.0f; + } + else + { + hNoiseEst->Etot_lp = 0.20f * Etot + 0.80f * hNoiseEst->Etot_lp; + hNoiseEst->Etot_h -= 0.04f; + if ( Etot > hNoiseEst->Etot_h ) + { + hNoiseEst->Etot_h = Etot; + } + hNoiseEst->Etot_l += 0.08f; + + /* Could even be higher but it also delays first entry to DTX */ + if ( hNoiseEst->harm_cor_cnt > 50 ) + { + if ( ini_frame < min( 150, MAX_FRAME_COUNTER - 1 ) && ( hNoiseEst->Etot_h - hNoiseEst->Etot_lp ) < 3.0f ) + { + hNoiseEst->Etot_l += min( 2, ( hNoiseEst->Etot_last - hNoiseEst->Etot_l ) * 0.1f ); + } + + /* Avoids large steps in short active segments */ + if ( hNoiseEst->Etot_last - hNoiseEst->Etot_l > HE_LT_THR2 && hNoiseEst->harm_cor_cnt > 250 ) + { + hNoiseEst->Etot_l += ( hNoiseEst->Etot_last - hNoiseEst->Etot_l ) * 0.02f; + } + else if ( ( hNoiseEst->Etot_last - hNoiseEst->Etot_l ) > HE_LT_THR1 ) + { + hNoiseEst->Etot_l += 0.08f; + } + } + + if ( Etot < hNoiseEst->Etot_l ) + { + hNoiseEst->Etot_l = Etot; + } + + if ( ini_frame < 100 && hNoiseEst->Etot_l < hNoiseEst->Etot_l_lp ) + { + hNoiseEst->Etot_l_lp = 0.1f * hNoiseEst->Etot_l + ( 1.0f - 0.1f ) * hNoiseEst->Etot_l_lp; + } + else if ( ( hNoiseEst->harm_cor_cnt > HE_LT_CNT && ( hNoiseEst->Etot_last - hNoiseEst->Etot_l ) > HE_LT_THR2 ) || ( hNoiseEst->harm_cor_cnt > HE_LT_CNT && ( ini_frame < 150 ) ) || ( ( hNoiseEst->Etot_l_lp - hNoiseEst->Etot_l ) > HE_LT_THR2 ) ) + { + hNoiseEst->Etot_l_lp = 0.03f * hNoiseEst->Etot_l + ( 1.0f - 0.03f ) * hNoiseEst->Etot_l_lp; + } + else + { + hNoiseEst->Etot_l_lp = 0.02f * hNoiseEst->Etot_l + ( 1.0f - 0.02f ) * hNoiseEst->Etot_l_lp; + } + + hNoiseEst->sign_dyn_lp = 0.1f * ( hNoiseEst->Etot_h - hNoiseEst->Etot_l ) + ( 1.0f - 0.1f ) * hNoiseEst->sign_dyn_lp; + } + + return; +} + + +/*-----------------------------------------------------------------* + * noise_est_down() + * + * Down-ward noise updatation routine + * Total Noise computation, relative frame Energy computation + * Noise energy update - here, the energy is updated only if it is + * decreasing to improve noise suppression. Otherwise, the noise + * update is done on noise-only frames and this decision is made in + * nois_est() later in this file. + *-----------------------------------------------------------------*/ + +void noise_est_down( + const float fr_bands[], /* i : per band input energy (contains 2 vectors) */ + float bckr[], /* i/o: per band background noise energy estimate */ + float tmpN[], /* o : temporary noise update */ + float enr[], /* o : averaged energy over both subframes */ + const int16_t min_band, /* i : minimum critical band */ + const int16_t max_band, /* i : maximum critical band */ + float *totalNoise, /* o : noise estimate over all critical bands */ + const float Etot, /* i : Energy of current frame */ + float *Etot_last, /* i/o: Energy of last frame */ + float *Etot_v_h2 /* i/o: Energy variaions of noise frames */ +) +{ + const float *pt1, *pt2; + int16_t i; + float Etot_v; + + /*-----------------------------------------------------------------* + * Estimate total noise energy + *-----------------------------------------------------------------*/ + + *totalNoise = 0.0f; + for ( i = min_band; i <= max_band; i++ ) + { + *totalNoise += bckr[i]; + } + *totalNoise = 10.0f * (float) log10( *totalNoise ); + + /*-----------------------------------------------------------------* + * Average energy per frame for each frequency band + *-----------------------------------------------------------------*/ + + pt1 = fr_bands; + pt2 = fr_bands + NB_BANDS; + + for ( i = 0; i < NB_BANDS; i++ ) + { + enr[i] = 0.5f * ( *pt1++ + *pt2++ ); + } + + /*-----------------------------------------------------------------* + * Background noise energy update + *-----------------------------------------------------------------*/ + + for ( i = 0; i < NB_BANDS; i++ ) + { + tmpN[i] = ( 1 - ALPHA ) * bckr[i] + ALPHA * enr[i]; + if ( tmpN[i] < bckr[i] ) + { + bckr[i] = tmpN[i]; /* Defend to increase noise estimate: keep as it is or decrease */ + } + } + + /*------------------------------------------------------------------* + * Energy variation update + *------------------------------------------------------------------*/ + + Etot_v = (float) fabs( *Etot_last - Etot ); + + *Etot_v_h2 = ( 1.0f - 0.02f ) * *Etot_v_h2 + 0.02f * min( 3.0f, Etot_v ); + if ( *Etot_v_h2 < 0.1f ) + { + *Etot_v_h2 = 0.1f; + } + + return; +} + + +/*-----------------------------------------------------------------* + * noise_est() + * + * Noise energy estimation (noise energy is updated in case of noise-only frame) + *-----------------------------------------------------------------*/ + +void noise_est( + Encoder_State *st, /* i/o: encoder state structure */ + const int16_t old_pitch1, /* i : previous frame OL pitch[1] */ + const float tmpN[], /* i : temporary noise update */ + const float *epsP, /* i : LP prediction error energies */ + const float Etot, /* i : total channel E */ + const float relE, /* i : relative frame energy */ + const float corr_shift, /* i : normalized correlation correction */ + const float enr[], /* i : averaged energy over both subframes */ + float fr_bands[], /* i : spectrum per critical bands of the current frame*/ + float *cor_map_sum, /* o : sum of correlation map from mult-harm analysis */ + float *ncharX, /* o : noise character for sp/mus classifier */ + float *sp_div, /* o : spectral diversity feature */ + float *non_staX, /* o : non-stationarity for sp/mus classifier */ + int16_t *loc_harm, /* o : multi-harmonicity flag for UV classifier */ + const float *lf_E, /* i : per bin energy for low frequencies */ + int16_t *st_harm_cor_cnt, /* i/o: 1st harm correlation timer */ + const float Etot_l_lp, /* i : Smoothed low energy */ + float *sp_floor, /* o : noise floor estimate */ + float S_map[], /* o : short-term correlation map */ + STEREO_CLASSIF_HANDLE hStereoClassif, /* i/o: stereo classifier structure */ + FRONT_VAD_ENC_HANDLE hFrontVad, /* i/o: front-VAD handle */ + const int16_t ini_frame /* i : Frame number (init) */ +) +{ + int16_t i, tmp_pc, pc, spec_div, noise_char; + float alpha, th_eps, th_sta, non_sta, cor_min, cor_max; + float non_sta2, alpha2, sum_num, sum_den, *pt1, *pt2, ftemp, ftemp2, nchar_thr; + float updt_step, log_enr; + int16_t aE_bgd, sd1_bgd, bg_bgd2; + int16_t tn_ini; + float epsP_0_2, epsP_0_2_ad, epsP_0_2_ad_lp_max; + float epsP_2_16, epsP_2_16_dlp, epsP_2_16_dlp_max; + int16_t PAU, BG_1, NEW_POS_BG; + float haco_ev_max; + float Etot_l_lp_thr; + float comb_ahc_epsP, comb_hcm_epsP; + int16_t enr_bgd, cns_bgd, lp_bgd, ns_mask; + int16_t lt_haco_mask, bg_haco_mask; + int16_t SD_1, bg_bgd3, PD_1, PD_2, PD_3, PD_4, PD_5; + float tmp_enr, tmp_ave, tmp_ave2; + float non_staB; + float lim_Etot; + NOISE_EST_HANDLE hNoiseEst; + + /* Check if LR-VAD */ + if ( hFrontVad != NULL ) + { + hNoiseEst = hFrontVad->hNoiseEst; + } + else + { + hNoiseEst = st->hNoiseEst; + } + + /*-----------------------------------------------------------------* + * Initialization + *-----------------------------------------------------------------*/ + + if ( hFrontVad == NULL ) + { + if ( st->hSpMusClas != NULL ) + { + float E; + + E = mean( lf_E, 8 ); + if ( E < 1.0f ) + { + st->hSpMusClas->ener_RAT = 0.f; + } + else + { + st->hSpMusClas->ener_RAT = 10.0f * (float) log10( E ); + st->hSpMusClas->ener_RAT /= ( Etot + 0.01f ); + } + + if ( st->hSpMusClas->ener_RAT > 1.0 ) + { + st->hSpMusClas->ener_RAT = 1.0f; + } + } + } + + /*-----------------------------------------------------------------* + * Set the threshold for eps & non_sta based on input sampling rate + * The reason is that in case of 8kHz sampling input, there is nothing + * between 4kHz-6.4kHz. In noisy conditions, this makes a fast + * transition even in noise-only parts, hence producing a "higher + * order" spectral envelope => the epsP ratio is much less effective. + *-----------------------------------------------------------------*/ + + if ( st->input_bwidth != NB ) + { + /* WB input */ + th_eps = TH_EPS16; + th_sta = TH_STA16; + cor_min = COR_MIN16; + cor_max = COR_MAX16; + } + else + { + /* NB input */ + th_eps = TH_EPS8; + th_sta = TH_STA8; + cor_min = COR_MIN8; + cor_max = COR_MAX8; + } + + /*-----------------------------------------------------------------* + * Estimation of pitch stationarity + *-----------------------------------------------------------------*/ + + pc = (int16_t) ( abs( st->pitch[0] - old_pitch1 ) + abs( st->pitch[1] - st->pitch[0] ) ); + + if ( ( ( st->voicing[0] + st->voicing[1] + st->voicing[2] ) / 3.0f + corr_shift ) < cor_min ) + { + /* low correlation -> probably inactive signal */ + tmp_pc = TH_PC; + } + else + { + tmp_pc = pc; + } + + /*-----------------------------------------------------------------* + * Multi-harmonic analysis + *-----------------------------------------------------------------*/ + + if ( hFrontVad == NULL ) + { + if ( st->hSpMusClas != NULL ) + { + i = 0; + *loc_harm = multi_harm( st->Bin_E, hNoiseEst->old_S, hNoiseEst->cor_map, &hNoiseEst->multi_harm_limit, st->total_brate, st->bwidth, ( st->hGSCEnc != NULL ) ? &st->hGSCEnc->cor_strong_limit : &i, &st->hSpMusClas->mean_avr_dyn, &st->hSpMusClas->last_sw_dyn, cor_map_sum, sp_floor, S_map ); + } + } + + /*-----------------------------------------------------------------* + * Detection of frames with non-stationary spectral content + *-----------------------------------------------------------------*/ + + /* weighted sum of spectral changes per critical bands */ + sum_num = 0; + sum_den = 0; + + pt1 = fr_bands + 10; + pt2 = hNoiseEst->fr_bands2 + 10; + for ( i = 10; i <= st->max_band; i++ ) + { + if ( *pt1 > *pt2 ) + { + sum_num += *pt1 * *pt1 / *pt2; + sum_den += *pt1; + } + else + { + sum_num += *pt2 * *pt2 / *pt1; + sum_den += *pt2; + } + + pt1++; + pt2++; + } + + /* calculation of spectral diversity */ + if ( sum_num > THR_SPDIV * sum_den ) + { + spec_div = 1; + } + else + { + spec_div = 0; + } + + *sp_div = sum_num / ( sum_den + 1e-5f ); + + /*-----------------------------------------------------------------* + * Detection of frames with high energy content in high frequencies + *-----------------------------------------------------------------*/ + + /* calculation of energy in first 10 critical bands */ + ftemp = sum_f( &fr_bands[st->min_band], 10 - st->min_band ); + + /* calculation of energy in the rest of bands */ + ftemp2 = sum_f( &fr_bands[10], st->max_band - 10 + 1 ); + + if ( ncharX != NULL ) + { + *ncharX = ftemp2 / ( ftemp + 1e-5f ); + } + + if ( ftemp < 1e2 || ftemp2 < 1e2 ) + { + ftemp2 = 0; + } + else + { + ftemp2 /= ftemp; + } + + if ( hStereoClassif != NULL ) + { + if ( st->idchan == 0 ) + { + hStereoClassif->nchar_ch1 = ftemp2; + } + else + { + hStereoClassif->nchar_ch2 = ftemp2; + } + } + + if ( ftemp2 > 10 ) + { + ftemp2 = 10; + } + + /* update LT value of the final parameter */ + hNoiseEst->noise_char = M_ALPHA * hNoiseEst->noise_char + ( 1 - M_ALPHA ) * ftemp2; + + if ( st->input_bwidth == NB ) + { + nchar_thr = THR_NCHAR8; + } + else + { + nchar_thr = THR_NCHAR16; + } + + if ( hNoiseEst->noise_char > nchar_thr ) + { + noise_char = 1; + } + else + { + noise_char = 0; + } + + /* save the 2 last spectra per crit. bands for the future */ + mvr2r( hNoiseEst->fr_bands1, hNoiseEst->fr_bands2, NB_BANDS ); + mvr2r( fr_bands + NB_BANDS, hNoiseEst->fr_bands1, NB_BANDS ); + + /*-----------------------------------------------------------------* + * Non-stationarity estimation for each band (handicap high E frames in average computing) + *-----------------------------------------------------------------*/ + + /* set averaging factor */ + ftemp = relE; + if ( ftemp < 0.0f ) + { + ftemp = 0.0f; + } + + alpha = 0.064f * ftemp + 0.75f; + + if ( alpha > 0.999f ) + { + alpha = 0.999f; + } + + /* during significant attacks, replace LT energy by the */ + /* current energy - this will cause non_sta2 failures to occur in */ + /* different frames than non_sta failures */ + alpha2 = alpha; + if ( spec_div > 0 ) + { + alpha2 = 0.0f; + } + + /* calculate non-stationarity */ + non_sta = 1.0f; + non_sta2 = 1.0f; + *non_staX = 0.0f; + non_staB = 0.0f; + for ( i = st->min_band; i <= st->max_band; i++ ) + { + /* + 1.0f added to reduce sencitivity to non stationarity in low energies */ + tmp_enr = enr[i] + 1.0f; + if ( non_sta <= th_sta ) /* Just to limit the saturation */ + { + tmp_ave = hNoiseEst->ave_enr[i] + 1.0f; + if ( tmp_enr > tmp_ave ) + { + non_sta = non_sta * ( tmp_enr / tmp_ave ); /* non_stationarity measure */ + } + else + { + non_sta = non_sta * ( tmp_ave / tmp_enr ); /* non_stationarity measure */ + } + } + hNoiseEst->ave_enr[i] = alpha * hNoiseEst->ave_enr[i] + ( 1 - alpha ) * enr[i]; /* update long-term average */ + + /* calculation of another non-stationarity measure (following attacks) */ + if ( non_sta2 <= th_sta ) + { + tmp_ave2 = hNoiseEst->ave_enr2[i] + 1.0f; + if ( tmp_enr > tmp_ave2 ) + { + non_sta2 = non_sta2 * ( tmp_enr / tmp_ave2 ); + } + else + { + non_sta2 = non_sta2 * ( tmp_ave2 / tmp_enr ); + } + } + + hNoiseEst->ave_enr2[i] = alpha2 * hNoiseEst->ave_enr2[i] + ( 1 - alpha2 ) * enr[i]; + + /* calculate non-stationarity feature for speech/music classifier */ + if ( hFrontVad == NULL ) + { + if ( i >= START_BAND_SPMUS && i < NB_BANDS_SPMUS + START_BAND_SPMUS && st->hSpMusClas != NULL ) + { + log_enr = (float) log( enr[i] ); + if ( log_enr > st->hSpMusClas->past_log_enr[i - START_BAND_SPMUS] ) + { + *non_staX += log_enr - st->hSpMusClas->past_log_enr[i - START_BAND_SPMUS]; + } + else + { + *non_staX += st->hSpMusClas->past_log_enr[i - START_BAND_SPMUS] - log_enr; + } + + st->hSpMusClas->past_log_enr[i - START_BAND_SPMUS] = log_enr; + } + } + + /* calculate non-stationarity feature relative background */ + if ( ini_frame < 100 ) + { + /* During init don't include updates */ + if ( i >= 2 && i <= 16 ) + { + non_staB += (float) fabs( log( enr[i] + 1.0f ) - log( E_MIN + 1.0f ) ); + } + } + else + { + /* After init compare with background estimate */ + if ( i >= 2 && i <= 16 ) + { + non_staB += (float) fabs( log( enr[i] + 1.0f ) - log( hNoiseEst->bckr[i] + 1.0f ) ); + } + } + + if ( non_staB >= 128 ) + { + non_staB = MAX16B_FLT / 256.0f; + } + } + + if ( Etot < -5.0f ) + { + non_sta = 1.0f; + non_sta2 = 1.0f; + } + + lim_Etot = max( 20.0f, Etot ); + + if ( ini_frame < 150 ) + { + /* Allow use of quicker filter during init - if needed */ + hNoiseEst->Etot_st_est = 0.25f * lim_Etot + ( 1.0f - 0.25F ) * hNoiseEst->Etot_st_est; + hNoiseEst->Etot_sq_st_est = 0.25f * lim_Etot * lim_Etot + ( 1.0f - 0.25f ) * hNoiseEst->Etot_sq_st_est; + } + else + { + hNoiseEst->Etot_st_est = 0.25f * lim_Etot + ( 1.0f - 0.25f ) * hNoiseEst->Etot_st_est; + hNoiseEst->Etot_sq_st_est = 0.25f * lim_Etot * lim_Etot + ( 1.0f - 0.25f ) * hNoiseEst->Etot_sq_st_est; + } + + /*-----------------------------------------------------------------* + * Count frames since last correlation or harmonic event + *-----------------------------------------------------------------*/ + + if ( Etot > 0 && ( *loc_harm > 0 || 0.5f * ( st->voicing[0] + st->voicing[1] ) > 0.85f ) ) + { + hNoiseEst->harm_cor_cnt = 0; + } + else + { + hNoiseEst->harm_cor_cnt += 1; + } + + if ( hNoiseEst->harm_cor_cnt > 1 && ( ( Etot < 15.0f ) || ( ini_frame > 10 && ( Etot - hNoiseEst->Etot_lp ) > 7.0f ) ) ) + { + hNoiseEst->harm_cor_cnt = 1; + } + + if ( hNoiseEst->harm_cor_cnt > 1 && Etot > 30.0f && ( hNoiseEst->Etot_sq_st_est - hNoiseEst->Etot_st_est * hNoiseEst->Etot_st_est ) > 8.0f ) + { + hNoiseEst->harm_cor_cnt = max( 1, (int16_t) round_f( (float) hNoiseEst->harm_cor_cnt / 4.0f ) ); + } + + /*-----------------------------------------------------------------* + * Energy-based pause-length counter + *-----------------------------------------------------------------*/ + + if ( hNoiseEst->bg_cnt >= 0 && ( Etot - hNoiseEst->Etot_l_lp ) > 5 ) + { + /* probably speech burst */ + hNoiseEst->bg_cnt = -1; + } + else + { + if ( hNoiseEst->bg_cnt == -1 && ( Etot - hNoiseEst->Etot_l_lp ) < 5 ) + { + /* probably start of speech pause */ + hNoiseEst->bg_cnt = 0; + } + } + + if ( hNoiseEst->bg_cnt >= 0 ) + { + hNoiseEst->bg_cnt += 1; + } + + /*-----------------------------------------------------------------* + * Linear predition efficiency 0 to 2 order + *-----------------------------------------------------------------*/ + + epsP_0_2 = max( 0, min( 8, epsP[0] / epsP[2] ) ); + hNoiseEst->epsP_0_2_lp = 0.15f * epsP_0_2 + ( 1.0f - 0.15f ) * hNoiseEst->epsP_0_2_lp; + epsP_0_2_ad = (float) fabs( epsP_0_2 - hNoiseEst->epsP_0_2_lp ); + if ( epsP_0_2_ad < hNoiseEst->epsP_0_2_ad_lp ) + { + hNoiseEst->epsP_0_2_ad_lp = 0.1f * epsP_0_2_ad + ( 1.0f - 0.1f ) * hNoiseEst->epsP_0_2_ad_lp; + } + else + { + hNoiseEst->epsP_0_2_ad_lp = 0.2f * epsP_0_2_ad + ( 1.0f - 0.2f ) * hNoiseEst->epsP_0_2_ad_lp; + } + epsP_0_2_ad_lp_max = max( epsP_0_2_ad, hNoiseEst->epsP_0_2_ad_lp ); + + /*-----------------------------------------------------------------* + * Linear predition efficiency 2 to 16 order + *-----------------------------------------------------------------*/ + + epsP_2_16 = max( 0, min( 8, epsP[2] / epsP[16] ) ); + if ( epsP_2_16 > hNoiseEst->epsP_2_16_lp ) + { + hNoiseEst->epsP_2_16_lp = 0.2f * epsP_2_16 + ( 1.0f - 0.2f ) * hNoiseEst->epsP_2_16_lp; + } + else + { + hNoiseEst->epsP_2_16_lp = 0.03f * epsP_2_16 + ( 1.0f - 0.03f ) * hNoiseEst->epsP_2_16_lp; + } + hNoiseEst->epsP_2_16_lp2 = 0.02f * epsP_2_16 + ( 1.0f - 0.02f ) * hNoiseEst->epsP_2_16_lp2; + + epsP_2_16_dlp = hNoiseEst->epsP_2_16_lp - hNoiseEst->epsP_2_16_lp2; + + if ( epsP_2_16_dlp < hNoiseEst->epsP_2_16_dlp_lp2 ) + { + hNoiseEst->epsP_2_16_dlp_lp2 = 0.02f * epsP_2_16_dlp + ( 1.0f - 0.02f ) * hNoiseEst->epsP_2_16_dlp_lp2; + } + else + { + hNoiseEst->epsP_2_16_dlp_lp2 = 0.05f * epsP_2_16_dlp + ( 1.0f - 0.05f ) * hNoiseEst->epsP_2_16_dlp_lp2; + } + + epsP_2_16_dlp_max = max( epsP_2_16_dlp, hNoiseEst->epsP_2_16_dlp_lp2 ); + + /*-----------------------------------------------------------------* + * long term extensions of frame features + *-----------------------------------------------------------------*/ + + hNoiseEst->lt_tn_track = 0.03f * ( Etot - hNoiseEst->totalNoise < 10 ) + 0.97f * hNoiseEst->lt_tn_track; + hNoiseEst->lt_tn_dist = 0.03f * ( Etot - hNoiseEst->totalNoise ) + 0.97f * hNoiseEst->lt_tn_dist; + hNoiseEst->lt_Ellp_dist = 0.03f * ( Etot - hNoiseEst->Etot_l_lp ) + 0.97f * hNoiseEst->lt_Ellp_dist; + + if ( hNoiseEst->harm_cor_cnt == 0 ) + { + hNoiseEst->lt_haco_ev = 0.03f + 0.97f * hNoiseEst->lt_haco_ev; + } + else + { + hNoiseEst->lt_haco_ev = 0.99f * hNoiseEst->lt_haco_ev; + } + + if ( hNoiseEst->lt_tn_track < 0.05f ) + { + hNoiseEst->low_tn_track_cnt++; + } + else + { + hNoiseEst->low_tn_track_cnt = 0; + } + + + /* update of the long-term non-stationarity measure (between 0 and 1) */ + if ( ( non_sta > th_sta ) || ( *loc_harm > 0 ) ) + { + hNoiseEst->act_pred = M_GAMMA * hNoiseEst->act_pred + ( 1 - M_GAMMA ) * 1; + } + else + { + hNoiseEst->act_pred = M_GAMMA * hNoiseEst->act_pred + ( 1 - M_GAMMA ) * 0; + } + + /*-----------------------------------------------------------------* + * Increment/decrement counter for enabling background noise update + *-----------------------------------------------------------------*/ + + if ( ( ( *st_harm_cor_cnt < 3 * HC_CNT_SLOW ) && ( ( non_sta > th_sta ) || + ( tmp_pc < TH_PC ) || + ( noise_char > 0 ) ) ) || + ( ( ini_frame > 150 ) && ( Etot - Etot_l_lp ) > 10 ) || + ( 0.5f * ( st->voicing[0] + st->voicing[1] ) > cor_max ) || + ( epsP[2] / epsP[16] > th_eps ) || + ( *loc_harm > 0 ) || + ( ( hNoiseEst->act_pred > 0.8f ) && ( non_sta2 > th_sta ) ) ) + + { + /* active signal present - increment counter */ + hNoiseEst->aEn = hNoiseEst->aEn + 2; + } + else + { + /* background noise present - decrement counter */ + hNoiseEst->aEn = hNoiseEst->aEn - 1; + } + + if ( hNoiseEst->aEn > 6 ) + { + hNoiseEst->aEn = 6; + } + else if ( hNoiseEst->aEn < 0 ) + { + hNoiseEst->aEn = 0; + } + + if ( hNoiseEst->aEn <= 1 ) + { + hNoiseEst->aEn_inac_cnt++; + hNoiseEst->aEn_inac_cnt = min( hNoiseEst->aEn_inac_cnt, 128 ); + } + + /*-----------------------------------------------------------------* + * Stereo classifier - save raw aEn + *-----------------------------------------------------------------*/ + + if ( hStereoClassif != NULL ) + { + if ( ( non_sta > th_sta ) || + ( tmp_pc < TH_PC ) || + ( 0.5f * ( st->voicing[0] + st->voicing[1] ) > cor_max ) || + ( epsP[2] / epsP[16] > th_eps ) || + ( ( hNoiseEst->act_pred > 0.8f ) && ( non_sta2 > th_sta ) ) ) + { + /* active signal present - increment counter */ + hStereoClassif->aEn_raw[st->idchan] = hStereoClassif->aEn_raw[st->idchan] + 2; + } + else + { + /* background noise present - decrement counter */ + hStereoClassif->aEn_raw[st->idchan] = hStereoClassif->aEn_raw[st->idchan] - 1; + } + + if ( hStereoClassif->aEn_raw[st->idchan] > 6 ) + { + hStereoClassif->aEn_raw[st->idchan] = 6; + } + else if ( hStereoClassif->aEn_raw[st->idchan] < 0 ) + { + hStereoClassif->aEn_raw[st->idchan] = 0; + } + } + + /*--------------------------------------------------------------* + * Background noise update + * (bckr[] has been already updated downwards in nois_est_down()) + *--------------------------------------------------------------*/ + + /* Additional detectors */ + comb_ahc_epsP = max( max( hNoiseEst->act_pred, hNoiseEst->lt_haco_ev ), epsP_2_16_dlp ); + comb_hcm_epsP = max( max( hNoiseEst->lt_haco_ev, epsP_2_16_dlp_max ), epsP_0_2_ad_lp_max ); + + haco_ev_max = max( *st_harm_cor_cnt == 0, hNoiseEst->lt_haco_ev ); + Etot_l_lp_thr = hNoiseEst->Etot_l_lp + ( 1.5f + 1.5f * ( hNoiseEst->Etot_lp < 50.0f ) ) * hNoiseEst->Etot_v_h2; + + enr_bgd = Etot < Etot_l_lp_thr; + cns_bgd = ( epsP_0_2 > 7.95f ) && ( non_sta < 1e3f ); + lp_bgd = epsP_2_16_dlp_max < 0.10f; + ns_mask = non_sta < 1e5f; + lt_haco_mask = hNoiseEst->lt_haco_ev < 0.5f; + bg_haco_mask = haco_ev_max < 0.4f; + + SD_1 = ( ( epsP_0_2_ad > 0.5f ) && ( epsP_0_2 > 7.95f ) ); + + bg_bgd3 = enr_bgd || ( ( cns_bgd || lp_bgd ) && ns_mask && lt_haco_mask && SD_1 == 0 ); + + PD_1 = ( epsP_2_16_dlp_max < 0.10f ); + PD_2 = ( epsP_0_2_ad_lp_max < 0.10f ); + PD_3 = ( comb_ahc_epsP < 0.85f ); + PD_4 = comb_ahc_epsP < 0.15f; + PD_5 = comb_hcm_epsP < 0.30f; + + BG_1 = ( ( SD_1 == 0 ) || ( Etot < Etot_l_lp_thr ) ) && bg_haco_mask && ( hNoiseEst->act_pred < 0.85f ) && ( hNoiseEst->Etot_lp < 50.0f ); + + PAU = ( hNoiseEst->aEn == 0 ) || ( ( Etot < 55.0f ) && ( SD_1 == 0 ) && ( ( PD_3 && ( PD_1 || PD_2 ) ) || ( PD_4 || PD_5 ) ) ); + + NEW_POS_BG = ( PAU | BG_1 ) & bg_bgd3; + + /* Original silence detector works in most cases */ + aE_bgd = hNoiseEst->aEn == 0; + + /* When the signal dynamics is high and the energy is close to the background estimate */ + sd1_bgd = ( hNoiseEst->sign_dyn_lp > 15 ) && ( Etot - hNoiseEst->Etot_l_lp ) < 2 * hNoiseEst->Etot_v_h2 && hNoiseEst->harm_cor_cnt > 20; + + /* init conditions steadily dropping act_pred and/or lt_haco_ev */ + tn_ini = ini_frame < 150 && hNoiseEst->harm_cor_cnt > 5 && + ( Etot - hNoiseEst->Etot_lp ) < 7 && + ( ( hNoiseEst->act_pred < 0.59f && hNoiseEst->lt_haco_ev < 0.23f ) || + hNoiseEst->act_pred < 0.38f || + ( ( st->element_mode == EVS_MONO && hNoiseEst->lt_haco_ev < 0.15f ) || ( st->element_mode > EVS_MONO && hNoiseEst->lt_haco_ev < 0.08f ) ) || + non_staB < 50.0f || + aE_bgd || ( Etot < 42.0f && hNoiseEst->harm_cor_cnt > 10 && hNoiseEst->lt_haco_ev < 0.35f && hNoiseEst->act_pred < 0.8f ) ); + + /* Energy close to the background estimate serves as a mask for other background detectors */ + bg_bgd2 = Etot < Etot_l_lp_thr || tn_ini; + + updt_step = 0.0f; + if ( ( bg_bgd2 && ( aE_bgd || sd1_bgd || hNoiseEst->lt_tn_track > 0.90f || NEW_POS_BG ) ) || tn_ini ) + { + if ( ( ( hNoiseEst->act_pred < 0.85f ) && + aE_bgd && + ( hNoiseEst->lt_Ellp_dist < 10 || sd1_bgd ) && hNoiseEst->lt_tn_dist < 40 && + ( ( Etot - hNoiseEst->totalNoise ) < 10.0f ) ) || + ( hNoiseEst->first_noise_updt == 0 && hNoiseEst->harm_cor_cnt > 80 && aE_bgd && hNoiseEst->lt_aEn_zero > 0.5f ) || + ( tn_ini && ( aE_bgd || non_staB < 10.0 || hNoiseEst->harm_cor_cnt > 80 ) ) ) + { + updt_step = 1.0f; + hNoiseEst->first_noise_updt = 1; + for ( i = 0; i < NB_BANDS; i++ ) + { + hNoiseEst->bckr[i] = tmpN[i]; + } + } + else if ( ( ( hNoiseEst->act_pred < 0.80f ) && ( aE_bgd || PAU ) && hNoiseEst->lt_haco_ev < 0.10f ) || ( ( hNoiseEst->act_pred < 0.70f ) && ( aE_bgd || non_staB < 17.0f ) && PAU && hNoiseEst->lt_haco_ev < 0.15f ) || ( hNoiseEst->harm_cor_cnt > 80 && hNoiseEst->totalNoise > 5.0f && Etot < max( 1.0f, Etot_l_lp + 1.5f * hNoiseEst->Etot_v_h2 ) ) || ( hNoiseEst->harm_cor_cnt > 50 && hNoiseEst->first_noise_updt > 30 && aE_bgd && hNoiseEst->lt_aEn_zero > 0.5f ) || tn_ini ) + { + updt_step = 0.1f; + if ( !aE_bgd && + hNoiseEst->harm_cor_cnt < 50 && + ( hNoiseEst->act_pred > 0.6f || + ( !tn_ini && Etot_l_lp - hNoiseEst->totalNoise < 10.0f && non_staB > 8.0f ) ) ) + { + updt_step = 0.01f; + } + + hNoiseEst->first_noise_updt = 1; + for ( i = 0; i < NB_BANDS; i++ ) + { + hNoiseEst->bckr[i] = hNoiseEst->bckr[i] + updt_step * ( tmpN[i] - hNoiseEst->bckr[i] ); + } + } + else if ( aE_bgd || hNoiseEst->harm_cor_cnt > 100 ) + { + hNoiseEst->first_noise_updt += 1; + } + } + else + { + /* If in music decrease bckr[] to drop further */ + if ( hNoiseEst->low_tn_track_cnt > 300 && hNoiseEst->lt_haco_ev > 0.9f && hNoiseEst->totalNoise > 0.0f ) + { + updt_step = -0.02f; + for ( i = 0; i < NB_BANDS; i++ ) + { + if ( hNoiseEst->bckr[i] > 2 * E_MIN ) + { + hNoiseEst->bckr[i] = 0.98f * hNoiseEst->bckr[i]; + } + } + } + } + hNoiseEst->lt_aEn_zero = 0.2f * ( hNoiseEst->aEn == 0 ) + ( 1 - 0.2f ) * hNoiseEst->lt_aEn_zero; + + if ( st->element_mode > EVS_MONO ) + { + if ( hNoiseEst->first_noise_updt > 0 && hNoiseEst->first_noise_updt_cnt < 100 ) + { + hNoiseEst->first_noise_updt_cnt++; + } + } + + return; +} diff --git a/lib_enc/noise_adjust.c b/lib_enc/noise_adjust.c new file mode 100644 index 0000000000000000000000000000000000000000..7b059f5c5ff7f956c97cd8817bb5d0df46dafe2c --- /dev/null +++ b/lib_enc/noise_adjust.c @@ -0,0 +1,116 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "wmc_auto.h" + +/*--------------------------------------------------------------------------* + * noise_adjust() + * + * Calculate attenuation + *--------------------------------------------------------------------------*/ + +/*! r: index of noise attenuation */ +int16_t noise_adjust( + const float *coeffs_norm, /* i : normalized coefficients */ + const int16_t *bitalloc, /* i : bit allocation */ + const int16_t *sfm_start, + const int16_t *sfm_end, + const int16_t core_sfm /* i : index of the end band for core */ +) +{ + int16_t nf_idx, sfm, bin, num_coeffs; + int16_t E, diff, tmp; + + E = 0; + num_coeffs = 0; + + for ( sfm = 0; sfm <= core_sfm; sfm++ ) + { + if ( bitalloc[sfm] == 0 ) + { + for ( bin = sfm_start[sfm]; bin < sfm_end[sfm]; bin++ ) + { + if ( coeffs_norm[bin] == 0 ) + { + E = E - 1; + } + else + { + tmp = (int16_t) ( floor( log10( fabs( coeffs_norm[bin] * L_FRAME ) ) / 0.301030f ) + 1 ); + if ( tmp < 0 ) + { + tmp = 0; + } + E = E + tmp; + } + + num_coeffs = num_coeffs + 1; + } + } + } + + if ( num_coeffs != 0 ) + { + E = E / num_coeffs; + } + else + { + E = 0; + } + + diff = 7 - E; + + if ( diff >= 0 ) + { + nf_idx = (int16_t) diff; + if ( diff > 3 ) + { + nf_idx = 3; + } + } + else + { + nf_idx = 0; + } + + return nf_idx; +} diff --git a/lib_enc/normalizecoefs.c b/lib_enc/normalizecoefs.c new file mode 100644 index 0000000000000000000000000000000000000000..90b7c4a5417a4d6b3bfe6a0a5a00553e955d917e --- /dev/null +++ b/lib_enc/normalizecoefs.c @@ -0,0 +1,71 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "rom_com.h" +#include "prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------------- + * normalizecoefs() + * + * Normalize MDCT coefficients with quantized norms + *--------------------------------------------------------------------------*/ + +void normalizecoefs( + float *coefs, /* i/o: MDCT coefficients */ + const int16_t *ynrm, /* i : quantization indices for norms */ + const int16_t num_bands, /* i : Number of bands */ + const int16_t *band_start, /* i : Start of bands */ + const int16_t *band_end /* i : End of bands */ +) +{ + int16_t i, band; + float normq; + + for ( band = 0; band < num_bands; band++ ) + { + normq = dicn_inv[ynrm[band]]; + + for ( i = band_start[band]; i < band_end[band]; i++ ) + { + coefs[i] *= normq; + } + } + + return; +} diff --git a/lib_enc/peak_vq_enc.c b/lib_enc/peak_vq_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..27943ed61364dce1854bdc331076ec3cd8a7f4b8 --- /dev/null +++ b/lib_enc/peak_vq_enc.c @@ -0,0 +1,633 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" +#include + +/*-------------------------------------------------------------------------- + * Local function prototypes + *--------------------------------------------------------------------------*/ + +static void quant_peaks( BSTR_ENC_HANDLE hBstr, const float *vect_in, float *vect_out, const float *peak_gain, int16_t *vq_idx, const int16_t overlap, const int32_t core_brate, const int16_t Npeaks ); + +static int16_t hvq_code_pos( BSTR_ENC_HANDLE hBstr, const int16_t *const inp, const int16_t length, const int16_t num_peaks ); + +static int16_t sparse_code_pos( const int16_t *inp, const int16_t length, int16_t *result ); + + +/*-------------------------------------------------------------------------- + * peak_vq_enc() + * + * Vector Quantization of MDCT peaks + *--------------------------------------------------------------------------*/ + +int16_t peak_vq_enc( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const int16_t bwidth, /* i : audio bandwidth */ + const float *coefs, /* i : Input coefficient vector */ + float *coefs_out, /* o : Quantized output vector */ + const int32_t core_brate, /* i : Core bitrate */ + const int16_t num_bits, /* i : Number of bits for HVQ */ + const int16_t vq_peaks, /* i : Number of identified peaks */ + const int16_t *ynrm, /* i : Envelope coefficients */ + int16_t *R, /* i/o: Bit allocation/updated bit allocation */ + int16_t *vq_peak_idx, /* i : Peak index vector */ + float *nf_gains /* i : Estimated noise floor gains */ +) +{ + int16_t pos_bits; + float normq; + float pgain_q[HVQ_MAX_PEAKS]; + float peak_gains[HVQ_MAX_PEAKS]; + float coefs_pvq[HVQ_PVQ_BUF_LEN]; + float pvq_vector[HVQ_PVQ_BUF_LEN]; + float *pPvqVectorBandStart; + float fg_pred[NB_SFM_MAX]; + int16_t i, j, k, m, r, pvq_bands, num_overlap_bins; + int16_t hcode_l, FlagN, low_peak_bin, vq_cb_idx, max_peaks, bin_th; + int16_t bits = 0; + int16_t q_nf_gain_idx[HVQ_NF_GROUPS]; + int16_t nf_seed = RANDOM_INITSEED; + int16_t pgain_cb_idx[HVQ_MAX_PEAKS], pgain_difidx[HVQ_MAX_PEAKS]; + int16_t pvq_norm[MAX_PVQ_BANDS]; + int16_t pvq_bits, bit_budget; + int16_t pos_vec[HVQ_THRES_BIN_32k]; + int16_t npulses[MAX_PVQ_BANDS]; + int16_t pvq_inp_vector[HVQ_PVQ_BUF_LEN]; + int16_t k_sort[MAX_PVQ_BANDS]; + int16_t Rk[MAX_PVQ_BANDS]; + int16_t Rk_f[MAX_PVQ_BANDS]; /*Q3*/ + float gopt[NB_SFM]; + int16_t sel_bnds[HVQ_NUM_SFM_24k]; + int16_t n_sel_bnds; + int32_t manE_peak, manPkEnrg; + int16_t expE_peak, expPkEnrg; + int16_t hvq_band_end[MAX_PVQ_BANDS]; + int16_t hvq_band_start[MAX_PVQ_BANDS]; + int16_t hvq_band_width[MAX_PVQ_BANDS]; + int16_t n; + int16_t s; + set_f( coefs_pvq, 0.0f, HVQ_PVQ_BUF_LEN ); + set_f( pvq_vector, 0.0f, HVQ_PVQ_BUF_LEN ); + set_s( npulses, 0, MAX_PVQ_BANDS ); + + /* Set bitrate dependent variables */ + assert( ( core_brate > HQ_16k40 && core_brate <= HQ_48k ) && "HVQ rate not supported" ); + max_peaks = (int16_t) ( ( core_brate * HVQ_PEAKS_PER_DELTA + HVQ_PEAKS_PER_DELTA_OFFS ) / HVQ_PEAKS_BPS_DELTA ); + bin_th = HVQ_THRES_BIN_24k; + if ( core_brate >= HQ_BWE_CROSSOVER_BRATE ) + { + bin_th = HVQ_THRES_BIN_32k; + } + + for ( i = 0; i < bin_th; i++ ) + { + pos_vec[i] = 0; + } + + /* Quantize noise floor gains */ + for ( i = 0; i < HVQ_NF_GROUPS; i++ ) + { + logqnorm( &nf_gains[i], &q_nf_gain_idx[i], 32, 1, &thren_HQ[0] ); + nf_gains[i] = 0.5f * dicn[q_nf_gain_idx[i]]; + push_indice( hBstr, IND_HVQ_NF_GAIN, q_nf_gain_idx[i], 5 ); + bits += 5; + } + + /* Signal number of peaks */ + i = max_peaks - vq_peaks; + push_indice( hBstr, IND_NUM_PEAKS, i, 5 ); + bits += 5; + + /* Identify position of first peak and arrange peak gains by position */ + low_peak_bin = bin_th; + for ( i = 0; i < vq_peaks; i++ ) + { + if ( vq_peak_idx[i] < low_peak_bin ) + { + low_peak_bin = vq_peak_idx[i]; + } + pos_vec[vq_peak_idx[i]] = (int16_t) sign( (float) coefs[vq_peak_idx[i]] ); + } + + for ( i = 0, j = 0; i < bin_th; i++ ) + { + if ( pos_vec[i] != 0 ) + { + peak_gains[j] = (float) fabs( coefs[i] ); + vq_peak_idx[j] = i; + j++; + } + } + + /* Scale down peak gains */ + for ( i = 0; i < vq_peaks; i++ ) + { + peak_gains[i] *= 0.25f; + } + + /* Quantize peak gains */ + logqnorm( &peak_gains[0], &pgain_cb_idx[0], 32, 1, &thren_pg[0] ); + for ( i = 1; i < vq_peaks; i++ ) + { + logqnorm( &peak_gains[i], &pgain_cb_idx[i], 45, 1, &thren_pg[0] ); + } + + /* Code quantized peak gain indices */ + diffcod( vq_peaks, pgain_cb_idx, &pgain_difidx[1] ); + for ( i = 0; i < vq_peaks; i++ ) + { + pgain_q[i] = dicn_pg[pgain_cb_idx[i]]; + } + pgain_difidx[0] = pgain_cb_idx[0]; + + /* Scale up peak gains and accumulate peak energy */ + manE_peak = 0; + expE_peak = 32; + for ( i = 0; i < vq_peaks; i++ ) + { + pgain_q[i] *= 4.0f; + manPkEnrg = manPkEnrg_tbl[pgain_cb_idx[i]]; + expPkEnrg = expPkEnrg_tbl[pgain_cb_idx[i]]; + floating_point_add( &manE_peak, &expE_peak, manPkEnrg, expPkEnrg ); + } + + /* Huffman coding */ + hcode_l = 0; + for ( i = 1; i < vq_peaks; i++ ) + { + hcode_l += pgain_huffsizn[pgain_difidx[i]]; + } + + FlagN = HUFCODE; + + if ( hcode_l >= GAINI_BITS * ( vq_peaks - 1 ) ) + { + hcode_l = GAINI_BITS * ( vq_peaks - 1 ); + FlagN = NOHUFCODE; + } + + push_indice( hBstr, IND_FLAGN, FlagN, 1 ); + push_indice( hBstr, IND_PG_IDX, pgain_difidx[0], GAIN0_BITS ); + + if ( FlagN ) + { + for ( i = 1; i < vq_peaks; i++ ) + { + j = pgain_difidx[i]; + m = pgain_huffnorm[j]; + r = pgain_huffsizn[j]; + + push_indice( hBstr, IND_PG_IDX, m, r ); + } + } + else + { + for ( i = 1; i < vq_peaks; i++ ) + { + push_indice( hBstr, IND_PG_IDX, pgain_difidx[i], GAINI_BITS ); + } + } + + /* Number of bits used for peak gain quantization */ + bits += FLAGN_BITS + GAIN0_BITS + hcode_l; + + /* Add sign for peak shape normalization */ + for ( i = 0; i < vq_peaks; i++ ) + { + peak_gains[i] = pos_vec[vq_peak_idx[i]] * pgain_q[i]; + } + + /* Quantize peak shapes */ + for ( i = 0; i < vq_peaks - 1; i++ ) + { + num_overlap_bins = 5 - ( vq_peak_idx[i + 1] - vq_peak_idx[i] ); + quant_peaks( hBstr, &coefs[vq_peak_idx[i] - 2], &coefs_out[vq_peak_idx[i] - 2], &peak_gains[i], &vq_cb_idx, num_overlap_bins, core_brate, vq_peaks ); + push_indice( hBstr, IND_HVQ_PEAKS, vq_cb_idx, 8 ); + bits += 9; + } + + quant_peaks( hBstr, &coefs[vq_peak_idx[i] - 2], &coefs_out[vq_peak_idx[i] - 2], &peak_gains[i], &vq_cb_idx, 0, core_brate, vq_peaks ); + push_indice( hBstr, IND_HVQ_PEAKS, vq_cb_idx, 8 ); + bits += 9; + + pos_bits = hvq_code_pos( hBstr, pos_vec, bin_th, vq_peaks ); + + bits += pos_bits; + bit_budget = num_bits - bits; + + /* Calculate number of PVQ bands to code and assign bits */ + pvq_bands = hvq_pvq_bitalloc( bit_budget, core_brate, bwidth, ynrm, manE_peak, expE_peak, Rk, R, sel_bnds, &n_sel_bnds ); + + /* Get band limits for concatenated PVQ target */ + hvq_concat_bands( pvq_bands, sel_bnds, n_sel_bnds, hvq_band_start, hvq_band_width, hvq_band_end ); + + /* Quantize PVQ bands */ + i = 0; + n = 0; + s = 0; + for ( k = 0; k < pvq_bands; k++ ) + { + if ( k >= pvq_bands - n_sel_bnds ) + { + i = band_start_harm[sel_bnds[s]]; + s++; + } + k_sort[k] = k; + j = 0; + pPvqVectorBandStart = &pvq_vector[n]; + while ( j < hvq_band_width[k] ) + { + if ( coefs_out[i] == 0 ) + { + pvq_vector[n] = coefs[i]; + j++; + n++; + } + i++; + } + logqnorm( pPvqVectorBandStart, &pvq_norm[k], 40, hvq_band_width[k], &thren_HQ[0] ); + } + + normalizecoefs( pvq_vector, pvq_norm, pvq_bands, hvq_band_start, hvq_band_end ); + + bit_budget -= HVQ_PVQ_GAIN_BITS * pvq_bands; + for ( k = 0; k < pvq_bands; k++ ) + { + Rk_f[k] = Rk[k] * 8; + } + + pvq_bits = bit_budget; + set_s( npulses, 0, MAX_PVQ_BANDS ); + + pvq_encode_frame( hBstr, pvq_vector, coefs_pvq, gopt, npulses, pvq_inp_vector, hvq_band_start, hvq_band_end, hvq_band_width, pvq_bands, Rk_f, pvq_bits, HQ_CORE ); + + for ( i = 0; i < pvq_bands; i++ ) + { + k_sort[i] = i; + } + + + fine_gain_pred( hvq_band_start, hvq_band_end, hvq_band_width, k_sort, npulses, NULL, NULL, pvq_bands, coefs_pvq, pvq_inp_vector, fg_pred, HQ_CORE ); + + i = 0; + n = 0; + s = 0; + for ( k = 0; k < pvq_bands; k++ ) + { + normq = dicn[pvq_norm[k]] * ( gopt[k] / fg_pred[k] ); + + logqnorm( &normq, &pvq_norm[k], 40, 1, &thren_HQ[0] ); + pvq_norm[k] -= 8; + if ( pvq_norm[k] < 0 ) + { + pvq_norm[k] = 0; + } + + push_indice( hBstr, IND_HVQ_PVQ_GAIN, pvq_norm[k], HVQ_PVQ_GAIN_BITS ); + pvq_bits += HVQ_PVQ_GAIN_BITS; + + pvq_norm[k] += 8; + j = 0; + if ( k >= pvq_bands - n_sel_bnds ) + { + i = band_start_harm[sel_bnds[s++]]; + } + while ( j < hvq_band_width[k] ) + { + normq = dicn[pvq_norm[k]]; + if ( coefs_out[i] == 0 ) + { + coefs_out[i] = coefs_pvq[n] * fg_pred[k]; + coefs_out[i] = coefs_out[i] * normq; + j++; + n++; + } + i++; + } + } + + bits += pvq_bits; + + /* Noise fill unquantized coeffs with one gain per group */ + for ( i = 0; i < HVQ_NF_GROUPS; i++ ) + { + for ( j = i * ( bin_th / HVQ_NF_GROUPS ); j < ( i + 1 ) * ( bin_th / HVQ_NF_GROUPS ); j++ ) + { + if ( coefs_out[j] == 0 ) + { + coefs_out[j] = ( (float) own_random( &nf_seed ) / MAX16B ) * nf_gains[i]; + } + } + } + + return bits; +} + +/*-------------------------------------------------------------------------- + * quant_peaks() + * + * Applies VQ on input vector + *--------------------------------------------------------------------------*/ + +static void quant_peaks( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const float *vect_in, /* i : Target vector */ + float *vect_out, /* i/o: Quantized vector */ + const float *peak_gain, /* i : Peak gain vector */ + int16_t *vq_idx, /* o : Codebook index */ + const int16_t overlap, /* i : Overlap indicator */ + const int32_t core_brate, /* i : Core bitrate */ + const int16_t Npeaks /* i : Number of peaks */ +) +{ + float x[4]; + float xq[4]; + int16_t weights[4]; + int16_t i, idx, cb_class, search_overlap; + + set_s( weights, 1, 4 ); + + x[0] = vect_in[0] / ( *peak_gain ); + x[1] = vect_in[1] / ( *peak_gain ); + x[2] = vect_in[3] / ( *peak_gain ); + x[3] = vect_in[4] / ( *peak_gain ); + + if ( vect_out[0] != 0 ) + { + if ( fabs( peak_gain[-1] ) > fabs( *peak_gain ) ) + { + weights[0] = 0; + + if ( vect_out[1] != 0 ) + { + weights[1] = 0; + } + } + } + + if ( overlap > 0 ) + { + if ( fabs( peak_gain[1] ) > fabs( *peak_gain ) ) + { + for ( i = 3; i > 3 - overlap; i-- ) + { + weights[i] = 0; + } + } + } + + + /* Classify */ + cb_class = (int16_t) w_vquant( x, 0, weights, 0, hvq_class_c, HVQ_VQ_DIM - 1, HVQ_NUM_CLASS, 0 ); + + if ( core_brate < HQ_BWE_CROSSOVER_BRATE ) + { + idx = max( 0, HVQ_MAX_PEAKS_24k - Npeaks ); + search_overlap = hvq_cb_search_overlap24k[idx]; + } + else + { + idx = max( 0, HVQ_MAX_PEAKS_32k - Npeaks ); + search_overlap = hvq_cb_search_overlap32k[idx]; + } + + /* Quantize */ + if ( cb_class == 0 ) + { + *vq_idx = (int16_t) w_vquant( x, 0, weights, xq, hvq_peak_cb, 4, HVQ_CB_SIZE / 2 + search_overlap, 0 ); + push_indice( hBstr, IND_HVQ_PEAKS, 0, 1 ); + } + else if ( cb_class == 1 ) + { + *vq_idx = (int16_t) w_vquant( x, 0, weights, xq, &hvq_peak_cb[HVQ_CB_SIZE * 2 - search_overlap * 4], 4, HVQ_CB_SIZE / 2 + search_overlap, 0 ); + *vq_idx += HVQ_CB_SIZE / 2 - search_overlap; + push_indice( hBstr, IND_HVQ_PEAKS, 0, 1 ); + } + else if ( cb_class == 2 ) + { + *vq_idx = (int16_t) w_vquant( x, 0, weights, xq, &hvq_peak_cb[HVQ_CB_SIZE * 2 - search_overlap * 4], 4, HVQ_CB_SIZE / 2 + search_overlap, 1 ); + *vq_idx += HVQ_CB_SIZE / 2 - search_overlap; + push_indice( hBstr, IND_HVQ_PEAKS, 1, 1 ); + } + else + { + *vq_idx = (int16_t) w_vquant( x, 0, weights, xq, hvq_peak_cb, 4, HVQ_CB_SIZE / 2 + search_overlap, 1 ); + push_indice( hBstr, IND_HVQ_PEAKS, 1, 1 ); + } + + vect_out[0] = weights[0] * ( xq[0] * ( *peak_gain ) ) + ( weights[0] ^ 1 ) * vect_out[0]; + vect_out[1] = weights[1] * ( xq[1] * ( *peak_gain ) ) + ( weights[1] ^ 1 ) * vect_out[1]; + vect_out[2] = *peak_gain; + vect_out[3] = weights[2] * ( xq[2] * ( *peak_gain ) ) + ( weights[2] ^ 1 ) * vect_out[3]; + vect_out[4] = weights[3] * ( xq[3] * ( *peak_gain ) ) + ( weights[3] ^ 1 ) * vect_out[4]; + + return; +} + +/*-------------------------------------------------------------------------- + * code_pos() + * + * Code pulse positions + *--------------------------------------------------------------------------*/ + +/*! r: number of consumed bits */ +static int16_t sparse_code_pos( + const int16_t *inp, /* i : positions to encode */ + const int16_t length, /* i : number of positions */ + int16_t *result /* o : sparse encoding */ +) +{ + int16_t layer2[HVQ_CP_L2_MAX]; + int16_t layer_length; + int16_t i, j; + int16_t val, idx; + int16_t bits = 0; + int16_t mask; + + set_s( layer2, 0, HVQ_CP_L2_MAX ); + + layer_length = (int16_t) ( (float) length / HVQ_CP_L1_LEN + 0.5 ); + + for ( j = 0; j < layer_length; j++ ) + { + for ( i = j * HVQ_CP_L1_LEN; i < min( ( j + 1 ) * HVQ_CP_L1_LEN, length ); i++ ) + { + if ( inp[i] ) + { + layer2[j] = 1; + break; + } + } + } + + for ( i = 0; i < layer_length; i++ ) + { + result[i] = layer2[i]; + } + bits += layer_length; + + for ( j = 0; j < layer_length; j++ ) + { + if ( layer2[j] ) + { + val = 0; + for ( i = j * HVQ_CP_L1_LEN; i < min( ( j + 1 ) * HVQ_CP_L1_LEN, length ); i++ ) + { + val <<= 1; + val |= inp[i]; + } + + for ( idx = 0; idx < HVQ_CP_MAP_LEN; idx++ ) + { + if ( hvq_cp_layer1_map5[idx] == val ) + { + break; + } + } + + mask = 1 << ( HVQ_CP_MAP_IDX_LEN - 1 ); + for ( i = 0; i < HVQ_CP_MAP_IDX_LEN; i++ ) + { + result[bits++] = ( idx & mask ) >> ( HVQ_CP_MAP_IDX_LEN - 1 - i ); + mask >>= 1; + } + } + } + + return bits; +} + +/*-------------------------------------------------------------------------- + * hvq_code_pos() + * + * Code pulse positions + *--------------------------------------------------------------------------*/ + +static int16_t hvq_code_pos( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const int16_t *const inp, /* i : positions to encode */ + const int16_t length, /* i : number of positions */ + const int16_t num_peaks /* i : number of peaks */ +) +{ + int16_t sparse_result[4 * HVQ_THRES_BIN_32k / HVQ_CP_L1_LEN]; + int16_t delta[HVQ_MAX_PEAKS]; + int16_t peak_idx[HVQ_MAX_PEAKS]; + int16_t inp_abs[HVQ_THRES_BIN_32k]; + int16_t inp_sign[HVQ_MAX_PEAKS]; + int16_t i, j; + int16_t bits; + int16_t delta_max; + int16_t delta_bits, sparse_bits; + + bits = 0; + + /* Extract sorted peak index vector and sign vector */ + for ( i = 0, j = 0; i < length; i++ ) + { + inp_abs[i] = (int16_t) abs( inp[i] ); + if ( inp[i] ) + { + peak_idx[j] = i; + inp_sign[j++] = inp[i]; + } + } + + /* Calculate delta */ + delta[0] = peak_idx[0] + HVQ_CP_HUFF_OFFSET; + delta_max = delta[0]; + for ( i = 1; i < num_peaks; i++ ) + { + delta[i] = peak_idx[i] - peak_idx[i - 1] - HVQ_CP_HUFF_OFFSET; + if ( delta_max < delta[i] ) + { + delta_max = delta[i]; + } + } + + /* Calculate bits needed for huffman coding of deltas */ + delta_bits = -1; + if ( delta_max <= HVQ_CP_HUFF_MAX ) + { + delta_bits = 0; + for ( i = 0; i < num_peaks; i++ ) + { + delta_bits += hvq_cp_huff_len[delta[i]]; + } + } + + /* Calculate bits neeed for sparse coding */ + sparse_bits = sparse_code_pos( inp_abs, length, sparse_result ); + + /* Decide which coding mode to use */ + if ( delta_bits > sparse_bits || delta_bits < 0 ) + { + push_indice( hBstr, IND_POS_IDX, HVQ_CP_SPARSE, 1 ); + + for ( i = 0; i < sparse_bits; i++ ) + { + push_indice( hBstr, IND_POS_IDX, sparse_result[i], 1 ); + } + bits += sparse_bits + 1; + } + else + { + push_indice( hBstr, IND_POS_IDX, HVQ_CP_DELTA, 1 ); + + for ( i = 0; i < num_peaks; i++ ) + { + j = delta[i]; + push_indice( hBstr, IND_POS_IDX, hvq_cp_huff_val[j], hvq_cp_huff_len[j] ); + } + bits += delta_bits + 1; + } + + /* Send sign */ + for ( i = 0; i < num_peaks; i++ ) + { + push_indice( hBstr, IND_POS_IDX, ( inp_sign[i] < 0 ? 0 : 1 ), 1 ); + } + bits += num_peaks; + + return bits; +} diff --git a/lib_enc/pit_enc.c b/lib_enc/pit_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..d8d51e2a1b7a977b89fc5cc2ea6e488482e8db62 --- /dev/null +++ b/lib_enc/pit_enc.c @@ -0,0 +1,1386 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "rom_enc.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*------------------------------------------------------------------* + * pit_encode() + * + * Close-loop pitch lag search and pitch lag quantization + * Adaptive excitation construction + *------------------------------------------------------------------*/ + +/*! r: Fractional pitch for each subframe */ +float pit_encode( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const int16_t pitch_bits[], /* i : pitch bits */ + const int32_t core_brate, /* i : core bitrate */ + const int16_t Opt_AMR_WB, /* i : flag indicating AMR-WB IO mode */ + const int16_t L_frame, /* i : length of the frame */ + const int16_t coder_type, /* i : coding type */ + int16_t *limit_flag, /* i/o: restrained(0) or extended(1) Q limits */ + const int16_t i_subfr, /* i : subframe index */ + float *exc, /* i/o: pointer to excitation signal frame */ + const int16_t L_subfr, /* i : subframe length */ + const int16_t *pitch, /* i : open loop pitch estimates in current frame */ + int16_t *T0_min, /* i/o: lower limit for close-loop search */ + int16_t *T0_max, /* i/o: higher limit for close-loop search */ + int16_t *T0, /* i/o: close loop integer pitch */ + int16_t *T0_frac, /* i/o: close loop fractional part of the pitch */ + const float *h1, /* i : weighted filter input response */ + const float *xn, /* i : target vector */ + const int16_t tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag */ + const float tdm_Pri_pitch_buf[] /* i : primary channel pitch buffer */ +) +{ + float pitch_cl; + int16_t pit_flag, delta, mult_Top, nBits; + int16_t T_op[2]; /* values for two half-frames */ + + /*----------------------------------------------------------------* + * convert pitch values to 16kHz domain + *----------------------------------------------------------------*/ + + if ( L_frame == L_FRAME || ( tdm_Pri_pitch_buf != NULL && tdm_Pri_pitch_buf[0] < 0 ) ) + { + mvs2s( pitch, T_op, 2 ); + } + else /* L_frame == L_FRAME16k */ + { + T_op[0] = (int16_t) ( pitch[0] * 1.25f + 0.5f ); + T_op[1] = (int16_t) ( pitch[1] * 1.25f + 0.5f ); + } + + /*----------------------------------------------------------------* + * Initializations + *----------------------------------------------------------------*/ + + /* Set pit_flag to 0 for every subframe with absolute pitch search */ + pit_flag = i_subfr; + if ( i_subfr == 2 * L_SUBFR ) + { + pit_flag = 0; + } + + /*-----------------------------------------------------------------* + * Limit range of pitch search + * Fractional pitch search + * Pitch quantization + *-----------------------------------------------------------------*/ + + mult_Top = 1; + + if ( !Opt_AMR_WB ) + { + /*----------------------------------------------------------------* + * Set limit_flag to 0 for restrained limits, and 1 for extended limits + *----------------------------------------------------------------*/ + + if ( i_subfr == 0 ) + { + *limit_flag = 1; + if ( coder_type == VOICED ) + { + *limit_flag = 2; /* double-extended limits */ + } + + if ( coder_type == GENERIC && core_brate == ACELP_7k20 ) + { + *limit_flag = 0; + } + } + else if ( i_subfr == 2 * L_SUBFR && coder_type == GENERIC && core_brate <= ACELP_13k20 ) + { + if ( *T0 > ( PIT_FR1_EXTEND_8b + PIT_MIN ) >> 1 ) + { + *limit_flag = 0; + } + } + + /* check the minimum pitch value */ + if ( *limit_flag == 0 ) + { + if ( ( i_subfr == 0 && T_op[0] < PIT_MIN ) || ( i_subfr == 2 * L_SUBFR && T_op[1] < PIT_MIN ) ) + { + mult_Top = 2; + } + } + + /*-------------------------------------------------------* + * Retrieve the number of Q bits + *-------------------------------------------------------*/ + + nBits = 0; + if ( coder_type != AUDIO ) + { + nBits = pitch_bits[i_subfr / L_subfr]; + } + + if ( coder_type == AUDIO ) + { + /*-------------------------------------------------------* + * Pitch encoding in AUDIO coder type + * (both ACELP@12k8 and ACELP@16k cores) + *-------------------------------------------------------*/ + + delta = 4; + + if ( L_subfr == L_frame / 2 && i_subfr != 0 ) + { + pit_flag = L_SUBFR; + } + + if ( pit_flag == 0 ) + { + nBits = 10; + } + else + { + nBits = 6; + } + + /* pitch lag search limitation */ + if ( i_subfr == 0 ) + { + limit_T0( L_FRAME, delta, pit_flag, *limit_flag, mult_Top * T_op[0], 0, T0_min, T0_max ); + } + else if ( i_subfr == 2 * L_SUBFR && pit_flag == 0 ) + { + limit_T0( L_FRAME, delta, pit_flag, *limit_flag, mult_Top * T_op[1], 0, T0_min, T0_max ); + } + + /* search and encode the closed loop pitch period */ + *T0 = pitch_fr4( &exc[i_subfr], xn, h1, *T0_min, *T0_max, T0_frac, pit_flag, *limit_flag, PIT_MAX, PIT_MAX, L_FRAME, L_subfr ); + + pit_Q_enc( hBstr, 0, nBits, delta, pit_flag, *limit_flag, *T0, *T0_frac, T0_min, T0_max ); + } + else if ( coder_type == VOICED ) + { + /*-------------------------------------------------------* + * Pitch encoding in VOICED coder type (ACELP@12k8 core only) + *-------------------------------------------------------*/ + + delta = 4; + + if ( i_subfr == 2 * L_SUBFR ) + { + pit_flag = i_subfr; + } + + /* pitch lag search limitation */ + if ( i_subfr == 0 ) + { + limit_T0( L_FRAME, delta, pit_flag, *limit_flag, mult_Top * T_op[0], 0, T0_min, T0_max ); + } + + /* search and encode the closed loop pitch period */ + if ( nBits == 9 || nBits == 5 ) + { + *T0 = pitch_fr4( &exc[i_subfr], xn, h1, *T0_min, *T0_max, T0_frac, pit_flag, *limit_flag, PIT_FR2_DOUBLEEXTEND_9b, PIT_FR1_DOUBLEEXTEND_9b, L_FRAME, L_SUBFR ); + } + else if ( nBits == 10 ) + { + *T0 = pitch_fr4( &exc[i_subfr], xn, h1, *T0_min, *T0_max, T0_frac, pit_flag, *limit_flag, PIT_MAX, PIT_MAX, L_FRAME, L_SUBFR ); + } + + pit_Q_enc( hBstr, 0, nBits, delta, pit_flag, *limit_flag, *T0, *T0_frac, T0_min, T0_max ); + } + else if ( tdm_Pitch_reuse_flag == 1 || nBits == 4 ) + { + /*-------------------------------------------------------* + * Pitch encoding with reusing primary channel information + *-------------------------------------------------------*/ + int16_t loc_T0, loc_frac; + + delta = 4; + + pit_flag = L_SUBFR; + + if ( L_subfr == 2 * L_SUBFR ) + { + loc_T0 = (int16_t) ( 0.5f * tdm_Pri_pitch_buf[i_subfr / L_SUBFR] + 0.5f * tdm_Pri_pitch_buf[( i_subfr + L_SUBFR ) / L_SUBFR] ); + loc_frac = (int16_t) ( ( ( 0.5f * tdm_Pri_pitch_buf[i_subfr / L_SUBFR] + 0.5f * tdm_Pri_pitch_buf[( i_subfr + L_SUBFR ) / L_SUBFR] ) - loc_T0 ) * 4.0f ); + } + else + { + loc_T0 = (int16_t) tdm_Pri_pitch_buf[i_subfr / L_SUBFR]; + loc_frac = (int16_t) ( ( tdm_Pri_pitch_buf[i_subfr / L_SUBFR] - loc_T0 ) * 4.0f ); + } + + /* pitch lag search limitation */ + limit_T0( L_FRAME, delta, pit_flag, *limit_flag, loc_T0, loc_frac, T0_min, T0_max ); + if ( nBits > 0 ) + { + /* search and encode the closed loop pitch period */ + *T0 = pitch_fr4( &exc[i_subfr], xn, h1, *T0_min, *T0_max, T0_frac, pit_flag, *limit_flag, PIT_MIN, PIT_FR1_8b, L_FRAME, L_SUBFR ); + if ( delta == 8 ) + { + *T0_frac = 0; + } + pit_Q_enc( hBstr, 0, nBits, delta, pit_flag, *limit_flag, *T0, *T0_frac, T0_min, T0_max ); + } + else + { + *T0 = loc_T0; + *T0_frac = loc_frac; + } + } + else + { + /*-------------------------------------------------------* + * Pitch encoding in GENERIC coder type + * (both ACELP@12k8 and ACELP@16k cores) + *-------------------------------------------------------*/ + + delta = 8; + + /* pitch lag search limitation */ + if ( i_subfr == 0 ) + { + limit_T0( L_frame, delta, pit_flag, *limit_flag, mult_Top * T_op[0], 0, T0_min, T0_max ); + } + else if ( i_subfr == 2 * L_SUBFR ) + { + limit_T0( L_frame, delta, pit_flag, *limit_flag, mult_Top * T_op[1], 0, T0_min, T0_max ); + } + + /* search and encode the closed loop pitch period */ + if ( L_frame == L_FRAME ) + { + if ( nBits == 8 || nBits == 5 ) + { + if ( *limit_flag == 0 ) + { + *T0 = pitch_fr4( &exc[i_subfr], xn, h1, *T0_min, *T0_max, T0_frac, pit_flag, *limit_flag, PIT_MIN, PIT_FR1_8b, L_FRAME, L_SUBFR ); + } + else + { + *T0 = pitch_fr4( &exc[i_subfr], xn, h1, *T0_min, *T0_max, T0_frac, pit_flag, *limit_flag, PIT_MIN_EXTEND, PIT_FR1_EXTEND_8b, L_FRAME, L_SUBFR ); + } + } + else if ( nBits == 9 || nBits == 6 ) + { + if ( *limit_flag == 0 ) + { + *T0 = pitch_fr4( &exc[i_subfr], xn, h1, *T0_min, *T0_max, T0_frac, pit_flag, *limit_flag, PIT_FR2_9b, PIT_FR1_9b, L_FRAME, L_SUBFR ); + } + else + { + *T0 = pitch_fr4( &exc[i_subfr], xn, h1, *T0_min, *T0_max, T0_frac, pit_flag, *limit_flag, PIT_FR2_EXTEND_9b, PIT_FR1_EXTEND_9b, L_FRAME, L_SUBFR ); + } + } + else if ( nBits == 10 ) + { + *T0 = pitch_fr4( &exc[i_subfr], xn, h1, *T0_min, *T0_max, T0_frac, pit_flag, *limit_flag, PIT_MAX, PIT_MAX, L_FRAME, L_SUBFR ); + } + + pit_Q_enc( hBstr, 0, nBits, delta, pit_flag, *limit_flag, *T0, *T0_frac, T0_min, T0_max ); + } + else /* L_frame == L_FRAME16k */ + { + if ( nBits == 9 || nBits == 6 ) + { + *T0 = pitch_fr4( &exc[i_subfr], xn, h1, *T0_min, *T0_max, T0_frac, pit_flag, *limit_flag, PIT16k_FR2_EXTEND_9b, PIT16k_FR1_EXTEND_9b, L_FRAME16k, L_SUBFR ); + } + else if ( nBits == 10 ) + { + *T0 = pitch_fr4( &exc[i_subfr], xn, h1, *T0_min, *T0_max, T0_frac, pit_flag, *limit_flag, PIT16k_FR2_EXTEND_10b, PIT16k_MAX, L_FRAME16k, L_SUBFR ); + } + + pit16k_Q_enc( hBstr, nBits, *limit_flag, *T0, *T0_frac, T0_min, T0_max ); + } + } + } + + /*-------------------------------------------------------* + * Pitch encoding in AMR-WB IO mode + *-------------------------------------------------------*/ + + else + { + delta = 8; + *limit_flag = 0; + + if ( core_brate == ACELP_6k60 ) + { + nBits = 5; + + /* pitch lag search limitation */ + if ( i_subfr == 0 ) + { + limit_T0( L_FRAME, delta, pit_flag, *limit_flag, mult_Top * T_op[0], 0, T0_min, T0_max ); + nBits = 8; + } + + if ( i_subfr == 2 * L_SUBFR ) + { + /* rewrite pit_flag - it must not be zero */ + pit_flag = i_subfr; + } + + /* search and encode the closed loop pitch period */ + *T0 = pitch_fr4( &exc[i_subfr], xn, h1, *T0_min, *T0_max, T0_frac, pit_flag, *limit_flag, PIT_MIN, PIT_FR1_8b, L_FRAME, L_SUBFR ); + } + else if ( core_brate == ACELP_8k85 ) + { + nBits = 5; + + /* pitch lag search limitation */ + if ( i_subfr == 0 ) + { + limit_T0( L_FRAME, delta, pit_flag, *limit_flag, mult_Top * T_op[0], 0, T0_min, T0_max ); + nBits = 8; + } + else if ( i_subfr == 2 * L_SUBFR ) + { + limit_T0( L_FRAME, delta, pit_flag, *limit_flag, mult_Top * T_op[1], 0, T0_min, T0_max ); + nBits = 8; + } + + /* search and encode the closed loop pitch period */ + *T0 = pitch_fr4( &exc[i_subfr], xn, h1, *T0_min, *T0_max, T0_frac, pit_flag, *limit_flag, PIT_MIN, PIT_FR1_8b, L_FRAME, L_SUBFR ); + } + else + { + nBits = 6; + + /* pitch lag search limitation */ + if ( i_subfr == 0 ) + { + limit_T0( L_FRAME, delta, pit_flag, *limit_flag, mult_Top * T_op[0], 0, T0_min, T0_max ); + nBits = 9; + } + else if ( i_subfr == 2 * L_SUBFR ) + { + limit_T0( L_FRAME, delta, pit_flag, *limit_flag, mult_Top * T_op[1], 0, T0_min, T0_max ); + nBits = 9; + } + else + { + limit_T0( L_FRAME, delta, pit_flag, 0, *T0, 0, T0_min, T0_max ); /* T0_frac==0 to keep IO with AMR-WB */ + } + + /* search and encode the closed loop pitch period */ + *T0 = pitch_fr4( &exc[i_subfr], xn, h1, *T0_min, *T0_max, T0_frac, pit_flag, *limit_flag, PIT_FR2_9b, PIT_FR1_9b, L_FRAME, L_SUBFR ); + } + + pit_Q_enc( hBstr, 1, nBits, delta, pit_flag, *limit_flag, *T0, *T0_frac, T0_min, T0_max ); + } + + /*-------------------------------------------------------* + * Compute floating pitch output + *-------------------------------------------------------*/ + + pitch_cl = (float) ( *T0 ) + (float) ( *T0_frac ) / 4.0f; /* save subframe pitch values */ + + return pitch_cl; +} + +/*-------------------------------------------------------------------* + * pitch_fr4() + * + * Find the closed loop pitch period with 1/4 subsample resolution. + *-------------------------------------------------------------------*/ + +/*! r: chosen integer pitch lag */ +int16_t pitch_fr4( + const float exc[], /* i : excitation buffer */ + const float xn[], /* i : target signal */ + const float h[], /* i : weighted synthesis filter impulse response */ + const int16_t t0_min, /* i : minimum value in the searched range. */ + const int16_t t0_max, /* i : maximum value in the searched range. */ + int16_t *pit_frac, /* o : chosen fraction (0, 1, 2 or 3) */ + const int16_t i_subfr, /* i : flag to first subframe */ + const int16_t limit_flag, /* i : flag for limits (0=restrained, 1=extended) */ + const int16_t t0_fr2, /* i : minimum value for resolution 1/2 */ + const int16_t t0_fr1, /* i : minimum value for resolution 1 */ + const int16_t L_frame, /* i : length of the frame */ + const int16_t L_subfr /* i : size of subframe */ +) +{ + int16_t i, fraction, step; + int16_t t0, t1, t_min, t_max, pit_min; + float cor_max, max_val, temp; + float *corr, corr_v[15 + 2 * L_INTERPOL1 + 1]; + + /* initialization */ + if ( limit_flag == 0 ) + { + if ( L_frame == L_FRAME ) + { + pit_min = PIT_MIN; + } + else /* L_frame == L_FRAME16k */ + { + pit_min = PIT16k_MIN; + } + } + else + { + if ( L_frame == L_FRAME ) + { + pit_min = PIT_MIN_EXTEND; + if ( limit_flag == 2 ) + { + pit_min = PIT_MIN_DOUBLEEXTEND; + } + } + else /* L_frame == L_FRAME16k */ + { + pit_min = PIT16k_MIN_EXTEND; + } + } + + + /*-----------------------------------------------------------------* + * - Find interval to compute normalized correlation + * - allocate memory to normalized correlation vector + * - Compute normalized correlation between target and filtered + * excitation + *-----------------------------------------------------------------*/ + + t_min = t0_min - L_INTERPOL1; + t_max = t0_max + L_INTERPOL1; + corr = &corr_v[0] - t_min; /* corr[t_min..t_max] */ + + norm_corr( exc, xn, h, t_min, t_max, corr, L_subfr ); + + /*-----------------------------------------------------------------* + * Find integer pitch + *-----------------------------------------------------------------*/ + + max_val = corr[t0_min]; + t0 = t0_min; + + for ( i = t0_min + 1; i <= t0_max; i++ ) + { + if ( corr[i] >= max_val ) + { + max_val = corr[i]; + t0 = i; + } + } + + if ( t0_fr1 == pit_min ) + { + /* don't search fraction (for 7b/4b quant) */ + if ( ( i_subfr == 0 ) && ( t0 >= t0_fr2 ) ) + { + i = ( t0 >> 1 ) * 2; /* 2 samples resolution */ + if ( ( i + 2 ) > PIT_MAX ) + { + i -= 2; + } + if ( corr[i] > corr[i + 2] ) + { + t0 = i; + } + else + { + t0 = i + 2; + } + } + + *pit_frac = 0; + + return ( t0 ); + } + if ( ( i_subfr == 0 ) && ( t0 >= t0_fr1 ) ) + { + *pit_frac = 0; + + return ( t0 ); + } + + /*------------------------------------------------------------------* + * Search fractionnal pitch with 1/4 subsample resolution. + * search the fractions around t0 and choose the one which maximizes + * the interpolated normalized correlation. + *-----------------------------------------------------------------*/ + + t1 = t0; + step = 1; /* 1/4 subsample resolution */ + fraction = 1; + if ( ( ( i_subfr == 0 ) && ( t0 >= t0_fr2 ) ) || ( t0_fr2 == pit_min ) ) + { + step = 2; /* 1/2 subsample resolution */ + fraction = 2; + } + + if ( t0 == t0_min ) /* Limit case */ + { + fraction = 0; + cor_max = interpolation( &corr[t0], E_ROM_inter4_1, fraction, PIT_UP_SAMP, 4 ); + } + else /* Process negative fractions */ + { + t0--; + cor_max = interpolation( &corr[t0], E_ROM_inter4_1, fraction, PIT_UP_SAMP, 4 ); + for ( i = ( fraction + step ); i <= 3; i = i + step ) + { + temp = interpolation( &corr[t0], E_ROM_inter4_1, i, PIT_UP_SAMP, 4 ); + if ( temp > cor_max ) + { + cor_max = temp; + fraction = i; + } + } + } + + for ( i = 0; i <= 3; i = i + step ) /* Process positive fractions */ + { + temp = interpolation( &corr[t1], E_ROM_inter4_1, i, PIT_UP_SAMP, 4 ); + if ( temp > cor_max ) + { + cor_max = temp; + fraction = i; + t0 = t1; + } + } + + *pit_frac = fraction; + + return ( t0 ); +} + +/*-------------------------------------------------------------------* + * norm_corr() + * + * Find the normalized correlation between the target vector and the + * filtered past excitation (correlation between target and filtered + * excitation divided by the square root of energy of filtered + * excitation) + *---------------------------------------------------------------------*/ + +void norm_corr( + const float exc[], /* i : excitation buffer */ + const float xn[], /* i : target signal */ + const float h[], /* i : weighted synthesis filter impulse response */ + const int16_t t_min, /* i : minimum value of searched range */ + const int16_t t_max, /* i : maximum value of searched range */ + float corr_norm[], /* o : normalized correlation */ + const int16_t L_subfr /* i : subframe size */ +) +{ + int16_t t, j, k; + float excf[L_FRAME16k]; /* filtered past excitation */ /* length up to L_FRAME in GSC */ + float alp, ps, norm; + + k = -t_min; + + /*-----------------------------------------------------------------* + * compute the filtered excitation for the first delay t_min + *-----------------------------------------------------------------*/ + + conv( &exc[k], h, excf, L_subfr ); + + /*-----------------------------------------------------------------* + * loop for every possible period + *-----------------------------------------------------------------*/ + + for ( t = t_min; t <= t_max; t++ ) + { + /* Compute correlation between xn[] and excf[] */ + ps = 0.0f; + for ( j = 0; j < L_subfr; ++j ) + { + ps += xn[j] * excf[j]; + } + + /* Compute 1/sqrt(energie of excf[]) */ + alp = 0.01f; + for ( j = 0; j < L_subfr; ++j ) + { + alp += excf[j] * excf[j]; + } + norm = inv_sqrt( alp ); + + /* Normalize correlation = correlation * (1/sqrt(energie)) */ + corr_norm[t] = ps * norm; + + /* update the filtered excitation excf[] for the next iteration */ + if ( t != t_max ) + { + k--; + for ( j = L_subfr - 1; j > 0; j-- ) + { + excf[j] = excf[j - 1] + exc[k] * h[j]; + } + excf[0] = exc[k]; + } + } + return; +} + +/*-------------------------------------------------------------------* + * abs_pit_enc() + * + * Encode pitch lag absolutely with resolution for shortest pitches + * depending on parameter 'fr_step': + * fr_step = 2: pitch range encoded with 8 bits + * fr_step = 4: pitch range encoded with 9 bits + *-------------------------------------------------------------------*/ + +/*! r: pitch index */ +int16_t abs_pit_enc( + const int16_t fr_steps, /* i : fractional resolution step */ + const int16_t limit_flag, /* i : restrained(0) or extended(1) limits */ + const int16_t T0, /* i : integer pitch lag */ + const int16_t T0_frac /* i : pitch fraction */ +) +{ + int16_t pitch_index; + + if ( limit_flag == 0 ) + { + if ( fr_steps == 2 ) + { + /*-----------------------------------------------------------------* + * The pitch range is encoded absolutely with 8 bits + * and is divided as follows: + * PIT_MIN to PIT_FR1_8b-1 resolution 1/2 (frac = 0 or 2) + * PIT_FR1_8b to PIT_MAX resolution 1 (frac = 0) + *-----------------------------------------------------------------*/ + if ( T0 < PIT_FR1_8b ) + { + pitch_index = T0 * 2 + ( T0_frac >> 1 ) - ( PIT_MIN * 2 ); + } + else + { + pitch_index = T0 - PIT_FR1_8b + ( ( PIT_FR1_8b - PIT_MIN ) * 2 ); + } + } + else if ( fr_steps == 4 ) + { + /*-------------------------------------------------------------------* + * The pitch range is encoded absolutely with 9 bits + * and is divided as follows: + * PIT_MIN to PIT_FR2_9b-1 resolution 1/4 (frac = 0,1,2 or 3) + * PIT_FR2_9b to PIT_FR1_9b-1 resolution 1/2 (frac = 0 or 2) + * PIT_FR1_9b to PIT_MAX resolution 1 (frac = 0) + *-------------------------------------------------------------------*/ + if ( T0 < PIT_FR2_9b ) + { + pitch_index = T0 * 4 + T0_frac - ( PIT_MIN * 4 ); + } + else if ( T0 < PIT_FR1_9b ) + { + pitch_index = T0 * 2 + ( T0_frac >> 1 ) - ( PIT_FR2_9b * 2 ) + ( ( PIT_FR2_9b - PIT_MIN ) * 4 ); + } + else + { + pitch_index = T0 - PIT_FR1_9b + ( ( PIT_FR2_9b - PIT_MIN ) * 4 ) + ( ( PIT_FR1_9b - PIT_FR2_9b ) * 2 ); + } + } + else /* fr_step == 0 */ + { + /* not used in the codec */ + pitch_index = 0; + } + } + else if ( limit_flag == 1 ) /* extended Q range */ + { + if ( fr_steps == 2 ) + { + /*-----------------------------------------------------------------* + * The pitch range is encoded absolutely with 8 bits + * and is divided as follows: + * PIT_MIN_EXTEND to PIT_FR1_EXTEND_8b-1 resolution 1/2 (frac = 0 or 2) + * PIT_FR1_EXTEND_8b to PIT_MAX resolution 1 (frac = 0) + *-----------------------------------------------------------------*/ + + if ( T0 < PIT_FR1_EXTEND_8b ) + { + pitch_index = T0 * 2 + ( T0_frac >> 1 ) - ( PIT_MIN_EXTEND * 2 ); + } + else + { + pitch_index = T0 - PIT_FR1_EXTEND_8b + ( ( PIT_FR1_EXTEND_8b - PIT_MIN_EXTEND ) * 2 ); + } + } + else if ( fr_steps == 4 ) + { + /*-------------------------------------------------------------------* + * The pitch range is encoded absolutely with 9 bits + * and is divided as follows: + * PIT_MIN_EXTEND to PIT_FR2__EXTEND9b-1 resolution 1/4 (frac = 0,1,2 or 3) + * PIT_FR2_EXTEND_9b to PIT_FR1__EXTEND9b-1 resolution 1/2 (frac = 0 or 2) + * PIT_FR1_EXTEND_9b to PIT_MAX resolution 1 (frac = 0) + *-------------------------------------------------------------------*/ + + if ( T0 < PIT_FR2_EXTEND_9b ) + { + pitch_index = T0 * 4 + T0_frac - ( PIT_MIN_EXTEND * 4 ); + } + else if ( T0 < PIT_FR1_EXTEND_9b ) + { + pitch_index = T0 * 2 + ( T0_frac >> 1 ) - ( PIT_FR2_EXTEND_9b * 2 ) + ( ( PIT_FR2_EXTEND_9b - PIT_MIN_EXTEND ) * 4 ); + } + else + { + pitch_index = T0 - PIT_FR1_EXTEND_9b + ( ( PIT_FR2_EXTEND_9b - PIT_MIN_EXTEND ) * 4 ) + ( ( PIT_FR1_EXTEND_9b - PIT_FR2_EXTEND_9b ) * 2 ); + } + } + else /* fr_step == 0 */ + { + /* not used in the codec */ + pitch_index = 0; + } + } + else /* double-extended Q range */ + { + if ( fr_steps == 2 ) + { + /*-----------------------------------------------------------------* + * The pitch range is encoded absolutely with 8 bits + * and is divided as follows: + * PIT_MIN_DOUBLEEXTEND to PIT_FR1_DOUBLEEXTEND_8b-1 resolution 1/2 (frac = 0 or 2) + * PIT_FR1_DOUBLEEXTEND_8b to PIT_MAX resolution 1 (frac = 0) + *-----------------------------------------------------------------*/ + + if ( T0 < PIT_FR1_DOUBLEEXTEND_8b ) + { + pitch_index = T0 * 2 + ( T0_frac >> 1 ) - ( PIT_MIN_DOUBLEEXTEND * 2 ); + } + else + { + pitch_index = T0 - PIT_FR1_DOUBLEEXTEND_8b + ( ( PIT_FR1_DOUBLEEXTEND_8b - PIT_MIN_DOUBLEEXTEND ) * 2 ); + } + } + else if ( fr_steps == 4 ) + { + /*-------------------------------------------------------------------* + * The pitch range is encoded absolutely with 9 bits + * and is divided as follows: + * PIT_MIN_DOUBLEEXTEND to PIT_FR2_DOUBLEEXTEND9b-1 resolution 1/4 (frac = 0,1,2 or 3) + * PIT_FR2_DOUBLEEXTEND_9b to PIT_FR1_DOOBLEEXTEND9b-1 resolution 1/2 (frac = 0 or 2) + * PIT_FR1_DOUBLEEXTEND_9b to PIT_MAX resolution 1 (frac = 0) + *-------------------------------------------------------------------*/ + + if ( T0 < PIT_FR2_DOUBLEEXTEND_9b ) + { + pitch_index = T0 * 4 + T0_frac - ( PIT_MIN_DOUBLEEXTEND * 4 ); + } + else if ( T0 < PIT_FR1_DOUBLEEXTEND_9b ) + { + pitch_index = T0 * 2 + ( T0_frac >> 1 ) - ( PIT_FR2_DOUBLEEXTEND_9b * 2 ) + ( ( PIT_FR2_DOUBLEEXTEND_9b - PIT_MIN_DOUBLEEXTEND ) * 4 ); + } + else + { + pitch_index = T0 - PIT_FR1_DOUBLEEXTEND_9b + ( ( PIT_FR2_DOUBLEEXTEND_9b - PIT_MIN_DOUBLEEXTEND ) * 4 ) + ( ( PIT_FR1_DOUBLEEXTEND_9b - PIT_FR2_DOUBLEEXTEND_9b ) * 2 ); + } + } + else /* fr_step == 0 */ + { + /* not used in the codec */ + pitch_index = 0; + } + } + + return pitch_index; +} + +/*-------------------------------------------------------------------* + * delta_pit_enc() + * + * Encode pitch lag differentially from T0_min to T0_max + * with resolution depending on parameter 'fr_step': + * fr_step = 0: resolution 1 (frac = 0), or + * fr_step = 2: resolution 1/2 (frac = 0 or 2), or + * fr_step = 4: resolution 1/4 (frac = 0, 1, 2, or 3) + *-------------------------------------------------------------------*/ + +/*! r: pitch index */ +int16_t delta_pit_enc( + const int16_t fr_steps, /* i : fractional resolution step */ + const int16_t T0, /* i : integer pitch lag */ + const int16_t T0_frac, /* i : pitch fraction */ + const int16_t T0_min /* i : delta search min */ +) +{ + int16_t pitch_index; + + if ( fr_steps == 0 ) + { + pitch_index = T0 - T0_min; + } + else if ( fr_steps == 2 ) + { + pitch_index = ( T0 - T0_min ) * 2 + ( T0_frac >> 1 ); + } + else /* fr_steps == 4 */ + { + pitch_index = ( T0 - T0_min ) * 4 + T0_frac; + } + + return pitch_index; +} + +/*-------------------------------------------------------------------* + * pit_Q_enc() + * + * Encode subframe pitch lag + *-------------------------------------------------------------------*/ + +void pit_Q_enc( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const int16_t Opt_AMR_WB, /* i : flag indicating AMR-WB IO mode */ + const int16_t nBits, /* i : # of Q bits */ + const int16_t delta, /* i : Half the CL searched interval */ + const int16_t pit_flag, /* i : absolute(0) or delta(1) pitch Q */ + const int16_t limit_flag, /* i : restrained(0) or extended(1) Q limits */ + const int16_t T0, /* i : integer pitch lag */ + const int16_t T0_frac, /* i : pitch fraction */ + int16_t *T0_min, /* i/o: delta search min */ + int16_t *T0_max /* o : delta search max */ +) +{ + int16_t pitch_index; + + if ( nBits == 10 ) /* absolute encoding with 10 bits */ + { + if ( limit_flag == 0 ) + { + pitch_index = T0 * 4 + T0_frac - ( PIT_MIN * 4 ); + } + else if ( limit_flag == 1 ) + { + pitch_index = T0 * 4 + T0_frac - ( PIT_MIN_EXTEND * 4 ); + } + else /* limit_flag == 2 */ + { + pitch_index = T0 * 4 + T0_frac - ( PIT_MIN_DOUBLEEXTEND * 4 ); + } + } + else if ( nBits == 9 ) /* absolute encoding with 9 bits */ + { + pitch_index = abs_pit_enc( 4, limit_flag, T0, T0_frac ); + + /* find T0_min and T0_max for delta search */ + if ( Opt_AMR_WB ) + { + limit_T0( L_FRAME, delta, pit_flag, 0, T0, 0, T0_min, T0_max ); /* T0_frac==0 to keep IO with AMR-WB */ + } + } + else if ( nBits == 8 ) /* absolute encoding with 8 bits */ + { + pitch_index = abs_pit_enc( 2, limit_flag, T0, T0_frac ); + + /* find T0_min and T0_max for delta search */ + if ( Opt_AMR_WB ) + { + limit_T0( L_FRAME, delta, pit_flag, 0, T0, 0, T0_min, T0_max ); /* T0_frac==0 to keep IO with AMR-WB */ + } + } + else if ( nBits == 6 ) /* relative encoding with 6 bits */ + { + pitch_index = delta_pit_enc( 4, T0, T0_frac, *T0_min ); + } + else if ( nBits == 5 ) /* relative encoding with 5 bits */ + { + if ( delta == 8 ) + { + pitch_index = delta_pit_enc( 2, T0, T0_frac, *T0_min ); + } + else /* delta == 4 */ + { + pitch_index = delta_pit_enc( 4, T0, T0_frac, *T0_min ); + } + } + else /* nBits == 4 ) */ /* relative encoding with 4 bits */ + { + if ( delta == 8 ) + { + pitch_index = delta_pit_enc( 0, T0, T0_frac, *T0_min ); + } + else /* delta == 4 */ + { + pitch_index = delta_pit_enc( 2, T0, T0_frac, *T0_min ); + } + } + + if ( !Opt_AMR_WB ) + { + /* find T0_min and T0_max for delta search */ + limit_T0( L_FRAME, delta, L_SUBFR, limit_flag, T0, T0_frac, T0_min, T0_max ); + } + + push_indice( hBstr, IND_PITCH, pitch_index, nBits ); + + return; +} + +/*-------------------------------------------------------------------* + * pit16k_Q_enc() + * + * Encode subframe pitch lag @16kHz core + *-------------------------------------------------------------------*/ + +void pit16k_Q_enc( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const int16_t nBits, /* i : # of Q bits */ + const int16_t limit_flag, /* i : restrained(0) or extended(1) Q limits */ + const int16_t T0, /* i : integer pitch lag */ + const int16_t T0_frac, /* i : pitch fraction */ + int16_t *T0_min, /* i/o: delta search min */ + int16_t *T0_max /* o : delta search max */ +) +{ + int16_t pitch_index; + + if ( nBits == 10 ) /* absolute encoding with 10 bits */ + { + if ( T0 < PIT16k_FR2_EXTEND_10b ) + { + pitch_index = T0 * 4 + T0_frac - ( PIT16k_MIN_EXTEND * 4 ); + } + else + { + pitch_index = T0 * 2 + ( T0_frac >> 1 ) - ( PIT16k_FR2_EXTEND_10b * 2 ) + ( ( PIT16k_FR2_EXTEND_10b - PIT16k_MIN_EXTEND ) * 4 ); + } + + push_indice( hBstr, IND_PITCH, pitch_index, nBits ); + } + else if ( nBits == 9 ) /* absolute encoding with 9 bits */ + { + { + /*-------------------------------------------------------------------* + * The pitch range is encoded absolutely with 9 bits + * and is divided as follows: + * PIT16k_EXTEND_MIN to PIT16k_FR2_EXTEND_9b-1 resolution 1/4 (frac = 0,1,2 or 3) + * PIT16k_FR2_EXTEND_9b to PIT16k_FR1_EXTEND_9b-1 resolution 1/2 (frac = 0 or 2) + * PIT16k_FR1_EXTEND_9b to PIT16k_MAX resolution 1 (frac = 0) + *-------------------------------------------------------------------*/ + + if ( T0 < PIT16k_FR2_EXTEND_9b ) + { + pitch_index = T0 * 4 + T0_frac - ( PIT16k_MIN_EXTEND * 4 ); + } + else if ( T0 < PIT16k_FR1_EXTEND_9b ) + { + pitch_index = T0 * 2 + ( T0_frac >> 1 ) - ( PIT16k_FR2_EXTEND_9b * 2 ) + ( ( PIT16k_FR2_EXTEND_9b - PIT16k_MIN_EXTEND ) * 4 ); + } + else + { + pitch_index = T0 - PIT16k_FR1_EXTEND_9b + ( ( PIT16k_FR2_EXTEND_9b - PIT16k_MIN_EXTEND ) * 4 ) + ( ( PIT16k_FR1_EXTEND_9b - PIT16k_FR2_EXTEND_9b ) * 2 ); + } + } + + push_indice( hBstr, IND_PITCH, pitch_index, 9 ); + } + else /* nBits == 6 */ /* relative encoding with 6 bits */ + { + pitch_index = ( T0 - *T0_min ) * 4 + T0_frac; + + push_indice( hBstr, IND_PITCH, pitch_index, nBits ); + } + + limit_T0( L_FRAME16k, 8, L_SUBFR, limit_flag, T0, T0_frac, T0_min, T0_max ); + + return; +} + + +/*------------------------------------------------------------------* + * limit_T0_voiced2: + * + * + *------------------------------------------------------------------*/ + +static void limit_T0_voiced2( + const int16_t res, + const int16_t *T_op, + int16_t *T0_min, + int16_t *T0_min_frac, + int16_t *T0_max, + int16_t *T0_max_frac, + const int16_t pit_min, + const int16_t pit_max, + const int16_t i_subfr ) +{ + int16_t t, temp1, temp2; + + /* Lower-bound */ + if ( i_subfr == 0 ) + { + temp1 = ( T_op[0] * res ) - 32; + } + else + { + temp1 = ( T_op[1] * res ) - 32; + } + + if ( T_op[0] < T_op[1] ) + { + t = ( T_op[0] * res ) - 16; + } + else + { + t = ( T_op[1] * res ) - 16; + } + + if ( temp1 < t ) + { + temp1 = t; + } + + temp2 = temp1 / res; + *T0_min = temp2; + *T0_min_frac = temp1 - temp2 * res; + + if ( *T0_min < pit_min ) + { + *T0_min = pit_min; + *T0_min_frac = 0; + } + + /* Higher-bound */ + temp1 = ( *T0_min * res ) + *T0_min_frac + 64 - 1; + + if ( T_op[0] < T_op[1] ) + { + t = ( T_op[1] * res ) + 16 + res - 1; + } + else + { + t = ( T_op[0] * res ) + 16 + res - 1; + } + + if ( temp1 > t ) + { + temp1 = t; + } + + temp2 = temp1 / res; + *T0_max = temp2; + *T0_max_frac = temp1 - temp2 * res; + + if ( *T0_max > pit_max ) + { + *T0_max = pit_max; + *T0_max_frac = res - 1; + temp1 = ( *T0_max * res ) - 64 + res; + temp2 = temp1 / res; + *T0_min = temp2; + *T0_min_frac = temp1 - temp2 * res; + } + + return; +} + + +/*------------------------------------------------------------------* + * Mode2_pit_encode: + * + * Close-loop pitch lag search and pitch lag quantization + * Adaptive excitation construction + *------------------------------------------------------------------*/ + +void Mode2_pit_encode( + const int16_t coder_type, /* i : coding model */ + const int16_t i_subfr, /* i : subframe index */ + int16_t **pt_indice, /* i/o: quantization indices pointer */ + float *exc, /* i/o: pointer to excitation signal frame */ + const int16_t *T_op, /* i : open loop pitch estimates in current frame */ + int16_t *T0_min, /* i/o: lower limit for close-loop search */ + int16_t *T0_min_frac, /* i/o: lower limit for close-loop search */ + int16_t *T0_max, /* i/o: higher limit for close-loop search */ + int16_t *T0_max_frac, /* i/o: higher limit for close-loop search */ + int16_t *T0, /* i/o: close loop integer pitch */ + int16_t *T0_frac, /* i/o: close loop fractional part of the pitch */ + int16_t *T0_res, /* i/o: close loop pitch resolution */ + float *h1, /* i : weighted filter impulse response */ + float *xn, /* i : target vector */ + const int16_t pit_min, + const int16_t pit_fr1, + const int16_t pit_fr1b, + const int16_t pit_fr2, + const int16_t pit_max, + const int16_t pit_res_max ) +{ + int16_t pit_flag; + + /* Pitch flag */ + pit_flag = i_subfr; + + if ( i_subfr == ( 2 * L_SUBFR ) ) + { + pit_flag = 0; + } + + /*-----------------------------------------------------------------* + * - Limit range of pitch search + * - Fractional pitch search + * - Pitch quantization + *-----------------------------------------------------------------*/ + + if ( coder_type == 0 ) /*Unvoiced Coding do nothing*/ + { + *T0 = L_SUBFR; + *T0_frac = 0; + *T0_res = 1; + } + else if ( coder_type == 1 ) /* 8/4/4/4 (EVS) */ + { + if ( i_subfr == 0 ) + { + limit_T0_voiced( 4, pit_res_max >> 1, T_op[0], 0, 1, T0_min, T0_min_frac, T0_max, T0_max_frac, pit_min, pit_max ); + } + else + { + limit_T0_voiced( 4, pit_res_max >> 1, *T0, *T0_frac, *T0_res, T0_min, T0_min_frac, T0_max, T0_max_frac, pit_min, pit_max ); + } + + *T0 = E_GAIN_closed_loop_search( exc, xn, h1, *T0_min, *T0_min_frac, *T0_max, *T0_max_frac, pit_res_max >> 1, T0_frac, T0_res, pit_res_max, i_subfr, pit_min, pit_min, pit_fr1b, L_SUBFR ); + + if ( i_subfr == 0 ) + { + Mode2_abs_pit_enc( *T0, *T0_frac, pt_indice, pit_min, pit_fr1b, pit_min, pit_res_max ); + } + else + { + Mode2_delta_pit_enc( *T0, *T0_frac, ( pit_res_max >> 1 ), *T0_min, *T0_min_frac, pt_indice ); + } + } + else if ( coder_type == 2 ) /* 8/5/8/5 (EVS) */ + { + + if ( i_subfr == 0 ) + { + limit_T0_voiced( 5, pit_res_max >> 1, T_op[0], 0, 1, T0_min, T0_min_frac, T0_max, T0_max_frac, pit_min, pit_max ); + } + else if ( i_subfr == 2 * L_SUBFR ) + { + limit_T0_voiced( 5, pit_res_max >> 1, T_op[1], 0, 1, T0_min, T0_min_frac, T0_max, T0_max_frac, pit_min, pit_max ); + } + else + { + limit_T0_voiced( 5, pit_res_max >> 1, *T0, *T0_frac, *T0_res, T0_min, T0_min_frac, T0_max, T0_max_frac, pit_min, pit_max ); + } + + *T0 = E_GAIN_closed_loop_search( exc, xn, h1, *T0_min, *T0_min_frac, *T0_max, *T0_max_frac, pit_res_max >> 1, T0_frac, T0_res, pit_res_max, pit_flag, pit_min, pit_min, pit_fr1b, L_SUBFR ); + + if ( pit_flag == 0 ) + { + Mode2_abs_pit_enc( *T0, *T0_frac, pt_indice, pit_min, pit_fr1b, pit_min, pit_res_max ); + } + else + { + Mode2_delta_pit_enc( *T0, *T0_frac, ( pit_res_max >> 1 ), *T0_min, *T0_min_frac, pt_indice ); + } + } + else if ( coder_type == 3 ) /* 9/6/6/6 (HRs- VC) */ + { + int16_t pit_res_max2 = pit_res_max; + + if ( pit_min == PIT_MIN_16k ) + { + + pit_res_max2 = pit_res_max >> 1; + } + + if ( i_subfr == 0 ) + { + + limit_T0_voiced2( pit_res_max2, T_op, T0_min, T0_min_frac, T0_max, T0_max_frac, pit_min, pit_max, i_subfr ); + } + else + { + limit_T0_voiced( 6, pit_res_max2, *T0, 0, 1, T0_min, T0_min_frac, T0_max, T0_max_frac, pit_min, pit_max ); + } + + *T0 = E_GAIN_closed_loop_search( exc, xn, h1, *T0_min, *T0_min_frac, *T0_max, *T0_max_frac, pit_res_max2, T0_frac, T0_res, pit_res_max, i_subfr, pit_min, pit_fr2, pit_fr1, L_SUBFR ); + + if ( i_subfr == 0 ) /* if 1st subframe */ + { + Mode2_abs_pit_enc( *T0, *T0_frac, pt_indice, pit_min, pit_fr1, pit_fr2, pit_res_max ); + } + else + { + Mode2_delta_pit_enc( *T0, *T0_frac, pit_res_max2, *T0_min, *T0_min_frac, pt_indice ); + } + } + else if ( coder_type == 4 ) /* 9/6/9/6 (AMRWB) */ + { + int16_t pit_res_max2 = pit_res_max; + + if ( pit_min == PIT_MIN_16k ) + { + + pit_res_max2 = pit_res_max >> 1; + } + + + if ( ( i_subfr == 0 ) || ( i_subfr == 2 * L_SUBFR ) ) + { + + limit_T0_voiced2( pit_res_max2, T_op, T0_min, T0_min_frac, T0_max, T0_max_frac, pit_min, pit_max, i_subfr ); + } + else + { + limit_T0_voiced( 6, pit_res_max2, *T0, 0, 1, T0_min, T0_min_frac, T0_max, T0_max_frac, pit_min, pit_max ); + } + + *T0 = E_GAIN_closed_loop_search( exc, xn, h1, *T0_min, *T0_min_frac, *T0_max, *T0_max_frac, pit_res_max2, T0_frac, T0_res, pit_res_max, pit_flag, pit_min, pit_fr2, pit_fr1, L_SUBFR ); + + if ( pit_flag == 0 ) /* if 1st/3rd/5th subframe */ + { + Mode2_abs_pit_enc( *T0, *T0_frac, pt_indice, pit_min, pit_fr1, pit_fr2, pit_res_max ); + } + else /* if subframe 2 or 4 */ + { + Mode2_delta_pit_enc( *T0, *T0_frac, pit_res_max2, *T0_min, *T0_min_frac, pt_indice ); + } + } + else if ( coder_type == 8 ) /* 8/5/5/5 (RF all pred mode) */ + { + if ( i_subfr == 0 ) + { + limit_T0_voiced( 5, pit_res_max >> 1, T_op[0], 0, 1, T0_min, T0_min_frac, T0_max, T0_max_frac, pit_min, pit_max ); + } + else + { + limit_T0_voiced( 5, pit_res_max >> 1, *T0, *T0_frac, *T0_res, T0_min, T0_min_frac, T0_max, T0_max_frac, pit_min, pit_max ); + } + *T0 = E_GAIN_closed_loop_search( exc, xn, h1, *T0_min, *T0_min_frac, *T0_max, *T0_max_frac, pit_res_max >> 1, T0_frac, T0_res, pit_res_max, i_subfr, pit_min, pit_min, pit_fr1b, L_SUBFR ); + + if ( i_subfr == 0 ) + { + Mode2_abs_pit_enc( *T0, *T0_frac, pt_indice, pit_min, pit_fr1b, pit_min, pit_res_max ); + } + else + { + Mode2_delta_pit_enc( *T0, *T0_frac, ( pit_res_max >> 1 ), *T0_min, *T0_min_frac, pt_indice ); + } + } + else if ( coder_type == 9 ) /* 8/0/8/0 (RF mode Gen pred) */ + { + if ( i_subfr == 0 ) + { + limit_T0_voiced( 4, pit_res_max >> 1, T_op[0], 0, 1, T0_min, T0_min_frac, T0_max, T0_max_frac, pit_min, pit_max ); + } + else + { + limit_T0_voiced( 4, pit_res_max >> 1, *T0, *T0_frac, *T0_res, T0_min, T0_min_frac, T0_max, T0_max_frac, pit_min, pit_max ); + } + *T0 = E_GAIN_closed_loop_search( exc, xn, h1, *T0_min, *T0_min_frac, *T0_max, *T0_max_frac, pit_res_max >> 1, T0_frac, T0_res, pit_res_max, i_subfr, pit_min, pit_min, pit_fr1b, L_SUBFR ); + + if ( i_subfr == 0 ) + { + Mode2_abs_pit_enc( *T0, *T0_frac, pt_indice, pit_min, pit_fr1b, pit_min, pit_res_max ); + } + else + { + Mode2_delta_pit_enc( *T0, *T0_frac, ( pit_res_max >> 1 ), *T0_min, *T0_min_frac, pt_indice ); + } + } + else + { + assert( 0 ); + } + + return; +} + + +/*-------------------------------------------------------------------* + * Mode2_abs_pit_enc: + * + * Encode pitch lag absolutely + *-------------------------------------------------------------------*/ + +void Mode2_abs_pit_enc( + const int16_t T0, /* i : integer pitch lag */ + const int16_t T0_frac, /* i : pitch fraction */ + int16_t **pt_indice, /* i/o: pointer to Vector of Q indexes */ + const int16_t pit_min, + const int16_t pit_fr1, + const int16_t pit_fr2, + const int16_t pit_res_max ) +{ + int16_t pit_res_max_half; + + pit_res_max_half = pit_res_max >> 1; + + if ( T0 < pit_fr2 ) + { + **pt_indice = T0 * pit_res_max + T0_frac - ( pit_min * pit_res_max ); + } + else if ( T0 < pit_fr1 ) + { + **pt_indice = T0 * pit_res_max_half + T0_frac - ( pit_fr2 * pit_res_max_half ) + ( ( pit_fr2 - pit_min ) * pit_res_max ); + } + else + { + **pt_indice = T0 - pit_fr1 + ( ( pit_fr2 - pit_min ) * pit_res_max ) + ( ( pit_fr1 - pit_fr2 ) * pit_res_max_half ); + } + + ( *pt_indice )++; + + return; +} + + +/*-------------------------------------------------------------------* + * Mode2_delta_pit_enc: + * + * Encode pitch lag differentially + *-------------------------------------------------------------------*/ + +void Mode2_delta_pit_enc( + const int16_t T0, /* i : integer pitch lag */ + const int16_t T0_frac, /* i : pitch fraction */ + const int16_t T0_res, /* i : pitch resolution */ + const int16_t T0_min, /* i : delta search min */ + const int16_t T0_min_frac, /* i : delta search min */ + int16_t **pt_indice /* o : pointer to Vector of Q indexes */ +) +{ + + **pt_indice = ( T0 - T0_min ) * T0_res + T0_frac - T0_min_frac; + + ( *pt_indice )++; + + return; +} diff --git a/lib_enc/pitch_ol.c b/lib_enc/pitch_ol.c new file mode 100644 index 0000000000000000000000000000000000000000..8f149a35d8893c6f12924f2ce058f54278a506d2 --- /dev/null +++ b/lib_enc/pitch_ol.c @@ -0,0 +1,992 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "prot.h" +#include "cnst.h" +#include "rom_com.h" +#include "rom_enc.h" +#include "wmc_auto.h" + +/*---------------------------------------------------------------------* + * Local constants + *---------------------------------------------------------------------*/ + +#define PIT_MIN2 20 /* pit_min for pitch tracking */ +#define PIT_MIN_1 44 /* pitch tracking */ +#define PIT_MIN2_1 24 +#define THR_relE -11.0f +#define THRES0 1.17f /* Threshold to favor smaller pitch lags */ +#define DELTA0 2.0f /* initial range of multiples search */ +#define STEP 1.0f /* increment in range of multiples search */ +#define THRES1 0.4f /* Threshold to favor pitch lags coherence for neighbours */ +#define DELTA_COH 14 /* Maximum pitch lags difference for neighbours to be considered as coherent */ +#define THRES3 0.7f /* Threshold to favor pitch lags coherence with previous frames */ +#define CORR_TH0 0.4f /* Noise threshold for reinforcement with past frame pitch */ +#define CORR_TH1 0.5f /* Noise threshold for reinforcement with neighbourhood pitch correlations */ +#define LEN_X ( ( PIT_MAX / OPL_DECIM ) - ( PIT_MIN2 / OPL_DECIM ) + 1 ) /* Correlation buffer length */ +#define COH_FAC 1.4f /* Factor for measuring the pitch coherence */ +#define NSECT 4 +#define NHFR 3 +#define L_FIR_PO 5 +#define L_MEM ( L_FIR_PO - 2 ) + +/*-----------------------------------------------------------------* + * Local function prototypes + *-----------------------------------------------------------------*/ + +static void pitch_neighbour( const int16_t sect0, const int16_t pitch_tmp[], int16_t pitch[NHFR][2 * NSECT], const float corr_tmp[], float corr[3][2 * NSECT], const float thres1[2 * NHFR], const int16_t ind_tmp[2 * NHFR] ); + +static void find_mult( float *fac, const int16_t pitch0, const int16_t pitch1, const int16_t pit_max0, float *corr, int16_t *old_pitch, float *old_corr, float delta, const float step ); + +static int16_t pitch_coherence( const int16_t pitch0, const int16_t pitch1, const float fac_max, const int16_t diff_max ); + +static void lp_decim2( const float x[], float y[], const int16_t l, float *mem ); + + +/*-----------------------------------------------------------------* + * pitch_ol_init + * + * Open loop pitch variable initialization + *-----------------------------------------------------------------*/ + +void pitch_ol_init( + float *old_thres, /* o : threshold for reinforcement of past pitch influence */ + int16_t *old_pitch, /* o : pitch of the 1st half-frame of previous frame */ + int16_t *delta_pit, /* o : pitch evolution extrapolation */ + float *old_corr /* o : correlation */ +) +{ + *old_thres = 0.0f; + *old_pitch = 0; + *delta_pit = 0; + *old_corr = 0.0f; + + return; +} + +/*-----------------------------------------------------------------* + * pitch_ol() + * + * Compute the open loop pitch lag. + * + * The pitch lag search is divided in three sections of two sets. + * Each section cannot have a pitch multiple. + * We find a maximum for each section. + * We compare the maxima of each section. + * + * As there is a margin between section overlaps, especially for + * longer delays, this section selection is more robust for not + * to find multiples in the same section when pitch evolves rapidly + * + * For each section, the length of the vectors to correlate is + * greater than or equal to the longest pitch delay + *------------------------------------------------------------------*/ + +void pitch_ol( + int16_t pitch[3], /* o : open loop pitch lag for each half-frame */ + float voicing[3], /* o : maximum normalized correlation for each half-frame */ + int16_t *old_pitch, /* i/o: OL pitch of the 2nd half-frame of the last frame */ + float *old_corr, /* i/o: correlation */ + float corr_shift, /* i : normalized correlation correction */ + float *old_thres, /* i/o: maximum correlation weighting with respect to past frame pitch */ + int16_t *delta_pit, /* i/o: old pitch extrapolation correction (added to old pitch) */ + float *st_old_wsp2, /* i/o: weighted speech memory */ + const float *wsp, /* i : weighted speech for current frame and look-ahead */ + float mem_decim2[3], /* i/o: wsp decimation filter memory */ + const float relE, /* i : relative frame energy */ + const int16_t L_look, /* i : look-ahead length */ + const int16_t last_class, /* i : frame classification of last frame */ + const int16_t bwidth, /* i : audio bandwidth */ + const int16_t Opt_SC_VBR /* i : SC-VBR flag */ +) +{ + float old_wsp2[( L_WSP - L_INTERPOL ) / OPL_DECIM], *wsp2; + float tmp_mem[3], scale1[2 * DELTA_COH - 1]; + float scaled_buf[2 * LEN_X + 3 * ( DELTA_COH - 1 )]; + float cor_temp, cor_buf[2 * LEN_X], *pt1, *pt2, *pt3, *pt4, *pt5 = 0, *pt6 = 0, *pt_cor0, *pt_cor1, *pt_cor2, *pt_cor3, *pt_cor4; + float thres1[2 * NHFR]; + int16_t diff, cnt, ind, ind1, offset, offset1, offset_la = 0, offset_la1 = 0, coh_flag, coh_flag1; + + int16_t i, j, k, m, pit_min, pit_min1, sect0, subsect0, old_tmp, old_tmp1, len_x, len_x1, len_temp, len_temp1; + int16_t pitchX[NHFR][2 * NSECT], pitch_tmp[2 * NHFR], ind_tmp[2 * NHFR], tmp_buf[NHFR + 1]; + float enr, enr1 = 0.0f, enr_norm[NSECT], enr_norm1[NSECT], fac; + float scaledX[NHFR][2 * NSECT], corX[NHFR][2 * NSECT], cor_tmp[2 * NHFR], cor_mean; + + const int16_t *nb_sect, *nb_subsect, *len, *len1, *sublen, *sublen1, *pit_max, *sec_length, *sec_length1; + int16_t ind_corX, ind1_corX; + float pit_min_coding; + + /*--------------------------------------------------------------* + * Initialization + *--------------------------------------------------------------*/ + + nb_sect = nb_sect_12k8; + nb_subsect = nb_subsect_12k8; + + len = len_12k8; + len1 = len1_12k8; + sublen = sublen_12k8; + sublen1 = sublen1_12k8; + pit_max = pit_max_12k8; + sec_length = sec_length_12k8; + sec_length1 = sec_length1_12k8; + + if ( last_class < VOICED_TRANSITION && bwidth != NB ) + { + /* reset last pitch reinforcement in case of unvoiced or transitions: it avoids some pitch doublings */ + *old_thres = 0.0f; + } + + pit_min_coding = PIT_MIN_EXTEND; + if ( ( bwidth != NB && *old_pitch > PIT_MIN ) || + ( bwidth == NB && ( *old_pitch > PIT_MIN2_1 || *old_thres < 0.1 ) ) ) + { + pit_min = PIT_MIN / OPL_DECIM; + pit_min1 = PIT_MIN_1 / OPL_DECIM; + subsect0 = 2; + sect0 = 1; + } + else + { + pit_min = PIT_MIN2 / OPL_DECIM; + pit_min1 = PIT_MIN2_1 / OPL_DECIM; + subsect0 = 0; + sect0 = 0; + } + + len_x = PIT_MAX / OPL_DECIM - pit_min + 1; + len_x1 = PIT_MAX / OPL_DECIM - pit_min1 + 1; + + /*--------------------------------------------------------------* + * Find decimated weighted speech + * Update wsp buffer with the memory + * decimation of wsp[] to search pitch in LF and to reduce complexity + * Extend the decimation of wsp to the end of the speech buffer + * Update wsp memory + *--------------------------------------------------------------*/ + + mvr2r( st_old_wsp2, old_wsp2, ( L_WSP_MEM - L_INTERPOL ) / OPL_DECIM ); + wsp2 = old_wsp2 + ( ( L_WSP_MEM - L_INTERPOL ) / OPL_DECIM ); + lp_decim2( wsp, wsp2, L_FRAME, mem_decim2 ); + + mvr2r( mem_decim2, tmp_mem, 3 ); + lp_decim2( &wsp[L_FRAME], &wsp2[L_FRAME / OPL_DECIM], L_look, tmp_mem ); + + mvr2r( &old_wsp2[L_FRAME / OPL_DECIM], st_old_wsp2, ( L_WSP_MEM - L_INTERPOL ) / OPL_DECIM ); + + /*-----------------------------------------------------------------* + * attenuate the correlation correction factor due to noise + * reset correlation buffer outside the useful range + * Find the scaling functions for immediate neigbours and + * further ones + *-----------------------------------------------------------------*/ + + corr_shift *= 0.5f; + set_f( scaled_buf, 0, DELTA_COH - 1 ); + set_f( scaled_buf + ( DELTA_COH - 1 ) + len_x, 0, DELTA_COH - 1 ); + set_f( scaled_buf + 2 * ( DELTA_COH - 1 ) + len_x + len_x1, 0, DELTA_COH - 1 ); + + pt1 = scale1 + DELTA_COH - 1; + pt2 = pt1; + for ( i = 0; i < DELTA_COH; i++ ) + { + *pt1 = -( *old_thres ) / DELTA_COH * i + *old_thres + 1.0f; + *pt2-- = *pt1++; + } + + /*-----------------------------------------------------------------* + * Estimate the new pitch by extrapolating the old pitch value + * for 2 half-frames + *-----------------------------------------------------------------*/ + + old_tmp = *old_pitch + *delta_pit; + + if ( old_tmp > PIT_MAX / OPL_DECIM ) + { + old_tmp = PIT_MAX / OPL_DECIM; + } + + if ( old_tmp < pit_min ) + { + old_tmp = pit_min; + } + + old_tmp1 = old_tmp + *delta_pit; + if ( old_tmp1 > PIT_MAX / OPL_DECIM ) + { + old_tmp1 = PIT_MAX / OPL_DECIM; + } + + if ( old_tmp1 < pit_min ) + { + old_tmp1 = pit_min; + } + + + /*-----------------------------------------------------------------* + * Loop for all three half-frames (current frame + look-ahead) + *-----------------------------------------------------------------*/ + pt_cor0 = scaled_buf + DELTA_COH - 1; + + pt_cor2 = pt_cor0 - pit_min + old_tmp; + pt_cor4 = pt_cor0 - pit_min1 + old_tmp + ( DELTA_COH - 1 ) + len_x; + + for ( i = 0; i < NHFR; i++ ) + { + pt1 = wsp2 + i * 2 * ( L_SUBFR / OPL_DECIM ); + pt2 = pt1 - pit_min; + enr = 0.01f; + pt_cor1 = pt_cor0; + pt4 = pt1 - pit_min1; + pt_cor3 = pt_cor0 + ( DELTA_COH - 1 ) + len_x; + + /*-----------------------------------------------------------------* + * First two half-frames (corresponding to current frame) + *-----------------------------------------------------------------*/ + if ( i < NHFR - 1 ) + { + pt3 = pt1; + pt5 = pt1; + + for ( j = sect0; j < nb_sect[i]; j++ ) /* loop for each section */ + { + /*-----------------------------------------------------------------* + * Find fixed vector energy + *-----------------------------------------------------------------*/ + + /* 1st set */ + k = (int16_t) ( pt1 - pt3 ); + for ( k = k + len[j]; k > 0; k-- ) + { + enr += *pt3 * *pt3; + pt3++; + } + enr_norm[j] = enr; + + /* Reduce complexity (length of 'enr1' section is equal or larger than 'enr') */ + pt5 = pt3; + enr1 = enr; + + /* 2nd set */ + k = (int16_t) ( pt1 - pt5 ); + for ( k = k + len1[j]; k > 0; k-- ) + { + enr1 += *pt5 * *pt5; + pt5++; + } + enr_norm1[j] = enr1; + } + + /*-----------------------------------------------------------------* + * Find correlation for the non-overlapping pitch lag values + *-----------------------------------------------------------------*/ + k = (int16_t) ( pt2 - pt1 ); + for ( k = k + pit_max[subsect0]; k >= 0; k-- ) + { + *pt_cor1++ = dotp( pt1, pt2--, sublen[0] ); + } + + /*-----------------------------------------------------------------* + * For each subsection, find the correlation + *-----------------------------------------------------------------*/ + for ( j = subsect0; j < nb_subsect[i]; j++ ) + { + len_temp = sublen[j]; + len_temp1 = sublen1[j]; + + k = (int16_t) ( pt2 - pt1 ); + if ( len_temp < len_temp1 ) + { + for ( k = k + pit_max[j + 1]; k >= 0; k-- ) + { + cor_temp = pt1[0] * pt2[0]; + for ( m = 1; m < len_temp; m++ ) + { + cor_temp += pt1[m] * pt2[m]; + } + *pt_cor1++ = cor_temp; + for ( ; m < len_temp1; m++ ) + { + cor_temp += pt1[m] * pt2[m]; + } + *pt_cor3++ = cor_temp; + pt2--; + } + } + else + { + for ( k = k + pit_max[j + 1]; k >= 0; k-- ) + { + cor_temp = pt1[0] * pt2[0]; + for ( m = 1; m < len_temp1; m++ ) + { + cor_temp += pt1[m] * pt2[m]; + } + *pt_cor3++ = cor_temp; + for ( ; m < len_temp; m++ ) + { + cor_temp += pt1[m] * pt2[m]; + } + *pt_cor1++ = cor_temp; + pt2--; + } + } + } + } + + /*-----------------------------------------------------------------* + * Third half-frame (look-ahead) + *-----------------------------------------------------------------*/ + + else + { + /*-----------------------------------------------------------------* + * For each section in both sets, find fixed vector energy + *-----------------------------------------------------------------*/ + + pt6 = pt1 + L_look / OPL_DECIM - 1; + pt3 = pt6; + pt5 = pt6; + + for ( j = sect0; j < nb_sect[i]; j++ ) /* loop for each section */ + { + /* 1st set */ + k = (int16_t) ( pt3 - pt6 ); + for ( k = k + len[j]; k > 0; k-- ) + { + enr += *pt3 * *pt3; + pt3--; + } + + enr_norm[j] = enr; + + pt5 = pt3; + enr1 = enr; + + /* 2nd set */ + k = (int16_t) ( pt5 - pt6 ); + for ( k = k + len1[j]; k > 0; k-- ) + { + enr1 += *pt5 * *pt5; + pt5--; + } + + enr_norm1[j] = enr1; + } + + /* Set pointers */ + if ( sect0 == 0 ) + { + pt2 = pt6 - pit_min; + k = 2; + } + else + { + pt2 = pt6 - pit_max[1] - 1; + k = pit_max[2] - pit_max[1]; + } + + /*-----------------------------------------------------------------* + * Find correlation for the non-overlapping pitch lag values + *-----------------------------------------------------------------*/ + + for ( ; k > 0; k-- ) + { + *pt_cor1 = 0; + for ( m = 0; m < sublen[0]; m++ ) + { + *pt_cor1 += pt6[-m] * pt2[-m]; + } + pt_cor1++; + pt2--; + } + + /*-----------------------------------------------------------------* + * For each subsection, find the correlation (overlapping pitch lag values) + *-----------------------------------------------------------------*/ + + for ( j = subsect0; j < nb_subsect[i]; j++ ) + { + len_temp = sublen[j]; + len_temp1 = sublen1[j]; + + k = pit_max[j + 1] - pit_max[j]; + if ( len_temp < len_temp1 ) + { + for ( ; k > 0; k-- ) + { + cor_temp = pt6[0] * pt2[0]; + for ( m = 1; m < len_temp; m++ ) + { + cor_temp += pt6[-m] * pt2[-m]; + } + *pt_cor1++ = cor_temp; + for ( ; m < len_temp1; m++ ) + { + cor_temp += pt6[-m] * pt2[-m]; + } + *pt_cor3++ = cor_temp; + pt2--; + } + } + else + { + for ( ; k > 0; k-- ) + { + cor_temp = pt6[0] * pt2[0]; + for ( m = 1; m < len_temp1; m++ ) + { + cor_temp += pt6[-m] * pt2[-m]; + } + *pt_cor3++ = cor_temp; + for ( ; m < len_temp; m++ ) + { + cor_temp += pt6[-m] * pt2[-m]; + } + *pt_cor1++ = cor_temp; + pt2--; + } + } + } + } + + /* Save unscaled correlation vector */ + mvr2r( pt_cor0, cor_buf, len_x ); + mvr2r( pt_cor0 + ( DELTA_COH - 1 ) + len_x, cor_buf + len_x, len_x1 ); + + /*-----------------------------------------------------------------* + * scale correlation function in the neighbourhood of + * the extrapolated pitch + *-----------------------------------------------------------------*/ + pt_cor1 = pt_cor2 - ( DELTA_COH - 1 ); + pt_cor3 = pt_cor4 - ( DELTA_COH - 1 ); + pt2 = scale1; + + for ( k = 0; k < 2 * DELTA_COH - 1; k++ ) + { + *pt_cor1++ *= ( *pt2 ); + *pt_cor3++ *= ( *pt2++ ); + } + + /* update for next half-frame */ + pt_cor2 = pt_cor0 - pit_min + old_tmp1; + pt_cor4 = pt_cor0 - pit_min1 + old_tmp1 + ( DELTA_COH - 1 ) + len_x; + /*-----------------------------------------------------------------* + * For each section, find maximum correlation and compute + * normalized correlation + *-----------------------------------------------------------------*/ + + pt_cor1 = pt_cor0; + offset = 0; + pt_cor3 = pt_cor0 + ( DELTA_COH - 1 ) + len_x; + offset1 = 0; + for ( j = sect0; j < nb_sect[i]; j++ ) /* loop for each section */ + { + /* 1st set */ + if ( i == 2 ) + { + offset_la = L_look / OPL_DECIM - 1 - ( len[j] - 1 ); + } + else + { + offset_la = 0; + } + + /* 2nd set */ + if ( i == 2 ) + { + offset_la1 = L_look / OPL_DECIM - 1 - ( len1[j] - 1 ); + } + else + { + offset_la1 = 0; + } + + /* 1st set of candidates */ + ind = maximum( pt_cor1, sec_length[j], 0 ) + offset; + pitchX[i][j] = ind + pit_min; + pt2 = pt1 - pitchX[i][j] + offset_la; /* selected moving vector */ + enr1 = dotp( pt2, pt2, len[j] ) + 0.01f; + enr1 = inv_sqrt( enr_norm[j] * enr1 ); /* 1/sqrt(energy) */ + corX[i][j] = cor_buf[ind] * enr1; /* find best normalized correlation per section */ + scaledX[i][j] = pt_cor0[ind] * enr1; /* find best scaled normalized correlation per section */ + + pt_cor1 += sec_length[j]; + offset = offset + sec_length[j]; + + /* 2nd set of candidates */ + ind1 = maximum( pt_cor3, sec_length1[j], 0 ) + offset1; + pitchX[i][j + NSECT] = ind1 + pit_min1; + pt4 = pt1 - pitchX[i][j + NSECT] + offset_la1; /* selected moving vector */ + enr1 = dotp( pt4, pt4, len1[j] ) + 0.01f; + enr1 = inv_sqrt( enr_norm1[j] * enr1 ); /* 1/sqrt(energy) */ + corX[i][j + NSECT] = cor_buf[ind1 + len_x] * enr1; /* find best normalized correlation per section */ + scaledX[i][j + NSECT] = pt_cor0[ind1 + ( DELTA_COH - 1 ) + len_x] * enr1; /* find best scaled normalized correlation per section */ + + pt_cor3 += sec_length1[j]; + offset1 = offset1 + sec_length1[j]; + } + } + /*-----------------------------------------------------------------* + * Favor a smaller delay if it happens that it has its multiple + * in the longer-delay sections (harmonics check) + *-----------------------------------------------------------------*/ + + for ( i = 0; i < 2; i++ ) /* loop for the 2 half-frames */ + { + fac = THRES0; + find_mult( &fac, pitchX[i][2], pitchX[i][3], pit_max[7], &scaledX[i][2], old_pitch, old_corr, DELTA0, STEP ); /* Multiples in longest-delay section */ + find_mult( &fac, pitchX[i][1], pitchX[i][2], pit_max[5], &scaledX[i][1], old_pitch, old_corr, DELTA0, STEP ); /* Multiples in 3rd section */ + + if ( ( sect0 == 0 ) && ( ( pitchX[i][0] * 2 ) >= pit_min_coding ) ) + { + find_mult( &fac, pitchX[i][0], pitchX[i][1], pit_max[3], &scaledX[i][0], old_pitch, old_corr, DELTA0, STEP ); /* Multiples in 2nd section */ + } + fac = THRES0; + find_mult( &fac, pitchX[i][NSECT + 2], pitchX[i][NSECT + 3], pit_max[7], &scaledX[i][NSECT + 2], old_pitch, old_corr, DELTA0, STEP ); /* Multiples in longest-delay section */ + find_mult( &fac, pitchX[i][NSECT + 1], pitchX[i][NSECT + 2], pit_max[6], &scaledX[i][NSECT + 1], old_pitch, old_corr, DELTA0, STEP ); /* Multiples in 3rd section */ + + if ( ( sect0 == 0 ) && ( pitchX[i][NSECT + 0] * 2 >= pit_min_coding ) ) + { + find_mult( &fac, pitchX[i][NSECT + 0], pitchX[i][NSECT + 1], pit_max[4], &scaledX[i][NSECT + 0], old_pitch, old_corr, DELTA0, STEP ); /* Multiples in 2nd section */ + } + } + + fac = THRES0; /* the look-ahead */ + find_mult( &fac, pitchX[i][2], pitchX[i][3], pit_max[7], &scaledX[i][2], old_pitch, old_corr, 2.0f, 2.0f ); /* Multiples in longest-delay section */ + find_mult( &fac, pitchX[i][1], pitchX[i][2], pit_max[5], &scaledX[i][1], old_pitch, old_corr, DELTA0, STEP ); /* Multiples in 3rd section */ + + if ( ( sect0 == 0 ) && ( pitchX[i][0] * 2 >= pit_min_coding ) ) + { + find_mult( &fac, pitchX[i][0], pitchX[i][1], pit_max[3], &scaledX[i][0], old_pitch, old_corr, DELTA0, STEP ); /* Multiples in 2nd section */ + } + + fac = THRES0; /* the look-ahead */ + find_mult( &fac, pitchX[i][NSECT + 2], pitchX[i][NSECT + 3], pit_max[7], &scaledX[i][NSECT + 2], old_pitch, old_corr, 2.0f, 2.0f ); /* Multiples in longest-delay section */ + find_mult( &fac, pitchX[i][NSECT + 1], pitchX[i][NSECT + 2], pit_max[6], &scaledX[i][NSECT + 1], old_pitch, old_corr, DELTA0, STEP ); /* Multiples in 3rd section */ + + if ( ( sect0 == 0 ) && ( pitchX[i][NSECT + 0] * 2 >= pit_min_coding ) ) + { + find_mult( &fac, pitchX[i][NSECT + 0], pitchX[i][NSECT + 1], pit_max[4], &scaledX[i][NSECT + 0], old_pitch, old_corr, DELTA0, STEP ); /* Multiples in 2nd section */ + } + + /*-----------------------------------------------------------------* + * Do 1st estimate for pitch values + * Adjust the normalized correlation using estimated noise level + * Compute the maximum scaling for the neighbour correlation + * reinforcement + *-----------------------------------------------------------------*/ + + for ( i = 0; i < NHFR; i++ ) + { + ind = maximum( scaledX[i] + sect0, (int16_t) ( NSECT - sect0 ), 0 ); + ind = ind + sect0; + ind_tmp[i] = ind; + pitch_tmp[i] = pitchX[i][ind]; + cor_tmp[i] = corX[i][ind]; + cor_tmp[i] += corr_shift; + + if ( cor_tmp[i] > 1.0f ) + { + cor_tmp[i] = 1.0f; + } + thres1[i] = THRES1 * cor_tmp[i]; /* Higher is the neighbour's correlation, higher is the weighting */ + + /* 2nd set of pitch candidates */ + ind1 = maximum( scaledX[i] + sect0 + NSECT, (int16_t) ( NSECT - sect0 ), 0 ); + ind1 += ( sect0 + NSECT ); + ind_tmp[i + NHFR] = ind1; + pitch_tmp[i + NHFR] = pitchX[i][ind1]; + cor_tmp[i + NHFR] = corX[i][ind1]; + cor_tmp[i + NHFR] += corr_shift; + + if ( cor_tmp[i + NHFR] > 1.0f ) + { + cor_tmp[i + NHFR] = 1.0f; + } + thres1[i + NHFR] = THRES1 * cor_tmp[i + NHFR]; /* Higher is the neighbour's correlation, higher is the weighting */ + } + /*-----------------------------------------------------------------* + * Take into account previous and next pitch values of the present + * frame and look-ahead. Choose the pitch lags and normalize + * correlations for each half-frame & look-ahead + *-----------------------------------------------------------------*/ + + pitch_neighbour( sect0, pitch_tmp, pitchX, cor_tmp, scaledX, thres1, ind_tmp ); + for ( i = 0; i < NHFR; i++ ) + { + ind = maximum( scaledX[i] + sect0, (int16_t) ( NSECT - sect0 ), 0 ); + ind = ind + sect0; + ind_corX = maximum( corX[i] + sect0, (int16_t) ( NSECT - sect0 ), 0 ); + ind_corX = ind_corX + sect0; + + ind1 = maximum( scaledX[i] + sect0 + NSECT, (int16_t) ( NSECT - sect0 ), 0 ); + ind1 += ( sect0 + NSECT ); + ind1_corX = maximum( corX[i] + sect0 + NSECT, (int16_t) ( NSECT - sect0 ), 0 ); + ind1_corX += ( sect0 + NSECT ); + + if ( scaledX[i][ind1] > scaledX[i][ind] ) + { + ind = ind1; + } + + if ( Opt_SC_VBR && corX[i][ind1_corX] > corX[i][ind_corX] ) + { + ind_corX = ind1_corX; + } + + if ( Opt_SC_VBR && ( pitchX[i][ind] * 0.4 < pitchX[i][ind_corX] ) && ( pitchX[i][ind] * 0.6 > pitchX[i][ind_corX] ) && ( corX[i][ind_corX] >= 0.9 ) ) /* && (pitchX[i][ind]>50)) */ + { + pitch[i] = pitchX[i][ind_corX]; + voicing[i] = corX[i][ind_corX]; + } + else + { + pitch[i] = pitchX[i][ind]; + voicing[i] = corX[i][ind]; + } + } + + /*-----------------------------------------------------------------* + * Increase the threshold for correlation reinforcement with + * the past if correlation is high and pitch is stable + *-----------------------------------------------------------------*/ + + cor_mean = 0.5f * ( voicing[0] + voicing[1] ) + corr_shift; + if ( cor_mean > 1.0f ) + { + cor_mean = 1.0f; + } + + /* pitch unstable in present frame or from previous frame or normalized correlation too low */ + coh_flag = pitch_coherence( (int16_t) pitch[0], (int16_t) pitch[1], COH_FAC, DELTA_COH ); + coh_flag1 = pitch_coherence( (int16_t) pitch[0], (int16_t) *old_pitch, COH_FAC, DELTA_COH ); + if ( ( coh_flag == 0 ) || ( coh_flag1 == 0 ) || ( cor_mean < CORR_TH0 ) || ( relE < THR_relE ) ) + { + *old_thres = 0.0f; /* Reset the threshold */ + } + else + { + *old_thres += ( 0.16f * cor_mean ); /* The threshold increase is directly dependent on normalized correlation */ + } + + if ( *old_thres > THRES3 ) + { + *old_thres = THRES3; + } + + if ( voicing[1] > voicing[0] ) + { + *old_corr = voicing[1]; + } + else + { + *old_corr = cor_mean; + } + + /*-----------------------------------------------------------------* + * Extrapolate the pitch value for the next frame by estimating + * the pitch evolution. This value is added to the old_pitch + * in the next frame and is then used when the normalized + * correlation is reinforced by the past estimate + *-----------------------------------------------------------------*/ + + tmp_buf[0] = *old_pitch; + for ( i = 0; i < NHFR; i++ ) + { + tmp_buf[i + 1] = pitch[i]; + } + + *delta_pit = 0; + cnt = 0; + for ( i = 0; i < NHFR; i++ ) + { + diff = tmp_buf[i + 1] - tmp_buf[i]; + coh_flag = pitch_coherence( (int16_t) tmp_buf[i], (int16_t) tmp_buf[i + 1], COH_FAC, DELTA_COH ); + if ( coh_flag != 0 ) + { + *delta_pit = *delta_pit + diff; + cnt++; + } + } + + if ( cnt == 2 ) + { + *delta_pit /= 2; + } + + if ( cnt == 3 ) + { + *delta_pit /= 3; + } + + /*-----------------------------------------------------------------* + * update old pitch, upsample pitch + *-----------------------------------------------------------------*/ + + *old_pitch = pitch[1]; + + for ( i = 0; i < NHFR; i++ ) + { + pitch[i] *= OPL_DECIM; + } + + + return; +} + +/*-----------------------------------------------------------------* + * find_mult + * + * Verifies whether max pitch delays in higher sections have multiples + * in lower sections + *-----------------------------------------------------------------*/ + +static void find_mult( + float *fac, /* i/o: correlation scaling factor */ + const int16_t pitch0, /* i : pitch of max correlation in the c section */ + const int16_t pitch1, /* i : pitch of max correlation in the longer-delay section */ + const int16_t pit_max0, /* i : max pitch delay in the longer-delay section */ + float *corr, /* i/o: max correlation in the shorter-delay section */ + int16_t *old_pitch, /* i : pitch from previous frame */ + float *old_corr, /* i : max correlation from previous frame */ + float delta, /* i : initial multiples search range */ + const float step /* i : increment in range of multiples search */ +) +{ + int16_t pit_min; + + pit_min = 2 * pitch0; /* double the shorter-delay section pitch */ + while ( pit_min <= pit_max0 + (int16_t) delta ) /* check for section boundary */ + { + if ( abs( pit_min - pitch1 ) <= (int16_t) delta ) /* if multiple in the allowed range */ + { + if ( *old_corr < 0.6f || (float) pitch0 > (float) *old_pitch * 0.4f ) + { + /* reinforce the normalized correlation */ + *corr *= *fac; + } + *fac *= THRES0; + } + pit_min = pit_min + pitch0; /* next multiple */ + delta += step; /* add the incertitude to the allowed range */ + } + return; +} + +/*---------------------------------------------------------------------------* + * pitch_neighbour + * + * Verifies if the maximum correlation pitch lag is coherent with neighbour + * values + *---------------------------------------------------------------------------*/ +static void pitch_neighbour( + const int16_t sect0, /* i : indicates whether section 0 (below PIT_MIN) is used */ + const int16_t pitch_tmp[], /* i : estimated pitch values for each half-frame & look-ahead */ + int16_t pitch[NHFR][2 * NSECT], /* i : tested pitch values for each half-frame & look-ahead */ + const float corr_tmp[], /* i : raw normalized correlation (before different scalings) */ + float corr[NHFR][2 * NSECT], /* i/o: normalized correlation for each half-frame & look-ahead */ + const float thres1[2 * NHFR], /* i : maximum scaling for the immediate neighbours */ + const int16_t ind_tmp[2 * NHFR] /* i : maximum section indices */ +) +{ + int16_t delta, i, j, k, K, coh_flag; + + for ( k = sect0; k < NSECT; k++ ) /* loop for each section */ + { + if ( k == ( NSECT - 1 ) ) + { + K = 2; /* the number of tests depends on the section */ + } + else + { + K = 3; + } + for ( i = 0; i < K; i++ ) /* loop for the 2 half-frames and the look-ahead */ + { + /* Compare pitch values of the present frame */ + for ( j = 0; j < K; j++ ) /* Verify pitch coherence with neighbours (including past pitch) */ + { + if ( j != i ) /* Exclude itself */ + { + if ( corr_tmp[j] >= CORR_TH1 ) /* reinforcement can happen only if the correlation is high enough */ + { + delta = (int16_t) abs( pitch[i][k] - pitch_tmp[j] ); /* Find difference of pitch values */ + coh_flag = pitch_coherence( (int16_t) pitch[i][k], (int16_t) pitch_tmp[j], COH_FAC, DELTA_COH ); + if ( coh_flag != 0 ) + { + /* Favour section-wise stability */ + if ( ind_tmp[j] == k ) + { + corr[i][k] *= ( -thres1[j] / DELTA_COH * delta + thres1[j] + 1.0f ); /* Favour closer values */ + } + else + { + corr[i][k] *= ( -thres1[j] / DELTA_COH * 0.625f * delta + thres1[j] * 0.625f + 1.0f ); + } + } + } + } + } + } + } + /*---------------------* + * 2nd set of sections + *---------------------*/ + for ( k = sect0; k < NSECT; k++ ) /* loop for each section */ + { + if ( k == ( NSECT - 1 ) ) + { + K = 2; /* the number of tests depends on the section */ + } + else + { + K = 3; + } + for ( i = 0; i < K; i++ ) /* loop for the 2 half-frames and the look-ahead */ + { + /* Compare pitch values of the present frame */ + for ( j = 0; j < K; j++ ) /* Verify pitch coherence with neighbours (including past pitch) */ + { + if ( j != i ) /* Exclude itself */ + { + if ( corr_tmp[j + NHFR] >= CORR_TH1 ) /* reinforcement can happen only if the correlation is high enough */ + { + delta = (int16_t) abs( pitch[i][NSECT + k] - pitch_tmp[j + NHFR] ); /* Find difference of pitch values */ + coh_flag = pitch_coherence( (int16_t) pitch[i][NSECT + k], (int16_t) pitch_tmp[j + NHFR], COH_FAC, DELTA_COH ); + if ( coh_flag != 0 ) + { + /* Favour section-wise stability */ + if ( ind_tmp[j + NHFR] == ( NSECT + k ) ) + { + corr[i][NSECT + k] *= ( -thres1[j + NHFR] / DELTA_COH * delta + thres1[j + NHFR] + 1.0f ); /* Favour closer values */ + } + else + { + corr[i][NSECT + k] *= ( -thres1[j + NHFR] / DELTA_COH * 0.625f * delta + thres1[j + NHFR] * 0.625f + 1.0f ); + } + } + } + } + } + } + } + return; +} + +/*-----------------------------------------------------------------* + * pitch_coherence + * + * Verify if pitch evolution is smooth + *-----------------------------------------------------------------*/ + +static int16_t pitch_coherence( + const int16_t pitch0, /* i : first pitch to compare */ + const int16_t pitch1, /* i : 2nd pitch to compare */ + const float fac_max, /* i : max ratio of both values */ + const int16_t diff_max /* i : max difference of both values */ +) +{ + int16_t smaller, larger; + if ( pitch1 < pitch0 ) /* Finds smaller and larger of 2 short values */ + { + smaller = pitch1; + larger = pitch0; + } + else + { + smaller = pitch0; + larger = pitch1; + } + if ( ( (float) larger < fac_max * (float) smaller ) && ( ( larger - smaller ) < diff_max ) ) + { + return 1; + } + else + { + return 0; + } +} + + +/*-----------------------------------------------------------------* + * lp_decim2: + * + * Decimate a vector by 2 with 2nd order fir filter. + *-----------------------------------------------------------------*/ + +static void lp_decim2( + const float x[], /* i : signal to process */ + float y[], /* o : processed signals */ + const int16_t l, /* i : size of filtering */ + float *mem /* i/o: memory (size=3) */ +) +{ + const float *p_h; + float temp, *p_x, x_buf[L_FRAME_PLUS + L_MEM]; + int16_t i, j, k; + + /* copy initial filter states into buffer */ + p_x = x_buf; + for ( i = 0; i < L_MEM; i++ ) + { + *p_x++ = mem[i]; + } + for ( i = 0; i < l; i++ ) + { + *p_x++ = x[i]; + } + for ( i = 0; i < L_MEM; i++ ) + { + mem[i] = x[l - L_MEM + i]; + } + for ( i = 0, j = 0; i < l; i += 2, j++ ) + { + p_x = &x_buf[i]; + p_h = h_fir; + temp = 0.0f; + + for ( k = 0; k < L_FIR_PO; k++ ) + { + temp += *p_x++ * *p_h++; + } + y[j] = temp; + } + return; +} diff --git a/lib_enc/pitch_ol2.c b/lib_enc/pitch_ol2.c new file mode 100644 index 0000000000000000000000000000000000000000..b7864e75863e02e6aa90743099db651db9c7d034 --- /dev/null +++ b/lib_enc/pitch_ol2.c @@ -0,0 +1,334 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "rom_enc.h" +#include "prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * Local constants + *-------------------------------------------------------------------*/ + +#define MAX_DELTA 16 /* half-length of the delta search */ +#define COR_BUF_LEN ( L_INTERPOL1 * 2 + MAX_DELTA * 2 + 1 ) + +/*-------------------------------------------------------------------* + * pitch_ol2() + * + * Open-loop pitch precision improvement with 1/4 resolution + * The pitch is searched in the interval PIT_MAX ) + { + t0_max = PIT_MAX; + } + t_max = t0_max + L_INTERPOL1; + + pt_wsp = wsp + pos; + pt_cor = cor; + for ( t = t_min; t <= t_max; t++ ) + { + *pt_cor++ = dotp( pt_wsp, pt_wsp - t, L_SUBFR ); + } + + pt_cor = cor + L_INTERPOL1; + cor_max = *pt_cor++; + t1 = t0_min; + for ( t = t0_min + 1; t <= t0_max; t++ ) + { + if ( *pt_cor > cor_max ) + { + cor_max = *pt_cor; + t1 = t; + } + pt_cor++; + } + + /*------------------------------------------------------------------* + * Search fractional pitch with 1/4 subsample resolution. + * search the fractions around t0 and choose the one which maximizes + * the interpolated normalized correlation. + *-----------------------------------------------------------------*/ + + pt_cor = cor + L_INTERPOL1 - t0_min; + t0 = t1; + + step = 1; /* 1/4 subsample resolution */ + fraction = 1; + + if ( t0 == t0_min ) /* Limit case */ + { + fraction = 0; + cor_max = interpolation( &pt_cor[t0], E_ROM_inter4_1, fraction, PIT_UP_SAMP, 4 ); + } + else /* Process negative fractions */ + { + t0--; + cor_max = interpolation( &pt_cor[t0], E_ROM_inter4_1, fraction, PIT_UP_SAMP, 4 ); + for ( i = ( fraction + step ); i <= 3; i = i + step ) + { + temp = interpolation( &pt_cor[t0], E_ROM_inter4_1, i, PIT_UP_SAMP, 4 ); + if ( temp > cor_max ) + { + cor_max = temp; + fraction = i; + } + } + } + + for ( i = 0; i <= 3; i = i + step ) /* Process positive fractions */ + { + temp = interpolation( &pt_cor[t1], E_ROM_inter4_1, i, PIT_UP_SAMP, 4 ); + if ( temp > cor_max ) + { + cor_max = temp; + fraction = i; + t0 = t1; + } + } + + *pitch_fr = t0 + (float) fraction / 4.0f; + pred_lt4( pt_wsp, wsp_fr, t0, fraction, L_SUBFR, E_ROM_inter4_1, 4, PIT_UP_SAMP ); + + enr_wsp = dotp( pt_wsp, pt_wsp, L_SUBFR ) + 0.01f; + enr_old = dotp( wsp_fr, wsp_fr, L_SUBFR ) + 0.01f; + *voicing_fr = cor_max * inv_sqrt( enr_wsp * enr_old ); + + return; +} + + +/*-------------------------------------------------------------------* + * StableHighPitchDetect() + * + * Very short stable pitch detection + *-------------------------------------------------------------------*/ + +void StableHighPitchDetect( + int16_t *flag_spitch, /* o : flag to indicate very short stable pitch*/ + int16_t pitch[], /* i/o: OL pitch buffer */ + const float voicing[], /* i : OL pitch gains */ + const float Bin_E[], /* i : per bin log energy spectrum */ + const float wsp[], /* i : weighted speech */ + const int16_t localVAD, /* i : local VAD flag */ + float *voicing_sm, /* i/o: smoothed open-loop pitch gains */ + float *voicing0_sm, /* i/o: smoothed high pitch gains */ + float *LF_EnergyRatio_sm, /* i/o: smoothed [0, 300Hz] relative peak energy*/ + int16_t *predecision_flag, /* i/o: predecision flag */ + float *diff_sm, /* i/o: smoothed pitch frequency difference */ + float *energy_sm /* i/o: smoothed energy around pitch frequency */ +) +{ + int16_t i, pitch_freq_point, pit_min_up; + int16_t T, Tp, pit_min; + + float voicing_m; + float energy0, energy1, ratio, cor_max, diff, sum_energy; + const float *pt_wsp; + + voicing_m = mean( voicing, 3 ); + *voicing_sm = 0.75f * ( *voicing_sm ) + 0.25f * voicing_m; + + + /* initial short pitch possibility pre-decision */ + pitch_freq_point = (int16_t) ( L_FFT / pitch[1] + 0.5f ); + diff = 0.0f; + sum_energy = 0.0f; + + for ( i = 1; i < 2 * pitch_freq_point; i++ ) + { + diff += ( Bin_E[pitch_freq_point] - Bin_E[i] ); + sum_energy += Bin_E[i]; + } + sum_energy /= ( 2 * pitch_freq_point - 1 ); + + *diff_sm = 0.2f * diff + 0.8f * *diff_sm; + *energy_sm = 0.2f * sum_energy + 0.8f * *energy_sm; + diff /= sum_energy; + + if ( *diff_sm < -10 && *energy_sm < 38.5 && diff < -0.8 ) + { + *predecision_flag = 1; + } + + if ( *diff_sm > 10 && *energy_sm > 83 && diff > 0.5 ) + { + *predecision_flag = 0; + } + + /* short pitch possiblity pre-decision */ + maximum( Bin_E, 7, &energy0 ); + maximum( Bin_E + 8, 7, &energy1 ); + ratio = max( energy1 - energy0, 0 ); + ratio *= max( voicing_m, 0 ); + + *LF_EnergyRatio_sm = ( 15 * ( *LF_EnergyRatio_sm ) + ratio ) / 16; + + if ( *LF_EnergyRatio_sm > 35 || ratio > 50 ) + { + *predecision_flag = 1; + } + + if ( *LF_EnergyRatio_sm < 16 ) + { + *predecision_flag = 0; + } + + /* short pitch candidate detection */ + Tp = pitch[1]; + cor_max = 0; + + pt_wsp = wsp + 3 * L_SUBFR; + pit_min = PIT_MIN_DOUBLEEXTEND; + pit_min_up = PIT_MIN; + + for ( T = pit_min; T <= pit_min_up; T++ ) + { + energy1 = dotp( pt_wsp, pt_wsp - T, L_SUBFR ); + + if ( energy1 > cor_max || T == pit_min ) + { + cor_max = energy1; + Tp = T; + } + } + + energy0 = dotp( pt_wsp, pt_wsp, L_SUBFR ) + 0.01f; + energy1 = dotp( pt_wsp - Tp, pt_wsp - Tp, L_SUBFR ) + 0.01f; + cor_max *= inv_sqrt( energy0 * energy1 ); + *voicing0_sm = 0.75f * ( *voicing0_sm ) + 0.25f * cor_max; + + /* final short pitch correction */ + *flag_spitch = 0; + if ( localVAD && *predecision_flag && *voicing0_sm > 0.65f && *voicing0_sm > 0.7f * ( *voicing_sm ) ) + { + *flag_spitch = 1; + + pitch[0] = Tp; + pitch[1] = Tp; + pitch[2] = Tp; + } + + return; +} + +/*-------------------------------------------------------------------* + * pitchDoubling_det() + * Multiple pitch doubling detector + * + *-------------------------------------------------------------------*/ + +void pitchDoubling_det( + const float *wspeech, + int16_t *pitch_ol, + float *pitch_fr, + float *voicing_fr ) +{ + float new_op_fr[2]; + float new_voicing[2]; + int16_t new_Top[2]; + int16_t m, T; + + /*save initial values*/ + new_Top[0] = pitch_ol[0]; + new_Top[1] = pitch_ol[1]; + for ( m = 2; m < 5; m++ ) + { + T = pitch_ol[0] / m; + if ( T >= PIT_MIN_12k8 ) + { + pitch_ol2( PIT_MIN_SHORTER, T, &new_op_fr[0], &new_voicing[0], 0, wspeech, 2 ); + pitch_ol2( PIT_MIN_SHORTER, T, &new_op_fr[1], &new_voicing[1], L_SUBFR, wspeech, 2 ); + + if ( ( new_voicing[0] + new_voicing[1] ) > ( voicing_fr[0] + voicing_fr[1] ) ) + { + new_Top[0] = T; + pitch_fr[0] = new_op_fr[0]; + pitch_fr[1] = new_op_fr[1]; + voicing_fr[0] = new_voicing[0]; + voicing_fr[1] = new_voicing[1]; + } + } + + T = pitch_ol[1] / m; + if ( T >= PIT_MIN_12k8 ) + { + pitch_ol2( PIT_MIN_SHORTER, T, &new_op_fr[0], &new_voicing[0], 2 * L_SUBFR, wspeech, 2 ); + pitch_ol2( PIT_MIN_SHORTER, T, &new_op_fr[1], &new_voicing[1], 3 * L_SUBFR, wspeech, 2 ); + + if ( ( new_voicing[0] + new_voicing[1] ) > ( voicing_fr[2] + voicing_fr[3] ) ) + { + new_Top[1] = T; + pitch_fr[2] = new_op_fr[0]; + pitch_fr[3] = new_op_fr[1]; + voicing_fr[2] = new_voicing[0]; + voicing_fr[3] = new_voicing[1]; + } + } + } + pitch_ol[0] = new_Top[0]; + pitch_ol[1] = new_Top[1]; + + return; +} diff --git a/lib_enc/plc_enc_ext.c b/lib_enc/plc_enc_ext.c new file mode 100644 index 0000000000000000000000000000000000000000..8e5cfc382da8a37a93807869ed3fae2213181c61 --- /dev/null +++ b/lib_enc/plc_enc_ext.c @@ -0,0 +1,136 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "prot.h" +#include "stat_enc.h" +#include "cnst.h" +#include "rom_com.h" +#include "wmc_auto.h" + +#define NBITS_GACELP 5 + +/*-------------------------------------------------------------------* + * init_PLC_enc() + * + * + *-------------------------------------------------------------------*/ + +void init_PLC_enc( + PLC_ENC_EVS_HANDLE hPlcExt, + const int32_t sr_core ) +{ + int16_t itr; + + hPlcExt->enableGplc = 0; + hPlcExt->calcOnlylsf = 1; + hPlcExt->nBits = NBITS_GACELP; + hPlcExt->stab_fac = 0; + set_f( hPlcExt->lsfoldbfi0, 0.0f, M ); + set_f( hPlcExt->lsfoldbfi1, 0.0f, M ); + set_f( hPlcExt->lsf_adaptive_mean, 0.0f, M ); + set_f( hPlcExt->old_exc, 0.0f, 8 ); + set_f( hPlcExt->mem_MA, 0.0f, M ); + set_f( hPlcExt->lsfold, 0.0f, M ); + set_f( hPlcExt->lspold, 0.0f, M ); + + if ( sr_core == INT_FS_12k8 ) + { + hPlcExt->T0_4th = L_SUBFR; + hPlcExt->T0 = L_SUBFR; + for ( itr = 0; itr < M; itr++ ) + { + hPlcExt->lsf_con[itr] = lsf_init[itr]; + hPlcExt->last_lsf_ref[itr] = lsf_init[itr]; + hPlcExt->last_lsf_con[itr] = lsf_init[itr]; + } + } + else + { + hPlcExt->T0_4th = L_SUBFR; + hPlcExt->T0 = L_SUBFR; + for ( itr = 0; itr < M; itr++ ) + { + hPlcExt->lsf_con[itr] = lsf_init[itr] * 1.25f; + hPlcExt->last_lsf_ref[itr] = lsf_init[itr] * 1.25f; + hPlcExt->last_lsf_con[itr] = lsf_init[itr] * 1.25f; + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * gPLC_encInfo() + * + * Function to extract and write guided information + *-------------------------------------------------------------------*/ + +void gPLC_encInfo( + PLC_ENC_EVS_HANDLE hPlcExt, + const int32_t total_brate, + const int16_t bwidth, + const int16_t last_clas, + const int16_t coder_type ) +{ + if ( hPlcExt ) + { + hPlcExt->calcOnlylsf = 1; + if ( bwidth >= WB && total_brate == ACELP_24k40 ) + { + hPlcExt->enableGplc = 1; + + if ( ( last_clas == VOICED_CLAS || last_clas == ONSET ) && ( coder_type == VOICED || coder_type == GENERIC ) ) + { + hPlcExt->nBits = NBITS_GACELP; + hPlcExt->calcOnlylsf = 0; + } + else + { + hPlcExt->nBits = 1; + } + } + else + { + hPlcExt->enableGplc = 0; + hPlcExt->nBits = 0; + } + } + + return; +} diff --git a/lib_enc/ppp_enc.c b/lib_enc/ppp_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..d55cb135dd440de26da83b9d845347779fbf9915 --- /dev/null +++ b/lib_enc/ppp_enc.c @@ -0,0 +1,471 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + + +/*-------------------------------------------------------------------* + * DTFS_getSpEngyFromResAmp() + * + * Get speech energy from the DTFS + *-------------------------------------------------------------------*/ + +static float DTFS_getSpEngyFromResAmp( + DTFS_STRUCTURE X, /* i : DTFS */ + float lband, /* i : Low band end to get energy from */ + float hband, /* i : High band end to get energy from */ + const float *curr_lsp /* i : LPCs */ +) +{ + int16_t i, k; + float w, tmp, Re, Im; + double en, freq, fdiff; + + fdiff = (float) INT_FS_12k8 / X.lag; + + if ( hband == X.upper_cut_off_freq ) + { + hband = 4001.0; + } + + en = 0.0f; + for ( freq = 0.0, k = 0; k <= min( X.lag >> 1, X.nH_4kHz ); k++, freq += fdiff ) + { + if ( X.a[k] < 0.0 ) + { + X.a[k] = 0.0; + } + + if ( freq < hband && freq >= lband ) + { + Re = 1.0f; + Im = 0.0f; + tmp = (float) ( PI2 * freq / (float) INT_FS_12k8 ); + for ( i = 0, w = tmp; i < M + 1; i++, w += tmp ) + { + Re += (float) ( curr_lsp[i] * cos( w ) ); + Im -= (float) ( curr_lsp[i] * sin( w ) ); + } + if ( k == 0 || ( X.lag % 2 == 0 && k == X.lag >> 1 ) ) + { + en += X.a[k] * X.a[k] / ( Re * Re + Im * Im ); + } + else + { + en += 2.0 * X.a[k] * X.a[k] / ( Re * Re + Im * Im ); + } + } + } + return ( (float) en ); +} + +/*-------------------------------------------------------------------* + * DTFS_quant_cw() + * + * DTFS quantization + *-------------------------------------------------------------------*/ + +#define P_CBSIZE 64 + +static int16_t DTFS_quant_cw( + DTFS_STRUCTURE *X, /* i/o: DTFS unquant inp, quant out */ + const int16_t pl, /* i : Previous lag */ + const float *curr_lpc, /* i : LPC */ + int16_t *POWER_IDX, /* o : Power index */ + int16_t *AMP_IDX, /* o : Amplitude index */ + float *lastLgainE, /* i/o: last frame lowband gain */ + float *lastHgainE, /* i/o: last frame highband gain */ + float *lasterbE /* i/o: last frame ERB vector */ +) +{ + int16_t num_erb = 0; + const float( *PowerCB )[2] = NULL; + float G_CURR_ERB[NUM_ERB_WB]; + float G_A_POWER[2]; + float tmp, w[2], target1, target2, error, minerror; + float mfreq[NUM_ERB_WB], diff_erb[NUM_ERB_WB], curr_erb[NUM_ERB_WB]; + int16_t j, slot[NUM_ERB_WB], bincount; + int16_t returnFlag = 1; + float amperror; + + if ( X->upper_cut_off_freq == 4000.0 ) + { + num_erb = NUM_ERB_NB; + PowerCB = PowerCB_NB; + } + else if ( X->upper_cut_off_freq == 6400.0 ) + { + num_erb = NUM_ERB_WB; + PowerCB = PowerCB_WB; + } + + /* Getting the Speech Domain Energy LOG Ratio */ + w[0] = (float) max( 1E-10, log10( DTFS_getSpEngyFromResAmp( *X, 0.0, 1104.5, curr_lpc ) ) ); + w[1] = (float) max( 1E-10, log10( DTFS_getSpEngyFromResAmp( *X, 1104.5, X->upper_cut_off_freq, curr_lpc ) ) ); + tmp = w[0] + w[1]; + w[0] /= tmp; + w[1] /= tmp; + + /* Power Quantization */ + G_A_POWER[0] = (float) log10( X->lag * DTFS_setEngyHarm( 92.0, 1104.5, 0.0, 1104.5, 1.0, X ) ); + G_A_POWER[1] = (float) log10( X->lag * DTFS_setEngyHarm( 1104.5, X->upper_cut_off_freq_of_interest, 1104.5, X->upper_cut_off_freq, 1.0, X ) ); + target1 = G_A_POWER[0] - *lastLgainE; + target2 = G_A_POWER[1] - *lastHgainE; + minerror = (float) HUGE_VAL; + *POWER_IDX = -1; + for ( j = 0; j < P_CBSIZE; j++ ) + { + error = (float) ( w[0] * fabs( target1 - PowerCB[j][0] ) + w[1] * fabs( target2 - PowerCB[j][1] ) ); + if ( ( target1 >= PowerCB[j][0] ) && ( target2 >= PowerCB[j][1] ) ) + { + error *= 0.8f; + } + if ( error < minerror ) + { + minerror = error; + *POWER_IDX = j; + } + } + DTFS_to_erb( *X, curr_erb ); + + for ( j = 0; j < num_erb; j++ ) + { + G_CURR_ERB[j] = curr_erb[j]; + } + erb_slot( X->lag, slot, mfreq, num_erb ); + /* Amplitude Quantization */ + erb_diff( lasterbE, pl, curr_erb, X->lag, curr_lpc, diff_erb, AMP_IDX, num_erb ); + + /* Amplitude Dequantization */ + erb_add( curr_erb, X->lag, lasterbE, pl, AMP_IDX, num_erb ); + curr_erb[0] = curr_erb[1] * 0.3f; + curr_erb[num_erb - 2] = curr_erb[num_erb - 3] * 0.3f; + curr_erb[num_erb - 1] = 0; + /* Determine if the amplitude quantization is good enough */ + amperror = 0.0; + bincount = 0; + for ( j = 1; j < 10; j++ ) + { + if ( slot[j] != 0 ) + { + amperror += (float) ( fabs( G_CURR_ERB[j] - curr_erb[j] ) ); + bincount++; + } + } + amperror /= bincount; + + if ( ( amperror > 0.47 ) && ( target1 > -0.4 ) ) + { + returnFlag = 0; /* Bumping up */ + } + + DTFS_erb_inv( curr_erb, slot, mfreq, X, num_erb ); + + /* Back up the lasterbE memory after power normalization */ + DTFS_setEngyHarm( 92.0, 1104.5, 0.0, 1104.5, 1.0, X ); + DTFS_setEngyHarm( 1104.5, X->upper_cut_off_freq_of_interest, 1104.5, X->upper_cut_off_freq, 1.0, X ); + + DTFS_to_erb( *X, lasterbE ); + + /* Power Dequantization */ + *lastLgainE += (float) PowerCB[*POWER_IDX][0]; + *lastHgainE += (float) PowerCB[*POWER_IDX][1]; + target1 = (float) pow( 10.0, (double) ( *lastLgainE ) ) / X->lag; + + if ( !( target1 >= 0.0 ) ) + { + target1 = 0; + } + + DTFS_setEngyHarm( 92.0f, 1104.5f, 0.0f, 1104.5f, target1, X ); + target2 = (float) pow( 10.0, (double) ( *lastHgainE ) ) / X->lag; + + if ( !( target2 >= 0.0 ) ) + { + target2 = 0; + } + + DTFS_setEngyHarm( 1104.5, X->upper_cut_off_freq_of_interest, 1104.5, X->upper_cut_off_freq, target2, X ); + + return returnFlag; /* amp quant performance pass/fail */ +} + +/*-------------------------------------------------------------------* + * DTFS_alignment_fine_new() + * + * Shift value for DTFS finer alignment. + *-------------------------------------------------------------------*/ + +static float DTFS_alignment_fine_new( + DTFS_STRUCTURE X1_DTFS, /* i : X1 the reference DTFS to keep fixed */ + DTFS_STRUCTURE X2_DTFS, /* i : X2 the test DTFS to shift to find best match */ + float Eshift /* i : Expected shift - coarse value */ +) +{ + int16_t k; + float maxcorr, corr, Adiff, diff, tmp, tmp1, fshift, n; + + if ( X1_DTFS.lag < X2_DTFS.lag ) + { + DTFS_zeroPadd( X2_DTFS.lag, &X1_DTFS ); + } + maxcorr = (float) -HUGE_VAL; + fshift = Eshift; + Adiff = 20.0f; + diff = 1.0f; + for ( n = Eshift - Adiff + 1; n <= Eshift + Adiff; n += diff ) + { + corr = tmp = 0.0; + /* bit-exact optimization - PI2/X2_DTFS.lag should be counted as a single divide outside loops */ + tmp1 = (float) ( PI2 * n / X2_DTFS.lag ); + + for ( k = 0; k <= min( X2_DTFS.lag >> 1, X2_DTFS.nH ); k++, tmp += tmp1 ) + { + corr += (float) ( ( X1_DTFS.a[k] * X2_DTFS.a[k] + X1_DTFS.b[k] * X2_DTFS.b[k] ) * cos( tmp ) ); + corr += (float) ( ( X1_DTFS.b[k] * X2_DTFS.a[k] - X1_DTFS.a[k] * X2_DTFS.b[k] ) * sin( tmp ) ); + } + if ( corr * ( 1.0f - 0.01f * fabs( n - Eshift ) ) > maxcorr ) + { + fshift = n; + maxcorr = corr; + } + } + + return fshift; /* o : shift value to shift X2 by */ +} + + +/*-------------------------------------------------------------------* + * ppp_quarter_encoder() + * + * PPP quarter encoder + *--------------------------------------------------------------------*/ + +ivas_error ppp_quarter_encoder( + int16_t *returnFlag, /* o : return value */ + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + DTFS_STRUCTURE *CURRCW_Q, /* o : Quantized (amp/phase) DTFS */ + DTFS_STRUCTURE *TARGETCW, /* o : DTFS with quant phase but unquant Amp */ + const int16_t prevCW_lag, /* i : previous lag */ + DTFS_STRUCTURE vCURRCW_NQ, /* i : Unquantized DTFS */ + const float *curr_lpc, /* i : LPCS */ + float *lastLgainE, /* i/o: last low band gain */ + float *lastHgainE, /* i/o: last high band gain */ + float *lasterbE, /* i/o: last ERB vector */ + DTFS_STRUCTURE PREV_CW_E /* i : past DTFS */ +) +{ + DTFS_STRUCTURE *PREVDTFS; + float tmp, temp_pl, temp_l; + int16_t l; + int16_t POWER_IDX; /* Codebook index for the power quantization for PPP */ + int16_t AMP_IDX[2]; /* Codebook index for the Amplitude quantization for PPP */ + float Erot = 0.0, z = 0.0; + ivas_error error; + + error = IVAS_ERR_OK; + *returnFlag = 1; + + if ( ( error = DTFS_new( &PREVDTFS ) ) != IVAS_ERR_OK ) + { + return error; + } + + + DTFS_copy( CURRCW_Q, vCURRCW_NQ ); + DTFS_copy( PREVDTFS, PREV_CW_E ); + + l = CURRCW_Q->lag; + temp_l = (float) CURRCW_Q->lag; + temp_pl = (float) prevCW_lag; + + DTFS_adjustLag( PREVDTFS, l ); + + z = ( ( L_FRAME - temp_l ) * ( temp_l + temp_pl ) ) / ( 2 * temp_l * temp_pl ); + + Erot = (float) ( temp_l - rint_new( temp_l * ( z - floor( z ) ) ) ); + + DTFS_phaseShift( PREVDTFS, (float) ( PI2 * Erot / CURRCW_Q->lag ) ); + DTFS_car2pol( PREVDTFS ); + + /* Amplitude Quantization */ + DTFS_car2pol( CURRCW_Q ); /* at this point currCW_q=curr_nq */ + + *returnFlag = DTFS_quant_cw( CURRCW_Q, prevCW_lag, curr_lpc, &POWER_IDX, AMP_IDX, lastLgainE, lastHgainE, lasterbE ); + + push_indice( hBstr, IND_AMP0, AMP_IDX[0], 6 ); + push_indice( hBstr, IND_AMP1, AMP_IDX[1], 6 ); + push_indice( hBstr, IND_POWER, POWER_IDX, 6 ); + + DTFS_copy( TARGETCW, *CURRCW_Q ); + + /* Copying phase spectrum over */ + mvr2r( PREVDTFS->b, CURRCW_Q->b, (int16_t) ( CURRCW_Q->lag >> 1 ) + 1 ); + + DTFS_pol2car( CURRCW_Q ); + DTFS_pol2car( TARGETCW ); + tmp = DTFS_alignment_fine_new( *TARGETCW, *CURRCW_Q, 0.0 ); + + if ( ( ( tmp + 3 ) > 7 ) || ( ( tmp + 3 ) < 0 ) ) + { + tmp = 0; + *returnFlag = 0; + } + + DTFS_phaseShift( CURRCW_Q, (float) ( PI2 * tmp / CURRCW_Q->lag ) ); + + push_indice( hBstr, IND_GLOBAL_ALIGNMENT, (int16_t) ( tmp + 3 ), 3 ); + + free( PREVDTFS ); + + return error; +} + + +/*-------------------------------------------------------------------* + * set_ppp_mode() + * + * Determine if the current frame should be coded by PPP or not + * Impose PPP - CELP - CELP pattern + *-------------------------------------------------------------------*/ + +void set_ppp_mode( + Encoder_State *st, /* i/o: encoder state structure */ + const int16_t noisy_speech_HO, /* i : SC-VBR noisy speech HO flag */ + const int16_t clean_speech_HO, /* i : SC-VBR clean speech HO flag */ + const int16_t NB_speech_HO, /* i : SC-VBR NB speech HO flag */ + const int16_t localVAD_he /* i : HE-SAD flag without hangover*/ +) +{ + SC_VBR_ENC_HANDLE hSC_VBR = st->hSC_VBR; + + if ( st->vad_flag == 1 && + ( noisy_speech_HO == 1 || clean_speech_HO == 1 || NB_speech_HO == 1 ) && + ( st->localVAD == 0 || localVAD_he == 0 ) ) + { + st->coder_type = UNVOICED; + } + + if ( st->coder_type == INACTIVE && st->vad_flag == 0 && hSC_VBR->last_nelp_mode == 1 ) /* avoid HO frame go to GSC */ + { + st->coder_type = UNVOICED; + } + + /* force the coder to NELP mode during the first five frames */ + /* this will indicate the decoder that the coder is operating in the VBR mode */ + if ( st->ini_frame < 5 ) + { + st->coder_type = UNVOICED; + st->vad_flag = 1; + } + + /* Pattern PPP-CELP-CELP (pppcountE holds number of consecutive PPP frames) */ + if ( st->coder_type != VOICED || st->last_coder_type == TRANSITION ) + { + /* ensure no transient to PPP transition */ + hSC_VBR->pppcountE = 0; + } + else + { + /* current mode is voiced */ + hSC_VBR->pppcountE++; + + if ( ( hSC_VBR->pppcountE == 1 && hSC_VBR->last_last_ppp_mode != 1 && !hSC_VBR->rate_control ) || + ( hSC_VBR->pppcountE == 1 && hSC_VBR->mode_QQF ) ) + { + hSC_VBR->ppp_mode = 1; + st->core_brate = PPP_NELP_2k80; + } + else if ( hSC_VBR->pppcountE == 2 ) + { + if ( hSC_VBR->last_ppp_mode == 1 && !hSC_VBR->mode_QQF ) + { + /* QFF mode */ + hSC_VBR->ppp_mode = 0; + } + else + { + /* QQF Mode */ + hSC_VBR->ppp_mode = 1; + st->core_brate = PPP_NELP_2k80; + } + } + else + { + hSC_VBR->ppp_mode = 0; + hSC_VBR->pppcountE = 0; + } + } + + if ( hSC_VBR->ppp_mode == 0 && hSC_VBR->set_ppp_generic == 1 ) + { + hSC_VBR->set_ppp_generic = 0; + st->coder_type = GENERIC; + } + + if ( st->last_core == HQ_CORE ) + { + hSC_VBR->ppp_mode = 0; + hSC_VBR->set_ppp_generic = 0; + st->coder_type = TRANSITION; + } + + if ( hSC_VBR->last_ppp_mode && !hSC_VBR->ppp_mode && st->sp_aud_decision1 && st->bwidth == NB && st->Opt_SC_VBR ) /*if it were about to go from ppp->HQ*/ + { + hSC_VBR->avoid_HQ_VBR_NB = 1; + st->coder_type = GENERIC; + } + + if ( hSC_VBR->last_nelp_mode && st->sp_aud_decision1 && st->bwidth == NB && st->Opt_SC_VBR ) /*if it were about to go from nelp->HQ*/ + { + hSC_VBR->avoid_HQ_VBR_NB = 1; + st->coder_type = GENERIC; + } + + if ( ( ( st->old_pitch_buf[( 2 * NB_SUBFR ) - 1] > PPP_LAG_THRLD ) || ( st->pitch[1] > PPP_LAG_THRLD ) || !st->last_Opt_SC_VBR ) && ( hSC_VBR->ppp_mode == 1 ) ) + { + hSC_VBR->ppp_mode = 0; + st->core_brate = ACELP_7k20; + } + + return; +} diff --git a/lib_enc/pre_proc.c b/lib_enc/pre_proc.c new file mode 100644 index 0000000000000000000000000000000000000000..b12ee341076b33e0b846b3fe776096280ab9fbea --- /dev/null +++ b/lib_enc/pre_proc.c @@ -0,0 +1,962 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "rom_enc.h" +#include "rom_com.h" +#include "prot.h" +#include "wmc_auto.h" + + +/*-------------------------------------------------------------------* + * pre_proc() + * + * Pre-processing (spectral analysis, LP analysis, VAD, OL pitch calculation, coder mode selection, ...) + *--------------------------------------------------------------------*/ + +void pre_proc( + Encoder_State *st, /* i/o: encoder state structure */ + const int16_t input_frame, /* i : frame length */ + float old_inp_12k8[], /* i/o: buffer of old input signal */ + float old_inp_16k[], /* i/o: buffer of old input signal @ 16kHz */ + float **inp, /* o : ptr. to inp. signal in the current frame*/ + float fr_bands[2 * NB_BANDS], /* i : energy in frequency bands */ + float *ener, /* o : residual energy from Levinson-Durbin */ +#ifndef FIX_I4_OL_PITCH + int16_t pitch_orig[3], /* o : open-loop pitch values for quantization */ +#endif + float A[NB_SUBFR16k * ( M + 1 )], /* i/o: A(z) unquantized for the 4 subframes */ + float Aw[NB_SUBFR16k * ( M + 1 )], /* i/o: weighted A(z) unquantized for subframes */ + float epsP[M + 1], /* i/o: LP prediction errors */ + float lsp_new[M], /* i/o: LSPs at the end of the frame */ + float lsp_mid[M], /* i/o: LSPs in the middle of the frame */ + int16_t *vad_hover_flag, /* i : VAD hangover flag */ + int16_t *attack_flag, /* o : attack flag */ + float *new_inp_resamp16k, /* o : new input signal @16kHz, non pre-emphasised, used by the WB TBE/BWE */ + int16_t *Voicing_flag, /* o : voicing flag for HQ FEC */ + float realBuffer[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i/o: real buffer */ + float imagBuffer[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i/o: imag buffer */ + int16_t *hq_core_type /* o : HQ core type */ +) +{ + int16_t delay; + const float *signal_in; + float *inp_12k8, *new_inp_12k8, *inp_16k, *new_inp_16k; /* pointers to current frame and new data */ + float old_wsp[L_WSP], *wsp; /* weighted input signal buffer */ + float pitch_fr[NB_SUBFR]; /* fractional pitch values */ + float voicing_fr[NB_SUBFR]; /* fractional pitch gains */ + float Etot; /* total energy */ + float lf_E[2 * VOIC_BINS]; /* per bin spectrum energy in lf */ + float tmpN[NB_BANDS]; /* Temporary noise update */ + float tmpE[NB_BANDS]; /* Temporary averaged energy of 2 sf. */ + float ee[2]; /* Spectral tilt */ + float corr_shift; /* correlation shift */ + float relE; /* frame relative energy */ + int16_t loc_harm; /* harmonicity flag */ + float cor_map_sum, sp_div, PS[128]; /* speech/music clasif. parameters */ + int16_t L_look; /* length of look-ahead */ + float snr_sum_he; /* HE SAD parameters */ + int16_t localVAD_HE_SAD; /* HE SAD parameters */ + int16_t vad_flag_dtx; /* HE-SAD flag with additional DTX HO */ + int16_t vad_flag_cldfb; + float old_cor; + float hp_E[2]; /* Energy in HF */ + int16_t noisy_speech_HO, clean_speech_HO, NB_speech_HO; /* SC-VBR HO flags */ + float non_staX; /* unbound non-stationarity for sp/mus clas. */ + int32_t sr_core_tmp; + int16_t L_frame_tmp; + int16_t flag_spitch; + float lsf_new[M], stab_fac; + float band_energies[2 * NB_BANDS]; /* energy in critical bands without minimum noise floor E_MIN */ + float enerBuffer[CLDFB_NO_CHANNELS_MAX]; + float currFlatness; + int16_t high_lpn_flag; + int16_t cldfb_addition; + int16_t alw_pitch_lag_12k8[2]; + float alw_voicing[2]; + float fft_buff[2 * L_FFT]; + float sp_floor; + int16_t last_core_orig; + int16_t clas_mod; + int16_t old_pitch1; + + push_wmops( "pre_proc" ); + + /*------------------------------------------------------------------* + * Initialization + *------------------------------------------------------------------*/ + + signal_in = st->input; + + localVAD_HE_SAD = 0; + NB_speech_HO = 0; + clean_speech_HO = 0; + noisy_speech_HO = 0; + snr_sum_he = 0; + currFlatness = 0; + + *vad_hover_flag = 0; + st->sp_aud_decision1 = 0; + st->sp_aud_decision2 = 0; + st->coder_type = GENERIC; + st->hGSCEnc->noise_lev = NOISE_LEVEL_SP0; + *attack_flag = 0; + + if ( st->hSC_VBR != NULL ) + { + st->hSC_VBR->bump_up = 0; + st->hSC_VBR->ppp_mode = 0; + st->hSC_VBR->nelp_mode = 0; + st->hSC_VBR->avoid_HQ_VBR_NB = 0; + } + + L_look = L_LOOK_12k8; /* lookahead at 12.8kHz */ + + new_inp_12k8 = old_inp_12k8 + L_INP_MEM; /* pointer to new samples of the input signal in 12.8kHz core */ + inp_12k8 = new_inp_12k8 - L_look; /* pointer to the current frame of input signal in 12.8kHz core */ + mvr2r( st->old_inp_12k8, old_inp_12k8, L_INP_MEM ); + + mvr2r( st->old_wsp, old_wsp, L_WSP_MEM ); + wsp = old_wsp + L_WSP_MEM; /* pointer to the current frame of weighted signal in 12.8kHz core */ + + old_cor = st->old_corr; /* save old_cor for speech/music classifier */ + + st->rf_mode = st->Opt_RF_ON; + + last_core_orig = st->last_core; + + /*--------------------------------------------------------------* + * Cldfb analysis + *---------------------------------------------------------------*/ + + st->prevEnergyHF = st->currEnergyHF; + + analysisCldfbEncoder( st, signal_in, input_frame, realBuffer, imagBuffer, enerBuffer ); + + /*----------------------------------------------------------------* + * Change the sampling frequency to 12.8 kHz + *----------------------------------------------------------------*/ + + modify_Fs( signal_in, input_frame, st->input_Fs, new_inp_12k8, INT_FS_12k8, st->mem_decim, ( st->max_bwidth == NB ) ); + + /* save input resampled at 12.8kHz, non-preemhasised */ + mvr2r( new_inp_12k8, st->buf_speech_enc + L_FRAME32k, L_FRAME ); + + /*------------------------------------------------------------------* + * Perform fixed preemphasis (12.8 kHz signal) through 1 - g*z^-1 + *-----------------------------------------------------------------*/ + + preemph( new_inp_12k8, PREEMPH_FAC, L_FRAME, &st->mem_preemph ); + + /*-------------------------------------------------------------------------* + * Spectral analysis + *--------------------------------------------------------------------------*/ + + analy_sp( -1, NULL, st->input_Fs, inp_12k8, st->Bin_E, st->Bin_E_old, fr_bands, lf_E, &Etot, st->min_band, st->max_band, band_energies, PS, fft_buff ); + + /*----------------------------------------------------------------* + * SAD (1-signal, 0-noise) + *----------------------------------------------------------------*/ + + noise_est_pre( Etot, st->ini_frame, st->hNoiseEst, 0, EVS_MONO, EVS_MONO ); + + st->vad_flag = wb_vad( st, fr_bands, &noisy_speech_HO, &clean_speech_HO, &NB_speech_HO, &snr_sum_he, &localVAD_HE_SAD, &( st->flag_noisy_speech_snr ), NULL, NULL, -1000.0f, -1000.0f ); + + vad_flag_cldfb = vad_proc( realBuffer, imagBuffer, enerBuffer, st->cldfbAnaEnc->no_channels, st->hVAD_CLDFB, &cldfb_addition, st->vad_flag ); + + if ( st->Pos_relE_cnt < 20 ) /* Ensure the level is high enough and cldfb decision is reliable */ + { + /* Combine decisions from SADS */ + if ( st->vad_flag == 1 && vad_flag_cldfb == 0 ) + { + st->localVAD = 0; + } + + st->vad_flag = vad_flag_cldfb; + } + + vad_flag_dtx = dtx_hangover_addition( st, st->vad_flag, st->lp_speech - st->lp_noise, cldfb_addition, vad_hover_flag, NULL, NULL, NULL ); + + /*----------------------------------------------------------------* + * NB/WB/SWB/FB bandwidth detector + *----------------------------------------------------------------*/ + + bw_detect( st, st->input, NULL, enerBuffer, MONO_FORMAT, 0 ); + + /*----------------------------------------------------------------* + * Noise energy down-ward update and total noise energy estimation + * Long-term energies and relative frame energy updates + * Correlation correction as a function of total noise level + *----------------------------------------------------------------*/ + + noise_est_down( fr_bands, st->hNoiseEst->bckr, tmpN, tmpE, st->min_band, st->max_band, &st->hNoiseEst->totalNoise, Etot, &st->hNoiseEst->Etot_last, &st->hNoiseEst->Etot_v_h2 ); + + relE = Etot - st->lp_speech; + + if ( relE > 1.5f ) + { + st->Pos_relE_cnt = 0; + } + else if ( relE < 0.0f && st->vad_flag == 1 ) + { + st->Pos_relE_cnt++; + } + corr_shift = correlation_shift( st->hNoiseEst->totalNoise ); + + /*----------------------------------------------------------------* + * FD-CNG Noise Estimator + *----------------------------------------------------------------*/ + + resetFdCngEnc( st ); + + perform_noise_estimation_enc( band_energies, enerBuffer, st->hFdCngEnc, 1, NULL ); + + /*-----------------------------------------------------------------* + * Select SID or FRAME_NO_DATA frame if DTX enabled + *-----------------------------------------------------------------*/ + dtx( st, -1, vad_flag_dtx, inp_12k8 ); + /*----------------------------------------------------------------* + * Adjust FD-CNG Noise Estimator + *----------------------------------------------------------------*/ + + if ( ( st->last_total_brate != st->total_brate ) || ( st->last_bwidth != st->bwidth ) ) + { + configureFdCngEnc( st->hFdCngEnc, st->bwidth, st->rf_mode && st->total_brate == ACELP_13k20 ? ACELP_9k60 : st->total_brate ); + } + if ( st->hFdCngEnc != NULL && st->Opt_DTX_ON ) + { + AdjustFirstSID( st ); + } + + /*----------------------------------------------------------------* + * Reconfigure Mode 2 + *----------------------------------------------------------------*/ + + if ( st->codec_mode == MODE2 ) + { + SetModeIndex( st, st->last_total_brate, EVS_MONO, 0 ); + } + + calcLoEnvCheckCorrHiLo( st->cldfbAnaEnc->no_col, freqTable, st->hTECEnc->loBuffer, st->hTECEnc->loTempEnv, st->hTECEnc->loTempEnv_ns, st->hTECEnc->hiTempEnv, &( st->hTECEnc->corrFlag ) ); + + /*---------------------------------------------------------------* + * Time Domain Transient Detector + *---------------------------------------------------------------*/ + + if ( st->tcx10Enabled || st->tcx20Enabled ) + { + RunTransientDetection( signal_in, input_frame, st->hTranDet ); + + currFlatness = GetTCXAvgTemporalFlatnessMeasure( st->hTranDet, NSUBBLOCKS, 0 ); + } + + /*----------------------------------------------------------------* + * LP analysis + *----------------------------------------------------------------*/ + + alw_pitch_lag_12k8[0] = st->old_pitch_la; + alw_pitch_lag_12k8[1] = st->old_pitch_la; + alw_voicing[0] = st->voicing[2]; + alw_voicing[1] = st->voicing[2]; + + analy_lp( inp_12k8, L_FRAME, L_look, ener, A, epsP, lsp_new, lsp_mid, st->lsp_old1, alw_pitch_lag_12k8, alw_voicing, INT_FS_12k8, -1 ); + + lsp2lsf( lsp_new, lsf_new, M, INT_FS_12k8 ); + stab_fac = lsf_stab( lsf_new, st->lsf_old1, 0, L_FRAME ); + mvr2r( lsf_new, st->lsf_old1, M ); + + /*----------------------------------------------------------------* + * Compute weighted input (for OL pitch analysis) + * OL pitch analysis + * stable high pitch detection + * 1/4 pitch precision improvement + *----------------------------------------------------------------*/ + + find_wsp( L_FRAME, L_SUBFR, NB_SUBFR, A, Aw, inp_12k8, TILT_FAC, wsp, &st->mem_wsp, GAMMA1, L_look ); + + if ( st->vad_flag == 0 ) + { + /* reset the OL pitch tracker memories during inactive frames */ + pitch_ol_init( &st->old_thres, &st->old_pitch, &st->delta_pit, &st->old_corr ); + } + + old_pitch1 = st->pitch[1]; + + pitch_ol( st->pitch, st->voicing, &st->old_pitch, &st->old_corr, corr_shift, &st->old_thres, &st->delta_pit, st->old_wsp2, wsp, st->mem_decim2, relE, L_look, st->clas, st->input_bwidth, st->Opt_SC_VBR ); + + /* Updates for adaptive lag window memory */ + st->old_pitch_la = st->pitch[2]; + + /* Detection of very short stable pitch period (MODE1 bitrates) */ + StableHighPitchDetect( &flag_spitch, st->pitch, st->voicing, st->Bin_E, wsp, st->localVAD, &st->voicing_sm, &st->voicing0_sm, &st->LF_EnergyRatio_sm, &st->predecision_flag, &st->diff_sm, &st->energy_sm ); + + /* 1/4 pitch precision improvement */ + if ( st->total_brate <= ACELP_24k40 ) + { + pitch_ol2( PIT_MIN_EXTEND, st->pitch[0], &pitch_fr[0], &voicing_fr[0], 0, wsp, 7 ); + pitch_ol2( PIT_MIN_EXTEND, st->pitch[0], &pitch_fr[1], &voicing_fr[1], L_SUBFR, wsp, 7 ); + pitch_ol2( PIT_MIN_EXTEND, st->pitch[1], &pitch_fr[2], &voicing_fr[2], 2 * L_SUBFR, wsp, 7 ); + pitch_ol2( PIT_MIN_EXTEND, st->pitch[1], &pitch_fr[3], &voicing_fr[3], 3 * L_SUBFR, wsp, 7 ); + } + else + { + pitch_fr[0] = st->pitch[0]; + pitch_fr[1] = st->pitch[0]; + pitch_fr[2] = st->pitch[1]; + pitch_fr[3] = st->pitch[1]; + + voicing_fr[0] = st->voicing[0]; + voicing_fr[1] = st->voicing[0]; + voicing_fr[2] = st->voicing[1]; + voicing_fr[3] = st->voicing[1]; + } + + /*------------------------------------------------------------------* + * Update estimated noise energy and voicing cut-off frequency + *-----------------------------------------------------------------*/ + + noise_est( st, old_pitch1, tmpN, epsP, Etot, relE, corr_shift, tmpE, fr_bands, &cor_map_sum, NULL, &sp_div, &non_staX, &loc_harm, lf_E, &st->hNoiseEst->harm_cor_cnt, st->hNoiseEst->Etot_l_lp, &sp_floor, 0, NULL, NULL, st->ini_frame ); + + /*------------------------------------------------------------------* + * Update parameters used in the VAD and DTX + *-----------------------------------------------------------------*/ + + vad_param_updt( st, corr_shift, corr_shift, A, old_pitch1, NULL, 1 ); + + /*-----------------------------------------------------------------* + * Find spectral tilt + * UC and VC frame selection + *-----------------------------------------------------------------*/ + + find_tilt( fr_bands, st->hNoiseEst->bckr, ee, st->pitch, st->voicing, lf_E, corr_shift, st->input_bwidth, st->max_band, hp_E, st->codec_mode, &( st->bckr_tilt_lt ), st->Opt_SC_VBR ); + + st->coder_type = find_uv( st, pitch_fr, voicing_fr, inp_12k8, ee, NULL, corr_shift, relE, Etot, hp_E, &flag_spitch, last_core_orig, NULL ); + + /*-----------------------------------------------------------------* + * channel aware mode configuration * + *-----------------------------------------------------------------*/ + + if ( !st->Opt_RF_ON ) + { + st->rf_mode = 0; + st->rf_target_bits_write = 0; + } + else if ( st->rf_mode && st->core_brate != FRAME_NO_DATA && st->core_brate != SID_2k40 ) + { + /* the RF config is for (n- fec_offset)th frame that will be packed along with the n-th frame bitstream */ + st->rf_mode = 1; + st->codec_mode = MODE2; + + st->rf_target_bits_write = st->hRF->rf_targetbits_buff[st->rf_fec_offset]; + } + else + { + st->rf_mode = 0; + st->codec_mode = MODE1; + if ( st->Opt_RF_ON ) + { + st->hRF->rf_indx_frametype[0] = RF_NO_DATA; + st->hRF->rf_targetbits_buff[0] = 6; /* rf_mode: 1, rf_frame_type: 3, and fec_offset: 2 */ + } + } + + /*-----------------------------------------------------------------* + * Signal classification for FEC + * TC frame selection + *-----------------------------------------------------------------*/ + + st->clas = signal_clas( st, inp_12k8, ee, relE, L_look, &clas_mod ); + + select_TC( st->codec_mode, st->tc_cnt, &st->coder_type, st->localVAD ); + + /* limit coder_type depending on the bitrate */ + coder_type_modif( st, relE ); + + if ( st->Opt_SC_VBR ) + { + st->hSC_VBR->Local_VAD = st->localVAD; + } + + /*----------------------------------------------------------------* + * Speech/music classification + * AC frame selection + *----------------------------------------------------------------*/ + + st->GSC_IVAS_mode = 0; + + speech_music_classif( st, new_inp_12k8, inp_12k8, localVAD_HE_SAD, lsp_new, cor_map_sum, epsP, PS, Etot, old_cor, attack_flag, non_staX, relE, &high_lpn_flag, flag_spitch ); + + long_enr( st, Etot, localVAD_HE_SAD, high_lpn_flag, NULL, 1, NULL, NULL ); + + /*----------------------------------------------------------------* + * Final VAD correction ( when HE-SAD is used instead of the normal VAD, + * rewrite the VAD flag by VAD flag with DTX hangover for further processing) + *----------------------------------------------------------------*/ + + if ( st->Opt_DTX_ON ) + { + st->vad_flag = vad_flag_dtx; + } + + /*----------------------------------------------------------------* + * Selection of internal ACELP Fs (12.8 kHz or 16 kHz) + *----------------------------------------------------------------*/ + + if ( st->codec_mode == MODE1 ) + { + if ( st->core_brate == FRAME_NO_DATA ) + { + /* prevent "L_frame" changes in CNG segments */ + st->L_frame = st->last_L_frame; + } + else if ( st->core_brate == SID_2k40 && st->bwidth >= WB && st->hDtxEnc->first_CNG && ( st->hTdCngEnc != NULL && st->hTdCngEnc->act_cnt2 < MIN_ACT_CNG_UPD ) ) + { + /* prevent "L_frame" changes in SID frame after short segment of active frames */ + st->L_frame = st->hDtxEnc->last_CNG_L_frame; + } + else if ( ( st->core_brate == SID_2k40 && st->total_brate >= ACELP_9k60 && ( ( st->bwidth == WB && !( st->total_brate == ACELP_13k20 && st->cng_type == FD_CNG ) ) || ( st->cng_type == LP_CNG && st->bwidth > WB && st->total_brate >= ACELP_16k40 ) ) ) || ( st->total_brate > ACELP_24k40 && st->total_brate < HQ_96k ) || ( st->total_brate == ACELP_24k40 && st->bwidth >= WB ) ) + { + st->L_frame = L_FRAME16k; + } + else + { + st->L_frame = L_FRAME; + } + + if ( st->ini_frame == 0 ) + { + /* avoid switching of internal ACELP Fs in the very first frame */ + st->last_L_frame = st->L_frame; + } + + if ( st->L_frame == L_FRAME ) + { + st->gamma = GAMMA1; + st->preemph_fac = PREEMPH_FAC; + } + else + { + st->gamma = GAMMA16k; + st->preemph_fac = PREEMPH_FAC_16k; + } + + st->sr_core = st->L_frame * FRAMES_PER_SEC; + st->encoderLookahead_enc = NS2SA( st->sr_core, ACELP_LOOK_NS ); + st->encoderPastSamples_enc = ( st->L_frame * 9 ) >> 4; + } + + /*-----------------------------------------------------------------* + * coder_type rewriting in case of switching + * IC frames selection + * enforce TC frames in case of switching + *-----------------------------------------------------------------*/ + + if ( st->codec_mode == MODE1 ) + { + /* enforce TRANSITION frames */ + if ( st->last_L_frame != st->L_frame && st->core_brate != FRAME_NO_DATA && st->core_brate != SID_2k40 && ( st->coder_type_raw != VOICED ) ) + { + /* enforce TC frame in case of ACELP@12k8 <-> ACELP@16k core switching */ + st->coder_type = TRANSITION; + } + else if ( st->last_core == HQ_CORE || st->last_core == TCX_10_CORE || st->last_core == TCX_20_CORE ) + { + /* enforce TC frame in case of HQ -> ACELP core switching */ + st->coder_type = TRANSITION; + } + else if ( st->last_core_brate <= SID_2k40 && st->cng_type == FD_CNG ) + { + /* enforce TC frame in case of FD_CNG -> ACELP switching (past excitation not available) */ + st->coder_type = TRANSITION; + } + /* select INACTIVE frames */ + else if ( st->total_brate <= ACELP_24k40 && st->vad_flag == 0 ) + { + /* inactive frames will be coded by GSC technology */ + /* except for the VBR mode. VBR mode uses NELP for that */ + if ( !( st->Opt_SC_VBR && vad_flag_dtx ) ) + { + st->coder_type = INACTIVE; + st->hGSCEnc->noise_lev = NOISE_LEVEL_SP3; + } + } + else if ( st->total_brate > ACELP_24k40 && ( ( st->vad_flag == 0 && st->bwidth >= SWB && st->max_bwidth >= SWB ) || ( st->localVAD == 0 && ( st->bwidth <= WB || st->max_bwidth <= WB ) ) ) ) + { + /* inactive frames will be coded by AVQ technology */ + st->coder_type = INACTIVE; + } + } + else /* st->codec_mode == MODE2 */ + { + if ( !st->vad_flag ) + { + st->coder_type = INACTIVE; + } + else if ( st->coder_type > GENERIC ) + { + st->coder_type = GENERIC; + } + } + + /*---------------------------------------------------------------* + * SC-VBR - decision about PPP/NELP mode + *---------------------------------------------------------------*/ + + if ( st->Opt_SC_VBR ) + { + set_ppp_mode( st, noisy_speech_HO, clean_speech_HO, NB_speech_HO, localVAD_HE_SAD ); + } + + if ( !st->Opt_AMR_WB && !st->rf_mode ) + { + if ( st->total_brate == ACELP_13k20 || st->total_brate == ACELP_32k ) + { + st->mdct_sw_enable = MODE1; + } + else if ( ACELP_16k40 <= st->total_brate && st->total_brate <= ACELP_24k40 ) + { + st->mdct_sw_enable = MODE2; + } + } + + /*---------------------------------------------------------------------* + * Decision matrix (selection of technologies) + *---------------------------------------------------------------------*/ + + if ( st->codec_mode == MODE1 ) /* mono case */ + { + decision_matrix_enc( st, hq_core_type ); + + + /* HQ_CORE/TCX_20_CORE decision */ + if ( st->core == HQ_CORE ) /* Decision matrix decided for MDCT coding */ + { + if ( ( st->bwidth == SWB || st->bwidth == FB ) && st->total_brate == ACELP_32k ) + { + /* Select MDCT Core */ + st->core = mdct_classifier( st, fft_buff, enerBuffer, st->total_brate ); + } + if ( st->total_brate == ACELP_13k20 && st->bwidth != FB ) + { + MDCT_selector( st, sp_floor, Etot, cor_map_sum, enerBuffer ); + } + } + else + { + MDCT_selector_reset( st->hTcxEnc ); + } + + /* Switch to MODE2 if TCX_20_CORE */ + if ( st->core == TCX_20_CORE ) + { + st->codec_mode = MODE2; + + if ( st->last_codec_mode == MODE1 ) + { + int32_t last_total_brate = st->last_total_brate; + st->last_total_brate = -1; + SetModeIndex( st, st->last_total_brate, EVS_MONO, 0 ); + st->last_total_brate = last_total_brate; + } + else + { + SetModeIndex( st, st->last_total_brate, EVS_MONO, 0 ); + st->sr_core = getCoreSamplerateMode2( EVS_MONO, st->total_brate, st->bwidth, st->flag_ACELP16k, st->rf_mode, 0 ); + st->L_frame = (int16_t) ( st->sr_core / FRAMES_PER_SEC ); + st->encoderLookahead_enc = NS2SA( st->sr_core, ACELP_LOOK_NS ); + st->encoderPastSamples_enc = ( st->L_frame * 9 ) >> 4; + + if ( st->sr_core == INT_FS_12k8 ) + { + st->preemph_fac = PREEMPH_FAC; + st->gamma = GAMMA1; + } + else + { + st->preemph_fac = PREEMPH_FAC_16k; + st->gamma = GAMMA16k; + } + + st->igf = getIgfPresent( EVS_MONO, st->total_brate, st->bwidth, st->rf_mode ); + } + + st->coder_type = st->coder_type_raw; + + if ( st->vad_flag == 0 ) + { + st->coder_type = INACTIVE; + } + else if ( st->coder_type > GENERIC ) + { + st->coder_type = GENERIC; + } + + st->mdct_sw = MODE1; + } + } + + /*-----------------------------------------------------------------* + * Update of ACELP harmonicity counter (used in ACELP transform codebook @32kbps) + *-----------------------------------------------------------------*/ + + if ( st->total_brate == ACELP_32k && loc_harm == 1 && cor_map_sum > 50 && st->clas == VOICED_CLAS && st->coder_type == GENERIC ) + { + st->last_harm_flag_acelp++; + + if ( st->last_harm_flag_acelp > 10 ) + { + st->last_harm_flag_acelp = 10; + } + } + else + { + st->last_harm_flag_acelp = 0; + } + + /*-----------------------------------------------------------------* + * Update audio frames counter (used for UV decision) + *-----------------------------------------------------------------*/ + + if ( st->coder_type == AUDIO ) + { + st->audio_frame_cnt += AUDIO_COUNTER_STEP; + } + else if ( st->coder_type != INACTIVE ) + { + st->audio_frame_cnt--; + } + + if ( st->audio_frame_cnt > AUDIO_COUNTER_MAX ) + { + st->audio_frame_cnt = AUDIO_COUNTER_MAX; + } + + if ( st->audio_frame_cnt < 0 ) + { + st->audio_frame_cnt = 0; + } + + /*-----------------------------------------------------------------* + * Set formant sharpening flag + *-----------------------------------------------------------------*/ + + st->sharpFlag = 0; + + if ( st->coder_type == TRANSITION ) + { + if ( ( st->total_brate > ACELP_48k && st->bwidth < SWB ) || /* Deactivate for core bitrates higher than 48.0 kb/s */ + ( st->total_brate >= ACELP_13k20 && st->total_brate <= ACELP_16k40 ) || /* Deactivate for bitrates <13.2, 16.4> kb/s (this is basically due to lack of signaling configurations */ + ( st->total_brate > ACELP_16k40 && st->lp_noise > FORMANT_SHARPENING_NOISE_THRESHOLD ) ) /* Deactivate for bitrates >= 24.4 kb/s if the long-term noise level exceeds 34 dB */ + { + st->sharpFlag = 0; + } + else + { + st->sharpFlag = 1; + } + } + + if ( st->coder_type == GENERIC || st->coder_type == VOICED ) + { + if ( *vad_hover_flag || + ( st->total_brate > ACELP_48k && st->bwidth < SWB ) || /* Deactivate for core bitrates higher than 48.0 kb/s */ + ( st->total_brate >= ACELP_13k20 && st->lp_noise > FORMANT_SHARPENING_NOISE_THRESHOLD && st->total_brate > CNA_MAX_BRATE ) ) /* Deactivate for bitrates >= 13.2 kb/s if the long-term noise level exceeds 34 dB */ + { + st->sharpFlag = 0; + } + else + { + st->sharpFlag = 1; + } + } + + /* channel-aware mode - due to lack of signaling bit, sharpFlag is 1 always in RF mode */ + if ( st->rf_mode && ( st->coder_type == VOICED || st->coder_type == GENERIC ) ) + { + st->sharpFlag = 1; + } + + /*-----------------------------------------------------------------* + * Set voicing flag for HQ FEC + *-----------------------------------------------------------------*/ + + if ( st->sp_aud_decision1 == 0 && ( st->coder_type == VOICED || st->coder_type == GENERIC ) ) + { + *Voicing_flag = 1; + } + else + { + *Voicing_flag = 0; + } + + /*---------------------------------------------------------------* + * Preprocessing at other sampling frequency rate (16/25.6/32kHz) + *----------------------------------------------------------------*/ + + sr_core_tmp = ( st->codec_mode == MODE1 ) ? INT_FS_16k : max( INT_FS_16k, st->sr_core ); /* indicates the ACELP sampling rate */ + L_frame_tmp = ( st->codec_mode == MODE1 ) ? L_FRAME16k : max( L_FRAME16k, st->L_frame ); + + L_look = NS2SA( sr_core_tmp, ACELP_LOOK_NS ); /* lookahead at other sampling rate (16kHz, 25.6kHz, 32kHz) */ + + new_inp_16k = old_inp_16k + L_INP_MEM; /* pointer to new samples of the input signal in 16kHz core */ + inp_16k = new_inp_16k - L_look; /* pointer to the current frame of input signal in 16kHz core */ + + mvr2r( st->old_inp_16k, old_inp_16k, L_INP_MEM ); + + /*---------------------------------------------------------------* + * Change the sampling frequency to 16/25.6/32 kHz + *----------------------------------------------------------------*/ + + if ( st->input_Fs == sr_core_tmp ) + { + /* no resampling needed, only delay adjustment to account for the FIR resampling delay */ + delay = NS2SA( st->input_Fs, DELAY_FIR_RESAMPL_NS ); + mvr2r( st->mem_decim16k + delay, new_inp_16k, delay ); + mvr2r( signal_in, new_inp_16k + delay, input_frame - delay ); + mvr2r( signal_in + input_frame - 2 * delay, st->mem_decim16k, 2 * delay ); + } + else if ( st->input_Fs == 32000 || st->input_Fs == 48000 ) + { + modify_Fs( signal_in, input_frame, st->input_Fs, new_inp_16k, sr_core_tmp, st->mem_decim16k, 0 ); + } + else /* keep memories up-to-date in case of bitrate switching */ + { + /* no resampling needed, only delay adjustment to account for the FIR resampling delay */ + delay = NS2SA( st->input_Fs, DELAY_FIR_RESAMPL_NS ); + mvr2r( st->mem_decim16k + delay, new_inp_16k, delay ); + mvr2r( signal_in, new_inp_16k + delay, input_frame - delay ); + mvr2r( signal_in + input_frame - 2 * delay, st->mem_decim16k, 2 * delay ); + } + + if ( sr_core_tmp == INT_FS_16k ) + { + /* save input resampled at 16kHz, non-preemhasised */ + mvr2r( new_inp_16k, new_inp_resamp16k, L_FRAME16k ); + } + else if ( sr_core_tmp > INT_FS_16k ) + { + /* reset the buffer, the signal is needed for WB BWEs */ + set_f( new_inp_resamp16k, 0.0f, L_FRAME16k ); + } + + /*------------------------------------------------------------------* + * Perform fixed preemphasis (16kHz signal) through 1 - g*z^-1 + *-----------------------------------------------------------------*/ + + if ( ( st->tcxonly == 0 || st->codec_mode == MODE1 ) && st->input_Fs > 8000 ) + { + st->mem_preemph_enc = new_inp_16k[L_frame_tmp - 1]; + } + + if ( st->input_Fs > 8000 && sr_core_tmp == INT_FS_16k ) + { + preemph( new_inp_16k, PREEMPH_FAC_16k, L_FRAME16k, &( st->mem_preemph16k ) ); + } + else if ( st->input_Fs > 8000 ) /* keep memory up-to-date in case of bitrate switching */ + { + st->mem_preemph16k = new_inp_16k[L_frame_tmp - 1]; + } + + /*-----------------------------------------------------------------* + * Redo LP analysis at 16kHz if ACELP@16k core was selected + * update buffers + *-----------------------------------------------------------------*/ + + if ( ( ( ( st->tcxonly == 0 ) || !( st->core_brate != FRAME_NO_DATA && st->core_brate != SID_2k40 ) ) && + st->L_frame == L_FRAME16k && st->codec_mode == MODE2 ) || + ( st->L_frame == L_FRAME16k && st->codec_mode == MODE1 ) ) + { + /* update signal buffers */ + mvr2r( new_inp_resamp16k, st->buf_speech_enc + L_FRAME16k, L_FRAME16k ); + mvr2r( new_inp_16k, st->buf_speech_enc_pe + L_FRAME16k, L_FRAME16k ); + + /*--------------------------------------------------------------* + * LPC analysis + *---------------------------------------------------------------*/ + + if ( st->last_L_frame == L_FRAME && st->codec_mode == MODE1 ) + { + /* this is just an approximation, but it is sufficient */ + mvr2r( st->lsp_old1, st->lspold_enc, M ); + } + + analy_lp( inp_16k, L_FRAME16k, L_look, ener, A, epsP, lsp_new, lsp_mid, st->lspold_enc, st->pitch, st->voicing, 16000, -1 ); + + /*--------------------------------------------------------------* + * Compute Weighted Input + *---------------------------------------------------------------*/ + + if ( st->codec_mode == MODE2 ) + { + find_wsp( L_FRAME16k, L_SUBFR, st->nb_subfr, A, Aw, st->speech_enc_pe, PREEMPH_FAC_16k, st->wspeech_enc, &st->mem_wsp_enc, st->gamma, L_LOOK_16k ); + } + else + { + weight_a_subfr( NB_SUBFR16k, A, Aw, GAMMA16k, M ); + } + } + else + { + /* update signal buffers */ + mvr2r( new_inp_12k8, st->buf_speech_enc_pe + st->L_frame, L_FRAME ); + mvr2r( st->buf_speech_enc + L_FRAME32k, st->buf_speech_enc + st->L_frame, L_FRAME ); + + if ( st->tcxonly == 0 ) + { + mvr2r( wsp, st->wspeech_enc, L_FRAME + L_LOOK_12k8 ); + } + } + + /*-----------------------------------------------------------------* + * ACELP/TCX20 Switching Decision + *-----------------------------------------------------------------*/ + +#ifndef FIX_I4_OL_PITCH + mvs2s( st->pitch, pitch_orig, 3 ); +#endif + + if ( st->codec_mode == MODE2 ) + { + if ( st->core_brate != FRAME_NO_DATA && st->core_brate != SID_2k40 && st->tcxonly == 0 ) + { + core_acelp_tcx20_switching( st, non_staX, pitch_fr, voicing_fr, currFlatness, lsp_mid, stab_fac ); + } + + if ( st->mdct_sw_enable == MODE2 && !st->rf_mode ) + { + if ( st->core == TCX_20_CORE ) /* Switching only possible from TCX_20_CORE frames, not from TCX_10_CORE frames */ + { + /* Select MDCT Core */ + if ( ( st->bwidth == SWB || st->bwidth == FB ) && st->total_brate == ACELP_24k40 ) + { + st->core = mdct_classifier( st, fft_buff, enerBuffer, st->total_brate ); + } + + if ( st->total_brate == ACELP_16k40 && st->bwidth != FB ) + { + MDCT_selector( st, sp_floor, Etot, cor_map_sum, enerBuffer ); + } + } + else + { + MDCT_selector_reset( st->hTcxEnc ); + } + + /* Do the switching that was decided in the MDCT selector */ + if ( st->core == HQ_CORE ) + { + st->codec_mode = MODE1; + st->mdct_sw = MODE2; + } + else if ( st->last_codec_mode == MODE1 && st->last_core == HQ_CORE ) + { + int16_t L_frame_old = st->last_L_frame; + st->last_L_frame = st->L_frame; + SetModeIndex( st, st->last_total_brate, EVS_MONO, 0 ); + st->last_L_frame = L_frame_old; + } + } + + /*--------------------------------------------------------------* + * TCX mode decision + *---------------------------------------------------------------*/ + + SetTCXModeInfo( st, st->hTranDet, &st->hTcxCfg->tcx_curr_overlap_mode ); + } + + /*-----------------------------------------------------------------* + * Updates + *-----------------------------------------------------------------*/ + + /* update old weighted speech buffer - for OL pitch analysis */ + mvr2r( &old_wsp[L_FRAME], st->old_wsp, L_WSP_MEM ); + + /* update old input signal buffer */ + mvr2r( &old_inp_12k8[L_FRAME], st->old_inp_12k8, L_INP_MEM ); + + /* update old input signal @16kHz buffer */ + if ( st->input_Fs > 8000 && sr_core_tmp == INT_FS_16k ) + { + mvr2r( &old_inp_16k[L_frame_tmp], st->old_inp_16k, L_INP_MEM ); + } + else if ( st->input_Fs > 8000 ) + { + lerp( st->old_inp_12k8 + L_INP_MEM - L_INP_MEM * 4 / 5, st->old_inp_16k, L_INP_MEM, L_INP_MEM * 4 / 5 ); + } + + if ( sr_core_tmp == INT_FS_16k && st->tcxonly && st->codec_mode == MODE2 ) + { + /* copy input resampled at 16kHz, non-preemhasised */ + mvr2r( new_inp_resamp16k, new_inp_16k, L_FRAME16k ); + } + + /* update of old per-band energy spectrum */ + mvr2r( fr_bands + NB_BANDS, st->hNoiseEst->enrO, NB_BANDS ); + + /* set the pointer of the current frame for the ACELP core */ + if ( st->L_frame == L_FRAME ) + { + *inp = inp_12k8; + } + else + { + *inp = inp_16k; + } + if ( ( st->core != HQ_CORE && st->tcxonly == 0 ) || st->core == ACELP_CORE ) + { + /* Update vAD hangover frame counter in active frames */ + if ( !( st->core_brate == SID_2k40 || st->core_brate == FRAME_NO_DATA ) ) + { + if ( st->Opt_DTX_ON && *vad_hover_flag ) + { + st->hTdCngEnc->burst_ho_cnt++; + if ( st->hTdCngEnc->burst_ho_cnt > HO_HIST_SIZE ) + { + st->hTdCngEnc->burst_ho_cnt = HO_HIST_SIZE; + } + } + else if ( st->hTdCngEnc != NULL && vad_flag_dtx ) + { + st->hTdCngEnc->burst_ho_cnt = 0; + } + } + } + + pop_wmops(); + return; +} diff --git a/lib_enc/pvq_core_enc.c b/lib_enc/pvq_core_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..0a8b7954d5faaf616735199718ab0f8b196ddd5e --- /dev/null +++ b/lib_enc/pvq_core_enc.c @@ -0,0 +1,564 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "rom_com.h" +#include "prot.h" +#include "prot.h" +#include "stl.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * Local function prototypes + *--------------------------------------------------------------------*/ + +static int16_t calc_pvq_splits( BSTR_ENC_HANDLE hBstr, PVQ_ENC_HANDLE hPVQ, const int16_t band_bits, const int16_t sfmsize, const float *y, int16_t *bits ); + +static void obtainEnergyParameter( const float Enear, const float Eopp, int16_t *param ); + +static void densityIndexSymbolEncode( BSTR_ENC_HANDLE hBstr, PVQ_ENC_HANDLE hPVQ, const int16_t density, const int16_t r_dim, const int16_t l_dim, const int16_t index_phi ); + +static void encode_energies( BSTR_ENC_HANDLE hBstr, PVQ_ENC_HANDLE hPVQ, const float *coefs, const int16_t Np, int16_t *dim_part, float *E_part, int16_t *bits_part, int16_t *g_part, const int16_t qband, int16_t *bits_left, const float enr, const int16_t n, const int16_t strict_bits ); + + +/*-------------------------------------------------------------------* + * pvq_encode_band() + * + * Encode band with PVQ + *--------------------------------------------------------------------*/ + +static void pvq_encode_band( + BSTR_ENC_HANDLE hBstr, /* i/o: Encoder bitstream handle */ + PVQ_ENC_HANDLE hPVQ, /* i/o: PVQ encoder handle */ + const float *coefs_norm, /* i : normalized vector to encode */ + int16_t *pulse_vector, /* o : quantized vector, integer */ + int16_t *npulses, /* o : number of pulses */ + float *coefs_quant, /* o : quantized vector */ + const int16_t sfmsize, /* i : length of vector */ + const int16_t band_bits, /* i : assigned bits */ + int16_t *bits_left, /* o : bits remaining */ + const int16_t strict_bits /* i : conservative rounding flag */ +) +{ + int16_t K_val; + int16_t j, Np; + float enr, E_part[MAX_SPLITS + 1]; + int16_t part_start[MAX_SPLITS + 1], dim_part[MAX_SPLITS + 1], bits_part[MAX_SPLITS + 1]; + int16_t pool_tot, pool_part, dim_parts; + float g_part[MAX_SPLITS]; + int16_t g_part_s[MAX_SPLITS]; + int16_t sg_part[MAX_SPLITS + 1]; + int16_t idx_sort[MAX_SPLITS + 1]; + int16_t js, band_bits_tot, split_bit; + + Np = calc_pvq_splits( hBstr, hPVQ, band_bits, sfmsize, coefs_norm, &split_bit ); + band_bits_tot = band_bits - split_bit; + + enr = 0.0f; + for ( j = 0; j < sfmsize; j++ ) + { + enr += coefs_norm[j] * coefs_norm[j]; + } + + dim_parts = (int16_t) intLimCDivPos( sfmsize, Np ); + set_s( dim_part, dim_parts, Np - 1 ); + dim_part[Np - 1] = sfmsize - dim_parts * ( Np - 1 ); + + part_start[0] = 0; + for ( j = 1; j < Np; j++ ) + { + part_start[j] = part_start[j - 1] + dim_part[j - 1]; + } + + set_s( g_part_s, -32768, Np ); + if ( Np > 1 ) + { + encode_energies( hBstr, hPVQ, coefs_norm, Np, dim_part, E_part, bits_part, g_part_s, band_bits_tot, bits_left, enr, sfmsize, strict_bits ); + } + else + { + bits_part[0] = band_bits_tot; + } + + pool_tot = 0; + pool_part = 0; + + for ( j = 0; j < Np; j++ ) + { + g_part[j] = -( (float) g_part_s[j] ) / 32768; + g_part_s[j] = -g_part_s[j]; + } + + srt_vec_ind( g_part_s, sg_part, idx_sort, Np ); + + for ( j = 0; j < Np; j++ ) + { + js = idx_sort[Np - 1 - j]; + + + pool_part = shrtCDivSignedApprox( pool_tot, Np - j ); + bits_part[js] = max( 0, min( bits_part[js] + pool_part, 256 ) ); + + conservativeL1Norm( dim_part[js], bits_part[js], strict_bits, *bits_left, pool_tot, *npulses, /* inputs */ + &K_val, bits_left, &pool_tot, npulses ); /* outputs */ + if ( K_val >= 1 ) + { + pvq_encode( hBstr, hPVQ, coefs_norm + part_start[js], pulse_vector + part_start[js], coefs_quant + part_start[js], K_val, dim_part[js], g_part[js] ); + } + else + { + set_f( coefs_quant + part_start[js], 0.0f, dim_part[js] ); + set_s( pulse_vector + part_start[js], 0, dim_part[js] ); + } + } + + return; +} + +/*-------------------------------------------------------------------* + * pvq_encode_frame() + * + * + *--------------------------------------------------------------------*/ + +void pvq_encode_frame( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const float *coefs_norm, /* i : normalized coefficients to encode */ + float *coefs_quant, /* o : quantized coefficients */ + float *gopt, /* o : optimal shape gains */ + int16_t *npulses, /* o : number of pulses per band */ + int16_t *pulse_vector, /* o : non-normalized pulse shapes */ + const int16_t *sfm_start, /* i : indices of first coefficients in the bands */ + const int16_t *sfm_end, /* i : indices of last coefficients in the bands */ + const int16_t *sfmsize, /* i : band sizes */ + const int16_t nb_sfm, /* i : total number of bands */ + const int16_t *R, /* i : bitallocation per band (Q3)*/ + const int16_t pvq_bits, /* i : number of bits avaiable */ + const int16_t core /* i : core */ +) +{ + int16_t i, j; + int16_t band_bits, bits_left; + int16_t bit_pool = 0; + int16_t coded_bands, bands_to_code; + int16_t curr_bits; + int16_t R_sort[NB_SFM]; /*Q3*/ + int16_t is, i_sort[NB_SFM]; + int16_t strict_bits; + PVQ_ENC_DATA pvq_enc; + + PVQ_ENC_HANDLE hPVQ = &pvq_enc; + + rc_enc_init( hPVQ, pvq_bits ); + curr_bits = ( pvq_bits - RC_BITS_RESERVED ) << 3; + + bands_to_code = 0; + for ( i = 0; i < nb_sfm; i++ ) + { + if ( R[i] > 0 ) + { + bands_to_code++; + } + } + + if ( core == ACELP_CORE ) + { + strict_bits = 1; + srt_vec_ind( R, R_sort, i_sort, nb_sfm ); + } + else + { + strict_bits = 0; + for ( i = 0; i < nb_sfm; i++ ) + { + i_sort[i] = i; + } + } + + coded_bands = 0; + for ( i = 0; i < nb_sfm; i++ ) + { + is = i_sort[i]; + gopt[is] = 0; + if ( R[is] > 0 ) + { + bandBitsAdjustment( hPVQ->rc_num_bits, hPVQ->rc_range, curr_bits, bands_to_code, bands_to_code - coded_bands, sfmsize[is], R[is], bit_pool, /* inputs */ + &band_bits, &bits_left, &bit_pool ); /* outputs */ + + pvq_encode_band( hBstr, hPVQ, &coefs_norm[sfm_start[is]], &pulse_vector[sfm_start[is]], &npulses[is], &coefs_quant[sfm_start[is]], sfmsize[is], band_bits, &bits_left, strict_bits ); + + gopt[is] = dotp( coefs_quant + sfm_start[is], coefs_norm + sfm_start[is], sfmsize[is] ) / + ( dotp( coefs_quant + sfm_start[is], coefs_quant + sfm_start[is], sfmsize[is] ) + 1e-15f ); + + if ( gopt[is] == 0.0f ) + { + gopt[is] = 1e-10f; + } + /* Updates */ + coded_bands++; + } + else + { + for ( j = sfm_start[is]; j < sfm_end[is]; j++ ) + { + coefs_quant[j] = 0.0f; + pulse_vector[j] = 0; + } + } + } + + rc_enc_finish( hBstr, hPVQ ); + + return; +} + +/*---------------------------------------------------------------------* + * pvq_core_enc() + * + * Main Generic Audio Encoder Routine + *---------------------------------------------------------------------*/ + +/*! r: number of bits encoded */ +int16_t pvq_core_enc( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + float coefs_norm[], /* i/o: normalized coefficients to encode */ + float coefs_quant[], /* o : quantized coefficients */ + const int16_t bits_tot, /* i : total number of bits */ + const int16_t nb_sfm, /* i : number of bands */ + const int16_t *sfm_start, /* i : Subband start coefficient */ + const int16_t *sfm_end, /* i : Subband end coefficient */ + const int16_t *sfmsize, /* i : subband width */ + int16_t *R, /* i/o: Bit allocation/Adjusted bit alloc. (Q3) */ + int16_t *Rs, /* i/o: Integer bit allocation */ + int16_t *npulses, /* o : number of pulses */ + int16_t *maxpulse, /* i : maximum pulse per band */ + const int16_t core /* i : number of bands */ +) +{ + int16_t i; + int16_t R_upd; /*Q3*/ + int16_t ord[NB_SFM_MAX]; + float fg_pred[NB_SFM_MAX]; + int16_t pvq_bits; + int16_t pulse_vector[L_SPEC48k_EXT]; + float gopt[NB_SFM]; + int16_t gain_bits_array[NB_SFM]; + int16_t gain_bits_tot; + + R_upd = bits_tot * 8; + gain_bits_tot = assign_gain_bits( core, nb_sfm, sfmsize, R, gain_bits_array, &R_upd ); + pvq_bits = R_upd >> 3; + pvq_encode_frame( hBstr, coefs_norm, coefs_quant, gopt, npulses, pulse_vector, sfm_start, sfm_end, sfmsize, nb_sfm, R, pvq_bits, core ); + + if ( Rs != NULL ) + { + for ( i = 0; i < nb_sfm; i++ ) + { + Rs[i] = Rs[i] * ( npulses[i] > 0 ); /* Update Rs in case no pulses were assigned */ + } + } + + for ( i = 0; i < nb_sfm; i++ ) + { + ord[i] = i; + R[i] = R[i] * ( npulses[i] > 0 ); /* Update in case no pulses were assigned */ + } + + get_max_pulses( sfm_start, sfm_end, ord, npulses, nb_sfm, pulse_vector, maxpulse ); + + fine_gain_pred( sfm_start, sfm_end, sfmsize, ord, npulses, maxpulse, R, nb_sfm, coefs_quant, pulse_vector, fg_pred, core ); + + fine_gain_quant( hBstr, ord, nb_sfm, gain_bits_array, fg_pred, gopt ); + + apply_gain( ord, sfm_start, sfm_end, nb_sfm, fg_pred, coefs_quant ); + + return ( pvq_bits + gain_bits_tot ); +} + + +/*-------------------------------------------------------------------* + * encode_energies() + * + * + *--------------------------------------------------------------------*/ + +static void encode_energies( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + PVQ_ENC_HANDLE hPVQ, /* i/o: PVQ encoder handle */ + const float *coefs, /* i : coefficients to encode */ + const int16_t Np, /* i : number of parts */ + int16_t *dim_part, /* o : sizes of parts */ + float *E_part, /* o : energies of parts */ + int16_t *bits_part, /* o : assigned bits per part */ + int16_t *g_part, /* o : gains */ + const int16_t qband, /* i : assigned quanta per band */ + int16_t *bits_left, /* o : remaining bits */ + const float enr, /* i : energy of vector */ + const int16_t dim, /* i : size of vector */ + const int16_t strict_bits /* i : conservative rounding flag */ +) +{ + int16_t i, j, l_Np, r_Np; + int16_t l_bits, r_bits, l_dim, r_dim; + float l_enr, r_enr; + int16_t il, ir; + int16_t oppRQ3, qzero; + int16_t density; + int16_t phi; + int16_t index_phi = -1; + + l_Np = Np >> 1; + r_Np = Np - l_Np; + + l_enr = 0.0f; + l_bits = 0; + l_dim = 0; + for ( i = 0; i < l_Np; i++ ) + { + l_dim += dim_part[i]; + } + for ( j = 0; j < l_dim; j++ ) + { + l_enr += coefs[j] * coefs[j]; + } + r_enr = enr - l_enr; + r_dim = dim - l_dim; + + obtainEnergyQuantizerDensity( dim, qband, &density ); + obtainEnergyParameter( l_enr, r_enr, &phi ); + rangeCoderFinalizationFBits( hPVQ->rc_num_bits, hPVQ->rc_range, &qzero ); + densityAngle2RmsProjEnc( density, phi, &index_phi, &ir, &il, &oppRQ3 ); + densityIndexSymbolEncode( hBstr, hPVQ, density, r_dim, l_dim, index_phi ); + + for ( i = 0; i < l_Np; i++ ) + { + g_part[i] = ( g_part[i] * il + 16384 ) >> 15; + } + + for ( i = l_Np; i < Np; i++ ) + { + g_part[i] = ( g_part[i] * ir + 16384 ) >> 15; + } + + NearOppSplitAdjustment( qband, qzero, hPVQ->rc_num_bits, hPVQ->rc_range, *bits_left, strict_bits, Np, dim_part[0], dim_part[Np - 1], l_dim, r_dim, oppRQ3, &l_bits, &r_bits, bits_left ); + + if ( l_Np > 1 ) + { + encode_energies( hBstr, hPVQ, coefs, l_Np, dim_part, E_part, bits_part, g_part, l_bits, bits_left, l_enr, l_dim, strict_bits ); + } + else + { + E_part[0] = l_enr; + bits_part[0] = l_bits; + } + + if ( r_Np > 1 ) + { + encode_energies( hBstr, hPVQ, &coefs[l_dim], r_Np, &dim_part[l_Np], &E_part[l_Np], &bits_part[l_Np], &g_part[l_Np], r_bits, bits_left, r_enr, r_dim, strict_bits ); + } + else + { + E_part[1] = r_enr; + bits_part[1] = r_bits; + } + + return; +} + + +static void densityIndexSymbolEncode( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + PVQ_ENC_HANDLE hPVQ, /* i/o: PVQ encoder handle */ + const int16_t density, /* i : Current density */ + const int16_t opp_sz, /* i : Opposite size */ + const int16_t near_sz, /* i : Near size */ + const int16_t index_phi /* i : Index */ +) +{ + int16_t angle, c; + uint32_t sym_freq = 1; + int32_t cum_freq, tot; + int16_t densityPlOne, densitySubC; + int16_t densitySubIndex, nearFlag; +#ifdef BASOP_NOGLOB + Flag Overflow; +#endif /* BASOP_NOGLOB */ + + if ( ( 0xFFFE & density ) != 0 ) /* even */ + { + angle = atan2_fx( SQRT_DIM_fx[opp_sz], SQRT_DIM_fx[near_sz] ); +#ifndef BASOP_NOGLOB + angle = shl( angle, 1 ); +#else /* BASOP_NOGLOB */ + angle = shl_o( angle, 1, &Overflow ); +#endif /* BASOP_NOGLOB */ + angle = mult_r( angle, 20861 ); + c = mult_r( density, angle ); + + densityPlOne = 1 + density; + densitySubC = density - c; + + tot = 2 + density * densityPlOne; /* c==0, c==density*/ + sym_freq = 1 + 2 * index_phi; /* c==density */ + cum_freq = index_phi * index_phi; /* c==density*/ + + if ( c == 0 ) + { + sym_freq = 2 * densityPlOne - sym_freq; + cum_freq = 2 * index_phi * (densityPlOne) -cum_freq; + } + else if ( densitySubC != 0 ) /* c n.eq. density */ + { + densitySubIndex = density - index_phi; + nearFlag = ( index_phi <= c ); + + tot = densityPlOne + density * c * ( densitySubC ); + sym_freq = nearFlag ? ( 1 + 2 * index_phi * densitySubC ) : ( 1 + 2 * densitySubIndex * c ); + cum_freq = nearFlag ? ( index_phi * ( ( index_phi - 1 ) * densitySubC + 1 ) ) : ( tot - densityPlOne - densitySubIndex * ( densitySubIndex + 1 ) * c + index_phi ); + } + /* else keep values for c==density*/ + rc_encode( hBstr, hPVQ, cum_freq, sym_freq, tot ); + } + + return; +} + + +/*--------------------------------------------------------------------------* + * calc_pvq_splits() + * + * Calculate the number of segments needed + *--------------------------------------------------------------------------*/ + +/*! r: Number of segments */ +static int16_t calc_pvq_splits( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + PVQ_ENC_HANDLE hPVQ, /* i/o: PVQ encoder handle */ + const int16_t band_bits, /* i : Band bit-budget */ + const int16_t sfmsize, /* i : Band width */ + const float *y, /* i : Target vector */ + int16_t *bits /* o : Consumed bits */ +) +{ + int16_t Np; + int16_t Npart; + int16_t i, j, k; + float E[MAX_SPLITS]; + float Emean; + float tmp; + float max_dev; + + Np = (int16_t) ( intLimCDivPos( band_bits, 67 ) >> 2 ); + if ( band_bits - 268 * Np != 0 || Np == 0 ) /* L_msu */ + { + Np++; /* ceil */ + } + *bits = 0; + + if ( Np < MAX_SPLITS && ( band_bits - ( 8 * sfmsize * THR_ADD_SPLIT ) > 0 ) ) + { + Npart = (int16_t) intLimCDivPos( sfmsize, Np ); + *bits = 8; + Emean = 0; + k = 0; + for ( i = 0; i < Np; i++ ) + { + E[i] = EPSILON; + for ( j = 0; j < Npart; j++, k++ ) + { + E[i] += y[k] * y[k]; + } + E[i] = (float) 30 - norm_l( (Word32) max( E[i], 1 ) ); /* a 0 input integer Ei yields a zeroed log2(Ei) out */ + Emean += E[i]; + } + Emean /= Np; + + max_dev = -1; + for ( i = 0; i < Np; i++ ) + { + tmp = (float) fabs( E[i] - Emean ); + if ( tmp > max_dev ) + { + max_dev = tmp; + } + } + + if ( max_dev > ( 32 - band_bits / ( 8 * Np ) ) ) + { + rc_enc_bits( hBstr, hPVQ, 1, 1 ); + Np += 1; + } + else + { + rc_enc_bits( hBstr, hPVQ, 0, 1 ); + } + } + + Np = max( Np, (int16_t) ( ceil( (float) sfmsize / PVQ_MAX_BAND_SIZE ) ) ); + Np = min( MAX_SPLITS, Np ); + Np = min( (int16_t) floor( (float) sfmsize / MIN_BAND_SIZE ), Np ); + + return Np; +} + + +#define EPSILON_obtainEnergyParameter 0.00373f /**/ +#define C_obtainEnergyParameter ( (float) ( 1 << 15 ) / EVS_PI + EPSILON_obtainEnergyParameter ) + +static void obtainEnergyParameter( + const float Enear, /* i : Near energy */ + const float Eopp, /* i : Opposite energy */ + int16_t *param /* o : Energy parameter */ +) +{ + if ( !Eopp ) + { + *param = 0; + return; + } + if ( !Enear ) + { + *param = 1 << 14; + return; + } + *param = (int16_t) ( C_obtainEnergyParameter * atan2( (float) sqrt( Eopp ), (float) sqrt( Enear ) ) + 0.5f ); + + return; +} +#undef C_obtainEnergyParameter +#undef EPSILON_obtainEnergyParameter diff --git a/lib_enc/pvq_encode.c b/lib_enc/pvq_encode.c new file mode 100644 index 0000000000000000000000000000000000000000..17ed334b19525fb3e2989faa9e0b03a247850d8e --- /dev/null +++ b/lib_enc/pvq_encode.c @@ -0,0 +1,208 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "prot.h" +#include "rom_com.h" +#include "prot.h" +#include "wmc_auto.h" + + +static void pyramidSearch( const float *const s, const int16_t L, const int16_t Ptot, const float A, int16_t *ztak, float *stak ); + +/*-------------------------------------------------------------------* + * pvq_encode() + * + * + *--------------------------------------------------------------------*/ + +void pvq_encode( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + PVQ_ENC_HANDLE hPVQ, /* i/o: PVQ encoder handle */ + const float *x, /* i : vector to quantize */ + int16_t *y, /* o : quantized vector (non-scaled short)*/ + float *xq, /* o : quantized vector (scaled float) */ + const int16_t pulses, /* i : number of allocated pulses */ + const int16_t dim, /* i : Length of vector */ + const float gain /* i : Gain */ +) +{ + PvqEntry entry; + + pyramidSearch( x, dim, pulses, gain, y, xq ); + + entry = mpvq_encode_vec( y, dim, pulses ); + if ( dim != 1 ) + { + rc_enc_bits( hBstr, hPVQ, (uint32_t) entry.lead_sign_ind, 1 ); + rc_enc_uniform( hBstr, hPVQ, entry.index, entry.size ); + } + else + { + rc_enc_bits( hBstr, hPVQ, (uint32_t) entry.lead_sign_ind, 1 ); + } + return; +} + +/*! r: L1 norm value */ +static float L1norm( + const float *const s, /* i : input vector */ + float *abso_s, /* o : absolute vector */ + int16_t *sign_s, /* o : signs */ + const int16_t L /* i : vector length */ +) +{ + int16_t i; + float ftmp, r = 0.0f; + + for ( i = 0; i < L; i++ ) + { + ftmp = s[i]; + sign_s[i] = (int16_t) sign( ftmp ); + abso_s[i] = (float) fabs( ftmp ); + r += abso_s[i]; + } + + return r; +} + + +void pyramidSearch( + const float *const s, /* i : input vector */ + const int16_t L, /* i : vector length */ + const int16_t Ptot, /* i : assigned diracs */ + const float A, /* i : gain */ + int16_t *ztak, /* i : integer output vector */ + float *stak /* i : normalize output vector */ +) +{ + int16_t i, high_pulse_dens; + int16_t z[PVQ_MAX_BAND_SIZE]; + float sL1; + float energy, xcorr; + int16_t P; + float energy1, energy2; + float xcorr1sq, xcorr2sq; + float zscale, sscale; + float abso_s[PVQ_MAX_BAND_SIZE]; + int16_t sign_s[PVQ_MAX_BAND_SIZE]; + int16_t n = 0; + + high_pulse_dens = Ptot > (int16_t) ( 0.501892089843750f * L ); + sL1 = L1norm( s, abso_s, sign_s, L ); + if ( high_pulse_dens && sL1 > 0 && A > 0 ) + { + P = Ptot - PYR_OFFSET; + zscale = P / sL1; + for ( i = 0; i < L; i++ ) + { + z[i] = (int16_t) floor( zscale * abso_s[i] ); + } + } + else + { + for ( i = 0; i < L; i++ ) + { + z[i] = 0; + } + } + + energy = 0.0f; + if ( sL1 > 0 && A > 0 ) + { + xcorr = 0.0f; + P = 0; + for ( i = 0; i < L; i++ ) + { + xcorr += abso_s[i] * z[i]; + energy += z[i] * z[i]; + P += z[i]; + } + energy = 0.5f * energy; + while ( P < Ptot ) + { + energy += 0.5f; + n = 0; + xcorr1sq = xcorr + abso_s[0]; + xcorr1sq *= xcorr1sq; + energy1 = energy + z[0]; + + for ( i = 1; i < L; i++ ) + { + xcorr2sq = xcorr + abso_s[i]; + xcorr2sq *= xcorr2sq; + energy2 = energy + z[i]; + + if ( ( xcorr1sq * energy2 ) < ( xcorr2sq * energy1 ) ) + { + n = i; + xcorr1sq = xcorr2sq; + energy1 = energy2; + } + } + + z[n]++; + xcorr += abso_s[n]; + energy = energy1; + P++; + } + } + else + { + if ( L > 1 ) + { + z[0] = (int16_t) ( Ptot * 0.5f ); + z[L - 1] = -( Ptot - z[0] ); + energy = 0.5f * ( z[0] * z[0] + z[L - 1] * z[L - 1] ); + } + else + { + z[0] = Ptot; + energy = 0.5f * ( z[0] * z[0] ); + } + } + + sscale = (float) A / (float) sqrt( 2.0f * energy ); + for ( i = 0; i < L; i++ ) + { + ztak[i] = z[i] * sign_s[i]; + stak[i] = sscale * ztak[i]; + } + + return; +} diff --git a/lib_enc/q_gain2p.c b/lib_enc/q_gain2p.c new file mode 100644 index 0000000000000000000000000000000000000000..c03f5c430d08b62c1b784c56eb86b3f5876f2426 --- /dev/null +++ b/lib_enc/q_gain2p.c @@ -0,0 +1,387 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "prot.h" +#include "cnst.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------------* + * Local function prototypes + *-------------------------------------------------------------------------*/ + +static int16_t gain_enc_uv( const float *code, const int16_t lcode, float *gain_pit, float *gain_code, ACELP_CbkCorr *coeff, float *past_gcode, float *gain_inov ); + + +/*-------------------------------------------------------------------------* + * procedure q_gain2_plus * + * ~~~~~~~~~~~~~~~~~~~~~~ * + * Quantization of pitch and codebook gains. * + * The following routines is Q_gains updated for AMR_WB_PLUS. * + * MA prediction is removed and MEAN_ENER is now quantized with 2 bits and * + * transmitted once every ACELP frame to the gains decoder. * + * The pitch gain and the code gain are vector quantized and the * + * mean-squared weighted error criterion is used in the quantizer search. * + *-------------------------------------------------------------------------*/ + +void encode_acelp_gains( + const float *code, + const int16_t gains_mode, + const float mean_ener_code, + const int16_t clip_gain, + ACELP_CbkCorr *g_corr, + float *gain_pit, + float *gain_code, + int16_t **pt_indice, + float *past_gcode, + float *gain_inov, + const int16_t L_subfr, + float *code2, + float *gain_code2, + const int16_t noisy_speech_flag ) +{ + int16_t index = 0; + + if ( ( ( gains_mode > 0 ) && ( gains_mode < 4 ) ) ) + { + /* Memory-less gain coding */ + index = Mode2_gain_enc_mless( code, L_subfr, gain_pit, gain_code, g_corr, mean_ener_code, clip_gain, past_gcode, gain_inov, gains_mode - 1 ); + } + else if ( gains_mode == 6 ) + { + /* UV gains quantizer (6bits/subfr) */ + index = gain_enc_uv( code, L_subfr, gain_pit, gain_code, g_corr, past_gcode, gain_inov ); + } + else if ( gains_mode == 7 ) + { + /* GACELP_UV gains quantizer (7=5-2bits/subfr) */ + index = gain_enc_gacelp_uv( code, code2, L_subfr, mean_ener_code, gain_pit, gain_code, gain_code2, g_corr, past_gcode, gain_inov, noisy_speech_flag ); + } + else + { + IVAS_ERROR( IVAS_ERR_INTERNAL, "invalid gains coding for acelp!" ); + } + + **pt_indice = index; + ( *pt_indice )++; + + return; +} + +/*---------------------------------------------------------------------* + * procedure Mode2_gain_enc_mless + * Quantization of pitch and codebook gains. + * - an initial predicted gain, gcode0, is first determined based on + * the predicted scaled innovation energy + * - the correction factor gamma = g_code / gcode0 is then vector quantized + * along with gain_pit + * - the mean-squared weighted error criterion is used for the quantizer search + *---------------------------------------------------------------------*/ + +int16_t Mode2_gain_enc_mless( + const float *code, /* i : algebraic excitation */ + const int16_t lcode, /* i : Subframe size */ + float *gain_pit, /* o : quantized pitch gain */ + float *gain_code, /* o : quantized codebook gain */ + ACELP_CbkCorr *pcoeff, /* i/o: correlations , -2,, -2 and 2*/ + const float mean_ener, /* i : mean_ener defined in open-loop (3 bits) */ + const int16_t clip_gain, /* i : gain pitch clipping flag (1 = clipping) */ + float *past_gcode, /* i/o: past gain of code */ + float *gain_inov, /* o : unscaled innovation gain */ + const int16_t coder_type /* i : coder type */ +) +{ + int16_t index, i, size, size_clip; + const Word16 *p, *t_qua_gain; + float dist, dist_min, g_pitch, g_code, gcode0, ener_code; + ACELP_CbkCorr coeff; + + /*-----------------------------------------------------------------* + * - calculate the unscaled innovation energy + * - calculate the predicted gain code + *-----------------------------------------------------------------*/ + + if ( coder_type == 0 ) + { + *gain_inov = 1.0f / (float) sqrt( ( dotp( code, code, lcode ) + 0.01f ) / lcode ); + ener_code = 10 * (float) log10( ( dotp( code, code, lcode ) + 0.01f ) / lcode ); + gcode0 = (float) pow( 10, 0.05 * ( mean_ener - ener_code ) ); + } + else + { + ener_code = 0.01F; + for ( i = 0; i < lcode; i++ ) + { + ener_code += code[i] * code[i]; + } + + *gain_inov = (float) sqrt( (float) lcode / ener_code ); + + ener_code = (float) ( -10.0 * log10( (float) lcode / ener_code ) ); + gcode0 = mean_ener - ener_code; + gcode0 = (float) pow( 10.0, gcode0 / 20.0 ); /* predicted gain */ + } + + /*-----------------------------------------------------------------* + * gain quantization initializations + * - find the initial quantization pitch index + * - set the gains searching range + *-----------------------------------------------------------------*/ + + if ( coder_type == 0 ) + { + t_qua_gain = E_ROM_qua_gain5b_const; + size_clip = 9; + size = NB_QUA_GAIN5B; + } + else if ( coder_type == 1 ) + { + t_qua_gain = E_ROM_qua_gain6b_const; + size_clip = 6; + size = NB_QUA_GAIN6B; /* searching range of the gain quantizer */ + } + else + { + t_qua_gain = E_ROM_qua_gain7b_const; + size_clip = 21; + size = NB_QUA_GAIN7B; + } + + if ( clip_gain == 1 ) + { + size -= size_clip; /* limit pitch gain to 1.0 */ + } + + coeff = *pcoeff; + coeff.xy1 *= -2.0f; + coeff.xy2 *= -2.0f; + coeff.y1y2 *= 2.0f; + + /*-----------------------------------------------------------------* + * search for the best quantizer + *-----------------------------------------------------------------*/ + + p = t_qua_gain; + dist_min = FLT_MAX; + index = 0; + + for ( i = 0; i < size; i++ ) + { + g_pitch = (float) ( *p++ ) / ( 1 << 14 ); /* pitch gain */ + g_code = gcode0 * (float) ( *p++ ) / ( 1 << 11 ); /* codebook gain */ + + dist = g_pitch * g_pitch * coeff.y1y1 + g_pitch * coeff.xy1 + g_code * g_code * coeff.y2y2 + g_code * coeff.xy2 + g_pitch * g_code * coeff.y1y2; + + if ( dist < dist_min ) + { + dist_min = dist; + index = i; + } + } + + *gain_pit = (float) ( t_qua_gain[index * 2] ) / ( 1 << 14 ); + *gain_code = (float) ( t_qua_gain[index * 2 + 1] ) / ( 1 << 11 ) * gcode0; + + *past_gcode = *gain_code / *gain_inov; + + return index; +} + +/*---------------------------------------------------------------------* + * procedure gain_enc_uv + * Quantization of pitch and codebook gains. + * - an initial predicted gain, gcode0, is first determined based on + * the predicted scaled innovation energy + * - the correction factor gamma = g_code / gcode0 is then vector quantized + * along with gain_pit + * - the mean-squared weighted error criterion is used for the quantizer search + *---------------------------------------------------------------------*/ + +static int16_t gain_enc_uv( + const float *code, /* i : algebraic excitation */ + const int16_t lcode, /* i ) : Subframe size */ + float *gain_pit, /* o : quantized pitch gain */ + float *gain_code, /* o : quantized codebook gain */ + ACELP_CbkCorr *coeff, /* i/o : correlations , -2,, -2 and 2 */ + float *past_gcode, /* i/o : past gain of code */ + float *gain_inov /* o : unscaled innovation gain */ +) +{ + int16_t index; + float g_code, g_code_corr; + + /*-----------------------------------------------------------------* + * - calculate the unscaled innovation energy + *-----------------------------------------------------------------*/ + + *gain_inov = 1.0f / (float) sqrt( ( dotp( code, code, lcode ) + 0.01f ) / lcode ); + + g_code_corr = coeff->xy2 / ( coeff->y2y2 * ( *gain_inov ) ); /*Correlation based*/ + + g_code = g_code_corr; + + /*90dB max of gain for 2^15 amplitude code, */ + if ( g_code > 0.000001f ) + { + index = (int16_t) ( ( ( 20.f * log10( g_code ) + 30.f ) / 1.9f ) + 0.5f ); + + if ( index > 63 ) + { + index = 63; + } + else if ( index < 0 ) + { + index = 0; + } + } + else + { + index = 0; + } + + *gain_code = (float) pow( 10.f, ( ( ( index * 1.9f ) - 30.f ) / 20.f ) ); + *past_gcode = *gain_code; /*unscaled gain*/ + *gain_code *= *gain_inov; /*scaled gain*/ + *gain_pit = 0.f; + + return index; +} + +/*---------------------------------------------------------------------* + * procedure gain_enc_gacelp_uv + * Quantization of pitch and codebook gains. + * - an initial predicted gain, gcode0, is first determined based on + * the predicted scaled innovation energy + * - the correction factor gamma = g_code / gcode0 is then vector quantized + * along with gain_pit + * - the mean-squared weighted error criterion is used for the quantizer search + *---------------------------------------------------------------------*/ + +int16_t gain_enc_gacelp_uv( + const float *code, /* i : algebraic excitation */ + const float *code2, /* i : gaussian excitation */ + const int16_t lcode, /* i : Subframe size */ + const float mean_ener, /* i : quantized mean energy of the frame */ + float *gain_pit, /* o : quantized pitch gain */ + float *gain_code, /* o : quantized codebook gain */ + float *gain_code2, /* o : quantized codebook gain */ + ACELP_CbkCorr *coeff, /* i/o: correlations , -2,, -2 and 2 */ + float *past_gcode, /* i/o: past gain of code */ + float *gain_inov, /* o : unscaled innovation gain */ + const int16_t noisy_speech_flag /* i : noisy speech flag */ +) +{ + int16_t index; + float gcode, gcode2, pred_nrg_frame; + float norm_code2; + int16_t i; + float c, c_index2, c_first; + int16_t index2; + + /*-----------------------------------------------------------------* + * - calculate the unscaled innovation energy + *-----------------------------------------------------------------*/ + + *gain_inov = 1.0f / (float) sqrt( ( dotp( code, code, lcode ) + 0.01f ) / lcode ); + pred_nrg_frame = (float) pow( 10.0, mean_ener / 20.0 ); + gcode = pred_nrg_frame * ( *gain_inov ); + norm_code2 = 1.0f / (float) sqrt( ( dotp( code2, code2, lcode ) + 0.01f ) / lcode ); + gcode2 = pred_nrg_frame * ( norm_code2 ); + + /*-----------------------------------------------------------------* + * search for the best quantizer + *-----------------------------------------------------------------*/ + + *gain_code = coeff->xy2 / ( coeff->y2y2 * gcode ); + + if ( *gain_code > 0.000001f ) + { + index = (int16_t) ( ( ( 20.f * log10( *gain_code ) + 20.f ) / 1.25f ) + 0.5f ); + + if ( index > 31 ) + { + index = 31; + } + else if ( index < 0 ) + { + index = 0; + } + } + else + { + index = 0; + } + + *gain_code = (float) pow( 10.f, ( ( ( index * 1.25f ) - 20.f ) / 20.f ) ); + *gain_code *= gcode; + + if ( noisy_speech_flag ) + { + c_first = 0.8f * coeff->xx - ( *gain_code ) * ( *gain_code ) * coeff->y2y2; + } + else + { + c_first = coeff->xx - ( *gain_code ) * ( *gain_code ) * coeff->y2y2; + } + index2 = 0; + *gain_code2 = (float) ( index2 * 0.25f + 0.25f ) * ( *gain_code * ( gcode2 / gcode ) ); + + c_index2 = c_first - ( *gain_code2 ) * ( *gain_code2 ) * coeff->y1y1 - 2 * ( *gain_code ) * ( *gain_code2 ) * coeff->y1y2; + + for ( i = 1; i < 4; i++ ) + { + *gain_code2 = (float) ( i * 0.25f + 0.25f ) * ( *gain_code * ( gcode2 / gcode ) ); + + c = c_first - ( *gain_code2 ) * ( *gain_code2 ) * coeff->y1y1 - 2 * ( *gain_code ) * ( *gain_code2 ) * coeff->y1y2; + + if ( fabs( c ) < fabs( c_index2 ) ) + { + index2 = i; + c_index2 = c; + } + } + + *gain_code2 = (float) ( index2 * 0.25f + 0.25f ) * ( *gain_code * ( gcode2 / gcode ) ); + index += index2 * 32; + + *gain_pit = 0.f; + *past_gcode = *gain_code / *gain_inov; /*unscaled gain*/ + + return index; +} diff --git a/lib_enc/qlpc_avq.c b/lib_enc/qlpc_avq.c new file mode 100644 index 0000000000000000000000000000000000000000..eabbd8128fe80fc718d334d7f0f66b3c0177ca86 --- /dev/null +++ b/lib_enc/qlpc_avq.c @@ -0,0 +1,385 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "prot.h" +#include "ivas_prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * qlpc_avq() + * + * + *--------------------------------------------------------------------*/ + +void qlpc_avq( + const float *lsf, /* i : Input LSF vectors */ + const float *lsfmid, /* i : Input mid-LSF vectors */ + float *lsf_q, /* o : Quantized LFS vectors */ + float *lsfmid_q, /* o : Quantized mid-LFS vectors */ + int16_t *index, /* o : Quantization indices */ + int16_t *nb_indices, /* o : Number of quantization indices */ + int16_t *nbbits, /* o : Number of quantization bits */ + const int16_t core, /* i : core */ + const int32_t sr_core /* i : internal sampling rate */ +) +{ + int16_t i; + float lsfmid_q0[M]; + int16_t *tmp_index, indxt[256], nbits, nbt, nit; + float dummy[M]; + + /* Init */ + tmp_index = &index[0]; + *nb_indices = 0; + + /* Quantize end_frame LPC */ + set_f( lsf_q, 0, M ); + + tmp_index[0] = vlpc_1st_cod( lsf, lsf_q, sr_core, dummy ); + + nbt = vlpc_2st_cod( lsf, lsf_q, &tmp_index[1], 0, sr_core ); + + nit = 1 + 2 + index[1] + index[2]; + tmp_index += nit; + *nb_indices += nit; + nbbits[0] = 8 + nbt; + + *tmp_index = 0; + + /* Quantize mid-frame LPC */ + if ( core == TCX_10_CORE ) + { + tmp_index++; + *nb_indices += 1; + + /* LPC2: Abs? */ + set_f( lsfmid_q, 0, M ); + + tmp_index[0] = vlpc_1st_cod( lsfmid, lsfmid_q, sr_core, dummy ); + + nbits = vlpc_2st_cod( lsfmid, lsfmid_q, &tmp_index[1], 0, sr_core ); + + nbt = 8 + nbits; + nit = 1 + 2 + tmp_index[1] + tmp_index[2]; + + /* LPC2: RelR? */ + for ( i = 0; i < M; i++ ) + { + lsfmid_q0[i] = lsf_q[i]; + } + + nbits = vlpc_2st_cod( lsfmid, lsfmid_q0, indxt, 3, sr_core ); + + if ( nbits < nbt ) + { + nbt = nbits; + nit = 2 + indxt[0] + indxt[1]; + tmp_index[-1] = 1; + + for ( i = 0; i < M; i++ ) + { + lsfmid_q[i] = lsfmid_q0[i]; + } + + for ( i = 0; i < nit; i++ ) + { + tmp_index[i] = indxt[i]; + } + } + + tmp_index += nit; + *nb_indices += nit; + nbbits[1] = 1 + nbt; + } + + return; +} + + +/*-------------------------------------------------------------------* + * unary_code() + * + * + *--------------------------------------------------------------------*/ + +static int16_t unary_code( int16_t ind, BSTR_ENC_HANDLE hBstr ) +{ + int16_t nb_bits; + + nb_bits = 1; + + /* Index bits */ + ind -= 1; + + while ( ind >= 16 ) + { + push_next_indice( hBstr, 0xffffU, 16 ); + nb_bits += 16; + ind -= 16; + } + if ( ind > 0 ) + { + push_next_indice( hBstr, ( 1U << ind ) - 1, ind ); + nb_bits += ind; + } + + /* Stop bit */ + push_next_indice( hBstr, 0, 1 ); + + return ( nb_bits ); +} + + +/*-------------------------------------------------------------------* + * unpack4bits() + * + * + *--------------------------------------------------------------------*/ + +static int16_t unpack4bits( int16_t nbits, const int16_t *prm, BSTR_ENC_HANDLE hBstr ) +{ + int16_t i; + + if ( nbits == 0 ) + { + push_next_indice( hBstr, 0, 0 ); + i = 1; + } + else + { + i = 0; + + while ( nbits > 4 ) + { + push_next_indice( hBstr, prm[i], 4 ); + nbits -= 4; + i++; + } + push_next_indice( hBstr, prm[i], nbits ); + i++; + } + + return ( i ); +} + + +/*-------------------------------------------------------------------* + * encode_lpc_avq() + * + * + *--------------------------------------------------------------------*/ + +int16_t encode_lpc_avq( + BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ + const int16_t numlpc, /* i : Number of sets of lpc */ + const int16_t *param_lpc, /* i : lpc parameters */ + const int16_t core, /* i : core */ + const int16_t element_mode /* i : element mode - decides between SNS and LPC coding */ +) +{ + int16_t k, j; + int16_t q_type, nb_ind; + int16_t i, qn1, qn2, nb, avqBits, st1 = 0; + int16_t nb_bits; + int16_t stereo_mode, bits_for_abs_quant; + + stereo_mode = 0; + + if ( element_mode == IVAS_CPE_MDCT ) + { + bits_for_abs_quant = SNS_ABS_QUANT_BITS; + } + else + { + bits_for_abs_quant = LPC_ABS_QUANT_BITS; + } + + j = 0; + nb_bits = 0; + + for ( k = 0; k < numlpc; k++ ) + { + /* Retrieve quantizer type */ + if ( k == 0 ) + { + q_type = 0; + } + else + { + q_type = param_lpc[j++]; + } + + if ( element_mode == IVAS_CPE_MDCT && k == 0 ) + { + stereo_mode = param_lpc[j++]; + } + + /* Determine number of AVQ indices */ + nb_ind = 0; + + if ( q_type == 0 ) + { + st1 = param_lpc[j++]; + } + qn1 = param_lpc[j++]; + qn2 = param_lpc[j++]; + if ( qn1 != SNS_LOW_BR_MODE ) + { + nb_ind += qn1 + qn2; + } + + if ( k == 0 || ( k == 1 && core != TCX_20_CORE ) ) + { + /* Encode quantizer type */ + if ( k == 0 ) + { + nb = 0; + } + else + { + nb = 1; + push_next_indice( hBstr, q_type, nb ); + } + + nb_bits += nb; + + /* Encode quantizer data */ + if ( ( ( q_type == 0 ) && element_mode != IVAS_CPE_MDCT ) || ( ( q_type == 0 ) && ( st1 >= 0 ) && element_mode == IVAS_CPE_MDCT ) ) + { + /* Absolute quantizer with 1st stage stochastic codebook */ + push_next_indice( hBstr, st1, bits_for_abs_quant ); + nb_bits += bits_for_abs_quant; + } + + if ( element_mode == IVAS_CPE_MDCT && stereo_mode == 3 && st1 < 0 ) + { + push_next_indice( hBstr, st1 + 2, 1 ); + nb_bits++; + } + + if ( element_mode != IVAS_CPE_MDCT || ( st1 != -2 && qn1 != SNS_LOW_BR_MODE ) ) + { + /* 2 bits to specify Q2,Q3,Q4,ext */ + nb_bits += 4; + i = qn1 - 2; + + if ( ( i < 0 ) || ( i > 3 ) ) + { + i = 3; + } + push_next_indice( hBstr, i, 2 ); + + i = qn2 - 2; + + if ( ( i < 0 ) || ( i > 3 ) ) + { + i = 3; + } + push_next_indice( hBstr, i, 2 ); + + /* Unary code for abs and rel LPC0/LPC2 */ + /* Q5 = 0, Q6=10, Q0=110, Q7=1110, ... */ + nb = qn1; + + if ( nb > 6 ) + { + nb -= 3; + } + else if ( nb > 4 ) + { + nb -= 4; + } + else if ( nb == 0 ) + { + nb = 3; + } + else + { + nb = 0; + } + + if ( nb > 0 ) + { + unary_code( nb, hBstr ); + } + nb_bits += nb; + + nb = qn2; + + if ( nb > 6 ) + { + nb -= 3; + } + else if ( nb > 4 ) + { + nb -= 4; + } + else if ( nb == 0 ) + { + nb = 3; + } + else + { + nb = 0; + } + + if ( nb > 0 ) + { + unary_code( nb, hBstr ); + } + nb_bits += nb; + + avqBits = 4 * qn1; + unpack4bits( avqBits, ¶m_lpc[j], hBstr ); + j += qn1; + nb_bits += avqBits; + + avqBits = 4 * qn2; + unpack4bits( avqBits, ¶m_lpc[j], hBstr ); + j += qn2; + nb_bits += avqBits; + } + } + else + { + j += nb_ind; + } + } + + return ( nb_bits ); +} diff --git a/lib_enc/qlpc_stoch.c b/lib_enc/qlpc_stoch.c new file mode 100644 index 0000000000000000000000000000000000000000..05e7d8ec00a9e00b22b5829bd189eec3d29bfd39 --- /dev/null +++ b/lib_enc/qlpc_stoch.c @@ -0,0 +1,325 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "rom_com.h" +#include "rom_enc.h" +#include "basop_proto_func.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * lpc_quantization() + * + * + *--------------------------------------------------------------------*/ + +void lpc_quantization( + Encoder_State *st, + const float lsp[], + const float lspmid[], + float lsp_q[], + float lsf_q[], + float lspmid_q[], + const int16_t coder_type, + const int16_t acelp_midLpc, + int16_t param_lpc[], + int16_t nbits_lpc[], + int16_t *bits_param_lpc, + int16_t *no_param_lpc ) +{ + int16_t nb_indices; + float lsfmid_q[M]; + int16_t lsfmid_idx; + int16_t i; + float lsf[M], lsfmid[M]; + int16_t force_sf; + float fec_lsf[M], stab; + + nb_indices = 0; + + /****** High-rate LPC quantizer *******/ + if ( st->lpcQuantization == 0 ) + { + lsp2lsf( lsp, lsf, M, st->sr_core ); + + if ( st->core == TCX_10_CORE ) + { + lsp2lsf( lspmid, lsfmid, M, st->sr_core ); + } + + qlpc_avq( lsf, lsfmid, lsf_q, lsfmid_q, param_lpc, &nb_indices, nbits_lpc, st->core, st->sr_core ); + + lsf2lsp( lsf_q, lsp_q, M, st->sr_core ); + + if ( st->core == TCX_10_CORE ) + { + lsf2lsp( lsfmid_q, lspmid_q, M, st->sr_core ); + } + + assert( nb_indices <= NPRM_LPC_NEW ); + } + + /****** Low-rate LPC quantizer *******/ + else if ( st->lpcQuantization == 1 ) + { + lsp2lsf( lsp, lsf, M, st->sr_core ); + + force_sf = 0; + /*Force safety net when possible in case of transitions*/ + if ( st->tc_cnt >= 1 || st->last_core_brate <= SID_2k40 || st->next_force_safety_net ) + { + force_sf = 1; + st->next_force_safety_net = 0; + } + + if ( st->next_force_safety_net == 1 && st->Opt_RF_ON ) + { + force_sf = 1; + st->next_force_safety_net = 0; + } + + if ( st->sr_core == INT_FS_16k && coder_type == UNVOICED ) + { + lsf_end_enc( st, lsf, lsf_q, ENDLSF_NBITS, GENERIC, force_sf, param_lpc, no_param_lpc, bits_param_lpc, GENERIC, NULL ); + + nb_indices = *no_param_lpc; + } + else + { + lsf_end_enc( st, lsf, lsf_q, ENDLSF_NBITS, coder_type, force_sf, param_lpc, no_param_lpc, bits_param_lpc, coder_type, NULL ); + + nb_indices = *no_param_lpc; + } + + FEC_lsf_estim_enc( st, fec_lsf ); + + /* FEC - calculate LSF stability */ + stab = lsf_stab( lsf_q, fec_lsf, 0, st->L_frame ); + + if ( stab < ( STAB_FAC_LIMIT + 0.2 ) && ( coder_type == VOICED || coder_type == GENERIC ) && st->Opt_RF_ON ) + { + st->next_force_safety_net = 1; + } + + lsf2lsp( lsf_q, lsp_q, M, st->sr_core ); + + *nbits_lpc = ENDLSF_NBITS; + } + else + { + assert( 0 ); + } + + st->seed_acelp = 0; + for ( i = nb_indices - 1; i >= 0; i-- ) + { + /* rightshift before seed_acelp+param_lpc[i] to avoid overflows*/ + st->seed_acelp = (int16_t) ( ( ( ( st->seed_acelp ) >> 1 ) + param_lpc[i] ) * 31821L + 13849L ); + } + + /* Mid-frame LPC quantization */ + if ( st->lpcQuantization && acelp_midLpc ) + { + if ( st->rate_switching_reset == 0 ) + { + lsp2lsf( lspmid, lsfmid, M, st->sr_core ); + midlsf_enc( st->lsf_old, lsf_q, lsfmid, &lsfmid_idx, M, st->Bin_E_old, st->narrowBand, st->sr_core, coder_type ); + param_lpc[nb_indices++] = lsfmid_idx; + + midlsf_dec( st->lsf_old, lsf_q, lsfmid_idx, lsfmid_q, M, coder_type, NULL, 0, 1 ); + + reorder_lsf( lsfmid_q, LSF_GAP_MID, M, st->sr_core ); + lsf2lsp( lsfmid_q, lspmid_q, M, st->sr_core ); + } + else + { + param_lpc[nb_indices++] = 0; + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * Unified_weighting() + * + * LSF weighting + *-------------------------------------------------------------------*/ + +void Unified_weighting( + const float Bin_Ener_128[], /* i : FFT Bin energy 128 bins in two sets */ + const float lsf[], /* i : LSF vector */ + float w[], /* o : LP weighting filter (numerator) */ + const int16_t narrowBand, /* i : flag for Narrowband */ + const int16_t unvoiced, /* i : flag for Unvoiced frame */ + const int32_t sr_core, /* i : sampling rate of core-coder */ + const int16_t order /* i : LP order */ +) +{ + int16_t i; + float nf; + const int16_t( *ptr_lsf_fit_model )[M]; + int16_t norm_lsf[M]; + float tmp, min_val; + float w_fft[M]; + float Bin_Ener_160[160]; + const float *Bin_Ener; + const float *Freq_w_Table; + int16_t last_bin; + + /*Config. weighting*/ + if ( narrowBand ) + { + ptr_lsf_fit_model = lsf_unified_fit_model_nb; + nf = 6400.f; + + last_bin = 127; + Bin_Ener = Bin_Ener_128; + } + else if ( sr_core == INT_FS_12k8 ) + { + ptr_lsf_fit_model = lsf_unified_fit_model_wb; + nf = 6400.f; + + last_bin = 127; + Bin_Ener = Bin_Ener_128; + } + else + { + ptr_lsf_fit_model = lsf_unified_fit_model_wbhb; + nf = 8000.f; + + /* Fill the missing part (128~159) of the bin energy */ + last_bin = 159; + + mvr2r( Bin_Ener_128, Bin_Ener_160, L_FFT / 2 ); + + /* Find average bin energy (32 Energy) */ + tmp = 0.f; + for ( i = 95; i < 127; i++ ) + { + tmp += Bin_Ener_160[i]; + } + + tmp = tmp / 32.f; + for ( i = 127; i < 160; i++ ) + { + Bin_Ener_160[i] = tmp; + } + + Bin_Ener = Bin_Ener_160; + } + + /* 1) FFT weights*/ + if ( unvoiced ) + { + Freq_w_Table = Freq_Weight_UV; + } + else + { + Freq_w_Table = Freq_Weight_Com; + } + + /* Use Envelope */ + min_val = 1000.0f; + for ( i = 0; i < M; i++ ) + { + norm_lsf[i] = (int16_t) ( ( lsf[i] / 50.f ) + 0.5f ); + + if ( norm_lsf[i] == 0 ) + { + w_fft[i] = Bin_Ener[1]; + } + else if ( norm_lsf[i] == last_bin ) + { + w_fft[i] = Bin_Ener[last_bin - 1]; + } + else + { + tmp = max( Bin_Ener[norm_lsf[i]], Bin_Ener[norm_lsf[i] - 1] ); + w_fft[i] = max( Bin_Ener[norm_lsf[i] + 1], tmp ); + } + + if ( w_fft[i] < MIN_LOG_60dB ) + { + w_fft[i] = MIN_LOG_VAL_60dB; + } + else + { + w_fft[i] = (float) ( 10.0 * log10( w_fft[i] ) ); + } + + if ( w_fft[i] < min_val ) + { + min_val = w_fft[i]; + } + } + + for ( i = 0; i < M; i++ ) + { + w_fft[i] = (float) ( sqrt( w_fft[i] - min_val ) + 2.f ); + w_fft[i] *= Freq_w_Table[norm_lsf[i]]; + } + + /* 2) IHM weights*/ + w[0] = 1.f / ( lsf[0] - 0 ) + 1.f / ( lsf[1] - lsf[0] ); + for ( i = 1; i < order - 1; i++ ) + { + w[i] = 1.f / ( lsf[i] - lsf[i - 1] ) + 1.f / ( lsf[i + 1] - lsf[i] ); + } + w[order - 1] = 1.f / ( lsf[order - 1] - lsf[order - 2] ) + + 1.f / ( nf - lsf[order - 1] ); + + /* 3) Fitting model combining the two weights*/ + for ( i = 0; i < order; i++ ) + { + w[i] *= ( nf / EVS_PI ); + w[i] = ( (float) ( ptr_lsf_fit_model[0][i] ) / ( 1 << 10 ) ) + w[i] * ( (float) ( ptr_lsf_fit_model[1][i] ) / ( 1 << 15 ) ) + w[i] * w[i] * ( (float) ( ptr_lsf_fit_model[2][i] ) / ( 1 << 18 ) ) + w_fft[i] * ( (float) ( ptr_lsf_fit_model[3][i] ) / ( 1 << 12 ) ); + + if ( w[i] < 1.f / ( i + 1 ) ) + { + w[i] = 1.f / ( i + 1 ); + } + } + + return; +} diff --git a/lib_enc/range_enc.c b/lib_enc/range_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..9074c9a9a60cc57bb5c9e66c3c232b8ac2d8fb7b --- /dev/null +++ b/lib_enc/range_enc.c @@ -0,0 +1,326 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * Local function prototypes + *-------------------------------------------------------------------*/ + +static void rc_enc_shift( BSTR_ENC_HANDLE hBstr, PVQ_ENC_HANDLE hPVQ ); + +static void rc_enc_write( BSTR_ENC_HANDLE hBstr, const int16_t byte, const int16_t bits ); + + +/*-------------------------------------------------------------------* + * rc_enc_init() + * + * Initalize range coder + *-------------------------------------------------------------------*/ + +void rc_enc_init( + PVQ_ENC_HANDLE hPVQ, /* i/o: PVQ encoder handle */ + int16_t tot_bits /* i : Total bit budget */ +) +{ + hPVQ->rc_low = 0; + hPVQ->rc_range = 0xffffffff; + hPVQ->rc_cache = -1; + hPVQ->rc_carry = 0; + hPVQ->rc_carry_count = 0; + hPVQ->rc_num_bits = 0; + hPVQ->rc_tot_bits = tot_bits; + hPVQ->rc_offset = 0; + + return; +} + +/*-------------------------------------------------------------------* + * rc_encode() + * + * Encode symbol with range coder + *-------------------------------------------------------------------*/ + +void rc_encode( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + PVQ_ENC_HANDLE hPVQ, /* i/o: PVQ encoder handle */ + const uint32_t cum_freq, /* i : Cumulative frequency up to symbol */ + const uint32_t sym_freq, /* i : Symbol probability */ + const uint32_t tot /* i : Total cumulative frequency */ +) +{ + uint32_t r, tmp; + uint32_t inv_tot; + int16_t exp; + + inv_tot = UL_inverse( tot, &exp ); + tmp = UMult_32_32( hPVQ->rc_range, inv_tot ); + r = tmp >> ( exp - 32 ); + tmp = r * cum_freq; + + hPVQ->rc_low = hPVQ->rc_low + tmp; + if ( hPVQ->rc_low < tmp ) + { + hPVQ->rc_carry = 1; + } + + hPVQ->rc_range = r * sym_freq; + + while ( hPVQ->rc_range < 1 << 24 ) + { + hPVQ->rc_range = hPVQ->rc_range << 8; + hPVQ->rc_num_bits += 8; + rc_enc_shift( hBstr, hPVQ ); + } + + return; +} + +/*-------------------------------------------------------------------* + * rc_enc_finish() + * + * Finalize range coder + *-------------------------------------------------------------------*/ + +void rc_enc_finish( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + PVQ_ENC_HANDLE hPVQ /* i/o: PVQ encoder handle */ +) +{ + uint32_t val, mask, high; + int16_t bits, over1, over2; + + bits = norm_ul( hPVQ->rc_range ) + 1; /* aligned to BASOP */ + mask = 0xffffffff >> bits; + + val = hPVQ->rc_low + mask; + high = hPVQ->rc_low + hPVQ->rc_range; + + over1 = val < hPVQ->rc_low; + over2 = high < hPVQ->rc_low; + + val = val & ~mask; + + if ( !( over1 ^ over2 ) ) + { + if ( ( val + mask ) >= high ) + { + bits++; + mask >>= 1; + val = ( hPVQ->rc_low + mask ) & ~mask; + } + + if ( val < hPVQ->rc_low ) + { + hPVQ->rc_carry = 1; + } + } + + hPVQ->rc_low = val; + + if ( bits > hPVQ->rc_tot_bits - hPVQ->rc_num_bits ) + { + bits = hPVQ->rc_tot_bits - hPVQ->rc_num_bits; + } + + hPVQ->rc_num_bits += bits; + while ( bits > 0 ) + { + rc_enc_shift( hBstr, hPVQ ); + bits -= 8; + } + + bits += 8; + + if ( hPVQ->rc_carry_count > 0 ) + { + rc_enc_write( hBstr, hPVQ->rc_cache + hPVQ->rc_carry, 8 ); + + while ( hPVQ->rc_carry_count > 1 ) + { + rc_enc_write( hBstr, ( hPVQ->rc_carry + 0xff ), 8 ); + hPVQ->rc_carry_count--; + } + rc_enc_write( hBstr, ( hPVQ->rc_carry + 0xff ) & ( ( 1 << bits ) - 1 ), bits ); + } + else + { + rc_enc_write( hBstr, ( hPVQ->rc_cache + hPVQ->rc_carry ) >> ( 8 - bits ), bits ); + } + + bits = hPVQ->rc_num_bits; + while ( bits < hPVQ->rc_tot_bits - 16 ) + { + rc_enc_write( hBstr, 0, 16 ); + bits += 16; + } + + bits = hPVQ->rc_tot_bits - bits; + if ( bits > 0 ) + { + rc_enc_write( hBstr, 0, bits ); + } + + return; +} + +/*-------------------------------------------------------------------* + * rc_enc_shift() + * + * Shift a byte out to bitstream + *-------------------------------------------------------------------*/ + +static void rc_enc_shift( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + PVQ_ENC_HANDLE hPVQ /* i/o: PVQ encoder handle */ +) +{ + + if ( hPVQ->rc_low < ( 0xffUL << 24 ) || hPVQ->rc_carry ) + { + if ( hPVQ->rc_cache >= 0 ) + { + rc_enc_write( hBstr, hPVQ->rc_cache + hPVQ->rc_carry, 8 ); + } + + while ( hPVQ->rc_carry_count > 0 ) + { + rc_enc_write( hBstr, ( hPVQ->rc_carry + 0xff ) & 255, 8 ); + hPVQ->rc_carry_count--; + } + + hPVQ->rc_cache = hPVQ->rc_low >> 24; + hPVQ->rc_carry = 0; + } + else + { + hPVQ->rc_carry_count++; + } + + hPVQ->rc_low = hPVQ->rc_low << 8; + + return; +} + +/*-------------------------------------------------------------------* + * rc_enc_bits() + * + * + *-------------------------------------------------------------------*/ + +void rc_enc_bits( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle*/ + PVQ_ENC_HANDLE hPVQ, /* i/o: PVQ encoder handle */ + const uint32_t value, /* i : Value to encode */ + const int16_t bits /* i : Number of bits used */ +) +{ + + if ( rc_get_bits2( hPVQ->rc_num_bits, hPVQ->rc_range ) + bits <= hPVQ->rc_tot_bits ) + { + hPVQ->rc_num_bits += bits; + if ( bits > 16 ) + { + push_indice( hBstr, IND_RC_END - hPVQ->rc_offset, (int16_t) ( value >> 16 ), bits - 16 ); + hPVQ->rc_offset++; + + push_indice( hBstr, IND_RC_END - hPVQ->rc_offset, (int16_t) ( value & ( ( 1 << 16 ) - 1 ) ), 16 ); + hPVQ->rc_offset++; + } + else + { + push_indice( hBstr, IND_RC_END - hPVQ->rc_offset++, (int16_t) value, bits ); + } + } + else + { + } + + return; +} + +/*-------------------------------------------------------------------* + * rc_enc_uniform() + * + * Encode with uniform distribution + *-------------------------------------------------------------------*/ + +void rc_enc_uniform( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + PVQ_ENC_HANDLE hPVQ, /* i/o: PVQ encoder handle */ + uint32_t value, /* i : Value to encode */ + uint32_t tot /* i : Maximum value */ +) +{ + int16_t n; + + n = 32 - norm_ul( tot - 1 ); /* aligned to BASOP */ + + if ( n <= 8 ) + { + rc_encode( hBstr, hPVQ, value, 1, tot ); + } + else + { + n -= 8; + rc_encode( hBstr, hPVQ, value >> n, 1, ( tot >> n ) + 1 ); + rc_enc_bits( hBstr, hPVQ, value & ( ( 1 << n ) - 1 ), n ); + } + + return; +} + +/*-------------------------------------------------------------------* + * rc_enc_write() + * + * Write a byte to bitstream + *-------------------------------------------------------------------*/ + +static void rc_enc_write( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const int16_t byte, /* i : Byte to write */ + const int16_t bits /* i : Number of bits */ +) +{ + push_indice( hBstr, IND_RC_START, byte, bits ); + + return; +} diff --git a/lib_enc/re8_cod.c b/lib_enc/re8_cod.c new file mode 100644 index 0000000000000000000000000000000000000000..72b6c50bb8084bb03b19df0e099308e6ae535a5d --- /dev/null +++ b/lib_enc/re8_cod.c @@ -0,0 +1,86 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "prot.h" +#include "wmc_auto.h" + + +/*------------------------------------------------------------------------ + * re8_cod() + * + * MULTI-RATE INDEXING OF A POINT y in THE LATTICE RE8 (INDEX COMPUTATION) + *--------------------------------------------------------------------------*/ + +void re8_cod( + int16_t x[], /* i : point in RE8 (8-dimensional integer vector) */ + int16_t *n, /* i : codebook number (*n is an integer defined in {0,2,3,4,..,n_max}) */ + uint16_t *I, /* o : index of c (pointer to unsigned 16-bit word) */ + int16_t k[] /* o : index of v (8-dimensional vector of binary indices) = Voronoi index */ +) +{ + int16_t ka, c[8]; + + /*---------------------------------------------------------------------- + * decompose x as x = 2^r c + v, where r is an integer >=0, c is an element + * of Q0, Q2, Q3 or Q4, and v is an element of a Voronoi code in RE8 + * (if r=0, x=c) + * this decomposition produces as a side-product the index k[] of v + * and the identifier ka of the absolute leader related to c + * + * the index of y is split into 2 parts : + * - the index I of c + * - the index k[] of v + ----------------------------------------------------------------------*/ + + re8_vor( x, n, k, c, &ka ); + + /* safeguard in case that the AVQ subquantizer is not found - might happen for extremely strong onsets at the end of the frame */ + if ( ka >= NB_LEADER ) + { + *n = 0; + set_s( x, 0, 8 ); + } + + /* compute the index I (only if c is in Q2, Q3 or Q4) */ + if ( *n > 0 ) + { + re8_compute_base_index( c, ka, I ); + } + + return; +} diff --git a/lib_enc/reordernorm.c b/lib_enc/reordernorm.c new file mode 100644 index 0000000000000000000000000000000000000000..96c7c0f5207308384cbeb2a533486a222ef669aa --- /dev/null +++ b/lib_enc/reordernorm.c @@ -0,0 +1,85 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "prot.h" +#include "cnst.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*--------------------------------------------------------------------------*/ +/* Function reordernorm */ +/* ~~~~~~~~~~~~~~~~~~~~~ */ +/* */ +/* Reorder quantization indices and norms */ +/*--------------------------------------------------------------------------*/ + +void reordernorm( + const int16_t *ynrm, /* i : quantization indices for norms */ + const int16_t *normqlg2, /* i : quantized norms */ + int16_t *idxbuf, /* o : reordered quantization indices */ + int16_t *normbuf, /* o : reordered quantized norms */ + const int16_t nb_sfm /* i : number of bands */ +) +{ + int16_t i; + const int16_t *order = NULL; + + switch ( nb_sfm ) + { + case NB_SFM: + order = norm_order_48; + break; + case SFM_N_SWB: + order = norm_order_32; + break; + case SFM_N_WB: + order = norm_order_16; + break; + default: + order = norm_order_48; + break; + } + + for ( i = 0; i < nb_sfm; i++ ) + { + idxbuf[i] = ynrm[order[i]]; + normbuf[i] = normqlg2[order[i]]; + } + + return; +} diff --git a/lib_enc/rom_enc.c b/lib_enc/rom_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..ea1d5b46904c935ee3cf181c99ff3a9b69ff38d8 --- /dev/null +++ b/lib_enc/rom_enc.c @@ -0,0 +1,1023 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "wmc_auto.h" + +/* clang-format off */ + +/*----------------------------------------------------------------------------------* + * VAD ROM tables + *----------------------------------------------------------------------------------*/ + +const int16_t hangover_hd_tbl[3] = {1, 1, 3}; +const int16_t hangover_sf_tbl[6] = {1, 3, 4, 1, 1, 2}; +const int16_t bwd_start_bin[BWD_N_BINS_MAX] = {1, 3, 6, 11}; +const int16_t bwd_end_bin[BWD_N_BINS_MAX] = {1, 4, 9, 12}; + +const int16_t BAND_NUM_TAB[5] = {10,10,20,40,60}; /* {OFFSET, NB, WB, SWB, FB} */ + +const float M_inr[16] = +{ + 1.00000000f, 0.98078525f, 0.92387950f, 0.83146960f, 0.70710677f, 0.55557019f, 0.38268343f, 0.19509035f, + 0.00000008f, -0.19509020f, -0.38268328f, -0.55557019f, -0.70710677f, -0.83146966f, -0.92387962f, -0.98078531f +}; + +const float M_ini[16] = +{ + 0.00000000f, 0.19509032f, 0.38268346f, 0.55557024f, 0.70710677f, 0.83146966f, 0.92387950f, 0.98078525f, + 1.00000000f, 0.98078531f, 0.92387956f, 0.83146966f, 0.70710677f, 0.55557019f, 0.38268328f, 0.19509009f +}; + +const float M_r[8] = +{ + 1.00000000f, 0.92387950f, 0.70710677f, 0.38268343f, -0.00000004f, -0.38268352f, -0.70710677f, -0.92387950f +}; + +const float M_i[8] = +{ + 0.00000000f, 0.38268346f, 0.70710677f, 0.92387950f, 1.00000000f, 0.92387950f, 0.70710677f, 0.38268349f +}; + +const float M_Wr[16]= +{ + 9.9518473e-001f, 9.5694034e-001f, 8.8192126e-001f, 7.7301045e-001f, 6.3439328e-001f, 4.7139674e-001f, 2.9028468e-001f, 9.8017140e-002f, + -9.8017140e-002f, -2.9028468e-001f, -4.7139674e-001f, -6.3439328e-001f, -7.7301045e-001f, -8.8192126e-001f, -9.5694034e-001f, -9.9518473e-001f +}; + +const float M_Wi[16] = +{ + 9.8017140e-002f, 2.9028468e-001f, 4.7139674e-001f, 6.3439328e-001f, 7.7301045e-001f, 8.8192126e-001f, 9.5694034e-001f, 9.9518473e-001f, + 9.9518473e-001f, 9.5694034e-001f, 8.8192126e-001f, 7.7301045e-001f, 6.3439328e-001f, 4.7139674e-001f, 2.9028468e-001f, 9.8017140e-002f +}; + +const int16_t SP_CENTER_BAND_NUM_TAB[5] = {10, 10, 20, 24, 24}; + +/* 107374184.f = 32768.f * 32768.f * 0.1 */ +const float VAD_DELTA1[5] = {107374184.f, 0.0f, 107374184.f, 107374184.f, 0.0f}; +const float VAD_DELTA2[5] = {107374184.f, 1.f, 107374184.f, 107374184.f, 107374184.f}; + +const int16_t NREGION_INDEX_NB[9] = {0,1,2,3,4,5,6,7, 9}; +const int16_t NREGION_INDEX_WB[13] = {0,1,2,3,4,5,6,8,10,12,16}; +const int16_t NREGION_INDEX_SWB[16] = {0,1,2,3,4,5,6,8,10,12,16,24,36}; +const int16_t NREGION_INDEX_FB[16] = {0,1,2,3,4,5,6,8,10,12,16,24,36}; +const int16_t ENERGY_BAND_NUM[4] = {8,10,12,MAX_SUBBAND_NUM}; +const int16_t * const REGION_INDEX[4] = {NREGION_INDEX_NB, NREGION_INDEX_WB,NREGION_INDEX_SWB,NREGION_INDEX_FB}; +const float MAX_LF_SNR_TAB[4] = {0.8f, 0.8f, 1.6f, 0.8f}; + +const float COMVAD_INIT_SNR_DELTA[5] = {1.0f, 0.6f, 0.86f, 1.16f, 1.0f}; +const float LS_MIN_SELENCE_SNR[3] = {7.5f, 7.5f, 6.8f}; +const float LT_MIN_SILENCE_SNR[3] = {4.5f, 4.5f, 4.5f}; + +/* half of the square root hanning window for spectral analysis */ +const float sqrt_han_window[L_FFT/2+1]= +{ + 0.000000f, 0.012272f, 0.024541f, 0.036807f, 0.049068f, 0.061321f, 0.073565f, 0.085797f, + 0.098017f, 0.110222f, 0.122411f, 0.134581f, 0.146730f, 0.158858f, 0.170962f, 0.183040f, + 0.195090f, 0.207111f, 0.219101f, 0.231058f, 0.242980f, 0.254866f, 0.266713f, 0.278520f, + 0.290285f, 0.302006f, 0.313682f, 0.325310f, 0.336890f, 0.348419f, 0.359895f, 0.371317f, + 0.382683f, 0.393992f, 0.405241f, 0.416430f, 0.427555f, 0.438616f, 0.449611f, 0.460539f, + 0.471397f, 0.482184f, 0.492898f, 0.503538f, 0.514103f, 0.524590f, 0.534998f, 0.545325f, + 0.555570f, 0.565732f, 0.575808f, 0.585798f, 0.595699f, 0.605511f, 0.615232f, 0.624860f, + 0.634393f, 0.643832f, 0.653173f, 0.662416f, 0.671559f, 0.680601f, 0.689541f, 0.698376f, + 0.707107f, 0.715731f, 0.724247f, 0.732654f, 0.740951f, 0.749136f, 0.757209f, 0.765167f, + 0.773010f, 0.780737f, 0.788346f, 0.795837f, 0.803208f, 0.810457f, 0.817585f, 0.824589f, + 0.831470f, 0.838225f, 0.844854f, 0.851355f, 0.857729f, 0.863973f, 0.870087f, 0.876070f, + 0.881921f, 0.887640f, 0.893224f, 0.898674f, 0.903989f, 0.909168f, 0.914210f, 0.919114f, + 0.923880f, 0.928506f, 0.932993f, 0.937339f, 0.941544f, 0.945607f, 0.949528f, 0.953306f, + 0.956940f, 0.960431f, 0.963776f, 0.966976f, 0.970031f, 0.972940f, 0.975702f, 0.978317f, + 0.980785f, 0.983105f, 0.985278f, 0.987301f, 0.989177f, 0.990903f, 0.992480f, 0.993907f, + 0.995185f, 0.996313f, 0.997290f, 0.998118f, 0.998795f, 0.999322f, 0.999699f, 0.999925f, + 1.000000f +}; + +/*----------------------------------------------------------------------------------* + * Starting points for pulse position search in Algebraic innovation codebook + *----------------------------------------------------------------------------------*/ +const int16_t tipos[40] = +{ + 0, 1, 2, 3, /* starting point &ipos[0], 1st iter */ + 1, 2, 3, 0, /* starting point &ipos[4], 2nd iter */ + 2, 3, 0, 1, /* starting point &ipos[8], 3rd iter */ + 3, 0, 1, 2, /* starting point &ipos[12], 4th iter */ + 0, 1, 2, 3, + 1, 2, 3, 0, + 2, 3, 0, 1, + 3, 0, 1, 2, + 0, 1, 2, 3, + 1, 2, 3, 0 /* end point for 28 pulses &ipos[39], 4th iter */ +}; + +/*----------------------------------------------------------------------------------* + * 1/4 resolution interpolation filter (-3 dB at 0.791*fs/2) + * for fractional pitch search + *----------------------------------------------------------------------------------*/ + +/* 1/4 resolution interpolation filter (-3 dB at 0.791*fs/2) */ +const float E_ROM_inter4_1[PIT_UP_SAMP * L_INTERPOL1 + 1] = +{ + 0.900000F, + 0.818959F, 0.604850F, 0.331379F, 0.083958F, + -0.075795F, -0.130717F, -0.105685F, -0.046774F, + 0.004467F, 0.027789F, 0.025642F, 0.012571F, + 0.001927F, -0.001571F, -0.000753F, 0.000000f +}; + +/* 1/6 resolution interpolation filter (-3 dB at 0.9*fs/2) */ +const float E_ROM_inter6_1[PIT_UP_SAMP6 * L_INTERPOL1 + 1] = +{ + 0.900848F, + 0.864136F, 0.760071F, 0.605408F, 0.424072F, + 0.242462F, 0.0840759F, -0.0343933F, -0.105560F, + -0.131348F, -0.121124F, -0.0884705F, -0.0476379F, + -0.0102539F, 0.0162964F, 0.0296021F, 0.0312195F, + 0.0251160F, 0.0157471F, 0.00671387F, 0.000000F, + -0.00399780F, -0.00592041F, -0.00656128F, 0.000000F +}; + +/*----------------------------------------------------------------------------------* + * Open-loop pitch tables + *----------------------------------------------------------------------------------*/ + +const int16_t nb_sect_12k8[3] = { 4, 4, 4 }; +const int16_t nb_subsect_12k8[3] = { 7, 7, 7 }; +const int16_t pit_max_12k8[8] = { 11, 16, 21, 31, 40, 61, 77, 115}; + +const int16_t len_12k8[4] = { 40, 40, 62, 115 }; +const int16_t len1_12k8[4] = { 40, 50, 80, 115 }; +const int16_t sublen_12k8[7] = { 40, 40, 40, 62, 62, 115, 115 }; +const int16_t sublen1_12k8[7] = { 40, 40, 50, 50, 80, 80, 115 }; +const int16_t sec_length_12k8[4] = { 7, 15, 30, 54 }; +const int16_t sec_length1_12k8[4] = { 10, 19, 37, 38 }; +const float h_fir[5] = {0.13f, 0.23f, 0.28f, 0.23f, 0.13f}; + +const float W_HIST[DTX_HIST_SIZE] = +{ + 0.2f, 0.16f, 0.128f, 0.1024f, 0.08192f, 0.065536f, 0.0524288f, 0.01048576f +}; + +const float preemphCompensation[NB_BANDS] = { 9.7461f, 9.5182f, 9.0262f, 8.3493f, 7.5764f, 6.7838f, 5.8377f, 4.8502f, 4.0346f, 3.2788f, 2.6283f, 2.0920f, 1.6304f, 1.2850f, 1.0108f, 0.7916f, 0.6268f, 0.5011f, 0.4119f, 0.3637f }; + +/*----------------------------------------------------------------------------------* + * LSF quantizer + *----------------------------------------------------------------------------------*/ + +const int16_t lsf_numlevels[TCXLPC_NUMSTAGES] = { 32, 16, 16 }; +const int16_t lsf_ind_numlevels[TCXLPC_IND_NUMSTAGES] = { 4 }; + +const int16_t lsf_unified_fit_model_nb[4][16] = +{ + {12506 , -17641 , -6444 , -6646 , -3523 , -2132 , -511 , -92 , 699 , 1062 , 2578 , 3564 , 3200 , -285 , 2928 , -250}, + {20383 , 18855 , 8494 , 8062 , 8105 , 6211 , 5068 , 4408 , 3741 , 3458 , 2732 , 3174 , 2412 , 17421 , -21717 , 0}, + {-717 , -617 , -144 , -117 , -229 , -144 , -141 , -98 , -92 , -69 , -51 , -87 , -37 , -3019 , 19864 , 8034}, + {-2424 , 8999 , 5723 , 5629 , 4239 , 3423 , 2507 , 2019 , 1245 , 736 , -907 , -2237 , -2558 , -1979 , -652 , 1657} +}; + +const int16_t lsf_unified_fit_model_wb[4][16] = +{ + {8323 , -567 , 3402 , 1389 , 1437 , 1820 , 1407 , 1299 , 1292 , 1206 , 1031 , 928 , 898 , 832 , 840 , 681}, + {24635 , 19605 , 9294 , 7407 , 6419 , 5459 , 4966 , 4189 , 3394 , 2964 , 2425 , 2110 , 2140 , 1972 , 1540 , 2252}, + {-867 , -666 , -168 , -114 , -90 , -122 , -129 , -101 , -65 , -56 , -39 , -35 , -40 , -42 , -35 , -56}, + {-2313 , 3035 , 1677 , 2854 , 2334 , 1232 , 1347 , 1034 , 863 , 707 , 886 , 891 , 432 , 357 , 206 , -310} +}; + +const int16_t lsf_unified_fit_model_wbhb[4][16] = +{ + {5312 , 1967 , 2914 , 1438 , 2595 , 1848 , 1980 , 2021 , 1535 , 1489 , 1651 , 1502 , 1447 , 1311 , 1353 , 1202}, + {28135 , 16053 , 10129 , 7366 , 5898 , 5341 , 3290 , 2780 , 3146 , 2423 , 1613 , 1370 , 1294 , 1635 , 1105 , 1431}, + {-615 , -308 , -147 , -119 , -104 , -105 , -30 , -28 , -50 , -39 , -15 , -14 , -14 , -21 , -19 , -29}, + {1534 , 3569 , 3138 , 4023 , 2105 , 2023 , 2046 , 1264 , 1340 , 1067 , 780 , 547 , 188 , -540 , -722 , -479} +}; + +/* LPC weights used in SWB TBE */ +const float lpc_weights[LPC_SHB_ORDER+1] = +{ + 1.0f, 0.975000000f, 0.950625000f, 0.926859375f, 0.903687891f, + 0.881095693f, 0.859068301f, 0.837591593f, 0.816651804f, + 0.796235509f, 0.776329621f +}; + +/* LSF weighting */ +const float Freq_Weight_Com[160] = +{ + 0.50000000f, 0.62940955f, 0.75000000f, 0.85355341f, 0.93301272f, 0.98296291f, 1.00000000f, 1.00000000f, + 1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f, + 1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f, 0.97272730f, 0.94690263f, 0.92241377f, + 0.89915967f, 0.87704921f, 0.85600001f, 0.83593750f, 0.81679392f, 0.79850745f, 0.78102189f, 0.76428574f, + 0.74825174f, 0.73287672f, 0.71812081f, 0.70394737f, 0.69032258f, 0.67721522f, 0.66459626f, 0.65243900f, + 0.64071858f, 0.62941176f, 0.61849713f, 0.60795456f, 0.59776539f, 0.58791208f, 0.57837838f, 0.56914896f, + 0.56020945f, 0.55154639f, 0.54314721f, 0.53500003f, 0.52709359f, 0.51941746f, 0.51196170f, 0.50471699f, + 0.49767441f, 0.49082568f, 0.48416290f, 0.47767857f, 0.47136563f, 0.46521738f, 0.45922747f, 0.45338982f, + 0.44769874f, 0.44214877f, 0.43673471f, 0.43145162f, 0.42629483f, 0.42125985f, 0.41634241f, 0.41153845f, + 0.40684411f, 0.40225562f, 0.39776951f, 0.39338234f, 0.38909090f, 0.38489208f, 0.38078293f, 0.37676057f, + 0.37282231f, 0.36896551f, 0.36518770f, 0.36148649f, 0.35785952f, 0.35430464f, 0.35081968f, 0.34740260f, + 0.34405145f, 0.34076434f, 0.33753943f, 0.33437499f, 0.33126935f, 0.32822084f, 0.32522798f, 0.32228917f, + 0.31940299f, 0.31656805f, 0.31378299f, 0.31104651f, 0.30835736f, 0.30571428f, 0.30311614f, 0.30056179f, + 0.29805014f, 0.29558012f, 0.29315069f, 0.29076087f, 0.28840971f, 0.28609625f, 0.28381962f, 0.28157896f, + 0.27937338f, 0.27720207f, 0.27506426f, 0.27295917f, 0.27088606f, 0.26884422f, 0.26683292f, 0.26485148f, + 0.26289925f, 0.26097560f, 0.25907990f, 0.25721154f, 0.25536993f, 0.25355449f, 0.25176471f, 0.25000000f, + 0.24825986f, 0.24654378f, 0.24485126f, 0.24318182f, 0.24153499f, 0.23991032f, 0.23830736f, 0.23672566f, + 0.23516484f, 0.23362446f, 0.23210412f, 0.23060344f, 0.22912206f, 0.22765957f, 0.22621565f, 0.22478992f, + 0.22338204f, 0.22199170f, 0.22061856f, 0.21926230f, 0.21792261f, 0.21659920f, 0.21529175f, 0.21400000f, + 0.21272366f, 0.21146245f, 0.21021610f, 0.20898438f, 0.20776699f, 0.20656371f, 0.20537429f, 0.20419848f +}; + +const float Freq_Weight_UV[160] = +{ + 0.50000000f, 0.62940955f, 0.75000000f, 0.85355341f, 0.93301272f, 0.98296291f, 1.00000000f, 0.99180329f, + 0.98373985f, 0.97580647f, 0.96799999f, 0.96031743f, 0.95275593f, 0.94531250f, 0.93798447f, 0.93076921f, + 0.92366409f, 0.91666669f, 0.90977442f, 0.90298510f, 0.89629632f, 0.88970590f, 0.88321167f, 0.87681162f, + 0.87050360f, 0.86428571f, 0.85815603f, 0.85211265f, 0.84615386f, 0.84027779f, 0.83448273f, 0.82876712f, + 0.82312924f, 0.81756759f, 0.81208056f, 0.80666667f, 0.80132449f, 0.79605263f, 0.79084969f, 0.78571427f, + 0.78064513f, 0.77564102f, 0.77070063f, 0.76582277f, 0.76100630f, 0.75625002f, 0.75155282f, 0.74691355f, + 0.74233127f, 0.73780489f, 0.73333335f, 0.72891569f, 0.72455090f, 0.72023809f, 0.71597636f, 0.71176469f, + 0.70760232f, 0.70348835f, 0.69942194f, 0.69540232f, 0.69142854f, 0.68750000f, 0.68361580f, 0.67977530f, + 0.67597765f, 0.67222220f, 0.66850829f, 0.66483516f, 0.66120219f, 0.65760869f, 0.65405405f, 0.65053761f, + 0.64705884f, 0.64361703f, 0.64021164f, 0.63684213f, 0.63350785f, 0.63020831f, 0.62694299f, 0.62371135f, + 0.62051284f, 0.61734694f, 0.61421317f, 0.61111110f, 0.60804021f, 0.60500002f, 0.60199004f, 0.59900987f, + 0.59605908f, 0.59313726f, 0.59024388f, 0.58737862f, 0.58454108f, 0.58173078f, 0.57894737f, 0.57619047f, + 0.57345974f, 0.57075471f, 0.56807512f, 0.56542057f, 0.56279069f, 0.56018519f, 0.55760366f, 0.55504584f, + 0.55251139f, 0.55000001f, 0.54751134f, 0.54504502f, 0.54260087f, 0.54017860f, 0.53777778f, 0.53539824f, + 0.53303963f, 0.53070176f, 0.52838427f, 0.52608699f, 0.52380955f, 0.52155173f, 0.51931328f, 0.51709402f, + 0.51489359f, 0.51271188f, 0.51054853f, 0.50840336f, 0.50627613f, 0.50416666f, 0.50207472f, 0.50000000f, + 0.49794239f, 0.49590164f, 0.49387756f, 0.49186993f, 0.48987854f, 0.48790324f, 0.48594376f, 0.48400000f, + 0.48207173f, 0.48015872f, 0.47826087f, 0.47637796f, 0.47450981f, 0.47265625f, 0.47081712f, 0.46899223f, + 0.46718147f, 0.46538460f, 0.46360153f, 0.46183205f, 0.46007603f, 0.45833334f, 0.45660377f, 0.45488721f, + 0.45318353f, 0.45149255f, 0.44981414f, 0.44814816f, 0.44649446f, 0.44485295f, 0.44322345f, 0.44160584f +}; + +/*----------------------------------------------------------------------------------* + * Speech/music classification + *----------------------------------------------------------------------------------*/ + +const float w_spmus[HANG_LEN][HANG_LEN] = +{ + {1.0f, 0, 0, 0, 0, 0, 0, 0}, + {0.6f, 0.4f, 0, 0, 0, 0, 0, 0}, + {0.47f, 0.33f, 0.2f, 0, 0, 0, 0, 0}, + {0.4f, 0.3f, 0.2f, 0.1f, 0, 0, 0, 0}, + {0.30f, 0.25f, 0.2f, 0.15f, 0.1f, 0, 0, 0}, + {0.233f, 0.207f, 0.18f, 0.153f, 0.127f, 0.1f, 0, 0}, + {0.235f, 0.205f, 0.174f, 0.143f, 0.112f, 0.081f, 0.05f, 0}, + {0.200f, 0.179f, 0.157f, 0.136f, 0.114f, 0.093f, 0.071f, 0.05f} +}; + +const float sm_means[N_SMC_FEATURES] = +{ + 109.073304f, 0.727576f, 0.246557f, 0.291464f, 0.836498f, 1.021915f, 1.213649f, 64.230265f, 1.236224f, -2.347783f, 1.795570f, -0.039230f, -0.292081f, 0.611993f, 5.587905f, +}; + +const float sm_scale[N_SMC_FEATURES] = +{ + 44.621579f, 0.159182f, 0.063806f, 0.067614f, 0.112130f, 0.103447f, 0.091769f, 16.522003f, 0.115806f, 1.284023f, 3.337835f, 1.726416f, 1.422670f, 0.270914f, 0.422958f, +}; + +const float hout_intervals[N_SMC_FEATURES * 2] = +{ + 18.000000f, 230.000000f, 0.000000f, 0.999769f, 0.119389f, 0.990880f, 0.255791f, 1.181627f, + 0.406328f, 1.384250f, 0.580520f, 1.543470f, 0.780707f, 1.881730f, 0.000000f, 121.586754f, + 0.000000f, 262.696747f, -8.535435f, -0.000056f, -14.433754f, 17.815642f, -10.632537f, 12.045707f, + -11.751500f, 10.883281f, 0.000793f, 1.994476f, + 3.021017f, 10.545962f, +}; + +const float bcox_add_cnst[N_SMC_FEATURES] = +{ + 0.000000f, 0.000000f, -0.878682f, -0.726044f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + -0.778993f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f +}; + +const float bcox_lmbd[N_SMC_FEATURES] = +{ + 0.000000f, 0.000000f, -0.664282f, -0.422504f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + -0.634475f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, +}; + +const float pca_mean_[N_SMC_FEATURES] = +{ + 0.000000f, 0.000000f, 0.000000f, 0.000000f, -0.000000f, -0.000000f, 0.000000f, -0.000000f, + -0.000000f, 0.000000f, 0.000000f, -0.000000f, 0.000000f, 0.000000f, 0.000000f +}; + +const float pca_components_[N_SMC_FEATURES * N_PCA_COEF] = +{ + 0.025076f, -0.242897f, 0.309604f, 0.391805f, 0.384930f, 0.378366f, 0.352165f, -0.191363f, 0.158511f, 0.329501f, 0.145794f, 0.086507f, 0.009591f, 0.276506f, -0.007154f, + 0.257163f, -0.155283f, 0.246218f, 0.085165f, 0.045108f, 0.015357f, -0.016262f, 0.401832f, -0.474550f, 0.265252f, -0.139009f, 0.045243f, 0.193588f, -0.320563f, 0.469797f, + 0.018485f, 0.411620f, -0.274918f, 0.116888f, 0.292559f, 0.264870f, 0.143960f, 0.125920f, -0.165879f, -0.160480f, 0.562003f, -0.092482f, -0.230844f, -0.334957f, 0.074177f, + -0.543239f, 0.130739f, 0.154372f, -0.038147f, 0.035080f, 0.100375f, 0.228511f, 0.201526f, -0.046292f, 0.160674f, -0.362982f, -0.578790f, -0.234618f, -0.078058f, -0.050249f, + -0.182307f, 0.037429f, 0.061261f, 0.093339f, 0.059335f, -0.193803f, -0.080321f, 0.090248f, -0.034781f, 0.112808f, -0.142238f, 0.569180f, -0.728376f, 0.006001f, 0.092312f, + -0.580333f, 0.267716f, 0.100290f, 0.247248f, 0.169273f, -0.103110f, -0.306500f, 0.185496f, 0.038247f, 0.039038f, 0.108890f, 0.290420f, 0.500892f, 0.013977f, -0.049396f, + -0.065514f, 0.046068f, -0.237602f, -0.273503f, 0.133385f, 0.314017f, 0.457390f, -0.016266f, -0.086721f, -0.150066f, -0.424647f, 0.446826f, 0.227552f, -0.208976f, -0.176039f, + -0.478224f, -0.674547f, -0.269482f, -0.137992f, 0.016470f, 0.044476f, -0.031077f, -0.179975f, -0.121603f, -0.122852f, 0.236972f, -0.009416f, -0.014771f, -0.118357f, 0.297773f, + -0.077792f, 0.418931f, -0.084287f, -0.022155f, -0.151479f, 0.022706f, 0.094876f, -0.494710f, 0.113785f, 0.131465f, -0.127655f, 0.012390f, 0.078456f, 0.074088f, 0.689439f, + -0.082841f, 0.013846f, 0.493010f, 0.317749f, -0.257594f, -0.112637f, 0.188073f, -0.375933f, -0.292828f, -0.462353f, 0.024861f, 0.031511f, -0.010596f, -0.276552f, -0.124346f, + -0.025136f, -0.058113f, 0.137926f, 0.044374f, -0.239076f, 0.007627f, 0.343252f, 0.516920f, 0.447960f, -0.427809f, 0.100915f, 0.071696f, 0.016780f, 0.162128f, 0.327376f, + -0.016076f, -0.042889f, -0.441975f, 0.409942f, -0.243623f, -0.482644f, 0.460423f, 0.052715f, -0.067754f, 0.305681f, 0.058106f, -0.008628f, 0.098064f, -0.032513f, -0.123637f, +}; + +const float means_speech[N_SMC_MIXTURES*N_PCA_COEF] = +{ + 4.144528f, -0.445994f, -0.070302f, 0.359876f, -0.040196f, -0.118265f, 0.644765f, -0.174143f, -0.114585f, 0.658716f, 0.278107f, -0.260928f, + -0.030065f, -1.206812f, 0.639289f, -0.610196f, -0.053418f, 0.478088f, -0.616374f, -0.216908f, 0.606710f, 0.113900f, -0.003494f, 0.216351f, + -1.910358f, -1.553362f, 0.643357f, 0.417784f, 0.274502f, 0.145654f, 0.013066f, -0.241637f, 0.220763f, 0.108261f, -0.062127f, 0.030421f, + 1.887472f, -0.864524f, -0.953246f, -0.252614f, 0.064793f, -0.105010f, -0.229351f, 0.277444f, 0.033348f, -0.089741f, -0.033241f, 0.019242f, + -0.413334f, -1.784803f, -0.187205f, -0.391714f, -0.243155f, -0.223117f, -0.018042f, 0.129642f, 0.137285f, -0.049526f, 0.029685f, -0.024247f, + -0.694581f, -1.756488f, 0.597206f, 1.030080f, 0.297682f, 0.383268f, 0.135800f, -0.177134f, 0.096645f, -0.268388f, -0.151836f, -0.101950f, +}; + +const float log_det_chol_speech[N_SMC_MIXTURES] = +{ + 6.500575f, 5.852711f, 5.579274f, 6.652653f, 4.752021f, 5.338445f, +}; + +const float prec_chol_speech[N_SMC_MIXTURES*(N_PCA_COEF*N_PCA_COEF + N_PCA_COEF) / 2] = +{ + 0.865878f, -0.223069f, 1.134475f, -0.467260f, 0.369334f, 1.214700f, -0.211695f, 0.172669f, 0.139801f, 1.227951f, 0.116632f, -0.073137f, 0.119470f, 0.215339f, 1.501916f, 0.013243f, 0.241111f, -0.233638f, 0.209664f, -0.018477f, 1.781218f, -0.379717f, -0.055418f, 0.148630f, -0.151909f, -0.176478f, 0.700080f, 1.271311f, 0.079390f, -0.578062f, 0.405159f, -0.535997f, -0.075627f, -0.020922f, 0.275374f, 2.125945f, 0.814927f, -0.606386f, -0.240098f, -0.027454f, -0.137439f, -0.139499f, -0.299115f, 0.030554f, 2.224794f, -0.568133f, -0.955587f, -0.171094f, -0.289375f, -0.522709f, -0.635692f, -0.351548f, 0.418509f, 0.752386f, 2.817156f, -0.775162f, 0.841142f, 0.217873f, 0.245892f, -0.180432f, 0.026225f, -0.382074f, 0.147919f, -1.265659f, -0.335493f, 2.967484f, 0.754874f, 0.141008f, 0.037836f, 0.308811f, 0.275340f, -0.452874f, -0.553189f, -0.418168f, 0.103281f, 0.201651f, 0.314494f, 3.377585f, + 0.779866f, 0.119905f, 1.141061f, -0.433102f, -0.137556f, 0.835925f, -0.090233f, 0.132780f, 0.173085f, 1.162743f, -0.145567f, -0.028395f, 0.225752f, 0.256599f, 0.910930f, -0.217284f, -0.136945f, 0.088241f, 0.645317f, 0.087336f, 1.763780f, -0.058051f, -0.130243f, 0.140597f, 0.115878f, -0.276806f, 0.046556f, 1.584224f, 0.124624f, 0.035427f, -0.450071f, 0.235519f, 0.026577f, 0.378839f, 0.229695f, 2.869275f, -0.064182f, -1.030753f, 0.478893f, -0.037797f, -0.056435f, 0.399677f, -0.031347f, -1.444284f, 2.420667f, 0.188893f, -0.274488f, -0.214157f, 0.033407f, -0.011455f, 0.074756f, 0.504102f, 1.017356f, -0.133849f, 3.051604f, -0.073218f, -0.087385f, 0.077721f, 0.043399f, -0.015758f, 0.444000f, 0.562457f, -0.191897f, -0.302418f, 1.360105f, 2.524057f, -0.004116f, 0.250276f, -0.555062f, -0.066119f, -0.117207f, 0.137765f, -0.906956f, -0.113493f, 0.148421f, -0.263721f, -0.027223f, 2.956242f, + 0.733245f, -0.119951f, 0.865278f, -0.284074f, 0.078205f, 0.774011f, 0.074174f, 0.050798f, 0.120807f, 1.043815f, -0.093873f, -0.004341f, 0.160160f, -0.049218f, 0.884860f, -0.233987f, -0.371980f, 0.176357f, 0.862305f, -0.213931f, 1.822231f, 0.073135f, 0.011031f, -0.032639f, 0.353599f, -0.046119f, 0.299068f, 1.350803f, 0.531362f, 0.119452f, -1.304316f, 0.474532f, 0.177936f, 0.231008f, -0.132024f, 4.311452f, -1.292563f, -1.363504f, 2.222133f, 0.634631f, 0.206881f, 1.656581f, 0.313303f, -3.861843f, 4.023381f, 0.551323f, -0.021584f, -0.028669f, 0.207615f, 0.060790f, 0.510691f, 0.402249f, 0.641479f, -0.595568f, 2.659337f, 0.391733f, -0.194752f, -0.176729f, 0.099828f, 0.043602f, 0.576035f, 0.237896f, 0.662829f, -0.011826f, 1.098881f, 2.184154f, -0.206869f, 0.373664f, -0.688495f, -0.451344f, -0.083556f, -0.698290f, -0.246953f, 1.487042f, -0.541136f, -1.623548f, -0.847720f, 2.354680f, + 0.877970f, -0.031860f, 0.897153f, -0.139154f, -0.036593f, 1.259062f, -0.180257f, -0.027482f, 0.133144f, 1.316491f, 0.081446f, -0.121134f, 0.106265f, 0.117032f, 1.545899f, -0.077895f, 0.200631f, -0.067932f, 0.170562f, -0.237579f, 1.822282f, -0.134144f, -0.050759f, 0.041119f, -0.232042f, 0.084914f, 0.153996f, 1.891612f, 0.136661f, -0.437424f, 0.084375f, -0.242023f, -0.080411f, -0.220920f, 0.230393f, 2.053484f, 0.105555f, -0.361013f, -0.040929f, -0.011767f, -0.004277f, -0.004061f, -0.080962f, -0.367068f, 2.043357f, -0.046665f, -0.463621f, -0.148325f, 0.104752f, -0.308704f, -0.181149f, 0.155644f, 0.056089f, 0.427374f, 2.803357f, -0.269472f, 0.516361f, 0.001706f, 0.217995f, -0.127911f, 0.029542f, 0.254344f, 0.267460f, -0.813244f, 0.111844f, 2.549009f, 0.109195f, 0.092682f, -0.018745f, -0.013426f, -0.401214f, 0.127705f, -0.601705f, -0.111657f, 0.169593f, -0.107168f, 0.262454f, 3.714371f, + 0.674920f, -0.038705f, 1.051066f, -0.068032f, -0.035061f, 0.725132f, -0.129053f, 0.054747f, 0.122093f, 0.993569f, -0.045902f, -0.029557f, 0.159814f, 0.066913f, 1.215179f, -0.227482f, 0.010274f, -0.035148f, 0.424745f, -0.168736f, 1.576698f, 0.167059f, 0.026802f, -0.077380f, 0.064844f, -0.047268f, 0.101866f, 1.483204f, -0.078188f, 0.028231f, -0.136149f, 0.119205f, 0.005789f, 0.045958f, 0.087542f, 1.955771f, 0.142281f, -0.822192f, -0.014402f, -0.193328f, -0.030001f, 0.017168f, 0.009956f, 0.394809f, 2.300930f, 0.517255f, -0.517422f, -0.062056f, 0.053836f, -0.049730f, 0.156868f, 0.336429f, 0.171164f, 0.338078f, 2.660829f, -0.135033f, 0.812377f, 0.224385f, 0.495786f, 0.135518f, 0.547065f, 0.080456f, -0.299118f, -0.904148f, -0.094750f, 2.689407f, -0.273906f, 0.047255f, -0.099798f, -0.175864f, -0.111706f, -0.187478f, 0.017459f, 0.179466f, 0.303312f, -0.914377f, -0.454025f, 2.476254f, + 0.621627f, 0.011114f, 0.981192f, -0.253924f, -0.028998f, 0.716900f, -0.000541f, -0.058620f, -0.133470f, 1.285166f, 0.023501f, -0.107565f, 0.003875f, 0.521398f, 0.938485f, -0.274409f, -0.864538f, 0.475578f, 1.350173f, 0.704398f, 1.977759f, -0.009563f, -0.180193f, -0.152311f, 0.308965f, 0.476963f, 0.235046f, 1.431437f, 0.203638f, -1.193943f, -0.776895f, 2.853604f, 1.384001f, 2.607643f, 0.210453f, 4.753994f, -0.318441f, -0.641232f, 0.681624f, 0.064183f, 0.062136f, 0.491965f, 0.078715f, -1.190437f, 2.299521f, 0.279093f, -0.531432f, 0.056751f, 0.908371f, 0.596757f, 1.108720f, 0.554711f, 1.171101f, -0.006235f, 2.159307f, 0.175362f, -0.505673f, 0.166484f, 0.362916f, 0.227361f, 0.587717f, 0.301477f, 0.363320f, 0.233596f, 0.708472f, 2.246567f, -0.273318f, 0.112575f, -0.014105f, -0.074279f, -0.077574f, -0.191145f, -0.280995f, 0.338633f, 0.068418f, -1.464972f, -0.873218f, 2.629376f, +}; + +const float weights_speech[N_SMC_MIXTURES] = +{ + 0.110243f, 0.158178f, 0.164349f, 0.167653f, 0.235143f, 0.164434f, +}; + +const float means_music[N_SMC_MIXTURES*N_PCA_COEF] = +{ + 0.656611f, 1.525081f, 0.094663f, 0.532436f, 0.093851f, 0.302220f, -0.010327f, -0.389405f, -0.291664f, -0.049673f, 0.073362f, 0.080331f, + -0.430694f, -0.007781f, 0.065952f, -1.004505f, -0.195157f, -0.457738f, 0.402081f, 0.277964f, -0.025551f, 0.144147f, 0.103940f, -0.083957f, + -0.360195f, 1.474304f, -0.268462f, -0.060606f, -0.008471f, -0.155261f, -0.242842f, 0.119412f, -0.196130f, -0.300577f, -0.029504f, 0.060241f, + -2.474926f, 1.226681f, -0.002546f, 0.253692f, -0.118133f, 0.066950f, 0.167503f, 0.047745f, -0.302155f, 0.018914f, 0.034468f, 0.011810f, + -0.944544f, 1.303678f, 0.326616f, 0.443005f, 0.339787f, 0.353776f, 0.811425f, -0.201050f, 0.056356f, 0.825931f, 0.425448f, -0.400853f, + 2.416758f, 0.991434f, -0.249973f, -0.264729f, -0.003941f, -0.242565f, -0.114334f, 0.179267f, 0.085679f, -0.001649f, -0.267403f, 0.028878f, +}; + +const float log_det_chol_music[N_SMC_MIXTURES] = +{ + 3.236255f, 3.517110f, 5.675361f, 2.875446f, -2.234983f, 7.961542f, +}; + +const float prec_chol_music[N_SMC_MIXTURES*(N_PCA_COEF*N_PCA_COEF + N_PCA_COEF) / 2] = +{ + 0.865468f, 0.096250f, 0.875676f, -0.081846f, -0.330935f, 1.076934f, 0.141790f, 0.047793f, 0.095596f, 0.805507f, 0.014703f, 0.133837f, -0.185849f, 0.065923f, 0.878885f, -0.023521f, -0.109075f, 0.293645f, -0.004503f, 0.103060f, 1.017106f, -0.140600f, -0.264764f, 0.386274f, -0.037347f, -0.140433f, -0.230523f, 1.476784f, -0.097932f, 0.056998f, -0.001711f, -0.088553f, 0.012943f, -0.094897f, 0.176247f, 1.239658f, 0.145315f, 0.034242f, -0.028931f, -0.132416f, 0.080181f, 0.025223f, -0.464244f, 0.005253f, 1.895192f, -0.096706f, -0.029121f, 0.072887f, 0.005231f, -0.191996f, -0.169344f, 0.616334f, -0.105826f, -0.302582f, 2.184961f, -0.173989f, -0.194028f, 0.036340f, -0.116044f, -0.145628f, -0.150018f, 0.249165f, 0.112598f, 0.374794f, 0.091387f, 2.450082f, 0.253605f, 0.179610f, -0.178889f, 0.182902f, -0.015903f, 0.219889f, -0.718143f, -0.189849f, -0.115940f, -0.439124f, -0.679777f, 2.330453f, + 0.538970f, -0.035968f, 0.813335f, 0.022517f, -0.181125f, 0.948319f, -0.159673f, -0.049540f, 0.123396f, 1.071468f, -0.045159f, -0.114757f, 0.123202f, 0.060699f, 1.446151f, -0.071575f, 0.090669f, 0.052802f, -0.124821f, -0.326671f, 1.345917f, 0.129963f, 0.194230f, -0.182184f, -0.063497f, 0.009279f, 0.273701f, 1.322214f, 0.151468f, 0.144482f, 0.090362f, -0.417473f, -0.022089f, -0.353023f, -0.136793f, 1.200676f, -0.210558f, -0.243242f, 0.041053f, -0.058388f, 0.047228f, -0.190541f, -0.223507f, 0.254937f, 1.699705f, 0.164428f, 0.014902f, -0.289802f, 0.230417f, -0.013618f, -0.154441f, 0.264950f, -0.320963f, -0.258504f, 2.316852f, 0.000212f, 0.187401f, -0.011045f, 0.382538f, -0.052954f, -0.256577f, 0.155038f, -0.129821f, -0.074534f, 0.208774f, 2.065668f, -0.134512f, -0.076705f, -0.095956f, -0.239026f, 0.198459f, 0.130585f, -0.290055f, -0.028346f, 0.367803f, 0.031032f, 0.304326f, 3.008867f, + 0.768930f, 0.108937f, 0.919200f, -0.112951f, -0.528392f, 1.553020f, -0.115801f, 0.007334f, -0.029592f, 1.098616f, 0.003621f, 0.099218f, -0.247408f, -0.078849f, 1.367811f, 0.042889f, -0.077877f, 0.209637f, -0.165400f, -0.017952f, 1.342725f, -0.184761f, 0.050278f, 0.029655f, 0.175364f, -0.016161f, -0.161006f, 1.722900f, 0.051465f, 0.010021f, 0.385607f, -0.264551f, -0.281174f, -0.362257f, -0.036395f, 1.382524f, -0.066193f, -0.084715f, -0.123814f, -0.032121f, 0.092897f, 0.068140f, -0.260849f, 0.010565f, 1.773789f, 0.236448f, 0.096324f, -0.080643f, 0.122260f, 0.129134f, 0.109539f, 0.427091f, -0.456268f, -0.254883f, 3.037065f, 0.130895f, -0.132792f, -0.126857f, 0.006429f, 0.009618f, -0.233609f, 0.804552f, -0.307940f, -0.127871f, 1.666924f, 2.807298f, -0.369826f, -0.012257f, 0.017262f, -0.057686f, -0.135910f, 0.150073f, -1.517210f, 0.219460f, 0.501691f, -2.240129f, -1.288359f, 3.654831f, + 0.768658f, 0.003820f, 0.830374f, -0.217304f, -0.148821f, 0.978966f, -0.069324f, 0.005255f, -0.006609f, 0.791961f, 0.067522f, 0.106222f, -0.221519f, 0.017580f, 0.917797f, -0.000305f, -0.087966f, 0.058007f, -0.062253f, 0.174119f, 1.000509f, 0.111418f, 0.138297f, 0.085620f, 0.205840f, 0.010353f, -0.212830f, 1.272419f, 0.019098f, 0.078237f, -0.022486f, -0.089409f, -0.174376f, -0.190770f, -0.036704f, 1.255936f, -0.031611f, -0.422268f, -0.059954f, -0.227044f, 0.032839f, -0.039616f, -0.299988f, 0.188407f, 1.783848f, 0.555498f, 0.100881f, 0.083480f, -0.091083f, 0.227518f, 0.151158f, 0.519622f, -0.289353f, -0.348091f, 2.626882f, 0.069054f, 0.080511f, -0.097590f, -0.066670f, 0.182192f, 0.038856f, 0.195598f, -0.205755f, -0.129408f, 0.675275f, 2.359014f, -0.290034f, -0.005755f, -0.061652f, -0.041416f, 0.115984f, 0.037760f, -0.462742f, 0.100872f, 0.299008f, -1.288345f, -0.758290f, 2.209114f, + 0.370886f, 0.068065f, 0.614958f, -0.068457f, -0.114038f, 0.796522f, -0.079392f, -0.027007f, 0.057585f, 0.635611f, -0.018133f, -0.062099f, -0.185303f, 0.084657f, 0.533251f, -0.148971f, -0.038737f, 0.268261f, 0.165710f, 0.022648f, 0.747975f, -0.004069f, 0.059367f, 0.050886f, 0.069492f, -0.103153f, -0.088546f, 0.703324f, 0.045359f, -0.122298f, -0.227646f, 0.062645f, 0.011837f, 0.069355f, -0.019762f, 1.067046f, 0.105756f, -0.440658f, 0.192851f, -0.058815f, 0.028047f, 0.138805f, -0.125973f, -0.667383f, 1.143016f, -0.065451f, 0.083705f, -0.153760f, -0.060730f, -0.000403f, -0.090839f, 0.063298f, -0.037514f, 0.351583f, 1.182379f, -0.106357f, -0.016221f, -0.010726f, 0.100052f, 0.057551f, 0.105911f, -0.001332f, -0.078458f, -0.268890f, -0.242942f, 1.545230f, 0.023359f, -0.080829f, 0.231242f, -0.036875f, 0.079070f, 0.062469f, 0.004314f, 0.075508f, 0.036818f, 0.069211f, -0.363344f, 1.482260f, + 1.209142f, 0.088647f, 1.211345f, -0.361558f, -0.636888f, 1.613629f, -0.073522f, 0.094440f, 0.348373f, 1.388855f, 0.080521f, -0.037507f, 0.070824f, 0.052632f, 1.876701f, -0.032255f, 0.124895f, -0.048464f, -0.228421f, -0.227230f, 1.726811f, -0.291388f, -0.077976f, 0.299319f, -0.171845f, 0.012052f, 0.228501f, 2.014814f, -0.039524f, -0.252147f, 0.412488f, -0.546076f, -0.276125f, -0.498767f, 0.283854f, 1.733851f, 0.044785f, -0.173411f, 0.095814f, -0.035061f, 0.007025f, 0.236956f, -0.269935f, -0.192304f, 1.968567f, -0.667309f, -0.209738f, -0.260295f, 0.087080f, -0.241920f, -0.281580f, 0.361767f, -0.183381f, 0.175271f, 3.096483f, -0.472230f, -0.015951f, -0.043282f, -0.052428f, -0.352133f, -0.334534f, 0.390436f, 0.113373f, -0.300916f, 1.454841f, 2.885831f, 0.478838f, 0.050578f, -0.039767f, 0.114396f, -0.067675f, 0.013117f, -1.117973f, -0.208723f, 0.445495f, -0.031657f, 0.011242f, 4.388051f, +}; + +const float weights_music[N_SMC_MIXTURES] = +{ + 0.156143f, 0.136090f, 0.300104f, 0.193919f, 0.051812f, 0.161931f, +}; + +const float means_noise[N_SMC_MIXTURES*N_PCA_COEF] = +{ + 1.038195f, 0.637194f, -1.048590f, -0.949921f, -0.088088f, -0.620960f, -0.230118f, 0.960491f, 0.410842f, 0.323754f, -0.634407f, 0.010970f, + -1.206174f, -0.844701f, -0.731341f, -1.143035f, -0.316326f, -0.425896f, 0.447156f, 1.554899f, -0.100991f, 0.950109f, -0.229985f, -0.201161f, + 1.333451f, 0.554427f, -1.252278f, -0.248920f, 0.051240f, -0.444626f, -0.158659f, 1.095395f, 0.246439f, 0.057993f, -0.786062f, 0.175020f, + 1.232670f, 0.329225f, -0.881330f, -0.052693f, 0.156031f, -0.303587f, -0.111282f, 0.790189f, 0.130987f, 0.064452f, -0.478277f, 0.103193f, + -1.990813f, -0.723883f, -1.196019f, -1.768941f, -0.344735f, -0.677093f, -0.256214f, 1.351858f, -0.353724f, 0.768104f, -0.384513f, -0.371595f, + -2.101499f, -1.294068f, -0.188406f, -1.843713f, -0.786294f, -0.539876f, 0.241184f, 1.600162f, -0.300266f, 1.225627f, 0.080940f, -0.231195f, +}; + +const float log_det_chol_noise[N_SMC_MIXTURES] = +{ + 11.878154f, 13.025598f, 12.831137f, 7.099546f, 13.242941f, 11.898383f, +}; + +const float prec_chol_noise[N_SMC_MIXTURES*(N_PCA_COEF*N_PCA_COEF + N_PCA_COEF) / 2] = +{ + 1.632699f, -0.379077f, 1.966804f, -0.344223f, -0.149261f, 2.120968f, -0.643124f, 0.344982f, 0.335749f, 1.870530f, -0.261820f, 0.059065f, 0.158862f, -0.280203f, 2.457868f, 0.081479f, 0.745744f, -0.249165f, -0.769764f, -1.012361f, 2.160652f, -0.156229f, 0.672157f, -0.261424f, 0.116279f, -0.228307f, -0.056947f, 3.407241f, 0.356097f, -0.736238f, 0.705233f, -1.408321f, -0.717390f, -1.037433f, 0.333510f, 2.484870f, 0.323039f, -1.483297f, -0.500337f, -0.090107f, -0.439007f, -0.290405f, 0.327256f, -0.243020f, 2.511947f, 0.442037f, 0.525936f, -1.436016f, 0.336699f, 0.176533f, -0.643667f, 0.793828f, -0.342947f, 0.672485f, 4.147797f, 0.332162f, 0.594025f, -1.072022f, 0.522281f, 0.199482f, 0.046997f, 0.786233f, -0.726740f, -1.173474f, 0.744190f, 3.950012f, -0.607163f, -0.630364f, 1.025563f, -0.779746f, -0.553567f, 0.336951f, -1.148469f, 0.489795f, 0.770505f, -1.178058f, -0.433118f, 6.111872f, + 2.143755f, -0.413062f, 2.014192f, -0.075622f, -0.450719f, 2.205736f, 0.280257f, 0.584592f, 0.270209f, 2.063094f, -1.015927f, -0.580325f, 0.143926f, -0.584358f, 2.804261f, -0.678043f, 0.350781f, -0.335668f, -1.550830f, -0.871893f, 2.572887f, 0.675586f, 0.480079f, -0.359260f, 0.282963f, 0.038297f, -0.806271f, 3.881284f, -0.007880f, -0.600785f, 0.418550f, -1.442369f, 0.052922f, -0.189472f, -0.679946f, 2.474994f, -0.050026f, -1.336880f, -0.230418f, -0.014308f, -0.572717f, -1.251292f, 0.476137f, 0.270476f, 2.682144f, -0.043322f, -0.275643f, -1.378692f, -0.310016f, -0.355372f, -0.291887f, -0.105540f, -0.006300f, 0.295662f, 4.390412f, -0.318893f, 0.350906f, -0.770328f, 0.501645f, -0.080125f, -0.331810f, 0.474472f, -0.445056f, -1.149920f, 1.144612f, 4.264102f, 0.070893f, -0.033470f, -0.263519f, -0.577897f, 0.826515f, 0.188348f, 0.256791f, -0.351058f, 0.993722f, 0.972258f, 1.109502f, 6.637324f, + 1.568506f, -0.221341f, 1.966173f, -0.367708f, -0.350875f, 2.751533f, -0.123500f, 0.287689f, -0.365051f, 2.117681f, 0.163212f, 0.082424f, -0.165235f, -0.143181f, 2.593907f, 0.033464f, 0.285970f, 0.290856f, -0.552542f, -0.344460f, 2.494827f, 0.116380f, 0.004019f, -0.298612f, 0.063575f, 0.159355f, -0.363974f, 3.116427f, 0.379961f, -0.086746f, -0.164435f, -0.242829f, -0.121803f, -0.644812f, 0.433181f, 2.516195f, 0.092920f, -1.078008f, -0.106551f, -0.224285f, -0.252404f, -0.173980f, 0.329091f, -0.646624f, 2.951021f, 0.051908f, -0.385181f, -0.300332f, 0.016299f, 0.082525f, 0.077887f, 0.789534f, -0.866108f, 1.039234f, 4.648430f, -0.262984f, 0.276620f, -0.203404f, 0.098407f, -0.039619f, 0.124315f, 1.110207f, -0.567436f, -0.910194f, 2.916694f, 4.692430f, 0.077585f, 0.031716f, 0.378054f, -0.133353f, -0.557203f, -0.075146f, -1.984817f, 0.529554f, 0.608864f, -2.224605f, -1.402217f, 6.366141f, + 0.779595f, -0.089397f, 1.234740f, 0.024544f, -0.218958f, 1.424978f, -0.070141f, 0.146756f, -0.121060f, 1.420921f, 0.081782f, -0.063427f, -0.064760f, 0.108557f, 1.528785f, -0.082491f, 0.002662f, 0.169068f, 0.112307f, -0.279665f, 1.745017f, 0.025568f, -0.009241f, -0.013853f, -0.070061f, 0.170304f, -0.047415f, 1.938777f, 0.196318f, 0.002824f, -0.012629f, -0.213627f, -0.071292f, -0.352020f, 0.181309f, 2.060772f, 0.057579f, -0.207220f, 0.138657f, -0.078942f, 0.052427f, 0.140410f, -0.305897f, -0.468443f, 2.109666f, 0.091878f, -0.295279f, -0.302448f, 0.067905f, -0.086834f, -0.131233f, 0.170017f, -0.373685f, 0.413721f, 2.785042f, -0.144180f, -0.183951f, -0.006815f, -0.092817f, -0.164308f, 0.014492f, 0.354251f, 0.016589f, -0.393079f, 0.228511f, 2.902565f, 0.052404f, 0.092540f, 0.171645f, 0.052254f, -0.274919f, -0.103905f, -0.641625f, 0.082116f, 0.031077f, -0.507968f, -0.058403f, 3.419316f, + 1.206695f, -0.682889f, 2.049445f, -0.507047f, -0.343185f, 1.895558f, -0.136277f, 0.093440f, 0.696606f, 2.282985f, 0.012380f, -0.155599f, 0.040493f, -0.121679f, 3.355282f, -0.492283f, 0.647906f, -1.064008f, -0.988783f, -0.065537f, 2.779347f, 0.650801f, 0.326591f, -0.046862f, 0.187397f, -0.194321f, -0.032757f, 4.176259f, 0.551237f, -0.536042f, 0.150845f, -1.240364f, -0.370417f, -0.855459f, 0.336866f, 2.809574f, 0.340270f, -1.176219f, 0.013030f, 0.354705f, -0.488960f, -0.466479f, 0.783022f, -0.149058f, 2.884207f, 1.206646f, 0.307873f, -1.411090f, 0.070099f, 0.209224f, 0.291007f, -0.377239f, -0.640368f, 0.406003f, 5.155920f, 0.809698f, 0.669060f, -0.941776f, 1.072041f, -0.116894f, -0.149209f, 0.452617f, -0.740148f, -1.188619f, 2.296872f, 4.692944f, -0.040471f, -0.131586f, 0.797791f, -2.162108f, 1.341433f, 1.097095f, -1.576712f, 0.454951f, 0.343379f, -0.053275f, 0.073795f, 6.902156f, + 1.388928f, -0.529069f, 1.914570f, -0.246147f, -0.376892f, 1.708861f, -0.205445f, 0.314175f, 0.650069f, 1.841539f, -0.085711f, -0.013295f, -0.070955f, -0.466548f, 3.166998f, -0.260572f, 0.720834f, -0.792817f, -1.467658f, -0.372909f, 2.710914f, 0.606852f, 0.637359f, -0.541404f, -0.330263f, 0.170983f, 0.064970f, 2.980650f, 0.184834f, -0.340049f, 0.288191f, -1.044021f, -0.466651f, -0.374637f, -0.231777f, 2.131845f, 0.132432f, -0.963210f, -0.294608f, 0.042302f, -0.114246f, -0.932316f, -0.166230f, 0.203508f, 2.563777f, 0.548839f, -0.440379f, -0.934541f, -0.344106f, 0.030490f, -0.377361f, -0.085154f, -0.262774f, 0.477136f, 4.772394f, 0.084517f, 0.357867f, -0.429870f, 0.688023f, 0.353825f, -0.439173f, 0.076948f, -0.769601f, -1.177351f, 1.958859f, 4.300092f, -0.207814f, 0.243404f, -0.706169f, -0.588024f, 0.962382f, 0.338356f, -0.298229f, -0.351656f, 0.768647f, 0.689511f, 0.692148f, 6.121235f, +}; + +const float weights_noise[N_SMC_MIXTURES] = +{ + 0.186702f, 0.110792f, 0.358051f, 0.085247f, 0.132809f, 0.126399f, +}; + +const float m_speech[N_MIXTURES*N_FEATURES] = +{ + 0.287950f, 0.915145f, 0.146341f, 0.215938f, 0.337233f, 0.416424f, 0.464061f, 0.463680f, 0.059083f, 0.853025f, 0.768184f, 0.314352f, + 0.306930f, 0.936427f, 0.255783f, 0.304095f, 0.328435f, 0.264893f, 0.353664f, 0.481807f, 0.050087f, 0.816373f, 0.828952f, 0.335445f, + 0.241923f, 0.953049f, 0.219456f, 0.259538f, 0.436515f, 0.498549f, 0.456902f, 0.490619f, 0.062629f, 0.832243f, 0.845146f, 0.331393f, + 0.424629f, 0.528660f, 0.325986f, 0.502250f, 0.543419f, 0.561620f, 0.591057f, 0.386511f, 0.067280f, 0.903251f, 0.891515f, 0.344377f, + 0.380487f, 0.727792f, 0.209973f, 0.314364f, 0.421881f, 0.398734f, 0.446999f, 0.402498f, 0.105313f, 0.867979f, 0.877883f, 0.317694f, + 0.344962f, 0.658148f, 0.240913f, 0.348251f, 0.433178f, 0.480324f, 0.498983f, 0.419444f, 0.187060f, 0.868077f, 0.855516f, 0.347290f +}; + +const float invV_speech[N_MIXTURES*N_FEATURES*N_FEATURES] = +{ + -39.495125f, -14.409725f, -38.632778f, -17.688078f, 8.772461f, -11.402443f, 0.439471f, -10.340120f, -48.738274f, 0.349716f, 16.818443f, 32.142887f, + -14.409725f, -195.908417f, -27.029999f, -27.433266f, -16.451397f, -6.243556f, 5.814015f, 12.751663f, -65.479347f, -46.738777f, -8.373536f, 18.300566f, + -38.632782f, -27.029999f, -753.940247f, 115.388985f, -47.167007f, 27.107189f, -36.896187f, 72.593445f, -298.310120f, -22.776127f, 177.255432f, 89.802238f, + -17.688076f, -27.433270f, 115.388954f, -222.724594f, 40.140877f, -45.163593f, 21.461746f, 7.970023f, -27.137230f, 76.520920f, 25.476706f, 38.804222f, + 8.772461f, -16.451405f, -47.167007f, 40.140877f, -94.404678f, 40.199402f, -17.781452f, 3.901072f, -14.428046f, 23.148809f, 13.478944f, 17.505091f, + -11.402439f, -6.243560f, 27.107193f, -45.163593f, 40.199394f, -93.411865f, 57.189003f, 3.581622f, 0.100851f, 5.812640f, 9.256781f, 10.823537f, + 0.439471f, 5.814015f, -36.896187f, 21.461748f, -17.781452f, 57.189003f, -89.808571f, -5.465971f, -46.055283f, -15.567553f, 14.521687f, 10.769546f, + -10.340121f, 12.751663f, 72.593445f, 7.970019f, 3.901072f, 3.581622f, -5.465971f, -100.358055f, 24.768887f, -20.986031f, -47.276218f, 13.192144f, + -48.738274f, -65.479347f, -298.310120f, -27.137238f, -14.428048f, 0.100851f, -46.055275f, 24.768887f, -1377.781250f, -56.637291f, 233.195129f, -114.883377f, + 0.349715f, -46.738777f, -22.776127f, 76.520912f, 23.148806f, 5.812638f, -15.567553f, -20.986031f, -56.637291f, -216.730820f, -0.914011f, 39.627998f, + 16.818443f, -8.373537f, 177.255432f, 25.476713f, 13.478942f, 9.256781f, 14.521687f, -47.276218f, 233.195129f, -0.914013f, -153.435181f, -48.048389f, + 32.142887f, 18.300564f, 89.802223f, 38.804218f, 17.505091f, 10.823533f, 10.769546f, 13.192144f, -114.883377f, 39.628006f, -48.048389f, -313.631622f, + -53.471222f, -47.464245f, -0.896915f, -25.132132f, 30.892912f, -27.316641f, 22.758862f, -18.016706f, -66.564011f, -3.584184f, -7.795120f, 35.122147f, + -47.464249f, -438.709412f, -11.227010f, -14.463504f, 12.490106f, -11.184597f, 2.622577f, -3.664124f, -84.887161f, -29.377838f, -53.413090f, 17.047739f, + -0.896916f, -11.227015f, -251.993881f, 153.947250f, 4.508913f, 26.900564f, -22.145449f, 7.110321f, -215.903503f, -47.320839f, 78.247871f, 16.021702f, + -25.132132f, -14.463490f, 153.947235f, -326.623169f, 62.711872f, 7.543400f, 23.738796f, 19.846117f, -97.089355f, 2.828130f, 75.120659f, 34.945835f, + 30.892912f, 12.490105f, 4.508915f, 62.711872f, -289.161591f, 178.348740f, -26.642651f, 11.309997f, -10.248929f, 16.504482f, 48.839104f, 20.334949f, + -27.316643f, -11.184605f, 26.900568f, 7.543384f, 178.348740f, -267.764130f, 15.141651f, 4.242836f, -7.640367f, 77.632545f, -2.166305f, 12.531335f, + 22.758862f, 2.622574f, -22.145449f, 23.738796f, -26.642651f, 15.141647f, -71.479584f, 2.006794f, -4.579958f, 30.676281f, 15.085149f, 8.568682f, + -18.016706f, -3.664128f, 7.110321f, 19.846119f, 11.309998f, 4.242836f, 2.006794f, -76.086823f, 56.165844f, -8.384334f, -103.682259f, 6.086752f, + -66.564011f, -84.887161f, -215.903488f, -97.089355f, -10.248927f, -7.640366f, -4.579959f, 56.165840f, -1920.100708f, -8.861668f, 500.888123f, -16.967447f, + -3.584186f, -29.377846f, -47.320839f, 2.828135f, 16.504475f, 77.632553f, 30.676281f, -8.384336f, -8.861669f, -181.010406f, -15.615012f, 8.247152f, + -7.795123f, -53.413109f, 78.247864f, 75.120659f, 48.839104f, -2.166309f, 15.085151f, -103.682251f, 500.888123f, -15.615015f, -433.988953f, -70.138153f, + 35.122147f, 17.047737f, 16.021706f, 34.945835f, 20.334948f, 12.531336f, 8.568681f, 6.086751f, -16.967451f, 8.247154f, -70.138176f, -217.081589f, + -94.138069f, -64.204018f, 0.309024f, -46.150829f, 42.051434f, -41.965660f, 10.197500f, -19.122877f, -42.942600f, -19.220772f, -21.222412f, 46.903416f, + -64.204025f, -818.921143f, 30.093992f, -42.236637f, 6.486305f, -4.382217f, 10.975861f, 0.330433f, -16.922922f, -58.340889f, -111.845398f, -1.666081f, + 0.309030f, 30.093992f, -342.960907f, 202.719925f, -66.503586f, 59.412266f, -81.710594f, 14.449543f, -155.271118f, 13.000940f, 119.772522f, 37.219341f, + -46.150829f, -42.236637f, 202.719910f, -315.177094f, 74.731415f, -97.374359f, 58.435394f, 19.693314f, -62.044556f, 6.968471f, 74.460442f, 22.385506f, + 42.051434f, 6.486304f, -66.503578f, 74.731415f, -93.988602f, 52.841560f, -21.181007f, 2.344793f, -35.600548f, -19.262661f, 37.872654f, 6.642675f, + -41.965660f, -4.382209f, 59.412254f, -97.374352f, 52.841560f, -278.285614f, 214.990295f, -0.626728f, -43.822613f, -21.303955f, 15.663709f, 3.870531f, + 10.197496f, 10.975868f, -81.710587f, 58.435387f, -21.181000f, 214.990295f, -234.196167f, 1.970801f, -16.810629f, -1.859668f, 16.002600f, 3.998644f, + -19.122877f, 0.330433f, 14.449545f, 19.693314f, 2.344791f, -0.626729f, 1.970801f, -57.165413f, 20.255400f, -9.028506f, -83.099960f, 8.659401f, + -42.942604f, -16.922922f, -155.271103f, -62.044556f, -35.600552f, -43.822613f, -16.810629f, 20.255400f, -986.222534f, 27.520060f, 397.979370f, -10.706357f, + -19.220772f, -58.340889f, 13.000940f, 6.968470f, -19.262661f, -21.303955f, -1.859668f, -9.028505f, 27.520063f, -181.756256f, -31.725298f, 5.532037f, + -21.222410f, -111.845398f, 119.772507f, 74.460449f, 37.872654f, 15.663704f, 16.002598f, -83.099960f, 397.979370f, -31.725298f, -499.032318f, -64.723236f, + 46.903416f, -1.666086f, 37.219345f, 22.385508f, 6.642675f, 3.870531f, 3.998645f, 8.659404f, -10.706349f, 5.532042f, -64.723228f, -245.227646f, + -20.650835f, 1.359996f, -2.309748f, 3.667799f, -4.431922f, -1.491803f, 2.244124f, -6.511281f, -7.420423f, -2.656161f, -5.103209f, 2.977657f, + 1.359996f, -45.519173f, -27.833733f, 11.524545f, -5.826983f, 8.198447f, -4.084381f, 13.450377f, 18.150373f, -9.569582f, -6.539153f, -3.438999f, + -2.309748f, -27.833733f, -75.630455f, 54.383217f, -10.366678f, 10.230091f, -6.134814f, 5.390231f, -18.911335f, 8.611535f, -4.468428f, 2.542004f, + 3.667800f, 11.524545f, 54.383224f, -148.724060f, 102.126076f, -8.536950f, 14.920280f, -2.707708f, 16.232759f, -12.092183f, -2.761442f, 5.324492f, + -4.431922f, -5.826983f, -10.366676f, 102.126083f, -239.405472f, 114.426819f, -4.901945f, 3.331610f, -2.787818f, -19.461893f, 9.501407f, 1.843912f, + -1.491803f, 8.198447f, 10.230090f, -8.536962f, 114.426842f, -252.874207f, 133.055328f, -2.890811f, -8.063058f, -19.651783f, -6.576759f, -6.167914f, + 2.244124f, -4.084381f, -6.134819f, 14.920280f, -4.901949f, 133.055328f, -188.368149f, 0.868558f, -5.905251f, -73.150818f, 15.489239f, 3.931309f, + -6.511280f, 13.450379f, 5.390231f, -2.707708f, 3.331610f, -2.890812f, 0.868557f, -291.328827f, 8.357405f, 5.690188f, -65.318748f, -3.008168f, + -7.420423f, 18.150373f, -18.911335f, 16.232759f, -2.787818f, -8.063062f, -5.905251f, 8.357409f, -817.866455f, -35.719170f, 465.940338f, -57.209427f, + -2.656161f, -9.569582f, 8.611535f, -12.092187f, -19.461897f, -19.651789f, -73.150826f, 5.690184f, -35.719170f, -273.267426f, 28.788002f, 35.708652f, + -5.103208f, -6.539154f, -4.468427f, -2.761442f, 9.501406f, -6.576763f, 15.489231f, -65.318748f, 465.940338f, 28.788004f, -993.901489f, -74.051056f, + 2.977657f, -3.439001f, 2.542004f, 5.324495f, 1.843912f, -6.167918f, 3.931307f, -3.008166f, -57.209423f, 35.708649f, -74.051048f, -188.919189f, + -29.690845f, -6.602296f, -5.942207f, -8.191399f, 12.539626f, -17.187153f, 8.095049f, -11.539900f, -3.959312f, -2.929833f, -13.009781f, 14.593680f, + -6.602297f, -27.784903f, -12.036678f, -8.735461f, 10.268900f, -8.173005f, -0.508073f, 2.189236f, -3.210277f, -19.652676f, 0.174784f, 12.064508f, + -5.942207f, -12.036678f, -176.179718f, 87.371017f, -19.441795f, 2.946336f, -40.577980f, 4.105769f, -30.427385f, -23.225182f, 84.964821f, 43.734604f, + -8.191399f, -8.735461f, 87.371017f, -143.001602f, 51.919571f, -27.973251f, 29.284573f, -2.447426f, -11.954906f, 27.745192f, 11.595254f, 0.393728f, + 12.539626f, 10.268898f, -19.441788f, 51.919567f, -178.068130f, 128.031281f, -3.544543f, 6.851246f, -10.772905f, -42.477104f, 34.736156f, 40.172005f, + -17.187153f, -8.173005f, 2.946335f, -27.973251f, 128.031281f, -165.563629f, 51.259937f, -4.838826f, 3.758103f, 40.516190f, -7.739178f, -19.154724f, + 8.095048f, -0.508073f, -40.577976f, 29.284571f, -3.544538f, 51.259933f, -108.403847f, -0.894440f, 3.337809f, 2.241667f, 3.315053f, 1.456518f, + -11.539901f, 2.189236f, 4.105764f, -2.447426f, 6.851246f, -4.838827f, -0.894440f, -214.332535f, -4.848935f, -3.779825f, -75.247871f, -1.171161f, + -3.959312f, -3.210277f, -30.427393f, -11.954905f, -10.772905f, 3.758103f, 3.337807f, -4.848933f, -266.199005f, 2.878902f, 180.030838f, -44.094963f, + -2.929832f, -19.652674f, -23.225182f, 27.745188f, -42.477104f, 40.516193f, 2.241667f, -3.779825f, 2.878902f, -156.775406f, -11.596662f, 4.385890f, + -13.009781f, 0.174784f, 84.964828f, 11.595254f, 34.736156f, -7.739182f, 3.315054f, -75.247871f, 180.030838f, -11.596662f, -489.502777f, -57.779266f, + 14.593680f, 12.064507f, 43.734604f, 0.393729f, 40.172005f, -19.154715f, 1.456519f, -1.171165f, -44.094959f, 4.385883f, -57.779274f, -250.653564f, + -23.921967f, -5.683947f, -2.099401f, 0.128250f, 5.166994f, -10.038282f, 6.450608f, -0.731379f, -2.247439f, -4.157187f, 6.583568f, 4.081524f, + -5.683947f, -30.142115f, -8.658390f, -12.576810f, -1.309613f, 1.993960f, -4.383123f, 6.826682f, -0.827366f, -21.146013f, 3.620328f, 11.092305f, + -2.099401f, -8.658390f, -121.018547f, 88.485786f, -27.739552f, 24.281445f, -27.560604f, 3.724861f, 6.288231f, -12.520897f, 2.671664f, 12.669825f, + 0.128251f, -12.576811f, 88.485771f, -144.032974f, 84.679276f, -37.420727f, 25.546324f, 1.023258f, -7.474452f, 16.698721f, 8.763003f, 1.241009f, + 5.166994f, -1.309613f, -27.739553f, 84.679291f, -144.411407f, 72.554382f, -14.219510f, 2.006990f, 17.638592f, 1.209377f, -4.082684f, 14.381269f, + -10.038282f, 1.993960f, 24.281441f, -37.420734f, 72.554382f, -164.510483f, 115.127594f, -0.853720f, -16.850563f, 0.659630f, 12.865159f, -12.793469f, + 6.450607f, -4.383123f, -27.560604f, 25.546320f, -14.219501f, 115.127594f, -144.301163f, -12.984586f, 2.706392f, -4.143620f, -4.696592f, 1.570192f, + -0.731379f, 6.826682f, 3.724859f, 1.023259f, 2.006988f, -0.853720f, -12.984586f, -75.763382f, -31.576742f, -4.753652f, 9.548754f, -6.625205f, + -2.247438f, -0.827366f, 6.288230f, -7.474454f, 17.638592f, -16.850563f, 2.706394f, -31.576742f, -68.203148f, 11.220890f, 20.883671f, -23.079214f, + -4.157187f, -21.146011f, -12.520897f, 16.698721f, 1.209376f, 0.659629f, -4.143620f, -4.753652f, 11.220889f, -148.282272f, -2.460779f, 12.595567f, + 6.583566f, 3.620328f, 2.671665f, 8.763003f, -4.082685f, 12.865157f, -4.696593f, 9.548755f, 20.883675f, -2.460779f, -59.110310f, -3.725027f, + 4.081524f, 11.092305f, 12.669825f, 1.241007f, 14.381269f, -12.793469f, 1.570194f, -6.625203f, -23.079216f, 12.595569f, -3.725027f, -62.429104f +}; + +const float lvm_speech[N_MIXTURES] = +{ + 31.996607f, 32.762783f, 32.964325f, 31.979258f, 30.885334f, 26.185850f +}; + +const float m_music[N_MIXTURES*N_FEATURES] = +{ + 0.451772f, 0.776554f, 0.271046f, 0.354725f, 0.395602f, 0.413925f, 0.451482f, 0.627645f, 0.031510f, 0.835348f, 0.725457f, 0.357440f, + 0.487510f, 0.629043f, 0.236111f, 0.388441f, 0.440188f, 0.465005f, 0.494082f, 0.465069f, 0.069486f, 0.918461f, 0.858141f, 0.351628f, + 0.538064f, 0.605061f, 0.283209f, 0.430647f, 0.474700f, 0.497116f, 0.519075f, 0.527071f, 0.034547f, 0.951717f, 0.846345f, 0.380536f, + 0.484100f, 0.744331f, 0.238170f, 0.341071f, 0.358081f, 0.365782f, 0.392370f, 0.702362f, 0.021764f, 0.879612f, 0.725783f, 0.420504f, + 0.305845f, 0.692470f, 0.378321f, 0.465361f, 0.486968f, 0.499951f, 0.520584f, 0.473288f, 0.125325f, 0.726521f, 0.692794f, 0.374433f, + 0.513981f, 0.696380f, 0.246046f, 0.343276f, 0.374858f, 0.396051f, 0.418772f, 0.646286f, 0.026468f, 0.930184f, 0.778228f, 0.369588f +}; + +const float invV_music[N_MIXTURES*N_FEATURES*N_FEATURES] = +{ + -7.693553f, -0.657163f, -1.988950f, -0.864460f, -0.230076f, -0.650926f, 0.731884f, -1.685300f, -19.945335f, -0.839110f, 2.405366f, 3.916922f, + -0.657164f, -30.621262f, -1.553432f, -2.976453f, -1.828387f, 1.246830f, -3.716787f, 8.629019f, 5.424546f, -1.983033f, -10.816823f, -7.156825f, + -1.988950f, -1.553432f, -64.019180f, 41.928944f, -11.140388f, 11.880524f, 0.733497f, 8.586295f, 23.512827f, -15.433292f, -2.485986f, -2.458197f, + -0.864460f, -2.976454f, 41.928940f, -86.408936f, 41.949852f, -12.773962f, 4.663799f, 14.073083f, 23.178215f, -5.600554f, 14.946990f, 14.853354f, + -0.230076f, -1.828387f, -11.140390f, 41.949852f, -88.611122f, 37.060493f, -1.752939f, 3.927101f, -34.439037f, 12.153290f, 13.335299f, 16.994671f, + -0.650926f, 1.246830f, 11.880524f, -12.773962f, 37.060493f, -84.266197f, 37.053310f, 3.348819f, -5.522115f, 5.531706f, 8.455176f, -0.010933f, + 0.731884f, -3.716787f, 0.733498f, 4.663802f, -1.752939f, 37.053310f, -76.037888f, -8.315558f, -72.524521f, 21.789789f, 3.751793f, 0.630349f, + -1.685300f, 8.629018f, 8.586294f, 14.073083f, 3.927101f, 3.348819f, -8.315558f, -57.921276f, -118.393280f, 1.583935f, -8.300871f, 4.850578f, + -19.945335f, 5.424546f, 23.512829f, 23.178215f, -34.439041f, -5.522115f, -72.524521f, -118.393280f, -5404.569336f, 171.743378f, 241.973938f, -289.196930f, + -0.839109f, -1.983034f, -15.433292f, -5.600554f, 12.153290f, 5.531708f, 21.789789f, 1.583935f, 171.743362f, -101.897446f, -1.140457f, 31.464947f, + 2.405366f, -10.816823f, -2.485986f, 14.946990f, 13.335299f, 8.455174f, 3.751793f, -8.300871f, 241.973923f, -1.140458f, -77.658661f, -44.502563f, + 3.916922f, -7.156825f, -2.458197f, 14.853354f, 16.994675f, -0.010933f, 0.630349f, 4.850579f, -289.196899f, 31.464947f, -44.502563f, -243.168915f, + -9.878029f, 0.598697f, -4.302856f, -0.393763f, 0.713794f, 0.876955f, 0.341871f, -1.948222f, -8.764623f, -0.165505f, -1.265450f, 1.204445f, + 0.598697f, -29.943895f, -12.133356f, -1.089194f, -1.817891f, 2.837961f, -2.426654f, 12.585359f, -8.634910f, -11.784335f, 4.719538f, 2.997951f, + -4.302856f, -12.133356f, -84.521080f, 48.461727f, -11.249048f, 15.025650f, -19.584152f, 20.383547f, -13.363368f, 27.676975f, 22.609833f, -0.788566f, + -0.393763f, -1.089193f, 48.461727f, -128.134705f, 79.103844f, 1.020304f, 3.012457f, 7.957530f, -11.608212f, -3.021832f, 42.826736f, 14.192619f, + 0.713794f, -1.817891f, -11.249048f, 79.103836f, -220.859680f, 112.957855f, 8.839993f, -6.276199f, -19.145348f, -19.927418f, 7.305478f, 5.922347f, + 0.876955f, 2.837961f, 15.025646f, 1.020303f, 112.957878f, -275.141998f, 147.030670f, -5.400043f, 0.264864f, -5.583443f, 1.633528f, 7.493776f, + 0.341871f, -2.426655f, -19.584156f, 3.012456f, 8.839993f, 147.030670f, -196.030136f, -21.359327f, -9.146851f, 10.225628f, -2.139116f, 3.010611f, + -1.948222f, 12.585359f, 20.383547f, 7.957529f, -6.276197f, -5.400044f, -21.359325f, -108.690598f, -28.919056f, -26.963711f, -53.457581f, -9.210483f, + -8.764623f, -8.634909f, -13.363366f, -11.608211f, -19.145348f, 0.264862f, -9.146851f, -28.919056f, -602.275146f, 73.117203f, 185.012711f, -77.751747f, + -0.165505f, -11.784335f, 27.676975f, -3.021834f, -19.927414f, -5.583444f, 10.225626f, -26.963711f, 73.117210f, -350.919952f, -12.616115f, 28.914690f, + -1.265450f, 4.719537f, 22.609833f, 42.826729f, 7.305476f, 1.633531f, -2.139116f, -53.457581f, 185.012711f, -12.616107f, -398.114899f, -16.563597f, + 1.204445f, 2.997951f, -0.788567f, 14.192617f, 5.922347f, 7.493775f, 3.010611f, -9.210481f, -77.751747f, 28.914690f, -16.563597f, -176.464386f, + -12.120523f, 5.409175f, -1.857854f, 0.089656f, 2.747151f, 0.330849f, -0.110976f, -1.052840f, -23.532089f, -2.869304f, -1.769891f, 0.390127f, + 5.409175f, -35.374779f, -7.060057f, -0.748528f, -2.384489f, 2.017226f, -2.828100f, 8.307317f, 16.044216f, -11.155272f, -11.784020f, -0.186719f, + -1.857854f, -7.060059f, -112.721130f, 43.297070f, 11.361997f, 13.618838f, -3.489388f, 22.195547f, -71.385941f, 116.419769f, 68.520813f, 4.576182f, + 0.089655f, -0.748527f, 43.297066f, -183.503693f, 79.711113f, 24.255428f, 12.465648f, 1.436299f, -42.306995f, -23.502007f, 43.622116f, 3.459679f, + 2.747151f, -2.384489f, 11.361995f, 79.711113f, -288.300781f, 101.748329f, 51.744507f, -3.170304f, -142.892792f, -76.845322f, 33.559555f, -2.748073f, + 0.330848f, 2.017227f, 13.618836f, 24.255434f, 101.748344f, -339.510773f, 165.319336f, -4.353420f, -124.114395f, -92.283844f, 41.981186f, 5.566007f, + -0.110976f, -2.828100f, -3.489391f, 12.465652f, 51.744499f, 165.319336f, -302.816223f, -18.169355f, -26.544678f, -18.664721f, -2.650121f, 0.010451f, + -1.052840f, 8.307317f, 22.195547f, 1.436298f, -3.170304f, -4.353420f, -18.169355f, -67.658730f, 39.626808f, -46.781792f, -132.578033f, -6.489147f, + -23.532089f, 16.044214f, -71.385941f, -42.306988f, -142.892792f, -124.114395f, -26.544678f, 39.626808f, -8048.467285f, -69.854523f, 1809.758301f, -171.409134f, + -2.869304f, -11.155272f, 116.419769f, -23.502005f, -76.845306f, -92.283836f, -18.664721f, -46.781792f, -69.854530f, -1329.704834f, -35.750607f, 26.050083f, + -1.769890f, -11.784019f, 68.520813f, 43.622116f, 33.559555f, 41.981186f, -2.650122f, -132.578033f, 1809.758423f, -35.750607f, -1306.246704f, -81.942009f, + 0.390127f, -0.186719f, 4.576182f, 3.459679f, -2.748072f, 5.566006f, 0.010449f, -6.489147f, -171.409149f, 26.050083f, -81.942001f, -218.411270f, + -8.602416f, 3.247867f, -1.244849f, -1.473311f, 1.389639f, 1.193549f, -0.749351f, -3.831526f, -63.977875f, -5.851153f, 9.731353f, 3.762766f, + 3.247867f, -31.158295f, -1.860033f, 4.017265f, -4.594161f, 1.111136f, -0.570251f, 10.457798f, 101.742371f, 5.974397f, -29.646946f, -5.117320f, + -1.244849f, -1.860033f, -180.090790f, 66.379784f, -17.006353f, 31.490606f, -6.954518f, 15.675142f, -2.924051f, -51.747025f, 22.995018f, 27.119001f, + -1.473310f, 4.017266f, 66.379791f, -156.629517f, 84.327309f, -8.737753f, 13.449555f, 8.031604f, 3.398430f, 2.564645f, 23.766497f, 1.825905f, + 1.389639f, -4.594161f, -17.006353f, 84.327293f, -194.113434f, 66.407173f, 7.188343f, 13.696414f, 10.890992f, 22.594927f, 12.302410f, 9.738532f, + 1.193549f, 1.111136f, 31.490606f, -8.737754f, 66.407173f, -162.236801f, 56.553402f, 17.216257f, 115.981384f, 38.547184f, 1.763872f, 7.097052f, + -0.749351f, -0.570251f, -6.954517f, 13.449550f, 7.188342f, 56.553402f, -120.315659f, 2.011221f, 46.796513f, 58.099625f, 10.238644f, -4.947532f, + -3.831526f, 10.457799f, 15.675138f, 8.031604f, 13.696414f, 17.216261f, 2.011219f, -88.214516f, -358.424683f, -29.549349f, -19.958910f, -2.982261f, + -63.977875f, 101.742371f, -2.924051f, 3.398430f, 10.890991f, 115.981384f, 46.796513f, -358.424683f, -16459.796875f, -177.281921f, 882.743164f, -92.799385f, + -5.851152f, 5.974398f, -51.747017f, 2.564646f, 22.594927f, 38.547184f, 58.099625f, -29.549349f, -177.281921f, -313.395386f, -11.227232f, 55.211266f, + 9.731353f, -29.646946f, 22.995022f, 23.766500f, 12.302408f, 1.763873f, 10.238644f, -19.958918f, 882.743225f, -11.227232f, -192.809204f, -15.728045f, + 3.762767f, -5.117321f, 27.118999f, 1.825905f, 9.738532f, 7.097054f, -4.947530f, -2.982259f, -92.799385f, 55.211269f, -15.728045f, -105.412018f, + -14.256830f, -2.369603f, -4.383267f, 2.198855f, 0.019220f, -0.679427f, -2.574428f, 5.400897f, 1.071412f, 0.106907f, 1.327079f, 2.677950f, + -2.369603f, -22.438606f, 1.295039f, -4.309244f, -6.401002f, 0.194309f, -2.196638f, 15.858343f, 6.752327f, -6.119870f, 1.303229f, -0.311533f, + -4.383267f, 1.295039f, -37.935478f, 39.653362f, -15.988548f, -0.134974f, 6.192506f, 2.302801f, -5.721854f, 1.463135f, -1.312438f, -3.824724f, + 2.198855f, -4.309245f, 39.653366f, -92.374901f, 67.554337f, -3.709706f, -16.418154f, -5.289310f, -10.926604f, -3.034606f, 2.011261f, -3.425366f, + 0.019220f, -6.401002f, -15.988548f, 67.554329f, -118.435379f, 53.987152f, 0.083914f, 3.628703f, 11.506127f, -9.430386f, 3.335730f, 0.535830f, + -0.679426f, 0.194309f, -0.134974f, -3.709705f, 53.987152f, -103.065208f, 60.766655f, 5.174506f, 3.534084f, 1.888132f, -2.451842f, 0.595043f, + -2.574428f, -2.196638f, 6.192506f, -16.418154f, 0.083914f, 60.766647f, -77.825020f, -7.066206f, -9.501147f, -2.838846f, 2.729818f, 0.055436f, + 5.400897f, 15.858343f, 2.302801f, -5.289312f, 3.628702f, 5.174504f, -7.066205f, -51.364357f, -39.811016f, -5.072917f, 2.924570f, 10.896112f, + 1.071412f, 6.752328f, -5.721853f, -10.926604f, 11.506124f, 3.534082f, -9.501149f, -39.811012f, -93.637161f, 18.029125f, 2.729363f, -18.075464f, + 0.106908f, -6.119870f, 1.463135f, -3.034606f, -9.430385f, 1.888131f, -2.838846f, -5.072917f, 18.029125f, -28.455194f, 2.956357f, 16.863293f, + 1.327079f, 1.303229f, -1.312438f, 2.011261f, 3.335730f, -2.451841f, 2.729818f, 2.924570f, 2.729363f, 2.956357f, -10.622586f, -6.668186f, + 2.677950f, -0.311532f, -3.824724f, -3.425365f, 0.535831f, 0.595042f, 0.055436f, 10.896112f, -18.075462f, 16.863293f, -6.668186f, -47.191391f, + -9.240052f, 2.899430f, -1.061725f, -1.878852f, 1.384787f, -0.341924f, 0.387138f, -3.050452f, -34.497913f, 0.665648f, 3.172123f, 5.710633f, + 2.899430f, -28.464540f, -2.599636f, 2.343385f, -2.987666f, 2.706673f, 0.826991f, 8.178236f, 58.632381f, -6.619084f, -22.678297f, -7.513733f, + -1.061725f, -2.599636f, -168.556702f, 81.834229f, 2.535699f, 32.237877f, 3.761089f, 12.106804f, 80.076279f, -79.117699f, 15.459833f, 34.635460f, + -1.878852f, 2.343384f, 81.834229f, -199.355972f, 64.456390f, 2.859692f, 17.605833f, 14.360981f, 8.356211f, 15.654006f, 43.245403f, 35.328991f, + 1.384787f, -2.987666f, 2.535698f, 64.456375f, -197.841049f, 46.107910f, 19.035957f, 10.296391f, -4.554988f, 45.390419f, 10.640046f, 17.738880f, + -0.341924f, 2.706673f, 32.237885f, 2.859688f, 46.107910f, -193.370590f, 74.545746f, 13.889868f, 120.411064f, 69.282364f, 1.826012f, 8.071488f, + 0.387138f, 0.826990f, 3.761087f, 17.605829f, 19.035957f, 74.545746f, -173.431549f, -5.219500f, 77.031425f, 112.113403f, -0.166995f, 3.456159f, + -3.050452f, 8.178238f, 12.106802f, 14.360980f, 10.296390f, 13.889872f, -5.219500f, -66.011856f, -245.560532f, -53.745152f, -21.376526f, 7.093097f, + -34.497917f, 58.632385f, 80.076279f, 8.356211f, -4.554988f, 120.411072f, 77.031425f, -245.560532f, -12485.017578f, -211.927429f, 791.254944f, -708.115784f, + 0.665648f, -6.619084f, -79.117699f, 15.654002f, 45.390419f, 69.282356f, 112.113403f, -53.745152f, -211.927429f, -775.154602f, -7.915978f, 73.130432f, + 3.172123f, -22.678297f, 15.459837f, 43.245403f, 10.640046f, 1.826011f, -0.166995f, -21.376526f, 791.254944f, -7.915982f, -312.138367f, -76.008308f, + 5.710633f, -7.513731f, 34.635460f, 35.328983f, 17.738880f, 8.071489f, 3.456159f, 7.093094f, -708.115784f, 73.130432f, -76.008293f, -469.943726f +}; + +const float lvm_music[N_MIXTURES] = +{ + 27.932661f, 30.347250f, 34.528702f, 31.239647f, 20.447638f, 33.589111f +}; + +const float m_noise[N_MIXTURES*N_FEATURES] = +{ + 0.452427f, 0.570086f, 0.242006f, 0.342721f, 0.403700f, 0.415107f, 0.444218f, 0.438761f, 0.034564f, 0.893050f, 0.819168f, 0.404974f, + 0.436768f, 0.457530f, 0.286204f, 0.393398f, 0.429530f, 0.444983f, 0.474495f, 0.377982f, 0.032033f, 0.980933f, 0.864315f, 0.377762f, + 0.554771f, 0.507113f, 0.244596f, 0.401393f, 0.425160f, 0.441338f, 0.467793f, 0.361573f, 0.031537f, 0.971703f, 0.866892f, 0.372985f, + 0.482864f, 0.545745f, 0.098616f, 0.246756f, 0.304649f, 0.303124f, 0.352083f, 0.363268f, 0.031057f, 0.901759f, 0.838419f, 0.339094f, + 0.421798f, 0.491610f, 0.266544f, 0.367277f, 0.407442f, 0.415130f, 0.458496f, 0.395402f, 0.035484f, 0.951506f, 0.861898f, 0.362091f, + 0.422524f, 0.475384f, 0.321804f, 0.436169f, 0.468526f, 0.481682f, 0.505572f, 0.389095f, 0.048487f, 0.967269f, 0.878799f, 0.409561f +}; + +const float invV_noise[N_MIXTURES*N_FEATURES*N_FEATURES] = +{ + -10.867715f, -0.756548f, -0.787901f, 4.638586f, -4.208551f, -1.593690f, 1.654504f, 0.517274f, -24.544769f, -2.342500f, 1.593914f, 1.892730f, + -0.756548f, -42.676064f, -5.171525f, -22.601748f, -3.989791f, -1.960918f, 9.223408f, 12.652583f, 16.718012f, 10.374084f, -17.742804f, -14.035854f, + -0.787901f, -5.171525f, -115.159836f, 77.010605f, -22.974529f, 22.149885f, -7.457938f, 51.154774f, 20.176580f, -1.104116f, 17.582054f, -18.231829f, + 4.638585f, -22.601746f, 77.010605f, -162.083023f, 69.046974f, -0.931657f, 9.922201f, 6.555853f, 49.297676f, 18.854517f, -9.951534f, 16.527628f, + -4.208551f, -3.989791f, -22.974525f, 69.046974f, -181.796692f, 112.212860f, -28.314665f, 9.765093f, 17.263042f, -17.941118f, -20.316977f, -12.281874f, + -1.593690f, -1.960918f, 22.149881f, -0.931659f, 112.212860f, -230.312469f, 120.808189f, -3.664834f, 21.109715f, 8.984108f, 15.273976f, -10.366921f, + 1.654504f, 9.223406f, -7.457942f, 9.922205f, -28.314672f, 120.808205f, -152.423096f, -1.527340f, -7.447964f, 5.038412f, 13.851591f, -12.278207f, + 0.517274f, 12.652583f, 51.154770f, 6.555853f, 9.765094f, -3.664836f, -1.527341f, -113.809120f, -127.203827f, -2.824038f, -50.058937f, -1.399267f, + -24.544767f, 16.718014f, 20.176580f, 49.297676f, 17.263042f, 21.109715f, -7.447963f, -127.203827f, -6696.807617f, -22.621326f, 415.747192f, -168.268478f, + -2.342500f, 10.374086f, -1.104114f, 18.854517f, -17.941120f, 8.984108f, 5.038413f, -2.824039f, -22.621326f, -153.911545f, 9.088697f, 20.155067f, + 1.593914f, -17.742804f, 17.582056f, -9.951534f, -20.316977f, 15.273976f, 13.851592f, -50.058945f, 415.747162f, 9.088697f, -180.485260f, -2.179248f, + 1.892730f, -14.035856f, -18.231823f, 16.527628f, -12.281875f, -10.366921f, -12.278206f, -1.399268f, -168.268478f, 20.155067f, -2.179248f, -92.283646f, + -23.031761f, -1.252800f, 2.168407f, 5.677273f, -1.038399f, -5.394459f, 4.921468f, -0.398360f, -7.562253f, 64.160614f, -4.832063f, 1.192536f, + -1.252800f, -99.841995f, 18.003206f, -17.730101f, -6.070672f, 16.703362f, -1.826001f, 24.508341f, 95.143112f, 31.486519f, -75.776428f, -4.459583f, + 2.168407f, 18.003206f, -298.278900f, 136.582794f, 23.557480f, 32.080963f, -44.544701f, 44.470726f, 121.132362f, 294.113434f, -22.118645f, 3.540136f, + 5.677273f, -17.730099f, 136.582779f, -552.121826f, 236.890076f, 45.754177f, 49.528828f, -18.333956f, -155.456558f, 137.723495f, 87.803368f, 9.539282f, + -1.038398f, -6.070671f, 23.557480f, 236.890076f, -779.760498f, 250.522018f, 101.655136f, 9.155396f, -82.543655f, -398.953156f, 95.902740f, 4.389515f, + -5.394459f, 16.703358f, 32.080971f, 45.754185f, 250.522049f, -825.768005f, 305.349487f, -6.825818f, 49.064461f, -530.656738f, -41.630035f, 0.097057f, + 4.921468f, -1.825999f, -44.544685f, 49.528828f, 101.655106f, 305.349457f, -714.934082f, 14.071314f, 81.227341f, -137.562592f, -2.118532f, -2.266444f, + -0.398360f, 24.508341f, 44.470741f, -18.333960f, 9.155393f, -6.825818f, 14.071318f, -306.676453f, 267.131439f, -29.354313f, -247.414047f, -3.381219f, + -7.562254f, 95.143112f, 121.132362f, -155.456558f, -82.543648f, 49.064457f, 81.227341f, 267.131439f, -18849.244141f, -929.838013f, 3582.389648f, -91.670364f, + 64.160622f, 31.486523f, 294.113434f, 137.723495f, -398.953186f, -530.656738f, -137.562607f, -29.354321f, -929.838013f, -15657.494141f, -160.551666f, -23.622292f, + -4.832063f, -75.776428f, -22.118641f, 87.803375f, 95.902733f, -41.630043f, -2.118535f, -247.414047f, 3582.389648f, -160.551666f, -2443.248535f, -102.662750f, + 1.192536f, -4.459581f, 3.540133f, 9.539283f, 4.389517f, 0.097059f, -2.266439f, -3.381226f, -91.670372f, -23.622292f, -102.662750f, -246.260574f, + -11.285410f, 5.316821f, 1.028375f, 1.780153f, -1.713055f, -6.356722f, 3.452291f, -0.472106f, 5.616539f, 22.361168f, -4.266212f, 2.444066f, + 5.316821f, -59.978729f, -45.510380f, 0.510493f, -4.121831f, 5.250934f, -14.358817f, 2.281706f, 4.310630f, 4.492869f, 17.377964f, 5.232576f, + 1.028376f, -45.510380f, -192.404053f, 60.491817f, 29.311884f, 10.877782f, -13.830601f, 4.475446f, 14.358991f, 170.638504f, 103.112320f, 3.708024f, + 1.780153f, 0.510493f, 60.491817f, -566.125488f, 303.482666f, -24.292496f, -8.399674f, -1.485864f, -37.162815f, -301.527344f, 10.013409f, 11.255829f, + -1.713055f, -4.121831f, 29.311880f, 303.482666f, -852.739014f, 287.208618f, 7.622868f, 2.283498f, -27.422876f, -496.049957f, -5.396815f, -1.631967f, + -6.356722f, 5.250934f, 10.877782f, -24.292484f, 287.208618f, -723.304810f, 301.939606f, -18.888754f, -49.648453f, -140.429428f, 26.881662f, 4.222802f, + 3.452292f, -14.358817f, -13.830603f, -8.399690f, 7.622864f, 301.939575f, -496.315796f, 24.400175f, 203.557098f, -224.619278f, -47.202961f, -9.425015f, + -0.472106f, 2.281706f, 4.475447f, -1.485866f, 2.283498f, -18.888754f, 24.400175f, -354.005493f, 136.772644f, -115.911537f, -131.393005f, 0.959444f, + 5.616539f, 4.310630f, 14.358991f, -37.162819f, -27.422880f, -49.648449f, 203.557098f, 136.772644f, -20332.845703f, -321.084869f, 3009.444580f, -97.580765f, + 22.361168f, 4.492869f, 170.638519f, -301.527344f, -496.049957f, -140.429428f, -224.619293f, -115.911537f, -321.084839f, -7067.310059f, -220.679733f, -46.764927f, + -4.266212f, 17.377964f, 103.112320f, 10.013409f, -5.396815f, 26.881662f, -47.202957f, -131.393005f, 3009.444336f, -220.679733f, -2442.017334f, -122.001373f, + 2.444066f, 5.232576f, 3.708023f, 11.255831f, -1.631966f, 4.222802f, -9.425015f, 0.959446f, -97.580765f, -46.764931f, -122.001373f, -270.966095f, + -14.192688f, 3.186916f, -7.950537f, 12.989626f, 5.455102f, 1.765226f, -5.165048f, 0.461338f, 7.198293f, -20.877787f, -2.402384f, 0.581967f, + 3.186916f, -44.923344f, -55.269123f, 8.982286f, -0.746719f, 13.665676f, 5.123918f, 2.567272f, -14.412151f, -21.068356f, 5.512080f, 3.727387f, + -7.950538f, -55.269123f, -874.676270f, 396.753632f, -241.704224f, 70.721024f, -240.685715f, 31.769787f, -186.425156f, -72.526421f, 58.346741f, 10.030197f, + 12.989626f, 8.982285f, 396.753632f, -538.253601f, 134.091171f, 33.957142f, -5.240913f, 40.302223f, 65.792999f, 256.190460f, 41.462269f, 59.464478f, + 5.455101f, -0.746719f, -241.704254f, 134.091171f, -942.252197f, 384.468231f, 36.093376f, 5.026894f, 111.673508f, 64.876976f, -19.179228f, 18.067732f, + 1.765226f, 13.665678f, 70.721085f, 33.957142f, 384.468231f, -885.075134f, 358.333008f, 13.728846f, 74.583847f, 277.755707f, 15.872023f, 32.199970f, + -5.165048f, 5.123920f, -240.685776f, -5.240921f, 36.093372f, 358.333008f, -694.631653f, 22.914997f, 82.867088f, 154.286697f, 2.264358f, 21.074474f, + 0.461338f, 2.567272f, 31.769791f, 40.302223f, 5.026892f, 13.728846f, 22.915001f, -341.417511f, -72.276520f, -87.553932f, -17.271832f, 7.437448f, + 7.198294f, -14.412151f, -186.425171f, 65.792999f, 111.673508f, 74.583847f, 82.867088f, -72.276520f, -16628.691406f, -258.116119f, 387.521759f, -260.230133f, + -20.877787f, -21.068354f, -72.526451f, 256.190460f, 64.876984f, 277.755707f, 154.286697f, -87.553932f, -258.116089f, -851.111816f, 3.469927f, 2.253677f, + -2.402384f, 5.512080f, 58.346741f, 41.462273f, -19.179226f, 15.872023f, 2.264359f, -17.271832f, 387.521759f, 3.469929f, -327.105011f, -45.187340f, + 0.581967f, 3.727389f, 10.030209f, 59.464478f, 18.067736f, 32.199970f, 21.074471f, 7.437444f, -260.230133f, 2.253681f, -45.187363f, -348.881165f, + -20.546539f, -1.232953f, -6.539483f, 7.977976f, -1.242327f, -4.323449f, 4.044850f, -8.261212f, -61.714569f, -16.814053f, 0.693824f, 2.217177f, + -1.232953f, -81.245918f, -33.514919f, -26.628014f, 2.160939f, -0.234839f, -0.764257f, 21.764839f, 133.689529f, 9.364232f, -27.287352f, -6.621866f, + -6.539483f, -33.514919f, -321.563904f, 105.228661f, 0.660729f, -32.550903f, -45.134315f, 42.045963f, -200.154724f, -42.022831f, 200.115005f, 19.959410f, + 7.977976f, -26.628016f, 105.228653f, -362.669098f, 100.723396f, 10.423860f, 45.250904f, -3.221930f, -63.687748f, -41.052856f, -5.156573f, 12.700191f, + -1.242327f, 2.160941f, 0.660730f, 100.723396f, -410.276917f, 189.899841f, 1.538413f, 21.637842f, -26.361103f, 35.868237f, 46.390850f, 13.527671f, + -4.323449f, -0.234840f, -32.550911f, 10.423860f, 189.899841f, -359.953278f, 149.268143f, 13.839684f, 104.534042f, 43.236813f, -23.356220f, -8.712662f, + 4.044850f, -0.764257f, -45.134308f, 45.250904f, 1.538413f, 149.268143f, -274.089874f, -8.017480f, 39.217266f, 23.817112f, 13.071558f, 8.212641f, + -8.261212f, 21.764839f, 42.045967f, -3.221937f, 21.637842f, 13.839684f, -8.017480f, -250.062653f, 77.902710f, -1.225836f, -98.802437f, 0.740895f, + -61.714565f, 133.689514f, -200.154709f, -63.687748f, -26.361105f, 104.534027f, 39.217266f, 77.902695f, -12793.175781f, 257.379974f, 1953.936523f, -236.987503f, + -16.814053f, 9.364232f, -42.022831f, -41.052856f, 35.868237f, 43.236813f, 23.817108f, -1.225832f, 257.379974f, -1194.391846f, -211.503952f, -22.654963f, + 0.693823f, -27.287352f, 200.115005f, -5.156573f, 46.390850f, -23.356216f, 13.071561f, -98.802437f, 1953.936523f, -211.503983f, -1273.349854f, -88.061317f, + 2.217178f, -6.621865f, 19.959414f, 12.700191f, 13.527678f, -8.712662f, 8.212641f, 0.740895f, -236.987518f, -22.654963f, -88.061317f, -364.010010f, + -23.764925f, -0.313664f, -1.392676f, 1.488295f, 1.913436f, -4.066601f, 6.848008f, -3.074351f, -7.675101f, 9.171298f, 3.117799f, 2.142688f, + -0.313664f, -88.759735f, -8.855761f, -26.637909f, 5.178853f, 10.666278f, 2.244489f, 21.984133f, 16.797499f, 4.685480f, 13.074540f, -2.708393f, + -1.392676f, -8.855759f, -175.915054f, 83.474174f, 41.251793f, 14.369057f, -12.605553f, 33.395245f, 65.670242f, 39.710125f, 36.098553f, -9.562349f, + 1.488295f, -26.637909f, 83.474182f, -383.095245f, 216.683212f, 12.198986f, 32.383698f, -14.022625f, 7.763216f, -100.727264f, -28.525242f, -5.235438f, + 1.913436f, 5.178854f, 41.251801f, 216.683212f, -586.877808f, 253.507355f, 29.591257f, 7.710151f, -31.813087f, -112.656593f, 20.279724f, -7.102311f, + -4.066601f, 10.666278f, 14.369057f, 12.198978f, 253.507355f, -597.128113f, 296.967621f, 6.174671f, -41.961372f, -36.203259f, -20.597570f, -14.877533f, + 6.848009f, 2.244488f, -12.605548f, 32.383701f, 29.591269f, 296.967590f, -456.794678f, 26.321606f, -34.872383f, 28.424320f, 34.979023f, -8.548788f, + -3.074351f, 21.984133f, 33.395245f, -14.022625f, 7.710150f, 6.174670f, 26.321606f, -265.545593f, 2.918175f, 0.831582f, -125.449432f, -11.139709f, + -7.675101f, 16.797503f, 65.670242f, 7.763219f, -31.813070f, -41.961380f, -34.872383f, 2.918175f, -1731.894409f, -210.794144f, 739.213074f, -97.542229f, + 9.171299f, 4.685479f, 39.710129f, -100.727264f, -112.656593f, -36.203262f, 28.424320f, 0.831581f, -210.794113f, -2326.243652f, -106.282173f, 1.036536f, + 3.117799f, 13.074540f, 36.098553f, -28.525242f, 20.279724f, -20.597570f, 34.979023f, -125.449432f, 739.213074f, -106.282112f, -1878.532593f, -113.480858f, + 2.142687f, -2.708396f, -9.562349f, -5.235439f, -7.102309f, -14.877532f, -8.548790f, -11.139709f, -97.542229f, 1.036536f, -113.480865f, -101.406532f +}; + +const float lvm_noise[N_MIXTURES] = +{ + 28.723963f, 41.180500f, 39.296734f, 38.508724f, 37.029205f, 35.496319f +}; + +/* Mel filterbank */ +const int16_t mel_fb_start[NB_MEL_BANDS] = +{ + 1, 1, 2, 3, 4, 5, 5, 7, 8, 9, 10, 11, 13, 14, 16, 17, 19, 21, 23, 25, 28, 30, 33, 35, 38, 41, 45, 48, 52, 56, 60, 65, 69, 74, 80, 86, 92, 98, 105, 112 +}; + +const int16_t mel_fb_len[NB_MEL_BANDS] = +{ + 1, 2, 2, 2, 1, 2, 3, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 5, 5, 5, 5, 5, 6, 7, 7, 7, 8, 8, 9, 9, 9, 11, 12, 12, 12, 13, 14, 15, 16 +}; + +const float mel_fb[246] = +{ + 1.21713338f, 0.78286662f, 0.65362656f, 1.34637344f, 0.27740994f, + 1.72259006f, 0.06297006f, 1.93702994f, 1.98967602f, 0.04060794f, + 0.01032398f, 1.95939206f, 0.20171708f, 1.79828292f, 0.46121084f, + 1.53878916f, 0.80909416f, 1.19090584f, 1.23682173f, 0.76317827f, + 1.73703053f, 0.30333129f, 0.26296947f, 1.69666871f, 0.93014405f, + 1.06985595f, 1.61256694f, 0.34627063f, 0.38743306f, 1.65372937f, + 1.12741246f, 0.87258754f, 1.95256612f, 0.81866363f, 0.04743388f, + 1.18133637f, 1.72294702f, 0.66292792f, 0.27705298f, 1.33707208f, + 1.63635355f, 0.64117786f, 0.36364645f, 1.35882214f, 1.67553701f, + 0.73772833f, 0.32446299f, 1.26227167f, 1.82619229f, 0.93949686f, + 0.076324f, 0.17380771f, 1.06050314f, 1.923676f, 1.23545786f, + 0.4157745f, 0.76454214f, 1.5842255f, 1.61623283f, 0.83586669f, + 0.07377779f, 0.38376717f, 1.16413331f, 1.92622221f, 1.32912953f, + 0.60114148f, 0.67087047f, 1.39885852f, 1.88908443f, 1.19227603f, + 0.51007685f, 0.11091557f, 0.80772397f, 1.48992315f, 1.84188687f, + 1.18714227f, 0.54531261f, 0.15811313f, 0.81285773f, 1.45468739f, + 1.91589823f, 1.29842793f, 0.69245681f, 0.09756439f, 0.08410177f, + 0.70157207f, 1.30754319f, 1.90243561f, 1.51335285f, 0.9394454f, + 0.37548486f, 0.48664715f, 1.0605546f, 1.62451514f, 1.82113229f, + 1.2760658f, 0.7399794f, 0.21258197f, 0.17886771f, 0.7239342f, + 1.2600206f, 1.78741803f, 1.69359635f, 1.18275841f, 0.67981626f, + 0.18452955f, 0.30640365f, 0.81724159f, 1.32018374f, 1.81547045f, + 1.69666871f, 1.21601434f, 0.74235665f, 0.27549486f, 0.30333129f, + 0.78398566f, 1.25764335f, 1.72450514f, 1.81523671f, 1.36139799f, + 0.91380209f, 0.4722796f, 0.03666789f, 0.18476329f, 0.63860201f, + 1.08619791f, 1.5277204f, 1.96333211f, 1.60681079f, 1.18255825f, + 0.763766f, 0.35029527f, 0.39318921f, 0.81744175f, 1.236234f, + 1.64970473f, 1.94201251f, 1.53878916f, 1.14050133f, 0.74702969f, + 0.35825913f, 0.05798749f, 0.46121084f, 0.85949867f, 1.25297031f, + 1.64174087f, 1.97407865f, 1.59438112f, 1.21906313f, 0.8480248f, + 0.48116964f, 0.11840435f, 0.02592135f, 0.40561888f, 0.78093687f, + 1.1519752f, 1.51883036f, 1.88159565f, 1.75963877f, 1.40478565f, + 1.05376058f, 0.70648184f, 0.36287032f, 0.02284937f, 0.24036123f, + 0.59521435f, 0.94623942f, 1.29351816f, 1.63712968f, 1.97715063f, + 1.68634473f, 1.35328441f, 1.02359863f, 0.69721967f, 0.37408188f, + 0.05412149f, 0.31365527f, 0.64671559f, 0.97640137f, 1.30278033f, + 1.62591812f, 1.94587851f, 1.73727665f, 1.42348724f, 1.11269492f, + 0.80484297f, 0.49987627f, 0.19774124f, 0.26272335f, 0.57651276f, + 0.88730508f, 1.19515703f, 1.50012373f, 1.80225876f, 1.89838578f, + 1.60175922f, 1.30781224f, 1.01649688f, 0.72776643f, 0.44157541f, + 0.15787955f, 0.10161422f, 0.39824078f, 0.69218776f, 0.98350312f, + 1.27223357f, 1.55842459f, 1.84212045f, 1.87663572f, 1.59780189f, + 1.32133711f, 1.04720147f, 0.77535604f, 0.50576287f, 0.23838496f, + 0.12336428f, 0.40219811f, 0.67866289f, 0.95279853f, 1.22464396f, + 1.49423713f, 1.76161504f, 1.97318619f, 1.71013133f, 1.449186f, + 1.19031663f, 0.93349044f, 0.67867544f, 0.42584038f, 0.17495472f, + 0.02681381f, 0.28986867f, 0.550814f, 0.80968337f, 1.06650956f, + 1.32132456f, 1.57415962f, 1.82504528f, 1.92598864f, 1.67891297f, + 1.43369924f, 1.19031958f, 0.94874676f, 0.70895416f, 0.47091573f, + 0.23460598f +}; + +const float dct_mtx[NB_MEL_BANDS * NB_MEL_COEF] = +{ + 2.23434405e-01f, 2.22056858e-01f, 2.19310256e-01f, 2.15211533e-01f, 2.09785960e-01f, 2.03066987e-01f, 1.95096038e-01f, 1.85922257e-01f, 1.75602204e-01f, 1.64199505e-01f, 1.51784461e-01f, 1.38433616e-01f, + 1.24229281e-01f, 1.09259031e-01f, 9.36151633e-02f, 7.73941268e-02f, 6.06959298e-02f, 4.36235222e-02f, 2.62821611e-02f, 8.77876168e-03f, -8.77876168e-03f, -2.62821611e-02f, -4.36235222e-02f, -6.06959298e-02f, + -7.73941268e-02f, -9.36151633e-02f, -1.09259031e-01f, -1.24229281e-01f, -1.38433616e-01f, -1.51784461e-01f, -1.64199505e-01f, -1.75602204e-01f, -1.85922257e-01f, -1.95096038e-01f, -2.03066987e-01f, -2.09785960e-01f, + -2.15211533e-01f, -2.19310256e-01f, -2.22056858e-01f, -2.23434405e-01f, + + 2.22917493e-01f, 2.17428524e-01f, 2.06585744e-01f, 1.90656137e-01f, 1.70031943e-01f, 1.45220998e-01f, 1.16834231e-01f, 8.55706169e-02f, 5.21999703e-02f, 1.75439872e-02f, -1.75439872e-02f, -5.21999703e-02f, + -8.55706169e-02f, -1.16834231e-01f, -1.45220998e-01f, -1.70031943e-01f, -1.90656137e-01f, -2.06585744e-01f, -2.17428524e-01f, -2.22917493e-01f, -2.22917493e-01f, -2.17428524e-01f, -2.06585744e-01f, -1.90656137e-01f, + -1.70031943e-01f, -1.45220998e-01f, -1.16834231e-01f, -8.55706169e-02f, -5.21999703e-02f, -1.75439872e-02f, 1.75439872e-02f, 5.21999703e-02f, 8.55706169e-02f, 1.16834231e-01f, 1.45220998e-01f, 1.70031943e-01f, + 1.90656137e-01f, 2.06585744e-01f, 2.17428524e-01f, 2.22917493e-01f, + + 2.22056858e-01f, 2.09785960e-01f, 1.85922257e-01f, 1.51784461e-01f, 1.09259031e-01f, 6.06959298e-02f, 8.77876168e-03f, -4.36235222e-02f, -9.36151633e-02f, -1.38433616e-01f, -1.75602204e-01f, -2.03066987e-01f, + -2.19310256e-01f, -2.23434405e-01f, -2.15211533e-01f, -1.95096038e-01f, -1.64199505e-01f, -1.24229281e-01f, -7.73941268e-02f, -2.62821611e-02f, 2.62821611e-02f, 7.73941268e-02f, 1.24229281e-01f, 1.64199505e-01f, + 1.95096038e-01f, 2.15211533e-01f, 2.23434405e-01f, 2.19310256e-01f, 2.03066987e-01f, 1.75602204e-01f, 1.38433616e-01f, 9.36151633e-02f, 4.36235222e-02f, -8.77876168e-03f, -6.06959298e-02f, -1.09259031e-01f, + -1.51784461e-01f, -1.85922257e-01f, -2.09785960e-01f, -2.22056858e-01f, + + 2.20853827e-01f, 1.99235116e-01f, 1.58113883e-01f, 1.01515362e-01f, 3.49798098e-02f, -3.49798098e-02f, -1.01515362e-01f, -1.58113883e-01f, -1.99235116e-01f, -2.20853827e-01f, -2.20853827e-01f, -1.99235116e-01f, + -1.58113883e-01f, -1.01515362e-01f, -3.49798098e-02f, 3.49798098e-02f, 1.01515362e-01f, 1.58113883e-01f, 1.99235116e-01f, 2.20853827e-01f, 2.20853827e-01f, 1.99235116e-01f, 1.58113883e-01f, 1.01515362e-01f, + 3.49798098e-02f, -3.49798098e-02f, -1.01515362e-01f, -1.58113883e-01f, -1.99235116e-01f, -2.20853827e-01f, -2.20853827e-01f, -1.99235116e-01f, -1.58113883e-01f, -1.01515362e-01f, -3.49798098e-02f, 3.49798098e-02f, + 1.01515362e-01f, 1.58113883e-01f, 1.99235116e-01f, 2.20853827e-01f, + + 2.19310256e-01f, 1.85922257e-01f, 1.24229281e-01f, 4.36235222e-02f, -4.36235222e-02f, -1.24229281e-01f, -1.85922257e-01f, -2.19310256e-01f, -2.19310256e-01f, -1.85922257e-01f, -1.24229281e-01f, -4.36235222e-02f, + 4.36235222e-02f, 1.24229281e-01f, 1.85922257e-01f, 2.19310256e-01f, 2.19310256e-01f, 1.85922257e-01f, 1.24229281e-01f, 4.36235222e-02f, -4.36235222e-02f, -1.24229281e-01f, -1.85922257e-01f, -2.19310256e-01f, + -2.19310256e-01f, -1.85922257e-01f, -1.24229281e-01f, -4.36235222e-02f, 4.36235222e-02f, 1.24229281e-01f, 1.85922257e-01f, 2.19310256e-01f, 2.19310256e-01f, 1.85922257e-01f, 1.24229281e-01f, 4.36235222e-02f, + -4.36235222e-02f, -1.24229281e-01f, -1.85922257e-01f, -2.19310256e-01f, + + 2.17428524e-01f, 1.70031943e-01f, 8.55706169e-02f, -1.75439872e-02f, -1.16834231e-01f, -1.90656137e-01f, -2.22917493e-01f, -2.06585744e-01f, -1.45220998e-01f, -5.21999703e-02f, 5.21999703e-02f, 1.45220998e-01f, + 2.06585744e-01f, 2.22917493e-01f, 1.90656137e-01f, 1.16834231e-01f, 1.75439872e-02f, -8.55706169e-02f, -1.70031943e-01f, -2.17428524e-01f, -2.17428524e-01f, -1.70031943e-01f, -8.55706169e-02f, 1.75439872e-02f, + 1.16834231e-01f, 1.90656137e-01f, 2.22917493e-01f, 2.06585744e-01f, 1.45220998e-01f, 5.21999703e-02f, -5.21999703e-02f, -1.45220998e-01f, -2.06585744e-01f, -2.22917493e-01f, -1.90656137e-01f, -1.16834231e-01f, + -1.75439872e-02f, 8.55706169e-02f, 1.70031943e-01f, 2.17428524e-01f, + + 2.15211533e-01f, 1.51784461e-01f, 4.36235222e-02f, -7.73941268e-02f, -1.75602204e-01f, -2.22056858e-01f, -2.03066987e-01f, -1.24229281e-01f, -8.77876168e-03f, 1.09259031e-01f, 1.95096038e-01f, 2.23434405e-01f, + 1.85922257e-01f, 9.36151633e-02f, -2.62821611e-02f, -1.38433616e-01f, -2.09785960e-01f, -2.19310256e-01f, -1.64199505e-01f, -6.06959298e-02f, 6.06959298e-02f, 1.64199505e-01f, 2.19310256e-01f, 2.09785960e-01f, + 1.38433616e-01f, 2.62821611e-02f, -9.36151633e-02f, -1.85922257e-01f, -2.23434405e-01f, -1.95096038e-01f, -1.09259031e-01f, 8.77876168e-03f, 1.24229281e-01f, 2.03066987e-01f, 2.22056858e-01f, 1.75602204e-01f, + 7.73941268e-02f, -4.36235222e-02f, -1.51784461e-01f, -2.15211533e-01f, + + 2.12662702e-01f, 1.31432778e-01f, 1.36919675e-17f, -1.31432778e-01f, -2.12662702e-01f, -2.12662702e-01f, -1.31432778e-01f, -4.10759024e-17f, 1.31432778e-01f, 2.12662702e-01f, 2.12662702e-01f, 1.31432778e-01f, + 6.84598373e-17f, -1.31432778e-01f, -2.12662702e-01f, -2.12662702e-01f, -1.31432778e-01f, -9.58437722e-17f, 1.31432778e-01f, 2.12662702e-01f, 2.12662702e-01f, 1.31432778e-01f, 1.23227707e-16f, -1.31432778e-01f, + -2.12662702e-01f, -2.12662702e-01f, -1.31432778e-01f, 2.46593822e-16f, 1.31432778e-01f, 2.12662702e-01f, 2.12662702e-01f, 1.31432778e-01f, 5.75201041e-16f, -1.31432778e-01f, -2.12662702e-01f, -2.12662702e-01f, + -1.31432778e-01f, -6.02584976e-16f, 1.31432778e-01f, 2.12662702e-01f, + + 2.09785960e-01f, 1.09259031e-01f, -4.36235222e-02f, -1.75602204e-01f, -2.23434405e-01f, -1.64199505e-01f, -2.62821611e-02f, 1.24229281e-01f, 2.15211533e-01f, 2.03066987e-01f, 9.36151633e-02f, -6.06959298e-02f, + -1.85922257e-01f, -2.22056858e-01f, -1.51784461e-01f, -8.77876168e-03f, 1.38433616e-01f, 2.19310256e-01f, 1.95096038e-01f, 7.73941268e-02f, -7.73941268e-02f, -1.95096038e-01f, -2.19310256e-01f, -1.38433616e-01f, + 8.77876168e-03f, 1.51784461e-01f, 2.22056858e-01f, 1.85922257e-01f, 6.06959298e-02f, -9.36151633e-02f, -2.03066987e-01f, -2.15211533e-01f, -1.24229281e-01f, 2.62821611e-02f, 1.64199505e-01f, 2.23434405e-01f, + 1.75602204e-01f, 4.36235222e-02f, -1.09259031e-01f, -2.09785960e-01f, + + 2.06585744e-01f, 8.55706169e-02f, -8.55706169e-02f, -2.06585744e-01f, -2.06585744e-01f, -8.55706169e-02f, 8.55706169e-02f, 2.06585744e-01f, 2.06585744e-01f, 8.55706169e-02f, -8.55706169e-02f, -2.06585744e-01f, + -2.06585744e-01f, -8.55706169e-02f, 8.55706169e-02f, 2.06585744e-01f, 2.06585744e-01f, 8.55706169e-02f, -8.55706169e-02f, -2.06585744e-01f, -2.06585744e-01f, -8.55706169e-02f, 8.55706169e-02f, 2.06585744e-01f, + 2.06585744e-01f, 8.55706169e-02f, -8.55706169e-02f, -2.06585744e-01f, -2.06585744e-01f, -8.55706169e-02f, 8.55706169e-02f, 2.06585744e-01f, 2.06585744e-01f, 8.55706169e-02f, -8.55706169e-02f, -2.06585744e-01f, + -2.06585744e-01f, -8.55706169e-02f, 8.55706169e-02f, 2.06585744e-01f, + + 2.03066987e-01f, 6.06959298e-02f, -1.24229281e-01f, -2.22056858e-01f, -1.64199505e-01f, 8.77876168e-03f, 1.75602204e-01f, 2.19310256e-01f, 1.09259031e-01f, -7.73941268e-02f, -2.09785960e-01f, -1.95096038e-01f, + -4.36235222e-02f, 1.38433616e-01f, 2.23434405e-01f, 1.51784461e-01f, -2.62821611e-02f, -1.85922257e-01f, -2.15211533e-01f, -9.36151633e-02f, 9.36151633e-02f, 2.15211533e-01f, 1.85922257e-01f, 2.62821611e-02f, + -1.51784461e-01f, -2.23434405e-01f, -1.38433616e-01f, 4.36235222e-02f, 1.95096038e-01f, 2.09785960e-01f, 7.73941268e-02f, -1.09259031e-01f, -2.19310256e-01f, -1.75602204e-01f, -8.77876168e-03f, 1.64199505e-01f, + 2.22056858e-01f, 1.24229281e-01f, -6.06959298e-02f, -2.03066987e-01f, + + 1.99235116e-01f, 3.49798098e-02f, -1.58113883e-01f, -2.20853827e-01f, -1.01515362e-01f, 1.01515362e-01f, 2.20853827e-01f, 1.58113883e-01f, -3.49798098e-02f, -1.99235116e-01f, -1.99235116e-01f, -3.49798098e-02f, + 1.58113883e-01f, 2.20853827e-01f, 1.01515362e-01f, -1.01515362e-01f, -2.20853827e-01f, -1.58113883e-01f, 3.49798098e-02f, 1.99235116e-01f, 1.99235116e-01f, 3.49798098e-02f, -1.58113883e-01f, -2.20853827e-01f, + -1.01515362e-01f, 1.01515362e-01f, 2.20853827e-01f, 1.58113883e-01f, -3.49798098e-02f, -1.99235116e-01f, -1.99235116e-01f, -3.49798098e-02f, 1.58113883e-01f, 2.20853827e-01f, 1.01515362e-01f, -1.01515362e-01f, + -2.20853827e-01f, -1.58113883e-01f, 3.49798098e-02f, 1.99235116e-01f, + + 1.95096038e-01f, 8.77876168e-03f, -1.85922257e-01f, -2.03066987e-01f, -2.62821611e-02f, 1.75602204e-01f, 2.09785960e-01f, 4.36235222e-02f, -1.64199505e-01f, -2.15211533e-01f, -6.06959298e-02f, 1.51784461e-01f, + 2.19310256e-01f, 7.73941268e-02f, -1.38433616e-01f, -2.22056858e-01f, -9.36151633e-02f, 1.24229281e-01f, 2.23434405e-01f, 1.09259031e-01f, -1.09259031e-01f, -2.23434405e-01f, -1.24229281e-01f, 9.36151633e-02f, + 2.22056858e-01f, 1.38433616e-01f, -7.73941268e-02f, -2.19310256e-01f, -1.51784461e-01f, 6.06959298e-02f, 2.15211533e-01f, 1.64199505e-01f, -4.36235222e-02f, -2.09785960e-01f, -1.75602204e-01f, 2.62821611e-02f, + 2.03066987e-01f, 1.85922257e-01f, -8.77876168e-03f, -1.95096038e-01f +}; + +const float SF[N_FEATURES*2] = +{ + 0.0048f, -0.0952f, + 1.0002f, 0, + 0.6226f, -0.0695f, + 0.5497f, -0.1265f, + 0.4963f, -0.2230f, + 0.5049f, -0.4103f, + 0.5069f, -0.5717f, + 0.0041f, 0, + 0.0022f, -0.0029f, + 0.0630f, 1.0015f, + 0.0684f, 0.9103f, + 0.1159f, -0.2931f +}; + +const float SF_8k[N_FEATURES*2] = +{ + 0.0041f, 0, + 0.8572f, 0.1020f, + 0.6739f, -0.1000f, + 0.6257f, -0.1678f, + 0.5495f, -0.2380f, + 0.5793f, -0.4646f, + 0.2502f, 0, + 0.0041f, 0, + 0.0020f, 0, + 0.0630f, 1.0015f, + 0.0598f, 0.8967f, + 0.0631f, 0 +}; + + +/* searching thresholds for quantization of peak gains */ +const float thren_pg[44] = +{ + 120193.5539509f, 101070.3286539f, + 84989.6770536f, 71467.5147680f, + 60096.7769755f, 50535.1643270f, + 42494.8385268f, 35733.7573840f, + 30048.3884877f, 25267.5821635f, + 19483.9693722f, 13777.2468675f, + 9741.9846861f, 6888.6234338f, + 4870.9923431f, 3444.3117169f, + 2435.4961715f, 1722.1558584f, + 1217.7480858f, 861.0779292f, + 608.8740429f, 430.5389646f, + 304.4370214f, 215.2694823f, + 152.2185107f, 107.6347412f, + 76.1092554f, 53.8173706f, + 38.0546277f, 26.9086853f, + 19.0273138f, 13.4543426f, + 9.5136569f, 6.7271713f, + 4.7568285f, 3.3635857f, + 2.3784142f, 1.6817928f, + 1.1892071f, 0.840896f, + 0.594604f, 0.420448f, + 0.297302f, 0.210224f +}; + +/* Huffmann coding - searching thresholds for quantization of peak gains */ +const int16_t huffnorm_e[32] = +{ + 1062, 550, 314, 274, 273, 272, 156, 79, 69, 38, + 18, 40, 5, 3, 0, 1, 3, 4, 11, 21, + 41, 32, 35, 67, 133, 264, 530, 315, 551, 2126, 4254, 4255 +}; + +const int16_t huffnorm_n[32] = +{ + 14831, 14830, 7414, 3706, 593, 927, 462, 297, 230, 116, + 50, 36, 13, 8, 5, 1, 0, 2, 6, 7, + 15, 19, 24, 56, 59, 51, 114, 117, 75, 149, 592, 1852 +}; + +const int16_t huffsizn_e[32] = +{ + 13, 12, 11, 11, 11, 11, 10, 9, 9, 8, + 7, 6, 5, 4, 3, 2, 2, 3, 4, 5, + 6, 8, 8, 9, 10, 11, 12, 11, 12, 14, 15, 15 +}; + +const int16_t huffsizn_n[32] = +{ + 14, 14, 13, 12, 10, 10, 9, 9, 8, 7, + 7, 6, 5, 4, 3, 3, 3, 3, 3, 4, + 4, 5, 6, 6, 6, 7, 7, 7, 7, 8, 10, 11 +}; + +const int16_t resize_huffnorm[32] = +{ + 0, 0, 0, 0, 0, 1023, 511, 255, 127, 63, 31, 15, 7, 3, 1, 0, + 2, 5, 11, 23, 47, 95, 191, 383, 767, 2047, 0, 0, 0, 0, 0, 0 +}; + +const int16_t huffnorm[32] = +{ + 26, 58, 90, 122, 27, 59, 91, 123, 12, 28, 44, 60, 2, 6, 4, 6, + 0, 2, 10, 14, 14, 30, 46, 62, 30, 62, 94, 126, 31, 63, 95, 127 +}; + +const int16_t pgain_huffnorm[32] = +{ + 1, 1, 2, 3, 3, 2, 2, 2, 3, 3, 4, 5, 6, 7, 8, 9, + 10, 11, 12, 13, 14, 15, 4, 5, 3, 2, 3, 3, 4, 5, 0, 1 +}; + +const int16_t hessize[8]= +{ + 7, 5, 3, 2, 1, 4, 6, 7 +}; + +const int16_t hescode[8]= +{ + 11, 3, 1, 1, 1, 0, 4, 10 +}; + +/*----------------------------------------------------------------------------------* + * BWD + *----------------------------------------------------------------------------------*/ + +const float hann_window_320[BWD_TOTAL_WIDTH/2] = +{ + 0.0f, 0.000096984948331f, 0.000387902169007f, 0.000872638803658f, + 0.001551006803657f, 0.002422743003060f, 0.003487509220708f, 0.004744892391413f, + 0.006194404726209f, 0.007835483901579f, 0.009667493277608f, 0.011689722144956f, + 0.013901386000576f, 0.016301626852047f, 0.018889513550430f, 0.021664042151495f, + 0.024624136305188f, 0.027768647673197f, 0.031096356374430f, 0.034605971458262f, + 0.038296131405342f, 0.042165404655783f, 0.046212290164521f, 0.050435217983627f, + 0.054832549871356f, 0.059402579927684f, 0.064143535256096f, 0.069053576651361f, + 0.074130799313035f, 0.079373233584409f, 0.084778845716614f, 0.090345538657597f, + 0.096071152865649f, 0.101953467147178f, 0.107990199518396f, 0.114179008090596f, + 0.120517491978659f, 0.127003192232455f, 0.133633592790768f, 0.140406121457376f, + 0.147318150898908f, 0.154366999664091f, 0.161549933223991f, 0.168864165032848f, + 0.176306857609086f, 0.183875123636085f, 0.191566027082286f, 0.199376584340196f, + 0.207303765383847f, 0.215344494944262f, 0.223495653702478f, 0.231754079499652f, + 0.240116568563785f, 0.248579876752599f, 0.257140720812064f, 0.265795779650105f, + 0.274541695624985f, 0.283375075847868f, 0.292292493499057f, 0.301290489157390f, + 0.310365572142292f, 0.319514221867944f, 0.328732889209064f, 0.338017997877748f, + 0.347365945810858f, 0.356773106567405f, 0.366235830735390f, 0.375750447347553f, + 0.385313265305494f, 0.394920574811589f, 0.404568648808175f, 0.414253744423419f, + 0.423972104423331f, 0.433719958669339f, 0.443493525580883f, 0.453289013602435f, + 0.463102622674396f, 0.472930545707291f, 0.482768970058690f, 0.492614079012283f, + 0.502462053258538f, 0.512309072376361f, 0.522151316315189f, 0.531984966876945f, + 0.541806209197260f, 0.551611233225420f, 0.561396235202429f, 0.571157419136643f, + 0.580890998276382f, 0.590593196578969f, 0.600260250175597f, 0.609888408831494f, + 0.619473937400779f, 0.629013117275481f, 0.638502247828131f, 0.647937647847382f, + 0.657315656966103f, 0.666632637081372f, 0.675884973765851f, 0.685069077669957f, + 0.694181385914321f, 0.703218363471965f, 0.712176504539683f, 0.721052333898081f, + 0.729842408259752f, 0.738543317605065f, 0.747151686505047f, 0.755664175430844f, + 0.764077482049264f, 0.772388342503876f, 0.780593532681191f, 0.788689869461429f, + 0.796674211953372f, 0.804543462712845f, 0.812294568944333f, 0.819924523685287f, + 0.827430366972643f, 0.834809186991105f, 0.842058121202763f, 0.849174357457574f, + 0.856155135084319f, 0.862997745961565f, 0.869699535568266f, 0.876257904013544f, + 0.882670307045301f, 0.888934257037231f, 0.895047323953867f, 0.901007136293294f, + 0.906811382007145f, 0.912457809397536f, 0.917944227990593f, 0.923268509386220f, + 0.928428588083795f, 0.933422462283452f, 0.938248194662667f, 0.942903913127819f, + 0.947387811540448f, 0.951698150417930f, 0.955833257608292f, 0.959791528938907f, + 0.963571428838810f, 0.967171490934417f, 0.970590318618383f, 0.973826585591401f, + 0.976879036376732f, 0.979746486807249f, 0.982427824484824f, 0.984922009211872f, + 0.987228073394887f, 0.989345122419805f, 0.991272334999066f, 0.993008963490220f, + 0.994554334185968f, 0.995907847575523f, 0.997068978577180f, 0.998037276742018f, + 0.998812366428647f, 0.999393946948934f, 0.999781792684653f, 0.999975753175008f +}; + +/*----------------------------------------------------------------------------------* + * Starting line for the noise measurement in TCX. + *----------------------------------------------------------------------------------*/ + +const int16_t startLineWB[N_TCX_STARTLINE_NOISE_WB] = { 8, 23, 36, 45, 66, 128 /* 13.2kbps */, 200, 320, 320, 320 /* 48kbps */, 320 }; + +const int16_t startLineSWB[N_TCX_STARTLINE_NOISE_SWB] = { 8, 44, 96 /* 13.2kbps */, 160, 320, 320, 256 /* 48kbps */, 341, 640 }; + + +/* clang-format on */ diff --git a/lib_enc/rom_enc.h b/lib_enc/rom_enc.h new file mode 100644 index 0000000000000000000000000000000000000000..6e39642b4d32df757bb4cd9b1c015ed1e76e10a9 --- /dev/null +++ b/lib_enc/rom_enc.h @@ -0,0 +1,206 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#ifndef ROM_ENC_H +#define ROM_ENC_H + +#include +#include "options.h" +#include "stat_enc.h" +#include "cnst.h" + +/*----------------------------------------------------------------------------------* + * General tables + *----------------------------------------------------------------------------------*/ + +extern const float sqrt_han_window[]; /* Half of the square root hanning window */ +extern const int16_t tipos[]; /* Starting points for pulse position search in Algebraic innovation codebook */ +extern const float E_ROM_inter4_1[PIT_UP_SAMP * L_INTERPOL1 + 1]; +extern const float E_ROM_inter6_1[PIT_UP_SAMP6 * L_INTERPOL1 + 1]; +extern const float E_ROM_inter4_1[PIT_UP_SAMP * L_INTERPOL1 + 1]; +extern const float E_ROM_inter6_1[PIT_UP_SAMP6 * L_INTERPOL1 + 1]; +extern const float W_HIST[DTX_HIST_SIZE]; /* CNG & DTX - table for calculation of average excitation energy */ + +extern const int16_t bwd_start_bin[]; +extern const int16_t bwd_end_bin[]; + +extern const float h_fir[]; /* 2nd order fir filter for wsp, decimation by 2 */ + +extern const float preemphCompensation[]; + +/*----------------------------------------------------------------------------------* + * VAD tables + *----------------------------------------------------------------------------------*/ + +extern const int16_t hangover_hd_tbl[3]; +extern const int16_t hangover_sf_tbl[6]; + +/*----------------------------------------------------------------------------------* + * Open-loop pitch search tables + *----------------------------------------------------------------------------------*/ + +extern const int16_t nb_sect_12k8[]; +extern const int16_t nb_subsect_12k8[]; +extern const int16_t len_12k8[]; +extern const int16_t len1_12k8[]; +extern const int16_t sublen_12k8[]; +extern const int16_t sublen1_12k8[]; +extern const int16_t pit_max_12k8[]; +extern const int16_t sec_length_12k8[]; +extern const int16_t sec_length1_12k8[]; + +/*----------------------------------------------------------------------------------* + * LSF quantizer + *----------------------------------------------------------------------------------*/ + +extern const int16_t lsf_numlevels[TCXLPC_NUMSTAGES]; +extern const int16_t lsf_ind_numlevels[TCXLPC_IND_NUMSTAGES]; + +extern const int16_t lsf_unified_fit_model_nb[4][16]; +extern const int16_t lsf_unified_fit_model_wb[4][16]; +extern const int16_t lsf_unified_fit_model_wbhb[4][16]; + +extern const float Freq_Weight_Com[160]; +extern const float Freq_Weight_UV[160]; + +/*----------------------------------------------------------------------------------* + * Speech/music classification + *----------------------------------------------------------------------------------*/ + +extern const float w_spmus[HANG_LEN][HANG_LEN]; + +extern const float sm_means[]; +extern const float sm_scale[]; +extern const float hout_intervals[]; +extern const float bcox_add_cnst[N_SMC_FEATURES]; +extern const float bcox_lmbd[N_SMC_FEATURES]; +extern const float pca_mean_[]; +extern const float pca_components_[]; +extern const float weights_speech[]; +extern const float means_speech[]; +extern const float weights_music[]; +extern const float means_music[]; +extern const float weights_noise[]; +extern const float means_noise[]; +extern const float prec_chol_speech[]; +extern const float log_det_chol_speech[]; +extern const float prec_chol_music[]; +extern const float log_det_chol_music[]; +extern const float prec_chol_noise[]; +extern const float log_det_chol_noise[]; + +extern const float m_speech[]; +extern const float invV_speech[]; +extern const float lvm_speech[]; + +extern const float m_music[]; +extern const float invV_music[]; +extern const float lvm_music[]; + +extern const float m_noise[]; +extern const float invV_noise[]; +extern const float lvm_noise[]; + +extern const int16_t mel_fb_start[]; +extern const int16_t mel_fb_len[]; +extern const float mel_fb[]; +extern const float dct_mtx[]; + +extern const float SF[]; +extern const float SF_8k[]; + +/*----------------------------------------------------------------------------------* + * SWB TBE + *----------------------------------------------------------------------------------*/ + +extern const float lpc_weights[]; + +/*----------------------------------------------------------------------------------* + * WB, SWB and FB bandwidth detector + *----------------------------------------------------------------------------------*/ + +extern const float hann_window_320[]; + +/*----------------------------------------------------------------------------------* + * Huffman coding + *----------------------------------------------------------------------------------*/ + +extern const int16_t huffsizn_e[32]; +extern const int16_t huffsizn_n[32]; + +extern const int16_t huffnorm_e[32]; +extern const int16_t huffnorm_n[32]; +extern const int16_t hessize[8]; +extern const int16_t hescode[8]; + +/*----------------------------------------------------------------------------------* + * VAD + *----------------------------------------------------------------------------------*/ + +extern const int16_t BAND_NUM_TAB[5]; + +extern const float M_inr[16]; +extern const float M_ini[16]; +extern const float M_r[8]; +extern const float M_i[8]; +extern const float M_Wr[16]; +extern const float M_Wi[16]; + +extern const int16_t SP_CENTER_BAND_NUM_TAB[5]; +extern const float VAD_DELTA1[5]; +extern const float VAD_DELTA2[5]; + +extern const int16_t NREGION_INDEX_NB[9]; +extern const int16_t NREGION_INDEX_WB[13]; +extern const int16_t NREGION_INDEX_SWB[16]; +extern const int16_t NREGION_INDEX_FB[16]; +extern const int16_t ENERGY_BAND_NUM[4]; +extern const int16_t *REGION_INDEX[4]; +extern const float MAX_LF_SNR_TAB[4]; + +extern const float COMVAD_INIT_SNR_DELTA[5]; +extern const float LS_MIN_SELENCE_SNR[3]; +extern const float LT_MIN_SILENCE_SNR[3]; + +/*----------------------------------------------------------------------------------* + * Starting line for the noise measurement in TCX. + *----------------------------------------------------------------------------------*/ + +extern const int16_t startLineWB[N_TCX_STARTLINE_NOISE_WB]; +extern const int16_t startLineSWB[N_TCX_STARTLINE_NOISE_SWB]; + + +#endif diff --git a/lib_enc/rst_enc.c b/lib_enc/rst_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..023f1998c9c0d677f0979a7b743ab86f4f839b72 --- /dev/null +++ b/lib_enc/rst_enc.c @@ -0,0 +1,94 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * CNG_reset_enc() + * + * Reset encoder static variables after a CNG frame + *-------------------------------------------------------------------*/ + +void CNG_reset_enc( + Encoder_State *st, /* i/o: encoder state structure */ + float *pitch_buf, /* o : floating pitch for each subframe */ + float *voice_factors, /* o : voicing factors */ + int16_t VBR_cng_reset_flag ) +{ + init_gp_clip( st->clip_var ); + mvr2r( UVWB_Ave, st->mem_AR, M ); + set_f( st->mem_MA, 0, M ); + st->hLPDmem->mem_w0 = 0.0f; + st->hLPDmem->tilt_code = 0.0f; + st->hLPDmem->gc_threshold = 0.0f; + + if ( VBR_cng_reset_flag ) + { + set_f( st->hLPDmem->mem_syn, 0, M ); + } + set_f( st->hLPDmem->dispMem, 0, 8 ); + + /* last good received frame for FEC in ACELP */ + st->clas = UNVOICED_CLAS; + + /* reset the pitch buffer in case of FRAME_NO_DATA or SID frames */ + if ( st->L_frame == L_FRAME ) + { + set_f( pitch_buf, (float) L_SUBFR, NB_SUBFR ); + } + else /* st->L_frame == L_FRAME16k */ + { + set_f( pitch_buf, (float) L_SUBFR16k, NB_SUBFR16k ); + } + + set_f( voice_factors, 1.0, NB_SUBFR16k ); + + if ( st->hTdCngEnc != NULL ) + { + /* Reset active frame counter */ + st->hTdCngEnc->act_cnt2 = 0; + } + + /* deactivate bass post-filter */ + st->bpf_off = 1; + + return; +} diff --git a/lib_enc/set_impulse.c b/lib_enc/set_impulse.c new file mode 100644 index 0000000000000000000000000000000000000000..2c8a7fdd080353a7880fb30d7ffd018b2f5f70dc --- /dev/null +++ b/lib_enc/set_impulse.c @@ -0,0 +1,342 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "wmc_auto.h" + +/*-----------------------------------------------------------------* + * Local constant + *-----------------------------------------------------------------*/ + +#define INPOL 4 /* +- range in samples for impulse position searching */ + +/*-----------------------------------------------------------------* + * Local function prototypes + *-----------------------------------------------------------------*/ + +static void convolve_tc( const float g[], const float h[], float y[], const int16_t L_1, const int16_t L_2 ); + +static void correlate_tc( const float *x, float *y, const float *h, const int16_t start, const int16_t L_1, const int16_t L_2 ); + +static void convolve_tc2( const float g[], const float h[], float y[], const int16_t pos_max ); + + +/*---------------------------------------------------------------------------------------* + * Function set_impulse() for TC * + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * + * Builds glottal codebook contribution based on glottal impulses positions finding. * + * * + * Returns a position of the glottal impulse center and * + * a number of the glottal impulse shape. * + * * + * |----| |----| xn * + * imp_pos-> || | imp_shape-> | g1 | | * + * | | | | g2 | exc |---| y1 ---- | * + * | | |--------------| |---------| h |-------|gain|-------(-)---> xn2 * + * | || | gn | |---| ---- * + * |----| |----| * + * codebook excitation h_orig gain * + * * + * * + * nominator dd * * + * Searching criterion: maximize ------------- = ---- = ----------------- * + * denominator rr * + * * + * Notice: gain = gain_trans * gain_pit (computed in trans_enc() function) * + * * + *---------------------------------------------------------------------------------------*/ + +void set_impulse( + const float xn[], /* i : target signal */ + const float h_orig[], /* i : impulse response of weighted synthesis filter */ + float exc[], /* o : adaptive codebook excitation */ + float y1[], /* o : filtered adaptive codebook excitation */ + int16_t *imp_shape, /* o : adaptive codebook index */ + int16_t *imp_pos, /* o : position of the glottal impulse center index */ + float *gain_trans /* o : transition gain */ +) +{ + float rr[L_SUBFR]; /* criterion: nominator coeficients */ + float dd[L_SUBFR]; /* criterion: denominator coeficients */ + float gh[L_SUBFR]; /* convolution of 'g' and 'h' filters */ + float krit, krit_max; + int16_t i, j, m; + int16_t start1, start2, end1; + + + krit_max = -1.0e+12f; + + /* main loop */ + /* impulse */ + for ( m = 0; m < NUM_IMPULSE; m++ ) + { + /* set searching ranges */ + if ( *imp_pos < L_SUBFR - INPOL ) + { + end1 = *imp_pos + INPOL; + } + else + { + end1 = L_SUBFR; + } + if ( *imp_pos > INPOL ) + { + start1 = *imp_pos - INPOL; + } + else + { + start1 = 0; + } + if ( start1 > L_IMPULSE2 ) + { + start2 = start1; + } + else + { + start2 = L_IMPULSE2; + } + + /*-----------------------------------------------------* + * nominator & DEnominator, gh=conv(g,h) + *-----------------------------------------------------*/ + if ( start1 < L_IMPULSE2 ) + { + rr[start1] = 0; + dd[start1] = 0; + convolve_tc( &glottal_cdbk[m * L_IMPULSE + L_IMPULSE2 - start1], &h_orig[0], gh, (int16_t) ( L_IMPULSE - L_IMPULSE2 + start1 ), L_SUBFR ); + + /* nominator & Denominator row <0> */ + for ( i = 0; i < L_SUBFR; i++ ) + { + rr[start1] += gh[i] * gh[i]; + dd[start1] += gh[i] * xn[i]; + } + for ( i = start1 + 1; i < L_IMPULSE2; i++ ) + { + rr[i] = 0; + dd[i] = 0; + /* Denominator rows <1,L_IMPULSE2-1> */ + for ( j = L_SUBFR - 1; j > 0; j-- ) + { + gh[j] = gh[j - 1] + glottal_cdbk[m * L_IMPULSE + L_IMPULSE2 - i] * h_orig[j]; + rr[i] += gh[j] * gh[j]; + dd[i] += gh[j] * xn[j]; + } + gh[0] = glottal_cdbk[m * L_IMPULSE + L_IMPULSE2 - i] * h_orig[0]; + rr[i] += gh[0] * gh[0]; + dd[i] += gh[0] * xn[0]; + /* move rr and dd into rr[i] and dd[i] */ + } + /* complete convolution(excitation,h_orig) */ + for ( j = L_SUBFR - 1; j > 0; j-- ) + { + gh[j] = gh[j - 1] + glottal_cdbk[m * L_IMPULSE] * h_orig[j]; + } + } + else + { + convolve_tc( &glottal_cdbk[m * L_IMPULSE], &h_orig[0], gh, L_IMPULSE, L_SUBFR ); + } + if ( end1 >= start2 ) + { + /* Denominator row */ + rr[L_SUBFR - 1] = 0; + for ( j = 0; j <= L_IMPULSE2; j++ ) + { + rr[L_SUBFR - 1] += gh[j] * gh[j]; + } + /* move rr into rr[L_SUBFFR-1 */ + /* Denominator rows */ + for ( i = L_SUBFR - 2; i >= start2; i-- ) + { + rr[i] = rr[i + 1] + gh[L_SUBFR + L_IMPULSE2 - 1 - i] * gh[L_SUBFR + L_IMPULSE2 - 1 - i]; + } + + /* nominator rows */ + correlate_tc( xn, &dd[L_IMPULSE2], gh, (int16_t) ( start2 - L_IMPULSE2 ), L_SUBFR, (int16_t) ( end1 - L_IMPULSE2 ) ); + } + + /*------------------------------------------------------* + * maxim. criterion + *------------------------------------------------------*/ + for ( i = start1; i < end1; i++ ) + { + krit = (float) ( dd[i] * dd[i] ) / rr[i]; + if ( krit > krit_max ) + { + krit_max = krit; + *imp_pos = i; + *imp_shape = m; + } + } + } + + /*--------------------------------------------------------* + * Build the excitation using found codeword + *--------------------------------------------------------*/ + + set_f( exc, 0, L_SUBFR ); + set_f( y1, 0, L_SUBFR ); + for ( i = ( *imp_pos - L_IMPULSE2 ); i <= ( *imp_pos + L_IMPULSE2 ); i++ ) + { + if ( ( i >= 0 ) && ( i < L_SUBFR ) ) + { + exc[i] = glottal_cdbk[( *imp_shape ) * L_IMPULSE + i - ( *imp_pos ) + L_IMPULSE2]; + } + } + + /*------------------------------------------------------* + * Form filtered excitation, find gain_trans + *------------------------------------------------------*/ + + convolve_tc2( exc, h_orig, y1, *imp_pos ); + + /* Find the ACELP correlations and the pitch gain (for current subframe) */ + *gain_trans = dotp( xn, y1, L_SUBFR ) / ( dotp( y1, y1, L_SUBFR ) + 0.01f ); + + return; +} + +/*-------------------------------------------------------------------* + * convolve_tc: + * + * convolution for different vectors' lengths + *-------------------------------------------------------------------*/ +static void convolve_tc( + const float g[], /* i : input vector */ + const float h[], /* i : impulse response (or second input vector) */ + float y[], /* o : output vetor (result of convolution) */ + const int16_t L_1, /* i : vector h size */ + const int16_t L_2 /* i : vector g size */ +) +{ + float temp; + int16_t i, n; + + + for ( n = 0; n < L_2; n++ ) + { + temp = g[0] * h[n]; + for ( i = 1; i < ( ( n < L_1 ) ? ( n + 1 ) : L_1 ); i++ ) + { + temp += g[i] * h[n - i]; + } + y[n] = temp; + } + + return; +} + +/*-------------------------------------------------------------------* + * convolve_tc2: + * + * convolution for one vector with only L_IMPULSE nonzero coefficients + *-------------------------------------------------------------------*/ +static void convolve_tc2( + const float g[], /* i : input vector */ + const float h[], /* i : impulse response (or second input vector) */ + float y[], /* o : output vetor (result of convolution) */ + const int16_t pos_max /* o : artificial impulse position */ +) + +{ + float temp; + int16_t i, n; + int16_t i_start, i_end; + int16_t i_end2; + + + i_start = pos_max - L_IMPULSE2; + + if ( i_start < 0 ) + { + i_start = 0; + } + + i_end = pos_max + L_IMPULSE; + if ( i_end > L_SUBFR ) + { + i_end = L_SUBFR; + } + for ( n = i_start; n < L_SUBFR; n++ ) + { + temp = g[0] * h[n]; + i_end2 = ( ( n <= i_end ) ? ( n + 1 ) : i_end ); + for ( i = 1; i < i_end2; i++ ) + { + temp += g[i] * h[n - i]; + } + y[n] = temp; + } + + return; +} + +/*-------------------------------------------------------------------* + * correlate_tc: + * + * correlation for different vectors' lengths + *-------------------------------------------------------------------*/ + +static void correlate_tc( + const float *x, /* i : target signal */ + float *y, /* o : correlation between x[] and h[] */ + const float *h, /* i : impulse response (of weighted synthesis filter) */ + const int16_t start, /* i : index of iterest */ + const int16_t L_1, /* i : vector size */ + const int16_t L_2 /* i : index of interest */ +) +{ + int16_t i, j; + float s; + + + for ( i = start; i < L_2; i++ ) + { + s = 0.0f; + for ( j = i; j < L_1; j++ ) + { + s += x[j] * h[j - i]; + } + y[i] = s; + } + + return; +} diff --git a/lib_enc/setmodeindex.c b/lib_enc/setmodeindex.c new file mode 100644 index 0000000000000000000000000000000000000000..a1b8f9144f8564d48a94c51831686c5f140ce10c --- /dev/null +++ b/lib_enc/setmodeindex.c @@ -0,0 +1,82 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "prot.h" +#include "cnst.h" +#include "ivas_cnst.h" +#include "wmc_auto.h" + +/*--------------------------------------------------------------------------- + + function name: SetModeIndex + description: function for configuring the codec between frames - currently bitrate and bandwidth only + must not be called while a frame is encoded - hence mutexes must be used in MT environments + + format: BANDWIDTH*16 + BITRATE (mode index) + + ---------------------------------------------------------------------------*/ + +void SetModeIndex( + Encoder_State *st, /* i : Encoder state */ + const int32_t last_total_brate, /* i : last total bitrate */ + const int16_t last_element_mode, /* i : last IVAS element mode */ + const int16_t MCT_flag /* i : hMCT handle allocated (1) or not (0) */ +) +{ + int16_t ini_frame_loc = st->ini_frame; + + if ( st->element_mode == IVAS_CPE_MDCT && last_element_mode != IVAS_CPE_MDCT && st->idchan == 1 ) + { + st->ini_frame = 0; + } + + /* Reconfigure the core coder */ + if ( ( last_total_brate != st->total_brate ) || + ( st->last_bwidth != st->bwidth ) || + ( st->last_codec_mode == MODE1 && st->element_mode == EVS_MONO ) || + ( ( st->last_core != TCX_20_CORE && st->last_core != TCX_10_CORE ) && st->element_mode > EVS_MONO ) || + ( st->rf_mode_last != st->rf_mode ) || + ( st->element_mode > EVS_MONO && st->ini_frame == 0 ) ) + { + core_coder_mode_switch( st, last_total_brate, MCT_flag ); + } + + st->ini_frame = ini_frame_loc; + + return; +} diff --git a/lib_enc/sig_clas.c b/lib_enc/sig_clas.c new file mode 100644 index 0000000000000000000000000000000000000000..3e282c4bcd5a35af61a6dc526c66a66cfaa3d23a --- /dev/null +++ b/lib_enc/sig_clas.c @@ -0,0 +1,415 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "wmc_auto.h" + +/*---------------------------------------------------------------------* + * Local constants + *---------------------------------------------------------------------*/ + +#define K_COR_ENC 2.857f +#define C_COR_ENC -1.286f +#define K_EE_ENC 0.04167f +#define C_EE_ENC 0.0f +#define K_ZC_ENC -0.04f +#define C_ZC_ENC 2.4f +#define K_RELE_ENC 0.05f +#define C_RELE_ENC 0.45f +#define K_PC_ENC -0.07143f +#define C_PC_ENC 1.857f +#define K_SNR_ENC 0.1111f +#define C_SNR_ENC -0.3333f + +/*-------------------------------------------------------------------* + * signal_clas() + * + * Classification state machine for FEC + * Coder type modification + *-------------------------------------------------------------------*/ + +/*! r: classification for current frames */ +int16_t signal_clas( + Encoder_State *st, /* i/o: encoder state structure */ + const float *speech, /* i : pointer to speech signal for E computation */ + const float *ee, /* i : lf/hf E ration for 2 half-frames */ + const float relE, /* i : frame relative E to the long term average */ + const int16_t L_look, /* i : look-ahead */ + int16_t *clas_mod /* o : class flag for NOOP detection */ +) +{ + float mean_voi2, mean_ee2, tmp; + float een, corn, zcn, relEn, pcn, fmerit1; + int16_t i, clas, pc, zc; + + /*----------------------------------------------------------------* + * Calculate average voicing + * Calculate average spectral tilt + * Calculate zero-crossing rate + * Calculate pitch stability + *----------------------------------------------------------------*/ + + /* average voicing on second half-frame and look-ahead */ + mean_voi2 = 0.5f * ( st->voicing[1] + st->voicing[2] ); + + /* average spectral tilt in dB */ + tmp = ee[0] * ee[1]; + if ( tmp < 1.0f ) + { + tmp = 1.0f; + } + + mean_ee2 = 0.5f * 20.0f * (float) log10( tmp ); + + /* compute zero crossing rate */ + zc = 0; + for ( i = L_look; i < L_FRAME + L_look; i++ ) + { + if ( speech[i] <= 0.0f && speech[i - 1] > 0.0f ) + { + zc++; + } + } + + /* compute pitch stability */ + pc = (int16_t) ( abs( st->pitch[1] - st->pitch[0] ) + abs( st->pitch[2] - st->pitch[1] ) ); + st->tdm_pc = pc; + + /*-----------------------------------------------------------------* + * Transform parameters to the range <0:1> + * Compute the merit function + *-----------------------------------------------------------------*/ + + een = K_EE_ENC * mean_ee2 + C_EE_ENC; + if ( een > 1.0f ) + { + een = 1.0f; + } + else if ( een < 0.0f ) + { + een = 0.0f; + } + + corn = K_COR_ENC * mean_voi2 + C_COR_ENC; + if ( corn > 1.0f ) + { + corn = 1.0f; + } + else if ( corn < 0.0f ) + { + corn = 0.0f; + } + + zcn = K_ZC_ENC * zc + C_ZC_ENC; + if ( zcn > 1.0f ) + { + zcn = 1.0f; + } + else if ( zcn < 0.0f ) + { + zcn = 0.0f; + } + + relEn = K_RELE_ENC * relE + C_RELE_ENC; + if ( relEn > 1.0f ) + { + relEn = 1.0f; + } + else if ( relEn < 0.5f ) + { + relEn = 0.5f; + } + + pcn = K_PC_ENC * pc + C_PC_ENC; + if ( pcn > 1.0f ) + { + pcn = 1.0f; + } + else if ( pcn < 0.0f ) + { + pcn = 0.0f; + } + + fmerit1 = ( 1.0f / 6.0f ) * ( een + 2.0f * corn + zcn + relEn + pcn ); + + /*-----------------------------------------------------------------* + * FEC classification + *-----------------------------------------------------------------*/ + + st->fmerit_dt = st->prev_fmerit - fmerit1; + st->prev_fmerit = fmerit1; + + /* FEC classification */ + if ( st->localVAD == 0 || st->coder_type == UNVOICED || relE < -6.0f ) + { + clas = UNVOICED_CLAS; + *clas_mod = clas; + } + else + { + switch ( st->last_clas ) + { + case VOICED_CLAS: + case ONSET: + case VOICED_TRANSITION: + if ( fmerit1 < 0.49f ) + { + clas = UNVOICED_CLAS; + } + else if ( fmerit1 < 0.66f ) + { + clas = VOICED_TRANSITION; + } + else + { + clas = VOICED_CLAS; + } + + if ( fmerit1 < 0.45f ) + { + *clas_mod = UNVOICED_CLAS; + } + else if ( fmerit1 < 0.66f ) + { + *clas_mod = VOICED_TRANSITION; + } + else + { + *clas_mod = VOICED_CLAS; + } + break; + + case UNVOICED_CLAS: + case UNVOICED_TRANSITION: + if ( fmerit1 > 0.63f ) + { + clas = ONSET; + } + else if ( fmerit1 > 0.585f ) + { + clas = UNVOICED_TRANSITION; + } + else + { + clas = UNVOICED_CLAS; + } + *clas_mod = clas; + break; + + default: + clas = UNVOICED_CLAS; + *clas_mod = clas; + break; + } + } + + /*-----------------------------------------------------------------* + * Onset classification + *-----------------------------------------------------------------*/ + + /* tc_cnt == -1: frame after TC frame in continuous block of GC/VC frames */ + /* tc_cnt == 0: UC frame */ + /* tc_cnt == 1: onset/transition frame, coded by GC coder type */ + /* tc_cnt == 2: frame after onset/transition frame, coded by TC coder type */ + + if ( clas == UNVOICED_CLAS ) + { + st->tc_cnt = 0; + } + + if ( clas >= VOICED_TRANSITION && st->tc_cnt >= 0 ) + { + st->tc_cnt += 1; + } + + if ( st->tc_cnt > 2 ) + { + st->tc_cnt = -1; + } + + return clas; +} + + +/*-------------------------------------------------------------------* + * select_TC() + * + * Select TC coder type for appropriate frames which is in general VOICED_TRANSITION, + * VOICED_CLAS or ONSET frames following UNVOICED_CLAS frames + *-------------------------------------------------------------------*/ + +void select_TC( + const int16_t codec_mode, /* i : codec mode */ + const int16_t tc_cnt, /* i : TC frame counter */ + int16_t *coder_type, /* i/o: coder type */ + const int16_t localVAD /* i : VAD without hangover */ +) +{ + if ( codec_mode == MODE1 ) + { + /*---------------------------------------------------------------------* + * Select TC coder type for appropriate frames which is in general VOICED_TRANSITION, + * VOICED_CLAS or ONSET frames following UNVOICED_CLAS frames + *---------------------------------------------------------------------*/ + + if ( localVAD != 0 && tc_cnt >= 1 ) + { + if ( tc_cnt == 1 ) + { + /* onset/transition frame is always coded using GC coder type */ + *coder_type = GENERIC; + } + else + { + /* frame after onset/transition frame is coded by TC coder type */ + *coder_type = TRANSITION; + } + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * coder_type_modif() + * + * Coder type modification + *-------------------------------------------------------------------*/ + +void coder_type_modif( + Encoder_State *st, /* i/o: encoder state structure */ + const float relE /* i : frame relative E to the long term average */ +) +{ + int16_t unmod_coder_type, vbr_generic_ho; + + if ( st->Opt_SC_VBR ) + { + vbr_generic_ho = st->hSC_VBR->vbr_generic_ho; + } + else + { + vbr_generic_ho = -1; + } + + if ( st->codec_mode == MODE1 ) + { + /*---------------------------------------------------------------------* + * Coder type modification + * + * Prevent UC coder type in certain conditions + * Prevent VC coder type in certain conditions + * Select TC coder type in appropriate frames + *---------------------------------------------------------------------*/ + + /* At higher rates, use GC coding instead of UC coding to improve quality */ + if ( ( st->element_mode == EVS_MONO && st->total_brate > ACELP_9k60 && st->coder_type == UNVOICED ) || + ( st->element_mode > EVS_MONO && st->total_brate > MAX_UNVOICED_BRATE && st->coder_type == UNVOICED ) ) + { + st->coder_type = GENERIC; + } + + /* Prevent UC coding on mixed content at 9.6 kb/s */ + if ( st->total_brate >= ACELP_9k60 && st->coder_type == UNVOICED && st->audio_frame_cnt != 0 ) + { + st->coder_type = GENERIC; + } + + unmod_coder_type = st->coder_type; + + /* Enforce GC coder type on inactive signal (this can be later overwritten to INACTIVE) */ + if ( st->localVAD == 0 && ( ( st->coder_type == UNVOICED && ( !st->Opt_SC_VBR || + ( st->Opt_SC_VBR && vbr_generic_ho == 0 && st->last_coder_type > UNVOICED ) ) ) || + st->coder_type == TRANSITION || st->coder_type == VOICED ) ) + { + st->coder_type = GENERIC; + } + + + if ( st->Opt_SC_VBR ) + { + if ( st->coder_type == GENERIC && unmod_coder_type == UNVOICED && st->Opt_SC_VBR ) + { + st->hSC_VBR->vbr_generic_ho = 1; + } + + if ( st->coder_type > UNVOICED && st->Opt_SC_VBR ) + { + st->hSC_VBR->vbr_generic_ho = 0; + } + + if ( st->localVAD == 0 && st->coder_type == UNVOICED ) + { + st->hSC_VBR->last_7k2_coder_type = GENERIC; + } + else + { + st->hSC_VBR->last_7k2_coder_type = st->coder_type; + } + } + + if ( st->element_mode == EVS_MONO ) + { + /* At higher rates and with 16kHz core, allow only GC and TC coder type */ + if ( st->total_brate > ACELP_16k40 && st->coder_type != GENERIC && st->coder_type != TRANSITION ) + { + st->coder_type = GENERIC; + } + } + else + { + /* At higher bitrates, disable UC and VC coder type; note that IC coder type is classified later */ + if ( ( st->total_brate > MAX_VOICED_BRATE && st->coder_type == VOICED ) || + ( st->total_brate > MAX_UNVOICED_BRATE && st->coder_type == UNVOICED ) ) + { + st->coder_type = GENERIC; + } + } + + /* Patch for certain low-level signals for which the gain quantizer sometimes goes out of its dynamic range */ + if ( st->coder_type == VOICED && st->input_bwidth == NB && relE < -10.0f && st->total_brate <= ACELP_8k00 ) + { + st->coder_type = GENERIC; + } + } + + return; +} diff --git a/lib_enc/spec_center.c b/lib_enc/spec_center.c new file mode 100644 index 0000000000000000000000000000000000000000..73835a15117876c83542e86b9c1327ed57edfdf3 --- /dev/null +++ b/lib_enc/spec_center.c @@ -0,0 +1,94 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "prot.h" +#include "rom_enc.h" +#include "cnst.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * spec_center() + * + * + *-------------------------------------------------------------------*/ + +void spec_center( + float spec_power[], /* i : energy of sub-band divided uniformly */ + float sp_center[], /* o : spectral centroid */ + const int16_t bw_index /* i : bandwidth */ +) +{ + int16_t i; + float t_sp_center, frame_power; + int16_t sp_center_band_num = SP_CENTER_BAND_NUM_TAB[bw_index]; + float sp_center_mem; + + t_sp_center = 0; + frame_power = 0; + + for ( i = 1; i < sp_center_band_num; i++ ) + { + t_sp_center += spec_power[i] * ( i ); + frame_power += spec_power[i]; + } + sp_center[3] = (float) ( ( t_sp_center + VAD_DELTA1[bw_index] ) / ( frame_power + VAD_DELTA2[bw_index] ) ); + + sp_center_mem = 0; + frame_power = 0; + + for ( i = 0; i < 10; i++ ) + { + sp_center_mem += spec_power[i] * ( i + 1 ); + frame_power += spec_power[i]; + } + + /* 107374184.f = 32768.f * 32768.f * 0.1 */ + t_sp_center = (float) ( ( sp_center_mem + 107374184.f ) / ( frame_power + 107374184.f ) ); + + sp_center[0] = 0.7f * sp_center[0] + 0.3f * t_sp_center; + sp_center[2] = t_sp_center; + + if ( bw_index == CLDFBVAD_NB_ID ) + { + t_sp_center = (float) ( ( sp_center_mem ) / ( frame_power + FLT_MIN ) ); + sp_center[0] = 0.7f * sp_center[0] + 0.3f * t_sp_center; + sp_center[2] = t_sp_center; + } + + return; +} diff --git a/lib_enc/spec_flatness.c b/lib_enc/spec_flatness.c new file mode 100644 index 0000000000000000000000000000000000000000..0473cc6b983950b3b8f880c205fda63f1bfa36f0 --- /dev/null +++ b/lib_enc/spec_flatness.c @@ -0,0 +1,131 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include "options.h" +#include +#include "prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * spec_flatness() + * + * + *-------------------------------------------------------------------*/ + +void spec_flatness( + float spec_amp[], /* i : spectral amplitude */ + float smooth_spec_amp[], /* i : smoothed spectral amplitude */ + float sSFM[] /* o : spectral flatness rate */ +) +{ + int16_t i; + double prods, sums; + float SFM; + + for ( i = MIN_AMP_ID; i <= MAX_AMP_ID; i++ ) + { + smooth_spec_amp[i - MIN_AMP_ID] = smooth_spec_amp[i - MIN_AMP_ID] * 0.7f + spec_amp[i] * 0.3f; + } + + /* sSFM1 */ + prods = 1; + sums = 0; + assert( MIN_AMP_ID <= 5 ); + for ( i = ( 5 - MIN_AMP_ID ); i < ( 20 - MIN_AMP_ID ); i++ ) + { + prods = smooth_spec_amp[i] * prods; + sums = sums + smooth_spec_amp[i]; + } + + if ( prods > 0 ) + { + prods = pow( prods, 1.0 / 15 ); + } + else + { + prods = 0; + } + sums = sums / 15; + + SFM = (float) ( ( prods + 3276.8f ) / ( sums + 3276.8f ) ); + sSFM[0] = 0.85f * sSFM[0] + 0.15f * SFM; + + /* sSFM2 */ + prods = 1; + sums = 0; + for ( i = ( 20 - MIN_AMP_ID ); i < ( 40 - MIN_AMP_ID ); i++ ) + { + prods = smooth_spec_amp[i] * prods; + sums = sums + smooth_spec_amp[i]; + } + + if ( prods > 0 ) + { + prods = pow( prods, 1.0 / 20 ); + } + else + { + prods = 0; + } + sums = sums / 20; + SFM = (float) ( ( prods + 3276.8f ) / ( sums + 3276.8f ) ); + sSFM[1] = 0.85f * sSFM[1] + 0.15f * SFM; + /* sSFM3 */ + prods = 1; + sums = 0; + for ( i = ( 40 - MIN_AMP_ID ); i <= ( MAX_AMP_ID - MIN_AMP_ID ); i++ ) + { + prods = smooth_spec_amp[i] * prods; + sums = sums + smooth_spec_amp[i]; + } + + if ( prods > 0 ) + { + prods = pow( prods, 0.04 ); + } + else + { + prods = 0; + } + sums = sums / 25; + SFM = (float) ( ( prods + 3276.8f ) / ( sums + 3276.8f ) ); + sSFM[2] = 0.85f * sSFM[2] + 0.15f * SFM; + + + return; +} diff --git a/lib_enc/speech_music_classif.c b/lib_enc/speech_music_classif.c new file mode 100644 index 0000000000000000000000000000000000000000..5b50391c0e0a2fdcae4475c14afcc33fe1179169 --- /dev/null +++ b/lib_enc/speech_music_classif.c @@ -0,0 +1,3055 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "ivas_prot.h" +#include "rom_enc.h" +#include "rom_com.h" /* Common static table prototypes */ +#include "wmc_auto.h" + + +/*---------------------------------------------------------------------* + * Local constants + *---------------------------------------------------------------------*/ + +#define ATT_SEG_LEN ( L_FRAME / ATT_NSEG ) +#define ATT_3LSUB_POS ( 3 * ATT_NSEG / NB_SUBFR ) +#define ATT_3LSUB_POS_16k ( int16_t )( ( 4.0f * ATT_NSEG / (float) NB_SUBFR16k ) + 0.5f ) + +#define THR_CORR_PEAK 0.95f +#define TON_FACT 0.95f +#define TON_ALPHA 0.95f + +#define DLP_BIAS 0.138121f + +#define THR_MASS_MAX 0.85f +#define THR_MASS_MIN 0.75f +#define THR_MASS_STEP_UP 0.01f +#define THR_MASS_STEP_DN 0.02f + + +/*---------------------------------------------------------------------* + * Local function prototypes + *---------------------------------------------------------------------*/ + +static void spec_analysis( float *Bin_E, float *p2v_map ); + +static void flux( float *Bin_E, float *p2v_map, float *old_Bin_E, float *buf_flux, int16_t attack_hangover, float dec_mov ); + +static void tonal_dist( float *p2v_map, float *buf_pkh, float *buf_Ntonal, float *buf_Ntonal2, float *buf_Ntonal_lf ); + +static int16_t mode_decision( Encoder_State *st, int16_t len, float *dec_mov, float *buf_flux, float *buf_epsP_tilt, float *buf_pkh, float *buf_cor_map_sum, float *buf_Ntonal, float *buf_Ntonal2, float *buf_Ntonal_lf, float *buf_dlp ); + +static void var_cor_calc( const float old_corr, float *mold_corr, float var_cor_t[], int16_t *high_stable_cor ); + +static int16_t attack_det( const float *inp, const int16_t last_clas, const int16_t localVAD, const int16_t coder_type, const int32_t total_brate, const int16_t element_mode, const int16_t clas, float finc_prev[], float *lt_finc, int16_t *last_strong_attack ); + +static float tonal_det( const float S[], int16_t vad_flag, float tod_S_map_lt[], float *tod_thr_lt, float *tod_weight, float *tod_S_mass_prev, float *tod_S_mass_lt ); + +static void tonal_context_improv( Encoder_State *st, const float PS[], const float voi_fv, const float cor_map_sum_fv, const float LPCErr ); + +static void order_spectrum( float *vec, const int16_t len ); + +static void detect_sparseness( Encoder_State *st, const int16_t localVAD_HE_SAD, const float voi_fv ); + +static int16_t sp_mus_classif_1st( Encoder_State *st, const int16_t localVAD_HE_SAD, const float lsp_new[M], const float cor_map_sum, const float epsP[M + 1], const float PS[], float non_sta, float relE, float *voi_fv, float *cor_map_sum_fv, float *LPCErr, int16_t *high_lpn_flag ); + +static void sp_mus_classif_2nd( Encoder_State *st, const float Etot, int16_t *attack_flag, const float *inp ); + +static void music_mixed_classif_improv( Encoder_State *st, const float *new_inp, const float *epsP, const float etot, const float old_cor, const float cor_map_sum ); + + +/*---------------------------------------------------------------------* + * speech_music_clas_init() + * + * Initialization of speech/music classifier + *---------------------------------------------------------------------*/ + +void speech_music_clas_init( + SP_MUS_CLAS_HANDLE hSpMusClas /* i/o: speech/music classifier handle */ +) +{ + int16_t i; + + set_f( hSpMusClas->FV_st, 0.0f, N_SMC_FEATURES ); + + hSpMusClas->inact_cnt = 0; + set_s( hSpMusClas->past_dec, 0, HANG_LEN - 1 ); + set_f( hSpMusClas->past_dlp, 0, HANG_LEN - 1 ); + set_f( hSpMusClas->past_dlp_mean_ST, 0, HANG_LEN - 1 ); + hSpMusClas->dlp_mean_ST = 0.0f; + hSpMusClas->dlp_mean_LT = 0.0f; + hSpMusClas->dlp_var_LT = 0.0f; + + for ( i = 0; i < N_SMC_FEATURES; i++ ) + { + hSpMusClas->prev_FV[i] = 0.5f * hout_intervals[2 * i] + 0.5f * hout_intervals[2 * i + 1]; + } + + for ( i = 0; i < NB_BANDS_SPMUS; i++ ) + { + hSpMusClas->past_log_enr[i] = logf( E_MIN ); + } + + hSpMusClas->sp_mus_state = -8; + hSpMusClas->wdrop = 0.0f; + hSpMusClas->wrise = 0.0f; + hSpMusClas->wdlp_0_95_sp = 0.0f; + hSpMusClas->wdlp_xtalk = 0.0f; + set_f( hSpMusClas->last_lsp, 0.0f, M_LSP_SPMUS ); + hSpMusClas->last_cor_map_sum = 0.0f; + hSpMusClas->last_non_sta = 0.0f; + set_f( hSpMusClas->past_PS, 0.0f, HIGHEST_FBIN - LOWEST_FBIN ); + hSpMusClas->past_ps_diff = 0; + hSpMusClas->past_epsP2 = 01; + hSpMusClas->past_epsP = 0; + hSpMusClas->flag_spitch_cnt = 0; + + hSpMusClas->gsc_thres[0] = TH_0_MIN; + hSpMusClas->gsc_thres[1] = TH_1_MIN; + hSpMusClas->gsc_thres[2] = TH_2_MIN; + hSpMusClas->gsc_thres[3] = TH_3_MIN; + set_f( hSpMusClas->gsc_lt_diff_etot, 0.0f, MAX_LT ); + hSpMusClas->gsc_mem_etot = 0.0f; + hSpMusClas->gsc_last_music_flag = 0; + hSpMusClas->gsc_nb_thr_1 = 0; + hSpMusClas->gsc_nb_thr_3 = 0; + hSpMusClas->mold_corr = 0.9f; + hSpMusClas->mean_avr_dyn = 0.5f; + hSpMusClas->last_sw_dyn = 10.0f; + + hSpMusClas->relE_attack_cnt = 0; + hSpMusClas->prev_relE = 0.0f; + hSpMusClas->prev_Etot = 0.0f; + hSpMusClas->prev_vad = 0; + hSpMusClas->vad_0_1_cnt = 0; + hSpMusClas->relE_attack_sum = 0; + + /* speech/music classifier improvement */ + for ( i = 0; i < BUF_LEN; i++ ) + { + hSpMusClas->buf_flux[i] = -100; + hSpMusClas->buf_pkh[i] = 0; + hSpMusClas->buf_epsP_tilt[i] = 0; + hSpMusClas->buf_cor_map_sum[i] = 0; + hSpMusClas->buf_Ntonal[i] = 0; + hSpMusClas->buf_Ntonal2[i] = 0; + hSpMusClas->buf_Ntonal_lf[i] = 0; + } + + set_f( hSpMusClas->lpe_buf, 0, HANG_LEN_INIT ); + set_f( hSpMusClas->voicing_buf, 0, HANG_LEN_INIT ); + hSpMusClas->gsc_hangover = 0; + set_f( hSpMusClas->sparse_buf, 0, HANG_LEN_INIT ); + set_f( hSpMusClas->hf_spar_buf, 0, HANG_LEN_INIT ); + hSpMusClas->LT_sparse = 0.0f; + hSpMusClas->gsc_cnt = 0; + hSpMusClas->last_vad_spa = 0; + + set_f( hSpMusClas->old_Bin_E, 0.0f, 3 * N_OLD_BIN_E ); + set_f( hSpMusClas->buf_etot, 0, 4 ); + set_f( hSpMusClas->buf_dlp, 0, 10 ); + + hSpMusClas->UV_cnt1 = 300; + hSpMusClas->LT_UV_cnt1 = 250.0f; + hSpMusClas->onset_cnt = 0; + hSpMusClas->attack_hangover = 0; + hSpMusClas->dec_mov = 0.0f; + hSpMusClas->dec_mov1 = 0.0f; + hSpMusClas->mov_log_max_spl = 200.0f; + hSpMusClas->old_lt_diff[0] = 0.0f; + hSpMusClas->old_lt_diff[1] = 0.0f; + + set_f( hSpMusClas->finc_prev, 0.0f, ATT_NSEG ); + hSpMusClas->lt_finc = 0.0f; + hSpMusClas->last_strong_attack = 0; + hSpMusClas->tdm_lt_Etot = 0.01f; + set_f( hSpMusClas->tod_lt_Bin_E, 0.0f, TOD_NSPEC ); + set_f( hSpMusClas->tod_S_map_lt, 0.0f, TOD_NSPEC ); + hSpMusClas->tod_thr_lt = TOD_THR_MASS; + hSpMusClas->tod_weight = 0.0f; + hSpMusClas->tod_S_mass_prev = 0.0f; + hSpMusClas->tod_S_mass_lt = 0.0f; + + /* speech/music classification */ + set_s( hSpMusClas->lt_old_mode, 1, 3 ); + hSpMusClas->lt_voicing = 0.5f; + hSpMusClas->lt_corr = 0.5f; + hSpMusClas->lt_tonality = 0; + set_s( hSpMusClas->lt_corr_pitch, 0, 3 ); + hSpMusClas->lt_hangover = 0; + hSpMusClas->lowrate_pitchGain = 0; + + hSpMusClas->lt_music_hangover = 0; + set_f( hSpMusClas->tonality2_buf, 0, HANG_LEN_INIT ); + set_f( hSpMusClas->tonality3_buf, 0, HANG_LEN_INIT ); + set_f( hSpMusClas->LPCErr_buf, 0, HANG_LEN_INIT ); + hSpMusClas->lt_music_state = 0; + hSpMusClas->lt_speech_state = 0; + hSpMusClas->lt_speech_hangover = 0; + + hSpMusClas->lt_dec_thres = 10.0f; + hSpMusClas->ener_RAT = 0.0f; + + hSpMusClas->high_stable_cor = 0; + set_f( hSpMusClas->var_cor_t, 0.0f, VAR_COR_LEN ); + + hSpMusClas->lps = 0.0f; + hSpMusClas->lpm = 0.0f; + hSpMusClas->lpn = 0.0f; + + return; +} + + +/*---------------------------------------------------------------------* + * speech_music_classif() + * + * Speech/music classification + * + * The following technologies are used based on the outcome of the sp/mus classifier + * sp_aud_decision1 sp_aud_decision2 + * 0 0 use ACELP (+TD BWE) + * 1 0 use ACELP (+FD BWE) or HQ/LR-MDCT depending on bitrate + * 1 1 use GSC (+FD BWE) or HQ/LR-MDCT depending on bitrate + * + * 0 1 exceptionally use GSC (+FD BWE) instead of LR-MDCT at 13.2 kbps (WB/SWB) for sparse spectra + *---------------------------------------------------------------------*/ + +/*! r: 1st stage decision (1-music, 0-speech or noise) */ +void speech_music_classif( + Encoder_State *st, /* i/o: state structure */ + const float *new_inp, /* i : new input signal */ + const float *inp, /* i : input signal to locate attach position */ + const int16_t localVAD_HE_SAD, /* i : HE-SAD flag without hangover */ + const float lsp_new[M], /* i : LSPs in current frame */ + const float cor_map_sum, /* i : correlation map sum (from multi-harmonic anal.) */ + const float epsP[M + 1], /* i : LP prediciton error */ + const float PS[], /* i : energy spectrum */ + const float Etot, /* i : total frame energy */ + const float old_cor, /* i : max correlation from previous frame */ + int16_t *attack_flag, /* o : attack flag (GSC or TC) */ + const float non_sta, /* i : unbound non-stationarity for sp/mus classifier */ + const float relE, /* i : relative frame energy */ + int16_t *high_lpn_flag, /* o : sp/mus LPN flag */ + const int16_t flag_spitch /* i : flag to indicate very short stable pitch */ +) +{ + float voi_fv, cor_map_sum_fv, LPCErr; + + /* 1st stage speech/music classification based on the GMM model */ + st->sp_aud_decision1 = sp_mus_classif_1st( st, localVAD_HE_SAD, lsp_new, cor_map_sum, epsP, PS, non_sta, relE, &voi_fv, &cor_map_sum_fv, &LPCErr, high_lpn_flag ); + + if ( st->codec_mode == MODE1 || st->sr_core == INT_FS_12k8 ) + { + + /* Improvement of the 1st stage decision for mixed/music content */ + if ( !st->Opt_SC_VBR && ( st->total_brate != ACELP_24k40 ) ) + { + music_mixed_classif_improv( st, new_inp, epsP, Etot, old_cor, cor_map_sum ); + } + + st->sp_aud_decision0 = st->sp_aud_decision1; + + /* 2nd stage speech/music classification (rewrite music to speech in onsets) */ + st->sp_aud_decision2 = st->sp_aud_decision1; + + if ( st->bwidth > NB ) + { + sp_mus_classif_2nd( st, Etot, attack_flag, inp ); + + if ( flag_spitch && st->bwidth == WB && st->total_brate < ACELP_13k20 ) + { + /* avoid switch to AUDIO/MUSIC class for very short stable high pitch + and/or stable pitch with high correlation at low bitrates*/ + st->sp_aud_decision2 = 0; + } + } + + /* Context-based improvement of 1st and 2nd stage decision on stable tonal signals */ + if ( !st->Opt_SC_VBR && st->total_brate != ACELP_24k40 ) + { + tonal_context_improv( st, PS, voi_fv, cor_map_sum_fv, LPCErr ); + } + + /* Avoid using LR-MDCT on sparse spectra, use GSC instead at 13.2 kbps (WB/SWB) */ + if ( !st->Opt_SC_VBR && st->total_brate == ACELP_13k20 && st->vad_flag == 1 && ( st->bwidth == WB || st->bwidth == SWB ) ) + { + detect_sparseness( st, localVAD_HE_SAD, voi_fv ); + } + + /* override speech/music classification to ACELP when background noise level reaches certain level */ + /* this is a patch against mis-classifications during active noisy speech segments */ + if ( st->lp_noise > 12.0f ) + { + st->sp_aud_decision1 = 0; + st->sp_aud_decision2 = 0; + } + + /* set GSC noisy speech flag on unvoiced SWB segments */ + st->GSC_noisy_speech = 0; + if ( st->vad_flag == 1 && st->total_brate >= ACELP_13k20 && st->total_brate < ACELP_24k40 && + st->lp_noise > 12.0f && st->sp_aud_decision1 == 0 && st->bwidth >= SWB && + st->coder_type_raw == UNVOICED ) + { + st->GSC_noisy_speech = 1; + } + + /* Select AUDIO frames */ + if ( st->codec_mode == MODE1 && ( st->sp_aud_decision2 || st->GSC_noisy_speech ) ) + { + st->coder_type = AUDIO; + st->hGSCEnc->noise_lev = NOISE_LEVEL_SP0; + } + } + else + { + st->sp_aud_decision0 = st->sp_aud_decision1; + } + + + return; +} + + +/*---------------------------------------------------------------------* + * sp_mus_classif_1st() + * + * 1st stage speech/music classification (based on the GMM model) + *---------------------------------------------------------------------*/ + +/*! r: decision flag (1-music, 0-speech or noise) */ +static int16_t sp_mus_classif_1st( + Encoder_State *st, /* i/o: state structure */ + const int16_t localVAD_HE_SAD, /* i : local VAD HE flag */ + const float lsp_new[M], /* i : LSPs in current frame */ + const float cor_map_sum, /* i : correlation map sum (from multi-harmonic anal.) */ + const float epsP[M + 1], /* i : LP prediciton error */ + const float PS[], /* i : energy spectrum */ + float non_sta, /* i : unbound non-stationarity */ + float relE, /* i : relative frame energy */ + float *voi_fv, /* o : scaled voicing feature */ + float *cor_map_sum_fv, /* o : scaled correlation map feature */ + float *LPCErr, /* o : scaled LP prediction error feature */ + int16_t *high_lpn_flag /* o : sp/mus LPN flag */ +) +{ + int16_t i, k, p, dec, vad; + float dlp, ftmp, lepsP1, sum_PS, ps_diff, ps_sta, wrelE, wdrop, wght, mx; + float FV[N_FEATURES], *pFV = FV, PS_norm[128], dPS[128], lsp[M]; + float pys, pym, xm[N_FEATURES], py, lps = 0, lpm = 0; + const float *pSF; + float pyn, lpn = 0; + + SP_MUS_CLAS_HANDLE hSpMusClas = st->hSpMusClas; + + /*------------------------------------------------------------------* + * Initialization + *------------------------------------------------------------------*/ + + vad = localVAD_HE_SAD; + + /*------------------------------------------------------------------* + * Preparation of the feature vector + *------------------------------------------------------------------*/ + + /* [0] OL pitch */ + if ( st->tc_cnt == 1 || st->tc_cnt == 2 ) + { + *pFV++ = (float) st->pitch[2]; + } + else + { + *pFV++ = (float) ( st->pitch[0] + st->pitch[1] + st->pitch[2] ) / 3.0f; + } + + /* [1] voicing */ + if ( st->tc_cnt == 1 || st->tc_cnt == 2 ) + { + *pFV++ = st->voicing[2]; + } + else + { + *pFV++ = (float) ( st->voicing[0] + st->voicing[1] + st->voicing[2] ) / 3.0f; + } + + /* [2,3,4,5,6] LSFs */ + mvr2r( lsp_new, lsp, M ); + + ftmp = (float) acos( lsp[1] ); + *pFV++ = ftmp + hSpMusClas->last_lsp[1]; + hSpMusClas->last_lsp[1] = ftmp; + + ftmp = (float) acos( lsp[2] ); + *pFV++ = ftmp + hSpMusClas->last_lsp[2]; + hSpMusClas->last_lsp[2] = ftmp; + + ftmp = (float) acos( lsp[3] ); + *pFV++ = ftmp + hSpMusClas->last_lsp[3]; + hSpMusClas->last_lsp[3] = ftmp; + + ftmp = (float) acos( lsp[4] ); + *pFV++ = ftmp + hSpMusClas->last_lsp[4]; + hSpMusClas->last_lsp[4] = ftmp; + + ftmp = (float) acos( lsp[5] ); + *pFV++ = ftmp + hSpMusClas->last_lsp[5]; + hSpMusClas->last_lsp[5] = ftmp; + + /* [7] cor_map_sum */ + *pFV++ = cor_map_sum + hSpMusClas->last_cor_map_sum; + hSpMusClas->last_cor_map_sum = cor_map_sum; + + /* [8] non_sta */ + *pFV++ = non_sta + hSpMusClas->last_non_sta; + hSpMusClas->last_non_sta = non_sta; + + /* [9] epsP */ + if ( st->bwidth == NB ) + { + /* do not take into account (statistics are too different) */ + *pFV++ = -1.647f; + } + else + { + lepsP1 = logf( epsP[1] + 1e-5f ); + ftmp = logf( epsP[13] ) - lepsP1; + *pFV++ = ftmp + hSpMusClas->past_epsP2; + hSpMusClas->past_epsP2 = ftmp; + } + + /* calculation of differential normalized power spectrum */ + sum_PS = 1e-5f; + for ( i = LOWEST_FBIN; i < HIGHEST_FBIN; i++ ) + { + sum_PS += PS[i]; + } + + for ( i = LOWEST_FBIN; i < HIGHEST_FBIN; i++ ) + { + PS_norm[i] = PS[i] / sum_PS; + dPS[i] = fabsf( PS_norm[i] - hSpMusClas->past_PS[i - LOWEST_FBIN] ); + } + + /* [10] ps_diff (spectral difference) */ + ps_diff = 0; + for ( i = LOWEST_FBIN; i < HIGHEST_FBIN; i++ ) + { + ps_diff += dPS[i]; + } + + ps_diff = logf( ps_diff + 1e-5f ); + *pFV++ = ps_diff + hSpMusClas->past_ps_diff; + hSpMusClas->past_ps_diff = ps_diff; + + /* [11] ps_sta (spectral stationarity) */ + ps_sta = 0; + for ( i = LOWEST_FBIN; i < HIGHEST_FBIN; i++ ) + { + mx = PS_norm[i] > hSpMusClas->past_PS[i - LOWEST_FBIN] ? PS_norm[i] : hSpMusClas->past_PS[i - LOWEST_FBIN]; + ps_sta += mx / ( dPS[i] + 1e-5f ); + } + + *pFV++ = logf( ps_sta + 1e-5f ); + mvr2r( &PS_norm[LOWEST_FBIN], hSpMusClas->past_PS, HIGHEST_FBIN - LOWEST_FBIN ); + + /*------------------------------------------------------------------* + * Scaling of the feature vector + *------------------------------------------------------------------*/ + + pFV = FV; + if ( st->bwidth == NB ) + { + pSF = SF_8k; + } + else + { + pSF = SF; + } + + for ( i = 0; i < N_FEATURES; i++, pFV++, pSF += 2 ) + { + *pFV = pSF[0] * *pFV + pSF[1]; + } + + /* store some scaled parameters for later correction of the 1st stage speech/music classification */ + *voi_fv = FV[1]; + *cor_map_sum_fv = FV[7]; + *LPCErr = FV[9]; + + /*------------------------------------------------------------------* + * Calculation of posterior probability + * Log-probability + *------------------------------------------------------------------*/ + + pys = pym = pyn = 1e-5f; + + /* run loop for all mixtures (for each mixture, calculate the probability of speech or noise and the probability of music) */ + for ( k = 0; k < N_MIXTURES; k++ ) + { + /* active frames - calculate the probability of speech */ + for ( p = 0; p < N_FEATURES; p++ ) + { + xm[p] = FV[p] - m_speech[k * N_FEATURES + p]; + } + + py = lvm_speech[k] + dot_product_mat( xm, &invV_speech[k * N_FEATURES * N_FEATURES], N_FEATURES ); + pys += expf( py ); + /* inactive frames - calculate the probability of noise */ + for ( p = 0; p < N_FEATURES; p++ ) + { + xm[p] = FV[p] - m_noise[k * N_FEATURES + p]; + } + + py = lvm_noise[k] + dot_product_mat( xm, &invV_noise[k * N_FEATURES * N_FEATURES], N_FEATURES ); + pyn += expf( py ); + + /* either active or inactive frames - calculate the probability of music */ + for ( p = 0; p < N_FEATURES; p++ ) + { + xm[p] = FV[p] - m_music[k * N_FEATURES + p]; + } + + py = lvm_music[k] + dot_product_mat( xm, &invV_music[k * N_FEATURES * N_FEATURES], N_FEATURES ); + pym += expf( py ); + } + + /* calculate log-probability */ + lps = logf( pys ) - 0.5f * N_FEATURES * logf( PI2 ); + lpm = logf( pym ) - 0.5f * N_FEATURES * logf( PI2 ); + lpn = logf( pyn ) - 0.5f * N_FEATURES * logf( PI2 ); + + *high_lpn_flag = 0; + if ( lpn > lps && lpn > lpm ) + { + *high_lpn_flag = 1; + } + + if ( !vad ) + { + /* artificially increase log-probability of noise */ + lps = lpn * 1.2f; + } + + hSpMusClas->lpm = lpm; + hSpMusClas->lps = lps; + + /* determine HQ Generic speech class */ + if ( st->hHQ_core != NULL ) + { + if ( lps > lpm + 0.5f ) + { + st->hHQ_core->hq_generic_speech_class = 1; + } + else + { + st->hHQ_core->hq_generic_speech_class = 0; + } + } + + /*------------------------------------------------------------------* + * State machine (sp_mus_state < 0 .. inactive, > 0 .. entry, = 0 .. active ) + *------------------------------------------------------------------*/ + + if ( vad ) + { + if ( relE < -20 || ( lps <= -5 && lpm <= -5 ) ) + { + if ( hSpMusClas->sp_mus_state > 0 ) + { + if ( hSpMusClas->sp_mus_state < HANG_LEN ) + { + /* energy is too low but we are in entry period -> reset the inactive counter to allow new entry later */ + hSpMusClas->inact_cnt = 0; + } + + /* energy is too low -> we are going to instable state */ + hSpMusClas->sp_mus_state = 0; + } + else if ( hSpMusClas->sp_mus_state > -HANG_LEN ) + { + /* energy is still too low -> we are still in instable state */ + hSpMusClas->sp_mus_state--; + } + } + else if ( hSpMusClas->sp_mus_state <= 0 ) + { + if ( hSpMusClas->inact_cnt == 0 ) + { + + hSpMusClas->sp_mus_state = 1; + } + else + { + + hSpMusClas->sp_mus_state = HANG_LEN; + } + + hSpMusClas->inact_cnt = 12; + } + else if ( hSpMusClas->sp_mus_state > 0 && hSpMusClas->sp_mus_state < HANG_LEN ) + { + /* we are inside an entry period -> increment the counter of entry frames */ + hSpMusClas->sp_mus_state++; + } + + if ( hSpMusClas->sp_mus_state < 0 && hSpMusClas->inact_cnt > 0 ) + { + hSpMusClas->inact_cnt--; + } + } + else + { + if ( hSpMusClas->sp_mus_state > 0 && hSpMusClas->sp_mus_state < HANG_LEN ) + { + hSpMusClas->inact_cnt = 0; + } + else if ( hSpMusClas->inact_cnt > 0 ) + { + hSpMusClas->inact_cnt--; + } + + if ( hSpMusClas->sp_mus_state > 0 && hSpMusClas->sp_mus_state < HANG_LEN ) + { + hSpMusClas->sp_mus_state = -HANG_LEN; + } + else if ( hSpMusClas->sp_mus_state > 0 ) + { + hSpMusClas->sp_mus_state = -1; + } + else if ( hSpMusClas->sp_mus_state > -HANG_LEN ) + { + /* we are in inactive state */ + hSpMusClas->sp_mus_state--; + } + } + + /*------------------------------------------------------------------* + * Decision without hangover + * Weighted decision + *------------------------------------------------------------------*/ + + /* decision without hangover (0 - speech/noise, 1 - music) */ + dec = lpm > lps; + dlp = lpm - lps; + + if ( !vad ) + { + dec = 0; + dlp = 0; + } + + /* calculate weight based on relE (close to 0.01 in low-E regions, close to 1 in high-E regions) */ + wrelE = 1.0f + relE / 15; + + if ( wrelE > 1.0f ) + { + wrelE = 1.0f; + } + else if ( wrelE < 0.01f ) + { + wrelE = 0.01f; + } + + /* calculate weight based on drops of dlp (close to 1 during sudden drops of dlp, close to 0 otherwise) */ + if ( dlp < 0 && dlp < hSpMusClas->past_dlp[0] ) + { + if ( hSpMusClas->past_dlp[0] > 0 ) + { + hSpMusClas->wdrop = -dlp; + } + else + { + hSpMusClas->wdrop += hSpMusClas->past_dlp[0] - dlp; + } + } + else + { + hSpMusClas->wdrop = 0; + } + + wdrop = hSpMusClas->wdrop / 20; + + if ( wdrop > 1.0f ) + { + wdrop = 1.0f; + } + else if ( wdrop < 0.1f ) + { + wdrop = 0.1f; + } + + /* combine weights into one */ + wght = wrelE * wdrop; + if ( wght < 0.01f ) + { + wght = 0.01f; + } + + /* calculate weighted decision */ + hSpMusClas->wdlp_0_95_sp = wght * dlp + ( 1 - wght ) * hSpMusClas->wdlp_0_95_sp; + + if ( hSpMusClas->sp_mus_state == -HANG_LEN ) + { + hSpMusClas->wdlp_0_95_sp = 0; + } + + /*------------------------------------------------------------------* + * Final speech/music decision + *------------------------------------------------------------------*/ + + if ( !vad && hSpMusClas->sp_mus_state == -HANG_LEN ) + { + /* inactive state */ + dec = 0; + } + else if ( hSpMusClas->sp_mus_state <= 0 ) + { + /* transition from active to inactive state or instable state */ + dec = hSpMusClas->past_dec[0]; + } + else if ( hSpMusClas->sp_mus_state > 0 && hSpMusClas->sp_mus_state < HANG_LEN ) + { + /* entry state -> final decision is calculated based on weighted average of past non-binary decisions */ + ftmp = w_spmus[hSpMusClas->sp_mus_state - 1][0] * dlp; + ftmp += dotp( &w_spmus[hSpMusClas->sp_mus_state - 1][1], hSpMusClas->past_dlp, HANG_LEN - 1 ); + dec = ftmp > 2.0f; + } + else + { + /* stable active state */ + if ( hSpMusClas->wdlp_0_95_sp > 0 && hSpMusClas->past_dec[0] == 0 && hSpMusClas->past_dec[1] == 0 && hSpMusClas->past_dec[2] == 0 ) + { + /* switching from speech to music */ + dec = 1; + } + else if ( hSpMusClas->past_dec[0] == 1 && hSpMusClas->wdlp_0_95_sp < 0 ) + { + /* switching from music to speech */ + dec = 0; + } + else + { + dec = hSpMusClas->past_dec[0]; + } + } + + /*------------------------------------------------------------------* + * Updates + *------------------------------------------------------------------*/ + + /* update buffer of past non-binary decisions */ + mvr2r( &hSpMusClas->past_dlp[0], &hSpMusClas->past_dlp[1], HANG_LEN - 2 ); + hSpMusClas->past_dlp[0] = dlp; + + /* update buffer of past binary decisions */ + mvs2s( &hSpMusClas->past_dec[0], &hSpMusClas->past_dec[1], HANG_LEN - 2 ); + hSpMusClas->past_dec[0] = dec; + + return dec; +} + + +/*---------------------------------------------------------------------* + * sp_mus_classif_2nd() + * + * 2nd stage speech/music classifier (convert music to speech for onsets) + *---------------------------------------------------------------------*/ + +static void sp_mus_classif_2nd( + Encoder_State *st, /* i/o: encoder state structure */ + const float Etot, /* i : total frame energy */ + int16_t *attack_flag, /* i/o: attack flag (GSC or TC) */ + const float *inp /* i : input signal */ +) +{ + int16_t attack; + SP_MUS_CLAS_HANDLE hSpMusClas = st->hSpMusClas; + + /* initialization */ + *attack_flag = 0; + + /* signal stability estimation */ + stab_est( Etot, hSpMusClas->gsc_lt_diff_etot, &hSpMusClas->gsc_mem_etot, &hSpMusClas->gsc_nb_thr_3, &hSpMusClas->gsc_nb_thr_1, hSpMusClas->gsc_thres, &hSpMusClas->gsc_last_music_flag, st->vad_flag ); + + /* calculate variance of correlation */ + var_cor_calc( st->old_corr, &hSpMusClas->mold_corr, hSpMusClas->var_cor_t, &hSpMusClas->high_stable_cor ); + + /* attack detection */ + attack = attack_det( inp, st->clas, st->localVAD, st->coder_type, st->total_brate, EVS_MONO, st->clas, hSpMusClas->finc_prev, &hSpMusClas->lt_finc, &hSpMusClas->last_strong_attack ); + + /* change decision from music to speech in certain special cases */ + if ( st->sp_aud_decision1 == 1 ) + { + if ( hSpMusClas->ener_RAT < 0.18f && hSpMusClas->lt_dec_thres > 15.0f ) + { + /* strong music decision but almost no content below 1kHz */ + st->sp_aud_decision2 = 0; + } + else if ( hSpMusClas->high_stable_cor && st->pitch[0] >= 130 ) + { + /* prevent GSC in highly correlated signal with low energy variation */ + /* this is basically a patch against bassoon-type of music */ + st->sp_aud_decision2 = 0; + + if ( st->codec_mode == MODE1 && st->coder_type == TRANSITION ) + { + st->coder_type = GENERIC; + } + } + else if ( hSpMusClas->gsc_lt_diff_etot[MAX_LT - 1] > 4.5f && ( hSpMusClas->gsc_lt_diff_etot[MAX_LT - 1] - hSpMusClas->gsc_lt_diff_etot[MAX_LT - 2] > 10.0f ) ) + { + if ( st->tc_cnt == 1 ) + { + /* do TC coding instead of GC/VC if onset has been already declared before */ + st->sp_aud_decision2 = 0; + + if ( st->codec_mode == MODE1 ) + { + st->coder_type = TRANSITION; + } + } + else + { + if ( attack >= ATT_3LSUB_POS ) + { + /* do TC coding if attack is located in the last subframe */ + st->sp_aud_decision2 = 0; + *attack_flag = attack + 1; + + if ( st->codec_mode == MODE1 ) + { + st->coder_type = TRANSITION; + } + } + else if ( attack >= ATT_SEG_LEN / 2 ) + { + /* do GSC coding if attack is located after the first quarter of the first subframe */ + /* (pre-echo will be treated at the decoder side) */ + st->sp_aud_decision2 = 1; + *attack_flag = 31; + } + } + } + } + else if ( st->localVAD == 1 && st->coder_type == GENERIC && ( ( attack >= ATT_3LSUB_POS && st->total_brate < ACELP_24k40 ) || ( attack >= ATT_3LSUB_POS_16k && st->total_brate >= ACELP_24k40 && st->total_brate < ACELP_48k ) ) ) + { + /* do TC coding if attack is located in the last subframe */ + *attack_flag = attack + 1; + + if ( st->codec_mode == MODE1 ) + { + st->coder_type = TRANSITION; + } + } + + return; +} + + +/*---------------------------------------------------------------------* + * tonal_det() + * + * Tonal detector based on spectral stability and harmonicity + *---------------------------------------------------------------------*/ + +static float tonal_det( + const float S[], + int16_t vad_flag, + float tod_S_map_lt[], + float *tod_thr_lt, + float *tod_weight, + float *tod_S_mass_prev, + float *tod_S_mass_lt ) +{ + int16_t i; + float S_mass, alpha; + + /* update the adaptive weight */ + *tod_weight = TON_ALPHA * *tod_weight + ( 1 - TON_ALPHA ) * vad_flag; + if ( *tod_weight > TON_ALPHA ) + { + *tod_weight = TON_ALPHA; + } + else if ( *tod_weight < ( 1 - TON_ALPHA ) ) + { + *tod_weight = 1 - TON_ALPHA; + } + + /* calculate LT spectral correlation in each band up to 4KHz */ + S_mass = 0.0f; + for ( i = 0; i < TOD_NSPEC; i++ ) + { + tod_S_map_lt[i] = *tod_weight * tod_S_map_lt[i] + ( 1 - *tod_weight ) * S[i]; + + S_mass += tod_S_map_lt[i]; + } + S_mass /= TOD_NSPEC; + + if ( S_mass > *tod_S_mass_prev ) + { + alpha = 0.7f; + } + else + { + alpha = 0.3f; + } + *tod_S_mass_prev = S_mass; + *tod_S_mass_lt = alpha * *tod_S_mass_lt + ( 1 - alpha ) * S_mass; + S_mass = *tod_S_mass_lt; + + /* updating adaptive decision threshold */ + if ( S_mass > *tod_thr_lt ) + { + *tod_thr_lt -= THR_MASS_STEP_DN; + } + else + { + *tod_thr_lt += THR_MASS_STEP_UP; + } + + if ( *tod_thr_lt > THR_MASS_MAX ) + { + *tod_thr_lt = THR_MASS_MAX; + } + + if ( *tod_thr_lt < THR_MASS_MIN ) + { + *tod_thr_lt = THR_MASS_MIN; + } + + return S_mass; +} + +/*---------------------------------------------------------------------* + * var_cor_calc() + * + * Calculate variance of correlation + *---------------------------------------------------------------------*/ + +static void var_cor_calc( + const float old_corr, + float *mold_corr, + float var_cor_t[], + int16_t *high_stable_cor ) +{ + int16_t i; + float var_cor; + + /* update buffer of old correlation values */ + for ( i = VAR_COR_LEN - 1; i > 0; i-- ) + { + var_cor_t[i] = var_cor_t[i - 1]; + } + var_cor_t[i] = old_corr; + + /* calculate variance of correlation */ + var_cor = var( var_cor_t, VAR_COR_LEN ); + + /* set flag in case of highly-correlated stable signal */ + if ( *mold_corr > 0.8f && var_cor < 5e-4f ) + { + *high_stable_cor = 1; + } + else + { + *high_stable_cor = 0; + } + + /* update average correlation */ + *mold_corr = 0.1f * old_corr + 0.9f * *mold_corr; + + return; +} + +/*---------------------------------------------------------------------* + * attack_det() + * + * Attack detection + *---------------------------------------------------------------------*/ + +static int16_t attack_det( + const float *inp, /* i : input signal */ + const int16_t last_clas, /* i : last signal clas */ + const int16_t localVAD, /* i : local VAD flag */ + const int16_t coder_type, /* i : coder type */ + const int32_t total_brate, /* i : total bitrate */ + const int16_t element_mode, /* i : IVAS element mode */ + const int16_t clas, /* i : signal class */ + float finc_prev[], /* i/o: previous finc */ + float *lt_finc, /* i/o: long-term mean finc */ + int16_t *last_strong_attack /* i/o: last strong attack flag */ +) +{ + int16_t i, attack; + float etmp, etmp2, finc[ATT_NSEG]; + int16_t att_3lsub_pos; + int16_t attack1; + + att_3lsub_pos = ATT_3LSUB_POS; + if ( total_brate >= ACELP_24k40 ) + { + att_3lsub_pos = ATT_3LSUB_POS_16k; + } + + /* compute energy per section */ + for ( i = 0; i < ATT_NSEG; i++ ) + { + finc[i] = sum2_f( inp + i * ATT_SEG_LEN, ATT_SEG_LEN ); + } + + attack = maximum( finc, ATT_NSEG, &etmp ); + attack1 = attack; + + if ( localVAD == 1 && coder_type == GENERIC ) + { + /* compute mean energy in the first three subframes */ + etmp = mean( finc, att_3lsub_pos ); + + /* compute mean energy after the attack */ + etmp2 = mean( finc + attack, ATT_NSEG - attack ); + + /* and compare them */ + if ( etmp * 8 > etmp2 ) + { + /* stop, if the attack is not sufficiently strong */ + attack = 0; + } + + if ( last_clas == VOICED_CLAS && etmp * 20 > etmp2 ) + { + /* stop, if the signal was voiced and the attack is not sufficiently strong */ + attack = 0; + } + + /* compare wrt. other sections (reduces miss-classification) */ + if ( attack > 0 ) + { + etmp2 = finc[attack]; + + for ( i = 2; i < att_3lsub_pos - 2; i++ ) + { + if ( finc[i] * 2.0f > etmp2 ) + { + /* stop, if the attack is not sufficiently strong */ + attack = 0; + break; + } + } + } + + if ( attack == 0 && element_mode > EVS_MONO && ( clas < VOICED_TRANSITION || clas == ONSET ) ) + { + mvr2r( finc, finc_prev, attack1 ); + + /* compute mean energy before the attack */ + etmp = mean( finc_prev, ATT_NSEG ); + + etmp2 = finc[attack1]; + + if ( ( etmp * 16 < etmp2 ) || ( etmp * 12 < etmp2 && last_clas == UNVOICED_CLAS ) ) + { + attack = attack1; + } + + if ( 20 * *lt_finc > etmp2 || *last_strong_attack ) + { + attack = 0; + } + } + + *last_strong_attack = attack; + } + + /* compare wrt. other sections (reduces miss-classification) */ + else if ( attack > 0 ) + { + for ( i = 2; i < att_3lsub_pos - 2; i++ ) + { + if ( i != attack && finc[i] * 1.3f > finc[attack] ) + { + /* stop, if the attack is not sufficiently strong */ + attack = 0; + break; + } + } + *last_strong_attack = 0; + } + + /* updates */ + mvr2r( finc, finc_prev, ATT_NSEG ); + *lt_finc = 0.95f * *lt_finc + 0.05f * mean( finc, ATT_NSEG ); + + return attack; +} + +/*---------------------------------------------------------------------* + * ivas_smc_gmm() + * + * 1st stage of the speech/music classification (based on the GMM model) + *---------------------------------------------------------------------*/ + +/*! r: S/M decision (0=speech or noise,1=unclear,2=music) */ +int16_t ivas_smc_gmm( + Encoder_State *st, /* i/o: state structure */ + STEREO_CLASSIF_HANDLE hStereoClassif, /* i/o: stereo classifier structure */ + const int16_t localVAD_HE_SAD, /* i : HE-SAD flag without hangover */ + const float Etot, /* i : total frame energy */ + const float lsp_new[M], /* i : LSPs in current frame */ + const float cor_map_sum, /* i : correlation map sum (from multi-harmonic anal.) */ + const float epsP[M + 1], /* i : LP prediciton error */ + const float PS[], /* i : energy spectrum */ + const float non_sta, /* i : unbound non-stationarity */ + const float relE, /* i : relative frame energy */ + int16_t *high_lpn_flag, /* i/o: sp/mus LPN flag */ + const int16_t flag_spitch /* i : flag to indicate very short stable pitch */ +) +{ + int16_t i, m, dec; + int16_t flag_odv; + float lps, lpm, lpn; + float ps[N_SMC_MIXTURES], pm[N_SMC_MIXTURES], pn[N_SMC_MIXTURES]; + float fvm[N_PCA_COEF], lprob; + float dlp, ftmp, sum_PS, ps_diff, ps_sta, wrelE, wdrop, wght; + float wrise; + float dlp_mean2var; + float FV[N_SMC_FEATURES], *pFV, PS_norm[128], dPS[128]; + const float *pODV; + float *pFV_st, smc_st_mean_fact; + int16_t relE_attack_flag; + int16_t j, len; + const float *pt_mel_fb; + float melS[NB_MEL_BANDS], mfcc[NB_MEL_BANDS]; + int16_t odv_cnt; + int16_t i_out[N_SMC_FEATURES], *p_out; + + /*------------------------------------------------------------------* + * Initialization + *------------------------------------------------------------------*/ + + SP_MUS_CLAS_HANDLE hSpMusClas = st->hSpMusClas; + + /*------------------------------------------------------------------* + * State machine (sp_mus_state: -8 = INACTIVE, -7:-1 = UNSTABLE, 0:7 = ENTRY, 8 = STABLE ) + *------------------------------------------------------------------*/ + + if ( localVAD_HE_SAD ) + { + if ( relE < -20 ) + { + if ( hSpMusClas->sp_mus_state > 0 ) + { + if ( hSpMusClas->sp_mus_state < HANG_LEN ) + { + /* energy is too low but we are in entry period -> reset the inactive counter to allow new entry later */ + hSpMusClas->inact_cnt = 0; + } + + /* energy is too low -> we are going to instable state */ + hSpMusClas->sp_mus_state = 0; + } + else if ( hSpMusClas->sp_mus_state > -HANG_LEN ) + { + /* energy is still too low -> we are still in instable state */ + hSpMusClas->sp_mus_state--; + } + } + else if ( hSpMusClas->sp_mus_state <= 0 ) + { + if ( hSpMusClas->inact_cnt == 0 ) + { + + hSpMusClas->sp_mus_state = 1; + } + else + { + + hSpMusClas->sp_mus_state = HANG_LEN; + } + + hSpMusClas->inact_cnt = 12; + } + else if ( hSpMusClas->sp_mus_state > 0 && hSpMusClas->sp_mus_state < HANG_LEN ) + { + /* we are inside an entry period -> increment the counter of entry frames */ + hSpMusClas->sp_mus_state++; + } + + if ( hSpMusClas->sp_mus_state < 0 && hSpMusClas->inact_cnt > 0 ) + { + hSpMusClas->inact_cnt--; + } + } + else + { + if ( hSpMusClas->sp_mus_state > 0 && hSpMusClas->sp_mus_state < HANG_LEN ) + { + hSpMusClas->inact_cnt = 0; + } + else if ( hSpMusClas->inact_cnt > 0 ) + { + hSpMusClas->inact_cnt--; + } + + if ( hSpMusClas->sp_mus_state > 0 && hSpMusClas->sp_mus_state < HANG_LEN ) + { + hSpMusClas->sp_mus_state = -HANG_LEN; + } + else if ( hSpMusClas->sp_mus_state > 0 ) + { + hSpMusClas->sp_mus_state = -1; + } + else if ( hSpMusClas->sp_mus_state > -HANG_LEN ) + { + /* we are in inactive state */ + hSpMusClas->sp_mus_state--; + } + } + + /* detect attacks based on relE */ + if ( relE > hSpMusClas->prev_relE ) + { + hSpMusClas->relE_attack_sum += relE - hSpMusClas->prev_relE; + } + else + { + hSpMusClas->relE_attack_sum = 0; + } + hSpMusClas->prev_relE = relE; + + /* update counter from last VAD 0->1 change */ + if ( hSpMusClas->prev_vad == 0 && localVAD_HE_SAD == 1 ) + { + hSpMusClas->vad_0_1_cnt = 1; + } + else if ( localVAD_HE_SAD == 1 && hSpMusClas->vad_0_1_cnt > 0 && hSpMusClas->vad_0_1_cnt < 50 ) + { + hSpMusClas->vad_0_1_cnt++; + } + else + { + hSpMusClas->vad_0_1_cnt = 0; + } + hSpMusClas->prev_vad = localVAD_HE_SAD; + + if ( hSpMusClas->sp_mus_state > 0 && hSpMusClas->sp_mus_state < HANG_LEN && hSpMusClas->relE_attack_sum > 5.0f ) + { + hSpMusClas->relE_attack_cnt++; + + /* set flag only in the first X frames in a series */ + if ( hSpMusClas->relE_attack_cnt > 0 && hSpMusClas->relE_attack_cnt < 3 ) + { + relE_attack_flag = 1; + } + else + { + relE_attack_flag = 0; + } + } + else + { + hSpMusClas->relE_attack_cnt = 0; + relE_attack_flag = 0; + } + + hSpMusClas->prev_Etot = Etot; + + /*------------------------------------------------------------------* + * Preparation of the feature vector + *------------------------------------------------------------------*/ + + pFV = FV; + + /* [0] OL pitch */ + if ( relE_attack_flag || st->tc_cnt == 1 || st->tc_cnt == 2 ) + { + *pFV++ = (float) st->pitch[2]; + } + else + { + *pFV++ = (float) ( st->pitch[0] + st->pitch[1] + st->pitch[2] ) / 3.0f; + } + + /* [1] voicing */ + if ( relE_attack_flag || st->tc_cnt == 1 || st->tc_cnt == 2 ) + { + *pFV++ = st->voicing[2]; + } + else + { + *pFV++ = ( st->voicing[0] + st->voicing[1] + st->voicing[2] ) / 3.0f; + } + + /* [2,3,4,5,6] LSFs */ + *pFV++ = acosf( lsp_new[2] ); + *pFV++ = acosf( lsp_new[3] ); + *pFV++ = acosf( lsp_new[4] ); + *pFV++ = acosf( lsp_new[5] ); + *pFV++ = acosf( lsp_new[6] ); + + /* [7] cor_map_sum */ + *pFV++ = cor_map_sum; + + /* [8] non_sta */ + *pFV++ = non_sta; + + /* [9] epsP */ + *pFV++ = logf( epsP[14] + 1e-5f ) - logf( epsP[0] + 1e-5f ); + + /* [10,11,12] MFCCs */ + set_zero( melS, NB_MEL_BANDS ); + pt_mel_fb = mel_fb; + for ( i = 0; i < NB_MEL_BANDS; i++ ) + { + j = mel_fb_start[i]; + len = mel_fb_len[i]; + melS[i] = logf( dotp( &PS[j], pt_mel_fb, len ) + 1e-5f ); + pt_mel_fb += len; + } + + v_mult_mat( mfcc, melS, dct_mtx, NB_MEL_BANDS, NB_MEL_COEF ); + + *pFV++ = mfcc[2]; + *pFV++ = mfcc[6]; + *pFV++ = mfcc[12]; + + /* calculation of differential normalized power spectrum */ + sum_PS = 1e-5f; + for ( i = LOWEST_FBIN; i < HIGHEST_FBIN; i++ ) + { + sum_PS += PS[i]; + } + + for ( i = LOWEST_FBIN; i < HIGHEST_FBIN; i++ ) + { + PS_norm[i] = PS[i] / sum_PS; + dPS[i] = fabsf( PS_norm[i] - hSpMusClas->past_PS[i - LOWEST_FBIN] ); + } + + /* [13] ps_diff (spectral difference) */ + ps_diff = 0; + for ( i = LOWEST_FBIN; i < HIGHEST_FBIN; i++ ) + { + ps_diff += dPS[i]; + } + + *pFV++ = ps_diff; + + /* [14] ps_sta (spectral stationarity) */ + ps_sta = 0; + for ( i = LOWEST_FBIN; i < HIGHEST_FBIN; i++ ) + { + if ( PS_norm[i] > hSpMusClas->past_PS[i - LOWEST_FBIN] ) + { + ps_sta += PS_norm[i] / ( dPS[i] + 1e-5f ); + } + else + { + ps_sta += hSpMusClas->past_PS[i - LOWEST_FBIN] / ( dPS[i] + 1e-5f ); + } + } + + *pFV++ = logf( ps_sta + 1e-5f ); + mvr2r( &PS_norm[LOWEST_FBIN], hSpMusClas->past_PS, HIGHEST_FBIN - LOWEST_FBIN ); + + /* save ps_diff and ps_sta features for XTALK and UNCLR classifier */ + if ( hStereoClassif != NULL ) + { + if ( st->idchan == 0 ) + { + hStereoClassif->ps_diff_ch1 = ps_diff; + hStereoClassif->ps_sta_ch1 = logf( ps_sta + 1e-5f ); + } + else + { + hStereoClassif->ps_diff_ch2 = ps_diff; + hStereoClassif->ps_sta_ch2 = logf( ps_sta + 1e-5f ); + } + } + + /*------------------------------------------------------------------* + * Outlier detection based on feature histograms + *------------------------------------------------------------------*/ + + flag_odv = 0; + if ( localVAD_HE_SAD ) + { + pFV = FV; + pODV = hout_intervals; + p_out = i_out; + odv_cnt = 0; + for ( i = 0; i < N_SMC_FEATURES; i++ ) + { + if ( *pFV < pODV[0] || *pFV > pODV[1] ) + { + *p_out++ = i; + odv_cnt++; + } + + pFV++; + pODV += 2; + } + + /* set outlier flag */ + if ( odv_cnt >= 2 ) + { + flag_odv = 1; + + /* replace outlying features with values from the previous frame */ + for ( i = 0; i < odv_cnt; i++ ) + { + FV[i_out[i]] = hSpMusClas->prev_FV[i_out[i]]; + } + } + } + + /*------------------------------------------------------------------* + * Adaptive short-term mean filter on feature vector + *------------------------------------------------------------------*/ + + pFV = FV; + pFV_st = hSpMusClas->FV_st; + smc_st_mean_fact = SMC_ST_MEAN_FACT; + for ( i = 0; i < N_SMC_FEATURES; i++ ) + { + *pFV_st = smc_st_mean_fact * ( *pFV_st ) + ( 1 - smc_st_mean_fact ) * ( *pFV ); + + if ( hSpMusClas->sp_mus_state > 0 && hSpMusClas->sp_mus_state < HANG_LEN && ( relE_attack_flag || flag_odv ) ) + { + /* strong attack or outlier frame during entry state -> features cannot be trusted but there is also no useful past info -> */ + /* -> do whatever you want because dlp will be reset to 0 anyway */ + pFV++; + pFV_st++; + } + else if ( hSpMusClas->sp_mus_state == HANG_LEN && ( st->tc_cnt == 1 || st->tc_cnt == 2 ) ) + { + /* energy attack in stable state -> use current features intead of the long-term average */ + pFV++; + pFV_st++; + } + else + { + *pFV++ = *pFV_st++; + } + } + + /* update */ + mvr2r( FV, hSpMusClas->prev_FV, N_SMC_FEATURES ); + + /*------------------------------------------------------------------* + * Non-linear power transformation (boxcox) on certain features + *------------------------------------------------------------------*/ + + pFV = FV; + for ( i = 0; i < N_SMC_FEATURES; i++ ) + { + if ( bcox_lmbd[i] != 0 ) + { + *pFV -= bcox_add_cnst[i]; + if ( *pFV < 1 ) + { + *pFV = 1; + } + *pFV = ( powf( *pFV, bcox_lmbd[i] ) - 1 ) / bcox_lmbd[i]; + } + + pFV++; + } + + /*------------------------------------------------------------------* + * Scaling of the feature vector + * PCA + *------------------------------------------------------------------*/ + + pFV = FV; + for ( i = 0; i < N_SMC_FEATURES; i++ ) + { + /* Standard scaler - mean and variance normalization */ + *pFV = ( *pFV - sm_means[i] ) / sm_scale[i]; + pFV++; + + /* MinMax sclaer - mean and variance normalization */ + /**pFV = *pFV * sm_scale[i] + sm_min[i];*/ + /*pFV++;*/ + } + + /* PCA */ + v_sub( FV, pca_mean_, FV, N_SMC_FEATURES ); + v_mult_mat( FV, FV, pca_components_, N_SMC_FEATURES, N_PCA_COEF ); + + /*------------------------------------------------------------------* + * Calculation of posterior probability + * Log-probability + *------------------------------------------------------------------*/ + + /* run loop for all mixtures (for each mixture, calculate the probability of speech, music and noise) */ + lps = lpm = lpn = 0; + for ( m = 0; m < N_SMC_MIXTURES; m++ ) + { + v_sub( FV, &means_speech[m * N_PCA_COEF], fvm, N_PCA_COEF ); + lprob = dot_product_cholesky( fvm, &prec_chol_speech[m * ( N_PCA_COEF * N_PCA_COEF + N_PCA_COEF ) / 2], N_PCA_COEF ); + ps[m] = logf( weights_speech[m] ) + log_det_chol_speech[m] - 0.5f * N_PCA_COEF * logf( PI2 ) - 0.5f * lprob; + + v_sub( FV, &means_music[m * N_PCA_COEF], fvm, N_PCA_COEF ); + lprob = dot_product_cholesky( fvm, &prec_chol_music[m * ( N_PCA_COEF * N_PCA_COEF + N_PCA_COEF ) / 2], N_PCA_COEF ); + pm[m] = logf( weights_music[m] ) + log_det_chol_music[m] - 0.5f * N_PCA_COEF * logf( PI2 ) - 0.5f * lprob; + + v_sub( FV, &means_noise[m * N_PCA_COEF], fvm, N_PCA_COEF ); + lprob = dot_product_cholesky( fvm, &prec_chol_noise[m * ( N_PCA_COEF * N_PCA_COEF + N_PCA_COEF ) / 2], N_PCA_COEF ); + pn[m] = logf( weights_noise[m] ) + log_det_chol_noise[m] - 0.5f * N_PCA_COEF * logf( PI2 ) - 0.5f * lprob; + } + + lps = logsumexp( ps, N_SMC_MIXTURES ); + lpm = logsumexp( pm, N_SMC_MIXTURES ); + lpn = logsumexp( pn, N_SMC_MIXTURES ); + + *high_lpn_flag = 0; + if ( lpn > lps && lpn > lpm ) + { + *high_lpn_flag = 1; + } + + hSpMusClas->lpm = lpm; + hSpMusClas->lps = lps; + hSpMusClas->lpn = lpn; + + /* determine HQ Generic speech class */ + if ( st->hHQ_core != NULL ) + { + if ( lps > lpm + 0.5f ) + { + st->hHQ_core->hq_generic_speech_class = 1; + } + else + { + st->hHQ_core->hq_generic_speech_class = 0; + } + } + + /*------------------------------------------------------------------* + * Decision without hangover + * Weighted decision + *------------------------------------------------------------------*/ + + /* decision without hangover (0 - speech/noise, 1 - music) */ + if ( !localVAD_HE_SAD || Etot < 10 || ( hSpMusClas->sp_mus_state > 0 && hSpMusClas->sp_mus_state < HANG_LEN && ( relE_attack_flag || flag_odv ) ) ) + { + dlp = 0; + } + else + { + dlp = lpm - lps + DLP_BIAS; + + if ( dlp > 30.0f ) + { + dlp = 30.0f; + } + else if ( dlp < -30.0f ) + { + dlp = -30.0f; + } + } + + dec = dlp > 0; + + /* calculate weight based on relE (higher relE -> lower weight, lower relE -> higher weight) */ + wrelE = lin_interp( relE, 15.0f, 0.9f, -15.0f, 0.99f, 1 ); + + /* calculate weight based on drops of dlp (close to 1 during sudden drops of dlp, close to 0 otherwise) */ + hSpMusClas->dlp_mean_ST = 0.8f * hSpMusClas->dlp_mean_ST + 0.2f * dlp; + hSpMusClas->lt_dec_thres = hSpMusClas->dlp_mean_ST; + + if ( dlp < 0 && dlp < hSpMusClas->dlp_mean_ST ) + { + if ( hSpMusClas->dlp_mean_ST > 0 ) + { + hSpMusClas->wdrop = -dlp; + } + else if ( hSpMusClas->wdrop > 0 ) + { + hSpMusClas->wdrop += hSpMusClas->dlp_mean_ST - dlp; + } + } + else + { + hSpMusClas->wdrop = 0; + } + + wdrop = lin_interp( hSpMusClas->wdrop, 15.0f, 0.7f, 0.0f, 1.0f, 1 ); + + /* calculate weight based on rises of dlp (close to 1 during sudden rise of dlp, close to 0 otherwise) */ + if ( hSpMusClas->sp_mus_state == HANG_LEN && hSpMusClas->dlp_mean_ST > 0 && hSpMusClas->dlp_mean_ST > hSpMusClas->past_dlp_mean_ST[0] ) + { + if ( hSpMusClas->past_dlp_mean_ST[0] < 0 ) + { + hSpMusClas->wrise = hSpMusClas->dlp_mean_ST; + } + else if ( hSpMusClas->wrise > 0 ) + { + hSpMusClas->wrise += hSpMusClas->dlp_mean_ST - hSpMusClas->past_dlp_mean_ST[0]; + } + } + else + { + hSpMusClas->wrise = 0; + } + + wrise = lin_interp( hSpMusClas->wrise, 5.0f, 0.95f, 0.0f, 1.0f, 1 ); + + /* combine weights into one */ + wght = wrelE * wdrop * wrise; + + /* ratio of delta means vs. delta variances */ + if ( hSpMusClas->sp_mus_state > 0 && hSpMusClas->sp_mus_state < HANG_LEN ) + { + hSpMusClas->dlp_mean_LT = dlp; + hSpMusClas->dlp_var_LT = 0; + } + + hSpMusClas->dlp_mean_LT = 0.9f * hSpMusClas->dlp_mean_LT + 0.1f * dlp; + ftmp = dlp - hSpMusClas->dlp_mean_LT; + hSpMusClas->dlp_var_LT = 0.9f * hSpMusClas->dlp_var_LT + 0.1f * ( ftmp * ftmp ); + + if ( hSpMusClas->sp_mus_state > 0 && hSpMusClas->sp_mus_state < HANG_LEN ) + { + dlp_mean2var = 0; + } + else + { + dlp_mean2var = fabsf( hSpMusClas->dlp_mean_LT ) / ( sqrtf( fabsf( hSpMusClas->dlp_var_LT ) ) + 1.0f ); + } + + if ( dlp_mean2var > 15.0f ) + { + /* decrease the weight little bit when the classifier indicates "strong speech" or "strong music" */ + wght *= 0.9f; + } + + if ( wght > 1.0f ) + { + wght = 1.0f; + } + else if ( wght < 0.01f ) + { + wght = 0.01f; + } + + if ( Etot < 10 ) + { + /* silence */ + wght = 0.92f; + } + + /* calculate weighted decision */ + hSpMusClas->wdlp_0_95_sp = wght * hSpMusClas->wdlp_0_95_sp + ( 1 - wght ) * dlp; + + /* xtalk classifier: apply long hysteresis to prevent LRTD on music */ + hSpMusClas->wdlp_xtalk = 0.995f * hSpMusClas->wdlp_xtalk + 0.005f * dlp; + + /*------------------------------------------------------------------* + * Final speech/music decision + *------------------------------------------------------------------*/ + + if ( flag_spitch ) + { + hSpMusClas->flag_spitch_cnt = 5; + } + else if ( hSpMusClas->flag_spitch_cnt > 0 ) + { + hSpMusClas->flag_spitch_cnt--; + } + + if ( Etot < 10 ) + { + /* silence */ + dec = 0; + } + else if ( hSpMusClas->sp_mus_state > 0 && hSpMusClas->sp_mus_state < HANG_LEN ) + { + /* entry state -> final decision is calculated based on weighted average of past non-binary decisions */ + ftmp = w_spmus[hSpMusClas->sp_mus_state - 1][0] * dlp; + ftmp += dotp( &w_spmus[hSpMusClas->sp_mus_state - 1][1], hSpMusClas->past_dlp, HANG_LEN - 1 ); + if ( ftmp > 2.0f ) + { + if ( dlp > 2.0f ) + { + dec = 2; + } + else + { + dec = 1; + } + } + else + { + dec = 0; + } + } + else + { + /* stable active state */ + if ( hSpMusClas->past_dec[0] == 0 && hSpMusClas->past_dec[1] == 0 && hSpMusClas->past_dec[2] == 0 && + ( ( hSpMusClas->flag_spitch_cnt > 0 && hSpMusClas->wdlp_0_95_sp > 3.4f ) || ( hSpMusClas->flag_spitch_cnt == 0 && hSpMusClas->wdlp_0_95_sp > 2.1f ) ) ) + { + /* switching from speech to unclear */ + dec = 1; + } + else if ( hSpMusClas->past_dec[0] == 0 && hSpMusClas->vad_0_1_cnt < 50 && hSpMusClas->relE_attack_sum == 0.0f && hSpMusClas->wdlp_0_95_sp > 1.0f ) + { + /* switch from speech to unclear also during slowly rising weak music onsets */ + dec = 1; + } + else if ( hSpMusClas->past_dec[0] == 1 && hSpMusClas->wdlp_0_95_sp > 2.5f ) + { + /* switching from unclear to music */ + dec = 2; + } + else if ( hSpMusClas->past_dec[0] == 2 && hSpMusClas->past_dec[1] == 2 && hSpMusClas->past_dec[2] == 2 && hSpMusClas->wdlp_0_95_sp < -1.0f ) + { + /* switching from music to unclear */ + dec = 1; + } + else if ( hSpMusClas->past_dec[0] == 1 && hSpMusClas->wdlp_0_95_sp < -2.5f ) + { + /* switching from unclear to speech */ + dec = 0; + } + else + { + dec = hSpMusClas->past_dec[0]; + } + } + + /*------------------------------------------------------------------* + * raw S/M decision based on smoothed GMM score + *------------------------------------------------------------------*/ + + if ( dec == 0 || st->hSpMusClas->wdlp_0_95_sp <= 0 ) + { + st->sp_aud_decision0 = 0; + st->sp_aud_decision1 = 0; + } + else + { + st->sp_aud_decision0 = 1; + st->sp_aud_decision1 = 1; + } + + /*------------------------------------------------------------------* + * Updates + *------------------------------------------------------------------*/ + + /* update buffer of past non-binary decisions */ + mvr2r( &hSpMusClas->past_dlp[0], &hSpMusClas->past_dlp[1], HANG_LEN - 2 ); + hSpMusClas->past_dlp[0] = dlp; + + mvr2r( &hSpMusClas->past_dlp_mean_ST[0], &hSpMusClas->past_dlp_mean_ST[1], HANG_LEN - 2 ); + hSpMusClas->past_dlp_mean_ST[0] = hSpMusClas->dlp_mean_ST; + + /* update buffer of past binary decisions */ + mvs2s( &hSpMusClas->past_dec[0], &hSpMusClas->past_dec[1], HANG_LEN - 2 ); + hSpMusClas->past_dec[0] = dec; + + + return dec; +} + +/*---------------------------------------------------------------------* + * ivas_smc_mode_selection() + * + * 2nd stage speech/music classifier (select coding mode (ACELP, GSC and TCX) based on S/M classification) + * output (sp_aud_decision1 - sp_aud_decision2 -> coding mode): + * 0 - 0 -> ACELP + * 1 - 0 -> GSC + * 1 - 1 -> TCX + *---------------------------------------------------------------------*/ + +void ivas_smc_mode_selection( + Encoder_State *st, /* i/o: encoder state structure */ + const int32_t element_brate, /* i : element bitrate */ + int16_t smc_dec, /* i : raw decision of the 1st stage classifier*/ + const float relE, /* i : relative frame energy */ + const float Etot, /* i : total frame energy */ + int16_t *attack_flag, /* i/o: attack flag (GSC or TC) */ + const float *inp, /* i : input signal */ + const float S_map[], /* i : short-term correlation map */ + const int16_t flag_spitch /* i : flag to indicate very short stable pitch*/ +) +{ + int16_t attack; + float ton; + int16_t i; + float S_p2a, S_max, S_ave; + float thr_sp2a; + + SP_MUS_CLAS_HANDLE hSpMusClas = st->hSpMusClas; + + /* initialization */ + *attack_flag = 0; + st->sp_aud_decision2 = 0; + + /* signal stability estimation */ + stab_est( Etot, hSpMusClas->gsc_lt_diff_etot, &hSpMusClas->gsc_mem_etot, &hSpMusClas->gsc_nb_thr_3, &hSpMusClas->gsc_nb_thr_1, hSpMusClas->gsc_thres, &hSpMusClas->gsc_last_music_flag, st->vad_flag ); + + /* calculate variance of correlation */ + var_cor_calc( st->old_corr, &hSpMusClas->mold_corr, hSpMusClas->var_cor_t, &hSpMusClas->high_stable_cor ); + + /* attack detection */ + attack = attack_det( inp, st->clas, st->localVAD, st->coder_type, 0, st->element_mode, st->clas, hSpMusClas->finc_prev, &hSpMusClas->lt_finc, &hSpMusClas->last_strong_attack ); + + /* tonal detector */ + ton = tonal_det( S_map, st->vad_flag, hSpMusClas->tod_S_map_lt, &hSpMusClas->tod_thr_lt, &hSpMusClas->tod_weight, &hSpMusClas->tod_S_mass_prev, &hSpMusClas->tod_S_mass_lt ); + + + /* calculate spectral peak-to-average ratio */ + for ( i = 0; i < TOD_NSPEC; i++ ) + { + st->hSpMusClas->tod_lt_Bin_E[i] = P2A_FACT * st->hSpMusClas->tod_lt_Bin_E[i] + ( 1 - P2A_FACT ) * st->Bin_E[i]; + } + + maximum( st->hSpMusClas->tod_lt_Bin_E, TOD_NSPEC, &S_max ); + S_ave = sum_f( st->hSpMusClas->tod_lt_Bin_E, TOD_NSPEC ) / TOD_NSPEC; + S_p2a = S_max - S_ave; + + if ( element_brate <= IVAS_16k4 ) + { + thr_sp2a = THR_P2A_HIGH; + } + else + { + thr_sp2a = THR_P2A; + } + + /* initial 3-way selection of coding modes (ACELP/GSC/TCX) */ + if ( relE > -10.0f && ( S_p2a > thr_sp2a || ton > hSpMusClas->tod_thr_lt ) ) + { + /* select TCX to encode extremely peaky signals or strongly tonal signals */ + st->sp_aud_decision1 = 1; + st->sp_aud_decision2 = 1; + } + else if ( smc_dec == SPEECH ) + { + /* select ACELP to encode speech */ + st->sp_aud_decision1 = 0; + st->sp_aud_decision2 = 0; + } + else if ( smc_dec == SPEECH_OR_MUSIC ) + { + /* select GSC to encode "unclear" segments (classifier's score on the borderline) */ + st->sp_aud_decision1 = 1; + st->sp_aud_decision2 = 0; + } + else + { + /* select TCX to encode music */ + st->sp_aud_decision1 = 1; + st->sp_aud_decision2 = 1; + } + + /* change decision from GSC to ACELP/TCX in some special cases */ + if ( st->sp_aud_decision1 == 1 && st->sp_aud_decision2 == 0 ) + { + if ( hSpMusClas->ener_RAT < 0.18f && hSpMusClas->lt_dec_thres > 15.0f ) + { + /* prevent GSC on strong music with almost no content below 1kHz */ + st->sp_aud_decision2 = 1; + } + else if ( flag_spitch ) + { + /* prevent GSC on signals with very short and stable high pitch period */ + if ( hSpMusClas->wdlp_0_95_sp < 2.5f ) + { + /* select ACELP instead */ + st->sp_aud_decision1 = 0; + } + else + { + /* select TCX instead */ + st->sp_aud_decision2 = 1; + } + } + else if ( hSpMusClas->high_stable_cor && st->pitch[0] >= 130 ) + { + /* prevent GSC in highly correlated signal with low energy variation */ + /* this is basically a patch against bassoon-type of music */ + st->sp_aud_decision2 = 1; + } + } + + /* change decision from GSC to ACELP TC during attacks/onsets */ + if ( st->sp_aud_decision1 == 1 && st->sp_aud_decision2 == 0 ) + { + if ( ( hSpMusClas->gsc_lt_diff_etot[MAX_LT - 1] > 4.5f ) && + ( hSpMusClas->gsc_lt_diff_etot[MAX_LT - 1] - hSpMusClas->gsc_lt_diff_etot[MAX_LT - 2] > 10.0f ) ) + { + if ( st->tc_cnt == 1 ) + { + /* do ACELP TC coding instead of GC/VC if onset has been already declared before */ + st->sp_aud_decision1 = 0; + st->coder_type = TRANSITION; + } + else + { + if ( attack >= ATT_3LSUB_POS ) + { + /* do ACELP TC coding also if attack is located in the last subframe */ + st->sp_aud_decision1 = 0; + *attack_flag = attack + 1; + st->coder_type = TRANSITION; + } + else if ( attack >= ATT_SEG_LEN / 2 ) + { + /* do GSC coding if attack is located after the first quarter of the first subframe */ + /* (pre-echo will be treated at the decoder side) */ + *attack_flag = 31; + *attack_flag = attack + 1; + } + } + } + } + + if ( st->localVAD == 1 && st->coder_type == GENERIC && attack > 0 /*&& *attack_flag < 32*/ /*&& st->tc_cnt != 2*/ && !( st->sp_aud_decision2 == 1 && ton > 0.65f ) ) + { + /* change ACELP coder_type to TC if attack has been detected */ + st->sp_aud_decision1 = 0; + st->sp_aud_decision2 = 0; + + st->coder_type = TRANSITION; + *attack_flag = attack + 1; + } + + + /* set GSC noisy speech flag on unvoiced SWB segments */ + st->GSC_noisy_speech = 0; + if ( st->vad_flag == 1 && element_brate <= IVAS_16k4 && st->lp_noise > 30.0f && st->sp_aud_decision1 == 0 && st->bwidth >= SWB && st->coder_type_raw == UNVOICED ) + { + st->GSC_noisy_speech = 1; + } + + /* set GSC submode */ + if ( st->element_mode > EVS_MONO && ( st->sp_aud_decision1 == 1 && st->sp_aud_decision2 == 0 ) && st->total_brate > STEREO_GSC_BIT_RATE_ALLOC ) /* below STEREO_GSC_BIT_RATE_ALLOC, fall back on normal GSC */ + { + st->GSC_IVAS_mode = 1; + if ( st->hSpMusClas->wdlp_0_95_sp > 0.0f ) + { + /* music-like content */ + st->GSC_IVAS_mode = 3; + } + else if ( st->tc_cnt > 0 ) + { + /* likely presence of an onset, GSC bit allocation will be more focused on LF */ + st->GSC_IVAS_mode = 2; + } + + if ( st->coder_type_raw == UNVOICED && st->sp_aud_decision0 == 0 /*&& st->GSC_IVAS_mode < 3*/ ) + { + st->GSC_noisy_speech = 1; + } + else + { + st->GSC_noisy_speech = 0; + } + } + + /* set coder_type to AUDIO when GSC is selected (st->core will be set later in the decision matrix) */ + if ( ( st->sp_aud_decision1 == 1 && st->sp_aud_decision2 == 0 ) || st->GSC_noisy_speech ) + { + st->coder_type = AUDIO; + if ( st->hGSCEnc != NULL && st->GSC_noisy_speech == 0 ) /* In case of GSC_noisy_speech, NOISE_LEVEL should remain at NOISE_LEVEL_SP3 */ + { + st->hGSCEnc->noise_lev = NOISE_LEVEL_SP0; + } + } + + return; +} + + +/*------------------------------------------------------------------------* + * music_mixed_classif_improv() + * + * Improve 1st stage speech/music decision for mixed&music signals + *------------------------------------------------------------------------*/ + +static void music_mixed_classif_improv( + Encoder_State *st, /* i/o: Encoder state structure */ + const float *new_inp, /* i : new input signal */ + const float *epsP, /* i : LP prediction error */ + const float etot, /* i : total frame energy */ + const float old_cor, /* i : normalized correlation */ + const float cor_map_sum /* i : correlation map sum */ +) +{ + int16_t i, dec, len, percus_flag; + float p2v_map[128], ftmp, ftmp1, lt_diff, log_max_spl, epsP_tilt, max_spl; + + SP_MUS_CLAS_HANDLE hSpMusClas = st->hSpMusClas; + + /* find sample with maximum absolute amplitude */ + max_spl = 0; + for ( i = 0; i < L_FRAME; i++ ) + { + if ( fabs( new_inp[i] ) > max_spl ) + { + max_spl = fabsf( new_inp[i] ); + } + } + + /* music is considered only appearing in high SNR condition and active signal */ + if ( st->vad_flag == 0 || st->lp_speech - st->lp_noise < 25 ) + { + hSpMusClas->dec_mov = 0.5f; + hSpMusClas->dec_mov1 = 0.5f; + + if ( st->vad_flag == 0 ) + { + hSpMusClas->onset_cnt = 0; + } + + return; + } + + hSpMusClas->onset_cnt++; + + if ( hSpMusClas->onset_cnt > 9 ) + { + hSpMusClas->onset_cnt = 9; + } + + if ( hSpMusClas->onset_cnt == 1 ) + { + set_f( hSpMusClas->buf_flux, -100, BUF_LEN ); + } + + /* spectral analysis */ + spec_analysis( st->Bin_E, p2v_map ); + + /* percussive music detection */ + log_max_spl = 20 * logf( max_spl + 0.0001f ); + lt_diff = log_max_spl - hSpMusClas->mov_log_max_spl; + + for ( i = 0; i < 3; i++ ) + { + hSpMusClas->buf_etot[i] = hSpMusClas->buf_etot[i + 1]; + } + hSpMusClas->buf_etot[i] = etot; + + percus_flag = 0; + if ( hSpMusClas->buf_etot[1] - hSpMusClas->buf_etot[0] > 6 && hSpMusClas->buf_etot[2] < hSpMusClas->buf_etot[1] && hSpMusClas->buf_etot[1] - st->lp_speech > 3 ) + { + if ( hSpMusClas->buf_etot[1] - hSpMusClas->buf_etot[3] > 3 && hSpMusClas->buf_etot[3] < hSpMusClas->buf_etot[2] && 0.5f * ( 0.5f * ( st->voicing[0] + st->voicing[1] ) + old_cor ) < 0.75f ) + { + if ( hSpMusClas->dec_mov > 0.8f ) + { + percus_flag = 1; + } + else if ( old_cor < 0.75f && st->voicing[0] < 0.75f && st->voicing[1] < 0.75f && hSpMusClas->old_lt_diff[0] > 10 ) + { + percus_flag = 1; + } + } + } + + /* sound attack detection */ + if ( hSpMusClas->buf_etot[3] - hSpMusClas->buf_etot[2] > 6 && hSpMusClas->dec_mov > 0.9f && etot - st->lp_speech > 5 && hSpMusClas->old_lt_diff[0] > 5 ) + { + hSpMusClas->attack_hangover = 3; + } + + if ( st->voicing[0] > 0.9f && st->voicing[1] > 0.9f ) + { + if ( log_max_spl > hSpMusClas->mov_log_max_spl ) + { + hSpMusClas->mov_log_max_spl = 0.75f * hSpMusClas->mov_log_max_spl + ( 1 - 0.75f ) * log_max_spl; + } + else + { + hSpMusClas->mov_log_max_spl = 0.995f * hSpMusClas->mov_log_max_spl + ( 1 - 0.995f ) * log_max_spl; + } + } + + hSpMusClas->old_lt_diff[0] = hSpMusClas->old_lt_diff[1]; + hSpMusClas->old_lt_diff[1] = lt_diff; + + /* calculate and buffer spectral energy fluctuation */ + flux( st->Bin_E, p2v_map, hSpMusClas->old_Bin_E, hSpMusClas->buf_flux, hSpMusClas->attack_hangover, hSpMusClas->dec_mov ); + + hSpMusClas->attack_hangover--; + if ( hSpMusClas->attack_hangover < 0 ) + { + hSpMusClas->attack_hangover = 0; + } + + /* identify flux buffer status */ + len = 0; + for ( i = BUF_LEN - 1; i >= 0 && hSpMusClas->buf_flux[i] >= 0; i-- ) + { + len++; + } + + /* reset flux buffer if percussive music is detected */ + if ( percus_flag == 1 ) + { + set_f( &hSpMusClas->buf_flux[BUF_LEN - len], 5, len ); + } + + /* calculate and buffer the tilt of residual LP analysis energies */ + ftmp = 0.00001f; + ftmp1 = 0; + for ( i = 1; i < 16; i++ ) + { + ftmp += epsP[i] * epsP[i]; + ftmp1 += epsP[i] * epsP[i + 1]; + } + + epsP_tilt = ftmp1 / ftmp; + + for ( i = 0; i < BUF_LEN - 1; i++ ) + { + hSpMusClas->buf_epsP_tilt[i] = hSpMusClas->buf_epsP_tilt[i + 1]; + } + hSpMusClas->buf_epsP_tilt[i] = epsP_tilt; + + /* calculate and buffer highband spectral peakness */ + tonal_dist( p2v_map, hSpMusClas->buf_pkh, hSpMusClas->buf_Ntonal, hSpMusClas->buf_Ntonal2, hSpMusClas->buf_Ntonal_lf ); + + /* buffer sum of correlation map */ + for ( i = 0; i < BUF_LEN - 1; i++ ) + { + hSpMusClas->buf_cor_map_sum[i] = hSpMusClas->buf_cor_map_sum[i + 1]; + } + hSpMusClas->buf_cor_map_sum[i] = cor_map_sum; + + /* buffer voicing metric */ + for ( i = 0; i < 9; i++ ) + { + hSpMusClas->buf_dlp[i] = hSpMusClas->buf_dlp[i + 1]; + } + hSpMusClas->buf_dlp[i] = hSpMusClas->lps - hSpMusClas->lpm; + + /* classification */ + dec = mode_decision( st, len, &hSpMusClas->dec_mov, hSpMusClas->buf_flux, hSpMusClas->buf_epsP_tilt, hSpMusClas->buf_pkh, hSpMusClas->buf_cor_map_sum, hSpMusClas->buf_Ntonal, hSpMusClas->buf_Ntonal2, hSpMusClas->buf_Ntonal_lf, hSpMusClas->buf_dlp ); + + /* update long term moving average of the classification decisions */ + if ( len > 30 ) + { + hSpMusClas->dec_mov = 0.97f * hSpMusClas->dec_mov + ( 1 - 0.97f ) * dec; + hSpMusClas->dec_mov1 = 0.97f * hSpMusClas->dec_mov1 + ( 1 - 0.97f ) * dec; + } + + /* update long-term unvoiced counter */ + if ( ( st->coder_type_raw == UNVOICED || st->coder_type_raw == INACTIVE ) && etot > 1.5f && hSpMusClas->buf_Ntonal2[59] < 2 ) + { + hSpMusClas->UV_cnt1 -= 8; + } + else + { + hSpMusClas->UV_cnt1++; + } + + if ( hSpMusClas->UV_cnt1 > 300 ) + { + hSpMusClas->UV_cnt1 = 300; + } + else if ( hSpMusClas->UV_cnt1 < 0 ) + { + hSpMusClas->UV_cnt1 = 0; + } + + hSpMusClas->LT_UV_cnt1 = 0.9f * hSpMusClas->LT_UV_cnt1 + 0.1f * hSpMusClas->UV_cnt1; + + /* revert classification decision due to long-term unvoiced counter */ + if ( dec == 1 && hSpMusClas->dec_mov1 < 0.2f && hSpMusClas->LT_UV_cnt1 < 200 ) + { + dec = 0; + } + + /* overwrite 1st stage speech/music decision to music */ + if ( dec == 1 ) + { + st->sp_aud_decision1 = 1; + } + + return; +} + + +/*---------------------------------------------------------------------* + * spec_analysis() + * + * Spectral analysis for mixed/music classification improvement + *---------------------------------------------------------------------*/ + +static void spec_analysis( + float *Bin_E, /* i : log energy spectrum of the current frame */ + float *p2v_map /* o : spectral peakiness map */ +) +{ + int16_t i, k, m; + float peak[L_FFT / 4 + 1]; + float valley[L_FFT / 4 + 1]; + int16_t peak_idx[L_FFT / 4 + 1]; + int16_t valey_idx[L_FFT / 4 + 1]; + float p2v[L_FFT / 4 + 1]; + + /* find spectral peaks */ + k = 0; + for ( i = 1; i < L_FFT / 2 - 2; i++ ) + { + if ( Bin_E[i] > Bin_E[i - 1] && Bin_E[i] > Bin_E[i + 1] ) + { + peak[k] = Bin_E[i]; + peak_idx[k] = i; + k++; + } + } + assert( k + 1 < L_FFT / 4 + 1 ); + peak_idx[k] = -1; + peak_idx[k + 1] = -1; + + if ( k == 0 ) + { + for ( i = 0; i < L_FFT / 2 - 1; i++ ) + { + p2v_map[i] = 0; + } + + return; + } + + /* find spectral valleys */ + m = 0; + if ( Bin_E[0] < Bin_E[1] ) + { + valley[0] = Bin_E[0]; + valey_idx[0] = 0; + m++; + } + + k = L_FFT / 2 - 2; + for ( i = L_FFT / 2 - 3; i >= 0 && Bin_E[i + 1] > Bin_E[i]; i-- ) + { + k = i; + } + + for ( i = 1; i < k; i++ ) + { + if ( Bin_E[i] < Bin_E[i - 1] && Bin_E[i] < Bin_E[i + 1] ) + { + valley[m] = Bin_E[i]; + valey_idx[m] = i; + m++; + } + } + + valley[m] = Bin_E[k]; + valey_idx[m] = k; + + /* find spectral peak to valley distances */ + k = 0; + for ( i = 0; i < m; i++ ) + { + if ( peak_idx[k] > valey_idx[i] && peak_idx[k] < valey_idx[i + 1] ) + { + p2v[k] = 2 * peak[k] - valley[i] - valley[i + 1]; + k++; + } + } + + for ( i = 0; i < L_FFT / 2 - 1; i++ ) + { + p2v_map[i] = 0; + } + + for ( i = 0; i < k; i++ ) + { + p2v_map[peak_idx[i]] = p2v[i]; + } + + return; +} + +/*---------------------------------------------------------------------* + * flux() + * + * Calculation of spectral flux + *---------------------------------------------------------------------*/ + +static void flux( + float *Bin_E, /* i : log energy spectrum of the current frame */ + float *p2v_map, /* i : spectral peakiness map */ + float *old_Bin_E, /* i/o: log energy spectrum of the frame 60ms ago */ + float *buf_flux, /* i/o: buffer storing spectral energy fluctuation */ + int16_t attack_hangover, /* i/o: hangover preventing flux buffering */ + float dec_mov /* i/o: moving average of classifier decision */ +) +{ + int16_t i; + float *pt1, *pt2, *pt3, *pt4, *pt5, *pt6; + float flux; + int16_t cnt; + + /* calculate flux */ + flux = 0; + cnt = 0; + for ( i = 0; i < N_OLD_BIN_E; i++ ) + { + if ( p2v_map[i] != 0 ) + { + flux += fabsf( Bin_E[i] - old_Bin_E[i] ); + cnt++; + } + } + + if ( cnt == 0 ) + { + flux = 5; + } + else + { + flux = flux / (float) cnt; + } + + if ( flux > 20 && dec_mov > 0.8f ) + { + flux = 20; + } + + /* update old Bin_E buffer */ + pt1 = old_Bin_E; + pt2 = old_Bin_E + N_OLD_BIN_E; + pt3 = Bin_E; + pt4 = old_Bin_E + N_OLD_BIN_E; + pt5 = old_Bin_E + 2 * N_OLD_BIN_E; + pt6 = old_Bin_E + 2 * N_OLD_BIN_E; + + for ( i = 0; i < N_OLD_BIN_E; i++ ) + { + *pt1++ = *pt2++; + *pt4++ = *pt5++; + *pt6++ = *pt3++; + } + + /* update flux buffer */ + if ( attack_hangover <= 0 ) + { + for ( i = 0; i < BUF_LEN - 1; i++ ) + { + buf_flux[i] = buf_flux[i + 1]; + } + + buf_flux[i] = flux; + } + + return; +} + + +/*---------------------------------------------------------------------* + * tonal_dist() + * + * Calculation of spectral distance + *---------------------------------------------------------------------*/ + +static void tonal_dist( + float *p2v_map, /* i : spectral peakiness map */ + float *buf_pkh, /* i/o: buffer storing highband spectral peakiness */ + float *buf_Ntonal, /* i/o: buffer storing No.of 1st spectral tone */ + float *buf_Ntonal2, /* i/o: buffer storing No.of 2nd spectral tone */ + float *buf_Ntonal_lf /* i/o: buffer storing low band spectral tone ratio */ +) +{ + int16_t i; + float pk; + int16_t Ntonal; + int16_t Ntonal2; + int16_t Ntonal_lf; + + /* find number of tonals, number of tonals at low-band, + spectral peakiness at high-band */ + pk = 0; + Ntonal = 0; + Ntonal2 = 0; + Ntonal_lf = 0; + for ( i = 0; i < 64; i++ ) + { + if ( p2v_map[i] > 55 ) + { + Ntonal++; + } + + if ( p2v_map[i] > 80 ) + { + Ntonal2++; + Ntonal_lf++; + } + } + + for ( i = 64; i < 127; i++ ) + { + if ( p2v_map[i] != 0 ) + { + pk += p2v_map[i]; + } + + if ( p2v_map[i] > 55 ) + { + Ntonal++; + } + + if ( p2v_map[i] > 80 ) + { + Ntonal2++; + } + } + + /* update buffers */ + for ( i = 0; i < BUF_LEN - 1; i++ ) + { + buf_pkh[i] = buf_pkh[i + 1]; + buf_Ntonal[i] = buf_Ntonal[i + 1]; + buf_Ntonal2[i] = buf_Ntonal2[i + 1]; + buf_Ntonal_lf[i] = buf_Ntonal_lf[i + 1]; + } + + buf_pkh[i] = pk; + buf_Ntonal[i] = (float) Ntonal; + buf_Ntonal2[i] = (float) Ntonal2; + buf_Ntonal_lf[i] = (float) Ntonal_lf; + + return; +} + + +/*---------------------------------------------------------------------* + * mode_decision() + * + * Decision about internal mode of the mixed/music classifier improvement + *---------------------------------------------------------------------*/ + +static int16_t mode_decision( + Encoder_State *st, + int16_t len, /* i : buffering status */ + float *dec_mov, /* i/o: moving average of classifier decision */ + float *buf_flux, /* i : buffer storing spectral energy fluctuation */ + float *buf_epsP_tilt, /* i : buffer storing LP prediciton error tilt */ + float *buf_pkh, /* i : buffer storing highband spectral peakiness */ + float *buf_cor_map_sum, /* i : buffer storing correlation map sum */ + float *buf_Ntonal, /* i : buffer storing No.of 1st spectral tone */ + float *buf_Ntonal2, /* i : buffer storing No.of 2nd spectral tone */ + float *buf_Ntonal_lf, /* i : buffer storing low band spectral tone ratio */ + float *buf_dlp /* i : buffer storing voicing estimate */ +) +{ + int16_t mode; + int16_t i; + int16_t voiced_cnt; + float M_pkh; + float M_cor_map_sum; + float M_Ntonal; + float M_flux; + float V_epsP_tilt; + float lf_Ntonal_ratio; + + mode = *dec_mov > 0.5f; + + if ( len <= 5 ) + { + return ( mode ); + } + else if ( len < 10 ) + { + M_pkh = mean( buf_pkh + BUF_LEN - len, len ); + M_cor_map_sum = mean( buf_cor_map_sum + BUF_LEN - len, len ); + M_Ntonal = mean( buf_Ntonal + BUF_LEN - len, len ); + V_epsP_tilt = var( buf_epsP_tilt + BUF_LEN - len, len ); + + voiced_cnt = 0; + for ( i = 9; i > 3; i-- ) + { + if ( buf_dlp[i] > 0.0f ) + { + voiced_cnt++; + } + } + + if ( ( M_pkh > 1100 || V_epsP_tilt < 0.00008f || M_cor_map_sum > 100 ) && voiced_cnt < 4 ) + { + mode = 1; + } + else if ( M_Ntonal > 27 && voiced_cnt < 4 ) + { + mode = 1; + } + } + else + { + voiced_cnt = 0; + for ( i = 0; i < 10; i++ ) + { + if ( buf_dlp[i] > 0.0f ) + { + voiced_cnt++; + } + } + + M_flux = mean( &buf_flux[BUF_LEN - 10], 10 ); + M_pkh = mean( buf_pkh + BUF_LEN - 10, 10 ); + M_cor_map_sum = mean( buf_cor_map_sum + BUF_LEN - 10, 10 ); + V_epsP_tilt = var( buf_epsP_tilt + BUF_LEN - 10, 10 ); + + if ( ( M_flux < 8.5f || ( V_epsP_tilt < 0.001f && M_flux < 12.0f ) || M_pkh > 1050 || M_cor_map_sum > 100 ) && voiced_cnt < 3 && mean( &buf_flux[55], 5 ) < 15 ) + { + mode = 1; + *dec_mov = 1; + return ( mode ); + } + + if ( M_flux > 16.0f || ( M_flux > 15 && voiced_cnt > 2 ) || mean( &buf_flux[55], 5 ) > 19.0f || ( buf_flux[59] >= 20 && st->hSpMusClas->lps - st->hSpMusClas->lpm > 0 ) ) + { + *dec_mov = 0; + mode = 0; + return ( mode ); + } + + for ( i = 10; i < len; i++ ) + { + M_flux = mean( &buf_flux[BUF_LEN - i], i ); + M_pkh = mean( buf_pkh + BUF_LEN - i, i ); + M_cor_map_sum = mean( buf_cor_map_sum + BUF_LEN - i, i ); + V_epsP_tilt = var( buf_epsP_tilt + BUF_LEN - i, i ); + + if ( ( ( M_flux < 12 + 0.05f * ( len - 10 ) && mean( &buf_flux[BUF_LEN - 10], 10 ) < 15 ) || V_epsP_tilt < 0.0001f + 0.000018f * ( len - 10 ) || M_pkh > 1050 - 5.0f * ( len - 10 ) || M_cor_map_sum > 95 - 0.3f * ( len - 10 ) ) && voiced_cnt < 3 ) + { + mode = 1; + return ( mode ); + } + } + + if ( len == BUF_LEN ) + { + M_Ntonal = mean( buf_Ntonal, BUF_LEN ); + lf_Ntonal_ratio = sum_f( buf_Ntonal_lf, BUF_LEN ) / ( sum_f( buf_Ntonal2, BUF_LEN ) + 0.0001f ); + + if ( M_Ntonal > 18 || lf_Ntonal_ratio < 0.2f ) + { + mode = 1; + } + else if ( M_Ntonal < 1 ) + { + mode = 0; + } + } + } + + return ( mode ); +} + + +/*----------------------------------------------------------------------------------* + * tonal_context_improv() + * + * Context-based improvement of 1st/2nd stage speech/music decision on stable tonal signals + *----------------------------------------------------------------------------------*/ + +static void tonal_context_improv( + Encoder_State *st, /* i/o: encoder state structure */ + const float PS[], /* i : energy spectrum */ + const float voi_fv, /* i : scaled voicing feature */ + const float cor_map_sum_fv, /* i : scaled correlation map feature */ + const float LPCErr /* i : scaled LP prediction error feature */ +) +{ + int16_t lt_pitch_diff; + float sort_max, sort_avg, sort_val[80]; + float tonality, tonality1, tonality2, tonality3, t2, t3, tL, err, cor, dft; + + SP_MUS_CLAS_HANDLE hSpMusClas = st->hSpMusClas; + + /* reset in case of codec mode switching */ + if ( st->last_codec_mode == MODE2 ) + { + set_f( hSpMusClas->tonality2_buf, 0, HANG_LEN_INIT ); + set_f( hSpMusClas->tonality3_buf, 0, HANG_LEN_INIT ); + set_f( hSpMusClas->LPCErr_buf, 0, HANG_LEN_INIT ); + hSpMusClas->lt_music_hangover = 0; + hSpMusClas->lt_music_state = 0; + hSpMusClas->lt_speech_state = 0; + hSpMusClas->lt_speech_hangover = 0; + } + + /* estimate maximum tonality in bands [0-1 kHz], [1-2kHz] and [2-4kHz] */ + mvr2r( PS, sort_val, 80 ); + + /* tonality in band 0-1 kHz */ + v_sort( sort_val, 0, 19 ); + sort_max = sort_val[19]; + sort_avg = sum_f( &sort_val[0], 10 ); + tonality1 = sort_max / sort_avg; + + /* tonality in band 1-2 kHz */ + v_sort( sort_val, 20, 39 ); + sort_max = sort_val[39]; + sort_avg = sum_f( &sort_val[20], 10 ); + tonality2 = sort_max / sort_avg; + + /* tonality in band 2-4 kHz */ + v_sort( sort_val, 40, 79 ); + sort_max = sort_val[79]; + sort_avg = sum_f( &sort_val[40], 20 ); + tonality3 = sort_max / sort_avg; + + tonality = max( max( tonality1, tonality2 ), tonality3 ); + + if ( st->hVAD->hangover_cnt == 10 && st->vad_flag == 1 ) + { + /* long-term voicing parameter */ + hSpMusClas->lt_voicing = 0.1f * hSpMusClas->lt_voicing + 0.9f * *st->voicing; + + /* long-term correlation value */ + hSpMusClas->lt_corr = 0.1f * hSpMusClas->lt_corr + 0.9f * st->old_corr; + + /* long-term tonality measure */ + hSpMusClas->lt_tonality = 0.1f * hSpMusClas->lt_tonality + 0.9f * tonality; + } + else + { + /* long-term voicing parameter */ + hSpMusClas->lt_voicing = 0.7f * hSpMusClas->lt_voicing + 0.3f * *st->voicing; + + /* long-term correlation value */ + hSpMusClas->lt_corr = 0.7f * hSpMusClas->lt_corr + 0.3f * st->old_corr; + + /* long-term tonality measure */ + hSpMusClas->lt_tonality = 0.5f * hSpMusClas->lt_tonality + 0.5f * tonality; + } + + /* pitch difference w.r.t to past 3 frames */ + lt_pitch_diff = (int16_t) abs( hSpMusClas->lt_corr_pitch[0] - st->pitch[0] ); + lt_pitch_diff += (int16_t) abs( hSpMusClas->lt_corr_pitch[1] - st->pitch[0] ); + lt_pitch_diff += (int16_t) abs( hSpMusClas->lt_corr_pitch[2] - st->pitch[0] ); + + hSpMusClas->lt_corr_pitch[0] = hSpMusClas->lt_corr_pitch[1]; + hSpMusClas->lt_corr_pitch[1] = hSpMusClas->lt_corr_pitch[2]; + hSpMusClas->lt_corr_pitch[2] = st->pitch[0]; + + hSpMusClas->lt_old_mode[0] = hSpMusClas->lt_old_mode[1]; + hSpMusClas->lt_old_mode[1] = hSpMusClas->lt_old_mode[2]; + + if ( st->sp_aud_decision1 == 1 && + ( min( min( tonality1, tonality2 ), tonality3 ) > 50.0f ) && + ( tonality1 + tonality2 > 200.0f && tonality2 + tonality3 > 200.0f && tonality1 + tonality3 > 200.0f ) && + ( hSpMusClas->lt_tonality < 20000.0f ) && + ( ( hSpMusClas->lt_tonality > 1000 && max( hSpMusClas->lt_voicing, *st->voicing ) > 0.99f ) || + ( hSpMusClas->lt_tonality > 1500 && hSpMusClas->lt_corr > 0.99f ) || + ( hSpMusClas->lt_tonality > 3000 && hSpMusClas->lowrate_pitchGain > 0.96f ) || + ( lt_pitch_diff == 0 && hSpMusClas->lowrate_pitchGain > 0.89f ) ) ) + { + if ( sum_s( hSpMusClas->lt_old_mode, 2 ) < 2 ) + { + /* probably speech - change the decision to speech */ + st->sp_aud_decision1 = 0; + st->sp_aud_decision2 = 0; + + if ( hSpMusClas->lt_hangover == 0 ) + { + hSpMusClas->lt_hangover = 6; + } + } + } + else + { + /* not speech, but still in the hangover period - change the decision to speech */ + if ( hSpMusClas->lt_hangover > 0 ) + { + st->sp_aud_decision1 = 0; + st->sp_aud_decision2 = 0; + hSpMusClas->lt_hangover--; + } + } + + /* calculate standard deviation of log-tonality */ + mvr2r( hSpMusClas->tonality2_buf + 1, hSpMusClas->tonality2_buf, HANG_LEN_INIT - 1 ); + hSpMusClas->tonality2_buf[HANG_LEN_INIT - 1] = 0.2f * log10f( tonality2 ); + t2 = std_dev( hSpMusClas->tonality2_buf, HANG_LEN_INIT ); + + mvr2r( hSpMusClas->tonality3_buf + 1, hSpMusClas->tonality3_buf, HANG_LEN_INIT - 1 ); + hSpMusClas->tonality3_buf[HANG_LEN_INIT - 1] = 0.2f * log10f( tonality3 ); + t3 = std_dev( hSpMusClas->tonality3_buf, HANG_LEN_INIT ); + + tL = 0.2f * log10f( hSpMusClas->lt_tonality ); + + /* calculate standard deviation of residual LP energy */ + mvr2r( hSpMusClas->LPCErr_buf + 1, hSpMusClas->LPCErr_buf, HANG_LEN_INIT - 1 ); + hSpMusClas->LPCErr_buf[HANG_LEN_INIT - 1] = LPCErr; + err = std_dev( hSpMusClas->LPCErr_buf, HANG_LEN_INIT ); + + cor = max( voi_fv - cor_map_sum_fv, 0.0f ); + dft = 0.2f * fabsf( log10f( tonality2 ) - log10f( tonality3 ) ); + + /* state machine for strong music */ + if ( st->sp_aud_decision1 == 1 && hSpMusClas->lt_music_state == 0 && hSpMusClas->lt_music_hangover == 0 && + t2 < 0.54f && t2 > 0.26f && t3 > 0.22f && tL < 0.54f && tL > 0.26f && err > 0.5f ) + { + hSpMusClas->lt_music_state = 1; + hSpMusClas->lt_music_hangover = 6; + } + else if ( hSpMusClas->lt_music_state == 1 && hSpMusClas->lt_music_hangover == 0 && t2 < 0.34 && t3 < 0.26f && tL < 0.45f ) + { + hSpMusClas->lt_music_state = 0; + hSpMusClas->lt_music_hangover = 6; + } + + if ( hSpMusClas->lt_music_hangover > 0 ) + { + hSpMusClas->lt_music_hangover--; + } + + /* state machine for strong speech */ + if ( st->sp_aud_decision1 == 1 && hSpMusClas->lt_speech_state == 0 && hSpMusClas->lt_speech_hangover == 0 && + cor > 0.40f && dft < 0.1f && voi_fv > 2 * cor_map_sum_fv + 0.12f && + t2 < cor && t3 < cor && tL < cor && cor_map_sum_fv < cor && voi_fv > cor && voi_fv > 0.76f ) + { + hSpMusClas->lt_speech_state = 1; + hSpMusClas->lt_speech_hangover = 6; + } + else if ( hSpMusClas->lt_speech_state == 1 && hSpMusClas->lt_speech_hangover == 0 && cor < 0.40f ) + { + hSpMusClas->lt_speech_state = 0; + hSpMusClas->lt_speech_hangover = 6; + } + + if ( hSpMusClas->lt_speech_hangover > 0 ) + { + hSpMusClas->lt_speech_hangover--; + } + + /* final decision */ + if ( st->sp_aud_decision1 == 1 && hSpMusClas->lt_speech_state == 1 ) + { + /* strong speech - probably error in speech/music classification */ + st->sp_aud_decision1 = 0; + st->sp_aud_decision2 = 0; + } + else if ( st->sp_aud_decision1 == 0 && hSpMusClas->lt_music_state == 1 ) + { + /* strong music - probably error in speech/music classification */ + st->sp_aud_decision1 = 1; + st->sp_aud_decision2 = 1; + } + + /* update the buffer of past decisions */ + hSpMusClas->lt_old_mode[2] = st->sp_aud_decision1; + + return; +} + +/*---------------------------------------------------------------------* + * detect_sparseness() + * + * + *---------------------------------------------------------------------*/ + +static void detect_sparseness( + Encoder_State *st, /* i/o: encoder state structure */ + const int16_t localVAD_HE_SAD, /* i : HE-SAD flag without hangover */ + const float voi_fv /* i : scaled voicing feature */ +) +{ + float sum; + float ftmp; + float ftmp1; + float S1[128]; + int16_t i, j; + int16_t hb_sp_high_flag = 0; + int16_t lb_sp_high_flag = 0; + float sumh; + float sparse; + float tmp_buf[4]; + float Mlpe = 0.0f; + float Mv = 0.0f; + float Msp; + + SP_MUS_CLAS_HANDLE hSpMusClas = st->hSpMusClas; + + mvr2r( st->Bin_E, S1, 128 ); + + sum = 0; + for ( i = 0; i < 80; i++ ) + { + if ( S1[i] < 0 ) + { + S1[i] = 0; + } + sum += S1[i]; + } + + sumh = 0; + for ( i = 80; i < 128; i++ ) + { + if ( S1[i] < 0 ) + { + S1[i] = 0; + } + sumh += S1[i]; + } + + sum += sumh; + + /* order spectral from max to min */ + order_spectrum( S1, 128 ); + + /* calculate spectral sparseness in the range 0 - 6.4 kHz */ + j = 0; + ftmp = 0.0f; + ftmp1 = 0.75f * sum; + for ( i = 0; i < 128; i++ ) + { + ftmp += S1[i]; + if ( ftmp > ftmp1 ) + { + j = i; + break; + } + } + + for ( i = 0; i < HANG_LEN_INIT - 1; i++ ) + { + hSpMusClas->sparse_buf[i] = hSpMusClas->sparse_buf[i + 1]; + } + + sparse = (float) j; + hSpMusClas->sparse_buf[i] = sparse; + + if ( st->bwidth == WB ) + { + Msp = mean( hSpMusClas->sparse_buf, 8 ); + + /* find long-term smoothed sparseness */ + if ( hSpMusClas->last_vad_spa == 0 ) + { + set_f( &hSpMusClas->sparse_buf[0], sparse, HANG_LEN_INIT - 1 ); + hSpMusClas->LT_sparse = sparse; + } + else + { + set_f( tmp_buf, 0.0f, 4 ); + + for ( i = 0; i < HANG_LEN_INIT; i++ ) + { + for ( j = 0; j < 4; j++ ) + { + if ( hSpMusClas->sparse_buf[i] > tmp_buf[j] ) + { + mvr2r( &tmp_buf[j], &tmp_buf[j + 1], 3 - j ); + tmp_buf[j] = hSpMusClas->sparse_buf[i]; + break; + } + } + } + + ftmp = 0.25f * ( HANG_LEN_INIT * Msp - sum_f( tmp_buf, 4 ) ) - hSpMusClas->LT_sparse; + + hSpMusClas->LT_sparse = hSpMusClas->LT_sparse + 0.25f * ftmp; + } + + /* find high-band sparseness */ + mvr2r( st->Bin_E + 80, S1, 48 ); + order_spectrum( S1, 48 ); + + for ( i = 0; i < HANG_LEN_INIT - 1; i++ ) + { + hSpMusClas->hf_spar_buf[i] = hSpMusClas->hf_spar_buf[i + 1]; + } + hSpMusClas->hf_spar_buf[i] = sum_f( S1, 5 ) / ( sumh + 0.1f ); + if ( mean( hSpMusClas->hf_spar_buf, 8 ) > 0.2f ) + { + hb_sp_high_flag = 1; + } + + /* find low-band sparseness */ + mvr2r( st->Bin_E, S1, 60 ); + order_spectrum( S1, 60 ); + + if ( sum_f( S1, 5 ) / sum_f( S1, 60 ) > 0.18f ) + { + lb_sp_high_flag = 1; + } + + /* find smoothed linear prediction efficiency */ + for ( i = 0; i < 7; i++ ) + { + hSpMusClas->lpe_buf[i] = hSpMusClas->lpe_buf[i + 1]; + } + + hSpMusClas->lpe_buf[i] = hSpMusClas->past_epsP2; + Mlpe = mean( hSpMusClas->lpe_buf, 8 ); + + /* find smoothed voicing */ + for ( i = 0; i < HANG_LEN_INIT - 1; i++ ) + { + hSpMusClas->voicing_buf[i] = hSpMusClas->voicing_buf[i + 1]; + } + + hSpMusClas->voicing_buf[i] = voi_fv; + Mv = mean( hSpMusClas->voicing_buf, 8 ); + } + + /* avoid using LR-MDCT on sparse spectra */ + if ( st->sp_aud_decision1 == 1 ) + { + if ( st->bwidth == WB ) + { + ftmp = 90; + } + else + { + ftmp = 91; + } + if ( sparse > ftmp ) + { + st->sp_aud_decision1 = 0; + st->sp_aud_decision2 = 1; + hSpMusClas->gsc_hangover = 1; + } + else if ( hSpMusClas->gsc_hangover == 1 ) + { + if ( sparse > 85 ) + { + st->sp_aud_decision1 = 0; + st->sp_aud_decision2 = 1; + } + else if ( fabs( sparse - mean( &hSpMusClas->sparse_buf[HANG_LEN_INIT - 1 - hSpMusClas->gsc_cnt], hSpMusClas->gsc_cnt ) ) < 7.0f ) + { + st->sp_aud_decision1 = 0; + st->sp_aud_decision2 = 1; + } + } + + if ( st->bwidth == WB ) + { + if ( hSpMusClas->LT_sparse > 60 && sparse > 50 && Mlpe < -1.3f && Mv > 0.85f && + lb_sp_high_flag == 0 && ( ( hb_sp_high_flag == 0 && sumh > 0.15f * sum ) || sumh <= 0.15f * sum ) ) + { + st->sp_aud_decision1 = 0; + st->sp_aud_decision2 = 1; + hSpMusClas->gsc_hangover = 1; + } + else if ( hSpMusClas->gsc_hangover == 1 && !( st->sp_aud_decision1 == 0 && st->sp_aud_decision2 == 1 ) ) + { + if ( fabs( sparse - mean( &hSpMusClas->sparse_buf[HANG_LEN_INIT - 1 - hSpMusClas->gsc_cnt], hSpMusClas->gsc_cnt ) ) < 7.0f ) + { + st->sp_aud_decision1 = 0; + st->sp_aud_decision2 = 1; + } + } + } + } + + /* update the counter of consecutive GSC frames with sparse spectrum */ + if ( st->sp_aud_decision1 == 0 && st->sp_aud_decision2 == 1 ) + { + ( hSpMusClas->gsc_cnt )++; + if ( hSpMusClas->gsc_cnt > 7 ) + { + hSpMusClas->gsc_cnt = 7; + } + } + else + { + hSpMusClas->gsc_cnt = 0; + hSpMusClas->gsc_hangover = 0; + } + + hSpMusClas->last_vad_spa = localVAD_HE_SAD; + + return; +} + + +/*---------------------------------------------------------------------* + * order_spectrum() + * + * + *---------------------------------------------------------------------*/ + +static void order_spectrum( + float *vec, + const int16_t len ) +{ + int16_t i, j, imax, imin; + float temp; + + for ( i = 0; i < len / 2; i++ ) + { + imax = i; + imin = i; + for ( j = i; j < len - i; j++ ) + { + if ( vec[j] > vec[imax] ) + { + imax = j; + } + else + { + if ( vec[j] < vec[imin] ) + { + imin = j; + } + } + } + + temp = vec[i]; + vec[i] = vec[imax]; + vec[imax] = temp; + + if ( imin == i ) + { + imin = imax; + } + + temp = vec[len - i - 1]; + vec[len - i - 1] = vec[imin]; + vec[imin] = temp; + } + + return; +} diff --git a/lib_enc/stat_enc.h b/lib_enc/stat_enc.h new file mode 100644 index 0000000000000000000000000000000000000000..5c37656b711b5573ddeffdcbc6758c4c2ddf6849 --- /dev/null +++ b/lib_enc/stat_enc.h @@ -0,0 +1,1571 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#ifndef STAT_ENC_H +#define STAT_ENC_H + +#include +#include "options.h" +#include "stat_com.h" +#include "cnst.h" +#include "ivas_cnst.h" + +/*------------------------------------------------------------------------------------------* + * Indice + *------------------------------------------------------------------------------------------*/ + +typedef struct +{ + int16_t id; /* id of the indice */ + uint16_t value; /* value of the quantized indice */ + int16_t nb_bits; /* number of bits used for the quantization of the indice */ +} Indice, *INDICE_HANDLE; + +/*----------------------------------------------------------------------------------* + * Bitstream structure + *----------------------------------------------------------------------------------*/ + +typedef struct bitstream_enc_data_structure +{ + int16_t nb_ind_tot; /* total number of indices already written */ + int16_t nb_bits_tot; /* total number of bits already written */ + Indice *ind_list; /* list of indices */ + int16_t *ivas_max_num_indices; /* maximum total number of indices in the list */ + Indice **ivas_ind_list_zero; /* beginning of the buffer of indices */ + void *st_ivas; /* IVAS encoder structure */ +} BSTR_ENC_DATA, *BSTR_ENC_HANDLE; + +/*----------------------------------------------------------------------------------* + * General Signal buffers structure + *----------------------------------------------------------------------------------*/ + +typedef struct signal_buffers_enc_data_structure +{ + float input_buff[L_FRAME48k + L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS )]; + + float Bin_E_old[L_FFT / 2]; /* per bin energy of old 2nd frames */ + float mem_decim[2 * L_FILT_MAX]; /* decimation filter memory */ + float mem_decim16k[2 * L_FILT_MAX]; /* ACELP@16kHz - decimation filter memory @16kHz */ + float old_inp_12k8[L_INP_MEM]; /* memory of input signal at 12.8kHz */ + float old_inp_16k[L_INP_MEM]; /* ACELP@16kHz - memory of input signal @16 kHz */ + float buf_speech_enc_pe[L_PAST_MAX_32k + L_FRAME32k + L_NEXT_MAX_32k]; + float buf_synth[OLD_SYNTH_SIZE_ENC + L_FRAME32k]; /* can be reduced to PIT_MAX_MAX+L_FRAME_MAX if no rate switching */ + float buf_speech_enc[L_PAST_MAX_32k + L_FRAME32k + L_NEXT_MAX_32k]; + float buf_wspeech_enc[L_FRAME16k + L_SUBFR + L_FRAME16k + L_NEXT_MAX_16k + 320]; /* increased by 320 to avoid memory overlap in find_wsp() and also to accomodate for the wspeech_enc */ + +} SIGNAL_BUFFERS_ENC_DATA, *SIGNAL_BUFFERS_ENC_HANDLE; + + +/*------------------------------------------------------------------------------------------* + * Transient Detection structures + *------------------------------------------------------------------------------------------*/ + +/* Delay buffer: Used to buffer input samples and to define the subblock size of a transient detector. */ +typedef struct +{ + int16_t nSubblockSize; /* Subblock size of a transient detector that uses this delay buffer. */ + float buffer[L_FRAME_MAX / NSUBBLOCKS]; /* Delay buffer */ + int16_t nDelay; /* Size of the delay buffer in use. Maximum delay from all users of this buffer. */ + +} DelayBuffer; + +/* Subblock energies: Holds subblock energies and recursively accumulated energies. Also buffers the energies. */ +typedef struct +{ + DelayBuffer *pDelayBuffer; /* Delay buffer. */ + float subblockNrg[NSUBBLOCKS + MAX_TD_DELAY]; /* Subblock energies with a delay buffering. */ + float accSubblockNrg[NSUBBLOCKS + MAX_TD_DELAY + 1]; /* Recursively accumulated subblock energies with a delay buffering. + At index i the value corresponds to the accumulated subblock energy up to i-1, + including block i-1 and without block i. */ + float subblockNrgChange[NSUBBLOCKS + MAX_TD_DELAY]; /* subblockNrgChange[i] = max(subblockNrg[i]/subblockNrg[i-1], subblockNrg[i-1]/subblockNrg[i]) */ + int16_t nDelay; /* Size of the delay buffer in use, as number of subblocks. Maximum delay from all users of this buffer. */ + int16_t nPartialDelay; /* Delay of the input (modulo pDelayBuffer->nSubblockSize), nPartialDelay <= pDelayBuffer->nDelay. */ + + /* Decay factor for the recursive accumulation */ + float facAccSubblockNrg; + + /* High-pass filter states (delay line) */ + float firState1; + float firState2; + + uint16_t ramp_up_flag; /* bit map flags to indicate a ramp up in beginning of TCX frame */ + +} SubblockEnergies; + + +/* Attack detection function. */ +typedef void ( *TCheckSubblocksForAttack )( const float *pSubblockNrg, const float *pAccSubblockNrg, int16_t nSubblocks, int16_t nPastSubblocks, float attackRatioThreshold, int16_t *pbIsAttackPresent, int16_t *pAttackIndex ); + +/* Transient detector. */ +typedef struct TransientDetector +{ + SubblockEnergies *pSubblockEnergies; /* Subblock energies used in this transient detector. */ + int16_t nDelay; /* Delay of the transient detector in number of subblocks, nDelay <= pSubblockEnergies->nDelay. */ + int16_t nSubblocksToCheck; /* Number of subblocks to check for transients. */ + TCheckSubblocksForAttack CheckSubblocksForAttack; /* Function for checking a presence of an attack. */ + float attackRatioThreshold; /* Attack ratio threshold. */ + int16_t bIsAttackPresent; /* True when an attack was detected. */ + int16_t prev_bIsAttackPresent; /* True if an attack was detected in the previous frame. */ + int16_t attackIndex; /* The index of an attack. */ +} TransientDetector; + +/* Transient detection: Holds all transient detectors and buffers used by them. */ +typedef struct TransientDetection_structure +{ + TransientDetector transientDetector; /* Transient detector. */ + DelayBuffer delayBuffer; /* Delay buffer used by the transient detectors. */ + SubblockEnergies subblockEnergies; /* Subblock energies used by the transient detector. */ + +} TRAN_DET_DATA, *TRAN_DET_HANDLE; + + +/*------------------------------------------------------------------------------------------* + * VAD structures + *------------------------------------------------------------------------------------------*/ + +typedef struct vad_structure +{ + int16_t nb_active_frames; + int16_t hangover_cnt; + int16_t nb_active_frames_he; + int16_t hangover_cnt_he; + int32_t vad_flag_reg_H; + int32_t vad_flag_reg_L; + int32_t vad_prim_reg; + + int16_t vad_flag_cnt_50; + int16_t vad_prim_cnt_16; + + int16_t hangover_cnt_dtx; + int16_t hangover_cnt_music; + + float bcg_flux; + int16_t soft_hangover; + int16_t voiced_burst; + int16_t bcg_flux_init; + int16_t nb_active_frames_he1; + int16_t hangover_cnt_he1; + + float prim_act_quick; /* Noise estimator - primary activity quick */ + float prim_act_slow; /* Noise estimator - primary activity slow */ + float prim_act; /* Noise estimator - primary activity slow rise quick fall */ + float prim_act_quick_he; /* Noise estimator - primary activity quick */ + float prim_act_slow_he; /* Noise estimator - primary activity slow */ + float prim_act_he; /* Noise estimator - primary activity slow rise quick fall */ + + int16_t spectral_tilt_reset; + int16_t consec_inactive; + float ra_deltasum; + int16_t trigger_SID; + float running_avg; + float snr_sum_vad; + + int16_t hangover_terminate_flag; /* CNG and DTX - flag indicating whether to early terminate DTX hangover */ + int16_t vad_flag; /* VAD flag */ + +} VAD_DATA, *VAD_HANDLE; + + +typedef struct cldfb_vad_structure +{ + int16_t bw_index; /* index of band width */ + + /* feature */ + float sp_center[SP_CENTER_NUM]; /* spectral center*/ + float ltd_stable_rate[STABLE_NUM]; /* time-domain stable rate*/ + float sfm[SFM_NUM]; /* spectral flatness*/ + float f_tonality_rate[TONA_NUM]; /* tonality rate*/ + float frame_sb_energy[BG_ENG_NUM]; /* energy of sub-band divided non-uniformly*/ + float frames_power[POWER_NUM]; /* energy of several frames*/ + float pre_spec_low_dif[PRE_SPEC_DIF_NUM]; /* low frequency spectral different*/ + float t_bg_energy; /* time background energy of several frames*/ + float t_bg_energy_sum; /* number of time background energy*/ + int16_t tbg_energy_count; /* sum of time background energy of several frames*/ + int16_t bg_update_count; /* time of background update*/ + float frame_energy_smooth; /* smoothed energy of several frames*/ + + /* history parameters */ + float smooth_spec_amp[SPEC_AMP_NUM]; /* smoothed spectral amplitude*/ + float sb_bg_energy[BG_ENG_NUM]; /* sub-band background energy*/ + float pre_snr[PRE_SNR_NUM]; /* previous time SNR*/ + float lt_snr_org; /* original long time SNR*/ + float lf_snr_smooth; /* smoothed lf_snr*/ + float l_silence_snr; /* sum of snr's of non active frames*/ + float l_speech_snr; /* sum of snr's of active frames*/ + int16_t l_silence_snr_count; /* number of non active frames*/ + int16_t l_speech_snr_count; /* number of active frames*/ + float fg_energy; /* foreground energy sum */ + float bg_energy; /* background energy sum */ + int16_t fg_energy_count; /* number of the foreground energy frame */ + int16_t bg_energy_count; /* number of the background energy frame */ + int16_t fg_energy_est_start; /* flag by that indicate whether if estimate energy*/ + int16_t speech_flag; /* residual number of hangover 1 */ + int16_t continuous_noise_num; /* time of continuous noise frames*/ + int16_t continuous_speech_num; /* time of continuous speech frames*/ + int16_t continuous_speech_num2; /* time 2 of continuous speech frames*/ + int16_t frameloop; /* number of frame*/ + float tonality_rate3; /* tonality rate*/ + float music_background_rate; /* music background rate*/ + float lt_noise_sp_center_diff_sum; /* different sum of long time noise sp_center*/ + float lt_noise_sp_center_diff_counter; /* number of the member lt_noise_sp_center_diff_sum*/ + float lt_noise_sp_center0; /* long time noise sp_center0*/ + float lt_noise_sp_center3; /* long time noise sp_center3*/ + float lt_bg_highf_eng; /* average of long time high frequency energy*/ + int16_t update_num_with_snr; /* the number of the background update with SNR*/ + int16_t update_count; + int16_t warm_hang_num; /* the number of hangover for warm up*/ + int16_t vad_flag_for_bk_update; + +} T_CldfbVadState, *VAD_CLDFB_HANDLE; + + +/*------------------------------------------------------------------------------------------* + * DTX and TD CNG structure + *------------------------------------------------------------------------------------------*/ + +typedef struct td_cng_enc_structure +{ + int16_t lp_cng_mode2; + + float lp_ener; /* CNG and DTX - low-pass filtered energy for CNG */ + int16_t cng_seed; /* CNG and DTX - seed for white noise random generator */ + int16_t old_enr_index; /* CNG and DTX - index of last encoded CNG energy */ + float Enew; /* CNG and DTX - CNG target residual energy */ + int16_t cng_hist_ptr; /* CNG and DTX - pointer for averaging buffers */ + float cng_lsp_hist[DTX_HIST_SIZE * M]; /* CNG and DTX - old LSP buffer for averaging */ + float cng_ener_hist[DTX_HIST_SIZE]; /* CNG and DTX - log energy buffer for averaging */ + int16_t cng_ener_seed; /* CNG and DTX - seed for random generator for variation of excitation energy */ + int16_t cng_ener_seed1; + float lp_sp_enr; + int16_t last_allow_cn_step; + int16_t ho_hist_size; /* CNG and DTX - size of DTX hangover history buffer for averaging, <0,HO_HIST_SIZE> */ + int16_t ho_hist_ptr; /* CNG and DTX - pointer for averaging buffers */ + int32_t ho_sid_bw; /* CNG and DTX - SID bandwidth flags */ + float ho_lsp_hist[HO_HIST_SIZE * M]; /* CNG and DTX - old LSP buffer for averaging */ + float ho_ener_hist[HO_HIST_SIZE]; /* CNG and DTX - energy buffer for averaging */ + float ho_env_hist[HO_HIST_SIZE * NUM_ENV_CNG]; + int16_t act_cnt; /* CNG and DTX - counter of active frames */ + int16_t ho_circ_size; /* CNG and DTX - size of DTX hangover history buffer for averaging, <0,HO_HIST_SIZE> */ + int16_t ho_circ_ptr; /* CNG and DTX - pointer for averaging buffers */ + float ho_lsp_circ[HO_HIST_SIZE * M]; /* CNG and DTX - old LSP buffer for averaging */ + float ho_ener_circ[HO_HIST_SIZE]; /* CNG and DTX - energy buffer for averaging */ + float ho_env_circ[HO_HIST_SIZE * NUM_ENV_CNG]; + int16_t burst_ho_cnt; /* CNG and DTX - counter of hangover frames at end of active burst */ + int16_t cng_buf_cnt; /* CNG and DTX - Counter of buffered CNG parameters */ + float cng_exc2_buf[HO_HIST_SIZE * L_FFT]; /* CNG and DTX - exc2 buffer for storing */ + int32_t cng_brate_buf[HO_HIST_SIZE]; /* CNG and DTX - buffer for storing last_active_brate */ + float CNG_att; /* CNG and DTX - attenuation factor for CNG, in dB */ + int16_t ho_16k_lsp[HO_HIST_SIZE]; /* CNG and DTX - 16k LSPs flags */ + int16_t act_cnt2; /* CNG and DTX - counter of active frames for CNG_mode switching */ + float ho_lsp_circ2[HO_HIST_SIZE * M]; /* CNG and DTX - second buffer of LSPs */ + int16_t num_ho; /* CNG and DTX - number of selected hangover frames */ + float old_env[NUM_ENV_CNG]; + float lp_env[NUM_ENV_CNG]; + float cng_res_env[NUM_ENV_CNG * HO_HIST_SIZE]; + float exc_mem[24]; + float exc_mem1[30]; + float exc_mem2[30]; + + + /* SWB DTX/CNG parameters */ + int16_t last_vad; + float last_wb_cng_ener; + float last_shb_cng_ener; + float mov_wb_cng_ener; + float mov_shb_cng_ener; + int16_t last_idx_ener; + int16_t shb_cng_ini_cnt; + int16_t last_SID_bwidth; + int16_t shb_NO_DATA_cnt; + +} TD_CNG_ENC_DATA, *TD_CNG_ENC_HANDLE; + + +/*------------------------------------------------------------------------------------------* + * FD CNG arrays and variables + *------------------------------------------------------------------------------------------*/ + +typedef struct fd_cng_enc_structure +{ + HANDLE_FD_CNG_COM hFdCngCom; + + float msPeriodog[NPART]; /* Periodogram */ + float msBminWin[NPART]; + float msBminSubWin[NPART]; + float msPsd[NPART]; /* Power Spectral Density estimate (i.e., smoothed periodogram) */ + float msAlpha[NPART]; /* Optimal smoothing parameter */ + float msMinBuf[MSNUMSUBFR * NPART]; /* Buffer of minima */ + float msCurrentMinOut[NPART]; + float msCurrentMin[NPART]; + float msCurrentMinSubWindow[NPART]; + int16_t msLocalMinFlag[NPART]; + int16_t msNewMinFlag[NPART]; + float msPsdFirstMoment[NPART]; + float msPsdSecondMoment[NPART]; + float msNoiseFloor[NPART]; /* Estimated noise floor */ + float msNoiseEst[NPART]; /* Estimated noise level */ + float energy_ho[NPART]; + float msNoiseEst_old[NPART]; + float msLogPeriodog[NPART]; /* Periodogram */ + float msLogNoiseEst[NPART]; /* Estimated noise level */ + + float msPeriodogBuf[MSBUFLEN * NPART]; + int16_t msPeriodogBufPtr; + + int16_t stopFFTbinDec; + int16_t startBandDec; + int16_t stopBandDec; + int16_t npartDec; + int16_t midbandDec[NPART]; + int16_t nFFTpartDec; + int16_t partDec[NPART]; + + float mem_coherence[4]; + +} FD_CNG_ENC, *HANDLE_FD_CNG_ENC; + +/*------------------------------------------------------------------------------------------* + * Structure for DTX-related variables used in both FD- and TD-CNG + *------------------------------------------------------------------------------------------*/ + +typedef struct dtx_enc_structure +{ + int16_t cnt_SID; /* CNG and DTX - counter of SID update for the interop. mode or DTX, if enabled */ + int16_t first_CNG; /* CNG and DTX - first CNG frame flag */ + int16_t cng_cnt; /* CNG and DTX - counter of CNG frames for averaging */ + int16_t max_SID; /* CNG and DTX - max allowed number of CNG FRAME_NO_DATA frames */ + int16_t CNG_mode; /* CNG and DTX - mode for DTX configuration */ + float lspCNG[M]; /* CNG and DTX - LP filtered ISPs */ + int16_t VarDTX_cnt_voiced; /* CNG and DTX - counter for variable DTX activation (speech) */ + int16_t VarDTX_cnt_noise; /* CNG and DTX - counter for variable DTX activation (noise) */ + float lt_ener_voiced; /* CNG and DTX - long-term energy of signal (measured on voiced parts) */ + float lt_ener_noise; /* CNG and DTX - long-term energy of background noise */ + float frame_ener; + int16_t cng_hist_size; /* CNG and DTX - size of CNG history buffer for averaging, <0,DTX_HIST_SIZE> */ + float lt_ener_last_SID; /* CNG and DTX - long-term energy of last SID frame */ + int16_t last_CNG_L_frame; /* CNG and DTX - last CNG frame length */ + int16_t var_SID_rate_flag; /* CNG and DTX - flag for variable SID rate */ + int16_t interval_SID; /* CNG and DTX - interval of SID update, default 8 */ + int32_t last_active_brate; /* CNG and DTX - last active frame bitrate used for CNG_mode control */ + +} DTX_ENC_DATA, *DTX_ENC_HANDLE; + + +/*----------------------------------------------------------------------------------* + * IGF structures + *----------------------------------------------------------------------------------*/ + +typedef struct igfscfenc_public_data_struct +{ + int16_t ptrBitIndex; + int16_t bitCount; + int16_t prev[64]; /* no more than 64 SCFs for the IGF energy envelope of one block */ + int16_t prevSave[64]; + int16_t scfCountLongBlock[IGF_NOF_GRIDS]; + int16_t t; + int16_t Tsave; + int16_t contex_saved; + const uint16_t *cf_se00; + const uint16_t *cf_se01; + int16_t cf_off_se01; + const uint16_t *cf_se02; + const int16_t *cf_off_se02; + const uint16_t *cf_se10; + int16_t cf_off_se10; + const uint16_t *cf_se11; + const int16_t *cf_off_se11; + Tastat acState; + +} IGFSCFENC_INSTANCE, *IGFSCFENC_INSTANCE_HANDLE; + + +typedef struct igf_enc_private_data_struct +{ + IGF_INFO igfInfo; + int16_t igfScfQuantized[IGF_MAX_SFB]; + IGFSCFENC_INSTANCE hIGFSCFArithEnc; + + float prevSFM_FIR_SFB_TB[IGF_MAX_SFB]; + float prevSFM_IIR_SFB_TB[IGF_MAX_SFB]; + float prevSFM_FIR_SFB_SB[IGF_MAX_SFB]; + float prevSFM_IIR_SFB_SB[IGF_MAX_SFB]; + int16_t logSpec[L_FRAME_PLUS]; + + float prevDampingFactor_IIR[IGF_MAX_SFB]; + int16_t dampingFactorSmoothing[IGF_MAX_SFB]; + float SFM_tb[IGF_MAX_SFB]; + float SFM_sb[IGF_MAX_SFB]; + + int16_t igfCurrWhiteningLevel[IGF_MAX_TILES]; + int16_t igfPrevWhiteningLevel[IGF_MAX_TILES]; + int16_t igfWhiteningHangoverCnt[IGF_MAX_TILES]; + float igfPastSFM[IGF_MAX_TILES][IGF_PAST_SFM_LEN]; + int16_t igfPastSFM_pos; + + float prevSFM_FIR[IGF_MAX_TILES]; + float prevSFM_IIR[IGF_MAX_TILES]; + int16_t wasTransient; + + UWord8 igfBitstream[IGF_BITBUFSIZE / 8]; + int16_t igfBitstreamBits; + +} IGF_ENC_PRIVATE_DATA, *IGF_ENC_PRIVATE_DATA_HANDLE; + + +typedef struct igf_enc_instance_struct +{ + IGF_ENC_PRIVATE_DATA igfData; + int32_t infoSamplingRate; + int16_t infoStartFrequency; + int16_t infoStopFrequency; + int16_t infoStartLine; + int16_t infoStopLine; + int16_t infoTotalBitsWritten; + int16_t infoTotalBitsPerFrameWritten; + int16_t flatteningTrigger; + float spec_be_igf[N_MAX_TCX - IGF_START_MN]; + float tns_predictionGain; + +} IGF_ENC_INSTANCE, *IGF_ENC_INSTANCE_HANDLE; + + +/*----------------------------------------------------------------------------------* + * Noise estimation structure + *----------------------------------------------------------------------------------*/ + +typedef struct noise_estimation_structure +{ + float fr_bands1[NB_BANDS]; /* spectrum per critical bands of the previous frame */ + float fr_bands2[NB_BANDS]; /* spectrum per critical bands 2 frames ago */ + + float old_S[L_FFT / 2]; /* Tonal detector - prev. log-energy spectrum with subtracted floor */ + float cor_map[L_FFT / 2]; /* Tonal detector - LT correlation map */ + float noise_char; /* Tonal detector - LT noise character */ + float ave_enr2[NB_BANDS]; /* Tonal detector - LT average E per crit. band (for non_sta2) */ + float act_pred; /* Tonal detector - prediction of speech activity from 0 to 1 (0-inactive, 1-active) */ + float multi_harm_limit; /* Tonal detector - adaptive threshold */ + float enrO[NB_BANDS]; /* Noise estimator - previous energy per critical band */ + float bckr[NB_BANDS]; /* Noise estimator - background noise estimation per critical band */ + float ave_enr[NB_BANDS]; /* Noise estimator - long-term average energy per critical band */ + int16_t aEn; /* Noise estimator - noise estimator adaptation flag */ + float totalNoise; /* Noise estimator - total noise energy */ + int16_t first_noise_updt; /* Noise estimator - flag used to determine if the first noise update frame */ + int16_t first_noise_updt_cnt; /* Noise estimator - counter of frame after first noise update */ + int16_t harm_cor_cnt; /* Noise estimator - 1st memory counter of harm or correlation frame */ + int16_t bg_cnt; /* Noise estimator - pause length counter */ + float Etot_l; /* Noise estimator - Track energy from below */ + float Etot_h; /* Noise estimator - Track energy from above */ + float Etot_l_lp; /* Noise estimator - Smoothed low energy */ + float Etot_last; /* Noise estimator - Energy of last frame */ + float Etot_lp; /* Noise estimator - Filtered input energy */ + float lt_tn_track; + float lt_tn_dist; + float lt_Ellp_dist; + float lt_haco_ev; + int16_t low_tn_track_cnt; + float epsP_0_2_lp; + float epsP_0_2_ad_lp; + float epsP_2_16_lp; + float epsP_2_16_lp2; + float epsP_2_16_dlp_lp; + float epsP_2_16_dlp_lp2; + float lt_aEn_zero; + + float Etot_v_h2; + float sign_dyn_lp; + float Etot_st_est; /* Noise estimation - short term estimate of E{ Etot } */ + float Etot_sq_st_est; /* Noise estimation - short term estimate of E{ Etot^2 } */ + int16_t aEn_inac_cnt; +} NOISE_EST_DATA, *NOISE_EST_HANDLE; + + +/*----------------------------------------------------------------------------------* + * Speech/music classifier structure + *----------------------------------------------------------------------------------*/ + +typedef struct sp_mus_clas_structure +{ + float FV_st[N_SMC_FEATURES]; /* Speech/music classifier - short-term mean of the feature vector */ + float past_PS[HIGHEST_FBIN - LOWEST_FBIN]; + float past_ps_diff; + float prev_FV[N_SMC_FEATURES]; + float past_epsP; + float past_epsP2; + int16_t inact_cnt; + float wdrop; + float wrise; + float wdlp_0_95_sp; + float wdlp_xtalk; + int16_t sp_mus_state; + int16_t past_dec[HANG_LEN - 1]; /* Speech/music classifier - buffer of past binary decisions */ + float past_dlp[HANG_LEN - 1]; /* Speech/music classifier - buffer of past non-binary decisions */ + float past_dlp_mean_ST[HANG_LEN - 1]; /* Speech/music classifier - buffer of past non-binary decisions (with ST smoothing) */ + float dlp_mean_ST; + int16_t flag_spitch_cnt; + float dlp_mean_LT; + float dlp_var_LT; + float last_lsp[M_LSP_SPMUS]; + float last_cor_map_sum; + float last_non_sta; + float past_log_enr[NB_BANDS_SPMUS]; /* Speech/music classifier - last average per-band log energy used for non_staX */ + float gsc_thres[4]; /* Speech/music classifier - classification threshold */ + float gsc_lt_diff_etot[MAX_LT]; /* Speech/music classifier - long-term total energy variation */ + float gsc_mem_etot; /* Speech/music classifier - total energy memory */ + int16_t gsc_last_music_flag; /* Speech/music classifier - last music flag */ + int16_t gsc_nb_thr_1; /* Speech/music classifier - number of consecutives frames of level 1 */ + int16_t gsc_nb_thr_3; /* Speech/music classifier - number of consecutives frames of level 3 */ + float mold_corr; + float mean_avr_dyn; /* Speech/music classifier - long term average dynamic */ + float last_sw_dyn; /* Speech/music classifier - last dynamic */ + float lt_dec_thres; /* Speech/music classifier - Long term speech/music thresold values */ + float ener_RAT; /* Speech/music classifier - LF/to total energy ratio */ + + int16_t relE_attack_cnt; + float prev_relE; + float prev_Etot; + int16_t prev_vad; + int16_t vad_0_1_cnt; + float relE_attack_sum; + + /* speech/music classifier improvement parameters */ + float old_Bin_E[3 * N_OLD_BIN_E]; + float buf_flux[BUF_LEN]; + float buf_pkh[BUF_LEN]; + float buf_epsP_tilt[BUF_LEN]; + float buf_cor_map_sum[BUF_LEN]; + float buf_Ntonal[BUF_LEN]; + float buf_Ntonal2[BUF_LEN]; + float buf_Ntonal_lf[BUF_LEN]; + float buf_dlp[10]; + int16_t onset_cnt; + float buf_etot[4]; + int16_t attack_hangover; + float dec_mov; + float dec_mov1; + float mov_log_max_spl; + float old_lt_diff[2]; + int16_t UV_cnt1; + float LT_UV_cnt1; + + float finc_prev[ATT_NSEG]; /* strong attack detection - previous finc */ + float lt_finc; /* strong attack detection - long-term finc energy */ + int16_t last_strong_attack; /* strong attack detection - last strong attack flag */ + float tod_lt_Bin_E[TOD_NSPEC]; /* tonal detector - long-term energy spectrum */ + float tod_S_map_lt[TOD_NSPEC]; /* tonal detector - long-term correlation map */ + float tod_thr_lt; /* tonal detector - adaptive threshold */ + float tod_weight; /* tonal detector - adaptive weight */ + float tod_S_mass_prev; + float tod_S_mass_lt; + + int16_t lt_music_hangover; + float tonality2_buf[HANG_LEN_INIT]; + float tonality3_buf[HANG_LEN_INIT]; + float LPCErr_buf[HANG_LEN_INIT]; + int16_t lt_music_state; + int16_t lt_speech_state; + int16_t lt_speech_hangover; + float lpe_buf[HANG_LEN_INIT]; + float voicing_buf[HANG_LEN_INIT]; + int16_t gsc_hangover; + float sparse_buf[HANG_LEN_INIT]; + float hf_spar_buf[HANG_LEN_INIT]; + float LT_sparse; + int16_t gsc_cnt; + + /* speech/music classification */ + int16_t last_vad_spa; + int16_t lt_old_mode[3]; + float lt_voicing; + float lt_corr; + float lt_tonality; + int16_t lt_corr_pitch[3]; + int16_t lt_hangover; + float lowrate_pitchGain; + + float tdm_lt_Etot; + float var_cor_t[VAR_COR_LEN]; + int16_t high_stable_cor; + + float lps; + float lpm; + float lpn; + +} SP_MUS_CLAS_DATA, *SP_MUS_CLAS_HANDLE; + + +/*----------------------------------------------------------------------------------* + * ACELP core structure + *----------------------------------------------------------------------------------*/ + +typedef struct lpd_state_structure +{ + /* signal memory */ + float syn[1 + M]; /* Synthesis memory (non-pe) */ + + /* ACELP memories*/ + float old_exc[L_EXC_MEM]; /* ACELP exc memory (Aq) */ + float mem_w0; + float mem_syn[M]; /* ACELP synthesis memory (pe) before post-proc */ + float mem_syn1[M]; + float mem_syn2[M]; /* ACELP synthesis memory (pe) after post-proc */ + float mem_syn_r[L_SYN_MEM]; /* ACELP synthesis memory for 1.25ms */ + float mem_syn3[M]; + + float tilt_code; + float gc_threshold; /* Noise enhancer - threshold for gain_code */ + float dispMem[8]; /* Noise enhancer - phase dispersion algorithm memory */ + +} LPD_state, *LPD_state_HANDLE; + + +/* Structure for storing correlations between ACELP codebook components and target */ +typedef struct acelp_cbkcorr_structure +{ + float xx; /* energy of target x */ + float y1y1; /* energy of adaptive cbk contribution y1 */ + float y2y2; /* energy of fixed cbk contribution y2 */ + float xy1; /* correlation of x and y1 */ + float xy2; /* correlation of x and y2 */ + float y1y2; /* correlation of y1 and y2 */ +} ACELP_CbkCorr; + + +/*----------------------------------------------------------------------------------* + * GSC static variables + *----------------------------------------------------------------------------------*/ + +typedef struct gsc_enc_structure +{ + int16_t seed_tcx; /* AC mode (GSC) - seed for noise fill */ + int16_t cor_strong_limit; /* AC mode (GSC) - Indicator about high spectral correlation per band */ + int16_t mem_last_pit_band; /* AC mode (GSC) - memory of the last band where pitch contribution was significant */ + float mem_w0_tmp; + float mem_syn_tmp[M]; + float mid_dyn; /* AC mode (GSC) - signal dynamic */ + int16_t noise_lev; /* AC mode (GSC) - noise level */ + int16_t past_dyn_dec; /* AC mode (GSC) - Past noise level decision */ + float Last_frame_ener; /* AC mode (GSC) - Last frame energy */ + int16_t pit_exc_hangover; /* AC mode (GSC) - Hangover for the time contribution switching */ + float last_exc_dct_in[L_FRAME16k]; /* AC mode (GSC) - previous excitation */ + float last_ener; /* AC mode (GSC) - previous energy */ + int16_t last_bitallocation_band[6]; /* AC mode (GSC) - previous bit allocation of each band */ + float lt_gpitch; + +} GSC_ENC_DATA, *GSC_ENC_HANDLE; + +/*----------------------------------------------------------------------------------* + * HQ core structure + *----------------------------------------------------------------------------------*/ + +typedef struct hq_enc_structure +{ + int16_t mode_count; /* HQ_HARMONIC mode count */ + int16_t mode_count1; /* HQ_NORMAL mode count */ + int16_t prev_Npeaks; /* number of peaks in previous frame */ + int16_t prev_peaks[HVQ_MAX_PEAKS]; /* indices of the peaks in previous frame */ + int16_t hvq_hangover; + int16_t prev_hqswb_clas; + int16_t prev_SWB_peak_pos[SPT_SHORTEN_SBNUM]; + + int16_t hq_generic_speech_class; + float crest_lp; /* Low-pass filtered crest of high band */ + float crest_mod_lp; /* Low-pass filtered noise band detection */ + + /* SWB BWE LR classification */ + int16_t prev_frm_index[NB_SWB_SUBBANDS_HAR_SEARCH_SB]; + int16_t prev_frm_hfe2; + int16_t prev_stab_hfe2; + float prev_ni_ratio; + float prev_En_sb[NB_SWB_SUBBANDS]; + int16_t last_bitalloc_max_band[2]; + float last_ni_gain[BANDS_MAX]; + float last_env[BANDS_MAX]; + int16_t last_max_pos_pulse; + +} HQ_ENC_DATA, *HQ_ENC_HANDLE; + +/* PVQ range coder state */ +typedef struct pvq_enc_structure +{ + uint32_t rc_low; + uint32_t rc_range; + int16_t rc_cache; + int16_t rc_carry; + int16_t rc_carry_count; + int16_t rc_num_bits; + int16_t rc_tot_bits; + int16_t rc_offset; + +} PVQ_ENC_DATA, *PVQ_ENC_HANDLE; + + +/*----------------------------------------------------------------------------------* + * SC-VBR structure + *----------------------------------------------------------------------------------*/ + +typedef struct sc_vbr_enc_structure +{ + float vadsnr; + float vadnoise; + + /* NELP variables */ + float shape1_filt_mem[20]; + float shape2_filt_mem[20]; + float shape3_filt_mem[20]; + float txlpf1_filt1_mem[20]; + float txlpf1_filt2_mem[20]; + float txhpf1_filt1_mem[20]; + float txhpf1_filt2_mem[20]; + float bp1_filt_mem_wb[8]; + float nelp_lp_fit_mem[NELP_LP_ORDER * 2]; + float bp1_filt_mem_nb[14]; + int16_t nelp_enc_seed; + float nelp_gain_mem; + int16_t last_nelp_mode; + int16_t nelp_mode; + + /* PPP variables */ + int16_t pppcountE; + int16_t bump_up; + int16_t last_ppp_mode; + int16_t last_last_ppp_mode; + int16_t ppp_mode; + float prev_ppp_gain_pit; + float prev_tilt_code; + + /* voiced encoder variables */ + int16_t firstTime_voicedenc; + + /* DTFS variables */ + float dtfs_enc_a[MAXLAG_WI]; + float dtfs_enc_b[MAXLAG_WI]; + int16_t dtfs_enc_lag; + int16_t dtfs_enc_nH; + int16_t dtfs_enc_nH_4kHz; + float dtfs_enc_upper_cut_off_freq_of_interest; + float dtfs_enc_upper_cut_off_freq; + + float prev_cw_en; + float ph_offset_E; + float lastLgainE; /* Previous gain value for the low band */ + float lastHgainE; /* Previous gain value for the high band */ + float lasterbE[NUM_ERB_WB]; /* Previous Amplitude spectrum (ERB) */ + + int16_t mode_QQF; + int16_t rate_control; + float SNR_THLD; + int16_t Q_to_F; + int16_t pattern_m; + int16_t patterncount; + int16_t Last_Resort; + int16_t numactive; /* keep the count of the frames inside current 600 frame block */ + float sum_of_rates; /* sum of the rates of past 600 active frames */ + float global_avr_rate; /* global rate up to current time. recorded a (rate in kbps) * 6000 */ + int16_t global_frame_cnt; /* 600 active frame block count. Used to update the global rate */ + int16_t set_ppp_generic; + int16_t avoid_HQ_VBR_NB; + + int16_t vbr_generic_ho; + int16_t Local_VAD; + int16_t last_7k2_coder_type; + +} SC_VBR_ENC_DATA, *SC_VBR_ENC_HANDLE; + + +/*----------------------------------------------------------------------------------* + * AMR-WB IO mode structure + *----------------------------------------------------------------------------------*/ + +typedef struct amrwb_io_enc_structure +{ + float past_qua_en[4]; /* gain quantization memory (used also in AMR-WB IO mode) */ + + /* HF WB BWE for AMR-WB IO mode at 23.85 kbps */ + float gain_alpha; + float mem_hf2_enc[L_FIR - 1]; + float mem_hp400_enc[4]; + float mem_hf_enc[L_FIR - 1]; + float mem_syn_hf_enc[M]; + int16_t seed2_enc; + +} AMRWB_IO_ENC_DATA, *AMRWB_IO_ENC_HANDLE; + + +/*----------------------------------------------------------------------------------* + * TD BWE structure + *----------------------------------------------------------------------------------*/ + +typedef struct td_bwe_enc_structure +{ + float old_speech_shb[L_LOOK_16k + L_SUBFR16k]; /* Buffer memories */ + float old_speech_wb[( L_LOOK_12k8 + L_SUBFR ) * 5 / 16]; /* Buffer memories */ + float old_input_fhb[NS2SA( 48000, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_12k8_NS + DELAY_FIR_RESAMPL_NS ) - L_FRAME48k / 2]; + float prev_lsp_shb[LPC_SHB_ORDER]; + float state_ana_filt_shb[2 * ALLPASSSECTIONS_STEEP + 1]; /* states for the analysis filters */ + float cldfbHBLT; + /* states for the filters used in generating SHB excitation from WB excitation*/ + float mem_csfilt[2]; + float mem_shb_res[MAX_LEN_MA_FILTER]; /* old SHB residual signal */ + float old_EnvSHBres[L_FRAME4k]; /* old TD envelope of the SHB residual signal */ + float old_mean_EnvSHBres; /* energy of the last subframe of the SHB residual signal from previous frame */ + float prev_enr_EnvSHBres; /* energy of the residual SHB envelope from the previous frame */ + float prev_shb_env_tilt; /* tilt of the residual SHB envelope from the previous frame */ + float prev_pow_exc16kWhtnd; /* power of the LB excitation signal in the previous frame */ + float prev_mix_factor; /* mixing factor in the previous frame */ + float prev_Env_error; /* error in SHB envelope modelling */ + + /* states for the filters used in generating SHB signal from SHB excitation*/ + float state_syn_shbexc[L_SHB_LAHEAD]; + float state_lpc_syn[LPC_SHB_ORDER]; + float old_bwe_exc[PIT16k_MAX * 2]; /* old excitation */ + int16_t bwe_seed[2]; + float bwe_non_lin_prev_scale; + float old_bwe_exc_extended[NL_BUFF_OFFSET]; + float syn_overlap[L_SHB_LAHEAD]; /* overlap buffer used to Adjust SHB Frame Gain*/ + float decim_state1[( 2 * ALLPASSSECTIONS_STEEP + 1 )]; + float decim_state2[( 2 * ALLPASSSECTIONS_STEEP + 1 )]; + float mem_genSHBexc_filt_down_wb2[( 2 * ALLPASSSECTIONS_STEEP + 1 )]; + float mem_genSHBexc_filt_down_wb3[( 2 * ALLPASSSECTIONS_STEEP + 1 )]; + float mem_genSHBexc_filt_down_shb[( 2 * ALLPASSSECTIONS_STEEP + 1 )]; + + float elliptic_bpf_2_48k_mem[4][4]; + float prev_fb_energy; + float prev_gainFr_SHB; + float lsp_shb_slow_interpl[LPC_SHB_ORDER]; + float lsp_shb_fast_interpl[LPC_SHB_ORDER]; + float shb_inv_filt_mem[LPC_SHB_ORDER]; + float lsp_shb_spacing[3]; + float prev_swb_GainShape; + int16_t prev_frGainAtten; + + float prev_wb_GainShape; + float swb_lsp_prev_interp[LPC_SHB_ORDER]; + float fb_state_lpc_syn[LPC_SHB_ORDER]; + float fb_tbe_demph; + float tilt_mem; + + int16_t prev_coder_type; + float prev_lsf_diff[LPC_SHB_ORDER - 2]; + float prev_tilt_para; + float cur_sub_Aq[M + 1]; + + /* quantized data */ + int16_t lsf_idx[NUM_Q_LSF]; + int16_t m_idx; + int16_t grid_idx; + int16_t idxSubGains; + int16_t idxFrameGain; + int16_t idx_shb_fr_gain; + int16_t idx_res_gs[NB_SUBFR16k]; + int16_t idx_mixFac; + + int16_t lsf_WB; + int16_t gFrame_WB; + + int16_t idxGain; + float dec_2_over_3_mem[L_FILT_2OVER3]; + float dec_2_over_3_mem_lp[L_FILT_2OVER3_LP]; + + float tbe_demph; + float tbe_premph; + float mem_stp_swb[LPC_SHB_ORDER]; + float *ptr_mem_stp_swb; + float gain_prec_swb; + float mem_zero_swb[LPC_SHB_ORDER]; + +} TD_BWE_ENC_DATA, *TD_BWE_ENC_HANDLE; + + +/*----------------------------------------------------------------------------------* + * FD BWE structure + *----------------------------------------------------------------------------------*/ + +typedef struct fd_bwe_enc_structure +{ + float new_input_hp[NS2SA( 16000, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_NS + DELAY_FIR_RESAMPL_NS - DELAY_CLDFB_NS )]; + float old_input[NS2SA( 48000, DELAY_FD_BWE_ENC_NS + DELAY_FIR_RESAMPL_NS )]; + float old_input_wb[NS2SA( 16000, DELAY_FD_BWE_ENC_NS )]; + float old_input_lp[NS2SA( 16000, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_NS )]; + float old_syn_12k8_16k[NS2SA( 16000, DELAY_FD_BWE_ENC_NS )]; + float old_fdbwe_speech[L_FRAME48k]; + float mem_deemph_old_syn; + int16_t prev_mode; + float old_wtda_swb[L_FRAME48k]; + int16_t prev_L_swb_norm1; + float prev_global_gain; + int16_t modeCount; + float EnergyLF; + float mem_old_wtda_swb; + +} FD_BWE_ENC_DATA, *FD_BWE_ENC_HANDLE; + + +/*----------------------------------------------------------------------------------* + * Channel-aware mode + *----------------------------------------------------------------------------------*/ + +typedef struct rf_enc_structure +{ + int16_t rf_frame_type; + int16_t rf_targetbits_buff[MAX_RF_FEC_OFFSET]; + int16_t rf_indx_frametype[MAX_RF_FEC_OFFSET]; + + ACELP_config acelp_cfg_rf; /* configuration for RF frame */ + + float rf_mem_w0; + float rf_clip_var[6]; + float rf_tilt_code; + float rf_mem_syn2[M]; + float rf_dispMem[8]; + float rf_gc_threshold; + + int16_t rf_target_bits; + float rf_tilt_buf[NB_SUBFR16k]; + + int16_t rf_indx_lsf[MAX_RF_FEC_OFFSET][3]; + int16_t rf_indx_pitch[MAX_RF_FEC_OFFSET][NB_SUBFR16k]; + int16_t rf_indx_fcb[MAX_RF_FEC_OFFSET][NB_SUBFR16k]; + int16_t rf_indx_gain[MAX_RF_FEC_OFFSET][NB_SUBFR16k]; + int16_t rf_indx_EsPred[MAX_RF_FEC_OFFSET]; + int16_t rf_indx_ltfMode[MAX_RF_FEC_OFFSET][NB_SUBFR16k]; + + int16_t rf_indx_nelp_fid[MAX_RF_FEC_OFFSET]; + int16_t rf_indx_nelp_iG1[MAX_RF_FEC_OFFSET]; + int16_t rf_indx_nelp_iG2[MAX_RF_FEC_OFFSET][2]; + + int16_t rf_indx_tbeGainFr[MAX_RF_FEC_OFFSET]; + + int16_t rf_tcxltp_pitch_int_past; + int16_t rf_last_tns_active; + int16_t rf_second_last_tns_active; + int16_t rf_second_last_core; + int16_t rf_clas[MAX_RF_FEC_OFFSET]; + int16_t rf_gain_tcx[MAX_RF_FEC_OFFSET]; + int16_t rf_tcxltp_param[MAX_RF_FEC_OFFSET]; + + int16_t RF_bwe_gainFr_ind; + +} RF_ENC_DATA, *RF_ENC_HANDLE; + + +/*------------------------------------------------------------------------------------------* + * PLC encoder + *------------------------------------------------------------------------------------------*/ + +typedef struct plc_enc_evs_structure +{ + int16_t nBits; /* number of bits */ + + int16_t enableGplc; + int16_t T0_4th; + int16_t T0; + int16_t calcOnlylsf; + int16_t pit_min; + int16_t pit_max; + + float mem_MA[M]; + float mem_AR[M]; + + float lsfold[M]; /* old lsf (frequency domain) */ + float lspold[M]; /* old lsp (immittance spectral pairs) */ + + float lsfoldbfi0[M]; /* Previous frame lsf */ + float lsfoldbfi1[M]; /* Past previous frame lsf */ + float lsf_adaptive_mean[M]; /* Mean lsf for bfi cases */ + float stab_fac; + + LPD_state *LPDmem; + float old_exc[8]; /* ACELP exc memory (Aq) */ + + float lsf_con[M]; + float last_lsf_ref[M]; + float last_lsf_con[M]; + +} PLC_ENC_EVS, *PLC_ENC_EVS_HANDLE; + + +/*------------------------------------------------------------------------------------------* + * TEC structure + *------------------------------------------------------------------------------------------*/ + +typedef struct tec_enc_structure +{ + float loBuffer[CLDFB_NO_COL_MAX + MAX_TEC_SMOOTHING_DEG + DELAY_TEMP_ENV_BUFF_TEC]; + float loTempEnv[CLDFB_NO_COL_MAX]; + float loTempEnv_ns[CLDFB_NO_COL_MAX]; + float hiTempEnv[CLDFB_NO_COL_MAX + DELAY_TEMP_ENV_BUFF_TEC + EXT_DELAY_HI_TEMP_ENV]; + int16_t tranFlag; + int16_t corrFlag; + +} TEC_ENC_DATA, *TEC_ENC_HANDLE; + + +/*------------------------------------------------------------------------------------------* + * TCX encoder + *------------------------------------------------------------------------------------------*/ + +typedef struct tcx_enc_structure +{ + int16_t L_frameTCX; + + int16_t tcxMode; /* Chosen TCX mode for this frame */ + int16_t transform_type[2]; /* TCX20/10/5 mode in each subframe */ + + /* Core Signal Analysis Outputs */ + float *spectrum[2]; /* MDCT output for a short block */ + float spectrum_long[N_MAX]; /* MDCT output for a long block. Points to spectrum */ + + float noiseTiltFactor; /* compensation for LPC tilt in noise filling */ + int16_t noiseLevelMemory_cnt; /* counter of consecutive low TCX noise levels */ + float ltpGainMemory[N_LTP_GAIN_MEMS]; /* for smoothing noiseTransWidth */ + STnsData tnsData[2]; + int16_t fUseTns[2]; + int16_t bTnsOnWhithenedSpectra[2]; + + int16_t memQuantZeros[L_FRAME_PLUS]; /* Quantization deadzone flags */ + + float *speech_TCX; + float *new_speech_TCX; + + int16_t tcxltp; + int16_t tcxltp_pitch_int; + int16_t tcxltp_pitch_fr; + float tcxltp_gain; + int16_t tcxltp_pitch_int_past; + int16_t tcxltp_pitch_fr_past; + float tcxltp_gain_past; + float tcxltp_norm_corr_past; + float tcxltp_norm_corr_mem; + float kernel_switch_corr_past; + uint16_t kernel_type[2]; /* transform kernel type in each subframe (MDCT or MDST) */ + uint16_t kernel_symmetry_past; /* last TDA symmetry (0 for MDCT, 1 for MDST type) */ + uint16_t enc_ste_pre_corr_past; + float tfm_mem; /* state of IIR filtered temporal flatness measure */ + float buf_speech_ltp[L_PAST_MAX_32k + L_FRAME32k + L_NEXT_MAX_32k]; + float *speech_ltp; + float *new_speech_ltp; + int16_t tcxltp_filt_idx; + int16_t tcxltp_bits; + int16_t tcxltp_param[LTPSIZE]; + int16_t tcxltp_on_mem; + + float measuredBwRatio; /* measured bw; used for TCX noise-filling */ + int16_t nmStartLine; /* Starting line for the noise measurement */ + + int16_t tcx_lpc_shaped_ari; + + float old_out[L_FRAME32k]; + + /* MDCT switching */ + float prev_hi_ener; + int16_t prev_hi_sparse; + float clas_sec_old; + int16_t clas_final_old; + float last_gain1; + float last_gain2; + + /* TCX memory */ + float Txnq[L_FRAME32k / 2 + 64]; /* Q target (overlap or ACELP+ZIR, use Aq) */ + float *acelp_zir; + float tcx_target_bits_fac; + + int16_t tns_ms_flag[2]; + +} TCX_ENC_DATA, *TCX_ENC_HANDLE; + + +/*----------------------------------------------------------------------------------* + * + * Main Core encoder structure + * + *----------------------------------------------------------------------------------*/ + +typedef struct enc_core_structure +{ + /*----------------------------------------------------------------------------------* + * Common parameters + *----------------------------------------------------------------------------------*/ + + int16_t idchan; /* channel ID (audio channel number) */ + int16_t element_mode; /* element mode */ + int32_t element_brate; /* element bitrate */ + int16_t codec_mode; /* Mode1 or Mode2 */ + int16_t last_codec_mode; /* previous frame Mode 1 or 2 */ + int16_t last_codec_mode_cng; /* previous inactive frame Mode 1 or 2 */ + + /* MDCT switching */ + int16_t mdct_sw_enable; /* MDCT switching enable flag */ + int16_t mdct_sw; /* MDCT switching indicator */ + + BSTR_ENC_HANDLE hBstr; /* encoder bitstream handle */ + int16_t bitstreamformat; /* Bitstream format flag (G.192/MIME) */ + + int32_t input_Fs; /* input signal sampling frequency in Hz */ + int32_t total_brate; /* total bitrate in kbps of the codec */ + int32_t last_total_brate; /* last frame's total bitrate in kbps of the codec */ + int32_t last_total_brate_cng; /* last inactive frame's total bitrate in kbps of the codec */ + int16_t core; /* core (ACELP_CORE, TCX_20_CORE, TCX_10_CORE, HQ_CORE, AMR_WB_CORE) */ + int16_t last_core; /* previous frame core */ + int16_t coder_type; /* core coder type */ + int16_t flag_ACELP16k; /* flag indicating use of ACELP core at 16kHz internal sampling rate */ + int32_t core_brate; /* core bitrate */ + int32_t last_core_brate; /* previous frame core bitrate */ + int16_t extl; /* extension layer */ + int16_t last_extl; /* previous extension layer */ + int32_t extl_brate; /* extension layer bitrate */ + int16_t input_bwidth; /* input signal bandwidth */ + int16_t bwidth; /* encoded bandwidth NB, WB, SWB or FB */ + int16_t max_bwidth; /* maximum encoded bandwidth */ + int16_t last_input_bwidth; /* input signal bandwidth in the previous frame */ + int16_t last_bwidth; /* coded bandwidth in the previous frame */ + int16_t last_bwidth_cng; /* coded bandwidth in the previous inactive frame */ + int16_t bwidth_sw_cnt; /* bandwidth switching counter */ + int16_t L_frame; /* ACELP core internal frame length */ + int16_t Opt_AMR_WB; /* flag indicating AMR-WB IO mode */ + int16_t Opt_DTX_ON; /* flag indicating DTX operation */ + int16_t cng_type; /* flag indicating LP or CLDFB based SID/CNG */ + int16_t cng_sba_flag; /* flag indicating CNG/SID for SBA 2TC */ + int16_t Opt_SC_VBR; /* flag indicating SC-VBR mode */ + int16_t last_Opt_SC_VBR; /* flag indicating prev frame's SC-VBR mode */ + int16_t low_rate_mode; /* low-rate mode flag */ + int16_t inactive_coder_type_flag; /* inactive coder type flag (0 = AVQ / 1 = GSC) */ + + int16_t ini_frame; /* initialization frames counter */ + + /*----------------------------------------------------------------------------------* + * ACELP core parameters + *----------------------------------------------------------------------------------*/ + + int16_t clas; /* current frame clas */ + int16_t last_clas; /* previous frame signal classification */ + float prev_fmerit; /* previous signal classification score*/ + float fmerit_dt; /* signal classification score difference */ + int16_t Nb_ACELP_frames; + + int16_t pitch[3]; /* open-loop pitch values @12.8 kHz for three half-frames */ + float voicing[3]; /* open-loop normalized correlation values for three half-frames */ + + LPD_state_HANDLE hLPDmem; /* ACELP LPDmem memories */ + + float Bin_E[L_FFT]; /* per bin energy of two frames */ + float lsp_old1[M]; /* old unquantized LSP vector at the end of the frame at 12k8 */ + float lsf_old1[M]; /* old unquantized LSF vector at the end of the frame at 12k8 */ + float lsp_old[M]; /* old LSP vector at the end of the frame */ + float lsf_old[M]; /* old LSF vector at the end of the frame */ + float lsp_old16k[M]; /* old LSP vector at the end of the frame @16kHz */ + float lspold_enc[M]; /* old lsp (immittance spectral pairs) */ + int16_t pstreaklen; /* LSF quantizer */ + float streaklimit; /* LSF quantizer */ + float stab_fac; /* LSF stability factor */ + float mem_preemph; /* preemphasis filter memory */ + float old_wsp[L_WSP_MEM]; /* old weighted signal vector */ + float old_wsp2[( L_WSP_MEM - L_INTERPOL ) / OPL_DECIM]; /* old decimated weighted signal vector */ + float mem_wsp; /* weighted signal vector memory */ + float mem_decim2[3]; /* weighted signal decimation filter memory */ + + float clip_var[6]; /* pitch gain clipping memory */ + float mem_AR[M]; /* AR memory of LSF quantizer (past quantized LSFs without mean) */ + float mem_MA[M]; /* MA memory of LSF quantizer (past quantized residual) (used also in AMR-WB IO mode) */ + + int16_t GSC_noisy_speech; /* AC mode (GSC) - flag to indicate GSC on SWB noisy speech */ + int16_t GSC_IVAS_mode; + GSC_ENC_HANDLE hGSCEnc; + + int16_t Last_pulse_pos; /* FEC - last position of the first glottal pulse in the frame */ + float lsfoldbfi0[M]; /* FEC - LSF vector of the previous frame */ + float lsfoldbfi1[M]; /* FEC - LSF vector of the past previous frame */ + float lsf_adaptive_mean[M]; /* FEC - adaptive mean LSF vector for FEC */ + int16_t next_force_safety_net; /* FEC - flag to force safety net in next frame */ + + int16_t uv_count; /* Stationary noise UV modification - unvoiced counter */ + int16_t act_count; /* Stationary noise UV modification - activation counter */ + float ge_sm; /* Stationary noise UV modification - smoothed excitation gain */ + float lspold_s[M]; /* Stationary noise UV modification - old LSP vector */ + int16_t noimix_seed; /* Stationary noise UV modification - mixture seed */ + float min_alpha; /* Stationary noise UV modification - minimum alpha */ + float exc_pe; /* Stationary noise UV modification - memory of the preemphasis filter */ + + int16_t coder_type_raw; /* raw coder_type (before UNVOICED is lost) */ + int16_t last_coder_type_raw; /* raw last_coder_type (coming from the sigal classification) */ + int16_t last_coder_type; /* previous coding type */ + float old_thres; /* normalized correlation weighting in open-loop pitch */ + float old_corr; /* normalized correlation in previous frame (mean value) */ + int16_t old_pitch; /* previous pitch for open-loop pitch search */ + int16_t delta_pit; /* open-loop pitch extrapolation correction */ + float ee_old; /* previous frame low/high frequency energy ratio */ + int16_t min_band; /* minimum critical band of useful bandwidth */ + int16_t max_band; /* maximum critical band of useful bandwidth */ + int16_t tc_cnt; /* TC frame counter */ + int16_t audio_frame_cnt; /* Counter of relative presence of audio frames */ + float old_dE1; /* Maximum energy increase in previous frame */ + int16_t old_ind_deltaMax; /* Index of the sub-subframe of maximum energy in previous frame */ + float old_enr_ssf[2 * NB_SSF]; /* Maxima of energies per sub-subframes of previous frame */ + int16_t spike_hyst; /* Hysteresis to prevent UC after sharp energy spike */ + int16_t last_harm_flag_acelp; /* harmonicity flag for ACELP @32kbps rate */ + float old_Aq_12_8[M + 1]; /* old Aq[] for core switching */ + float old_Es_pred; /* old Es_pred for core switching */ + + int16_t last_L_frame; /* ACELP@16kHz - last L_frame value */ + float mem_preemph16k; /* ACELP@16kHz - preemphasis filter memory @16kHz */ + float mem_deemp_preQ; /* ACELP@16kHz - prequantizer deemhasis memory */ + float mem_preemp_preQ; /* ACELP@16kHz - prequantizer preemhasis memory */ + int16_t last_nq_preQ; /* ACELP@16kHz - AVQ subquantizer number of the last sub-band of the last subframe */ + int16_t last_code_preq; /* ACELP@16kHz - last coefficient of the pre-quantizer contribution */ + int16_t use_acelp_preq; /* ACELP@16kHz - flag of prequantizer usage */ + + int16_t bpf_off; /* Bass post-filter - do not use BPF when this flag is set to 1 */ + float old_pitch_buf[2 * NB_SUBFR16k]; /* Bass post-filter - buffer of old subframe pitch values */ + float pst_mem_deemp_err; /* Bass post-filter - filter memory of noise LP filter */ + float pst_lp_ener; /* Bass post-filter - long-term energy */ + + /* stable short pitch detection */ + float voicing0_sm; + float voicing_sm; + float LF_EnergyRatio_sm; + int16_t predecision_flag; + float diff_sm; + float energy_sm; + + int16_t sharpFlag; + + int16_t flag_noisy_speech_snr; /* encoder detector for noisy speech */ + int16_t Pos_relE_cnt; /* Number of frames between relE */ + + int16_t tdm_pc; /* pitch stability - used in TD stereo */ + + /*----------------------------------------------------------------------------------* + * General signal buffers + *----------------------------------------------------------------------------------*/ + + float *input_buff; + float *input; + float *old_input_signal; + + SIGNAL_BUFFERS_ENC_HANDLE hSignalBuf; + + float *Bin_E_old; /* per bin energy of old 2nd frames */ + float *mem_decim; /* decimation filter memory */ + float *mem_decim16k; /* ACELP@16kHz - decimation filter memory @16kHz */ + float *old_inp_12k8; /* memory of input signal at 12.8kHz */ + float *old_inp_16k; /* ACELP@16kHz - memory of input signal @16 kHz */ + float *buf_speech_enc_pe; + float *buf_synth; /*can be reduced to PIT_MAX_MAX+L_FRAME_MAX if no rate switching*/ + float *buf_speech_enc; + float *buf_wspeech_enc; + + /*----------------------------------------------------------------------------------* + * Noise estimation + *----------------------------------------------------------------------------------*/ + + NOISE_EST_HANDLE hNoiseEst; + + /*----------------------------------------------------------------------------------* + * Speech/music classifier + *----------------------------------------------------------------------------------*/ + + SP_MUS_CLAS_HANDLE hSpMusClas; + + int16_t sp_aud_decision0; /* 1st stage speech/music decision flag */ + int16_t sp_aud_decision1; /* 1st stage speech/music classification flag */ + int16_t sp_aud_decision2; /* 2nd stage speech/music classification flag */ + + /*----------------------------------------------------------------------------------* + * VAD/DTX/CNG + *----------------------------------------------------------------------------------*/ + + VAD_HANDLE hVAD; + + VAD_CLDFB_HANDLE hVAD_CLDFB; + + int16_t vad_flag; /* i : VAD flag */ + int16_t localVAD; /* i : local VAD flag */ + + float bckr_tilt_lt; + float lp_speech; + float lp_noise; /* CNG and DTX - LP filtered total noise estimation */ + int16_t active_cnt; /* counter of active frames */ + + TD_CNG_ENC_HANDLE hTdCngEnc; + + DTX_ENC_HANDLE hDtxEnc; /* Struct for DTX-related data used by both FD- and LP-CNG */ + + /*----------------------------------------------------------------------------------* + * AMR-WB IO handle + *----------------------------------------------------------------------------------*/ + + AMRWB_IO_ENC_HANDLE hAmrwb_IO; /* AMR-WB IO encoder handle */ + + /*----------------------------------------------------------------------------------* + * CLDFB analysis + *----------------------------------------------------------------------------------*/ + + HANDLE_CLDFB_FILTER_BANK cldfbAnaEnc; /* main analysis filter bank handle */ + HANDLE_CLDFB_FILTER_BANK cldfbSynTd; /* synthesis filterbank - used for HB signal generation */ + + /*----------------------------------------------------------------------------------* + * FD CNG handle + *----------------------------------------------------------------------------------*/ + + HANDLE_FD_CNG_ENC hFdCngEnc; + int16_t fd_cng_reset_flag; + float last_totalNoise; + float totalNoise_increase_hist[TOTALNOISE_HIST_SIZE]; + int16_t totalNoise_increase_len; + + /*----------------------------------------------------------------------------------* + * SC-VBR parameters + *----------------------------------------------------------------------------------*/ + + SC_VBR_ENC_HANDLE hSC_VBR; + + /*----------------------------------------------------------------------------------* + * HQ core parameters + *----------------------------------------------------------------------------------*/ + + /* Memory for detect_transient() */ + float old_hpfilt_in; + float old_hpfilt_out; + float EnergyLT; + float Energy_Old; + int16_t TransientHangOver; + + HQ_ENC_HANDLE hHQ_core; /* HQ core encoder handle */ + + /*----------------------------------------------------------------------------------* + * TD BWE parameters + *----------------------------------------------------------------------------------*/ + + TD_BWE_ENC_HANDLE hBWE_TD; + + /*----------------------------------------------------------------------------------* + * FD BWE parameters + *----------------------------------------------------------------------------------*/ + + FD_BWE_ENC_HANDLE hBWE_FD; + + /*----------------------------------------------------------------------------------* + * WB, SWB and FB bandwidth detector + *----------------------------------------------------------------------------------*/ + + float lt_mean_NB; + float lt_mean_WB; + float lt_mean_SWB; + int16_t count_WB; + int16_t count_SWB; + int16_t count_FB; + + /*----------------------------------------------------------------------------------* + * Channel-aware mode + *----------------------------------------------------------------------------------*/ + + int16_t rf_mode; /* flag to signal the RF mode */ + int16_t rf_mode_last; + int16_t last_rf_mode_cng; + int16_t Opt_RF_ON; + int16_t rf_fec_offset; + int16_t rf_target_bits_write; + int16_t rf_fec_indicator; + + RF_ENC_HANDLE hRF; /* RF encoder handle */ + + /*----------------------------------------------------------------------------------* + * TCX core encoder handle + *----------------------------------------------------------------------------------*/ + + TCX_ENC_HANDLE hTcxEnc; + + /*----------------------------------------------------------------------------------* + * Mode2 + *----------------------------------------------------------------------------------*/ + + int16_t frame_size_index; /* 0-FRAME_SIZE_NB-1: index determining the frame size */ + int16_t bits_frame_nominal; /* avg bits per frame on active frame */ + int16_t last_bits_frame_nominal; /* avg bits per frame on active frame */ + int16_t bits_frame; /* bits per frame overall */ + int16_t bits_frame_core; /* bits per frame for the core */ + int16_t bits_frame_channel; + int16_t side_bits_frame_channel; + int16_t narrowBand; + int16_t restrictedMode; + int16_t nb_subfr; + int16_t tcxonly; + int16_t fscale; + int32_t sr_core; + + /*ACELP config*/ + ACELP_config acelp_cfg; /*configuration set for each frame*/ + + /*TCX config*/ + TCX_CONFIG_HANDLE hTcxCfg; + + /* cod_main.c */ + float mem_preemph_enc; /* speech preemph filter memory (at encoder-sampling-rate) */ + + /* Signal Buffers and Pointers at encoder-sampling-rate */ + float *speech_enc; + float *speech_enc_pe; + float *new_speech_enc; + float *new_speech_enc_pe; + float *wspeech_enc; + float *synth; + + int16_t enableTcxLpc; /* global toggle for the TCX LPC quantizer */ + int16_t envWeighted; /* are is{p,f}_old_q[] weighted or not? */ + + int16_t acelpEnabled; /* Flag indicating if ACELP can be used */ + int16_t tcx10Enabled; /* Flag indicating if TCX 10 can be used */ + int16_t tcx20Enabled; /* Flag indicating if TCX 20 can be used */ + + float mem_wsp_enc; /* wsp vector memory */ + + int16_t nb_bits_header_ace; /* number of bits for the header */ + int16_t nb_bits_header_tcx; /* number of bits for the header */ + + float preemph_fac; /* Preemphasis factor */ + float gamma; + + TRAN_DET_HANDLE hTranDet; + + int16_t acelpFramesCount; + float prevTempFlatness; + + float prevEnergyHF; + float currEnergyHF; + float currEnergyLookAhead; + + int16_t lpcQuantization; + + int16_t encoderLookahead_enc; + int16_t encoderPastSamples_enc; + int16_t encoderLookahead_FB; + + /* pitch_ol for adaptive lag window */ + int16_t old_pitch_la; /* past open loop pitch lag from look-ahead before very short stable pitch detection */ + + int16_t acelp_autocorr; /* Optimize acelp in 0 covariance or 1 correlation domain */ + + int16_t pit_min; + int16_t pit_fr1; + int16_t pit_fr1b; + int16_t pit_fr2; + int16_t pit_max; + int16_t pit_res_max; + + /* for FAC */ + int16_t L_frame_past; + + /*Adaptive BPF*/ + int16_t bpf_gain_param; + float mem_bpf[2 * L_FILT16k]; + float mem_error_bpf[2 * L_FILT16k]; + + int16_t glr; + int16_t glr_idx[2]; + float mean_gc[2]; + float prev_lsf4_mean; + int16_t glr_reset; + int32_t last_sr_core; + float last_stab_fac; + + /*for rate switching*/ + int16_t rate_switching_reset; /*Rate switching flag requiring a reset of memories at least partially */ + int16_t rate_switching_reset_16kHz; + + int16_t enablePlcWaveadjust; + int16_t Tonal_SideInfo; + + int16_t seed_acelp; + + PLC_ENC_EVS_HANDLE hPlcExt; + + /*----------------------------------------------------------------------------------* + * IGF + *----------------------------------------------------------------------------------*/ + + IGF_ENC_INSTANCE_HANDLE hIGFEnc; /* IGF encoder handle */ + int16_t igf; + + /*----------------------------------------------------------------------------------* + * TEC + *----------------------------------------------------------------------------------*/ + + int16_t tec_tfa; + TEC_ENC_HANDLE hTECEnc; /* TEC encoder handle */ + int16_t tec_flag; + int16_t tfa_flag; + float tfa_enr[N_TEC_TFA_SUBFR]; + + /*---------------------------------------------------------------* + * IVAS parameters + *---------------------------------------------------------------*/ + + int16_t tdm_LRTD_flag; /* LRTD stereo mode flag */ + + /* stereo switching memories */ + float mem_preemph_DFT; + float inp_12k8_mem_stereo_sw[STEREO_DFT_OVL_12k8 - L_MEM_RECALC_12K8 - L_FILT]; + float mem_preemph16k_DFT; + float inp_16k_mem_stereo_sw[STEREO_DFT_OVL_16k - L_MEM_RECALC_16K - L_FILT16k]; + + /* MCT Channel mode indication: LFE, ignore channel? */ + MCT_CHAN_MODE mct_chan_mode; + + int16_t is_ism_format; /* Indication whether the codec operates in ISM format */ + + int16_t dtx_sce_sba; /* enable use of FD CNG with transform domain cores in SCE SBA */ + +} Encoder_State, *ENC_CORE_HANDLE; + + +typedef struct GainItemStr +{ + float nmrValue; + int16_t gainIndex; +} GainItem; + +typedef struct context_rc_mem_struct +{ + int16_t nbits_old; + int16_t ctx; + float bit_estimate; + int16_t rateFlag; + int16_t lastnz; + int16_t nt_half; + +} RC_CONTEXT_MEM, *HANDLE_RC_CONTEXT_MEM; + + +#endif diff --git a/lib_enc/stat_noise_uv_enc.c b/lib_enc/stat_noise_uv_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..10894b02fc031f5e92f9804588a903bd040b2ccd --- /dev/null +++ b/lib_enc/stat_noise_uv_enc.c @@ -0,0 +1,104 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*-----------------------------------------------------------------* + * stat_noise_uv_enc() + * + * Modifies excitation signal when the noise is stationary + *-----------------------------------------------------------------*/ + +void stat_noise_uv_enc( + Encoder_State *st, /* i/o: state structure */ + const float *epsP, /* i : LP prediction errors */ + const float *isp_new, /* i : immittance spectral pairs at 4th sfr */ + const float *isp_mid, /* i : immittance spectral pairs at 2nd sfr */ + float *Aq, /* i/o: A(z) quantized for the 4 subframes */ + float *exc2, /* i/o: excitation buffer */ + const int16_t uc_two_stage_flag /* o : flag undicating two-stage UC */ +) +{ + int16_t noisiness = 0; + int16_t levels = ( 1 << NBITS_NOISENESS ); + + /*-----------------------------------------------------------------* + * Calculate and write the noisiness parameter + *-----------------------------------------------------------------*/ + + if ( ( st->coder_type == UNVOICED && !uc_two_stage_flag ) || ( st->coder_type == INACTIVE && st->core_brate <= ACELP_9k60 ) ) + { + if ( st->bwidth != NB ) + { + /* WB case */ + noisiness = (int16_t) ( ( ( epsP[2] / epsP[16] ) - 1 ) * 2.0f * levels ); + } + else if ( st->coder_type == INACTIVE && st->bwidth == NB ) + { + /* NB GSC case */ + noisiness = (int16_t) ( ( ( epsP[2] / epsP[16] ) - 1 ) * 0.25f * levels ); + } + else + { + /* NB case */ + noisiness = (int16_t) ( ( ( epsP[2] / epsP[16] ) - 1 ) * 0.5f * levels ); + } + + if ( noisiness < 0 ) + { + noisiness = 0; + } + + if ( noisiness > levels - 1 ) + { + noisiness = levels - 1; + } + + push_indice( st->hBstr, IND_NOISINESS, noisiness, NBITS_NOISENESS ); + } + + /*-----------------------------------------------------------------* + * Modify the stationary noise excitation signal + *-----------------------------------------------------------------*/ + + stat_noise_uv_mod( st->coder_type, noisiness, st->lsp_old, isp_new, isp_mid, Aq, exc2, 0, &st->ge_sm, &st->uv_count, &st->act_count, st->lspold_s, &st->noimix_seed, &st->min_alpha, &st->exc_pe, st->core_brate, st->bwidth ); + + return; +} diff --git a/lib_enc/subband_fft.c b/lib_enc/subband_fft.c new file mode 100644 index 0000000000000000000000000000000000000000..638a6d63f830bc1e24cf4575d3e9e201c9296d50 --- /dev/null +++ b/lib_enc/subband_fft.c @@ -0,0 +1,213 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "prot.h" +#include "rom_enc.h" +#include "wmc_auto.h" + + +/*-------------------------------------------------------------------* + * fft16() + * + * + *-------------------------------------------------------------------*/ + +static void fft16( float *r_samp, float *i_samp ) +{ + int16_t i, j, N, Nv2, nm1, k; + float tmpr[16], tmpi[16]; + float r1, s1, r2, s2; + + for ( i = 0; i < 16; i++ ) + { + tmpr[i] = r_samp[i] * M_inr[i] - i_samp[i] * M_ini[i]; + tmpi[i] = r_samp[i] * M_ini[i] + i_samp[i] * M_inr[i]; + } + + for ( i = 0; i < 8; i++ ) + { + s1 = tmpr[i] - tmpr[8 + i]; + r1 = tmpi[i] - tmpi[8 + i]; + + tmpr[i] = tmpr[i] + tmpr[8 + i]; + tmpi[i] = tmpi[i] + tmpi[8 + i]; + + tmpr[i + 8] = s1 * M_r[i] - r1 * M_i[i]; + tmpi[i + 8] = s1 * M_i[i] + r1 * M_r[i]; + } + + for ( i = 0; i < 4; i++ ) + { + s1 = tmpr[i] - tmpr[4 + i]; + r1 = tmpi[i] - tmpi[4 + i]; + + tmpr[i] = tmpr[i] + tmpr[4 + i]; + tmpi[i] = tmpi[i] + tmpi[4 + i]; + + tmpr[i + 4] = s1 * M_r[2 * i] - r1 * M_i[2 * i]; + tmpi[i + 4] = s1 * M_i[2 * i] + r1 * M_r[2 * i]; + } + for ( i = 0; i < 4; i++ ) + { + s1 = tmpr[i + 8] - tmpr[12 + i]; + r1 = tmpi[i + 8] - tmpi[12 + i]; + + tmpr[i + 8] = tmpr[i + 8] + tmpr[12 + i]; + tmpi[i + 8] = tmpi[i + 8] + tmpi[12 + i]; + + tmpr[i + 12] = s1 * M_r[2 * i] - r1 * M_i[2 * i]; + tmpi[i + 12] = s1 * M_i[2 * i] + r1 * M_r[2 * i]; + } + + + for ( i = 0; i < 16; i = i + 4 ) + { + s1 = tmpr[i] - tmpr[2 + i]; + r1 = tmpi[i] - tmpi[2 + i]; + s2 = tmpr[i + 1] - tmpr[3 + i]; + r2 = tmpi[i + 1] - tmpi[3 + i]; + + tmpr[i] = tmpr[i] + tmpr[2 + i]; + tmpi[i] = tmpi[i] + tmpi[2 + i]; + tmpr[i + 1] = tmpr[i + 1] + tmpr[3 + i]; + tmpi[i + 1] = tmpi[i + 1] + tmpi[3 + i]; + + tmpr[i + 2] = s1 * M_r[0] - r1 * M_i[0]; + tmpi[i + 2] = s1 * M_i[0] + r1 * M_r[0]; + tmpr[i + 3] = s2 * M_r[4] - r2 * M_i[4]; + tmpi[i + 3] = s2 * M_i[4] + r2 * M_r[4]; + } + + for ( i = 0; i < 16; i = i + 2 ) + { + s1 = tmpr[i] - tmpr[1 + i]; + r1 = tmpi[i] - tmpi[1 + i]; + + tmpr[i] = tmpr[i] + tmpr[1 + i]; + tmpi[i] = tmpi[i] + tmpi[1 + i]; + + tmpr[i + 1] = s1 * M_r[0] - r1 * M_i[0]; + tmpi[i + 1] = s1 * M_i[0] + r1 * M_r[0]; + } + + N = 16; + Nv2 = N >> 1; + nm1 = N - 1; + j = 0; + for ( i = 0; i < nm1; i++ ) + { + if ( i < j ) + { + r_samp[j] = tmpr[i] * M_Wr[j] - tmpi[i] * M_Wi[j]; + i_samp[j] = tmpr[i] * M_Wi[j] + tmpi[i] * M_Wr[j]; + r_samp[i] = tmpr[j] * M_Wr[i] - tmpi[j] * M_Wi[i]; + i_samp[i] = tmpr[j] * M_Wi[i] + tmpi[j] * M_Wr[i]; + } + else if ( i == j ) + { + r_samp[i] = tmpr[i] * M_Wr[i] - tmpi[i] * M_Wi[i]; + i_samp[i] = tmpr[i] * M_Wi[i] + tmpi[i] * M_Wr[i]; + } + + k = Nv2; + while ( k <= j ) + { + j -= k; + k >>= 1; + } + j += k; + } + + r_samp[15] = tmpr[15] * M_Wr[15] - tmpi[15] * M_Wi[15]; + i_samp[15] = tmpr[15] * M_Wi[15] + tmpi[15] * M_Wr[15]; + + return; +} + + +/*-------------------------------------------------------------------* + * subband_FFT() + * + * + *-------------------------------------------------------------------*/ + +void subband_FFT( + float Sr[16][60], /* i : real part of the cldfb */ + float Si[16][60], /* i : imag part of the cldfb */ + float *spec_amp /* o : spectral amplitude */ +) +{ + int16_t i, j; + float tmpr[16], tmpi[16]; + float ptmp[16], tmp1; + + for ( i = 0; i < 10; i++ ) + { + for ( j = 0; j < 16; j++ ) + { + tmpr[j] = Sr[j][i]; + tmpi[j] = Si[j][i]; + } + + fft16( tmpr, tmpi ); + + for ( j = 0; j < 16; j++ ) + { + ptmp[j] = tmpr[j] * tmpr[j] + tmpi[j] * tmpi[j]; + } + if ( i % 2 == 0 ) + { + for ( j = 0; j < 8; j++ ) + { + tmp1 = ptmp[j] + ptmp[15 - j]; + spec_amp[i * 8 + j] = (float) sqrt( tmp1 ); + } + } + else + { + for ( j = 0; j < 8; j++ ) + { + tmp1 = ptmp[j] + ptmp[15 - j]; + spec_amp[i * 8 + 7 - j] = (float) sqrt( tmp1 ); + } + } + } + + return; +} diff --git a/lib_enc/swb_bwe_enc.c b/lib_enc/swb_bwe_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..3ff74624aca6001e4ff3900e2f336a91f12b2252 --- /dev/null +++ b/lib_enc/swb_bwe_enc.c @@ -0,0 +1,1871 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "rom_com.h" +#include "rom_enc.h" +#include "basop_util.h" +#include "basop_proto_func.h" +#include "wmc_auto.h" + +/*---------------------------------------------------------------------* + * Local function prototypes + *---------------------------------------------------------------------*/ + +static int16_t SWB_BWE_encoding( Encoder_State *st, const float *insig, const float *insig_lp, const float *insig_hp, const float *synth, const float *yos, float *SWB_fenv, const float tilt_nb, const int16_t st_offset ); +static void MSVQ_Interpol_Tran( float *SWB_env_energy, int16_t *indice ); +static void calculate_tonality( const float *org, const float *gen, float *SFM_org, float *SFM_gen, const int16_t length ); +static int16_t WB_BWE_encoding( Encoder_State *st, const float *yos, float *WB_fenv ); +static void energy_control( Encoder_State *st, const int16_t core, const int16_t mode, const int16_t coder_type, const float *org, const int16_t offset, float *energy_factor ); +static int16_t decision_hq_generic_class( const float *coefs, const int16_t hq_generic_offset ); + + +/*-------------------------------------------------------------------* + * wb_bwe_enc() + * + * WB BWE encoder + *-------------------------------------------------------------------*/ + +void wb_bwe_enc( + Encoder_State *st, /* i/o: encoder state structure */ + const float *new_wb_speech /* i : original input signal at 16kHz */ +) +{ + FD_BWE_ENC_HANDLE hBWE_FD; + float old_input[NS2SA( 16000, DELAY_FD_BWE_ENC_NS + DELAY_FIR_RESAMPL_NS ) + L_FRAME16k]; + float *new_input; /* pointer to original input signal */ + float yorig[L_FRAME16k]; /* MDCT spectrum of weighted original */ + int16_t mode = 0; + float wtda_old_input[2 * L_FRAME16k]; + float WB_fenv[SWB_FENV]; + int16_t Sample_Delay_WB_BWE; + + hBWE_FD = st->hBWE_FD; + + if ( st->extl_brate > 0 ) + { + /*---------------------------------------------------------------------* + * Delay the original input signal to be synchronized with ACELP core synthesis + *---------------------------------------------------------------------*/ + + set_f( old_input, 0, NS2SA( 16000, DELAY_FD_BWE_ENC_12k8_NS + DELAY_FIR_RESAMPL_NS ) + L_FRAME16k ); + + Sample_Delay_WB_BWE = NS2SA( 16000, DELAY_FD_BWE_ENC_12k8_NS ); + + new_input = old_input + Sample_Delay_WB_BWE; + mvr2r( hBWE_FD->old_input_wb, old_input, Sample_Delay_WB_BWE ); + mvr2r( new_wb_speech, new_input, L_FRAME16k ); + mvr2r( old_input + L_FRAME16k, hBWE_FD->old_input_wb, Sample_Delay_WB_BWE ); + + /*---------------------------------------------------------------------* + * WB BWE encoding + *---------------------------------------------------------------------*/ + + /* MDCT of the original signal */ + wtda( old_input, wtda_old_input, hBWE_FD->old_wtda_swb, ALDO_WINDOW, ALDO_WINDOW, L_FRAME16k ); + + direct_transform( wtda_old_input, yorig, 0, L_FRAME16k, st->element_mode ); + + mode = WB_BWE_encoding( st, yorig, WB_fenv ); + + push_indice( st->hBstr, IND_WB_CLASS, mode - 2, 1 ); + } + + hBWE_FD->prev_mode = mode; + + return; +} + +/*-------------------------------------------------------------------* + * get_normalize_spec() + * + *-------------------------------------------------------------------*/ + +static void get_normalize_spec( + const int16_t core, /* i : core selected */ + const int16_t extl, /* i : extension layer selected */ + const int16_t mode, /* i : SHB BWE class */ + const int16_t core_type, /* i : coding type */ + const float *org, /* i : input spectrum */ + float *SWB_signal, /* o : output spectrum */ + int16_t *prev_L_swb_norm, /* i : previous norm. len */ + const int16_t offset /* i : frequency offset */ +) +{ + int16_t n_freq, L_swb_norm; + float envelope[L_FRAME32k]; + int16_t frq_end; + + set_f( SWB_signal, 0, HQ_GENERIC_HIGH0 + offset ); + calc_normal_length( core, org, mode, extl, &L_swb_norm, prev_L_swb_norm ); + + if ( extl == SWB_BWE || extl == FB_BWE ) + { + if ( mode == HARMONIC ) + { + mvr2r( org, &SWB_signal[240 + offset], 240 ); + mvr2r( &org[128], &SWB_signal[480 + offset], 80 ); + } + else + { + mvr2r( &org[112], &SWB_signal[240 + offset], 128 ); + mvr2r( &org[112], &SWB_signal[368 + offset], 128 ); + mvr2r( &org[176], &SWB_signal[496 + offset], 64 ); + } + frq_end = 560 + offset; + } + else if ( extl == WB_BWE ) + { + if ( core_type == 0 ) + { + mvr2r( &org[160], &SWB_signal[240], 80 ); + } + else + { + mvr2r( &org[80], &SWB_signal[240], 80 ); + } + frq_end = L_FRAME16k; + } + else + { + mvr2r( org + HQ_GENERIC_OFFSET, SWB_signal + HQ_GENERIC_HIGH0 + offset, HQ_GENERIC_LEN0 ); + mvr2r( org + HQ_GENERIC_OFFSET, SWB_signal + HQ_GENERIC_HIGH1 + offset, HQ_GENERIC_LEN0 ); + if ( offset == HQ_GENERIC_FOFFSET_24K4 ) + { + mvr2r( org + HQ_GENERIC_LOW0, SWB_signal + HQ_GENERIC_HIGH2 + offset, HQ_GENERIC_END_FREQ - HQ_GENERIC_HIGH2 ); + } + frq_end = L_FRAME32k; + } + + /* calculate envelope */ + calc_norm_envelop( SWB_signal, envelope, L_swb_norm, frq_end - offset, offset ); + + /* Normalize with envelope */ + for ( n_freq = swb_bwe_subband[0] + offset; n_freq < frq_end; n_freq++ ) + { + SWB_signal[n_freq] /= envelope[n_freq]; + } + + return; +} + +/*-------------------------------------------------------------------* + * WB_BWE_fenv_q() + * + * Scalar quantizer routine + *-------------------------------------------------------------------*/ + +/*! r: quantized gain index */ +static int16_t WB_BWE_fenv_q( + float *x, /* i/o: energy of WB envelop */ + const float *cb, /* i : quantizer codebook */ + const int16_t cb_length, /* i : length of codebook */ + const int16_t cb_dim /* i : dimension of codebook */ +) +{ + int16_t i, j, indx = 0; + float dist, min_dist; + const float *pit = cb; + + min_dist = FLT_MAX; + for ( i = 0; i < cb_length; i++ ) + { + dist = 0.0f; + for ( j = 0; j < cb_dim; j++ ) + { + dist += ( x[j] - ( *pit ) ) * ( x[j] - ( *pit ) ); + pit++; + } + + if ( dist < min_dist ) + { + min_dist = dist; + indx = i; + } + } + + for ( j = 0; j < cb_dim; j++ ) + { + x[j] = cb[cb_dim * indx + j]; + } + + return ( indx ); +} + +/*-------------------------------------------------------------------* + * FD_BWE_class() + * + * classify signal of above 6.4kHz, can be used for WB/SWB switch + *-------------------------------------------------------------------*/ + +/*! r: FD BWE class */ +static int16_t FD_BWE_class( + const float *fSpectrum, /* i : input spectrum */ + const float fGain, /* i : global gain */ + const float tilt_nb, /* i : BWE tilt */ + Encoder_State *st /* i/o: Encoder structure */ +) +{ + int16_t i, j, k, noise, sharpMod = 0; + float peak, mean[20], mag; + float sharpPeak; + const float *input_hi = 0; + float sharp; + float gain_tmp = 0; + int16_t mode; + float meanH, mean_d = 0; + int16_t sharplimit; + int16_t numsharp; + int16_t numharmonic; + + mode = NORMAL; + k = 0; + noise = 0; + sharpPeak = 0; + numsharp = 0; + numharmonic = 4; + sharplimit = 10; + + if ( st->extl == SWB_BWE || st->extl == FB_BWE ) + { + input_hi = &fSpectrum[256]; + numsharp = NUM_SHARP; + if ( ( st->last_extl == SWB_BWE && st->extl == SWB_BWE ) || ( st->last_extl == FB_BWE && st->extl == FB_BWE ) ) + { + gain_tmp = fGain / ( st->hBWE_FD->prev_global_gain + EPSILON ); + if ( st->hBWE_FD->prev_mode == TRANSIENT ) + { + numharmonic = numharmonic * 2; + } + else if ( st->hBWE_FD->prev_mode == NORMAL || st->hBWE_FD->prev_mode == NOISE ) + { + numharmonic = 3 * numharmonic / 2; + } + } + else + { + gain_tmp = 1; + if ( st->hBWE_FD->prev_mode == HARMONIC ) + { + numharmonic = numharmonic / 2; + sharplimit = sharplimit / 2; + } + else + { + numharmonic = numharmonic * 2; + sharplimit = sharplimit * 2; + } + } + } + else if ( st->extl == WB_BWE ) + { + input_hi = &fSpectrum[224]; + numsharp = NUM_SHARP / 3; + if ( st->hBWE_FD->prev_mode == HARMONIC ) + { + numharmonic = numharmonic / 4; + } + else + { + numharmonic = numharmonic / 2; + } + if ( st->last_extl != WB_BWE ) + { + if ( st->hBWE_FD->prev_mode == HARMONIC ) + { + sharplimit = sharplimit / 2; + } + else + { + sharplimit = sharplimit * 2; + } + } + } + + meanH = EPSILON; + for ( i = 0; i < numsharp; i++ ) + { + peak = 0.0f; + mean[i] = 0; + + for ( j = 0; j < SHARP_WIDTH; j++ ) + { + mag = (float) fabs( *input_hi ); + if ( mag > peak ) + { + peak = mag; + } + mean[i] += mag; + input_hi++; + } + meanH += mean[i]; + + if ( mean[i] != peak ) + { + sharp = (float) ( peak * ( SHARP_WIDTH - 1 ) / ( mean[i] - peak ) ); + } + else + { + sharp = 0.0f; + } + + if ( sharp > 4.5 && peak > 8 ) + { + k += 1; + } + else if ( sharp < 3.0 ) + { + noise += 1; + } + + if ( sharp > sharpPeak ) + { + sharpPeak = sharp; + } + } + + if ( st->extl == SWB_BWE || st->extl == FB_BWE ) + { + if ( k >= numharmonic && gain_tmp > 0.5f && gain_tmp < 1.8f && sharpPeak > sharplimit ) + { + sharpMod = 1; + } + else + { + sharpMod = 0; + } + meanH /= 288; + mean_d = 0.0f; + for ( i = 0; i < NUM_SHARP; i++ ) + { + mean_d += (float) fabs( mean[i] / 32 - meanH ); + } + } + else if ( st->extl == WB_BWE ) + { + if ( k >= numharmonic && sharpPeak > sharplimit ) + { + sharpMod = 1; + } + else + { + sharpMod = 0; + } + } + + if ( sharpMod && st->hBWE_FD->modeCount < 12 ) + { + st->hBWE_FD->modeCount++; + } + else if ( sharpMod == 0 && st->hBWE_FD->modeCount > 0 ) + { + st->hBWE_FD->modeCount--; + } + + if ( st->hBWE_FD->modeCount >= 2 ) + { + sharpMod = 1; + } + + if ( sharpMod ) + { + mode = HARMONIC; + } + else if ( st->extl == SWB_BWE || st->extl == FB_BWE ) + { + if ( noise > 4 && mean_d < 4.8f * meanH && tilt_nb < 5 ) + { + mode = NOISE; + } + } + + return mode; +} + +/*-------------------------------------------------------------------* + * WB_BWE_encoding() + * + * WB BWE main encoder + *-------------------------------------------------------------------*/ + +/*! r: classification of wb signal */ +static int16_t WB_BWE_encoding( + Encoder_State *st, /* i/o: Encoder structure */ + const float *yos, /* i : MDCT coefficients of weighted original */ + float *WB_fenv /* i/o: energy of WB envelope */ +) +{ + int16_t mode; + float global_gain; + float energy; + int16_t i, n_coeff, n_band; + int16_t index; + float energy_factor[4]; + + /* Energy for the different bands and global energies */ + global_gain = EPSILON; + + for ( i = 0, n_band = 0; i < 2; i++ ) + { + energy = EPSILON; + for ( n_coeff = swb_bwe_subband[n_band]; n_coeff < swb_bwe_subband[n_band + 2]; n_coeff++ ) + { + energy += yos[n_coeff] * yos[n_coeff]; + } + + WB_fenv[i] = energy; + n_band += 2; + global_gain += energy; + } + + mode = FD_BWE_class( yos, global_gain, 0, st ); + + energy_control( st, ACELP_CORE, mode, st->coder_type, yos, 0, energy_factor ); + + for ( i = 0; i < 2; i++ ) + { + WB_fenv[i] = (float) ( log10( WB_fenv[i] * energy_factor[i << 1] / 40 ) * FAC_LOG2 ); + } + + index = WB_BWE_fenv_q( WB_fenv, F_2_5, 32, 2 ); + + push_indice( st->hBstr, IND_WB_FENV, index, 5 ); + + + return ( mode ); +} + + +/*-------------------------------------------------------------------* + * swb_bwe_enc() + * + * SWB BWE encoder (only for 32kHz signals) + *-------------------------------------------------------------------*/ + +void swb_bwe_enc( + Encoder_State *st, /* i/o: encoder state structure */ + const int16_t last_element_mode, /* i : last element mode */ + const float *old_input_12k8, /* i : input signal @12.8kHz for SWB BWE */ + const float *old_input_16k, /* i : input signal @16kHz for SWB BWE */ + const float *old_syn_12k8_16k, /* i : ACELP core synthesis at 12.8kHz or 16kHz*/ + const float *new_swb_speech, /* i : original input signal at 32kHz */ + const float *shb_speech /* i : SHB target signal (6-14kHz) at 16kHz */ +) +{ + int16_t i, inner_frame, idxGain; + TD_BWE_ENC_HANDLE hBWE_TD; + FD_BWE_ENC_HANDLE hBWE_FD; + float *new_input; + int32_t inner_Fs; + float old_input[NS2SA( 48000, DELAY_FD_BWE_ENC_NS + DELAY_FIR_RESAMPL_NS ) + L_FRAME48k]; + float old_input_lp[L_FRAME16k], new_input_hp[L_FRAME16k]; + float yorig[L_FRAME48k]; + float wtda_old_input[2 * L_FRAME48k]; + float SWB_fenv[SWB_FENV]; + float tilt_nb; + int16_t Sample_Delay_SWB_BWE, Sample_Delay_HP, Sample_Delay_LP; + float ener_low, energy_fbe_fb, fb_ener_adjust, ener_adjust_quan; + int16_t fb_band_begin; + + hBWE_TD = st->hBWE_TD; + hBWE_FD = st->hBWE_FD; + + ener_adjust_quan = 0.0f; + idxGain = 0; + + /*---------------------------------------------------------------------* + * Delay the original input signal to be synchronized with ACELP core synthesis + *---------------------------------------------------------------------*/ + + if ( st->extl == FB_BWE ) + { + inner_frame = L_FRAME48k; + inner_Fs = 48000; + } + else + { + inner_frame = L_FRAME32k; + inner_Fs = 32000; + } + + set_f( old_input, 0.0f, NS2SA( inner_Fs, DELAY_FD_BWE_ENC_12k8_NS + DELAY_FIR_RESAMPL_NS ) + inner_frame ); + + if ( st->L_frame == L_FRAME ) + { + Sample_Delay_SWB_BWE = NS2SA( inner_Fs, DELAY_FD_BWE_ENC_12k8_NS + DELAY_FIR_RESAMPL_NS ); + Sample_Delay_HP = NS2SA( 16000, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_12k8_NS + DELAY_FIR_RESAMPL_NS - DELAY_CLDFB_NS ); + if ( st->element_mode == IVAS_CPE_TD ) + { + Sample_Delay_HP = NS2SA( 16000, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_12k8_NS + DELAY_FIR_RESAMPL_NS - DELAY_CLDFB_NS - L_MEM_RECALC_TBE_NS ); + } + Sample_Delay_LP = NS2SA( 12800, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_12k8_NS ); + + if ( st->element_mode > EVS_MONO ) + { + Sample_Delay_SWB_BWE -= NS2SA( inner_Fs, DELAY_FIR_RESAMPL_NS ); + Sample_Delay_HP -= NS2SA( 16000, DELAY_FIR_RESAMPL_NS ); + + if ( st->element_mode == IVAS_CPE_DFT ) + { + mvr2r( old_input_12k8 + L_INP_MEM - Sample_Delay_LP, hBWE_FD->old_input_lp, Sample_Delay_LP ); + mvr2r( hBWE_TD->old_speech_shb + L_LOOK_16k + L_SUBFR16k - Sample_Delay_HP, new_input_hp, Sample_Delay_HP ); + } + } + + mvr2r( hBWE_FD->old_input_lp, old_input_lp, Sample_Delay_LP ); + mvr2r( old_input_12k8 + L_INP_MEM, &old_input_lp[Sample_Delay_LP], L_FRAME - Sample_Delay_LP ); + mvr2r( old_input_12k8 + L_INP_MEM + L_FRAME - Sample_Delay_LP, hBWE_FD->old_input_lp, Sample_Delay_LP ); + } + else + { + Sample_Delay_SWB_BWE = NS2SA( inner_Fs, DELAY_FD_BWE_ENC_16k_NS + DELAY_FIR_RESAMPL_NS ); + Sample_Delay_HP = NS2SA( 16000, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_16k_NS + DELAY_FIR_RESAMPL_NS - DELAY_CLDFB_NS ); + if ( st->element_mode == IVAS_CPE_TD ) + { + Sample_Delay_HP = NS2SA( 16000, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_16k_NS + DELAY_FIR_RESAMPL_NS - DELAY_CLDFB_NS - L_MEM_RECALC_TBE_NS ); + } + Sample_Delay_LP = NS2SA( 16000, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_16k_NS ); + + if ( st->element_mode > EVS_MONO ) + { + Sample_Delay_SWB_BWE -= NS2SA( inner_Fs, DELAY_FIR_RESAMPL_NS ); + Sample_Delay_HP -= NS2SA( 16000, DELAY_FIR_RESAMPL_NS ); + + if ( st->element_mode == IVAS_CPE_DFT ) + { + mvr2r( old_input_16k + L_INP_MEM - Sample_Delay_LP, hBWE_FD->old_input_lp, Sample_Delay_LP ); + mvr2r( hBWE_TD->old_speech_shb + L_LOOK_16k + L_SUBFR16k - Sample_Delay_HP, new_input_hp, Sample_Delay_HP ); + } + } + + mvr2r( hBWE_FD->old_input_lp, old_input_lp, Sample_Delay_LP ); + mvr2r( old_input_16k + L_INP_MEM, &old_input_lp[Sample_Delay_LP], L_FRAME16k - Sample_Delay_LP ); + mvr2r( old_input_16k + L_INP_MEM + L_FRAME16k - Sample_Delay_LP, hBWE_FD->old_input_lp, Sample_Delay_LP ); + } + + mvr2r( hBWE_FD->new_input_hp, new_input_hp, Sample_Delay_HP ); + mvr2r( shb_speech, new_input_hp + Sample_Delay_HP, L_FRAME16k - Sample_Delay_HP ); + mvr2r( shb_speech + L_FRAME16k - Sample_Delay_HP, hBWE_FD->new_input_hp, Sample_Delay_HP ); + + new_input = old_input + Sample_Delay_SWB_BWE; + mvr2r( hBWE_FD->old_input, old_input, Sample_Delay_SWB_BWE ); + mvr2r( new_swb_speech, new_input, inner_frame ); + mvr2r( old_input + inner_frame, hBWE_FD->old_input, Sample_Delay_SWB_BWE ); + + /*----------------------------------------------------------------------* + * Calculate tilt of the input signal and the ACELP core synthesis + *----------------------------------------------------------------------*/ + + calc_tilt_bwe( old_input_lp, &tilt_nb, L_FRAME ); + + /*---------------------------------------------------------------------* + * SWB BWE encoding + * FB BWE encoding + *---------------------------------------------------------------------*/ + + if ( st->idchan == 1 && last_element_mode == IVAS_CPE_DFT ) + { + for ( i = 0; i < inner_frame; i++ ) + { + hBWE_FD->old_wtda_swb[i] *= (float) i / (float) inner_frame; + } + } + + /* windowing of the original input signal */ + wtda( old_input, wtda_old_input, hBWE_FD->old_wtda_swb, ALDO_WINDOW, ALDO_WINDOW, inner_frame ); + + /* DCT of the original input signal */ + direct_transform( wtda_old_input, yorig, 0, inner_frame, st->element_mode ); + + /* high-band gain control in case of BWS */ + if ( st->bwidth_sw_cnt > 0 ) + { + v_multc( yorig + L_FRAME16k, (float) ( st->bwidth_sw_cnt ) / (float) BWS_TRAN_PERIOD, yorig + L_FRAME16k, inner_frame - L_FRAME16k ); + } + + /* FB BWE encoding */ + if ( st->extl == FB_BWE ) + { + fb_band_begin = FB_BAND_BEGIN; + if ( st->L_frame == L_FRAME ) + { + fb_band_begin = FB_BAND_BEGIN_12k8; + } + + energy_fbe_fb = sum2_f( yorig + fb_band_begin, FB_BAND_WIDTH ) + EPSILON; + ener_low = EPSILON; + for ( i = fb_band_begin - FB_BAND_WIDTH; i < fb_band_begin; i++ ) + { + ener_low += yorig[i] * yorig[i]; + } + + fb_ener_adjust = (float) sqrt( energy_fbe_fb / ener_low ); + fb_ener_adjust = min( fb_ener_adjust, FB_MAX_GAIN_VAR ); + idxGain = (int16_t) usquant( fb_ener_adjust, &ener_adjust_quan, FB_GAIN_QLOW, FB_GAIN_QDELTA, 1 << NUM_BITS_FB_FRAMEGAIN ); + } + + /* SWB BWE encoding */ + if ( st->L_frame == L_FRAME16k ) + { + SWB_BWE_encoding( st, old_input, old_input_lp, new_input_hp, old_syn_12k8_16k, yorig, SWB_fenv, tilt_nb, 80 ); + } + else + { + SWB_BWE_encoding( st, old_input, old_input_lp, new_input_hp, old_syn_12k8_16k, yorig, SWB_fenv, tilt_nb, 6 ); + } + + /* write FB BWE frame gain to the bitstream */ + if ( st->extl == FB_BWE ) + { + push_indice( st->hBstr, IND_FB_SLOPE, idxGain, NUM_BITS_FB_FRAMEGAIN ); + } + + return; +} + + +/*-------------------------------------------------------------------* + * Freq_weights() + * + *-------------------------------------------------------------------*/ + +static void freq_weights( + const float Band_Ener[], /* i : Band energy */ + const float f_weighting[], /* i : weigting coefs. */ + float w_env[], /* o : Freq. weighting */ + const int16_t Nbands /* i : Number of bands */ +) +{ + int16_t i; + float tmp, w1[SWB_FENV], w2[SWB_FENV]; + float min_b, max_b; + + /* Find Max band energy */ + min_b = Band_Ener[0]; + max_b = Band_Ener[0]; + for ( i = 1; i < Nbands; i++ ) + { + if ( Band_Ener[i] < min_b ) + { + min_b = Band_Ener[i]; + } + if ( Band_Ener[i] > max_b ) + { + max_b = Band_Ener[i]; + } + } + + /* Find weighting function */ + tmp = 1.f / ( max_b - min_b ); + for ( i = 0; i < Nbands; i++ ) + { + w1[i] = ( Band_Ener[i] - min_b ) * tmp + 1.f; /*1<= var <=2 */ + w2[i] = f_weighting[i]; /*1~0.75*/ + w_env[i] = w1[i] * w2[i]; + } + + return; +} + + +/*-------------------------------------------------------------------* + * VQwithCand_w() + * + *-------------------------------------------------------------------*/ + +static void vqWithCand_w( + const float *x, /* i : input vector */ + const float *E_ROM_dico, /* i : codebook */ + const int16_t dim, /* i : codebook dimension */ + const int16_t E_ROM_dico_size, /* i : codebook size */ + int16_t *index, /* o : survivors indices */ + const int16_t surv, /* i : survivor number */ + float dist_min[], /* o : minimum distortion */ + const float *w, /* i : weighting */ + const int16_t flag /* i : flag indicationg weighted distortion metric */ +) +{ + int16_t i, j, k, l; + const float *p_E_ROM_dico; + float dist, temp1; + + if ( flag ) + { + set_f( dist_min, 3.402823466e+38F, surv ); /* FLT_MAX */ + + for ( i = 0; i < surv; i++ ) + { + index[i] = i; + } + + p_E_ROM_dico = E_ROM_dico; + + for ( i = 0; i < E_ROM_dico_size; i++ ) + { + dist = x[0] - *p_E_ROM_dico++; + dist *= ( dist * w[0] ); + + for ( j = 1; j < dim; j++ ) + { + temp1 = x[j] - *p_E_ROM_dico++; + dist += temp1 * temp1 * w[j]; + } + + for ( k = 0; k < surv; k++ ) + { + if ( dist < dist_min[k] ) + { + for ( l = surv - 1; l > k; l-- ) + { + dist_min[l] = dist_min[l - 1]; + index[l] = index[l - 1]; + } + dist_min[k] = dist; + index[k] = i; + break; + } + } + } + } + else + { + set_f( dist_min, 3.402823466e+38F, surv ); /* FLT_MAX */ + + for ( i = 0; i < surv; i++ ) + { + index[i] = i; + } + + p_E_ROM_dico = E_ROM_dico; + + for ( i = 0; i < E_ROM_dico_size; i++ ) + { + dist = x[0] - *p_E_ROM_dico++; + dist *= dist; + + for ( j = 1; j < dim; j++ ) + { + temp1 = x[j] - *p_E_ROM_dico++; + dist += temp1 * temp1; + } + + for ( k = 0; k < surv; k++ ) + { + if ( dist < dist_min[k] ) + { + for ( l = surv - 1; l > k; l-- ) + { + dist_min[l] = dist_min[l - 1]; + index[l] = index[l - 1]; + } + dist_min[k] = dist; + index[k] = i; + break; + } + } + } + } + + return; +} + +/*-------------------------------------------------------------------* + * vqSimple_w() + * + *-------------------------------------------------------------------*/ + +static int16_t vqSimple_w( + const float *x, /* i : input for quantizer */ + float *y, /* i : quantized value */ + const float *cb, /* i : codebooks */ + const float *w, /* i : weight */ + const int16_t dim, /* i : dimension */ + const int16_t l, /* i : number of candidates */ + const int16_t flag /* i : flag indicationg weighted distortion metric */ +) +{ + int16_t i, j, index; + const float *cbP; + float dist_min, dist, temp; + + index = 0; + dist_min = FLT_MAX; + cbP = cb; + + if ( flag ) + { + for ( i = 0; i < l; i++ ) + { + dist = x[0] - *cbP++; + dist *= ( dist * w[0] ); + for ( j = 1; j < dim; j++ ) + { + temp = x[j] - *cbP++; + dist += temp * temp * w[j]; + } + + if ( dist < dist_min ) + { + dist_min = dist; + index = i; + } + } + } + else + { + for ( i = 0; i < l; i++ ) + { + dist = x[0] - *cbP++; + dist *= dist; + for ( j = 1; j < dim; j++ ) + { + temp = x[j] - *cbP++; + dist += temp * temp; + } + + if ( dist < dist_min ) + { + dist_min = dist; + index = i; + } + } + } + + /* Reading the selected vector */ + mvr2r( &cb[index * dim], y, dim ); + + return ( index ); +} + +/*-------------------------------------------------------------------* + * MSVQ_Interpol_Tran() + * + *-------------------------------------------------------------------*/ + +static void MSVQ_Interpol_Tran( + float *SWB_env_energy, /* i/o: (original/quantized) energy */ + int16_t *indice /* o : quantized index */ +) +{ + int16_t k, n_band, candInd[N_CAND_TR], ind_tmp[2]; + float env_temp11[SWB_FENV_TRANS / 2], env_temp12[SWB_FENV_TRANS / 2]; + float dist, minDist, tmp_q; + float quant_tmp[SWB_FENV_TRANS], quant_tmp2[SWB_FENV_TRANS]; + float distCand[N_CAND_TR], quant_select[SWB_FENV_TRANS]; + + /* Extract target vector */ + for ( n_band = 0; n_band < DIM_TR1; n_band++ ) + { + env_temp11[n_band] = SWB_env_energy[2 * n_band]; + env_temp12[n_band] = SWB_env_energy[2 * n_band + 1]; + } + + vqWithCand_w( env_temp11, Env_TR_Cdbk1, DIM_TR1, N_CB_TR1, candInd, N_CAND_TR, distCand, NULL, 0 ); + + minDist = FLT_MAX; + for ( k = 0; k < N_CAND_TR; k++ ) + { + for ( n_band = 0; n_band < DIM_TR1; n_band++ ) + { + quant_tmp[n_band] = Env_TR_Cdbk1[candInd[k] * DIM_TR1 + n_band]; + } + + for ( n_band = 0; n_band < DIM_TR2 - 1; n_band++ ) + { + quant_tmp2[n_band] = env_temp12[n_band] - ( ( quant_tmp[n_band] + quant_tmp[n_band + 1] ) / 2.f ); + } + quant_tmp2[n_band] = env_temp12[n_band] - quant_tmp[n_band]; + ind_tmp[0] = vqSimple_w( quant_tmp2, quant_tmp2, Env_TR_Cdbk2, NULL, DIM_TR2, N_CB_TR2, 0 ); + + for ( n_band = 0; n_band < DIM_TR1; n_band++ ) + { + quant_select[n_band * 2] = quant_tmp[n_band]; + } + + for ( n_band = 0; n_band < DIM_TR2 - 1; n_band++ ) + { + quant_select[n_band * 2 + 1] = ( ( quant_tmp[n_band] + quant_tmp[n_band + 1] ) / 2.f ) + quant_tmp2[n_band]; + } + quant_select[n_band * 2 + 1] = quant_tmp[n_band] + quant_tmp2[n_band]; + + dist = 0.f; + for ( n_band = 0; n_band < SWB_FENV_TRANS; n_band++ ) + { + tmp_q = SWB_env_energy[n_band] - quant_select[n_band]; + dist += tmp_q * tmp_q; + } + + /* Check optimal candidate */ + if ( dist < minDist ) + { + minDist = dist; + indice[0] = candInd[k]; + indice[1] = ind_tmp[0]; + } + } + + return; +} + +/*-------------------------------------------------------------------* + * MSVQ_Interpol() + * + *-------------------------------------------------------------------*/ +static void msvq_interpol( + float *SWB_env_energy, /* i/o: (original/quantized) energy */ + float *w_env, /* i/o: weighting coffecients */ + int16_t *indice /* o : quantized index */ +) +{ + int16_t k, n_band, candInd[N_CAND], ind_tmp[4]; + float dist, minDist, tmp_q; + float env_temp11[SWB_FENV / 2], env_temp12[SWB_FENV / 2]; + float quant_tmp[SWB_FENV], quant_tmp1[SWB_FENV], quant_tmp2[SWB_FENV], distCand[N_CAND]; + float quant_select[SWB_FENV], w_env11[SWB_FENV / 2], w_env12[SWB_FENV / 2]; + float synth_energy[SWB_FENV]; + + /* Extract target vector */ + for ( n_band = 0; n_band < DIM11; n_band++ ) + { + env_temp11[n_band] = SWB_env_energy[2 * n_band]; + env_temp12[n_band] = SWB_env_energy[2 * n_band + 1]; + + w_env11[n_band] = w_env[2 * n_band]; + w_env12[n_band] = w_env[2 * n_band + 1]; + } + + vqWithCand_w( env_temp11, EnvCdbk11, DIM11, N_CB11, candInd, N_CAND, distCand, w_env11, 1 ); + + minDist = FLT_MAX; + for ( k = 0; k < N_CAND; k++ ) + { + for ( n_band = 0; n_band < DIM11; n_band++ ) + { + quant_tmp1[n_band] = EnvCdbk11[candInd[k] * DIM11 + n_band]; + quant_tmp2[n_band] = env_temp11[n_band] - quant_tmp1[n_band]; + } + + ind_tmp[0] = vqSimple_w( quant_tmp2, quant_tmp2, EnvCdbk1st, w_env11, DIM1ST, N_CB1ST, 1 ); + ind_tmp[1] = vqSimple_w( quant_tmp2 + DIM1ST, quant_tmp2 + DIM1ST, EnvCdbk2nd, w_env11 + DIM1ST, DIM2ND, N_CB2ND, 1 ); + + /* Extract vector for odd position */ + for ( n_band = 0; n_band < DIM11; n_band++ ) + { + quant_tmp[n_band] = quant_tmp1[n_band] + quant_tmp2[n_band]; + } + + for ( n_band = 0; n_band < DIM12 - 1; n_band++ ) + { + quant_tmp2[n_band] = env_temp12[n_band] - ( ( quant_tmp[n_band] + quant_tmp[n_band + 1] ) / 2.f ); + } + + quant_tmp2[n_band] = env_temp12[n_band] - quant_tmp[n_band]; + + ind_tmp[2] = vqSimple_w( quant_tmp2, quant_tmp2, EnvCdbk3rd, w_env12, DIM3RD, N_CB3RD, 1 ); + ind_tmp[3] = vqSimple_w( quant_tmp2 + DIM3RD, quant_tmp2 + DIM3RD, EnvCdbk4th, w_env12 + DIM3RD, DIM4TH, N_CB4TH, 1 ); + + for ( n_band = 0; n_band < DIM11; n_band++ ) + { + quant_select[n_band * 2] = quant_tmp[n_band]; + } + + for ( n_band = 0; n_band < DIM12 - 1; n_band++ ) + { + quant_select[n_band * 2 + 1] = ( ( quant_tmp[n_band] + quant_tmp[n_band + 1] ) / 2.f ) + quant_tmp2[n_band]; + } + quant_select[n_band * 2 + 1] = quant_tmp[n_band] + quant_tmp2[n_band]; + + dist = 0.f; + for ( n_band = 0; n_band < SWB_FENV; n_band++ ) + { + tmp_q = SWB_env_energy[n_band] - quant_select[n_band]; + tmp_q = tmp_q * tmp_q; + dist += tmp_q * w_env[n_band]; + } + + /* Check optimal candidate */ + if ( dist < minDist ) + { + minDist = dist; + mvr2r( quant_select, synth_energy, SWB_FENV ); + + indice[0] = candInd[k]; + indice[1] = ind_tmp[0]; + indice[2] = ind_tmp[1]; + indice[3] = ind_tmp[2]; + indice[4] = ind_tmp[3]; + } + } + + mvr2r( synth_energy, SWB_env_energy, SWB_FENV ); + + return; +} + +/*-------------------------------------------------------------------* + * msvq_interpol_2() + * + * + *-------------------------------------------------------------------*/ + +static void msvq_interpol_2( + float *hq_generic_fenv, /* i/o: (original/quantized) energy */ + const float *w_env, /* i : weighting coffecients */ + int16_t *indice, /* o : quantized index */ + const int16_t nenv /* i : the number of envelopes */ +) +{ + int16_t k, n_band, candInd[N_CAND], ind_tmp[4]; + float dist, minDist, tmp_q; + float env_temp11[SWB_FENV / 2], env_temp12[SWB_FENV / 2]; + float quant_tmp[SWB_FENV], quant_tmp1[SWB_FENV], quant_tmp2[SWB_FENV], distCand[N_CAND]; + float quant_select[SWB_FENV], w_env11[SWB_FENV / 2], w_env12[SWB_FENV / 2]; + float synth_energy[SWB_FENV]; + + /* Extract target vector */ + for ( n_band = 0; n_band < DIM11 - 1; n_band++ ) + { + env_temp11[n_band] = hq_generic_fenv[2 * n_band]; + w_env11[n_band] = w_env[2 * n_band]; + } + env_temp11[DIM11 - 1] = hq_generic_fenv[2 * ( DIM11 - 2 ) + 1]; + w_env11[DIM11 - 1] = w_env[2 * ( DIM11 - 2 ) + 1]; + + env_temp12[0] = hq_generic_fenv[0]; + w_env12[0] = w_env[0]; + for ( n_band = 1; n_band < DIM11 - 1; n_band++ ) + { + env_temp12[n_band] = hq_generic_fenv[2 * n_band - 1]; + w_env12[n_band] = w_env[2 * n_band - 1]; + } + + vqWithCand_w( env_temp11, EnvCdbk11, DIM11, N_CB11, candInd, N_CAND, distCand, w_env11, 1 ); + + minDist = FLT_MAX; + for ( k = 0; k < N_CAND; k++ ) + { + for ( n_band = 0; n_band < DIM11; n_band++ ) + { + quant_tmp1[n_band] = EnvCdbk11[candInd[k] * DIM11 + n_band]; + quant_tmp2[n_band] = env_temp11[n_band] - quant_tmp1[n_band]; + } + + ind_tmp[0] = vqSimple_w( quant_tmp2, quant_tmp2, EnvCdbk1st, w_env11, DIM1ST, N_CB1ST, 1 ); + ind_tmp[1] = vqSimple_w( quant_tmp2 + DIM1ST, quant_tmp2 + DIM1ST, EnvCdbk2nd, w_env11 + DIM1ST, DIM2ND, N_CB2ND, 1 ); + + /* Extract vector for odd position */ + for ( n_band = 0; n_band < DIM11; n_band++ ) + { + quant_tmp[n_band] = quant_tmp1[n_band] + quant_tmp2[n_band]; + } + + quant_tmp2[0] = env_temp12[0] - quant_tmp[0]; + for ( n_band = 1; n_band < DIM12 - 1; n_band++ ) + { + quant_tmp2[n_band] = env_temp12[n_band] - ( ( quant_tmp[n_band - 1] + quant_tmp[n_band] ) / 2.f ); + } + + ind_tmp[2] = vqSimple_w( quant_tmp2, quant_tmp2, EnvCdbk3rd, w_env12, DIM3RD, N_CB3RD, 1 ); + ind_tmp[3] = vqSimple_w( quant_tmp2 + DIM3RD, quant_tmp2 + DIM3RD, EnvCdbk3rd, w_env12 + DIM3RD, DIM3RD, N_CB3RD, 1 ); + + for ( n_band = 0; n_band < DIM12 - 1; n_band++ ) + { + quant_select[n_band * 2] = quant_tmp[n_band]; + } + quant_select[11] = quant_tmp[DIM12 - 1]; + + quant_select[0] += quant_tmp2[0]; + for ( n_band = 1; n_band < DIM12 - 1; n_band++ ) + { + quant_select[n_band * 2 - 1] = ( ( quant_tmp[n_band - 1] + quant_tmp[n_band] ) / 2.f ) + quant_tmp2[n_band]; + } + + dist = 0.f; + for ( n_band = 0; n_band < SWB_FENV - 2; n_band++ ) + { + tmp_q = hq_generic_fenv[n_band] - quant_select[n_band]; + tmp_q = tmp_q * tmp_q; + dist += tmp_q * w_env[n_band]; + } + + /* Check optimal candidate */ + if ( dist < minDist ) + { + minDist = dist; + mvr2r( quant_select, synth_energy, SWB_FENV - 2 ); + synth_energy[SWB_FENV - 2] = 0; + synth_energy[SWB_FENV - 1] = 0; + + indice[0] = candInd[k]; + indice[1] = ind_tmp[0]; + indice[2] = ind_tmp[1]; + indice[3] = ind_tmp[2]; + indice[4] = ind_tmp[3]; + } + } + + mvr2r( synth_energy, hq_generic_fenv, nenv ); + + return; +} + +/*-------------------------------------------------------------------* + * calculate_tonality() + * + * Calculate tonality + *-------------------------------------------------------------------*/ + +static void calculate_tonality( + const float *org, /* i : MDCT coefficients of original */ + const float *gen, /* i : MDCT coefficients of generated signal */ + float *SFM_org, /* o : Spectral Flatness results */ + float *SFM_gen, /* o : Spectral Flatness results */ + const int16_t length /* i : length for calculating tonality */ +) +{ + int16_t n_coeff; + float am_org, am_gen, gm_org, gm_gen; + float inv_len, max_val, mult; + float org_spec[80], gen_spec[80]; + + /* to reduce dynamic range of original spectrum */ + max_val = EPSILON; + for ( n_coeff = 0; n_coeff < length; n_coeff++ ) + { + org_spec[n_coeff] = (float) fabs( org[n_coeff] ); + + if ( max_val < org_spec[n_coeff] ) + { + max_val = org_spec[n_coeff]; + } + } + mult = 25.f / max_val; + + for ( n_coeff = 0; n_coeff < length; n_coeff++ ) + { + org_spec[n_coeff] *= mult; + } + + max_val = EPSILON; + for ( n_coeff = 0; n_coeff < length; n_coeff++ ) + { + gen_spec[n_coeff] = (float) fabs( gen[n_coeff] ); + + if ( max_val < gen_spec[n_coeff] ) + { + max_val = gen_spec[n_coeff]; + } + } + mult = 25.f / max_val; + + for ( n_coeff = 0; n_coeff < length; n_coeff++ ) + { + gen_spec[n_coeff] *= mult; + } + + inv_len = 1.f / (float) length; + + am_org = EPSILON; + am_gen = EPSILON; + gm_org = 1.f; + gm_gen = 1.f; + + for ( n_coeff = 0; n_coeff < length; n_coeff++ ) + { + am_org += org_spec[n_coeff]; + am_gen += gen_spec[n_coeff]; + gm_org *= org_spec[n_coeff]; + gm_gen *= gen_spec[n_coeff]; + } + + *SFM_org = 10.f * ( (float) log10( am_org * inv_len ) - inv_len * (float) log10( gm_org ) ); + *SFM_org = max( 0.0001f, min( *SFM_org, 5.993f ) ); + *SFM_gen = 10.f * ( (float) log10( am_gen * inv_len ) - inv_len * (float) log10( gm_gen ) ); + *SFM_gen = max( 0.0001f, min( *SFM_gen, 5.993f ) ); + + return; +} + +/*-------------------------------------------------------------------* + * energy_control() + * + *-------------------------------------------------------------------*/ + +static void energy_control( + Encoder_State *st, /* i/o: encoder structure */ + const int16_t core, /* i : core */ + const int16_t mode, /* i : SHB BWE class */ + const int16_t coder_type, /* i : SHB BWE class */ + const float *org, /* i : input spectrum */ + const int16_t offset, /* i : frequency offset */ + float *energy_factor /* o : energy factor */ +) +{ + int16_t n_band; + float gamma; + int16_t core_type; + float SWB_signal[L_FRAME32k], SFM_org[SWB_FENV], SFM_gen[SWB_FENV]; + int16_t max_band = SWB_FENV, band_step = 1; + + if ( core == ACELP_CORE ) + { + gamma = 0.35f; + if ( coder_type != AUDIO && st->total_brate <= ACELP_8k00 ) + { + core_type = 0; + } + else + { + core_type = 1; + } + + get_normalize_spec( core, st->extl, mode, core_type, org, SWB_signal, &( st->hBWE_FD->prev_L_swb_norm1 ), offset ); + + if ( st->extl == WB_BWE ) + { + max_band = 4; + band_step = 2; + } + } + else /* HQ core */ + { + gamma = 0.55f; + get_normalize_spec( core, -1, mode, -1, org, SWB_signal, &( st->hBWE_FD->prev_L_swb_norm1 ), offset ); + + if ( offset == HQ_GENERIC_FOFFSET_32K ) + { + max_band = 12; + } + } + + for ( n_band = 0; n_band < max_band; n_band += band_step ) + { + calculate_tonality( org + swb_bwe_subband[n_band] + offset, SWB_signal + swb_bwe_subband[n_band] + offset, &SFM_org[n_band], &SFM_gen[n_band], swb_bwe_subband[n_band + band_step] - swb_bwe_subband[n_band] ); + + if ( SFM_gen[n_band] < 0.75 * SFM_org[n_band] ) + { + energy_factor[n_band] = ( SFM_gen[n_band] / SFM_org[n_band] ); + + if ( energy_factor[n_band] < gamma ) + { + energy_factor[n_band] = gamma; + } + } + else + { + energy_factor[n_band] = 1.0f; + } + } + + return; +} + +/*-------------------------------------------------------------------* + * SWB_BWE_encoding() + * + * SWB BWE encoder + *-------------------------------------------------------------------*/ + +static int16_t SWB_BWE_encoding( + Encoder_State *st, /* i/o: Encoder state structure */ + const float *insig, /* i : delayed original input signal at 32kHz */ + const float *insig_lp, /* i : delayed original lowband input signal at 16kHz */ + const float *insig_hp, /* i : delayed original highband input signal at 16kHz */ + const float *synth, /* i : delayed ACELP core synthesis at 12.8kHz */ + const float *yos, /* i : MDCT coefficients of the windowed original input signal at 32kHz */ + float *SWB_fenv, /* o : frequency-domain quantized BWE envelope */ + const float tilt_nb, /* i : SWB tilt */ + const int16_t st_offset /* i : start frequency offset for BWE envelope */ +) +{ + int16_t IsTransient, mode; + int16_t index; + float SWB_tenv_tmp[SWB_TENV]; + float SWB_tenv[SWB_TENV]; + float global_gain; + float energy; + float max_val; + int16_t i, n_coeff, n_band, pos, indice[6]; + float tilt, WB_tenv_orig, WB_tenv_syn, Rat_tenv; + float energy_factor[SWB_FENV], w_env[SWB_FENV]; + int16_t L; + int16_t IsTransient_LF; + BSTR_ENC_HANDLE hBstr = st->hBstr; + + if ( st->L_frame == L_FRAME ) + { + L = L_SUBFR; + } + else + { + L = L_SUBFR16k; + } + + /* HF transient detect */ + IsTransient = detect_transient( st, insig_hp, L_FRAME16k ); + + /* LF transient detect */ + IsTransient_LF = 0; + for ( n_band = 0; n_band < 4; n_band++ ) + { + energy = EPSILON; + for ( i = 0; i < L; i++ ) + { + energy += insig_lp[i + n_band * L] * insig_lp[i + n_band * L]; + } + + if ( energy > 5.5f * st->hBWE_FD->EnergyLF ) + { + IsTransient_LF = 1; + } + + st->hBWE_FD->EnergyLF = energy; + } + + calc_tilt_bwe( insig, &tilt, L_FRAME32k ); + + if ( IsTransient == 1 && ( tilt > 8.0 || st->clas > 1 ) ) + { + IsTransient = 0; + st->TransientHangOver = 0; + } + + if ( IsTransient == 1 ) + { + mode = IsTransient; + push_indice( hBstr, IND_SWB_CLASS, mode, 2 ); + + /* Energy for the different bands and global energies */ + global_gain = 0; + for ( n_band = 0; n_band < SWB_FENV_TRANS; n_band++ ) + { + energy = EPSILON; + for ( n_coeff = swb_bwe_trans_subband[n_band] + st_offset; n_coeff < swb_bwe_trans_subband[n_band + 1] + st_offset; n_coeff++ ) + { + energy += yos[n_coeff] * yos[n_coeff]; + } + global_gain += energy; + SWB_fenv[n_band] = energy; + } + global_gain *= 0.5f; + + for ( n_band = 0; n_band < SWB_FENV_TRANS; n_band++ ) + { + SWB_fenv[n_band] = 10.0f * (float) log10( SWB_fenv[n_band] / swb_bwe_trans_subband_width[n_band] ) - Mean_env_tr[n_band]; + } + + WB_tenv_orig = EPSILON; + WB_tenv_syn = EPSILON; + for ( n_band = 0; n_band < SWB_TENV; n_band++ ) + { + SWB_tenv[n_band] = EPSILON; + + for ( i = 0; i < L_SUBFR16k; i++ ) + { + SWB_tenv[n_band] += insig_hp[i + n_band * L_SUBFR16k] * insig_hp[i + n_band * L_SUBFR16k]; + } + + for ( i = 0; i < L; i++ ) + { + WB_tenv_syn += synth[i + n_band * L] * synth[i + n_band * L]; + WB_tenv_orig += insig_lp[i + n_band * L] * insig_lp[i + n_band * L]; + } + + SWB_tenv[n_band] = (float) ( sqrt( SWB_tenv[n_band] * INV_L_SUBFR16k ) ); + } + + Rat_tenv = (float) sqrt( WB_tenv_syn / WB_tenv_orig ); + + if ( Rat_tenv < 0.5 ) + { + Rat_tenv *= 1.2f; + } + else if ( Rat_tenv > 1 ) + { + Rat_tenv = 1.0f; + } + + for ( n_band = 0; n_band < SWB_TENV; n_band++ ) + { + SWB_tenv[n_band] *= Rat_tenv; + } + + max_val = SWB_tenv[0]; + pos = 0; + for ( n_band = 1; n_band < SWB_TENV; n_band++ ) + { + if ( SWB_tenv[n_band] > max_val ) + { + max_val = SWB_tenv[n_band]; + pos = n_band; + } + } + + for ( n_band = 1; n_band < SWB_TENV; n_band++ ) + { + if ( SWB_tenv[n_band] > 5.0f * SWB_tenv[n_band - 1] ) + { + break; + } + } + + if ( n_band < SWB_TENV ) + { + energy = 0.0f; + for ( n_band = ( pos + 1 ); n_band < SWB_TENV; n_band++ ) + { + energy += SWB_tenv[n_band]; + } + if ( pos == SWB_TENV - 1 ) + { + energy = 0.0f; + } + else + { + energy /= ( SWB_TENV - pos - 1 ); + } + + for ( n_band = 0; n_band < pos; n_band++ ) + { + SWB_tenv[n_band] *= 0.5f; + } + + SWB_tenv[pos] *= 1.005f; + if ( energy < SWB_tenv[pos] ) + { + for ( n_band = pos + 1; n_band < SWB_TENV; n_band++ ) + { + SWB_tenv[n_band] *= 0.9f; + } + } + } + else + { + for ( n_band = 1; n_band < SWB_TENV; n_band++ ) + { + if ( SWB_tenv[n_band - 1] > SWB_tenv[n_band] ) + { + SWB_tenv[n_band - 1] = 0.5f * ( SWB_tenv[n_band - 1] + SWB_tenv[n_band] ); + } + else + { + SWB_tenv[n_band] = 0.5f * ( SWB_tenv[n_band - 1] + SWB_tenv[n_band] ); + } + } + + for ( n_band = 0; n_band < SWB_TENV; n_band++ ) + { + SWB_tenv[n_band] *= 0.9f; + } + } + + if ( IsTransient_LF == 0 && st->coder_type == INACTIVE && st->TransientHangOver == 1 ) + { + for ( n_band = 0; n_band < SWB_TENV; n_band++ ) + { + SWB_tenv[n_band] *= 0.5f; + } + for ( n_band = 0; n_band < SWB_FENV_TRANS; n_band++ ) + { + SWB_fenv[n_band] *= 0.05f; + } + } + else + { + SWB_fenv[2] *= 0.1f; + SWB_fenv[3] *= 0.05f; + } + + for ( n_band = 0; n_band < SWB_TENV; n_band++ ) + { + SWB_tenv_tmp[n_band] = (float) log10( SWB_tenv[n_band] + EPSILON ) * FAC_LOG2; + if ( SWB_tenv_tmp[n_band] > 15 ) + { + index = 15; + } + else if ( SWB_tenv_tmp[n_band] < 0 ) + { + index = 0; + } + else + { + index = (int16_t) ( SWB_tenv_tmp[n_band] + 0.5f ); + } + + push_indice( hBstr, IND_SWB_TENV, index, 4 ); + } + + MSVQ_Interpol_Tran( SWB_fenv, indice ); + + push_indice( hBstr, IND_SWB_FENV, indice[0], 7 ); + push_indice( hBstr, IND_SWB_FENV, indice[1], 6 ); + } + else + { + /* Energy for the different bands and global energies */ + global_gain = 0; + for ( n_band = 0; n_band < SWB_FENV; n_band++ ) + { + energy = EPSILON; + for ( n_coeff = swb_bwe_subband[n_band] + st_offset; n_coeff < swb_bwe_subband[n_band + 1] + st_offset; n_coeff++ ) + { + energy += yos[n_coeff] * yos[n_coeff]; + } + + if ( n_band < SWB_FENV - 2 ) + { + global_gain += energy; + } + SWB_fenv[n_band] = energy; + } + + global_gain *= 0.5f; + + mode = FD_BWE_class( yos, global_gain, tilt_nb, st ); + + push_indice( hBstr, IND_SWB_CLASS, mode, 2 ); + + energy_control( st, ACELP_CORE, mode, -1, yos, st_offset, energy_factor ); + + for ( n_band = 0; n_band < SWB_FENV; n_band++ ) + { + SWB_fenv[n_band] *= energy_factor[n_band]; + SWB_fenv[n_band] = 10.0f * (float) log10( SWB_fenv[n_band] * swb_inv_bwe_subband_width[n_band] ); + } + + freq_weights( SWB_fenv, w_NOR, w_env, SWB_FENV ); + + for ( n_band = 0; n_band < SWB_FENV; n_band++ ) + { + SWB_fenv[n_band] -= Mean_env[n_band]; + } + + /* Energy VQ */ + msvq_interpol( SWB_fenv, w_env, indice ); + + push_indice( hBstr, IND_SWB_FENV, indice[0], 5 ); + push_indice( hBstr, IND_SWB_FENV, indice[1], 7 ); + push_indice( hBstr, IND_SWB_FENV, indice[2], 6 ); + push_indice( hBstr, IND_SWB_FENV, indice[3], 5 ); + push_indice( hBstr, IND_SWB_FENV, indice[4], 6 ); + } + + st->hBWE_FD->prev_mode = mode; + st->hBWE_FD->prev_global_gain = global_gain; + + return mode; +} + + +/*-------------------------------------------------------------------* + * decision_hq_generic_class() + * + *-------------------------------------------------------------------*/ + +static int16_t decision_hq_generic_class( + const float *coefs, /* i : original MDCT spectrum */ + const int16_t hq_generic_offset /* i : frequency offset of high frequency spectrum */ +) +{ + int16_t i, k; + float p, a, e; + float p2a; + float avgp2a; + int16_t nband; + + if ( hq_generic_offset == HQ_GENERIC_FOFFSET_24K4 ) + { + nband = 10; + } + else + { + nband = 8; + } + + avgp2a = 0.f; + for ( k = 0; k < nband; k++ ) + { + a = 0.0f; + p = 0.0f; + for ( i = swb_bwe_subband[k] + hq_generic_offset; i < swb_bwe_subband[k + 1] + hq_generic_offset; i++ ) + { + e = coefs[i] * coefs[i]; + + if ( e > p ) + { + p = e; + } + + a += e; + } + + if ( a > 0.0f ) + { + a *= swb_inv_bwe_subband_width[k]; + p2a = 10.0f * (float) log10( p / a ); + avgp2a += p2a; + } + } + + avgp2a /= (float) ( nband ); + + if ( avgp2a > 8.6f ) + { + return HQ_GENERIC_EXC1; + } + else + { + return HQ_GENERIC_EXC0; + } +} + +/*-------------------------------------------------------------------* + * hq_generic_hf_encoding() + * + *-------------------------------------------------------------------*/ + +void hq_generic_hf_encoding( + const float *coefs, /* i : MDCT coefficients of weighted original */ + float *hq_generic_fenv, /* i/o: energy of SWB envelope */ + const int16_t hq_generic_offset, /* i : frequency offset for extracting energy */ + Encoder_State *st, /* i/o: encoder state structure */ + int16_t *hq_generic_exc_clas, /* o : HF excitation class */ + const int16_t length /* i : Length of spectrum */ +) +{ + int16_t n_coeff, n_band; + float energy; + float energy_factor[SWB_FENV], w_env[SWB_FENV]; + int16_t indice[HQ_GENERIC_NVQIDX]; + int16_t nenv; + BSTR_ENC_HANDLE hBstr = st->hBstr; + + if ( hq_generic_offset <= HQ_GENERIC_FOFFSET_24K4 ) + { + nenv = SWB_FENV; + } + else + { + nenv = SWB_FENV - 2; + } + + for ( n_band = 0; n_band < nenv; n_band++ ) + { + energy = EPSILON; + for ( n_coeff = swb_bwe_subband[n_band] + hq_generic_offset; n_coeff < swb_bwe_subband[n_band + 1] + hq_generic_offset; n_coeff++ ) + { + energy += coefs[n_coeff] * coefs[n_coeff]; + } + + hq_generic_fenv[n_band] = energy; + } + + if ( length == L_SPEC48k ) + { + for ( n_band = 0; n_band < DIM_FB; n_band++ ) + { + energy = EPSILON; + for ( n_coeff = fb_bwe_subband[n_band]; n_coeff < fb_bwe_subband[n_band + 1]; n_coeff++ ) + { + energy += coefs[n_coeff] * coefs[n_coeff]; + } + + hq_generic_fenv[n_band + nenv] = energy; + } + } + + energy_control( st, HQ_CORE, -1, -1, coefs, hq_generic_offset, energy_factor ); + + if ( st->hHQ_core->hq_generic_speech_class == 1 ) + { + push_indice( hBstr, IND_HQ_SWB_EXC_SP_CLAS, 1, 1 ); + *hq_generic_exc_clas = HQ_GENERIC_SP_EXC; + } + else + { + *hq_generic_exc_clas = decision_hq_generic_class( coefs, hq_generic_offset ); + push_indice( hBstr, IND_HQ_SWB_EXC_SP_CLAS, 0, 1 ); + push_indice( hBstr, IND_HQ_SWB_EXC_CLAS, *hq_generic_exc_clas, 1 ); + } + + for ( n_band = 0; n_band < nenv; n_band++ ) + { + hq_generic_fenv[n_band] *= energy_factor[n_band]; + hq_generic_fenv[n_band] = 10.0f * (float) log10( hq_generic_fenv[n_band] * swb_inv_bwe_subband_width[n_band] ); + } + + if ( length == L_SPEC48k ) + { + for ( n_band = 0; n_band < DIM_FB; n_band++ ) + { + hq_generic_fenv[n_band + nenv] = 10.0f * (float) log10( hq_generic_fenv[n_band + nenv] * fb_inv_bwe_subband_width[n_band] ); + } + } + + freq_weights( hq_generic_fenv, w_NOR, w_env, nenv ); + + for ( n_band = 0; n_band < nenv; n_band++ ) + { + hq_generic_fenv[n_band] -= Mean_env[n_band]; + } + + if ( length == L_SPEC48k ) + { + for ( n_band = 0; n_band < DIM_FB; n_band++ ) + { + hq_generic_fenv[n_band + nenv] -= Mean_env_fb[n_band]; + } + } + + /* Energy VQ */ + if ( hq_generic_offset <= HQ_GENERIC_FOFFSET_24K4 ) + { + msvq_interpol( hq_generic_fenv, w_env, indice ); + } + else + { + msvq_interpol_2( hq_generic_fenv, w_env, indice, nenv ); + } + + if ( length == L_SPEC48k ) + { + indice[5] = vqSimple_w( hq_generic_fenv + nenv, hq_generic_fenv + nenv, EnvCdbkFB, NULL, DIM_FB, N_CB_FB, 0 ); + } + + push_indice( hBstr, IND_SWB_FENV_HQ, indice[0], 5 ); + push_indice( hBstr, IND_SWB_FENV_HQ, indice[1], 7 ); + push_indice( hBstr, IND_SWB_FENV_HQ, indice[2], 6 ); + push_indice( hBstr, IND_SWB_FENV_HQ, indice[3], 5 ); + + if ( hq_generic_offset <= HQ_GENERIC_FOFFSET_24K4 ) + { + push_indice( hBstr, IND_SWB_FENV_HQ, indice[4], 6 ); + } + else + { + push_indice( hBstr, IND_SWB_FENV_HQ, indice[4], 5 ); + } + + if ( length == L_SPEC48k ) + { + push_indice( hBstr, IND_FB_FENV_HQ, indice[5], 5 ); + } + + for ( n_band = 0; n_band < nenv; n_band++ ) + { + Word16 tmp, frac, exp; + Word32 L_tmp; +#ifdef BASOP_NOGLOB + Flag Overflow; + + Overflow = 0; +#endif + tmp = add( (int16_t) ( hq_generic_fenv[n_band] * 256 ), (int16_t) ( Mean_env[n_band] * 256 ) ); /*Q8 */ + + L_tmp = L_mult( tmp, 21771 ); /* 0.166096 in Q17 -> Q26 */ + L_tmp = L_shr( L_tmp, 10 ); /* From Q26 to Q16 */ + frac = L_Extract_lc( L_tmp, &exp ); /* Extract exponent of L_tmp */ + + tmp = extract_l( Pow2( 13, frac ) ); /* Put 13 as exponent so that */ + /* output of Pow2() will be: */ + /* 16384 < Pow2() <= 32767 */ + exp = sub( exp, 13 ); +#ifdef BASOP_NOGLOB + tmp = shl_o( tmp, add( exp, 1 ), &Overflow ); /*Q1 */ +#else + tmp = shl( tmp, add( exp, 1 ) ); /*Q1 */ +#endif + hq_generic_fenv[n_band] = (float) tmp * 0.5f; /*Q1 */ + } + + if ( length == L_SPEC48k ) + { + for ( n_band = 0; n_band < DIM_FB; n_band++ ) + { + Word16 tmp, frac, exp; + Word32 L_tmp; + + tmp = add( (int16_t) ( hq_generic_fenv[n_band + nenv] * 128 ), (int16_t) ( Mean_env_fb[n_band] * 128 ) ); /*Q7 */ + L_tmp = L_mult( tmp, 21771 ); /* 0.166096 in Q17 -> Q25 */ + L_tmp = L_shr( L_tmp, 9 ); /* From Q25 to Q16 */ + frac = L_Extract_lc( L_tmp, &exp ); /* Extract exponent of L_tmp */ + + tmp = extract_l( Pow2( 13, frac ) ); /* Put 13 as exponent so that */ + /* output of Pow2() will be: */ + /* 16384 < Pow2() <= 32767 */ + exp = sub( exp, 13 ); + tmp = shl( tmp, add( exp, 1 ) ); /*Q1 */ + hq_generic_fenv[add( n_band, nenv )] = (float) tmp * 0.5f; + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * fd_bwe_enc_init() + * + * Initialize FD BWE state structure at the encoder + *-------------------------------------------------------------------*/ + +void fd_bwe_enc_init( + FD_BWE_ENC_HANDLE hBWE_FD /* i/o: FD BWE data handle */ +) +{ + set_f( hBWE_FD->new_input_hp, 0, NS2SA( 16000, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_12k8_NS + DELAY_FIR_RESAMPL_NS - DELAY_CLDFB_NS ) ); + set_f( hBWE_FD->old_input, 0, NS2SA( 48000, DELAY_FD_BWE_ENC_12k8_NS + DELAY_FIR_RESAMPL_NS ) ); + set_f( hBWE_FD->old_input_wb, 0, NS2SA( 16000, DELAY_FD_BWE_ENC_12k8_NS ) ); + set_f( hBWE_FD->old_input_lp, 0, NS2SA( 16000, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_16k_NS ) ); + set_f( hBWE_FD->old_syn_12k8_16k, 0, NS2SA( 16000, DELAY_FD_BWE_ENC_NS ) ); + + hBWE_FD->prev_mode = NORMAL; + set_f( hBWE_FD->old_wtda_swb, 0, L_FRAME48k ); + hBWE_FD->prev_L_swb_norm1 = 8; + hBWE_FD->prev_global_gain = 0.0f; + hBWE_FD->modeCount = 0; + hBWE_FD->EnergyLF = 0.0f; + hBWE_FD->mem_old_wtda_swb = 0.0f; + + set_f( hBWE_FD->old_fdbwe_speech, 0.0f, L_FRAME48k ); + hBWE_FD->mem_deemph_old_syn = 0.0f; + + return; +} diff --git a/lib_enc/swb_bwe_enc_hr.c b/lib_enc/swb_bwe_enc_hr.c new file mode 100644 index 0000000000000000000000000000000000000000..ba13ad30656d45e8d2b64413906d7b4c9ef57220 --- /dev/null +++ b/lib_enc/swb_bwe_enc_hr.c @@ -0,0 +1,505 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * en_band_quant() + * + * Quantize the band envelop + *-------------------------------------------------------------------*/ + +/*! r: quantization index */ +static int16_t en_band_quant( + float *en_band, /* i/o: (un)quantized envelope value */ + const float *env_code, /* i : envelope codebook */ + const int16_t N /* i : codebook dimension */ +) +{ + float maxerr, err; + int16_t i, j, ind; + + maxerr = FLT_MAX; + ind = 0; + + for ( i = 0; i < N; i++ ) + { + err = FLT_MIN; + for ( j = 0; j < 2; j++ ) + { + err += ( en_band[j] - env_code[i * 2 + j] ) * ( en_band[j] - env_code[i * 2 + j] ); + } + if ( err < maxerr ) + { + maxerr = err; + ind = i; + } + } + + en_band[0] = env_code[2 * ind]; + en_band[1] = env_code[2 * ind + 1]; + + return ( ind ); +} + +/*-------------------------------------------------------------------* + * swb_bwe_enc_hr() + * + * HR SWB BWE encoder + *-------------------------------------------------------------------*/ + +void swb_bwe_enc_hr( + Encoder_State *st, /* i/o: encoder state structure */ + const float *new_input, /* i : input signal */ + const int16_t input_frame, /* i : frame length */ + const int16_t unbits /* i : number of core unused bits */ +) +{ + int16_t i, j, k, nBits, nBits_total, nBits_block, Nsv, Nsv2, width_noncoded; + int16_t is_transient, pos; + int16_t x_norm[NSV_MAX * ( WIDTH_BAND + 1 )], x_norm1[NSV_MAX * ( WIDTH_BAND + 1 )]; + float t_audio[L_FRAME48k], t_audio_tmp[L_FRAME48k]; + float gain, gain2, en_band[N_BANDS_BWE_HR]; + int16_t ind1, ind2; + int16_t nq[NSV_MAX], nq2[NSV_MAX]; + float tmpF, min_env; + float en_noncoded; + BSTR_ENC_HANDLE hBstr = st->hBstr; + + /*---------------------------------------------------------------------* + * initializations + *---------------------------------------------------------------------*/ + + ind2 = 0; /* only to suppress warnings */ + Nsv2 = 0; /* only to suppress warnings */ + gain2 = 0; /* only to suppress warnings */ + en_noncoded = 0; /* only to suppress warnings */ + + /* reset memories in case that last frame was a different technology */ + if ( st->last_core == HQ_CORE || st->last_extl != st->extl ) + { + set_f( st->hBWE_FD->old_wtda_swb, 0, L_FRAME48k ); + } + + /* calculate SWB BWE bit-budget (extension layer bitrate + AVQ unused bits from the core layer) */ + nBits = (int16_t) ( st->extl_brate ) / FRAMES_PER_SEC + unbits; + nBits_total = nBits; + + + /*---------------------------------------------------------------------* + * detect transient frames + *---------------------------------------------------------------------*/ + + is_transient = detect_transient( st, new_input, input_frame ); + push_indice( hBstr, IND_HR_IS_TRANSIENT, is_transient, 1 ); + + /*---------------------------------------------------------------------* + * OLA and MDCT + *---------------------------------------------------------------------*/ + + wtda( new_input, t_audio_tmp, st->hBWE_FD->old_wtda_swb, ALDO_WINDOW, ALDO_WINDOW, input_frame ); + + direct_transform( t_audio_tmp, t_audio, is_transient, input_frame, st->element_mode ); + + if ( is_transient ) + { + nBits = -1; /* is_transient flag */ + nBits_block = nBits_total / NUM_TIME_SWITCHING_BLOCKS; + nBits += nBits_total % NUM_TIME_SWITCHING_BLOCKS; + + /* set width of noncoded (blind estimated) spectrum */ + if ( st->extl == SWB_BWE_HIGHRATE ) + { + width_noncoded = L_FRAME32k / NUM_TIME_SWITCHING_BLOCKS - NUM_TRANS_END_FREQ_COEF; + } + else /* st->extl == FB_BWE_HIGHRATE */ + { + width_noncoded = ( 2 * END_FREQ_BWE_FULL_FB / FRAMES_PER_SEC ) / NUM_TIME_SWITCHING_BLOCKS - NUM_TRANS_END_FREQ_COEF; + } + + /*---------------------------------------------------------------------* + * transient frames: processing in blocks (subframes) + *---------------------------------------------------------------------*/ + + for ( k = 0; k < NUM_TIME_SWITCHING_BLOCKS; k++ ) + { + nBits += nBits_block; + + /* compute energy of noncoded (14.4-20kHz) spectrum */ + if ( st->extl == FB_BWE_HIGHRATE ) + { + en_noncoded = sum2_f( t_audio + k * input_frame / NUM_TIME_SWITCHING_BLOCKS + NUM_TRANS_END_FREQ_COEF, width_noncoded ) + 0.001f; + en_noncoded = (float) sqrt( en_noncoded / width_noncoded ); + } + + /* keep only frequencies in interest */ + set_f( t_audio + k * input_frame / NUM_TIME_SWITCHING_BLOCKS, 0, NUM_TRANS_START_FREQ_COEF ); + set_f( t_audio + k * input_frame / NUM_TIME_SWITCHING_BLOCKS + L_FRAME32k / NUM_TIME_SWITCHING_BLOCKS, 0, ( input_frame - L_FRAME32k ) / NUM_TIME_SWITCHING_BLOCKS ); + + /*---------------------------------------------------------------------* + * global gain coding + *---------------------------------------------------------------------*/ + + /* compute and quantize global energy */ + gain = sum2_f( t_audio + k * input_frame / NUM_TIME_SWITCHING_BLOCKS + NUM_TRANS_START_FREQ_COEF, WIDTH_TRANS_FREQ_COEF * N_BANDS_TRANS_BWE_HR ) + 0.001f; + gain = (float) sqrt( gain ) / ( WIDTH_TRANS_FREQ_COEF * N_BANDS_TRANS_BWE_HR ); + ind1 = gain_quant( &gain, MIN_GLOB_GAIN_BWE_HR, MAX_GLOB_GAIN_BWE_HR, NBITS_GLOB_GAIN_BWE_HR ); + + push_indice( hBstr, IND_HR_GAIN, ind1, NBITS_GLOB_GAIN_BWE_HR ); + nBits -= NBITS_GLOB_GAIN_BWE_HR; + + /* normalization with global gain */ + tmpF = 1 / gain; + for ( i = 0; i < WIDTH_TRANS_FREQ_COEF * N_BANDS_TRANS_BWE_HR; i++ ) + { + t_audio[NUM_TRANS_START_FREQ_COEF + k * input_frame / NUM_TIME_SWITCHING_BLOCKS + i] *= tmpF; + } + + /*---------------------------------------------------------------------* + * envelope coding + *---------------------------------------------------------------------*/ + + /* compute energy per band */ + for ( i = 0; i < N_BANDS_TRANS_BWE_HR; i++ ) + { + en_band[i] = sum2_f( t_audio + k * input_frame / NUM_TIME_SWITCHING_BLOCKS + NUM_TRANS_START_FREQ_COEF + i * WIDTH_TRANS_FREQ_COEF, WIDTH_TRANS_FREQ_COEF ) + 0.001f; + en_band[i] = (float) sqrt( en_band[i] / ( WIDTH_TRANS_FREQ_COEF ) ); + } + + /* Q energy per band */ + if ( k == 0 ) + { + ind1 = en_band_quant( en_band, swb_hr_env_code3, NUM_ENVLOPE_CODE_HR_TR ); + push_indice( hBstr, IND_HR_ENVELOPE, ind1, NBITS_ENVELOPE_BWE_HR_TR ); + nBits -= NBITS_ENVELOPE_BWE_HR_TR; + ind2 = ind1; + } + else + { + if ( ind2 < NUM_ENVLOPE_CODE_HR_TR2 ) + { + ind1 = en_band_quant( en_band, swb_hr_env_code3, NUM_ENVLOPE_CODE_HR_TR2 ); + } + else + { + ind1 = en_band_quant( en_band, swb_hr_env_code3 + ( NUM_ENVLOPE_CODE_HR_TR2 * 2 ), NUM_ENVLOPE_CODE_HR_TR2 ); + } + + push_indice( hBstr, IND_HR_ENVELOPE, ind1, NBITS_ENVELOPE_BWE_HR_TR - 1 ); + nBits -= ( NBITS_ENVELOPE_BWE_HR_TR - 1 ); + } + + /* normalize spectrum per bands */ + for ( i = 0; i < N_BANDS_TRANS_BWE_HR; i++ ) + { + tmpF = 1 / en_band[i]; + for ( j = 0; j < WIDTH_TRANS_FREQ_COEF; j++ ) + { + t_audio[k * input_frame / NUM_TIME_SWITCHING_BLOCKS + NUM_TRANS_START_FREQ_COEF + i * WIDTH_TRANS_FREQ_COEF + j] *= tmpF; + } + } + + /*---------------------------------------------------------------------* + * estimate energy of noncoded spectrum (14.4-20kHz) + *---------------------------------------------------------------------*/ + + if ( st->extl == SWB_BWE_HIGHRATE ) + { + en_noncoded = en_band[N_BANDS_TRANS_BWE_HR - 1]; + } + else /* st->extl == FB_BWE_HIGHRATE */ + { + en_noncoded /= ( gain * en_band[N_BANDS_TRANS_BWE_HR - 1] ); + + ind1 = 0; + if ( en_noncoded < BWE_HR_TRANS_EN_LIMIT1 ) + { + ind1 = 1; + en_noncoded = en_band[N_BANDS_TRANS_BWE_HR - 1] * BWE_HR_TRANS_EN_LIMIT1; + } + else if ( en_noncoded < BWE_HR_TRANS_EN_LIMIT2 ) + { + ind1 = 2; + en_noncoded = en_band[N_BANDS_TRANS_BWE_HR - 1] * BWE_HR_TRANS_EN_LIMIT2; + } + else if ( en_noncoded < BWE_HR_TRANS_EN_LIMIT3 ) + { + ind1 = 3; + en_noncoded = en_band[N_BANDS_TRANS_BWE_HR - 1] * BWE_HR_TRANS_EN_LIMIT3; + } + else + { + en_noncoded = en_band[N_BANDS_TRANS_BWE_HR - 1]; + } + push_indice( hBstr, IND_HR_HF_GAIN, ind1, NBITS_HF_GAIN_BWE_HR ); + nBits -= NBITS_HF_GAIN_BWE_HR; + } + + /*---------------------------------------------------------------------* + * AVQ coding (quantize normalized spectrum) + *---------------------------------------------------------------------*/ + + Nsv = ( NUM_TRANS_END_FREQ_COEF - NUM_TRANS_START_FREQ_COEF ) / WIDTH_BAND; + AVQ_cod( t_audio + k * input_frame / NUM_TIME_SWITCHING_BLOCKS + NUM_TRANS_START_FREQ_COEF, x_norm, nBits, Nsv ); + AVQ_encmux( hBstr, st->extl, x_norm, &nBits, Nsv, nq, 0, Nsv - 1 ); + } + } + else /* !is_transient */ + { + nBits--; /* is_transient flag */ + + /*---------------------------------------------------------------------* + * processing of normal (non-transient) frames + *---------------------------------------------------------------------*/ + + /* set width of noncoded (blind estimated) spectrum */ + if ( st->extl == SWB_BWE_HIGHRATE ) + { + width_noncoded = L_FRAME32k - NUM_NONTRANS_END_FREQ_COEF; + } + else /* st->extl == FB_BWE_HIGHRATE */ + { + width_noncoded = 2 * END_FREQ_BWE_FULL_FB / FRAMES_PER_SEC - NUM_NONTRANS_END_FREQ_COEF; + } + + /* compute energy of noncoded (14.4-20kHz) spectrum */ + if ( st->extl == FB_BWE_HIGHRATE ) + { + en_noncoded = sum2_f( t_audio + NUM_NONTRANS_END_FREQ_COEF, width_noncoded ) + 0.001f; + en_noncoded = (float) sqrt( en_noncoded / width_noncoded ); + } + + /* keep only frequencies in interest */ + set_f( t_audio, 0, NUM_NONTRANS_START_FREQ_COEF ); + set_f( t_audio + NUM_NONTRANS_END_FREQ_COEF, 0, input_frame - NUM_NONTRANS_END_FREQ_COEF ); + + /*---------------------------------------------------------------------* + * global gain coding + *---------------------------------------------------------------------*/ + + /* compute and quantize global gain */ + gain = sum2_f( t_audio + NUM_NONTRANS_START_FREQ_COEF, WIDTH_NONTRANS_FREQ_COEF * N_BANDS_BWE_HR ) + 0.001f; + gain = (float) sqrt( gain ) / ( WIDTH_NONTRANS_FREQ_COEF * N_BANDS_BWE_HR ); + ind1 = gain_quant( &gain, MIN_GLOB_GAIN_BWE_HR, MAX_GLOB_GAIN_BWE_HR, NBITS_GLOB_GAIN_BWE_HR ); + + push_indice( hBstr, IND_HR_GAIN, ind1, NBITS_GLOB_GAIN_BWE_HR ); + nBits -= NBITS_GLOB_GAIN_BWE_HR; + + /* normalization with global gain */ + tmpF = 1 / gain; + for ( i = 0; i < WIDTH_NONTRANS_FREQ_COEF * N_BANDS_BWE_HR; i++ ) + { + t_audio[NUM_NONTRANS_START_FREQ_COEF + i] *= tmpF; + } + + /*---------------------------------------------------------------------* + * envelope coding + *---------------------------------------------------------------------*/ + + /* compute energy per band */ + for ( i = 0; i < N_BANDS_BWE_HR; i++ ) + { + en_band[i] = sum2_f( t_audio + NUM_NONTRANS_START_FREQ_COEF + i * WIDTH_NONTRANS_FREQ_COEF, WIDTH_NONTRANS_FREQ_COEF ) + 0.001f; + en_band[i] = (float) sqrt( en_band[i] / WIDTH_NONTRANS_FREQ_COEF ); + } + + /* Q energy per band */ + ind1 = en_band_quant( en_band, swb_hr_env_code1, NUM_ENVLOPE_CODE_HR1 ); + ind2 = en_band_quant( en_band + 2, swb_hr_env_code2, NUM_ENVLOPE_CODE_HR2 ); + + push_indice( hBstr, IND_HR_ENVELOPE, ind1, NBITS_ENVELOPE_BWE_HR1 ); + push_indice( hBstr, IND_HR_ENVELOPE, ind2, NBITS_ENVELOPE_BWE_HR2 ); + + nBits -= NBITS_ENVELOPE_BWE_HR1 + NBITS_ENVELOPE_BWE_HR2; + + /* normalize spectrum per bands */ + for ( i = 0; i < N_BANDS_BWE_HR; i++ ) + { + tmpF = 1 / en_band[i]; + for ( j = 0; j < WIDTH_NONTRANS_FREQ_COEF; j++ ) + { + t_audio[NUM_NONTRANS_START_FREQ_COEF + i * WIDTH_NONTRANS_FREQ_COEF + j] *= tmpF; + } + } + + /*---------------------------------------------------------------------* + * choose sub-bands to be quantized + *---------------------------------------------------------------------*/ + + /* find the subband with the min envelope */ + pos = minimum( en_band, N_BANDS_BWE_HR, &min_env ); + + /* decide the spectrum to be quantized */ + if ( nBits_total > NBITS_THRESH_BWE_HR ) + { + i = NUM_NONTRANS_END_FREQ_COEF - NUM_NONTRANS_START_FREQ_COEF; + mvr2r( t_audio + NUM_NONTRANS_START_FREQ_COEF, t_audio_tmp, NUM_NONTRANS_END_FREQ_COEF - NUM_NONTRANS_START_FREQ_COEF ); + } + else + { + /* reorder the spectrum */ + ind1 = ( pos * 64 + pos / 2 * WIDTH_BAND ); + mvr2r( t_audio + NUM_NONTRANS_START_FREQ_COEF, t_audio_tmp, ind1 ); + + ind2 = ( ( pos + 1 ) * 64 + ( pos + 1 ) / 2 * WIDTH_BAND ); + mvr2r( t_audio + NUM_NONTRANS_START_FREQ_COEF + ind2, t_audio_tmp + ind1, NUM_NONTRANS_END_FREQ_COEF - NUM_NONTRANS_START_FREQ_COEF - ind2 ); + + i = ind1 + NUM_NONTRANS_END_FREQ_COEF - NUM_NONTRANS_START_FREQ_COEF - ind2; + } + + /*---------------------------------------------------------------------* + * estimate energy of noncoded spectrum (14.4-20kHz) + *---------------------------------------------------------------------*/ + + if ( st->extl == SWB_BWE_HIGHRATE ) + { + en_noncoded = 0.5f * min_env; + } + else /* st->extl == FB_BWE_HIGHRATE */ + { + en_noncoded /= ( gain * min_env ); + + ind1 = 0; + if ( en_noncoded < BWE_HR_NONTRANS_EN_LIMIT1 ) + { + ind1 = 1; + en_noncoded = 0.5f * min_env * BWE_HR_NONTRANS_EN_LIMIT1; + } + else if ( en_noncoded > BWE_HR_NONTRANS_EN_LIMIT2 ) + { + ind1 = 2; + en_noncoded = min_env * BWE_HR_NONTRANS_EN_LIMIT2; + } + else if ( en_noncoded > BWE_HR_NONTRANS_EN_LIMIT3 ) + { + ind1 = 3; + en_noncoded = min_env * BWE_HR_NONTRANS_EN_LIMIT3; + } + else + { + en_noncoded = 0.5f * min_env; + } + + push_indice( hBstr, IND_HR_HF_GAIN, ind1, NBITS_HF_GAIN_BWE_HR ); + nBits -= NBITS_HF_GAIN_BWE_HR; + } + + /*---------------------------------------------------------------------* + * AVQ coding (quantize normalized spectrum) + *---------------------------------------------------------------------*/ + + Nsv = i / WIDTH_BAND; + AVQ_cod( t_audio_tmp, x_norm, nBits, Nsv ); + AVQ_encmux( hBstr, st->extl, x_norm, &nBits, Nsv, nq, 0, Nsv - 1 ); + /*---------------------------------------------------------------------* + * second stage coding + *---------------------------------------------------------------------*/ + + if ( nBits >= 9 + NBITS_GLOB_GAIN_BWE_HR && sum_s( nq, Nsv ) > 0 ) + { + /* select spectrum of the second stage coding */ + k = 0; + for ( i = 0; i < Nsv; i++ ) + { + if ( nq[i] == 0 ) + { + for ( j = 0; j < WIDTH_BAND; j++ ) + { + t_audio[k++] = t_audio_tmp[i * WIDTH_BAND + j]; + } + } + } + + for ( i = 0; i < Nsv; i++ ) + { + if ( nq[i] != 0 ) + { + for ( j = 0; j < WIDTH_BAND; j++ ) + { + t_audio[k++] = t_audio_tmp[i * WIDTH_BAND + j] - x_norm[i * WIDTH_BAND + j]; + } + } + } + + /* calculate the number of subbands according to the rest bits */ + if ( nBits > 396 ) + { + Nsv2 = 33; + } + else + { + Nsv2 = nBits / 12; + } + + /* second stage global gain estimation and coding */ + gain2 = sum2_f( t_audio, Nsv2 * WIDTH_BAND ) + 0.001f; + gain2 = (float) ( 16 * sqrt( gain2 / ( Nsv2 * WIDTH_BAND ) ) ); + ind1 = gain_quant( &gain2, MIN_GLOB_GAIN_BWE_HR, MAX_GLOB_GAIN_BWE_HR, NBITS_GLOB_GAIN_BWE_HR ); + + push_indice( hBstr, IND_HR_GAIN, ind1, NBITS_GLOB_GAIN_BWE_HR ); + nBits -= NBITS_GLOB_GAIN_BWE_HR; + + /* normalize with global gain */ + gain2 *= 0.0625f; /* 1/16 */ + tmpF = 1 / gain2; + for ( i = 0; i < Nsv2 * WIDTH_BAND; i++ ) + { + t_audio[i] *= tmpF; + } + + set_s( nq2, 0, Nsv ); + + AVQ_cod( t_audio, x_norm1, nBits, Nsv2 ); + AVQ_encmux( hBstr, st->extl, x_norm1, &nBits, Nsv2, nq2, 0, Nsv2 - 1 ); + } + } + + /* write unused bits */ + while ( nBits > 0 ) + { + i = min( nBits, 16 ); + push_indice( hBstr, IND_UNUSED, 0, i ); + nBits -= i; + } + + + return; +} diff --git a/lib_enc/swb_bwe_enc_lr.c b/lib_enc/swb_bwe_enc_lr.c new file mode 100644 index 0000000000000000000000000000000000000000..07cd4b7a4219d7d97c215dfd94bfa4604bededa8 --- /dev/null +++ b/lib_enc/swb_bwe_enc_lr.c @@ -0,0 +1,698 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "rom_com.h" +#include "stat_com.h" +#include "wmc_auto.h" + +/*--------------------------------------------------------------------------* + * GetSubbandCorrIndex2_har() + * + * Finds the index of best correlation between highband (*inBuf) and lowband (*predBuf) for current subband of length (fLen) + *--------------------------------------------------------------------------*/ + +/*! r: best correlation index */ +static int16_t GetSubbandCorrIndex2_har( + const float *inBuf, /* i : target buffer (i.e., highband signal) */ + const float *predBuf, /* i : prediction buffer (i.e., lowband) */ + const int16_t fLen, /* i : window length */ + const int16_t maxLag, /* i : search length */ + const GainItem *G_item, /* i : nZero nonzero components (value+index) */ + const int16_t nZero, /* i : number of nonzero components used in */ + int16_t *prev_frame_bstindx /* i : previous frame best Indices */ +) +{ + int16_t bestIdx, i, j; + float corr, energy, corr_sq; + float lagCorr_sq, lagEnergy, eOld; + int16_t N1, N2; + + + bestIdx = 0; + lagCorr_sq = 0.0f; + lagEnergy = 1e30f; + + for ( i = 0, energy = 0.0f; i < fLen - 1; i++, predBuf++ ) + { + energy += *predBuf * *predBuf; + } + + predBuf -= fLen - 1; + eOld = 0.0f; + N1 = max( 0, *prev_frame_bstindx - maxLag / 2 ); + if ( *prev_frame_bstindx < 0 ) + { + N2 = maxLag - 1; + } + else + { + N2 = min( maxLag - 1, *prev_frame_bstindx + maxLag / 2 ); + } + + predBuf += N1; + + /* find the best lag */ + for ( i = N1; i <= N2; i++ ) + { + corr = 0.0f; + + /* get the energy, remove the old and update with the new energy index */ + for ( j = 0, energy = 0.0f; j < fLen; j++, predBuf++ ) + { + energy += *predBuf * *predBuf; + } + + predBuf -= fLen; + + /* energy to be removed in the next lag */ + eOld = *predBuf; + eOld *= eOld; + + /* get cross-correlation */ + if ( energy ) + { + for ( j = 0, corr = 0.0f; j < nZero; j++ ) + { + corr += inBuf[G_item[j].gainIndex] * predBuf[G_item[j].gainIndex]; + } + + corr_sq = corr * corr; + + if ( (double) lagCorr_sq * (double) energy < (double) corr_sq * (double) lagEnergy ) + { + bestIdx = i; + lagCorr_sq = corr_sq; + lagEnergy = energy; + } + } + + predBuf++; + } + + if ( lagCorr_sq == 0.0f && *prev_frame_bstindx < 0 ) + { + bestIdx = 0; + } + else + { + if ( lagCorr_sq == 0.0f ) + { + bestIdx = *prev_frame_bstindx; + } + } + + *prev_frame_bstindx = bestIdx; + + return bestIdx; +} + + +/*--------------------------------------------------------------------------* + * getswbindices_har() + * + * Finds the pulse index of best correlation between highband (*yos) and lowband (*y2) for two groups of length sbLen + *--------------------------------------------------------------------------*/ + +static void getswbindices_har( + float *yos, /* i : original input spectrum */ + float *y2, /* i : decoded spectrum */ + const int16_t nBands_search, /* i : number of bands */ + int16_t *lagIndices, /* o : pulse index */ + int16_t *prev_frame_bstindx, /* i/o: prev frame index */ + const int16_t swb_lowband, /* i : length of the LF spectrum */ + const int16_t *subband_offsets, + const int16_t *sbWidth, + const int16_t *subband_search_offset + +) +{ + GainItem Nbiggest[(NB_SWB_SUBBANDS_HAR_SEARCH_SB) *N_NBIGGEST_PULSEARCH]; + const float *refBuf, *predBuf; + int16_t search_offset[NB_SWB_SUBBANDS_HAR_SEARCH_SB]; + int16_t nlags[NB_SWB_SUBBANDS_HAR_SEARCH_SB]; + int16_t j, k, sb; + int16_t n_nbiggestsearch[NB_SWB_SUBBANDS_HAR]; + float low_freqsgnl[L_FRAME32k]; + + /* Initializations */ + predBuf = y2; + + /* Get the number of HF groups for performing Similarity search */ + for ( sb = 0; sb < nBands_search; sb++ ) + { + nlags[sb] = (int16_t) pow( 2, bits_lagIndices_mode0_Har[sb] ); + } + + for ( sb = 0; sb < nBands_search; sb++ ) + { + j = sb * N_NBIGGEST_PULSEARCH; + refBuf = yos + swb_lowband + subband_offsets[sb]; + + /* Find NBiggest samples in HF Groups */ + FindNBiggest2_simple( refBuf, Nbiggest + j, sbWidth[sb], &n_nbiggestsearch[sb], N_NBIGGEST_PULSEARCH ); + search_offset[sb] = subband_search_offset[sb]; + } + + /* Similarity Search for the HF spectrum */ + for ( sb = 0; sb < nBands_search; sb++ ) + { + k = 0; + if ( sb == 0 ) + { + /* copy SSmoothed LF Spectrum */ + mvr2r( predBuf + search_offset[sb] - nlags[sb] / 2, low_freqsgnl, sbWidth[sb] + nlags[sb] ); + } + else + { + /* copy SSmoothed LF Spectrum */ + for ( j = search_offset[sb] + nlags[sb] / 2; j > search_offset[sb] - sbWidth[sb] - nlags[sb] / 2; j-- ) + { + low_freqsgnl[k] = predBuf[j]; + k++; + } + } + /* correlation b/w HF spectrum Group1 of length sbLen and decoded LF spectrum */ + lagIndices[sb] = GetSubbandCorrIndex2_har( yos + swb_lowband + subband_offsets[sb], low_freqsgnl, sbWidth[sb], nlags[sb], Nbiggest + ( sb * N_NBIGGEST_PULSEARCH ), n_nbiggestsearch[sb], &prev_frame_bstindx[sb] ); + } + + return; +} + +static int16_t GetSubbandCorrIndex2_pulsestep( + const float *inBuf, + const float *predBuf, + const float *predBufMa, + const int16_t fLen, + const int16_t maxLag, + const GainItem *G_item, + const int16_t nZero, + int16_t ssearch_buflim, + const float *predBuf_ni ) +{ + int16_t bestIdx, i, j; + float corr, energy, corr_sq; + float lagCorr_sq, lagEnergy; + int16_t absPos; + int16_t ib_flag = 0; + + + absPos = 0; + bestIdx = -1; + lagCorr_sq = 0.0f; + lagEnergy = 1e30f; + + /* Get the initial energy for zero lag */ + while ( *predBuf == 0.0f && absPos < ssearch_buflim ) + { + predBuf++; + absPos++; + predBuf_ni++; + } + + if ( absPos == ssearch_buflim ) + { + predBuf--; + absPos--; + predBuf_ni--; + } + for ( i = 0, energy = 0.0f; i < fLen; i++, predBuf_ni++ ) + { + energy += *predBuf_ni * *predBuf_ni; + } + + predBuf_ni -= fLen; + lagEnergy = energy; + + /* Find the best lag */ + for ( i = 0; i < maxLag; i++ ) + { + corr = 0.0f; + + /* Get the energy, remove the old and update with the new energy index */ + for ( j = 0, energy = 0.0f; j < fLen; j++, predBuf_ni++ ) + { + energy += *predBuf_ni * *predBuf_ni; + } + predBuf_ni -= fLen; + + /* Get cross-correlation */ + if ( energy ) + { + for ( j = 0, corr = 0.0f; j < nZero; j++ ) + { + corr += inBuf[G_item[j].gainIndex] * predBufMa[G_item[j].gainIndex]; + } + + corr_sq = corr * corr; + + if ( ( lagCorr_sq == 0.0f && corr_sq == 0.0f ) || (double) lagCorr_sq * (double) energy < (double) corr_sq * (double) lagEnergy ) + { + bestIdx = i; + lagCorr_sq = corr_sq; + lagEnergy = energy; + } + } + + predBuf++; + absPos++; + predBuf_ni++; + while ( *predBuf == 0.0f && absPos < ssearch_buflim ) + { + predBuf++; + absPos++; + predBuf_ni++; + } + + if ( absPos >= ssearch_buflim ) + { + if ( bestIdx == -1 ) + { + ib_flag = 1; + } + + break; + } + } + if ( ib_flag ) + { + bestIdx = 0; + } + return bestIdx; +} + + +/*--------------------------------------------------------------------------* + * GetSWBIndices() + * + * Finds the subband lags for subband coding. Each lag corresponds to + * the section that is copied and scaled from the low-frequency band + * to form the high-frequency subband. + * + * The subbands are searched in two steps to reduce the complexity of + * the search relative to full search. In first step, a most representative + * subband is selected based on the similarity of the subbands.Full search + * is performed for the selected subband.Based on the lagIndice value for + * this subband, the region of highest interest is selected. A partial + * search is performed for rest of the subbands around this region of the + * low-frequency range. + *--------------------------------------------------------------------------*/ + +static void GetSWBIndices( + const float *predBuf, /* i : low-frequency band */ + const float *targetBuf, /* i : high-frequency band */ + const int16_t nBands_search, /* i : number of search subbands */ + const int16_t *sbWidth, /* i : subband lengths */ + int16_t *lagIndices, /* o : selected lags for subband coding */ + const int16_t predBufLen, /* i : low-frequency band length */ + GainItem *Nbiggest, /* o : most representative region */ + const int16_t *subband_offsets, /* o : N biggest components */ + float *predBuf_ni /* i : low-frequency band filled noise */ +) +{ + const float *refBuf; + int16_t search_offset[NB_SWB_SUBBANDS]; + int16_t nlags[NB_SWB_SUBBANDS]; + int16_t sbLen; + int16_t j, sb; + int16_t n_nbiggestsearch[NB_SWB_SUBBANDS]; + int16_t ssearch_buflim; + float sspectra_ma[L_FRAME32k]; + + /* Initializations */ + for ( sb = 0; sb < nBands_search; sb++ ) + { + j = sb * N_NBIGGEST_PULSEARCH; + sbLen = sbWidth[sb]; + refBuf = targetBuf + subband_offsets[sb]; + FindNBiggest2_simple( refBuf, Nbiggest + j, sbLen, &n_nbiggestsearch[sb], N_NBIGGEST_PULSEARCH ); + } + + /* Selection of most representative subband (full search) */ + for ( sb = 0; sb < nBands_search; sb++ ) + { + nlags[sb] = (int16_t) pow( 2, bits_lagIndices_modeNormal[sb] ); + } + + for ( sb = 0; sb < nBands_search; sb++ ) + { + search_offset[sb] = subband_search_offsets[sb]; + } + sspectra_ma[0] = ( predBuf_ni[0] + predBuf_ni[1] ) / 2.0f; + + for ( sb = 1; sb < predBufLen - 1; sb++ ) + { + sspectra_ma[sb] = ( predBuf_ni[sb - 1] + predBuf_ni[sb] + predBuf_ni[sb + 1] ) / 3.0f; + } + + sspectra_ma[sb] = ( predBuf_ni[sb - 1] + predBuf_ni[sb] ) / 2.0f; + /* Partial search for rest of subbands except the last which is fixed */ + for ( sb = 0; sb < nBands_search; sb++ ) + { + sbLen = sbWidth[sb]; + ssearch_buflim = predBufLen - ( sbLen + search_offset[sb] ); + lagIndices[sb] = GetSubbandCorrIndex2_pulsestep( targetBuf + subband_offsets[sb], predBuf + search_offset[sb], sspectra_ma + search_offset[sb], sbLen, nlags[sb], Nbiggest + ( sb * N_NBIGGEST_PULSEARCH ), n_nbiggestsearch[sb], ssearch_buflim, predBuf_ni + search_offset[sb] ); + } + + return; +} + + +static void gethar_noisegn( + BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ + float spectra[], + float noise_flr[], + float xSynth_har[], + const int16_t sbWidth[], + const int16_t lagIndices[], + const int16_t bands, + const int16_t har_bands, + const int16_t fLenLow, + const int16_t fLenHigh, + const int16_t subband_offsets[], + const int16_t subband_search_offset[], + int16_t band_start[], + int16_t band_end[], + int16_t band_width[], + float band_energy[], + float be_tonal[], + float *sspectra, + const int16_t har_freq_est2, + const int16_t pos_max_hfe2, + int16_t *pul_res, + GainItem pk_sf[] ) +{ + GainItem get_pk[N_NBIGGEST_SEARCH_LRG_B]; + int16_t n_nbiggestsearch, imin, gqlevs; + int16_t i; + float hfspec[L_FRAME32k]; + float g, g1, g2, dmin, d; + + /*Generate HF noise*/ + genhf_noise( noise_flr, xSynth_har, sspectra, bands, har_bands, har_freq_est2, pos_max_hfe2, pul_res, pk_sf, fLenLow, fLenHigh, sbWidth, lagIndices, subband_offsets, subband_search_offset ); + + mvr2r( spectra + fLenLow, hfspec, fLenHigh ); + FindNBiggest2_simple( hfspec, get_pk, fLenHigh, &n_nbiggestsearch, N_NBIGGEST_SEARCH_LRG_B ); + for ( i = 0; i < n_nbiggestsearch; i++ ) + { + hfspec[get_pk[i].gainIndex] = 0.0f; + } + + g1 = sum2_f( hfspec, fLenHigh ); + g2 = sum2_f( xSynth_har, fLenHigh ); + imin = 0; + if ( g1 != 0.0 && g2 != 0.0 ) + { + g = (float) log10( sqrt( g1 / g2 ) ); + gqlevs = 4; + dmin = FLT_MAX; + imin = 0; + + for ( i = 0; i < gqlevs; i++ ) + { + d = (float) fabs( g - gain_table_SWB_BWE[i] ); + if ( d < dmin ) + { + dmin = d; + imin = i; + } + } + } + push_indice( hBstr, IND_NOISEG, imin, 2 ); + g = (float) pow( 10.0f, gain_table_SWB_BWE[imin] ); + + /*Tonal energy estimation*/ + ton_ene_est( xSynth_har, be_tonal, band_energy, band_start, band_end, band_width, fLenLow, fLenHigh, bands, har_bands, g, pk_sf, pul_res ); + + return; +} + + +/*--------------------------------------------------------------------------* + * EncodeSWBSubbands() + * + * Main routine for generic SWB coding. High-frequency subband + * replicated based on the lowband signal. A search is perform + * find lowband indices denoting the selected lowband subband. + *--------------------------------------------------------------------------*/ + +static void EncodeSWBSubbands( + Encoder_State *st, /* i/o: encoder state structure */ + float *spectra, /* i/o: MDCT domain spectrum */ + const int16_t fLenLow, /* i : lowband length */ + const int16_t fLenHigh, /* i : highband length */ + const int16_t nBands, /* i : number of subbands */ + const int16_t nBands_search, /* i : number of subbands to be searched for BWE */ + const int16_t *sbWidth, /* i : subband lengths */ + const int16_t *subband_offsets, /* i : Subband offset for BWE */ + int16_t *lagIndices, /* o : lowband index for each subband */ + float *lagGains, /* o : first gain for each subband */ + int16_t BANDS, /* i : noise estimate from WB part */ + int16_t *band_start, /* i : Number subbands/Frame */ + int16_t *band_end, /* i : Band Start of each SB */ + float *band_energy, /* i : Band end of each SB */ + const int16_t *p2a_flags, /* i : BAnd energy of each SB */ + const int16_t hqswb_clas, /* i : lowband synthesis */ + int16_t *prev_frm_index, /* i : clas information */ + const int16_t har_bands, /* i/o: Index of the previous Frame */ + const int16_t *subband_search_offset, /* i : Number of harmonic LF bands */ + int16_t *prev_frm_hfe2, + int16_t *prev_stab_hfe2, + int16_t band_width[], + const float spectra_ni[], /* i : coded MDCT domain spectrum + noise */ + int16_t *ni_seed /* i/o: random seed for search buffer NI */ +) +{ + GainItem Nbiggest[NB_SWB_SUBBANDS * N_NBIGGEST_PULSEARCH]; + int16_t i, k; + float sspectra[L_FRAME32k]; + float sspectra_ni[L_FRAME32k], sspectra_diff[L_FRAME32k], be_tonal[SWB_HAR_RAN1], xSynth_har[L_FRAME32k]; + float ss_min = 1.0f, th_g[NB_SWB_SUBBANDS]; + GainItem pk_sf[(NB_SWB_SUBBANDS) *8]; + int16_t pul_res[NB_SWB_SUBBANDS]; + int16_t har_freq_est1 = 0, har_freq_est2 = 0; + int16_t flag_dis = 1; + int16_t pos_max_hfe2 = 0; + + HQ_ENC_HANDLE hHQ_core = st->hHQ_core; + BSTR_ENC_HANDLE hBstr = st->hBstr; + + set_f( sspectra, 0.0f, fLenLow ); + set_f( sspectra_ni, 0.0f, fLenLow ); + set_f( xSynth_har, 0.0f, L_FRAME32k ); + set_s( pul_res, 0, NB_SWB_SUBBANDS ); + + + if ( hqswb_clas == HQ_HARMONIC ) + { + /* Harmonic Structure analysis */ + pos_max_hfe2 = har_est( spectra, fLenLow, &har_freq_est1, &har_freq_est2, &flag_dis, prev_frm_hfe2, subband_search_offset, sbWidth, prev_stab_hfe2 ); + /* Spectrum normalization for the corecoder */ + noise_extr_corcod( spectra, spectra_ni, sspectra, sspectra_diff, sspectra_ni, fLenLow, hHQ_core->prev_hqswb_clas, &hHQ_core->prev_ni_ratio ); + + /* Find best indices for each group */ + getswbindices_har( spectra, sspectra_ni, nBands_search, lagIndices, prev_frm_index, fLenLow, subband_offsets, sbWidth, subband_search_offset ); + /* Write the indices into the bitstream */ + for ( k = 0; k < nBands_search; k++ ) + { + push_indice( hBstr, IND_LAGINDICES, lagIndices[k], bits_lagIndices_mode0_Har[k] ); + } + + if ( flag_dis == 0 ) + { + if ( har_freq_est2 != SWB_HAR_RAN1 || har_freq_est2 != *prev_frm_hfe2 ) + { + har_freq_est2 += lagIndices[0]; + } + } + + /*noise generation*/ + gethar_noisegn( hBstr, spectra, sspectra_diff, xSynth_har, sbWidth, lagIndices, BANDS, har_bands, fLenLow, fLenHigh, subband_offsets, subband_search_offset, band_start, band_end, band_width, band_energy, be_tonal, sspectra, har_freq_est2, pos_max_hfe2, pul_res, pk_sf ); + + /*HF Spectrum Generation*/ + Gettonl_scalfact( xSynth_har, spectra_ni, fLenLow, fLenHigh, har_bands, BANDS, band_energy, band_start, band_end, p2a_flags, be_tonal, pk_sf, pul_res ); + + if ( flag_dis == 0 ) + { + *prev_frm_hfe2 = 0; + } + else + { + *prev_frm_hfe2 = har_freq_est2; + } + + for ( k = har_bands; k < BANDS; k++ ) + { + for ( i = band_start[k]; i <= band_end[k]; i++ ) + { + spectra[i] = xSynth_har[i - fLenLow]; + } + } + } + else + { + /* Spectrum normalization for the corecoder*/ + ss_min = spectrumsmooth_noiseton( spectra, spectra_ni, sspectra, sspectra_diff, sspectra_ni, fLenLow, ni_seed ); + + /* Get lag indices */ + GetSWBIndices( sspectra, spectra + fLenLow, nBands, sbWidth, lagIndices, fLenLow, Nbiggest, subband_offsets, sspectra ); + /* Bitstream operations */ + for ( k = 0; k < nBands; k++ ) + { + if ( p2a_flags[BANDS - NB_SWB_SUBBANDS + k] == 0 ) + { + push_indice( hBstr, IND_LAGINDICES, lagIndices[k], bits_lagIndices_modeNormal[k] ); + } + else + { + lagIndices[k] = 0; + } + } + convert_lagIndices_pls2smp( lagIndices, nBands, lagIndices, sspectra, sbWidth, fLenLow ); + /*get levels for missing bands*/ + GetlagGains( sspectra_ni, &band_energy[BANDS - NB_SWB_SUBBANDS], nBands, sbWidth, lagIndices, fLenLow, lagGains ); + for ( k = 0; k < NB_SWB_SUBBANDS; k++ ) + { + lagGains[k] *= 0.9f; + } + + for ( k = 0; k < NB_SWB_SUBBANDS; k++ ) + { + th_g[k] = 0.0f; + if ( p2a_flags[BANDS - NB_SWB_SUBBANDS + k] == 0 ) + { + th_g[k] = lagGains[k] * ss_min; + } + } + + /* Construct spectrum */ + GetSynthesizedSpecThinOut( sspectra_ni, xSynth_har, nBands, sbWidth, lagIndices, lagGains, fLenLow ); + /*Level adjustment for the missing bands*/ + noiseinj_hf( xSynth_har, th_g, band_energy, hHQ_core->prev_En_sb, p2a_flags, BANDS, band_start, band_end, fLenLow ); + + for ( k = BANDS - NB_SWB_SUBBANDS; k < BANDS; k++ ) + { + if ( p2a_flags[k] == 0 ) + { + for ( i = band_start[k]; i <= band_end[k]; i++ ) + { + spectra[i] = xSynth_har[i - fLenLow]; + } + } + else + { + for ( i = band_start[k]; i <= band_end[k]; i++ ) + { + spectra[i] = spectra_ni[i]; + } + } + } + } + + return; +} + +/*--------------------------------------------------------------------------* + * swb_bwe_enc_lr() + * + * Main encoding routine of SWB BWE for the LR MDCT core + *--------------------------------------------------------------------------*/ + +void swb_bwe_enc_lr( + Encoder_State *st, /* i/o: encoder state structure */ + const float m_core[], /* i : lowband synthesis */ + const float m_orig[], /* i/o: scaled orig signal (MDCT) */ + float m[], /* o : highband synthesis with lowband zeroed */ + const int32_t total_brate, /* i : total bitrate for selecting subband pattern */ + int16_t BANDS, /* i : Total number of Subbands in a frame */ + int16_t *band_start, /* i : band start of each SB */ + int16_t *band_end, /* i : band end of each SB */ + float *band_energy, /* i : band_energy of each SB */ + int16_t *p2a_flags, /* i : HF tonal indicator */ + const int16_t hqswb_clas, /* i : HQ_NORMAL or HQ_HARMONIC class */ + int16_t lowlength, /* i : lowband length */ + int16_t highlength, /* i : highband length */ + int16_t *prev_frm_index, /* i/o: previous frame lag index for harmonic mode */ + const int16_t har_bands, /* i : Number of LF harmonic bands */ + int16_t *prev_frm_hfe2, + int16_t *prev_stab_hfe2, + int16_t band_width[], /* i : subband bandwidths */ + const float y2_ni[], /* i/o: Sparse filled core coder */ + int16_t *ni_seed /* i/o: random seed for search buffer NI */ +) +{ + int16_t k; + int16_t nBands; + int16_t nBands_search; + int16_t wBands[NB_SWB_SUBBANDS]; + int16_t lagIndices[NB_SWB_SUBBANDS]; + float lagGains[NB_SWB_SUBBANDS]; + const int16_t *subband_offsets; + int16_t swb_lowband, swb_highband; + const int16_t *subband_search_offset; + + subband_search_offset = subband_search_offsets_13p2kbps_Har; + subband_offsets = subband_offsets_sub5_13p2kbps_Har; + + hf_parinitiz( total_brate, hqswb_clas, lowlength, highlength, wBands, &subband_search_offset, &subband_offsets, &nBands, &nBands_search, &swb_lowband, &swb_highband ); + + /* Prepare m[], low part from WB core, high part from 32k input */ + mvr2r( m_core, m, swb_lowband ); + mvr2r( m_orig + swb_lowband, m + swb_lowband, swb_highband ); + + /* SWB BWE encoding */ + EncodeSWBSubbands( st, m, swb_lowband, swb_highband, nBands, nBands_search, wBands, subband_offsets, lagIndices, lagGains, BANDS, band_start, band_end, band_energy, p2a_flags, hqswb_clas, prev_frm_index, har_bands, subband_search_offset, prev_frm_hfe2, prev_stab_hfe2, band_width, y2_ni, ni_seed ); + + m[swb_lowband + swb_highband - 1] *= 0.0625f; + m[swb_lowband + swb_highband - 2] *= 0.125f; + m[swb_lowband + swb_highband - 3] *= 0.25f; + m[swb_lowband + swb_highband - 4] *= 0.5f; + + /* set frequencies below 6.4 kHz to zero */ + if ( hqswb_clas == HQ_NORMAL ) + { + for ( k = 0; k < swb_lowband; k++ ) + { + m[k] = 0.0f; + } + } + + return; +} diff --git a/lib_enc/swb_pre_proc.c b/lib_enc/swb_pre_proc.c new file mode 100644 index 0000000000000000000000000000000000000000..87d28c0b0ae4faeb347513b530438e8e1baec270 --- /dev/null +++ b/lib_enc/swb_pre_proc.c @@ -0,0 +1,755 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "rom_com.h" +#include "rom_enc.h" +#include "wmc_auto.h" +#include "ivas_prot.h" +#include "ivas_rom_enc.h" + +/*-------------------------------------------------------------------* + * Local constants + * + *-------------------------------------------------------------------*/ + +#define CLDFB_NO_CHANNELS_HB 20 + + +/*-------------------------------------------------------------------* + * wb_pre_proc() + * + * - Resampling of input signal when input signal sampling rate + * is above 16kHz + * - Common WB TBE and WB BWE pre-processing + *-------------------------------------------------------------------*/ + +void wb_pre_proc( + Encoder_State *st, /* i/o: encoder state structure */ + const int16_t last_element_mode, /* i : last element mode */ + const float *new_inp_resamp16k, /* i : original input signal */ + float *hb_speech /* o : HB target signal (6-8kHz) at 16kHz */ +) +{ + int16_t Sample_Delay_WB_BWE, ramp_flag; + TD_BWE_ENC_HANDLE hBWE_TD; + FD_BWE_ENC_HANDLE hBWE_FD; + float decim_state1[( 2 * ALLPASSSECTIONS_STEEP + 1 )], decim_state2[( 2 * ALLPASSSECTIONS_STEEP + 1 )]; + float old_input[NS2SA( 16000, DELAY_FD_BWE_ENC_NS + DELAY_FIR_RESAMPL_NS ) + STEREO_DFT_OVL_16k + L_FRAME16k]; + float *highband_new_speech, highband_old_speech[( L_LOOK_12k8 + L_SUBFR + L_FRAME ) * 5 / 16]; + int16_t fSwitchFromIO = 0; + int16_t ppp_mode; + + hBWE_TD = st->hBWE_TD; + hBWE_FD = st->hBWE_FD; + + if ( st->Opt_SC_VBR ) + { + ppp_mode = st->hSC_VBR->ppp_mode; + } + else + { + ppp_mode = 0; + } + + if ( ( st->last_total_brate == ACELP_6k60 ) || + ( st->last_total_brate == ACELP_8k85 ) || + ( st->last_total_brate == ACELP_12k65 ) || + ( st->last_total_brate == ACELP_14k25 ) || + ( st->last_total_brate == ACELP_15k85 ) || + ( st->last_total_brate == ACELP_18k25 ) || + ( st->last_total_brate == ACELP_19k85 ) || + ( st->last_total_brate == ACELP_23k05 ) || + ( st->last_total_brate == ACELP_23k85 ) ) + { + fSwitchFromIO = 1; + } + + set_f( old_input, 0, NS2SA( 16000, DELAY_FD_BWE_ENC_12k8_NS + DELAY_FIR_RESAMPL_NS ) + STEREO_DFT_OVL_16k + L_FRAME16k ); + + if ( st->extl == WB_BWE || st->extl == WB_TBE || st->igf ) + { + ramp_flag = 0; + if ( ( st->last_extl != WB_TBE && st->last_extl != WB_BWE && !st->igf ) || ( st->igf && fSwitchFromIO ) ) + { + ramp_flag = 1; + } + + if ( !ppp_mode ) + { + if ( st->element_mode == IVAS_CPE_DFT ) + { + Sample_Delay_WB_BWE = NS2SA( 16000, DELAY_FD_BWE_ENC_12k8_NS ); + + if ( last_element_mode == IVAS_CPE_TD ) + { + set_f( hBWE_TD->decim_state1, 0, ( 2 * ALLPASSSECTIONS_STEEP + 1 ) ); + set_f( hBWE_TD->decim_state2, 0, ( 2 * ALLPASSSECTIONS_STEEP + 1 ) ); + ramp_flag = 1; + } + + /*Get past signal*/ + mvr2r( hBWE_FD->old_wtda_swb + L_FRAME16k - STEREO_DFT_OVL_16k, old_input, STEREO_DFT_OVL_16k ); + mvr2r( hBWE_FD->old_input_wb, old_input + STEREO_DFT_OVL_16k, Sample_Delay_WB_BWE ); + + /*Get new signal*/ + mvr2r( new_inp_resamp16k, &old_input[Sample_Delay_WB_BWE + STEREO_DFT_OVL_16k], L_FRAME16k ); + + /*compute hb_speech on delayed input*/ + flip_spectrum_and_decimby4( old_input + Sample_Delay_WB_BWE, hb_speech, L_FRAME16k, hBWE_TD->decim_state1, hBWE_TD->decim_state2, ramp_flag ); + + /*Update memory*/ + mvr2r( hb_speech, hBWE_TD->old_speech_wb + ( L_SUBFR * 5 / 16 ), STEREO_DFT_OVL_16k / 4 ); + mvr2r( hb_speech + STEREO_DFT_OVL_16k / 4, hb_speech, ( L_FRAME16k - STEREO_DFT_OVL_16k ) / 4 ); + + /*rest without memory update*/ + mvr2r( hBWE_TD->decim_state1, decim_state1, ( 2 * ALLPASSSECTIONS_STEEP + 1 ) ); + mvr2r( hBWE_TD->decim_state2, decim_state2, ( 2 * ALLPASSSECTIONS_STEEP + 1 ) ); + + flip_spectrum_and_decimby4( old_input + Sample_Delay_WB_BWE + L_FRAME16k, hb_speech + ( L_FRAME16k - STEREO_DFT_OVL_16k ) / 4, STEREO_DFT_OVL_16k, decim_state1, decim_state2, 0 ); + } + else if ( st->element_mode == IVAS_CPE_TD ) + { + int16_t l_recalc_16k = L_MEM_RECALC_16K + L_FILT16k + 1; /* Note: "+1" is used because L_FILT16k is not divisible by 4 */ + int16_t l_recalc_4k = ( L_MEM_RECALC_16K + L_FILT16k + 1 ) / 4; + Sample_Delay_WB_BWE = NS2SA( 16000, DELAY_FD_BWE_ENC_12k8_NS ); + + if ( last_element_mode == IVAS_CPE_DFT ) + { + set_f( hBWE_TD->decim_state1, 0, ( 2 * ALLPASSSECTIONS_STEEP + 1 ) ); + set_f( hBWE_TD->decim_state2, 0, ( 2 * ALLPASSSECTIONS_STEEP + 1 ) ); + ramp_flag = 1; + } + + /*Get past signal*/ + mvr2r( hBWE_FD->old_wtda_swb + L_FRAME16k - l_recalc_16k, old_input, l_recalc_16k ); + mvr2r( hBWE_FD->old_input_wb, old_input + l_recalc_16k, Sample_Delay_WB_BWE ); + + old_input[Sample_Delay_WB_BWE] = hBWE_FD->mem_old_wtda_swb; + + /*Get new signal*/ + mvr2r( new_inp_resamp16k, old_input + Sample_Delay_WB_BWE + l_recalc_16k, L_FRAME16k ); + + /*compute hb_speech on delayed input*/ + flip_spectrum_and_decimby4( old_input + Sample_Delay_WB_BWE, hb_speech, L_FRAME16k, hBWE_TD->decim_state1, hBWE_TD->decim_state2, ramp_flag ); + + /*Update memory*/ + mvr2r( hb_speech, hBWE_TD->old_speech_wb + ( ( L_LOOK_12k8 + L_SUBFR ) * 5 / 16 ) - l_recalc_4k, l_recalc_4k ); + mvr2r( hb_speech + l_recalc_4k, hb_speech, ( L_FRAME16k / 4 ) - l_recalc_4k ); + + /*rest without memory update*/ + mvr2r( hBWE_TD->decim_state1, decim_state1, ( 2 * ALLPASSSECTIONS_STEEP + 1 ) ); + mvr2r( hBWE_TD->decim_state2, decim_state2, ( 2 * ALLPASSSECTIONS_STEEP + 1 ) ); + + flip_spectrum_and_decimby4( old_input + Sample_Delay_WB_BWE + L_FRAME16k, hb_speech + ( L_FRAME16k / 4 ) - l_recalc_4k, l_recalc_16k, decim_state1, decim_state2, 0 ); + } + else if ( st->element_mode == IVAS_SCE ) + { + if ( st->input_Fs == 16000 ) + { + flip_spectrum_and_decimby4( new_inp_resamp16k, hb_speech, L_FRAME16k, hBWE_TD->decim_state1, hBWE_TD->decim_state2, ramp_flag ); + } + else + { + int16_t l_recalc_16k = L_FILT16k + 1; /* Note: "+1" is used because L_FILT16k is not divisible by 4 */ + int16_t l_recalc_4k = ( L_FILT16k + 1 ) / 4; + + Sample_Delay_WB_BWE = NS2SA( 16000, DELAY_FD_BWE_ENC_12k8_NS ); + + /*Get past signal*/ + mvr2r( hBWE_FD->old_wtda_swb + L_FRAME16k - l_recalc_16k, old_input, l_recalc_16k ); + mvr2r( hBWE_FD->old_input_wb, old_input + l_recalc_16k, Sample_Delay_WB_BWE ); + + /*Get new signal*/ + mvr2r( new_inp_resamp16k, old_input + Sample_Delay_WB_BWE + l_recalc_16k, L_FRAME16k ); + + /*compute hb_speech on delayed input*/ + flip_spectrum_and_decimby4( old_input + Sample_Delay_WB_BWE, hb_speech, L_FRAME16k, hBWE_TD->decim_state1, hBWE_TD->decim_state2, ramp_flag ); + + /* update hBWE_TD->old_speech_wb memory */ + mvr2r( hb_speech, hBWE_TD->old_speech_wb + ( ( L_LOOK_12k8 + L_SUBFR ) * 5 / 16 ) - l_recalc_4k, l_recalc_4k ); + mvr2r( hb_speech + l_recalc_4k, hb_speech, ( L_FRAME16k / 4 ) - l_recalc_4k ); + + /*rest without memory update*/ + mvr2r( hBWE_TD->decim_state1, decim_state1, ( 2 * ALLPASSSECTIONS_STEEP + 1 ) ); + mvr2r( hBWE_TD->decim_state2, decim_state2, ( 2 * ALLPASSSECTIONS_STEEP + 1 ) ); + + flip_spectrum_and_decimby4( old_input + Sample_Delay_WB_BWE + L_FRAME16k, hb_speech + ( L_FRAME16k / 4 ) - l_recalc_4k, l_recalc_16k, decim_state1, decim_state2, 0 ); + } + } + else + { + flip_spectrum_and_decimby4( new_inp_resamp16k, hb_speech, L_FRAME16k, hBWE_TD->decim_state1, hBWE_TD->decim_state2, ramp_flag ); + } + + if ( st->extl != WB_TBE ) + { + /* Update the previous wideband speech buffer in case of a WB_BWE frame - this code is in wb_tbe_enc */ + Sample_Delay_WB_BWE = ( L_LOOK_12k8 + L_SUBFR ) * 5 / 16; + + highband_new_speech = highband_old_speech + Sample_Delay_WB_BWE; + + mvr2r( hBWE_TD->old_speech_wb, highband_old_speech, Sample_Delay_WB_BWE ); + mvr2r( hb_speech, highband_new_speech, L_FRAME16k / 4 ); + mvr2r( highband_old_speech + L_FRAME16k / 4, hBWE_TD->old_speech_wb, Sample_Delay_WB_BWE ); + } + } + } + else + { + set_f( hBWE_TD->decim_state1, 0.0f, ( 2 * ALLPASSSECTIONS_STEEP + 1 ) ); + set_f( hBWE_TD->decim_state2, 0.0f, ( 2 * ALLPASSSECTIONS_STEEP + 1 ) ); + set_f( hBWE_TD->old_speech_wb, 0.0f, ( L_LOOK_12k8 + L_SUBFR ) * 5 / 16 ); + } + + if ( hBWE_FD != NULL ) + { + hBWE_FD->mem_old_wtda_swb = new_inp_resamp16k[L_FRAME16k - L_MEM_RECALC_16K - L_FILT16k - 1]; + } + + /* st->old_input_wb and st->old_wtda_wb must be updated each frame, or there are often some clicks during WB TBE <-> WB BWE switching */ + if ( ( st->extl != WB_BWE || ( st->extl == WB_BWE && st->extl_brate == 0 ) ) && !ppp_mode ) + { + Sample_Delay_WB_BWE = NS2SA( 16000, DELAY_FD_BWE_ENC_12k8_NS ); + + mvr2r( new_inp_resamp16k, &old_input[Sample_Delay_WB_BWE], L_FRAME16k ); + mvr2r( hBWE_FD->old_input_wb, old_input, Sample_Delay_WB_BWE ); + mvr2r( new_inp_resamp16k + L_FRAME16k - Sample_Delay_WB_BWE, hBWE_FD->old_input_wb, Sample_Delay_WB_BWE ); + if ( ( st->extl != SWB_BWE ) && ( st->extl != FB_BWE ) ) + { + mvr2r( old_input, hBWE_FD->old_wtda_swb, L_FRAME16k ); + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * swb_pre_proc() + * + * - Calculate the 6 to 14 kHz (or 7.5 - 15.5 kHz) SHB target signal + * for SWB TBE or SWB BWE coding + * - Common SWB TBE and SWB BWE pre-processing + *-------------------------------------------------------------------*/ + +void swb_pre_proc( + Encoder_State *st, /* i/o: encoder state structure */ + float *new_swb_speech, /* o : original input signal at 32kHz */ + float *shb_speech, /* o : SHB target signal (6-14kHz) at 16kHz */ + float realBuffer[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i : real buffer */ + float imagBuffer[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i : imag buffer */ + CPE_ENC_HANDLE hCPE /* i/o: CPE encoder structure */ +) +{ + int16_t Sample_Delay_SWB_BWE, inner_frame, delay; + TD_BWE_ENC_HANDLE hBWE_TD; + FD_BWE_ENC_HANDLE hBWE_FD; + int32_t inner_Fs, input_Fs; + float old_input[NS2SA( 48000, DELAY_FD_BWE_ENC_NS + DELAY_FIR_RESAMPL_NS ) + L_FRAME48k]; + float spchTmp[L_FRAME32k], spchTmp2[L_FRAME32k]; + int16_t i, j, L_resamp; + int16_t startB, endB; + float *realBufferFlipped[CLDFB_NO_COL_MAX]; + float *imagBufferFlipped[CLDFB_NO_COL_MAX]; + float realBufferTmp[CLDFB_NO_COL_MAX][20]; + float imagBufferTmp[CLDFB_NO_COL_MAX][20]; + int16_t ts, nB, uB; + float sign, lbEner, v, t, regression; + const float *thr, *regV; + int16_t Sample_Delay_SWB_BWE32k, lMemRecalc32k, dft_ovl32k; + + lMemRecalc32k = NS2SA( 32000, L_MEM_RECALC_NS ); + + /* initialization */ + hBWE_TD = st->hBWE_TD; + hBWE_FD = st->hBWE_FD; + input_Fs = st->input_Fs; + + for ( j = 0; j < CLDFB_NO_COL_MAX; j++ ) + { + set_f( realBufferTmp[j], 0, 20 ); + set_f( imagBufferTmp[j], 0, 20 ); + realBufferFlipped[j] = realBufferTmp[j]; + imagBufferFlipped[j] = imagBufferTmp[j]; + } + + set_f( old_input, 0.0f, NS2SA( 48000, DELAY_FD_BWE_ENC_12k8_NS + DELAY_FIR_RESAMPL_NS ) + L_FRAME48k ); + + if ( input_Fs == 32000 ) + { + if ( st->element_mode > EVS_MONO ) + { + Sample_Delay_SWB_BWE = NS2SA( 32000, DELAY_FD_BWE_ENC_12k8_NS ); + if ( st->L_frame == L_FRAME16k ) + { + Sample_Delay_SWB_BWE = NS2SA( 32000, DELAY_FD_BWE_ENC_16k_NS ); + } + + mvr2r( st->input - Sample_Delay_SWB_BWE, hBWE_FD->old_input, Sample_Delay_SWB_BWE ); + mvr2r( st->input - L_FRAME32k, hBWE_FD->old_fdbwe_speech, L_FRAME32k ); + + if ( st->element_mode == IVAS_CPE_TD && st->bwidth >= SWB ) + { + mvr2r( st->input - hCPE->hStereoTCA->lMemRecalc, hBWE_FD->old_wtda_swb + L_FRAME32k - ( hCPE->hStereoTCA->lMemRecalc - Sample_Delay_SWB_BWE ), hCPE->hStereoTCA->lMemRecalc - Sample_Delay_SWB_BWE ); + } + else if ( st->element_mode == IVAS_CPE_DFT && st->bwidth >= SWB ) + { + mvr2r( st->input - hCPE->hStereoDft->dft_ovl, hBWE_FD->old_wtda_swb + L_FRAME32k - ( hCPE->hStereoDft->dft_ovl - Sample_Delay_SWB_BWE ), hCPE->hStereoDft->dft_ovl - Sample_Delay_SWB_BWE ); + } + } + + mvr2r( st->input, new_swb_speech, L_FRAME32k ); + + if ( st->last_extl != SWB_BWE && st->last_extl != FB_BWE && st->extl != SWB_BWE_HIGHRATE ) + { + Sample_Delay_SWB_BWE = NS2SA( 32000, DELAY_FD_BWE_ENC_12k8_NS + DELAY_FIR_RESAMPL_NS ); + if ( st->element_mode > EVS_MONO && st->L_frame == L_FRAME16k ) + { + Sample_Delay_SWB_BWE = NS2SA( 32000, DELAY_FD_BWE_ENC_16k_NS + DELAY_FIR_RESAMPL_NS ); + } + if ( st->element_mode > EVS_MONO ) + { + Sample_Delay_SWB_BWE -= NS2SA( 32000, DELAY_FIR_RESAMPL_NS ); + } + + mvr2r( hBWE_FD->old_fdbwe_speech, &old_input[Sample_Delay_SWB_BWE], L_FRAME32k ); + + set_f( old_input, 0, Sample_Delay_SWB_BWE ); + mvr2r( hBWE_FD->old_fdbwe_speech + L_FRAME32k - Sample_Delay_SWB_BWE, hBWE_FD->old_input, Sample_Delay_SWB_BWE ); + if ( st->extl != WB_BWE ) + { + mvr2r( old_input, hBWE_FD->old_wtda_swb, L_FRAME32k ); + } + } + + if ( st->extl != SWB_BWE && st->extl != FB_BWE ) + { + mvr2r( st->input, hBWE_FD->old_fdbwe_speech, L_FRAME32k ); + } + } + else /* 48 kHz */ + { + + Sample_Delay_SWB_BWE32k = NS2SA( 32000, DELAY_FD_BWE_ENC_12k8_NS ); + Sample_Delay_SWB_BWE = NS2SA( 48000, DELAY_FD_BWE_ENC_12k8_NS ); + if ( st->L_frame == L_FRAME16k ) + { + Sample_Delay_SWB_BWE32k = NS2SA( 32000, DELAY_FD_BWE_ENC_16k_NS ); + Sample_Delay_SWB_BWE = NS2SA( 48000, DELAY_FD_BWE_ENC_16k_NS ); + } + + dft_ovl32k = 0; + if ( st->element_mode == IVAS_CPE_DFT ) + { + dft_ovl32k = (int16_t) ( STEREO_DFT_OVL_MAX * 32000 / 48000 ); + } + + if ( st->codec_mode == MODE1 ) + { + if ( st->element_mode > EVS_MONO ) + { + + if ( st->element_mode == IVAS_CPE_TD ) + { + } + else if ( st->bwidth == FB ) + { + mvr2r( st->input - Sample_Delay_SWB_BWE, hBWE_FD->old_input, Sample_Delay_SWB_BWE ); + } + + mvr2r( st->input - L_FRAME48k, hBWE_FD->old_fdbwe_speech, L_FRAME48k ); + + if ( st->element_mode == IVAS_CPE_TD && st->bwidth >= SWB ) + { + if ( st->bwidth == SWB ) + { + /* buffers hBWE_FD->old_input[] and hBWE_FD->old_wtda_swb[] need to be at 32 kHz (inner) sampling rate */ + + decimate_2_over_3_allpass( st->input - hCPE->hStereoTCA->lMemRecalc, hCPE->hStereoTCA->lMemRecalc, spchTmp, hBWE_TD->dec_2_over_3_mem, hBWE_TD->dec_2_over_3_mem_lp ); + + mvr2r( spchTmp, hBWE_FD->old_wtda_swb + L_FRAME32k - ( lMemRecalc32k - Sample_Delay_SWB_BWE32k ), lMemRecalc32k - Sample_Delay_SWB_BWE32k ); + mvr2r( spchTmp + lMemRecalc32k - Sample_Delay_SWB_BWE32k, hBWE_FD->old_input, Sample_Delay_SWB_BWE32k ); + } + else /* FB_BWE */ + { + mvr2r( st->input - hCPE->hStereoTCA->lMemRecalc, hBWE_FD->old_wtda_swb + L_FRAME48k - ( hCPE->hStereoTCA->lMemRecalc - Sample_Delay_SWB_BWE ), hCPE->hStereoTCA->lMemRecalc - Sample_Delay_SWB_BWE ); + mvr2r( st->input - Sample_Delay_SWB_BWE, hBWE_FD->old_input, Sample_Delay_SWB_BWE ); + } + } + else if ( st->element_mode == IVAS_CPE_DFT && st->bwidth >= SWB ) + { + if ( st->bwidth == SWB ) + { + lerp( st->input - hCPE->hStereoDft->dft_ovl, spchTmp, dft_ovl32k - Sample_Delay_SWB_BWE32k, hCPE->hStereoDft->dft_ovl - Sample_Delay_SWB_BWE ); + + mvr2r( spchTmp, hBWE_FD->old_wtda_swb + L_FRAME32k - ( dft_ovl32k - Sample_Delay_SWB_BWE32k ), dft_ovl32k - Sample_Delay_SWB_BWE32k ); + } + else + { + mvr2r( st->input - hCPE->hStereoDft->dft_ovl, hBWE_FD->old_wtda_swb + L_FRAME48k - ( hCPE->hStereoDft->dft_ovl - Sample_Delay_SWB_BWE ), hCPE->hStereoDft->dft_ovl - Sample_Delay_SWB_BWE ); + } + } + } + + if ( ( st->extl != SWB_BWE && st->extl != FB_BWE && st->core == ACELP_CORE ) || ( st->element_mode == IVAS_CPE_DFT && st->core != ACELP_CORE ) /*resampling not needed for MDCT cores*/ ) + { + /* move the resampling out of the TDBWE path as new_swb_speech is not needed for TDBWE. */ + mvr2r( st->input, hBWE_FD->old_fdbwe_speech, L_FRAME48k ); + } + else + { + if ( st->last_extl != SWB_BWE && st->last_extl != FB_BWE ) + { + /* resample 48 kHz to 32kHz */ + if ( st->last_bwidth == FB ) + { + inner_frame = L_FRAME48k; + inner_Fs = 48000; + mvr2r( hBWE_FD->old_fdbwe_speech, new_swb_speech, L_FRAME48k ); + } + else + { + inner_frame = L_FRAME32k; + inner_Fs = 32000; + + if ( st->element_mode != IVAS_CPE_DFT ) + { + decimate_2_over_3_allpass( hBWE_FD->old_fdbwe_speech, L_FRAME48k, new_swb_speech, hBWE_TD->dec_2_over_3_mem, hBWE_TD->dec_2_over_3_mem_lp ); + } + else + { + lerp( hBWE_FD->old_fdbwe_speech, new_swb_speech, inner_frame, L_FRAME48k ); + } + + if ( st->element_mode == IVAS_CPE_DFT && st->idchan == 0 ) + { + for ( i = 0; i < STEREO_DFT_OVL_32k; i++ ) + { + hCPE->hStereoDft->output_mem_dmx_32k[i] = new_swb_speech[inner_frame - STEREO_DFT_OVL_32k + i] * hCPE->hStereoDft->win_32k[STEREO_DFT_OVL_32k - 1 - i]; + } + } + } + + Sample_Delay_SWB_BWE = NS2SA( inner_Fs, DELAY_FD_BWE_ENC_12k8_NS + DELAY_FIR_RESAMPL_NS ); + if ( st->element_mode > EVS_MONO && st->L_frame == L_FRAME16k ) + { + Sample_Delay_SWB_BWE = NS2SA( inner_Fs, DELAY_FD_BWE_ENC_16k_NS + DELAY_FIR_RESAMPL_NS ); + } + if ( st->element_mode > EVS_MONO ) + { + Sample_Delay_SWB_BWE -= NS2SA( inner_Fs, DELAY_FIR_RESAMPL_NS ); + } + + mvr2r( new_swb_speech, &old_input[Sample_Delay_SWB_BWE], inner_frame ); + set_f( old_input, 0, Sample_Delay_SWB_BWE ); + mvr2r( new_swb_speech + inner_frame - Sample_Delay_SWB_BWE, hBWE_FD->old_input, Sample_Delay_SWB_BWE ); + mvr2r( old_input, hBWE_FD->old_wtda_swb, inner_frame ); + } + + /* resample 48 kHz to 32kHz */ + if ( st->bwidth == FB ) + { + mvr2r( st->input, new_swb_speech, L_FRAME48k ); + } + else + { + if ( st->element_mode == IVAS_CPE_TD ) + { + float dec_2_over_3_mem_tmp[L_FILT_2OVER3], dec_2_over_3_mem_lp_tmp[L_FILT_2OVER3_LP]; + + decimate_2_over_3_allpass( st->input, L_FRAME48k - hCPE->hStereoTCA->lMemRecalc, new_swb_speech, hBWE_TD->dec_2_over_3_mem, hBWE_TD->dec_2_over_3_mem_lp ); + + mvr2r( hBWE_TD->dec_2_over_3_mem, dec_2_over_3_mem_tmp, L_FILT_2OVER3 ); + mvr2r( hBWE_TD->dec_2_over_3_mem_lp, dec_2_over_3_mem_lp_tmp, L_FILT_2OVER3_LP ); + + decimate_2_over_3_allpass( st->input + L_FRAME48k - hCPE->hStereoTCA->lMemRecalc, hCPE->hStereoTCA->lMemRecalc, new_swb_speech + L_FRAME32k - lMemRecalc32k, dec_2_over_3_mem_tmp, dec_2_over_3_mem_lp_tmp ); + } + else if ( st->element_mode != IVAS_CPE_DFT ) + { + decimate_2_over_3_allpass( st->input, L_FRAME48k, new_swb_speech, hBWE_TD->dec_2_over_3_mem, hBWE_TD->dec_2_over_3_mem_lp ); + } + else /* IVAS_CPE_DFT */ + { + stereo_dft_enc_synthesize( hCPE->hStereoDft, new_swb_speech, st->idchan, input_Fs, 32000, 0 ); + + mvr2r( new_swb_speech - Sample_Delay_SWB_BWE32k, hBWE_FD->old_input, Sample_Delay_SWB_BWE32k ); + } + } + } + } + else + { + /* resample 48 kHz to 32kHz */ + if ( st->bwidth == FB ) + { + mvr2r( st->input, new_swb_speech, L_FRAME48k ); + } + else + { + decimate_2_over_3_allpass( st->input, L_FRAME48k, new_swb_speech, hBWE_TD->dec_2_over_3_mem, hBWE_TD->dec_2_over_3_mem_lp ); + } + } + } + + if ( ( st->core == ACELP_CORE && st->extl != SWB_BWE_HIGHRATE && st->extl != FB_BWE_HIGHRATE ) || + ( ( st->total_brate == ACELP_9k60 || st->rf_mode ) && st->bwidth == SWB && st->element_mode == EVS_MONO ) ) + { + float CldfbHB = 0; + + if ( st->element_mode == IVAS_CPE_DFT ) + { + CldfbHB = stereo_dft_enc_synthesize( hCPE->hStereoDft, old_input + STEREO_DFT_OVL_16k, st->idchan, input_Fs, 16000, st->L_frame ); + + /* delay corresponding to CLDFB delay */ + mvr2r( old_input + STEREO_DFT_OVL_16k - 20, shb_speech, L_FRAME16k ); + mvr2r( old_input, hBWE_TD->old_speech_shb + L_LOOK_16k + L_SUBFR16k - ( STEREO_DFT_OVL_16k - 20 ), STEREO_DFT_OVL_16k - 20 ); + mvr2r( old_input, hCPE->hStereoICBWE->mem_shb_speech_ref, STEREO_DFT_OVL_16k - 20 ); + + if ( CldfbHB <= 0 ) + { + CldfbHB = 1.0f; + } + hBWE_TD->cldfbHBLT = 0.9f * hBWE_TD->cldfbHBLT + 0.1f * ( 0.221462f /*=1/log10(32768)*/ * ( log10f( CldfbHB ) - 1.0f ) ); + + lbEner = 0.05f * (float) sqrt( hCPE->hStereoDft->lbEner ); + hCPE->hStereoICBWE->icbweRefEner = 0.05f * (float) sqrt( hCPE->hStereoDft->icbweRefEner ); + lbEner = 0.05f * (float) sqrt( hCPE->hStereoDft->lbEner ); + thr = icbwe_thr_DFT; + regV = icbwe_regressionValuesDFT; + } + else + { + if ( st->L_frame == L_FRAME ) + { + startB = 34; + endB = 14; + for ( ts = 0; ts < CLDFB_NO_COL_MAX; ts++ ) + { + for ( nB = startB, uB = 0; nB > endB; nB--, uB++ ) + { + sign = ( ts % 2 ) ? 1.0f : -1.0f; + realBufferFlipped[ts][uB] = -sign * realBuffer[ts][nB]; + imagBufferFlipped[ts][uB] = sign * imagBuffer[ts][nB]; + } + } + } + else + { + startB = 39; + endB = 19; + for ( ts = 0; ts < CLDFB_NO_COL_MAX; ts++ ) + { + for ( nB = startB, uB = 0; nB > endB; nB--, uB++ ) + { + realBufferFlipped[ts][uB] = -realBuffer[ts][nB]; + imagBufferFlipped[ts][uB] = imagBuffer[ts][nB]; + } + } + } + + for ( nB = 0; nB < 10; nB++ ) + { + for ( ts = 0; ts < CLDFB_NO_COL_MAX; ts++ ) + { + CldfbHB += ( realBufferFlipped[ts][nB] * realBufferFlipped[ts][nB] + imagBufferFlipped[ts][nB] * imagBufferFlipped[ts][nB] ); + } + } + if ( CldfbHB <= 0 ) + { + CldfbHB = 1.0f; + } + hBWE_TD->cldfbHBLT = 0.9f * hBWE_TD->cldfbHBLT + 0.1f * ( 0.221462f /*=1/log10(32768)*/ * ( log10f( CldfbHB ) - 1.0f ) ); + + if ( st->element_mode >= IVAS_CPE_DFT && hCPE->hStereoICBWE != NULL ) + { + hCPE->hStereoICBWE->icbweRefEner = EPSILON; + for ( nB = 20; nB < 40; nB++ ) + { + for ( ts = 0; ts < CLDFB_NO_COL_MAX; ts++ ) + { + hCPE->hStereoICBWE->icbweRefEner += ( realBuffer[ts][nB] * realBuffer[ts][nB] + imagBuffer[ts][nB] * imagBuffer[ts][nB] ); + } + } + hCPE->hStereoICBWE->icbweRefEner = 0.05f * sqrtf( hCPE->hStereoICBWE->icbweRefEner ); + } + + lbEner = EPSILON; + for ( nB = 0; nB < 20; nB++ ) + { + for ( ts = 0; ts < CLDFB_NO_COL_MAX; ts++ ) + { + lbEner += ( realBuffer[ts][nB] * realBuffer[ts][nB] + imagBuffer[ts][nB] * imagBuffer[ts][nB] ); + } + } + lbEner = 0.05f * sqrtf( lbEner ); + thr = icbwe_thr_TDM; + regV = icbwe_regressionValuesTDM; + + cldfbSynthesis( realBufferFlipped, imagBufferFlipped, shb_speech, -1, st->cldfbSynTd ); + } + + if ( st->element_mode >= IVAS_CPE_DFT && hCPE->hStereoICBWE != NULL ) + { + hCPE->hStereoICBWE->MSFlag = 0; /* Init the multi-source flag */ + v = 0.3333f * sum_f( st->voicing, 3 ); + t = log10f( ( hCPE->hStereoICBWE->icbweRefEner + 1e-6f ) / ( lbEner + 1e-6f ) ); + + /* Three Level Decision Tree to calculate a regression value first */ + if ( t < thr[0] ) /* level 1 */ + { + if ( t < thr[1] ) /* level 2 */ + { + regression = ( v < thr[3] ) ? regV[0] : regV[1]; /* level 3 */ + } + else + { + regression = ( v < thr[4] ) ? regV[2] : regV[3]; /* level 3 */ + } + } + else + { + if ( t < thr[2] ) /* level 2 */ + { + regression = ( v < thr[5] ) ? regV[4] : regV[5]; /* level 3 */ + } + else + { + regression = ( v < thr[6] ) ? regV[6] : regV[7]; /* level 3 */ + } + } + + /* Convert the regression to a hard decision (classification) */ + if ( regression > 0.79f && !( st->bwidth < SWB || hCPE->hCoreCoder[0]->vad_flag == 0 ) ) + { + hCPE->hStereoICBWE->MSFlag = 1; + } + } + + if ( st->extl != WB_TBE && st->extl != SWB_TBE && st->extl != FB_TBE ) + { + /* Update the previous superwideband speech buffer in case of a SWB_BWE frame - this code is in swb_tbe_enc */ + delay = L_LOOK_16k + L_SUBFR16k; + mvr2r( shb_speech + L_FRAME16k - delay, hBWE_TD->old_speech_shb, delay ); + } + } + else + { + if ( ( st->bwidth == FB || st->core == ACELP_CORE ) && ( st->element_mode == EVS_MONO ) ) + { + InitSWBencBufferStates( st->hBWE_TD, shb_speech ); + } + else + { + if ( st->element_mode == IVAS_CPE_DFT ) + { + if ( st->L_frame == L_FRAME ) + { + L_resamp = 560; /* 6.4 kHz core -> 6 - 14 kHz SHB target. 20 ms is 560 samples in 28 kHz sample rate */ + } + else + { + L_resamp = 620; /* 8 kHz core -> 7.5 - 15.5 kHz SHB target. 20 ms is 620 samples in 31 kHz sample rate */ + } + + /* Dirty downsampling to match Nyquist to upper frequency limit of target */ + lerp( st->input, new_swb_speech, L_resamp, (int16_t) ( input_Fs / 50 ) ); + + /* flip the spectrum */ + mvr2r( new_swb_speech, spchTmp, L_resamp ); + for ( i = 0; i < L_resamp; i = i + 2 ) + { + spchTmp[i] = -spchTmp[i]; + } + + /* Dirty upsampling to match Nyquist/2 to lower frequency limit of target (reversed spectrum)*/ + lerp( spchTmp, spchTmp2, L_FRAME32k, L_resamp ); + mvr2r( spchTmp2, spchTmp, L_FRAME32k ); + } + else + { + /* flip the spectrum */ + mvr2r( new_swb_speech, spchTmp, L_FRAME32k ); + + for ( i = 0; i < L_FRAME32k; i = i + 2 ) + { + spchTmp[i] = -spchTmp[i]; + } + } + + Decimate_allpass_steep( spchTmp, hBWE_TD->state_ana_filt_shb, L_FRAME32k, shb_speech ); + + mvr2r( shb_speech + L_FRAME16k - ( L_LOOK_16k + L_SUBFR16k ), hBWE_TD->old_speech_shb, L_LOOK_16k + L_SUBFR16k ); + + /*Compute the past overlap for potential next iDFTs SHB*/ + if ( st->element_mode == IVAS_CPE_DFT ) + { + for ( i = 0; i < STEREO_DFT_OVL_16k; i++ ) + { + hCPE->hStereoDft->output_mem_dmx_16k_shb[i] = shb_speech[20 + i] * hCPE->hStereoDft->win_ana_16k[STEREO_DFT_OVL_16k - 1 - i] * hCPE->hStereoDft->win_ana_16k[STEREO_DFT_OVL_16k - 1 - i]; + } + } + } + + if ( st->element_mode != IVAS_CPE_DFT ) + { + /* Reset CLDFB synthesis buffer */ + set_f( st->cldfbSynTd->cldfb_state, 0.0f, st->cldfbSynTd->p_filter_length ); + } + else + { + hCPE->hStereoDft->flip_sign = -hCPE->hStereoDft->flip_sign; /* Make sure sign is updated even if DFT SHB target is not generated */ + } + } + + /* Memory reset to compensate for 0.9375 ms offset when transitioning from IO to SWB */ + /* When switching from n >1 to n = 1, we keep the enc/dec delay as 8.75/3.25 and below code not needed; + only when n = 1 start, it will be 9.6875/2.3125 in that case this reset is needed for IO->BWE.*/ + if ( st->last_extl == -1 && st->element_mode == EVS_MONO ) + { + delay = NS2SA( input_Fs, DELAY_FIR_RESAMPL_NS ); + for ( i = 0; i < delay; i++ ) + { + shb_speech[i] = (float) i * ( 0.03f * shb_speech[2 * delay - 1 - i] ); + } + } + + return; +} diff --git a/lib_enc/swb_tbe_enc.c b/lib_enc/swb_tbe_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..e8573d96b1142a05a22c44450b186e612696bcc2 --- /dev/null +++ b/lib_enc/swb_tbe_enc.c @@ -0,0 +1,2876 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "rom_com.h" +#include "rom_enc.h" +#include "wmc_auto.h" +#include "ivas_prot.h" + +/*-----------------------------------------------------------------* + * Local constants + *-----------------------------------------------------------------*/ + +#define ENVSHBRES_ACORR_MIN 40 /* minimum lag for calculating autocorrelation function on SHB residual TD envelope */ +#define ENVSHBRES_ACORR_MAX 80 /* maximum lag for calculating autocorrelation function on SHB residual TD envelope */ + + +/*-----------------------------------------------------------------* + * Local function prototypes + *-----------------------------------------------------------------*/ + +static void return_M_Least( const float *inp, const int16_t n_cols, const float *codebook, const int16_t num_grp, const float *weight, const int16_t interNum, int16_t *least ); +static void singlevectortest_gain( const float *inp, const int16_t dimen, const int16_t cb_size, int16_t *index, const float *weight, float *recon, const float *codebook ); +static void determine_gain_weights( const float *gain, float *weights, const int16_t dims ); +static void QuantizeSHBsubgains( Encoder_State *st, float *subgains, const int16_t extl ); +static void QuantizeSHBframegain( Encoder_State *st, float *GainFrame, const int16_t extl, const int32_t extl_brate, int16_t *rf_gainFrame_ind, const int16_t flag_conservative ); +static int16_t closest_centroid( const float *data, const float *weights, const float *quantizer, const int16_t centroids, const int16_t length ); +static void EstimateSHBFrameGain( const int16_t length, const float *oriSHB, const float *synSHB, float *subgain, float *GainFrame, const float *win_shb, const float *subwin ); +static void EstimateSHBGainShape( const int16_t length, const float *oriSHB, const float *synSHB, float *subgain, const float *subwin ); +static float pow_off_pk( float a[], const int16_t len, const int16_t step ); +static float pow_off_pk_corrected( float a[], const int16_t len, const int16_t step ); +static void Quant_lower_LSF( const float lsf[], float lsf_q[], int16_t lsf_idx[] ); +static int16_t Quant_mirror_point( const float lsf[], const float lsf_q[], float *m ); +static int16_t Find_LSF_grid( const float lsf[], float lsf_q[], const float m ); +static void gainFrSmooth_En( TD_BWE_ENC_HANDLE hBWE_TD, const int16_t last_extl, float *shb_frame, const float *lpc_shb, const float *lsp_shb, float *MA_lsp_shb_spacing, int16_t *frGainAttenuate, int16_t *frGainSmoothEn ); +static void Quant_BWE_LSF( BSTR_ENC_HANDLE hBstr, TD_BWE_ENC_HANDLE hBWE_TD, const int16_t codec_mode, const float lsp_shb[], float Q_lsfs[], const int32_t extl_brate ); +static void Quant_shb_ener_sf( Encoder_State *st, float *shb_ener_sf ); +static void Quant_shb_res_gshape( Encoder_State *st, float *shb_res_gshape ); +static void LVQQuant_BWE_LSF( BSTR_ENC_HANDLE hBstr, const float lsf_shb[], float Q_lsfs[], int16_t nbits ); + + +/*-------------------------------------------------------------------* + * InitSWBencBuffer() + * + * Initialize SWB buffers and parameters + *-------------------------------------------------------------------*/ + +void InitSWBencBuffer( + TD_BWE_ENC_HANDLE hBWE_TD /* i/o: TD BWE data handle */ +) +{ + int16_t i; + + set_f( hBWE_TD->old_bwe_exc, 0.0f, ( PIT16k_MAX * 2 ) ); + hBWE_TD->bwe_seed[0] = 23; + hBWE_TD->bwe_seed[1] = 59; + set_f( hBWE_TD->old_bwe_exc_extended, 0.0f, NL_BUFF_OFFSET ); + hBWE_TD->bwe_non_lin_prev_scale = 0; + + set_f( hBWE_TD->state_ana_filt_shb, 0.0f, ( 2 * ALLPASSSECTIONS_STEEP + 1 ) ); + + set_f( hBWE_TD->elliptic_bpf_2_48k_mem[0], 0.0f, 4 ); + set_f( hBWE_TD->elliptic_bpf_2_48k_mem[1], 0.0f, 4 ); + set_f( hBWE_TD->elliptic_bpf_2_48k_mem[2], 0.0f, 4 ); + set_f( hBWE_TD->elliptic_bpf_2_48k_mem[3], 0.0f, 4 ); + hBWE_TD->prev_fb_energy = 0.0f; + + set_f( hBWE_TD->old_speech_shb, 0.0f, L_LOOK_16k + L_SUBFR16k ); + set_f( hBWE_TD->old_speech_wb, 0.0f, ( L_LOOK_12k8 + L_SUBFR ) * 5 / 16 ); + set_f( hBWE_TD->old_input_fhb, 0.0f, NS2SA( 48000, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_12k8_NS + DELAY_FIR_RESAMPL_NS ) - L_FRAME48k / 2 ); + + InitSWBencBufferStates( hBWE_TD, NULL ); + + for ( i = 0; i < LPC_SHB_ORDER; i++ ) + { + hBWE_TD->prev_lsp_shb[i] = i / 20.0f; + } + + hBWE_TD->cldfbHBLT = 1.0f; + hBWE_TD->prev_gainFr_SHB = 0; + set_f( hBWE_TD->lsp_shb_slow_interpl, 0, LPC_SHB_ORDER ); + set_f( hBWE_TD->lsp_shb_fast_interpl, 0, LPC_SHB_ORDER ); + set_f( hBWE_TD->shb_inv_filt_mem, 0, LPC_SHB_ORDER ); + set_f( hBWE_TD->lsp_shb_spacing, 0.1f, 3 ); + hBWE_TD->prev_swb_GainShape = 0; + hBWE_TD->prev_frGainAtten = 0; + hBWE_TD->prev_wb_GainShape = 0; + set_f( hBWE_TD->fb_state_lpc_syn, 0, LPC_SHB_ORDER ); + hBWE_TD->fb_tbe_demph = 0.0f; + hBWE_TD->tilt_mem = 0.0f; + + hBWE_TD->prev_coder_type = GENERIC; + set_f( hBWE_TD->prev_lsf_diff, 0.5f, LPC_SHB_ORDER - 2 ); + hBWE_TD->prev_tilt_para = 0.0f; + set_f( hBWE_TD->cur_sub_Aq, 0.0f, M + 1 ); + + /* TD BWE post-processing */ + hBWE_TD->ptr_mem_stp_swb = hBWE_TD->mem_stp_swb + LPC_SHB_ORDER - 1; + set_f( hBWE_TD->mem_zero_swb, 0, LPC_SHB_ORDER ); + + for ( i = 0; i < LPC_SHB_ORDER; i++ ) + { + hBWE_TD->swb_lsp_prev_interp[i] = (float) cos( (float) i * EVS_PI / (float) 10.0f ); + } + + set_f( hBWE_TD->dec_2_over_3_mem, 0.0f, L_FILT_2OVER3 ); + set_f( hBWE_TD->dec_2_over_3_mem_lp, 0.0f, L_FILT_2OVER3_LP ); + + return; +} + + +/*-------------------------------------------------------------------* + * InitSWBencBufferStates() + * + * Initialize SWB buffer states + *-------------------------------------------------------------------*/ + +void InitSWBencBufferStates( + TD_BWE_ENC_HANDLE hBWE_TD, /* i/o: TD BWE data handle */ + float *shb_speech /* o : SHB target signal (6-14kHz) at 16kHz */ +) +{ + if ( shb_speech != NULL ) + { + set_f( shb_speech, 0.0f, L_FRAME16k ); + } + + set_f( hBWE_TD->old_speech_shb, 0.0f, L_LOOK_16k + L_SUBFR16k ); + set_f( hBWE_TD->mem_shb_res, 0.0f, MAX_LEN_MA_FILTER ); + set_f( hBWE_TD->old_EnvSHBres, 0.0f, L_FRAME4k ); + hBWE_TD->old_mean_EnvSHBres = 0.0f; + hBWE_TD->prev_enr_EnvSHBres = 1.0f; + hBWE_TD->prev_shb_env_tilt = 0.0f; + hBWE_TD->prev_pow_exc16kWhtnd = 1.0f; + hBWE_TD->prev_mix_factor = 1.0f; + hBWE_TD->prev_Env_error = 0.0f; + + return; +} + + +/*-------------------------------------------------------------------* + * ResetSHBbuffer_Enc() + * + *-------------------------------------------------------------------*/ + +void ResetSHBbuffer_Enc( + TD_BWE_ENC_HANDLE hBWE_TD /* i/o: TD BWE data handle */ +) +{ + /* states for the filters used in generating SHB excitation from WB excitation*/ + set_f( hBWE_TD->mem_genSHBexc_filt_down_shb, 0, ( 2 * ALLPASSSECTIONS_STEEP + 1 ) ); + set_f( hBWE_TD->mem_csfilt, 0, 2 ); + + /* states for the filters used in generating SHB signal from SHB excitation*/ + set_f( hBWE_TD->state_syn_shbexc, 0, L_SHB_LAHEAD ); + set_f( hBWE_TD->state_lpc_syn, 0, LPC_SHB_ORDER ); + set_f( hBWE_TD->fb_state_lpc_syn, 0, LPC_SHB_ORDER ); + hBWE_TD->fb_tbe_demph = 0; + + /* states for the filters used in generating WB signal from WB excitation*/ + set_f( hBWE_TD->decim_state1, 0.0f, ( 2 * ALLPASSSECTIONS_STEEP + 1 ) ); + set_f( hBWE_TD->decim_state2, 0.0f, ( 2 * ALLPASSSECTIONS_STEEP + 1 ) ); + set_f( hBWE_TD->mem_genSHBexc_filt_down_wb2, 0, ( 2 * ALLPASSSECTIONS_STEEP + 1 ) ); + set_f( hBWE_TD->mem_genSHBexc_filt_down_wb3, 0, ( 2 * ALLPASSSECTIONS_STEEP + 1 ) ); + + /* overlap buffer used to Adjust SHB Frame Gain */ + set_f( hBWE_TD->mem_stp_swb, 0, LPC_SHB_ORDER ); + hBWE_TD->gain_prec_swb = 1.0f; + set_f( hBWE_TD->syn_overlap, 0, L_SHB_LAHEAD ); + hBWE_TD->tbe_demph = 0.0f; + hBWE_TD->tbe_premph = 0.0f; + + return; +} + + +/*-------------------------------------------------------------------* + * wb_tbe_enc() + * + * WB TBE encoder, 6 - 8 kHz band encoding module + *-------------------------------------------------------------------*/ + +void wb_tbe_enc( + Encoder_State *st, /* i/o: encoder state structure */ + const float *hb_speech, /* i : HB target signal (6-8kHz) at 16kHz */ + const float *bwe_exc_extended, /* i : bandwidth extended exciatation */ + const float voice_factors[], /* i : voicing factors */ + const float pitch_buf[] /* i : pitch for each subframe */ +) +{ + int16_t i, j, k, delay; + TD_BWE_ENC_HANDLE hBWE_TD; + BSTR_ENC_HANDLE hBstr; + float hb_old_speech[( L_LOOK_12k8 + L_SUBFR + L_FRAME ) * 5 / 16]; + float shaped_wb_excitation[( L_FRAME16k + L_SHB_LAHEAD ) / 4]; + float exc4kWhtnd[L_FRAME16k / 4]; + int16_t ana_align_delay = -L_SHB_LAHEAD / 4 - 5; + float GainFrame, GainShape[NUM_SHB_SUBFR]; + float lpc_wb[LPC_SHB_ORDER_WB + 1]; + float lsp_wb[LPC_SHB_ORDER_WB], weights_lsp[LPC_SHB_ORDER_WB] = { 1.0, 1.0 }; + float *hb_new_speech, *hb_frame; + float R[LPC_SHB_ORDER_WB + 2], ervec[LPC_SHB_ORDER_WB + 1]; + float prev_pow, curr_pow, scale; + float p2m_in, p2m_out; + int16_t uv_flag; + float pitBufAvg, voicingBufAvg; + float vf_modified[NB_SUBFR16k]; + float temp_wb_fac, feedback; + float lsp_spacing; + float ervec_temp[LPC_SHB_ORDER_WB + 1]; + float lsp_wb_temp[LPC_SHB_ORDER_WB], lpc_wb_temp[LPC_SHB_ORDER_WB + 1]; + + hBWE_TD = st->hBWE_TD; + hBstr = st->hBstr; + + /* delay alignment */ + delay = ( L_LOOK_12k8 + L_SUBFR ) * 5 / 16; + + hb_new_speech = hb_old_speech + delay; + hb_frame = hb_old_speech + L_SUBFR * 5 / 16 + ana_align_delay; + + mvr2r( hBWE_TD->old_speech_wb, hb_old_speech, delay ); + mvr2r( hb_speech, hb_new_speech, L_FRAME16k / 4 ); + mvr2r( hb_old_speech + L_FRAME16k / 4, hBWE_TD->old_speech_wb, delay ); + + if ( ( st->last_extl != WB_TBE && st->last_extl != WB_BWE ) && + ( st->clas == UNVOICED_CLAS || ( st->voicing[0] < 0.5f && st->voicing[1] < 0.5f && st->voicing[2] < 0.5f ) ) && + ( !st->igf ) ) + { + /* In case of unvoiced signals after switching cores, back-propagate the target signal */ + mvr2r( hb_speech, hb_old_speech, delay ); + + for ( i = ( L_LOOK_12k8 + L_SUBFR ) * 5 / 16, j = k = 0; j < L_SUBFR16k; i--, j += 4, k++ ) + { + hb_old_speech[i] *= ola_win_shb_switch_fold[j]; + hb_old_speech[i] += hb_speech[k] * ola_win_shb_switch_fold[L_SUBFR16k - 4 - j]; + } + } + + autocorr( hb_old_speech, R, LPC_SHB_ORDER_WB + 1, ( NS2SA( INT_FS_12k8, 5000000L ) + L_SUBFR + L_FRAME ) * 5 / 16, win_lpc_hb_wb, 0, 1, 1 ); + lev_dur( lpc_wb_temp, R, LPC_SHB_ORDER_WB, ervec_temp ); + a2lsp( lsp_wb_temp, lpc_wb_temp, LPC_SHB_ORDER_WB ); + lsp_spacing = 0.5f; + + for ( i = 0; i < LPC_SHB_ORDER_WB; i++ ) + { + lsp_spacing = min( lsp_spacing, (float) ( i == 0 ? lsp_wb_temp[0] : ( lsp_wb_temp[i] - lsp_wb_temp[i - 1] ) ) ); + } + + /* Spectral smoothing of autocorrelation coefficients */ + for ( i = 0; i <= LPC_SHB_ORDER_WB; i++ ) + { + R[i] = R[i] * wac[i]; + } + R[0] = max( R[0], 1.0e-8f ); + + if ( st->rf_mode == 1 || st->extl_brate == WB_TBE_0k35 ) + { + lev_dur( lpc_wb, R, LPC_SHB_ORDER_LBR_WB, ervec ); + + /* Expand bandwidth of the LP coeffs */ + for ( i = 0; i <= LPC_SHB_ORDER_LBR_WB; i++ ) + { + lpc_wb[i] *= lpc_weights[i]; + } + + /* convert into lsps and calculate weights */ + a2lsp( lsp_wb, lpc_wb, LPC_SHB_ORDER_LBR_WB ); + lsp_weights( lsp_wb, weights_lsp, LPC_SHB_ORDER_LBR_WB ); + + /* Quantization of LSFs */ + i = closest_centroid( lsp_wb, weights_lsp, lbr_wb_bwe_lsfvq_cbook_2bit, 4, LPC_SHB_ORDER_LBR_WB ); + if ( st->codec_mode == MODE2 ) + { + hBWE_TD->lsf_WB = i; + } + else + { + push_indice( hBstr, IND_SHB_LSF, i, NUM_BITS_LBR_WB_LSF ); + } + + mvr2r( lbr_wb_bwe_lsfvq_cbook_2bit + i * LPC_SHB_ORDER_LBR_WB, lsp_wb, LPC_SHB_ORDER_LBR_WB ); + + lsp2a( lpc_wb, lsp_wb, LPC_SHB_ORDER_LBR_WB ); + set_f( lpc_wb + LPC_SHB_ORDER_LBR_WB + 1, 0.0f, ( LPC_SHB_ORDER_WB - LPC_SHB_ORDER_LBR_WB ) ); + } + else + { + lev_dur( lpc_wb, R, LPC_SHB_ORDER_WB, ervec ); + + /* Expand bandwidth of the LP coeffs */ + for ( i = 0; i <= LPC_SHB_ORDER_WB; i++ ) + { + lpc_wb[i] *= lpc_weights[i]; + } + + /* convert into lsps and calculate weights */ + a2lsp( lsp_wb, lpc_wb, LPC_SHB_ORDER_WB ); + lsp_weights( lsp_wb, weights_lsp, LPC_SHB_ORDER_WB ); + + /* Quantization of LSFs */ + i = closest_centroid( lsp_wb, weights_lsp, wb_bwe_lsfvq_cbook_8bit, 256, LPC_SHB_ORDER_WB ); + push_indice( hBstr, IND_SHB_LSF, i, NUM_BITS_WB_LSF ); + + mvr2r( wb_bwe_lsfvq_cbook_8bit + i * LPC_SHB_ORDER_WB, lsp_wb, LPC_SHB_ORDER_WB ); + + lsp2a( lpc_wb, lsp_wb, LPC_SHB_ORDER_WB ); + } + + uv_flag = 0; + if ( st->extl_brate == WB_TBE_1k05 && st->coder_type_raw == UNVOICED ) + { + uv_flag = 1; + } + + mvr2r( voice_factors, vf_modified, NB_SUBFR16k ); + if ( st->coder_type == VOICED ) + { + for ( i = 1; i < NB_SUBFR; i++ ) + { + vf_modified[i] = 0.8f * voice_factors[i] + 0.2f * voice_factors[i - 1]; + } + + if ( st->L_frame != L_FRAME ) + { + vf_modified[4] = 0.8f * voice_factors[4] + 0.2f * voice_factors[3]; + } + } + + /* From low band excitation, generate highband excitation */ + mvr2r( hBWE_TD->state_syn_shbexc, shaped_wb_excitation, L_SHB_LAHEAD / 4 ); + GenShapedWBExcitation( shaped_wb_excitation + L_SHB_LAHEAD / 4, lpc_wb, exc4kWhtnd, hBWE_TD->mem_csfilt, hBWE_TD->mem_genSHBexc_filt_down_shb, hBWE_TD->mem_genSHBexc_filt_down_wb2, hBWE_TD->mem_genSHBexc_filt_down_wb3, hBWE_TD->state_lpc_syn, st->coder_type, bwe_exc_extended, hBWE_TD->bwe_seed, vf_modified, uv_flag, st->igf ); + + prev_pow = sum2_f( shaped_wb_excitation, L_SHB_LAHEAD / 4 ); + curr_pow = sum2_f( shaped_wb_excitation + L_SHB_LAHEAD / 4, L_SHB_LAHEAD / 4 ); + + if ( voice_factors[0] > 0.75f ) + { + curr_pow = (float) ( curr_pow * 0.25 ); + } + + if ( prev_pow == 0 ) + { + scale = 0; + } + else + { + scale = (float) sqrt( curr_pow / prev_pow ); + } + + for ( i = 0; i < ( L_SHB_LAHEAD / 4 - 1 ); i++ ) + { + shaped_wb_excitation[i] *= scale; + } + + scale = (float) sqrt( scale ); + + shaped_wb_excitation[L_SHB_LAHEAD / 4 - 1] *= scale; + + /* Update WB excitation */ + mvr2r( shaped_wb_excitation + L_FRAME16k / 4, hBWE_TD->state_syn_shbexc, L_SHB_LAHEAD / 4 ); + + /* estimate the gain shape parameter */ + EstimateSHBGainShape( SHB_OVERLAP_LEN / 2, hb_frame, shaped_wb_excitation, GainShape, subwin_wb ); + + /* Gain frame adjustment factor */ + temp_wb_fac = (float) log( ( GainShape[0] + 0.00001f ) / ( hBWE_TD->prev_wb_GainShape + 0.0001f ) ); + feedback = temp_wb_fac * temp_wb_fac; + for ( i = 1; i < NUM_SHB_SUBFR / 4; i++ ) + { + temp_wb_fac = (float) log( ( GainShape[i] + 0.00001f ) / ( GainShape[i - 1] + 0.0001f ) ); + feedback += ( temp_wb_fac * temp_wb_fac ); + } + feedback = 0.4f / ( 1 + 0.5f * feedback ); + + temp_wb_fac = hBWE_TD->prev_wb_GainShape; + for ( i = 0; i < NUM_SHB_SUBFR / 4; i++ ) + { + GainShape[i] = ( 1 - feedback ) * GainShape[i] + feedback * temp_wb_fac; + temp_wb_fac = GainShape[i]; + } + hBWE_TD->prev_wb_GainShape = GainShape[NUM_SHB_SUBFR / 4 - 1]; + + /* Compute the power of gains away from the peak gain prior to quantization */ + if ( st->element_mode > EVS_MONO ) + { + p2m_in = pow_off_pk_corrected( GainShape, NUM_SHB_SUBFR / 4, 1 ); + } + else + { + p2m_in = pow_off_pk( GainShape, NUM_SHB_SUBFR / 4, 1 ); + } + + if ( st->extl_brate == WB_TBE_0k35 ) + { + for ( i = 0; i < 8; i++ ) + { + GainShape[i] = RECIP_ROOT_EIGHT; + } + } + else + { + push_indice( hBstr, IND_UV_FLAG, uv_flag, 1 ); + + /* Quantization of the subframe gain parameter */ + QuantizeSHBsubgains( st, GainShape, st->extl ); + } + + /* Compute the power of gains away from the peak gain after quantization */ + if ( st->element_mode > EVS_MONO ) + { + p2m_out = pow_off_pk_corrected( GainShape, NUM_SHB_SUBFR / 2, 2 ); + } + else + { + p2m_out = pow_off_pk( GainShape, NUM_SHB_SUBFR / 2, 2 ); + } + + /* Estimate the gain parameter */ + EstimateSHBFrameGain( SHB_OVERLAP_LEN / 2, hb_frame, shaped_wb_excitation, GainShape, &GainFrame, window_wb, subwin_wb ); + + /* If there's a big difference in the power of gains away from the peak gain */ + /* due to poor quantization then suppress energy of the high band. */ + if ( p2m_out > 2.0f * p2m_in ) + { + float temp = 0; + if ( p2m_in >= 0 && p2m_out > 0 ) + { + temp = (float) sqrt( ( 2.0f * p2m_in ) / p2m_out ); + } + GainFrame *= temp; + } + + pitBufAvg = 0.0025f * sum_f( pitch_buf, NB_SUBFR ); + voicingBufAvg = 0.333f * sum_f( st->voicing, 3 ); + if ( voicingBufAvg <= 0.0f && ( pitBufAvg != 0 ) ) + { + voicingBufAvg = pitBufAvg / 1.001f; + } + else if ( voicingBufAvg <= 0.0f ) + { + voicingBufAvg = 1.0f; + } + + GainFrame *= max( min( (float) ( pitBufAvg / voicingBufAvg ), 1.0f ), 0.7f ); + + if ( lsp_spacing < 0.01f ) + { + GainFrame *= 0.65f; + } + + /* Quantization of the frame gain parameter */ + if ( st->igf && st->coder_type == VOICED ) + { + GainFrame *= 0.5f; + } + else if ( st->igf && ( 0.25f * sum_f( voice_factors, NB_SUBFR ) > 0.35f ) ) + { + GainFrame *= 0.75f; + } + + if ( st->rf_mode ) + { + QuantizeSHBframegain( st, &GainFrame, st->extl, st->extl_brate, &st->hRF->RF_bwe_gainFr_ind, 0 ); + } + else + { + QuantizeSHBframegain( st, &GainFrame, st->extl, st->extl_brate, NULL, 0 ); + } + + /* Adjust the subframe and frame gain of the synthesized SHB signal */ + /* Scale the shaped excitation*/ + ScaleShapedSHB( SHB_OVERLAP_LEN / 2, shaped_wb_excitation, hBWE_TD->syn_overlap, GainShape, GainFrame, window_wb, subwin_wb ); + + return; +} + + +/*-------------------------------------------------------------------* + * swb_tbe_enc() + * + * SWB TBE encoder, 6 - 14 kHz (or 7.5 - 15.5 kHz) band encoding module + *-------------------------------------------------------------------*/ + +void swb_tbe_enc( + Encoder_State *st, /* i/o: encoder state structure */ + STEREO_ICBWE_ENC_HANDLE hStereoICBWE, /* i/o: IC-BWE state structure */ + const float *shb_speech, /* i : SHB target signal (6-14kHz) at 16kHz */ + const float *bwe_exc_extended, /* i : bandwidth extended exciatation */ + const float voice_factors[], /* i : voicing factors */ + float *White_exc16k, /* o : shaped white excitation for the FB TBE */ + const float pitch_buf[] /* i : pitch for each subframe */ +) +{ + int16_t i, j, delay; + TD_BWE_ENC_HANDLE hBWE_TD; + BSTR_ENC_HANDLE hBstr; + float shb_old_speech[L_LOOK_16k + L_SUBFR16k + L_FRAME16k]; + float shaped_shb_excitation[L_FRAME16k + L_SHB_LAHEAD]; + float GainFrame, GainShape[NUM_SHB_SUBFR]; + float lpc_shb[LPC_SHB_ORDER + 1]; + float lsf_q[LPC_SHB_ORDER]; + float weights_lsp[LPC_SHB_ORDER]; + float *shb_frame, *shb_new_speech; + float lsf_shb_orig[LPC_SHB_ORDER]; + float lsp_shb_1[LPC_SHB_ORDER], lsp_shb_2[LPC_SHB_ORDER], lsp_temp[LPC_SHB_ORDER]; + float lpc_shb_sf[4 * ( LPC_SHB_ORDER + 1 )]; + const float *ptr_lsp_interp_coef; + int16_t tmp; + float shb_ener_sf; + float lsf_shb[LPC_SHB_ORDER]; + float shb_res[L_FRAME16k]; + float shb_res_gshape[NB_SUBFR16k], normFac; + int16_t vf_ind; + float sd_uq_q, vf_modified[NB_SUBFR16k]; + float pitBufAvg, voicingBufAvg; + float R[LPC_SHB_ORDER + 2], ervec[LPC_SHB_ORDER + 1]; + int16_t ana_align_delay; + float prev_pow, curr_pow, scale; + float p2m_in, p2m_out; + int16_t frGainAttenuate, frGainSmoothEn; + float MA_lsp_shb_spacing; + float temp_swb_fac, feedback; + float shaped_shb_excitationTemp[L_FRAME16k]; + float lsf_diff[LPC_SHB_ORDER], w[LPC_SHB_ORDER]; + float refl[M]; + float tilt_para; + float formant_fac; + float temp; + int16_t stab_check = 1; + int16_t MSFlag; + float *nlExc16k, *mixExc16k; + int16_t k; + float pow0, fact_atten, alpha; + float acorr_EnvSHBres[ENVSHBRES_ACORR_MAX - ENVSHBRES_ACORR_MIN], *p_acorr, acorr_v2a, shb_env_tilt, Env_error; + float buf_EnvSHBres[2 * L_FRAME4k], *p_buf, EnvSHBres[L_FRAME16k], EnvSHBres_4k[L_FRAME4k], EnvSHBres_4k_norm[L_FRAME4k], env_mean_normf[L_FRAME4k]; + float GainShape_Interp[NUM_SHB_SUBGAINS], GainShape_tilt; + float seg_mean[4], den_seg_mean[4], *p_env, step; + int16_t seg_len, seg_len_2; + float den_seg_len, den_seg_len_2; + float sum_gain, normFact; + float Env_error_part[NUM_SHB_SUBGAINS]; + + Env_error = 0.0f; + pitBufAvg = 0.0f; + voicingBufAvg = 0.0f; + set_zero( Env_error_part, NUM_SHB_SUBGAINS ); + shb_env_tilt = 0.0f; + + hBWE_TD = st->hBWE_TD; + hBstr = st->hBstr; + + if ( st->element_mode >= IVAS_CPE_DFT && hStereoICBWE != NULL ) + { + nlExc16k = hStereoICBWE->nlExc16k; + mixExc16k = hStereoICBWE->mixExc16k; + MSFlag = hStereoICBWE->MSFlag; + } + else + { + nlExc16k = NULL; + mixExc16k = NULL; + MSFlag = 0; + } + + /* initializations */ + set_f( shaped_shb_excitationTemp, 0.0f, L_FRAME16k ); + + if ( st->element_mode == IVAS_CPE_TD && ( st->extl_brate == SWB_TBE_1k10 || st->extl_brate == SWB_TBE_1k75 ) ) + { + ana_align_delay = -L_SHB_LAHEAD - ( NL_BUFF_OFFSET / 2 ) + 20; /* 20 corresponds to the 1.25 ms CLDFB delay */ + } + else + { + ana_align_delay = -L_SHB_LAHEAD - ( NL_BUFF_OFFSET / 2 ); + } + + /* compensate for the delay in target generation and subframe LA */ + shb_frame = shb_old_speech + L_SUBFR16k + ana_align_delay; + + set_f( shb_old_speech, 0, L_LOOK_16k + L_SUBFR16k + L_FRAME16k ); + + /* set up the speech buffers for TBE processing */ + delay = L_LOOK_16k + L_SUBFR16k; + if ( st->element_mode == IVAS_CPE_TD ) + { + shb_new_speech = shb_old_speech + delay - L_MEM_RECALC_TBE_16K; + } + else + { + shb_new_speech = shb_old_speech + delay; + } + + mvr2r( hBWE_TD->old_speech_shb, shb_old_speech, delay ); + mvr2r( shb_speech, shb_new_speech, L_FRAME16k ); + mvr2r( shb_old_speech + L_FRAME16k, hBWE_TD->old_speech_shb, delay ); + + autocorr( shb_old_speech, R, LPC_SHB_ORDER + 1, NS2SA( INT_FS_16k, ACELP_LOOK_NS ) + L_SUBFR16k + L_FRAME16k, win_lpc_shb, 0, 1, 1 ); + + /* Spectral smoothing of autocorrelation coefficients */ + if ( st->rf_mode || st->extl_brate == SWB_TBE_0k95 || st->extl_brate == SWB_TBE_1k10 ) + { + for ( i = 0; i <= LPC_SHB_ORDER; i++ ) + { + R[i] = R[i] * wac_swb[i]; + } + } + + /* Set the autocorr[0] element to a non-negative value */ + R[0] = max( R[0], 1.0e-8f ); + + lev_dur( lpc_shb, R, LPC_SHB_ORDER, ervec ); + { + float enerG, lpc_shb1[M + 1]; + + /* extend the lpc_shb to a 16th order gain calc */ + set_f( lpc_shb1, 0, M + 1 ); + mvr2r( lpc_shb, lpc_shb1, LPC_SHB_ORDER + 1 ); + + /* estimate the LP gain */ + enerG = enr_1_Az( lpc_shb1, 2 * L_SUBFR ); + + /* if the LP gain is greater than a threshold, avoid saturation. + The function 'is_numeric_float' used to check for infinity enerG */ + if ( enerG > 32 || !( is_numeric_float( enerG ) ) ) + { + set_f( lpc_shb, 0, LPC_SHB_ORDER + 1 ); + lev_dur( lpc_shb, R, 2, ervec ); + } + } + + /* Expand bandwidth of the LP coeffs */ + if ( st->rf_mode || st->extl_brate == SWB_TBE_0k95 || st->extl_brate == SWB_TBE_1k10 ) + { + for ( i = 0; i <= LPC_SHB_ORDER; i++ ) + { + lpc_shb[i] *= lpc_weights[i]; + } + } + + /* convert to LSFs */ + stab_check = a2lsp( lsf_shb, lpc_shb, LPC_SHB_ORDER ); + + if ( ( st->last_extl != SWB_TBE && st->last_extl != FB_TBE ) || st->ini_frame == 0 ) + { + for ( i = 0; i < LPC_SHB_ORDER; i++ ) + { + hBWE_TD->prev_lsp_shb[i] = i / 20.0f; + } + } + + if ( stab_check == 0 ) + { + mvr2r( hBWE_TD->prev_lsp_shb, lsf_shb, LPC_SHB_ORDER ); + } + + mvr2r( lsf_shb, hBWE_TD->prev_lsp_shb, LPC_SHB_ORDER ); + + mvr2r( lsf_shb, lsf_shb_orig, LPC_SHB_ORDER ); + + gainFrSmooth_En( hBWE_TD, st->last_extl, shb_frame, lpc_shb, lsf_shb, &MA_lsp_shb_spacing, &frGainAttenuate, &frGainSmoothEn ); + + if ( st->rf_mode || st->extl_brate == SWB_TBE_0k95 || st->extl_brate == SWB_TBE_1k10 ) + { + lsp_weights( lsf_shb, weights_lsp, LPC_SHB_ORDER ); + + /* to compensate for the 1.1* weighting done inside the function lsp_weights */ + weights_lsp[3] *= 0.909091f; + weights_lsp[4] *= 0.909091f; + + /* 8-bit VQ, 10 dimension */ + i = closest_centroid( lsf_shb, weights_lsp, swb_tbe_lsfvq_cbook_8b, 256, LPC_SHB_ORDER ); + mvr2r( swb_tbe_lsfvq_cbook_8b + i * LPC_SHB_ORDER, lsf_shb, LPC_SHB_ORDER ); + + set_s( hBWE_TD->lsf_idx, 0, NUM_Q_LSF ); + + if ( st->codec_mode == MODE1 ) + { + push_indice( hBstr, IND_SHB_LSF, i, 8 ); + } + else + { + hBWE_TD->lsf_idx[0] = i; + } + + mvr2r( swb_tbe_lsfvq_cbook_8b + i * LPC_SHB_ORDER, lsf_shb, LPC_SHB_ORDER ); + } + else + { + /* Quantization of LSFs */ + Quant_BWE_LSF( hBstr, st->hBWE_TD, st->codec_mode, lsf_shb, lsf_q, st->extl_brate ); + + mvr2r( lsf_q, lsf_shb, LPC_SHB_ORDER ); + } + + space_lsfs( lsf_shb, LPC_SHB_ORDER ); + + /* voice factor adjustment and gainframe attenuation factor */ + sd_uq_q = 0; + for ( i = 0; i < LPC_SHB_ORDER; i++ ) + { + /* Estimate the QD in lsps between UQ and Q*/ + sd_uq_q += ( lsf_shb[i] - lsf_shb_orig[i] ) * ( lsf_shb[i] - lsf_shb_orig[i] ); + } + + mvr2r( voice_factors, vf_modified, NB_SUBFR16k ); + + if ( st->coder_type == VOICED || mean( voice_factors, 4 ) > 0.4f ) + { + for ( i = 1; i < NB_SUBFR; i++ ) + { + vf_modified[i] = 0.8f * voice_factors[i] + 0.2f * voice_factors[i - 1]; + } + + if ( st->L_frame != L_FRAME ) + { + vf_modified[4] = 0.8f * voice_factors[4] + 0.2f * voice_factors[3]; + } + } + + /* SHB LSF from current frame; and convert to LSP for interpolation */ + lsf2lsp( lsf_shb, lsp_shb_2, LPC_SHB_ORDER, 1 ); + + if ( st->last_extl == SWB_TBE || st->last_extl == FB_TBE ) + { + /* SHB LSP values from prev. frame for interpolation */ + mvr2r( hBWE_TD->swb_lsp_prev_interp, lsp_shb_1, LPC_SHB_ORDER ); + } + else + { + /* Use current frame's LSPs; in effect no interpolation */ + mvr2r( lsp_shb_2, lsp_shb_1, LPC_SHB_ORDER ); + } + + lsf_diff[0] = lsf_diff[LPC_SHB_ORDER - 1] = 0.5f; + for ( i = 1; i < ( LPC_SHB_ORDER - 1 ); i++ ) + { + lsf_diff[i] = lsf_shb[i] - lsf_shb[i - 1]; + } + a2rc( hBWE_TD->cur_sub_Aq + 1, refl, M ); + + /* LSP interpolation for 13.2 kbps and 16.4 kbps */ + tilt_para = 6.6956f * ( 1.0f + refl[0] ) * ( 1.0f + refl[0] ) - 3.8714f * ( 1.0f + refl[0] ) + 1.3041f; + if ( st->last_extl != SWB_TBE ) + { + for ( i = 1; i < LPC_SHB_ORDER - 1; i++ ) + { + hBWE_TD->prev_lsf_diff[i - 1] = 0.5f * lsf_diff[i]; + } + } + + if ( st->extl_brate <= FB_TBE_1k8 ) + { + if ( !( hBWE_TD->prev_tilt_para > 5.0f && ( st->coder_type == TRANSITION || tilt_para < 1.0f ) ) && !( ( hBWE_TD->prev_tilt_para < 3.0f && hBWE_TD->prev_coder_type >= VOICED ) && tilt_para > 5.0f ) ) + { + for ( i = 1; i < ( LPC_SHB_ORDER - 1 ); i++ ) + { + w[i] = ( lsf_diff[i] < hBWE_TD->prev_lsf_diff[i - 1] ) ? min( max( 0.8f * lsf_diff[i] / hBWE_TD->prev_lsf_diff[i - 1], 0.5f ), 1.0f ) : min( max( 0.8f * hBWE_TD->prev_lsf_diff[i - 1] / lsf_diff[i], 0.5f ), 1.0f ); + } + w[0] = w[1]; + w[LPC_SHB_ORDER - 1] = w[LPC_SHB_ORDER - 2]; + + for ( i = 0; i < LPC_SHB_ORDER; i++ ) + { + lsp_temp[i] = lsp_shb_1[i] * ( 1.0f - w[i] ) + lsp_shb_2[i] * w[i]; + } + } + else + { + mvr2r( lsp_shb_2, lsp_temp, LPC_SHB_ORDER ); + } + } + + mvr2r( lsf_diff + 1, hBWE_TD->prev_lsf_diff, LPC_SHB_ORDER - 2 ); + hBWE_TD->prev_tilt_para = tilt_para; + + if ( st->extl_brate >= SWB_TBE_2k8 ) + { + /* SHB LSP interpolation */ + ptr_lsp_interp_coef = interpol_frac_shb; + for ( j = 0; j < 4; j++ ) + { + for ( i = 0; i < LPC_SHB_ORDER; i++ ) + { + lsp_temp[i] = lsp_shb_1[i] * ( *ptr_lsp_interp_coef ) + lsp_shb_2[i] * ( *( ptr_lsp_interp_coef + 1 ) ); + } + ptr_lsp_interp_coef += 2; + + tmp = j * ( LPC_SHB_ORDER + 1 ); + /* convert from lsp to lsf */ + lsp2lsf( lsp_temp, lpc_shb_sf + tmp, LPC_SHB_ORDER, 1 ); + /* convert lsf to lpc for SHB synthesis */ + lsp2a( lpc_shb_sf + tmp, lpc_shb_sf + tmp, LPC_SHB_ORDER ); + lpc_shb_sf[j * ( LPC_SHB_ORDER + 1 )] = 1.0f; + } + + /* -------- Calculate the SHB Energy -------- */ + shb_ener_sf = 0.003125f * sum2_f( shb_frame + L_SHB_LAHEAD, L_FRAME16k ); + Quant_shb_ener_sf( st, &shb_ener_sf ); + + /* -------- calculate the residuals using the FOUR subframe LPCs -------- */ + set_f( shb_res, 0, L_FRAME16k ); + residu( lpc_shb_sf, LPC_SHB_ORDER, shb_frame + L_SHB_LAHEAD, shb_res, 80 ); + residu( lpc_shb_sf + ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, shb_frame + L_SHB_LAHEAD + 80, shb_res + 80, 80 ); + residu( lpc_shb_sf + 2 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, shb_frame + L_SHB_LAHEAD + 160, shb_res + 160, 80 ); + residu( lpc_shb_sf + 3 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, shb_frame + L_SHB_LAHEAD + 240, shb_res + 240, 80 ); + + set_f( shb_res_gshape, 0, NB_SUBFR16k ); + for ( i = 0; i < NB_SUBFR16k; i++ ) + { + shb_res_gshape[i] = sum2_f( shb_res + i * 64, 64 ); + } + + maximum( shb_res_gshape, NB_SUBFR16k, &normFac ); + normFac = (float) 1.0f / ( 0.0001f + normFac ); + for ( i = 0; i < NB_SUBFR16k; i++ ) + { + shb_res_gshape[i] = (float) sqrt( shb_res_gshape[i] * normFac ); + } + + Quant_shb_res_gshape( st, shb_res_gshape ); + } + else if ( st->extl_brate == SWB_TBE_1k10 || st->extl_brate == SWB_TBE_1k75 ) + { + for ( j = 0; j < 4; j++ ) + { + tmp = j * ( LPC_SHB_ORDER + 1 ); + + /* convert from lsp to lsf */ + lsp2lsf( lsp_temp, lpc_shb_sf + tmp, LPC_SHB_ORDER, 1 ); + + /* convert lsf to lpc for SHB synthesis */ + lsp2a( lpc_shb_sf + tmp, lpc_shb_sf + tmp, LPC_SHB_ORDER ); + lpc_shb_sf[j * ( LPC_SHB_ORDER + 1 )] = 1.0f; + } + + /* -------- calculate the residuals using the FOUR subframe LPCs -------- */ + set_f( shb_res, 0, L_FRAME16k ); + residu( lpc_shb_sf, LPC_SHB_ORDER, shb_frame + L_SHB_LAHEAD, shb_res, 80 ); + residu( lpc_shb_sf + ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, shb_frame + L_SHB_LAHEAD + 80, shb_res + 80, 80 ); + residu( lpc_shb_sf + 2 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, shb_frame + L_SHB_LAHEAD + 160, shb_res + 160, 80 ); + residu( lpc_shb_sf + 3 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, shb_frame + L_SHB_LAHEAD + 240, shb_res + 240, 80 ); + } + + /* Save the SWB LSP values from current frame for interpolation */ + mvr2r( lsp_shb_2, hBWE_TD->swb_lsp_prev_interp, LPC_SHB_ORDER ); + + /* convert from lsp to lsf */ + lsp2lsf( lsp_temp, lpc_shb, LPC_SHB_ORDER, 1 ); + + /* convert lsf to lpc for SHB synthesis */ + lsp2a( lpc_shb, lpc_shb, LPC_SHB_ORDER ); + lpc_shb[0] = 1.0f; + + mvr2r( hBWE_TD->state_syn_shbexc, shaped_shb_excitation, L_SHB_LAHEAD ); + + /* Determine formant PF strength */ + formant_fac = swb_formant_fac( lpc_shb[1], &hBWE_TD->tilt_mem ); + + /* calculate SHB auto-correlation function and convert to SHB voicing factor */ + acorr_v2a = 0.0f; + if ( st->extl_brate == SWB_TBE_1k10 || st->extl_brate == SWB_TBE_1k75 ) + { + /* calculate the TD envelope of the SHB residual signal */ + find_td_envelope( shb_res, L_FRAME16k, 20, hBWE_TD->mem_shb_res, EnvSHBres ); + + /* downsample the TD envelope by 4 */ + for ( k = 0; k < L_FRAME4k; k++ ) + { + EnvSHBres_4k[k] = EnvSHBres[4 * k]; + } + + /* calculate long-term mean envelope over four consecutive segments using linear interpolation */ + seg_len = L_FRAME4k / 4; + den_seg_len = 1.0f / seg_len; + seg_len_2 = L_FRAME4k / 8; + den_seg_len_2 = 1.0f / ( seg_len_2 - 1 ); + for ( k = 0; k < 4; k++ ) + { + seg_mean[k] = max( 1.0f, mean( &EnvSHBres_4k[k * seg_len], seg_len ) ); + den_seg_mean[k] = 1.0f / seg_mean[k]; + } + + /* first half of the first segment */ + if ( hBWE_TD->old_mean_EnvSHBres == 0 ) + { + set_f( env_mean_normf, den_seg_mean[0], seg_len_2 ); + } + else + { + env_mean_normf[0] = hBWE_TD->old_mean_EnvSHBres; + step = ( den_seg_mean[0] - hBWE_TD->old_mean_EnvSHBres ) * den_seg_len_2; + for ( i = 1; i < seg_len_2; i++ ) + { + env_mean_normf[i] = env_mean_normf[i - 1] + step; + } + } + + /* segments 1-4 */ + p_env = &env_mean_normf[seg_len_2]; + for ( k = 1; k < 4; k++ ) + { + step = ( den_seg_mean[k] - den_seg_mean[k - 1] ) * den_seg_len; + for ( i = 0; i < seg_len; i++ ) + { + *p_env = *( p_env - 1 ) + step; + p_env++; + } + } + + /* last half of the last segment */ + set_f( p_env, den_seg_mean[3], seg_len_2 ); + hBWE_TD->old_mean_EnvSHBres = den_seg_mean[3]; + + /* normalize residual SHB envelope with its long-term mean envelope */ + for ( k = 0; k < L_FRAME4k; k++ ) + { + EnvSHBres_4k_norm[k] = EnvSHBres_4k[k] * env_mean_normf[k]; + } + + /* calculate tilt of the long-term mean envelope */ + lls_interp_n( seg_mean, 4, &shb_env_tilt, &temp, 0 ); + + /* copy previous residual envelope to the buffer */ + mvr2r( hBWE_TD->old_EnvSHBres, buf_EnvSHBres, L_FRAME4k ); + + /* subtract mean value from the normalized SHB residual envelope */ + p_buf = &buf_EnvSHBres[L_FRAME4k]; + temp = mean( EnvSHBres_4k_norm, L_FRAME4k ); + for ( k = 0; k < L_FRAME4k; k++ ) + { + *p_buf++ = EnvSHBres_4k_norm[k] - temp; + } + + /* update memory */ + mvr2r( &buf_EnvSHBres[L_FRAME4k], hBWE_TD->old_EnvSHBres, L_FRAME4k ); + + /* calculate energy normalization factor for the auto-correlation function */ + pow0 = sum2_f( &buf_EnvSHBres[L_FRAME4k], L_FRAME4k ) + 1.0f; + if ( hBWE_TD->prev_enr_EnvSHBres == 1.0f ) + { + scale = 1.0f / pow0; + } + else + { + scale = 1.0f / max( pow0, hBWE_TD->prev_enr_EnvSHBres ); + } + hBWE_TD->prev_enr_EnvSHBres = pow0; + + /* calculate normalized auto-correlation function on the residual normalized SHB envelope */ + p_acorr = acorr_EnvSHBres; + p_buf = &buf_EnvSHBres[L_FRAME4k - ENVSHBRES_ACORR_MIN]; + for ( k = 0; k < ENVSHBRES_ACORR_MAX - ENVSHBRES_ACORR_MIN; k++ ) + { + *p_acorr++ = scale * dotp( &buf_EnvSHBres[L_FRAME4k], p_buf--, L_FRAME4k ); + } + + /* calculate variance of the SHB autocorrelation function */ + acorr_v2a = sum2_f( acorr_EnvSHBres, ENVSHBRES_ACORR_MAX - ENVSHBRES_ACORR_MIN ) / ( ENVSHBRES_ACORR_MAX - ENVSHBRES_ACORR_MIN ); + + /* multiply with the maximum of the SHB autocorrelation function */ + maximum( acorr_EnvSHBres, ENVSHBRES_ACORR_MAX - ENVSHBRES_ACORR_MIN, &temp ); + acorr_v2a *= temp; + + alpha = 25.0f; + acorr_v2a = 2.0f / ( 1.0f + (float) expf( -alpha * acorr_v2a ) ) - 1.0f; + + /* limit in the range 0.0 - 1.0 */ + acorr_v2a = min( 1.0f, max( 0.0f, acorr_v2a ) ); + + hBWE_TD->prev_shb_env_tilt = shb_env_tilt; + } + + vf_ind = 20; + GenShapedSHBExcitation( shaped_shb_excitation + L_SHB_LAHEAD, lpc_shb, White_exc16k, hBWE_TD->mem_csfilt, hBWE_TD->mem_genSHBexc_filt_down_shb, hBWE_TD->state_lpc_syn, st->coder_type, bwe_exc_extended, hBWE_TD->bwe_seed, vf_modified, st->extl, &( hBWE_TD->tbe_demph ), &( hBWE_TD->tbe_premph ), lpc_shb_sf, &shb_ener_sf, shb_res_gshape, shb_res, &vf_ind, formant_fac, hBWE_TD->fb_state_lpc_syn, &( hBWE_TD->fb_tbe_demph ), st->total_brate, 0, st->element_mode, st->flag_ACELP16k, nlExc16k, mixExc16k, st->extl_brate, MSFlag, + EnvSHBres_4k_norm, &( hBWE_TD->prev_pow_exc16kWhtnd ), &( hBWE_TD->prev_mix_factor ), &Env_error, Env_error_part ); + + /* fill-in missing SHB excitation */ + if ( ( st->element_mode == IVAS_CPE_TD || st->element_mode == IVAS_CPE_DFT ) && st->last_core_brate <= SID_2k40 ) + { + mvr2r( shaped_shb_excitation + L_SHB_LAHEAD, shaped_shb_excitation, L_SHB_LAHEAD ); + } + + if ( st->element_mode >= IVAS_CPE_DFT && hStereoICBWE != NULL ) + { + mvr2r( shaped_shb_excitation + L_SHB_LAHEAD, hStereoICBWE->shbSynthRef, L_FRAME16k ); + } + + if ( st->extl_brate >= SWB_TBE_2k8 || st->extl_brate == SWB_TBE_1k10 || st->extl_brate == SWB_TBE_1k75 ) + { + if ( st->codec_mode == MODE2 ) + { + hBWE_TD->idx_mixFac = vf_ind; + } + else + { + push_indice( hBstr, IND_SHB_VF, vf_ind, NUM_BITS_SHB_VF ); + } + } + + if ( st->extl_brate != SWB_TBE_1k10 && st->extl_brate != SWB_TBE_1k75 ) + { + for ( i = 0; i < L_FRAME16k; i += L_SUBFR16k ) + { + /* TD BWE post-processing */ + PostShortTerm( &shaped_shb_excitation[L_SHB_LAHEAD + i], lpc_shb, &shaped_shb_excitationTemp[i], hBWE_TD->mem_stp_swb, hBWE_TD->ptr_mem_stp_swb, &( hBWE_TD->gain_prec_swb ), hBWE_TD->mem_zero_swb, formant_fac ); + } + + mvr2r( shaped_shb_excitationTemp, &shaped_shb_excitation[L_SHB_LAHEAD], L_FRAME16k ); + + prev_pow = sum2_f( shaped_shb_excitation, L_SHB_LAHEAD + 10 ); + curr_pow = sum2_f( shaped_shb_excitation + L_SHB_LAHEAD + 10, L_SHB_LAHEAD + 10 ); + + if ( voice_factors[0] > 0.75f ) + { + curr_pow = (float) ( curr_pow * 0.25 ); + } + + if ( prev_pow == 0 ) + { + scale = 0; + } + else + { + scale = (float) sqrt( curr_pow / prev_pow ); + } + + for ( i = 0; i < L_SHB_LAHEAD; i++ ) + { + shaped_shb_excitation[i] *= scale; + } + + for ( ; i < L_SHB_LAHEAD + 10; i++ ) + { + temp = ( i - 19 ) / 10.0f; + shaped_shb_excitation[i] *= ( temp * 1.0f + ( 1.0f - temp ) * scale ); + } + } + else + { + /* reset the PF memories if the PF is not running */ + set_f( hBWE_TD->mem_stp_swb, 0, LPC_SHB_ORDER ); + hBWE_TD->gain_prec_swb = 1.0f; + set_f( hBWE_TD->mem_zero_swb, 0, LPC_SHB_ORDER ); + } + + /* Update SHB excitation */ + mvr2r( shaped_shb_excitation + L_FRAME16k, hBWE_TD->state_syn_shbexc, L_SHB_LAHEAD ); + + /* Estimate the gain-shape parameter */ + EstimateSHBGainShape( SHB_OVERLAP_LEN, shb_frame, shaped_shb_excitation, GainShape, subwin_shb ); + + if ( st->extl_brate == SWB_TBE_1k10 || st->extl_brate == SWB_TBE_1k75 ) + { + /* Gain shape attenuation in case of big error in envelope modelling */ + for ( i = 0; i < NUM_SHB_SUBGAINS; i++ ) + { + if ( Env_error_part[i] > 100.0f ) + { + /* set gain shape to the average of the remaining gains */ + GainShape[i] = ( sum_f( GainShape, NUM_SHB_SUBGAINS ) - GainShape[i] ) / ( NUM_SHB_SUBGAINS - 1 ); + } + } + } + + if ( st->extl_brate != SWB_TBE_1k10 && st->extl_brate != SWB_TBE_1k75 ) + { + /* Gain shape BWS/high band low energy fix */ + if ( hBWE_TD->cldfbHBLT < 1.0f ) + { + /* There is not much HB past 10kHz; the temporal resolution is quite coarse, so reduce the dynamic range */ + for ( i = 0; i < NUM_SHB_SUBGAINS; i++ ) + { + /* 0.35f +/- delta variation; delta = 0.1*(GS-0.35)*/ + GainShape[i] = 0.315f + 0.1f * GainShape[i]; + } + } + } + + /* high-band gain control in case of BWS */ + if ( st->extl_brate != SWB_TBE_1k10 && st->extl_brate != SWB_TBE_1k75 ) + { + if ( st->bwidth_sw_cnt > 0 ) + { + for ( i = 0; i < NUM_SHB_SUBGAINS; i++ ) + { + GainShape[i] *= ( (float) ( st->bwidth_sw_cnt ) / (float) BWS_TRAN_PERIOD ); + } + } + } + + /* Gain shape adjustment factor */ + temp_swb_fac = (float) log( ( GainShape[0] + 0.00001f ) / ( hBWE_TD->prev_swb_GainShape + 0.0001f ) ); + feedback = temp_swb_fac * temp_swb_fac; + for ( i = 1; i < NUM_SHB_SUBGAINS; i++ ) + { + temp_swb_fac = (float) log( ( GainShape[i] + 0.00001f ) / ( GainShape[i - 1] + 0.0001f ) ); + feedback += ( temp_swb_fac * temp_swb_fac ); + } + + feedback = 0.4f / ( 1 + 0.5f * feedback ); + + /* calculate tilt in all sub-frame gains */ + mvr2r( GainShape, GainShape_Interp, NUM_SHB_SUBGAINS ); + lls_interp_n( GainShape_Interp, NUM_SHB_SUBGAINS, &GainShape_tilt, &temp, 1 ); + + if ( st->extl_brate == SWB_TBE_1k10 || st->extl_brate == SWB_TBE_1k75 ) + { + if ( acorr_v2a < 0.4f && vf_ind >= 5 && fabs( GainShape_tilt ) < 0.2f && shb_env_tilt < 500.0f && hBWE_TD->prev_shb_env_tilt < 500.0f ) + { + /* stronger smoothing in case of unvoiced SHB residual signal with gaussian excitation */ + feedback = lin_interp( acorr_v2a, 0.4f, 0.0f, 0.0f, 0.95f, 0 ); + feedback = min( max( feedback, 0.0f ), 1.0f ); + + for ( i = 0; i < NUM_SHB_SUBGAINS; i++ ) + { + GainShape[i] = ( 1 - feedback ) * GainShape[i] + feedback * GainShape_Interp[i]; + } + } + } + else + { + if ( frGainAttenuate == 1 || ( sum_f( st->voicing, 3 ) > 2.4f && sum_f( voice_factors, 4 ) > 0.8f ) ) + { + temp_swb_fac = hBWE_TD->prev_swb_GainShape; + for ( i = 0; i < NUM_SHB_SUBGAINS; i++ ) + { + GainShape[i] = ( 1 - feedback ) * GainShape[i] + feedback * temp_swb_fac; + temp_swb_fac = GainShape[i]; + } + } + } + + if ( st->extl_brate == SWB_TBE_1k10 || st->extl_brate == SWB_TBE_1k75 ) + { + /* Re-normalize gain shape before quantization */ + sum_gain = sum2_f( GainShape, NUM_SHB_SUBGAINS ); + if ( sum_gain == 0 ) + { + normFact = 0; + } + else + { + normFact = (float) sqrt( 1.0f / sum_gain ); + } + + v_multc( GainShape, normFact, GainShape, NUM_SHB_SUBGAINS ); + } + + hBWE_TD->prev_swb_GainShape = GainShape[3]; + + /* Compute the power of gains away from the peak gain prior to quantization */ + if ( st->element_mode > EVS_MONO ) + { + p2m_in = pow_off_pk_corrected( GainShape, NUM_SHB_SUBGAINS, 1 ); + } + else + { + p2m_in = pow_off_pk( GainShape, NUM_SHB_SUBGAINS, 1 ); + } + + /* Quantization of the gain shape parameter */ + QuantizeSHBsubgains( st, GainShape, st->extl ); + + /* Compute the power of gains away from the peak gain after quantization */ + if ( st->element_mode > EVS_MONO ) + { + p2m_out = pow_off_pk_corrected( GainShape, NUM_SHB_SUBFR, 4 ); + } + else + { + p2m_out = pow_off_pk( GainShape, NUM_SHB_SUBFR, 4 ); + } + + /* Gain shape smoothing after quantization */ + if ( st->extl_brate == SWB_TBE_1k10 || st->extl_brate == SWB_TBE_1k75 ) + { + for ( i = 0; i < NUM_SHB_SUBGAINS; i++ ) + { + GainShape_Interp[i] = GainShape[i * NUM_SHB_SUBGAINS]; + } + + lls_interp_n( GainShape_Interp, NUM_SHB_SUBGAINS, &GainShape_tilt, &temp, 1 ); + + if ( vf_ind >= 6 && fabs( GainShape_tilt ) < 0.12f ) + { + feedback = 0.3f; + for ( i = 0; i < NUM_SHB_SUBGAINS; i++ ) + { + GainShape[i] = ( 1 - feedback ) * GainShape[i * NUM_SHB_SUBGAINS] + feedback * GainShape_Interp[i]; + } + + for ( i = NUM_SHB_SUBFR - 1; i > 0; i-- ) + { + GainShape[i] = GainShape[i * NUM_SHB_SUBGAINS / NUM_SHB_SUBFR]; + } + } + } + + /* Estimate the gain parameter */ + EstimateSHBFrameGain( SHB_OVERLAP_LEN, shb_frame, shaped_shb_excitation, GainShape, &GainFrame, window_shb, subwin_shb ); + + if ( st->tec_tfa == 1 ) + { + tfaCalcEnv( shb_frame, st->tfa_enr ); + } + + /* If there's a big difference in the power of gains away from the peak gain */ + /* due to poor quantization then suppress energy of the high band. */ + if ( p2m_out > 2.0f * p2m_in ) + { + temp = 0.f; + if ( p2m_in >= 0 && p2m_out > 0 ) + { + temp = (float) sqrt( ( 2.0f * p2m_in ) / p2m_out ); + } + GainFrame *= temp; + } + + if ( st->element_mode > EVS_MONO && st->L_frame != st->last_L_frame && hBWE_TD->prev_gainFr_SHB != 0 && ( st->last_extl == SWB_TBE || st->last_extl == FB_TBE ) && st->coder_type == TRANSITION && st->coder_type_raw != VOICED && st->clas == VOICED_CLAS && st->last_clas == VOICED_CLAS && ( 3.0f * voice_factors[0] < voice_factors[( st->L_frame >> 6 ) - 1] ) ) + { + float fac = GainFrame / hBWE_TD->prev_gainFr_SHB; + + if ( fac > 4.0f ) + { + GainFrame = 4.0f * GainFrame / fac; + } + } + + if ( st->extl_brate == SWB_TBE_1k10 || st->extl_brate == SWB_TBE_1k75 ) + { + if ( acorr_v2a > 0.1f && Env_error > 5.0f ) + { + /* attenuate frame gain in case of voiced SHB residual signal with gaussian excitation */ + fact_atten = lin_interp( Env_error, 5.0f, 1.0f, 25.0f, 0.2f, 1 ); + GainFrame *= fact_atten; + } + /* Frame gain attenuation in case of big error in envelope modelling */ + else if ( Env_error > 100.0f || hBWE_TD->prev_Env_error > 100.0f ) + { + if ( Env_error > 100.0f ) + { + fact_atten = lin_interp( Env_error, 100.0f, 1.0f, 300.0f, 0.1f, 1 ); + } + else + { + fact_atten = lin_interp( hBWE_TD->prev_Env_error, 100.0f, 1.0f, 300.0f, 0.5f, 1 ); + } + GainFrame *= fact_atten; + } + } + else + { + if ( frGainSmoothEn == 1 && hBWE_TD->prev_gainFr_SHB < GainFrame ) + { + GainFrame = 0.5f * ( hBWE_TD->prev_gainFr_SHB + GainFrame ); + } + } + + if ( frGainAttenuate == 1 && MA_lsp_shb_spacing <= 0.0024f ) + { + GainFrame = (float) pow( GainFrame, 0.8f ); + } + else if ( hBWE_TD->prev_frGainAtten == 1 && GainFrame > 3.0f * hBWE_TD->prev_gainFr_SHB ) + { + GainFrame *= ( 0.8f + 0.5f * feedback ); + } + hBWE_TD->prev_frGainAtten = frGainAttenuate; + + hBWE_TD->prev_gainFr_SHB = GainFrame; + + if ( GainFrame > 153.0f && st->element_mode >= IVAS_CPE_DFT && hStereoICBWE != NULL ) + { + hStereoICBWE->MSFlag = 1; + } + + /* Gain attenuation when the SWB LSF quantization error is larger than a threshold */ + sd_uq_q = ( sd_uq_q / 0.0025f ); + if ( st->extl_brate == SWB_TBE_1k10 || st->extl_brate == SWB_TBE_1k75 ) + { + sd_uq_q = 1 - 0.7f * ( sd_uq_q * sd_uq_q ); + } + else + { + if ( st->L_frame == L_FRAME ) + { + sd_uq_q = 1 - 0.2f * ( sd_uq_q * sd_uq_q ); + } + else + { + sd_uq_q = 1 - 0.1f * ( sd_uq_q * sd_uq_q ); + } + } + + sd_uq_q = max( min( sd_uq_q, 1.0f ), 0.5f ); + + if ( st->extl_brate != SWB_TBE_1k10 && st->extl_brate != SWB_TBE_1k75 ) + { + pitBufAvg = 0.0025f * sum_f( pitch_buf, 4 ); + voicingBufAvg = ( sum_f( voice_factors, 4 ) > 0.6f ) ? 0.333f : 0.1667f; + voicingBufAvg = voicingBufAvg * sum_f( st->voicing, 3 ); + + if ( voicingBufAvg <= 0.0f && sd_uq_q * pitBufAvg != 0 ) + { + voicingBufAvg = sd_uq_q * pitBufAvg / 1.001f; + } + else if ( voicingBufAvg <= 0.0f ) + { + voicingBufAvg = 1.0f; + } + } + + /* high-band gain control in case of BWS */ + if ( st->extl_brate != SWB_TBE_1k10 && st->extl_brate != SWB_TBE_1k75 ) + { + if ( st->bwidth_sw_cnt > 0 ) + { + GainFrame *= ( (float) ( st->bwidth_sw_cnt ) / (float) BWS_TRAN_PERIOD ); + } + } + + /* Controlled gain evolution in SWB for stronger voiced segments */ + if ( st->extl_brate == SWB_TBE_1k10 || st->extl_brate == SWB_TBE_1k75 ) + { + GainFrame *= sd_uq_q; + } + else + { + GainFrame *= max( min( (float) ( sd_uq_q * pitBufAvg / voicingBufAvg ), 1.0f ), 0.6f ); + } + + if ( st->extl_brate == SWB_TBE_1k10 || st->extl_brate == SWB_TBE_1k75 ) + { + if ( st->rf_mode == 1 ) + { + /* Compensate for energy increase mismatch due to memory-less synthesis */ + GainFrame *= 0.85f; + } + } + else + { + if ( st->L_frame == L_FRAME16k || st->rf_mode == 1 ) + { + /* Compensate for energy increase mismatch due to memory-less synthesis*/ + GainFrame *= 0.85f; + } + } + + /* Quantization of the frame gain parameter */ + if ( st->rf_mode ) + { + QuantizeSHBframegain( st, &GainFrame, st->extl, 0, &st->hRF->RF_bwe_gainFr_ind, 0 ); + } + else + { + QuantizeSHBframegain( st, &GainFrame, st->extl, 0, NULL, ( st->extl_brate == SWB_TBE_1k10 || st->extl_brate == SWB_TBE_1k75 ) ? 1 : 0 ); + } + + if ( hStereoICBWE != NULL ) + { + push_indice( hBstr, IND_STEREO_ICBWE_MSFLAG, hStereoICBWE->MSFlag, STEREO_ICBWE_MSFLAG_BITS ); + } + + /* Backup for the IC BWE parameters */ + if ( st->element_mode >= IVAS_CPE_DFT && hStereoICBWE != NULL ) + { + mvr2r( lpc_shb, hStereoICBWE->lpSHBRef, LPC_SHB_ORDER + 1 ); + } + + if ( st->extl == FB_TBE ) + { + for ( i = 0; i < L_FRAME16k; i++ ) + { + White_exc16k[i] *= GainFrame * GainShape[NUM_SHB_SUBFR * i / L_FRAME16k]; + } + } + + hBWE_TD->prev_Env_error = Env_error; + + return; +} + + +/*-------------------------------------------------------------------* + * EstimateSHBFrameGain() + * + * Estimate the overall gain factor needed to scale synthesized highband + * to original highband signal level. + *-------------------------------------------------------------------*/ + +static void EstimateSHBFrameGain( + const int16_t length, /* i : SHB overlap length */ + const float *oriSHB, /* i : target original SHB frame */ + const float *synSHB, /* i : shaped SHB excitation */ + float *subgain, /* o : estimate of gain shape */ + float *GainFrame, /* o : estimat of gain frame */ + const float *win_shb, /* i : SHB window */ + const float *subwin /* i : subframe window */ +) +{ + const int16_t *skip; + int16_t i, j, k, l_shb_lahead, l_frame; + int16_t join_length, num_join; + float sig, mod_syn[L_FRAME16k + L_SHB_LAHEAD]; + float oriNrg = 0.0f, synNrg = 0.0f, sum_gain; + float frame_gain; + + /* initilaization */ + l_frame = L_FRAME16k; + l_shb_lahead = L_SHB_LAHEAD; + skip = skip_bands_SWB_TBE; + + if ( length == SHB_OVERLAP_LEN / 2 ) + { + skip = skip_bands_WB_TBE; + l_frame = L_FRAME16k / 4; + l_shb_lahead = L_SHB_LAHEAD / 4; + } + + /* apply gain for each subframe, and store noise output signal using overlap-add*/ + set_f( mod_syn, 0, l_frame + l_shb_lahead ); + + if ( length == SHB_OVERLAP_LEN / 2 ) + { + sum_gain = 0; + for ( k = 0; k < length / 2; k++ ) + { + sum_gain = subwin[2 * k + 2] * subgain[0]; + mod_syn[skip[0] + k] = synSHB[skip[0] + k] * sum_gain; + mod_syn[skip[0] + k + length / 2] = synSHB[skip[0] + k + length / 2] * subgain[0]; + } + + for ( i = 1; i < NUM_SHB_SUBFR / 2; i++ ) + { + for ( k = 0; k < length; k++ ) + { + sum_gain = subwin[k + 1] * subgain[i] + subwin[length - k - 1] * subgain[i - 1]; + mod_syn[skip[i] + k] = synSHB[skip[i] + k] * sum_gain; + } + } + + for ( k = 0; k < length / 2; k++ ) + { + sum_gain = subwin[length - 2 * k - 2] * subgain[i - 1]; + mod_syn[skip[i] + k] = synSHB[skip[i] + k] * sum_gain; + } + } + else + { + num_join = NUM_SHB_SUBFR / NUM_SHB_SUBGAINS; + join_length = num_join * length; + for ( k = 0, j = 0; k < length; k++ ) + { + mod_syn[j] = synSHB[j] * subwin[k + 1] * subgain[0]; + j++; + } + for ( i = 0; i < NUM_SHB_SUBGAINS - 1; i++ ) + { + for ( k = 0; k < join_length - length; k++ ) + { + mod_syn[j] = synSHB[j] * subgain[i * num_join]; + j++; + } + + for ( k = 0; k < length; k++ ) + { + mod_syn[j] = synSHB[j] * ( subwin[length - k - 1] * subgain[i * num_join] + subwin[k + 1] * subgain[( i + 1 ) * num_join] ); + j++; + } + } + for ( k = 0; k < join_length - length; k++ ) + { + mod_syn[j] = synSHB[j] * subgain[( NUM_SHB_SUBGAINS - 1 ) * num_join]; + j++; + } + for ( k = 0; k < length; k++ ) + { + mod_syn[j] = synSHB[j] * subwin[length - k - 1] * subgain[( NUM_SHB_SUBGAINS - 1 ) * num_join]; + j++; + } + } + + /* adjust frame energy */ + oriNrg = (float) 1e-10; + synNrg = (float) 1e-10; + + for ( i = 0; i < l_shb_lahead; i++ ) + { + sig = oriSHB[i] * win_shb[i]; + oriNrg += sig * sig; + + sig = mod_syn[i] * win_shb[i]; + synNrg += sig * sig; + } + + for ( ; i < l_frame; i++ ) + { + oriNrg += oriSHB[i] * oriSHB[i]; + synNrg += mod_syn[i] * mod_syn[i]; + } + + for ( ; i < l_frame + l_shb_lahead; i++ ) + { + sig = oriSHB[i] * win_shb[l_frame + l_shb_lahead - 1 - i]; + oriNrg += sig * sig; + + sig = mod_syn[i] * win_shb[l_frame + l_shb_lahead - 1 - i]; + synNrg += sig * sig; + } + + frame_gain = (float) sqrt( oriNrg / synNrg ); + if ( ( synNrg ) == 0 ) + { + frame_gain = 0; + } + + *GainFrame = (float) frame_gain; + + return; +} + + +/*-------------------------------------------------------------------* + * pow_off_pk() + * + * Sums squares of SWB shape gain parameters away from peak values + *-------------------------------------------------------------------*/ + +static float pow_off_pk( + float a[], + const int16_t len, + const int16_t step ) +{ + int16_t i, j = 0; + float sum; + + sum = a[0] * a[0]; + for ( j = 0, i = 1; i < len; i += step ) + { + sum += a[i] * a[i]; + if ( a[i] > a[j] ) + { + j = i; + } + } + + sum -= a[j] * a[j]; + + return ( sum ); +} + +/*-------------------------------------------------------------------* + * pow_off_pk_corrected() + * + * Sums squares of SWB shape gain parameters away from peak values + *-------------------------------------------------------------------*/ + +static float pow_off_pk_corrected( + float a[], + const int16_t len, + const int16_t step ) +{ + int16_t i, j = 0; + float sum; + + sum = a[0] * a[0]; + for ( j = 0, i = step; i < len; i += step ) + { + sum += a[i] * a[i]; + if ( a[i] > a[j] ) + { + j = i; + } + } + + sum -= a[j] * a[j]; + + return ( sum ); +} + + +/*-------------------------------------------------------------------* + * EstimateSHBGainShape() + * + * Estimate temporal gain parameters + *-------------------------------------------------------------------*/ + +static void EstimateSHBGainShape( + const int16_t length, /* i : SHB overlap length */ + const float *oriSHB, /* i : target original SHB frame */ + const float *synSHB, /* i : shaped SHB excitation */ + float *subgain, /* o : estimate of gain shape */ + const float *subwin /* i : SHB subframe window */ +) +{ + const int16_t *skip; + int16_t i, k; + float sum_gain, oriNrg, synNrg, sig; + int16_t num_join, num_gains, join_length; + float normFact; + + num_join = NUM_SHB_SUBFR / NUM_SHB_SUBGAINS; + num_gains = NUM_SHB_SUBGAINS; + skip = skip_bands_SWB_TBE; + + if ( length == SHB_OVERLAP_LEN / 2 ) + { + num_gains = NUM_SHB_SUBFR / 4; + skip = skip_bands_WB_TBE; + } + + /* calculate and normalize the subgain */ + sum_gain = (float) 1e-10; + oriNrg = 0.0f; + synNrg = 0.0f; + + if ( length == SHB_OVERLAP_LEN / 2 ) + { + for ( i = 0; i < NUM_SHB_SUBFR / 2; i++ ) + { + if ( ( i & 0x1 ) == 0 ) + { + oriNrg = 1e-10f; + synNrg = 1e-10f; + } + + if ( i == 0 ) + { + for ( k = 0; k < length / 2; k++ ) + { + sig = oriSHB[skip[i] + k] * subwin[2 * k + 2]; + oriNrg += sig * sig; + + sig = synSHB[skip[i] + k] * subwin[2 * k + 2]; + synNrg += sig * sig; + } + + for ( k = length / 2; k < length; k++ ) + { + sig = oriSHB[skip[i] + k]; + oriNrg += sig * sig; + + sig = synSHB[skip[i] + k]; + synNrg += sig * sig; + } + } + else + { + for ( k = 0; k < length; k++ ) + { + sig = oriSHB[skip[i] + k] * subwin[k + 1]; + oriNrg += sig * sig; + + sig = synSHB[skip[i] + k] * subwin[k + 1]; + synNrg += sig * sig; + } + } + + if ( i == NUM_SHB_SUBFR / 2 - 1 ) + { + for ( ; k < 2 * length - length / 2; k++ ) + { + sig = oriSHB[skip[i] + k] * subwin[3 * length - 2 * k - 2]; + oriNrg += sig * sig; + + sig = synSHB[skip[i] + k] * subwin[3 * length - 2 * k - 2]; + synNrg += sig * sig; + } + } + else + { + for ( ; k < 2 * length; k++ ) + { + sig = oriSHB[skip[i] + k] * subwin[2 * length - k - 1]; + oriNrg += sig * sig; + + sig = synSHB[skip[i] + k] * subwin[2 * length - k - 1]; + synNrg += sig * sig; + } + } + + if ( ( i & 0x1 ) == 1 ) + { + subgain[i / 2] = (float) sqrt( oriNrg / synNrg ); + if ( synNrg == 0 ) + { + subgain[i / 2] = 0; + } + + sum_gain += subgain[i / 2] * subgain[i / 2]; + } + } + } + else + { + join_length = num_join * length; + + for ( i = 0; i < num_gains; i++ ) + { + oriNrg = 1e-10f; + synNrg = 1e-10f; + + for ( k = 0; k < length; k++ ) + { + sig = oriSHB[join_length * i + k] * subwin[k + 1]; + oriNrg += sig * sig; + + sig = synSHB[join_length * i + k] * subwin[k + 1]; + synNrg += sig * sig; + } + + for ( k = 0; k < ( join_length - length ); k++ ) + { + sig = oriSHB[length + join_length * i + k]; + oriNrg += sig * sig; + + sig = synSHB[length + join_length * i + k]; + synNrg += sig * sig; + } + + for ( k = 0; k < length; k++ ) + { + sig = oriSHB[join_length * ( i + 1 ) + k] * subwin[length - k - 1]; + oriNrg += sig * sig; + + sig = synSHB[join_length * ( i + 1 ) + k] * subwin[length - k - 1]; + synNrg += sig * sig; + } + + subgain[i] = (float) sqrt( oriNrg / synNrg ); + if ( synNrg == 0 ) + { + subgain[i] = 0; + } + + sum_gain += subgain[i] * subgain[i]; + } + } + + /* normalize the subgain */ + normFact = (float) sqrt( 1.0f / sum_gain ); + if ( sum_gain == 0 ) + { + normFact = 0; + } + + for ( i = 0; i < num_gains; i++ ) + { + subgain[i] *= normFact; + } + + return; +} + + +/*-------------------------------------------------------------------* + * Quant_lower_LSF() + * + * Quantize the lower half of the LSF vector + *-------------------------------------------------------------------*/ + +static void Quant_lower_LSF( + const float lsf[], /* i : Input LSFs */ + float lsf_q[], /* o : Quantized LSFs */ + int16_t lsf_idx[] /* o : Quantized LSFs indices */ +) +{ + int16_t i; + + lsf_idx[0] = (int16_t) squant( lsf[0], &lsf_q[0], lsf_q_cb[0], lsf_q_cb_size[0] ); + for ( i = 1; i < NUM_Q_LSF; i++ ) + { + lsf_idx[i] = (int16_t) squant( lsf[i] - lsf_q[i - 1], &lsf_q[i], lsf_q_cb[i], lsf_q_cb_size[i] ); + lsf_q[i] += lsf_q[i - 1]; + } + + return; +} + +/*-------------------------------------------------------------------* + * Quant_mirror_point() + * + * Quantize the mirror point + *-------------------------------------------------------------------*/ + +static int16_t Quant_mirror_point( + const float lsf[], /* i : Input LSFs */ + const float lsf_q[], + float *m /* o : Mirror point */ +) +{ + float m_diff; + int16_t m_idx; + + m_diff = 0.5f * ( lsf[NUM_Q_LSF] - lsf_q[NUM_Q_LSF - 1] ); + m_idx = (int16_t) squant( m_diff, m, mirror_point_q_cb, MIRROR_POINT_Q_CB_SIZE ); + + *m += lsf_q[NUM_Q_LSF - 1]; + + return m_idx; +} + +/*-------------------------------------------------------------------* + * Find_LSF_grid() + * + * Find the best grid for the LSFs + *-------------------------------------------------------------------*/ + +static int16_t Find_LSF_grid( + const float lsf[], /* i : Input LSFs */ + float lsf_q[], /* o : Quantized LSFs */ + const float m /* i : Mirror point */ +) +{ + float lsf_map[NUM_MAP_LSF]; + float grid[NUM_LSF_GRIDS][NUM_MAP_LSF]; + float offset; + float last_q_lsf; + float lsf_t[NUM_MAP_LSF]; + float lsf_smooth[NUM_MAP_LSF]; + float D, D_best; + int16_t I_best = 0; + int16_t i, j; + float scale; + + for ( i = 0; i < NUM_MAP_LSF; i++ ) + { + lsf_map[i] = 2 * m - lsf_q[NUM_MAP_LSF - 1 - i]; + } + + if ( m > MAX_LSF / 2 ) + { + offset = lsf_map[0]; + scale = ( MAX_LSF - m ) / m; + for ( i = 0; i < NUM_MAP_LSF; i++ ) + { + lsf_map[i] = ( lsf_map[i] - offset ) * scale + offset; + } + } + + last_q_lsf = lsf_q[NUM_Q_LSF - 1]; + scale = MAX_LSF - last_q_lsf; + + for ( i = 0; i < NUM_LSF_GRIDS; i++ ) + { + for ( j = 0; j < NUM_MAP_LSF; j++ ) + { + grid[i][j] = lsf_grid[i][j] * scale + last_q_lsf; + } + } + + D_best = QUANT_DIST_INIT; + for ( i = 0; i < NUM_LSF_GRIDS; i++ ) + { + D = EPSILON; + for ( j = 0; j < NUM_MAP_LSF; j++ ) + { + lsf_t[j] = ( 1 - grid_smoothing[j] ) * lsf_map[j] + grid_smoothing[j] * grid[i][j]; + D += ( lsf_t[j] - lsf[NUM_Q_LSF + j] ) * ( lsf_t[j] - lsf[NUM_Q_LSF + j] ); + } + + if ( D < D_best ) + { + mvr2r( lsf_t, lsf_smooth, NUM_MAP_LSF ); + D_best = D; + I_best = i; + } + } + + for ( i = 0; i < NUM_MAP_LSF; i++ ) + { + lsf_q[NUM_Q_LSF + i] = lsf_smooth[i]; + } + + return I_best; +} + +/*-------------------------------------------------------------------* + * gainFrSmooth_En() + * + * Gain frame smoothing and attenuation control + *-------------------------------------------------------------------*/ + +static void gainFrSmooth_En( + TD_BWE_ENC_HANDLE hSWB_TD, + const int16_t last_extl, + float *shb_frame, + const float *lpc_shb, + const float *lsp_shb, + float *MA_lsp_shb_spacing, + int16_t *frGainAttenuate, + int16_t *frGainSmoothEn ) +{ + float lsp_slow_evol_rate = 0, lsp_fast_evol_rate = 0, lsp_spacing = 0.5f; + float temp_shb_frame[L_FRAME16k + L_SHB_LAHEAD]; + int16_t i; + + for ( i = 0; i < LPC_SHB_ORDER; i++ ) + { + lsp_spacing = min( lsp_spacing, (float) ( i == 0 ? lsp_shb[0] : ( lsp_shb[i] - lsp_shb[i - 1] ) ) ); + + /* estimate the mean square error in lsps from current frame to past frames */ + lsp_slow_evol_rate += ( lsp_shb[i] - hSWB_TD->lsp_shb_slow_interpl[i] ) * ( lsp_shb[i] - hSWB_TD->lsp_shb_slow_interpl[i] ); + lsp_fast_evol_rate += ( lsp_shb[i] - hSWB_TD->lsp_shb_fast_interpl[i] ) * ( lsp_shb[i] - hSWB_TD->lsp_shb_fast_interpl[i] ); + + /* update the slow and fast interpolation lsps for next frame */ + hSWB_TD->lsp_shb_slow_interpl[i] = 0.7f * hSWB_TD->lsp_shb_slow_interpl[i] + 0.3f * lsp_shb[i]; + hSWB_TD->lsp_shb_fast_interpl[i] = 0.3f * hSWB_TD->lsp_shb_fast_interpl[i] + 0.7f * lsp_shb[i]; + } + + if ( last_extl != SWB_TBE && last_extl != FB_TBE && lsp_spacing < 0.008f ) + { + hSWB_TD->lsp_shb_spacing[0] = lsp_spacing; + hSWB_TD->lsp_shb_spacing[1] = lsp_spacing; + hSWB_TD->lsp_shb_spacing[2] = lsp_spacing; + hSWB_TD->prev_frGainAtten = 1; + } + + *MA_lsp_shb_spacing = 0.1f * hSWB_TD->lsp_shb_spacing[0] + 0.2f * hSWB_TD->lsp_shb_spacing[1] + 0.3f * hSWB_TD->lsp_shb_spacing[2] + 0.4f * lsp_spacing; + + hSWB_TD->lsp_shb_spacing[0] = hSWB_TD->lsp_shb_spacing[1]; + hSWB_TD->lsp_shb_spacing[1] = hSWB_TD->lsp_shb_spacing[2]; + hSWB_TD->lsp_shb_spacing[2] = lsp_spacing; + + *frGainAttenuate = 0; + *frGainSmoothEn = 0; + + if ( ( lsp_spacing < 0.008f && ( *MA_lsp_shb_spacing < 0.005f || hSWB_TD->prev_frGainAtten == 1 ) ) || lsp_spacing <= 0.0032f ) + { + *frGainAttenuate = 1; + mvr2r( shb_frame, temp_shb_frame, L_FRAME16k + L_SHB_LAHEAD ); + + fir( temp_shb_frame, lpc_shb, shb_frame, hSWB_TD->shb_inv_filt_mem, L_FRAME16k + L_SHB_LAHEAD, LPC_SHB_ORDER, 1 ); + + if ( lsp_slow_evol_rate < 0.001f && lsp_fast_evol_rate < 0.001f ) + { + *frGainSmoothEn = 1; + } + } + + return; +} + +/*-------------------------------------------------------------------* + * Quant_BWE_LSF() + * + * Quantize super highband spectral envolope + *-------------------------------------------------------------------*/ + +static void LVQQuant_BWE_LSF( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle*/ + const float lsf_shb[], /* i : unquanitzed LSFs */ + float Q_lsfs[], /* o : quanitzed LSFs */ + int16_t nbits ) +{ + float lsf[LPC_SHB_ORDER]; + float lsf_q[LPC_SHB_ORDER]; + int16_t i, c2, dim1 = 6; + int16_t levels[1], numbits_VQ; + + float w[8] = { 5.0f, 5.0f, 2.0f, 2.0f, 2.0f, 1.0f, 1.0f, 1.0f }; + float cand[LPC_SHB_ORDER], quant[LPC_SHB_ORDER], e[2], ftmp; + const float *cb_stage; + int16_t indices_firstVQ[LSFMBEST]; + + int16_t Idx, idx_lead, idx_scale; + UWord32 LVQ_index; + float dd[LATTICE_DIM], cv_out[LATTICE_DIM]; + int16_t bits_lvq, predictor_bits, empty_bits; + + empty_bits = 0; /* This is the difference to 21 bits, if we want lower number of bits */ + nbits -= empty_bits; /* THIS IS TO SIMULATE DIFFERENT NUMBER OF input BITS - should be removed */ + + c2 = NUM_BITS_SHB_MSLVQ - nbits; + + numbits_VQ = config_LSF_BWE[c2 * 3]; + levels[0] = config_LSF_BWE[c2 * 3 + 1]; + predictor_bits = config_LSF_BWE[c2 * 3 + 2]; + + if ( nbits < 19 ) + { + cb_stage = cb_LSF_BWE[1]; + } + else + { + cb_stage = cb_LSF_BWE[0]; + } + + for ( i = 0; i < LPC_SHB_ORDER; i++ ) + { + lsf[i] = 0.5f - lsf_shb[LPC_SHB_ORDER - 1 - i]; + } + + /* remove mean */ + v_sub( lsf, SHB_LSF_mean, Q_lsfs, LPC_SHB_ORDER ); + + /* 6D multi-stage 6bit coding */ + first_VQstages( &cb_stage, Q_lsfs, levels, 1, w, dim1, 3000, indices_firstVQ ); + + + /* 8D MSLVQ coding */ + bits_lvq = nbits - numbits_VQ - predictor_bits; + mvr2r( SHB_LSF_mean, cand, LPC_SHB_ORDER ); + Idx = indices_firstVQ[0]; + v_add( cand, cb_stage + Idx * dim1, cand, dim1 ); + + /* LVQ quantization */ + mvr2r( cand, quant, LPC_SHB_ORDER ); + v_sub( lsf, cand, dd, LATTICE_DIM ); + mslvq( dd, quant, cv_out, &idx_lead, &idx_scale, w, 0, ( nbits < 19 ), bits_lvq ); + + if ( idx_scale == -1 ) + { + set_zero( cv_out, LATTICE_DIM ); + } + v_add( cand, quant, cand, LATTICE_DIM ); + + /* arrange the LSF candidate vector prior to selection to an ascending order*/ + v_sort( cand, 0, LPC_SHB_ORDER - 1 ); + + set_zero( Q_lsfs, LPC_SHB_ORDER ); + /* mvr2r( mean_lsf, Q_lsfs, LPC_SHB_ORDER ); */ + + v_add( Q_lsfs, cb_stage + Idx * dim1, Q_lsfs, dim1 ); + + /* write VQ indexes */ + push_indice( hBstr, IND_SHB_LSF, Idx, numbits_VQ ); + + /* write MSLVQ index */ + LVQ_index = index_lvq_SHB( idx_lead, idx_scale, bits_lvq, cv_out, ( nbits < 19 ) ); + + if ( bits_lvq > 15 ) + { + push_indice( hBstr, IND_SHB_LSF, (int16_t) ( ( LVQ_index ) & ( 0xffff >> 1 ) ), 15 ); + push_indice( hBstr, IND_SHB_LSF, (int16_t) ( ( LVQ_index ) >> 15 ) & ( 0xffff >> 1 ), bits_lvq - 15 ); + } + else + { + push_indice( hBstr, IND_SHB_LSF, (int16_t) LVQ_index, bits_lvq ); + } + + v_add( Q_lsfs, quant, lsf_q, LATTICE_DIM ); /* quantized mean removed data for first 8 dim*/ + + /* predict last 2 components */ + if ( predictor_bits == 0 ) + { + lsf_q[LATTICE_DIM] = dotp( lsf_q, LastCoefPred_0bit, LATTICE_DIM ); + lsf_q[LATTICE_DIM + 1] = dotp( lsf_q, &LastCoefPred_0bit[LATTICE_DIM + 1], LATTICE_DIM ); + } + else + { + v_sub( &lsf[LATTICE_DIM], &SHB_LSF_mean[LATTICE_DIM], &lsf_q[LATTICE_DIM], 2 ); + + for ( i = 0; i < 2; i++ ) + { + ftmp = dotp( lsf_q, &LastCoefPred_1bit[2 * ( LATTICE_DIM + 1 ) * i], LATTICE_DIM ) - lsf_q[LATTICE_DIM]; + e[i] = ( ftmp * ftmp ); + ftmp = dotp( lsf_q, &LastCoefPred_1bit[2 * ( LATTICE_DIM + 1 ) * i + LATTICE_DIM + 1], LATTICE_DIM ) - lsf_q[LATTICE_DIM + 1]; + e[i] += ( ftmp * ftmp ); + } + + c2 = minimum( e, 2, &ftmp ); + + lsf_q[LATTICE_DIM] = dotp( lsf_q, &LastCoefPred_1bit[2 * ( LATTICE_DIM + 1 ) * c2], LATTICE_DIM ); + lsf_q[LATTICE_DIM + 1] = dotp( lsf_q, &LastCoefPred_1bit[2 * ( LATTICE_DIM + 1 ) * c2 + LATTICE_DIM + 1], LATTICE_DIM ); + + push_indice( hBstr, IND_SHB_LSF, c2, 1 ); + } + + if ( empty_bits > 0 ) + { + push_indice( hBstr, IND_SHB_LSF, 0, empty_bits ); + } + + v_add( SHB_LSF_mean, lsf_q, lsf_q, LPC_SHB_ORDER ); + v_sort( lsf_q, 0, LPC_SHB_ORDER - 1 ); + + for ( i = 0; i < LPC_SHB_ORDER; i++ ) + { + Q_lsfs[i] = 0.5f - lsf_q[LPC_SHB_ORDER - 1 - i]; + } + + return; +} + +/*-------------------------------------------------------------------* + * Quant_BWE_LSF() + * + * Quantize super highband spectral envolope + *-------------------------------------------------------------------*/ + +static void Quant_BWE_LSF( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + TD_BWE_ENC_HANDLE hBWE_TD, /* i/o: TD BWE data handle */ + const int16_t codec_mode, /* i : codec mode */ + const float lsf_shb[], /* i : unquanitzed LSFs */ + float Q_lsfs[], /* o : quanitzed LSFs */ + const int32_t extl_brate /* i : extension layer bit rate */ +) +{ + float lsf[LPC_SHB_ORDER]; + float lsf_q[LPC_SHB_ORDER]; + int16_t lsf_idx[NUM_Q_LSF]; + int16_t i; + int16_t m_idx; + float m; + int16_t grid_idx; + + if ( extl_brate == SWB_TBE_1k75 ) + { + LVQQuant_BWE_LSF( hBstr, lsf_shb, Q_lsfs, NUM_BITS_SHB_MSLVQ ); + } + else + { + for ( i = 0; i < LPC_SHB_ORDER; i++ ) + { + lsf[i] = 0.5f - lsf_shb[LPC_SHB_ORDER - 1 - i]; + } + + Quant_lower_LSF( lsf, lsf_q, lsf_idx ); + + for ( i = 0; i < NUM_Q_LSF; i++ ) + { + if ( codec_mode == MODE2 ) + { + hBWE_TD->lsf_idx[i] = lsf_idx[i]; + } + else + { + push_indice( hBstr, IND_SHB_LSF, lsf_idx[i], lsf_q_num_bits[i] ); + } + } + + m_idx = Quant_mirror_point( lsf, lsf_q, &m ); + + if ( codec_mode == MODE2 ) + { + hBWE_TD->m_idx = m_idx; + } + else + { + push_indice( hBstr, IND_SHB_MIRROR, m_idx, MIRROR_POINT_BITS ); + } + + grid_idx = Find_LSF_grid( lsf, lsf_q, m ); + + if ( codec_mode == MODE2 ) + { + hBWE_TD->grid_idx = grid_idx; + } + else + { + push_indice( hBstr, IND_SHB_GRID, grid_idx, NUM_LSF_GRID_BITS ); + } + + for ( i = 0; i < LPC_SHB_ORDER; i++ ) + { + Q_lsfs[i] = 0.5f - lsf_q[LPC_SHB_ORDER - 1 - i]; + } + } + + return; +} + +/*-------------------------------------------------------------------* + * closest_centroid() + * + * Determine a set of closest VQ centroids for a given input + *-------------------------------------------------------------------*/ + +static int16_t closest_centroid( + const float *data, /* i : input data */ + const float *weights, /* i : weights */ + const float *quantizer, /* i : quantizer table */ + const int16_t centroids, /* i : number of centroids */ + const int16_t length ) /* i : dimension of quantiser */ +{ + int16_t i, j, index; + float tmp, werr, best_werr; + + index = 0; + best_werr = 1.0E20f; + + for ( i = 0; i < centroids; i++ ) + { + werr = 0.0f; + for ( j = 0; j < length; j++ ) + { + tmp = (float) *( data + j ) - quantizer[i * length + j]; + werr += (float) ( *( weights + j ) * tmp * tmp ); + if ( werr > best_werr ) + { + break; + } + } + + if ( werr < best_werr ) + { + best_werr = werr; + index = i; + } + } + + return index; +} + +/*-------------------------------------------------------------------* + * QuantizeSHBsubgains() + * + * Quantize super highband temporal gains + *-------------------------------------------------------------------*/ + +static void QuantizeSHBsubgains( + Encoder_State *st, /* i/o: encoder state structure */ + float subgains[], /* i/o: super highband temporal gains */ + const int16_t extl /* i : extension layer */ +) +{ + int16_t i, idxSubGain; + float Unit_weights10[NUM_SHB_SUBFR]; + BSTR_ENC_HANDLE hBstr = st->hBstr; + + if ( extl == WB_TBE ) + { + set_f( Unit_weights10, 1.0f, (int16_t) NUM_SHB_SUBFR / 4 ); + + for ( i = 0; i < NUM_SHB_SUBFR / 4; i++ ) + { + subgains[i + NUM_SHB_SUBFR / 4] = 20.0f * (float) log10( subgains[i] ); + } + + idxSubGain = closest_centroid( subgains + NUM_SHB_SUBFR / 4, Unit_weights10, HBCB_SubGain5bit, 1 << NUM_BITS_SHB_SUBGAINS, NUM_SHB_SUBFR / 4 ); + + mvr2r( HBCB_SubGain5bit + idxSubGain * NUM_SHB_SUBFR / 4, subgains, NUM_SHB_SUBFR / 4 ); + + push_indice( hBstr, IND_SHB_SUBGAIN, idxSubGain, NUM_BITS_SHB_SUBGAINS ); + for ( i = 0; i < NUM_SHB_SUBFR / 4; i++ ) + { + subgains[i] = (float) pow( 10.0f, subgains[i] / 20.0f ); + } + + for ( i = NUM_SHB_SUBFR / 2 - 1; i >= 0; i-- ) + { + subgains[i] = subgains[i / 2]; + } + } + else + { + for ( i = 0; i < NUM_SHB_SUBGAINS; i++ ) + { + subgains[i] = (float) log10( subgains[i] + 0.001f ); + } + + idxSubGain = (int16_t) vquant( subgains, 0, subgains, SHBCB_SubGain5bit, NUM_SHB_SUBGAINS, 1 << NUM_BITS_SHB_SUBGAINS ); + + for ( i = 0; i < NUM_SHB_SUBGAINS; i++ ) + { + subgains[i] = (float) pow( 10.0, subgains[i] ); + } + + for ( i = NUM_SHB_SUBFR - 1; i >= 0; i-- ) + { + subgains[i] = subgains[i * NUM_SHB_SUBGAINS / NUM_SHB_SUBFR]; + } + + if ( st->codec_mode == MODE2 ) + { + st->hBWE_TD->idxSubGains = idxSubGain; + } + else + { + push_indice( hBstr, IND_SHB_SUBGAIN, idxSubGain, NUM_BITS_SHB_SUBGAINS ); + } + } + + return; +} + +/*-------------------------------------------------------------------* + * Quant_shb_ener_sf() + * + * Quantize SHB subframe energies + *-------------------------------------------------------------------*/ + +static void Quant_shb_ener_sf( + Encoder_State *st, /* i/o: encoder state structure */ + float *shb_ener_sf /* i/o: super highband subframe energies */ +) +{ + int16_t idxSubEner; + float temp_shb_ener_sf, sum; + + sum = *shb_ener_sf; + *shb_ener_sf = (float) log10( sum ); + + temp_shb_ener_sf = 0; + idxSubEner = usquant( *shb_ener_sf, &temp_shb_ener_sf, 0, 0.042f, 1 << NUM_BITS_SHB_ENER_SF ); + *shb_ener_sf = (float) pow( 10.0, temp_shb_ener_sf ); + + if ( st->codec_mode == MODE2 ) + { + st->hBWE_TD->idx_shb_fr_gain = idxSubEner; + } + else + { + push_indice( st->hBstr, IND_SHB_ENER_SF, idxSubEner, NUM_BITS_SHB_ENER_SF ); + } + + return; +} + +/*-------------------------------------------------------------------* + * Quant_shb_res_gshape() + * + * Quantize SHB gain shapes in residual domain + *-------------------------------------------------------------------*/ + +static void Quant_shb_res_gshape( + Encoder_State *st, /* i/o: encoder state structure */ + float shb_res_gshape[] /* i/o: super highband gain shapes */ +) +{ + int16_t i, idxSubGain[NB_SUBFR16k]; + + for ( i = 0; i < NB_SUBFR16k; i++ ) + { + idxSubGain[i] = usquant( shb_res_gshape[i], &shb_res_gshape[i], 0.125, 0.125f, 1 << NUM_BITS_SHB_RES_GS ); + + if ( st->codec_mode == MODE2 ) + { + st->hBWE_TD->idx_res_gs[i] = idxSubGain[i]; + } + else + { + push_indice( st->hBstr, IND_SHB_RES_GS + i, idxSubGain[i], NUM_BITS_SHB_RES_GS ); + } + } + + return; +} + +/*-------------------------------------------------------------------* + * QuantizeSHBframegains() + * + * Quantize super highband frame gain + *-------------------------------------------------------------------*/ + +static void QuantizeSHBframegain( + Encoder_State *st, /* i/o: encoder state structure */ + float *GainFrame, /* i/o: Gain */ + const int16_t extl, /* i : extension layer */ + const int32_t extl_brate, /* i : extension layer bitrate */ + int16_t *rf_gainFrame_ind, + const int16_t flag_conservative /* i : flag to indicate more conservative gain quantization */ +) +{ + int16_t idxFrameGain; + float Q_GainFrame; + float Unit_weights1 = 1.0f; + BSTR_ENC_HANDLE hBstr = st->hBstr; + + float GainFrameLog; + + if ( extl == WB_TBE ) + { + determine_gain_weights( GainFrame, &( Unit_weights1 ), 1 ); + + if ( extl_brate == WB_TBE_0k35 ) + { + singlevectortest_gain( GainFrame, 1, 1 << NUM_BITS_SHB_FrameGain_LBR_WB, &idxFrameGain, &( Unit_weights1 ), &Q_GainFrame, SHBCB_FrameGain16 ); + + if ( Q_GainFrame > *GainFrame * 1.06f && idxFrameGain > 0 ) /* 1.06 = +0.5 dB */ + { + idxFrameGain--; + Q_GainFrame = SHBCB_FrameGain16[idxFrameGain]; + } + + if ( st->codec_mode == MODE2 ) + { + st->hBWE_TD->gFrame_WB = idxFrameGain; + } + else + { + push_indice( hBstr, IND_SHB_FRAMEGAIN, idxFrameGain, NUM_BITS_SHB_FrameGain_LBR_WB ); + } + + if ( st->rf_mode ) + { + *rf_gainFrame_ind = idxFrameGain; + } + } + else + { + singlevectortest_gain( GainFrame, 1, 1 << NUM_BITS_SHB_FrameGain, &idxFrameGain, &( Unit_weights1 ), &Q_GainFrame, SHBCB_FrameGain64 ); + + push_indice( hBstr, IND_SHB_FRAMEGAIN, idxFrameGain, NUM_BITS_SHB_FrameGain ); + + if ( st->rf_mode ) + { + *rf_gainFrame_ind = idxFrameGain; + } + } + } + else + { + GainFrameLog = (float) log10( *GainFrame + 0.001f ); + + if ( st->extl_brate == SWB_TBE_1k75 ) + { + idxFrameGain = (int16_t) usquant( GainFrameLog, &Q_GainFrame, SHB_GAIN_QLOW_1k75, SHB_GAIN_QDELTA_1k75, 1 << NUM_BITS_SHB_FRAMEGAIN_1k75 ); + } + else + { + idxFrameGain = (int16_t) usquant( GainFrameLog, &Q_GainFrame, SHB_GAIN_QLOW, SHB_GAIN_QDELTA, 1 << NUM_BITS_SHB_FRAMEGAIN ); + } + + while ( Q_GainFrame > GainFrameLog + 0.495 * SHB_GAIN_QDELTA && idxFrameGain != 0 ) + { + idxFrameGain = idxFrameGain - 1; + Q_GainFrame = idxFrameGain * SHB_GAIN_QDELTA + SHB_GAIN_QLOW; + } + + if ( flag_conservative && ( Q_GainFrame > GainFrameLog + 0.41 * SHB_GAIN_QDELTA ) && idxFrameGain != 0 ) + { + /* be more conservative in the quantization process -> prevent energy overshoot */ + idxFrameGain = idxFrameGain - 1; + Q_GainFrame = idxFrameGain * SHB_GAIN_QDELTA + SHB_GAIN_QLOW; + } + + Q_GainFrame = (float) pow( 10.0, Q_GainFrame ); + if ( st->codec_mode == MODE2 ) + { + st->hBWE_TD->idxFrameGain = idxFrameGain; + } + else + { + if ( st->extl_brate == SWB_TBE_1k75 ) + { + push_indice( hBstr, IND_SHB_FRAMEGAIN, idxFrameGain, NUM_BITS_SHB_FRAMEGAIN_1k75 ); + } + else + { + push_indice( hBstr, IND_SHB_FRAMEGAIN, idxFrameGain, NUM_BITS_SHB_FRAMEGAIN ); + } + } + + if ( st->rf_mode ) + { + *rf_gainFrame_ind = idxFrameGain; + } + } + + if ( st->rf_mode ) + { + /*Currently intended for SWB only. Modify for WB is needed later!*/ + if ( st->hRF->rf_frame_type == RF_NELP ) + { + *rf_gainFrame_ind = idxFrameGain; /* NELP Frame uses full 5 bits */ + } + else /*RF_ALLPRED, RF_GENPRED, RF_NOPRED modes*/ + { + if ( *GainFrame <= 1.25 ) /* [0 to 1.25] range --> 0.5*/ + { + *rf_gainFrame_ind = 0; + } + else if ( *GainFrame <= 3 ) /* (1.25 to 3] --> 2 */ + { + *rf_gainFrame_ind = 1; + } + else if ( *GainFrame <= 6 ) /* (3 to 6] --> 4 */ + { + *rf_gainFrame_ind = 2; + } + else /* (6 to Inf) --> 8 */ + { + *rf_gainFrame_ind = 3; + } + } + } + + *GainFrame = Q_GainFrame; + + return; +} + + +/*-------------------------------------------------------------------* + * determine_gain_weights() + * + * Determine weights for gain quantization + *-------------------------------------------------------------------*/ + +static void determine_gain_weights( + const float *gain, /* i : Gain parameter */ + float *weights, /* o : gain weights */ + const int16_t dims /* i : number of gains */ +) +{ + int16_t j; + + for ( j = 0; j < dims; j++ ) + { + if ( gain[j] > 1e-6 ) + { + weights[j] = (float) ( pow( fabs( gain[j] ), -0.9f ) ); + } + else + { + weights[j] = 501.187233628f; + } + } + + return; +} + +/*-------------------------------------------------------------------* + * singlevectortest_gain() + * + * VQ for coding superhigh band gain + *-------------------------------------------------------------------*/ + +static void singlevectortest_gain( + const float *inp, /* i : input gain vector */ + const int16_t dimen, /* i : dimension of the input vector */ + const int16_t cb_size, /* i : codebook size */ + int16_t *index, /* o : quanitzation index */ + const float *weight, /* i : Weights for the quanitzation */ + float *recon, /* o : Reconstruction */ + const float *codebook /* i : Codebook */ +) +{ + int16_t k, interNum, flag; + float meanU, meanQ; + int16_t least[4]; + + interNum = 4; + + return_M_Least( inp, dimen, codebook, cb_size, weight, interNum, least ); + + meanU = sum_f( inp, dimen ); + mvr2r( codebook + dimen * least[0], recon, dimen ); + + index[0] = least[0]; + flag = 0; + for ( k = 0; k < interNum; k++ ) + { + if ( flag == 0 ) + { + meanQ = sum_f( codebook + dimen * least[k], dimen ); + + if ( meanQ <= 1.1 * meanU ) + { + flag = 1; + mvr2r( codebook + dimen * least[k], recon, dimen ); + index[0] = least[k]; + } + } + } + + return; +} + +/*-------------------------------------------------------------------* + * return_M_Least() + * + * + *-------------------------------------------------------------------*/ + +static void return_M_Least( + const float *inp, /* i : input */ + const int16_t n_cols, /* i : vector size */ + const float *codebook, /* i : codebook */ + const int16_t num_grp, /* i : number of centroids */ + const float *weight, /* i : gain weights */ + const int16_t interNum, /* i : number on short list prior to 2nd stage search*/ + int16_t *least /* o : return value */ +) +{ + int16_t i, k; + float distance[1024], mindist, tmp; + + mindist = QUANT_DIST_INIT; + for ( i = 0; i < num_grp; i++ ) + { + distance[i] = 0; + for ( k = 0; k < n_cols; k++ ) + { + tmp = inp[k] - codebook[n_cols * i + k]; + distance[i] += weight[k] * tmp * tmp; + } + + if ( distance[i] < mindist ) + { + mindist = distance[i]; + least[0] = i; + } + } + + distance[least[0]] = QUANT_DIST_INIT; + + for ( k = 1; k < interNum; k++ ) + { + mindist = QUANT_DIST_INIT; + for ( i = 0; i < num_grp; i++ ) + { + if ( distance[i] < mindist ) + { + mindist = distance[i]; + least[k] = i; + } + } + + distance[least[k]] = QUANT_DIST_INIT; + } + + return; +} + +/*-------------------------------------------------------------------* + * fb_tbe_reset_enc() + * + * Reset the extra parameters needed for FB TBE encoding + *-------------------------------------------------------------------*/ + +void fb_tbe_reset_enc( + float elliptic_bpf_2_48k_mem[][4], + float *prev_fb_energy ) +{ + set_f( elliptic_bpf_2_48k_mem[0], 0.0f, 4 ); + set_f( elliptic_bpf_2_48k_mem[1], 0.0f, 4 ); + set_f( elliptic_bpf_2_48k_mem[2], 0.0f, 4 ); + set_f( elliptic_bpf_2_48k_mem[3], 0.0f, 4 ); + *prev_fb_energy = 0.0f; + + return; +} + +/*-------------------------------------------------------------------* + * fb_tbe_enc() + * + * FB TBE encoder, 14(resp. 15.5) - 20 kHz band encoding module + *-------------------------------------------------------------------*/ + +void fb_tbe_enc( + Encoder_State *st, /* i/o: encoder state structure */ + const float new_input[], /* i : input speech at 48 kHz sample rate */ + const float fb_exc[] /* i : FB excitation from the SWB part */ +) +{ + float fb_exc_energy, ratio, temp2; + float tmp_vec[L_FRAME48k]; + int16_t idxGain; + float input_fhb[L_FRAME48k]; + int16_t Sample_Delay_HP; + + TD_BWE_ENC_HANDLE hBWE_TD = st->hBWE_TD; + + if ( st->element_mode == IVAS_CPE_DFT ) + { + /*don't process first samples of redressed lookahead (energy is not relevant for these samples)*/ + elliptic_bpf_48k_generic( new_input - NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem, full_band_bpf_2 ); + } + else + { + elliptic_bpf_48k_generic( new_input, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem, full_band_bpf_2 ); + } + + if ( st->element_mode > IVAS_CPE_DFT || st->element_mode == IVAS_SCE ) + { + if ( st->L_frame == L_FRAME ) + { + Sample_Delay_HP = NS2SA( 48000, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_12k8_NS ) - L_FRAME48k / 2; + } + else + { + Sample_Delay_HP = NS2SA( 48000, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_16k_NS ) - L_FRAME48k / 2; + } + } + else + { + Sample_Delay_HP = NS2SA( 48000, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_12k8_NS + DELAY_FIR_RESAMPL_NS ) - L_FRAME48k / 2; + } + + if ( st->last_extl != FB_TBE ) + { + set_f( hBWE_TD->old_input_fhb, 0.0f, Sample_Delay_HP ); + set_f( tmp_vec, 0.0f, 320 ); + } + + mvr2r( hBWE_TD->old_input_fhb, input_fhb, Sample_Delay_HP ); + mvr2r( tmp_vec, input_fhb + Sample_Delay_HP, L_FRAME48k - Sample_Delay_HP ); + mvr2r( tmp_vec + L_FRAME48k - Sample_Delay_HP, hBWE_TD->old_input_fhb, Sample_Delay_HP ); + + /* Compute the energy of the Fullband component over 4kHz (16kHz to 20kHz) */ + temp2 = sum2_f( input_fhb, L_FRAME48k / 2 ) + hBWE_TD->prev_fb_energy; + hBWE_TD->prev_fb_energy = sum2_f( input_fhb + L_FRAME48k / 2, L_FRAME48k / 2 ); + fb_exc_energy = sum2_f( fb_exc, L_FRAME16k ) + EPSILON; + ratio = (float) sqrt( temp2 / fb_exc_energy ); + idxGain = (int16_t) ( log2_f( (float) ratio ) + 0.5f ); + idxGain = max( 0, min( 15, idxGain ) ); + ratio = (float) ( 1 << idxGain ); + + if ( st->codec_mode == MODE2 ) + { + hBWE_TD->idxGain = idxGain; + } + else + { + push_indice( st->hBstr, IND_FB_SLOPE, idxGain, NUM_BITS_FB_FRAMEGAIN_TBE ); + } + + return; +} + +/*---------------------------------------------------------------------* + * tbe_write_bitstream() + * + * Write TBE bitstream. + *---------------------------------------------------------------------*/ + +void tbe_write_bitstream( + Encoder_State *st ) +{ + int16_t i; + TD_BWE_ENC_HANDLE hBWE_TD = st->hBWE_TD; + BSTR_ENC_HANDLE hBstr = st->hBstr; + + if ( ( st->rf_mode || st->total_brate == ACELP_9k60 ) && st->bwidth == WB ) + { + /* WB LSF */ + push_next_indice( hBstr, hBWE_TD->lsf_WB, NUM_BITS_LBR_WB_LSF ); + + /* WB frame */ + push_next_indice( hBstr, hBWE_TD->gFrame_WB, NUM_BITS_SHB_FrameGain_LBR_WB ); + } + else if ( st->total_brate >= ACELP_9k60 && st->total_brate <= ACELP_32k && ( st->bwidth == SWB || st->bwidth == FB ) ) + { + /* LSF coefficients */ + + if ( st->rf_mode || st->total_brate == ACELP_9k60 ) + { + push_next_indice( hBstr, hBWE_TD->lsf_idx[0], 8 ); + } + else + { + for ( i = 0; i < NUM_Q_LSF; i++ ) + { + push_next_indice( hBstr, hBWE_TD->lsf_idx[i], lsf_q_num_bits[i] ); + } + + /* LSF mirror points */ + push_next_indice( hBstr, hBWE_TD->m_idx, MIRROR_POINT_BITS ); + + /* LSF grid points */ + push_next_indice( hBstr, hBWE_TD->grid_idx, NUM_LSF_GRID_BITS ); + } + + /* Gain shape */ + push_next_indice( hBstr, hBWE_TD->idxSubGains, NUM_BITS_SHB_SUBGAINS ); + + /* frame gain */ + push_next_indice( hBstr, hBWE_TD->idxFrameGain, NUM_BITS_SHB_FRAMEGAIN ); + + if ( st->total_brate >= ACELP_24k40 ) + { + /* sub frame energy*/ + push_next_indice( hBstr, hBWE_TD->idx_shb_fr_gain, NUM_BITS_SHB_ENER_SF ); + + /* gain shapes residual */ + for ( i = 0; i < NB_SUBFR16k; i++ ) + { + push_next_indice( hBstr, hBWE_TD->idx_res_gs[i], NUM_BITS_SHB_RES_GS ); + } + + /* voicing factor */ + push_next_indice( hBstr, hBWE_TD->idx_mixFac, NUM_BITS_SHB_VF ); + } + + if ( st->tec_tfa == 1 ) + { + push_next_indice( hBstr, st->tec_flag, BITS_TEC ); + push_next_indice( hBstr, st->tfa_flag, BITS_TFA ); + } + } + + if ( st->bwidth == FB ) + { + push_next_indice( hBstr, hBWE_TD->idxGain, 4 ); + } + + return; +} + +/*---------------------------------------------------------------------* + * TBEreset_enc() + * + * + *---------------------------------------------------------------------*/ + +void TBEreset_enc( + TD_BWE_ENC_HANDLE hBWE_TD, /* i/o: TD BWE data handle */ + const int16_t last_core, /* i : last core */ + const int16_t bwidth /* i : audio bandwidth */ +) +{ + if ( last_core != ACELP_CORE ) + { + set_f( hBWE_TD->old_bwe_exc, 0.0f, PIT16k_MAX * 2 ); + hBWE_TD->bwe_non_lin_prev_scale = 0.f; + } + + if ( bwidth == WB ) + { + wb_tbe_extras_reset( hBWE_TD->mem_genSHBexc_filt_down_wb2, hBWE_TD->mem_genSHBexc_filt_down_wb3 ); + + set_f( hBWE_TD->mem_genSHBexc_filt_down_shb, 0, 7 ); + set_f( hBWE_TD->state_lpc_syn, 0, 10 ); + set_f( hBWE_TD->state_syn_shbexc, 0, L_SHB_LAHEAD / 4 ); + set_f( hBWE_TD->syn_overlap, 0, L_SHB_LAHEAD ); + set_f( hBWE_TD->mem_csfilt, 0, 2 ); + } + else if ( bwidth == SWB || bwidth == FB ) + { + set_f( hBWE_TD->state_ana_filt_shb, 0.0f, ( 2 * ALLPASSSECTIONS_STEEP + 1 ) ); + + swb_tbe_reset( hBWE_TD->mem_csfilt, hBWE_TD->mem_genSHBexc_filt_down_shb, hBWE_TD->state_lpc_syn, hBWE_TD->syn_overlap, hBWE_TD->state_syn_shbexc, &( hBWE_TD->tbe_demph ), &( hBWE_TD->tbe_premph ), hBWE_TD->mem_stp_swb, &( hBWE_TD->gain_prec_swb ) ); + + if ( bwidth == FB ) + { + set_f( hBWE_TD->fb_state_lpc_syn, 0, LPC_SHB_ORDER ); + hBWE_TD->fb_tbe_demph = 0; + fb_tbe_reset_enc( hBWE_TD->elliptic_bpf_2_48k_mem, &hBWE_TD->prev_fb_energy ); + } + } + + return; +} diff --git a/lib_enc/tcq_core_enc.c b/lib_enc/tcq_core_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..03164a3237475fa11cc0f8b7a67610cfe0a5d085 --- /dev/null +++ b/lib_enc/tcq_core_enc.c @@ -0,0 +1,470 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "rom_com.h" +#include "prot.h" +#include "cnst.h" +#include "basop_util.h" +#include "basop_proto_func.h" +#include "wmc_auto.h" + +/*---------------------------------------------------------------------* + * tcq_core_LR_enc() + * + * Main Generic Audio Encoder Routine for LR-MDCT + *---------------------------------------------------------------------*/ + +ivas_error tcq_core_LR_enc( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + int32_t inp_vector[], + const float coefs_norm[], + float coefs_quant[], + const int16_t bit_budget, /* number of bits */ + const int16_t BANDS, + const int16_t *sfm_start, + const int16_t *sfm_end, + const int16_t *sfmsize, + Word32 *Rk_fx, + int16_t *npulses, + int16_t *k_sort, + const int16_t *p2a_flags, + const int16_t p2a_bands, + const int16_t *last_bitalloc, + const int16_t input_frame, + const int16_t adjustFlag, + const int16_t is_transient ) +{ + int16_t i, j, k, size, nb_bytes; + int32_t nzp; + + float gain; + float step_scale[NB_SFM]; + + int16_t pos_index[NB_SFM]; + float Rk_sort[NB_SFM]; + int16_t USQ_TCQ[NB_SFM]; /* TCQ is selected by default*/ + float coefs_norm_dec[L_FRAME32k]; /* New output buffer (TCQ+USQ)*/ + + float pulses, crosscorr, selfcorr; + int32_t savedstates[TCQ_MAX_BAND_SIZE]; + ARCODEC arenc, *parenc; + TCQ_BITSTREAM bs, *pbs; + int16_t k_num[2]; + + int8_t flag_wbnb = 0; + int16_t lsbtcq_bits = TCQ_AMP; + int16_t tcq_arbits = 2; + int16_t nzbands = 0; + int16_t bcount = 0; + float abuffer[560]; + float mbuffer[560]; + float sbuffer[560]; + int16_t dpath[280]; + /*Word32 Rk_fx[NB_SFM];*/ /* Q16 */ + Word32 Rk_sort_fx[NB_SFM]; /* Q16 */ + Word32 bsub_fx = 0; + Word32 est_frame_bits_fx; + + Word16 nzb = 0; + Word32 delta_fx; + Word32 surplus_fx; + Word32 bit_surplus_fx[2]; + + Word32 leftbits = 0; + Word32 sepbits = 0; + Word32 divider = 0; + + ivas_error error; + + error = IVAS_ERR_OK; + + set_s( dpath, 0, 280 ); + set_f( abuffer, 0.f, 560 ); + set_f( mbuffer, 0.f, 560 ); + + set_f( sbuffer, FLT_MAX, 560 ); + + /* initialization */ + set_f( Rk_sort, 0.f, NB_SFM ); + set_s( USQ_TCQ, 0, NB_SFM ); + set_f( coefs_norm_dec, 0.f, L_FRAME32k ); + InitLSBTCQ( &bcount ); + + if ( input_frame <= L_FRAME16k && adjustFlag == 0 && is_transient == 0 ) + { + flag_wbnb = 1; + lsbtcq_bits = 0; + tcq_arbits = 0; + } + + parenc = &arenc; + pbs = &bs; + + pbs->curPos = 7; + pbs->numbits = 0; + pbs->numByte = 0; + for ( i = 0; i < MAX_SIZEBUF_PBITSTREAM; i++ ) + { + pbs->buf[i] = 0; + } + + ar_encoder_start( parenc, pbs, bit_budget ); + + /* TCQ Index initialize */ + set_s( pos_index, 0, NB_SFM ); + + /* Bits distribution analysis */ + for ( i = 0; i < BANDS; i++ ) + { + if ( L_sub( ar_div( Rk_fx[i], sfmsize[i] ), 49152 ) >= 0 ) + { + /* USQ used for high importance bands*/ + USQ_TCQ[i] = 1; + } + else + { + /* TCQ used for usual bands */ + USQ_TCQ[i] = 0; + } + if ( Rk_fx[i] > 0 ) + { + nzbands++; + } + } + + for ( j = 0; j < BANDS; j++ ) + { + if ( Rk_fx[j] > 0 ) + { + nzb++; + } + } + +#define WMC_TOOL_SKIP + bsub_fx = L_shl( L_add( tcq_arbits, lsbtcq_bits ), 16 ); + IF( bsub_fx > 0 ) + { + bsub_fx = L_add( bsub_fx, 2048 ); + } + for ( j = BANDS - 1; j >= 0; j-- ) + { + if ( Rk_fx[j] > 0 ) + { + Rk_fx[j] = L_sub( Rk_fx[j], ar_div( bsub_fx, nzb ) ); + if ( Rk_fx[j] < 0 ) + { + bsub_fx = L_sub( bsub_fx, L_add( ar_div( bsub_fx, nzb ), Rk_fx[j] ) ); + Rk_fx[j] = 0; + } + else + { + bsub_fx = L_sub( bsub_fx, ar_div( bsub_fx, nzb ) ); + } + nzb = sub( nzb, 1 ); + } + } + + srt_vec_ind_fx( Rk_fx, Rk_sort_fx, k_sort, BANDS ); +#undef WMC_TOOL_SKIP + + /* Quantize spectral band shapes using TCQ */ + /* Select ISC */ + set_f( coefs_quant, 0.0, sfm_end[BANDS - 1] + 1 ); + + mvr2r( coefs_norm, coefs_quant, sfm_end[BANDS - 1] + 1 ); + + delta_fx = 0; + est_frame_bits_fx = 0; + if ( input_frame <= L_FRAME16k && adjustFlag == 0 && is_transient == 0 ) + { + surplus_fx = -131072; + bit_allocation_second_fx( Rk_fx, Rk_sort_fx, BANDS, sfmsize, k_sort, k_num, p2a_flags, p2a_bands, last_bitalloc, input_frame ); + + nzbands = 0; + for ( j = 0; j < BANDS; j++ ) + { + if ( sub( j, k_num[0] ) != 0 && sub( j, k_num[1] ) != 0 ) + { + leftbits = L_add( leftbits, Rk_fx[k_sort[j]] ); + if ( Rk_fx[k_sort[j]] > 0 ) + { + nzbands = add( (int16_t) nzbands, 1 ); + } + } + else + { + sepbits = L_add( sepbits, Rk_fx[k_sort[j]] ); + } + } + + /* Separate the position information from the input signal(coefs_norm) */ + /* Gather the NZ coefficients*/ + for ( k = 0; k < BANDS; k++ ) /* Loop through non-zero blocks */ + { + if ( k != k_num[0] && k != k_num[1] ) + { + if ( Rk_fx[k_sort[k]] > 0 && USQ_TCQ[k_sort[k]] == 0 ) /* Then have non-zero block AND WILL BE ENCODED BY TCQ */ + { + /* Encode Position Info, NZ Info, Signs */ + size = sfmsize[k_sort[k]]; + /* Determine scale step, ISC and TCQ quantizer */ + GetISCScale( &coefs_quant[sfm_start[k_sort[k]]], size, L_add( Rk_fx[k_sort[k]], delta_fx ), &coefs_norm_dec[sfm_start[k_sort[k]]], &step_scale[k_sort[k]], &surplus_fx, &pulses, savedstates, 0, &nzp, 0, 0, 0, 0 ); + leftbits = L_sub( leftbits, L_add( Rk_fx[k_sort[k]], delta_fx ) ); + + npulses[k_sort[k]] = (int16_t) pulses; + + encode_position_ari_fx( parenc, &coefs_norm_dec[sfm_start[k_sort[k]]], size, &est_frame_bits_fx ); + encode_magnitude_tcq_fx( parenc, &coefs_norm_dec[sfm_start[k_sort[k]]], size, npulses[k_sort[k]], (int16_t) nzp, savedstates, &est_frame_bits_fx ); + encode_signs_fx( parenc, &coefs_norm_dec[sfm_start[k_sort[k]]], size, (int16_t) nzp, &est_frame_bits_fx ); + nzbands--; + } + /* Have USQ coded band */ + else if ( Rk_fx[k_sort[k]] > 0 && sub( USQ_TCQ[k_sort[k]], 1 ) == 0 ) + { + size = sfmsize[k_sort[k]]; + GetISCScale( &coefs_quant[sfm_start[k_sort[k]]], size, L_add( Rk_fx[k_sort[k]], delta_fx ), &coefs_norm_dec[sfm_start[k_sort[k]]], &step_scale[k_sort[k]], &surplus_fx, &pulses, savedstates, 1, &nzp, 0, 0, 0, 0 ); + leftbits = L_sub( leftbits, L_add( Rk_fx[k_sort[k]], delta_fx ) ); + + npulses[k_sort[k]] = (int16_t) pulses; + + encode_position_ari_fx( parenc, &coefs_norm_dec[sfm_start[k_sort[k]]], size, &est_frame_bits_fx ); + encode_magnitude_usq_fx( parenc, &coefs_norm_dec[sfm_start[k_sort[k]]], size, npulses[k_sort[k]], (int16_t) nzp, &est_frame_bits_fx ); + encode_signs_fx( parenc, &coefs_norm_dec[sfm_start[k_sort[k]]], size, (int16_t) nzp, &est_frame_bits_fx ); + + nzbands--; + } + else /* Then have zero block */ + { + npulses[k_sort[k]] = 0; + size = sfmsize[k_sort[k]]; + } + + if ( Rk_fx[k_sort[k]] > 0 && surplus_fx < 0 ) + { +#define WMC_TOOL_SKIP + IF( nzbands <= 1 ) + { + divider = 0; + } + ELSE + { + divider = 2; + } + + IF( L_add( L_add( surplus_fx, sepbits ), ar_div( leftbits, divider ) ) < 0 ) + { + /* Overflow possible => start to distribute negative surplus */ + delta_fx = ar_div( surplus_fx + sepbits, nzbands ); + } + else + { + delta_fx = 0; + } + surplus_fx = L_sub( surplus_fx, delta_fx ); +#undef WMC_TOOL_SKIP + } + else + { + delta_fx = 0; + } + } + } + +#define WMC_TOOL_SKIP + if ( ( L_sub( surplus_fx, 524288 ) > 0 && sub( input_frame, L_FRAME8k ) == 0 ) || ( L_sub( surplus_fx, 786432 ) > 0 && sub( input_frame, L_FRAME16k ) == 0 ) ) + { + bit_surplus_fx[0] = Mult_32_16( surplus_fx, 24576 ); /* Q16 */ + bit_surplus_fx[1] = Mult_32_16( surplus_fx, 8192 ); /* Q16 */ + } +#undef WMC_TOOL_SKIP + else + { + bit_surplus_fx[0] = surplus_fx; + bit_surplus_fx[1] = 0; + } + for ( k = 0; k < BANDS; k++ ) + { + for ( j = 0; j < 2; j++ ) + { + if ( k == k_num[j] ) + { +#define WMC_TOOL_SKIP + Rk_fx[k_sort[k]] = L_add( Rk_fx[k_sort[k]], bit_surplus_fx[j] ); +#undef WMC_TOOL_SKIP + + if ( Rk_fx[k_sort[k]] > 0 && USQ_TCQ[k_sort[k]] == 0 ) /* Then have non-zero block AND WILL BE ENCODED BY TCQ */ + { + /* Encode Position Info, NZ Info, Signs */ + size = sfmsize[k_sort[k]]; + + /* Determine scale step, ISC and TCQ quantizer */ + GetISCScale( &coefs_quant[sfm_start[k_sort[k]]], size, Rk_fx[k_sort[k]], &coefs_norm_dec[sfm_start[k_sort[k]]], &step_scale[k_sort[k]], &surplus_fx, &pulses, savedstates, 0, &nzp, 0, 0, 0, 0 ); + + npulses[k_sort[k]] = (int16_t) pulses; + + encode_position_ari_fx( parenc, &coefs_norm_dec[sfm_start[k_sort[k]]], size, &est_frame_bits_fx ); + encode_magnitude_tcq_fx( parenc, &coefs_norm_dec[sfm_start[k_sort[k]]], size, npulses[k_sort[k]], (int16_t) nzp, savedstates, &est_frame_bits_fx ); + encode_signs_fx( parenc, &coefs_norm_dec[sfm_start[k_sort[k]]], size, (int16_t) nzp, &est_frame_bits_fx ); + } + /* Have USQ coded band */ + else if ( Rk_fx[k_sort[k]] > 0 && sub( USQ_TCQ[k_sort[k]], 1 ) == 0 ) + { + size = sfmsize[k_sort[k]]; + + GetISCScale( &coefs_quant[sfm_start[k_sort[k]]], size, Rk_fx[k_sort[k]], &coefs_norm_dec[sfm_start[k_sort[k]]], &step_scale[k_sort[k]], &surplus_fx, &pulses, savedstates, 1, &nzp, 0, 0, 0, 0 ); + + npulses[k_sort[k]] = (int16_t) pulses; + + encode_position_ari_fx( parenc, &coefs_norm_dec[sfm_start[k_sort[k]]], size, &est_frame_bits_fx ); + encode_magnitude_usq_fx( parenc, &coefs_norm_dec[sfm_start[k_sort[k]]], size, npulses[k_sort[k]], (int16_t) nzp, &est_frame_bits_fx ); + encode_signs_fx( parenc, &coefs_norm_dec[sfm_start[k_sort[k]]], size, (int16_t) nzp, &est_frame_bits_fx ); + } + else /* Then have zero block */ + { + npulses[k_sort[k]] = 0; + size = sfmsize[k_sort[k]]; + } + } + } + } + } + else + { + surplus_fx = 0; + + /* Separate the position information from the input signal(coefs_norm) */ + /* Gather the NZ coefficients*/ + for ( k = 0; k < BANDS; k++ ) /* Loop through non-zero blocks */ + { + if ( Rk_fx[k_sort[k]] > 0 ) + { + size = sfmsize[k_sort[k]]; + GetISCScale( &coefs_quant[sfm_start[k_sort[k]]], size, L_add( Rk_fx[k_sort[k]], delta_fx ), &coefs_norm_dec[sfm_start[k_sort[k]]], &step_scale[k_sort[k]], &surplus_fx, &pulses, savedstates, 1, &nzp, &bcount, abuffer, mbuffer, sbuffer ); + + npulses[k_sort[k]] = (int16_t) pulses; + encode_position_ari_fx( parenc, &coefs_norm_dec[sfm_start[k_sort[k]]], size, &est_frame_bits_fx ); + encode_magnitude_usq_fx( parenc, &coefs_norm_dec[sfm_start[k_sort[k]]], size, npulses[k_sort[k]], (int16_t) nzp, &est_frame_bits_fx ); + encode_signs_fx( parenc, &coefs_norm_dec[sfm_start[k_sort[k]]], size, (int16_t) nzp, &est_frame_bits_fx ); + /* nzbands--; */ + nzbands = sub( (int16_t) nzbands, 1 ); + } + else /* Then have zero block */ + { + npulses[k_sort[k]] = 0; + size = sfmsize[k_sort[k]]; + } + + /* Surplus distribution */ + if ( surplus_fx > 0 && nzbands > 0 ) + { + delta_fx = ar_div( surplus_fx, nzbands ); + surplus_fx = L_sub( surplus_fx, delta_fx ); + } + } + } + + TCQLSB( bcount, abuffer, mbuffer, sbuffer, dpath ); + + /* Save TCQ path to bitstream */ + SaveTCQdata( parenc, dpath, (int16_t) lsbtcq_bits ); + + /* Add tcq sequence to decoding buffer */ + InitLSBTCQ( &bcount ); + + ar_encoder_done( parenc ); + + /* Loop through non-zero blocks */ + if ( !flag_wbnb ) + { + for ( k = 0; k < BANDS; k++ ) + { + if ( Rk_fx[k_sort[k]] > 0 ) + { + size = sfmsize[k_sort[k]]; + RestoreTCQ( &coefs_norm_dec[sfm_start[k_sort[k]]], size, &bcount, mbuffer ); + } + } + } + + nb_bytes = bit_budget >> 3; + j = bit_budget - ( nb_bytes << 3 ); + for ( i = 0; i < nb_bytes; i++ ) + { + push_indice( hBstr, IND_HQ2_SUBBAND_TCQ, pbs->buf[i], 8 ); + } + if ( j > 0 ) + { + push_indice( hBstr, IND_HQ2_SUBBAND_TCQ, ( pbs->buf[nb_bytes] >> ( 8 - j ) ), j ); + } + + /* Clear decoding buffer */ + set_f( coefs_quant, 0.0, sfm_end[BANDS - 1] + 1 ); + /* New analysis of decoded frame */ + for ( i = 0; i < BANDS; i++ ) + { + if ( Rk_fx[k_sort[i]] > 0 ) + { + gain = 0.0f; + + crosscorr = 0.0f; + selfcorr = EPSILON; + for ( j = 0; j < sfmsize[k_sort[i]]; j++ ) + { + crosscorr += ( coefs_norm[sfm_start[k_sort[i]] + j] * coefs_norm_dec[sfm_start[k_sort[i]] + j] ); + selfcorr += ( coefs_norm_dec[sfm_start[k_sort[i]] + j] * coefs_norm_dec[sfm_start[k_sort[i]] + j] ); + } + + gain = crosscorr / selfcorr; + + if ( gain == 0 ) + { + gain = 1e-10f; + } + + /* Use optimal gain */ + for ( j = 0; j < sfmsize[k_sort[i]]; j++ ) + { + inp_vector[sfm_start[k_sort[i]] + j] = round_f( ( ( 1.0f / QTCQ ) * coefs_norm_dec[sfm_start[k_sort[i]] + j] ) ); + coefs_quant[sfm_start[k_sort[i]] + j] = gain * coefs_norm_dec[sfm_start[k_sort[i]] + j]; + } + } + } + + + return error; +} diff --git a/lib_enc/tcx_ltp_enc.c b/lib_enc/tcx_ltp_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..b8bc7dcd0792421583bd6e4a8587d0413ae37056 --- /dev/null +++ b/lib_enc/tcx_ltp_enc.c @@ -0,0 +1,590 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "prot.h" +#include "rom_enc.h" +#include "rom_com.h" +#include "wmc_auto.h" + + +/*---------------------------------------------------------------------* + * interpolate_corr() + * + * + *---------------------------------------------------------------------*/ + +/*! r: interpolated value */ +static float interpolate_corr( + const float *x, /* i : input vector */ + const int16_t frac, /* i : fraction of lag */ + const int16_t frac_max /* i : max fraction */ +) +{ + int16_t i; + float s; + const float *c1, *c2, *x1, *x2, *win; + + + if ( frac_max == 6 ) + { + win = E_ROM_inter6_1; + } + else + { + win = E_ROM_inter4_1; + } + + x1 = &x[0]; + x2 = &x[1]; + c1 = &win[frac]; + c2 = &win[frac_max - frac]; + s = 0.0f; + for ( i = 0; i < 4; i++, c1 += frac_max, c2 += frac_max ) + { + s += ( *x1-- ) * ( *c1 ) + ( *x2++ ) * ( *c2 ); + } + + return s; +} + + +/*---------------------------------------------------------------------* + * tcx_ltp_pitch_search() + * + * + *---------------------------------------------------------------------*/ + +static void tcx_ltp_pitch_search( + const int16_t pitch_ol, + int16_t *pitch_int, + int16_t *pitch_fr, + int16_t *index, + float *norm_corr, + const int16_t len, + const float *wsp, + const int16_t pitmin, + const int16_t pitfr1, + const int16_t pitfr2, + const int16_t pitmax, + const int16_t pitres, + const int16_t check_border_case, + int16_t *border_case ) +{ + int16_t i, t, t0, t1, step, fraction, t0_min, t0_max, t_min, t_max, delta; + float temp, cor_max, cor[256], *pt_cor; + + if ( pitres == 6 ) + { + delta = 8; + } + else + { + delta = 16; + } + + t0_min = (int16_t) pitch_ol - ( delta >> 1 ); + t0_max = (int16_t) pitch_ol + ( delta >> 1 ) - 1; + + if ( t0_min < pitmin ) + { + t0_min = pitmin; + t0_max = t0_min + delta - 1; + } + if ( t0_max > pitmax ) + { + t0_max = pitmax; + t0_min = t0_max - delta + 1; + } + + + t_min = t0_min - L_INTERPOL1; + t_max = t0_max + L_INTERPOL1; + + pt_cor = cor; + for ( t = t_min; t <= t_max; t++ ) + { + *pt_cor++ = dotp( wsp, wsp - t, len ); + } + + pt_cor = cor + L_INTERPOL1; + cor_max = *pt_cor++; + t1 = t0_min; + for ( t = t0_min + 1; t <= t0_max; t++ ) + { + if ( *pt_cor > cor_max ) + { + cor_max = *pt_cor; + t1 = t; + } + pt_cor++; + } + temp = dotp( wsp, wsp, len ) * dotp( wsp - t1, wsp - t1, len ); + *norm_corr = cor_max / (float) sqrt( temp + 0.1f ); + + /* check for border cases at the low lag border */ + /*pt_cor=cor;*/ + if ( check_border_case && t1 == t0_min ) + { + float tmpCor; + for ( t = t1 - L_INTERPOL1; t < t1; t++ ) + { + tmpCor = dotp( wsp, wsp - t, len ); + if ( tmpCor > cor_max ) + { + /* no real maximum but still on a rising slope */ + /* keep t1 but set norm_corr to zero to avoid activating the LTP here */ + *border_case = 1; + break; + } + } + } + + if ( t1 >= pitfr1 ) + { + *pitch_int = t1; + *pitch_fr = 0; + *index = t1 - pitfr1 + ( ( pitfr2 - pitmin ) * pitres ) + ( ( pitfr1 - pitfr2 ) * ( pitres >> 1 ) ); + return; + } + + /*------------------------------------------------------------------* + * Search fractional pitch with 1/4 subsample resolution. + * search the fractions around t0 and choose the one which maximizes + * the interpolated normalized correlation. + *-----------------------------------------------------------------*/ + + pt_cor = cor + L_INTERPOL1 - t0_min; + t0 = t1; + if ( t0 >= pitfr2 ) + { + step = 2; + fraction = 2; + } + else + { + step = 1; + fraction = 1; + } + + if ( t0 == t0_min ) /* Limit case */ + { + fraction = 0; + cor_max = interpolate_corr( &pt_cor[t0], fraction, pitres ); + } + else /* Process negative fractions */ + { + t0--; + cor_max = interpolate_corr( &pt_cor[t0], fraction, pitres ); + for ( i = ( fraction + step ); i <= pitres - 1; i = i + step ) + { + temp = interpolate_corr( &pt_cor[t0], i, pitres ); + if ( temp > cor_max ) + { + cor_max = temp; + fraction = i; + } + } + } + + for ( i = 0; i <= pitres - 1; i = i + step ) /* Process positive fractions */ + { + temp = interpolate_corr( &pt_cor[t1], i, pitres ); + if ( temp > cor_max ) + { + cor_max = temp; + fraction = i; + t0 = t1; + } + } + *pitch_int = t0; + *pitch_fr = fraction; + if ( t0 >= pitfr2 ) + { + *index = t0 * ( pitres >> 1 ) + ( fraction >> 1 ) - ( pitfr2 * ( pitres >> 1 ) ) + ( ( pitfr2 - pitmin ) * pitres ); + } + else + { + *index = t0 * pitres + fraction - ( pitmin * pitres ); + } + + return; +} + + +/*---------------------------------------------------------------------* + * tcx_ltp_find_gain() + * + * + *---------------------------------------------------------------------*/ + +static void tcx_ltp_find_gain( + const float *speech, + float *pred_speech, + const int16_t L_frame, + float *gain, + int16_t *gain_index ) +{ + int16_t gainbits = 2; + + /* Find gain */ + *gain = get_gain( speech, pred_speech, L_frame, NULL ); + + /* Quantize gain */ + if ( *gain >= 0.875f ) + { + *gain_index = 3; /* 1.00/2 */ + } + else if ( *gain >= 0.625f ) + { + *gain_index = 2; /* 0.75/2 */ + } + else if ( *gain >= 0.375f ) + { + *gain_index = 1; /* 0.50/2 */ + } + else if ( *gain >= 0.125f ) + { + *gain_index = 0; /* 0.25/2 */ + } + else + { + *gain_index = -1; /* escape */ + } + /* Dequantize gain */ + *gain = (float) ( *gain_index + 1 ) * 0.625f / (float) ( 1 << gainbits ); + + return; +} + +/*---------------------------------------------------------------------* + * tcx_ltp_encode() + * + * + *---------------------------------------------------------------------*/ + +void tcx_ltp_encode( + Encoder_State *st, + const int16_t tcxMode, + const int16_t L_frame, + const float *speech, + float *speech_ltp, + const float *wsp, + const int16_t Top[], + int16_t *ltp_param, + int16_t *ltp_bits, + float *A, + const int16_t disable_ltp, + const int16_t element_mode ) +{ + int16_t i, j, n; + int16_t ltp_on, tcxOnly, L_subfr, SideInfoOnly, delta; + float s; + float norm_corr; + float pred_speech[L_FRAME_PLUS]; + float tempFlatness; + float maxEnergyChange; + float buf_zir[M + L_FRAME_PLUS / 4], *zir; + float r[M + 1], Aest[M + 1]; + float alpha, step; + float si_gain; + int16_t border_case; + + TCX_ENC_HANDLE hTcxEnc = st->hTcxEnc; + + tcxOnly = st->tcxonly; + L_subfr = L_SUBFR; + SideInfoOnly = st->sr_core > 25600; + + /* Reset memory if past frame is acelp */ + if ( st->last_core == ACELP_CORE ) + { + hTcxEnc->tcxltp_pitch_int_past = L_frame; + hTcxEnc->tcxltp_pitch_fr_past = 0; + hTcxEnc->tcxltp_gain_past = 0.f; + } + + /* By default, LTP is off */ + ltp_param[0] = 0; + norm_corr = 0.0f; + border_case = 0; + + if ( hTcxEnc->tcxltp || SideInfoOnly ) + { + /* Find pitch lag */ + if ( st->pit_res_max == 6 ) + { + delta = 8; + } + else + { + delta = 16; + } + + if ( st->element_mode == IVAS_CPE_MDCT ) + { + if ( abs( Top[0] - Top[1] ) < ( delta / 2 ) ) + { + /* estimates are close enough and stable, take the artihmetic mean as estimate */ + tcx_ltp_pitch_search( ( Top[0] + Top[1] ) / 2, &hTcxEnc->tcxltp_pitch_int, &hTcxEnc->tcxltp_pitch_fr, <p_param[1], &norm_corr, L_frame, wsp, st->pit_min, st->pit_fr1, st->pit_fr2, st->pit_max, st->pit_res_max, 1, &border_case ); + } + else + { + /* pitch jumps between half frames, calc ltp for both estimates, choose the better one */ + int16_t pitch_int_2[2]; + int16_t pitch_fr_2[2]; + float norm_corr_2[2]; + int16_t pit_param_2[2]; + + for ( i = 0; i < 2; i++ ) + { + tcx_ltp_pitch_search( Top[i], &pitch_int_2[i], &pitch_fr_2[i], &pit_param_2[i], &norm_corr_2[i], L_frame, wsp, st->pit_min, st->pit_fr1, st->pit_fr2, st->pit_max, st->pit_res_max, 1, &border_case ); + } + + i = ( norm_corr_2[1] > norm_corr_2[0] ) ? 1 : 0; + hTcxEnc->tcxltp_pitch_int = pitch_int_2[i]; + hTcxEnc->tcxltp_pitch_fr = pitch_fr_2[i]; + ltp_param[1] = pit_param_2[i]; + norm_corr = norm_corr_2[i]; + } + } + else + { + tcx_ltp_pitch_search( Top[1], &hTcxEnc->tcxltp_pitch_int, &hTcxEnc->tcxltp_pitch_fr, <p_param[1], &norm_corr, L_frame, wsp, st->pit_min, st->pit_fr1, st->pit_fr2, st->pit_max, st->pit_res_max, ( element_mode > EVS_MONO ) ? 1 : 0, &border_case ); + } + + if ( border_case ) + { + norm_corr = 0.0f; + } + if ( st->element_mode == IVAS_CPE_DFT ) + { + tempFlatness = GetTCXAvgTemporalFlatnessMeasure( st->hTranDet, NSUBBLOCKS - NSUBBLOCKS_SHIFT, ( NSUBBLOCKS_SHIFT + 1 ) + min( NSUBBLOCKS, (int16_t) ceil( 0.5f + NSUBBLOCKS * ( 1.0f * ( hTcxEnc->tcxltp_pitch_int ) / L_frame ) ) ) ); + + maxEnergyChange = GetTCXMaxenergyChange( st->hTranDet, tcxMode == TCX_10, NSUBBLOCKS - NSUBBLOCKS_SHIFT, ( NSUBBLOCKS_SHIFT + 1 ) + min( NSUBBLOCKS, (int16_t) ceil( 0.5f + NSUBBLOCKS * (float) ( hTcxEnc->tcxltp_pitch_int ) / (float) L_frame ) ) ); + } + else + { + tempFlatness = GetTCXAvgTemporalFlatnessMeasure( st->hTranDet, NSUBBLOCKS, 1 + min( NSUBBLOCKS, (int16_t) ceil( 0.5f + NSUBBLOCKS * ( 1.0f * ( hTcxEnc->tcxltp_pitch_int ) / L_frame ) ) ) ); + + maxEnergyChange = GetTCXMaxenergyChange( st->hTranDet, tcxMode == TCX_10, NSUBBLOCKS, 1 + min( NSUBBLOCKS, (int16_t) ceil( 0.5f + NSUBBLOCKS * (float) ( hTcxEnc->tcxltp_pitch_int ) / (float) L_frame ) ) ); + } + + /* Switch LTP on */ + if ( ( tcxOnly == 0 && tcxMode == TCX_20 && norm_corr * hTcxEnc->tcxltp_norm_corr_past > 0.25f && tempFlatness < 3.5f ) || + ( tcxOnly == 1 && tcxMode == TCX_10 && max( norm_corr, hTcxEnc->tcxltp_norm_corr_past ) > 0.5f && maxEnergyChange < 3.5f ) || + /* Use LTP for lower correlation when pitch lag is big, L_frame*(1.2f-norm_corr) < hTcxEnc->tcxltp_pitch_int <=> norm_corr > 1.2f-hTcxEnc->/L_frame */ + ( tcxOnly == 1 && norm_corr > 0.44f && L_frame * ( 1.2f - norm_corr ) < hTcxEnc->tcxltp_pitch_int ) || + ( tcxOnly == 1 && tcxMode == TCX_20 && norm_corr > 0.44f && ( tempFlatness < 6.0f || ( tempFlatness < 7.0f && maxEnergyChange < 22.0f ) ) ) ) + { + if ( disable_ltp == 0 ) + { + ltp_param[0] = 1; + } + } + + /* hysteresis for stable ltp prediction */ + ltp_on = 0; + if ( tcxOnly == 1 && st->element_mode == IVAS_CPE_MDCT && ( ( sqrt( (float) ( hTcxEnc->tcxltp_on_mem ) ) * (norm_corr) *0.9f ) > 0.44f && ( tempFlatness < 6.0f || ( tempFlatness < 7.0f && maxEnergyChange < 22.0f ) ) ) ) + { + ltp_on = 1; + } + + if ( tcxOnly == 1 && ltp_param[0] == 1 ) + { + /* increase ltp counter */ + hTcxEnc->tcxltp_on_mem = min( 5, hTcxEnc->tcxltp_on_mem + 1 ); + } + else if ( ltp_on == 1 ) + { + /* hysteresis takes effect, decrease counter */ + hTcxEnc->tcxltp_on_mem = max( 0, hTcxEnc->tcxltp_on_mem - 1 ); + ltp_param[0] = ltp_on; + } + else + { + /* no ltp in this frame, reset counter */ + hTcxEnc->tcxltp_on_mem = 0; + } + } + + /* Find predicted signal */ + predict_signal( speech, pred_speech, hTcxEnc->tcxltp_pitch_int, hTcxEnc->tcxltp_pitch_fr, st->pit_res_max, L_frame ); + + /* Find gain */ + tcx_ltp_find_gain( speech, pred_speech, L_frame, &hTcxEnc->tcxltp_gain, <p_param[2] ); + + if ( ltp_param[0] ) + { + /* Total number of bits for LTP */ + if ( ltp_param[2] + 1 ) /* hTcxEnc->tcxltp_gain > 0 */ + { + *ltp_bits = 12; + } + else /* hTcxEnc->tcxltp_gain <= 0 -> turn off LTP */ + { + ltp_param[0] = 0; + } + } + + if ( !ltp_param[0] ) + { + /* No LTP -> set everything to zero */ + hTcxEnc->tcxltp_pitch_int = L_frame; + hTcxEnc->tcxltp_pitch_fr = 0; + ltp_param[1] = 0; + set_zero( pred_speech, L_frame ); + hTcxEnc->tcxltp_gain = 0.f; + ltp_param[2] = 0; + if ( hTcxEnc->tcxltp || SideInfoOnly ) + { + *ltp_bits = 1; + } + else + { + *ltp_bits = 0; + } + } + + si_gain = 0; + if ( SideInfoOnly ) + { + si_gain = hTcxEnc->tcxltp_gain; + hTcxEnc->tcxltp_gain = 0.f; + } + + if ( speech_ltp != NULL ) + { + if ( hTcxEnc->tcxltp_gain_past == 0.f && hTcxEnc->tcxltp_gain == 0.f ) + { + mvr2r( speech, speech_ltp, L_subfr ); + } + else if ( hTcxEnc->tcxltp_gain_past == 0.f ) + { + alpha = 0.f; + step = 1.f / (float) ( L_subfr ); + for ( n = 0; n < L_subfr; n++ ) + { + speech_ltp[n] = speech[n] - alpha * hTcxEnc->tcxltp_gain * pred_speech[n]; + alpha += step; + } + } + else + { + if ( A == NULL ) + { + for ( i = 0; i <= M; i++ ) + { + s = 0.0; + for ( j = 0; j < L_frame - i; j++ ) + { + s += speech[j - L_frame] * speech[j + i - L_frame]; + } + r[i] = s; + } + if ( r[0] < 100.0f ) + { + r[0] = 100.0f; + } + r[0] *= 1.0001f; + lev_dur( Aest, r, M, NULL ); + A = Aest; + } + + if ( hTcxEnc->tcxltp_gain > 0.f ) + { + predict_signal( speech - M, buf_zir, hTcxEnc->tcxltp_pitch_int, hTcxEnc->tcxltp_pitch_fr, st->pit_res_max, M ); + } + else + { + set_f( buf_zir, 0.0f, M ); + } + + for ( n = 0; n < M; n++ ) + { + buf_zir[n] = speech_ltp[n - M] - speech[n - M] + hTcxEnc->tcxltp_gain * buf_zir[n]; + } + + zir = buf_zir + M; + set_f( zir, 0.0f, L_subfr ); + syn_filt( A, M, zir, zir, L_subfr, buf_zir, 0 ); + alpha = 1.f; + step = 1.f / (float) ( L_subfr / 2 ); + + for ( n = L_subfr / 2; n < L_subfr; n++ ) + { + zir[n] *= alpha; + alpha -= step; + } + + for ( n = 0; n < L_subfr; n++ ) + { + speech_ltp[n] = ( speech[n] - hTcxEnc->tcxltp_gain * pred_speech[n] ) + zir[n]; + } + } + + if ( SideInfoOnly || hTcxEnc->tcxltp_gain == 0.0f ) + { + for ( n = L_subfr; n < L_frame; n++ ) + { + speech_ltp[n] = speech[n]; + } + } + else + { + for ( n = L_subfr; n < L_frame; n++ ) + { + speech_ltp[n] = speech[n] - hTcxEnc->tcxltp_gain * pred_speech[n]; + } + } + } + + /* Update */ + hTcxEnc->tcxltp_pitch_int_past = hTcxEnc->tcxltp_pitch_int; + hTcxEnc->tcxltp_pitch_fr_past = hTcxEnc->tcxltp_pitch_fr; + hTcxEnc->tcxltp_gain_past = hTcxEnc->tcxltp_gain; + + if ( SideInfoOnly ) + { + hTcxEnc->tcxltp_gain = si_gain; + } + + hTcxEnc->tcxltp_norm_corr_past = norm_corr; + + return; +} diff --git a/lib_enc/tcx_utils_enc.c b/lib_enc/tcx_utils_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..31473d4043df96193e7f8b556551d1e714984fa1 --- /dev/null +++ b/lib_enc/tcx_utils_enc.c @@ -0,0 +1,1608 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include "options.h" +#include +#include "prot.h" +#include "rom_com.h" +#include "cnst.h" +#include "wmc_auto.h" +#include "ivas_prot.h" + +/*---------------------------------------------------------------------* + * ComputeSpectrumNoiseMeasure() + * + * compute noise-measure flags for spectrum filling and quantization (0: tonal, 1: noise-like) + *---------------------------------------------------------------------*/ + +void ComputeSpectrumNoiseMeasure( + const float *powerSpec, + const int16_t L_frame, + const int16_t startLine, + const int16_t resetMemory, + int16_t *noiseFlags, + const int16_t lowpassLine ) +{ + int16_t i, lastTone; + float s, c; + + if ( resetMemory ) + { + for ( i = 0; i < lowpassLine; i++ ) + { + noiseFlags[i] = 0; + } + } + for ( i = lowpassLine; i < L_frame; i++ ) + { + noiseFlags[i] = 1; + } + + if ( powerSpec && startLine + 6 < L_frame ) + { + lastTone = 0; + /* noise-measure flags for spectrum filling and quantization (0: tonal, 1: noise-like) */ + i = startLine - 1; + s = powerSpec[i - 7] + powerSpec[i - 6] + powerSpec[i - 5] + + powerSpec[i - 4] + powerSpec[i - 3] + powerSpec[i - 2] + + powerSpec[i - 1] + powerSpec[i] + powerSpec[i + 1] + + powerSpec[i + 2] + powerSpec[i + 3] + powerSpec[i + 4] + + powerSpec[i + 5] + powerSpec[i + 6] + powerSpec[i + 7]; + + for ( i++; i < lowpassLine - 7; i++ ) + { + c = powerSpec[i - 1] + powerSpec[i] + powerSpec[i + 1]; + s += powerSpec[i + 7] - powerSpec[i - 8]; + if ( s >= ( 1.75f - 0.5f * noiseFlags[i] ) * c ) + { + noiseFlags[i] = 1; + } + else + { + noiseFlags[i] = 0; + lastTone = i; + } + } + /* lower L_frame*startRatio lines are tonal (0), upper 7 lines are processed separately */ + for ( ; i < lowpassLine - 1; i++ ) + { + c = powerSpec[i - 1] + powerSpec[i] + powerSpec[i + 1]; + /* running sum can't be updated any more, just use the latest one */ + if ( s >= ( 1.75f - 0.5f * noiseFlags[i] ) * c ) + { + noiseFlags[i] = 1; + } + else + { + noiseFlags[i] = 0; + /* lastTone = i; */ + } + } + noiseFlags[i] = 1; /* uppermost line is defined as noise-like (1) */ + + if ( lastTone > 0 ) /* spread uppermost tonal line one line upward */ + { + noiseFlags[lastTone + 1] = 0; + } + } + + return; +} + + +/*---------------------------------------------------------------------* + * detectLowpassFac() + * + * + *---------------------------------------------------------------------*/ + +static void detectLowpassFac( + const float *powerSpec, + const int16_t L_frame, + const int16_t rectWin, + float *pLpFac, + const int16_t lowpassLine ) +{ + int16_t i; + float threshold; + + threshold = 0.1f * 2 * NORM_MDCT_FACTOR; + if ( rectWin ) + { + /* compensate for bad side-lobe attenuation with asymmetric windows */ + threshold *= 2.f; + } + + for ( i = lowpassLine - 1; i >= lowpassLine / 2; i-- ) + { + if ( powerSpec[i] > threshold ) + { + break; + } + } + + *pLpFac = ( 0.3f * ( *pLpFac ) ) + ( 0.7f * ( (float) ( i + 1 ) / (float) L_frame ) ); + + return; +} + +/*-----------------------------------------------------------* + * Compute noise-measure flags for spectrum filling * + * and quantization (0: tonal, 1: noise-like). * + * Detect low pass if present. * + *-----------------------------------------------------------*/ + +void AnalyzePowerSpectrum( + Encoder_State *st, /* i/o: encoder states */ + const int16_t L_frame, /* i : frame length */ + const int16_t L_frameTCX, /* i : full band frame length */ + const int16_t left_overlap, /* i : left overlap length */ + const int16_t right_overlap, /* i : right overlap length */ + const float mdctSpectrum[], /* i : MDCT spectrum */ + const float signal[], /* i : windowed signal corresponding to mdctSpectrum */ + float powerSpec[] /* o : Power spectrum. Can point to signal */ +) +{ + TCX_ENC_HANDLE hTcxEnc = st->hTcxEnc; + int16_t i, iStart, iEnd, lowpassLine; + + lowpassLine = L_frameTCX; + iStart = 0; + iEnd = L_frameTCX; + + TCX_MDST( signal, powerSpec, left_overlap, L_frameTCX - ( left_overlap + right_overlap ) / 2, right_overlap, st->element_mode ); + + if ( st->narrowBand ) + { + attenuateNbSpectrum( L_frameTCX, powerSpec ); + } + + /* power spectrum: MDCT^2 + MDST^2 */ + for ( i = iStart; i < iEnd; i++ ) + { + powerSpec[i] *= powerSpec[i]; + powerSpec[i] += mdctSpectrum[i] * mdctSpectrum[i]; + } + + ComputeSpectrumNoiseMeasure( powerSpec, L_frameTCX, hTcxEnc->nmStartLine * L_frame / st->L_frame, ( st->L_frame * st->last_sr_core != st->L_frame_past * st->sr_core ) || ( st->last_core != TCX_20_CORE ), hTcxEnc->memQuantZeros, lowpassLine ); + + if ( st->total_brate <= ACELP_24k40 ) + { + lowpassLine = (int16_t) ( 2.0f * st->hTcxCfg->bandwidth * L_frame ); + detectLowpassFac( powerSpec, L_frame, ( st->last_core == ACELP_CORE ), &hTcxEnc->measuredBwRatio, lowpassLine ); + } + else + { + hTcxEnc->measuredBwRatio = 1.0f; + } + + return; +} + + +/*---------------------------------------------------------------------* + * mdct_preShaping() + * + * + *---------------------------------------------------------------------*/ + +void mdct_preShaping( + float x[], + const int16_t lg, + const float gains[] ) +{ + int16_t i, j, k, l; + float g; + int16_t m, n, k1, k2; + + j = 0; /* not counted, is included in ptr init */ + /* FDNS_NPTS = 64 !!! */ + k = lg / FDNS_NPTS; + m = lg % FDNS_NPTS; + if ( m ) + { + if ( m <= ( FDNS_NPTS / 2 ) ) + { + n = FDNS_NPTS / m; + k1 = k; + k2 = k + 1; + } + else + { + n = FDNS_NPTS / ( FDNS_NPTS - m ); + k1 = k + 1; + k2 = k; + } + for ( i = 0; i < lg; ) + { + if ( j % n ) + { + k = k1; + } + else + { + k = k2; + } + g = 1.f / gains[j++]; + + /* Limit number of loops, if end is reached */ + k = min( k, lg - i ); + for ( l = 0; l < k; l++ ) + { + x[i++] *= g; + } + } + } + else + { + for ( i = 0; i < lg; ) + { + g = 1.f / gains[j++]; + for ( l = 0; l < k; l++ ) + { + x[i++] *= g; + } + } + } + + return; +} + + +/*---------------------------------------------------------------------* + * AdaptLowFreqEmph() + * + * + *---------------------------------------------------------------------*/ + +void AdaptLowFreqEmph( + float x[], + int16_t xq[], + float invGain, + const int16_t tcx_lpc_shaped_ari, + const float lpcGains[], + const int16_t lg ) +{ + int16_t i, i_max, i_max_old; + + if ( !tcx_lpc_shaped_ari ) + { + /* 1. find first magnitude maximum in lower quarter of spectrum */ + invGain *= 2.0f; + i_max = -1; + for ( i = 0; i < lg / 4; i++ ) + { + if ( ( ( xq[i] <= -2 ) || ( xq[i] >= 2 ) ) && + ( ( invGain * x[i] <= -3.625f ) || ( invGain * x[i] >= 3.625f ) ) ) + { + xq[i] += ( xq[i] < 0 ) ? -2 : 2; + i_max = i; + break; + } + } + /* 2. compress value range of all xq up to i_max: add two steps */ + for ( i = 0; i < i_max; i++ ) + { + if ( x[i] < 0.0f ) + { + xq[i] = (int16_t) ( invGain * x[i] - 0.375f ); + } + else + { + xq[i] = (int16_t) ( invGain * x[i] + 0.375f ); + } + } + /* 3. find first mag. maximum below i_max which is half as high */ + i_max_old = i_max; + if ( i_max_old > -1 ) + { + invGain *= 2.0f; + i_max = -1; /* reset first maximum, update inverse gain */ + for ( i = 0; i < lg / 4; i++ ) + { + if ( ( ( xq[i] <= -2 ) || ( xq[i] >= 2 ) ) && + ( ( invGain * x[i] <= -3.625f ) || ( invGain * x[i] >= 3.625f ) ) ) + { + xq[i] += ( xq[i] < 0 ) ? -2 : 2; + i_max = i; + break; + } + } + } + /* 4. re-compress and quantize all xq up to half-height i_max+1 */ + for ( i = 0; i < i_max; i++ ) + { + if ( x[i] < 0.0f ) + { + xq[i] = (int16_t) ( invGain * x[i] - 0.375f ); + } + else + { + xq[i] = (int16_t) ( invGain * x[i] + 0.375f ); + } + } + /* 5. always compress 2 lines; lines could be at index 0 and 1! */ + if ( i_max_old > -1 ) + { + invGain *= 0.5f; /* reset inverse gain */ + if ( i_max < i_max_old ) + { + i_max = i_max_old; + } + } + i = i_max + 1; + + if ( x[i] < 0.0f ) + { + xq[i] = ( invGain * x[i] <= -3.625f ) ? xq[i] - 2 : (int16_t) ( invGain * x[i] - 0.375f ); + } + else + { + xq[i] = ( invGain * x[i] >= 3.625f ) ? xq[i] + 2 : (int16_t) ( invGain * x[i] + 0.375f ); + } + i++; + if ( x[i] < 0.0f ) + { + xq[i] = ( invGain * x[i] <= -3.625f ) ? xq[i] - 2 : (int16_t) ( invGain * x[i] - 0.375f ); + } + else + { + xq[i] = ( invGain * x[i] >= 3.625f ) ? xq[i] + 2 : (int16_t) ( invGain * x[i] + 0.375f ); + } + } + else + { + PsychAdaptLowFreqEmph( x, lpcGains ); + } + + return; +} + + +/*---------------------------------------------------------------------* + * PsychAdaptLowFreqEmph() + * + * + *---------------------------------------------------------------------*/ + +void PsychAdaptLowFreqEmph( + float x[], + const float lpcGains[] ) +{ + int16_t i; + float max_val, fac, tmp; + max_val = tmp = lpcGains[0]; + + /* find minimum (tmp) and maximum (max) of LPC gains in low frequencies */ + for ( i = 1; i < 9; i++ ) + { + if ( tmp > lpcGains[i] ) + { + tmp = lpcGains[i]; + } + if ( max_val < lpcGains[i] ) + { + max_val = lpcGains[i]; + } + } + tmp *= 32.0f; + if ( ( max_val < tmp ) && ( max_val > FLT_MIN ) ) + { + fac = tmp = (float) pow( tmp / max_val, 0.0078125f ); + + /* gradual boosting of lowest 32 bins; DC is boosted by (tmp/max)^1/4 */ + for ( i = 31; i >= 0; i-- ) + { + x[i] *= fac; + fac *= tmp; + } + } + + return; +} + +/*---------------------------------------------------------------------* + * SQ_gain() + * + * + *---------------------------------------------------------------------*/ + +/*! r: SQ gain */ +float SQ_gain( + const float x[], /* i : vector to quantize */ + const int16_t nbitsSQ, /* i : number of bits targeted */ + const int16_t lg /* i : vector size (2048 max) */ +) +{ + int16_t i, iter; + float ener, tmp, target, fac, offset; + float en[N_MAX / 2]; + + /* energy of quadruples with 9dB offset */ + for ( i = 0; i < lg; i += 4 ) + { + ener = 0.01f + x[i] * x[i] + x[i + 1] * x[i + 1] + x[i + 2] * x[i + 2] + x[i + 3] * x[i + 3]; + en[i >> 2] = (float) log10( ener ); + } + + /* SQ scale: 4 bits / 6 dB per quadruple */ + target = 0.15f * (float) ( nbitsSQ - ( lg >> 4 ) ); + fac = 12.8f; + offset = fac; + + /* find offset (0 to 128 dB with step of 0.125dB) */ + for ( iter = 0; iter < 10; iter++ ) + { + fac *= 0.5f; + offset -= fac; + ener = 0.0f; + + for ( i = 0; i < lg / 4; i++ ) + { + tmp = en[i] - offset; + + /* avoid SV with 1 bin of amp < 0.5f */ + if ( tmp > 0.3f ) + { + ener += tmp; + + /* if ener is above target -> break and increase offset */ + if ( ener > target ) + { + offset += fac; + break; + } + } + } + } + + /* return gain */ + return (float) pow( 10.0f, 0.45f + 0.5f * offset ); +} + + +/*---------------------------------------------------------------------* + * SQ_gain_estimate() + * + * + *---------------------------------------------------------------------*/ + +/*! r: SQ gain */ +float SQ_gain_estimate( + const float x[], /* i : vector to quantize */ + const int16_t nbitsSQ, /* i : number of bits targeted */ + const int16_t lg /* i : vector size (2048 max) */ +) +{ + int16_t i, iter, max_iter; + float ener, tmp, target, fac, offset; + float en[N_MAX / 2]; + float minGainInv = 0.5f * (float) log10( (float) lg / (float) NORM_MDCT_FACTOR ); /* lowest possible quantized gain */ + + tmp = minGainInv + 0.94f; /* lowest gain + expected value of the quantization noise energy per quadruple (log10(4/12)) */ + /* SNR of quadruples for unit step quantizer and lowest possible gain */ + for ( i = 0; i < lg; i += 4 ) + { + ener = 0.01f + x[i] * x[i] + x[i + 1] * x[i + 1] + x[i + 2] * x[i + 2] + x[i + 3] * x[i + 3]; + en[i >> 2] = (float) log10( ener ) + tmp; + } + + /* SQ scale: 4 bits / 6 dB per quadruple */ + target = 0.15f * (float) ( nbitsSQ - ( lg >> 4 ) ); + fac = 18.4f; + max_iter = 8; /* for 0.36dB steps */ + offset = fac - fac / (float) ( 2 << max_iter ); + + /* find offset, resolution similar to SQ gain quantizer resolution (92dB range, 0.719db resolution) */ + for ( iter = 0; iter < max_iter; iter++ ) + { + fac *= 0.5f; + offset -= fac; + ener = 0.0f; + + for ( i = 0; i < lg / 4; i++ ) + { + tmp = en[i] - offset; + + /* avoid SV with 1 bin of amp < 0.5f */ + if ( tmp > 0.3f ) + { + ener += tmp; + + /* if SNR is above target -> break and increase offset */ + if ( ener > target ) + { + offset += fac; + break; + } + } + } + } + + /* return gain */ + return (float) pow( 10.0f, 0.5f * offset - minGainInv ); +} + +/*---------------------------------------------------------------------* + * tcx_scalar_quantization() + * + * + *---------------------------------------------------------------------*/ + +void tcx_scalar_quantization( + float *x, /* i : input coefficients */ + int16_t *xq, /* o : quantized coefficients */ + const int16_t L_frame, /* i : frame length */ + const float gain, /* i : quantization gain */ + const float offset, /* i : rounding offset (deadzone) */ + int16_t *memQuantZeros, /* o : coefficients set to 0 */ + const int16_t tcxonly ) +{ + int16_t i; + float gainInv, rounding, rounding2; + + /* Init scalar quantizer */ + gainInv = 1.0f / gain; + rounding = offset; + rounding2 = -offset; + + if ( memQuantZeros == NULL ) + { + i = L_frame - 1; + } + else + { + for ( i = L_frame - 1; ( memQuantZeros[i] ) && ( (float) fabs( x[i] ) * gainInv < 1.0f ); i-- ) + { + xq[i] = 0; + } + } + + for ( ; i >= 0; i-- ) + { + if ( x[i] > 0.f ) + { + xq[i] = ( (int16_t) min( MAX16B, ( rounding + x[i] * gainInv ) ) ); + } + else + { + /* limit to -32767 (although 16 bit would allow -32768) - avoids potential issues in arithmetic coding routines, where a sign flip is happening */ + xq[i] = ( (int16_t) max( -32767, ( rounding2 + x[i] * gainInv ) ) ); + } + } + + if ( !tcxonly ) + { + AdaptLowFreqEmph( x, xq, gainInv, 0, NULL, L_frame ); + } + + return; +} + + +/*---------------------------------------------------------------------* + * tcx_scalar_quantization_rateloop() + * + * + *---------------------------------------------------------------------*/ + +int16_t tcx_scalar_quantization_rateloop( + float *x, /* i : input coefficients */ + int16_t *xq, /* o : quantized coefficients */ + const int16_t L_frame, /* i : frame length */ + float *gain, /* i/o: quantization gain */ + float offset, /* i : rounding offset (deadzone) */ + int16_t *memQuantZeros, /* o : coefficients set to 0 */ + int16_t *lastnz_out, /* i/o: last nonzero coeff index */ + const int16_t target, /* i : target number of bits */ + int16_t *nEncoded, /* o : number of encoded coeff */ + int16_t *stop, /* i/o: stop param */ + const int16_t sqBits_in_noStop, /* i : number of sqBits as determined in prev. quant. stage, w/o using stop mechanism (ie might exceed target bits) */ + const int16_t sqBits_in, /* i : number of sqBits as determined in prev. quant. stage, using stop mechanism (ie always <= target bits) */ + const int16_t tcxRateLoopOpt, /* i : turns on/off rateloop optimization */ + const int16_t tcxonly, + CONTEXT_HM_CONFIG *hm_cfg, + const int16_t iter_max, + const int16_t element_mode ) +{ + int16_t sqBits, stopFlag; + int16_t ubfound, lbfound; + float ub = 0.f, lb = 0.f; + float shift; + int16_t iter; + float sqGain; + float w_lb, w_ub; + const int16_t kDampen = 10; + int16_t old_stopFlag, old_nEncoded, old_sqBits; + float mod_adjust0, mod_adjust1; + float inv_target; + const float kMargin = 0.96f; + int16_t lastnz; + int16_t saturated; + float minSqGain; + + /* Init */ + saturated = 0; + minSqGain = (float) sqrt( (float) NORM_MDCT_FACTOR / (float) L_frame ); + + sqGain = *gain; + stopFlag = *stop; + ubfound = 0; + lbfound = 0; + shift = 0.25f; + w_lb = 0.0f; + w_ub = 0.0f; + lastnz = *lastnz_out; + + old_stopFlag = stopFlag; + old_nEncoded = *nEncoded; + old_sqBits = sqBits_in_noStop; + + sqBits = sqBits_in; + + mod_adjust0 = max( 1.0f, 2.3f - 0.0025f * target ); + mod_adjust1 = 1.0f / mod_adjust0; + + inv_target = 1.0f / (float) target; + + /* Loop */ + for ( iter = 0; iter < iter_max; iter++ ) + { + if ( tcxRateLoopOpt >= 2 ) + { + /* Ajust sqGain */ + if ( stopFlag ) + { + lbfound = 1; + lb = sqGain; + w_lb = (float) ( stopFlag - target + kDampen ); + saturated = 0; + + if ( ubfound ) + { + sqGain = ( lb * w_ub + ub * w_lb ) / ( w_ub + w_lb ); + } + else + { + sqGain *= ( 1.0f + ( (float) ( stopFlag / kMargin ) * inv_target - 1.0f ) * mod_adjust0 ); + } + } + else if ( saturated == 0 ) + { + ubfound = 1; + ub = sqGain; + w_ub = (float) ( target - sqBits + kDampen ); + if ( lbfound ) + { + sqGain = ( lb * w_ub + ub * w_lb ) / ( w_ub + w_lb ); + } + else + { + sqGain *= ( 1.0f - ( 1.0f - (float) ( sqBits * kMargin ) * inv_target ) * mod_adjust1 ); + } + + if ( tcxRateLoopOpt == 3 && sqGain < minSqGain ) + { + sqGain = minSqGain; + saturated = 1; + } + } + else + { + break; /* we cannot go any lower anyway*/ + } + } + else /* tcxRateLoopOpt != 2 */ + { + /* Ajust sqGain */ + if ( stopFlag ) + { + lbfound = 1; + lb = sqGain; + if ( ubfound ) + { + sqGain = (float) sqrt( lb * ub ); + } + else + { + sqGain = sqGain * (float) pow( 10.0f, shift / 10.0f ); + shift *= 2.0f; + } + } + else + { + ubfound = 1; + ub = sqGain; + if ( lbfound ) + { + sqGain = (float) sqrt( lb * ub ); + } + else + { + sqGain = sqGain * (float) pow( 10.0f, -shift / 10.0f ); + shift *= 2.0f; + } + } + } + + /* Quantize spectrum */ + tcx_scalar_quantization( x, xq, L_frame, sqGain, offset, memQuantZeros, tcxonly ); + + /* Estimate bitrate */ + if ( tcxRateLoopOpt >= 1 ) + { + stopFlag = 0; + } + else + { + stopFlag = 1; + } + + if ( element_mode > EVS_MONO ) + { + sqBits = RCcontextMapping_encode2_estimate_no_mem_s17_LCS( xq, L_frame, &lastnz, nEncoded, target, &stopFlag, 0, hm_cfg ); + } + else + { + sqBits = ACcontextMapping_encode2_estimate_no_mem_s17_LC( xq, L_frame, &lastnz, nEncoded, target, &stopFlag, hm_cfg ); + } + + if ( tcxRateLoopOpt >= 1 ) + { + if ( ( *nEncoded >= old_nEncoded && ( stopFlag >= old_stopFlag ) ) || ( *nEncoded > old_nEncoded && ( stopFlag == 0 && old_stopFlag > 0 ) ) || ( stopFlag == 0 && old_stopFlag == 0 ) ) + { + *gain = sqGain; + old_nEncoded = *nEncoded; + old_stopFlag = stopFlag; + old_sqBits = sqBits; + *lastnz_out = lastnz; + } + } + } /* for ( iter=0; iter= 1 ) + { + /* Quantize spectrum */ + tcx_scalar_quantization( x, xq, L_frame, *gain, offset, memQuantZeros, tcxonly ); + + /* Output */ + *nEncoded = old_nEncoded; + sqBits = old_sqBits; + *stop = old_stopFlag; + } + else + { + /* Output */ + *gain = sqGain; + *stop = stopFlag; + *lastnz_out = lastnz; + } + + return sqBits; +} + +/*---------------------------------------------------------------------* + * tcx_QuantizeGain() + * + * + *---------------------------------------------------------------------*/ + +void tcx_QuantizeGain( + const int16_t n, + float *pGain, + int16_t *pQuantizedGain ) +{ + float ener, gain; + int16_t quantizedGain; + + ener = (float) sqrt( (float) n / (float) NORM_MDCT_FACTOR ); + + gain = *pGain * ener; + + assert( gain > 0 ); + + /* quantize gain with step of 0.714 dB */ + quantizedGain = (int16_t) floor( 0.5f + 28.0f * (float) log10( gain ) ); + + if ( quantizedGain < 0 ) + { + quantizedGain = 0; + } + if ( quantizedGain > 127 ) + { + quantizedGain = 127; + } + + *pQuantizedGain = quantizedGain; + *pGain = (float) pow( 10.0f, ( (float) quantizedGain ) / 28.0f ) / ener; + + return; +} + +/*---------------------------------------------------------------------* + * tcx_noise_factor() + * + * + *---------------------------------------------------------------------*/ + +void tcx_noise_factor( + const float *x_orig, /* i : unquantized mdct coefficients */ + float *sqQ, /* i/o: quantized mdct coefficients */ + const int16_t iFirstLine, /* i : first coefficient to be considered */ + const int16_t lowpassLine, /* i : last nonzero coefficients after low-pass */ + const int16_t nTransWidth, /* i : minimum size of hole to be checked */ + const int16_t L_frame, /* i : frame length */ + const float gain_tcx, /* i : tcx gain */ + const float tiltCompFactor, /* i : LPC tilt compensation factor */ + float *fac_ns, /* o : noise factor */ + int16_t *quantized_fac_ns, /* o : quantized noise factor */ + const int16_t element_mode /* i : IVAS element mode */ +) +{ + int16_t i, k, win, segmentOffset; + float inv_gain2 = 0.f, sqErrorNrg, n, tilt_factor, tmp; + float att; /* noise level attenuation factor for transient windows */ + + /*Adjust noise filling level*/ + sqErrorNrg = 0.0f; + n = 0.0f; + /* max() */ + tilt_factor = 1.0f / (float) pow( max( 0.375f, tiltCompFactor ), 1.0f / (float) L_frame ); /* 1/(a^b) = a^-b */ + inv_gain2 = 1.0f / ( (float) ( nTransWidth * nTransWidth ) * gain_tcx ); + + /* find last nonzero line below iFirstLine, use it as start offset */ + i = iFirstLine; + + if ( element_mode == IVAS_CPE_MDCT ) /* ... but only in mono or parametric stereo since it may cause binaural unmasking in discrete stereo */ + { + segmentOffset = i; + } + else + { + for ( ; i > ( iFirstLine >> 1 ); i-- ) + { + if ( sqQ[i] != 0.0f ) + { + break; + } + } + inv_gain2 *= (float) pow( tilt_factor, (float) i ); + segmentOffset = ++i; + } + + if ( nTransWidth <= 3 ) + { + att = tmp = FLT_MIN; + for ( k = i & 0xFFFE; k < lowpassLine; k++ ) + { + att += x_orig[k] * x_orig[k]; /* even-index bins, left sub-win */ + k++; + tmp += x_orig[k] * x_orig[k]; /* odd-index bins, right sub-win */ + } + att = (float) sqrt( ( min( att, tmp ) * 2.0f ) / ( att + tmp ) ); + } + else + { + att = 1.0f; + } + win = 0; + for ( ; i < lowpassLine; i++ ) + { + inv_gain2 *= tilt_factor; + if ( sqQ[i] != 0 ) /* current line is not zero, so reset pointers */ + { + if ( win > 0 ) /* add segment sum to sum of segment magnitudes */ + { + k = i - segmentOffset; + if ( nTransWidth <= 3 ) + { + n += ( k > 2 * nTransWidth - 4 ) ? (float) ( k - nTransWidth + 1 ) + : (float) ( k * k ) * 0.28125f / nTransWidth; /* table lookup instead of */ + } + else + { + n += ( k > 12 ) ? (float) k - 7.0f : (float) ( k * k ) * 0.03515625f; + } + for ( k = segmentOffset; k < i - win; k++ ) + { + sqErrorNrg += sqQ[k] * (float) nTransWidth; + sqQ[k] = 0; + } + for ( ; win > 0; win-- ) + { + sqErrorNrg += sqQ[k] * (float) win; + sqQ[k++] = 0; + } + } + segmentOffset = i + 1; /* new segment might start at next line */ + } + else /* current line is zero, so update pointers & segment sum */ + { + if ( win < nTransWidth ) + { + win++; + } + /* update segment sum: magnitudes scaled by smoothing function */ + sqQ[i] = (float) fabs( x_orig[i] ) * (float) win * inv_gain2; + } + } + if ( win > 0 ) /* add last segment sum to sum of segment magnitudes */ + { + k = i - segmentOffset; + if ( nTransWidth <= 3 ) + { + n += ( k > 2 * nTransWidth - 4 ) ? (float) ( k - nTransWidth + 1 ) + : (float) ( k * k ) * 0.28125f / nTransWidth; /* table lookup instead of */ + } + else + { + n += ( k > 12 ) ? (float) k - 7.0f : (float) ( k * k ) * 0.03515625f; + } + for ( k = segmentOffset; k < i - win; k++ ) + { + sqErrorNrg += sqQ[k] * (float) nTransWidth; + sqQ[k] = 0; + } + for ( ; win > 0; win-- ) + { + sqErrorNrg += sqQ[k] * (float) win; + sqQ[k++] = 0; + } + } + + /* noise level factor: average of segment magnitudes of noise bins */ + if ( n > 0.0f ) + { + *fac_ns = ( sqErrorNrg * att ) / n; + } + else + { + *fac_ns = 0.0f; + } + + /* quantize, dequantize noise level factor (range 0.09375 - 0.65625) */ + *quantized_fac_ns = (int16_t) ( 0.5f + *fac_ns * 1.34375f * ( 1 << NBITS_NOISE_FILL_LEVEL ) ); + if ( *quantized_fac_ns > ( 1 << NBITS_NOISE_FILL_LEVEL ) - 1 ) + { + *quantized_fac_ns = ( 1 << NBITS_NOISE_FILL_LEVEL ) - 1; + } + *fac_ns = (float) ( *quantized_fac_ns ) * 0.75f / ( 1 << NBITS_NOISE_FILL_LEVEL ); + + return; +} + + +/*---------------------------------------------------------------------* + * tcx_encoder_memory_update() + * + * + *---------------------------------------------------------------------*/ + +void tcx_encoder_memory_update( + Encoder_State *st, /* i/o: encoder memory state */ + float *xn_buf, /* i/o: mdct output buffer/time domain weigthed synthesis */ + const float *Ai, /* i : Unquantized (interpolated) LPC coefficients */ + const float *A /* i : Quantized LPC coefficients */ +) +{ + int16_t L_frame_glob; + float tmp; + float buf[1 + M + L_FRAME_PLUS]; + float *synth; + LPD_state *LPDmem = st->hLPDmem; + + L_frame_glob = st->L_frame; + + /* Output synth */ + mvr2r( xn_buf, st->synth, L_frame_glob ); + + /* Update synth */ + synth = buf + 1 + M; + mvr2r( LPDmem->syn, buf, 1 + M ); + + mvr2r( xn_buf, synth, L_frame_glob ); + mvr2r( synth + L_frame_glob - M - 1, LPDmem->syn, 1 + M ); + + if ( !st->tcxonly ) + { + /* Update weighted synthesis */ + residu( Ai + ( st->nb_subfr - 1 ) * ( M + 1 ), M, synth + L_frame_glob - 1, &tmp, 1 ); + LPDmem->mem_w0 = st->wspeech_enc[L_frame_glob - 1] - tmp; + } + + /* Emphasis of synth -> synth_pe */ + tmp = synth[-M - 1]; + preemph( synth - M, st->hTcxCfg->preemph_fac, M + L_frame_glob, &tmp ); + mvr2r( synth + L_frame_glob - M, LPDmem->mem_syn, M ); + mvr2r( synth + L_frame_glob - M, LPDmem->mem_syn2, M ); + mvr2r( synth + L_frame_glob - L_SYN_MEM, LPDmem->mem_syn_r, L_SYN_MEM ); + + if ( !st->tcxonly || ( L_frame_glob == L_FRAME16k ) ) + { + /* Update excitation */ + if ( L_frame_glob < L_EXC_MEM ) + { + mvr2r( LPDmem->old_exc + ( L_frame_glob ), LPDmem->old_exc, L_EXC_MEM - L_frame_glob ); + residu( A, M, synth, LPDmem->old_exc + L_EXC_MEM - ( L_frame_glob ), L_frame_glob ); + } + else + { + residu( A, M, synth + (L_frame_glob) -L_EXC_MEM, LPDmem->old_exc, L_EXC_MEM ); + } + } + + return; +} + + +/*---------------------------------------------------------------------* + * tcx_ari_res_Q_spec() + * + * Residual Quantization + *---------------------------------------------------------------------*/ + +/*! r: number of bits used (including "bits") */ +int16_t tcx_ari_res_Q_spec( + const float x_orig[], /* i : original spectrum */ + const int16_t signs[], /* i : signs (x_orig[.]<0) */ + float x_Q[], /* i/o: quantized spectrum */ + const int16_t L_frame, /* i : number of lines */ + const float gain, /* i : TCX gain */ + int16_t prm[], /* o : bitstream */ + int16_t target_bits, /* i : number of bits available */ + int16_t bits, /* i : number of bits used so far */ + const float deadzone, /* i : quantizer deadzone */ + const float x_fac[] /* i : spectrum post-quantization factors */ +) +{ + int16_t i, j, num_zeros; + int16_t zeros[L_FRAME_PLUS]; + float fac_m, fac_p, thres, x_Q_m, x_Q_p; + + /* Limit the number of residual bits */ + target_bits = min( target_bits, NPRM_RESQ ); + + + /* Requantize the spectrum line-by-line */ + fac_m = deadzone * 0.5f; + fac_p = 0.5f - fac_m; + num_zeros = 0; + + if ( x_fac == NULL ) + { + for ( i = 0; i < L_frame; ++i ) + { + if ( bits >= target_bits ) + { + /* no bits left */ + break; + } + if ( x_Q[i] != 0 ) + { + int16_t sign = ( 1 - 2 * signs[i] ); + + x_Q_m = x_Q[i] - sign * fac_m; + x_Q_p = x_Q[i] + sign * fac_p; + if ( fabs( x_orig[i] - gain * x_Q_m ) < fabs( x_orig[i] - gain * x_Q_p ) ) /* Decrease magnitude */ + { + x_Q[i] = x_Q_m; + prm[bits++] = 0; + } + else /* Increase magnitude */ + { + x_Q[i] = x_Q_p; + prm[bits++] = 1; + } + } + else + { + zeros[num_zeros++] = i; + } + } + + /* Requantize zeroed-lines of the spectrum */ + fac_p = ( 1.0f - deadzone ) * 0.33f; + --target_bits; /* reserve 1 bit for the check below */ + for ( j = 0; j < num_zeros; ++j ) + { + if ( bits >= target_bits ) + { + /* 1 or 0 bits left */ + break; + } + + i = zeros[j]; + + thres = fac_p; + if ( fabs( x_orig[i] ) > thres * gain ) + { + prm[bits++] = 1; + prm[bits++] = 1 - signs[i]; + x_Q[i] = ( 2 - 4 * signs[i] ) * thres; + } + else + { + prm[bits++] = 0; + } + } + + return bits; + } + + for ( i = 0; i < L_frame; ++i ) + { + if ( bits >= target_bits ) + { + /* no bits left */ + break; + } + if ( x_Q[i] != 0 ) + { + float sign = ( 1 - 2 * signs[i] ) * x_fac[i]; + + x_Q_m = x_Q[i] - sign * fac_m; + x_Q_p = x_Q[i] + sign * fac_p; + if ( fabs( x_orig[i] - gain * x_Q_m ) < fabs( x_orig[i] - gain * x_Q_p ) ) /* Decrease magnitude */ + { + x_Q[i] = x_Q_m; + prm[bits++] = 0; + } + else /* Increase magnitude */ + { + x_Q[i] = x_Q_p; + prm[bits++] = 1; + } + } + else + { + zeros[num_zeros++] = i; + } + } + + /* Requantize zeroed-lines of the spectrum */ + fac_p = ( 1.0f - deadzone ) * 0.33f; + --target_bits; /* reserve 1 bit for the check below */ + for ( j = 0; j < num_zeros; ++j ) + { + if ( bits >= target_bits ) + { + /* 1 or 0 bits left */ + break; + } + + i = zeros[j]; + + thres = fac_p * x_fac[i]; + if ( fabs( x_orig[i] ) > thres * gain ) + { + prm[bits++] = 1; + prm[bits++] = 1 - signs[i]; + x_Q[i] = ( 2 - 4 * signs[i] ) * thres; + } + else + { + prm[bits++] = 0; + } + } + + return bits; +} + + +/*---------------------------------------------------------------------* + * tcx_res_Q_gain() + * + * + *---------------------------------------------------------------------*/ + +#define kMaxEstimatorOvershoot 5 +#define kMaxEstimatorUndershoot 0 + +int16_t tcx_res_Q_gain( + float sqGain, + float *gain_tcx, + int16_t *prm, + int16_t sqTargetBits ) +{ + int16_t bits; + float gain_reQ; + + /*Refine the gain quantization : Normal greedy gain coding */ + gain_reQ = *gain_tcx; + for ( bits = 0; bits < TCX_RES_Q_BITS_GAIN; bits++ ) + { + if ( sqGain < gain_reQ ) + { + prm[bits] = 0; + gain_reQ *= gain_corr_inv_fac[bits]; + } + else + { + prm[bits] = 1; + gain_reQ *= gain_corr_fac[bits]; + } + if ( bits < sqTargetBits ) + { + *gain_tcx = gain_reQ; + } + } + + return ( bits ); +} + +/*---------------------------------------------------------------------* + * refine_0() + * + * + *---------------------------------------------------------------------*/ + +static void refine_0( + const float x_orig, + float *x_Q, + const float sqGain, + int16_t *prm, + int16_t *bits, + const float sq_round, + const float lf_deemph_factor ) +{ + float /*b,*/ thres; + /* was */ + /*b = x_orig/sqGain;*/ + thres = ( 1.0f - sq_round ) * 0.33f * lf_deemph_factor; + if ( x_orig > thres * sqGain ) + { + /* was (b > thres) */ + prm[( *bits )++] = 1; + prm[( *bits )++] = 1; + *x_Q = 2.f * thres; + } + else if ( x_orig < -thres * sqGain ) + { + /* was (b < -thres) */ + prm[( *bits )++] = 1; + prm[( *bits )++] = 0; + *x_Q = -2.f * thres; + } + else + { + prm[( *bits )++] = 0; + } + + return; +} + +/*---------------------------------------------------------------------* + * tcx_res_Q_spec() + * + * + *---------------------------------------------------------------------*/ + +int16_t tcx_res_Q_spec( + const float *x_orig, + float *x_Q, + const int16_t L_frame, + const float sqGain, + int16_t *prm, + int16_t sqTargetBits, + int16_t bits, + const float sq_round, + const float lf_deemph_factors[] ) +{ + int16_t i; + float fac_m, fac_p; + + /* Limit the number of residual bits */ + sqTargetBits = min( sqTargetBits, NPRM_RESQ ); + + /* Requantize the spectrum line-by-line */ + fac_p = 0.5f - sq_round * 0.5f; + fac_m = sq_round * 0.5f; + if ( !lf_deemph_factors ) + { + for ( i = 0; i < L_frame; i++ ) + { + if ( bits >= sqTargetBits - kMaxEstimatorUndershoot ) + { + fac_m = fac_p = 0; + if ( bits >= min( NPRM_RESQ, sqTargetBits + kMaxEstimatorOvershoot ) ) + { + break; + } + } + + if ( x_Q[i] != 0.0f ) + { + if ( x_orig[i] < (sqGain) *x_Q[i] ) + { + prm[bits++] = 0; + x_Q[i] -= ( x_Q[i] > 0 ) ? fac_m : fac_p; + } + else + { + prm[bits++] = 1; + x_Q[i] += ( x_Q[i] > 0 ) ? fac_p : fac_m; + } + } + } + sqTargetBits -= 2; /* Quantize zeroed lines of the spectrum */ + for ( i = 0; ( i < L_frame ) && ( bits < sqTargetBits ); i++ ) + { + /* bits < sqTargetBits */ + if ( x_Q[i] == 0.0f ) + { + refine_0( x_orig[i], &x_Q[i], sqGain, prm, &bits, sq_round, 1.0f ); /* inlined */ + } + } + /* Make sure that all possible bits are initialized */ + for ( i = bits; i < NPRM_RESQ; i++ ) + { + prm[i] = 0; + } + return bits; + } + for ( i = 0; i < L_frame; i++ ) + { + if ( bits >= sqTargetBits - kMaxEstimatorUndershoot ) + { + fac_m = fac_p = 0; + if ( bits >= min( NPRM_RESQ, sqTargetBits + kMaxEstimatorOvershoot ) ) + { + break; + } + } + + if ( x_Q[i] != 0 && lf_deemph_factors[i] > 0.5f ) + { + if ( x_orig[i] < (sqGain) *x_Q[i] ) + { + prm[bits++] = 0; + x_Q[i] -= ( x_Q[i] > 0 ) ? fac_m * lf_deemph_factors[i] : fac_p * lf_deemph_factors[i]; + } + else + { + prm[bits++] = 1; + x_Q[i] += ( x_Q[i] > 0 ) ? fac_p * lf_deemph_factors[i] : fac_m * lf_deemph_factors[i]; + } + } + } + + /*Quantize zeroed-line of the spectrum*/ + for ( i = 0; ( i < L_frame ) && ( bits < ( sqTargetBits - 2 ) ); i++ ) + { + /* For (bits >= (sqTargetBits-2)) */ + if ( x_Q[i] == 0 && lf_deemph_factors[i] > 0.5f ) + { + refine_0( x_orig[i], &x_Q[i], sqGain, prm, &bits, sq_round, lf_deemph_factors[i] ); + } + } + + /*Be sure that every possible bits are initialized*/ + for ( i = bits; i < NPRM_RESQ; i++ ) + { + prm[i] = 0; + } + + return bits; +} + + +/*---------------------------------------------------------------------* + * ProcessIGF() + * + * + *---------------------------------------------------------------------*/ + +void ProcessIGF( + Encoder_State *st, /* i : Encoder state */ + float *pMDCTSpectrum, /* i : MDCT spectrum */ + const float *pITFMDCTSpectrum, /* i : MDCT spectrum fir ITF */ + float *pPowerSpectrum, /* i : MDCT^2 + MDST^2 spectrum, or estimate */ + const int16_t isTCX20, /* i : flag indicating if the input is TCX20 or TCX10/2xTCX5 */ + const int16_t frameno, /* i : flag indicating index of current subframe */ + const int16_t sp_aud_decision0, /* i : first stage switching decision */ + const int16_t vad_hover_flag /* i : VAD hangover flag */ +) +{ + int16_t igfGridIdx, isIndepFlag, bsBits, pBsStart, curr_order; + float predictionGain; + float A[ITF_MAX_FILTER_ORDER + 1]; + + IGF_ENC_INSTANCE_HANDLE hIGFEnc = st->hIGFEnc; + BSTR_ENC_HANDLE hBstr = st->hBstr; + + isIndepFlag = 1; + if ( st->last_core == ACELP_CORE && isTCX20 ) + { + igfGridIdx = IGF_GRID_LB_TRAN; + } + else if ( isTCX20 ) + { + igfGridIdx = IGF_GRID_LB_NORM; + } + else + { + /* It is short block */ + igfGridIdx = IGF_GRID_LB_SHORT; + if ( frameno == 1 ) + { + isIndepFlag = 0; + } + } + + IGFSaveSpectrumForITF( hIGFEnc, igfGridIdx, pITFMDCTSpectrum ); + + IGFEncApplyMono( st, igfGridIdx, pMDCTSpectrum, pPowerSpectrum, isTCX20, st->hTcxEnc->fUseTns[frameno], sp_aud_decision0, vad_hover_flag ); + + curr_order = 0; + predictionGain = 0; + + ITF_Detect( hIGFEnc->spec_be_igf, hIGFEnc->infoStartLine, hIGFEnc->infoStopLine, 8 /*maxOrder*/, A, &predictionGain, &curr_order ); + + hIGFEnc->flatteningTrigger = hIGFEnc->tns_predictionGain < 1.15 && predictionGain < 1.15; + + hIGFEnc->infoTotalBitsPerFrameWritten = 0; + + if ( isTCX20 ) + { + IGFEncWriteBitstream( hIGFEnc, NULL, &hIGFEnc->infoTotalBitsPerFrameWritten, igfGridIdx, isIndepFlag ); + } + else + { + pBsStart = hBstr->nb_ind_tot; + + IGFEncWriteBitstream( hIGFEnc, hBstr, &hIGFEnc->infoTotalBitsPerFrameWritten, igfGridIdx, isIndepFlag ); + + bsBits = hBstr->nb_ind_tot - pBsStart; + IGFEncConcatenateBitstream( hIGFEnc, bsBits, hBstr ); + } + + return; +} + + +/*---------------------------------------------------------------------* + * ProcessStereoIGF() + * + * + *---------------------------------------------------------------------*/ + +void ProcessStereoIGF( + STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct, + Encoder_State *sts[CPE_CHANNELS], /* i : Encoder state */ + int16_t ms_mask[2][MAX_SFB], /* i : bandwise MS mask */ + float *pITFMDCTSpectrum[CPE_CHANNELS][NB_DIV], /* i : MDCT spectrum fir ITF */ + float *pPowerSpectrum[CPE_CHANNELS], /* i/o: MDCT^2 + MDST^2 spectrum, or estimate */ + float *pPowerSpectrumMsInv[CPE_CHANNELS][NB_DIV], /* i : inverse power spectrum */ + float *inv_spectrum[CPE_CHANNELS][NB_DIV], /* i : inverse spectrum */ + const int16_t frameno, /* i : flag indicating index of current subfr. */ + const int16_t sp_aud_decision0, /* i : sp_aud_decision0 */ + const int32_t element_brate, /* i : element bitrate */ + const int16_t mct_on /* i : flag mct block (1) or stereo (0) */ +) +{ + int16_t ch, igfGridIdx, isIndepFlag, bsBits, pBsStart, curr_order; + float predictionGain; + float A[ITF_MAX_FILTER_ORDER + 1]; + IGF_ENC_INSTANCE_HANDLE hIGFEnc[CPE_CHANNELS]; + BSTR_ENC_HANDLE hBstr; + + hIGFEnc[0] = sts[0]->hIGFEnc; + hIGFEnc[1] = sts[1]->hIGFEnc; + + isIndepFlag = 1; + + if ( sts[0]->last_core == ACELP_CORE && sts[0]->core == TCX_20_CORE ) + { + igfGridIdx = IGF_GRID_LB_TRAN; + } + else if ( sts[0]->core == TCX_20_CORE ) + { + igfGridIdx = IGF_GRID_LB_NORM; + } + else + { + /* It is short block */ + igfGridIdx = IGF_GRID_LB_SHORT; + if ( frameno == 1 ) + { + isIndepFlag = 0; + } + } + + IGFSaveSpectrumForITF( hIGFEnc[0], igfGridIdx, pITFMDCTSpectrum[0][frameno] ); + + IGFSaveSpectrumForITF( hIGFEnc[1], igfGridIdx, pITFMDCTSpectrum[1][frameno] ); + + IGFEncApplyStereo( hStereoMdct, ms_mask, hIGFEnc, igfGridIdx, sts, pPowerSpectrum, pPowerSpectrumMsInv, inv_spectrum, frameno, sp_aud_decision0, element_brate, mct_on ); + + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + curr_order = 0; + + ITF_Detect( hIGFEnc[ch]->spec_be_igf, hIGFEnc[ch]->infoStartLine, hIGFEnc[ch]->infoStopLine, 8 /*maxOrder*/, A, &predictionGain, &curr_order ); + + hIGFEnc[ch]->flatteningTrigger = hIGFEnc[ch]->tns_predictionGain < 1.15 && predictionGain < 1.15; + + hIGFEnc[ch]->infoTotalBitsPerFrameWritten = 0; + + if ( sts[ch]->core == TCX_20_CORE ) + { + IGFEncWriteBitstream( hIGFEnc[ch], NULL, &hIGFEnc[ch]->infoTotalBitsPerFrameWritten, igfGridIdx, isIndepFlag ); + } + else + { + hBstr = sts[ch]->hBstr; + pBsStart = hBstr->nb_ind_tot; + if ( ch > 0 ) + { + hBstr->ind_list = sts[0]->hBstr->ind_list + sts[0]->hBstr->nb_ind_tot; + } + IGFEncWriteBitstream( hIGFEnc[ch], hBstr, &hIGFEnc[ch]->infoTotalBitsPerFrameWritten, igfGridIdx, isIndepFlag ); + + bsBits = hBstr->nb_ind_tot - pBsStart; + IGFEncConcatenateBitstream( hIGFEnc[ch], bsBits, hBstr ); + } + } + + return; +} + +/*---------------------------------------------------------------------* + * attenuateNbSpectrum() + * + * + *---------------------------------------------------------------------*/ + +void attenuateNbSpectrum( + const int16_t L_frame, + float *spectrum ) +{ + int16_t i, length; + float att; + + length = L_frame / 20; + att = ( length == 8 ) ? 0.6f : 0.66f; + + for ( i = 0; i < length; i++ ) + { + spectrum[L_frame - length + i] *= att; + att *= att; + } + + return; +} diff --git a/lib_enc/tfa_enc.c b/lib_enc/tfa_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..50dd7c36687fd0faf46ecdc78805c99a99599b53 --- /dev/null +++ b/lib_enc/tfa_enc.c @@ -0,0 +1,120 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * tfaCalcEnv() + * + * + *-------------------------------------------------------------------*/ + +void tfaCalcEnv( + const float *shb_speech, + float *enr ) +{ + int16_t i, j, k; + for ( i = 0, k = 0; i < N_TEC_TFA_SUBFR; i++ ) + { + enr[i] = 1e-12f; + for ( j = 0; j < L_TEC_TFA_SUBFR16k; j++ ) /* XX/2 since Fs = 16kHz */ + { + enr[i] += shb_speech[k] * shb_speech[k]; + k++; + } + } + + return; +} + +/*-------------------------------------------------------------------* + * tfaEnc_TBE() + * + * + *-------------------------------------------------------------------*/ + +int16_t tfaEnc_TBE( + const float *enr, + const int16_t last_core, + const float *voicing, + const float *pitch_buf ) +{ + int16_t i; + float m_g, m_a; /* m_g: geometrical mean, m_a: arithmetical mean */ + float flatness = 0; + float voicing_sum; + int16_t tfa_flag; + + float pitch_buf_sum; + const float m_a_bottom = 10000.0 / N_TEC_TFA_SUBFR; + + tfa_flag = 0; + + m_a = 1e-12f; + m_g = 0.0; + for ( i = 0; i < N_TEC_TFA_SUBFR; i++ ) + { + m_a += enr[i]; + m_g = (float) ( m_g + log10( enr[i] ) ); + } + m_a /= N_TEC_TFA_SUBFR; + m_g /= N_TEC_TFA_SUBFR; + m_g = (float) pow( 10.0, m_g ); + + flatness = m_g / m_a; + + voicing_sum = voicing[0] + voicing[1]; + + pitch_buf_sum = pitch_buf[0] + pitch_buf[1] + pitch_buf[2] + pitch_buf[3]; + + if ( ( flatness > 0.70 && pitch_buf_sum > 4.0 * 110 && voicing_sum > 2.0 * 0.70 ) || + ( last_core == TCX_20_CORE && flatness > 0.50 && voicing_sum < 2.0 * 0.70 ) ) + { + tfa_flag = 1; + } + + /* energy lower limit */ + if ( m_a < m_a_bottom ) + { + tfa_flag = 0; + } + + return tfa_flag; +} diff --git a/lib_enc/tns_base_enc.c b/lib_enc/tns_base_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..594f7824111edb5568679dea1315f25c5a431918 --- /dev/null +++ b/lib_enc/tns_base_enc.c @@ -0,0 +1,485 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include "options.h" +#include "wmc_auto.h" +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "stat_com.h" + +/*---------------------------------------------------------------------------- + * Local constants + *---------------------------------------------------------------------------*/ + +#define HLM_MIN_NRG ( PCM16_TO_FLT_FAC * 2 * NORM_MDCT_FACTOR / ( 640 * 640 ) ) + +#define MAX_SUBDIVISIONS 3 + + +/*---------------------------------------------------------------------------- + * Local prototypes + *---------------------------------------------------------------------------*/ + +static void GetFilterParameters( const float rxx[], const int16_t maxOrder, STnsFilter *pTnsFilter ); + +static void Parcor2Index( const float parCoeff[], int16_t index[], const int16_t order ); + +static void TnsDecision( STnsConfig const *pTnsConfig, TRAN_DET_HANDLE hTranDet, const int16_t isTCX10, const float ltp_gain, STnsData *pTnsData ); + + +/*---------------------------------------------------------------------* + * DetectTnsFilt() + * + * + *---------------------------------------------------------------------*/ + +int16_t DetectTnsFilt( + const STnsConfig *pTnsConfig, /* i : TNS Configuration struct */ + const float pSpectrum[], /* i : MDCT spectrum */ + TRAN_DET_HANDLE hTranDet, /* i : transient detection handle */ + const int16_t isTCX10, /* i : TCX10 or TCX20? */ + const float ltp_gain, /* i : LTP gain */ + STnsData *pTnsData, /* o : TNS data struct */ + float *predictionGain /* o : TNS prediction gain */ +) +{ + ResetTnsData( pTnsData ); + + if ( pTnsConfig->maxOrder <= 0 ) + { + return 0; + } + + CalculateTnsFilt( pTnsConfig, pSpectrum, pTnsData, predictionGain ); + + TnsDecision( pTnsConfig, hTranDet, isTCX10, ltp_gain, pTnsData ); + + return ( pTnsData->nFilters > 0 ) ? 1 : 0; +} + + +/*---------------------------------------------------------------------* + * EncodeTnsData() + * + * + *---------------------------------------------------------------------*/ + +void EncodeTnsData( + STnsConfig const *pTnsConfig, /* i : TNS Configuration struct */ + STnsData const *pTnsData, /* i : TNS data struct (quantized param) */ + int16_t *stream, /* o : internal data stream */ + int16_t *pnSize, /* o : number of written parameters */ + int16_t *pnBits /* o : number of written bits */ +) +{ + *pnSize = 0; + *pnBits = 0; + + if ( pTnsConfig->nMaxFilters > 1 ) + { + if ( pTnsConfig->allowTnsOnWhite ) + { + if ( pTnsConfig->iFilterBorders[0] < 512 ) + { + GetParameters( &tnsEnabledOnWhiteSWBTCX10BitMap, 1, pTnsData, &stream, pnSize, pnBits ); + } + else + { + GetParameters( &tnsEnabledOnWhiteSWBTCX20BitMap, 1, pTnsData, &stream, pnSize, pnBits ); + } + } + else + { + if ( pTnsConfig->iFilterBorders[0] < 512 ) + { + GetParameters( &tnsEnabledSWBTCX10BitMap, 1, pTnsData, &stream, pnSize, pnBits ); + } + else + { + GetParameters( &tnsEnabledSWBTCX20BitMap, 1, pTnsData, &stream, pnSize, pnBits ); + } + } + } + else + { + GetParameters( &tnsEnabledWBTCX20BitMap, 1, pTnsData, &stream, pnSize, pnBits ); + } + + return; +} + + +/*---------------------------------------------------------------------* + * WriteTnsData() + * + * + *---------------------------------------------------------------------*/ + +void WriteTnsData( + const STnsConfig *pTnsConfig, /* i : TNS Configuration struct */ + const int16_t *stream, /* i : internal data stream */ + int16_t *pnSize, /* o : number of written parameters */ + BSTR_ENC_HANDLE hBstr, /* o : bitstream */ + int16_t *pnBits /* o : number of written bits */ +) +{ + if ( pTnsConfig->nMaxFilters > 1 ) + { + if ( pTnsConfig->allowTnsOnWhite ) + { + if ( pTnsConfig->iFilterBorders[0] < 512 ) + { + WriteToBitstream( &tnsEnabledOnWhiteSWBTCX10BitMap, 1, &stream, pnSize, hBstr, pnBits ); + } + else + { + WriteToBitstream( &tnsEnabledOnWhiteSWBTCX20BitMap, 1, &stream, pnSize, hBstr, pnBits ); + } + } + else + { + if ( pTnsConfig->iFilterBorders[0] < 512 ) + { + WriteToBitstream( &tnsEnabledSWBTCX10BitMap, 1, &stream, pnSize, hBstr, pnBits ); + } + else + { + WriteToBitstream( &tnsEnabledSWBTCX20BitMap, 1, &stream, pnSize, hBstr, pnBits ); + } + } + } + else + { + WriteToBitstream( &tnsEnabledWBTCX20BitMap, 1, &stream, pnSize, hBstr, pnBits ); + } + + return; +} + + +/*********************************************************************************************/ +/* Definitions of functions used in the mapping between TNS parameters and a bitstream. */ +/*********************************************************************************************/ + +/*---------------------------------------------------------------------* + * AutoToParcor() + * + * Autocorrelation to parcor coefficients + *---------------------------------------------------------------------*/ + +static float AutoToParcor( + const float input[], /* i : autocorrelation */ + float parCoeff[], /* o : parcor coeffs */ + const int16_t order /* i : prediction order */ +) +{ + int16_t i, j; + float tmp, tmp2; + float workBuffer[2 * TNS_MAX_FILTER_ORDER]; + float *const pWorkBuffer = &workBuffer[order]; /* temp pointer */ + + for ( i = 0; i < order; i++ ) + { + workBuffer[i] = input[i]; + pWorkBuffer[i] = input[i + 1]; + } + + for ( i = 0; i < order; i++ ) + { + if ( workBuffer[0] < 1.0f / 65536.0f ) + { + tmp = 0; + } + else + { + tmp = -pWorkBuffer[i] / workBuffer[0]; + } + + /* compensate for calculation inaccuracies limit reflection coefs to ]-1,1[ */ + tmp = min( 0.999f, max( -0.999f, tmp ) ); + + parCoeff[i] = tmp; + for ( j = i; j < order; j++ ) + { + tmp2 = pWorkBuffer[j] + tmp * workBuffer[j - i]; + workBuffer[j - i] += tmp * pWorkBuffer[j]; + pWorkBuffer[j] = tmp2; + } + } + + return ( ( input[0] + 1e-30f ) / ( workBuffer[0] + 1e-30f ) ); +} + + +/*---------------------------------------------------------------------* + * GetFilterParameters() + * + * Get TNS filter parameters from autocorrelation + *---------------------------------------------------------------------*/ + +static void GetFilterParameters( + const float rxx[], /* i : auto correlation */ + const int16_t maxOrder, /* i : max. prediction order */ + STnsFilter *pTnsFilter /* i : TNS filter coeffs */ +) +{ + int16_t i; + float parCoeff[TNS_MAX_FILTER_ORDER]; + const float *values = tnsCoeff4; + int16_t *indexes = pTnsFilter->coefIndex; + + /* Variable initialization */ + /* compute TNS filter in lattice (ParCor) form with LeRoux-Gueguen algorithm */ + pTnsFilter->predictionGain = AutoToParcor( rxx, parCoeff, maxOrder ); + + /* non-linear quantization of TNS lattice coefficients with given resolution */ + Parcor2Index( parCoeff, indexes, maxOrder ); + + /* reduce filter order by truncating trailing zeros */ + i = maxOrder - 1; + while ( ( i >= 0 ) && ( indexes[i] == 0 ) ) + { + --i; + /* Loop condition */ + } + pTnsFilter->order = i + 1; + + /* compute avg(coef*coef) */ + pTnsFilter->avgSqrCoef = 0; + for ( i = pTnsFilter->order - 1; i >= 0; i-- ) + { + const float value = values[indexes[i] + INDEX_SHIFT]; + + /* Variable initialization */ + pTnsFilter->avgSqrCoef += value * value; + } + pTnsFilter->avgSqrCoef /= maxOrder; + + return; +} + + +/*---------------------------------------------------------------------* + * Parcor2Index() + * + * Quantization for reflection coefficients + *---------------------------------------------------------------------*/ + +static void Parcor2Index( + const float parCoeff[], /* i : parcor coefficients */ + int16_t index[], /* o : quantized parcor coeffs */ + const int16_t order /* i : order */ +) +{ + const int16_t nValues = 1 << TNS_COEF_RES; + const float *values = tnsCoeff4; + int16_t i; + int16_t iIndex; + float x; + + for ( i = 0; i < order; i++ ) + { + iIndex = 1; + x = parCoeff[i]; + /* Variable initialization */ + assert( ( x >= -1.0f ) && ( x <= 1.0f ) ); + while ( ( iIndex < nValues ) && ( x > 0.5f * ( values[iIndex - 1] + values[iIndex] ) ) ) + { + ++iIndex; + /* Loop condition */ + } + index[i] = ( iIndex - 1 ) - INDEX_SHIFT; + } + + return; +} + + +/*---------------------------------------------------------------------* + * CalculateTnsFilt() + * + * + *---------------------------------------------------------------------*/ + +void CalculateTnsFilt( + STnsConfig const *pTnsConfig, /* i : TNS Configuration struct */ + const float pSpectrum[], /* i : MDCT spectrum */ + STnsData *pTnsData, /* o : TNS data struct */ + float *predictionGain /* o : TNS prediction gain */ +) +{ + float norms[TNS_MAX_NUM_OF_FILTERS][MAX_SUBDIVISIONS]; + int16_t i, iFilter, idx0, idx1, nSubdivisions, iSubdivisions, spectrumLength; + int16_t iStartLine, iEndLine, lag; + float fac; + float rxx[TNS_MAX_FILTER_ORDER + 1]; + const float *pWindow; + STnsFilter *pFilter; + + for ( i = 0; i < TNS_MAX_NUM_OF_FILTERS; i++ ) + { + set_f( norms[i], 0, MAX_SUBDIVISIONS ); + } + + /* Calculate norms for each spectrum part */ + for ( iFilter = 0; iFilter < pTnsConfig->nMaxFilters; iFilter++ ) + { + idx0 = pTnsConfig->iFilterBorders[iFilter + 1]; + idx1 = pTnsConfig->iFilterBorders[iFilter]; + nSubdivisions = pTnsConfig->pTnsParameters[iFilter].nSubdivisions; + + /* Variable initialization */ + assert( pTnsConfig->pTnsParameters[iFilter].nSubdivisions <= MAX_SUBDIVISIONS ); + for ( iSubdivisions = 0; iSubdivisions < nSubdivisions; iSubdivisions++ ) + { + iStartLine = idx0 + ( idx1 - idx0 ) * iSubdivisions / nSubdivisions; + iEndLine = idx0 + ( idx1 - idx0 ) * ( iSubdivisions + 1 ) / nSubdivisions; + + /* Variable initialization */ + norms[iFilter][iSubdivisions] = sum2_f( pSpectrum + iStartLine, iEndLine - iStartLine ); + } + } + + /* Calculate normalized autocorrelation for spectrum subdivision and get TNS filter parameters based on it */ + for ( iFilter = 0; iFilter < pTnsConfig->nMaxFilters; iFilter++ ) + { + idx0 = pTnsConfig->iFilterBorders[iFilter + 1]; + idx1 = pTnsConfig->iFilterBorders[iFilter]; + spectrumLength = idx1 - idx0; + pFilter = pTnsData->filter + iFilter; + nSubdivisions = pTnsConfig->pTnsParameters[iFilter].nSubdivisions; + + set_f( rxx, 0, TNS_MAX_FILTER_ORDER + 1 ); /* WMOPS: This initialization is required */ + + /* Variable initialization */ + for ( iSubdivisions = 0; ( iSubdivisions < nSubdivisions ) && ( norms[iFilter][iSubdivisions] > HLM_MIN_NRG ); iSubdivisions++ ) + { + fac = 1.0f / norms[iFilter][iSubdivisions]; + iStartLine = idx0 + spectrumLength * iSubdivisions / nSubdivisions; + iEndLine = idx0 + spectrumLength * ( iSubdivisions + 1 ) / nSubdivisions; + pWindow = tnsAcfWindow; + + /* For additional loop condition */ + /* Variable initialization */ + for ( lag = 1; lag <= pTnsConfig->maxOrder; lag++ ) + { + rxx[lag] += fac * ( *pWindow ) * dotp( pSpectrum + iStartLine, pSpectrum + iStartLine + lag, iEndLine - iStartLine - lag ); + pWindow++; + } + } + + if ( iSubdivisions == nSubdivisions ) /* meaning there is no subdivision with low energy */ + { + rxx[0] = (float) pTnsConfig->pTnsParameters[iFilter].nSubdivisions; + pFilter->spectrumLength = spectrumLength; + /* Limit the maximum order to spectrum length/4 */ + GetFilterParameters( rxx, min( pTnsConfig->maxOrder, pFilter->spectrumLength / 4 ), pFilter ); + } + } + + if ( predictionGain ) + { + assert( pTnsConfig->nMaxFilters == 1 ); + *predictionGain = pTnsData->filter->predictionGain; + } + + return; +} + + +/*---------------------------------------------------------------------* + * TnsDecision() + * + * + *---------------------------------------------------------------------*/ + +static void TnsDecision( + STnsConfig const *pTnsConfig, /* i : TNS Configuration struct */ + TRAN_DET_HANDLE hTranDet, /* i : transient detection handle */ + const int16_t isTCX10, /* i : TCX10 or TCX20? */ + const float ltp_gain, /* i : LTP gain */ + STnsData *pTnsData /* i/o: TNDS data structure */ +) +{ + int16_t iFilter; + float maxEnergyChange; + STnsFilter *pFilter; + const struct TnsParameters *pTnsParameters; + + /* We check the filter's decisions in the opposite direction */ + for ( iFilter = pTnsConfig->nMaxFilters - 1; iFilter >= 0; iFilter-- ) + { + pFilter = pTnsData->filter + iFilter; + pTnsParameters = pTnsConfig->pTnsParameters + iFilter; + + /* TNS decision function */ + if ( ( pFilter->predictionGain > pTnsParameters->minPredictionGain ) || ( pFilter->avgSqrCoef > pTnsParameters->minAvgSqrCoef ) ) + { + if ( pTnsData->nFilters > 0 || isTCX10 || ltp_gain < 0.6f || hTranDet == NULL ) + { + ++pTnsData->nFilters; + } + else + { + maxEnergyChange = GetTCXMaxenergyChange( hTranDet, isTCX10, NSUBBLOCKS, 3 ); + if ( maxEnergyChange >= pTnsParameters->minEnergyChange ) + { + ++pTnsData->nFilters; + } + else + { + ClearTnsFilterCoefficients( pFilter ); + } + } + } + else if ( pTnsData->nFilters > 0 ) /* If a previous filter is turned on */ + { + /* Since TNS filter of order 0 is not allowed we haved to signal in the stream filter of order 1 with the 0th coefficient equal to 0 */ + ClearTnsFilterCoefficients( pFilter ); + pFilter->order = 1; + ++pTnsData->nFilters; + } + else + { + ClearTnsFilterCoefficients( pFilter ); + } + } + + return; +} diff --git a/lib_enc/transient_detection.c b/lib_enc/transient_detection.c new file mode 100644 index 0000000000000000000000000000000000000000..43689d33375416ee8bcde1210101526b8caeabc9 --- /dev/null +++ b/lib_enc/transient_detection.c @@ -0,0 +1,930 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "stat_enc.h" +#include "cnst.h" +#include "prot.h" +#include "ivas_prot.h" +#include +#include "wmc_auto.h" + + +/*---------------------------------------------------------------* + * Local constants + *---------------------------------------------------------------*/ + +#define MIN_BLOCK_ENERGY 107.37f + +#define THR_HIGH 8.5f +#define THR_NORM_HIGH 8.0f +#define THR_NORM_LOW 4.5f +#define THR_LOW 4.25f +#define THR_LOW_STEP 1.0f + + +/*---------------------------------------------------------------* + * Local function prototypes + *---------------------------------------------------------------*/ + +static void InitDelayBuffer( const int16_t nFrameLength, const int16_t nDelay, DelayBuffer *pDelayBuffer ); +static void InitSubblockEnergies( const int16_t nFrameLength, const int16_t nDelay, DelayBuffer *pDelayBuffer, SubblockEnergies *pSubblockEnergies ); +static void InitTransientDetector( SubblockEnergies *pSubblockEnergies, const int16_t nDelay, const int16_t nSubblocksToCheck, TCheckSubblocksForAttack pCheckSubblocksForAttack, const float attackRatioThreshold, TransientDetector *pTransientDetector ); +static void UpdateDelayBuffer( const float *inputconst, const int16_t nSamplesAvailable, DelayBuffer *pDelayBuffer ); +static void HighPassFilter( const float *input, const int16_t length, float *pFirState1, float *pFirState2, float *output ); +static void UpdateSubblockEnergies( const float *input, const int16_t nSamplesAvailable, SubblockEnergies *pSubblockEnergies ); +static void CalculateSubblockEnergies( const float *input, const int16_t nSamplesAvailable, SubblockEnergies *pSubblockEnergies ); +static void RunTransientDetector( TransientDetector *pTransientDetector ); +static void GetAttackForTCXDecision( const float *pSubblockNrg, const float *pAccSubblockNrg, const int16_t nSubblocks, const int16_t nPastSubblocks, const float attackRatioThreshold, int16_t *pbIsAttackPresent, int16_t *pAttackIndex ); + + +/*-------------------------------------------------------------------* + * InitTransientDetection() + * + * + *-------------------------------------------------------------------*/ + +void InitTransientDetection( + const int16_t nFrameLength, + const int16_t nTCXDelay, + TRAN_DET_HANDLE hTranDet, + const int16_t ext_mem_flag ) +{ + /* Init the delay buffer. */ + InitDelayBuffer( nFrameLength, nTCXDelay, &hTranDet->delayBuffer ); + + /* Init a subblock energies buffer used for the TCX Short/Long decision. */ + InitSubblockEnergies( nFrameLength, nTCXDelay, &hTranDet->delayBuffer, &hTranDet->subblockEnergies ); + + /* Init the TCX Short/Long transient detector. */ + InitTransientDetector( &hTranDet->subblockEnergies, nTCXDelay, NSUBBLOCKS, GetAttackForTCXDecision, 8.5f, &hTranDet->transientDetector ); + + /* We need two past subblocks for the TCX TD and NSUBBLOCKS+1 for the temporal flatness measure for the TCX LTP. */ + if ( ext_mem_flag ) + { + hTranDet->transientDetector.pSubblockEnergies->nDelay += ( NSUBBLOCKS_SHIFT + 1 ) + NSUBBLOCKS + 1; + } + else + { + hTranDet->transientDetector.pSubblockEnergies->nDelay += NSUBBLOCKS + 1; + } + + return; +} + + +/*-------------------------------------------------------------------* + * GetTCXAvgTemporalFlatnessMeasure() + * + * + *-------------------------------------------------------------------*/ + +float GetTCXAvgTemporalFlatnessMeasure( + TRAN_DET_HANDLE hTranDet, + const int16_t nCurrentSubblocks, + const int16_t nPrevSubblocks ) +{ + int16_t i; + TransientDetector *pTransientDetector = &hTranDet->transientDetector; + const SubblockEnergies *pSubblockEnergies = pTransientDetector->pSubblockEnergies; + const int16_t nDelay = pTransientDetector->nDelay; + const int16_t nRelativeDelay = pSubblockEnergies->nDelay - nDelay; + const float *pSubblockNrgChange = NULL; + float sumTempFlatness; + const int16_t nTotBlocks = nCurrentSubblocks + nPrevSubblocks; + + /* Initialization */ + assert( nTotBlocks > 0 ); + sumTempFlatness = 0.0f; + + assert( ( nPrevSubblocks <= nRelativeDelay ) && ( nCurrentSubblocks <= NSUBBLOCKS + nDelay ) ); + pSubblockNrgChange = &pSubblockEnergies->subblockNrgChange[nRelativeDelay - nPrevSubblocks]; + for ( i = 0; i < nTotBlocks; i++ ) + { + sumTempFlatness += pSubblockNrgChange[i]; + } + + return sumTempFlatness / (float) nTotBlocks; +} + + +/*-------------------------------------------------------------------* + * GetTCXMaxenergyChange() + * + * + *-------------------------------------------------------------------*/ + +float GetTCXMaxenergyChange( + TRAN_DET_HANDLE hTranDet, + const int16_t isTCX10, + const int16_t nCurrentSubblocks, + const int16_t nPrevSubblocks ) +{ + int16_t i; + const TransientDetector *pTransientDetector = &hTranDet->transientDetector; + const SubblockEnergies *pSubblockEnergies = pTransientDetector->pSubblockEnergies; + const int16_t nDelay = pTransientDetector->nDelay; + const int16_t nRelativeDelay = pSubblockEnergies->nDelay - nDelay; + const float *pSubblockNrgChange = NULL; + float maxEnergyChange; + int16_t nTotBlocks = nCurrentSubblocks + nPrevSubblocks; + /* Initialization */ + assert( nTotBlocks > 0 ); + maxEnergyChange = 0.0f; + + assert( ( nPrevSubblocks <= nRelativeDelay ) && ( nCurrentSubblocks <= NSUBBLOCKS + nDelay ) ); + pSubblockNrgChange = &pSubblockEnergies->subblockNrgChange[nRelativeDelay - nPrevSubblocks]; + if ( pTransientDetector->bIsAttackPresent || isTCX10 ) /* frame is TCX-10 */ + { + const float *pSubblockNrg = &pSubblockEnergies->subblockNrg[nRelativeDelay - nPrevSubblocks]; + float nrgMin, nrgMax = pSubblockNrg[0]; + int16_t idxMax = 0; + /* find subblock with maximum energy */ + for ( i = 1; i < nTotBlocks; i++ ) + { + if ( nrgMax < pSubblockNrg[i] ) + { + nrgMax = pSubblockNrg[i]; + idxMax = i; + } + } + nrgMin = nrgMax; + /* find minimum energy after maximum */ + for ( i = idxMax + 1; i < nTotBlocks; i++ ) + { + if ( nrgMin > pSubblockNrg[i] ) + { + nrgMin = pSubblockNrg[i]; + } + } + /* lower maxEnergyChange if energy doesn't decrease much after energy peak */ + if ( nrgMin > 0.375f * nrgMax ) + { + nTotBlocks = idxMax - 3; + } + } + for ( i = 0; i < nTotBlocks; i++ ) + { + maxEnergyChange = max( maxEnergyChange, pSubblockNrgChange[i] ); + } + + return maxEnergyChange; +} + + +/*---------------------------------------------------------------* + * RunTransientDetection() + * + * Time Domain Transient Detector for TCX + *---------------------------------------------------------------*/ + +void RunTransientDetection( + const float *input, /* i : input signal */ + const int16_t length, /* i : frame length */ + TRAN_DET_HANDLE hTranDet /* i/o: transient detection handle */ +) +{ + float filteredInput[L_FRAME_MAX]; + SubblockEnergies *pSubblockEnergies = &hTranDet->subblockEnergies; + TransientDetector *pTransientDetector = &hTranDet->transientDetector; + float e0, e1; + + assert( ( input != NULL ) && ( hTranDet != NULL ) && ( pSubblockEnergies != NULL ) && ( pTransientDetector != NULL ) ); + + /* Variable initializations */ + HighPassFilter( input, length, &pSubblockEnergies->firState1, &pSubblockEnergies->firState2, filteredInput ); + + /* Update subblock energies. */ + UpdateSubblockEnergies( filteredInput, length, pSubblockEnergies ); + + /* Run transient detectors. */ + RunTransientDetector( pTransientDetector ); + + /* Update the delay buffer. */ + UpdateDelayBuffer( filteredInput, length, &hTranDet->delayBuffer ); + + /* compute ramp up flag */ + pSubblockEnergies->ramp_up_flag = ( ( pSubblockEnergies->ramp_up_flag << 1 ) & 0x0003 ); + e0 = dotp( filteredInput + length / 2, filteredInput + length / 2, pSubblockEnergies->pDelayBuffer->nSubblockSize / 2 ) + 0.5f * MIN_BLOCK_ENERGY; + e1 = pSubblockEnergies->subblockNrg[pSubblockEnergies->nDelay + 4] - e0; + if ( e1 > e0 ) + { + pSubblockEnergies->ramp_up_flag |= 0x0001; + } + + return; +} + + +static uint16_t isLongTermTransient( + const float frameTFM, + float *lastTFM ) +{ + float currTFM; + + if ( frameTFM > *lastTFM ) + { + const float f = ( frameTFM - *lastTFM ) * ( frameTFM - *lastTFM ); + + currTFM = *lastTFM * ( 0.96875f - f ) + frameTFM * ( 0.03125f + f ); + } + else + { + currTFM = *lastTFM * 0.96875f + frameTFM * 0.03125f; + } + + *lastTFM = max( 0.015625f, currTFM ); + + return ( currTFM < 0.5625f ? 1 : 0 ); +} + + +/*-------------------------------------------------------------------* + * SetTCXModeInfo() + * + * + *-------------------------------------------------------------------*/ + +void SetTCXModeInfo( + Encoder_State *st, /* i/o: encoder state structure */ + TRAN_DET_HANDLE hTranDet, /* i/o: transient detection handle */ + int16_t *tcxModeOverlap /* o : window overlap of current frame */ +) +{ + TCX_ENC_HANDLE hTcxEnc = st->hTcxEnc; + + if ( st->codec_mode == MODE2 || ( st->element_mode > EVS_MONO && st->core != HQ_CORE ) ) + { + assert( hTranDet != NULL ); + + /* determine window sequence (1 long or 2 short windows) */ + if ( st->tcx10Enabled && st->tcx20Enabled ) + { + /* window switching based on transient detector output */ + if ( ( ( hTranDet->transientDetector.bIsAttackPresent ) || ( st->currEnergyHF > st->prevEnergyHF * 39.0f && st->element_mode != IVAS_CPE_MDCT ) ) && + ( ( st->last_core != ACELP_CORE ) && ( st->last_core != AMR_WB_CORE ) ) ) + { + hTcxEnc->tcxMode = TCX_10; + } + else + { + hTcxEnc->tcxMode = TCX_20; + } + } + else + { + /* window selection (non-adaptive) based on flags only */ + if ( st->tcx10Enabled ) + { + hTcxEnc->tcxMode = TCX_10; + } + else if ( st->tcx20Enabled ) + { + hTcxEnc->tcxMode = TCX_20; + } + else + { + hTcxEnc->tcxMode = NO_TCX; + } + } + /* set the left window overlap */ + if ( st->last_core == ACELP_CORE || st->last_core == AMR_WB_CORE ) + { + st->hTcxCfg->tcx_last_overlap_mode = TRANSITION_OVERLAP; + } + else if ( ( hTcxEnc->tcxMode == TCX_10 ) && ( st->hTcxCfg->tcx_curr_overlap_mode == ALDO_WINDOW ) ) + { + st->hTcxCfg->tcx_last_overlap_mode = FULL_OVERLAP; + } + else + { + st->hTcxCfg->tcx_last_overlap_mode = st->hTcxCfg->tcx_curr_overlap_mode; + } + + /* determine the right window overlap */ + if ( hTcxEnc->tcxMode == TCX_10 ) + { + if ( hTranDet->transientDetector.attackIndex < 0 ) + { + *tcxModeOverlap = HALF_OVERLAP; + } + else + { + *tcxModeOverlap = hTranDet->transientDetector.attackIndex % 4; + if ( *tcxModeOverlap == 1 ) + { + *tcxModeOverlap = FULL_OVERLAP; + } + } + if ( isLongTermTransient( 1.0f / GetTCXAvgTemporalFlatnessMeasure( hTranDet, NSUBBLOCKS, 0 ), &hTcxEnc->tfm_mem ) && st->element_mode == IVAS_CPE_MDCT ) + { + if ( ( *tcxModeOverlap != MIN_OVERLAP ) && ( hTcxEnc->tcxltp_norm_corr_past < 0.5625f ) ) + { + *tcxModeOverlap = HALF_OVERLAP; + } + } + } + else if ( hTcxEnc->tcxMode == TCX_20 ) + { + if ( hTranDet->transientDetector.attackIndex == 7 ) + { + *tcxModeOverlap = HALF_OVERLAP; + } + else if ( hTranDet->transientDetector.attackIndex == 6 ) + { + *tcxModeOverlap = MIN_OVERLAP; + } + else + { + *tcxModeOverlap = ALDO_WINDOW; + } + if ( isLongTermTransient( 1.0f / GetTCXAvgTemporalFlatnessMeasure( hTranDet, NSUBBLOCKS, 0 ), &hTcxEnc->tfm_mem ) && st->element_mode == IVAS_CPE_MDCT ) + { + if ( ( *tcxModeOverlap != MIN_OVERLAP ) && ( hTcxEnc->tcxltp_norm_corr_past < 0.5625f ) ) + { + *tcxModeOverlap = HALF_OVERLAP; + } + } + } + else + { + /* NO_TCX */ + *tcxModeOverlap = TRANSITION_OVERLAP; + if ( st->element_mode == IVAS_CPE_MDCT ) + { + hTcxEnc->tfm_mem = 0.75f; + } + } + + /* for the ACELP -> TCX transition frames use full right window overlap */ + if ( ( st->hTcxCfg->tcx_last_overlap_mode == TRANSITION_OVERLAP ) && ( *tcxModeOverlap == ALDO_WINDOW ) ) + { + *tcxModeOverlap = FULL_OVERLAP; + } + } + + return; +} + + +/*---------------------------------------------------------------* + * Local functions + *---------------------------------------------------------------*/ + +/** TCX decision. + * Check if there is an attack in a subblock. Version for TCX Long/Short decision. + * See TCheckSubblocksForAttack for definition of parameters. + * It is assumed that the delay of MDCT overlap was not taken into account, so that the last subblock corresponds to the newest input subblock. + */ +static void GetAttackForTCXDecision( + const float *pSubblockNrg, + const float *pAccSubblockNrg, + const int16_t nSubblocks, + const int16_t nPastSubblocks, + const float attackRatioThreshold, + int16_t *pbIsAttackPresent, + int16_t *pAttackIndex ) +{ + int16_t i; + int16_t bIsAttackPresent, attackIndex; + + assert( nSubblocks >= NSUBBLOCKS ); + assert( nPastSubblocks >= 2 ); + + bIsAttackPresent = FALSE; + attackIndex = -1; + /* Search for the last attack in the subblocks */ + if ( ( pSubblockNrg[-1] > pAccSubblockNrg[-1] * attackRatioThreshold ) || ( pSubblockNrg[-2] > pAccSubblockNrg[-2] * attackRatioThreshold ) ) + { + bIsAttackPresent = TRUE; + attackIndex = 0; + } + for ( i = 0; i < NSUBBLOCKS; i++ ) + { + if ( pSubblockNrg[i] > pAccSubblockNrg[i] * attackRatioThreshold ) + { + if ( i < 6 ) + { + bIsAttackPresent = TRUE; + } + if ( ( attackIndex != 2 ) && ( attackIndex != 6 ) ) + { + attackIndex = i; + if ( ( pSubblockNrg[i] < pAccSubblockNrg[i] * 1.125f * attackRatioThreshold ) && ( i == 2 || i == 6 ) ) + { + attackIndex++; /* avoid minimum overlap to prevent clicks */ + } + } + } + else /* no attack, but set index anyway in case of strong energy increase */ + { + if ( ( pSubblockNrg[i] > pSubblockNrg[i - 1] * 1.5f * attackRatioThreshold ) && + ( pSubblockNrg[i] > pSubblockNrg[i - 2] * 1.5f * attackRatioThreshold ) ) + { + if ( ( attackIndex != 2 ) && ( attackIndex != 6 ) ) + { + attackIndex = i; + + if ( ( ( pSubblockNrg[i] < pSubblockNrg[i - 1] * 2.0f * attackRatioThreshold ) || + ( pSubblockNrg[i] < pSubblockNrg[i - 2] * 2.0f * attackRatioThreshold ) ) && + ( i == 2 || i == 6 ) ) + { + attackIndex++; /* avoid minimum overlap to prevent clicks */ + } + } + } + } + } + + /* avoid post-echos on click sounds (very short transients) due to TNS aliasing */ + if ( attackIndex == 4 ) + { + attackIndex = 7; + } + else if ( attackIndex == 5 ) + { + attackIndex = 6; + } + *pAttackIndex = attackIndex; + *pbIsAttackPresent = bIsAttackPresent; + + return; +} + + +static void InitDelayBuffer( + const int16_t nFrameLength, + const int16_t nDelay, + DelayBuffer *pDelayBuffer ) +{ + const int16_t nMaxBuffSize = L_FRAME_MAX / NSUBBLOCKS; + + assert( ( nFrameLength > NSUBBLOCKS ) && ( nFrameLength % NSUBBLOCKS == 0 ) && ( nDelay >= 0 ) && ( pDelayBuffer != NULL ) ); + pDelayBuffer->nSubblockSize = nFrameLength / NSUBBLOCKS; + assert( pDelayBuffer->nSubblockSize <= nMaxBuffSize ); + set_f( pDelayBuffer->buffer, 0.0f, nMaxBuffSize ); + pDelayBuffer->nDelay = nDelay % pDelayBuffer->nSubblockSize; + assert( pDelayBuffer->nDelay <= nMaxBuffSize ); + + return; +} + + +static void InitSubblockEnergies( + const int16_t nFrameLength, + const int16_t nDelay, + DelayBuffer *pDelayBuffer, + SubblockEnergies *pSubblockEnergies ) +{ + const int16_t nMaxBuffSize = NSUBBLOCKS + MAX_TD_DELAY; + + assert( ( pDelayBuffer != NULL ) && ( pSubblockEnergies != NULL ) && ( pDelayBuffer->nSubblockSize * NSUBBLOCKS == nFrameLength ) && ( pDelayBuffer->nSubblockSize > 0 ) ); + + set_f( pSubblockEnergies->subblockNrg, MIN_BLOCK_ENERGY, nMaxBuffSize ); + set_f( pSubblockEnergies->accSubblockNrg, MIN_BLOCK_ENERGY, nMaxBuffSize + 1 ); + set_f( pSubblockEnergies->subblockNrgChange, 1.0f, nMaxBuffSize ); + pSubblockEnergies->nDelay = nDelay / pDelayBuffer->nSubblockSize; + assert( pSubblockEnergies->nDelay < nMaxBuffSize ); + pSubblockEnergies->nPartialDelay = nDelay % pDelayBuffer->nSubblockSize; + pSubblockEnergies->facAccSubblockNrg = 0.8125f; /* Energy accumulation factor */ + pSubblockEnergies->firState1 = 0.0f; + pSubblockEnergies->firState2 = 0.0f; + + pSubblockEnergies->pDelayBuffer = pDelayBuffer; + pDelayBuffer->nDelay = max( pDelayBuffer->nDelay, pSubblockEnergies->nPartialDelay ); + + return; +} + + +/** Init transient detector. + * Fills TransientDetector structure with sensible content and enable it. + * @param pSubblockEnergies Subblock energies used in this transient detector. + * @param nDelay Delay for this transient detector. + * @param nSubblocksToCheck Number of subblocks to check in this transient detector. + * @param pCheckSubblockForAttack Attack detection function for this transient detector. + * @param pSetAttackPosition Function for finalizing this transient detector. + * @param attackRatioThreshold Attack ratio threshold. + * @param pTransientDetector Structure to be initialized. + */ +static void InitTransientDetector( + SubblockEnergies *pSubblockEnergies, + const int16_t nDelay, + const int16_t nSubblocksToCheck, + TCheckSubblocksForAttack pCheckSubblocksForAttack, + const float attackRatioThreshold, + TransientDetector *pTransientDetector ) +{ + const int16_t nMaxBuffSize = NSUBBLOCKS + MAX_TD_DELAY; + + assert( ( pSubblockEnergies != NULL ) && ( pSubblockEnergies->pDelayBuffer != NULL ) && ( pTransientDetector != NULL ) && ( pSubblockEnergies->pDelayBuffer->nSubblockSize != 0 ) ); + pTransientDetector->pSubblockEnergies = pSubblockEnergies; + pTransientDetector->nDelay = ( nDelay - pSubblockEnergies->nPartialDelay ) / pSubblockEnergies->pDelayBuffer->nSubblockSize; + assert( nDelay == pTransientDetector->nDelay * pSubblockEnergies->pDelayBuffer->nSubblockSize + pSubblockEnergies->nPartialDelay ); + assert( pTransientDetector->nDelay < nMaxBuffSize ); + pSubblockEnergies->nDelay = max( pSubblockEnergies->nDelay, pTransientDetector->nDelay ); + assert( nSubblocksToCheck <= NSUBBLOCKS + pTransientDetector->nDelay ); + pTransientDetector->nSubblocksToCheck = nSubblocksToCheck; + pTransientDetector->CheckSubblocksForAttack = pCheckSubblocksForAttack; + pTransientDetector->attackRatioThreshold = attackRatioThreshold; + pTransientDetector->bIsAttackPresent = FALSE; + pTransientDetector->prev_bIsAttackPresent = FALSE; + pTransientDetector->attackIndex = -1; + pTransientDetector->pSubblockEnergies->ramp_up_flag = 0x0; + + return; +} + + +/* This function should be inlined and WMOPS instrumentation takes that into account, meaning that all references are considered as local variables */ +static float InlineFilter( + float inValue, + float firState1, + float firState2 ) +{ + return 0.375f * inValue - 0.5f * firState1 + 0.125f * firState2; +} + + +static void HighPassFilter( + const float *input, + const int16_t length, + float *pFirState1, + float *pFirState2, + float *output ) +{ + int16_t i; + + output[0] = InlineFilter( input[0], *pFirState1, *pFirState2 ); + output[1] = InlineFilter( input[1], input[0], *pFirState1 ); + for ( i = 2; i < length; i++ ) + { + output[i] = InlineFilter( input[i], input[i - 1], input[i - 2] ); + } + + /* update filter states: shift time samples through delay line */ + *pFirState2 = input[length - 2]; + *pFirState1 = input[length - 1]; + + return; +} + + +static void RunTransientDetector( + TransientDetector *pTransientDetector ) +{ + const float attackRatioThreshold = pTransientDetector->attackRatioThreshold; + const SubblockEnergies *pSubblockEnergies = pTransientDetector->pSubblockEnergies; + const int16_t nDelay = pTransientDetector->nDelay; + const int16_t nRelativeDelay = pSubblockEnergies->nDelay - nDelay; + const float *pSubblockNrg = &pSubblockEnergies->subblockNrg[nRelativeDelay]; + const float *pAccSubblockNrg = &pSubblockEnergies->accSubblockNrg[nRelativeDelay]; + + assert( ( pTransientDetector->CheckSubblocksForAttack != NULL ) ); + + /* Variable initialization */ +#define WMC_TOOL_SKIP + pTransientDetector->CheckSubblocksForAttack( pSubblockNrg, pAccSubblockNrg, NSUBBLOCKS + nDelay, nRelativeDelay, attackRatioThreshold, &pTransientDetector->bIsAttackPresent, &pTransientDetector->attackIndex ); +#undef WMC_TOOL_SKIP + + return; +} + + +static void UpdateDelayBuffer( + const float *input, + const int16_t nSamplesAvailable, + DelayBuffer *pDelayBuffer ) +{ + int16_t i; + int16_t nDelay = pDelayBuffer->nDelay; + + assert( ( nDelay >= 0 ) && ( nDelay <= (int16_t) sizeof( pDelayBuffer->buffer ) / (int16_t) sizeof( pDelayBuffer->buffer[0] ) ) ); + assert( nSamplesAvailable <= NSUBBLOCKS * pDelayBuffer->nSubblockSize ); + + /* If this is not the last frame */ + if ( nSamplesAvailable == NSUBBLOCKS * pDelayBuffer->nSubblockSize ) + { + /* Store the newest samples into the delay buffer */ + for ( i = 0; i < nDelay; i++ ) + { + pDelayBuffer->buffer[i] = input[i + nSamplesAvailable - nDelay]; + } + } + + return; +} + + +static void UpdateSubblockEnergies( + const float *input, + const int16_t nSamplesAvailable, + SubblockEnergies *pSubblockEnergies ) +{ + int16_t i; + + assert( ( pSubblockEnergies->nDelay >= 0 ) && ( pSubblockEnergies->nDelay + NSUBBLOCKS <= (int16_t) sizeof( pSubblockEnergies->subblockNrg ) / (int16_t) sizeof( pSubblockEnergies->subblockNrg[0] ) ) ); + assert( pSubblockEnergies->nPartialDelay <= pSubblockEnergies->pDelayBuffer->nDelay ); + /* At least one block delay is required when subblock energy change is required */ + assert( pSubblockEnergies->nDelay >= 1 ); + + /* Shift old subblock energies */ + for ( i = 0; i < pSubblockEnergies->nDelay; i++ ) + { + pSubblockEnergies->subblockNrg[i] = pSubblockEnergies->subblockNrg[i + NSUBBLOCKS]; + pSubblockEnergies->accSubblockNrg[i] = pSubblockEnergies->accSubblockNrg[i + NSUBBLOCKS]; + pSubblockEnergies->subblockNrgChange[i] = pSubblockEnergies->subblockNrgChange[i + NSUBBLOCKS]; + } + + /* Compute filtered subblock energies for the new samples */ + CalculateSubblockEnergies( input, nSamplesAvailable, pSubblockEnergies ); + + return; +} + + +/* This function should be inlined and WMOPS instrumentation takes that into account, meaning that all references are considered as local variables */ +static void UpdatedAndStoreAccWindowNrg( + float newWindowNrgF, + float *pAccSubblockNrg, + float facAccSubblockNrg, + float *pOutAccWindowNrgF ) +{ + /* Store the accumulated energy */ + *pOutAccWindowNrgF = *pAccSubblockNrg; + + /* Update the accumulated energy: maximum of the current and the accumulated energy */ + *pAccSubblockNrg *= facAccSubblockNrg; + if ( newWindowNrgF > *pAccSubblockNrg ) + { + *pAccSubblockNrg = newWindowNrgF; + } + + return; +} + + +static void CalculateSubblockEnergies( + const float *input, + const int16_t nSamplesAvailable, + SubblockEnergies *pSubblockEnergies ) +{ + DelayBuffer *pDelayBuffer = pSubblockEnergies->pDelayBuffer; /* */ + const int16_t nSubblockSize = pDelayBuffer->nSubblockSize; /* */ + const int16_t nDelay = pSubblockEnergies->nDelay; /* */ + const int16_t nPartialDelay = pSubblockEnergies->nPartialDelay; /* */ + const float *delayBuffer = &pDelayBuffer->buffer[pDelayBuffer->nDelay - nPartialDelay]; /* */ + const float facAccSubblockNrg = pSubblockEnergies->facAccSubblockNrg; /* */ + float *pSubblockNrg = &pSubblockEnergies->subblockNrg[nDelay]; /* */ + float *pAccSubblockNrg = &pSubblockEnergies->accSubblockNrg[nDelay]; /* */ + float *pSubblockNrgChange = &pSubblockEnergies->subblockNrgChange[nDelay]; /* */ + float *pAccSubblockTmp; + int16_t nWindows; + int16_t i, w, k; + /* Variable initializations */ + nWindows = ( nSamplesAvailable + nPartialDelay ) / nSubblockSize; + pAccSubblockTmp = &pAccSubblockNrg[nWindows]; + + set_f( pSubblockNrg, MIN_BLOCK_ENERGY, NSUBBLOCKS ); + + if ( nWindows > 0 ) + { + /* Process left over samples from the previous frame. */ + for ( k = 0; k < nPartialDelay; k++ ) + { + pSubblockNrg[0] += delayBuffer[k] * delayBuffer[k]; + } + k = 0; + + /* Process new samples in the 0. subblock. */ + for ( i = nPartialDelay; i < nSubblockSize; i++, k++ ) + { + pSubblockNrg[0] += input[k] * input[k]; + } + + /* Set accumulated subblock energy at this point. */ + UpdatedAndStoreAccWindowNrg( pSubblockNrg[0], pAccSubblockTmp, facAccSubblockNrg, &pAccSubblockNrg[0] ); + + for ( w = 1; w < nWindows; w++ ) + { + /* Process new samples in the w. subblock. */ + for ( i = 0; i < nSubblockSize; i++, k++ ) + { + pSubblockNrg[w] += input[k] * input[k]; + } + /* Set accumulated subblock energy at this point. */ + UpdatedAndStoreAccWindowNrg( pSubblockNrg[w], pAccSubblockTmp, facAccSubblockNrg, &pAccSubblockNrg[w] ); + } + + /* Calculate energy change for each block. */ + for ( w = 0; w < nWindows; w++ ) + { + if ( pSubblockNrg[w] > pSubblockNrg[w - 1] ) + { + pSubblockNrgChange[w] = pSubblockNrg[w] / pSubblockNrg[w - 1]; + } + else + { + pSubblockNrgChange[w] = pSubblockNrg[w - 1] / pSubblockNrg[w]; + } + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * set_transient_stereo() + * + * + *-------------------------------------------------------------------*/ + +void set_transient_stereo( + CPE_ENC_HANDLE hCPE, /* i : CPE structure */ + float currFlatness[] /* i/o: current flatness */ +) +{ + int16_t n, attackIsPresent; + float currFlatnessMax; + Encoder_State **sts; + + sts = hCPE->hCoreCoder; + + /* for DFT/TD based stereo ,map avg. flatness to individual stereo channels (M/S or X/Y) */ + maximum( currFlatness, CPE_CHANNELS, &currFlatnessMax ); + attackIsPresent = 0; + + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + attackIsPresent = max( attackIsPresent, sts[n]->hTranDet->transientDetector.bIsAttackPresent ); + } + + set_f( currFlatness, currFlatnessMax, CPE_CHANNELS ); + + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + sts[n]->hTranDet->transientDetector.bIsAttackPresent = attackIsPresent; + } + + if ( hCPE->hStereoDft != NULL ) + { + if ( hCPE->hStereoDft->attackPresent ) + { + hCPE->hStereoDft->wasTransient = 1; + } + else if ( hCPE->hStereoDft->wasTransient ) + { + hCPE->hStereoDft->wasTransient = 0; + } + + hCPE->hStereoDft->attackPresent = attackIsPresent; + + hCPE->hStereoDft->hItd->currFlatness = 0; + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + hCPE->hStereoDft->hItd->currFlatness = max( hCPE->hStereoDft->hItd->currFlatness, currFlatness[n] ); + } + } + + if ( hCPE->hStereoMdct != NULL ) + { + hCPE->hStereoMdct->hItd->currFlatness = 0; + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + hCPE->hStereoMdct->hItd->currFlatness = max( hCPE->hStereoMdct->hItd->currFlatness, currFlatness[n] ); + } + } + + return; +} + +/*-------------------------------------------------------------------* + * transient_analysis() + * + * + *-------------------------------------------------------------------*/ + +/*! r: preliminary flag to force ACELP */ +int16_t transient_analysis( + TRAN_DET_HANDLE hTranDet, /* i : handle transient detection */ + const float cor_map_LT[], /* i : LT correlation map */ + const float multi_harm_limit /* i : multi harminic threshold */ +) +{ + const float *pSubblockNrg; + float accSubblockNrgRev[NSUBBLOCKS]; /* store acc Nrg in reversed signal */ + float *pTmp; /* point to acc Nrg */ + int16_t offset; + int16_t i; + float thr_fwd; + float thr_rev; + const int16_t nRelativeDelay = hTranDet->subblockEnergies.nDelay - hTranDet->transientDetector.nDelay; + int16_t prel_force_td; + float cor_map_LT_sum; + + pTmp = &accSubblockNrgRev[NSUBBLOCKS - 1]; + offset = nRelativeDelay - 4; + prel_force_td = FALSE; + + /* summation of the LT correlation map */ + cor_map_LT_sum = sum_f( cor_map_LT, L_FFT / 2 ); /* Note maybe BE optimized by computing inside noise_est */ + + thr_fwd = THR_NORM_HIGH; + if ( cor_map_LT_sum > multi_harm_limit * 0.8f ) + { + thr_fwd = THR_HIGH; + } + thr_rev = THR_LOW; + if ( cor_map_LT_sum > multi_harm_limit * 0.6f ) + { + thr_rev = THR_NORM_LOW; + } + + /* forward attack analysis */ + for ( i = -2; i < 7; i++ ) + { + if ( hTranDet->subblockEnergies.subblockNrg[nRelativeDelay + i] > hTranDet->subblockEnergies.accSubblockNrg[nRelativeDelay + i] * thr_fwd ) + { + prel_force_td |= 0x0001; + } + } + if ( prel_force_td == 0 && hTranDet->transientDetector.prev_bIsAttackPresent == 1 ) + { + /* release analysis */ + pSubblockNrg = hTranDet->transientDetector.pSubblockEnergies->subblockNrg; + set_zero( accSubblockNrgRev, NSUBBLOCKS ); + + for ( i = NSUBBLOCKS - 1; i > -1; i-- ) + { + if ( i == NSUBBLOCKS - 1 ) + { + accSubblockNrgRev[i] = pSubblockNrg[i + offset]; + } + else + { + accSubblockNrgRev[i] = *pTmp; + *pTmp *= hTranDet->transientDetector.pSubblockEnergies->facAccSubblockNrg; + if ( pSubblockNrg[i + offset] > *pTmp ) + { + *pTmp = pSubblockNrg[i + offset]; + } + } + } + + /* -3 check */ + if ( pSubblockNrg[1 + offset] > accSubblockNrgRev[1] * thr_rev ) + { + prel_force_td |= 0x0002; + } + + /* -4 check */ + if ( prel_force_td == 0 && pSubblockNrg[offset] > accSubblockNrgRev[0] * thr_rev ) + { + if ( pSubblockNrg[offset] > accSubblockNrgRev[0] * ( thr_rev + THR_LOW_STEP ) ) + { + prel_force_td |= 0x0004; + } + else if ( ( hTranDet->subblockEnergies.ramp_up_flag & 0x0002 ) != 0 ) + { + prel_force_td |= 0x0008; + } + } + } + + return prel_force_td != 0; +} diff --git a/lib_enc/transition_enc.c b/lib_enc/transition_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..f879066b1362744218302b725c53b9ea5466ad2f --- /dev/null +++ b/lib_enc/transition_enc.c @@ -0,0 +1,1059 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "wmc_auto.h" + +/*-----------------------------------------------------------------* + * Local function prototypes + *-----------------------------------------------------------------*/ + +static void gain_trans_enc( float *gain_trans, float exc[], int16_t *quant_index, int16_t *quant_sign ); + +static void tc_enc( Encoder_State *st, const int16_t i_subfr, int16_t *tc_subfr, int16_t *position, const float *h1, const float *xn, float *exc, float *y1, int16_t *T0_min, int16_t *T0_max, int16_t *T0, int16_t *T0_frac, float *gain_pit, float g_corr[], float *bwe_exc ); + + +/*-----------------------------------------------------------------* + * transition_enc() + * + * Principal function for adaptive excitation construction in TC + *-----------------------------------------------------------------*/ + +void transition_enc( + Encoder_State *st, /* i/o: encoder state structure */ + const int16_t i_subfr, /* i : subframe index */ + int16_t *tc_subfr, /* i/o: TC subframe index */ + int16_t *Jopt_flag, /* i : joint optimization flag */ + int16_t *position, /* i/o: maximum of residual signal index */ + int16_t *T0, /* i/o: close loop integer pitch */ + int16_t *T0_frac, /* i/o: close loop fractional part of the pitch */ + int16_t *T0_min, /* i/o: lower limit for close-loop search */ + int16_t *T0_max, /* i/o: higher limit for close-loop search */ + float *exc, /* i/o: pointer to excitation signal frame */ + float *y1, /* o : zero-memory filtered adaptive excitation */ + const float *h1, /* i : weighted filter input response */ + const float *xn, /* i : target vector */ + float *xn2, /* o : target vector for innovation search */ + float *gp_cl, /* i/o: memory of gain of pitch clipping algorithm */ + float *gain_pit, /* o : adaptive excitation gain */ + float *g_corr, /* o : ACELP correlation values */ + int16_t *clip_gain, /* i/o: adaptive gain clipping flag */ + float **pt_pitch, /* o : floating pitch values */ + float *bwe_exc, /* o : excitation for SWB TBE */ + int16_t *unbits_ACELP /* i/o: unused bits */ +) +{ + int16_t i, pit_flag, pit_start, pit_limit, index, nBits; + int16_t limit_flag, mult_Top; + int16_t lp_select, lp_flag; + BSTR_ENC_HANDLE hBstr = st->hBstr; + int16_t offset; + int16_t T_op[2]; + + /* set limit_flag to 0 for restrained limits, and 1 for extended limits */ + limit_flag = 0; + + pit_start = PIT_MIN; + + if ( st->L_frame == L_FRAME16k ) + { + T_op[0] = (int16_t) ( st->pitch[0] * 1.25f + 0.5f ); + T_op[1] = (int16_t) ( st->pitch[1] * 1.25f + 0.5f ); + } + else + { + T_op[0] = st->pitch[0]; + T_op[1] = st->pitch[1]; + } + + lp_flag = st->acelp_cfg.ltf_mode; + + if ( i_subfr == 0 ) + { + mult_Top = 1; + if ( limit_flag == 0 ) + { + if ( st->L_frame == L_FRAME && T_op[1] < PIT_MIN ) + { + mult_Top = 2; + } + + if ( st->L_frame == L_FRAME16k && T_op[1] < PIT16k_MIN ) + { + mult_Top = 2; + } + } + + limit_T0( st->L_frame, 8, 0, limit_flag, mult_Top * T_op[1], 0, T0_min, T0_max ); + } + + /*-----------------------------------------------------------------* + * zero adaptive excitation signal construction + *-----------------------------------------------------------------*/ + + if ( *tc_subfr > i_subfr ) + { + *gain_pit = 0.0f; + *clip_gain = 0; + g_corr[0] = 1.0f; + g_corr[1] = 1.0f; + + set_f( &exc[i_subfr], 0, L_SUBFR ); /* set excitation for current subrame to 0 */ + + if ( st->L_frame == L_FRAME ) + { + set_f( &bwe_exc[i_subfr * HIBND_ACB_L_FAC], 0, (int16_t) ( L_SUBFR * HIBND_ACB_L_FAC ) ); /* set past excitation buffer to 0 */ + } + else + { + set_f( &bwe_exc[i_subfr * 2], 0, (int16_t) ( L_SUBFR * 2 ) ); /* set past excitation buffer to 0 */ + } + + set_f( y1, 0, L_SUBFR ); /* set filtered adaptive excitation to 0 */ + mvr2r( xn, xn2, L_SUBFR ); /* target vector for codebook search */ + *T0 = L_SUBFR; + *T0_frac = 0; + + **pt_pitch = (float) ( *T0 ) + (float) ( *T0_frac ) / 4.0f; /* save subframe pitch values */ + } + + /*-----------------------------------------------------------------* + * glottal codebook contribution construction + *-----------------------------------------------------------------*/ + + else if ( *tc_subfr == i_subfr ) + { + if ( st->L_frame == L_FRAME ) + { + set_f( bwe_exc - PIT_MAX * HIBND_ACB_L_FAC, 0, PIT_MAX * HIBND_ACB_L_FAC ); /* set past excitation buffer to 0 */ + } + else + { + set_f( bwe_exc - PIT16k_MAX * 2, 0, PIT16k_MAX * 2 ); /* set past excitation buffer to 0 */ + } + + tc_enc( st, i_subfr, tc_subfr, position, h1, xn, exc, y1, T0_min, T0_max, T0, T0_frac, gain_pit, g_corr, bwe_exc ); + + if ( *tc_subfr == TC_0_0 ) + { + /* this is called only to compute unused bits */ + config_acelp1( ENC, st->total_brate, st->core_brate, st->core, st->extl, st->extl_brate, L_FRAME, -1, &( st->acelp_cfg ), hBstr->nb_bits_tot, TRANSITION, TC_0_0, 3, NULL, unbits_ACELP, st->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st->idchan, st->active_cnt, 0 /*tdm_Pitch_reuse_flag*/, st->tdm_LRTD_flag, 0 /*GSC_IVAS_mode*/ ); + } + + *clip_gain = gp_clip( st->element_mode, st->core_brate, st->voicing, i_subfr, TRANSITION, xn, gp_cl ); + + updt_tar( xn, xn2, y1, *gain_pit, L_SUBFR ); + + **pt_pitch = (float) ( *T0 ) + (float) ( *T0_frac ) / 4.0f; /* save subframe pitch values */ + *Jopt_flag = 1; + } + + /*--------------------------------------------------------------* + * other subframes -> GENERIC encoding type, + * standard adaptive excitation contribution + * - exemption only in case when first glottal impulse is + * in the 1st subframe and the second one in 2nd subframe + * and later + *--------------------------------------------------------------*/ + + else if ( *tc_subfr < i_subfr ) + { + if ( st->L_frame == L_FRAME ) + { + *Jopt_flag = 1; + + /* pit_flag for T0 bits number coding determination */ + if ( ( ( i_subfr - *tc_subfr ) == L_SUBFR ) || ( ( i_subfr - *tc_subfr ) == L_SUBFR - TC_0_0 ) ) + { + pit_flag = 0; + } + else + { + pit_flag = L_SUBFR; + } + if ( *tc_subfr == TC_0_0 ) + { + if ( i_subfr == L_SUBFR ) + { + limit_T0( L_FRAME, 8, pit_flag, limit_flag, *T0, 0, T0_min, T0_max ); + } + pit_flag = 1; + } + + /*----------------------------------------------------------* + * if tc_subfr==0, change tc_subfr corresponding to the + * second glot. impulse position + *----------------------------------------------------------*/ + + if ( ( *tc_subfr == 0 ) && ( i_subfr == L_SUBFR ) ) + { + if ( PIT_MIN > ( *position ) ) + { + pit_start = L_SUBFR - ( *position ); + } + else + { + pit_start = PIT_MIN; + } + if ( pit_start < PIT_MIN ) + { + pit_start = PIT_MIN; + } + + pit_limit = 2 * pit_start + ( *position ); + + /* Find the closed loop pitch period */ + *T0 = pitch_fr4( &exc[i_subfr], xn, h1, *T0_min, *T0_max, T0_frac, pit_flag, limit_flag, pit_start, pit_limit, L_FRAME, L_SUBFR ); + + offset = tbe_celp_exc_offset( *T0, *T0_frac ); + for ( i = 0; i < L_SUBFR * HIBND_ACB_L_FAC; i++ ) + { + bwe_exc[i + i_subfr * HIBND_ACB_L_FAC] = bwe_exc[i + i_subfr * HIBND_ACB_L_FAC - offset]; + } + + if ( ( *T0 ) > ( 2 * L_SUBFR - ( *position ) ) ) + { + if ( ( *T0 ) + ( *position ) >= 3 * L_SUBFR ) + { + /* second glottal impulse is in the 4th subframe */ + *tc_subfr = TC_0_192; + } + else + { + /* second glottal impulse is in the 3rd subframe */ + *tc_subfr = TC_0_128; + } + } + else if ( ( *tc_subfr == 0 ) && ( i_subfr == L_SUBFR ) ) + { + /* second glottal impulse is in the 2nd subframe */ + *tc_subfr = TC_0_64; + } + } + + if ( i_subfr - *tc_subfr <= L_SUBFR ) + { + config_acelp1( ENC, st->total_brate, st->core_brate, st->core, st->extl, st->extl_brate, st->L_frame, -1, &( st->acelp_cfg ), hBstr->nb_bits_tot, TRANSITION, *tc_subfr, 2, NULL, unbits_ACELP, st->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st->idchan, st->active_cnt, 0 /*tdm_Pitch_reuse_flag*/, st->tdm_LRTD_flag, 0 /*GSC_IVAS_mode*/ ); + } + + /*-----------------------------------------------------------------* + * get number of bits for pitch encoding + *-----------------------------------------------------------------*/ + + nBits = st->acelp_cfg.pitch_bits[i_subfr / L_SUBFR]; + + /*-----------------------------------------------------------------* + * Find adaptive part of excitation, encode pitch period + *-----------------------------------------------------------------*/ + + /* first glottal impulse is in the 1st subrame */ + if ( ( i_subfr == L_SUBFR ) && ( *tc_subfr >= TC_0_128 ) ) + { + /*--------------------------------------------------------* + * second glottal impulse is in the 3rd or 4th subframe + * - build exc[] in 2nd subframe + *--------------------------------------------------------*/ + + *T0 = 2 * L_SUBFR; + *T0_frac = 0; + *Jopt_flag = 0; + + set_f( &exc[i_subfr], 0, (int16_t) ( L_SUBFR + 1 ) ); + set_f( &bwe_exc[i_subfr * HIBND_ACB_L_FAC], 0, (int16_t) ( L_SUBFR * HIBND_ACB_L_FAC ) ); + } + else if ( ( i_subfr == L_SUBFR ) && ( *tc_subfr == TC_0_64 ) ) + { + /*--------------------------------------------------------* + * second glottal impulse is in the 2nd subframe, + * - build exc[] in 2nd subframe + *--------------------------------------------------------*/ + + if ( ( *T0 ) + ( *position ) < L_SUBFR ) + { + /* impulse must be in the 2nd subframe (not in 1st) */ + *T0 = L_SUBFR - ( *position ); + *T0_frac = 0; + } + + if ( ( *T0 ) + ( *position ) >= 2 * L_SUBFR ) + { + /* impulse must be in the 2nd subframe (not in 3rd) */ + *T0 = 2 * L_SUBFR - 1 - ( *position ); + *T0_frac = 2; + } + + limit_T0( L_FRAME, 8, pit_flag, limit_flag, *T0, 0, T0_min, T0_max ); /* find T0_min and T0_max for delta search */ + + /* 7bit ENCODER */ + index = ( *T0 - pit_start ) * 2 + *T0_frac / 2; + push_indice( hBstr, IND_PITCH, index, nBits ); + + /* Find the adaptive codebook vector - ACELP long-term prediction */ + pred_lt4( &exc[i_subfr], &exc[i_subfr], *T0, *T0_frac, L_SUBFR + 1, inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + + offset = tbe_celp_exc_offset( *T0, *T0_frac ); + for ( i = 0; i < L_SUBFR * HIBND_ACB_L_FAC; i++ ) + { + bwe_exc[i + i_subfr * HIBND_ACB_L_FAC] = bwe_exc[i + i_subfr * HIBND_ACB_L_FAC - offset]; + } + } + else if ( ( i_subfr == 2 * L_SUBFR ) && ( *tc_subfr == TC_0_128 ) ) + { + /*--------------------------------------------------------* + * second glottal impulse is in the 3rd subframe + * - build exc[] in 3rd subframe + *--------------------------------------------------------*/ + + pit_start = 2 * L_SUBFR - ( *position ); + + pit_flag = 0; + + *T0 = pitch_fr4( &exc[i_subfr], xn, h1, *T0_min, *T0_max, T0_frac, pit_flag, limit_flag, pit_start, 3 * L_SUBFR, L_FRAME, L_SUBFR ); + + if ( ( *T0 ) + ( *position ) < 2 * L_SUBFR ) + { + /* impulse must be in the 3rd subframe (not in 2nd) */ + *T0 = 2 * L_SUBFR - ( *position ); + *T0_frac = 0; + } + if ( ( *T0 ) + ( *position ) >= 3 * L_SUBFR ) + { + /* impulse must be in the 3rd subframe (not in 4th) */ + *T0 = 3 * L_SUBFR - 1 - ( *position ); + *T0_frac = 2; + } + + limit_T0( L_FRAME, 8, pit_flag, limit_flag, *T0, 0, T0_min, T0_max ); /* find T0_min and T0_max for delta search */ + + index = ( *T0 - pit_start ) * 2 + *T0_frac / 2; + push_indice( hBstr, IND_PITCH, index, nBits ); + + /* Find the adaptive codebook vector - ACELP long-term prediction */ + pred_lt4( &exc[i_subfr], &exc[i_subfr], *T0, *T0_frac, L_SUBFR + 1, inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + + offset = tbe_celp_exc_offset( *T0, *T0_frac ); + for ( i = 0; i < L_SUBFR * HIBND_ACB_L_FAC; i++ ) + { + bwe_exc[i + i_subfr * HIBND_ACB_L_FAC] = bwe_exc[i + i_subfr * HIBND_ACB_L_FAC - offset]; + } + } + else if ( ( i_subfr == 2 * L_SUBFR ) && ( *tc_subfr == TC_0_192 ) ) + { + /*--------------------------------------------------------* + * second glottal impulse is in the 4th subframe + * - build exc[] in 3rd subframe + *--------------------------------------------------------*/ + + *T0 = 4 * L_SUBFR; + *T0_frac = 0; + *Jopt_flag = 0; + + set_f( &exc[i_subfr], 0, (int16_t) ( L_SUBFR + 1 ) ); + set_f( &bwe_exc[i_subfr * HIBND_ACB_L_FAC], 0, (int16_t) ( L_SUBFR * HIBND_ACB_L_FAC ) ); + } + else if ( ( i_subfr == 3 * L_SUBFR ) && ( *tc_subfr == TC_0_192 ) ) + { + /*--------------------------------------------------------* + * second glottal impulse is in the 4th subframe + * - build exc[] in 4th subframe + *--------------------------------------------------------*/ + /* always T0_frac = 0 */ + pit_flag = 0; + + *T0 = pitch_fr4( &exc[i_subfr], xn, h1, *T0_min, *T0_max, T0_frac, pit_flag, limit_flag, PIT_MIN, PIT_FR1_8b, L_FRAME, L_SUBFR ); + + if ( ( *T0 ) + ( *position ) < 3 * L_SUBFR ) + { + /* impulse must be in the 4th subframe (not in 3rd) */ + *T0 = 3 * L_SUBFR - ( *position ); + *T0_frac = 0; + } + + pit_start = 3 * L_SUBFR - ( *position ); + pit_limit = 2 * L_FRAME - PIT_MAX - 2 - 2 * ( *position ); + + if ( *T0 < pit_limit ) + { + index = ( *T0 - pit_start ) * 2 + *T0_frac / 2; + } + else + { + index = *T0 - pit_limit + ( pit_limit - pit_start ) * 2; + *T0_frac = 0; + } + + push_indice( hBstr, IND_PITCH, index, nBits ); + + /* Find the adaptive codebook vector - ACELP long-term prediction */ + pred_lt4( &exc[i_subfr], &exc[i_subfr], *T0, *T0_frac, L_SUBFR + 1, inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + + offset = tbe_celp_exc_offset( *T0, *T0_frac ); + for ( i = 0; i < L_SUBFR * HIBND_ACB_L_FAC; i++ ) + { + bwe_exc[i + i_subfr * HIBND_ACB_L_FAC] = bwe_exc[i + i_subfr * HIBND_ACB_L_FAC - offset]; + } + } + else if ( ( i_subfr == 3 * L_SUBFR ) && ( *tc_subfr == TC_0_128 ) ) + { + /*--------------------------------------------------------* + * second glottal impulse in the 3rd subframe + * build exc[] in 4th subframe + *--------------------------------------------------------*/ + + pit_flag = L_SUBFR; + *T0 = pitch_fr4( &exc[i_subfr], xn, h1, *T0_min, *T0_max, T0_frac, pit_flag, limit_flag, PIT_MIN, PIT_FR1_8b, L_FRAME, L_SUBFR ); + index = delta_pit_enc( 2, *T0, *T0_frac, *T0_min ); + push_indice( hBstr, IND_PITCH, index, nBits ); + + /* Find the adaptive codebook vector - ACELP long-term prediction */ + pred_lt4( &exc[i_subfr], &exc[i_subfr], *T0, *T0_frac, L_SUBFR + 1, inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + + offset = tbe_celp_exc_offset( *T0, *T0_frac ); + for ( i = 0; i < L_SUBFR * HIBND_ACB_L_FAC; i++ ) + { + bwe_exc[i + i_subfr * HIBND_ACB_L_FAC] = bwe_exc[i + i_subfr * HIBND_ACB_L_FAC - offset]; + } + } + + /*------------------------------------------------------------* + * first glottal impulse is NOT in the 1st subframe, + * or two impulses are in the 1st subframe + *------------------------------------------------------------*/ + else + { + if ( nBits == 8 || nBits == 5 ) + { + if ( !( ( *tc_subfr == 0 ) && ( i_subfr == L_SUBFR ) ) ) + { + *T0 = pitch_fr4( &exc[i_subfr], xn, h1, *T0_min, *T0_max, T0_frac, pit_flag, limit_flag, PIT_MIN, PIT_FR1_8b, L_FRAME, L_SUBFR ); + } + } + else + { + *T0 = pitch_fr4( &exc[i_subfr], xn, h1, *T0_min, *T0_max, T0_frac, pit_flag, limit_flag, PIT_FR2_9b, PIT_FR1_9b, L_FRAME, L_SUBFR ); + } + + pit_Q_enc( hBstr, 0, nBits, 8, pit_flag, limit_flag, *T0, *T0_frac, T0_min, T0_max ); + + /* Find the adaptive codebook vector - ACELP long-term prediction */ + pred_lt4( &exc[i_subfr], &exc[i_subfr], *T0, *T0_frac, L_SUBFR + 1, inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + + offset = tbe_celp_exc_offset( *T0, *T0_frac ); + for ( i = 0; i < L_SUBFR * HIBND_ACB_L_FAC; i++ ) + { + bwe_exc[i + i_subfr * HIBND_ACB_L_FAC] = bwe_exc[i + i_subfr * HIBND_ACB_L_FAC - offset]; + } + } + + if ( *Jopt_flag == 0 ) + { + /* adaptive/TC excitation is zero */ + mvr2r( xn, xn2, L_SUBFR ); + g_corr[0] = 0.0f; + g_corr[1] = 0.0f; + *clip_gain = 0; + } + else + { + *clip_gain = gp_clip( st->element_mode, st->core_brate, st->voicing, i_subfr, TRANSITION, xn, gp_cl ); + + lp_select = lp_filt_exc_enc( MODE1, TRANSITION, i_subfr, exc, h1, xn, y1, xn2, L_SUBFR, st->L_frame, g_corr, *clip_gain, gain_pit, &lp_flag ); + + if ( lp_flag == NORMAL_OPERATION ) + { + push_indice( hBstr, IND_LP_FILT_SELECT, lp_select, 1 ); + } + } + + **pt_pitch = (float) ( *T0 ) + (float) ( *T0_frac ) / 4.0f; /* save subframe pitch values */ + + /*---------------------------------------------------------------------* + * fill the pitch buffer - needed for post-processing + *---------------------------------------------------------------------*/ + + if ( ( *tc_subfr >= 2 * L_SUBFR ) && ( i_subfr == 3 * L_SUBFR ) ) + { + ( *pt_pitch ) -= 3; + **pt_pitch = (float) ( *T0 ) + (float) ( *T0_frac ) / 4.0f; + ( *pt_pitch )++; + **pt_pitch = (float) ( *T0 ) + (float) ( *T0_frac ) / 4.0f; + ( *pt_pitch )++; + **pt_pitch = (float) ( *T0 ) + (float) ( *T0_frac ) / 4.0f; + ( *pt_pitch )++; + } + else if ( ( *tc_subfr == L_SUBFR ) && ( i_subfr == 2 * L_SUBFR ) ) + { + ( *pt_pitch ) -= 2; + **pt_pitch = (float) ( *T0 ) + (float) ( *T0_frac ) / 4.0f; + ( *pt_pitch )++; + **pt_pitch = (float) ( *T0 ) + (float) ( *T0_frac ) / 4.0f; + ( *pt_pitch )++; + } + else if ( ( *tc_subfr == TC_0_64 ) && ( i_subfr == L_SUBFR ) ) + { + ( *pt_pitch ) -= 1; + **pt_pitch = (float) ( *T0 ) + (float) ( *T0_frac ) / 4.0f; + ( *pt_pitch )++; + } + else if ( ( *tc_subfr == TC_0_128 ) && ( i_subfr == 2 * L_SUBFR ) ) + { + ( *pt_pitch ) -= 2; + **pt_pitch = (float) ( *T0 ) + (float) ( *T0_frac ) / 4.0f; + ( *pt_pitch )++; + **pt_pitch = (float) ( *T0 ) + (float) ( *T0_frac ) / 4.0f; + ( *pt_pitch )++; + } + else if ( ( *tc_subfr == TC_0_192 ) && ( i_subfr == 3 * L_SUBFR ) ) + { + ( *pt_pitch ) -= 3; + **pt_pitch = (float) ( *T0 ) + (float) ( *T0_frac ) / 4.0f; + ( *pt_pitch )++; + **pt_pitch = (float) ( *T0 ) + (float) ( *T0_frac ) / 4.0f; + ( *pt_pitch )++; + **pt_pitch = (float) ( *T0 ) + (float) ( *T0_frac ) / 4.0f; + ( *pt_pitch )++; + } + } + else /* L_frame == L_FRAME16k */ + { + if ( i_subfr >= 2 * L_SUBFR ) + { + limit_flag = 1; + } + + if ( i_subfr <= 2 * L_SUBFR ) + { + if ( i_subfr < 2 * L_SUBFR ) + { + mult_Top = 1; + if ( T_op[0] < PIT16k_MIN ) + { + mult_Top = 2; + } + limit_T0( L_FRAME16k, 8, 0, limit_flag, mult_Top * T_op[0], 0, T0_min, T0_max ); /* TC0 second subfr. */ + } + else + { + limit_T0( L_FRAME16k, 8, 0, limit_flag, T_op[1], 0, T0_min, T0_max ); /* TC0 third subfr., or TC64 third subfr. */ + } + } + + /*-----------------------------------------------------------------* + * get number of bits for pitch encoding + *-----------------------------------------------------------------*/ + + nBits = st->acelp_cfg.pitch_bits[i_subfr / L_SUBFR]; + + /*-----------------------------------------------------------------* + * Find adaptive part of excitation, encode pitch period + *-----------------------------------------------------------------*/ + + if ( nBits == 10 ) + { + *T0 = pitch_fr4( &exc[i_subfr], xn, h1, *T0_min, *T0_max, T0_frac, 0, limit_flag, PIT16k_FR2_EXTEND_10b, PIT16k_MAX, st->L_frame, L_SUBFR ); + pit16k_Q_enc( hBstr, nBits, limit_flag, *T0, *T0_frac, T0_min, T0_max ); + } + else if ( nBits == 8 ) /* tc_subfr==0 && i_subfr==L_SUBFR */ + { + /*-----------------------------------------------------------------------------* + * The pitch range is encoded absolutely with 8 bits and is divided as follows: + * PIT16k_MIN to PIT16k_FR2_TC0_2SUBFR-1 resolution 1/4 (frac = 0,1,2 or 3) + * PIT16k_FR2_TC0_2SUBFR to 2*L_SUBFR resolution 1/2 (frac = 0 or 2) + *-----------------------------------------------------------------------------*/ + + *T0 = pitch_fr4( &exc[i_subfr], xn, h1, *T0_min, *T0_max, T0_frac, 0, limit_flag, PIT16k_FR2_TC0_2SUBFR, 2 * L_SUBFR, st->L_frame, L_SUBFR ); + + if ( *T0_max > 2 * L_SUBFR ) + { + *T0 = 2 * L_SUBFR; + *T0_frac = 0; + } + + if ( *T0 < PIT16k_FR2_TC0_2SUBFR ) + { + index = ( *T0 ) * 4 + ( *T0_frac ) - ( PIT16k_MIN * 4 ); + } + else + { + index = ( *T0 ) * 2 + ( ( *T0_frac ) >> 1 ) - ( PIT16k_FR2_TC0_2SUBFR * 2 ) + ( ( PIT16k_FR2_TC0_2SUBFR - PIT16k_MIN ) * 4 ); + } + + push_indice( hBstr, IND_PITCH, index, nBits ); + } + else if ( nBits == 6 ) + { + /* delta search */ + *T0 = pitch_fr4( &exc[i_subfr], xn, h1, *T0_min, *T0_max, T0_frac, L_SUBFR, limit_flag, PIT16k_FR2_EXTEND_9b, PIT16k_FR1_EXTEND_9b, st->L_frame, L_SUBFR ); + + index = delta_pit_enc( 4, *T0, *T0_frac, *T0_min ); + + push_indice( hBstr, IND_PITCH, index, nBits ); + } + if ( nBits == 6 ) + { + limit_T0( L_FRAME16k, 8, L_SUBFR, limit_flag, *T0, *T0_frac, T0_min, T0_max ); + } + + /*-----------------------------------------------------------------* + * - gain clipping test to avoid unstable synthesis + * - LP filtering of the adaptive excitation + * - codebook target computation + *-----------------------------------------------------------------*/ + + if ( ( i_subfr == L_SUBFR ) && ( *T0 == 2 * L_SUBFR ) ) + { + *gain_pit = 0.0f; + *clip_gain = 0; + g_corr[0] = 0.01f; + g_corr[1] = 0.01f; + *Jopt_flag = 0; + + set_f( &exc[i_subfr], 0, L_SUBFR + 1 ); /* set excitation for current subrame to 0 */ + + push_indice( hBstr, IND_LP_FILT_SELECT, 0, 1 ); /* this bit is actually not needed */ + + mvr2r( xn, xn2, L_SUBFR ); /* target vector for codebook search */ + set_f( y1, 0, L_SUBFR ); /* set filtered adaptive excitation to 0 */ + set_f( &bwe_exc[i_subfr * 2], 0, L_SUBFR * 2 ); + } + else + { + /* Find the adaptive codebook vector - ACELP long-term prediction */ + pred_lt4( &exc[i_subfr], &exc[i_subfr], *T0, *T0_frac, L_SUBFR + 1, inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + + for ( i = 0; i < L_SUBFR * 2; i++ ) + { + bwe_exc[i + i_subfr * 2] = bwe_exc[i + i_subfr * 2 - *T0 * 2 - (int16_t) ( (float) *T0_frac * 0.5f + 4 + 0.5f ) + 4]; + } + + *clip_gain = gp_clip( st->element_mode, st->core_brate, st->voicing, i_subfr, TRANSITION, xn, gp_cl ); + + lp_select = lp_filt_exc_enc( MODE1, TRANSITION, i_subfr, exc, h1, xn, y1, xn2, L_SUBFR, st->L_frame, g_corr, *clip_gain, gain_pit, &lp_flag ); + + if ( lp_flag == NORMAL_OPERATION ) + { + push_indice( hBstr, IND_LP_FILT_SELECT, lp_select, 1 ); + } + + *Jopt_flag = 1; + } + + **pt_pitch = (float) ( *T0 ) + (float) ( *T0_frac ) / 4.0f; /* save subframe pitch value */ + + /*---------------------------------------------------------------------* + * fill the pitch buffer - needed for post-processing + *---------------------------------------------------------------------*/ + + if ( ( i_subfr - *tc_subfr == L_SUBFR ) || ( *tc_subfr == 0 && i_subfr == 2 * L_SUBFR ) ) + { + index = i_subfr / L_SUBFR; + ( *pt_pitch ) -= index; + + for ( i = 0; i < index; i++ ) + { + **pt_pitch = (float) ( *T0 ) + (float) ( *T0_frac ) / 4.0f; + ( *pt_pitch )++; + } + } + } + } + + return; +} + + +/*-------------------------------------------------------------------------------------------* + * tc_enc() + * + * Principal function for transition coding (TC) in encoder. + * Glottal codebook contribution part: + * + * |----| |----| xn + * imp_pos->|| | imp_shape->| g1 | | + * | | | | g2 | ---- exc |---| y1 ---- | + * | | |-------------| |----|gain|-------| h |------|gain|----(-)---> xn2 + * | || | gn | ---- |---| ---- + * |----| |----| + * codebook excitation gain_trans h_orig gain_pit + * + *-------------------------------------------------------------------------------------------*/ + +static void tc_enc( + Encoder_State *st, /* i/o: encoder state structure */ + const int16_t i_subfr, /* i : subrame index */ + int16_t *tc_subfr, /* i/o: TC subframe index */ + int16_t *position, /* i/o: index of the residual signal maximum */ + const float *h1, /* i : weighted filter input response */ + const float *xn, /* i : target signal */ + float *exc, /* o : glottal codebook contribution */ + float *y1, /* o : filtered glottal codebook contribution */ + int16_t *T0_min, /* o : lower pitch limit */ + int16_t *T0_max, /* o : higher pitch limit */ + int16_t *T0, /* o : close loop integer pitch */ + int16_t *T0_frac, /* o : close loop fractional part of the pitch */ + float *gain_pit, /* o : pitch gain (0..GAIN_PIT_MAX) */ + float g_corr[], /* o : correlations and -2 */ + float *bwe_exc /* i/o: excitation for SWB TBE */ +) +{ + int16_t imp_shape, imp_pos, imp_sign, imp_gain, index, nBits; + float gain_trans; + BSTR_ENC_HANDLE hBstr = st->hBstr; + + imp_pos = *position - i_subfr; + + /*-----------------------------------------------------------------* + * get number of bits for pitch encoding + *-----------------------------------------------------------------*/ + + nBits = st->acelp_cfg.pitch_bits[i_subfr / L_SUBFR]; + + /*--------------------------------------------------------------* + * Closed loop pitch search + *--------------------------------------------------------------*/ + + *T0_frac = 0; + if ( st->L_frame == L_FRAME ) + { + if ( ( *T0_min <= L_SUBFR ) || ( *tc_subfr == 3 * L_SUBFR ) ) + { + if ( nBits == 9 ) + { + *T0 = pitch_fr4( &exc[i_subfr], xn, h1, *T0_min, *T0_max, T0_frac, 0, 0, PIT_FR2_9b, PIT_FR1_9b, L_FRAME, L_SUBFR ); + } + else if ( nBits == 6 ) + { + *T0 = pitch_fr4( &exc[i_subfr], xn, h1, *T0_min, *T0_max, T0_frac, 0, 0, PIT_MIN, L_SUBFR, L_FRAME, L_SUBFR ); + } + else + { + *T0 = pitch_fr4( &exc[i_subfr], xn, h1, *T0_min, *T0_max, T0_frac, 0, 0, PIT_MAX, PIT_MIN, L_FRAME, L_SUBFR ); + } + } + else + { + *T0 = L_SUBFR; + } + + if ( ( *tc_subfr == L_SUBFR ) && ( *T0 < L_SUBFR ) ) + { + *T0 = L_SUBFR; + } + } + else /* L_frame == L_FRAME16k */ + { + if ( nBits == 10 ) + { + *T0 = pitch_fr4( &exc[i_subfr], xn, h1, *T0_min, *T0_max, T0_frac, 0, 1, PIT16k_FR2_EXTEND_10b, PIT16k_MAX, L_FRAME16k, L_SUBFR ); + } + else if ( nBits == 6 ) + { + /* T0_frac with 1/2 sample resolution */ + *T0 = pitch_fr4( &exc[i_subfr], xn, h1, *T0_min, *T0_max, T0_frac, 0, 0, PIT16k_MIN, L_SUBFR, L_FRAME16k, L_SUBFR ); + + if ( *T0 > L_SUBFR ) + { + *T0 = L_SUBFR; + *T0_frac = 0; + } + } + } + + /* set tc_subfr to TC_0_0 */ + if ( i_subfr == 0 && st->L_frame == L_FRAME && ( *T0 < L_SUBFR || *tc_subfr == 3 * L_SUBFR ) ) + { + *tc_subfr = TC_0_0; + } + + /*--------------------------------------------------------------* + * Builds glottal codebook contribution + *--------------------------------------------------------------*/ + + set_impulse( xn, h1, &exc[i_subfr], y1, &imp_shape, &imp_pos, &gain_trans ); + + /*--------------------------------------------------------------* + * quantize gain_trans and scale glottal codebook contribution + *--------------------------------------------------------------*/ + + gain_trans_enc( &gain_trans, &exc[i_subfr], &imp_gain, &imp_sign ); + + /* set past excitation buffer to zeros */ + set_f( exc - L_EXC_MEM, 0, L_EXC_MEM ); + + /*--------------------------------------------------------------* + * adapt. search of the second impulse in the same subframe + * (when appears) + *--------------------------------------------------------------*/ + + pred_lt4_tc( exc, *T0, *T0_frac, inter4_2, imp_pos, i_subfr ); + + if ( st->hBWE_TD != NULL ) + { + if ( st->L_frame == L_FRAME ) + { + interp_code_5over2( &exc[i_subfr], &bwe_exc[i_subfr * HIBND_ACB_L_FAC], L_SUBFR ); + } + else + { + interp_code_4over2( &exc[i_subfr], &bwe_exc[i_subfr * 2], L_SUBFR ); + } + } + + /*--------------------------------------------------------------* + * compute glottal-shape codebook excitation + *--------------------------------------------------------------*/ + + /* create filtered glottal codebook contribution */ + conv( &exc[i_subfr], h1, y1, L_SUBFR ); + + /* gain_pit computation */ + *gain_pit = corr_xy1( xn, y1, g_corr, L_SUBFR, 0 ); + + /*--------------------------------------------------------------* + * Encode parameters and write indices + *--------------------------------------------------------------*/ + + if ( st->L_frame == L_FRAME ) + { + if ( ( ( i_subfr != 0 ) || ( *tc_subfr == TC_0_0 ) ) && ( *tc_subfr != L_SUBFR ) ) + { + /* write pitch index */ + if ( ( *T0 >= L_SUBFR ) && ( *tc_subfr != 3 * L_SUBFR ) ) + { + push_indice( hBstr, IND_PITCH, 0, nBits ); + } + else if ( *tc_subfr == 3 * L_SUBFR ) + { + if ( nBits == 9 ) + { + index = abs_pit_enc( 4, 0, *T0, *T0_frac ); + } + else + { + index = abs_pit_enc( 2, 0, *T0, *T0_frac ); + } + + push_indice( hBstr, IND_PITCH, index, nBits ); + + limit_T0( L_FRAME, 8, 0, 0, *T0, 0, T0_min, T0_max ); + } + else + { + if ( nBits == 6 ) + { + index = delta_pit_enc( 2, *T0, *T0_frac, PIT_MIN - 1 ); + push_indice( hBstr, IND_PITCH, index, nBits ); + } + else + { + index = delta_pit_enc( 0, *T0, *T0_frac, PIT_MIN - 1 ); + push_indice( hBstr, IND_PITCH, index, nBits ); + } + } + } + } + else /* L_frame == L_FRAME16k */ + { + if ( nBits == 10 ) + { + pit16k_Q_enc( hBstr, nBits, 1, *T0, *T0_frac, T0_min, T0_max ); + } + else if ( nBits == 6 ) + { + index = 2 * ( *T0 - PIT16k_MIN ) + *T0_frac / 2; + push_indice( hBstr, IND_PITCH, index, nBits ); + } + } + + push_indice( hBstr, IND_TC_IMP_SHAPE, imp_shape, 3 ); + push_indice( hBstr, IND_TC_IMP_POS, imp_pos, 6 ); + push_indice( hBstr, IND_TC_IMP_SIGN, imp_sign, 1 ); + push_indice( hBstr, IND_TC_IMP_GAIN, imp_gain, 3 ); + + *position = imp_pos + i_subfr; + + return; +} + +/*-----------------------------------------------------------------* + * gain_trans_enc() + * + * Quantize gain_trans of TC (gains of glottal impulses). + * - Uses scalar quantization prototypes tbl_gain_trans_tc[N_GAIN_TC]. + * - Gains the glottal codebook contibution signal. + *-----------------------------------------------------------------*/ + +static void gain_trans_enc( + float *gain_trans, /* i/o: gain for TC */ + float exc[], /* i/o: glottal codebook contribution */ + int16_t *quant_index, /* o : index of quantized gain_trans */ + int16_t *quant_sign /* o : sign of quantized gain_trans */ +) +{ + int16_t i; + + + if ( *gain_trans < 0 ) + { + *gain_trans *= -1; + *quant_sign = 0; + } + else + { + *quant_sign = 1; + } + + *quant_index = N_GAIN_TC - 1; + + for ( i = 0; i < N_GAIN_TC - 1; i++ ) + { + if ( *gain_trans < tbl_gain_trans_tc[i] ) + { + *quant_index = i; + break; + } + } + + /* restore gain_trans */ + *gain_trans = tbl_gain_trans_tc[i]; + + if ( *quant_sign == 0 ) + { + *gain_trans *= -1; + } + + for ( i = 0; i < L_SUBFR; i++ ) + { + exc[i] *= ( *gain_trans ); + } + + return; +} + + +/*-----------------------------------------------------------------* + * tc_classif_enc() + * + * TC subframe determination + *-----------------------------------------------------------------*/ + +void tc_classif_enc( + const int16_t L_frame, /* i : length of the frame */ + int16_t *tc_subfr, /* o : TC subframe index */ + int16_t *position, /* o : maximum of residual signal index */ + const int16_t attack_flag, /* i : attack flag */ + const int16_t pitch, /* i : open loop pitch estimates for first halfframe */ + const float *res /* i : pointer to the LP residual signal frame */ +) +{ + float temp; + int16_t T_op; + + T_op = pitch; + if ( L_frame == L_FRAME16k ) + { + T_op = (int16_t) ( pitch * 1.25f + 0.5f ); + } + + *tc_subfr = -1; + if ( attack_flag ) + { + *tc_subfr = 3 * L_SUBFR; + + if ( attack_flag > 0 ) + { + if ( L_frame == L_FRAME ) + { + *tc_subfr = NB_SUBFR * ( attack_flag - 1 ) / 32 /*ATT_NSEG*/; + } + else + { + *tc_subfr = NB_SUBFR16k * ( attack_flag - 1 ) / 32 /*ATT_NSEG*/; + } + *tc_subfr *= L_SUBFR; + } + } + + if ( attack_flag ) + { + /*-----------------------------------------------------------------* + * TC: subrame determination for glottal shape search + * ------------------------------------------------------- + * tc_subfr == 0 - TC in 1st subframe + * tc_subfr == TC_0_0 - TC in 1st subframe + information about T0 + * tc_subfr == L_SUBFR - TC in 2nd subframe + * tc_subfr == 2*L_SUBFR - TC in 3rd subframe + * tc_subfr == 3*L_SUBFR - TC in 4th subframe + *-----------------------------------------------------------------*/ + + *position = emaximum( res + *tc_subfr, min( T_op + 2, L_SUBFR ), &temp ) + *tc_subfr; + } + else + { + *position = emaximum( res, (int16_t) ( T_op + 2 ), &temp ); + + /* correction in case of possibly wrong T_op (double-pitch values) */ + if ( ( L_frame == L_FRAME && T_op > 2 * PIT_MIN ) || + ( L_frame == L_FRAME16k && T_op > 2 * PIT16k_MIN ) ) + { + int16_t position_tmp, len; + float aver, temp2; + + len = (int16_t) ( T_op / 2 + 2 ); + + position_tmp = emaximum( res, len, &temp2 ); + aver = dotp( res, res, len ) + 0.01f; + aver = sqrtf( aver / len ); + + temp = sqrtf( temp ); + temp2 = sqrtf( temp2 ); + + if ( temp2 > 0.8f * temp && aver < 0.25f * temp ) + { + *position = position_tmp; + } + } + + *tc_subfr = (int16_t) floor( ( *position ) / L_SUBFR ) * L_SUBFR; + } + + return; +} diff --git a/lib_enc/update_decision.c b/lib_enc/update_decision.c new file mode 100644 index 0000000000000000000000000000000000000000..1269ca68da6e44c4618b2c6c38b32bc5657bfd55 --- /dev/null +++ b/lib_enc/update_decision.c @@ -0,0 +1,287 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "prot.h" +#include "wmc_auto.h" + + +/*-------------------------------------------------------------------* + * bg_music_decision() + * + * + *-------------------------------------------------------------------*/ + +void bg_music_decision( + VAD_CLDFB_HANDLE hVAD_CLDFB, /* i/o: CLDFB VAD state */ + int16_t *music_backgound_f, /* i : background music flag */ + const float frame_energy /* i : current frame energy 1 */ +) +{ + int16_t music_background_frame = 0; + float *sp_center = hVAD_CLDFB->sp_center; + float *ltd_stable_rate = hVAD_CLDFB->ltd_stable_rate; + float *sSFM = hVAD_CLDFB->sfm; + float *f_tonality_rate = hVAD_CLDFB->f_tonality_rate; + + if ( ( f_tonality_rate[1] > 0.60 ) || ( f_tonality_rate[0] > 0.86 ) ) + { + if ( ltd_stable_rate[0] < 0.072 && sp_center[0] > 1.2 && ( sSFM[0] < 0.76 || sSFM[1] < 0.88 || sSFM[2] < 0.96 ) ) + { + music_background_frame = 1; + } + } + + if ( music_background_frame && ( 4.6 * hVAD_CLDFB->fg_energy_count * frame_energy > hVAD_CLDFB->fg_energy ) && ( hVAD_CLDFB->fg_energy_est_start == 1 ) ) + { + hVAD_CLDFB->music_background_rate = hVAD_CLDFB->music_background_rate * 0.975f + 0.025f; + } + else if ( music_background_frame ) + { + hVAD_CLDFB->music_background_rate = hVAD_CLDFB->music_background_rate * 0.998f + 0.002f; + } + else + { + hVAD_CLDFB->music_background_rate = hVAD_CLDFB->music_background_rate * 0.997f; + } + + if ( hVAD_CLDFB->music_background_rate > 0.5 ) + { + *music_backgound_f = 1; + } + else + { + *music_backgound_f = 0; + } + + return; +} + + +/*-------------------------------------------------------------------* + * update_decision() + * + * + *-------------------------------------------------------------------*/ + +int16_t update_decision( + VAD_CLDFB_HANDLE hVAD_CLDFB, /* i/o: CLDFB VAD state */ + const float snr, /* i : frequency domain SNR */ + const float tsnr, /* i : time domain SNR */ + const float frame_energy, /* i : current frame energy */ + const float high_eng, /* i : current frame high frequency energy */ + const int16_t vad_flag, /* i : VAD flag */ + const int16_t music_backgound_f /* i : background music flag */ +) +{ + float g_high_eng_sacle = 0.0f; + float sp_center3_diff; + int16_t update_flag = 1; + int16_t tonality_flag = 0; + int16_t frameloop = hVAD_CLDFB->frameloop; + int16_t bw = hVAD_CLDFB->bw_index; + float *sp_center = hVAD_CLDFB->sp_center; + float *ltd_stable_rate = hVAD_CLDFB->ltd_stable_rate; + float *sSFM = hVAD_CLDFB->sfm; + float *f_tonality_rate = hVAD_CLDFB->f_tonality_rate; + float tmpout = frame_energy - 4 * hVAD_CLDFB->frame_energy_smooth; + + g_high_eng_sacle = high_eng / ( hVAD_CLDFB->lt_bg_highf_eng + FLT_MIN ); + sp_center3_diff = sp_center[3] - hVAD_CLDFB->lt_noise_sp_center3; + + if ( frameloop > 50 ) + { + if ( ltd_stable_rate[0] > 0.12 ) + { + update_flag = 0; + } + + if ( ( bw == CLDFBVAD_WB_ID || bw == CLDFBVAD_SWB_ID ) && hVAD_CLDFB->frame_energy_smooth < 4 * frame_energy ) + { + if ( g_high_eng_sacle > 3.0f && ( sp_center3_diff > 0.4 ) ) + { + update_flag = 0; + } + if ( ( sp_center[3] > 2.8f ) && ( ltd_stable_rate[0] > 0.02f ) ) + { + update_flag = 0; + } + } + } + + if ( ( f_tonality_rate[1] > 0.50 ) && ( ltd_stable_rate[0] > 0.1 ) ) + { + update_flag = 0; + } + if ( sSFM[1] < 0.92 && sSFM[0] < 0.92 && sSFM[2] < 0.92 ) + { + update_flag = 0; + } + if ( sSFM[0] < 0.80 || sSFM[1] < 0.78 || sSFM[2] < 0.80 ) + { + update_flag = 0; + } + + if ( frame_energy > 32 * hVAD_CLDFB->frame_energy_smooth ) + { + update_flag = 0; + } + if ( ( 4.6 * hVAD_CLDFB->fg_energy_count * frame_energy > hVAD_CLDFB->fg_energy ) && ( hVAD_CLDFB->fg_energy_est_start == 1 ) && ( frame_energy > 3 ) ) + { + update_flag = 0; + } + if ( ( f_tonality_rate[1] > 0.60 ) || ( f_tonality_rate[0] > 0.86 ) ) + { + update_flag = 0; + tonality_flag = 1; + } + + if ( tonality_flag ) + { + hVAD_CLDFB->tonality_rate3 = hVAD_CLDFB->tonality_rate3 * 0.983f + 0.017f; + } + else + { + hVAD_CLDFB->tonality_rate3 = hVAD_CLDFB->tonality_rate3 * 0.983f; + } + + if ( hVAD_CLDFB->tonality_rate3 > 0.5 ) + { + update_flag = 0; + } + + if ( ( sp_center[0] > 4.0f ) && ltd_stable_rate[0] > 0.04 ) + { + update_flag = 0; + } + if ( ( f_tonality_rate[1] > 0.46 ) && ( ( sSFM[1] > 0.93 ) || ( ltd_stable_rate[0] > 0.09 ) ) ) + { + update_flag = 0; + } + if ( ( sSFM[1] < 0.93 && sSFM[0] < 0.92 && sSFM[2] < 0.97 ) && ( f_tonality_rate[1] > 0.5 ) ) + { + update_flag = 0; + } + if ( ( f_tonality_rate[1] > 0.43 ) && ( sSFM[0] < 0.95 ) && ( sp_center[1] > 1.94f ) ) + { + update_flag = 0; + } + + if ( update_flag ) + { + if ( hVAD_CLDFB->update_count < 1000 ) + { + hVAD_CLDFB->update_count = hVAD_CLDFB->update_count + 1; + } + } + + if ( update_flag ) + { + hVAD_CLDFB->lt_noise_sp_center3 = 0.9f * hVAD_CLDFB->lt_noise_sp_center3 + 0.1f * sp_center[3]; + } + if ( ( tmpout > 0 ) && ( frameloop < 100 ) && ( f_tonality_rate[1] < 0.56 ) && ( ( sp_center[0] < 1.36 ) || ltd_stable_rate[0] < 0.03 ) ) + { + update_flag = 1; + } + if ( snr < 0.3 && tmpout < 0 && tsnr < 1.2 && vad_flag == 0 && f_tonality_rate[1] < 0.5 && ( music_backgound_f == 0 ) && ltd_stable_rate[3] < 0.1 ) + + { + update_flag = 1; + } + if ( vad_flag && ( snr > 1.0 ) && bw == CLDFBVAD_SWB_ID && tmpout > 0 ) + { + update_flag = 0; + } + + if ( vad_flag && ( snr > 1.5 ) && bw != CLDFBVAD_SWB_ID && tmpout > 0 ) + { + update_flag = 0; + } + + if ( update_flag == 0 ) + { + hVAD_CLDFB->update_num_with_snr = 0; + } + else + { + if ( vad_flag && ( snr > 3.0 ) && hVAD_CLDFB->update_num_with_snr < 10 ) + { + update_flag = 0; + hVAD_CLDFB->update_num_with_snr++; + } + } + + if ( vad_flag == 0 || update_flag == 1 ) + { + float tmpp = (float) fabs( hVAD_CLDFB->sp_center[2] - hVAD_CLDFB->lt_noise_sp_center0 ); + + if ( tmpp > 2.5 ) + { + tmpp = 2.5f; + } + + hVAD_CLDFB->lt_noise_sp_center_diff_sum += tmpp; + hVAD_CLDFB->lt_noise_sp_center_diff_counter++; + + if ( hVAD_CLDFB->lt_noise_sp_center_diff_counter == 128 ) + { + hVAD_CLDFB->lt_noise_sp_center_diff_sum = hVAD_CLDFB->lt_noise_sp_center_diff_sum * 0.75f; + hVAD_CLDFB->lt_noise_sp_center_diff_counter = 96; + } + + if ( fabs( sp_center[0] - hVAD_CLDFB->lt_noise_sp_center0 ) > 2.4 ) + { + hVAD_CLDFB->lt_noise_sp_center0 = 0.996f * hVAD_CLDFB->lt_noise_sp_center0 + 0.004f * sp_center[0]; + } + else if ( fabs( sp_center[0] - hVAD_CLDFB->lt_noise_sp_center0 ) > 1.0 ) + { + hVAD_CLDFB->lt_noise_sp_center0 = 0.99f * hVAD_CLDFB->lt_noise_sp_center0 + 0.01f * sp_center[0]; + } + else + { + hVAD_CLDFB->lt_noise_sp_center0 = 0.96f * hVAD_CLDFB->lt_noise_sp_center0 + 0.04f * sp_center[0]; + } + } + + if ( ( fabs( sp_center[2] - hVAD_CLDFB->lt_noise_sp_center0 ) > ( 6 * ( hVAD_CLDFB->lt_noise_sp_center_diff_sum / hVAD_CLDFB->lt_noise_sp_center_diff_counter ) + 0.3 ) ) && hVAD_CLDFB->frameloop > 200 ) + { + update_flag = 0; + } + + return update_flag; +} diff --git a/lib_enc/updt_enc.c b/lib_enc/updt_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..a92e7ef472954ca47e3810a401c3b5936e0c1562 --- /dev/null +++ b/lib_enc/updt_enc.c @@ -0,0 +1,457 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * updt_enc() + * + * Common updates (all frame types) + *-------------------------------------------------------------------*/ + +void updt_enc( + Encoder_State *st, /* i/o: state structure */ + const float *old_exc, /* i : buffer of excitation */ + const float *pitch_buf, /* i : floating pitch for each subframe */ + const float Es_pred, /* i : predicited scaled innovation energy */ + const float *Aq, /* i : A(z) quantized for all subframes */ + const float *lsf_new, /* i : current frame LSF vector */ + const float *lsp_new, /* i : current frame LSP vector */ + const float *old_bwe_exc /* i : buffer of excitation */ +) +{ + int16_t i; + + /* update old excitation buffer */ + mvr2r( &old_exc[st->L_frame], st->hLPDmem->old_exc, L_EXC_MEM ); + if ( !st->Opt_AMR_WB && st->hBWE_TD != NULL ) + { + mvr2r( &old_bwe_exc[L_FRAME32k], st->hBWE_TD->old_bwe_exc, PIT16k_MAX * 2 ); + } + + /* update old LSP and LSF vector */ + mvr2r( lsp_new, st->lsp_old, M ); + mvr2r( lsf_new, st->lsf_old, M ); + + /* update last coder type */ + st->last_coder_type = st->coder_type; + if ( st->coder_type == INACTIVE || ( st->bpf_off == 1 && st->coder_type != AUDIO && st->coder_type != TRANSITION ) ) + { + st->last_coder_type = UNVOICED; + } + + /* this ensures that st->last_coder_type is never set to INACTIVE in case of AVQ inactive because the FEC does not distinguish between GSC inactive and AVQ inactive */ + if ( st->coder_type == INACTIVE && st->total_brate > ACELP_24k40 ) + { + st->last_coder_type = GENERIC; + } + + if ( st->Opt_AMR_WB && st->coder_type == INACTIVE && st->core_brate != SID_1k75 && st->core_brate != FRAME_NO_DATA ) + { + /* overwrite previous coding type to help FEC */ + st->last_coder_type = UNVOICED; + } + + /* AC mode (GSC) - in speech we can consider that the last pitch band reached the max */ + if ( st->hGSCEnc != NULL && st->coder_type != AUDIO && st->coder_type != INACTIVE ) + { + st->hGSCEnc->mem_last_pit_band = 10 + BAND1k2; + st->hGSCEnc->past_dyn_dec = NOISE_LEVEL_SP0 - 1; /* tends to speech */ + st->hGSCEnc->noise_lev = NOISE_LEVEL_SP0 - 1; /* tends to speech */ + st->hGSCEnc->mid_dyn = 40.0f * 0.5f + st->hGSCEnc->mid_dyn * 0.5f; + } + + /* convert old LSP vector from 12kHz domain to 16kHz domain (needed in case of ACELP@12k8 <-> ACELP@16kHz switching) */ + if ( st->L_frame == L_FRAME ) + { + mvr2r( st->lsp_old, st->lsp_old16k, M ); + + st->rate_switching_reset_16kHz = lsp_convert_poly( st->lsp_old16k, L_FRAME16k, st->Opt_AMR_WB ); + } + + /* update buffer of old subframe pitch values */ + if ( st->last_L_frame != st->L_frame ) + { + if ( st->L_frame == L_FRAME ) + { + for ( i = 0; i < NB_SUBFR; i++ ) + { + st->old_pitch_buf[NB_SUBFR + i] = 0.8f * st->old_pitch_buf[NB_SUBFR + i + 1]; + } + } + else + { + for ( i = NB_SUBFR; i > 0; i-- ) + { + st->old_pitch_buf[NB_SUBFR + i] = 1.25f * st->old_pitch_buf[NB_SUBFR + i - 1]; + } + st->old_pitch_buf[2 * NB_SUBFR16k - 1] = st->old_pitch_buf[2 * NB_SUBFR16k - 2]; + } + } + + mvr2r( &st->old_pitch_buf[st->L_frame / L_SUBFR], st->old_pitch_buf, st->L_frame / L_SUBFR ); + mvr2r( pitch_buf, &st->old_pitch_buf[st->L_frame / L_SUBFR], st->L_frame / L_SUBFR ); + + /* SC-VBR */ + st->last_Opt_SC_VBR = st->Opt_SC_VBR; + if ( st->hSC_VBR != NULL ) + { + st->hSC_VBR->last_last_ppp_mode = st->hSC_VBR->last_ppp_mode; + st->hSC_VBR->last_ppp_mode = st->hSC_VBR->ppp_mode; + st->hSC_VBR->last_nelp_mode = st->hSC_VBR->nelp_mode; + } + + /* core switching updates */ + mvr2r( &Aq[( st->L_frame / L_SUBFR - 1 ) * ( M + 1 )], st->old_Aq_12_8, M + 1 ); + st->old_Es_pred = Es_pred; + + return; +} + +/*-------------------------------------------------------------------* + * updt_IO_switch() + * + * Common updates for AMR-WB IO mode and EVS primary mode switching + *-------------------------------------------------------------------*/ + +void updt_IO_switch_enc( + Encoder_State *st, /* i/o: state structure */ + const int16_t input_frame /* i : input frame length */ +) +{ + float xsp_tmp[M]; + + if ( st->last_core == AMR_WB_CORE ) /* switching to EVS primary mode */ + { + /* reset onset detection counter */ + st->tc_cnt = -1; + + /* force safety-net LSFQ in the first frames after the switching */ + st->Nb_ACELP_frames = 0; + + /* AMR-WB IO mode uses ISF(ISP), but EVS primary mode LSF(LSP) */ + mvr2r( stable_LSP, xsp_tmp, M ); + isf2lsf( st->lsf_old, st->lsf_old, xsp_tmp, M, INT_FS_12k8 ); + mvr2r( stable_LSP, xsp_tmp, M ); + isp2lsp( st->lsp_old, st->lsp_old, xsp_tmp, M ); + isp2lsp( st->lsp_old1, st->lsp_old1, xsp_tmp, M ); + + mvr2r( stable_LSP, xsp_tmp, M ); + isp2lsp( st->hDtxEnc->lspCNG, st->hDtxEnc->lspCNG, xsp_tmp, M ); + if ( st->hTdCngEnc->old_enr_index >= 0 ) + { + st->hTdCngEnc->old_enr_index = min( (int16_t) ( (float) st->hTdCngEnc->old_enr_index / STEP_AMR_WB_SID * STEP_SID ), 127 ); + } + /* Perform preemphasis of the old input signal @16kHz */ + st->mem_preemph16k = 0; + preemph( st->old_inp_16k, PREEMPH_FAC_16k, L_INP_MEM, &( st->mem_preemph16k ) ); + + /* reset TD BWE buffers */ + set_f( st->hBWE_TD->old_speech_wb, 0.0f, ( L_LOOK_12k8 + L_SUBFR ) * 5 / 16 ); + set_f( st->hBWE_TD->old_bwe_exc, 0.0f, PIT16k_MAX * 2 ); + set_f( st->hBWE_TD->old_bwe_exc_extended, 0.0f, NL_BUFF_OFFSET ); + InitSWBencBufferStates( st->hBWE_TD, NULL ); + + st->hBWE_TD->bwe_non_lin_prev_scale = 0.0; + set_f( st->hBWE_TD->decim_state1, 0.0f, ( 2 * ALLPASSSECTIONS_STEEP + 1 ) ); + set_f( st->hBWE_TD->decim_state2, 0.0f, ( 2 * ALLPASSSECTIONS_STEEP + 1 ) ); + set_f( st->hBWE_FD->old_wtda_swb, 0, L_FRAME16k ); + set_f( st->hBWE_FD->old_input_wb, 0, NS2SA( 16000, DELAY_FD_BWE_ENC_NS ) ); + + wb_tbe_extras_reset( st->hBWE_TD->mem_genSHBexc_filt_down_wb2, st->hBWE_TD->mem_genSHBexc_filt_down_wb3 ); + if ( input_frame >= L_FRAME32k ) + { + swb_tbe_reset( st->hBWE_TD->mem_csfilt, st->hBWE_TD->mem_genSHBexc_filt_down_shb, st->hBWE_TD->state_lpc_syn, st->hBWE_TD->syn_overlap, st->hBWE_TD->state_syn_shbexc, &( st->hBWE_TD->tbe_demph ), &( st->hBWE_TD->tbe_premph ), st->hBWE_TD->mem_stp_swb, &( st->hBWE_TD->gain_prec_swb ) ); + } + + if ( input_frame == L_FRAME48k ) + { + set_f( st->hBWE_TD->fb_state_lpc_syn, 0, LPC_SHB_ORDER ); + st->hBWE_TD->fb_tbe_demph = 0; + fb_tbe_reset_enc( st->hBWE_TD->elliptic_bpf_2_48k_mem, &st->hBWE_TD->prev_fb_energy ); + } + + /* reset FD BWE buffers */ + st->hBWE_FD->prev_mode = NORMAL; + + /* reset the unvoiced/audio signal improvement memories */ + st->hGSCEnc->seed_tcx = 15687; + + st->use_acelp_preq = 0; + + set_f( st->hSpMusClas->finc_prev, 0.0f, ATT_NSEG ); + st->hSpMusClas->lt_finc = 0.0f; + st->hSpMusClas->last_strong_attack = 0; + set_f( st->hSpMusClas->tod_lt_Bin_E, 0.0f, TOD_NSPEC ); + set_f( st->hSpMusClas->tod_S_map_lt, 0.0f, TOD_NSPEC ); + st->hSpMusClas->tod_thr_lt = TOD_THR_MASS; + st->hSpMusClas->tod_weight = 0.0f; + st->hSpMusClas->tod_S_mass_prev = TOD_THR_MASS; + st->hSpMusClas->tod_S_mass_lt = TOD_THR_MASS; + } + else /* switching to AMR-WB IO mode */ + { + set_f( st->mem_MA, 0, M ); + + /* AMR-WB IO mode uses ISF(ISP), but EVS primary mode LSF(LSP) */ + mvr2r( stable_ISP, xsp_tmp, M ); + lsf2isf( st->lsf_old, st->lsf_old, xsp_tmp, M, INT_FS_12k8 ); + mvr2r( stable_ISP, xsp_tmp, M ); + lsp2isp( st->lsp_old, st->lsp_old, xsp_tmp, M ); + mvr2r( st->lsp_old, st->lsp_old1, M ); + lsp2isp( st->lsp_old1, st->lsp_old1, xsp_tmp, M ); + mvr2r( stable_ISP, xsp_tmp, M ); + lsp2isp( st->hDtxEnc->lspCNG, st->hDtxEnc->lspCNG, xsp_tmp, M ); + if ( st->hTdCngEnc->old_enr_index >= 0 ) + { + st->hTdCngEnc->old_enr_index = min( (int16_t) ( (float) st->hTdCngEnc->old_enr_index / STEP_SID * STEP_AMR_WB_SID ), 63 ); + } + + /* gain quantization memory */ + set_f( st->hAmrwb_IO->past_qua_en, -14.0f, GAIN_PRED_ORDER ); + + /* reset VBR signaling */ + if ( st->Opt_SC_VBR ) + { + st->hSC_VBR->ppp_mode = 0; + st->hSC_VBR->nelp_mode = 0; + } + + /* reset the unvoiced/audio signal improvement memories */ + st->hGSCEnc->seed_tcx = 15687; + } + + if ( st->hTdCngEnc != NULL ) + { + /* Force SID in case of AMR-WB IO mode/EVS primary mode switching */ + st->hDtxEnc->cnt_SID = 0; + st->hDtxEnc->cng_cnt = 0; + st->hTdCngEnc->ho_hist_size = 0; + st->hTdCngEnc->burst_ho_cnt = 0; + } + + /* LP memories */ + mvr2r( UVWB_Ave, st->mem_AR, M ); + + /* FEC - update adaptive LSF mean vector */ + mvr2r( st->lsf_old, st->lsfoldbfi0, M ); + mvr2r( st->lsf_old, st->lsfoldbfi1, M ); + mvr2r( st->lsf_old, st->lsf_adaptive_mean, M ); + + return; +} + + +/*-------------------------------------------------------------------* + * updt_enc_common() + * + * Common updates for MODE1 and MODE2 + *-------------------------------------------------------------------*/ + +void updt_enc_common( + Encoder_State *st /* i/o: encoder state structure */ +) +{ + /*---------------------------------------------------------------------* + * Updates - main main codec parameters + *---------------------------------------------------------------------*/ + + st->last_sr_core = st->sr_core; + st->last_codec_mode = st->codec_mode; + st->last_L_frame = st->L_frame; + st->last_core = st->core; + + st->last_total_brate = st->total_brate; + st->last_bits_frame_nominal = st->bits_frame_nominal; + st->last_core_brate = st->core_brate; + st->last_extl = st->extl; + st->last_input_bwidth = st->input_bwidth; + st->last_bwidth = st->bwidth; + st->last_coder_type_raw = st->coder_type_raw; + + if ( st->core_brate > SID_2k40 && st->hDtxEnc != NULL ) + { + st->hDtxEnc->last_active_brate = st->total_brate; + } + + if ( st->hBWE_TD != NULL ) + { + if ( st->core == HQ_CORE ) + { + /* in the HQ core, coder_type is not used so it could have been set to anything */ + st->hBWE_TD->prev_coder_type = GENERIC; + } + else + { + st->hBWE_TD->prev_coder_type = st->coder_type; + } + } + + if ( st->Opt_DTX_ON && st->hTdCngEnc != NULL ) + { + if ( st->core_brate > SID_2k40 ) + { + if ( st->hDtxEnc->first_CNG == 1 ) + { + if ( st->hTdCngEnc->act_cnt >= BUF_DEC_RATE ) + { + st->hTdCngEnc->act_cnt = 0; + } + st->hTdCngEnc->act_cnt++; + + if ( st->hTdCngEnc->act_cnt == BUF_DEC_RATE && st->hTdCngEnc->ho_hist_size > 0 ) + { + st->hTdCngEnc->ho_hist_size--; + } + } + + if ( st->element_mode == IVAS_SCE || st->element_mode == IVAS_CPE_DFT || st->element_mode == IVAS_CPE_TD || st->hDtxEnc->first_CNG == 1 ) + { + if ( ++( st->hTdCngEnc->act_cnt2 ) >= MIN_ACT_CNG_UPD ) + { + st->hTdCngEnc->act_cnt2 = MIN_ACT_CNG_UPD; + } + + if ( ( st->element_mode == IVAS_SCE || st->element_mode == IVAS_CPE_DFT || st->element_mode == IVAS_CPE_TD ) && st->hTdCngEnc->act_cnt2 >= MIN_ACT_CNG_UPD ) + { + st->hTdCngEnc->CNG_att = 0.0f; + + apply_scale( &st->hTdCngEnc->CNG_att, st->hFdCngEnc->hFdCngCom->CngBandwidth, st->hFdCngEnc->hFdCngCom->CngBitrate, scaleTableStereo, SIZE_SCALE_TABLE_STEREO ); + } + } + } + + if ( ( st->core_brate == SID_2k40 || st->core_brate == FRAME_NO_DATA ) && st->hDtxEnc->first_CNG == 0 && st->cng_type == LP_CNG ) + { + st->hDtxEnc->first_CNG = 1; + } + } + + /*-----------------------------------------------------------------* + * Increase the counter of initialization frames + * Limit the max number of init. frames + *-----------------------------------------------------------------*/ + + if ( st->ini_frame < MAX_FRAME_COUNTER ) + { + ( st->ini_frame )++; + } + + /* synchronisation of CNG seeds */ + if ( st->hTdCngEnc != NULL && st->core_brate != FRAME_NO_DATA && st->core_brate != SID_2k40 && st->core != AMR_WB_CORE ) + { + own_random( &( st->hTdCngEnc->cng_seed ) ); + own_random( &( st->hTdCngEnc->cng_ener_seed ) ); + } + + /*---------------------------------------------------------------------* + * Updates - MODE2 + *---------------------------------------------------------------------*/ + + if ( st->element_mode == EVS_MONO && st->mdct_sw == MODE2 ) + { + st->codec_mode = MODE2; + + st->sr_core = getCoreSamplerateMode2( EVS_MONO, st->total_brate, st->bwidth, st->flag_ACELP16k, st->rf_mode, 0 ); + + st->L_frame = (int16_t) ( st->sr_core / FRAMES_PER_SEC ); + + if ( st->sr_core == INT_FS_12k8 ) + { + st->preemph_fac = PREEMPH_FAC; + st->gamma = GAMMA1; + } + else + { + st->preemph_fac = PREEMPH_FAC_16k; + st->gamma = GAMMA16k; + } + + st->igf = getIgfPresent( EVS_MONO, st->total_brate, st->bwidth, st->rf_mode ); + } + + /* update FER clas */ + if ( st->core != AMR_WB_CORE ) + { + st->last_clas = st->clas; + } + + /* Update Core */ + core_encode_update( st ); + + /*---------------------------------------------------------------------* + * RF mode updates + *---------------------------------------------------------------------*/ + + if ( st->rf_mode ) + { + if ( st->hSC_VBR != NULL ) + { + if ( st->hRF->rf_frame_type == RF_NELP ) + { + st->hSC_VBR->last_nelp_mode = 1; + } + else + { + st->hSC_VBR->last_nelp_mode = 0; + } + } + } + + st->rf_mode_last = st->rf_mode; + + if ( st->Opt_RF_ON ) + { + st->L_frame = L_FRAME; + st->rf_mode = 1; + } + + /*---------------------------------------------------------------------* + * Other updates + *---------------------------------------------------------------------*/ + + if ( st->element_mode > EVS_MONO && st->hTcxEnc != NULL ) + { + st->hTcxEnc->tcxltp_norm_corr_mem = st->hTcxEnc->tcxltp_norm_corr_past; + } + + return; +} diff --git a/lib_enc/updt_tar.c b/lib_enc/updt_tar.c new file mode 100644 index 0000000000000000000000000000000000000000..52eb709cca36caecc5bb50728a0da18e6ed401e1 --- /dev/null +++ b/lib_enc/updt_tar.c @@ -0,0 +1,65 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "prot.h" +#include "wmc_auto.h" + +/*----------------------------------------------------------------------------------* + * procedure updt_tar() + * + * Update the target vector for codebook search. + *----------------------------------------------------------------------------------*/ + +void updt_tar( + const float *x, /* i : old target (for pitch search) */ + float *x2, /* o : new target (for codebook search) */ + const float *y, /* i : filtered adaptive codebook vector */ + const float gain, /* i : adaptive codebook gain */ + const int16_t L /* i : subframe size */ +) +{ + int16_t i; + + + for ( i = 0; i < L; i++ ) + { + x2[i] = x[i] - gain * y[i]; + } + + return; +} diff --git a/lib_enc/vad.c b/lib_enc/vad.c new file mode 100644 index 0000000000000000000000000000000000000000..2486aa843e086fe9e91fa0051301d75394f73996 --- /dev/null +++ b/lib_enc/vad.c @@ -0,0 +1,1099 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "rom_enc.h" +#include "wmc_auto.h" +#include "ivas_prot.h" + +/*-----------------------------------------------------------------* + * Local constants + *-----------------------------------------------------------------*/ + +#define HANGOVER_LONG 10 /* Hangover for CNG */ +#define HANGOVER_LONG_HE 20 /* Hangover of CNG */ +#define HANGOVER_LONG_MUSIC 20 /* Hangover of CNG */ +#define HANGOVER_LONG_NB 8 /* Hangover for CNG */ +#define ACTIVE_FRAMES 3 /* Number of consecutive active SPEECH frames necessary to trigger HO */ + +#define TH16_2 35.0f /* long-term SNR that separates the curves for clean speech and noisy speech */ +#define TH8_1 20.0f /* long-term SNR that separates the curves for clean speech and noisy speech */ +#define TH16_2_NFLAG 35.0f +#define TH8_1_NFLAG 35.0f + + +#define SNR_OUTLIER_WGHT_1 1.00f +#define SNR_OUTLIER_WGHT_2 1.01f +#define SNR_OUTLIER_WGHT_3 1.02f +#define OUTLIER_THR_1 10.0f +#define OUTLIER_THR_2 6.0f +#define MAX_SNR_OUTLIER_IND 17 +#define MAX_SNR_OUTLIER_1 10.0f +#define MAX_SNR_OUTLIER_2 25.0f +#define MAX_SNR_OUTLIER_3 50.0f + +/*---------------------------------------------------------------------* + * wb_vad_init() + * + * VAD initializations + *---------------------------------------------------------------------*/ + +void wb_vad_init( + VAD_HANDLE hVAD /* i/o: VAD data handle */ +) +{ + hVAD->hangover_cnt = 0; /* Hangover counter initialized to 0 */ + hVAD->nb_active_frames = ACTIVE_FRAMES; /* The counter of SPEECH frames necessary to trigger HO */ + /* is set to max (-> start with hangover) */ + + hVAD->vad_flag_reg_H = 0L; + hVAD->vad_flag_reg_L = 0L; + hVAD->vad_prim_reg = 0L; + hVAD->vad_flag_cnt_50 = 0; + hVAD->vad_prim_cnt_16 = 0; + + /* By default one should not start with a hangover */ + hVAD->hangover_cnt_dtx = HANGOVER_LONG; /* hangover for DTX */ + hVAD->hangover_cnt_music = HANGOVER_LONG_MUSIC; /* hangover for DTX */ + + hVAD->hangover_cnt_he = 0; /* Hangover counter initialized to 0 */ + hVAD->nb_active_frames_he = ACTIVE_FRAMES; /* The counter of SPEECH frames necessary to trigger HO */ + hVAD->bcg_flux = 70; + hVAD->soft_hangover = 0; + hVAD->voiced_burst = 0; + hVAD->bcg_flux_init = 50; + hVAD->nb_active_frames_he1 = ACTIVE_FRAMES; + hVAD->hangover_cnt_he1 = 0; + + hVAD->prim_act_quick = 0.0f; + hVAD->prim_act_slow = 0.0f; + hVAD->prim_act = 0.0f; + hVAD->prim_act_quick_he = 0.0f; + hVAD->prim_act_slow_he = 0.0f; + hVAD->prim_act_he = 0.0f; + + hVAD->consec_inactive = 0; + hVAD->spectral_tilt_reset = 1; + hVAD->running_avg = 0; + hVAD->ra_deltasum = 0; + hVAD->trigger_SID = 0; + hVAD->snr_sum_vad = 0; + + hVAD->hangover_terminate_flag = 0; + + return; +} + +/*-----------------------------------------------------------------* + * sing_thr_snr_acc() + * + * accumulate snr_sum with significance thresholds + *-----------------------------------------------------------------*/ + +static void sign_thr_snr_acc( + float *snr_sum, + float snr, + float sign_thr, + float min_snr ) +{ + if ( snr >= sign_thr ) + { + *snr_sum = *snr_sum + snr; + } + else + { + *snr_sum = *snr_sum + min_snr; + } + + return; +} + +/*-----------------------------------------------------------------* + * dtx_hangover_addition() + * + * accumulate snr_sum with significance thresholds + *-----------------------------------------------------------------*/ + +int16_t dtx_hangover_addition( + Encoder_State *st, /* i/o: encoder state structure */ + const int16_t vad_flag, /* i : VAD flag */ + const float lp_snr, /* i : input single SNR estimate */ + const int16_t cldfb_subtraction, /* i : */ + int16_t *vad_hover_flag, /* o : VAD hangover flag */ + VAD_HANDLE hVAD, /* i/o: VAD handle for L or R channel */ + NOISE_EST_HANDLE hNoiseEst, /* i : Noise estimation handle */ + int16_t *rem_dtx_ho /* o : Expected remaining hangover frames */ +) +{ + int16_t hangover_short_dtx, flag_dtx; + int16_t ho_limit_clean; + + if ( hVAD == NULL ) + { + hVAD = st->hVAD; + } + if ( hNoiseEst == NULL ) + { + hNoiseEst = st->hNoiseEst; + } + + flag_dtx = 0; + + /* Determine initial hangover length */ + hangover_short_dtx = 2; /* was 1 */ + if ( ( lp_snr < 16.0f && st->input_bwidth != NB ) || + hVAD->prim_act_he > 0.95f ) + { + hangover_short_dtx = 3; /* was 2 */ + } + + /* Adjust hangover according to activity history */ + if ( hVAD->vad_prim_cnt_16 > 12 ) /* 12 requires roughly > 80% primary activity */ + { + hangover_short_dtx = hangover_short_dtx + 2; + } + + if ( hVAD->vad_flag_cnt_50 > 40 ) /* 40 requires roughtly > 80% flag activity */ + { + hangover_short_dtx = hangover_short_dtx + 5; + } + + /* Keep hangover_short lower than maximum hangover count */ + if ( hangover_short_dtx > HANGOVER_LONG - 1 ) + { + hangover_short_dtx = HANGOVER_LONG - 1; + } + + /* Only allow short HO if not sufficient active frames */ + ho_limit_clean = 3; + if ( st->core == AMR_WB_CORE ) + { + ho_limit_clean = 2; + } + + if ( st->input_bwidth != NB && st->core != AMR_WB_CORE && lp_snr > 25.0f ) + { + ho_limit_clean = 2; + } + + if ( ho_limit_clean != 0 ) + { + if ( ( hangover_short_dtx > ho_limit_clean ) && ( ( hVAD->vad_prim_cnt_16 < 7 ) || ( lp_snr > 16 && hVAD->prim_act_he < 0.85 ) ) ) + { + hangover_short_dtx = ho_limit_clean; + } + } + + /* hangover adjustment from combined FFT + CLDFBVAD */ + if ( st->core != AMR_WB_CORE ) + { + hangover_short_dtx = hangover_short_dtx - cldfb_subtraction; + if ( hangover_short_dtx < 0 ) + { + hangover_short_dtx = 0; + } + } + + if ( vad_flag == 1 ) /* Speech present */ + { + flag_dtx = 1; + + /* Add hangover after sufficient # of active frames or sufficient activity during last second */ + if ( hVAD->nb_active_frames >= ACTIVE_FRAMES || hVAD->vad_flag_cnt_50 > 45 ) /* 45 requires roughtly > 90% flag activity */ + { + hVAD->hangover_cnt_dtx = 0; + } + + /* inside HO period */ + if ( hVAD->hangover_cnt_dtx < HANGOVER_LONG && hVAD->hangover_cnt_dtx != 0 ) + { + hVAD->hangover_cnt_dtx++; + } + + hVAD->hangover_terminate_flag = 0; + + /* Music hangover when music detected */ + if ( hVAD->prim_act_he > 0.98f && hNoiseEst->Etot_lp > 40 && hVAD->vad_prim_cnt_16 > 14 && hVAD->vad_flag_cnt_50 > 48 ) + { + hVAD->hangover_cnt_music = 0; + } + + /* inside music HO period */ + if ( hVAD->hangover_cnt_music < HANGOVER_LONG_MUSIC && hVAD->hangover_cnt_music != 0 ) + { + hVAD->hangover_cnt_music++; + } + } + else + { + /* Reset the counter of speech frames necessary to start hangover algorithm */ + if ( hVAD->hangover_cnt_dtx < HANGOVER_LONG ) /* inside HO period */ + { + hVAD->hangover_cnt_dtx++; + } + + if ( hVAD->hangover_cnt_music < HANGOVER_LONG_MUSIC ) /* inside music HO period */ + { + hVAD->hangover_cnt_music++; + } + + /* fast terminate DTX hangover if st->hangover_terminate_flag is set */ + if ( hVAD->hangover_terminate_flag == 1 ) + { + hVAD->hangover_cnt = HANGOVER_LONG; + hVAD->hangover_cnt_dtx = HANGOVER_LONG; + hVAD->hangover_terminate_flag = 0; + /* only shorten music hangover when low energy frames */ + if ( hNoiseEst->Etot_lp < 20.0f ) + { + hVAD->hangover_cnt_music = HANGOVER_LONG_MUSIC; + } + } + + if ( hVAD->hangover_cnt_dtx <= hangover_short_dtx ) /* "hard" hangover */ + { + flag_dtx = 1; + } + + if ( hVAD->hangover_cnt_music <= 15 ) /* "hard" hangover */ + { + flag_dtx = 1; + } + } + + if ( flag_dtx != 0 && st->localVAD == 0 ) + { + *vad_hover_flag = 1; + if ( rem_dtx_ho != NULL ) + { + *rem_dtx_ho = max( hangover_short_dtx - hVAD->hangover_cnt_dtx, 0 ); + } + } + + return flag_dtx; +} + + +/*-----------------------------------------------------------------* + * wb_vad() + * + * Voice Activity Detector + *-----------------------------------------------------------------*/ + +int16_t wb_vad( + Encoder_State *st, /* i/o: encoder state structure */ + const float fr_bands[], /* i : per band input energy (contains 2 vectors) */ + int16_t *noisy_speech_HO, /* o : SC-VBR noisy speech HO flag */ + int16_t *clean_speech_HO, /* o : SC-VBR clean speech HO flag */ + int16_t *NB_speech_HO, /* o : SC-VBR NB speech HO flag */ + float *snr_sum_he, /* o : Output snr_sum as weighted spectral measure */ + int16_t *localVAD_HE_SAD, /* o : HE_SAD decision without hangovers */ + int16_t *flag_noisy_speech_snr, /* o : */ + VAD_HANDLE hVAD, /* i/o: VAD handle */ + NOISE_EST_HANDLE hNoiseEst, /* i/o: Noise estimation handle */ + float lp_speech, /* i : long term active speech energy average */ + float lp_noise /* i : long term noise energy */ +) +{ + int16_t i, j, flag, hangover_short; + float snr[NB_BANDS], snr_sum, thr1, thr2, lp_snr, nk, nc, th_clean; + const float *pt1, *pt2, *pt3; + float min_snr, sign_thr; + float fr_enr; + float ftmp, ftmp1; + float mssnr = 0; + float snr_sumt; + float vad_thr; + int16_t hangover_hd; + int16_t snr_idx; + float delta1, delta2, delta3; + int16_t flag_he1; + float mssnr_hov; + int16_t stmp; + float msnr; + float snr_outlier; + int16_t snr_outlier_index; + float accum_ener_L, accum_ener_H; + float delta4; + float snr18 = 1.0f, snr19 = 1.0f; + int16_t nb_sig_snr; + float nv; + float snr_sum_HE_SAD; + float sign_thr_HE_SAD, min_snr_HE_SAD; + float nv_ofs; + float thr1_ol; + float snr_sum_ol; + int16_t last_7k2_coder_type; + + if ( hNoiseEst == NULL ) + { + hNoiseEst = st->hNoiseEst; + } + + if ( hVAD == NULL ) + { + hVAD = st->hVAD; + } + + if ( lp_speech < -100.0f ) + { + lp_speech = st->lp_speech; + } + + if ( lp_noise < -100.0f ) + { + lp_noise = st->lp_noise; + } + + /*---------------------------------------------------------------------* + * Initialization + *---------------------------------------------------------------------*/ + + snr_outlier = 0; + snr_outlier_index = 0; + accum_ener_L = 0; + accum_ener_H = 0; + + if ( st->input_bwidth == NB ) + { + st->min_band = 1; + st->max_band = 16; + } + else + { + st->min_band = 0; + st->max_band = 19; + } + + if ( st->Opt_SC_VBR ) + { + last_7k2_coder_type = st->hSC_VBR->last_7k2_coder_type; + } + else + { + last_7k2_coder_type = -1; + } + + /*---------------------------------------------------------------------* + * set SNR thresholds depending on the input rate + *---------------------------------------------------------------------*/ + + if ( st->max_band == 19 ) /* WB input */ + { + nk = 0.1f; + nc = 16.1f; + nv = 2.05f; + nv_ofs = 1.65f; + th_clean = TH16_2; + if ( st->input_bwidth == WB ) + { + sign_thr = 1.3f; + min_snr = 0.8f; + } + else + { + sign_thr = 1.75f; + min_snr = 0.25f; + } + sign_thr_HE_SAD = 2.5f; + min_snr_HE_SAD = 0.2f; + } + else /* NB input */ + { + nk = 0.10f; + nc = 16.0f; + nv = 4.00f; /* Was 4.5f but trunkated to 4.00 used when converted to short */ + nv_ofs = 1.15f; + th_clean = TH8_1; + sign_thr = 1.75f; + min_snr = 0.25f; + + sign_thr_HE_SAD = 2.65f; + min_snr_HE_SAD = 0.05f; + } + + hangover_short = 0; + + + if ( st->Opt_SC_VBR ) + { + *noisy_speech_HO = 0; + *clean_speech_HO = 0; + *NB_speech_HO = 0; + } + + /*---------------------------------------------------------------------* + * compute SNR for each band & total + *---------------------------------------------------------------------*/ + + pt1 = fr_bands; + pt2 = fr_bands + NB_BANDS; + snr_sum = 0.0f; + *snr_sum_he = 0.0f; + snr_sumt = 0; + mssnr_hov = 0; + snr_sum_HE_SAD = 0.0f; + lp_snr = lp_speech - lp_noise; + + if ( lp_snr > 24.0f ) + { + snr_idx = 0; + } + else if ( lp_snr > 18 ) + { + snr_idx = 1; + } + else + { + snr_idx = 2; + } + + if ( snr_idx == 0 ) + { + stmp = 6; + delta1 = 0.0f; + delta2 = 0.0f; + delta3 = 0.0f; + delta4 = 0.0f; + vad_thr = 2.4f * lp_snr - 42.2f; + vad_thr = min( vad_thr, 80 ); + } + else if ( snr_idx == 1 ) + { + stmp = 6; + delta1 = 0.1f; + delta2 = 0.2f; + delta3 = 0.2f; + delta4 = 0.2f; + vad_thr = 2.4f * lp_snr - 40.2f; + vad_thr = min( vad_thr, 80 ); + } + else + { + stmp = 9; + delta1 = 0.2f; + delta2 = 0.4f; + delta3 = 0.3f; + delta4 = 0.4f; + vad_thr = 2.5f * lp_snr - 10.0f; + vad_thr = max( vad_thr, 1 ); + } + pt3 = hNoiseEst->bckr; + nb_sig_snr = 20; + + for ( i = st->min_band; i <= st->max_band; i++ ) + { + ftmp = *pt1++; + ftmp1 = *pt2++; + fr_enr = ( 0.2f * hNoiseEst->enrO[i] + 0.4f * ftmp + 0.4f * ftmp1 ); + + if ( ftmp > ftmp1 ) + { + snr[i] = ( 0.2f * hNoiseEst->enrO[i] + 0.4f * ftmp + 0.4f * ftmp1 ) / *pt3++; + } + else + { + snr[i] = ( 0.2f * hNoiseEst->enrO[i] + 0.3f * ftmp + 0.5f * ftmp1 ) / *pt3++; + } + + if ( snr[i] < 2.0f ) + { + nb_sig_snr--; + } + + if ( snr[i] < 1 ) + { + snr[i] = 1; + } + + snr[i] = (float) log10( snr[i] ); + snr_sumt += snr[i]; + if ( i < 2 ) + { + ftmp = snr[i] + delta1; + } + else if ( i < 7 ) + { + ftmp = snr[i] + delta2; + } + else if ( i < 18 ) + { + ftmp = snr[i] + delta3; + } + else + { + ftmp = snr[i] + delta4; + } + ftmp1 = ftmp; + if ( i < 7 ) + { + ftmp1 = ftmp + 0.4f; + } + ftmp = min( ftmp, 2.0f ); + ftmp1 = min( ftmp1, 2.0f ); + msnr = 1; + for ( j = 0; j < stmp; j++ ) + { + msnr *= ftmp; + } + mssnr += msnr; + if ( i == 18 ) + { + snr18 = msnr; + } + else if ( i == 19 ) + { + snr19 = msnr; + } + msnr = 1; + for ( j = 0; j < stmp; j++ ) + { + msnr *= ftmp1; + } + mssnr_hov += msnr; + snr[i] = fr_enr / hNoiseEst->bckr[i]; + + sign_thr_snr_acc( &snr_sum_HE_SAD, snr[i], sign_thr_HE_SAD, min_snr_HE_SAD ); + sign_thr_snr_acc( &snr_sum, snr[i], sign_thr, min_snr ); + + /* To make snr[] compatible with older versions where snr[i] >= 1 + also this could be removed if this no longer is a requriement */ + if ( snr[i] < 1.0f ) + { + snr[i] = 1.0f; + } + /* accumulate background noise energy in bands [0-2] and in bands [3-19]*/ + if ( i < 3 ) + { + accum_ener_L = accum_ener_L + hNoiseEst->bckr[i]; + } + else + { + accum_ener_H = accum_ener_H + hNoiseEst->bckr[i]; + } + + /* identify the outlier band */ + if ( snr[i] > snr_outlier ) + { + snr_outlier = snr[i]; + snr_outlier_index = i; + } + } + + if ( ( st->max_band == 19 ) && ( snr[18] > 5.0f ) && ( snr[19] > 5.0f ) ) + { + ftmp = ( mssnr + 3 * ( snr18 + snr19 ) ) * 0.77f; + if ( ftmp > mssnr ) + { + mssnr = ftmp; + } + } + else if ( snr_idx != 0 && nb_sig_snr > 13 ) + { + if ( 2.5f * lp_snr - 15.5f > 0 ) + { + mssnr += 2.5f * lp_snr - 15.5f; + } + } + + + /* Separate SNR_SUM modification to */ + snr_sum_ol = snr_sum; + if ( st->max_band == 19 && snr_outlier < MAX_SNR_OUTLIER_3 && snr_outlier_index > 3 && snr_outlier_index < MAX_SNR_OUTLIER_IND ) /* Update the total SNR only for WB signals */ + { + if ( ( accum_ener_L > OUTLIER_THR_1 * accum_ener_H ) || ( snr_outlier < MAX_SNR_OUTLIER_1 ) ) + { + snr_sum_ol = SNR_OUTLIER_WGHT_1 * ( snr_sum_ol - snr_outlier ); + } + else if ( ( accum_ener_L > OUTLIER_THR_2 * accum_ener_H ) || ( snr_outlier < MAX_SNR_OUTLIER_2 ) ) + { + snr_sum_ol = SNR_OUTLIER_WGHT_2 * ( snr_sum_ol - snr_outlier ); + } + else + { + snr_sum_ol = SNR_OUTLIER_WGHT_3 * ( snr_sum_ol - snr_outlier ); + } + } + + hVAD->snr_sum_vad = 0.5f * hVAD->snr_sum_vad + 0.5f * snr_sum_ol; + + snr_sum_ol = 10.0f * (float) log10( snr_sum_ol ); + snr_sum = snr_sum_ol; /* for NB no outlier modification */ + + snr_sum_HE_SAD = 10.0f * (float) log10( snr_sum_HE_SAD ); + *snr_sum_he = snr_sum_HE_SAD; + + /*---------------------------------------------------------------------* + * compute threshold for VAD decision + *---------------------------------------------------------------------*/ + + lp_snr = lp_speech - lp_noise; /* long-term SNR */ + + if ( lp_snr < hNoiseEst->sign_dyn_lp ) + { + lp_snr += 1; + + if ( lp_snr > hNoiseEst->sign_dyn_lp ) + { + lp_snr = hNoiseEst->sign_dyn_lp; + } + } + + thr1 = nk * lp_snr + nc + nv * ( hNoiseEst->Etot_v_h2 - nv_ofs ); /* threshold as a linear function of long-term SNR */ + + if ( st->element_mode > EVS_MONO && hNoiseEst->first_noise_updt_cnt < 100 ) + { + /* lower threshold during warmup time */ + thr1 -= 10.0f; + vad_thr = 0.f; + } + + if ( lp_snr > 20.0f ) + { + if ( st->element_mode == EVS_MONO || hNoiseEst->first_noise_updt_cnt >= 100 ) + { + /* increase the threshold when SNR is high */ + thr1 = thr1 + 0.3f * ( lp_snr - 20.0f ); + if ( st->max_band == 16 && lp_snr > 40 && thr1 > 24.1f && lp_speech < 45.0f ) + { + thr1 = 24.1f; + } + } + } + + /*---------------------------------------------------------------------* + * WB input + * SNR threshold computing + * Hangover control & final VAD decision + *---------------------------------------------------------------------*/ + + if ( st->input_bwidth != NB ) + { + /* Outlier Detection first calculates thr1_ol and snr_sum_ol instead of + thr1 and snr_sum */ + + thr1_ol = thr1; + if ( lp_snr < th_clean ) + { + hangover_short = 4; + if ( ( snr_outlier_index <= 4 && ( st->last_coder_type > UNVOICED ) && !st->Opt_SC_VBR ) || + ( snr_outlier_index <= 4 && ( last_7k2_coder_type > UNVOICED ) && st->Opt_SC_VBR ) ) + { + thr1_ol = thr1 - 1.0f; + snr_sum_ol = 10.0f * (float) log10( hVAD->snr_sum_vad ); + } + else if ( ( ( st->last_coder_type <= UNVOICED ) && ( snr_outlier < MAX_SNR_OUTLIER_2 ) && !st->Opt_SC_VBR ) || ( ( last_7k2_coder_type <= UNVOICED ) && ( snr_outlier < MAX_SNR_OUTLIER_2 ) && st->Opt_SC_VBR ) ) + { + thr1_ol = thr1 + (float) ( 1.0f - 0.04f * snr_outlier ); + } + else + { + thr1_ol = thr1 + max( 0, (float) ( 0.6f - 0.01f * snr_outlier ) ); + } + } + else + { + if ( st->Opt_SC_VBR ) + { + hangover_short = 3; + } + else + { + hangover_short = 3; + } + } + + /* The use of outlier detection had been removed by accident at some point */ + snr_sum = snr_sum_ol; + thr1 = thr1_ol; + + /* DTX HANGOVER ADDITION MOVED TO pre_proc() */ + + flag_he1 = 0; + st->localVAD = 0; + if ( mssnr > vad_thr ) + { + st->localVAD = 1; /* he1 primary decision */ + flag_he1 = 1; + hVAD->nb_active_frames_he1++; /* Counter of consecutive active speech frames */ + if ( hVAD->nb_active_frames_he1 >= ACTIVE_FRAMES ) + { + hVAD->nb_active_frames_he1 = ACTIVE_FRAMES; + hVAD->hangover_cnt_he1 = 0; /* Reset the counter of hangover frames after at least "active_frames" speech frames */ + } + /* inside HO period */ + if ( hVAD->hangover_cnt_he1 < HANGOVER_LONG_HE && hVAD->hangover_cnt_he1 != 0 ) + { + hVAD->hangover_cnt_he1++; + } + + if ( hVAD->soft_hangover > 0 ) + { + hVAD->soft_hangover--; + } + } + else + { + /* Reset the counter of speech frames necessary to start hangover algorithm */ + hVAD->nb_active_frames_he1 = 0; + } + + if ( hVAD->voiced_burst > 3 ) + { + if ( hVAD->bcg_flux < 40 ) + { + hVAD->soft_hangover = hangover_sf_tbl[snr_idx + 3]; + } + else + { + hVAD->soft_hangover = hangover_sf_tbl[snr_idx]; + } + } + + + hangover_hd = hangover_hd_tbl[snr_idx]; + + if ( hVAD->bcg_flux < 40 ) + { + hangover_hd = ( hangover_hd >> 1 ) + 1; + } + + if ( flag_he1 == 0 && hVAD->soft_hangover > 0 ) + { + if ( mssnr_hov > vad_thr ) + { + flag_he1 = 1; + hVAD->soft_hangover--; + } + else + { + hVAD->soft_hangover = 0; + } + + if ( hVAD->soft_hangover < 0 ) + { + hVAD->soft_hangover = 0; + } + } + + if ( flag_he1 == 0 && hVAD->hangover_cnt_he1 < hangover_hd && hVAD->soft_hangover == 0 ) + { + flag_he1 = 1; + hVAD->hangover_cnt_he1++; + } + + /* Calculate background stationarity */ + if ( flag_he1 == 0 && hNoiseEst->first_noise_updt > 0 ) + { + if ( snr_sumt > hVAD->bcg_flux ) + { + if ( hVAD->bcg_flux_init-- > 0 ) + { + if ( snr_sumt > hVAD->bcg_flux + 50 ) + { + hVAD->bcg_flux = 0.9f * hVAD->bcg_flux + ( 1 - 0.9f ) * ( hVAD->bcg_flux + 50 ); + } + else + { + hVAD->bcg_flux = 0.9f * hVAD->bcg_flux + ( 1 - 0.9f ) * snr_sumt; + } + } + else + { + if ( snr_sumt > hVAD->bcg_flux + 10 ) + { + hVAD->bcg_flux = 0.99f * hVAD->bcg_flux + ( 1 - 0.99f ) * ( hVAD->bcg_flux + 10 ); + } + else + { + hVAD->bcg_flux = 0.99f * hVAD->bcg_flux + ( 1 - 0.99f ) * snr_sumt; + } + } + } + else + { + if ( hVAD->bcg_flux_init-- > 0 ) + { + if ( snr_sumt < hVAD->bcg_flux - 30 ) + { + hVAD->bcg_flux = 0.95f * hVAD->bcg_flux + ( 1 - 0.95f ) * ( hVAD->bcg_flux - 30 ); + } + else + { + hVAD->bcg_flux = 0.95f * hVAD->bcg_flux + ( 1 - 0.95f ) * snr_sumt; + } + } + else + { + if ( snr_sumt < hVAD->bcg_flux - 10 ) + { + hVAD->bcg_flux = 0.9992f * hVAD->bcg_flux + ( 1 - 0.9992f ) * ( hVAD->bcg_flux - 10 ); + } + else + { + hVAD->bcg_flux = 0.9992f * hVAD->bcg_flux + ( 1 - 0.9992f ) * snr_sumt; + } + } + } + + if ( hVAD->bcg_flux_init < 0 ) + { + hVAD->bcg_flux_init = 0; + } + } + + flag = 0; + st->localVAD = 0; + + if ( ( snr_sum > thr1 && flag_he1 == 1 ) ) /* Speech present */ + { + flag = 1; + st->localVAD = 1; + hVAD->nb_active_frames++; /* Counter of consecutive active speech frames */ + if ( hVAD->nb_active_frames >= ACTIVE_FRAMES ) + { + hVAD->nb_active_frames = ACTIVE_FRAMES; + hVAD->hangover_cnt = 0; /* Reset the counter of hangover frames after at least "active_frames" speech frames */ + } + + /* inside HO period */ + if ( hVAD->hangover_cnt < HANGOVER_LONG && hVAD->hangover_cnt != 0 ) + { + hVAD->hangover_cnt++; + } + } + else + { + /* Reset the counter of speech frames necessary to start hangover algorithm */ + hVAD->nb_active_frames = 0; + if ( hVAD->hangover_cnt < HANGOVER_LONG ) /* inside HO period */ + { + hVAD->hangover_cnt++; + } + + if ( hVAD->hangover_cnt <= hangover_short ) /* "hard" hangover */ + { + /* send the extra 3 HO frames to NELP */ + if ( st->element_mode == EVS_MONO && ( lp_snr < th_clean ) && ( st->Opt_SC_VBR ) && ( hVAD->hangover_cnt >= 2 ) ) + { + *noisy_speech_HO = 1; + } + + if ( st->element_mode == EVS_MONO && ( lp_snr >= th_clean ) && ( st->Opt_SC_VBR ) && ( hVAD->hangover_cnt >= 2 ) ) + { + *clean_speech_HO = 1; + } + + flag = 1; + } + } + + /* localVAD and vad_flag for HE-SAD - in parallel with normal localVAD and vad_flag */ + *localVAD_HE_SAD = 0; + if ( snr_sum_HE_SAD > thr1 && ( flag_he1 == 1 ) ) /* Speech present */ + { + *localVAD_HE_SAD = 1; + } + } + + /*---------------------------------------------------------------------* + * NB input + * SNR threshold computing + * Hangover control & final VAD decision + *---------------------------------------------------------------------*/ + + else /* NB input */ + { + /* Add localVAD_HE_SAD also for NB operation for use with speech music classifier */ + *localVAD_HE_SAD = 0; + if ( snr_sum_HE_SAD > thr1 ) + { + *localVAD_HE_SAD = 1; + } + + st->localVAD = 0; /* init needed in NB, otherwise it can be undefined */ + if ( snr_sum > thr1 ) /* Speech present */ + { + hVAD->nb_active_frames++; /* Counter of consecutive active speech frames */ + if ( hVAD->nb_active_frames >= ACTIVE_FRAMES ) + { + hVAD->nb_active_frames = ACTIVE_FRAMES; + hVAD->hangover_cnt = 0; /* Reset the counter of hangover frames after at least "active_frames" speech frames */ + } + + st->localVAD = 1; + } + else + { + hVAD->nb_active_frames = 0; /* Reset the counter of speech frames necessary to start hangover algorithm */ + } + + if ( hVAD->hangover_cnt < HANGOVER_LONG_NB ) + { + hVAD->hangover_cnt++; + if ( lp_snr < 19.0f ) /* very low SNR */ + { + thr1 -= 5.2f; + } + else if ( lp_snr < 35.0f ) /* low SNR */ + { + thr1 -= 2.0f; + } + } + + if ( st->Opt_DTX_ON ) + { + if ( lp_snr < th_clean ) + { + thr2 = thr1 - 1.10f; + } + else + { + thr2 = thr1 - 1.5f; + } + } + else + { + if ( lp_snr < th_clean ) + { + thr2 = thr1 - 1.3f; + } + else + { + thr2 = thr1 - 1.5f; + } + } + + flag = 0; + if ( snr_sum > thr1 ) /* Speech present */ + { + flag = 1; + } + + if ( ( snr_sum < thr1 ) && ( snr_sum > thr2 ) ) /* Speech present */ + { + flag = 1; + st->localVAD = 0; + + if ( st->element_mode == EVS_MONO ) + { + *NB_speech_HO = 1; + } + } + + /* Need to handle the case when switching from WB -> NB */ + } + + if ( st->input_bwidth != NB ) + { + *flag_noisy_speech_snr = ( lp_snr < TH16_2_NFLAG ); /*original threshold: 35dB*/ + } + else + { + *flag_noisy_speech_snr = ( lp_snr < TH8_1_NFLAG ); /*original threshold: 20dB, not yet tested!*/ + } + + /* SC-VBR */ + if ( st->hSC_VBR != NULL ) + { + st->hSC_VBR->vadsnr = snr_sum; + st->hSC_VBR->vadnoise = thr1; + } + + /* Updates */ + hVAD->prim_act_quick = 0.2f * ( st->localVAD ) + ( 1.0f - 0.2f ) * hVAD->prim_act_quick; + hVAD->prim_act_slow = 0.01f * ( st->localVAD ) + ( 1.0f - 0.01f ) * hVAD->prim_act_slow; + if ( hVAD->prim_act_quick <= hVAD->prim_act_slow ) + { + hVAD->prim_act = 0.1f * hVAD->prim_act_quick + ( 1.0f - 0.1f ) * hVAD->prim_act; + } + else + { + hVAD->prim_act = 0.1f * hVAD->prim_act_slow + ( 1.0f - 0.1f ) * hVAD->prim_act; + } + + hVAD->prim_act_quick_he = 0.2f * *localVAD_HE_SAD + ( 1.0f - 0.2f ) * hVAD->prim_act_quick_he; + hVAD->prim_act_slow_he = 0.01f * *localVAD_HE_SAD + ( 1.0f - 0.01f ) * hVAD->prim_act_slow_he; + + if ( hVAD->prim_act_quick_he <= hVAD->prim_act_slow_he ) + { + hVAD->prim_act_he = 0.1f * hVAD->prim_act_quick_he + ( 1.0f - 0.1f ) * hVAD->prim_act_he; + } + else + { + hVAD->prim_act_he = 0.1f * hVAD->prim_act_slow_he + ( 1.0f - 0.1f ) * hVAD->prim_act_he; + } + + + if ( ( hVAD->vad_flag_reg_H & (int32_t) 0x40000L ) != 0 ) /* 0x4000L = 0x01L << 18 */ + { + hVAD->vad_flag_cnt_50 = hVAD->vad_flag_cnt_50 - 1; + } + + hVAD->vad_flag_reg_H = ( hVAD->vad_flag_reg_H & (int32_t) 0x3fffffffL ) << 1; + + if ( ( hVAD->vad_flag_reg_L & (int32_t) 0x40000000L ) != 0 ) + { + hVAD->vad_flag_reg_H = hVAD->vad_flag_reg_H | 0x01L; + } + + hVAD->vad_flag_reg_L = ( hVAD->vad_flag_reg_L & (int32_t) 0x3fffffffL ) << 1; + + if ( flag ) /* should not include the extra DTX hangover */ + { + hVAD->vad_flag_reg_L = hVAD->vad_flag_reg_L | 0x01L; + hVAD->vad_flag_cnt_50 = hVAD->vad_flag_cnt_50 + 1; + } + + if ( ( hVAD->vad_prim_reg & (int32_t) 0x8000L ) != 0 ) /* 0x8000L = 1L << 15 */ + { + hVAD->vad_prim_cnt_16 = hVAD->vad_prim_cnt_16 - 1; + } + + hVAD->vad_prim_reg = ( hVAD->vad_prim_reg & (int32_t) 0x3fffffffL ) << 1; + + if ( st->localVAD ) + { + hVAD->vad_prim_reg = hVAD->vad_prim_reg | 0x01L; + hVAD->vad_prim_cnt_16 = hVAD->vad_prim_cnt_16 + 1; + } + + return flag; +} diff --git a/lib_enc/vad_param_updt.c b/lib_enc/vad_param_updt.c new file mode 100644 index 0000000000000000000000000000000000000000..f9b315ec9693047808c4cdba26fe49e3d5f79593 --- /dev/null +++ b/lib_enc/vad_param_updt.c @@ -0,0 +1,173 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * vad_param_updt() + * + * Update parameters used by the VAD or DTX + *--------------------------------------------------------------------*/ + +void vad_param_updt( + Encoder_State *st, /* i/o: encoder state structure */ + const float corr_shift, /* i : correlation shift */ + const float corr_shiftR, /* i : correlation shift */ + const float A[], /* i : A(z) unquantized for the 4 subframes */ + const int16_t old_pitch1, /* i : previous frame OL pitch[1] */ + FRONT_VAD_ENC_HANDLE hFrontVad[], /* i/o: front-VAD handles */ + const int16_t n_channels /* i : number of channels */ +) +{ + float refl[M + 1]; + int16_t tmp_active_flag; + VAD_HANDLE hVAD; + int16_t i; + int16_t ini_frame; + float corr_shift_temp[2]; + + corr_shift_temp[0] = corr_shift; + corr_shift_temp[1] = corr_shiftR; + + if ( hFrontVad != NULL ) + { + hVAD = hFrontVad[0]->hVAD; + ini_frame = hFrontVad[0]->ini_frame; + } + else + { + hVAD = st->hVAD; + ini_frame = st->ini_frame; + } + + for ( i = 0; i < n_channels; i++ ) + { + if ( i == 1 ) + { + hVAD = hFrontVad[1]->hVAD; + } + + if ( !st->Opt_AMR_WB ) + { + /* fix explanation: after function dtx_fx, the "vad_flag" + parameter can not be used for SID scheduling purposes any + longer as dtx_fx can schedules active frames even if the + initial analyzed vad_flag is 0 ) in the worst case without + the fix an active frame could be classified as SID frame, + quite/very unlikley though + */ + tmp_active_flag = 0; + + if ( ( st->core_brate != SID_2k40 ) && ( st->core_brate != 0 ) ) /* Note, core_brate_fx can be -1 */ + { + tmp_active_flag = 1; /* requires active coding according to dtx_fx logic */ + } + + if ( st->Opt_DTX_ON != 0 && tmp_active_flag == 0 && ini_frame > 3 ) + + { + /* update the counter of consecutive inactive frames in DTX */ + hVAD->consec_inactive++; + if ( hVAD->consec_inactive > 5 ) + { + hVAD->consec_inactive = 5; + } + + if ( hVAD->consec_inactive == 5 ) + { + /* compute spectral tilt parameter */ + a2rc( &A[1], refl, M ); + + if ( hVAD->spectral_tilt_reset == 1 ) + { + hVAD->spectral_tilt_reset = 0; + hVAD->running_avg = refl[0]; + hVAD->ra_deltasum = 0; + } + + hVAD->ra_deltasum += ( 0.80f * hVAD->running_avg + 0.20f * refl[0] ) - hVAD->running_avg; + hVAD->running_avg = 0.80f * hVAD->running_avg + 0.20f * refl[0]; + + if ( fabs( hVAD->ra_deltasum ) > 0.2f ) + { + hVAD->spectral_tilt_reset = 1; + hVAD->running_avg = 0; + hVAD->ra_deltasum = 0; + hVAD->trigger_SID = 1; + } + } + } + else + { + hVAD->trigger_SID = 0; + hVAD->consec_inactive = 0; + } + + if ( hVAD->trigger_SID == 1 ) + { + if ( st->hDtxEnc->cng_cnt >= 8 ) + { + /* Declare SID frame due to spectral tilt changes */ + st->hDtxEnc->cnt_SID = 1; + st->core_brate = SID_2k40; + hVAD->trigger_SID = 0; + } + else if ( st->core_brate == SID_2k40 ) + { + /* SID fame has already been declared before */ + hVAD->trigger_SID = 0; + } + } + } + + if ( ( st->voicing[0] + st->voicing[1] + st->voicing[2] ) / 3 + corr_shift_temp[i] > 0.65 && + (int16_t) ( abs( st->pitch[0] - old_pitch1 ) + abs( st->pitch[1] - st->pitch[0] ) + abs( st->pitch[2] - st->pitch[1] ) ) / 3 < 14 ) + { + ( hVAD->voiced_burst )++; + } + else + { + hVAD->voiced_burst = 0; + } + } + + return; +} diff --git a/lib_enc/vad_proc.c b/lib_enc/vad_proc.c new file mode 100644 index 0000000000000000000000000000000000000000..07814aacf38d27eff15d4885f35cd78f76134946 --- /dev/null +++ b/lib_enc/vad_proc.c @@ -0,0 +1,291 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include "options.h" +#include "prot.h" +#include "rom_enc.h" +#include "wmc_auto.h" + + +/*-------------------------------------------------------------------* + * vad_init() + * + * + *-------------------------------------------------------------------*/ + +int16_t vad_init( + VAD_CLDFB_HANDLE hVAD_CLDFB /* i/o: CLDFB VAD state */ +) +{ + float sSFM[SFM_NUM] = { 0.88f, 0.92f, 0.92f }; + int16_t i; + + if ( hVAD_CLDFB == NULL ) + { + return -1; + } + + hVAD_CLDFB->frameloop = 0; + hVAD_CLDFB->lt_snr_org = 1.0f; + hVAD_CLDFB->lf_snr_smooth = 5.0f; + hVAD_CLDFB->l_silence_snr = 0.5f; + hVAD_CLDFB->l_speech_snr = 5.0f; + hVAD_CLDFB->l_silence_snr_count = 1; + hVAD_CLDFB->l_speech_snr_count = 1; + hVAD_CLDFB->fg_energy = 16 * ( 3.0518e-5f ); + hVAD_CLDFB->bg_energy = 16 * ( 4.6566e-10f ); + hVAD_CLDFB->fg_energy_count = 16; + hVAD_CLDFB->bg_energy_count = 16; + hVAD_CLDFB->tonality_rate3 = 0.46f; + hVAD_CLDFB->music_background_rate = 0.46f; + hVAD_CLDFB->lt_noise_sp_center_diff_sum = 0.4f; + hVAD_CLDFB->lt_noise_sp_center_diff_counter = 4; + hVAD_CLDFB->lt_noise_sp_center0 = 1.8f; + hVAD_CLDFB->lt_noise_sp_center3 = 2.0f; + hVAD_CLDFB->lt_bg_highf_eng = 2.0f; + hVAD_CLDFB->t_bg_energy = 0.01f; + hVAD_CLDFB->t_bg_energy_sum = 0.01f; + hVAD_CLDFB->tbg_energy_count = 1; + hVAD_CLDFB->bg_update_count = 0; + hVAD_CLDFB->frame_energy_smooth = 1.0f; + hVAD_CLDFB->fg_energy_est_start = 0; + hVAD_CLDFB->speech_flag = 0; + hVAD_CLDFB->continuous_noise_num = 0; + hVAD_CLDFB->continuous_speech_num = 0; + hVAD_CLDFB->continuous_speech_num2 = 0; + hVAD_CLDFB->update_num_with_snr = 0; /* the number of the background update with SNR*/ + hVAD_CLDFB->update_count = 0; + hVAD_CLDFB->warm_hang_num = 0; + + for ( i = 0; i < PRE_SNR_NUM; i++ ) + { + hVAD_CLDFB->pre_snr[i] = 0.0f; + } + + for ( i = 0; i < POWER_NUM; i++ ) + { + hVAD_CLDFB->frames_power[i] = 0; + } + + for ( i = 0; i < SPEC_AMP_NUM; i++ ) + { + hVAD_CLDFB->smooth_spec_amp[i] = 0; + } + + for ( i = 0; i < SFM_NUM; i++ ) + { + hVAD_CLDFB->sfm[i] = sSFM[i]; + } + + for ( i = 0; i < SP_CENTER_NUM; i++ ) + { + hVAD_CLDFB->sp_center[i] = 1.2f; + } + + for ( i = 0; i < STABLE_NUM; i++ ) + { + hVAD_CLDFB->ltd_stable_rate[i] = 0.07f; + } + + for ( i = 0; i < BG_ENG_NUM; i++ ) + { + hVAD_CLDFB->sb_bg_energy[i] = 0.01f; + hVAD_CLDFB->frame_sb_energy[i] = 0.001f; + } + + for ( i = 0; i < TONA_NUM; i++ ) + { + hVAD_CLDFB->f_tonality_rate[i] = 0.48f; + } + + for ( i = 0; i < PRE_SPEC_DIF_NUM; i++ ) + { + hVAD_CLDFB->pre_spec_low_dif[i] = 1.0f; + } + + return 0; +} + + +/*-------------------------------------------------------------------* + * UpdateState() + * + * + *-------------------------------------------------------------------*/ + +static void UpdateState( + VAD_CLDFB_HANDLE hVAD_CLDFB, /* i/o: CLDFB VAD state */ + const float frame_energy, /* i : current frame energy */ + const float high_eng, /* i : current frame high frequency energy */ + const int16_t update_flag, /* i : current frame update flag */ + const int16_t music_backgound_f, /* i : background music flag */ + const int16_t vad_flag, /* i : VAD flag */ + const float snr ) +{ + hVAD_CLDFB->frame_energy_smooth = hVAD_CLDFB->frame_energy_smooth * 0.95f + frame_energy * 0.05f; + + if ( vad_flag == 0 ) + { + hVAD_CLDFB->lt_bg_highf_eng = hVAD_CLDFB->lt_bg_highf_eng * 0.95f + high_eng * 0.05f; + } + + if ( hVAD_CLDFB->frameloop < 1000 ) + { + hVAD_CLDFB->frameloop++; + } + + background_update( hVAD_CLDFB, frame_energy, update_flag, music_backgound_f, snr ); + + if ( vad_flag == 0 ) + { + hVAD_CLDFB->continuous_speech_num2 = 0; + + if ( hVAD_CLDFB->continuous_noise_num > 10 ) + { + hVAD_CLDFB->continuous_speech_num = 0; + } + else if ( hVAD_CLDFB->continuous_speech_num > 9 ) + { + hVAD_CLDFB->continuous_speech_num = 9; + } + + hVAD_CLDFB->continuous_noise_num++; + + if ( hVAD_CLDFB->continuous_noise_num > 2048 ) + { + hVAD_CLDFB->continuous_noise_num = 2048; + } + } + else + { + hVAD_CLDFB->continuous_noise_num = 0; + hVAD_CLDFB->continuous_speech_num2++; + hVAD_CLDFB->continuous_speech_num++; + + if ( hVAD_CLDFB->continuous_speech_num > 2048 ) + { + hVAD_CLDFB->continuous_speech_num = 2048; + } + + if ( hVAD_CLDFB->continuous_speech_num2 > 2048 ) + { + hVAD_CLDFB->continuous_speech_num2 = 2048; + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * vad_proc() + * + * + *-------------------------------------------------------------------*/ + +int16_t vad_proc( + float realValues[16][60], /* CLDFB real values */ + float imagValues[16][60], /* CLDFB imag values */ + float *sb_power, /* Energy of CLDFB data */ + const int16_t numBands, /* number of input bands */ + VAD_CLDFB_HANDLE hVAD_CLDFB, /* i/o: CLDFB VAD state */ + int16_t *cldfb_addition, + const int16_t vada_flag /* i : VAD flag */ +) +{ + float frame_energy, frame_energy2; + float spec_amp[8 * 10]; /* 120 */ + float snr, tsnr; + int16_t update_flag; + int16_t vad_flag; + int16_t music_backgound_f = 0; + float HB_Power = 0; + float snr_flux; + float lt_snr; + float lt_snr_org; + float lf_snr; + int16_t bw_index; + + if ( numBands < 20 ) + { + bw_index = 1; + } + else if ( numBands < 40 ) + { + bw_index = 2; + } + else + { + bw_index = 3; + } + + hVAD_CLDFB->bw_index = bw_index; + + assert( numBands >= 10 ); + + /* new optimized structure */ + est_energy( sb_power, hVAD_CLDFB->frame_sb_energy, &frame_energy, &frame_energy2, &HB_Power, bw_index ); + + subband_FFT( realValues, imagValues, spec_amp ); + + spec_center( sb_power, hVAD_CLDFB->sp_center, bw_index ); + + ltd_stable( hVAD_CLDFB->frames_power, hVAD_CLDFB->ltd_stable_rate, frame_energy, hVAD_CLDFB->frameloop ); + + spec_flatness( spec_amp, hVAD_CLDFB->smooth_spec_amp, hVAD_CLDFB->sfm ); + + frame_spec_dif_cor_rate( spec_amp, hVAD_CLDFB->pre_spec_low_dif, hVAD_CLDFB->f_tonality_rate ); + + bg_music_decision( hVAD_CLDFB, &music_backgound_f, frame_energy ); + + SNR_calc( hVAD_CLDFB->frame_sb_energy, hVAD_CLDFB->sb_bg_energy, hVAD_CLDFB->t_bg_energy, &snr, &tsnr, frame_energy2, bw_index ); + + calc_snr_flux( tsnr, hVAD_CLDFB->pre_snr, &snr_flux ); + + calc_lt_snr( <_snr_org, <_snr, hVAD_CLDFB->fg_energy, hVAD_CLDFB->fg_energy_count, hVAD_CLDFB->bg_energy, hVAD_CLDFB->bg_energy_count, bw_index, hVAD_CLDFB->lt_noise_sp_center0 ); + + calc_lf_snr( &hVAD_CLDFB->lf_snr_smooth, &lf_snr, hVAD_CLDFB->l_speech_snr, hVAD_CLDFB->l_speech_snr_count, hVAD_CLDFB->l_silence_snr, hVAD_CLDFB->l_silence_snr_count, hVAD_CLDFB->fg_energy_count, hVAD_CLDFB->bg_energy_count, bw_index ); + + vad_flag = comvad_decision( hVAD_CLDFB, snr, tsnr, snr_flux, lt_snr, lt_snr_org, lf_snr, frame_energy2, music_backgound_f, cldfb_addition, vada_flag ); + + update_flag = update_decision( hVAD_CLDFB, snr, tsnr, frame_energy, HB_Power, hVAD_CLDFB->vad_flag_for_bk_update, music_backgound_f ); + + UpdateState( hVAD_CLDFB, frame_energy2, HB_Power, update_flag, music_backgound_f, hVAD_CLDFB->vad_flag_for_bk_update, snr ); + + return vad_flag; +} diff --git a/lib_enc/vbr_average_rate.c b/lib_enc/vbr_average_rate.c new file mode 100644 index 0000000000000000000000000000000000000000..3ee355c555c778885ba9ad1d0f8fbb039f9c4540 --- /dev/null +++ b/lib_enc/vbr_average_rate.c @@ -0,0 +1,199 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*------------------------------------------------------------------* + * Local constants + *------------------------------------------------------------------*/ + +#define RATEWIN 600 /* length of the rate control window. This is 600 active speech frames. This equals roughly 12s of active speech */ + +/*------------------------------------------------------------------* + * update_average_rate() + * + * SC-VBR update average data rate + *------------------------------------------------------------------*/ + +void update_average_rate( + SC_VBR_ENC_HANDLE hSC_VBR, /* i/o: SC-VBR state structure */ + const int32_t core_brate /* i : core bitrate */ +) +{ + float avratetarg; /* target rate for next RATEWIN active frames */ + float target; /* target set by VBR_ADR_MAX_TARGET*RATEWIN*10 */ + + if ( hSC_VBR->numactive == RATEWIN ) /* goes into rate control only the numactive ==RATEWIN. So rate control is triggered after each RATEWIN avtive frames */ + { + /* after 1000 blocks of RATEWIN frames, we change the way we control the average rate by using + st->global_avr_rate=0.99*st->global_avr_rate+0.01*st->sum_of_rates. This will avoid + veriables growing indefinitely while providing a good long term average rate */ + + if ( hSC_VBR->global_frame_cnt < 1000 ) + { + hSC_VBR->global_frame_cnt++; + hSC_VBR->global_avr_rate = ( hSC_VBR->global_avr_rate * ( hSC_VBR->global_frame_cnt - 1 ) + hSC_VBR->sum_of_rates ) / hSC_VBR->global_frame_cnt; + } + else + { + hSC_VBR->global_avr_rate = 0.01f * hSC_VBR->sum_of_rates + 0.99f * hSC_VBR->global_avr_rate; + } + + if ( hSC_VBR->sum_of_rates == 0 ) + { + hSC_VBR->sum_of_rates = (float) ( RATEWIN * VBR_ADR_MAX_TARGET * 10 ); + } + + target = VBR_ADR_MAX_TARGET * 10 * RATEWIN; + + if ( target < hSC_VBR->global_avr_rate ) /* Action is taken to reduce the averge rate. Only initiated if the global rate > target rate */ + { + /* Check the VAD SNR values to table the noisey/not noisey decision */ + + if ( hSC_VBR->SNR_THLD < 67 ) /* Currently in QFF mode. The bumpup thresholds are slightly relaxed for noisy speech. */ + { + /* Increase the threshold so the the bumpup procedure is done using the noisy thresholds. + Use 3.5 steps to quickly ramp up the rate control to reduce the settling time */ + hSC_VBR->SNR_THLD += 3.5f; + } + else if ( hSC_VBR->mode_QQF == 0 && hSC_VBR->sum_of_rates > target ) /* Now SNR_THLD is in the max allowed. Sill the global average is higher and + last RATEWIN frames have a higher agerage than the target rate. Now slightly + more aggresive rate control is used by changing the mode to QQF. Still the + same strict bumpups (more bumpups,higher rate) are used. */ + { + /* Kick in QQF mode */ + hSC_VBR->mode_QQF = 1; + } + else if ( hSC_VBR->sum_of_rates > target ) /* Actions (1) and (2) are not sufficient to control the rate. Still the last RATEWIN active + frames have a higher average rate than the target rate. More aggresive rate control is + needed. At this point the rate_control flag is set. This will enable the more relaxed + bump up thresholds (less bump ups->reduced rate)*/ + { + /* Relaxed bump ups are used */ + hSC_VBR->rate_control = 1; + + /* This will be triggered only if the gloabl average rate is considerablly higher than the target rate. + Keep a higher threshold to avoid short term rate increases over the target rate. */ + if ( hSC_VBR->global_avr_rate > ( target + 420.0f ) ) /* Last resort rate control. This is a safer rate control mechanism by increasing NELPS */ + { + hSC_VBR->Last_Resort = 1; /* compute based on a larger window as the last resort */ + } + else + { + hSC_VBR->Last_Resort = 0; + } + } + else if ( hSC_VBR->sum_of_rates < target ) /* If the average rate of last RATEWIN frames is controlled by above actions, disable the most + aggresive rate control mechanisms. Still keep QQF mode as the global rate is not under + the target rate*/ + { + hSC_VBR->Last_Resort = 0; + hSC_VBR->mode_QQF = 1; + hSC_VBR->rate_control = 0; + } + } + else + { + /* floding back to lesser and leser aggresive rate control mechanisms gradually if global rate is under control */ + hSC_VBR->Last_Resort = 0; + + if ( hSC_VBR->rate_control == 1 ) + { + hSC_VBR->rate_control = 0; + } + else if ( hSC_VBR->mode_QQF == 1 ) /* now rate control is not active and still the global rate is below the target. so go to QFF mode */ + { + hSC_VBR->mode_QQF = 0; + } + else + { + if ( hSC_VBR->SNR_THLD >= 60 ) + { + hSC_VBR->SNR_THLD -= 1.5f; + } + else + { + hSC_VBR->SNR_THLD = 60.0f; + } + } + } + + if ( hSC_VBR->global_avr_rate < target - 120 ) /* In QFF mode and global rate is less than target rate-0.2kbps. We can send some Q frames + to F frames to improve the quality */ + { + /* kick in bouncing back from Q to F */ + hSC_VBR->Q_to_F = 1; + + /* average rate for next 600ms = global_rate * 2 - rate of the past RATEWIN active frames */ + avratetarg = (float) ( ( RATEWIN * 10 ) * 2 * VBR_ADR_MAX_TARGET - hSC_VBR->global_avr_rate ); + + /* compute the percentage of frames that needed to be sent to F. st->pattern_m is computed as % val * 1000. eg. if % is 10%, then + st->pattern_m=100 . Later this value is used in voiced.enc to bump up 10% of PPP frames to F frames. */ + hSC_VBR->pattern_m = (int16_t) ( 1000 * ( avratetarg - 6.15f * RATEWIN * 10 ) / ( 10 * RATEWIN * 0.1f ) ); + + if ( hSC_VBR->pattern_m < 0 ) + { + hSC_VBR->pattern_m = 0; /* no bump up will ever happen */ + } + + if ( hSC_VBR->pattern_m > 1000 ) + { + hSC_VBR->pattern_m = 1000; /* 10% of bump ups */ + } + + hSC_VBR->patterncount = 0; + } + else + { + hSC_VBR->Q_to_F = 0; + } + + hSC_VBR->sum_of_rates = 0; + hSC_VBR->numactive = 0; + } + + hSC_VBR->numactive++; + + /* sum the total number of bits (in kbytes) * 10 here */ + hSC_VBR->sum_of_rates += ( core_brate / 1000.0f ) * 10; + + return; +} diff --git a/lib_enc/vlpc_1st_cod.c b/lib_enc/vlpc_1st_cod.c new file mode 100644 index 0000000000000000000000000000000000000000..84afcd8164b47459e25fe430a704bf8c4b990874 --- /dev/null +++ b/lib_enc/vlpc_1st_cod.c @@ -0,0 +1,146 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "prot.h" +#include "rom_com.h" +#include "wmc_auto.h" + + +/*------------------------------------------------------------------* + * lsf_weight() + * + * outputs only the weightings, doesn't do anything with the lsfq + *------------------------------------------------------------------*/ + +static void lsf_weight( + const float *lsfq, + float *w, + const int32_t sr_core ) +{ + int16_t i; + float inv_di0, inv_di1; + float scale = ( (float) sr_core ) / INT_FS_12k8; + float freq_max = sr_core / 2.f; + + + /* weighting function */ + inv_di0 = scale / lsfq[0]; + for ( i = 1; i < ( M - 2 ); i += 2 ) + { + inv_di1 = scale / ( lsfq[i] - lsfq[i - 1] ); + w[i - 1] = inv_di0 + inv_di1; + + inv_di0 = scale / ( lsfq[i + 1] - lsfq[i] ); + w[i] = inv_di1 + inv_di0; + } + inv_di1 = scale / ( lsfq[i] - lsfq[i - 1] ); + w[i - 1] = inv_di0 + inv_di1; + + inv_di0 = scale / ( freq_max - lsfq[i] ); + w[i] = inv_di1 + inv_di0; + + return; +} + + +/*------------------------------------------------------------------* + * vlpc_1st_cod() + * + * + *------------------------------------------------------------------*/ + +/*! r: codebook index */ +int16_t vlpc_1st_cod( + const float *lsf, /* i : vector to quantize */ + float *lsfq, /* i/o: i:prediction o:quantized lsf */ + const int32_t sr_core, /* i : internal sampling rate */ + float *wout /* o : lsf weights */ +) +{ + int16_t i, j, index; + float w[M], x[M]; + float dist_min, dist, temp; + const float *p_dico; + float scale = ( (float) sr_core ) / INT_FS_12k8; + float scaleinv = 1.f / scale; + + /* weighting */ + lsf_weight( lsf, w, sr_core ); + + mvr2r( w, wout, M ); + + /* remove lsf prediction/means */ + + for ( i = 0; i < M; i++ ) + { + x[i] = ( lsf[i] - lsfq[i] ) * scaleinv; + } + + dist_min = 1.0e30f; + p_dico = dico_lsf_abs_8b; + index = 0; + + for ( i = 0; i < 256; i++ ) + { + dist = 0.0; + + for ( j = 0; j < M; j++ ) + { + temp = x[j] - *p_dico++; + dist += w[j] * temp * temp; + } + + if ( dist < dist_min ) + { + dist_min = dist; + index = i; + } + } + + /* quantized vector */ + p_dico = &dico_lsf_abs_8b[index * M]; + + for ( j = 0; j < M; j++ ) + { + lsfq[j] += scale * *p_dico++; /* += cause it's differential */ + } + + + return index; +} diff --git a/lib_enc/vlpc_2st_cod.c b/lib_enc/vlpc_2st_cod.c new file mode 100644 index 0000000000000000000000000000000000000000..9e1e9fe5508416aced348832cab45457f0b15611 --- /dev/null +++ b/lib_enc/vlpc_2st_cod.c @@ -0,0 +1,147 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include "cnst.h" +#include "prot.h" +#include "wmc_auto.h" + +/*------------------------------------------------------------------* + * vlpc_2st_cod() + * + * + *------------------------------------------------------------------*/ + +/*! r: number of allocated bits */ +int16_t vlpc_2st_cod( + const float *lsf, /* i : normalized vector to quantize */ + float *lsfq, /* i/o: i:1st stage o:1st+2nd stage */ + int16_t *indx, /* o : index[] (4 bits per words) */ + const int16_t mode, /* i : 0=abs, >0=rel */ + const int32_t sr_core /* i : internal sampling rate */ +) +{ + int16_t i, nbits; + float w[M], x[M], tmp; + int16_t nq, xq[M]; + float scale = ( (float) sr_core ) / INT_FS_12k8; + float scaleinv = 1.f / scale; + + /* 0 bit with true weighting: save 0.5 bit */ + + lsf_weight_2st( lsf, w, 1, sr_core ); + + for ( i = 0; i < M; i++ ) + { + x[i] = ( lsf[i] - lsfq[i] ) * scaleinv; + } + + for ( i = 0; i < M; i++ ) + { + x[i] /= w[i]; + } + + tmp = 0.0f; + + for ( i = 0; i < M; i++ ) + { + tmp += x[i] * x[i]; + } + + if ( tmp < 8.0f ) + { + indx[0] = 0; + indx[1] = 0; + + return ( 10 ); /* 2*(2+3) */ + } + + /* weighting from the 1st stage */ + lsf_weight_2st( lsfq, w, mode, sr_core ); + + /* find lsf residual */ + + for ( i = 0; i < M; i++ ) + { + x[i] = ( lsf[i] - lsfq[i] ) * scaleinv; + } + + /* scale the residual */ + + for ( i = 0; i < M; i++ ) + { + x[i] /= w[i]; + } + + /* quantize */ + AVQ_cod_lpc( x, xq, indx, 2 ); + + /* quantized lsf */ + + for ( i = 0; i < M; i++ ) + { + lsfq[i] += scale * ( w[i] * (float) xq[i] ); + } + + /* total number of bits using entropic code to index the quantizer number */ + nbits = 0; + + for ( i = 0; i < 2; i++ ) + { + nq = indx[i]; + nbits += ( 2 + ( nq * 4 ) ); /* 2 bits to specify Q2,Q3,Q4,ext */ + + if ( nq > 6 ) + { + nbits += nq - 3; /* unary code (Q7=1110, ...) */ + } + else if ( nq > 4 ) + { + nbits += nq - 4; /* Q5=0, Q6=10 */ + } + else if ( nq == 0 ) + { + nbits += 3; /* Q0=110 */ + } + } + + /* reorder */ + v_sort( lsfq, 0, M - 1 ); + reorder_lsf( lsfq, LSF_GAP, M, sr_core ); + + return ( nbits ); +} diff --git a/lib_enc/voiced_enc.c b/lib_enc/voiced_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..18a3305902680b9bea1ea5952820d76310fbae1f --- /dev/null +++ b/lib_enc/voiced_enc.c @@ -0,0 +1,1180 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "prot.h" +#include "cnst.h" +#include "rom_com.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * Local function prototypes + *--------------------------------------------------------------------*/ + +static void SynthesisFilter( float *output, float *input, float *coef, float *memory, int16_t order, int16_t length ); + + +/*-------------------------------------------------------------------* + * DTFS_alignment_extract() + * + * Alignment for the best match between the reference DTFS and the test DTFS. + *-------------------------------------------------------------------*/ + +static float DTFS_alignment_extract( + DTFS_STRUCTURE refX1_DTFS, /* i : X1 the reference DTFS to keep fixed */ + DTFS_STRUCTURE X2_DTFS, /* i : X2 the test DTFS to shift to find best match */ + float Eshift, /* i : Expected shift - coarse value */ + const float *LPC2 /* i : LPC to filter to find correlation in spch */ +) +{ + /* Eshift is w.r.t X2 */ + int16_t k; + float maxcorr, corr, Adiff, diff, tmp, tmp1, fshift, n; + float pwf = 0.7f, tmplpc[M + 1]; + DTFS_STRUCTURE X1_DTFS; + + X1_DTFS = refX1_DTFS; /* copy into local copy */ + + DTFS_adjustLag( &X1_DTFS, X2_DTFS.lag ); + + DTFS_poleFilter( &X1_DTFS, LPC2, M + 1 ); + DTFS_poleFilter( &X2_DTFS, LPC2, M + 1 ); + + for ( k = 0, tmp = 1.0; k < M + 1; k++ ) + { + tmplpc[k] = LPC2[k] * ( tmp *= pwf ); + } + DTFS_zeroFilter( &X1_DTFS, tmplpc, M + 1 ); + DTFS_zeroFilter( &X2_DTFS, tmplpc, M + 1 ); + + maxcorr = (float) -HUGE_VAL; + fshift = Eshift; + Adiff = max( 4.0f, refX1_DTFS.lag / 8 ); + diff = 1.0f; /* Non-Fractional alignment */ + + for ( n = Eshift - Adiff; n <= Eshift + Adiff; n += diff ) + { + corr = tmp = 0.0f; + /* bit-exact optimization - PI2/X2_DTFS.lag should be counted as a single divide outside WI functions and passed in as input */ + tmp1 = (float) ( PI2 * n / X2_DTFS.lag ); + + for ( k = 0; k <= min( X2_DTFS.lag >> 1, X2_DTFS.nH_4kHz ); k++, tmp += tmp1 ) + + { + corr += (float) ( ( X1_DTFS.a[k] * X2_DTFS.a[k] + X1_DTFS.b[k] * X2_DTFS.b[k] ) * cos( tmp ) ); + corr += (float) ( ( X1_DTFS.b[k] * X2_DTFS.a[k] - X1_DTFS.a[k] * X2_DTFS.b[k] ) * sin( tmp ) ); + } + + if ( corr * ( 1.0f - 0.01f * fabs( n - Eshift ) ) > maxcorr ) + { + fshift = n; + maxcorr = corr; + } + } + + return fshift; /* o : shift value to shift X2 by */ +} + + +/*-------------------------------------------------------------------* + * DTFS_getEngy_band() + * + * Get DTFS energy in the specified range from lband to hband. + *-------------------------------------------------------------------*/ + +static float DTFS_getEngy_band( + DTFS_STRUCTURE X, /* i : DTFS to compute energy of */ + float lband, /* i : low end of band of interest */ + float hband /* i : high end of band of interest */ +) +{ + int16_t k; + float en, freq, fdiff; + + fdiff = (float) INT_FS_12k8 / X.lag; + + en = 0.0f; + for ( freq = fdiff, k = 1; k <= min( ( X.lag - 1 ) >> 1, X.nH_4kHz ); k++, freq += fdiff ) + { + if ( freq < hband && freq >= lband ) + { + en += X.a[k] * X.a[k] + X.b[k] * X.b[k]; + } + } + en /= 2.0; + if ( lband == 0.0 ) + { + en += X.a[0] * X.a[0]; + } + if ( ( X.lag % 2 == 0 ) && ( hband == X.upper_cut_off_freq ) ) + { + en += X.a[k] * X.a[k] + X.b[k] * X.b[k]; + } + return en; +} + + +/*-------------------------------------------------------------------* + * DTFS_freq_corr() + * + * Calculate correlation between two DTFS. + *-------------------------------------------------------------------*/ + +/*! r: correlation */ +static double DTFS_freq_corr( + DTFS_STRUCTURE X1_DTFS, /* i : X1 DTFS */ + DTFS_STRUCTURE X2_DTFS, /* i : X2 DTFS */ + float lband, /* i : low cutoff */ + float hband /* i : high cutoff */ +) +{ + int16_t k; + double corr, fdiff, freq; + double tmp; + + if ( X1_DTFS.lag < X2_DTFS.lag ) + { + DTFS_zeroPadd( X2_DTFS.lag, &X1_DTFS ); + } + + corr = freq = 0.0; + fdiff = (float) INT_FS_12k8 / X2_DTFS.lag; + for ( k = 0; k <= min( X2_DTFS.lag >> 1, X2_DTFS.nH_4kHz ); k++, freq += fdiff ) + { + if ( freq < hband && freq >= lband ) + { + corr += ( X1_DTFS.a[k] * X2_DTFS.a[k] + X1_DTFS.b[k] * X2_DTFS.b[k] ); + } + } + + tmp = DTFS_getEngy_band( X1_DTFS, lband, hband ) * DTFS_getEngy_band( X2_DTFS, lband, hband ); + + if ( tmp == 0.0 ) + { + tmp = 0.001; + } + + return corr / sqrt( tmp ); +} + +/*-------------------------------------------------------------------* + * DTFS_peaktoaverage() + * + * Estimate peak to average ratio in the DTFS + *-------------------------------------------------------------------*/ + +static void DTFS_peaktoaverage( + DTFS_STRUCTURE X, /* i : DTFS */ + float *pos, /* o : positive peak to ave */ + float *neg /* o : negative peak to ave */ +) +{ + float tmp, time[PIT_MAX], sum = 0.0, maxPosEn = 0.0, maxNegEn = 0.0; + int16_t i; + + DTFS_fs_inv( &X, time, X.lag, 0.0 ); + + for ( i = 0; i < X.lag; i++ ) + { + tmp = SQR( time[i] ); + if ( time[i] >= 0 ) + { + if ( tmp > maxPosEn ) + { + maxPosEn = tmp; + } + } + else + { + if ( tmp > maxNegEn ) + { + maxNegEn = tmp; + } + } + sum += tmp; + } + + if ( sum == 0.0 ) + { + *pos = 0.0f; + *neg = 0.0f; + } + else + { + if ( maxPosEn == 0.0 ) + { + *pos = 0.0; + } + else + { + *pos = (float) sqrt( maxPosEn * X.lag / sum ); + } + if ( maxPosEn == 0.0 ) + { + *neg = 0.0; + } + else + { + *neg = (float) sqrt( maxNegEn * X.lag / sum ); + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * ppp_extract_pitch_period() + * + * Pitch period extraction + *-------------------------------------------------------------------*/ + +static int16_t ppp_extract_pitch_period( + const float *in, /* i : input residual */ + float *out, /* o : output residual */ + const int16_t l, /* i : lag */ + int16_t *out_of_bound /* o : out of bound flag */ +) +{ + int16_t i, j, k; + int16_t spike = 0, range; + float max1 = 0.0; + const float *ptr = in + L_FRAME - l; + float en1 = 0.0, en2 = 0.0, tmp; + int16_t spike_near_edge = 0; + float pos_max, neg_max; + int16_t spike_pos = 0, spike_neg = 0; + float x; + + pos_max = (float) -HUGE_VAL; + neg_max = 0.0; + *out_of_bound = 0; + + for ( i = 0; i < l; i++ ) + { + if ( ( x = (float) fabs( ptr[i] ) ) > max1 ) + { + max1 = x; + spike = i; + } + en1 += ptr[i] * ptr[i]; + } + + if ( ptr[spike] > 0 ) + { + spike_pos = spike; + + /* search for neg spike around the pos spike */ + for ( j = spike - 10; j < spike + 10; j++ ) + { + k = ( j + l ) % l; + if ( ptr[k] < neg_max ) + { + neg_max = ptr[k]; + spike_neg = k; + } + } + } + else if ( ptr[spike] < 0 ) + { + spike_neg = spike; + + /* search for pos spike around the neg spike */ + for ( j = spike - 10; j < spike + 10; j++ ) + { + k = ( j + l ) % l; + if ( ptr[k] > pos_max ) + { + pos_max = ptr[k]; + spike_pos = k; + } + } + } + if ( ( ( l - 1 - max( spike_pos, spike_neg ) ) <= 2 ) || ( min( spike_pos, spike_neg ) <= 2 ) ) + { + *out_of_bound = 1; + return spike_near_edge; + } + range = (int16_t) anint( max( CUTFREE_REL_RANGE * l, CUTFREE_ABS_RANGE ) ); + if ( ( spike - range < 0 ) || ( spike + range >= l ) ) + { + /* need to grab from one lag before + ensure that there is no array bound read */ + if ( L_FRAME - l - l < 0 ) + { + *out_of_bound = 1; + return spike_near_edge; + } + spike_near_edge = 1; + } + if ( spike - range < 0 ) + { + for ( i = 0; i < l + ( spike - range ); i++ ) + { + out[i] = ptr[i]; + } + + /* Grab Remaining From One Lag Before */ + ptr -= l; + for ( ; i < l; i++ ) + { + out[i] = ptr[i]; + } + } + else if ( spike + range >= l ) + { + for ( i = 0; i < spike - range; i++ ) + { + out[i] = ptr[i]; + } + /* Grab Remaining From One Lag Before */ + if ( ptr - l + i >= in ) + { + for ( ptr -= l; i < l; i++ ) + { + out[i] = ptr[i]; + } + } + else + { + for ( ; i < l; i++ ) + { + out[i] = ptr[i]; + } + } + } + else + { + for ( i = 0; i < l; i++ ) + { + out[i] = ptr[i]; + } + } + + /* Energy adjustment added to eliminate artifacts at the end of voicing */ + for ( i = 0; i < l; i++ ) + { + en2 += out[i] * out[i]; + } + + if ( en1 < en2 ) + { + tmp = (float) sqrt( en1 / en2 ); + for ( i = 0; i < l; i++ ) + { + out[i] *= tmp; + } + } + + return spike_near_edge; +} + + +/*-------------------------------------------------------------------* + * DTFS_getEngy_band_wb() + * + * Get DTFS energy in the specified range from lband to hband. + * This function is different to "DTFS_getEngy_band" as this can calculate + * lband, hband \in [1,6400] where "DTFS_getEngy_band" only upperlimited to + * 4Khz. Possibility: modify ""DTFS_getEngy_band"" and get rid of this + * function. + *-------------------------------------------------------------------*/ + +static float DTFS_getEngy_band_wb( + DTFS_STRUCTURE X, /* i : DTFS to compute energy of */ + float lband, /* i : low end of band of interest */ + float hband /* i : high end of band of interest */ +) +{ + int16_t k; + float en, freq, fdiff; + + fdiff = (float) INT_FS_12k8 / X.lag; + + en = 0.0f; + for ( freq = fdiff, k = 1; k <= ( ( X.lag - 1 ) >> 1 ); k++, freq += fdiff ) + { + if ( freq < hband && freq >= lband ) + { + en += X.a[k] * X.a[k] + X.b[k] * X.b[k]; + } + } + en /= 2.0; + if ( lband == 0.0 ) + { + en += X.a[0] * X.a[0]; + } + if ( ( X.lag % 2 == 0 ) && ( hband == X.upper_cut_off_freq ) ) + { + en += X.a[k] * X.a[k] + X.b[k] * X.b[k]; + } + return en; +} + + +/*-------------------------------------------------------------------* + * ppp_voiced_encoder() + * + * + *--------------------------------------------------------------------*/ + +ivas_error ppp_voiced_encoder( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + SC_VBR_ENC_HANDLE hSC_VBR, /* i/o: SC-VBR state structure */ + const int16_t bwidth, /* i : audio bandwidth */ + const int16_t last_coder_type_raw, /* i : raw last_coder_type */ + const float old_pitch_buf[], /* i : buffer of old subframe pitch values */ + float *in, /* i : residual signal */ + float *out, /* o : Quantized residual signal */ + const int16_t delay, /* i : open loop pitch */ + float *lpc1, /* i : prev frame de-emphasized LPC */ + float *lpc2, /* i : current frame de-emphasized LPC */ + float *exc, /* i : previous frame quantized excitation */ + float *pitch /* o : floating pitch values for each subframe */ +) +{ + int16_t i; + int16_t spike_near_edge = 0; + int16_t flag; + int16_t delta_lag_E = 0, PPP_MODE_E, Q_delta_lag = 0; + int16_t out_of_bound = 0; + float tmp, tmptmp, tmptmp1, res_enratio = 0, sp_enratio = 0; + double tmp2; + int16_t pl, l; + float interp_delay[3], temp_pl, temp_l; + int16_t upper_cut_off_freq_of_interest = 0, upper_cut_off_freq = 0; + float pos_nq, neg_nq, pos_q, neg_q; + float impzi[160]; + float impzo[160]; + float mem[10]; + float energy_impz = 0.0f; + float pos_nq0, neg_nq0, tmpres; + float sp_hb_enratio; + float low_band_en; + + DTFS_STRUCTURE *CURRP_NQ; + DTFS_STRUCTURE *TMPDTFS; + DTFS_STRUCTURE *TMPDTFS2; + DTFS_STRUCTURE *TMPDTFS3; + DTFS_STRUCTURE *CURRP_Q_E; + DTFS_STRUCTURE *dtfs_temp; + + ivas_error error; + + error = IVAS_ERR_OK; + + if ( ( error = DTFS_new( &CURRP_NQ ) ) != IVAS_ERR_OK ) + { + IVAS_ERROR( error, "Error creating DTFS structure" ); + } + if ( ( error = DTFS_new( &TMPDTFS ) ) != IVAS_ERR_OK ) + { + IVAS_ERROR( error, "Error creating DTFS structure" ); + } + if ( ( error = DTFS_new( &TMPDTFS2 ) ) != IVAS_ERR_OK ) + { + IVAS_ERROR( error, "Error creating DTFS structure" ); + } + if ( ( error = DTFS_new( &TMPDTFS3 ) ) != IVAS_ERR_OK ) + { + IVAS_ERROR( error, "Error creating DTFS structure" ); + } + if ( ( error = DTFS_new( &CURRP_Q_E ) ) != IVAS_ERR_OK ) + { + IVAS_ERROR( error, "Error creating DTFS structure" ); + } + if ( ( error = DTFS_new( &dtfs_temp ) ) != IVAS_ERR_OK ) + { + IVAS_ERROR( error, "Error creating DTFS structure" ); + } + + if ( bwidth == WB ) + { + upper_cut_off_freq_of_interest = 4000; + upper_cut_off_freq = 6400; + } + else if ( bwidth == NB ) + { + upper_cut_off_freq_of_interest = 3300; + upper_cut_off_freq = 4000; + } + + /* Initialization */ + if ( hSC_VBR->firstTime_voicedenc ) + { + hSC_VBR->firstTime_voicedenc = 0; + hSC_VBR->dtfs_enc_lag = 0; + hSC_VBR->dtfs_enc_nH = 0; + hSC_VBR->dtfs_enc_nH_4kHz = 0; + hSC_VBR->dtfs_enc_upper_cut_off_freq_of_interest = 3300.0; + hSC_VBR->dtfs_enc_upper_cut_off_freq = 4000.0; + + set_f( hSC_VBR->dtfs_enc_a, 0, MAXLAG_WI ); + set_f( hSC_VBR->dtfs_enc_b, 0, MAXLAG_WI ); + } + + /* Figure out the PPP_MODE */ + if ( hSC_VBR->last_ppp_mode == 1 && !hSC_VBR->mode_QQF ) + { + hSC_VBR->bump_up = 1; + + free( CURRP_NQ ); + free( TMPDTFS ); + free( TMPDTFS2 ); + free( TMPDTFS3 ); + free( CURRP_Q_E ); + free( dtfs_temp ); + + return error; + } + + /* Use the aggresive bumpups if there are two consecutive Q frames */ + /* Aggresive bump upsare only used in the second Q frame */ + if ( hSC_VBR->last_ppp_mode == 1 ) + { + hSC_VBR->rate_control = 0; + } + + PPP_MODE_E = 'Q'; + pl = min( MAX_LAG_PIT, (int16_t) rint_new( old_pitch_buf[( 2 * NB_SUBFR ) - 1] ) ); + l = min( MAX_LAG_PIT, (int16_t) rint_new( delay ) ); + + /* Bump up if the lag is out_fx of range */ + if ( ( l - pl ) > 13 || ( l - pl ) < -11 || ( l < 19 ) || ( pl < 19 ) ) + { + hSC_VBR->bump_up = 1; + + free( CURRP_NQ ); + free( TMPDTFS ); + free( TMPDTFS2 ); + free( TMPDTFS3 ); + free( CURRP_Q_E ); + free( dtfs_temp ); + + return error; + } + + if ( hSC_VBR->last_ppp_mode != 1 ) + { + /* Obtain DTFS of last pl values of past excitation */ + DTFS_to_fs( exc - pl, pl, dtfs_temp, bwidth == WB ? (int16_t) 16000 : (int16_t) 8000, 0 ); + } + + if ( last_coder_type_raw == UNVOICED ) + { + pl = l; /* if prev frame was sil/uv */ + } + + /* Use the out array as a temp storage for currp */ + spike_near_edge = ppp_extract_pitch_period( in, out, l, &out_of_bound ); + + if ( out_of_bound == 1 ) + { + hSC_VBR->bump_up = 1; + + free( CURRP_NQ ); + free( TMPDTFS ); + free( TMPDTFS2 ); + free( TMPDTFS3 ); + free( CURRP_Q_E ); + free( dtfs_temp ); + + return error; + } + + /* Get DTFS of current prototype */ + DTFS_to_fs( out, l, CURRP_NQ, bwidth == WB ? (int16_t) 16000 : (int16_t) 8000, 0 ); + + /* Ensure the extracted prototype is time-synchronous to the + * last l samples of the frame. This proves to eliminate + * some of the PPP-CELP transition problems. + * Convert last samples into DTFS */ + if ( spike_near_edge != 0 ) + { + DTFS_to_fs( in + L_FRAME - l, l, TMPDTFS, bwidth == WB ? (int16_t) 16000 : (int16_t) 8000, 0 ); + + tmp = DTFS_alignment_extract( *TMPDTFS, *CURRP_NQ, 0.0, lpc2 ); /* figure out how much to shift currp_nq to align with TMP */ + + DTFS_phaseShift( CURRP_NQ, (float) ( PI2 * tmp / l ) ); + } + + temp_pl = (float) pl; + temp_l = (float) l; + + for ( i = 0; i < NB_SUBFR; i++ ) + { + /* do the linear pitch interp to drive the nb_post_filt */ + Interpol_delay( interp_delay, &( temp_pl ), &( temp_l ), i, frac_4sf ); + pitch[i] = interp_delay[0]; + } + + + /* Restoring PPP memories when the last frame is non-PPP */ + if ( hSC_VBR->last_ppp_mode != 1 ) + { + hSC_VBR->ph_offset_E = 0.0; + hSC_VBR->prev_cw_en = DTFS_getEngy( *dtfs_temp ); + + /* Copy over dtfs_temp into TMPDTFS */ + DTFS_copy( TMPDTFS, *dtfs_temp ); + + DTFS_car2pol( TMPDTFS ); + + hSC_VBR->lastLgainE = (float) log10( TMPDTFS->lag * DTFS_setEngyHarm( 92.0, 1104.5, 0.0, 1104.5, 1.0, TMPDTFS ) ); + hSC_VBR->lastHgainE = (float) log10( TMPDTFS->lag * DTFS_setEngyHarm( 1104.5, upper_cut_off_freq_of_interest, 1104.5, upper_cut_off_freq, 1.0, TMPDTFS ) ); + + DTFS_to_erb( *TMPDTFS, hSC_VBR->lasterbE ); + } + else + { + /* Copy DTFS related parameters from 'hSC_VBR' to 'dtfs_temp' structure */ + dtfs_temp->lag = hSC_VBR->dtfs_enc_lag; + dtfs_temp->nH = hSC_VBR->dtfs_enc_nH; + dtfs_temp->nH_4kHz = hSC_VBR->dtfs_enc_nH_4kHz; + dtfs_temp->upper_cut_off_freq_of_interest = hSC_VBR->dtfs_enc_upper_cut_off_freq_of_interest; + dtfs_temp->upper_cut_off_freq = hSC_VBR->dtfs_enc_upper_cut_off_freq; + + mvr2r( hSC_VBR->dtfs_enc_a, dtfs_temp->a, MAXLAG_WI ); + mvr2r( hSC_VBR->dtfs_enc_b, dtfs_temp->b, MAXLAG_WI ); + } + + /*-----Open-loop Bump-Up-------- */ + + /* Energy ratio calculation in residual and speech domain */ + /* Also, compute correlation between the previous and the */ + /* current prototype */ + res_enratio = DTFS_getEngy( *CURRP_NQ ) / DTFS_getEngy( *dtfs_temp ); + + /* Copy over CURRP_NQ into TMPDTFS */ + DTFS_copy( TMPDTFS, *CURRP_NQ ); + + /* Copy over dtfs_temp into TMPDTFS2 */ + DTFS_copy( TMPDTFS2, *dtfs_temp ); + + tmptmp = DTFS_alignment_full( *TMPDTFS2, *TMPDTFS, TMPDTFS->lag * 2 ); /* align of prev_cw wrt curr_cw, new method */ + + tmptmp1 = TMPDTFS->lag - tmptmp; + tmp = tmptmp1; + + DTFS_phaseShift( TMPDTFS, (float) ( -PI2 * tmp / TMPDTFS->lag ) ); /* fixed bug, phase shift by tmp computed in TMP.lag domain (above) */ + tmpres = (float) ( DTFS_freq_corr( *TMPDTFS, *TMPDTFS2, 100.0f, 3700.0f ) ); + + DTFS_poleFilter( TMPDTFS, lpc2, M + 1 ); + + DTFS_adjustLag( TMPDTFS2, TMPDTFS->lag ); /* operate in CL domain */ + + DTFS_poleFilter( TMPDTFS2, lpc1, M + 1 ); + + tmp = (float) ( DTFS_freq_corr( *TMPDTFS, *TMPDTFS2, 100.0f, 3700.0f ) ); + + if ( DTFS_getEngy( *TMPDTFS2 ) > 0 ) + { + sp_enratio = DTFS_getEngy( *TMPDTFS ) / DTFS_getEngy( *TMPDTFS2 ); + } + else + { + sp_enratio = 0.0f; + } + + if ( PPP_MODE_E == 'Q' ) + { + /* Bump up if the lag is out of range */ + if ( ( ( l - pl ) > 13 ) || ( ( l - pl ) < -11 ) ) + { + PPP_MODE_E = 'B'; + } + else + { + delta_lag_E = (int16_t) ( l - pl ); + } + + /* Bump up if big change between the previous and the current CWs */ + if ( hSC_VBR->vadsnr < hSC_VBR->SNR_THLD ) + { + if ( res_enratio > 5.0 && tmp < 0.65 ) + { + PPP_MODE_E = 'B'; + } + } + else + { + if ( res_enratio > 3.0 && tmp < 1.2 ) + { + PPP_MODE_E = 'B'; + } + } + } + + /* Rapid rampdown frame where time resolution is important */ + /* Not a suitable PPP frame -> Bump to CELP */ + if ( hSC_VBR->vadsnr < hSC_VBR->SNR_THLD ) + { + if ( res_enratio < 0.025 ) + { + hSC_VBR->bump_up = 1; + + free( CURRP_NQ ); + free( TMPDTFS ); + free( TMPDTFS2 ); + free( TMPDTFS3 ); + free( CURRP_Q_E ); + free( dtfs_temp ); + + return error; + } + } + else + { + if ( res_enratio < 0.092f ) + { + hSC_VBR->bump_up = 1; + } + } + + if ( min( res_enratio, sp_enratio ) < 0.075f && tmp < -0.5f ) + { + hSC_VBR->bump_up = 1; + } + + /* Rapid rampup frame where time resolution is important */ + /* Not a suitable PPP frame -> Bump to CELP */ + if ( hSC_VBR->vadsnr < hSC_VBR->SNR_THLD ) + { + if ( res_enratio > 14.5 ) + { + hSC_VBR->bump_up = 1; + + free( CURRP_NQ ); + free( TMPDTFS ); + free( TMPDTFS2 ); + free( TMPDTFS3 ); + free( CURRP_Q_E ); + free( dtfs_temp ); + + return error; + } + } + else + { + if ( res_enratio > 7.0 ) + { + hSC_VBR->bump_up = 1; + } + } + + if ( hSC_VBR->bump_up == 1 ) + { + free( CURRP_NQ ); + free( TMPDTFS ); + free( TMPDTFS2 ); + free( TMPDTFS3 ); + free( CURRP_Q_E ); + free( dtfs_temp ); + + return error; + } + + /* Bump up when the previous frame is an unvoiced or a silent frame */ + if ( last_coder_type_raw == UNVOICED ) + { + hSC_VBR->bump_up = 1; + + free( CURRP_NQ ); + free( TMPDTFS ); + free( TMPDTFS2 ); + free( TMPDTFS3 ); + free( CURRP_Q_E ); + free( dtfs_temp ); + + return error; + } + /* -----End Open-loop Bump-Up */ + + /* PPP-WI Quantization */ + if ( PPP_MODE_E == 'Q' ) + { + flag = 1; + if ( PPP_MODE_E == 'Q' ) + { + if ( ( error = ppp_quarter_encoder( &flag, hBstr, CURRP_Q_E, TMPDTFS, dtfs_temp->lag, *CURRP_NQ, lpc2, &( hSC_VBR->lastLgainE ), &( hSC_VBR->lastHgainE ), &( hSC_VBR->lasterbE[0] ), *dtfs_temp ) ) != IVAS_ERR_OK ) + { + free( CURRP_NQ ); + free( TMPDTFS ); + free( TMPDTFS2 ); + free( TMPDTFS3 ); + free( CURRP_Q_E ); + free( dtfs_temp ); + + return error; + } + } + + if ( flag ) + { + /* TMPDTFS : Target prototype: Amp Quantized + Phase Unquantized */ + /* TMPDTFS2: Quantized prototype: Amp Quantized + Phase Quantized */ + /* TMPDTFS3: Delta prototype: Diff betw. target and quant. in speech dom */ + + /* ----- Closed-loop Bump-Up ---------- */ + DTFS_peaktoaverage( *TMPDTFS, &pos_nq, &neg_nq ); + DTFS_peaktoaverage( *CURRP_Q_E, &pos_q, &neg_q ); + + /* Before we perform the peak-to-average ratio comparison, we have to */ + /* ensure that the energy is not decaying and also the pitch pulse */ + /* is clearly defined */ + + /* Usually triggers in the slow ramp down frames. Does not fall under the test condition (res_enratio < 0.025) as + both frames have little energy and the ratio is not very small. Not suitable for PPP */ + + if ( CURRP_Q_E->upper_cut_off_freq > 4000 ) + { + /* Use this bumup only for WB signals */ + if ( DTFS_getEngy_band_wb( *CURRP_Q_E, 0.0, 2000.0 ) > 0 ) + { + sp_hb_enratio = DTFS_getEngy_band_wb( *CURRP_Q_E, 2000.0, 6400.0 ) / DTFS_getEngy_band_wb( *CURRP_Q_E, 0.0, 2000.0 ); + } + else + { + sp_hb_enratio = 0; + } + + low_band_en = (float) DTFS_getEngy_band_wb( *CURRP_Q_E, 0.0, 2000.0 ); + + if ( low_band_en < 25.0f && sp_hb_enratio < 1.6f ) + { + PPP_MODE_E = 'B'; + } + } + + if ( hSC_VBR->vadsnr < hSC_VBR->SNR_THLD ) + { + if ( DTFS_getEngy( *CURRP_NQ ) > 0.8f * hSC_VBR->prev_cw_en && max( pos_nq, neg_nq ) > 3.0f && hSC_VBR->rate_control ) + { + if ( pos_nq > neg_nq && pos_nq > 2.0f * pos_q ) + { + PPP_MODE_E = 'B'; + } + + if ( pos_nq < neg_nq && neg_nq > 2.0f * neg_q ) + { + PPP_MODE_E = 'B'; + } + } + } + else + { + if ( ( ( ( DTFS_getEngy( *CURRP_NQ ) > ( hSC_VBR->prev_cw_en ) ) && ( max( pos_nq, neg_nq ) > 3.5 ) ) && ( hSC_VBR->rate_control ) ) || + ( ( ( DTFS_getEngy( *CURRP_NQ ) > 0.8 * ( hSC_VBR->prev_cw_en ) ) && ( max( pos_nq, neg_nq ) > 3.0 ) ) && ( !hSC_VBR->rate_control ) ) ) + { + if ( ( ( pos_nq > neg_nq ) && ( pos_nq > 2.5 * pos_q ) && ( hSC_VBR->rate_control ) ) || + ( ( pos_nq > neg_nq ) && ( pos_nq > 2.0 * pos_q ) && ( !hSC_VBR->rate_control ) ) ) + { + PPP_MODE_E = 'B'; + } + + if ( ( ( ( pos_nq < neg_nq ) && ( neg_nq > 2.5 * neg_q ) ) && ( hSC_VBR->rate_control ) ) || + ( ( pos_nq < neg_nq ) && ( neg_nq > 2.0 * neg_q ) && ( !hSC_VBR->rate_control ) ) ) + { + PPP_MODE_E = 'B'; + } + } + + if ( hSC_VBR->rate_control ) + { + DTFS_peaktoaverage( *CURRP_NQ, &pos_nq0, &neg_nq0 ); + + for ( impzi[0] = 1.0, i = 1; i < 160; i++ ) + { + impzi[i] = 0.0; + } + + for ( i = 0; i < 160; i++ ) + { + impzo[i] = 0.0; + } + + for ( i = 0; i < 10; i++ ) + { + mem[i] = 0.0; + } + + SynthesisFilter( &impzo[0], &impzi[0], lpc2, &mem[0], 10, 160 ); + + for ( i = 0; i < 160; i++ ) + { + energy_impz += ( impzo[i] * impzo[i] ); + } + + energy_impz = (float) ( 10 * log10( (float) energy_impz ) ); + + if ( ( DTFS_getEngy( *CURRP_Q_E ) > hSC_VBR->prev_cw_en ) && ( max( pos_q, neg_q ) > 3.5 ) && energy_impz > 15.0 && tmpres > 0.7 ) + { + if ( ( pos_q > neg_q ) && ( ( pos_q > 3.0 * pos_nq0 ) || ( ( pos_q > 1.5 * pos_nq0 ) && ( neg_q < 1.5 * neg_q ) ) ) ) + { + PPP_MODE_E = 'B'; + } + + if ( ( pos_q <= neg_q ) && ( ( neg_q > 3.0 * neg_nq0 ) || ( ( neg_q > 1.5 * neg_nq0 ) && ( pos_q < 1.5 * pos_q ) ) ) ) + { + PPP_MODE_E = 'B'; + } + } + } + } + + DTFS_copy( TMPDTFS2, *CURRP_Q_E ); + + DTFS_poleFilter( TMPDTFS, lpc2, M + 1 ); + DTFS_poleFilter( TMPDTFS2, lpc2, M + 1 ); + + DTFS_sub( TMPDTFS3, *TMPDTFS, *TMPDTFS2 ); + + /* operate in ADR mode only the rate control is active. This adds some bumpups to improve the speech quality */ + tmp2 = DTFS_getEngy_band( *TMPDTFS, 1500.0, upper_cut_off_freq_of_interest ) / DTFS_getEngy( *TMPDTFS ); + if ( tmp2 == 0.0 ) + { + tmp2 = 0.001; + } + if ( ( tmp2 > 0.05 ) && ( !hSC_VBR->rate_control ) ) + { + tmp2 = DTFS_getEngy_band( *TMPDTFS, 1500.0, upper_cut_off_freq_of_interest ) / DTFS_getEngy_band( *TMPDTFS3, 1500.0, upper_cut_off_freq_of_interest ); + if ( tmp2 == 0.0 ) + { + tmp2 = 0.001; + } + if ( 10.0 * log10( tmp2 ) < 0.1 ) + { + if ( res_enratio > 0.8 ) + { + PPP_MODE_E = 'B'; + } + } + } + + /* To increase bump up, raise first threshold, lower second */ + tmp = (float) ( 10.0 * log10( DTFS_getEngy( *TMPDTFS ) / DTFS_getEngy( *TMPDTFS3 ) ) ); + + if ( ( tmp <= 0 ) && ( !hSC_VBR->rate_control ) ) + { + PPP_MODE_E = 'B'; + } + + if ( hSC_VBR->vadsnr < hSC_VBR->SNR_THLD ) + { + if ( ( ( tmp < 3.05 && max( res_enratio, sp_enratio ) > 0.8 ) && ( hSC_VBR->rate_control ) ) || + ( ( tmp < 2.8 && max( res_enratio, sp_enratio ) > 0.65 ) && ( !hSC_VBR->rate_control ) ) ) + { + PPP_MODE_E = 'B'; + } + } + else + { + if ( ( ( tmp < 2.4 && max( res_enratio, sp_enratio ) > 0.94 ) && ( hSC_VBR->rate_control ) ) || + ( ( tmp < 4.5 && max( res_enratio, sp_enratio ) > 0.5 ) && ( !hSC_VBR->rate_control ) ) ) + { + PPP_MODE_E = 'B'; + } + } + /* -----End closed-loop Bump-Up */ + } + else + { + PPP_MODE_E = 'B'; /* Amplitude quantization is failing */ + } + } + else + { + } + + if ( PPP_MODE_E == 'B' ) + { + hSC_VBR->bump_up = 1; + + free( CURRP_NQ ); + free( TMPDTFS ); + free( TMPDTFS2 ); + free( TMPDTFS3 ); + free( CURRP_Q_E ); + free( dtfs_temp ); + + return error; + } + + if ( hSC_VBR->Q_to_F ) + { + hSC_VBR->patterncount += hSC_VBR->pattern_m; + + if ( hSC_VBR->patterncount >= 1000 ) + { + hSC_VBR->patterncount -= 1000; + PPP_MODE_E = 'B'; + hSC_VBR->bump_up = 1; + + free( CURRP_NQ ); + free( TMPDTFS ); + free( TMPDTFS2 ); + free( TMPDTFS3 ); + free( CURRP_Q_E ); + free( dtfs_temp ); + + return error; + } + } + + /* packetization of the delta lag in PPP */ + if ( PPP_MODE_E == 'Q' ) + { + Q_delta_lag = delta_lag_E + 11; /* to make it positive always */ + push_indice( hBstr, IND_DELTALAG, Q_delta_lag, 5 ); + } + + if ( ( error = WIsyn( *dtfs_temp, CURRP_Q_E, lpc2, &( hSC_VBR->ph_offset_E ), out, L_FRAME, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + + + DTFS_copy( dtfs_temp, *CURRP_Q_E ); + hSC_VBR->prev_cw_en = DTFS_getEngy( *CURRP_NQ ); + + /* Copy DTFS related parameters from 'dtfs_temp' to 'hSC_VBR' structure */ + hSC_VBR->dtfs_enc_lag = dtfs_temp->lag; + hSC_VBR->dtfs_enc_nH = dtfs_temp->nH; + hSC_VBR->dtfs_enc_nH_4kHz = dtfs_temp->nH_4kHz; + hSC_VBR->dtfs_enc_upper_cut_off_freq_of_interest = dtfs_temp->upper_cut_off_freq_of_interest; + hSC_VBR->dtfs_enc_upper_cut_off_freq = dtfs_temp->upper_cut_off_freq; + + mvr2r( dtfs_temp->a, hSC_VBR->dtfs_enc_a, MAXLAG_WI ); + mvr2r( dtfs_temp->b, hSC_VBR->dtfs_enc_b, MAXLAG_WI ); + + free( CURRP_NQ ); + free( TMPDTFS ); + free( TMPDTFS2 ); + free( TMPDTFS3 ); + free( CURRP_Q_E ); + free( dtfs_temp ); + + return error; +} + + +/*-------------------------------------------------------------------* + * SynthesisFilter() + * + * + *--------------------------------------------------------------------*/ + +static void SynthesisFilter( + float *output, + float *input, + float *coef, + float *memory, + int16_t order, + int16_t length ) +{ + int16_t i, j; + float acc; + + /* IIR filter for each subframe */ + for ( i = 0; i < length; i++ ) + { + for ( j = order - 1, acc = *input++; j > 0; j-- ) + { + acc -= coef[j] * memory[j]; + memory[j] = memory[j - 1]; + } + + acc -= coef[0] * memory[0]; + *output++ = acc; + memory[0] = acc; + } + + return; +} + + +/*---------------------------------------------------------------------* + * sc_vbr_enc_init() + * + * Initialize SC-VBR encoder + *---------------------------------------------------------------------*/ + +void sc_vbr_enc_init( + SC_VBR_ENC_HANDLE hSC_VBR /* i/o: SC-VBR encoder handle */ +) +{ + hSC_VBR->nelp_enc_seed = 0; + hSC_VBR->last_nelp_mode = 0; + hSC_VBR->pppcountE = 0; + hSC_VBR->last_ppp_mode = 0; + hSC_VBR->last_last_ppp_mode = 0; + hSC_VBR->firstTime_voicedenc = 1; + hSC_VBR->prev_ppp_gain_pit = 0.0; + hSC_VBR->prev_tilt_code = 0.0; + + hSC_VBR->ppp_mode = 0; + hSC_VBR->nelp_mode = 0; + + hSC_VBR->pattern_m = 0; + hSC_VBR->Last_Resort = 0; + hSC_VBR->set_ppp_generic = 0; + hSC_VBR->Q_to_F = 0; + + hSC_VBR->numactive = 0; /* keep the count of the frames inside current 600 frame bloack.*/ + hSC_VBR->sum_of_rates = 0.0f; /* sum of the rates of past 600 active frames*/ + hSC_VBR->global_avr_rate = 0.0f; /* global rate upto current time. recorded a (rate in kbps) *6000*/ + hSC_VBR->global_frame_cnt = 0; /* 600 active frame block count. Used to update the global rate*/ + + hSC_VBR->rate_control = 0; + hSC_VBR->SNR_THLD = 67.0f; + hSC_VBR->mode_QQF = 1; + + set_f( hSC_VBR->shape1_filt_mem, 0, 20 ); + set_f( hSC_VBR->shape2_filt_mem, 0, 20 ); + set_f( hSC_VBR->shape3_filt_mem, 0, 20 ); + set_f( hSC_VBR->txlpf1_filt1_mem, 0, 20 ); + set_f( hSC_VBR->txlpf1_filt2_mem, 0, 20 ); + set_f( hSC_VBR->txhpf1_filt1_mem, 0, 20 ); + set_f( hSC_VBR->txhpf1_filt2_mem, 0, 20 ); + + hSC_VBR->last_7k2_coder_type = GENERIC; + hSC_VBR->vbr_generic_ho = 0; + hSC_VBR->Local_VAD = 0; + + return; +} diff --git a/lib_enc/waveadjust_fec_cod.c b/lib_enc/waveadjust_fec_cod.c new file mode 100644 index 0000000000000000000000000000000000000000..bd57e4a09330c63bef7baa6ba7a0595bab3f06c6 --- /dev/null +++ b/lib_enc/waveadjust_fec_cod.c @@ -0,0 +1,73 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include "options.h" +#include +#include "prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * SFM_Cal() + * + * + *--------------------------------------------------------------------*/ + +float SFM_Cal( + const float fcoef[], + const int16_t n ) +{ + int16_t i, k; + double geoMean = 0, arithMean = 0, SFM; + double tmp[4] = { 1, 1, 1, 1 }; + + for ( k = 0; k < 4; k++ ) + { + + for ( i = k * ( n >> 2 ); i < ( k + 1 ) * ( n >> 2 ); i++ ) + { + tmp[k] *= ( fabs( fcoef[i] ) + EPSILON ); + arithMean += fabs( fcoef[i] ); + } + } + geoMean = log( tmp[0] ) + log( tmp[1] ) + log( tmp[2] ) + log( tmp[3] ); + geoMean = geoMean / n; + geoMean = exp( geoMean ); + arithMean /= n; + SFM = ( geoMean + EPSILON ) / ( arithMean + EPSILON ); + + return (float) SFM; +} diff --git a/lib_rend/ivas_allrad_dec.c b/lib_rend/ivas_allrad_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..abc98d70a3c8dec07c80c39ccaedf523915110db --- /dev/null +++ b/lib_rend/ivas_allrad_dec.c @@ -0,0 +1,163 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include +#include +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_prot_rend.h" +#include "ivas_rom_rend.h" +#include "wmc_auto.h" + + + +/*-----------------------------------------------------------------------* + * Global function definitions + *-----------------------------------------------------------------------*/ + +/*-------------------------------------------------------------------------* + * ivas_sba_get_hoa_dec_matrix() + * + * Computes the ALLRAD decoder matrix for HOA to loudspeakers + *-------------------------------------------------------------------------*/ + +ivas_error ivas_sba_get_hoa_dec_matrix( + const IVAS_OUTPUT_SETUP hOutSetup, /* i : target output setup */ + float **hoa_dec_mtx, /* o : ALLRAD decoder matrix */ + const int16_t ambisonics_order /* i : Ambisonics order */ +) +{ + int16_t i, j, k; + int16_t num_harm, num_td, num_spk; + const float *t_design_azi, *t_design_ele; + float tmp_val; + float G_td[MAX_OUTPUT_CHANNELS]; + float Y_td[SBA_NHARM_HOA3]; + float *p_dec_mtx; + EFAP_HANDLE hEFAP; + ivas_error error; + + error = IVAS_ERR_OK; + + /* Allocate memory */ + assert( *hoa_dec_mtx == NULL && "hoa_dec_mtx != NULL" ); + if ( ( *hoa_dec_mtx = (float *) malloc( SBA_NHARM_HOA3 * ( hOutSetup.nchan_out_woLFE ) * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "ALLRAD: Cannot allocate memory!" ) ); + } + + /* Initialization by zeroing all SH coeff up to 3rd order (IVAS convention) */ + num_spk = hOutSetup.nchan_out_woLFE; + p_dec_mtx = *hoa_dec_mtx; + + for ( i = 0; i < num_spk; i++ ) + { + for ( j = 0; j < SBA_NHARM_HOA3; j++ ) + { + *( p_dec_mtx++ ) = 0.f; + } + } + + if ( hOutSetup.output_config == IVAS_AUDIO_CONFIG_MONO ) + { + ( *hoa_dec_mtx )[0] = 1.f; + } + else if ( hOutSetup.output_config == IVAS_AUDIO_CONFIG_STEREO ) + { + ( *hoa_dec_mtx )[0] = 0.5f; + ( *hoa_dec_mtx )[1] = 0.5f; + ( *hoa_dec_mtx )[SBA_NHARM_HOA3] = 0.5f; + ( *hoa_dec_mtx )[SBA_NHARM_HOA3 + 1] = -0.5f; + } + else if ( hOutSetup.is_loudspeaker_setup ) + { + /* init EFIP */ + if ( ( error = efap_init_data( &( hEFAP ), hOutSetup.ls_azimuth, hOutSetup.ls_elevation, num_spk, EFAP_MODE_EFIP ) ) != IVAS_ERR_OK ) + { + return error; + } + + num_harm = ivas_sba_get_nchan( ambisonics_order, 0 ); + + /* Get t-design values */ + num_td = SBA_T_DESIGN_11_SIZE; + t_design_azi = t_design_11_azimuth; + t_design_ele = t_design_11_elevation; + + /* dec_mtx = ( 1 / num_td ) * (G_td * Y_td') * diag(norm_sn3d) */ + for ( i = 0; i < num_td; i++ ) + { + /* spherical harmonics response for t-design, corresponding to ambisonic order */ + ivas_dirac_dec_get_response( (int16_t) t_design_azi[i], (int16_t) t_design_ele[i], Y_td, ambisonics_order ); + for ( j = 0; j < num_harm; j++ ) + { + Y_td[j] *= norm_sn3d_hoa3[j]; + } + + /* t-design to real LS panning gains */ + efap_determine_gains( hEFAP, G_td, t_design_azi[i], t_design_ele[i], EFAP_MODE_EFIP ); + + p_dec_mtx = *hoa_dec_mtx; + for ( j = 0; j < num_spk; j++ ) + { + for ( k = 0; k < num_harm; k++ ) + { + *( p_dec_mtx++ ) += G_td[j] * Y_td[k]; + } + p_dec_mtx += ( SBA_NHARM_HOA3 - num_harm ); + } + } + + tmp_val = 1.f / num_td; + p_dec_mtx = *hoa_dec_mtx; + for ( i = 0; i < num_spk; i++ ) + { + for ( j = 0; j < num_harm; j++ ) + { + *( p_dec_mtx++ ) *= tmp_val * norm_sn3d_hoa3[j]; + } + p_dec_mtx += ( SBA_NHARM_HOA3 - num_harm ); + } + + /* free EFAP handle */ + efap_free_data( &hEFAP ); + } + else + { + assert( 0 && "ALLRAD: output not supported!!!" ); + } + + + return error; +} diff --git a/lib_rend/ivas_crend.c b/lib_rend/ivas_crend.c new file mode 100644 index 0000000000000000000000000000000000000000..06b6bae9e1adbf139d90e2f0cbca2c2ea2eb5108 --- /dev/null +++ b/lib_rend/ivas_crend.c @@ -0,0 +1,1897 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_prot_rend.h" +#include "ivas_cnst.h" +#include "ivas_rom_rend.h" +#include +#include "ivas_rom_binaural_crend_head.h" +#include "ivas_stat_rend.h" +#include "lib_rend.h" +#include "wmc_auto.h" + + +/*------------------------------------------------------------------------- + * ivas_hrtf_init() + * + * Initialize hHrtf handle + *------------------------------------------------------------------------*/ + +ivas_error ivas_hrtf_init( + HRTFS_DATA *hHrtf /* i/o: HRTF handle */ +) +{ + int16_t i, j; + + if ( hHrtf == NULL ) + { + return IVAS_ERR_WRONG_PARAMS; + } + + hHrtf->latency_s = 0; + hHrtf->max_num_ir = 0; + hHrtf->max_num_iterations = 0; + hHrtf->gain_lfe = 0; + hHrtf->index_frequency_max_diffuse = 0; + + for ( i = 0; i < MAX_INTERN_CHANNELS; i++ ) + { + hHrtf->inv_diffuse_weight[i] = 0; + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations[i][j] = 0; + hHrtf->pIndex_frequency_max[i][j] = NULL; + hHrtf->pOut_to_bin_re[i][j] = NULL; + hHrtf->pOut_to_bin_im[i][j] = NULL; + } + } + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations_diffuse[j] = 0; + hHrtf->pIndex_frequency_max_diffuse[j] = NULL; + hHrtf->pOut_to_bin_diffuse_re[j] = NULL; + hHrtf->pOut_to_bin_diffuse_im[j] = NULL; + } + + return IVAS_ERR_OK; +} + + +/*------------------------------------------------------------------------- + * ivas_hrtf_open() + * + * Open hHrtf handle + *------------------------------------------------------------------------*/ + +static ivas_error ivas_hrtf_open( + HRTFS_HANDLE *hHrtf_out /* o : HRTF handle */ +) +{ + HRTFS_HANDLE hHrtf; + ivas_error error; + + if ( *hHrtf_out == NULL ) + { + if ( ( hHrtf = (HRTFS_HANDLE) malloc( sizeof( HRTFS_DATA ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR decoder\n" ); + } + + if ( ( error = ivas_hrtf_init( hHrtf ) ) != IVAS_ERR_OK ) + { + return error; + } + + *hHrtf_out = hHrtf; + } + else + { + return IVAS_ERR_INTERNAL; + } + + return IVAS_ERR_OK; +} + + +/*------------------------------------------------------------------------- + * ivas_hrtf_close() + * + * Close hHrtf handle + *------------------------------------------------------------------------*/ + +static void ivas_hrtf_close( + HRTFS_HANDLE *hHrtf /* i/o: HRTF handle */ +) +{ + if ( hHrtf == NULL || *hHrtf == NULL ) + { + return; + } + + free( *hHrtf ); + *hHrtf = NULL; + + return; +} + +/*------------------------------------------------------------------------- + * initCrend_from_rom() + * + * Allocate and initialize crend renderer handle + *------------------------------------------------------------------------*/ + +static ivas_error ivas_rend_initCrend( + CREND_WRAPPER *pCrend, + const AUDIO_CONFIG inConfig, + const AUDIO_CONFIG outConfig, + HRTFS_CREND_HANDLE hSetOfHRTF, + const int32_t output_Fs ) +{ + int16_t i, j, tmp; + int16_t nchan_in; + IVAS_REND_AudioConfigType inConfigType; + HRTFS_HANDLE hHrtf; + ivas_error error; + + inConfigType = getAudioConfigType( inConfig ); + hHrtf = pCrend->hHrtfCrend; + + /* Do all error checks up front so that the nested if later is easier */ + if ( inConfigType != IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED && inConfigType != IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Encountered unsupported input config in Crend" ); + } + + if ( outConfig != IVAS_AUDIO_CONFIG_BINAURAL && outConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR && outConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB + ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Encountered unsupported output type in Crend" ); + } + + if ( hHrtf == NULL ) + { + if ( ivas_hrtf_open( &hHrtf ) != IVAS_ERR_OK ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for HRTF handle" ); + } + } + + if ( ( error = getAudioConfigNumChannels( inConfig, &nchan_in ) ) != IVAS_ERR_OK ) + { + return error; + } + hHrtf->max_num_ir = nchan_in; + + if ( hHrtf->max_num_ir <= 0 ) + { + return IVAS_ERR_INTERNAL_FATAL; + } + + if ( hSetOfHRTF == NULL ) + { + if ( inConfigType == IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) + { + hHrtf->max_num_ir -= 1; /* subtract LFE */ + hHrtf->gain_lfe = GAIN_LFE; + + if ( output_Fs == 48000 ) + { + if ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) + { + hHrtf->latency_s = CRendBin_Combined_BRIR_latency_s; + hHrtf->max_num_iterations = CRendBin_Combined_BRIR_max_num_iterations_48kHz; + hHrtf->index_frequency_max_diffuse = CRendBin_Combined_BRIR_index_frequency_max_diffuse_48kHz; + } + else + { + hHrtf->latency_s = CRendBin_Combined_HRIR_latency_s; + hHrtf->max_num_iterations = CRendBin_Combined_HRIR_max_num_iterations_48kHz; + hHrtf->index_frequency_max_diffuse = CRendBin_Combined_HRIR_index_frequency_max_diffuse_48kHz; + } + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + if ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) + { + hHrtf->num_iterations_diffuse[j] = CRendBin_Combined_BRIR_num_iterations_diffuse_48kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_48kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_Combined_BRIR_coeff_diffuse_re_48kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_Combined_BRIR_coeff_diffuse_im_48kHz[j]; + } + else + { + hHrtf->num_iterations_diffuse[j] = CRendBin_Combined_HRIR_num_iterations_diffuse_48kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_48kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_Combined_HRIR_coeff_diffuse_re_48kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_Combined_HRIR_coeff_diffuse_im_48kHz[j]; + } + } + } + else if ( output_Fs == 32000 ) + { + if ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) + { + hHrtf->latency_s = CRendBin_Combined_BRIR_latency_s; + hHrtf->max_num_iterations = CRendBin_Combined_BRIR_max_num_iterations_32kHz; + hHrtf->index_frequency_max_diffuse = CRendBin_Combined_BRIR_index_frequency_max_diffuse_32kHz; + } + else + { + hHrtf->latency_s = CRendBin_Combined_HRIR_latency_s; + hHrtf->max_num_iterations = CRendBin_Combined_HRIR_max_num_iterations_32kHz; + hHrtf->index_frequency_max_diffuse = CRendBin_Combined_HRIR_index_frequency_max_diffuse_32kHz; + } + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + if ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) + { + hHrtf->num_iterations_diffuse[j] = CRendBin_Combined_BRIR_num_iterations_diffuse_32kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_32kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_Combined_BRIR_coeff_diffuse_re_32kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_Combined_BRIR_coeff_diffuse_im_32kHz[j]; + } + else + { + hHrtf->num_iterations_diffuse[j] = CRendBin_Combined_HRIR_num_iterations_diffuse_32kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_32kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_Combined_HRIR_coeff_diffuse_re_32kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_Combined_HRIR_coeff_diffuse_im_32kHz[j]; + } + } + } + else if ( output_Fs == 16000 ) + { + if ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) + { + hHrtf->latency_s = CRendBin_Combined_BRIR_latency_s; + hHrtf->max_num_iterations = CRendBin_Combined_BRIR_max_num_iterations_16kHz; + hHrtf->index_frequency_max_diffuse = CRendBin_Combined_BRIR_index_frequency_max_diffuse_16kHz; + } + else + { + hHrtf->latency_s = CRendBin_Combined_HRIR_latency_s; + hHrtf->max_num_iterations = CRendBin_Combined_HRIR_max_num_iterations_16kHz; + hHrtf->index_frequency_max_diffuse = CRendBin_Combined_HRIR_index_frequency_max_diffuse_16kHz; + } + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + if ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) + { + hHrtf->num_iterations_diffuse[j] = CRendBin_Combined_BRIR_num_iterations_diffuse_16kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_16kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_Combined_BRIR_coeff_diffuse_re_16kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_Combined_BRIR_coeff_diffuse_im_16kHz[j]; + } + else + { + hHrtf->num_iterations_diffuse[j] = CRendBin_Combined_HRIR_num_iterations_diffuse_16kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_16kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_Combined_HRIR_coeff_diffuse_re_16kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_Combined_HRIR_coeff_diffuse_im_16kHz[j]; + } + } + } + else + { + return IVAS_ERROR( IVAS_ERR_INVALID_SAMPLING_RATE, "Encountered Unsupported sampling rate in Crend" ); + } + + for ( i = 0; i < hHrtf->max_num_ir; i++ ) + { + if ( inConfig == IVAS_AUDIO_CONFIG_5_1 ) + { + tmp = channelIndex_CICP6[i]; + } + else if ( inConfig == IVAS_AUDIO_CONFIG_7_1 ) + { + tmp = channelIndex_CICP12[i]; + } + else if ( inConfig == IVAS_AUDIO_CONFIG_5_1_2 ) + { + tmp = channelIndex_CICP14[i]; + } + else if ( inConfig == IVAS_AUDIO_CONFIG_5_1_4 ) + { + tmp = channelIndex_CICP16[i]; + } + else if ( inConfig == IVAS_AUDIO_CONFIG_7_1_4 ) + { + tmp = channelIndex_CICP19[i]; + } + else + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error: Channel configuration not specified!\n\n" ); + } + + if ( output_Fs == 48000 ) + { + if ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) + { + hHrtf->inv_diffuse_weight[i] = CRendBin_Combined_BRIR_inv_diffuse_weight_48kHz[tmp]; + } + else + { + hHrtf->inv_diffuse_weight[i] = CRendBin_Combined_HRIR_inv_diffuse_weight_48kHz[tmp]; + } + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + if ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) + { + hHrtf->num_iterations[i][j] = CRendBin_Combined_BRIR_num_iterations_48kHz[tmp][j]; + hHrtf->pIndex_frequency_max[i][j] = CRendBin_Combined_BRIR_pIndex_frequency_max_48kHz[tmp][j]; + hHrtf->pOut_to_bin_re[i][j] = CRendBin_Combined_BRIR_coeff_re_48kHz[tmp][j]; + hHrtf->pOut_to_bin_im[i][j] = CRendBin_Combined_BRIR_coeff_im_48kHz[tmp][j]; + } + else + { + hHrtf->num_iterations[i][j] = CRendBin_Combined_HRIR_num_iterations_48kHz[tmp][j]; + hHrtf->pIndex_frequency_max[i][j] = CRendBin_Combined_HRIR_pIndex_frequency_max_48kHz[tmp][j]; + hHrtf->pOut_to_bin_re[i][j] = CRendBin_Combined_HRIR_coeff_re_48kHz[tmp][j]; + hHrtf->pOut_to_bin_im[i][j] = CRendBin_Combined_HRIR_coeff_im_48kHz[tmp][j]; + } + } + } + else if ( output_Fs == 32000 ) + { + if ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) + { + hHrtf->inv_diffuse_weight[i] = CRendBin_Combined_BRIR_inv_diffuse_weight_32kHz[tmp]; + } + else + { + hHrtf->inv_diffuse_weight[i] = CRendBin_Combined_HRIR_inv_diffuse_weight_32kHz[tmp]; + } + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + if ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) + { + hHrtf->num_iterations[i][j] = CRendBin_Combined_BRIR_num_iterations_32kHz[tmp][j]; + hHrtf->pIndex_frequency_max[i][j] = CRendBin_Combined_BRIR_pIndex_frequency_max_32kHz[tmp][j]; + hHrtf->pOut_to_bin_re[i][j] = CRendBin_Combined_BRIR_coeff_re_32kHz[tmp][j]; + hHrtf->pOut_to_bin_im[i][j] = CRendBin_Combined_BRIR_coeff_im_32kHz[tmp][j]; + } + else + { + hHrtf->num_iterations[i][j] = CRendBin_Combined_HRIR_num_iterations_32kHz[tmp][j]; + hHrtf->pIndex_frequency_max[i][j] = CRendBin_Combined_HRIR_pIndex_frequency_max_32kHz[tmp][j]; + hHrtf->pOut_to_bin_re[i][j] = CRendBin_Combined_HRIR_coeff_re_32kHz[tmp][j]; + hHrtf->pOut_to_bin_im[i][j] = CRendBin_Combined_HRIR_coeff_im_32kHz[tmp][j]; + } + } + } + else if ( output_Fs == 16000 ) + { + if ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) + { + hHrtf->inv_diffuse_weight[i] = CRendBin_Combined_BRIR_inv_diffuse_weight_16kHz[tmp]; + } + else + { + hHrtf->inv_diffuse_weight[i] = CRendBin_Combined_HRIR_inv_diffuse_weight_16kHz[tmp]; + } + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + if ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) + { + hHrtf->num_iterations[i][j] = CRendBin_Combined_BRIR_num_iterations_16kHz[tmp][j]; + hHrtf->pIndex_frequency_max[i][j] = CRendBin_Combined_BRIR_pIndex_frequency_max_16kHz[tmp][j]; + hHrtf->pOut_to_bin_re[i][j] = CRendBin_Combined_BRIR_coeff_re_16kHz[tmp][j]; + hHrtf->pOut_to_bin_im[i][j] = CRendBin_Combined_BRIR_coeff_im_16kHz[tmp][j]; + } + else + { + hHrtf->num_iterations[i][j] = CRendBin_Combined_HRIR_num_iterations_16kHz[tmp][j]; + hHrtf->pIndex_frequency_max[i][j] = CRendBin_Combined_HRIR_pIndex_frequency_max_16kHz[tmp][j]; + hHrtf->pOut_to_bin_re[i][j] = CRendBin_Combined_HRIR_coeff_re_16kHz[tmp][j]; + hHrtf->pOut_to_bin_im[i][j] = CRendBin_Combined_HRIR_coeff_im_16kHz[tmp][j]; + } + } + } + else + { + return IVAS_ERROR( IVAS_ERR_INVALID_SAMPLING_RATE, "Encountered Unsupported sampling rate in Crend" ); + } + } + } + else if ( inConfigType == IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS ) + { + if ( inConfig == IVAS_AUDIO_CONFIG_HOA3 ) + { + if ( output_Fs == 48000 ) + { + hHrtf->latency_s = CRendBin_HOA3_HRIR_latency_s; + hHrtf->max_num_iterations = CRendBin_HOA3_HRIR_max_num_iterations_48kHz; + hHrtf->index_frequency_max_diffuse = CRendBin_HOA3_HRIR_index_frequency_max_diffuse_48kHz; + + for ( i = 0; i < hHrtf->max_num_ir; i++ ) + { + hHrtf->inv_diffuse_weight[i] = CRendBin_HOA3_HRIR_inv_diffuse_weight_48kHz[i]; + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations[i][j] = CRendBin_HOA3_HRIR_num_iterations_48kHz[i][j]; + hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_48kHz[i][j]; + hHrtf->pOut_to_bin_re[i][j] = CRendBin_HOA3_HRIR_coeff_re_48kHz[i][j]; + hHrtf->pOut_to_bin_im[i][j] = CRendBin_HOA3_HRIR_coeff_im_48kHz[i][j]; + } + } + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations_diffuse[j] = CRendBin_HOA3_HRIR_num_iterations_diffuse_48kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_48kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_HOA3_HRIR_coeff_diffuse_re_48kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_HOA3_HRIR_coeff_diffuse_im_48kHz[j]; + } + } + else if ( output_Fs == 32000 ) + { + hHrtf->latency_s = CRendBin_HOA3_HRIR_latency_s; + hHrtf->max_num_iterations = CRendBin_HOA3_HRIR_max_num_iterations_32kHz; + hHrtf->index_frequency_max_diffuse = CRendBin_HOA3_HRIR_index_frequency_max_diffuse_32kHz; + + for ( i = 0; i < hHrtf->max_num_ir; i++ ) + { + hHrtf->inv_diffuse_weight[i] = CRendBin_HOA3_HRIR_inv_diffuse_weight_32kHz[i]; + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations[i][j] = CRendBin_HOA3_HRIR_num_iterations_32kHz[i][j]; + hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_32kHz[i][j]; + hHrtf->pOut_to_bin_re[i][j] = CRendBin_HOA3_HRIR_coeff_re_32kHz[i][j]; + hHrtf->pOut_to_bin_im[i][j] = CRendBin_HOA3_HRIR_coeff_im_32kHz[i][j]; + } + } + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations_diffuse[j] = CRendBin_HOA3_HRIR_num_iterations_diffuse_32kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_32kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_HOA3_HRIR_coeff_diffuse_re_32kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_HOA3_HRIR_coeff_diffuse_im_32kHz[j]; + } + } + else if ( output_Fs == 16000 ) + { + hHrtf->latency_s = CRendBin_HOA3_HRIR_latency_s; + hHrtf->max_num_iterations = CRendBin_HOA3_HRIR_max_num_iterations_16kHz; + hHrtf->index_frequency_max_diffuse = CRendBin_HOA3_HRIR_index_frequency_max_diffuse_16kHz; + + for ( i = 0; i < hHrtf->max_num_ir; i++ ) + { + hHrtf->inv_diffuse_weight[i] = CRendBin_HOA3_HRIR_inv_diffuse_weight_16kHz[i]; + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations[i][j] = CRendBin_HOA3_HRIR_num_iterations_16kHz[i][j]; + hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_16kHz[i][j]; + hHrtf->pOut_to_bin_re[i][j] = CRendBin_HOA3_HRIR_coeff_re_16kHz[i][j]; + hHrtf->pOut_to_bin_im[i][j] = CRendBin_HOA3_HRIR_coeff_im_16kHz[i][j]; + } + } + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations_diffuse[j] = CRendBin_HOA3_HRIR_num_iterations_diffuse_16kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_16kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_HOA3_HRIR_coeff_diffuse_re_16kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_HOA3_HRIR_coeff_diffuse_im_16kHz[j]; + } + } + else + { + return IVAS_ERROR( IVAS_ERR_INVALID_SAMPLING_RATE, "Encountered Unsupported sampling rate in Crend" ); + } + } + else if ( inConfig == IVAS_AUDIO_CONFIG_HOA2 ) + { + if ( output_Fs == 48000 ) + { + hHrtf->latency_s = CRendBin_HOA2_HRIR_latency_s; + hHrtf->max_num_iterations = CRendBin_HOA2_HRIR_max_num_iterations_48kHz; + hHrtf->index_frequency_max_diffuse = CRendBin_HOA2_HRIR_index_frequency_max_diffuse_48kHz; + + for ( i = 0; i < hHrtf->max_num_ir; i++ ) + { + hHrtf->inv_diffuse_weight[i] = CRendBin_HOA2_HRIR_inv_diffuse_weight_48kHz[i]; + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations[i][j] = CRendBin_HOA2_HRIR_num_iterations_48kHz[i][j]; + hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA2_HRIR_pIndex_frequency_max_48kHz[i][j]; + hHrtf->pOut_to_bin_re[i][j] = CRendBin_HOA2_HRIR_coeff_re_48kHz[i][j]; + hHrtf->pOut_to_bin_im[i][j] = CRendBin_HOA2_HRIR_coeff_im_48kHz[i][j]; + } + } + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations_diffuse[j] = CRendBin_HOA2_HRIR_num_iterations_diffuse_48kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_48kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_HOA2_HRIR_coeff_diffuse_re_48kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_HOA2_HRIR_coeff_diffuse_im_48kHz[j]; + } + } + else if ( output_Fs == 32000 ) + { + hHrtf->latency_s = CRendBin_HOA2_HRIR_latency_s; + hHrtf->max_num_iterations = CRendBin_HOA2_HRIR_max_num_iterations_32kHz; + hHrtf->index_frequency_max_diffuse = CRendBin_HOA2_HRIR_index_frequency_max_diffuse_32kHz; + + for ( i = 0; i < hHrtf->max_num_ir; i++ ) + { + hHrtf->inv_diffuse_weight[i] = CRendBin_HOA2_HRIR_inv_diffuse_weight_32kHz[i]; + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations[i][j] = CRendBin_HOA2_HRIR_num_iterations_32kHz[i][j]; + hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA2_HRIR_pIndex_frequency_max_32kHz[i][j]; + hHrtf->pOut_to_bin_re[i][j] = CRendBin_HOA2_HRIR_coeff_re_32kHz[i][j]; + hHrtf->pOut_to_bin_im[i][j] = CRendBin_HOA2_HRIR_coeff_im_32kHz[i][j]; + } + } + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations_diffuse[j] = CRendBin_HOA2_HRIR_num_iterations_diffuse_32kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_32kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_HOA2_HRIR_coeff_diffuse_re_32kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_HOA2_HRIR_coeff_diffuse_im_32kHz[j]; + } + } + else if ( output_Fs == 16000 ) + { + hHrtf->latency_s = CRendBin_HOA2_HRIR_latency_s; + hHrtf->max_num_iterations = CRendBin_HOA2_HRIR_max_num_iterations_16kHz; + hHrtf->index_frequency_max_diffuse = CRendBin_HOA2_HRIR_index_frequency_max_diffuse_16kHz; + + for ( i = 0; i < hHrtf->max_num_ir; i++ ) + { + hHrtf->inv_diffuse_weight[i] = CRendBin_HOA2_HRIR_inv_diffuse_weight_16kHz[i]; + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations[i][j] = CRendBin_HOA2_HRIR_num_iterations_16kHz[i][j]; + hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA2_HRIR_pIndex_frequency_max_16kHz[i][j]; + hHrtf->pOut_to_bin_re[i][j] = CRendBin_HOA2_HRIR_coeff_re_16kHz[i][j]; + hHrtf->pOut_to_bin_im[i][j] = CRendBin_HOA2_HRIR_coeff_im_16kHz[i][j]; + } + } + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations_diffuse[j] = CRendBin_HOA2_HRIR_num_iterations_diffuse_16kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_16kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_HOA2_HRIR_coeff_diffuse_re_16kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_HOA2_HRIR_coeff_diffuse_im_16kHz[j]; + } + } + else + { + return IVAS_ERROR( IVAS_ERR_INVALID_SAMPLING_RATE, "Encountered Unsupported sampling rate in Crend" ); + } + } + else if ( inConfig == IVAS_AUDIO_CONFIG_FOA ) + { + if ( output_Fs == 48000 ) + { + hHrtf->latency_s = CRendBin_FOA_HRIR_latency_s; + hHrtf->max_num_iterations = CRendBin_FOA_HRIR_max_num_iterations_48kHz; + hHrtf->index_frequency_max_diffuse = CRendBin_FOA_HRIR_index_frequency_max_diffuse_48kHz; + + for ( i = 0; i < hHrtf->max_num_ir; i++ ) + { + hHrtf->inv_diffuse_weight[i] = CRendBin_FOA_HRIR_inv_diffuse_weight_48kHz[i]; + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations[i][j] = CRendBin_FOA_HRIR_num_iterations_48kHz[i][j]; + hHrtf->pIndex_frequency_max[i][j] = CRendBin_FOA_HRIR_pIndex_frequency_max_48kHz[i][j]; + hHrtf->pOut_to_bin_re[i][j] = CRendBin_FOA_HRIR_coeff_re_48kHz[i][j]; + hHrtf->pOut_to_bin_im[i][j] = CRendBin_FOA_HRIR_coeff_im_48kHz[i][j]; + } + } + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations_diffuse[j] = CRendBin_FOA_HRIR_num_iterations_diffuse_48kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_48kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_FOA_HRIR_coeff_diffuse_re_48kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_FOA_HRIR_coeff_diffuse_im_48kHz[j]; + } + } + else if ( output_Fs == 32000 ) + { + hHrtf->latency_s = CRendBin_FOA_HRIR_latency_s; + hHrtf->max_num_iterations = CRendBin_FOA_HRIR_max_num_iterations_32kHz; + hHrtf->index_frequency_max_diffuse = CRendBin_FOA_HRIR_index_frequency_max_diffuse_32kHz; + + for ( i = 0; i < hHrtf->max_num_ir; i++ ) + { + hHrtf->inv_diffuse_weight[i] = CRendBin_FOA_HRIR_inv_diffuse_weight_32kHz[i]; + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations[i][j] = CRendBin_FOA_HRIR_num_iterations_32kHz[i][j]; + hHrtf->pIndex_frequency_max[i][j] = CRendBin_FOA_HRIR_pIndex_frequency_max_32kHz[i][j]; + hHrtf->pOut_to_bin_re[i][j] = CRendBin_FOA_HRIR_coeff_re_32kHz[i][j]; + hHrtf->pOut_to_bin_im[i][j] = CRendBin_FOA_HRIR_coeff_im_32kHz[i][j]; + } + } + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations_diffuse[j] = CRendBin_FOA_HRIR_num_iterations_diffuse_32kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_32kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_FOA_HRIR_coeff_diffuse_re_32kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_FOA_HRIR_coeff_diffuse_im_32kHz[j]; + } + } + else if ( output_Fs == 16000 ) + { + hHrtf->latency_s = CRendBin_FOA_HRIR_latency_s; + hHrtf->max_num_iterations = CRendBin_FOA_HRIR_max_num_iterations_16kHz; + hHrtf->index_frequency_max_diffuse = CRendBin_FOA_HRIR_index_frequency_max_diffuse_16kHz; + + for ( i = 0; i < hHrtf->max_num_ir; i++ ) + { + hHrtf->inv_diffuse_weight[i] = CRendBin_FOA_HRIR_inv_diffuse_weight_16kHz[i]; + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations[i][j] = CRendBin_FOA_HRIR_num_iterations_16kHz[i][j]; + hHrtf->pIndex_frequency_max[i][j] = CRendBin_FOA_HRIR_pIndex_frequency_max_16kHz[i][j]; + hHrtf->pOut_to_bin_re[i][j] = CRendBin_FOA_HRIR_coeff_re_16kHz[i][j]; + hHrtf->pOut_to_bin_im[i][j] = CRendBin_FOA_HRIR_coeff_im_16kHz[i][j]; + } + } + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations_diffuse[j] = CRendBin_FOA_HRIR_num_iterations_diffuse_16kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_16kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_FOA_HRIR_coeff_diffuse_re_16kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_FOA_HRIR_coeff_diffuse_im_16kHz[j]; + } + } + else + { + return IVAS_ERROR( IVAS_ERR_INVALID_SAMPLING_RATE, "Encountered Unsupported sampling rate in Crend" ); + } + } + else + { + return IVAS_ERROR( IVAS_ERR_INVALID_INPUT_FORMAT, "Encountered unsupported input config in Crend" ); + } + } + else + { + return IVAS_ERROR( IVAS_ERR_INTERNAL, "Unsupported renderer type in Crend" ); + } + } + else + { + if ( inConfigType == IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) + { + hHrtf->max_num_ir -= 1; /* subtract LFE */ + hHrtf->gain_lfe = GAIN_LFE; + + if ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) + { + hHrtf->latency_s = hSetOfHRTF->hHRTF_brir_combined->latency_s; + hHrtf->max_num_iterations = hSetOfHRTF->hHRTF_brir_combined->max_num_iterations; + hHrtf->index_frequency_max_diffuse = hSetOfHRTF->hHRTF_brir_combined->index_frequency_max_diffuse; + } + else + { + hHrtf->latency_s = hSetOfHRTF->hHRTF_hrir_combined->latency_s; + hHrtf->max_num_iterations = hSetOfHRTF->hHRTF_hrir_combined->max_num_iterations; + hHrtf->index_frequency_max_diffuse = hSetOfHRTF->hHRTF_hrir_combined->index_frequency_max_diffuse; + } + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + if ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) + { + hHrtf->num_iterations_diffuse[j] = hSetOfHRTF->hHRTF_brir_combined->num_iterations_diffuse[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = hSetOfHRTF->hHRTF_brir_combined->pIndex_frequency_max_diffuse[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = hSetOfHRTF->hHRTF_brir_combined->pOut_to_bin_diffuse_re[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = hSetOfHRTF->hHRTF_brir_combined->pOut_to_bin_diffuse_im[j]; + } + else + { + hHrtf->num_iterations_diffuse[j] = hSetOfHRTF->hHRTF_hrir_combined->num_iterations_diffuse[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = hSetOfHRTF->hHRTF_hrir_combined->pIndex_frequency_max_diffuse[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = hSetOfHRTF->hHRTF_hrir_combined->pOut_to_bin_diffuse_re[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = hSetOfHRTF->hHRTF_hrir_combined->pOut_to_bin_diffuse_im[j]; + } + } + + for ( i = 0; i < hHrtf->max_num_ir; i++ ) + { + if ( inConfig == IVAS_AUDIO_CONFIG_5_1 ) + { + tmp = channelIndex_CICP6[i]; + } + else if ( inConfig == IVAS_AUDIO_CONFIG_7_1 ) + { + tmp = channelIndex_CICP12[i]; + } + else if ( inConfig == IVAS_AUDIO_CONFIG_5_1_2 ) + { + tmp = channelIndex_CICP14[i]; + } + else if ( inConfig == IVAS_AUDIO_CONFIG_5_1_4 ) + { + tmp = channelIndex_CICP16[i]; + } + else if ( inConfig == IVAS_AUDIO_CONFIG_7_1_4 ) + { + tmp = channelIndex_CICP19[i]; + } + else + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error: Channel configuration not specified!\n\n" ); + } + + if ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) + { + hHrtf->inv_diffuse_weight[i] = hSetOfHRTF->hHRTF_brir_combined->inv_diffuse_weight[tmp]; + } + else + { + hHrtf->inv_diffuse_weight[i] = hSetOfHRTF->hHRTF_hrir_combined->inv_diffuse_weight[tmp]; + } + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + if ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) + { + hHrtf->num_iterations[i][j] = hSetOfHRTF->hHRTF_brir_combined->num_iterations[tmp][j]; + hHrtf->pIndex_frequency_max[i][j] = hSetOfHRTF->hHRTF_brir_combined->pIndex_frequency_max[tmp][j]; + hHrtf->pOut_to_bin_re[i][j] = hSetOfHRTF->hHRTF_brir_combined->pOut_to_bin_re[tmp][j]; + hHrtf->pOut_to_bin_im[i][j] = hSetOfHRTF->hHRTF_brir_combined->pOut_to_bin_im[tmp][j]; + } + else + { + hHrtf->num_iterations[i][j] = hSetOfHRTF->hHRTF_hrir_combined->num_iterations[tmp][j]; + hHrtf->pIndex_frequency_max[i][j] = hSetOfHRTF->hHRTF_hrir_combined->pIndex_frequency_max[tmp][j]; + hHrtf->pOut_to_bin_re[i][j] = hSetOfHRTF->hHRTF_hrir_combined->pOut_to_bin_re[tmp][j]; + hHrtf->pOut_to_bin_im[i][j] = hSetOfHRTF->hHRTF_hrir_combined->pOut_to_bin_im[tmp][j]; + } + } + } + } + else if ( inConfigType == IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS ) + { + if ( inConfig == IVAS_AUDIO_CONFIG_HOA3 ) + { + hHrtf->latency_s = hSetOfHRTF->hHRTF_hrir_hoa3->latency_s; + hHrtf->max_num_iterations = hSetOfHRTF->hHRTF_hrir_hoa3->max_num_iterations; + hHrtf->index_frequency_max_diffuse = hSetOfHRTF->hHRTF_hrir_hoa3->index_frequency_max_diffuse; + + for ( i = 0; i < hHrtf->max_num_ir; i++ ) + { + hHrtf->inv_diffuse_weight[i] = hSetOfHRTF->hHRTF_hrir_hoa3->inv_diffuse_weight[i]; + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations[i][j] = hSetOfHRTF->hHRTF_hrir_hoa3->num_iterations[i][j]; + hHrtf->pIndex_frequency_max[i][j] = hSetOfHRTF->hHRTF_hrir_hoa3->pIndex_frequency_max[i][j]; + hHrtf->pOut_to_bin_re[i][j] = hSetOfHRTF->hHRTF_hrir_hoa3->pOut_to_bin_re[i][j]; + hHrtf->pOut_to_bin_im[i][j] = hSetOfHRTF->hHRTF_hrir_hoa3->pOut_to_bin_im[i][j]; + } + } + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations_diffuse[j] = hSetOfHRTF->hHRTF_hrir_hoa3->num_iterations_diffuse[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = hSetOfHRTF->hHRTF_hrir_hoa3->pIndex_frequency_max_diffuse[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = hSetOfHRTF->hHRTF_hrir_hoa3->pOut_to_bin_diffuse_re[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = hSetOfHRTF->hHRTF_hrir_hoa3->pOut_to_bin_diffuse_im[j]; + } + } + else if ( inConfig == IVAS_AUDIO_CONFIG_HOA2 ) + { + hHrtf->latency_s = hSetOfHRTF->hHRTF_hrir_hoa2->latency_s; + hHrtf->max_num_iterations = hSetOfHRTF->hHRTF_hrir_hoa2->max_num_iterations; + hHrtf->index_frequency_max_diffuse = hSetOfHRTF->hHRTF_hrir_hoa2->index_frequency_max_diffuse; + + for ( i = 0; i < hHrtf->max_num_ir; i++ ) + { + hHrtf->inv_diffuse_weight[i] = hSetOfHRTF->hHRTF_hrir_hoa2->inv_diffuse_weight[i]; + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations[i][j] = hSetOfHRTF->hHRTF_hrir_hoa2->num_iterations[i][j]; + hHrtf->pIndex_frequency_max[i][j] = hSetOfHRTF->hHRTF_hrir_hoa2->pIndex_frequency_max[i][j]; + hHrtf->pOut_to_bin_re[i][j] = hSetOfHRTF->hHRTF_hrir_hoa2->pOut_to_bin_re[i][j]; + hHrtf->pOut_to_bin_im[i][j] = hSetOfHRTF->hHRTF_hrir_hoa2->pOut_to_bin_im[i][j]; + } + } + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations_diffuse[j] = hSetOfHRTF->hHRTF_hrir_hoa2->num_iterations_diffuse[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = hSetOfHRTF->hHRTF_hrir_hoa2->pIndex_frequency_max_diffuse[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = hSetOfHRTF->hHRTF_hrir_hoa2->pOut_to_bin_diffuse_re[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = hSetOfHRTF->hHRTF_hrir_hoa2->pOut_to_bin_diffuse_im[j]; + } + } + else if ( inConfig == IVAS_AUDIO_CONFIG_FOA ) + { + hHrtf->latency_s = hSetOfHRTF->hHRTF_hrir_foa->latency_s; + hHrtf->max_num_iterations = hSetOfHRTF->hHRTF_hrir_foa->max_num_iterations; + hHrtf->index_frequency_max_diffuse = hSetOfHRTF->hHRTF_hrir_foa->index_frequency_max_diffuse; + + for ( i = 0; i < hHrtf->max_num_ir; i++ ) + { + hHrtf->inv_diffuse_weight[i] = hSetOfHRTF->hHRTF_hrir_foa->inv_diffuse_weight[i]; + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations[i][j] = hSetOfHRTF->hHRTF_hrir_foa->num_iterations[i][j]; + hHrtf->pIndex_frequency_max[i][j] = hSetOfHRTF->hHRTF_hrir_foa->pIndex_frequency_max[i][j]; + hHrtf->pOut_to_bin_re[i][j] = hSetOfHRTF->hHRTF_hrir_foa->pOut_to_bin_re[i][j]; + hHrtf->pOut_to_bin_im[i][j] = hSetOfHRTF->hHRTF_hrir_foa->pOut_to_bin_im[i][j]; + } + } + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations_diffuse[j] = hSetOfHRTF->hHRTF_hrir_foa->num_iterations_diffuse[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = hSetOfHRTF->hHRTF_hrir_foa->pIndex_frequency_max_diffuse[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = hSetOfHRTF->hHRTF_hrir_foa->pOut_to_bin_diffuse_re[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = hSetOfHRTF->hHRTF_hrir_foa->pOut_to_bin_diffuse_im[j]; + } + } + else + { + return IVAS_ERROR( IVAS_ERR_INTERNAL, "Unsupported renderer type in Crend" ); + } + } + } + + pCrend->hHrtfCrend = hHrtf; + + return IVAS_ERR_OK; +} + + +/*------------------------------------------------------------------------- + * ivas_shoebox_data_init() + * + * Initialize shoebox_data_t handle + *------------------------------------------------------------------------*/ + +static ivas_error ivas_shoebox_data_init( + shoebox_data_t *hShoeboxData /* i/o: shoebox_data_t handle */ +) +{ + int16_t i; + + if ( hShoeboxData == NULL ) + { + return IVAS_ERR_WRONG_PARAMS; + } + + for ( i = 0; i < 150; i++ ) + { + hShoeboxData->data[i] = 0.0f; + } + for ( i = 0; i < 1; i++ ) + { + hShoeboxData->size[i] = 0; + } + + return IVAS_ERR_OK; +} + + +/*------------------------------------------------------------------------- + * ivas_shoebox_output_init() + * + * Initialize shoebox_output_t handle + *------------------------------------------------------------------------*/ + +static ivas_error ivas_shoebox_output_init( + shoebox_output_t *hShoeboxOutput /* i/o: shoebox_output_t handle */ +) +{ + ivas_error error; + + if ( hShoeboxOutput == NULL ) + { + return IVAS_ERR_WRONG_PARAMS; + } + + hShoeboxOutput->n_sources = 0; + hShoeboxOutput->n_ref = 0; + + if ( ( error = ivas_shoebox_data_init( &hShoeboxOutput->times ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = ivas_shoebox_data_init( &hShoeboxOutput->gains ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = ivas_shoebox_data_init( &hShoeboxOutput->az_angle ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = ivas_shoebox_data_init( &hShoeboxOutput->el_angle ) ) != IVAS_ERR_OK ) + { + return error; + } + + return IVAS_ERR_OK; +} + + +/*------------------------------------------------------------------------- + * ivas_shoebox_config_init() + * + * Initialize shoebox_config_t handle + *------------------------------------------------------------------------*/ + +static ivas_error ivas_shoebox_config_init_params( + shoebox_config_t *hShoeboxConfig /* i/o: shoebox_config_t handle */ +) +{ + int16_t i; + + if ( hShoeboxConfig == NULL ) + { + return IVAS_ERR_WRONG_PARAMS; + } + + hShoeboxConfig->room_L = 0.0f; + hShoeboxConfig->room_W = 0.0f; + hShoeboxConfig->room_H = 0.0f; + + for ( i = 0; i < ER_ABS_COEFF; i++ ) + { + hShoeboxConfig->abs_coeff[i] = 0.0f; + } + for ( i = 0; i < 3; i++ ) + { + hShoeboxConfig->list_orig[i] = 0.0f; + } + + return IVAS_ERR_OK; +} + + +/*------------------------------------------------------------------------- + * ivas_shoebox_obj_init() + * + * Initialize shoebox_obj_t handle + *------------------------------------------------------------------------*/ + +static ivas_error ivas_shoebox_obj_init( + shoebox_obj_t *hShoeboxObj /* i/o: shoebox_obj_t handle */ +) +{ + int16_t i; + ivas_error error; + + if ( hShoeboxObj == NULL ) + { + return IVAS_ERR_WRONG_PARAMS; + } + + hShoeboxObj->isCartesian = 0; + hShoeboxObj->isRelative = 0; + hShoeboxObj->isZHeight = 0; + hShoeboxObj->isRadians = 0; + hShoeboxObj->MAX_SOURCES = 0; + hShoeboxObj->max_bands = 0; + hShoeboxObj->REF_ORDER = 0; + + for ( i = 0; i < 75; i++ ) + { + hShoeboxObj->src_pos[i] = 0.0f; + } + for ( i = 0; i < 25; i++ ) + { + hShoeboxObj->src_dist[i] = 0.0f; + } + for ( i = 0; i < 3; i++ ) + { + hShoeboxObj->list_pos[i] = 0.0f; + } + + hShoeboxObj->nSrc = 0; + hShoeboxObj->radius = 0.0f; + hShoeboxObj->min_wall_dist = 0.0f; + hShoeboxObj->soundspeed = 0.0f; + hShoeboxObj->air_coeff = 0.0f; + + if ( ( error = ivas_shoebox_config_init_params( &hShoeboxObj->cal ) ) != IVAS_ERR_OK ) + { + return error; + } + + return IVAS_ERR_OK; +} + + +/*------------------------------------------------------------------------- + * ivas_er_init_handle() + * + * Initialize early reflections handle + *------------------------------------------------------------------------*/ + +static ivas_error ivas_er_init_handle( + er_struct_t *reflections /* i/o: early reflections handle */ +) +{ + int16_t i; + ivas_error error; + + if ( reflections == NULL ) + { + return IVAS_ERR_WRONG_PARAMS; + } + + reflections->audio_config = IVAS_AUDIO_CONFIG_INVALID; + reflections->use_er = 0; + reflections->is_ready = 0; + reflections->circ_len = 0; + reflections->circ_insert = 0; + reflections->n_total_reflections = 0; + reflections->is_cartesian = 0; + reflections->is_relative = 0; + reflections->max_frame_size = 0; + reflections->output_Fs = 0.0f; + + for ( i = 0; i < 75; i++ ) + { + reflections->source_positions[i] = 0.0f; + } + for ( i = 0; i < 3; i++ ) + { + reflections->user_origin[i] = 0.0f; + if ( i == 2 ) + { + reflections->user_origin[i] = ER_LIST_HEIGHT; + } + } + + reflections->circ_buffers = NULL; + reflections->closest_ch_idx = NULL; + + if ( ( error = ivas_shoebox_output_init( &reflections->shoebox_data ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = ivas_shoebox_obj_init( &reflections->shoebox_lib ) ) != IVAS_ERR_OK ) + { + return error; + } + + return IVAS_ERR_OK; +} + + +/*------------------------------------------------------------------------- + * ivas_rend_initCrendWrapper() + * + * Allocate and initialize crend renderer handle + *------------------------------------------------------------------------*/ + +ivas_error ivas_rend_initCrendWrapper( + CREND_WRAPPER_HANDLE *pCrend +) +{ + int16_t i; + CREND_HANDLE hCrend; + + if ( pCrend == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for renderer handle" ); + } + + if ( ( *pCrend = (CREND_WRAPPER_HANDLE) malloc( sizeof( CREND_WRAPPER ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend Wrapper\n" ); + } + + ( *pCrend )->binaural_latency_ns = 0; + ( *pCrend )->hHrtfCrend = NULL; + + { + hCrend = NULL; + if ( ( hCrend = (CREND_HANDLE) malloc( sizeof( CREND_DATA ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for renderer handle" ); + } + + hCrend->lfe_delay_line = NULL; + + for ( i = 0; i < MAX_INTERN_CHANNELS; i++ ) + { + hCrend->freq_buffer_re[i] = NULL; + hCrend->freq_buffer_im[i] = NULL; + } + + for ( i = 0; i < BINAURAL_CHANNELS; i++ ) + { + hCrend->prev_out_buffer[i] = NULL; + } + + hCrend->freq_buffer_re_diffuse = NULL; + hCrend->freq_buffer_im_diffuse = NULL; + hCrend->hReverb = NULL; + hCrend->reflections = NULL; + hCrend->delay_line_rw_index = 0; + hCrend->diffuse_delay_line_rw_index = 0; + hCrend->hTrack = NULL; + hCrend->m_fYaw = 0; + hCrend->m_fPitch = 0; + hCrend->m_fRoll = 0; + + ( *pCrend )->hCrend = hCrend; + } + + return IVAS_ERR_OK; +} + + + + +/*------------------------------------------------------------------------- + * ivas_rend_openCrend() + * + * Allocate and initialize crend renderer handle + *------------------------------------------------------------------------*/ + +ivas_error ivas_rend_openCrend( + CREND_WRAPPER_HANDLE *pCrend, + const AUDIO_CONFIG inConfig, + const AUDIO_CONFIG outConfig, + RENDER_CONFIG_DATA *hRendCfg, + HRTFS_CREND_HANDLE hSetOfHRTF, + const int32_t output_Fs +) +{ + int16_t i, subframe_length; + int16_t max_total_ir_len; + HRTFS_HANDLE hHrtf; + CREND_HANDLE hCrend; + ivas_error error; + + error = IVAS_ERR_OK; + + if ( ( error = ivas_rend_initCrendWrapper( pCrend ) ) != IVAS_ERR_OK ) + { + return error; + } + + subframe_length = (int16_t) ( output_Fs / FRAMES_PER_SEC ) / MAX_PARAM_SPATIAL_SUBFRAMES; + + if ( ( *pCrend )->hHrtfCrend == NULL ) + { + if ( ( error = ivas_rend_initCrend( *pCrend, inConfig, outConfig, hSetOfHRTF, output_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + { + hCrend = ( *pCrend )->hCrend; + hHrtf = ( *pCrend )->hHrtfCrend; + + if ( hHrtf != NULL ) + { + max_total_ir_len = hHrtf->max_num_iterations * subframe_length; + + for ( i = 0; i < hHrtf->max_num_ir; i++ ) + { + if ( ( hCrend->freq_buffer_re[i] = (float *) malloc( sizeof( float ) * max_total_ir_len ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); + } + set_zero( hCrend->freq_buffer_re[i], max_total_ir_len ); + + if ( ( hCrend->freq_buffer_im[i] = (float *) malloc( sizeof( float ) * max_total_ir_len ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); + } + set_zero( hCrend->freq_buffer_im[i], max_total_ir_len ); + } + + for ( i = 0; i < BINAURAL_CHANNELS; i++ ) + { + if ( ( hCrend->prev_out_buffer[i] = (float *) malloc( sizeof( float ) * subframe_length ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); + } + set_zero( hCrend->prev_out_buffer[i], subframe_length ); + } + + max_total_ir_len = hHrtf->num_iterations_diffuse[0] * subframe_length; + + if ( max_total_ir_len > 0 ) + { + if ( ( hCrend->freq_buffer_re_diffuse = (float *) malloc( sizeof( float ) * max_total_ir_len ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); + } + set_zero( hCrend->freq_buffer_re_diffuse, max_total_ir_len ); + + if ( ( hCrend->freq_buffer_im_diffuse = (float *) malloc( sizeof( float ) * max_total_ir_len ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); + } + set_zero( hCrend->freq_buffer_im_diffuse, max_total_ir_len ); + } + else + { + hCrend->freq_buffer_re_diffuse = NULL; + hCrend->freq_buffer_im_diffuse = NULL; + } + + max_total_ir_len = (int16_t) ( hHrtf->latency_s * output_Fs + 0.5f ) + subframe_length; + if ( max_total_ir_len > 0 ) + { + if ( ( hCrend->lfe_delay_line = (float *) malloc( sizeof( float ) * max_total_ir_len ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); + } + set_zero( hCrend->lfe_delay_line, max_total_ir_len ); + } + else + { + hCrend->lfe_delay_line = NULL; + } + + if ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) + { + if ( ( error = ivas_reverb_open( &( hCrend->hReverb ), inConfig, ( *pCrend )->hHrtfCrend, NULL, hRendCfg, output_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( hRendCfg->roomAcoustics.use_er == 1 ) + { + + /* Allocate memory for reflections */ + hCrend->reflections = (er_struct_t *) malloc( sizeof( er_struct_t ) ); + if ( !hCrend->reflections ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Early Reflections" ); + } + if ( ( error = ivas_er_init_handle( hCrend->reflections ) ) != IVAS_ERR_OK ) + { + return error; + } + + hCrend->reflections->use_er = hRendCfg->roomAcoustics.use_er; + hCrend->reflections->lowComplexity = hRendCfg->roomAcoustics.lowComplexity; + + /* Set sample rate and frame size */ + hCrend->reflections->output_Fs = (float) output_Fs; + hCrend->reflections->max_frame_size = (int16_t) ( output_Fs / FRAMES_PER_SEC ); + + /* Init Shoebox */ + ivas_shoebox_config_init( &hCrend->reflections->shoebox_lib.cal, hRendCfg ); + + /* Init and compute Reflections */ + if ( ( error = ivas_er_init( hCrend->reflections, inConfig ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + hCrend->reflections = NULL; + } + } + else + { + hCrend->hReverb = NULL; + } + + ( *pCrend )->binaural_latency_ns = (int32_t) ( ( *pCrend )->hHrtfCrend->latency_s * 1000000000.f ); + } + + ( *pCrend )->hCrend = hCrend; + } + + return IVAS_ERR_OK; +} + + +/*------------------------------------------------------------------------- + * ivas_rend_closeCrend() + * + * Deallocate Crend renderer handle + *------------------------------------------------------------------------*/ + +void ivas_rend_closeCrend( + CREND_WRAPPER_HANDLE *pCrend +) +{ + int16_t i; + CREND_HANDLE hCrend; + + if ( pCrend == NULL || *pCrend == NULL ) + { + return; + } + + if ( ( *pCrend )->hHrtfCrend != NULL ) + { + ivas_hrtf_close( &( *pCrend )->hHrtfCrend ); + } + + { + hCrend = ( *pCrend )->hCrend; + if ( hCrend != NULL ) + { + for ( i = 0; i < MAX_INTERN_CHANNELS; i++ ) + { + if ( hCrend->freq_buffer_re[i] != NULL ) + { + free( hCrend->freq_buffer_re[i] ); + hCrend->freq_buffer_re[i] = NULL; + } + if ( hCrend->freq_buffer_im[i] != NULL ) + { + free( hCrend->freq_buffer_im[i] ); + hCrend->freq_buffer_im[i] = NULL; + } + } + + for ( i = 0; i < BINAURAL_CHANNELS; i++ ) + { + if ( hCrend->prev_out_buffer[i] != NULL ) + { + free( hCrend->prev_out_buffer[i] ); + hCrend->prev_out_buffer[i] = NULL; + } + } + + if ( hCrend->lfe_delay_line != NULL ) + { + free( hCrend->lfe_delay_line ); + hCrend->lfe_delay_line = NULL; + } + + if ( hCrend->freq_buffer_re_diffuse != NULL ) + { + free( hCrend->freq_buffer_re_diffuse ); + hCrend->freq_buffer_re_diffuse = NULL; + } + + if ( hCrend->freq_buffer_im_diffuse != NULL ) + { + free( hCrend->freq_buffer_im_diffuse ); + hCrend->freq_buffer_im_diffuse = NULL; + } + + if ( hCrend->hTrack != NULL ) + { + free( hCrend->hTrack ); + hCrend->hTrack = NULL; + } + + ivas_reverb_close( &hCrend->hReverb ); + + if ( hCrend->reflections != NULL ) + { + if ( hCrend->reflections->closest_ch_idx != NULL ) + { + free( hCrend->reflections->closest_ch_idx ); + hCrend->reflections->closest_ch_idx = NULL; + } + + if ( hCrend->reflections->circ_buffers != NULL ) + { + free( hCrend->reflections->circ_buffers ); + hCrend->reflections->circ_buffers = NULL; + } + + free( hCrend->reflections ); + hCrend->reflections = NULL; + } + + free( hCrend ); + hCrend = NULL; + ( *pCrend )->hCrend = hCrend; + } + } + + free( *pCrend ); + *pCrend = NULL; + + return; +} + + + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_rend_crendConvolver() + * + * Convolver block + *-----------------------------------------------------------------------------------------*/ + +static ivas_error ivas_rend_crendConvolver( + const CREND_WRAPPER *pCrend, + AUDIO_CONFIG inConfig, + AUDIO_CONFIG outConfig, + float *pcm_in[], + float *pcm_out[], + const int32_t output_Fs, + const int16_t i_ts +) +{ + int16_t i, j, k, m; + int16_t subframe_length, idx_in; + int16_t lfe_idx_in; + int16_t offset, offset_in, offset_diffuse; + int16_t nchan_in, nchan_out; + const float *pIn; + float *pFreq_buf_re, *pFreq_buf_im; + const float *pFreq_filt_re, *pFreq_filt_im; + float pOut[L_FRAME48k * 2]; + float tmp_out_re[L_FRAME48k], tmp_out_im[L_FRAME48k]; + CREND_HANDLE hCrend; + ivas_error error; + + hCrend = pCrend->hCrend; + + if ( ( error = getAudioConfigNumChannels( inConfig, &nchan_in ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = getAudioConfigNumChannels( outConfig, &nchan_out ) ) != IVAS_ERR_OK ) + { + return error; + } + + subframe_length = (int16_t) ( output_Fs / FRAMES_PER_SEC ) / MAX_PARAM_SPATIAL_SUBFRAMES; + + lfe_idx_in = -1; + if ( getAudioConfigType( inConfig ) == IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) + { + if ( inConfig != IVAS_AUDIO_CONFIG_LS_CUSTOM ) + { + lfe_idx_in = LFE_CHANNEL; + } + else + { + assert( 0 && "Custom LS not supported in CRend" ); + } + } + + offset = hCrend->delay_line_rw_index * subframe_length; /* subframe_length * ( pCrend->hHrtfCrend->max_num_iterations - 1 ); */ + offset_diffuse = hCrend->diffuse_delay_line_rw_index * subframe_length; /* subframe_length *( pCrend->hHrtfCrend->num_iterations_diffuse[0] - 1 ); */ + + if ( pCrend->hHrtfCrend->num_iterations_diffuse[0] > 0 ) + { + set_zero( &hCrend->freq_buffer_re_diffuse[offset_diffuse], subframe_length ); + set_zero( &hCrend->freq_buffer_im_diffuse[offset_diffuse], subframe_length ); + } + + i = 0; + for ( idx_in = 0; idx_in < nchan_in; idx_in++ ) + { + pIn = &pcm_in[idx_in][i_ts * subframe_length]; + if ( idx_in != lfe_idx_in ) + { + if ( pCrend->hHrtfCrend->num_iterations_diffuse[0] > 0 ) + { + pFreq_buf_re = &hCrend->freq_buffer_re_diffuse[offset_diffuse]; + pFreq_buf_im = &hCrend->freq_buffer_im_diffuse[offset_diffuse]; + pFreq_filt_re = &hCrend->freq_buffer_re[i][offset]; + pFreq_filt_im = &hCrend->freq_buffer_im[i][offset]; + + for ( k = 0; k < pCrend->hHrtfCrend->index_frequency_max_diffuse; k++ ) + { + pFreq_buf_re[k] += pFreq_filt_re[k] * pCrend->hHrtfCrend->inv_diffuse_weight[i]; + pFreq_buf_im[k] += pFreq_filt_im[k] * pCrend->hHrtfCrend->inv_diffuse_weight[i]; + } + } + + pFreq_buf_re = &hCrend->freq_buffer_re[i][offset]; + pFreq_buf_im = &hCrend->freq_buffer_im[i][offset]; + + ivas_mdft( pIn, pFreq_buf_re, pFreq_buf_im, subframe_length, subframe_length ); + i++; + } + } + + for ( j = 0; j < nchan_out; j++ ) + { + set_zero( tmp_out_re, subframe_length ); + set_zero( tmp_out_im, subframe_length ); + + i = 0; + for ( idx_in = 0; idx_in < nchan_in; idx_in++ ) + { + if ( idx_in != lfe_idx_in ) + { + offset = 0; + for ( m = 0; m < pCrend->hHrtfCrend->num_iterations[i][j]; m++ ) + { + offset_in = ( hCrend->delay_line_rw_index + pCrend->hHrtfCrend->max_num_iterations - pCrend->hHrtfCrend->num_iterations[i][j] + m + 1 ); + offset_in = offset_in % ( pCrend->hHrtfCrend->max_num_iterations ); + offset_in = offset_in * subframe_length; + pFreq_buf_re = &hCrend->freq_buffer_re[i][offset_in]; + pFreq_buf_im = &hCrend->freq_buffer_im[i][offset_in]; + pFreq_filt_re = &pCrend->hHrtfCrend->pOut_to_bin_re[i][j][offset]; + pFreq_filt_im = &pCrend->hHrtfCrend->pOut_to_bin_im[i][j][offset]; + + for ( k = 0; k < pCrend->hHrtfCrend->pIndex_frequency_max[i][j][m]; k++ ) + { + tmp_out_re[k] += pFreq_buf_re[k] * pFreq_filt_re[k] - pFreq_buf_im[k] * pFreq_filt_im[k]; + tmp_out_im[k] += pFreq_buf_re[k] * pFreq_filt_im[k] + pFreq_buf_im[k] * pFreq_filt_re[k]; + } + offset = offset + k; + } + i++; + } + } + + offset = 0; + for ( m = 0; m < pCrend->hHrtfCrend->num_iterations_diffuse[j]; m++ ) + { + offset_diffuse = ( hCrend->diffuse_delay_line_rw_index + m + 1 ); + offset_diffuse = offset_diffuse % pCrend->hHrtfCrend->num_iterations_diffuse[0]; + offset_diffuse = offset_diffuse * subframe_length; + pFreq_buf_re = &hCrend->freq_buffer_re_diffuse[offset_diffuse]; + pFreq_buf_im = &hCrend->freq_buffer_im_diffuse[offset_diffuse]; + pFreq_filt_re = &pCrend->hHrtfCrend->pOut_to_bin_diffuse_re[j][offset]; + pFreq_filt_im = &pCrend->hHrtfCrend->pOut_to_bin_diffuse_im[j][offset]; + + for ( k = 0; k < pCrend->hHrtfCrend->pIndex_frequency_max_diffuse[j][m]; k++ ) + { + tmp_out_re[k] += pFreq_buf_re[k] * pFreq_filt_re[k] - pFreq_buf_im[k] * pFreq_filt_im[k]; + tmp_out_im[k] += pFreq_buf_re[k] * pFreq_filt_im[k] + pFreq_buf_im[k] * pFreq_filt_re[k]; + } + offset = offset + k; + } + + ivas_imdft( tmp_out_re, tmp_out_im, pOut, subframe_length ); + + pFreq_buf_re = &pcm_out[j][i_ts * subframe_length]; + for ( k = 0; k < subframe_length; k++ ) + { + pFreq_buf_re[k] = pOut[k] + hCrend->prev_out_buffer[j][k]; + hCrend->prev_out_buffer[j][k] = pOut[k + subframe_length]; + } + } + + hCrend->delay_line_rw_index++; + hCrend->delay_line_rw_index = hCrend->delay_line_rw_index % ( pCrend->hHrtfCrend->max_num_iterations ); + if ( pCrend->hHrtfCrend->num_iterations_diffuse[0] > 0 ) + { + hCrend->diffuse_delay_line_rw_index++; + hCrend->diffuse_delay_line_rw_index = hCrend->diffuse_delay_line_rw_index % ( pCrend->hHrtfCrend->num_iterations_diffuse[0] ); + } + + return IVAS_ERR_OK; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_rend_crend_Process() + * + * Process call for IVAS Crend renderer + *-----------------------------------------------------------------------------------------*/ + +ivas_error ivas_rend_crendProcess( + const CREND_WRAPPER *pCrend, + const AUDIO_CONFIG inConfig, + const AUDIO_CONFIG outConfig, + DECODER_CONFIG_HANDLE hDecoderConfig, + COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, + IVAS_OUTPUT_SETUP_HANDLE hIntSetup, + EFAP_HANDLE hEFAPdata, + float *output[], /* i/o: input/output audio channels */ + const int32_t output_Fs, + const int16_t num_subframes /* i : number of subframes to render */ +) +{ + int16_t i, subframe_idx, subframe_len; + int16_t nchan_out; + float pcm_tmp[BINAURAL_CHANNELS][L_FRAME48k]; + float *p_pcm_tmp[BINAURAL_CHANNELS]; + IVAS_REND_AudioConfigType inConfigType; + int8_t combinedOrientationEnabled; + ivas_error error; + CREND_HANDLE hCrend; + + hCrend = pCrend->hCrend; + + combinedOrientationEnabled = 0; + if ( hCombinedOrientationData != NULL ) + { + for ( subframe_idx = 0; subframe_idx < num_subframes; subframe_idx++ ) + { + if ( hCombinedOrientationData->enableCombinedOrientation[subframe_idx] != 0 ) + { + combinedOrientationEnabled = 1; + break; + } + } + } + + push_wmops( "ivas_rend_crendProcess" ); + inConfigType = getAudioConfigType( inConfig ); + + if ( ( error = getAudioConfigNumChannels( outConfig, &nchan_out ) ) != IVAS_ERR_OK ) + { + return error; + } + + subframe_len = (int16_t) ( output_Fs / ( FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES ) ); + + for ( i = 0; i < BINAURAL_CHANNELS; i++ ) + { + p_pcm_tmp[i] = pcm_tmp[i]; + } + + for ( subframe_idx = 0; subframe_idx < num_subframes; subframe_idx++ ) + { + /* Early Reflections */ + if ( hCrend->reflections != NULL ) + { + if ( hCrend->reflections->use_er == 1 && hCrend->reflections->is_ready == 1 ) + { + if ( ( error = ivas_er_process( hCrend->reflections, subframe_len, subframe_idx, output, inConfig ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + + if ( hDecoderConfig && combinedOrientationEnabled ) + { + /* Orientation tracking */ + + /* Rotation in SHD for: + MC with elevation (5_1_2 / 5_1_4 / 7_1_4) -> BINAURAL + SBA SPAR -> BINAURAL or BINAURAL_ROOM + */ + if ( inConfig == IVAS_AUDIO_CONFIG_FOA || inConfig == IVAS_AUDIO_CONFIG_HOA2 || inConfig == IVAS_AUDIO_CONFIG_HOA3 ) + { + rotateFrame_shd( hCombinedOrientationData, output, subframe_len, *hIntSetup, subframe_idx ); + } + /* Rotation in SD for MC -> BINAURAL_ROOM */ + else if ( ( hIntSetup != NULL ) && hIntSetup->is_loudspeaker_setup ) + { + rotateFrame_sd( hCombinedOrientationData, output, subframe_len, *hIntSetup, hEFAPdata, subframe_idx ); + } + } + + if ( inConfigType == IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED || inConfigType == IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS ) + { + if ( ( error = ivas_rend_crendConvolver( pCrend, inConfig, outConfig, output, p_pcm_tmp, output_Fs, subframe_idx ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( hCrend->hReverb != NULL ) + { + if ( ( error = ivas_reverb_process( pCrend->hCrend->hReverb, inConfig, 1, output, p_pcm_tmp, subframe_idx ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + else + { + return IVAS_ERR_INVALID_INPUT_FORMAT; + } + } + + /* move to output */ + for ( i = 0; i < nchan_out; i++ ) + { + mvr2r( pcm_tmp[i], output[i], num_subframes * subframe_len ); + } + + pop_wmops(); + return IVAS_ERR_OK; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_rend_crendProcessSubframe() + * + * + *-----------------------------------------------------------------------------------------*/ + +ivas_error ivas_rend_crendProcessSubframe( + const CREND_WRAPPER *pCrend, /* i/o: Crend wrapper handle */ + const AUDIO_CONFIG inConfig, /* i : input audio configuration */ + const AUDIO_CONFIG outConfig, /* i : output audio configuration */ + const DECODER_CONFIG_HANDLE hDecoderConfig, /* i : decoder config. structure */ + const COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i : combined orientation handle */ + const IVAS_OUTPUT_SETUP_HANDLE hIntSetup, /* i : internal setup handle */ + const EFAP_HANDLE hEFAPdata, /* i : EFAP handle */ + DECODER_TC_BUFFER_HANDLE hTcBuffer, /* i/o: JBM handle */ + float *input_f[], /* i : transport channels */ + float *output[], /* i/o: input/output audio channels */ + const int16_t n_samples_to_render, /* i : output frame length per channel */ + const int32_t output_Fs /* i : output sampling rate */ +) +{ + int16_t subframe_idx, subframe_len; + int16_t nchan_out, nchan_in, ch, first_sf, last_sf, slot_size, slots_to_render; + float *tc_local[MAX_OUTPUT_CHANNELS]; + float pcm_tmp[BINAURAL_CHANNELS][L_FRAME48k]; + float *p_pcm_tmp[BINAURAL_CHANNELS]; + IVAS_REND_AudioConfigType inConfigType; + ivas_error error; + int8_t combinedOrientationEnabled; + CREND_HANDLE hCrend; + + hCrend = pCrend->hCrend; + + combinedOrientationEnabled = 0; + if ( hCombinedOrientationData != NULL ) + { + if ( hCombinedOrientationData->enableCombinedOrientation[0] != 0 ) + { + combinedOrientationEnabled = 1; + } + } + + push_wmops( "ivas_rend_crendProcessSubframe" ); + inConfigType = getAudioConfigType( inConfig ); + + if ( ( error = getAudioConfigNumChannels( outConfig, &nchan_out ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = getAudioConfigNumChannels( inConfig, &nchan_in ) ) != IVAS_ERR_OK ) + { + return error; + } + + for ( ch = 0; ch < nchan_in; ch++ ) + { + tc_local[ch] = input_f[ch]; + } + + for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + p_pcm_tmp[ch] = pcm_tmp[ch]; + } + + slot_size = hTcBuffer->n_samples_granularity; + + /* loop for synthesis, assume we always have to render in multiples of 5ms subframes with spills */ + slots_to_render = min( hTcBuffer->num_slots - hTcBuffer->slots_rendered, n_samples_to_render / slot_size ); + first_sf = hTcBuffer->subframes_rendered; + last_sf = first_sf; + + while ( slots_to_render > 0 ) + { + slots_to_render -= hTcBuffer->subframe_nbslots[last_sf]; + last_sf++; + } + + for ( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ ) + { + subframe_len = hTcBuffer->subframe_nbslots[subframe_idx] * hTcBuffer->n_samples_granularity; + + /* Early Reflections */ + if ( hCrend->reflections != NULL ) + { + if ( hCrend->reflections->use_er == 1 && hCrend->reflections->is_ready == 1 ) + { + if ( ( error = ivas_er_process( hCrend->reflections, subframe_len, 0, tc_local, inConfig ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + + if ( hDecoderConfig && combinedOrientationEnabled ) + { + /* Rotation in SHD for: + MC with elevation (5_1_2 / 5_1_4 / 7_1_4) -> BINAURAL + SBA SPAR -> BINAURAL or BINAURAL_ROOM + */ + if ( inConfig == IVAS_AUDIO_CONFIG_FOA || inConfig == IVAS_AUDIO_CONFIG_HOA2 || inConfig == IVAS_AUDIO_CONFIG_HOA3 ) + { + rotateFrame_shd( hCombinedOrientationData, tc_local, subframe_len, *hIntSetup, 0 ); + } + /* Rotation in SD for MC -> BINAURAL_ROOM */ + else if ( ( hIntSetup != NULL ) && hIntSetup->is_loudspeaker_setup ) + { + rotateFrame_sd( hCombinedOrientationData, tc_local, subframe_len, *hIntSetup, hEFAPdata, 0 ); + } + } + + if ( ( inConfigType == IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) || ( inConfigType == IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS ) ) + { + if ( ( error = ivas_rend_crendConvolver( pCrend, inConfig, outConfig, tc_local, p_pcm_tmp, output_Fs, 0 ) ) != IVAS_ERR_OK ) + + { + return error; + } + + if ( pCrend->hCrend->hReverb != NULL ) + { + if ( ( error = ivas_reverb_process( pCrend->hCrend->hReverb, inConfig, 1, tc_local, p_pcm_tmp, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + for ( ch = 0; ch < nchan_in; ch++ ) + { + tc_local[ch] += subframe_len; + } + for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + p_pcm_tmp[ch] += subframe_len; + } + hTcBuffer->slots_rendered += hTcBuffer->subframe_nbslots[subframe_idx]; + } + else + { + return IVAS_ERR_INVALID_INPUT_FORMAT; + } + } + + /* move to output */ + for ( ch = 0; ch < nchan_out; ch++ ) + { + mvr2r( pcm_tmp[ch], output[ch], n_samples_to_render ); + } + + hTcBuffer->subframes_rendered = last_sf; + pop_wmops(); + + return IVAS_ERR_OK; +} + + diff --git a/lib_rend/ivas_dirac_ana.c b/lib_rend/ivas_dirac_ana.c new file mode 100644 index 0000000000000000000000000000000000000000..f848b59ce34da419e38673a41a75beba8d99dadd --- /dev/null +++ b/lib_rend/ivas_dirac_ana.c @@ -0,0 +1,411 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include "options.h" +#include +#include "ivas_cnst.h" +#include "ivas_prot_rend.h" +#include "ivas_prot.h" +#include "prot.h" +#include "ivas_stat_rend.h" +#include "ivas_rom_com.h" +#include "wmc_auto.h" + + +/*------------------------------------------------------------------------- + * Local function prototypes + *------------------------------------------------------------------------*/ + +static void ivas_dirac_param_est_ana( DIRAC_ANA_HANDLE hDirAC, float data_f[][L_FRAME48k], float elevation_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], float azimuth_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], float energyRatio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], float spreadCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], float surroundingCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], const int16_t input_frame ); + +static void ivas_dirac_dmx( float data_in_f[][L_FRAME48k], const int16_t input_frame, const int16_t nchan_transport ); + + +/*--------------------------------------------------------------------------* + * ivas_dirac_ana_open() + * + * Allocate and initialize DIRAC handle + *--------------------------------------------------------------------------*/ + +ivas_error ivas_dirac_ana_open( + DIRAC_ANA_HANDLE *hDirACPtr, /* i/o: DIRAC data handle pointer */ + int32_t input_Fs /* i : Sampling frequency */ +) +{ + int16_t i, j; + DIRAC_ANA_HANDLE hDirAC; + int16_t numAnalysisChannels; + int16_t maxBin; + ivas_error error; + + error = IVAS_ERR_OK; + + if ( ( hDirAC = (DIRAC_ANA_HANDLE) malloc( sizeof( DIRAC_ANA_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DIRAC\n" ) ); + } + + numAnalysisChannels = FOA_CHANNELS; + + /* Determine the number of bands */ + hDirAC->nbands = MASA_FREQUENCY_BANDS; + + /* Determine band grouping */ + mvs2s( MASA_band_grouping_24, hDirAC->band_grouping, 24 + 1 ); + + maxBin = (int16_t) ( input_Fs * INV_CLDFB_BANDWIDTH + 0.5f ); + for ( i = 1; i < hDirAC->nbands + 1; i++ ) + { + if ( hDirAC->band_grouping[i] >= maxBin ) + { + hDirAC->band_grouping[i] = maxBin; + hDirAC->nbands = i; + break; + } + } + + /* Determine block grouping */ + mvs2s( DirAC_block_grouping, hDirAC->block_grouping, MAX_PARAM_SPATIAL_SUBFRAMES + 1 ); + + /* open/initialize CLDFB */ + hDirAC->num_Cldfb_instances = numAnalysisChannels; + for ( i = 0; i < hDirAC->num_Cldfb_instances; i++ ) + { + if ( ( error = openCldfb( &( hDirAC->cldfbAnaEnc[i] ), CLDFB_ANALYSIS, input_Fs, CLDFB_PROTOTYPE_5_00MS ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* intensity 3-dim */ + for ( i = 0; i < DIRAC_NUM_DIMS; i++ ) + { + if ( ( hDirAC->direction_vector_m[i] = (float **) malloc( MAX_PARAM_SPATIAL_SUBFRAMES * sizeof( float * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA decoder\n" ) ); + } + + for ( j = 0; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++ ) + { + if ( ( hDirAC->direction_vector_m[i][j] = (float *) malloc( MASA_FREQUENCY_BANDS * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA decoder\n" ) ); + } + set_zero( hDirAC->direction_vector_m[i][j], MASA_FREQUENCY_BANDS ); + } + } + + for ( i = 0; i < DIRAC_NUM_DIMS; i++ ) + { + for ( j = 0; j < DIRAC_NO_COL_AVG_DIFF; j++ ) + { + if ( ( hDirAC->buffer_intensity_real[i][j] = (float *) malloc( MASA_FREQUENCY_BANDS * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA decoder\n" ) ); + } + set_zero( hDirAC->buffer_intensity_real[i][j], MASA_FREQUENCY_BANDS ); + } + } + + set_zero( hDirAC->buffer_energy, DIRAC_NO_COL_AVG_DIFF * MASA_FREQUENCY_BANDS ); + + hDirAC->index_buffer_intensity = 0; + + if ( ( hDirAC->hMasaOut = (MASA_DECODER_EXT_OUT_META_HANDLE) malloc( sizeof( MASA_DECODER_EXT_OUT_META ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA decoder\n" ) ); + } + + if ( ( hDirAC->sph_grid16 = (SPHERICAL_GRID_DATA *) malloc( sizeof( SPHERICAL_GRID_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA decoder\n" ) ); + } + generate_gridEq( hDirAC->sph_grid16 ); + + ( *hDirACPtr ) = hDirAC; + + return error; +} + + +/*--------------------------------------------------------------------------* + * ivas_dirac_ana_close() + * + * Close DIRAC handle + *--------------------------------------------------------------------------*/ + +void ivas_dirac_ana_close( + DIRAC_ANA_HANDLE( *hDirAC ) /* i/o: analysis DIRAC handle */ +) +{ + int16_t i, j; + + if ( hDirAC == NULL || *hDirAC == NULL ) + { + return; + } + + for ( i = 0; i < ( *hDirAC )->num_Cldfb_instances; i++ ) + { + deleteCldfb( &( ( *hDirAC )->cldfbAnaEnc[i] ) ); + } + + for ( i = 0; i < DIRAC_NUM_DIMS; i++ ) + { + for ( j = 0; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++ ) + { + free( ( *hDirAC )->direction_vector_m[i][j] ); + ( *hDirAC )->direction_vector_m[i][j] = NULL; + } + + for ( j = 0; j < DIRAC_NO_COL_AVG_DIFF; j++ ) + { + free( ( *hDirAC )->buffer_intensity_real[i][j] ); + ( *hDirAC )->buffer_intensity_real[i][j] = NULL; + } + + free( ( *hDirAC )->direction_vector_m[i] ); + ( *hDirAC )->direction_vector_m[i] = NULL; + } + + free( ( *hDirAC )->hMasaOut ); + ( *hDirAC )->hMasaOut = NULL; + free( ( *hDirAC )->sph_grid16 ); + ( *hDirAC )->sph_grid16 = NULL; + + free( ( *hDirAC ) ); + ( *hDirAC ) = NULL; + + return; +} + + +/*--------------------------------------------------------------------------* + * ivas_dirac_ana() + * + * DIRAC analysis function + *--------------------------------------------------------------------------*/ + +void ivas_dirac_ana( + DIRAC_ANA_HANDLE hDirAC, /* i/o: DIRAC analysis handle */ + float data_in_f[][L_FRAME48k], /* i/o: Input / transport audio signals */ + const int16_t input_frame, /* i : Input frame size */ + const int16_t nchan_transport /* i : Number of transport channels */ +) +{ + float elevation_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + float azimuth_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + float energyRatio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + float spreadCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + float surroundingCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + + + /* Estimate MASA parameters from the SBA signals */ + ivas_dirac_param_est_ana( hDirAC, data_in_f, elevation_m_values, azimuth_m_values, energyRatio, spreadCoherence, surroundingCoherence, input_frame ); + + /* Create MASA metadata buffer from the estimated values */ + ivas_create_masa_out_meta( hDirAC->hMasaOut, hDirAC->sph_grid16, nchan_transport, elevation_m_values, azimuth_m_values, energyRatio, spreadCoherence, surroundingCoherence ); + + /* Downmix */ + ivas_dirac_dmx( data_in_f, input_frame, nchan_transport ); + + return; +} + + +/*--------------------------------------------------------------------------* + * Local functions + *--------------------------------------------------------------------------*/ + +/* Estimate MASA parameters from the SBA signals */ +static void ivas_dirac_param_est_ana( + DIRAC_ANA_HANDLE hDirAC, + float data_f[][L_FRAME48k], + float elevation_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], + float azimuth_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], + float energyRatio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], + float spreadCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], + float surroundingCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], + const int16_t input_frame ) +{ + float reference_power[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + int16_t ts, i, d, j; + int16_t num_freq_bands, index; + float dir_v[DIRAC_NUM_DIMS]; + int16_t l_ts; + float Foa_RealBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX]; + float Foa_ImagBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX]; + float intensity_real[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS]; + float direction_vector[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS]; + float diffuseness_vector[MASA_FREQUENCY_BANDS]; + float diffuseness_m[MASA_FREQUENCY_BANDS]; + + int16_t band_m_idx, block_m_idx; + float renormalization_factor_diff[MASA_FREQUENCY_BANDS]; + float norm_tmp; + int16_t mrange[2]; + int16_t brange[2]; + int16_t numAnalysisChannels; + + num_freq_bands = hDirAC->nbands; + l_ts = input_frame / CLDFB_NO_COL_MAX; + numAnalysisChannels = FOA_CHANNELS; + + + /* do processing over all CLDFB time slots */ + for ( block_m_idx = 0; block_m_idx < MAX_PARAM_SPATIAL_SUBFRAMES; block_m_idx++ ) + { + mrange[0] = hDirAC->block_grouping[block_m_idx]; + mrange[1] = hDirAC->block_grouping[block_m_idx + 1]; + + for ( band_m_idx = 0; band_m_idx < hDirAC->nbands; band_m_idx++ ) + { + hDirAC->direction_vector_m[0][block_m_idx][band_m_idx] = 0.0f; + hDirAC->direction_vector_m[1][block_m_idx][band_m_idx] = 0.0f; + hDirAC->direction_vector_m[2][block_m_idx][band_m_idx] = 0.0f; + } + + /* Need to initialize renormalization_factors, and variables to be normalized */ + set_zero( renormalization_factor_diff, hDirAC->nbands ); + set_zero( diffuseness_m, hDirAC->nbands ); + set_zero( hDirAC->energy[block_m_idx], MASA_FREQUENCY_BANDS ); + + for ( ts = mrange[0]; ts < mrange[1]; ts++ ) + { + for ( i = 0; i < numAnalysisChannels; i++ ) + { + cldfbAnalysis_ts( &( data_f[i][l_ts * ts] ), Foa_RealBuffer[i], Foa_ImagBuffer[i], l_ts, hDirAC->cldfbAnaEnc[i] ); + } + + /* Compute omni energy for metadata processing */ + for ( band_m_idx = 0; band_m_idx < num_freq_bands; band_m_idx++ ) + { + brange[0] = hDirAC->band_grouping[band_m_idx]; + brange[1] = hDirAC->band_grouping[band_m_idx + 1]; + for ( j = brange[0]; j < brange[1]; j++ ) + { + hDirAC->energy[block_m_idx][band_m_idx] += Foa_RealBuffer[0][j] * Foa_RealBuffer[0][j] + Foa_ImagBuffer[0][j] * Foa_ImagBuffer[0][j]; + } + } + + /* Direction estimation */ + computeIntensityVector_ana( hDirAC->band_grouping, Foa_RealBuffer, Foa_ImagBuffer, num_freq_bands, intensity_real ); + computeDirectionVectors( intensity_real[0], intensity_real[1], intensity_real[2], 0, num_freq_bands, direction_vector[0], direction_vector[1], direction_vector[2] ); + + /* Power estimation for diffuseness */ + computeReferencePower_ana( hDirAC->band_grouping, Foa_RealBuffer, Foa_ImagBuffer, reference_power[ts], num_freq_bands ); + + /* Fill buffers of length "averaging_length" time slots for intensity and energy */ + hDirAC->index_buffer_intensity = ( hDirAC->index_buffer_intensity % DIRAC_NO_COL_AVG_DIFF ) + 1; /* averaging_length = 32 */ + index = hDirAC->index_buffer_intensity; + for ( i = 0; i < DIRAC_NUM_DIMS; i++ ) + { + /* only real part needed */ + mvr2r( intensity_real[i], &( hDirAC->buffer_intensity_real[i][index - 1][0] ), num_freq_bands ); + } + mvr2r( reference_power[ts], &( hDirAC->buffer_energy[( index - 1 ) * num_freq_bands] ), num_freq_bands ); + + computeDiffuseness( hDirAC->buffer_intensity_real, hDirAC->buffer_energy, num_freq_bands, diffuseness_vector ); + + for ( band_m_idx = 0; band_m_idx < hDirAC->nbands; band_m_idx++ ) + { + norm_tmp = reference_power[ts][band_m_idx] * ( 1 - diffuseness_vector[band_m_idx] ); + + hDirAC->direction_vector_m[0][block_m_idx][band_m_idx] += norm_tmp * direction_vector[0][band_m_idx]; + hDirAC->direction_vector_m[1][block_m_idx][band_m_idx] += norm_tmp * direction_vector[1][band_m_idx]; + hDirAC->direction_vector_m[2][block_m_idx][band_m_idx] += norm_tmp * direction_vector[2][band_m_idx]; + + diffuseness_m[band_m_idx] += reference_power[ts][band_m_idx] * diffuseness_vector[band_m_idx]; + renormalization_factor_diff[band_m_idx] += reference_power[ts][band_m_idx]; + } + } + + for ( band_m_idx = 0; band_m_idx < hDirAC->nbands; band_m_idx++ ) + { + for ( d = 0; d < DIRAC_NUM_DIMS; d++ ) + { + dir_v[d] = hDirAC->direction_vector_m[d][block_m_idx][band_m_idx]; + } + ivas_qmetadata_direction_vector_to_azimuth_elevation( dir_v, &azimuth_m_values[block_m_idx][band_m_idx], &elevation_m_values[block_m_idx][band_m_idx] ); + } + + /* Determine energy ratios */ + for ( band_m_idx = 0; band_m_idx < hDirAC->nbands; band_m_idx++ ) + { + if ( renormalization_factor_diff[band_m_idx] > EPSILON ) + { + diffuseness_m[band_m_idx] /= renormalization_factor_diff[band_m_idx]; + } + else + { + diffuseness_m[band_m_idx] = 0.0f; + } + + energyRatio[block_m_idx][band_m_idx] = 1.0f - diffuseness_m[band_m_idx]; + } + + for ( band_m_idx = 0; band_m_idx < hDirAC->nbands; band_m_idx++ ) + { + spreadCoherence[block_m_idx][band_m_idx] = 0.0f; + surroundingCoherence[block_m_idx][band_m_idx] = 0.0f; + } + } + + return; +} + + +/* Compute downmix */ +static void ivas_dirac_dmx( + float data_in_f[][L_FRAME48k], + const int16_t input_frame, + const int16_t nchan_transport ) +{ + int16_t i; + float data_out_f[MASA_MAX_TRANSPORT_CHANNELS][L_FRAME48k]; + + if ( nchan_transport == 2 ) + { + v_add( data_in_f[0], data_in_f[1], data_out_f[0], input_frame ); + v_multc( data_out_f[0], 0.5f, data_out_f[0], input_frame ); + + v_sub( data_in_f[0], data_in_f[1], data_out_f[1], input_frame ); + v_multc( data_out_f[1], 0.5f, data_out_f[1], input_frame ); + + for ( i = 0; i < nchan_transport; i++ ) + { + mvr2r( data_out_f[i], data_in_f[i], input_frame ); + } + } + + return; +} diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c new file mode 100644 index 0000000000000000000000000000000000000000..07ab219aca7b85ed88e0f539a702365dff62e085 --- /dev/null +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -0,0 +1,2673 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include +#include +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_prot_rend.h" +#include "ivas_cnst.h" +#include "ivas_rom_binauralRenderer.h" +#include "ivas_rom_rend.h" +#include "ivas_rom_com.h" + +#include "wmc_auto.h" + + +/*------------------------------------------------------------------------- + * Local constants + *------------------------------------------------------------------------*/ + +#define CLDFB_HALF_BIN_FREQUENCY_OFFSET 0.5f +#define IVAS_TDET_DUCK_MULT_FAC_PARA_BIN ( 2.0f ) +#define IVAS_TDET_DUCK_MULT_FAC_PARA_BIN_LOW_BR ( 3.0f ) +#define SBA_CARDI_TARGET_ENERGY_GAIN 0.5f + +#define STEREO_PREPROCESS_IIR_FACTOR ( 0.9f ) + +/* powf(0.95f, 4.0f) for sub-frame smoothing instead of CLDFB slot */ +#define ADAPT_HTPROTO_IIR_FAC 0.81450625f + +#define ADAPT_HTPROTO_ILD_LIM_DB0 1.0f +#define ADAPT_HTPROTO_ILD_LIM_DB1 4.0f +#define ADAPT_HTPROTO_ROT_LIM_0 0.4f +#define ADAPT_HTPROTO_ROT_LIM_1 0.8f + +#define MAX_GAIN_CACHE_SIZE ( ( MASA_MAXIMUM_DIRECTIONS * 3 ) + MAX_NUM_OBJECTS ) /* == different calls to get gains */ + +typedef struct hrtfGainCache +{ + int16_t azi; + int16_t ele; + + float shVec[HRTF_SH_CHANNELS]; +} PARAMBIN_HRTF_GAIN_CACHE; + +typedef struct parambin_rend_config_data +{ + int16_t separateCenterChannelRendering; + IVAS_FORMAT ivas_format; + MC_MODE mc_mode; + int32_t ivas_total_brate; + int16_t nchan_transport; + float qualityBasedSmFactor; + int16_t processReverb; + ISM_MODE ism_mode; +} PARAMBIN_REND_CONFIG, *PARAMBIN_REND_CONFIG_HANDLE; + + +/*------------------------------------------------------------------------- + * Local function prototypes + *------------------------------------------------------------------------*/ + +static void ivas_dirac_dec_binaural_internal( Decoder_Struct *st_ivas, COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, float *output_f[], const int16_t nchan_transport, const int16_t subframe ); + +static void ivas_dirac_dec_decorrelate_slot( DIRAC_DEC_BIN_HANDLE hDiracDecBin, const int16_t num_freq_bands, const int16_t slot, float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float decRe[][CLDFB_NO_CHANNELS_MAX], float decIm[][CLDFB_NO_CHANNELS_MAX] ); + +static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matrices( DIRAC_DEC_BIN_HANDLE hDiracDecBin, SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, PARAMBIN_REND_CONFIG_HANDLE hConfig, float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float Rmat[3][3], const int16_t subframe, const int16_t isHeadtracked, const MASA_ISM_DATA_HANDLE hMasaIsmData ); + +static void ivas_dirac_dec_binaural_determine_processing_matrices( DIRAC_DEC_BIN_HANDLE hDiracDecBin, SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, PARAMBIN_REND_CONFIG_HANDLE hConfig, const int16_t max_band_decorr, float Rmat[3][3], const int16_t subframe, const int16_t isHeadtracked, const int16_t nchanSeparateChannels, const MASA_ISM_DATA_HANDLE hMasaIsmData ); + +static void ivas_dirac_dec_binaural_process_output( DIRAC_DEC_BIN_HANDLE hDiracDecBin, SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, HANDLE_CLDFB_FILTER_BANK cldfbSynDec[MAX_OUTPUT_CHANNELS], float *output_f[], float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t max_band_decorr, const int16_t numInChannels, const int16_t processReverb, const int16_t subframe ); + +static void adaptTransportSignalsHeadtracked( COMBINED_ORIENTATION_HANDLE hHeadTrackData, float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t nBins, const int16_t nSlots, float Rmat[3][3] ); + +static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked( COMBINED_ORIENTATION_HANDLE hHeadTrackData, float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t nBins, const int16_t nSlots, float Rmat[3][3] ); + +static void formulate2x2MixingMatrix( float Ein1, float Ein2, float CinRe, float CinIm, float Eout1, float Eout2, float CoutRe, float CoutIm, float Q[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float Mre[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float Mim[BINAURAL_CHANNELS][BINAURAL_CHANNELS], const float regularizationFactor ); + +static void hrtfShGetHrtf( const int16_t bin, const int16_t aziDeg, const int16_t eleDeg, float *lRealp, float *lImagp, float *rRealp, float *rImagp, PARAMBIN_HRTF_GAIN_CACHE *gainCache, const int16_t useCachedValue ); + +static void getDirectPartGains( const int16_t bin, int16_t aziDeg, int16_t eleDeg, float *lRealp, float *lImagp, float *rRealp, float *rImagp, const uint8_t stereoMode, float Rmat[3][3], PARAMBIN_HRTF_GAIN_CACHE *gainCache, const int16_t isHeadtracked ); + +static void matrixMul( float Are[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float Aim[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float Bre[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float Bim[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float outRe[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float outIm[BINAURAL_CHANNELS][BINAURAL_CHANNELS] ); + +static void matrixTransp2Mul( float Are[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float Aim[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float Bre[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float Bim[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float outRe[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float outIm[BINAURAL_CHANNELS][BINAURAL_CHANNELS] ); + + +/*------------------------------------------------------------------------- + * ivas_dirac_dec_init_binaural_data() + * + * Initialize parametric binaural renderer + *------------------------------------------------------------------------*/ + +ivas_error ivas_dirac_dec_init_binaural_data( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + HRTFS_PARAMBIN_HANDLE hHrtfParambin /* i : HRTF structure for rendering */ +) +{ + DIRAC_DEC_BIN_HANDLE hDiracDecBin; + int16_t nBins; + int32_t output_Fs; + RENDERER_TYPE renderer_type; + int16_t j, k, bin; + float binCenterFreq, tmpFloat; + ivas_error error; + float frequency_axis[CLDFB_NO_CHANNELS_MAX]; + hDiracDecBin = st_ivas->hDiracDecBin; + + if ( hDiracDecBin == NULL ) + { + if ( ( hDiracDecBin = (DIRAC_DEC_BIN_HANDLE) malloc( sizeof( DIRAC_DEC_BIN_DATA ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC binaural handle " ); + } + + hDiracDecBin->hTdDecorr = NULL; + hDiracDecBin->hReverb = NULL; + hDiracDecBin->h_freq_domain_decorr_ap_params = NULL; + hDiracDecBin->h_freq_domain_decorr_ap_state = NULL; + } + + output_Fs = st_ivas->hDecoderConfig->output_Fs; + nBins = st_ivas->hSpatParamRendCom->num_freq_bands; + renderer_type = st_ivas->renderer_type; + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + for ( k = 0; k < BINAURAL_CHANNELS + MAX_NUM_OBJECTS; k++ ) + { + set_zero( hDiracDecBin->processMtxRe[j][k], nBins ); + set_zero( hDiracDecBin->processMtxIm[j][k], nBins ); + } + + for ( k = 0; k < BINAURAL_CHANNELS; k++ ) + { + set_zero( hDiracDecBin->processMtxDecRe[j][k], nBins ); + set_zero( hDiracDecBin->processMtxDecIm[j][k], nBins ); + } + set_zero( hDiracDecBin->ChEnePrev[j], nBins ); + set_zero( hDiracDecBin->ChEneOutPrev[j], nBins ); + } + set_zero( hDiracDecBin->ChCrossRePrev, nBins ); + set_zero( hDiracDecBin->ChCrossImPrev, nBins ); + set_zero( hDiracDecBin->ChCrossReOutPrev, nBins ); + set_zero( hDiracDecBin->ChCrossImOutPrev, nBins ); + hDiracDecBin->renderStereoOutputInsteadOfBinaural = 0; + + + for ( bin = 0; bin < nBins; bin++ ) + { + binCenterFreq = ( (float) bin + CLDFB_HALF_BIN_FREQUENCY_OFFSET ) / (float) nBins * ( (float) output_Fs / 2.0f ); + /* These formulas and values are from Christian Borss's publication for binaural diffuse field coherence */ + tmpFloat = max( 0.0f, 1.0f - binCenterFreq / 2700.0f ); + hDiracDecBin->diffuseFieldCoherence[bin] = tmpFloat * sinf( binCenterFreq * EVS_PI / 550.0f ) / ( binCenterFreq * EVS_PI / 550.0f ); + } + + for ( bin = 0; bin < BINAURAL_COHERENCE_DIFFERENCE_BINS; bin++ ) + { + hDiracDecBin->diffuseFieldCoherenceX[bin] = hDiracDecBin->diffuseFieldCoherence[bin] + diffuseFieldCoherenceDifferenceX[bin]; + hDiracDecBin->diffuseFieldCoherenceY[bin] = hDiracDecBin->diffuseFieldCoherence[bin] + diffuseFieldCoherenceDifferenceY[bin]; + hDiracDecBin->diffuseFieldCoherenceZ[bin] = hDiracDecBin->diffuseFieldCoherence[bin] + diffuseFieldCoherenceDifferenceZ[bin]; + } + + if ( renderer_type == RENDERER_BINAURAL_PARAMETRIC ) /* Indication of binaural rendering without room effect */ + { + set_f( hDiracDecBin->earlyPartEneCorrection, 1.0f, CLDFB_NO_CHANNELS_MAX ); + hDiracDecBin->hReverb = NULL; + } + else if ( renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) /* Indication of binaural rendering with room effect */ + { + mvr2r( hHrtfParambin->parametricEarlyPartEneCorrection, hDiracDecBin->earlyPartEneCorrection, nBins ); + + /* reconfiguration needed when Reverb. parameters are changed -> close and open the handle again */ + if ( hDiracDecBin->hReverb != NULL && ( ( hDiracDecBin->hReverb->numBins != nBins ) || + ( hDiracDecBin->hReverb->blockSize != CLDFB_SLOTS_PER_SUBFRAME ) ) ) + { + ivas_binaural_reverb_close( &( hDiracDecBin->hReverb ) ); + } + + if ( hDiracDecBin->hReverb == NULL ) + { + /* Todo Philips: Room acoustics should be passed here once the underlying part works. Probably enough to pick it from st_ivas but you know best. */ + if ( ( error = ivas_binaural_reverb_open_parambin( &hDiracDecBin->hReverb, nBins, CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, NULL, output_Fs, st_ivas->hHrtfParambin ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + else if ( renderer_type == RENDERER_STEREO_PARAMETRIC ) + { + set_f( hDiracDecBin->earlyPartEneCorrection, 1.0f, CLDFB_NO_CHANNELS_MAX ); + hDiracDecBin->hReverb = NULL; + hDiracDecBin->renderStereoOutputInsteadOfBinaural = 1; + } + else /* Not valid renderer type for this renderer */ + { + assert( false ); + } + + hDiracDecBin->hDiffuseDist = NULL; /* Memory is allocated from stack during runtime when needed */ + + if ( hDiracDecBin->hTdDecorr == NULL ) + { + hDiracDecBin->useTdDecorr = 0; + } + + if ( hDiracDecBin->h_freq_domain_decorr_ap_params != NULL ) + { + ivas_dirac_dec_decorr_close( &hDiracDecBin->h_freq_domain_decorr_ap_params, &hDiracDecBin->h_freq_domain_decorr_ap_state ); + } + + if ( ( error = ivas_td_decorr_reconfig_dec( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hDecoderConfig->output_Fs, &( hDiracDecBin->hTdDecorr ), &( hDiracDecBin->useTdDecorr ) ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( !hDiracDecBin->useTdDecorr && !( st_ivas->ivas_format == ISM_FORMAT && st_ivas->ism_mode == ISM_MODE_PARAM ) ) + { + ivas_dirac_dec_get_frequency_axis( frequency_axis, output_Fs, nBins ); + if ( ( error = ivas_dirac_dec_decorr_open( &( hDiracDecBin->h_freq_domain_decorr_ap_params ), + &( hDiracDecBin->h_freq_domain_decorr_ap_state ), + nBins, + BINAURAL_CHANNELS, + BINAURAL_CHANNELS, + DIRAC_SYNTHESIS_PSD_LS, + frequency_axis, + BINAURAL_CHANNELS, + output_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + hDiracDecBin->reqularizationFactor = configure_reqularization_factor( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate ); + + st_ivas->hDiracDecBin = hDiracDecBin; + + /* allocate transport channels*/ + if ( st_ivas->hDecoderConfig->Opt_5ms && st_ivas->hTcBuffer == NULL ) + { + int16_t nchan_to_allocate; + int16_t n_samples_granularity; + + nchan_to_allocate = 2 * BINAURAL_CHANNELS; + if ( st_ivas->ivas_format == MASA_ISM_FORMAT ) + { + nchan_to_allocate = 2 * BINAURAL_CHANNELS + 2; + } + + n_samples_granularity = NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ); + if ( st_ivas->ivas_format == MASA_ISM_FORMAT && st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC && st_ivas->ism_mode == ISM_MASA_MODE_DISC ) + { + n_samples_granularity = NS2SA( st_ivas->hDecoderConfig->output_Fs, FRAME_SIZE_NS / MAX_PARAM_SPATIAL_SUBFRAMES ); /* Use the same granularity as tdrend */ + } + + if ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, TC_BUFFER_MODE_RENDERER, ivas_jbm_dec_get_num_tc_channels( st_ivas ), nchan_to_allocate, nchan_to_allocate, n_samples_granularity ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + return IVAS_ERR_OK; +} + + +/*------------------------------------------------------------------------- + * ivas_dirac_dec_close_binaural_data() + * + * Close parametric binaural renderer + *------------------------------------------------------------------------*/ + +void ivas_dirac_dec_close_binaural_data( + DIRAC_DEC_BIN_HANDLE *hBinaural /* i/o: decoder DirAC binaural data handle */ +) +{ + + if ( hBinaural == NULL || *hBinaural == NULL ) + { + return; + } + + if ( ( *hBinaural )->hReverb != NULL ) + { + ivas_binaural_reverb_close( &( ( *hBinaural )->hReverb ) ); + } + + ivas_td_decorr_dec_close( &( ( *hBinaural )->hTdDecorr ) ); + if ( ( *hBinaural )->h_freq_domain_decorr_ap_params != NULL ) + { + ivas_dirac_dec_decorr_close( &( *hBinaural )->h_freq_domain_decorr_ap_params, &( *hBinaural )->h_freq_domain_decorr_ap_state ); + } + + free( *hBinaural ); + *hBinaural = NULL; + + return; +} + +/*------------------------------------------------------------------------- + * ivas_dirac_dec_binaural_copy_hrtfs() + * + * Temporary function for copying HRTF data from rom tables if no binary + * file was given. + *------------------------------------------------------------------------*/ + +ivas_error ivas_dirac_dec_binaural_copy_hrtfs( + HRTFS_PARAMBIN_HANDLE *hHrtfParambin /* i/o: HRTF structure for rendering */ +) +{ + int16_t i, j; + if ( hHrtfParambin != NULL && *hHrtfParambin != NULL ) + { + /* Tables already loaded from file */ + return IVAS_ERR_OK; + } + else + { + /* Initialise tables from ROM */ + HRTFS_PARAMBIN *hrtfParambin; + + if ( ( hrtfParambin = (HRTFS_PARAMBIN *) malloc( sizeof( HRTFS_PARAMBIN ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for parametric binauralizer HRTF tables" ); + } + + for ( i = 0; i < BINAURAL_CHANNELS; i++ ) + { + for ( j = 0; j < HRTF_SH_CHANNELS; j++ ) + { + mvr2r( hrtfShCoeffsRe[i][j], hrtfParambin->hrtfShCoeffsRe[i][j], HRTF_NUM_BINS ); + mvr2r( hrtfShCoeffsIm[i][j], hrtfParambin->hrtfShCoeffsIm[i][j], HRTF_NUM_BINS ); + } + } + + mvr2r( parametricReverberationTimes, hrtfParambin->parametricReverberationTimes, CLDFB_NO_CHANNELS_MAX ); + mvr2r( parametricReverberationEneCorrections, hrtfParambin->parametricReverberationEneCorrections, CLDFB_NO_CHANNELS_MAX ); + mvr2r( parametricEarlyPartEneCorrection, hrtfParambin->parametricEarlyPartEneCorrection, CLDFB_NO_CHANNELS_MAX ); + + *hHrtfParambin = hrtfParambin; + } + + return IVAS_ERR_OK; +} + + +/*------------------------------------------------------------------------- + * void ivas_dirac_dec_binaural_render() + * + * + *------------------------------------------------------------------------*/ + +void ivas_dirac_dec_binaural_render( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */ + uint16_t *nSamplesRendered, /* o : number of CLDFB slots rendered */ + uint16_t *nSamplesAvailable, /* o : number of CLDFB slots still to render */ + const int16_t nchan_transport, /* i : number of transport channels */ + float *output_f[] /* o : rendered time signal */ +) +{ + int16_t slots_to_render, first_sf, last_sf, subframe_idx; + uint16_t slot_size, ch; + uint16_t nchan_out; + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom; + float *output_f_local[MAX_OUTPUT_CHANNELS]; + + hSpatParamRendCom = st_ivas->hSpatParamRendCom; + nchan_out = BINAURAL_CHANNELS; + for ( ch = 0; ch < nchan_out; ch++ ) + { + output_f_local[ch] = output_f[ch]; + } + slot_size = NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ); + + /* loop for synthesis, assume we always have to render in multiples of 5ms subframes with spills */ + slots_to_render = min( hSpatParamRendCom->num_slots - hSpatParamRendCom->slots_rendered, nSamplesAsked / slot_size ); + *nSamplesRendered = slots_to_render * slot_size; + first_sf = hSpatParamRendCom->subframes_rendered; + last_sf = first_sf; + + while ( slots_to_render > 0 ) + { + slots_to_render -= hSpatParamRendCom->subframe_nbslots[last_sf]; + last_sf++; + } + + for ( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ ) + { + int16_t n_samples_sf = slot_size * hSpatParamRendCom->subframe_nbslots[subframe_idx]; + ivas_dirac_dec_binaural_internal( st_ivas, st_ivas->hCombinedOrientationData, output_f_local, nchan_transport, subframe_idx ); + + for ( ch = 0; ch < nchan_out; ch++ ) + { + output_f_local[ch] += n_samples_sf; + } + } + + if ( hSpatParamRendCom->slots_rendered == hSpatParamRendCom->num_slots ) + { + hSpatParamRendCom->dirac_read_idx = ( hSpatParamRendCom->dirac_read_idx + DEFAULT_JBM_SUBFRAMES_5MS ) % hSpatParamRendCom->dirac_md_buffer_length; + } + + *nSamplesAvailable = ( hSpatParamRendCom->num_slots - hSpatParamRendCom->slots_rendered ) * slot_size; + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_dirac_dec_binaural_sba_gain() + * + * loudness correction for parametric binaural renderer + *------------------------------------------------------------------------*/ + +void ivas_dirac_dec_binaural_sba_gain( + float *output[], /* i/o: synthesized core-coder transport channels/DirAC output */ + const int16_t nchan_remapped, /* i : num channels after remapping of TCs */ + const int16_t output_frame /* i : output frame length */ +) +{ + int16_t n; + float gain; + + if ( nchan_remapped == 1 ) + { + gain = 1.4454f; + } + else + { + gain = 1.3657f; + } + + for ( n = 0; n < nchan_remapped; n++ ) + { + v_multc( output[n], gain, output[n], output_frame ); + } + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_dirac_dec_binaural() + * + * Parametric binaural renderer main function + *------------------------------------------------------------------------*/ + +void ivas_dirac_dec_binaural( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i : combined orientation handle */ + float *output_f[], /* i/o: synthesized core-coder transport channels/DirAC output */ + const int16_t nchan_transport, /* i : number of transport channels */ + const int16_t num_subframes /* i : number of subframes to render */ +) +{ + int16_t subframe; + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom; + float cng_td_buffer[L_FRAME16k]; + float *p_output[MAX_OUTPUT_CHANNELS]; + int16_t ch; + int16_t slot_size; + int16_t numInChannels; + float *decorr_signal[BINAURAL_CHANNELS], decorr_signal_buff[BINAURAL_CHANNELS][L_FRAME48k]; + + hSpatParamRendCom = st_ivas->hSpatParamRendCom; + + slot_size = NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ); + for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + p_output[ch] = output_f[ch]; + p_output[ch + BINAURAL_CHANNELS] = decorr_signal_buff[ch]; + } + numInChannels = nchan_transport; + if ( st_ivas->hOutSetup.separateChannelEnabled || ( st_ivas->ivas_format == MASA_ISM_FORMAT && ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) ) ) + { + numInChannels++; + } + else if ( st_ivas->ivas_format == MASA_ISM_FORMAT && st_ivas->ism_mode == ISM_MASA_MODE_DISC && ( st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) + { + numInChannels += (uint8_t) st_ivas->nchan_ism; + } + + for ( ch = 0; ch < numInChannels; ch++ ) + { + st_ivas->hTcBuffer->tc[ch] = &output_f[ch][0]; + } + + ivas_dirac_dec_set_md_map( st_ivas, DEFAULT_JBM_CLDFB_TIMESLOTS ); + if ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT ) + { + ivas_spar_dec_set_render_map( st_ivas, DEFAULT_JBM_CLDFB_TIMESLOTS ); + } + if ( st_ivas->hDiracDecBin->useTdDecorr ) + { + int16_t output_frame; + + for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + decorr_signal[ch] = decorr_signal_buff[ch]; + st_ivas->hTcBuffer->tc[ch + BINAURAL_CHANNELS] = decorr_signal[ch]; + } + output_frame = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); + + ivas_td_decorr_process( st_ivas->hDiracDecBin->hTdDecorr, p_output, decorr_signal, output_frame ); + } + + if ( nchan_transport == 1 && st_ivas->nchan_transport != 2 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag ) + { + Decoder_State *st = st_ivas->hSCE[0]->hCoreCoder[0]; + st_ivas->hTcBuffer->tc[nchan_transport] = &cng_td_buffer[0]; + generate_masking_noise_lb_dirac( st->hFdCngDec->hFdCngCom, st_ivas->hTcBuffer->tc[nchan_transport], DEFAULT_JBM_CLDFB_TIMESLOTS, st->cna_dirac_flag && st->flag_cna ); + } + + for ( subframe = 0; subframe < num_subframes; subframe++ ) + { + int16_t n_samples_sf = slot_size * hSpatParamRendCom->subframe_nbslots[subframe]; + + ivas_dirac_dec_binaural_internal( st_ivas, hCombinedOrientationData, p_output, nchan_transport, subframe ); + + for ( ch = 0; ch < 2 * BINAURAL_CHANNELS; ch++ ) + { + p_output[ch] += n_samples_sf; + } + hSpatParamRendCom->dirac_read_idx = ( hSpatParamRendCom->dirac_read_idx + 1 ) % hSpatParamRendCom->dirac_md_buffer_length; + } + + for ( ch = 0; ch < 2 * BINAURAL_CHANNELS; ch++ ) + { + st_ivas->hTcBuffer->tc[ch] = NULL; + } + + return; +} + + +/*------------------------------------------------------------------------- + * Local functions + *------------------------------------------------------------------------*/ + +static void ivas_dirac_dec_binaural_internal( + Decoder_Struct *st_ivas, + COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, + float *output_f[], + const int16_t nchan_transport, + const int16_t subframe ) +{ + DIRAC_DEC_BIN_HANDLE hDiracDecBin; + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom; + PARAMBIN_REND_CONFIG config_data; + int16_t slot, ch, numInChannels; + float Cldfb_RealBuffer_in[6][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + float Cldfb_ImagBuffer_in[6][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + int16_t nchanSeparateChannels; + float Rmat[3][3]; + int16_t max_band_decorr; + DIFFUSE_DISTRIBUTION_DATA diffuseDistData; + int16_t nBins, offsetSamples; + int16_t i, j; + hDiracDecBin = st_ivas->hDiracDecBin; + assert( hDiracDecBin ); + hSpatParamRendCom = st_ivas->hSpatParamRendCom; + nBins = hSpatParamRendCom->num_freq_bands; + offsetSamples = hSpatParamRendCom->slots_rendered * nBins; + + /* Setup internal config */ + config_data.separateCenterChannelRendering = st_ivas->hOutSetup.separateChannelEnabled; + config_data.ivas_format = st_ivas->ivas_format; + config_data.mc_mode = st_ivas->mc_mode; + config_data.ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; + config_data.nchan_transport = st_ivas->nchan_transport; + config_data.qualityBasedSmFactor = st_ivas->hMasa != NULL ? st_ivas->hMasa->data.dir_decode_quality : 1.0f; + config_data.processReverb = st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ? 1 : 0; + if ( st_ivas->ivas_format == MASA_ISM_FORMAT ) + { + config_data.ism_mode = st_ivas->ism_mode; + } + else + { + config_data.ism_mode = ISM_MODE_NONE; + } + + /* The input channel number at this processing function (not nchan_transport) */ + numInChannels = BINAURAL_CHANNELS; + if ( config_data.separateCenterChannelRendering || ( st_ivas->ivas_format == MASA_ISM_FORMAT && ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) ) ) + { + numInChannels++; + } + else if ( st_ivas->ivas_format == MASA_ISM_FORMAT && st_ivas->ism_mode == ISM_MASA_MODE_DISC && ( st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) + { + numInChannels += (uint8_t) st_ivas->nchan_ism; + } + + Rmat[0][0] = 1.0f; + Rmat[0][1] = 0.0f; + Rmat[0][2] = 0.0f; + + Rmat[1][0] = 0.0f; + Rmat[1][1] = 1.0f; + Rmat[1][2] = 0.0f; + + Rmat[2][0] = 0.0f; + Rmat[2][1] = 0.0f; + Rmat[2][2] = 1.0f; + + /* CLDFB Analysis of input */ + for ( slot = 0; slot < hSpatParamRendCom->subframe_nbslots[subframe]; slot++ ) + { + for ( ch = 0; ch < numInChannels; ch++ ) + { + if ( ch == 0 || nchan_transport == 2 ) + { + cldfbAnalysis_ts( + &( st_ivas->hTcBuffer->tc[ch][nBins * slot + offsetSamples] ), + Cldfb_RealBuffer_in[ch][slot], + Cldfb_ImagBuffer_in[ch][slot], + nBins, st_ivas->cldfbAnaDec[ch] ); + } + else if ( config_data.nchan_transport == 2 ) /* Stereo signal transmitted as mono with DFT stereo */ + { + /* At mono input duplicate the channel to dual-mono */ + mvr2r( Cldfb_RealBuffer_in[0][slot], Cldfb_RealBuffer_in[1][slot], nBins ); + mvr2r( Cldfb_ImagBuffer_in[0][slot], Cldfb_ImagBuffer_in[1][slot], nBins ); + } + else /* when nchan_transport == 1 and ch == 1 */ + { + /* CNA and HB FD-CNG*/ + if ( st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag ) + { + int16_t numCoreBands, b; + int16_t slotInFrame; + + numCoreBands = st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->numCoreBands; + slotInFrame = hSpatParamRendCom->slots_rendered + slot; + + generate_masking_noise_dirac( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom, + st_ivas->cldfbAnaDec[1], + st_ivas->hTcBuffer->tc[nchan_transport], + Cldfb_RealBuffer_in[2][slot], Cldfb_ImagBuffer_in[2][slot], + slotInFrame, + st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag && st_ivas->hSCE[0]->hCoreCoder[0]->flag_cna, + ( st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == FRAME_NO_DATA || st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == SID_2k40 ) && ( st_ivas->hSCE[0]->hCoreCoder[0]->cng_type == FD_CNG ) && st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag ); + + generate_masking_noise_dirac( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom, + st_ivas->cldfbAnaDec[1], /*nothing will be analyzed, just get cnst*/ + NULL, + Cldfb_RealBuffer_in[1][slot], Cldfb_ImagBuffer_in[1][slot], + slotInFrame, + st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag && st_ivas->hSCE[0]->hCoreCoder[0]->flag_cna, + ( st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == FRAME_NO_DATA || st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == SID_2k40 ) && ( st_ivas->hSCE[0]->hCoreCoder[0]->cng_type == FD_CNG ) && st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag ); + + /* LB: Copy first channel + LB-CNG to first and second channels with same scaling (dual-mono)*/ + for ( b = 0; b < numCoreBands; b++ ) + { + Cldfb_RealBuffer_in[0][slot][b] = INV_SQRT2 * ( Cldfb_RealBuffer_in[0][slot][b] + Cldfb_RealBuffer_in[2][slot][b] ); + Cldfb_RealBuffer_in[1][slot][b] = Cldfb_RealBuffer_in[0][slot][b]; + Cldfb_ImagBuffer_in[0][slot][b] = INV_SQRT2 * ( Cldfb_ImagBuffer_in[0][slot][b] + Cldfb_ImagBuffer_in[2][slot][b] ); + Cldfb_ImagBuffer_in[1][slot][b] = Cldfb_ImagBuffer_in[0][slot][b]; + } + + /* HB: Copy first channel to second channel and add HB-CNGs with different scalings*/ + for ( ; b < nBins; b++ ) + { + Cldfb_RealBuffer_in[0][slot][b] *= INV_SQRT2; + Cldfb_RealBuffer_in[1][slot][b] = Cldfb_RealBuffer_in[0][slot][b] + 0.5f * Cldfb_RealBuffer_in[1][slot][b] + Cldfb_RealBuffer_in[0][slot][b]; + Cldfb_RealBuffer_in[0][slot][b] += 0.5f * Cldfb_RealBuffer_in[2][slot][b]; + + Cldfb_ImagBuffer_in[0][slot][b] *= INV_SQRT2; + Cldfb_ImagBuffer_in[1][slot][b] = Cldfb_ImagBuffer_in[0][slot][b] + 0.5f * Cldfb_ImagBuffer_in[1][slot][b]; + Cldfb_ImagBuffer_in[0][slot][b] += 0.5f * Cldfb_ImagBuffer_in[2][slot][b]; + } + } + else + { + /* At mono input duplicate the channel to dual-mono, and apply gain + correction to ensure same overall level as in stereo mode */ + v_multc( Cldfb_RealBuffer_in[0][slot], INV_SQRT_2, Cldfb_RealBuffer_in[0][slot], nBins ); + v_multc( Cldfb_ImagBuffer_in[0][slot], INV_SQRT_2, Cldfb_ImagBuffer_in[0][slot], nBins ); + + mvr2r( Cldfb_RealBuffer_in[0][slot], Cldfb_RealBuffer_in[1][slot], nBins ); + mvr2r( Cldfb_ImagBuffer_in[0][slot], Cldfb_ImagBuffer_in[1][slot], nBins ); + } + } + } + + if ( hDiracDecBin->useTdDecorr ) + { + for ( ch = BINAURAL_CHANNELS; ch < ( 2 * BINAURAL_CHANNELS ); ch++ ) + { + cldfbAnalysis_ts( + &( st_ivas->hTcBuffer->tc[ch][nBins * slot + offsetSamples] ), + Cldfb_RealBuffer_in[ch][slot], + Cldfb_ImagBuffer_in[ch][slot], + nBins, st_ivas->cldfbAnaDec[ch] ); + if ( config_data.nchan_transport == 1 && + ( config_data.ivas_format == SBA_FORMAT || config_data.ivas_format == SBA_ISM_FORMAT ) ) + { + v_multc( Cldfb_RealBuffer_in[ch][slot], INV_SQRT_2, Cldfb_RealBuffer_in[ch][slot], nBins ); + v_multc( Cldfb_ImagBuffer_in[ch][slot], INV_SQRT_2, Cldfb_ImagBuffer_in[ch][slot], nBins ); + } + } + } + } + + if ( config_data.ivas_format == SBA_FORMAT || config_data.ivas_format == SBA_ISM_FORMAT ) + { + hDiracDecBin->hDiffuseDist = &diffuseDistData; + + ivas_spar_param_to_masa_param_mapping( st_ivas, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, subframe ); + ivas_sba_prototype_renderer( st_ivas, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, subframe ); + } + + if ( st_ivas->ivas_format == MASA_ISM_FORMAT && nchan_transport == 2 && st_ivas->ism_mode != ISM_MASA_MODE_DISC && st_ivas->ism_mode != ISM_MASA_MODE_MASA_ONE_OBJ ) + { + ivas_omasa_preProcessStereoTransportsForMovedObjects( st_ivas, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, nBins, subframe ); + } + + if ( hCombinedOrientationData ) + { + for ( i = 0; i < 3; i++ ) + { + for ( j = 0; j < 3; j++ ) + { + Rmat[i][j] = hCombinedOrientationData->Rmat[subframe][i][j]; + } + } + + if ( nchan_transport == 2 ) + { + adaptTransportSignalsHeadtracked( hCombinedOrientationData, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, nBins, hSpatParamRendCom->subframe_nbslots[subframe], Rmat ); + + ivas_dirac_dec_binaural_check_and_switch_transports_headtracked( hCombinedOrientationData, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, nBins, hSpatParamRendCom->subframe_nbslots[subframe], Rmat ); + } + } + + + ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matrices( hDiracDecBin, hSpatParamRendCom, &config_data, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, Rmat, subframe, + hCombinedOrientationData && hCombinedOrientationData->enableCombinedOrientation[subframe] > 0, st_ivas->hMasaIsmData ); + + if ( config_data.ivas_format == ISM_FORMAT ) + { + max_band_decorr = 0; + } + else if ( hDiracDecBin->useTdDecorr ) + { + max_band_decorr = CLDFB_NO_CHANNELS_MAX; + } + else + { + max_band_decorr = hDiracDecBin->h_freq_domain_decorr_ap_params->max_band_decorr; + } + + + + nchanSeparateChannels = 0; + if ( config_data.separateCenterChannelRendering || ( st_ivas->ivas_format == MASA_ISM_FORMAT && ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) ) ) + { + nchanSeparateChannels = 1; + } + else if ( st_ivas->ivas_format == MASA_ISM_FORMAT && st_ivas->ism_mode == ISM_MASA_MODE_DISC && ( st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) + { + nchanSeparateChannels = (uint8_t) st_ivas->nchan_ism; + } + + ivas_dirac_dec_binaural_determine_processing_matrices( hDiracDecBin, hSpatParamRendCom, &config_data, max_band_decorr, Rmat, subframe, + hCombinedOrientationData && hCombinedOrientationData->enableCombinedOrientation[subframe] > 0, + nchanSeparateChannels, st_ivas->hMasaIsmData ); + + ivas_dirac_dec_binaural_process_output( hDiracDecBin, hSpatParamRendCom, st_ivas->cldfbSynDec, output_f, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, max_band_decorr, numInChannels, config_data.processReverb, subframe ); + + hDiracDecBin->hDiffuseDist = NULL; + + hSpatParamRendCom->slots_rendered += hSpatParamRendCom->subframe_nbslots[subframe]; + hSpatParamRendCom->subframes_rendered++; + + return; +} + + +static void ivas_dirac_dec_decorrelate_slot( + DIRAC_DEC_BIN_HANDLE hDiracDecBin, + const int16_t num_freq_bands, + const int16_t slot, + float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + float decRe[][CLDFB_NO_CHANNELS_MAX], + float decIm[][CLDFB_NO_CHANNELS_MAX] ) +{ + int16_t offset, ch, bin; + float onset_filter[BINAURAL_CHANNELS * CLDFB_NO_CHANNELS_MAX]; /* 2 ch, 60 bins */ + float decorrelatedFrameInterleaved[2 * BINAURAL_CHANNELS * CLDFB_NO_CHANNELS_MAX]; /* 2 ch, real + imag, 60 bins */ + float protoFrameF[2 * BINAURAL_CHANNELS * CLDFB_NO_CHANNELS_MAX]; /* 2 ch, real + imag, 60 bins */ + const int16_t protoIndexDir[BINAURAL_CHANNELS] = { 0, 1 }; + + /* Decorrelation needs interleaved data. Copy left and right signals to proto_frame_f */ + for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + offset = num_freq_bands * BINAURAL_CHANNELS * ch; + for ( bin = 0; bin < num_freq_bands; bin++ ) + { + protoFrameF[( bin * BINAURAL_CHANNELS ) + offset] = inRe[ch][slot][bin]; + protoFrameF[( bin * BINAURAL_CHANNELS ) + offset + 1] = inIm[ch][slot][bin]; + } + } + + /* Decorrelate proto signal to decorrelatedFrameInterleaved */ + ivas_dirac_dec_decorr_process( num_freq_bands, + BINAURAL_CHANNELS, + BINAURAL_CHANNELS, + DIRAC_SYNTHESIS_PSD_LS, + BINAURAL_CHANNELS, + protoFrameF, + BINAURAL_CHANNELS, + protoIndexDir, + decorrelatedFrameInterleaved, + onset_filter, + hDiracDecBin->h_freq_domain_decorr_ap_params, + hDiracDecBin->h_freq_domain_decorr_ap_state ); + + /* De-interleave decorrelated signals*/ + for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + offset = num_freq_bands * BINAURAL_CHANNELS * ch; + for ( bin = 0; bin < num_freq_bands; bin++ ) + { + decRe[ch][bin] = decorrelatedFrameInterleaved[( bin * BINAURAL_CHANNELS ) + offset]; + decIm[ch][bin] = decorrelatedFrameInterleaved[( bin * BINAURAL_CHANNELS ) + offset + 1]; + } + } + + return; +} + + +static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matrices( + DIRAC_DEC_BIN_HANDLE hDiracDecBin, + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, + PARAMBIN_REND_CONFIG_HANDLE hConfig, + float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + float Rmat[3][3], + const int16_t subframe, + const int16_t isHeadtracked, + const MASA_ISM_DATA_HANDLE hMasaIsmData ) +{ + int16_t ch, slot, bin; + int16_t separateCenterChannelRendering; + int16_t nBins, idx; + float frameMeanDiffusenessEneWeight[CLDFB_NO_CHANNELS_MAX]; + float IIReneLimiterFactor; + float qualityBasedSmFactor; + float lowBitRateEQ[CLDFB_NO_CHANNELS_MAX]; + uint8_t applyLowBitRateEQ; + int16_t dirac_read_idx; + float subFrameTotalEne[CLDFB_NO_CHANNELS_MAX]; + PARAMBIN_HRTF_GAIN_CACHE gainCache[MAX_GAIN_CACHE_SIZE]; + IVAS_FORMAT ivas_format; + MC_MODE mc_mode; + int32_t ivas_total_brate; + int16_t nchan_transport; + int16_t gainCacheBaseIndex; + + separateCenterChannelRendering = hConfig->separateCenterChannelRendering; + ivas_format = hConfig->ivas_format; + mc_mode = hConfig->mc_mode; + ivas_total_brate = hConfig->ivas_total_brate; + nchan_transport = hConfig->nchan_transport; + qualityBasedSmFactor = hConfig->qualityBasedSmFactor; + qualityBasedSmFactor *= qualityBasedSmFactor; + nBins = hSpatParamRendCom->num_freq_bands; /* Actually bins */ + + set_zero( hDiracDecBin->ChCrossRe, nBins ); + set_zero( hDiracDecBin->ChCrossIm, nBins ); + set_zero( hDiracDecBin->ChCrossReOut, nBins ); + set_zero( hDiracDecBin->ChCrossImOut, nBins ); + for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + set_zero( hDiracDecBin->ChEne[ch], nBins ); + set_zero( hDiracDecBin->ChEneOut[ch], nBins ); + } + set_zero( hDiracDecBin->frameMeanDiffuseness, nBins ); + + set_zero( frameMeanDiffusenessEneWeight, CLDFB_NO_CHANNELS_MAX ); + + for ( idx = 0; idx < MAX_GAIN_CACHE_SIZE; idx++ ) + { + gainCache[idx].azi = -1000; /* Use -1000 as value for uninitialized cache. */ + } + + /* Determine EQ for low bit rates (13.2 and 16.4 kbps) */ + applyLowBitRateEQ = 0; + if ( ( ivas_format == MASA_FORMAT || ivas_format == MC_FORMAT ) && ivas_total_brate < MASA_STEREO_MIN_BITRATE ) + { + applyLowBitRateEQ = 1; + if ( ivas_total_brate == IVAS_16k4 ) + { + for ( bin = 0; bin < LOW_BIT_RATE_BINAURAL_EQ_BINS; bin++ ) + { + lowBitRateEQ[bin + LOW_BIT_RATE_BINAURAL_EQ_OFFSET] = lowBitRateBinauralEQ[bin] * 0.5f + 0.5f; + } + } + else + { + for ( bin = 0; bin < LOW_BIT_RATE_BINAURAL_EQ_BINS; bin++ ) + { + lowBitRateEQ[bin + LOW_BIT_RATE_BINAURAL_EQ_OFFSET] = lowBitRateBinauralEQ[bin]; + } + } + } + + /* Formulate input and target covariance matrices for this subframe */ + set_zero( subFrameTotalEne, CLDFB_NO_CHANNELS_MAX ); + dirac_read_idx = hSpatParamRendCom->render_to_md_map[subframe]; + + /* Calculate input covariance matrix */ + for ( slot = 0; slot < hSpatParamRendCom->subframe_nbslots[subframe]; slot++ ) + { + for ( bin = 0; bin < nBins; bin++ ) + { + for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + float instEne; + + instEne = ( inRe[ch][slot][bin] * inRe[ch][slot][bin] ); + instEne += ( inIm[ch][slot][bin] * inIm[ch][slot][bin] ); + hDiracDecBin->ChEne[ch][bin] += instEne; + subFrameTotalEne[bin] += instEne; + } + hDiracDecBin->ChCrossRe[bin] += inRe[0][slot][bin] * inRe[1][slot][bin]; + hDiracDecBin->ChCrossRe[bin] += inIm[0][slot][bin] * inIm[1][slot][bin]; + hDiracDecBin->ChCrossIm[bin] += inRe[0][slot][bin] * inIm[1][slot][bin]; + hDiracDecBin->ChCrossIm[bin] -= inIm[0][slot][bin] * inRe[1][slot][bin]; + } + } + + /* Apply EQ at low bit rates */ + if ( applyLowBitRateEQ ) + { + int16_t lastEqBin = LOW_BIT_RATE_BINAURAL_EQ_OFFSET + LOW_BIT_RATE_BINAURAL_EQ_BINS - 1; + + for ( bin = LOW_BIT_RATE_BINAURAL_EQ_OFFSET; bin < lastEqBin; bin++ ) + { + subFrameTotalEne[bin] *= lowBitRateEQ[bin]; + } + for ( ; bin < nBins; bin++ ) + { + subFrameTotalEne[bin] *= lowBitRateEQ[lastEqBin]; + } + } + + if ( ( ivas_format == SBA_FORMAT || ivas_format == SBA_ISM_FORMAT ) && nchan_transport == 2 ) + { + float tempRe, tempIm; + float subFrameSumEne[CLDFB_NO_CHANNELS_MAX]; + + v_multc( subFrameTotalEne, SBA_CARDI_TARGET_ENERGY_GAIN, subFrameTotalEne, nBins ); + + set_zero( subFrameSumEne, CLDFB_NO_CHANNELS_MAX ); + for ( slot = 0; slot < hSpatParamRendCom->subframe_nbslots[subframe]; slot++ ) + { + for ( bin = 0; bin < nBins; bin++ ) + { + tempRe = inRe[0][slot][bin] + inRe[1][slot][bin]; + tempIm = inIm[0][slot][bin] + inIm[1][slot][bin]; + subFrameSumEne[bin] += tempRe * tempRe + tempIm * tempIm; + } + } + for ( bin = 0; bin < nBins; bin++ ) + { + subFrameTotalEne[bin] = max( subFrameTotalEne[bin], subFrameSumEne[bin] ); + } + } + + /* Determine target covariance matrix containing target binaural properties */ + for ( bin = 0; bin < nBins; bin++ ) + { + float diffuseness = 1.0f; /* ratio1 and ratio2 are subtracted from diffuseness further below */ + float diffusenessValForDecorrelationReduction = 1.0f; + float diffEneValForDecorrelationReduction; + float surCoh = 0.0f, spreadCoh = 0.0f; /* Default values if spreadSurroundCoherenceApplied == false */ + float diffEne, dirEne, meanEnePerCh; + int16_t dirIndex; + + /* When BINAURAL_ROOM is not indicated, hBinaural->earlyPartEneCorrection[bin] values are all 1.0f. + * When BINAURAL_ROOM is indicated, the binaural audio output is based on combined use of the + * HRTF data set and a BRIR-based data set. The HRTF data set is spectrally corrected to match + * the early spectrum of the BRIR data, using the spectral correction data in + * hBinaural->earlyPartEneCorrection[bin], based on the BRIR set. */ + meanEnePerCh = hDiracDecBin->earlyPartEneCorrection[bin] * subFrameTotalEne[bin] / 2.0f; + + /* Determine direct part target covariance matrix (for 1 or 2 directions) */ + for ( dirIndex = 0; dirIndex < hSpatParamRendCom->numSimultaneousDirections; dirIndex++ ) + { + int16_t aziDeg, eleDeg; + float lRealp, lImagp, rRealp, rImagp; + float lRealpTmp, lImagpTmp, rRealpTmp, rImagpTmp; + float hrtfEne[BINAURAL_CHANNELS], hrtfCrossRe, hrtfCrossIm, ratio; + uint8_t isIsmDirection = 0; + + if ( dirIndex == 0 ) /* For first of the two simultaneous directions */ + { + aziDeg = hSpatParamRendCom->azimuth[dirac_read_idx][bin]; + eleDeg = hSpatParamRendCom->elevation[dirac_read_idx][bin]; + ratio = hSpatParamRendCom->energy_ratio1[dirac_read_idx][bin]; + spreadCoh = hSpatParamRendCom->spreadCoherence[dirac_read_idx][bin]; + gainCacheBaseIndex = 0; + } + else if ( ivas_format != MASA_ISM_FORMAT || ( ivas_format == MASA_ISM_FORMAT && dirIndex < hSpatParamRendCom->numParametricDirections ) ) /* For second of the two simultaneous directions */ + { + if ( ( ratio = hSpatParamRendCom->energy_ratio2[dirac_read_idx][bin] ) < 0.001 ) + { + /* This touches only MASA path where second direction always has smaller ratio and + * for non-2dir it is zero. As the whole direction contribution is multiplied with + * the ratio, a very small ratio does not contribute any energy to output. Thus, + * it is better to save complexity. */ + continue; + } + aziDeg = hSpatParamRendCom->azimuth2[dirac_read_idx][bin]; + eleDeg = hSpatParamRendCom->elevation2[dirac_read_idx][bin]; + spreadCoh = hSpatParamRendCom->spreadCoherence2[dirac_read_idx][bin]; + gainCacheBaseIndex = 3; + } + else /* For object directions of MASA_ISM_FORMAT */ + { + isIsmDirection = 1; + uint16_t ismDirIndex; + ismDirIndex = dirIndex - hSpatParamRendCom->numParametricDirections; + assert( hMasaIsmData != NULL && "hMasaIsmData should not be NULL if we use it" ); + if ( hMasaIsmData->ism_is_edited[ismDirIndex] ) + { + aziDeg = hMasaIsmData->azimuth_ism_edited[ismDirIndex]; + eleDeg = hMasaIsmData->elevation_ism_edited[ismDirIndex]; + } + else + { + aziDeg = hMasaIsmData->azimuth_ism[ismDirIndex][dirac_read_idx]; + eleDeg = hMasaIsmData->elevation_ism[ismDirIndex][dirac_read_idx]; + } + ratio = hMasaIsmData->energy_ratio_ism[ismDirIndex][dirac_read_idx][bin]; + spreadCoh = 0.0f; + gainCacheBaseIndex = 6 + ismDirIndex; + } + + diffuseness -= ratio; /* diffuseness = 1 - ratio1 - ratio2 */ + + if ( diffuseness < 0.0f ) + { + diffuseness = 0.0f; + } + if ( isIsmDirection ) + { + /* Objects cause lesser decorrelation reduction, to avoid removing all decorrelation when only objects are present */ + diffusenessValForDecorrelationReduction -= ratio * 0.5f; + } + else + { + diffusenessValForDecorrelationReduction -= ratio; + } + + if ( separateCenterChannelRendering ) + { + /* In masa + mono rendering mode, the center directions originate from phantom sources, so the + * spread coherence is increased */ + float aziRad, eleRad, doaVectorX, spatialAngleDeg, altSpreadCoh; + + aziRad = (float) aziDeg * PI_OVER_180; + eleRad = (float) eleDeg * PI_OVER_180; + doaVectorX = cosf( aziRad ) * cosf( eleRad ); + spatialAngleDeg = acosf( doaVectorX ) * _180_OVER_PI; + altSpreadCoh = 1.0f - ( spatialAngleDeg / 30.0f ); + spreadCoh = max( spreadCoh, altSpreadCoh ); + } + + getDirectPartGains( bin, aziDeg, eleDeg, &lRealp, &lImagp, &rRealp, &rImagp, hDiracDecBin->renderStereoOutputInsteadOfBinaural, Rmat, &gainCache[gainCacheBaseIndex], isHeadtracked ); + + if ( hDiracDecBin->renderStereoOutputInsteadOfBinaural ) + { + /* Synthesizing spread coherence is not needed for stereo loudspeaker output, + * as directional sound is reproduced with two loudspeakers in any case */ + spreadCoh = 0.0f; + } + + if ( spreadCoh > 0.0f ) + { + float centerMul, sidesMul; + float hrtfEneCenter, hrtfEneSides, hrtfEneRealized, eneCorrectionFactor; + float w1, w2, w3, eq; + + hrtfEneCenter = ( lRealp * lRealp ) + ( lImagp * lImagp ) + ( rRealp * rRealp ) + ( rImagp * rImagp ); + + /* Spread coherence is synthesized as coherent sources at 30 degree horizontal spacing. + * The following formulas determine the gains for these sources. + * spreadCoh = 0: Only panning + * spreadCoh = 0.5: Three sources coherent panning (e.g. 30 0 -30 deg azi) + * spreadCoh = 1.0: Two sources coherent panning with gap (as above, but center is silent) */ + if ( spreadCoh < 0.5f ) + { + /* 0.0f < spreadCoh < 0.5f */ + sidesMul = 0.5774f * spreadCoh * 2.0f; /* sqrt(1/3) = 0.5774f */ + centerMul = 1.0f - ( spreadCoh * 2.0f ) + sidesMul; + } + else + { + /* 0.5f <= spreadCoh < 1.0f */ + centerMul = 2.0f - ( 2.0f * spreadCoh ); + sidesMul = inv_sqrt( centerMul + 2.0f ); + centerMul *= sidesMul; + } + + /* Apply the gain for the center source of the three coherent sources */ + lRealp *= centerMul; + lImagp *= centerMul; + rRealp *= centerMul; + rImagp *= centerMul; + + /* Apply the gain for the left source of the three coherent sources */ + getDirectPartGains( bin, aziDeg + 30, eleDeg, &lRealpTmp, &lImagpTmp, &rRealpTmp, &rImagpTmp, hDiracDecBin->renderStereoOutputInsteadOfBinaural, Rmat, &gainCache[gainCacheBaseIndex + 1], isHeadtracked ); + + hrtfEneSides = ( lRealpTmp * lRealpTmp ) + ( lImagpTmp * lImagpTmp ) + ( rRealpTmp * rRealpTmp ) + ( rImagpTmp * rImagpTmp ); + lRealp += sidesMul * lRealpTmp; + lImagp += sidesMul * lImagpTmp; + rRealp += sidesMul * rRealpTmp; + rImagp += sidesMul * rImagpTmp; + + /* Apply the gain for the right source of the three coherent sources. + * -30 degrees to 330 wrapping due to internal functions. */ + getDirectPartGains( bin, aziDeg + 330, eleDeg, &lRealpTmp, &lImagpTmp, &rRealpTmp, &rImagpTmp, hDiracDecBin->renderStereoOutputInsteadOfBinaural, Rmat, &gainCache[gainCacheBaseIndex + 2], isHeadtracked ); + hrtfEneSides += ( lRealpTmp * lRealpTmp ) + ( lImagpTmp * lImagpTmp ) + ( rRealpTmp * rRealpTmp ) + ( rImagpTmp * rImagpTmp ); + lRealp += sidesMul * lRealpTmp; + lImagp += sidesMul * lImagpTmp; + rRealp += sidesMul * rRealpTmp; + rImagp += sidesMul * rImagpTmp; + + /* Formulate an eneCorrectionFactor that compensates for the coherent summation of the HRTFs */ + hrtfEneRealized = ( lRealp * lRealp ) + ( lImagp * lImagp ) + ( rRealp * rRealp ) + ( rImagp * rImagp ); + eneCorrectionFactor = ( ( hrtfEneSides * sidesMul * sidesMul ) + + ( hrtfEneCenter * centerMul * centerMul ) ) / + max( 1e-12f, hrtfEneRealized ); + + /* Weighting factors to determine appropriate target spectrum for spread coherent sound */ + if ( spreadCoh < 0.5 ) + { + w1 = 1.0f - 2.0f * spreadCoh; + w2 = 2.0f * spreadCoh; + w3 = 0.0f; + } + else + { + w1 = 0.0f; + w2 = 2.0f - 2.0f * spreadCoh; + w3 = 2.0f * spreadCoh - 1.0f; + } + + if ( ( ivas_format == MC_FORMAT && mc_mode == MC_MODE_MCMASA ) ) + { + idx = min( bin, MASA_NUM_DEFINED_SUR_SPR_COH_ENE_BINS - 1 ); + + /* Apply the target spectrum to the eneCorrectionFactor */ + if ( separateCenterChannelRendering ) /* spreadCoh mostly originates from phantom sources in separate channel rendering mode */ + { + eneCorrectionFactor *= w1 * 1.0f + ( w2 + w3 ) * spreadCohEne1[idx]; + } + else + { + eneCorrectionFactor *= w1 * 1.0f + w2 * spreadCohEne05[idx] + w3 * spreadCohEne1[idx]; + } + } + + /* Equalize the spread coherent combined HRTFs */ + eq = min( 4.0f, sqrtf( eneCorrectionFactor ) ); + lRealp *= eq; + lImagp *= eq; + rRealp *= eq; + rImagp *= eq; + } + + hrtfEne[0] = ( lRealp * lRealp ) + ( lImagp * lImagp ); + hrtfEne[1] = ( rRealp * rRealp ) + ( rImagp * rImagp ); + hrtfCrossRe = ( lRealp * rRealp ) + ( lImagp * rImagp ); + hrtfCrossIm = ( -lImagp * rRealp ) + ( lRealp * rImagp ); + + /* Add direct part (1 or 2) covariance matrix */ + dirEne = ratio * meanEnePerCh; + hDiracDecBin->ChEneOut[0][bin] += dirEne * hrtfEne[0]; /* Dir ene part*/ + hDiracDecBin->ChEneOut[1][bin] += dirEne * hrtfEne[1]; + hDiracDecBin->ChCrossReOut[bin] += dirEne * hrtfCrossRe; /* Dir cross re */ + hDiracDecBin->ChCrossImOut[bin] += dirEne * hrtfCrossIm; /* Dir cross im */ + } + + /* Add diffuse / ambient part covariance matrix */ + diffuseness = max( 0.0f, diffuseness ); + diffEne = diffuseness * meanEnePerCh; + surCoh = hSpatParamRendCom->surroundingCoherence[dirac_read_idx][bin]; + + diffusenessValForDecorrelationReduction = max( 0.0f, diffusenessValForDecorrelationReduction ); + diffEneValForDecorrelationReduction = diffusenessValForDecorrelationReduction * meanEnePerCh; + + if ( ( ivas_format == MC_FORMAT && mc_mode == MC_MODE_MCMASA ) ) + { + if ( !hDiracDecBin->renderStereoOutputInsteadOfBinaural ) + { + float spectrumModVal; + + idx = min( bin, MASA_NUM_DEFINED_SUR_SPR_COH_ENE_BINS - 1 ); + /* Apply target spectrum that emphasizes low frequencies when the sound is surround coherent */ + spectrumModVal = ( 1.0f - surCoh ) + surCoh * surCohEne[idx]; + diffEne *= spectrumModVal; + + /* Modify also the value for decorrelation reduction */ + diffEneValForDecorrelationReduction *= spectrumModVal; + } + } + hDiracDecBin->ChEneOut[0][bin] += diffEne; /* Diff ene part*/ + hDiracDecBin->ChEneOut[1][bin] += diffEne; + + if ( hDiracDecBin->renderStereoOutputInsteadOfBinaural ) + { + /* When rendering stereo, ambience (except for surround coherent sound) has zero ICC. */ + hDiracDecBin->ChCrossReOut[bin] += surCoh * diffEne; + } + else /* When rendering binaural, ambience has frequency dependent ICC. */ + { + if ( ( ivas_format == SBA_FORMAT || ivas_format == SBA_ISM_FORMAT ) && bin < BINAURAL_COHERENCE_DIFFERENCE_BINS ) + { + float diffuseFieldCoherence; + diffuseFieldCoherence = hDiracDecBin->hDiffuseDist->diffuseRatioX[bin] * hDiracDecBin->diffuseFieldCoherenceX[bin] + hDiracDecBin->hDiffuseDist->diffuseRatioY[bin] * hDiracDecBin->diffuseFieldCoherenceY[bin] + hDiracDecBin->hDiffuseDist->diffuseRatioZ[bin] * hDiracDecBin->diffuseFieldCoherenceZ[bin]; + hDiracDecBin->ChCrossReOut[bin] += ( ( 1.0f - surCoh ) * diffuseFieldCoherence + surCoh ) * diffEne; + } + else + { + hDiracDecBin->ChCrossReOut[bin] += ( ( 1.0f - surCoh ) * hDiracDecBin->diffuseFieldCoherence[bin] + surCoh ) * diffEne; + } + } + + /* Store parameters for formulating average diffuseness over frame */ + hDiracDecBin->frameMeanDiffuseness[bin] += diffEneValForDecorrelationReduction; + frameMeanDiffusenessEneWeight[bin] += meanEnePerCh; + } + + /* Formulate average diffuseness over frame */ + for ( bin = 0; bin < nBins; bin++ ) + { + hDiracDecBin->frameMeanDiffuseness[bin] /= fmaxf( 1e-12f, frameMeanDiffusenessEneWeight[bin] ); + } + + /* Temporal IIR-type smoothing of covariance matrices. Also apply encoding quality based smoothing factor. */ + if ( ivas_format == MASA_FORMAT && ivas_total_brate < MASA_STEREO_MIN_BITRATE ) + { + IIReneLimiterFactor = 16.0f + ( 1.0f - qualityBasedSmFactor ); + } + else + { + IIReneLimiterFactor = 8.0f + ( 1.0f - qualityBasedSmFactor ); + } + for ( bin = 0; bin < nBins; bin++ ) + { + float eneRatio, IIReneLimiter; + + /* Temporally smooth cov mtx estimates for resulting mixing matrix stability. The design principle is that + * the energy history (IIR) must not be more than double of the current frame energy. This provides more + * robust performance at energy offsets when compared to typical IIR averaging. */ + eneRatio = ( hDiracDecBin->ChEne[0][bin] + hDiracDecBin->ChEne[1][bin] ) / fmaxf( 1e-12f, ( hDiracDecBin->ChEnePrev[0][bin] + hDiracDecBin->ChEnePrev[1][bin] ) ); + IIReneLimiter = fminf( 1.0f, eneRatio * IIReneLimiterFactor ); + + hDiracDecBin->ChCrossRe[bin] *= qualityBasedSmFactor; + hDiracDecBin->ChCrossIm[bin] *= qualityBasedSmFactor; + hDiracDecBin->ChCrossReOut[bin] *= qualityBasedSmFactor; + hDiracDecBin->ChCrossImOut[bin] *= qualityBasedSmFactor; + + for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + hDiracDecBin->ChEne[ch][bin] *= qualityBasedSmFactor; + hDiracDecBin->ChEneOut[ch][bin] *= qualityBasedSmFactor; + } + + hDiracDecBin->ChCrossRe[bin] += IIReneLimiter * hDiracDecBin->ChCrossRePrev[bin]; + hDiracDecBin->ChCrossIm[bin] += IIReneLimiter * hDiracDecBin->ChCrossImPrev[bin]; + hDiracDecBin->ChCrossReOut[bin] += IIReneLimiter * hDiracDecBin->ChCrossReOutPrev[bin]; + hDiracDecBin->ChCrossImOut[bin] += IIReneLimiter * hDiracDecBin->ChCrossImOutPrev[bin]; + + for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + hDiracDecBin->ChEne[ch][bin] += IIReneLimiter * hDiracDecBin->ChEnePrev[ch][bin]; + hDiracDecBin->ChEneOut[ch][bin] += IIReneLimiter * hDiracDecBin->ChEneOutPrev[ch][bin]; + } + + /* Store energy values and coefficients for next round */ + hDiracDecBin->ChCrossRePrev[bin] = hDiracDecBin->ChCrossRe[bin]; + hDiracDecBin->ChCrossImPrev[bin] = hDiracDecBin->ChCrossIm[bin]; + hDiracDecBin->ChCrossReOutPrev[bin] = hDiracDecBin->ChCrossReOut[bin]; + hDiracDecBin->ChCrossImOutPrev[bin] = hDiracDecBin->ChCrossImOut[bin]; + + for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + hDiracDecBin->ChEnePrev[ch][bin] = hDiracDecBin->ChEne[ch][bin]; + hDiracDecBin->ChEneOutPrev[ch][bin] = hDiracDecBin->ChEneOut[ch][bin]; + } + } + + return; +} + +static void ivas_dirac_dec_binaural_determine_processing_matrices( + DIRAC_DEC_BIN_HANDLE hDiracDecBin, + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, + PARAMBIN_REND_CONFIG_HANDLE hConfig, + const int16_t max_band_decorr, + float Rmat[3][3], + const int16_t subframe, + const int16_t isHeadtracked, + const int16_t nchanSeparateChannels, + const MASA_ISM_DATA_HANDLE hMasaIsmData ) +{ + int16_t chA, chB, bin; + int16_t separateCenterChannelRendering; + int16_t nBins; + int16_t dirac_read_idx; + PARAMBIN_HRTF_GAIN_CACHE gainCache[MAX_NUM_OBJECTS]; + int16_t idx; + ISM_MODE ism_mode; + IVAS_FORMAT ivas_format; + MC_MODE mc_mode; + int32_t ivas_total_brate; + int16_t nchan_transport; + + ivas_format = hConfig->ivas_format; + separateCenterChannelRendering = nchanSeparateChannels > 0; + mc_mode = hConfig->mc_mode; + ivas_total_brate = hConfig->ivas_total_brate; + nchan_transport = hConfig->nchan_transport; + nBins = hSpatParamRendCom->num_freq_bands; /* Actually bins */ + + ism_mode = hConfig->ism_mode; + + dirac_read_idx = hSpatParamRendCom->render_to_md_map[subframe]; + + for ( idx = 0; idx < MAX_NUM_OBJECTS; idx++ ) + { + gainCache[idx].azi = -1000; /* Use -1000 as value for uninitialized cache. */ + } + + for ( bin = 0; bin < nBins; bin++ ) + { + float tmpMtxRe[BINAURAL_CHANNELS][BINAURAL_CHANNELS], tmpMtxIm[BINAURAL_CHANNELS][BINAURAL_CHANNELS], resultMtxRe[BINAURAL_CHANNELS][BINAURAL_CHANNELS], resultMtxIm[BINAURAL_CHANNELS][BINAURAL_CHANNELS], gain; + float CxRe[BINAURAL_CHANNELS][BINAURAL_CHANNELS], CxIm[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; /* Input covariance matrix */ + float realizedOutputEne, targetOutputEne, missingOutputEne; + float CrEneL, CrEneR; /* Cr = residual decorrelated sound covariance matrix */ + float CrCrossRe, CrCrossIm; + float Mre[BINAURAL_CHANNELS][BINAURAL_CHANNELS], Mim[BINAURAL_CHANNELS][BINAURAL_CHANNELS], MdecRe[BINAURAL_CHANNELS][BINAURAL_CHANNELS], MdecIm[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; /* M = mixing matrix; Mdec = residual decorrelated signal mixing matrix */ + float prototypeMtx[BINAURAL_CHANNELS][BINAURAL_CHANNELS] = { { 1.0f, 0.05f }, { 0.05f, 1.0f } }; /* Prototype matrix determines a reference signal in mixing matrix determination */ + + CrEneL = 0.0f; + CrEneR = 0.0f; + + /* Formulate main processing matrix M */ + formulate2x2MixingMatrix( hDiracDecBin->ChEne[0][bin], hDiracDecBin->ChEne[1][bin], + hDiracDecBin->ChCrossRe[bin], hDiracDecBin->ChCrossIm[bin], + hDiracDecBin->ChEneOut[0][bin], hDiracDecBin->ChEneOut[1][bin], + hDiracDecBin->ChCrossReOut[bin], hDiracDecBin->ChCrossImOut[bin], + prototypeMtx, Mre, Mim, hDiracDecBin->reqularizationFactor ); + + /* Load estimated covariance matrix to the [2][2] matrix form */ + CxRe[0][0] = hDiracDecBin->ChEne[0][bin]; + CxRe[1][1] = hDiracDecBin->ChEne[1][bin]; + CxRe[1][0] = hDiracDecBin->ChCrossRe[bin]; + CxRe[0][1] = hDiracDecBin->ChCrossRe[bin]; + CxIm[0][0] = 0.0f; + CxIm[1][1] = 0.0f; + CxIm[1][0] = hDiracDecBin->ChCrossIm[bin]; + CxIm[0][1] = -hDiracDecBin->ChCrossIm[bin]; + + /* Make matrix multiplication M*Cx*M' to determine resulting covariance matrix of processing input with M */ + matrixMul( Mre, Mim, CxRe, CxIm, tmpMtxRe, tmpMtxIm ); + matrixTransp2Mul( tmpMtxRe, tmpMtxIm, Mre, Mim, resultMtxRe, resultMtxIm ); + + /* When below the frequency limit where decorrelation is applied, we inject the decorrelated + * residual (or missing) signal component. The procedure is active when there are not enough independent + * signal energy to synthesize a signal with the target covariance matrix from the non-decorrelated signals */ + if ( bin < max_band_decorr ) + { + float decorrelationReductionFactor; + + /* Subtract the resulting covariance matrix from the target covariance matrix to determine + * what signal component is missing. The result is the target covariance matrix for the residual signal, i.e., + * a residual covariance matrix. */ + CrEneL = max( 0.0f, hDiracDecBin->ChEneOut[0][bin] - resultMtxRe[0][0] ); + CrEneR = max( 0.0f, hDiracDecBin->ChEneOut[1][bin] - resultMtxRe[1][1] ); + CrCrossRe = hDiracDecBin->ChCrossReOut[bin] - resultMtxRe[1][0]; + CrCrossIm = hDiracDecBin->ChCrossImOut[bin] - resultMtxIm[1][0]; + + /* The amount of the decorrelated sound is further controlled based on the spatial metadata, + * by determining an energy-suppressed residual covariance matrix that is a control parameter + * that guides the processing of the decorrelated sound to a residual signal. + * The procedure improves quality in e.g. double-talk 2-direction rendering situations.*/ + if ( ivas_format == MASA_FORMAT && ivas_total_brate < MASA_STEREO_MIN_BITRATE ) + { + decorrelationReductionFactor = 1.0f; + } + else if ( ( ivas_format == MC_FORMAT && mc_mode == MC_MODE_MCMASA ) || ( ivas_format == MASA_FORMAT && nchan_transport == 1 ) ) + { + decorrelationReductionFactor = sqrtf( fmaxf( 0.0f, hDiracDecBin->frameMeanDiffuseness[bin] ) ); + } + else if ( ( ivas_format == SBA_FORMAT || ivas_format == SBA_ISM_FORMAT ) && nchan_transport == 1 ) + { + decorrelationReductionFactor = 1.0f; + } + else + { + decorrelationReductionFactor = fmaxf( 0.0f, hDiracDecBin->frameMeanDiffuseness[bin] ); + } + CrEneL *= decorrelationReductionFactor; + CrEneR *= decorrelationReductionFactor; + CrCrossRe *= decorrelationReductionFactor; + CrCrossIm *= decorrelationReductionFactor; + + /* Determine a residual mixing matrix Mdec for processing the decorrelated signal to obtain + * the residual signal (that has the residual covariance matrix) */ + formulate2x2MixingMatrix( hDiracDecBin->ChEne[0][bin], hDiracDecBin->ChEne[1][bin], + 0.0f, 0.0f, /* Decorrelated signal has ideally no cross-terms */ + CrEneL, CrEneR, + CrCrossRe, CrCrossIm, + prototypeMtx, MdecRe, MdecIm, 0.2f ); + } + else + { + for ( chA = 0; chA < BINAURAL_CHANNELS; chA++ ) + { + set_zero( MdecRe[chA], BINAURAL_CHANNELS ); + set_zero( MdecIm[chA], BINAURAL_CHANNELS ); + } + } + + /* The regularizations at determining mixing matrices cause signal energy to be lost to some degree, which is compensated for here */ + realizedOutputEne = CrEneL + CrEneR + resultMtxRe[0][0] + resultMtxRe[1][1]; + targetOutputEne = hDiracDecBin->ChEneOut[0][bin] + hDiracDecBin->ChEneOut[1][bin]; + missingOutputEne = fmaxf( 0.0f, targetOutputEne - realizedOutputEne ); + + gain = sqrtf( ( resultMtxRe[0][0] + resultMtxRe[1][1] + missingOutputEne ) / + fmaxf( 1e-12f, resultMtxRe[0][0] + resultMtxRe[1][1] ) ); + gain = fminf( 4.0f, gain ); + + for ( chA = 0; chA < BINAURAL_CHANNELS; chA++ ) + { + for ( chB = 0; chB < BINAURAL_CHANNELS; chB++ ) + { + Mre[chA][chB] *= gain; + Mim[chA][chB] *= gain; + } + } + + /* Store processing matrices */ + for ( chA = 0; chA < BINAURAL_CHANNELS; chA++ ) + { + for ( chB = 0; chB < BINAURAL_CHANNELS; chB++ ) + { + hDiracDecBin->processMtxRePrev[chA][chB][bin] = hDiracDecBin->processMtxRe[chA][chB][bin]; + hDiracDecBin->processMtxImPrev[chA][chB][bin] = hDiracDecBin->processMtxIm[chA][chB][bin]; + hDiracDecBin->processMtxDecRePrev[chA][chB][bin] = hDiracDecBin->processMtxDecRe[chA][chB][bin]; + hDiracDecBin->processMtxDecImPrev[chA][chB][bin] = hDiracDecBin->processMtxDecIm[chA][chB][bin]; + + hDiracDecBin->processMtxRe[chA][chB][bin] = Mre[chA][chB]; + hDiracDecBin->processMtxIm[chA][chB][bin] = Mim[chA][chB]; + hDiracDecBin->processMtxDecRe[chA][chB][bin] = MdecRe[chA][chB]; + hDiracDecBin->processMtxDecIm[chA][chB][bin] = MdecIm[chA][chB]; + } + } + + if ( separateCenterChannelRendering ) + { + /* The rendering of the separate center channel in masa + mono mode. + * The center channel is processed with a gain factor 0.8414f to match the loudness of different processing paths */ + float lRealp, lImagp, rRealp, rImagp; + float gainFactor; + int16_t aziDeg = 0; + int16_t eleDeg = 0; + uint8_t instantChange = 0; + + if ( ivas_format == MASA_ISM_FORMAT ) + { + gainFactor = 0.7943f * sqrtf( hDiracDecBin->earlyPartEneCorrection[bin] ); + } + else + { + gainFactor = 0.8414f * sqrtf( hDiracDecBin->earlyPartEneCorrection[bin] ); + } + + for ( chB = 0; chB < nchanSeparateChannels; chB++ ) + { + if ( ivas_format == MASA_ISM_FORMAT ) + { + if ( ism_mode == ISM_MASA_MODE_DISC ) + { + aziDeg = hMasaIsmData->azimuth_ism[chB][dirac_read_idx]; + eleDeg = hMasaIsmData->elevation_ism[chB][dirac_read_idx]; + } + else + { + aziDeg = hMasaIsmData->azimuth_separated_ism[dirac_read_idx]; + eleDeg = hMasaIsmData->elevation_separated_ism[dirac_read_idx]; + instantChange = 1; + } + } + + for ( chA = 0; chA < BINAURAL_CHANNELS; chA++ ) + { + hDiracDecBin->processMtxRePrev[chA][chB + 2][bin] = hDiracDecBin->processMtxRe[chA][chB + 2][bin]; + hDiracDecBin->processMtxImPrev[chA][chB + 2][bin] = hDiracDecBin->processMtxIm[chA][chB + 2][bin]; + } + + getDirectPartGains( bin, aziDeg, eleDeg, &lRealp, &lImagp, &rRealp, &rImagp, hDiracDecBin->renderStereoOutputInsteadOfBinaural, Rmat, &gainCache[chB], isHeadtracked ); + + hDiracDecBin->processMtxRe[0][chB + 2][bin] = lRealp * gainFactor; + hDiracDecBin->processMtxIm[0][chB + 2][bin] = lImagp * gainFactor; + hDiracDecBin->processMtxRe[1][chB + 2][bin] = rRealp * gainFactor; + hDiracDecBin->processMtxIm[1][chB + 2][bin] = rImagp * gainFactor; + + if ( instantChange ) + { + for ( chA = 0; chA < BINAURAL_CHANNELS; chA++ ) + { + hDiracDecBin->processMtxRePrev[chA][chB + 2][bin] = hDiracDecBin->processMtxRe[chA][chB + 2][bin]; + hDiracDecBin->processMtxImPrev[chA][chB + 2][bin] = hDiracDecBin->processMtxIm[chA][chB + 2][bin]; + } + } + } + } + } + + return; +} + + +static void ivas_dirac_dec_binaural_process_output( + DIRAC_DEC_BIN_HANDLE hDiracDecBin, + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, + HANDLE_CLDFB_FILTER_BANK cldfbSynDec[MAX_OUTPUT_CHANNELS], + float *output_f[], + float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + const int16_t max_band_decorr, + const int16_t numInChannels, + const int16_t processReverb, + const int16_t subframe +) +{ + int16_t slot, bin, chA, chB; + int16_t nBins; + float outSlotRe[CLDFB_NO_CHANNELS_MAX], outSlotIm[CLDFB_NO_CHANNELS_MAX]; + float decSlotRe[BINAURAL_CHANNELS][CLDFB_NO_CHANNELS_MAX], decSlotIm[BINAURAL_CHANNELS][CLDFB_NO_CHANNELS_MAX]; + float reverbRe[BINAURAL_CHANNELS][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + float reverbIm[BINAURAL_CHANNELS][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + float interpVal; + float *decSlotRePointer; + float *decSlotImPointer; + int16_t offsetSamples; + int16_t nSlots; + + nBins = hSpatParamRendCom->num_freq_bands; + offsetSamples = 0; + nSlots = hSpatParamRendCom->subframe_nbslots[subframe]; + + if ( processReverb ) + { + /* Process second / room effect part of binaural output when needed */ + ivas_binaural_reverb_processSubframe( hDiracDecBin->hReverb, numInChannels, nSlots, inRe, inIm, reverbRe, reverbIm ); + } + + interpVal = 0.0f; + for ( slot = 0; slot < nSlots; slot++ ) + { + interpVal += 1.0f / (float) nSlots; + if ( !hDiracDecBin->useTdDecorr && max_band_decorr > 0 ) + { + ivas_dirac_dec_decorrelate_slot( hDiracDecBin, nBins, slot, inRe, inIm, decSlotRe, decSlotIm ); + } + + for ( chA = 0; chA < BINAURAL_CHANNELS; chA++ ) + { + float *outSlotRePr, *outSlotImPr; /* Pointers needed for function call compatibility */ + + set_zero( outSlotRe, CLDFB_NO_CHANNELS_MAX ); + set_zero( outSlotIm, CLDFB_NO_CHANNELS_MAX ); + + /* Processing of the first / HRTF part of the binaural output. */ + for ( chB = 0; chB < numInChannels; chB++ ) + { + if ( chB < BINAURAL_CHANNELS ) + { + /* Decorrelator signal for TD decorrelation is stored in two input channels above the two normal inputs. + * It should be noted that TD decorrelation is used only in cases where numInChannels is 2. If this + * changes, additional adjustments are required. When using CLDFB decorrelator, we simply assign the + * pointers to buffers. */ + if ( hDiracDecBin->useTdDecorr ) + { + decSlotRePointer = inRe[chB + 2][slot]; + decSlotImPointer = inIm[chB + 2][slot]; + } + else + { + decSlotRePointer = decSlotRe[chB]; + decSlotImPointer = decSlotIm[chB]; + } + } + else + { + decSlotRePointer = NULL; /* below these pointers are used only for chB < 2 */ + decSlotImPointer = NULL; + } + + + for ( bin = 0; bin < nBins; bin++ ) + { + float gain; + + /* Mixing using the formulated processing matrix M */ + gain = ( 1.0f - interpVal ) * hDiracDecBin->processMtxRePrev[chA][chB][bin] + + interpVal * hDiracDecBin->processMtxRe[chA][chB][bin]; + outSlotRe[bin] += gain * inRe[chB][slot][bin]; + outSlotIm[bin] += gain * inIm[chB][slot][bin]; + + gain = ( 1.0f - interpVal ) * hDiracDecBin->processMtxImPrev[chA][chB][bin] + + interpVal * hDiracDecBin->processMtxIm[chA][chB][bin]; + outSlotRe[bin] -= gain * inIm[chB][slot][bin]; + outSlotIm[bin] += gain * inRe[chB][slot][bin]; + + /* Mixing decorrelated signals using the formulated residual processing matrix Mdec */ + if ( bin < max_band_decorr && chB < 2 ) + { + gain = ( 1.0f - interpVal ) * hDiracDecBin->processMtxDecRePrev[chA][chB][bin] + + interpVal * hDiracDecBin->processMtxDecRe[chA][chB][bin]; + outSlotRe[bin] += gain * decSlotRePointer[bin]; + outSlotIm[bin] += gain * decSlotImPointer[bin]; + + gain = ( 1.0f - interpVal ) * hDiracDecBin->processMtxDecImPrev[chA][chB][bin] + + interpVal * hDiracDecBin->processMtxDecIm[chA][chB][bin]; + outSlotRe[bin] -= gain * decSlotImPointer[bin]; + outSlotIm[bin] += gain * decSlotRePointer[bin]; + } + } + } + + if ( processReverb ) + { + /* Combine second (reverb) part with the first (HRTF) part to obtain binaural output signal with room effect */ + v_add( outSlotRe, reverbRe[chA][slot], outSlotRe, CLDFB_NO_CHANNELS_MAX ); + v_add( outSlotIm, reverbIm[chA][slot], outSlotIm, CLDFB_NO_CHANNELS_MAX ); + } + + outSlotRePr = &( outSlotRe[0] ); + outSlotImPr = &( outSlotIm[0] ); + + /* Inverse filter bank */ + cldfbSynthesis( &outSlotRePr, &outSlotImPr, &( output_f[chA][nBins * slot + offsetSamples] ), nBins, cldfbSynDec[chA] ); + } + } + + return; +} + + +static void adaptTransportSignalsHeadtracked( + COMBINED_ORIENTATION_HANDLE hHeadTrackData, + float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + const int16_t nBins, + const int16_t nSlots, + float Rmat[3][3] ) +{ + int16_t slot, ch, bin, louderCh; + float ILD, mono_factor_ILD, mono_factor_rotation, mono_factor, y_val, ene_proc, ene_target; + int16_t max_band; + float eqVal; + int16_t band_idx, bin_lo, bin_hi; + + /* Determine head-orientation-based mono factor. + Rmat[1][1] entry informs how close the ears are aligned according to transport signals. */ + y_val = 1.0f - fabsf( Rmat[1][1] ); + mono_factor_rotation = ( y_val - ADAPT_HTPROTO_ROT_LIM_0 ) / ( ADAPT_HTPROTO_ROT_LIM_1 - ADAPT_HTPROTO_ROT_LIM_0 ); + mono_factor_rotation = fmaxf( 0.0f, fminf( 1.0f, mono_factor_rotation ) ); + + /* Adapt transport signals in frequency bands */ + /* optimization grouping CLDFB bins into MASA bands (they are readily available in ROM and suitable for the task) AND group CLDFB slots into sub-frames */ + + max_band = 0; + while ( max_band < MASA_FREQUENCY_BANDS && MASA_band_grouping_24[max_band] < nBins ) + { + max_band++; + } + + for ( band_idx = 0; band_idx < max_band; band_idx++ ) + { + float ch_nrg[2]; /* storage for input signal channel energies */ + bin_lo = MASA_band_grouping_24[band_idx]; + bin_hi = min( MASA_band_grouping_24[band_idx + 1], (int16_t) nBins ); + for ( ch = 0; ch < 2; ch++ ) + { + ch_nrg[ch] = 0.0f; + for ( slot = 0; slot < nSlots; slot++ ) + { + for ( bin = bin_lo; bin < bin_hi; bin++ ) + { + ch_nrg[ch] += ( inRe[ch][slot][bin] * inRe[ch][slot][bin] ) + ( inIm[ch][slot][bin] * inIm[ch][slot][bin] ); + } + } + hHeadTrackData->chEneIIR[ch][band_idx] *= ADAPT_HTPROTO_IIR_FAC; + hHeadTrackData->chEneIIR[ch][band_idx] += ( 1.0f - ADAPT_HTPROTO_IIR_FAC ) * ch_nrg[ch]; + } + + /* Determine ILD */ + ILD = fabsf( 10.0f * log10f( fmaxf( 1e-12f, hHeadTrackData->chEneIIR[0][band_idx] ) / fmaxf( 1e-12f, hHeadTrackData->chEneIIR[1][band_idx] ) ) ); + if ( hHeadTrackData->chEneIIR[1][band_idx] > hHeadTrackData->chEneIIR[0][band_idx] ) + { + louderCh = 1; + } + else + { + louderCh = 0; + } + + /* Determine ILD-based mono factor */ + mono_factor_ILD = ( ILD - ADAPT_HTPROTO_ILD_LIM_DB0 ) / ( ADAPT_HTPROTO_ILD_LIM_DB1 - ADAPT_HTPROTO_ILD_LIM_DB0 ); + mono_factor_ILD = fmaxf( 0.0f, fminf( 1.0f, mono_factor_ILD ) ); + + /* Combine mono factors */ + mono_factor = mono_factor_ILD * mono_factor_rotation; + + /* Mix original audio and sum signal according to determined mono factor */ + for ( ch = 0; ch < 2; ch++ ) + { + if ( ch != louderCh ) + { + float band_nrg = 0.0f; + + for ( slot = 0; slot < nSlots; slot++ ) + { + for ( bin = bin_lo; bin < bin_hi; bin++ ) + { + /* mono sum signal with the computed weight + rest from the original channel */ + inRe[ch][slot][bin] = mono_factor * ( inRe[0][slot][bin] + inRe[1][slot][bin] ) + ( 1.0f - mono_factor ) * inRe[ch][slot][bin]; + inIm[ch][slot][bin] = mono_factor * ( inIm[0][slot][bin] + inIm[1][slot][bin] ) + ( 1.0f - mono_factor ) * inIm[ch][slot][bin]; + band_nrg += ( inRe[ch][slot][bin] * inRe[ch][slot][bin] ) + ( inIm[ch][slot][bin] * inIm[ch][slot][bin] ); + } + } + hHeadTrackData->procChEneIIR[ch][band_idx] *= ADAPT_HTPROTO_IIR_FAC; + hHeadTrackData->procChEneIIR[ch][band_idx] += ( 1.0f - ADAPT_HTPROTO_IIR_FAC ) * band_nrg; + } + else + { + /* processed signal is input. use the original channel, so no need to compute new signals or signal energy */ + hHeadTrackData->procChEneIIR[ch][band_idx] *= ADAPT_HTPROTO_IIR_FAC; + hHeadTrackData->procChEneIIR[ch][band_idx] += ( 1.0f - ADAPT_HTPROTO_IIR_FAC ) * ch_nrg[ch]; + } + } + + /* Equalize */ + ene_target = hHeadTrackData->chEneIIR[0][band_idx] + hHeadTrackData->chEneIIR[1][band_idx]; + ene_proc = hHeadTrackData->procChEneIIR[0][band_idx] + hHeadTrackData->procChEneIIR[1][band_idx]; + eqVal = fminf( 4.0f, sqrtf( ene_target / fmaxf( 1e-12f, ene_proc ) ) ); + + for ( slot = 0; slot < nSlots; slot++ ) + { + for ( ch = 0; ch < 2; ch++ ) + { + for ( bin = bin_lo; bin < bin_hi; bin++ ) + { + inRe[ch][slot][bin] *= eqVal; + inIm[ch][slot][bin] *= eqVal; + } + } + } + } + + return; +} + +static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked( + COMBINED_ORIENTATION_HANDLE hHeadTrackData, + float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + const int16_t nBins, + const int16_t nSlots, + float Rmat[3][3] ) +{ + int16_t slot, bin, ch; + float tmpVal; + + /* When not currently in prototype signal left-right switching procedure, check if such switching is needed */ + if ( hHeadTrackData->lrSwitchedNext == hHeadTrackData->lrSwitchedCurrent ) + { + float thresholdDotProduct = 0.17f; /* Corresponds to 10-degree switching threshold */ + if ( ( hHeadTrackData->lrSwitchedCurrent == 0 ) && ( Rmat[1][1] < -thresholdDotProduct ) ) + { + hHeadTrackData->lrSwitchedNext = 1; + } + if ( ( hHeadTrackData->lrSwitchedCurrent == 1 ) && ( Rmat[1][1] > thresholdDotProduct ) ) + { + hHeadTrackData->lrSwitchedNext = 0; + } + } + + /* When currently in interpolation */ + if ( hHeadTrackData->lrSwitchedNext != hHeadTrackData->lrSwitchedCurrent ) + { + for ( slot = 0; slot < nSlots; slot++ ) + { + float switchOrderFactor, origOrderFactor; + + hHeadTrackData->lrSwitchInterpVal += 0.0025f; /* Corresponds to 0.5 seconds interpolation time */ + + if ( hHeadTrackData->lrSwitchInterpVal > 0.999f ) + { + /* Stop interpolation, reset values */ + hHeadTrackData->lrSwitchInterpVal = 0.0f; + hHeadTrackData->lrSwitchedCurrent = hHeadTrackData->lrSwitchedNext; + } + + /* Gains for determining portion of switched channel order and original channel order */ + tmpVal = (float) hHeadTrackData->lrSwitchedNext * hHeadTrackData->lrSwitchInterpVal; + tmpVal += (float) hHeadTrackData->lrSwitchedCurrent * ( 1.0f - hHeadTrackData->lrSwitchInterpVal ); + switchOrderFactor = sqrtf( tmpVal ); + origOrderFactor = sqrtf( 1.0f - tmpVal ); + + for ( bin = 0; bin < nBins; bin++ ) + { + /* determine original order (1) signals and switched order (2) signals */ + float re1[BINAURAL_CHANNELS], re2[BINAURAL_CHANNELS], im1[BINAURAL_CHANNELS], im2[BINAURAL_CHANNELS]; + + for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + re1[ch] = inRe[ch][slot][bin] * origOrderFactor; + re2[ch] = inRe[1 - ch][slot][bin] * switchOrderFactor; + im1[ch] = inIm[ch][slot][bin] * origOrderFactor; + im2[ch] = inIm[1 - ch][slot][bin] * switchOrderFactor; + } + + for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + float eneRef, ene, eq; + + /* Interpolate / mix original and switched order signals */ + inRe[ch][slot][bin] = re1[ch] + re2[ch]; + inIm[ch][slot][bin] = im1[ch] + im2[ch]; + + /* Equalize interpolated signals to preserve energy per bin */ + eneRef = ( re1[ch] * re1[ch] ) + ( re2[ch] * re2[ch] ) + ( im1[ch] * im1[ch] ) + ( im2[ch] * im2[ch] ); + ene = ( inRe[ch][slot][bin] * inRe[ch][slot][bin] ) + ( inIm[ch][slot][bin] * inIm[ch][slot][bin] ); + eq = sqrtf( eneRef / fmaxf( 1e-12f, ene ) ); + eq = fminf( 4.0f, eq ); + inRe[ch][slot][bin] *= eq; + inIm[ch][slot][bin] *= eq; + } + } + } + } + else + { + /* If not in interpolation, but in switched prototype situation, then switch left and right channels */ + if ( hHeadTrackData->lrSwitchedCurrent == 1 ) + { + for ( slot = 0; slot < nSlots; slot++ ) + { + for ( bin = 0; bin < nBins; bin++ ) + { + tmpVal = inRe[0][slot][bin]; + inRe[0][slot][bin] = inRe[1][slot][bin]; + inRe[1][slot][bin] = tmpVal; + tmpVal = inIm[0][slot][bin]; + inIm[0][slot][bin] = inIm[1][slot][bin]; + inIm[1][slot][bin] = tmpVal; + } + } + } + } + + return; +} + + +static void eig2x2( + const float E1, + const float E2, + const float Cre, + const float Cim, + float Ure[BINAURAL_CHANNELS][BINAURAL_CHANNELS], + float Uim[BINAURAL_CHANNELS][BINAURAL_CHANNELS], + float D[BINAURAL_CHANNELS] ) +{ + int16_t chA, chB, ch; + float s, normVal, crossSquare, a, pm, add; + + for ( chA = 0; chA < BINAURAL_CHANNELS; chA++ ) + { + for ( chB = 0; chB < BINAURAL_CHANNELS; chB++ ) + { + Ure[chA][chB] = 0.0f; + Uim[chA][chB] = 0.0f; + } + } + + crossSquare = ( Cre * Cre ) + ( Cim * Cim ); + a = ( E1 + E2 ) * ( E1 + E2 ) - 4.0f * ( ( E1 * E2 ) - crossSquare ); + pm = 0.5f * sqrtf( max( 0.0f, a ) ); + add = 0.5f * ( E1 + E2 ); + + D[0] = add + pm; + D[1] = max( 0.0f, add - pm ); + + /* Numeric case, when input is practically zeros */ + if ( D[0] < 1e-12f ) + { + Ure[0][0] = 1.0f; + Ure[1][1] = 1.0f; + + return; + } + + /* Numeric case, when input is near an identity matrix with a gain */ + if ( pm < ( 1e-3f * add ) ) + { + Ure[0][0] = 1.0f; + Ure[1][1] = 1.0f; + + return; + } + + /* Eigenvectors */ + for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + if ( fabsf( E2 - D[ch] ) > fabsf( E1 - D[ch] ) ) + { + s = D[ch] - E2; + normVal = sqrtf( 1.0f / ( 1e-12f + crossSquare + s * s ) ); + + Ure[0][ch] = s * normVal; + Ure[1][ch] = Cre * normVal; + Uim[1][ch] = Cim * normVal; + } + else + { + s = D[ch] - E1; + normVal = sqrtf( 1.0f / ( 1e-12f + crossSquare + s * s ) ); + + Ure[1][ch] = s * normVal; + Ure[0][ch] = Cre * normVal; + Uim[0][ch] = -Cim * normVal; + } + } + + return; +} + + +static void matrixDiagMul( + float reIn[BINAURAL_CHANNELS][BINAURAL_CHANNELS], + float imIn[BINAURAL_CHANNELS][BINAURAL_CHANNELS], + const float D[BINAURAL_CHANNELS], + float reOut[BINAURAL_CHANNELS][BINAURAL_CHANNELS], + float imOut[BINAURAL_CHANNELS][BINAURAL_CHANNELS] ) +{ + int16_t chA, chB; + + for ( chA = 0; chA < BINAURAL_CHANNELS; chA++ ) + { + for ( chB = 0; chB < BINAURAL_CHANNELS; chB++ ) + { + reOut[chA][chB] = reIn[chA][chB] * D[chB]; + imOut[chA][chB] = imIn[chA][chB] * D[chB]; + } + } + + return; +} + + +static void matrixMul( + float Are[BINAURAL_CHANNELS][BINAURAL_CHANNELS], + float Aim[BINAURAL_CHANNELS][BINAURAL_CHANNELS], + float Bre[BINAURAL_CHANNELS][BINAURAL_CHANNELS], + float Bim[BINAURAL_CHANNELS][BINAURAL_CHANNELS], + float outRe[BINAURAL_CHANNELS][BINAURAL_CHANNELS], + float outIm[BINAURAL_CHANNELS][BINAURAL_CHANNELS] ) +{ + int16_t chA, chB; + + for ( chA = 0; chA < BINAURAL_CHANNELS; chA++ ) + { + for ( chB = 0; chB < BINAURAL_CHANNELS; chB++ ) + { + outRe[chA][chB] = Are[chA][0] * Bre[0][chB] + Are[chA][1] * Bre[1][chB]; + outRe[chA][chB] -= Aim[chA][0] * Bim[0][chB] + Aim[chA][1] * Bim[1][chB]; + outIm[chA][chB] = Aim[chA][0] * Bre[0][chB] + Aim[chA][1] * Bre[1][chB]; + outIm[chA][chB] += Are[chA][0] * Bim[0][chB] + Are[chA][1] * Bim[1][chB]; + } + } + + return; +} + + +static void matrixTransp1Mul( + float Are[BINAURAL_CHANNELS][BINAURAL_CHANNELS], + float Aim[BINAURAL_CHANNELS][BINAURAL_CHANNELS], + float Bre[BINAURAL_CHANNELS][BINAURAL_CHANNELS], + float Bim[BINAURAL_CHANNELS][BINAURAL_CHANNELS], + float outRe[BINAURAL_CHANNELS][BINAURAL_CHANNELS], + float outIm[BINAURAL_CHANNELS][BINAURAL_CHANNELS] ) +{ + int16_t chA, chB; + + for ( chA = 0; chA < BINAURAL_CHANNELS; chA++ ) + { + for ( chB = 0; chB < BINAURAL_CHANNELS; chB++ ) + { + outRe[chA][chB] = Are[0][chA] * Bre[0][chB] + Are[1][chA] * Bre[1][chB]; + outRe[chA][chB] -= -Aim[0][chA] * Bim[0][chB] - Aim[1][chA] * Bim[1][chB]; + outIm[chA][chB] = -Aim[0][chA] * Bre[0][chB] - Aim[1][chA] * Bre[1][chB]; + outIm[chA][chB] += Are[0][chA] * Bim[0][chB] + Are[1][chA] * Bim[1][chB]; + } + } + + return; +} + + +static void matrixTransp2Mul( + float Are[BINAURAL_CHANNELS][BINAURAL_CHANNELS], + float Aim[BINAURAL_CHANNELS][BINAURAL_CHANNELS], + float Bre[BINAURAL_CHANNELS][BINAURAL_CHANNELS], + float Bim[BINAURAL_CHANNELS][BINAURAL_CHANNELS], + float outRe[BINAURAL_CHANNELS][BINAURAL_CHANNELS], + float outIm[BINAURAL_CHANNELS][BINAURAL_CHANNELS] ) +{ + int16_t chA, chB; + + for ( chA = 0; chA < BINAURAL_CHANNELS; chA++ ) + { + for ( chB = 0; chB < BINAURAL_CHANNELS; chB++ ) + { + outRe[chA][chB] = Are[chA][0] * Bre[chB][0] + Are[chA][1] * Bre[chB][1]; + outRe[chA][chB] -= Aim[chA][0] * ( -Bim[chB][0] ) + Aim[chA][1] * ( -Bim[chB][1] ); + outIm[chA][chB] = Aim[chA][0] * Bre[chB][0] + Aim[chA][1] * Bre[chB][1]; + outIm[chA][chB] += Are[chA][0] * ( -Bim[chB][0] ) + Are[chA][1] * ( -Bim[chB][1] ); + } + } + + return; +} + + +static void chol2x2( + const float E1, + const float E2, + const float Cre, + const float Cim, + float outRe[BINAURAL_CHANNELS][BINAURAL_CHANNELS], + float outIm[BINAURAL_CHANNELS][BINAURAL_CHANNELS] ) +{ + int16_t chA, chB; + float sqrtVal; + + for ( chA = 0; chA < BINAURAL_CHANNELS; chA++ ) + { + for ( chB = 0; chB < BINAURAL_CHANNELS; chB++ ) + { + outRe[chA][chB] = 0.0f; + outIm[chA][chB] = 0.0f; + } + } + + if ( E1 > E2 ) /* Perform Cholesky decomposition according to louder channel first */ + { + outRe[0][0] = sqrtf( E1 ); + outRe[1][0] = Cre / ( 1e-12f + outRe[0][0] ); + outIm[1][0] = Cim / ( 1e-12f + outRe[0][0] ); + sqrtVal = E2 - ( Cre * Cre + Cim * Cim ) / ( 1e-12f + E1 ); + outRe[1][1] = sqrtf( max( 0.0f, sqrtVal ) ); + } + else + { + outRe[1][1] = sqrtf( E2 ); + outRe[0][1] = Cre / ( 1e-12f + outRe[1][1] ); + outIm[0][1] = -Cim / ( 1e-12f + outRe[1][1] ); + sqrtVal = E1 - ( Cre * Cre + Cim * Cim ) / ( 1e-12f + E2 ); + outRe[0][0] = sqrtf( max( 0.0f, sqrtVal ) ); + } + + return; +} + + +static void formulate2x2MixingMatrix( + float Ein1, + float Ein2, + float CinRe, + float CinIm, + float Eout1, + float Eout2, + float CoutRe, + float CoutIm, + float Q[BINAURAL_CHANNELS][BINAURAL_CHANNELS], + float Mre[BINAURAL_CHANNELS][BINAURAL_CHANNELS], + float Mim[BINAURAL_CHANNELS][BINAURAL_CHANNELS], + const float regularizationFactor ) +{ + /* + This function implements a 2x2 solution for an optimized spatial audio rendering algorithm + Vilkamo, J., Bäckström, T. and Kuntz, A., 2013. + "Optimized covariance domain framework for time–frequency processing of spatial audio." + Journal of the Audio Engineering Society, 61(6), pp.403-411. + + The result of the formulas below are the same as those in the publication, however, some + derivation details differ for as simple as possible 2x2 formulattion + */ + int16_t chA, chB; + float maxEne, maxEneDiv; + float KyRe[BINAURAL_CHANNELS][BINAURAL_CHANNELS], KyIm[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; + float Uxre[BINAURAL_CHANNELS][BINAURAL_CHANNELS], Uxim[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; + float Sx[BINAURAL_CHANNELS], Kxre[BINAURAL_CHANNELS][BINAURAL_CHANNELS], Kxim[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; + float tmpRe[BINAURAL_CHANNELS][BINAURAL_CHANNELS], tmpIm[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; + float Are[BINAURAL_CHANNELS][BINAURAL_CHANNELS], Aim[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; + float Ure[BINAURAL_CHANNELS][BINAURAL_CHANNELS], Uim[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; + float D[BINAURAL_CHANNELS]; + float div[BINAURAL_CHANNELS]; + float Ghat[BINAURAL_CHANNELS]; + float GhatQ[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; + float Pre[BINAURAL_CHANNELS][BINAURAL_CHANNELS], Pim[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; + + /* Normalize energy values */ + maxEne = Ein1; + maxEne = max( maxEne, Ein2 ); + maxEne = max( maxEne, Eout1 ); + maxEne = max( maxEne, Eout2 ); + maxEneDiv = 1.0f / ( maxEne + 1e-12f ); + Ein1 *= maxEneDiv; + Ein2 *= maxEneDiv; + CinRe *= maxEneDiv; + CinIm *= maxEneDiv; + Eout1 *= maxEneDiv; + Eout2 *= maxEneDiv; + CoutRe *= maxEneDiv; + CoutIm *= maxEneDiv; + + /* Cholesky decomposition of target / output covariance matrix */ + chol2x2( Eout1, Eout2, CoutRe, CoutIm, KyRe, KyIm ); + + /* Eigendecomposition of input covariance matrix */ + eig2x2( Ein1, Ein2, CinRe, CinIm, Uxre, Uxim, Sx ); + + /* Eigendecomposition to Kx -- Ux Sx Ux' -> Kx Kx'*/ + Sx[0] = sqrtf( Sx[0] ); + Sx[1] = sqrtf( Sx[1] ); + matrixDiagMul( Uxre, Uxim, Sx, Kxre, Kxim ); + + /* Regularize the diagonal Sx for matrix inversion */ + Sx[0] = max( Sx[0], regularizationFactor * Sx[1] ); + Sx[1] = max( Sx[1], regularizationFactor * Sx[0] ); + + /* This is equivalent to the prototype signal energy normalization in the publication */ + Ghat[0] = sqrtf( Eout1 / ( 1e-12f + max( Ein1, 0.001f * Ein2 ) ) ); + Ghat[1] = sqrtf( Eout2 / ( 1e-12f + max( Ein2, 0.001f * Ein1 ) ) ); + + /* Matrix multiplication, tmp = Ky' * G_hat * Q */ + for ( chA = 0; chA < BINAURAL_CHANNELS; chA++ ) + { + GhatQ[chA][0] = Q[chA][0] * Ghat[chA]; + GhatQ[chA][1] = Q[chA][1] * Ghat[chA]; + } + for ( chA = 0; chA < BINAURAL_CHANNELS; chA++ ) + { + for ( chB = 0; chB < BINAURAL_CHANNELS; chB++ ) + { + tmpRe[chA][chB] = KyRe[0][chA] * GhatQ[0][chB] + KyRe[1][chA] * GhatQ[1][chB]; + tmpIm[chA][chB] = -KyIm[0][chA] * GhatQ[0][chB] - KyIm[1][chA] * GhatQ[1][chB]; + } + } + + /* A = Ky' * G_hat * Q * Kx (see publication) */ + matrixMul( tmpRe, tmpIm, Kxre, Kxim, Are, Aim ); + + /* Find nearest orthonormal matrix P to A = Ky' * G_hat * Q * Kx + For matrix A that is P = A(A'A)^0.5 + */ + matrixTransp1Mul( Are, Aim, Are, Aim, tmpRe, tmpIm ); + + eig2x2( tmpRe[0][0], tmpRe[1][1], tmpRe[1][0], tmpIm[1][0], Ure, Uim, D ); + + div[0] = min( 10000.0f, sqrtf( 1.0f / ( 1e-12f + D[0] ) ) ); + div[1] = min( 10000.0f, sqrtf( 1.0f / ( 1e-12f + D[1] ) ) ); + + matrixMul( Are, Aim, Ure, Uim, tmpRe, tmpIm ); + + for ( chA = 0; chA < BINAURAL_CHANNELS; chA++ ) + { + for ( chB = 0; chB < BINAURAL_CHANNELS; chB++ ) + { + tmpRe[chA][chB] *= div[chB]; + tmpIm[chA][chB] *= div[chB]; + } + } + + matrixTransp2Mul( tmpRe, tmpIm, Ure, Uim, Pre, Pim ); /* Nearest orthonormal matrix P to matrix A formulated */ + + /* These are the final formulas of the JAES publication M = Ky P Kx^(-1) */ + for ( chA = 0; chA < BINAURAL_CHANNELS; chA++ ) + { + for ( chB = 0; chB < BINAURAL_CHANNELS; chB++ ) + { + Pre[chA][chB] /= Sx[chB] + 1e-12f; + Pim[chA][chB] /= Sx[chB] + 1e-12f; + } + } + + matrixMul( KyRe, KyIm, Pre, Pim, tmpRe, tmpIm ); + + matrixTransp2Mul( tmpRe, tmpIm, Uxre, Uxim, Mre, Mim ); + + return; +} + + +static void getDirectPartGains( + const int16_t bin, + int16_t aziDeg, + int16_t eleDeg, + float *lRealp, + float *lImagp, + float *rRealp, + float *rImagp, + const uint8_t renderStereoOutputInsteadOfBinaural, + float Rmat[3][3], + PARAMBIN_HRTF_GAIN_CACHE *gainCache, + const int16_t isHeadtracked ) +{ + float aziRad, eleRad; + float y, mappedX, aziRadMapped, A, A2, A3; + const float LsAngleRad = 30.0f * PI_OVER_180; + + if ( renderStereoOutputInsteadOfBinaural ) /* In stereo (i.e. non-binaural) rendering mode */ + { + /* Convert azi and ele to an azi value of the cone of confusion */ + aziRad = (float) aziDeg * PI_OVER_180; + eleRad = (float) eleDeg * PI_OVER_180; + y = ( sinf( aziRad ) * cosf( eleRad ) ); + mappedX = sqrtf( max( 0.0f, 1.0f - ( y * y ) ) ); + aziRadMapped = atan2f( y, mappedX ); + + /* Determine the real valued amplitude panning gains */ + *lImagp = 0.0f; + *rImagp = 0.0f; + if ( aziRadMapped >= LsAngleRad ) + { /* Left side */ + *lRealp = 1.0f; + *rRealp = 0.0f; + } + else if ( aziRadMapped <= -LsAngleRad ) + { /* Right side */ + *lRealp = 0.0f; + *rRealp = 1.0f; + } + else /* Tangent panning law */ + { + A = tanf( aziRadMapped ) / tanf( LsAngleRad ); + A2 = ( A - 1.0f ) / max( 0.001f, A + 1.0f ); + A3 = 1.0f / ( A2 * A2 + 1.0f ); + *lRealp = sqrtf( A3 ); + *rRealp = sqrtf( 1.0f - A3 ); + } + + /* Scaling to have the same expected gain as for the HRTF rendering */ + *lRealp *= SQRT2; + *rRealp *= SQRT2; + } + else /* In regular binaural rendering mode */ + { + if ( aziDeg == gainCache->azi && eleDeg == gainCache->ele ) + { + hrtfShGetHrtf( bin, aziDeg, eleDeg, lRealp, lImagp, rRealp, rImagp, gainCache, TRUE ); + } + else + { + gainCache->azi = aziDeg; + gainCache->ele = eleDeg; + if ( isHeadtracked ) + { + rotateAziEle( (float) aziDeg, (float) eleDeg, &aziDeg, &eleDeg, Rmat, 0 ); + } + hrtfShGetHrtf( bin, aziDeg, eleDeg, lRealp, lImagp, rRealp, rImagp, gainCache, FALSE ); + } + } + + return; +} + + +static void hrtfShGetHrtf( + const int16_t bin, + const int16_t aziDeg, + const int16_t eleDeg, + float *lRealp, + float *lImagp, + float *rRealp, + float *rImagp, + PARAMBIN_HRTF_GAIN_CACHE *gainCache, + const int16_t useCachedValue ) +{ + int16_t k; + + *lRealp = 0.0f; + *lImagp = 0.0f; + *rRealp = 0.0f; + *rImagp = 0.0f; + + if ( useCachedValue ) + { + float *shVec; + shVec = gainCache->shVec; + + for ( k = 0; k < HRTF_SH_CHANNELS; k++ ) + { + *lRealp += hrtfShCoeffsRe[0][k][bin] * shVec[k]; + *lImagp += hrtfShCoeffsIm[0][k][bin] * shVec[k]; + *rRealp += hrtfShCoeffsRe[1][k][bin] * shVec[k]; + *rImagp += hrtfShCoeffsIm[1][k][bin] * shVec[k]; + } + } + else + { + float shVec[HRTF_SH_CHANNELS]; + + ivas_dirac_dec_get_response( aziDeg, + eleDeg, + shVec, + HRTF_SH_ORDER ); + + for ( k = 0; k < HRTF_SH_CHANNELS; k++ ) + { + *lRealp += hrtfShCoeffsRe[0][k][bin] * shVec[k]; + *lImagp += hrtfShCoeffsIm[0][k][bin] * shVec[k]; + *rRealp += hrtfShCoeffsRe[1][k][bin] * shVec[k]; + *rImagp += hrtfShCoeffsIm[1][k][bin] * shVec[k]; + + gainCache->shVec[k] = shVec[k]; + } + } + + return; +} + + +/*------------------------------------------------------------------------- + * configure_reqularization_factor() + * + * Configure regularization factor for the mixing matrix generation of the + * parametric binauralizer using IVAS codec format and current bitrate. + *------------------------------------------------------------------------*/ + +/*! r: Configured reqularization factor value */ +float configure_reqularization_factor( + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const int32_t ivas_total_brate /* i : IVAS total bitrate */ +) +{ + float reqularizationFactor; + reqularizationFactor = 1.0f; /* Default value */ + + if ( ivas_format == MASA_FORMAT ) + { + if ( ivas_total_brate >= IVAS_160k ) + { + reqularizationFactor = 0.4f; + } + else if ( ivas_total_brate == IVAS_128k ) + { + reqularizationFactor = 0.5f; + } + else if ( ivas_total_brate == IVAS_96k ) + { + reqularizationFactor = 0.6f; + } + else if ( ivas_total_brate >= IVAS_64k ) + { + reqularizationFactor = 0.8f; + } + else + { + reqularizationFactor = 1.0f; + } + } + + if ( ivas_format == MC_FORMAT ) /* This is always McMASA for parametric binauralizer. */ + { + if ( ivas_total_brate >= IVAS_96k ) + { + reqularizationFactor = 0.4f; + } + else if ( ivas_total_brate >= IVAS_80k ) + { + reqularizationFactor = 0.5f; + } + else if ( ivas_total_brate >= IVAS_64k ) + { + reqularizationFactor = 0.7f; + } + else if ( ivas_total_brate >= IVAS_48k ) + { + reqularizationFactor = 0.8f; + } + else + { + reqularizationFactor = 1.0f; + } + } + + /* For SBA and parametric ISM, currently in default value of 1.0f. */ + + return reqularizationFactor; +} + + +/*-------------------------------------------------------------------* + * ivas_omasa_preProcessStereoTransportsForMovedObjects() + * + * + *-------------------------------------------------------------------*/ + +void ivas_omasa_preProcessStereoTransportsForMovedObjects( + Decoder_Struct *st_ivas, + float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + const int16_t nBins, + const int16_t subframe ) +{ + int16_t bin, ch, inCh, outCh, ismDirIndex, slot; + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom; + MASA_ISM_DATA_HANDLE hMasaIsmData; + uint8_t enableCentering; + int16_t dirac_read_idx; + int16_t nSlots; + + hSpatParamRendCom = st_ivas->hSpatParamRendCom; + hMasaIsmData = st_ivas->hMasaIsmData; + + if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_FOA || st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_HOA2 || st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_HOA3 ) + { + enableCentering = 0; + } + else + { + enableCentering = 1; + } + + /* Bypass processing until first object is moved */ + if ( hMasaIsmData->objectsMoved == 0 ) + { + for ( ismDirIndex = 0; ismDirIndex < hSpatParamRendCom->numIsmDirections; ismDirIndex++ ) + { + if ( hMasaIsmData->ism_is_edited[ismDirIndex] ) + { + hMasaIsmData->objectsMoved = 1; + } + } + if ( hMasaIsmData->objectsMoved == 0 ) + { + /* No objects have moved so far */ + return; + } + } + + /* Perform object-movement based processing */ + nSlots = hSpatParamRendCom->subframe_nbslots[subframe]; + dirac_read_idx = hSpatParamRendCom->render_to_md_map[subframe]; + + for ( bin = 0; bin < nBins; bin++ ) + { + float ismPreprocMtxNew[2][2]; + float ismPreprocMtxIncrement[2][2]; + float eneMove[2]; + float enePreserve[2]; + float ismRatioAcc; + float subframeEne; + float normEnes[2]; + float remainderNormEne; + + set_zero( ismPreprocMtxNew[0], 2 ); + set_zero( ismPreprocMtxNew[1], 2 ); + set_zero( ismPreprocMtxIncrement[0], 2 ); + set_zero( ismPreprocMtxIncrement[1], 2 ); + set_zero( eneMove, 2 ); + set_zero( enePreserve, 2 ); + ismRatioAcc = 0.0f; + subframeEne = 0.0f; + set_zero( normEnes, 2 ); + + /* Determine transport normalized energies and subframe energy */ + for ( slot = 0; slot < nSlots; slot++ ) + { + for ( ch = 0; ch < 2; ch++ ) + { + normEnes[ch] += inRe[ch][slot][bin] * inRe[ch][slot][bin]; + normEnes[ch] += inIm[ch][slot][bin] * inIm[ch][slot][bin]; + } + } + subframeEne = normEnes[0] + normEnes[1]; + normEnes[0] /= fmaxf( 1e-12f, subframeEne ); + normEnes[1] /= fmaxf( 1e-12f, subframeEne ); + + /* For each ismDir, formulate a mix-matrix that moves object audio signals between + * left and right channels when needed. Make a combined matrix by a ratio-weighted sum */ + for ( ismDirIndex = 0; ismDirIndex < hSpatParamRendCom->numIsmDirections; ismDirIndex++ ) + { + float panGainsOut[2]; + float panGainsIn[2]; + float ratio; + float panEnesOut[2]; + float panEnesIn[2]; + float centeringFactor; + + ratio = hMasaIsmData->energy_ratio_ism[ismDirIndex][dirac_read_idx][bin]; + + ismRatioAcc += ratio; + + /* Get input and output panning gains */ + ivas_get_stereo_panning_gains( hMasaIsmData->azimuth_ism[ismDirIndex][dirac_read_idx], + hMasaIsmData->elevation_ism[ismDirIndex][dirac_read_idx], + panGainsIn ); + + if ( hMasaIsmData->ism_is_edited[ismDirIndex] ) + { + ivas_get_stereo_panning_gains( hMasaIsmData->azimuth_ism_edited[ismDirIndex], + hMasaIsmData->elevation_ism_edited[ismDirIndex], + panGainsOut ); + } + else + { + /* When not edited, input and output pan gains are the same */ + for ( ch = 0; ch < 2; ch++ ) + { + panGainsOut[ch] = panGainsIn[ch]; + } + } + + /* Determine pan enes */ + for ( ch = 0; ch < 2; ch++ ) + { + panEnesOut[ch] = panGainsOut[ch] * panGainsOut[ch]; + panEnesIn[ch] = panGainsIn[ch] * panGainsIn[ch]; + } + + if ( enableCentering ) + { + centeringFactor = fmaxf( 0.0f, 2.0f * fabsf( panEnesIn[0] - panEnesOut[0] ) - 1.0f ); + for ( ch = 0; ch < 2; ch++ ) + { + panEnesOut[ch] *= ( 1.0f - centeringFactor ); + panEnesOut[ch] += 0.5f * centeringFactor; + } + } + + for ( ch = 0; ch < 2; ch++ ) + { + float eneMoveThis; + float enePreserveThis; + eneMoveThis = fmaxf( 0.0f, panEnesIn[ch] - panEnesOut[ch] ); + enePreserveThis = panEnesIn[ch] - eneMoveThis; + + eneMove[ch] += ratio * eneMoveThis; + enePreserve[ch] += ratio * enePreserveThis; + + /* Subtract object parts from normEnes */ + normEnes[ch] -= panEnesIn[ch] * ratio; + } + } + + /* Any remaining (non-object) energy is set to be preserved at both channels */ + remainderNormEne = fmaxf( 0.0f, ( 1.0f - ismRatioAcc ) - normEnes[0] - normEnes[1] ); + for ( ch = 0; ch < 2; ch++ ) + { + enePreserve[ch] += fmaxf( 0.0f, normEnes[ch] + remainderNormEne / 2.0f ); + } + + /* Temporally average energy moving and preserving, and generate the transport signal preprocessing matrix */ + for ( ch = 0; ch < 2; ch++ ) + { + float normVal; + hMasaIsmData->eneMoveIIR[ch][bin] *= STEREO_PREPROCESS_IIR_FACTOR; + hMasaIsmData->eneMoveIIR[ch][bin] += eneMove[ch] * subframeEne; + hMasaIsmData->enePreserveIIR[ch][bin] *= STEREO_PREPROCESS_IIR_FACTOR; + hMasaIsmData->enePreserveIIR[ch][bin] += enePreserve[ch] * subframeEne; + normVal = fmaxf( EPSILON, hMasaIsmData->eneMoveIIR[ch][bin] + hMasaIsmData->enePreserveIIR[ch][bin] ); + ismPreprocMtxNew[ch][ch] = sqrtf( hMasaIsmData->enePreserveIIR[ch][bin] / normVal ); + ismPreprocMtxNew[1 - ch][ch] = sqrtf( hMasaIsmData->eneMoveIIR[ch][bin] / normVal ); + } + + /* Get increment value for temporal interpolation */ + for ( inCh = 0; inCh < 2; inCh++ ) + { + for ( outCh = 0; outCh < 2; outCh++ ) + { + ismPreprocMtxIncrement[outCh][inCh] = ( ismPreprocMtxNew[outCh][inCh] - hMasaIsmData->ismPreprocMatrix[outCh][inCh][bin] ) / (float) nSlots; + } + } + + /* Mix signals */ + for ( slot = 0; slot < nSlots; slot++ ) + { + float eqVal; + float outSlotRe[2]; + float outSlotIm[2]; + + set_zero( outSlotRe, 2 ); + set_zero( outSlotIm, 2 ); + + for ( outCh = 0; outCh < 2; outCh++ ) + { + for ( inCh = 0; inCh < 2; inCh++ ) + { + hMasaIsmData->ismPreprocMatrix[outCh][inCh][bin] += ismPreprocMtxIncrement[outCh][inCh]; + outSlotRe[outCh] += inRe[inCh][slot][bin] * hMasaIsmData->ismPreprocMatrix[outCh][inCh][bin]; + outSlotIm[outCh] += inIm[inCh][slot][bin] * hMasaIsmData->ismPreprocMatrix[outCh][inCh][bin]; + } + } + + /* IIR average the energy measures and determine and apply energy-preserving equalizer */ + hMasaIsmData->preprocEneTarget[bin] *= STEREO_PREPROCESS_IIR_FACTOR; + hMasaIsmData->preprocEneRealized[bin] *= STEREO_PREPROCESS_IIR_FACTOR; + for ( ch = 0; ch < 2; ch++ ) + { + hMasaIsmData->preprocEneTarget[bin] += inRe[ch][slot][bin] * inRe[ch][slot][bin]; + hMasaIsmData->preprocEneTarget[bin] += inIm[ch][slot][bin] * inIm[ch][slot][bin]; + hMasaIsmData->preprocEneRealized[bin] += outSlotRe[ch] * outSlotRe[ch]; + hMasaIsmData->preprocEneRealized[bin] += outSlotIm[ch] * outSlotIm[ch]; + } + eqVal = fminf( 4.0f, sqrtf( hMasaIsmData->preprocEneTarget[bin] / fmaxf( 1e-12f, hMasaIsmData->preprocEneRealized[bin] ) ) ); + for ( ch = 0; ch < 2; ch++ ) + { + inRe[ch][slot][bin] = outSlotRe[ch] * eqVal; + inIm[ch][slot][bin] = outSlotIm[ch] * eqVal; + } + } + } + + return; +} diff --git a/lib_rend/ivas_dirac_decorr_dec.c b/lib_rend/ivas_dirac_decorr_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..1f7b67835f2bd7a778b5859cc283f71783eeda63 --- /dev/null +++ b/lib_rend/ivas_dirac_decorr_dec.c @@ -0,0 +1,800 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_prot_rend.h" +#include "ivas_stat_dec.h" +#include "ivas_cnst.h" +#include "ivas_rom_dec.h" +#include "wmc_auto.h" + + +/*------------------------------------------------------------------------- + * Local constants + *------------------------------------------------------------------------*/ + +#define DIRAC_MAX_DECORR_CLDFB_BANDS_AMBI 22 +#define DIRAC_MAX_DECORR_CLDFB_BANDS 15 + +#define DIRAC_DUCK_ALPHA 0.8f +#define DIRAC_DUCK_GAMMA 1.5f + + +/*------------------------------------------------------------------------- + * Local function prototypes + *------------------------------------------------------------------------*/ + +static void get_lattice_coeffs( const int16_t band_index, const int16_t channel_index, float *lattice_coeffs ); + +static void lattice2allpass( const int16_t filter_length, const float *lattice_coeffs, float *filter_coeffs_num_real, float *filter_coeffs_den_real ); + + +/*------------------------------------------------------------------------- + * ivas_dirac_dec_decorr_open() + * + * Allocate and initialize TD decorrelator decoder handle + *------------------------------------------------------------------------*/ + +ivas_error ivas_dirac_dec_decorr_open( + DIRAC_DECORR_PARAMS **ph_freq_domain_decorr_ap_params, + DIRAC_DECORR_STATE **ph_freq_domain_decorr_ap_state, + const int16_t num_freq_bands, + int16_t num_outputs_diff, + const int16_t num_protos_diff, + const DIRAC_SYNTHESIS_CONFIG synthesisConf, + float *frequency_axis, + const int16_t nchan_transport, /* i : number of transport channels*/ + const int32_t output_Fs /* i : output sampling rate */ +) +{ + int16_t k, l, m, n; + int16_t split_band_index_start; + int16_t k_in, k_out, num_bands, band_table_idx, buffer_size_decorr; + int16_t split_frequencies_bands[DIRAC_DECORR_NUM_SPLIT_BANDS + 1] = { 0, 0, 0, 23768 }; + int16_t *split_freq_ptr; + float cur_lattice_delta_phi, lattice_coeffs[2 * DIRAC_MAX_DECORR_FILTER_LEN]; + ivas_error error; + + /* pointers to structs for allocation */ + DIRAC_DECORR_PARAMS *freq_domain_decorr_ap_params = NULL; + DIRAC_DECORR_STATE *freq_domain_decorr_ap_state = NULL; + + /*-----------------------------------------------------------------* + * prepare library opening + *-----------------------------------------------------------------*/ + + /* allocate structs */ + if ( ( freq_domain_decorr_ap_params = (DIRAC_DECORR_PARAMS *) malloc( sizeof( DIRAC_DECORR_PARAMS ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD decorrelator\n" ) ); + } + + if ( ( freq_domain_decorr_ap_state = (DIRAC_DECORR_STATE *) malloc( sizeof( DIRAC_DECORR_STATE ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD decorrelator\n" ) ); + } + + /*-----------------------------------------------------------------* + * check input parameters + *-----------------------------------------------------------------*/ + + assert( ( num_freq_bands > 0 ) && "Error: Number of frequency bands <= 0!" ); + + + if ( synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) + { + num_outputs_diff -= nchan_transport; + } + + assert( ( num_outputs_diff >= 0 ) && ( num_outputs_diff <= DIRAC_MAX_NUM_DECORR_FILTERS ) && "Error: Number of channels <= 0 or > DIRAC_MAX_NUM_DECORR_FILTERS" ); + + /*-----------------------------------------------------------------* + * set default parameters + *-----------------------------------------------------------------*/ + + if ( synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) + { + /*Decorrelation in SHD*/ + freq_domain_decorr_ap_params->add_back_onsets_on = 0; + if ( nchan_transport > 2 ) + { + freq_domain_decorr_ap_params->max_frequency = 2000; + } + else + { + freq_domain_decorr_ap_params->max_frequency = ( min( num_freq_bands, DIRAC_MAX_DECORR_CLDFB_BANDS_AMBI ) * 24000 ) / CLDFB_NO_CHANNELS_MAX; + } + } + else if ( synthesisConf == DIRAC_SYNTHESIS_COV_MC_LS ) + { + /*Decorrelation in LS channels for MC*/ + freq_domain_decorr_ap_params->add_back_onsets_on = 1; + freq_domain_decorr_ap_params->max_frequency = ( PARAM_MC_MAX_DECORR_CLDFB_BANDS * 24000 ) / CLDFB_NO_CHANNELS_MAX; + } + else + { + /*Decorrelation in LS channels*/ + freq_domain_decorr_ap_params->add_back_onsets_on = 1; + freq_domain_decorr_ap_params->max_frequency = ( DIRAC_MAX_DECORR_CLDFB_BANDS * 24000 ) / CLDFB_NO_CHANNELS_MAX; + } + + freq_domain_decorr_ap_params->use_ducker = 1; + + assert( ( freq_domain_decorr_ap_params->max_frequency >= 0 ) && ( freq_domain_decorr_ap_params->max_frequency <= output_Fs / 2 ) && "Error: max_frequency invalid!" ); + + /* compute maximum band for decorrelation */ + assert( frequency_axis != NULL ); + for ( k = num_freq_bands - 1; k > 0; --k ) + { + freq_domain_decorr_ap_params->max_band_decorr = k + 1; /* outside "if" to avoid uninitialized variable */ + + if ( frequency_axis[k] < freq_domain_decorr_ap_params->max_frequency ) + { + break; + } + } + + /*-----------------------------------------------------------------* + * open sub-modules + *-----------------------------------------------------------------*/ + + /* open onset detection module */ + if ( synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) + { + /*Onset detector up to Nyquist and not only up to max_band_decorr*/ + if ( ( error = ivas_dirac_dec_onset_detection_open( num_protos_diff, num_freq_bands, num_freq_bands, &freq_domain_decorr_ap_params->h_onset_detection_power_params, &freq_domain_decorr_ap_state->h_onset_detection_power_state ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + if ( ( error = ivas_dirac_dec_onset_detection_open( num_protos_diff, num_freq_bands, freq_domain_decorr_ap_params->max_band_decorr, &freq_domain_decorr_ap_params->h_onset_detection_power_params, &freq_domain_decorr_ap_state->h_onset_detection_power_state ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /*-----------------------------------------------------------------* + * prepare processing parameters + *-----------------------------------------------------------------*/ + + /* calculate decorrelation split bands */ + split_freq_ptr = &split_frequencies_bands[0]; + split_freq_ptr[0] = 0; + for ( k = 1; k < DIRAC_DECORR_NUM_SPLIT_BANDS; k++ ) + { + split_freq_ptr[k] = (int16_t) ( (float) CLDFB_NO_CHANNELS_MAX * ap_split_frequencies[k] + 0.5f ) - 1; + } + split_band_index_start = 0; + + split_frequencies_bands[k] = 0; + freq_domain_decorr_ap_params->num_split_frequency_bands = 0; + for ( k = 1; k < DIRAC_DECORR_NUM_SPLIT_BANDS + 1; k++ ) + { + freq_domain_decorr_ap_params->num_split_frequency_bands++; + if ( split_frequencies_bands[k] >= freq_domain_decorr_ap_params->max_band_decorr ) + { + split_frequencies_bands[k] = freq_domain_decorr_ap_params->max_band_decorr; + break; + } + } + + if ( ( freq_domain_decorr_ap_params->split_frequency_bands = (int16_t *) malloc( sizeof( int16_t ) * ( freq_domain_decorr_ap_params->num_split_frequency_bands + 1 ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD decorrelator\n" ) ); + } + mvs2s( &split_frequencies_bands[0], freq_domain_decorr_ap_params->split_frequency_bands, freq_domain_decorr_ap_params->num_split_frequency_bands + 1 ); + + /* calc buffer size and allocate arrays */ + freq_domain_decorr_ap_state->decorr_buffer = NULL; + freq_domain_decorr_ap_params->filter_coeff_num_real = NULL; + freq_domain_decorr_ap_params->filter_coeff_den_real = NULL; + freq_domain_decorr_ap_params->phase_coeff_real = NULL; + freq_domain_decorr_ap_params->phase_coeff_imag = NULL; + freq_domain_decorr_ap_state->direct_energy_smooth = NULL; + freq_domain_decorr_ap_state->reverb_energy_smooth = NULL; + freq_domain_decorr_ap_params->pre_delay = NULL; + freq_domain_decorr_ap_params->filter_length = NULL; + + if ( num_outputs_diff > 0 ) + { + buffer_size_decorr = ( ap_pre_delay[split_band_index_start] + ap_filter_length[split_band_index_start] ); + if ( ( freq_domain_decorr_ap_state->decorr_buffer = (float *) malloc( sizeof( float ) * 2 * buffer_size_decorr * num_outputs_diff * freq_domain_decorr_ap_params->max_band_decorr ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD decorrelator\n" ) ); + } + set_f( freq_domain_decorr_ap_state->decorr_buffer, 0.0f, 2 * buffer_size_decorr * num_outputs_diff * freq_domain_decorr_ap_params->max_band_decorr ); + + if ( ( freq_domain_decorr_ap_params->filter_coeff_num_real = (float *) malloc( sizeof( float ) * ( ap_filter_length[split_band_index_start] + 1 ) * freq_domain_decorr_ap_params->max_band_decorr * num_outputs_diff ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD decorrelator\n" ) ); + } + + if ( ( freq_domain_decorr_ap_params->filter_coeff_den_real = (float *) malloc( sizeof( float ) * ( ap_filter_length[split_band_index_start] + 1 ) * freq_domain_decorr_ap_params->max_band_decorr * num_outputs_diff ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD decorrelator\n" ) ); + } + + if ( ( freq_domain_decorr_ap_params->phase_coeff_real = (float *) malloc( sizeof( float ) * freq_domain_decorr_ap_params->max_band_decorr * num_outputs_diff ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD decorrelator\n" ) ); + } + + if ( ( freq_domain_decorr_ap_params->phase_coeff_imag = (float *) malloc( sizeof( float ) * freq_domain_decorr_ap_params->max_band_decorr * num_outputs_diff ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD decorrelator\n" ) ); + } + + if ( ( freq_domain_decorr_ap_state->direct_energy_smooth = (float *) malloc( sizeof( float ) * freq_domain_decorr_ap_params->max_band_decorr * num_outputs_diff ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD decorrelator\n" ) ); + } + + if ( ( freq_domain_decorr_ap_state->reverb_energy_smooth = (float *) malloc( sizeof( float ) * freq_domain_decorr_ap_params->max_band_decorr * num_outputs_diff ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD decorrelator\n" ) ); + } + + if ( ( freq_domain_decorr_ap_params->pre_delay = (int16_t *) malloc( sizeof( int16_t ) * freq_domain_decorr_ap_params->num_split_frequency_bands ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD decorrelator\n" ) ); + } + if ( ( freq_domain_decorr_ap_params->filter_length = (int16_t *) malloc( sizeof( int16_t ) * freq_domain_decorr_ap_params->num_split_frequency_bands ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD decorrelator\n" ) ); + } + + set_f( freq_domain_decorr_ap_state->direct_energy_smooth, 0.0f, freq_domain_decorr_ap_params->max_band_decorr * num_outputs_diff ); + set_f( freq_domain_decorr_ap_state->reverb_energy_smooth, 0.0f, freq_domain_decorr_ap_params->max_band_decorr * num_outputs_diff ); + + /* compute filter coefficients */ + for ( k = 0; k < freq_domain_decorr_ap_params->num_split_frequency_bands; k++ ) + { + k_in = freq_domain_decorr_ap_params->split_frequency_bands[k]; + k_out = freq_domain_decorr_ap_params->split_frequency_bands[k + 1]; + num_bands = k_out - k_in; + band_table_idx = k + split_band_index_start; + freq_domain_decorr_ap_params->filter_length[k] = ap_filter_length[band_table_idx] + 1; + freq_domain_decorr_ap_params->pre_delay[k] = ap_pre_delay[band_table_idx]; + + for ( l = 0; l < num_outputs_diff; l++ ) + { + for ( m = 0; m < num_bands; m++ ) + { + n = k_in + m; + cur_lattice_delta_phi = ap_lattice_delta_phi[l * DIRAC_MAX_DECORR_FILTER_LEN + ap_filter_length[k] - 1] * n; + freq_domain_decorr_ap_params->phase_coeff_real[l * freq_domain_decorr_ap_params->max_band_decorr + n] = cosf( cur_lattice_delta_phi ); + freq_domain_decorr_ap_params->phase_coeff_imag[l * freq_domain_decorr_ap_params->max_band_decorr + n] = -sinf( cur_lattice_delta_phi ); + + /* calculate phase offset */ + get_lattice_coeffs( band_table_idx, l, lattice_coeffs ); + + /* calcualte transfer function coefficients from the lattice coefficients */ + lattice2allpass( freq_domain_decorr_ap_params->filter_length[k], lattice_coeffs, &freq_domain_decorr_ap_params->filter_coeff_num_real[( k_in + m ) * ( freq_domain_decorr_ap_params->filter_length[0] * num_outputs_diff ) + l * freq_domain_decorr_ap_params->filter_length[0]], &freq_domain_decorr_ap_params->filter_coeff_den_real[( k_in + m ) * ( freq_domain_decorr_ap_params->filter_length[0] * num_outputs_diff ) + l * freq_domain_decorr_ap_params->filter_length[0]] ); + } + } + } + } + + *ph_freq_domain_decorr_ap_params = freq_domain_decorr_ap_params; + *ph_freq_domain_decorr_ap_state = freq_domain_decorr_ap_state; + + return IVAS_ERR_OK; +} + + +/*------------------------------------------------------------------------- + * ivas_dirac_dec_decorr_process() + * + * + *------------------------------------------------------------------------*/ + +void ivas_dirac_dec_decorr_process( + const int16_t num_freq_bands, + int16_t num_channels, + const int16_t num_protos_diff, + const DIRAC_SYNTHESIS_CONFIG synthesisConf, + const int16_t nchan_transport, /* i : number of transport channels*/ + const float *input_frame_f, + const int16_t num_protos_dir, + const int16_t *proto_index_dir, + float *frame_dec_f, + float *onset_filter, + HANDLE_DIRAC_DECORR_PARAMS h_freq_domain_decorr_ap_params, + HANDLE_DIRAC_DECORR_STATE h_freq_domain_decorr_ap_state ) +{ + int16_t ch_idx, k, l, idx_in_out, max_band_decorr; + int16_t split_bands_idx, band_idx, decorr_buffer_len, time_idx; + int16_t offset, idx_filter, incr_aux; + int16_t k_1, k_2, num_bands, filter_length, pre_delay, decorr_buffer_step; + float frame_ma[2 * ( DIRAC_MAX_DECORR_FILTER_LEN + 1 )]; + float aux_buffer[2 * MAX_OUTPUT_CHANNELS * CLDFB_NO_CHANNELS_MAX]; + float direct_energy[MAX_OUTPUT_CHANNELS * CLDFB_NO_CHANNELS_MAX]; + float *p_frame_dec_f, *decorr_buffer, *phase_coeff_real, *phase_coeff_imag; + float *filter_coeff_num_real, *filter_coeff_den_real, *decorr_buffer_start_ptr, *decorr_buffer_ptr; + float input_real, input_imag, filter_frame_imag, filter_frame_real; + + push_wmops( "dirac_decorr_process" ); + + /* check handles */ + if ( h_freq_domain_decorr_ap_params == NULL || h_freq_domain_decorr_ap_state == NULL ) + { + return; + } + + /* check input data */ + if ( input_frame_f == NULL ) + { + return; + } + + /* check result arrays */ + if ( frame_dec_f == NULL ) + { + return; + } + + + /*-----------------------------------------------------------------* + * ********** processing ********** + *-----------------------------------------------------------------*/ + + /*-----------------------------------------------------------------* + * collect some often used parameters + *-----------------------------------------------------------------*/ + + if ( synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) + { + num_channels -= nchan_transport; + } + + + /*-----------------------------------------------------------------* + * detect and remove onsets + *-----------------------------------------------------------------*/ + + /* compute power */ + max_band_decorr = h_freq_domain_decorr_ap_params->h_onset_detection_power_params.max_band_decorr; + + for ( ch_idx = 0; ch_idx < num_protos_dir; ch_idx++ ) + { + v_mult( &input_frame_f[2 * ch_idx * num_freq_bands], &input_frame_f[2 * ch_idx * num_freq_bands], &aux_buffer[2 * ch_idx * max_band_decorr], 2 * max_band_decorr ); + + v_add_inc( &aux_buffer[2 * ch_idx * max_band_decorr], 2, &aux_buffer[2 * ch_idx * max_band_decorr + 1], 2, &aux_buffer[ch_idx * max_band_decorr], 1, max_band_decorr ); + } + + /* compute onset filter */ + max_band_decorr = h_freq_domain_decorr_ap_params->max_band_decorr; + + set_f( onset_filter, 1.0f, num_protos_diff * num_freq_bands ); + + ivas_dirac_dec_onset_detection_process( aux_buffer, onset_filter, num_protos_diff, h_freq_domain_decorr_ap_params->h_onset_detection_power_params, h_freq_domain_decorr_ap_state->h_onset_detection_power_state ); + + /* Apply decorrelator if num_channels is greater than 0 */ + if ( num_channels > 0 ) + { + /* remove onsets from prototype frame */ + for ( ch_idx = 0; ch_idx < num_protos_dir; ch_idx++ ) + { + v_mult_inc( &input_frame_f[2 * ch_idx * num_freq_bands], 2, &onset_filter[ch_idx * num_freq_bands], 1, &aux_buffer[2 * ch_idx * max_band_decorr], 2, max_band_decorr ); + + v_mult_inc( &input_frame_f[2 * ch_idx * num_freq_bands + 1], 2, &onset_filter[ch_idx * num_freq_bands], 1, &aux_buffer[2 * ch_idx * max_band_decorr + 1], 2, max_band_decorr ); + } + + /*-----------------------------------------------------------------* + * all pass based decorrelation + *-----------------------------------------------------------------*/ + + /* compute decorrelated output frame */ + /* output is the first frame of the state */ + p_frame_dec_f = frame_dec_f; + decorr_buffer = h_freq_domain_decorr_ap_state->decorr_buffer; + phase_coeff_real = h_freq_domain_decorr_ap_params->phase_coeff_real; + phase_coeff_imag = h_freq_domain_decorr_ap_params->phase_coeff_imag; + incr_aux = 2 * ( num_freq_bands - max_band_decorr ); + + for ( ch_idx = 0; ch_idx < num_channels; ++ch_idx ) + { + /* final phase rotation */ + for ( k = 0; k < max_band_decorr; k++ ) + { + *( p_frame_dec_f++ ) = ( ( *decorr_buffer ) * ( *phase_coeff_real ) ) - ( ( *( decorr_buffer + 1 ) ) * ( *phase_coeff_imag ) ); + *( p_frame_dec_f++ ) = ( ( *decorr_buffer ) * ( *phase_coeff_imag++ ) ) + ( ( *( decorr_buffer + 1 ) ) * ( *phase_coeff_real++ ) ); + decorr_buffer += 2; + } + p_frame_dec_f += incr_aux; + } + + /* update state */ + decorr_buffer_len = h_freq_domain_decorr_ap_params->filter_length[0] + h_freq_domain_decorr_ap_params->pre_delay[0] - 1; + for ( time_idx = 0; time_idx < ( decorr_buffer_len - 1 ); time_idx++ ) + { + mvr2r( &h_freq_domain_decorr_ap_state->decorr_buffer[2 * ( time_idx + 1 ) * max_band_decorr * num_channels], &h_freq_domain_decorr_ap_state->decorr_buffer[2 * (time_idx) *max_band_decorr * num_channels], 2 * max_band_decorr * num_channels ); + } + set_zero( &h_freq_domain_decorr_ap_state->decorr_buffer[2 * ( decorr_buffer_len - 1 ) * max_band_decorr * num_channels], 2 * max_band_decorr * num_channels ); + + /* calculate all pass */ + for ( split_bands_idx = 0; split_bands_idx < h_freq_domain_decorr_ap_params->num_split_frequency_bands; split_bands_idx++ ) + { + k_1 = h_freq_domain_decorr_ap_params->split_frequency_bands[split_bands_idx]; + k_2 = h_freq_domain_decorr_ap_params->split_frequency_bands[split_bands_idx + 1]; + num_bands = k_2 - k_1; + filter_length = h_freq_domain_decorr_ap_params->filter_length[split_bands_idx]; + pre_delay = h_freq_domain_decorr_ap_params->pre_delay[split_bands_idx]; + decorr_buffer_step = num_channels * max_band_decorr; + + for ( k = 0; k < num_bands; ++k ) + { + band_idx = k_1 + k; + + for ( ch_idx = 0; ch_idx < num_channels; ++ch_idx ) + { + idx_filter = band_idx * ( h_freq_domain_decorr_ap_params->filter_length[0] * num_channels ) + ch_idx * h_freq_domain_decorr_ap_params->filter_length[0]; + filter_coeff_num_real = &h_freq_domain_decorr_ap_params->filter_coeff_num_real[idx_filter]; + filter_coeff_den_real = &h_freq_domain_decorr_ap_params->filter_coeff_den_real[idx_filter]; + decorr_buffer_start_ptr = &h_freq_domain_decorr_ap_state->decorr_buffer[2 * ( ch_idx * max_band_decorr + band_idx )]; + input_real = aux_buffer[2 * ( proto_index_dir[ch_idx] * max_band_decorr + band_idx )]; + input_imag = aux_buffer[2 * ( proto_index_dir[ch_idx] * max_band_decorr + band_idx ) + 1]; + + /* MA part of filter impulse response */ + for ( l = 0; l < filter_length; l++ ) + { + frame_ma[2 * l] = input_real * filter_coeff_num_real[l]; + frame_ma[2 * l + 1] = input_imag * filter_coeff_num_real[l]; + } + decorr_buffer_ptr = decorr_buffer_start_ptr + 2 * ( pre_delay - 1 ) * decorr_buffer_step; + + /*add MA part to state */ + decorr_buffer_ptr[0] += frame_ma[0]; + decorr_buffer_ptr[1] += frame_ma[1]; + + /*get values for AR part */ + filter_frame_real = decorr_buffer_ptr[0]; + filter_frame_imag = decorr_buffer_ptr[1]; + + decorr_buffer_ptr += 2 * decorr_buffer_step; + + for ( l = 1; l < filter_length; l++ ) + { + decorr_buffer_ptr[0] += frame_ma[2 * l] - filter_frame_real * filter_coeff_den_real[l]; + decorr_buffer_ptr[1] += frame_ma[2 * l + 1] - filter_frame_imag * filter_coeff_den_real[l]; + decorr_buffer_ptr += 2 * decorr_buffer_step; + } + } + } + } + + /*-----------------------------------------------------------------* + * onset/diffuse energy ratio conservation + *-----------------------------------------------------------------*/ + + if ( h_freq_domain_decorr_ap_params->use_ducker ) + { + /* compute direct power w/o onsets for the energy ratio, signal is still in the aux buffer */ + v_mult( aux_buffer, aux_buffer, aux_buffer, 2 * max_band_decorr * num_protos_dir ); + v_add_inc( &aux_buffer[0], 2, &aux_buffer[1], 2, direct_energy, 1, max_band_decorr * num_protos_dir ); + + /* calculate the power of the decorrelated signal */ + + for ( ch_idx = 0; ch_idx < num_channels; ++ch_idx ) + { + v_mult( &frame_dec_f[2 * ch_idx * num_freq_bands], &frame_dec_f[2 * ch_idx * num_freq_bands], &aux_buffer[2 * ch_idx * max_band_decorr], 2 * max_band_decorr ); + v_add_inc( &aux_buffer[2 * ch_idx * max_band_decorr], 2, &aux_buffer[2 * ch_idx * max_band_decorr + 1], 2, &aux_buffer[ch_idx * max_band_decorr], 1, max_band_decorr ); + } + + /* smooth energies */ + v_multc( aux_buffer, 1.0f - DIRAC_DUCK_ALPHA, aux_buffer, num_channels * max_band_decorr ); + + v_multc( h_freq_domain_decorr_ap_state->reverb_energy_smooth, DIRAC_DUCK_ALPHA, h_freq_domain_decorr_ap_state->reverb_energy_smooth, num_channels * max_band_decorr ); + + v_add( aux_buffer, h_freq_domain_decorr_ap_state->reverb_energy_smooth, h_freq_domain_decorr_ap_state->reverb_energy_smooth, num_channels * max_band_decorr ); + + v_multc( direct_energy, 1.0f - DIRAC_DUCK_ALPHA, direct_energy, num_protos_dir * max_band_decorr ); + + v_multc( h_freq_domain_decorr_ap_state->direct_energy_smooth, DIRAC_DUCK_ALPHA, h_freq_domain_decorr_ap_state->direct_energy_smooth, num_protos_dir * max_band_decorr ); + + v_add( direct_energy, h_freq_domain_decorr_ap_state->direct_energy_smooth, h_freq_domain_decorr_ap_state->direct_energy_smooth, num_protos_dir * max_band_decorr ); + + for ( ch_idx = 0; ch_idx < num_channels; ch_idx++ ) + { + float *frame_dec_f_ptr = &frame_dec_f[ch_idx * 2 * num_freq_bands]; + int16_t cur_proto_index = proto_index_dir[ch_idx] * max_band_decorr; + int16_t cur_reverb_index = ch_idx * max_band_decorr; + float *reverb_energy_smooth_ptr = &h_freq_domain_decorr_ap_state->reverb_energy_smooth[cur_reverb_index]; + float *direct_energy_smooth_ptr = &h_freq_domain_decorr_ap_state->direct_energy_smooth[cur_proto_index]; + + for ( band_idx = 0; band_idx < max_band_decorr; band_idx++ ) + { + float duck_gain = 1.0f; + float direct_energy_loc = direct_energy_smooth_ptr[band_idx]; + float reverb_energy_loc = reverb_energy_smooth_ptr[band_idx]; + + if ( reverb_energy_loc > ( direct_energy_loc * DIRAC_DUCK_GAMMA ) ) + { + duck_gain = sqrtf( direct_energy_loc * DIRAC_DUCK_GAMMA / ( reverb_energy_loc + EPSILON ) ); + frame_dec_f_ptr[2 * band_idx] *= duck_gain; + frame_dec_f_ptr[2 * band_idx + 1] *= duck_gain; + } + else if ( direct_energy_loc > ( reverb_energy_loc * DIRAC_DUCK_GAMMA ) ) + { + duck_gain = sqrtf( direct_energy_loc / ( DIRAC_DUCK_GAMMA * reverb_energy_loc + EPSILON ) ); + if ( duck_gain > 2.0f ) + { + duck_gain = 2.0f; + } + frame_dec_f_ptr[2 * band_idx] *= duck_gain; + frame_dec_f_ptr[2 * band_idx + 1] *= duck_gain; + } + } + } + } + + /*-----------------------------------------------------------------* + * add back onsets + *-----------------------------------------------------------------*/ + + if ( h_freq_domain_decorr_ap_params->add_back_onsets_on == 1 ) + { + for ( ch_idx = 0; ch_idx < num_channels; ++ch_idx ) + { + offset = proto_index_dir[ch_idx] * num_freq_bands; + + for ( k = 0; k < max_band_decorr; ++k ) + { + aux_buffer[2 * k] = ( 1.0f - onset_filter[offset + k] ) * input_frame_f[2 * offset + 2 * k]; + aux_buffer[2 * k + 1] = ( 1.0f - onset_filter[offset + k] ) * input_frame_f[2 * offset + 2 * k + 1]; + } + + v_add( &frame_dec_f[ch_idx * 2 * num_freq_bands], aux_buffer, &frame_dec_f[ch_idx * 2 * num_freq_bands], 2 * max_band_decorr ); + } + } + + /* avoid decorrelation above maximum frequency -> set to zero the remaining frequencies*/ + for ( ch_idx = 0; ch_idx < num_channels; ++ch_idx ) + { + /* calc output indices */ + idx_in_out = 2 * ( ch_idx * num_freq_bands + h_freq_domain_decorr_ap_params->max_band_decorr ); + + /* copy to output signal */ + set_zero( &frame_dec_f[idx_in_out], 2 * ( num_freq_bands - h_freq_domain_decorr_ap_params->max_band_decorr ) ); + } + + } /*end of decorrelator*/ + + pop_wmops(); + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_dirac_dec_decorr_close() + * + * + *------------------------------------------------------------------------*/ + +void ivas_dirac_dec_decorr_close( + HANDLE_DIRAC_DECORR_PARAMS *ph_freq_domain_decorr_ap_params, + HANDLE_DIRAC_DECORR_STATE *ph_freq_domain_decorr_ap_state ) +{ + DIRAC_ONSET_DETECTION_STATE *dirac_onset_detection_state; + + /*-----------------------------------------------------------------* + * check input handles + *-----------------------------------------------------------------*/ + + if ( ph_freq_domain_decorr_ap_params == NULL || ph_freq_domain_decorr_ap_state == NULL ) + { + return; + } + + if ( *ph_freq_domain_decorr_ap_params == NULL || *ph_freq_domain_decorr_ap_state == NULL ) + { + return; + } + + /*-----------------------------------------------------------------* + * free onset filter arrays + *-----------------------------------------------------------------*/ + + dirac_onset_detection_state = &( *ph_freq_domain_decorr_ap_state )->h_onset_detection_power_state; + + if ( dirac_onset_detection_state->onset_detector_1 != NULL ) + { + free( dirac_onset_detection_state->onset_detector_1 ); + dirac_onset_detection_state->onset_detector_1 = NULL; + } + + if ( dirac_onset_detection_state->onset_detector_2 != NULL ) + { + free( dirac_onset_detection_state->onset_detector_2 ); + dirac_onset_detection_state->onset_detector_2 = NULL; + } + + /*-----------------------------------------------------------------* + * memory deallocation + *-----------------------------------------------------------------*/ + + /* free decorrelation buffer */ + if ( ( *ph_freq_domain_decorr_ap_state )->decorr_buffer != NULL ) + { + free( ( *ph_freq_domain_decorr_ap_state )->decorr_buffer ); + ( *ph_freq_domain_decorr_ap_state )->decorr_buffer = NULL; + } + + /* free ducker smoothed direct energy buffer */ + if ( ( *ph_freq_domain_decorr_ap_state )->direct_energy_smooth != NULL ) + { + free( ( *ph_freq_domain_decorr_ap_state )->direct_energy_smooth ); + ( *ph_freq_domain_decorr_ap_state )->direct_energy_smooth = NULL; + } + + /* free ducker smoothed reverb energy buffer */ + if ( ( *ph_freq_domain_decorr_ap_state )->reverb_energy_smooth != NULL ) + { + free( ( *ph_freq_domain_decorr_ap_state )->reverb_energy_smooth ); + ( *ph_freq_domain_decorr_ap_state )->reverb_energy_smooth = NULL; + } + + /* free pre-delay param buffer */ + if ( ( *ph_freq_domain_decorr_ap_params )->pre_delay != NULL ) + { + free( ( *ph_freq_domain_decorr_ap_params )->pre_delay ); + ( *ph_freq_domain_decorr_ap_params )->pre_delay = NULL; + } + + /* free filter length param buffer */ + if ( ( *ph_freq_domain_decorr_ap_params )->filter_length != NULL ) + { + free( ( *ph_freq_domain_decorr_ap_params )->filter_length ); + ( *ph_freq_domain_decorr_ap_params )->filter_length = NULL; + } + + /* free filter coeff param buffers */ + if ( ( *ph_freq_domain_decorr_ap_params )->filter_coeff_num_real != NULL ) + { + free( ( *ph_freq_domain_decorr_ap_params )->filter_coeff_num_real ); + ( *ph_freq_domain_decorr_ap_params )->filter_coeff_num_real = NULL; + } + + /* free pre-delay param buffer */ + if ( ( *ph_freq_domain_decorr_ap_params )->filter_coeff_den_real != NULL ) + { + free( ( *ph_freq_domain_decorr_ap_params )->filter_coeff_den_real ); + ( *ph_freq_domain_decorr_ap_params )->filter_coeff_den_real = NULL; + } + + /* free pre-delay param buffer */ + if ( ( *ph_freq_domain_decorr_ap_params )->phase_coeff_imag != NULL ) + { + free( ( *ph_freq_domain_decorr_ap_params )->phase_coeff_imag ); + ( *ph_freq_domain_decorr_ap_params )->phase_coeff_imag = NULL; + } + + /* free pre-delay param buffer */ + if ( ( *ph_freq_domain_decorr_ap_params )->phase_coeff_real != NULL ) + { + free( ( *ph_freq_domain_decorr_ap_params )->phase_coeff_real ); + ( *ph_freq_domain_decorr_ap_params )->phase_coeff_real = NULL; + } + + /* free pre-delay param buffer */ + if ( ( *ph_freq_domain_decorr_ap_params )->split_frequency_bands != NULL ) + { + free( ( *ph_freq_domain_decorr_ap_params )->split_frequency_bands ); + ( *ph_freq_domain_decorr_ap_params )->split_frequency_bands = NULL; + } + + /* free pointers to state and parameter structs */ + free( *ph_freq_domain_decorr_ap_params ); + *ph_freq_domain_decorr_ap_params = NULL; + + free( *ph_freq_domain_decorr_ap_state ); + *ph_freq_domain_decorr_ap_state = NULL; + + return; +} + + +/*------------------------------------------------------------------------- + * Local functions + *------------------------------------------------------------------------*/ + +/* get lattice coeffs with phase offset */ +static void get_lattice_coeffs( + const int16_t band_index, + const int16_t channel_index, + float *lattice_coeffs ) +{ + int16_t k; + + for ( k = 0; k < ap_filter_length[band_index]; k++ ) + { + float cur_lattice_coeff = ap_lattice_coeffs[band_index][channel_index * ap_filter_length[band_index] + k]; + lattice_coeffs[k] = cur_lattice_coeff; + } + + return; +} + + +/* convert lattice filter coeffs to all pass transfer function coeffs */ +static void lattice2allpass( + const int16_t filter_length, + const float *lattice_coeffs, + float *filter_coeffs_num_real, + float *filter_coeffs_den_real ) +{ + int16_t i, p; + float alpha_real[2][DIRAC_MAX_DECORR_FILTER_LEN + 1]; + float *alpha_real_p_old = &alpha_real[0][0]; + float *alpha_real_p = &alpha_real[1][0]; + float *tmp; + + for ( i = 0; i < 2; i++ ) + { + set_f( alpha_real[i], 0.0f, DIRAC_MAX_DECORR_FILTER_LEN + 1 ); + } + + alpha_real_p[0] = 1.0f; + alpha_real_p_old[0] = 1.0f; + + /* recursion */ + for ( p = 1; p < filter_length; p++ ) + { + alpha_real_p[p] = lattice_coeffs[( p - 1 )]; + + for ( i = 1; i < p; i++ ) + { + alpha_real_p[i] = alpha_real_p_old[i] + lattice_coeffs[( p - 1 )] * alpha_real_p_old[p - i]; + } + /* switch pointers */ + tmp = alpha_real_p_old; + alpha_real_p_old = alpha_real_p; + alpha_real_p = tmp; + } + + for ( i = 0; i < filter_length; i++ ) + { + filter_coeffs_den_real[i] = alpha_real_p_old[i]; + filter_coeffs_num_real[i] = alpha_real_p_old[filter_length - i - 1]; + } + + return; +} diff --git a/lib_rend/ivas_dirac_onsets_dec.c b/lib_rend/ivas_dirac_onsets_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..5d24f40ad9c29ee5fd1f241655bf1f0a0c68f42a --- /dev/null +++ b/lib_rend/ivas_dirac_onsets_dec.c @@ -0,0 +1,134 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include "options.h" +#include "cnst.h" +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_prot_rend.h" +#include "ivas_cnst.h" +#include "ivas_rom_com.h" +#include "ivas_rom_dec.h" +#include "wmc_auto.h" + + +/*------------------------------------------------------------------------- + * ivas_dirac_dec_onset_detection_open() + * + * onset detection + *------------------------------------------------------------------------*/ + +ivas_error ivas_dirac_dec_onset_detection_open( + const int16_t num_protos_diff, + const int16_t num_freq_bands, + const int16_t max_band_decorr, + DIRAC_ONSET_DETECTION_PARAMS *ph_dirac_onset_detection_params, + DIRAC_ONSET_DETECTION_STATE *ph_dirac_onset_detection_state ) +{ + /* pointers to structs for allocation */ + DIRAC_ONSET_DETECTION_PARAMS *dirac_onset_detection_params = ph_dirac_onset_detection_params; + DIRAC_ONSET_DETECTION_STATE *dirac_onset_detection_state = ph_dirac_onset_detection_state; + + /* check / set input parameters */ + dirac_onset_detection_params->num_freq_bands = num_freq_bands; + assert( dirac_onset_detection_params->num_freq_bands > 0 && "Error: Number of frequency bands <= 0!" ); + + dirac_onset_detection_params->max_band_decorr = max_band_decorr; + + /* memory allocation */ + if ( ( dirac_onset_detection_state->onset_detector_1 = (float *) malloc( sizeof( float ) * num_protos_diff * dirac_onset_detection_params->max_band_decorr ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for onset detection\n" ) ); + } + if ( ( dirac_onset_detection_state->onset_detector_2 = (float *) malloc( sizeof( float ) * num_protos_diff * dirac_onset_detection_params->max_band_decorr ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for onset detection\n" ) ); + } + + /* init to zero */ + set_zero( dirac_onset_detection_state->onset_detector_1, num_protos_diff * dirac_onset_detection_params->max_band_decorr ); + set_zero( dirac_onset_detection_state->onset_detector_2, num_protos_diff * dirac_onset_detection_params->max_band_decorr ); + + return IVAS_ERR_OK; +} + + +/*------------------------------------------------------------------------- + * ivas_dirac_dec_onset_detection_process() + * + * + *------------------------------------------------------------------------*/ + +void ivas_dirac_dec_onset_detection_process( + const float *input_power_f, + float *onset_filter, + const int16_t num_protos_diff, + DIRAC_ONSET_DETECTION_PARAMS h_dirac_onset_detection_params, + DIRAC_ONSET_DETECTION_STATE h_dirac_onset_detection_state ) +{ + int16_t b, ch_idx; + float tmp_f; + float *p_onset_detector_1, *p_onset_detector_2; + + p_onset_detector_1 = h_dirac_onset_detection_state.onset_detector_1; + p_onset_detector_2 = h_dirac_onset_detection_state.onset_detector_2; + + for ( ch_idx = 0; ch_idx < num_protos_diff; ch_idx++ ) + { + for ( b = 0; b < h_dirac_onset_detection_params.max_band_decorr; b++ ) + { + /*detector 1: envelope max*/ + *p_onset_detector_1 *= DIRAC_ONSET_ALPHA; + *p_onset_detector_1 = ( *p_onset_detector_1 > *input_power_f ) ? *p_onset_detector_1 : *input_power_f; + + /*detector 2: envelope min*/ + *p_onset_detector_2 = DIRAC_ONSET_BETA * *p_onset_detector_2 + ( 1.f - DIRAC_ONSET_BETA ) * *p_onset_detector_1; + *p_onset_detector_2 = ( *p_onset_detector_2 < *p_onset_detector_1 ) ? *p_onset_detector_2 : *p_onset_detector_1; + + /*onset filter limited between 0 and 1*/ + tmp_f = ( DIRAC_ONSET_GAIN * *p_onset_detector_2 ) / ( *p_onset_detector_1 + EPSILON ); + tmp_f = ( tmp_f < 0.f ) ? 0.f : tmp_f; + tmp_f = ( tmp_f > 1.f ) ? 1.f : tmp_f; + onset_filter[b] = tmp_f; + + input_power_f++; + p_onset_detector_1++; + p_onset_detector_2++; + } + + onset_filter += h_dirac_onset_detection_params.num_freq_bands; + } + + return; +} diff --git a/lib_rend/ivas_dirac_output_synthesis_dec.c b/lib_rend/ivas_dirac_output_synthesis_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..7ac648d8d6a547854e2d1fc50f35da39f4759dbd --- /dev/null +++ b/lib_rend/ivas_dirac_output_synthesis_dec.c @@ -0,0 +1,2559 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_prot_rend.h" +#include "ivas_stat_dec.h" +#include "ivas_cnst.h" +#include "ivas_rom_com.h" +#include "ivas_rom_dec.h" +#include "wmc_auto.h" + +/*------------------------------------------------------------------------- + * Local constants + *------------------------------------------------------------------------*/ + +#define DIRAC_AVG_LENGTH_SYNTH_MS 20 /*averaging length in ms for DirAC synthesis*/ +#define DIRAC_ALPHA_MAX 0.1f +#define DIRAC_AVG_LENGTH_SYNTH_MS_FAST 10 +#define DIRAC_ALPHA_MAX_FAST 0.12f +#define DIRECTION_SMOOTHNESS_ALPHA 0.01f + + +/*------------------------------------------------------------------------- + * Local function prototypes + *------------------------------------------------------------------------*/ + +static void computeTargetPSDs_direct( const int16_t num_channels, const int16_t num_freq_bands, const float *direct_power_factor, const float *reference_power, const float *direct_responses, const float *direct_responses_square, float *cy_auto_dir_smooth, float *cy_cross_dir_smooth ); + +static void computeTargetPSDs_direct_subframe( const int16_t num_channels, const int16_t num_freq_bands, const float *direct_power_factor, const float *reference_power, const float *direct_responses, const float *direct_responses_square, float *cy_auto_dir_smooth, float *cy_cross_dir_smooth ); + +static void computeTargetPSDs_diffuse( const int16_t num_channels, const int16_t num_freq_bands, const int16_t start_band, const float *diffuse_power_factor, const float *reference_power, const float *diffuse_responses_square, float *cy_auto_diff_smooth ); + +static void computeTargetPSDs_diffuse_subframe( const int16_t num_channels, const int16_t num_freq_bands, const int16_t start_band, const float *diffuse_power_factor, const float *reference_power, const float *diffuse_responses_square, float *cy_auto_diff_smooth ); + +static void computeTargetPSDs_diffuse_with_onsets( const int16_t num_channels, const int16_t num_freq_bands, const int16_t num_decorr_freq_bands, const int16_t *proto_frame_diff_index, const float *diffuse_power_factor, const float *reference_power, const float *diffuse_responses_square, const float *onset_filter, float *cy_auto_diff_smooth ); + +static void computeAlphaSynthesis( float *alpha_synthesis, const int16_t averaging_length_ms, const float maxAlpha, int16_t *numAlphas, const int16_t slot_size, const int16_t num_freq_bands, const float *frequency_axis, const int32_t output_Fs ); + +static void spreadCoherencePanningHoa( const int16_t azimuth, const int16_t elevation, const float spreadCoh, float *direct_response, const int16_t num_channels_dir, const int16_t ambisonics_order ); + +static void spreadCoherencePanningVbap( const int16_t azimuth, const int16_t elevation, const float spreadCoh, float *direct_response, const int16_t num_channels_dir, const VBAP_HANDLE hVBAPdata ); + +static void normalizePanningGains( float *direct_response, const int16_t num_channels_dir ); + + +/*------------------------------------------------------------------------- + * ivas_dirac_dec_output_synthesis_open() + * + * + *------------------------------------------------------------------------*/ + +ivas_error ivas_dirac_dec_output_synthesis_open( + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, /* i/o: common spatial renderer data handle */ + DIRAC_REND_HANDLE hDirACRend, /* i/o: DirAC renderer handle */ + RENDERER_TYPE renderer_type, /* i : renderer type */ + const int16_t nchan_transport, /* i : number of transport channels */ + const int32_t output_Fs, /* i : output sampling rate */ + const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ +) +{ + int16_t idx, ch_idx; + int16_t size; + float tmp; + uint16_t num_diffuse_responses; + float temp_alpha_synthesis[CLDFB_NO_CHANNELS_MAX]; + + /* pointers to structs for allocation */ + DIRAC_OUTPUT_SYNTHESIS_PARAMS *dirac_output_synthesis_params = &( hDirACRend->h_output_synthesis_psd_params ); + DIRAC_OUTPUT_SYNTHESIS_STATE *dirac_output_synthesis_state = &( hDirACRend->h_output_synthesis_psd_state ); + + /* check / set input parameters */ + assert( hSpatParamRendCom->num_freq_bands > 0 && "Error: Number of frequency bands <= 0!" ); + assert( hDirACRend->hOutSetup.nchan_out_woLFE > 0 && "Error: Number of output channels > 0!" ); + assert( hDirACRend->num_outputs_diff > 0 ); + assert( hSpatParamRendCom->slot_size > 0 ); + assert( hDirACRend->hOutSetup.is_loudspeaker_setup == 0 || hDirACRend->hOutSetup.is_loudspeaker_setup == 1 ); + assert( hDirACRend->diffuse_response_function != NULL ); + + if ( hDirACRend->proto_signal_decorr_on ) + { + dirac_output_synthesis_params->max_band_decorr = hDirACRend->h_freq_domain_decorr_ap_params->max_band_decorr; + } + else + { + dirac_output_synthesis_params->max_band_decorr = 0; + } + + /*-----------------------------------------------------------------* + * memory allocation + *-----------------------------------------------------------------*/ + + dirac_output_synthesis_state->diffuse_responses_square = NULL; + if ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_MONO ) + { + if ( ( dirac_output_synthesis_state->diffuse_responses_square = (float *) malloc( 2 * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis\n" ) ); + } + } + else if ( hDirACRend->synthesisConf != DIRAC_SYNTHESIS_GAIN_SHD ) + { + if ( ( dirac_output_synthesis_state->diffuse_responses_square = (float *) malloc( hDirACRend->hOutSetup.nchan_out_woLFE * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis\n" ) ); + } + } + + /* prototype power buffers */ + dirac_output_synthesis_state->proto_power_smooth_prev = NULL; + if ( hDirACRend->synthesisConf != DIRAC_SYNTHESIS_GAIN_SHD ) + { + if ( ( dirac_output_synthesis_state->proto_power_smooth_prev = (float *) malloc( hSpatParamRendCom->num_freq_bands * hDirACRend->num_protos_dir * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis\n" ) ); + } + } + if ( dirac_output_synthesis_params->max_band_decorr > 0 && ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_PSD_LS || hDirACRend->synthesisConf == DIRAC_SYNTHESIS_PSD_SHD ) ) + { + if ( ( dirac_output_synthesis_state->proto_power_diff_smooth_prev = (float *) malloc( dirac_output_synthesis_params->max_band_decorr * hDirACRend->hOutSetup.nchan_out_woLFE * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis\n" ) ); + } + } + else + { + dirac_output_synthesis_state->proto_power_diff_smooth_prev = NULL; + } + + /* buffer length and interpolator */ + if ( ( dirac_output_synthesis_params->interpolator = (float *) malloc( JBM_CLDFB_SLOTS_IN_SUBFRAME * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis\n" ) ); + } + + /* target PSD buffers */ + if ( hodirac_flag ) + { + size = hSpatParamRendCom->num_freq_bands * hDirACRend->num_outputs_dir * DIRAC_HO_NUMSECTORS; + } + else + { + size = hSpatParamRendCom->num_freq_bands * hDirACRend->num_outputs_dir; + } + if ( ( dirac_output_synthesis_state->cy_cross_dir_smooth_prev = (float *) malloc( size * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis\n" ) ); + } + + if ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) + { + dirac_output_synthesis_state->cy_auto_dir_smooth_prev = NULL; + if ( ( dirac_output_synthesis_state->cy_auto_diff_smooth_prev = (float *) malloc( dirac_output_synthesis_params->max_band_decorr * hDirACRend->num_outputs_diff * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis\n" ) ); + } + } + else + { + if ( ( dirac_output_synthesis_state->cy_auto_dir_smooth_prev = (float *) malloc( hSpatParamRendCom->num_freq_bands * hDirACRend->num_outputs_dir * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis\n" ) ); + } + + if ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_PSD_SHD ) + { + if ( ( dirac_output_synthesis_state->cy_auto_diff_smooth_prev = (float *) malloc( hSpatParamRendCom->num_freq_bands * hDirACRend->num_outputs_dir * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis\n" ) ); + } + } + else + { + if ( ( dirac_output_synthesis_state->cy_auto_diff_smooth_prev = (float *) malloc( hSpatParamRendCom->num_freq_bands * hDirACRend->num_outputs_diff * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis\n" ) ); + } + } + } + + /* direct and diffuse gain buffers */ + if ( ( dirac_output_synthesis_state->gains_dir_prev = (float *) malloc( size * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis\n" ) ); + } + + if ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) + { + if ( ( dirac_output_synthesis_state->gains_diff_prev = (float *) malloc( dirac_output_synthesis_params->max_band_decorr * hDirACRend->num_outputs_diff * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis\n" ) ); + } + } + else if ( hDirACRend->synthesisConf != DIRAC_SYNTHESIS_PSD_SHD && hDirACRend->synthesisConf != DIRAC_SYNTHESIS_MONO ) + { + if ( ( dirac_output_synthesis_state->gains_diff_prev = (float *) malloc( hSpatParamRendCom->num_freq_bands * hDirACRend->num_outputs_diff * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis\n" ) ); + } + } + else + { + if ( ( dirac_output_synthesis_state->gains_diff_prev = (float *) malloc( hSpatParamRendCom->num_freq_bands * hDirACRend->num_outputs_dir * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis\n" ) ); + } + } + + /*-----------------------------------------------------------------* + * prepare processing parameters + *-----------------------------------------------------------------*/ + + /* compute alpha */ + if ( !( renderer_type == RENDERER_BINAURAL_PARAMETRIC || renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || hDirACRend->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) ) + { + computeAlphaSynthesis( temp_alpha_synthesis, DIRAC_AVG_LENGTH_SYNTH_MS, DIRAC_ALPHA_MAX, &dirac_output_synthesis_params->numAlphas, hSpatParamRendCom->slot_size, hSpatParamRendCom->num_freq_bands, hDirACRend->frequency_axis, output_Fs ); + if ( ( dirac_output_synthesis_params->alpha_synthesis = (float *) malloc( dirac_output_synthesis_params->numAlphas * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis\n" ) ); + } + mvr2r( temp_alpha_synthesis, dirac_output_synthesis_params->alpha_synthesis, dirac_output_synthesis_params->numAlphas ); + + computeAlphaSynthesis( temp_alpha_synthesis, DIRAC_AVG_LENGTH_SYNTH_MS_FAST, DIRAC_ALPHA_MAX_FAST, &dirac_output_synthesis_params->numAlphasFast, hSpatParamRendCom->slot_size, hSpatParamRendCom->num_freq_bands, hDirACRend->frequency_axis, output_Fs ); + if ( ( dirac_output_synthesis_params->alpha_synthesis_fast = (float *) malloc( dirac_output_synthesis_params->numAlphasFast * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis\n" ) ); + } + mvr2r( temp_alpha_synthesis, dirac_output_synthesis_params->alpha_synthesis_fast, dirac_output_synthesis_params->numAlphasFast ); + + if ( ( dirac_output_synthesis_state->reference_power_smooth_prev = (float *) malloc( hSpatParamRendCom->num_freq_bands * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis\n" ) ); + } + if ( ( dirac_output_synthesis_state->direction_smoothness_prev = (float *) malloc( hSpatParamRendCom->num_freq_bands * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis\n" ) ); + } + set_zero( dirac_output_synthesis_state->reference_power_smooth_prev, hSpatParamRendCom->num_freq_bands ); + set_zero( dirac_output_synthesis_state->direction_smoothness_prev, hSpatParamRendCom->num_freq_bands ); + } + else + { + dirac_output_synthesis_params->alpha_synthesis = NULL; + dirac_output_synthesis_params->alpha_synthesis_fast = NULL; + dirac_output_synthesis_state->reference_power_smooth_prev = NULL; + dirac_output_synthesis_state->direction_smoothness_prev = NULL; + } + + /* compute interpolator */ + for ( idx = 1; idx <= JBM_CLDFB_SLOTS_IN_SUBFRAME; ++idx ) + { + dirac_output_synthesis_params->interpolator[idx - 1] = (float) idx / (float) JBM_CLDFB_SLOTS_IN_SUBFRAME; + } + + /* prepare diffuse response function */ + if ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_MONO ) + { + num_diffuse_responses = 2; + } + else + { + num_diffuse_responses = hDirACRend->hOutSetup.nchan_out_woLFE; + } + + if ( dirac_output_synthesis_state->diffuse_responses_square != NULL ) + { + for ( ch_idx = 0; ch_idx < num_diffuse_responses; ++ch_idx ) + { + /*dirac_output_synthesis_state->diffuse_responses_square[ch_idx] = pow(dirac_output_synthesis_params->diffuse_response_function[ch_idx]/max_response, 2.0f);*/ + tmp = hDirACRend->diffuse_response_function[ch_idx]; + + dirac_output_synthesis_state->diffuse_responses_square[ch_idx] = tmp * tmp; + } + } + + if ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) + { + int16_t diff_compensation_order; + float diff_nrg_total, diff_nrg, diff_nrg_trans, diff_nrg_decorr; + + diff_compensation_order = nchan_transport >= 3 ? 3 : 2; /* compensate missing diffuseness modelling up order 2, except for HR*/ + diff_compensation_order = min( diff_compensation_order, hDirACRend->hOutSetup.ambisonics_order ); + + diff_nrg_total = 0; + diff_nrg_trans = 0; + diff_nrg_decorr = 0; + for ( ch_idx = 0; ch_idx < ( diff_compensation_order + 1 ) * ( diff_compensation_order + 1 ); ch_idx++ ) + { + diff_nrg = hDirACRend->diffuse_response_function[ch_idx] * hDirACRend->diffuse_response_function[ch_idx]; + diff_nrg_total += diff_nrg; + /* is it a transport channel?*/ + if ( ch_idx == 0 || hDirACRend->proto_index_dir[ch_idx] != 0 ) + { + diff_nrg_trans += diff_nrg; + } + /* is it a decorrelated or transport channel?*/ + if ( ch_idx < hDirACRend->num_outputs_diff ) + { + diff_nrg_decorr += diff_nrg; + } + } + dirac_output_synthesis_params->diffuse_compensation_factor = diff_nrg_total / diff_nrg_trans; + dirac_output_synthesis_params->diffuse_compensation_factor_decorr = diff_nrg_total / diff_nrg_decorr; + } + else + { + dirac_output_synthesis_params->diffuse_compensation_factor = 0.f; + dirac_output_synthesis_params->diffuse_compensation_factor_decorr = 0.f; + } + + return IVAS_ERR_OK; +} + + +/*------------------------------------------------------------------------- + * ivas_dirac_dec_output_synthesis_init() + * + * + *------------------------------------------------------------------------*/ + +void ivas_dirac_dec_output_synthesis_init( + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, /* i/o: common spatial renderer data handle */ + DIRAC_REND_HANDLE hDirACRend, /* i/o: DirAC renderer handle */ + const int16_t nchan_out_woLFE, /* i : number of output audio channels without LFE */ + const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ +) +{ + int16_t size; + + DIRAC_OUTPUT_SYNTHESIS_PARAMS *h_dirac_output_synthesis_params; + DIRAC_OUTPUT_SYNTHESIS_STATE *h_dirac_output_synthesis_state; + + h_dirac_output_synthesis_params = &( hDirACRend->h_output_synthesis_psd_params ); + h_dirac_output_synthesis_state = &( hDirACRend->h_output_synthesis_psd_state ); + + /*-----------------------------------------------------------------* + * init outputSynthesisPSD_Init + *-----------------------------------------------------------------*/ + + /* initialize buffers */ + if ( h_dirac_output_synthesis_state->cy_auto_dir_smooth_prev != NULL ) + { + set_zero( h_dirac_output_synthesis_state->cy_auto_dir_smooth_prev, hSpatParamRendCom->num_freq_bands * hDirACRend->num_outputs_dir ); + } + + if ( hodirac_flag ) + { + size = hSpatParamRendCom->num_freq_bands * hDirACRend->num_outputs_dir * DIRAC_HO_NUMSECTORS; + } + else + { + size = hSpatParamRendCom->num_freq_bands * hDirACRend->num_outputs_dir; + } + set_zero( h_dirac_output_synthesis_state->cy_cross_dir_smooth_prev, size ); + + if ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) + { + set_zero( h_dirac_output_synthesis_state->cy_auto_diff_smooth_prev, h_dirac_output_synthesis_params->max_band_decorr * hDirACRend->num_outputs_diff ); + } + else if ( hDirACRend->synthesisConf != DIRAC_SYNTHESIS_PSD_SHD ) + { + set_zero( h_dirac_output_synthesis_state->cy_auto_diff_smooth_prev, hSpatParamRendCom->num_freq_bands * hDirACRend->num_outputs_diff ); + } + else + { + set_zero( h_dirac_output_synthesis_state->cy_auto_diff_smooth_prev, hSpatParamRendCom->num_freq_bands * hDirACRend->num_outputs_dir ); + } + + if ( h_dirac_output_synthesis_state->proto_power_smooth_prev != NULL ) + { + set_zero( h_dirac_output_synthesis_state->proto_power_smooth_prev, hSpatParamRendCom->num_freq_bands * hDirACRend->num_protos_dir ); + } + set_zero( h_dirac_output_synthesis_state->gains_dir_prev, size ); + + if ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) + { + set_zero( h_dirac_output_synthesis_state->gains_diff_prev, h_dirac_output_synthesis_params->max_band_decorr * hDirACRend->num_outputs_diff ); + } + else + { + set_zero( h_dirac_output_synthesis_state->gains_diff_prev, hSpatParamRendCom->num_freq_bands * hDirACRend->num_outputs_dir ); + } + + if ( h_dirac_output_synthesis_state->proto_power_diff_smooth_prev != NULL ) + { + set_zero( h_dirac_output_synthesis_state->proto_power_diff_smooth_prev, h_dirac_output_synthesis_params->max_band_decorr * nchan_out_woLFE ); + } + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_dirac_dec_output_synthesis_close() + * + * Memory deallocation of Output synthesis sub-module + *------------------------------------------------------------------------*/ + +void ivas_dirac_dec_output_synthesis_close( + DIRAC_REND_HANDLE hDirACRend /* i/o: DirAC handle */ +) +{ + /* pointers to structs for allocation */ + DIRAC_OUTPUT_SYNTHESIS_PARAMS *dirac_output_synthesis_params = &( hDirACRend->h_output_synthesis_psd_params ); + DIRAC_OUTPUT_SYNTHESIS_STATE *dirac_output_synthesis_state = &( hDirACRend->h_output_synthesis_psd_state ); + + /*-----------------------------------------------------------------* + * memory deallocation + *-----------------------------------------------------------------*/ + + /* free interpolator */ + if ( ( dirac_output_synthesis_params )->interpolator != NULL ) + { + free( ( dirac_output_synthesis_params )->interpolator ); + ( dirac_output_synthesis_params )->interpolator = NULL; + } + + /* free alpha */ + if ( ( dirac_output_synthesis_params )->alpha_synthesis != NULL ) + { + free( ( dirac_output_synthesis_params )->alpha_synthesis ); + ( dirac_output_synthesis_params )->alpha_synthesis = NULL; + } + if ( ( dirac_output_synthesis_params )->alpha_synthesis_fast != NULL ) + { + free( ( dirac_output_synthesis_params )->alpha_synthesis_fast ); + ( dirac_output_synthesis_params )->alpha_synthesis_fast = NULL; + } + + if ( ( dirac_output_synthesis_state )->reference_power_smooth_prev != NULL ) + { + free( ( dirac_output_synthesis_state )->reference_power_smooth_prev ); + ( dirac_output_synthesis_state )->reference_power_smooth_prev = NULL; + } + + if ( ( dirac_output_synthesis_state )->direction_smoothness_prev != NULL ) + { + free( ( dirac_output_synthesis_state )->direction_smoothness_prev ); + ( dirac_output_synthesis_state )->direction_smoothness_prev = NULL; + } + + if ( ( dirac_output_synthesis_state )->diffuse_responses_square != NULL ) + { + free( ( dirac_output_synthesis_state )->diffuse_responses_square ); + ( dirac_output_synthesis_state )->diffuse_responses_square = NULL; + } + + /* free power buffers */ + if ( ( dirac_output_synthesis_state )->proto_power_smooth_prev != NULL ) + { + free( ( dirac_output_synthesis_state )->proto_power_smooth_prev ); + ( dirac_output_synthesis_state )->proto_power_smooth_prev = NULL; + } + + if ( ( dirac_output_synthesis_state )->proto_power_diff_smooth_prev != NULL ) + { + free( ( dirac_output_synthesis_state )->proto_power_diff_smooth_prev ); + ( dirac_output_synthesis_state )->proto_power_diff_smooth_prev = NULL; + } + + /* free target power buffers */ + if ( ( dirac_output_synthesis_state )->cy_auto_dir_smooth_prev != NULL ) + { + free( ( dirac_output_synthesis_state )->cy_auto_dir_smooth_prev ); + ( dirac_output_synthesis_state )->cy_auto_dir_smooth_prev = NULL; + } + if ( ( dirac_output_synthesis_state )->cy_cross_dir_smooth_prev != NULL ) + { + free( ( dirac_output_synthesis_state )->cy_cross_dir_smooth_prev ); + ( dirac_output_synthesis_state )->cy_cross_dir_smooth_prev = NULL; + } + if ( ( dirac_output_synthesis_state )->cy_auto_diff_smooth_prev != NULL ) + { + free( ( dirac_output_synthesis_state )->cy_auto_diff_smooth_prev ); + ( dirac_output_synthesis_state )->cy_auto_diff_smooth_prev = NULL; + } + + /* free gain buffers */ + if ( ( dirac_output_synthesis_state )->gains_dir_prev != NULL ) + { + free( ( dirac_output_synthesis_state )->gains_dir_prev ); + ( dirac_output_synthesis_state )->gains_dir_prev = NULL; + } + if ( ( dirac_output_synthesis_state )->gains_diff_prev != NULL ) + { + free( ( dirac_output_synthesis_state )->gains_diff_prev ); + ( dirac_output_synthesis_state )->gains_diff_prev = NULL; + } + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_dirac_dec_output_synthesis_process_slot() + * + * + *------------------------------------------------------------------------*/ + +void ivas_dirac_dec_output_synthesis_process_slot( + const float *reference_power, /* i : Estimated power */ + const float *onset, /* i : onset filter */ + const int16_t *azimuth, + const int16_t *elevation, + const float *diffuseness, + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, /* i/o: common spatial renderer data handle */ + DIRAC_REND_HANDLE hDirACRend, /* i/o: DirAC renderer handle */ + const int16_t sh_rot_max_order, + const float *p_Rmat, /* i : rotation matrix */ + const VBAP_HANDLE hVBAPdata, /* i : VBAP structure */ + const IVAS_OUTPUT_SETUP hOutSetup, /* i : output setup structure */ + const int16_t nchan_transport, /* i : number of transport channels*/ + const int16_t md_idx, + const int16_t hodirac_flag, /* i : flag to indicate HO-DirAC mode */ + const int16_t dec_param_estim ) +{ + int16_t num_freq_bands, num_channels_dir; + int16_t num_freq_bands_diff, num_channels_diff; + int16_t ch_idx; + float aux_buf[CLDFB_NO_CHANNELS_MAX]; + int16_t diff_start_band; + DIRAC_OUTPUT_SYNTHESIS_PARAMS *h_dirac_output_synthesis_params; + DIRAC_OUTPUT_SYNTHESIS_STATE *h_dirac_output_synthesis_state; + + h_dirac_output_synthesis_params = &( hDirACRend->h_output_synthesis_psd_params ); + h_dirac_output_synthesis_state = &( hDirACRend->h_output_synthesis_psd_state ); + + h_dirac_output_synthesis_state->onset_filter = onset; + + /*-----------------------------------------------------------------* + * processing + *-----------------------------------------------------------------*/ + + /* collect some often used parameters */ + num_freq_bands = hSpatParamRendCom->num_freq_bands; + num_channels_dir = hDirACRend->num_outputs_dir; + num_channels_diff = hDirACRend->num_outputs_diff; + num_freq_bands_diff = h_dirac_output_synthesis_params->max_band_decorr; + + if ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_PSD_LS ) + { + num_channels_dir = hOutSetup.nchan_out_woLFE; + } + + if ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD && hodirac_flag ) + { + ivas_dirac_dec_compute_directional_responses( hSpatParamRendCom, + hDirACRend, + hVBAPdata, + NULL, + NULL, + azimuth, + elevation, + md_idx, + NULL, + 2, + p_Rmat, + hodirac_flag ); + } + + if ( dec_param_estim == FALSE && hodirac_flag ) + { + if ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) + { + v_multc( hSpatParamRendCom->energy_ratio1[md_idx], -1.f, aux_buf, num_freq_bands ); + v_addc( aux_buf, 1.f, aux_buf, num_freq_bands ); + mvr2r( hSpatParamRendCom->energy_ratio1[md_idx], + h_dirac_output_synthesis_state->direct_power_factor, + num_freq_bands ); + mvr2r( aux_buf, + h_dirac_output_synthesis_state->diffuse_power_factor, + num_freq_bands ); + + v_multc( hSpatParamRendCom->energy_ratio2[md_idx], -1.f, aux_buf, num_freq_bands ); + v_addc( aux_buf, 1.f, aux_buf, num_freq_bands ); + mvr2r( hSpatParamRendCom->energy_ratio2[md_idx], + &h_dirac_output_synthesis_state->direct_power_factor[hSpatParamRendCom->num_freq_bands], + num_freq_bands ); + mvr2r( aux_buf, + &h_dirac_output_synthesis_state->diffuse_power_factor[hSpatParamRendCom->num_freq_bands], + num_freq_bands ); + } + else + { + ivas_dirac_dec_compute_gain_factors( num_freq_bands, + hSpatParamRendCom->diffuseness_vector[md_idx], + h_dirac_output_synthesis_params->max_band_decorr, + h_dirac_output_synthesis_state->direct_power_factor, + h_dirac_output_synthesis_state->diffuse_power_factor ); + } + } + else if ( dec_param_estim == TRUE ) + { + /* compute direct responses */ + ivas_dirac_dec_compute_directional_responses( hSpatParamRendCom, + hDirACRend, + hVBAPdata, + NULL, + NULL, + azimuth, + elevation, + md_idx, + NULL, + sh_rot_max_order, + p_Rmat, + hodirac_flag ); + + if ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) + { + ivas_dirac_dec_compute_gain_factors( num_freq_bands, + diffuseness, + h_dirac_output_synthesis_params->max_band_decorr, + h_dirac_output_synthesis_state->direct_power_factor, + h_dirac_output_synthesis_state->diffuse_power_factor ); + + v_multc( h_dirac_output_synthesis_state->direct_power_factor, + 0.25f, + h_dirac_output_synthesis_state->direct_power_factor, + num_freq_bands ); + v_multc( h_dirac_output_synthesis_state->diffuse_power_factor, + 0.25f, + h_dirac_output_synthesis_state->diffuse_power_factor, + num_freq_bands ); + + /*Direct gain*/ + for ( ch_idx = 0; ch_idx < min( 4, nchan_transport ); ch_idx++ ) + { + int16_t k; + if ( ch_idx != 0 ) + { + float a, b, c; + + /*Directonal sound gain nrg compensation*/ + for ( k = 0; k < num_freq_bands_diff; k++ ) + { + a = h_dirac_output_synthesis_state->direct_responses[ch_idx * num_freq_bands + k]; + b = reference_power[k + num_freq_bands] / ( reference_power[k + ( ch_idx + 1 ) * num_freq_bands] + EPSILON ); + c = 1.f + ( 1.f / 6.f ) * ( h_dirac_output_synthesis_params->diffuse_compensation_factor_decorr - 1.f ); /*Diffuseness modellling nrg compensation*/ + h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( diffuseness[k] * c + ( ( 1.f - diffuseness[k] ) * a * a * b ) ); + } + for ( ; k < num_freq_bands; k++ ) + { + a = h_dirac_output_synthesis_state->direct_responses[ch_idx * num_freq_bands + k]; + b = reference_power[k + num_freq_bands] / ( reference_power[k + ( ch_idx + 1 ) * num_freq_bands] + EPSILON ); + c = 1.f + ( 1.f / 6.f ) * ( h_dirac_output_synthesis_params->diffuse_compensation_factor - 1.f ); /*Diffuseness modellling nrg compensation*/ + h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( diffuseness[k] * c + ( ( 1.f - diffuseness[k] ) * a * a * b ) ); + } + } + else + { + /*Diffuseness modellling nrg compensation*/ + for ( k = 0; k < num_freq_bands_diff; k++ ) + { + h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( 1.0f + diffuseness[k] * 0.5f * ( h_dirac_output_synthesis_params->diffuse_compensation_factor_decorr - 1.f ) ); + } + for ( ; k < num_freq_bands; k++ ) + { + h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( 1.0f + diffuseness[k] * 0.5f * ( h_dirac_output_synthesis_params->diffuse_compensation_factor - 1.f ) ); + } + } + } + + /*Directional gain (panning)*/ + for ( ch_idx = min( 4, nchan_transport ); ch_idx < num_channels_dir; ch_idx++ ) + { + v_mult( h_dirac_output_synthesis_state->direct_power_factor, + &h_dirac_output_synthesis_state->direct_responses[ch_idx * num_freq_bands], + aux_buf, + num_freq_bands ); + + v_add( aux_buf, + &h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands], + &h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands], + num_freq_bands ); + } + + /*Diffuse gain*/ + for ( ch_idx = min( 4, nchan_transport ); ch_idx < num_channels_diff; ch_idx++ ) + { + v_multc( h_dirac_output_synthesis_state->diffuse_power_factor, + hDirACRend->diffuse_response_function[ch_idx], + aux_buf, + num_freq_bands_diff ); + + v_add( aux_buf, + &h_dirac_output_synthesis_state->cy_auto_diff_smooth[ch_idx * num_freq_bands_diff], + &h_dirac_output_synthesis_state->cy_auto_diff_smooth[ch_idx * num_freq_bands_diff], + num_freq_bands_diff ); + } + + return; + } + else + { + /* compute reference and diffuse power factor for this frame */ + ivas_dirac_dec_compute_power_factors( num_freq_bands, + diffuseness, + h_dirac_output_synthesis_params->max_band_decorr, + h_dirac_output_synthesis_state->direct_power_factor, + h_dirac_output_synthesis_state->diffuse_power_factor ); + } + } + + diff_start_band = 0; + if ( h_dirac_output_synthesis_params->use_onset_filters ) + { + computeTargetPSDs_diffuse_with_onsets( num_channels_dir, + num_freq_bands, h_dirac_output_synthesis_params->max_band_decorr, + hDirACRend->proto_index_diff, + h_dirac_output_synthesis_state->diffuse_power_factor, + reference_power, + h_dirac_output_synthesis_state->diffuse_responses_square, + onset, + h_dirac_output_synthesis_state->cy_auto_diff_smooth ); + + diff_start_band = h_dirac_output_synthesis_params->max_band_decorr; + } + + /* process other PSDs only slot wise for 4 transport channels */ + if ( dec_param_estim == TRUE ) + { + computeTargetPSDs_direct( num_channels_dir, num_freq_bands, h_dirac_output_synthesis_state->direct_power_factor, reference_power, h_dirac_output_synthesis_state->direct_responses, h_dirac_output_synthesis_state->direct_responses_square, h_dirac_output_synthesis_state->cy_auto_dir_smooth, h_dirac_output_synthesis_state->cy_cross_dir_smooth ); + + computeTargetPSDs_diffuse( num_channels_dir, num_freq_bands, diff_start_band, h_dirac_output_synthesis_state->diffuse_power_factor, reference_power, h_dirac_output_synthesis_state->diffuse_responses_square, h_dirac_output_synthesis_state->cy_auto_diff_smooth ); + } + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_dirac_dec_output_synthesis_process_subframe_gain_shd() + * + * + *------------------------------------------------------------------------*/ + +void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( + float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : LS signals */ + float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : LS signals */ + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, /* i/o: common spatial renderer data handle */ + DIRAC_REND_HANDLE hDirACRend, /* i/o: DirAC renderer handle */ + const int16_t nchan_transport, /* i : number of transport channels */ + const int16_t nbslots, /* i : number of slots to process */ + const float *onset_filter, + float *diffuseness, + const int16_t hodirac_flag, /* i : flag to indicate HO-DirAC mode */ + const int16_t dec_param_estim ) +{ + int16_t buf_idx, ch_idx, i, l; + int16_t num_freq_bands, num_freq_bands_diff; + int16_t num_channels_dir, num_channels_diff; + float g, g1, g2; + float *p_gains_dir, *p_gains_diff; + float *p_gains_dir_prev, *p_gains_diff_prev; + float *p_cy_cross_dir_smooth; + float *p_cy_auto_diff_smooth; + float *p_proto, *p_out_real, *p_out_imag; + float *p_proto_diff; + int16_t *proto_direct_index, num_protos_dir; + float output_real[CLDFB_NO_CHANNELS_MAX * MAX_OUTPUT_CHANNELS]; + float output_imag[CLDFB_NO_CHANNELS_MAX * MAX_OUTPUT_CHANNELS]; + DIRAC_OUTPUT_SYNTHESIS_PARAMS h_dirac_output_synthesis_params; + DIRAC_OUTPUT_SYNTHESIS_STATE h_dirac_output_synthesis_state; + int16_t nchan_transport_foa; + int16_t ch_idx_diff; + float aux_buf[CLDFB_NO_CHANNELS_MAX]; + float ratio[DIRAC_HO_NUMSECTORS * CLDFB_NO_CHANNELS_MAX]; + + /* collect some often used parameters */ + h_dirac_output_synthesis_params = hDirACRend->h_output_synthesis_psd_params; + h_dirac_output_synthesis_state = hDirACRend->h_output_synthesis_psd_state; + proto_direct_index = hDirACRend->proto_index_dir; + + num_protos_dir = hDirACRend->num_protos_dir; + num_freq_bands = hSpatParamRendCom->num_freq_bands; + num_freq_bands_diff = h_dirac_output_synthesis_params.max_band_decorr; + num_channels_dir = hDirACRend->num_outputs_dir; + num_channels_diff = hDirACRend->num_outputs_diff; + nchan_transport_foa = min( 4, nchan_transport ); + + + /*-----------------------------------------------------------------* + * comput target Gains + *-----------------------------------------------------------------*/ + + if ( hodirac_flag ) + { + /*Direct gain*/ + for ( ch_idx = 0; ch_idx < nchan_transport_foa; ch_idx++ ) + { + v_multc( diffuseness, + 1.f, + &h_dirac_output_synthesis_state.cy_cross_dir_smooth[ch_idx * num_freq_bands], + num_freq_bands ); + v_multc( &h_dirac_output_synthesis_state.cy_cross_dir_smooth[ch_idx * num_freq_bands], + h_dirac_output_synthesis_params.diffuse_compensation_factor - 1.f, + &h_dirac_output_synthesis_state.cy_cross_dir_smooth[ch_idx * num_freq_bands], + num_freq_bands ); + + for ( l = 0; l < num_freq_bands; l++ ) + { + h_dirac_output_synthesis_state.cy_cross_dir_smooth[ch_idx * num_freq_bands + l] = sqrtf( 1.f + h_dirac_output_synthesis_state.cy_cross_dir_smooth[ch_idx * num_freq_bands + l] ); + } + } + + /*Directional gain*/ + for ( ch_idx = nchan_transport_foa; ch_idx < num_channels_dir; ch_idx++ ) + { + for ( l = 0; l < num_freq_bands; l++ ) + { + aux_buf[l] = 1.f - diffuseness[l]; + ratio[l] = 1.f - h_dirac_output_synthesis_state.direct_power_factor[hSpatParamRendCom->num_freq_bands + l]; + ratio[l + num_freq_bands] = 1.f - ratio[l]; + } + + v_mult( aux_buf, ratio, ratio, num_freq_bands ); + v_mult( aux_buf, &ratio[num_freq_bands], &ratio[num_freq_bands], num_freq_bands ); + + v_mult( ratio, + &h_dirac_output_synthesis_state.direct_responses[ch_idx * num_freq_bands], + &h_dirac_output_synthesis_state.cy_cross_dir_smooth[ch_idx * num_freq_bands], + num_freq_bands ); + v_mult( &ratio[num_freq_bands], + &h_dirac_output_synthesis_state.direct_responses[ch_idx * num_freq_bands + num_freq_bands * num_channels_dir], + &h_dirac_output_synthesis_state.cy_cross_dir_smooth[ch_idx * num_freq_bands + num_freq_bands * num_channels_dir], + num_freq_bands ); + } + + /*Diffuse gain*/ + for ( ch_idx = nchan_transport_foa; ch_idx < num_channels_diff; ch_idx++ ) + { + v_multc( h_dirac_output_synthesis_state.diffuse_power_factor, + hDirACRend->diffuse_response_function[ch_idx], + &h_dirac_output_synthesis_state.cy_auto_diff_smooth[ch_idx * num_freq_bands_diff], + num_freq_bands_diff ); + } + } + else if ( dec_param_estim == FALSE ) + { + /*Direct gain*/ + for ( ch_idx = 0; ch_idx < nchan_transport_foa; ch_idx++ ) + { + v_mult( h_dirac_output_synthesis_state.diffuse_power_factor, + h_dirac_output_synthesis_state.diffuse_power_factor, + &h_dirac_output_synthesis_state.cy_cross_dir_smooth[ch_idx * num_freq_bands], + num_freq_bands ); + v_multc( &h_dirac_output_synthesis_state.cy_cross_dir_smooth[ch_idx * num_freq_bands], + h_dirac_output_synthesis_params.diffuse_compensation_factor_decorr - 1.f, + &h_dirac_output_synthesis_state.cy_cross_dir_smooth[ch_idx * num_freq_bands], + num_freq_bands_diff ); + v_multc( &h_dirac_output_synthesis_state.cy_cross_dir_smooth[ch_idx * num_freq_bands + num_freq_bands_diff], + h_dirac_output_synthesis_params.diffuse_compensation_factor - 1.f, + &h_dirac_output_synthesis_state.cy_cross_dir_smooth[ch_idx * num_freq_bands + num_freq_bands_diff], + num_freq_bands - num_freq_bands_diff ); + + for ( l = 0; l < num_freq_bands; l++ ) + { + h_dirac_output_synthesis_state.cy_cross_dir_smooth[ch_idx * num_freq_bands + l] = sqrtf( 1.f + h_dirac_output_synthesis_state.cy_cross_dir_smooth[ch_idx * num_freq_bands + l] ); + } + } + + /*Directional gain*/ + for ( ch_idx = nchan_transport_foa; ch_idx < num_channels_dir; ch_idx++ ) + { + v_mult( h_dirac_output_synthesis_state.direct_power_factor, + &h_dirac_output_synthesis_state.direct_responses[ch_idx * num_freq_bands], + &h_dirac_output_synthesis_state.cy_cross_dir_smooth[ch_idx * num_freq_bands], num_freq_bands ); + } + + /*Diffuse gain*/ + for ( ch_idx = nchan_transport_foa; ch_idx < num_channels_diff; ch_idx++ ) + { + v_multc( h_dirac_output_synthesis_state.diffuse_power_factor, hDirACRend->diffuse_response_function[ch_idx], &h_dirac_output_synthesis_state.cy_auto_diff_smooth[ch_idx * num_freq_bands_diff], num_freq_bands_diff ); + } + } + + /*-----------------------------------------------------------------* + * compute gains + *-----------------------------------------------------------------*/ + + p_cy_cross_dir_smooth = h_dirac_output_synthesis_state.cy_cross_dir_smooth; + p_gains_dir = h_dirac_output_synthesis_state.cy_cross_dir_smooth_prev; + + /* Direct gains */ + if ( hodirac_flag ) + { + for ( ch_idx = 0; ch_idx < nchan_transport_foa; ch_idx++ ) + { + for ( l = 0; l < num_freq_bands; l++ ) + { + g1 = 0.3679f + onset_filter[l] * ( 0.1175f - 0.3679f ); + g2 = ( 1.f - g1 ) * *( p_gains_dir ); + g2 += g1 * ( *( p_cy_cross_dir_smooth++ ) ); + g2 = max( g2, 0.99f ); + g2 = min( g2, 2.0f ); + *( p_gains_dir++ ) = g2; + } + } + } + else + { + for ( ch_idx = 0; ch_idx < nchan_transport_foa; ch_idx++ ) + { + for ( l = 0; l < num_freq_bands; l++ ) + { + g1 = 0.3679f + onset_filter[l] * ( 0.1175f - 0.3679f ); + g2 = ( 1.f - g1 ) * *( p_gains_dir ); + g2 += g1 * ( *( p_cy_cross_dir_smooth++ ) ); + g2 = max( g2, 0.85f ); + g2 = min( g2, 1.15f ); + *( p_gains_dir++ ) = g2; + } + } + } + + /*Directional gains*/ + for ( ch_idx = nchan_transport_foa; ch_idx < num_channels_dir; ch_idx++ ) + { + for ( l = 0; l < num_freq_bands; l++ ) + { + g1 = 0.3679f + onset_filter[l] * ( 0.1175f - 0.3679f ); + g2 = ( 1.f - g1 ) * *( p_gains_dir ); + g2 += g1 * ( *( p_cy_cross_dir_smooth++ ) ); + g2 = max( g2, -DIRAC_GAIN_LIMIT ); + g2 = min( g2, DIRAC_GAIN_LIMIT ); + *( p_gains_dir++ ) = g2; + } + } + + if ( hodirac_flag ) + { + p_cy_cross_dir_smooth = h_dirac_output_synthesis_state.cy_cross_dir_smooth + num_freq_bands * num_channels_dir; + p_gains_dir = h_dirac_output_synthesis_state.cy_cross_dir_smooth_prev + num_freq_bands * num_channels_dir; + + /*Direct gains*/ + for ( ch_idx = 0; ch_idx < nchan_transport_foa; ch_idx++ ) + { + for ( l = 0; l < num_freq_bands; l++ ) + { + p_cy_cross_dir_smooth++; + p_gains_dir++; + } + } + + /*Directional gains*/ + for ( ch_idx = nchan_transport_foa; ch_idx < num_channels_dir; ch_idx++ ) + { + for ( l = 0; l < num_freq_bands; l++ ) + { + g1 = 0.3679f + onset_filter[l] * ( 0.1175f - 0.3679f ); + g2 = ( 1.f - g1 ) * *( p_gains_dir ); + g2 += g1 * ( *( p_cy_cross_dir_smooth++ ) ); + g2 = max( g2, -DIRAC_GAIN_LIMIT ); + g2 = min( g2, DIRAC_GAIN_LIMIT ); + *( p_gains_dir++ ) = g2; + } + } + } + + /*Diffuse gains*/ + p_cy_auto_diff_smooth = h_dirac_output_synthesis_state.cy_auto_diff_smooth + nchan_transport_foa * num_freq_bands_diff; + p_gains_diff = h_dirac_output_synthesis_state.cy_auto_diff_smooth_prev + nchan_transport_foa * num_freq_bands_diff; + for ( ch_idx = nchan_transport_foa; ch_idx < num_channels_diff; ch_idx++ ) + { + for ( l = 0; l < num_freq_bands_diff; l++ ) + { + g1 = 0.1175f; + g2 = ( 1.f - g1 ) * *( p_gains_diff ); + g2 += g1 * ( *( p_cy_auto_diff_smooth++ ) ); + g2 = max( g2, 0.f ); + g2 = min( g2, DIRAC_GAIN_LIMIT ); + *( p_gains_diff++ ) = g2; + } + } + + /*-----------------------------------------------------------------* + * gain interpolation and output streams + *-----------------------------------------------------------------*/ + + for ( buf_idx = 0; buf_idx < nbslots; ++buf_idx ) + { + g1 = h_dirac_output_synthesis_params.interpolator[buf_idx]; + g2 = 1.f - g1; + + /*Direct input->output*/ + p_gains_dir = h_dirac_output_synthesis_state.cy_cross_dir_smooth_prev; + p_gains_dir_prev = h_dirac_output_synthesis_state.gains_dir_prev; + for ( ch_idx = 0; ch_idx < nchan_transport_foa; ch_idx++ ) + { + p_proto_diff = h_dirac_output_synthesis_state.proto_diffuse_buffer_f + buf_idx * 2 * num_freq_bands * num_channels_diff + ch_idx * 2 * num_freq_bands; + for ( l = 0; l < num_freq_bands; l++ ) + { + g = g1 * ( *( p_gains_dir++ ) ) + g2 * ( *( p_gains_dir_prev++ ) ); + output_real[l * num_channels_dir + ch_idx] = g * ( *( p_proto_diff++ ) ); + output_imag[l * num_channels_dir + ch_idx] = g * ( *( p_proto_diff++ ) ); + } + } + + /*Directional stream*/ + for ( ch_idx = nchan_transport_foa; ch_idx < num_channels_dir; ch_idx++ ) + { + if ( hodirac_flag ) + { + if ( proto_direct_index[ch_idx] == 0 ) + { + float *p_proto2; + float gs1, gs2; + p_proto = h_dirac_output_synthesis_state.proto_direct_buffer_f + + buf_idx * 2 * num_freq_bands * num_protos_dir + + proto_direct_index[0] * 2 * num_freq_bands; + p_proto2 = h_dirac_output_synthesis_state.proto_direct_buffer_f + + buf_idx * 2 * num_freq_bands * num_protos_dir + + proto_direct_index[1] * 2 * num_freq_bands; + for ( l = 0; l < num_freq_bands; l++ ) + { + gs1 = g1 * ( *( p_gains_dir ) ) + g2 * ( *( p_gains_dir_prev ) ); + gs2 = g1 * ( *( p_gains_dir + num_freq_bands * num_channels_dir ) ) + g2 * ( *( p_gains_dir_prev + num_freq_bands * num_channels_dir ) ); + p_gains_dir++; + p_gains_dir_prev++; + + output_real[l * num_channels_dir + ch_idx] = 0.5f * gs1 * ( 1.772454e+00f * ( *p_proto ) + 1.023327e+00f * ( *p_proto2 ) ) + /* s1 */ + 0.5f * gs2 * ( 1.772454e+00f * ( *p_proto ) - 1.023327e+00f * ( *p_proto2 ) ); /* s2 */ + p_proto++; + p_proto2++; + output_imag[l * num_channels_dir + ch_idx] = 0.5f * gs1 * ( 1.772454e+00f * ( *p_proto ) + 1.023327e+00f * ( *p_proto2 ) ) + + 0.5f * gs2 * ( 1.772454e+00f * ( *p_proto ) - 1.023327e+00f * ( *p_proto2 ) ); + p_proto++; + p_proto2++; + } + } + else + { + p_proto = h_dirac_output_synthesis_state.proto_direct_buffer_f + + buf_idx * 2 * num_freq_bands * num_protos_dir + + proto_direct_index[ch_idx] * 2 * num_freq_bands; + for ( l = 0; l < num_freq_bands; l++ ) + { + p_gains_dir++; + p_gains_dir_prev++; + + + output_real[l * num_channels_dir + ch_idx] = *( p_proto++ ); + output_imag[l * num_channels_dir + ch_idx] = *( p_proto++ ); + } + } + } + else + { + p_proto = h_dirac_output_synthesis_state.proto_direct_buffer_f + + buf_idx * 2 * num_freq_bands * num_protos_dir + + proto_direct_index[ch_idx] * 2 * num_freq_bands; + if ( proto_direct_index[ch_idx] == 0 ) + { + for ( l = 0; l < num_freq_bands; l++ ) + { + g = g1 * ( *( p_gains_dir++ ) ) + g2 * ( *( p_gains_dir_prev++ ) ); + output_real[l * num_channels_dir + ch_idx] = g * ( *( p_proto++ ) ); + output_imag[l * num_channels_dir + ch_idx] = g * ( *( p_proto++ ) ); + } + } + else + { + for ( l = 0; l < num_freq_bands; l++ ) + { + p_gains_dir++; + p_gains_dir_prev++; + output_real[l * num_channels_dir + ch_idx] = *( p_proto++ ); + output_imag[l * num_channels_dir + ch_idx] = *( p_proto++ ); + } + } + } + } + + /*Diffuse stream*/ + p_gains_diff = h_dirac_output_synthesis_state.cy_auto_diff_smooth_prev + nchan_transport_foa * num_freq_bands_diff; + p_gains_diff_prev = h_dirac_output_synthesis_state.gains_diff_prev + nchan_transport_foa * num_freq_bands_diff; + ch_idx_diff = nchan_transport_foa; + for ( ch_idx = nchan_transport_foa; ch_idx < num_channels_diff; ch_idx++ ) + { + if ( proto_direct_index[ch_idx] == 0 ) + { + p_proto = h_dirac_output_synthesis_state.proto_diffuse_buffer_f + buf_idx * 2 * num_freq_bands * num_channels_diff + ch_idx_diff * 2 * num_freq_bands; + ch_idx_diff++; + for ( l = 0; l < num_freq_bands_diff; l++ ) + { + g = g1 * ( *( p_gains_diff++ ) ) + g2 * ( *( p_gains_diff_prev++ ) ); + output_real[l * num_channels_dir + hDirACRend->sba_map_tc[ch_idx]] += g * ( *( p_proto++ ) ); /* maps ch_idx 5 to 8 */ + output_imag[l * num_channels_dir + hDirACRend->sba_map_tc[ch_idx]] += g * ( *( p_proto++ ) ); + } + } + else + { + for ( l = 0; l < num_freq_bands_diff; l++ ) + { + p_gains_diff++; + p_gains_diff_prev++; + } + } + } + + /*-----------------------------------------------------------------* + * Copy output or HOA decoder + *-----------------------------------------------------------------*/ + + if ( hDirACRend->hOutSetup.is_loudspeaker_setup && hDirACRend->hoa_decoder != NULL ) + { + float *p_real, *p_imag; + const float *hoa_decoder; + + hoa_decoder = hDirACRend->hoa_decoder; + + for ( ch_idx = 0; ch_idx < hDirACRend->hOutSetup.nchan_out_woLFE; ch_idx++ ) + { + p_real = RealBuffer[ch_idx][buf_idx]; + p_imag = ImagBuffer[ch_idx][buf_idx]; + + for ( l = 0; l < num_freq_bands; l++ ) + { + p_out_real = output_real + l * num_channels_dir; + p_out_imag = output_imag + l * num_channels_dir; + p_real[l] = *( p_out_real++ ) * hoa_decoder[0]; + p_imag[l] = *( p_out_imag++ ) * hoa_decoder[0]; + for ( i = 1; i < num_channels_dir; i++ ) + { + p_real[l] += *( p_out_real++ ) * hoa_decoder[i]; + p_imag[l] += *( p_out_imag++ ) * hoa_decoder[i]; + } + } + hoa_decoder += 16; + } + } + else + { + for ( ch_idx = 0; ch_idx < num_channels_dir; ch_idx++ ) + { + for ( l = 0; l < num_freq_bands; l++ ) + { + RealBuffer[ch_idx][buf_idx][l] = output_real[l * num_channels_dir + ch_idx]; + ImagBuffer[ch_idx][buf_idx][l] = output_imag[l * num_channels_dir + ch_idx]; + } + } + } + } + + /*-----------------------------------------------------------------* + * update buffers + *-----------------------------------------------------------------*/ + + /* store estimates for next synthesis block */ + if ( hodirac_flag ) + { + mvr2r( h_dirac_output_synthesis_state.cy_cross_dir_smooth_prev, h_dirac_output_synthesis_state.gains_dir_prev, num_freq_bands * num_channels_dir * DIRAC_HO_NUMSECTORS ); + } + else + { + mvr2r( h_dirac_output_synthesis_state.cy_cross_dir_smooth_prev, h_dirac_output_synthesis_state.gains_dir_prev, num_freq_bands * num_channels_dir ); + } + + mvr2r( h_dirac_output_synthesis_state.cy_auto_diff_smooth_prev, h_dirac_output_synthesis_state.gains_diff_prev, num_freq_bands_diff * num_channels_diff ); + + /* reset values */ + if ( hodirac_flag ) + { + set_zero( h_dirac_output_synthesis_state.cy_cross_dir_smooth, num_freq_bands * num_channels_dir * DIRAC_HO_NUMSECTORS ); + } + else + { + set_zero( h_dirac_output_synthesis_state.cy_cross_dir_smooth, num_freq_bands * num_channels_dir ); + } + + set_zero( h_dirac_output_synthesis_state.cy_auto_diff_smooth, num_freq_bands_diff * num_channels_diff ); + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_dirac_dec_output_synthesis_process_subframe_psd_ls() + * + * + *------------------------------------------------------------------------*/ + +void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls( + float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : LS signals */ + float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : LS signals */ + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, /* i/o: common spatial renderer data handle */ + DIRAC_REND_HANDLE hDirACRend, /* i/o: DirAC renderer handle */ + const int16_t nbslots, /* i : number of slots to process */ + float *diffuseness_vector, + float *reference_power_smooth, + float qualityBasedSmFactor, + const int16_t enc_param_start_band ) +{ + int16_t buf_idx, num_freq_bands; + int16_t diff_start_band; + int16_t k, l; + int16_t nchan_out_woLFE; + float *p_power_smooth_prev, *p_power_diff_smooth_prev; + float *p_gain_1, *p_gain_2; + float *p_power_smooth_diff, *p_power_smooth; + float *p_gains_dir, *p_gains_diff; + float g, g1, g2; + float *p_cy_auto_dir_smooth, *p_cy_auto_dir_smooth_prev; + float *p_cy_cross_dir_smooth, *p_cy_cross_dir_smooth_prev; + float *p_cy_auto_diff_smooth, *p_cy_auto_diff_smooth_prev; + float gains_dir[CLDFB_NO_CHANNELS_MAX * MAX_OUTPUT_CHANNELS]; + float gains_diff[CLDFB_NO_CHANNELS_MAX * MAX_OUTPUT_CHANNELS]; + DIRAC_OUTPUT_SYNTHESIS_PARAMS *h_dirac_output_synthesis_params; + DIRAC_OUTPUT_SYNTHESIS_STATE *h_dirac_output_synthesis_state; + int16_t *proto_direct_index, num_protos_dir; + float target_power_y; + float subtract_power_y; + float subtract_target_ratio; + float subtract_target_ratio_db; + float a, b; + uint16_t nchan_target_psds; + float alpha[CLDFB_NO_CHANNELS_MAX]; + float *alpha_synthesis; + float *alpha_synthesis_fast; + int16_t alphaMaxBin; + int16_t alphaMaxBinFast; + + push_wmops( "dirac_out_synth_sfr" ); + + h_dirac_output_synthesis_params = &( hDirACRend->h_output_synthesis_psd_params ); + h_dirac_output_synthesis_state = &( hDirACRend->h_output_synthesis_psd_state ); + proto_direct_index = hDirACRend->proto_index_dir; + num_protos_dir = hDirACRend->num_protos_dir; + nchan_out_woLFE = hDirACRend->hOutSetup.nchan_out_woLFE; + + /* collect some often used parameters */ + num_freq_bands = hSpatParamRendCom->num_freq_bands; + + /*-----------------------------------------------------------------* + * compute target PSDs + *-----------------------------------------------------------------*/ + + if ( enc_param_start_band == 0 ) + { + diff_start_band = h_dirac_output_synthesis_params->use_onset_filters == 1 ? h_dirac_output_synthesis_params->max_band_decorr : 0; + + if ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_MONO ) + { + nchan_target_psds = 2; + } + else + { + nchan_target_psds = nchan_out_woLFE; + } + + computeTargetPSDs_direct_subframe( nchan_target_psds, num_freq_bands, + h_dirac_output_synthesis_state->direct_power_factor, + reference_power_smooth, + h_dirac_output_synthesis_state->direct_responses, + h_dirac_output_synthesis_state->direct_responses_square, + h_dirac_output_synthesis_state->cy_auto_dir_smooth, + h_dirac_output_synthesis_state->cy_cross_dir_smooth ); + + computeTargetPSDs_diffuse_subframe( nchan_target_psds, num_freq_bands, diff_start_band, + h_dirac_output_synthesis_state->diffuse_power_factor, + reference_power_smooth, + h_dirac_output_synthesis_state->diffuse_responses_square, + h_dirac_output_synthesis_state->cy_auto_diff_smooth ); + } + + /*-----------------------------------------------------------------* + * compute variables for stereo transport signal type detection + *-----------------------------------------------------------------*/ + + if ( hDirACRend->masa_stereo_type_detect != NULL ) + { + MASA_STEREO_TYPE_DETECT *masa_stereo_type_detect = hDirACRend->masa_stereo_type_detect; + + p_cy_auto_dir_smooth = h_dirac_output_synthesis_state->cy_auto_dir_smooth; + p_cy_auto_diff_smooth = h_dirac_output_synthesis_state->cy_auto_diff_smooth; + if ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_MONO ) + { + target_power_y = p_cy_auto_dir_smooth[num_freq_bands] / ( sqrtf( h_dirac_output_synthesis_state->direct_power_factor[0] ) + EPSILON ); + target_power_y += p_cy_auto_diff_smooth[num_freq_bands] / ( sqrtf( h_dirac_output_synthesis_state->diffuse_power_factor[0] ) + EPSILON ); + } + else + { + target_power_y = p_cy_auto_dir_smooth[num_freq_bands] + p_cy_auto_diff_smooth[num_freq_bands]; + } + subtract_power_y = masa_stereo_type_detect->subtract_power_y; + + a = 0.0004f; /* Temporal smoothing coefficient */ + b = 1.0f - a; /* Temporal smoothing coefficient */ + + masa_stereo_type_detect->target_power_y_smooth = a * target_power_y + b * masa_stereo_type_detect->target_power_y_smooth; + masa_stereo_type_detect->subtract_power_y_smooth = a * subtract_power_y + b * masa_stereo_type_detect->subtract_power_y_smooth; + + subtract_target_ratio = masa_stereo_type_detect->subtract_power_y_smooth / ( masa_stereo_type_detect->target_power_y_smooth + EPSILON ); + subtract_target_ratio_db = 10.0f * log10f( subtract_target_ratio ); + masa_stereo_type_detect->subtract_target_ratio_db = subtract_target_ratio_db; + + masa_stereo_type_detect->subtract_power_y = 0.0f; + } + + /*-----------------------------------------------------------------* + * compute smoothing coefficients + *-----------------------------------------------------------------*/ + + alpha_synthesis = h_dirac_output_synthesis_params->alpha_synthesis; + alpha_synthesis_fast = h_dirac_output_synthesis_params->alpha_synthesis_fast; + alphaMaxBin = h_dirac_output_synthesis_params->numAlphas - 1; + alphaMaxBinFast = h_dirac_output_synthesis_params->numAlphasFast - 1; + + for ( l = 0; l < num_freq_bands; l++ ) + { + float instDirectionSmoothness, weightedDirectionSmoothness, smoothedDirectionSmoothness; + float currWeight, prevWeight, sumWeight; + int16_t indexFast, indexSlow; + float alpha_quality_based = 0.02f; + + indexSlow = min( l, alphaMaxBin ); + indexFast = min( l, alphaMaxBinFast ); + + /* Estimate the smoothness of the directions based on the diffuseness parameter */ + instDirectionSmoothness = 1.0f - diffuseness_vector[l]; + instDirectionSmoothness = min( max( instDirectionSmoothness, 0.0f ), 1.0f ); + + /* Average the direction smoothness parameter over time */ + currWeight = DIRECTION_SMOOTHNESS_ALPHA * reference_power_smooth[l]; + prevWeight = ( 1.0f - DIRECTION_SMOOTHNESS_ALPHA ) * h_dirac_output_synthesis_state->reference_power_smooth_prev[l]; + + weightedDirectionSmoothness = currWeight * instDirectionSmoothness + prevWeight * h_dirac_output_synthesis_state->direction_smoothness_prev[l]; + sumWeight = currWeight + prevWeight; + smoothedDirectionSmoothness = weightedDirectionSmoothness / ( sumWeight + EPSILON ); + + h_dirac_output_synthesis_state->direction_smoothness_prev[l] = smoothedDirectionSmoothness; + h_dirac_output_synthesis_state->reference_power_smooth_prev[l] = sumWeight; + + /* Determine smoothing parameter for rendering. The smoother the directions, the less smoothing is required (i.e., faster smoothing can be used). */ + alpha[l] = smoothedDirectionSmoothness * alpha_synthesis_fast[indexFast] + ( 1.0f - smoothedDirectionSmoothness ) * alpha_synthesis[indexSlow]; + + /* Adjust smoothing parameter based on encoding quality */ + alpha[l] = qualityBasedSmFactor * alpha[l] + ( 1.0f - qualityBasedSmFactor ) * alpha_quality_based; + } + + /*-----------------------------------------------------------------* + * compute gains + *-----------------------------------------------------------------*/ + + /*Direct normalization gains on reduced number of protos*/ + p_power_smooth_prev = h_dirac_output_synthesis_state->proto_power_smooth_prev; + p_power_smooth = h_dirac_output_synthesis_state->proto_power_smooth; + + for ( k = 0; k < num_protos_dir; k++ ) + { + for ( l = 0; l < num_freq_bands; l++ ) + { + g1 = alpha[l]; + g2 = ( 1.f - g1 ); + *p_power_smooth_prev = EPSILON + g2 * ( *p_power_smooth_prev ); + *( p_power_smooth_prev ) += g1 * ( *p_power_smooth ); + *( p_power_smooth++ ) = 1.f / ( *( p_power_smooth_prev++ ) ); + } + } + + /*Direct gains and diffuse gains on number of output channels*/ + p_power_diff_smooth_prev = h_dirac_output_synthesis_state->proto_power_diff_smooth_prev; + p_power_smooth_diff = h_dirac_output_synthesis_state->proto_power_diff_smooth; + + p_gains_diff = gains_diff; + p_gains_dir = gains_dir; + + p_cy_auto_dir_smooth = h_dirac_output_synthesis_state->cy_auto_dir_smooth; + p_cy_auto_dir_smooth_prev = h_dirac_output_synthesis_state->cy_auto_dir_smooth_prev; + p_cy_cross_dir_smooth = h_dirac_output_synthesis_state->cy_cross_dir_smooth; + p_cy_cross_dir_smooth_prev = h_dirac_output_synthesis_state->cy_cross_dir_smooth_prev; + + p_cy_auto_diff_smooth = h_dirac_output_synthesis_state->cy_auto_diff_smooth; + p_cy_auto_diff_smooth_prev = h_dirac_output_synthesis_state->cy_auto_diff_smooth_prev; + for ( k = 0; k < nchan_out_woLFE; k++ ) + { + p_power_smooth = h_dirac_output_synthesis_state->proto_power_smooth + proto_direct_index[k] * num_freq_bands; + for ( l = 0; l < h_dirac_output_synthesis_params->max_band_decorr; l++ ) + { + /*Direct*/ + g1 = alpha[l]; + g2 = 1.f - g1; + *( p_cy_auto_dir_smooth_prev ) = g1 * ( *( p_cy_auto_dir_smooth++ ) ) + g2 * ( *( p_cy_auto_dir_smooth_prev ) ); + *( p_cy_cross_dir_smooth_prev ) = g1 * ( *( p_cy_cross_dir_smooth++ ) ) + g2 * ( *( p_cy_cross_dir_smooth_prev ) ); + + *( p_gains_dir ) = sqrtf( *( p_power_smooth++ ) * ( *( p_cy_auto_dir_smooth_prev++ ) ) ); + + if ( *( p_gains_dir ) < 0.f ) + { + *( p_gains_dir ) = 0.f; + } + else if ( *( p_gains_dir ) > DIRAC_GAIN_LIMIT ) + { + *( p_gains_dir ) = DIRAC_GAIN_LIMIT; + } + + if ( *( p_cy_cross_dir_smooth_prev++ ) < 0 ) + { + *( p_gains_dir ) *= -1.f; + } + p_gains_dir++; + + /*diffuse*/ + *p_power_diff_smooth_prev = g1 * ( *p_power_smooth_diff++ ) + g2 * ( *p_power_diff_smooth_prev ) + EPSILON; + *( p_cy_auto_diff_smooth_prev ) = g1 * ( *( p_cy_auto_diff_smooth++ ) ) + g2 * ( *( p_cy_auto_diff_smooth_prev ) ); + + *( p_gains_diff ) = sqrtf( *( p_cy_auto_diff_smooth_prev++ ) / ( *( p_power_diff_smooth_prev++ ) ) ); + + if ( *( p_gains_diff ) < 0.f ) + { + *( p_gains_diff ) = 0.f; + } + else if ( *( p_gains_diff ) > DIRAC_GAIN_LIMIT ) + { + *( p_gains_diff ) = DIRAC_GAIN_LIMIT; + } + p_gains_diff++; + } + + /*Only direct prototype*/ + for ( ; l < num_freq_bands; l++ ) + { + /*Direct*/ + g1 = alpha[l]; + g2 = 1.f - g1; + *( p_cy_auto_dir_smooth_prev ) = g1 * ( *( p_cy_auto_dir_smooth++ ) ) + g2 * ( *( p_cy_auto_dir_smooth_prev ) ); + *( p_cy_cross_dir_smooth_prev ) = g1 * ( *( p_cy_cross_dir_smooth++ ) ) + g2 * ( *( p_cy_cross_dir_smooth_prev ) ); + + *( p_gains_dir ) = sqrtf( *( p_power_smooth ) * ( *( p_cy_auto_dir_smooth_prev++ ) ) ); + + if ( *( p_gains_dir ) < 0.f ) + { + *( p_gains_dir ) = 0.f; + } + else if ( *( p_gains_dir ) > DIRAC_GAIN_LIMIT ) + { + *( p_gains_dir ) = DIRAC_GAIN_LIMIT; + } + + if ( *( p_cy_cross_dir_smooth_prev++ ) < 0 ) + { + *( p_gains_dir ) *= -1.f; + } + p_gains_dir++; + + /*diffuse*/ + *( p_cy_auto_diff_smooth_prev ) = g1 * ( *( p_cy_auto_diff_smooth++ ) ) + g2 * ( *( p_cy_auto_diff_smooth_prev ) ); + *( p_gains_diff ) = sqrtf( *( p_power_smooth++ ) * ( *( p_cy_auto_diff_smooth_prev++ ) ) ); + if ( *( p_gains_diff ) < 0.f ) + { + *( p_gains_diff ) = 0.f; + } + else if ( *( p_gains_diff ) > DIRAC_GAIN_LIMIT ) + { + *( p_gains_diff ) = DIRAC_GAIN_LIMIT; + } + p_gains_diff++; + } + } + + /*-----------------------------------------------------------------* + * gain interpolation and output streams + *-----------------------------------------------------------------*/ + + for ( buf_idx = 0; buf_idx < nbslots; ++buf_idx ) + { + g1 = h_dirac_output_synthesis_params->interpolator[buf_idx]; + g2 = 1.f - g1; + + /*Direct stream*/ + p_gain_1 = gains_dir; + p_gain_2 = h_dirac_output_synthesis_state->gains_dir_prev; + for ( k = 0; k < nchan_out_woLFE; k++ ) + { + p_power_smooth = h_dirac_output_synthesis_state->proto_direct_buffer_f + buf_idx * 2 * num_freq_bands * num_protos_dir + proto_direct_index[k] * 2 * num_freq_bands; + for ( l = 0; l < num_freq_bands; l++ ) + { + g = g1 * ( *( p_gain_1++ ) ) + g2 * ( *( p_gain_2++ ) ); + RealBuffer[k][buf_idx][l] = g * ( *( p_power_smooth++ ) ); + ImagBuffer[k][buf_idx][l] = g * ( *( p_power_smooth++ ) ); + } + } + + /*Diffuse stream*/ + if ( h_dirac_output_synthesis_params->max_band_decorr != 0 ) + { + p_power_smooth_diff = h_dirac_output_synthesis_state->proto_diffuse_buffer_f + buf_idx * 2 * h_dirac_output_synthesis_params->max_band_decorr * nchan_out_woLFE; + } + p_gain_1 = gains_diff; + p_gain_2 = h_dirac_output_synthesis_state->gains_diff_prev; + for ( k = 0; k < nchan_out_woLFE; k++ ) + { + for ( l = 0; l < h_dirac_output_synthesis_params->max_band_decorr; l++ ) + { + g = g1 * ( *( p_gain_1++ ) ) + g2 * ( *( p_gain_2++ ) ); + RealBuffer[k][buf_idx][l] += g * ( *( p_power_smooth_diff++ ) ); + ImagBuffer[k][buf_idx][l] += g * ( *( p_power_smooth_diff++ ) ); + } + + /*Direct proto*/ + p_power_smooth = h_dirac_output_synthesis_state->proto_direct_buffer_f + buf_idx * 2 * num_freq_bands * num_protos_dir + proto_direct_index[k] * 2 * num_freq_bands + 2 * h_dirac_output_synthesis_params->max_band_decorr; + for ( ; l < num_freq_bands; l++ ) + { + g = g1 * ( *( p_gain_1++ ) ) + g2 * ( *( p_gain_2++ ) ); + RealBuffer[k][buf_idx][l] += g * ( *( p_power_smooth++ ) ); + ImagBuffer[k][buf_idx][l] += g * ( *( p_power_smooth++ ) ); + } + } + } + + /*-----------------------------------------------------------------* + * update buffers + *-----------------------------------------------------------------*/ + + /* store estimates for next synthesis block */ + mvr2r( gains_dir, h_dirac_output_synthesis_state->gains_dir_prev, num_freq_bands * nchan_out_woLFE ); + mvr2r( gains_diff, h_dirac_output_synthesis_state->gains_diff_prev, num_freq_bands * nchan_out_woLFE ); + + /* reset values */ + set_zero( h_dirac_output_synthesis_state->proto_power_smooth, num_freq_bands * num_protos_dir ); + + if ( h_dirac_output_synthesis_state->proto_power_diff_smooth != NULL ) + { + set_zero( h_dirac_output_synthesis_state->proto_power_diff_smooth, h_dirac_output_synthesis_params->max_band_decorr * nchan_out_woLFE ); + } + + set_zero( h_dirac_output_synthesis_state->cy_auto_dir_smooth, num_freq_bands * nchan_out_woLFE ); + set_zero( h_dirac_output_synthesis_state->cy_cross_dir_smooth, num_freq_bands * nchan_out_woLFE ); + set_zero( h_dirac_output_synthesis_state->cy_auto_diff_smooth, num_freq_bands * nchan_out_woLFE ); + + pop_wmops(); + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_dirac_dec_get_response_split_order() + * + * calculate reponse, 1 degree resolution + *------------------------------------------------------------------------*/ + +static void ivas_dirac_dec_get_response_split_order( + const int16_t azimuth, + const int16_t elevation, + float *response, + const int16_t shd_rot_max_order, + const float *p_Rmat ) +{ + int16_t index_azimuth, index_elevation; + int16_t el, e, az; + float cos_1, cos_2, sin_1, cos_az[3]; + float sin_az[3]; + float f, c; + int16_t l, m; + int16_t b, b1, b_2, b1_2, a; + float dv_0, dv_1, dv_2, dv_r_0, dv_r_1, dv_r_2; + float w; + + push_wmops( "ivas_dirac_dec_get_response_split_order" ); + + index_azimuth = ( azimuth + 180 ) % 360; + index_elevation = elevation + 90; + e = index_elevation > 90 ? -1 : 1; + el = index_elevation > 90 ? 180 - index_elevation : index_elevation; + + az = index_azimuth > 180 ? 360 - index_azimuth : index_azimuth; + f = index_azimuth > 180 ? -1.0f : 1.0f; + + cos_1 = dirac_gains_trg_term[az][0]; + sin_1 = f * dirac_gains_trg_term[az][1]; + + cos_2 = cos_1 * cos_1; + + cos_az[0] = cos_1; + cos_az[1] = 2.0f * cos_2 - 1.0f; + cos_az[2] = 2.0f * cos_1 * cos_az[1] - cos_az[0]; + sin_az[0] = sin_1; + sin_az[1] = sin_1 * 2.0f * cos_1; + sin_az[2] = sin_1 * ( 4.0f * cos_2 - 1.0f ); + + response[0] = 1.0f; + for ( l = 1; l <= shd_rot_max_order; l++ ) + { + b_2 = l * l; + b1_2 = l * l + 2 * l; + for ( m = 0; m < l; m += 2 ) + { + b = b_2 + m; + a = dirac_gains_P_idx[b]; + c = SQRT2 * dirac_gains_norm_term[a] * dirac_gains_Pnm[el][a]; + + response[b] = c * sin_az[l - m - 1]; + + b1 = b1_2 - m; + response[b1] = c * cos_az[l - m - 1]; + } + + for ( m = 1; m < l; m += 2 ) + { + b = b_2 + m; + a = dirac_gains_P_idx[b]; + c = SQRT2 * dirac_gains_norm_term[a] * dirac_gains_Pnm[el][a]; + c = c * e; + + response[b] = c * sin_az[l - m - 1]; + + b1 = b1_2 - m; + response[b1] = c * cos_az[l - m - 1]; + } + + b = b_2 + l; + a = dirac_gains_P_idx[b]; + c = dirac_gains_norm_term[a] * dirac_gains_Pnm[el][a]; + if ( l % 2 == 1 ) + { + c = c * e; + } + + response[b] = c; + } + + /*Conversion spherical to cartesian coordinates*/ + w = -dirac_gains_trg_term[el][1]; + dv_0 = w * cos_1; + dv_1 = w * sin_1; + dv_2 = e * dirac_gains_trg_term[el][0]; + + /*Rotation mtx multiplication*/ + dv_r_0 = p_Rmat[0] * dv_0 + p_Rmat[1] * dv_1 + p_Rmat[2] * dv_2; + dv_r_1 = p_Rmat[3] * dv_0 + p_Rmat[4] * dv_1 + p_Rmat[5] * dv_2; + dv_r_2 = p_Rmat[6] * dv_0 + p_Rmat[7] * dv_1 + p_Rmat[8] * dv_2; + + index_azimuth = ( (int16_t) ( atan2f( dv_r_1, dv_r_0 ) * _180_OVER_PI ) + 180 ) % 360; + index_elevation = (int16_t) ( atan2f( dv_r_2, sqrtf( dv_r_0 * dv_r_0 + dv_r_1 * dv_r_1 ) ) * _180_OVER_PI ) + 90; + e = index_elevation > 90 ? -1 : 1; + el = index_elevation > 90 ? 180 - index_elevation : index_elevation; + + az = index_azimuth > 180 ? 360 - index_azimuth : index_azimuth; + f = index_azimuth > 180 ? -1.0f : 1.0f; + + cos_1 = dirac_gains_trg_term[az][0]; + sin_1 = f * dirac_gains_trg_term[az][1]; + + cos_2 = cos_1 * cos_1; + + cos_az[0] = cos_1; + cos_az[1] = 2.0f * cos_2 - 1.0f; + cos_az[2] = 2.0f * cos_1 * cos_az[1] - cos_az[0]; + sin_az[0] = sin_1; + sin_az[1] = sin_1 * 2.0f * cos_1; + sin_az[2] = sin_1 * ( 4.0f * cos_2 - 1.0f ); + + for ( l = shd_rot_max_order + 1; l <= 3; l++ ) + { + b_2 = l * l; + b1_2 = l * l + 2 * l; + for ( m = 0; m < l; m += 2 ) + { + b = b_2 + m; + a = dirac_gains_P_idx[b]; + c = SQRT2 * dirac_gains_norm_term[a] * dirac_gains_Pnm[el][a]; + + response[b] = c * sin_az[l - m - 1]; + + b1 = b1_2 - m; + response[b1] = c * cos_az[l - m - 1]; + } + + for ( m = 1; m < l; m += 2 ) + { + b = b_2 + m; + a = dirac_gains_P_idx[b]; + c = SQRT2 * dirac_gains_norm_term[a] * dirac_gains_Pnm[el][a]; + c = c * e; + + response[b] = c * sin_az[l - m - 1]; + + b1 = b1_2 - m; + response[b1] = c * cos_az[l - m - 1]; + } + + b = b_2 + l; + a = dirac_gains_P_idx[b]; + c = dirac_gains_norm_term[a] * dirac_gains_Pnm[el][a]; + if ( l % 2 == 1 ) + { + c = c * e; + } + + response[b] = c; + } + + pop_wmops(); + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_dirac_dec_compute_directional_responses() + * + * + *------------------------------------------------------------------------*/ + +void ivas_dirac_dec_compute_directional_responses( + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, /* i/o: common spatial renderer data handle */ + DIRAC_REND_HANDLE hDirACRend, /* i/o: DirAC renderer handle */ + const VBAP_HANDLE hVBAPdata, /* i : VBAP structure */ + const MASA_DECODER_HANDLE hMasa, /* i : MASA decoder structure */ + MASA_ISM_DATA_HANDLE hMasaIsm, /* i : MASA_ISM data structure */ + const int16_t *azimuth, + const int16_t *elevation, + const int16_t md_idx, + const float *surCohRatio, + const int16_t shd_rot_max_order, /* i : split-order rotation method */ + const float *p_Rmat, /* i : rotation matrix */ + const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ +) +{ + int16_t k, l; + int16_t num_channels_dir; + float direct_response_hoa[MAX_OUTPUT_CHANNELS]; /* number of output channels (HOA 3rd order) -> 16 */ + float direct_response_ls[MAX_OUTPUT_CHANNELS]; + float direct_response_square[MAX_OUTPUT_CHANNELS]; + float *direct_response; + const int16_t *azimuth2, *elevation2; + float direct_response_dir2[MAX_OUTPUT_CHANNELS]; + float directRatio[MASA_MAXIMUM_DIRECTIONS]; + float totalDirect; + int16_t codingBand; + int16_t dipole_freq_range[2]; + MASA_TRANSPORT_SIGNAL_TYPE transport_signal_type; + + azimuth2 = NULL; + elevation2 = NULL; + transport_signal_type = MASA_STEREO_NOT_DEFINED; + + if ( hDirACRend->masa_stereo_type_detect != NULL ) + { + dipole_freq_range[0] = hDirACRend->masa_stereo_type_detect->dipole_freq_range[0]; + dipole_freq_range[1] = hDirACRend->masa_stereo_type_detect->dipole_freq_range[1]; + transport_signal_type = hDirACRend->masa_stereo_type_detect->masa_stereo_type; + } + + num_channels_dir = hDirACRend->num_outputs_dir; + if ( hSpatParamRendCom->numParametricDirections == 2 ) + { + azimuth2 = hSpatParamRendCom->azimuth2[md_idx]; + elevation2 = hSpatParamRendCom->elevation2[md_idx]; + } + + codingBand = -1; + + assert( num_channels_dir <= MAX_OUTPUT_CHANNELS && "Number of channels is too high" ); + + for ( k = 0; k < hSpatParamRendCom->num_freq_bands; ++k ) + { + if ( hMasa != NULL && k == MASA_band_grouping_24[hMasa->data.band_mapping[codingBand + 1]] ) + { + codingBand++; + } + + if ( hMasa != NULL && k > MASA_band_grouping_24[hMasa->data.band_mapping[codingBand]] && + k < MASA_band_grouping_24[hMasa->data.band_mapping[codingBand + 1]] && + k != hDirACRend->h_output_synthesis_psd_params.max_band_decorr ) + { + /* Panning gains have to be computed only for the first bin of the coding band in MASA, for other bins the previous values can be used */ + if ( hDirACRend->synthesisConf != DIRAC_SYNTHESIS_GAIN_SHD ) + { + mvr2r_inc( &hDirACRend->h_output_synthesis_psd_state.direct_responses_square[k - 1], + hSpatParamRendCom->num_freq_bands, &hDirACRend->h_output_synthesis_psd_state.direct_responses_square[k], + hSpatParamRendCom->num_freq_bands, num_channels_dir ); + } + mvr2r_inc( &hDirACRend->h_output_synthesis_psd_state.direct_responses[k - 1], + hSpatParamRendCom->num_freq_bands, + &hDirACRend->h_output_synthesis_psd_state.direct_responses[k], + hSpatParamRendCom->num_freq_bands, num_channels_dir ); + } + else + { + /* HOA3 PANNING */ + if ( hDirACRend->panningConf == DIRAC_PANNING_HOA3 ) + { + set_f( direct_response_hoa, 1.0f, MAX_OUTPUT_CHANNELS ); + set_f( direct_response_dir2, 1.0f, MAX_OUTPUT_CHANNELS ); + + if ( p_Rmat != 0 ) + { + ivas_dirac_dec_get_response_split_order( azimuth[k], elevation[k], direct_response_hoa, shd_rot_max_order, p_Rmat ); + + if ( hodirac_flag ) + { + ivas_dirac_dec_get_response_split_order( azimuth2[k], elevation2[k], direct_response_dir2, shd_rot_max_order, p_Rmat ); + } + } + else + { + ivas_dirac_dec_get_response( azimuth[k], elevation[k], direct_response_hoa, hDirACRend->hOutSetup.ambisonics_order ); + + if ( hodirac_flag ) + { + ivas_dirac_dec_get_response( azimuth2[k], elevation2[k], direct_response_dir2, hDirACRend->hOutSetup.ambisonics_order ); + } + } + + if ( hMasa == NULL && hDirACRend->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) + { + mvr2r_inc( direct_response_hoa, 1, &hDirACRend->h_output_synthesis_psd_state.direct_responses[k], hSpatParamRendCom->num_freq_bands, num_channels_dir ); + + if ( hodirac_flag ) + { + mvr2r_inc( direct_response_dir2, 1, &hDirACRend->h_output_synthesis_psd_state.direct_responses[k + hSpatParamRendCom->num_freq_bands * num_channels_dir], hSpatParamRendCom->num_freq_bands, num_channels_dir ); + } + } + else if ( ( ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) && ( hMasa != NULL ) ) || + hDirACRend->synthesisConf == DIRAC_SYNTHESIS_PSD_SHD || hDirACRend->synthesisConf == DIRAC_SYNTHESIS_MONO ) + { + /* Synthesize the first direction */ + spreadCoherencePanningHoa( azimuth[k], elevation[k], hSpatParamRendCom->spreadCoherence[md_idx][k], direct_response_hoa, num_channels_dir, hDirACRend->hOutSetup.ambisonics_order ); + + /* Synthesize the second direction and combine the gains */ + if ( hSpatParamRendCom->numParametricDirections == 2 ) + { + spreadCoherencePanningHoa( azimuth2[k], elevation2[k], hSpatParamRendCom->spreadCoherence2[md_idx][k], direct_response_dir2, num_channels_dir, hDirACRend->hOutSetup.ambisonics_order ); + /* Combine gains from the two directions */ + totalDirect = hSpatParamRendCom->energy_ratio1[md_idx][k] + hSpatParamRendCom->energy_ratio2[md_idx][k] + EPSILON; + directRatio[0] = hSpatParamRendCom->energy_ratio1[md_idx][k] / totalDirect; + directRatio[1] = hSpatParamRendCom->energy_ratio2[md_idx][k] / totalDirect; + for ( l = 0; l < num_channels_dir; l++ ) + { + direct_response_hoa[l] *= directRatio[0]; + direct_response_hoa[l] += directRatio[1] * direct_response_dir2[l]; + } + } + + if ( hSpatParamRendCom->numIsmDirections > 0 ) + { + int16_t dir; + float direct_response_temp[MAX_OUTPUT_CHANNELS]; + float direct_response_ism[MAX_OUTPUT_CHANNELS]; + float masaDirect; + float ismDirect; + + set_zero( direct_response_ism, num_channels_dir ); + + for ( dir = 0; dir < hSpatParamRendCom->numIsmDirections; dir++ ) + { + if ( hMasaIsm->ism_is_edited[dir] ) + { + ivas_dirac_dec_get_response( hMasaIsm->azimuth_ism_edited[dir], hMasaIsm->elevation_ism_edited[dir], direct_response_temp, hDirACRend->hOutSetup.ambisonics_order ); + } + else + { + ivas_dirac_dec_get_response( hMasaIsm->azimuth_ism[dir][md_idx], hMasaIsm->elevation_ism[dir][md_idx], direct_response_temp, hDirACRend->hOutSetup.ambisonics_order ); + } + + for ( l = 0; l < num_channels_dir; l++ ) + { + direct_response_ism[l] += direct_response_temp[l] * hMasaIsm->energy_ratio_ism[dir][md_idx][k]; + } + } + + masaDirect = hSpatParamRendCom->energy_ratio1[md_idx][k] + EPSILON; + if ( hSpatParamRendCom->numParametricDirections == 2 ) + { + masaDirect += hSpatParamRendCom->energy_ratio2[md_idx][k]; + } + + ismDirect = hMasaIsm->energy_ratio_ism[0][md_idx][k]; + for ( dir = 1; dir < hSpatParamRendCom->numIsmDirections; dir++ ) + { + ismDirect += hMasaIsm->energy_ratio_ism[dir][md_idx][k]; + } + + totalDirect = masaDirect + ismDirect; + directRatio[0] = masaDirect / totalDirect; + directRatio[1] = ismDirect / totalDirect; + for ( l = 0; l < num_channels_dir; l++ ) + { + direct_response_hoa[l] *= directRatio[0]; + direct_response_hoa[l] += directRatio[1] * direct_response_ism[l]; + } + } + + /* Synthesize surrounding coherence */ + if ( surCohRatio != NULL && surCohRatio[k] > 0.f ) + { + for ( l = 1; l < num_channels_dir; l++ ) + { + direct_response_hoa[l] *= sqrtf( 1.0f - surCohRatio[k] ); + } + } + + /* Set computed gains */ + direct_response = direct_response_hoa; + if ( hDirACRend->synthesisConf != DIRAC_SYNTHESIS_GAIN_SHD ) + { + v_mult( direct_response, direct_response, direct_response_square, num_channels_dir ); + mvr2r_inc( direct_response_square, 1, &hDirACRend->h_output_synthesis_psd_state.direct_responses_square[k], hSpatParamRendCom->num_freq_bands, num_channels_dir ); + + if ( transport_signal_type == MASA_STEREO_SPACED_MICS ) + { + direct_response[0] = 1.0f; + if ( k >= dipole_freq_range[0] && k < dipole_freq_range[1] ) + { + direct_response[1] = 1.0f; + } + } + else + { + set_f( direct_response, 1.0f, hDirACRend->num_protos_ambi ); + } + } + + mvr2r_inc( direct_response, 1, &hDirACRend->h_output_synthesis_psd_state.direct_responses[k], hSpatParamRendCom->num_freq_bands, num_channels_dir ); + } + else + { + assert( 0 && "Not supported synthesis method!" ); + } + } + else if ( hDirACRend->panningConf == DIRAC_PANNING_VBAP ) /*VBAP*/ + { + /* Synthesize the first direction */ + spreadCoherencePanningVbap( azimuth[k], elevation[k], hSpatParamRendCom->spreadCoherence[md_idx][k], direct_response_ls, num_channels_dir, hVBAPdata ); + normalizePanningGains( direct_response_ls, num_channels_dir ); + + /* Synthesize the second direction and combine the gains */ + if ( hSpatParamRendCom->numParametricDirections == 2 ) + { + spreadCoherencePanningVbap( azimuth2[k], elevation2[k], hSpatParamRendCom->spreadCoherence2[md_idx][k], direct_response_dir2, num_channels_dir, hVBAPdata ); + normalizePanningGains( direct_response_dir2, num_channels_dir ); + + /* Combine gains from the two directions */ + totalDirect = hSpatParamRendCom->energy_ratio1[md_idx][k] + hSpatParamRendCom->energy_ratio2[md_idx][k] + EPSILON; + directRatio[0] = hSpatParamRendCom->energy_ratio1[md_idx][k] / totalDirect; + directRatio[1] = hSpatParamRendCom->energy_ratio2[md_idx][k] / totalDirect; + for ( l = 0; l < num_channels_dir; l++ ) + { + direct_response_ls[l] *= directRatio[0]; + direct_response_ls[l] += directRatio[1] * direct_response_dir2[l]; + } + normalizePanningGains( direct_response_ls, num_channels_dir ); + } + + if ( hSpatParamRendCom->numIsmDirections > 0 ) + { + int16_t dir; + float direct_response_temp[MAX_OUTPUT_CHANNELS]; + float direct_response_ism[MAX_OUTPUT_CHANNELS]; + float masaDirect; + float ismDirect; + + set_zero( direct_response_ism, num_channels_dir ); + + for ( dir = 0; dir < hSpatParamRendCom->numIsmDirections; dir++ ) + { + if ( hMasaIsm->ism_is_edited[dir] ) + { + vbap_determine_gains( hVBAPdata, direct_response_temp, hMasaIsm->azimuth_ism_edited[dir], hMasaIsm->elevation_ism_edited[dir], 1 ); + } + else + { + vbap_determine_gains( hVBAPdata, direct_response_temp, hMasaIsm->azimuth_ism[dir][md_idx], hMasaIsm->elevation_ism[dir][md_idx], 1 ); + } + + for ( l = 0; l < num_channels_dir; l++ ) + { + direct_response_ism[l] += direct_response_temp[l] * hMasaIsm->energy_ratio_ism[dir][md_idx][k]; + } + } + normalizePanningGains( direct_response_ism, num_channels_dir ); + + masaDirect = hSpatParamRendCom->energy_ratio1[md_idx][k] + EPSILON; + if ( hSpatParamRendCom->numParametricDirections == 2 ) + { + masaDirect += hSpatParamRendCom->energy_ratio2[md_idx][k]; + } + + ismDirect = hMasaIsm->energy_ratio_ism[0][md_idx][k]; + for ( dir = 1; dir < hSpatParamRendCom->numIsmDirections; dir++ ) + { + ismDirect += hMasaIsm->energy_ratio_ism[dir][md_idx][k]; + } + + totalDirect = masaDirect + ismDirect; + directRatio[0] = masaDirect / totalDirect; + directRatio[1] = ismDirect / totalDirect; + for ( l = 0; l < num_channels_dir; l++ ) + { + direct_response_ls[l] *= directRatio[0]; + direct_response_ls[l] += directRatio[1] * direct_response_ism[l]; + } + normalizePanningGains( direct_response_ls, num_channels_dir ); + } + + /* Synthesize surrounding coherence */ + if ( surCohRatio != NULL && surCohRatio[k] > 0.f ) + { + int16_t num_channels_surrCoh; + + num_channels_surrCoh = num_channels_dir; + num_channels_surrCoh -= hDirACRend->num_ele_spk_no_diffuse_rendering; + + for ( l = 0; l < num_channels_dir; l++ ) + { + direct_response_ls[l] *= sqrtf( 1.0f - surCohRatio[k] ); + if ( hDirACRend->diffuse_response_function[l] > 0.f ) + { + direct_response_ls[l] += sqrtf( surCohRatio[k] / (float) num_channels_surrCoh ); + } + } + } + + normalizePanningGains( direct_response_ls, num_channels_dir ); + + /* Set computed gains */ + direct_response = direct_response_ls; + v_mult( direct_response, direct_response, direct_response_square, num_channels_dir ); + mvr2r_inc( direct_response_square, 1, &hDirACRend->h_output_synthesis_psd_state.direct_responses_square[k], hSpatParamRendCom->num_freq_bands, num_channels_dir ); + mvr2r_inc( direct_response, 1, &hDirACRend->h_output_synthesis_psd_state.direct_responses[k], hSpatParamRendCom->num_freq_bands, num_channels_dir ); + } + else + { + assert( 0 && "Not supported panning method!" ); + } + } + } + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_dirac_dec_compute_gain_factors() + * + * + *------------------------------------------------------------------------*/ + +void ivas_dirac_dec_compute_gain_factors( + const int16_t num_freq_bands, + const float *diffuseness, + const int16_t max_band_decorr, + float *direct_gain_factor, + float *diffuse_gain_factor ) +{ + int16_t i; + + for ( i = 0; i < max_band_decorr; i++ ) + { + direct_gain_factor[i] = sqrtf( 1.f - diffuseness[i] ); + diffuse_gain_factor[i] = sqrtf( diffuseness[i] ); + } + for ( ; i < num_freq_bands; i++ ) + { + direct_gain_factor[i] = sqrtf( 1.f - diffuseness[i] ); + diffuse_gain_factor[i] = sqrtf( diffuseness[i] ); + } + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_dirac_dec_compute_power_factors() + * + * + *------------------------------------------------------------------------*/ + +void ivas_dirac_dec_compute_power_factors( + const int16_t num_freq_bands, + const float *diffuseness, + const int16_t max_band_decorr, + float *direct_power_factor, + float *diffuse_power_factor ) +{ + v_multc( diffuseness, -1.0f, direct_power_factor, num_freq_bands ); + + v_addc( direct_power_factor, 1.0f, direct_power_factor, num_freq_bands ); + + mvr2r( diffuseness, diffuse_power_factor, num_freq_bands ); + + v_mult( &direct_power_factor[max_band_decorr], &direct_power_factor[max_band_decorr], &direct_power_factor[max_band_decorr], num_freq_bands - max_band_decorr ); + + v_mult( &diffuse_power_factor[max_band_decorr], &diffuse_power_factor[max_band_decorr], &diffuse_power_factor[max_band_decorr], num_freq_bands - max_band_decorr ); + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_lfe_synth_with_filters() + * + * + *------------------------------------------------------------------------*/ + +void ivas_lfe_synth_with_filters( + MCMASA_LFE_SYNTH_DATA_HANDLE hMasaLfeSynth, /* i/o: LFE synthesis structure for McMASA */ + float *data_f[], /* o : output signals */ + const int16_t output_frame, /* i : output frame length per channel */ + const int16_t separateChannelIndex, /* i : separate channel index */ + const int16_t lfeChannelIndex /* i : LFE channel index */ +) +{ + float lowpassCoef; + int16_t i, j; + float lowPassSignal[L_FRAME48k]; + float highPassSignal[L_FRAME48k]; + int16_t slot_index; + int16_t subframe_index; + int16_t slotSize; + float transportEne, targetEneLfe, targetEneTrans; + int16_t mrange[2]; + float lfeGain; + float transportGain; + int16_t delay; + + /* Delay the separated channel to sync the LFE synthesis with the DirAC rendering */ + delay = hMasaLfeSynth->delayBuffer_syncDirAC_size; + delay_signal( data_f[separateChannelIndex], output_frame, hMasaLfeSynth->delayBuffer_syncDirAC, delay ); + + /* Filterbank for dividing the separated channel to LFE frequencies and higher frequencies */ + lowpassCoef = 1.0f / ( (float) hMasaLfeSynth->ringBufferSize ); + for ( i = 0; i < output_frame; i++ ) + { + hMasaLfeSynth->lowpassSum += lowpassCoef * data_f[separateChannelIndex][i] - lowpassCoef * hMasaLfeSynth->lfeSynthRingBuffer[hMasaLfeSynth->ringBufferLoPointer]; + lowPassSignal[i] = hMasaLfeSynth->lowpassSum; + highPassSignal[i] = hMasaLfeSynth->lfeSynthRingBuffer[hMasaLfeSynth->ringBufferHiPointer] - lowPassSignal[i]; + hMasaLfeSynth->lfeSynthRingBuffer[hMasaLfeSynth->ringBufferLoPointer] = data_f[separateChannelIndex][i]; + + hMasaLfeSynth->ringBufferLoPointer--; + if ( hMasaLfeSynth->ringBufferLoPointer < 0 ) + { + hMasaLfeSynth->ringBufferLoPointer = hMasaLfeSynth->ringBufferSize - 1; + } + + hMasaLfeSynth->ringBufferHiPointer--; + if ( hMasaLfeSynth->ringBufferHiPointer < 0 ) + { + hMasaLfeSynth->ringBufferHiPointer = hMasaLfeSynth->ringBufferSize - 1; + } + } + + /* Synthesize the LFE signal */ + slotSize = output_frame / CLDFB_NO_COL_MAX; + for ( slot_index = 0; slot_index < CLDFB_NO_COL_MAX; slot_index++ ) + { + subframe_index = slot_index / 4; + + mrange[0] = slot_index * slotSize; + mrange[1] = ( slot_index + 1 ) * slotSize; + + transportEne = 0.0f; + for ( i = mrange[0]; i < mrange[1]; i++ ) + { + transportEne += lowPassSignal[i] * lowPassSignal[i]; + } + + targetEneLfe = transportEne * hMasaLfeSynth->lfeToTotalEnergyRatio[subframe_index]; + targetEneTrans = transportEne * max( ( 1.0f - hMasaLfeSynth->lfeToTotalEnergyRatio[subframe_index] ), 0.01f ); + + hMasaLfeSynth->transportEneSmooth *= MCMASA_LFE_SYNTH_ALPHA; + hMasaLfeSynth->targetEneLfeSmooth *= MCMASA_LFE_SYNTH_ALPHA; + hMasaLfeSynth->targetEneTransSmooth *= MCMASA_LFE_SYNTH_ALPHA; + + hMasaLfeSynth->transportEneSmooth += transportEne; + hMasaLfeSynth->targetEneLfeSmooth += targetEneLfe; + hMasaLfeSynth->targetEneTransSmooth += targetEneTrans; + + lfeGain = min( 1.0f, sqrtf( hMasaLfeSynth->targetEneLfeSmooth / ( EPSILON + hMasaLfeSynth->transportEneSmooth ) ) ); + transportGain = min( 1.0f, sqrtf( hMasaLfeSynth->targetEneTransSmooth / ( EPSILON + hMasaLfeSynth->transportEneSmooth ) ) ); + + for ( i = mrange[0], j = 0; i < mrange[1]; i++, j++ ) + { + data_f[separateChannelIndex][i] = ( transportGain * hMasaLfeSynth->interpolator[j] + hMasaLfeSynth->transportGainPrev * ( 1.0f - hMasaLfeSynth->interpolator[j] ) ) * lowPassSignal[i] + highPassSignal[i]; + data_f[lfeChannelIndex][i] = ( lfeGain * hMasaLfeSynth->interpolator[j] + hMasaLfeSynth->lfeGainPrev * ( 1.0f - hMasaLfeSynth->interpolator[j] ) ) * lowPassSignal[i]; + } + + hMasaLfeSynth->lfeGainPrev = lfeGain; + hMasaLfeSynth->transportGainPrev = transportGain; + } + + /* Lowpass filter for removing remaining mid and high frequencies from the LFE signal */ + lowpassCoef = 1.0f / ( (float) hMasaLfeSynth->ringBufferSize2 ); + for ( i = 0; i < output_frame; i++ ) + { + hMasaLfeSynth->lowpassSum2 += lowpassCoef * data_f[lfeChannelIndex][i] - lowpassCoef * hMasaLfeSynth->lfeSynthRingBuffer2[hMasaLfeSynth->ringBufferLoPointer2]; + hMasaLfeSynth->lfeSynthRingBuffer2[hMasaLfeSynth->ringBufferLoPointer2] = data_f[lfeChannelIndex][i]; + + hMasaLfeSynth->ringBufferLoPointer2--; + if ( hMasaLfeSynth->ringBufferLoPointer2 < 0 ) + { + hMasaLfeSynth->ringBufferLoPointer2 = hMasaLfeSynth->ringBufferSize2 - 1; + } + + data_f[lfeChannelIndex][i] = hMasaLfeSynth->lowpassSum2; + } + + /* Delay the separated channel to match the delay of the lowpass filter */ + delay = hMasaLfeSynth->delayBuffer_syncLp_size; + delay_signal( data_f[separateChannelIndex], output_frame, hMasaLfeSynth->delayBuffer_syncLp, delay ); + + return; +} + + +/*------------------------------------------------------------------------- + * Local functions + *------------------------------------------------------------------------*/ + +static void computeTargetPSDs_direct( + const int16_t num_channels, + const int16_t num_freq_bands, + const float *direct_power_factor, + const float *reference_power, + const float *direct_responses, + const float *direct_responses_square, + float *cy_auto_dir_smooth, + float *cy_cross_dir_smooth ) +{ + int16_t ch_idx, cur_idx; + + /* segment auxiliary buffer */ + float direct_power[CLDFB_NO_CHANNELS_MAX]; /* size: num_freq_bands. */ + float aux_buffer_res[CLDFB_NO_CHANNELS_MAX]; /* size: num_freq_bands. */ + + /* estimate direct and diffuse power */ + v_mult( direct_power_factor, reference_power, direct_power, num_freq_bands ); + + /* compute target auto and cross PSDs of current frame (smoothed) */ + for ( ch_idx = 0; ch_idx < num_channels; ++ch_idx ) + { + cur_idx = ch_idx * num_freq_bands; + + v_mult( direct_power, &direct_responses_square[cur_idx], aux_buffer_res, num_freq_bands ); + v_add( &cy_auto_dir_smooth[cur_idx], aux_buffer_res, &cy_auto_dir_smooth[cur_idx], num_freq_bands ); + + v_mult( direct_power, &direct_responses[cur_idx], aux_buffer_res, num_freq_bands ); + v_add( &cy_cross_dir_smooth[cur_idx], aux_buffer_res, &cy_cross_dir_smooth[cur_idx], num_freq_bands ); + } + + return; +} + + +static void computeTargetPSDs_direct_subframe( + const int16_t num_channels, + const int16_t num_freq_bands, + const float *direct_power_factor, + const float *reference_power, + const float *direct_responses, + const float *direct_responses_square, + float *cy_auto_dir_smooth, + float *cy_cross_dir_smooth ) +{ + int16_t ch_idx, cur_idx; + + /* segment auxiliary buffer */ + float direct_power[CLDFB_NO_CHANNELS_MAX]; /* size: num_freq_bands. */ + + /* estimate direct and diffuse power */ + v_mult( direct_power_factor, reference_power, direct_power, num_freq_bands ); + + /* compute target auto and cross PSDs of current frame (smoothed) */ + for ( ch_idx = 0; ch_idx < num_channels; ++ch_idx ) + { + cur_idx = ch_idx * num_freq_bands; + + v_mult( direct_power, &direct_responses_square[cur_idx], &cy_auto_dir_smooth[cur_idx], num_freq_bands ); + v_mult( direct_power, &direct_responses[cur_idx], &cy_cross_dir_smooth[cur_idx], num_freq_bands ); + } + + return; +} + + +static void computeTargetPSDs_diffuse( + const int16_t num_channels, + const int16_t num_freq_bands, + const int16_t start_band, + const float *diffuse_power_factor, + const float *reference_power, + const float *diffuse_responses_square, + float *cy_auto_diff_smooth ) +{ + int16_t ch_idx, cur_idx; + + /* segment auxiliary buffer */ + float diffuse_power[CLDFB_NO_CHANNELS_MAX]; /* size: num_freq_bands. */ + float aux_buffer_res[CLDFB_NO_CHANNELS_MAX]; /* size: num_freq_bands. */ + + /* estimate direct and diffuse power */ + v_mult( diffuse_power_factor, reference_power, diffuse_power, num_freq_bands ); + + /* compute target auto and cross PSDs of current frame (smoothed) */ + for ( ch_idx = 0; ch_idx < num_channels; ++ch_idx ) + { + cur_idx = ch_idx * num_freq_bands; + v_multc( &diffuse_power[start_band], diffuse_responses_square[ch_idx], aux_buffer_res, num_freq_bands - start_band ); + v_add( &cy_auto_diff_smooth[cur_idx + start_band], aux_buffer_res, &cy_auto_diff_smooth[cur_idx + start_band], num_freq_bands - start_band ); + } + + return; +} + + +static void computeTargetPSDs_diffuse_subframe( + const int16_t num_channels, + const int16_t num_freq_bands, + const int16_t start_band, + const float *diffuse_power_factor, + const float *reference_power, + const float *diffuse_responses_square, + float *cy_auto_diff_smooth ) +{ + int16_t ch_idx, cur_idx; + float diffuse_power[CLDFB_NO_CHANNELS_MAX]; /* segment auxiliary buffer; size: num_freq_bands. */ + + /* estimate direct and diffuse power */ + v_mult( diffuse_power_factor, reference_power, diffuse_power, num_freq_bands ); + + /* compute target auto and cross PSDs of current frame (smoothed) */ + for ( ch_idx = 0; ch_idx < num_channels; ++ch_idx ) + { + cur_idx = ch_idx * num_freq_bands; + + v_multc( &diffuse_power[start_band], diffuse_responses_square[ch_idx], &cy_auto_diff_smooth[cur_idx + start_band], num_freq_bands - start_band ); + } + + return; +} + + +static void computeTargetPSDs_diffuse_with_onsets( + const int16_t num_channels, + const int16_t num_freq_bands, + const int16_t num_decorr_freq_bands, + const int16_t *proto_frame_diff_index, + const float *diffuse_power_factor, + const float *reference_power, + const float *diffuse_responses_square, + const float *onset_filter, + float *cy_auto_diff_smooth ) +{ + int16_t ch_idx, cur_idx, diff_idx; + float diffuse_response_p4, aux_buffer_res1[CLDFB_NO_CHANNELS_MAX]; + /* segment auxiliary buffer */ + float diffuse_power[CLDFB_NO_CHANNELS_MAX]; /* size: num_freq_bands. */ + float aux_buffer_res[CLDFB_NO_CHANNELS_MAX]; /* size: num_freq_bands. */ + + /* estimate direct and diffuse power */ + v_mult( diffuse_power_factor, reference_power, diffuse_power, num_decorr_freq_bands ); + + /* compute target auto and cross PSDs of current frame (smoothed) */ + for ( ch_idx = 0; ch_idx < num_channels; ++ch_idx ) + { + diffuse_response_p4 = diffuse_responses_square[ch_idx] * diffuse_responses_square[ch_idx]; + + cur_idx = ch_idx * num_freq_bands; + diff_idx = proto_frame_diff_index[ch_idx] * num_freq_bands; + + v_multc( &onset_filter[diff_idx], diffuse_responses_square[ch_idx], aux_buffer_res1, num_decorr_freq_bands ); + v_multc( &onset_filter[diff_idx], -1.0f, aux_buffer_res, num_decorr_freq_bands ); + v_addc( aux_buffer_res, 1.0f, aux_buffer_res, num_decorr_freq_bands ); + v_multc( aux_buffer_res, diffuse_response_p4, aux_buffer_res, num_decorr_freq_bands ); + v_add( aux_buffer_res1, aux_buffer_res, aux_buffer_res, num_decorr_freq_bands ); + v_mult( aux_buffer_res, diffuse_power, aux_buffer_res, num_decorr_freq_bands ); + v_add( &cy_auto_diff_smooth[cur_idx], aux_buffer_res, &cy_auto_diff_smooth[cur_idx], num_decorr_freq_bands ); + } + + return; +} + +static void computeAlphaSynthesis( + float *alpha_synthesis, + const int16_t averaging_length_ms, + const float maxAlpha, + int16_t *numAlphas, + const int16_t slot_size, + const int16_t num_freq_bands, + const float *frequency_axis, + const int32_t output_Fs ) +{ + int16_t k; + float avg_length_f_ms; + + /* check input pointer */ + if ( alpha_synthesis == NULL ) + { + return; + } + + if ( averaging_length_ms == 0 ) + { + set_f( alpha_synthesis, 1.0f, num_freq_bands ); + } + else + { + for ( k = 0; k < num_freq_bands; k++ ) + { + int16_t faxis_idx = max( k, 1 ); + avg_length_f_ms = 1000.f * (float) averaging_length_ms / fabsf( frequency_axis[faxis_idx] ); + alpha_synthesis[k] = min( (float) slot_size / ( avg_length_f_ms * (float) output_Fs / 1000.f ), 1.0f ); + if ( alpha_synthesis[k] >= maxAlpha ) + { + alpha_synthesis[k] = maxAlpha; + *numAlphas = k + 1; + break; + } + } + } + + return; +} + +static void spreadCoherencePanningHoa( + const int16_t azimuth, + const int16_t elevation, + const float spreadCoh, + float *direct_response, + const int16_t num_channels_dir, + const int16_t ambisonics_order ) +{ + int16_t i; + float direct_response_left[MAX_OUTPUT_CHANNELS]; + float direct_response_right[MAX_OUTPUT_CHANNELS]; + float gainCenter; + float gainSide; + + ivas_dirac_dec_get_response( azimuth, elevation, direct_response, ambisonics_order ); + + if ( spreadCoh > 0.f ) + { + ivas_dirac_dec_get_response( azimuth + 30, elevation, direct_response_left, ambisonics_order ); + + ivas_dirac_dec_get_response( azimuth + 330, elevation, direct_response_right, ambisonics_order ); + + if ( spreadCoh < 0.5f ) + { + gainCenter = ( 1.0f - 2.0f * spreadCoh ) + 2.0f * spreadCoh / 3.0f; + gainSide = 2.0f * spreadCoh / 3.0f; + } + else + { + gainSide = 1.0f / ( 4.0f - 2.0f * spreadCoh ); + gainCenter = ( 2.0f - 2.0f * spreadCoh ) * gainSide; + } + + for ( i = 0; i < num_channels_dir; i++ ) + { + direct_response[i] = direct_response[i] * gainCenter + ( direct_response_left[i] + direct_response_right[i] ) * gainSide; + } + } + + return; +} + +static void spreadCoherencePanningVbap( + const int16_t azimuth, + const int16_t elevation, + const float spreadCoh, + float *direct_response, + const int16_t num_channels_dir, + const VBAP_HANDLE hVBAPdata ) +{ + int16_t i; + float direct_response_left[MAX_OUTPUT_CHANNELS]; + float direct_response_right[MAX_OUTPUT_CHANNELS]; + float gainCenter; + float gainSide; + + if ( hVBAPdata == NULL ) + { + /* Distribute signal to all channels if VBAP is not properly initialized. */ + set_f( direct_response, inv_sqrt( num_channels_dir ), num_channels_dir ); + + return; + } + + vbap_determine_gains( hVBAPdata, direct_response, azimuth, elevation, 0 ); + + if ( spreadCoh > 0.f ) + { + vbap_determine_gains( hVBAPdata, direct_response_left, azimuth + 30, elevation, 0 ); + vbap_determine_gains( hVBAPdata, direct_response_right, azimuth - 30, elevation, 0 ); + + if ( spreadCoh < 0.5f ) + { + gainCenter = ( 1.0f - 2.0f * spreadCoh ) + 2.0f * spreadCoh * INV_SQRT3; + gainSide = 2.0f * spreadCoh * INV_SQRT3; + } + else + { + gainCenter = 2.0f - 2.0f * spreadCoh; + gainSide = 1.0f; + } + + for ( i = 0; i < num_channels_dir; i++ ) + { + direct_response[i] = direct_response[i] * gainCenter + ( direct_response_left[i] + direct_response_right[i] ) * gainSide; + } + } + + return; +} + + +static void normalizePanningGains( + float *direct_response, + const int16_t num_channels_dir ) +{ + float energySum; + float normVal; + int16_t i; + + energySum = sum2_f( direct_response, num_channels_dir ) + 1e-12f; + normVal = sqrtf( 1.0f / energySum ); + for ( i = 0; i < num_channels_dir; i++ ) + { + direct_response[i] *= normVal; + } + + return; +} diff --git a/lib_rend/ivas_dirac_rend.c b/lib_rend/ivas_dirac_rend.c new file mode 100644 index 0000000000000000000000000000000000000000..859136ac61d893500dc5738b00f76f1d59b8dcee --- /dev/null +++ b/lib_rend/ivas_dirac_rend.c @@ -0,0 +1,2083 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_prot_rend.h" +#include "ivas_cnst.h" +#include "ivas_rom_dec.h" +#include "wmc_auto.h" + + +/*------------------------------------------------------------------------- + * ivas_dirac_allocate_parameters() + * + * Allocate and initialize DirAC parameters + *-------------------------------------------------------------------------*/ + +ivas_error ivas_dirac_allocate_parameters( + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, /* i/o: common data for spatial parametric rendering */ + const int16_t params_flag /* i : set of parameters flag */ +) +{ + int16_t i; + + if ( params_flag == 1 ) + { + if ( ( hSpatParamRendCom->azimuth = (int16_t **) malloc( hSpatParamRendCom->dirac_md_buffer_length * sizeof( int16_t * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + + if ( ( hSpatParamRendCom->elevation = (int16_t **) malloc( hSpatParamRendCom->dirac_md_buffer_length * sizeof( int16_t * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + + if ( ( hSpatParamRendCom->diffuseness_vector = (float **) malloc( hSpatParamRendCom->dirac_md_buffer_length * sizeof( float * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + + if ( ( hSpatParamRendCom->energy_ratio1 = (float **) malloc( hSpatParamRendCom->dirac_md_buffer_length * sizeof( float * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + + if ( ( hSpatParamRendCom->spreadCoherence = (float **) malloc( hSpatParamRendCom->dirac_md_buffer_length * sizeof( float * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + + if ( ( hSpatParamRendCom->surroundingCoherence = (float **) malloc( hSpatParamRendCom->dirac_md_buffer_length * sizeof( float * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + + for ( i = 0; i < hSpatParamRendCom->dirac_md_buffer_length; i++ ) + { + if ( ( hSpatParamRendCom->azimuth[i] = (int16_t *) malloc( hSpatParamRendCom->num_freq_bands * sizeof( int16_t ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + set_s( hSpatParamRendCom->azimuth[i], 0, hSpatParamRendCom->num_freq_bands ); + + if ( ( hSpatParamRendCom->elevation[i] = (int16_t *) malloc( hSpatParamRendCom->num_freq_bands * sizeof( int16_t ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + set_s( hSpatParamRendCom->elevation[i], 0, hSpatParamRendCom->num_freq_bands ); + + if ( ( hSpatParamRendCom->diffuseness_vector[i] = (float *) malloc( hSpatParamRendCom->num_freq_bands * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + set_f( hSpatParamRendCom->diffuseness_vector[i], 1.0f, hSpatParamRendCom->num_freq_bands ); + + if ( ( hSpatParamRendCom->energy_ratio1[i] = (float *) malloc( hSpatParamRendCom->num_freq_bands * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + set_f( hSpatParamRendCom->energy_ratio1[i], 0.0f, hSpatParamRendCom->num_freq_bands ); + + if ( ( hSpatParamRendCom->spreadCoherence[i] = (float *) malloc( hSpatParamRendCom->num_freq_bands * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + set_f( hSpatParamRendCom->spreadCoherence[i], 0.0f, hSpatParamRendCom->num_freq_bands ); + + if ( ( hSpatParamRendCom->surroundingCoherence[i] = (float *) malloc( hSpatParamRendCom->num_freq_bands * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + set_f( hSpatParamRendCom->surroundingCoherence[i], 0.0f, hSpatParamRendCom->num_freq_bands ); + } + } + else if ( params_flag == 2 ) + { + if ( ( hSpatParamRendCom->azimuth2 = (int16_t **) malloc( hSpatParamRendCom->dirac_md_buffer_length * sizeof( int16_t * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + + if ( ( hSpatParamRendCom->elevation2 = (int16_t **) malloc( hSpatParamRendCom->dirac_md_buffer_length * sizeof( int16_t * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + + if ( ( hSpatParamRendCom->energy_ratio2 = (float **) malloc( hSpatParamRendCom->dirac_md_buffer_length * sizeof( float * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + + if ( ( hSpatParamRendCom->spreadCoherence2 = (float **) malloc( hSpatParamRendCom->dirac_md_buffer_length * sizeof( float * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + + for ( i = 0; i < hSpatParamRendCom->dirac_md_buffer_length; i++ ) + { + if ( ( hSpatParamRendCom->azimuth2[i] = (int16_t *) malloc( hSpatParamRendCom->num_freq_bands * sizeof( int16_t ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + set_s( hSpatParamRendCom->azimuth2[i], 0, hSpatParamRendCom->num_freq_bands ); + + if ( ( hSpatParamRendCom->elevation2[i] = (int16_t *) malloc( hSpatParamRendCom->num_freq_bands * sizeof( int16_t ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + set_s( hSpatParamRendCom->elevation2[i], 0, hSpatParamRendCom->num_freq_bands ); + + if ( ( hSpatParamRendCom->energy_ratio2[i] = (float *) malloc( hSpatParamRendCom->num_freq_bands * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + set_f( hSpatParamRendCom->energy_ratio2[i], 0.0f, hSpatParamRendCom->num_freq_bands ); + + if ( ( hSpatParamRendCom->spreadCoherence2[i] = (float *) malloc( hSpatParamRendCom->num_freq_bands * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + set_f( hSpatParamRendCom->spreadCoherence2[i], 0.0f, hSpatParamRendCom->num_freq_bands ); + } + } + + return IVAS_ERR_OK; +} + + +/*------------------------------------------------------------------------- + * ivas_spat_hSpatParamRendCom_config() + * + * + *-------------------------------------------------------------------------*/ + +ivas_error ivas_spat_hSpatParamRendCom_config( + SPAT_PARAM_REND_COMMON_DATA_HANDLE *hSpatParamRendCom_out, /* i/o: IVAS decoder structure */ + const DIRAC_CONFIG_FLAG flag_config_inp, /* i/ : Flag determining if we open or reconfigure the DirAC decoder */ + const int16_t dec_param_estim_flag, + const IVAS_FORMAT ivas_format, + const MC_MODE mc_mode, + const int32_t output_Fs, + const int16_t hodirac_flag ) +{ + ivas_error error; + int16_t map_idx; + DIRAC_CONFIG_FLAG flag_config; + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom; + + flag_config = ( flag_config_inp == DIRAC_RECONFIGURE_MODE ) ? DIRAC_RECONFIGURE : flag_config_inp; + error = IVAS_ERR_OK; + + hSpatParamRendCom = NULL; + + if ( flag_config == DIRAC_RECONFIGURE ) + { + hSpatParamRendCom = *hSpatParamRendCom_out; + } + else if ( flag_config == DIRAC_OPEN ) + { + /*-----------------------------------------------------------------* + * prepare library opening + *-----------------------------------------------------------------*/ + + if ( ( hSpatParamRendCom = (SPAT_PARAM_REND_COMMON_DATA_HANDLE) malloc( sizeof( SPAT_PARAM_REND_COMMON_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC meta\n" ) ); + } + + *hSpatParamRendCom_out = hSpatParamRendCom; + } + + if ( flag_config == DIRAC_OPEN ) + { + hSpatParamRendCom->slot_size = (int16_t) ( ( output_Fs / FRAMES_PER_SEC ) / CLDFB_NO_COL_MAX ); + set_s( hSpatParamRendCom->subframe_nbslots, 0, MAX_JBM_SUBFRAMES_5MS ); + set_s( hSpatParamRendCom->subframe_nbslots, JBM_CLDFB_SLOTS_IN_SUBFRAME, DEFAULT_JBM_SUBFRAMES_5MS ); + hSpatParamRendCom->nb_subframes = DEFAULT_JBM_SUBFRAMES_5MS; + hSpatParamRendCom->subframes_rendered = 0; + hSpatParamRendCom->slots_rendered = 0; + hSpatParamRendCom->num_slots = DEFAULT_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME; + hSpatParamRendCom->num_freq_bands = (int16_t) ( output_Fs * INV_CLDFB_BANDWIDTH + 0.5f ); + hSpatParamRendCom->numSimultaneousDirections = 0; + hSpatParamRendCom->numParametricDirections = 0; + hSpatParamRendCom->numIsmDirections = 0; + } + + /*-----------------------------------------------------------------* + * set input parameters + *-----------------------------------------------------------------*/ + + if ( ( ivas_format == SBA_FORMAT || ivas_format == SBA_ISM_FORMAT ) && flag_config == DIRAC_RECONFIGURE ) + { + if ( hodirac_flag && hSpatParamRendCom->azimuth2 == NULL ) + { + if ( ( error = ivas_dirac_allocate_parameters( hSpatParamRendCom, 2 ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( !hodirac_flag && hSpatParamRendCom->azimuth2 != NULL ) + { + ivas_dirac_deallocate_parameters( hSpatParamRendCom, 2 ); + } + } + + if ( flag_config == DIRAC_OPEN ) + { + hSpatParamRendCom->dirac_md_buffer_length = 0; + hSpatParamRendCom->dirac_bs_md_write_idx = 0; + hSpatParamRendCom->dirac_read_idx = 0; + if ( mc_mode == MC_MODE_MCMASA ) + { + hSpatParamRendCom->dirac_md_buffer_length = MAX_PARAM_SPATIAL_SUBFRAMES; + + set_s( hSpatParamRendCom->render_to_md_map, 0, MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME ); + for ( map_idx = 0; map_idx < DEFAULT_JBM_SUBFRAMES_5MS; map_idx++ ) + { + hSpatParamRendCom->render_to_md_map[map_idx] = map_idx; + } + } + else if ( ivas_format == MASA_FORMAT || ivas_format == MASA_ISM_FORMAT ) + { + hSpatParamRendCom->dirac_md_buffer_length = MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_MASA_PARAM_DEC_SFR; + hSpatParamRendCom->dirac_bs_md_write_idx = DELAY_MASA_PARAM_DEC_SFR; + + set_s( hSpatParamRendCom->render_to_md_map, 0, MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME ); + for ( map_idx = 0; map_idx < DEFAULT_JBM_SUBFRAMES_5MS; map_idx++ ) + { + hSpatParamRendCom->render_to_md_map[map_idx] = map_idx; + } + } + else + { + int16_t num_slots_in_subfr; + num_slots_in_subfr = dec_param_estim_flag ? CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES : 1; + hSpatParamRendCom->dirac_md_buffer_length = ( MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_DIRAC_PARAM_DEC_SFR ); + hSpatParamRendCom->dirac_bs_md_write_idx = DELAY_DIRAC_PARAM_DEC_SFR; + hSpatParamRendCom->dirac_read_idx = 0; + + set_s( hSpatParamRendCom->render_to_md_map, 0, MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME ); + for ( map_idx = 0; map_idx < DEFAULT_JBM_SUBFRAMES_5MS * num_slots_in_subfr; map_idx++ ) + { + hSpatParamRendCom->render_to_md_map[map_idx] = hSpatParamRendCom->dirac_read_idx + map_idx / num_slots_in_subfr; + } + } + + if ( ( error = ivas_dirac_allocate_parameters( hSpatParamRendCom, 1 ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ivas_format == MASA_FORMAT || ivas_format == MASA_ISM_FORMAT || ( ( ivas_format == SBA_FORMAT || ivas_format == SBA_ISM_FORMAT ) && hodirac_flag ) ) + { + if ( ( error = ivas_dirac_allocate_parameters( hSpatParamRendCom, 2 ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + hSpatParamRendCom->azimuth2 = NULL; + hSpatParamRendCom->elevation2 = NULL; + hSpatParamRendCom->energy_ratio2 = NULL; + hSpatParamRendCom->spreadCoherence2 = NULL; + } + } + + return error; +} + + +/*------------------------------------------------------------------------- + * ivas_spat_hSpatParamRendCom_close() + * + * + *-------------------------------------------------------------------------*/ + +void ivas_spat_hSpatParamRendCom_close( + SPAT_PARAM_REND_COMMON_DATA_HANDLE *hSpatParamRendCom_out ) +{ + if ( hSpatParamRendCom_out == NULL || *hSpatParamRendCom_out == NULL ) + { + return; + } + + ivas_dirac_deallocate_parameters( *hSpatParamRendCom_out, 1 ); + ivas_dirac_deallocate_parameters( *hSpatParamRendCom_out, 2 ); + + free( *hSpatParamRendCom_out ); + *hSpatParamRendCom_out = NULL; + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_dirac_rend_close() + * + * + *-------------------------------------------------------------------------*/ + +void ivas_dirac_rend_close( + DIRAC_REND_HANDLE *hDirACRend_out ) +{ + int16_t i, j; + DIRAC_REND_HANDLE hDirACRend; + + if ( hDirACRend_out == NULL || *hDirACRend_out == NULL ) + { + return; + } + + hDirACRend = *hDirACRend_out; + + /* close Output synthesis sub-module */ + ivas_dirac_dec_output_synthesis_close( hDirACRend ); + + /* close Decorrelator sub-module */ + if ( hDirACRend->proto_signal_decorr_on ) + { + ivas_dirac_dec_decorr_close( &hDirACRend->h_freq_domain_decorr_ap_params, &hDirACRend->h_freq_domain_decorr_ap_state ); + } + + /* Params */ + + /* free frequency axis buffer */ + if ( hDirACRend->frequency_axis != NULL ) + { + free( hDirACRend->frequency_axis ); + hDirACRend->frequency_axis = NULL; + } + + if ( hDirACRend->diffuse_response_function != NULL ) + { + free( hDirACRend->diffuse_response_function ); + hDirACRend->diffuse_response_function = NULL; + } + + if ( hDirACRend->hoa_encoder != NULL ) + { + free( hDirACRend->hoa_encoder ); + hDirACRend->hoa_encoder = NULL; + } + + /* prototype indexing */ + if ( hDirACRend->proto_index_dir != NULL ) + { + free( hDirACRend->proto_index_dir ); + hDirACRend->proto_index_dir = NULL; + } + + if ( hDirACRend->proto_index_diff != NULL ) + { + free( hDirACRend->proto_index_diff ); + hDirACRend->proto_index_dir = NULL; + } + + /* States */ + + /* free prototype signal buffers */ + if ( hDirACRend->proto_frame_f != NULL ) + { + free( hDirACRend->proto_frame_f ); + hDirACRend->proto_frame_f = NULL; + } + + for ( i = 0; i < DIRAC_NUM_DIMS; i++ ) + { + for ( j = 0; j < DIRAC_NO_COL_AVG_DIFF; j++ ) + { + if ( hDirACRend->buffer_intensity_real[i][j] != NULL ) + { + free( hDirACRend->buffer_intensity_real[i][j] ); + hDirACRend->buffer_intensity_real[i][j] = NULL; + } + } + } + if ( hDirACRend->buffer_energy != NULL ) + { + free( hDirACRend->buffer_energy ); + hDirACRend->buffer_energy = NULL; + } + + if ( hDirACRend->masa_stereo_type_detect != NULL ) + { + free( hDirACRend->masa_stereo_type_detect ); + hDirACRend->masa_stereo_type_detect = NULL; + } + + ivas_dirac_free_mem( &( hDirACRend->stack_mem ) ); + + free( *hDirACRend_out ); + *hDirACRend_out = NULL; + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_dirac_deallocate_parameters() + * + * Deallocate DirAC parameters + *-------------------------------------------------------------------------*/ + +void ivas_dirac_deallocate_parameters( + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, /* i/o: common data for spatial parametric rendering */ + const int16_t params_flag /* i : set of parameters flag */ +) +{ + int16_t i; + int16_t md_buffer_length; + + if ( hSpatParamRendCom == NULL ) + { + return; + } + + md_buffer_length = hSpatParamRendCom->dirac_md_buffer_length; + + if ( params_flag == 1 ) + { + if ( hSpatParamRendCom->azimuth != NULL ) + { + for ( i = 0; i < md_buffer_length; i++ ) + { + if ( hSpatParamRendCom->azimuth[i] != NULL ) + { + free( hSpatParamRendCom->azimuth[i] ); + hSpatParamRendCom->azimuth[i] = NULL; + } + } + + free( hSpatParamRendCom->azimuth ); + hSpatParamRendCom->azimuth = NULL; + } + + if ( hSpatParamRendCom->elevation != NULL ) + { + for ( i = 0; i < md_buffer_length; i++ ) + { + if ( hSpatParamRendCom->elevation[i] != NULL ) + { + free( hSpatParamRendCom->elevation[i] ); + hSpatParamRendCom->elevation[i] = NULL; + } + } + + free( hSpatParamRendCom->elevation ); + hSpatParamRendCom->elevation = NULL; + } + + if ( hSpatParamRendCom->energy_ratio1 != NULL ) + { + for ( i = 0; i < md_buffer_length; i++ ) + { + if ( hSpatParamRendCom->energy_ratio1[i] != NULL ) + { + free( hSpatParamRendCom->energy_ratio1[i] ); + hSpatParamRendCom->energy_ratio1[i] = NULL; + } + } + free( hSpatParamRendCom->energy_ratio1 ); + hSpatParamRendCom->energy_ratio1 = NULL; + } + + if ( hSpatParamRendCom->diffuseness_vector != NULL ) + { + for ( i = 0; i < md_buffer_length; i++ ) + { + if ( hSpatParamRendCom->diffuseness_vector[i] != NULL ) + { + free( hSpatParamRendCom->diffuseness_vector[i] ); + hSpatParamRendCom->diffuseness_vector[i] = NULL; + } + } + + free( hSpatParamRendCom->diffuseness_vector ); + hSpatParamRendCom->diffuseness_vector = NULL; + } + + if ( hSpatParamRendCom->spreadCoherence != NULL ) + { + for ( i = 0; i < md_buffer_length; i++ ) + { + if ( hSpatParamRendCom->spreadCoherence[i] != NULL ) + { + free( hSpatParamRendCom->spreadCoherence[i] ); + hSpatParamRendCom->spreadCoherence[i] = NULL; + } + } + free( hSpatParamRendCom->spreadCoherence ); + hSpatParamRendCom->spreadCoherence = NULL; + } + + if ( hSpatParamRendCom->surroundingCoherence != NULL ) + { + for ( i = 0; i < md_buffer_length; i++ ) + { + if ( hSpatParamRendCom->surroundingCoherence[i] != NULL ) + { + free( hSpatParamRendCom->surroundingCoherence[i] ); + hSpatParamRendCom->surroundingCoherence[i] = NULL; + } + } + free( hSpatParamRendCom->surroundingCoherence ); + hSpatParamRendCom->surroundingCoherence = NULL; + } + } + else if ( params_flag == 2 ) + { + if ( hSpatParamRendCom->azimuth2 != NULL ) + { + for ( i = 0; i < md_buffer_length; i++ ) + { + if ( hSpatParamRendCom->azimuth2[i] != NULL ) + { + free( hSpatParamRendCom->azimuth2[i] ); + hSpatParamRendCom->azimuth2[i] = NULL; + } + } + free( hSpatParamRendCom->azimuth2 ); + hSpatParamRendCom->azimuth2 = NULL; + } + + if ( hSpatParamRendCom->elevation2 != NULL ) + { + for ( i = 0; i < md_buffer_length; i++ ) + { + if ( hSpatParamRendCom->elevation2[i] != NULL ) + { + free( hSpatParamRendCom->elevation2[i] ); + hSpatParamRendCom->elevation2[i] = NULL; + } + } + free( hSpatParamRendCom->elevation2 ); + hSpatParamRendCom->elevation2 = NULL; + } + + if ( hSpatParamRendCom->energy_ratio2 != NULL ) + { + for ( i = 0; i < md_buffer_length; i++ ) + { + if ( hSpatParamRendCom->energy_ratio2[i] != NULL ) + { + free( hSpatParamRendCom->energy_ratio2[i] ); + hSpatParamRendCom->energy_ratio2[i] = NULL; + } + } + free( hSpatParamRendCom->energy_ratio2 ); + hSpatParamRendCom->energy_ratio2 = NULL; + } + + if ( hSpatParamRendCom->spreadCoherence2 != NULL ) + { + for ( i = 0; i < md_buffer_length; i++ ) + { + if ( hSpatParamRendCom->spreadCoherence2[i] != NULL ) + { + free( hSpatParamRendCom->spreadCoherence2[i] ); + hSpatParamRendCom->spreadCoherence2[i] = NULL; + } + } + free( hSpatParamRendCom->spreadCoherence2 ); + hSpatParamRendCom->spreadCoherence2 = NULL; + } + } + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_dirac_alloc_mem() + * + * Allocate stack memory for DirAC renderer + *------------------------------------------------------------------------*/ + +ivas_error ivas_dirac_alloc_mem( + DIRAC_REND_HANDLE hDirACRend, + const RENDERER_TYPE renderer_type, + const int16_t num_freq_bands, + DIRAC_DEC_STACK_MEM_HANDLE hDirAC_mem, + const int16_t hodirac_flag ) +{ + int16_t num_freq_bands_diff, size; + int16_t size_ho; + int16_t size_pf; + int16_t num_outputs_dir, num_outputs_diff; + int16_t num_protos_dir; + + num_protos_dir = hDirACRend->num_protos_dir; + + num_freq_bands_diff = hDirACRend->h_output_synthesis_psd_params.max_band_decorr; + + num_outputs_dir = hDirACRend->num_outputs_dir; + num_outputs_diff = hDirACRend->num_outputs_diff; + + size = num_freq_bands * num_outputs_dir; + if ( hodirac_flag ) + { + size_ho = size * DIRAC_HO_NUMSECTORS; + size_pf = num_freq_bands * DIRAC_HO_NUMSECTORS; + } + else + { + size_ho = size; + size_pf = num_freq_bands; + } + + /* PSD related buffers */ + hDirAC_mem->cy_auto_dir_smooth = NULL; + hDirAC_mem->proto_power_smooth = NULL; + hDirAC_mem->proto_power_diff_smooth = NULL; + hDirAC_mem->direct_responses_square = NULL; + hDirAC_mem->frame_dec_f = NULL; + if ( hDirACRend->synthesisConf != DIRAC_SYNTHESIS_GAIN_SHD ) + { + if ( ( hDirAC_mem->cy_auto_dir_smooth = (float *) malloc( sizeof( float ) * size ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); + } + set_zero( hDirAC_mem->cy_auto_dir_smooth, size ); + + if ( ( hDirAC_mem->proto_power_smooth = (float *) malloc( sizeof( float ) * size ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); + } + set_zero( hDirAC_mem->proto_power_smooth, size ); + + if ( ( hDirAC_mem->proto_power_diff_smooth = (float *) malloc( sizeof( float ) * size ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); + } + set_zero( hDirAC_mem->proto_power_diff_smooth, size ); + + if ( ( hDirAC_mem->direct_responses_square = (float *) malloc( sizeof( float ) * size ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); + } + set_zero( hDirAC_mem->direct_responses_square, size ); + if ( hDirACRend->proto_signal_decorr_on && ( renderer_type != RENDERER_BINAURAL_PARAMETRIC && renderer_type != RENDERER_BINAURAL_PARAMETRIC_ROOM && renderer_type != RENDERER_STEREO_PARAMETRIC ) ) + { + if ( ( hDirAC_mem->frame_dec_f = (float *) malloc( sizeof( float ) * 2 * num_outputs_diff * num_freq_bands ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); + } + } + } + hDirACRend->h_output_synthesis_psd_state.proto_power_smooth = hDirAC_mem->proto_power_smooth; + hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth = hDirAC_mem->proto_power_diff_smooth; + hDirACRend->h_output_synthesis_psd_state.cy_auto_dir_smooth = hDirAC_mem->cy_auto_dir_smooth; + hDirACRend->h_output_synthesis_psd_state.direct_responses_square = hDirAC_mem->direct_responses_square; + + /* Target and smoothed nrg factors/gains */ + if ( ( hDirAC_mem->cy_cross_dir_smooth = (float *) malloc( sizeof( float ) * size_ho ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); + } + set_zero( hDirAC_mem->cy_cross_dir_smooth, size ); + + if ( hDirACRend->synthesisConf != DIRAC_SYNTHESIS_GAIN_SHD ) + { + if ( ( hDirAC_mem->cy_auto_diff_smooth = (float *) malloc( sizeof( float ) * size ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); + } + set_zero( hDirAC_mem->cy_auto_diff_smooth, size ); + } + else + { + if ( ( hDirAC_mem->cy_auto_diff_smooth = (float *) malloc( sizeof( float ) * num_outputs_diff * num_freq_bands_diff ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); + } + set_zero( hDirAC_mem->cy_auto_diff_smooth, num_outputs_diff * num_freq_bands_diff ); + } + hDirACRend->h_output_synthesis_psd_state.cy_cross_dir_smooth = hDirAC_mem->cy_cross_dir_smooth; + hDirACRend->h_output_synthesis_psd_state.cy_auto_diff_smooth = hDirAC_mem->cy_auto_diff_smooth; + + /*Responses (gains/factors)*/ + if ( ( hDirAC_mem->direct_responses = (float *) malloc( sizeof( float ) * size_ho ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); + } + set_zero( hDirAC_mem->direct_responses, size ); + + + hDirACRend->h_output_synthesis_psd_state.direct_responses = hDirAC_mem->direct_responses; + + /* Prototypes */ + hDirAC_mem->proto_direct_buffer_f = NULL; + hDirAC_mem->proto_diffuse_buffer_f = NULL; + if ( renderer_type != RENDERER_BINAURAL_PARAMETRIC && renderer_type != RENDERER_BINAURAL_PARAMETRIC_ROOM && renderer_type != RENDERER_STEREO_PARAMETRIC ) + { + if ( ( hDirAC_mem->proto_direct_buffer_f = (float *) malloc( sizeof( float ) * 2 * MAX_PARAM_SPATIAL_SUBFRAMES * num_protos_dir * num_freq_bands ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); + } + + if ( hDirACRend->proto_signal_decorr_on ) + { + if ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_PSD_SHD ) + { + if ( ( hDirAC_mem->proto_diffuse_buffer_f = (float *) malloc( sizeof( float ) * 2 * MAX_PARAM_SPATIAL_SUBFRAMES * size ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); + } + } + else + { + if ( ( hDirAC_mem->proto_diffuse_buffer_f = (float *) malloc( sizeof( float ) * 2 * MAX_PARAM_SPATIAL_SUBFRAMES * num_outputs_diff * num_freq_bands ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); + } + } + } + } + hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f = hDirAC_mem->proto_direct_buffer_f; + hDirACRend->h_output_synthesis_psd_state.proto_diffuse_buffer_f = hDirAC_mem->proto_diffuse_buffer_f; + + /* Gains/power factors*/ + hDirAC_mem->direct_power_factor = NULL; + hDirAC_mem->diffuse_power_factor = NULL; + + if ( renderer_type != RENDERER_BINAURAL_PARAMETRIC && renderer_type != RENDERER_BINAURAL_PARAMETRIC_ROOM && renderer_type != RENDERER_STEREO_PARAMETRIC ) + { + if ( ( hDirAC_mem->direct_power_factor = (float *) malloc( sizeof( float ) * size_pf ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); + } + if ( ( hDirAC_mem->diffuse_power_factor = (float *) malloc( sizeof( float ) * size_pf ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); + } + } + + hDirACRend->h_output_synthesis_psd_state.direct_power_factor = hDirAC_mem->direct_power_factor; + hDirACRend->h_output_synthesis_psd_state.diffuse_power_factor = hDirAC_mem->diffuse_power_factor; + + hDirAC_mem->reference_power = NULL; + hDirAC_mem->onset_filter = NULL; + if ( hDirACRend->synthesisConf != DIRAC_SYNTHESIS_GAIN_SHD ) + { + if ( renderer_type != RENDERER_BINAURAL_PARAMETRIC && renderer_type != RENDERER_BINAURAL_PARAMETRIC_ROOM && renderer_type != RENDERER_STEREO_PARAMETRIC ) + { + if ( ( hDirAC_mem->reference_power = (float *) malloc( sizeof( float ) * 2 * num_freq_bands ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); + } + if ( hDirACRend->proto_signal_decorr_on ) + { + if ( ( hDirAC_mem->onset_filter = (float *) malloc( sizeof( float ) * num_outputs_diff * num_freq_bands ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); + } + } + } + } + else + { + if ( num_protos_dir > 2 ) + { + if ( ( hDirAC_mem->reference_power = (float *) malloc( sizeof( float ) * 5 * num_freq_bands ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); + } + } + + if ( hDirACRend->proto_signal_decorr_on ) + { + if ( ( hDirAC_mem->onset_filter = (float *) malloc( sizeof( float ) * 2 * num_freq_bands ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); + } + } + } + + return IVAS_ERR_OK; +} + + +/*------------------------------------------------------------------------- + * ivas_dirac_free_mem() + * + * + *-------------------------------------------------------------------------*/ + +void ivas_dirac_free_mem( + DIRAC_DEC_STACK_MEM_HANDLE hDirAC_mem ) +{ + if ( hDirAC_mem->cy_auto_dir_smooth != NULL ) + { + free( hDirAC_mem->cy_auto_dir_smooth ); + } + if ( hDirAC_mem->proto_power_smooth != NULL ) + { + free( hDirAC_mem->proto_power_smooth ); + } + if ( hDirAC_mem->proto_power_diff_smooth != NULL ) + { + free( hDirAC_mem->proto_power_diff_smooth ); + } + if ( hDirAC_mem->direct_responses_square != NULL ) + { + free( hDirAC_mem->direct_responses_square ); + } + if ( hDirAC_mem->frame_dec_f != NULL ) + { + free( hDirAC_mem->frame_dec_f ); + } + if ( hDirAC_mem->cy_cross_dir_smooth != NULL ) + { + free( hDirAC_mem->cy_cross_dir_smooth ); + } + if ( hDirAC_mem->cy_auto_diff_smooth != NULL ) + { + free( hDirAC_mem->cy_auto_diff_smooth ); + } + if ( hDirAC_mem->direct_responses != NULL ) + { + free( hDirAC_mem->direct_responses ); + } + if ( hDirAC_mem->proto_direct_buffer_f != NULL ) + { + free( hDirAC_mem->proto_direct_buffer_f ); + } + if ( hDirAC_mem->proto_diffuse_buffer_f != NULL ) + { + free( hDirAC_mem->proto_diffuse_buffer_f ); + } + if ( hDirAC_mem->direct_power_factor != NULL ) + { + free( hDirAC_mem->direct_power_factor ); + } + if ( hDirAC_mem->diffuse_power_factor != NULL ) + { + free( hDirAC_mem->diffuse_power_factor ); + } + if ( hDirAC_mem->reference_power != NULL ) + { + free( hDirAC_mem->reference_power ); + } + if ( hDirAC_mem->onset_filter != NULL ) + { + free( hDirAC_mem->onset_filter ); + } + + return; +} + + +/*------------------------------------------------------------------------- + * compute_hoa_encoder_mtx() + * + * + *------------------------------------------------------------------------*/ + +void compute_hoa_encoder_mtx( + const float *azimuth, + const float *elevation, + float *response, + const int16_t num_responses, + const int16_t ambisonics_order ) +{ + int16_t k, num_sh; + + num_sh = ivas_sba_get_nchan( ambisonics_order, 0 ); + + for ( k = 0; k < num_responses; k++ ) + { + ivas_dirac_dec_get_response( (const int16_t) azimuth[k], (const int16_t) elevation[k], &response[k * num_sh], ambisonics_order ); + } + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_dirac_dec_get_frequency_axis() + * + * DirAC decoding initialization + *------------------------------------------------------------------------*/ + +void ivas_dirac_dec_get_frequency_axis( + float *frequency_axis, + const int32_t output_Fs, + const int16_t num_freq_bands ) +{ + int16_t k; + float const_part; + + /* calc cldfb frequency axis */ + const_part = (float) output_Fs / ( 2.0f * (float) num_freq_bands ); + for ( k = 0; k < num_freq_bands; ++k ) + { + frequency_axis[k] = ( (float) k + 0.5f ) * const_part; + } + + return; +} + + +/*------------------------------------------------------------------------- + * initDiffuseResponses() + * + * + *-------------------------------------------------------------------------*/ + +void initDiffuseResponses( + float *diffuse_response_function, + const int16_t num_channels, + const AUDIO_CONFIG output_config, + const IVAS_OUTPUT_SETUP hOutSetup, + const int16_t ambisonics_order, + const IVAS_FORMAT ivas_format, + int16_t *num_ele_spk_no_diffuse_rendering, + const AUDIO_CONFIG transport_config ) +{ + int16_t i, l, k, idx, num_horizontal_speakers; + *num_ele_spk_no_diffuse_rendering = 0; + + if ( output_config == IVAS_AUDIO_CONFIG_MONO ) + { + diffuse_response_function[0] = 1.0f; + diffuse_response_function[1] = inv_sqrt( 3.0f ); + } + else if ( !( output_config == IVAS_AUDIO_CONFIG_FOA || output_config == IVAS_AUDIO_CONFIG_HOA2 || output_config == IVAS_AUDIO_CONFIG_HOA3 ) ) + { + /* set diffuse response function */ + if ( ivas_format == MC_FORMAT && ( transport_config == IVAS_AUDIO_CONFIG_5_1 || transport_config == IVAS_AUDIO_CONFIG_7_1 ) && output_config == IVAS_AUDIO_CONFIG_5_1_4 ) + { + num_horizontal_speakers = num_channels - NUM_ELEVATED_SPEAKERS; + + mvr2r( diffuse_response_CICP6, diffuse_response_function, num_horizontal_speakers ); + set_zero( &diffuse_response_function[num_horizontal_speakers], NUM_ELEVATED_SPEAKERS ); + *num_ele_spk_no_diffuse_rendering = NUM_ELEVATED_SPEAKERS; + } + else if ( ivas_format == MC_FORMAT && ( transport_config == IVAS_AUDIO_CONFIG_5_1 || transport_config == IVAS_AUDIO_CONFIG_7_1 ) && output_config == IVAS_AUDIO_CONFIG_7_1_4 ) + { + num_horizontal_speakers = num_channels - NUM_ELEVATED_SPEAKERS; + + set_f( diffuse_response_function, sqrtf( 1.f / ( (float) num_horizontal_speakers ) ), num_horizontal_speakers ); + set_zero( &diffuse_response_function[num_horizontal_speakers], NUM_ELEVATED_SPEAKERS ); + *num_ele_spk_no_diffuse_rendering = NUM_ELEVATED_SPEAKERS; + } + else if ( ( ivas_format == MASA_FORMAT || ivas_format == MASA_ISM_FORMAT || ivas_format == MC_FORMAT ) && output_config == IVAS_AUDIO_CONFIG_5_1 && num_channels == 5 ) + { + mvr2r( diffuse_response_CICP6, diffuse_response_function, num_channels ); + } + else if ( ( ivas_format == MASA_FORMAT || ivas_format == MASA_ISM_FORMAT || ivas_format == MC_FORMAT ) && output_config == IVAS_AUDIO_CONFIG_5_1_2 && num_channels == 7 ) + { + mvr2r( diffuse_response_CICP14, diffuse_response_function, num_channels ); + } + else if ( ( ivas_format == MASA_FORMAT || ivas_format == MASA_ISM_FORMAT || ivas_format == MC_FORMAT ) && ( output_config == IVAS_AUDIO_CONFIG_5_1_4 ) && ( num_channels == 9 ) ) + { + mvr2r( diffuse_response_CICP16, diffuse_response_function, num_channels ); + } + else if ( ( ivas_format == MASA_FORMAT || ivas_format == MASA_ISM_FORMAT || ivas_format == MC_FORMAT ) && ( output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) + { + if ( transport_config == IVAS_AUDIO_CONFIG_5_1 || transport_config == IVAS_AUDIO_CONFIG_7_1 ) + { + /* Detect loudspeakers with elevation */ + for ( i = 0, num_horizontal_speakers = 0; i < num_channels; i++ ) + { + if ( fabsf( hOutSetup.ls_elevation[i] ) <= 5.f ) + { + num_horizontal_speakers++; + diffuse_response_function[i] = 1.f; + } + else + { + *num_ele_spk_no_diffuse_rendering += 1; + diffuse_response_function[i] = 0.f; + } + } + /* Diffuse only to horizontal plane if enough loudspeakers */ + if ( num_horizontal_speakers > 2 ) + { + for ( i = 0; i < num_channels; i++ ) + { + diffuse_response_function[i] *= sqrtf( 1.f / (float) num_horizontal_speakers ); + } + } + else + { + *num_ele_spk_no_diffuse_rendering = 0; + set_f( diffuse_response_function, sqrtf( 1.f / (float) num_channels ), num_channels ); + } + } + else + { + set_f( diffuse_response_function, sqrtf( 1.f / (float) num_channels ), num_channels ); + } + } + else + { + set_f( diffuse_response_function, sqrtf( 1.f / (float) num_channels ), num_channels ); + } + } + else + { + idx = 0; + for ( l = 0; l <= ambisonics_order; l++ ) + { + for ( k = 0; k < ( 2 * l + 1 ); k++ ) + { + diffuse_response_function[idx++] = inv_sqrt( 2.0f * l + 1.0f ); + } + } + } + + return; +} + + +/*------------------------------------------------------------------------- + * protoSignalComputation_shd() + * + * + *-------------------------------------------------------------------------*/ + +void protoSignalComputation_shd( + float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], + float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], + float *proto_direct_buffer_f, + float *proto_diffuse_buffer_f, + float *reference_power, + const int16_t slot_index, + const int16_t num_inputs, + const int16_t num_outputs_diff, + const int16_t num_freq_bands, + float *p_Rmat ) +{ + int16_t l, k; + float *p_proto_direct_buffer; + float *p_proto_diffuse_buffer; + int16_t Rmat_k[4]; + float W_real, W_imag; + float Y_real, Y_imag; + float *p_k[4]; + + k = 0; /* to avoid compilation warning */ + + p_proto_direct_buffer = proto_direct_buffer_f + slot_index * 2 * num_freq_bands * num_inputs; + p_proto_diffuse_buffer = proto_diffuse_buffer_f + slot_index * 2 * num_freq_bands * num_outputs_diff; + + if ( num_inputs == 1 ) + { + for ( l = 0; l < num_freq_bands; l++ ) + { + p_proto_direct_buffer[2 * l] = RealBuffer[0][0][l]; + p_proto_direct_buffer[2 * l + 1] = ImagBuffer[0][0][l]; + } + } + else if ( num_inputs == 2 ) + { + if ( p_Rmat != 0 ) + { + assert( num_inputs == 4 && "This code block should never be run with num_inputs != 4!" ); + + for ( l = 0; l < num_freq_bands; l++ ) + { + W_real = RealBuffer[0][0][l] + RealBuffer[1][0][l]; + W_imag = ImagBuffer[0][0][l] + ImagBuffer[1][0][l]; + + Y_real = RealBuffer[0][0][l] - RealBuffer[1][0][l]; + Y_imag = ImagBuffer[0][0][l] - ImagBuffer[1][0][l]; + + p_proto_direct_buffer[2 * l] = W_real; + p_proto_direct_buffer[2 * l + 1] = W_imag; + p_proto_direct_buffer[2 * num_freq_bands + 2 * l] = p_Rmat[0] * Y_real; + p_proto_direct_buffer[2 * num_freq_bands + 2 * l + 1] = p_Rmat[0] * Y_imag; + } + } + else + { + for ( l = 0; l < num_freq_bands; l++ ) + { + W_real = RealBuffer[0][0][l] + RealBuffer[1][0][l]; + W_imag = ImagBuffer[0][0][l] + ImagBuffer[1][0][l]; + + p_proto_direct_buffer[2 * l] = W_real; + p_proto_direct_buffer[2 * l + 1] = W_imag; + { + p_proto_direct_buffer[2 * num_freq_bands + 2 * l] = RealBuffer[0][0][l] - RealBuffer[1][0][l]; + p_proto_direct_buffer[2 * num_freq_bands + 2 * l + 1] = ImagBuffer[0][0][l] - ImagBuffer[1][0][l]; + } + } + } + } + else if ( num_inputs >= 4 ) + { + p_k[0] = p_proto_direct_buffer; + p_k[1] = p_proto_direct_buffer + 2 * num_freq_bands; + p_k[2] = p_proto_direct_buffer + 4 * num_freq_bands; + p_k[3] = p_proto_direct_buffer + 6 * num_freq_bands; + Rmat_k[0] = 0; + Rmat_k[1] = 1; + Rmat_k[2] = 2; + Rmat_k[3] = 0; + + if ( p_Rmat != 0 ) + { + assert( num_inputs == 4 && "This code block should never be run with num_inputs != 4!" ); + + for ( l = 0; l < num_freq_bands; l++ ) + { + *( p_k[0] ) = RealBuffer[0][0][l]; + reference_power[l + num_freq_bands] = *( p_k[0] ) * *( p_k[0] ); + p_k[0]++; + *( p_k[0] ) = ImagBuffer[0][0][l]; + reference_power[l + num_freq_bands] += *( p_k[0] ) * *( p_k[0] ); + p_k[0]++; + reference_power[l] = 0.5f * reference_power[l + num_freq_bands]; + + for ( k = 1; k < 4; k++ ) + { + *( p_k[k] ) = p_Rmat[3 * Rmat_k[k] + 1] * RealBuffer[1][0][l] + p_Rmat[3 * Rmat_k[k] + 2] * RealBuffer[2][0][l] + p_Rmat[3 * Rmat_k[k] + 0] * RealBuffer[3][0][l]; + reference_power[l + ( k + 1 ) * num_freq_bands] = *( p_k[k] ) * *( p_k[k] ); + p_k[k]++; + *( p_k[k] ) = p_Rmat[3 * Rmat_k[k] + 1] * ImagBuffer[1][0][l] + p_Rmat[3 * Rmat_k[k] + 2] * ImagBuffer[2][0][l] + p_Rmat[3 * Rmat_k[k] + 0] * ImagBuffer[3][0][l]; + reference_power[l + ( k + 1 ) * num_freq_bands] += *( p_k[k] ) * *( p_k[k] ); + p_k[k]++; + reference_power[l] += 0.5f * ( reference_power[l + ( k + 1 ) * num_freq_bands] ); + } + + for ( k = 1; k < 4; k++ ) + { + RealBuffer[k][0][l] = p_proto_direct_buffer[k * 2 * num_freq_bands + 2 * l]; + ImagBuffer[k][0][l] = p_proto_direct_buffer[k * 2 * num_freq_bands + 2 * l + 1]; + } + } + } + else + { + set_zero( reference_power, num_freq_bands ); + for ( k = 0; k < 4; k++ ) + { + for ( l = 0; l < num_freq_bands; l++ ) + { + p_proto_direct_buffer[k * 2 * num_freq_bands + 2 * l] = RealBuffer[k][0][l]; + p_proto_direct_buffer[k * 2 * num_freq_bands + 2 * l + 1] = ImagBuffer[k][0][l]; + reference_power[l + ( k + 1 ) * num_freq_bands] = RealBuffer[k][0][l] * RealBuffer[k][0][l] + ImagBuffer[k][0][l] * ImagBuffer[k][0][l]; + reference_power[l] += 0.5f * ( reference_power[l + ( k + 1 ) * num_freq_bands] ); + } + } + } + + /* Additional transport channels = planar SBA components of degree higher than 1*/ + for ( ; k < num_inputs; k++ ) + { + for ( l = 0; l < num_freq_bands; l++ ) + { + p_proto_direct_buffer[k * 2 * num_freq_bands + 2 * l] = RealBuffer[k][0][l]; + p_proto_direct_buffer[k * 2 * num_freq_bands + 2 * l + 1] = ImagBuffer[k][0][l]; + } + } + } + + + /*Copy direct to diffuse proto*/ + mvr2r( p_proto_direct_buffer, p_proto_diffuse_buffer, 2 * num_freq_bands * min( num_outputs_diff, num_inputs ) ); + + if ( num_inputs == 1 ) + { + /* Add comfort noise addition (CNA) to diffuse proto only*/ + for ( l = 0; l < num_freq_bands; l++ ) + { + p_proto_diffuse_buffer[2 * l] += RealBuffer[1][0][l]; + p_proto_diffuse_buffer[2 * l + 1] += ImagBuffer[1][0][l]; + } + } + + return; +} + + +/*------------------------------------------------------------------------- + * protoSignalComputation1() + * + * + *-------------------------------------------------------------------------*/ + +void protoSignalComputation1( + float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], + float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], + float *proto_frame_f, + float *proto_direct_buffer_f, + float *reference_power, + float *proto_power_smooth, + const int16_t slot_index, + const int16_t num_outputs_diff, + const int16_t num_freq_bands ) +{ + int16_t l, k; + float *p_proto_buffer; + + p_proto_buffer = proto_direct_buffer_f + slot_index * 2 * num_freq_bands; + + for ( l = 0; l < num_freq_bands; l++ ) + { + reference_power[l] = RealBuffer[0][0][l] * RealBuffer[0][0][l] + ImagBuffer[0][0][l] * ImagBuffer[0][0][l]; + proto_power_smooth[l] += reference_power[l]; + p_proto_buffer[2 * l] = RealBuffer[0][0][l]; + p_proto_buffer[2 * l + 1] = ImagBuffer[0][0][l]; + + for ( k = 0; k < num_outputs_diff; k++ ) + { + proto_frame_f[2 * k * num_freq_bands + 2 * l] = RealBuffer[0][0][l]; + proto_frame_f[2 * k * num_freq_bands + 2 * l + 1] = ImagBuffer[0][0][l]; + } + } + + return; +} + + +/*------------------------------------------------------------------------- + * protoSignalComputation2() + * + * + *-------------------------------------------------------------------------*/ + +void protoSignalComputation2( + float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], + float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], + float *proto_frame_f, + float *proto_direct_buffer_f, + float *reference_power, + float *proto_power_smooth, + const int16_t isloudspeaker, + const int16_t slot_index, + const int16_t num_freq_bands, + MASA_STEREO_TYPE_DETECT *stereo_type_detect ) +{ + int16_t l; + float *p_proto_buffer; + float Real_aux, Imag_aux; + + float left_bb_power, right_bb_power, total_bb_power, lr_bb_power; + float lr_total_bb_ratio; + float a, b; + + float left_hi_power, right_hi_power, total_hi_power, lr_hi_power; + float lr_total_hi_ratio; + float a2, b2; + + float sum_power; + float sum_total_ratio[MASA_SUM_FREQ_RANGE_BINS]; + float min_sum_total_ratio; + float min_sum_total_ratio_db; + + float RealSubtract, ImagSubtract; + + float interpolatorSpaced = 0.0f; + float interpolatorDmx = 1.0f; + + int16_t dipole_freq_range[2]; + float tempSpaced, tempDmx; + + if ( isloudspeaker ) + { + p_proto_buffer = proto_direct_buffer_f + slot_index * 2 * num_freq_bands * 3; + + for ( l = 0; l < num_freq_bands; l++ ) + { + float Left_power; + float Right_power; + Real_aux = RealBuffer[0][0][l] + RealBuffer[1][0][l]; + Imag_aux = ImagBuffer[0][0][l] + ImagBuffer[1][0][l]; + + Left_power = RealBuffer[0][0][l] * RealBuffer[0][0][l] + ImagBuffer[0][0][l] * ImagBuffer[0][0][l]; + Right_power = RealBuffer[1][0][l] * RealBuffer[1][0][l] + ImagBuffer[1][0][l] * ImagBuffer[1][0][l]; + + reference_power[l] = Left_power + Right_power; + proto_power_smooth[l] += Real_aux * Real_aux + Imag_aux * Imag_aux; + + p_proto_buffer[2 * l] = Real_aux; + p_proto_buffer[2 * l + 1] = Imag_aux; + proto_power_smooth[l + num_freq_bands] += RealBuffer[0][0][l] * RealBuffer[0][0][l] + ImagBuffer[0][0][l] * ImagBuffer[0][0][l]; + p_proto_buffer[2 * num_freq_bands + 2 * l] = RealBuffer[0][0][l]; + p_proto_buffer[2 * num_freq_bands + 2 * l + 1] = ImagBuffer[0][0][l]; + + proto_power_smooth[l + 2 * num_freq_bands] += RealBuffer[1][0][l] * RealBuffer[1][0][l]; + proto_power_smooth[l + 2 * num_freq_bands] += ImagBuffer[1][0][l] * ImagBuffer[1][0][l]; + p_proto_buffer[4 * num_freq_bands + 2 * l] = RealBuffer[1][0][l]; + p_proto_buffer[4 * num_freq_bands + 2 * l + 1] = ImagBuffer[1][0][l]; + + proto_frame_f[2 * l] = Real_aux; + proto_frame_f[2 * l + 1] = Imag_aux; + + proto_frame_f[2 * num_freq_bands + 2 * l] = RealBuffer[0][0][l]; + proto_frame_f[2 * num_freq_bands + 2 * l + 1] = ImagBuffer[0][0][l]; + proto_frame_f[4 * num_freq_bands + 2 * l] = RealBuffer[1][0][l]; + proto_frame_f[4 * num_freq_bands + 2 * l + 1] = ImagBuffer[1][0][l]; + } + } + else if ( stereo_type_detect != NULL ) + { + p_proto_buffer = proto_direct_buffer_f + slot_index * 2 * num_freq_bands * 2; + + left_bb_power = 0.0f; + right_bb_power = 0.0f; + total_bb_power = 0.0f; + + left_hi_power = 0.0f; + right_hi_power = 0.0f; + total_hi_power = 0.0f; + + dipole_freq_range[0] = stereo_type_detect->dipole_freq_range[0]; + dipole_freq_range[1] = stereo_type_detect->dipole_freq_range[1]; + + a = 0.01f; /* Temporal smoothing coefficient */ + b = 1.0f - a; /* Temporal smoothing coefficient */ + a2 = 0.1f; /* Temporal smoothing coefficient */ + b2 = 1.0f - a2; /* Temporal smoothing coefficient */ + + if ( stereo_type_detect->interpolator > 0 ) + { + if ( stereo_type_detect->type_change_direction == MASA_STEREO_SPACED_MICS ) + { + interpolatorSpaced = ( (float) ( stereo_type_detect->interpolator ) ) / ( (float) MASA_STEREO_INTERPOLATION_SLOTS ); + interpolatorDmx = 1.0f - interpolatorSpaced; + } + else + { + interpolatorDmx = ( (float) ( stereo_type_detect->interpolator ) ) / ( (float) MASA_STEREO_INTERPOLATION_SLOTS ); + interpolatorSpaced = 1.0f - interpolatorDmx; + } + } + + for ( l = 0; l < num_freq_bands; l++ ) + { + float Left_power; + float Right_power; + + /* Compute sum signal */ + Real_aux = RealBuffer[0][0][l] + RealBuffer[1][0][l]; + Imag_aux = ImagBuffer[0][0][l] + ImagBuffer[1][0][l]; + + /* Compute reference power */ + Left_power = RealBuffer[0][0][l] * RealBuffer[0][0][l] + ImagBuffer[0][0][l] * ImagBuffer[0][0][l]; + Right_power = RealBuffer[1][0][l] * RealBuffer[1][0][l] + ImagBuffer[1][0][l] * ImagBuffer[1][0][l]; + + reference_power[l] = Left_power + Right_power; + + left_bb_power += Left_power; + right_bb_power += Right_power; + total_bb_power += reference_power[l]; + + if ( l > MASA_HI_FREQ_START_BIN ) + { + left_hi_power += Left_power; + right_hi_power += Right_power; + total_hi_power += reference_power[l]; + } + + if ( l < min( num_freq_bands, MASA_SUM_FREQ_RANGE_BINS ) ) + { + sum_power = Real_aux * Real_aux + Imag_aux * Imag_aux; + + stereo_type_detect->sum_power[l] = a * sum_power + b * stereo_type_detect->sum_power[l]; + stereo_type_detect->total_power[l] = a * reference_power[l] + b * stereo_type_detect->total_power[l]; + + sum_total_ratio[l] = stereo_type_detect->sum_power[l] / ( stereo_type_detect->total_power[l] + EPSILON ); + } + + if ( l == 0 ) + { + RealSubtract = RealBuffer[0][0][l] - RealBuffer[1][0][l]; + ImagSubtract = ImagBuffer[0][0][l] - ImagBuffer[1][0][l]; + stereo_type_detect->subtract_power_y += RealSubtract * RealSubtract + ImagSubtract * ImagSubtract; + } + + /* Compute protos (and their power) for direct sound rendering */ + + /* W prototype */ + if ( stereo_type_detect->interpolator > 0 ) + { + if ( l < ( dipole_freq_range[1] - 1 ) || l >= MASA_SUM_PROTO_START_BIN ) + { + Real_aux = interpolatorSpaced * 0.5f * Real_aux + interpolatorDmx * Real_aux; + Imag_aux = interpolatorSpaced * 0.5f * Imag_aux + interpolatorDmx * Imag_aux; + proto_power_smooth[l] += Real_aux * Real_aux + Imag_aux * Imag_aux; + p_proto_buffer[2 * l] = Real_aux; + p_proto_buffer[2 * l + 1] = Imag_aux; + } + else + { + tempSpaced = RealBuffer[0][0][l] * RealBuffer[0][0][l] + ImagBuffer[0][0][l] * ImagBuffer[0][0][l]; + tempDmx = Real_aux * Real_aux + Imag_aux * Imag_aux; + proto_power_smooth[l] += interpolatorSpaced * tempSpaced + interpolatorDmx * tempDmx; + p_proto_buffer[2 * l] = interpolatorSpaced * RealBuffer[0][0][l] + interpolatorDmx * Real_aux; + p_proto_buffer[2 * l + 1] = interpolatorSpaced * ImagBuffer[0][0][l] + interpolatorDmx * Imag_aux; + } + } + else if ( stereo_type_detect->masa_stereo_type == MASA_STEREO_SPACED_MICS ) + { + if ( l < ( dipole_freq_range[1] - 1 ) || l >= MASA_SUM_PROTO_START_BIN ) + { + Real_aux *= 0.5f; + Imag_aux *= 0.5f; + proto_power_smooth[l] += Real_aux * Real_aux + Imag_aux * Imag_aux; + p_proto_buffer[2 * l] = Real_aux; + p_proto_buffer[2 * l + 1] = Imag_aux; + } + else + { + proto_power_smooth[l] += RealBuffer[0][0][l] * RealBuffer[0][0][l] + ImagBuffer[0][0][l] * ImagBuffer[0][0][l]; + p_proto_buffer[2 * l] = RealBuffer[0][0][l]; + p_proto_buffer[2 * l + 1] = ImagBuffer[0][0][l]; + } + } + else + { + proto_power_smooth[l] += Real_aux * Real_aux + Imag_aux * Imag_aux; + p_proto_buffer[2 * l] = Real_aux; + p_proto_buffer[2 * l + 1] = Imag_aux; + } + + /* Y prototype */ + if ( stereo_type_detect->interpolator > 0 ) + { + if ( l < ( dipole_freq_range[0] ) ) + { + p_proto_buffer[2 * num_freq_bands + 2 * l] = interpolatorSpaced * p_proto_buffer[2 * l] + interpolatorDmx * ( RealBuffer[0][0][l] - RealBuffer[1][0][l] ); + p_proto_buffer[2 * num_freq_bands + 2 * l + 1] = interpolatorSpaced * p_proto_buffer[2 * l + 1] + interpolatorDmx * ( ImagBuffer[0][0][l] - ImagBuffer[1][0][l] ); + } + else if ( l < ( dipole_freq_range[1] ) ) + { + p_proto_buffer[2 * num_freq_bands + 2 * l] = interpolatorSpaced * ( ImagBuffer[0][0][l] - ImagBuffer[1][0][l] ) + interpolatorDmx * ( RealBuffer[0][0][l] - RealBuffer[1][0][l] ); + p_proto_buffer[2 * num_freq_bands + 2 * l + 1] = interpolatorSpaced * ( -( RealBuffer[0][0][l] - RealBuffer[1][0][l] ) ) + interpolatorDmx * ( ImagBuffer[0][0][l] - ImagBuffer[1][0][l] ); + } + else + { + p_proto_buffer[2 * num_freq_bands + 2 * l] = interpolatorSpaced * p_proto_buffer[2 * l] + interpolatorDmx * ( RealBuffer[0][0][l] - RealBuffer[1][0][l] ); + p_proto_buffer[2 * num_freq_bands + 2 * l + 1] = interpolatorSpaced * p_proto_buffer[2 * l + 1] + interpolatorDmx * ( ImagBuffer[0][0][l] - ImagBuffer[1][0][l] ); + } + proto_power_smooth[l + num_freq_bands] += p_proto_buffer[2 * num_freq_bands + 2 * l] * p_proto_buffer[2 * num_freq_bands + 2 * l] + p_proto_buffer[2 * num_freq_bands + 2 * l + 1] * p_proto_buffer[2 * num_freq_bands + 2 * l + 1]; + } + else if ( stereo_type_detect->masa_stereo_type == MASA_STEREO_SPACED_MICS ) + { + if ( l < ( dipole_freq_range[0] ) ) /* proto = W */ + { + p_proto_buffer[2 * num_freq_bands + 2 * l] = p_proto_buffer[2 * l]; + p_proto_buffer[2 * num_freq_bands + 2 * l + 1] = p_proto_buffer[2 * l + 1]; + proto_power_smooth[l + num_freq_bands] = proto_power_smooth[l]; + } + else if ( l < ( dipole_freq_range[1] ) ) /* proto = -i * (x1-x2) * eq */ + { + p_proto_buffer[2 * num_freq_bands + 2 * l] = ( ImagBuffer[0][0][l] - ImagBuffer[1][0][l] ); + p_proto_buffer[2 * num_freq_bands + 2 * l + 1] = -( RealBuffer[0][0][l] - RealBuffer[1][0][l] ); + proto_power_smooth[l + num_freq_bands] += p_proto_buffer[2 * num_freq_bands + 2 * l] * p_proto_buffer[2 * num_freq_bands + 2 * l] + p_proto_buffer[2 * num_freq_bands + 2 * l + 1] * p_proto_buffer[2 * num_freq_bands + 2 * l + 1]; + } + else /* proto = W */ + { + p_proto_buffer[2 * num_freq_bands + 2 * l] = p_proto_buffer[2 * l]; + p_proto_buffer[2 * num_freq_bands + 2 * l + 1] = p_proto_buffer[2 * l + 1]; + proto_power_smooth[l + num_freq_bands] = proto_power_smooth[l]; + } + } + else + { + p_proto_buffer[2 * num_freq_bands + 2 * l] = RealBuffer[0][0][l] - RealBuffer[1][0][l]; + p_proto_buffer[2 * num_freq_bands + 2 * l + 1] = ImagBuffer[0][0][l] - ImagBuffer[1][0][l]; + proto_power_smooth[l + num_freq_bands] += p_proto_buffer[2 * num_freq_bands + 2 * l] * p_proto_buffer[2 * num_freq_bands + 2 * l] + p_proto_buffer[2 * num_freq_bands + 2 * l + 1] * p_proto_buffer[2 * num_freq_bands + 2 * l + 1]; + } + + /* Compute protos for decorrelation */ + proto_frame_f[2 * l] = Real_aux; + proto_frame_f[2 * l + 1] = Imag_aux; + proto_frame_f[2 * num_freq_bands + 2 * l] = RealBuffer[0][0][l]; + proto_frame_f[2 * num_freq_bands + 2 * l + 1] = ImagBuffer[0][0][l]; + proto_frame_f[4 * num_freq_bands + 2 * l] = RealBuffer[1][0][l]; + proto_frame_f[4 * num_freq_bands + 2 * l + 1] = ImagBuffer[1][0][l]; + } + + if ( stereo_type_detect->interpolator > 0 ) + { + stereo_type_detect->interpolator++; + if ( stereo_type_detect->interpolator == MASA_STEREO_INTERPOLATION_SLOTS ) + { + stereo_type_detect->interpolator = 0; + stereo_type_detect->current_stereo_type = stereo_type_detect->type_change_direction; + } + } + + stereo_type_detect->left_bb_power = a * left_bb_power + b * stereo_type_detect->left_bb_power; + stereo_type_detect->right_bb_power = a * right_bb_power + b * stereo_type_detect->right_bb_power; + stereo_type_detect->total_bb_power = a * total_bb_power + b * stereo_type_detect->total_bb_power; + + lr_bb_power = ( stereo_type_detect->left_bb_power < stereo_type_detect->right_bb_power ) ? stereo_type_detect->left_bb_power : stereo_type_detect->right_bb_power; + lr_bb_power *= 2.0f; + lr_total_bb_ratio = 10.0f * log10f( lr_bb_power / ( stereo_type_detect->total_bb_power + EPSILON ) ); + + stereo_type_detect->left_hi_power = a2 * left_hi_power + b2 * stereo_type_detect->left_hi_power; + stereo_type_detect->right_hi_power = a2 * right_hi_power + b2 * stereo_type_detect->right_hi_power; + stereo_type_detect->total_hi_power = a2 * total_hi_power + b2 * stereo_type_detect->total_hi_power; + + lr_hi_power = ( stereo_type_detect->left_hi_power < stereo_type_detect->right_hi_power ) ? stereo_type_detect->left_hi_power : stereo_type_detect->right_hi_power; + lr_hi_power *= 2.0f; + lr_total_hi_ratio = 10.0f * log10f( lr_hi_power / ( stereo_type_detect->total_hi_power + EPSILON ) ); + + minimum( sum_total_ratio, min( num_freq_bands, MASA_SUM_FREQ_RANGE_BINS ), &min_sum_total_ratio ); + min_sum_total_ratio_db = 10.0f * log10f( min_sum_total_ratio ); + + stereo_type_detect->lr_total_bb_ratio_db = lr_total_bb_ratio; + stereo_type_detect->lr_total_hi_ratio_db = lr_total_hi_ratio; + stereo_type_detect->min_sum_total_ratio_db = min_sum_total_ratio_db; + + ivas_masa_stereotype_detection( stereo_type_detect ); + } + else + { + p_proto_buffer = proto_direct_buffer_f + slot_index * 2 * num_freq_bands * 2; + + for ( l = 0; l < num_freq_bands; l++ ) + { + Real_aux = RealBuffer[0][0][l] + RealBuffer[1][0][l]; + Imag_aux = ImagBuffer[0][0][l] + ImagBuffer[1][0][l]; + + reference_power[l] = Real_aux * Real_aux + Imag_aux * Imag_aux; + proto_power_smooth[l] += reference_power[l]; + p_proto_buffer[2 * l] = Real_aux; + p_proto_buffer[2 * l + 1] = Imag_aux; + + p_proto_buffer[2 * num_freq_bands + 2 * l] = RealBuffer[0][0][l] - RealBuffer[1][0][l]; + p_proto_buffer[2 * num_freq_bands + 2 * l + 1] = ImagBuffer[0][0][l] - ImagBuffer[1][0][l]; + proto_power_smooth[l + num_freq_bands] += p_proto_buffer[2 * num_freq_bands + 2 * l] * p_proto_buffer[2 * num_freq_bands + 2 * l] + p_proto_buffer[2 * num_freq_bands + 2 * l + 1] * p_proto_buffer[2 * num_freq_bands + 2 * l + 1]; + + proto_frame_f[2 * l] = Real_aux; + proto_frame_f[2 * l + 1] = Imag_aux; + + proto_frame_f[2 * num_freq_bands + 2 * l] = RealBuffer[0][0][l]; + proto_frame_f[2 * num_freq_bands + 2 * l + 1] = ImagBuffer[0][0][l]; + proto_frame_f[4 * num_freq_bands + 2 * l] = RealBuffer[1][0][l]; + proto_frame_f[4 * num_freq_bands + 2 * l + 1] = ImagBuffer[1][0][l]; + } + } + + return; +} + + +/*------------------------------------------------------------------------- + * protoSignalComputation4() + * + * + *-------------------------------------------------------------------------*/ + +void protoSignalComputation4( + float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], + float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], + float *proto_frame_f, + float *proto_direct_buffer_f, + float *reference_power, + float *proto_power_smooth, + const int16_t slot_index, + const int16_t num_outputs_diff, + const int16_t num_freq_bands, + const float *mtx_hoa_decoder, + const int16_t nchan_transport, + const int16_t *sba_map_tc_ind ) +{ + int16_t k, l; + int16_t n; + float sq_tmp; + float *p_proto_buffer; + + set_zero( reference_power, num_freq_bands ); + for ( k = 0; k < 4; k++ ) + { + for ( l = 0; l < num_freq_bands; l++ ) + { + sq_tmp = RealBuffer[k][0][l] * RealBuffer[k][0][l] + ImagBuffer[k][0][l] * ImagBuffer[k][0][l]; + reference_power[l] += 0.5f * sq_tmp; + } + } + + /*For decorrelated diffuseness*/ + for ( l = 0; l < num_outputs_diff; l++ ) + { + for ( k = 0; k < num_freq_bands; k++ ) + { + proto_frame_f[2 * l * num_freq_bands + 2 * k] = 0.f; + proto_frame_f[2 * l * num_freq_bands + 2 * k + 1] = 0.f; + for ( n = 0; n < nchan_transport; n++ ) + { + proto_frame_f[2 * l * num_freq_bands + 2 * k] += RealBuffer[n][0][k] * mtx_hoa_decoder[l * 16 + sba_map_tc_ind[n]]; + proto_frame_f[2 * l * num_freq_bands + 2 * k + 1] += ImagBuffer[n][0][k] * mtx_hoa_decoder[l * 16 + sba_map_tc_ind[n]]; + } + } + } + + p_proto_buffer = proto_direct_buffer_f + slot_index * 2 * num_freq_bands * num_outputs_diff; + for ( k = 0; k < num_outputs_diff; k++ ) + { + for ( l = 0; l < num_freq_bands; l++ ) + { + sq_tmp = proto_frame_f[k * 2 * num_freq_bands + 2 * l] * proto_frame_f[k * 2 * num_freq_bands + 2 * l] + proto_frame_f[k * 2 * num_freq_bands + 2 * l + 1] * proto_frame_f[k * 2 * num_freq_bands + 2 * l + 1]; + proto_power_smooth[l + k * num_freq_bands] += sq_tmp; + p_proto_buffer[k * 2 * num_freq_bands + 2 * l] = proto_frame_f[k * 2 * num_freq_bands + 2 * l]; + p_proto_buffer[k * 2 * num_freq_bands + 2 * l + 1] = proto_frame_f[k * 2 * num_freq_bands + 2 * l + 1]; + } + } + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_dirac_dec_compute_diffuse_proto() + * + * Compute diffuse prototype buffer and smooth power, only for decorrelated bands + *------------------------------------------------------------------------*/ + +void ivas_dirac_dec_compute_diffuse_proto( + DIRAC_REND_HANDLE hDirACRend, + const int16_t num_freq_bands, + const int16_t slot_idx /* i : slot index */ +) +{ + int16_t k, l; + int16_t num_freq_bands_diff; + float *p_diff_buffer, *p_diff_buffer_1; + float *p_proto_diff, *p_power_smooth, *proto_frame_dec_f; + DIRAC_OUTPUT_SYNTHESIS_PARAMS *h_dirac_output_synthesis_params; + DIRAC_OUTPUT_SYNTHESIS_STATE *h_dirac_output_synthesis_state; + int16_t m; + float *p_hoa_enc; + + proto_frame_dec_f = hDirACRend->proto_frame_dec_f; + h_dirac_output_synthesis_params = &( hDirACRend->h_output_synthesis_psd_params ); + h_dirac_output_synthesis_state = &( hDirACRend->h_output_synthesis_psd_state ); + + num_freq_bands_diff = h_dirac_output_synthesis_params->max_band_decorr; + if ( num_freq_bands_diff == 0 ) + { + return; + } + + p_diff_buffer = h_dirac_output_synthesis_state->proto_diffuse_buffer_f + slot_idx * 2 * num_freq_bands_diff * hDirACRend->hOutSetup.nchan_out_woLFE; + p_diff_buffer_1 = p_diff_buffer + 1; + p_power_smooth = h_dirac_output_synthesis_state->proto_power_diff_smooth; + + if ( hDirACRend->synthesisConf != DIRAC_SYNTHESIS_PSD_SHD ) + { + for ( k = 0; k < hDirACRend->hOutSetup.nchan_out_woLFE; k++ ) + { + p_proto_diff = proto_frame_dec_f + k * 2 * num_freq_bands; + for ( l = 0; l < num_freq_bands_diff; l++ ) + { + *p_diff_buffer = *( p_proto_diff++ ); + *p_diff_buffer_1 = *( p_proto_diff++ ); + *( p_power_smooth++ ) += ( *p_diff_buffer ) * ( *p_diff_buffer ) + ( *p_diff_buffer_1 ) * ( *p_diff_buffer_1 ); + p_diff_buffer += 2; + p_diff_buffer_1 += 2; + } + } + } + else + { + /*DIRAC_SYNTHESIS_PSD_SHD: Virtual LS->HOA encoding*/ + for ( k = 0; k < hDirACRend->hOutSetup.nchan_out_woLFE; k++ ) + { + for ( l = 0; l < num_freq_bands_diff; l++ ) + { + p_hoa_enc = hDirACRend->hoa_encoder + k; + p_proto_diff = proto_frame_dec_f + 2 * l; + + *p_diff_buffer = 0.f; + *p_diff_buffer_1 = 0.f; + + /*LS to HOA*/ + for ( m = 0; m < hDirACRend->num_outputs_diff; m++ ) + { + *p_diff_buffer += ( *p_hoa_enc ) * ( *p_proto_diff ); + *p_diff_buffer_1 += ( *p_hoa_enc ) * ( *( p_proto_diff + 1 ) ); + p_hoa_enc += hDirACRend->hOutSetup.nchan_out_woLFE; + p_proto_diff += 2 * num_freq_bands; + } + + *( p_power_smooth++ ) += ( *p_diff_buffer ) * ( *p_diff_buffer ) + ( *p_diff_buffer_1 ) * ( *p_diff_buffer_1 ); + p_diff_buffer += 2; + p_diff_buffer_1 += 2; + } + } + } + + return; +} + + +/*------------------------------------------------------------------------- + * computeDirectionAngles() + * + *------------------------------------------------------------------------*/ + +void computeDirectionAngles( + float *intensity_real_x, + float *intensity_real_y, + float *intensity_real_z, + const int16_t num_frequency_bands, + int16_t *azimuth, + int16_t *elevation ) +{ + int16_t k; + float intensityNorm; + float x, y, z, radius; + + for ( k = 0; k < num_frequency_bands; ++k ) + { + intensityNorm = *( intensity_real_x ) * *( intensity_real_x ) + + *( intensity_real_y ) * *( intensity_real_y ) + + *( intensity_real_z ) * *( intensity_real_z ); + + if ( intensityNorm <= EPSILON ) + { + intensityNorm = 1.0f; + x = 1.0f; + y = 0.0f; + z = 0.0f; + intensity_real_x++; + intensity_real_y++; + intensity_real_z++; + } + else + { + intensityNorm = sqrtf( 1.f / intensityNorm ); + x = *( intensity_real_x++ ) * intensityNorm; + y = *( intensity_real_y++ ) * intensityNorm; + z = *( intensity_real_z++ ) * intensityNorm; + } + radius = sqrtf( x * x + y * y ); + azimuth[k] = (int16_t) ( max( -180.0f, min( 180.0f, atan2f( y, x ) / EVS_PI * 180.0f ) ) + 0.5f ); + elevation[k] = (int16_t) ( max( -90.0f, min( 180.0f, atan2f( z, radius ) / EVS_PI * 180.0f ) ) + 0.5f ); + } + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_masa_init_stereotype_detection() + * + * Initialize stereo transport signal type detection + *------------------------------------------------------------------------*/ + +void ivas_masa_init_stereotype_detection( + MASA_STEREO_TYPE_DETECT *stereo_type_detect ) +{ + stereo_type_detect->masa_stereo_type = MASA_STEREO_DOWNMIX; + stereo_type_detect->current_stereo_type = MASA_STEREO_DOWNMIX; + stereo_type_detect->type_change_direction = MASA_STEREO_DOWNMIX; + + stereo_type_detect->counter = 0; + stereo_type_detect->interpolator = 0; + + stereo_type_detect->dipole_freq_range[0] = 1; + stereo_type_detect->dipole_freq_range[1] = 3; + + stereo_type_detect->left_bb_power = 0.0f; /* Broadband estimates */ + stereo_type_detect->right_bb_power = 0.0f; + stereo_type_detect->total_bb_power = 0.0f; + + stereo_type_detect->left_hi_power = 0.0f; /* High-frequency estimates */ + stereo_type_detect->right_hi_power = 0.0f; + stereo_type_detect->total_hi_power = 0.0f; + + set_zero( stereo_type_detect->sum_power, MASA_SUM_FREQ_RANGE_BINS ); + set_zero( stereo_type_detect->total_power, MASA_SUM_FREQ_RANGE_BINS ); + + stereo_type_detect->subtract_power_y = 0.0f; + stereo_type_detect->subtract_power_y_smooth = 0.0f; + stereo_type_detect->target_power_y_smooth = 0.0f; + + stereo_type_detect->lr_total_bb_ratio_db = 0.0f; + stereo_type_detect->lr_total_hi_ratio_db = 0.0f; + stereo_type_detect->min_sum_total_ratio_db = 0.0f; + stereo_type_detect->subtract_target_ratio_db = 0.0f; + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_masa_stereotype_detection() + * + * Detect the type of the transport audio signals + *------------------------------------------------------------------------*/ + +void ivas_masa_stereotype_detection( + MASA_STEREO_TYPE_DETECT *stereo_type_detect ) +{ + float lr_total_bb_ratio_db = stereo_type_detect->lr_total_bb_ratio_db; + float lr_total_hi_ratio_db = stereo_type_detect->lr_total_hi_ratio_db; + float min_sum_total_ratio_db = stereo_type_detect->min_sum_total_ratio_db; + float subtract_target_ratio_db = stereo_type_detect->subtract_target_ratio_db; + float change_to_spaced; + int16_t change_to_spaced_selection; + float change_to_downmix; + float change_to_downmix2; + int16_t change_to_downmix_selection; + float subtract_temp; + float min_sum_temp; + float lr_total_bb_temp; + float lr_total_hi_temp; + + /* Determine if the determined features match the spaced mic type */ + change_to_spaced_selection = 0; + if ( subtract_target_ratio_db < -3.0f ) + { + subtract_temp = ( -subtract_target_ratio_db - 3.0f ) / 3.0f; + min_sum_temp = max( -min_sum_total_ratio_db / 6.0f, 0.0f ); + lr_total_bb_temp = lr_total_bb_ratio_db / 6.0f; + + change_to_spaced = subtract_temp + min_sum_temp + lr_total_bb_temp; + + if ( change_to_spaced >= 1.0f ) + { + change_to_spaced_selection = 1; + } + } + + /* Determine if the determined features match the downmix type, according to a metric */ + change_to_downmix_selection = 0; + if ( subtract_target_ratio_db > 0.0f ) + { + subtract_temp = subtract_target_ratio_db / 3.0f; + min_sum_temp = ( min_sum_total_ratio_db + 1.0f ) / 6.0f; + lr_total_bb_temp = -lr_total_bb_ratio_db / 6.0f; + + change_to_downmix = subtract_temp + min_sum_temp + lr_total_bb_temp; + + if ( change_to_downmix >= 1.0f ) + { + change_to_downmix_selection = 1; + } + } + + /* Determine if the determined features match the downmix type, according to another metric */ + if ( lr_total_hi_ratio_db < -12.0f ) + { + subtract_temp = ( subtract_target_ratio_db + 4.0f ) / 3.0f; + min_sum_temp = min_sum_total_ratio_db / 6.0f; + lr_total_hi_temp = ( -lr_total_hi_ratio_db - 12.0f ) / 3.0f; + + change_to_downmix2 = subtract_temp + min_sum_temp + lr_total_hi_temp; + + if ( change_to_downmix2 >= 1.0f ) + { + change_to_downmix_selection = 1; + } + } + + if ( stereo_type_detect->counter < 400 ) + { + stereo_type_detect->counter++; + } + else + { + if ( change_to_spaced_selection == 1 ) + { + stereo_type_detect->masa_stereo_type = MASA_STEREO_SPACED_MICS; + } + else if ( change_to_downmix_selection == 1 ) + { + stereo_type_detect->masa_stereo_type = MASA_STEREO_DOWNMIX; + } + } + + if ( stereo_type_detect->interpolator == 0 ) + { + if ( stereo_type_detect->current_stereo_type != stereo_type_detect->masa_stereo_type ) + { + stereo_type_detect->interpolator = 1; + stereo_type_detect->type_change_direction = stereo_type_detect->masa_stereo_type; + } + } + + return; +} + + +/*------------------------------------------------------------------------- + * computeIntensityVector_dec() + * + * + *------------------------------------------------------------------------*/ + +void computeIntensityVector_dec( + float Cldfb_RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], + float Cldfb_ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], + const int16_t num_frequency_bands, + float *intensity_real_x, + float *intensity_real_y, + float *intensity_real_z ) +{ + /* + * W = a + ib; Y = c + id + * real(W*Y') = ac + bd + */ + int16_t i; + float real, img; + + for ( i = 0; i < num_frequency_bands; ++i ) + { + real = Cldfb_RealBuffer[0][0][i]; + img = Cldfb_ImagBuffer[0][0][i]; + intensity_real_x[i] = Cldfb_RealBuffer[3][0][i] * real + Cldfb_ImagBuffer[3][0][i] * img; + intensity_real_y[i] = Cldfb_RealBuffer[1][0][i] * real + Cldfb_ImagBuffer[1][0][i] * img; + intensity_real_z[i] = Cldfb_RealBuffer[2][0][i] * real + Cldfb_ImagBuffer[2][0][i] * img; + } + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_lfe_synth_with_cldfb() + * + * + *------------------------------------------------------------------------*/ + +void ivas_lfe_synth_with_cldfb( + MCMASA_LFE_SYNTH_DATA_HANDLE hMasaLfeSynth, + float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], + float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], + float RealBufferLfe[MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], + float ImagBufferLfe[MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], + const int16_t slot_index, + const int16_t subframe_index, + const int16_t nchan_transport ) +{ + float lfeGain; + float transportGain; + float protoLfeReal, protoLfeImag; + int16_t i; + float transportEne, protoLfeEne, targetEneLfe, targetEneTrans; + + set_zero( RealBufferLfe[slot_index], CLDFB_NO_CHANNELS_MAX ); + set_zero( ImagBufferLfe[slot_index], CLDFB_NO_CHANNELS_MAX ); + + protoLfeReal = RealBuffer[0][0][0]; + protoLfeImag = ImagBuffer[0][0][0]; + transportEne = RealBuffer[0][0][0] * RealBuffer[0][0][0] + ImagBuffer[0][0][0] * ImagBuffer[0][0][0]; + for ( i = 1; i < nchan_transport; i++ ) + { + protoLfeReal += RealBuffer[i][0][0]; + protoLfeImag += ImagBuffer[i][0][0]; + transportEne += RealBuffer[i][0][0] * RealBuffer[i][0][0] + ImagBuffer[i][0][0] * ImagBuffer[i][0][0]; + } + protoLfeEne = protoLfeReal * protoLfeReal + protoLfeImag * protoLfeImag; + + targetEneLfe = transportEne * hMasaLfeSynth->lfeToTotalEnergyRatio[subframe_index]; + targetEneTrans = transportEne * max( ( 1.0f - hMasaLfeSynth->lfeToTotalEnergyRatio[subframe_index] ), 0.01f ); + + hMasaLfeSynth->transportEneSmooth *= MCMASA_LFE_SYNTH_ALPHA; + hMasaLfeSynth->protoLfeEneSmooth *= MCMASA_LFE_SYNTH_ALPHA; + hMasaLfeSynth->targetEneLfeSmooth *= MCMASA_LFE_SYNTH_ALPHA; + hMasaLfeSynth->targetEneTransSmooth *= MCMASA_LFE_SYNTH_ALPHA; + + hMasaLfeSynth->transportEneSmooth += transportEne; + hMasaLfeSynth->protoLfeEneSmooth += protoLfeEne; + hMasaLfeSynth->targetEneLfeSmooth += targetEneLfe; + hMasaLfeSynth->targetEneTransSmooth += targetEneTrans; + + lfeGain = min( 1.0f, sqrtf( hMasaLfeSynth->targetEneLfeSmooth / ( EPSILON + hMasaLfeSynth->protoLfeEneSmooth ) ) ); + transportGain = min( 1.0f, sqrtf( hMasaLfeSynth->targetEneTransSmooth / ( EPSILON + hMasaLfeSynth->transportEneSmooth ) ) ); + + RealBufferLfe[slot_index][0] = protoLfeReal * lfeGain; + ImagBufferLfe[slot_index][0] = protoLfeImag * lfeGain; + + RealBuffer[0][0][0] *= transportGain; + ImagBuffer[0][0][0] *= transportGain; + for ( i = 1; i < nchan_transport; i++ ) + { + RealBuffer[i][0][0] *= transportGain; + ImagBuffer[i][0][0] *= transportGain; + } + + return; +} + + +/*------------------------------------------------------------------------- + * rotateAziEle_DirAC() + * + * Apply rotation to DirAC DOAs + *------------------------------------------------------------------------*/ + +void rotateAziEle_DirAC( + int16_t *azi, /* i/o: array of azimuth values */ + int16_t *ele, /* i/o: array of elevation values */ + const int16_t band1, /* i : bands to work on (lower limit) */ + const int16_t band2, /* i : bands to work on (upper bound) */ + const float *p_Rmat /* i : pointer to real-space rotation matrix */ +) +{ + int16_t b; + float dv_0, dv_1, dv_2; + float dv_r_0, dv_r_1, dv_r_2; + float w; + + push_wmops( "rotateAziEle_DirAC" ); + + for ( b = band1; b < band2; b++ ) + { + + /*Conversion spherical to cartesian coordinates*/ + w = cosf( ele[b] * PI_OVER_180 ); + dv_0 = w * cosf( azi[b] * PI_OVER_180 ); + dv_1 = w * sinf( azi[b] * PI_OVER_180 ); + dv_2 = sinf( ele[b] * PI_OVER_180 ); + + dv_r_0 = p_Rmat[0] * dv_0 + p_Rmat[1] * dv_1 + p_Rmat[2] * dv_2; + dv_r_1 = p_Rmat[3] * dv_0 + p_Rmat[4] * dv_1 + p_Rmat[5] * dv_2; + dv_r_2 = p_Rmat[6] * dv_0 + p_Rmat[7] * dv_1 + p_Rmat[8] * dv_2; + + /*Conversion spherical to cartesian coordinates*/ + azi[b] = (int16_t) ( atan2f( dv_r_1, dv_r_0 ) * _180_OVER_PI ); + ele[b] = (int16_t) ( atan2f( dv_r_2, sqrtf( dv_r_0 * dv_r_0 + dv_r_1 * dv_r_1 ) ) * _180_OVER_PI ); + } + + pop_wmops(); + + return; +} diff --git a/lib_rend/ivas_efap.c b/lib_rend/ivas_efap.c new file mode 100644 index 0000000000000000000000000000000000000000..4c202a481d02e5e79dd020ac9d4d150c8e350946 --- /dev/null +++ b/lib_rend/ivas_efap.c @@ -0,0 +1,2233 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include +#include +#include "options.h" +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_prot_rend.h" +#include "ivas_stat_dec.h" +#include "wmc_auto.h" + +/*-----------------------------------------------------------------------* + * Local constants + *-----------------------------------------------------------------------*/ + +#define EFAP_MAX_SIZE_TMP_BUFF 30 +#define EFAP_MAX_GHOST_LS 5 /* Maximum number of ghost Loudspeakers, for memory allocation purpose */ +#define POLY_THRESH 1e-4f + + +/*-----------------------------------------------------------------------* + * Local function prototypes + *-----------------------------------------------------------------------*/ + +static ivas_error poly_init( EFAP *efap, const int16_t efip_flag ); + +static ivas_error sphere_triangulation( const int16_t numSpk, EFAP_VERTEX_DATA *vtxData, EFAP_POLYSET_DATA *polyData, float ***dmTranspose, int16_t *numTot, const int16_t efip_flag ); + +static void initial_polyeder( EFAP_VERTEX_DATA *vtxData, EFAP_LS_TRIANGLE *triArray, int16_t *numTri, int16_t *vtxInHull ); + +static void add_ghost_speakers( EFAP_VERTEX *vertexArray, int16_t *numVtx, const int16_t efip_flag ); + +static void sort_vertices( const EFAP_VERTEX *vertexArray, const int16_t *numVtx, int16_t *order ); + +static void add_vertex_to_convex_hull( const EFAP_VERTEX_DATA *vtxData, const int16_t vtxIdx, int16_t *vtxInHull, EFAP_LS_TRIANGLE *triArray, int16_t *szTri ); + +static void visible_edges( const EFAP_LS_TRIANGLE *triArray, const int16_t *visible, const int16_t numSurface, int16_t *numEdges, int16_t *edges ); + +static void flip_plane( const EFAP_VERTEX *vtxArray, int16_t *surface, const float centroid[3] ); + +static void remap_ghosts( EFAP_VERTEX *vtxArray, EFAP_LS_TRIANGLE *triArray, int16_t numSpk, int16_t *numVertex, int16_t numTri, float **downmixMatrix ); + +static void vertex_init( const float *aziSpk, const float *eleSpk, EFAP_VERTEX_DATA *efapVtxData ); + +static void efap_panning( const float azi, const float ele, const EFAP_POLYSET_DATA *polyData, float *bufferL ); + +static void get_poly_gains( const float azi, const float ele, const float aziPoly[EFAP_MAX_CHAN_NUM], const float elePoly[EFAP_MAX_CHAN_NUM], const int16_t numChan, float *buffer ); + +static float get_tri_gain( const float A[2], const float B[2], const float C[2], const float P_minus_A[2] ); + + + +/*-----------------------------------------------------------------------* + * EFAP Utils + *-----------------------------------------------------------------------*/ + +static void add_vertex( EFAP_VERTEX *vtxArray, const float azi, const float ele, const int16_t pos, const EFAP_VTX_DMX_TYPE ); + +static void efap_sort_s( int16_t *x, int16_t *idx, const int16_t len ); + +static float vertex_distance( const EFAP_VERTEX *vtxArray, const EFAP_LS_TRIANGLE tri, const int16_t vtxIdx ); + +static float point_plane_distance( const float P1[3], const float P2[3], const float P3[3], const float X[3] ); + +static float point_poly_distance( const EFAP_POLYSET poly, const float X[3] ); + +static void efap_crossp( const float *v1, const float *v2, float *v ); + +static int16_t find_int_in_tri( const EFAP_LS_TRIANGLE *tri, const int16_t n, const int16_t r, int16_t *pos ); + +static void remove_vertex( EFAP_VERTEX *vtxArray, const int16_t idx, const int16_t L ); + +static int16_t get_neighbours( const EFAP_LS_TRIANGLE *triArray, const int16_t vtxIdx, const int16_t numTri, int16_t *neighbours ); + +static void matrix_times_row( float mat[EFAP_MAX_SIZE_TMP_BUFF][EFAP_MAX_SIZE_TMP_BUFF], const float *vec, const int16_t L, float *out ); + +static void tri_to_poly( const EFAP_VERTEX *vtxArray, const EFAP_LS_TRIANGLE *triArray, const int16_t numVtx, const int16_t numTri, int16_t sortedChan[EFAP_MAX_POLY_SET][EFAP_MAX_CHAN_NUM], int16_t *outLengthPS, int16_t outLengthSorted[EFAP_MAX_POLY_SET] ); + +static int16_t compare_poly( int16_t *old, int16_t lenOld, int16_t *new, int16_t lenNew ); + +static void sort_channels_vertex( const EFAP_VERTEX *vtxArray, const EFAP_LS_TRIANGLE *triArray, int16_t channels[EFAP_MAX_CHAN_NUM], const int16_t lengthChannels, int16_t idxTri ); + +static float efap_fmodf( const float x, const float y ); + +static int16_t get_poly_num( const float P[2], const EFAP_POLYSET_DATA *polyData ); + +static int16_t in_poly( const float P[2], const EFAP_POLYSET poly ); + +static int16_t in_tri( float A[2], float B[2], float C[2], float P_minus_A[2] ); + +static void sph2cart( const float azi, const float ele, float *pos ); + +/*-----------------------------------------------------------------------* + * Global function definitions + *-----------------------------------------------------------------------*/ + +/*-------------------------------------------------------------------------* + * efap_init_data() + * + * Wrap the internal functions to initialize the EFAP data structure + *-------------------------------------------------------------------------*/ + +ivas_error efap_init_data( + EFAP_HANDLE *hEFAPdata, /* i/o: handle for EFAP data structure that will be initialized */ + const float *speaker_node_azi_deg, /* i : vector of speaker node azimuths (positive left) */ + const float *speaker_node_ele_deg, /* i : vector of speaker node elevations (positive up) */ + const int16_t num_speaker_nodes, /* i : number of speaker nodes in the set */ + const int16_t efap_mode /* i : indicates whether EFAP or EFIP is used */ +) +{ + /* Handle instance declaration */ + EFAP *efap; + ivas_error error; + + error = IVAS_ERR_OK; + + /* Basic init checks */ + if ( !speaker_node_azi_deg || !speaker_node_ele_deg ) + { + hEFAPdata = NULL; + return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "EFAP requires arrays of speaker azimuths and elevations" ); + } + + /*-----------------------------------------------------------------* + * Allocate memory + *-----------------------------------------------------------------*/ + + /* Memory Allocations for efap */ + if ( ( efap = (EFAP *) malloc( sizeof( EFAP ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for EFAP handle\n" ) ); + } + + /* Memory Allocation and update for aziSpk & eleSpk arrays*/ + if ( ( efap->aziSpk = (float *) malloc( num_speaker_nodes * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for EFAP speaker azimuths\n" ) ); + } + if ( ( efap->eleSpk = (float *) malloc( num_speaker_nodes * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for EFAP speaker elevations\n" ) ); + } + + /* Memory Allocation for vertexArray */ + if ( ( efap->vtxData.vertexArray = (EFAP_VERTEX *) malloc( ( num_speaker_nodes + EFAP_MAX_GHOST_LS ) * sizeof( EFAP_VERTEX ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for EFAP Vertex Array\n" ) ); + } + + /* Memory allocation for the tmp buffer short */ + if ( ( efap->bufferShort = (float *) malloc( num_speaker_nodes * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for EFAP bufferS\n" ) ); + } + + /*-----------------------------------------------------------------* + * Initialize values + *-----------------------------------------------------------------*/ + + efap->numSpk = num_speaker_nodes; + + /* The number of vertex is first set to the number of LS but will evolve further */ + efap->vtxData.numVtx = num_speaker_nodes; + + /* Loudspeaker configuration */ + mvr2r( speaker_node_azi_deg, efap->aziSpk, num_speaker_nodes ); + mvr2r( speaker_node_ele_deg, efap->eleSpk, num_speaker_nodes ); + + /* Initialization of the vertex */ + vertex_init( efap->aziSpk, efap->eleSpk, &efap->vtxData ); + + /* Initialization of polygons and ghost LS */ + if ( ( error = poly_init( efap, efap_mode ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Memory allocation for the tmp buffer long */ + if ( ( efap->bufferLong = (float *) malloc( efap->vtxData.numVtx * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for EFAP bufferL\n" ) ); + } + + *hEFAPdata = efap; + return error; +} + + +/*-------------------------------------------------------------------------* + * efap_determine_gains() + * + * Obtain amplitude panning gains for all speaker nodes based on the + * given direction + *-------------------------------------------------------------------------*/ + +void efap_determine_gains( + EFAP_HANDLE hEFAPdata, /* i : EFAP structure */ + float *gains, /* o : gain vector for speaker nodes for given direction */ + const float azi_deg, /* i : azimuth in degrees for panning direction (positive left) */ + const float ele_deg, /* i : elevation in degrees for panning direction (positive up) */ + const int16_t efap_mode /* i : indicates whether EFAP or EFIP is used */ +) +{ + int16_t i, j; + float azi_wrap, ele_wrap; + float normBuffer; + + /* Resetting bufferShort and bufferLong */ + set_zero( hEFAPdata->bufferShort, hEFAPdata->numSpk ); + set_zero( hEFAPdata->bufferLong, hEFAPdata->vtxData.numVtx ); + + /* Wrap angles to correct range */ + panning_wrap_angles( azi_deg, ele_deg, &azi_wrap, &ele_wrap ); + + /* Panning */ + efap_panning( azi_wrap, ele_wrap, &hEFAPdata->polyData, hEFAPdata->bufferLong ); + + if ( efap_mode == EFAP_MODE_EFAP ) + { + normBuffer = 0.f; + for ( j = 0; j < hEFAPdata->numSpk; ++j ) + { + hEFAPdata->bufferShort[j] = 0.f; + /* Multiplying by the downmixMatrix */ + for ( i = 0; i < hEFAPdata->vtxData.numVtx; ++i ) + { + hEFAPdata->bufferShort[j] += hEFAPdata->bufferLong[i] * hEFAPdata->dmTranspose[i][j]; + } + normBuffer = normBuffer + hEFAPdata->bufferShort[j] * hEFAPdata->bufferShort[j]; + } + normBuffer = inv_sqrt( normBuffer ); + + for ( j = 0; j < hEFAPdata->numSpk; ++j ) + { + hEFAPdata->bufferShort[j] *= normBuffer; + } + } + else + { + normBuffer = 0.f; + for ( j = 0; j < hEFAPdata->numSpk; ++j ) + { + hEFAPdata->bufferShort[j] = 0.f; + /* Multiplying by the downmixMatrix */ + for ( i = 0; i < hEFAPdata->vtxData.numVtx; ++i ) + { + hEFAPdata->bufferShort[j] += hEFAPdata->bufferLong[i] * hEFAPdata->dmTranspose[i][j]; + } + normBuffer = normBuffer + hEFAPdata->bufferShort[j]; + } + normBuffer = 1.f / normBuffer; + + for ( j = 0; j < hEFAPdata->numSpk; ++j ) + { + hEFAPdata->bufferShort[j] = sqrtf( hEFAPdata->bufferShort[j] * normBuffer ); + } + } + + /* Copy gains to output */ + mvr2r( hEFAPdata->bufferShort, gains, hEFAPdata->numSpk ); + + return; +} + + +/*-------------------------------------------------------------------------* + * efap_free_data() + * + * Wrapper to free EFAP data structure + *-------------------------------------------------------------------------*/ + +void efap_free_data( + EFAP_HANDLE *hEFAPdata /* i/o: EFAP handle to be freed */ +) +{ + int16_t i, dim1; + void **p_dmTranspose; + + if ( hEFAPdata == NULL || *hEFAPdata == NULL ) + { + return; + } + + dim1 = ( *hEFAPdata )->numTot; + + /* instance buffer members */ + free( ( *hEFAPdata )->aziSpk ); + ( *hEFAPdata )->aziSpk = NULL; + + free( ( *hEFAPdata )->eleSpk ); + ( *hEFAPdata )->eleSpk = NULL; + + free( ( *hEFAPdata )->vtxData.vertexArray ); + ( *hEFAPdata )->vtxData.vertexArray = NULL; + + free( ( *hEFAPdata )->vtxData.vtxOrder ); + ( *hEFAPdata )->vtxData.vtxOrder = NULL; + + free( ( *hEFAPdata )->bufferLong ); + ( *hEFAPdata )->bufferLong = NULL; + + free( ( *hEFAPdata )->bufferShort ); + ( *hEFAPdata )->bufferShort = NULL; + + p_dmTranspose = (void **) ( *hEFAPdata )->dmTranspose; + for ( i = 0; i < dim1; i++ ) + { + free( p_dmTranspose[i] ); + } + free( p_dmTranspose ); + + /* instance */ + free( *hEFAPdata ); + *hEFAPdata = NULL; + + return; +} + + +/*-----------------------------------------------------------------------* + * Local function definitions + *-----------------------------------------------------------------------*/ + + +/*-------------------------------------------------------------------------* + * poly_init() + * + * Main function for the Efap initialization whose purpose is to initialize + * the different polygons and to add the ghost speakers + *-------------------------------------------------------------------------*/ + +static ivas_error poly_init( + EFAP *efap, /* i/o: A pointer to a handle to efap instance */ + const int16_t efip_flag /* i : flag to indicate whether initialization is for EFIP (used for ALLRAD) */ +) +{ + int16_t n, m, j; + int16_t finalLength, lengthTri2PolyPS; + int16_t lengthTri2PolySorted[EFAP_MAX_POLY_SET]; + int16_t sortedChan[EFAP_MAX_POLY_SET][EFAP_MAX_CHAN_NUM]; + float tmpMax, tmpMin; + ivas_error error; + + error = IVAS_ERR_OK; + + /* Safety Check */ + assert( efap != NULL && "EFAP: efap == NULL" ); + + for ( n = 0; n < EFAP_MAX_POLY_SET; n++ ) + { + set_s( sortedChan[n], 0, EFAP_MAX_CHAN_NUM ); + } + + /* Computing the different ghost vertex, the downmix matrix and the triangle array */ + if ( ( error = sphere_triangulation( efap->numSpk, &efap->vtxData, &efap->polyData, &efap->dmTranspose, &efap->numTot, efip_flag ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* set isNaN for ghost loudspeakers */ + for ( n = 0; n < efap->vtxData.numVtx; ++n ) + { + if ( efap->vtxData.vertexArray[n].ele > 90.0 - 1e-6 || + efap->vtxData.vertexArray[n].ele < 1e-6 - 90.0 ) + { + efap->vtxData.vertexArray[n].isNaN = 1; + } + } + + /* Converting the triangle to polygon structure */ + tri_to_poly( efap->vtxData.vertexArray, efap->polyData.triArray, efap->vtxData.numVtx, efap->polyData.numTri, sortedChan, &lengthTri2PolyPS, lengthTri2PolySorted ); + + /* Completing the polyData Structure */ + finalLength = -1; + + for ( n = 0; n < lengthTri2PolyPS; ++n ) + { + m = finalLength + 1; + + /* Complete the fields of the polygon */ + for ( j = 0; j < lengthTri2PolySorted[n]; ++j ) + { + efap->polyData.polysetArray[m].chan[j] = sortedChan[n][j]; + efap->polyData.polysetArray[m].polyAzi[j] = efap->vtxData.vertexArray[sortedChan[n][j]].azi; + efap->polyData.polysetArray[m].polyEle[j] = efap->vtxData.vertexArray[sortedChan[n][j]].ele; + efap->polyData.polysetArray[m].isNaN[j] = efap->vtxData.vertexArray[sortedChan[n][j]].isNaN; + } + + efap->polyData.polysetArray[m].numChan = lengthTri2PolySorted[n]; + + /* In case tmpMax - tmpMin > 180, wrap polygon azimuth */ + maximum( efap->polyData.polysetArray[m].polyAzi, lengthTri2PolySorted[n], &tmpMax ); + minimum( efap->polyData.polysetArray[m].polyAzi, lengthTri2PolySorted[n], &tmpMin ); + + if ( ( tmpMax - tmpMin ) > 180 ) + { + for ( j = 0; j < lengthTri2PolySorted[n]; ++j ) + { + assert( ( m + 2 < EFAP_MAX_POLY_SET ) && "EFAP: maximum polygons exceeded!" ); + + /* add two new polygons with azimuths wrapped to differing bounds */ + efap->polyData.polysetArray[m + 1].polyAzi[j] = efap_fmodf( efap->polyData.polysetArray[m].polyAzi[j], 360 ); + efap->polyData.polysetArray[m + 2].polyAzi[j] = efap->polyData.polysetArray[m + 1].polyAzi[j] - 360; + + /* Copy the rest of the fields */ + efap->polyData.polysetArray[m + 1].chan[j] = efap->polyData.polysetArray[m].chan[j]; + efap->polyData.polysetArray[m + 1].polyEle[j] = efap->polyData.polysetArray[m].polyEle[j]; + efap->polyData.polysetArray[m + 1].isNaN[j] = efap->polyData.polysetArray[m].isNaN[j]; + efap->polyData.polysetArray[m + 1].numChan = lengthTri2PolySorted[n]; + + efap->polyData.polysetArray[m + 2].chan[j] = efap->polyData.polysetArray[m].chan[j]; + efap->polyData.polysetArray[m + 2].polyEle[j] = efap->polyData.polysetArray[m].polyEle[j]; + efap->polyData.polysetArray[m + 2].isNaN[j] = efap->polyData.polysetArray[m].isNaN[j]; + efap->polyData.polysetArray[m + 2].numChan = lengthTri2PolySorted[n]; + } + finalLength += 2; + } + ++finalLength; + } + ++finalLength; + + /* Updating the number of polygons */ + efap->polyData.numPoly = finalLength; + + + return error; +} + + +/*-------------------------------------------------------------------------* + * sphere_triangulation() + * + * + *-------------------------------------------------------------------------*/ + +static ivas_error sphere_triangulation( + const int16_t numSpk, /* i : Number of speakers */ + EFAP_VERTEX_DATA *vtxData, /* i/o: Vertex data structure */ + EFAP_POLYSET_DATA *polyData, /* o : Polygon data structure */ + float ***dmTranspose, /* o : Transpose of the downmix matrix */ + int16_t *numTot, /* o : Number of speakers (real + ghost) */ + const int16_t efip_flag /* i : flag to indicate whether initialization is for EFIP (used for ALLRAD) */ +) +{ + int16_t i; + void **p_dmTranspose; + int16_t vtxInHull[EFAP_MAX_SIZE_TMP_BUFF]; + + set_s( vtxInHull, 0, EFAP_MAX_SIZE_TMP_BUFF ); + + /* Add Imaginary Speakers */ + add_ghost_speakers( vtxData->vertexArray, &vtxData->numVtx, efip_flag ); + + /* Sort the vertices according to their index */ + if ( ( vtxData->vtxOrder = (int16_t *) malloc( vtxData->numVtx * sizeof( int16_t ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for EFAP Vertex Order\n" ) ); + } + + sort_vertices( vtxData->vertexArray, &vtxData->numVtx, vtxData->vtxOrder ); + + /* Computing the initial Polyeder */ + initial_polyeder( vtxData, polyData->triArray, &polyData->numTri, &vtxInHull[0] ); + + /* Add the vertex to the convex hull */ + for ( i = 0; i < vtxData->numVtx; ++i ) + { + add_vertex_to_convex_hull( vtxData, vtxData->vtxOrder[i], &vtxInHull[0], polyData->triArray, &polyData->numTri ); + } + + assert( polyData->numTri != 0 && "EFAP: failed to construct convex hull!" ); + + /* Allocate the DM matrix transpose */ + if ( ( p_dmTranspose = malloc( vtxData->numVtx * sizeof( float * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "EFAP: can not allocate memory for dmTranspose\n" ) ); + } + + /* Store the value of numVtx to be used for freeing later (numVtx will change after remap_ghosts() ) */ + *numTot = vtxData->numVtx; + + for ( i = 0; i < vtxData->numVtx; i++ ) + { + if ( ( p_dmTranspose[i] = malloc( numSpk * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "EFAP: can not allocate memory for dmTranspose\n" ) ); + } + } + *dmTranspose = (float **) p_dmTranspose; + + /* Remap Ghosts */ + remap_ghosts( vtxData->vertexArray, polyData->triArray, numSpk, &vtxData->numVtx, polyData->numTri, *dmTranspose ); + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------------* + * initial_polyeder() + * + * + *-------------------------------------------------------------------------*/ + +static void initial_polyeder( + EFAP_VERTEX_DATA *vtxData, /* i : Vertex data structure */ + EFAP_LS_TRIANGLE *triArray, /* o : Triangle array structure */ + int16_t *numTri, /* o : Size of triangle array */ + int16_t *vtxInHull /* o : Flag if the vertex was added to the inital simplex */ +) +{ + int16_t i; + int16_t numVtx; + int16_t tmpSurface[3]; + int16_t tetrahedron[4]; + float tmp; + float centroid[3]; + float tmpCross[3]; + float tmp1[3], tmp2[3], tmp3[3]; + + /* Safety check */ + assert( triArray != NULL && "EFAP: triArray==NULL" ); + + /* initialize variables */ + set_s( tmpSurface, -1, 3 ); + set_zero( centroid, 3 ); + set_zero( tmp1, 3 ); + set_zero( tmp2, 3 ); + set_zero( tmp3, 3 ); + set_zero( tmpCross, 3 ); + + numVtx = vtxData->numVtx; + + /* seed vertices */ + for ( i = 0; i < 4; i++ ) + { + tetrahedron[i] = i; + } + + /* 1. attempt to create an edge with nonzero length */ + while ( ( vtxData->vertexArray[tetrahedron[0]].azi == vtxData->vertexArray[tetrahedron[1]].azi ) && + ( vtxData->vertexArray[tetrahedron[0]].ele == vtxData->vertexArray[tetrahedron[1]].ele ) ) + { + tetrahedron[1]++; + assert( tetrahedron[1] < numVtx && "EFAP: convex hull construction failed, vertices are coincident!" ); + } + + /* 2. attempt to create a triangle with nonzero area */ + tmp = 0.0f; + v_sub( vtxData->vertexArray[tetrahedron[1]].pos, vtxData->vertexArray[tetrahedron[0]].pos, tmp1, 3 ); + while ( tetrahedron[2] < numVtx ) + { + v_sub( vtxData->vertexArray[tetrahedron[2]].pos, vtxData->vertexArray[tetrahedron[0]].pos, tmp2, 3 ); + efap_crossp( tmp1, tmp2, tmpCross ); + for ( i = 0; i < 3; i++ ) + { + tmp += tmpCross[i] * tmpCross[i]; + } + if ( fabsf( tmp ) > ( POLY_THRESH * POLY_THRESH ) ) /* compare tmp against POLY_THRESH^2 instead of sqrtf(tmp) */ + { + break; + } + tetrahedron[2]++; + } + assert( tetrahedron[2] < numVtx && "EFAP: convex hull construction failed, vertices are colinear!" ); + + /* 3. attempt to create a tetrahedron with nonzero volume */ + tmp = 0.0f; + while ( tetrahedron[3] < numVtx ) + { + v_sub( vtxData->vertexArray[tetrahedron[3]].pos, vtxData->vertexArray[tetrahedron[0]].pos, tmp3, 3 ); + tmp = dotp( tmp3, tmpCross, 3 ); + if ( fabsf( tmp ) > POLY_THRESH ) + { + break; + } + tetrahedron[3]++; + } + assert( tetrahedron[3] < numVtx && "EFAP: convex hull construction failed, vertices are coplanar!" ); + + /* 4. compute the centroid of the initial tetrahedron */ + for ( i = 0; i < 4; i++ ) + { + vtxInHull[tetrahedron[i]] = 1; /* set vertex as added to hull*/ + centroid[0] += vtxData->vertexArray[tetrahedron[i]].pos[0]; + centroid[1] += vtxData->vertexArray[tetrahedron[i]].pos[1]; + centroid[2] += vtxData->vertexArray[tetrahedron[i]].pos[2]; + } + + centroid[0] /= 4; + centroid[1] /= 4; + centroid[2] /= 4; + + /* 5. create and orient planes */ + tmpSurface[0] = tetrahedron[0]; + tmpSurface[1] = tetrahedron[1]; + tmpSurface[2] = tetrahedron[2]; + flip_plane( vtxData->vertexArray, tmpSurface, centroid ); + mvs2s( tmpSurface, triArray[0].LS, 3 ); + + tmpSurface[0] = tetrahedron[0]; + tmpSurface[1] = tetrahedron[1]; + tmpSurface[2] = tetrahedron[3]; + flip_plane( vtxData->vertexArray, tmpSurface, centroid ); + mvs2s( tmpSurface, triArray[1].LS, 3 ); + + tmpSurface[0] = tetrahedron[0]; + tmpSurface[1] = tetrahedron[2]; + tmpSurface[2] = tetrahedron[3]; + flip_plane( vtxData->vertexArray, tmpSurface, centroid ); + mvs2s( tmpSurface, triArray[2].LS, 3 ); + + tmpSurface[0] = tetrahedron[1]; + tmpSurface[1] = tetrahedron[2]; + tmpSurface[2] = tetrahedron[3]; + flip_plane( vtxData->vertexArray, tmpSurface, centroid ); + mvs2s( tmpSurface, triArray[3].LS, 3 ); + + /* set numTri */ + *numTri = 4; + + return; +} + + +/*-------------------------------------------------------------------------* + * add_ghost_speakers() + * + * + *-------------------------------------------------------------------------*/ + +static void add_ghost_speakers( + EFAP_VERTEX *vertexArray, /* i/o: Vertex array */ + int16_t *numVtx, /* i/o: Size of vertex array */ + const int16_t efip_flag /* i : flag to indicate whether initialization is for EFIP (used for ALLRAD) */ +) +{ + int16_t numVertex; + int16_t lengthVertGhst; /* Nb of vertical ghost added */ + int16_t lengthHorGhst; /* Nb of Horizontal Ghost */ + int16_t i, j, k, a; /* Integer for loops */ + int16_t num_new; /* Number of new vertices to add */ + float maxAngle; /* Max azimuth tolerance for extend the LS setup horizontaly */ + float newDiff; /* Angle differences that will help us set the extended LS setup */ + float newAzi; /* New azimuth for the new horizontal LS */ + float ele[EFAP_MAX_SIZE_TMP_BUFF]; + float tmpEle; + float tmpAzi[EFAP_MAX_SIZE_TMP_BUFF]; + float tmpAngleDiff[EFAP_MAX_SIZE_TMP_BUFF]; /* tmp array of angles differences */ + float sectors[EFAP_MAX_SIZE_TMP_BUFF]; /* Help us determine the zone where we should extend LS */ + EFAP_VTX_DMX_TYPE vtxDmxType; + + vtxDmxType = EFAP_DMX_INTENSITY; + numVertex = *numVtx; + maxAngle = 1.f / 160.0f; + + /* Extracting Azi and Ele for computation purposes */ + for ( i = 0; i < numVertex; ++i ) + { + ele[i] = vertexArray[i].ele; + } + + /* ADD VOG IF NECESSERAY (i.e. if the elevation of the highest LS is < 90 deg) */ + a = 0; + maximum( ele, numVertex, &tmpEle ); + + lengthVertGhst = 0; + if ( tmpEle < 90.0f ) + { + if ( efip_flag ) + { + if ( tmpEle > 45.0f ) + { + vtxDmxType = EFAP_DMX_NONE; + } + else + { + vtxDmxType = EFAP_DMX_AMPLITUDE; + } + } + + add_vertex( vertexArray, 0, 90, numVertex + a, vtxDmxType ); + + ++lengthVertGhst; + ++a; + } + + /* ADD VOH IF NECESSERAY (i.e. if the elevation of the lowest LS is > -90 deg) */ + minimum( ele, numVertex, &tmpEle ); + if ( tmpEle > -90.0f ) + { + if ( efip_flag ) + { + if ( tmpEle < -45.0f ) + { + vtxDmxType = EFAP_DMX_NONE; + } + else + { + vtxDmxType = EFAP_DMX_AMPLITUDE; + } + } + + add_vertex( vertexArray, 0, -90, numVertex + a, vtxDmxType ); + + ++lengthVertGhst; + ++a; + } + + /* LIST ALL SURROUNDING loudspeakers */ + k = 0; + + for ( i = 0; i < numVertex; ++i ) + { + if ( fabsf( vertexArray[i].ele ) < 45.0f ) + { + tmpAzi[k] = vertexArray[i].azi; + ++k; + } + } + + lengthHorGhst = 0; + if ( k == 0 ) /* no speakers found: add a triangle of ghost speakers */ + { + add_vertex( vertexArray, 0, 0, numVertex + a, EFAP_DMX_INTENSITY ); + add_vertex( vertexArray, 120, 0, numVertex + a + 1, EFAP_DMX_INTENSITY ); + add_vertex( vertexArray, 240, 0, numVertex + a + 2, EFAP_DMX_INTENSITY ); + a += 3; + lengthHorGhst += 3; + } + else if ( k == 1 ) /* only one speaker found: add two ghost speakers to complete a triangle */ + { + add_vertex( vertexArray, tmpAzi[0] + 120, 0, numVertex + a, EFAP_DMX_INTENSITY ); + add_vertex( vertexArray, tmpAzi[0] + 240, 0, numVertex + a + 1, EFAP_DMX_INTENSITY ); + a += 2; + lengthHorGhst += 2; + } + else /* fill gaps greater than maxAngle */ + { + /* Here, k correspond to the number of LS whose ele is < 45 deg, should be = numVertex */ + v_sort( tmpAzi, 0, k - 1 ); + + /* The next lines correspond to angle_diff = [azi(2:end), azi(1) + 360] - azi; in Matlab */ + for ( i = 0; i < k - 1; ++i ) + { + tmpAngleDiff[i] = tmpAzi[i + 1] - tmpAzi[i]; + sectors[i] = ceilf( tmpAngleDiff[i] * maxAngle ); + + if ( sectors[i] > 1 ) + { + ++lengthHorGhst; + } + } + tmpAngleDiff[k - 1] = tmpAzi[0] + 360 - tmpAzi[k - 1]; + + sectors[k - 1] = ceilf( tmpAngleDiff[k - 1] * maxAngle ); + + if ( sectors[k - 1] > 1 ) + { + ++lengthHorGhst; + } + + /* Adding new virtual speakers */ + for ( i = 0; i < k; ++i ) + { + if ( sectors[i] > 1 ) + { + newDiff = tmpAngleDiff[i] / sectors[i]; + num_new = (int16_t) ( sectors[i] - 1.0f ); + + for ( j = 0; j < num_new; ++j ) + { + newAzi = tmpAzi[i] + ( j + 1 ) * newDiff; + + add_vertex( vertexArray, newAzi, 0, numVertex + a, EFAP_DMX_INTENSITY ); + ++a; + + if ( j > 0 ) + { + ++lengthHorGhst; + } + } + } + } + } + *numVtx = numVertex + lengthHorGhst + lengthVertGhst; + + return; +} + + +/*-------------------------------------------------------------------------* + * sort_vertices() + * + * + *-------------------------------------------------------------------------*/ + +static void sort_vertices( + const EFAP_VERTEX *vertexArray, /* i : Vertex array */ + const int16_t *numVtx, /* i : Size of vertex array */ + int16_t *order /* o : Original index positions */ +) +{ + int16_t tmpIdx[EFAP_MAX_SIZE_TMP_BUFF]; + int16_t i; + + /* Initializing tmpIdx */ + for ( i = 0; i < *numVtx; ++i ) + { + tmpIdx[i] = vertexArray[i].idx; + } + + /* Sorting indexes */ + efap_sort_s( tmpIdx, order, *numVtx ); + + return; +} + + +/*-------------------------------------------------------------------------* + * add_vertex_to_convex_hull() + * + * + *-------------------------------------------------------------------------*/ + +static void add_vertex_to_convex_hull( + const EFAP_VERTEX_DATA *vtxData, /* i : Vertex data structure */ + const int16_t vtxIdx, /* i : Vertex to be added to the hull */ + int16_t *vtxInHull, /* i/o: Array indicating whether the vertex is part of the hull */ + EFAP_LS_TRIANGLE *triArray, /* i/o: Triangle array */ + int16_t *szTri /* i/o: Size of Triangle array */ +) +{ + int16_t i, k, l; + int16_t visible[EFAP_MAX_SIZE_TMP_BUFF]; + int16_t edges[EFAP_MAX_SIZE_TMP_BUFF]; + int16_t numEdges[1]; + int16_t surface[3]; + float numHullVtx; + float centroid[3]; + const float threshold = -1e-6f; + float tmpDist; + EFAP_LS_TRIANGLE triArrayNew[EFAP_MAX_POLY_SET]; + + /* If the vertex is already part of the hull, nothing must be done */ + if ( vtxInHull[vtxIdx] ) + { + return; + } + + /* Compute the centroid of the current convex hull */ + numHullVtx = 0; + set_zero( centroid, 3 ); + for ( i = 0; i < vtxData->numVtx; i++ ) + { + if ( vtxInHull[i] ) + { + numHullVtx++; + centroid[0] += vtxData->vertexArray[i].pos[0]; + centroid[1] += vtxData->vertexArray[i].pos[1]; + centroid[2] += vtxData->vertexArray[i].pos[2]; + } + } + numHullVtx = 1.0f / numHullVtx; + + centroid[0] *= numHullVtx; + centroid[1] *= numHullVtx; + centroid[2] *= numHullVtx; + + /* Processing */ + k = 0; + l = 0; + + for ( i = 0; i < *szTri; ++i ) + { + tmpDist = vertex_distance( vtxData->vertexArray, triArray[i], vtxIdx ); + + if ( tmpDist > threshold ) + { + visible[k] = i; + ++k; + } + else + { + mvs2s( triArray[i].LS, triArrayNew[l].LS, 3 ); + ++l; + } + } + + visible_edges( triArray, visible, k, numEdges, edges ); + + for ( i = 0; i < numEdges[0]; i += 2 ) + { + surface[0] = edges[i]; + surface[1] = edges[i + 1]; + surface[2] = vtxIdx; + flip_plane( vtxData->vertexArray, surface, centroid ); + + mvs2s( surface, triArrayNew[l].LS, 3 ); + ++l; + } + + /* Outputs */ + for ( i = 0; i < l; i++ ) + { + mvs2s( triArrayNew[i].LS, triArray[i].LS, 3 ); + } + *szTri = l; + + /* Flag the vertex as added to the hull */ + vtxInHull[vtxIdx] = 1; + return; +} + + +/*-------------------------------------------------------------------------* + * visible_edges() + * + * + *-------------------------------------------------------------------------*/ + +static void visible_edges( + const EFAP_LS_TRIANGLE *triArray, /* i : Triangle array */ + const int16_t *visible, /* i : Visible surface flag */ + const int16_t numSurface, /* i : Number of surfaces */ + int16_t *numEdges, /* i/o: Number of edges */ + int16_t *edges /* i/o: Array of edges */ +) +{ + int16_t maxVertex; + int16_t i, j, k; + int16_t a, b; + int16_t tmpSurface[4]; + int16_t counter[EFAP_MAX_SIZE_TMP_BUFF][EFAP_MAX_SIZE_TMP_BUFF]; + int16_t counterTranspose[EFAP_MAX_SIZE_TMP_BUFF][EFAP_MAX_SIZE_TMP_BUFF]; + float tmpMax[EFAP_MAX_SIZE_TMP_BUFF]; + + /* Set counter and counterTranspose to 0 */ + for ( i = 0; i < EFAP_MAX_SIZE_TMP_BUFF; i++ ) + { + set_s( counter[i], 0, EFAP_MAX_SIZE_TMP_BUFF ); + set_s( counterTranspose[i], 0, EFAP_MAX_SIZE_TMP_BUFF ); + } + + /* Finding the max vertex */ + for ( i = 0; i < numSurface; ++i ) + { + tmpMax[i] = (float) triArray[visible[i]].LS[0]; + for ( j = 1; j < 3; ++j ) + { + if ( tmpMax[i] < triArray[visible[i]].LS[j] ) + { + tmpMax[i] = (float) triArray[visible[i]].LS[j]; + } + } + } + maxVertex = (int16_t) tmpMax[maximum( tmpMax, numSurface, NULL )]; + + for ( i = 0; i < numSurface; ++i ) + { + tmpSurface[0] = triArray[visible[i]].LS[0]; + tmpSurface[1] = triArray[visible[i]].LS[1]; + tmpSurface[2] = triArray[visible[i]].LS[2]; + tmpSurface[3] = triArray[visible[i]].LS[0]; + + for ( j = 0; j < 3; ++j ) + { + a = tmpSurface[j]; + b = tmpSurface[j + 1]; + counter[a][b] = counter[a][b] + 1; + counterTranspose[b][a] = counter[a][b]; + } + } + + for ( i = 0; i < maxVertex + 1; ++i ) + { + for ( j = 0; j < maxVertex + 1; ++j ) + { + counter[i][j] = counterTranspose[i][j] + counterTranspose[j][i]; + } + } + + /* Finding the edges */ + k = 0; + + for ( a = 0; a < maxVertex; ++a ) + { + for ( b = a + 1; b < maxVertex + 1; ++b ) + { + if ( counter[a][b] == 1 ) + { + edges[k] = a; + edges[k + 1] = b; + k += 2; + } + } + } + + /* Outputs */ + *numEdges = k; + + return; +} + + +/*-------------------------------------------------------------------------* + * flip_plane() + * + * + *-------------------------------------------------------------------------*/ + +static void flip_plane( + const EFAP_VERTEX *vtxArray, /* i : Vertex array */ + int16_t *surface, /* i/o: Surface/vertices to be flipped */ + const float centroid[3] /* i : Centroid of convex hull from which to orient the planes outward */ +) +{ + int16_t tmp; + float dist; + + dist = point_plane_distance( + vtxArray[surface[0]].pos, + vtxArray[surface[1]].pos, + vtxArray[surface[2]].pos, + centroid ); + + if ( dist > 0 ) + { + /*efap_flipLeftRight( surface, 3 );*/ + tmp = surface[0]; + surface[0] = surface[2]; + surface[2] = tmp; + } + + return; +} + + +/*-------------------------------------------------------------------------* + * remap_ghosts() + * + * + *-------------------------------------------------------------------------*/ + +static void remap_ghosts( + EFAP_VERTEX *vtxArray, /* i/o: Vertex array */ + EFAP_LS_TRIANGLE *triArray, /* i/o: Triangle array */ + int16_t numSpk, /* i : Number of speakers */ + int16_t *numVertex, /* i/o: Size of vertex array */ + int16_t numTri, /* i : Size of triangle array */ + float **downmixMatrixTranspose /* o : Transpose of downmix matrix */ +) +{ + int16_t numGhst = 0; + int16_t numVtx = *numVertex; + int16_t numTot; + int16_t g; + int16_t i, j; + int16_t tmpL; + float inv_tmpL; + int16_t posFound[2]; + int16_t neighbours[EFAP_MAX_SIZE_TMP_BUFF]; + float tmpVec[EFAP_MAX_SIZE_TMP_BUFF]; + float tmpVec2[EFAP_MAX_SIZE_TMP_BUFF]; + float tmpMat[EFAP_MAX_SIZE_TMP_BUFF][EFAP_MAX_SIZE_TMP_BUFF]; + float tmpNewMat[EFAP_MAX_SIZE_TMP_BUFF][EFAP_MAX_SIZE_TMP_BUFF]; + float tmpDist; + const float thresh = 1e-4f; + + set_f( tmpVec, 0.0f, EFAP_MAX_SIZE_TMP_BUFF ); + set_f( tmpVec2, 0.0f, EFAP_MAX_SIZE_TMP_BUFF ); + + /* Finding unused ghosts (i.e. ghost speakers that aren't used for triangulation */ + for ( g = numVtx - 1; g > numSpk - 1; --g ) + { + /* find(triangle_mat == ghost, 1, 'first') */ + if ( find_int_in_tri( triArray, g, numTri, posFound ) == 0 ) + { + remove_vertex( vtxArray, g, numVtx ); + --numVtx; + for ( i = 0; i < numTri; ++i ) + { + for ( j = 0; j < 3; ++j ) + { + if ( triArray[i].LS[j] > g ) + { + triArray[i].LS[j] = g - 1; + } + } + } + } + else + { + ++numGhst; + } + } + + /* Final number of LS (real + ghosts) */ + numTot = numSpk + numGhst; + + /* Initializing tmpMat as the identity matrix */ + for ( i = 0; i < numTot; ++i ) + { + set_f( tmpMat[i], 0.0f, numTot ); + set_f( tmpNewMat[i], 0.0f, numTot ); + + tmpMat[i][i] = 1; + tmpNewMat[i][i] = 1; + } + + /* Generate initial sound energy distribution matrix */ + for ( i = numSpk; i < numTot; ++i ) + { + tmpL = get_neighbours( triArray, i, numTri, neighbours ); + + /* Initializing the column to 0 */ + for ( j = 0; j < numTot; ++j ) + { + tmpMat[j][i] = 0; + tmpNewMat[j][i] = 0; + } + + /* The neighbours are set to 1.0/tmpL */ + inv_tmpL = 1.f / tmpL; + for ( j = 0; j < tmpL; ++j ) + { + tmpMat[neighbours[j]][i] = inv_tmpL; + tmpNewMat[neighbours[j]][i] = inv_tmpL; + } + } + + /* Redistributing sound energy */ + for ( i = 0; i < numTot; ++i ) + { + for ( j = 0; j < numTot; ++j ) + { + tmpNewMat[i][j] = tmpMat[j][i]; + } + } + + for ( i = numSpk; i < numTot; ++i ) + { + mvr2r( tmpNewMat[i], tmpVec, numTot ); + + tmpDist = sum_f( &tmpVec[numSpk], numTot - numSpk ); + + while ( tmpDist > thresh ) + { + matrix_times_row( tmpMat, tmpVec, numTot, tmpVec2 ); + mvr2r( tmpVec2, tmpVec, numTot ); + set_zero( tmpVec2, numTot ); + tmpDist = sum_f( &tmpVec[numSpk], numTot - numSpk ); + } + mvr2r( tmpVec, tmpNewMat[i], numTot ); + } + + for ( i = 0; i < numSpk; ++i ) + { + /* Applying a sqrt(2) coeff and obtaining the dmMatrix*/ + for ( j = 0; j < numSpk; ++j ) + { + downmixMatrixTranspose[j][i] = sqrtf( tmpNewMat[j][i] ); + } + /* Downmix ghost loudspeakers according to dmxType */ + for ( ; j < numTot; ++j ) + { + switch ( vtxArray[j].dmxType ) + { + case EFAP_DMX_NONE: + downmixMatrixTranspose[j][i] = 0.f; + break; + case EFAP_DMX_AMPLITUDE: + downmixMatrixTranspose[j][i] = tmpNewMat[j][i]; + break; + case EFAP_DMX_INTENSITY: + default: + downmixMatrixTranspose[j][i] = sqrtf( tmpNewMat[j][i] ); + break; + } + } + } + + /* Output */ + *numVertex = numTot; + + return; +} + + +/*-------------------------------------------------------------------------* + * vertex_init() + * + * Initialize the vertex structures + *-------------------------------------------------------------------------*/ + +static void vertex_init( + const float *aziSpk, /* i : Azimuths of the LS setup */ + const float *eleSpk, /* i : Elevations of the LS setup */ + EFAP_VERTEX_DATA *efapVtxData /* i/o: Vertex data structure that will be updated */ +) +{ + int16_t i; + + /* Main Processing */ + for ( i = 0; i < efapVtxData->numVtx; i++ ) + { + add_vertex( efapVtxData->vertexArray, aziSpk[i], eleSpk[i], i, EFAP_DMX_INTENSITY ); + } + + return; +} + + +/*-------------------------------------------------------------------------* + * efap_panning() + * + * Compute the gain without applying the downmix Matrix and the norm of the array + *-------------------------------------------------------------------------*/ + +static void efap_panning( + const float azi, /* i : Value of the azimuth */ + const float ele, /* i : Value of the elevation */ + const EFAP_POLYSET_DATA *polyData, /* i : Polygon data */ + float *bufferL /* o : 1D array of length numSpk that will contain the tmp values */ +) +{ + int16_t i; + int16_t polyIdx; + int16_t numChan; + int16_t chan[EFAP_MAX_CHAN_NUM]; + float aziPoly[EFAP_MAX_CHAN_NUM]; + float elePoly[EFAP_MAX_CHAN_NUM]; + float tmpBuff[EFAP_MAX_CHAN_NUM]; + float normTmpBuff; + float P[2]; + + P[0] = azi; + P[1] = ele; + + /* Finding in which polygon the point is */ + + polyIdx = get_poly_num( P, polyData ); + + assert( polyIdx != -1 && "EFAP: polygon not found!" ); + + /* Extracting the chan, the azimuth and the ele of the considered poly */ + numChan = polyData->polysetArray[polyIdx].numChan; + + for ( i = 0; i < numChan; ++i ) + { + chan[i] = polyData->polysetArray[polyIdx].chan[i]; + aziPoly[i] = polyData->polysetArray[polyIdx].polyAzi[i]; + + if ( polyData->polysetArray[polyIdx].isNaN[i] == 1 ) + { + aziPoly[i] = P[0]; + } + + elePoly[i] = polyData->polysetArray[polyIdx].polyEle[i]; + } + + /* Computing the gain for the polygon */ + get_poly_gains( P[0], P[1], aziPoly, elePoly, numChan, tmpBuff ); + + /* Computing the norm of the tmp buffer */ + normTmpBuff = dotp( tmpBuff, tmpBuff, numChan ); + normTmpBuff = sqrtf( normTmpBuff ); + + /* Updating the buffer structure */ + normTmpBuff = 1.f / normTmpBuff; + for ( i = 0; i < numChan; ++i ) + { + bufferL[chan[i]] = tmpBuff[i] * normTmpBuff; + } + + return; +} + + +/*-------------------------------------------------------------------------* + * get_poly_gains() + * + * Compute the gain for a precise polygon + *-------------------------------------------------------------------------*/ + +static void get_poly_gains( + const float azi, /* i : Value of the azimuth */ + const float ele, /* i : Value of the elevation */ + const float aziPoly[EFAP_MAX_CHAN_NUM], /* i : Azimuths of the considered polygons */ + const float elePoly[EFAP_MAX_CHAN_NUM], /* i : Elevations of the considered polygons */ + const int16_t numChan, /* i : Length of aziPoly & elePoly */ + float *buffer /* o : 1D array of length numSpk that will contain the tmp values */ +) +{ + int16_t i, j; + int16_t idx1, idx2; + float P[2]; + float A[2], B[2], C[2]; + float P_minus_A[2]; + + P[0] = azi; + P[1] = ele; + + /* Processing, we search for the triangle in which belong P, then we compute the gain */ + for ( i = 1; i < numChan + 1; ++i ) + { + A[0] = aziPoly[i - 1]; + A[1] = elePoly[i - 1]; + + v_sub( P, A, P_minus_A, 2 ); /* Precalculate value of (P-A) */ + + for ( j = i; j < numChan - 2 + i; ++j ) + { + idx1 = 1 + ( j % numChan ); + idx2 = 1 + ( idx1 % numChan ); + + B[0] = aziPoly[idx1 - 1]; + B[1] = elePoly[idx1 - 1]; + + C[0] = aziPoly[idx2 - 1]; + C[1] = elePoly[idx2 - 1]; + + if ( in_tri( A, B, C, P_minus_A ) ) + { + buffer[i - 1] = get_tri_gain( A, B, C, P_minus_A ); + break; + } + } + } + + return; +} + + +/*-------------------------------------------------------------------------* + * get_tri_gain() + * + * Compute the value of the gain for a given triangle + *-------------------------------------------------------------------------*/ + +static float get_tri_gain( + const float A[2], /* i : Coordinate of one apex of the triangle */ + const float B[2], /* i : Coordinate of one apex of the triangle */ + const float C[2], /* i : Coordinate of one apex of the triangle */ + const float P_minus_A[2] /* i : Value of (P - A) */ +) +{ + float N[2], tmpN[2]; + float tmpSub1[2]; + float tmpDot1, tmpDot2; + float gain; + + /* Processing */ + tmpN[0] = B[1] - C[1]; + tmpN[1] = C[0] - B[0]; + + v_sub( B, A, tmpSub1, 2 ); + + tmpDot1 = dotp( tmpN, tmpSub1, 2 ); + + v_multc( tmpN, 1 / tmpDot1, N, 2 ); + + tmpDot2 = dotp( P_minus_A, N, 2 ); + + gain = 1 - tmpDot2; + /* Set gains <= -60dB to 0 to avoid problems in SVD */ + if ( fabsf( gain ) < 1e-6 ) + { + gain = 0.0f; + } + return gain; +} + + +/*-------------------------------------------------------------------------* + * add_vertex() + * + * Add a vertex to the vertex array + *-------------------------------------------------------------------------*/ + +static void add_vertex( + EFAP_VERTEX *vtxArray, /* i/o: Handle to the vertex array that will be updated */ + const float azi, /* i : Azimuth of the vertex */ + const float ele, /* i : Elevation of the vertex */ + const int16_t pos, /* i : Index in the vtxArray where we want to add the vertex */ + const EFAP_VTX_DMX_TYPE dmxType /* i : downmix type for the vertex */ +) +{ + float idxAziTmp, idxEleTmp; + float tmp; + + assert( vtxArray != NULL && "EFAP: vtxArray == NULL" ); + + /* Updating the vertex array */ + + tmp = efap_fmodf( 180.0f - azi, 360.0f ); + vtxArray[pos].azi = 180.0f - tmp; + + tmp = ( ( 180.0f < ele ) ? 180.0f : ele ); + vtxArray[pos].ele = ( ( -180.0f > tmp ) ? -180.0f : tmp ); + + /* Converting spherical coordinates to cartesians, assuming radius = 1 */ + sph2cart( vtxArray[pos].azi, vtxArray[pos].ele, &vtxArray[pos].pos[0] ); + + /* Computing the index defined by idx = idxAziTmp + 181 * idxEleTmp */ + + /* IdxAziTmp */ + tmp = fabsf( 90.0f - fabsf( vtxArray[pos].azi ) ); + idxAziTmp = (float) anint( tmp ); + + /* IdxEleTmp */ + tmp = fabsf( vtxArray[pos].ele ); + idxEleTmp = (float) anint( tmp ); + idxEleTmp = 90.0f - idxEleTmp; + + /* Final Idx */ + vtxArray[pos].idx = (int16_t) idxAziTmp + 181 * (int16_t) idxEleTmp; + + /* Setting the nan flag to 0 */ + vtxArray[pos].isNaN = 0; + + /* Set the default downmix type */ + vtxArray[pos].dmxType = dmxType; + + return; +} + + +/*-------------------------------------------------------------------------* + * efap_sort_s() + * + * Sort an integer array + * (modified version of sort() to return an index array) + *-------------------------------------------------------------------------*/ + +static void efap_sort_s( + int16_t *x, /* i/o: Vector to be sorted */ + int16_t *idx, /* o : Original index positions */ + const int16_t len /* i : vector length */ +) +{ + int16_t i, j; + int16_t tempr, tempi; + + for ( i = 0; i < len; i++ ) + { + idx[i] = i; + } + + for ( i = len - 2; i >= 0; i-- ) + { + tempr = x[i]; + tempi = idx[i]; + for ( j = i + 1; ( j < len ) && ( tempr > x[j] ); j++ ) + { + x[j - 1] = x[j]; + idx[j - 1] = idx[j]; + } + x[j - 1] = tempr; + idx[j - 1] = tempi; + } + + return; +} + + +/*-------------------------------------------------------------------------* + * vertex_distance() + * + * Compute the signed distance between a vertex and a hull surface + *-------------------------------------------------------------------------*/ + +static float vertex_distance( + const EFAP_VERTEX *vtxArray, /* i : The considered vertex */ + const EFAP_LS_TRIANGLE tri, /* i : The considered triangle */ + const int16_t vtxIdx /* i : Index of the considered vertex */ +) +{ + float A[3], B[3], C[3], P[3]; + int16_t i; + + /* Assigning the coordinates to the vector */ + for ( i = 0; i < 3; ++i ) + { + A[i] = vtxArray[tri.LS[0]].pos[i]; + B[i] = vtxArray[tri.LS[1]].pos[i]; + C[i] = vtxArray[tri.LS[2]].pos[i]; + + P[i] = vtxArray[vtxIdx].pos[i]; + } + + return point_plane_distance( A, B, C, P ); +} + +/*-------------------------------------------------------------------------* + * point_poly_distance() + * + * Compute the signed distance between a point and polygon + *-------------------------------------------------------------------------*/ + +static float point_poly_distance( + const EFAP_POLYSET poly, /* i : The polygon which forms a plane */ + const float X[3] /* i : Cartesian coordinates of the point of interest */ +) +{ + float P1[3], P2[3], P3[3]; + + sph2cart( poly.polyAzi[0], poly.polyEle[0], &P1[0] ); + sph2cart( poly.polyAzi[1], poly.polyEle[1], &P2[0] ); + sph2cart( poly.polyAzi[2], poly.polyEle[2], &P3[0] ); + + return point_plane_distance( P1, P2, P3, X ); +} + +/*-------------------------------------------------------------------------* + * point_plane_distance() + * + * Compute the signed distance between a point and a given plane + *-------------------------------------------------------------------------*/ + +static float point_plane_distance( + const float P1[3], /* i : First point of the triangle that defines the planes */ + const float P2[3], /* i : Second point of the triangle */ + const float P3[3], /* i : Third point of the triangle */ + const float X[3] /* i : The point of interest */ +) +{ + float tmpCross1[3], tmpCross2[3]; + float resultCross[3]; + float tmpDot1[3], tmpDot2[3]; + float tmpNorm; + float dist; + + /* Check if the point already matches a triangle vertex */ + if ( ( X[0] == P1[0] && X[1] == P1[1] && X[2] == P1[2] ) || + ( X[0] == P2[0] && X[1] == P2[1] && X[2] == P2[2] ) || + ( X[0] == P3[0] && X[1] == P3[1] && X[2] == P3[2] ) ) + { + return 0.0f; + } + + /* Cross Product */ + v_sub( P1, P2, tmpCross1, 3 ); + v_sub( P1, P3, tmpCross2, 3 ); + + /* resultCross = cross(P1-P2,P1-P3) */ + efap_crossp( tmpCross1, tmpCross2, resultCross ); + + /* Dot Product */ + tmpNorm = dotp( resultCross, resultCross, 3 ); + tmpNorm = inv_sqrt( tmpNorm ); + v_sub( X, P1, tmpDot1, 3 ); + v_multc( resultCross, tmpNorm, tmpDot2, 3 ); + dist = dotp( tmpDot1, tmpDot2, 3 ); + + return dist; +} + + +/*-------------------------------------------------------------------------* + * efap_crossp() + * + * Compute the cross product between column vectors of float of size 3x1 + *-------------------------------------------------------------------------*/ + +static void efap_crossp( + const float *v1, /* i : First float vector */ + const float *v2, /* i : Second float vector */ + float *v /* o : Output vector */ +) +{ + v[0] = v1[1] * v2[2] - v1[2] * v2[1]; + v[1] = v1[2] * v2[0] - v1[0] * v2[2]; + v[2] = v1[0] * v2[1] - v1[1] * v2[0]; + + return; +} + + +/*-------------------------------------------------------------------------* + * find_int_in_tri() + * + * Find an integer in triangle array of integers + *-------------------------------------------------------------------------*/ + +static int16_t find_int_in_tri( + const EFAP_LS_TRIANGLE *tri, /* i : Triangle array */ + const int16_t n, /* i : The integer to find */ + const int16_t r, /* i : Number of rows */ + int16_t *pos /* o : Position of the integer */ +) +{ + int16_t i, j; + + /* Find the first element equal to n */ + for ( i = 0; i < r; ++i ) + { + for ( j = 0; j < 3; ++j ) + { + if ( tri[i].LS[j] == n ) + { + pos[0] = i; + pos[1] = j; + return 1; + } + } + } + + return 0; +} + + +/*-------------------------------------------------------------------------* + * remove_vertex() + * + * Remove a vertex from a vertex structure + *-------------------------------------------------------------------------*/ + +static void remove_vertex( + EFAP_VERTEX *vtxArray, /* i : Vertex array */ + const int16_t idx, /* i : Index of the vertex to remove */ + const int16_t L /* i : Length of the Vertex array */ +) +{ + int16_t i; + + assert( idx < L && "EFAP: index out of bounds" ); + + /* Shift all vertex of one position, so vtxArray[i] will be vtxArray[i+1] and so on */ + for ( i = idx; i < L - 1; ++i ) + { + add_vertex( vtxArray, vtxArray[i + 1].azi, vtxArray[i + 1].ele, i, EFAP_DMX_INTENSITY ); + } + + /* The last vertex is set to 0 */ + add_vertex( vtxArray, 0, 0, L - 1, EFAP_DMX_INTENSITY ); + + return; +} + + +/*-------------------------------------------------------------------------* + * get_neighbours() + * + * Returns the neighbouring triangles of a vertex + *-------------------------------------------------------------------------*/ + +static int16_t get_neighbours( + const EFAP_LS_TRIANGLE *triArray, /* i : Triangle array */ + const int16_t vtxIdx, /* i : Index of the vertex */ + const int16_t numTri, /* i : Number of Triangles */ + int16_t *neighbours /* o : Output vector */ +) +{ + int16_t i, j, k; + int16_t tmpPos[2]; + int16_t tmpNeighbours[EFAP_MAX_SIZE_TMP_BUFF]; + int16_t dummy[EFAP_MAX_SIZE_TMP_BUFF]; + EFAP_LS_TRIANGLE tmpTriArray[EFAP_MAX_POLY_SET]; + + /* Processing */ + for ( i = 0; i < numTri; ++i ) + { + mvs2s( triArray[i].LS, tmpTriArray[i].LS, 3 ); + } + + k = 0; + while ( 1 ) + { + if ( find_int_in_tri( tmpTriArray, vtxIdx, numTri, tmpPos ) == 0 ) + { + break; + } + else + { + tmpNeighbours[k] = tmpTriArray[tmpPos[0]].LS[0]; + tmpNeighbours[k + 1] = tmpTriArray[tmpPos[0]].LS[1]; + tmpNeighbours[k + 2] = tmpTriArray[tmpPos[0]].LS[2]; + k += 3; + tmpTriArray[tmpPos[0]].LS[tmpPos[1]] = -1; + } + + if ( k > 3 * numTri ) + { + break; + } + } + + /* Sorting the neighbours vector */ + efap_sort_s( tmpNeighbours, dummy, k ); + + /* Creating the output vector, by eliminating redundancies and also deleting the indice == vtxIdx*/ + neighbours[0] = tmpNeighbours[0]; + j = 1; + + for ( i = 1; i < k; ++i ) + { + if ( ( tmpNeighbours[i] != tmpNeighbours[i - 1] ) && + ( tmpNeighbours[i] != vtxIdx ) ) + { + neighbours[j] = tmpNeighbours[i]; + ++j; + } + } + + /* Output, length of neighbours */ + return j; +} + + +/*-------------------------------------------------------------------------* + * matrix_times_row() + * + * Computes the product of a matrix and a row vector + *-------------------------------------------------------------------------*/ + +static void matrix_times_row( + float mat[EFAP_MAX_SIZE_TMP_BUFF][EFAP_MAX_SIZE_TMP_BUFF], /* i : The input matrix */ + const float *vec, /* i : The input row vector */ + const int16_t L, /* i : Row length */ + float *out /* o : Output vector */ +) +{ + int16_t i, j; + + for ( i = 0; i < L; ++i ) + { + for ( j = 0; j < L; ++j ) + { + out[i] += mat[i][j] * vec[j]; + } + } + + return; +} + + +/*-------------------------------------------------------------------------* + * tri_to_poly() + * + * Combines triangles of a surface in order to create polygons + *-------------------------------------------------------------------------*/ + +static void tri_to_poly( + const EFAP_VERTEX *vtxArray, /* i : Vertex array */ + const EFAP_LS_TRIANGLE *triArray, /* i : Triangle array */ + const int16_t numVtx, /* i : Number of vertices */ + const int16_t numTri, /* i : Number of triangles */ + int16_t sortedChan[EFAP_MAX_POLY_SET][EFAP_MAX_CHAN_NUM], /* o : The matrix that will contain the sorted channels */ + int16_t *outLengthPS, /* o : The length of the sorted channels */ + int16_t outLengthSorted[EFAP_MAX_POLY_SET] /* o : The number of channels for each poly (i.e. outLengthSorted[i] = length(sortedChan[i]) */ +) +{ + int16_t i, j; + int16_t lenPoly; + int16_t lenPolySet; + int16_t found; + int16_t replaceIdx; + + int16_t poly[EFAP_MAX_CHAN_NUM]; + + int16_t sortedLengths[EFAP_MAX_POLY_SET]; + int16_t sortedTri[EFAP_MAX_POLY_SET]; + + float dist; + + lenPolySet = 0; + /* Sorting the polygons */ + for ( i = 0; i < numTri; ++i ) + { + /* search for coplanar vertices and add them to the polygon */ + lenPoly = 0; + for ( j = 0; j < numVtx; ++j ) + { + dist = fabsf( point_plane_distance( + vtxArray[triArray[i].LS[0]].pos, + vtxArray[triArray[i].LS[1]].pos, + vtxArray[triArray[i].LS[2]].pos, + vtxArray[j].pos ) ); + + if ( dist < 1e-3f ) + { + assert( lenPoly < EFAP_MAX_CHAN_NUM && "EFAP: exceeded max polygon vertices!" ); + poly[lenPoly] = j; + ++lenPoly; + } + } + + /* search existing polygons to determine whether the new one already exists/is a subset or is a superset */ + found = 0; + replaceIdx = -1; + for ( j = 0; j < lenPolySet; ++j ) + { + found = compare_poly( sortedChan[j], sortedLengths[j], poly, lenPoly ); + + if ( found > 0 ) + { + break; + } + else if ( found < 0 ) + { + replaceIdx = j; + } + } + + if ( found == 0 ) + { + /* append new poly */ + mvs2s( poly, sortedChan[lenPolySet], lenPoly ); + sortedTri[lenPolySet] = i; + sortedLengths[lenPolySet] = lenPoly; + ++lenPolySet; + } + else if ( found == -1 ) + { + /* replace with superset */ + mvs2s( poly, sortedChan[replaceIdx], lenPoly ); + sortedTri[replaceIdx] = i; + sortedLengths[replaceIdx] = lenPoly; + } + } + + /* Sorting the vertex */ + for ( i = 0; i < lenPolySet; ++i ) + { + sort_channels_vertex( vtxArray, triArray, sortedChan[i], sortedLengths[i], sortedTri[i] ); + } + + /* Output */ + *outLengthPS = lenPolySet; + mvs2s( sortedLengths, outLengthSorted, EFAP_MAX_POLY_SET ); + + return; +} + + +/*-------------------------------------------------------------------------* + * compare_poly() + * + * Compares a newly created polygon with an existing one + *-------------------------------------------------------------------------*/ + +static int16_t compare_poly( + int16_t *old, /* i : Existing polygon */ + int16_t lenOld, /* i : Length of existing polygon */ + int16_t *new, /* i : New polygon */ + int16_t lenNew /* i : Length of new polygon */ +) +{ + int16_t i, j; + int16_t count; + + count = 0; + + for ( i = 0; i < lenOld; ++i ) + { + for ( j = count; j < lenNew; ++j ) + { + if ( old[i] == new[j] ) + { + ++count; + break; + } + } + } + + if ( count == lenOld && lenOld < lenNew ) + { + /* new polygon is a superset */ + return -1; + } + else if ( count == lenNew && lenOld >= lenNew ) + { + /* found as subset or identical */ + return 1; + } + else + { + /* not found */ + return 0; + } +} + + +/*-------------------------------------------------------------------------* + * sort_channels_vertex() + * + * Sort the channels of a polygon set according to the vertex azimuth + *-------------------------------------------------------------------------*/ + +static void sort_channels_vertex( + const EFAP_VERTEX *vtxArray, /* i : Vertex array */ + const EFAP_LS_TRIANGLE *triArray, /* i : Triangle array */ + int16_t channels[EFAP_MAX_CHAN_NUM], /* o : Channels array to be modified */ + const int16_t lengthChannels, /* i : Length of the channels array */ + int16_t idxTri /* i : Index of the considered triangle */ +) +{ + int16_t i, j; + + float P1[3], P2[3], P3[3]; + float tmpU[3]; + float U[3], V[3]; + float tmpV1[3], tmpV2[3], tmpV3[3]; + float normU, normV; + float MC[3]; + float tmpP[3], P[3]; + + float x, y; + + float azi[EFAP_MAX_CHAN_NUM]; + int16_t order[EFAP_MAX_CHAN_NUM]; + + int16_t newChannels[EFAP_MAX_CHAN_NUM]; + + + /* Initializing coordinates with the vertices of the considered triangle */ + for ( i = 0; i < 3; ++i ) + { + P1[i] = vtxArray[triArray[idxTri].LS[0]].pos[i]; + P2[i] = vtxArray[triArray[idxTri].LS[1]].pos[i]; + P3[i] = vtxArray[triArray[idxTri].LS[2]].pos[i]; + } + + /* First Base Vector */ + v_sub( P2, P1, tmpU, 3 ); + normU = sqrtf( dotp( tmpU, tmpU, 3 ) ); + v_multc( tmpU, 1 / normU, U, 3 ); + + /* Second Base Vector */ + v_sub( P3, P2, tmpV1, 3 ); + v_multc( U, dotp( U, tmpV1, 3 ), tmpV2, 3 ); + + v_sub( tmpV1, tmpV2, tmpV3, 3 ); + normV = sqrtf( dotp( tmpV3, tmpV3, 3 ) ); + + v_multc( tmpV3, 1 / normV, V, 3 ); + + /* Center of the first Triangle */ + for ( i = 0; i < 3; ++i ) + { + MC[i] = ( P1[i] + P2[i] + P3[i] ) / 3; + } + + /* Sort Vertices */ + for ( i = 0; i < lengthChannels; ++i ) + { + for ( j = 0; j < 3; ++j ) + { + tmpP[j] = vtxArray[channels[i]].pos[j]; + } + + v_sub( tmpP, MC, P, 3 ); + + x = dotp( P, U, 3 ); + y = dotp( P, V, 3 ); + + azi[i] = atan2f( y, x ); + } + + /* Sorting the azi vec */ + v_sort_ind( azi, order, lengthChannels ); + + /* Updating the channel array */ + for ( i = 0; i < lengthChannels; ++i ) + { + newChannels[i] = channels[order[i]]; + } + + /* return Success */ + mvs2s( newChannels, channels, lengthChannels ); + + return; +} + + +/*-------------------------------------------------------------------------* + * efap_fmodf() + * + * Modulus operation that will handle negative values the same way as matlab + *-------------------------------------------------------------------------*/ + +static float efap_fmodf( + const float x, /* i : Dividend */ + const float y /* i : Divisor */ +) +{ + float result = fmodf( x, y ); + return result >= 0 ? result : result + y; +} + + +/*-------------------------------------------------------------------------* + * get_poly_num() + * + * Returns the index of the polygon in which the coordinate is + *-------------------------------------------------------------------------*/ + +static int16_t get_poly_num( + const float P[2], /* i : Azimuth and elevation of the point */ + const EFAP_POLYSET_DATA *polyData /* i : Polyset struct */ +) +{ + int16_t i; + int16_t num_poly, found_poly; + int16_t poly_tmp[EFAP_MAX_CHAN_NUM]; + float poly_dist[EFAP_MAX_CHAN_NUM]; + + float dist_tmp; + float pos[3]; + + num_poly = 0; + + sph2cart( P[0], P[1], &pos[0] ); + + /* Filter the polygon list with a fast 2d check */ + for ( i = 0; i < polyData->numPoly; ++i ) + { + if ( in_poly( P, polyData->polysetArray[i] ) ) + { + /* select only polygons which are visible from the point */ + dist_tmp = point_poly_distance( polyData->polysetArray[i], pos ); + if ( dist_tmp == 0 ) + { + return i; + } + else if ( dist_tmp > 0 ) + { + poly_tmp[num_poly] = i; + poly_dist[num_poly] = dist_tmp; + num_poly++; + } + } + } + if ( num_poly == 0 ) + { + return -1; + } + + /* select the polygon with the smallest distance */ + found_poly = poly_tmp[0]; + dist_tmp = poly_dist[0]; + for ( i = 1; i < num_poly; i++ ) + { + if ( poly_dist[i] < dist_tmp ) + { + found_poly = poly_tmp[i]; + dist_tmp = poly_dist[i]; + } + } + + return found_poly; +} + + +/*-------------------------------------------------------------------------* + * in_poly() + * + * Determines if a given point is within a polygon or not + *-------------------------------------------------------------------------*/ + +static int16_t in_poly( + const float P[2], /* i : Azimuth and elevation of the point */ + const EFAP_POLYSET poly /* i : Polyset struct */ +) +{ + int16_t n; + int16_t numVertices = poly.numChan; + float A[2]; + float B[2]; + float C[2]; + float P_minus_A[2]; + + /* Safety check */ + + if ( numVertices < 3 ) + { + return 0; + } + + /* See if the point is in one of the triangles available in the polygon */ + + if ( poly.isNaN[0] ) + { + A[0] = P[0]; + } + else + { + A[0] = poly.polyAzi[0]; + } + A[1] = poly.polyEle[0]; + + v_sub( P, A, P_minus_A, 2 ); /* Precalculate value of (P-A) */ + + for ( n = 1; n < numVertices - 1; ++n ) + { + if ( poly.isNaN[n] ) + { + B[0] = P[0]; + } + else + { + B[0] = poly.polyAzi[n]; + } + B[1] = poly.polyEle[n]; + + if ( poly.isNaN[n + 1] ) + { + C[0] = P[0]; + } + else + { + C[0] = poly.polyAzi[n + 1]; + } + C[1] = poly.polyEle[n + 1]; + + if ( in_tri( A, B, C, P_minus_A ) ) + { + return 1; + } + } + + return 0; +} + + +/*-------------------------------------------------------------------------* + * in_tri() + * + * Determines if a given point is within a triangle or not + *-------------------------------------------------------------------------*/ + +static int16_t in_tri( + float A[2], /* i : Coordinate of one apex of the triangle */ + float B[2], /* i : Coordinate of one apex of the triangle */ + float C[2], /* i : Coordinate of one apex of the triangle */ + float P_minus_A[2] /* i : Value of (P - A) */ +) +{ + float tmpDot1[2], tmpDot2[2]; + float matInv[2][2]; + float invFactor; + float S[2]; + float thresh = 1e-6f; + + /* + Not a Valid Triangle : Colinear edges + In the matlab implementation, the rcond() function is used + Since it's very complex to implement this in C + I'll just compute the determinant and if it's equal to 0, that means the two vectors are colinear + */ + + v_sub( B, A, tmpDot1, 2 ); + v_sub( C, A, tmpDot2, 2 ); + + /* Verification of the non-colinearity */ + invFactor = tmpDot1[0] * tmpDot2[1] - tmpDot1[1] * tmpDot2[0]; + + if ( fabsf( invFactor ) < thresh ) + { + return 0; + } + + invFactor = 1.f / invFactor; + matInv[0][0] = tmpDot2[1] * invFactor; + matInv[0][1] = -tmpDot2[0] * invFactor; + matInv[1][0] = -tmpDot1[1] * invFactor; + matInv[1][1] = tmpDot1[0] * invFactor; + + /* Computing S = matInv*(P-A) */ + S[0] = ( matInv[0][0] * P_minus_A[0] ) + ( matInv[0][1] * P_minus_A[1] ); + S[1] = ( matInv[1][0] * P_minus_A[0] ) + ( matInv[1][1] * P_minus_A[1] ); + + /* Checking if we are in the triangle; For the theory, check Christian Borss article, section 3.2 */ + if ( S[0] < -thresh || S[1] < -thresh || S[0] + S[1] > 1 + thresh ) + { + return 0; + } + else + { + return 1; + } +} + +/*-------------------------------------------------------------------------* + * sph2cart() + * + * Converts a vertex position to cartesian coordinates + *-------------------------------------------------------------------------*/ + +static void sph2cart( + const float azi, /* i : Azimuth in degrees */ + const float ele, /* i : Elevation in degrees */ + float *pos /* o : Cartesian coordinates vector (x, y, z) */ +) +{ + pos[0] = cosf( azi * PI_OVER_180 ) * cosf( ele * PI_OVER_180 ); + pos[1] = sinf( azi * PI_OVER_180 ) * cosf( ele * PI_OVER_180 ); + pos[2] = sinf( ele * PI_OVER_180 ); + + return; +} diff --git a/lib_rend/ivas_hrtf.c b/lib_rend/ivas_hrtf.c new file mode 100644 index 0000000000000000000000000000000000000000..3394e018b7a88685c789deb42ea2afa69238a9e5 --- /dev/null +++ b/lib_rend/ivas_hrtf.c @@ -0,0 +1,208 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "prot.h" +#include "ivas_prot_rend.h" +#include "ivas_error.h" +#include "wmc_auto.h" +#include "ivas_prot.h" + +/*-----------------------------------------------------------------------* + * ivas_HRTF_binary_open() + * + * Allocate HRTF binary handle + *-----------------------------------------------------------------------*/ + +ivas_error ivas_HRTF_binary_open( + TDREND_HRFILT_FiltSet_t **hHrtfTD ) +{ + /* Allocate HR filter set for headphones configuration */ + *hHrtfTD = (TDREND_HRFILT_FiltSet_t *) malloc( sizeof( TDREND_HRFILT_FiltSet_t ) ); + if ( *hHrtfTD == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HRTF binary!" ); + } + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * ivas_HRTF_binary_close() + * + * Close HRTF binary handle + *-------------------------------------------------------------------*/ + +void ivas_HRTF_binary_close( + TDREND_HRFILT_FiltSet_t **hHrtfTD ) +{ + if ( hHrtfTD == NULL || *hHrtfTD == NULL ) + { + return; + } + + free( *hHrtfTD ); + *hHrtfTD = NULL; + + return; +} + + +/*-----------------------------------------------------------------------* + * ivas_HRTF_CRend_binary_open() + * + * Allocate HRTF binary handle + *-----------------------------------------------------------------------*/ + +ivas_error ivas_HRTF_CRend_binary_open( + HRTFS_CREND **hSetOfHRTF ) +{ + /* Allocate HR filter set for headphones configuration */ + *hSetOfHRTF = (HRTFS_CREND *) malloc( sizeof( HRTFS_CREND ) ); + if ( *hSetOfHRTF == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for set of HRTF binary!" ); + } + + ( *hSetOfHRTF )->hHRTF_hrir_combined = NULL; + ( *hSetOfHRTF )->hHRTF_hrir_hoa3 = NULL; + ( *hSetOfHRTF )->hHRTF_hrir_hoa2 = NULL; + ( *hSetOfHRTF )->hHRTF_hrir_foa = NULL; + ( *hSetOfHRTF )->hHRTF_brir_combined = NULL; + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * ivas_HRTF_CRend_binary_close() + * + * Close HRTF CRend binary handle + *-------------------------------------------------------------------*/ + +void ivas_HRTF_CRend_binary_close( + HRTFS_CREND **hSetOfHRTF ) +{ + if ( hSetOfHRTF == NULL || *hSetOfHRTF == NULL ) + { + return; + } + + free( *hSetOfHRTF ); + *hSetOfHRTF = NULL; + + return; +} + + +/*-----------------------------------------------------------------------* + * ivas_HRTF_fastconv_binary_open() + * + * Allocate HRTF binary handle for FASTCONV renderer + *-----------------------------------------------------------------------*/ + +ivas_error ivas_HRTF_fastconv_binary_open( + HRTFS_FASTCONV **hHrtfFastConv ) +{ + *hHrtfFastConv = (HRTFS_FASTCONV *) malloc( sizeof( HRTFS_FASTCONV ) ); + if ( *hHrtfFastConv == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for FASTCONV HRTF tables!" ); + } + + ivas_init_binaural_hrtf( *hHrtfFastConv ); + + return IVAS_ERR_OK; +} + + +/*-----------------------------------------------------------------------* + * ivas_HRTF_fastconv_binary_close() + * + * Close HRTF binary handle for FASTCONV renderer + *-----------------------------------------------------------------------*/ + +void ivas_HRTF_fastconv_binary_close( + HRTFS_FASTCONV **hHrtfFastConv ) +{ + if ( hHrtfFastConv == NULL || *hHrtfFastConv == NULL ) + { + return; + } + + free( *hHrtfFastConv ); + *hHrtfFastConv = NULL; + + return; +} + + +/*-----------------------------------------------------------------------* + * ivas_HRTF_parambin_binary_open() + * + * Allocate HRTF binary handle for parametric binauralizer + *-----------------------------------------------------------------------*/ + +ivas_error ivas_HRTF_parambin_binary_open( + HRTFS_PARAMBIN **hHrtfParambin ) +{ + *hHrtfParambin = (HRTFS_PARAMBIN *) malloc( sizeof( HRTFS_PARAMBIN ) ); + if ( *hHrtfParambin == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for parametric binauralizer HRTF tables!" ); + } + + return IVAS_ERR_OK; +} + + +/*-----------------------------------------------------------------------* + * ivas_HRTF_parambin_binary_close() + * + * Close HRTF binary handle for parametric binauralizer + *-----------------------------------------------------------------------*/ + +void ivas_HRTF_parambin_binary_close( + HRTFS_PARAMBIN **hHrtfParambin ) +{ + if ( hHrtfParambin == NULL || *hHrtfParambin == NULL ) + { + return; + } + + free( *hHrtfParambin ); + *hHrtfParambin = NULL; + + return; +} diff --git a/lib_rend/ivas_lcld_prot.h b/lib_rend/ivas_lcld_prot.h new file mode 100644 index 0000000000000000000000000000000000000000..03fb9b06f6dad851551b81be96c46b497bebcea7 --- /dev/null +++ b/lib_rend/ivas_lcld_prot.h @@ -0,0 +1,39 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#ifndef _IVAS_LCLD_ENCODER_H_ +#define _IVAS_LCLD_ENCODER_H_ + +#include "options.h" +/* clang-format on */ + +#endif /* _LCLD_ENCODER_H_ */ diff --git a/lib_rend/ivas_limiter.c b/lib_rend/ivas_limiter.c new file mode 100644 index 0000000000000000000000000000000000000000..ae7e3afb835593f8797e9a7679fd780982ef9dd8 --- /dev/null +++ b/lib_rend/ivas_limiter.c @@ -0,0 +1,375 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include +#include "prot.h" +#include "ivas_prot_rend.h" +#include "wmc_auto.h" +#include + + +/*-------------------------------------------------------------------* + * detect_strong_saturations() + * + * Detection of very strong saturations, + * usually happens as a consequence of a heavy corrupted bitstream + *-------------------------------------------------------------------*/ + +/*! r: apply_strong_limiting flag */ +static int16_t detect_strong_saturations( + const int16_t BER_detect, /* i : BER detect flag */ + int16_t *strong_saturation_cnt, /* i/o: counter of strong saturations */ + const float max_val, /* i : maximum absolute value */ + float *frame_gain /* i/o: frame gain value */ +) +{ + int16_t apply_strong_limiting; + + apply_strong_limiting = 0; + + if ( BER_detect ) + { + *strong_saturation_cnt = 50; + apply_strong_limiting = 1; + } + else if ( max_val > 3 * IVAS_LIMITER_THRESHOLD && *strong_saturation_cnt > 0 ) + { + apply_strong_limiting = 1; + } + else if ( max_val > 10 * IVAS_LIMITER_THRESHOLD ) + { + *strong_saturation_cnt += 20; + *strong_saturation_cnt = min( *strong_saturation_cnt, 50 ); + apply_strong_limiting = 1; + } + else + { + ( *strong_saturation_cnt )--; + *strong_saturation_cnt = max( *strong_saturation_cnt, 0 ); + } + + if ( apply_strong_limiting ) + { + if ( *frame_gain < 0.3f ) + { + *frame_gain /= 3.0f; + } + else + { + apply_strong_limiting = 0; + } + } + + return apply_strong_limiting; +} + +/*-------------------------------------------------------------------* + * ivas_limiter_open() + * + * Allocate and initialize limiter struct + *-------------------------------------------------------------------*/ + +/*! r : limiter struct handle */ +ivas_error ivas_limiter_open( + IVAS_LIMITER_HANDLE *hLimiter_out, /* o : limiter struct handle */ + const int16_t max_num_channels, /* i : maximum number of I/O channels to be processed */ + const int32_t sampling_rate /* i : sampling rate for processing */ +) +{ + int16_t i; + IVAS_LIMITER_HANDLE hLimiter; + + if ( max_num_channels <= 0 || sampling_rate <= 0 ) + { + return ( IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Wrong parameters for Limiter\n" ) ); + } + + if ( ( hLimiter = malloc( sizeof( IVAS_LIMITER ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Limiter handle\n" ) ); + } + + hLimiter->max_num_channels = max_num_channels; + hLimiter->num_channels = max_num_channels; + + if ( ( hLimiter->channel_ptrs = malloc( max_num_channels * sizeof( float * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Limiter handle\n" ) ); + } + hLimiter->sampling_rate = sampling_rate; + hLimiter->gain = 1.f; + hLimiter->release_heuristic = 0.f; + hLimiter->attack_constant = powf( 0.01f, 1.0f / ( IVAS_LIMITER_ATTACK_SECONDS * sampling_rate ) ); + hLimiter->strong_saturation_count = 0; + + for ( i = 0; i < max_num_channels; ++i ) + { + hLimiter->channel_ptrs[i] = NULL; + } + + *hLimiter_out = hLimiter; + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * ivas_limiter_close() + * + * Deallocate limiter struct + *-------------------------------------------------------------------*/ + +void ivas_limiter_close( + IVAS_LIMITER_HANDLE *phLimiter /* i/o: pointer to limiter handle, can be NULL */ +) +{ + if ( phLimiter == NULL || *phLimiter == NULL ) + { + return; + } + + free( ( *phLimiter )->channel_ptrs ); + free( *phLimiter ); + *phLimiter = NULL; + + return; +} + + +/*-------------------------------------------------------------------* + * ivas_limiter_dec() + * + * In-place saturation control for multichannel buffers with adaptive + * release time and special handling of bit errors + *-------------------------------------------------------------------*/ + +void ivas_limiter_dec( + IVAS_LIMITER_HANDLE hLimiter, /* i/o: limiter struct handle */ + float *output[MAX_OUTPUT_CHANNELS], /* i/o: input/output buffer */ + const int16_t num_channels, /* i : number of channels to be processed */ + const int16_t output_frame, /* i : number of samples per channel in the buffer */ + const int16_t BER_detect /* i : BER detect flag */ +) +{ + int16_t c; + float **channels; + + /* return early if given bad parameters */ + if ( hLimiter == NULL || output == NULL || output_frame <= 0 ) + { + return; + } + + /* Update number of channels and prepare pointers to the beginning of each of them */ + assert( num_channels <= hLimiter->max_num_channels && "Number of channels must be lower than the maximum set during limiter initialization!" ); + hLimiter->num_channels = min( num_channels, hLimiter->max_num_channels ); + channels = hLimiter->channel_ptrs; + + for ( c = 0; c < num_channels; ++c ) + { + channels[c] = output[c]; + } + + limiter_process( hLimiter, output_frame, IVAS_LIMITER_THRESHOLD, BER_detect, &hLimiter->strong_saturation_count ); + + return; +} + + +/*-------------------------------------------------------------------* + * limiter_process() + * + * hLimiter->channel_ptrs must be set before calling this function. + * Consider using a wrapper function like ivas_limiter_dec() instead + * of calling this directly. + *-------------------------------------------------------------------*/ + +void limiter_process( + IVAS_LIMITER_HANDLE hLimiter, /* i/o: limiter struct handle */ + const int16_t output_frame, /* i : number of samples to be processed per channel in the I/O buffer */ + const float threshold, /* i : signal amplitude above which limiting starts to be applied */ + const int16_t BER_detect, /* i : BER detect flag */ + int16_t *strong_saturation_cnt /* i/o: counter of strong saturations (can be NULL) */ +) +{ + int16_t i, c; + float tmp, max_val; + float *sample; + float gain, frame_gain, attack_constant, release_constant; + float releaseHeuristic; + int16_t apply_limiting, apply_strong_limiting; + float **output; + int16_t num_channels; + int32_t sampling_rate; + + /* return early if given nonsensical values */ + if ( hLimiter == NULL || output_frame <= 0 ) + { + return; + } + + apply_limiting = 1; + apply_strong_limiting = 0; + + gain = hLimiter->gain; + output = hLimiter->channel_ptrs; + num_channels = hLimiter->num_channels; + sampling_rate = hLimiter->sampling_rate; + attack_constant = hLimiter->attack_constant; + + /*-----------------------------------------------------------------* + * Find highest absolute peak sample value + *-----------------------------------------------------------------*/ + + max_val = 0.f; + + for ( i = 0; i < output_frame; i++ ) + { + for ( c = 0; c < num_channels; c++ ) + { + tmp = fabsf( output[c][i] ); + if ( tmp > max_val ) + { + max_val = tmp; + } + } + } + + /* Release heuristic + * + * Value ranging from 0.f to 1.f. Increases on each frame that contains + * a sample with a value above threshold and decreases on each frame + * with all sample values below threshold. + * + * Values of 0 and 1 map to the shortest and longest release time, respectively. + * + * The goal of this heuristic is to avoid the "pumping" effect when only + * sharp transients exceed the threshold (use short release time), but also + * keep the gain curve smoother if the threshold is exceeded in many frames + * in a short span of time. + */ + releaseHeuristic = hLimiter->release_heuristic; + + if ( max_val > threshold ) + { + frame_gain = threshold / max_val; + + releaseHeuristic = min( 1.f, releaseHeuristic + ( 4.f * output_frame / sampling_rate ) ); + /* Unoptimized code for reference */ + /* releaseHeuristic = min( 1.f, releaseHeuristic + ( (float) 2.f * output_frame / sampling_rate / adaptiveReleaseWindowLengthInSeconds ) ); + * ^ + * React faster when release time should be increased + */ + } + else + { + releaseHeuristic = max( 0.f, releaseHeuristic - ( (float) output_frame / sampling_rate ) ); + /* Unoptimized code for reference */ + /* releaseHeuristic = max( 0.f, releaseHeuristic - ( (float) 0.5f * output_frame / sampling_rate / adaptiveReleaseWindowLengthInSeconds ) ); + * ^ + * React slower when release time should be decreased + */ + + /* No samples above threshold and gain from previous frame is already 1.f, + * therefore gain == 1.f for the entire frame. Skip processing. */ + if ( gain >= 1.f - EPSILON ) + { + apply_limiting = 0; + } + + /* No samples above threshold but gain from previous frame is not 1.f, + * transition to gain == 1.f */ + frame_gain = 1.f; + } + + /* Detection of very strong saturations */ + if ( strong_saturation_cnt != NULL ) + { + apply_strong_limiting = detect_strong_saturations( BER_detect, strong_saturation_cnt, max_val, &frame_gain ); + } + + /* Limit gain reduction to 20dB. Any peaks that require gain reduction + * higher than this are most likely due to bit errors during decoding */ + if ( frame_gain < 0.1f && !apply_strong_limiting ) + { + frame_gain = 0.1f; + } + + if ( apply_limiting ) + { + + /* 99% time constants of the gain curve + * + * The denominator of the second argument determines after how many + * samples the gain curve will reach 99% of its target value + */ + release_constant = powf( 0.01f, 1.0f / ( 0.005f * powf( 200.f, releaseHeuristic ) * sampling_rate ) ); + + /* Unoptimized code for reference */ + /* releaseTimeInSeconds = 0.005f * powf(200.f, releaseHeuristic); <-- Map heuristic value (0; 1) exponentially to range (0.005; 1) + * release_constant = powf( 0.01f, 1.0f / ( releaseTimeInSeconds * sampling_rate ) ); + */ + + /*-----------------------------------------------------------------* + * Apply limiting + *-----------------------------------------------------------------*/ + + for ( i = 0; i < output_frame; i++ ) + { + /* Update gain */ + if ( frame_gain < gain ) + { + gain = attack_constant * ( gain - frame_gain ) + frame_gain; + } + else + { + gain = release_constant * ( gain - frame_gain ) + frame_gain; + } + + for ( c = 0; c < num_channels; c++ ) + { + sample = &output[c][i]; + + /* Apply gain */ + *sample = gain * ( *sample ); + } + } + } + + /* Save last gain and release heuristic values for next frame */ + hLimiter->gain = gain; + hLimiter->release_heuristic = releaseHeuristic; + + return; +} diff --git a/lib_rend/ivas_masa_merge.c b/lib_rend/ivas_masa_merge.c new file mode 100644 index 0000000000000000000000000000000000000000..434dca3fbf0ac939e8b848361377220259c989c2 --- /dev/null +++ b/lib_rend/ivas_masa_merge.c @@ -0,0 +1,396 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "lib_rend.h" +#include "ivas_prot_rend.h" +#include "ivas_prot.h" +#include "ivas_cnst.h" +#include "prot.h" +#include "wmc_auto.h" + + +/*---------------------------------------------------------------------* + * Local function prototypes + *---------------------------------------------------------------------*/ + +static void copy_masa_meta_tile( MASA_DECODER_EXT_OUT_META_HANDLE outMeta, MASA_DECODER_EXT_OUT_META_HANDLE inMeta, const uint8_t sf, const uint8_t band ); + +static void full_stream_merge( MASA_DECODER_EXT_OUT_META_HANDLE outMeta, MASA_DECODER_EXT_OUT_META_HANDLE inMeta1, float inEne1[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], MASA_DECODER_EXT_OUT_META_HANDLE inMeta2, float inEne2[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS] ); + +static void diffuse_meta_merge_1x1( MASA_DECODER_EXT_OUT_META_HANDLE outMeta, MASA_DECODER_EXT_OUT_META_HANDLE inMeta, float inEne[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], MASA_DECODER_EXT_OUT_META_HANDLE inMetaISM, float inEneISM[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS] ); + + +/*---------------------------------------------------------------------* + * copy_masa_meta_tile() + * + * + *---------------------------------------------------------------------*/ + +void copy_masa_meta_tile( + MASA_DECODER_EXT_OUT_META_HANDLE outMeta, /* o : metadata to be written */ + MASA_DECODER_EXT_OUT_META_HANDLE inMeta, /* i : input metadata */ + const uint8_t sf, /* i : sub-frame index */ + const uint8_t band /* i : band index */ +) +{ + outMeta->directionIndex[0][sf][band] = inMeta->directionIndex[0][sf][band]; + outMeta->directToTotalRatio[0][sf][band] = inMeta->directToTotalRatio[0][sf][band]; + outMeta->spreadCoherence[0][sf][band] = inMeta->spreadCoherence[0][sf][band]; + + outMeta->surroundCoherence[sf][band] = inMeta->surroundCoherence[sf][band]; + outMeta->diffuseToTotalRatio[sf][band] = inMeta->diffuseToTotalRatio[sf][band]; + + if ( inMeta->descriptiveMeta.numberOfDirections == 1 ) + { + outMeta->directionIndex[1][sf][band] = inMeta->directionIndex[1][sf][band]; + outMeta->directToTotalRatio[1][sf][band] = inMeta->directToTotalRatio[1][sf][band]; + outMeta->spreadCoherence[1][sf][band] = inMeta->spreadCoherence[1][sf][band]; + } + else + { + /* make sure the output has zeroed data in the second direction */ + outMeta->directionIndex[1][sf][band] = SPH_IDX_FRONT; + outMeta->directToTotalRatio[1][sf][band] = 0u; + outMeta->spreadCoherence[1][sf][band] = 0u; + } + + return; +} + + +/*---------------------------------------------------------------------* + * copy_masa_descriptive_meta() + * + * + *---------------------------------------------------------------------*/ + +void copy_masa_descriptive_meta( + MASA_DECRIPTIVE_META *outMeta, /* o : metadata to be written */ + MASA_DECRIPTIVE_META *inMeta /* i : input metadata */ +) +{ + uint8_t char_idx; + for ( char_idx = 0; char_idx < 8; char_idx++ ) + { + outMeta->formatDescriptor[char_idx] = inMeta->formatDescriptor[char_idx]; + } + outMeta->numberOfDirections = inMeta->numberOfDirections; + outMeta->numberOfChannels = inMeta->numberOfChannels; + outMeta->sourceFormat = inMeta->sourceFormat; + outMeta->transportDefinition = inMeta->transportDefinition; + outMeta->channelAngle = inMeta->channelAngle; + outMeta->channelDistance = inMeta->channelDistance; + outMeta->channelLayout = inMeta->channelLayout; + + return; +} + + +/*---------------------------------------------------------------------* + * diffuse_meta_merge_1x1() + * + * + *---------------------------------------------------------------------*/ + +void diffuse_meta_merge_1x1( + MASA_DECODER_EXT_OUT_META_HANDLE outMeta, /* o : Merged metadata output */ + MASA_DECODER_EXT_OUT_META_HANDLE inMeta, /* i : Input metadata 1 */ + float inEne[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i : TF-energy of input 1 */ + MASA_DECODER_EXT_OUT_META_HANDLE inMetaISM, /* i : Input metadata 2 */ + float inEneISM[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS] /* i : TF-energy of input 2 */ +) +{ + int8_t sf, band; + + for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) + { + for ( band = 0; band < MASA_FREQUENCY_BANDS; band++ ) + { + float energyTimesRatio, energyTimesRatioISM, total_diff_nrg, dir_nrg_ratio, total_nrg; + float dir_ratio_ism; + + energyTimesRatio = (float) ( inMeta->directToTotalRatio[0][sf][band] ) / UINT8_MAX * inEne[sf][band]; + + total_nrg = inEne[sf][band] + inEneISM[sf][band]; + + /* target is original MASA diffuseness */ + total_diff_nrg = (float) ( inMeta->diffuseToTotalRatio[sf][band] ) / UINT8_MAX * inEne[sf][band]; + /* criterion is mean of ISM ratio and new ratio */ + dir_ratio_ism = (float) ( inMetaISM->directToTotalRatio[0][sf][band] ) / UINT8_MAX; + + energyTimesRatioISM = ( dir_ratio_ism + ( 1.0f - total_diff_nrg / ( EPSILON + total_nrg ) ) ) / 2.0f * inEneISM[sf][band]; + + if ( energyTimesRatioISM > energyTimesRatio ) + { + float new_dir_ratio, new_diff_ratio; + outMeta->directionIndex[0][sf][band] = inMetaISM->directionIndex[0][sf][band]; + outMeta->directToTotalRatio[0][sf][band] = inMetaISM->directToTotalRatio[0][sf][band]; + outMeta->spreadCoherence[0][sf][band] = inMetaISM->spreadCoherence[0][sf][band]; + + outMeta->surroundCoherence[sf][band] = inMetaISM->surroundCoherence[sf][band]; + + dir_nrg_ratio = 1.0f - total_diff_nrg / ( EPSILON + total_nrg ); /* new dir ratio */ + new_dir_ratio = min( dir_nrg_ratio, dir_ratio_ism ); /* clip with original ISM dir */ + outMeta->directToTotalRatio[0][sf][band] = (uint8_t) floorf( new_dir_ratio * UINT8_MAX ); + new_diff_ratio = 1.0f - new_dir_ratio; + outMeta->diffuseToTotalRatio[sf][band] = (uint8_t) floorf( new_diff_ratio * UINT8_MAX ); + } + else + { + /* use the plain original meta for this tile */ + outMeta->directionIndex[0][sf][band] = inMeta->directionIndex[0][sf][band]; + outMeta->directToTotalRatio[0][sf][band] = inMeta->directToTotalRatio[0][sf][band]; + outMeta->spreadCoherence[0][sf][band] = inMeta->spreadCoherence[0][sf][band]; + + outMeta->surroundCoherence[sf][band] = inMeta->surroundCoherence[sf][band]; + outMeta->diffuseToTotalRatio[sf][band] = inMeta->diffuseToTotalRatio[sf][band]; + } + outMeta->directionIndex[1][sf][band] = SPH_IDX_FRONT; + outMeta->directToTotalRatio[1][sf][band] = 0u; + outMeta->spreadCoherence[1][sf][band] = 0u; + + inEne[sf][band] += inEneISM[sf][band]; /* Update energy for subsequent mergings */ + } + } + + /* Set descriptive meta for mixed format */ + outMeta->descriptiveMeta.sourceFormat = 0u; + outMeta->descriptiveMeta.transportDefinition = 0u; + outMeta->descriptiveMeta.channelAngle = 0u; + outMeta->descriptiveMeta.channelDistance = 0u; + outMeta->descriptiveMeta.channelLayout = 0u; + outMeta->descriptiveMeta.numberOfDirections = 0u; + /* Number of transports should be set outside. */ + + return; +} + + +/*---------------------------------------------------------------------* + * full_stream_merge() + * + * + *---------------------------------------------------------------------*/ + +void full_stream_merge( + MASA_DECODER_EXT_OUT_META_HANDLE outMeta, /* o : Merged metadata output */ + MASA_DECODER_EXT_OUT_META_HANDLE inMeta1, /* i : Input metadata 1 */ + float inEne1[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i/o: TF-energy of input 1. after merge, contains the energy of the merged signal */ + MASA_DECODER_EXT_OUT_META_HANDLE inMeta2, /* i : Input metadata 2 */ + float inEne2[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS] /* i : TF-energy of input 2 */ +) +{ + float dir_nrg_1, dir_nrg_2; + uint8_t n_dirs_1, n_dirs_2; + uint8_t sf, band; + + /* full stream select based on total direct energy */ + n_dirs_1 = inMeta1->descriptiveMeta.numberOfDirections + 1u; /* to 1-based */ + n_dirs_2 = inMeta2->descriptiveMeta.numberOfDirections + 1u; + + for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) + { + for ( band = 0; band < MASA_FREQUENCY_BANDS; band++ ) + { + dir_nrg_1 = (float) ( inMeta1->directToTotalRatio[0][sf][band] ) / UINT8_MAX * inEne1[sf][band]; + dir_nrg_2 = (float) ( inMeta2->directToTotalRatio[0][sf][band] ) / UINT8_MAX * inEne2[sf][band]; + + if ( n_dirs_1 == 2 ) + { + dir_nrg_1 += (float) ( inMeta1->directToTotalRatio[1][sf][band] ) / UINT8_MAX * inEne1[sf][band]; + } + + if ( n_dirs_2 == 2 ) + { + dir_nrg_2 += (float) ( inMeta2->directToTotalRatio[1][sf][band] ) / UINT8_MAX * inEne2[sf][band]; + } + + if ( dir_nrg_1 > dir_nrg_2 ) + { + copy_masa_meta_tile( outMeta, inMeta1, sf, band ); + } + else + { + copy_masa_meta_tile( outMeta, inMeta2, sf, band ); + } + + inEne1[sf][band] += inEne2[sf][band]; /* Update energy for subsequent mergings */ + } + } + + /* Set descriptive meta for mixed format */ + outMeta->descriptiveMeta.sourceFormat = 0u; + outMeta->descriptiveMeta.transportDefinition = 0u; + outMeta->descriptiveMeta.channelAngle = 0u; + outMeta->descriptiveMeta.channelDistance = 0u; + outMeta->descriptiveMeta.channelLayout = 0u; + if ( n_dirs_1 == 2 || n_dirs_2 == 2 ) + { + outMeta->descriptiveMeta.numberOfDirections = 1u; + } + else + { + outMeta->descriptiveMeta.numberOfDirections = 0u; + } + /* Number of transports should be set outside. */ + + return; +} + + +/*---------------------------------------------------------------------* + * ivas_prerend_merge_masa_metadata() + * + * + *---------------------------------------------------------------------*/ + +void ivas_prerend_merge_masa_metadata( + MASA_DECODER_EXT_OUT_META_HANDLE outMeta, /* o : Merged metadata output */ + MASA_DECODER_EXT_OUT_META_HANDLE inMeta1, /* i : Input metadata 1 */ + IVAS_REND_AudioConfigType inType1, /* i : Type of input 1 */ + float inEne1[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i/o: TF-energy of input 1. after merge, contains the energy of the merged signal */ + MASA_DECODER_EXT_OUT_META_HANDLE inMeta2, /* i : Input metadata 2 */ + IVAS_REND_AudioConfigType inType2, /* i : Type of input 2 */ + float inEne2[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS] /* i : TF-energy of input 2 */ +) +{ + /* mixing ISMs with non-ISM use different merge */ + if ( inType1 == IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED && inType2 != IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED && ( inMeta1->descriptiveMeta.numberOfDirections == 0u && inMeta2->descriptiveMeta.numberOfDirections == 0u ) ) + { + /* meta_1 is ISM and both are 1dir */ + diffuse_meta_merge_1x1( outMeta, inMeta2, inEne2, inMeta1, inEne1 ); + } + else if ( inType2 == IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED && inType1 != IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED && ( inMeta1->descriptiveMeta.numberOfDirections == 0u && inMeta2->descriptiveMeta.numberOfDirections == 0u ) ) + { + /* meta_2 is ISM and both are 1dir */ + diffuse_meta_merge_1x1( outMeta, inMeta1, inEne1, inMeta2, inEne2 ); + } + else + { + full_stream_merge( outMeta, inMeta1, inEne1, inMeta2, inEne2 ); + } + + return; +} + + +/*---------------------------------------------------------------------* + * masaPrerendOpen() + * + * + *---------------------------------------------------------------------*/ + +ivas_error masaPrerendOpen( + MASA_PREREND_HANDLE *hMasaPrerendPtr, /* o : handle to the opened prerenderer */ + int16_t numTransports, /* i : number of transport channels */ + int32_t input_Fs /* i : signal sampling rate */ +) +{ + MASA_PREREND_HANDLE hMasaPrerend; + int16_t i; + ivas_error error; + + error = IVAS_ERR_OK; + + hMasaPrerend = (MASA_PREREND_HANDLE) malloc( sizeof( MASA_PREREND_DATA ) ); + if ( hMasaPrerend == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA prerenderer\n" ) ); + } + + hMasaPrerend->num_Cldfb_instances = numTransports; + for ( i = 0; i < hMasaPrerend->num_Cldfb_instances; i++ ) + { + if ( ( error = openCldfb( &( hMasaPrerend->cldfbAnaEnc[i] ), CLDFB_ANALYSIS, input_Fs, CLDFB_PROTOTYPE_5_00MS ) ) != IVAS_ERR_OK ) + { + return error; + } + } + for ( ; i < MASA_MAX_TRANSPORT_CHANNELS; i++ ) + { + hMasaPrerend->cldfbAnaEnc[i] = NULL; + } + + if ( ( hMasaPrerend->hMasaOut = (MASA_DECODER_EXT_OUT_META_HANDLE) malloc( sizeof( MASA_DECODER_EXT_OUT_META ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA prerenderer\n" ) ); + } + + if ( ( hMasaPrerend->sph_grid16 = (SPHERICAL_GRID_DATA *) malloc( sizeof( SPHERICAL_GRID_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA prerenderer\n" ) ); + } + generate_gridEq( hMasaPrerend->sph_grid16 ); + + if ( error == IVAS_ERR_OK ) + { + *hMasaPrerendPtr = hMasaPrerend; + } + + return error; +} + + +/*---------------------------------------------------------------------* + * masaPrerendClose() + * + * + *---------------------------------------------------------------------*/ + +void masaPrerendClose( + MASA_PREREND_HANDLE *hMasaPrerendPtr /* i/o: prerenderer handle to be closed */ +) +{ + int16_t i; + + if ( hMasaPrerendPtr == NULL || *hMasaPrerendPtr == NULL ) + { + return; + } + + for ( i = 0; i < ( *hMasaPrerendPtr )->num_Cldfb_instances; i++ ) + { + deleteCldfb( &( ( *hMasaPrerendPtr )->cldfbAnaEnc[i] ) ); + } + + free( ( *hMasaPrerendPtr )->hMasaOut ); + ( *hMasaPrerendPtr )->hMasaOut = NULL; + free( ( *hMasaPrerendPtr )->sph_grid16 ); + ( *hMasaPrerendPtr )->sph_grid16 = NULL; + + free( ( *hMasaPrerendPtr ) ); + ( *hMasaPrerendPtr ) = NULL; + + return; +} diff --git a/lib_rend/ivas_mcmasa_ana.c b/lib_rend/ivas_mcmasa_ana.c new file mode 100644 index 0000000000000000000000000000000000000000..d0dd9787d37faf58272f9cf974e1031dbdbd6d98 --- /dev/null +++ b/lib_rend/ivas_mcmasa_ana.c @@ -0,0 +1,1131 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include +#include "ivas_cnst.h" +#include "options.h" +#include "ivas_prot_rend.h" +#include "ivas_prot.h" +#include "prot.h" +#include "ivas_stat_rend.h" +#include "ivas_rom_com.h" +#include "wmc_auto.h" + + +/*------------------------------------------------------------------------- + * Local constants + *------------------------------------------------------------------------*/ + +#define NEAR_HORIZONTAL_PLANE_ELEVATION 17.5f +#define VERTICAL_ENERGY_RATIO_OFFSET 0.15f + + +/*------------------------------------------------------------------------- + * Local function prototypes + *------------------------------------------------------------------------*/ + +/* Structure for covariance matrix */ +typedef struct +{ + float xr[MCMASA_MAX_ANA_CHANS][MCMASA_MAX_ANA_CHANS]; + float xi[MCMASA_MAX_ANA_CHANS][MCMASA_MAX_ANA_CHANS]; +} CovarianceMatrix; + +void ivas_mcmasa_param_est_ana( MCMASA_ANA_HANDLE hMcMasa, float data_f[][L_FRAME48k], float elevation_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], float azimuth_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], float energyRatio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], float spreadCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], float surroundingCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], const int16_t input_frame, const int16_t nchan_inp ); + +static void ivas_mcmasa_dmx( MCMASA_ANA_HANDLE hMcMasa, float data_f[][L_FRAME48k], const int16_t input_frame, const int16_t nchan_transport, const int16_t nchan_inp ); + +static void compute_cov_mtx( float sr[MCMASA_MAX_ANA_CHANS][CLDFB_NO_CHANNELS_MAX], float si[MCMASA_MAX_ANA_CHANS][CLDFB_NO_CHANNELS_MAX], const int16_t freq, const int16_t N, CovarianceMatrix *COVls ); + +static void computeVerticalDiffuseness( float **buffer_intensity, const float *buffer_energy, const int16_t num_freq_bands, float *diffuseness ); + +static void computeEvenLayout( const float *ls_azimuth, float *ls_azimuth_even, const int16_t numChannels ); + + +/*--------------------------------------------------------------------------* + * ivas_mcmasa_ana_open() + * + * + *--------------------------------------------------------------------------*/ + +ivas_error ivas_mcmasa_ana_open( + MCMASA_ANA_HANDLE *hMcMasaPtr, /* i/o: McMASA data handle pointer */ + const AUDIO_CONFIG inConfig, /* i : Input config */ + int32_t input_Fs /* i : Sampling frequency */ +) +{ + int16_t i, j; + MCMASA_ANA_HANDLE hMcMasa; + float ls_azimuth[MCMASA_MAX_ANA_CHANS]; + float ls_elevation[MCMASA_MAX_ANA_CHANS]; + float ls_azimuth_even[MCMASA_MAX_ANA_CHANS]; + int16_t nchan_inp; + int16_t numAnalysisChannels; + float left_min, right_min, azi_diff; + int16_t maxBin, input_frame; + ivas_error error; + + error = IVAS_ERR_OK; + + if ( ( hMcMasa = (MCMASA_ANA_HANDLE) malloc( sizeof( MCMASA_ANA_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for McMasa\n" ) ); + } + + if ( inConfig == IVAS_AUDIO_CONFIG_5_1 ) + { + nchan_inp = 6; + mvr2r( ls_azimuth_CICP6, ls_azimuth, nchan_inp - 1 ); + mvr2r( ls_elevation_CICP6, ls_elevation, nchan_inp - 1 ); + hMcMasa->numHorizontalChannels = 5; + hMcMasa->isHorizontalSetup = 1; + } + else if ( inConfig == IVAS_AUDIO_CONFIG_7_1 ) + { + nchan_inp = 8; + mvr2r( ls_azimuth_CICP12, ls_azimuth, nchan_inp - 1 ); + mvr2r( ls_elevation_CICP12, ls_elevation, nchan_inp - 1 ); + hMcMasa->numHorizontalChannels = 7; + hMcMasa->isHorizontalSetup = 1; + } + else if ( inConfig == IVAS_AUDIO_CONFIG_5_1_2 ) + { + nchan_inp = 8; + mvr2r( ls_azimuth_CICP14, ls_azimuth, nchan_inp - 1 ); + mvr2r( ls_elevation_CICP14, ls_elevation, nchan_inp - 1 ); + hMcMasa->numHorizontalChannels = 5; + hMcMasa->isHorizontalSetup = 0; + } + else if ( inConfig == IVAS_AUDIO_CONFIG_5_1_4 ) + { + nchan_inp = 10; + mvr2r( ls_azimuth_CICP16, ls_azimuth, nchan_inp - 1 ); + mvr2r( ls_elevation_CICP16, ls_elevation, nchan_inp - 1 ); + hMcMasa->numHorizontalChannels = 5; + hMcMasa->isHorizontalSetup = 0; + } + else + { + nchan_inp = 12; + mvr2r( ls_azimuth_CICP19, ls_azimuth, nchan_inp - 1 ); + mvr2r( ls_elevation_CICP19, ls_elevation, nchan_inp - 1 ); + hMcMasa->numHorizontalChannels = 7; + hMcMasa->isHorizontalSetup = 0; + } + + numAnalysisChannels = nchan_inp - 1; + + /* Determine the number of bands */ + hMcMasa->nbands = MASA_FREQUENCY_BANDS; + + /* Determine band grouping */ + mvs2s( MASA_band_grouping_24, hMcMasa->band_grouping, 24 + 1 ); + + maxBin = (int16_t) ( input_Fs * INV_CLDFB_BANDWIDTH + 0.5f ); + for ( i = 1; i < hMcMasa->nbands + 1; i++ ) + { + if ( hMcMasa->band_grouping[i] >= maxBin ) + { + hMcMasa->band_grouping[i] = maxBin; + hMcMasa->nbands = i; + break; + } + } + + /* Determine block grouping */ + mvs2s( DirAC_block_grouping, hMcMasa->block_grouping, MAX_PARAM_SPATIAL_SUBFRAMES + 1 ); + + /* open/initialize CLDFB */ + hMcMasa->num_Cldfb_instances = numAnalysisChannels; + for ( i = 0; i < hMcMasa->num_Cldfb_instances; i++ ) + { + if ( ( error = openCldfb( &( hMcMasa->cldfbAnaEnc[i] ), CLDFB_ANALYSIS, input_Fs, CLDFB_PROTOTYPE_5_00MS ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* intensity 3-dim */ + for ( i = 0; i < DIRAC_NUM_DIMS; i++ ) + { + if ( ( hMcMasa->direction_vector_m[i] = (float **) malloc( MAX_PARAM_SPATIAL_SUBFRAMES * sizeof( float * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for McMasa\n" ) ); + } + + for ( j = 0; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++ ) + { + if ( ( hMcMasa->direction_vector_m[i][j] = (float *) malloc( MASA_FREQUENCY_BANDS * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for McMasa\n" ) ); + } + set_zero( hMcMasa->direction_vector_m[i][j], MASA_FREQUENCY_BANDS ); + } + } + + for ( i = 0; i < DIRAC_NUM_DIMS; i++ ) + { + for ( j = 0; j < DIRAC_NO_COL_AVG_DIFF; j++ ) + { + if ( ( hMcMasa->buffer_intensity_real[i][j] = (float *) malloc( MASA_FREQUENCY_BANDS * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for McMasa\n" ) ); + } + set_zero( hMcMasa->buffer_intensity_real[i][j], MASA_FREQUENCY_BANDS ); + } + } + + for ( j = 0; j < DIRAC_NO_COL_AVG_DIFF; j++ ) + { + if ( ( hMcMasa->buffer_intensity_real_vert[j] = (float *) malloc( MASA_FREQUENCY_BANDS * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for McMasa\n" ) ); + } + set_zero( hMcMasa->buffer_intensity_real_vert[j], MASA_FREQUENCY_BANDS ); + } + + set_zero( hMcMasa->buffer_energy, DIRAC_NO_COL_AVG_DIFF * MASA_FREQUENCY_BANDS ); + + computeEvenLayout( ls_azimuth, ls_azimuth_even, hMcMasa->numHorizontalChannels ); + + if ( !hMcMasa->isHorizontalSetup ) + { + computeEvenLayout( &ls_azimuth[hMcMasa->numHorizontalChannels], &ls_azimuth_even[hMcMasa->numHorizontalChannels], numAnalysisChannels - hMcMasa->numHorizontalChannels ); + } + + for ( i = 0; i < numAnalysisChannels; i++ ) + { + hMcMasa->chnlToFoaMtx[0][i] = 1.0f; + hMcMasa->chnlToFoaMtx[1][i] = sinf( ls_azimuth[i] * PI_OVER_180 ) * cosf( ls_elevation[i] * PI_OVER_180 ); + hMcMasa->chnlToFoaMtx[2][i] = sinf( ls_elevation[i] * PI_OVER_180 ); + hMcMasa->chnlToFoaMtx[3][i] = cosf( ls_azimuth[i] * PI_OVER_180 ) * cosf( ls_elevation[i] * PI_OVER_180 ); + + hMcMasa->chnlToFoaEvenMtx[0][i] = 1.0f; + hMcMasa->chnlToFoaEvenMtx[1][i] = sinf( ls_azimuth_even[i] * PI_OVER_180 ); + hMcMasa->chnlToFoaEvenMtx[2][i] = 0.0f; + hMcMasa->chnlToFoaEvenMtx[3][i] = cosf( ls_azimuth_even[i] * PI_OVER_180 ); + } + + mvr2r( ls_azimuth, hMcMasa->ls_azimuth, numAnalysisChannels ); + + for ( i = 0; i < hMcMasa->numHorizontalChannels; i++ ) + { + left_min = 360.0f; + right_min = -360.0f; + + for ( j = 0; j < hMcMasa->numHorizontalChannels; j++ ) + { + azi_diff = ls_azimuth[j] - ls_azimuth[i]; + + if ( azi_diff > 180.0f ) + { + azi_diff -= 360.0f; + } + else if ( azi_diff < -180.0f ) + { + azi_diff += 360.0f; + } + + if ( azi_diff < left_min && azi_diff > 0.0f ) + { + hMcMasa->leftNearest[i] = j; + left_min = azi_diff; + } + + if ( azi_diff > right_min && azi_diff < 0.0f ) + { + hMcMasa->rightNearest[i] = j; + right_min = azi_diff; + } + } + } + + hMcMasa->prevMultiChEne = 0.0f; + hMcMasa->prevDownmixEne = 0.0f; + hMcMasa->prevEQ = 1.0f; + input_frame = (int16_t) ( input_Fs / FRAMES_PER_SEC ); + for ( i = 0; i < input_frame; i++ ) + { + hMcMasa->interpolator[i] = ( (float) i ) / ( (float) input_frame ); + } + + hMcMasa->index_buffer_intensity = 0; + + if ( ( hMcMasa->hMasaOut = (MASA_DECODER_EXT_OUT_META_HANDLE) malloc( sizeof( MASA_DECODER_EXT_OUT_META ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA decoder\n" ) ); + } + + if ( ( hMcMasa->sph_grid16 = (SPHERICAL_GRID_DATA *) malloc( sizeof( SPHERICAL_GRID_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA decoder\n" ) ); + } + generate_gridEq( hMcMasa->sph_grid16 ); + + ( *hMcMasaPtr ) = hMcMasa; + + return error; +} + + +/*--------------------------------------------------------------------------* + * ivas_mcmasa_ana_close() + * + * + *--------------------------------------------------------------------------*/ + +void ivas_mcmasa_ana_close( + MCMASA_ANA_HANDLE *hMcMasa /* i/o: analysis McMASA handle */ +) +{ + int16_t i, j; + + if ( hMcMasa == NULL || *hMcMasa == NULL ) + { + return; + } + + for ( i = 0; i < ( *hMcMasa )->num_Cldfb_instances; i++ ) + { + deleteCldfb( &( ( *hMcMasa )->cldfbAnaEnc[i] ) ); + } + + /* intensity 3-dim */ + for ( i = 0; i < DIRAC_NUM_DIMS; i++ ) + { + for ( j = 0; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++ ) + { + free( ( *hMcMasa )->direction_vector_m[i][j] ); + ( *hMcMasa )->direction_vector_m[i][j] = NULL; + } + + for ( j = 0; j < DIRAC_NO_COL_AVG_DIFF; j++ ) + { + free( ( *hMcMasa )->buffer_intensity_real[i][j] ); + ( *hMcMasa )->buffer_intensity_real[i][j] = NULL; + } + + free( ( *hMcMasa )->direction_vector_m[i] ); + ( *hMcMasa )->direction_vector_m[i] = NULL; + } + + for ( j = 0; j < DIRAC_NO_COL_AVG_DIFF; j++ ) + { + free( ( *hMcMasa )->buffer_intensity_real_vert[j] ); + ( *hMcMasa )->buffer_intensity_real_vert[j] = NULL; + } + + free( ( *hMcMasa )->hMasaOut ); + ( *hMcMasa )->hMasaOut = NULL; + free( ( *hMcMasa )->sph_grid16 ); + ( *hMcMasa )->sph_grid16 = NULL; + + free( ( *hMcMasa ) ); + ( *hMcMasa ) = NULL; + + return; +} + + +/*--------------------------------------------------------------------------* + * ivas_mcmasa_ana() + * + * Multichannel MASA analysis + *--------------------------------------------------------------------------*/ + +void ivas_mcmasa_ana( + MCMASA_ANA_HANDLE hMcMasa, /* i/o: McMASA encoder handle */ + float data_f[][L_FRAME48k], /* i/o: Input / transport audio signals */ + const int16_t input_frame, /* i : Input frame size */ + const int16_t nchan_transport, /* i : Number of transport channels */ + const int16_t nchan_inp /* i : Number of input channels */ +) +{ + int16_t i; + float elevation_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + float azimuth_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + float energyRatio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + float spreadCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + float surroundingCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + + + /* Sum center and LFE, move surround channels */ + v_add( data_f[2], data_f[3], data_f[2], input_frame ); + for ( i = 4; i < nchan_inp; i++ ) + { + mvr2r( data_f[i], data_f[i - 1], input_frame ); + } + + /* Analysis */ + ivas_mcmasa_param_est_ana( hMcMasa, data_f, elevation_m_values, azimuth_m_values, energyRatio, spreadCoherence, surroundingCoherence, input_frame, nchan_inp ); + + /* Create MASA metadata buffer from the estimated values */ + ivas_create_masa_out_meta( hMcMasa->hMasaOut, hMcMasa->sph_grid16, nchan_transport, elevation_m_values, azimuth_m_values, energyRatio, spreadCoherence, surroundingCoherence ); + + /* Downmix */ + ivas_mcmasa_dmx( hMcMasa, data_f, input_frame, nchan_transport, nchan_inp ); + + return; +} + + +/*--------------------------------------------------------------------------* + * Local functions + *--------------------------------------------------------------------------*/ + +/* Estimate metadata parameters for McMASA */ +void ivas_mcmasa_param_est_ana( + MCMASA_ANA_HANDLE hMcMasa, /* i : McMASA analyzer structure */ + float data_f[][L_FRAME48k], /* i : Audio frame in MC-format */ + float elevation_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* o : Estimated elevation */ + float azimuth_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* o : Estimated azimuth */ + float energyRatio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* o : Estimated direct-to-total ratio */ + float spreadCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* o : Estimated spread coherence */ + float surroundingCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* o : Estimated surround coherence */ + const int16_t input_frame, /* i : Input frame size */ + const int16_t nchan_inp /* i : Number of input channels */ +) +{ + float reference_power[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + int16_t ts, i, j, d; + int16_t num_freq_bins, num_freq_bands, index; + float dir_v[DIRAC_NUM_DIMS]; + int16_t l_ts; + float Chnl_RealBuffer[MCMASA_MAX_ANA_CHANS][CLDFB_NO_CHANNELS_MAX]; + float Chnl_ImagBuffer[MCMASA_MAX_ANA_CHANS][CLDFB_NO_CHANNELS_MAX]; + float Foa_RealBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX]; + float Foa_ImagBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX]; + float FoaEven_RealBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX]; + float FoaEven_ImagBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX]; + float intensity_real[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS]; + float intensity_even_real[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS]; + float direction_vector[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS]; + float diffuseness_vector[MASA_FREQUENCY_BANDS]; + float vertical_diffuseness_vector[MASA_FREQUENCY_BANDS]; + float diffuseness_m[MASA_FREQUENCY_BANDS]; + float coherentEnergyRatio[MASA_FREQUENCY_BANDS]; + int16_t band_m_idx, block_m_idx; + float renormalization_factor_diff[MASA_FREQUENCY_BANDS]; + float norm_tmp; + int16_t mrange[2], brange[2]; + CovarianceMatrix COVls[MASA_FREQUENCY_BANDS]; + float absCOVls[MCMASA_MAX_ANA_CHANS][MCMASA_MAX_ANA_CHANS]; + float lsEnergy[MCMASA_MAX_ANA_CHANS]; + float lsEnergySum, maxEne; + int16_t loudestCh; + float surrCoh, tempCoh, tempCoh2; + int16_t i1, i2, i3; + float angleDist, minAngleDist; + float currentAzi; + float lsEnergyRelation; + float tempLsEnergyRelation; + float stereoness, cohwideness, spreadCoh; + float stereoRatio, cohPanRatio; + float stereoCoh, cohPanCoh, cohRatio; + int16_t numAnalysisChannels; + + num_freq_bins = hMcMasa->cldfbAnaEnc[0]->no_channels; + num_freq_bands = hMcMasa->nbands; + l_ts = input_frame / CLDFB_NO_COL_MAX; + numAnalysisChannels = nchan_inp - 1; + + /* do processing over all CLDFB time slots */ + for ( block_m_idx = 0; block_m_idx < MAX_PARAM_SPATIAL_SUBFRAMES; block_m_idx++ ) + { + mrange[0] = hMcMasa->block_grouping[block_m_idx]; + mrange[1] = hMcMasa->block_grouping[block_m_idx + 1]; + + for ( band_m_idx = 0; band_m_idx < hMcMasa->nbands; band_m_idx++ ) + { + hMcMasa->direction_vector_m[0][block_m_idx][band_m_idx] = 0; + hMcMasa->direction_vector_m[1][block_m_idx][band_m_idx] = 0; + hMcMasa->direction_vector_m[2][block_m_idx][band_m_idx] = 0; + } + + /* Need to initialize renormalization_factors, and variables to be normalized */ + set_zero( renormalization_factor_diff, hMcMasa->nbands ); + set_zero( diffuseness_m, hMcMasa->nbands ); + set_zero( hMcMasa->energy[block_m_idx], MASA_FREQUENCY_BANDS ); + + /* Reset variable */ + for ( i = 0; i < hMcMasa->nbands; i++ ) + { + for ( j = 0; j < numAnalysisChannels; j++ ) + { + set_zero( COVls[i].xr[j], numAnalysisChannels ); + set_zero( COVls[i].xi[j], numAnalysisChannels ); + } + } + + for ( ts = mrange[0]; ts < mrange[1]; ts++ ) + { + for ( i = 0; i < numAnalysisChannels; i++ ) + { + cldfbAnalysis_ts( &( data_f[i][l_ts * ts] ), Chnl_RealBuffer[i], Chnl_ImagBuffer[i], l_ts, hMcMasa->cldfbAnaEnc[i] ); + } + + /* Compute channel-based energy for metadata processing */ + for ( band_m_idx = 0; band_m_idx < num_freq_bands; band_m_idx++ ) + { + brange[0] = hMcMasa->band_grouping[band_m_idx]; + brange[1] = hMcMasa->band_grouping[band_m_idx + 1]; + for ( j = brange[0]; j < brange[1]; j++ ) + { + for ( i = 0; i < numAnalysisChannels; i++ ) + { + hMcMasa->energy[block_m_idx][band_m_idx] += Chnl_RealBuffer[i][j] * Chnl_RealBuffer[i][j] + Chnl_ImagBuffer[i][j] * Chnl_ImagBuffer[i][j]; + } + } + } + + /* Compute covariance matrix */ + for ( i = 0; i < num_freq_bands; i++ ) + { + brange[0] = hMcMasa->band_grouping[i]; + brange[1] = hMcMasa->band_grouping[i + 1]; + for ( j = brange[0]; j < brange[1]; j++ ) + { + compute_cov_mtx( Chnl_RealBuffer, Chnl_ImagBuffer, j, numAnalysisChannels, &( COVls[i] ) ); + } + } + + /* Compute standard FOA */ + /* W */ + v_add( Chnl_RealBuffer[0], Chnl_RealBuffer[1], Foa_RealBuffer[0], num_freq_bins ); + v_add( Chnl_ImagBuffer[0], Chnl_ImagBuffer[1], Foa_ImagBuffer[0], num_freq_bins ); + for ( i = 2; i < numAnalysisChannels; i++ ) + { + v_add( Chnl_RealBuffer[i], Foa_RealBuffer[0], Foa_RealBuffer[0], num_freq_bins ); + v_add( Chnl_ImagBuffer[i], Foa_ImagBuffer[0], Foa_ImagBuffer[0], num_freq_bins ); + } + + /* Y */ + v_multc( Chnl_RealBuffer[0], hMcMasa->chnlToFoaMtx[1][0], Foa_RealBuffer[1], num_freq_bins ); + v_multc( Chnl_ImagBuffer[0], hMcMasa->chnlToFoaMtx[1][0], Foa_ImagBuffer[1], num_freq_bins ); + for ( i = 1; i < numAnalysisChannels; i++ ) + { + v_multc_acc( Chnl_RealBuffer[i], hMcMasa->chnlToFoaMtx[1][i], Foa_RealBuffer[1], num_freq_bins ); + v_multc_acc( Chnl_ImagBuffer[i], hMcMasa->chnlToFoaMtx[1][i], Foa_ImagBuffer[1], num_freq_bins ); + } + + /* Z */ + if ( hMcMasa->isHorizontalSetup ) + { + /* Set zero for horizontal setups */ + set_zero( Foa_RealBuffer[2], num_freq_bins ); + set_zero( Foa_ImagBuffer[2], num_freq_bins ); + } + else + { + v_multc( Chnl_RealBuffer[0], hMcMasa->chnlToFoaMtx[2][0], Foa_RealBuffer[2], num_freq_bins ); + v_multc( Chnl_ImagBuffer[0], hMcMasa->chnlToFoaMtx[2][0], Foa_ImagBuffer[2], num_freq_bins ); + for ( i = 1; i < numAnalysisChannels; i++ ) + { + v_multc_acc( Chnl_RealBuffer[i], hMcMasa->chnlToFoaMtx[2][i], Foa_RealBuffer[2], num_freq_bins ); + v_multc_acc( Chnl_ImagBuffer[i], hMcMasa->chnlToFoaMtx[2][i], Foa_ImagBuffer[2], num_freq_bins ); + } + } + + /* X */ + v_multc( Chnl_RealBuffer[0], hMcMasa->chnlToFoaMtx[3][0], Foa_RealBuffer[3], num_freq_bins ); + v_multc( Chnl_ImagBuffer[0], hMcMasa->chnlToFoaMtx[3][0], Foa_ImagBuffer[3], num_freq_bins ); + for ( i = 1; i < numAnalysisChannels; i++ ) + { + v_multc_acc( Chnl_RealBuffer[i], hMcMasa->chnlToFoaMtx[3][i], Foa_RealBuffer[3], num_freq_bins ); + v_multc_acc( Chnl_ImagBuffer[i], hMcMasa->chnlToFoaMtx[3][i], Foa_ImagBuffer[3], num_freq_bins ); + } + + /* Compute even FOA */ + /* W */ + mvr2r( Foa_RealBuffer[0], FoaEven_RealBuffer[0], num_freq_bins ); + mvr2r( Foa_ImagBuffer[0], FoaEven_ImagBuffer[0], num_freq_bins ); + + /* Y */ + v_multc( Chnl_RealBuffer[0], hMcMasa->chnlToFoaEvenMtx[1][0], FoaEven_RealBuffer[1], num_freq_bins ); + v_multc( Chnl_ImagBuffer[0], hMcMasa->chnlToFoaEvenMtx[1][0], FoaEven_ImagBuffer[1], num_freq_bins ); + for ( i = 1; i < numAnalysisChannels; i++ ) + { + v_multc_acc( Chnl_RealBuffer[i], hMcMasa->chnlToFoaEvenMtx[1][i], FoaEven_RealBuffer[1], num_freq_bins ); + v_multc_acc( Chnl_ImagBuffer[i], hMcMasa->chnlToFoaEvenMtx[1][i], FoaEven_ImagBuffer[1], num_freq_bins ); + } + + /* Z (even setups are handled as horizontal) */ + set_zero( FoaEven_RealBuffer[2], num_freq_bins ); + set_zero( FoaEven_ImagBuffer[2], num_freq_bins ); + + /* X */ + v_multc( Chnl_RealBuffer[0], hMcMasa->chnlToFoaEvenMtx[3][0], FoaEven_RealBuffer[3], num_freq_bins ); + v_multc( Chnl_ImagBuffer[0], hMcMasa->chnlToFoaEvenMtx[3][0], FoaEven_ImagBuffer[3], num_freq_bins ); + for ( i = 1; i < numAnalysisChannels; i++ ) + { + v_multc_acc( Chnl_RealBuffer[i], hMcMasa->chnlToFoaEvenMtx[3][i], FoaEven_RealBuffer[3], num_freq_bins ); + v_multc_acc( Chnl_ImagBuffer[i], hMcMasa->chnlToFoaEvenMtx[3][i], FoaEven_ImagBuffer[3], num_freq_bins ); + } + + /* Direction estimation */ + computeIntensityVector_ana( hMcMasa->band_grouping, Foa_RealBuffer, Foa_ImagBuffer, num_freq_bands, intensity_real ); + computeDirectionVectors( intensity_real[0], intensity_real[1], intensity_real[2], 0, num_freq_bands, direction_vector[0], direction_vector[1], direction_vector[2] ); + + /* Power and intensity estimation for diffuseness */ + computeIntensityVector_ana( hMcMasa->band_grouping, FoaEven_RealBuffer, FoaEven_ImagBuffer, num_freq_bands, intensity_even_real ); + computeReferencePower_ana( hMcMasa->band_grouping, FoaEven_RealBuffer, FoaEven_ImagBuffer, reference_power[ts], num_freq_bands ); + + /* Fill buffers of length "averaging_length" time slots for intensity and energy */ + hMcMasa->index_buffer_intensity = ( hMcMasa->index_buffer_intensity % DIRAC_NO_COL_AVG_DIFF ) + 1; /* averaging_length = 32 */ + index = hMcMasa->index_buffer_intensity; + for ( i = 0; i < DIRAC_NUM_DIMS; i++ ) + { + /* only real part needed */ + mvr2r( intensity_even_real[i], &( hMcMasa->buffer_intensity_real[i][index - 1][0] ), num_freq_bands ); + } + mvr2r( reference_power[ts], &( hMcMasa->buffer_energy[( index - 1 ) * num_freq_bands] ), num_freq_bands ); + + computeDiffuseness( hMcMasa->buffer_intensity_real, hMcMasa->buffer_energy, num_freq_bands, diffuseness_vector ); + + /* Compute vertical diffuseness, and tune original diffuseness if needed */ + if ( !hMcMasa->isHorizontalSetup ) + { + mvr2r( intensity_real[2], &( hMcMasa->buffer_intensity_real_vert[index - 1][0] ), num_freq_bands ); + computeVerticalDiffuseness( hMcMasa->buffer_intensity_real_vert, hMcMasa->buffer_energy, num_freq_bands, vertical_diffuseness_vector ); + v_min( diffuseness_vector, vertical_diffuseness_vector, diffuseness_vector, num_freq_bands ); + } + + for ( band_m_idx = 0; band_m_idx < hMcMasa->nbands; band_m_idx++ ) + { + norm_tmp = reference_power[ts][band_m_idx] * ( 1 - diffuseness_vector[band_m_idx] ); + + hMcMasa->direction_vector_m[0][block_m_idx][band_m_idx] += norm_tmp * direction_vector[0][band_m_idx]; + hMcMasa->direction_vector_m[1][block_m_idx][band_m_idx] += norm_tmp * direction_vector[1][band_m_idx]; + hMcMasa->direction_vector_m[2][block_m_idx][band_m_idx] += norm_tmp * direction_vector[2][band_m_idx]; + + diffuseness_m[band_m_idx] += reference_power[ts][band_m_idx] * diffuseness_vector[band_m_idx]; + renormalization_factor_diff[band_m_idx] += reference_power[ts][band_m_idx]; + } + } + + for ( band_m_idx = 0; band_m_idx < hMcMasa->nbands; band_m_idx++ ) + { + for ( d = 0; d < DIRAC_NUM_DIMS; d++ ) + { + dir_v[d] = hMcMasa->direction_vector_m[d][block_m_idx][band_m_idx]; + } + ivas_qmetadata_direction_vector_to_azimuth_elevation( dir_v, &azimuth_m_values[block_m_idx][band_m_idx], &elevation_m_values[block_m_idx][band_m_idx] ); + } + + /* Coherence processing */ + for ( band_m_idx = 0; band_m_idx < hMcMasa->nbands; band_m_idx++ ) + { + /* Compute absolute values */ + for ( i = 0; i < numAnalysisChannels; i++ ) + { + for ( j = i; j < numAnalysisChannels; j++ ) + { + absCOVls[i][j] = sqrtf( ( COVls[band_m_idx].xr[i][j] * COVls[band_m_idx].xr[i][j] + COVls[band_m_idx].xi[i][j] * COVls[band_m_idx].xi[i][j] ) ); + } + lsEnergy[i] = absCOVls[i][i]; + } + + /* Find loudest channel */ + maxEne = lsEnergy[0]; + loudestCh = 0; + for ( i = 1; i < numAnalysisChannels; i++ ) + { + if ( lsEnergy[i] > maxEne ) + { + maxEne = lsEnergy[i]; + loudestCh = i; + } + } + + /* Compute surrounding coherence */ + surrCoh = 1.0f; + for ( i = 0; i < numAnalysisChannels; i++ ) + { + if ( i != loudestCh ) + { + if ( i < loudestCh ) + { + i1 = i; + i2 = loudestCh; + } + else + { + i1 = loudestCh; + i2 = i; + } + tempCoh = absCOVls[i1][i2] / ( sqrtf( ( lsEnergy[i1] * lsEnergy[i2] + EPSILON ) ) ); + surrCoh = ( surrCoh < tempCoh ) ? surrCoh : tempCoh; + } + } + surrCoh = surrCoh * surrCoh; + surrCoh = ( surrCoh < 1.0f ) ? surrCoh : 1.0f; + surrCoh = ( surrCoh > 0.0f ) ? surrCoh : 0.0f; + + /* Compute spread coherence */ + if ( elevation_m_values[block_m_idx][band_m_idx] < NEAR_HORIZONTAL_PLANE_ELEVATION ) /* Computed only near horizontal plane */ + { + minAngleDist = 180.0f; + i1 = 0; + currentAzi = azimuth_m_values[block_m_idx][band_m_idx]; + for ( i = 0; i < hMcMasa->numHorizontalChannels; i++ ) + { + angleDist = fabsf( currentAzi - hMcMasa->ls_azimuth[i] ); + if ( angleDist > 180.0f ) + { + angleDist = fabsf( angleDist - 360.0f ); + } + if ( angleDist < minAngleDist ) + { + minAngleDist = angleDist; + i1 = i; + } + } + i2 = hMcMasa->leftNearest[i1]; + i3 = hMcMasa->rightNearest[i1]; + + if ( i2 < i3 ) + { + stereoCoh = absCOVls[i2][i3] / ( sqrtf( lsEnergy[i2] * lsEnergy[i3] + EPSILON ) ); + } + else + { + stereoCoh = absCOVls[i3][i2] / ( sqrtf( lsEnergy[i2] * lsEnergy[i3] + EPSILON ) ); + } + lsEnergyRelation = ( lsEnergy[i2] + lsEnergy[i3] ) / ( lsEnergy[i1] + lsEnergy[i2] + lsEnergy[i3] + EPSILON ); + stereoness = stereoCoh * lsEnergyRelation; + + if ( i1 < i2 ) + { + tempCoh = absCOVls[i1][i2] / ( sqrtf( lsEnergy[i1] * lsEnergy[i2] + EPSILON ) ); + } + else + { + tempCoh = absCOVls[i2][i1] / ( sqrtf( lsEnergy[i1] * lsEnergy[i2] + EPSILON ) ); + } + if ( i1 < i3 ) + { + tempCoh2 = absCOVls[i1][i3] / ( sqrtf( lsEnergy[i1] * lsEnergy[i3] + EPSILON ) ); + } + else + { + tempCoh2 = absCOVls[i3][i1] / ( sqrtf( lsEnergy[i1] * lsEnergy[i3] + EPSILON ) ); + } + cohPanCoh = ( tempCoh < tempCoh2 ) ? tempCoh : tempCoh2; + lsEnergyRelation = lsEnergy[i2] / ( lsEnergy[i1] + EPSILON ); + tempLsEnergyRelation = lsEnergy[i1] / ( lsEnergy[i2] + EPSILON ); + lsEnergyRelation = ( lsEnergyRelation < tempLsEnergyRelation ) ? lsEnergyRelation : tempLsEnergyRelation; + tempLsEnergyRelation = lsEnergy[i3] / ( lsEnergy[i1] + EPSILON ); + lsEnergyRelation = ( lsEnergyRelation < tempLsEnergyRelation ) ? lsEnergyRelation : tempLsEnergyRelation; + tempLsEnergyRelation = lsEnergy[i1] / ( lsEnergy[i3] + EPSILON ); + lsEnergyRelation = ( lsEnergyRelation < tempLsEnergyRelation ) ? lsEnergyRelation : tempLsEnergyRelation; + cohwideness = cohPanCoh * lsEnergyRelation; + + spreadCoh = ( cohwideness > stereoness ) ? cohwideness : stereoness; + if ( spreadCoh > 0.5f ) + { + if ( cohwideness > stereoness ) + { + tempCoh = stereoness - ( cohwideness - 0.5f ); + spreadCoh = ( tempCoh > 0.5f ) ? tempCoh : 0.5f; + } + } + spreadCoh = ( spreadCoh < 1.0f ) ? spreadCoh : 1.0f; + spreadCoh = ( spreadCoh > 0.0f ) ? spreadCoh : 0.0f; + + /* Compute energy ratio tuning parameter */ + lsEnergySum = sum_f( lsEnergy, numAnalysisChannels ) + EPSILON; + lsEnergyRelation = ( lsEnergy[i2] + lsEnergy[i3] ) / lsEnergySum; + stereoRatio = stereoCoh * lsEnergyRelation - surrCoh; + + lsEnergyRelation = ( lsEnergy[i1] + lsEnergy[i2] + lsEnergy[i3] ) / lsEnergySum; + cohPanRatio = cohPanCoh * lsEnergyRelation - surrCoh; + + cohRatio = ( stereoRatio > cohPanRatio ) ? stereoRatio : cohPanRatio; + cohRatio = ( cohRatio < 1.0f ) ? cohRatio : 1.0f; + cohRatio = ( cohRatio > 0.0f ) ? cohRatio : 0.0f; + } + else /* Otherwise, set spread coherence to zero */ + { + spreadCoh = 0.0f; + cohRatio = 0.0f; + lsEnergySum = sum_f( lsEnergy, numAnalysisChannels ); + } + + /* Store values */ + spreadCoherence[block_m_idx][band_m_idx] = spreadCoh; + surroundingCoherence[block_m_idx][band_m_idx] = surrCoh; + coherentEnergyRatio[band_m_idx] = cohRatio; + } + + /* Determine energy ratios */ + for ( band_m_idx = 0; band_m_idx < hMcMasa->nbands; band_m_idx++ ) + { + if ( renormalization_factor_diff[band_m_idx] > EPSILON ) + { + diffuseness_m[band_m_idx] /= renormalization_factor_diff[band_m_idx]; + } + else + { + diffuseness_m[band_m_idx] = 0.0f; + } + + energyRatio[block_m_idx][band_m_idx] = 1.0f - diffuseness_m[band_m_idx]; + energyRatio[block_m_idx][band_m_idx] = ( energyRatio[block_m_idx][band_m_idx] > coherentEnergyRatio[band_m_idx] ) ? energyRatio[block_m_idx][band_m_idx] : coherentEnergyRatio[band_m_idx]; + } + } + + return; +} + + +/* Compute downmix */ +static void ivas_mcmasa_dmx( + MCMASA_ANA_HANDLE hMcMasa, + float data_f[][L_FRAME48k], + const int16_t input_frame, + const int16_t nchan_transport, + const int16_t nchan_inp ) +{ + int16_t i, j; + int16_t numAnalysisChannels; + float dmx_c; + float multiChEne, downmixEne; + float prevEQ, currEQ, instEQ; + float alpha; + + numAnalysisChannels = nchan_inp - 1; + + multiChEne = 0.0f; + for ( j = 0; j < numAnalysisChannels; j++ ) + { + for ( i = 0; i < input_frame; i++ ) + { + multiChEne += data_f[j][i] * data_f[j][i]; + } + } + + if ( nchan_transport == 2 ) + { + int16_t numSideChannels; /* Channels other than left, right, center */ + int16_t leftIndex, rightIndex; + + numSideChannels = numAnalysisChannels / 2 - 1; + for ( j = 0; j < numSideChannels; j++ ) + { + leftIndex = j * 2 + 3; + rightIndex = j * 2 + 4; + + for ( i = 0; i < input_frame; i++ ) + { + data_f[0][i] += data_f[leftIndex][i]; + data_f[1][i] += data_f[rightIndex][i]; + } + } + + for ( i = 0; i < input_frame; i++ ) + { + dmx_c = INV_SQRT2 * data_f[2][i]; + data_f[0][i] += dmx_c; + data_f[1][i] += dmx_c; + } + } + else if ( nchan_transport == 1 ) + { + for ( i = 0; i < input_frame; i++ ) + { + for ( j = 1; j < numAnalysisChannels; j++ ) + { + data_f[0][i] += data_f[j][i]; + } + } + } + + downmixEne = 0.0f; + for ( j = 0; j < nchan_transport; j++ ) + { + for ( i = 0; i < input_frame; i++ ) + { + downmixEne += data_f[j][i] * data_f[j][i]; + } + } + + alpha = 0.1f; + hMcMasa->prevMultiChEne = alpha * multiChEne + ( 1.0f - alpha ) * hMcMasa->prevMultiChEne; + hMcMasa->prevDownmixEne = alpha * downmixEne + ( 1.0f - alpha ) * hMcMasa->prevDownmixEne; + + prevEQ = hMcMasa->prevEQ; + currEQ = sqrtf( hMcMasa->prevMultiChEne / ( hMcMasa->prevDownmixEne + EPSILON ) ); + hMcMasa->prevEQ = currEQ; + + for ( i = 0; i < input_frame; i++ ) + { + instEQ = hMcMasa->interpolator[i] * currEQ + ( 1.0f - hMcMasa->interpolator[i] ) * prevEQ; + for ( j = 0; j < nchan_transport; j++ ) + { + data_f[j][i] *= instEQ; + } + } + + return; +} + + +/* Compute covariance matrix, i.e., xT * conj(x), and accumulate to the output */ +static void compute_cov_mtx( + float sr[MCMASA_MAX_ANA_CHANS][CLDFB_NO_CHANNELS_MAX], /* i : Input matrix, real, s[ch][freq] */ + float si[MCMASA_MAX_ANA_CHANS][CLDFB_NO_CHANNELS_MAX], /* i : Input matrix, imag, s[ch][freq] */ + const int16_t freq, /* i : Freq to process */ + const int16_t N, /* i : Number of channels */ + CovarianceMatrix *COVls /* o : Output matrix, contains upper part of cov mtx */ +) +{ + int16_t i, j; + float a, b, c, d; + + for ( i = 0; i < N; i++ ) + { + a = sr[i][freq]; + b = si[i][freq]; + for ( j = i; j < N; j++ ) + { + c = sr[j][freq]; + d = si[j][freq]; + COVls->xr[i][j] += a * c + b * d; + COVls->xi[i][j] += b * c - a * d; + } + } + + return; +} + +/*------------------------------------------------------------------------- + * computeVerticalDiffuseness() + * + * + *------------------------------------------------------------------------*/ + +static void computeVerticalDiffuseness( + float **buffer_intensity, /* i : Intensity vectors */ + const float *buffer_energy, /* i : Energy */ + const int16_t num_freq_bands, /* i : Number of frequency bands */ + float *diffuseness /* o : Estimated diffuseness */ +) +{ + float intensity_slow[MASA_FREQUENCY_BANDS]; + float intensity_slow_abs[MASA_FREQUENCY_BANDS]; + float energy_slow[MASA_FREQUENCY_BANDS]; + int16_t i, k; + float tmp = 0; + const float *p_tmp_c; + + /* Set variables to zero */ + set_f( intensity_slow, 0.0f, MASA_FREQUENCY_BANDS ); + set_f( energy_slow, 0.0f, MASA_FREQUENCY_BANDS ); + + for ( i = 0; i < DIRAC_NO_COL_AVG_DIFF; ++i ) + { + /* Energy slow */ + p_tmp_c = buffer_energy + i * num_freq_bands; + for ( k = 0; k < num_freq_bands; k++ ) + { + energy_slow[k] += *( p_tmp_c++ ); + } + + /* Intensity slow */ + for ( k = 0; k < num_freq_bands; k++ ) + { + intensity_slow[k] += buffer_intensity[i][k]; + } + } + + /* Compute absolute value */ + for ( k = 0; k < num_freq_bands; k++ ) + { + intensity_slow_abs[k] = fabsf( intensity_slow[k] ); + } + + /* Compute Diffuseness */ + for ( i = 0; i < num_freq_bands; ++i ) + { + tmp = intensity_slow_abs[i] / ( energy_slow[i] + EPSILON ); + tmp = ( tmp - VERTICAL_ENERGY_RATIO_OFFSET ) / ( 1.0f - VERTICAL_ENERGY_RATIO_OFFSET ); /* Tuned to avoid effect due to ambience of vertically un-even setups */ + tmp = 1.0f - tmp; + diffuseness[i] = ( ( tmp < 1.0f ) ? ( ( tmp < 0.0f ) ? 0.f : tmp ) : 1.0f ); + } + + return; +} + + +static void computeEvenLayout( + const float *ls_azimuth, + float *ls_azimuth_even, + const int16_t numChannels ) +{ + int16_t i; + int16_t j; + float ls_azimuth_temp[MCMASA_MAX_ANA_CHANS]; + float ls_azimuth_even_ordered[MCMASA_MAX_ANA_CHANS]; + int16_t ls_azimuth_order[MCMASA_MAX_ANA_CHANS]; + float smallestAzimuth; + int16_t smallestAzimuthIndex; + float lsSpacing; + uint8_t oddLayout; + float startAzimuth; + int16_t numChannelsHalf; + + lsSpacing = 360.0f / (float) numChannels; + oddLayout = numChannels % 2; + numChannelsHalf = numChannels / 2; + + mvr2r( ls_azimuth, ls_azimuth_temp, numChannels ); + for ( i = 0; i < numChannels; i++ ) + { + smallestAzimuth = 1000.0f; + smallestAzimuthIndex = 0; + for ( j = 0; j < numChannels; j++ ) + { + if ( ls_azimuth_temp[j] < smallestAzimuth ) + { + smallestAzimuth = ls_azimuth_temp[j]; + smallestAzimuthIndex = j; + } + } + ls_azimuth_order[i] = smallestAzimuthIndex; + ls_azimuth_temp[smallestAzimuthIndex] = 1000.0f; + } + + if ( oddLayout ) + { + startAzimuth = -lsSpacing * ( (float) numChannelsHalf ); + } + else + { + startAzimuth = -lsSpacing * ( (float) numChannelsHalf - 0.5f ); + } + + for ( i = 0; i < numChannels; i++ ) + { + ls_azimuth_even_ordered[i] = (float) i * lsSpacing + startAzimuth; + } + + for ( i = 0; i < numChannels; i++ ) + { + ls_azimuth_even[ls_azimuth_order[i]] = roundf( ls_azimuth_even_ordered[i] ); + } + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_create_masa_out_meta() + * + * + *------------------------------------------------------------------------*/ + +void ivas_create_masa_out_meta( + MASA_DECODER_EXT_OUT_META_HANDLE extOutMeta, /* i/o: MASA metadata handle */ + SPHERICAL_GRID_DATA *Sph_Grid16, /* i : Spherical grid */ + const int16_t nchan_transport, /* i : Number of transport channels */ + float elevation_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i : Estimated elevation */ + float azimuth_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i : Estimated azimuth */ + float energyRatio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i : Estimated direct-to-total ratio */ + float spreadCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i : Estimated spread coherence */ + float surroundingCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS] /* i : Estimated surround coherence */ +) +{ + const uint8_t ivasmasaFormatDescriptor[8] = { 0x49, 0x56, 0x41, 0x53, 0x4D, 0x41, 0x53, 0x41 }; /* "IVASMASA" */ + int16_t i, sf, band; + uint8_t numFrequencyBands; + uint8_t numDirections; + uint16_t spherical_index; + + numDirections = 1; + numFrequencyBands = MASA_FREQUENCY_BANDS; + + /* Construct descriptive meta */ + for ( i = 0; i < 8; i++ ) + { + extOutMeta->descriptiveMeta.formatDescriptor[i] = ivasmasaFormatDescriptor[i]; + } + extOutMeta->descriptiveMeta.numberOfDirections = numDirections - 1; + extOutMeta->descriptiveMeta.numberOfChannels = (uint8_t) ( nchan_transport - 1 ); + /* Following correspond to "unknown" values */ + extOutMeta->descriptiveMeta.sourceFormat = 0x0u; + extOutMeta->descriptiveMeta.transportDefinition = 0x0u; + extOutMeta->descriptiveMeta.channelAngle = 0x0u; + extOutMeta->descriptiveMeta.channelDistance = 0x0u; + extOutMeta->descriptiveMeta.channelLayout = 0x0u; + + /* Construct spatial metadata from estimated values */ + for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) + { + /* Spherical index */ + for ( band = 0; band < numFrequencyBands; band++ ) + { + spherical_index = index_theta_phi_16( &elevation_m_values[sf][band], &azimuth_m_values[sf][band], Sph_Grid16 ); + extOutMeta->directionIndex[0][sf][band] = spherical_index; + extOutMeta->directionIndex[1][sf][band] = SPH_IDX_FRONT; + } + + /* Direct-to-total ratio */ + for ( band = 0; band < numFrequencyBands; band++ ) + { + extOutMeta->directToTotalRatio[0][sf][band] = (uint8_t) floorf( energyRatio[sf][band] * UINT8_MAX ); + extOutMeta->directToTotalRatio[1][sf][band] = 0; + } + + /* Spread coherence */ + for ( band = 0; band < numFrequencyBands; band++ ) + { + extOutMeta->spreadCoherence[0][sf][band] = (uint8_t) floorf( spreadCoherence[sf][band] * UINT8_MAX ); + extOutMeta->spreadCoherence[1][sf][band] = 0; + } + + /* Diffuse-to-total ratio = 1 - sum(direct-to-total ratios) */ + for ( band = 0; band < numFrequencyBands; band++ ) + { + extOutMeta->diffuseToTotalRatio[sf][band] = UINT8_MAX - (uint8_t) floorf( energyRatio[sf][band] * UINT8_MAX ); + } + + /* Surround coherence */ + for ( band = 0; band < numFrequencyBands; band++ ) + { + extOutMeta->surroundCoherence[sf][band] = (uint8_t) floorf( surroundingCoherence[sf][band] * UINT8_MAX ); + } + } + + return; +} diff --git a/lib_rend/ivas_objectRenderer.c b/lib_rend/ivas_objectRenderer.c new file mode 100644 index 0000000000000000000000000000000000000000..8399f2d34e4f5673e97447b760f68dd2dfe7b9f6 --- /dev/null +++ b/lib_rend/ivas_objectRenderer.c @@ -0,0 +1,769 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include "ivas_stat_rend.h" +#include +#include "options.h" +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_prot_rend.h" +#include +#include "ivas_rom_com.h" +#include "wmc_auto.h" + + +/*---------------------------------------------------------------------* + * Local function prototypes + *---------------------------------------------------------------------*/ + +static void TDREND_Clear_Update_flags( BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd ); + +static void angles_to_vec( const float radius, const float azimuth, const float elevation, float *vec ); + + +/*---------------------------------------------------------------------* + * ivas_td_binaural_open_unwrap() + * + * Call TD open/init function without st_ivas + *---------------------------------------------------------------------*/ + +ivas_error ivas_td_binaural_open_unwrap( + TDREND_HRFILT_FiltSet_t **hHrtfTD, /* i/o: HR filter model (from file or NULL) */ + const int32_t output_Fs, /* i : Output sampling rate */ + const int16_t nchan_transport, /* i : Number of channels */ + const IVAS_FORMAT ivas_format, /* i : IVAS format (ISM/MC) */ + const AUDIO_CONFIG transport_config, /* i : Transport configuration */ + const float *directivity, /* i : Directivity pattern (used for ISM) */ + const IVAS_OUTPUT_SETUP hTransSetup, /* i : Loudspeaker layout */ + BINAURAL_TD_OBJECT_RENDERER_HANDLE *hBinRendererTd, /* o : TD renderer handle */ + int32_t *binaural_latency_ns /* i : Binauralization delay */ +) +{ + BINAURAL_TD_OBJECT_RENDERER_HANDLE pBinRendTd; + TDREND_PosType_t PosType; + int16_t nS; + int16_t SrcInd[MAX_NUM_TDREND_CHANNELS]; + const float *ls_azimuth, *ls_elevation; + float Pos[3]; + float Dir[3]; + TDREND_DirAtten_t *DirAtten_p; + int16_t nchan_rend; + ivas_error error; + + error = IVAS_ERR_OK; + + if ( ( pBinRendTd = malloc( sizeof( BINAURAL_TD_OBJECT_RENDERER ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD renderer\n" ) ); + } + if ( ( pBinRendTd->TdRend_MixSpatSpec_p = malloc( sizeof( TDREND_MixSpatSpec_t ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD renderer\n" ) ); + } + if ( ( pBinRendTd->DirAtten_p = malloc( sizeof( TDREND_DirAtten_t ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD renderer\n" ) ); + } + if ( ( pBinRendTd->Listener_p = malloc( sizeof( TDREND_MIX_Listener_t ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD renderer\n" ) ); + } + + pBinRendTd->NumOfSrcs = 0; + pBinRendTd->MaxSrcInd = -1; + + /* Mixer spatial setup */ + pBinRendTd->TdRend_MixSpatSpec_p->UseCommonDistAttenModel = TRUE; + pBinRendTd->TdRend_MixSpatSpec_p->DistAttenModel = 0; /* 0=Turned off, else use TDREND_DIST_ATTEN_MODEL_INV_DIST_CLAMPED */ + + if ( ( error = TDREND_MIX_Init( pBinRendTd, hHrtfTD, pBinRendTd->TdRend_MixSpatSpec_p, output_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Set the attenuation (or can set MixSpatSpec.DistAttenModel above) */ + if ( ( error = TDREND_MIX_SetDistAttenModel( pBinRendTd, TDREND_DIST_ATTEN_MODEL_INV_DIST_CLAMPED ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Add sources to module and mixer, headphones */ + PosType = TDREND_POSTYPE_ABSOLUTE; /* or TDREND_POSTYPE_RELATIVE_TO_LISTENER */ + + nchan_rend = nchan_transport; + if ( ( ivas_format == MC_FORMAT ) && ( transport_config != IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) + { + nchan_rend--; /* Skip LFE channel -- added to the others */ + } + + for ( nS = 0; nS < nchan_rend; nS++ ) + { + if ( ( error = TDREND_MIX_AddSrc( pBinRendTd, &SrcInd[nS], PosType ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( ivas_format == MC_FORMAT ) + { + switch ( transport_config ) + { + case IVAS_AUDIO_CONFIG_5_1: + ls_azimuth = ls_azimuth_CICP6; + ls_elevation = ls_elevation_CICP6; + break; + case IVAS_AUDIO_CONFIG_7_1: + ls_azimuth = ls_azimuth_CICP12; + ls_elevation = ls_elevation_CICP12; + break; + case IVAS_AUDIO_CONFIG_5_1_2: + ls_azimuth = ls_azimuth_CICP14; + ls_elevation = ls_elevation_CICP14; + break; + case IVAS_AUDIO_CONFIG_5_1_4: + ls_azimuth = ls_azimuth_CICP16; + ls_elevation = ls_elevation_CICP16; + break; + case IVAS_AUDIO_CONFIG_7_1_4: + ls_azimuth = ls_azimuth_CICP19; + ls_elevation = ls_elevation_CICP19; + break; + case IVAS_AUDIO_CONFIG_LS_CUSTOM: + ls_azimuth = hTransSetup.ls_azimuth; + ls_elevation = hTransSetup.ls_elevation; + break; + default: + ls_azimuth = NULL; + ls_elevation = NULL; + } + + DirAtten_p = pBinRendTd->DirAtten_p; + + for ( nS = 0; nS < nchan_rend; nS++ ) + { + /* Set source positions according to loudspeaker layout */ + angles_to_vec( 1.0f, ls_azimuth[nS], ls_elevation[nS], Pos ); + Dir[0] = 1.0f; + Dir[1] = 0.0f; + Dir[2] = 0.0f; + + /* Source directivity info */ + DirAtten_p->ConeInnerAngle = 360.0f; + DirAtten_p->ConeOuterAngle = 360.0f; + DirAtten_p->ConeOuterGain = 1.0f; + + if ( ( error = TDREND_MIX_SRC_SetPos( pBinRendTd, nS, Pos ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = TDREND_MIX_SRC_SetDir( pBinRendTd, nS, Dir ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = TDREND_MIX_SRC_SetPlayState( pBinRendTd, nS, TDREND_PLAYSTATUS_PLAYING ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = TDREND_MIX_SRC_SetDirAtten( pBinRendTd, nS, DirAtten_p ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + + if ( ivas_format == ISM_FORMAT || ivas_format == MASA_ISM_FORMAT || ivas_format == SBA_ISM_FORMAT ) + { + DirAtten_p = pBinRendTd->DirAtten_p; + + for ( nS = 0; nS < nchan_rend; nS++ ) + { + if ( NULL == directivity ) + { + DirAtten_p->ConeInnerAngle = 360.0f; /* Front cone */ + DirAtten_p->ConeOuterAngle = 360.0f; /* Back cone */ + DirAtten_p->ConeOuterGain = 1.0f; /* Back attenuation */ + } + else + { + DirAtten_p->ConeInnerAngle = directivity[nS * 3]; + DirAtten_p->ConeOuterAngle = directivity[nS * 3 + 1]; + DirAtten_p->ConeOuterGain = directivity[nS * 3 + 2]; + } + + if ( ( error = TDREND_MIX_SRC_SetDirAtten( pBinRendTd, nS, DirAtten_p ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + + *hBinRendererTd = pBinRendTd; + + if ( ivas_format != MASA_ISM_FORMAT && ivas_format != SBA_ISM_FORMAT ) + { + *binaural_latency_ns = (int32_t) ( ( *hBinRendererTd )->HrFiltSet_p->latency_s * 1000000000.f ); + } + + return error; +} + + +/*---------------------------------------------------------------------* + * ivas_td_binaural_close() + * + * Close TD Object binaural renderer + *---------------------------------------------------------------------*/ + +void ivas_td_binaural_close( + BINAURAL_TD_OBJECT_RENDERER_HANDLE *hBinRendererTd /* i/o: TD binaural object renderer handle */ +) +{ + if ( hBinRendererTd == NULL || *hBinRendererTd == NULL ) + { + return; + } + + free( ( *hBinRendererTd )->TdRend_MixSpatSpec_p ); + free( ( *hBinRendererTd )->DirAtten_p ); + + TDREND_MIX_Dealloc( *hBinRendererTd ); + + free( *hBinRendererTd ); + *hBinRendererTd = NULL; + + return; +} + + +/*---------------------------------------------------------------------* + * ivas_td_binaural_renderer_unwrap() + * + * Call ivas_td_binaural_renderer() without st_ivas. + *---------------------------------------------------------------------*/ + +ivas_error ivas_td_binaural_renderer_unwrap( + const REVERB_HANDLE hReverb, /* i : Reverberator handle */ + const AUDIO_CONFIG transport_config, /* i : Transport configuration */ + BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD binaural object renderer handle */ + const int16_t num_src, /* i : number of sources to render */ + const int16_t lfe_idx, /* i : LFE channel index */ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + ISM_METADATA_HANDLE *hIsmMetaData, /* i : ISM metadata handle */ + const int16_t *enableCombinedOrientation, /* i : Combined orientation flag */ + const IVAS_QUATERNION *Quaternions, /* i : Head tracking data per subframe */ + const IVAS_VECTOR3 *Pos, /* i : Listener position data per subframe */ + const int16_t ism_md_subframe_update, /* i : Number of subframes to delay ism metadata to sync with audio */ + float *output[], /* i/o: SCE channels / Binaural synthesis */ + const int16_t output_frame, /* i : output frame length */ + const int16_t num_subframes /* i : number of subframes to render */ +) +{ + int16_t subframe_length; + int16_t subframe_idx; + float reverb_signal[BINAURAL_CHANNELS][L_FRAME48k]; + ivas_error error; + int16_t c_indx, nS; + float *p_reverb_signal[BINAURAL_CHANNELS]; + int16_t ch; + + for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + p_reverb_signal[ch] = reverb_signal[ch]; + } + + subframe_length = output_frame / num_subframes; + + c_indx = 0; + for ( nS = 0; nS < num_src; nS++ ) + { + if ( !( ivas_format == MC_FORMAT && nS == lfe_idx ) ) /* Skip LFE for MC */ + { + hBinRendererTd->Sources[c_indx]->InputFrame_p = output[nS]; + hBinRendererTd->Sources[c_indx]->SrcRend_p->InputAvailable = TRUE; + c_indx++; + } + } + + for ( subframe_idx = 0; subframe_idx < num_subframes; subframe_idx++ ) + { + if ( subframe_idx == ism_md_subframe_update ) + { + /* Update object position(s) */ + if ( ( error = TDREND_Update_object_positions( hBinRendererTd, num_src, ivas_format, hIsmMetaData ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* Update the listener's location/orientation */ + if ( ( error = TDREND_Update_listener_orientation( hBinRendererTd, ( enableCombinedOrientation != NULL ) ? enableCombinedOrientation[subframe_idx] : 0, ( Quaternions != NULL ) ? &Quaternions[subframe_idx] : NULL, ( Pos != NULL ) ? &Pos[subframe_idx] : NULL ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( hReverb != NULL ) + { + if ( ( error = ivas_reverb_process( hReverb, transport_config, 0, output, p_reverb_signal, subframe_idx ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* Render subframe */ + if ( ( error = TDREND_GetMix( hBinRendererTd, output, subframe_length, subframe_idx, ism_md_subframe_update ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Advance subframe pointer */ + c_indx = 0; + for ( nS = 0; nS < num_src; nS++ ) + { + if ( !( ivas_format == MC_FORMAT && nS == lfe_idx ) ) /* Skip LFE for MC */ + { + hBinRendererTd->Sources[c_indx]->InputFrame_p += subframe_length; + c_indx++; + } + } + } + + if ( hReverb != NULL ) + { + /* add reverb to rendered signals */ + v_add( reverb_signal[0], output[0], output[0], output_frame ); + v_add( reverb_signal[1], output[1], output[1], output_frame ); + } + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * TDREND_GetMix() + * + * Render one 5 ms subframe from the mixer + *---------------------------------------------------------------------*/ + +ivas_error TDREND_GetMix( + BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ + float *output[], /* i/o: ISM object synth / rendered output in 0,1 */ + const int16_t subframe_length, /* i/o: subframe length */ + const int16_t subframe_idx, /* i : Subframe index to 5 ms subframe */ + const int16_t ism_md_subframe_update /* i : Number of subframes to delay ism metadata to sync with audio */ +) +{ + int16_t i; + TDREND_SRC_t *Src_p; + TDREND_SRC_SPATIAL_t *SrcSpatial_p; + TDREND_SRC_REND_t *SrcRend_p; + ivas_error error; + float output_buf[2][L_SPATIAL_SUBFR_48k]; /* Temp buffer for left/right rendered signal */ + float hrf_left_delta[SFX_SPAT_BIN_MAX_FILTER_LENGTH]; + float hrf_right_delta[SFX_SPAT_BIN_MAX_FILTER_LENGTH]; + int16_t intp_count; + int16_t subframe_update_flag; + + subframe_update_flag = subframe_idx == ism_md_subframe_update; + + error = IVAS_ERR_OK; + + /* Clear the output buffer to accumulate rendered sources */ + set_f( output_buf[0], 0.0f, subframe_length ); + set_f( output_buf[1], 0.0f, subframe_length ); + + /* Clear interpolation buffers and counter */ + set_f( hrf_left_delta, 0.0f, SFX_SPAT_BIN_MAX_FILTER_LENGTH ); + set_f( hrf_right_delta, 0.0f, SFX_SPAT_BIN_MAX_FILTER_LENGTH ); + intp_count = 0; + + /* Create the mix */ + /* Loop through the source list and render each source */ + for ( i = 0; i < hBinRendererTd->NumOfSrcs; i++ ) + { + Src_p = hBinRendererTd->Sources[i]; + SrcSpatial_p = Src_p->SrcSpatial_p; + SrcRend_p = Src_p->SrcRend_p; + + /* Update rendering params if needed */ + if ( ( SrcRend_p->PlayStatus == TDREND_PLAYSTATUS_PLAYING ) && ( hBinRendererTd->Listener_p->PoseUpdated || SrcSpatial_p->Updated ) ) + { + TDREND_SRC_REND_UpdateFiltersFromSpatialParams( hBinRendererTd, SrcRend_p, SrcSpatial_p, Src_p->hrf_left_prev, + Src_p->hrf_right_prev, hrf_left_delta, hrf_right_delta, &intp_count, &Src_p->filterlength, &Src_p->itd, &Src_p->Gain, Src_p, subframe_update_flag ); + } + + /* Render source if needed */ + if ( ( SrcRend_p->InputAvailable == TRUE ) && ( SrcRend_p->PlayStatus == TDREND_PLAYSTATUS_PLAYING ) ) + { + error = TDREND_REND_RenderSourceHRFilt( Src_p, hrf_left_delta, hrf_right_delta, intp_count, output_buf, subframe_length ); + } + } + + /* Populate output variable */ + mvr2r( output_buf[0], output[0] + subframe_idx * subframe_length, subframe_length ); /* Left */ + mvr2r( output_buf[1], output[1] + subframe_idx * subframe_length, subframe_length ); /* Right */ + + /* Clear the PoseUpdated and Source position update flags */ + TDREND_Clear_Update_flags( hBinRendererTd ); + + return error; +} + + +/*---------------------------------------------------------------------* + * TDREND_Clear_Update_flags() + * + * Initializes the audio mixer module + *---------------------------------------------------------------------*/ + +static void TDREND_Clear_Update_flags( + BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd /* i/o: TD renderer handle */ +) +{ + int16_t i; + + hBinRendererTd->Listener_p->PoseUpdated = FALSE; + + for ( i = 0; i < hBinRendererTd->NumOfSrcs; i++ ) + { + hBinRendererTd->Sources[i]->SrcSpatial_p->Updated = FALSE; + } + + return; +} + + +/*---------------------------------------------------------------------* + * TDREND_Update_object_positions() + * + * Update object position(s) + *---------------------------------------------------------------------*/ + +ivas_error TDREND_Update_object_positions( + BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD Renderer handle */ + const int16_t num_src, /* i : number of sources to render */ + const IVAS_FORMAT in_format, /* i : Format of input sources */ + const ISM_METADATA_HANDLE *hIsmMetaData /* i : Input metadata for ISM objects */ +) +{ + TDREND_DirAtten_t *DirAtten_p; + int16_t nS; + float Pos[3]; + float Dir[3]; + ivas_error error; + + DirAtten_p = hBinRendererTd->DirAtten_p; + + /* For each source, write the frame data to the source object*/ + for ( nS = 0; nS < num_src; nS++ ) + { + if ( in_format == ISM_FORMAT || in_format == MASA_ISM_FORMAT || in_format == SBA_ISM_FORMAT ) + { + /* Update the source positions */ + /* Source position and direction */ + angles_to_vec( hIsmMetaData[nS]->radius, hIsmMetaData[nS]->azimuth, hIsmMetaData[nS]->elevation, Pos ); + angles_to_vec( 1.0f, hIsmMetaData[nS]->yaw, hIsmMetaData[nS]->pitch, Dir ); + + if ( ( error = TDREND_MIX_SRC_SetPos( hBinRendererTd, nS, Pos ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = TDREND_MIX_SRC_SetDirAtten( hBinRendererTd, nS, DirAtten_p ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( hIsmMetaData[nS]->non_diegetic_flag ) + { + Pos[0] = 0; + Pos[1] = hIsmMetaData[nS]->azimuth / 90.f; + Pos[2] = 0; + if ( ( error = TDREND_MIX_SRC_SetPos( hBinRendererTd, nS, Pos ) ) != IVAS_ERR_OK ) + { + return error; + } + hBinRendererTd->Sources[nS]->SrcSpatial_p->PosType = TDREND_POSTYPE_NON_DIEGETIC; + } + else + { + hBinRendererTd->Sources[nS]->SrcSpatial_p->PosType = TDREND_POSTYPE_ABSOLUTE; + } + + if ( ( error = TDREND_MIX_SRC_SetDir( hBinRendererTd, nS, Dir ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * TDREND_Update_listener_orientation() + * + * Update listener orientation (s) + *---------------------------------------------------------------------*/ + +ivas_error TDREND_Update_listener_orientation( + BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD Renderer handle */ + const int16_t headRotEnabled, /* i : Headrotation flag */ + const IVAS_QUATERNION *headPosition, /* i : Listener orientation */ + const IVAS_VECTOR3 *Pos /* i : Listener Position */ +) +{ + float FrontVec[3]; + float UpVec[3]; + float Rmat[3][3]; + float Pos_p[3]; + ivas_error error; + + if ( headRotEnabled ) + { + /* Obtain head rotation matrix */ + QuatToRotMat( *headPosition, Rmat ); + /* Apply rotation matrix to looking vector [1;0;0] */ + FrontVec[0] = Rmat[0][0]; + FrontVec[1] = Rmat[0][1]; + FrontVec[2] = Rmat[0][2]; + /* Apply rotation matrix to up vector [0;0;1] */ + UpVec[0] = Rmat[2][0]; + UpVec[1] = Rmat[2][1]; + UpVec[2] = Rmat[2][2]; + if ( Pos != NULL ) + { + /* Input position */ + Pos_p[0] = ( *Pos ).x; + Pos_p[1] = ( *Pos ).y; + Pos_p[2] = ( *Pos ).z; + } + else + { + /* Listener at the origin */ + Pos_p[0] = 0.0f; + Pos_p[1] = 0.0f; + Pos_p[2] = 0.0f; + } + } + else + { + /* Oriented with looking vector along the x axis */ + FrontVec[0] = 1.0f; + FrontVec[1] = 0.0f; + FrontVec[2] = 0.0f; + /* Oriented with up vector along the z axis */ + UpVec[0] = 0.0f; + UpVec[1] = 0.0f; + UpVec[2] = 1.0f; + /* Listener at the origin */ + Pos_p[0] = 0.0f; + Pos_p[1] = 0.0f; + Pos_p[2] = 0.0f; + } + + /* Set the listener position and orientation:*/ + TDREND_MIX_LIST_SetPos( hBinRendererTd, Pos_p ); + error = TDREND_MIX_LIST_SetOrient( hBinRendererTd, FrontVec, UpVec ); + + return error; +} + + +/*---------------------------------------------------------------------* + * ivas_td_binaural_open_ext() + * + * + *---------------------------------------------------------------------*/ + +ivas_error ivas_td_binaural_open_ext( + TDREND_WRAPPER *pTDRend, + AUDIO_CONFIG inConfig, + RENDER_CONFIG_DATA *hRendCfg, /* i : Renderer configuration */ + LSSETUP_CUSTOM_STRUCT *customLsInput, + const int32_t outFs ) +{ + int16_t nchan_transport; + AUDIO_CONFIG transport_config; + IVAS_FORMAT ivas_format; + IVAS_OUTPUT_SETUP hTransSetup; + ivas_error error; + + float *directivity = NULL; + + if ( inConfig != IVAS_AUDIO_CONFIG_LS_CUSTOM ) + { + if ( ( error = getAudioConfigNumChannels( inConfig, &nchan_transport ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + nchan_transport = customLsInput->num_spk; + } + + transport_config = inConfig; + ivas_format = ( getAudioConfigType( inConfig ) == IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) ? MC_FORMAT : ISM_FORMAT; + + hTransSetup.ls_azimuth = NULL; + hTransSetup.ls_elevation = NULL; + + if ( inConfig == IVAS_AUDIO_CONFIG_LS_CUSTOM ) + { + hTransSetup.ls_azimuth = customLsInput->ls_azimuth; + hTransSetup.ls_elevation = customLsInput->ls_elevation; + } + + if ( NULL != hRendCfg ) + { + directivity = hRendCfg->directivity; + } + + return ivas_td_binaural_open_unwrap( &pTDRend->hHrtfTD, outFs, nchan_transport, ivas_format, transport_config, directivity, hTransSetup, &pTDRend->hBinRendererTd, &pTDRend->binaural_latency_ns ); +} + + +/*---------------------------------------------------------------------* + * ivas_td_binaural_renderer_ext() + * + * Receives the current frames for the object streams, updates metadata + * and renders the current frame. + *---------------------------------------------------------------------*/ + +ivas_error ivas_td_binaural_renderer_ext( + const TDREND_WRAPPER *pTDRend, /* i : TD Renderer wrapper structure */ + const AUDIO_CONFIG inConfig, /* i : Input audio configuration */ + const LSSETUP_CUSTOM_STRUCT *customLsInput, /* i : Input custom loudspeaker layout */ + const COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData, /* i : Combined head and external orientations */ + const IVAS_ISM_METADATA *currentPos, /* i : Object position */ + const REVERB_HANDLE hReverb, /* i : Reverberator handle */ + const int16_t ism_md_subframe_update_ext, /* i : Metadata Delay in subframes to sync with audio delay */ + const int32_t output_Fs, /* i : output sampling rate */ + const int16_t output_frame, /* i : output frame length */ + float output[][L_FRAME48k] /* i/o: SCE channels / Binaural synthesis */ +) +{ + ISM_METADATA_FRAME hIsmMetaDataFrame; + ISM_METADATA_HANDLE hIsmMetaData[1]; + int16_t lfe_idx; + int16_t num_src; + IVAS_FORMAT ivas_format; + IVAS_REND_AudioConfigType inConfigType; + AUDIO_CONFIG transport_config; + ivas_error error; + float *p_output[MAX_OUTPUT_CHANNELS]; + int16_t ch; + + for ( ch = 0; ch < MAX_OUTPUT_CHANNELS; ch++ ) + { + p_output[ch] = output[ch]; + } + + push_wmops( "ivas_td_binaural_renderer_ext" ); + + inConfigType = getAudioConfigType( inConfig ); + lfe_idx = LFE_CHANNEL; + hIsmMetaData[0] = NULL; + + + if ( inConfigType == IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) + { + ivas_format = MC_FORMAT; + transport_config = inConfig; + if ( inConfig != IVAS_AUDIO_CONFIG_LS_CUSTOM ) + { + if ( ( error = getAudioConfigNumChannels( inConfig, &num_src ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + lfe_idx = ( customLsInput->num_lfe > 0 ) ? customLsInput->lfe_idx[0] : -1; + num_src = customLsInput->num_spk + customLsInput->num_lfe; + } + } + else + { + ivas_format = ISM_FORMAT; + num_src = 1; + transport_config = IVAS_AUDIO_CONFIG_ISM1; + hIsmMetaData[0] = &hIsmMetaDataFrame; + hIsmMetaData[0]->azimuth = currentPos->azimuth; + hIsmMetaData[0]->elevation = currentPos->elevation; + hIsmMetaData[0]->yaw = currentPos->yaw; + hIsmMetaData[0]->pitch = currentPos->pitch; + hIsmMetaData[0]->radius = currentPos->radius; + hIsmMetaData[0]->non_diegetic_flag = currentPos->non_diegetic_flag; + } + + if ( ( error = ivas_td_binaural_renderer_unwrap( hReverb, transport_config, pTDRend->hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, + ( hCombinedOrientationData != NULL ) ? ( *hCombinedOrientationData )->enableCombinedOrientation : NULL, + ( hCombinedOrientationData != NULL ) ? ( *hCombinedOrientationData )->Quaternions : NULL, + ( hCombinedOrientationData != NULL ) ? ( *hCombinedOrientationData )->listenerPos : NULL, + ism_md_subframe_update_ext, p_output, output_frame, + (int16_t) ( ( output_frame * FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES ) / output_Fs ) ) ) != IVAS_ERR_OK ) + { + return error; + } + + pop_wmops(); + + return IVAS_ERR_OK; +} + + + + +/*---------------------------------------------------------------------* + * angles_to_vec() + * + * Convert azimuth and elevation angles to position/orientation vector + *---------------------------------------------------------------------*/ + +static void angles_to_vec( + const float radius, /* i : radius */ + const float azimuth, /* i : Azimuth angle */ + const float elevation, /* i : Elevation angle */ + float *vec /* o : Pos/Dir vector */ +) +{ + vec[0] = radius * cosf( elevation * PI_OVER_180 ) * cosf( azimuth * PI_OVER_180 ); + vec[1] = radius * cosf( elevation * PI_OVER_180 ) * sinf( azimuth * PI_OVER_180 ); + vec[2] = radius * sinf( elevation * PI_OVER_180 ); + + return; +} diff --git a/lib_rend/ivas_objectRenderer_hrFilt.c b/lib_rend/ivas_objectRenderer_hrFilt.c new file mode 100644 index 0000000000000000000000000000000000000000..ef7966f6bfc357c31e0a80b83c06d8df774f687a --- /dev/null +++ b/lib_rend/ivas_objectRenderer_hrFilt.c @@ -0,0 +1,613 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include "options.h" +#include "prot.h" +#include +#include "ivas_prot_rend.h" +#include "ivas_rom_rend.h" +#include "ivas_cnst.h" +#include "wmc_auto.h" + + +/*---------------------------------------------------------------------* + * Local function prototypes + *---------------------------------------------------------------------*/ + +static void getPeriodicBSplineSampVec( float *BfVec, int16_t *AzIdx, const int16_t NumBFs, const float t, int16_t *num_az_idx, const float knot_interval, const float azimKSeq_0, const int16_t azimSegSamples, const float *azimBsShape, const int16_t subSampFactor ); +static void getStandardBSplineSampVec( float *BfVec, int16_t *NzIdx, int16_t *num_idx, const int16_t NumBFs, const float t, const float *KSeq, const int16_t SegSamples, const int16_t *BsLen, const int16_t *BsStart, const float *BsShape ); +static void GenerateFilter( const float elev, float azim, ModelParams_t *model, ModelEval_t *modelEval ); +static void GenerateITD( const float elev, float azim, ModelParamsITD_t *model, ModelEval_t *modelEval ); +static void SkipSmallest_ValueIndex( int16_t *use_inds, const ValueIndex_t *VI, const int16_t N, const int16_t n_smallest ); + + +/*-------------------------------------------------------------------* + * TDREND_REND_RenderSourceHRFilt() + * + * Renders each object using the HR filters + --------------------------------------------------------------------*/ + +ivas_error TDREND_REND_RenderSourceHRFilt( + TDREND_SRC_t *Src_p, /* i/o: The source to be rendered */ + const float *hrf_left_delta, /* i : Left filter interpolation delta */ + const float *hrf_right_delta, /* i : Right filter interpolation delta */ + const int16_t intp_count, /* i : Interpolation count */ + float output_buf[][L_SPATIAL_SUBFR_48k], /* o : Output buffer */ + const int16_t subframe_length /* i : Subframe length in use */ +) +{ + float LeftOutputFrame[L_SPATIAL_SUBFR_48k]; + float RightOutputFrame[L_SPATIAL_SUBFR_48k]; + + TDREND_Apply_ITD( Src_p->InputFrame_p, LeftOutputFrame, RightOutputFrame, &Src_p->previtd, Src_p->itd, Src_p->mem_itd, subframe_length ); + TDREND_firfilt( LeftOutputFrame, Src_p->hrf_left_prev, hrf_left_delta, intp_count, Src_p->mem_hrf_left, subframe_length, Src_p->filterlength, Src_p->Gain, Src_p->prevGain ); + TDREND_firfilt( RightOutputFrame, Src_p->hrf_right_prev, hrf_right_delta, intp_count, Src_p->mem_hrf_right, subframe_length, Src_p->filterlength, Src_p->Gain, Src_p->prevGain ); + Src_p->prevGain = Src_p->Gain; + + /* Copy to accumulative output frame */ + v_add( LeftOutputFrame, output_buf[0], output_buf[0], subframe_length ); + v_add( RightOutputFrame, output_buf[1], output_buf[1], subframe_length ); + + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * GetFilterFromAngle() + * + * Obtain an HR filter corresponding to the input angle pair. + * This version uses the HR filter model. + --------------------------------------------------------------------*/ + +void GetFilterFromAngle( + TDREND_HRFILT_FiltSet_t *HrFiltSet_p, /* i/o: HR filter set structure */ + const float Elev, /* i : Elevation, degrees */ + float Azim, /* i : Azimuth, degrees */ + const int16_t filterlength, /* i : Filter length */ + float *hrf_left, /* o : Left HR filter */ + float *hrf_right, /* o : Right HR filter */ + int16_t *itd /* o : ITD value */ +) +{ + + GenerateFilter( Elev, Azim, &HrFiltSet_p->ModelParams, &HrFiltSet_p->ModelEval ); + + mvr2r( HrFiltSet_p->ModelEval.hrfModL, hrf_left, filterlength ); + mvr2r( HrFiltSet_p->ModelEval.hrfModR, hrf_right, filterlength ); + + /* 4. Evaluate the ITD */ + if ( HrFiltSet_p->ModelParams.UseItdModel ) + { + GenerateITD( Elev, Azim, &HrFiltSet_p->ModelParamsITD, &HrFiltSet_p->ModelEval ); + *itd = (int16_t) HrFiltSet_p->ModelEval.itdMod; + } + else + { + *itd = 0; + } + + return; +} + + +/*-------------------------------------------------------------------* + * GenerateFilter() + * + * Generate an HR filter using the B Spline model. + --------------------------------------------------------------------*/ + +static void GenerateFilter( + const float elev, /* i : Elevation angle, degrees */ + float azim, /* i : Azimuth angle, degrees */ + ModelParams_t *model, /* i : Model parameters structure */ + ModelEval_t *modelEval /* i/o: Model evaluation structure */ +) +{ + int16_t qp, p, k, i; + int32_t index; + int16_t AzIdx[HRTF_MODEL_BSPLINE_NUM_COEFFS][HRTF_MODEL_BSPLINE_NUM_COEFFS], EvIdx[HRTF_MODEL_BSPLINE_NUM_COEFFS]; /* non-zero basis functions */ + int16_t num_az_idx[HRTF_MODEL_BSPLINE_NUM_COEFFS]; + int16_t num_ev_idx; + int16_t BM_idx[HRTF_MODEL_BSPLINE_NUM_COEFFS_SQ]; + float knot_interval; + float ETotL, ETotR, ESynL, ESynR; + float ScaleL, ScaleR; + int16_t iSec; + + getStandardBSplineSampVec( modelEval->elevBfVec, EvIdx, &num_ev_idx, model->elevDim3, elev, model->elevKSeq, + model->elevSegSamples, model->elevBsLen, model->elevBsStart, model->elevBsShape ); + + for ( p = 0; p < num_ev_idx; p++ ) + { + /* Wrap the requested azimuth to the range of the BSplines */ + azim = fmodf( azim + model->azimKSeq[p][0], 360 ); + if ( azim < 0 ) + { + azim += 360.0f; + } + azim = azim - model->azimKSeq[p][0]; + + if ( model->azimDim3[EvIdx[p]] == 1 ) /* Constant basis function */ + { + num_az_idx[p] = 1; + AzIdx[p][0] = 0; + modelEval->azimBfVec[p][0] = 1.0f; + } + else + { + k = EvIdx[p]; + knot_interval = ( model->azimKSeq[k][model->azimDim3[k]] - model->azimKSeq[k][0] ) / model->azimDim3[k]; + + getPeriodicBSplineSampVec( modelEval->azimBfVec[p], AzIdx[p], model->azimDim3[k], azim, &num_az_idx[p], + knot_interval, model->azimKSeq[k][0], model->azimSegSamples[model->azimShapeIdx[k]], + model->azimBsShape[model->azimShapeIdx[k]], model->azimShapeSampFactor[k] ); + } + } + + /* Compute BM */ + qp = 0; + for ( p = 0; p < num_ev_idx; p++ ) + { + for ( i = 0; i < num_az_idx[p]; i++ ) + { + modelEval->BM[qp + i] = modelEval->elevBfVec[p] * modelEval->azimBfVec[p][i]; + BM_idx[qp + i] = model->azim_start_idx[EvIdx[p]] + AzIdx[p][i]; + } + qp = qp + num_az_idx[p]; + } + + /* Compute HR filters, approximate optimized model evaluation */ + for ( iSec = 0; iSec < HRTF_MODEL_N_SECTIONS; iSec++ ) + { + ETotL = 0.0f; + ETotR = 0.0f; + ESynL = 0.0f; + ESynR = 0.0f; + + /* Energy is precalculated part updated with square of BM value. Store index for sorting */ + for ( i = 0; i < qp; i++ ) + { + modelEval->BMEnergiesL[i].val = modelEval->BM[i] * modelEval->BM[i] * model->EL[iSec * model->AlphaN + BM_idx[i]]; + modelEval->BMEnergiesR[i].val = modelEval->BM[i] * modelEval->BM[i] * model->ER[iSec * model->AlphaN + BM_idx[i]]; + modelEval->BMEnergiesL[i].i = i; + modelEval->BMEnergiesR[i].i = i; + ETotL += modelEval->BMEnergiesL[i].val; + ETotR += modelEval->BMEnergiesR[i].val; + } + + /* Number of basis components actually used. */ + p = min( HRTF_MODEL_N_CPTS_VAR[iSec], qp ); + SkipSmallest_ValueIndex( modelEval->UseIndsL, modelEval->BMEnergiesL, qp, qp - p ); + SkipSmallest_ValueIndex( modelEval->UseIndsR, modelEval->BMEnergiesR, qp, qp - p ); + + /* Account for lost energy */ + for ( i = 0; i < p; i++ ) + { + ESynL += modelEval->BMEnergiesL[modelEval->UseIndsL[i]].val; + ESynR += modelEval->BMEnergiesR[modelEval->UseIndsR[i]].val; + } + ScaleL = sqrtf( ETotL / ESynL ); + ScaleR = sqrtf( ETotR / ESynR ); + + /* Build using only the most energetic components. */ + for ( k = model->iSecFirst[iSec]; k <= model->iSecLast[iSec]; k++ ) + { + modelEval->hrfModL[k] = 0.0; + modelEval->hrfModR[k] = 0.0; + for ( i = 0; i < p; i++ ) + { + index = BM_idx[modelEval->BMEnergiesL[modelEval->UseIndsL[i]].i] + k * model->AlphaN; + modelEval->hrfModL[k] += modelEval->BM[modelEval->BMEnergiesL[modelEval->UseIndsL[i]].i] * model->AlphaL[index]; + index = BM_idx[modelEval->BMEnergiesR[modelEval->UseIndsR[i]].i] + k * model->AlphaN; + modelEval->hrfModR[k] += modelEval->BM[modelEval->BMEnergiesR[modelEval->UseIndsR[i]].i] * model->AlphaR[index]; + } + /* Account for lost energy */ + modelEval->hrfModL[k] *= ScaleL; + modelEval->hrfModR[k] *= ScaleR; + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * GenerateITD() + * + * Generates an ITD value from the B Spline model. + --------------------------------------------------------------------*/ + +static void GenerateITD( + const float elev, /* i : Elevation angle, degrees */ + float azim, /* i : Azimuth angle, degrees */ + ModelParamsITD_t *model, /* i : ITD Model parameters structure */ + ModelEval_t *modelEval /* i/o: Model evaluation structure */ +) +{ + int16_t qp, p, i; + int32_t index; + int16_t AlphaN; + int16_t elev_offset; + float azim_itd; + int16_t AzIdx[HRTF_MODEL_BSPLINE_NUM_COEFFS], EvIdx[HRTF_MODEL_BSPLINE_NUM_COEFFS]; /* non-zero basis functions */ + int16_t num_az_idx, num_ev_idx; + int16_t BM_idx[HRTF_MODEL_BSPLINE_NUM_COEFFS_SQ]; + + /* Wrap the requested azimuth to the range of the BSplines */ + azim = fmodf( azim + model->azimKSeq[0], 360 ); + if ( azim < 0 ) + { + azim += 360.0f; + } + azim = azim - model->azimKSeq[0]; + + if ( (int16_t) abs( (int16_t) elev ) != 90 ) + { + getStandardBSplineSampVec( modelEval->elevBfVecITD, EvIdx, &num_ev_idx, model->elevDim3, elev, model->elevKSeq, + model->elevSegSamples, model->elevBsLen, model->elevBsStart, model->elevBsShape ); + azim_itd = azim; + if ( azim > 180 ) + { + /* Flip spline functions around 180 deg */ + azim_itd = 360 - azim; + } + getStandardBSplineSampVec( modelEval->azimBfVecITD, AzIdx, &num_az_idx, ( model->azimDim3 + 1 ) / 2, azim_itd, model->azimKSeq, + model->azimSegSamples, model->azimBsLen, model->azimBsStart, model->azimBsShape ); + if ( azim > 180 ) + { + /* Flip spline functions around 180 deg */ + for ( i = 0; i < HRTF_MODEL_BSPLINE_NUM_COEFFS; i++ ) + { + AzIdx[i] = model->azimDim3 - 1 - AzIdx[i]; + } + } + } + else + { + num_az_idx = 1; + num_ev_idx = 1; + modelEval->elevBfVecITD[0] = 1.0f; + if ( elev < 0 ) + { + EvIdx[0] = 0; + } + else + { + EvIdx[0] = model->elevDim3 - 1; + } + } + + /* Compute BM_ITD */ + elev_offset = 0; + if ( model->elevKSeq[0] == -90 ) + { + elev_offset = -( model->azimDim3 - 1 ); + } + qp = 0; + for ( p = 0; p < num_ev_idx; p++ ) + { + if ( EvIdx[p] == 0 && (int16_t) ( model->elevKSeq[EvIdx[p]] ) == -90 ) + { + modelEval->BM_ITD[qp] = modelEval->elevBfVecITD[p]; + BM_idx[qp] = EvIdx[p] * model->azimDim3; + qp = qp + 1; + } + else if ( EvIdx[p] == ( model->elevDim3 - 1 ) && (int16_t) ( model->elevKSeq[EvIdx[p] - 2] ) == 90 ) + { + /* NB: -2 in if() condition above as number of knot points is numBF-2 */ + modelEval->BM_ITD[qp] = modelEval->elevBfVecITD[p]; + BM_idx[qp] = EvIdx[p] * model->azimDim3 + elev_offset; + qp = qp + 1; + } + else + { + for ( i = 0; i < num_az_idx; i++ ) + { + modelEval->BM_ITD[qp + i] = modelEval->elevBfVecITD[p] * modelEval->azimBfVecITD[i]; + BM_idx[qp + i] = EvIdx[p] * model->azimDim3 + elev_offset + AzIdx[i]; + } + qp = qp + num_az_idx; + } + } + + /* Compute ITD */ + AlphaN = model->elevDim3 * model->azimDim3 + elev_offset; + if ( model->elevKSeq[model->elevDim3 - 3] == 90 ) /* Constant azimuth basis function */ + { + AlphaN = AlphaN - ( model->azimDim3 - 1 ); + } + + /* Matrix multiplcation (row x column) */ + modelEval->itdMod = 0.0f; + for ( i = 0; i < qp; i++ ) + { + index = BM_idx[i]; + modelEval->itdMod += modelEval->BM_ITD[i] * model->W[index]; + } + + modelEval->itdMod = -(float) round_f( modelEval->itdMod * model->resamp_factor ); /* Resample and reverse sign of ITD as convention in model and renderer are opposite */ + + return; +} + + +/*-------------------------------------------------------------------* + * getStandardBSplineSampVec() + * + * Obtain a periodic sampled B Spline basis vector. + --------------------------------------------------------------------*/ + +static void getPeriodicBSplineSampVec( + float *BfVec, /* i/o: values for non-zero basis functions */ + int16_t *AzIdx, /* i/o: indices of non-zero basis functions */ + const int16_t NumBFs, /* i : the number of basis functions = third index of Bf. */ + const float t, /* i : azimuth */ + int16_t *num_az_idx, /* i : Number of azimuth indices */ + const float knot_interval, /* i : The knot interval */ + const float azimKSeq_0, /* i : Knot sequence */ + const int16_t azimSegSamples, /* i : Samples per segment */ + const float *azimBsShape, /* i : Basis shape */ + const int16_t subSampFactor /* i : Subsampling factor */ +) +{ + int16_t i, nI, d0, d; + + int16_t SegSamples = azimSegSamples / subSampFactor; + + /* index of closest sample point */ + d0 = (int16_t) round_f( ( t - azimKSeq_0 ) / ( knot_interval / SegSamples ) ); + + /* find segment */ + nI = d0 / SegSamples; + + *num_az_idx = HRTF_MODEL_BSPLINE_NUM_COEFFS; + + if ( d0 % SegSamples == 0 ) + { + ( *num_az_idx )--; /* on the knot points, the last basis function is zero */ + } + + for ( i = 0; i < *num_az_idx; i++ ) + { + d = d0 - ( i + nI - 1 ) * SegSamples; /* offset of knot_interval */ + BfVec[i] = azimBsShape[(int16_t) abs( d ) * subSampFactor]; + AzIdx[i] = ( nI + i ) % NumBFs; + } + + return; +} + + +/*-------------------------------------------------------------------* + * getStandardBSplineSampVec() + * + * Obtain a sampled B Spline basis vector. + --------------------------------------------------------------------*/ + +static void getStandardBSplineSampVec( + float *BfVec, /* i/o: values for non-zero basis functions */ + int16_t *NzIdx, /* i/o: indices of non-zero basis functions */ + int16_t *num_idx, /* i/o: number of non-zero indices */ + const int16_t NumBFs, /* i : the number of basis functions = third index of Bf */ + const float t, /* i : estimation point */ + const float *KSeq, /* i : knot sequence including multiplicities */ + const int16_t SegSamples, /* i : samples per segment */ + const int16_t *BsLen, /* i : lengths of basis shapes */ + const int16_t *BsStart, /* i : start of basis shapes */ + const float *BsShape /* i : basis shapes */ +) +{ + int16_t i, nI; + float knot_interval; + int16_t d0, d, shape_idx, start_idx; + + knot_interval = ( KSeq[NumBFs - 3] - KSeq[0] ) / ( NumBFs - 3 ); /* assuming triple knot at the first knot */ + /* index of closest sample point */ + d0 = (int16_t) round_f( ( t - KSeq[0] ) / ( knot_interval / SegSamples ) ); + /* find segment */ + nI = d0 / SegSamples; + + *num_idx = HRTF_MODEL_BSPLINE_NUM_COEFFS; + + if ( d0 % SegSamples == 0 ) + { + ( *num_idx )--; /* on the knot points, the last basis function is zero */ + } + + + for ( i = 0; i < *num_idx; i++ ) + { + start_idx = max( 0, i + nI - 3 ); + shape_idx = min( i + nI, min( 3, NumBFs - 1 - ( i + nI ) ) ); + d = d0 - start_idx * SegSamples; + + if ( i + nI > NumBFs - 4 ) /* reverse full shape */ + { + d = BsLen[shape_idx] - 1 - d; + } + else if ( d > BsLen[shape_idx] - 1 ) /* reverse half shape */ + { + d = 2 * ( BsLen[shape_idx] - 1 ) - d; + } + BfVec[i] = BsShape[BsStart[shape_idx] + (int16_t) abs( d )]; /*TT, verify if abs is needed */ + NzIdx[i] = nI + i; + } + + return; +} + + +/*-------------------------------------------------------------------* + * HRTF_model_precalc() + * + * Set precalculated parameters for HRTF model + --------------------------------------------------------------------*/ + +void HRTF_model_precalc( + ModelParams_t *model /* i/o: HRTF model parameters */ +) +{ + int16_t sec_length; + int16_t i; + + sec_length = model->K / HRTF_MODEL_N_SECTIONS; + + for ( i = 0; i < HRTF_MODEL_N_SECTIONS; i++ ) + { + model->iSecFirst[i] = i * sec_length; + } + for ( i = 0; i < HRTF_MODEL_N_SECTIONS - 1; i++ ) + { + model->iSecLast[i] = ( i + 1 ) * sec_length - 1; + } + model->iSecLast[HRTF_MODEL_N_SECTIONS - 1] = model->K - 1; /* Final section is longer if (K % nSec) > 0 */ + + maximum_s( model->azimDim3, model->elevDim3, &model->azimDim3Max ); + + return; +} + + +/*-------------------------------------------------------------------* + * BSplineModelEvalDealloc() + * + * Deallocate BSpline HR Filter model + --------------------------------------------------------------------*/ + +void BSplineModelEvalDealloc( + ModelParams_t *model, /* i : Model parameters */ + ModelEval_t *modelEval /* i : Model evaluation structure */ +) +{ + /* Allocated in LoadBSplineBinary() */ + int16_t i; + + if ( model->modelROM ) + { + free( (void *) model->azimBsShape ); /* void* cast needed to please both gcc and Visual studio compilers. Deallocating const float** should be fine and gcc agrees, but Visual studio complains. */ + for ( i = 0; i < model->elevDim3; i++ ) + { + free( model->azimKSeq[i] ); + } + free( model->azimKSeq ); + if ( modelEval != NULL ) + { + free( modelEval->hrfModL ); + free( modelEval->hrfModR ); + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * SkipSmallest_ValueIndex() + * + * Returns indices to the largest values in a ValueIndex list, + * unordered (i.e. skip the n_smallest values, return the remainder). + --------------------------------------------------------------------*/ + +static void SkipSmallest_ValueIndex( + int16_t *use_inds, /* i/o: List of indices to use */ + const ValueIndex_t *VI, /* i : List of value-index items */ + const int16_t N, /* i : Length of list */ + const int16_t n_smallest /* i : Number of items to skip */ +) +{ + int16_t i, j, k, flag; + int16_t skip_inds[HRTF_MODEL_BSPLINE_NUM_COEFFS_SQ]; + float candidate_max; /* Stores the max value in the shortlist (next to be kicked off) and its index */ + int16_t candidate_max_i; + + /* Initialise with first entries of VI */ + candidate_max = 0.0; + candidate_max_i = 0; + for ( j = 0; j < n_smallest; j++ ) + { + skip_inds[j] = j; + if ( candidate_max < VI[j].val ) + { + candidate_max = VI[j].val; + candidate_max_i = j; + } + } + + /* Look in the remainder of the list for smaller values */ + for ( i = n_smallest; i < N; i++ ) + { + for ( j = 0; j < n_smallest; j++ ) + { + if ( VI[i].val < VI[skip_inds[j]].val ) + { + /* Found a smaller value, so it goes into the list, replacing candidate_max. */ + skip_inds[candidate_max_i] = i; + candidate_max = VI[i].val; + /* Update candidate_max */ + for ( k = 0; k < n_smallest; k++ ) + { + if ( VI[skip_inds[k]].val > candidate_max ) + { + candidate_max = VI[skip_inds[k]].val; + candidate_max_i = k; + } + } + break; + } + } + } + + /* Build the list of indices that will not be skipped */ + k = 0; + for ( j = 0; j < N; j++ ) + { + flag = 1; + for ( i = 0; i < n_smallest; i++ ) + { + if ( skip_inds[i] == j ) + { + flag = 0; + break; + } + } + if ( flag ) + { + use_inds[k] = j; + k++; + } + } + + return; +} diff --git a/lib_rend/ivas_objectRenderer_mix.c b/lib_rend/ivas_objectRenderer_mix.c new file mode 100644 index 0000000000000000000000000000000000000000..cf1dba8b2d2a3a678491a1f8cb9ffd6390b6d666 --- /dev/null +++ b/lib_rend/ivas_objectRenderer_mix.c @@ -0,0 +1,553 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "prot.h" +#include "ivas_prot_rend.h" +#include "ivas_rom_TdBinauralRenderer.h" +#include "ivas_error.h" +#include "wmc_auto.h" +#include "ivas_rom_rend.h" + + +/*-------------------------------------------------------------------* + * Local constants + *-------------------------------------------------------------------*/ + +#define RESAMPLE_FACTOR_16_48 ( 16.0f / 48.0f ) +#define RESAMPLE_FACTOR_32_48 ( 32.0f / 48.0f ) + + +/*------------------------------------------------------------------------- + * Local functions + *-------------------------------------------------------------------------*/ + +static ivas_error DefaultBSplineModel( TDREND_HRFILT_FiltSet_t *HrFiltSet_p, const int32_t output_Fs ); + + +/*-------------------------------------------------------------------* + * TDREND_MIX_LIST_SetPos() + * + * Sets the listener's position in the specified mixer unit. + --------------------------------------------------------------------*/ + +void TDREND_MIX_LIST_SetPos( + BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ + const float *Pos_p /* i : Listener's position */ +) +{ + TDREND_MIX_Listener_t *Listener_p; + + Listener_p = hBinRendererTd->Listener_p; + + if ( ( Pos_p[0] != Listener_p->Pos[0] ) || ( Pos_p[1] != Listener_p->Pos[1] ) || ( Pos_p[2] != Listener_p->Pos[2] ) ) + { + /* Set position */ + mvr2r( Pos_p, Listener_p->Pos, 3 ); + + /* Set pose update flag */ + Listener_p->PoseUpdated = TRUE; + } + + return; +} + + +/*-------------------------------------------------------------------* + * TDREND_MIX_LIST_SetOrient() + * + * Sets the listener's orientation vectors in the specified mixer unit. + --------------------------------------------------------------------*/ + +ivas_error TDREND_MIX_LIST_SetOrient( + BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ + const float *FrontVec_p, /* i : Listener's orientation front vector */ + const float *UpVec_p /* i : Listener's orientation up vector */ +) +{ + TDREND_MIX_Listener_t *List_p; + /* Value verification */ + if ( ( FrontVec_p[0] == 0.0f ) && ( FrontVec_p[1] == 0.0f ) && ( FrontVec_p[2] == 0.0f ) ) + { + return ( IVAS_ERROR( IVAS_ERR_INTERNAL, "Zero front vector. Command is ignored!\n" ) ); + } + + if ( ( UpVec_p[0] == 0.0f ) && ( UpVec_p[1] == 0.0f ) && ( UpVec_p[2] == 0.0f ) ) + { + return ( IVAS_ERROR( IVAS_ERR_INTERNAL, "Zero up vector. Command is ignored!\n" ) ); + } + + /* Get listener */ + List_p = hBinRendererTd->Listener_p; + + /* Evaluate the normalized orientation vectors and set pose update flag */ + List_p->PoseUpdated = TDREND_SPATIAL_EvalOrthonormOrient( List_p->Front, List_p->Up, List_p->Right, FrontVec_p, UpVec_p ); + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * TDREND_MIX_Dealloc() + * + * Deallocates the TDREND_MIX_t variable + --------------------------------------------------------------------*/ + +void TDREND_MIX_Dealloc( + BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd /* i/o: TD renderer handle */ +) +{ + int16_t i; + + /* Deallocate source list */ + for ( i = 0; i < hBinRendererTd->NumOfSrcs; i++ ) + { + TDREND_SRC_Dealloc( hBinRendererTd->Sources[i] ); + } + /* Deallocate Listener and RendListener */ + if ( hBinRendererTd->Listener_p != NULL ) + { + free( hBinRendererTd->Listener_p ); + hBinRendererTd->Listener_p = NULL; + } + /* Dealloc HR filter set */ + if ( hBinRendererTd->HrFiltSet_p != NULL ) + { + if ( hBinRendererTd->HrFiltSet_p->FilterMethod == TDREND_HRFILT_Method_BSplineModel ) + { + BSplineModelEvalDealloc( &hBinRendererTd->HrFiltSet_p->ModelParams, &hBinRendererTd->HrFiltSet_p->ModelEval ); + } + else + { + if ( hBinRendererTd->HrFiltSet_p->Elev_p != NULL ) + { + free( hBinRendererTd->HrFiltSet_p->Elev_p ); + hBinRendererTd->HrFiltSet_p->Elev_p = NULL; + } + if ( hBinRendererTd->HrFiltSet_p->Azim_p != NULL ) + { + free( hBinRendererTd->HrFiltSet_p->Azim_p ); + hBinRendererTd->HrFiltSet_p->Azim_p = NULL; + } + if ( hBinRendererTd->HrFiltSet_p->LeftFiltSet_p != NULL ) + { + free( hBinRendererTd->HrFiltSet_p->LeftFiltSet_p ); + hBinRendererTd->HrFiltSet_p->LeftFiltSet_p = NULL; + } + if ( hBinRendererTd->HrFiltSet_p->RightFiltSet_p != NULL ) + { + free( hBinRendererTd->HrFiltSet_p->RightFiltSet_p ); + hBinRendererTd->HrFiltSet_p->RightFiltSet_p = NULL; + } + } + + free( hBinRendererTd->HrFiltSet_p ); + hBinRendererTd->HrFiltSet_p = NULL; + } + + return; +} + + +/*-------------------------------------------------------------------* + * TDREND_MIX_Init() + * + * Initializes the mixer and sets HRTF + --------------------------------------------------------------------*/ + +ivas_error TDREND_MIX_Init( + BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ + TDREND_HRFILT_FiltSet_t **hHrtfTD, /* i/o: HRTF data (initialized in case of NULL) */ + const TDREND_MixSpatSpec_t *MixSpatSpec_p, /* i : Mixer spatial specification */ + const int32_t output_Fs /* i : Output sampling rate */ +) +{ + ivas_error error; + + hBinRendererTd->Gain = 1.0f; + + /* Init source list */ + + /* Spatial settings */ + if ( MixSpatSpec_p != NULL ) + { + hBinRendererTd->UseCommonDistAttenModel = MixSpatSpec_p->UseCommonDistAttenModel; + hBinRendererTd->DistAttenModel = MixSpatSpec_p->DistAttenModel; + } + else + { + hBinRendererTd->UseCommonDistAttenModel = TRUE; + hBinRendererTd->DistAttenModel = 0x0000; /* Distance attenuation not activated; */ + } + + /* Init virtual and rendering listeners for spatial mixers */ + TDREND_SPATIAL_VecInit( hBinRendererTd->Listener_p->Pos, 0.0f, 0.0f, 0.0f ); + TDREND_SPATIAL_VecInit( hBinRendererTd->Listener_p->Vel, 0.0f, 0.0f, 0.0f ); + TDREND_SPATIAL_VecInit( hBinRendererTd->Listener_p->Front, 0.0f, 0.0f, -1.0f ); + TDREND_SPATIAL_VecInit( hBinRendererTd->Listener_p->Up, 0.0f, 1.0f, 0.0f ); + TDREND_SPATIAL_VecInit( hBinRendererTd->Listener_p->Right, 1.0f, 0.0f, 0.0f ); + + /* Init HR filter set */ + if ( *hHrtfTD == NULL ) + { + if ( ( hBinRendererTd->HrFiltSet_p = (TDREND_HRFILT_FiltSet_t *) malloc( sizeof( TDREND_HRFILT_FiltSet_t ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Binaural TD renderer\n" ) ); + } + + if ( ( error = DefaultBSplineModel( hBinRendererTd->HrFiltSet_p, output_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } + *hHrtfTD = hBinRendererTd->HrFiltSet_p; + } + else + { + hBinRendererTd->HrFiltSet_p = *hHrtfTD; + } + + if ( hBinRendererTd->HrFiltSet_p->SampleRate != output_Fs ) + { + return ( IVAS_ERROR( IVAS_ERR_INVALID_SAMPLING_RATE, "The sampling rate for the HR filter set does not match the output sampling rate.\n" ) ); + } + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * TDREND_MIX_SetDistAttenModel() + * + * Set the distance attenuation model of the mixer + --------------------------------------------------------------------*/ + +ivas_error TDREND_MIX_SetDistAttenModel( + BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ + const TDREND_DistAttenModel_t DistAttenModel /* i : Distance attenuation model */ +) +{ + + /* Value validation */ + if ( ( DistAttenModel < TDREND_DIST_ATTEN_MODEL_INV_DIST ) || ( DistAttenModel > TDREND_DIST_ATTEN_MODEL_INV_DIST_CLAMPED ) ) + { + return ( IVAS_ERROR( IVAS_ERR_INTERNAL, "Invalid distance attenuation model!\n" ) ); + } + else + { + /* Set the common distance attenuation model */ + hBinRendererTd->DistAttenModel = DistAttenModel; + + /* If using common distance attenuation model, set it. */ + if ( hBinRendererTd->UseCommonDistAttenModel ) + { + hBinRendererTd->DistAttenEnabled = TRUE; + hBinRendererTd->DistAttenModel = DistAttenModel; + } + } + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * TDREND_MIX_AddSrc() + * + * Adds the specified input source unit to the specified mixer unit. + --------------------------------------------------------------------*/ + +ivas_error TDREND_MIX_AddSrc( + BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ + int16_t *SrcInd, /* o : Source index */ + const TDREND_PosType_t PosType /* i : Position type (absolute/relative) */ +) +{ + TDREND_SRC_t *Src_p; + ivas_error error; + + error = IVAS_ERR_OK; + + /* Get unique source index */ + *SrcInd = hBinRendererTd->MaxSrcInd + 1; + hBinRendererTd->MaxSrcInd++; + hBinRendererTd->NumOfSrcs++; + + if ( hBinRendererTd->NumOfSrcs > MAX_NUM_TDREND_CHANNELS ) + { + return ( IVAS_ERROR( IVAS_ERR_INTERNAL, "Maximum number of sources exceeded!\n" ) ); + } + else + { + if ( ( PosType < TDREND_POSTYPE_ABSOLUTE ) || ( PosType > TDREND_POSTYPE_NON_DIEGETIC ) ) + { + return ( IVAS_ERROR( IVAS_ERR_INTERNAL, "Invalid position type!\n" ) ); + } + else + { + /* Alloc and init a complete source: signal+spatial+rend components */ + if ( ( error = TDREND_SRC_Alloc( &Src_p ) ) != IVAS_ERR_OK ) + { + return error; + } + + TDREND_SRC_Init( Src_p, PosType ); + + /* Special OpenAL initialization due to a common distance attenuation model */ + if ( hBinRendererTd->DistAttenModel != 0 ) + { + Src_p->SrcSpatial_p->DistAttenEnabled = TRUE; + Src_p->SrcSpatial_p->DistAtten.DistAttenModel = hBinRendererTd->DistAttenModel; + } + /* Add source to mixer */ + hBinRendererTd->Sources[*SrcInd] = Src_p; + } + } + + return error; +} + + +/*-------------------------------------------------------------------* + * BSplineModelEvalAlloc() + * + * Allocate the B Spline HR Filter model. + --------------------------------------------------------------------*/ + +static ivas_error BSplineModelEvalAlloc( + ModelParams_t *model, /* i : Model parameters */ + ModelEval_t *modelEval /* i/o: Model evaluation structure */ +) +{ + if ( ( modelEval->hrfModL = (float *) malloc( model->K * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Binaural TD renderer\n" ) ); + } + + if ( ( modelEval->hrfModR = (float *) malloc( model->K * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Binaural TD renderer\n" ) ); + } + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * DefaultBSplineModel() + * + * Init default HRTF model + --------------------------------------------------------------------*/ + +static ivas_error DefaultBSplineModel( + TDREND_HRFILT_FiltSet_t *HrFiltSet_p, /* o : Loaded HR filter set */ + const int32_t output_Fs /* i : Output sampling rate */ +) +{ + ModelParams_t *model; + ModelParamsITD_t *modelITD; + int16_t i, j; + ivas_error error; + + HrFiltSet_p->FilterMethod = TDREND_HRFILT_Method_BSplineModel; + model = &( HrFiltSet_p->ModelParams ); + modelITD = &( HrFiltSet_p->ModelParamsITD ); + + switch ( output_Fs ) + { + case 48000: + HrFiltSet_p->lr_energy_and_iac[0] = defaultHRIR_left_avg_power_48kHz; + HrFiltSet_p->lr_energy_and_iac[1] = defaultHRIR_right_avg_power_48kHz; + HrFiltSet_p->lr_energy_and_iac[2] = defaultHRIR_coherence_48kHz; + break; + case 32000: + HrFiltSet_p->lr_energy_and_iac[0] = defaultHRIR_left_avg_power_32kHz; + HrFiltSet_p->lr_energy_and_iac[1] = defaultHRIR_right_avg_power_32kHz; + HrFiltSet_p->lr_energy_and_iac[2] = defaultHRIR_coherence_32kHz; + break; + case 16000: + HrFiltSet_p->lr_energy_and_iac[0] = defaultHRIR_left_avg_power_16kHz; + HrFiltSet_p->lr_energy_and_iac[1] = defaultHRIR_right_avg_power_16kHz; + HrFiltSet_p->lr_energy_and_iac[2] = defaultHRIR_coherence_16kHz; + break; + } + + /* Set ROM flag for correct deallocation */ + model->modelROM = TRUE; + + /* int16_t parameters */ + model->UseItdModel = 1; + model->SplineDegree = 4; + model->elevDim2 = 17; + model->elevDim3 = 15; + model->AlphaN = 470; + model->num_unique_azim_splines = 1; + model->elevSegSamples = 4; + model->elevBsLen[0] = 5; + model->elevBsLen[1] = 9; + model->elevBsLen[2] = 13; + model->elevBsLen[3] = 9; + model->elevBsStart[0] = 0; + model->elevBsStart[1] = 5; + model->elevBsStart[2] = 14; + model->elevBsStart[3] = 27; + + model->azimDim2 = defaultHRIR_rom_azimDim2; + model->azimDim3 = defaultHRIR_rom_azimDim3; + model->azim_start_idx = defaultHRIR_rom_azim_start_idx; + model->azimSegSamples = defaultHRIR_rom_azimSegSamples; + model->azimShapeIdx = defaultHRIR_rom_azimShapeIdx; + model->azimShapeSampFactor = defaultHRIR_rom_azimShapeSampFactor; + + /* float parameters */ + model->elevKSeq = (const float *) defaultHRIR_rom_elevKSeq; + model->elevBsShape = (const float *) defaultHRIR_rom_elevBsShape; + + if ( ( model->azimBsShape = (const float **) malloc( model->num_unique_azim_splines * sizeof( float * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Binaural TD renderer\n" ) ); + } + + model->azimBsShape[0] = (const float *) defaultHRIR_rom_azimBsShape; + if ( ( model->azimKSeq = (float **) malloc( 18 * sizeof( float * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Binaural TD renderer\n" ) ); + } + if ( ( model->azimKSeq[0] = (float *) malloc( 2 * sizeof( float * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Binaural TD renderer\n" ) ); + } + if ( ( model->azimKSeq[model->elevDim3 - 1] = (float *) malloc( 2 * sizeof( float * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Binaural TD renderer\n" ) ); + } + model->azimKSeq[0][0] = 0.0f; + model->azimKSeq[model->elevDim3 - 1][0] = 0.0f; + model->azimKSeq[0][1] = 360.0f; + model->azimKSeq[model->elevDim3 - 1][1] = 360.0f; + + for ( i = 1; i < model->elevDim3 - 1; i++ ) + { + if ( ( model->azimKSeq[i] = (float *) malloc( model->azimDim2[i] * sizeof( float * ) ) ) == NULL ) /* azimDim2[i] = 91, i=2..15 */ + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Binaural TD renderer\n" ) ); + } + for ( j = 0; j < model->azimDim2[i]; j++ ) + { + model->azimKSeq[i][j] = (float) defaultHRIR_rom_azimSegSamples[0] * j; + } + } + + switch ( output_Fs ) + { + case 48000: + model->AlphaL = (const float *) defaultHRIR_rom_AlphaL48; + model->AlphaR = (const float *) defaultHRIR_rom_AlphaR48; + model->EL = (const float *) defaultHRIR_rom_EL48; + model->ER = (const float *) defaultHRIR_rom_ER48; + model->K = 128; + if ( HrFiltSet_p->ModelParams.UseItdModel ) + { + modelITD->resamp_factor = 1.0f; + } + break; + case 32000: + model->AlphaL = (const float *) defaultHRIR_rom_AlphaL32; + model->AlphaR = (const float *) defaultHRIR_rom_AlphaR32; + model->EL = (const float *) defaultHRIR_rom_EL32; + model->ER = (const float *) defaultHRIR_rom_ER32; + model->K = 86; + if ( HrFiltSet_p->ModelParams.UseItdModel ) + { + modelITD->resamp_factor = RESAMPLE_FACTOR_32_48; + } + break; + case 16000: + model->AlphaL = (const float *) defaultHRIR_rom_AlphaL16; + model->AlphaR = (const float *) defaultHRIR_rom_AlphaR16; + model->EL = (const float *) defaultHRIR_rom_EL16; + model->ER = (const float *) defaultHRIR_rom_ER16; + model->K = 43; + if ( HrFiltSet_p->ModelParams.UseItdModel ) + { + modelITD->resamp_factor = RESAMPLE_FACTOR_16_48; + } + break; + default: + break; + } + + modelITD->N = 4; + modelITD->elevDim2 = 20; + modelITD->elevDim3 = 18; + modelITD->azimDim2 = 41; + modelITD->azimDim3 = 41; + modelITD->elevSegSamples = 3; + modelITD->elevBsLen[0] = 4; + modelITD->elevBsLen[1] = 7; + modelITD->elevBsLen[2] = 10; + modelITD->elevBsLen[3] = 7; + modelITD->elevBsStart[0] = 0; + modelITD->elevBsStart[1] = 4; + modelITD->elevBsStart[2] = 11; + modelITD->elevBsStart[3] = 21; + + modelITD->elevKSeq = defaultHRIR_rom_ITD_elevKSeq; + + modelITD->azimBsLen[0] = 11; + modelITD->azimBsLen[1] = 21; + modelITD->azimBsLen[2] = 31; + modelITD->azimBsLen[3] = 21; + modelITD->azimBsStart[0] = 0; + modelITD->azimBsStart[1] = 11; + modelITD->azimBsStart[2] = 32; + modelITD->azimBsStart[3] = 63; + + modelITD->azimSegSamples = 10; + + modelITD->azimKSeq = defaultHRIR_rom_ITD_azimKSeq; + modelITD->W = (const float *) defaultHRIR_rom_ITD_W; + modelITD->azimBsShape = (const float *) defaultHRIR_rom_ITD_azimBsShape; + modelITD->elevBsShape = (const float *) defaultHRIR_rom_ITD_elevBsShape; + + HRTF_model_precalc( model ); + + HrFiltSet_p->latency_s = defaultHRIR_rom_latency_s; + HrFiltSet_p->SampleRate = output_Fs; + HrFiltSet_p->FiltLength = HrFiltSet_p->ModelParams.K; + + if ( ( error = BSplineModelEvalAlloc( &HrFiltSet_p->ModelParams, &HrFiltSet_p->ModelEval ) ) != IVAS_ERR_OK ) + { + return error; + } + + return IVAS_ERR_OK; +} diff --git a/lib_rend/ivas_objectRenderer_sfx.c b/lib_rend/ivas_objectRenderer_sfx.c new file mode 100644 index 0000000000000000000000000000000000000000..fd1c44060f7256bd13b7950578c2071be276ba54 --- /dev/null +++ b/lib_rend/ivas_objectRenderer_sfx.c @@ -0,0 +1,288 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include +#include "ivas_prot_rend.h" +#include "ivas_rom_rend.h" +#include "prot.h" +#include "wmc_auto.h" + + +/*---------------------------------------------------------------------* + * Local constants + *---------------------------------------------------------------------*/ + + +/*---------------------------------------------------------------------* + * Local function prototypes + *---------------------------------------------------------------------*/ + +static void sincResample( const float *input, float *output, const int16_t length_in, const int16_t length_out ); + + +/*---------------------------------------------------------------------* + * TDREND_Apply_ITD() + * + * Apply ITD by delaying late channel + *---------------------------------------------------------------------*/ +void TDREND_Apply_ITD( + float *input, /* i : Input subframe to be time adjusted */ + float *out_left, /* o : Output left channel with ITD applied */ + float *out_right, /* o : Output right channel with ITD applied */ + int16_t *previtd, /* i/o: Previous ITD value */ + const int16_t itd, /* i : Current subframe ITD value */ + float *mem_itd, /* i/o: ITD buffer memory */ + const int16_t length /* i : Subframe length */ +) +{ + int16_t transition_len; + int16_t tlen1, tlen2, tlen3; + int16_t length_in1; + int16_t length_in2; + int16_t currShift; + int16_t prevShift; + float *pstart1; + float *pstart2; + float *pstart3; + float buffer[ITD_MEM_LEN + L_SUBFRAME5MS_48k]; + float *p_input; + float *out_buf_A, *out_buf_B; + + push_wmops( "TDREND_Apply_ITD" ); + + /* Prepare resampling buffer */ + mvr2r( mem_itd, buffer, ITD_MEM_LEN ); /* Retrieve memory */ + p_input = buffer + ITD_MEM_LEN; /* pointer to the current subframe */ + mvr2r( input, p_input, length ); /* input current subframe */ + mvr2r( buffer + length, mem_itd, ITD_MEM_LEN ); /* update memory for next frame */ + + currShift = (int16_t) abs( itd ); + prevShift = (int16_t) abs( *previtd ); + tlen3 = max( 0, SFX_SPAT_BIN_SINC_M - currShift ); /* Make sure there is enough look-ahead for the sinc resampling */ + transition_len = length - tlen3; + + if ( ( ( *previtd ) * itd ) < 0 ) + { + /* ITD sign change - apply shift on both channels */ + tlen1 = (int16_t) ( ( (float) ( transition_len * prevShift ) / ( (float) ( prevShift + currShift ) ) ) + 0.5f ); + tlen2 = transition_len - tlen1; + pstart1 = p_input - prevShift; + length_in1 = tlen1 + prevShift; + pstart2 = pstart1 + length_in1; + length_in2 = tlen2 - currShift; + pstart3 = pstart2 + length_in2; + } + else + { + /* ITD sign stays the same, or one of them is zero */ + tlen1 = transition_len; + tlen2 = 0; + pstart1 = p_input - prevShift; + length_in1 = transition_len + prevShift - currShift; + pstart2 = pstart1 + length_in1; + length_in2 = 0; + pstart3 = pstart2 + length_in2 + currShift; + } + + if ( *previtd == 0 ) + { + if ( itd > 0 ) + { + out_buf_A = out_right; + out_buf_B = out_left; + } + else + { + out_buf_A = out_left; + out_buf_B = out_right; + } + } + else + { + if ( *previtd > 0 ) + { + out_buf_A = out_right; + out_buf_B = out_left; + } + else + { + out_buf_A = out_left; + out_buf_B = out_right; + } + } + + /* Output buffer A */ + sincResample( pstart1, out_buf_A, length_in1, tlen1 ); + mvr2r( pstart2, out_buf_A + tlen1, length - tlen1 ); + + /* Output buffer B */ + mvr2r( p_input, out_buf_B, tlen1 ); + sincResample( pstart2, out_buf_B + tlen1, length_in2, tlen2 ); + mvr2r( pstart3, out_buf_B + transition_len, tlen3 ); + + *previtd = itd; + pop_wmops(); + return; +} + +/*---------------------------------------------------------------------* + * sincResample() + * + * Resample signal (stretch/compress) to new ITD + * The sinc resampling reads SFX_SPAT_BIN_SINC_M (5) samples outside of + * the target frame. + *---------------------------------------------------------------------*/ +static void sincResample( + const float *input, /*i : Input signal */ + float *output, /*o : Output signal */ + const int16_t length_in, /*i : Input length */ + const int16_t length_out /*i : Output length */ +) +{ + int16_t snc0; + int16_t i, j; + int16_t t; + float t_frac; + float t_step; + float tmp; + const float *p_mid; + const float *p_forward; + const float *p_backward; + const float *p_sinc_forward; + const float *p_sinc_backward; + + /* avoid division by 0 */ + if ( 0 == length_out ) + { + return; + } + + + /* Compute fractional time step */ + t_step = (float) ( length_in ) / (float) ( length_out ); + t_frac = 0; + + for ( i = 0; i < length_out; i++ ) + { + t = (int16_t) ( t_frac + EPSILON ); + + /* Calculate the sinc-index for the center value of the sinc */ + snc0 = (int16_t) ( ( t_frac - t + EPSILON ) * SFX_SPAT_BIN_NUM_SUBSAMPLES + 0.5f ); + + /* Run convolution forward and backward from mid point */ + p_mid = input + t; + p_forward = p_mid + 1; + p_backward = p_mid - 1; + p_sinc_forward = SincTable + SFX_SPAT_BIN_NUM_SUBSAMPLES - snc0; + p_sinc_backward = SincTable + SFX_SPAT_BIN_NUM_SUBSAMPLES + snc0; + + tmp = *p_mid * SincTable[snc0]; /* Middle point */ + for ( j = 0; j < SFX_SPAT_BIN_SINC_M - 1; j++ ) + { + tmp += ( *p_forward ) * ( *p_sinc_forward ) + ( *p_backward ) * ( *p_sinc_backward ); + p_sinc_forward += SFX_SPAT_BIN_NUM_SUBSAMPLES; + p_sinc_backward += SFX_SPAT_BIN_NUM_SUBSAMPLES; + p_forward++; + p_backward--; + } + tmp += ( *p_forward ) * ( *p_sinc_forward ); /* Integer index always rounded down --> 4 steps backward, 5 steps forward */ + + output[i] = tmp; + + /* Advance fractional time */ + t_frac += t_step; + } + + return; +} + +/*-------------------------------------------------------------------* + * TDREND_firfilt() + * + * FIR filtering function + * + --------------------------------------------------------------------*/ + +void TDREND_firfilt( + float *signal, /* i/o: Input signal / Filtered signal */ + float *filter, /* i/o: FIR filter */ + const float *filter_delta, /* i : FIR filter delta */ + const int16_t intp_count, /* i : interpolation count */ + float *mem, /* i/o: filter memory */ + const int16_t subframe_length, /* i : Length of signal */ + const int16_t filterlength, /* i : Filter length */ + const float Gain, /* i : Gain */ + const float prevGain /* i : Previous gain */ +) +{ + float buffer[SFX_SPAT_BIN_MAX_FILTER_LENGTH - 1 + L_SUBFRAME5MS_48k]; + float *p_signal; + float *p_tmp; + float *p_filter; + float tmp; + int16_t i, j; + float step, gain_tmp, gain_delta; + + gain_delta = ( Gain - prevGain ); + step = gain_delta / ( subframe_length ); + gain_tmp = prevGain; + + /* Handle memory */ + p_signal = buffer + filterlength - 1; + mvr2r( mem, buffer, filterlength - 1 ); /* Insert memory */ + mvr2r( signal, buffer + filterlength - 1, subframe_length ); /* Insert current frame */ + mvr2r( signal + subframe_length - filterlength + 1, mem, filterlength - 1 ); /* Update memory for next frame */ + + /* Convolution */ + for ( i = 0; i < subframe_length; i++ ) + { + tmp = 0.0f; + p_tmp = p_signal + i; + p_filter = filter; + for ( j = 0; j < filterlength; j++ ) + { + tmp += ( *p_filter++ ) * ( *p_tmp-- ); + } + /* Apply linear gain interpolation in case of abrupt gain changes */ + gain_tmp = gain_tmp + step; + signal[i] = tmp * gain_tmp; + + if ( i < intp_count ) + { + v_add( filter, filter_delta, filter, filterlength ); + } + } + + return; +} diff --git a/lib_rend/ivas_objectRenderer_sources.c b/lib_rend/ivas_objectRenderer_sources.c new file mode 100644 index 0000000000000000000000000000000000000000..5d948cab80a7b706f08a1b24206667bb62b7fba7 --- /dev/null +++ b/lib_rend/ivas_objectRenderer_sources.c @@ -0,0 +1,687 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include +#include "prot.h" +#include "ivas_prot_rend.h" +#include "wmc_auto.h" + + +/*---------------------------------------------------------------------* + * Local function prototypes + *---------------------------------------------------------------------*/ + +static void TDREND_SRC_SPATIAL_Dealloc( TDREND_SRC_SPATIAL_t *SrcSpatial_p ); + +static void TDREND_SRC_SPATIAL_Init( TDREND_SRC_SPATIAL_t *SrcSpatial_p, const TDREND_PosType_t PosType ); + +static void TDREND_SRC_SPATIAL_SetDirAtten( TDREND_SRC_SPATIAL_t *SrcSpatial_p, const TDREND_DirAtten_t *DirAtten_p ); + +static float TDREND_SRC_SPATIAL_GetDirGain( const TDREND_DirAtten_t *DirAtten_p, const float *Front_p, const float *RelPos_p ); + +static float TDREND_SRC_SPATIAL_GetDistGain( const TDREND_DistAtten_t *DistAtten_p, const float Dist ); + +static ivas_error TDREND_SRC_REND_Alloc( TDREND_SRC_REND_t **SrcRend_pp ); + +static void TDREND_SRC_REND_Init( TDREND_SRC_REND_t *SrcRend_p ); + + +/*-------------------------------------------------------------------* + * TDREND_MIX_SRC_SetPos() + * + * Set source position + --------------------------------------------------------------------*/ + +ivas_error TDREND_MIX_SRC_SetPos( + BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ + const int16_t SrcInd, /* i : Source index */ + const float *Vec_p /* i : Position vector */ +) +{ + TDREND_SRC_SPATIAL_t *SrcSpatial_p; + + if ( SrcInd > hBinRendererTd->MaxSrcInd ) + { + return ( IVAS_ERROR( IVAS_ERR_INVALID_INDEX, "Index exceeds max index!\n" ) ); + } + else + { + SrcSpatial_p = hBinRendererTd->Sources[SrcInd]->SrcSpatial_p; + + if ( SrcSpatial_p->Pos_p[0] != Vec_p[0] || SrcSpatial_p->Pos_p[1] != Vec_p[1] || SrcSpatial_p->Pos_p[2] != Vec_p[2] ) + { + mvr2r( Vec_p, SrcSpatial_p->Pos_p, 3 ); + SrcSpatial_p->Updated = TRUE; + } + } + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * TDREND_MIX_SRC_SetDir() + * + * Set source direction + --------------------------------------------------------------------*/ + +ivas_error TDREND_MIX_SRC_SetDir( + BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ + const int16_t SrcInd, /* i : Source index */ + const float *Vec_p /* i : Direction vector */ +) +{ + TDREND_SRC_SPATIAL_t *SrcSpatial_p; + + /* Value verification */ + if ( ( Vec_p[0] == 0.0f ) && ( Vec_p[1] == 0.0f ) && ( Vec_p[2] == 0.0f ) ) + { + return ( IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Zero direction vector. Command is ignored!\n" ) ); + } + if ( SrcInd > hBinRendererTd->MaxSrcInd ) + { + return ( IVAS_ERROR( IVAS_ERR_INVALID_INDEX, "Index exceeds max index!\n" ) ); + } + else + { + SrcSpatial_p = hBinRendererTd->Sources[SrcInd]->SrcSpatial_p; + TDREND_SPATIAL_VecNormalize( Vec_p, SrcSpatial_p->Front_p ); + SrcSpatial_p->Updated = TRUE; + } + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * TDREND_MIX_SRC_SetDirAtten() + * + * Set directional attenuation for the mixer. + --------------------------------------------------------------------*/ + +ivas_error TDREND_MIX_SRC_SetDirAtten( + BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ + const int16_t SrcInd, /* i : Source index */ + const TDREND_DirAtten_t *DirAtten_p /* i : Directional attenuation specifier */ +) +{ + TDREND_SRC_SPATIAL_t *SrcSpatial_p; + if ( SrcInd > hBinRendererTd->MaxSrcInd ) + { + return ( IVAS_ERROR( IVAS_ERR_INVALID_INDEX, "Index exceeds max index\n" ) ); + } + else + { + SrcSpatial_p = hBinRendererTd->Sources[SrcInd]->SrcSpatial_p; + TDREND_SRC_SPATIAL_SetDirAtten( SrcSpatial_p, DirAtten_p ); + } + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * TDREND_MIX_SRC_SetPlayState() + * + * Set play state for the source. + --------------------------------------------------------------------*/ + +ivas_error TDREND_MIX_SRC_SetPlayState( + BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ + const int16_t SrcInd, /* i : Source index */ + const TDREND_PlayStatus_t PlayStatus /* i : Play state */ +) +{ + if ( SrcInd > hBinRendererTd->MaxSrcInd ) + { + return ( IVAS_ERROR( IVAS_ERR_INVALID_INDEX, "Index exceeds max index\n" ) ); + } + else + { + hBinRendererTd->Sources[SrcInd]->SrcRend_p->PlayStatus = PlayStatus; + } + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * TDREND_SRC_REND_Alloc() + * + * Renderer allocation + --------------------------------------------------------------------*/ + +static ivas_error TDREND_SRC_REND_Alloc( + TDREND_SRC_REND_t **SrcRend_pp /* i/o: Source object */ +) +{ + TDREND_SRC_REND_t *SrcRend_p; + + *SrcRend_pp = NULL; + + /* Allocate the TDREND_SRC_REND_t variable */ + if ( ( SrcRend_p = (TDREND_SRC_REND_t *) malloc( sizeof( TDREND_SRC_REND_t ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "SrcRend_p allocation error\n" ) ); + } + + *SrcRend_pp = SrcRend_p; + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * TDREND_SRC_REND_Init() + * + * Initialize rendering aspects of source. + --------------------------------------------------------------------*/ + +static void TDREND_SRC_REND_Init( + TDREND_SRC_REND_t *SrcRend_p /* i/o: Source object */ +) +{ + int16_t nC; + + /* Internal state */ + SrcRend_p->InputAvailable = FALSE; + SrcRend_p->PlayStatus = TDREND_PLAYSTATUS_PLAYING; + /* SrcGain */ + for ( nC = 0; nC < SPAT_BIN_MAX_INPUT_CHANNELS; nC++ ) + { + SrcRend_p->SrcGainMin_p[nC] = 0.0f; + SrcRend_p->SrcGain_p[nC] = 1.0f; + SrcRend_p->SrcGainMax_p[nC] = 1.0f; + } + SrcRend_p->SrcGainUpdated = FALSE; + + /* Init directional and distance gains */ + for ( nC = 0; nC < SPAT_BIN_MAX_INPUT_CHANNELS; nC++ ) + { + SrcRend_p->DirGain_p[nC] = 1.0f; + SrcRend_p->DistGain_p[nC] = 1.0f; + } + + + return; +} + + +/*-------------------------------------------------------------------* + * TDREND_SRC_REND_UpdateFiltersFromSpatialParams() + * + * Update the HR filter due to spatial change. + --------------------------------------------------------------------*/ + +void TDREND_SRC_REND_UpdateFiltersFromSpatialParams( + BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ + TDREND_SRC_REND_t *SrcRend_p, /* i/o: Source object */ + TDREND_SRC_SPATIAL_t *SrcSpatial_p, /* i : Spatial aspects of source */ + float *hrf_left_prev, /* o : Left filter */ + float *hrf_right_prev, /* o : Right filter */ + float *hrf_left_delta, /* o : Left filter interpolation delta */ + float *hrf_right_delta, /* o : Right filter interpolation delta */ + int16_t *intp_count, /* o : Interpolation count */ + int16_t *filterlength, /* o : Length of filters */ + int16_t *itd, /* o : ITD value */ + float *Gain, /* o : Gain value */ + TDREND_SRC_t *Src_p, /* i/o: Source pointer */ + const int16_t subframe_update_flag ) +{ + TDREND_MIX_Listener_t *Listener_p; + TDREND_HRFILT_FiltSet_t *HrFiltSet_p; + float ListRelPos[3], ListRelDist; + float ListRelPosAbs[3]; /* Relative position, ignoring orientation of listener */ + float Azim, Elev; + float hrf_left[SFX_SPAT_BIN_MAX_FILTER_LENGTH]; + float hrf_right[SFX_SPAT_BIN_MAX_FILTER_LENGTH]; + float azim_delta; + float elev_delta; + + /* Evaluate the HR filters from the source and listener positions and orientations */ + Listener_p = hBinRendererTd->Listener_p; + HrFiltSet_p = hBinRendererTd->HrFiltSet_p; + + *filterlength = min( HrFiltSet_p->FiltLength, SFX_SPAT_BIN_MAX_FILTER_LENGTH ); + + if ( SrcSpatial_p->PosType == TDREND_POSTYPE_ABSOLUTE ) + { + + /* Absolute position */ + TDREND_SPATIAL_VecMapToNewCoordSystem( SrcSpatial_p->Pos_p, Listener_p->Pos, Listener_p->Front, Listener_p->Up, Listener_p->Right, ListRelPos, ListRelPosAbs ); + ListRelDist = TDREND_SPATIAL_VecNorm( ListRelPos ); + + /* 2. Evaluate the Elevation and Azimuth angles */ + if ( ( ListRelPos[0] == 0 ) && ( ListRelPos[1] == 0 ) && ( ListRelPos[2] == 0 ) ) + { + Elev = 0.0; + Azim = 0.0; + } + else + { + Elev = _180_OVER_PI * atan2f( ListRelPos[2], sqrtf( ListRelPos[0] * ListRelPos[0] + ListRelPos[1] * ListRelPos[1] ) ); + /* Basis set is [front, right, up], which is a left-handed coordinate system. Minus sign here is to change to a positive-left system for azimuth */ + Azim = -1.0f * _180_OVER_PI * (float) atan2f( ListRelPos[1], ListRelPos[0] ); + } + + GetFilterFromAngle( HrFiltSet_p, Elev, Azim, *filterlength, hrf_left, hrf_right, itd ); + + /* 6. Evaluate the directional and distance gains */ + /* Directional gain */ + *SrcRend_p->DirGain_p = 1.0f; + if ( SrcSpatial_p->DirAttenEnabled ) + { + *SrcRend_p->DirGain_p = TDREND_SRC_SPATIAL_GetDirGain( &SrcSpatial_p->DirAtten, SrcSpatial_p->Front_p, ListRelPosAbs ); + } + + /* Distance gain */ + *SrcRend_p->DistGain_p = 1.0f; + if ( hBinRendererTd->UseCommonDistAttenModel ) + { + if ( hBinRendererTd->DistAttenEnabled ) + { + SrcSpatial_p->DistAtten.DistAttenModel = hBinRendererTd->DistAttenModel; + *SrcRend_p->DistGain_p = TDREND_SRC_SPATIAL_GetDistGain( &SrcSpatial_p->DistAtten, ListRelDist ); + } + } + else + { + if ( SrcSpatial_p->DistAttenEnabled ) + { + *SrcRend_p->DistGain_p = TDREND_SRC_SPATIAL_GetDistGain( &SrcSpatial_p->DistAtten, ListRelDist ); + } + } + + /* Update total gains */ + *Gain = ( *SrcRend_p->SrcGain_p ) * ( *SrcRend_p->DirGain_p ) * ( *SrcRend_p->DistGain_p ) * hBinRendererTd->Gain; + + /* Delta for interpolation, in case the angular step exceeds MAX_ANGULAR_STEP */ + elev_delta = Elev - Src_p->elev_prev; + azim_delta = Azim - Src_p->azim_prev; + Src_p->elev_prev = Elev; + Src_p->azim_prev = Azim; + + azim_delta = ( azim_delta > 180.0f ) ? ( azim_delta - 360 ) : ( ( azim_delta < -180.0f ) ? ( azim_delta + 360 ) : ( azim_delta ) ); /* map to -180:180 range */ + *intp_count = min( MAX_INTERPOLATION_STEPS, max( (int16_t) ( fabsf( azim_delta ) * MAX_ANGULAR_STEP_INV ), (int16_t) ( fabsf( elev_delta ) * MAX_ANGULAR_STEP_INV ) ) ); + } + else /* TDREND_POSTYPE_NON_DIEGETIC */ + { + *itd = 0; + *Gain = 1.0f; + set_f( hrf_left, 0.0f, *filterlength ); + set_f( hrf_right, 0.0f, *filterlength ); + hrf_left[0] = ( SrcSpatial_p->Pos_p[1] + 1.f ) * 0.5f; + hrf_right[0] = 1.f - hrf_left[0]; + *intp_count = MAX_INTERPOLATION_STEPS; + Src_p->elev_prev = 0; + Src_p->azim_prev = 360.0f; /* Dummy angle -- sets max interpolation if switching to TDREND_POSTYPE_ABSOLUTE */ + } + + if ( ( *intp_count > 0 ) && subframe_update_flag ) + { + /* Set deltas for interpolation */ + v_sub( hrf_left, hrf_left_prev, hrf_left_delta, *filterlength ); + v_multc( hrf_left_delta, 1.0f / *intp_count, hrf_left_delta, *filterlength ); + v_sub( hrf_right, hrf_right_prev, hrf_right_delta, *filterlength ); + v_multc( hrf_right_delta, 1.0f / *intp_count, hrf_right_delta, *filterlength ); + } + else + { + /* No interpolation, just set the new filters and reset deltas */ + mvr2r( hrf_left, hrf_left_prev, *filterlength ); + mvr2r( hrf_right, hrf_right_prev, *filterlength ); + set_f( hrf_left_delta, 0.0f, *filterlength ); + set_f( hrf_right_delta, 0.0f, *filterlength ); + } + + return; +} + + +/*-------------------------------------------------------------------* + * TDREND_SRC_SPATIAL_Alloc() + * + * Allocatie spatial properties of a source. + --------------------------------------------------------------------*/ + +static ivas_error TDREND_SRC_SPATIAL_Alloc( + TDREND_SRC_SPATIAL_t **SrcSpatial_pp /* i/o: Source spatial parameters */ +) +{ + TDREND_SRC_SPATIAL_t *SrcSpatial_p; + + *SrcSpatial_pp = NULL; + + /* Allocate the TDREND_SRC_t variable */ + if ( ( SrcSpatial_p = (TDREND_SRC_SPATIAL_t *) malloc( sizeof( TDREND_SRC_SPATIAL_t ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "TDREND_SRC_SPATIAL_t allocation error\n" ) ); + } + + *SrcSpatial_pp = SrcSpatial_p; + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * TDREND_SRC_SPATIAL_Dealloc() + * + * Deallocate spatial properties of a source. + --------------------------------------------------------------------*/ + +static void TDREND_SRC_SPATIAL_Dealloc( + TDREND_SRC_SPATIAL_t *SrcSpatial_p /* i/o: Source spatial parameters */ +) +{ + if ( SrcSpatial_p == NULL ) + { + return; + } + /* Free the SrcSpatial_p variable */ + free( SrcSpatial_p ); + SrcSpatial_p = NULL; + + return; +} + + +/*-------------------------------------------------------------------* + * TDREND_SRC_SPATIAL_Init() + * + * Initialize spatial properties of a source. + --------------------------------------------------------------------*/ + +static void TDREND_SRC_SPATIAL_Init( + TDREND_SRC_SPATIAL_t *SrcSpatial_p, /* i/o: Source spatial parameters */ + const TDREND_PosType_t PosType /* i : Relative/absolute position type */ +) +{ + int16_t nC; + + /* Initialize variables */ + SrcSpatial_p->Updated = FALSE; + + /* Source position, velocity and direction vectors */ + SrcSpatial_p->PosType = PosType; + for ( nC = 0; nC < SPAT_BIN_MAX_INPUT_CHANNELS; nC++ ) + { + /* Source position */ + TDREND_SPATIAL_VecInit( SrcSpatial_p->Pos_p + nC * 3, 0.0f, 0.0f, 0.0f ); + + /* Source direction */ + TDREND_SPATIAL_VecInit( SrcSpatial_p->Front_p + nC * 3, 0.0f, 0.0f, 1.0f ); + } + + /* Source directional attenuation */ + SrcSpatial_p->DirAttenEnabled = FALSE; + SrcSpatial_p->DirAtten.ConeInnerAngle = 360.0f; + SrcSpatial_p->DirAtten.ConeOuterAngle = 360.0f; + SrcSpatial_p->DirAtten.ConeOuterGain = 1.0f; + + /* Source distance attenuation */ + SrcSpatial_p->DistAttenEnabled = FALSE; + SrcSpatial_p->DistAtten.DistAttenModel = TDREND_DIST_ATTEN_MODEL_INV_DIST_CLAMPED; + SrcSpatial_p->DistAtten.RefDist = 1.0f; + SrcSpatial_p->DistAtten.MaxDist = 15.75f; /* Maximum radius (2^ISM_RADIUS_NBITS-1)*0.25 */ + SrcSpatial_p->DistAtten.RollOffFactor = 1.0f; + + return; +} + + +/*-------------------------------------------------------------------* + * TDREND_SRC_SPATIAL_SetDirAtten() + * + * Sets the directional attenuation mode. + --------------------------------------------------------------------*/ + +static void TDREND_SRC_SPATIAL_SetDirAtten( + TDREND_SRC_SPATIAL_t *SrcSpatial_p, /* i/o: Source spatial parameters */ + const TDREND_DirAtten_t *DirAtten_p /* i : Directionality specification */ +) +{ + /* Set directional attenuation */ + SrcSpatial_p->DirAttenEnabled = TRUE; + SrcSpatial_p->DirAtten.ConeInnerAngle = DirAtten_p->ConeInnerAngle; + SrcSpatial_p->DirAtten.ConeOuterAngle = DirAtten_p->ConeOuterAngle; + SrcSpatial_p->DirAtten.ConeOuterGain = DirAtten_p->ConeOuterGain; + + return; +} + + +/*-------------------------------------------------------------------* + * TDREND_SRC_SPATIAL_GetDirGain() + * + * Returns the gain due to object orientation. + --------------------------------------------------------------------*/ + +/*! r: Gain value */ +static float TDREND_SRC_SPATIAL_GetDirGain( + const TDREND_DirAtten_t *DirAtten_p, /* i : Directional attenuation specification */ + const float *Front_p, /* i : Front-pointing vector */ + const float *RelPos_p /* i : Relative position */ +) +{ + float DirGain; + float Vec[3]; + float ProjCoef, NormRelPos; + float AngleDeg; + + DirGain = 1.0f; + + /* Note that the front vector is unit norm, thus */ + /* Angle = acos ( Proj coeff from projecting -RelPos onto Front / norm(RelPos) ); */ + v_multc( RelPos_p, -1, Vec, 3 ); + ProjCoef = dotp( Vec, Front_p, 3 ); + NormRelPos = TDREND_SPATIAL_VecNorm( RelPos_p ); + + if ( NormRelPos != 0.0f ) + { + AngleDeg = _180_OVER_PI * acosf( ProjCoef / NormRelPos ); + } + else + { + AngleDeg = 0.0f; + } + + if ( 2.0f * AngleDeg <= DirAtten_p->ConeInnerAngle ) + { + DirGain = 1.0f; + } + else if ( 2.0f * AngleDeg <= DirAtten_p->ConeOuterAngle ) + { + DirGain = 1.0f - ( 2.0f * AngleDeg - DirAtten_p->ConeInnerAngle ) / ( DirAtten_p->ConeOuterAngle - DirAtten_p->ConeInnerAngle ) * ( 1.0f - DirAtten_p->ConeOuterGain ); + } + else + { + DirGain = DirAtten_p->ConeOuterGain; + } + + return DirGain; +} + + +/*-------------------------------------------------------------------* + * TDREND_SRC_SPATIAL_GetDistGain() + * + * Returns the gain due to distance. + --------------------------------------------------------------------*/ + +/*! r: Gain value */ +static float TDREND_SRC_SPATIAL_GetDistGain( + const TDREND_DistAtten_t *DistAtten_p, /* i : Distance attenuation parameters */ + const float Dist /* i : Distance value */ +) +{ + float DistGain; + float Dist2; + + DistGain = 1.0f; + Dist2 = Dist; + + switch ( DistAtten_p->DistAttenModel ) + { + case TDREND_DIST_ATTEN_MODEL_INV_DIST: + DistGain = DistAtten_p->RefDist / ( DistAtten_p->RefDist + DistAtten_p->RollOffFactor * ( Dist2 - DistAtten_p->RefDist ) ); + break; + + case TDREND_DIST_ATTEN_MODEL_INV_DIST_CLAMPED: + if ( Dist2 < DistAtten_p->RefDist ) + { + Dist2 = DistAtten_p->RefDist; + } + + if ( Dist2 > DistAtten_p->MaxDist ) + { + Dist2 = DistAtten_p->MaxDist; + } + + DistGain = DistAtten_p->RefDist / ( DistAtten_p->RefDist + DistAtten_p->RollOffFactor * ( Dist2 - DistAtten_p->RefDist ) ); + break; + } + + return DistGain; +} + + +/*-------------------------------------------------------------------* + * TDREND_SRC_Alloc() + * + * Allocate a source. + --------------------------------------------------------------------*/ + +ivas_error TDREND_SRC_Alloc( + TDREND_SRC_t **Src_pp /* i/o: Source */ +) +{ + ivas_error error; + TDREND_SRC_t *Src_p; + + error = IVAS_ERR_OK; + + *Src_pp = NULL; + + /* Allocate the TDREND_SRC_t variable */ + if ( ( Src_p = (TDREND_SRC_t *) malloc( sizeof( TDREND_SRC_t ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, " TDREND_SRC_Alloc: Allocation error\n" ) ); + } + + Src_p->SrcSpatial_p = NULL; + /* If source type is dynamic alloc the TDREND_SRC_SPATIAL_t variable */ + if ( ( error = TDREND_SRC_SPATIAL_Alloc( &Src_p->SrcSpatial_p ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = TDREND_SRC_REND_Alloc( &Src_p->SrcRend_p ) ) != IVAS_ERR_OK ) + { + return error; + } + + *Src_pp = Src_p; + + return error; +} + + +/*-------------------------------------------------------------------* + * TDREND_SRC_Dealloc() + * + * Deallocate a source. + --------------------------------------------------------------------*/ + +void TDREND_SRC_Dealloc( + TDREND_SRC_t *Src_p ) +{ + if ( Src_p == NULL ) + { + return; + } + + /* Delloc the TDREND_SRC_Spatial_t variable */ + TDREND_SRC_SPATIAL_Dealloc( Src_p->SrcSpatial_p ); + + /* Delloc the TDREND_SRC_REND__t variable */ + free( Src_p->SrcRend_p ); + Src_p->SrcRend_p = NULL; + + /* Free the Src_p variable */ + free( Src_p ); + Src_p = NULL; + + return; +} + + +/*-------------------------------------------------------------------* + * TDREND_SRC_Init() + * + * Initializes a source. + --------------------------------------------------------------------*/ + +void TDREND_SRC_Init( + TDREND_SRC_t *Src_p, /* i/o: Source to initialize */ + const TDREND_PosType_t PosType /* i : Position type specifier */ +) +{ + /* Init the TDREND_SRC_Spatial_t variable */ + if ( Src_p->SrcSpatial_p != NULL ) + { + TDREND_SRC_SPATIAL_Init( Src_p->SrcSpatial_p, PosType ); + } + + /* Init the TDREND_SRC_REND_t variable */ + TDREND_SRC_REND_Init( Src_p->SrcRend_p ); + + /* Reset memory buffers */ + Src_p->itd = 0; + Src_p->previtd = 0; + Src_p->filterlength = 1; /* Init to unit impulse of length 1 */ + set_f( Src_p->mem_itd, 0.0f, ITD_MEM_LEN ); + set_f( Src_p->mem_hrf_left, 0.0f, SFX_SPAT_BIN_MAX_FILTER_LENGTH - 1 ); + set_f( Src_p->mem_hrf_right, 0.0f, SFX_SPAT_BIN_MAX_FILTER_LENGTH - 1 ); + + set_f( Src_p->hrf_left_prev, 0.0f, SFX_SPAT_BIN_MAX_FILTER_LENGTH ); + set_f( Src_p->hrf_right_prev, 0.0f, SFX_SPAT_BIN_MAX_FILTER_LENGTH ); + Src_p->hrf_left_prev[0] = 1; + Src_p->hrf_right_prev[0] = 1; + Src_p->azim_prev = 0.0f; + Src_p->elev_prev = 0.0f; + Src_p->Gain = 1; + Src_p->prevGain = 1.0f; + + return; +} diff --git a/lib_rend/ivas_objectRenderer_vec.c b/lib_rend/ivas_objectRenderer_vec.c new file mode 100644 index 0000000000000000000000000000000000000000..0abde03891c24a07b871946c6a7c8c584d31e83c --- /dev/null +++ b/lib_rend/ivas_objectRenderer_vec.c @@ -0,0 +1,178 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include +#include "prot.h" +#include "ivas_prot_rend.h" +#include "wmc_auto.h" + + +/*-------------------------------------------------------------------* + * TDREND_SPATIAL_VecInit() + * + * Initialize 3-dim vector + *-------------------------------------------------------------------*/ + +void TDREND_SPATIAL_VecInit( + float *Pos_p, /* o : Output vector */ + const float PosX, /* i : X value */ + const float PosY, /* i : Y value */ + const float PosZ /* i : Z value */ +) +{ + Pos_p[0] = PosX; + Pos_p[1] = PosY; + Pos_p[2] = PosZ; + + return; +} + + +/*-------------------------------------------------------------------* + * TDREND_SPATIAL_VecNorm() + * + * Compute Euclidian norm of vector + *-------------------------------------------------------------------*/ + +/*! r: Euclidian norm value */ +float TDREND_SPATIAL_VecNorm( + const float *Vec_p /* i : Vector for norm calculation */ +) +{ + return sqrtf( Vec_p[0] * Vec_p[0] + Vec_p[1] * Vec_p[1] + Vec_p[2] * Vec_p[2] ); +} + + +/*-------------------------------------------------------------------* + * TDREND_SPATIAL_VecNormalize() + * + * Normalize vector to unit norm + *-------------------------------------------------------------------*/ + +void TDREND_SPATIAL_VecNormalize( + const float *Vec_p, /* i : Input vector */ + float *VecNorm_p /* o : Output vector */ +) +{ + float scaler; + + scaler = inv_sqrt( Vec_p[0] * Vec_p[0] + Vec_p[1] * Vec_p[1] + Vec_p[2] * Vec_p[2] ); + VecNorm_p[0] = scaler * Vec_p[0]; + VecNorm_p[1] = scaler * Vec_p[1]; + VecNorm_p[2] = scaler * Vec_p[2]; + + return; +} + + +/*-------------------------------------------------------------------* + * TDREND_SPATIAL_VecMapToNewCoordSystem() + * + * Transform vector to new coordinate system + *-------------------------------------------------------------------*/ + +void TDREND_SPATIAL_VecMapToNewCoordSystem( + const float *Vec_p, /* i : Input vector */ + const float *TranslVec_p, /* i : Translation vector */ + const float *DirVec_p, /* i : Direction vector */ + const float *UpVec_p, /* i : Up vector */ + const float *RightVec_p, /* i : Right vector */ + float *MappedVec_p, /* o : Transformed vector */ + float *LisRelPosAbs /* o : Transformed vector ignoring orientation */ +) +{ + v_sub( Vec_p, TranslVec_p, LisRelPosAbs, 3 ); + /* Evalute the relative Vec in the coordinates of the Orientation vectors, */ + /* which form an orthonormal basis */ + MappedVec_p[0] = dotp( LisRelPosAbs, DirVec_p, 3 ); + MappedVec_p[1] = dotp( LisRelPosAbs, RightVec_p, 3 ); + MappedVec_p[2] = dotp( LisRelPosAbs, UpVec_p, 3 ); + return; +} + + +/*-------------------------------------------------------------------* + * TDREND_SPATIAL_EvalOrthonormOrient() + * + * Evaluate the normalized orientation vectors + *-------------------------------------------------------------------*/ + +/*! r: Flag if the orientation has been updated */ +int16_t TDREND_SPATIAL_EvalOrthonormOrient( + float *FrontVecON_p, /* o : Normalized front vector */ + float *UpVecON_p, /* o : Normalized up vector */ + float *RightVecON_p, /* o : Normalized right vector */ + const float *FrontVec_p, /* i : Input front vector */ + const float *UpVec_p /* i : Input up vector */ +) +{ + float tmp[9]; + int16_t orientation_updated; + + orientation_updated = FALSE; + + /* Store current state to detect change */ + mvr2r( FrontVecON_p, tmp, 3 ); + mvr2r( RightVecON_p, tmp + 3, 3 ); + mvr2r( UpVecON_p, tmp + 6, 3 ); + + /* Evaluate the normalized front vector */ + TDREND_SPATIAL_VecNormalize( FrontVec_p, FrontVecON_p ); + + /* Evaluate the orthonormal right vector */ + /* through the cross product of the front and the up vectors */ + RightVecON_p[0] = FrontVecON_p[1] * UpVec_p[2] - FrontVecON_p[2] * UpVec_p[1]; + RightVecON_p[1] = FrontVecON_p[2] * UpVec_p[0] - FrontVecON_p[0] * UpVec_p[2]; + RightVecON_p[2] = FrontVecON_p[0] * UpVec_p[1] - FrontVecON_p[1] * UpVec_p[0]; + + TDREND_SPATIAL_VecNormalize( RightVecON_p, RightVecON_p ); + + /* Evaluate the orthonormal up vector */ + /* through the cross product of the front and the right vectors */ + UpVecON_p[0] = RightVecON_p[1] * FrontVecON_p[2] - RightVecON_p[2] * FrontVecON_p[1]; + UpVecON_p[1] = RightVecON_p[2] * FrontVecON_p[0] - RightVecON_p[0] * FrontVecON_p[2]; + UpVecON_p[2] = RightVecON_p[0] * FrontVecON_p[1] - RightVecON_p[1] * FrontVecON_p[0]; + + TDREND_SPATIAL_VecNormalize( UpVecON_p, UpVecON_p ); + + /* Check if vectors have been changed */ + if ( FrontVecON_p[0] != tmp[0] || FrontVecON_p[1] != tmp[1] || FrontVecON_p[2] != tmp[2] || + RightVecON_p[0] != tmp[3] || RightVecON_p[1] != tmp[4] || RightVecON_p[2] != tmp[5] || + UpVecON_p[0] != tmp[6] || UpVecON_p[1] != tmp[7] || UpVecON_p[2] != tmp[8] ) + { + orientation_updated = TRUE; + } + + return orientation_updated; +} diff --git a/lib_rend/ivas_omasa_ana.c b/lib_rend/ivas_omasa_ana.c new file mode 100644 index 0000000000000000000000000000000000000000..460beddc6b838faef7f26bd55628943a2d24be1d --- /dev/null +++ b/lib_rend/ivas_omasa_ana.c @@ -0,0 +1,605 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include "options.h" +#include +#include +#include "ivas_cnst.h" +#include "ivas_prot_rend.h" +#include "ivas_prot.h" +#include "prot.h" +#include "ivas_stat_rend.h" +#include "ivas_rom_com.h" +#include "wmc_auto.h" + + +/*------------------------------------------------------------------------- + * Local function prototypes + *------------------------------------------------------------------------*/ + +static void ivas_omasa_param_est_ana( OMASA_ANA_HANDLE hOMasa, float data_f[][L_FRAME48k], float elevation_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], float azimuth_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], float energyRatio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], float spreadCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], float surroundingCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], const int16_t input_frame, const int16_t nchan_ism ); + +static void ivas_omasa_dmx( float data_in_f[][L_FRAME48k], const int16_t input_frame, const int16_t nchan_transport, const int16_t nchan_ism, const float ism_azimuth[MAX_NUM_OBJECTS], const float ism_elevation[MAX_NUM_OBJECTS], float prev_gains[][MASA_MAX_TRANSPORT_CHANNELS], const float interpolator[L_FRAME48k] ); + + +/*--------------------------------------------------------------------------* + * ivas_omasa_ana_open() + * + * Allocate and initialize OMASA handle + *--------------------------------------------------------------------------*/ + +ivas_error ivas_omasa_ana_open( + OMASA_ANA_HANDLE *hOMasaPtr, /* i/o: OMASA data handle pointer */ + int32_t input_Fs, /* i : Sampling frequency */ + uint16_t total_num_objects /* i : Number of objects */ +) +{ + int16_t i, j; + OMASA_ANA_HANDLE hOMasa; + int16_t numAnalysisChannels; + int16_t maxBin, input_frame; + ivas_error error; + + error = IVAS_ERR_OK; + + if ( ( hOMasa = (OMASA_ANA_HANDLE) malloc( sizeof( OMASA_ANA_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for OMASA\n" ) ); + } + + numAnalysisChannels = (int16_t) total_num_objects; + + /* Determine the number of bands */ + hOMasa->nbands = MASA_FREQUENCY_BANDS; + + /* Determine band grouping */ + mvs2s( MASA_band_grouping_24, hOMasa->band_grouping, 24 + 1 ); + + maxBin = (int16_t) ( input_Fs * INV_CLDFB_BANDWIDTH + 0.5f ); + for ( i = 1; i < hOMasa->nbands + 1; i++ ) + { + if ( hOMasa->band_grouping[i] >= maxBin ) + { + hOMasa->band_grouping[i] = maxBin; + hOMasa->nbands = i; + break; + } + } + + /* Determine block grouping */ + mvs2s( DirAC_block_grouping, hOMasa->block_grouping, MAX_PARAM_SPATIAL_SUBFRAMES + 1 ); + + /* open/initialize CLDFB */ + hOMasa->num_Cldfb_instances = numAnalysisChannels; + for ( i = 0; i < hOMasa->num_Cldfb_instances; i++ ) + { + if ( ( error = openCldfb( &( hOMasa->cldfbAnaEnc[i] ), CLDFB_ANALYSIS, input_Fs, CLDFB_PROTOTYPE_5_00MS ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + for ( ; i < MAX_NUM_OBJECTS; i++ ) + { + hOMasa->cldfbAnaEnc[i] = NULL; + } + + /* intensity 3-dim */ + for ( i = 0; i < DIRAC_NUM_DIMS; i++ ) + { + if ( ( hOMasa->direction_vector_m[i] = (float **) malloc( MAX_PARAM_SPATIAL_SUBFRAMES * sizeof( float * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for OMASA data\n" ) ); + } + + for ( j = 0; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++ ) + { + if ( ( hOMasa->direction_vector_m[i][j] = (float *) malloc( MASA_FREQUENCY_BANDS * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for OMASA data\n" ) ); + } + set_zero( hOMasa->direction_vector_m[i][j], MASA_FREQUENCY_BANDS ); + } + } + + for ( i = 0; i < DIRAC_NUM_DIMS; i++ ) + { + for ( j = 0; j < DIRAC_NO_COL_AVG_DIFF; j++ ) + { + if ( ( hOMasa->buffer_intensity_real[i][j] = (float *) malloc( MASA_FREQUENCY_BANDS * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for OMASA data\n" ) ); + } + set_zero( hOMasa->buffer_intensity_real[i][j], MASA_FREQUENCY_BANDS ); + } + } + + set_zero( hOMasa->buffer_energy, DIRAC_NO_COL_AVG_DIFF * MASA_FREQUENCY_BANDS ); + + for ( i = 0; i < MAX_NUM_OBJECTS; i++ ) + { +#ifdef NONBE_FIX_819_DOUBLE_PREC_COMB_FORMATS + set_f( hOMasa->prev_object_dm_gains[i], INV_SQRT_2, MASA_MAX_TRANSPORT_CHANNELS ); +#else + set_f( hOMasa->prev_object_dm_gains[i], (float) sqrt( 0.5 ), MASA_MAX_TRANSPORT_CHANNELS ); +#endif + } + + input_frame = (int16_t) ( input_Fs / FRAMES_PER_SEC ); + for ( i = 0; i < input_frame; i++ ) + { + hOMasa->interpolator[i] = ( (float) i ) / ( (float) input_frame ); + } + + hOMasa->index_buffer_intensity = 0; + + if ( ( hOMasa->hMasaOut = (MASA_DECODER_EXT_OUT_META_HANDLE) malloc( sizeof( MASA_DECODER_EXT_OUT_META ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA decoder\n" ) ); + } + + if ( ( hOMasa->sph_grid16 = (SPHERICAL_GRID_DATA *) malloc( sizeof( SPHERICAL_GRID_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA decoder\n" ) ); + } + generate_gridEq( hOMasa->sph_grid16 ); + + for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + { + set_zero( hOMasa->energy[i], MASA_FREQUENCY_BANDS ); + } + + set_zero( hOMasa->ism_azimuth, MAX_NUM_OBJECTS ); + set_zero( hOMasa->ism_elevation, MAX_NUM_OBJECTS ); + + ( *hOMasaPtr ) = hOMasa; + + return error; +} + + +/*--------------------------------------------------------------------------* + * ivas_omasa_ana_close() + * + * Close OMASA handle + *--------------------------------------------------------------------------*/ + +void ivas_omasa_ana_close( + OMASA_ANA_HANDLE *hOMasa /* i/o: analysis OMASA handle */ +) +{ + int16_t i, j; + + if ( hOMasa == NULL || *hOMasa == NULL ) + { + return; + } + + for ( i = 0; i < ( *hOMasa )->num_Cldfb_instances; i++ ) + { + deleteCldfb( &( ( *hOMasa )->cldfbAnaEnc[i] ) ); + } + + for ( i = 0; i < DIRAC_NUM_DIMS; i++ ) + { + for ( j = 0; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++ ) + { + free( ( *hOMasa )->direction_vector_m[i][j] ); + ( *hOMasa )->direction_vector_m[i][j] = NULL; + } + + for ( j = 0; j < DIRAC_NO_COL_AVG_DIFF; j++ ) + { + free( ( *hOMasa )->buffer_intensity_real[i][j] ); + ( *hOMasa )->buffer_intensity_real[i][j] = NULL; + } + + free( ( *hOMasa )->direction_vector_m[i] ); + ( *hOMasa )->direction_vector_m[i] = NULL; + } + + free( ( *hOMasa )->hMasaOut ); + ( *hOMasa )->hMasaOut = NULL; + free( ( *hOMasa )->sph_grid16 ); + ( *hOMasa )->sph_grid16 = NULL; + + free( ( *hOMasa ) ); + ( *hOMasa ) = NULL; + + return; +} + + +/*--------------------------------------------------------------------------* + * ivas_omasa_ana() + * + * OMASA analysis function + *--------------------------------------------------------------------------*/ + +void ivas_omasa_ana( + OMASA_ANA_HANDLE hOMasa, /* i/o: OMASA analysis handle */ + float data_in_f[][L_FRAME48k], /* i/o: Input / transport audio signals */ + const int16_t input_frame, /* i : Input frame size */ + const int16_t nchan_transport, /* i : Number of transport channels */ + const int16_t nchan_ism /* i : Number of objects for parameter analysis */ +) +{ + float elevation_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + float azimuth_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + float energyRatio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + float spreadCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + float surroundingCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + + /* Estimate MASA parameters from the objects */ + ivas_omasa_param_est_ana( hOMasa, data_in_f, elevation_m_values, azimuth_m_values, energyRatio, spreadCoherence, surroundingCoherence, input_frame, nchan_ism ); + + /* Create MASA metadata buffer from the estimated values */ + ivas_create_masa_out_meta( hOMasa->hMasaOut, hOMasa->sph_grid16, nchan_transport, elevation_m_values, azimuth_m_values, energyRatio, spreadCoherence, surroundingCoherence ); + + /* Downmix */ + ivas_omasa_dmx( data_in_f, input_frame, nchan_transport, nchan_ism, hOMasa->ism_azimuth, hOMasa->ism_elevation, hOMasa->prev_object_dm_gains, hOMasa->interpolator ); + + return; +} + + +/*--------------------------------------------------------------------------* + * Local functions + *--------------------------------------------------------------------------*/ + +/* Estimate MASA parameters from the objects */ +static void ivas_omasa_param_est_ana( + OMASA_ANA_HANDLE hOMasa, + float data_f[][L_FRAME48k], + float elevation_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], + float azimuth_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], + float energyRatio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], + float spreadCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], + float surroundingCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], + const int16_t input_frame, + const int16_t nchan_ism ) +{ + float reference_power[MASA_FREQUENCY_BANDS]; + int16_t ts, i, d, j; + int16_t num_freq_bins, num_freq_bands, index; + float dir_v[DIRAC_NUM_DIMS]; + int16_t l_ts; + float Chnl_RealBuffer[MAX_NUM_OBJECTS][CLDFB_NO_CHANNELS_MAX]; + float Chnl_ImagBuffer[MAX_NUM_OBJECTS][CLDFB_NO_CHANNELS_MAX]; + float Foa_RealBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX]; + float Foa_ImagBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX]; + float intensity_real[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS]; + float direction_vector[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS]; + float diffuseness_vector[MASA_FREQUENCY_BANDS]; + float diffuseness_m[MASA_FREQUENCY_BANDS]; + + int16_t band_m_idx, block_m_idx; + float renormalization_factor_diff[MASA_FREQUENCY_BANDS]; + float norm_tmp; + int16_t mrange[2]; + int16_t brange[2]; + + num_freq_bins = hOMasa->cldfbAnaEnc[0]->no_channels; + num_freq_bands = hOMasa->nbands; + l_ts = input_frame / CLDFB_NO_COL_MAX; + + + /* Compute ISM to FOA matrices */ + for ( i = 0; i < nchan_ism; i++ ) + { + hOMasa->chnlToFoaMtx[0][i] = 1.0f; + hOMasa->chnlToFoaMtx[1][i] = sinf( ( hOMasa->ism_azimuth[i] / 180.0f * EVS_PI ) ) * cosf( ( hOMasa->ism_elevation[i] / 180.0f * EVS_PI ) ); + hOMasa->chnlToFoaMtx[2][i] = sinf( ( hOMasa->ism_elevation[i] / 180.0f * EVS_PI ) ); + hOMasa->chnlToFoaMtx[3][i] = cosf( ( hOMasa->ism_azimuth[i] / 180.0f * EVS_PI ) ) * cosf( ( hOMasa->ism_elevation[i] / 180.0f * EVS_PI ) ); + } + + /* do processing over all CLDFB time slots */ + for ( block_m_idx = 0; block_m_idx < MAX_PARAM_SPATIAL_SUBFRAMES; block_m_idx++ ) + { + mrange[0] = hOMasa->block_grouping[block_m_idx]; + mrange[1] = hOMasa->block_grouping[block_m_idx + 1]; + + for ( band_m_idx = 0; band_m_idx < hOMasa->nbands; band_m_idx++ ) + { + hOMasa->direction_vector_m[0][block_m_idx][band_m_idx] = 0.0f; + hOMasa->direction_vector_m[1][block_m_idx][band_m_idx] = 0.0f; + hOMasa->direction_vector_m[2][block_m_idx][band_m_idx] = 0.0f; + } + + /* Need to initialize renormalization_factors, and variables to be normalized */ + set_zero( renormalization_factor_diff, hOMasa->nbands ); + set_zero( diffuseness_m, hOMasa->nbands ); + set_zero( hOMasa->energy[block_m_idx], MASA_FREQUENCY_BANDS ); + + for ( ts = mrange[0]; ts < mrange[1]; ts++ ) + { + for ( i = 0; i < nchan_ism; i++ ) + { + cldfbAnalysis_ts( &( data_f[i][l_ts * ts] ), Chnl_RealBuffer[i], Chnl_ImagBuffer[i], l_ts, hOMasa->cldfbAnaEnc[i] ); + } + + /* Compute channel-based energy for metadata processing */ + for ( band_m_idx = 0; band_m_idx < num_freq_bands; band_m_idx++ ) + { + brange[0] = hOMasa->band_grouping[band_m_idx]; + brange[1] = hOMasa->band_grouping[band_m_idx + 1]; + for ( j = brange[0]; j < brange[1]; j++ ) + { + for ( i = 0; i < nchan_ism; i++ ) + { + hOMasa->energy[block_m_idx][band_m_idx] += Chnl_RealBuffer[i][j] * Chnl_RealBuffer[i][j] + Chnl_ImagBuffer[i][j] * Chnl_ImagBuffer[i][j]; + } + } + } + + /* Compute FOA */ + /* W */ + mvr2r( Chnl_RealBuffer[0], Foa_RealBuffer[0], num_freq_bins ); + mvr2r( Chnl_ImagBuffer[0], Foa_ImagBuffer[0], num_freq_bins ); + for ( i = 1; i < nchan_ism; i++ ) + { + v_add( Chnl_RealBuffer[i], Foa_RealBuffer[0], Foa_RealBuffer[0], num_freq_bins ); + v_add( Chnl_ImagBuffer[i], Foa_ImagBuffer[0], Foa_ImagBuffer[0], num_freq_bins ); + } + + /* Y */ + v_multc( Chnl_RealBuffer[0], hOMasa->chnlToFoaMtx[1][0], Foa_RealBuffer[1], num_freq_bins ); + v_multc( Chnl_ImagBuffer[0], hOMasa->chnlToFoaMtx[1][0], Foa_ImagBuffer[1], num_freq_bins ); + for ( i = 1; i < nchan_ism; i++ ) + { + v_multc_acc( Chnl_RealBuffer[i], hOMasa->chnlToFoaMtx[1][i], Foa_RealBuffer[1], num_freq_bins ); + v_multc_acc( Chnl_ImagBuffer[i], hOMasa->chnlToFoaMtx[1][i], Foa_ImagBuffer[1], num_freq_bins ); + } + + /* Z */ + v_multc( Chnl_RealBuffer[0], hOMasa->chnlToFoaMtx[2][0], Foa_RealBuffer[2], num_freq_bins ); + v_multc( Chnl_ImagBuffer[0], hOMasa->chnlToFoaMtx[2][0], Foa_ImagBuffer[2], num_freq_bins ); + for ( i = 1; i < nchan_ism; i++ ) + { + v_multc_acc( Chnl_RealBuffer[i], hOMasa->chnlToFoaMtx[2][i], Foa_RealBuffer[2], num_freq_bins ); + v_multc_acc( Chnl_ImagBuffer[i], hOMasa->chnlToFoaMtx[2][i], Foa_ImagBuffer[2], num_freq_bins ); + } + + /* X */ + v_multc( Chnl_RealBuffer[0], hOMasa->chnlToFoaMtx[3][0], Foa_RealBuffer[3], num_freq_bins ); + v_multc( Chnl_ImagBuffer[0], hOMasa->chnlToFoaMtx[3][0], Foa_ImagBuffer[3], num_freq_bins ); + for ( i = 1; i < nchan_ism; i++ ) + { + v_multc_acc( Chnl_RealBuffer[i], hOMasa->chnlToFoaMtx[3][i], Foa_RealBuffer[3], num_freq_bins ); + v_multc_acc( Chnl_ImagBuffer[i], hOMasa->chnlToFoaMtx[3][i], Foa_ImagBuffer[3], num_freq_bins ); + } + + /* Direction estimation */ + computeIntensityVector_ana( hOMasa->band_grouping, Foa_RealBuffer, Foa_ImagBuffer, num_freq_bands, intensity_real ); + computeDirectionVectors( intensity_real[0], intensity_real[1], intensity_real[2], 0, num_freq_bands, direction_vector[0], direction_vector[1], direction_vector[2] ); + + /* Power estimation for diffuseness */ + computeReferencePower_ana( hOMasa->band_grouping, Foa_RealBuffer, Foa_ImagBuffer, reference_power, num_freq_bands ); + + /* Fill buffers of length "averaging_length" time slots for intensity and energy */ + hOMasa->index_buffer_intensity = ( hOMasa->index_buffer_intensity % DIRAC_NO_COL_AVG_DIFF ) + 1; /* averaging_length = 32 */ + index = hOMasa->index_buffer_intensity; + for ( i = 0; i < DIRAC_NUM_DIMS; i++ ) + { + /* only real part needed */ + mvr2r( intensity_real[i], &( hOMasa->buffer_intensity_real[i][index - 1][0] ), num_freq_bands ); + } + mvr2r( reference_power, &( hOMasa->buffer_energy[( index - 1 ) * num_freq_bands] ), num_freq_bands ); + + computeDiffuseness( hOMasa->buffer_intensity_real, hOMasa->buffer_energy, num_freq_bands, diffuseness_vector ); + + for ( band_m_idx = 0; band_m_idx < hOMasa->nbands; band_m_idx++ ) + { + norm_tmp = reference_power[band_m_idx] * ( 1 - diffuseness_vector[band_m_idx] ); + + hOMasa->direction_vector_m[0][block_m_idx][band_m_idx] += norm_tmp * direction_vector[0][band_m_idx]; + hOMasa->direction_vector_m[1][block_m_idx][band_m_idx] += norm_tmp * direction_vector[1][band_m_idx]; + hOMasa->direction_vector_m[2][block_m_idx][band_m_idx] += norm_tmp * direction_vector[2][band_m_idx]; + + diffuseness_m[band_m_idx] += reference_power[band_m_idx] * diffuseness_vector[band_m_idx]; + renormalization_factor_diff[band_m_idx] += reference_power[band_m_idx]; + } + } + + for ( band_m_idx = 0; band_m_idx < hOMasa->nbands; band_m_idx++ ) + { + for ( d = 0; d < DIRAC_NUM_DIMS; d++ ) + { + dir_v[d] = hOMasa->direction_vector_m[d][block_m_idx][band_m_idx]; + } + ivas_qmetadata_direction_vector_to_azimuth_elevation( dir_v, &azimuth_m_values[block_m_idx][band_m_idx], &elevation_m_values[block_m_idx][band_m_idx] ); + } + + /* Determine energy ratios */ + for ( band_m_idx = 0; band_m_idx < hOMasa->nbands; band_m_idx++ ) + { + if ( renormalization_factor_diff[band_m_idx] > EPSILON ) + { + diffuseness_m[band_m_idx] /= renormalization_factor_diff[band_m_idx]; + } + else + { + diffuseness_m[band_m_idx] = 0.0f; + } + + energyRatio[block_m_idx][band_m_idx] = 1.0f - diffuseness_m[band_m_idx]; + } + + /* Set coherences to zero, as this mode is used at lowest bit rates where the coherences are not transmitted */ + for ( band_m_idx = 0; band_m_idx < hOMasa->nbands; band_m_idx++ ) + { + spreadCoherence[block_m_idx][band_m_idx] = 0.0f; + surroundingCoherence[block_m_idx][band_m_idx] = 0.0f; + } + } + + return; +} + + +/* Compute downmix */ +static void ivas_omasa_dmx( + float data_in_f[][L_FRAME48k], + const int16_t input_frame, + const int16_t nchan_transport, + const int16_t nchan_ism, + const float ism_azimuth[MAX_NUM_OBJECTS], + const float ism_elevation[MAX_NUM_OBJECTS], + float prev_gains[][MASA_MAX_TRANSPORT_CHANNELS], + const float interpolator[L_FRAME48k] ) +{ + int16_t i, j, k; + float azimuth, elevation; + float gains[MASA_MAX_TRANSPORT_CHANNELS]; + float g1, g2; + float data_out_f[MASA_MAX_TRANSPORT_CHANNELS][L_FRAME48k]; + + + for ( i = 0; i < nchan_transport; i++ ) + { + set_zero( data_out_f[i], input_frame ); + } + + for ( i = 0; i < nchan_ism; i++ ) + { + azimuth = ism_azimuth[i]; + elevation = ism_elevation[i]; + + ivas_ism_get_stereo_gains( azimuth, elevation, &gains[0], &gains[1] ); + + /* Downmix using the panning gains */ + for ( j = 0; j < nchan_transport; j++ ) + { + if ( fabsf( gains[j] ) > 0.0 || fabsf( prev_gains[i][j] ) > 0.0f ) + { + for ( k = 0; k < input_frame; k++ ) + { + g1 = interpolator[k]; + g2 = 1.0f - g1; + data_out_f[j][k] += ( g1 * gains[j] + g2 * prev_gains[i][j] ) * data_in_f[i][k]; + } + } + prev_gains[i][j] = gains[j]; + } + } + + for ( i = 0; i < nchan_transport; i++ ) + { + mvr2r( data_out_f[i], data_in_f[i], input_frame ); + } + + return; +} + + +/*--------------------------------------------------------------------------* + * computeIntensityVector_ana() + * + * + *--------------------------------------------------------------------------*/ + +void computeIntensityVector_ana( + const int16_t *band_grouping, /* i : Band grouping for estimation */ + float Cldfb_RealBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], /* i : Real part of input signal */ + float Cldfb_ImagBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], /* i : Imag part of input signal */ + const int16_t num_frequency_bands, /* i : Number of frequency bands */ + float intensity_real[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS] /* o : Intensity vector */ +) +{ + /* Reminder + * X = a + ib; Y = c + id + * X*Y = ac - bd + i(ad +bc) + */ + int16_t i, j; + float real, img; + int16_t brange[2]; + + for ( i = 0; i < num_frequency_bands; i++ ) + { + brange[0] = band_grouping[i]; + brange[1] = band_grouping[i + 1]; + + intensity_real[0][i] = 0; + intensity_real[1][i] = 0; + intensity_real[2][i] = 0; + + for ( j = brange[0]; j < brange[1]; j++ ) + { + real = Cldfb_RealBuffer[0][j]; + img = Cldfb_ImagBuffer[0][j]; + intensity_real[0][i] += Cldfb_RealBuffer[3][j] * real + Cldfb_ImagBuffer[3][j] * img; /* Intensity is XYZ order, audio is WYZX order. */ + intensity_real[1][i] += Cldfb_RealBuffer[1][j] * real + Cldfb_ImagBuffer[1][j] * img; + intensity_real[2][i] += Cldfb_RealBuffer[2][j] * real + Cldfb_ImagBuffer[2][j] * img; + } + } + + return; +} + + +/*--------------------------------------------------------------------------* + * computeReferencePower_ana() + * + * + *--------------------------------------------------------------------------*/ + +void computeReferencePower_ana( + const int16_t *band_grouping, /* i : Band grouping for estimation */ + float Cldfb_RealBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], /* i : Real part of input signal */ + float Cldfb_ImagBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], /* i : Imag part of input signal */ + float *reference_power, /* o : Estimated power */ + const int16_t num_freq_bands /* i : Number of frequency bands */ +) +{ + int16_t brange[2]; + int16_t ch_idx, i, j; + + for ( i = 0; i < num_freq_bands; i++ ) + { + brange[0] = band_grouping[i]; + brange[1] = band_grouping[i + 1]; + reference_power[i] = 0; + + for ( ch_idx = 0; ch_idx < FOA_CHANNELS; ch_idx++ ) + { + /* abs()^2 */ + for ( j = brange[0]; j < brange[1]; j++ ) + { + reference_power[i] += ( Cldfb_RealBuffer[ch_idx][j] * Cldfb_RealBuffer[ch_idx][j] ) + ( Cldfb_ImagBuffer[ch_idx][j] * Cldfb_ImagBuffer[ch_idx][j] ); + } + } + } + + v_multc( reference_power, 0.5f, reference_power, num_freq_bands ); + + return; +} diff --git a/lib_rend/ivas_orient_trk.c b/lib_rend/ivas_orient_trk.c new file mode 100644 index 0000000000000000000000000000000000000000..c540c99114ca51f056b7b32cf9f9b213c967df49 --- /dev/null +++ b/lib_rend/ivas_orient_trk.c @@ -0,0 +1,671 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include "common_api_types.h" +#include +#include "options.h" +#include "ivas_prot.h" +#include "ivas_prot_rend.h" +#include "ivas_cnst.h" +#include +#include +#include "wmc_auto.h" + + +/*------------------------------------------------------------------------------------------* + * Local constants + *------------------------------------------------------------------------------------------*/ + +#define OTR_UPDATE_RATE (float) FRAMES_PER_SEC /* rate of the Process() calls [Hz]; 1x per IVAS frame */ + + +/*------------------------------------------------------------------------------------------* + * Local functions + *------------------------------------------------------------------------------------------*/ + +/*------------------------------------------------------------------------------------------* + * IdentityQuaternion() + * + * + *------------------------------------------------------------------------------------------*/ + +static IVAS_QUATERNION IdentityQuaternion( + void ) +{ + IVAS_QUATERNION q; + + q.w = 1.0f; + q.x = q.y = q.z = 0.0f; + + return q; +} + + +/*------------------------------------------------------------------------------------------* + * QuaternionProduct() + * + * Quaternion product + *------------------------------------------------------------------------------------------*/ + +void QuaternionProduct( + const IVAS_QUATERNION q1, + const IVAS_QUATERNION q2, + IVAS_QUATERNION *const r ) +{ + IVAS_QUATERNION tmp; + tmp.w = q1.w * q2.w - q1.x * q2.x - q1.y * q2.y - q1.z * q2.z; + tmp.x = q1.w * q2.x + q1.x * q2.w + q1.y * q2.z - q1.z * q2.y; + tmp.y = q1.w * q2.y - q1.x * q2.z + q1.y * q2.w + q1.z * q2.x; + tmp.z = q1.w * q2.z + q1.x * q2.y - q1.y * q2.x + q1.z * q2.w; + + *r = tmp; + + return; +} + +/*------------------------------------------------------------------------------------------* + * QuaternionDotProduct() + * + * Quaternion dot product + *------------------------------------------------------------------------------------------*/ + +static float QuaternionDotProduct( + const IVAS_QUATERNION q1, + const IVAS_QUATERNION q2 ) +{ + return q1.x * q2.x + q1.y * q2.y + q1.z * q2.z + q1.w * q2.w; +} + + +/*------------------------------------------------------------------------------------------* + * QuaternionDivision() + * + * Divides a quaternion by a scalar + *------------------------------------------------------------------------------------------*/ + +static void QuaternionDivision( + const IVAS_QUATERNION q, + const float d, + IVAS_QUATERNION *const r ) +{ + r->w = q.w / d; + r->x = q.x / d; + r->y = q.y / d; + r->z = q.z / d; + + return; +} + + +/*------------------------------------------------------------------------------------------* + * QuaternionNormalize() + * + * Normalizes a quaternion + *------------------------------------------------------------------------------------------*/ + +static void QuaternionNormalize( + const IVAS_QUATERNION q, + IVAS_QUATERNION *const r ) +{ + QuaternionDivision( q, sqrtf( QuaternionDotProduct( q, q ) ), r ); + + return; +} + + +/*------------------------------------------------------------------------------------------* + * QuaternionSlerp() + * + * Computes a spherical linear interpolation between two quaternions + *------------------------------------------------------------------------------------------*/ + +void QuaternionSlerp( + const IVAS_QUATERNION q1, + const IVAS_QUATERNION q2, + const float t, + IVAS_QUATERNION *const r ) +{ + float angle, denom, s, s2; + + s = QuaternionDotProduct( q1, q2 ); + + if ( fabsf( s ) >= 1.0f ) + { + *r = q2; + return; + } + + angle = acosf( s ); + denom = sinf( angle ); + + s = sinf( ( 1 - t ) * angle ); + s2 = sinf( t * angle ); + r->x = ( q1.x * s + q2.x * s2 ) / denom; + r->y = ( q1.y * s + q2.y * s2 ) / denom; + r->z = ( q1.z * s + q2.z * s2 ) / denom; + r->w = ( q1.w * s + q2.w * s2 ) / denom; + + QuaternionNormalize( *r, r ); + + return; +} + + +/*------------------------------------------------------------------------------------------* + * QuaternionConjugate() + * + * Computes a quaternion conjugate + *------------------------------------------------------------------------------------------*/ + +static void QuaternionConjugate( + const IVAS_QUATERNION q, + IVAS_QUATERNION *const r ) +{ + r->w = q.w; + r->x = -q.x; + r->y = -q.y; + r->z = -q.z; + + return; +} + + +/*------------------------------------------------------------------------------------------* + * QuaternionAngle() + * + * Computes an angle between two quaternions + *------------------------------------------------------------------------------------------*/ + +static float QuaternionAngle( + const IVAS_QUATERNION q1, + const IVAS_QUATERNION q2 ) +{ + IVAS_QUATERNION q12; + float angle; + + QuaternionConjugate( q1, &q12 ); + QuaternionProduct( q12, q2, &q12 ); + angle = 2.0f * atan2f( sqrtf( q12.x * q12.x + q12.y * q12.y + q12.z * q12.z ), q12.w ); + + return angle; +} + + +/*------------------------------------------------------------------------------------------* + * QuaternionInverse() + * + * Computes an inverse quaternion + *------------------------------------------------------------------------------------------*/ + +void QuaternionInverse( + const IVAS_QUATERNION q, + IVAS_QUATERNION *const r ) +{ + float dot_product; + + dot_product = QuaternionDotProduct( q, q ); + QuaternionConjugate( q, r ); + QuaternionDivision( *r, dot_product, r ); + + return; +} + + +/*------------------------------------------------------------------------------------------* + * VectorSubtract() + * + * Computes the difference of two vectors + *------------------------------------------------------------------------------------------*/ + +static IVAS_VECTOR3 VectorSubtract( + const IVAS_VECTOR3 p1, + const IVAS_VECTOR3 p2 ) +{ + IVAS_VECTOR3 result; + + result.x = p1.x - p2.x; + result.y = p1.y - p2.y; + result.z = p1.z - p2.z; + + return result; +} + + +/*------------------------------------------------------------------------------------------* + * VectorCrossProduct() + * + * Computes the cross product of two vectors + *------------------------------------------------------------------------------------------*/ + +static IVAS_VECTOR3 VectorCrossProduct( + const IVAS_VECTOR3 p1, + const IVAS_VECTOR3 p2 ) +{ + IVAS_VECTOR3 result; + result.x = p1.y * p2.z - p1.z * p2.y; + result.y = p1.z * p2.x - p1.x * p2.z; + result.z = p1.x * p2.y - p1.y * p2.x; + + return result; +} + + +/*------------------------------------------------------------------------------------------* + * VectorDotProduct( + * + * Computes the dot product of two vectors + *------------------------------------------------------------------------------------------*/ + +static float VectorDotProduct( + const IVAS_VECTOR3 p1, + const IVAS_VECTOR3 p2 ) +{ + return p1.x * p2.x + p1.y * p2.y + p1.z * p2.z; +} + + +/*------------------------------------------------------------------------------------------* + * VectorLength() + * + * Computes the length of a vector + *------------------------------------------------------------------------------------------*/ + +static float VectorLength( + const IVAS_VECTOR3 p ) +{ + return sqrtf( p.x * p.x + p.y * p.y + p.z * p.z ); +} + + +/*------------------------------------------------------------------------------------------* + * VectorNormalize() + * + * Normalizes a vector + *------------------------------------------------------------------------------------------*/ + +static IVAS_VECTOR3 VectorNormalize( + const IVAS_VECTOR3 p ) +{ + IVAS_VECTOR3 result; + + const float length = VectorLength( p ); + + result.x = p.x / length; + result.y = p.y / length; + result.z = p.z / length; + + return result; +} + + +/*------------------------------------------------------------------------------------------* + * VectorRotationToQuaternion() + * + * Computes a quaternion representing the rotation from vector p1 to vector p2 + *------------------------------------------------------------------------------------------*/ + +static void VectorRotationToQuaternion( + const IVAS_VECTOR3 p1, + const IVAS_VECTOR3 p2, + IVAS_QUATERNION *const r ) +{ + float dot_product; + IVAS_VECTOR3 cross_product, p1_normalized, p2_normalized; + + p1_normalized = VectorNormalize( p1 ); + p2_normalized = VectorNormalize( p2 ); + cross_product = VectorCrossProduct( p1_normalized, p2_normalized ); + dot_product = VectorDotProduct( p1_normalized, p2_normalized ); + + if ( dot_product < -0.999999 ) + { + /* happens when the p1 vector is parallel to p2, but direction is flipped */ + r->w = 0.0f; + r->x = 0.0f; + r->y = 0.0f; + r->z = 1.0f; + } + else + { + /* all regular cases */ + r->x = cross_product.x; + r->y = cross_product.y; + r->z = cross_product.z; + r->w = 1.0f + dot_product; + } + + QuaternionNormalize( *r, r ); + + return; +} + +/*-------------------------------------------------------------------* + * ivas_orient_trk_Init() + * + * + *-------------------------------------------------------------------*/ + +ivas_error ivas_orient_trk_Init( + ivas_orient_trk_state_t *pOTR ) /* i/o : orientation tracker handle */ +{ + IVAS_QUATERNION identity; + + if ( pOTR == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + identity.w = 1.0f; + identity.x = identity.y = identity.z = 0.0f; + + /* configuration parameters */ + pOTR->centerAdaptationRate = 1.0f / 30.0f; + pOTR->offCenterAdaptationRate = 1.0f / 8.0f; + pOTR->adaptationAngle = PI_OVER_2; /* Excursion angle relative to center at which maximum adaptation rate shall be applied */ + + /* initial adaptivity filter coefficient, will be auto-adapted */ + pOTR->alpha = sinf( PI2 * pOTR->offCenterAdaptationRate / OTR_UPDATE_RATE ); /* start adaptation at off-center rate = fastest rate */ + + pOTR->trkRot = identity; + pOTR->absAvgRot = identity; + /* Use frontal and horiontal orientation as reference orientation, unless/until overridden */ + pOTR->refRot = identity; + + /* set safe default tracking mode */ + pOTR->orientation_tracking = IVAS_HEAD_ORIENT_TRK_NONE; + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * ivas_orient_trk_SetTrackingType() + * + * + *-------------------------------------------------------------------*/ + +ivas_error ivas_orient_trk_SetTrackingType( + ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */ + const IVAS_HEAD_ORIENT_TRK_T orientation_tracking /* i : orientation tracking type */ +) +{ + if ( pOTR == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + pOTR->orientation_tracking = orientation_tracking; + + return IVAS_ERR_OK; +} + +/*-------------------------------------------------------------------* + * ivas_orient_trk_SetReferenceRotation() + * + * + *-------------------------------------------------------------------*/ + +ivas_error ivas_orient_trk_SetReferenceRotation( + ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */ + const IVAS_QUATERNION refRot /* i : reference rotation */ +) +{ + if ( pOTR == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + /* check for Euler angle signaling */ + if ( refRot.w == -3.0f ) + { + Euler2Quat( deg2rad( refRot.x ), deg2rad( refRot.y ), deg2rad( refRot.z ), &pOTR->refRot ); + } + else + { + pOTR->refRot = refRot; + } + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * ivas_orient_trk_GetMainOrientation() + * + * + *-------------------------------------------------------------------*/ + +ivas_error ivas_orient_trk_GetMainOrientation( + ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */ + IVAS_QUATERNION *pOrientation /* i/o: average/reference orientation */ +) +{ + if ( pOTR == NULL || pOrientation == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + switch ( pOTR->orientation_tracking ) + { + case IVAS_HEAD_ORIENT_TRK_NONE: + *pOrientation = IdentityQuaternion(); + break; + case IVAS_HEAD_ORIENT_TRK_REF_VEC: + case IVAS_HEAD_ORIENT_TRK_REF_VEC_LEV: + case IVAS_HEAD_ORIENT_TRK_REF: + *pOrientation = pOTR->refRot; + break; + case IVAS_HEAD_ORIENT_TRK_AVG: + *pOrientation = pOTR->absAvgRot; + break; + } + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * ivas_orient_trk_GetTrackedRotation() + * + * + *-------------------------------------------------------------------*/ + +ivas_error ivas_orient_trk_GetTrackedRotation( + ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */ + IVAS_QUATERNION *pRotation /* i/o: processed rotation */ +) +{ + if ( pOTR == NULL || pRotation == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + *pRotation = pOTR->trkRot; + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * ivas_orient_trk_SetReferenceVector() + * + * + *-------------------------------------------------------------------*/ + +ivas_error ivas_orient_trk_SetReferenceVector( + ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */ + const IVAS_VECTOR3 listenerPos, /* i : Listener position */ + const IVAS_VECTOR3 refPos /* i : Reference position */ +) +{ + IVAS_VECTOR3 acousticFrontVector, ivasForwardVector; + IVAS_VECTOR3 listenerPosLevel, refPosLevel; + float acousticFrontVectorLength; + + if ( pOTR == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + switch ( pOTR->orientation_tracking ) + { + case IVAS_HEAD_ORIENT_TRK_NONE: + case IVAS_HEAD_ORIENT_TRK_REF: + case IVAS_HEAD_ORIENT_TRK_AVG: + case IVAS_HEAD_ORIENT_TRK_REF_VEC: + acousticFrontVector = VectorSubtract( listenerPos, refPos ); + break; + case IVAS_HEAD_ORIENT_TRK_REF_VEC_LEV: + /* ignore the height difference between listener position and reference position */ + listenerPosLevel.z = refPosLevel.z = listenerPos.z; + listenerPosLevel.x = listenerPos.x; + listenerPosLevel.y = listenerPos.y; + refPosLevel.x = refPos.x; + refPosLevel.y = refPos.y; + acousticFrontVector = VectorSubtract( listenerPosLevel, refPosLevel ); + break; + default: + return IVAS_ERR_WRONG_PARAMS; + } + + acousticFrontVectorLength = VectorLength( acousticFrontVector ); + + /* if the length is zero, the user has entered insensible listener and reference positions */ + if ( acousticFrontVectorLength < 0.0001f ) + { + return IVAS_ERR_WRONG_PARAMS; + } + + ivasForwardVector.x = -1.0f; + ivasForwardVector.y = 0.0f; + ivasForwardVector.z = 0.0f; + VectorRotationToQuaternion( ivasForwardVector, acousticFrontVector, &pOTR->refRot ); + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * ivas_orient_trk_Process() + * + * + *-------------------------------------------------------------------*/ + +ivas_error ivas_orient_trk_Process( + ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */ + IVAS_QUATERNION absRot, /* i : absolute head rotation */ + float updateRate, /* i : rotation update rate [Hz] */ + IVAS_QUATERNION *pTrkRot /* o : tracked rotation */ +) +{ + float normalizedOrientation; + float relativeOrientationRate; + float rateRange; + float cutoffFrequency; + float alpha = pOTR->alpha; + float ang; + ivas_error result; + + if ( pOTR == NULL || pTrkRot == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + result = IVAS_ERR_OK; + + switch ( pOTR->orientation_tracking ) + { + case IVAS_HEAD_ORIENT_TRK_NONE: + pOTR->trkRot = absRot; + break; + case IVAS_HEAD_ORIENT_TRK_REF: + case IVAS_HEAD_ORIENT_TRK_REF_VEC: + case IVAS_HEAD_ORIENT_TRK_REF_VEC_LEV: + /* Reset average orientation */ + pOTR->absAvgRot = absRot; + + /* Reset adaptation filter - start adaptation at center rate */ + pOTR->alpha = sinf( 2.0f * EVS_PI * pOTR->centerAdaptationRate / updateRate ); + + /* Compute relative orientation = (absolute orientation) - (reference orientation) */ + QuaternionInverse( pOTR->refRot, &pOTR->trkRot ); + QuaternionProduct( pOTR->trkRot, absRot, &pOTR->trkRot ); + break; + + case IVAS_HEAD_ORIENT_TRK_AVG: + /* Compute average (low-pass filtered) absolute orientation */ + QuaternionSlerp( pOTR->absAvgRot, absRot, alpha, &pOTR->absAvgRot ); + + /* Compute relative orientation = (absolute orientation) - (average absolute orientation) */ + QuaternionInverse( pOTR->absAvgRot, &pOTR->trkRot ); + QuaternionProduct( pOTR->trkRot, absRot, &pOTR->trkRot ); + + /* Adapt LPF constant based on orientation excursion relative to current mean: + - low cutoff (slow adaptation) for small excursions (around center) + - high cutoff (fast adaptation) for large excursions (off-center) + */ + ang = QuaternionAngle( absRot, pOTR->trkRot ); + normalizedOrientation = ang * ang; + + relativeOrientationRate = sqrtf( normalizedOrientation ) / pOTR->adaptationAngle; + /* 'if' assumed to perform comparison to 0 */ + if ( relativeOrientationRate > 1.0f ) + { + relativeOrientationRate = 1.0f; + } + + /* Compute range of the adaptation rate between center = lower rate and off-center = higher rate */ + rateRange = pOTR->offCenterAdaptationRate - pOTR->centerAdaptationRate; + /* 'if' assumed to perform comparison to 0 */ + if ( rateRange < 0.0f ) + { + rateRange = 0.0f; + } + + /* Compute adaptivity cutoff frequency: interpolate between minimum (center) and maximum (off-center) values */ + cutoffFrequency = pOTR->centerAdaptationRate + ( relativeOrientationRate * rateRange ); + + /* Compute filter coefficient corresponding to desired cutoff frequency */ + pOTR->alpha = sinf( 2.0f * EVS_PI * cutoffFrequency / updateRate ); + break; + default: + result = IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Non-supported orientation tracking adaptation type" ); + break; + } + + if ( result == IVAS_ERR_OK ) + { + *pTrkRot = pOTR->trkRot; + } + + return result; +} diff --git a/lib_rend/ivas_output_init.c b/lib_rend/ivas_output_init.c new file mode 100644 index 0000000000000000000000000000000000000000..380ab5773d72d4358d070f2cc4991c4cad21395d --- /dev/null +++ b/lib_rend/ivas_output_init.c @@ -0,0 +1,427 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "ivas_cnst.h" +#include "prot.h" +#include "ivas_prot_rend.h" +#include "ivas_rom_com.h" +#include "ivas_prot.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------------* + * audioCfg2channels() + * + * Map Audio configuration to number of channels + *-------------------------------------------------------------------------*/ + +/*! r: number of audio channels */ +int16_t audioCfg2channels( + AUDIO_CONFIG output_config /* i : output audio configuration */ +) +{ + int16_t nchan_out; + + switch ( output_config ) + { + case IVAS_AUDIO_CONFIG_MONO: + nchan_out = 1; + break; + case IVAS_AUDIO_CONFIG_STEREO: + nchan_out = 2; + break; + case IVAS_AUDIO_CONFIG_5_1: + nchan_out = 6; + break; + case IVAS_AUDIO_CONFIG_7_1: + nchan_out = 8; + break; + case IVAS_AUDIO_CONFIG_5_1_2: + nchan_out = 8; + break; + case IVAS_AUDIO_CONFIG_5_1_4: + nchan_out = 10; + break; + case IVAS_AUDIO_CONFIG_7_1_4: + nchan_out = 12; + break; + case IVAS_AUDIO_CONFIG_FOA: + nchan_out = 4; + break; + case IVAS_AUDIO_CONFIG_HOA2: + nchan_out = 9; + break; + case IVAS_AUDIO_CONFIG_HOA3: + nchan_out = 16; + break; + case IVAS_AUDIO_CONFIG_OBA: + nchan_out = 8; + break; + case IVAS_AUDIO_CONFIG_BINAURAL: + case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR: + case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB: + nchan_out = 2; + break; + case IVAS_AUDIO_CONFIG_ISM1: + nchan_out = 1; + break; + case IVAS_AUDIO_CONFIG_ISM2: + nchan_out = 2; + break; + case IVAS_AUDIO_CONFIG_ISM3: + nchan_out = 3; + break; + case IVAS_AUDIO_CONFIG_ISM4: + nchan_out = 4; + break; + default: + IVAS_ERROR( IVAS_ERR_INTERNAL, "Error: illegal output configuration\n" ); + nchan_out = -1; + break; + } + + return ( nchan_out ); +} + + +/*-------------------------------------------------------------------------* + * ivas_output_init() + * + * Initialize and configure IVAS output parameters + *-------------------------------------------------------------------------*/ + +void ivas_output_init( + IVAS_OUTPUT_SETUP *hOutSetup, /* o : IVAS output setup structure */ + const AUDIO_CONFIG output_config /* i : output audio configuration */ +) +{ + int16_t nchan_out; + + /* set general default values */ + hOutSetup->output_config = output_config; + hOutSetup->is_loudspeaker_setup = 0; + hOutSetup->is_binaural_setup = 0; + hOutSetup->ambisonics_order = -1; + hOutSetup->separateChannelEnabled = 0; + hOutSetup->separateChannelIndex = 0; + + if ( output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM ) + { + hOutSetup->is_loudspeaker_setup = 1; + /* set in ivas_init_decoder: */ + /* hOutSetup->ls_azimuth */ + /* hOutSetup->ls_elevation */ + /* hOutSetup->num_lfe */ + /* hOutSetup->index_lfe[0] */ + /* hOutSetup->is_planar_setup */ + } + else + { + /* Set default values for all other than custom LS setup */ + hOutSetup->ls_azimuth = NULL; + hOutSetup->ls_elevation = NULL; + hOutSetup->num_lfe = 0; + hOutSetup->index_lfe[0] = -1; + hOutSetup->is_planar_setup = 0; + + /* set output setup specific values */ + switch ( output_config ) + { + case IVAS_AUDIO_CONFIG_MONO: + hOutSetup->is_loudspeaker_setup = 1; + break; + case IVAS_AUDIO_CONFIG_STEREO: + hOutSetup->is_loudspeaker_setup = 1; + hOutSetup->ls_azimuth = ls_azimuth_CICP2; + hOutSetup->ls_elevation = ls_elevation_CICP2; + break; + case IVAS_AUDIO_CONFIG_FOA: + hOutSetup->ambisonics_order = SBA_FOA_ORDER; + break; + case IVAS_AUDIO_CONFIG_HOA2: + hOutSetup->ambisonics_order = SBA_HOA2_ORDER; + break; + case IVAS_AUDIO_CONFIG_HOA3: + hOutSetup->ambisonics_order = SBA_HOA3_ORDER; + break; + case IVAS_AUDIO_CONFIG_5_1: + hOutSetup->num_lfe = 1; + hOutSetup->index_lfe[0] = 3; + hOutSetup->is_loudspeaker_setup = 1; + hOutSetup->ls_azimuth = ls_azimuth_CICP6; + hOutSetup->ls_elevation = ls_elevation_CICP6; + hOutSetup->is_planar_setup = 1; + break; + case IVAS_AUDIO_CONFIG_7_1: + hOutSetup->num_lfe = 1; + hOutSetup->index_lfe[0] = 3; + hOutSetup->is_loudspeaker_setup = 1; + hOutSetup->ls_azimuth = ls_azimuth_CICP12; + hOutSetup->ls_elevation = ls_elevation_CICP12; + hOutSetup->is_planar_setup = 1; + break; + case IVAS_AUDIO_CONFIG_5_1_2: + hOutSetup->num_lfe = 1; + hOutSetup->index_lfe[0] = 3; + hOutSetup->is_loudspeaker_setup = 1; + hOutSetup->ls_azimuth = ls_azimuth_CICP14; + hOutSetup->ls_elevation = ls_elevation_CICP14; + hOutSetup->is_planar_setup = 0; + break; + case IVAS_AUDIO_CONFIG_5_1_4: + hOutSetup->num_lfe = 1; + hOutSetup->index_lfe[0] = 3; + hOutSetup->is_loudspeaker_setup = 1; + hOutSetup->ls_azimuth = ls_azimuth_CICP16; + hOutSetup->ls_elevation = ls_elevation_CICP16; + hOutSetup->is_planar_setup = 0; + break; + case IVAS_AUDIO_CONFIG_7_1_4: + hOutSetup->num_lfe = 1; + hOutSetup->index_lfe[0] = 3; + hOutSetup->is_loudspeaker_setup = 1; + hOutSetup->ls_azimuth = ls_azimuth_CICP19; + hOutSetup->ls_elevation = ls_elevation_CICP19; + hOutSetup->is_planar_setup = 0; + break; + case IVAS_AUDIO_CONFIG_BINAURAL: + case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR: + case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB: + case IVAS_AUDIO_CONFIG_ISM1: + case IVAS_AUDIO_CONFIG_ISM2: + case IVAS_AUDIO_CONFIG_ISM3: + case IVAS_AUDIO_CONFIG_ISM4: + hOutSetup->is_binaural_setup = 1; + case IVAS_AUDIO_CONFIG_EXTERNAL: + /* Default values are used */ + break; + default: + return; + } + } + + if ( output_config != IVAS_AUDIO_CONFIG_EXTERNAL && output_config != IVAS_AUDIO_CONFIG_LS_CUSTOM ) + { + nchan_out = audioCfg2channels( output_config ); + hOutSetup->nchan_out_woLFE = nchan_out - hOutSetup->num_lfe; + } + + return; +} + + +/*-----------------------------------------------------------------* + * ivas_get_nchan_buffers_dec() + * + * Return number of decoder audio buffers + *-----------------------------------------------------------------*/ + +/*! r: number of decoder buffers */ +int16_t ivas_get_nchan_buffers_dec( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const int16_t sba_analysis_order, /* i : SBA order evaluated in SBA decoder */ + const int32_t ivas_total_brate /* i : total IVAS bitrate */ +) +{ + int16_t nchan_out_buff; + AUDIO_CONFIG output_config; + + output_config = st_ivas->hDecoderConfig->output_config; + + nchan_out_buff = MAX_OUTPUT_CHANNELS; + + if ( st_ivas->ivas_format == MONO_FORMAT ) + { + nchan_out_buff = 0; + } + else if ( st_ivas->ivas_format == STEREO_FORMAT ) + { + nchan_out_buff = max( st_ivas->hDecoderConfig->nchan_out, CPE_CHANNELS ); + } + else if ( st_ivas->ivas_format == ISM_FORMAT ) + { + nchan_out_buff = st_ivas->nchan_ism; + + if ( output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM ) + { + nchan_out_buff = max( nchan_out_buff, st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe ); + } + else if ( output_config != IVAS_AUDIO_CONFIG_EXTERNAL ) + { + nchan_out_buff = max( audioCfg2channels( st_ivas->transport_config ), audioCfg2channels( st_ivas->intern_config ) ); + nchan_out_buff = max( nchan_out_buff, audioCfg2channels( output_config ) ); + } + } + else if ( st_ivas->ivas_format == SBA_FORMAT ) + { + int16_t nchan_internal; + nchan_internal = ivas_sba_get_nchan_metadata( sba_analysis_order, ivas_total_brate ); + nchan_out_buff = st_ivas->hDecoderConfig->nchan_out; + + if ( output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM ) + { + nchan_out_buff = max( nchan_out_buff, st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe ); + } + else + { + nchan_out_buff = max( audioCfg2channels( st_ivas->transport_config ), audioCfg2channels( st_ivas->intern_config ) ); + nchan_out_buff = max( nchan_out_buff, audioCfg2channels( output_config ) ); + } + nchan_out_buff = max( nchan_out_buff, nchan_internal ); + } + else if ( st_ivas->ivas_format == MASA_FORMAT ) + { + nchan_out_buff = CPE_CHANNELS; + + if ( output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM ) + { + nchan_out_buff = max( nchan_out_buff, st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe ); + } + else if ( output_config != IVAS_AUDIO_CONFIG_EXTERNAL ) + { + nchan_out_buff = max( nchan_out_buff, audioCfg2channels( st_ivas->intern_config ) ); + nchan_out_buff = max( nchan_out_buff, audioCfg2channels( output_config ) ); + } + } + else if ( st_ivas->ivas_format == MASA_ISM_FORMAT ) + { + nchan_out_buff = st_ivas->nchan_ism + CPE_CHANNELS; + + if ( output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM ) + { + nchan_out_buff = max( nchan_out_buff, st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe ); + } + else if ( output_config != IVAS_AUDIO_CONFIG_EXTERNAL ) + { + nchan_out_buff = max( nchan_out_buff, audioCfg2channels( st_ivas->intern_config ) ); + nchan_out_buff = max( nchan_out_buff, audioCfg2channels( output_config ) ); + } + } + else if ( st_ivas->ivas_format == SBA_ISM_FORMAT ) + { + int16_t nchan_internal; + nchan_internal = ivas_sba_get_nchan_metadata( sba_analysis_order, ivas_total_brate ); + nchan_out_buff = st_ivas->nchan_ism + st_ivas->nchan_transport; + + if ( st_ivas->hMCT != NULL ) + { + nchan_out_buff = ( ( nchan_out_buff + 1 ) >> 1 ) << 1; /* ensure odd number of channels in MCT */ + } + + if ( output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM ) + { + nchan_out_buff = max( nchan_out_buff, st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe ); + } + else if ( output_config != IVAS_AUDIO_CONFIG_EXTERNAL ) + { + nchan_out_buff = max( nchan_out_buff, audioCfg2channels( st_ivas->intern_config ) ); + nchan_out_buff = max( nchan_out_buff, audioCfg2channels( output_config ) ); + + if ( st_ivas->renderer_type == RENDERER_OSBA_AMBI || st_ivas->renderer_type == RENDERER_OSBA_LS ) + { + nchan_out_buff = max( nchan_out_buff + st_ivas->nchan_ism, audioCfg2channels( output_config ) ); /* needed for ivas_sba_upmixer_renderer() */ + } + else + { + nchan_out_buff = max( nchan_out_buff + st_ivas->nchan_ism, audioCfg2channels( output_config ) ); /* needed for iivas_spar_dec_upmixer_sf() which is based on 'nchan_out' */ + } + } + else if ( output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) + { + nchan_out_buff = st_ivas->hDecoderConfig->nchan_out + st_ivas->nchan_ism; /*take into account sba_ch_idx' in ivas_dec() */ + } + + if ( !( output_config == IVAS_AUDIO_CONFIG_MONO || output_config == IVAS_AUDIO_CONFIG_STEREO ) ) + { + nchan_out_buff = max( nchan_out_buff, nchan_internal + st_ivas->nchan_ism ); + } + nchan_out_buff = min( nchan_out_buff, MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS ); + } + else if ( st_ivas->ivas_format == MC_FORMAT ) + { + nchan_out_buff = st_ivas->hDecoderConfig->nchan_out; + + if ( output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM ) + { + nchan_out_buff = max( nchan_out_buff, st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe ); + } + else + { + nchan_out_buff = max( audioCfg2channels( st_ivas->transport_config ), audioCfg2channels( st_ivas->intern_config ) ); + nchan_out_buff = max( nchan_out_buff, audioCfg2channels( output_config ) ); + } + } + + + return nchan_out_buff; +} + + +#ifdef NONBE_FIX_839_MC_RS_CHANNEL_ALLOC +/*-------------------------------------------------------------------* + * ivas_output_buff_dec() + * + * Allocate/reallocate output audio buffers + *-------------------------------------------------------------------*/ + +ivas_error ivas_output_buff_dec( + float *p_output_f[], /* i/o: output audio buffers */ + const int16_t nchan_out_buff_old, /* i : previous frame number of output channels */ + const int16_t nchan_out_buff /* i : number of output channels */ +) +{ + int16_t ch; + + if ( nchan_out_buff > nchan_out_buff_old ) + { + for ( ch = nchan_out_buff_old; ch < nchan_out_buff; ch++ ) + { + /* note: these are intra-frame heap memories */ + if ( ( p_output_f[ch] = (float *) malloc( ( 48000 / FRAMES_PER_SEC ) * sizeof( float ) ) ) == NULL ) /* note: 32000 == max internal sampling rate */ + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for floating-point output audio buffer!\n" ) ); + } + } + } + else + { + for ( ch = nchan_out_buff; ch < nchan_out_buff_old; ch++ ) + { + free( p_output_f[ch] ); + p_output_f[ch] = NULL; + } + } + + return IVAS_ERR_OK; +} +#endif diff --git a/lib_rend/ivas_prot_rend.h b/lib_rend/ivas_prot_rend.h new file mode 100644 index 0000000000000000000000000000000000000000..e32a339e8b74b154fe47c3e490b0282e43594a1a --- /dev/null +++ b/lib_rend/ivas_prot_rend.h @@ -0,0 +1,1459 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#ifndef IVAS_PROT_REND_H +#define IVAS_PROT_REND_H + +#include +#include "options.h" +#include "ivas_error.h" +#include "lib_rend.h" +#include "ivas_stat_rend.h" +#include "ivas_stat_dec.h" // Note: needed until #156 is resolved + +/* clang-format off */ + +/*----------------------------------------------------------------------------------* + * General renderer declarations + *----------------------------------------------------------------------------------*/ + +IVAS_REND_AudioConfigType getAudioConfigType( + const AUDIO_CONFIG config +); + +ivas_error getAudioConfigNumChannels( + const AUDIO_CONFIG config, + int16_t *numChannels +); + + +/*----------------------------------------------------------------------------------* + * output setup prototypes + *----------------------------------------------------------------------------------*/ + +/*! r: number of output channels */ +int16_t audioCfg2channels( + const AUDIO_CONFIG output_config /* i : output audio configuration */ +); + +void ivas_output_init( + IVAS_OUTPUT_SETUP *hOutSetup, /* o : output setup structure */ + const AUDIO_CONFIG output_config /* i : output audio configuration */ +); + +/*! r: number of decoder buffers */ +int16_t ivas_get_nchan_buffers_dec( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const int16_t sba_analysis_order, /* i : SBA order evaluated in SBA decoder */ + const int32_t ivas_total_brate /* i : total IVAS bitrate */ +); + + +/*----------------------------------------------------------------------------------* + * Limiter prototypes + *----------------------------------------------------------------------------------*/ + + +ivas_error ivas_limiter_open( + IVAS_LIMITER_HANDLE *hLimiter_out, /* o : limiter struct handle */ + const int16_t num_channels, /* i : number of I/O channels */ + const int32_t sampling_rate /* i : sampling rate for processing */ +); + +void ivas_limiter_close( + IVAS_LIMITER_HANDLE* phLimiter /* i/o: pointer to limiter handle, can be NULL */ +); + +void ivas_limiter_dec +( + IVAS_LIMITER_HANDLE hLimiter, /* i/o: limiter struct handle */ + float *output[MAX_OUTPUT_CHANNELS], /* i/o: input/output buffer */ + const int16_t num_channels, /* i : number of channels to be processed */ + const int16_t output_frame, /* i : number of samples per channel in the buffer */ + const int16_t BER_detect /* i : BER detect flag */ +); + +void limiter_process( + IVAS_LIMITER_HANDLE hLimiter, /* i/o: limiter struct handle */ + const int16_t output_frame, /* i : number of samples to be processed per channel in the I/O buffer */ + const float threshold, /* i : signal amplitude above which limiting starts to be applied */ + const int16_t BER_detect, /* i : BER detect flag */ + int16_t *strong_saturation_cnt /* i/o: counter of strong saturations (can be NULL) */ +); + + +/*----------------------------------------------------------------------------------* + * Amplitude Panning EFAP prototypes + *----------------------------------------------------------------------------------*/ + +ivas_error efap_init_data( + EFAP_HANDLE *hEFAPdata, /* i/o: handle for EFAP data structure that will be initialized */ + const float *speaker_node_azi_deg, /* i : vector of speaker node azimuths (positive left) */ + const float *speaker_node_ele_deg, /* i : vector of speaker node elevations (positive up) */ + const int16_t num_speaker_nodes, /* i : number of speaker nodes in the set */ + const int16_t efap_mode /* i : indicates whether EFAP or EFIP is used */ +); + +void efap_free_data( + EFAP_HANDLE *hEFAPdata /* i/o: EFAP handle to be freed */ +); + +void efap_determine_gains( + EFAP_HANDLE hEFAPdata, /* i : EFAP structure */ + float *gains, /* o : gain vector for speaker nodes for given direction */ + const float azi_deg, /* i : azimuth in degrees for panning direction (positive left) */ + const float ele_deg, /* i : elevation in degrees for panning direction (positive up) */ + const int16_t efap_mode /* i : indicates whether EFAP or EFIP is used */ +); + + +/*----------------------------------------------------------------------------------* + * DirAC/MASA rendering + *----------------------------------------------------------------------------------*/ + +void ivas_sba_prototype_renderer( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */ + float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, real */ + float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, imag */ + const int16_t subframe /* i : Subframe to render */ +); + +ivas_error ivas_sba_get_hoa_dec_matrix( + const IVAS_OUTPUT_SETUP hOutSetup, /* i : target output setup */ + float **hoa_dec_mtx, /* o : ALLRAD decoder matrix */ + const int16_t ambisonics_order /* i : Ambisonics order */ +); + +void ivas_dirac_dec_binaural_sba_gain( + float *output[], /* i/o: synthesized core-coder transport channels/DirAC output */ + const int16_t nchan_remapped, /* i : num channels after remapping of TCs */ + const int16_t output_frame /* i : output frame length */ +); + +void ivas_dirac_dec_binaural( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i : combined orientation handle */ + float *output_f[], /* i/o: synthesized core-coder transport channels/DirAC output */ + const int16_t nchan_transport, /* i : number of transport channels */ + const int16_t num_subframes /* i : number of subframes to render */ +); + +void ivas_dirac_dec_binaural_render( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */ + uint16_t *nSamplesRendered, /* o : number of CLDFB slots rendered */ + uint16_t *nSamplesAvailable, /* o : number of CLDFB slots still to render */ + const int16_t nchan_transport, /* i : number of transport channels */ + float *output_f[] /* o : rendered time signal */ +); + +ivas_error ivas_dirac_dec_init_binaural_data( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + HRTFS_PARAMBIN_HANDLE hHrtfParambin /* i : HRTF structure for rendering */ +); + +void ivas_dirac_dec_close_binaural_data( + DIRAC_DEC_BIN_HANDLE *hBinaural /* i/o: decoder DirAC binaural data handle */ +); + +ivas_error ivas_dirac_dec_binaural_copy_hrtfs( + HRTFS_PARAMBIN_HANDLE *hHrtfParambin /* i/o: HRTF structure for rendering */ +); + +/*! r: Configured reqularization factor value */ +float configure_reqularization_factor( + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const int32_t ivas_total_brate /* i : total IVAS bitrate */ +); + +ivas_error ivas_dirac_alloc_mem( + DIRAC_REND_HANDLE hDirACRend, + const RENDERER_TYPE renderer_type, + const int16_t num_freq_bands, + DIRAC_DEC_STACK_MEM_HANDLE hDirAC_mem, + const int16_t hodirac_flag +); + +void ivas_dirac_free_mem( + DIRAC_DEC_STACK_MEM_HANDLE hDirAC_mem +); + +void initDiffuseResponses( + float *diffuse_response_function, + const int16_t num_channels, + const AUDIO_CONFIG output_config, + const IVAS_OUTPUT_SETUP hOutSetup, + const int16_t ambisonics_order, + const IVAS_FORMAT ivas_format, + int16_t *num_ele_spk_no_diffuse_rendering, + const AUDIO_CONFIG transport_config +); + +void computeIntensityVector_dec( + float Cldfb_RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], + float Cldfb_ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], + const int16_t num_frequency_bands, + float *intensity_real_x, + float *intensity_real_y, + float *intensity_real_z +); + +void protoSignalComputation_shd( + float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], + float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], + float *proto_direct_buffer_f, + float *proto_diffuse_buffer_f, + float *reference_power, + const int16_t slot_index, + const int16_t num_inputs, + const int16_t num_outputs_diff, + const int16_t num_freq_bands, + float *p_Rmat +); + +void protoSignalComputation1( + float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], + float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], + float *proto_frame_f, + float *proto_direct_buffer_f, + float *reference_power, + float *proto_power_smooth, + const int16_t slot_index, + const int16_t num_outputs_diff, + const int16_t num_freq_bands +); + +void protoSignalComputation2( + float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], + float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], + float *proto_frame_f, + float *proto_direct_buffer_f, + float *reference_power, + float *proto_power_smooth, + const int16_t isloudspeaker, + const int16_t slot_index, + const int16_t num_freq_bands, + MASA_STEREO_TYPE_DETECT *stereo_type_detect +); + +void protoSignalComputation4( + float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], + float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], + float *proto_frame_f, + float *proto_direct_buffer_f, + float *reference_power, + float *proto_power_smooth, + const int16_t slot_index, + const int16_t num_outputs_diff, + const int16_t num_freq_bands, + const + float *mtx_hoa_decoder, + const int16_t nchan_transport, + const int16_t *sba_map_tc_ind +); + +void ivas_dirac_dec_compute_diffuse_proto( + DIRAC_REND_HANDLE hDirACRend, + const int16_t num_freq_bands, + const int16_t slot_idx +); + +void computeDirectionAngles( + float *intensity_real_x, + float *intensity_real_y, + float *intensity_real_z, + const int16_t num_frequency_bands, + int16_t *azimuth, + int16_t *elevation +); + +void ivas_masa_init_stereotype_detection( + MASA_STEREO_TYPE_DETECT *stereo_type_detect +); + +void ivas_masa_stereotype_detection( + MASA_STEREO_TYPE_DETECT *stereo_type_detect +); + +void ivas_lfe_synth_with_cldfb( + MCMASA_LFE_SYNTH_DATA_HANDLE hMasaLfeSynth, + float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], + float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], + float RealBufferLfe[MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], + float ImagBufferLfe[MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], + const int16_t slot_index, + const int16_t subframe_index, + const int16_t nchan_transport +); + +void rotateAziEle_DirAC( + int16_t *azi, + int16_t *ele, + const int16_t band1, + const int16_t band2, + const float *p_Rmat +); + +ivas_error ivas_dirac_dec_onset_detection_open( + const int16_t num_channels, + const int16_t num_freq_bands, + const int16_t max_band_decorr, + DIRAC_ONSET_DETECTION_PARAMS *ph_dirac_onset_detection_params, + DIRAC_ONSET_DETECTION_STATE *ph_dirac_onset_detection_state +); + +void ivas_dirac_dec_onset_detection_process( + const float *input_power_f, + float *onset_filter, + const int16_t num_protos_diff, + DIRAC_ONSET_DETECTION_PARAMS h_dirac_onset_detection_params, + DIRAC_ONSET_DETECTION_STATE h_dirac_onset_detection_state +); + +ivas_error ivas_dirac_dec_decorr_open( + DIRAC_DECORR_PARAMS **ph_freq_domain_decorr_ap_params, + DIRAC_DECORR_STATE **ph_freq_domain_decorr_ap_state, + const int16_t num_freq_bands, + int16_t num_outputs_diff, + const int16_t num_protos_diff, + const DIRAC_SYNTHESIS_CONFIG synthesisConf, + float *frequency_axis, + const int16_t nchan_transport, /* i : number of transport channels */ + const int32_t output_Fs /* i : output sampling rate */ +); + +void ivas_dirac_dec_decorr_process( + const int16_t num_freq_bands, + int16_t num_channels, + const int16_t num_protos_diff, + const DIRAC_SYNTHESIS_CONFIG synthesisConf, + const int16_t nchan_transport, /* i : number of transport channels */ + const float *input_frame_f, + const int16_t num_protos_dir, + const int16_t *proto_index_dir, + float *frame_dec_f, + float *onset_filter, + HANDLE_DIRAC_DECORR_PARAMS h_freq_domain_decorr_ap_params, + HANDLE_DIRAC_DECORR_STATE h_freq_domain_decorr_ap_state +); + +void ivas_dirac_dec_decorr_close( + HANDLE_DIRAC_DECORR_PARAMS *ph_dirac_decorr_params, + HANDLE_DIRAC_DECORR_STATE *ph_dirac_decorr_state +); + +ivas_error ivas_dirac_dec_output_synthesis_open( + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, /* i/o: common spatial renderer data handle */ + DIRAC_REND_HANDLE hDirACRend, /* i/o: DirAC renderer handle */ + const RENDERER_TYPE renderer_type, /* i : renderer type */ + const int16_t nchan_transport, /* i : number of transport channels */ + const int32_t output_Fs, /* i : output sampling rate */ + const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ +); + +void ivas_dirac_dec_output_synthesis_init( + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, /* i/o: common spatial renderer data handle */ + DIRAC_REND_HANDLE hDirACRend, /* i/o: DirAC renderer handle */ + const int16_t nchan_out_woLFE, /* i : number of output audio channels without LFE */ + const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ +); + +void ivas_dirac_dec_output_synthesis_close( + DIRAC_REND_HANDLE hDirACRend /* i/o: DirAC handle */ +); + +void ivas_dirac_dec_output_synthesis_process_slot( + const float *reference_power, /* i : Estimated power */ + const float *onset, /* i : onset filter */ + const int16_t *azimuth, + const int16_t *elevation, + const float *diffuseness, + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, /* i/o: common spatial renderer data handle */ + DIRAC_REND_HANDLE hDirACRend, /* i/o: DirAC renderer handle */ + const int16_t sh_rot_max_order, + const float *p_Rmat, /* i : rotation matrix */ + const VBAP_HANDLE hVBAPdata, /* i : VBAP structure */ + const IVAS_OUTPUT_SETUP hOutSetup, /* i : output setup structure */ + const int16_t nchan_transport, /* i : number of transport channels */ + const int16_t ind_slot, /* i : index of the slot to be added to the input covariance */ + const int16_t hodirac_flag, /* i : flag to indicate HO-DirAC mode */ + const int16_t dec_param_estim /* i : flag to indicate parameter estimation mode */ +); + +void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( + float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX],/* i : LS signals */ + float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX],/* i : LS signals */ + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, /* i/o: common spatial renderer data handle */ + DIRAC_REND_HANDLE hDirACRend, /* i/o: DirAC renderer handle */ + const int16_t nchan_transport, /* i : number of transport channels */ + const int16_t nbslots, /* i : number of slots to process */ + const float *onset_filter, + float *diffuseness, + const int16_t hodirac_flag, /* i : flag to indicate HO-DirAC mode */ + const int16_t dec_param_estim /* i : flag to indicate parameter estimation mode */ +); + +void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls( + float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX],/* i : LS signals */ + float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX],/* i : LS signals */ + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, /* i/o: common spatial renderer data handle */ + DIRAC_REND_HANDLE hDirACRend, /* i/o: DirAC renderer handle */ + const int16_t nbslots, /* i : number of slots to process */ + float *diffuseness_vector, /* i : diffuseness (needed for direction smoothing)*/ + float *reference_power_smooth, + float qualityBasedSmFactor, + const int16_t enc_param_start_band +); + +void compute_hoa_encoder_mtx( + const float *azimuth, + const float *elevation, + float *response, + const int16_t num_responses, + const int16_t ambisonics_order ); + +void ivas_dirac_dec_compute_gain_factors( + const int16_t num_freq_bands, + const float *diffuseness, + const int16_t max_band_decorr, + float *direct_gain_factor, + float *diffuse_gain_factor +); + +void ivas_dirac_dec_compute_power_factors( + const int16_t num_freq_bands, + const float *diffuseness, + const int16_t max_band_decorr, + float *direct_power_factor, + float *diffuse_power_factor +); + +void ivas_dirac_dec_compute_directional_responses( + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, /* i/o: common spatial renderer data handle */ + DIRAC_REND_HANDLE hDirACRend, /* i/o: DirAC renderer handle */ + const VBAP_HANDLE hVBAPdata, /* i : VBAP structure */ + const MASA_DECODER_HANDLE hMasa, /* i : MASA decoder structure */ + MASA_ISM_DATA_HANDLE hMasaIsm, /* i : MASA_ISM data structure */ + const int16_t *azimuth, + const int16_t *elevation, + const int16_t md_idx, + const float *surCohRatio, + const int16_t shd_rot_max_order, /* i : split-order rotation method */ + const float *p_Rmat, /* i : rotation matrix */ + const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ +); + +void ivas_dirac_dec_get_frequency_axis( + float *frequency_axis, /* o : array of center frequencies of a real filter bank */ + const int32_t output_Fs, /* i : sampling frequency */ + const int16_t num_freq_bands /* i : number of frequency bands */ +); + +ivas_error ivas_spat_hSpatParamRendCom_config( + SPAT_PARAM_REND_COMMON_DATA_HANDLE *hSpatParamRendCom_out, + const DIRAC_CONFIG_FLAG flag_config_inp, /* i/ : Flag determining if we open or reconfigure the DirAC decoder */ + const int16_t dec_param_estim_flag, + const IVAS_FORMAT ivas_format, + const MC_MODE mc_mode, + const int32_t output_Fs, + const int16_t hodirac_flag +); + +void ivas_spat_hSpatParamRendCom_close( + SPAT_PARAM_REND_COMMON_DATA_HANDLE *hSpatParamRendCom_out +); + +void ivas_dirac_rend_close( + DIRAC_REND_HANDLE *hDirACRend_out +); + +ivas_error ivas_dirac_allocate_parameters( + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, /* i/o: common data for spatial parametric rendering */ + const int16_t params_flag /* i : set of parameters flag */ +); + +void ivas_dirac_deallocate_parameters( + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, /* i/o: common data for spatial parametric rendering */ + const int16_t params_flag /* i : set of parameters flag */ +); + + +/*----------------------------------------------------------------------------------* + * HRTF + *----------------------------------------------------------------------------------*/ + +ivas_error ivas_HRTF_binary_open( + TDREND_HRFILT_FiltSet_t **hHrtfTD /* i/o: TD renderer HRTF handle */ +); + +void ivas_HRTF_binary_close( + TDREND_HRFILT_FiltSet_t **hHrtfTD /* i/o: TD renderer HRTF handle */ +); + +ivas_error ivas_HRTF_fastconv_binary_open( + HRTFS_FASTCONV **hHrtfFastConv /* i/o: FASTCONV HRTF structure */ +); + +void ivas_HRTF_fastconv_binary_close( + HRTFS_FASTCONV **hHrtfFastConv /* i/o: FASTCONV HRTF structure */ +); + +ivas_error ivas_HRTF_parambin_binary_open( + HRTFS_PARAMBIN **hHrtfParambin /* i/o: Parametric binauralizer HRTF structure */ +); + +void ivas_HRTF_parambin_binary_close( + HRTFS_PARAMBIN **hHrtfParambin /* i/o: Parametric binauralizer HRTF structure */ +); + +ivas_error ivas_HRTF_CRend_binary_open( + HRTFS_CREND **hSetOfHRTF /* i/o: Set of HRTF handle */ +); + +void ivas_HRTF_CRend_binary_close( + HRTFS_CREND **hSetOfHRTF /* i/o: Set of HRTF handle */ +); + + +/*----------------------------------------------------------------------------------* + * TD object renderer + *----------------------------------------------------------------------------------*/ + +ivas_error ivas_td_binaural_renderer_unwrap( + const REVERB_HANDLE hReverb, /* i : Reverberator handle */ + const AUDIO_CONFIG transport_config, /* i : Transport configuration */ + BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD binaural object renderer handle */ + const int16_t num_src, /* i : number of sources to render */ + const int16_t lfe_idx, /* i : LFE channel index */ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + ISM_METADATA_HANDLE *hIsmMetaData, /* i : ISM metadata handle */ + const int16_t *enableCombinedOrientation, /* i : Combined orientation flag */ + const IVAS_QUATERNION *Quaternions, /* i : Head tracking data per subframe */ + const IVAS_VECTOR3 *Pos, /* i : Listener position data per subframe */ + const int16_t ism_md_subframe_update, + float *output[], /* i/o: SCE channels / Binaural synthesis */ + const int16_t output_frame, /* i : output frame length */ + const int16_t num_subframes /* i : number of subframes to render */ +); + +ivas_error ivas_td_binaural_renderer_ext( + const TDREND_WRAPPER *pTDRend, /* i : TD Renderer wrapper structure */ + const AUDIO_CONFIG inConfig, /* i : Input audio configuration */ + const LSSETUP_CUSTOM_STRUCT *customLsInput, /* i : Input custom loudspeaker layout */ + const COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData,/* i : Combined head and external orientations */ + const IVAS_ISM_METADATA *currentPos, /* i : Object position */ + const REVERB_HANDLE hReverb, /* i : Reverberator handle */ + const int16_t ism_md_subframe_update_ext, /* i : Metadata Delay in subframes to sync with audio delay */ + const int32_t output_Fs, /* i : output sampling rate */ + const int16_t output_frame, /* i : output frame length */ + float output[][L_FRAME48k] /* i/o: SCE channels / Binaural synthesis */ +); + +ivas_error ivas_td_binaural_open_unwrap( + TDREND_HRFILT_FiltSet_t **hHrtfTD, /* i/o: HR filter model (from file or NULL) */ + const int32_t output_Fs, /* i : Output sampling rate */ + const int16_t nchan_transport, /* i : Number of channels */ + const IVAS_FORMAT ivas_format, /* i : IVAS format (ISM/MC) */ + const AUDIO_CONFIG transport_config, /* i : Transport configuration */ + const float *directivity, /* i : Directivity pattern (used for ISM) */ + const IVAS_OUTPUT_SETUP hTransSetup, /* i : Loudspeaker layout */ + BINAURAL_TD_OBJECT_RENDERER_HANDLE *hBinRendererTd, /* o : TD renderer handle */ + int32_t *binaural_latency_ns /* i : Binauralization delay */ +); + +ivas_error ivas_td_binaural_open_ext( + TDREND_WRAPPER *pTDRend, + const AUDIO_CONFIG inConfig, + RENDER_CONFIG_DATA *hRendCfg, /* i : Renderer configuration */ + LSSETUP_CUSTOM_STRUCT *customLsInput, + const int32_t output_Fs +); + +void ivas_td_binaural_close( + BINAURAL_TD_OBJECT_RENDERER_HANDLE *hBinRendererTd /* i/o: TD binaural object renderer handle */ +); + +ivas_error TDREND_GetMix( + BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ + float *output[], /* i/o: ISM object synth/rendered output in 0,1 */ + const int16_t subframe_length, /* i/o: subframe length */ + const int16_t subframe_idx, /* i : Subframe index to 5 ms subframe */ + const int16_t ism_md_subframe_update /* i : Number of subframes to delay metadata to sync with audio */ +); + +ivas_error TDREND_Update_listener_orientation( + BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD Renderer handle */ + const int16_t headRotEnabled, /* i : Headrotation flag */ + const IVAS_QUATERNION *headPosition, /* i : Listener orientation */ + const IVAS_VECTOR3 *Pos /* i : Listener Position */ +); + +ivas_error TDREND_Update_object_positions( + BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD Renderer handle */ + const int16_t num_src, /* i : number of sources to render */ + const IVAS_FORMAT in_format, /* i : Format of input sources */ + const ISM_METADATA_HANDLE *hIsmMetaData /* i : Input metadata for ISM objects */ +); + +void BSplineModelEvalDealloc( + ModelParams_t *model, /* i : Model parameters */ + ModelEval_t *modelEval /* i : Model evaluation structure */ +); + +/* ----- Object renderer - hrfilt ----- */ + +void GetFilterFromAngle( + TDREND_HRFILT_FiltSet_t *HrFiltSet_p, /* i/o: HR filter set structure */ + const float Elev, /* i : Elevation, degrees */ + float Azim, /* i : Azimuth, degrees */ + const int16_t filterlength, /* i : Filter length */ + float *LeftFilter, /* o : Left HR filter */ + float *RightFilter, /* o : Right HR filter */ + int16_t *itd /* o : ITD value */ +); + +void HRTF_model_precalc( + ModelParams_t *model /* i/o: HRTF Model parameters */ +); + +ivas_error TDREND_REND_RenderSourceHRFilt( + TDREND_SRC_t *Src_p, /* i/o: The source to be rendered */ + const float *hrf_left_delta, /* i : Left filter interpolation delta */ + const float *hrf_right_delta, /* i : Right filter interpolation delta */ + const int16_t intp_count, /* i : Interpolation count */ + float output_buf[][L_SPATIAL_SUBFR_48k], /* o : Output buffer */ + const int16_t subframe_length /* i : Subframe length in use */ +); + +/* ----- Object renderer - sources ----- */ + +ivas_error TDREND_MIX_SRC_SetPos( + BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ + const int16_t SrcInd, /* i : Source index */ + const float *Vec_p /* i : Position vector */ +); + +ivas_error TDREND_MIX_SRC_SetDir( + BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ + const int16_t SrcInd, /* i : Source index */ + const float *Vec_p /* i : Direction vector */ +); + +ivas_error TDREND_MIX_SRC_SetDirAtten( + BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ + const int16_t SrcInd, /* i : Source index */ + const TDREND_DirAtten_t *DirAtten_p /* i : Directional attenuation specifier */ +); + +ivas_error TDREND_MIX_SRC_SetPlayState( + BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ + const int16_t SrcInd, /* i : Source index */ + const TDREND_PlayStatus_t PlayStatus /* i : Play state */ +); + +void TDREND_SRC_REND_UpdateFiltersFromSpatialParams( + BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ + TDREND_SRC_REND_t *SrcRend_p, /* i/o: Source object */ + TDREND_SRC_SPATIAL_t *SrcSpatial_p, /* i : Spatial aspects of source */ + float *hrf_left_prev, /* o : Left filter */ + float *hrf_right_prev, /* o : Right filter */ + float *hrf_left_delta, /* o : Left filter interpolation delta */ + float *hrf_right_delta, /* o : Right filter interpolation delta */ + int16_t *intp_count, /* o : Interpolation count */ + int16_t *filterlength, /* o : Length of filters */ + int16_t *itd, /* o : ITD value */ + float *Gain, /* o : Gain value */ + TDREND_SRC_t *Src_p, + const int16_t subframe_update_flag /* i : Flag to determine update subframe idx */ +); + +ivas_error TDREND_SRC_Alloc( + TDREND_SRC_t **Src_pp /* i/o: Source */ +); + +void TDREND_SRC_Dealloc( + TDREND_SRC_t *Src_p /* i/o: Source to deallocate */ +); + +void TDREND_SRC_Init( + TDREND_SRC_t *Src_p, /* i/o: Source to initialize */ + const TDREND_PosType_t PosType /* i : Position type specifier */ +); + +/* ----- Object renderer - vec ----- */ + +void TDREND_SPATIAL_VecInit( + float *Pos_p, /* o : Output vector */ + const float PosX, /* i : X value */ + const float PosY, /* i : Y value */ + const float PosZ /* i : Z value */ +); + +/*! r: Euclidian norm value */ +float TDREND_SPATIAL_VecNorm( + const float *Vec_p /* i : Vector for norm calculation */ +); + +void TDREND_SPATIAL_VecNormalize( + const float *Vec_p, /* i : Input vector */ + float *VecNorm_p /* o : Output vector */ +); + +void TDREND_SPATIAL_VecMapToNewCoordSystem( + const float *Vec_p, /* i : Input vector */ + const float *TranslVec_p, /* i : Translation vector */ + const float *DirVec_p, /* i : Direction vector */ + const float *UpVec_p, /* i : Up vector */ + const float *RightVec_p, /* i : Right vector */ + float *MappedVec_p, /* o : Transformed vector */ + float *LisRelPosAbs /* o : Transformed vector ignoring orientation */ +); + +/*! r: Flag if the orientation has been updated */ +int16_t TDREND_SPATIAL_EvalOrthonormOrient( + float *FrontVecON_p, /* o : Normalized front vector */ + float *UpVecON_p, /* o : Normalized up vector */ + float *RightVecON_p, /* o : Normalized right vector */ + const float *FrontVec_p, /* i : Input front vector */ + const float *UpVec_p /* i : Input up vector */ +); + +/* ----- Object renderer - mix ----- */ + +ivas_error TDREND_MIX_AddSrc( + BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ + int16_t *SrcInd, /* o : Source index */ + const TDREND_PosType_t PosType /* i : Position type (absolute/relative) */ +); + +ivas_error TDREND_MIX_SetDistAttenModel( + BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ + const TDREND_DistAttenModel_t DistAttenModel /* i : Distance attenuation model */ +); + +void TDREND_MIX_LIST_SetPos( + BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ + const float *Pos_p /* i : Listener's position */ +); + +ivas_error TDREND_MIX_LIST_SetOrient( + BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ + const float *FrontVec_p, /* i : Listener's orientation front vector */ + const float *UpVec_p /* i : Listener's orientation up vector */ +); + +void TDREND_MIX_Dealloc( + BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd /* i/o: TD renderer handle */ +); + +ivas_error TDREND_MIX_Init( + BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ + TDREND_HRFILT_FiltSet_t **hHrtfTD, /* i/o: HRTF data (initialized in case of NULL) */ + const TDREND_MixSpatSpec_t *MixSpatSpec_p, /* i : Mixer spatial specification */ + const int32_t output_Fs /* i : Output sampling rate */ +); + + /* ----- Object renderer - sfx ----- */ + +void TDREND_Apply_ITD( + float *input, /* i : Input SCE subframe to be time adjusted */ + float *out_left, /* o : Output left channels with ITD applied */ + float *out_right, /* o : Output right channels with ITD applied */ + int16_t *previtd, /* i/o: Previous ITD value */ + const int16_t itd, /* i : Current subframe ITD value */ + float *mem_itd, /* i/o: ITD buffer memory */ + const int16_t length /* i : Subframe length */ +); + +void TDREND_firfilt( + float *signal, /* i/o: Input signal / Filtered signal */ + float *filter, /* i/o: FIR filter */ + const float *filter_delta, /* i : FIR filter delta */ + const int16_t intp_count, /* i : interpolation count */ + float *mem, /* i/o: filter memory */ + const int16_t subframe_length, /* i : Length of signal */ + const int16_t filterlength, /* i : Filter length */ + const float Gain, /* i : Gain */ + const float prevGain /* i : Previous gain */ +); + + +/*----------------------------------------------------------------------------------* + * Crend renderer + *----------------------------------------------------------------------------------*/ + +ivas_error ivas_rend_openCrend( + CREND_WRAPPER_HANDLE *pCrend, + const AUDIO_CONFIG inConfig, + const AUDIO_CONFIG outConfig, + RENDER_CONFIG_DATA *hRendCfg, + HRTFS_CREND_HANDLE hSetOfHRTF, + const int32_t output_Fs +); + +void ivas_rend_closeCrend( + CREND_WRAPPER_HANDLE *pCrend +); + +ivas_error ivas_hrtf_init( + HRTFS_DATA *hHrtf /* i/o: HRTF handle */ +); + +ivas_error ivas_rend_initCrendWrapper( + CREND_WRAPPER_HANDLE *pCrend +); + +ivas_error ivas_rend_crendProcess( + const CREND_WRAPPER *pCrend, + const AUDIO_CONFIG inConfig, + const AUDIO_CONFIG outConfig, + DECODER_CONFIG_HANDLE hDecoderConfig, + COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, + IVAS_OUTPUT_SETUP_HANDLE hIntSetup, + EFAP_HANDLE hEFAPdata, + float *output[], /* i/o: input/output audio channels */ + const int32_t output_Fs, + const int16_t num_subframes /* i : number of subframes to render */ +); + +ivas_error ivas_rend_crendProcessSubframe( + const CREND_WRAPPER *pCrend, /* i/o: Crend wrapper handle */ + const AUDIO_CONFIG inConfig, /* i : input audio configuration */ + const AUDIO_CONFIG outConfig, /* i : output audio configuration */ + const DECODER_CONFIG_HANDLE hDecoderConfig, /* i : decoder config. structure */ + const COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i : combined orientation handle */ + const IVAS_OUTPUT_SETUP_HANDLE hIntSetup, /* i : internal setup handle */ + const EFAP_HANDLE hEFAPdata, /* i : EFAP handle */ + DECODER_TC_BUFFER_HANDLE hTcBuffer, /* i/o: JBM handle */ + float *input_f[], /* i : transport channels */ + float *output[], /* i/o: input/output audio channels */ + const int16_t n_samples_to_render, /* i : output frame length per channel */ + const int32_t output_Fs /* i : output sampling rate */ +); + + +/*----------------------------------------------------------------------------------* + * Reverberator + *----------------------------------------------------------------------------------*/ + +ivas_error ivas_binaural_reverb_open_fastconv( + REVERB_STRUCT_HANDLE *hReverbPr, /* i/o: binaural reverb handle */ + const int16_t numBins, /* i : number of CLDFB bins */ + const int16_t numCldfbSlotsPerFrame, /* i : number of CLDFB slots per frame */ + IVAS_ROOM_ACOUSTICS_CONFIG_DATA *roomAcoustics, /* i/o: room acoustics parameters */ + const AUDIO_CONFIG internal_config, /* i : internal audio config for FastConv */ + const int32_t sampling_rate, /* i : sampling rate */ + const HRTFS_FASTCONV_HANDLE hHrtfFastConv /* i : FastConv HRTF handle */ +); + +ivas_error ivas_binaural_reverb_open_parambin( + REVERB_STRUCT_HANDLE *hReverbPr, /* i/o: binaural reverb handle */ + const int16_t numBins, /* i : number of CLDFB bins */ + const int16_t numCldfbSlotsPerFrame, /* i : number of CLDFB slots per frame */ + IVAS_ROOM_ACOUSTICS_CONFIG_DATA *roomAcoustics, /* i/o: room acoustics parameters */ + const int32_t sampling_rate, /* i : sampling rate */ + const HRTFS_PARAMBIN_HANDLE hHrtfParambin /* i : Parametric binauralizer HRTF handle */ +); + +void ivas_binaural_reverb_close( + REVERB_STRUCT_HANDLE *hReverb /* i/o: binaural reverb handle */ +); + +void ivas_binaural_reverb_processSubframe( + REVERB_STRUCT_HANDLE hReverb, /* i/o: binaural reverb handle */ + const int16_t numInChannels, /* i : num input channels to be processed*/ + const int16_t numSlots, /* i : number of slots to be processed */ + float inReal[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : input CLDFB data real */ + float inImag[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : input CLDFB data imag */ + float outReal[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* o : output CLDFB data real */ + float outImag[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX] /* o : output CLDFB data imag */ +); + +ivas_error ivas_reverb_open( + REVERB_HANDLE *hReverb, /* i/o: Reverberator handle */ + const AUDIO_CONFIG input_audio_config, /* i : reverb. input audio configuration */ + const HRTFS_HANDLE hHrtf, /* i : HRTF handle */ + const float *lr_energy_and_iac[], /* i : precomuputed lr energies and iac */ + RENDER_CONFIG_DATA *pConfig, /* i : Reverb configuration */ + const int32_t output_Fs /* i : output sampling rate */ +); + +void ivas_reverb_close( + REVERB_HANDLE *hReverb /* i/o: Reverberator handle */ +); + +ivas_error ivas_reverb_process( + const REVERB_HANDLE hReverb, /* i : Reverberator handle */ + const AUDIO_CONFIG input_audio_config, /* i : reverb. input audio configuration */ + const int16_t mix_signals, /* i : add reverb to output signal */ + float *pcm_in[], /* i : the PCM audio to apply reverb on */ + float *pcm_out[], /* o : the PCM audio with reverb applied */ + const int16_t i_ts /* i : subframe index */ +); + +void ivas_rev_delay_line_init( + ivas_rev_delay_line_t *pDelay, /* o : the delay line to initialize */ + float *memory_buffer, /* i : the memory buffer to use for the delay line */ + const uint16_t delay, /* i : the delay */ + const uint16_t maxdelay /* i : maximum delay to be supported */ +); + +/*! r: sample gotten out of delay line, and amplified by set gain */ +float ivas_rev_delay_line_get_sample( + ivas_rev_delay_line_t *pDelay /* i/o: the delay line */ +); + +void ivas_rev_delay_line_feed_sample( + ivas_rev_delay_line_t *pDelay, /* i : the delay line */ + float input /* i : the sample to feed */ +); + +void ivas_rev_delay_line_get_sample_blk( + ivas_rev_delay_line_t *pDelay, /* i : the delay line */ + const uint16_t blk_size, /* i : number of samples in the data block */ + float *output /* i/o: amples gotten out of delay line, and amplified by set gainin */ +); + +void ivas_rev_delay_line_feed_sample_blk( + ivas_rev_delay_line_t *pDelay, /* i/o: the delay line */ + const uint16_t blk_size, /* i : number of samples in the input data block */ + float *input /* i : the samples to feed */ +); + +void ivas_reverb_iir_filt_init( + ivas_rev_iir_filter_t *iirFilter, /* o : IIR filter */ + const uint16_t maxTaps /* i : maximum number of filter taps */ +); + +void ivas_reverb_iir_filt_set( + ivas_rev_iir_filter_t *iirFilter, /* i/o: IIR filter */ + uint16_t nr_taps, /* i : number of IIR filter taps */ + const float *coefA, /* i : A filter coefficients to set */ + const float *coefB /* i : the B filter coefficients to set */ +); + +void ivas_reverb_iir_filt_2taps_feed_blk( + ivas_rev_iir_filter_t *iirFilter, /* i/o: IIR filter */ + const uint16_t blk_size, /* i : size */ + const float *input, /* i : input buffer */ + float *output /* i : output buffer */ +); + +uint16_t int_log2( + uint32_t powerOf2 +); + +int16_t ivas_reverb_t2f_f2t_init( + ivas_reverb_t2f_f2t_t *t2f_f2t, + const int16_t fft_size, + const int16_t block_size +); + +void ivas_reverb_t2f_f2t_ClearHistory( + ivas_reverb_t2f_f2t_t *t2f_f2t +); + +void ivas_reverb_t2f_f2t_in( + ivas_reverb_t2f_f2t_t *t2f_f2t, + float *input_L, + float *input_R, float *buffer_L, + float *buffer_R +); + +void ivas_reverb_t2f_f2t_out( + ivas_reverb_t2f_f2t_t *t2f_f2t, + float *buffer_L, + float *buffer_R, + float *output_L, + float *output_R +); + +int16_t ivas_reverb_fft_filter_init( + ivas_reverb_fft_filter_t *fft_filter, + const int16_t fft_size +); + +void ivas_reverb_fft_filter_ComplexMul( + ivas_reverb_fft_filter_t *fft_filter, + float *buffer +); + +void ivas_reverb_fft_filter_CrossMix( + float *buffer0, + float *buffer1, + const int16_t fft_size +); + +void ivas_reverb_fft_filter_ConvertFFTWF_2_FFTR( + rv_fftwf_type_complex *spectrum, + float *fft_real, + const int16_t fft_size +); + +void ivas_reverb_define_window_fft( + float *pWindow, + const int16_t transitionStart, + const int16_t transitionLength, + const int16_t spectrumLength +); + +int16_t ivas_reverb_calc_color_filters( + const float *pTargetL, + const float *pTargetR, + const float *pWindow, + const int16_t fft_size, + const float delay, + rv_fftwf_type_complex *pBeqL, + rv_fftwf_type_complex *pBeqR +); + +int16_t ivas_reverb_calc_correl_filters( + const float *pTargetICC, + const float *pWindow, + const int16_t fft_size, + const float delay, + rv_fftwf_type_complex *pU, + rv_fftwf_type_complex *pV +); + +void ivas_reverb_calc_color_levels( + const int32_t output_Fs, + const int16_t freq_count, + const int16_t loop_count, + const float *pFc, + const float *pAcoustic_dsr, + const float *pHrtf_avg_pwr_L, + const float *pHrtf_avg_pwr_R, + const int16_t *pLoop_delays, + const float *pT60_filter_coeff, + float *pTarget_color_L, + float *pTarget_color_R +); + +ivas_error ivas_reverb_prepare_cldfb_params( + IVAS_ROOM_ACOUSTICS_CONFIG_DATA *pInput_params, + const HRTFS_FASTCONV_HANDLE hHrtfFastConv, + const AUDIO_CONFIG input_audio_config, + const int16_t use_brir, + const int32_t output_Fs, + float *pOutput_t60, + float *pOutput_ene ); + +void ivas_reverb_interpolate_acoustic_data( + const int16_t input_table_size, + const float *pInput_fc, + const float *pInput_t60, + const float *pInput_dsrR, + const int16_t output_table_size, + const float *pOutput_fc, + float *pOutput_t60, + float *pOutput_dsr +); + +void ivas_reverb_get_hrtf_set_properties( + float **ppHrtf_set_L_re, + float **ppHrtf_set_L_im, + float **ppHrtf_set_R_re, + float **ppHrtf_set_R_im, + const AUDIO_CONFIG input_audio_config, + const int16_t hrtf_count, + const int16_t in_freq_count, + const int16_t out_freq_count, + float *pOut_avg_pwr_L, + float *pOut_avg_pwr_R, + float *pOut_i_a_coherence +); + + +/*---------------------------------------------------------------------------------* + * Shoebox Prototypes + *-----------------------------------------------------------------------------------*/ + +void ivas_shoebox_config_init( + shoebox_config_t *cal, + RENDER_CONFIG_HANDLE pConfig +); + +void ivas_shoebox_init( + shoebox_obj_t *obj, + shoebox_config_t *cal +); + +void ivas_shoebox_set_scene ( + shoebox_obj_t *obj, + shoebox_output_t *ER_PARAMS, + const float list_pos[3], + const float src_pos_data[], + const uint16_t isCartesian, + const uint16_t isRelative +); + +/*---------------------------------------------------------------------------------* + * Early reflections prototypes + *-----------------------------------------------------------------------------------*/ + +ivas_error ivas_er_init( + er_struct_t *reflections, + const AUDIO_CONFIG inConfig +); + +ivas_error ivas_er_set_reflections_mode( + er_struct_t *reflections, + const AUDIO_CONFIG inConfig +); + +ivas_error ivas_er_compute_reflections( + er_struct_t *reflections +); + +ivas_error ivas_er_encoder_init( + er_struct_t *reflections +); + +ivas_error ivas_er_process( + er_struct_t *reflections, + const int16_t frame_size, + const int16_t subframe_idx, + float **io, + const AUDIO_CONFIG inConfig +); + + +/*---------------------------------------------------------------------------------* + * Rotation Prototypes + *-----------------------------------------------------------------------------------*/ + +ivas_error ivas_headTrack_open( + HEAD_TRACK_DATA_HANDLE *hHeadTrackData /* o : head track handle */ +); + +void ivas_headTrack_close( + HEAD_TRACK_DATA_HANDLE *hHeadTrackData /* i/o: head track handle */ +); + +void Euler2Quat( + const float yaw, /* i : yaw (x) */ + const float pitch, /* i : pitch (y) */ + const float roll, /* i : roll (z) */ + IVAS_QUATERNION *quat /* o : quaternion describing the rotation */ +); + +float deg2rad( + float degrees +); + +float rad2deg( + float radians +); + +void QuatToRotMat( + const IVAS_QUATERNION quat, /* i : quaternion describing the rotation */ + float Rmat[3][3] /* o : real-space rotation matrix for this rotation */ +); + + +void rotateAziEle( + float azi_in, /* i : output elevation */ + float ele_in, /* i : input elevation */ + int16_t *azi, /* o : rotated azimuth */ + int16_t *ele, /* o : rotated elevation */ + float Rmat[3][3], /* i : real-space rotation matrix */ + const int16_t isPlanar /* i : is roation planar and elevation meaningless? */ +); + +void SHrotmatgen( + float SHrotmat[SBA_NHARM_HOA3][SBA_NHARM_HOA3], /* o : SHD rotation matrix */ + float Rmat[3][3], /* i : real-space rotation matrix */ + const int16_t order /* i : ambisonics order */ +); + +void rotateFrame_shd( + COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i : head and external orientation combined handle */ + float *output[], /* i/o: unrotated HOA3 signal buffer in TD */ + const int16_t subframe_len, /* i : subframe length per channel */ + const IVAS_OUTPUT_SETUP hTransSetup, /* i : format for rotation */ + const int16_t subframe_idx /* i : subframe index */ +); + +void rotateFrame_sd( + COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i : head and external orientation combined handle */ + float *output[], /* i/o: unrotated SD signal buffer in TD */ + const int16_t subframe_len, /* i : subframe length per channel */ + const IVAS_OUTPUT_SETUP hTransSetup, /* i : format for rotation */ + const EFAP_HANDLE hEFAPdata, /* i : EFAP structure */ + const int16_t subframe_idx /* i : subframe index */ +); + +void rotateFrame_shd_cldfb( + float Cldfb_RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o: unrotated HOA3 signal buffer in cldfb domain real part */ + float Cldfb_ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o: unrotated HOA3 signal buffer in cldfb domain imag part */ + float Rmat[3][3], /* i : real-space rotation matrix */ + const int16_t nInChannels, /* i : number of channels */ + const int16_t numTimeSlots, /* i : number of time slots to process */ + const int16_t shd_rot_max_order /* i : split-order rotation method */ +); + +void rotateFrame_sd_cldfb( + float Rmat[3][3], /* i : real-space rotation matrix */ + float Cldfb_RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o: unrotated HOA3 signal buffer in cldfb domain real part */ + float Cldfb_ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o: unrotated HOA3 signal buffer in cldfb domain imag part */ + const IVAS_OUTPUT_SETUP_HANDLE hOutputSetup, /* i : output format setup number of channels */ + const EFAP_HANDLE hEFAPdata, /* i : EFAP structure */ + const int16_t numTimeSlots, /* i : number of time slots to process */ + const int16_t nb_band /* i : number of CLDFB bands to process */ +); + +ivas_error ivas_external_orientation_open( + EXTERNAL_ORIENTATION_HANDLE *hExtOrientationData, /* o : external orientation handle */ + const int16_t num_subframes /* i : number of subframes */ +); + +void ivas_external_orientation_close( + EXTERNAL_ORIENTATION_HANDLE *hExtOrientationData /* i/o: external orientation handle */ +); + +ivas_error ivas_combined_orientation_open( + COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData, /* o : combined orientation handle */ + const int16_t num_subframes /* i : number of subframes */ +); + +void ivas_combined_orientation_close( + COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData /* i/o: combined orientation handle */ +); + +ivas_error combine_external_and_head_orientations_dec( + HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i : head track handle */ + EXTERNAL_ORIENTATION_HANDLE hExtOrientationData, /* i : external orientation handle */ + COMBINED_ORIENTATION_HANDLE hCombinedOrientationData /* i/o: combined orientation handle */ +); + +ivas_error combine_external_and_head_orientations_rend( + IVAS_REND_HeadRotData *hHeadTrackData, /* i : head track handle */ + EXTERNAL_ORIENTATION_HANDLE hExtOrientationData, /* i : external orientation handle */ + COMBINED_ORIENTATION_HANDLE hCombinedOrientationData /* i/o: combined orientation handle */ +); + +/*----------------------------------------------------------------------------------* + * Renderer configuration + *----------------------------------------------------------------------------------*/ + +ivas_error ivas_render_config_open( + RENDER_CONFIG_HANDLE *hRenderConfig /* i/o: Renderer config handle */ +); + +void ivas_render_config_close( + RENDER_CONFIG_HANDLE *hRenderConfig /* i/o: Renderer config handle */ +); + +ivas_error ivas_render_config_init_from_rom( + RENDER_CONFIG_HANDLE *hRenderConfig /* i/o: Renderer config handle */ +); + + +/*----------------------------------------------------------------------------------* + * Quaternion operations + *----------------------------------------------------------------------------------*/ + +void QuaternionProduct( + const IVAS_QUATERNION q1, + const IVAS_QUATERNION q2, + IVAS_QUATERNION *const r +); + +void QuaternionInverse( + const IVAS_QUATERNION q, + IVAS_QUATERNION *const r +); + +void QuaternionSlerp( + const IVAS_QUATERNION q1, + const IVAS_QUATERNION q2, + const float t, + IVAS_QUATERNION *const r +); + + +/*----------------------------------------------------------------------------------* + * Orientation tracking + *----------------------------------------------------------------------------------*/ + +ivas_error ivas_orient_trk_Init( + ivas_orient_trk_state_t *pOTR /* i/o: orientation tracker handle */ +); + +ivas_error ivas_orient_trk_SetTrackingType( + ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */ + const IVAS_HEAD_ORIENT_TRK_T orientation_tracking /* i : orientation tracking type */ +); + +ivas_error ivas_orient_trk_SetReferenceRotation( + ivas_orient_trk_state_t *pOTR, /* i/o: orientatoin trakcer handle */ + const IVAS_QUATERNION refRot /* i : reference rotation */ +); + +ivas_error ivas_orient_trk_SetReferenceVector( + ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */ + const IVAS_VECTOR3 listenerPos, /* i : Listener position */ + const IVAS_VECTOR3 refPos /* i : Reference position */ +); + +ivas_error ivas_orient_trk_GetMainOrientation( + ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */ + IVAS_QUATERNION *pOrientation /* i/o: average/reference orientation */ +); + +ivas_error ivas_orient_trk_GetTrackedRotation( + ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */ + IVAS_QUATERNION *pRotation /* i/o: processed rotation */ +); + +ivas_error ivas_orient_trk_Process( + ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */ + IVAS_QUATERNION absRot, /* i : absolute head rotation */ + float updateRate, /* i : rotation update rate [Hz] */ + IVAS_QUATERNION *pTrkRot /* o : tracked rotation */ +); + + +/*----------------------------------------------------------------------------------* + * Rendering & merging to MASA format + *----------------------------------------------------------------------------------*/ + +ivas_error ivas_mcmasa_ana_open( + MCMASA_ANA_HANDLE *hMcMasaPtr, /* i/o: McMASA data handle pointer */ + const AUDIO_CONFIG inConfig, /* i : Input config */ + int32_t input_Fs /* i : Sampling frequency */ +); + +void ivas_mcmasa_ana( + MCMASA_ANA_HANDLE hMcMasa, /* i/o: McMASA encoder handle */ + float data_f[][L_FRAME48k], /* i/o: Input / transport audio signals */ + const int16_t input_frame, /* i : Input frame size */ + const int16_t nchan_transport, /* i : Number of transport channels */ + const int16_t nchan_inp /* i : Number of input channels */ +); + +void ivas_mcmasa_ana_close( + MCMASA_ANA_HANDLE *hMcMasa /* i/o: analysis McMASA handle */ +); + +ivas_error ivas_omasa_ana_open( + OMASA_ANA_HANDLE *hOMasaPtr, /* i/o: OMASA data handle pointer */ + int32_t input_Fs, /* i : Sampling frequency */ + uint16_t total_num_objects /* i : Number of objects */ +); + +void ivas_omasa_ana( + OMASA_ANA_HANDLE hOMasa, /* i/o: OMASA analysis handle */ + float data_in_f[][L_FRAME48k], /* i/o: Input / transport audio signals */ + const int16_t input_frame, /* i : Input frame size */ + const int16_t nchan_transport, /* i : Number of transport channels */ + const int16_t nchan_ism /* i : Number of objects for parameter analysis*/ +); + +void ivas_omasa_ana_close( + OMASA_ANA_HANDLE *hOMasa /* i/o: analysis OMASA handle */ +); + +void computeIntensityVector_ana( + const int16_t *band_grouping, /* i : Band grouping for estimation */ + float Cldfb_RealBuffer[DIRAC_MAX_ANA_CHANS][CLDFB_NO_CHANNELS_MAX], /* i : Real part of input signal */ + float Cldfb_ImagBuffer[DIRAC_MAX_ANA_CHANS][CLDFB_NO_CHANNELS_MAX], /* i : Imag part of input signal */ + const int16_t num_frequency_bands, /* i : Number of frequency bands */ + float intensity_real[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS] /* o : Intensity vector */ +); + +void computeReferencePower_ana( + const int16_t *band_grouping, /* i : Band grouping for estimation */ + float Cldfb_RealBuffer[DIRAC_MAX_ANA_CHANS][CLDFB_NO_CHANNELS_MAX], /* i : Real part of input signal */ + float Cldfb_ImagBuffer[DIRAC_MAX_ANA_CHANS][CLDFB_NO_CHANNELS_MAX], /* i : Imag part of input signal */ + float *reference_power, /* o : Estimated power */ + const int16_t num_freq_bands /* i : Number of frequency bands */ +); + +void ivas_create_masa_out_meta( + MASA_DECODER_EXT_OUT_META_HANDLE extOutMeta, /* i/o: MASA metadata handle */ + SPHERICAL_GRID_DATA *Sph_Grid16, /* i : Spherical grid */ + const int16_t nchan_transport, /* i : Number of transport channels */ + float elevation_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i : Estimated elevation */ + float azimuth_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i : Estimated azimuth */ + float energyRatio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i : Estimated direct-to-total ratio */ + float spreadCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i : Estimated spread coherence */ + float surroundingCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS] /* i : Estimated surround coherence */ +); + +ivas_error ivas_dirac_ana_open( + DIRAC_ANA_HANDLE *hDirACPtr, /* i/o: DIRAC data handle pointer */ + int32_t input_Fs +); + +void ivas_dirac_ana( + DIRAC_ANA_HANDLE hDirAC, /* i/o: DIRAC analysis handle */ + float data_in_f[][L_FRAME48k], /* i/o: Input / transport audio signals */ + const int16_t input_frame, /* i : Input frame size */ + const int16_t nchan_transport /* i : Number of transport channels */ +); + +void ivas_dirac_ana_close( + DIRAC_ANA_HANDLE ( *hDirAC ) /* i/o: analysis DIRAC handle */ +); + +void ivas_prerend_merge_masa_metadata( + MASA_DECODER_EXT_OUT_META_HANDLE outMeta, /* o : Merged metadata output */ + MASA_DECODER_EXT_OUT_META_HANDLE inMeta1, /* i : Input metadata 1 */ + IVAS_REND_AudioConfigType inType1, /* i : Type of input 1 */ + float inEne1[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i/o: TF-energy of input 1. after merge, contains the energy of the merged signal */ + MASA_DECODER_EXT_OUT_META_HANDLE inMeta2, /* i : Input metadata 2 */ + IVAS_REND_AudioConfigType inType2, /* i : Type of input 2 */ + float inEne2[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS] /* i : TF-energy of input 2 */ +); + +void copy_masa_descriptive_meta( + MASA_DECRIPTIVE_META *outMeta, /* o : metadata to be written */ + MASA_DECRIPTIVE_META *inMeta /* i : input metadata */ +); + +ivas_error masaPrerendOpen( + MASA_PREREND_HANDLE *hMasaPrerendPtr, /* o : handle to the opened prerenderer */ + int16_t numTransports, /* i : number of transport channels */ + int32_t input_Fs /* i : signal sampling rate */ +); + +void masaPrerendClose( + MASA_PREREND_HANDLE *hMasaPrerendPtr /* i/o: prerenderer handle to be closed */ +); + + + +/* clang-format on */ + +#endif /* IVAS_PROT_REND_H */ diff --git a/lib_rend/ivas_reflections.c b/lib_rend/ivas_reflections.c new file mode 100644 index 0000000000000000000000000000000000000000..ae954fbac769a23ec01f9487cfb6a076e3341a71 --- /dev/null +++ b/lib_rend/ivas_reflections.c @@ -0,0 +1,540 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include "options.h" +#include +#include +#include "prot.h" +#include "rom_dec.h" +#include "lib_rend.h" +#include "ivas_prot_rend.h" +#include "ivas_stat_rend.h" +#include "ivas_cnst.h" +#include "ivas_prot.h" +#include "ivas_rom_com.h" +#include "wmc_auto.h" + + +/*-----------------------------------------------------------------------------------------* + * Local constants/tabels + *-----------------------------------------------------------------------------------------*/ + +static uint16_t LC_mixing_5_1[5] = { 0, 1, 2, 0, 1 }; + +static uint16_t LC_mixing_7_1[7] = { 0, 1, 2, 3, 4, 3, 4 }; + +static uint16_t LC_mixing_5_1_2[7] = { 0, 1, 2, 3, 4, 0, 1 }; + +static uint16_t LC_mixing_5_1_4[9] = { 0, 1, 2, 3, 4, 0, 1, 2, 3 }; + +static uint16_t LC_mixing_7_1_4[11] = { 0, 1, 2, 3, 4, 3, 4, 0, 1, 2, 3 }; + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_er_init() + * + * Initializes the reflections data structure according to the requested input config. + *-----------------------------------------------------------------------------------------*/ + +ivas_error ivas_er_init( + er_struct_t *reflections, + const AUDIO_CONFIG inConfig ) +{ + ivas_error error; + uint8_t i; + + /* Set to defaults for shoebox */ + reflections->is_ready = 0; + reflections->audio_config = IVAS_AUDIO_CONFIG_INVALID; + reflections->is_cartesian = 0; + reflections->is_relative = 1; + reflections->shoebox_data.n_ref = ER_NUM_REF; + reflections->user_origin[0] = 0.0f; + reflections->user_origin[1] = 0.0f; + reflections->user_origin[2] = ER_LIST_HEIGHT; + + /* Store scene origin if present */ + for ( i = 0; i < 3; i++ ) + { + reflections->user_origin[i] = reflections->shoebox_lib.cal.list_orig[i]; + } + + /* Init Shoebox */ + ivas_shoebox_init( &reflections->shoebox_lib, &reflections->shoebox_lib.cal ); + + /* Set mode */ + if ( ( error = ivas_er_set_reflections_mode( reflections, inConfig ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Compute the static reflections (first frame) */ + if ( ( error = ivas_er_compute_reflections( reflections ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( reflections->closest_ch_idx = (uint16_t *) malloc( reflections->n_total_reflections * sizeof( uint16_t ) ) ) == NULL ) + { + return IVAS_ERR_FAILED_ALLOC; + } + set_s( (int16_t *) reflections->closest_ch_idx, 0, reflections->n_total_reflections ); + + if ( ( error = getAudioConfigNumChannels( reflections->audio_config, &( reflections->nchan_out ) ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Initialize Encoder */ + if ( ( error = ivas_er_encoder_init( reflections ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Update flag to indicate that reflection module is ready to process */ + reflections->is_ready = 1; + + return error; +} + + +/*-----------------------------------------------------------------------------------------* + Function ivas_er_set_reflections_mode() + + Function sets the ER source positions based on the audio config + *-----------------------------------------------------------------------------------------*/ + +ivas_error ivas_er_set_reflections_mode( + er_struct_t *reflections, + const AUDIO_CONFIG inConfig ) +{ + ivas_error error; + uint16_t ch; + error = IVAS_ERR_OK; + + if ( reflections->audio_config == inConfig ) + { + return error; + } + + reflections->is_ready = 0; + reflections->audio_config = inConfig; + + switch ( reflections->audio_config ) + { + case IVAS_AUDIO_CONFIG_MONO: + reflections->shoebox_data.n_sources = 1; + reflections->n_LC_sources = 1; + reflections->LC_mixing = LC_mixing_5_1; + reflections->source_positions[0] = 0; + reflections->source_positions[1] = 0; + reflections->source_positions[2] = ER_RADIUS; + break; + case IVAS_AUDIO_CONFIG_STEREO: + reflections->shoebox_data.n_sources = 2; + reflections->n_LC_sources = 2; + reflections->LC_mixing = LC_mixing_5_1; + for ( ch = 0; ch < reflections->shoebox_data.n_sources; ch++ ) + { + reflections->source_positions[3 * ch] = deg2rad( ls_azimuth_CICP2[ch] ); + reflections->source_positions[1 + ( 3 * ch )] = deg2rad( ls_elevation_CICP2[ch] ); + reflections->source_positions[2 + ( 3 * ch )] = ER_RADIUS; + } + break; + case IVAS_AUDIO_CONFIG_5_1: + reflections->shoebox_data.n_sources = 5; + reflections->n_LC_sources = 3; + reflections->LC_mixing = LC_mixing_5_1; + for ( ch = 0; ch < reflections->shoebox_data.n_sources; ch++ ) + { + reflections->source_positions[3 * ch] = deg2rad( ls_azimuth_CICP6[ch] ); + reflections->source_positions[1 + ( 3 * ch )] = deg2rad( ls_elevation_CICP6[ch] ); + reflections->source_positions[2 + ( 3 * ch )] = ER_RADIUS; + } + break; + case IVAS_AUDIO_CONFIG_7_1: + reflections->shoebox_data.n_sources = 7; + reflections->n_LC_sources = 5; + reflections->LC_mixing = LC_mixing_7_1; + for ( ch = 0; ch < reflections->shoebox_data.n_sources; ch++ ) + { + reflections->source_positions[3 * ch] = deg2rad( ls_azimuth_CICP12[ch] ); + reflections->source_positions[1 + ( 3 * ch )] = deg2rad( ls_elevation_CICP12[ch] ); + reflections->source_positions[2 + ( 3 * ch )] = ER_RADIUS; + } + break; + case IVAS_AUDIO_CONFIG_5_1_2: + reflections->shoebox_data.n_sources = 7; + reflections->n_LC_sources = 5; + reflections->LC_mixing = LC_mixing_5_1_2; + for ( ch = 0; ch < reflections->shoebox_data.n_sources; ch++ ) + { + reflections->source_positions[3 * ch] = deg2rad( ls_azimuth_CICP14[ch] ); + reflections->source_positions[1 + ( 3 * ch )] = deg2rad( ls_elevation_CICP14[ch] ); + reflections->source_positions[2 + ( 3 * ch )] = ER_RADIUS; + } + break; + case IVAS_AUDIO_CONFIG_5_1_4: + reflections->shoebox_data.n_sources = 9; + reflections->n_LC_sources = 5; + reflections->LC_mixing = LC_mixing_5_1_4; + for ( ch = 0; ch < reflections->shoebox_data.n_sources; ch++ ) + { + reflections->source_positions[3 * ch] = deg2rad( ls_azimuth_CICP16[ch] ); + reflections->source_positions[1 + ( 3 * ch )] = deg2rad( ls_elevation_CICP16[ch] ); + reflections->source_positions[2 + ( 3 * ch )] = ER_RADIUS; + } + break; + case IVAS_AUDIO_CONFIG_7_1_4: + reflections->shoebox_data.n_sources = 11; + reflections->n_LC_sources = 5; + reflections->LC_mixing = LC_mixing_7_1_4; + for ( ch = 0; ch < reflections->shoebox_data.n_sources; ch++ ) + { + reflections->source_positions[3 * ch] = deg2rad( ls_azimuth_CICP19[ch] ); + reflections->source_positions[1 + ( 3 * ch )] = deg2rad( ls_elevation_CICP19[ch] ); + reflections->source_positions[2 + ( 3 * ch )] = ER_RADIUS; + } + break; + case IVAS_AUDIO_CONFIG_HOA3: + reflections->use_er = 0; + break; + case IVAS_AUDIO_CONFIG_HOA2: + reflections->use_er = 0; + break; + case IVAS_AUDIO_CONFIG_FOA: + reflections->use_er = 0; + break; + default: + reflections->audio_config = IVAS_AUDIO_CONFIG_INVALID; + return IVAS_ERROR( IVAS_ERR_INVALID_ER_PARAM, "Unsupported reflections mode" ); + } + + return error; +} + + +/*-----------------------------------------------------------------------------------------* + Function ivas_er_encoder_init() + + Function that initializes the er encoder + *-----------------------------------------------------------------------------------------*/ + +ivas_error ivas_er_encoder_init( + er_struct_t *reflections ) +{ + ivas_error error = IVAS_ERR_OK; + uint16_t i, j, src_idx; + uint16_t min_index = 0; + float p_x, p_y, p_z; + float p_x_src, p_y_src, p_z_src; + float tmp; + float dist, min_dist = 0; + + if ( !reflections ) + { + return IVAS_ERR_FAILED_ALLOC; + } + + if ( getAudioConfigType( reflections->audio_config ) == IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) + { + /* Compute MC-snap location (closest channel position to reflection direction) */ + for ( i = 0; i < reflections->n_total_reflections; i++ ) + { + /* Compute cartesian points for reflection (from degrees) */ + p_x = ER_RADIUS * ( cosf( deg2rad( reflections->shoebox_data.el_angle.data[i] ) ) * cosf( deg2rad( reflections->shoebox_data.az_angle.data[i] ) ) ); + p_y = ER_RADIUS * ( cosf( deg2rad( reflections->shoebox_data.el_angle.data[i] ) ) * sinf( deg2rad( reflections->shoebox_data.az_angle.data[i] ) ) ); + p_z = ER_RADIUS * ( sinf( deg2rad( reflections->shoebox_data.el_angle.data[i] ) ) ); + + /* Calculate the euclidean distance to each point in the config ls setup */ + for ( j = 0; j < reflections->nchan_out; j++ ) + { + /* Ignore LFE */ + if ( j != LFE_CHANNEL ) + { + src_idx = ( j > LFE_CHANNEL ) ? j - 1 : j; + + p_x_src = reflections->source_positions[src_idx * 3 + 2] * ( cosf( reflections->source_positions[src_idx * 3 + 1] ) * cosf( reflections->source_positions[src_idx * 3] ) ); + p_y_src = reflections->source_positions[src_idx * 3 + 2] * ( cosf( reflections->source_positions[src_idx * 3 + 1] ) * sinf( reflections->source_positions[src_idx * 3] ) ); + p_z_src = reflections->source_positions[src_idx * 3 + 2] * sinf( reflections->source_positions[src_idx * 3 + 1] ); + + tmp = ( p_x_src - p_x ) * ( p_x_src - p_x ); + tmp += ( p_y_src - p_y ) * ( p_y_src - p_y ); + tmp += ( p_z_src - p_z ) * ( p_z_src - p_z ); + dist = sqrtf( tmp ); + + /* Save index of closest channel */ + if ( src_idx == 0 ) + { + min_dist = dist; + min_index = j; + } + else + { + if ( dist < min_dist ) + { + min_dist = dist; + min_index = j; + } + } + } + } + + reflections->closest_ch_idx[i] = (uint16_t) min_index; + } + } + + return error; +} + + +/*-----------------------------------------------------------------------------------------* + Function ivas_er_compute_reflections() + + Function computes reflections using the shoebox library and sets up the circular buffers + structure for the early reflections process + *-----------------------------------------------------------------------------------------*/ + +ivas_error ivas_er_compute_reflections( + er_struct_t *reflections ) +{ + ivas_error error = IVAS_ERR_OK; + uint16_t circ_len, i, j; + float tmp; + + reflections->is_ready = 0; + + /* Disabled case */ + if ( reflections->audio_config == IVAS_AUDIO_CONFIG_INVALID ) + { + return error; + } + + /* Run shoebox with current reflection parameters */ + ivas_shoebox_set_scene( &( reflections->shoebox_lib ), &( reflections->shoebox_data ), reflections->shoebox_lib.cal.list_orig, + reflections->source_positions, reflections->is_cartesian, reflections->is_relative ); + + /* Convert reflection times in seconds to samples and keep track of max */ + circ_len = 0; + for ( i = 0; i < reflections->shoebox_data.n_sources; i++ ) + { + for ( j = 0; j < reflections->shoebox_data.n_ref; j++ ) + { + tmp = reflections->shoebox_data.times.data[j + ( i * reflections->shoebox_data.n_ref )]; + tmp = roundf( tmp * reflections->output_Fs ); + reflections->shoebox_data.times.data[j + ( i * reflections->shoebox_data.n_ref )] = tmp; + circ_len = ( (uint16_t) tmp > circ_len ) ? (uint16_t) tmp : circ_len; + } + } + + /* If max delay is less than max frame size, use max frame size to compute circ buffer length */ + circ_len = ( circ_len > (uint16_t) reflections->max_frame_size ) ? circ_len : (uint16_t) reflections->max_frame_size; + circ_len += (uint16_t) reflections->max_frame_size; + + /* If circ buffers exist and size is the same, reset memory to all zeros */ + /* If size is different, reallocate circ buffers */ + /* Otherwise allocate new circ buffers */ + if ( reflections->circ_buffers ) + { + if ( reflections->circ_len == circ_len ) + { + /* circ buffers exist and size is the same */ + set_f( reflections->circ_buffers, 0.0f, reflections->shoebox_data.n_sources * reflections->circ_len ); + } + else + { + /* circ buffers exist but size is different */ + reflections->circ_len = circ_len; + free( reflections->circ_buffers ); + if ( ( reflections->circ_buffers = (float *) malloc( reflections->shoebox_data.n_sources * reflections->circ_len * sizeof( float ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Early Reflections buffers" ); + } + set_f( reflections->circ_buffers, 0.0f, reflections->shoebox_data.n_sources * reflections->circ_len ); + } + } + else + { + /* circ buffers do not exist */ + reflections->circ_len = circ_len; + if ( ( reflections->circ_buffers = (float *) malloc( reflections->shoebox_data.n_sources * reflections->circ_len * sizeof( float ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Early Reflections buffers" ); + } + set_f( reflections->circ_buffers, 0.0f, reflections->shoebox_data.n_sources * reflections->circ_len ); + } + + + /* Initialize circular buffer insertion point */ + reflections->circ_insert = reflections->circ_len - (uint16_t) reflections->max_frame_size; + + /* Get total reflections number */ + reflections->n_total_reflections = reflections->shoebox_data.n_sources * reflections->shoebox_data.n_ref; + + /* Check that reflection buffers were allocated */ + if ( error != IVAS_ERR_OK ) + { + return error; + } + + return error; +} + + +/*-----------------------------------------------------------------------------------------* +Function ivas_er_process() + +Takes a buffer of N channels, returns a buffer of N*6 channels containing the early +reflections (one per wall). The process is a delay line architecture +*-----------------------------------------------------------------------------------------*/ + + +ivas_error ivas_er_process( + er_struct_t *reflections, + const int16_t subframe_size, + const int16_t subframe_idx, + float **io, + const AUDIO_CONFIG inConfig ) +{ + ivas_error error = IVAS_ERR_OK; + uint16_t i, j, k, subframe_offset; + uint16_t ref_no, ref_delay; + uint16_t n_ref_sources, n_ref; + int16_t samp_idx, in_ch_idx, buf_ch_idx, ref_out_idx; + float ref_gain; + float *buffer_ch; + + if ( !reflections ) + { + return IVAS_ERR_INIT_ERROR; + } + + /* should not arrive here if reflections are disabled but in case it does just do nothing */ + if ( reflections->use_er != 1 ) + { + return error; + } + + /* Ensure all reflection memory is allocated */ + if ( !reflections->circ_buffers || !reflections->is_ready ) + { + return IVAS_ERR_INIT_ERROR; + } + + subframe_offset = subframe_idx * subframe_size; + n_ref = reflections->shoebox_data.n_ref; + + /* If low complexity ER are requested only compute ER for n_LC_sources */ + if ( reflections->lowComplexity ) + { + n_ref_sources = reflections->n_LC_sources; + } + else + { + n_ref_sources = reflections->shoebox_data.n_sources; + } + + /* Channel case, copy input into buffers panning for LC mode and skipping LFE */ + if ( getAudioConfigType( inConfig ) == IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) + { + /* Loop through all input sources filling circular buffers */ + for ( i = 0; i < reflections->shoebox_data.n_sources; i++ ) + { + /* Pull correct circular buffer depending on complexity mode */ + buf_ch_idx = ( reflections->lowComplexity == 1 ) ? reflections->LC_mixing[i] : i; + buffer_ch = &( reflections->circ_buffers[buf_ch_idx * reflections->circ_len] ); + + /* Skip LFE from input buffer */ + in_ch_idx = ( i >= LFE_CHANNEL ) ? i + 1 : i; + samp_idx = reflections->circ_insert; + + /* If less than number of reflection sources, overwrite buffer */ + if ( i == buf_ch_idx ) + { + for ( j = 0; j < subframe_size; j++ ) + { + buffer_ch[samp_idx++] = io[in_ch_idx][j + subframe_offset]; + samp_idx = samp_idx % reflections->circ_len; + } + } + /* Accumulate with buffer for low complexity mixed sources */ + else + { + for ( j = 0; j < subframe_size; j++ ) + { + buffer_ch[samp_idx++] += io[in_ch_idx][j + subframe_offset]; + samp_idx = samp_idx % reflections->circ_len; + } + } + } + } + else + { + return IVAS_ERR_INVALID_INPUT_FORMAT; + } + + /* Loop through sources retrieve reflections from circ buffers */ + for ( i = 0; i < n_ref_sources; i++ ) + { + /* Access correct row of input circ buffer */ + buffer_ch = &( reflections->circ_buffers[i * reflections->circ_len] ); + + /* Loop through reflections */ + for ( j = 0; j < n_ref; j++ ) + { + ref_no = j + ( i * n_ref ); + ref_gain = reflections->shoebox_data.gains.data[ref_no]; + ref_delay = (uint16_t) reflections->shoebox_data.times.data[ref_no]; + ref_out_idx = reflections->closest_ch_idx[ref_no]; + + /* Determine start idx of reflection in circ buffer based on + current insert idx and reflection delay */ + samp_idx = (int16_t) reflections->circ_insert - ref_delay; + if ( samp_idx < 0 ) + { + samp_idx = (int16_t) reflections->circ_len + samp_idx; + } + + /* Pull reflection from circ buffer and apply gain */ + for ( k = 0; k < subframe_size; k++ ) + { + io[ref_out_idx][k + subframe_offset] += buffer_ch[samp_idx++] * ref_gain; + samp_idx = samp_idx % reflections->circ_len; + } + } + } + + /* Increment circular buffer start index */ + reflections->circ_insert = ( reflections->circ_insert + subframe_size ) % reflections->circ_len; + + return error; +} diff --git a/lib_rend/ivas_render_config.c b/lib_rend/ivas_render_config.c new file mode 100644 index 0000000000000000000000000000000000000000..7eeaaa54c60d2f6c6cf6f2b9e0ff143d60eef9ec --- /dev/null +++ b/lib_rend/ivas_render_config.c @@ -0,0 +1,130 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "prot.h" +#include "ivas_prot_rend.h" +#include "ivas_rom_rend.h" +#include "ivas_rom_TdBinauralRenderer.h" +#include "wmc_auto.h" + + +/*-----------------------------------------------------------------------* + * Local constants + *-----------------------------------------------------------------------*/ + +#define IVAS_REVERB_DEFAULT_PRE_DELAY 0.016f +#define IVAS_REVERB_DEFAULT_INPUT_DELAY 0.1f + +#define IVAS_REVERB_DEFAULT_USE_ER 0 + + +/*-----------------------------------------------------------------------* + * ivas_render_config_open() + * + * Allocates the renderer configuration structure + *-----------------------------------------------------------------------*/ + +ivas_error ivas_render_config_open( + RENDER_CONFIG_HANDLE *hRenderConfig /* i/o: Renderer config handle */ +) +{ + /* Allocate HR filter set for headphones configuration */ + if ( ( *hRenderConfig = (RENDER_CONFIG_HANDLE) malloc( sizeof( RENDER_CONFIG_DATA ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for renderer configuration!" ); + } + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * ivas_render_config_close() + * + * Deallocates the renderer configuration structure + *-------------------------------------------------------------------*/ + +void ivas_render_config_close( + RENDER_CONFIG_HANDLE *hRenderConfig /* i/o: Renderer config handle */ +) +{ + if ( hRenderConfig == NULL || *hRenderConfig == NULL ) + { + return; + } + + free( *hRenderConfig ); + *hRenderConfig = NULL; + + return; +} + + +/*-------------------------------------------------------------------* + * ivas_render_config_init_from_rom() + * + * Initializes the renderer configuration structure from ROM + *-------------------------------------------------------------------*/ + +ivas_error ivas_render_config_init_from_rom( + RENDER_CONFIG_HANDLE *hRenderConfig /* i/o: Renderer config handle */ +) +{ + int16_t i; + if ( hRenderConfig == NULL || *hRenderConfig == NULL ) + { + return IVAS_ERROR( IVAS_ERR_UNEXPECTED_NULL_POINTER, "Unexpected null pointer while attempting to fill renderer configuration from ROM" ); + } + ( *hRenderConfig )->roomAcoustics.override = FALSE; + ( *hRenderConfig )->roomAcoustics.nBands = IVAS_REVERB_DEFAULT_N_BANDS; + ( *hRenderConfig )->roomAcoustics.acousticPreDelay = IVAS_REVERB_DEFAULT_PRE_DELAY; + ( *hRenderConfig )->roomAcoustics.inputPreDelay = IVAS_REVERB_DEFAULT_INPUT_DELAY; + ( *hRenderConfig )->roomAcoustics.use_er = IVAS_REVERB_DEFAULT_USE_ER; + set_zero( &( *hRenderConfig )->roomAcoustics.pFc_input[0], CLDFB_NO_CHANNELS_MAX ); + set_zero( &( *hRenderConfig )->roomAcoustics.pAcoustic_rt60[0], CLDFB_NO_CHANNELS_MAX ); + set_zero( &( *hRenderConfig )->roomAcoustics.pAcoustic_dsr[0], CLDFB_NO_CHANNELS_MAX ); + + mvr2r( ivas_reverb_default_fc, ( *hRenderConfig )->roomAcoustics.pFc_input, IVAS_REVERB_DEFAULT_N_BANDS ); + mvr2r( ivas_reverb_default_RT60, ( *hRenderConfig )->roomAcoustics.pAcoustic_rt60, IVAS_REVERB_DEFAULT_N_BANDS ); + mvr2r( ivas_reverb_default_DSR, ( *hRenderConfig )->roomAcoustics.pAcoustic_dsr, IVAS_REVERB_DEFAULT_N_BANDS ); + + for ( i = 0; i < MAX_NUM_OBJECTS; i++ ) + { + ( *hRenderConfig )->directivity[i * 3] = 360.0f; /* Front cone */ + ( *hRenderConfig )->directivity[i * 3 + 1] = 360.0f; /* Back cone */ + ( *hRenderConfig )->directivity[i * 3 + 2] = 1.0f; /* Back attenuation */ + } + + return IVAS_ERR_OK; +} diff --git a/lib_rend/ivas_reverb.c b/lib_rend/ivas_reverb.c new file mode 100644 index 0000000000000000000000000000000000000000..0e895db9f5d9c96dab6e611b9e23008dea0294ac --- /dev/null +++ b/lib_rend/ivas_reverb.c @@ -0,0 +1,2008 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "prot.h" +#include "ivas_prot_rend.h" +#include "ivas_cnst.h" +#include "math.h" +#include "ivas_rom_rend.h" +#include +#include "wmc_auto.h" + + +/* The reverberator structure implemented here is described in detail in: + * Vilkamo, J., Neugebauer, B., & Plogsties, J. (2012). Sparse frequency-domain reverberator. + * Journal of the Audio Engineering Society, 59(12), 936-943. */ + +/*------------------------------------------------------------------------- + * Local constants + *------------------------------------------------------------------------*/ + +#define BIN_REND_RANDOM_SEED 1 /* random seed for generating reverb decorrelators */ + +#define CLDFB_SLOTS_PER_SECOND 800 /* Used for initializing reverb */ + +#define INNER_BLK_SIZE 80 /* size of data blocks used for more efficient delay line and IIR filter processing */ +/* should be a divisor of the frame length at any sampling rate and an even number*/ +#define FFT_FILTER_WND_FLAT_REGION ( 0.40f ) /* flat section (==1) length of FFT filter window, in proportion to overlap */ +#define FFT_FILTER_WND_TRANS_REGION ( 0.15f ) /* transition (1->0) length of FFT filter window, in proportion to overlap */ +#define REF_LF_MIN ( 100.0f ) +#define REF_LF_MAX ( 250.0f ) +#define REF_HF_MIN ( 5000.0f ) +#define REF_HF_MAX ( 7950.0f ) +#define LF_BIAS ( 0.5f ) + +#define DEFAULT_SRC_DIST ( 1.5f ) /* default source distance [m] for reverb dmx factor computing */ + +#define IVAS_REVERB_FFT_SIZE_48K ( 512 ) +#define IVAS_REVERB_FFT_SIZE_32K ( 512 ) +#define IVAS_REVERB_FFT_SIZE_16K ( 256 ) +#define IVAS_REVERB_FFT_N_SUBBLOCKS_48K ( 1 ) +#define IVAS_REVERB_FFT_N_SUBBLOCKS_32K ( 1 ) +#define IVAS_REVERB_FFT_N_SUBBLOCKS_16K ( 1 ) + +#define MAX_NR_OUTPUTS ( 2 ) + +const int16_t init_loop_delay[IVAS_REV_MAX_NR_BRANCHES] = { 37, 31, 29, 23, 19, 17, 13, 11 }; +const int16_t default_loop_delay_48k[IVAS_REV_MAX_NR_BRANCHES] = { 2309, 1861, 1523, 1259, 1069, 919, 809, 719 }; +const int16_t default_loop_delay_32k[IVAS_REV_MAX_NR_BRANCHES] = { 1531, 1237, 1013, 839, 709, 613, 541, 479 }; +const int16_t default_loop_delay_16k[IVAS_REV_MAX_NR_BRANCHES] = { 769, 619, 509, 421, 353, 307, 269, 239 }; + +/*------------------------------------------------------------------------------------------* + * Local Struct definition + *------------------------------------------------------------------------------------------*/ + +typedef struct ivas_reverb_params_t +{ + int16_t pre_delay; /* Delay of the FDC reverb, first peak after pre_delay samples. Note that */ + /* there may be non-zero samples earlier due to the filters being */ + /* linear-phase. */ + int16_t nr_loops; /* Number of feedback loops (= L) */ + int16_t pLoop_delays[IVAS_REV_MAX_NR_BRANCHES]; /* Delay for each feedback loop in samples. */ + float pLoop_feedback_matrix[IVAS_REV_MAX_NR_BRANCHES * IVAS_REV_MAX_NR_BRANCHES]; /* Feedback [L][L] matrix that mixes the signals of the loops. */ + int16_t nr_outputs; /* Nr of signals extracted from the loops (= S). */ + /* Currently this is fixed to 2. */ + float pLoop_extract_matrix[MAX_NR_OUTPUTS * IVAS_REV_MAX_NR_BRANCHES]; /* Mix [S][L] matrix from feedback loops to outputs. */ + /* In Matlab: [S x L] - Currently S=2, later may be more than 2 for speaker playback. */ + int16_t t60_filter_order; /* Filter order (length of vector) */ + float pT60_filter_coeff[MAX_NR_OUTPUTS * IVAS_REV_MAX_NR_BRANCHES * IVAS_REV_MAX_IIR_FILTER_LENGTH]; /* Filters [][] in feedback loops, controlling T60. */ + /* In Matlab: IIR: [(2 * L) x ( + 1)] (odd: b-vector, even: a-vector) */ + /* In Matlab: FIR: [L x ] */ + float *pFc; /* Center frequencies for FFT filter design */ + float *pRt60; /* RT60 values at these frequencies */ + float *pDsr; /* DSR values at these frequencies */ + float *pHrtf_avg_pwr_response_l; /* The HRTF set's average left ear power response */ + float *pHrtf_avg_pwr_response_r; /* The HRTF set's average right ear power response */ + float *pHrtf_inter_aural_coherence; /* The HRTF set's inter-aural coherence for diffuse sound */ + const float *pHrtf_avg_pwr_response_l_const; /* The HRTF set's average left ear power response */ + const float *pHrtf_avg_pwr_response_r_const; /* The HRTF set's average right ear power response */ + const float *pHrtf_inter_aural_coherence_const; /* The HRTF set's inter-aural coherence for diffuse sound */ + + int16_t do_corr_filter; /* Flag indicating whether correlation filters should be used. */ + /* Correlation only supported and needed for binaural playback (i.e. */ + /* when nr_outputs != 2 correlation filtering is never supported). */ +} ivas_reverb_params_t; + + +/*------------------------------------------------------------------------------------------* + * Static functions declarations + *------------------------------------------------------------------------------------------*/ + +static ivas_error calc_jot_t60_coeffs( float *pH_dB, const uint16_t nrFrequencies, float *pFrequencies, float *pCoeffA, float *pCoeffB, const float fNyquist ); + + +/*------------------------------------------------------------------------- + * binRend_rand() + * + * + *------------------------------------------------------------------------*/ + +static uint16_t binRend_rand( + REVERB_STRUCT_HANDLE hReverb /* i/o: binaural reverb handle */ +) +{ + hReverb->binRend_RandNext = hReverb->binRend_RandNext * 1103515245 + 12345; + + return (uint16_t) ( hReverb->binRend_RandNext / 65536 ) % 32768; +} + + +/*------------------------------------------------------------------------- + * ivas_binaural_reverb_setPreDelay() + * + * + *------------------------------------------------------------------------*/ + +static void ivas_binaural_reverb_setPreDelay( + REVERB_STRUCT_HANDLE hReverb, /* i/o: binaural reverb handle */ + const int16_t delaySamples /* i : reverb pre-delay in CLDFB slots */ +) +{ + if ( delaySamples < 1 ) + { + hReverb->preDelayBufferLength = 1; + + return; + } + + if ( delaySamples > REVERB_PREDELAY_MAX ) + { + hReverb->preDelayBufferLength = REVERB_PREDELAY_MAX; + + return; + } + + hReverb->preDelayBufferLength = delaySamples; + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_binaural_reverb_setReverbTimes() + * + * + *------------------------------------------------------------------------*/ + +static void ivas_binaural_reverb_setReverbTimes( + REVERB_STRUCT_HANDLE hReverb, /* i/o: binaural reverb handle */ + const int32_t output_Fs, /* i : sampling_rate */ + const float *revTimes, /* i : reverberation times T60 for each CLDFB bin in seconds */ + const float *revEnes /* i : spectrum for reverberated sound at each CLDFB bin */ +) +{ + int16_t bin, ch, tap, sample; + float binCenterFreq, diffuseFieldICC, tmpVal, attenuationFactorPerSample; + float intendedEnergy, actualizedEnergy, energyBuildup, currentEnergy, attenuationFactorPerSampleSq; + + hReverb->binRend_RandNext = (uint16_t) BIN_REND_RANDOM_SEED; + hReverb->highestBinauralCoherenceBin = 0; + for ( bin = 0; bin < hReverb->numBins; bin++ ) + { + /* Determine the diffuse field binaural coherence */ + binCenterFreq = ( (float) bin + 0.5f ) / ( (float) hReverb->numBins ) * ( (float) output_Fs ) / 2.0f; + if ( bin == 0 ) + { + diffuseFieldICC = 1.0f; + } + else if ( binCenterFreq < 2700.0f ) + { + diffuseFieldICC = sinf( EVS_PI * binCenterFreq / 550.0f + 1e-20f ) / ( EVS_PI * binCenterFreq / 550.0f + 1e-20f ) * ( 1.0f - binCenterFreq / 2700.0f ); + hReverb->highestBinauralCoherenceBin = bin; + } + else + { + diffuseFieldICC = 0.0f; + } + + /* Mixing gains to generate a diffuse-binaural sound based on incoherent sound */ + tmpVal = ( 1.0f - sqrtf( 1.0f - powf( diffuseFieldICC, 2.0 ) ) ) / 2.0f; + if ( diffuseFieldICC > 0 ) + { + hReverb->binauralCoherenceCrossmixGains[bin] = sqrtf( fabsf( tmpVal ) ); + } + else + { + hReverb->binauralCoherenceCrossmixGains[bin] = -sqrtf( fabsf( tmpVal ) ); + } + hReverb->binauralCoherenceDirectGains[bin] = sqrtf( 1.0f - fabsf( tmpVal ) ); + + /* Determine attenuation factor that generates the appropriate energy decay according to reverberation time */ + attenuationFactorPerSample = powf( 10.0f, -3.0f * ( 1.0f / ( (float) CLDFB_SLOTS_PER_SECOND * revTimes[bin] ) ) ); + hReverb->loopAttenuationFactor[bin] = powf( attenuationFactorPerSample, hReverb->loopBufLength[bin] ); + attenuationFactorPerSampleSq = attenuationFactorPerSample * attenuationFactorPerSample; + + /* Design sparse decorrelation filters. The decorrelation filters, due to random procedures involved, + * may affect the spectrum of the output. The spectral effect is therefore monitored and compensated for. */ + intendedEnergy = 0.0f; + actualizedEnergy = 0.0f; + + for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + energyBuildup = 0.0f; + currentEnergy = 1.0f; + tap = 0; + + for ( sample = 0; sample < hReverb->loopBufLength[bin]; sample++ ) + { + intendedEnergy += currentEnergy; + + /* The randomization at the energy build up affects where the sparse taps are located */ + energyBuildup += currentEnergy + 0.1f * ( (float) binRend_rand( hReverb ) / PCM16_TO_FLT_FAC - 0.5f ); + + if ( energyBuildup >= 1.0f ) /* A new filter tap is added at this condition */ + { + /* Four efficient phase operations: n*pi/2, n=0,1,2,3 */ + hReverb->tapPhaseShiftType[bin][ch][tap] = (int16_t) ( binRend_rand( hReverb ) % 4 ); + /* Set the tapPointer to point to the determined sample at the loop buffer */ + hReverb->tapPointersReal[bin][ch][tap] = &( hReverb->loopBufReal[bin][sample] ); + hReverb->tapPointersImag[bin][ch][tap] = &( hReverb->loopBufImag[bin][sample] ); + energyBuildup -= 1.0f; /* A tap is added, thus remove its energy from the buildup */ + tap++; + actualizedEnergy += 1.0f; + } + currentEnergy *= attenuationFactorPerSampleSq; + } + hReverb->taps[bin][ch] = tap; /* Number of taps determined at the above random procedure */ + } + + /* The decorrelator design and IIR attenuation rate affects the energy of reverb, which is compensated here */ + hReverb->reverbEqGains[bin] = sqrtf( revEnes[bin] ); /* Determined reverb spectrum */ + hReverb->reverbEqGains[bin] *= sqrtf( intendedEnergy / actualizedEnergy ); /* Correction of random effects at the decorrelator design */ + hReverb->reverbEqGains[bin] *= sqrtf( 0.5f * ( 1.0f - attenuationFactorPerSampleSq ) ); /* Correction of IIR decay rate */ + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function compute_feedback_matrix() + * + * Compute the N x N matrix for the mixing the N feedback loop outputs into the N inputs again + *-----------------------------------------------------------------------------------------*/ + +static ivas_error compute_feedback_matrix( + float *pFeedbackMatrix, + const int16_t n ) +{ + float u, v; + int16_t i, j, x; + + if ( n == 6 ) + { + /* special case (there is no 6 x 6 Hadamard matrix in set R) */ + u = -1.0f / 3; + v = 1.0f + u; + for ( i = 0; i < n; i++ ) + { + for ( j = 0; j < n; j++ ) + { + if ( i == j ) + { + pFeedbackMatrix[i * n + j] = v; + } + else + { + pFeedbackMatrix[i * n + j] = u; + } + } + } + } + else + { + if ( !( n == 4 || n == 8 || n == 16 ) ) + { + return IVAS_ERR_INTERNAL; /* n must be 4, 6, 8 or 16, else ERROR */ + } + + u = inv_sqrt( n ); + + if ( n == 4 ) + { + u = -u; + } + + pFeedbackMatrix[0] = u; + for ( x = 1; x < n; x += x ) + { + for ( i = 0; i < x; i++ ) + { + for ( j = 0; j < x; j++ ) + { + pFeedbackMatrix[( i + x ) * n + j] = pFeedbackMatrix[i * n + j]; + pFeedbackMatrix[i * n + j + x] = pFeedbackMatrix[i * n + j]; + pFeedbackMatrix[( i + x ) * n + j + x] = -pFeedbackMatrix[i * n + j]; + } + } + } + + if ( n == 4 ) + { + /* special case */ + for ( j = 12; j < 16; j++ ) + { + pFeedbackMatrix[j] = -pFeedbackMatrix[j]; + } + } + } + + return IVAS_ERR_OK; +} + + +/*-----------------------------------------------------------------------------------------* + * Function compute_2_out_extract_matrix() + * + * Compute the N x 2 matrix for mixing the N Jot feedback loops to 2 outputs + *-----------------------------------------------------------------------------------------*/ + +static void compute_2_out_extract_matrix( + float *pExtractMatrix, + const int16_t n ) +{ + float ff; + int16_t i; + + ff = 1.0; + for ( i = 0; i < n; i++ ) + { + pExtractMatrix[i] = 1.0; + pExtractMatrix[i + n] = ff; + ff = -ff; + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function set_base_config() + * + * Set all jot reverb parameters that are independent of the input reverb configuration + *-----------------------------------------------------------------------------------------*/ + +static ivas_error set_base_config( + ivas_reverb_params_t *pParams, + const int32_t output_Fs ) +{ + ivas_error error; + int16_t loop_idx; + const int16_t *selected_loop_delay = NULL; + + if ( pParams == NULL ) + { + return IVAS_ERR_INTERNAL; + } + + pParams->pre_delay = 0; + pParams->nr_outputs = BINAURAL_CHANNELS; + pParams->nr_loops = IVAS_REV_MAX_NR_BRANCHES; + + /* set loop delays to default */ + if ( output_Fs == 48000 ) + { + selected_loop_delay = default_loop_delay_48k; + } + else if ( output_Fs == 32000 ) + { + selected_loop_delay = default_loop_delay_32k; + } + else if ( output_Fs == 16000 ) + { + selected_loop_delay = default_loop_delay_16k; + } + + for ( loop_idx = 0; loop_idx < pParams->nr_loops; loop_idx++ ) + { + pParams->pLoop_delays[loop_idx] = selected_loop_delay[loop_idx]; + } + + /* set feedback and output matrices */ + if ( ( error = compute_feedback_matrix( pParams->pLoop_feedback_matrix, pParams->nr_loops ) ) != IVAS_ERR_OK ) + { + return error; + } + + compute_2_out_extract_matrix( pParams->pLoop_extract_matrix, pParams->nr_loops ); + + /* pre-set the various filters; they will be set later based on reverb configuration */ + pParams->t60_filter_order = 1; /* set to 1 in base config. */ + + if ( pParams->nr_outputs == 2 ) + { + pParams->do_corr_filter = 1; + } + else + { + pParams->do_corr_filter = 0; + } + + return IVAS_ERR_OK; +} + + +/*-----------------------------------------------------------------------------------------* + * Function calc_dmx_gain() + * + * Computes the downmix gain + *-----------------------------------------------------------------------------------------*/ + +static float calc_dmx_gain( void ) +{ + const float dist = DEFAULT_SRC_DIST; + return sqrtf( 4.0f * EVS_PI * dist * dist / 0.001f ); +} + + +/*-----------------------------------------------------------------------------------------* + * Function calc_predelay() + * + * Calculate the predelay, taking shortest jot loop delay into account + *-----------------------------------------------------------------------------------------*/ + +static void calc_predelay( + ivas_reverb_params_t *pParams, + float acoustic_predelay_sec, + const int32_t output_Fs ) +{ + int16_t predelay, fbdelay, output_frame; + + predelay = (int16_t) roundf( acoustic_predelay_sec * (float) output_Fs ); + output_frame = (int16_t) ( output_Fs / FRAMES_PER_SEC ); + fbdelay = pParams->pLoop_delays[pParams->nr_loops - 1]; + predelay -= fbdelay; + + if ( predelay < 0 ) + { + predelay = 0; + } + + if ( output_frame < predelay ) + { + predelay = output_frame; + } + + pParams->pre_delay = predelay; + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function compute_t60_coeffs() + * + * Calculate Jot reverb's T60 filter coefficients + *-----------------------------------------------------------------------------------------*/ + +static ivas_error compute_t60_coeffs( + ivas_reverb_params_t *pParams, + const int16_t nr_fc_fft_filter, + const int32_t output_Fs ) +{ + int16_t bin_idx, loop_idx, tf_T60_len, len; + float loop_delay_sec, freq_Nyquist, inv_hfs; + float target_gains_db[RV_LENGTH_NR_FC]; + float norm_f[RV_LENGTH_NR_FC]; + float *pCoeffs_a, *pCoeffs_b; + float *targetT60, *freqT60; + ivas_error error; + + targetT60 = pParams->pRt60; + freqT60 = pParams->pFc; + + error = IVAS_ERR_OK; + tf_T60_len = nr_fc_fft_filter; + len = pParams->t60_filter_order + 1; + freq_Nyquist = 0.5f * (float) output_Fs; + + /* normalize pFrequencies: 0 .. 1/2 output_Fs --> 0.0 .. 1.0 */ + inv_hfs = 1.0f / freq_Nyquist; + for ( bin_idx = 0; bin_idx < tf_T60_len; bin_idx++ ) + { + norm_f[bin_idx] = freqT60[bin_idx] * inv_hfs; + } + + for ( loop_idx = 0; loop_idx < pParams->nr_loops; loop_idx++ ) + { + loop_delay_sec = (float) pParams->pLoop_delays[loop_idx] / (float) output_Fs; + for ( bin_idx = 0; bin_idx < tf_T60_len; bin_idx++ ) + { + target_gains_db[bin_idx] = -60.0f * loop_delay_sec / targetT60[bin_idx]; + target_gains_db[bin_idx] = max( target_gains_db[bin_idx], -120.0f ); + } + + pCoeffs_a = &pParams->pT60_filter_coeff[2 * len * loop_idx + len]; + pCoeffs_b = &pParams->pT60_filter_coeff[2 * len * loop_idx]; + if ( ( error = calc_jot_t60_coeffs( target_gains_db, tf_T60_len, norm_f, pCoeffs_a, pCoeffs_b, freq_Nyquist ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + len = ( pParams->t60_filter_order + 1 ) >> 1; /* == floor( (order+1) / 2) */ + for ( loop_idx = 0; loop_idx < pParams->nr_loops; loop_idx++ ) + { + pParams->pLoop_delays[loop_idx] -= len; + } + + return error; +} + + +/*-----------------------------------------------------------------------------------------* + * Function calc_low_shelf_first_order_filter() + * + * Calculate 1st order low shelf filter + *-----------------------------------------------------------------------------------------*/ + +static void calc_low_shelf_first_order_filter( + float *pNum, + float *pDen, + const float f0, + const float lin_gain_lf, + const float lin_gain_hf ) +{ + float w0, gain; + + w0 = tanf( EVS_PI * f0 / 2.0f ); + gain = lin_gain_lf / lin_gain_hf; + + if ( gain < 1.0f ) + { + pNum[0] = 1 + w0 * gain; + pNum[1] = w0 * gain - 1; + pDen[0] = 1 + w0; + pDen[1] = w0 - 1; + } + else + { + pNum[0] = 1 + w0; + pNum[1] = w0 - 1; + pDen[0] = 1 + w0 / gain; + pDen[1] = w0 / gain - 1; + } + + /* Normalize and adjust gain to match target amplitudes */ + pNum[0] = ( pNum[0] / pDen[0] ) * lin_gain_hf; + pNum[1] = ( pNum[1] / pDen[0] ) * lin_gain_hf; + pDen[1] = pDen[1] / pDen[0]; + pDen[0] = 1.0f; + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function calc_jot_t60_coeffs() + * + * Calculate Jot reverb's T60 filters + *-----------------------------------------------------------------------------------------*/ + +static ivas_error calc_jot_t60_coeffs( + float *pH_dB, + const uint16_t nrFrequencies, + float *pFrequencies, + float *pCoeffA, + float *pCoeffB, + const float fNyquist ) +{ + const float ref_lf_min_norm = REF_LF_MIN / fNyquist; + const float ref_lf_max_norm = REF_LF_MAX / fNyquist; + const float ref_hf_min_norm = REF_HF_MIN / fNyquist; + const float ref_hf_max_norm = REF_HF_MAX / fNyquist; + int16_t f_idx, minidx; + float f0, tmp, minval, lf_target_gain_dB, hf_target_gain_dB, mid_crossing_gain_dB; + uint16_t n_points_lf, n_points_hf; + float lin_gain_lf, lin_gain_hf; + + minidx = nrFrequencies - 1; + minval = 1e+20f; + lf_target_gain_dB = 0.0f; + hf_target_gain_dB = 0.0f; + n_points_lf = 0; + n_points_hf = 0; + + for ( f_idx = 0; f_idx < nrFrequencies; f_idx++ ) + { + if ( ( pFrequencies[f_idx] >= ref_lf_min_norm ) && ( pFrequencies[f_idx] <= ref_lf_max_norm ) ) + { + lf_target_gain_dB += pH_dB[f_idx]; + n_points_lf++; + } + if ( ( pFrequencies[f_idx] >= ref_hf_min_norm ) && ( pFrequencies[f_idx] <= ref_hf_max_norm ) ) + { + hf_target_gain_dB += pH_dB[f_idx]; + n_points_hf++; + } + } + + if ( ( n_points_lf == 0 ) || ( n_points_hf == 0 ) ) + { + return IVAS_ERR_INTERNAL; + } + + lf_target_gain_dB = lf_target_gain_dB / (float) n_points_lf; + hf_target_gain_dB = hf_target_gain_dB / (float) n_points_hf; + mid_crossing_gain_dB = hf_target_gain_dB + LF_BIAS * ( lf_target_gain_dB - hf_target_gain_dB ); + + for ( f_idx = 1; f_idx < nrFrequencies - 1; f_idx++ ) + { + tmp = fabsf( pH_dB[f_idx] - mid_crossing_gain_dB ); + if ( tmp < minval ) + { + minval = tmp; + minidx = f_idx; + } + } + + f0 = pFrequencies[minidx]; + lin_gain_lf = powf( 10.0f, lf_target_gain_dB * 0.05f ); + lin_gain_hf = powf( 10.0f, hf_target_gain_dB * 0.05f ); + + /* call low-pass iir shelf */ + calc_low_shelf_first_order_filter( pCoeffB, pCoeffA, f0, lin_gain_lf, lin_gain_hf ); + + return IVAS_ERR_OK; +} + + +/*-----------------------------------------------------------------------------------------* + * Function initialize_reverb_filters() + * + * Set the number of branches (feedback loops) and Initializes the memory structure (pointers to data) + *-----------------------------------------------------------------------------------------*/ + +static ivas_error initialize_reverb_filters( + REVERB_HANDLE hReverb ) +{ + ivas_error error; + + error = IVAS_ERR_OK; + + /* init correlation and coloration filters */ + if ( ( error = ivas_reverb_t2f_f2t_init( &hReverb->fft_filter_ols, hReverb->fft_size, hReverb->fft_subblock_size ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = ivas_reverb_fft_filter_init( &hReverb->fft_filter_correl_0, hReverb->fft_size ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = ivas_reverb_fft_filter_init( &hReverb->fft_filter_correl_1, hReverb->fft_size ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = ivas_reverb_fft_filter_init( &hReverb->fft_filter_color_0, hReverb->fft_size ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = ivas_reverb_fft_filter_init( &hReverb->fft_filter_color_1, hReverb->fft_size ) ) != IVAS_ERR_OK ) + { + return error; + } + + return error; +} + + +/*-----------------------------------------------------------------------------------------* + * Function set_t60_filter() + * + * Sets t60 number of taps and coefficients A and B + *-----------------------------------------------------------------------------------------*/ + +static ivas_error set_t60_filter( + REVERB_HANDLE hReverb, + const uint16_t branch, + const uint16_t nr_taps, + const float coefA[], + const float coefB[] ) +{ + if ( branch >= hReverb->nr_of_branches ) + { + return IVAS_ERR_INTERNAL; + } + + if ( nr_taps > IVAS_REV_MAX_IIR_FILTER_LENGTH ) + { + return IVAS_ERR_INTERNAL; + } + + ivas_reverb_iir_filt_set( &( hReverb->t60[branch] ), nr_taps, coefA, coefB ); + + return IVAS_ERR_OK; +} + + +/*-----------------------------------------------------------------------------------------* + * Function set_feedback_delay() + * + * Sets Delay of feedback branch in number of samples + *-----------------------------------------------------------------------------------------*/ + +static ivas_error set_feedback_delay( + REVERB_HANDLE hReverb, + const uint16_t branch, + const int16_t fb_delay ) +{ + if ( branch >= hReverb->nr_of_branches ) + { + return IVAS_ERR_INTERNAL; + } + + hReverb->delay_line[branch].Delay = fb_delay; + + return IVAS_ERR_OK; +} + + +/*-----------------------------------------------------------------------------------------* + * Function set_feedback_gain() + * + * Sets nr_of_branches feedback gain values in feedback matrix + *-----------------------------------------------------------------------------------------*/ + +static ivas_error set_feedback_gain( + REVERB_HANDLE hReverb, + const uint16_t branch, + const float *pGain ) +{ + uint16_t gain_idx; + if ( branch >= hReverb->nr_of_branches ) + { + return IVAS_ERR_INTERNAL; + } + + for ( gain_idx = 0; gain_idx < hReverb->nr_of_branches; gain_idx++ ) + { + hReverb->gain_matrix[branch][gain_idx] = pGain[gain_idx]; + } + + return IVAS_ERR_OK; +} + + +/*-----------------------------------------------------------------------------------------* + * Function set_correl_fft_filter() + * + * Sets correlation filter complex gains + *-----------------------------------------------------------------------------------------*/ + +static ivas_error set_correl_fft_filter( + REVERB_HANDLE hReverb, + const uint16_t channel, + rv_fftwf_type_complex *pSpectrum ) +{ + if ( channel > 1 ) + { + return IVAS_ERR_INTERNAL; + } + + if ( channel == 0 ) + { + ivas_reverb_fft_filter_ConvertFFTWF_2_FFTR( pSpectrum, hReverb->fft_filter_correl_0.fft_spectrum, hReverb->fft_filter_correl_0.fft_size ); + } + else + { + ivas_reverb_fft_filter_ConvertFFTWF_2_FFTR( pSpectrum, hReverb->fft_filter_correl_1.fft_spectrum, hReverb->fft_filter_correl_1.fft_size ); + } + + return IVAS_ERR_OK; +} + + +/*-----------------------------------------------------------------------------------------* + * Function set_color_fft_filter() + * + * Sets coloration filter complex gains + *-----------------------------------------------------------------------------------------*/ + +static ivas_error set_color_fft_filter( + REVERB_HANDLE hReverb, + const uint16_t channel, + rv_fftwf_type_complex *pSpectrum ) +{ + if ( channel > 1 ) + { + return IVAS_ERR_INTERNAL; + } + + if ( channel == 0 ) + { + ivas_reverb_fft_filter_ConvertFFTWF_2_FFTR( pSpectrum, hReverb->fft_filter_color_0.fft_spectrum, hReverb->fft_filter_color_0.fft_size ); + } + else + { + ivas_reverb_fft_filter_ConvertFFTWF_2_FFTR( pSpectrum, hReverb->fft_filter_color_1.fft_spectrum, hReverb->fft_filter_color_1.fft_size ); + } + + return IVAS_ERR_OK; +} + + +/*-----------------------------------------------------------------------------------------* + * Function set_mixer_level() + * + * Sets Mixer level: to mix 2 output channels from 8 feedback branches + *-----------------------------------------------------------------------------------------*/ + +static ivas_error set_mixer_level( + REVERB_HANDLE hReverb, + const uint16_t channel, + const float level[] ) +{ + uint16_t branch_idx; + if ( channel >= BINAURAL_CHANNELS ) + { + return IVAS_ERR_INTERNAL; + } + + for ( branch_idx = 0; branch_idx < hReverb->nr_of_branches; branch_idx++ ) + { + hReverb->mixer[channel][branch_idx] = level[branch_idx]; + } + + return IVAS_ERR_OK; +} + + +/*-----------------------------------------------------------------------------------------* + * Function clear_buffers() + * + * Clears buffers of delay lines and filters + *-----------------------------------------------------------------------------------------*/ + +static void clear_buffers( + REVERB_HANDLE hReverb ) +{ + int16_t branch_idx; + ivas_rev_iir_filter_t *iirFilter; + ivas_rev_delay_line_t *delay_line; + + for ( branch_idx = 0; branch_idx < IVAS_REV_MAX_NR_BRANCHES; branch_idx++ ) + { + delay_line = &( hReverb->delay_line[branch_idx] ); + set_f( delay_line->pBuffer, 0, delay_line->MaxDelay ); + delay_line->BufferPos = 0; + + iirFilter = &( hReverb->t60[branch_idx] ); + set_f( iirFilter->pBuffer, 0, iirFilter->MaxTaps ); + } + + ivas_reverb_t2f_f2t_ClearHistory( &hReverb->fft_filter_ols ); + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function set_fft_and_datablock_sizes() + * + * Sets frame size and fft-filter related sizes + *-----------------------------------------------------------------------------------------*/ + +static void set_fft_and_datablock_sizes( + REVERB_HANDLE hReverb, + const int16_t subframe_len ) +{ + hReverb->full_block_size = subframe_len; + if ( subframe_len == L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES ) + { + hReverb->fft_size = IVAS_REVERB_FFT_SIZE_48K; + hReverb->num_fft_subblocks = IVAS_REVERB_FFT_N_SUBBLOCKS_48K; + } + else if ( subframe_len == L_FRAME32k / MAX_PARAM_SPATIAL_SUBFRAMES ) + { + hReverb->fft_size = IVAS_REVERB_FFT_SIZE_32K; + hReverb->num_fft_subblocks = IVAS_REVERB_FFT_N_SUBBLOCKS_32K; + } + else if ( subframe_len == L_FRAME16k / MAX_PARAM_SPATIAL_SUBFRAMES ) + { + hReverb->fft_size = IVAS_REVERB_FFT_SIZE_16K; + hReverb->num_fft_subblocks = IVAS_REVERB_FFT_N_SUBBLOCKS_16K; + } + else + { + assert( 0 ); /* unsupported block size */ + } + + hReverb->fft_subblock_size = subframe_len / hReverb->num_fft_subblocks; + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function set_reverb_acoustic_data() + * + * Sets reverb acoustic data (room acoustics and HRTF), interpolating it to the filter grid + *-----------------------------------------------------------------------------------------*/ + +static void set_reverb_acoustic_data( + ivas_reverb_params_t *pParams, + const AUDIO_CONFIG input_audio_config, + const HRTFS_HANDLE hHrtf, + IVAS_ROOM_ACOUSTICS_CONFIG_DATA *pRoomAcoustics, + const int16_t subframe_len, + const int16_t nr_fc_input, + const int16_t nr_fc_fft_filter ) +{ + int16_t nr_out_ch, hrtf_idx, offset, iter_idx, bin_idx; + float ln_1e6_inverted, delay_diff, exp_argument; + float *pHrtf_set_l_re[MAX_INTERN_CHANNELS]; + float *pHrtf_set_l_im[MAX_INTERN_CHANNELS]; + float *pHrtf_set_r_re[MAX_INTERN_CHANNELS]; + float *pHrtf_set_r_im[MAX_INTERN_CHANNELS]; + + /* use crend hrtf filters */ + if ( hHrtf != NULL ) + { + /* Compute HRTF set properties: average left/right energies, IA coherence */ + /* First, find the offset of the frequency-domain data for the 1st frame and assign HRTF pointers */ + for ( nr_out_ch = 0; nr_out_ch < BINAURAL_CHANNELS; nr_out_ch++ ) + { + for ( hrtf_idx = 0; hrtf_idx < hHrtf->max_num_ir; hrtf_idx++ ) + { + offset = 0; + for ( iter_idx = 0; iter_idx < hHrtf->num_iterations[hrtf_idx][nr_out_ch] - 1; iter_idx++ ) + { + offset += hHrtf->pIndex_frequency_max[hrtf_idx][nr_out_ch][iter_idx]; + } + + if ( nr_out_ch == 0 ) + { + pHrtf_set_l_re[hrtf_idx] = &hHrtf->pOut_to_bin_re[hrtf_idx][0][offset]; + pHrtf_set_l_im[hrtf_idx] = &hHrtf->pOut_to_bin_im[hrtf_idx][0][offset]; + } + else + { + pHrtf_set_r_re[hrtf_idx] = &hHrtf->pOut_to_bin_re[hrtf_idx][1][offset]; + pHrtf_set_r_im[hrtf_idx] = &hHrtf->pOut_to_bin_im[hrtf_idx][1][offset]; + } + } + } + + /* Compute HRTF set properties using frequency-domain HRTF data */ + ivas_reverb_get_hrtf_set_properties( pHrtf_set_l_re, pHrtf_set_l_im, pHrtf_set_r_re, pHrtf_set_r_im, input_audio_config, hHrtf->max_num_ir, subframe_len, + nr_fc_fft_filter, pParams->pHrtf_avg_pwr_response_l, pParams->pHrtf_avg_pwr_response_r, pParams->pHrtf_inter_aural_coherence ); + + pParams->pHrtf_avg_pwr_response_l_const = (const float *) pParams->pHrtf_avg_pwr_response_l; + pParams->pHrtf_avg_pwr_response_r_const = (const float *) pParams->pHrtf_avg_pwr_response_r; + pParams->pHrtf_inter_aural_coherence_const = (const float *) pParams->pHrtf_inter_aural_coherence; + } + + /* interpolate input table data for T60 and DSR to the FFT filter grid */ + ivas_reverb_interpolate_acoustic_data( nr_fc_input, pRoomAcoustics->pFc_input, pRoomAcoustics->pAcoustic_rt60, pRoomAcoustics->pAcoustic_dsr, + nr_fc_fft_filter, pParams->pFc, pParams->pRt60, pParams->pDsr ); + + /* adjust DSR for the delay difference */ + delay_diff = pRoomAcoustics->inputPreDelay - pRoomAcoustics->acousticPreDelay; + ln_1e6_inverted = 1.0f / logf( 1e06f ); + for ( bin_idx = 0; bin_idx < nr_fc_fft_filter; bin_idx++ ) + { + exp_argument = delay_diff / ( pParams->pRt60[bin_idx] * ln_1e6_inverted ); + /* Limit exponent to approx +/-100 dB in case of incoherent value of delay_diff, to prevent overflow */ + exp_argument = min( exp_argument, 23.0f ); + exp_argument = max( exp_argument, -23.0f ); + pParams->pDsr[bin_idx] *= expf( exp_argument ); + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function setup_FDN_branches() + * + * Sets up feedback delay network system + *-----------------------------------------------------------------------------------------*/ + +static ivas_error setup_FDN_branches( + REVERB_HANDLE hReverb, + ivas_reverb_params_t *pParams ) +{ + int16_t nr_coefs, branch_idx, channel_idx; + ivas_error error; + float *pCoef_a, *pCoef_b; + error = IVAS_ERR_OK; + + /* initialize feedback branches */ + for ( branch_idx = 0; branch_idx < IVAS_REV_MAX_NR_BRANCHES; branch_idx++ ) + { + ivas_rev_delay_line_init( &( hReverb->delay_line[branch_idx] ), hReverb->loop_delay_buffer[branch_idx], init_loop_delay[branch_idx], pParams->pLoop_delays[branch_idx] ); + ivas_reverb_iir_filt_init( &( hReverb->t60[branch_idx] ), IVAS_REV_MAX_IIR_FILTER_LENGTH ); + hReverb->mixer[0][branch_idx] = 0.0f; + hReverb->mixer[1][branch_idx] = 0.0f; + } + clear_buffers( hReverb ); + nr_coefs = pParams->t60_filter_order + 1; + + if ( IVAS_REV_MAX_IIR_FILTER_LENGTH < nr_coefs ) + { + return IVAS_ERR_INTERNAL; + } + else + { + for ( branch_idx = 0; branch_idx < pParams->nr_loops; branch_idx++ ) + { + pCoef_a = &pParams->pT60_filter_coeff[2 * nr_coefs * branch_idx + nr_coefs]; + pCoef_b = &pParams->pT60_filter_coeff[2 * nr_coefs * branch_idx]; + + if ( ( error = set_t60_filter( hReverb, branch_idx, nr_coefs, pCoef_a, pCoef_b ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = set_feedback_delay( hReverb, branch_idx, pParams->pLoop_delays[branch_idx] ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = set_feedback_gain( hReverb, branch_idx, &( pParams->pLoop_feedback_matrix[branch_idx * pParams->nr_loops] ) ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + + for ( channel_idx = 0; channel_idx < pParams->nr_outputs; channel_idx++ ) + { + if ( ( error = set_mixer_level( hReverb, channel_idx, &( pParams->pLoop_extract_matrix[channel_idx * pParams->nr_loops] ) ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + return error; +} + + +/*------------------------------------------------------------------------- + * ivas_reverb_open() + * + * Allocate and initialize Crend reverberation handle + *------------------------------------------------------------------------*/ + +ivas_error ivas_reverb_open( + REVERB_HANDLE *hReverb, /* i/o: Reverberator handle */ + const AUDIO_CONFIG input_audio_config, /* i : reverb. input audio configuration */ + const HRTFS_HANDLE hHrtf, /* i : HRTF handle */ + const float *lr_energy_and_iac[], /* i : precomuputed lr energies and iac */ + RENDER_CONFIG_HANDLE hRenderConfig, /* i : Renderer configuration handle */ + const int32_t output_Fs /* i : output sampling rate */ +) +{ + ivas_error error; + REVERB_HANDLE pState = NULL; + int16_t bin_idx, subframe_len, output_frame, predelay_bf_len, loop_idx; + ivas_reverb_params_t params; + rv_fftwf_type_complex pFft_wf_filter_ch0[RV_LENGTH_NR_FC]; + rv_fftwf_type_complex pFft_wf_filter_ch1[RV_LENGTH_NR_FC]; + float pColor_target_l[RV_LENGTH_NR_FC]; + float pColor_target_r[RV_LENGTH_NR_FC]; + float pTime_window[RV_FILTER_MAX_FFT_SIZE]; + float freq_step; + int16_t fft_hist_size, transition_start, transition_length; + int16_t nr_fc_input, nr_fc_fft_filter; + + error = IVAS_ERR_OK; + output_frame = (int16_t) ( output_Fs / FRAMES_PER_SEC ); + subframe_len = output_frame / MAX_PARAM_SPATIAL_SUBFRAMES; + predelay_bf_len = output_frame; + nr_fc_input = hRenderConfig->roomAcoustics.nBands; + + /* Allocate main reverb. handle */ + if ( ( pState = (REVERB_HANDLE) malloc( sizeof( REVERB_DATA ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend Reverberator " ); + } + + if ( ( error = set_base_config( ¶ms, output_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Allocate memory for feedback delay lines */ + for ( loop_idx = 0; loop_idx < IVAS_REV_MAX_NR_BRANCHES; loop_idx++ ) + { + if ( ( pState->loop_delay_buffer[loop_idx] = (float *) malloc( params.pLoop_delays[loop_idx] * sizeof( float ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for CREND Reverberator" ); + } + } + + /* Allocate memory for the pre-delay delay line */ + if ( ( pState->pPredelay_buffer = (float *) malloc( output_frame * sizeof( float ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for CREND Reverberator" ); + } + + pState->nr_of_branches = IVAS_REV_MAX_NR_BRANCHES; + set_fft_and_datablock_sizes( pState, subframe_len ); + nr_fc_fft_filter = ( pState->fft_size >> 1 ) + 1; + + /* === 'Control logic': compute the reverb processing parameters from the === */ + /* === room, source and listener acoustic information provided in the reverb config === */ + /* Setting up shared temporary buffers for fc, RT60, DSR, etc. */ + params.pHrtf_avg_pwr_response_l = &pFft_wf_filter_ch0[0][0]; + params.pHrtf_avg_pwr_response_r = params.pHrtf_avg_pwr_response_l + nr_fc_fft_filter; + params.pRt60 = &pFft_wf_filter_ch1[0][0]; + params.pDsr = params.pRt60 + nr_fc_fft_filter; + params.pFc = &pState->fft_filter_color_0.fft_spectrum[0]; + params.pHrtf_inter_aural_coherence = &pState->fft_filter_color_1.fft_spectrum[0]; + + /* Note: these temp buffers can only be used before the final step of the FFT filter design : */ + /* before calls to ivas_reverb_calc_correl_filters(...) or to ivas_reverb_calc_color_filters(...) */ + + /* set the uniform frequency grid for FFT filtering */ + freq_step = 0.5f * output_Fs / ( nr_fc_fft_filter - 1 ); + for ( bin_idx = 0; bin_idx < nr_fc_fft_filter; bin_idx++ ) + { + params.pFc[bin_idx] = freq_step * bin_idx; + } + + if ( hHrtf == NULL && lr_energy_and_iac != NULL ) + { + params.pHrtf_avg_pwr_response_l_const = lr_energy_and_iac[0]; + params.pHrtf_avg_pwr_response_r_const = lr_energy_and_iac[1]; + params.pHrtf_inter_aural_coherence_const = lr_energy_and_iac[2]; + } + /* set up reverb acoustic data on the basis of HRTF data and renderer config */ + set_reverb_acoustic_data( ¶ms, input_audio_config, hHrtf, &hRenderConfig->roomAcoustics, subframe_len, nr_fc_input, nr_fc_fft_filter ); + + /* set reverb acoustic configuration based on renderer config */ + pState->pConfig.roomAcoustics.override = hRenderConfig->roomAcoustics.override; + pState->pConfig.roomAcoustics.nBands = hRenderConfig->roomAcoustics.nBands; + + if ( hRenderConfig->roomAcoustics.use_er == 1 ) + { + pState->pConfig.roomAcoustics.use_er = hRenderConfig->roomAcoustics.use_er; + pState->pConfig.roomAcoustics.lowComplexity = hRenderConfig->roomAcoustics.lowComplexity; + } + + /* set up input downmix */ + pState->dmx_gain = calc_dmx_gain(); + + /* set up predelay - must be after set_base_config() and before compute_t60_coeffs() */ + calc_predelay( ¶ms, hRenderConfig->roomAcoustics.acousticPreDelay, output_Fs ); + + /* set up jot reverb 60 filters - must be set up after set_reverb_acoustic_data() */ + if ( ( error = compute_t60_coeffs( ¶ms, nr_fc_fft_filter, output_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Compute target levels (gains) for the coloration filters */ + ivas_reverb_calc_color_levels( output_Fs, nr_fc_fft_filter, params.nr_loops, params.pFc, params.pDsr, params.pHrtf_avg_pwr_response_l_const, params.pHrtf_avg_pwr_response_r_const, + params.pLoop_delays, params.pT60_filter_coeff, pColor_target_l, pColor_target_r ); + + /* Defining appropriate windowing parameters for FFT filters to prevent aliasing */ + fft_hist_size = pState->fft_size - pState->fft_subblock_size; + transition_start = (int16_t) round( FFT_FILTER_WND_FLAT_REGION * fft_hist_size ); + transition_length = (int16_t) round( FFT_FILTER_WND_TRANS_REGION * fft_hist_size ); + + /* Compute the window used for FFT filters */ + ivas_reverb_define_window_fft( pTime_window, transition_start, transition_length, nr_fc_fft_filter ); + + + /* === Now, copy parameters from ivas_reverb_params_t into DSP blocks === */ + /* === to be used for subsequent audio signal processing === */ + + pState->do_corr_filter = params.do_corr_filter; + + /* clear & init jot reverb fft filters */ + if ( ( error = initialize_reverb_filters( pState ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( pState->do_corr_filter ) + { + /* Computing correlation filters on the basis of target IA coherence */ + ivas_reverb_calc_correl_filters( params.pHrtf_inter_aural_coherence_const, pTime_window, pState->fft_size, 0.0f, pFft_wf_filter_ch0, pFft_wf_filter_ch1 ); + + /* Copying the computed FFT correlation filters to the fft_filter components */ + if ( ( error = set_correl_fft_filter( pState, 0, pFft_wf_filter_ch0 ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = set_correl_fft_filter( pState, 1, pFft_wf_filter_ch1 ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* Computing coloration filters on the basis of target responses */ + ivas_reverb_calc_color_filters( pColor_target_l, pColor_target_r, pTime_window, pState->fft_size, 0.0f, pFft_wf_filter_ch0, pFft_wf_filter_ch1 ); + + /* Copying the computed FFT colorations filters to the fft_filter components */ + if ( ( error = set_color_fft_filter( pState, 0, pFft_wf_filter_ch0 ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = set_color_fft_filter( pState, 1, pFft_wf_filter_ch1 ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* init predelay */ + ivas_rev_delay_line_init( &( pState->predelay_line ), pState->pPredelay_buffer, params.pre_delay, predelay_bf_len ); + + /* set up feedback delay network */ + if ( ( error = setup_FDN_branches( pState, ¶ms ) ) != IVAS_ERR_OK ) + { + return error; + } + + *hReverb = pState; + + return error; +} + + +/*------------------------------------------------------------------------- + * ivas_reverb_close() + * + * Deallocate Crend reverberation handle + *------------------------------------------------------------------------*/ + +void ivas_reverb_close( + REVERB_HANDLE *hReverb_in /* i/o: Reverberator handle */ +) +{ + REVERB_HANDLE hReverb; + int16_t loop_idx; + + hReverb = *hReverb_in; + + if ( hReverb_in == NULL || *hReverb_in == NULL ) + { + return; + } + + for ( loop_idx = 0; loop_idx < IVAS_REV_MAX_NR_BRANCHES; loop_idx++ ) + { + if ( hReverb->loop_delay_buffer[loop_idx] != NULL ) + { + free( hReverb->loop_delay_buffer[loop_idx] ); + hReverb->loop_delay_buffer[loop_idx] = NULL; + } + } + + free( hReverb->pPredelay_buffer ); + hReverb->pPredelay_buffer = NULL; + + free( *hReverb_in ); + *hReverb_in = NULL; + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function post_fft_filter() + * + * + *-----------------------------------------------------------------------------------------*/ + +static void post_fft_filter( + REVERB_HANDLE hReverb, + float *p0, + float *p1, + float *pBuffer_0, + float *pBuffer_1 ) +{ + if ( hReverb->do_corr_filter ) + { + ivas_reverb_t2f_f2t_in( &hReverb->fft_filter_ols, p0, p1, pBuffer_0, pBuffer_1 ); + ivas_reverb_fft_filter_ComplexMul( &hReverb->fft_filter_correl_0, pBuffer_0 ); + ivas_reverb_fft_filter_ComplexMul( &hReverb->fft_filter_correl_1, pBuffer_1 ); + ivas_reverb_fft_filter_CrossMix( pBuffer_0, pBuffer_1, hReverb->fft_filter_correl_0.fft_size ); + } + else + { + ivas_reverb_t2f_f2t_in( &hReverb->fft_filter_ols, p0, p1, pBuffer_0, pBuffer_1 ); + } + + ivas_reverb_fft_filter_ComplexMul( &hReverb->fft_filter_color_0, pBuffer_0 ); + ivas_reverb_fft_filter_ComplexMul( &hReverb->fft_filter_color_1, pBuffer_1 ); + ivas_reverb_t2f_f2t_out( &hReverb->fft_filter_ols, pBuffer_0, pBuffer_1, p0, p1 ); + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function reverb_block() + * + * Input a block (mono) and calculate the 2 output blocks. + *-----------------------------------------------------------------------------------------*/ + +static void reverb_block( + REVERB_HANDLE hReverb, + float *pInput, + float *pOut0, + float *pOut1 ) + +{ + uint16_t nr_branches = hReverb->nr_of_branches; + uint16_t bsize = hReverb->full_block_size; + uint16_t inner_bsize = INNER_BLK_SIZE; + uint16_t i, j, k, ns, branch_idx, blk_idx, start_sample_idx; + + float *pFFT_buf[2], FFT_buf_1[RV_FILTER_MAX_FFT_SIZE], FFT_buf_2[RV_FILTER_MAX_FFT_SIZE]; + float pFeedback_input[INNER_BLK_SIZE]; + float pTemp[INNER_BLK_SIZE]; + float *ppOutput[IVAS_REV_MAX_NR_BRANCHES]; + float Output[IVAS_REV_MAX_NR_BRANCHES][INNER_BLK_SIZE]; + + pFFT_buf[0] = &FFT_buf_1[0]; + pFFT_buf[1] = &FFT_buf_2[0]; + + for ( branch_idx = 0; branch_idx < nr_branches; branch_idx++ ) + { + ppOutput[branch_idx] = (float *) Output + branch_idx * inner_bsize; + } + + for ( k = 0; k < bsize; k += inner_bsize ) + { + float *pO0 = &pOut0[k]; + float *pO1 = &pOut1[k]; + for ( i = 0; i < inner_bsize; i++ ) + { + pO0[i] = 0.0f; + pO1[i] = 0.0f; + } + + /* feedback network: */ + for ( i = 0; i < nr_branches; i++ ) + { + float *pOutput_i = &ppOutput[i][0]; + float mixer_0_i = hReverb->mixer[0][i]; + float mixer_1_i = hReverb->mixer[1][i]; + + /* output and feedback are same, get sample from delay line ... */ + ivas_rev_delay_line_get_sample_blk( &( hReverb->delay_line[i] ), inner_bsize, pTemp ); + ivas_reverb_iir_filt_2taps_feed_blk( &( hReverb->t60[i] ), inner_bsize, pTemp, ppOutput[i] ); + for ( ns = 0; ns < inner_bsize; ns++ ) + { + pO0[ns] += pOutput_i[ns] * mixer_0_i; /* mixer ch 0 */ + pO1[ns] += pOutput_i[ns] * mixer_1_i; /* mixer ch 1 */ + } + } + + for ( i = 0; i < nr_branches; i++ ) + { + float *pIn = &pInput[k]; + + for ( ns = 0; ns < inner_bsize; ns++ ) + { + pFeedback_input[ns] = pIn[ns]; + } + + for ( j = 0; j < nr_branches; j++ ) + { + float gain_matrix_j_i = hReverb->gain_matrix[j][i]; + float *pOutput = &ppOutput[j][0]; + for ( ns = 0; ns < inner_bsize; ns++ ) + { + pFeedback_input[ns] += gain_matrix_j_i * pOutput[ns]; + } + } + + ivas_rev_delay_line_feed_sample_blk( &( hReverb->delay_line[i] ), inner_bsize, pFeedback_input ); + } + } + + /* Applying FFT filter to each sub-frame */ + for ( blk_idx = 0; blk_idx < hReverb->num_fft_subblocks; blk_idx++ ) + { + start_sample_idx = blk_idx * hReverb->fft_subblock_size; + post_fft_filter( hReverb, pOut0 + start_sample_idx, pOut1 + start_sample_idx, pFFT_buf[0], pFFT_buf[1] ); + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function downmix_input_block() + * + * Downmix input to mono, taking also DSR gain into account + *-----------------------------------------------------------------------------------------*/ + +static ivas_error downmix_input_block( + const REVERB_HANDLE hReverb, + float *pcm_in[], + const AUDIO_CONFIG input_audio_config, + float *pPcm_out, + const int16_t input_offset ) +{ + int16_t i, s, nchan_transport; + float dmx_gain = hReverb->dmx_gain; + + switch ( input_audio_config ) + { + case IVAS_AUDIO_CONFIG_STEREO: + case IVAS_AUDIO_CONFIG_5_1: + case IVAS_AUDIO_CONFIG_7_1: + case IVAS_AUDIO_CONFIG_5_1_2: + case IVAS_AUDIO_CONFIG_5_1_4: + case IVAS_AUDIO_CONFIG_7_1_4: + case IVAS_AUDIO_CONFIG_ISM1: + case IVAS_AUDIO_CONFIG_ISM2: + case IVAS_AUDIO_CONFIG_ISM3: + case IVAS_AUDIO_CONFIG_ISM4: + { + nchan_transport = audioCfg2channels( input_audio_config ); + for ( s = 0; s < hReverb->full_block_size; s++ ) + { + float temp = pcm_in[0][input_offset + s]; + for ( i = 1; i < nchan_transport; i++ ) + { + temp += pcm_in[i][input_offset + s]; + } + pPcm_out[s] = dmx_gain * temp; + } + break; + } + case IVAS_AUDIO_CONFIG_MONO: /* ~'ZOA_1' */ + case IVAS_AUDIO_CONFIG_FOA: + case IVAS_AUDIO_CONFIG_HOA2: + case IVAS_AUDIO_CONFIG_HOA3: + { + for ( s = 0; s < hReverb->full_block_size; s++ ) + { + pPcm_out[s] = dmx_gain * pcm_in[0][input_offset + s]; + } + break; + } + default: + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Unsupported input format for reverb" ); + break; + } + + return IVAS_ERR_OK; +} + + +/*-----------------------------------------------------------------------------------------* + * Function predelay_block() + * + * Perform a predelay + *-----------------------------------------------------------------------------------------*/ + +static void predelay_block( + const REVERB_HANDLE hReverb, + float *pInput, + float *pOutput ) +{ + uint16_t i, idx, n_samples, blk_size; + uint16_t max_blk_size = (uint16_t) hReverb->predelay_line.Delay; + + if ( max_blk_size < 2 ) + { + if ( max_blk_size == 0 ) /* zero-length delay line: just copy the data from input to output */ + { + for ( i = 0; i < hReverb->full_block_size; i++ ) + { + pOutput[i] = pInput[i]; + } + } + else /* 1-sample length delay line: feed the data sample-by-sample */ + { + for ( i = 0; i < hReverb->full_block_size; i++ ) + { + pOutput[i] = ivas_rev_delay_line_get_sample( &( hReverb->predelay_line ) ); + ivas_rev_delay_line_feed_sample( &( hReverb->predelay_line ), pInput[i] ); + } + } + } + else /* multiple-sample length delay line: use block processing */ + { + idx = 0; + n_samples = hReverb->full_block_size; + while ( n_samples > 0 ) + { + blk_size = n_samples; + if ( blk_size > max_blk_size ) + { + blk_size = max_blk_size; + } + ivas_rev_delay_line_get_sample_blk( &( hReverb->predelay_line ), blk_size, &pOutput[idx] ); + ivas_rev_delay_line_feed_sample_blk( &( hReverb->predelay_line ), blk_size, &pInput[idx] ); + idx += blk_size; + n_samples -= blk_size; + } + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function mix_output_block() + * + * mix one block of *pInL and *pInR samples into *pOutL and *pOutL respectively + *-----------------------------------------------------------------------------------------*/ + +static void mix_output_block( + const REVERB_HANDLE hReverb, + const float *pInL, + const float *pInR, + float *pOutL, + float *pOutR ) +{ + uint16_t i; + + for ( i = 0; i < hReverb->full_block_size; i++ ) + { + pOutL[i] += pInL[i]; + pOutR[i] += pInR[i]; + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * ivas_reverb_process() + * + * Process the input PCM audio into output PCM audio, applying reverb + *-----------------------------------------------------------------------------------------*/ + +ivas_error ivas_reverb_process( + const REVERB_HANDLE hReverb, /* i : Reverberator handle */ + const AUDIO_CONFIG input_audio_config, /* i : reverb. input audio configuration */ + const int16_t mix_signals, /* i : add reverb to output signal */ + float *pcm_in[], /* i : the PCM audio to apply reverb on */ + float *pcm_out[], /* o : the PCM audio with reverb applied */ + const int16_t i_ts /* i : subframe index */ +) +{ + float tmp0[L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES], tmp1[L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES], tmp2[L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES]; + ivas_error error; + + if ( ( error = downmix_input_block( hReverb, pcm_in, input_audio_config, tmp1, i_ts * hReverb->full_block_size ) ) != IVAS_ERR_OK ) + { + return error; + } + + predelay_block( hReverb, tmp1, tmp0 ); + + reverb_block( hReverb, tmp0, tmp1, tmp2 ); + + if ( mix_signals ) + { + mix_output_block( hReverb, tmp1, tmp2, &pcm_out[0][i_ts * hReverb->full_block_size], &pcm_out[1][i_ts * hReverb->full_block_size] ); + } + else + { + mvr2r( tmp1, &pcm_out[0][i_ts * hReverb->full_block_size], hReverb->full_block_size ); + mvr2r( tmp2, &pcm_out[1][i_ts * hReverb->full_block_size], hReverb->full_block_size ); + } + + return IVAS_ERR_OK; +} + + +/*------------------------------------------------------------------------- + * ivas_binaural_reverb_processSubFrame() + * + * Compute the reverberation - room effect + *------------------------------------------------------------------------*/ + +void ivas_binaural_reverb_processSubframe( + REVERB_STRUCT_HANDLE hReverb, /* i/o: binaural reverb handle */ + const int16_t numInChannels, /* i : num inputs to be processed */ + const int16_t numSlots, /* i : number of slots to be processed */ + float inReal[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : input CLDFB data real, Comment: This change swaps two first dimensions as first dimension is not constant. */ + float inImag[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : input CLDFB data imag */ + float outReal[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* o : output CLDFB data real */ + float outImag[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX] /* o : output CLDFB data imag */ +) +{ + /* Declare the required variables */ + int16_t idx, bin, ch, sample, invertSampleIndex, tapIdx, *phaseShiftTypePr; + float **tapRealPr, **tapImagPr; + push_wmops( "binaural_reverb" ); + + /* 1) Rotate the data in the loop buffer of the reverberator. + * Notice that the audio at the loop buffers is at time-inverted order + * for convolution purposes later on. */ + for ( bin = 0; bin < hReverb->numBins; bin++ ) + { + /* Move the data forwards by blockSize (i.e. by the frame size of 16 CLDFB slots) */ + mvr2r( hReverb->loopBufReal[bin], hReverb->loopBufReal[bin] + numSlots, hReverb->loopBufLength[bin] ); + mvr2r( hReverb->loopBufImag[bin], hReverb->loopBufImag[bin] + numSlots, hReverb->loopBufLength[bin] ); + + /* Add the data from the end of the loop to the beginning, with an attenuation factor + * according to RT60. This procedure generates an IIR decaying response. The response + * is decorrelated later on. */ + v_multc( hReverb->loopBufReal[bin] + hReverb->loopBufLength[bin], hReverb->loopAttenuationFactor[bin], hReverb->loopBufReal[bin], numSlots ); + v_multc( hReverb->loopBufImag[bin] + hReverb->loopBufLength[bin], hReverb->loopAttenuationFactor[bin], hReverb->loopBufImag[bin], numSlots ); + } + + /* 2) Apply the determined pre-delay to the input audio, and add the delayed audio to the loop. */ + idx = hReverb->preDelayBufferIndex; + for ( sample = 0; sample < numSlots; sample++ ) + { + invertSampleIndex = numSlots - sample - 1; + + for ( bin = 0; bin < hReverb->numBins; bin++ ) + { + /* Add from pre-delay buffer a sample to the loop buffer, in a time-inverted order. + * Also apply the spectral gains determined for the reverberation */ + hReverb->loopBufReal[bin][invertSampleIndex] += hReverb->preDelayBufferReal[idx][bin] * hReverb->reverbEqGains[bin]; + hReverb->loopBufImag[bin][invertSampleIndex] += hReverb->preDelayBufferImag[idx][bin] * hReverb->reverbEqGains[bin]; + hReverb->preDelayBufferReal[idx][bin] = 0.0f; + hReverb->preDelayBufferImag[idx][bin] = 0.0f; + } + + /* Add every second input channel as is to the pre-delay buffer, and every second input channel with + * 90 degrees phase shift to reduce energy imbalances between coherent and incoherent sounds */ + for ( ch = 0; ch < numInChannels; ch++ ) + { + if ( ch % 2 ) + { + v_add( hReverb->preDelayBufferReal[idx], inReal[ch][sample], hReverb->preDelayBufferReal[idx], hReverb->numBins ); + v_add( hReverb->preDelayBufferImag[idx], inImag[ch][sample], hReverb->preDelayBufferImag[idx], hReverb->numBins ); + } + else + { + v_sub( hReverb->preDelayBufferReal[idx], inImag[ch][sample], hReverb->preDelayBufferReal[idx], hReverb->numBins ); + v_add( hReverb->preDelayBufferImag[idx], inReal[ch][sample], hReverb->preDelayBufferImag[idx], hReverb->numBins ); + } + } + idx = ( idx + 1 ) % hReverb->preDelayBufferLength; + } + hReverb->preDelayBufferIndex = idx; + + /* 3) Perform the filtering/decorrelating, using complex and sparse FIR filtering */ + for ( bin = 0; bin < hReverb->numBins; bin++ ) + { + for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + /* These tap pointers have been determined to point to the loop buffer at sparse locations */ + tapRealPr = hReverb->tapPointersReal[bin][ch]; + tapImagPr = hReverb->tapPointersImag[bin][ch]; + + phaseShiftTypePr = hReverb->tapPhaseShiftType[bin][ch]; + + /* Flush output */ + set_f( hReverb->outputBufferReal[bin][ch], 0.0f, numSlots ); + set_f( hReverb->outputBufferImag[bin][ch], 0.0f, numSlots ); + + /* Add from temporally decaying sparse tap locations the audio to the output. */ + for ( tapIdx = 0; tapIdx < hReverb->taps[bin][ch]; tapIdx++ ) + { + switch ( phaseShiftTypePr[tapIdx] ) + { + case 0: /* 0 degrees phase */ + v_add( hReverb->outputBufferReal[bin][ch], tapRealPr[tapIdx], hReverb->outputBufferReal[bin][ch], numSlots ); + v_add( hReverb->outputBufferImag[bin][ch], tapImagPr[tapIdx], hReverb->outputBufferImag[bin][ch], numSlots ); + break; + case 1: /* 90 degrees phase */ + v_sub( hReverb->outputBufferReal[bin][ch], tapImagPr[tapIdx], hReverb->outputBufferReal[bin][ch], numSlots ); + v_add( hReverb->outputBufferImag[bin][ch], tapRealPr[tapIdx], hReverb->outputBufferImag[bin][ch], numSlots ); + break; + case 2: /* 180 degrees phase */ + v_sub( hReverb->outputBufferReal[bin][ch], tapRealPr[tapIdx], hReverb->outputBufferReal[bin][ch], numSlots ); + v_sub( hReverb->outputBufferImag[bin][ch], tapImagPr[tapIdx], hReverb->outputBufferImag[bin][ch], numSlots ); + break; + default: /* 270 degrees phase */ + v_add( hReverb->outputBufferReal[bin][ch], tapImagPr[tapIdx], hReverb->outputBufferReal[bin][ch], numSlots ); + v_sub( hReverb->outputBufferImag[bin][ch], tapRealPr[tapIdx], hReverb->outputBufferImag[bin][ch], numSlots ); + break; + } + } + } + + /* Generate diffuse field binaural coherence by mixing the incoherent reverberated channels with pre-defined gains */ + if ( bin <= hReverb->highestBinauralCoherenceBin ) + { + if ( hReverb->useBinauralCoherence ) + { + for ( sample = 0; sample < numSlots; sample++ ) + { + float leftRe, rightRe, leftIm, rightIm; + + leftRe = hReverb->binauralCoherenceDirectGains[bin] * hReverb->outputBufferReal[bin][0][sample] + hReverb->binauralCoherenceCrossmixGains[bin] * hReverb->outputBufferReal[bin][1][sample]; + rightRe = hReverb->binauralCoherenceDirectGains[bin] * hReverb->outputBufferReal[bin][1][sample] + hReverb->binauralCoherenceCrossmixGains[bin] * hReverb->outputBufferReal[bin][0][sample]; + leftIm = hReverb->binauralCoherenceDirectGains[bin] * hReverb->outputBufferImag[bin][0][sample] + hReverb->binauralCoherenceCrossmixGains[bin] * hReverb->outputBufferImag[bin][1][sample]; + rightIm = hReverb->binauralCoherenceDirectGains[bin] * hReverb->outputBufferImag[bin][1][sample] + hReverb->binauralCoherenceCrossmixGains[bin] * hReverb->outputBufferImag[bin][0][sample]; + + hReverb->outputBufferReal[bin][0][sample] = leftRe; + hReverb->outputBufferReal[bin][1][sample] = rightRe; + hReverb->outputBufferImag[bin][0][sample] = leftIm; + hReverb->outputBufferImag[bin][1][sample] = rightIm; + } + } + } + } + + /* 4) Write data to output */ + for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + for ( sample = 0; sample < numSlots; sample++ ) + { + /* Audio was in the temporally inverted order for convolution, re-invert audio to output */ + invertSampleIndex = numSlots - sample - 1; + + for ( bin = 0; bin < hReverb->numBins; bin++ ) + { + outReal[ch][sample][bin] = hReverb->outputBufferReal[bin][ch][invertSampleIndex]; + outImag[ch][sample][bin] = hReverb->outputBufferImag[bin][ch][invertSampleIndex]; + } + for ( ; bin < CLDFB_NO_CHANNELS_MAX; bin++ ) + { + outReal[ch][sample][bin] = 0.0f; + outImag[ch][sample][bin] = 0.0f; + } + } + } + + pop_wmops(); + return; +} + + +/*------------------------------------------------------------------------- + * ivas_binaural_reverb_open() + * + * Allocate and initialize binaural room reverberator handle + *------------------------------------------------------------------------*/ + +static ivas_error ivas_binaural_reverb_open( + REVERB_STRUCT_HANDLE *hReverbPr, /* i/o: binaural reverb handle */ + const int16_t numBins, /* i : number of CLDFB bins */ + const int16_t numCldfbSlotsPerFrame, /* i : number of CLDFB slots per frame */ + const int32_t sampling_rate, /* i : sampling rate */ + const float *revTimes, /* i : reverberation times T60 for each CLDFB bin in seconds */ + const float *revEnes, /* i : spectrum for reverberated sound at each CLDFB bin */ + const int16_t preDelay /* i : reverb pre-delay in CLDFB slots */ +) +{ + int16_t bin, chIdx, k, len; + REVERB_STRUCT_HANDLE hReverb; + + if ( ( *hReverbPr = (REVERB_STRUCT_HANDLE) malloc( sizeof( REVERB_STRUCT ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Binaural Reverberator\n" ) ); + } + + hReverb = *hReverbPr; + + hReverb->useBinauralCoherence = 1; + hReverb->preDelayBufferLength = 1; + hReverb->preDelayBufferIndex = 0; + + hReverb->numBins = numBins; + hReverb->blockSize = numCldfbSlotsPerFrame; + + for ( k = 0; k < REVERB_PREDELAY_MAX + 1; k++ ) + { + set_f( hReverb->preDelayBufferReal[k], 0.0f, hReverb->numBins ); + set_f( hReverb->preDelayBufferImag[k], 0.0f, hReverb->numBins ); + } + + for ( bin = 0; bin < hReverb->numBins; bin++ ) + { + /* Loop Buffer */ + hReverb->loopBufLengthMax[bin] = (int16_t) ( 500 / ( 1 + bin ) + ( CLDFB_NO_CHANNELS_MAX - bin ) ); + + len = hReverb->loopBufLengthMax[bin] + hReverb->blockSize; + if ( ( hReverb->loopBufReal[bin] = (float *) malloc( len * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Binaural Reverberator\n" ) ); + } + + if ( ( hReverb->loopBufImag[bin] = (float *) malloc( len * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Binaural Reverberator\n" ) ); + } + + set_f( hReverb->loopBufReal[bin], 0.0f, len ); + set_f( hReverb->loopBufImag[bin], 0.0f, len ); + + /* Determine loop buffer length. The following formula is manually tuned to generate sufficiently long + * but not excessively long loops to generate reverberation. */ + /* Note: the resulted length is very sensitive to the precision of the constants below (e.g. 1.45 vs. 1.45f) */ + hReverb->loopBufLength[bin] = (int16_t) ( 1.45 * (int16_t) ( revTimes[bin] * 150.0 ) + 1 ); + hReverb->loopBufLength[bin] = min( hReverb->loopBufLength[bin], hReverb->loopBufLengthMax[bin] ); + + /* Sparse Filter Tap Locations */ + for ( chIdx = 0; chIdx < BINAURAL_CHANNELS; chIdx++ ) + { + len = hReverb->loopBufLength[bin]; + + if ( ( hReverb->tapPhaseShiftType[bin][chIdx] = (int16_t *) malloc( len * sizeof( int16_t ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Binaural Reverberator\n" ) ); + } + set_s( hReverb->tapPhaseShiftType[bin][chIdx], 0, len ); + + if ( ( hReverb->tapPointersReal[bin][chIdx] = (float **) malloc( len * sizeof( float * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Binaural Reverberator\n" ) ); + } + + if ( ( hReverb->tapPointersImag[bin][chIdx] = (float **) malloc( len * sizeof( float * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Binaural Reverberator\n" ) ); + } + + len = hReverb->blockSize; + if ( ( hReverb->outputBufferReal[bin][chIdx] = (float *) malloc( len * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Binaural Reverberator\n" ) ); + } + + if ( ( hReverb->outputBufferImag[bin][chIdx] = (float *) malloc( len * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Binaural Reverberator\n" ) ); + } + + set_f( hReverb->outputBufferReal[bin][chIdx], 0.0f, len ); + set_f( hReverb->outputBufferImag[bin][chIdx], 0.0f, len ); + } + } + + ivas_binaural_reverb_setReverbTimes( hReverb, sampling_rate, revTimes, revEnes ); + + ivas_binaural_reverb_setPreDelay( hReverb, preDelay ); + + return IVAS_ERR_OK; +} + + +/*------------------------------------------------------------------------- + * ivas_binaural_reverb_open_fastconv() + * + * Allocate and initialize binaural room reverberator handle for FastConv + *------------------------------------------------------------------------*/ + +ivas_error ivas_binaural_reverb_open_fastconv( + REVERB_STRUCT_HANDLE *hReverbPr, /* i/o: binaural reverb handle */ + const int16_t numBins, /* i : number of CLDFB bins */ + const int16_t numCldfbSlotsPerFrame, /* i : number of CLDFB slots per frame */ + IVAS_ROOM_ACOUSTICS_CONFIG_DATA *roomAcoustics, /* i/o: room acoustics parameters */ + const AUDIO_CONFIG internal_config, /* i : internal audio config for FastConv */ + const int32_t sampling_rate, /* i : sampling rate */ + const HRTFS_FASTCONV_HANDLE hHrtfFastConv /* i : FastConv HRTF handle */ +) +{ + ivas_error error; + const float *revTimes; + const float *revEne; + float t60[CLDFB_NO_CHANNELS_MAX]; + float ene[CLDFB_NO_CHANNELS_MAX]; + int16_t preDelay; + + error = IVAS_ERR_OK; + + if ( ( roomAcoustics != NULL ) && roomAcoustics->override ) + { + revTimes = t60; + revEne = ene; + if ( ( error = ivas_reverb_prepare_cldfb_params( roomAcoustics, hHrtfFastConv, internal_config, false, sampling_rate, t60, ene ) ) != IVAS_ERR_OK ) + { + return error; + } + preDelay = (int16_t) roundf( 48000.0f * roomAcoustics->acousticPreDelay / CLDFB_NO_CHANNELS_MAX ); + } + else + { + revTimes = hHrtfFastConv->fastconvReverberationTimes; + revEne = hHrtfFastConv->fastconvReverberationEneCorrections; + preDelay = 10; + } + + error = ivas_binaural_reverb_open( hReverbPr, numBins, numCldfbSlotsPerFrame, sampling_rate, revTimes, revEne, preDelay ); + + return error; +} + + +/*------------------------------------------------------------------------- + * ivas_binaural_reverb_open_parambin() + * + * Allocate and initialize binaural room reverberator handle for ParamBin + *------------------------------------------------------------------------*/ + +ivas_error ivas_binaural_reverb_open_parambin( + REVERB_STRUCT_HANDLE *hReverbPr, /* i/o: binaural reverb handle */ + const int16_t numBins, /* i : number of CLDFB bins */ + const int16_t numCldfbSlotsPerFrame, /* i : number of CLDFB slots per frame */ + IVAS_ROOM_ACOUSTICS_CONFIG_DATA *roomAcoustics, /* i/o: room acoustics parameters */ + const int32_t sampling_rate, /* i : sampling rate */ + const HRTFS_PARAMBIN_HANDLE hHrtfParambin /* i : Parametric binauralizer HRTF handle */ +) +{ + ivas_error error; + const float *revTimes; + const float *revEne; + float t60[CLDFB_NO_CHANNELS_MAX]; + float ene[CLDFB_NO_CHANNELS_MAX]; + int16_t preDelay; + + error = IVAS_ERR_OK; + + if ( ( roomAcoustics != NULL ) && roomAcoustics->override ) + { + revTimes = t60; + revEne = ene; + /* Todo Philips: This needs a suitable function for ParamBin here. */ + // if ( ( error = ivas_reverb_prepare_cldfb_params( roomAcoustics, hHrtfFastConv, internal_config, false, sampling_rate, t60, ene ) ) != IVAS_ERR_OK ) + // { + // return error; + // } + preDelay = (int16_t) roundf( 48000.0f * roomAcoustics->acousticPreDelay / CLDFB_NO_CHANNELS_MAX ); + } + else + { + revTimes = hHrtfParambin->parametricReverberationTimes; + revEne = hHrtfParambin->parametricReverberationEneCorrections; + preDelay = 10; + } + + error = ivas_binaural_reverb_open( hReverbPr, numBins, numCldfbSlotsPerFrame, sampling_rate, revTimes, revEne, preDelay ); + + return error; +} + + +/*------------------------------------------------------------------------- + * ivas_binaural_reverb_close() + * + * Close binaural room reverberator handle + *------------------------------------------------------------------------*/ + +void ivas_binaural_reverb_close( + REVERB_STRUCT_HANDLE *hReverb /* i/o: binaural reverb handle */ +) +{ + int16_t bin, chIdx; + + if ( hReverb == NULL || *hReverb == NULL ) + { + return; + } + + for ( bin = 0; bin < ( *hReverb )->numBins; bin++ ) + { + for ( chIdx = 0; chIdx < BINAURAL_CHANNELS; chIdx++ ) + { + free( ( *hReverb )->tapPhaseShiftType[bin][chIdx] ); + free( ( *hReverb )->tapPointersReal[bin][chIdx] ); + free( ( *hReverb )->tapPointersImag[bin][chIdx] ); + free( ( *hReverb )->outputBufferReal[bin][chIdx] ); + free( ( *hReverb )->outputBufferImag[bin][chIdx] ); + } + free( ( *hReverb )->loopBufReal[bin] ); + free( ( *hReverb )->loopBufImag[bin] ); + } + + free( ( *hReverb ) ); + ( *hReverb ) = NULL; + + return; +} diff --git a/lib_rend/ivas_reverb_delay_line.c b/lib_rend/ivas_reverb_delay_line.c new file mode 100644 index 0000000000000000000000000000000000000000..64271ae15eb961d1da0104464c0b4ac9e0a26dc9 --- /dev/null +++ b/lib_rend/ivas_reverb_delay_line.c @@ -0,0 +1,253 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "ivas_prot.h" +#include "ivas_prot_rend.h" +#include "prot.h" +#include "wmc_auto.h" + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_rev_delay_line_init() + * + * Initialize the delay line + *-----------------------------------------------------------------------------------------*/ + +void ivas_rev_delay_line_init( + ivas_rev_delay_line_t *pDelay, /* o : the delay line to initialize */ + float *memory_buffer, /* i : the memory buffer to use for the delay line */ + const uint16_t delay, /* i : the delay */ + const uint16_t maxdelay /* i : maximum delay to be supported */ +) +{ + pDelay->MaxDelay = maxdelay; + + if ( delay <= pDelay->MaxDelay ) + { + pDelay->Delay = delay; + } + else + { + pDelay->Delay = pDelay->MaxDelay; + } + + pDelay->pBuffer = memory_buffer; + set_f( pDelay->pBuffer, 0, pDelay->MaxDelay ); + pDelay->BufferPos = 0; + pDelay->Gain = 1.0f; + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_rev_delay_line_feed_sample() + * + * Feed sample into delay line; NOTE: get a sample out of the line before feeding the next + *-----------------------------------------------------------------------------------------*/ + +void ivas_rev_delay_line_feed_sample( + ivas_rev_delay_line_t *pDelay, /* i : the delay line */ + float input /* i : the sample to feed */ +) +{ + pDelay->pBuffer[pDelay->BufferPos++] = input; + + if ( pDelay->BufferPos >= pDelay->Delay ) + { + pDelay->BufferPos = 0; + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_rev_delay_line_feed_sample_blk() + * + * Feed sample block into delay line; NOTE: get samples out of the line before feeding the next block + *-----------------------------------------------------------------------------------------*/ + +void ivas_rev_delay_line_feed_sample_blk( + ivas_rev_delay_line_t *pDelay, /* i/o: the delay line */ + const uint16_t blk_size, /* i : number of samples in the input data block */ + float *input /* i : the samples to feed */ +) +{ + float *pDst, *pSrc; + uint16_t i, pos; + + pos = (uint16_t) pDelay->BufferPos; + + if ( pos + blk_size > (uint16_t) pDelay->Delay ) /* splitting block in 2 if it exceeds buffer end limit */ + { + uint16_t blk_size_1; /* 1st block up to the end of the buffer */ + uint16_t blk_size_2; /* 2nd block at the beginning of the buffer */ + + blk_size_1 = (uint16_t) pDelay->Delay - pos; + blk_size_2 = blk_size - blk_size_1; + pDst = &pDelay->pBuffer[pos]; + for ( i = 0; i < blk_size_1; i++ ) + { + pDst[i] = input[i]; + } + pDst = &pDelay->pBuffer[0]; + pSrc = &input[blk_size_1]; + for ( i = 0; i < blk_size_2; i++ ) + { + pDst[i] = pSrc[i]; + } + pos = blk_size_2; + } + else /* copy only 1 data block directly if it fits in the buffer */ + { + pDst = &pDelay->pBuffer[pos]; + for ( i = 0; i < blk_size; i++ ) + { + pDst[i] = input[i]; + } + pos += blk_size; + } + pDelay->BufferPos = pos; + + if ( pDelay->BufferPos >= pDelay->Delay ) + { + pDelay->BufferPos = 0; + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_rev_delay_line_get_sample() + * + * Get sample out of delay line, amplified by set gain + * NOTE: get a sample out of the line before feeding the next + *-----------------------------------------------------------------------------------------*/ + +/*! r: sample gotten out of delay line, and amplified by set gain */ +float ivas_rev_delay_line_get_sample( + ivas_rev_delay_line_t *pDelay /* i/o: the delay line */ +) +{ + if ( pDelay->Gain == 1.0f ) + { + + return pDelay->pBuffer[pDelay->BufferPos]; + } + else + { + + return pDelay->Gain * pDelay->pBuffer[pDelay->BufferPos]; + } +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_rev_delay_line_get_sample_blk() + * + * Get a block samples out of delay line, amplified by set gain + *-----------------------------------------------------------------------------------------*/ + +void ivas_rev_delay_line_get_sample_blk( + ivas_rev_delay_line_t *pDelay, /* i : the delay line */ + const uint16_t blk_size, /* i : number of samples in the data block */ + float *output /* i/o: amples gotten out of delay line, and amplified by set gainin */ +) +{ + float *pDst, *pSrc; + uint16_t i, pos; + float gain; + + pos = (uint16_t) pDelay->BufferPos; + gain = pDelay->Gain; + + if ( pos + blk_size > (uint16_t) pDelay->Delay ) /* splitting block in 2 if it exceeds buffer end limit */ + { + uint16_t blk_size_1; /* 1st block up to the end of the buffer */ + uint16_t blk_size_2; /* 2nd block at the beginning of the buffer */ + + blk_size_1 = (uint16_t) pDelay->Delay - pos; + blk_size_2 = blk_size - blk_size_1; + pSrc = &pDelay->pBuffer[pos]; + if ( gain == 1.0f ) + { + for ( i = 0; i < blk_size_1; i++ ) + { + output[i] = pSrc[i]; + } + pSrc = &pDelay->pBuffer[0]; + pDst = &output[blk_size_1]; + for ( i = 0; i < blk_size_2; i++ ) + { + pDst[i] = pSrc[i]; + } + } + else + { + for ( i = 0; i < blk_size_1; i++ ) + { + output[i] = gain * pSrc[i]; + } + pSrc = &pDelay->pBuffer[0]; + pDst = &output[blk_size_1]; + for ( i = 0; i < blk_size_2; i++ ) + { + pDst[i] = gain * pSrc[i]; + } + } + } + else /* copy only 1 data block directly if it fits in the buffer */ + { + pSrc = &pDelay->pBuffer[pos]; + + if ( gain == 1.0f ) + { + for ( i = 0; i < blk_size; i++ ) + { + output[i] = pSrc[i]; + } + } + else + { + for ( i = 0; i < blk_size; i++ ) + { + output[i] = gain * pSrc[i]; + } + } + } + + return; +} diff --git a/lib_rend/ivas_reverb_fft_filter.c b/lib_rend/ivas_reverb_fft_filter.c new file mode 100644 index 0000000000000000000000000000000000000000..b1ae53ae7c15ad484b7740693c869e7689fa5896 --- /dev/null +++ b/lib_rend/ivas_reverb_fft_filter.c @@ -0,0 +1,418 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "prot.h" +#include "ivas_prot_rend.h" +#include +#include "wmc_auto.h" + + +/*------------------------------------------------------------------------------------------* + * Static functions declarations + *------------------------------------------------------------------------------------------*/ + +static void fft_wrapper_2ch( float *buffer_L, float *buffer_R, const int16_t fft_size ); + +static void ifft_wrapper_2ch( float *buffer_L, float *buffer_R, const int16_t fft_size ); + + +/*-----------------------------------------------------------------------------------------* + * Function int_log2() + * + * takes integer log2 of power_of_2 input value. e.g. int_log2(1024) = 10 + * powerOf2 must be a power of two between 2^0 and 2^15 + * NOT valid for integers thar are NOT a power of 2 + *-----------------------------------------------------------------------------------------*/ + +/*! r: integer log2 */ +uint16_t int_log2( + uint32_t powerOf2 ) +{ + int16_t l2 = 15; + + if ( powerOf2 & 0x00FF ) + { + l2 -= 8; + } + + if ( powerOf2 & 0x0F0F ) + { + l2 -= 4; + } + + if ( powerOf2 & 0x3333 ) + { + l2 -= 2; + } + + if ( powerOf2 & 0x5555 ) + { + l2 -= 1; + } + + return l2; +} + + +/*-----------------------------------------------------------------------------------------* + * Function fft_wrapper_2ch() + * + * Wrapper uses complex FFT to perform real-input FFT on 2 channels simultaneously + *-----------------------------------------------------------------------------------------*/ + +static void fft_wrapper_2ch( + float *buffer_L, + float *buffer_R, + const int16_t fft_size ) +{ + const int16_t half_sz = fft_size >> 1; + int16_t k, mirror_k; + float left_re, left_im, right_re, right_im; + + DoRTFTn( buffer_L, buffer_R, fft_size ); + + /* separating left and right channel spectra */ + for ( k = 1; k < half_sz; k++ ) + { + mirror_k = fft_size - k; + + left_re = 0.5f * ( buffer_L[k] + buffer_L[mirror_k] ); + left_im = 0.5f * ( buffer_R[k] - buffer_R[mirror_k] ); + + right_re = 0.5f * ( buffer_R[k] + buffer_R[mirror_k] ); + right_im = -0.5f * ( buffer_L[k] - buffer_L[mirror_k] ); + + buffer_L[k] = left_re; + buffer_R[k] = right_re; + buffer_L[mirror_k] = left_im; + buffer_R[mirror_k] = right_im; + } + + return; +} + +/*-----------------------------------------------------------------------------------------* + * Function ifft_wrapper_2ch() + * + * Wrapper uses complex FFT to perform real-output IFFT on 2 channels simultaneously + *-----------------------------------------------------------------------------------------*/ + +static void ifft_wrapper_2ch( + float *buffer_L, + float *buffer_R, + const int16_t fft_size ) +{ + float buffer_L_re, buffer_L_im, buffer_R_re, buffer_R_im; + const int16_t half_sz = fft_size >> 1; + const float inv_sz = 1.0f / (float) fft_size; + int16_t k, mirror_k; + + /* Re-arranging and adding spectra in order to obtain L/R signals as re/im ifft outputs */ + for ( k = 1; k < half_sz; k++ ) + { + mirror_k = fft_size - k; + + buffer_L_re = buffer_L[k]; + buffer_L_im = buffer_L[mirror_k]; + buffer_R_re = buffer_R[k]; + buffer_R_im = buffer_R[mirror_k]; + + buffer_L[k] = buffer_L_re + buffer_R_im; + buffer_L[mirror_k] = buffer_L_re - buffer_R_im; + buffer_R[k] = buffer_R_re - buffer_L_im; + buffer_R[mirror_k] = buffer_R_re + buffer_L_im; + } + + DoRTFTn( buffer_L, buffer_R, fft_size ); + + /* Apply (1/length) scaling for inverse FFT */ + for ( k = 0; k < fft_size; k++ ) + { + buffer_L[k] *= inv_sz; + buffer_R[k] *= inv_sz; + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_reverb_t2f_f2t_init() + * + * Initializes t2t_f2t struct and clears history + *-----------------------------------------------------------------------------------------*/ + +int16_t ivas_reverb_t2f_f2t_init( + ivas_reverb_t2f_f2t_t *t2f_f2t, + const int16_t fft_size, + const int16_t block_size ) +{ + if ( fft_size > RV_FILTER_MAX_FFT_SIZE ) + { + return 1; + } + + if ( ( block_size > fft_size ) || ( fft_size - block_size > RV_FILTER_MAX_HISTORY ) ) + { + return 2; + } + + t2f_f2t->log2_fft_size = int_log2( fft_size ); + + if ( ( 1 << t2f_f2t->log2_fft_size ) != fft_size ) + { + return 3; /* fft_size not a power of 2 */ + } + t2f_f2t->fft_size = fft_size; + t2f_f2t->block_size = block_size; + t2f_f2t->hist_size = t2f_f2t->fft_size - t2f_f2t->block_size; + + if ( t2f_f2t->hist_size > RV_FILTER_MAX_HISTORY ) + { + t2f_f2t->hist_size = RV_FILTER_MAX_HISTORY; + } + + ivas_reverb_t2f_f2t_ClearHistory( t2f_f2t ); + + return 0; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_reverb_t2f_f2t_ClearHistory() + * + * Clears the history for the overlap length (fft_size - block_size) + *-----------------------------------------------------------------------------------------*/ + +void ivas_reverb_t2f_f2t_ClearHistory( + ivas_reverb_t2f_f2t_t *t2f_f2t ) +{ + int16_t i; + float *hist_L = t2f_f2t->fft_history_L; + float *hist_R = t2f_f2t->fft_history_R; + + for ( i = 0; i < t2f_f2t->hist_size; i++ ) + { + hist_L[i] = 0.0f; + hist_R[i] = 0.0f; + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_reverb_t2f_f2t_in() + * + * Input of block data, history is copied, fft is taken for both L/R channels + *-----------------------------------------------------------------------------------------*/ + +void ivas_reverb_t2f_f2t_in( + ivas_reverb_t2f_f2t_t *t2f_f2t, + float *input_L, + float *input_R, + float *buffer_L, + float *buffer_R ) +{ + int16_t i; + int16_t hlen = t2f_f2t->hist_size; + int16_t bsiz = t2f_f2t->block_size; + float *hist_L = t2f_f2t->fft_history_L; + float *hist_R = t2f_f2t->fft_history_R; + float *pL, *pR; + + /* copy history to buffer */ + for ( i = 0; i < hlen; i++ ) + { + buffer_L[i] = hist_L[i]; + buffer_R[i] = hist_R[i]; + } + + /* copy input to buffer */ + pL = &buffer_L[hlen]; + pR = &buffer_R[hlen]; + for ( i = 0; i < bsiz; i++ ) + { + pL[i] = input_L[i]; + pR[i] = input_R[i]; + } + + /* copy buffer to history */ + pL = &buffer_L[bsiz]; + pR = &buffer_R[bsiz]; + for ( i = 0; i < hlen; i++ ) + { + hist_L[i] = pL[i]; + hist_R[i] = pR[i]; + } + + /* do FFT */ + fft_wrapper_2ch( buffer_L, buffer_R, t2f_f2t->fft_size ); + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_reverb_t2f_f2t_out() + * + * Input of frequency domain data, IFFT, copied to output (both L & R channels) + *-----------------------------------------------------------------------------------------*/ + +void ivas_reverb_t2f_f2t_out( + ivas_reverb_t2f_f2t_t *t2f_f2t, + float *buffer_L, + float *buffer_R, + float *output_L, + float *output_R ) +{ + int16_t i; + float *pL = &buffer_L[t2f_f2t->hist_size]; + float *pR = &buffer_R[t2f_f2t->hist_size]; + + ifft_wrapper_2ch( buffer_L, buffer_R, t2f_f2t->fft_size ); + + for ( i = 0; i < t2f_f2t->block_size; i++ ) + { + output_L[i] = pL[i]; + output_R[i] = pR[i]; + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_reverb_fft_filter_init() + * + * Initializes filter struct + *-----------------------------------------------------------------------------------------*/ + +int16_t ivas_reverb_fft_filter_init( + ivas_reverb_fft_filter_t *fft_filter, + const int16_t fft_size ) +{ + if ( fft_size > RV_FILTER_MAX_FFT_SIZE ) + { + return 1; + } + + fft_filter->fft_size = fft_size; + + return 0; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_reverb_fft_filter_ComplexMul() + * + * Buffer is complex multiplied with fft_filter internal coefficients + *-----------------------------------------------------------------------------------------*/ + +void ivas_reverb_fft_filter_ComplexMul( + ivas_reverb_fft_filter_t *fft_filter, + float *buffer ) +{ + int16_t f_spec, h, i, j; + float *spec; + float t; + + f_spec = fft_filter->fft_size; + h = f_spec >> 1; + spec = fft_filter->fft_spectrum; + + buffer[0] *= spec[0]; /* real multiply f0 DC */ + buffer[h] *= spec[h]; /* real multiply f_spec Nyquist */ + j = f_spec - 1; + for ( i = 1; i < h; i++ ) /*actual complex multiply in loop */ + { + t = buffer[i]; + buffer[i] = t * spec[i] - buffer[j] * spec[j]; + buffer[j] = t * spec[j] + buffer[j] * spec[i]; + j--; + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_reverb_fft_filter_ConvertFFTWF_2_FFTR() + * + * Convert the FFTWF formatted spectrum to fft_real formatted spectrum + *-----------------------------------------------------------------------------------------*/ + +void ivas_reverb_fft_filter_ConvertFFTWF_2_FFTR( + rv_fftwf_type_complex *spectrum, + float *fft_real, + const int16_t fft_size ) +{ + int16_t i, h; + + h = fft_size >> 1; + fft_real[0] = spectrum[0][0]; + fft_real[h] = spectrum[h][0]; + for ( i = 1; i < h; i++ ) + { + fft_real[i] = spectrum[i][0]; + fft_real[fft_size - i] = spectrum[i][1]; + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_reverb_fft_filter_CrossMix() + * + * buffer0 and 1 are cross mixed + *-----------------------------------------------------------------------------------------*/ + +void ivas_reverb_fft_filter_CrossMix( + float *buffer0, + float *buffer1, + const int16_t fft_size ) +{ + float t; + int16_t i; + + for ( i = 0; i < fft_size; i++ ) + { + t = buffer0[i]; + buffer0[i] = t + buffer1[i]; + buffer1[i] = t - buffer1[i]; + } + + return; +} diff --git a/lib_rend/ivas_reverb_filter_design.c b/lib_rend/ivas_reverb_filter_design.c new file mode 100644 index 0000000000000000000000000000000000000000..8a17fc6201026a37a0350e62db468cc5c6085f4b --- /dev/null +++ b/lib_rend/ivas_reverb_filter_design.c @@ -0,0 +1,829 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "prot.h" +#include "ivas_prot_rend.h" +#include +#include +#include +#include "wmc_auto.h" + + +/*------------------------------------------------------------------------------------------* + * Local constants + *------------------------------------------------------------------------------------------*/ + +#define STEP_LIMIT_PIVOT_FREQ ( 1000.0f ) /* Pivot (initial reference) frequency for response gradient limit */ +#define RESPONSE_STEP_LIMIT_LF ( 4.0f ) /* Maximum step in dB per bin at low frequencies (< pivot frequency) */ +#define RESPONSE_STEP_LIMIT_HF ( 1.5f ) /* Maximum step in dB per bin at high frequencies (> pivot frequency) */ +#define EPS ( 1e-30f ) + + +/*------------------------------------------------------------------------------------------* + * Function definitions + *------------------------------------------------------------------------------------------*/ + +/*-------------------------------------------------------------------* + * calc_min_phase() + * + * Compute the minimum phase spectrum that can be derived + * from the amplitude spectrum of the input. + *-------------------------------------------------------------------*/ + +static void calc_min_phase( + rv_fftwf_type_complex *pSpectrum, + const int16_t fft_size, + float *pMinPhase ) +{ + int16_t idx; + const int16_t half_fft_size = fft_size >> 1; + const int16_t log2_fft_size = int_log2( fft_size ); + const int16_t spectrum_size = half_fft_size + 1; + const int16_t cepstrum_smoothing_extent = fft_size >> 3; + const float scale_factor = 1.0f / (float) fft_size; + + float pCepstrum[RV_FILTER_MAX_FFT_SIZE]; + float pFolded_cepstrum_re[RV_FILTER_MAX_FFT_SIZE]; + float pFolded_cepstrum_im[RV_FILTER_MAX_FFT_SIZE]; + float pFolded_cepstrum_smoothing_win[RV_FILTER_MAX_FFT_SIZE]; + float angle_increment; + float initial_angle; + + + /* Prepare the smoothing window. Portion of the pCepstrum that will be smoothed out by a window to prevent aliasing. */ + + /* The first portion of the pCepstrum is kept unchanged */ + for ( idx = 0; idx < half_fft_size - cepstrum_smoothing_extent; idx++ ) + { + pFolded_cepstrum_smoothing_win[idx] = 1.0f; + } + + /* Adding Hann half-window for smooth transition */ + angle_increment = EVS_PI / (float) ( 2 * cepstrum_smoothing_extent - 1 ); + + /* Initial angle set to match Hann window alignment in Matlab */ + initial_angle = 0.5f * ( EVS_PI + angle_increment ); + + for ( idx = 0; idx < cepstrum_smoothing_extent; idx++ ) + { + const float sine_value = sinf( initial_angle + angle_increment * idx ); + + pFolded_cepstrum_smoothing_win[idx + half_fft_size - cepstrum_smoothing_extent] = sine_value * sine_value; + } + + /* Padding the rest with zeros */ + for ( idx = half_fft_size; idx < fft_size; idx++ ) + { + pFolded_cepstrum_smoothing_win[idx] = 0.0f; + } + + /* Compute the log amplitude spectrum */ + for ( idx = 0; idx < spectrum_size; idx++ ) + { + pCepstrum[idx] = 0.5f * logf( ( pSpectrum[idx][0] * pSpectrum[idx][0] ) + ( pSpectrum[idx][1] * pSpectrum[idx][1] ) + EPS ); + } + + /* Extending one-sided spectrum to double-sided one */ + for ( idx = spectrum_size; idx < fft_size; idx++ ) + { + pCepstrum[idx] = pCepstrum[fft_size - idx]; + } + + /* Compute the real pCepstrum of the log amplitude spectrum */ + fft_rel( pCepstrum, fft_size, log2_fft_size ); + /* Note: using real-input fft rather than cmplx ifft to ensure support for 1024 size */ + /* Extra scaling is though required on the real/img parts, and img part is later inverted */ + + for ( idx = 0; idx < fft_size; idx++ ) + { + pCepstrum[idx] *= scale_factor; + } + + /* Fold the pCepstrum to ensure that zeros outside the unit circle move inside it, making it minimum phase. */ + pFolded_cepstrum_re[0] = pCepstrum[0]; + pFolded_cepstrum_im[0] = 0.0f; + + for ( idx = 1; idx < half_fft_size; idx++ ) + { + pFolded_cepstrum_re[idx] = 2.0f * pCepstrum[idx]; + pFolded_cepstrum_im[idx] = -2.0f * pCepstrum[fft_size - idx]; + /* Note: sign inverted because of fft rather than ifft used before */ + } + pFolded_cepstrum_re[half_fft_size] = pCepstrum[half_fft_size]; + pFolded_cepstrum_im[half_fft_size] = 0.0f; + + for ( idx = spectrum_size; idx < fft_size; idx++ ) + { + pFolded_cepstrum_re[idx] = 0.0f; + pFolded_cepstrum_im[idx] = 0.0f; + } + + /* Smoothing out the folded pCepstrum, to remove discontinuity at Ns, + hoping to significantly reduce the secondary response in the minimum-phase IR */ + for ( idx = 0; idx < fft_size; idx++ ) + { + pFolded_cepstrum_re[idx] *= pFolded_cepstrum_smoothing_win[idx]; + pFolded_cepstrum_im[idx] *= pFolded_cepstrum_smoothing_win[idx]; + } + + /* Convert back and isolate the phase. */ + if ( fft_size <= 512 ) /* for size <= 512 using complex-value FFT (more effecient, but available only up to 512 size) */ + { + DoRTFTn( pFolded_cepstrum_re, pFolded_cepstrum_im, fft_size ); + + /* Copying the img part into the output */ + for ( idx = 1; idx < half_fft_size; idx++ ) + { + pMinPhase[idx] = pFolded_cepstrum_im[idx]; + } + } + else /* for fft_size > 512 using real-values FFT twice (for real + imag parts) */ + { + /* Real part */ + fft_rel( pFolded_cepstrum_re, fft_size, log2_fft_size ); + /* Imag part */ + fft_rel( pFolded_cepstrum_im, fft_size, log2_fft_size ); + + /* Copying the img part into the output */ + for ( idx = 1; idx < half_fft_size; idx++ ) + { + pMinPhase[idx] = pFolded_cepstrum_re[fft_size - idx] + pFolded_cepstrum_im[idx]; + } + } + pMinPhase[0] = 0.0f; + pMinPhase[half_fft_size] = 0.0f; + + return; +} + + +/*-------------------------------------------------------------------* + * calc_min_phase_filter() + * + * Convert FFT-domain pFilter pH_flt into a minimum-phase pFilter. + * This function expects only the positive frequency bins up to Nyquist/2 + *-------------------------------------------------------------------*/ + +static void calc_min_phase_filter( + rv_fftwf_type_complex *pH_flt, + const int16_t fft_size, + float delay ) +{ + const int16_t spectrum_size = ( fft_size >> 1 ) + 1; + int16_t idx; + float phase_increment; + float pMin_phase[RV_FILTER_MAX_FFT_SIZE]; + + phase_increment = -PI2 * delay / (float) fft_size; + + calc_min_phase( pH_flt, fft_size, pMin_phase ); + + for ( idx = 0; idx < spectrum_size; idx++ ) + { + /* Cancel out initial phase by computing amplitude */ + /* Note: slightly different (but mathematically equivalent) approach used for better efficiency */ + const float current_ampl = sqrtf( pH_flt[idx][0] * pH_flt[idx][0] + pH_flt[idx][1] * pH_flt[idx][1] ); + + /* Using the phase computed by calc_min_phase() + additional delay */ + const float current_phase = pMin_phase[idx] + phase_increment * idx; + + /* Apply the computed phase */ + pH_flt[idx][0] = current_ampl * cosf( current_phase ); + pH_flt[idx][1] = current_ampl * sinf( current_phase ); + } + + return; +} + + +/*-------------------------------------------------------------------* + * apply_window_fft() + * + * Apply the smoothing (anti-aliasing) window in the time domain + *-------------------------------------------------------------------*/ + +static void apply_window_fft( + rv_fftwf_type_complex *pH_flt, + const float *pWindow, + const int16_t fft_size ) +{ + int16_t idx; + float pFilter[RV_FILTER_MAX_FFT_SIZE]; + const int16_t half_fft_size = fft_size >> 1; + const int16_t log2_fft_size = int_log2( fft_size ); + + /* Converting pFilter to ifft function input format */ + /* Real parts */ + for ( idx = 0; idx <= half_fft_size; idx++ ) + { + pFilter[idx] = pH_flt[idx][0]; + } + /* Img parts */ + for ( idx = 1; idx < half_fft_size; idx++ ) + { + pFilter[fft_size - idx] = pH_flt[idx][1]; + } + + /* Do inverse fft to go to the time domain */ + ifft_rel( pFilter, fft_size, log2_fft_size ); + + /* Apply the window in the time domain */ + for ( idx = 0; idx < fft_size; idx++ ) + { + pFilter[idx] *= pWindow[idx]; + } + + /* Convert back to the frequency domain */ + fft_rel( pFilter, fft_size, log2_fft_size ); + + /* Copy data to the output with format conversion */ + pH_flt[0][0] = pFilter[0]; + pH_flt[half_fft_size][0] = pFilter[half_fft_size]; + pH_flt[0][1] = 0.0f; + pH_flt[half_fft_size][1] = 0.0f; + for ( idx = 1; idx < half_fft_size; idx++ ) + { + pH_flt[idx][0] = pFilter[idx]; + pH_flt[idx][1] = pFilter[fft_size - idx]; + } + + return; +} + + +/*-------------------------------------------------------------------* + * response_step_limit() + * + * Limit the gain vs frequency slope to T db per bin + *-------------------------------------------------------------------*/ + +static void response_step_limit( + float *X, + const int16_t dim_x, + const float step_limit_lf_dB, + const float step_limit_hf_dB, + const int16_t pivot_bin_idx ) +{ + int16_t i; + const float positive_step_limit_lf = powf( 10.0f, 0.05f * step_limit_lf_dB ); + const float negative_step_limit_lf = 1.0f / positive_step_limit_lf; + const float positive_step_limit_hf = powf( 10.0f, 0.05f * step_limit_hf_dB ); + const float negative_step_limit_hf = 1.0f / positive_step_limit_hf; + + /* Go up from pivot frequency and limit the slope to the maximum given by T. */ + for ( i = pivot_bin_idx + 1; i < dim_x; i++ ) + { + float desiredChange = X[i] / X[i - 1]; + float change = fabsf( desiredChange ); + if ( desiredChange >= 1 ) + { + if ( change > positive_step_limit_hf ) + { + change = positive_step_limit_hf; + } + } + else + { + if ( change < negative_step_limit_hf ) + { + change = negative_step_limit_hf; + } + } + X[i] = X[i - 1] * change; + } + + /* Go down from pivot frequency and limit the slope to the maximum given by T. */ + for ( i = pivot_bin_idx - 1; i >= 0; i-- ) + { + float desiredChange = X[i] / X[i + 1]; + float change = fabsf( desiredChange ); + + if ( desiredChange >= 1 ) + { + if ( change > positive_step_limit_lf ) + { + change = positive_step_limit_lf; + } + } + else + { + if ( change < negative_step_limit_lf ) + { + change = negative_step_limit_lf; + } + } + X[i] = X[i + 1] * change; + } + + return; +} + + +/*-------------------------------------------------------------------* + * ivas_reverb_define_window_fft() + * + * Compute a smoothing window used later to avoid aliasing in FFT filters + *-------------------------------------------------------------------*/ + +void ivas_reverb_define_window_fft( + float *pWindow, + const int16_t transitionStart, + const int16_t transitionLength, + const int16_t spectrumLength ) +{ + int16_t idx, fftLength; + float angle_increment; + float initial_angle; + + fftLength = ( spectrumLength - 1 ) * 2; + + /* The first portion of the sequence is kept unchanged, window == 1 */ + for ( idx = 0; idx < transitionStart; idx++ ) + { + pWindow[idx] = 1.0f; + } + + /* Adding Hann half-window for smooth transition */ + angle_increment = EVS_PI / ( 2.0f * transitionLength - 1 ); + + /* Initial angle set to match Hann window alignment in Matlab */ + initial_angle = 0.5f * ( EVS_PI + angle_increment ); + for ( idx = 0; idx < transitionLength; idx++ ) + { + const float sine_value = sinf( initial_angle + angle_increment * idx ); + + pWindow[idx + transitionStart] = sine_value * sine_value; + } + + /* Padding the rest with zeros */ + for ( idx = transitionStart + transitionLength; idx < fftLength; idx++ ) + { + pWindow[idx] = 0.0f; + } + + return; +} + +/*-------------------------------------------------------------------* + * apply_window_fft() + * + * Applies the smoothing (anti-aliasing) window in the time domain + *-------------------------------------------------------------------*/ + +/* Computes colorations filters for the target frequency responses */ +int16_t ivas_reverb_calc_color_filters( + const float *pTargetL, + const float *pTargetR, + const float *pWindow, + const int16_t fft_size, + const float delay, + rv_fftwf_type_complex *pBeqL, + rv_fftwf_type_complex *pBeqR ) +{ + int16_t idx, half_fft_size; + + half_fft_size = ( fft_size >> 1 ); + + for ( idx = 0; idx <= half_fft_size; idx++ ) + { + pBeqL[idx][0] = pTargetL[idx]; + pBeqL[idx][1] = 0.0f; + pBeqR[idx][0] = pTargetR[idx]; + pBeqR[idx][1] = 0.0f; + } + + /* Make the response minimum phase. Does make the spectrum complex, but + will avoid aliasing when applied in the FFT domain. */ + calc_min_phase_filter( pBeqL, fft_size, delay ); + calc_min_phase_filter( pBeqR, fft_size, delay ); + apply_window_fft( pBeqL, pWindow, fft_size ); + apply_window_fft( pBeqR, pWindow, fft_size ); + + for ( idx = 0; idx <= half_fft_size; idx++ ) + { + if ( ( pTargetL[idx] < 0.0f ) || ( pTargetR[idx] < 0.0f ) ) /* Shouldn't have negative gains. */ + { + return 1; + } + } + + return 0; +} + + +/*-------------------------------------------------------------------* + * ivas_reverb_calc_correl_filters() + * + * Compute correlation filters for the target frequency response + *-------------------------------------------------------------------*/ + +int16_t ivas_reverb_calc_correl_filters( + const float *pTargetICC, + const float *pWindow, + const int16_t fft_size, + const float delay, + rv_fftwf_type_complex *pU, + rv_fftwf_type_complex *pV ) +{ + int16_t idx, half_fft_size; + + half_fft_size = fft_size >> 1; + + for ( idx = 0; idx <= half_fft_size; idx++ ) + { + if ( ( 1.0f + pTargetICC[idx] < 0.0f ) || ( 1.0f - pTargetICC[idx] < 0.0f ) ) /* Shouldn't have negative gains. */ + { + return 1; + } + } + + for ( idx = 0; idx <= half_fft_size; idx++ ) + { + pU[idx][0] = sqrtf( ( 1.0f + pTargetICC[idx] ) * 0.5f ); + pU[idx][1] = 0.0f; + pV[idx][0] = sqrtf( ( 1.0f - pTargetICC[idx] ) * 0.5f ); + pV[idx][1] = 0.0f; + } + + /* Make the response minimum phase. Does make the spectrum complex, but + will avoid aliasing when applied in the FFT domain. */ + calc_min_phase_filter( pU, fft_size, delay ); + calc_min_phase_filter( pV, fft_size, delay ); + apply_window_fft( pU, pWindow, fft_size ); + apply_window_fft( pV, pWindow, fft_size ); + + return 0; +} + + +/*-------------------------------------------------------------------* + * ivas_reverb_calc_color_levels() + * + * Compute the target levels (gains) for the coloration filters + *-------------------------------------------------------------------*/ + +void ivas_reverb_calc_color_levels( + const int32_t output_Fs, + const int16_t freq_count, + const int16_t loop_count, + const float *pFc, + const float *pAcoustic_dsr, + const float *pHrtf_avg_pwr_L, + const float *pHrtf_avg_pwr_R, + const int16_t *pLoop_delays, + const float *pT60_filter_coeff, + float *pTarget_color_L, + float *pTarget_color_R ) +{ + int16_t i, freq_idx, idx_pivot, nrcoefs, loop_idx; + float t60[RV_LENGTH_NR_FC]; + + /* Pre-computing inverse values for optimisation (to avoid divisions in inner loops) */ + const float fs_inverted = 1.0f / (float) output_Fs; + const float loop_count_inverted = 1.0f / (float) loop_count; + + const float log__0_001 = logf( 0.001f ); + /* Pre-computed for better efficiency */ + + const float revEnergyFactor = 1.0f; + /* revEnergyFactor == 1 for IVAS, as the pDsr values are already scaled previously for predelay delta */ + + /* Computing minimum delays in a simpler way, as they are already provided in descending order */ + const int16_t minDelay = pLoop_delays[loop_count - 1]; + const int16_t minDelayDiff = pLoop_delays[loop_count - 2] - pLoop_delays[loop_count - 1]; + const float freq_step = 0.5f * output_Fs / (float) ( freq_count - 1 ); + + for ( freq_idx = 0; freq_idx < freq_count; freq_idx++ ) + { + t60[freq_idx] = 0.0f; + } + + for ( loop_idx = 0; loop_idx < loop_count; loop_idx++ ) + { + float coefA[2]; + float coefB[2]; + + nrcoefs = 2; + /* for pFilter order == 1 */ + + /* Obtaining T60 filters coefficients for the current loop */ + for ( i = 0; i < nrcoefs; i++ ) + { + coefA[i] = pT60_filter_coeff[2 * nrcoefs * loop_idx + i + nrcoefs]; + coefB[i] = pT60_filter_coeff[2 * nrcoefs * loop_idx + i]; + } + + /* Loop over frequencies */ + for ( freq_idx = 0; freq_idx < freq_count; freq_idx++ ) + { + /* Compute T60 pFilter gain at the given frequency */ + float cos_w; + float H_filter; + float T60_est; + + cos_w = cosf( PI2 * pFc[freq_idx] * fs_inverted ); + H_filter = coefB[0] * coefB[0] + coefB[1] * coefB[1] + 2.0f * coefB[0] * coefB[1] * cos_w; + H_filter /= 1.0f + coefA[1] * coefA[1] + 2.0f * coefA[1] * cos_w; + H_filter = sqrtf( H_filter ); + + /* Compute the T60 value on the basis of the pFilter gain */ + T60_est = -3.0f * pLoop_delays[loop_idx] / ( log10f( H_filter ) * output_Fs ); + + t60[freq_idx] += T60_est; + } + } + + /* Dividing by the number of loops to compute the average T60 estimate */ + for ( freq_idx = 0; freq_idx < freq_count; freq_idx++ ) + { + t60[freq_idx] *= loop_count_inverted; + } + + /* Compute target gains on the basis of the estimated T60 values */ + for ( freq_idx = 0; freq_idx < freq_count; freq_idx++ ) + { + const float A0_square_est = powf( 10.0f, -6.0f * minDelay / ( t60[freq_idx] * output_Fs ) ); + const float alpha = -log__0_001 / t60[freq_idx]; + const float revPredNormEnergy = ( A0_square_est / ( 2.0f * alpha ) ) * output_Fs / ( 0.8776f * minDelayDiff + 26.7741f ); + + pTarget_color_L[freq_idx] = sqrtf( pAcoustic_dsr[freq_idx] * revEnergyFactor * pHrtf_avg_pwr_L[freq_idx] ) / max( sqrtf( revPredNormEnergy ), EPS ); + + pTarget_color_R[freq_idx] = sqrtf( pAcoustic_dsr[freq_idx] * revEnergyFactor * pHrtf_avg_pwr_R[freq_idx] ) / max( sqrtf( revPredNormEnergy ), EPS ); + } + + /* Limiting the frequency response gradients + Find frequency band closest to chosen pivot frequency. */ + idx_pivot = (int16_t) round( STEP_LIMIT_PIVOT_FREQ / freq_step ); + + /* Perform step limiting */ + response_step_limit( pTarget_color_L, freq_count, RESPONSE_STEP_LIMIT_LF, RESPONSE_STEP_LIMIT_HF, idx_pivot ); + response_step_limit( pTarget_color_R, freq_count, RESPONSE_STEP_LIMIT_LF, RESPONSE_STEP_LIMIT_HF, idx_pivot ); + + return; +} + + +/*-------------------------------------------------------------------* + * ivas_reverb_interpolate_acoustic_data() + * + * Interpolates data from the input T60 and DSR tables to the FFT pFilter uniform grid + * Note: the fc frequencies both for the input and the output must be in the ascending order + *-------------------------------------------------------------------*/ + +void ivas_reverb_interpolate_acoustic_data( + const int16_t input_table_size, + const float *pInput_fc, + const float *pInput_t60, + const float *pInput_dsr, + const int16_t output_table_size, + const float *pOutput_fc, + float *pOutput_t60, + float *pOutput_dsr ) +{ + int16_t input_idx, output_idx; + float rel_offset; + + input_idx = 0; + + for ( output_idx = 0; output_idx < output_table_size; output_idx++ ) + { + /* if the bin frequency is lower than the 1st frequency point in the input table, take this 1st point */ + if ( pOutput_fc[output_idx] < pInput_fc[0] ) + { + input_idx = 0; + rel_offset = 0.0f; + } + else + { + /* if the bin frequency is higher than the last frequency point in the input table, take this last point */ + if ( pOutput_fc[output_idx] > pInput_fc[input_table_size - 1] ) + { + input_idx = input_table_size - 2; + rel_offset = 1.0f; + } + /* otherwise use linear interpolation between 2 consecutive points in the input table */ + else + { + while ( pOutput_fc[output_idx] > pInput_fc[input_idx + 1] ) + { + input_idx++; + } + rel_offset = ( pOutput_fc[output_idx] - pInput_fc[input_idx] ) / ( pInput_fc[input_idx + 1] - pInput_fc[input_idx] ); + } + } + + pOutput_t60[output_idx] = pInput_t60[input_idx] + rel_offset * ( pInput_t60[input_idx + 1] - pInput_t60[input_idx] ); + + pOutput_dsr[output_idx] = pInput_dsr[input_idx] + rel_offset * ( pInput_dsr[input_idx + 1] - pInput_dsr[input_idx] ); + } + + return; +} + + +/*-------------------------------------------------------------------* + * ivas_reverb_get_hrtf_set_properties() + * + * Function analyses the HRTF set and computes avarage left/right power spectrum + * and frequency-dependent IA coherence. Expects frequency-domain HRTF input + *-------------------------------------------------------------------*/ + +void ivas_reverb_get_hrtf_set_properties( + float **ppHrtf_set_L_re, + float **ppHrtf_set_L_im, + float **ppHrtf_set_R_re, + float **ppHrtf_set_R_im, + const AUDIO_CONFIG input_audio_config, + const int16_t hrtf_count, + const int16_t in_freq_count, + const int16_t out_freq_count, + float *pOut_avg_pwr_L, + float *pOut_avg_pwr_R, + float *out_i_a_coherence ) +{ + const float foa_sum_coeffs[4][3] = { + { 1.0, 1.0f, 0.0f }, + { 1.0, -1.0f, 0.0f }, + { 1.0, 0.0f, 1.0f }, + { 1.0, 0.0f, -1.0f } + }; + const float inp_freq_step = 0.5f / (float) in_freq_count; + const float inp_freq_offset = 0.5f * inp_freq_step; + const float out_freq_step = 0.5f / (float) ( out_freq_count - 1 ); + + int16_t used_hrtf_count, base_idx, freq_idx, hrtf_idx, out_bin_idx, ch_index, is_ambisonics; + float hrtf_count_inverted, relative_pos, weight_1st; + float avg_pwr_left[2]; + float avg_pwr_right[2]; + float IA_coherence[2]; + + if ( input_audio_config == IVAS_AUDIO_CONFIG_FOA || input_audio_config == IVAS_AUDIO_CONFIG_HOA2 || input_audio_config == IVAS_AUDIO_CONFIG_HOA3 ) + { + is_ambisonics = 1; + used_hrtf_count = 4; /* Using only 1st order HRTFs */ + } + else + { + is_ambisonics = 0; + used_hrtf_count = hrtf_count; + } + + /* Interpolation (linear to a new grid) */ + base_idx = 0; + relative_pos = 0.0f; + hrtf_count_inverted = 1.0f / (float) used_hrtf_count; + + /* Loop over output frequency bins */ + for ( out_bin_idx = 0; out_bin_idx < out_freq_count; out_bin_idx++ ) + { + /* Computing normalized frequency for the current bin (1.0 corresponds to sampling rate) */ + const float norm_freq = out_freq_step * out_bin_idx; + + /* Computing the bin index in the source data */ + const float tbl_index = ( norm_freq - inp_freq_offset ) / inp_freq_step; + + if ( tbl_index <= 0.0f ) /* In case of extrapolation (below 1st bin), choose nearest */ + { + base_idx = 0; + relative_pos = 0.0f; + } + else + { + base_idx = (int16_t) floor( tbl_index ); + relative_pos = tbl_index - base_idx; + if ( base_idx > ( in_freq_count - 2 ) ) /* In case of extrapolation (above last bin), choose nearest */ + { + base_idx = in_freq_count - 2; + relative_pos = 1.0f; + } + } + + /* Computing 2 bins data for later interpolation */ + + /* Zeroing before accumalation for average value computing */ + avg_pwr_left[0] = 0.0f; + avg_pwr_left[1] = 0.0f; + avg_pwr_right[0] = 0.0f; + avg_pwr_right[1] = 0.0f; + IA_coherence[0] = 0.0f; + IA_coherence[1] = 0.0f; + + /* Get power spectra and cross - correlation between left and right hrtfs */ + /* Loop over all the HRTFs available */ + for ( hrtf_idx = 0; hrtf_idx < used_hrtf_count; hrtf_idx++ ) + { + /* Pointers to current HRTF data */ + float *current_base_L_ptr_re, *current_base_L_ptr_im, *current_base_R_ptr_re, *current_base_R_ptr_im; + + /* combined HRTF data used for FOA */ + float combined_channels_L_re[2]; + float combined_channels_L_im[2]; + float combined_channels_R_re[2]; + float combined_channels_R_im[2]; + + /* Process the frequency bins containing both real and img parts */ + /* In case of 5.1 or 7.1 formats, use the available HRTF paires directly*/ + if ( !is_ambisonics ) + { + current_base_L_ptr_re = ppHrtf_set_L_re[hrtf_idx] + base_idx; + current_base_R_ptr_re = ppHrtf_set_R_re[hrtf_idx] + base_idx; + current_base_L_ptr_im = ppHrtf_set_L_im[hrtf_idx] + base_idx; + current_base_R_ptr_im = ppHrtf_set_R_im[hrtf_idx] + base_idx; + } + + /* In case of FOA format, combine the W channel with the X/Y channels */ + else + { + for ( freq_idx = 0; freq_idx < 2; freq_idx++ ) + { + combined_channels_L_re[freq_idx] = 0.0f; + combined_channels_R_re[freq_idx] = 0.0f; + combined_channels_L_im[freq_idx] = 0.0f; + combined_channels_R_im[freq_idx] = 0.0f; + + for ( ch_index = 0; ch_index < 3; ch_index++ ) + { + combined_channels_L_re[freq_idx] += foa_sum_coeffs[hrtf_idx][ch_index] * ppHrtf_set_L_re[ch_index][base_idx + freq_idx]; + combined_channels_R_re[freq_idx] += foa_sum_coeffs[hrtf_idx][ch_index] * ppHrtf_set_R_re[ch_index][base_idx + freq_idx]; + combined_channels_L_im[freq_idx] += foa_sum_coeffs[hrtf_idx][ch_index] * ppHrtf_set_L_im[ch_index][base_idx + freq_idx]; + combined_channels_R_im[freq_idx] += foa_sum_coeffs[hrtf_idx][ch_index] * ppHrtf_set_R_im[ch_index][base_idx + freq_idx]; + } + } + + current_base_L_ptr_re = &combined_channels_L_re[0]; + current_base_R_ptr_re = &combined_channels_R_re[0]; + current_base_L_ptr_im = &combined_channels_L_im[0]; + current_base_R_ptr_im = &combined_channels_R_im[0]; + } + + for ( freq_idx = 0; freq_idx < 2; freq_idx++ ) + { + float L_re, L_im, R_re, R_im, C_re; + + L_re = current_base_L_ptr_re[freq_idx]; + R_re = current_base_R_ptr_re[freq_idx]; + L_im = current_base_L_ptr_im[freq_idx]; + R_im = current_base_R_ptr_im[freq_idx]; + + avg_pwr_left[freq_idx] += L_re * L_re + L_im * L_im; + avg_pwr_right[freq_idx] += R_re * R_re + R_im * R_im; + + /* Cross product (Re part) */ + C_re = L_re * R_re + L_im * R_im; + IA_coherence[freq_idx] += C_re; + } + } + + /* Compute the averages and the IA coherence */ + for ( freq_idx = 0; freq_idx < 2; freq_idx++ ) + { + avg_pwr_left[freq_idx] *= hrtf_count_inverted; + avg_pwr_right[freq_idx] *= hrtf_count_inverted; + IA_coherence[freq_idx] = hrtf_count_inverted * IA_coherence[freq_idx] / + sqrtf( avg_pwr_left[freq_idx] * avg_pwr_right[freq_idx] ); + + /* Limiting to (0...1) range in case of small numerical errors or negative values */ + IA_coherence[freq_idx] = min( IA_coherence[freq_idx], 1.0f ); + IA_coherence[freq_idx] = max( IA_coherence[freq_idx], 0.0f ); + } + + /* Computing weighted average of 2 nearest values (1 below + 1 above) for linear interpolation */ + weight_1st = 1.0f - relative_pos; + pOut_avg_pwr_L[out_bin_idx] = weight_1st * avg_pwr_left[0] + relative_pos * avg_pwr_left[1]; + pOut_avg_pwr_R[out_bin_idx] = weight_1st * avg_pwr_right[0] + relative_pos * avg_pwr_right[1]; + out_i_a_coherence[out_bin_idx] = weight_1st * IA_coherence[0] + relative_pos * IA_coherence[1]; + } + + return; +} diff --git a/lib_rend/ivas_reverb_iir_filter.c b/lib_rend/ivas_reverb_iir_filter.c new file mode 100644 index 0000000000000000000000000000000000000000..bf326e09b90a93a00f806ffa59a8d690b990087c --- /dev/null +++ b/lib_rend/ivas_reverb_iir_filter.c @@ -0,0 +1,144 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "prot.h" +#include "ivas_prot_rend.h" +#include "wmc_auto.h" + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_reverb_iir_filt_init() + * + * Initialize the IIR filter + *-----------------------------------------------------------------------------------------*/ + +void ivas_reverb_iir_filt_init( + ivas_rev_iir_filter_t *iirFilter, /* o : IIR filter */ + const uint16_t maxTaps /* i : maximum number of filter taps */ +) +{ + iirFilter->MaxTaps = maxTaps; + iirFilter->isFIR = 0; + iirFilter->nr_taps = 0; /* filter is set to PASS i.e. input copy to output */ + iirFilter->Output = 0.0f; + + for ( uint16_t i = 0; i < maxTaps; i++ ) + { + iirFilter->CoefA[i] = 0; + iirFilter->CoefB[i] = 0; + } + + set_f( iirFilter->pBuffer, 0, iirFilter->MaxTaps ); + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_reverb_iir_filt_set() + * + * Set the IIR filter + *-----------------------------------------------------------------------------------------*/ + +void ivas_reverb_iir_filt_set( + ivas_rev_iir_filter_t *iirFilter, /* i/o: IIR filter */ + uint16_t nr_taps, /* i : number of IIR filter taps */ + const float *coefA, /* i : A filter coefficients to set */ + const float *coefB /* i : the B filter coefficients to set */ +) +{ + uint16_t i; + + if ( nr_taps > iirFilter->MaxTaps ) + { + nr_taps = (uint16_t) iirFilter->MaxTaps; + } + + iirFilter->nr_taps = nr_taps; + iirFilter->isFIR = ( coefA == NULL ); + + if ( iirFilter->isFIR != 0 ) + { + for ( i = 0; i < iirFilter->nr_taps; i++ ) + { + iirFilter->CoefB[i] = coefB[i]; + } + } + else + { + for ( i = 0; i < iirFilter->nr_taps; i++ ) + { + iirFilter->CoefA[i] = coefA[i]; + iirFilter->CoefB[i] = coefB[i]; + } + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_reverb_iir_filt_2taps_feed_blk() + * + * Feed samples into 2-taps IIR filter and return resulting output samples + *-----------------------------------------------------------------------------------------*/ + +void ivas_reverb_iir_filt_2taps_feed_blk( + ivas_rev_iir_filter_t *iirFilter, /* i/o: IIR filter */ + const uint16_t blk_size, /* i : size */ + const float *input, /* i : input buffer */ + float *output /* i : output buffer */ +) +{ + uint16_t i; + float flt_output = 0.0f; + float flt_CoefB_0 = iirFilter->CoefB[0]; + float flt_CoefB_1 = iirFilter->CoefB[1]; + float flt_CoefA_1 = iirFilter->CoefA[1]; + float flt_pBuffer_0 = iirFilter->pBuffer[0]; + float flt_pBuffer_1 = iirFilter->pBuffer[1]; + + for ( i = 0; i < blk_size; i++ ) + { + flt_output = input[i] * flt_CoefB_0 + flt_pBuffer_0; + flt_pBuffer_0 = flt_pBuffer_1 + input[i] * flt_CoefB_1 - flt_output * flt_CoefA_1; + output[i] = flt_output; + } + + iirFilter->pBuffer[0] = flt_pBuffer_0; + iirFilter->pBuffer[1] = flt_pBuffer_1; + iirFilter->Output = flt_output; + + return; +} diff --git a/lib_rend/ivas_reverb_utils.c b/lib_rend/ivas_reverb_utils.c new file mode 100644 index 0000000000000000000000000000000000000000..3bdc9b2af982b45c4f7e125bc66d9006ec679d48 --- /dev/null +++ b/lib_rend/ivas_reverb_utils.c @@ -0,0 +1,514 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "prot.h" +#include "ivas_prot_rend.h" +#include "ivas_rom_rend.h" +#include +#include "wmc_auto.h" + + +/*-----------------------------------------------------------------------------------------* + * Local constants + *-----------------------------------------------------------------------------------------*/ + +#define DEFAULT_SRC_DIST ( 1.5f ) /* default source distance [m] for reverb dmx factor computing */ +#define MAX_SAMPLING_RATE ( 48000 ) +#define CLDFB_CONVOLVER_NTAPS_MAX ( 16 ) +#define FFT_SPECTRUM_SIZE ( 1 + ( RV_FILTER_MAX_FFT_SIZE / 2 ) ) + +#define N_INITIAL_IGNORED_FRAMES 4 + +/*-----------------------------------------------------------------------------------------* + * Local function prototypes + *-----------------------------------------------------------------------------------------*/ + +typedef struct cldfb_convolver_state +{ + const float *filter_taps_left_re[CLDFB_NO_CHANNELS_MAX]; + const float *filter_taps_left_im[CLDFB_NO_CHANNELS_MAX]; + const float *filter_taps_right_re[CLDFB_NO_CHANNELS_MAX]; + const float *filter_taps_right_im[CLDFB_NO_CHANNELS_MAX]; + float filter_states_re[BINAURAL_CONVBANDS][CLDFB_CONVOLVER_NTAPS_MAX]; + float filter_states_im[BINAURAL_CONVBANDS][CLDFB_CONVOLVER_NTAPS_MAX]; +} cldfb_convolver_state; + +static ivas_error ivas_reverb_get_fastconv_hrtf_set_energies( const HRTFS_FASTCONV_HANDLE hHrtfFastConv, const AUDIO_CONFIG input_audio_config, const int16_t use_brir, const int32_t sampling_rate, float *avg_pwr_left, float *avg_pwr_right ); + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_reverb_prepare_cldfb_params() + * + * Prepares reverb parameters for CLDFB-based reverberator + *-----------------------------------------------------------------------------------------*/ + +ivas_error ivas_reverb_prepare_cldfb_params( + IVAS_ROOM_ACOUSTICS_CONFIG_DATA *pInput_params, + const HRTFS_FASTCONV_HANDLE hHrtfFastConv, + const AUDIO_CONFIG input_audio_config, + const int16_t use_brir, + const int32_t output_Fs, + float *pOutput_t60, + float *pOutput_ene ) +{ + int16_t idx; + float fc[CLDFB_NO_CHANNELS_MAX]; + float avg_pwr_left[CLDFB_NO_CHANNELS_MAX]; + float avg_pwr_right[CLDFB_NO_CHANNELS_MAX]; + float delay_diff, ln_1e6_inverted, exp_argument; + const float dist = DEFAULT_SRC_DIST; + const float dmx_gain_2 = 4.0f * EVS_PI * dist * dist / 0.001f; + ivas_error error; + + for ( idx = 0; idx < CLDFB_NO_CHANNELS_MAX; idx++ ) + { + fc[idx] = ( (float) idx + 0.5f ) * ( (float) MAX_SAMPLING_RATE / (float) ( 2 * CLDFB_NO_CHANNELS_MAX ) ); + } + + ivas_reverb_interpolate_acoustic_data( pInput_params->nBands, pInput_params->pFc_input, pInput_params->pAcoustic_rt60, pInput_params->pAcoustic_dsr, CLDFB_NO_CHANNELS_MAX, fc, pOutput_t60, pOutput_ene ); + + /* adjust DSR for the delay difference */ + delay_diff = pInput_params->inputPreDelay - pInput_params->acousticPreDelay; + ln_1e6_inverted = 1.0f / logf( 1e06f ); + for ( idx = 0; idx < CLDFB_NO_CHANNELS_MAX; idx++ ) + { + exp_argument = delay_diff / ( pOutput_t60[idx] * ln_1e6_inverted ); + /* Limit exponent to approx +/-100 dB in case of incoherent value of delay_diff, to prevent overflow */ + exp_argument = min( exp_argument, 23.0f ); + exp_argument = max( exp_argument, -23.0f ); + pOutput_ene[idx] *= expf( exp_argument ); + } + + if ( ( error = ivas_reverb_get_fastconv_hrtf_set_energies( hHrtfFastConv, input_audio_config, use_brir, output_Fs, avg_pwr_left, avg_pwr_right ) ) != IVAS_ERR_OK ) + { + return error; + } + + for ( idx = 0; idx < CLDFB_NO_CHANNELS_MAX; idx++ ) + { + pOutput_ene[idx] *= 0.5f * ( avg_pwr_left[idx] + avg_pwr_right[idx] ) * dmx_gain_2; + } + + return IVAS_ERR_OK; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_cldfb_convolver() + * + * Function for convolving CLDFB-domain data with filter taps + *-----------------------------------------------------------------------------------------*/ + +static void ivas_cldfb_convolver( + cldfb_convolver_state *convolver_state, /* i/o: pointer to convolver state structure */ + float out_CLDFB_real[BINAURAL_CHANNELS][CLDFB_NO_CHANNELS_MAX], /* o : real part of binaural signals */ + float out_CLDFB_imag[BINAURAL_CHANNELS][CLDFB_NO_CHANNELS_MAX], /* o : imag part of binaural signals */ + float in_CLDFB_real[CLDFB_NO_CHANNELS_MAX], /* i : real part of input signals */ + float in_CLDFB_imag[CLDFB_NO_CHANNELS_MAX], /* i : imag part of input signals */ + const int16_t num_conv_bands, /* i : number of convolution bands */ + const int16_t num_taps /* i : number of filter taps */ +) +{ + int16_t band_idx, tap_idx; + float *filter_states_real_ptr, *filter_states_imag_ptr; + const float *filter_taps_left_re_ptr, *filter_taps_left_im_ptr, *filter_taps_right_re_ptr, *filter_taps_right_im_ptr; + + for ( band_idx = 0; band_idx < num_conv_bands; band_idx++ ) + { + float out_real_left, out_real_right, out_imag_left, out_imag_right; + out_real_left = 0.0f; + out_real_right = 0.0f; + out_imag_left = 0.0f; + out_imag_right = 0.0f; + + filter_states_real_ptr = (float *) &( convolver_state->filter_states_re[band_idx][0] ); + filter_states_imag_ptr = (float *) &( convolver_state->filter_states_im[band_idx][0] ); + + filter_taps_left_re_ptr = convolver_state->filter_taps_left_re[band_idx]; + filter_taps_left_im_ptr = convolver_state->filter_taps_left_im[band_idx]; + filter_taps_right_re_ptr = convolver_state->filter_taps_right_re[band_idx]; + filter_taps_right_im_ptr = convolver_state->filter_taps_right_im[band_idx]; + + for ( tap_idx = num_taps - 1; tap_idx > 0; tap_idx-- ) + { + filter_states_real_ptr[tap_idx] = filter_states_real_ptr[tap_idx - 1]; + filter_states_imag_ptr[tap_idx] = filter_states_imag_ptr[tap_idx - 1]; + + /* Left real and imag */ + out_real_left += ( filter_states_real_ptr[tap_idx] * filter_taps_left_re_ptr[tap_idx] ) - ( filter_states_imag_ptr[tap_idx] * filter_taps_left_im_ptr[tap_idx] ); + out_imag_left += ( filter_states_real_ptr[tap_idx] * filter_taps_left_im_ptr[tap_idx] ) + ( filter_states_imag_ptr[tap_idx] * filter_taps_left_re_ptr[tap_idx] ); + + /* Right real and imag*/ + out_real_right += ( filter_states_real_ptr[tap_idx] * filter_taps_right_re_ptr[tap_idx] ) - ( filter_states_imag_ptr[tap_idx] * filter_taps_right_im_ptr[tap_idx] ); + out_imag_right += ( filter_states_real_ptr[tap_idx] * filter_taps_right_im_ptr[tap_idx] ) + ( filter_states_imag_ptr[tap_idx] * filter_taps_right_re_ptr[tap_idx] ); + } + + filter_states_real_ptr[0] = in_CLDFB_real[band_idx]; + filter_states_imag_ptr[0] = in_CLDFB_imag[band_idx]; + + /* Left real and imag */ + out_CLDFB_real[0][band_idx] += out_real_left + ( filter_states_real_ptr[0] * filter_taps_left_re_ptr[0] ) - ( filter_states_imag_ptr[0] * filter_taps_left_im_ptr[0] ); + out_CLDFB_imag[0][band_idx] += out_imag_left + ( filter_states_real_ptr[0] * filter_taps_left_im_ptr[0] ) + ( filter_states_imag_ptr[0] * filter_taps_left_re_ptr[0] ); + + /* Right real and imag */ + out_CLDFB_real[1][band_idx] += out_real_right + ( filter_states_real_ptr[0] * filter_taps_right_re_ptr[0] ) - ( filter_states_imag_ptr[0] * filter_taps_right_im_ptr[0] ); + out_CLDFB_imag[1][band_idx] += out_imag_right + ( filter_states_real_ptr[0] * filter_taps_right_im_ptr[0] ) + ( filter_states_imag_ptr[0] * filter_taps_right_re_ptr[0] ); + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function get_IR_from_filter_taps() + * + * Function converts CLDFB filter taps into time-domain data + *-----------------------------------------------------------------------------------------*/ + +static ivas_error get_IR_from_filter_taps( + const HRTFS_FASTCONV_HANDLE hHrtfFastConv, + const int16_t hrtf_idx, + const AUDIO_CONFIG input_audio_config, + const int16_t use_brir, + const int32_t sampling_rate, + const int16_t pulse_length, + float *pOut_l, + float *pOut_r ) +{ + int16_t i, j, band_idx, block_idx, block_len, block_count, input_sample_idx, output_sample_idx, array_idx; + HANDLE_CLDFB_FILTER_BANK handle_cldfb_analysis, handle_cldfb_synthesis_l, handle_cldfb_synthesis_r; + cldfb_convolver_state convolver_state; + float real_buffer_in[CLDFB_NO_CHANNELS_MAX]; + float imag_buffer_in[CLDFB_NO_CHANNELS_MAX]; + float out_CLDFB_real[BINAURAL_CHANNELS][CLDFB_NO_CHANNELS_MAX]; /* o : real part of Binaural signals */ + float out_CLDFB_imag[BINAURAL_CHANNELS][CLDFB_NO_CHANNELS_MAX]; /* o : imag part of Binaural signals */ + float dirac_pls[CLDFB_NO_CHANNELS_MAX + 1]; + ivas_error error; + + block_len = (int16_t) ( sampling_rate * INV_CLDFB_BANDWIDTH ); + block_count = N_INITIAL_IGNORED_FRAMES + ( pulse_length / block_len ); + + set_f( dirac_pls, 0, block_len + 1 ); + dirac_pls[0] = 1.0f; + input_sample_idx = 0; + output_sample_idx = 0; + + /* Assign CLDFB taps */ + if ( input_audio_config == IVAS_AUDIO_CONFIG_HOA3 ) + { + for ( band_idx = 0; band_idx < BINAURAL_CONVBANDS; band_idx++ ) + { + convolver_state.filter_taps_left_re[band_idx] = hHrtfFastConv->leftHRIRReal_HOA3[band_idx][hrtf_idx]; + convolver_state.filter_taps_left_im[band_idx] = hHrtfFastConv->leftHRIRImag_HOA3[band_idx][hrtf_idx]; + convolver_state.filter_taps_right_re[band_idx] = hHrtfFastConv->rightHRIRReal_HOA3[band_idx][hrtf_idx]; + convolver_state.filter_taps_right_im[band_idx] = hHrtfFastConv->rightHRIRImag_HOA3[band_idx][hrtf_idx]; + } + } + else if ( input_audio_config == IVAS_AUDIO_CONFIG_HOA2 ) + { + for ( band_idx = 0; band_idx < BINAURAL_CONVBANDS; band_idx++ ) + { + convolver_state.filter_taps_left_re[band_idx] = hHrtfFastConv->leftHRIRReal_HOA2[band_idx][hrtf_idx]; + convolver_state.filter_taps_left_im[band_idx] = hHrtfFastConv->leftHRIRImag_HOA2[band_idx][hrtf_idx]; + convolver_state.filter_taps_right_re[band_idx] = hHrtfFastConv->rightHRIRReal_HOA2[band_idx][hrtf_idx]; + convolver_state.filter_taps_right_im[band_idx] = hHrtfFastConv->rightHRIRImag_HOA2[band_idx][hrtf_idx]; + } + } + else if ( input_audio_config == IVAS_AUDIO_CONFIG_FOA ) + { + for ( band_idx = 0; band_idx < BINAURAL_CONVBANDS; band_idx++ ) + { + convolver_state.filter_taps_left_re[band_idx] = hHrtfFastConv->leftHRIRReal_FOA[band_idx][hrtf_idx]; + convolver_state.filter_taps_left_im[band_idx] = hHrtfFastConv->leftHRIRImag_FOA[band_idx][hrtf_idx]; + convolver_state.filter_taps_right_re[band_idx] = hHrtfFastConv->rightHRIRReal_FOA[band_idx][hrtf_idx]; + convolver_state.filter_taps_right_im[band_idx] = hHrtfFastConv->rightHRIRImag_FOA[band_idx][hrtf_idx]; + } + } + else + { + array_idx = 0; + if ( input_audio_config == IVAS_AUDIO_CONFIG_5_1 ) + { + array_idx = channelIndex_CICP6[hrtf_idx]; + } + else if ( input_audio_config == IVAS_AUDIO_CONFIG_7_1 ) + { + array_idx = channelIndex_CICP12[hrtf_idx]; + } + else if ( input_audio_config == IVAS_AUDIO_CONFIG_5_1_2 ) + { + array_idx = channelIndex_CICP14[hrtf_idx]; + } + else if ( input_audio_config == IVAS_AUDIO_CONFIG_5_1_4 ) + { + array_idx = channelIndex_CICP16[hrtf_idx]; + } + else if ( input_audio_config == IVAS_AUDIO_CONFIG_7_1_4 ) + { + array_idx = channelIndex_CICP19[hrtf_idx]; + } + + if ( use_brir ) + { + for ( band_idx = 0; band_idx < BINAURAL_CONVBANDS; band_idx++ ) + { + convolver_state.filter_taps_left_re[band_idx] = hHrtfFastConv->leftBRIRReal[band_idx][array_idx]; + convolver_state.filter_taps_left_im[band_idx] = hHrtfFastConv->leftBRIRImag[band_idx][array_idx]; + convolver_state.filter_taps_right_re[band_idx] = hHrtfFastConv->rightBRIRReal[band_idx][array_idx]; + convolver_state.filter_taps_right_im[band_idx] = hHrtfFastConv->rightBRIRImag[band_idx][array_idx]; + } + } + else + { + for ( band_idx = 0; band_idx < BINAURAL_CONVBANDS; band_idx++ ) + { + convolver_state.filter_taps_left_re[band_idx] = hHrtfFastConv->leftHRIRReal[band_idx][array_idx]; + convolver_state.filter_taps_left_im[band_idx] = hHrtfFastConv->leftHRIRImag[band_idx][array_idx]; + convolver_state.filter_taps_right_re[band_idx] = hHrtfFastConv->rightHRIRReal[band_idx][array_idx]; + convolver_state.filter_taps_right_im[band_idx] = hHrtfFastConv->rightHRIRImag[band_idx][array_idx]; + } + } + } + + for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + { + for ( j = 0; j < CLDFB_CONVOLVER_NTAPS_MAX; j++ ) + { + convolver_state.filter_states_re[i][j] = 0; + convolver_state.filter_states_im[i][j] = 0; + } + } + + if ( ( error = openCldfb( &handle_cldfb_analysis, CLDFB_ANALYSIS, sampling_rate, CLDFB_PROTOTYPE_5_00MS ) ) != IVAS_ERR_OK ) + { + return error; + } + if ( ( error = openCldfb( &handle_cldfb_synthesis_l, CLDFB_SYNTHESIS, sampling_rate, CLDFB_PROTOTYPE_5_00MS ) ) != IVAS_ERR_OK ) + { + return error; + } + if ( ( error = openCldfb( &handle_cldfb_synthesis_r, CLDFB_SYNTHESIS, sampling_rate, CLDFB_PROTOTYPE_5_00MS ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Main loop for convolving dirac pulse with CLDFB filter taps */ + for ( block_idx = 0; block_idx < block_count; block_idx++ ) + { + float *ppRealBuf[1]; + float *ppImagBuf[1]; + + cldfbAnalysis_ts( &dirac_pls[input_sample_idx], real_buffer_in, imag_buffer_in, block_len, handle_cldfb_analysis ); + + /* Perform convolution */ + + for ( i = 0; i < BINAURAL_CHANNELS; i++ ) + { + for ( j = 0; j < CLDFB_NO_CHANNELS_MAX; j++ ) + { + out_CLDFB_real[i][j] = 0; + out_CLDFB_imag[i][j] = 0; + } + } + + ivas_cldfb_convolver( &convolver_state, out_CLDFB_real, out_CLDFB_imag, real_buffer_in, imag_buffer_in, BINAURAL_CONVBANDS, BINAURAL_NTAPS ); + + ppRealBuf[0] = out_CLDFB_real[0]; + ppImagBuf[0] = out_CLDFB_imag[0]; + cldfbSynthesis( ppRealBuf, ppImagBuf, &pOut_l[output_sample_idx], block_len, handle_cldfb_synthesis_l ); + + ppRealBuf[0] = out_CLDFB_real[1]; + ppImagBuf[0] = out_CLDFB_imag[1]; + cldfbSynthesis( ppRealBuf, ppImagBuf, &pOut_r[output_sample_idx], block_len, handle_cldfb_synthesis_r ); + + if ( input_sample_idx == 0 ) + { + input_sample_idx = 1; + } + + if ( block_idx >= N_INITIAL_IGNORED_FRAMES ) + { + output_sample_idx += block_len; + } + } + + deleteCldfb( &handle_cldfb_analysis ); + deleteCldfb( &handle_cldfb_synthesis_l ); + deleteCldfb( &handle_cldfb_synthesis_r ); + + return IVAS_ERR_OK; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_reverb_get_cldfb_hrtf_set_properties() + * + * Function analyses the HRTF set and computes avarage left/right power spectrum + * and frequency-dependent IA coherence. + * Uses fastconv renderer filter taps to compute energies + *-----------------------------------------------------------------------------------------*/ + +static ivas_error ivas_reverb_get_cldfb_hrtf_set_properties( + AUDIO_CONFIG input_audio_config, + const HRTFS_FASTCONV_HANDLE hHrtfFastConv, + const int16_t use_brir, + const int32_t sampling_rate, + float *avg_pwr_left, + float *avg_pwr_right ) +{ + float current_HRTF_data_L[L_FRAME48k]; + float current_HRTF_data_R[L_FRAME48k]; + int16_t freq_idx, hrtf_idx, hrtf_count; + float hrtf_count_inverted; + int16_t fft_size, IR_length, log2_fft_size, half_fft_size, freq_count; + ivas_error error; + + fft_size = RV_FILTER_MAX_FFT_SIZE; + IR_length = CLDFB_NO_CHANNELS_MAX * ( ( fft_size + CLDFB_NO_CHANNELS_MAX - 1 ) / CLDFB_NO_CHANNELS_MAX ); + log2_fft_size = int_log2( fft_size ); + half_fft_size = fft_size >> 1; + freq_count = 1 + half_fft_size; + + /* chosing between ambisonics, 5.1 and 7.1 MC audio */ + if ( ( input_audio_config == IVAS_AUDIO_CONFIG_FOA ) || ( input_audio_config == IVAS_AUDIO_CONFIG_HOA2 ) || ( input_audio_config == IVAS_AUDIO_CONFIG_HOA3 ) ) + { + hrtf_count = 1; + } + else if ( input_audio_config == IVAS_AUDIO_CONFIG_7_1 ) + { + hrtf_count = 7; + } + else + { + hrtf_count = 5; + input_audio_config = IVAS_AUDIO_CONFIG_5_1; + } + + /* Zeroing before accumalation for average value computing */ + for ( freq_idx = 0; freq_idx < freq_count; freq_idx++ ) + { + avg_pwr_left[freq_idx] = 0.0f; + avg_pwr_right[freq_idx] = 0.0f; + } + + /* Get power spectra and cross - correlation between left and right hrtfs + Loop over all the HRTFs available */ + for ( hrtf_idx = 0; hrtf_idx < hrtf_count; hrtf_idx++ ) + { + if ( ( error = get_IR_from_filter_taps( hHrtfFastConv, hrtf_idx, input_audio_config, use_brir, sampling_rate, IR_length, current_HRTF_data_L, current_HRTF_data_R ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Perform forward FFT on both L/R channels */ + fft_rel( current_HRTF_data_L, (int16_t) fft_size, (int16_t) log2_fft_size ); + fft_rel( current_HRTF_data_R, (int16_t) fft_size, (int16_t) log2_fft_size ); + + /* Process the DC bin (without img part) */ + avg_pwr_left[0] += current_HRTF_data_L[0] * current_HRTF_data_L[0]; + avg_pwr_right[0] += current_HRTF_data_R[0] * current_HRTF_data_R[0]; + + /* Process the Nyquist frequency bin (without img part) */ + avg_pwr_left[half_fft_size] += current_HRTF_data_L[half_fft_size] * current_HRTF_data_L[half_fft_size]; + avg_pwr_right[half_fft_size] += current_HRTF_data_R[half_fft_size] * current_HRTF_data_R[half_fft_size]; + + /* Process the other frequency bins containing both real and img parts */ + for ( freq_idx = 1; freq_idx < half_fft_size; freq_idx++ ) + { + float L_re, L_im, R_re, R_im; + L_re = current_HRTF_data_L[freq_idx]; + R_re = current_HRTF_data_R[freq_idx]; + L_im = current_HRTF_data_L[fft_size - freq_idx]; + R_im = current_HRTF_data_R[fft_size - freq_idx]; + + avg_pwr_left[freq_idx] += L_re * L_re + L_im * L_im; + avg_pwr_right[freq_idx] += R_re * R_re + R_im * R_im; + } + } + + /* Compute the averages and the IA coherence */ + hrtf_count_inverted = 1.0f / (float) hrtf_count; + for ( freq_idx = 0; freq_idx < freq_count; freq_idx++ ) + { + avg_pwr_left[freq_idx] *= hrtf_count_inverted; + avg_pwr_right[freq_idx] *= hrtf_count_inverted; + } + + return IVAS_ERR_OK; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_reverb_get_fastconv_hrtf_set_energies() + * + * Function analyses the HRTF set and computes avarage left/right power spectrum. + * Uses fastconv renderer filter taps to compute energies. Output interpolated + * to CLDFB bin center frequencies + *-----------------------------------------------------------------------------------------*/ + +static ivas_error ivas_reverb_get_fastconv_hrtf_set_energies( + const HRTFS_FASTCONV_HANDLE hHrtfFastConv, + const AUDIO_CONFIG input_audio_config, + const int16_t use_brir, + const int32_t sampling_rate, + float *avg_pwr_left, + float *avg_pwr_right ) +{ + int16_t freq_idx; + const int16_t cldfb_freq_halfstep = MAX_SAMPLING_RATE / ( 4 * CLDFB_NO_CHANNELS_MAX ); + float avg_pwr_left_fft[FFT_SPECTRUM_SIZE]; + float avg_pwr_right_fft[FFT_SPECTRUM_SIZE]; + float input_fc[FFT_SPECTRUM_SIZE]; + float output_fc[CLDFB_NO_CHANNELS_MAX]; + ivas_error error; + + for ( freq_idx = 0; freq_idx < FFT_SPECTRUM_SIZE; freq_idx++ ) + { + input_fc[freq_idx] = freq_idx * ( 0.5f * sampling_rate / (float) ( FFT_SPECTRUM_SIZE - 1 ) ); + } + + for ( freq_idx = 0; freq_idx < CLDFB_NO_CHANNELS_MAX; freq_idx++ ) + { + output_fc[freq_idx] = (float) ( ( 2 * freq_idx + 1 ) * cldfb_freq_halfstep ); + } + + if ( ( error = ivas_reverb_get_cldfb_hrtf_set_properties( input_audio_config, hHrtfFastConv, use_brir, sampling_rate, avg_pwr_left_fft, avg_pwr_right_fft ) ) != IVAS_ERR_OK ) + { + return error; + } + + ivas_reverb_interpolate_acoustic_data( FFT_SPECTRUM_SIZE, input_fc, avg_pwr_left_fft, avg_pwr_right_fft, CLDFB_NO_CHANNELS_MAX, output_fc, avg_pwr_left, avg_pwr_right ); + + return IVAS_ERR_OK; +} diff --git a/lib_rend/ivas_rom_TdBinauralRenderer.c b/lib_rend/ivas_rom_TdBinauralRenderer.c new file mode 100644 index 0000000000000000000000000000000000000000..a84f26198087c8d9e0207f3669b2a17e540f2066 --- /dev/null +++ b/lib_rend/ivas_rom_TdBinauralRenderer.c @@ -0,0 +1,10162 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/* clang-format off */ + +#include +#include "options.h" +#include "cnst.h" +#include "ivas_cnst.h" +#include "wmc_auto.h" + +#define WMC_TOOL_SKIP + +/*------------------------------------------------------------------------- + * TD Binaural rendering related ROM tables + *------------------------------------------------------------------------*/ +/* TD renderer default HRIR model */ +const float defaultHRIR_rom_latency_s = 0.000020834f; +const int16_t defaultHRIR_rom_azimDim2[15] = { +1, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 1, + }; +const int16_t defaultHRIR_rom_azimDim3[15] = { +1, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 1, + }; +const int16_t defaultHRIR_rom_azim_start_idx[15] = { +0, 1, 37, 73, 109, 145, 181, 217, 253, 289, 325, 361, 397, 433, 469, + }; +const int16_t defaultHRIR_rom_azimSegSamples[1] = { +10, + }; +const int16_t defaultHRIR_rom_azimShapeIdx[15] = { +-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, + }; +const int16_t defaultHRIR_rom_azimShapeSampFactor[15] = { +-1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, + }; +const float defaultHRIR_rom_elevKSeq[13] = { +-90.000000f, -75.000000f, -60.000000f, -45.000000f, -30.000000f, -15.000000f, 0.000000f, 15.000000f, 30.000000f, 45.000000f, 60.000000f, 75.000000f, 90.000000f, + }; +const uint32_t defaultHRIR_rom_elevBsShape[36] = { +0x3f800000,0x3ed80000,0x3e000000,0x3c800000,0x00000000,0xaa000000,0x3efe0000,0x3f180000,0x3eea0000,0x3e800000,0x3dd80000,0x3d000000,0x3b800000,0x00000000,0x29800000,0x3da2aaab,0x3e855555,0x3eea0000,0x3f155555,0x3f13aaab,0x3ef00000,0x3ea0aaab,0x3e2aaaab,0x3d900000,0x3caaaaab,0x3b2aaaab,0x27800000,0xa9000000,0x3b2aaaab,0x3caaaaab,0x3d900000,0x3e2aaaab,0x3ea15555,0x3ef55555,0x3f1caaab,0x3f2aaaab, + }; +const uint32_t defaultHRIR_rom_azimBsShape[21] = { +0x3f2aaaab,0x3f283c13,0x3f21735f,0x3f17152a,0x3f09e60f,0x3ef55555,0x3ed44f30,0x3eb242e7,0x3e90b9af,0x3e627984,0x3e2aaaab,0x3df8d4fe,0x3daec33e,0x3d6a2798,0x3d1374bc,0x3caaaaab,0x3c2ec33e,0x3b9374bc,0x3aaec33e,0x392ec33e,0x26800000, + }; + +const uint32_t defaultHRIR_rom_AlphaL48[470 * 128] = { +0x3e0946b9,0x3cda8822,0x3e23be7e,0x3e005914,0x3e095697,0x3e097781,0x3e102edf,0x3e12d807,0x3e1514fc,0x3e103703,0x3e0d2242,0x3e09c889,0x3e06fde7,0x3e04b4aa,0x3e035ecf,0x3e0249b7,0x3e0116dd,0x3e008502,0x3dfcee82,0x3dee77e2,0x3e15b7f1,0x3cac1e96,0xbc8dd29b,0xbd855185,0x3d35c945, +0xbc7e4c57,0xbd71b7fd,0xbd7da762,0xbd708def,0xbd3a07f7,0xbd7775d0,0xbd84cf24,0xbd7d084a,0xbc7d5814,0x3d78b324,0xbd72376a,0xbcb689c0,0xbcfdaebc,0x3e0e19d2,0x3e20943f,0x3e1fe583,0x3e2947bb,0x3e3c07e7,0x3e44e230,0x3e463c59,0x3e3a7208,0x3e2f6146,0x3e2475af,0x3e1bd4da,0x3e1633a9, +0x3e133ee1,0x3e106f87,0x3e0c1905,0x3e0b9f00,0x3e012569,0x3e050f51,0x3dde26d5,0xbc98ab09,0x3d834bef,0x3d4939f5,0x3d482c36,0x3d024bd4,0x3d6a83d8,0x3d821e8e,0x3d5ffe00,0x3cfc008e,0x3d77236f,0x3db4ee33,0x3d725256,0x3d886c90,0x3d26351e,0x3d0dfd26,0x3dd12939,0x3d10ba99,0x3dfb2a54, +0x3e3c0ce1,0x3e2f51ad,0x3e44fe4f,0x3e69011e,0x3e79b6ef,0x3e7ead61,0x3e681c55,0x3e528b5b,0x3e40f8f0,0x3e30412a,0x3e249720,0x3e1dcd44,0x3e17ea8e,0x3e0fd84f,0x3e0f109b,0x3df28777,0x3e02c0b4,0x3d941cab,0x3c9744a7,0x3cca5b4f,0x3ce22b66,0x3cf48be2,0x3b4d71a5,0x3cf9cc26,0x3b0c5102, +0x3d4eaa69,0xbc0403b5,0x3d311412,0x3ac23951,0x3cb3c0cc,0x3ccb38e0,0x3cfb92af,0x3c93d8f7,0x3d7f8f7c,0x3c72d39b,0x3ded5248,0x3e4463f2,0x3e3ff357,0x3e62d998,0x3e8f6193,0x3e9d806c,0x3e9f53b2,0x3e8adbed,0x3e70a50a,0x3e519182,0x3e377037,0x3e2667dd,0x3e1fa360,0x3e16cc8d,0x3e0c2d51, +0x3e0a2b6d,0x3de66f30,0x3dde58c8,0x3d70162c,0xbb07b324,0x3d1414b5,0xbba99d41,0x3c4ee703,0x3c407aaa,0x3c276d4d,0x3b13ec74,0x3aa9efd9,0x3c842da9,0x3b67fb36,0x3c8e01d4,0x3caf384b,0x3cc65f88,0x3c80d055,0x3cd1b0dd,0x3d6e3909,0x3d1e88d8,0x3e3b7e9f,0x3e859bf1,0x3e845e0e,0x3e9054ff, +0x3e9c071e,0x3ea54fc5,0x3eab806d,0x3eafd995,0x3ea9a776,0x3e9043f5,0x3e8f8083,0x3e859164,0x3e6c06bd,0x3e61a722,0x3e4d2911,0x3e3d71ed,0x3e100329,0x3e0a0aa7,0x3d939c7c,0xbb3f7ec8,0x3d14f8f2,0x3c1803e4,0x3c2be363,0xba8c87fd,0x3b88daa6,0x3b896a84,0x3c2877b4,0x3c7eb38d,0x3c0cda38, +0x3c88cfe7,0x3c1ed653,0x3d0b27a0,0x3c77d604,0x3d22e336,0x3d232893,0x3c2f1521,0x3e05fe24,0x3e98e515,0x3e929a97,0x3ea92656,0x3eaf7533,0x3eb3d49c,0x3eaf7201,0x3eaa72cd,0x3e9fac44,0x3e8e29cb,0x3e8a9344,0x3e88ace1,0x3e8a023b,0x3e7fab71,0x3e66d64d,0x3e59166d,0x3e2346f1,0x3e1e064b, +0x3d9a28eb,0x3c578178,0x3cc91f53,0x3c6e1a29,0x3cff0a29,0x3cbb1fa3,0x3c0059e0,0x3c35024a,0x3beaa7aa,0x3badfe87,0x3be6234e,0x3be6fc25,0x3cd825e5,0x3c8d5d85,0x3d6ff9c1,0x3d299c60,0x3da384de,0x3c7211c4,0x3e377094,0x3ec6b742,0x3ec8168a,0x3ee46daa,0x3ecbb4e6,0x3ebf9ea3,0x3eb34e6f, +0x3ea103a7,0x3e9ef1f0,0x3eb12067,0x3ebd1031,0x3ebd5740,0x3eb33e38,0x3e9b32aa,0x3e810713,0x3e578f26,0x3e21b090,0x3e24cd99,0x3d915eb8,0x3d0d722b,0x3d3dbb02,0x3c3ba57d,0x3c981e6e,0x3c8fb4f6,0x3c12a8a4,0x3bf64dec,0x3c35e6bf,0x3c8b9e2d,0x3c71f25d,0x3c1d3070,0x3c1fb5cb,0xbc903225, +0x3d5ee57e,0xbc44f25b,0x3dac1d85,0x3cf5cfab,0x3e7331a2,0x3ed4fc1e,0x3ec4c1bf,0x3ec12eff,0x3eb23512,0x3eaf525b,0x3eacf6c1,0x3eaeb471,0x3eae336e,0x3ea7d160,0x3ea5c4bd,0x3e9e2c2b,0x3e8f8dbc,0x3e830124,0x3e626837,0x3e3f0491,0x3e16eae3,0x3e1833c8,0x3da9f3fa,0xbbaf6ed6,0x3d0b8932, +0x3ce328a5,0x3cbc8919,0x3c9dbba2,0x3c0d359a,0x3caac95e,0x3b54748e,0x3cf3671d,0x3c9e8b9c,0x3c2bcfc6,0x3d206de6,0x3c7aa108,0x3d8697a0,0x3c8ae026,0x3db121b4,0x3d69d389,0x3e83f418,0x3ebf156e,0x3eafe411,0x3eaea3a5,0x3e9bed38,0x3e9677de,0x3e9cef80,0x3e94c65e,0x3e9adc5d,0x3ea7fae1, +0x3e9beef9,0x3e8e7730,0x3e7fe772,0x3e4fa9ec,0x3e28b022,0x3e14d67c,0x3e069843,0x3e185a4a,0x3dd19059,0x3c2d00b2,0x3d7166d5,0x3c936306,0x3c8e2bd8,0x3cdb518e,0x3cb890e0,0x3c57b628,0x3cbec185,0xbb87e856,0x3c98c8dc,0x3ca1029b,0x3d01b554,0x3d0ac25d,0x3cec6ffe,0x3cee9662,0x3de0714b, +0xbce98d9b,0x3e386ba2,0x3e89976b,0x3e673a6c,0x3e6f214f,0x3e71a15a,0x3e787d1b,0x3e7d13bb,0x3e6d1806,0x3e5a3fe7,0x3e5034f0,0x3e51f7f9,0x3e52b48e,0x3e4b57cf,0x3e42203e,0x3e2fae72,0x3e1f084e,0x3e10a292,0x3e2546dc,0x3da7575c,0x3c294def,0x3d86f19a,0x3c782adc,0x3d01d717,0x3cf1d649, +0x3c938bb4,0x3c6bc881,0x3bcba418,0x3d52a9be,0x3cc05127,0x3cbcb7e2,0x3d1a8f39,0x3ce37cc0,0x3d3dbb68,0x3d3e6c4b,0x3db6f271,0x3d80d214,0x3e09ba98,0x3e4a6f1a,0x3e389dec,0x3e54bc22,0x3e580e4c,0x3e62ae15,0x3e69a887,0x3e64ca0d,0x3e61bb61,0x3e5bf1bb,0x3e478711,0x3e32c224,0x3e193fcc, +0x3e126f66,0x3e057835,0x3dff5c28,0x3de59ac4,0x3e1034bf,0x3dc5c23e,0x3ccb6aa7,0x3d095181,0x3d079c70,0x3d1797d8,0x3a05956d,0x3d0f6e2c,0xbb1d316c,0x3d8153be,0xbc996fc2,0x3d3c1a97,0xba7e8773,0x3cb1ff74,0x3cfafdaf,0x3cfd697b,0x3ca010df,0x3d9b0baf,0xbd4d18e7,0x3e0e0b77,0x3e21fbb1, +0x3e1d45cc,0x3e28e3d0,0x3e2c5a0d,0x3e344370,0x3e3c4bf2,0x3e328761,0x3e297970,0x3e21ab52,0x3e1728aa,0x3e0dcd07,0x3dfca553,0x3dfef351,0x3dfb69b7,0x3e000221,0x3df51e38,0x3e02457b,0x3de47ba7,0xbcc4c2d0,0x3d99f609,0x3d7b4357,0x3d7f3fa8,0x3d2d2500,0x3d9b73dc,0x3dae8405,0x3d902663, +0x3d283bdc,0x3da0f5b6,0x3ddbc642,0x3d8c91db,0x3da0113c,0x3d4b4723,0x3d33a63e,0x3de03105,0x3d07f470,0x3e411460,0x3e16fda3,0x3e20795b,0x3e222024,0x3e245bb9,0x3e263cc7,0x3e2a360f,0x3e248a4c,0x3e20f733,0x3e1cb846,0x3e19d303,0x3e1725c6,0x3e134281,0x3e150f22,0x3e14bc55,0x3e14f691, +0x3e148298,0x3e0edaa3,0x3e35c588,0x3cc6cd9e,0xbcbdbd12,0xbda839e2,0x3d5e05e9,0xbcac9200,0xbd9d2375,0xbda5f23d,0xbd9b9263,0xbd7150bf,0xbd9f86ce,0xbda60e9c,0xbd9ad7cb,0xbcae7828,0x3d905fb4,0xbd98cb6a,0xbcdf624f,0x3e2ff1bf,0x3ebd3ed6,0x3e85ff25,0x3ec77f67,0x3eb116d3,0x3ebbf09e, +0x3ebd2dd6,0x3ec53e20,0x3ec8461f,0x3ecb1ef5,0x3ec4b1aa,0x3ec0b91a,0x3ebc8f5b,0x3eb92678,0x3eb61bb0,0x3eb3c259,0x3eb1e212,0x3eb01796,0x3eae97cc,0x3eacab4e,0x3ea41213,0x3eb82be2,0x3e75924e,0x3e1b28ef,0xbcb0d470,0x3e8b9981,0x3e214663,0xbbdb5345,0xbbbfa6ca,0xbb03b651,0x3ca1cc97, +0x3bbdcea6,0x3ba9e7dd,0x3c4f1d3d,0x3e2847f3,0x3e9affa0,0x3aa701c8,0x3e20848a,0x3e06be5f,0x3ed2e518,0x3ed43395,0x3ee08ee1,0x3eeb0099,0x3f019a6e,0x3f066d86,0x3f073414,0x3efda472,0x3eef8f7d,0x3ee2b842,0x3ed82a6d,0x3ecfe965,0x3eca23ce,0x3ec4a6ef,0x3ebf161d,0x3ebbc1c0,0x3eb29787, +0x3eacbe4d,0x3ea68ea7,0x3de0cd86,0x3e73cb53,0x3e6ddf35,0x3e514c0d,0x3e3695e7,0x3e6d060c,0x3e740a6f,0x3e7967b6,0x3e4e9798,0x3e807dc3,0x3e8c1631,0x3e6c4d12,0x3e82eae6,0x3e59504e,0x3e619e63,0x3ea7a468,0x3e82344c,0x3ec3f0e7,0x3eec9c65,0x3ef8d4cc,0x3f091366,0x3f212e06,0x3f2a2b2c, +0x3f2d2dee,0x3f1dd82a,0x3f100df5,0x3f051872,0x3ef5d0ca,0x3ee63cc4,0x3eda3959,0x3ecf7ecb,0x3ec467c8,0x3ebe3603,0x3ea87efd,0x3ea332a5,0x3e732299,0x3e25710c,0x3e114bd5,0x3e197a72,0x3e140d1e,0x3db69c28,0x3e0fb222,0x3d9d2578,0x3e2d57c3,0x3da77e1d,0x3e1bd1f7,0x3dc8d666,0x3e10db41, +0x3e19f396,0x3e2e0a33,0x3e2e3926,0x3e864044,0x3e4da63d,0x3ec714be,0x3ef7e330,0x3f089ee4,0x3f1f46de,0x3f471ab4,0x3f56c34b,0x3f578e4d,0x3f3af3bf,0x3f22fdd2,0x3f10483a,0x3f010999,0x3ee975b3,0x3edadbae,0x3ecb824e,0x3ebc325b,0x3eb379c9,0x3e99b089,0x3e87696c,0x3e402558,0x3d8b8d93, +0x3ddfb8fa,0x3cf6f68f,0x3d6036d4,0x3d343a6c,0x3d121ae5,0x3ccc41aa,0x3c4c10e4,0x3d5921a9,0x3cfd1556,0x3d85245f,0x3da8136f,0x3dd8213c,0x3df2a1af,0x3e056df6,0x3e69127d,0x3ea19025,0x3f041af2,0x3f23f057,0x3f361f70,0x3f49ae8c,0x3f589a80,0x3f65d06d,0x3f723b41,0x3f780f45,0x3f6e7756, +0x3f494461,0x3f4670f9,0x3f3a9079,0x3f2b57ce,0x3f2002e2,0x3f122da7,0x3f058830,0x3ed90001,0x3ebb6a45,0x3e7fff7b,0x3dc6a0c3,0x3e02122b,0x3dac5c32,0x3d76a820,0x3d050cee,0x3ce809e8,0x3cf40558,0x3d243edb,0x3d7b1be9,0x3d5a323d,0x3da3941d,0x3daabcbd,0x3e0f0828,0x3e0f4162,0x3e44b507, +0x3e8375c3,0x3e83310d,0x3efb4175,0x3f45f009,0x3f54e6a7,0x3f6de6a0,0x3f7a2d01,0x3f812032,0x3f80d156,0x3f80564a,0x3f73dfd4,0x3f5bb2ca,0x3f567cc9,0x3f4e7093,0x3f475c4c,0x3f33bfa5,0x3f1fd5d0,0x3f113008,0x3ee9d4fb,0x3ed2f1e6,0x3e8c5947,0x3e1ffbad,0x3e0ee18c,0x3ddf89c7,0x3de1bd54, +0x3db01182,0x3d518021,0x3d4e849f,0x3d38b970,0x3d241008,0x3d69fea8,0x3d65c388,0x3deba8b1,0x3dea4a6f,0x3e652c85,0x3e61e9fc,0x3ea84c23,0x3e9851fa,0x3f249648,0x3f74e05c,0x3f8107f3,0x3f877478,0x3f7fcce3,0x3f75ad5b,0x3f72c2b1,0x3f68c6c1,0x3f6c4bda,0x3f7be416,0x3f7b3f6e,0x3f701124, +0x3f5d1af4,0x3f4033cb,0x3f24cb44,0x3f0fd824,0x3ee41a64,0x3ecf0590,0x3e855b03,0x3e4cb6a1,0x3e36976c,0x3dfe98b4,0x3de31de7,0x3dbb5649,0x3d8b2ee5,0x3d57647e,0x3d80b827,0x3dbbc9a3,0x3d880978,0x3d8af7ca,0x3da3de6a,0x3d83c6ce,0x3e619ee3,0x3e29208f,0x3eab2137,0x3ebef261,0x3f3dd1b8, +0x3f6d5cd4,0x3f6e4061,0x3f5952dc,0x3f614892,0x3f6d3ed1,0x3f7b0388,0x3f7b6940,0x3f77f19f,0x3f69843d,0x3f64c634,0x3f589ea0,0x3f43d957,0x3f3243ce,0x3f1abac3,0x3efdfee9,0x3ed123ea,0x3ebf2f36,0x3e9652b6,0x3e025b1f,0x3e3c35e0,0x3e268af5,0x3dfe9a9d,0x3ddde630,0x3d959faf,0x3da8f647, +0x3d7035fc,0x3e23c541,0x3dcd9e4b,0x3d9f6ee9,0x3e14d760,0x3dcfd283,0x3e75c01b,0x3e323130,0x3ea45b82,0x3ed36dd3,0x3f3a6d59,0x3f624d75,0x3f669800,0x3f616e88,0x3f5bd732,0x3f59fa97,0x3f6636f9,0x3f5add3a,0x3f5de807,0x3f64ff72,0x3f552c8d,0x3f4279f5,0x3f2f2b12,0x3f10c7f3,0x3ef4066c, +0x3ed588be,0x3ed3c7b0,0x3ed9699e,0x3ebc3f51,0x3e2a05bd,0x3e777ba3,0x3e0aaaab,0x3dface53,0x3e146853,0x3de73663,0x3da32009,0x3dde083d,0x3d6d9bec,0x3de8f612,0x3e016a33,0x3e308a43,0x3e403346,0x3e3efba1,0x3e534426,0x3ee76b83,0x3e7ea3e4,0x3f194052,0x3f385744,0x3f306a9b,0x3f3166b5, +0x3f3aae95,0x3f3f7c01,0x3f424a08,0x3f3d02c9,0x3f33b5d5,0x3f2bd395,0x3f25268d,0x3f1d894c,0x3f12cc9a,0x3f07d581,0x3ef6930f,0x3ee1319c,0x3edf2b38,0x3eefc916,0x3ea4eff3,0x3e46bad4,0x3e8dc1f7,0x3e3b8a50,0x3e420b02,0x3e176987,0x3dd7db6c,0x3dcf8fbd,0x3d9e2e37,0x3e455924,0x3e051fd3, +0x3e0b86bf,0x3e3895ab,0x3e2f689a,0x3e76d331,0x3e80591a,0x3ec77077,0x3eaf91fe,0x3ef883cd,0x3f15d7f1,0x3f15ac61,0x3f236cbe,0x3f28634d,0x3f2e4887,0x3f336da8,0x3f2e624f,0x3f2a414e,0x3f2507c4,0x3f187cc1,0x3f0be05c,0x3ef88e81,0x3eeee0f1,0x3edf8bf3,0x3ed2c33f,0x3ec5cb11,0x3ed8e7f3, +0x3eb58baa,0x3e652aa1,0x3e56d3e2,0x3e4b4280,0x3e48898c,0x3dd4562d,0x3e406268,0x3daa265d,0x3e789e3e,0x3da838d2,0x3e44e16f,0x3dd6644c,0x3e17fde1,0x3e414260,0x3e57ee3a,0x3e5bdffb,0x3eacf368,0x3dc2c6c6,0x3ef9c8bb,0x3efcc186,0x3f004aee,0x3f054759,0x3f0861fc,0x3f0cc7c1,0x3f126786, +0x3f0c8cf1,0x3f07cede,0x3f036331,0x3efaca81,0x3eefd44d,0x3edefc6b,0x3edcad26,0x3ed828cf,0x3ed6a31d,0x3ed1dee1,0x3ed1444a,0x3eccc8f3,0x3ddbbc41,0x3ea21b50,0x3ea2040d,0x3e955b03,0x3e82bb9d,0x3eaba057,0x3eb40899,0x3eb2861b,0x3e8de245,0x3eb6f61d,0x3ec37471,0x3e9b3dc2,0x3eabcdb3, +0x3e8c3964,0x3e915348,0x3ed34173,0x3eaaaef8,0x3f093a59,0x3eed411b,0x3ef98507,0x3efa4410,0x3efda0a1,0x3effc06c,0x3f022ae8,0x3efdbdb2,0x3ef98a14,0x3ef49ce0,0x3ef14891,0x3eee21ae,0x3eea0656,0x3eeb400a,0x3eeacebb,0x3eea1206,0x3ee9d7fc,0x3ee123a1,0x3f01cddb,0x3e9e31a3,0x3e3d0aa3, +0xbd68f5cd,0x3ebb6283,0x3e481509,0xbd0bcc24,0xbd1b115c,0xbd035494,0x3b53bb83,0xbcc99b99,0xbcbd8c33,0xbc2c35b3,0x3e4a99e7,0x3ecd598d,0xbcefc292,0x3e3aadf3,0x3f082c89,0x3e55be8d,0x3eae2fb6,0x3e13efa3,0x3e4bd768,0x3e49c352,0x3e53db90,0x3e532908,0x3e536bdb,0x3e536011,0x3e51f137, +0x3e5108c0,0x3e50ce85,0x3e4f11a3,0x3e4c6782,0x3e474ee5,0x3e4381d8,0x3e404ac5,0x3e3d15a6,0x3e3b8f90,0x3e3ec61e,0x3e13435a,0x3ea79e5d,0x3ec02edb,0x3ec21f59,0x3e93dfc3,0x3ebc7bf8,0x3ebdba2b,0x3ec1eb9b,0x3ec0202d,0x3eb8623e,0x3ec58aee,0x3eca56d0,0x3ec97303,0x3ebffffb,0x3e8cf710, +0x3ec87e6f,0x3ecd7a72,0x3edebed0,0x3e716207,0x3e5b3b5c,0x3e796a4e,0x3e836eb2,0x3e85572c,0x3e85a47b,0x3e844e92,0x3e812c88,0x3e7fc3b8,0x3e80883d,0x3e7d369a,0x3e732ca3,0x3e635f14,0x3e563887,0x3e4e0258,0x3e446ddf,0x3e459a03,0x3e30e64c,0x3e4db36e,0x3eaf94a0,0x3e69e24b,0x3e7ed26b, +0x3e6dbf3c,0x3e79b5e0,0x3e5c7e2d,0x3e4fd785,0x3e64f15a,0x3e839a34,0x3e5c946a,0x3e36ed83,0x3e6987fa,0x3e6f4cd2,0x3e8f4a9b,0x3e997888,0x3e6ab2ec,0x3ead1e1a,0x3e875fbc,0x3e4b6b86,0x3e8da3eb,0x3e9c0548,0x3ea11091,0x3ea05a1d,0x3e9e2f27,0x3e9be936,0x3e9a683d,0x3e98bc1b,0x3e945927, +0x3e8ccc59,0x3e7cc492,0x3e655715,0x3e532393,0x3e3f9c1e,0x3e3e9d75,0x3e15e2f2,0x3e4946e5,0x3e79a868,0x3e5077a1,0x3e49b60e,0x3e30ea83,0x3e3c972b,0x3e1c8e32,0x3e329cfe,0x3e010499,0x3e4d5b5e,0x3e09974c,0x3e4a3abf,0x3e43a9a5,0x3e593b03,0x3e67cd83,0x3e89afde,0x3e83b20a,0x3eaff798, +0x3e980c08,0x3e62e4df,0x3e9c385e,0x3eb4bde8,0x3ebe6053,0x3ebe0a77,0x3eb5b170,0x3ead837e,0x3ea96692,0x3ea9cecc,0x3ea52136,0x3e962f2b,0x3e7c54f6,0x3e58e900,0x3e3e8a96,0x3e23826f,0x3e18331b,0x3df33888,0x3e181f3d,0x3e2c8091,0x3dd26139,0x3dddfe92,0x3d95840d,0x3d595bc0,0x3d26bf1c, +0x3d3459a1,0x3d24e120,0x3d25b6f1,0x3d6849e6,0x3d801c35,0x3dbb6793,0x3e0401be,0x3e3935ab,0x3e3c23b2,0x3e57a5b4,0x3ed16a2f,0x3e5c721e,0x3e51f9ce,0x3eac6b89,0x3ed3937d,0x3ed16423,0x3edd7cb8,0x3eeddbca,0x3f00f7fd,0x3f0277d9,0x3efc087e,0x3ee88f78,0x3edf692c,0x3ee5b015,0x3ec3c666, +0x3eb0c575,0x3ea13417,0x3e9a1242,0x3e68e85b,0x3e640d17,0x3e6dcf1a,0x3e12cc97,0x3e084db3,0x3dc31f94,0x3da856a8,0x3d654c1f,0x3d645321,0x3d60ad33,0x3d90661b,0x3d957bd2,0x3db59ecd,0x3e029ab1,0x3e05e38f,0x3e508cbf,0x3e5de8a5,0x3ea3073e,0x3f075805,0x3edf8cf8,0x3e8519be,0x3ecae8ce, +0x3ee20cb7,0x3efa3fe1,0x3f087625,0x3f0fe399,0x3f21692a,0x3f2316dc,0x3f1d5177,0x3f156e3f,0x3f032d99,0x3ed2c568,0x3eaeb4b4,0x3e950643,0x3e7a9b9e,0x3e88e70c,0x3e6a84d3,0x3e88e167,0x3e94ce39,0x3e584edd,0x3e33547c,0x3dd014d1,0x3d9c68dd,0x3d94095c,0x3d7510c7,0x3d8dd7c5,0x3da5d09c, +0x3dbc698a,0x3de157ca,0x3e16793a,0x3e49c2a0,0x3e5fa00b,0x3e9fe52b,0x3eb3717c,0x3f1409f1,0x3ef799b4,0x3e476ed5,0x3e84f22a,0x3e3cdd8c,0x3ea673a0,0x3ec7cdea,0x3eebbd2e,0x3f127624,0x3f19eb1e,0x3f0140ee,0x3eb07b43,0x3e68e60c,0x3e23d266,0x3e1e5f39,0x3e324300,0x3e553817,0x3e5c9fcf, +0x3e1f8a64,0x3e7987d2,0x3e87203c,0x3e531542,0x3e721d19,0x3e291f8e,0x3e0c7351,0x3e06c74c,0x3de7e9dd,0x3de9ae6f,0x3e24d1d9,0x3ddb2473,0x3e00b7bc,0x3e20ee88,0x3e8369c7,0x3e82f7b2,0x3edca560,0x3eb1fa46,0x3f192623,0x3eb87f45,0x3d9007e5,0x3e62b967,0x3e7d428a,0x3ec52732,0x3ef71141, +0x3f17c5e5,0x3f0e23ce,0x3efc0f6c,0x3ecf60d1,0x3eb64728,0x3ea02631,0x3e8e45ad,0x3e85e81f,0x3e7824a2,0x3e470f2c,0x3e47e88e,0x3e1f1bd0,0x3e803303,0x3ea64085,0x3e84d8e7,0x3e787a16,0x3e454a59,0x3e27e3f3,0x3e0b6aff,0x3dc70a83,0x3e046723,0x3e862f15,0x3e1b28ea,0x3e08d693,0x3e0d66fe, +0x3e475638,0x3e5c5430,0x3ea923ea,0x3eb30c44,0x3f0a005b,0x3e99edd6,0x3e5e85f6,0x3ec4c0c5,0x3ed18569,0x3f0bac7b,0x3f18641d,0x3f1966a4,0x3f0f6954,0x3ef8a9d8,0x3ec1e3c8,0x3eab5e60,0x3e98ac77,0x3e8dc005,0x3e85115e,0x3e851de0,0x3e75e2f7,0x3e9706f2,0x3e8c1466,0x3eab5b4f,0x3eba5f6a, +0x3e951475,0x3e85f70d,0x3e711032,0x3e5e0540,0x3e336125,0x3e13323a,0x3e205bc6,0x3e4cd5c7,0x3e410249,0x3e524d4b,0x3e6a03ad,0x3e7e2ef6,0x3e8cdc25,0x3eaefe8f,0x3eaf6ff6,0x3f2c93a4,0x3eded8e6,0x3ec107e2,0x3f01eef4,0x3f083e04,0x3f18d992,0x3f1ba624,0x3f161cca,0x3f17d5c4,0x3f16b584, +0x3f0ec35d,0x3ef01b73,0x3ec666f5,0x3ea84b1f,0x3e8fbe9b,0x3e88b632,0x3e8a6029,0x3eaca6b4,0x3ea705a5,0x3ec10a2f,0x3ed39aec,0x3ea7ceaf,0x3eb0c8d1,0x3e8c7dca,0x3e5f5e0b,0x3e3f3ac7,0x3e3dc32d,0x3e404610,0x3e5d4c4d,0x3e608dc7,0x3e67eb53,0x3e6be66d,0x3e8e6f2d,0x3ea3428e,0x3eb8a5b3, +0x3ed3fdcd,0x3ef6f2d6,0x3ef9a3d6,0x3ee95a78,0x3f052e94,0x3f086451,0x3f07cd7f,0x3f052c2f,0x3f054454,0x3efab8b9,0x3eea2cd3,0x3edbe110,0x3ed99509,0x3ed73824,0x3ed2db1e,0x3ed135fa,0x3ed1224c,0x3ec855a3,0x3ec3a1b4,0x3eab9cb8,0x3ebb4a32,0x3ece96ef,0x3eb733ca,0x3ea9b41a,0x3e9cbe46, +0x3e957881,0x3e909a19,0x3e8aaf0a,0x3e85f9b9,0x3e99e1a9,0x3e80933f,0x3e92721a,0x3e87c778,0x3ea22da3,0x3eb6c48b,0x3ed59bcb,0x3edbc045,0x3f0df794,0x3eed564f,0x3edb988b,0x3ee69c23,0x3ee5fe78,0x3eeba8d9,0x3eef58b5,0x3ef562fc,0x3ef54470,0x3ef8433e,0x3ef900c9,0x3efa3a34,0x3efa7a1b, +0x3efdd6bc,0x3ef37e13,0x3eea2766,0x3ee08506,0x3edcaa78,0x3ecf2e81,0x3ed4cf85,0x3ee66b9a,0x3ec995c3,0x3ed63097,0x3ecb8902,0x3eca9bda,0x3ebf90be,0x3ebbac48,0x3ece8c1f,0x3ed6c98a,0x3ecb5caf,0x3eb7d719,0x3ec52a16,0x3ece17b3,0x3edf40f6,0x3eec25fd,0x3edebdb5,0x3f074ac6,0x3eb6fde1, +0x3ec9108c,0x3ec97bb1,0x3ec8e6cf,0x3ecad631,0x3ecb9155,0x3eccaa62,0x3ecce45b,0x3ecd37b5,0x3ecdc832,0x3ecdc40c,0x3ecda29d,0x3eceef90,0x3ecb6191,0x3ec9f087,0x3ec72064,0x3ec548a0,0x3ec22b59,0x3eb244cf,0x3f0484b9,0x3f0b5159,0x3ef1a06d,0x3ef7e839,0x3f09d38f,0x3ef5d334,0x3efa881d, +0x3ef62840,0x3ef0c3e0,0x3efb6fb0,0x3eff8d0f,0x3efd3791,0x3f0b8c5d,0x3ef87a0d,0x3efa945e,0x3f0fbd4b,0x3ed73653,0xbdb201ad,0xbc6b6a38,0xbe0655e8,0xbda28409,0xbdce0857,0xbdc6a3c8,0xbde15728,0xbdeb1b8a,0xbdfe149c,0xbdde943f,0xbdce1386,0xbdbc3f97,0xbdb4cf37,0xbdaf51be,0xbdaeca35, +0xbdb13388,0xbdb0e4fd,0xbdaf2df0,0xbda96bc5,0xbd83d454,0xbddcd621,0x3b7f1057,0x3de339bf,0x3eb366a2,0xbd322b83,0x3dc11e80,0x3ea4f518,0x3ea2ebe5,0x3e9ffd45,0x3e95506d,0x3e99b85f,0x3e9a738c,0x3e96e79d,0x3db7530f,0xbd994030,0x3ea8cc5a,0x3de20d2b,0x3e3f00d2,0xbdff1145,0xbde46434, +0xbe07e255,0xbe107136,0xbe39f159,0xbe498ea7,0xbe564dae,0xbe292c7b,0xbe0a08a5,0xbddd3cfb,0xbdc07159,0xbdb369dd,0xbdb92f00,0xbdc3b270,0xbdc35420,0xbdbf82d3,0xbda2bdbb,0xbd86287b,0xbd882e4a,0x3e2f7883,0x3c8ced72,0x3b105ac0,0x3d19ab5c,0x3d70afd7,0xbc7dac7b,0xbc9ec368,0xbd043276, +0x3c7e0a99,0xbd2709d1,0xbd675af0,0x3b9aeca6,0xbc6a4a42,0x3d467fdf,0x3d21742a,0xbd84b009,0x3c84ebab,0xbd8783d4,0xbe080f0a,0xbe0e5024,0xbe2a4aff,0xbe83fa5a,0xbe934c21,0xbea47363,0xbe6e7f60,0xbe2b5cbd,0xbdfbcd3f,0xbdc899a3,0xbdb76cba,0xbdc0ee14,0xbdd4f7e4,0xbdd617b9,0xbdd01359, +0xbd873041,0xbd6246a0,0x3c4be932,0x3d870cd6,0x3da505ca,0x3d61adef,0x3d37300c,0x3db5279b,0x3cd9b207,0x3dc3c691,0x3ac12c61,0x3daee4af,0x3c5ecd69,0x3d88f95e,0x3d147db7,0x3d591e3e,0x3d550a4e,0x3d65cf85,0xbc939b06,0x3dabb828,0xbd24ad70,0xbde49be4,0xbe19dedb,0xbe5d38a8,0xbebf45a4, +0xbedce835,0xbeed5324,0xbe991e0a,0xbe38c3a2,0xbdcdf056,0xbd83e457,0xbd406b4f,0xbd8a2cd9,0xbdb660e4,0xbdbd4f75,0xbdba260e,0xbd518c88,0xbc6877d7,0x3d17b64d,0x3de4f26f,0x3d816e99,0x3dcd4b48,0x3d68f7ea,0x3d3d5289,0x3d2a2745,0x3d29683c,0x3d567c00,0x3cdbb79e,0x3d1d6e0b,0x3cb9efe9, +0x3d0cfeb5,0x3d4b8cb7,0x3d6abc43,0x3d868a93,0x3b64a2bb,0xbd3b8a74,0xbe6e5786,0xbe884715,0xbe97c166,0xbea703f1,0xbebad87f,0xbecc42e9,0xbeeb20d7,0xbeeea2dc,0xbed3c55b,0xbe4124b7,0xbe800afd,0xbe8028b7,0xbe62fda8,0xbe713635,0xbe621bfe,0xbe448939,0xbdd31e79,0xbd7e716b,0x3ca0816b, +0x3e11f253,0x3daada6e,0x3d90c930,0x3d8478fc,0x3d859044,0x3d57bf58,0x3d615c18,0x3d39cde7,0x3cfda942,0x3ca86fd5,0x3c1a55f4,0x3cf4bbee,0x3a3f7f74,0x3ce315cf,0x3c430b1f,0xbb9f16fb,0x3e37ddb6,0xbdd6067d,0xbef3232c,0xbefe6b69,0xbef270e0,0xbeeae5fb,0xbeeddeae,0xbf0010ea,0xbef5845f, +0xbee15a59,0xbeb18983,0xbeca77ba,0xbedbfdde,0xbef09b88,0xbed2a260,0xbeabddb2,0xbe8bfd3f,0xbe042d5c,0xbda45369,0x3cfc5823,0x3df7ab2e,0x3db357ed,0x3d8185e9,0x3cb0d6de,0x3c29a5fd,0x3cc83eab,0x3cac1c4b,0x3d2623dc,0x3dac8db7,0x3d82bdba,0x3dbaae33,0x3db3aa09,0x3de559fc,0x3d11ded3, +0x3dde58a1,0x3cf34f2d,0x3dfdf6f2,0xbe93c025,0xbf179aaf,0xbf0cf00d,0xbee52f69,0xbea15972,0xbe74a4cf,0xbe9edda2,0xbe8ca11b,0xbebcae65,0xbf12e72d,0xbf2c4a1f,0xbf3083b1,0xbf232a57,0xbf072a87,0xbed83771,0xbeadaf70,0xbe4797a5,0xbe05130d,0x3cb602be,0x3d74e24f,0x3d9e7e2f,0x3df2c710, +0x3d932755,0x3d9846d7,0x3dd51195,0x3df4d22c,0x3de327ec,0x3e12b33a,0x3db12a3a,0x3db64562,0x3dd5a504,0x3e3315fa,0x3d2cdc04,0x3e1db7f5,0x3c882437,0x3ccb8aeb,0xbeb56cd5,0xbece1438,0xbe8eb240,0x3dc6cabc,0xbd5c5510,0xbe394a1d,0xbea6b271,0xbec22683,0xbeeb3386,0xbefa2111,0xbf0e1324, +0xbf10df60,0xbf02d044,0xbee76535,0xbeb5adaf,0xbe72cccb,0xbe10f70d,0xbdc4bc27,0xbc50222c,0x3e3560f2,0x3dd9e231,0x3ddd657a,0x3ddcbcad,0x3db0b3e2,0x3dc75ff9,0x3d3c6de7,0x3dcef1e5,0x3e463d69,0x3dcb5133,0x3db87489,0x3d61fd2b,0x3e0769c7,0x3cf4b1db,0x3e1c4d21,0x3d93a3da,0xbd15fb1b, +0xbeafe957,0xbea50a97,0xbe857b4a,0xbe1bedde,0xbdd2516e,0xbdc8d978,0xbe7cbfc0,0xbe8cb2a3,0xbec474b6,0xbef85efb,0xbef6863a,0xbee15511,0xbec38b28,0xbe87ac64,0xbe34d49c,0xbdfd8caf,0xbde774ff,0xbde0e4c5,0xbcb22ef9,0x3e58b32e,0x3dbd259b,0x3e2c7c24,0x3e23d9e2,0x3dd2bf9b,0x3decd779, +0x3df0a228,0x3ddcffe1,0x3e59d2dc,0x3df38f69,0x3dd4b6c5,0x3d5f7b06,0x3d8308c2,0x3dc541a0,0x3e001930,0xbe0fa4a8,0x3e660ff6,0xbe1c4805,0xbe5fb183,0xbde2e96b,0xbd0ad986,0xbd5232c1,0xbda51642,0xbe1b36db,0xbe409539,0xbe482cf3,0xbe4dcb70,0xbe6eeff9,0xbe71bec8,0xbe53663c,0xbe319b90, +0xbdfeaf54,0xbdac2981,0xbd56ee39,0xbdd1ee17,0x3d7ac9ad,0x3e5cfc82,0x3d89935b,0x3e198077,0x3dccce98,0x3df7d0d4,0x3e14cc89,0x3e157d80,0x3e381f29,0x3d9765ba,0x3e1d43f0,0x3e10b583,0x3d97c802,0x3dfca1d2,0x3d97e39a,0x3de71724,0xbbfc6c3e,0x3e2ca47e,0x3c929c7c,0xbd85b6fc,0xbc49955e, +0xbcccd0d2,0xbda5c928,0xbe00cea0,0xbe1f6c55,0xbe25465d,0xbe2daa91,0xbe3132fd,0xbe018e98,0xbdad3791,0xbd04cdd8,0xbc78e0a9,0x3c8d1086,0x3d278598,0x3d377daf,0xbcf23e84,0x3d09bf01,0x3e34b4ba,0x3e307cc7,0x3e279d3e,0x3e18a291,0x3e79aa4f,0x3e024dc4,0x3e7f648f,0x3d676922,0x3e73878e, +0x3dec695c,0x3e6dc126,0x3e38582d,0x3e3b35ab,0x3e40b359,0x3e6c72d1,0x3e00675b,0x3ef7cec3,0xbce27399,0xbcb34ad7,0xbca22ce8,0xbceb2081,0xbcccd3f6,0xbcd685a7,0xbd0e542e,0xbc491455,0x3c0b9cab,0x3ccd5d41,0x3d5296d5,0x3d99e200,0x3dec134a,0x3dd00941,0x3dbbafc0,0x3d9e49fb,0x3d8d67fb, +0x3d555f19,0x3d352321,0x3ed2c893,0x3dea5de7,0x3dc596d4,0x3df5b274,0x3e156d30,0x3c88f8d7,0x3bca204e,0x3c6b92e2,0x3de4eb45,0x3c829ce3,0xbc7c902c,0x3db81761,0x3d95cbc6,0x3e3877d2,0x3e3a8456,0x3ceaa69b,0x3e029994,0xbe187fcb,0xbd3806a0,0xbd93150e,0xbd90344d,0xbd92e86f,0xbd92fde9, +0xbd97ecdb,0xbd76a8cb,0xbd4a10bf,0xbd1648d7,0xbcf1a826,0xbcbcbf98,0xbc3c9939,0xbcce0896,0xbd00982c,0xbd1b21ce,0xbd3311f3,0xbcea752f,0xbe00cbca,0x3e0fac00,0x3e9d8a3b,0x3f235652,0x3d2b01a1,0x3e8cff24,0x3f170dec,0x3f18db13,0x3f169afc,0x3f0bc843,0x3f14871d,0x3f15187e,0x3f1082ee, +0x3e90a105,0x3bc6fd74,0x3f1ef3c7,0x3ea91212,0xbdc27cf0,0x3d898d54,0xbd24f180,0x3de8cfcc,0x3d7ff2d6,0x3d8aaa46,0x3d62b19d,0x3d838e2d,0x3d857bce,0x3d778215,0x3d72d977,0x3d694cc6,0x3d60b372,0x3d5c03b6,0x3d5dbc90,0x3d702527,0x3d70cfb0,0x3d7a36a1,0x3d831374,0x3d8bbc26,0x3d82f1cb, +0x3dcc68ff,0xbd14b0e2,0xbdcb4514,0xbe0d6d0d,0xbc0b2b9b,0xbdc46bef,0xbe0994a5,0xbe0ee024,0xbe0d93b3,0xbdfb770b,0xbe1735ff,0xbe1db7e5,0xbe199807,0xbdcbe99b,0x3c02a60d,0xbe19564f,0xbdf7a34f,0xbe0fbcd6,0x3da60fd6,0x3db0f135,0x3d8da830,0x3d51b373,0x3d853211,0x3d80accf,0x3d5395f9, +0x3d6c3782,0x3d651ff1,0x3d513d2b,0x3d3fd30d,0x3d5006df,0x3d8384ab,0x3d85a35d,0x3d8fa594,0x3da0f717,0x3dabdc43,0x3dc61a20,0x3d9e5313,0xbd8b41c9,0x3cfa3586,0x3c23a8a7,0x3c338a62,0xbace12dd,0x3cb1e71c,0x3d150a7a,0x3cd851af,0xbbac1dcc,0x3cf0a693,0x3d5bcb6a,0x3c6cdf88,0x3c94bc59, +0xbcb90f23,0xbcfb150c,0x3d5abbeb,0xbc74ca0f,0x3dbbf53f,0x3e1cc0cb,0x3db35eb7,0x3d31e90c,0x3d7a3900,0x3d82fcc9,0x3d147bee,0x3d26b04c,0x3d06e06d,0x3cfb55df,0x3cc1f295,0x3cb8f1b6,0x3d352948,0x3d319d91,0x3d63aa13,0x3d975443,0x3daff8b0,0x3df14128,0x3d910fa1,0x3c85dc0a,0x3d0ada37, +0x3ca7c9bf,0x3d10d3f3,0x3c496a1c,0x3d02c98a,0x3c429f99,0x3d88d81b,0x39b383f0,0x3d30f83d,0xbc83d5ef,0x3bbf325f,0x391bb097,0x3c0afecd,0xbcb987e4,0x3ce00b8b,0xbc3787d6,0x3dd8039d,0x3e3535dd,0x3de19f01,0x3d0bd09d,0x3d1098eb,0x3ccef337,0x3ac637c1,0x3d2bdb38,0x3d73f364,0x3d682faf, +0x3d402003,0x3d67ce6c,0x3db8a455,0x3dac8237,0x3dbf6655,0x3ded0390,0x3e09acb8,0x3e1a215e,0x3de954d3,0x3d524bf0,0x3d9b3d97,0x3d3e7c2c,0x3d7431b7,0x3d75b2d2,0x3d55595a,0x3d440033,0x3d2b0405,0x3d83b564,0x3d0e1dc2,0x3d37483b,0x3d27b67b,0x3d0a29b5,0x3c3078f9,0x3cc5c33c,0x3daba852, +0xbc83ae93,0x3e94b1e9,0x3ea8f31a,0x3e4a14aa,0x3e02faa6,0x3e4187bb,0x3e269c51,0x3db8d312,0xbdb7c00c,0xbe4438aa,0xbe4bb9eb,0xbe559184,0xbe652283,0xbe88088a,0xbe534419,0xbe1d9869,0xbdd8dd76,0xbd4e6944,0x3ccdd94d,0x3d229c65,0x3ccfa127,0x3d85e8c4,0x3d61f3d8,0x3d365546,0x3d004fa1, +0x3d19f267,0x3d440873,0x3d483da4,0x3d130991,0x3cb95359,0x3cfc14a3,0x3cd599bc,0x3db3092f,0x3d48e40e,0x3d9a482e,0x3d18b2ca,0xbe28d948,0x3cbcd5d1,0x3ea43e6d,0x3e5a3110,0x3e731bef,0x3e2ddd2d,0x3d86e905,0xbcd3a035,0xbe6db6f9,0xbea08203,0xbea87a9d,0xbeafae0d,0xbe905829,0xbe2239b3, +0xbd7756cd,0x3c58ad49,0x3d8c5fe9,0x3d92537e,0x3dcb2f9f,0x3d4c6f3b,0xbcd53e40,0x3b894976,0x3b1d602e,0x3d3a7af6,0x3d3323ea,0x3c62d560,0x3ce713a6,0x3d180090,0x3da2b191,0x3d87a989,0x3d889674,0x3da4a62d,0x3d16c9e4,0x3d99e7c1,0x3c53218c,0x3d04f87f,0xbe3d96af,0x3d6ef36b,0x3f1143a6, +0x3f0ab8e1,0x3f24578e,0x3ef6af48,0x3ecabb83,0x3e64822a,0xbc9363ba,0xbe2e2a48,0xbe245957,0xbabc3c04,0x3def877f,0x3e4487c4,0x3e47e34c,0x3e36f439,0x3e0ced89,0x3e218b1c,0x3e62f521,0x3dd0b1cf,0x3d2bf277,0x3d8d5c08,0x3ad11348,0x3d08ae0e,0x3d0fa5f2,0x3d29be4b,0x3d9b4952,0x3dad7247, +0x3dea04b4,0x3d8bcb0b,0x3d40df7c,0x3d32c99d,0xbd27d860,0x3c68f164,0xbe21cd52,0x3d3cd773,0xbdd40430,0x3eaad2bb,0x3f27a8db,0x3f09770b,0x3f198e7e,0x3ecc9f6d,0x3e61ef75,0xbca0fbe7,0x3b6572e8,0x3d13e603,0x3dc528dd,0x3de657c0,0x3df39b94,0x3e004e44,0x3dcc56b1,0x3de0f356,0x3e3d98b3, +0x3e3c8768,0x3e5ebe92,0x3dc66262,0xbc174864,0x3d5c4a9b,0x3d26fd41,0x3d59127f,0x3d4a349e,0x3d7e86a8,0x3d3fbc24,0x3d775441,0x3e00c4c3,0x3da41d0f,0x3d93e2e5,0x3de63ae9,0x3d624058,0x3dd9e9dc,0x3c0e8865,0x3d93c604,0xbd26e2f9,0x3e628927,0x3ea050b5,0x3e3417cf,0x3e40cfbf,0x3c7fc1b9, +0xbdb15749,0xbe31b28f,0xbe31b481,0xbdde3b3d,0x3d45e33f,0x3dd7a6e2,0x3e170585,0x3e1ea9fb,0x3e3a6af5,0x3e303301,0x3e33bdf6,0x3d7c729a,0x3d3fa80e,0xbc335105,0xbd154d3e,0x3b0d2abf,0x3c8e5195,0x3ca845b8,0x3c4850d4,0x3d4729b0,0x3da636d9,0x3da658c6,0x3dbb9526,0x3d543ddc,0x3d117990, +0x3c4921b8,0x3d54aa8c,0x3d8c511a,0x3cef6f1f,0x3e0c86ab,0xbe81fb04,0xbc5516f9,0xbb29d9ea,0xbdb332a1,0xbdb00e1e,0xbe1d0047,0xbe3edde4,0xbe4d04c3,0xbe551b55,0xbe5c2bab,0xbe3b9744,0xbdaca03b,0x3cba755e,0x3dcefca6,0x3e2a1379,0x3e32051f,0x3e0cbf19,0x3c8d606d,0xbcd58208,0xbda36947, +0xbd8c1526,0xbcf2ee57,0xbd43f366,0x3bbe6157,0x3d3f6ec1,0x3d93425b,0x3d9ef51d,0x3da0568f,0x3c0133ed,0x3d33c5fd,0x3d21199b,0x3d0ca816,0xbc4c932e,0xbd0cd84d,0xbd04c3eb,0xbd701f97,0xbd40ecd0,0xbe05acd8,0xbe034764,0xbe130775,0xbe1aaa52,0xbe102d57,0xbdf50c65,0xbdd4f4ea,0xbd54192e, +0x3b0a072c,0x3d5b4cd9,0x3d67cb20,0x3d6ba301,0x3d8a9a7b,0x3d3be8d2,0x3cef9600,0x3d05803a,0x3c8800de,0x3c4fc6a9,0xbd055c0b,0xbd65ffd2,0xbcf8f148,0xbcb15f4d,0xbc0e22f9,0x3caea5eb,0xbb8a8dfd,0x3d079ffb,0xbad1f1bd,0x3c6eb628,0x3cf783c9,0x3d210ce6,0x3d5a6df7,0x3d0fb4ba,0x3cd1fb66, +0x3bd1b534,0xbd1b5569,0xbdadc636,0xbe2b1c80,0xbe07605c,0xbe0f972e,0xbe0c436b,0xbe0ee10c,0xbe12f9db,0xbe1ac96e,0xbe1a3d9c,0xbe208fd2,0xbe216d57,0xbe1f6757,0xbe197808,0xbe161a5e,0xbe0a1d8b,0xbdf96e2b,0xbde73c2b,0xbde8af57,0xbdd7dabb,0xbde0bd99,0xbc2a2b90,0xbd726b8f,0xbdabeff7, +0xbd983394,0xbd82c3cc,0xbdb35c7c,0xbda4c8b8,0xbdd7a153,0xbdcc71a1,0xbdd621e2,0xbdc2c397,0xbdbb2a4d,0xbdd1a326,0xbdcee7ad,0xbdd70653,0xbe08cfda,0xbe24aeb6,0xbe11aa6c,0xbe095900,0xbe0ef7f6,0xbe0af575,0xbe0b83c3,0xbe09ac6a,0xbe07fc35,0xbe05a2b1,0xbe029c75,0xbe007f3b,0xbdf98a56, +0xbdf3c0f0,0xbdeea7f7,0xbdf27a3f,0xbdf9ee06,0xbdfc0a59,0xbdfa6733,0xbdeb08cb,0xbe008dac,0xbe19ea06,0xbe13cb55,0xbbce767b,0xbe21b502,0xbe1b3bbf,0xbd397218,0xbd4b0887,0xbd379567,0xbd367b2b,0xbd4e2cd8,0xbd541bd7,0xbd528379,0xbe1ea89b,0xbe30f7b3,0xbcad06ec,0xbe18a0e8,0xbe1c81eb, +0x3dce80b5,0x3e1947d6,0x3dcc4500,0x3dd56ac6,0x3ddb3241,0x3dd68873,0x3dd2beb0,0x3dcd521a,0x3dcecb35,0x3db5700b,0x3da83b9c,0x3d9f952a,0x3da27c10,0x3da6ba9e,0x3daeb70e,0x3db4d1ff,0x3dba3b9a,0x3dbdde16,0x3dbe4704,0x3db813a2,0x3da82d0c,0x3e053006,0x3df6841a,0x3d0458ae,0x3e04e5b2, +0x3dfe5d99,0x3d22603a,0x3d4664ea,0x3d4e5378,0x3d486b09,0x3d6c0186,0x3d725e4b,0x3d7740e3,0x3e01ac80,0x3e0c4a38,0x3d29b007,0x3e0be67f,0x3e03961c,0x3e170966,0x3e077256,0x3e155aa6,0x3e0ed805,0x3e09fba0,0x3df9dee7,0x3df7784c,0x3db1f331,0x3d94b7b5,0x3d8b05c0,0x3d91480d,0x3d9ca77d, +0x3db478d8,0x3dc5c232,0x3dd31669,0x3dd44859,0x3dd8b79f,0x3dbc68ce,0x3dd5aed1,0x3dcb0628,0x3db64484,0x3ddda171,0x3db77402,0x3db716c5,0x3dca28cc,0x3dc7e6da,0x3de75481,0x3df2ddde,0x3ddef1d9,0x3dc46195,0x3dc7f9c8,0x3dcd7e83,0x3dd20cb5,0x3df6d1fe,0x3e0490a4,0x3e4f3a02,0x3e336fcb, +0x3e22ac46,0x3e305717,0x3e2480b0,0x3e2b5f73,0x3e16083b,0x3e19a032,0x3d93d509,0x3cc3e924,0x3c101a2f,0x3c58ebe4,0x3d02b46b,0x3d691d73,0x3da0b920,0x3dc7a4da,0x3dd05ebc,0x3dd9ef51,0x3da9b5b1,0x3dbd1ab2,0x3dd58141,0x3d948861,0x3d9f24c1,0x3d9cc6c0,0x3d9a4d1d,0x3d8731fb,0x3d953f53, +0x3d9bd3f3,0x3dc2c756,0x3d93e195,0x3dabffa9,0x3dbf2f1a,0x3db4a75d,0x3dcd1cb9,0x3e0b1b34,0x3e2cceba,0x3e4bc3c5,0x3e392f74,0x3e1fdfcf,0x3e44040c,0x3e3f55f3,0x3e462b66,0x3e28089a,0x3e27522f,0x3d4225c8,0xbc26ac15,0xbc97c280,0x3b2572e8,0x3c9b52ad,0x3d7a1685,0x3dbfca79,0x3de5c7ff, +0x3de4d671,0x3de0433c,0x3da69c13,0x3db04dcf,0x3dc74556,0x3d599183,0x3d688907,0x3d5425db,0x3d58968e,0x3d16efbd,0x3d496a02,0x3d40f729,0x3d6fbb3c,0x3d5528ec,0x3d513a09,0x3d8801a7,0x3d6e3be6,0x3db426ab,0x3ddf6c13,0x3e2edbdf,0x3edd8852,0x3efe3ecc,0x3ed70505,0x3ed745ff,0x3ecc8b1a, +0x3ea94fe2,0x3e865f41,0x3e76b756,0x3de88740,0xbc410249,0xbe878389,0xbe454563,0xbe11b4e2,0xbda9faaa,0xbcde623d,0x3d265e24,0x3dccb032,0x3ddd8fb3,0x3db52724,0x3d8cfc8f,0x3d61750a,0x3d2684d8,0x3d8e9e3f,0x3d419172,0x3d254378,0x3cf9f872,0x3d2aa932,0x3d560024,0x3d84fd4b,0x3d93bad1, +0x3dd29387,0x3e0fc18d,0x3e468b91,0x3e78ec76,0x3e88d3f8,0x3ea70858,0x3e644829,0x3ed1ccb7,0x3f1e6ddd,0x3f25f77a,0x3ee23620,0x3e9923f7,0x3e75eb7d,0x3eaf599e,0x3e75a93b,0x3e46e880,0x3df09bc0,0x3e487537,0x3e827308,0x3ea32d95,0x3ea12ecc,0x3e8eaebe,0x3e6a1a79,0x3e29c057,0x3e049620, +0x3e05ae01,0x3dadb73a,0x3d7731ca,0x3d950f1b,0x3d8dd7fd,0x3d8e073e,0x3d4136f8,0x3d8282d8,0x3d83973f,0x3d9c425c,0x3d9f3ab2,0x3d998276,0x3d86e73d,0x3da44745,0x3dff7d6f,0x3e065ed2,0x3e62e881,0x3eb37367,0x3f0d2335,0x3ea5ecbc,0x3e1505bc,0xbe8830d5,0xbe21007a,0xbdb4579a,0x3df99b46, +0x3e1a29da,0x3e675c70,0x3ea33f31,0x3eb402c1,0x3eb2a46e,0x3ea9fe5e,0x3eaf335c,0x3eb7de4a,0x3ebf9254,0x3ea567e4,0x3e79fd12,0x3e4e2e83,0x3e403d99,0x3e0269d9,0x3d9e70a3,0x3da9c2d8,0x3d6c754c,0x3c9e120e,0x3cf6958c,0x3d56e538,0x3de9596b,0x3da3990e,0x3d9fd141,0x3dac8c64,0x3dcdabb9, +0x3e1edfb5,0x3e5d7a8c,0x3e4f6f18,0x3ec5d3d8,0x3e54435a,0xbea4ce1e,0xbeccacb3,0xbf480e9b,0xbee33ef2,0xbe807e4d,0xbd18bb57,0x3ba69a55,0x3dc8b30b,0x3e2d7094,0x3e8cc2e7,0x3eacd9c3,0x3eb482b6,0x3eb3b09b,0x3ea7841b,0x3e962351,0x3e907e84,0x3e7d7d1c,0x3e5f926f,0x3e0d44f8,0x3dd45101, +0x3db4962e,0x3da0d0a3,0x3da6a9fe,0x3d93e531,0x3da3cec3,0x3da974cd,0x3dabb5c9,0x3da8fdb1,0x3dc696d3,0x3da930d2,0x3dd72b7f,0x3dc611e9,0x3e15e72e,0x3e186725,0x3e775499,0xbb10fe8b,0xbebc8f7b,0xbeb29bd0,0xbedacd0e,0xbeaa9b25,0xbe8c6271,0xbdec1b97,0xbcf7d062,0x3d9bbac5,0x3e0ef99d, +0x3e5ae2af,0x3e844b4b,0x3e936622,0x3e96c7e1,0x3e9acf8d,0x3ea29ddb,0x3e89fa0e,0x3e44c1db,0x3ddad091,0x3cd9846b,0x3d235b10,0x3d2e0b04,0x3ca8bc07,0x3d072146,0x3cdd0a37,0x3d965c1e,0x3d882fb7,0x3d1f081f,0x3d4d253d,0x3d8101af,0x3d82c623,0x3dd60a4c,0x3dffba59,0x3e09dbbb,0x3e0ad167, +0x3e21e3f1,0xbd5cdf08,0xbe3e8ad5,0xbe3c7ad1,0xbe83005b,0xbe3fed4d,0xbe0ca48f,0xbd45c491,0x3db6e5a1,0x3e3a3c2b,0x3e74ea1c,0x3e89d920,0x3e8a7a53,0x3e8470ee,0x3e7f8ac5,0x3e69b650,0x3e552323,0x3e0850ee,0x3ddbbe3b,0x3d4145d1,0x3b803216,0x3d099e5d,0x3c316614,0x3d05d0f5,0x3d038f6d, +0x3d1055cd,0x3d2a068d,0x3cdb28a0,0xba884bf6,0xbb85b9f9,0x3c972581,0x3d935a53,0x3d0e27a4,0x3ce4beec,0x3cf87c24,0x3d2759d0,0xbdc8541b,0xbdc33a4e,0xbe098403,0xbe22e3b4,0xbe57c27e,0xbe01563b,0xbd85d7c1,0xbc78290d,0x3d0d768f,0x3da36909,0x3e05eb17,0x3e0e78a4,0x3e21615f,0x3e396b47, +0x3e15305f,0x3de4b374,0x3da2e21e,0x3d86fe1c,0x3d5c70ae,0x3d26af4b,0x3cf2a8e0,0x3c9ab9ca,0x3c80cda3,0x3c74d904,0x3adcb346,0x3c7ee226,0x3a0e4cd9,0x3c6857a6,0x3c918a87,0x3c51067e,0x3beab35f,0x3bed39e7,0xbba331a4,0xbb2c81ed,0xbc9d3002,0xbd7db921,0xbddf64b7,0xbdba5728,0xbddff2ca, +0xbde16803,0xbdf79cc3,0xbe0a02af,0xbe1e6d4f,0xbe2b81a6,0xbe2772f4,0xbe228d63,0xbe1ab5a3,0xbe15d7a4,0xbe111f44,0xbe0a117a,0xbe0429e5,0xbdefa58f,0xbddf2c60,0xbdc5af56,0xbdb82b51,0xbd9a92f8,0xbdc624e5,0xbd770d79,0xbd24d53f,0xbd366550,0xbd08bd33,0xbc276754,0xbc946ec8,0xbc4d0b94, +0xbcd4df9d,0xbcdf24dc,0xbcfe377f,0xbd3abbcd,0xbd610caf,0xbda78d85,0xbda22d81,0xbd9478c4,0xbdb1f371,0xbda2e47d,0xbdafb84c,0xbdb040f5,0xbdb29db6,0xbdbde513,0xbdc4ee27,0xbdd40bf6,0xbdd166d3,0xbdd4fb22,0xbdda1920,0xbdd701a3,0xbdd4c6b6,0xbdd52f8d,0xbdc58e0f,0xbdb9fb03,0xbdaed700, +0xbda60d00,0xbda1aca3,0xbd8c15b2,0xbd84c518,0xbdab0bb2,0xbe1c33cf,0xbd41a2ab,0xbd91c6d3,0xbe0c47c8,0xbe0cbabf,0xbe0eb541,0xbe0ec616,0xbe0dc284,0xbe10e612,0xbe0f3a6b,0xbda3555d,0xbd52a0cd,0xbe2897f1,0xbdd5664b,0xbda068cd,0x3d11bcaf,0x3cb8c170,0x3c94666d,0x3d0f926a,0x3ce4a653, +0x3d089cac,0x3c8d3b48,0x3c504aa2,0x3c65aa34,0x3cb9842d,0x3ce7a368,0x3d05c5d3,0x3d154f89,0x3d20abec,0x3d2230c4,0x3d257d7b,0x3d214b31,0x3d1b009d,0x3d08266d,0x3d0f892f,0x3ce08828,0x3ca8acdf,0x3d4cee07,0x3e032f67,0x3c5f7d0c,0x3d386ad6,0x3df561bf,0x3df39b0c,0x3df457c9,0x3df27a83, +0x3ded403a,0x3dee3a89,0x3deca528,0x3d3a491e,0x3bec771b,0x3e0cddf9,0x3d7f6184,0x3df12c0c,0x3c257fb1,0x3ce56c8b,0x3c819e81,0x3c969b24,0xbc9de683,0xbcc674fd,0xbc3b6033,0x3bc7982d,0x3cb1f1bd,0x3d06886d,0x3d3ba66e,0x3d544915,0x3d50f307,0x3d619df8,0x3d537848,0x3d3b46b9,0x3d0db844, +0x3d12883b,0x3cb94132,0x3d985f8e,0x3d45d887,0x3d16920f,0x3d52b346,0x3d56cc72,0x3d03c8ef,0x3d1a1e15,0x3ce8fc23,0x3d1e0362,0x3cca8800,0x3cc8bec7,0x3d2158dc,0x3d1ad10f,0x3d7903c7,0x3d863211,0x3d06a373,0x3d812188,0x3c7042bf,0xbc3678f3,0xbbad3dc7,0x3c0f3324,0xbd80cd7a,0xbdaaffad, +0xbd5b187b,0xbc9ef9cb,0x3c1c1a97,0x3c9d5ef8,0x3d29b63e,0x3d7a5571,0x3d894326,0x3da2b4d2,0x3d99b7b5,0x3d84b98b,0x3d4032d7,0x3d20e9f0,0x3d0c8da3,0x3d3c576c,0x3d4b8019,0x3d5ecb35,0x3d444e62,0x3d50668c,0x3d171813,0x3d6be307,0x3d417c4f,0x3d674f66,0x3d27775f,0x3d3dba07,0x3d3af21e, +0x3d6016a3,0x3d6d4a02,0x3dabe412,0x3d567cd2,0x3d9c84bc,0xbc0c8f31,0xbd4ae3fe,0xbd5eddd6,0xbcfad78d,0xbdde9fc5,0xbdf169f1,0xbd965822,0xbd29edad,0xbca4886a,0xbaeba4c0,0x3cd27238,0x3d435752,0x3d5b4554,0x3d9a2127,0x3d96dbad,0x3d6a09da,0x3d143afb,0x3d0f3b10,0x3cd3e6d8,0x3d734c1b, +0x3d8e6e9f,0x3d55bff3,0x3d6382ea,0x3d55b6bc,0x3d2f29fc,0x3d48d10e,0x3d571fc5,0x3d65c1a8,0x3d02ad1e,0x3cb03ca7,0x3cff85e4,0x3d3cbfc4,0x3d8ebbd4,0x3dbaae2b,0x3c8e592d,0x3e358ac8,0xbda119ec,0xbe2b7561,0xbe11f2f6,0xbe5d7709,0xbec1009b,0xbed636c5,0xbeba11b4,0xbe168d50,0x3c96e06c, +0x3db6689e,0x3dea9785,0x3e1f44cb,0x3e5ddb7e,0x3e66678c,0x3e56f730,0x3e46c49b,0x3e06fb76,0x3dd694f4,0x3d9bf51b,0x3d5bb5b3,0x3d8f9e30,0x3d50e80d,0x3d66acba,0x3d4adde8,0x3cf24a6d,0x3d435442,0x3d60b3a9,0x3d871aba,0x3d7d8c85,0x3d910e68,0x3dd1097a,0x3d65cd9c,0x3dc61c02,0x3dcaa673, +0x3e04df2b,0x3e947143,0xbcbf4be3,0xbf0a1629,0xbf0d7ca3,0xbf34a5bd,0xbf12823c,0xbedc22de,0xbe944580,0xbd8e86e5,0x3d70409b,0x3e16b15b,0x3e3930df,0x3e349075,0x3e081096,0x3dd9d9a1,0x3dae0d33,0x3d9ae333,0x3d5c9527,0x3d4e8630,0x3d90ef28,0x3dd11010,0x3daca24f,0x3d95bab5,0x3d5dfee6, +0x3d3d3815,0x3d446b74,0x3d854d0e,0x3d848fee,0x3d89fe65,0x3d5e053d,0x3d7b18fa,0x3cf1ad26,0x3da11838,0x3ca024b6,0x3dc254bc,0x3d2503f1,0x3df60715,0xbec4703d,0xbf88b681,0xbf82caea,0xbf7c346b,0xbf48954c,0xbf2e5647,0xbf10f039,0xbeaa9d8e,0xbe462d46,0xbe16391e,0xbe3387ba,0xbe244055, +0xbdf1c8eb,0xbd9280af,0xbd20436e,0xbc849ca7,0x3b15d1e4,0xb99e72be,0x3d9a2271,0x3de3ab51,0x3dcb744c,0x3dc07680,0x3d952aef,0x3d7859ad,0x3cd7e265,0x3c9166a0,0x3d197695,0x3dd3eada,0x3d92234c,0x3d925507,0x3d83dbe2,0x3e1e94a7,0x3c7cf4fa,0x3e3c3919,0xbdc4e671,0xbe6e335f,0xbf5c301a, +0xbf6cc8eb,0xbf51b909,0xbf28891f,0xbf2ad16c,0xbf2266cb,0xbf07fd37,0xbf040973,0xbf024c27,0xbef52c97,0xbeec08aa,0xbec54b0d,0xbe8c4266,0xbe0e63d5,0xbd58c1fa,0xbd39779a,0x3c655b7c,0x3cc377c7,0x3d7aa466,0x3dddb4e2,0x3d1b6fe5,0x3d47d556,0x3d667f46,0x3d7395ca,0x3d3a3ad5,0x3db36eb6, +0x3d91e92e,0xbc9c1219,0x3ce88c1b,0x3d3309d4,0xbd0e1b96,0x3d5052c7,0xbdab4dc3,0x3c17cb1f,0xbe1e267e,0xbec38fca,0xbf1784a0,0xbf116a8c,0xbf0c627c,0xbf02a07a,0xbebe5cce,0xbe761fbe,0xbe26373f,0xbdf30981,0xbe317375,0xbe9e8a94,0xbeaf4889,0xbea7e2bd,0xbe82e027,0xbe618209,0xbe14ce64, +0xbd82e046,0x3ceb3a22,0x3d52bec7,0x3d2b2e3b,0x3da3f77b,0x3d6c3012,0x3d8ef9c2,0x3d55e91e,0x3d334eee,0x3cfc4711,0x3d34cc65,0x3d091753,0x3c186328,0x3cb175dc,0x3bc9f89d,0xbd00f398,0xbdba2294,0xbde27fb4,0xbe0298b1,0xbed3f0aa,0xbddcaaf2,0xbea94536,0xbe9e1d58,0xbe981750,0xbe896e09, +0xbe48baed,0xbdffa9cf,0xbd909ae4,0xbd9c555b,0xbd3bdb10,0xbced154c,0xbd91187d,0xbdde186c,0xbdd8db82,0xbe02c179,0xbde54671,0xbd9542fb,0xbbc1982f,0x3c0b2f5c,0x3d49a872,0x3d1595fa,0xbacb1973,0x3c54d5c2,0xbc3e052c,0xbaf15991,0x3c4a2872,0x3c18bf9f,0x3c375be5,0x3c0ca086,0x3bc7c8b1, +0x3c0e8554,0xbc2ce854,0x3ae1bd93,0xbd323e33,0xbd8dd15c,0xbe13a4ed,0xbe2f4d2c,0xbe11bece,0xbe098a2b,0xbe1df4b4,0xbe23955b,0xbe327da8,0xbe47cd98,0xbe58bcfe,0xbe7041f1,0xbe85a842,0xbe945c41,0xbe8a7e86,0xbe7f192d,0xbe69e605,0xbe51122c,0xbe36cb1a,0xbe2afd00,0xbe16092a,0xbe1409d7, +0xbdac4301,0xbc2f7393,0xbcc019c1,0xbc8826a5,0xbc18c738,0x3c2cff40,0xbc0d36fe,0x3bc012bc,0xbcb063b7,0xbc590c3c,0xbccf1895,0xbcde4d03,0xbd0cdc45,0xbd96df8d,0xbdd016f7,0xbe0b587f,0xbe11833a,0xbd9d34d3,0xbd808dbc,0xbd858b2f,0xbd9b26f2,0xbda53e17,0xbdaf9a6f,0xbdb317d0,0xbdbdc58d, +0xbdb31eb3,0xbda355ac,0xbd990a39,0xbd908ca1,0xbd8f31bf,0xbd810b14,0xbd8989fa,0xbd96423d,0xbd9b84f7,0xbd9012be,0xbd85e9c3,0xbd9c3e4c,0xbd87f5bf,0xbd8a1c01,0xbd8ee2c7,0xbd81e2bb,0xbd6a7c6a,0xbd59d5fc,0xbd48d35f,0xbd637161,0xbd4097bf,0xbd348fc0,0xbcd5e552,0xbcce1177,0xbd069f21, +0xbd27f31b,0xbd642e67,0xbd3b5a72,0xbdd9e51f,0xbd152414,0xbd40ce22,0xbd4f5608,0xbd593bd8,0xbd6af667,0xbd7b4a72,0xbd86f484,0xbd8a20b7,0xbd908cf3,0xbd94c366,0xbd9dadda,0xbda584d6,0xbdafa408,0xbda3debe,0xbd95870d,0xbd89d22f,0xbd890d7d,0xbd7decd0,0xbd6a8ebe,0xbdd3e152,0xbdc22d0c, +0xbd831b12,0xbdb2b960,0xbdb70aea,0xbd5efa0d,0xbd6936f3,0xbd62524e,0xbd6ca3dd,0xbd7cd8f9,0xbd89ec1b,0xbd88d0bb,0xbdb0f66d,0xbda0fe18,0xbd9fd2a7,0xbdccb066,0xbd47c48d,0x3df7503a,0x3db60bbc,0x3dd39e49,0x3db8de32,0x3dc137d0,0x3dba9b82,0x3dd8c7c7,0x3deea8e1,0x3e043b75,0x3e0f3661, +0x3e14b6c6,0x3e14471f,0x3e0e2a68,0x3e0908bc,0x3e04ff88,0x3dff390f,0x3df60e27,0x3dee78ef,0x3de71ce7,0x3dd89034,0x3df20228,0x3dc90023,0x3d6852dc,0xbc703fe2,0x3ddfb65d,0x3d714241,0xbc355e76,0xbc16545d,0xbc09e82e,0xba97538d,0xbc125ca1,0xbc1603f9,0xbbe1aa18,0x3d78bb2d,0x3de1d5f9, +0xbbdda8fc,0x3d45d441,0x3d01172f,0x3dad234d,0x3d82a5e0,0x3d8c53e6,0x3d8f3925,0x3de23dd1,0x3e17c6b7,0x3e397b56,0x3e593af6,0x3e5ed358,0x3e4e4dde,0x3e39e56b,0x3e2b2da5,0x3e22ac8c,0x3e1684f2,0x3e0dade9,0x3e08209b,0x3df82201,0x3de6dea4,0x3dee7f2f,0x3d3c4578,0x3dc496ca,0x3dc81f4e, +0x3da4660d,0x3d9974b8,0x3dbfd4ae,0x3dcc9b24,0x3dd96052,0x3db82603,0x3dcd4f3c,0x3dc5fdc6,0x3d9c4b49,0x3dac9dad,0x3d891723,0x3d9e19f9,0x3db1f590,0x3cc8ad97,0x3cc9628f,0x3b6d6815,0x3c2fec0a,0x3c5d4d60,0x3daaf147,0x3e1de588,0x3e5dd003,0x3e94da15,0x3ea51178,0x3e9dc734,0x3e8ec8ea, +0x3e7a60a4,0x3e66bc75,0x3e454c27,0x3e2b9ba1,0x3e1acc1f,0x3df8626d,0x3dead9bb,0x3dc0e348,0x3dad0cf4,0x3db335ca,0x3da98d73,0x3da0a000,0x3d7c4903,0x3d96ccf5,0x3d7a54bc,0x3db85442,0x3d8d06f4,0x3d844a5e,0x3d2c4953,0x3d3f0f6d,0x3d58dba5,0x3d5e06af,0x3d480c38,0x3d1ad574,0xbc0c113c, +0xbb6d7fda,0xbd0e78a7,0xbcda9539,0xbc373894,0x3de38f66,0x3e63e3d2,0x3ea2a803,0x3ed1dcdf,0x3ed855db,0x3eb7a675,0x3e9482d0,0x3e801cc7,0x3e68cb14,0x3e43d7ba,0x3e29bab6,0x3e1f9b14,0x3dfcb4a1,0x3dd78615,0x3db4fffd,0x3d7fb55d,0x3da45868,0x3d872593,0x3d8a0cec,0x3d6d40eb,0x3d4a0432, +0x3d6bfb6f,0x3d4c1e89,0x3d7ec5cd,0x3cf5fc3a,0x3cd24a78,0x3c8e8354,0x3d0afd88,0x3d3a1117,0x3d1b9f3c,0x3a8fa5fa,0xbe085dcc,0xbe918602,0xbea88b81,0xbeac6986,0xbebb6e72,0xbe5ed13d,0xbd92cfc8,0x3da049a9,0x3e7ed19e,0x3ed1a45a,0x3f1d9db9,0x3f15b28c,0x3f09ec4b,0x3ee4b765,0x3ec7c8a1, +0x3e9c441e,0x3e5c7f96,0x3e162a5c,0x3dfa6cce,0x3e0f9492,0x3df61d39,0x3de77e79,0x3db87371,0x3d9edfa6,0x3d85603e,0x3d2e559b,0x3d8147be,0x3d838810,0x3d742a4e,0x3d4c203b,0x3d11d71a,0x3cf567a5,0xbc3d097d,0xbd1d9373,0xbd479950,0xbd519cc6,0xbe556920,0xbec8a3bb,0xbefd1453,0xbeff141b, +0xbe8faf91,0xbdcd0e53,0xbd4d9b3d,0xbe403e0e,0xbd7100e5,0x3d082594,0x3e2fce33,0x3e14670a,0x3e276b0e,0x3e47c6af,0x3e46477a,0x3e4bfeff,0x3e4ad255,0x3e2b714f,0x3e13a3d7,0x3ddac50a,0x3dbbf863,0x3dc88370,0x3d97bb26,0x3d90d070,0x3d783126,0x3d38ae4e,0x3d6ebd7d,0x3d7f344e,0x3d9a1877, +0x3d7784d3,0x3d5cd217,0x3d400d13,0x3d261539,0x39ea85af,0xbd2bbf0b,0xbe2ac5ef,0xbefee69a,0xbf00d151,0x3e09a5e9,0x3eadd6a6,0x3f394be8,0x3e9a5cd2,0x3cab6db5,0xbe957f5d,0xbeb22233,0xbea0dab9,0xbe1d0c7f,0xbc99c443,0x3dd3c621,0x3e3ba102,0x3e0cfee3,0x3ddbca7a,0x3dbd5f8d,0x3dda1894, +0x3e117e6c,0x3dca4a9b,0x3d9b248b,0x3daa1b78,0x3da6c548,0x3d9e23de,0x3d8f8ef5,0x3d65de6a,0x3d3d7ba2,0x3d64082c,0x3db31839,0x3d1d0079,0x3c6e9613,0x3c23c51e,0xbd7f0065,0xbdef7e07,0xbe864200,0xbe3269dc,0xbede1c69,0x3e28392b,0x3f4c6563,0x3f2e6c6c,0x3f3a4c5b,0x3ed7368c,0x3e8aec20, +0x3d8c975c,0x3db880a7,0x3da7c388,0x3d828a90,0x3d7743b2,0x3d81036b,0x3d8d489c,0x3d9f0f17,0x3db548ce,0x3dc2db8b,0x3d8c2fe4,0x3d836522,0x3d89e4bc,0x3d185c74,0x3d6b12f2,0x3d5a401f,0x3d4f524b,0x3d3f149d,0x3d1cc8fb,0x3da125d5,0x3d848c00,0xbbe24a1c,0x3d28c1c0,0x3ca49036,0x3c673808, +0xbd38c3bc,0x3c7a50d1,0xbe119f08,0xbe1efb41,0xbe143aea,0x3ea3f889,0x3f130fcf,0x3ee648d8,0x3eecb2e1,0x3e971c02,0x3e5ef7e7,0x3e2857d3,0x3deb9951,0x3dfc2139,0x3e515781,0x3e40b7a7,0x3e1ad02c,0x3dcf3358,0x3d30c108,0xbb84a4e3,0xbd441cba,0x3c7ee6ba,0x3d8c4310,0x3dcfbbe2,0x3d9baeaa, +0x3d999fce,0x3d286f4e,0x3d636d5e,0x3d7d934f,0x3d5dd1b7,0x3d2d0295,0x3d2f6fdf,0x3b98de65,0x3c738d38,0x3a8f2ae0,0x3cf29db3,0xbce85e41,0xbd8d6170,0xbdfa0893,0x3de6a632,0xbe99f210,0x3e4aa876,0x3e91aa80,0x3e389894,0x3e44509f,0x3ddd2268,0x3da636c9,0x3d733ffe,0xbc960b30,0xbd9e1752, +0xbdb9b7d3,0xbd7bf2e4,0xbc96086f,0x3c12f42b,0xbc117a02,0xbccf13bb,0xbd55718d,0xbb1aa634,0x3cf11058,0x3cbff514,0x3cb7c335,0x3d4630e5,0x3d642632,0x3d09c05e,0x3cb9c7cc,0x3d0668d8,0x3c8035c8,0x3bf5d08f,0x3d3d12cc,0x3d1cc57c,0x3cea5dba,0x3bda9102,0xbc20bc40,0x3c102cad,0xbd126fe1, +0x3c2a2e2e,0x3d35b5be,0x3d693f26,0x3dfc351c,0x3df95fb7,0x3e281a00,0x3dfba52f,0x3db5759c,0x3d4afd2e,0x3ce2f716,0x3c1cd737,0xbc69eb7e,0xbd66f778,0xbdd77a19,0xbe23f34d,0xbe09265b,0xbdeb66b5,0xbdc5a55f,0xbdaaedde,0xbd2f3651,0xbd5cf1f2,0xbda77032,0xbd90c7b9,0xbd6acc9e,0xbd009a3d, +0xbd22a87a,0x3aa23644,0xbcfcaa6b,0x3d22bb9f,0xbcdda238,0x3c8a3a1d,0xbce8824f,0xbb5b8219,0xbb82cb3b,0xbc028c89,0xbca3d915,0x3d30de4c,0xbddc9d82,0x3e0680d5,0x3e0ef2cf,0x3e0d098a,0x3e15c72a,0x3e1b5042,0x3e2a0abc,0x3e3740e3,0x3e250077,0x3e0edf25,0x3df4d07f,0x3dc67a48,0x3da0f14e, +0x3d36f881,0x3d55947a,0x3d4e4987,0x3d60382e,0x3d5ec68d,0x3d7cd7ed,0x3d777d4b,0xbda061b5,0x3d310b1e,0x3d4e8478,0x3d2318b2,0x3d03c1fd,0x3db87acc,0x3dc858cf,0x3dbcc23e,0x3d6e8bf1,0x3dcaaa54,0x3ddb773d,0x3d92990d,0x3da1f08f,0x3d28b211,0x3d209174,0x3dbe01b9,0x3da356cf,0x3e31e829, +0x3e01941f,0x3e0f7339,0x3e0ee329,0x3e1402d2,0x3e16141e,0x3e1cacf6,0x3e12349b,0x3e0d217d,0x3e079303,0x3e02ad51,0x3dfc70aa,0x3def1b26,0x3df4cd74,0x3df3adcd,0x3df336d9,0x3df3b467,0x3de3bf50,0x3e15351c,0x3d1e2af3,0xbd05e327,0xbe23f880,0x3db21c3f,0xbc4902d5,0xbe11a9cc,0xbe1321e2, +0xbe0a7788,0xbdef904d,0xbe022bc0,0xbdfc9848,0xbde90519,0xbbf70358,0x3ddf88cc,0xbe0d555f,0xbc7c7aeb,0x3e1e39a1,0xbd64e16a,0x3cfa3b57,0xbdd67ea2,0xbd8b76f4,0xbd9e5873,0xbd9505a3,0xbd859de7,0xbd73087b,0xbd5c1036,0xbd6050e4,0xbd5aaccb,0xbd500f74,0xbd57fe02,0xbd5d0a09,0xbd64cfd1, +0xbd6149bf,0xbd60a00a,0xbd5fa369,0xbd60ce68,0xbd396b16,0xbda77a24,0x3d3de42b,0x3ded8724,0x3e4c7afb,0x3c52e033,0x3dde76bc,0x3e4068b1,0x3e4589aa,0x3e436df9,0x3e314cb8,0x3e3fd80e,0x3e400659,0x3e39e57c,0x3dd7f503,0xbc1ba971,0x3e3bfd2b,0x3de67180,0x3dd2ac9a,0xbdcf3547,0xbddb2122, +0xbdcba97b,0xbdb91804,0xbd988a0e,0xbd8553e9,0xbd694c09,0xbd7323f8,0xbd6ad5c2,0xbd51f6a0,0xbd62c944,0xbd6e13ac,0xbd7d8bf2,0xbd7b601f,0xbd72378b,0xbd715da5,0xbd5c941f,0xbd6c7574,0xbd255c95,0x3dfc0b15,0x3c194afd,0x3cc2410f,0x3ce2d818,0x3d3855cb,0x3c12a72f,0x3b48d532,0x3c201bfd, +0x3d3c273c,0x3b5774c7,0xbc8bf1b2,0x3c89b6f7,0xbbf2687c,0x3cca23a2,0x3cdd73de,0xbd3b2452,0xbc8255f3,0xbdea6ffe,0xbe26fc9f,0xbe186e6e,0xbe139b4d,0xbdd4265d,0xbd9bbb76,0xbd71ccbc,0xbd7f196d,0xbd480bc0,0xbcd6b5ad,0xbd0168bc,0xbd27cd8c,0xbd65dab6,0xbd72d05f,0xbd75b8fe,0xbd8130d5, +0xbd4b7e8b,0xbd81a01e,0x3af9d002,0x3d526b93,0x3d3ac78c,0x3d138a89,0x3cbbbb56,0x3d6e9f63,0x3c8e312e,0x3d921c90,0x3bd10b93,0x3da8f734,0x3cc2f67d,0x3d892e2c,0x3d24ca18,0x3cb22c2e,0x3c378e3d,0x3c871fda,0xbcf7798c,0xbc86e014,0xbe0582a8,0xbe21b6e0,0xbe123afb,0xbe12f0ee,0xbddba3c4, +0xbda3cef9,0xbd763904,0xbd763bdd,0xbd19b38c,0xbc1f1f7d,0xbc331933,0xbcce3921,0xbd380c92,0xbd51de7a,0xbd55600a,0xbd611d8e,0xbd52133f,0xbd40cb10,0x3c3cf998,0x3d91eb55,0x3c9540b8,0x3d99c858,0x3d02fee5,0x3cf1bfd6,0x3cdf222e,0x3d3526e4,0x3d6e2d6a,0x3d20c641,0x3d43a364,0x3d033ce6, +0x3d08df11,0xbc5f7a6d,0xbcb780ab,0xbc7b89b0,0xbc9a451c,0xbe3621cb,0xbe31bfa7,0xbe283a9c,0xbe49141d,0xbdd0d211,0xbc8abf16,0x3c60f0f4,0xbc375b52,0xbda75ce0,0xbe0722cb,0xbdd07e6f,0xbd88b448,0xbd69e1f5,0xbd579b9f,0xbde9d202,0xbdf28b80,0xbdbcebc2,0xbd3d2f82,0xbd53d391,0xbbb5b8c0, +0x3dbcd203,0x3d005c26,0x3d5c4159,0x3d402d94,0x3d61497e,0x3d2c712f,0x3d5ab845,0x3d4e340e,0x3d2a6773,0x3d0b9643,0x3c9e59bc,0x3c40c1fa,0x3caa4057,0x3c0a2668,0xbd118ae6,0xbddf6583,0xbe900c94,0xbdc4192f,0x3eb18582,0x3ec81fbb,0x3ec56371,0x3db27296,0xbdcceff1,0xbe577b5a,0xbe8b174e, +0xbe8ec382,0xbe91d9c4,0xbe41efdd,0xbe01f8d7,0xbdbb8342,0xbd5eead6,0xbd0b505a,0xbd34259d,0xbadb209f,0xbc77ac73,0x3d07b85a,0x3dabed47,0x3d7d5cb1,0x3d7187a6,0x3d22638a,0x3d25fed6,0x3d0f636f,0x3d3a8cf0,0x3d5f1529,0x3d8c17b1,0x3d31d5a8,0x3ce4caf0,0x3be5d49f,0xbce54619,0xbd62abe6, +0xbde4fba9,0xbde6a729,0x39b44257,0x3eba5eed,0x3f056b75,0x3e883488,0xbe0f84e8,0xbe325511,0xbe2b7d7a,0xbd61953f,0xbda94a46,0xbd66213a,0xbdc284df,0xbe1d5fdd,0xbe68d45d,0xbe948ffd,0xbe7d1d66,0xbe25d11d,0xbd13d6b9,0xbc5d1350,0xbd4f5920,0x3cd9697a,0x3d3a74f1,0x3ca3a396,0x3d909501, +0x3d6595a9,0x3d7ae0ac,0x3d5acd2e,0x3d8c8493,0x3d781848,0x3d3b44b4,0x3c970854,0x3bcacce4,0x3c0e5652,0xbd31a0c9,0x3c6be1c2,0xbd538091,0x3d241738,0x3ebb8504,0x3ef0690b,0xbdc067ca,0xbe59cee5,0xbf196cd7,0xbe690d9e,0xbc22ad17,0x3e55fd71,0x3e245c9a,0x3e2f2403,0x3e1aae7f,0x3e5bb3ff, +0x3e428b05,0x3dc10d0e,0x3d096b2b,0xbc8a3826,0xbd05b37a,0xbd589b1e,0xbdb836b2,0xbcc1d07d,0x3db8c38d,0x3cf19944,0x3cad3107,0x3c3c40c6,0x3bf3d80d,0x3c38f5fa,0x3d2eac4e,0x3d928158,0x3d54d10f,0x3d976188,0x3d723544,0x3cda41c1,0x3c711382,0x3d0f9c99,0x3d0a1c32,0x3de292b3,0x3ec141e4, +0x3e29414c,0xbe1ee957,0xbdfc3680,0xbe5a2bf0,0xbe021f64,0xbde6578c,0xbcd1c8ff,0x3cb034f9,0x3dee4d1b,0x3e47b99b,0x3e7d42e7,0x3e811463,0x3e54fa0f,0x3e36df7b,0x3ded097c,0x3cb437df,0xbcd99035,0xbdb0fab0,0xbd3b2d93,0x3d465c1b,0xbcdcf10a,0x3c223987,0x3d014ae0,0x3d01af6f,0x3d02d91d, +0x3d393d0d,0x3d35071e,0x3d4c22b8,0x3ce10d3c,0x3d30a613,0x3da2212d,0x3ddabf09,0x3df08e3e,0x3e28d619,0x3e78f27c,0x3e988f47,0x3de701e9,0x3b2d9ad8,0x3d4ac5af,0x3c392c76,0xbc811c0a,0xbd4a29a0,0xbd4a077a,0x3d8b8132,0x3e00fc32,0x3e14c3f2,0x3e117d20,0x3de17908,0x3d65bbab,0x3c98ba1d, +0x3a6f0529,0xb8d5718a,0xbc243fbd,0xbc7b0251,0x3bda3dd3,0x3d4a6de9,0x3d143e32,0x3d3b85e6,0x3d2b4b98,0x3d364ef9,0x3d34ddd0,0x3cd88fd3,0x3ca49f10,0x3cc01255,0x3c903147,0x3ca020a5,0x3d1972d6,0x3d631a41,0x3d996a68,0x3daa4bd0,0x3ddb3d67,0x3db893c7,0x3daa8bca,0x3d2f3afa,0x3d54ec3f, +0x3cdf7552,0x3d4a5544,0x3d92a59d,0x3db0bc93,0x3dd11e09,0x3df52d3b,0x3e1ade2a,0x3e20bb9f,0x3e2b6cf2,0x3e36f645,0x3e2ca27d,0x3e1d8e7d,0x3e1367f6,0x3e052ecd,0x3e07f2d6,0x3dad88af,0x3d0bfda3,0x3d8de077,0x3d90aa69,0x3d74d71e,0x3d287504,0x3d804da1,0x3d571383,0x3d49bd9a,0x3d8eda5d, +0x3d2681ba,0x3d6a03c8,0x3d0fad4e,0x3d829237,0x3dadaaec,0x3df98c8b,0x3dba9ba8,0x3e2e371e,0x3d8509eb,0x3d3aaa81,0x3d594545,0x3d43b7eb,0x3d383729,0x3d114373,0x3d00156e,0x3d24456b,0x3d43696c,0x3d5f9eb2,0x3d7f59ea,0x3d8d5e3e,0x3d94e4c9,0x3da140a7,0x3db67bb4,0x3dc81556,0x3dcbecb8, +0x3dd6a778,0x3df6b304,0x3db61cff,0x3daa34ac,0x3dbb5d68,0x3dd366fb,0x3dc39999,0x3dabfccd,0x3d876395,0x3da8474d,0x3dc2aec5,0x3d8d0407,0x3d405589,0x3d8d86b7,0x3d84d4b1,0x3db7afcb,0x3dc49e97,0x3d861f5a,0x3e0273fb,0x3ca17fa9,0x3d3f7f33,0x3d33339f,0x3d31c3f6,0x3d31b449,0x3d35177a, +0x3d2b91fc,0x3d50d564,0x3d6bb267,0x3d823560,0x3d90e636,0x3da01030,0x3db33d8a,0x3dac15ed,0x3da4639e,0x3d9defba,0x3da03852,0x3d95d73e,0x3d8f9117,0x3e11285a,0x3e301764,0x3e1c860c,0x3de94de5,0x3e2a1c6b,0x3e33df5a,0x3e38aaa8,0x3e31e714,0x3e283aab,0x3e349942,0x3e373b00,0x3e30e372, +0x3e2787e0,0x3dc7832e,0x3e2f018a,0x3e310b86,0x3d5401c6,0xbce4abdf,0xbdc15ca0,0x3c24f90d,0xbc402bec,0xbbf295aa,0xbbe8d834,0xbcd0abd1,0xbd1fe5b8,0xbd6c347e,0xbd6ecdb2,0xbd6cbc81,0xbd56b5a1,0xbd358f7a,0xbd1bd59e,0xbd09c96b,0xbcf2ad62,0xbcdd4c3c,0xbcd441ea,0xbcbed83f,0xbcb427e5, +0xbbe759d0,0xbdba08f9,0xbdd4aded,0xbd44753a,0xbda5d4c5,0xbdd4fa2b,0xbd53ba5f,0xbd691e82,0xbd664918,0xbd4b51be,0xbd807a00,0xbd88e35f,0xbd868fad,0xbdde07f6,0xbd916413,0xbd88208c,0xbdf1ec4a,0xbe05c395,0xbc108356,0x3d0aa6ec,0x3c8e83be,0x3c837c25,0xbd068c81,0xbd95cb76,0xbdf45e57, +0xbe0564c3,0xbdff2a2c,0xbdc92686,0xbd90467d,0xbd5278ba,0xbd34cd00,0xbd0aa88c,0xbcf47af1,0xbce7e8cf,0xbcc73af7,0xbc28119b,0xbce78880,0xbd87577f,0xbd06283e,0xbd531c1b,0xbd16a045,0xbd1fc6bc,0xbd1d10df,0xbcd15776,0xbd19b7d1,0xbd49b288,0xbcf82ec7,0xbc6843f3,0xbce6c915,0xbd15f5b0, +0xbd619779,0xbd9558b2,0xbccb89c6,0xbd99c9a5,0x3a2689c7,0x3dfd5a73,0x3d9b70e0,0x3d9a7a65,0xbcde2e2c,0xbde2cabe,0xbe4dd645,0xbe63c08c,0xbe569d64,0xbe2e40cb,0xbe015c3c,0xbdb4d6d5,0xbd97b32a,0xbd49147b,0xbd21d48a,0xbd07083d,0xbca37c31,0x3b221544,0xbc99b229,0xbd26c077,0xbcb993f3, +0xbcea5551,0xbca099c0,0xbca9390b,0xbc4a64a3,0xbba2a677,0x3c92b967,0xbc3dcd37,0x3ca750cd,0xbbb0bf28,0x3b40eb7c,0xbccf6b7b,0xbcfb7d34,0xbd5bfc25,0xbc9c3bbc,0xbd7c531b,0x3d1722fe,0x3e4810dd,0x3e0a9dc7,0x3dee50b1,0xbd317ca7,0xbe2c7441,0xbe9c2507,0xbeac6ba0,0xbe988542,0xbe4a12a8, +0xbdeef363,0xbd862bef,0xbd647269,0xbd19a17f,0xbcd474a3,0xbccb27a2,0xbbd608dc,0x3c4c20c0,0x3c205ddb,0x3c0b6cd6,0x3cf265c6,0x3cc5a510,0x3cd3ab07,0x3cee79f6,0x3cf318a7,0x3d24588b,0x3d4cce5b,0x3d73459b,0x3d2752da,0x3d3305e8,0x3d2dd15e,0x3b8cb749,0xbd04e57c,0xbbd22245,0x3cd5d1df, +0xbd6ee57d,0x3e393da2,0x3e924d41,0x3e80e025,0x3e65b5f3,0x3d384f95,0xbdcb9c52,0xbe806ae5,0xbe928112,0xbeaf258b,0xbec65883,0xbeb04990,0xbe985b6e,0xbe5c750b,0xbe22131b,0xbdf49576,0xbdcae4ff,0xbd47aaba,0xbc0f0c31,0xbca7fe39,0xbd07407c,0xbc009088,0xbb0ea75e,0x3c7bc3d0,0x3cdf5449, +0x3cfbdc61,0x3d325e62,0x3d287080,0x3d102fae,0x3d0857af,0x3d1e4d52,0x3ceb2d09,0x3d6bd441,0x3d08b151,0x3c95d4be,0xbd751a65,0x3d19c9b6,0x3e068d98,0x3cee5774,0xbd4a41b8,0xbe6b9e94,0xbe7d47f6,0xbe4c0809,0xbd71972f,0xbe17ec8a,0xbe7e2e78,0xbed31f4a,0xbebe1927,0xbebf12fa,0xbec32c7e, +0xbe9b51ca,0xbe60f1b8,0xbe041dd0,0xbdb5a2d2,0xbd82f33c,0xbd6116a5,0xbc55339a,0x3b71d5d4,0x3c88a8a6,0x3cdd61d1,0x3d09f677,0x3d1056e5,0x3d4560bb,0x3d51ee2a,0x3d4b89f2,0x3c747a3e,0xbc0c8eff,0xbcf40a30,0xbd6267c9,0xbd2ea434,0xbd0ae98e,0x3ced0949,0x3e5baf1f,0xbc7fc473,0xbf2a6ec8, +0xbf322352,0xbf308a22,0xbe48cb97,0x3dd979c9,0x3eb3a347,0x3eae8fa9,0x3e8150a4,0x3dc1254f,0x3d56af55,0xbb81c293,0xbd74468f,0xbd2df0dc,0xbd9095bb,0xbe0088e4,0xbe205209,0xbe22f25c,0xbdeddd4b,0xbdb8a9e4,0xbd84f05e,0xbd093eaa,0xbc0a76b7,0x3cac1eb2,0x3c67767d,0x3d896321,0x3d843ed8, +0x3c2a0f14,0x3d311c33,0x3d46a5e4,0x3c26d5bf,0x3d84fc89,0x3d52142a,0x3e046534,0xbbe65b6d,0xbd5baaab,0xbf1a4a38,0xbf1ae31e,0xbeb689c9,0xbd995b15,0xbd618c10,0xbd2bb0a2,0x3d76455f,0x3df00d16,0x3e26b037,0x3e652b3c,0x3e0c494b,0x3da8bac3,0x3d68a123,0x3d3b7128,0x3c9820c6,0xbc79ff1c, +0xbc3e32c9,0xbce04cdc,0xbded54c7,0xbdaa5b3c,0xbd99f4c8,0xbd95dbc8,0xbd42ceed,0xbd082e0b,0xbcf8ed13,0x3d08ebd2,0x3d4513c4,0x3c2f47f1,0x3d2c8d23,0x3d2f8518,0xbca4db0e,0x3cc8756b,0xbd64d59a,0x3c1520eb,0xbd38d7a8,0xbe590aa0,0xbe94eede,0xbdfe9a70,0xbde20b79,0xbe1300d2,0xbd7ea54e, +0x3cc8fc23,0x3d928cf1,0x3e1dc42c,0x3e210602,0x3dd15056,0x3d8f8003,0x3d96a407,0x3db464f2,0x3da67adf,0x3d849cec,0x3d6d7077,0xbd56bc43,0xbdaeef7a,0xbe024c3d,0xbdc3497c,0xbd79d05a,0xbcf1b4ae,0xbca96777,0xbc1e0222,0x3cdfcf7b,0x3d10ca47,0x3d2efaab,0x3d5c4c9f,0x3d53d7f5,0x3d246e2b, +0xbba963ba,0xbc9d2f79,0xbcf7f044,0xbd1b7d6a,0xbe8a0ecc,0xbbde5d98,0xbe3a72b5,0xbddd80fb,0xbdb256e5,0xbda451fc,0xbcedcc20,0xbc2d9b6d,0xbb81ce0a,0xbd1cc2ca,0xbcc6d607,0xbbd86a07,0xbbf6c092,0xba7d2a26,0x3cf972ba,0x3d7ad6f0,0x3da56c02,0x3dca8efe,0x3d402e95,0x3cddb935,0x3aca74f7, +0xbcbf326d,0xbb36b484,0xbcb5eebf,0x3cf98710,0x3d5c9a17,0x3d26ec40,0x3d4769ae,0x3d40d0d5,0x3d214044,0x3c9b6894,0x3bf871fb,0xbb3a8806,0x3cbef3cf,0x3c15b3cf,0x3c9a5be4,0xbd059902,0xbd2e4358,0xbd04b2f7,0xbd0371b0,0xbd01a50d,0xbcba2b9d,0xbcf992f9,0xbcda7ff7,0xbc346907,0xbc673130, +0xbc88e1fe,0xbcb9a6cb,0x3c49a137,0x3d3cb399,0x3da5e957,0x3da22f2e,0x3da9cd0c,0x3dbed5c3,0x3dddc9d7,0x3df3abba,0x3e0637f1,0x3df25429,0x3df95a67,0x3df68bb2,0x3dc56303,0x3dab19f5,0x3d5e6083,0x3d74d994,0x3caa7f43,0x3cb6a3ea,0x3c992ed5,0x3cecaef0,0x3ca5d66c,0x39ea4e99,0xbc9b2c8e, +0xbd13eba7,0xbd40e794,0x3d44c309,0xbd1eda07,0xbcdefb52,0xbce814ee,0xbcd05dd6,0xbcab7230,0xbc9c3dfe,0xbcbc3b52,0xbc6357e6,0xbb27c6ad,0x3bd8bab9,0x3c9c451d,0x3ce7c604,0x3d454b7d,0x3d5083f6,0x3d63d6b0,0x3d62361c,0x3d54ce62,0x3d3e2545,0x3d455cf5,0x3dc86cd4,0x3d270340,0x3c839265, +0x3c70637f,0x3c102ca0,0xbcd13c80,0xbca9a440,0xbcf5937a,0xbcabd5ab,0xbcca2197,0xbc9a42d0,0xbc029424,0xbc13d6f2,0x3bac5960,0x3b7751c4,0xbc2b05bb,0xbd286d19,0xbcbf570c,0xbc09128b,0xbc5d130b,0xbc42ca76,0xbc4ef347,0xbc4068d3,0xbc30cb77,0xbbbb4e79,0xbb1bb6bd,0x3ae6575c,0x3b3c5123, +0x3b8517f0,0x3ba9e025,0x3b129a12,0x3ab64376,0x3af6e7f3,0x3b60eb13,0x3c09f855,0x39af55fd,0x39c43d18,0x3c6055b3,0x3dce58a8,0xbce07b51,0xbc25fb20,0x3d947076,0x3d92997d,0x3d90c657,0x3d8b5aa2,0x3d82649c,0x3d79bb7d,0x3d6ad298,0xbc873c1b,0xbd3e4d3e,0x3d9fdc7e,0xbc5f77fc,0xbc4e2673, +0x3d183e66,0x3da8baf3,0x3d63086f,0x3d63a056,0x3d76583d,0x3d5f1ca2,0x3d259c6a,0x3d04ab49,0x3ce1c868,0x3cd77a26,0x3cc85e34,0x3cba34fe,0x3ccc0eb4,0x3cd91c65,0x3ceb2743,0x3cdda005,0x3cdd46f4,0x3cd9ecc3,0x3ce9af78,0x3cd310d0,0x3ccfee8e,0x3d69f5b9,0x3cf2e7ed,0xbd88ed4a,0x3d850315, +0x3d18ca34,0xbd64cc21,0xbd47d1a2,0xbd3e62a6,0xbd3a9082,0xbd1bf356,0xbd13f18f,0xbd0fd127,0x3d2e4852,0x3da5b24a,0xbd7052a0,0x3d36973c,0x3d410677,0x3de9895a,0x3dc63221,0x3dd99a00,0x3db9b16a,0x3d61d60c,0x3d021c8a,0x3cb57a8a,0x3c479d1a,0x3c192ec0,0x3c06290f,0x3c4161e1,0x3c63c845, +0x3c95e484,0x3c788429,0x3c81748f,0x3c731bf4,0x3caebbc4,0x3c442f73,0x3cec5f5b,0x3bbfdce4,0x3c992f1d,0x3d1da207,0x3ca786a3,0x3cb7807c,0x3d2bf869,0x3d33a448,0x3d73287f,0x3d5dfcce,0x3d6b5b7c,0x3d3edc89,0x3d1b4f1f,0x3d5896e8,0x3d48ffbc,0x3d784454,0x3d9ea3e0,0x3e0c67ad,0x3e115564, +0x3e1a8f4b,0x3e2ac79a,0x3e149fa3,0x3d8ac860,0x3cc9d876,0x3b0bb82e,0xbc596aac,0xbcedc158,0xbd223ba1,0xbd0473bc,0xbcb57df9,0xbbf2b509,0xbc2cb4ae,0xbbd12223,0xbbd6a568,0x3a19c5b0,0xbc3b86d6,0x3b23be42,0x3cbf30e6,0x3be2d66a,0x3bb8d948,0x3c85bb53,0x3cb08884,0x3cca1ddb,0x3cdd9b66, +0x3d17c9b8,0x3d3707e3,0x3d0f590e,0x3d31b469,0x3d33b9bc,0x3d526ef7,0x3d6b1a5d,0x3dab85d1,0x3de864fb,0x3e3cb963,0x3e5689b2,0x3e4435e4,0x3e6f44ce,0x3e5dfd41,0x3dcf442f,0x3c7d6f75,0xbca3b1e5,0xbd6000c4,0xbd7ddc0e,0xbd804a53,0xbd61e133,0xbd40b3c7,0xbcea5029,0xbd07843a,0xbcedd3be, +0xbcd95083,0xbc7527b0,0xbd1d1216,0xbca5b40a,0x3cb452fb,0xbc6dbdbe,0x3c53cda1,0x3c493318,0x3c953916,0x3bf6233e,0x3d0a4539,0x3d27ec4e,0x3d2cec7b,0x3d1a882e,0x3d119e3e,0x3d2331c2,0x3d88088d,0x3dd71da9,0x3ddf8ebd,0x3e0a30a6,0x3e18532e,0xbacbd22e,0xbda5d9c6,0xbc2b202e,0xbd7fb968, +0xbbf28e58,0x3d74d5b5,0x3e1b1a8c,0x3d78a1b4,0xbc9cffec,0xbe1a7b26,0xbe2b550f,0xbe23fe5b,0xbe18a655,0xbda20f2a,0xbd4cd9ce,0xbd98e802,0xbd37279d,0xbd6af3fa,0xbce34d2b,0x3ba04889,0xbcf0f7a9,0x3c55975d,0x3bd42035,0x3ccb3324,0x3d02997f,0x3d1ef2ad,0x3d29c53a,0x3d2512e9,0x3d663831, +0x3d82b440,0x3d8c18af,0x3d132c3a,0x3d399feb,0x3d16b256,0x3dc46462,0x3d916da5,0xbdf378a5,0xbee2b533,0xbecea6a5,0xbe5c356b,0x3d83ddbd,0x3e6bdd2e,0x3eb77bc1,0x3eb0d0d1,0x3e9fe41f,0x3e978e9c,0x3e267583,0x3db56839,0x3d823509,0x3cc9cb98,0xbc0f04c6,0xbd233088,0xbd8bf916,0xbdac3bb8, +0xbd56bf52,0xbd2b58fd,0xbc5f9df3,0x3c1ae868,0x3c2ce122,0x3ce68407,0x3d225061,0x3d688307,0x3d6d31df,0x3d1835f4,0x3cc3357c,0x3be15796,0xbc248162,0x3ccecd28,0x3ca8f9f5,0x3cf930a5,0xbcfbcfc0,0xbe848e4f,0xbedce6e1,0xbc3ce913,0x3e9d612f,0x3f3273e5,0x3efe0c55,0x3ec2862a,0x3e876fb9, +0x3e9d67e7,0x3ea905fb,0x3eed02d5,0x3f0b167c,0x3f1b8eee,0x3f214c19,0x3f0ef9fd,0x3ee325bb,0x3e8d9a8b,0x3e269095,0x3dd1d1d2,0xbced7ae9,0xbd97a212,0xbd980a73,0xbdae3c8b,0xbd2f37df,0xbce2d601,0xbca2c57f,0x3d2e9b31,0x3d6acfc9,0x3b064e17,0x3d654bb7,0x3d4d8819,0x3adf6b20,0x3c2d6336, +0xbd43af27,0xbd936ccb,0xbdc395a0,0xbe9ed894,0x3d881c1f,0x3f26991f,0x3f1e31d6,0x3f38f9db,0x3ed322ab,0x3e971c27,0x3e2a0923,0x3e9aecb5,0x3ec5d2c9,0x3edd4f47,0x3ece0a51,0x3ecc9ce5,0x3ed90331,0x3eaed568,0x3e8f0269,0x3e77076b,0x3e32bd8e,0x3e16058e,0x3d71f3f7,0xbd92104f,0xbbed2c4c, +0xbc8a9c00,0xbae00058,0x3c81a3ee,0x3c3c390c,0x3d3d5b49,0x3d37c1d6,0xbc8671a1,0x3cd048ad,0x3c605c52,0xbbbb8d39,0xbcc097e7,0x3bc0b16b,0xbd730348,0xbdeef433,0xbc0a4b56,0x3e82a49e,0x3ecfc721,0x3ec2f5bc,0x3eca1dc0,0x3e37e74a,0x3da675e1,0x3cbedc3d,0xbb0232b2,0xbbffcb86,0x3ce7b07e, +0x3dc0f9b3,0x3df0fb2e,0x3deac0d1,0x3e161eb6,0x3e257771,0x3e31d000,0x3e12baf6,0x3e0a6fdf,0x3db9fe85,0xbcecf5d5,0x3d1c4cd0,0x3cb847ea,0x3ba17416,0x3cc22cdc,0x3cfb703c,0x3d18dbc7,0x3d144f42,0x3d40ce8b,0x3d6ea4fe,0x3d44adb3,0x3cfdde48,0x3c8128ad,0xbc0353dc,0xbd6c2b43,0x3db2062f, +0xbdd7b1f1,0x3e28440d,0x3e33312b,0x3df04dc7,0x3d904ce2,0x3d5e5f63,0x3d57cb5c,0x3d0edcff,0xbd1e534c,0xbdad5d38,0xbdb66b6d,0xbd82f086,0xbc8adeb7,0x3cc2d01e,0x3d7ab45f,0x3d865b26,0x3d658c4b,0x3d68256f,0x3d7b41ae,0x3d716816,0x3d4a9980,0x3d87cd8c,0x3d9b6ff4,0x3d95b26e,0x3d4041ef, +0x3d1e0055,0x3d67d0be,0x3d6ca70c,0x3d1b1667,0x3d1c7ab3,0x3cfb11ed,0x3c9e1813,0xbb60f829,0x3c2e09f5,0x3c91d199,0x3d35c83c,0x3d240bb9,0x3b93304c,0x3c3eca95,0x3ca00fed,0x3d0064ec,0x3d0b08e4,0x3cab8e68,0x3c01fd31,0x3c897b6e,0x3ca6dfec,0x3c8b7624,0x3b568daa,0xbc602264,0xbd0540f2, +0xbcd668bb,0xbc7494e7,0xbc305a1c,0x3bba1053,0xbc19e644,0x3d1c4cdc,0x3db35c46,0x3d2eee95,0x3d06a9a9,0x3cf1c1b5,0x3d262c0e,0x3c805915,0x3c9e32d6,0x3c966033,0x3c98736f,0x3c94f820,0x3c298c2e,0x3c7e2c80,0x3c8ee158,0x3cacd932,0x3c9d054d,0x3cfcce2c,0xbd333b4f,0x3cdac7e8,0x3ce63f25, +0x3ce20520,0x3cd435f0,0x3cc7316f,0x3cf70544,0x3d10702e,0x3cfb896f,0x3cca1926,0x3c9e12d1,0x3c4f2489,0x3c1f2040,0x3bdb60f6,0x3bb7d943,0x3af8881b,0xbb175221,0x3a6cd8d7,0xbbafc1a0,0xbb794df3,0x3d144e11,0x3cdd0992,0x3d26fedb,0x3cae6259,0x3d069eec,0x3d364b03,0x3d389353,0x3d381456, +0x3d0c9d19,0x3d0e2a87,0x3cccd534,0x3c566cb6,0x3c6e6e4e,0x3afb15af,0x3b946b7e,0x3c13a155,0x3d4317b2,0x3d0b1b40,0x3cb1d5f7,0x3cd363bd,0x3cd131a3,0x3cdb5c22,0x3cd0bc95,0x3ccf207c,0x3c994d7d,0x3c70683d,0x3c3d9855,0x3c1e3ee7,0x3be46e0f,0x3b506e04,0x3bc33fec,0x3c0d9d33,0x3c2f1b70, +0x3c31e137,0x3c705de9,0x3bde9f9a,0x3d0cb343,0x3caa961c,0xbcaf97cd,0x3d446390,0x3cf53bf6,0xbd111dad,0xbd12fa8e,0xbd0bd1b8,0xbd05200f,0xbcfb59af,0xbceaec8e,0xbcd981ee,0x3c9d056a,0x3d445e68,0xbd1edea8,0x3c92f998,0x3d03e117,0xbdc3ad75,0xbd6c3eff,0xbe03f679,0xbdc8e13d,0xbdeb3cea, +0xbde6d9c2,0xbde34b46,0xbdd6ab22,0xbdbeffd7,0xbdbb95eb,0xbdb74dff,0xbdb4fbb2,0xbdb831b5,0xbdba5df1,0xbdbb5171,0xbdbc7dcf,0xbdbc145f,0xbdb9365c,0xbdbf7c0d,0xbdb08393,0xbdd51697,0xbd76883b,0xba205f5e,0x3dd58f46,0xbd9bacaf,0xbb61faa6,0x3dc9709b,0x3dcaba4a,0x3dc95df4,0x3db43923, +0x3dc15ec3,0x3dc3ef9c,0x3db989b4,0x3a878478,0xbdb6b494,0x3df05dea,0x3c9ab4d1,0x3dbdd742,0xbe16101f,0xbe1a692e,0xbe24acdb,0xbe2751b2,0xbe26d489,0xbe1880de,0xbdea5b9e,0xbdd8d399,0xbdc7adf1,0xbdc449e3,0xbdc7eea1,0xbdc57012,0xbdbe815a,0xbdbf4793,0xbdc3e277,0xbdc51ee6,0xbdd3389f, +0xbdcb24ee,0xbdd02c0a,0x3bfe7afc,0xbd680ca3,0xbd711a22,0xbd13c336,0xbcc565c2,0xbd5088a4,0xbd5366e7,0xbd6747de,0xbd0ff116,0xbd6545b8,0xbd7ba70d,0xbd1be438,0xbd3e4497,0xbc47d2b4,0xbb8d28f2,0xbd95761a,0xbc3a53bf,0xbe09b24d,0xbe80f0c2,0xbe746389,0xbe796122,0xbe66db41,0xbe3bd3d4, +0xbde4832e,0xbde9e490,0xbdf0ae61,0xbdf4164d,0xbdfc52f9,0xbdfeac00,0xbdef014f,0xbdeade36,0xbde21c5d,0xbdd5a08b,0xbde31e25,0xbde23e30,0xbda6ce7d,0xbd6f0753,0xbd28f5e5,0xbd1703ef,0xbd11c510,0xbc0f45f6,0xbcb13ce3,0x3c4d8ac9,0xbcdadd52,0x3c05c7c4,0xbc1b6815,0x3c81088d,0xbc228e01, +0xba1df90d,0xbb3fa306,0x3ca732ab,0xbd51f986,0x3d2aef3b,0xbe376fee,0xbea35cac,0xbe9b6733,0xbea1487a,0xbe9b5673,0xbe838044,0xbe0e9ee5,0xbe0746eb,0xbe0d24f5,0xbe17d37a,0xbe1367d9,0xbe0461e6,0xbdcfe348,0xbdb6d44f,0xbdbab13f,0xbdbbcfad,0xbde0e150,0xbdc3b30f,0xbdb06679,0xbd405fc9, +0xbd268eea,0xbcb7b9c9,0xbc56d566,0xba074f0f,0x3b60b85b,0x3cae0a20,0x3d305712,0x3cde6eb0,0x3d0d66e0,0x3cd5219e,0x3cac11a6,0x3cc05210,0x3d2d0914,0x3d2fe838,0xbcc78359,0xbe463a90,0xbecff36a,0xbee27def,0xbeea89a7,0xbebf0a8b,0xbe6ad1d1,0xbe07e416,0xbd70078c,0xbdd0ebc8,0xbddb9b5f, +0xbddbe805,0xbe2ab399,0xbe49c2f9,0xbe66601d,0xbe7068d4,0xbe57a1f7,0xbe1fb2b9,0xbe18a6da,0xbe06dc6b,0xbe05e564,0xbd836e35,0xbd089575,0xbcaac122,0xbbc381ed,0x3c20cfc5,0x3cea9a6f,0x3d12470d,0x3d1726aa,0x3cfe3c00,0x3cbcf933,0xbb3b5fff,0xbce50986,0xbdaf631a,0xbdc1f57f,0xbe081ca6, +0xbe1365ff,0xbe49b0c1,0xbe5f7d8f,0x3d848a2c,0x3e17369d,0x3e7ae358,0x3cd8ca68,0xbdb61c63,0xbe119628,0x3d0e8d49,0x3e68f81f,0x3ee1b380,0x3eea045b,0x3eebf0af,0x3ed51e14,0x3e9d37be,0x3e3442d5,0x3d385e6e,0xbc7277a3,0xbcdf365a,0xbd34c34c,0xbda3f66a,0xbd73b9b2,0xbd3b031e,0xbc8c5812, +0x3bc7ab06,0x3c4ec50d,0x3d2e9562,0x3d3d6387,0x3cc07243,0x3ca064ef,0x3c5296d1,0xb9a29f09,0x3c05cf87,0xbd1687e1,0xbd887763,0xbded94a5,0xbe02ea62,0x3e1141f7,0x3ed07a97,0x3e55ff48,0xbd189bcb,0xbe64ca74,0xbe757abe,0xbe456ed3,0xbd81e944,0x3d73e93b,0x3da83b9f,0x3cb16d4d,0xbbb4fda3, +0x3bbf03d1,0x3d74846a,0x3dce14f9,0x3e060b8d,0x3db51d63,0x3d59f238,0x3d233060,0x3ae5e889,0xbca85fea,0xbd627842,0xbd52d4bd,0xbd3ec64e,0xbd28492f,0x3c7fca3c,0x3d06a72f,0xbc71195f,0x3d0a9ae4,0x3c7eb3c2,0xbcd045fa,0xbd70e795,0xbd1c1b58,0xbdc26ef0,0xbd241e11,0x3e6da696,0x3e8fcf97, +0xbe5461d3,0xbecab5da,0xbf23023d,0xbeed82d0,0xbec0688c,0xbe8bda7f,0xbec4fa9b,0xbee0e1f0,0xbf01113a,0xbeb34432,0xbe85c61a,0xbe658760,0xbe445776,0xbe127ced,0xbda0bd5b,0xbd8564b3,0xbd4e9ada,0x3d1bbab0,0x3d6174f9,0x3c581af3,0x3d11c475,0x3cdae855,0x3d119611,0x3d0a1b21,0x3d24f31d, +0x3d133dc1,0xbca98346,0x3cc875fe,0x3cdbdb08,0x3ca25611,0x3c6c8e32,0x3b9cf193,0x3cc10c85,0x3db49a84,0x3e13af83,0xbe1698dc,0xbedc28e4,0xbeb75497,0xbe9e72c7,0xbe8a303e,0xbe97fd5a,0xbeaa07dc,0xbebeda94,0xbec68671,0xbed37094,0xbecb86db,0xbebd3daa,0xbe9e2436,0xbe779d40,0xbe3143ed, +0xbdff3d5a,0xbd466daa,0xbd044dfc,0x3cebd045,0x3dace614,0x3d15a911,0x3d4c7ea8,0x3d09a88d,0x3c2c6960,0xbc56f278,0x3bd2ae91,0x3be7e608,0x3cb05bd9,0x3c53fc4d,0x3aed5b0a,0xbc6d6d23,0x3cab0196,0x3d264449,0x3d928b70,0x3d1146e2,0x3e237c25,0xbd919643,0xbe26409f,0xbdeb6c88,0xbdcd340c, +0xbdf9227e,0xbe02153c,0xbdf738e9,0xbd0c369e,0xbc40afc5,0xbd12a600,0xbd964ee0,0xbe082a42,0xbe4b031a,0xbe5a3050,0xbe497d15,0xbe1fdbc1,0xbdc15d14,0xbdb5c2b4,0xbcca0411,0x3d2ad216,0xbd025949,0xbc75a1de,0xbd1890aa,0xbca79d5b,0x3b2c4e5a,0x3bf804bf,0x3c82b945,0xbc13df17,0x3c675f31, +0x3c8df082,0x3c1cdf39,0x399bfef5,0xbca48b70,0xbc1b03ec,0xbcc2d578,0xbcf6eee2,0xbcb8c911,0xbd815c19,0xbdbea250,0xbe0ebb29,0xbe02b28d,0xbdfa0fb8,0xbdff8059,0xbdeac02d,0xbdd2b68a,0xbdaa5378,0xbd991469,0xbd7ad44b,0xbd3c35e8,0xbd1cec56,0xbd0a876b,0xbd107cc0,0xbd7a38d3,0xbdc85142, +0xbdd3f54d,0xbd5f3a36,0xbd2eb597,0xbd27fb60,0xbd0aeb5c,0xbb1e80f9,0xbcaabd04,0x3c59f9a3,0xbc76cab2,0x3cebe656,0x3af6db53,0x3c5f3e95,0xbb28e7e6,0x3c022257,0x3c7b1165,0x3d07d0d6,0xbb61f2c6,0x3d2ff3d6,0xbd7d6cfa,0xbd89eea0,0xbd8ae851,0xbd948084,0xbd9ef80a,0xbdb03ba4,0xbdbaedc2, +0xbdaaac70,0xbd9d3ba5,0xbd8d5537,0xbd7b4ed4,0xbd5eeeff,0xbd42d3c3,0xbd5c010e,0xbd6a22df,0xbd67df27,0xbd500c61,0xbd288e28,0xbd386c28,0x3c86af77,0xbd1509ee,0xbd176e71,0xbc952a0e,0xbc34301a,0xbd0accc3,0xbd31e74a,0xbd34bfd6,0xbcbdb937,0xbd4f2016,0xbd52b26c,0xbd10fc74,0xbd29c732, +0xbcb33a8d,0xbd01188b,0xbd5b269a,0xbd27c31d,0xbdbbfce0,0xbd931b54,0xbda02d3a,0xbda09792,0xbda80506,0xbdaca848,0xbdb6e87d,0xbdadf9ee,0xbda9b8c3,0xbda6f0e0,0xbda26f8d,0xbd9e0e4f,0xbd95676f,0xbd930031,0xbd8f3949,0xbd8f392a,0xbd932d35,0xbd8f7c04,0xbdb0e060,0xbd2cde29,0x3c03856f, +0x3db7312d,0xbd67f1ff,0x3c050cfb,0x3dcb44a1,0x3dc50123,0x3db7fc79,0x3d9cc65c,0x3da5b596,0x3d9e2923,0x3d90a415,0x3bce3654,0xbd7c2a5a,0x3daa61db,0x3c648ea8,0xbdb718e3,0x3d61514d,0xbd3f50ec,0x3d944d3f,0x3d108a98,0x3d328907,0x3d136c53,0x3d58d0ff,0x3d6f22ea,0x3d763361,0x3d7ca346, +0x3d82ad45,0x3d84283f,0x3d890984,0x3d8a39cb,0x3d8e3244,0x3d894db4,0x3d859fd3,0x3d8106ef,0x3d78284e,0x3d4d364e,0x3daf8c73,0xbd035c1b,0xbdc33f9f,0xbe2326c5,0xbbb6f122,0xbdb69c35,0xbe16ab0d,0xbe1a78a2,0xbe184178,0xbe0ab0aa,0xbe18ba49,0xbe1b3f97,0xbe18997c,0xbdb6a263,0x3b81bb01, +0xbe19a402,0xbde37fec,0xbe1bf0f8,0x3c2fc61c,0x3ca0ef45,0x3bf11310,0xba2b9cf0,0x3d42a885,0x3d8ed7c9,0x3d96f213,0x3da34e70,0x3da3feda,0x3da1342d,0x3db3f5f4,0x3dc45c24,0x3dd2b81f,0x3dcd3373,0x3dc1ed00,0x3db97ff1,0x3d9e78d1,0x3da0b54c,0x3d806e43,0xbdccb0f6,0x3c153eec,0xbbcddbb1, +0xbc480dcf,0xbcc05d68,0x3c76aed5,0x3cb2dc0d,0x3c981f85,0xbc672974,0x3cd67ce9,0x3d24fb09,0xbb240be8,0x399d0e73,0xbd2e2b8f,0xbd3f3c08,0x3c2d50f9,0xbde781f7,0xbd4fcfcb,0x3c6dd085,0xbca97c1d,0xbd14912f,0x3d7f54b4,0x3dc75eae,0x3ddd2f9f,0x3de766c6,0x3df913ce,0x3dfc90d1,0x3e0fdd26, +0x3e157f17,0x3e1f7a4b,0x3e14332a,0x3e05f72c,0x3df7d938,0x3dbabddf,0x3dd185d6,0x3d1d3dbc,0xbcd731fa,0xbc21e0cc,0xbba542b0,0xbb04636a,0xbcdfdd0a,0x3cbf3a6b,0xbc82caf3,0x3d1a57d8,0xbcc13d89,0x3cd31f0e,0xbca2437e,0xbc96f35a,0xbce681d6,0xbcdfa8ff,0xbd863fdd,0xbd5f7fa0,0xbe3dd3fe, +0xbdf672b9,0xbd1e55bb,0xbdecfd13,0xbe19e549,0x3c643d9b,0x3dd15e6e,0x3df93da7,0x3e03f9e4,0x3de3feb5,0x3dc3e2e3,0x3e03db6c,0x3e283af5,0x3e445383,0x3e3b9cac,0x3e2c7936,0x3e21a6e7,0x3e040cda,0x3dfc82bb,0x3d8756f0,0xbd2e4d5d,0x3cd285cd,0xbce57257,0x3be33401,0x3c413e13,0x3cdbcb5a, +0x3cee0bd2,0x3cfe5f1e,0x3d2d9a06,0x3d0dcb43,0x3d237471,0x3b87fbd1,0xbc4af5a4,0xbd5cb568,0xbd86dbed,0xbd8aa1a2,0xbe1d2a6c,0x3e0b77ad,0x3e8a9aa0,0x3e81712a,0x3e9fbe64,0x3e945b38,0x3e71d591,0x3e1eafe7,0x3e883862,0x3eb6927c,0x3eee992b,0x3ee3c8dd,0x3ecf947d,0x3eb609a8,0x3e9fea48, +0x3e7f1f05,0x3e3b8f77,0x3ddba97b,0x3de48d1d,0x3d7b978e,0xbd503dc8,0x3cf22ec8,0x3b356c43,0x3c98f148,0x3c9accb7,0x3d022d28,0x3d3c354f,0x3d2bd571,0x3cbe2c9e,0x3c7862b8,0xbc2c581a,0xbd586f03,0xbc8848c3,0xbd67f327,0xbd51570a,0xbdcbe10f,0xbd98f95e,0x3e13228c,0x3eb75fc0,0x3e8fce13, +0x3e1d80f9,0x3e0023d9,0x3dee3a92,0x3d3049a0,0x3d474342,0x3d94762d,0x3d9ba27d,0x3e4f4960,0x3e86e011,0x3e94cb37,0x3e8878d1,0x3e7f47b2,0x3e6c56ab,0x3e45f656,0x3e32aee4,0x3db67b5d,0x3c2d07b5,0xb9d48285,0x3ac8065d,0x3cdd883a,0x3d108377,0x3ca10e68,0x3d226e0a,0x3d2f60b0,0x3cec5317, +0x3c9ad083,0x3bfc21ed,0x3c99891e,0xbcc9e84e,0x3c499239,0xbc8430ed,0x3d44d603,0x3e510026,0x3e72dc1e,0xbe203756,0xbe775db9,0xbe530c01,0xbce1e6de,0x3d85daed,0x3dae6142,0xbdd95da4,0xbe6858f3,0xbeaa2ca0,0xbe9588c1,0xbe7f1b3c,0xbe372662,0xbe34249e,0xbe24f5b2,0xbe10615c,0xbda6fb8e, +0xbd085af3,0x3cfa312b,0x3d34b721,0x3d2f92c5,0x3cdad36f,0x3c871818,0x3c46da9d,0xbc24d462,0x3cc128a6,0x3d149571,0xbc59991f,0x3d2d08ce,0x3d12e2a7,0xbb8f3c19,0xbb5ea7b1,0x3d465786,0x3d32df2c,0x3da915bd,0x3b90a269,0xbe733e43,0xbe0d4d20,0x3d15c57d,0x3e3e6866,0x3e01419e,0x3caba03d, +0xbda51963,0xbdf73801,0xbe33a1c3,0xbe4ee8e2,0xbe8e8edc,0xbea33aef,0xbea29c6e,0xbe84bb21,0xbe4ebe23,0xbe311673,0xbe05aaff,0xbdd1ed64,0xbd6c071a,0xbc152485,0xbc5b07a3,0x3c5005dd,0x3be22435,0x3c39095a,0x3ca1314f,0x3ce0bf40,0x3cd5d952,0xbc51f9bb,0x3ceebaea,0x3d0fc68d,0x3d0afd8b, +0x3ce9e8cb,0x3c808c01,0x3b2945f0,0x3ce9d4c8,0xbe64b5c7,0xbdb5ff3e,0x3e0a804c,0x3dc064d9,0x3db964f9,0x3e1eb3ba,0x3e3af5f1,0x3e1da99f,0x3e25bdd9,0x3e1436b7,0x3e027dd6,0xbc6c37bc,0xbdafe283,0xbdd547ba,0xbe2f3674,0xbe426381,0xbe399aaa,0xbe127818,0xbdbb0e1c,0xbd7544ed,0x3ac954da, +0xbc1ea889,0xbcd5b34a,0xbc3de287,0xbc8716a3,0xbb055ad6,0xbbcd98fe,0x3c14a1f4,0x3b8e8d0b,0x3ca3e4c6,0x3c2eb965,0xbb7d59a5,0xbcd8d591,0xbd21b4c8,0xbd5baddf,0xbe0d02f8,0xbe138792,0xbd88f18f,0x3ce8c6a9,0x3bfdb372,0x3d420df5,0x3d169536,0x3cacb265,0x3c970cf8,0xbc6227e9,0xbcd8e77c, +0xbd0955d4,0xbcd85271,0xbbc3570f,0x3cd98d59,0x3d080144,0x3cccab47,0xbc80ec34,0xbd49f0a3,0xbd79604d,0xbdad06ec,0xbdcf0f44,0xbd9cd4ca,0xbd94179e,0xbd4641b5,0xbcae4269,0xbbdaa905,0xbb6f7fd9,0xbb6338ef,0x3c47ca4a,0x3c833344,0x3c8034a2,0x3bca2dfe,0xbb989c0b,0xbc82de87,0xbd126309, +0xbd166620,0xbc3ff7f3,0x3c800a1b,0x3d152f49,0x3cdc67a4,0x3d242cb4,0x3caf0450,0x3cb39f14,0x3ce59f43,0x3bea8fc6,0xbbd17e6c,0xbcc8ad1d,0xbcdd54bf,0xbd0a5bad,0xbd1b6068,0xbd33cdb7,0xbd43fbb1,0xbd2747fb,0xbd26852a,0xbcbabd47,0xbd36063d,0xbd97012e,0xbd6fc859,0xbd50d6b5,0xbd168e3a, +0xbd231f70,0xbcbf480c,0xbcc24f52,0x3bd77fbe,0xbbf8a93b,0x3c3b02e0,0xbb7217cf,0x3c3781b1,0xbbab0dc7,0xbca47648,0xbd42468b,0xbca787a9,0xbdac2ea2,0xbb85aac6,0x3bcbe69d,0x3c303f4b,0x3ca6bcd3,0x3cefc256,0x3d0c0028,0x3d1b1d8b,0x3cca0392,0x3c5f2d72,0x3b565005,0xbbadbb4d,0xbc65db5d, +0xbcc2da03,0xbcb830f2,0xbcc4a607,0xbce269df,0xbd0756d7,0xbd132338,0xbd11a4af,0xbd7c9e3c,0xbcd74429,0xbd09bfc4,0xbd24c287,0xbd23626a,0xbcc6a4d9,0xbc6abd78,0xbcbbd0b7,0xbd12c326,0xbc3a50b8,0x3b9aab12,0xbc4c7bab,0xbbd7db0f,0xbcdd467f,0xbcc91af0,0x3b267939,0xbd5236f3,0x3cdea596, +0x3c35fa8a,0x3c81fa19,0x3c8d0fa5,0x3c9fe35e,0x3cbb4079,0x3cf3584e,0x3cce2f71,0x3cba5056,0x3c9e0f53,0x3c6642d9,0x3c14a79e,0x3b298f92,0x3ad40c58,0xb9282261,0xba6101ce,0xba886619,0xbb7e5a8a,0x3bc288af,0xbd660f9c,0xbdc29b55,0xbde9a87f,0xbd19c094,0xbdbee2e4,0xbdf41b48,0xbdf752c5, +0xbdeef404,0xbdde43d1,0xbdefb393,0xbdf32e5e,0xbde97e64,0xbdaeb285,0xbcc5a4a7,0xbdeec78b,0xbdc4a152,0x3c4663da,0x3d4c4573,0x3db27150,0x3d1ea3cd,0x3d46f079,0x3d5e5720,0x3d5a14b6,0x3d6b9026,0x3d75cf84,0x3d8aaea2,0x3d76c320,0x3d6a6407,0x3d5cb63c,0x3d5963af,0x3d556534,0x3d4d17d4, +0x3d49415f,0x3d40d4fc,0x3d337cf8,0x3d357101,0x3d331fd7,0x3cf978b0,0x3db2ae6d,0x3dc08c0f,0x3d326751,0x3da07e1a,0x3dbf777a,0x3d4cccb4,0x3d5c9345,0x3d60f8bd,0x3d498db4,0x3d7a2a3f,0x3d79a09f,0x3d67b77c,0x3dbb5e90,0x3d9eedc6,0x3d208dac,0x3dbc2c04,0x3d490d2b,0x3d8a768f,0x3d6a5e60, +0x3d908d2c,0x3d8f28cf,0x3da42c1a,0x3db24f85,0x3dd102b9,0x3db28f1c,0x3d9fffed,0x3d852ce4,0x3d68eef7,0x3d3f2973,0x3d1f1c6e,0x3d1602b6,0x3d170dee,0x3d066b54,0x3d22f45a,0x3cfa33ec,0x3d3f2615,0x3d9fc012,0x3d37b460,0x3d80b78f,0x3d38500e,0x3d4668ae,0x3d752ede,0x3d4decb1,0x3d772ce6, +0x3d885957,0x3d7497eb,0x3d4cc97e,0x3d3d9d23,0x3d403335,0x3d4d5065,0x3d53a5cb,0x3d2663d0,0x3d4cc4a6,0x3d7c18a5,0x3dc15d50,0x3dee464b,0x3de4ad78,0x3e041a95,0x3e07dc07,0x3e25fa5b,0x3e122d6d,0x3e0be97a,0x3df3f423,0x3ddd23be,0x3dc746dd,0x3da3905f,0x3d8ad57e,0x3d6917d1,0x3d137058, +0x3d31fecc,0x3c9887e6,0x3d361e9d,0x3d886ed4,0x3d0b1adf,0x3d1801a1,0x3cbbc593,0x3d05cda1,0x3d201734,0x3d17baa6,0x3caa53d3,0x3d2a3a7c,0x3d029413,0x3d3ff715,0x3ccaecca,0x3cf0957d,0x3cd4b290,0x3d07c9cb,0x3d34f09a,0x3cbd33b4,0x3dad2311,0x3de65408,0x3dfef31a,0x3df6bd34,0x3e0fb627, +0x3e24670d,0x3e47af4e,0x3e2ea80e,0x3e259e1c,0x3e010f40,0x3db6cf89,0x3d41b316,0x3c86ecf2,0x3be8d48e,0x3b47edd2,0xbc4cc320,0x3a2d9c00,0xbc62367e,0x3cab57bf,0x3d517ba5,0xb878a2ea,0x3cb425d1,0xbbb87524,0xba417e36,0x3c6bfc2b,0x3c9d2657,0x3cd92c79,0x3c3df5e8,0x3d154ff4,0x3cd68a0e, +0x3bbb1eb1,0xba1fb212,0xb97a2e0e,0xb8a04508,0x3c8d1f72,0x3e41b018,0x3e70fef6,0x3e637279,0x3ea3f610,0x3ead9458,0x3e9c9449,0x3e957a7d,0x3e91c5f3,0x3e955750,0x3e90b8dc,0x3e8278c2,0x3eb39b05,0x3ec2936e,0x3ec118b4,0x3e94680c,0x3e6dcb96,0x3e3e2244,0x3e155c0c,0x3d8e085a,0x3d82c390, +0x3d8a422f,0x3bef23c0,0x3cd15ba9,0x3c7c5fd0,0x3cdbe300,0x3d02a85b,0x3d10f684,0x3d01fef9,0x3c6a229f,0x3cab364b,0x3cdf5047,0x3d24aa96,0x3d912d78,0x3dc1e98e,0x3deb7878,0x3e070831,0x3e36b3ac,0x3dfe234d,0xbe2715b2,0xbe4f3fbb,0xbe4dc8c0,0xbcc3bc7d,0x3db1b792,0x3e27926e,0x3cbc612d, +0xbde024ff,0xbe553bcc,0xbe833b8d,0xbe8ccba1,0xbe710ed4,0xbe5c35b3,0xbe403bdf,0xbe4a9aba,0xbdf2666c,0xbdc040ca,0x3c9f6554,0x3dd3eea1,0x3d803fc1,0x3d77b8b5,0x3ca60fbf,0x3caa2419,0x3d060363,0x3d0998df,0x3d2022e2,0x3cca4db3,0x3cb0d23f,0x3c9af542,0x3c04e734,0x3cc7ca75,0x3d0e207e, +0x3d869f65,0x3d8c1171,0x3d71d0f8,0xbe1911ce,0xbdf80a69,0x3d1bf5b5,0x3e008c4a,0xbd49d42c,0xbe4d61fb,0xbe8110cd,0xbe6b673b,0xbe68ea6f,0xbe20301e,0xbe2a6b25,0xbe299db3,0xbe20f920,0xbe5c0730,0xbe4d3af8,0xbe1fbca7,0xbdb9fc4c,0xbdc26d8c,0xbd5d8d3e,0xbbbeac7c,0x3b57f618,0x3d51cefb, +0x3d088012,0x3d03fb2b,0x3cece752,0x3d1474db,0x3d244c22,0xbbf6589c,0x3d529eed,0x3d608c13,0x3cc8a43d,0x3d8dfc1c,0x3d3398e9,0x3dbdc749,0x3d6eb8b3,0xbdcbe3d0,0x3d7344f4,0x3e6e8b08,0x3e4dfe9a,0x3e151e32,0x3d8ca3a7,0x3dc2377f,0x3daf33bb,0x3e3155fe,0x3e6f5957,0x3e8cefeb,0x3e42fb51, +0x3e021e35,0x3dac25c9,0x3d02ef1d,0xbc9737d4,0xbd85270e,0xbda41f30,0xbda8c39b,0xbd65ccdf,0xbc98620d,0xbc847fd1,0xbcf097fa,0xbcd599ff,0xbc8abf1a,0x3c1ca3a1,0x3b3e6d01,0x3c95b5f5,0xbb1485fb,0x3cdd9c24,0x3cc0b948,0x3b77f232,0x3c12d04d,0x3c573c38,0x3c0b1696,0xbd7333b3,0x3dd26388, +0x3e1095f4,0x3de9dc22,0x3dd818f0,0x3d605028,0xbcd7a380,0xbd51fcb2,0xbb417dcf,0x3c164191,0x3cf89869,0x3d4c6f67,0x3e100f11,0x3e1dd990,0x3dadf63a,0x3dad84b5,0x3d8563b7,0x3d00dbd0,0x3b9f8d4f,0xbca1821a,0xbd40508f,0xbd77676a,0xbd814518,0xbd2534ad,0xbcb7ba48,0xbaf82dd0,0x3c1ebbda, +0xb9ef374f,0xbbacb176,0x3c1042b1,0x3cb55cf9,0x3d32cf50,0x3d8df8d8,0x3d282fda,0x3cac5183,0x3c891dae,0x3dbf5996,0x3ca79aa6,0x3dd6c92a,0x3d9908e8,0x3d798216,0xbc02ca6d,0xbc4419f4,0xbc91f114,0xbcc4db1a,0xbd014d40,0xbca3ec14,0x3c7e0c14,0x3cf2bf5c,0x3d4bd4e3,0x3d802420,0x3d294e69, +0x3c461ae6,0xbcb912fd,0xbd227715,0xbcd1d191,0xbc840c70,0xbd19d0d3,0x3aad989a,0x3cea4521,0x3bfee085,0xbbf982bb,0xbb62142d,0x3aef11de,0x3bdb4b75,0x3ab4c635,0x3b632b4b,0x3ba8f4bf,0x3c4080e3,0xba88af5d,0x3b4496a8,0x3be19f76,0x3c651462,0x3d1fa14e,0x39eac664,0xbc09e139,0x3c8328d7, +0x3cc56918,0x3cfd0b91,0x3cc7c6a9,0x3c8211bd,0x3c57170c,0x3b9521e2,0x3a19929c,0xbbd59b88,0xbc33d774,0xbc3f8c9b,0xbcbfc0ee,0xbd07a286,0xbd40f22b,0xbd018748,0xbccd8b52,0xbc45a3fe,0xbc09ed37,0xbc80dff5,0xbc5f5b53,0xbc2d2937,0xbc4807ba,0x3b66498a,0xbb3a8ac3,0x3ab64bd2,0x3c8e901f, +0x3b677183,0x3c7a7837,0x3c34d81f,0x3c8ec6eb,0x3cccd7ce,0x3d0bb599,0x3ce63645,0x3ca7a301,0x3b194fe2,0xbbe291dd,0xbbf052d0,0xbc515de7,0xbc94ade1,0xbca160c8,0xbc9e5172,0xbc8abfe7,0xbc6b3c62,0xbc811a22,0xbc94d75f,0xbcb3e2af,0xbcd420b4,0xbcd08078,0xbcbbebbe,0xbcb65870,0xbcc195ad, +0xbcdcff53,0xbce9f953,0xbd083f66,0xbcb50613,0xbb9e08df,0xbae89dca,0x3b37a094,0x3c63f68f,0x3c1459e2,0x3c969876,0x3cadcf79,0x3c50df81,0x3ab2d4ec,0x3c39eb03,0x3bbf685a,0x3c33a30b,0x3c7d87f6,0xbb2df28a,0x3d345cf6,0xbc515c27,0xbbf128a6,0xbc02ee14,0xbc1ccf69,0xbc0eb5f9,0xbc1b977b, +0xbc3d6450,0xbc3f5007,0xbc40e35d,0xbc264fe0,0xbbf9cff8,0xbb983dfc,0xbb0430a6,0xbb135a2e,0xbb4fc526,0xbb604219,0xbb6b1166,0xbb6cf66d,0xbbb73118,0x3cfe29c1,0x3d242280,0xb9605a3e,0x3d060668,0x3d480ff0,0x3c3753f3,0x3c7f657d,0x3c88ea89,0x3c825126,0x3ccf489c,0x3ceb7f85,0x3cf549f6, +0x3d5a06e5,0x3d0de3c6,0x3c806f9f,0x3d5d2b28,0xbb6f25a8,0x3ccbc48f,0xbb0eaf04,0x3cf015b3,0x3cdcf5a7,0x3ce57f23,0x3d1f5ccd,0x3d03d724,0x3d0069ce,0x3d0a221b,0x3ccdff4f,0x3ca791e4,0x3c90bc06,0x3c5e3b2e,0x3c419324,0x3c22f823,0x3c5234cd,0x3c65ed6d,0x3c6d9119,0x3c861b11,0x3c9d6259, +0x3c9ab0e4,0xbb92d5b2,0x3bc694d3,0x3d73ca04,0xbb9d5c31,0x3b661b49,0x3d6603b8,0x3d4df42d,0x3d483592,0x3d4bf31c,0x3d3fb109,0x3d3ca4f2,0x3d2f3cb5,0x3ae36449,0xbb906adc,0x3d5dce2d,0x3b90f30f,0x3cb80553,0x3ce9d35a,0x3d4e5755,0x3d605f8f,0x3d9d8316,0x3d5e252d,0x3d4dafa2,0x3d6a96fb, +0x3d28ecd6,0x3cfeb0ad,0x3cc167c9,0x3c175188,0x3a96e6a8,0xbb97030d,0x38722242,0x3a27bdbf,0xba6d0d52,0x3b049e03,0x3c2d32fd,0xbaaf87e1,0x3ca74f36,0x3c7e595b,0x3bb0d39d,0x3c836114,0x3c8bde03,0x3c7f6422,0x3c893243,0x3c0c4544,0x3b7db54d,0x3c6fe419,0x3caa56b5,0x3c843684,0x3ca6799f, +0x3cbd57a6,0x3c6d3f82,0x3c99f702,0x3cafc9b1,0x3d40a269,0x3d882862,0x3d90f636,0x3df50c37,0x3d9b4b7c,0x3d91e790,0x3db27b4a,0x3d4ce3ae,0x3cdc9323,0x3c3739a7,0xbc9bb790,0xbd027744,0xbd2eb8a2,0xbd0153e7,0xbcda3f22,0xbcd10572,0xbc46d50e,0xb9f62f27,0xbc1bee4d,0xb9e282be,0x3bfd6bf0, +0x3bbf78de,0x3b7ee927,0x3bbaf6e5,0x3cb6ee48,0x3c7af9bb,0x3cb2d084,0x3b324a4d,0x3cf8c72b,0x3cae4e54,0x3c0a7141,0x3c44e759,0x3c0becbe,0x3c4dd1cf,0x3cb301e7,0x3d36351b,0x3d91f19e,0x3de974a6,0x3e146b23,0x3e570eb9,0x3e052919,0x3df08af5,0x3e1752c4,0x3dd99e9b,0x3da27851,0x3d81d1b4, +0x3c0d57df,0xbcc1dd0e,0xbd420c53,0xbd23c968,0xbd2d1b1a,0xbd54929a,0xbd1c588e,0xbca0bdd4,0xbcd6da3d,0x3a8471ef,0x3c4538ff,0x3ba34c64,0xbad81a6c,0x3b95a666,0x3cd7c86d,0x3c9d6a7e,0x3cc8ffad,0x3ca8c419,0x3cffd1aa,0x3cf224ad,0x3c49e794,0x3cd3743d,0x3ce18dbd,0x3d2381bd,0x3d0f286b, +0x3d936503,0xbbb09a70,0xbd1dfd8f,0xbda54a28,0xbdcc5f6d,0xbdff7a1b,0xbe076056,0xbe2352c7,0xbe2504cd,0xbe2a48e8,0xbe30a12b,0xbe2da99f,0xbe34c2c2,0xbe3fc459,0xbe2ecb08,0xbe0e234c,0xbdadd28d,0xbd701c18,0xbd02e9c4,0xbc5ee4ab,0x3c65755a,0x3c82e8a2,0x3bbd057a,0x3bfdde7e,0x3c53fcec, +0x3cc70bd0,0x3cd2ef3f,0x3cc40c94,0x3c7c240d,0x3c4973c6,0x3cb00f3d,0x3d01b801,0x3bf17770,0x3c3ef736,0x3cdefa7d,0x3d4e13d1,0xbb23393b,0xbe0531f4,0xbe4f26df,0xbe2d3724,0xbe11fc17,0xbe4e98a9,0xbe747023,0xbe786d3d,0xbe1d11ba,0xbe0d2127,0xbe0a2eb2,0xbe609a87,0xbe889c4e,0xbe9e2ac6, +0xbe99a64a,0xbe8caa0d,0xbe5c302b,0xbe31c6c4,0xbde82bc6,0xbd9fd68a,0xbccbc159,0x3c183820,0xb98523f9,0x3b82842d,0x3be50d36,0x3cad14dd,0x3cd679be,0x3d0e8039,0x3cb2017b,0x3d0e8007,0x3d0d91a9,0x3cfea274,0x3d03d4a3,0x3c41a7ad,0x3c7f0ebd,0xbc87da07,0xbdfa52bc,0xbd866b6f,0x3c84f95c, +0xbd36b8e1,0xbda3572c,0xbdd1a57b,0xbd9bbcf7,0xbda8cb1b,0x3da8814f,0x3e2e3853,0x3e31c507,0x3df4eb37,0x3d6391bd,0xbd1749f8,0xbd211f5c,0xbd7351e0,0xbd891301,0xbdc9666a,0xbda7adf9,0xbd93a632,0xbd7259ef,0xbcca8fb4,0xbc2da451,0xbb67e738,0x3c587006,0x3d18e9b5,0x3d2e603e,0x3d2f4c02, +0xbb8ffe7b,0x3d2b8bf8,0x3d03ab5d,0xbac55189,0x3c206710,0xbc4aa320,0xbcde6adf,0xbd72be3c,0x3d6d9a3e,0xbc86fff3,0xbea131fe,0xbebbaaa6,0xbe80a238,0xbe670ae3,0xbe4c42c2,0xbe2c79be,0xbe58fc12,0xbe6e72de,0xbe6a4ba4,0xbdffef42,0xbd98bcaa,0xbdbffe72,0xbd385bcc,0xbccc6c49,0xbbea94b9, +0xbb9055f9,0xbc0eb004,0xbd3e3c23,0xbd7dec6b,0xbd523fed,0xbd69216a,0xbd1a5084,0xbc87a8af,0xbb0288b3,0x3c0b2b2c,0x3b5a1561,0xbc4f1a45,0x3c83b371,0x3cd2a7e1,0x3cdc5a2d,0x3c97a9e0,0xbbd643d3,0x3c67f561,0x3cf786dc,0xbc07418e,0xbe3a6ad9,0xbe74f9d8,0xbe3c8306,0xbe0501c8,0xbe08dcee, +0xbe08a273,0xbe243eb7,0xbe2cc40f,0xbe3a5783,0xbe511abb,0xbe388deb,0xbe0efb6d,0xbdb32374,0xbd7d3664,0xbd470acf,0xbd0a8d7d,0xbd4dc9dd,0xbd320087,0xbd185b9a,0xbd476ec2,0xbcb1d9e7,0xbc6ddf7a,0xbabb71c6,0x3bbc6fdd,0x3beb44b5,0xbbce1f20,0xbc215d0b,0xbc6b8e14,0x3b247485,0x3ae2655e, +0xbbd37c5a,0xbb032e79,0x3bc71501,0x3c88f13e,0xbd1789a4,0x3cdc360b,0xbdc7c4ef,0xbd9dc918,0xbd48d32d,0xbd164774,0xbd2cbe0a,0xbce33a01,0xbc48ca45,0xbc3f6cf2,0xbc59f1ce,0xbcaf99d8,0xbd062dd5,0xbd998250,0xbdf9257a,0xbe19ce16,0xbe043762,0xbd7f90f1,0xbc4489b4,0x3c1f6d53,0xbb5ad772, +0x3af32ee9,0xbae402cd,0xbcd6b9fe,0xbc84d6c8,0xbbef1339,0xba99939f,0x3baf889e,0x3c14f1d2,0x3bb19526,0x3ad94b77,0x3abac8f1,0x3b490e86,0xb9de5482,0xbc806ad1,0xbc9761bd,0xbd2b9c47,0xbd107ca0,0xb9679899,0xbb02500b,0xbceee1b8,0xbd3141f6,0xbd4ca7a8,0xbd6f4c2a,0xbd8e2c09,0xbd822c12, +0xbd6c05b0,0xbd616c8b,0xbd47c743,0xbd1c7eb1,0xbcf5c788,0xbc7ba1ac,0xbc3c7609,0xbc70f94f,0xbc835ab9,0x3b16f888,0xb9581bf8,0xbc8e1e5f,0x3bc7d907,0x3c887d3d,0x3c8a76d2,0x3c66f3c2,0x3cbd4ea8,0x3c31a9a1,0x3b8f03e4,0xbc83a339,0x3a6099a3,0xbb54b6ce,0x3adcbd93,0xbae6d1ff,0xbbf1a49b, +0xbc07c48b,0xbc4f3dd8,0xbc90dd2b,0xbd45b094,0xbd37c56a,0xbd542de4,0xbd59f257,0xbd6a90d7,0xbd7485b5,0xbd85f0c4,0xbd6d41e8,0xbd583883,0xbd37d8f7,0xbd1f2982,0xbd0f9221,0xbd05d178,0xbce88c9f,0xbcb0a6ce,0xbc1f44fa,0xbb64056a,0x3bc44098,0x3bc565af,0xbc851d63,0xbc7aefdf,0xbcf55776, +0xbc80658b,0xbcd4f433,0xbd1b2091,0xbd132a0c,0xbd22aeca,0xbd20b332,0xbd1652f7,0xbce65d08,0xbce7a461,0xbcfd5a9d,0xbce3a700,0xbd237b40,0xbd1a2646,0xbd7e2a0d,0xbd1e4c1b,0xbd17d867,0xbd272139,0xbd2b59d0,0xbd385e30,0xbd41b0ae,0xbd4ffb48,0xbd40c5ef,0xbd395003,0xbd343858,0xbd2e3988, +0xbd248f67,0xbd196f29,0xbd0c6c04,0xbd042e61,0xbcfcbe0a,0xbcec2cbf,0xbcdc40f9,0xbc8a1a89,0xbd342dc6,0xbd0d7480,0x3c7e7a55,0xbd660a4c,0xbd354c1a,0x3c833ccb,0x3c594125,0x3c3fdb6b,0x3c57f17d,0x3be8f999,0x3bb10f95,0x3b962645,0xbd35aba1,0xbd7e2cc5,0x3ca4d315,0xbd30512f,0xbd37e265, +0x3ce67419,0x3d971dbe,0x3d0f637c,0x3d24b3f1,0x3d2e47c8,0x3d2d5598,0x3cec6c57,0x3caeabfe,0x3c6c139b,0x3c75e01c,0x3c7ad390,0x3c8a7b42,0x3c91028d,0x3c9679fe,0x3ca7b0cd,0x3c984f8c,0x3c9a979d,0x3c9e48a2,0x3cb456de,0x3cb12700,0x3c8140a7,0x3d7956bd,0x3d5547f3,0x3c3cc3e4,0x3d72aad2, +0x3d64335c,0x3c9472e7,0x3ca3a3b4,0x3c9cbd86,0x3c80d7ee,0x3ccbd430,0x3cdb6398,0x3cc5ef11,0x3d69dda0,0x3d83263e,0x3c601178,0x3d7222fd,0x3d5d6d61,0x3d930039,0x3d857967,0x3d949b1d,0x3d92447e,0x3d3ccc36,0x3cf8f707,0x3c61bbfc,0x3be8aae3,0x3babe81c,0x3c55b4a0,0x3c91fe7a,0x3cb81359, +0x3cd6b06e,0x3ca074b0,0x3ca01149,0x3ca88008,0x3ce35315,0x3ca9bd34,0x3ce0651e,0x3cfe46a4,0x3cddf91a,0x3d1c2765,0x3ceacdb0,0x3d090ff1,0x3d2f4f4c,0x3d1aeecb,0x3d445826,0x3d4603a8,0x3d38dc00,0x3d031159,0x3cf07ff6,0x3d2830fe,0x3d32c7e5,0x3d3ff123,0x3d557ede,0x3db718ca,0x3dc16102, +0x3dc1dba3,0x3dd14cf1,0x3dd9304b,0x3d4a16c6,0x3c7ea198,0xbcd5a790,0xbd18cc39,0xbd24d195,0xbcf0ca27,0xbca8f7ab,0xbc86e283,0xbb6934f8,0xbc31e084,0xbc03fe8e,0xbb32bc4b,0x3c0f7315,0x3c093ef2,0x3c0f7e5c,0x3cd8314d,0x3ccf223e,0x3c8c0380,0x3cb9a7ae,0x3cfcb579,0x3d1671b7,0x3d0a44fb, +0x3cd2a719,0x3d18ce9e,0x3cce33cc,0x3d18d8e6,0x3ca9bbb8,0x3d1bdf0d,0x3d457f2f,0x3d5ec313,0x3d981641,0x3daa9bce,0x3ddf820e,0x3ddeacf7,0x3e080cee,0x3e1899cb,0x3db8f477,0x3d25280d,0xbcc87c47,0xbd52045b,0xbd876e14,0xbd22f4f0,0xbc1b26e3,0x3c66b07f,0x3cce3fcb,0x3bb71f99,0x3bd22851, +0x3c7da276,0x3d094a3b,0x3c8b2792,0x3b8efa73,0x3c3507bd,0xbbf1b03a,0x3bfb0c13,0xbb50f12f,0x3942521b,0x3c61d8ee,0x3c9e1251,0x3ca80623,0x3bf8bf85,0x3cdbe4d4,0x3ca467af,0xbbb0b386,0x3d07c9a1,0x3d6354e4,0x3d262cec,0x3d758a1d,0x3dc65de8,0x3b2df04d,0xbd28a085,0xbd388c2f,0xbc222862, +0x3bbddc8d,0x3c2c62c9,0xbb8f08d5,0xbca6f91e,0xbd03319e,0xbd4652ae,0xbe217e3a,0xbe4e74f6,0xbe5187ca,0xbe0f684a,0xbe01c13d,0xbe2b40c1,0xbdf933c8,0xbdac1989,0xbc79d2da,0x3c832781,0xbbe12cd5,0x3c0e4f56,0x3b971fa8,0x3c80ad2a,0x3cfb2e59,0x3ca5626b,0x3cb7dcc6,0x3cbb4ca1,0x3d1ca454, +0x3d019ddc,0x3c921b47,0x3c41b06f,0x3cb078e7,0x3d020bc7,0x3dd83f9a,0xbdc1a550,0xbd530751,0x3da745ed,0x3e0aaf0f,0x3e4cd1d7,0x3e89474d,0x3e9067c2,0x3e3e5eca,0x3e575a82,0x3e3fe527,0x3dda498e,0x3ddfe1be,0x3d9967fc,0x3b740f5b,0xbd08f65f,0xbcd08eba,0x3d2f622a,0x3c4dd569,0xbc38b9ee, +0xbcc8c545,0xbd402968,0xbcb89735,0xbc38345a,0xbbf2e26f,0x3b73e17d,0x3cb02041,0x3cd72c6e,0x3d15a391,0x3ceaabc4,0x3d45e81f,0x3d50a5a2,0x3d629d54,0x3d0668c2,0x3c8dd466,0xbc51482f,0xbd0312f8,0xbb454841,0x3d8e3c43,0x3d4cf182,0x3daca746,0x3e3deb36,0x3ea742c1,0x3eac480d,0x3e3fa065, +0x3dbc79fb,0x3d35c6c6,0x3d0baf35,0x3e04ddf9,0x3e35284d,0x3e3bec2b,0x3e3c74bd,0x3e16c2e4,0x3dc352ac,0x3d5ac881,0x3d3e126b,0x3c340440,0xbac7f888,0xbc0244d8,0xbc12d102,0x3b99bacd,0x3c670dd3,0x3d31d102,0x3d10cc47,0x3d02b6da,0x3b5d44aa,0x3cfe3635,0x3c9b4739,0x3c0b5509,0xbc34a3f8, +0xbc3c9546,0xbceb2117,0x3a5828f1,0xbcf677c8,0xbba5b9c6,0x3e342b50,0x3e8dd1e6,0x3ec0343f,0x3eab204f,0x3e73d1fa,0x3d94baa6,0x3dbff79b,0x3d98908c,0x3da9de1a,0x3d3e065a,0x3d370b91,0x3d985e81,0x3d7622c6,0x3d7411c1,0x3d7ff65e,0x3d48112a,0x3d2844b9,0x3c5554b7,0xbcfdcede,0x3b92a8ef, +0x3c479bfc,0x3c7596d7,0x3cb62eb2,0x3cda117a,0x3c93e57a,0x3c3761ff,0xbc0375bc,0x3c6f8a4b,0x3cabb7f8,0x3d2d883d,0x3c7e441e,0x3cb1e63d,0xbc1673b3,0x3c37cc0c,0xbd5954e8,0x3e09f015,0x3e7a4a41,0x3e696035,0x3e94cb33,0x3e8c24c6,0x3e798402,0x3e2496fa,0x3e25d78d,0x3e2afa0d,0x3e5dbfec, +0x3dddcad8,0x3d620783,0x3d78d567,0x3c8ab03c,0xbb6228dc,0x3b501e9c,0x3cd641e4,0x3d5a4a28,0x3d747883,0x3ca3b19a,0x3d2def69,0xba1f7179,0x3bba5be2,0x3c8a31e6,0x3cf42798,0x3c9a27d0,0x3c8c7299,0xbba5c0e6,0x3c75939d,0x3c853752,0x3c8f0fa0,0x3c20d0e3,0x3bb08858,0xbc88c8a1,0x3cfc02df, +0xbd933bbb,0x3d5679b9,0x3dca1382,0x3dc4ea85,0x3e03f2af,0x3dd8d660,0x3d8d8033,0x3cb52cbd,0xbc9bccd5,0xbd575d83,0xbd8a23b7,0xbd5d3fc4,0xbcba38f2,0x3bd151f2,0x3d2dd831,0x3d7912bc,0x3d852977,0x3d796a1a,0x3d67e84a,0x3ccb46df,0x3c30e7b6,0x3d028b1c,0x3cc4757a,0x3d0d99b1,0x3caf78aa, +0x3c713aa5,0x3c3eca96,0x3c1d7a60,0x3cafe971,0x3ca20918,0x3cbc0e75,0x3cab2975,0x3c9c87be,0x3ce40e6c,0x3c189bb0,0x3cf3593a,0x3d77d7be,0x3d732a09,0x3d7be84b,0x3d868bd0,0x3d9ba158,0x3d621602,0x3d35589c,0x3d1395bf,0x3d1d164f,0x3d1d0a48,0x3ceb9669,0x3cc07461,0x3c300cc8,0xbc153f42, +0x3aa1dfa3,0x3c386ebf,0x3ccd62c5,0x3d0a0f60,0x3d4065b7,0x3d67ea31,0x3d1e1cc9,0x3cba7848,0x3c626aba,0x3ca0c7b9,0x3c920caf,0x3cb1a567,0x3c623745,0x3d08eeaa,0x3c7ad36f,0x3cde862e,0x3c6923b8,0x3cdf3306,0x3cac1089,0x3caf0987,0x3c1e6978,0x3d170827,0xbd361ee8,0x3d7a940d,0x3d64d1fe, +0x3d5ba804,0x3d52dafd,0x3d4f9e29,0x3d4bcd60,0x3d3e9c69,0x3d124942,0x3ccdba82,0x3c942a5b,0x3c39b83c,0x3c077d3f,0x3b50f88e,0x3c14fc47,0x3c2af78a,0x3c326270,0x3c655bf0,0x3c3dfd92,0x3cb42033,0xba2ef452,0x3cfcc440,0x3d14ec6b,0x3c89b0b2,0x3c90a84c,0x3d0dbd77,0x3d268726,0x3d36d388, +0x3d075011,0x3d4da04c,0x3d569da6,0x3d10614a,0x3d2b26f9,0x3ca1ebbe,0x3cc7608f,0x3d47aeec,0x3d01265c,0x3d93f66d,0x3d4fb068,0x3d60e56b,0x3d592a39,0x3d5ade7e,0x3d5a4361,0x3d613cfc,0x3d503d88,0x3d44345b,0x3d346649,0x3d20b62c,0x3d0aa438,0x3cdc2950,0x3ceccc5a,0x3cf9049e,0x3d031062, +0x3d0ba9ae,0x3d0a4e93,0x3d2911e6,0x3cb8d74b,0xbc54997a,0xbda31e04,0x3d2649db,0xbbd98df9,0xbdabe709,0xbda9a5cb,0xbda4af6b,0xbd991d3a,0xbd9dffc9,0xbd9c245f,0xbd91f512,0xbb9ba982,0x3d5f9e85,0xbdb34599,0xbc782f08,0x3d74353a,0xbdc9ee38,0xbd68a4a4,0xbdf21b92,0xbdb944e1,0xbdd5a643, +0xbdd81a70,0xbde297eb,0xbde12f40,0xbdd9787f,0xbdcb8e2c,0xbdc405a3,0xbdbf1f66,0xbdbe025c,0xbdbe12b4,0xbdc205bd,0xbdc13331,0xbdc07dd7,0xbdbb947c,0xbdbed71b,0xbdaea259,0xbdd581e0,0xbd76ab0a,0xbbc6f176,0x3dc455f5,0xbd9b9782,0xbc0f2c12,0x3db801c4,0x3db467e3,0x3db04982,0x3d9b1f73, +0x3da4fa69,0x3da3e69c,0x3d98012d,0xbbf778e6,0xbdb48d5f,0x3dc62699,0x3bf94bfd,0x3d80a31e,0xbe05b584,0xbe110c5b,0xbe1e5462,0xbe234d5a,0xbe2d39d6,0xbe2c2dd1,0xbe205c5d,0xbe0b70e4,0xbdf7e642,0xbde9a76e,0xbddda8dc,0xbdde3637,0xbde66e78,0xbde1cbf2,0xbddb2a8d,0xbdcdf747,0xbdce470a, +0xbdc3de5c,0xbdc59ee4,0x3c374891,0xbd6885eb,0xbd6c9b13,0xbd15f03e,0xbcced51d,0xbd52003b,0xbd61f09d,0xbd7e3974,0xbd2dfa05,0xbd82f2f1,0xbd89c52f,0xbd441c52,0xbd6c94dc,0xbcf562d7,0xbce64c9f,0xbda15321,0xbc3803c4,0xbdc08582,0xbe383c57,0xbe33056c,0xbe488bfd,0xbe5e6205,0xbe5e2e0d, +0xbe4dde90,0xbe253c2d,0xbe0e4033,0xbe03cfd2,0xbdf67e44,0xbdf435e0,0xbe01c9cc,0xbdf828fc,0xbdec8a1a,0xbdd232f8,0xbdcba3fa,0xbdcc16dc,0xbd88e247,0xbd3df1e9,0xbd1c8450,0xbd08624f,0xbcf411da,0xbb5ac3d5,0xbc94b502,0x3bf667b9,0xbd05f547,0xbb87b834,0xbc98e315,0xb82b35d7,0xbcbdcb06, +0xbc2dacb5,0xbc3f0f40,0xbb436c23,0xbd43b4ff,0x3c65eba4,0xbe173ea8,0xbe90fd40,0xbe95eac4,0xbea0ebbc,0xbeaead78,0xbeb14a89,0xbea2e98b,0xbe775a3c,0xbe3dbb46,0xbe294f30,0xbe15b5ee,0xbe19d4fe,0xbe216282,0xbe0ec0ea,0xbdf9e373,0xbdd4096d,0xbdd8b5ee,0xbdbde503,0xbd8e9188,0xbcc3dd2d, +0xbd28aba4,0xbc685f96,0xbca491d1,0xbbf250a9,0x3bc40b59,0x3c253e16,0x3caf8f01,0xba9c6239,0x3c933f35,0x3b9c1e5b,0xbc5dcad8,0xbc994b23,0xbc476c1b,0xbca413d1,0xbd32c768,0xbd908753,0xbda699b2,0xbced689f,0xbb4b0dd3,0x3d01d6af,0x3d5469c5,0x3d3657e7,0x3ce6df7d,0xbd8b3896,0xbe0c9e1c, +0xbe40c43f,0xbe3982e8,0xbe291c8a,0xbe1a5caf,0xbe389c03,0xbe311254,0xbe004910,0xbdc5cb94,0xbdbe24f0,0xbdef0507,0xbd69eb35,0xbd52b340,0xbcfa29aa,0xbca291c3,0xbb4ce9c3,0x3cd35f2a,0x3bec3424,0x3c39f008,0x3cb1dbf4,0x3c88f38f,0x3bc3a87e,0x3aeac75c,0x3c277265,0x3c80acde,0xb9d53a2c, +0xbd1ba0b0,0xbba6daed,0x3d80b649,0x3d7aa025,0x3d0ebaa5,0x3da31df5,0x3c86a5d8,0x3b914611,0x3d10cecd,0xbd064cd4,0xbd16d7e6,0x3c142090,0x3bb01bdb,0xbb617d31,0xbc1b838d,0xbc611c68,0xbcfc182d,0xbd7826d4,0xbdb6e626,0xbdd44a68,0xbda0d5a3,0xbd835c3e,0xbd82790b,0xbd2a44a3,0xbce3af3d, +0xbc1ee0a2,0x3cc43117,0x3c8bebbc,0x3ca048b6,0x3c6c771a,0x3d16ae91,0x3d2654a8,0x3c6f9289,0x3b8a1c58,0xbca0deb6,0xbcc5ea53,0xbc2b50e6,0x3d43c6f3,0xbb01a694,0x3c4a3566,0xbd051a7b,0xbe56e662,0xbe748fa2,0xbe8d7c24,0xbe7b2c86,0xbe36984f,0xbe112598,0xbdbab7d7,0xbdf8fe41,0xbdffd4d2, +0xbdbbdbb1,0xbda5f5b6,0xbd41133b,0xbc15a698,0x3cf7dbb1,0x3cd85da0,0x3bd93959,0x3c003361,0xbafe846f,0xbc04fc1d,0xbc5ad8b5,0xbb0115a1,0x3d1c65bc,0x3c395de6,0x3bb5e1e8,0xbb243eb6,0x3c9d7d74,0x3c7a50d2,0x3cb029f5,0x3beb6cc2,0x3c4f1d76,0x3ce4626e,0x3cf461b0,0x3ce1b4d2,0x3db6fa19, +0xbc412c8e,0xbe097e09,0xbead76b0,0xbe2f298b,0xbd6ba2fd,0x3d3dcf7b,0xbc2f1cbc,0xbca7bfdd,0xbbc970a2,0xbd2f4d1d,0xbd27c27b,0x3b5d9d72,0xbd01d32e,0xbd41c212,0xbd5182fe,0xbd579fba,0xbcfc22f7,0x3c3c5dd8,0x3cf81349,0x3cd3588d,0x3d390004,0x3cb576bc,0x3ca0e7bd,0x3d406cbe,0x3bb8aad6, +0xba9db5b4,0xbc2327a4,0x3b2d8e80,0x3c181011,0x3caaebb0,0x3bf6f806,0xbbe6638c,0x3c8fdfdf,0xbb5e75d8,0x3dd900d7,0xbc506ae8,0xbe6c558d,0xbe6c220a,0xbe59977d,0xbe1ee6f6,0xbe0e7009,0xbdd2d6a6,0xbe12f71e,0xbe1f2f93,0xbe2db1fe,0xbdca4192,0xbd986f1a,0xbdd1dcf8,0xbd1bc939,0x3a945987, +0x3cf53dcc,0x3d3ca335,0x3ccde16d,0x3cb5119f,0x3cdd7499,0x39a43b70,0x3cac5a18,0x3c63cd17,0x3c8843f3,0x3ca5d486,0x3ce6c235,0x3cc06770,0x3ba9a4b1,0x3b770248,0x3c058c81,0x3c94a6b1,0x3cdfde14,0x3ce1aa8a,0x3d1e2f65,0x3cbb3075,0x3d86a1b1,0xbd4ce3cd,0xbddc98be,0xbd85b3c4,0xbd69d2b6, +0xbd2945b5,0xbd2dc17d,0xbd6e358f,0xbd207cce,0xbd0874dd,0xbd168a70,0xbd4c6fbc,0xbd5f12e9,0xbd809a19,0xbd0132a7,0xbcb995d8,0xbc2a0fb5,0xbc3314b1,0xbc3f67a0,0x3cc09a01,0x3d2b1dd9,0x3cacba95,0x3d094370,0x3c6c7f80,0x3c1a24e2,0x3bb20b90,0xbb5f4d54,0xba7fe906,0x3bcffda0,0x3bf83304, +0x3be1c1f2,0x3a60eaaa,0x3c8cc3f0,0x3bff9acf,0x3bb85f07,0xbcc0ff4e,0xbbe5a4bd,0xbd23f4ed,0xbd60fcdc,0xbd2449fd,0xbd3fab70,0xbd279ff4,0xbd202499,0xbd169d96,0xbd179d8c,0xbd243d3a,0xbd0e3bf4,0xbcbea463,0xbc32f67d,0x3ade0351,0x3b99a534,0x3c477a98,0x3cb7d933,0x3c7806cc,0xbb93fffc, +0xbb74d8e4,0x3c982992,0x3c0f5726,0x3800732b,0x3a7bac06,0x3c4874c5,0x3bcbeeed,0x3cbd9b49,0x3c157cca,0x3d146408,0x3c048cdb,0x3c8c8430,0xbb84ba4e,0xbb70062d,0xbafd6342,0x3c171922,0xbc4f8ab6,0x3db555bf,0x3bfdc447,0x39f1d0b9,0xbb0f1967,0xbc0af3da,0xbc544cd1,0xbc923488,0xbcaf8d62, +0xbc3f5cb4,0xbacff2b4,0x3b694689,0x3c12b966,0x3c5cf55d,0x3caa0468,0x3c8aad0c,0x3c5d4127,0x3c1d1f26,0x3c13088a,0x3c424869,0x3bcde982,0x3ccf5f68,0x3b5b73d3,0x3bf6e716,0x3c915629,0x3c947a95,0x3c38af49,0x3bd40645,0x3bf9ac31,0x3cb0e440,0x3bdf10e9,0x3a187719,0x3cab713a,0x3c78230e, +0x3d109d2c,0x3d146fab,0x3c2bfb93,0x3cd40921,0xbcbdd6ca,0xbc073780,0xbc575957,0xbc62c29f,0xbc781ab2,0xbc868846,0xbca57561,0xbc7ee3d0,0xbc536bb5,0xbc0c0d10,0xbb8b754a,0xb9d7f5d1,0x3b8db813,0x3b116b49,0x3ae54385,0x3a6478a4,0xba779b7e,0xba9060e5,0xbc261967,0x3c9e1558,0x3d4ee22b, +0x3d9ec676,0x3c5a526d,0x3d5e5538,0x3dafc18c,0x3db31490,0x3db2e3c2,0x3da7d0b2,0x3db70e4f,0x3dba84c8,0x3db5b09d,0x3d6ac411,0x3c0d32de,0x3db76601,0x3d840c40,0xbc60e5ea,0x3cc3fc61,0xbd62345a,0x3d1def08,0x3bf8697f,0x3c6a8e75,0x3c78bd88,0x3cf9a3e1,0x3d0f6d85,0x3cfbf4ff,0x3d078cd1, +0x3d029a8b,0x3ce886d6,0x3ce04407,0x3cd71f2a,0x3cd24e95,0x3cdfaa2d,0x3ce7a5bf,0x3cf71b6e,0x3ce39b5d,0x3ca80d93,0x3d4ce35f,0xbd331624,0xbdc411d1,0xbe16042b,0xbc93570c,0xbdb27477,0xbe0bcf6d,0xbe0fa321,0xbe0ee485,0xbe036a4f,0xbe0fe86c,0xbe1149fd,0xbe0da750,0xbdb83345,0xbc6c507f, +0xbe11ac2c,0xbddd9cfb,0xbe0ecd89,0xbc8a5d61,0xbc05d0eb,0xbbb1acde,0x3bce3125,0x3d425560,0x3d775b4a,0x3d3e178f,0x3d6adaab,0x3d4de2e9,0x3d12f54d,0x3cf0f7a7,0x3ce96a6f,0x3d010cc4,0x3d1eecf8,0x3d249801,0x3d31acaf,0x3cfff133,0x3d0c5734,0x3cde89cc,0xbdc9ad6f,0xbc2d79ae,0xbca7eecf, +0xbca407ee,0xbce41173,0x3a17cf09,0x3ba11a4e,0x3ac60c62,0xbcbff6f3,0x3be2d33f,0x3c8653e6,0xbc80e1c2,0xbc84b48b,0xbd593341,0xbd71df80,0xbc64fb08,0xbdc91a29,0xbd54a835,0xbc68b838,0xbd03898f,0xbc862be6,0x3d76b098,0x3db1cf32,0x3d833a39,0x3db3f01f,0x3d9d1e02,0x3d673ea2,0x3d378a92, +0x3d21a2c5,0x3d26b959,0x3d49738b,0x3d578d74,0x3d7e624c,0x3d1700b5,0x3d47de1e,0x3c131696,0xbd1d46b6,0xbcc3850c,0xbc6fe77e,0x3a08fa14,0xbc966e10,0x3c9dab12,0xbca16aad,0x3cd42639,0xbcc5da65,0x3c6e23ba,0xbcd070b5,0xbc8fe705,0xbd0b9084,0xbd32a766,0xbd9be385,0xbd7654b7,0xbe273f30, +0xbdfa8f3c,0xbd3f6ed7,0xbd74c810,0xbd078bdb,0x3db7aea2,0x3e0bf25a,0x3de3c1fe,0x3e167e68,0x3df7d2eb,0x3d8c1321,0x3d1a2a62,0x3d0eeaa1,0x3d4b0a45,0x3d8e3b26,0x3d9760fc,0x3da41a51,0x3d4415ef,0x3d3f510c,0x3c80fd25,0xbd53a3a8,0x3ad3c9f0,0xbd050c18,0x3bb14b1e,0x3c59c319,0x3ce521a8, +0x3ca3a65d,0x3c5b5bc1,0x3ce19c48,0x3cb6cecb,0x3c9bcdd4,0xbc281d60,0xbd041277,0xbd905e0c,0xbdae76ab,0xbd9f4997,0x3cb32797,0x3e7c7c31,0x3ea4c191,0x3e65ecd9,0x3d04d0f1,0xbbbdbdfc,0xbd902689,0xbe11d383,0xbdb37010,0xbd58caa7,0x3b92b09a,0x3d428f91,0x3d70c069,0x3d038ba7,0x3d6ef337, +0x3d803668,0x3d941a05,0x3d370948,0x3d7e16a9,0x3c94ea22,0xbd679d22,0x3c0afafa,0xbbc753d9,0x3bd30c3b,0x3b82c537,0x3ca6e07c,0x3c3a7846,0x3c4cbbb7,0x3caa56af,0x3abc86dc,0x3c09bd48,0x3ce5369f,0x3d1f53b4,0x3c485d71,0x3d03e33b,0x3b2c314c,0x3d813bfc,0x3dc7f3aa,0x3d59965e,0x3c9314ea, +0xbd440ee9,0xbd7e7f17,0xbdbf3b6d,0xbdbaf1a7,0xbdd62180,0xbda0fcf2,0x3cebd91b,0x3cd0da28,0x3d58d0c5,0x3db2e096,0x3deffef1,0x3dfccf20,0x3df31b8f,0x3dc6b975,0x3dc81d6b,0x3c46cf16,0xbd16c78c,0xbcc1f530,0xbc9ed80b,0x3c5f0556,0x3cb0597b,0x3d131537,0x3ca4b6be,0x3c87ab91,0x3c7412bf, +0x3d210e25,0x3d0c34d3,0x3cc15b54,0x3c178f01,0x3d58b868,0x3d799083,0x3db4c0dc,0x3cb4b9eb,0x3d8b0f85,0x3beae11d,0xbceb9954,0x3ca74590,0x3d951ee0,0x3e1acfa2,0x3e61a42c,0x3e07fb3d,0x3dbbf4eb,0x3dadae69,0x3d654145,0x3d535e96,0x3d31ee6f,0x3cf0627f,0x38aeab21,0xbd0c52d6,0xbc555734, +0x3c9df6c3,0x3cd801e2,0x3ceb4d6d,0x3d0cb43e,0x3c83b843,0x3c36f92b,0x3c8aa8df,0x3d5c74c9,0x3b6baada,0xbb08fc08,0x3b9605c7,0x3cd3139a,0x3cff0a16,0x3d377119,0x3c74505f,0x3cea5bb7,0x3cbcac06,0x3d08f9b7,0x3cf1237e,0xbd2a8e9b,0xbd466bac,0xbc29201b,0x3dd3ac6c,0x3d851ada,0x3cb2599a, +0x3c885246,0xbd395c33,0xbdc10bd4,0xbe06d5a4,0xbdd77555,0xbdad0b70,0xbdb4a828,0xbcaded1f,0x3c7f87f9,0x3cd1c4c4,0x3d0b3b07,0x3d0780a5,0x3c966a1a,0x3bb9b870,0x3c4edace,0x3ca88d09,0x3c87357b,0x3ccc5e7c,0x3d53b45a,0x3c69eea4,0xba0fe549,0x3b7ae84b,0x3afd0589,0x3c811848,0x3d5ac1e1, +0x3c9d4c72,0x3cb4353f,0x3c62991e,0x3d2a60a4,0xbdad6254,0xbd1dc3a7,0x3d91da9e,0x3d2719fe,0x3c7c8d46,0x3d85f43b,0x3da9195e,0x3d595c0a,0x3bd61654,0xbd06c9ad,0xbd711b15,0xbd8d6779,0xbd5a8fcf,0xbccc8a04,0xbd00d9fb,0xbd06b25c,0xbcd9b33a,0xbce50409,0xbbe8cc0f,0x3ba74e09,0x3c49c8be, +0x3ccc85dd,0x3c935edb,0x3c997376,0x3c76318e,0x3ca0fb43,0x3cabda75,0x3cd669d7,0x3c81b4bf,0x3c8c280f,0x3b997cae,0xbabf6600,0xbaffb2f1,0xba67456e,0xbc6e0630,0xbcfe5f76,0xbdabd3e4,0xbd5940ed,0xbc012a42,0xbced5e4f,0x3b81af45,0x3b2278a0,0x3d0954b0,0x3dae0a0c,0x3d4e4c17,0x3cb5b681, +0xbc2e8876,0x3b294db3,0x3c1841e2,0x3cc25f5a,0x3cdbd8ea,0x3cd92fdc,0x3cac1e4a,0x3c31fafe,0x3b8c969a,0xbc14d370,0xb6c39caa,0x3b21b088,0xbc215539,0x3bfc10a0,0x3c87e05c,0x3c457607,0x3c867085,0x3c750090,0x3cbfcf04,0x3cbc8fde,0x3ca8dcac,0x3c9c4f7e,0x3c932b90,0x3c8ba50d,0x3b1fa2ba, +0x3b5fddc5,0xbd071ccd,0xbbbe5399,0x3ccea70a,0x3c714936,0x3cc5de7c,0x3cd65bb5,0x3d07d205,0x3d275b4c,0x3d1e42ad,0x3d3e60ae,0x3d49a963,0x3d0d21da,0x3c9ca6bf,0x3bc25654,0x3c22bec4,0x3c53f749,0x3ca88de8,0x3c954ad6,0x3cd1972f,0x3c558d55,0xbada0e29,0x3bcb290b,0x3c3c9bad,0x3c50f42b, +0x3ba70ef1,0x3c9e2ff9,0x3bd95c04,0x3cafdf6e,0x3b070281,0x3c3c851d,0xbbad8e25,0xbb6f39d0,0xbc306d69,0xbcb8ee88,0xbd12ef5f,0xbcbbf373,0xbcadb383,0x3b945647,0x3c6307ed,0x3c972f62,0x3cdd3711,0x3d0de680,0x3d273313,0x3d3b6147,0x3d29ce49,0x3d0e6cbf,0x3d049476,0x3cf85b62,0x3cf8f0e7, +0x3ce19067,0x3cedd847,0x3ce8e781,0x3ce82ecf,0x3cd6ef94,0x3ccef405,0x3ce1b036,0x3c2a02e2,0x3ccfb46f,0x3cac2d5b,0x3cb33d19,0x3c972ef6,0x3cbf49be,0x3cc9f9fc,0x3c8f8b4e,0x3b849ebb,0x3c7d1c88,0x3cb7e97a,0x3c1c098e,0x3c51e7c8,0x3b47ec45,0x3aa31960,0x3c589448,0xbc686bee,0x3cab189f, +0x3c896916,0x3ca016ba,0x3caea749,0x3cb66e11,0x3cc590f3,0x3ce54a22,0x3cdd3033,0x3ce233bd,0x3cda8aba,0x3cd7f07d,0x3cd2f0b0,0x3ccedd0a,0x3cc4fd29,0x3cbb129d,0x3cb3000a,0x3cb563c5,0x3ca7f53a,0x3cd886ed,0xbb19a81d,0xbca21068,0xbca73996,0x3905e7ef,0xbcc49da0,0xbcd34725,0xbcebc093, +0xbce55e66,0xbcbbad78,0xbcf43632,0xbcfeb1a5,0xbcf6def4,0xbcf92809,0xbbd802fa,0xbcb05bc4,0xbd05b92d,0x3c86f4f1,0xbc018aa5,0x3d388a8b,0xbc51f39b,0xbb851ee9,0xbb567227,0xbbab8a5f,0xbc3f656b,0xbc783bdc,0xbc9183f2,0xbc89ac7c,0xbc7e6f55,0xbc4961c8,0xbc3ba4e4,0xbc26619e,0xbc1b7800, +0xbc0554da,0xbbf66f69,0xbbe50f98,0xbc01350f,0xbbdfd457,0xbca19805,0x3d350594,0x3d771fe3,0x3d039383,0x3d11fb63,0x3d7ffaac,0x3d1db228,0x3d2a70f5,0x3d2bbcd7,0x3d130665,0x3d4168d0,0x3d4126c9,0x3d326816,0x3d676b41,0x3d03cc5e,0x3cbebecd,0x3d6fab5f,0x3c8be972,0x3ccbc5d0,0x3ca1d5ac, +0x3ceb8b19,0x3cb75092,0x3b341781,0xbc349dab,0xbcb08311,0xbcd7bacc,0xbcd80ac1,0xbc9de5a7,0xbcadc2f6,0xbcabf019,0xbca8e8ef,0xbc9a9e69,0xbc702cf6,0xbc2c391a,0xbbf7003c,0xbc72e21e,0x3b169aaf,0x3d2fb0fb,0x3bde8608,0x3cbddfda,0x3c8646ef,0x3cb888c2,0x3cc1dc5b,0x3c49ebb5,0x3ca51658, +0x3d113b2a,0x3c7bcd0d,0x3b4b912e,0x3c2d3dd5,0x3c2b5fe0,0x3caf48b4,0x3c8daacc,0xbaa02468,0x3caa9d18,0x3cd8001b,0x3d2d6f06,0x3d2f7ce7,0x3cf8edba,0xbc85fa89,0xbd21db6f,0xbd665d76,0xbd61fa94,0xbd3b751a,0xbcc867e2,0xbc8efd04,0xbc3c673c,0xbc2d66f0,0xbbd88d94,0xbb714e76,0xbb85bd49, +0xbb98f02c,0xbcaa14c7,0x3c1fffba,0x3ce553a0,0x3c287618,0x3c7d349d,0x3c6e934f,0x3cef98f7,0x3ccacf69,0x3cc91b5f,0xbacdd7da,0x3d0c350b,0x3bababea,0x3cd6e7ae,0x3c188445,0x3c3f8e9b,0x3b9e79bd,0x3c63ded2,0x3cbf92da,0xbb284242,0x3dad0b3d,0x3dfda721,0x3e09e523,0x3dee01a1,0x3d28407d, +0xbbd879d5,0xbd500f05,0xbd8cf3a5,0xbd92c087,0xbd3f17fd,0xbd342320,0xbd2cf374,0xbd362426,0xbd2c64b2,0xbd0187ab,0xbc92b30d,0xbc8be4f6,0xbcd8b42f,0xba653ef8,0x3c11f3d7,0xbca106b8,0x3bada722,0xbb508e03,0x3b1f5b64,0x3c923eab,0x3c4b77f2,0x3c545560,0x3ba14067,0x3c9f1896,0x3af9871e, +0xbc41485a,0xbb9d9d0c,0xbb04e87b,0xbbbb49d9,0xbc09eda9,0x3e7966d9,0x3db33ea5,0xbd60ad75,0xbd3cdc8a,0xbdf39cb0,0xbe0e2146,0xbe023497,0xbd9ea340,0xbb4fb583,0x3d8336c2,0x3df1bbbe,0x3e065e58,0x3e1791f8,0x3e2f9a80,0x3e1545e9,0x3ded0685,0x3d96737c,0x3d268eac,0xbb0ed175,0x3ca08fdd, +0x3d08db13,0xbb91203d,0x3b90046c,0x3c0ac37c,0x3c768f11,0x3cb98ce4,0x3bba760e,0x3c0821c8,0x3c9e74f2,0x3cd9b16d,0x3d33db31,0x3d82941d,0x3d397d4a,0x3d9095ff,0x3dc29b8c,0x3e3ba276,0x3d8cab6d,0x3c0b27c5,0xbcd2dfac,0x3ca05771,0xbab9f679,0x3e3781fc,0x3e6d32ee,0x3e573dbd,0x3e11caf4, +0x3d895878,0xbcdab340,0xbd12d51e,0xbd417a81,0xbd91bb9b,0xbd877556,0xbd9f20f2,0xbdde8e54,0xbd2332c5,0xbcb11a5d,0x3ce93a8d,0x3d814ef3,0x3d20efde,0x3d091190,0x3c4d9ac2,0x3c315fac,0x3d10680c,0x3cbf2c11,0x3cb178cb,0x3c2bd4b5,0x3d0186c2,0x3d0a8785,0x3ce7fd40,0x3d650bc6,0x3d5d2a65, +0x3d82aa76,0x3c95faec,0x3d7326bf,0x3ad2981a,0xbcbf4ae5,0x3d5657b7,0x3da62401,0x3daad79d,0x3d58460c,0x3d1dbe83,0xbd1a5f0e,0xbd8fbf20,0xbdb3dc5b,0xbdb5de59,0xbdc41684,0xbde2de9d,0xbdb838be,0xbd5fd605,0xbc39a839,0xbb13b189,0xbcb328eb,0xbb688dc3,0x3bd37b3e,0x3ac2cb32,0x3cd899c4, +0x3c6bd97e,0x3cb9e20d,0x3d949c93,0xba867418,0xbc77f119,0x3be0d031,0x3c9263ef,0x3d073315,0x3d96053f,0x3d39e353,0x3c22a558,0x3d807d32,0x3d332dbe,0x3be7565e,0x3d204d1e,0x3e08b8ab,0x3e212fb5,0x3d16397e,0x3d5220f0,0x3d346d1a,0x3adf3fb3,0x3d8516a9,0x3da6afe1,0x3d74145e,0x3d883481, +0x3d9050cf,0x3d972742,0x3d454141,0x3cb8621a,0xba8df03c,0xbc6ae0ca,0xbcad0e9d,0x3c07e5c7,0x3d15392c,0x3cacc968,0x3bc3c962,0x3c8ee3b8,0x3cb8687b,0x3d4ea161,0x3c816dff,0x3c6ef3c5,0x3cbc3681,0x3b1700d4,0x3bd25198,0x3cd8b64e,0x3ca3c102,0x3c845f1a,0x3c53a72e,0xbbfe9517,0x3d8b43cd, +0x3dd0ab9d,0x3dd187c9,0x3dbb3989,0x3cb88908,0x3cc9543c,0x3c00b77c,0xbbf6a269,0x3cb98738,0x3d1fb1ec,0x3d68d0ab,0x3d7356cd,0x3d6e711f,0x3d9a7220,0x3d6b5746,0x3d3350a7,0x3c35a5fd,0x3c6e86b4,0x3c5b4016,0x3c318d31,0x3ca089c9,0x3c0d2005,0x3c133a3c,0x3c442669,0x3c148eaf,0x3c2c7ad4, +0x3c48615c,0x3bd67e13,0x3cb9a159,0x3c81bc75,0x3cd03a6f,0x3d1f3f72,0x3cd559e7,0x3cca5f55,0x3cbf4edc,0x3d81aac7,0x3d525e51,0x3db2ddb4,0x3cd53952,0x3b2d3497,0xbc9a8aeb,0xbc90f2e0,0xbd0680c9,0xbd7ae10f,0xbca3551a,0x3ba153c5,0x3cea2b17,0x3cae9f16,0x3d0ee8a9,0x3d79ef28,0x3d7c1635, +0x3d45da71,0x3b9f18e5,0xbc4660ea,0xbc595fc0,0x3c215a72,0x3bf04a40,0x3c7d088c,0x3cffe621,0x3cacd0ad,0x3c67951f,0x3c8ff7b8,0x3c9ce4cf,0x3cb4d9d4,0x3bc92cd8,0x3ca7b355,0x3cd2fae4,0x3ceda175,0x3cba235a,0x3cefc82e,0x3d133cc9,0x3d563205,0x3cdfd0c5,0x3b63fd1b,0xbae8e61e,0x3c95aa97, +0x3cc38f1d,0x3c8ad5c7,0x3c25357f,0xbb2fe3cb,0x3c006cf0,0x3c3eceab,0x3ca02ab3,0x3cb2217c,0x3cbbdcd9,0x3cb5d6e1,0x3c2bd0da,0x3b7d92b4,0xbb606ea0,0x3b825a07,0xbbe29861,0x3b5444f1,0x3ccc5349,0x3c92ae2b,0x3ca01886,0x3c920f96,0x3cc2e6d0,0x3c91e490,0x3cb4eec4,0x3bf681c1,0x3cd1c514, +0x3c03cd69,0x3c84008f,0x3c27622c,0x3c85152b,0x3cc370ca,0x3cf0f565,0x3cbc2692,0x3cd07f12,0x3cb7b619,0x3c3f4726,0x3bb0e377,0xbb09df5b,0xbc0f5b94,0xbc6aa993,0xbc9dd602,0xbc9427e7,0xbc8b1611,0xbc8142b0,0xbc681694,0xbc46b5f5,0xbc08d4af,0xbc0ce955,0xbc060bef,0xbc2f0f24,0xbc418439, +0xbc7f4d0c,0xbc6de233,0x3cdd54d0,0x3c23b72b,0x3cbb6254,0x3ca06f4f,0x3cfb354f,0x3cef4622,0x3cd4fc83,0x3d0a5f4b,0x3d2cf40b,0x3d055cd3,0x3ceb8c0b,0x3d05118f,0x3cfdf301,0x3ce99189,0x3ceddee3,0x3caa59ec,0x3d1089b1,0x3bf8a898,0x3bf59b43,0x3bd0d45a,0x3b814568,0x3b5674d1,0x3af64f1f, +0xba7248d5,0xba0e4488,0xba68e957,0xba891118,0xba7afc50,0xba50f8bd,0xb90b4be6,0xba56549f,0xba86885b,0xba41bd10,0xba4aa7f6,0x3a91df6e,0xbc10536c,0x3ce2c824,0x3d19643c,0x3cdb3678,0x3ce07359,0x3d2c3ec6,0x3cf4a2a9,0x3d001c2a,0x3cea02c5,0x3cb81957,0x3cdfac91,0x3cd31558,0x3cc943b0, +0x3d2991b1,0x3d0871c7,0x3c6abb5e,0x3d21b4de,0x3c2859fe,0xbc8f7d7a,0xbd56e6ba,0xbc8a6ca8,0xbcb4c86e,0xbcd5e0dc,0xbcd7a555,0xbcc9e5a5,0xbcb6c583,0xbca2ead3,0xbc8ac6a4,0xbc813f1c,0xbc6a9590,0xbc87019b,0xbc8cde1e,0xbca28564,0xbc82e92a,0xbc72510f,0xbc55f362,0xbc63c807,0xbc53716a, +0xbbe4870d,0xbd501e25,0xbd3cd688,0x3ba6e352,0xbd41d06c,0xbd4080b5,0x3b6420e5,0xbb565d0a,0xbb89cfdf,0xb9af10b7,0xbc0f9990,0xbc380b7d,0xbc4377a2,0xbd42a5c9,0xbd42fae8,0x3b9abaad,0xbd3d1601,0xbc0cde94,0xbd0c306c,0xbd27af65,0xbd68c2ad,0xbd795d7c,0xbd8239de,0xbd691d0b,0xbd3a1d7d, +0xbcfdf09e,0xbca7733f,0xbc6f5b32,0xbc934244,0xbcb529dd,0xbcf209dd,0xbcaa3b07,0xbc8d089c,0xbc47d83c,0xbc858fa3,0xbc00739c,0xbca8590a,0xbcd05837,0xbc70ce67,0xbcf0d44b,0xbc680643,0xbc794a46,0xbc8f6032,0xbc8b5646,0xbced8115,0xbd0959b5,0xbcdf9840,0xbc7878f9,0xbc8d7143,0xbc801afd, +0xbc72e4ef,0xbc80753c,0xbc8633bc,0xbc464969,0xbce3670b,0xbd8f6776,0xbd9de122,0xbdae6534,0xbdb301a4,0xbd967878,0xbd5db65f,0xbcf3b9f8,0xbc860f78,0xbc363311,0xbc9854cb,0xbccefed0,0xbd28d860,0xbcacc817,0xbc70a112,0xbb994a9c,0xbbdb33ea,0x3b784a61,0xbc30973c,0xbcbbaf6b,0xbc3b76cb, +0xbc17caed,0xbba37427,0xbbde4b41,0x3bed6e54,0xbbac7bd4,0x3b0b8a9f,0xbc8ab99b,0x3ace9862,0xbc376496,0xbbed8ff6,0xbbbf8304,0xbbfe7932,0x39999406,0xbc59dd14,0x3d3885a9,0xbcc6e6ab,0xbdfc0eb4,0xbe14c340,0xbe2b63b5,0xbe3b6cce,0xbe27462a,0xbe0251e7,0xbd8e141a,0xbcaded8d,0x3a0a559b, +0xbc1ee2dc,0xbce95d1f,0xbd64fde9,0xbcd8cfcc,0xbc62a1e4,0xbacb6a1e,0xbc1c5f60,0x3bde8aa0,0xba832718,0xbc5ae2f4,0x3c91d151,0xba9ef33f,0x3c43c0c1,0x3c88c6e1,0x3d150b38,0x3c8731f8,0x3c3a8fc0,0x3c552e16,0x3c0918a1,0x3c084231,0x3c39b66e,0x3c958ea8,0x3ce9ce53,0x3d2d42bb,0x3cd9919f, +0xbd9401dc,0xbe062a16,0xbe063698,0xbdddf774,0x3c921fa8,0x3c70a2cd,0x3d350884,0x3dcd40aa,0x3d23edeb,0x3cad722d,0x3c9c37de,0x3bfc16e1,0xbbfa0484,0xbcefb638,0xbd865bcd,0xbd664686,0x3c3bf5db,0x3c538016,0x3d075cfe,0x3ba1a1a3,0xbc41b036,0x3c9bb0a4,0xbc3607cb,0x3bf1057a,0x3bec9ec5, +0x3c9f8b6c,0x3bc7d1b8,0x3c28c8ff,0x3ce6359f,0x3d03da68,0x3cf32110,0x3baf6c6d,0xbc952144,0xbc943f38,0xbcc2f688,0xbd0a39d0,0xbb841782,0xbc883293,0x3d020944,0x3ce6b0f5,0x3ce20bf4,0x3ba43ec1,0xbc8f3a7a,0xbcd5371f,0xbd4098f1,0xbd99d8ce,0xbe155f5f,0xbe28c249,0xbe2ad9b8,0xbe1f72ab, +0xbdec4f67,0xbdbcd922,0xbd8fefff,0xbd825b66,0xbcf23677,0xbcb181e2,0xba857608,0x3c6d010b,0x3b89f3a1,0x3c88bfae,0x3c7e8cd3,0x3d08214a,0x3ca5fd80,0x3c817ed5,0x3b3d3141,0x3cf21ef1,0x3cf8269b,0x3ccad736,0x3d1d3835,0x3c9f9f19,0xbab3beca,0x3b9d1a39,0xbd235f62,0xbd592b65,0xbcb5e15d, +0xbdbb22b0,0xbe6664e4,0xbe62f533,0xbe399a40,0xbdc2fa20,0x3c1818dd,0x3d41492f,0x3ce2fc98,0x3bf54363,0xbce620b2,0xbd823f5b,0xbd9d6e73,0xbda44205,0xbd870bdf,0xbd5adc4b,0xbcdfb359,0xbcc414be,0xbcd3b60c,0xbc2ab46e,0xbc5028a4,0xbb7fe29d,0x3c670950,0x3d84a02c,0x3bd585f4,0xbc1edcf1, +0x3a598fcc,0x3b9cf890,0x3c86a0df,0x3d576d45,0x3ae2a8d9,0xbca6c61a,0xbc91fade,0xbd114a8f,0xba816f66,0xbcde9c3e,0xbe1bccdb,0xbe6a7f32,0xbe996620,0xbe68e347,0xbe399b11,0xbdec5e34,0xbe2fc6a7,0xbe265e18,0xbdf4ab46,0xbd6cac06,0xbc919403,0x3bb17d59,0x3c50b45e,0x3bff0bb4,0xbbc009aa, +0x3c3a03df,0x3cad9286,0xba8df909,0xbbbe1c7d,0xbbdaa1bf,0xbbf09f04,0xbba7a5a1,0x3b1b4e24,0x3d1a73e5,0x3c6a8e02,0x3b5d6eb7,0x3caaff41,0x3b09eab7,0x3b8fa06f,0x3cac1e32,0x3c191aff,0xbc054f3d,0x3b5b2d43,0xbc134125,0xbbdacf0e,0xbdf931b8,0xbe44ce2f,0xbe3deb93,0xbe5a43ab,0xbe308201, +0xbe0efc94,0xbdb4dda2,0xbdbb38fe,0xbdcf08c5,0xbe0c05a1,0xbdd4311a,0xbd9b8fee,0xbd7d9388,0xbcd2e6eb,0x367b8f96,0x3c843fab,0xbad279a3,0xbc589194,0xbc7d6cf5,0xbc91ace5,0xbc20bb62,0x3c3238d7,0x3c0e72cc,0x3be52524,0x3bbcfb19,0x3b9d232c,0x3b95b1a1,0xbb2ef643,0xba7a7cda,0xbad75db5, +0xbaecbffc,0xbb9d7fb1,0xbb6f6b62,0x3c0d5bf2,0xbd221c36,0x3cc4650a,0xbd5e35b8,0xbd9b4f41,0xbd8ae5ca,0xbd84749e,0xbc90dd50,0xbbea2bf1,0xbcca2694,0xbc80a61e,0x3b188a8a,0x3cc5c3be,0x3be9f3bf,0xbcb1fe7d,0xbd68d890,0xbd5bf687,0xbd27355a,0xbcc48afe,0xbbcb10ee,0x3b3b7be0,0x3bd8fe48, +0x3aeec06a,0xbbc3d84e,0xbc62ed10,0xbc152682,0x3b718abc,0x3c1bab23,0x3bf771f8,0x3c0585d1,0x3c18dfdc,0x3c6b9afd,0x3c4bce1c,0x3b2ea41b,0x3bbbf7fb,0xbbd7147e,0x3a181300,0xbcf8ce11,0xbd25ce39,0xbd1aa1f0,0xbd02c490,0xbd048fc6,0xbd08a0b9,0xbd0ec0ee,0xbd0e5d14,0xbd046e48,0xbd2a9014, +0xbd64bad4,0xbd88c57e,0xbd3329dd,0xbc812bb3,0x3c39366f,0x3bfd0b9b,0x3a51d58a,0xbc0f5a7e,0xbc852911,0xbc8ecc95,0xbccf6324,0xbc99240d,0xbb0a8cd4,0x3c128dae,0x3c2b7075,0x3c39a998,0x3c0be389,0x3c0e647f,0x3aeb5b90,0xbbd66a24,0xbb02149b,0xbb460a1c,0xbb82aa62,0xbbf2e2ca,0xbc57c0e8, +0xbc4f9bb1,0xbcc5d8bb,0x3c9f36f8,0xbbda3355,0xbbbc28e9,0xbc5a6d59,0xbc84c318,0xbc9ca38e,0xbcae7b6d,0xbcc02131,0xbc93c451,0xbc13624e,0xbbabf6d8,0xbb72b3db,0xbc09beaf,0xbc138ff0,0xbc467cc5,0xbc2e63a8,0xbbe5c3df,0xbba5c9e8,0x3ac954ff,0xbb875d22,0xbc6f5e28,0xbc3255a4,0xbc9cb02b, +0xbc298374,0xbc42d70e,0xbc553bd6,0xbc20a7ca,0xbc6c93bb,0xbc29360e,0xbbedc510,0xbb56fb3c,0x3bb2a9b9,0xb99afd2f,0x3bc909e9,0x3aedf58c,0xba2b36ed,0xbcc24667,0xbb92d229,0xbb7fa3de,0xbbcb77b3,0xbbd21db8,0xbc01cc1c,0xbc179dd3,0xbc40e5d9,0xbc2ed2ba,0xbc3c0500,0xbc2f035d,0xbc2af6b6, +0xbc0f6d88,0xbbfdd216,0xbb9d3bc9,0xbb51daf4,0xbb183304,0xbb185a80,0xbadeef97,0x3b6fe540,0xbcc04644,0xbca589bd,0x3c4408d1,0xbcb72d66,0xbca76677,0x3c827788,0x3c7d8962,0x3c8caf49,0x3c987e2a,0x3c8875d4,0x3c8d333d,0x3c884040,0xbc81ac81,0xbcc24b1d,0x3cb012ad,0xbc6190d5,0xbad5b7bf, +0x3d2364cd,0x3d292da9,0x3d0b46b1,0x3d0673b0,0x3d23abc2,0x3d2f41ef,0x3d51596f,0x3d535b43,0x3d3cb0e2,0x3d39a685,0x3d2f4b85,0x3d1bb350,0x3d1a3c12,0x3d158004,0x3d17070b,0x3d137753,0x3d137916,0x3d10e776,0x3d19149f,0x3d0be29e,0x3d1a82dc,0x3d4214e9,0x3cac133d,0xbd4a8718,0x3d5cf2c8, +0x3cd3c205,0xbd264c55,0xbd2164d7,0xbd20bdcf,0xbd1a9c9f,0xbd10045d,0xbd0916ae,0xbcf7008a,0x3cd7ad34,0x3d5f497f,0xbd2f563b,0x3c8da59c,0xbbd6fd83,0x3cb3586b,0x3cac022c,0x3d11a666,0x3d3bd2c1,0x3da26cf9,0x3db6d098,0x3d99f97a,0x3d92bb19,0x3d76cf7b,0x3d441e05,0x3d44b009,0x3d4585df, +0x3d4915c7,0x3d3e6be2,0x3d392d24,0x3d2bfa95,0x3d3cf70b,0x3d1d3df8,0x3d3727fd,0x3bc7cc2c,0x3ce78ce5,0x3d10efa3,0x3ccbaa20,0x3cc84e82,0x3d274152,0x3d1519a2,0x3d31ec25,0x3d149e26,0x3d2723cd,0x3d103933,0x3cefee17,0x3cfd9693,0x3c8b7264,0x3cbe0504,0x3d0374d3,0x3a7f4764,0xbc2a122c, +0x3b6ebd75,0x3cdeb275,0x3d3c989c,0x3df2a271,0x3e05faa1,0x3dc88541,0x3dc4d2b0,0x3d94932b,0x3d37e43d,0x3d1ee621,0x3d06cd82,0x3d1b5494,0x3d0da49f,0x3d12412c,0x3d087285,0x3d226b20,0x3d171904,0x3cf877c1,0x3d0f5e81,0x3cdb10ab,0x3c8a41d2,0x3ceec63f,0x3ce4ef14,0x3d0d7b27,0x3ca0d491, +0x3cd39500,0x3cb1eaca,0x3c8d3169,0x3c875588,0x3cc3212e,0x3c9d705b,0x3c9cc8f0,0x3c205606,0x3bfe0933,0xbd1ae044,0xbdb32743,0xbd835f21,0xbcefdff9,0x3c8e3a5d,0x3e280d1d,0x3e518b35,0x3e2529e2,0x3e1937bb,0x3de0b397,0x3d7ba65e,0x3d787d61,0x3d8394cb,0x3d89fe71,0x3d732633,0x3d60e257, +0x3d472759,0x3d7c1100,0x3d1b4806,0x3d030176,0x3ccd0873,0x3c3bd535,0x3c31418b,0x3c830f60,0x3c9e465b,0x3ce571bd,0x3c990de6,0x3bf0e000,0x3bd9e2a8,0x3c57e136,0x3c57a6f7,0x3c327416,0x3c426917,0x3c35ca71,0xbc03695c,0xbc002ed7,0xbccddcca,0x3da7cd61,0x3e023c98,0x3dd98a3b,0x3db451e9, +0x3d30879b,0x3c9cf6c9,0x3d05fed8,0xbb3f6492,0xbd02038d,0xbd5ffde8,0xbd9c6bb3,0xbdb0ffd2,0xbdc97ffe,0xbcb41402,0xbc239b77,0xbd7ca8c6,0xbcdad296,0x3b283410,0x3d88088d,0x3d371c0b,0x3cace90b,0x3cbd6016,0x3cabc47e,0x3ca66f47,0x3ccb9f83,0x3c631600,0x3c827e56,0x3cdebb6f,0x3ceb3c3b, +0x3c8e2195,0x38f95c2b,0xba20ac6c,0xbc44c003,0xbc23ad44,0xbce62a4b,0x3d063243,0x3d676cd2,0x3dfa4b03,0x3dfd8a1f,0x3da3cba4,0x3d6af147,0x3d464d6d,0x3d0d2c90,0x3c8b5266,0x3ccbd95c,0x3d61d8dc,0x3d7b6901,0x3d8caa54,0x3dac1c2e,0x3d8952a1,0x3daec296,0x3e05e5bc,0x3dc7eeff,0x3d862140, +0x3d32e97f,0x3c7def07,0x3c9ee9d2,0x3c7bb65c,0x3c9966ac,0x3cb4b60a,0x3d195836,0x3c713caa,0x3c4341cd,0x3c746665,0x3d07a668,0x3d042822,0x3d0cd42e,0x3d134718,0x3d57f0ad,0x3d32b259,0x3d83d203,0xbbe9c7a4,0x3d8428a2,0x3dca2695,0x3d878fd4,0x3dd2261b,0x3e066527,0x3e1b031d,0x3e2333e5, +0x3da55cfa,0x3d89ba17,0x3da6de3f,0x3e03a5c2,0x3e22f4eb,0x3e2613fd,0x3e02ef22,0x3d93764f,0xbb7e9856,0x3b89ec47,0x3c4cc5d5,0x3b8d7b33,0x3c51aaf3,0x3bff5118,0x3caba1d0,0x3caeb543,0x3cbd4d7e,0x3d72470e,0x3c862865,0xb91dd403,0x3b585df2,0x3ba84770,0x3c833ff0,0x3d5149e5,0xbba26c83, +0xbb027909,0xbcfc51a9,0x39caec3a,0xbb083b72,0x3c472113,0x3de3f204,0x3e392b65,0x3e9de70a,0x3e273a9b,0x3d98a361,0x3cb6225b,0x3d001dfe,0x3d336c68,0x3d8c8a16,0x3d9325d1,0x3d9a22d5,0x3d88d093,0x3da697f5,0x3db2e4de,0x3d9a6c13,0x3dbda4c2,0x3d9b2b1b,0x3d0d336a,0x3bec7d33,0x3c57d780, +0x3c4c5762,0x3c8dc9ca,0x3cbe6961,0x3d1f0ffe,0x3c1aff7c,0x3b320293,0x3cbf132a,0x3c2ce9be,0x3c44b87e,0x3d10c028,0x3c20e77f,0x3ce2f4b5,0xb94df927,0x3cc70847,0xbd0d96d4,0x3db48e95,0x3e4627de,0x3e2db16f,0x3e23dc07,0x3dfda794,0x3dfc1481,0x3e0402f4,0x3e0409af,0x3dfec8fa,0x3e0ad162, +0x3da38ee9,0x3d5808cf,0x3d45d1a7,0x3ce87392,0x3c70db0e,0x3c1db0a8,0x3ca2c2df,0x3cc3624e,0x3cd2d433,0x3c597d4e,0x3ccc597b,0x3bee43dc,0x3c4e3086,0x3c8d4b87,0x3ca4246e,0x3ca031b7,0x3c882d03,0x3c0293a2,0x3c51350e,0x3c802cdd,0x3cb36ee8,0x3c533d99,0x3bf2d41e,0xbbb927ad,0x3ceaef48, +0xbd271228,0x3d542c13,0x3db4813f,0x3d715bdc,0x3d22e872,0x3d217ffb,0x3d3273b4,0x3d87df81,0x3c4e9d43,0xbc5ee626,0xbca02c7a,0x3c6fb0be,0x3d08cd72,0x3d14fd23,0x3ce26002,0x3cd7f0cc,0x3cec6ac6,0x3cf38199,0x3d037de8,0x3c7c9db6,0x3b841576,0x3c66d45f,0x3c8cafbc,0x3ce2db27,0x3ca22806, +0x3c14c70c,0x3c37aefc,0x3c3843f2,0x3c52508d,0x3c685e35,0x3c60f562,0x3c8ef78b,0x3c22b8a5,0x3caecafc,0x3cae4677,0x3d2000d0,0x3cadb959,0x3cabc7f0,0x3ccf5c5d,0x3caa4633,0x3cc5660f,0x3d15d504,0x3d4502e1,0x3d87f744,0x3d78fb25,0x3d70835a,0x3d389045,0x3cdeee6e,0x3c0f9d1a,0xbbb727e5, +0xbb64af8b,0xbb9831da,0xbc039e90,0xbb6d2aa0,0x3bc55bea,0x3c5615e6,0x3ba2df79,0x3b5d7443,0x3b3dd7ec,0x3bf14235,0x3bf0c3c7,0x3c89de5a,0x3c0c2222,0x3c8cc364,0x3c1969ba,0x3c8a5423,0x3c6e4929,0x3cc2a6c8,0x3cc6337d,0x3cb10331,0x3c89dc77,0x3cb3a0c2,0xbc7cf28c,0x3cec8f63,0x3cfffaa0, +0x3d22c321,0x3d3444d2,0x3d484607,0x3d5648ad,0x3d680665,0x3d350a1e,0x3d0af7c7,0x3ce345bc,0x3cbb5313,0x3ca1110e,0x3c5a4f88,0x3c7dcb0a,0x3c85ea25,0x3c8ecb06,0x3ca217cf,0x3c886829,0x3cb8b784,0x3b4b4427,0x3cc547b1,0x3cf2d234,0x3caa3cdc,0x3cb8f9a9,0x3d08d32e,0x3cf8cfa5,0x3d08237a, +0x3cc2f226,0x3cdc2b82,0x3caeda6e,0x3c5645cf,0x3c69061e,0x3be7af45,0x3c571031,0x3cb4ff1d,0x3d1c727e,0x3d26b6e5,0x3d12aebc,0x3d23cdac,0x3d2ac727,0x3d33b6c1,0x3d3b5058,0x3d4d572e,0x3d3bac78,0x3d32056a,0x3d21ff18,0x3d109694,0x3cfc9150,0x3cd1082f,0x3ce04185,0x3ce6ecb8,0x3cebeb22, +0x3cf35209,0x3cec8d92,0x3d087604,0x3d11e4b3,0x3c8c7167,0xbce9696f,0x3d33da64,0x3cab3c9f,0xbcd94e82,0xbcd25e00,0xbcccfea4,0xbcbaca82,0xbcb9377e,0xbcb03438,0xbcadc2d1,0x3c7a5869,0x3d2c5a0e,0xbce48e6a,0x3c5caac8,0x3d3ba765,0xbd5ad131,0xbcd8d1d5,0xbd8065ca,0xbd3dd23c,0xbd5bb311, +0xbd603149,0xbd846483,0xbd87850d,0xbd7b564e,0xbd7b7e4d,0xbd742a60,0xbd690fa2,0xbd625751,0xbd5d1182,0xbd5919de,0xbd58809c,0xbd57635d,0xbd57eb09,0xbd55d360,0xbd3c9152,0xbd8019bc,0xbcca3c34,0x3c918c2a,0x3db01566,0xbd163466,0x3c7838f8,0x3da878c5,0x3da60063,0x3da2b093,0x3d938c50, +0x3d9b7a20,0x3d9b72f4,0x3d96b4ce,0x3c4bdbac,0xbd3627f4,0x3da0249a,0x3c905ed3,0x3c9c1cc0,0xbd753cfd,0xbd4328d8,0xbd4f657a,0xbd5c4c70,0xbda684d8,0xbdbfd13f,0xbdac14d6,0xbdb530db,0xbda7dd5d,0xbd969c4c,0xbd886c73,0xbd80614a,0xbd7cf969,0xbd80719f,0xbd7f35e1,0xbd80e907,0xbd6ad190, +0xbd5d9480,0xbd67cbaf,0x3cf27deb,0xbcd5328b,0xbcd6aa1b,0xbc17f386,0xbabdc1f7,0xbcbfe433,0xbcda08d7,0xbd02f376,0xbc86da4b,0xbd0c3a37,0xbd13cc51,0xbc8754e7,0xbcd3f357,0xbbe907c0,0xbc802815,0xbd4e0292,0xbd344672,0xbd68dbfa,0xbd612cf6,0xbd880bbc,0xbd9da653,0xbe01012a,0xbe135d0e, +0xbdf63a25,0xbe04c351,0xbdf4ccc3,0xbdcff96f,0xbdb7c5b2,0xbda2234f,0xbd99b2d7,0xbd96091b,0xbd923eaa,0xbd92f557,0xbd73fa35,0xbd765e49,0xbd167ef9,0xbc7990cf,0xbc5caa90,0xbc707495,0xbbd70cd1,0x3c401bc9,0xbc05b789,0x3c63975f,0xbc83b0d3,0x3bb75419,0xbbfe1c82,0x3c03dd61,0xba690cf1, +0x38b106f6,0xbc140758,0xbc453cca,0xbd28103b,0xbd93bf3d,0xbd879ce6,0xbd2a9249,0xbd368156,0xbd3c0dde,0xbdfc0fb6,0xbe305cff,0xbe1d7f68,0xbe337cd5,0xbe20c141,0xbe029e9c,0xbdd5397f,0xbdc13b2e,0xbdbc6001,0xbdc03637,0xbdb435c5,0xbdaed9b1,0xbd8aae3f,0xbd6787a1,0xbd339034,0x3aba039d, +0xbc9a7e66,0xbb0be4a9,0x3a6f0532,0x3c52029d,0x3c8a78e3,0x3c42c319,0x3c50ccae,0x3b6b79c5,0x3c3dcc3c,0x3b88a2d4,0x3b192fb4,0xbb9d25be,0xbca2b385,0xbcdf7b0d,0xbd8f8763,0xbbd29886,0xbd50a3c3,0xbd74c031,0xbda36e63,0xbe1b9d78,0xbe4297e9,0xbe425bb5,0xbdf967f6,0xbe088548,0xbe133f90, +0xbe288ff2,0xbe095123,0xbdc10e16,0xbd3468d5,0xbd4acaec,0xbd6a34e7,0xbd995203,0xbd573ffb,0xbd822325,0xbd604d29,0xbb368a0c,0xbcc249dd,0xbb794814,0xbac38845,0x3bc10a69,0x3cb65f3d,0x3c476360,0x3c3813a6,0x3c69c193,0x3c1779c7,0x3c080798,0x3c06fb12,0xbb8fd0c7,0xbc25302b,0xbc7adee3, +0xbcec5b2f,0x3d841718,0x3d9a05e4,0x3dadad9c,0x3d5ee834,0x3c8d33e3,0xbd6edcdb,0xbd86539e,0x3c54c3ec,0xbc39a570,0x3bcd1f2a,0x3cce17a0,0x3c97c8aa,0xbaf8d8ed,0xbcd4861b,0xbd16d79d,0xbd63a9d4,0xbdc506a1,0xbdb1618d,0xbdbd671b,0xbd0d872a,0x3aac09c6,0xbc382883,0xbbfbd9af,0xbbbd85fa, +0x3a35fbb5,0x3cc670c9,0x3c0f3c03,0x3bb7d9f3,0x3c13a0b9,0x3c7d63eb,0x3c8ee852,0x3cbd7020,0x3ccdd38c,0x3c9fe227,0x3d2ab206,0x3d13c6c5,0x3d690d5f,0xbb12fb74,0xbc0f961a,0xb9ec1a30,0xbda9da33,0xbe019404,0xbe356a7c,0xbe113c8b,0xbdd7d2f0,0xbdb8db19,0xbdfd3060,0xbe1e463a,0xbe2a4719, +0xbe1d987c,0xbdd653ec,0xbd778ee6,0xbcf4ec56,0xbc3a5cb4,0xbc84f25b,0xbcb1f2c8,0xbc2ea79b,0xbb9594da,0x3c1f43a6,0xbacbf2ce,0x3bfb41ea,0x3d365d4d,0x3c6087d3,0xbae94c6e,0x3bb860dd,0x39244b29,0x3c53cfa2,0x3d48345c,0x3cef427e,0x3cc22fc1,0x3cc923ed,0x3cafd9f2,0x3cdb7779,0x3cbbdf1c, +0xbcbf73de,0xbd82e721,0xbe37556b,0xbe149e3b,0xbdb84389,0xbbb319a1,0x3c39d495,0x3cf1af1b,0x3c9faf87,0x3be4363d,0xbbc99deb,0xbc1e6c16,0xbd215b06,0xbd4c8d89,0xbd32f0db,0xbd300983,0xbd01c6d0,0x3b283653,0x3d07b732,0x3c92868d,0x3cbc3476,0x3ce3b03d,0x3caf5b72,0x3cda317a,0x3ae4c7ca, +0xbb6a5d0e,0x3c4d47b4,0x3b2937cb,0x3bd9e026,0x3c1c07bc,0x3c68c6f4,0x3be0b3bb,0x3c883def,0x3b3d94f7,0x3d7e64a4,0xbcad103b,0xbe0f05b2,0xbe039e6e,0xbdcff6c3,0xbdfa1195,0xbdfec9cf,0xbdbc11b6,0xbda99926,0xbd87f163,0xbd7a51a7,0xbd062dd3,0xbd04564c,0xbd382f33,0xbc5c6d7c,0xbb44ec2a, +0xbc73af77,0x3c863163,0x3b872f31,0xbc1b2891,0x3c078f6c,0xbc551045,0x39193fe1,0x3bdb11eb,0x3c080ea8,0x3c0a7f84,0x3c74ba97,0x3be06bed,0x3b90ad3c,0x3b4a78b3,0x3c58ac06,0x3cc26623,0x3ca75794,0x3c8e8eaa,0x3cca8849,0x3add1bb2,0x3da13451,0xbb279617,0xbd1128fb,0xbcd13fc5,0xbd78bc5e, +0xbd8b29c6,0xbd91ee4d,0xbd8425bd,0xbd04a5ca,0xbc23f0c7,0x3b0bec73,0xbba41210,0xbc18e14e,0xbc48f951,0xbd03a535,0xbd217deb,0xbce97927,0xbcacd6e4,0xbc8b568c,0x3c276568,0x3c909b21,0x3b3d143b,0x3c4e3603,0x3b8cf96a,0x3b9b99ff,0x3b267647,0xba28b6b4,0x3b5b4ace,0xbac2193b,0xbba626cb, +0xbb998a93,0x3bffbc09,0x3b9e0723,0x3aba104f,0x3c3ada9a,0x3bc4d068,0x3b434e2d,0xbbbce871,0xbce6c128,0xbd16cdda,0xbd5b784c,0xbd3695f7,0xbd2b0455,0xbd214d71,0xbd11a170,0xbd01d2db,0xbcba2798,0xbca384d1,0xbc905110,0xbc55e510,0xbc60d3df,0xbc3c2fc7,0xbc154405,0xbc1a52bc,0xbc84d874, +0xbc6f9f30,0xbb58151c,0x3a1140d5,0xba9a257e,0xbb121bcd,0x3c202d55,0x3b346895,0x3c85ae48,0xbbc69d73,0x3c769206,0x3be87df3,0x3cc86d46,0x3c9dfc4f,0x3caff8db,0x3cc7a9b2,0x3d01181f,0x3c301709,0x3d0b7d45,0xbcd22a67,0xbccc74cc,0xbcc07da7,0xbcc6d823,0xbcddd80f,0xbcf5a7ac,0xbd03e62d, +0xbce7456b,0xbccbb972,0xbcb9b629,0xbc953653,0xbc587146,0xbc0970b1,0xbbf3c25f,0xbbe6ae4e,0xbc00216e,0xbc09ee08,0xbbee37c8,0xbc2eba97,0x3cabf7a7,0xbc332794,0xbc5c0307,0xbbb0d636,0xbbacbf4f,0xbcab2cc6,0xbcc8561c,0xbcc01f16,0xbc2641d3,0xbcd22325,0xbcef84d7,0xbc924a38,0xbca5c516, +0xbbc76b9d,0xbc03618f,0xbcbe8538,0xb82d254c,0xbd05cfa7,0xbca44519,0xbcbe2ea3,0xbcbb7fac,0xbcbe69f2,0xbcbf3fda,0xbcca7a3e,0xbcb3f530,0xbca371b3,0xbc9105ed,0xbc832189,0xbc702373,0xbc490ee6,0xbc6ff366,0xbc820f6a,0xbc86a45d,0xbc8f6aa0,0xbc84edb0,0xbcd0ad6c,0xba3f25d0,0x3ce00023, +0x3d9068ad,0xbc4858d3,0x3ccdfb31,0x3d96679d,0x3d954088,0x3d8e8b60,0x3d7f8349,0x3d859567,0x3d82805b,0x3d756ad7,0x3ccecfa3,0xbc77aa48,0x3d87fab1,0x3d00624a,0xbcbb7d50,0x3ceb2565,0xbc939488,0x3d35a398,0x3ca5c333,0x3cc08430,0x3ca32ac2,0x3cd7cf1a,0x3ce9af79,0x3cdc5e78,0x3cf90422, +0x3cf7f220,0x3ce0705e,0x3ceb903a,0x3cee04ae,0x3cf35c8f,0x3cf36c5a,0x3cf7e4c1,0x3d0113ca,0x3cff282d,0x3cd4e31b,0x3d3962b1,0xbc850143,0xbd5b9cc8,0xbdb60ab5,0x3ab53f23,0xbd45f576,0xbdaa24ee,0xbdadd591,0xbdad3cae,0xbd9d19f5,0xbdae4704,0xbdaff245,0xbda8ab2d,0xbd4649f5,0x3bfb48c7, +0xbdb0d19f,0xbd76cc76,0xbd90d894,0x3cfc3da1,0x3ccd6ff1,0x3c98a4c2,0x3c2ef15a,0x3c8e662d,0x3c9f1625,0x3c914ab9,0x3d0c2f74,0x3d1b4795,0x3cf0229c,0x3cf7ac5f,0x3cff5479,0x3d140633,0x3d1ec7f4,0x3d23790e,0x3d2dd323,0x3d1812bb,0x3d20e8f7,0x3d01c1c8,0xbd654bdb,0x3bb925e0,0xbab27ec0, +0xb8ced234,0xbbc6b018,0x3c0f8684,0x3c670d4c,0x3c44ce35,0xbbbb402b,0x3c5bfd99,0x3cb059e8,0x3bb17be4,0x3c3addad,0xbc334130,0xbc607a78,0x3c8c3092,0xbcd37b7a,0x3c928623,0x3cee3fea,0x3c06b8fd,0xb9f1c618,0x3c41bebb,0x3cae9f68,0x3c69b0c9,0x3d2beb9f,0x3d40bdb4,0x3d05e009,0x3d210dab, +0x3d20897c,0x3d363058,0x3d327c6e,0x3d399c32,0x3d61be62,0x3d2eaebc,0x3d582c26,0x3c98ef37,0xbc5f09e3,0xba90e783,0x3b1a1494,0x3c7e4f58,0xba1c5074,0x3c7bc8d3,0xbb8831ac,0x3cdbe9be,0xbbdd242a,0x3c63fbd4,0xbc140792,0x3bd4c297,0xba2a9385,0xbb9fc29d,0xbc93bb0e,0xbbbc73e3,0xbd0eecde, +0x3cf931b7,0x3d3c6a39,0x3caea91f,0xbc3f39dc,0xbc7cd436,0xbc84bd93,0xbc845e6b,0x3d2cb8f2,0x3d81eaa7,0x3d249393,0x3d26a66a,0x3d32659f,0x3d766ec1,0x3d81c33d,0x3d867ac5,0x3d978a3e,0x3d681549,0x3d6b2795,0x3cea8a28,0xbc9d8dcd,0x3c9cfd64,0xbc168de9,0x3cdaac1b,0x3cf08d1e,0x3cea29e3, +0x3cab45d0,0x3c2c757c,0x3cc969a9,0x3c3d285d,0x3c7a0bf3,0x3c8e80fa,0x3c9cbddc,0x3b8d22ba,0x3baf765c,0x3bf90a8c,0xbcb87629,0x3d45c32d,0x3d9c2a18,0x3ce2bd03,0xbbeca2fa,0x3beef218,0x3cdf08c7,0x3d1a2b8f,0x3c1460bb,0xbae77c69,0xbc024303,0x3aa0a823,0xbba02ef8,0xbc9b1fa3,0xbc34003a, +0x3bdcc935,0x3d036d2b,0x3d2135da,0x3d7373f1,0x3c90ca5c,0xbcec08e9,0x3c804c21,0x3bbfd3e1,0x3c6c8330,0x3c3b70f5,0x3c900277,0x3cabf93b,0x3c98329f,0x3c5135a0,0x3c92ada6,0x3c9d90b8,0x3be06c41,0xbac2ca5f,0xbca2d702,0xbc9948be,0xbca34ade,0x3dafe22d,0x3da9b1cd,0x3d59e04e,0x3d5f6a05, +0x3dd09b52,0xbcd09129,0xbdcf8259,0xbda95d6a,0xbd844685,0xbd5bf84f,0xbda632ad,0xbd7d5337,0xbcf77a3a,0x3bfd2dc0,0x3d57a3bc,0x3d8fd2f1,0x3d8f01e2,0x3d451df5,0x3d252a0b,0xbc8e348f,0xbd28f6cd,0xbcaf9b36,0xbc803060,0x3c545f10,0x3c8e69e4,0x3cadeefd,0x3c637192,0x3be74a3f,0x3ba9fe13, +0x3c7b15ba,0x3c8b254d,0x3d2ce5d7,0x3c7ac10d,0x3d18c17a,0x3d7f7e7a,0x3db3c82a,0xbd21180f,0xbcf8677a,0xbc7192dd,0x3c2d856c,0x3d9507b1,0x3dc254b3,0x3e229680,0x3e3e57a5,0x3e2ace71,0x3dddc99a,0x3d3aa965,0x3ce0034c,0x3c32b53b,0x3bc32530,0xbc525b46,0xbcffe494,0xbd1db2c9,0xbd2d85a4, +0xbc42e02d,0x3c48bed4,0x3c5df874,0x3caaa592,0xbbab932a,0x3c9b8c26,0x3cccde4d,0x3cea1056,0x3c89ba3d,0x3bd5a6df,0x3c655344,0x3afa3951,0x3c68dead,0x3d3b54ea,0x3d1218a4,0x3cdadc88,0xbc25cedb,0xbce65269,0xbc857748,0xbd0f8fb3,0xbc306435,0x3b71214f,0x3d920097,0x3d649885,0x3d20e430, +0x3d0c5961,0x3cbfa823,0x3cf6adb9,0x3d30f63b,0x3d177b7d,0x3c955e17,0xbb0faae6,0x3c83e4f7,0x3ce6a699,0x3ce1701a,0x3cb543bd,0x3c884979,0x3add2dce,0xbc317456,0x3b7997e4,0x3c52ea02,0x3cad3208,0x3c94b2c2,0x3c86fe66,0x3c468a0f,0x3b806483,0x3c701f42,0x3c00ccca,0x3c49eac5,0x3ca33b3a, +0x3c6a0e21,0x3cb0b581,0x3c19da25,0x3c0256e8,0xbd667af3,0xbca72930,0x3d34301d,0x3d08fc86,0x3d39619f,0x3d3af84e,0x3d5583dd,0x3d69be8a,0x3ce61502,0x3cba6c6d,0x3d08b942,0x3cf52ed0,0x3d0dd0b4,0x3ce3e3c2,0x3c0c535e,0xbb47ce68,0xbbe78d6c,0xbc332f66,0xbb81f9c2,0xbc3fbc53,0xbc49ad06, +0xbb11fc86,0xbb80683e,0x3a21edab,0x3bc0dee1,0x3c831284,0x3c2a71c4,0x3c453b6b,0x3b3828a4,0x3c1dbb1b,0x3c0b6a67,0x3c26ab98,0x3accc51c,0xbb9a9716,0xbc82f93e,0xbca56f37,0xbd4aa44b,0xbccdef57,0x3c2d880f,0x3c0eaece,0x3ce947bb,0x3cff2479,0x3d42a9e6,0x3da48b22,0x3d767284,0x3d3b9efc, +0x3cb1e232,0x3cbe1996,0x3cba1e65,0x3cdd0134,0x3d041596,0x3d05cc0b,0x3d015027,0x3ced9388,0x3c94c6ce,0xbc2c5fbf,0xbbcfe79c,0x3a156e7b,0xbc1cc8c4,0x3b0b4637,0x3c49bf72,0x3c9262c9,0x3c4aa4c1,0x3bffc0f1,0x3c8ff68a,0x3c1857ce,0x3bedaf8d,0x3bf6c627,0x3b7fa6ee,0x3b2d7fac,0xbbf67a06, +0xbbdaf6c6,0x3bf1709e,0x3ce37bfb,0x3d1ae95e,0x3cd22081,0x3cc4254e,0x3cee41af,0x3d088514,0x3d1cae40,0x3cc256cd,0x3c8fdb5b,0x3c29ab48,0x3c34c0ba,0x3c1f9333,0x3bf2cfab,0x3bed1e82,0x3bd016b5,0x3c1edd9b,0x3c531cf8,0x3ceb86f7,0x3cafeaaf,0x3a91fee8,0x3bde5211,0x3c2675dd,0x3c090210, +0xbb60f84a,0x392df002,0xbbf8bcee,0x3c61e55a,0xbbf4d820,0x3c61045d,0x3b948baf,0x3c873fef,0x3c07ee33,0x3b5d5bce,0xbbe9db18,0x3be713dc,0xbd327a72,0x3b9d8e03,0x3c773493,0x3cb11218,0x3cfe78ad,0x3d21055d,0x3d3e9c21,0x3d639513,0x3d48c940,0x3d2c1e80,0x3d08348a,0x3cb42d5c,0x3c32ee13, +0xba0ef39f,0x3b52244c,0x3bb71fd6,0x3bf5988e,0x3be2624c,0x3bfa6756,0x3c30f3fa,0xbca913e8,0x3b8dd05f,0xb9c138f5,0xbb7a8180,0xbbf70026,0x3b74de32,0x3bf950d1,0x3887340f,0xbc6866f0,0xba9c77df,0x39da4950,0xbc3f35d5,0xbc030394,0xbc89afa6,0xbc7ae5bc,0x3b008d89,0xbc322f50,0x3cf8aa1f, +0x3cb8694e,0x3cd87b5a,0x3cea0d05,0x3cf5a35f,0x3d0282b1,0x3d12e651,0x3d00ec21,0x3cf232d3,0x3ce5ac93,0x3cdd4ef8,0x3cd6a37c,0x3cbd44c1,0x3cc67d0a,0x3cc27355,0x3cc48824,0x3ccc2087,0x3cc0b53d,0x3d061bbd,0xbba7c6f9,0xbcef56df,0xbd3e8364,0x3b44360b,0xbcf7d36b,0xbd553a82,0xbd5cae0e, +0xbd5075b4,0xbd3395ff,0xbd49f9fd,0xbd45dd31,0xbd3c7b20,0xbd04d89c,0x3a766249,0xbd37343a,0xbd134e5f,0x3ce947b2,0xbcb39f7d,0x3cff1b60,0xbd050546,0xbc736632,0xbc7f9cfb,0xbc7d0e0b,0xbca59cbe,0xbcc6a117,0xbcfb59f7,0xbccf1ade,0xbcc9c1b8,0xbce52d54,0xbcc9f877,0xbcc1b404,0xbcb41f91, +0xbcc1ecd3,0xbcc21590,0xbcc08a22,0xbcbd4953,0xbca33e5e,0xbd0f6a81,0x3cf34862,0x3d57a17c,0x3d4b3d3b,0x3c9c9f17,0x3d572685,0x3d4a3440,0x3d5a815b,0x3d5abebf,0x3d3d9843,0x3d63b45d,0x3d685b12,0x3d64c6fd,0x3d52999e,0x3c672f7f,0x3d41747e,0x3d672b95,0x3d4b453d,0xbbad0bc8,0xbbfa5ee7, +0xbb3b2977,0xbc22ece1,0xbca69204,0xbcd48b0d,0xbd2697a5,0xbcfc5937,0xbd06bdcc,0xbd2f1992,0xbd1286c7,0xbd093338,0xbced6a22,0xbd0bc290,0xbd09a29e,0xbd03777a,0xbcd6576d,0xbcf92865,0xbc6d3a13,0x3d35adf2,0xbaa0d1cd,0x3c5f0384,0x3c2c9fb7,0x3c912d43,0x3be81c2c,0x3aed8197,0x3be834b3, +0x3cb64e44,0x3a8ab087,0xbc0bb5d5,0x3c20a3b2,0x3bfdba12,0x3cc0566f,0x3cd3e856,0xbb510de6,0x3d07c6b1,0x3bef6b22,0x3c1c522d,0x3ccec3d5,0x3c86f9f2,0xbc847881,0xbd042b97,0xbd885194,0xbd183bfa,0xbd0e24a8,0xbd5f90de,0xbd1fa5cc,0xbd0dbd0d,0xbccdc41c,0xbd0eb34d,0xbd0acc65,0xbd0da06f, +0xbce54b24,0xbd211a7f,0xbb113da1,0x3cb1882d,0x3c12fac5,0x3c3e2fd1,0x3c37f7eb,0x3cd96ac6,0x3ba93345,0x3cc0d80a,0xbbc02d0f,0x3cee7670,0xbb6c29e7,0x3ca8b215,0x3c8ea3a2,0x3ca242d2,0x3ca4e4fa,0x3d008f5b,0x3ca5080b,0x3d54107d,0x3d242581,0x3d5fc6cb,0x3d8af95c,0x3d0fced9,0xbbc18d82, +0xbcc46f56,0xbd922b4f,0xbd1e87d1,0xbd3b18cd,0xbda02a0c,0xbd6b5143,0xbd43e619,0xbd0c44cd,0xbd581af9,0xbd5b4da0,0xbd402993,0xbd15f350,0xbd29f0f8,0xbbbc4375,0x3c9caba1,0xbc7fdd3c,0x3c7cc598,0x3bf65486,0x3c386657,0x3c24a8ab,0x3c480a49,0x3c3d14a6,0x3b855ab7,0x3bf5e8b7,0x3b2b15a0, +0x3c92135e,0x3cca6934,0x3d110d30,0x3d1a8f45,0x3d00618d,0x3d691f2d,0xbc979e95,0xbdc4c006,0xbd953b50,0xbd513421,0xbd86aeef,0xbd74d16d,0xbd9e9c91,0xbd4b1f55,0xbcfe6ebc,0xbd1af573,0xbccce173,0xbc64bc8e,0x3c8ab838,0x3cfe11ef,0x3cfc4c79,0xbb5b7ad4,0xbbab916d,0xbce19c8f,0x3b3bcffb, +0x3cc6c6bc,0xbc351bfd,0x3c4ee549,0x3c776a1d,0x3c9a930e,0x3c6ed605,0x3c99506d,0x3c98ce97,0x3c3cb787,0x3cef89f9,0x3cd42099,0x3bcbecff,0x3bf4c706,0x3cbc6318,0x3c9a712e,0x3d190ff5,0x3d514ed4,0x3c362144,0xba0853bc,0x3d045668,0x3d7b2dfe,0x3c66ed17,0xbbd52247,0xbd11097c,0xbc351d20, +0xbc882cbe,0xbd15ca6e,0xbc83be96,0xbbe4df18,0xbb868859,0xbd144f35,0xbd54353d,0xbd80e153,0xbc9f2508,0xbcaf19bb,0xbbc985c0,0x3c1c7950,0x3a925dc9,0x3b84f8ee,0x3b7458d6,0x3c0225cf,0x3c8101b8,0x3c3cd7c3,0x3bbbf2d3,0x3b626835,0x3c0a00e3,0x3c9f71d0,0x3d29f47e,0x3cea8f60,0x3c9e3a9a, +0x3d302572,0x3cc81a42,0xbc8f3a1d,0x3b8ff1c3,0x3c4515db,0x3cd5f6af,0x3d8e60a0,0x3d3d77b3,0x3d5abdfb,0x3cbcb3fd,0xbbe24d53,0xbc79a10c,0xbc275e11,0xbcc1fdb0,0xbd30c586,0xbd77b5ab,0xbd9625ba,0xbd6e4d3a,0xbcfc843f,0xbd0016f9,0xbd41ea9a,0xbca0beb0,0xbbabc8f5,0xbc198545,0x3b20cc60, +0x3ce8493e,0x3cda94e4,0x3c0aa973,0x3bc9ad2e,0xbb764d50,0x3be214c1,0xbbcb8ccf,0x3bf6f189,0x3d2c57a5,0x3d28bf3c,0x3cc5376b,0xba799e49,0xbc059528,0x3c78a62c,0x3d294f39,0x3d5a1280,0x3d802d0a,0x3d5c33c9,0x3ce055ba,0x3d0a1d0c,0x3d371533,0x3dfb149a,0x3e227a49,0x3e19e0cf,0x3df50e04, +0x3dc38760,0x3dab9704,0x3d3066a4,0x3c93a07d,0xb9dfc6d0,0xbc20515d,0xbcab944d,0xbc29377d,0x3b98065d,0xbb0d3c96,0xbbf96cea,0x3ca6f63e,0x3ca698e1,0x3bd23f3a,0x3c4f7c48,0x3c82936f,0x3ca6cc65,0x3c924de7,0x3c77076c,0x3ad2427b,0x3bc4af0d,0x3c43a236,0x3c588c81,0x3c456ecb,0x3d407e97, +0x3d8c08df,0x3d8065bc,0x3d7644fb,0x3cc72e53,0xbbda1be4,0xbbe098fc,0x3cb6add4,0x3d2f8bcd,0x3d745156,0x3d9a0c47,0x3da51426,0x3d9f84dc,0x3da0965d,0x3d4435c8,0x3d09bed9,0x3c9e8c55,0x3bea9a51,0xba427d8a,0xbbb4fb4d,0x3b35a8d8,0xbb89bb49,0xbb2893ce,0xbaa95e3f,0x3b0ada33,0x3c1eeff2, +0x3c01df55,0x3b2b7849,0x3c61af46,0x3bbb80a6,0x3c91ba7d,0x3d056ce4,0x3cfa7aca,0x3cd1abbd,0x3c9904c5,0x3d1f8343,0x3cf505c3,0x3d2a6c7f,0x3c2888af,0x3baecf1a,0xbb08144b,0xbc90f271,0xbcbaa32b,0xbc7d1e23,0x3c4fc0a5,0x3ca1442c,0x3be27b33,0x3c0726d0,0x3c7a5240,0x3ce231ac,0x3d2445d0, +0x3d08beef,0x3c2951c7,0xba0bdf0c,0xbb5e289b,0x3bb3b8ee,0x3c0380ac,0x3c62d252,0x3cc5243e,0x3c654210,0x3c166471,0x3c9ee6c0,0x3c54595a,0x3c255969,0xbb63c7cd,0x3b199d20,0x3b8f89af,0x3b685fe3,0x3b53e3da,0x3c012675,0x3c12428d,0x3cb9a84d,0x3cf25112,0x3bdf5690,0xbbe00791,0x3b6e18ee, +0x3aefee13,0x3c2939a1,0x3c790027,0x3c802433,0x3c9bb276,0x3cad4da1,0x3cca0e98,0x3c8fddbf,0x3c249e3e,0x3aeee041,0xbb020140,0xbb52cda2,0xbbb23852,0x3bb68d48,0x3bbddebb,0x3caf8b45,0x3ce81f6b,0x3c8f1549,0x3c2ffd1b,0x3bffc05e,0x3bf82aee,0x3b1cc5ba,0x3c274df3,0x3c2d57e8,0x3cdd8cf9, +0x3c5baf02,0x3c90f9f4,0x3c3e17b0,0x3c795ad1,0x3cb0a85a,0x3ce0bceb,0x3ca5c9b4,0x3cc6b343,0x3c327946,0x3bf62a62,0x3c37630a,0x3c0fc57b,0x3c111a8a,0x3c009245,0x3c1e70bf,0x3c40ccf5,0x3c603463,0x3c84e523,0x3c9030b8,0x3ca6b1d2,0x3cb8fd4c,0x3cb01e77,0x3ca5ff20,0x3c8cbf5a,0x3c817184, +0x3c4be6f2,0x3c3950fc,0x3c8e7f71,0x3c47ff40,0x3caa5cb7,0x3ca7e05b,0x3cc436c7,0x3cbc8eaf,0x3c7a1d2c,0x3c92feb5,0x3ca3b337,0x3c0ac874,0x3abd7a94,0x3af08833,0x3b659900,0x3bf2207c,0x3c37cfc1,0x3b5eef2f,0x3d109a5f,0xba61e811,0x3b8cb509,0x3b7b239e,0x3b877a15,0x3b935039,0x3b95ee0c, +0x3b7d716d,0x3b925d33,0x3b9f4cd0,0x3ba59694,0x3bce5dcc,0x3be80aca,0x3c0739c7,0x3bfa49e4,0x3bfd2df7,0x3c02f68a,0x3bf95d39,0x3bf77056,0x3b23e547,0x3d127946,0x3d3eff65,0x3d030894,0x3cfd3863,0x3d44bebf,0x3d1546de,0x3d1658ee,0x3d0cd5b0,0x3cf3db34,0x3d0aba1f,0x3d083eb2,0x3d00e722, +0x3d33ddff,0x3cea5126,0x3ce2219b,0x3d3a05d3,0x3b88865a,0xbcb9756a,0xbd6a4d97,0xbc8d900b,0xbcc30a0f,0xbce91414,0xbd06af4a,0xbd02caea,0xbcf5f067,0xbce89475,0xbcbef86a,0xbcaf7d00,0xbcaada5b,0xbcb08a6d,0xbcacad78,0xbca410e2,0xbc9acb02,0xbc97a7bc,0xbc963991,0xbc99f21e,0xbc975595, +0xbc3635d3,0xbd65282c,0xbd61a848,0xbc45b345,0xbd4d85d0,0xbd617f16,0xbc8075a9,0xbc9f4d9f,0xbca25f83,0xbc85336f,0xbccb1622,0xbcd48b16,0xbcc5947d,0xbd5e4780,0xbd4a7528,0xbc3c0df5,0xbd651fee,0xbcf29ad4,0xbd113c24,0xbd08f1b0,0xbd425ca5,0xbd65223d,0xbd6c04b1,0xbd647e26,0xbd545daf, +0xbd1f037e,0xbcf3edb8,0xbcd696fc,0xbcce41ae,0xbcc52500,0xbcb94085,0xbca521c5,0xbca43faa,0xbc9f8b51,0xbcbb9715,0xbc6cc472,0xbccf12a8,0xbd1e72d4,0xbcb58e85,0xbd095bd4,0xbca864aa,0xbcb2069b,0xbcd94711,0xbca89c21,0xbcfa3945,0xbd1c689c,0xbcf49d24,0xbca0c59a,0xbca0e9fe,0xbcaca3cf, +0xbcc1de43,0xbcd29089,0xbcc3fcfb,0xbd046e4f,0xbcf440e3,0xbd381604,0xbd85180a,0xbdbb9fe1,0xbdb7bf7a,0xbda336f6,0xbd85a9b9,0xbd396c8b,0xbd06a216,0xbce5bac4,0xbcf4ae45,0xbcd6a3d1,0xbcbf168e,0xbc6e7867,0xbc49a994,0xbc394425,0xbc52e657,0xbb3dafe3,0xbc932f09,0xbd1234a5,0xbcac8245, +0xbc715f11,0xbc20efbc,0xbc73a464,0xbc10d7bd,0xbc177b5a,0x3b0123f3,0xbca67ef1,0xbb864468,0xbc8caef8,0xbbf0daab,0xbc265247,0xbc25d7ca,0xbc32684e,0xbce4acaa,0x3bf3b601,0xbcd923a9,0xbd8c0585,0xbdce0ffe,0xbe06e5b4,0xbe0c16c8,0xbe01393e,0xbde1c740,0xbda55290,0xbd4eb36e,0xbd070069, +0xbd0525d8,0xbcf54463,0xbcee2a2b,0xbc82811f,0xbc5ec26f,0xbc6b6865,0xbc937cd3,0x3b205404,0xbb967186,0xbca994f6,0x3c47ecec,0xbb2c8cfd,0x3c787af4,0x3cac2537,0x3cc7daaa,0x3c96af62,0x3c51b201,0x3c7560fd,0x3b43d8f3,0x3c0601a7,0x3c902862,0x3ca5e519,0x3c9fe87f,0x3ce2dc89,0x3bd441e3, +0xbe06b4e6,0xbddccf44,0xbdc296ff,0xbd96b330,0xbcca374e,0xbd50786d,0xbd58ffee,0xbd2e1fea,0xbc4de84b,0xbb2ff69d,0x3be5f7ce,0x3c97400c,0x3cb36f18,0x3c9a4478,0xbc67a668,0xbbedfdbd,0x3d350507,0x3cc589bb,0x3cd02d7b,0xbc442a78,0xbce7ee6a,0x3bb13b37,0xbba4f978,0x3c3b94ed,0x3beb6108, +0x3b34ec28,0x3c932a09,0x3ca1b293,0x3c4d03cc,0x3ca36b00,0x3c03f578,0xbcbb07a3,0xbc81abe5,0xbcd382f2,0xbd3cf8d0,0xbdce1f90,0x3c1906e0,0x3d55a0e9,0x3d76a43b,0xbca6428a,0xbdb26e1e,0xbdf8498c,0xbdf41660,0xbe0be3c4,0xbd758ec9,0xbc76d550,0x3ac1ef51,0xbd00fbf6,0xbd72a750,0xbd83bc3a, +0xbd9143ff,0xbd96f040,0xbd9b5e2b,0xbd77e6d6,0xbcec4dc6,0xbd031515,0xbcbbf0e8,0xbc035eb3,0xbbd1a8dc,0x3ca1990f,0x3cb5fdbf,0x3c8a8e36,0x3c0762fb,0xba0e4535,0x3ab42e72,0x3b9e9135,0x3c4b80cf,0x3cfd945c,0x3c1a4f11,0x3a14a544,0x3aaf70ea,0x3ca2ab69,0xbc01b369,0xbc236943,0xbcce3e4c, +0xbc2d7924,0x3cfada6b,0xbc3e2c6c,0xbd072417,0xbcec2207,0x3cd0e312,0x3d24aeed,0x3c84d7f8,0xbb25355a,0xbccadd2d,0xbd2fade4,0xbd0ef429,0xbcd6780b,0xbc9b8e95,0xbce8d753,0xbcb1c671,0xbcea06dc,0xbd0db2c7,0xbc866e9b,0xbccf6855,0x3c2d4036,0x3c5e2512,0xbc7337db,0x3b313e0e,0xbb10032c, +0xba6575ef,0xbc23cdba,0x3b06435e,0x3cad266a,0x3ccf41eb,0x3d0bd542,0xbbbf0691,0xbbe01491,0x3c6026ba,0xbc822510,0xbda82d11,0xbdf58312,0xbdfa511c,0xbddcd635,0xbd82d50a,0x3c573727,0xbab01a90,0xbc3ad8cb,0xbd3e80ce,0xbcdcaf11,0xbca9211d,0xbc9eef6d,0xbd1d53b3,0xbd2976d3,0xbccdd63d, +0xbcb17efc,0xbc254823,0xbc8029c5,0xbcc2c5d9,0xbc68f92a,0xbc4ade23,0x3c6b008a,0x3c78a725,0xbb52dd79,0x3c675c51,0x3c17104a,0x3c6293b2,0x3ca50bd7,0x3cb03ce3,0x3ba5d510,0x3b85652a,0xbb445f63,0x3b5298aa,0x3c1ef78f,0xbc7fe95c,0xbd955f6e,0xbdba6201,0xbda8ef54,0xbd9a2bab,0xbd9fbb1b, +0xbd80c553,0xbd104c8c,0xbd172d73,0xbd32f075,0xbda42c10,0xbd4fb210,0xbd1ab761,0xbc91cf22,0xbc1b1166,0x3a102175,0x3bf225be,0xbc83a80b,0xbca0ba44,0xbc3d1986,0xbc5f2f21,0xbb1e9f43,0x3b98c4cd,0x3ad7cda9,0x3a7506ee,0x3af9cb21,0xbb0c0581,0xba2409a7,0x3a3c3422,0xb91b7bf3,0xb8ee7784, +0xb97831ea,0x3c489b88,0x3c4e3177,0x3bc6ef4c,0xbcfff253,0x3c0152b0,0xbce17b29,0xbcab2a02,0xbcb04eaa,0xbcad116c,0xbcf38a68,0xbcdfe51b,0xbcb6c661,0xbbb0b0c2,0x3b588822,0xb9c494b4,0xbc4dc547,0xbcd54350,0xbd1a3638,0xbd142abb,0xbd000e9e,0xbcc2c18f,0xbbeefd08,0xbacec59f,0xba720cd0, +0x3ab9a7c1,0xbbede5fc,0xbc77874c,0xbc2b627a,0xba81bf41,0x3c05386d,0x3bf8de78,0x3b83e57a,0xbabc6a53,0x3a031db9,0xb9d56390,0xbab94589,0xbb0e0fe8,0xbc1e7aff,0xbc307056,0xbc833b97,0xbcd9d41a,0xbc65051a,0xbc51b8db,0xbcc2695e,0xbccfa6fd,0xbcfb4417,0xbd0c3f04,0xbd22d3d7,0xbd0940e0, +0xbce49bd6,0xbc92da8e,0xbc8ff087,0xbc832cb3,0xbc8cceca,0xbbe02de2,0x3b261046,0x3c2a09cd,0x3bb9c905,0x3b64d185,0xba167e92,0xbb114f01,0x3b5f1352,0x3b965e30,0x3b651b9b,0x3b7d20bb,0x3a504e8a,0x3bdc77f5,0x3bb9ca97,0x3bda9c24,0x3bc3fac9,0x3a71542e,0xbb61037d,0xbb9e4ad3,0xbc0864ad, +0xbc15a08b,0xbc5ddb66,0x3ae893fd,0xbca7d27d,0xbc838af3,0xbc9a07f5,0xbc9dcab9,0xbca56f09,0xbca32f80,0xbcb3cb43,0xbc4ee9ba,0xbba5e6ae,0x3b367134,0x3c337055,0x3c9e5113,0x3cdf4663,0x3cbd8bcf,0x3c99f7a5,0x3c907036,0x3c829d93,0x3c913ebd,0x3c588fa5,0x3c66edc8,0x3aff9bc5,0xbc066031, +0xbb557f23,0xbc135401,0xbca410d8,0xbc8fc625,0xbcb773bc,0xbca0de1e,0xbc936d3b,0xbc2c9426,0xbc2de1be,0xbc109b84,0xbbee61a1,0xbc5acf2e,0xbc60974a,0xbcf70167,0xbcba3402,0xbca7c2a1,0xbcb64326,0xbcb455c9,0xbcbb7d7a,0xbcc038a1,0xbccd9566,0xbcb295af,0xbca36fc7,0xbc945bb2,0xbc83231b, +0xbc67dbb3,0xbc2a2103,0xbc3e4ec6,0xbc3a5162,0xbc467293,0xbc5230fc,0xbc575885,0xbc5a96f8,0xbcbcad62,0xbc813e6c,0x3cb4b5a4,0xbd00ee08,0xbcb6e30a,0x3c956a34,0x3c863b52,0x3c7f3fdc,0x3c7821c2,0x3c4494b2,0x3c2c7f3c,0x3c303130,0xbc9b2776,0xbd03335b,0x3ca98633,0xbc94fb8a,0xbce6d672, +0x3ce77788,0x3cf55ee3,0x3cce927e,0x3cac3f38,0x3cd02686,0x3ccd509f,0x3d06bf31,0x3d0bb911,0x3cf76142,0x3cfe0d7f,0x3cf8650d,0x3cf16b5e,0x3ce54e85,0x3ce38b27,0x3cf717f2,0x3ce6215f,0x3ce22c91,0x3cd8a438,0x3ce9e619,0x3ccf0d04,0x3cea4a7e,0x3d0dda71,0x3c4785b3,0xbd4c9528,0x3d258826, +0x3c8487b3,0xbd32e27a,0xbd24bae7,0xbd20ef31,0xbd1f6d2d,0xbd1411cf,0xbd0f6423,0xbd042bf3,0x3c878405,0x3d2952cc,0xbd3623f7,0x3c1a29fe,0xbc571b0f,0x3cbfaaa0,0x3c97c758,0x3ce83d4c,0x3cf83701,0x3d56a9b9,0x3d6647b2,0x3d3f0e8f,0x3d48caa1,0x3d39f1dd,0x3d2aba11,0x3d0e03b9,0x3d0c2160, +0x3d273bcc,0x3d182d5c,0x3d15d0e5,0x3d0799a6,0x3d19b7c5,0x3cfd0e1c,0x3d140be5,0xbb1c7e2a,0x3c97b3da,0x3ce34d45,0x3c89b435,0x3c7ac45b,0x3cdba78b,0x3cd653f2,0x3d05c1c9,0x3cd08c06,0x3ced25a2,0x3cc94201,0x3ca12fc0,0x3caf0821,0x3c283013,0x3c80f267,0x3ca0b4b5,0xbb0777d1,0xbbb519db, +0xbbecf6fd,0x3be16d54,0x3c4fd97a,0x3d91c1f1,0x3d9d497a,0x3d5bd55a,0x3d5d3396,0x3d4703a8,0x3d3db5d6,0x3d15a28e,0x3d075437,0x3d3e9034,0x3d158e05,0x3d1481fc,0x3cf5402c,0x3d1d63aa,0x3d0b5877,0x3cd39279,0x3cc2aef6,0x3c8722ba,0x3c707bf3,0x3ca7b8b3,0x3c8bfcc4,0x3c88b312,0x3c56b637, +0x3c9144c7,0x3c651af5,0x3beb36ab,0x3bf311c6,0x3c6c6dad,0x3c373429,0x3c2cb9a7,0x3bdba24a,0x3a806d07,0xbcfed98a,0xbd195476,0xbcf52506,0xbc236c11,0x3c46b6d8,0x3dd5ae17,0x3df63614,0x3db68c73,0x3db35aa0,0x3d98c1f5,0x3d7d4637,0x3d309966,0x3d3bef0d,0x3d83bb33,0x3d66a33b,0x3d4f966d, +0x3d21a436,0x3d5e8dba,0x3d1dea21,0x3d047964,0x3c9da553,0x3c19eace,0x3c63f3c2,0x3c967bb2,0x3c9f5aac,0x3c7ab1f3,0x3ca2b3ad,0x3c3f28f8,0x3c00c388,0x3c024bf9,0x3be0dc94,0x3c272674,0x3c33fe70,0x3c0b62a6,0xbb66eeb2,0xbc534c4c,0xbd02a210,0x3d298c87,0x3d3ba85f,0x3d1ef806,0x3d2fdfa9, +0x3d12f480,0x3cfc7cc8,0x3c8e4fe2,0x3cb7ccd4,0x3ca5c621,0x3d0ebfe3,0x3b7cb0cf,0xbc971394,0xbd2fb454,0xbc4814c0,0x3b9029e9,0xbbfdcbd9,0xbb12a0f3,0x3a9c542b,0x3d1924a7,0x3cde2cba,0x3c107e8c,0x3c296992,0x3c96e2c1,0x3c8e4d67,0x3a10ff00,0x3c935957,0x3ca933e2,0x3be595d9,0x3c9ffbd8, +0x3bea34f1,0xbbf50d86,0x3b226875,0xbbb90031,0xbc855b43,0xbd0c2036,0x3d8dba7f,0x3d5e2223,0x3bb57493,0xbaf3fc13,0xbc46b613,0x3cd28056,0x3cba3231,0xbcf174d3,0x3ca2de38,0x3d064f22,0x3c7ba3c1,0x3cddb551,0x3d188677,0x3d5d3963,0x3d488471,0x3d6b790b,0x3d8b11b3,0x3d5e7dfe,0x3d346fdc, +0x3cecf8c3,0x3bd27f32,0x3c840d6b,0x3ca14e2c,0x3cc62a2b,0x3cd522b2,0x3cc188ba,0x3bf1173c,0xbb22f242,0x3bdd22ca,0x3b71a58a,0x3c401c81,0x3ce2dca4,0x3c4bffe7,0x3c976872,0x3cc7bed9,0x3d59bc54,0xbc99e8d1,0x3c8d7273,0x3d838d31,0x3e02b2de,0x3e734b62,0x3e6c8c6a,0x3e4b7075,0x3e06eb91, +0x3d827952,0x3cbcad3f,0x3ca84b5a,0x3cf103d8,0x3d551248,0x3dae4e13,0x3d86db49,0x3d3c9ba1,0x3c98495d,0x3be02ffb,0xbb5a464c,0x3a09f6a4,0x3b4d21bd,0xba3ad020,0xbbcdc562,0x3d0af2c8,0x3cd09fbc,0xbca59b98,0x3b7656bc,0x3a0f105f,0x390f7748,0xbba5b0a6,0x3bbdff0d,0x3c8f57ef,0x3d204070, +0x3d3a95ae,0x3ca26f2b,0xbb014285,0xbbfe40f0,0x3c7652c2,0x3dc00a6e,0x3e01147b,0x3e2f89ae,0x3df37364,0x3db83007,0x3d50a3bf,0x3da75fcb,0x3d9847f9,0x3d5bb778,0x3d3205e8,0x3ca629b8,0xbbe92bbd,0xbc099c97,0xbb81b515,0x3bbbf463,0x3c1ba510,0x3ba34abc,0x3b9cba5f,0xbb8e90ac,0x3b8d4b52, +0x3b3f5e26,0x3cc052ea,0x3cd1599e,0x3b9cf7e7,0x3c5e4a36,0x3c558ffc,0x3c6de9b3,0x3cbb5e18,0x3ccc37de,0x3c539f0a,0x3c54d93b,0x3c9bc1e9,0xbb803f00,0x3b8d92f7,0x393768bb,0x3d921fef,0x3e0c0f1d,0x3e08925a,0x3e127145,0x3e02b3b1,0x3dd8ba98,0x3d74b0af,0x3d9bc3d1,0x3d9d34de,0x3d95bcc9, +0x3d66bdb3,0x3d47467f,0x3d5c8777,0x3d10ced8,0x3cb28d5b,0x3c4bad76,0x3b5ce7c2,0x3b949359,0x3c5eaf70,0x3c5f6b34,0x3cae4ddd,0x3be86d37,0x3c0ce1bc,0x3c29eae8,0x3c37ed5c,0x3b246136,0x3a919563,0x3bddd51d,0x3c06f76f,0x3c2e03bc,0x3c3578ca,0x3c8fed3d,0x3c98f5e8,0x3b4d8f84,0x3d1bce33, +0xbc8b80bb,0x3d493f8f,0x3d8f0b86,0x3d64ea93,0x3d3b4313,0x3cda0208,0x3c987823,0x3c813563,0x3a12dc6f,0xbc25a9d5,0xbc6d6fac,0xbb0b885d,0x3c5008a4,0x3ce9b8aa,0x3cb38e26,0x3c8d59f6,0x3bb5f07e,0x3c4ea220,0x3c669783,0x392cd3d0,0xbb65dcf4,0x3b307da0,0x3c1b73e1,0x3c62290b,0x3c1195de, +0x3bb45df9,0x3c17c366,0x3c0482e8,0x3bec94c3,0x3c3cda02,0x3c63a2d7,0x3c6b3b78,0x3c381a04,0x3c830f79,0x3c229caf,0x3cb79f9e,0x3cfb9a8d,0x3d05df5d,0x3d0669fa,0x3d05bd76,0x3d11e25b,0x3ce80d78,0x3ca34967,0x3c2642b1,0x3c7699ee,0x3ca75dbd,0x3cc106a3,0x3c565b4a,0x3a6f79dc,0xbc38c182, +0xbb7c2d84,0x3b59eab3,0x3c032637,0x3bbfc497,0x3a5d7b05,0x3bb5e0cc,0x3c545547,0x3bc0788c,0x3bec6e40,0x3bc6d9ee,0x3b7a2340,0x3ba0c47b,0x3b56fa98,0x3c33aef0,0x3c45d7c2,0x3c35c002,0x3c05ac17,0x3c361de7,0x3c5bb769,0x3c89f005,0x3c86634e,0x3cd4982a,0xbca2816c,0x3ca126be,0x3c88456a, +0x3c856e6b,0x3c80b39e,0x3c752251,0x3c7fd79b,0x3c77480f,0x3c437ab8,0x3bd736d7,0x3b7d1ba8,0x3adaf3b5,0x3b259527,0x3af15673,0x3b38d0a6,0x3adc8b20,0x3b1a84ec,0x3b80aa81,0x3b2e5ef5,0x3be7f029,0x3c0a21d6,0x3c4b39e9,0x3c82e15c,0x3bd18c9e,0x3c16de93,0x3c64822a,0x3c816096,0x3c9d09c0, +0x3c81a6ec,0x3ca714b4,0x3ca8a175,0x3c8976d1,0x3c900f4a,0x3c0cb6cc,0x3c1a4bf5,0x3c857e19,0x3c265602,0x3c870aef,0x3c1c3c07,0x3c3f86e9,0x3c3301ca,0x3c394f66,0x3c37d470,0x3c415e7f,0x3c1cd936,0x3c0bfc21,0x3be769da,0x3bc3e28c,0x3b8f6b23,0x3b385416,0x3b5f1bdb,0x3b82cc46,0x3b816bdf, +0x3b99bd21,0x3ba6dfe6,0x3bb3e7e2,0x3be0e3f3,0xbbab49b4,0xbd0c6e32,0x3c52d2dd,0xbb6d1ea9,0xbd1fc51b,0xbd17b809,0xbd1217d5,0xbd0a01e5,0xbd03fca6,0xbd0030e6,0xbced22c0,0xbb4a870e,0x3c8e25b8,0xbd1d79c0,0xbc0120b3,0x3c0cbfbf,0xbd0ca621,0xbcb95387,0xbd253421,0xbce9e2d5,0xbcfec4a3, +0xbcf3cc73,0xbd1d3253,0xbd29567a,0xbd1d4ca3,0xbd245527,0xbd1da627,0xbd0be85d,0xbd104b35,0xbd0e6586,0xbd0c249f,0xbd0d57f7,0xbd0ea74e,0xbd1430e5,0xbd0e860d,0xbcf70942,0xbd2b26ee,0xbcaa8036,0x3c176503,0x3d78c5b9,0xbce8fa29,0x3bd04cc9,0x3d637e71,0x3d620352,0x3d5e63de,0x3d49fc08, +0x3d4ff205,0x3d4e32a7,0x3d48f9f0,0x3b9645a8,0xbd0b6c2e,0x3d60eee5,0x3c022322,0x3c253634,0xbd0a6635,0xbca9a7e9,0xbccd7cd7,0xbcee2e5e,0xbd541747,0xbd6b9b92,0xbd4188fd,0xbd62e813,0xbd59516d,0xbd2dbfb2,0xbd349911,0xbd32315c,0xbd2f2abd,0xbd35e063,0xbd361fea,0xbd3fcdac,0xbd22341f, +0xbd14c6cb,0xbd278d59,0x3cab53b6,0xbc915310,0xbc865a42,0xbbc65b39,0xbb096336,0xbca16103,0xbc98f64a,0xbcc1879c,0xbc7cdbba,0xbcd2a373,0xbcc9813f,0xbc3a03ce,0xbc94bd4d,0xbba31b25,0xbc1e71d2,0xbd1021f7,0xbd15f0d8,0xbd1b057a,0xbca42db2,0xbca5a17f,0xbc961c69,0xbd83a7b2,0xbdac31da, +0xbd8205ec,0xbda396a4,0xbd90f1f8,0xbd4d8bed,0xbd616d9a,0xbd53b968,0xbd4aa052,0xbd513373,0xbd547db7,0xbd74a683,0xbd32c0a9,0xbd35b93f,0xbcf5f08f,0xbc3d73f8,0xbc4197ac,0xbbcb198b,0xbbd0d020,0x3b7f14ce,0xbc6a8313,0x3bdaf317,0xbc46bd48,0xbb026947,0xbc1088db,0x398fcb92,0xba95a19f, +0xbb846c3f,0xbc237220,0xbc07e0cd,0xbd00dc18,0xbd3fef1e,0xbc7fd7d3,0x3ca10505,0x3c09ea34,0xbbc97797,0xbda1e203,0xbdca47b5,0xbd870a98,0xbdc5ea86,0xbdc12994,0xbd7da296,0xbd8daa15,0xbd8e7044,0xbd89af4e,0xbd94439b,0xbd8f05a8,0xbd9af9ee,0xbd4e3997,0xbd233ccf,0xbd0d309b,0x3b6e450d, +0xbc33b551,0x3be053b8,0x3b91a9be,0x3c305654,0x3b814045,0x3c5c65c6,0x3c736701,0x3b5c348d,0x3b8eb433,0x3aa4ff06,0x3c248b82,0xba424aa1,0xbc526fc8,0xbc0211d8,0xbd3ee301,0xbcb9cb48,0xbd869beb,0xbddacff1,0xbdc094f1,0xbd64a9a3,0xbd842c22,0xbdacbfce,0xbdf59a41,0xbdb4f74a,0xbd8b8c93, +0xbd5e27b1,0xbd55bb6c,0xbd2fd5fb,0xbc31bedf,0xbce21040,0xbd290dd2,0xbd52cb5b,0xbd4cae96,0xbd80c818,0xbd6e49a4,0xbc57b738,0xbcc901cc,0xbc5b9e84,0xba58c88a,0x3bb547bd,0x3a49dcaa,0x3c330781,0x3c583316,0x3b10b04d,0x3c1836ca,0x3b8da852,0xbbc54e94,0xbb9b9a7a,0xbb98e582,0xbca1fd2c, +0xbcfd8d53,0x3c18a8e6,0xbc7cc309,0xbcba7c1b,0xbce214f0,0xbd5b83cd,0xbd79e43d,0xbd6cbd68,0xbd784bdf,0xbd3286a1,0xbd4f2fa2,0xbd43fe58,0xbcf78d8c,0xbce64846,0xbd2f85d0,0xbd78697e,0xbd84a05a,0xbd8189e8,0xbd7c3536,0xbd626bb1,0xbc4fcf51,0x3bdc940a,0x3b6caa72,0x3b398455,0x3b9a951a, +0x3c0a7fed,0x3c6b111c,0x3bd4924c,0xbb4eb972,0x3afac25f,0xbbe61111,0x3b96f7ce,0x3ca55f1a,0x3c43d01d,0xbc2e769a,0xbc988f34,0xbc6f975a,0x3c06a14e,0x3cc2da2d,0x3d1e8728,0x3cb41085,0xbd6ba0aa,0xbd9d9d42,0xbdf950b9,0xbe2e9323,0xbdee85b6,0xbdaf88e1,0xbda81dfe,0xbddb849d,0xbdee62e3, +0xbdcf59c5,0xbda251ab,0xbd4749c1,0xbc81eef6,0xbc236f1b,0xbc9b349b,0xbce1a029,0xbcb75a2b,0xbc4ce821,0xbbf42bd7,0x3c9c3174,0x3c82e62a,0xbca25c13,0x3a03ccfd,0xbb1a2be0,0x38dfa175,0xbbbb7541,0xba11e11c,0xbb43c24d,0x3d0fb3d3,0x3d3d0081,0x3d105431,0x3c4a9a81,0x3c861379,0x3c871ad5, +0xbd3a7666,0xbdbffed1,0xbe37b1be,0xbdfa89d3,0xbd8e5ed7,0xbcebb063,0x3b981786,0x3b862420,0xbcc9526f,0xbd41332a,0xbd898371,0xbd8e1247,0xbda4823b,0xbda676f8,0xbd8e9fea,0xbd8b2cf8,0xbd570c27,0xbcb119ba,0x3b8ee495,0x3b0bccc8,0x3a8c13ca,0x3ca4282a,0x3c9a9999,0xba56c66f,0x3c35e986, +0x3c07c56b,0x3b57a3fc,0x3c713ffb,0x3ca1c9a0,0x3b9f70ae,0x3c84a785,0x3b853921,0x3b952416,0x3b16a084,0x3d2d403b,0xbcea2262,0xbdde1907,0xbdbfbbdf,0xbda826a0,0xbdabfcbb,0xbdc53212,0xbdea3ed1,0xbd8d63f0,0xbd3c0bfe,0xbd3787c7,0xbc9e92e8,0xbc2a5e53,0xbc852d37,0xbaf04730,0x3b1beaee, +0x3befd532,0x3c344552,0x3ba2c187,0xbb1b201b,0x3b92c2ce,0xb99aafd9,0x3ba828ba,0x3c2a2913,0x3c28dfc9,0x3b8fd2da,0xb9e7f6a7,0xbba6e070,0xbb4a957c,0xbb980ca7,0xb6f57367,0x3a67f85b,0x3c541f51,0x3c8b2d23,0x3ca3a289,0x3b1ed2b8,0x3d314bc4,0xbc3d1949,0xbcfaf5b4,0xbc8b1008,0xbd03ab84, +0xbd036448,0xbd2a728f,0xbd9194c9,0xbcf15e05,0xbc1a7e1c,0x3bce054d,0xbc3a0dea,0xbcce8dd4,0xbd035aa7,0xbd17a630,0xbd0ff513,0xbcef9dfc,0xbce56143,0xbcab9b91,0x3a161b39,0x3ae4bb94,0xbba0f1fd,0x3a429081,0xbaa35316,0x39a29da8,0xbae8cdef,0xb9ee0549,0x3b11d40b,0x3b8c76ee,0x3b6f1ec4, +0x3ba94179,0x3c001b3a,0x3c2612e5,0x3b2ee44b,0x3b87d2c4,0xbc1683c1,0x3a9b23e3,0xbbcd29cc,0xbc86e6ab,0xbc7ad59e,0xbcb6fbeb,0xbcdeca05,0xbd053f77,0xbd234c48,0xbcfdc75a,0xbcdd9dbe,0xbc91ece4,0xbc2bf8dd,0xba2cc85e,0x3c1e8166,0x3acad92d,0xbbb27a80,0xbc468baa,0xbc62a346,0xbc9fd967, +0xbcbfccca,0xbc378669,0xbb3b4bf1,0x3b2152ca,0x3aed0c55,0x3bca6fed,0x3b8dd07e,0x3c102dbc,0xbae49c6e,0x3bd031d8,0xb9c03715,0x3bb3e894,0xba78bf41,0x3af0aae1,0x3b9ad289,0x3c30a708,0x3a02e768,0x3ced2c1b,0xbc288bc1,0xbc84ee7c,0xbcb336c1,0xbcdde9ff,0xbd074e46,0xbd1bad2c,0xbd341bbd, +0xbd145a02,0xbced71c5,0xbcbb466b,0xbc870a4d,0xbc446343,0xbbe03755,0xbbc72f86,0xbb541d1a,0xbac84d3e,0xbad9edae,0x3a713ce5,0xbb3d8ff9,0x3ba3c90c,0xbc0dae84,0xbc4b9185,0xbbec06a3,0xbc0c72fb,0xbc83c5df,0xbc84968a,0xbc770a43,0xbbc84264,0xbc34db3b,0xbc1e1684,0x3a972f9c,0xbb5244d7, +0x3ba9dcf2,0x3b833cd0,0xbbd647a7,0xbc348e84,0xbcc25ed4,0xbc959560,0xbcb01191,0xbcbc0627,0xbcc7e210,0xbcd3cba5,0xbcf103fb,0xbcce5e99,0xbcbcd03c,0xbca816ca,0xbc9399bc,0xbc795091,0xbc3ddbe7,0xbc512ca2,0xbc5ea254,0xbc646b46,0xbc6da2a2,0xbc61d5e5,0xbc827c5b,0xbc4194d5,0x3b255fc7, +0x3cd154f0,0xbc8d659c,0x3a3e48a7,0x3ce32c1a,0x3cecf7b2,0x3ce8dc0d,0x3cd4b7ea,0x3ce48029,0x3ce30e38,0x3cd9417a,0x3b9e8b27,0xbc87fcb5,0x3ce7e71c,0x3bfe7494,0xbcba278c,0x3cfa26cf,0xba37faf2,0x3d25fae1,0x3cd4dd20,0x3cf37006,0x3cd78085,0x3d039645,0x3d0b2e40,0x3d0d1a4e,0x3d064e6f, +0x3d03ce07,0x3d092d8d,0x3d02718f,0x3d01120d,0x3cf74b8a,0x3cff0ac3,0x3cfede40,0x3cfd784f,0x3cfdcdae,0x3cd8da6b,0x3d214c62,0xb9d4406b,0xbcf5522c,0xbd83483c,0x3c54dbef,0xbcd588b8,0xbd7baa64,0xbd7ac9ec,0xbd7923db,0xbd644170,0xbd77e774,0xbd782cd2,0xbd6a1e24,0xbcd3debb,0x3c865b9f, +0xbd7c15cf,0xbd0df95d,0xbd2466ba,0x3d0de325,0x3ce69dff,0x3ccfbfa0,0x3c9b96b9,0x3d036495,0x3d14fdde,0x3d197012,0x3d11f1ff,0x3d1a7b22,0x3d36a26b,0x3d297374,0x3d216b49,0x3d120cfd,0x3d1f651d,0x3d1fff38,0x3d1dfd94,0x3d121a8e,0x3d11639e,0x3ce98230,0xbd1170fb,0x3c481439,0x3c2500a2, +0x3bdd35c0,0x3a91f863,0x3c3fb60a,0x3c8b76d5,0x3c8eeb60,0x3b1964c9,0x3c9035bd,0x3cb5a91d,0x3c326e58,0x3c5ccd59,0xbb801cb3,0xbb0e1a2f,0x3cae963b,0xbbb4bbfa,0x3ce98143,0x3d2381e6,0x3cef9363,0x3c8367c1,0x3d3eebbc,0x3d6d9928,0x3d80339d,0x3d537810,0x3d4983ab,0x3d71e489,0x3d507331, +0x3d4d8bd0,0x3d31322c,0x3d3de27e,0x3d36f319,0x3d3a6abe,0x3d1a65d0,0x3d2d4f2f,0x3c339622,0xbbc8a426,0x3b5ed71b,0x3c1ec173,0x3c71d960,0x3a3d93a3,0x3c14faff,0xbaf019f9,0x3ca7d0bb,0xbbb1d314,0x3c24260c,0xbb9fdce8,0x3c267ac5,0xbaa371d6,0xbb30d1b6,0xbc0236d5,0x3b198708,0x3b6eb593, +0x3d3eefc5,0x3d1aec80,0x3c9b3493,0xbba38a9a,0x3cf0c5fb,0x3d5067c6,0x3d7b8a37,0x3d516a23,0x3d68a680,0x3da8d12d,0x3d8f1069,0x3d83e941,0x3d62e921,0x3d7e4943,0x3d7fc859,0x3d709310,0x3d4a3816,0x3d365e81,0x3c6d5fc8,0xbc3a4c27,0x3c973252,0x3b414418,0x3cc583bd,0x3ca75d73,0x3c10f926, +0x3c9504ca,0x3c4afe69,0x3c533ed3,0x3ba3cb02,0x3c212c3b,0x3c958bf0,0x3c37f77e,0x3ba63093,0x3c3dc052,0x3c9234a0,0xbd16959f,0x3bb2632c,0x3c9b9682,0x3cde3e72,0x3d3cb8ab,0x3da922f0,0x3d95802f,0x3d11f8ae,0x3d051412,0x3cbf4b81,0x3cf08a13,0x3cfd5503,0x3cf38132,0x3c70fa2e,0x3bb5eabb, +0x3b9ad8a4,0x3c93b974,0x3cbb577a,0x3d26e0ee,0x3c070862,0xbce4c7a4,0x3bbbc5cd,0xbb16d620,0x3beca121,0x3c11af82,0x3bd8ff36,0x3c6becd1,0x3c72a7d6,0x3beb1c6f,0x3c801f51,0x3c18813a,0xbb987fcd,0xbb8ad48f,0xbc3d395d,0xbc9cb347,0xbcb81d90,0x38b51e4b,0x3cc52ff8,0xb9a01efa,0xbd055932, +0xbd916862,0xbd604f43,0xbd50118c,0xbd8299a4,0xbd9068bf,0xbd810cb1,0xbc70bf8a,0xbceecfb3,0xbce3b1fe,0xbc5ce9c3,0x38d6d063,0x3cdf3c35,0x3d9be3fe,0x3d3b6cd7,0x3d20ded8,0x3beb538c,0xbc8a35af,0xbb7a0be8,0x3a8ea786,0x3ca6fbb1,0x3cae6c2d,0x3c1954ad,0x3c132fd8,0x3afb037f,0x3b5199f6, +0x39bba3b6,0x3c177c74,0x3cda500d,0x3c269bd0,0x3c276f44,0xbc36bba5,0x3c5e0eaa,0x3cadc638,0x3d5c5349,0x3d6858e2,0x3d99d2b2,0x3df1a99a,0x3e11a210,0x3e051116,0x3d845a92,0x3d89ffec,0x3d3c088b,0x3d0ddb43,0x3d6b56af,0x3d8cba49,0x3d8d0605,0x3d5e90e7,0x3ce5dc7c,0x3b45de5d,0xbc24f5b7, +0x3b7b3627,0x3bfcda4b,0x3a5abc07,0x3c26c6d6,0x3ac44481,0x3ce8afd1,0x3cc3291b,0xbc28d35a,0x3c0bc7ae,0x3bd94b9d,0x3beab834,0x3b527fce,0x3bc814bd,0xbc0c4308,0x3cdf4bb6,0x3d4ab60b,0x3d025dee,0x3cf86237,0xbb0f1987,0xbc7f0cb3,0x3ca29465,0x3d4fe445,0x3e01795b,0x3df23ec4,0x3db6d073, +0x3ceed6d4,0x3c8a9a6d,0xbba61f8f,0xbca8cd1e,0xbd37121c,0xbd6a2c64,0xbd7157e4,0xbce89ec5,0xbbe00131,0x3ba617df,0x3c0512bb,0x3c025936,0xbb813798,0xbc81a346,0x3bb7694d,0x3bea49e1,0x3c8d00fb,0x3c741387,0xbba7261b,0x3c591398,0x3c248c05,0xb932a3eb,0x3c42accd,0x3ca89b2b,0x3cc78b46, +0x3ca12b26,0x3c9b9cca,0x3aaffc0c,0x3c24537c,0xbd143d3e,0x3c7033ed,0x3d9f789b,0x3d961077,0x3da2a5b1,0x3da3f0fa,0x3d91103e,0x3d1ecbff,0x3d1619f7,0x3d334246,0x3d9bc9bf,0x3d75c048,0x3d5549af,0x3d14e955,0x3c7110a8,0x39314288,0x3c140449,0x3bcd6240,0x3c8c9022,0x3cab73f3,0x3bea0916, +0x3c915372,0x3c0240f6,0x3c827e96,0x3c93b975,0x3c6e6998,0x3bbb9c58,0x3bd34f09,0xba561496,0x3c08e9fb,0x3b85c79d,0xba7c596e,0x3bdbecac,0x3c1a8da4,0xba3a4ba5,0x39dbbff0,0xbd0ba07c,0x3b002d3c,0x3d174fe3,0x3d1912ca,0x3d509b94,0x3d574079,0x3d5cf704,0x3d598f23,0x3d01604b,0x3c8d67a1, +0x3c777fcf,0x3c2268ff,0x3b06508a,0xbc36f738,0xbb5b4b07,0x3c014bdf,0x3cad4bf5,0x3c6fff81,0x3c095ca0,0xbc1cd400,0xbc29e7b7,0xbb121386,0xbbf38b2e,0x3bec5949,0x3c439602,0x3c27abf4,0x3c37cc0e,0x3c1ce07d,0x3c9b5678,0x3c844056,0x3c8f2c2d,0x3c9dab96,0x3c7dbce4,0x3c6b7074,0x3b9ed05b, +0x3c31126a,0x3bdd0a6d,0x3cc65a5d,0x3d0a00ad,0x3cd03fb5,0x3ce3213d,0x3cd83562,0x3ce8766f,0x3d089ec9,0x3cfb2d3f,0x3d0359d2,0x3d041354,0x3cfd935e,0x3cf52ca4,0x3ce03175,0x3cc3cd82,0x3c8bbaf1,0x3c53b574,0x3c761912,0x3ceef51a,0x3cb556d3,0x3aefffbe,0x3c135ac6,0x3c3ddaf5,0x3c4984bc, +0x3ba06707,0x3c3e17d8,0x3aac373c,0x3c82eed7,0xbb3ad5d8,0x3c18abd1,0xbaedd2d0,0x3ba90e3b,0x3b0f405b,0xba8c5798,0xbc0c0ec7,0x3b930db5,0xbccc0aea,0x3bd0f933,0x3c1fd97c,0x3c53b60a,0x3c8d2d3a,0x3cada225,0x3ccb34fb,0x3ce38d35,0x3cbfab71,0x3c99db44,0x3c6ebf4d,0x3c349bfc,0x3c02414e, +0x3bc3e845,0x3bf1eb0b,0x3c1cf4eb,0x3c3507cf,0x3c30add3,0x3c0fbad6,0x3c57a8b4,0xbbe16f0a,0x3c348417,0x3c196811,0x3b96f309,0x3addc6a9,0x3c2ba193,0x3c68d507,0x3c3fc0e4,0x3adfcd29,0x3c60eb0a,0x3c8749fb,0x3bf9e9b9,0x3c0b22e9,0xba86a0d2,0x3866bbe2,0x3c24b104,0xbb3b4963,0x3caffae4, +0x3c80e430,0x3c93d552,0x3c991c6a,0x3c9ebc52,0x3ca46ab6,0x3cb532d8,0x3ca6a879,0x3ca22246,0x3c9bad7f,0x3c941fd4,0x3c8aebad,0x3c748c09,0x3c7bfec1,0x3c7862e2,0x3c792290,0x3c82efd7,0x3c746e43,0x3cac2732,0x3a9582e7,0xbc93c429,0xbd228a45,0x3be5308a,0xbc95e258,0xbd369eb7,0xbd36a2bb, +0xbd2bf99b,0xbd140c2f,0xbd21e518,0xbd1cbe24,0xbd119fc7,0xbc971da1,0x3be5644d,0xbd1230f7,0xbcb710b7,0x3ca84581,0xbc9fbd3f,0x3c9f50b3,0xbcef254f,0xbc6135a2,0xbc805790,0xbc5da838,0xbc8f2408,0xbca51879,0xbcc49c0a,0xbcc44e4b,0xbcc01213,0xbcb0d950,0xbca5aca1,0xbca485e1,0xbcb037f0, +0xbcb26287,0xbcb1ace9,0xbcabc91d,0xbcab7ba3,0xbc920290,0xbcfc8c49,0x3c9f3568,0x3d2e2402,0x3d57adf9,0x3c1cb4da,0x3d281321,0x3d4b9760,0x3d5896f9,0x3d57797b,0x3d3b7801,0x3d5a5e95,0x3d5e5805,0x3d5b8490,0x3d211803,0x3b4a334f,0x3d481f6f,0x3d37fcd0,0x3d2f46a3,0xbc85b3d1,0xbc6fa6c0, +0xbbcd6908,0xbae4c7cd,0xbc103e8b,0xbc89a55b,0xbcdfea92,0xbcf88d6b,0xbcf74354,0xbcce18d9,0xbcb12270,0xbcb2a04d,0xbcdedc6e,0xbcf2af6e,0xbcf69629,0xbcea8537,0xbcd0dbf8,0xbce4461a,0xbc91eaa1,0x3d1bd2e2,0xba35c8a7,0x3c225da9,0x3c048ec8,0x3c4c556f,0x3a1db8ef,0xbb4662c0,0x38d9eaa6, +0x3c49f021,0xbb783472,0xbc26353f,0x3bb45c8d,0xba3a897a,0x3c3ee6b0,0x3c46751e,0xbc3ecece,0x3ca68a04,0xbb89554f,0xbc64a3a7,0x3b5203c1,0x3c4f24b8,0xbb91f97e,0xbcafd457,0xbd39073b,0xbd4be410,0xbd3eae21,0xbd098244,0xbccd07d1,0xbcc5e326,0xbd056973,0xbd13fe50,0xbd14ffc3,0xbd0b25f4, +0xbcf82e49,0xbd196343,0xbc2742ba,0x3c5c0c2f,0x3bf5c3a7,0x3c362f48,0x3bc609b3,0x3c92123e,0xbabfdb7d,0x3c7e814a,0xbc297411,0x3c8011de,0xbbc37b2b,0x3c5676df,0x3c46db5c,0x3c069e29,0x3bc11a0c,0x3c62e250,0x3b9427c5,0x3cd2781a,0xbbb6c0c6,0xbbcdb604,0x3ceb8dd4,0x3d5100a8,0x3cd78910, +0xbb897a87,0xbd2ea506,0xbd5a9f52,0xbd56181d,0xbd0b0ba3,0xbca34bf9,0xbcaa7b68,0xbd19e983,0xbd4320ac,0xbd510725,0xbd40525e,0xbd312bd2,0xbd3b0058,0xbcaef128,0x3c2b4c62,0xbc5356bb,0x3c8d4b07,0x3ba9d94f,0x3b051796,0xbbec173c,0x3bdbb484,0x3c471e19,0xbb1afc17,0x3b5cefbd,0xba061284, +0x3c64cda0,0x3b8e64fb,0x3c01c8ce,0x3bc28ce9,0xba81a04c,0x3ca356d2,0xbd227bd6,0xbd940b98,0xbd8ab664,0xbdb13188,0xbd54b60c,0xbd202a4d,0xbd55a004,0xbd7a5e8e,0xbd827a3b,0xbd5c02ff,0xbd4e45ad,0xbd00bf65,0xbc8ae393,0xbc105e8d,0xbc261b80,0xbce43e1d,0xbcc71fd5,0xbd26aef7,0xbc7e59d4, +0x3c4627ce,0xbc7cf0e0,0x3b5db954,0x3adb47e6,0x3c3e0656,0x3c80b000,0x3c37d027,0x3c22b541,0x3bcb5644,0x3c631e80,0x3b9609eb,0x396d0f4c,0xbbbe0095,0x3b834636,0x3b721281,0x3c820410,0x3b3e55e1,0xbcedd029,0xbda46e59,0xbd710397,0xbce2636c,0x3b847615,0x3c57804f,0x3b4d1357,0xbcf7e434, +0xbcf4b368,0x3bfc17f8,0x39c79b2e,0xbb8791c7,0xbc2cbb5f,0xbceb9e43,0xbd22b919,0xbd4f0b3d,0xbcd2ef0b,0xbcd80a94,0x3a3f4279,0x3c40baf4,0x3b343769,0x3c1a875b,0x3be5a46f,0x3bc26fa7,0xbacc35b0,0x3b2de4de,0x3ac3ee44,0x3b379c8a,0xbb02df9c,0x3c0377b2,0x3bd30385,0x3c92b8eb,0x3b32f546, +0xbc2cd802,0xbcb0261c,0x3d51ce33,0x3d475da2,0x3d964144,0x3d9f0f89,0x3cf62680,0x3cf4773e,0xbc72258c,0xbdaa0afc,0xbdb68661,0xbdae6e10,0xbd4767a6,0xbd85d71b,0xbd855949,0xbd67453a,0xbd66daad,0xbd14e460,0xbc0951b5,0xbc2657de,0xbcd64406,0xbc61cfbf,0xbc0d28e7,0xbbfd8de4,0x3c42adc7, +0x3cc8dde3,0x3cab450a,0xbb0e51ee,0x3bb7e9b3,0x39d2b7e5,0x3b480483,0x3b74da14,0x3c0fbc44,0xbae0540f,0x3d09a480,0x3d26a301,0x3d777ec5,0x3d4ae5f7,0x3ba317e7,0x3c826439,0x3c9831d1,0x3ceed912,0x3b225651,0x3d1b39dc,0x3d3481de,0x3c40c989,0x3d35f4b3,0x3d334878,0x3d3ddf2d,0x3aa50abf, +0xbca02f93,0xbcbda47f,0xbd2b2eb7,0xbd4f5cdf,0xbd44d570,0xbd234664,0xbd0d8d00,0xbc52b237,0x3c27c24a,0x3b8683fc,0x3b01d85e,0x3c1a2c57,0x3bd82f84,0xbc0afb4b,0x3b863a8c,0x3c21416d,0x3aa51e06,0x3bfce891,0x3c5696df,0x3c6fb6d6,0x3ca843ab,0x3c463ce8,0x3bc5f389,0xbb1b6ead,0x3d472b60, +0x3d258cd3,0x3b88edb7,0x3c09c4cd,0x3c0037c4,0xbbf0f86f,0xbc98359b,0xbcb711ab,0x3b631e9f,0x3cc6ba53,0x3d6a1832,0x3d3a32a9,0x3d143b71,0x3cb73c59,0x3cbc54d0,0x3ca3359a,0x3c341100,0x3c88c5bc,0x3c2eb6ee,0x3c02a522,0x3c7ece95,0x3af893c1,0x3c000111,0x3c924f08,0x3c99ca05,0x3c299d87, +0x3c2c28c9,0x3bad8075,0x3c1143f1,0x3c078987,0x3c406f7b,0x3c80fdaa,0x3ca916dc,0x3cc843d0,0x3cd98eb9,0x3d0028ab,0x3d16c1c3,0x3cc9629b,0xbb20f4d8,0x3b8e5aee,0x3c17df18,0xbbd43624,0xbc9f5a2b,0xbcf83082,0xbce37464,0xbca02de2,0xbaaa7462,0xbb49d02b,0xbac3a05c,0xbb9f136b,0xbc39c0f0, +0xbc4a3a70,0x3aaa717f,0xbb4156c7,0xba9320cc,0x3bd7b4ca,0x3b620915,0x3c173f30,0x3c97b389,0x3c2e117e,0x3be47f18,0x3c33febb,0x3c2c04d0,0x3c4581fe,0x3b8cf95f,0x3c503dc1,0x3c8ac592,0x3c53595f,0x3c701d31,0x3c51872a,0x3c4c620e,0x3c6afa78,0x3cc1d832,0x3c28288f,0xba943fb9,0x3baaf943, +0x3b024c1a,0x3a5a87b5,0xbaf1d07f,0xbbeda68e,0xbb2c2369,0xba4e8e2e,0x3a9ab9b3,0x3bae532a,0x3c109b1a,0x3c408c4e,0x3c5d0b65,0x3c6eb9ec,0x3c5a5fa3,0x3c59390c,0x3c01bac8,0x3c8e02e7,0x3cd43f51,0x3c87ec21,0x3c3e8100,0x3c31135d,0x3c65c55a,0x3c1a0627,0x3c6c927e,0x3c029ea2,0x3ca58c50, +0x3c09cd5f,0x3c54e9fd,0x3c09e52a,0x3c2e4453,0x3c790a45,0x3ca2edb1,0x3c8845c8,0x3ca1b2f6,0x3b5782f7,0xbae07bf7,0xbb639464,0xbbfc4a61,0xbc2f7ece,0xbc66c568,0xbc8b746f,0xbc863bcc,0xbc854c75,0xbc85535f,0xbc7c8438,0xbc6278cb,0xbc2f5b0c,0xbc39029f,0xbc3b26d9,0xbc48b485,0xbc1f4a80, +0xbc274dbe,0xbc1c8ed0,0x3c531e0e,0x3b25598b,0x3c20f467,0x3c3f5d69,0x3c8e14c0,0x3c83199d,0x3c4f92cc,0x3c82a5d8,0x3cae8fb8,0x3c5ba979,0x3c307356,0x3c66e6f6,0x3c44dc0f,0x3c5e3369,0x3c49ecde,0x3b6c9218,0x3c999bf7,0xbb801fe3,0xba2c2b7c,0xbb0f3fbe,0xbb4a86e4,0xbb80374d,0xbb9cdfb7, +0xbbce0e0e,0xbbc8a27b,0xbbc3ee5c,0xbbb40bc6,0xbbb18068,0xbbb95255,0xbbbed166,0xbbb0653d,0xbb92bced,0xbb6e2cd4,0xbb78e654,0xbb1bc430,0xbc00e7e0,0x3c828257,0x3ce61664,0x3cea957c,0x3c715b5d,0x3d018c63,0x3d036a25,0x3d04e52b,0x3cfccdc8,0x3cdd1a9a,0x3cf6d060,0x3cf0580d,0x3ce71a50, +0x3cf3be1f,0x3c7976ab,0x3ccae34f,0x3cf48cfa,0xb940fb9b,0xbb45cf67,0xbd0ff83e,0x3b9953a6,0xbbb08666,0xbbce8a7f,0xbbce941f,0xbbec796a,0xbbdb9949,0xbba4567b,0xbb9e33bf,0xbb6bd72e,0xbaccf539,0xbac8ad98,0xbae9401d,0xbb5421e6,0xbb06093c,0xbad570fc,0xb9adb789,0xbad28f75,0xbb1b050c, +0x3befe561,0xbd0cc93a,0xbd2a286c,0xbca91c46,0xbce3628c,0xbd2a4798,0xbcc114e9,0xbcda17b1,0xbcdd33f5,0xbcbcad65,0xbcf67984,0xbcfbace6,0xbce7f24f,0xbd2a3c40,0xbcd92c53,0xbcba3c9e,0xbd36c0a0,0xbd10c09d,0xbc30ff57,0xbbf8da6f,0xbc6a3b34,0xbc5c338e,0xbc8e425f,0xbc85b758,0xbc4eff78, +0xbc67ff7a,0xbc3cc21d,0xbbd47181,0xbb4633d4,0xbada6021,0xbb921bc9,0xbabef100,0xbaa5761f,0x3b199722,0xbb94c03e,0x3adddd3e,0xbbc3e71a,0xbd033bd9,0xbbe5b438,0xbc850133,0xbc284f7c,0xbc640beb,0xbc5620de,0xbc16fd46,0xbc7e52eb,0xbcc34fcb,0xbc5901c0,0xbba262ea,0xbc0df145,0xbc31ee71, +0xbc9be117,0xbcc3ffbb,0xbc4d9a4b,0xbcda58b4,0xbc32e18d,0xbc2ec1d7,0xbcb79063,0xbcabb984,0xbd10e73b,0xbcfd302e,0xbc8f3278,0xbc9a39d6,0xbc4117dd,0xbb7e8077,0xba638914,0xba35c2da,0xbc1c9780,0xba83265f,0x390f2a31,0x3c0add48,0xba8c4bd1,0x3c139da7,0xbbd777e8,0xbcb70e6c,0xbbfddcfb, +0xbae7f59b,0xbb1af56b,0xbc3e9110,0xba77ff27,0xbc22812c,0x3b892260,0xbc8bf840,0x381ffb43,0xbc4d7066,0xb947d37c,0xbc1c1c11,0xbc557aba,0xbca567ea,0xbc9c19fc,0xbce7bd4b,0xbc779a24,0xbc5ca2f7,0xbcdc2fa7,0xbce8d8e2,0xbd5926b2,0xbd4d1c72,0xbd018559,0xbd19f0de,0xbce12124,0xbc5f97c9, +0xbb6217fc,0xbb58ebbc,0xbc488f50,0xb9955c37,0x3b5c7ee6,0x3c5d3f73,0xbb9f0065,0x3c2f61b2,0xba4ea16b,0xbcb405a8,0x3c6a4101,0x3aab1d2d,0x3c582098,0x3c30458f,0x3c0c8d47,0x3c292d42,0x3c29169b,0x3c1627e3,0x3af40df7,0x3bce5794,0x3c76c49b,0x3b8de89e,0xbbe12aa8,0xbc1ed2e4,0xbca889ec, +0xbd83071d,0xbd53646e,0xbd17faa5,0xbd3566d1,0xbd44ae2f,0xbcef4bec,0xbca0e6f7,0xbc80f6a0,0xbc1bf177,0xbb515b6a,0x3b90888b,0x3c823e28,0x3ca404d1,0x3c80b49f,0xbc441475,0xbc61d1fe,0x3d086297,0x3c9bfc29,0x3cc3c5a9,0xbc829e02,0xbcdd4afb,0x3c346055,0x3b96b021,0x3b9eb098,0x3b9d47ed, +0x3c81c9cc,0x3c46a335,0x3c0f7577,0x3be98825,0x3b9a54a9,0xbb828443,0xbbf7326e,0xbc8a82f4,0xbce7bc62,0xbce9cb83,0xbd3850c9,0xbd1ce585,0xbc970d7e,0xbc8e4613,0xbd106ee9,0xbcea6546,0xbd0ac114,0xbd12e49b,0xbce7843c,0xbd212cf9,0xbd22e1ac,0xbc994f31,0xbd0df9f8,0xbd245bf3,0xbd38d072, +0xbcab6be6,0xbc80a4ab,0xbcb6ddee,0xbcdc4667,0xbc40605e,0xbc975791,0xbc8d9388,0xbbfd8023,0xba83a1b9,0x3c9d8c68,0x3c842dee,0xbba3f8ad,0xb9d39f9d,0xbacb39b6,0x3ae15d26,0xbb448e28,0xb915a15c,0xbb52f113,0x3c17e66b,0x3bddf1d0,0xbcaf6072,0xbc93842a,0x3d1ccc4b,0x3d68cf67,0x3d4bb67a, +0x3c9a32c8,0xbcf054d3,0xbd2ea140,0xbd44e44f,0xbd2e36c0,0xbc8eaaab,0xba3bf100,0x3cbd6d26,0x3bdff9b1,0xbbd383ff,0xbcf2cb9d,0xbd0e845e,0xbd112e21,0xbcab4259,0xbc451dc8,0x3b47aa56,0xbc18686a,0xbc884432,0xba893891,0x3a447c62,0x3c1f4725,0x3c36bf7a,0xbac63c65,0x3bccddfc,0x3b6224c7, +0x3a6e5c88,0x3b8c7f9b,0x3bfaf281,0xbbcdc9b2,0x3c68c578,0x3d02e4cc,0x3d17d6c6,0x3d2949f6,0xbb783d9f,0xbcb6ce8d,0xbd66aa81,0xbd770262,0xbd323d23,0x3bc99495,0x3c977bf0,0x3c673b13,0xbd00ff18,0xbd6f57bd,0xbd601189,0xbd6f447c,0xbd53eeec,0xbd40c627,0xbd356592,0xbd2830c2,0xbcffc3db, +0xbcd27991,0xbc465df4,0xbc7c0ace,0xbc8d43b4,0xbba4e472,0x3b906c89,0x3b0c8dfd,0x3abfc58c,0xbbae8ea6,0x3b2817a9,0x3b06507c,0x3b1db282,0x3b85d91e,0x3c36e445,0x3cbce847,0x3caf71ee,0x3c7fd27d,0x3c00479d,0x3bb2f698,0xbc626e6a,0xbd321316,0xbd483448,0xbd5218cf,0xbd27201f,0xbd086439, +0xbccc5e38,0xbc17e45a,0xbc75cadb,0xbc44cda1,0xbbe37bf1,0xbc5a69ec,0xbc67eee8,0xbc8b1062,0xbb9b2ad1,0x3b8650cc,0x3c170c63,0x3aea34eb,0x3b2464aa,0x3b0b58b0,0xbc072efb,0x3abcd14a,0x3c2754e3,0x3c9222f1,0x3c95003f,0x3bd245e6,0x3c054bda,0x3c376005,0x3c0829a4,0x3bf85b27,0x3a14a61f, +0xbb0153a4,0x3b9b1a00,0x3bf4410b,0x3bf27811,0xbc3ac1cf,0xbc308eca,0xbcda93cc,0xbc8b49c3,0xbc4c099e,0x3b93e68b,0x3b938366,0x3ba43ec6,0x3be63c27,0xbc78c31b,0xbc722f0b,0x3b91669b,0x3bb62c0c,0x3b4e7d9c,0xbba62886,0xbc43f1bb,0xbc42574b,0x3b809da0,0x3c2e8989,0x3c49fcd4,0x3bf764a0, +0x3bdfa622,0x3bbf7757,0xbae15830,0xbb5f225e,0x3a1cf9e8,0x3bbafebc,0x3c266724,0x3c287ecc,0x3c4c2d0b,0x3c80bdd9,0x3c7be85f,0x3c080e42,0x3c42084c,0x3bb08dbc,0xb9b3af7c,0xbc48ed1d,0xbc52ecc5,0xbbaa21d6,0x3b539be9,0x3a8d064b,0x3b45961f,0xbb47cac6,0xbbde685d,0xbc12e97d,0xbc298c97, +0xbc67a865,0xbcabe29e,0xbc33bf50,0xb8c6367f,0x3c2e67ca,0x3c69a450,0x3c8a4dc5,0x3ca2919e,0x3c7bfab6,0x3c8b2c19,0x3c168170,0x3ac5f105,0x3b97b487,0x3bb9b6b0,0x3c193853,0x3c17e7e3,0x3c4ca44a,0x3bf85046,0x3c0c700d,0xb9a729c5,0x3b835b49,0xb9f95133,0x399a7800,0xbb6a04f1,0xbc11d409, +0xbc55efb4,0xbc1734c7,0xbabbf0d0,0x3a5cdbbf,0x3b136f8b,0xbae2036f,0xbb04d6ab,0xbb1fb810,0xbb2f317a,0xbba678cc,0xbb91202b,0xbb46b9d7,0xbb2815d6,0xbb483008,0xbbd4a2d5,0xbc261fb4,0xbc2294dd,0xbc16bb90,0xbbf8a18d,0xbbc3f644,0xbb14931d,0xbb175a0a,0xbc010a7a,0xba49dadd,0xbb9e9415, +0xb9c3109a,0xbad62a04,0x39c584aa,0x3b6926ee,0x3a2c35f2,0xb9d40212,0x3bb54094,0x3c30a1f1,0x3c273f84,0x3c136005,0x3bd90fb6,0x3b342ef3,0x3bb6fd96,0xbc543e94,0x3bd1a586,0x3b733c45,0x3b56d65d,0x3b432a98,0x3b08988c,0x3ad8f4e5,0x3ad17489,0x3b05b5cc,0x3af40ec4,0x3b061522,0x3ac6a3b4, +0x3af616db,0x3af49447,0x3b391f27,0x3b4d34bd,0x3b5b771b,0x3b57ef64,0x3b3d6c31,0x3bc77060,0xbc47bfb9,0xbc806635,0xbac05b30,0xbc1fb6ec,0xbc7f5d51,0xba3b2f87,0xbb026ff6,0xbab1b229,0x3a0411de,0xbb21f3bf,0xbb46e2b8,0xbb137113,0xbc58ca8b,0xbc0b9f67,0x3a5aa2dd,0xbc6c428a,0x3b8e6e0d, +0x3c843449,0x3cfd4238,0x3c269387,0x3c4c0b8d,0x3c7e7258,0x3c91fe9c,0x3cb1961a,0x3cb69354,0x3ca50ab0,0x3c91f60b,0x3c856394,0x3c81e66d,0x3c8123cc,0x3c81ac41,0x3c859d07,0x3c7538d3,0x3c73910f,0x3c805e68,0x3c810bad,0x3c6b9c0f,0x3c6caf75,0x3d0b5f35,0x3cce42b5,0xbc749193,0x3d0a9926, +0x3cda8c8b,0xbc425674,0xbc1aa167,0xbc137484,0xbc2a3dc0,0xbbbe2a68,0xbb949108,0xbb4026bd,0x3cd460fe,0x3d047431,0xbc6f5dc9,0x3cc1b76c,0x3be95729,0x3c504ac6,0x3bf385bb,0x3c88736b,0x3cb00e76,0x3d09dac5,0x3d107a48,0x3ce3979c,0x3cb14eff,0x3c941f81,0x3c99438a,0x3c91b085,0x3c93174f, +0x3ca5a3a7,0x3c956883,0x3c9cf918,0x3cb25983,0x3cb33de8,0x3c8bf39f,0x3cd8a884,0x3c657b46,0x3c93af10,0x3cd4b25d,0x3c81b178,0x3c7899db,0x3cb453fa,0x3c8af707,0x3cb966a0,0x3cbc8460,0x3ca85ec8,0x3c7e66ee,0x3c89427e,0x3c85c1ae,0x3c4190e4,0x3c506976,0x3c3fa8d6,0x3c469920,0x3ac3a414, +0xbba3a496,0x3c11158d,0x3cac893f,0x3d62f2b5,0x3d7f9db9,0x3d3ebeb7,0x3d06e07a,0x3cb0a122,0x3ca3fc8e,0x3c9afeda,0x3ca080cc,0x3cbfee75,0x3c894708,0x3c8f2347,0x3cb5e55b,0x3cada8cf,0x3c8eb872,0x3cc172f9,0x3ce160a0,0x3cb46990,0x3ca3761d,0x3c9312b7,0x3c8dfb6d,0x3c961a76,0x3c38d78b, +0x3bbf4111,0x3c63b378,0x3b5e27cf,0x3c37601d,0x3c7d8c9d,0x3c30dbe7,0x3c009018,0x3b841971,0x3bebb0c0,0xbc4116a4,0xbc722976,0xbc99b4c6,0xbb078b24,0x3c89e397,0x3d95f136,0x3dad7b3b,0x3d718999,0x3d14552c,0x3cb30c4f,0x3ca42a2a,0x3c9f5e78,0x3cb3f3ef,0x3cff62be,0x3cd7bc72,0x3cdcc163, +0x3d0ba75a,0x3d069ac9,0x3cb7e20c,0x3cf7bc81,0x3cb249e4,0x3c3c01ad,0x3ca258ea,0x3c4a8687,0x3be56103,0x3bd97e10,0x3c080a6f,0x3c01b6dd,0x3948d18f,0x3b8f70cc,0x3b3b7b64,0x3c292b0a,0x3b7fe092,0x3a55fa3d,0xbc82b07c,0xbc69443c,0x3ce8b87f,0x3cce9082,0x3c1b2f1f,0x3c658c48,0x3c3b1f73, +0x3cbd81c8,0x3cef2862,0x3d0ac554,0x3cc12fe4,0x3bf4cbbd,0xbc8e2795,0xbc3a48bb,0xbca33660,0xbd0f48a2,0xbc8c637f,0xbbacfae6,0xbbe67762,0xbaac4a32,0x3abab4bf,0x3cc080e9,0x3cc3b54d,0x3c55e291,0x3cac778b,0x3c4ef13b,0x3c64b374,0x3c917b0b,0x3c4313f4,0x3bfe77fc,0x3b8df37a,0x3beacdcb, +0x3b282f46,0x3c0dada2,0xbb43b349,0xbb4fa178,0x3ba8f855,0x3cbe6752,0xbc45cc56,0xbcad475e,0xbd2adf9c,0xbcb7b04f,0x394afdb0,0x3d4bb1cc,0x3d5887f2,0x3d1b7fd4,0xbc2c8ef7,0xbcdbaf4b,0xbc72b0be,0x3c040a94,0x3cd27dcd,0x3ccd5a85,0x3d06c0fa,0x3d0bf78e,0x3d255970,0x3d12fad8,0x3ccb5f0f, +0x3c843727,0x3c006dbe,0x3c24b9e7,0x3c8d476e,0x3ca25dee,0x3c8a1f2b,0xbb0860c0,0xbadddca2,0xbafeefaa,0x3b80dc3f,0xbb731908,0xba869ce7,0xbba8fe77,0x3c7587cf,0x3c9a8688,0x3bc25547,0xbc1b8deb,0x3d6bf8c6,0x3dadc4cd,0x3d8e9f51,0x3d971653,0x3dce386f,0x3d7b70ba,0x3d504c5f,0x3d7dad9c, +0xbc4a4589,0xbcdc2af8,0x3bec0228,0x3cd33f06,0x3d1d1587,0x3cd9d604,0x3c6a5213,0x3a29b955,0xbbac22d6,0x3b492d44,0xb8643965,0x3b660e96,0x3c040038,0x3bb18b14,0x3cb6259e,0x3c822bcd,0x3c1b4189,0xbab16572,0x3b43789b,0x3adc853d,0x39b6b457,0x3b640858,0x3bf7dfb2,0x3a9ea5fb,0x3c9d4f9c, +0x3cef48fc,0x3d52daa8,0x3d55f9d4,0xbb4dbbca,0x3c1b0e6c,0x3d4db2c6,0x3dc8795d,0x3e206500,0x3e120465,0x3ddc9321,0x3d493055,0x3c321c6a,0xbbf6a9ed,0x3c1246e1,0x3b8d2ce0,0x3c2aee4d,0x3868912b,0x3c4fe9dd,0x3c382e81,0x3ac0c9a1,0x3a8c5b32,0xba704e8e,0x3b0dd1b9,0x392a1a12,0x3c010b4b, +0x3c9dbfa4,0x3c2093bb,0x3c1a4fc4,0x3befc24d,0x3a8b821f,0x3b99381a,0x3be50ca6,0x3b184b95,0x3bd75832,0x3caa6d1d,0x3cc239e1,0x3ce24a8d,0x3c661626,0x3c204499,0x3c8e1704,0x3d8478fe,0x3dc24fd2,0x3da6ed0b,0x3d80bbc7,0x3d949c96,0x3d8fbbf8,0x3d916bec,0x3d5da9fb,0x3d64fd33,0x3dac6432, +0x3d7877dd,0x3d38e24d,0x3d019c64,0x3c3b678e,0x3b6caf06,0x3b93a50c,0x3be3e4ed,0x3c093c43,0x3c72a92d,0x3c71a595,0x3c74200a,0x3c370a9a,0x3c895fa1,0x3c8c26c2,0x3c328a46,0x3c502e57,0x3c61df65,0x3cc88908,0x3c84a389,0x3c6cbab8,0x3c6e5d8b,0x3c6eac91,0x3c8bc8e8,0x3c77cdc4,0x3d1b6ac3, +0xbb7ab9ce,0x3cc54878,0x3ceb5dc6,0x3cd47355,0x3cb68cd0,0x3cde98f3,0x3cd65888,0x3cd28302,0x3adb6650,0xbc062ba0,0xbbf6b643,0x3c63d973,0x3d0eca09,0x3d4484e1,0x3d57df62,0x3d360729,0x3cb2c696,0x3c95d1a1,0x3c749b1f,0x3c19f09e,0x3c4183b0,0x3c8d0cb1,0x3cbc5b5d,0x3c852b9b,0x3c053f10, +0x3bbef612,0x3c29e880,0x3c4ca34d,0x3c564630,0x3c83d9ed,0x3c8f9fa8,0x3c871c19,0x3c980080,0x3cbb000a,0x3c9e2273,0x3cb98b89,0x3ca3c877,0x3c5a1e90,0x3c8e9678,0x3cccf73b,0x3d003655,0x3cf2301a,0x3ce8946d,0x3cf51ad8,0x3cd94312,0x3cc0de75,0x3c86fc8c,0x3c59aacd,0x3c123c74,0x3bf51bfd, +0x3be8faa8,0x3c0f78f1,0x3c27411a,0x3c7090ce,0x3c731fb2,0x3cad032d,0x3ca0f590,0x3c2309a7,0x3b87b736,0x3c18c513,0x3c58947b,0x3c948a98,0x3c499da1,0x3c35be4e,0x3c234aaa,0x3c0cf621,0x3c1fef66,0x3c42dd68,0x3c4d5c9a,0x3c5c0c0a,0x3c5e33c3,0x3c8562ac,0x3bccfca0,0x3cd116e0,0x3cb95802, +0x3cbc7641,0x3cb9590c,0x3cb8f53d,0x3cb831b1,0x3cb76473,0x3c85f465,0x3c35cd45,0x3bdf29e5,0x3b69d99e,0x3a6c4409,0xbafaada3,0xba9709f2,0xba833f71,0xbaa27897,0xba9abb53,0xbb4364ba,0xb938c5e7,0x3adea76f,0x3c1fd951,0x3c8a5d26,0x3c67e461,0x3c939e60,0x3cc7dc21,0x3cc1549a,0x3ce58929, +0x3cdbaa59,0x3cdb0d5e,0x3cc2ebe7,0x3cbb60f7,0x3cb5cdc9,0x3c9aa209,0x3ca4a35c,0x3cb1fbd5,0x3cdcafb5,0x3cb40ac3,0x3c9ca4c5,0x3ca4ad08,0x3c9e7cc3,0x3ca1840a,0x3ca1bcb8,0x3ca88670,0x3c9a4fd8,0x3c92b06f,0x3c885e13,0x3c7301b7,0x3c538190,0x3c292643,0x3c3537ad,0x3c378eca,0x3c38270e, +0x3c3fbb8b,0x3c400ac3,0x3c2ec36c,0x3caa7bb9,0x3c8a8c6f,0xbb9a7522,0x3cd6f976,0x3cb14e99,0xbb1b2ff2,0xbaafa41c,0xba8e6841,0xba6d0061,0x3a82d297,0x3add47cd,0x3b143118,0x3ca89c3d,0x3cebad49,0xbb9619c4,0x3c9ae239,0x3ca8bd96,0xbcc99437,0xbccf61c3,0xbcde4ab2,0xbcb78ffa,0xbcce5666, +0xbcc34840,0xbce9cfbd,0xbcf2d86d,0xbcde2846,0xbcf4b924,0xbcef8761,0xbcd1ca14,0xbcd6e8da,0xbcd2784c,0xbcd001a8,0xbccb5839,0xbcc7f90d,0xbcc3d3f8,0xbcc6eb4a,0xbcabc7d0,0xbcce7ced,0xbcb8ef8e,0xbb562180,0x3d24ccbd,0xbce296eb,0xbbcea716,0x3d12ee83,0x3d06ecac,0x3d02a8ea,0x3cf58772, +0x3cee6715,0x3ceaf935,0x3ce72d62,0xbbf84658,0xbcfd23ec,0x3d093c80,0xbbb7a634,0xbaaa1b3d,0xbd0473f0,0xbcc7004c,0xbce3f3a9,0xbccf09bf,0xbd1b190e,0xbd2a3e24,0xbd0e2ba3,0xbd2d4e41,0xbd257de3,0xbd00ab28,0xbd0611c5,0xbd034c53,0xbd053811,0xbd04919a,0xbd0294c0,0xbcf5ad30,0xbceb2b9d, +0xbcc0a5cf,0xbcccbe10,0x3c397c8a,0xbc27cde9,0xbc678971,0xbbdb788b,0xbbae001b,0xbc6fccea,0xbc8d2eee,0xbcbdd837,0xbc938cbd,0xbcb5a67e,0xbc950fda,0xbc259641,0xbc69fd2a,0xbc01b634,0xbc87b812,0xbcdd526e,0xbce5baa2,0xbcf9be3e,0xbcebc843,0xbd05b0cf,0xbccd59e5,0xbd5dffea,0xbd835583, +0xbd46be72,0xbd84fdbe,0xbd78e72c,0xbd276008,0xbd3aca9d,0xbd291e7d,0xbd23757c,0xbd1873d3,0xbd10a64e,0xbd0b20c8,0xbcf6c7e5,0xbcd8ea4e,0xbc595299,0xbbab57d2,0xbb24419a,0xba3b16a3,0xbb89e3b9,0x38544c3b,0xbb15f2ee,0xba3f4e68,0xbc3b3251,0xbbf6447c,0xbbd57000,0xbafc6315,0xba03ac1f, +0xbb29494a,0xbc042865,0xbc779053,0xbcbd19b5,0xbd050a23,0xbceca22d,0xbca71844,0xbccb4045,0xbc7717ab,0xbd7c1e1e,0xbda0dc84,0xbd6f59e7,0xbdaa9cf0,0xbd9cbaba,0xbd36e345,0xbd540c90,0xbd556204,0xbd52187c,0xbd5993f2,0xbd4fa908,0xbd39dfd4,0xbd183c66,0xbcc34a1d,0xbc3696d5,0x3c28ff2c, +0x3bc8f7ac,0x3c410b87,0x3b8e9bcf,0x3bba165a,0x3c2cbe5c,0x3bbb062d,0x3bfa798b,0x39d49b02,0x3a5bacdf,0x3ae7e92f,0x3c4510db,0x3b20da7b,0xbc162f82,0xbc95623e,0xbd07993b,0xbc144711,0xbd52ff51,0xbd8dbf90,0xbd99da45,0xbd87925b,0xbd8011ef,0xbd6a4410,0xbd493f71,0xbd1566bf,0xbd1cb653, +0xbd84c2bd,0xbd3ebdd1,0xbd18947a,0xbcbc1676,0xbc795b29,0xbc9179e3,0xbca7c4ff,0xbce186a1,0xbd11e742,0xbd0f53a7,0xbc0f496f,0xbb83a1d3,0x3b97b580,0x3adf3b7d,0x3b81feef,0x3c7ef376,0x3be96162,0x3b21608a,0x3b0ecd3e,0x3a369988,0x38e81561,0x3a4e38c4,0xbc15b703,0xbc299420,0xbc30f68a, +0xbbde2894,0xbd42cb27,0xbd48903f,0xbd1d742a,0xbd073f7e,0xbcdfe72a,0xbcdcd291,0xbcd8cbed,0xbc74b643,0xbd41887a,0xbd3a34d8,0xbd34dd5d,0xbc1dc0a2,0xbb1ef1bf,0xbca3f7e5,0xbcf7087c,0xbd41e5d1,0xbd6d1b29,0xbd3dfc58,0xbd0f9443,0xbc6161b9,0x3bb23a28,0x3b7a94ce,0x3b81763f,0x3c2acf2e, +0x3c2c2722,0xbae23299,0xbb016f67,0xba998b3d,0x3a6b49f8,0xbbafe75e,0xbb584603,0xbc26fd47,0x3c2aff0c,0x3aa448e4,0xbc37c6ff,0xbd25a5a4,0x3d875452,0x3d5d6bca,0x3d008d1e,0xbc44b218,0xbdd066cd,0xbe1ce8db,0xbe2a1b7a,0xbdd6ce3d,0xbddf7adb,0xbdb2385f,0xbd9c8b6b,0xbd9700f5,0xbda0a682, +0xbdc11bdd,0xbd84f550,0xbd28f876,0xbca44052,0xbc1e9e9b,0xbbec9939,0xbca8c4bf,0xbc84d644,0xbb4ccb67,0x3c998695,0xbbc793bc,0xbc0ce0b7,0xbb68426f,0xbb83d0e1,0xbaebfda4,0xbb1cfc55,0xbb291ea7,0xb9ea3f49,0xbb915c22,0x3c0f6c0f,0x3cac53ae,0x3d6017b4,0x3d5657fa,0x3c18acd2,0x3bfda10c, +0xbd28bcd8,0xbd7e8f63,0xbdaf05d2,0xbd67903a,0xbd147ea1,0x3a95f64f,0xbd773d80,0xbd8e3b57,0xbd5d3a76,0xbd25d989,0xbcdbdc25,0xbce15d3d,0xbd161be9,0xbd3d60da,0xbd2f796c,0xbd33feef,0xbd003f8c,0xbc480a7c,0x3a0a4b66,0x3a53a38c,0x3c9b66d0,0x3bbfda60,0x3b5f8d46,0x3be4326f,0x3a5a5508, +0xb98cac8b,0x3adc4541,0xbb56dd91,0x39d38dc4,0x3c431f96,0x3cb11b53,0x3c86e941,0x3ca7f6ae,0x3c1aa998,0x3cd44c8c,0xbccf5054,0xbda90dc4,0xbda8ff88,0xbdb0f480,0xbd9f61ed,0xbd7af4ce,0xbcc972aa,0xbcf0634e,0xbcea9094,0xbd2d69c8,0xbcf55caa,0xbcfea9df,0xbd324b67,0xbd092f40,0xbccb438c, +0xbc53b6d3,0xbbe7a606,0xbc14d680,0xbc19b333,0xba003bba,0xbb4acc1c,0x3c1a5554,0x3c295f32,0x3c1e1071,0x3b887d61,0x3bf0cb4b,0x3c10f1bf,0x3c901c6a,0x3c22758f,0x3c0d6152,0x3ba0396d,0x3bf6e51f,0x3c2e5085,0x3ca10646,0xbab62a5d,0x3c974485,0xbccef102,0xbd2a70fa,0xbd0bee5a,0xbd12bde7, +0xbca5fb87,0xbc96cfad,0xbd0e623b,0xbc526c75,0xbac8030e,0xbb12b05a,0x3bbbb533,0x3c338257,0x3c7d04d3,0x3c71d526,0x3c1accc5,0xb9af6d16,0xbb7eca8a,0xbaabc025,0x3c445af7,0x3c6c14f6,0x3c22d3c5,0x3c16f5c9,0x3ba83baa,0x3b902d57,0x3acc7f4e,0x3b18968f,0x3bb3a95e,0x3c1dfca5,0x3ba7fbfc, +0x3bb4d940,0x3c089082,0x3c3d19d4,0x3bbbd2ae,0x3bd82b4e,0xbc20c8cb,0xbbf5c3b9,0xbc2bf9f1,0xbc2e478c,0xbc16563d,0xbc2959ad,0xbc4d5063,0xbc4784ed,0xbc45ccc2,0xbc4d149d,0xbc760755,0xbc75d62a,0xbc3c979c,0xbc071623,0xbb2d1cc7,0xbb7939e3,0xbb186242,0xba35e2e9,0xbb0f1520,0xbc0b5e22, +0xbc16882a,0xbad25586,0xbb316bd6,0xbb9cbdad,0x3a612db5,0x3c281a73,0x3c5b0bd6,0x3c686af6,0x3b3cd145,0x3b90d23a,0x3b4f355c,0x3c01ec26,0x3bbbcb84,0x3b877ebf,0x3b4ce8dc,0x3bb283cc,0xbb102303,0x3ce20099,0x39f3f9af,0xbaca842e,0xbbb53dbd,0xbc022312,0xbc36c885,0xbc6f1de6,0xbc927af8, +0xbc64652d,0xbc15e491,0xbbaaead5,0xba944096,0x3b11936e,0x3bad402d,0x3b8cb2d1,0x3b647d66,0x3b3b7952,0x3ad5d6fc,0x3b59e820,0xba8a3784,0x3b89034a,0xbb23e25b,0xbb8ee6b8,0x3af22a0d,0x38c3c018,0xbb9e07fd,0xbb99ec00,0xbb8cc74a,0x3ac87eb8,0xbad4d989,0xba2159e1,0x3bb8eced,0x3b881686, +0x3c2f9c33,0x3c0a2005,0x3b2670b5,0xbaf7845a,0xbbea617a,0xbb75c902,0xbbc6b06f,0xbbe7598f,0xbc037b13,0xbc0fc7b3,0xbc32d625,0xbc03abce,0xbbdd92f8,0xbbb17dec,0xbb8d1fd4,0xbb51e518,0xbabe20f3,0xbb148933,0xbb2996b0,0xbb3ee0e9,0xbb60337c,0xbb46a496,0xbb93ba63,0xbba3173d,0x3bc2393a, +0x3cf64448,0xbc06a385,0x3bb7b058,0x3d0af01f,0x3d08fcef,0x3d057545,0x3cfc0545,0x3cfc112b,0x3cf75726,0x3cec357d,0x3c00fdc3,0xbc02e647,0x3d09bf23,0x3c3df76a,0xbbf4929e,0x3cd879fe,0x3c1daf8e,0x3d02d934,0x3c9b3043,0x3cb04017,0x3ca19513,0x3cd8a483,0x3cee0b4e,0x3cf8ab62,0x3ce97902, +0x3ce4b141,0x3ce85d8c,0x3cdb02fd,0x3cd86516,0x3cd859e4,0x3ce098b3,0x3ce2e425,0x3ce40da2,0x3cdff449,0x3cc34c39,0x3d08e20e,0x3c3b7656,0xbc491d15,0xbd47051d,0x3ca04be3,0xbc214c52,0xbd37c36e,0xbd3badc3,0xbd3af17c,0xbd2c24ff,0xbd331901,0xbd30b4c6,0xbd2552c9,0xbc1872f9,0x3cb5d857, +0xbd442880,0xbc843c4c,0xbcd83322,0x3ce33a02,0x3c6bb16a,0x3c6fcf32,0x3c8341e3,0x3d0ee007,0x3d2d9afa,0x3d30bf55,0x3d1c890b,0x3d0ed7b0,0x3d136705,0x3d024993,0x3cfe8f11,0x3cffacca,0x3d0d8592,0x3d120d51,0x3d1318ff,0x3d07475d,0x3d015c1a,0x3d024a15,0xbc84ec7f,0x3c8c10f1,0x3c8139ac, +0x3c218ef5,0x3bba19f9,0x3c91eaff,0x3c82a1a6,0x3c8cfaaf,0x3bffea6c,0x3c97b14e,0x3ca8c56d,0x3c5001c4,0x3c80b36b,0x3b06ea4a,0xba031904,0x3c9d9064,0x3b174298,0x3ca93858,0x3c3eb6b8,0x3b7df579,0xbb16bbbb,0x3d075de0,0x3d4fccda,0x3d6eed92,0x3d5572c1,0x3d3e7455,0x3d462355,0x3d1b6aed, +0x3d15c1f2,0x3d1f8fc8,0x3d315c17,0x3d344d71,0x3d385a18,0x3d162745,0x3d1f9736,0x3cbbbfd8,0x3c458966,0x3c7add1c,0x3c63ffda,0x3c88281b,0x3bd34a42,0x3c941150,0xba21ae85,0x3c458656,0xbae0f312,0x3bf9adc7,0x3ae2f197,0x3c3bc2b2,0x3bcac675,0x3b90f323,0xbbfc3693,0x3c12de60,0xbb0da2b0, +0x3cb6a18b,0xbaa52b4d,0xbc3ee38f,0xbc31a762,0x3d2d6f24,0x3d9409d7,0x3da6d090,0x3d8a0a68,0x3d6764b5,0x3d784a8b,0x3d3f8251,0x3d386d2d,0x3d498d8b,0x3d681693,0x3d7218e0,0x3d6f7562,0x3d4a79b2,0x3d30e279,0x3cf4dfa8,0x3c2b675b,0x3cd7c99c,0x3c4254cb,0x3ca1c3df,0x3c8066ef,0x3c9649a2, +0x3c282592,0x3b87078f,0x3b76693a,0x3b180c1e,0x3bfa4039,0x3c6345d8,0x3c44ba54,0x3be7b3e1,0xbbf46549,0x3c2580e3,0x3ba90b25,0x3c5e0042,0x3cb3903c,0x3c64ac70,0x3bdda99b,0x3cf5213c,0x3d1ebc54,0x3d3204e4,0x3d71240e,0x3d59a4cc,0x3cca4f85,0x3c82b1d6,0x3c380255,0x3b99119c,0x3c9cf7d3, +0x3c9ecd7a,0x3c38bccb,0x3c794957,0x3cfa9a11,0x3cb80fb8,0xbb5078af,0x3c8a40d3,0x3c664100,0x3c23a912,0x3c074ace,0x3c6951df,0x3bfe2e08,0x3b5f8bf3,0x3b8cde2a,0x3bb666f6,0x3b1dd71c,0x3b2c6d69,0xbac59938,0xbbe87262,0xbc18d8a8,0x3c37c811,0xbcc2b702,0xbc4fab91,0xbb473509,0x3c15d62b, +0x3b633eb0,0x3c272ec3,0x3c75d7b8,0x3c9f0b53,0xbb31cdbf,0xbc8bbba0,0xbd1e149c,0xbc98bd02,0xbc0ef0b1,0x3c03acbf,0x3caeca5e,0x3d1be915,0x3d85e7e8,0x3d3da4c5,0x3d167301,0x3c2afd7d,0xba88db91,0x3be0434e,0x3c591a4f,0x3c9f35bb,0x3c9d6d28,0x3b9567bf,0x3a5559c4,0x3b066e3a,0x3b4e5d57, +0x3b32459a,0x3b2ea19e,0xbb432dfa,0x3c0b007b,0x3c850c54,0x3c0f982d,0xbb42537d,0x3d4495bc,0x3d3cd220,0x3cf08434,0x3c389b87,0x3ce33da4,0x3d00e646,0x3d41c352,0x3dadef24,0x3d0841d1,0x3c5f55fc,0x3b6d2cc7,0x3d37b4a5,0x3d783b0c,0x3d4dd004,0x3d4d0678,0x3cdeafcd,0xbb0be21b,0xbb9abd79, +0x3bfd680a,0x3c27fa42,0x3c2d07d8,0x3c9174d1,0x3cf3a72e,0x3b1e2116,0xbba8677b,0x3a97fbf6,0xbabe9788,0x3b853350,0x3b178dde,0x3a1815c2,0x3ade3e2d,0xbac596d5,0x3b28056c,0x3c717657,0x3d31bdb8,0x3d37fde6,0x3c1ad9d5,0x3c602e1d,0x3d7e92af,0x3dcb6878,0x3e28abf4,0x3df9e267,0x3d9c8821, +0x3d1dbfbf,0xbcc692cd,0xbd1547e3,0xbccfd5d3,0x3c113df3,0x3c8d63e5,0x39eb0dc8,0x3c388d76,0x3c89e7b8,0x3cbf0c2d,0x3c9324da,0x3c2516ae,0xb82b371b,0xbc4d6fcb,0x3ade3777,0x3cc7b7e9,0x3bbaa8d2,0x3b79b367,0x3c0acc99,0x3b49e898,0x3b0280b6,0x3af878a1,0xbae538e8,0x3b0a1e16,0x3c9d39a3, +0x3cb60f91,0x3cff0494,0x3cc7f70f,0x3ca7fba8,0xbc56de57,0x3d060b59,0x3dac971a,0x3d99a263,0x3d8a8145,0x3da55e85,0x3dc7e54b,0x3dda7f18,0x3d9e7cc0,0x3d6bbf05,0x3d181664,0x3cb5f238,0x3c5f7ad0,0x3be855f7,0xbc172957,0xbc9e5259,0xbc7b6d06,0xbc824eac,0xbbb31576,0x3b8bf1a8,0x3aedecc8, +0x3c4bb13c,0x3c50023e,0x3c1f104d,0x3c240c5c,0x3c1979c4,0x3c211b3d,0x3c6bbf7d,0x3c98059b,0x3ca2d650,0x3c82cc6e,0x3c2e7863,0x3c0e0899,0x3c168add,0x3be277d1,0x3c8f68f5,0xbcdd48d8,0x3c23d246,0x3cd99770,0x3cad6c02,0x3d048786,0x3d167c69,0x3d22b9db,0x3d54c502,0x3d0b4c03,0x3cb07b95, +0x3c2a6a86,0x3ce0c07f,0x3d1afc98,0x3d3fc403,0x3d3faffc,0x3d3c90a3,0x3d1a3143,0x3cf000d6,0x3ca2313e,0x3bd3f352,0x3bf3ffe8,0x3c29db9d,0x3bdddced,0x3c80482b,0x3c7754d0,0x3c1517e5,0x3c096e86,0x3c0c6b74,0x3c8168d6,0x3c2c976b,0x3c36f78d,0x3c7fa694,0x3c7e5bb8,0x3c961471,0x3c57fe39, +0x3c6447b1,0x3c2742b4,0x3c8ab7ae,0x3cc2e9eb,0x3cab51ac,0x3cbe3bbb,0x3cd23ffb,0x3cf802d5,0x3d12e3ef,0x3d00a1d0,0x3ced52b6,0x3cba0cea,0x3c7197bc,0x3bbf619f,0xbb099730,0xbaa0aa8d,0xb98cf9d2,0x3aeeb0fa,0x3b06f3d8,0x3bb76075,0x3b3bba14,0xba8dbd52,0xba79fb7e,0x3a4678f9,0x3b90a245, +0x3ba14c62,0x3c511d52,0x3bd6870d,0x3c50c462,0x3b30b35e,0x3c28b1e2,0x3bc7ee82,0x3c3f5587,0x3c06d5e2,0x3bb2f3e2,0x39e38715,0x3c10ad35,0xbbfb877e,0x3c8d2303,0x3c9a32a4,0x3cad66a8,0x3cc11411,0x3cd6670a,0x3ce2b516,0x3cf34811,0x3cce3999,0x3cb13ec5,0x3ca021e4,0x3c8305e8,0x3c5d29ec, +0x3c229489,0x3c30e585,0x3c2734ad,0x3c22cb85,0x3c1a82db,0x3c0535a5,0x3c31bfcc,0x3a87a844,0x3c58d82e,0x3c7d9787,0x3c39fb40,0x3c3179e9,0x3c901006,0x3c981d8d,0x3c961be2,0x3c415da1,0x3c91db38,0x3c8b3516,0x3c43a908,0x3c59cf41,0x3c06e917,0x3c2a4a24,0x3c8947cd,0x3c33f206,0x3cc3a658, +0x3c9f4db7,0x3cad61db,0x3cb101c1,0x3cb4f39d,0x3cba8143,0x3cc8f705,0x3cba6f47,0x3cb042a4,0x3ca24b12,0x3c9a166a,0x3c919c61,0x3c84dd2f,0x3c871b6d,0x3c8762e4,0x3c87942a,0x3c8c5316,0x3c8723c8,0x3c9f9315,0x3c2a616b,0xbb1bc5f0,0xbcaf0b14,0x3c7f711b,0xbaa42236,0xbcbcbf01,0xbcbbc848, +0xbcafa27d,0xbc95b3f5,0xbca084cd,0xbc98277e,0xbc8e1db7,0xbb1ac4df,0x3c7f63f7,0xbc99c60a,0xbb83d5b7,0x3cbebc97,0xbca3e002,0x3bac3b57,0xbce22e1a,0xbc8d61dc,0xbc9f653c,0xbc807527,0xbca1afbf,0xbcaaac85,0xbca7879f,0xbcb3308c,0xbcb55154,0xbcb0b669,0xbcb33d81,0xbcb34d68,0xbcb31888, +0xbcaff626,0xbcada750,0xbcad8795,0xbcaae0e6,0xbc8ebfbc,0xbce03e1b,0x3bf6f4e4,0x3ceed7bb,0x3d477ee9,0xbac321fa,0x3cda5d61,0x3d3e6a7d,0x3d3dbd46,0x3d3aa0fa,0x3d25e769,0x3d3bb0ef,0x3d3ef211,0x3d3a7222,0x3cce093f,0xbbdc9e8a,0x3d3284e7,0x3cf28bbd,0x3cee2c35,0xbcac6ffd,0xbcb28077, +0xbc977667,0xbc26d6c5,0xbc9dadd8,0xbcbe8b10,0xbcc17628,0xbce466da,0xbcee2a20,0xbcdd7722,0xbcdb3076,0xbcdc6b79,0xbce49aea,0xbce73c60,0xbce47dad,0xbce6f843,0xbcc71c15,0xbcc558e4,0xbc897966,0x3d084ffa,0xba9553bb,0x3b480b8f,0x3b9416a5,0x3bfed9ce,0xbb078fa7,0xbc01c7e8,0xbc0987a5, +0x3afe4819,0xbc1375c0,0xbc3ee1d4,0x39cd0661,0xbb63e564,0x3be1ad72,0x3a92793d,0xbc85f3a0,0x3b98dc42,0xbc54c1d0,0xbcfde1be,0xbcbb05dc,0xbb66294e,0xbc99949c,0xbcdf3e14,0xbce50e0e,0xbd138c56,0xbd1e138a,0xbd0d952a,0xbd12e2c8,0xbd1275db,0xbd109f41,0xbd0c39f9,0xbd06719f,0xbd097ecd, +0xbce05b96,0xbcf516a4,0xbb8f2b0c,0x3c71a7c1,0x3c196ed9,0x3bee84f1,0x3b88bc86,0x3c64a1d4,0x3aa0bad3,0x3c02616e,0xbc5ded8c,0x3bb93ee9,0xbbbdb39a,0x3c1d00a0,0x3bbe24a3,0x3be80519,0x3b633945,0x3aed2a61,0xbb1e217d,0x3b89dbe9,0xbc81c015,0xbd0d0898,0xbc8dd91f,0x3c8b65dc,0xbbc38601, +0xbcb28a90,0xbcebb515,0xbd306904,0xbd4fa1d2,0xbd2a39a6,0xbd1ac40b,0xbd2107e9,0xbd2e986c,0xbd3b519d,0xbd391c66,0xbd35f847,0xbd0bf131,0xbcfb9d76,0xbbc9bb85,0x3cbd23a1,0x3b3f6b96,0x3c9cdb89,0x3ba75a5d,0x3b7e9a15,0x3c024c6c,0x3b22de50,0x3b79aa60,0xbbb1419d,0x3a71de59,0x3ab0b829, +0x3c1737bf,0x3bc8345b,0x3bc178e2,0xbc28d63d,0xbc5be1d9,0x3ce2a5c9,0xbd4de30f,0xbd785bc0,0xbd82a421,0xbd9bb626,0xbd8aab31,0xbd687c3e,0xbd5ffc80,0xbcc97746,0xbca5fd44,0xbd43ffcb,0xbd6889fb,0xbd499ad1,0xbcb4ff7f,0xbbd9b720,0xbbd61b25,0xbd0d16e5,0xbce89db1,0xbd17c190,0xbc4102f1, +0x3c5d7126,0xbc0af460,0x3baef858,0x3b39de2a,0x3c09726d,0x3c6800f8,0x3b269d63,0xba67587e,0x3b5a7b78,0x38854a85,0xbb7f8c29,0x3b7a82e9,0xbb62bcce,0x3abad48e,0xba5a7441,0x3ccf0308,0xbcd6818b,0xbd4893ff,0xbd0919a6,0xba284141,0x3cdd8086,0x3c7f7dce,0x3c6b30d9,0x3cebe4cc,0xbabf61d4, +0xbcb5a1ed,0xbd0176a4,0xbc96c62b,0xbc4ad932,0xbc0df0ad,0xbce6332e,0xbd184a63,0xbd33e6e3,0xbcd3d7d5,0xbcd19d27,0xbb54cb23,0x3c8376a7,0x3c35caa0,0x3c923b0c,0x3b09e11e,0x3a797c4b,0x3b284642,0xba56e3cc,0x3a666b4d,0x3a9898be,0xbae9a788,0x3a3ebaf4,0xbbf5ee1b,0x3be2b9e4,0xbaf10fab, +0x3b1636c6,0xbd05bf9e,0x3d53a24d,0x3c4f004f,0xbc37f658,0xbd46c942,0xbdf06ffe,0xbde9b6ac,0xbde88da7,0xbdc57e99,0xbdb186ba,0xbd8fe6aa,0xbd8bd1af,0xbd93d9e3,0xbd8f4ea5,0xbd5d9289,0xbd1fa994,0xbcba43f2,0xbc046331,0xbc072fcb,0xbc975c51,0xbc38255c,0xbb400529,0x3b069b91,0x3cf40760, +0xba923794,0xbbecd7d7,0x3b81eda0,0xbba13e74,0x392c49aa,0x3a6b6416,0xbaa6585c,0xba5c0b7f,0xb9daf6e0,0x3b1ce04c,0x3ba8b97c,0x3d31abf3,0x3d2dce57,0x3cd1eaaa,0x3d21d29f,0x3d379a40,0x3d254d35,0xbbc2f11f,0xbc356c10,0xbc9b720c,0xbcb0135b,0xbcb7ce0a,0xbc606de4,0xbc22cf8e,0x3c255a6e, +0x3c219518,0xba132d94,0xbc98b5e6,0xbced9248,0xbcff3cfb,0xbcf9c27d,0xbcec6367,0xbc4a337e,0x3a67efc9,0xbb463c6e,0x3c7ffb5d,0x3aecfd41,0x3a2c5f6a,0x3bb5a05e,0xba9f4874,0x3a87e477,0xb76e655c,0xbab368bd,0x3a044c3f,0x3c00578d,0x3c99b675,0x3ca23c35,0x3d00a2b4,0x3c91859e,0x3d22141f, +0x3c45aea8,0xbcfae7a0,0xbce313b8,0xbd0aa53a,0xbc8e6af7,0xbafd2de0,0x3c7f8bb8,0x3c682ae9,0xb89f443e,0xbcee9147,0xbcceae00,0xbcc05662,0xbc7fcbba,0xbc42e9f0,0xbc49589f,0xbcb34e52,0xbc440128,0xbc460a3b,0xbc2bad6d,0x3b8c6540,0x3988f10f,0x3c3c52f0,0x3beb3225,0x3b915ea5,0x3b493a29, +0x3c399a23,0x3c38644b,0x3c81ac14,0x3c61dd00,0x3c90c48c,0x3cab46aa,0x3c87c696,0x3c8525b3,0x3cc74dc7,0x3c8ba401,0x3d0fabca,0x3c21405c,0xbc29564f,0xbbd5be2a,0xbc23c584,0xbc7d8157,0xbca58b90,0xbc88927d,0x3b3fac43,0x3c7c89eb,0x3cb609b9,0x3c85f4cb,0x3c6c9063,0x3cb5384f,0x3c909e42, +0x3c81c6cd,0x3c509320,0x3be34e0f,0x3baf94ab,0x3c4c46e3,0x3c2f1776,0x3c13acc2,0x3c4e361d,0x3c3fd9f7,0x3c3a6d6a,0x3c20f912,0x3ba2d32b,0x3bb70f5b,0x3a5a0329,0x3ac7039b,0x3b572c80,0x3bc8b168,0x3c339a5d,0x3c47573d,0x3c8f3c80,0x3c4d6121,0x3c0c8053,0xbb95a799,0xbc5e4a82,0xbc296e91, +0xbc51a332,0xbc24283a,0xbc132cab,0xbc393661,0xbc0ffb83,0xbc158782,0xbc01c284,0xbc1260e1,0xbc13d7a4,0xbc198eac,0xbc36e07e,0xbc465618,0xbc626658,0xbc4ee741,0xbc7f054d,0xbc34e8dc,0x39c0579f,0x3afc0c3e,0x3b903562,0x3b56a7b1,0x3bf62e6d,0x3ba487b5,0x3c414364,0x3b8770d3,0x3c7b4d05, +0x3c086d31,0x3c63763e,0x3c235c7a,0x3c2a4218,0x3c432e2c,0x3c829753,0x3c006358,0x3cd2546c,0x3bbb3647,0x3b33a5b1,0x3aa72b0c,0xbb3a6474,0xbbcf7fd7,0xbc25efd7,0xbc57bdad,0xbc2779e5,0xbbe62000,0xbb7efd54,0xba699c5b,0x3afeaf3b,0x3ba4c25f,0x3b95010b,0x3b85a658,0x3b423618,0x3b2a5792, +0x3b039878,0xba74854d,0x3c4be4ee,0x3b226f14,0x3bab7223,0x3c06ec40,0x3c3977ac,0x3bf1b6fb,0x3b8baf4e,0x3bbefafc,0x3c36d747,0x3b5e5e4e,0x3a758def,0x3bb1b52e,0x3b97bb8c,0x3c273107,0x3c2caad7,0x3b7841fa,0x3c551de3,0xbb10915a,0x3a6dba29,0xba9b44cd,0xbae57862,0xbb24c479,0xbb5100ee, +0xbb9fda4a,0xbb7a4b52,0xbb6e3ce6,0xbb5658dd,0xbb2ed781,0xbb021017,0xba330926,0xba9d7f53,0xba8f3806,0xba56daca,0xba95174a,0xb9643775,0xbb77e3f6,0x3c25bbcf,0x3cb0558c,0x3cfabcaf,0x3bf8b4dc,0x3cbc938f,0x3d0ee9f6,0x3d0ec223,0x3d082c23,0x3cf2d9a7,0x3d0201d1,0x3cfedd33,0x3cefb199, +0x3cb73919,0x3bfcb871,0x3cee85d4,0x3cc99fbf,0x3a91f346,0x3c0e40fb,0xbc97d76e,0x3c91ecc9,0x3bacdf28,0x3bb77ea3,0x3bab418f,0x3ba1a6c7,0x3bc8afcb,0x3c212b27,0x3c125ff6,0x3c15951c,0x3c1c0cc6,0x3c090174,0x3c033f65,0x3bfbc920,0x3c171686,0x3c1de039,0x3c1d07c3,0x3c19d613,0x3c02dcb6, +0x3c8ff2d0,0xbc91540f,0xbcfc1e07,0xbcf26100,0xbc2d3410,0xbcf7d631,0xbcf39c82,0xbd06a377,0xbd08203b,0xbceeaafa,0xbd0b6998,0xbd0c6464,0xbd050b5d,0xbcf30f22,0xbbfba6ee,0xbcff8d34,0xbd0d9231,0xbd06d6c8,0x3bfba8cb,0x3ba07da3,0xbaad8867,0xbab82070,0xbba3879a,0xbac0d035,0x3c0aa268, +0x3c10e716,0x3c28f07a,0x3c28f646,0x3c111c3f,0x3c0c9cfb,0x3c05b653,0x3c49c9fd,0x3c500f76,0x3c4a581d,0x3c1419d7,0x3c57a056,0x3c07c55c,0xbcc59ee3,0x3b4647ff,0xbb950b21,0xbb0fbc7a,0xbbcddfd4,0xbaf3b68c,0xb9d20283,0xbb920d3a,0xbc52a1a6,0xba95eb34,0x3bb61ddb,0xba945e07,0x3a885a25, +0xbc165730,0xbc8350b5,0x3a6426aa,0xbc913816,0x3ba141a5,0x3b85bec6,0xbbf86313,0xbb672ba8,0xbc970dd0,0xbc42955f,0x3c460464,0x3c25e205,0x3c5ae71a,0x3c630d13,0x3c0185e6,0x3bca6dc6,0x3b573414,0x3c5c52e6,0x3c764008,0x3c870dad,0x3c3affc6,0x3ca24240,0x3bd55da7,0xbbe1d74c,0x3b08d2bb, +0x3b5e1279,0x3ba6159b,0xbb903281,0x3b9dd6f9,0xbc13e13c,0x3bad41a2,0xbc58d43c,0x3b5e95ae,0xbbc7b07d,0x3af2ae96,0xba42e244,0xbb5719fe,0xbc820604,0xbbf4ef3f,0xbcc51aa0,0x3a8a3520,0xb9f8afab,0xbc75e9c8,0xbc717947,0xbd272e63,0xbd0345d1,0x3b792793,0x3bb628a2,0x3c4888c5,0x3c72d2b9, +0x3c2ebf4d,0x3bdf0ce8,0x3b4d359f,0x3c8e1fb4,0x3ca913ba,0x3caa6427,0x3c3c5da1,0x3cac18c0,0x3c66785a,0xbac22392,0x3ccff34f,0x3c03286b,0x3c7ef21a,0x3c579f9a,0x3c8cc903,0x3bf2204d,0x3af2397c,0x3b8ff410,0x3a818b83,0x3c0bc7b9,0x3c3bba83,0x3c27b4c9,0x3a9ab9b7,0xbc754086,0xbc56e314, +0xbcbcb74f,0xbd05e6b0,0x3af422f5,0xbc338fb3,0xbc9f485e,0xbaed5a1e,0x3c1862f2,0x3c1d0f95,0x3d241d11,0x3d2f1908,0x3ca9b976,0x3c609887,0x3b8f2da2,0x3ba3f7f6,0x3b3aa7d6,0x3bb0d6b8,0x3cd794f3,0x3cc3bd42,0x3d0a9d66,0x3bcc501c,0xbc73073e,0x3c45f4b2,0x3b936665,0x3c080c7f,0x3bde9e0a, +0x3c2b08e4,0x3b429c26,0xb95a7987,0x3bb0c98c,0xbbb4fb61,0xbbde835c,0x3b127a48,0xbb804b96,0xbc4d7b12,0xbc888b11,0xbbadf4a3,0xbd161f83,0xbc5ef1aa,0x3c9bf149,0x3c5898a6,0x3c142b67,0xbcb76847,0xbd1adfdb,0xbd034ed4,0xbc7f4c08,0xbc1f392a,0xbc8047a0,0xbcf6c389,0xbd000f30,0xbc8140e3, +0xbb5f115b,0x3bbccb18,0x3c4c86f7,0xb9e85c7f,0x3b913a7a,0xbc16486e,0xbbe76125,0x3b91443f,0x3c5ae1a8,0x3c1cf707,0x3bc7283d,0x3b3c1de1,0x395f3478,0x38f2800c,0xba207b26,0xbb051912,0xbb5645e3,0xbb5beaab,0xbba4f871,0x3a62881c,0x3add45ee,0xbc3c40dc,0x3cbaec31,0xbc1c11d6,0xbd3450e2, +0xbd8fd10b,0xbdc15b9a,0xbd719336,0xbcc3cc03,0xbbc83b35,0x3cfb4d3b,0x3cf9519e,0xbae5f6bf,0x3bb4e049,0x3c4b27b5,0x3cec49ed,0x3cc2aa58,0x3c615315,0x3a873e01,0x3a6361a5,0x3c5cb7c1,0x3b95f222,0x3a855715,0x3c466bd7,0x3c8ef985,0xbb3ce83f,0xbbe4b40f,0x3b82afe8,0xbab2f63f,0x3bac2b8b, +0x3b07896b,0x3a6fc978,0x38c3f1f3,0xbabe13b7,0xbbef49aa,0x38842fe0,0x3c4f153b,0x3cc888b6,0x3cd32a3c,0x3cf43678,0x3d627fbc,0x3d5fb53a,0x3d4d656c,0x3cefa2a4,0x3b09d9b9,0xbca97467,0xbd06829b,0xbd160aa5,0xbd35278a,0xbcdfea76,0xbc99991e,0xbb9cbd3c,0xbbf8f71f,0xbb5f0ec3,0xbaa30752, +0xbb1674e3,0xba802963,0xbc0f3ade,0xbc907358,0xbb8ed3f5,0x3c5d1946,0x3ac7e86f,0x3aba6ad1,0x3bc9db5e,0xb7f4c100,0xbaef1b45,0xba338f3a,0x3af64753,0x3bb6742e,0x3c7d348f,0x3c88989a,0x3cc9583e,0x3d009755,0x3cde7fda,0xbc9aed1c,0xbcb56aa5,0xbbe3cfd5,0xbb90a9f1,0x3c5cb9b8,0x3cfaead6, +0x3d3da82d,0x3d513e76,0x3d01428c,0x3ba557f2,0xbcfc453e,0xbd1962a5,0xbd19138e,0xbcc0f6ca,0xbc927574,0xbc4a10a8,0xbc74cb37,0xbc44b1d8,0xbb951b25,0xbb6744b4,0xbbec8aa9,0x3bde1217,0x3c542023,0x3bcef76f,0x3b8456cf,0x3b1f9d2b,0x3c3655cc,0x3c87dbc5,0x3c1181c6,0x3c662cef,0x3c4c08aa, +0x3c6b9857,0x3c183255,0x3bc47200,0x3bd0213f,0xbbc47a6d,0xbbd5c864,0x398a0c4a,0x3c89a3d9,0x3c3da297,0x3c50c87e,0x3c5b573b,0x3cbacf5b,0x3d20767e,0x3d05442a,0x3d0d3c09,0x3d1b5fb3,0x3cda5d0b,0x3c89727c,0x3c4cb760,0x3c3354e0,0x3c5c7cbe,0x3ca5d1be,0x3ca73a3c,0x3c90e003,0x3c14f713, +0x3be092e5,0x3ba07085,0xbae46a66,0x3bb8931f,0x3c41aba0,0x3c4e187b,0x3c20b530,0x3baceafb,0x3b887792,0x3b5193f2,0x3b594c33,0x3bdfa6ca,0x3c05e4a4,0x3c260f7c,0x3c3147d3,0x3c1972f2,0xbbf3a0aa,0xbab883f6,0x3b83e378,0xbad814fc,0x39355298,0x3b38b469,0x3baa3301,0x3c041ff0,0x3bb6f458, +0x3b564111,0x3a546682,0x3a8b3001,0x3b2a8413,0x3b131484,0x3b48c9b2,0x3b025cee,0x3b1890d3,0x3b0cc5b4,0x3c1afe34,0x3b50e5a1,0xbbb46405,0x3b8a5086,0x3c1af609,0x3bfc6fab,0x3b3ec445,0x3b699077,0x3b18c106,0x3c14b43d,0x3b61dbe6,0x3c258b7e,0x3bc6f390,0x3c0f6f61,0x3bb3118a,0x3a6197a0, +0xbb710dc6,0xbaea8d2a,0xbb4ad9e6,0x3bfc3698,0x3c31a779,0x3c3e93b5,0x3c569ddf,0x3c66c2fd,0x3c78b849,0x3c839c6d,0x3c80991e,0x3c82415c,0x3c80311f,0x3c7578c0,0x3c538cd2,0x3c29253e,0x3c26f2e0,0x3c286fbe,0x3c2df51c,0x3c21b0ee,0x3c236733,0x3c1f36f0,0xbb0e85f6,0x3bb9976f,0x3b0de0cf, +0x3b256e42,0x3a80d41a,0x3b7ccaab,0x3bc4e782,0x3b33129b,0xba885936,0x3b85b9e7,0x3be0deeb,0x3b5daba8,0x3ba29406,0x3b30dc15,0x3b46896b,0x3c082d48,0xba21c70c,0x3c785bef,0x3c4b628d,0x3c55616b,0x3c5eb6f5,0x3c625038,0x3c693758,0x3c774b2b,0x3c6cde58,0x3c630304,0x3c59661e,0x3c4f198e, +0x3c4db6e7,0x3c4c4574,0x3c4eca86,0x3c4b3a31,0x3c49563a,0x3c4a45bb,0x3c3d4185,0x3c7a25e1,0xb8e121cd,0xbc064337,0xbbfefee2,0x3b0fd07d,0xbc10c60b,0xbc02b007,0xbc102fb7,0xbc0043b2,0xbbb65760,0xbc027f22,0xbc027d2d,0xbbef40c8,0xbbf392d4,0x3b2897cd,0xbb9b41ea,0xbc021fd7,0x3c820329, +0x3b4898be,0x3cc9d203,0xbb3bd58b,0x3adde770,0x3b09f2ce,0x3b790720,0x3b8d2460,0x3b974354,0x3b872192,0x3b885485,0x3b712d7a,0x3b288eb1,0x3b365b90,0x3b29a0b6,0x3b1ecbb2,0x3afa6555,0x3ae602cb,0x3ad72653,0x3b17cda8,0x3b3654ed,0xbac18b9c,0x3cd30aa1,0x3ce7dfd4,0x3c167f6b,0x3cb7ac31, +0x3ce8de81,0x3c24439f,0x3c410fad,0x3c42c47b,0x3c142d97,0x3c6ed9d6,0x3c814265,0x3c81114a,0x3ce6b927,0x3ca79dec,0x3c045be7,0x3cebc088,0x3caa6d4c,0x3b9d79c0,0xbb0b90d3,0x3b777137,0x3bee646a,0x3c3ceeba,0x3c5000a5,0x3c1622bd,0x3c0cc35a,0x3bbdf6cb,0x3b097ae6,0x3aed901c,0x3a984665, +0x3ad00545,0x3ace0c07,0x3b1895dc,0x3afc2d8c,0x3b907e01,0x3a926985,0x3c28287c,0x3cb662dd,0x3c367a47,0x3c960255,0x3c4d34cd,0x3c56eee5,0x3c4a80fc,0x3bf98237,0x3c399cd8,0x3c822dab,0x3c2d0924,0x3bcf358e,0x3c336ac7,0x3c3db9e2,0x3c5b9ff6,0x3c379cb9,0x3bbf3a54,0x3c832c26,0x3b99d60c, +0xbc16c784,0xbabc554c,0x3a3cc3e7,0x3c54178b,0x3c96b90b,0x3c35285f,0x3c6504c5,0x3c1d064a,0x3acb760e,0x3b68e2de,0x3ab33064,0x3abc294b,0xbab61c3d,0xba91d6cf,0xba9629f9,0x3b19b900,0xbab7a1cd,0x3c60e0bb,0x3cc321e9,0x3c90f043,0x3c7b775f,0x3c65e2b8,0x3c8d25af,0x3c130ba3,0x3c032c5f, +0xbb68025b,0x3c2020c6,0x392c585a,0x3c4d4aab,0x3c2e98fb,0x3c5cb10f,0x3c43ae3c,0x3bf13de5,0x3c179f63,0x3b99ab9d,0x3aa54fed,0xbc269427,0xbafed51f,0x3b837115,0x3cf82133,0x3d1adac3,0x3cba24ee,0x3cb85d59,0x3c3d0790,0xbb8e1307,0xba326827,0xba80cce4,0xba2641f2,0x3a3fe348,0x3a8d2957, +0x3a098c1d,0x3b941d49,0xbb02c153,0x3c8451ce,0x3cd0a22b,0x3c36d201,0x3cb03d29,0x3c27af84,0x3bd08e11,0x3c0850c3,0x3b629fe1,0x3a637036,0xbb928f3c,0x3b0695a6,0x3b758bcc,0x3bfc986f,0x3c07ab57,0x3c05b888,0xbc508e61,0xbbb87b7e,0x3d21f0cb,0xbc388feb,0xbcabfd96,0xbc89f267,0xbcec8dad, +0xbcb004b1,0xbc44934e,0xbbb0c0e8,0x3c281933,0x3c26899e,0xbbc9a286,0xbc7c6b25,0xbcca08c7,0xbd0b15b2,0xbca11695,0xbc281f29,0xbc991b6e,0xbc0718ab,0xbbbbccd7,0x3cad4e65,0x3cda732e,0x3bc5cb4b,0x3c46ef93,0x3c56ec98,0x3c76fd01,0x3c20bb9e,0x3b05edeb,0xba46e594,0x3b23b58c,0xbb85b51d, +0xbb153def,0x3c6107a9,0x3bd0a3ff,0x3c2131f1,0x3c171576,0x3d29e45b,0xbba01326,0xbcc79e0a,0xbc86ec16,0x3c0409c8,0x3c7d7e01,0x3cbc5bdc,0x3c9e7c26,0x3bc5f954,0x3c60c018,0x3c064ded,0xbc71141a,0xbc58330a,0xbc006c36,0x3be9a79c,0x3c9040aa,0x3cb8524b,0x3c9d0cd9,0x3c9a150d,0x3c0c76b8, +0x3c07eb3a,0x3c145298,0x3c42b60e,0x3cc36e58,0x3b09bf64,0xbb137cbe,0x3a05b992,0xba860b74,0xb9b20a21,0xbb06a309,0xbb985481,0xbba2f6aa,0xbc16ec7a,0xbc01ba59,0xbab56cac,0x3c9c77b5,0xbc04c146,0x3c2cca70,0xbcd901e2,0xbd57c83c,0xbd46eef1,0xbcd7adbc,0x3b1f33f2,0x3cb15467,0x3c0f5e56, +0xbaf30de4,0xbc7fd34f,0xbce4c262,0xbc6c897f,0xb961f61c,0x3cba06d0,0x3c3926b3,0x3c0ad028,0x3b7b971b,0x3bffdb8a,0x3a3292e6,0x3c073a7c,0x3c8d3012,0x3c3eb2d8,0x3cc0cd72,0x3bbc8fa1,0xbaf5806c,0x3b42fc2d,0xbb3323b2,0x3ab9477f,0xba06f9c9,0x3ab38961,0x3b34a327,0x3bc7cc5b,0x3ad2aacc, +0xbbb2480d,0x3c2fb41e,0x3c2d56f5,0x3d261612,0x3d7ceb28,0x3dd96536,0x3df4e91b,0x3dc331a0,0x3d5b383a,0x3c96c751,0xbcba6243,0x3c750550,0x3c8f4142,0x39ccd721,0xbbdfce62,0xbba90f6c,0x3c6521d1,0x3c88015e,0x3c8800e2,0x398349ee,0x39032b37,0xbbc8f50a,0xbb4fb9c8,0x3b7fc07d,0x3bcd74b4, +0x3c5a9df3,0x3bb51d88,0x3bb234d8,0x3c0597ce,0xbae0af18,0x3a83ad5d,0x3a905a04,0x3b85e095,0x3bbf7ee7,0x3bfede69,0x3c8b66b3,0x3ce2532e,0x3d0ed1e3,0x3d057a97,0x3caf303e,0x3d1ded96,0x3d2b39e5,0x3d449914,0x3d6ec690,0x3d96e68c,0x3d98fee1,0x3d69539f,0x3d35f11b,0x3cd43a6d,0x3c93a372, +0xbc1bb9e1,0xbca7b5d9,0xbc1a5a33,0xbc59f337,0xbc093cce,0xbc215202,0x3a13b847,0x3b25bbb7,0x3b5f3b1f,0x3c2433eb,0x3c189f92,0x3c5ac42b,0x3bc21b42,0x3b520e95,0x3b5ccc32,0x3c58a7a9,0x3c7037bd,0x3c63dd17,0x3c7826db,0x3ca203e7,0x3cd26dae,0x3c9cee8a,0x3c8d339d,0x3ca2c89e,0x3ce36459, +0x3cdc6bbf,0x3d11c3dc,0x3cf636c9,0x3cd77fae,0x3c503b13,0x3bdc6a45,0x3c16a1de,0x3cb8b2ef,0x3cd41d67,0x3ce5de5c,0x3ce470af,0x3cd504c4,0x3cc6f54b,0x3c96682e,0x3cafc9ef,0x3c8a82a3,0x3bf66a32,0x3bf48882,0x3bde7fb8,0x3c02ffc8,0x3c0d8f45,0x3c0c2e35,0x3c82b8ef,0x3c64f6b1,0x3c567fe3, +0x3c502669,0x3c25aaf7,0x3bcd5909,0xbadc057d,0x3b0f83db,0x3b9b154a,0x3c2560f5,0x3c2cde12,0x3c8b7350,0x3cb904f7,0x3cf4c30f,0x3c894100,0x3c01df86,0x3b2f2346,0x3b9158b2,0x3b814804,0x3c0a3040,0x3c202b22,0x3c27489d,0x3c38b7ac,0x3c566177,0x3c726761,0x3c2bc90e,0x3bea9ac0,0x3b7ef58a, +0x3bc35f8a,0x3bf841f8,0x3c13f36a,0x3c3249d4,0x3c1af652,0x3c69216b,0x3c8f4e9d,0x3c78b22c,0x3c65255d,0x3c2453ed,0x3bf40343,0x3b829aaf,0x3be6513a,0x3c025150,0x3c777910,0x3c4bfa3c,0x3c80d2cb,0x3c7ee156,0x3c8a9a88,0x3c9b7981,0x3cab483e,0x3c8913c6,0x3c45b08a,0x3c5d9ead,0x3c4d0ecb, +0x3c6ad5cf,0x3c62eeaf,0x3c5cb835,0x3c5a252c,0x3c68fa85,0x3c3f8f78,0x3c0fd833,0x3bd7ae70,0x3b9ecc42,0x3b84cef8,0x3b62f554,0x3b507929,0x3b39deb6,0x3b1f3bb1,0x3b3a469d,0x3b16293e,0x3b7f3d2a,0x3c15e771,0x3bdb24cd,0x3c363c86,0x3c2a1604,0x3c641a2f,0x3c730416,0x3c4d6cd1,0x3c6d142a, +0x3c782da6,0x3c38cbe3,0x3c0bba73,0x3c1a6bc0,0x3c1ffbf7,0x3c29e2b8,0x3c4324c9,0x3c2341ee,0x3cb6075b,0x3c0a30ea,0x3c1db5d7,0x3c237acc,0x3c26715a,0x3c2f21e3,0x3c3372c7,0x3c3b82ca,0x3c2390d0,0x3c184818,0x3c0a455d,0x3c0054d3,0x3be5c4b7,0x3bc50e4c,0x3bd7a751,0x3be4623b,0x3bed96b1, +0x3bf94244,0x3c02ddde,0x3bc28338,0x3ca27c38,0x3cbcc289,0x3c5f55df,0x3ca2fae5,0x3cca6f44,0x3c750aa1,0x3c7f78cc,0x3c78f309,0x3c63bee5,0x3c82c497,0x3c835833,0x3c7e6b53,0x3cbf54b5,0x3ca329ee,0x3c480f3e,0x3cbea5e3,0x3c3c7944,0xbc653f6d,0xbcc7fc37,0xbc4420b9,0xbc581ef2,0xbc771aba, +0xbc62c452,0xbc8ebe93,0xbc92fa72,0xbc865824,0xbc841565,0xbc7c4e5b,0xbc6e45b3,0xbc69c90a,0xbc6b6334,0xbc78ef79,0xbc6a63d9,0xbc67f21e,0xbc6af46f,0xbc692253,0xbc4a4415,0xbc4384ff,0xbcc09039,0xbc751ed2,0x3c8388c7,0xbcc1271e,0xbc8738e7,0x3c463f5d,0x3c18f083,0x3c0caab3,0x3c113817, +0x3bd951ee,0x3bd0dbab,0x3bc9374c,0xbc87d98f,0xbcc47dba,0x3c3c46bf,0xbc8819c1,0xbc1743d3,0xbc912518,0xbc57bdcf,0xbc951707,0xbc815beb,0xbcde8b53,0xbcf75b04,0xbcd1c434,0xbcca2dc9,0xbcb674f2,0xbca58996,0xbc938774,0xbc8fd9e7,0xbca42098,0xbc98e15d,0xbc9bdbab,0xbc9ca43f,0xbc99d7d6, +0xbc6093ca,0xbc88a703,0xbb527cd0,0xbc03a461,0xbc506345,0xbbc6ebff,0xbbde916b,0xbc5d4daf,0xbc58802c,0xbc987aea,0xbc94a2b8,0xbc7f7470,0xbc2763eb,0xbc0a6e84,0xbc079244,0xbbe48661,0xbc7c0b01,0xbc6d8829,0xbc9a887f,0xbc650b03,0xbc82bc25,0xbcc1200d,0xbc7e09ce,0xbd191576,0xbd350097, +0xbd1415d6,0xbd0d9630,0xbcf436e3,0xbcd1cc1b,0xbcb7a1fd,0xbcba52b3,0xbce330c0,0xbcbda64f,0xbcb8ece2,0xbcbec547,0xbca6ee88,0xbc71d30f,0xbc209b82,0xbc18b5e8,0xbb718e0e,0xba75a2a9,0xba8217d9,0xbaf01350,0xbb99b685,0xbbe09b9c,0xbbfed88e,0xbc419b46,0xbb1a7c39,0xbb28faea,0xbb022a0d, +0x3a0696b3,0xbb12c62a,0xbc496f0d,0xbc5159f2,0xbc43199f,0xbba644f3,0xbc07e9f0,0xbc97542e,0xbc169945,0xbd400807,0xbd8240e5,0xbd5909ad,0xbd4ec30f,0xbd305127,0xbd115486,0xbcea133e,0xbce92aa1,0xbd132757,0xbd043012,0xbd04ccfb,0xbd01ad96,0xbce0cfb9,0xbc615f11,0xbbc27f8e,0x3b5eaafb, +0x3c35862c,0x3c1a897f,0x3bfe8a5a,0x3c0cafb2,0x3c32c325,0x3b3a89d3,0xb78d398f,0xb5173d0e,0x39362075,0x3bd3a9de,0x3c27f779,0x3c1bdd32,0x3b1d3be0,0xbc17856c,0xbc1be4c9,0xbcc6daeb,0xbd5d7f57,0xbd45d183,0xbd64c8f3,0xbd59fc63,0xbd6b2529,0xbd4a1871,0xbd079949,0xbc942605,0xbbcef5cd, +0xbbb3c153,0xbbb012d8,0xbbcb4ff3,0xbc5a0290,0xbc5947c9,0xbc420f6f,0x3812b87b,0xbc1bd715,0xbc557123,0xbc93fb8d,0xbba39263,0x3b5cc977,0x3ad653ee,0x3c2230c0,0x3c1ad347,0x3be36e7d,0x3a30c658,0xbb30749d,0x3926d7bb,0xbc0016a4,0xbba12790,0x3b829d09,0x3b09a91b,0xbace7321,0xbc05cc22, +0xbc0e6df8,0xbd085c16,0xbcf99c82,0x3be7ee93,0x3b074dba,0xb8d39d12,0xbcabfc2f,0xbcddbe64,0xbcd03ec2,0xbc13f2c3,0xbbd6ff2b,0xbc99da03,0xbca63d43,0xbcc5bca9,0xbd00b35a,0xbc913577,0xbc98f8c3,0xbd06a5d1,0xbcdaf013,0xbc7b510f,0xbc076fd0,0x3a6ef45d,0x3b9b252f,0x3c2ec3a0,0xba5fb38e, +0xbb9911ec,0xbab793f8,0xba551878,0xb908842d,0xbbadc755,0xbbc390ff,0xbc041e59,0xbc615677,0xbc68152a,0xbc17b887,0x3b199ce6,0xbc9f69a5,0xbc46fe29,0xbd52efa1,0xbd9f8558,0xbdc3c416,0xbde60a23,0xbdd8077d,0xbdb7a606,0xbd9d54cc,0xbd0233fb,0xbca0190b,0xbcfef6c1,0xbd1f9225,0xbd386121, +0xbd278fa8,0xbcde7cfa,0xbc4d4af9,0xbb4755fe,0x3a4fc1c5,0x3b449237,0xbbd81f4d,0xbabd5ed2,0x3bb68085,0x3c05496c,0xbb9a972b,0xbbd14de4,0xba26367a,0xbba335c1,0xbac4ab53,0xbb6eeeb0,0xba338151,0xba0b288b,0x3a05efc2,0xbbf8f0a7,0xbc2ca199,0xbc2802e3,0xbbab105b,0x3d4c413a,0x3d701cb8, +0x3d005648,0xbc0fa16a,0xbd7f5d17,0xbda5c102,0xbd99f950,0xbd24c439,0xbcce2649,0xbcdb3a15,0xbd436e07,0xbd6b035b,0xbd5114fa,0xbcc160c4,0xbc86d20a,0xbc4cbf00,0xbc9dcdef,0xbc734a7e,0xbc0408f4,0xbbffd99a,0x3acebdc9,0x3b9e42b0,0x3be987ae,0x3b31c20d,0x3ac5127e,0x3b378ddd,0xb714d885, +0xbaacf2c4,0xbaa42caf,0x3b43a3c2,0x3bb94e2a,0x3b9e2f23,0x3c844816,0x3cc34107,0x3d153654,0x3d27211c,0x3bcb2645,0xbcf990cb,0xbd71a2a6,0xbd3c1fa1,0xbc9ff721,0xbc66919c,0xbc2820f7,0xbc33bd78,0xbcc387e0,0xbd1f72b8,0xbd67ad00,0xbd85d67a,0xbd860247,0xbd5cdf22,0xbd252a7b,0xbcd1498c, +0xbc58c78f,0xbc0c630d,0xbc008f68,0xbc0e7b58,0xbb8c2279,0xba85a4c9,0x3c2c62cd,0x3b17c6b0,0x39b8c963,0x3a8ed642,0x3bfe7c9b,0x3c292c8b,0x3bad5d7f,0x3c08e5db,0x3c22f1ce,0x3c3e35e8,0x3c2f4cd0,0x3c27b8ee,0x3c855ffa,0xbb7361a6,0x3ca6269a,0xbbcdb7a3,0xbc22aa9b,0xbc20b5d7,0xbc59a81e, +0xbc0e2bda,0xbb5f91b3,0xba11726f,0x3ca7b7c9,0x3cf4a384,0x3cfa5f10,0x3caab9f6,0x3bf25246,0xbc28a4ad,0xbc1f1c39,0xbc5316be,0xbc74ce35,0xbc1ad86e,0xbb70fcaf,0x3b8ef1b3,0x3bc3a4ad,0x3b213550,0x3b6c95f9,0x3b719746,0x3bf807ed,0x3bea5d70,0x3b9f1987,0x3aecbc3f,0x3ac72a79,0x3a2955fa, +0x3ab02898,0x3ba3945f,0x3bb0f2f6,0x3b7d02a6,0x3c0a0e13,0x3b4f7dbb,0xbba596e3,0xbb4d6abe,0xbb7a719d,0xbc01143b,0xbc2f3466,0xbc3f6826,0xbc5964c6,0xbc87b322,0xbc55fe51,0xbc1c89c1,0xbb554b0d,0xba346474,0x3b798224,0x3bf4f260,0x3c25778d,0x3c47750c,0x3c74e691,0x3c3f5a93,0x3c05d4b5, +0x3b260aa9,0x3b877594,0x3c0fbaab,0x3c2f24a6,0x3c0a3ac9,0x3bd4a27e,0x3ba3be3e,0x3be9d9d8,0x3bf21974,0x3bdde27a,0x3c1dc17f,0x3c254516,0x3c1ec68d,0x3c08035e,0x3be02f44,0x3be3c3a1,0x3ab40c0a,0x3c33d127,0xbac3651a,0xb9db5782,0xbb0963a9,0xbb28895a,0xbb747512,0xbb8620c4,0xbb9db4ad, +0xbadb94c3,0x39b5a99b,0x3af33f85,0x3b427abf,0x3b616bf5,0x3b5c863c,0x3b69785e,0x3b861f27,0x3bb2949c,0x3bbd1fb9,0x3c1c629d,0x3c0bb1bc,0x3b7f4e0e,0x3a85a2af,0xbb7834af,0x391d625b,0xbb111cb0,0xbbc5dcfb,0xbba96968,0xbbeaeb10,0xbbb69190,0xbba32147,0xbb33d88b,0xb94e209e,0xb95319d8, +0x3b2ae9c9,0x3a66ec2f,0xb82d8688,0xbbd6c4a9,0xbb71d40e,0xbb111908,0xbb48181f,0xbb405cb5,0xbb540282,0xbb65a1db,0xbb8d9b17,0xbb6134fd,0xbb436c17,0xbb1ded57,0xbad45309,0xba4e98fd,0x38683e2b,0x3a2c9a9b,0x3a869791,0x3aaffca1,0x3aec1b2d,0x3b0a282b,0x3b8087e3,0xbb910203,0xba2ecc45, +0x3c85e7c4,0xbbfe1a1b,0xbb64abe4,0x3c868959,0x3c81cd7b,0x3c7fb1a9,0x3c8028b1,0x3c6c2fd7,0x3c65b939,0x3c602648,0xbaa4d13a,0xbc06c9fe,0x3c8ee797,0xb9144ee3,0xbb53bfc0,0x3c9bfc16,0x3c86214d,0x3caced77,0x3c713489,0x3c8a37ad,0x3c8207b7,0x3ca3dafa,0x3cae9849,0x3cac56be,0x3cac686f, +0x3caa1ca8,0x3ca467f6,0x3ca585da,0x3ca33b1e,0x3c9cb0a9,0x3c9f33fc,0x3c9dd872,0x3c9a62c5,0x3c9bfc6a,0x3c88e0d0,0x3cacf530,0x3c86ae54,0x3aae4a58,0xbcf9fbcd,0x3cb1410f,0x3b6f7132,0xbce85494,0xbce30aaf,0xbcdfa3c0,0xbcd2f42c,0xbcc8c76a,0xbcc1eade,0xbcb85210,0x3b936e79,0x3cbedeb0, +0xbcf3fbc3,0x3923b0dc,0xbbd8f519,0x3cc3137f,0x3c600f46,0x3c709dc8,0x3c6650e2,0x3cc6c841,0x3ce7443c,0x3cdfe640,0x3ce19d71,0x3cd8fcb0,0x3ccc2c8d,0x3ccd7008,0x3cc93ffa,0x3cb9f21d,0x3cc61a49,0x3cc729ef,0x3cc1a3ad,0x3cbdd006,0x3ca84dae,0x3cba1471,0xbbb7edc9,0x3c5c341a,0x3c86d40a, +0x3c35e449,0x3c08f192,0x3c69f79f,0x3c5144e9,0x3c7c4dcd,0x3c31535c,0x3c8c3200,0x3c8a63c7,0x3c3dc6db,0x3c82aa08,0x3c08e719,0x3bd55af8,0x3c99033c,0x3c528552,0x3c976f90,0x3c4e3141,0x3c539af5,0x3c201b26,0x3ce86a03,0x3d1abdd7,0x3d16dbb9,0x3d1dd629,0x3d178965,0x3d09d3a8,0x3d0b8708, +0x3d0420d5,0x3ce99724,0x3cf46067,0x3cef4237,0x3ce1288c,0x3ccc4ad5,0x3cc401bc,0x3c86e4c6,0x3c4934dc,0x3c509776,0x3c576f9a,0x3c87c9a2,0x3c2c5207,0x3c2b1ac5,0x37a6a93e,0x3ba8ba6e,0x3a9f54f3,0x3bcdc3c9,0x3be7c7a1,0x3c16960e,0x3c3b8eda,0x3c37023d,0x399a2979,0x3c652a03,0x3c850089, +0x3cc86a9c,0x3c28fba0,0x3bfd3cb0,0x3b7e023f,0x3cf81ba4,0x3d3a259d,0x3d3a3a59,0x3d3fa30d,0x3d362ab7,0x3d1cf6a3,0x3d220d24,0x3d2367ba,0x3d115d07,0x3d226921,0x3d207f61,0x3d14d978,0x3d090890,0x3cd97f34,0x3cb0b2ff,0x3c371512,0x3c8cf99f,0x3c53d242,0x3c921fd3,0x3c6c0939,0x3c2fd444, +0x3b8774d9,0xbb2afb66,0xbadd75e1,0x3b2bd1a3,0x3c17fd29,0x3c22e80e,0x3c6ef202,0x3c6d0524,0xbad3f70d,0x3c9a78c4,0xbad2782e,0x3bb5c621,0x3c51c315,0x3c486373,0x3c8df07f,0x3cd72bdd,0x3d05347f,0x3d2f5324,0x3d1485bf,0x3d117218,0x3d1f8cdd,0x3ce11942,0x3c8ba6f8,0xbab9868c,0x3c095784, +0x3c43fefc,0x3c41c854,0x3c68d754,0x3cb9edfd,0x3cbf5966,0x3c38043a,0x3c815c93,0x3c27c3d7,0x3c8c243f,0x3c77b085,0x3bcb001e,0x3b045b77,0xbac91ad6,0xba4c0159,0xbb74905e,0xbb0cf830,0x3bb3d37a,0x3c27b8a0,0x3c1a2f4e,0x3b410574,0x3c0396a1,0xbb18d6cc,0x3b0eb2a0,0x3c2bb2e6,0x3c48b1f1, +0x3bc80399,0x3c7184d8,0x3c7837ba,0x3b1b3eed,0x3c7275f9,0x3c4ec3d6,0x3beb1782,0xbbed0aea,0xbc2422f6,0xbbd244f2,0x3c41a91f,0x3cecd965,0x3d335978,0x3d0fdcde,0x3ce346a4,0x3c630712,0x3bbcef54,0x3c2b9661,0x3c93787e,0x3bad2b27,0x3a9ffbce,0x3ab2cefe,0x3a74362d,0x3ab67205,0xbb8b56ad, +0xbb3bc9c1,0xbba336b4,0xbc0c618b,0xbc0814b1,0x3b389950,0x3c36433c,0x3c06ace0,0xbce0c373,0xbd2aa6b1,0xbd6e4fee,0xbd2bfa38,0x3d176033,0x3d4f1b0b,0x3d867dfd,0x3d82a0a2,0x3d3d3074,0x3ce7a09c,0x3cbb9746,0x3cf8fdb0,0x3d1b3975,0x3d24146f,0x3d20b2ff,0x3ce15b93,0x3bc5bbf3,0x3b6fbb75, +0x3bcb2e6a,0x3c540d4f,0x3c9496d6,0x3c6649b0,0x3c155ed4,0x3b553fa5,0x3927e461,0xba532131,0xbb28794a,0x382afa51,0xbad4e40e,0x3af1967f,0x3aa44fa3,0x3afd6ccf,0xbba354f1,0xbc1ba403,0xbc5daa60,0xbc6774fa,0x3d66989c,0x3d86f83f,0x3db2c14a,0x3dbc2278,0x3de65028,0x3d3c5328,0x3c4fd588, +0x3ab78d3a,0x3ba5b98f,0x3b79a5d1,0xba171788,0xbc3695ce,0xbc5110fc,0xbbcdb0e2,0x3c3b2f7f,0x3cc32f28,0x3cc6a42e,0x3cdb88da,0x3c9dfc93,0x3b9a9459,0x3bb7696d,0x3c4635d7,0x3c1b12c0,0x3ba9e911,0x3b44632a,0x3b0cfe5f,0x3aba3914,0x3b1c579d,0x39af17c3,0x3b5b4e08,0x3bca50b6,0x3bdd2f0a, +0x3c8f66aa,0x3d071b25,0x3d1e620f,0x3d481ccd,0x3b279178,0x3d260241,0x3db0ab3c,0x3dbe78c2,0x3dd90864,0x3dccf09d,0x3db1587b,0x3d75032d,0x3cf53c10,0x3c440365,0x3c2cd514,0xba78a320,0xbb9904c9,0xbbd16f93,0xbc431b81,0xbc79484c,0xbc249b14,0xbc5df568,0xbc1651ca,0x3a8b629e,0x3bbe8794, +0x3c23318a,0x3c008e02,0x3adf56ff,0x3b1c98f3,0x3c098c94,0x3bffada7,0x3c200556,0x3c1d87e4,0x3c6823d5,0x3c7d28f7,0x3c8568be,0x3c77abeb,0x3c7c5b30,0x3c607ffc,0x3cdc618a,0xb961470f,0x3cdb8b86,0x3d0b507c,0x3cd8d5c9,0x3cdc71ff,0x3cf0263a,0x3d15ee74,0x3d521cfc,0x3d2df564,0x3d0a06e1, +0x3cc38581,0x3cd07eb1,0x3cbb2456,0x3c668506,0x3c5db5c3,0x3c257365,0x3a317fb4,0x3b35dd38,0x3b054785,0xbae6797a,0x3b0629c6,0x3be36d04,0x3c714a26,0x3c7ceb75,0x3c4f9147,0x3c026690,0x3bdf3580,0x3bb4c44b,0x3c099e0e,0x3c0af4dd,0x3c192f80,0x3c398f6b,0x3c25129e,0x3c74a682,0x3c6cace2, +0x3cc25969,0x3c95da22,0x3cab286d,0x3cb08b1b,0x3c9eb8d4,0x3c9a402a,0x3cade576,0x3cafab62,0x3cb2a942,0x3cbc0074,0x3cdb7a8b,0x3cf2a3a6,0x3ccfb3f0,0x3cace62c,0x3c878602,0x3c8ea66a,0x3c927900,0x3c96edfc,0x3c9c28ca,0x3ca0f9e2,0x3c920567,0x3c6f1fd6,0x3c58e36a,0x3c4fe77c,0x3c42a13c, +0x3c0db9a4,0x3c2c37b4,0x3c063120,0x3c781114,0x3c3abcbf,0x3c69b81a,0x3c464a9f,0x3c7555f3,0x3c780177,0x3c7ffa67,0x3c67be49,0x3c8da76e,0xbba139f8,0x3c3c0699,0x3c50b1d8,0x3c820b77,0x3c9509d4,0x3ca9528d,0x3cc0da7d,0x3cdb7cdb,0x3cc09a84,0x3c9daab9,0x3c823a7c,0x3c45ee13,0x3c1d66e5, +0x3bdae7db,0x3c0be7cc,0x3c1fa2f0,0x3c3b9e4f,0x3c4bf255,0x3c58643b,0x3c8feef3,0x3c074f21,0x3c767ccc,0x3c852209,0x3c416353,0x3c32e9e9,0x3c6a6bc1,0x3c67953b,0x3c6b5a80,0x3c2624a1,0x3c521667,0x3c33871c,0x3c030ca5,0x3c0c55c6,0x3ba8c77b,0x3be81cee,0x3c29ec0f,0x3c4b9563,0x3c679f54, +0x3c4b9247,0x3c6720f4,0x3c72751a,0x3c7f0ec8,0x3c837f58,0x3c8ebe1f,0x3c7c3b63,0x3c6eb45c,0x3c5d1947,0x3c5432fb,0x3c463bf7,0x3c2ab724,0x3c3fcc4a,0x3c4a1be7,0x3c52866c,0x3c6668b3,0x3c673a58,0x3c880a78,0x3c77eae3,0x3be980f8,0xbc343154,0x3c88971c,0x3bd70f55,0xbc63e661,0xbc5585ba, +0xbc43a9d2,0xbc244e73,0xbc2060fc,0xbc0fb507,0xbbfeaa26,0x3baa34ad,0x3c78766b,0xbc36e436,0x3b536fac,0x3c72a51d,0xbc8f7721,0xbbaaceec,0xbcb4e755,0xbc69ddf2,0xbc86f045,0xbc726d08,0xbc9cb2ee,0xbca674e0,0xbca39a04,0xbca6c268,0xbca22d63,0xbc97fa59,0xbc8fafa8,0xbc8f67ee,0xbc99a454, +0xbc999c99,0xbc9a6370,0xbc9bf968,0xbc96d9f6,0xbc7f245c,0xbcb91495,0xbb97c82f,0x3c55aacf,0x3d1c2702,0xbc1fd54c,0x3c391ff9,0x3d0d3604,0x3d0ad84b,0x3d085e6b,0x3cf771fa,0x3d075581,0x3d08e3ac,0x3d0259cf,0x3c2e3265,0xbc56bccd,0x3d0a5c74,0x3c62527b,0x3ca35e3b,0xbc98ca88,0xbc757460, +0xbc75e2e9,0xbc372fef,0xbcab424f,0xbccd8561,0xbcccccc4,0xbce3cf2e,0xbcdaf5a9,0xbcc28491,0xbca8c5e2,0xbca6591e,0xbcc580aa,0xbcca733e,0xbcd0f80b,0xbcd75551,0xbcbc48e5,0xbcaeb59d,0xbca08c55,0x3c96401d,0xbbb68b81,0xbb50f57c,0x3a9ba1aa,0x3b3b7367,0xbc081824,0xbc2bfdfb,0xbc4f4956, +0xbbc65a76,0xbc2f938e,0xbc28d172,0xbb7604c3,0xbb97fe0f,0x3b5ce38c,0xbb284647,0xbc53857d,0xba2873d6,0xbc5515f2,0xbc8c5c6a,0xbc651560,0xbc105a4d,0xbce5c6bb,0xbd137554,0xbd130849,0xbd267157,0xbd1834a7,0xbcfa0bd5,0xbcbe9671,0xbcb97073,0xbcfe76f5,0xbcfe9b66,0xbd01c4ff,0xbd09a399, +0xbcd5bc77,0xbcd960dd,0xbc378ff9,0x3af241b3,0x3a4d10d2,0x3b5c239c,0x3b381b20,0x3c0c8c94,0xbbb94366,0x3a7fd829,0xbc4b1373,0xbb257b1a,0xbb3bfe2c,0x3bd43d05,0x39b323a4,0x3bc82900,0x3b81e269,0xbb1e664c,0xbb972499,0x3c18a6b8,0xbc0b29b0,0xbc49623c,0xbbcc171f,0x3bc77110,0xbca2fb7f, +0xbd0c0b69,0xbd225152,0xbd4a24db,0xbd44bf17,0xbd214a54,0xbce0985a,0xbcd42837,0xbd241bb3,0xbd2c0046,0xbd34a954,0xbd3f5611,0xbd10f514,0xbcf3694a,0xbc72acec,0x3c2252a6,0xb9cb0427,0x3c52b5f8,0x3c09a350,0x3c06b45d,0x3b581b65,0xbaa7a475,0xbb217d19,0xbbc55db4,0x3b080ed7,0x3be02c0c, +0x3bf263c7,0x3c20740b,0x3bde7474,0xbbc7b30d,0xbb8980f2,0xbc8826b6,0xbd46015a,0xbd47b508,0xbd3a1bfd,0xbd3cc321,0xbd78507e,0xbd80823e,0xbd5d28eb,0xbd3f14b9,0xbd022a16,0xbc5d68e2,0xbc8cd9f7,0xbc89bc5f,0xbc38c066,0xbc31b8c7,0xbc395a0f,0xbcac35b4,0xbcb76f07,0xbce7b5a5,0xbc413e34, +0x3c190dff,0xbb2b9c8d,0x3ab8183d,0x3c1eca05,0x3c404265,0x3bc1c7ed,0xba09b403,0xbb89752c,0xbb384180,0xbc034883,0xbbc4ebd8,0x38ce307f,0x3b93359d,0x3c0eb3b2,0x3b65eed8,0xbc006642,0xbbb19d12,0xbc995da6,0xbc898571,0xbc6a0357,0x39a5d883,0x3a79e1af,0x3b5cb52b,0x3b2356fc,0x3ae22e35, +0xbadff461,0x392cdb9e,0xbc399b51,0xbc68a2f3,0xbc9fc7b8,0xbd0059c7,0xbd23cc55,0xbd4c52de,0xbd059b4f,0xbccca06d,0xbb778d25,0x3c4a7c09,0x3c193379,0x3c15e745,0xbba65eca,0xbbf0a9bf,0xba8358fc,0x3a689379,0x3a79b183,0xbbc6e451,0xbbd54955,0xbbd30940,0xbc0da2a8,0xbbce89fb,0xbc54aa74, +0xbbecc4fa,0xbc5577e2,0xbce9f337,0xbd621dc4,0xbd725589,0xbd6d11f2,0xbd811536,0xbda0b5c6,0xbdbbd137,0xbdb3c104,0xbd8620ca,0xbd341c29,0xbcf12eef,0xbd71a8d6,0xbd933359,0xbd8ca9a0,0xbd53149b,0xbce59f3d,0xbc01030c,0xbbf20faf,0xbc4d6586,0xbc16c58d,0x3900442f,0xba9f71aa,0xbae6c5ba, +0xbb9b7aa1,0xbb28a221,0xbaef5036,0xbb87b57f,0xbb43e83c,0xbb42a258,0x3900d559,0xbb017f16,0xbb3a0013,0xbb91a110,0xbc1da0a3,0xbc11a14e,0xbca5f926,0x3d714a14,0x3d5bbdeb,0x3c3ec36c,0xbceebc51,0xbda61122,0xbdc657f8,0xbda2879f,0xbcfa0988,0xbcd93f63,0xbcb65d1f,0xbc8996cd,0xbcaec0bc, +0xbcbce491,0xbcc51694,0xbcde2372,0xbcec23ea,0xbcc542e0,0xbc969989,0xbc458510,0xbbe58ea3,0x3c6dffcd,0x3c04e88c,0xb864cc36,0x39f01352,0xbaa41f38,0xbb16b9d2,0xb9a70944,0x3a6c29f1,0xbae67a89,0x3a1643e3,0x3b3c14f9,0xbad05591,0x3c64b599,0x3ca214ad,0x3d1e4167,0x3d32e235,0x3d156d9e, +0x3c2c223f,0xbc800f3f,0xbbc51566,0x3a8f32b8,0xbc235026,0xbcde650d,0xbd34fda0,0xbd48b808,0xbd5796ee,0xbd7993ff,0xbd20bb8b,0xbd044d2a,0xbd21c812,0xbcb5b79d,0xbc9285ad,0xbc9900e6,0xbc9225d9,0xbca686df,0xbc8a879e,0xb8a378fe,0xbb7053e7,0x3b155e16,0xb997f86a,0x3a009f04,0x3bd00aa9, +0x3b90813d,0x3b3083e7,0x3bacc673,0x3bf428db,0x3c499002,0x3c6cd5c6,0x3c807440,0x3c9012b5,0x3cc01a34,0x3c82bba5,0x3cff99ff,0x3b29d630,0xbc692464,0xbc2304ee,0xbc4222ad,0xbc05276d,0xbb7c010e,0xbb9e1986,0x3c60a98c,0x3ca340bb,0x3c810742,0x3bc6c919,0xbb8493e4,0xbc60653a,0xbcaa8875, +0xbcba6df5,0xbca9caa8,0xbc8dfcc0,0xbc36349e,0x3a068fc7,0x3b7fab38,0x3bcef25d,0x3c5e2f5a,0x3c1aa402,0x3bf4ddc7,0x3b9ab540,0x3b2e2fd7,0x3b922163,0x3ba5067c,0x3bcdddd9,0x3bc9a157,0x3b84a08d,0x3bd56de2,0x3ba5ce54,0x3c029e2f,0x3bbe3ecd,0x3c1e0969,0x3b9b7fdb,0xbb02d436,0xbb11d40e, +0xbbe2b180,0xbbe2a4f0,0xbc0e22ff,0xbc42f67c,0xbbe9cdce,0xbb2eed07,0x3ba5d965,0x3c099288,0x3c48d8bb,0x3c8412d9,0x3c682bab,0x3c521868,0x3c289577,0x3c0986e0,0x3b6fbe60,0x3b8272cc,0x3c1b37d0,0x3c16a492,0x3c0d9052,0x3c07bc68,0x3c3882b8,0x3c18bda1,0x3c66bca4,0x3c16970d,0x3c7b3910, +0x3c255e6b,0x3c57817c,0x3c189c85,0x3c3709e4,0x3c61684e,0x3c956671,0x3c383860,0x3c7fd200,0xbb2f69be,0xbb6ee00f,0xbbaa7c68,0xbbe34057,0xbc0ca52c,0xbc1f8cd7,0xbc338863,0xbbcd5b18,0xbb4099d3,0xb9737267,0x3b23f987,0x3bae4a28,0x3c0a64c9,0x3c140412,0x3c251c1d,0x3c36dc43,0x3c4efff8, +0x3c74a238,0x3c64b32b,0x3c917e2d,0x3c124ec1,0x3bddbd6d,0x3c0e8a99,0x3bde184c,0x3a1a397d,0xbabe90ef,0xbaeb82e1,0x3b028dcf,0xbb34f29d,0xbb5943b9,0x3800e63e,0xba26ec33,0x3b61ed52,0x3b0855e9,0xbb29b1c3,0x39973328,0xbc0e34a4,0xbbb2255a,0xbbdc6111,0xbbe21f19,0xbbf61306,0xbc057167, +0xbc20a653,0xbc0772a6,0xbbedb354,0xbbc298e5,0xbb90edec,0xbb4b2a63,0xbac65ca2,0xbabb532f,0xba8390a0,0xba1d3c16,0xba2b8e68,0x37bdbc90,0xba86e458,0x3b867e12,0x3c55f14d,0x3cd4ccf4,0xba8e240c,0x3c34dacb,0x3cd820ca,0x3cd6f103,0x3ccd897c,0x3cba7289,0x3cc01ae6,0x3cba33ff,0x3cafce63, +0x3c1dfe3b,0xbb72331c,0x3cbbe8e4,0x3c382172,0xbc03f4b7,0x3c811316,0xbb58587a,0x3cb576f2,0x3c520a4b,0x3c66915a,0x3c4b5bfb,0x3c64df91,0x3c735cff,0x3c86c23a,0x3c7d2b01,0x3c8040fd,0x3c8448f1,0x3c899194,0x3c88d7d8,0x3c7e804c,0x3c849139,0x3c836cd5,0x3c7f98c4,0x3c818038,0x3c60e88a, +0x3cada4a1,0xbb81a163,0xbc9b195e,0xbd00cb0d,0x3b696364,0xbc8e1800,0xbd0094d7,0xbd0529cd,0xbd04e7da,0xbcee637a,0xbd00eab7,0xbd00681b,0xbcf9720b,0xbc85319b,0x3bd3121e,0xbd029956,0xbcac9ee7,0xbca8151f,0x3c8f616f,0x3c70b5dd,0x3c442fa5,0x3c29f6e4,0x3c617015,0x3c85e484,0x3ca822ad, +0x3c95afa3,0x3c997c75,0x3c9f8c86,0x3caf124d,0x3cb18ba7,0x3c97c1e0,0x3ca8b7c9,0x3ca38e03,0x3c9b36f6,0x3c8ae5c6,0x3c9236b1,0x3c5b0c18,0xbca266c6,0x3bddc99b,0x3b95ac5c,0x3b8421b9,0x399e1a1d,0x3b897592,0x3bc5161e,0x3ba30566,0xbb38c0fd,0x3c0ef8a5,0x3c4f75e7,0x3b87455c,0x3c097ada, +0xbaa180de,0xbba95487,0x3c4a3194,0xbb1568b9,0x3c34baef,0x3c87421b,0x3c29e40b,0x3bd955cd,0x3c1efbf7,0x3c6df1db,0x3cc31d8a,0x3c9348ff,0x3ca6d576,0x3cb9d811,0x3cddfa75,0x3cdbc560,0x3c992977,0x3cc1fc27,0x3cb88770,0x3cadfbb2,0x3c95dc65,0x3cb7a1ee,0x3bc79201,0xbb5cb4f8,0x3b67753b, +0x3bfa49ca,0x3c2a311f,0x3a94cb38,0x3b6389ba,0xbbcd4806,0x3bd37775,0xbc0d254a,0x3bee6d9b,0x3a1da749,0x3b355ef9,0x3ba409f4,0x3b9d3ed0,0xbc1863d4,0x3b73ae82,0x3ab326e1,0x3c48caad,0x3c4dbf76,0x3bb63b64,0x3b4670e1,0x3c06d104,0x3c83ec78,0x3cf5d4a1,0x3cb641bd,0x3cc455b1,0x3cd1d552, +0x3d0614ba,0x3d0c0795,0x3cb4777c,0x3cfb4ab3,0x3cf66261,0x3cd7c008,0x3ca8907a,0x3cafc249,0x3be77184,0xbbc3ff6f,0x3c81c387,0x3bd0fc36,0x3c9a3855,0x3c85afba,0x3c067780,0x3b38974a,0xbb801d4e,0xba4c944c,0x3b78cd80,0x3c4e5efe,0x3c036796,0x3c672ec7,0x3beb3820,0xbbea991d,0x3c1271a5, +0xbd297f53,0xbbcd0587,0x3cd7e025,0x3cb5e46c,0x3c2c10b9,0x3bfac136,0x3bfb38c8,0x3c8c2a5b,0x3c6c32a0,0x3cd0a05e,0x3d403048,0x3d170243,0x3cdbf790,0x3c4f8da3,0x3bb084d5,0x3ba0e4bc,0x3cad1c58,0x3ca7181b,0x3cfe52c0,0x3c89fe38,0xbb882236,0x3c82dee7,0x3c0dee34,0x3c661534,0x3c2364b4, +0x3b851dc9,0x3ab94c27,0xbb0a3c3f,0xbb02f1d5,0xbbe76369,0xbba5d112,0xba8ee250,0x3ba2968d,0x3b1b16fe,0x3a5c1a9e,0xbcbe2148,0x3b182f2a,0x3c6c0848,0x3c033b15,0xbba62ce4,0xb9797946,0x3bb242e3,0x3bb823fa,0x388dcedc,0x3bcc1ae5,0x3bb9e92d,0x3be8f319,0xbc20160f,0xbc5685f4,0xbbcfb342, +0x3af82b5b,0x3c2b3a7e,0x3c9bdf15,0x3c16fd27,0x3c4d5e79,0x3b100d6b,0x39c1bd19,0x3bc7cbfe,0x3b36c266,0x3b7d9ff9,0x3b24df26,0x39e878c6,0x3b1cd768,0x3ab9365b,0xbbaa46c2,0xbb63373d,0xbba384f7,0xbaf2db18,0xbc26ee25,0xbbfce761,0xbc0449ca,0x3c38c0fb,0xbd2e92db,0xbd3d60c8,0xbcdb822a, +0xbc0ab1fc,0x3cacf577,0x3cac8b3d,0x3ca8832c,0x3cb0703d,0x3ce48e3e,0x3cecef03,0x3cf88aa9,0x3ce7e592,0x3cca7e11,0x3c91a7eb,0x3c5f903c,0x3ba1d48b,0xbb82867f,0xbb991d71,0x3bf0e669,0x3be06586,0x3c230e9f,0x3c20d6b2,0xbbfe1a14,0xbb1ac36a,0x3a5cb4ba,0xba6c01e1,0x3a6b78b9,0x3b18e634, +0xb9cad684,0x3b30ed7b,0xba03cfe4,0xbb8b5f58,0xbba97b34,0xbbc6030f,0xbca0dc64,0xbcd9a8af,0x3d3ed3aa,0x3cef4d87,0x3cca90da,0x3c1be4c3,0x3c83e78e,0xb85224a9,0xbb92133d,0xb9e5b9ec,0xbc9e46a3,0xbcda95e3,0xbcbfc0bc,0xbc68ac2b,0xbc36f9c1,0xbc8c4d7f,0xbb93e9ec,0x3b7a9dad,0x3c5bbd06, +0x3c4d0bfb,0x3c45eb7e,0xba96c1d7,0x3b18da6f,0x3c0bb4ef,0xbb130bbc,0xb89fc94a,0xba308b74,0xbb1a1224,0x3a424cf0,0x3a1a1621,0xbaab037e,0x3a6ce42c,0x3b8adf4e,0x3b99285e,0x3c2e97f2,0x3cb8305a,0x3d0b333b,0x3d3491f7,0x3bb9a2d3,0x3cf6408f,0x3d9236ad,0x3d9299dc,0x3d9645cf,0x3d60e690, +0x3d043bcf,0x3b404ed8,0xbc23eeab,0xbc5b2c16,0xbc780264,0xbb01a367,0xbb025f68,0xbc80d33f,0xbc54e523,0xbc8c0c77,0xbca39734,0xbcb151d5,0xbc5f76ca,0xbc0433a5,0xbbc6d125,0x3b824925,0x3ac807d9,0x3aef6752,0x3b895de3,0x3c23042a,0x3b571b12,0x3b694a33,0x3b10fba4,0x3c2417e3,0x3c3b676a, +0x3c47929f,0x3c5f73e3,0x3c7055e2,0x3c3f6b03,0x3ca18055,0xbc2aaeed,0x3c0dfbb8,0x3cbbbd3c,0x3ca9243b,0x3ce9e74c,0x3d1de335,0x3d433c84,0x3d56575c,0x3d1506c9,0x3cb7f354,0x3c144d18,0x3b9c0407,0xba8f8340,0xbbfdeb99,0xbc4d7a66,0xbc12c81e,0x3b02d9dc,0x3b3f95d5,0x3b03f9c4,0xbb4d9c5b, +0x3b173ee4,0x3be2bda5,0x3bb42604,0x3c13c2a2,0x3c116201,0x3beed281,0x3c09daf0,0x3c12d3ec,0x3c562f20,0x3c5d6507,0x3c48d7b4,0x3c2579b1,0x3c145d3f,0x3c1e4a39,0x3bbe847c,0x3c22b417,0x3c22790c,0x3c8acf07,0x3cb1792d,0x3c970e4c,0x3c95cd37,0x3c9bd941,0x3ca5eb24,0x3cc5c4b1,0x3cc54ed2, +0x3cdbd8c4,0x3ceef8f2,0x3ce5ea3d,0x3cda4efe,0x3cce3435,0x3cc48372,0x3cafbf9e,0x3ca0eede,0x3c92ffc7,0x3cb37440,0x3c8d0e50,0x3bfb5442,0x3c188cf1,0x3c203d7d,0x3c2a41f5,0x3c0e9e4a,0x3c2a66da,0x3c077c93,0x3c58ddb9,0x3bf78f2e,0x3c27c6cb,0x3bc79c40,0x3bf463c0,0x3c04432e,0x3c035a3d, +0x3bd618a9,0x3c30b3ae,0xbc073bd1,0x3c0a9dd5,0x3c27356e,0x3c34fd2b,0x3c5868b4,0x3c7c946c,0x3c904705,0x3c9c7d2f,0x3c995ca3,0x3c909b54,0x3c89e75b,0x3c814a4a,0x3c74f8f3,0x3c5e2bb4,0x3c73ea82,0x3c8425c1,0x3c8c7281,0x3c9579ab,0x3c95c843,0x3cab6dc9,0x3c46b02f,0x3c921f49,0x3c73ef4d, +0x3c33d7da,0x3c012c1c,0x3c1c2a23,0x3c2cb81d,0x3c09c312,0x3b87894e,0x3c0f5061,0x3c24f4ca,0x3bb6b870,0x3bdfef18,0x3b241719,0x3b4e61d7,0x3c0f5011,0x38c4f42e,0x3c60c691,0x3c2e4f85,0x3c456980,0x3c4d2e69,0x3c4fd5c7,0x3c5367d0,0x3c5f0efa,0x3c58f3eb,0x3c5947cb,0x3c5805b9,0x3c5a7ef6, +0x3c5d2ae2,0x3c5c7fc2,0x3c5bc7b9,0x3c5857a0,0x3c56c9f9,0x3c568288,0x3c497970,0x3c74362c,0x3b931b0d,0xbba4648f,0xbc511b14,0x3bbe8b92,0xbbdb8335,0xbc871573,0xbc886194,0xbc80d69f,0xbc619cec,0xbc7c67cb,0xbc7ab7ab,0xbc6a299e,0xbbfd9e84,0x3b9afe34,0xbc6ff360,0xbc1c7a01,0x3c4706f4, +0xbb88c893,0x3c7f19d9,0xbc37dc25,0xbb513f5c,0xbb67fa1f,0xbb04071f,0xbb4e1fb6,0xbb7c875b,0xbb92ee1d,0xbbb01204,0xbbb6a93e,0xbbc2bdf4,0xbb826023,0xbb6aa7c4,0xbb86ef54,0xbba3c038,0xbbb1852a,0xbbba63ad,0xbba61787,0xbb7a3575,0xbc277f5a,0x3c820c91,0x3cd038b8,0x3cc54ab7,0x3c3c5e1e, +0x3cca44a6,0x3cb72224,0x3cc4d0c5,0x3cc4aa6d,0x3ca9d086,0x3cd39d46,0x3cda72a9,0x3ccebefd,0x3cc86524,0x3c0f3306,0x3cb0b272,0x3cdba0f9,0x3cdb7d6f,0xbb7438b3,0xbb8caf77,0xb78d7cc9,0x3b11f482,0x3b00e633,0x3a24531d,0xbad98b0f,0xbbbf09ec,0xbbf54ace,0xbc0657c7,0xbb88015d,0xbb681a5a, +0xbbb080e0,0xbbf989ec,0xbc05b79f,0xbc0ae68c,0xbbb5ce01,0xbbf9ca5f,0xbb321969,0x3cafa08c,0x3b9177fa,0x3c3afd69,0x3c13635f,0x3c2812c0,0x3b8776f2,0x3a9c6d24,0x3b541935,0x3c13cf13,0x3b80f301,0x3a41860d,0x3bae992a,0x3bb145fc,0x3c2f8a90,0x3c0a0f65,0x3a8a228d,0x3c5d416d,0xbb9093ee, +0xbc0c59f9,0x386cdd1f,0x3b153b24,0x3b97e170,0x3b048e71,0xbb87de7c,0xbc28b042,0xbc407c65,0xbc633a8c,0xbb5612c0,0xbaba7155,0xbb963072,0xbc20dafd,0xbc40e930,0xbc5492cf,0xbc008651,0xbc3dce81,0x399a2970,0x3c56bdd7,0x3c20e83b,0x3c433522,0x3c1abe9b,0x3c5b2075,0x38a50cce,0x3bbb0ae7, +0xbbd63e6d,0x3bb111cf,0x3a54e0b6,0x3c3c9b39,0x3b8f1fd2,0x3c2e7a2c,0x3c2627a8,0x3b813559,0x3bd9ea36,0x3c92c678,0xbb2d953b,0xbbb28932,0x3b9bd20a,0x3c1e26de,0x3ca513b3,0x3c92d0ce,0x3beb5336,0xbbbdced4,0xbc6168c7,0xbc9e2cf3,0xbbac188a,0xbab55d95,0xbbf91f54,0xbc5dc327,0xbc848547, +0xbc8f87f4,0xbc293699,0xbc6ccf08,0xbb7e8048,0x3c47be96,0x3a631b60,0x3c860e8b,0x3c2afe0c,0x3c02de6d,0xb9912015,0xbade7eaf,0xbb5cf71b,0xbc03c7ff,0x3b926903,0x3bf5d326,0x3b9205ed,0x3c18e64b,0x3bebf892,0xbc015c29,0x3ba07958,0xbb85d217,0xbc71570e,0xbc9ae44f,0xbc26e3c7,0xbc943283, +0xbce10826,0xbd00a753,0xbce82abd,0xbd171ce4,0xbce7662f,0xbc0a7861,0xbc698711,0xbc50bc4d,0xbc3bbdc1,0xbc818de1,0xbc7fd9bd,0xbcb6abbe,0xbc685435,0xbc64c952,0x3c3646ce,0x3cac387f,0x3b7aca8a,0x3c5686b6,0x3c3537f5,0x3c2fbd39,0x3b73f88c,0x3a428057,0xbb117df2,0xbb83d4d4,0xbbd1e70f, +0xbb8a62d7,0x3b53c586,0x3bc07d53,0x3c64f037,0x3c98199c,0x3a47ee57,0x3c91a6b0,0xbc194a23,0xbceaef2b,0xbc646706,0x3baab5d5,0x3ca014b0,0x3cc1774a,0x3c82b4ea,0x3c0ac1e0,0x3b609d66,0x3bed5856,0x3b2309b8,0xba0c940a,0xbb929259,0xbc038253,0xbc29ef03,0xbc8bfdde,0xbbfe27b0,0xbc14d2dd, +0x3b813e35,0x3c59be6b,0x3c0fa2d4,0x3b4ffd08,0xbb8de36d,0xbb8dfa62,0xbaf7681c,0x39d8fb57,0x39b82397,0xbba8d4fb,0xbb9c8a97,0xbba9d550,0xbbf8dca0,0xbc4a466f,0xbc965542,0xbc153a1a,0x39ce928e,0xbd018ea7,0xbd0aa537,0xbb195b0d,0x3c0e4c49,0x388cd1e3,0xbc012507,0xbcc87c88,0xbd199066, +0xbd303da8,0xbd1dff2f,0xbcdf0aaf,0xbce705f1,0xbcd8989e,0xbce1f1b4,0xbce12fab,0xbcb4f3b2,0xbc5b5137,0xbc158079,0xbc52ede9,0xbb1e76a5,0x3c3d7f18,0x3b8956be,0xbb9fda34,0x3a03960b,0x3b6f72af,0xb96332a2,0x39744b3e,0xb9cbad40,0xbab4150e,0x3ae81f5d,0xba178ae4,0xba335b03,0x3b6e497e, +0xbbc47b2f,0xbc345c9a,0xbccdef49,0x3d29fb3b,0x3cafbe5e,0x3aec9975,0xbc3f936a,0xbd2ebb45,0xbcc0db5c,0xbc7a86b2,0xbcc976d8,0xbb3bb830,0x3a9bba4b,0x3a03e6df,0x3813f8ef,0xbb846dd6,0xbc5fe6c6,0xbc1e2330,0xbc263044,0xbc266bd8,0xbc449a45,0xbc38f64f,0xbb98fc9d,0x3c775acb,0x3c1d2038, +0xbbbe3222,0xbab0ba41,0xbb041f7c,0xbb75073e,0xbb1142af,0x3a26d83b,0xbaf0ae23,0xba03bcdb,0x3a68d31d,0xbb78dee5,0x3bbd2256,0x3c4ba5df,0x3cf5ca10,0x3d0c6d95,0x3d4cda0a,0x3d6f3841,0x3d5d2768,0x3d57989f,0x3d0bca75,0x3c965b6a,0xbc096363,0xbd199bc7,0xbce31a2e,0xbc99f8c4,0xbbab2179, +0x3b717bdc,0x3b5264b5,0xbbae9cc1,0xbc280bba,0xbc7110a7,0xbca26323,0xbc6b82a4,0xbc3e6216,0xbc267310,0x3ae7e071,0xbac75e7e,0xbabf0a8b,0x3b27c7c5,0x3b806443,0x3c07846c,0x3b64db81,0xba302814,0x3b6063f2,0x3bf38ca7,0x3c662ad2,0x3c9c77f1,0x3caf1f34,0x3cc36c4f,0x3cd4ab91,0x3d16dd4f, +0x3cd72431,0x3cad411e,0x3c688912,0x3ca94ada,0x3cb23782,0x3cd96be9,0x3cce2dad,0x3c8e4b60,0x3c54725c,0x3b26d857,0xbc0e0148,0xbc8afc4b,0xbc9eef76,0xbc94a695,0xbc91e4d0,0xbc7dae07,0xbc1bdc63,0xbc24e16f,0xbc065fbb,0xbafbd57e,0x3b8110ec,0x3be70814,0x3c3f8727,0x3bf330bd,0x3b9d08ac, +0x3bbb02cd,0x3c034d05,0x3c35567f,0x3c090c15,0x3c432484,0x3c4c524b,0x3c39a09e,0x3c3a8294,0x3c49de56,0x3c606c94,0x3c8cd81e,0x3c9cd6c6,0x3c4f6977,0x3c08d0ce,0x3c3919c8,0x3c170728,0x3c3c1204,0x3c4e2838,0x3c6ab72f,0x3c8ac3ee,0x3ca975a3,0x3cd15c9a,0x3cc2a789,0x3cb0855a,0x3ca46c43, +0x3c903b34,0x3c79fa12,0x3c4dfe4f,0x3c57c86a,0x3c30de6b,0x3c7c3292,0x3c965fa9,0x3c530c93,0x3c1cd540,0x3c0cb035,0x3c30ad56,0x3be437d7,0x3c33cc81,0x3bc8d9fb,0x3c561630,0x3be253e3,0x3c21d24a,0x3be23d61,0x3c372bde,0x3c81e750,0x3cabd07f,0x3c8ab47e,0x3c682652,0x3c0606b1,0x3bcfcba7, +0x3bd325f0,0x3bb5cf44,0x3b9df4dc,0x3b81120a,0x3b56301f,0x3b629437,0x3b4b6eea,0x3b51dc09,0x3b892905,0x3bcfc1fb,0x3c162ff6,0x3c13aeec,0x3c15fb55,0x3c07825a,0x3c0ca570,0x3be56369,0x3be08f23,0x3c962403,0x3c38c027,0x3c5c34e6,0x3c4a4c82,0x3c68e3fe,0x3c458737,0x3c205ced,0x3c34708c, +0x3c5f2463,0x3c1088f7,0x3be927ec,0x3c0734a1,0x3bf9ed2f,0x3c11ddbd,0x3c1d7687,0x3bd6f2bb,0x3c57568b,0x3b600290,0x3ba82e3a,0x3b9ccf85,0x3b955235,0x3b8f93b5,0x3b86580d,0x3b62fa12,0x3b834504,0x3b96ea1e,0x3ba8752f,0x3bbe8a54,0x3bc7e5f8,0x3bdb6244,0x3bbe37c0,0x3bb169e7,0x3ba9f308, +0x3b95046e,0x3b9e2745,0x3aa0b154,0x3c4dc2d5,0x3c92bfb5,0x3c8b92d2,0x3c3f4ccf,0x3c9ab06f,0x3c8d3c03,0x3c90ede5,0x3c8ac2c1,0x3c7212e5,0x3c86d006,0x3c839679,0x3c7ab787,0x3c8c907d,0x3c3923b5,0x3c576668,0x3c8ed66e,0x3babc376,0xba1a3272,0xbc87a392,0x3b210f14,0xba70b8c1,0xba908682, +0xba3f7b96,0xbb2626a0,0xbb3bfef1,0xbac5a084,0xbb258fd6,0xbb1eed58,0xbb24a133,0xba598c3f,0xb9dadfd3,0xba0cdf0b,0xba36519e,0xba41f3ec,0xba4b9cdd,0xba3a3770,0xba16d8f1,0x3b3fe398,0xbc83508a,0xbc8c9772,0xbb0b389f,0xbc56694c,0xbc929342,0xbbac7b56,0xbbe75775,0xbbf2a2b2,0xbbb7c975, +0xbc08b0b1,0xbc0df2cd,0xbc1233c9,0xbc8e96a3,0xbc44312d,0xbbb50968,0xbc9d9db3,0xbc52a8c6,0xbb71cf8a,0x3a739505,0xbb287ae6,0xbadcb876,0xbbe45a37,0xbc05355f,0xbb823586,0xbbdf34f2,0xbbd0604d,0xbbc7ce9b,0xbac40cd6,0x3a112ec7,0x393d83c1,0xba98fb0e,0xbb25fe21,0xbb1a2663,0xbb5b2611, +0x39b932be,0xbb907b96,0xbc34e102,0xbad99fa0,0xbba5d019,0xbb1ae4a5,0xbb933a80,0xbbde4b3c,0xbba54a08,0xbc0a6a83,0xbc39c7f5,0xbb9a9889,0xb94addf5,0xbb80e180,0xbb190bff,0xbbae6197,0xbc2b2ded,0xbb094d3a,0xbc54665c,0xbbc56c53,0x3aec4c4f,0xbb8baa0a,0x39994668,0xbc3ed016,0xbc7d4cc2, +0xbbf3ccd2,0xbc690cea,0xbc544ffe,0xbc4d1009,0xbb6aa878,0xb9ef054e,0xbb01460b,0xbb2f1781,0xbb84eec8,0xbb772bef,0xbb7054b9,0x3aeba9f1,0xbba947cb,0xbc131028,0xbaa447cc,0x3b81d241,0x3b1218a2,0xbb5ce22d,0xbb555192,0xbbe22341,0x379048aa,0xbc1dc195,0x3b6a9d61,0xbaf4d6ff,0xbb23f2d0, +0x3a18b003,0xb953aa5a,0xbc4263ec,0xbbcc0a6e,0xba54089a,0x3953f0a1,0x3bb9b18f,0xbb1925b8,0x3a97e98c,0xbc83bf56,0xbcc1b431,0xbc2c4b39,0xbca5ba7b,0xbca32267,0xbc97e700,0xbbd5fc2d,0x39106dca,0xb988b28b,0xbba729ed,0xbc0c16b9,0xbc0c3a47,0xbc0d5d4b,0x39be3568,0xbba73145,0xbbbdf52d, +0x3c25d9f4,0x3bf63589,0x3c3c9c30,0x3c31af49,0x3b96bfdc,0xb76b2fb0,0xbb784ec0,0xbab18bed,0x3b8ad9d2,0x3c304d81,0x3bcdabc5,0x3c2801fc,0x3abbf5f8,0xbbd89379,0x3b83a9b7,0xbd569419,0xbcc53817,0xbbab69bd,0xbbb504b2,0xbc422a7c,0xbc9f5c6a,0xbcbd7e03,0xbc93f2d2,0xbcc375e3,0xbc5f7380, +0x3c4b491e,0x3c6637f0,0x3c71373d,0x3c48a4a7,0xbada6271,0xbb8c866e,0x3c455121,0x3bcc5401,0x3bf7f2f5,0xbb63815c,0xbbe4042d,0x3c16b368,0x3c3e12df,0x3c12d6f4,0x3b8a5926,0x3aa73f7a,0x3ad776e0,0xbaa3c25b,0xbb76245b,0xbbfe0b6b,0xbbb57a44,0xbb0dd2bd,0x3ac3a311,0x3abcb656,0x3bd2bca8, +0xbd12203c,0xbb3fd23d,0xbb688f98,0x3ba58965,0xbbe0f579,0xbc132232,0xbc5678ca,0xbc71982a,0xbc8fa9c0,0xbbf40a1e,0xb734211a,0x3b76fead,0xbae9fbc7,0xbbbd922e,0xbc8fe414,0xbc45cde9,0xbc5902fc,0xbc9a115b,0xbc9306f7,0xbbe0cd45,0xbbb37eec,0x3b20e146,0x3b49e401,0xbc019e06,0xbacbe867, +0xba019bb4,0xbaf0dc20,0x39b98fe5,0xb98ea098,0xbbaaf361,0xbb6745f5,0xbbde6910,0xbc0e312f,0xbc92a11f,0xbc9f8391,0xbca8b77d,0x3ab6dfaf,0xbce6f017,0xbca4e855,0x3b964bb3,0x3a9bf4fc,0xbcf079f0,0xbd15503d,0xbd2f0973,0xbd396646,0xbc93ee7c,0xbc21b8ae,0xbc860ca4,0xbc154bb5,0xbc29b34a, +0xbcb2779d,0xbc95c002,0xbc87a767,0xbc4658ca,0xbc1858cd,0x3931245a,0xbbcadaf4,0x3a09f304,0x3ba63882,0xbc4b41d2,0xbb763bdd,0x3b15b7f8,0xb995f6f6,0x3a4a9822,0x3a35ae26,0xba2791ec,0x3a28fb21,0xbb3465e0,0xbb4f1225,0xbb217575,0xbbb792c3,0xbca90b24,0xbcb87a8e,0x3cb85f38,0xbbdea844, +0xbd4426d7,0xbd974332,0xbdb6d3c4,0xbd4f2e9c,0xbd029efd,0xbce297fe,0xbcbabbf5,0xbcb3d614,0xbcc4510a,0xbcb6d6e4,0xbcb34342,0xbcb7408a,0xbc8eb11f,0xbc798603,0xbc277832,0xbc533d65,0xbbab372c,0xbb80ef4d,0x3b2d8b2a,0x3bac169d,0xbbe1c927,0xbb8e0428,0xbb9e0407,0xbbc6e752,0xba918755, +0xbb13f2a6,0xbb820dc5,0xbae4caa8,0xb95bffde,0xbb5883b1,0x37bdc762,0x3bc3568f,0x3caacafb,0x3cdbc3d0,0x3cd920f1,0x3cca9577,0x3ca18304,0x3c37ffa5,0xba6d3ffe,0xbcbcdf0b,0xbd25d7d0,0xbd4e03d6,0xbd1e7769,0xbcfee11c,0xbcea1569,0xbcb05764,0xbc744e8b,0xbc2ee5e3,0xbc6d42ae,0xbc7fa293, +0xbc3d5f30,0xbc500174,0xbc14e7dc,0xbc2d6c48,0xbc3b3e58,0xbbbbb79d,0xbb47d147,0x3abfffc4,0x3b69b657,0x3bb0d990,0x3aa08fc3,0xb888a68c,0xbb156af9,0x3b96e169,0x3bfe7cb8,0x3c3cc6e1,0x3c9159e4,0x3ca1e3b4,0x3c9f3788,0x3c9a4d3a,0x3bab239e,0x3a4a3de0,0x3c4b0b6b,0x3c9b77a2,0x3cfbafa7, +0x3d1fd4bf,0x3d20571e,0x3cd910dd,0x3c57382b,0xba4f8aea,0xbc35ef5f,0xbccd5a14,0xbd03e9e4,0xbd01a2c0,0xbcdb0c70,0xbcaf520c,0xbc4a9062,0xbc11a1e9,0xbb8c703f,0xbb022636,0x3b22b851,0x3b6257bd,0xbb2eba08,0xbb0cab7f,0x393aeeca,0x3b4513d8,0x3c063b73,0x3c306882,0x3c57bdc3,0x3c4ce68f, +0x3c4554ca,0x3c345cf3,0x3c37433d,0x3c193ead,0x3bf4ab93,0x3bc756ec,0x3b8852b4,0x3c3536f4,0x3c84ba63,0x3c600fc7,0x3c620dff,0x3c59c4fc,0x3c711451,0x3c95cb74,0x3c9792b1,0x3ca25720,0x3cb3d4be,0x3caec734,0x3ca7a6b5,0x3c95cd9e,0x3c885c71,0x3c6e5af4,0x3c583635,0x3c4528ce,0x3c5178fd, +0x3c1fcd34,0x3bd89f9d,0x3be67dbf,0x3bee3b0c,0x3bf9aea6,0x3be245fd,0x3bd6ffab,0x3bb72590,0x3bd41d22,0x3b17ca41,0x3ba6d33a,0x3b2ac5e8,0x3b4ad2c3,0x3b7a6d60,0x3b8451d8,0x3b8c50d3,0x3bbcde7c,0x3b6e06e9,0x3bd78539,0x3c08da2f,0x3c074fd1,0x3c23b8f2,0x3c3869fe,0x3c489a7b,0x3c4c68d3, +0x3c51a1ce,0x3c57728c,0x3c5aca28,0x3c609ea7,0x3c65e122,0x3c6bb5ca,0x3c5c8c0a,0x3c500c08,0x3c40516a,0x3c2c000c,0x3c21c325,0x3c03d6d3,0x3baad5b9,0x3bf432a6,0x3b979198,0x3bae42c8,0x3b7b1122,0x3b84ef5b,0x3bb5dd0f,0x3b738556,0x3b36d7e8,0x3bbbe645,0x3c0d3414,0x3be15e42,0x3bf2c19f, +0x3bc297ae,0x3ba7dc0d,0x3c0393d0,0xb9f88b7f,0x3c30b254,0x3c20a05b,0x3c25e6c8,0x3c28aed6,0x3c273aea,0x3c28f165,0x3c2cc315,0x3c387395,0x3c41397d,0x3c48d72c,0x3c511cbc,0x3c586daf,0x3c637a5c,0x3c539742,0x3c47eaef,0x3c3e808a,0x3c322407,0x3c2671c4,0x3c32a39b,0x38929ce5,0xbb3751cf, +0x3b46c9cd,0x3a762cc3,0xbb6da1ed,0x3b2ac1f7,0x3afe60bc,0x3b0a5570,0x3b431ea0,0x3a9a990f,0x3a4487bd,0x3a8cca89,0xbb248beb,0x3ad40e7f,0x3b5ccfec,0xbb2df870,0x3c3445b2,0x3c335a32,0x3c97af94,0x3c0130e0,0x3c128495,0x3c2b908f,0x3c2e7e83,0x3c505b0e,0x3c5529a0,0x3c479714,0x3c3bbad2, +0x3c30dc9c,0x3c16bea4,0x3c32490d,0x3c3aaacf,0x3c49dcce,0x3c33a34e,0x3c2e83ed,0x3c2e5154,0x3c3246e2,0x3c21ca75,0x3c20448a,0x3c9e1ca0,0x3c637589,0xbbec109a,0x3ca176cc,0x3c6b54fe,0xbbe72c11,0xbbb2ecc3,0xbba37c73,0xbbaa58c3,0xbb21cd7b,0xbaf2ff3c,0xbb085e92,0x3c737b38,0x3ca10033, +0xbc01a3ac,0x3c5c063a,0x3c1594f1,0x3c432957,0x3bf32e02,0x3c3a2d42,0x3c45ef5d,0x3c9bbe74,0x3cabcc45,0x3c980b4b,0x3c821d4d,0x3c51a016,0x3c15d95f,0x3c42fdcd,0x3c5f6784,0x3c86cec0,0x3c5d5c6d,0x3c574aa8,0x3c5ebf26,0x3c6867aa,0x3c3bf6b1,0x3c731ebb,0x3be9fa6b,0x3c3e6823,0x3c8a4490, +0x3c2ba085,0x3c19a9e1,0x3c3b7288,0x3c1a3c31,0x3c502ed9,0x3c5b5970,0x3c5f8045,0x3c33c9a4,0x3c191d4f,0x3c390a4e,0x3c1d320b,0x3c2a48a0,0x3c5754bc,0x3c5f6a9c,0x3be2f4c4,0x3bc936cc,0x3c521b23,0x3c5640af,0x3cd0278a,0x3cf4fa9c,0x3cc10025,0x3ca3b03a,0x3c7a7eef,0x3c03f3ba,0x3c82b35a, +0x3c982aa0,0x3cc6545b,0x3c8aa7fd,0x3c7adb19,0x3c7fa01a,0x3c77870f,0x3c5350b8,0x3c3f3f9b,0x3c6b9d02,0x3c60a389,0x3c78349c,0x3c4ff75a,0x3c1df76f,0x3bc41cfa,0x3b533df0,0x3b1cfaf5,0x3bdd3b6f,0x3ba78971,0x3c0dc807,0x3bb8a00f,0x3c1c4596,0x3c2a596a,0x3b8cdfb0,0x3c317e6d,0x3c9e0651, +0x3bdeaecc,0x3b579bcb,0x3c44dd71,0x3c4eb64f,0x3d10fc91,0x3d33f265,0x3d18ac03,0x3cf62434,0x3c993cdf,0x3ba1f74e,0x3c60a936,0x3cb8cd6a,0x3d0609a9,0x3cbff166,0x3ca955f0,0x3cabb119,0x3ca7c46f,0x3c634394,0x3c4474e6,0x3c272e23,0x3c1a4136,0x3c7fcb1b,0x3c56d306,0x3c1a5030,0x3b0f3a8e, +0xba567059,0xbb8ee671,0xbb9668eb,0x3bba2201,0x3c0672a0,0x3b5aaeec,0x3c176810,0x3c0970a4,0xbad29c8b,0x3c7fa741,0xbc458cc3,0x3c4093a2,0x3c56794e,0x3c96f806,0x3c3427e4,0x3c8b4270,0x3c85da08,0x3c85ea99,0xbbf0501f,0xbc00d478,0x3c8c6391,0x3c39a8b6,0x3beb9e23,0x3aae39cd,0x3b0ded17, +0x3b4cfc74,0x3a5da08b,0x3c17a20a,0x3c5368c4,0x3c9bc2d2,0x3c72f290,0x3c42c1b3,0x3ca2a447,0x3c387383,0x3be3dcfb,0x3a408cc2,0x3b1d36b6,0x398aa8d7,0xbb8b8838,0xbb829ad7,0xbb12b136,0x3b560639,0x3bd10f73,0x3c45bfa7,0x3ca0101f,0xbbf5c673,0x3cac5b3f,0x3b9772e3,0xbbeb350e,0xbb8050e3, +0xbc521548,0x3c3df980,0x3c871676,0x3abeba38,0x3bf6689f,0x3bc330df,0xb9c713b0,0x3b837ccb,0x3bd961ea,0x3af5efdb,0x3bf16a0f,0x3c57e11a,0x3cacc885,0x3c90bb7a,0x3c5528fc,0x3c22da4a,0x3c1f7e64,0x3bf11156,0xba2ebbad,0xb8c9d544,0x3ab0104e,0xb914dea1,0x398031eb,0xba5e3625,0xbb70a2ce, +0xbb289ad2,0xbbb550b7,0xbc03da17,0xbc53e839,0xbc46b249,0xbc0a7312,0x3c5a7a90,0xbc808230,0x387d7672,0x3c91d719,0x3d035dba,0x3d4cc90e,0x3d55059d,0x3d3dbfd7,0x3cc96228,0x3bccb8dd,0xbbc17ebd,0xbb8e7b30,0x3c7fedaa,0x3cc3c30a,0x3c919f4b,0x3c334f13,0x3aa09928,0xbbe30b84,0xbbc832c9, +0xbb98fc23,0x3b802b02,0x3c51d13a,0x3c0334c8,0xbb5f3e13,0x3b31eec4,0x3bb52249,0x3a0ba6aa,0x3a3fc42e,0x39e20a80,0x3a80e8fc,0x3a5be60b,0xbafe7fc4,0x37cf222f,0x3b33d5cf,0xbb97bbf2,0xbc25daa1,0xbc7fe68c,0x3c219b6b,0xbc3fdef9,0xbcd1d924,0xbc4c5490,0x3c7ff314,0x3cf536f9,0x3cd0c6b1, +0xbc0d615c,0x3bc43725,0x3c1d22b0,0x3c2ddc1d,0x3c15cdac,0x3be3868d,0x3b032867,0x3bf4e148,0x3c173e04,0x3bf1568b,0x3b9c52ff,0x3b171bbc,0x3b98831d,0x3be112a3,0x3bd8b0d4,0xbb4f3977,0xbb1c26dd,0xbb2d888b,0xbb81cf19,0xba7695a8,0xb9973193,0xbb832ccc,0xbb379b01,0xbb43e1ff,0xbc06347a, +0xbb8ab008,0x3b1cb59b,0x3c55c986,0x3c70d8fc,0x3d3bc485,0x3da15b25,0x3dbbb523,0x3d9ebfb2,0x3d5f7668,0x3cdbe76d,0x3bf18da3,0xbb668dbc,0x3b4356aa,0x3c01fbde,0x3c9b9938,0x3c39e1c6,0x3c4e8dae,0x3c9979bb,0x3bb61a5e,0xbb279d72,0xbb6e9be6,0xbb9effaf,0xbb717e83,0xba84ec28,0x3a6bdba1, +0x3a71b342,0xbb478358,0x3ac56a5f,0x3b56f1dc,0x3ba013d3,0x3b15fdb3,0x3a4c5604,0x3b7991a7,0x3c028165,0x3c5cf488,0x3ca31c4d,0x3ce0aa75,0x3cfa2dbe,0x3cde0921,0x3d45668f,0x3c6d7da4,0x3d02a04e,0x3d1eae12,0x3d2c1584,0x3d431290,0x3d49b659,0x3d3351b6,0x3d0897e2,0x3bf07016,0xbc3d0f69, +0xbcafde9e,0xbcd4519f,0xbcbc3a75,0xbc75eb35,0xbc10ce3c,0xbbbca390,0xbbfcc829,0xbbc015b9,0xbb84814c,0xbb1a8805,0x3b59610f,0x3bbf827b,0x3bbdcb53,0x3b3d7b9a,0x3a866e13,0x3b6201ce,0x3c1ed5da,0x3c5ba3e5,0x3c5b720b,0x3c6e8ef3,0x3c77f5e4,0x3c6f79b8,0x3c84f69f,0x3ca4c823,0x3c9880e3, +0x3cd7509b,0x3cc0d53d,0x3cc8572a,0x3cdb3d64,0x3cf49fd6,0x3d017813,0x3d0aa334,0x3d165ac6,0x3d2e2d05,0x3d261448,0x3d225724,0x3d19095c,0x3cf88aac,0x3cb66f7e,0x3c5d1414,0x3c368de8,0x3c13d7a5,0x3bd19743,0x3c126a9e,0x3c0f7930,0x3c4dc29b,0x3c6e167d,0x3c2240af,0x3c12c8c8,0x3c181adc, +0x3c136bcd,0x3c121938,0x3be6e2ae,0x3c02e66a,0x3c04bb72,0x3bf2a730,0x3bed88eb,0x3c0383f5,0x3c2f2392,0x3c5cb80d,0x3c76af3c,0x3c9a1f52,0x3c052402,0x3c9ed047,0x3c9fe8ef,0x3cb2b416,0x3cc334c6,0x3cd58838,0x3ce29c9c,0x3cf244ac,0x3ccea39f,0x3cb1f291,0x3c9b9691,0x3c899a52,0x3c8247d6, +0x3c7b04cf,0x3c67b0a7,0x3c4da6ea,0x3c2ea902,0x3c15e915,0x3bc925de,0x3bc2818f,0x3c0e256f,0x3c3794d6,0x3c77401a,0x3c503249,0x3c73c9d6,0x3c93cad4,0x3c925f5f,0x3ca2094d,0x3c9a52b0,0x3c9b7c56,0x3c939da9,0x3c87e433,0x3c8a3cf6,0x3c705cba,0x3c8213a0,0x3c8f8167,0x3cb24191,0x3ca239c3, +0x3c9c2f15,0x3ca5d459,0x3ca7920f,0x3cac08c8,0x3cafbc5e,0x3cba20ea,0x3cb0690b,0x3cacabf7,0x3ca67a5c,0x3ca18ccb,0x3c9a3714,0x3c92d73c,0x3c8d9b3d,0x3c89aa4b,0x3c859dd6,0x3c813b1b,0x3c7a4dfe,0x3c5de90e,0x3c9b99f3,0x3c8812e5,0x3b80891d,0x3caf65f8,0x3c96b457,0x3b816651,0x3b936ff7, +0x3b9980dd,0x3ba05d28,0x3bbeb831,0x3bca2f15,0x3bd9c3d0,0x3c9385ed,0x3cbd5174,0x3b664187,0x3c8b147d,0x3cae9a37,0xbc41ff6d,0xbc4283d9,0xbc6dc7d4,0xbc24909d,0xbc39ad29,0xbc24d128,0xbc528624,0xbc603153,0xbc5db0cb,0xbc662dd8,0xbc659985,0xbc6640e3,0xbc5369eb,0xbc4a9e7b,0xbc3b1484, +0xbc4d36dc,0xbc4e3757,0xbc48c4eb,0xbc44e47a,0xbc25177d,0xbc51a4c6,0xbc26ce2e,0x3a54ff4c,0x3ccb1011,0xbc599618,0xbabe1151,0x3ca9443d,0x3ca0be45,0x3c9d7aa0,0x3c980d60,0x3c95245d,0x3c92f9ab,0x3c88e4da,0xbaf207b4,0xbc7463f3,0x3caa95f9,0xb90978d7,0x3bbf2208,0xbc8e8bbb,0xbc35b160, +0xbc44bba9,0xbc1b6d9e,0xbc84bbac,0xbc9aec0b,0xbc99ac4f,0xbcacf0e8,0xbcb0513d,0xbcad30b3,0xbc964161,0xbc84e5ea,0xbc5f46d1,0xbc885a42,0xbc8e118f,0xbc874d90,0xbc77fd08,0xbc45973d,0xbc56e5cd,0x3c03fc16,0xbb7a4208,0xbb96bf3c,0xbaef3cc7,0xbad58648,0xbc0e2cf3,0xbc144dd5,0xbc3e0b91, +0xbbfab75b,0xbc1c1d5f,0xbc036b7f,0xbbb018e3,0xbbdad43d,0xbb09bd63,0xbb9fef75,0xbc2897c5,0xbc1a1c70,0xbc88098c,0xbc4cee43,0xbc3bdfac,0xbbcf218a,0xbca00f8e,0xbccce6ae,0xbcd3da64,0xbcf4672d,0xbcf51a5a,0xbcf3cb8e,0xbcbe9ccf,0xbca39614,0xbc7cc3ab,0xbcac9163,0xbcb253bb,0xbca5ccf1, +0xbc85b962,0xbc5f005d,0xbbebeec8,0xbaa5ed68,0x3aae06ce,0x3b8ad98a,0xb8f40a62,0x39eb6b12,0xbba8d393,0xbb0215b8,0xbbb9ce2e,0xbb1ca3e1,0xb95b2350,0x3a5b76e6,0xbb4b32d4,0x38edcffd,0xb9c11d69,0xbb788d3c,0xbc05a3e8,0xba5b72ff,0xbc8d5966,0xbc44a169,0xbc0a01e9,0xba87ef91,0xbca4a78c, +0xbcf61a83,0xbd037a07,0xbd1e8064,0xbd2ec1f1,0xbd2f0428,0xbd0e4fae,0xbcda8dd5,0xbc9f654e,0xbceeb8eb,0xbd01968d,0xbceea428,0xbcba13f5,0xbc659783,0xbc05cb2f,0x3b94a0d6,0x3b83883b,0x3c48fe4d,0x3bdc430a,0x3bbc3c69,0x3ab14ded,0xbb3beb46,0xbb5fa5a2,0xbb130e30,0x3b8d04c1,0x3bcf2cd3, +0x3b285964,0x3b9bd59a,0xb8fdf4f2,0xbb34785a,0xbb4f9179,0xbd0d3f37,0xbcd2e8d8,0xbcd8c5bd,0xbcd66c79,0xbcc770d0,0xbcf3e169,0xbd100ec5,0xbd1dfb3e,0xbd397806,0xbd0b9cd2,0xbb4dd0a8,0xbb89c39f,0xbb116f2f,0x3b6730ea,0xbb5356e9,0xbba0c4f5,0xbbaeafa5,0xbc01f97d,0xbc5a8a47,0xbc556718, +0x3ae511a1,0x3b35bf5b,0x3c36e9d4,0x3bae430a,0x3b198e6d,0xb902324e,0x3a8e95b1,0xb9f35670,0xbb95f4bd,0xbbbc54be,0xbb6b7a15,0xbacfb7c8,0x3acb4605,0x3b9389be,0x3c1b500d,0xbce57699,0x3b4ad5b5,0xbc32bb48,0xbbaf7a1e,0xbc4edd29,0xbcb3104e,0xbc88c32b,0xbc70fadd,0xbc986ca7,0xbc6b71c9, +0xbc6876e9,0xbc66e9d2,0xbbff70cc,0xbbc37507,0xbc3be1c0,0xbc9b581a,0xbce8fa1f,0xbd1659e7,0xbcd9dbcd,0xbc8392c3,0xbb70c4c8,0x3bd0ef0e,0x3b3ba1e1,0xbbe11b6f,0xbb72ba59,0xbaa8d42e,0xb9220352,0x39c1016a,0xbaae259e,0xbb808bde,0xbb87fcfc,0xbbdd6120,0xbc036f20,0xbc4d4fc1,0xbc94d1ba, +0xbc83ffdc,0xbb18b1af,0xbc12a134,0xbb0921de,0x3bbb4cb1,0xbb462caa,0xbd2af173,0xbd5673fb,0xbd81f7de,0xbd932c0c,0xbd52f0b2,0xbd17417c,0xbceae435,0xbd0e6224,0xbd2b18f1,0xbd320fdd,0xbd14e437,0xbcc5eaaf,0xbc135001,0xbc1d1f63,0xbc12f3e1,0xbc278da3,0xbb9d8535,0xbad49d7a,0xbbfd74fa, +0xbb947d3f,0x3a571e27,0xb89116a8,0xbad0f3d3,0xbac2cbf1,0x39728612,0xbaa31824,0xbba27c2f,0xbbb0dc77,0xbb0f4f9c,0xbbd44556,0xbc1b24d3,0xbc57acf2,0xbbe8a4eb,0xbd047ccd,0xbdb8116d,0xbddc8450,0xbde0c938,0xbda21450,0xbd513175,0xbcc9cf0d,0xbcb35cb7,0xbc9ec6a7,0xbc919ab9,0xbc8d13af, +0xbc6dfd82,0xbc332aa2,0xbc936845,0xbcbd1c0e,0xbcb7a950,0xbca74055,0xbc365909,0x395d3252,0x3b521755,0xba948092,0xbbc1d993,0xbb991ed1,0xbb8c93b8,0xbb8b0db1,0xb9255b67,0xbb0051bd,0xbbbe8a31,0xbbab28d4,0xbbd1e225,0xbc6371e8,0xbc296dbe,0xbc3cd397,0x3b0d0358,0xba0f3f4e,0x3d4eac3b, +0x3cf5cbb9,0xbbfe0bf4,0xbcba164c,0xbd243d82,0xbd8741ec,0xbd94b273,0xbd6711dc,0xbd31c7b7,0xbd18a076,0xbd25e2ec,0xbd1401d4,0xbcf1aa6d,0xbca5956e,0xbc1bfc08,0xbb948833,0xbb5ddb13,0xbb8bbd1e,0xbbefc002,0xbc132cbd,0xbb8c5352,0xbba1d10e,0xbb9c8b3b,0xba0452d4,0x38077850,0xba90c9f5, +0xba5fddce,0xba6ea238,0x3a8c1a19,0x3b3c949e,0x3c061b82,0x3c62f7a9,0x3cd809a0,0x3cfc806c,0x3cff4ec0,0x3cecc6ad,0x3ce23e18,0x3beeb7f0,0x3ba93dd1,0x3c4a03a3,0x3c80e3b1,0x3c8b7b05,0x3be1b93d,0xbc8fe79c,0xbc9b36e3,0xbca6e665,0xbc9f5edc,0xbcef89db,0xbd065d8f,0xbcf8d237,0xbcf719b2, +0xbcdce625,0xbcba96f2,0xbc937834,0xbc31b1ac,0xba470d8f,0x3b31263b,0x3ab55f9f,0xbb090ba5,0xbb916a2a,0xbb14a795,0x3b0eb82a,0x3bdefd6c,0x3c2f5719,0x3c4d1475,0x3c427245,0x3c3d596f,0x3c1e49f1,0x3c5da5d5,0x3c4c06bb,0x3c5a03f3,0x3c31e708,0x3c288bdf,0x3c534da5,0x3c81bea7,0x3c95cc87, +0x3ca4ac48,0x3c92eaa4,0x3c96e244,0x3ca1bb72,0x3c8b588e,0x3c4b2774,0x3c1ee212,0x3c1576c2,0x3c0c8146,0x3bf23778,0x3b938c8f,0x3afd9ad9,0xbad6e311,0xbb14b35c,0xbb9fb741,0xbb97a72e,0x3ad266d0,0x3b4d5252,0x3bc125f2,0x3bea5e83,0x3c157758,0x3c152565,0x3c11f1c2,0x3bbd1754,0x3bbf65e6, +0x3bc27323,0x3bdb3205,0x3bb669ac,0x3be7af7d,0x3c02f9bc,0x3c2be362,0x3c25fa9e,0x3cab06cd,0x3c5f7535,0x3c5ad6b8,0x3c3e096a,0x3c37538e,0x3c28b99d,0x3c146347,0x3bfdb50a,0x3c0f419d,0x3c32ab09,0x3c4622bd,0x3c622902,0x3c71c503,0x3c813b93,0x3c645e05,0x3c4d35fd,0x3c38ffe4,0x3c23b0ff, +0x3c1e8f1b,0x3bbb7f5e,0x3c016582,0x3ba49c16,0x3b710740,0x3bda2715,0x3bce9507,0x3b8c1556,0x3bb259cb,0x3bbfa698,0x3c0c99be,0x3c0659a6,0x3c27a353,0x3c4a2867,0x3c4c232a,0x3c736a12,0x3c5aa4f2,0x3c55d0e6,0x3c124c2c,0x3c276114,0x3c33c8b7,0x3c271310,0x3c1fedc1,0x3c1b6e2a,0x3c18d333, +0x3c0ef6bf,0x3c1fc890,0x3c2588e7,0x3c2dad5f,0x3c30d864,0x3c36888e,0x3c458057,0x3c38a204,0x3c30feec,0x3c28efc2,0x3c1879b1,0x3c13c98e,0x3c038a42,0x3bc218b8,0x3c2f7884,0x3cb71162,0x3b9b0c49,0x3c2e0912,0x3cc61f47,0x3cc2b186,0x3cbe2e80,0x3cb9722e,0x3cb6e223,0x3cb3eda3,0x3cb1cfdb, +0x3c546e1d,0x3bed70cc,0x3cc5c9ca,0x3c6c5899,0x3c20106a,0x3c7ed772,0x3bd3b0be,0x3c926b55,0x3c47d8be,0x3c64097f,0x3c4e689f,0x3c846d26,0x3c8c7fd0,0x3c89f725,0x3c852ed0,0x3c808907,0x3c742772,0x3c76d082,0x3c7c648a,0x3c88ba36,0x3c831605,0x3c82a12a,0x3c83c446,0x3c83f9b5,0x3c69479c, +0x3c9df373,0x3bf132cc,0xbbb26b8b,0xbcc6a56d,0x3c3b690c,0xbb9beb36,0xbcc396c8,0xbcc27229,0xbcbf1cb6,0xbca957f2,0xbcb3bf0f,0xbcb3b399,0xbcadf066,0xbb894776,0x3c5b769b,0xbcc4435f,0xbbf4c501,0xbc3e828d,0x3c801452,0x3c3ee2b7,0x3c4020a9,0x3c22015c,0x3c97a4ea,0x3cafafd4,0x3ca7abe1, +0x3ca0f359,0x3c933eed,0x3c8760d8,0x3c824b9e,0x3c8cb425,0x3cac3fda,0x3ca54a88,0x3ca7330f,0x3cabf347,0x3ca14514,0x3c9caa12,0x3c93e530,0xbc0336e7,0x3c3038c9,0x3c2d21dd,0x3bcd23e4,0x3b62a025,0x3c0bbc4a,0x3c12dd1b,0x3c2b4533,0x3bdf4e1e,0x3c44c09d,0x3c495275,0x3bd526d4,0x3c0b1386, +0x3b0ab5f6,0x3b787e7a,0x3c5dcf91,0x3b1c9dda,0x3bd5a98e,0x3c27437a,0x3c1afdf0,0x3bca6d3a,0x3cbd089f,0x3cf34e79,0x3ce06d0a,0x3ccfd538,0x3cb245cb,0x3c94343a,0x3c93e704,0x3ca204df,0x3cdcc613,0x3cc6fbdd,0x3cc5664e,0x3cd002c9,0x3cb74e81,0x3cc4dab3,0x3c53fca9,0x3bf305e3,0x3c29cae7, +0x3c3914af,0x3c231205,0x3b25337c,0x3bc06fb2,0xbab82e85,0x3c03304c,0x3b25f195,0x3bdf5bab,0x3af4d1a8,0x3b6ae370,0x3b58283c,0x3b9f47d5,0x3a8b3224,0x3be6f0f7,0x3ad01753,0x3b4b35f5,0x3b2c8804,0x3adfa21c,0xbb2915ce,0x3cad7007,0x3d02aa83,0x3cfe2f69,0x3cf4ac59,0x3cc1ad31,0x3c8caa6a, +0x3c76e6b1,0x3cb079d6,0x3d08c5f4,0x3d039411,0x3d03cf6e,0x3d08875a,0x3cea02cd,0x3cda72c3,0x3c829eb8,0x3b816388,0x3c790438,0x3c3a1a78,0x3c62f873,0x3c21ee68,0x3b8932d4,0x3999539f,0xbb6bc1bb,0x3a86a38a,0x3ba7234f,0x3bf51524,0x3b229a48,0x3bc20ff5,0x3b6aac09,0x3ab2d406,0x3c353b63, +0xbcb78c94,0x3c855bc2,0x3ccf2f3c,0x3cd438b1,0x3cc77c8b,0x3d186592,0x3d1c0a02,0x3d0a8065,0x3c8e7876,0x3c8bcf8e,0x3d23dddb,0x3ce1b8bd,0x3ca16f66,0x3c4cad3b,0x3c25bc65,0x3c3542f9,0x3c984568,0x3cad80eb,0x3ce24ed8,0x3c86b6cc,0x3b8e8f0f,0x3c8b6312,0x3c852738,0x3c234148,0x3b8762e3, +0xba34f201,0x3b17ac21,0x3ae1b006,0xbb3f7db0,0xbaaf3e4a,0x38e948ce,0x3a8af33d,0x3be9bf50,0x3bee96c1,0x3c2a3ad5,0xbc8987ec,0x3c3db18b,0x3c74529d,0x3c41da52,0x3aaeadd1,0xbca311ad,0xbbd24238,0xbb7772bd,0xbc2714c9,0xbbbd7ebd,0xbbbae7f1,0xbb87325d,0xbbf6051b,0xbb82be3d,0x3bf72bc3, +0x3c3f12f6,0x3c930754,0x3ceec765,0x3ca9b431,0x3ca675db,0x3c2450f4,0x3ad76d46,0x3b44d862,0xbabedce5,0x3b8e27aa,0x3bd087a6,0x3b292150,0x3aafeb45,0xba3f4e1c,0xbaf1a4b4,0xba9a1b99,0xbb8308dd,0xbb3695e1,0xbc29561a,0xbbe75e76,0xbba5d0e4,0x3c73e5b3,0xbc09bc9d,0x3c1e712f,0x3c765842, +0x3cc040f8,0x3d487839,0x3d61bf5a,0x3d6904c9,0x3d351692,0x3ce4db18,0x3c87ff13,0x3c833b86,0x3cf01063,0x3d1137ad,0x3d18f599,0x3cd57f53,0x3c5a2817,0x3b5b3911,0xbaadda2f,0x3baeec02,0x3c17d2a0,0x3c00d0ed,0x3bf9c4bb,0xbaf69018,0x3a82a50e,0x3b374883,0x3aa46fdb,0x3a8afd08,0x3ac9971f, +0x3af30540,0x393fa0dc,0xbb75e29c,0xbbc99e9f,0xbb5d3654,0xbbc30440,0xbc500495,0xbc2940cb,0xbcb3641a,0xbd21efbe,0xbd2eacd0,0xbcc20d2a,0x3d0848b3,0x3cc1899a,0x3c8e25d4,0x3c28477a,0xbb1c5035,0xbb69a401,0x3b3720e7,0x3b4d4285,0x3ba29348,0x3bdac6e4,0x3c0b2524,0x3c3288db,0x3c63e9b1, +0x3c5e0c84,0x3c4caa23,0x3c325591,0xbb3f6ab6,0xba0e8080,0xbadd87c9,0xbabbbbfe,0xba10a2a6,0xba2c9827,0x3aa76e7f,0xb7466afb,0xbb698da0,0xbb97a11a,0xbbcd3147,0xbc261e47,0xbc47a3fd,0xbc1d5dc5,0xbc03e0fe,0xbc1b3f67,0x3d038c5c,0x3d5fb187,0x3d92b75d,0x3d531e83,0x3cef3744,0x3c0b9b33, +0x3b9f2d65,0x3c6fefda,0x3c1448e4,0x3beff98b,0x3c067df1,0x3af35f6d,0xb9b0c453,0xb90bc1d3,0x3ab9f279,0x3aeed43d,0x3a11e95d,0xbb6b4ad6,0xba0820a0,0x3b9328c0,0x3b0e041e,0x3be4a6aa,0xbb3a3a8c,0x3a203d26,0x3aaf3f44,0xb7a3502f,0xba0f0ecc,0x3aeb34dc,0x3b8ddd71,0x3bd58d3f,0x3c1efc68, +0x3c67fbd2,0x3ce2c914,0x3d06d697,0x3cde0a76,0x3d2c4916,0x3beae8fb,0x3ce6bc82,0x3d274d5c,0x3d1b629b,0x3d2281ca,0x3d18bacf,0x3cdb1b4e,0x3c41f522,0xbc01422e,0xbc874d07,0xbc911eae,0xbc6f579f,0xbc30e5f7,0xbbe808b3,0xbc1be3fe,0xbbfbd6bf,0xbbca6233,0xbb5d27d0,0xbb43a0d1,0xbb925e20, +0xb9ff7522,0x3a94a21f,0xb98f69cf,0x3b1c099f,0x3b6e6af9,0x3be1faab,0x3c2c20f4,0x3c4e6d5b,0x3c8701de,0x3c871468,0x3c8a0125,0x3c8726ca,0x3c887eb1,0x3c9f29d2,0x3c8ec305,0x3ccb260e,0x3cb3b685,0x3ce9b5e3,0x3d141fb4,0x3d1f1394,0x3d37d658,0x3d326f08,0x3d385f18,0x3d4651d7,0x3d21d6d8, +0x3cfa73ed,0x3ca75bf0,0x3c847c5f,0x3c378cf2,0x3bd637d8,0x3bb399bd,0x3b7571c0,0x3ab4d1ad,0x3afc8edf,0x3b8a3457,0x3b4ebfb3,0x3b0f6878,0x3b90a418,0x3bfbb3bf,0x3c19467f,0x3c0de567,0x3c3e207c,0x3bf1940c,0x3c3bdf8b,0x3bd097d0,0x3c2ad182,0x3c061b2b,0x3c3bc29c,0x3c53a53c,0x3c5788d9, +0x3c47662c,0x3c9d537d,0x3c2d9793,0x3cde6f14,0x3ce11c7b,0x3ce9839c,0x3cf5fcc8,0x3d0120f6,0x3d04d5b8,0x3d0a8ccf,0x3cf5625c,0x3ce496c6,0x3ccf90c0,0x3cbc265a,0x3ca4e230,0x3c88c7c7,0x3c83a5a1,0x3c78e661,0x3c6f3e89,0x3c63d01b,0x3c4a8ad7,0x3c525900,0x3bf0ba1b,0x3c6932d3,0x3c7c6943, +0x3c55f8bd,0x3c599695,0x3c90616e,0x3ca147b9,0x3ca9a0a9,0x3c943cbb,0x3cb5d2d4,0x3cbc2f69,0x3ca66740,0x3cb1587c,0x3c9a65e4,0x3ca5f105,0x3cceb371,0x3cabe981,0x3ce557f7,0x3ccec294,0x3cd84d19,0x3cd83cab,0x3cdd3778,0x3ce19247,0x3ceb9794,0x3ce1851f,0x3cda2ceb,0x3cd24e21,0x3cc78f93, +0x3cbf1a1b,0x3cb59be3,0x3cb4fe6c,0x3cb1b67d,0x3cadcd49,0x3caa9b0a,0x3ca2ce25,0x3caacee4,0x3c8bffea,0x3c24040f,0xbae4a049,0x3ca6af92,0x3c354fae,0xbb27d6ce,0xbb0f93af,0xba9c63bb,0x3a54c295,0x3a0b6635,0x3aae4019,0x3b28c1af,0x3c51a7f8,0x3cbfa25c,0x3af3713f,0x3c482262,0x3cdd6518, +0xbc136ef6,0x3b73af7b,0xbc7529ea,0xbc01f42d,0xbc108f2e,0xbbf5acc0,0xbc0b8ce6,0xbc176f5f,0xbc29e293,0xbc2c3e28,0xbc306943,0xbc349689,0xbc2c3eb5,0xbc234c7a,0xbc0d564c,0xbc1ec7ff,0xbc1f45ad,0xbc1a3ddf,0xbc149b8d,0xbbeeb8d8,0xbc50fe58,0x3bb3a80c,0x3c8b5776,0x3ce2a03b,0x3902bdf2, +0x3c75855a,0x3ccd9f82,0x3cd31e97,0x3cd2a303,0x3cc3379e,0x3cd38604,0x3cd3cfa7,0x3cca55d0,0x3c67a86b,0xbb220dd6,0x3cd2930c,0x3c8e2677,0x3c96c180,0xbc4016a8,0xbc1ef725,0xbc00033e,0xbbd1bae3,0xbbfdbf72,0xbc1d699e,0xbc538107,0xbc650934,0xbc7ac780,0xbc803826,0xbc7ec2df,0xbc6e4c86, +0xbc34a139,0xbc5efe0a,0xbc584f5c,0xbc48fddf,0xbc1f2da5,0xbc1b0940,0xbbdab61f,0x3c9fd8bb,0x3aade00e,0x3b759182,0x3b6803b8,0x3b97e027,0xbae4b506,0xbb5fc3dc,0xbb3fc0ea,0x3b801ca0,0xbb467e78,0xbba85449,0x39491754,0xbb1a9223,0x3b9257e2,0x3bbf68be,0xbbb21235,0x3ae0938b,0xbc502f61, +0xbc71d080,0xbc20c81f,0xbbe4f170,0xbbd918dd,0xbc29da86,0xbc95d89f,0xbc9e41d7,0xbcb07454,0xbcbc6bd8,0xbcaae7c7,0xbc95ce45,0xbc2a170c,0xbc867dfd,0xbc856fd3,0xbc74fd24,0xbc26bde3,0xbc3a699c,0xb8af6a3c,0x3c2f2d3c,0x3c03a839,0x3bf762b7,0x3b562278,0x3bdb70a9,0xbb03f046,0x3b809c6a, +0xbb974f2d,0x3becbccf,0xb9d7ca99,0x3ba05659,0x3a8d8bc7,0x3b1ac011,0x3b42e095,0x3bf30fbf,0x394886c4,0x3b4c478a,0xbc585496,0xbc559042,0xbbf57880,0xbba144dd,0xbb1733a9,0xbbf5cb04,0xbca303ee,0xbcad5220,0xbce46404,0xbd00d9b7,0xbcfd0801,0xbcd637cc,0xbc7e400c,0xbcbe7bc1,0xbcbdeb45, +0xbca61588,0xbc4ccd08,0xbc2dc581,0xba7a8629,0x3c674271,0x3b66c076,0x3c771e87,0x3bb50f6a,0x3b3d640f,0xba9c0e94,0xbb37fb20,0xbacce5b5,0xba89515c,0x3b84cdca,0x3b2c9d1c,0x3a8681a1,0x38892127,0x38726f61,0x3b44c2ed,0xba998a60,0xbb9eaff0,0xbc81ec4e,0xbce2fcde,0xbc9e3e22,0xbc86c591, +0xbc5a0ed4,0xbc867e3d,0xbccdec3c,0xbd14abd4,0xbd07529d,0xbc469fe8,0xbca6a5aa,0xbc8d5b90,0xbb5b2627,0xbbe82e3a,0xbc0011f1,0xbc82a7f6,0xbc46a02c,0xbc78535b,0xba870524,0x3c86e56b,0x3ba77e91,0x3c373875,0x3bbcfbe9,0x3b85ab72,0xb90e4694,0x3a82a928,0x3a830c3c,0xbb40de6f,0xbabe33fa, +0x38842a90,0x3b053812,0x3be72dd6,0x3c3eb5e3,0x3c50d445,0xbbba2391,0x3be541da,0xbb1aea41,0xbbfe6d69,0xbc192aff,0xbc9f52ad,0xbc8e87f9,0xbc433046,0xbb1476c2,0xbc1301fa,0xbc2b611d,0xbbdb4a36,0xbbfd4255,0xbbcb92f5,0xbb7b4539,0xbc43f8db,0xbc94bbed,0xbcc8227c,0xbc4fa010,0xbc1517ca, +0x3ba91187,0x3bfc1564,0x3b3e1b14,0x39c9e2a6,0xbaf2cfdf,0x398fee5c,0x3a71d5cb,0xb8fe6bb0,0xbac73605,0xbae829f6,0xbb2e03bf,0xbb889e35,0xbbd35247,0xbc0f3838,0xbc65c70e,0xbbfdea2e,0xbbaa4072,0x3b4c9c11,0x3be382dc,0x3b93a84c,0xbb0bb8c8,0xbc70f436,0xbc92a97a,0xbce16ba0,0xbd191774, +0xbd3429ce,0xbd1e2f2e,0xbce48e98,0xbd073546,0xbd05f115,0xbce0b4b4,0xbcc207fd,0xbc6797c4,0xbad1e73d,0xbb56bbf0,0xbc02212b,0x3a542bc9,0x3aac2a80,0xba2c2cd9,0x3a51d0e3,0xb9a15e22,0x3a92465a,0x3ab40f60,0xb9879cf2,0xba95043d,0xb6bbbf6e,0xbaf0c0ef,0xbbada599,0xbbe93cf8,0xbb0ef08f, +0xbbea476e,0xbc0f8963,0xbbb0ea5d,0xbce8b705,0xbd2c4b66,0xbd6eabab,0xbd67739e,0xbd61277e,0xbd40eee0,0xbd0e79a0,0xbc8332e4,0xbc212874,0xbb4f194e,0x3b075c7c,0xbb15a55a,0xbb92498f,0xbbc2fd09,0xbc2baae8,0xbc724bcd,0xbc8e849a,0xbc4fcded,0xbbffa3c4,0x3baef758,0x3b9a1270,0xbb4cfd43, +0xbb81997d,0xbad22abb,0xba1fc7b6,0xba6174bc,0xb801c2b5,0xb8f52ef8,0xbb3bf6b9,0xbbb3d591,0xbc05b190,0xbc67ac09,0xbc4eb59f,0xbc93e58e,0xbc7d820b,0xbcb4dafe,0x3d554aeb,0x3cf1a7f6,0xbbbc803a,0xbca30654,0xbd37d109,0xbd48f309,0xbd3b15fd,0xbd078852,0xbcdfb9a9,0xbcc84eb7,0xbcc6aa02, +0xbc8f3051,0xbc83da90,0xbc9e7aad,0xbc2c2be2,0xbb4c2df1,0xbb3417e1,0xbae6f49f,0xbb2ba90e,0xb9ea1157,0x3bab6930,0x3a26f919,0xbb4804f9,0x39f7c615,0xb99ade2f,0xbb59fbfe,0xba9ac0d8,0xba84d30a,0x3b821230,0x3b0072b3,0x3be249e8,0x3c3c5dc8,0x3cd4dc9a,0x3d08e51e,0x3d1189c9,0x3d0f636e, +0x3d2112b9,0x3cc407ab,0x3c6abdde,0x3c778d08,0x3be5af4b,0xbb8c18ee,0xbcacd55c,0xbd23b124,0xbcfe84f2,0xbcc67479,0xbca04abc,0xbc9a8c40,0xbc91e0d7,0xbc6f2870,0xbca72551,0xbcb3c028,0xbc9f9ad8,0xbc937dac,0xbc689c1e,0xbb98761f,0xbb2872a1,0xbb12f217,0x3ad15dbd,0x3ac6ffbc,0x3b79a7aa, +0x3c06e0c3,0x3c0a65ca,0x3c304805,0x3c3acc6e,0x3c5f0466,0x3c7b97ad,0x3c85c2d5,0x3c7c815a,0x3c70d6d4,0x3c9de1b0,0x3cae1356,0x3caf405f,0x3c950b78,0x3c8cc48d,0x3cb4e779,0x3ccf1439,0x3cbc7ead,0x3cb606a4,0x3ca3313b,0x3c41d207,0x3afccbd2,0xbbda48d0,0xbbbdea68,0xbbb161bf,0xbb82f184, +0xbb8c23f6,0xbb897ce0,0xbbbb4dca,0xbba8d962,0xbbec289b,0xbb93e24a,0x3b2e01b7,0x3b85c35c,0x3bba1e47,0x3bcf2edb,0x3c19b89e,0x3c094b47,0x3c34be74,0x3bee433a,0x3c42ff4e,0x3c298294,0x3c612cbb,0x3c5b8a9a,0x3c850018,0x3c981d96,0x3cb3abb8,0x3ca26f53,0x3cfe8fc1,0x3ca10c25,0x3c8f3ec4, +0x3c810fb5,0x3c5ac0b8,0x3c37a7b8,0x3c10286f,0x3bf62be0,0x3c08f302,0x3c2ee5d3,0x3c3cbdcf,0x3c505711,0x3c5751f3,0x3c6197de,0x3c4a4dad,0x3c3727c7,0x3c246044,0x3c18db70,0x3c0ba83e,0x3bc799d3,0x3c658091,0x3c08879f,0x3c1e744f,0x3c44a718,0x3c62ef72,0x3c43c8ce,0x3c43c5d7,0x3c6280da, +0x3c905066,0x3c710b50,0x3c718342,0x3c90d087,0x3c8fd617,0x3cab3c49,0x3cac1189,0x3c949e94,0x3ca3e773,0x3c41211c,0x3c5e71e7,0x3c4c024f,0x3c42931e,0x3c3fae91,0x3c3ae732,0x3c2ad2e8,0x3c346a0a,0x3c3450d6,0x3c3a5a34,0x3c379dc3,0x3c380fa2,0x3c3f13a9,0x3c350a26,0x3c2fa477,0x3c29dea0, +0x3c1d9d77,0x3c1e0106,0x3be44718,0x3c74d878,0x3cb3e2dd,0x3cea8cae,0x3c61e145,0x3cbd286c,0x3cfb02b7,0x3cfc329b,0x3cf748c9,0x3cebcfb0,0x3cf5a146,0x3cf575cc,0x3cf16b85,0x3ccc6844,0x3c868d1f,0x3cfcd6d7,0x3cdc59eb,0x3c519c0a,0x3c048aef,0xbbf70182,0x3c3e4e05,0x3bc22063,0x3bdc3670, +0x3bc29aaa,0x3beda531,0x3bfac52c,0x3c02f4b1,0x3bfbc2c4,0x3bf0f637,0x3bde0a55,0x3bda1f88,0x3be36d2b,0x3c05f27d,0x3c058ed4,0x3c09599f,0x3c0c3c28,0x3c0c938d,0x3bfd1a62,0x3c5143dc,0xbbd06676,0xbc683675,0xbc746750,0xbb3cf2ea,0xbc6d67b7,0xbc82dc91,0xbc8aebe1,0xbc8a0fbe,0xbc610356, +0xbc8e794a,0xbc92cf9f,0xbc8c457e,0xbc6aaa0d,0xba86144f,0xbc722b77,0xbc879f5f,0xbc851642,0x3bd2b33e,0x3be94ba9,0x3b90bfa4,0x3b328cae,0x3baa32a3,0x3bcfdf46,0x3bf17239,0x3bf5ef17,0x3bdddfba,0x3bb30eb5,0x3ba02e0f,0x3bc9af93,0x3c229ced,0x3c245655,0x3c2863e6,0x3c2f609c,0x3c1bbdaa, +0x3c3f16ae,0x3c038485,0xbc25c668,0x3ba16675,0x3a359743,0x3a3f1478,0xbafc772c,0x39153a19,0x3b0f32b6,0x3a97feaa,0xbae538ce,0x3b3bf727,0x3bb0b9c0,0x3a844593,0x3a992b33,0xbb546678,0xbaa4937f,0x3bb4b63b,0xbc042ef8,0x3aaa2625,0x3bd843c6,0x3aa62637,0x3a478573,0x3b9a4750,0x3bc9c336, +0x3c10a728,0x3c0890ba,0x3bcd0689,0x3b445fe2,0x3adbf07e,0x3b64f8fc,0x3c2d5112,0x3c333bf3,0x3c3fafff,0x3c541b36,0x3c3cf771,0x3c830b5b,0x3bd199af,0x3a0db95a,0x3ba97148,0x3bb6273d,0x3b8f05a0,0xbb199186,0x3ad8f38e,0xbb75b0ae,0x3be3fac8,0x3929551a,0x3bad5854,0xbb2b99a5,0x3acb2584, +0xbad1b175,0xb9ce0544,0x3ac24510,0x39c2af8e,0xbbb36681,0x3b8cebd4,0x3bd70547,0xbb24c3ec,0xbbef53b7,0xbb1b4f2a,0xb9a1f4e6,0x3b9f9283,0x3be7e77d,0x3b8d0363,0xba09e65a,0xbb6b7a56,0x3a5276aa,0x3c53e946,0x3c5b2884,0x3c667243,0x3c7a3fb0,0x3c59301e,0x3c97f459,0x3c204bcf,0x3b1634a5, +0x3c7f095a,0x3c002154,0x3c284929,0x3bf20ed3,0x3b74e252,0x39ea7167,0xba845aa9,0x3bcfe27d,0x3b89286d,0x3bb7f50b,0x3b7377e2,0x3af4456d,0xb936a666,0x3c18dceb,0x3bd2cf7a,0xbcedec40,0xbbb44d1d,0x3c0c9297,0x3c407271,0x3c65a827,0x3c9cf5e2,0x3c91711a,0x3c8b1d5c,0x3c02b919,0x3c10411f, +0x3cb9344a,0x3c8a6d9c,0x3c68fc64,0x3c80a1e1,0x3c05bdbf,0x3be590fd,0x3c967646,0x3c74250f,0x3c9944dd,0x3bb0af8a,0x3a8cc7aa,0x3c85c6a0,0x3c29fdc3,0x3bf92832,0x3b2ca93d,0xb9ca2251,0x3b1905a6,0x3b1256d1,0xbaab3d5c,0xba2f0e34,0x3a9ba903,0x3af5f4cb,0x3c02970d,0x3b82eab7,0x3a8b02bb, +0xbcaa0ef8,0xbb82e1eb,0x3cbdaf22,0x3cbfce7a,0x3a26d02a,0xbc99f9f8,0xbcf1607b,0xbcdc883b,0xbc154cb0,0xbbe6ba39,0xbb343d5a,0xba6d61fe,0xbc0e801a,0xbc1ccbde,0xbbb2859d,0x3a5018da,0x3b8d6714,0x3c05815c,0x3b997387,0x3c2a9635,0x3bcca477,0xbac5f564,0x39bddee7,0xba8339e0,0x3b94c5e7, +0x3bc31566,0x3ae8ac90,0x38ff6b6d,0xbabedf04,0xba56b88b,0xb9f46878,0xbb729946,0xbb8af1cb,0xbc1d3854,0xbbdafe5a,0xbbf6911f,0x3aa043ab,0x3b0f943d,0x3c0caec6,0x3aebc03e,0x39c8c8c4,0x3be641b4,0x3c77c3ea,0x3c99b6a2,0x3c77b29d,0x3c7aa3ae,0x3c5a78a7,0x3c1bbb6b,0x3c6a52e0,0x3c818ce8, +0x3c4463fc,0x3c7ce4a0,0x3c40c9f5,0x3bc65be4,0x3b4f2219,0x3c2d4900,0x3c3d1de2,0x3abf9bd3,0x3b938187,0xb9ff98e4,0x3a0b2d94,0x3abb41a2,0x3ad44f31,0x3afb682b,0x3aadb617,0x3a59af23,0xbade9526,0xbbaec934,0xbc0720b4,0xbbbdfc9e,0xbbb9c56d,0xbc8e76cd,0xbaf597e2,0xbd1ab4a1,0xbd38e501, +0xbcef0815,0xbcc749cd,0xbc3a9ec2,0xbc52e55b,0xbc452fa4,0xbb3fe626,0xbc3ef70f,0xbc2cffb5,0xbc0e5e65,0xbc1b745c,0xbc1faa30,0xbc30b233,0xbbb4d61c,0xba50ed19,0x3b214a86,0x3bb9d68c,0x3c178908,0x3c195617,0xbbaf1d6d,0xbb5e5853,0xbacdb8eb,0xba3b6f0b,0x39ed599c,0xb8720e6a,0x3ab93891, +0xba01c68a,0xba98be18,0xbb8c26db,0xbbc2b420,0xbbe82fbb,0xbc2463d1,0xbc5d4cd4,0xbcb2c682,0xbccca5f8,0x3c5475be,0x3b9b5a2a,0x390d2c1c,0xbc59bff7,0xbcc99b4d,0xbca2ce43,0xbc35f6c6,0xbba93a5a,0xbc13f66e,0xbc296899,0xbc4426b7,0xbc17da79,0xbbf5cc36,0xbc17c5a3,0xbc2d1625,0xbbf62f49, +0xbabb6dd0,0xbb813a20,0x3a94291b,0x3bbc05f5,0xbb16648a,0x3b19454b,0xb9c18302,0x3acdb04f,0x3abce0e8,0xbb1fe7f9,0xba94a3a2,0x3aaa48b6,0x3a030560,0x3ab94a2e,0x3ae21c99,0x3b365d3b,0x3c84837b,0x3cbc1347,0x3cb7531d,0x3c9f68a6,0x3c784376,0x3cbe9fc1,0x3cfce9ca,0x3cbd9020,0x3c98cdb6, +0x3b63e357,0xbc03016e,0xbc73e4f1,0xbc878cf4,0xbc7a1120,0xbc57d6ef,0xbc2c815c,0xbc2f03a8,0xbc172133,0xbc48a3bb,0xbc488964,0xbbd49c66,0xbbe660a0,0xbbcfb7cf,0xbbe07255,0xbbd0c758,0xbb8c3ee9,0xbbb97c82,0x3ac436a0,0x3bde39d2,0x3c346f1a,0x3c2f7519,0x3c2e43d2,0x3c7a676e,0x3c863f1e, +0x3c973ee2,0x3cb24d00,0x3c89c860,0x3c8263c0,0x3c98d2a2,0x3cb67878,0x3c7d1fbe,0x3cb137f3,0x3cdb568b,0x3cd6f3b6,0x3cfda77c,0x3cdfc95b,0x3cd4825c,0x3cc3edcf,0x3c6409f7,0x3b800f03,0xbbe319fe,0xbbbd6b54,0xbbb17709,0xbbb0dc56,0xbb63ba78,0xbb0f8551,0xba6e47f4,0xb927e9dc,0x3b75d4b7, +0x3abb5045,0xbafd8f38,0x3b10a192,0x3b90fb27,0x3bbd0a28,0x3badfec3,0x3bed2606,0x3bd9ab52,0x3c393ac3,0x3bfd5d14,0x3c5ae420,0x3c40b33f,0x3c7f6ca0,0x3c7c45a5,0x3c681f5f,0x3c408af8,0x3c81e356,0x3c765b3c,0x3cae54d4,0x3caff284,0x3ca9e5d6,0x3ca6b67e,0x3ca6295f,0x3ca4973e,0x3ca71082, +0x3ca2d47a,0x3ca80458,0x3ca36c35,0x3c99dce1,0x3c8840b8,0x3c6b7457,0x3c5f67c8,0x3c4fa474,0x3c42431f,0x3c2d2b9c,0x3c182acc,0x3c0f470a,0x3bc9e43c,0x3c2aa55c,0x3c200fc0,0x3c25a4d0,0x3c2a7861,0x3c52cbbe,0x3c7c5142,0x3c76849d,0x3c602d36,0x3c923851,0x3ca42bf5,0x3c990d7c,0x3ca08c4b, +0x3c941852,0x3c990f6a,0x3cb375a5,0x3c5ea49d,0x3cb7d9bc,0x3ca81657,0x3ca9f1fd,0x3ca9cef2,0x3cab11b4,0x3cac1d47,0x3cae1f16,0x3ca9f897,0x3ca4c1c5,0x3ca1e570,0x3c9ba363,0x3c9823cf,0x3c93975d,0x3c908b9a,0x3c8cb401,0x3c898313,0x3c877f6d,0x3c82aadb,0x3c8a27c4,0x3c2494f8,0x3bad1f66, +0x3ba0f1e9,0x3c49148e,0x3bbada90,0x3b96436f,0x3b91c817,0x3bab95ea,0x3be53e37,0x3bc404bb,0x3bd3c07f,0x3bf38135,0x3c120023,0x3c7f38d7,0x3c170575,0x3c0f6939,0x3cbbad44,0x3b3dc683,0x3c725054,0xbb020444,0x3b08773d,0x3b2670b1,0x3b371e9c,0x3b902faf,0x3b90df57,0x3b4160f9,0x3b45cb48, +0x3b19e364,0x3a7a3581,0x3aae90f4,0x3ae608f6,0x3b4b3feb,0x3b27e4e4,0x3b2adff7,0x3b2da158,0x3b412943,0x3b542f16,0x39aa3d70,0x3c848b63,0x3c96ecd7,0x3c17e4c1,0x3c583e05,0x3c90d31e,0x3c11c310,0x3c2c688e,0x3c339d57,0x3c276e9e,0x3c46cea6,0x3c4a3b1d,0x3c491baa,0x3c8d42b1,0x3c425106, +0x3c28a98c,0x3c9973bf,0x3c7cf197,0x3b2c47c5,0x3a20b7af,0x3b6c2f0b,0x3b43229e,0x3c0515cb,0x3c1140f6,0x3b9d77cf,0x3ba242ed,0x3b226f21,0xba7e49cc,0xbab26d30,0xba2817ba,0x3b518890,0x3b250cda,0x3b65e807,0x3b78b155,0x3bb5d740,0x3b6ed398,0x3bf028ab,0x3c834c85,0x3c0bea2c,0x3c3def35, +0x3c04a8c5,0x3c07aab2,0x3be25d2e,0x3baedc5f,0x3c057f56,0x3c561ec0,0x3beef6bc,0x3b7ed7b0,0x3be6a4a5,0x3ba5b7bb,0x3c0a9417,0x3c67a643,0x3bc9bf17,0x3c3a8779,0xb8b790fe,0xbb3d5526,0x3b7b5110,0x3b099c53,0x3c5d1b5f,0x3c7ef2d9,0x3bc56a9e,0x3bfe3766,0x3b30362e,0xbba2abac,0xbb80ad4c, +0xbafa6d5d,0x3bd75cc4,0x3b680965,0x3b8f1419,0x3b956f8f,0x3bd50618,0x3b86556c,0x3c250dab,0x3c8abad0,0x3c598a38,0x3c2e475c,0x3c06479d,0x3c147621,0x3b61289b,0x3bbcb9bf,0x3aaa1e69,0x3c5408cd,0x3b1fdc50,0x3bdeed49,0x3bd9924f,0x3b9f34ad,0x3bd20cc2,0x3c84d179,0x3c150708,0x3c46e0c7, +0x391b4b8a,0xbb10d07e,0x3b730565,0xba20a4f5,0x3c95bfba,0x3cb9b324,0x3c20ea00,0x3c4facac,0x3b81e0e5,0xbc1d1ced,0xbc258172,0xbbc00e4b,0x3be5c3fe,0x3bab312a,0x3be32afc,0x3c002d34,0x3c31f9eb,0x3be4ae98,0x3c370f04,0x3c8e1f07,0x3c0faed8,0x3c6a035b,0x3bfaaa59,0x3b739495,0xb94516fd, +0xbabc2a1d,0x39800a6f,0x3b7142b2,0x3b97d0d5,0x3af81657,0x3b2cbabb,0xba93bba2,0x3b8cab7d,0x3c75963f,0x3c1e86b4,0x3bd03f5d,0xba74b8cf,0xbbbf4b4d,0x3ba97c62,0x3c176682,0x3c6f1734,0x3c6ea18d,0x3c5aac06,0xbb9c52c0,0xbc3a8bb6,0xbbf8cf33,0xbc20007e,0xbc160343,0xbba9e434,0xbb391cb2, +0xbb11844f,0xbc1157f0,0xb9f6bea1,0x3ab75dd5,0x3c4a85d7,0x3cb814ca,0x3c4c5904,0x3c4736dd,0x3bfa3ce2,0x3bbd8d55,0x3a74e814,0x3b1b2ef8,0x3b107664,0xbae08fda,0x3a3bcb05,0x3b4e50b8,0x3c02abe2,0x3c345a91,0x3c432a5d,0x3bec2c39,0x3b931b4f,0x3c36c5f9,0x3cb71208,0xba207aab,0xbbb6b01f, +0xbc522a1f,0xbc810c27,0xbc1bcf2b,0x3c0dc966,0x3b1ce351,0x3ae65392,0x3a964292,0xba39e9a2,0xbab52cc9,0x3a182a02,0xba12c105,0x3b0a5aee,0x3c0846c6,0x3c2d080a,0x3bd987a9,0x3c4675a4,0x3bd20e38,0x3b5faed6,0x3bbd7af2,0x3b025d22,0x3b384053,0x3aa1e1e2,0xba6102d4,0xbb028228,0xba0dd524, +0xba8086c8,0xbb32b399,0xbbc0a001,0xbbb0f011,0xbba607af,0x36c43a7d,0xbb24cd7b,0x3c05ec6d,0x3bafa846,0xba2d36d3,0x3bb24d49,0x3c9ca12f,0x3cfad622,0x3cf487e0,0x3c7fe5c6,0xbb75eb3e,0xbc3b4710,0xbc1d3378,0xbc0a41fe,0xbb503477,0x3b13cb49,0x3b5f4885,0x3b7b2450,0x3b70d695,0x3b50835f, +0x3a777375,0x3c750433,0x3c03d9fb,0x3b39a72a,0x3bdfb43b,0x3b9949cf,0x3b442584,0x3ad8f7bd,0x3ab986cd,0xb9829140,0x39b47244,0xbb18ded8,0xbb98308e,0xbba73a05,0xba1d4d65,0xbbd59af6,0xbc15be09,0x3a8fa859,0xbd089944,0xbce408a7,0x397ea798,0x3c65ce7e,0x3bcfb7f8,0x3ba10d7b,0x39067f55, +0xbc2c70f0,0x3b8d5336,0x3c325029,0x3c3eac12,0x3ba8d744,0x3a12f481,0xbb3da68f,0xbb952f5a,0xbacfbc6c,0xb94d4bc5,0x3b68af76,0x3b49764f,0x3c238ea0,0x3b6f3b85,0xba9b58e6,0xb94cd96d,0x39eade2e,0x3ad2f81d,0x3a8bce83,0x391f87b1,0x3a3913cf,0xb781490c,0xbb7515c8,0xbbc75ca7,0xbc13a7a6, +0xbbdefef6,0xbc57903f,0xbcba9f4c,0xbcf1f777,0x3cc41cea,0x3c5b6e20,0xbb5158e7,0xbbf87e1c,0xbc87302c,0xbb09b80f,0x3b5722d9,0xba98d83f,0xbab35535,0xb92beb5e,0x3c079a8a,0x3b8acf30,0x3b68e754,0x3b9acca4,0xbb45c245,0xbbb8ef97,0xbbaaf66e,0xbb02453a,0x396bb29d,0x3bc7d64e,0x3b9f4c5a, +0x3aa220b0,0x3aee6432,0x3b1e150b,0x3aa0718e,0xbaf5e5d7,0x3a41c315,0x3a35b414,0x3b27b3e6,0x398f9791,0x3b11c482,0x3b7d2d74,0x3c584a09,0x3ca6f4c2,0x3cc51886,0x3ccc22db,0x3d228c9b,0x3d29c6f0,0x3d04e2fe,0x3cc16097,0x3c1405a4,0xbc544a12,0xbcce66bf,0xbccfd125,0xbcb616c9,0xbc9c32bf, +0xbc8be691,0xbc3b0a17,0xbbfcb4bd,0xbb98be6a,0xbb9db091,0xbbd24801,0xbbd61494,0xbc1bc769,0xbc18ad0e,0xbbab1946,0xbbc9949c,0xbb7b9f82,0x3ab3fbce,0x3b95de06,0x3beef9ba,0x3c362406,0x3c2632fe,0x3c3262bf,0x3c346140,0x3c833bfc,0x3ca3accb,0x3cc5e2be,0x3ca4d710,0x3cb0a27f,0x3ce85358, +0x3d0d0110,0x3ccc53a6,0x3cae16c9,0x3c8fbd23,0x3ca20b25,0x3caf7d50,0x3c9b33f7,0x3c7ce0b9,0x3c2350bf,0x3b7ca0bb,0xbb1f44f0,0xbc21e56d,0xbc244e8e,0xbc35f0f6,0xbc463b45,0xbc274121,0xbc0609d7,0xbbd5f784,0xbb4f0cc0,0xbb1306a4,0x3b45be58,0x3be4fbc7,0x3bb0ed70,0x3b910fc5,0x3b988899, +0x3bc69fe0,0x3ba8b85b,0x3c1450ca,0x3c2101e8,0x3c80d041,0x3c7577f7,0x3c94d0dd,0x3ca0fb50,0x3caca382,0x3cb9fd09,0x3cc111c8,0x3cbbf51a,0x3cc7c29d,0x3ca3f7f1,0x3c93a8f9,0x3c917788,0x3c80ba63,0x3c6b1f3c,0x3c599ee9,0x3c57705e,0x3c3fe193,0x3c2ea97f,0x3c1a02e9,0x3c021dc2,0x3bdf669e, +0x3bd38f79,0x3bbabc81,0x3b997a6c,0x3b552c7e,0x3b11815c,0x3840122b,0xba311da3,0x3c130a66,0x3bd1e74b,0x3c2fa644,0x3c3eabaa,0x3c809f51,0x3c895e4b,0x3c87cd9f,0x3c9993d1,0x3cab9e41,0x3c9be7fb,0x3c953f97,0x3ca64d4e,0x3ca20216,0x3caae326,0x3cb34d38,0x3c9e9823,0x3cc859f3,0x3c7ed278, +0x3c87b011,0x3c84224b,0x3c827622,0x3c83b146,0x3c82be40,0x3c81c17c,0x3c742f14,0x3c69578a,0x3c616a99,0x3c560cd5,0x3c49be3f,0x3c3a55c3,0x3c35a235,0x3c3254d8,0x3c303d42,0x3c2dbf71,0x3c337fb3,0x3c05ace3,0x3c98b76b,0x3cb4b00c,0x3ca05f1b,0x3ca19e6b,0x3cc7e618,0x3cadefba,0x3cb38324, +0x3cb37541,0x3cadc8c3,0x3cbbc666,0x3cbf89e6,0x3cbfde7a,0x3cd7ece9,0x3cbb9373,0x3cb446b3,0x3cd9d8b6,0x3c9b0c61,0xbb36069a,0xbc39e956,0xbb07d519,0xbb2e2ebd,0xbb4fc169,0xbb470d3a,0xbb7b7570,0xbb87bdd0,0xbb8ea077,0xbb83180e,0xbb87779f,0xbb9d920f,0xbb9aa461,0xbb92a7f0,0xbb75c148, +0xbb5aa9a9,0xbb4523d9,0xbb3c399f,0xbb32d142,0xbaf6f7de,0xba57ed16,0xbc212b3f,0xbbe43783,0x3c0198f0,0xbc273ecc,0xbc0b2412,0x3bb37261,0x3b90ba23,0x3b8dbdd1,0x3bbf096c,0x3b3c0777,0x3b165ba9,0x3b296e76,0xbc11857f,0xbc26e919,0x3c0026e3,0xbc08b1b9,0xbb9915fa,0xbbcd8b45,0xbaedfe61, +0xbb95cdf0,0xbb9da5c6,0xbbfdcb0d,0xbc0f58fb,0xbc10c42d,0xbbf3d3d5,0xbbfa90f9,0xbc1be950,0xbc196bba,0xbc0b795d,0xbbcc7f98,0xbba7ae53,0xbb947c66,0xbb8f6aa7,0xbb8730bf,0xba8b3043,0xbb656a55,0x39efa9d8,0x38a2e760,0xbb87f9ad,0xbaa852db,0xbb11a040,0xbbabaa12,0xbb78d7ff,0xbbbf5505, +0xbb8efb09,0xbb994df2,0xbb284e63,0xbafa7338,0xbb8abe99,0xbb3dd978,0xb8fa39ba,0xbb41b4fb,0xbc192915,0xbbf0453c,0xbb065592,0xbbb1a53e,0xbb8d13a9,0xbc23c17d,0xbc515f0a,0xbc619b51,0xbc34bf00,0xbc4396ab,0xbc85c083,0xbc84330d,0xbc6c90e0,0xbc2a1fd8,0xbc01b21a,0xbbcfc0fb,0xbbb5bda6, +0xbb7e4648,0x393c7d97,0x39f1ec8b,0x39caaae6,0x3b464706,0x3b16d672,0x3a2e18bc,0xbac1fc01,0xbaf02ac3,0xbafd7aee,0x3aee08e7,0x3b02e592,0x3b13428a,0xbadeae96,0x3ac01424,0xbb1ecc17,0xbae7d7b8,0x3bc8b027,0xbb5ba24b,0xbba6531d,0xbba5d1ac,0x3a4d783d,0xbbb75825,0xbbe44ebd,0xbc8c761c, +0xbcb61182,0xbcba179d,0xbc8bf775,0xbc905c10,0xbcc6f3cf,0xbccece48,0xbcbb51e4,0xbc8209f6,0xbc4f4a15,0xbc280956,0xbc137371,0xbbd31e9d,0x3ae9bd27,0x3b20c9aa,0x3bd96da8,0x3c37d9f4,0x3c00555d,0x3bd63cf9,0x3b9c8a33,0x3b33a1ae,0xba5c0d33,0x3aa70ff9,0x3c185f21,0x3b80e9e1,0x3b5c9a74, +0x3babab43,0xbabd1384,0xba066922,0x3c829bbd,0x3b016356,0xbcc16db1,0xbc970d96,0xbc1e95eb,0xbbc3d7a8,0x3b5cc683,0xbb47411b,0xbbe88a73,0xbbcfcd32,0xbc288fd1,0xbc155bc7,0xbbb2687e,0x3abca1e2,0x3b900d03,0x3c01250d,0x3b0837fa,0xb86a56ae,0x3b896539,0x3a8ebdf1,0x3ac7c191,0xbb851952, +0x3babe420,0x3c422d27,0x3bce8b31,0x3bb21d22,0x3b4ad38e,0x3aa76190,0x3b2f50b8,0x3af7e40b,0xbab3ea0d,0xbaa234be,0x3b0be210,0x3bb39c21,0x3c0086ee,0x3ae67bb5,0xbbe2c9c9,0xbc993675,0xbbc76bb4,0x3cb77ec4,0x3c3ee600,0xbc0bd5d5,0xbc53b5c7,0xbd0f4cc9,0xbd04dd99,0xbbc67268,0xbbbfbbb3, +0xba3d4da9,0x3a919a24,0xbb60c81a,0xbbf15d13,0xbc22c207,0xbc4ccded,0xbc77bbd0,0xbc83505a,0xbc44c9da,0xbb85aa1d,0x3adb097e,0xb9ae6c24,0xb96ac384,0x3a321d40,0x3b2371b1,0x3b49a65e,0x3ab6a599,0xb9fd5f58,0xbae49efc,0xba805006,0xb9a7ce2f,0xbb1e2bea,0xbb993bad,0xbbac8563,0xbba5ea24, +0xbbcd3486,0xbc1a9881,0x3b1aecb0,0xbb62d1d9,0xbbfab9f1,0xbc52ec3e,0xbd044cae,0xbcd2bbe8,0xbcc7b6b5,0xbcdc3049,0xbc453b2a,0xbbd5df68,0xbc23f722,0xbc97ee3c,0xbcadbc5d,0xbc8490b6,0xbc5ba783,0xbbe5aff2,0x3b08cf98,0x3b2c8448,0x3beda870,0x3c166d3a,0xbb15dfdc,0xb924a150,0x3b30fb4e, +0x3a42c96d,0x3a29b149,0x3a9207a0,0x3a8c18d7,0xb989fc82,0xb8a21a87,0xbb6252aa,0xbbbc3e07,0xbbe2f03f,0xbbe057bc,0xbc0fa8a7,0xbc74ca05,0xba205a20,0xbd083693,0xbcb5fd2d,0xbc94dbfc,0xbcfc7669,0xbd714d74,0xbd46058b,0xbd170ca0,0xbc9b3cec,0xbc6a8a0a,0xbc4419b7,0xbc565f0b,0xbc8052e1, +0xbc8274fb,0xbc47d5c6,0xbc910e19,0xbc83d651,0xbc36ca52,0xbbc36560,0x3a89dcae,0x3bc45770,0xbaa1957e,0xbb63416f,0xbab8a368,0xba9460f6,0x39e67e3d,0x3a3fbc99,0x3a27fd99,0xba85c8fd,0xba0e2cb8,0xbb3e1083,0xbb969f75,0xbbb9aa25,0xbbb4e9e1,0xbc640732,0xbcc2adad,0xbcef0eb1,0xbb8df846, +0xbd23de9e,0xbd8c22a8,0xbd884b11,0xbd60e8e8,0xbd229f7f,0xbcf2cec3,0xbcce24de,0xbcb4ba51,0xbcabf6d0,0xbcba88e6,0xbcbab004,0xbca7557e,0xbc713318,0xbc2d91be,0xbc04d669,0xbbbc840c,0xbb17b522,0xba3a5753,0x39a5f75c,0xbbb91e4d,0xbb6792ae,0x3b4e4410,0x3ad4710d,0x39af66ed,0xbb26add6, +0x3962388f,0x3ab66549,0xbb1b2630,0xbb865b74,0xbbb1ec96,0xbbd3511a,0x398ca61e,0x3bc0f92e,0x3c454601,0xbb844a0e,0x3d0705e1,0x3cb19522,0x3c83103c,0x3bb5ccf5,0xbc01e3c6,0xbcc1e7f0,0xbcf5c202,0xbd018031,0xbca454c1,0xbc52d2a2,0xbc2a8a22,0xbc150c98,0xbc3175a3,0xbc521411,0xbc5ebc6b, +0xbc5a4b0f,0xbc127a33,0xbc18cc89,0xbbd5a121,0xbb2333db,0xbbbd7075,0xbbc1acab,0xbbe2983b,0xba96c7b6,0x3b9a4029,0x3c099c16,0x3c0a6be6,0x3c11e7fa,0x3c3cf261,0x3c81b803,0x3c9cb43b,0x3cb23611,0x3c9e5ea3,0x3c9339d6,0x3cc41525,0x3cba604a,0x3c32730a,0x3c5b7afe,0x3c3feb73,0x3c111997, +0x3c0be5cb,0x3b1f2859,0xbb80dbe2,0xbc49c6da,0xbc811713,0xbca1b557,0xbcc18483,0xbca330cc,0xbc87fc29,0xbc64fd3c,0xbc46ccb3,0xbc2cca4e,0xbc0d8433,0xbbf487a1,0xbbbdba2b,0xbba77047,0xbb31d8da,0x3a087e2c,0x3b20b178,0x3b647f00,0x3b85c390,0x3ba22433,0x3c008090,0x3c2c01aa,0x3c4027c6, +0x3c708bf8,0x3c7e8f84,0x3c9033df,0x3c880f84,0x3c7dd520,0x3c6e6374,0x3c639fc4,0x3c9657fc,0x3c408a1c,0x3c3c03f3,0x3c1b6824,0x3c016791,0x3bcc3440,0x3bb16906,0x3b8f6f38,0x3bafc351,0x3bc69e72,0x3bc8d374,0x3bb8696a,0x3b91805c,0x3b5e9e3f,0x3b3d16f8,0x3b2001ea,0x3b008f6c,0x3aae288d, +0x3ac7ba95,0xba124388,0x3a3d6887,0x39f85626,0xb889ba92,0x3b63ac72,0x3b93cc10,0x3b8d6bcf,0x3bca78ce,0x3bc8a32d,0x3c02cae5,0x3c1fd876,0x3c4b0a2c,0x3c6cf7a3,0x3c6a1065,0x3c796314,0x3c654b94,0x3c5b6a63,0x3c096dd5,0x3c2a3ab4,0x3c2f4685,0x3c23229f,0x3c1fceb1,0x3c1cb23d,0x3c17f9e1, +0x3c0fa105,0x3c0f1258,0x3c0b32fd,0x3c0b4159,0x3c0734ff,0x3c063444,0x3c031419,0x3c028e88,0x3c0082aa,0x3c001de4,0x3bf92b0a,0x3bfbf7d2,0x3bfe9cef,0x3b953e5f,0x3bd5fdb7,0x3c87b780,0x3b9890d5,0x3be02a02,0x3c9602cc,0x3c9490ff,0x3c959de0,0x3c98d19d,0x3c94ec50,0x3c95859c,0x3c9886c9, +0x3c31c8fc,0x3c0228b3,0x3caaa435,0x3c38eb5d,0x3c44b3a9,0x3c52479d,0x3c5e6b5c,0x3c4e2c53,0x3c2a23f3,0x3c3fe1c9,0x3c310173,0x3c649008,0x3c6eaad5,0x3c5a0835,0x3c6306a3,0x3c581a86,0x3c3a0f4f,0x3c3b8261,0x3c3dcd67,0x3c483d63,0x3c507a2f,0x3c542b69,0x3c533640,0x3c55a5aa,0x3c43d39a, +0x3c636763,0x3c6acc4c,0x3bde4665,0xbc3aeb5c,0x3c7bc174,0x3be8ebc4,0xbc2b984d,0xbc19b48c,0xbc0fc7d0,0xbbf1b4bf,0xbbf71f93,0xbbf40929,0xbbd38733,0x3becea2d,0x3c844435,0xbc0d5889,0x3bcacdbe,0x3af3651d,0x3c763b7a,0x3c26dff5,0x3c36c905,0x3c19400f,0x3c8db6bc,0x3ca27fbd,0x3c88881e, +0x3c994809,0x3c87ffab,0x3c41df90,0x3c32e6cb,0x3c3415a3,0x3c58bbeb,0x3c7c09b0,0x3c89f8a7,0x3c8a0349,0x3c894a8c,0x3c7861d1,0x3c8acd7e,0x3b744491,0x3c405a08,0x3c4902b1,0x3c086265,0x3be6314e,0x3c286fa7,0x3c250504,0x3c504a3c,0x3c5559c3,0x3c4bda0d,0x3c2db131,0x3c1b4446,0x3c0fcca1, +0x3be21a66,0x3c5ea9f8,0x3c662531,0x3c26e96b,0x3c1f2e8b,0x3c0cdb51,0x3c35352a,0x3bf799fd,0x3cbaf47d,0x3ce4479f,0x3ca92ad0,0x3cd235b6,0x3cadd5fd,0x3c3711dd,0x3c26f124,0x3c2dd887,0x3c775697,0x3c947630,0x3ca42b7d,0x3ca43e25,0x3c9a4b5b,0x3c972675,0x3c7cf41a,0x3c69dd58,0x3c556100, +0x3c21c841,0x3c1fb9bf,0x3bd31f74,0x3bda2cd1,0x3b6cd06e,0x3beb7667,0x3c34c4ee,0x3bb329b0,0x3ba3180c,0x3c0c529e,0x3b939246,0x3bd59ece,0x3c7f565f,0x3c4270b2,0x3c1e922a,0x3c27c523,0x3bcde469,0x3bbd0e4c,0x39301054,0x3cbddb43,0x3d06a556,0x3cc900ea,0x3d044d80,0x3cd83faa,0x3c1f0cd5, +0x3bd65d6c,0x3c009a13,0x3c8133a8,0x3cbf3995,0x3ce3b70b,0x3ce5b2fb,0x3ccfd449,0x3caf52f7,0x3c958517,0x3c58a078,0x3c6b3949,0x3c2a7a7a,0x3c274e78,0x3bd5a95c,0x3b4689aa,0x399f7c42,0x3ab79b63,0x3c10f733,0x3b9faf90,0x3b586749,0x3bad215d,0xb88fffbf,0x3bb9d0b6,0x3ca1cb22,0x3c7a16de, +0x3963eb8f,0x3c638884,0x3c957b1a,0x3cd4d4fd,0x3d0ceecb,0x3d0a14d9,0x3d05a68e,0x3d0e5b68,0x3cc422e5,0x3c88d578,0x3c382bfc,0x3c4d4245,0x3c1839e0,0x3b35b20d,0x3ba28939,0x3bb4fe2e,0x3bd33ce1,0x3c52a227,0x3ca2cd7f,0x3ca8152c,0x3c8810d5,0x3c8f6a80,0x3c3cd6cf,0x3c168840,0x3bdce9b3, +0x3b12b52b,0x3b7364c0,0x3b3722bb,0xba935068,0x3aacc528,0x3ba3da00,0x3c2ff537,0x3c4e4532,0x3bffa507,0xbaddabe6,0xba4d7b0d,0x3c11c43c,0x3d11b41d,0x3ba5160e,0xbbb8f8e5,0xbc160289,0xbc4dbb05,0xbbc189eb,0x3c37ce2a,0x3c05dca1,0x3c021510,0x3bfb1ea0,0x3b896c11,0x3b218c50,0x3ba5c6dc, +0x3bf2a226,0x3c643b2f,0x3cc421c9,0x3ca1286a,0x3c7fc71a,0x3c41599f,0x3b1191ec,0x3b41df3c,0x3be78194,0x3bbd2213,0x3bafcfb7,0x3b42374b,0xb8689dd8,0xba94e063,0x39465c4c,0x3b0cc8f9,0x3a0c8255,0xbafe5080,0xbabbc0d5,0x3afc8a9e,0x3b564733,0x3a97d29b,0xba28af73,0x39dec7f9,0x3ab9aa0a, +0x3c5c0262,0x3d17d362,0x3d58e5e6,0x3d69de5e,0x3d3c05d0,0x3cef0a04,0x3c83274d,0x3c3fe6b1,0x3c8aabf0,0x3cbe9020,0x3cf15c66,0x3ca51e2b,0x3c36ccde,0x3b825809,0x3bc01335,0x3c183734,0x3ca21fe2,0x3c20d3a2,0x3ba6af1a,0x3c0ae211,0x3bd67404,0x3b6338ac,0x3acfbf0c,0x3b225f3c,0x3a82aca3, +0x3a14f86e,0xbb2fa05d,0xbb786fce,0xbb55fb02,0xbbb37385,0xbc19d7f9,0xbc353e60,0xbab1adb7,0xbcc7f650,0xbb03bea2,0x3ccf6253,0x3d14ded9,0x3d26d15c,0x3ce27ba8,0x3c859097,0x392a1483,0x3bb599e7,0x3be1be11,0x3c0f39a2,0x3b9e62ef,0x3b43419b,0x3b8a4ae5,0x3bd7b5ee,0x3c2f189c,0x3c30854f, +0x3c56737e,0x3c26c403,0x3c1675e2,0x3b005778,0x3ac90b54,0x3b04d21e,0x3ac85ca7,0x3b3ea28a,0x3b539481,0x3995df9e,0x39c9ceda,0x3a86d567,0xba55a313,0xbb3e171f,0xbb3094a9,0xbb61d3f8,0xbc0a2604,0xbcabb62f,0xbcd23fe5,0xbc6e9b17,0xbc8722ad,0xbc05ffee,0xbb04006c,0x3c462a7e,0x3cc10dc6, +0x3cdf35c4,0x3cabebe2,0x3c8bb07a,0x3c799bb0,0x3ca25cf1,0x3c27e4ec,0x3bb8fd38,0x3bf3edf9,0x3ab1a9dc,0xbb064389,0xbb43a20d,0x3af8361b,0x3b9fa4c1,0x3bfc7181,0x3ab510d9,0x3b36e55b,0x3ba7ccf7,0x3b14ab1d,0x3aa5c308,0x3a1ab12c,0x3b2a10a7,0x3b4c9191,0x39f3557d,0xbb200243,0xbb8063de, +0xbb8c488c,0xbb3d2f09,0x3a9e2589,0x3ba867d3,0x3b98e738,0x3ce4a438,0x3d22323a,0x3d0a36f2,0x3c9592ab,0x3ae19431,0xbc1fc026,0xbc4488ac,0xbbb66f71,0xbc04ed86,0xbc15f06e,0xbc343e3b,0xbb2bc4c5,0x3b13df6a,0x3b73968a,0x3b8686f7,0x3b7f667b,0x3a32e5a5,0xb93ce614,0xbae41bbf,0xbb311873, +0xbb7a8fbc,0xbb23893c,0x39e518a5,0x3b8fe906,0x3bce7259,0x3bf337dd,0x3c1383dc,0x3c26bd0e,0x3c3b6f08,0x3c9408a8,0x3cb35718,0x3cc63c90,0x3cb61528,0x3cce5091,0x3cf0face,0x3d0d50bc,0x3cbb4fbc,0x3cb8d042,0x3c97e816,0x3c8a1ef3,0x3c7b311e,0x3c2f9b7e,0x3b8c3811,0xbb1f11b6,0xbba9ecaa, +0xbbf16ac8,0xbc3bd0c3,0xbc44fb69,0xbc59d23b,0xbc6c4605,0xbc5716cf,0xbc459e94,0xbc32367c,0xbbf60142,0xbb9ee2f1,0xba91aeee,0x3ac4d57d,0x3b23386a,0x3b881d6d,0x3baff8bc,0x3bba90c6,0x3bfa4790,0x3c144da4,0x3c54b9f7,0x3c7a7ef6,0x3c85e513,0x3c918255,0x3ca94f14,0x3cae080f,0x3cb51ab0, +0x3cb34f81,0x3cbc8ecb,0x3c441cfe,0x3c851221,0x3c7ba1ff,0x3c7eae2a,0x3c784601,0x3c76fee1,0x3c817b5e,0x3c86d24f,0x3c5d510a,0x3c275cc4,0x3bf34b81,0x3b8ef2d0,0x3ad3a532,0xba8f4328,0xb9f56ca3,0xb95e4b7b,0xb95efabb,0xb6f754cb,0xba2ae631,0x39e62781,0x3acabd8e,0x3b6bc571,0x3bd60383, +0x3bcbf66c,0x3c0cbec5,0x3c362cf2,0x3c488e81,0x3c6bb0d9,0x3c748ed2,0x3c878093,0x3c8948ed,0x3c91d626,0x3c8f09f1,0x3c83932e,0x3c86be08,0x3c852f34,0x3c91e633,0x3c639eef,0x3c5e1d39,0x3c648c3d,0x3c640a86,0x3c685d03,0x3c67941d,0x3c706202,0x3c563b7f,0x3c4778b6,0x3c3760be,0x3c25e9fd, +0x3c154589,0x3bf7015c,0x3c05971a,0x3c08a65a,0x3c0ce2d2,0x3c1213c2,0x3c14a6b1,0x3c10172d,0x3c6009b4,0x3c48d4e8,0x3bb60a89,0x3c7b63ad,0x3c60695b,0x3bc1d234,0x3be08b5c,0x3bf76bbe,0x3c07d31c,0x3c1a1089,0x3c27cf67,0x3c38af5a,0x3c857fb9,0x3c963f59,0x3c1397ad,0x3c79ec9b,0x3c7c198e, +0xbbe7b9f9,0xbb36ad2f,0xbc22b44c,0xbbbf8895,0xbbe0f8fb,0xbbc8026d,0xbbf2bb35,0xbc0429bf,0xbc144b31,0xbc079486,0xbc0a2578,0xbc1a0874,0xbc145d23,0xbc11ba01,0xbc0f0c00,0xbc04a912,0xbbfdcc86,0xbbf8df96,0xbbef644e,0xbbb7d2e8,0xbc0c1700,0xbac805d8,0x3bff5ef1,0x3cbcab33,0xbbb0ca15, +0x3bc0f840,0x3caa68c6,0x3ca92d85,0x3ca89b5c,0x3ca378e0,0x3ca0cd17,0x3c9f08cf,0x3c9cc38b,0x3baaa506,0xbbe50cb6,0x3cbdf640,0x3c03058c,0x3c45f457,0xbc0f19a8,0xbbc2460b,0xbbde88a4,0xbbc8ee45,0xbc18f77c,0xbc33ec34,0xbc5b24b4,0xbc3a5dfa,0xbc43462b,0xbc70fee1,0xbc69a6bc,0xbc68e7a8, +0xbc5e3a60,0xbc43d28d,0xbc30ef4b,0xbc2aeaa0,0xbc0e4c2f,0xbbe2dab5,0xbbbbe742,0x3c5b9fea,0x39c868da,0xba839703,0x3a9e7080,0x3b01e994,0xbb5dcab2,0xbb62690c,0xbb8ec73b,0x39f7dfd1,0xbb8dd47d,0xbb975668,0xb91bdf09,0xbb66c2a5,0x3b12a990,0x3bc3bf76,0xbb718df8,0xba09c351,0xbbf2e461, +0xbbf44cfb,0xbbc39e9e,0xbb9fceea,0xbc243908,0xbc6a1838,0xbca283ad,0xbc802653,0xbc88ec8c,0xbcb3dc2d,0xbcad5943,0xbca7ef80,0xbc9bcecc,0xbc8387ed,0xbc618ab9,0xbc57355f,0xbc16ba7f,0xbc004083,0x3a92dc04,0x3bd7be74,0x3bacef1a,0x3b30c7c6,0x3a887442,0x3b5ff668,0xbadd8ae3,0x3b342b8f, +0xbacf5126,0x3bc994eb,0x3a1488c2,0x3b2d9a2e,0x3b49a2af,0x39dd1940,0x3a95ccec,0x3c42fbf9,0x39b12f6e,0x3b8f8c23,0xbb86f555,0xbb4245cd,0xbb9a0551,0xbb9d3662,0xbc48367e,0xbc8eddf9,0xbcd7a7d2,0xbca2495a,0xbcb1d2d5,0xbcf7f53a,0xbcf84125,0xbcff7e2b,0xbcec82e8,0xbcc5e617,0xbca44b30, +0xbc931baf,0xbc44bfeb,0xbbdbf27f,0x3b0b1b80,0x3c577c5a,0x3bead258,0x3c13cac8,0x3b8b1810,0x3b54d837,0x3ac1bd43,0xbaa1a81d,0x3b33f37b,0x3c115bbd,0x3b83547c,0x3b038854,0x3bb270d9,0xbb22e726,0x3ad87158,0x3c99c182,0x3b97748b,0xbc085cd6,0xbc86395d,0xbca1aa13,0xbc2d911f,0x3b93e2bb, +0xbc2d6037,0xbc942315,0xbcae79d9,0xbc9053ab,0xbc84d6e2,0xbcad29af,0xbc46ec47,0xbbf88925,0xbb300cb2,0xbb9b5c92,0xbbcf2c34,0xbc273f35,0xbc21e59e,0xbc2856e6,0x36b4bb65,0x3c5528db,0x3bdd6247,0x3bc29dcc,0x3bb845bf,0x3bb8ca1d,0x3b3a4bc0,0x3b40d623,0x3ad12bba,0xbae9b8e6,0xba42d12b, +0x3b816490,0x3c180607,0x3c210104,0x3b99a036,0xbbd927ab,0xbc2732ae,0xba0d19a1,0x3c9106d7,0xbb8f1525,0xbc75cf92,0xbc3dfd94,0xbcc0d368,0xbc8a3f0f,0x3bdfa655,0xba291282,0xba480e66,0x3ba7e1b9,0x3b903c6c,0x3a28dca0,0xbba38d46,0xbc57048b,0xbc9edc40,0xbcd337a7,0xbc7e91de,0xbc2a03ef, +0x3abd2844,0x3b7b6cc7,0x3b17b397,0x3b84496f,0x3ab2f943,0x3a395e5b,0x3b08f879,0xb9497437,0xba72b9eb,0x39549ccb,0x3ae8eccd,0x39cf2216,0xbb57b4e6,0xbb092f17,0xbbbe0d12,0xbb2cdbdc,0xbc4ef1ad,0xba48d5b2,0xbbd3469d,0xbbebef56,0xbc405bce,0xbd06b759,0xbcfac7ef,0xbd105679,0xbd133853, +0xbcdc5252,0xbca1fafd,0xbc85df24,0xbcfb308c,0xbd0d6e40,0xbce4ab7f,0xbcb9e921,0xbc4e5165,0xbaf8dae4,0x3b07fad6,0x3a4d80c6,0x3bb0850c,0xba04bcc1,0xbb07b8ae,0x3ba05789,0x3b36c67b,0x3abf6138,0x3a4c2cbd,0x3aaf711d,0xb9d955f2,0xba846a2a,0xbb882ce6,0xbb9eaa69,0xbb82195f,0xbc08d608, +0xbc30ebf0,0xbc122943,0xbb46201e,0xbc87901b,0x3b153872,0xbc32cd13,0xbce4cb3a,0xbd6ee27c,0xbd5456e4,0xbd2141b0,0xbca047be,0xbc4b5290,0xbc1ca3a6,0xbbe6da76,0xbc4aa741,0xbc53ff06,0xbbe013d0,0xbc2428e1,0xbc4769c5,0xbc6e26f9,0xbc223c56,0xbbadc8f3,0x3a33840c,0x3ba8bc24,0x3a750726, +0x3953027a,0x3a5260a5,0x3ad77d68,0x3b18c89a,0xb98484f2,0xba70e782,0x3a30cba3,0xb9933267,0xbb2fe64d,0xbb605efc,0xbb61c02d,0xbc4ce4e6,0xbc933364,0xbcbf8c30,0xbc654df9,0xbd5abbbb,0xbd9f0c77,0xbd87e6f8,0xbd460904,0xbd244bd5,0xbd0b2830,0xbce3570b,0xbcaa322e,0xbc99a734,0xbcb5f926, +0xbc91a503,0xbc8cc246,0xbc7dad38,0xbc2dcec2,0xbbce85cf,0xbb95efc4,0x3b2f0ae8,0x3b1d7724,0xb90f0dd3,0xbaa59ac4,0xbb5cc3ee,0x3b74effa,0x3a840530,0xb9614c5a,0xba2f5885,0x3b0c2653,0x3aa4ce1f,0xbb2840d9,0xbbf647f3,0xbc0d32f5,0xbc0baa33,0xbc2404a5,0xbbe1fd8c,0x3b14fc8d,0xbc7600c7, +0x3d18f617,0x3c6fefcd,0xbb7bd3dd,0xbc4e1e83,0xbce1ab17,0xbd03357e,0xbd06c949,0xbd0be9f9,0xbc992137,0xbc318952,0xbc1d1ebc,0xbc0ba697,0xbc133a43,0xbc1bb587,0xbc2affa5,0xbc25458c,0xbc2df0d2,0xbc187943,0xbbd8ddd1,0xba45e044,0xbb0d1268,0xbb2e82dd,0xba25d049,0x39de29d5,0x3b469ea7, +0x3b6fce10,0x3ba6d342,0x3bf89e18,0x3c0a0470,0x3c6b4be2,0x3c8e3938,0x3c94de45,0x3c93d6ae,0x3c891908,0x3cb432f3,0x3c92a30b,0x3c646eac,0x3c3286b5,0x3b481764,0x390220d3,0xbbb35e88,0xbc4922dd,0xbca85f49,0xbcf86521,0xbcf1de72,0xbcf56ae0,0xbcf1bef0,0xbcd3d4a6,0xbcb52909,0xbc943b53, +0xbc914123,0xbc8c29fa,0xbc88db68,0xbc7542fd,0xbc74bdcf,0xbc45cfb2,0xbba991a5,0xbab57ed6,0x3ae5e70d,0x3b67b224,0x3bdb051b,0x3bfe445e,0x3c3c1b75,0x3c1d76a4,0x3c67425f,0x3c5aced4,0x3c8a5c69,0x3c8c9cde,0x3c95604a,0x3ca2cf67,0x3cbb95a7,0x3c8faaec,0x3c979f90,0x3b8fc231,0x3b310f09, +0x3745f4a4,0xbb13afda,0xbb9931d9,0xbbc80bdb,0xbc0507c5,0xbbd8b0f3,0xbbc0538a,0xbbb1132a,0xbba27b29,0xbba2c1fa,0xbba0efc8,0xbb8a06cc,0xbb58d60f,0xbb295545,0xbaf2481f,0xb9b812ad,0xbacc42c1,0x3b151cba,0xbb368c78,0xbb62f6ba,0xb907cd94,0x39bddffb,0xbb22d337,0xbabb20df,0x3931535d, +0x3b982fb2,0x3b7a5601,0x3bae6b6b,0x3c2230cb,0x3c0cc77f,0x3c35101c,0x3c161cfe,0x3bb16f34,0x3b802618,0xbb1d2fb0,0xba002238,0xbaebef96,0xbb1cb3f2,0xbb474ac6,0xbb7a8952,0xbba671d9,0xbb9800a3,0xbb9452af,0xbb8b07ca,0xbb88fdb5,0xbb830011,0xbb80546c,0xbb603968,0xbb48e4c6,0xbb29dfca, +0xbb20ab6b,0xbae46ed1,0xbb1abbf7,0x3a9ab77e,0x3bfe5d99,0x3ca17c12,0xba745f9f,0x3bfd0598,0x3cae3303,0x3cb19339,0x3cafcded,0x3ca94b5a,0x3caff4e9,0x3cb116bd,0x3cb1f9ec,0x3c334fdb,0x3aa8e288,0x3cb9e89e,0x3c411f3c,0xbb2481a1,0x3c564f91,0x3b63de69,0x3c84b8fb,0x3c322f42,0x3c44600e, +0x3c2fda90,0x3c567188,0x3c5fb768,0x3c584c8d,0x3c5fe804,0x3c58b021,0x3c4264c1,0x3c3fc2d6,0x3c3e5c9a,0x3c3f8554,0x3c513700,0x3c57de21,0x3c584209,0x3c59d3ed,0x3c4699e0,0x3c896330,0x3b7911c7,0xbbbda911,0xbc8830ba,0x3bdda89e,0xbbb42186,0xbc82ec00,0xbc83ef25,0xbc8133f9,0xbc5a510b, +0xbc7ec90c,0xbc80a7e1,0xbc6de448,0xbba837e5,0x3c0c4626,0xbc672b72,0xbbe66cdd,0xbbfe6e44,0x3c79913b,0x3c488e2b,0x3c2aaffe,0x3c061ada,0x3c5b9f7a,0x3c7d682e,0x3c6d8673,0x3c89d536,0x3c81a3af,0x3c43d01c,0x3c37ecb7,0x3c368b38,0x3c44ee9a,0x3c7ac615,0x3c87bbc1,0x3c886e86,0x3c80faea, +0x3c857a47,0x3c7f6d27,0xbba5306e,0x3c144630,0x3bcb9d9b,0x3b946e07,0x3b2aa6dd,0x3bd5c121,0x3c0404cc,0x3c0f0655,0x3bba6adc,0x3c19ea8e,0x3c23e030,0x3bcc08c5,0x3bca9c8b,0x3b147cc2,0x3befe648,0x3c5480bf,0x3b819b05,0x3c39d750,0x3c5e9e52,0x3c2f9f24,0x3be7cc24,0x3c860095,0x3c9d5591, +0x3c934431,0x3cb0ff0c,0x3c9c9924,0x3c4b6afa,0x3c222fa8,0x3c193778,0x3c2bb1b2,0x3c86e670,0x3c9b8b18,0x3c9eaf2a,0x3c916e05,0x3ca7b36b,0x3c5e9131,0x3be08d38,0x3c0a7feb,0x3bbda978,0x3bdc26b1,0x3ad4a013,0x3bb00c9c,0x3a46056a,0x3c14c927,0x3b9f7331,0x3bd54b39,0x3adaaaed,0x3bd00681, +0x3aee9920,0x3b618798,0x3c259e40,0x3c0d4552,0x3be76c32,0x3c7aaa06,0x3c57f5b0,0x3b992a50,0xbb08f360,0x3c322f3b,0x3c931ede,0x3c8b6567,0x3cc470db,0x3cb5cbd1,0x3c38bb01,0x3be9292a,0x3bbe09d5,0x3c1eef70,0x3ca5ebf6,0x3ccaf3ac,0x3ccf62c3,0x3cb779be,0x3cc1a2ac,0x3c96ddd6,0x3c047cc4, +0x3c830b27,0x3bb10f3c,0x3c18fbd8,0x3bf8925d,0x3b9faf6f,0x3af6da28,0x3b2808fc,0x3c3c3455,0x3ba119c3,0x3b9db021,0x3bca5a70,0x3a07c4c7,0x3b9d85c0,0x3caa6328,0x3c8a7ed8,0xbc59fcbe,0x3c1f0731,0x3caad212,0x3cecbd66,0x3d2accb6,0x3d040d17,0x3cd803b9,0x3cd46e1a,0x3cef0fb5,0x3cd1be3d, +0x3c6622ef,0x3cb51983,0x3c9e1e6b,0x3c0e205b,0x3c025e4c,0x3c0563be,0x3c82b61f,0x3c6e5601,0x3ca9faad,0x3c875692,0x3bc65234,0x3c7423a7,0x3c16f9b9,0x3c166494,0x3bde8ff6,0x3b3ca75f,0x3b855ae9,0x3b231765,0xbab1542c,0x3a87a995,0x3bce8dcc,0x3c369c63,0x3c4ca024,0x3b4a6e3c,0xbc20098b, +0xbc54419c,0x3b4f5598,0x3d073339,0x3c31504f,0xbbc44976,0xbc3a6a0a,0xbc5860fe,0xbbe03131,0x3c10cab3,0x3bcd8e85,0x3be03b41,0x3c3b674f,0x3bbd4b93,0x3b4990b1,0x3bc68e21,0x3c14f79b,0x3c5791e5,0x3c9a4900,0x3c6cab54,0x3c716d0d,0x3c033d4c,0x3a9c3f0c,0x3b830c2e,0x3bb9ab70,0x3be81ef0, +0x3bb198dd,0x3b6bc93d,0x3a7610b0,0x396bbf91,0x3b085f66,0x3b8a96ae,0x3ad824f5,0xb9019051,0xbb6f488d,0x37572fc9,0x3b530ee3,0x3b16c48a,0xbba0a426,0xba606bd3,0xbac5d3ff,0x3bc8a278,0x3cb7cd09,0x3d044fc5,0x3d18e658,0x3d20346d,0x3d084257,0x3ccc7b33,0x3ca275c3,0x3ca4a076,0x3cbb4762, +0x3cd232fb,0x3cb22e4c,0x3c71b7c0,0x3bbbc785,0x3c046a64,0x3c56bebc,0x3c5985fa,0x3bc8ed1a,0x3ba33049,0x3ba2adfd,0x3bc10f07,0x3b5aac79,0x3a91633c,0x3b69aa15,0x3b192c98,0x38124791,0xbb38e7a3,0xbb5a4374,0xbb1ce4a8,0xbc1c6cfa,0xbc0f3fc7,0xbc2e7287,0xbb5f2cd2,0xbc44c3c7,0x3b7111f2, +0x3c83aaf1,0x3c947250,0x3cec95f8,0x3c8628c8,0x3c0559cd,0x3b54a120,0xbb4d45a2,0xbb87213b,0x3a718d6a,0xbb16475d,0xbad1cc32,0x3b8cb8c1,0x3c1bb4f1,0x3c53d46a,0x3c5ab0ac,0x3c6c3c0d,0x3c4ce40b,0x3bafe4b7,0x3a51a6a8,0x3ba0d57a,0x3b914905,0x3b6d5a0d,0x3b6cc010,0x3b6fed6b,0x3a739b1d, +0xb81205ca,0x3b1a5b5a,0x3ae43808,0xb8921b65,0x3b47bb36,0xbb164b6c,0xbbc09c48,0xbc6b6c7b,0xbc7d674f,0xbd172867,0xbd1cc834,0xbc60f8fe,0xbbf37140,0x3bd9faa5,0x3c0c823a,0x3c420046,0x3c607b16,0x3c41c671,0x3c27f549,0x3bd8e5fd,0x3be485c4,0x3b9faeff,0x3ae66c43,0xbab5017d,0xbb006177, +0x390c09ff,0x3b2913cb,0x3bda985c,0x3bf1562c,0xb9727126,0x3b5b8f52,0x3b926ea7,0x3add78df,0x3af41d32,0x3b2281d1,0x3b48f72f,0x3b3c86e6,0xbb3949be,0xbbbf131c,0xbc11b0e9,0xbc150e4c,0xbc6ab4b3,0xbc57ff27,0xbc14f79a,0xbc6f7ecf,0x3bea1693,0x3c540af7,0x3c13c73e,0xbb000df9,0xbbf715f8, +0xbbc729f2,0xbace8025,0x3b955d5f,0x39c76eb8,0xbb380004,0xbbe47ef1,0xbb1d76e1,0xb91da11c,0x3a5a1546,0x3adbd51a,0x3b59b9b5,0x3b68f178,0x3b816c44,0x3b151f17,0xbb065eb2,0xbae061d2,0x397163d1,0x3a8eef91,0x3b8be601,0x3baf1f1e,0x3b87663b,0x3bcc884e,0x3c035636,0x3c3085c8,0x3c742645, +0x3c8d6f46,0x3c988a12,0x3c89f743,0x3c8ab7ef,0x3c85ae5b,0x3c895793,0x3c8749b4,0x3c958ae5,0x3c6e0231,0x3c14d903,0x3b83af0c,0xbac52232,0xbbfddf1c,0xbc5cdcac,0xbc5a1c5c,0xbc520826,0xbc5e8229,0xbc5e838b,0xbc648f5e,0xbc6bde9e,0xbc5ae143,0xbc52192b,0xbc413cf3,0xbc1c879c,0xbba6b2cf, +0xbb9d2ec5,0xbbc2db55,0xbacea92a,0x3af6d7c6,0x3b989a82,0x3bc05ab7,0x3c2209a9,0x3c17ef01,0x3c53da70,0x3c349a46,0x3c6842e3,0x3c65df83,0x3c8d6c7d,0x3c91a3df,0x3c9949a1,0x3c9a4bd4,0x3c9a8a9b,0x3ae65e2a,0x3bf82bdb,0x3bea5403,0x3bdaf264,0x3bdf48c8,0x3be2e8c8,0x3bf5ca01,0x3bedc125, +0x3bb4e31b,0x3b4cad36,0x3a9e02b0,0xba7ec72e,0xbb481de8,0xbbb99614,0xbb73ba47,0xbb0fcc5b,0xba47a3ad,0x39b62ae5,0x3a945605,0x3b5e657e,0xba4c1375,0x3b2e4023,0x3b12e0f8,0x3a9a8a9f,0x3a0fe3fb,0x3b12884f,0x3b8f511e,0x3bb2bd48,0x3ba42c66,0x3c10192e,0x3c23b5e6,0x3c27a2f1,0x3c1eabcb, +0x3beff101,0x3be9508a,0x3c0a1f35,0x3b4d4374,0x3bd66834,0x3ba91ec0,0x3bb15a36,0x3baa309c,0x3ba1c978,0x3b97b694,0x3b9cf39d,0x3b80916d,0x3b5e3159,0x3b33780c,0x3b05b600,0x3abb1e33,0x39758c3f,0x3a99a916,0x3ace8b46,0x3b09c326,0x3b360cbc,0x3b403168,0x3b9995c1,0x3afa8a64,0xbb188796, +0xbbd03358,0x3b4a76be,0xbb154d79,0xbbf75b82,0xbbdf5011,0xbbbdb497,0xbb89babd,0xbb893c22,0xbb5a8841,0xbb02dfa8,0x3862d0c8,0x3ba1128a,0xbb43cf18,0xba824df1,0x3b98c5f2,0xbb14149b,0x3c14ccfb,0xbbd41cc5,0xbabf9726,0xbb0063f7,0xbabbd455,0xbadb6dc5,0xbb0c0af0,0xbb5c5090,0xbb363cea, +0xbb4a55ac,0xbb87d6b0,0xbb7b6b1e,0xbb761287,0xbb71935f,0xbb51f7ac,0xbb3fc224,0xbb38e162,0xbb2386d2,0xbaaefea9,0xbba2ae3e,0x3c202148,0x3c88bb7d,0x3c9dd30e,0x3bb705af,0x3c7c5754,0x3c978c34,0x3c9fbcff,0x3ca0d8ef,0x3c940d1d,0x3ca29793,0x3ca4259e,0x3ca0b73d,0x3c7486cb,0x3b76d18d, +0x3ca5bc06,0x3c9120c8,0x3c9f3f6f,0xbaece7ca,0xbb0d04cb,0xba73251b,0xba2b5eb0,0xb9e43898,0xba8aad87,0xbb8d18f0,0xbb44383b,0xbb8b31c0,0xbbf4a627,0xbbf01927,0xbbf89f88,0xbbeb18a6,0xbbb8fc5e,0xbb8c4be3,0xbb7ba6c4,0xbae24507,0xbb075ffa,0x3aea03b4,0x3c9231d7,0x3b966073,0x3bc76923, +0x3ba9742b,0x3bcf1562,0x3b42dd28,0x3b0fbcc6,0x3b62b82f,0x3c0152a1,0x3b2e5495,0x38ad482c,0x3b85317d,0x3ac6f501,0x3be74eee,0x3c4150e5,0x3b256e62,0x3c303ce3,0xb99c4f2b,0xbb6211dc,0x3abf2f6c,0x3a69cb1e,0x3afa6492,0xb9ada6ec,0xbbea940e,0xbb846e63,0xbbd05696,0xbc3e68b2,0xbc359625, +0xbc3541f6,0xbc20e16a,0xbbff7de3,0xbbb291de,0xbba94de6,0xbae21b3e,0xbb3ec483,0x3bf36a7a,0x3c53d4bb,0x3c12f5bc,0x3bb6f060,0x3b84fda1,0x3bee951d,0x3aa98b93,0x3bd9be06,0xb75bbf87,0x3c1af8ae,0x3b008183,0x3bde2ce9,0x3baf0ebb,0x3b6dc3d0,0x3b93b282,0x3c73d655,0x3be6c67c,0x3c7b26cc, +0x3b103492,0xba3fa2a7,0x3acef017,0x39db8a56,0x3b7441cd,0x3b6d8404,0xbbece0aa,0xbb59f0f5,0xbbef46d1,0xbc8d16bb,0xbc8f4519,0xbc9b5292,0xbc88704c,0xbc4049ef,0xbbfab266,0xbbbf53eb,0xba1c09bf,0xb9c572cb,0x3c2596ad,0x3c8e5c1f,0x3bcfc418,0x3c1792a5,0x3b841696,0x3b52c6b5,0x3a51023c, +0xb80617f7,0x3b6eae09,0x3bf71ee0,0x3ba30e81,0x3b053d7e,0x3b827cfe,0xbb1e2ccc,0x3b959bfd,0x3c98f727,0x3c3a7c0c,0x3ba37faa,0xbb9e3ccb,0xbc258d19,0x3b473400,0x3c8cb397,0x3ad29f0f,0xbbe572b7,0xbc3fd253,0xbc0435a3,0xbc2a8b15,0xbcb78278,0xbc12369a,0xbbb395f0,0xbc07f7f3,0xbbbdde15, +0xbbb441b8,0xbc38b5e9,0xbc053a5f,0xbc0f198c,0x3bf9bd12,0x3c8251ab,0x3b8ab437,0x3bf89ed5,0x3be3dc00,0x3c021db6,0x3b6cc2f7,0x3b4a686b,0x3ac1115e,0xbb1b2e97,0x3a95ff08,0x3bea59f3,0x3c585087,0x3c4133f9,0x3bda70a4,0xbbcdcf6a,0xbb0de217,0x3c1a68c8,0x3c415cfa,0xbc737a6d,0xbc85d7b2, +0xbc523344,0xbc1064e3,0xb9793c78,0x3c536dc8,0x3b93f9f7,0x3adddbd9,0x3b94e6c6,0x3bee7be2,0x3bc3987e,0x3b4c08cd,0xbb389f9b,0xbbcd3c4f,0xbc1ca423,0xbaa6837a,0xbb0fb817,0x3bc3c85b,0x3c11f6d3,0x3bd722db,0x3bfbad96,0x3b1db394,0x39e05974,0x3b23127d,0x3a22f437,0x3a09c905,0x3b2b7093, +0x3b37aa6b,0x3a8646e8,0xbb43287d,0xbb7c04d7,0xbb9e4255,0x3b95958f,0xbb80a48b,0xb8fc8eb2,0xbb6545e4,0xbbc93d84,0xbb9c49c9,0xbc03d188,0xbba872cc,0xbc002586,0xbbc64989,0xbc4f47df,0xbc5c2ba6,0xbc2b744b,0xbca8c1f5,0xbca960bd,0xbc6628e8,0xbc378053,0xbb993923,0x3a362b1d,0x3bb4cbde, +0x3a2e3859,0x3b81385b,0x3b8cb29d,0x39c335db,0x3bc58eca,0x3bba0e40,0x3b420f89,0x3a6a6535,0x3b1dfbcc,0x3a2c6535,0xba5b89eb,0xbb56b28c,0xbb4a934b,0xb99763a5,0xbbcb239b,0xbc062284,0xbb331584,0xbb41b98a,0xbb963f04,0x3b544f46,0xb51328ad,0xbae5fbbd,0xbc7c0e5f,0xbc6be83e,0xbc6364d7, +0xbc6598a3,0xbba3720b,0xb9bedb87,0x3ba6fe15,0x3aa565f7,0xb64f1d6a,0x3b0bfea8,0x3b05258f,0x380ed78e,0xbb6279ab,0xb99716be,0xb9b5093f,0x3ae952a5,0x3c1282e4,0x3bc4b778,0x3b8e121c,0x3b8fe61b,0x3b68ceae,0x3b4fb6f0,0x3916b4f2,0x3a082b57,0x3b2483a3,0x3af664db,0xb99e6d07,0x3a67f126, +0xbb2be584,0xbc131435,0xbc22cc13,0xbc510c5e,0xbc7f7325,0xbcf9648c,0xbd02b389,0xbcd268a4,0xbcc5cbd9,0xbca8c644,0xbc9aaba1,0xbc7f8208,0xbbdf9733,0xbb752adf,0xbbd76e77,0xbab44e6b,0xbad01ccb,0xbb9ddb32,0xbb3d7a10,0xba8b721a,0xba0d2ba4,0x3b88b86c,0x3b7bb07d,0x3b31647b,0x3ba7afb3, +0x3a661f9b,0x3b65740e,0x3adef103,0x3ab52c08,0x3b0a262d,0x3b4445cd,0x386f6249,0xbb2b45e3,0xbc011de6,0xbc099215,0xbbe3d29f,0xbc600cb6,0xbc5329c9,0xbbbc42d6,0xbc6bd57d,0x3ca2f9ad,0x3b23f194,0xbc831b3c,0xbc91df4c,0xbcb0e682,0xbca231e8,0xbc8d5e35,0xbc646236,0xbc1ed67e,0xbc093db5, +0xbc25c861,0xbc0705f0,0xbbdf8960,0xbbcadcc0,0xbba0c4c9,0xbb8e6370,0xbb5c9503,0xbb5c7236,0xbb435410,0xba1d9330,0xba26680a,0x3a3e9fa3,0x3bce6d1d,0x3b8f6da3,0x3b82fb93,0x3b6512c4,0x3b876dc7,0x3bd6457d,0x3bad2487,0x3c161a70,0x3c3c3bc1,0x3c4eebf9,0x3c520a27,0x3c364c15,0x3c3756d9, +0x3c0f1526,0x3c854bce,0x3c19fcfe,0xba1ee1ea,0xbb766b7a,0xbc40a7a2,0xbc82bac4,0xbcb1a6a3,0xbce54f56,0xbcc6d7f1,0xbcafaeb5,0xbc98ac96,0xbc9550d6,0xbc9143f8,0xbc8b09c6,0xbc855c64,0xbc7d125b,0xbc7373cd,0xbc489113,0xbc3905aa,0xbbe1a0bc,0xbb08555d,0xba1d6646,0x3a5828c1,0x3b3b44d6, +0x3be4cb3c,0x3c04aa0e,0x3c3d331e,0x3c1290b3,0x3c6a16e0,0x3c43efb7,0x3c7f8139,0x3c7a7a09,0x3c8c2d14,0x3ca6eb06,0x3cc6a747,0x3c916ec3,0x3c3ae352,0x3a2cbda5,0xbada8d2f,0xbb5153e9,0xbba98928,0xbbe528bb,0xbc0c93d8,0xbc302702,0xbc2cd8b0,0xbc38ac0b,0xbc3a6773,0xbc37575e,0xbc2c052a, +0xbc1fd95f,0xbc0848d9,0xbbe447ad,0xbbc3297e,0xbb9a25a6,0xbb7bc69a,0xbb517a18,0x3b622792,0xbae06dbd,0xba379603,0x39fc285d,0x3ab51ca2,0xba44cc04,0xba691b58,0x3a87acc7,0x3b956503,0x3b1db928,0x3b025f2f,0x3bb5a7a7,0x3b7e96e3,0x3bb1eaed,0x3b9cbbea,0x3a3aef2e,0x3b147ae3,0xbbd55924, +0xbb9ff743,0xbbc607fa,0xbbdb6371,0xbbf68a47,0xbc08822b,0xbc19d78e,0xbc162e55,0xbc143ca3,0xbc131b1a,0xbc124838,0xbc13c8c2,0xbc182a56,0xbc0eb400,0xbc06c27a,0xbbfa0b31,0xbbecef79,0xbbd00432,0xbbfc63ab,0x39d874a8,0x3bc3914b,0x3c2ba52a,0xba797b08,0x3bdd285d,0x3c389004,0x3c4361af, +0x3c407435,0x3c2e9c49,0x3c463a9c,0x3c4a5198,0x3c496e28,0x3bfcfdbf,0x37379127,0x3c3c148e,0x3c0730fa,0xbc00cb68,0x3ba55701,0xbbbca01f,0x3c01a19d,0x3b968f71,0x3b998cb0,0x3b84b741,0x3b85fb2f,0x3b85a443,0x3b88ff66,0x3b919f30,0x3b8dcd86,0x3b739db3,0x3b6f053e,0x3b699335,0x3b6237d8, +0x3b919141,0x3b9f492e,0x3ba295c6,0x3ba68307,0x3ba2baf1,0x3c07d07c,0xbbb0accc,0xbc106c20,0xbb955a10,0xbb78e031,0xbc1a6418,0xbbad9f37,0xbbc6eb74,0xbbc807b2,0xbb92249b,0xbbe47c41,0xbbef8efd,0xbbe19061,0xbc1803a3,0xbb360bbe,0xbb6ddca8,0xbc22d834,0xbbda7c7b,0x3b99aa5f,0x3bcf8317, +0x3b662e74,0x3b23130a,0x3ad80e95,0x3ae9f34b,0x3b2523e2,0x3b7b2756,0x3b757e05,0x3ad534e0,0x3ad78194,0x3ae4362c,0x3af992e9,0x3b926b8d,0x3bab6c33,0x3bb2885e,0x3ba83f74,0x3bf65e0c,0x3bc06471,0xbb75a0cd,0x3b5eda0c,0xb9f538a4,0x39cbe5dc,0xba687f78,0xb8e2fbb9,0x3b131b00,0x3a9506c1, +0xbac6a6aa,0x3b0d1925,0x3b7d51cb,0x3a742de5,0x39fc71db,0xbaa34ee6,0x3aa1ef0f,0x3b9d1485,0xbb118f1f,0x3b89c7de,0x3c121841,0x3b9a2150,0x3b5c063a,0x3a1f03b9,0xba39c101,0x3abe0169,0x3b402e99,0x3b1db3e0,0xba07f651,0xbac76d63,0xbb010e90,0xbb299ea2,0x3b387a66,0x3ba7af08,0x3bbb9258, +0x3bc5a67c,0x3c2340bf,0x3be93e60,0x3aa5113e,0x3b5ee61c,0x3b1b57f6,0x3afd6d16,0xbab0c3f8,0x3aa4ab8f,0x38df8172,0x3bd5d10f,0x3a2a6eaf,0x3bb488fd,0x39b45ac1,0x3b2a5d9d,0xba5380e5,0xb9719e54,0x3b958d52,0x3b0132ce,0x3b305fbe,0x3bf08ac0,0x3c2647d4,0x3adfd862,0xba9dc476,0xbbd8615b, +0xbbd6de41,0xbb410723,0x394e077e,0x3a5fd49c,0xbb8e0096,0xbbd03b0b,0xbc027d2e,0xbbe49ea0,0x3a857427,0x3b8d0884,0x3bb43c71,0x3bc99194,0x3c4f36c2,0x3c4dd74b,0x3bd7ab41,0x3c4aff3d,0x3b6e227d,0x3bc73683,0x3bc6d328,0x3b813b99,0x3b179f2a,0x3b7ae0c1,0x3c356d2e,0x3baf3a2a,0x3ba4dc27, +0x3b9d9694,0xb9a748bd,0x3b15c5a3,0x3c837131,0x3c2d62bc,0xbc916aa2,0xbad563d4,0x3c3800f0,0x3c88aeaf,0x3cec9b65,0x3c4539e5,0x3b3f167f,0x3aa94622,0x3c148d22,0x3c2a4f13,0x3b15ee0e,0x3c9b8af3,0x3ca50e35,0x3c25343e,0x3bd9b8ee,0x3bb25bcc,0x3c57eda3,0x3be792aa,0x3c01b5db,0x3b475d9d, +0xbaa1bcb3,0x3bf67cab,0x3bb81c01,0x3be871c2,0x3bcdacec,0x3b6599d2,0x3b60a5a2,0x3ad0b926,0xbaf686e6,0x3abc3821,0x3c015767,0x3c332441,0x3c1b0274,0xbac9adb1,0xbc7f21e5,0xbc98c902,0x39c2f544,0x3c3924a0,0x3aed5063,0xbc37ff42,0xbc680801,0xbc83307c,0xbc3b2223,0xbaca3b74,0x3a882a21, +0x3b47467c,0x3b104838,0x3b9f6317,0x3b614f74,0xb992eec8,0x3aa24fe9,0x3a8415ac,0xb9defde7,0x3abdb884,0x3bc64f25,0x3b3260aa,0x3b55b0cd,0x3bac41fd,0x3b8ec22a,0x3bbe4ea3,0x3b6a03c5,0x3b4dfcee,0x3ad11a2e,0x3acedf08,0x3b6c7d80,0x3b7f5a62,0x3a36ae62,0xbafd770d,0xbba7f82e,0xba2d36fd, +0x3b0aeccc,0x3b7a21c8,0xbb808f59,0xbb42ba38,0xbbb833b1,0xbbd3ddba,0xbc33cbc2,0xbbe9584b,0xbb22d8dd,0x3bed3887,0x3c7efa2e,0x3c7e2ab5,0x3c183d46,0x3b9e863e,0x3b25ad9f,0x3b0914e1,0x3bb217ba,0x3bd53ec1,0x3b929fbf,0x3c0ad58e,0x3c409c69,0x3b518715,0x39046547,0x3b1fd7ff,0x3ae19f2d, +0x3b845d31,0x3b10183d,0x3a86cf8a,0x3b465ba7,0x3b0d5f4d,0x36f47941,0xbb25bbc0,0xbb279838,0xb9f869c2,0xbc1cb1f2,0xbbd8efc4,0xbbe1b902,0xbb5ebe90,0xbbbd7a2c,0xbbc35386,0xbb946b08,0xbc16c962,0xbc44e905,0xbc22779a,0xbc248ff9,0xbbf1a290,0xbc4e6a34,0xbc54c713,0xbc1d68d4,0xbbbb89f1, +0xbb6b02c7,0xbb05b4f6,0x3b57e315,0x3b958363,0x3b99f54f,0x3bd9fffd,0x3c092ee7,0x3b5521e8,0x3b28dd00,0x3bbc49d9,0x3bb0aa76,0x3b9ad5a1,0x3b67fa8f,0x3b4a5ed9,0x3ac7d54f,0x39b06c16,0x3b344a65,0x3b339bb9,0x3ac3a41b,0x3bb2ed94,0xbb46d46d,0xbbcd9a28,0xbc00377a,0xbbcc85ee,0xbd06d440, +0xbd14eb7c,0xbcc14752,0xbcc0ab4d,0xbcaf22aa,0xbcb24e50,0xbc947c7e,0xbc3ebcfa,0xbb859dd4,0xbb0ee4e0,0xbc2f5f20,0xbbd8a73a,0xbbbf0228,0xbbe5d06b,0xbb856396,0xbac56831,0x3b42d1f5,0x3b782243,0x3bae89d4,0x3b427776,0xb9e91277,0x3b2156b7,0x3b81f13b,0x3b0be3ae,0x3b218a96,0x3b4139d5, +0x3ae559b5,0x38d8b749,0xbbb8680b,0xbc0177dc,0xbc2e9859,0xbc3320ce,0xbc88ac70,0xbc91548f,0xbc7c4d13,0xbccb455d,0xbc090237,0xbc7b7214,0xbc937e31,0xbc952600,0xbc37d266,0xbba3bd3b,0x3a8cb689,0x3bb1fb43,0xb9c0e639,0xbb6ac4c4,0xbb9df6ce,0xbb85e327,0xbba48196,0xbbdec3ea,0xbb9fa485, +0xbb2e7da1,0x3b4a85ef,0x3b6f82ae,0x3b617ff7,0xb9a5bf2a,0xbaa44d4c,0x38f5d6ea,0x3a7d4902,0x3b1f6ae8,0x3b85e038,0x3b918543,0x3bac8c6e,0x3bb9705d,0x3bc39c81,0x3bd02157,0x3bf069cd,0x3c059017,0x3c0e3039,0x3bb5b909,0x3a028ca7,0xbb74d228,0x3bb01509,0x3bb373ef,0x3b025155,0xbb91bdab, +0xbc30abc6,0xbc745a34,0xbc996964,0xbcb29dec,0xbc985838,0xbc801416,0xbc5c677e,0xbc57c6d1,0xbc4c5d79,0xbc4cf228,0xbc345b78,0xbc27d072,0xbc129fc3,0xbbf77c88,0xbb692751,0xbb8237f1,0xbbc78fea,0xbb12af41,0x3992dd18,0x3b29bb95,0x3b8e31f7,0x3bee37fd,0x3bff4aa3,0x3c25951d,0x3c110778, +0x3c35ef00,0x3c28ac87,0x3c3f6432,0x3c3233e9,0x3c3679f2,0x3c357d20,0x3c0c75bf,0xbac8987a,0xba4703ce,0xbaaab426,0xbb2bf861,0xbb4b7599,0xbb721662,0xbb8fdd1b,0xbbcff768,0xbbccb3bd,0xbbe51f3b,0xbbeba0cb,0xbbf5c286,0xbc01b938,0xbc10fb1d,0xbbf10706,0xbbc4a003,0xbb984302,0xbb7340d5, +0xbb2c90af,0xbac25ceb,0xbb66e6ee,0xbad98d5d,0xbb4dc501,0xbb242f66,0xbb659dcd,0xbb4d8221,0xbaca4d92,0xbb01841c,0xbb0e0b68,0x3a107047,0x3b0fe489,0x3b1646f2,0x3aed68e4,0x39be6e40,0xb9aa6c8c,0x39e4b123,0xbbf85a66,0xbafb9bf4,0xbb49de82,0xbb682092,0xbb82738f,0xbb9d47ca,0xbbaf645a, +0xbbbdee67,0xbbb9b01c,0xbbba7969,0xbbbe5f53,0xbbc22ef5,0xbbc42d31,0xbbceee8d,0xbbbac60d,0xbbb0b506,0xbba303e2,0xbb93e96f,0xbb8b5825,0xbb33ce80,0xbc01b6ab,0xbc246061,0xbbe0ecb5,0xbbece71e,0xbc24b687,0xbbea7061,0xbbec5406,0xbbdba8a0,0xbbbd4d4d,0xbbd40349,0xbbcc764a,0xbbb4bebc, +0xbc0953f8,0xbbc74dff,0xbb9cbd93,0xbc10ac12,0xbbad09b5,0x3bd2e321,0x3c66c12f,0x3b8a9ab9,0x3bc24521,0x3bd0c222,0x3bc451f7,0x3bf0ad0e,0x3bf2ecd0,0x3bd2cd91,0x3bdaa26e,0x3bcd2da6,0x3baaca3d,0x3bb1cbf7,0x3bb351a9,0x3bb8462f,0x3bc43d78,0x3bca2858,0x3bc8c836,0x3bd0a0ab,0x3bcc51df, +0x3baa3d30,0x3c698b10,0x3c597111,0x3b33a721,0x3c510b0d,0x3c553df6,0x3b557963,0x3b9a707e,0x3ba61f72,0x3b8d6562,0x3bc76f0c,0x3bd03335,0x3bcad7dc,0x3c557d42,0x3c484d00,0x3b8aaaf0,0x3c624109,0x3c4b7d79,0x3c0aa507,0x3bb98361,0x3bf179a6,0x3bd11f8b,0x3c27e9f0,0x3c3786ca,0x3c0ff969, +0x3c198836,0x3c01ef44,0x3ba1ce74,0x3b99d9bb,0x3b943b10,0x3ba904e1,0x3bd6ef3c,0x3bfa356b,0x3bfe1883,0x3c1272ef,0x3bf45a05,0x3c322b44,0x3c377f56,0x3c0a59ac,0x3c2faac5,0x3be7ca1b,0x3becc87c,0x3c033ec5,0x3c02f141,0x3c2c151b,0x3c3b8c29,0x3c1e01d2,0x3bdda720,0x3be2b7b8,0x3bd09f96, +0x3bfc5eaa,0x3c45e97b,0x3c18dbc3,0x3c62ea05,0x3bfee520,0x3bb20659,0x3c207ea3,0x3bdc526b,0x3c6ca9d4,0x3c82ae21,0x3c2c0792,0x3c48b923,0x3c1a6d1e,0x3b91ef23,0x3b960335,0x3b8a39cd,0x3bb46259,0x3bf203b0,0x3c1689d3,0x3c105755,0x3c248bc3,0x3c0901ca,0x3c4c8aeb,0x3c60446c,0x3c27ba8f, +0x3c042557,0x3bd2a6ce,0x3be56503,0x3b8a4567,0x3be98a67,0x3b9f1290,0x3c195622,0x3ba3ac3e,0x3bf9dc0b,0x3bc5c3f7,0x3b9c9456,0x3bbccb66,0x3c4bdba2,0x3c293982,0x3c7eb585,0x3c05fd36,0x3b970639,0x3bf519eb,0x3b7fdb41,0x3c86e6a8,0x3cb2f258,0x3c749fdb,0x3c883a9c,0x3c51f98e,0x3b4858cb, +0x3adfd971,0x3a685289,0x3b7388d6,0x3c12d4e4,0x3c4566bc,0x3c4b77ca,0x3c6a560f,0x3c3d1de1,0x3c8869d7,0x3c7eea37,0x3c093de7,0x3c0ce6e2,0x3bb26173,0x3b88d7bb,0x3a5d4202,0x3afe8fe5,0x3b8bb7eb,0x3be56d3a,0x3bca73a6,0x3b5a3d75,0x3b1ee68e,0xba45b28b,0x3bb80d53,0x3c6d7778,0x3c66649b, +0x3c246df7,0x3c3eb298,0x3c40c3b4,0x3cab89d3,0x3cf4c965,0x3c9ecd60,0x3c65b531,0x3c512598,0x3c04b003,0x3b6a77e6,0xbb9e9dcc,0x3c0b419d,0x3c144d46,0xbb03d43c,0x3abc3ffe,0x3b0b5dcd,0xb9f1f256,0x3b4db2f7,0x3b766ef1,0x3c425ec3,0x3c3e5511,0x3bb21d8d,0x3c052221,0x3bffed0e,0x3c0f3c83, +0x3b92a67d,0x3b49103d,0x3abb57a0,0xbb0b81bb,0x3b816f17,0x3c299086,0x3c61ec15,0x3c2a4843,0x3b94c3cd,0xbbf2a35b,0x3ade2d3b,0x3c780584,0x3ae22480,0xbc81c0f3,0xbc4453f7,0xbc4440f3,0xba7201e0,0x3b94885b,0x3b494cc0,0x3bcf8c0d,0x3ba1540e,0xba9aef31,0x3c06d024,0x3c1e6e66,0x3be2af3c, +0x3bcf3736,0x3c0aecef,0x3c41de31,0x3c74e499,0x3c2d3f2c,0x3c0853a2,0x3c105d46,0x3c034174,0x3c13ed80,0x3baddc62,0x3b34fcd0,0x3b525e37,0x3ab4cd5f,0x3b00b507,0x3b9aff45,0x3b790190,0x3a89ffd8,0xbb519194,0xbae6f031,0x3b194eb4,0x3bdaa296,0x3c287058,0xba4e5920,0xba4f28a6,0xbae0607c, +0x3b97854e,0x3c98df71,0x3cd070c0,0x3cee33b6,0x3cf85265,0x3c8d6753,0x3c078bdb,0x3b9e9ac5,0x3bea737b,0x3c11af9d,0x3c1a70c7,0x3c270fcf,0x3c0c556c,0x3b5a2d36,0x3c09d888,0x3bbcf115,0x3bbe8bc9,0x3bdacf10,0x3b49f9e1,0x3bb15779,0x3be1f1dc,0x3b60de49,0x3ad6b55f,0x3b31c77f,0x3ad6f2f2, +0x39d7cc41,0xbadc3aef,0xba549706,0x3b255b5d,0xbbae8f66,0xbba20e3e,0x3ab2bf0d,0xbb0d865d,0xba134d07,0xbae2ee23,0x3c4eb43b,0x3cc88bff,0x3ceeaf7a,0x3cd2111b,0x3c7a30f8,0xbba6c4b9,0x3a113b3b,0x3b2b92d6,0x3ba7d083,0x3c14c787,0x3c1520a5,0x3ba3f05c,0x3c3758ce,0x3c4e0828,0x3c28556c, +0x3c30522e,0x3be27ed4,0x3ba2c916,0x3c09db11,0x3c009165,0x3bdbe9db,0x3bca9ac7,0x3b965f42,0x3b809398,0x3a7b6b8a,0x3ae5f3a5,0x3b57b2ec,0x3b3c7d63,0x3a97b4a6,0x3b6e6248,0xbb224379,0xbb8fc7a6,0xbb91396b,0xbb50cb88,0xbc652a80,0xb76df92d,0x3c5e3a2b,0x3c4d460d,0x3b98d990,0x3bb4a2db, +0x3b94812d,0x3b39665a,0x3c2842a9,0x3c500400,0x3c4a8f22,0x3c28c8e9,0x3c06b67c,0x3be514e4,0x3b4d4715,0x3afe7f34,0x3b54d2fa,0x3bca9033,0x3bc5f395,0x3b97a086,0x3bf6556e,0x3bae3d55,0x3b918a2c,0x3b472697,0x3b3c62ea,0x3b86be74,0x3b01dab1,0xbaaee3d9,0xbb47830b,0xbbc3f7c2,0xbbd2f018, +0xbbbeddd8,0xbc339102,0xbc4d8ab5,0xbc54bc7b,0xbc24d9c5,0xbbbe4c28,0xbbdc347f,0xbc5700eb,0xbc283f7a,0xbb9b87bd,0xb6a881a8,0x3b67d80a,0x3c11b01a,0xbb453636,0xbc07679f,0xbbecb6b2,0xbb8cc812,0xba8a0321,0x3a682b21,0x3b5a41b8,0x3b8f6426,0x3b9e1914,0x3b9b7728,0x3b45353d,0x37e55cd3, +0xb95a0dff,0x3ab4778f,0x3be31a3b,0x3bb063d4,0x3b96aa71,0x3baf2932,0x3bc3741f,0x3bc29c32,0x3aed3149,0x3b3321e5,0x3b7a40d2,0x3b91d074,0x3be36840,0x3bccb628,0x3a6815e7,0xba046ee3,0x3c2bd73a,0x3b85e75b,0xbb08afed,0xbb935993,0xbc2686d8,0xbc314342,0xbc4a6720,0xbc529db1,0xbc1cda6b, +0xbbd64d3f,0xbba3a01c,0xbbf1c798,0xbc19b49b,0xbc3cfb8a,0xbc278467,0xbc16702a,0xbc064b4b,0xbbb1775c,0xbb656b91,0x3a0fd032,0x3b0ab182,0x3ac24b8d,0x3ad45bbf,0x3b2eae0f,0x3ba14ad6,0x3bbabe6e,0x3c037016,0x3c05bd06,0x3c4ed4ab,0x3c240e8f,0x3c389058,0x3c2ed0ce,0x3c329c5b,0x3c52208c, +0x3c6a4553,0x3c2b6dfc,0x3b02200a,0x3a94ccc1,0xba616b0f,0xba97b881,0xbb11bbfc,0xbb482146,0xbb8c1300,0xbbc6ae03,0xbbfe54b9,0xbc233da7,0xbc36d1fc,0xbc443c6f,0xbc482a48,0xbc4d3ed6,0xbc3774bf,0xbc26c55c,0xbc196437,0xbc09c70d,0xbc0aa4a9,0xbbdee82f,0xbacead84,0xbb1803a6,0x39cd2494, +0x3988f915,0x3b0d1203,0x3b4704ae,0x3b2aa024,0x3b7d08a4,0x3b9d49fc,0x3b70317c,0x3b3512ce,0x3b753aac,0x3b3a47b2,0x3b11d5c1,0x3b2fd4d2,0x3a497dbd,0x3ad2c1ea,0xbb6c2374,0xbb6a9418,0xbb851312,0xbb961d7b,0xbbab2927,0xbbbb719a,0xbbc4f3db,0xbbd35e7f,0xbbdbe121,0xbbea002d,0xbbf695d7, +0xbc031b70,0xbc0f3241,0xbc058ea5,0xbbfe6d9b,0xbbf01f0c,0xbbdfdb76,0xbbca93f7,0xbbe82dce,0xb9dd100a,0x3a4d74ca,0xbb44b5ca,0x3a13e3f8,0x3b216532,0xbb1a44e6,0xbaf2b4c4,0xbadee3f7,0xbb0da0f7,0xba75b3be,0xba230ec9,0xb9bcfcd1,0x3b2d8bb9,0x3ac6f5eb,0xbb25ee63,0x3b09fcce,0xbbbe038b, +0xbb598b6c,0xbbd3933f,0xbb5f8c3a,0xbb0ce64a,0xbb4112cd,0xbb3aba1c,0xbb8cb540,0xbb9d4faf,0xbb9cf5cc,0xbb97e0b0,0xbb95aeb7,0xbb9708e5,0xbb94030f,0xbb9343ce,0xbb95b8dc,0xbb84d794,0xbb788133,0xbb75556c,0xbb691067,0xbb27634f,0xbb44acc8,0xbbc20a6f,0xbaa57967,0x3c49d05c,0xbbefb341, +0xbb2ce513,0x3c2b593c,0x3c253939,0x3c2225c3,0x3c1efe97,0x3c0f8db4,0x3c0a7a3d,0x3c00c5e3,0xbb3abd13,0xbc002eba,0x3c3f90ed,0xbad1840f,0x3b54b91e,0xbba71876,0xba9a17e0,0xbb43865b,0xbb4b2b26,0xbbee4617,0xbc0e8f82,0xbc0501b3,0xbbfbd12c,0xbbedbacc,0xbbfd7d48,0xbbf1d47a,0xbbec47c0, +0xbbf14f12,0xbbcbf45e,0xbbc305e0,0xbbc3c821,0xbba5df99,0xbb35b8cd,0xbb5e457f,0x3b9a3f61,0xb9c631a9,0xbb1856f8,0xba4dcc09,0xba3fbe46,0xbb6ac241,0xbad4edeb,0xbb3ff605,0xbb3b1d5e,0xbb2d28dc,0xbafa5cb1,0xbb004747,0xbb4681fa,0xba5675af,0xb88347b0,0xbb1dbb27,0xbb31f833,0xbb551827, +0x3a081e50,0xba9c5775,0xbac46936,0xbc1b7394,0xbc5bfc0d,0xbc4e6814,0xbc47ad50,0xbc3d886b,0xbc3be796,0xbc384455,0xbc38d2db,0xbc471bd9,0xbc1bc5e0,0xbc03d57a,0xbc043486,0xbbae2a22,0xbb47b451,0x3a72319a,0x3a89e2e4,0x3abd0ec6,0x3ae04202,0xba5b5481,0xb9b36017,0xbaf13d18,0x3b21e504, +0x3b2ee090,0x3a78454c,0x3b63b44b,0x3ae57a96,0x3902b6f6,0xba613a38,0xba8250a5,0x3b4694ec,0xbadce9e4,0x3b14e47c,0xbab9d60b,0x3b466c55,0xba293b35,0xbaf4789b,0xbc6dbc98,0xbca06e26,0xbc926e80,0xbc8aefd4,0xbc73288d,0xbc7f67b3,0xbc871dcf,0xbc914887,0xbc98181c,0xbc75db82,0xbc600cff, +0xbc585c3e,0xbc0844ae,0xbac3846a,0x3b922704,0x3c061fcd,0x3bd71a36,0x3bac2c88,0x3b2d58a0,0x3b4eb472,0x3a6db9f8,0x3b0cd8b7,0x3ba92621,0x3c073412,0x3bb9359d,0x3b7c0235,0x3b17ad4f,0xba95e428,0x3a1c88bc,0x3c27442b,0x3b853b7d,0xbc20c551,0xbc0a09a5,0xbb1210f6,0x3ac87c41,0x3c2ffe7e, +0xbbb3aa33,0xbc58dec9,0xbc80eb3a,0xbc6459fa,0xbc352331,0xbc3eeed0,0x3bbc569e,0x3c26a8eb,0x3b964749,0x3b0e9f25,0x3a78f601,0x3b0ca2bd,0xbb44e51c,0xbbdc849b,0xbbda2e80,0xba05ed96,0x3a86e527,0x3b54e112,0x3ba52bb6,0x3bcf4bb2,0x3ba3485f,0x3b1d62e3,0x3a0a19b4,0xbaf69f8f,0x3b638a1e, +0x3c218c1a,0x3c1af9a3,0x3bb5c6e4,0xbb17f0ba,0xbc5a554c,0xbc5f0fab,0x3b7c7432,0xbc5eded9,0xbc1c8613,0xbc4e551a,0xbc4f831d,0xbc821e5f,0xbc81a35b,0xbc810352,0xbb4f4d68,0x3a350f07,0xbba19879,0x3b8c9858,0x3b91bb89,0xbaa08403,0xbbc0bc8f,0xbc382210,0xbc8a59f3,0xbc014c29,0xbb1b198e, +0xba8e2169,0x3ba40197,0x3ba94397,0x3b833411,0x3b942ef0,0x3b11b002,0x3b35ee38,0x3abacffc,0x3b16c317,0x3ba72631,0x3b52021c,0xb93b8fad,0xbb856b42,0xbac08238,0x39ac4c9b,0xbae22b8d,0x3bddd714,0xbb1a2910,0xbbabffc4,0xbbe81471,0xbc5b0e43,0xbcf3c37c,0xbd036505,0xbcf40cf7,0xbca8da4e, +0xbbe4b952,0xbacf0c79,0xbba66af5,0xbc3b7f4a,0xbc9334a7,0xbca5b337,0xbc428e83,0xbb6f84cc,0x3aa5b6eb,0x3bc300e3,0x3bb8e4c2,0xbb3bf248,0xbb549828,0xbaa77599,0x38a54559,0x3b0e6805,0x3a766d2b,0x3ada26a4,0x3aed73a9,0x3a84bf9c,0x39672c76,0xbafe3184,0xba900636,0x3a64a038,0xbbfd9927, +0xbb55b344,0x39c14df3,0xbb1e549c,0xbab3b7b4,0xbbec9788,0xbc79e66f,0xbcc8a32b,0xbd1de1a5,0xbce91f42,0xbcb382e8,0xbc6f4da3,0xbc719776,0xbc71aab0,0xbc7e8cd9,0xbc11c532,0xbbb82b3b,0xbbaf1103,0xbb8e41fc,0xbba26e86,0xbb8b4713,0xbb2520e3,0x3a1215df,0x3a784096,0x3baecd09,0x3b96e7e4, +0x3b8c3830,0x3b98bef7,0x3b49a051,0x3b2b03f2,0x3aac4f74,0x39fe02ca,0x3b144c5d,0x3b118ad6,0x3a6095a3,0x3b3d44da,0xbb296448,0xbbb21fe1,0xbb6d7522,0xba3b889a,0xbc71dc6c,0xbcb83dca,0xbd044bc7,0xbd09c0e8,0xbd145820,0xbd14e510,0xbd095ba2,0xbcd67502,0xbc82df17,0xbc53a58b,0xbc9969ee, +0xbc5cc2f0,0xbc2fd22d,0xbc164b6b,0xbb8f2ad3,0xb9de1c7e,0x3b353a8d,0x3ba19502,0x3b614bbd,0xbacfe4de,0x3ab8e3ad,0x3ab29261,0x3b5fe906,0x3b1f079e,0x3b089870,0x3b3ee9de,0xb787d249,0xbb371dce,0xbbc96c20,0xbbfbb806,0xbc0f5df3,0xbc1fb60d,0xbc48a53d,0xbc721d5b,0xbc842264,0xbcc0089f, +0xbc4b4d4b,0xbcdcfe1c,0xbcf59733,0xbcbf8728,0xbc731e04,0xbbea492b,0xbb8ec7f5,0xbbfa132a,0xbc120f7b,0xbbff3b3b,0xbb304d30,0xbbc1cd26,0xbbf59a4d,0xbbfa3d56,0xbbdb4597,0xbb93ca18,0xba801f46,0x3ab5e777,0x3b393db9,0x3ae58bb6,0x3984fa45,0xb91b64c9,0x39b913c8,0x39ad39c4,0x3b1099e4, +0x3b87fd35,0x3b981827,0x3b6f71b6,0xb849ac79,0xbacc8837,0xbafc6411,0xbb282740,0x3ac906cb,0xbaf94144,0xbbf31d33,0xbc81e63f,0xbb87e208,0xbbeae488,0xbc21830e,0xbc566a61,0xbc8d0c2c,0xbc9aa887,0xbca27475,0xbca6f1c8,0xbc8f1e5b,0xbc81d0b8,0xbc627026,0xbc5098cf,0xbc30c6ce,0xbc1b07d4, +0xbc07a203,0xbbf0ebcf,0xbbcfe18e,0xbbc7d3bd,0xbbad39fc,0xbb9d2724,0xbb5ed8b8,0xbaad0c9d,0x38a87015,0x3a957100,0x3b47d6d8,0x3b72a1df,0x3bc3fad2,0x3bb8317e,0x3c045dd4,0x3bdd2704,0x3bd306fd,0x3b9aecd8,0x3b50cc26,0x3b3d4357,0x3b5d8f3a,0xba989557,0x3ace8e53,0xbba2e164,0xbbca9ef4, +0xbc080eb9,0xbc21689d,0xbc3efaa4,0xbc6163f9,0xbc88714c,0xbc7e74ef,0xbc702abe,0xbc63005e,0xbc5293eb,0xbc4b9349,0xbc4acbdf,0xbc3bc09a,0xbc2d0f4d,0xbc1b8833,0xbc0e2c4a,0xbbec79bd,0xbbf73f36,0xbbcd0ff7,0xbbde554c,0xbbf4ee5c,0xbb9f5cad,0xbb9ad0fa,0xbbb20596,0xbb9f2e26,0xbbb0042c, +0xbb81b214,0xbb7b0de5,0xbb187ac7,0xba72afd3,0xbac7226e,0xba90097e,0xbb15c149,0xbb70e6b6,0xbc260bcc,0xbc0ddb85,0xbc0e1301,0xbc20119d,0xbc2aa343,0xbc39efff,0xbc448a4c,0xbc550b97,0xbc48bc4f,0xbc456c9a,0xbc410822,0xbc3e9c53,0xbc397987,0xbc33f7e7,0xbc2d4ece,0xbc2857b4,0xbc22ab00, +0xbc1eb8a9,0xbc169d08,0xbc0dcdd0,0xbc361751,0xbc117f06,0xba49d527,0xbc37efad,0xbc0b6f35,0x3a3bcde9,0x39c24ead,0x39929095,0xb7b2afb4,0xb988b4d2,0xb9fea9f6,0xb9da402b,0xbbe59b7f,0xbc27c5f0,0x3a2a1b89,0xbbe052db,0xbc44e0eb,0x3c3a2c97,0x3c175382,0x3c4b069c,0x3c23b6ce,0x3c327565, +0x3c1e150d,0x3c3fc9ea,0x3c475977,0x3c42f38a,0x3c40feae,0x3c3c337d,0x3c356595,0x3c328620,0x3c320a47,0x3c342882,0x3c39ec62,0x3c3b79dd,0x3c38f883,0x3c39e718,0x3c28bbff,0x3c4c6f8f,0x3c159e40,0x3b09fdd7,0xbc35808a,0x3c3099d0,0x3b251e4c,0xbc291d8a,0xbc18da03,0xbc1317d9,0xbc087637, +0xbc06b585,0xbc0657f9,0xbc0421b9,0x3b3ead0a,0x3c400ced,0xbc21e293,0x3ad01d92,0xb9821c66,0x3c5bc19c,0x3c2cf798,0x3c3019f1,0x3c0b28fb,0x3c5b62bc,0x3c773fdf,0x3c72ef15,0x3c763f39,0x3c6cedc7,0x3c5828ff,0x3c48b5e0,0x3c48091a,0x3c50cef1,0x3c68302d,0x3c6f93aa,0x3c68baa4,0x3c62af56, +0x3c527a97,0x3c5ddc26,0x397831df,0x3c0b57f8,0x3c1704a8,0x3bb2b36e,0x3b90827b,0x3c01de1d,0x3c1cc84c,0x3c3c2d12,0x3c0b3aa6,0x3c32f0b2,0x3c1dd8d4,0x3bc22733,0x3be77226,0x3b8c6b34,0x3be64377,0x3c396d6a,0x3c0970e3,0x3c33e4b6,0x3c4b02d6,0x3c4aa48f,0x3bf091e4,0x3c87b4ab,0x3ca1fa39, +0x3c9b7184,0x3c9bf30a,0x3c8dbf24,0x3c80d72e,0x3c64f40b,0x3c5dcb5b,0x3c67f3f3,0x3c86073e,0x3c8d4b10,0x3c860e46,0x3c7af32d,0x3c759b4d,0x3c393c47,0x3c04d27e,0x3bfa83ce,0x3bf530af,0x3bc26222,0x3b5ca0fd,0x3b9da5c4,0x3ba758f3,0x3c14edc0,0x3bb89b3c,0x3be183d2,0x3b9fe6f3,0x3b90f6f6, +0x3b582bd7,0x3b8309b4,0x3bc9833a,0x3c06fcff,0x3c19cefb,0x3c399474,0x3c1fb8c5,0x3c02a169,0x3aa859eb,0x3c71acf1,0x3caf518d,0x3cb82378,0x3cbdbfc1,0x3cbc19b7,0x3c99c0f1,0x3c721b1f,0x3c6a0059,0x3c83e560,0x3cb0224c,0x3cb9af48,0x3cad30c3,0x3c9fb08e,0x3c8eafe1,0x3c7ad8f2,0x3c102cf0, +0x3c259928,0x3bd2c706,0x3bc5ed72,0x3b9a5bb4,0x3a815dce,0x3b813237,0x3ba93c24,0x3be8fb07,0x3bcdcbd9,0x3b8b15f0,0x3a9e6cc9,0x3a430914,0x3b885bb4,0x3c1eb772,0x3c50a417,0x3ac2ccad,0x3c87685e,0x3cd27f63,0x3cf25cb9,0x3d0692c5,0x3ce2d8c0,0x3cd05300,0x3cdcd364,0x3c8ca09c,0x3c494342, +0x3c1ca87b,0x3ca4e963,0x3c9f5cb4,0x3bd5f507,0x3c077c8a,0x3c181be7,0x3c4d69cd,0x3c4fa263,0x3c631e94,0x3c1fa120,0x3b422f57,0x3bddc839,0x3bee37cd,0x3bfa7f34,0x3c01525c,0x3bbe4862,0x3b35a716,0x3a8199a3,0xba8b8e1b,0x3bdafc38,0x3c482d26,0x3c2caff6,0x3be71245,0x39f3599b,0xbc0ce0e4, +0xbb7b3c25,0x3c74b4f7,0xbbe1b52a,0xbbc0577d,0xbba23620,0xbc1cd924,0xbb07af83,0xbb4e0a3e,0xbc5751f2,0x3baeb271,0x3c114029,0xbab73fff,0x3ba65e23,0x3bee201e,0x3c274709,0x3c4a79b0,0x3c81c415,0x3cab9253,0x3ca1d0a2,0x3c8ae7d3,0x3bd885d5,0x3b98b2f2,0x3bcd6781,0x3be65567,0x3c0b755c, +0x3bbe2854,0x3b74cdd7,0x3ae9e1a9,0x3b3f46b0,0x3bd7f5f9,0x3b8d3285,0x3a4de0c9,0xbb2419a5,0x3a8ad7ad,0x3bdc6bee,0x3b4ce675,0x3ca95aac,0xbb67d264,0xba098abe,0x3867e5af,0x3c01b0a3,0x3cef4ed8,0x3d065cd7,0x3d23fbbf,0x3d2f16cc,0x3d08877b,0x3cbd7fb2,0x3c830694,0x3cc87023,0x3cd21541, +0x3cba504d,0x3ca11d83,0x3c63baa5,0x3b99f261,0x3c0176bf,0x3c170c66,0x3bc02a96,0x3ba0a0b7,0x3b4f283b,0x3b110aee,0x3ba290cf,0x3b1c1d97,0x3b23830e,0x3b3e112e,0x3b0b551f,0x3abfe6e4,0xb9ef1f3c,0x3a8554e5,0x3b4ba347,0xbb770fb3,0x39a1bd16,0x3b24d3a7,0xbaf4ff70,0x3a781236,0xba8eb5c0, +0x3c7c1a21,0x3cde3b38,0x3d382b2d,0x3d16290d,0x3cc69304,0x3b87eecc,0x3a3afdb3,0xba56b2d7,0xbb0b5fe2,0x3ba6d238,0x3c054d75,0x3be5b681,0x3c3d54c5,0x3c6ee955,0x3c832cc9,0x3c71dbba,0x3c2d9573,0x3baec321,0x3b84359f,0x3bc5ebe9,0x3bbcda30,0x3bc5e136,0x3b90327d,0x3b616863,0x3ac23a50, +0x3abfb108,0x3b3b8f0e,0x3b17c5ef,0x3a8a6c3b,0x3b503887,0xba9b16b6,0x39a7dd61,0xbaef089d,0x3b343c09,0xbc7ecbf0,0x3be2ca11,0x3cd34c68,0x3cbd9de0,0x3c99a741,0x3c8620a7,0x3c7fd8f5,0x3c6c3450,0x3c5fb1ee,0x3c5222a7,0x3c5c1a9e,0x3c4909a0,0x3c3e34aa,0x3c262e3e,0x3be30bca,0x3bb476ad, +0x3bbd9ada,0x3bad3c2c,0x3bbad694,0x3b925d17,0x3bb1d7ff,0x3bdd58f8,0x3b7712d3,0x3b4b4cdb,0x3b4d62e3,0x3b9fee5c,0x39af5689,0xbb074ee0,0xbb6d7bd6,0xbb7ce37b,0xbb9ea259,0xbbce3322,0xbc101267,0xbc450186,0xbc9848e8,0xbc2558b3,0xbcc39c0c,0xbc4dbda5,0xbbe98bb6,0xbb94bcb5,0x3b2fc7f3, +0x3c15fd9d,0x3c385879,0x3c35f4f7,0x396ceb27,0xbb7e7121,0xbb0d4694,0xba0d5a92,0x3b13b2f6,0x3ba12814,0x3bd2b723,0x3c08265f,0x3bfecee3,0x3c180b05,0x3bee3efc,0x3a99fac5,0x3ac162f0,0x3b09c0e4,0x3b4558c3,0x3b73e35b,0x3b6f3728,0x3b9da02d,0x3bb378d8,0x3b79bb91,0xb99724ac,0xbaf5ca68, +0xbb20510f,0xbb2b136f,0x3a270140,0x3a54dff2,0xbbb4b936,0xbc0824a5,0x39e2ec3c,0xbaf1ea0c,0xbaff61f8,0xbb3d2c44,0xbb775b15,0xbb2c5975,0xba78309d,0x3b057da2,0x3b111119,0x3b100c18,0x3aa36d19,0xba51362b,0xbb31b7f3,0xbba1fcb7,0xbb675316,0xbb255a32,0xbac30b3f,0xba4d4877,0x3a3d6220, +0x3aaf1eba,0x39dd0138,0x39effcfa,0x3a8714b9,0x3b02ee5a,0x3b1ecf00,0x3b7b9603,0x3b81f389,0x3bcff11f,0x3bfbd883,0x3bcb6cdf,0x3b941773,0x3b6e7166,0x3b1a9bba,0x3b022fd0,0x3a74cbde,0x39f15a70,0xbba5866b,0x3a60c1e5,0xb8c6747a,0xb913ad70,0xb9e1c58d,0xba21cf43,0xbaaed058,0xbb0b123a, +0xbb87ee03,0xbbbf330e,0xbbed6a2e,0xbc0c6e22,0xbc20e234,0xbc3d2763,0xbc2894d7,0xbc1c0892,0xbc0ba74a,0xbbfa831d,0xbbee195c,0xbbadcbe5,0xbbd483e0,0xbb1c7f76,0xb9e7bced,0xba988a67,0x372fa665,0x3b3f1ff0,0x3b543807,0x3b6d4bd7,0x3b2462f8,0x3b77efc1,0x3b7b5a7d,0x3b4f96e2,0x3b3c6e2c, +0x3a26b46a,0x3a91aec7,0x3acbc756,0xbaef4ab6,0xba296b28,0xbb042575,0xbaf49121,0xbb0c0f13,0xbb1c5e47,0xbb255479,0xbb1c5062,0xbb422d4b,0xbb61860d,0xbb83b6e6,0xbb969498,0xbba668a1,0xbbbfe778,0xbbab44a4,0xbba0e83e,0xbb9768f0,0xbb864fb0,0xbb808bc8,0xbb4a31ae,0xbb45549a,0xbbcb6b07, +0xbc5a44c2,0xba517b5f,0xbba23a5b,0xbc55da8b,0xbc5089b3,0xbc466515,0xbc3c06de,0xbc34e32d,0xbc2ea583,0xbc22cfa0,0xbb90caf2,0x3853b21d,0xbc447fb4,0xbbba42e6,0xbb5b7145,0xbbaa6654,0x3a565656,0xbc0587c6,0xbb70f362,0xbb9769ba,0xbb8df033,0xbbb6b60d,0xbbc7cf5f,0xbbd09a99,0xbbd08a75, +0xbbcdb523,0xbbc1c803,0xbbc0ea8e,0xbbbde848,0xbbbc3818,0xbbbbe366,0xbbbb0a97,0xbbbbe1d9,0xbbb8aed3,0xbb90ef09,0xbbfb63c6,0x3aa78692,0x3c14b8d8,0x3c9f1397,0xbafe8c88,0x3bff90c1,0x3c919ce4,0x3c9750e3,0x3c96a578,0x3c88cadd,0x3c91bc54,0x3c90ca3a,0x3c87ed28,0x3bf24dd5,0xbb64cac6, +0x3c962c75,0x3c1cd33b,0x3c4fd9af,0xbbe2b17e,0xbb8aacd6,0xbb81edeb,0xbb8122d0,0xbbe014d0,0xbc06dd4f,0xbc0b5ac6,0xbc0f4f49,0xbc089c06,0xbbfa6ce7,0xbc009097,0xbc00e0a9,0xbc02f6de,0xbc02c204,0xbc00ec4d,0xbc03728a,0xbbde7ed0,0xbbcee9dc,0xbba3aef5,0x3c447309,0x392ccc82,0x3aabec85, +0x3aacd941,0x3b1856bb,0xbab88903,0xb9bdcfde,0xb9b82e62,0x3ad79e04,0xbabb289d,0xbb3032e1,0xba31a5bb,0xbaea8b6b,0x3b28649d,0x3b4ec980,0xbb524fa6,0x3b234306,0xbb8e4558,0xbb6f439f,0xbaf59aad,0xbb4718f0,0xbc01c796,0xbc32e22e,0xbc4a8f3b,0xbc5265d0,0xbc4a64f5,0xbc25e6e0,0xbc27c4a1, +0xbc21bbb7,0xbc2354d3,0xbc25b5df,0xbc1f757a,0xbc28bd77,0xbbf9429c,0xbc09d120,0xba466f9e,0x3b972d2c,0x3b3e12ac,0x3b6d0de7,0x383bb0ec,0x3b4d8fc0,0xbab180dd,0x3bcdfd7b,0x3ab24f9a,0x3b8b9053,0x3b16044f,0x3b907866,0x3a09db66,0x3a9a81cd,0x3a3ce464,0x3b8cd814,0xb9b6fc40,0x3bb64c10, +0xbb93ee38,0xbb3a8698,0xba69ff8a,0xbb16b1d3,0xbc14e752,0xbc559b98,0xbc6e40a0,0xbc7772a7,0xbc580e58,0xbc37b3ee,0xbc53c446,0xbc61f7eb,0xbc724c43,0xbc6ce0d3,0xbc6ac169,0xbc6f8fab,0xbc27d0ff,0xbc05b5a8,0x38328cf5,0x3c209b71,0x3b1ca395,0x3bffce5a,0x3a964ba8,0x3a758586,0xbae34923, +0x3b2d093b,0x3bce96dd,0x3b9f96a6,0x3bacca7c,0x3b08a8c5,0xb843e065,0xbab7bd0c,0x3a5d8815,0x3bc36555,0x3aefdde5,0x3a2f25bd,0xbbc9e42f,0xbbb88172,0xbb023186,0x3b041eef,0xbc066e5d,0xbc4d527c,0xbc6cbe99,0xbcacaff0,0xbcb14190,0xbca9b121,0xbc00b5cf,0xbab1545c,0xbabac987,0xbae217aa, +0xbb09ecbc,0xbbc731c3,0xbbdb2efe,0xbc3a2252,0xbbc2e1da,0x3b7f93c5,0xbafff375,0x3b617027,0x3b89f65f,0x3bd94fe0,0x3bdc7ef7,0x3adb53d7,0xb951b5fd,0xba510be2,0x3bd68747,0x3c3a26c4,0x3bfd1a2b,0x3b65f9b2,0xba562d69,0xbc11f1f7,0xbbd2db8a,0x3c406385,0xbcd3cf67,0xbc8f48b9,0xbc3dfcf1, +0xbc10d2d1,0xbc17bbff,0xbc3f50f5,0xbc92815e,0xba892204,0x3b4bd4b2,0xbbcbfffb,0x3b586041,0x3ba35af9,0x3b2db28c,0xbb6814b1,0xbc1367af,0xbc75bdeb,0xbbb583aa,0xbb5dad64,0x37de86ec,0x3bccdb0a,0x3ba139f8,0x3b96e339,0x3b9f92f8,0x3b2556df,0x3b3016d2,0x3ad01684,0x3b4a55dc,0x3bd3da5a, +0x3b37aec7,0xb7a14908,0xbb8c0720,0x3adabcb4,0x3ae400cd,0xbac975cd,0x3c475f80,0xbb276f7c,0xbbd24c7e,0xbb9a061c,0xbbfd6e08,0xbc92e33a,0xbccf8505,0xbcd4023c,0xbca90636,0xbc76d5dd,0xbc2e2425,0xbc39d3ac,0xbc80ebbc,0xbcabf537,0xbcb3c24e,0xbc91582b,0xbc10f1fe,0xba27b6f0,0x3b1dd3c5, +0xbab7fc48,0xbb8b76f4,0xbb1af8a8,0xbb5b42b4,0xb9e4d213,0x3a9b8e02,0x39c51137,0x3b12e1b5,0x3aca6b2e,0x39c336ec,0x3a54125f,0xba5cbdea,0x3a6cc0bd,0x3b3261d5,0xba65c231,0x3ad294d6,0x3b951f75,0xbb43fb9c,0x3b5a8ec2,0x3a095668,0xbc296d22,0xbc87328e,0xbcdab675,0xbcad7e0a,0xbc89a670, +0xbc526d8b,0xbc1bec4f,0xbc09d267,0xbc41ca10,0xbba5647c,0xbaeee3e3,0xbad4e23c,0xbb858e19,0xbbc3b5a6,0xbbd0d99e,0xbba2dadd,0xbb59f5e6,0xb8153888,0x3bc7c215,0x3b3c510d,0x3b1549d6,0x3b8d1f74,0x3b40c7db,0x3b006dc4,0x3a539c6f,0x3a1773e5,0x3ae13e8f,0x3a6d60bf,0xba0a69f9,0xbabf046d, +0xbab25053,0xbb38d3a8,0xba2ad76a,0x3b0a6a53,0xbaef837f,0xbc1634d8,0xbcc003cb,0xbcb8718b,0xbcd379ae,0xbcd640ad,0xbcca5bb9,0xbca4cfa3,0xbc809f3d,0xbc69754a,0xbc7e1e1b,0xbc1876c3,0xbbc5de60,0xbbb15863,0x391bb4c6,0x3b74a8e4,0x3b9135b9,0x3b96486b,0x3ac9eedc,0xbaded10d,0x3b8e0e73, +0x3acd9e1d,0x3adcb493,0x3b0ea7c5,0x3ad809e9,0x3b4006f5,0xba471714,0xbb8057a7,0xbb848963,0xbbab00d3,0xbba52ec6,0xbbde63af,0xbc0d27d8,0xbc40904b,0xbc76d910,0xbc81a29e,0xbc11820e,0xbcaec090,0xbcd01a9b,0xbc9d3e99,0xbc8200f5,0xbc4177af,0xbc5c3d54,0xbca7a700,0xbc410e0f,0xbbc3c8d9, +0xbb02bd9e,0xbbac7017,0xbbc7e6f9,0xbb9c8135,0xbb8aa743,0xbb4929a7,0xbb017341,0xb9510835,0x3abbbedf,0x3b3cab17,0x3b298643,0x3ac53839,0x3ad7fd6c,0x39bcc0d6,0x3a8069a2,0x3b410f66,0x3b023b68,0x3a52497b,0xbb7c54fd,0xbbc0f309,0xbbe23f50,0xbbfa4a45,0xbb6ce491,0xbbab95ae,0xbbecad16, +0xbc7c8fbc,0xbbe96652,0xbc4d4b43,0xbc710dd8,0xbc5fdced,0xbc6e3ba0,0xbc5ac694,0xbc3c2a13,0xbc27c9e1,0xbc1e11dc,0xbc2aee91,0xbc1ee654,0xbc07de33,0xbbd66ae2,0xbba313b5,0xbb83aac1,0xbb3ea241,0xbb116ee2,0xbb5aff9a,0xbbba74ff,0xbbb1294d,0xbadd09e3,0xbaa9dd15,0xba3af24c,0x38f8d21f, +0x3b159cc7,0x3b0dd86a,0x3b953bef,0x3b0f5190,0x3bdb0791,0x3b2b8629,0x3b3eb630,0xba3182f2,0xbae3be61,0xbb06430b,0xba986b65,0xbbc38120,0x3b78e8e2,0xbbb95886,0xbbef4258,0xbc182b5a,0xbc3b07f6,0xbc5eb290,0xbc841a48,0xbc9604ef,0xbc8a679d,0xbc775d72,0xbc639db5,0xbc4d2b35,0xbc3ca597, +0xbc2e547a,0xbc267b6d,0xbc1e6d86,0xbc1116f0,0xbc04011e,0xbbd7eef5,0xbbe56c9c,0xbb834def,0xbbc6a706,0xbbb6f5c6,0xbb5a0ebd,0xbb1e05d6,0xbb5948c0,0xbb780777,0xbb6ba3b7,0xbac032d0,0xbb582f07,0xbb3ba45b,0xba017f42,0xbacd5700,0xb968db0b,0xba9c7472,0xbb8c1009,0xbbdc61b7,0xbc2918ba, +0xbc1ab75f,0xbc2c9160,0xbc352db3,0xbc3f6098,0xbc47804f,0xbc5aa355,0xbc4c2dee,0xbc4848ba,0xbc41c889,0xbc3ccdec,0xbc3657a0,0xbc2d5cf0,0xbc29d22f,0xbc257bba,0xbc220cb5,0xbc1fb000,0xbc17b757,0xbc1db921,0xbbf83598,0xbb591f58,0x3b2e7d96,0xbc03cf60,0xbb2b8b2f,0x3b94d3ec,0x3b93c12b, +0x3b8b1496,0x3b56a6b3,0x3b7fd9c0,0x3b6fb66b,0x3b5bd94e,0xbb02865d,0xbbff62f4,0x3b55c4d9,0xbae413e8,0xbc482940,0x3c0c1692,0xb9b472de,0x3c37825f,0x3bf746e5,0x3c03b7c2,0x3bdd704c,0x3c0104eb,0x3c07aa7b,0x3c0fba9f,0x3c0b2a63,0x3c0aa47e,0x3c0ed580,0x3c08042f,0x3c0726d7,0x3c0861b4, +0x3c0dbc6b,0x3c0ea08e,0x3c0d053c,0x3c0a3512,0x3bf6ef10,0x3c306055,0xb9dd9a33,0xbbde6d5e,0xbc36db09,0x3b10adde,0xbbd3e964,0xbc3704e4,0xbc33cee5,0xbc31c905,0xbc1ec240,0xbc36fe03,0xbc3beb24,0xbc398234,0xbbc8bd0b,0x3b69d3dd,0xbc345734,0xbc01ad01,0xbc061638,0x3c09b96c,0x3c08f4a3, +0x3be1ab13,0x3b9a1ce8,0x3bdb1c53,0x3c004ade,0x3c1f1e37,0x3c1f51ab,0x3c272856,0x3c2fbcd9,0x3c1d4a57,0x3c1df178,0x3c22157b,0x3c33660e,0x3c325eb9,0x3c2ba363,0x3c147f78,0x3c1baa34,0x3bff03a8,0xbbc204d4,0x3b989010,0x3b5dbd17,0x3ae9d9d3,0x39f11437,0x3b5d479c,0x3bca8ba5,0x3bd09492, +0x3afe0e62,0x3bc49d41,0x3bda8689,0x3b0cf8a1,0x3b68ef2c,0xb82f4112,0x3a046b08,0x3bd4ed6f,0xb9d65390,0x3be1a09b,0x3c3aaa3a,0x3bf5e8b9,0x3b57af23,0x3bd4e90f,0x3c0b3839,0x3c4a1a65,0x3c38b422,0x3c3a3708,0x3c581187,0x3c29d660,0x3c28438e,0x3c260f54,0x3c4aa411,0x3c4cc2c7,0x3c43ec60, +0x3c20859d,0x3c36c77f,0x3ba08bb8,0x3a21478f,0x3b4005da,0x3b949977,0x3b3d1008,0xb9c5738f,0x3b4574ef,0x3b4bd4a2,0x3c1cc32f,0x3ab9547c,0x3bd0b3ed,0x3abbff79,0x3aee0aa0,0x3a42a028,0x3a300b24,0xb7fb0085,0x3b0f799f,0xb95e61d8,0x3bd053eb,0x3c0850e3,0x3b4f7554,0xbb3d531f,0x3a0cb6ff, +0x3b851eab,0x3c431352,0x3c453303,0x3c77f76d,0x3c8df8b3,0x3c46e2c7,0x3c392774,0x3c3d4c10,0x3c7cbfe0,0x3c7d2b8c,0x3c6560fb,0x3c2cadb1,0x3c3c422d,0x3be5a536,0x3af296fb,0x3c12053c,0x3ba2e37b,0x3ba70ca8,0x3b816d6a,0x3a87b393,0x3bab6c29,0x3bcb7710,0x3bd83bbc,0x3ba9df3d,0x3b85feea, +0x3a387a6c,0x3abb8922,0x3adedeb0,0x3bb0af85,0x3bcf7e08,0xbc1b13cf,0x3c2e39e5,0x3cc3c3ce,0x3cb84091,0x3cbb650a,0x3ca193de,0x3c9426f1,0x3c9f3f0a,0x3c39dfba,0x3c06092b,0x3c008021,0x3c893ec5,0x3c9d2390,0x3c5a73f9,0x3c2d9ee1,0x3c257b71,0x3c882a3b,0x3c5144b8,0x3c598730,0x3b2f8f86, +0xbb92af15,0x3ba38605,0x3b9ced06,0x3bbbb646,0x3bc0411b,0x3be52f97,0x3b15ef5a,0x39c02c35,0x3a56efce,0x3c09500c,0x3c446e0e,0x3bba4c9b,0x3b672198,0xbb83a5d1,0xbc4bb876,0xbc5132a4,0x3c21551e,0xbc7d241e,0xb9108281,0xbb0c81e5,0xbbcf0651,0xbbe31382,0xbc28fe47,0xbc8cdb0e,0x3b70f583, +0x3c1eb2b2,0xbab9303f,0x3b3666ec,0x3b885106,0x3be1b0b9,0x3c21db2e,0x3c45d1e2,0x3c71338f,0x3c440177,0x3c52e78d,0x3b59496a,0x3acf46f5,0x3b7c220c,0x3b5bd38c,0x3c18888f,0x3be6fc7a,0x3b756706,0x3b337e0f,0x3b8626ab,0x3bec7800,0x3b81fe80,0x3a3803cb,0xba92b023,0x3b054e18,0x3bef2349, +0xb94f289d,0x3cb54c7a,0xbbebb01e,0xbb837459,0x3ac6495a,0x3bbef489,0x3c8928ef,0x3c5d6234,0x3c9aba2e,0x3cc1eb45,0x3cda3b5c,0x3cc17bf1,0x3c74f19e,0x3cb48151,0x3ca316d9,0x3c64c0c4,0x3c40324d,0x3c07a2c6,0x3b8e4f46,0x3b950a8d,0x3bf46c0b,0x3ad0d6c2,0xb97bb481,0x39f7fed6,0xbb124b4a, +0x3a965bd3,0x3a3a5463,0x3b2ad136,0x3b366675,0x3b0a98ea,0x3b02ff09,0x3a3d685a,0x3b09ccb5,0x3b1e48a3,0xb9a0a2d9,0x3b67db46,0xb9ed229f,0xbb8ca32c,0x3b3cb88e,0x3b1f5ac7,0x3be247af,0x3c152708,0x3cc5891f,0x3c887142,0x3c20e06b,0x3b7a1f28,0xbb954083,0xbbf954ed,0xbc40c681,0xbb4df44b, +0x3ad1b9f8,0x3b34c99c,0x3bb1cd2d,0x3c074532,0x3c3143bb,0x3c1f7f1a,0x3c0baba5,0x3b562df3,0xb9aa0868,0x3b299403,0x3b361978,0x3b926d41,0x3b6133c0,0x3b0f7042,0x3add1ca5,0x3a4c06bd,0x3af56bd1,0x3a7cd8a4,0x39238ef5,0x3a0f915d,0xba3bd707,0x3aead7c8,0xb98c693e,0x3ba508d9,0xbc8e9ea1, +0xbbc24392,0x3c0f0f43,0x3c0001dc,0x3c032a87,0x3ba0a1d2,0x3bc89cf3,0x3c0ced6d,0x3b580dd8,0x3aaaed10,0x3a5d1a11,0x3adcf845,0x3b361b37,0x3b5c7460,0x3b8b8584,0x3b9e8694,0x3be495cd,0x3b39804e,0x3b51c2f2,0x3b536827,0x3ae588a7,0x3b954e8f,0x3aaf3f48,0x3b1208f5,0x3b2209e7,0x3b6dcfe4, +0xba65989c,0xbb12921a,0xbb61b6f9,0xbb21de7f,0xbb8d53ce,0xbbf63580,0xbc254b9c,0xbc676874,0xbcab91a2,0xbc6d59e6,0xbcd1cb8e,0xbc838163,0xbbe97c31,0xbbd666f2,0xba965b7f,0x3aa3247b,0x3ab31b8e,0xb9815f5d,0xb84a9e1b,0x39f87a1b,0x391eee0e,0x39a7edaf,0x3a3bd08d,0x3ade94e4,0x3b615b2d, +0x3ba7e573,0x3bf4ef3a,0x3bf7cefb,0x3bdb4d4f,0x3b1bfc82,0x3b39d2c9,0x3b3960e4,0xb9c8a610,0x3ab7da19,0x3afd1870,0x3b52fa78,0x3ae92056,0xb9c360b9,0xbafcbd57,0xbba5cd1c,0xbbd45836,0xbbdbb1b0,0xbb966baf,0xbb8cb4b9,0xbbe92e90,0xbc47f82c,0xbc205b9e,0xbc198126,0xbbc05f2b,0xbbb841ba, +0xbb588828,0xba99a919,0x3b1a3721,0x3bc53692,0x3b87ea19,0x3b1d6036,0x3a68904f,0x3a895073,0x3a8a3622,0x3a190d8a,0x3b0324d7,0x3b42038d,0x3b8d213d,0x3b23ba48,0x3b3a6874,0xba2f427f,0xbb5ecd9b,0xbaf060f7,0xba235ece,0x3a6da88b,0x3a5a9d52,0x3b50d913,0x3ade0bde,0x3b83ccab,0x3b17bdf2, +0x3b08d385,0xba805c15,0xbb0819fa,0xbb91b192,0xbbe24d0b,0xbc1db68d,0xbc147e87,0xbbf1b62c,0xbb00e09f,0xbb041652,0xbb253b7a,0xbb3558c8,0xbb438e12,0xbb70da2e,0xbb8144ea,0xbb878dae,0xbb789180,0xbb7eed35,0xbb8c9b92,0xbba43ae4,0xbbcc6f80,0xbbb601f3,0xbba6f85c,0xbb89b78c,0xbb6f0f37, +0xbb35e30d,0xbab5df45,0xbbc6562d,0xba8a302e,0xba953a9b,0xbad7d286,0xbaec3f80,0x3a636d85,0x3ac27eef,0x3a43e3ec,0xba951a3f,0x3aa3b5f1,0x3b0a24f3,0x3a8f1e48,0x3a56cf38,0xbaa8df53,0xbaa803ad,0x3617dce8,0xbbc9982f,0xb95c3abd,0xbaf2972d,0xbad30556,0xbad7c620,0xbae10159,0xbadb01d4, +0xbadd794e,0xbadedd22,0xbafbeba0,0xbb0a1087,0xbb15f794,0xbb17efe4,0xbb215f5b,0xbb0d99cb,0xbb0861a7,0xbb07b62c,0xbae5ab46,0xbb0108e4,0xb980fa58,0xbbbb8876,0xbc25cacc,0xbc690ee8,0xbb6f07d2,0xbc1eafce,0xbc688633,0xbc682853,0xbc5cd287,0xbc4adf6c,0xbc524992,0xbc4f6634,0xbc459116, +0xbc178434,0xbb6cb6c8,0xbc537b99,0xbc2aee39,0xbaef1dff,0xb9cd984d,0x3c0be48d,0xbb6bd79a,0x3905d046,0xb97403ac,0xb9cdc5ac,0xb949a84f,0xb997d84b,0xba1f860a,0xba42daae,0xba4eb575,0xba05eeac,0xba340dbe,0xba197821,0xb9b777da,0xba0be633,0xba221c36,0xba2edf56,0xba441c19,0xb9a2662c, +0xbb53d704,0x3c0e38ba,0x3c510b54,0x3c432bfa,0x3bcb11cc,0x3c4ac706,0x3c3ca6ef,0x3c54dd3e,0x3c57604d,0x3c3a14d1,0x3c59ef08,0x3c5ae3f9,0x3c4dfc66,0x3c470ae6,0x3ba5d86f,0x3c3bd5ea,0x3c5cc9e3,0x3c503b90,0xba6d015e,0xba96fdaf,0x39e2699c,0xb9d3f274,0x3a0963ca,0x3a0a5baa,0x339c28ca, +0xb9f06ff2,0xba0e577e,0x390d6826,0xba819c3a,0xbaa52a03,0xba687022,0xba94bab6,0xba640819,0xba784fec,0xb9d06edc,0xbae2c2a7,0x3a1c2bf3,0x3c3b7f96,0x3b572a01,0x3bca7907,0x3b859073,0x3ba4936f,0x3b6ec37f,0x3b878813,0x3bb7fae1,0x3be56344,0x3b735276,0x3aaa9fa9,0x3b377ed7,0x3b21cd1e, +0x3bb1146e,0x3bd4d9da,0x3aa452e9,0x3bf8f7c1,0x39e346ca,0xbaab1baf,0x3addacd9,0xbaaa7321,0x3ac6e6a1,0x3aed9177,0xb937dd2c,0xba6d0cee,0xbabc0f5b,0x39f61e40,0xba97253b,0xba3f14a9,0x39efa8d6,0xba070090,0xba226265,0xba9e1a48,0xba3fcb7e,0xbb5e1932,0x3b067f2a,0x3bf3900a,0x3ba8b91f, +0x3bb7429b,0x3b362dac,0x3bb8d77b,0x3af75e08,0x3c0a07c9,0x3b664a21,0x3be7759c,0x3b43d07d,0x3bc759a3,0x3b2ae914,0x3b6f81e8,0x3b5bcd8b,0x3bbab5c1,0x3b67cd7f,0x3bd99949,0xbae31bf3,0xbb514480,0x3a792909,0xbb317167,0x3afcd2a2,0x3b5de2aa,0x3af2bf6b,0x3a89b6d0,0x3ab513a8,0x3b4e53ba, +0xba567d06,0xbb00a491,0xbaada368,0xbab2a123,0xba6696c4,0xbabd5e1a,0xba636481,0xbb82ba91,0x3a934ecf,0x3c09b9e2,0x3aec857d,0x3c14d823,0x3b134464,0x3a431306,0xbaee1bbb,0x3b833fdd,0x3be04736,0x3b29af0e,0x3b96c643,0x3acbf610,0xba279e0d,0xb7ad4384,0x3b29686c,0x3b86bda2,0x3b452726, +0x3c1ee111,0x3bcabd2d,0x3b3342d4,0x3b9c14ea,0x3bc07bc4,0x3ba22de8,0x3b8b8665,0x3b1ce074,0xbc1d038a,0xbc75345b,0xbc8646d7,0xbc217ccc,0xbb56c056,0x3aac3cd5,0x3a78126b,0x39fe62d6,0xbb8dad49,0xbac1d722,0xbb5f81c2,0x3b0b7980,0x3bd92846,0xba14669a,0x3b904e82,0x3b83cb47,0x3bcfa66f, +0x3bfb6e82,0x3ad83cf0,0xb84c63e9,0x3ac7a5d8,0x3c1a6676,0x3c4175ca,0x3bb79300,0x3b61d0fc,0x3a601d28,0xbbdf012c,0x3a061bb9,0x3c70b177,0xbcd336de,0xbc82adbc,0xbbb8711e,0xbb9a8e88,0xbaf6fb39,0xbb167837,0xbbe66dfb,0x3ba934b8,0x3bf1dba6,0xbb450dd6,0x3b86a805,0x3bc4fe73,0x3bd67d8c, +0x3b7404de,0x3b21c80f,0x3b184f86,0x3bb0ab1b,0x3b2c62b6,0x3b85f594,0x3bce776c,0x3b94731f,0x3b9e9c14,0x3bc88c85,0x3b8ec5ae,0x3b4bbc10,0x3b395347,0x3b909dca,0x3be68450,0x3b226d5a,0x3a43f42b,0xbab3d405,0x3b7e3317,0x3b976d31,0x3a441484,0x3c83b68d,0xbb89e620,0xbbbdb5e8,0x3b148b4c, +0x3bb0a842,0x3c1b0664,0x3b542ad7,0x3adca286,0x3a3e3817,0xbb0dc00e,0xbb1148a2,0xbb911826,0xbb2cbf4f,0xbba77e6a,0xbc024965,0xbc00aef5,0xbb8e3247,0x3a9247e8,0x3a810453,0xbb63cc0b,0xbae35147,0x3a0f6f9c,0xbb2b16bf,0xba49122b,0x3a289fc8,0x3a2319df,0x3b332fda,0x3b004846,0x3a60ecd5, +0x3ad54cd0,0x3a914fbc,0x3b2409af,0x3b2e4d34,0x3b807c9e,0x3b80725d,0x3b780b1c,0xbb8f5f31,0x3be16987,0x3bfb2991,0x3b949396,0x3be7f1fb,0x3bfe9788,0x3ba64f28,0x3ad4fec9,0xbba016a5,0xba11d5b4,0x3981aaf9,0xbb74c9cb,0x3a58f357,0x3b48abc9,0x3b3e9932,0x3aa0934e,0x3aaa9fce,0x3ae1aeaf, +0x3aa5d432,0xb93ef191,0x3ac75c17,0x3b958587,0x3b03bb7d,0x3abbaa8b,0x3b791ed2,0x3b4372a7,0x3ae7bafe,0x3a68ff36,0x3aa471e0,0x3abdfe16,0x396506ea,0xba7d3a83,0xbb59e1d4,0xba199480,0xb90bcea2,0x3a20cfad,0x3b659935,0xb990f976,0x3aa6114c,0xba1473a7,0x3ad3b651,0xbb1886f3,0xbaf22ea9, +0xbb15ddf0,0xbb099ec1,0xbba5b316,0xbb9f9f52,0xb9a8bc28,0x39e2cd17,0x3a83e3e3,0x3b02eb2e,0x3b73f626,0x3b8dba90,0x3b832210,0x3b12a45e,0x39a188f1,0x3ab28c66,0x3bb472cd,0x3b0e1382,0x3975bd73,0x3af3ded7,0x3ac1549a,0x3b126517,0xba288a73,0xbb4b97ce,0xba8f4f05,0xbb0a3678,0xbb18def0, +0xbb9afc5a,0xbc098cd9,0xbc427a3a,0xbc7a38c3,0xbc05880c,0xbbd0709f,0xbc109b39,0xbc3ea82b,0xbc1e5614,0xbc29a403,0xbc5a20c3,0xbc80c8d6,0xbc800199,0xbc0d2341,0xbb9c2881,0xbb987c97,0xbb67ed5a,0xbae737d4,0xb7dccd92,0x3afeab52,0x3b12f5c6,0x3b41638e,0x3ab6b78b,0x3aac2546,0x3b4e49b6, +0x3b740fd8,0x3b5b252c,0x3b69d143,0x3b09cc7d,0x3a82752d,0x3b0b123d,0xba83a313,0xbb205435,0xbbb7d1e1,0xbbeba7c5,0xbc039979,0xbc06dccb,0xbbb83903,0xbb8e7bbc,0xbb41db70,0xbbfe7aff,0xbc0384f0,0xbc5d03be,0xbc67a157,0xbc309594,0xbc130a00,0xbbb135ee,0xbb05977c,0x399aa092,0xb9dbe19a, +0xbaa32a8d,0xbab82ce4,0xba630577,0xba1ccb00,0xb8712923,0x3a728e61,0x3b069f0f,0x3b4e5a2e,0x3aeb32bb,0xba289523,0xba4b5fc6,0x3a8cd2b6,0x3861acb0,0xba03a02d,0x39cb3a7b,0x3b0a3978,0x3b259c59,0x3b61efc1,0x3a8c0947,0x3b921f19,0x391f4b87,0x39af837f,0xbb36a8b9,0xbb843aba,0xbba778f2, +0xbbb27b96,0xbc0c266a,0x3aab2773,0xbb87c4a5,0xbbad4c44,0xbbc235c2,0xbbf1aa1f,0xbc0cc04c,0xbc24ebde,0xbc2db0c7,0xbc2349f2,0xbc138fab,0xbc0839ff,0xbbf8b2ba,0xbbdb3a63,0xbbbad6e2,0xbbbaac03,0xbbb9b20c,0xbbb3ddac,0xbba70bed,0xbb9a1f30,0xbb91283b,0xba5db3fe,0xbb098492,0xb9aaa5b6, +0x398ac8e7,0x3ae43640,0x3b082dea,0x3a3f8e11,0x3a934307,0x3b0486ef,0xb92f5db9,0xba8adb5f,0x39c08cdc,0xba473112,0xb795f5cf,0xb8f3839e,0xbb3aa999,0xba3fa0c1,0xbbbdf63f,0xbba2aecb,0xbbb09ade,0xbbb46f72,0xbbb7b0ce,0xbbbb425f,0xbbcd52f5,0xbbc2260f,0xbbbec8d8,0xbbb8ede1,0xbbb27be8, +0xbbad8a77,0xbba3fea7,0xbba4aac3,0xbba254a3,0xbba31549,0xbba0a493,0xbb9920c1,0xbbb7ea74,0xba727b7d,0x3ade203f,0x3a8060e1,0xba0bad7b,0x3b3c97b8,0x3b191324,0x3b26c829,0x3b1e44f4,0x3acd0768,0x3b229db9,0x3b193052,0x3afb43ca,0x3b02d23e,0xbaab6129,0x39d36015,0x3ae54b84,0xbba42bbc, +0x3a817055,0xbbd44b64,0x3b33c2c0,0x3a91cbfa,0x3a44b5d6,0x38da88ed,0xb99b1dac,0xb99240fb,0x39e81828,0x39825f5d,0x39e96054,0x3a9942d6,0x3a0ea852,0x39ff6c18,0x3a0ed02d,0x3a5ce174,0x3a763f45,0x3a82ddf7,0x3a4c2a6a,0x3a5106ab,0x3b165ccb,0xbbd0dc95,0xbbe1b584,0x394883ce,0xbbb0c48a, +0xbbe82ce4,0xba3174d8,0xba71c1cb,0xba87b8b6,0xba1e6233,0xbb10a5d1,0xbb2c0e4a,0xbb394dc2,0xbbe5fd07,0xbb9a2197,0xba152237,0xbbfb2105,0xbbc634ec,0xba67e9cd,0x3ad95c54,0xb9b94c4f,0xbad6ebd7,0xbb68c1d8,0xbb716704,0xba97d1be,0xba9adb70,0xb952c86a,0x3ac355dd,0xb841f999,0xb975dec5, +0xb88f2283,0x3a10d131,0x3a0bde09,0x3a047601,0xba00c3cd,0x3a7a7404,0xba9657b5,0xbb6d1c08,0xb8f7d780,0xbb074e6a,0xba8e2464,0xbac75a36,0xbabac713,0x3a9b7975,0x37bd2c76,0xbb3306b4,0xb9f04c4c,0x3a6994e8,0xbab01aec,0xba547020,0xbaf6887d,0xbb3d747b,0xba452bab,0xbbaa780c,0xb867fa50, +0x3b8558b0,0xba0c76a2,0xbb3afaa7,0xbbd36412,0xbbeec134,0xbb12df3f,0xbb5ca650,0xbb029189,0x3b01a6b5,0xbae01f02,0xbadfb775,0xbaf79e6b,0xb876e9ef,0x38dda706,0x39a92cb2,0xba3eefcc,0x3a877574,0xbac62b23,0xbb549a2f,0xba385d0d,0x3a7ca9fa,0xb9e97a72,0xbaacf00b,0x3a47695f,0x3b428504, +0x3bdb1036,0xb8c541b0,0x3b8ed5bb,0x3992e9ee,0xb8574205,0xb98c7d46,0xba80735c,0xbb0e3ecc,0xbb2938d1,0xbbb104ad,0xba5ed535,0x3b47c752,0xbb0b35d0,0xbbcf3260,0xbc610434,0xbc750890,0xbbc0362a,0xbbbe9041,0xbaedaafb,0x3b93fb7d,0xbaf0293a,0xbb84c664,0xbb97ddd0,0xbb2d5dcb,0xbb043524, +0xbb0bd22c,0xbb6a4e20,0xb98b2f5d,0xbae5a3db,0xba8f0321,0x3b9b8add,0x3b8e9f30,0x3b4856d7,0x3b1e05a7,0x3a8d6437,0x3bb3c4cc,0x3be5e740,0x3ba55d4c,0x3b800a80,0x3b5a0618,0x3a5cd442,0x3abf9c89,0x3909a867,0x3b314f97,0xb982e535,0xbc176a94,0x3aefa4e8,0x3c014633,0x3b9035b4,0x3bd63cba, +0x3ba362c9,0x3b44777b,0xb8a6d459,0xbb76d5f5,0xbba8f3ce,0xbb8e0b07,0x3b0101ad,0x3c0b338d,0x3c7ab850,0x3c12c7a8,0x3bddab9a,0x3c2d6605,0x3bb45d2f,0x3b8db35d,0xbb59449f,0xbba4e8d0,0x3acdd8ab,0x3af64830,0x3b41248c,0x3b7dfce8,0x3bf0df75,0x3af3c5c6,0x397f8e20,0x3b55c5fe,0x3c198ded, +0x3c2d32ca,0x3afdbf47,0x3ad6e815,0xbb941ced,0xbc4ef099,0xbc4b8c6e,0x3a47711e,0xbcb98f5b,0x3aae005d,0xb857425b,0xbb95e958,0xbc3148ab,0xbc54d424,0xbc551990,0x3b07af42,0x3bf535d4,0xba3a4d14,0x3ace5276,0x3b0635e4,0x3b312f03,0x3b4fbd9b,0x3acf902b,0xb9818da7,0xba825739,0x3b168ad7, +0xb602b3c8,0x3a7874fc,0x3af9e98b,0x3a42daff,0x3bee7313,0x3bcb0ce8,0x3b5c0cd9,0x3b7e415b,0x3baa8ec0,0x3bdfbad7,0x3b11513a,0x3a0b3897,0x3aa56e91,0x3b47f5ce,0x3b9cb625,0xbb3c41d7,0x3c5287ac,0xbbd77159,0xbbca13c0,0x3b35c82b,0x3aae91ee,0xbbbc95f4,0xbc5c505c,0xbc5cc26d,0xbc1fb8a4, +0x3b9155ce,0x3c27e34d,0x3ba5a447,0x3b9b0c45,0xba1d28d2,0xbbbdf772,0xbbb1f4a7,0xbb1a5a04,0x3b86ff29,0x3a999e2d,0x3b023640,0xbb71a55d,0xbb99f4c2,0xbb2f6940,0xbb935739,0xbb1c1bd9,0xb9d3d10b,0x3b3eda50,0x3b135f29,0x3ad94830,0x3af90506,0x3ad2dfa0,0x3b0af74d,0x3940a39a,0x3ae098a5, +0x3b9c79db,0xba9e3f48,0xbb89b587,0x3b878584,0x3b7ffb13,0xbb72513b,0xbc327d87,0xbc4eb889,0xbc3ed660,0xbc124314,0xbaf0cfd7,0xbbf678e8,0xbc22c39c,0xbc65b0aa,0xbc178b01,0xbbb8196c,0xbb222336,0xbb7b08b2,0xbb2d84fc,0x3ababee9,0x3a937f61,0x3b572db0,0x3aab8178,0xba92d714,0xb8e9fa1b, +0x3a04a83a,0x3b1a73ae,0x3b0139f2,0x3a997c08,0x3af2d326,0x3a412d37,0x3a79719b,0x39c278bd,0xb8d303f9,0xbac13807,0xba75df20,0xb85db589,0xba49f474,0x3b8268cf,0xbc68e617,0xbc8baf82,0xbc8d2651,0xbc83588e,0xbc4a3509,0xbc5ea9ab,0xbc41eee2,0xbbfe8f63,0xbc4c8740,0xbc50e9ba,0xbc473454, +0xbc20bd30,0xbbf185cb,0xbbb11572,0xb98e63d2,0x3b08570c,0x3b6af1cf,0xb8139a46,0xb9bda680,0x3982fd22,0xbaa96f15,0x39d8225e,0xb85f404c,0x3aad3d2b,0x3a964075,0x3a62c6ef,0xbab439ea,0xbb039e26,0xbb2ea612,0xbb18b4ea,0xbb9c5992,0xbc0cd3bb,0xbc48244b,0xbc83d142,0xbc9cdcce,0xbc933534, +0xbc78bb7c,0xbc86fc45,0xbc45c6bb,0xbc48594b,0xbc2dccda,0xbc4c2651,0xbc46ecd7,0xbc30b77a,0xbbb6b4fe,0xbb1f557a,0xbae8e324,0xbb0e503c,0xbb3a9db9,0xbb598038,0xbac9d1cb,0xb7845f3a,0x3b86de76,0x3b2fc140,0x3b4d3e4e,0x3b5dc8db,0x3b4d71d5,0x3b25173d,0xbaad542f,0xb7b86934,0x39ee603d, +0x3a9a3ade,0xbb21abc6,0xbb9a3224,0xbb9964fa,0xbbf19d4d,0xbc0ec225,0xbc16d0fd,0xbbf5287a,0xbbe5cb58,0xbbbc981c,0xbc45ccec,0xbc868a4a,0xbc7fab9f,0xbc45389b,0xbc3b0f7c,0xbc0e9d35,0xbbd12717,0xbb615018,0xba92d270,0xbb0a0e72,0xbb3b61a9,0xbb4d1315,0xba6cf36d,0x3a8fb745,0x3b366295, +0x3b812a17,0x3b9ce3d0,0x3bca413e,0x3b79c7c2,0x3b60915e,0xb943db25,0xbb33856f,0xbab0f800,0xba76adf3,0x39aec885,0x3a4201ed,0x3b2af682,0x3ab9174d,0x3aaac97b,0xba28bbf0,0xba86fcb9,0xbb5198c0,0xbb97bcd7,0xbbfbf27b,0xbc383a45,0xbc687687,0xbc71e787,0xbbb02ec1,0xbbbc50a1,0xbbac005e, +0xbbc39f90,0xbbcdb5cd,0xbbdb27bf,0xbbeacad0,0xbbee33b8,0xbbbdf42d,0xbb87a78f,0xbb45ad91,0xbb119c98,0xbaf57646,0xbae5d317,0xbb01218e,0xbb064f34,0xbaecfccf,0xbae4fb81,0xba82fe62,0xba93616d,0xbb8657b1,0xbac68bd8,0xbb23fabb,0xbad4ef28,0xbb097bcf,0xba950912,0xba99c660,0xbb23200d, +0xbb6704a2,0xbb1c915b,0xbac364dc,0xbaf5f7aa,0xbb1521f7,0xbb3bf8dd,0xbb6d232a,0xbb544df6,0xbbee0ae7,0xbb1665a9,0xbb3b5387,0xbb3cd1cd,0xbb356ddf,0xbb3696f9,0xbb326a32,0xbb429a86,0xbb209214,0xbb1474ae,0xbb0127fa,0xbae049c3,0xbaaff1d1,0xba5c15ca,0xba703eea,0xba80f7fe,0xba93b695, +0xba965fb8,0xbab561c9,0xb98f3e19,0xbbc07c0a,0xbbf4b6ea,0xbbacdcdb,0xbba25a13,0xbbf21f65,0xbb93f87c,0xbba1700f,0xbb9bdc7f,0xbb8eee16,0xbbaa3025,0xbbb464fc,0xbbb6a430,0xbbfa5559,0xbbc00b30,0xbba91dad,0xbc066a4b,0xbade05f9,0x3bc1d5cf,0x3c242fae,0x3ba94bfa,0x3ba8d742,0x3bb2dd98, +0x3b983d90,0x3bc88dfb,0x3bd4e911,0x3bd40fed,0x3bcdb94a,0x3bc9841b,0x3bcfdde9,0x3bb9a059,0x3bb7fd77,0x3bbf61a8,0x3bc2b9bc,0x3bc3557b,0x3bc412d5,0x3bbeed91,0x3bac8375,0x3ba40667,0x3c201895,0x3becc799,0xbb271231,0x3c1eb4d5,0x3c0029dc,0xbacff889,0xb97e15c2,0x383f8fe1,0xba18f23f, +0x3a0eea2c,0x3a1f94e0,0x39e896dc,0x3c032e8a,0x3c233117,0xbb032711,0x3bf6bfd8,0x3b91004a,0x3bea316c,0x3b8e86eb,0x3bb0b7c4,0x3b6c9352,0x3bedfc4c,0x3c0ecc4e,0x3c13327a,0x3c105825,0x3c09e098,0x3c10e6ae,0x3bd0b502,0x3bbb3ef3,0x3bd2d504,0x3be480a3,0x3bfb1546,0x3c00ba49,0x3bf5e0f3, +0x3bbc81b7,0x3be8f288,0x3b814d9d,0x3bb062a6,0x3bf18f2d,0x3b98a0b9,0x3ba0a1b7,0x3be45f83,0x3bfbda78,0x3c1c10c3,0x3c09dd00,0x3bfeba1d,0x3bc0aa11,0x3ba014b5,0x3bbc052b,0x3bab48f0,0x3bcf04c4,0x3bcd65d1,0x3c080088,0x3be625cb,0x3b9ed62b,0x3bb682f1,0x3aaf43c5,0x3c13c404,0x3c464d89, +0x3c469d4d,0x3c3f5827,0x3c2c97dc,0x3c40381e,0x3bf16ed4,0x3be64ffd,0x3c0ca7e5,0x3c176908,0x3c1dffe3,0x3c1e60df,0x3c05085d,0x3bc4f8d0,0x3bb19b41,0x3bd5c1d3,0x3badcd2d,0x3ba2285b,0x3b8c3858,0x3ba51782,0x3ba6a61a,0x3bfc83cf,0x3bef467b,0x3be4bd78,0x3b9da76e,0x3bb460d9,0x3b82f20d, +0x3b978598,0x3b9306c4,0x3b98c333,0x3bc9673c,0x3ba566d6,0x3b9e9acb,0x3af1ef2f,0x3b462a09,0xbb427f9e,0x3bfa8b70,0x3c60b5c4,0x3c83dc8d,0x3c846f89,0x3c7ea72e,0x3c88ecaf,0x3c1401a9,0x3bd88b48,0x3c0aa6e1,0x3c312bba,0x3c54cbc3,0x3c561d91,0x3c2b30f7,0x3bb8cfcf,0x3b941d01,0x3b89a512, +0x3b57afc5,0x3bd582ac,0x3b808a40,0x3b119a3b,0x3a1952ea,0x3bbea17f,0x3be77157,0x3b2ffe46,0x3b86804b,0x3b240947,0x39974566,0x3b045493,0x3b805e2b,0x3b620571,0x3badf20b,0x3c3f01a1,0x3c8544d8,0x3c4f6939,0x3c4ed828,0x3c5da908,0x3ca6b02c,0x3cb2e6e0,0x3c933e92,0x3c03ed5b,0x39be995b, +0xbb4791d9,0xbb2df506,0x3b013c38,0x3c17bb62,0x3bf0b68c,0x3bd99a26,0x3bab66af,0x3c008704,0x3c1317f8,0x3c1b7be0,0x3bbfe9ca,0x3b65d31c,0x3b9c0010,0x3b7fd5e9,0x3ba6d040,0x3bef7e21,0x3b014ffe,0x3a7ef480,0x3b97df46,0x3c364556,0x3c33092e,0x3b831f39,0x3b7726a5,0x3a8ab0c9,0xbbb499e5, +0x3b92804d,0x3bca49ce,0xbc8eabf3,0xbb8a33a7,0x3b4ac22a,0xbb5a819e,0x3af3e57b,0x3b2918a0,0xbaf93de0,0x3c0a62ea,0x3c2886c2,0x3ae93024,0x3b4de7b6,0x3ba3d2e3,0x3c1e1774,0x3c3e7d9b,0x3c72b929,0x3c9a9e4f,0x3c6799bf,0x3c15e981,0x3bc7f6d9,0x3b6d0973,0x3b559286,0x3b8a6093,0x3be86d2a, +0x3bd09d0c,0x3b65f065,0x3b913dd7,0x3bbd14f8,0x3be2526c,0x3afb0016,0x3abfc366,0x3b4133d5,0x3b9aa4ae,0x3bcf5cd6,0x3b6535f5,0x3c45fe72,0xbb45ed60,0xbaaae105,0x3c004835,0x3c6fe1e6,0x3ce6f2be,0x3cd0ae68,0x3cc87644,0x3ca8f1c0,0x3c67a7f5,0x3c2e2e85,0x3c1769f1,0x3c69780d,0x3c753d28, +0x3c4c9f3e,0x3bd55e8e,0x3b5672d2,0x3b9a240d,0x3aaaf615,0xba8591c5,0x3aae24b3,0x3b031ab4,0xb9e20622,0xba1e906c,0xb77f523f,0x3a8f080b,0x3b65eea8,0x3b283719,0x3aed3ad2,0x3b11c22f,0x3b1a336b,0x3b3ca7d6,0x3aacd5b8,0x3bb1987e,0x3bb9f9c2,0x3b39d878,0xbaf9dfb7,0x3bbd7952,0x3c07fd74, +0x3c8351d6,0x3cca782d,0x3d0b285f,0x3ce1d65e,0x3ca2c93e,0x3bd60376,0x3bc433f4,0x3ba21dce,0x3b3f59e8,0x3b6ecf40,0x3b8ec4e8,0x3b921b36,0x3bb2f3a9,0x3bfc3137,0x3c26c00c,0x3c0f8459,0x3bbcd527,0x3b7948f8,0x3ad71216,0x3a9e1d4c,0x3acf70ff,0x3b2e5af0,0x3b1ee2ed,0x3af32d93,0x3aef6370, +0x3b0bf89d,0x3ab10bff,0x3a6df99d,0x3982755c,0xbb112af4,0xba522857,0x3a4fc1d4,0xba82933b,0x3b36dd15,0xbbe795ce,0x3bd1baf9,0x3c856f96,0x3c947b01,0x3c9964a6,0x3c93e491,0x3c7dd3ca,0x3c35dd62,0x3b79a6f1,0x3b5ad050,0x3c2853e1,0x3bf6e52c,0x3bf1ba6f,0x3bf0f833,0x3bc0057c,0x3b876242, +0x3b27bc11,0x3a0df59f,0x3a15c2ae,0x3b6bcead,0x3b628798,0x3b25ad68,0x3a0c1e61,0x3acf7b29,0x3a8b4419,0x3a21d89c,0xba054503,0xbaaf1657,0x3961ea59,0xba019500,0xbb114708,0xbba866cb,0xbc1f5f88,0xbc52e1de,0xbc775552,0xbbbba76d,0xbc10c44f,0xbaace636,0xb9a29993,0xbb1d5a9b,0xbb984cd9, +0xbbfdf5d9,0xbbf27ca0,0xbae92823,0xbb88caa7,0xbb9837cb,0xbb919a8d,0xba9aadd4,0x3af33c47,0x3b668cdf,0x3bc34893,0x3bdcc906,0x3bcb9da2,0x3b7ebd27,0x3b1d6b78,0x3b2a8539,0x3b54dfc1,0x3b66934f,0x3b72fd62,0x3b5b8d55,0x3abc63ef,0x3a4686dc,0xbb50801b,0xbba6a8a6,0xbbc96785,0xbbe7666f, +0xbbfaca6f,0xbbfe5a8b,0xbbdc7989,0xbb69eec3,0xba8d84f3,0xbb060956,0xbc069e91,0xbc29230a,0xbc16e00e,0xbbe44be1,0xbb9e520d,0xba8c1194,0x3affb98f,0x3ba3dc72,0x3b930407,0x3b97edea,0x3b84e422,0x3b89c5dd,0x3b799a5d,0x3b65c37f,0x3b872814,0x3b9b911a,0x3bb6fe98,0x3bac400e,0x3b9d2d68, +0x3ba0fa4c,0x3b750c2c,0x3afe7edb,0x3a242dbe,0x3a8d3291,0x3ad3bc66,0x3b251678,0x3ae778ee,0x3a0d8c3f,0x3a95993f,0xba9e92f5,0xbac34a07,0xbb312093,0xbb9596a0,0xbbdb5626,0xbc0fc9bc,0xbc13e559,0xbb919aa2,0xbb36f717,0xbb371251,0xbaf53032,0xbad68e34,0xbaa25084,0xba696566,0x38fe3446, +0xb9e701ff,0xba4f64d7,0xba857734,0xbaadbbf3,0xbaa988ea,0xba85b9e5,0xbaa8fb16,0xbacfdff7,0xbaf593b7,0xbaf68d68,0xbb1ac07e,0xbad5fcc1,0xba5656eb,0x3a3ff34f,0x3b3176e7,0x3b02a5b8,0x3b4ee8af,0x3b9d8e77,0x3b649c73,0x3b6e3414,0x3b385c79,0x3af6b326,0x3a289cc7,0x39ad62c5,0xb9afcf3e, +0xba8557f6,0xba3682ee,0xbac4b91f,0x3b2807ce,0x375a648a,0x392503b0,0x3a14de2f,0x3a57d9ba,0x3a98badb,0x3aba5ddb,0x3ae5223c,0x3abf93a9,0x3ab5ab09,0x3aa7fb13,0x3aa0dba8,0x3a8edeb1,0x3a76ba2a,0x3a6c25cf,0x3a6e69af,0x3a58af9f,0x3a64c19e,0x3a4c78c8,0x39bd92da,0x3b574143,0x3b208806, +0xbb59635a,0x3b93643a,0x3b65f0e3,0xbb2cdcd3,0xbb21f346,0xbb1b146d,0xbb2a4e8b,0xbb0b1afe,0xbb109909,0xbb1f4903,0x3af7b82e,0x3b4fba4c,0xbb93366f,0x3a841e0f,0x3b217207,0xbba19ef5,0xbb9d5a51,0xbbaf9317,0xbb7e41fd,0xbb9f9c03,0xbb9cc3b8,0xbbc51617,0xbbce1c16,0xbbbe3ddf,0xbbc19422, +0xbbbade37,0xbba0f665,0xbbba4aea,0xbbbd8aca,0xbbbe1495,0xbbb3c3b8,0xbbada040,0xbba53f39,0xbba81103,0xbb8c90b0,0xbbb9a914,0xbb99c893,0x39c41220,0x3c3ff555,0xbbcd1a96,0xb9531aeb,0x3c3239a4,0x3c32013e,0x3c2f1b91,0x3c2134b8,0x3c1bd224,0x3c174d74,0x3c0cc242,0xb9bd3180,0xbbd844c5, +0x3c30f658,0x3a1b22d3,0x3b3afaac,0xbbd9df56,0xbb8a17fe,0xbbb05a7d,0xbbb7b08d,0xbc16abdc,0xbc24760f,0xbc084519,0xbc090595,0xbbfb3c68,0xbbc05302,0xbc0268fc,0xbc0dbd41,0xbc0dc1f5,0xbc0745cf,0xbbfc6155,0xbbe60994,0xbbdc3537,0xbbb6a1d0,0xbbcffbc4,0x3b6892aa,0xbb200935,0xbb5faaac, +0xbabaec64,0xba048f51,0xbb27bb36,0xba9ef6c1,0xbb16352f,0xbb0cc783,0xbb5659fa,0xbb3fd0fb,0xbb09ec6b,0xbb1c0c2f,0xb918af86,0xbacb1ac5,0xbb98b747,0xbb2bc7b2,0xbb566d29,0xbb4e5078,0xbbb639ed,0xbbc57e2f,0xbc4adb38,0xbc6de12a,0xbc3ac7ab,0xbc47b243,0xbc359905,0xbbea7641,0xbc39e430, +0xbc406b4b,0xbc4180bd,0xbc2ad4ef,0xbc1c3461,0xbc08a7c5,0xbbf23121,0xbbdecabc,0xbb801818,0xbac7c663,0xba9ed2f5,0xba8c3fbc,0xbaf554a3,0x3a300758,0x397c600b,0x3ba1cd86,0x3b671811,0x3b00ff62,0x3b282ad2,0x3aff6f29,0xb89343b6,0x3a6e4588,0xb918b61d,0xb9b75ecd,0xbb33640b,0xbb5bd31f, +0xbb8dea43,0xbb2411ff,0xbb978806,0xbbd411ea,0xbc919266,0xbcaa61d6,0xbc765e0e,0xbc74f0a0,0xbc50c1fa,0xbbcfcd69,0xbc5b72a3,0xbc8d0d35,0xbc9581ab,0xbc8e5ca9,0xbc747d42,0xbc4fb0db,0xbc31ab0b,0xbc04e5b3,0xbbb3a7bb,0x3a2263b8,0x37674a83,0x3b5cbdfb,0x3a6d0539,0x3a958726,0x3ab6d53b, +0x3bb95011,0x3bfde5a8,0x3b7241b3,0x3b60c973,0x3b28f32d,0x3a85a5f2,0x3ad598bd,0x3a82849a,0x3ad314ed,0xbb3a7c94,0x3a9d7c85,0xbb0f4b46,0xbbf077c2,0xbc1ff564,0xbbcd2c97,0xbb7b525b,0xbbb497ad,0xbc68af0b,0xbc68de98,0xbc832d32,0xbc8b0d8f,0xbc658e16,0xbba89293,0x3c2f549d,0x3b9bf715, +0x3b186fae,0x3a49a50c,0xbb0566bf,0xbb9400a4,0xbb7f8641,0x3a8a02fe,0xb91c3714,0x3a938e5f,0x3aa4c910,0x3b35bd26,0x3bdbde0a,0x3ac13dc4,0x3a72bb84,0x3bc31f3a,0x3c1e1393,0x3c0c3bf3,0x3ac5aaf7,0x3a37982b,0xbb48d655,0xbc0c0c57,0xbb55eb70,0xbc13c364,0xbcc520a9,0xbaece651,0x3a99834e, +0xbb867890,0xbc070a82,0xbc10ccdb,0xbbfa335e,0x3a4e8889,0x3b8e14a9,0x3a240e5a,0x3a726938,0x3a90ae77,0x3ad5ea19,0xba253001,0xbb8127e8,0xbc0daa79,0xbbf60472,0xbbb16075,0xba7d077e,0x3acf8fc3,0x3a804a3d,0x3a35e0d9,0x3b898494,0x3b8c9a10,0x3b35f867,0x3ba4b431,0x3bce0cd7,0x3bc76916, +0x3a881cef,0x3a8a7ec0,0x3b5b3cfe,0x3b5f38c1,0x3b0267b0,0x3a3f072c,0xbadacd12,0xb9db1b95,0xbb25e4e5,0x3b93000d,0xb97835d6,0xbc862c54,0xbcd6c3e6,0xbd021aef,0xbcf37824,0xbc932680,0xbc072af4,0xbb8efd50,0xbc346add,0xbc80afe6,0xbc90c78c,0xbc835b0c,0xbc1da605,0x3afcc140,0xbacd7f9c, +0xbb816aa6,0xbbc24839,0xbbb68ef3,0xbb8408ab,0xbb482446,0xbb5fed08,0xb9c90e04,0x3b5de03d,0x3ae7d868,0x3a91c736,0x3ad15ce2,0x3aeb9bab,0x3adfd83f,0xba2299c4,0x3b7a55d2,0x3bac22c7,0x3b01db61,0xb8c43d0f,0x3b3e936d,0x3b64b7a0,0xbc053f7a,0xbc8b3d2c,0xbcf1c2d3,0xbcb49e9b,0xbc618407, +0xbb271872,0xbba0a8f5,0xbbcba326,0xbc01446c,0xbc111940,0xbbfdb0a3,0xbbbe4d5a,0xbbfc3421,0xbc03f408,0xbbadead6,0xbb8ef2d5,0xbaaa303f,0x39a8524c,0x3a20a45d,0xbab41c67,0xb9d82f98,0x3a0204e1,0x3a1905fe,0x3a4c4e95,0x3b10de13,0x3adb3673,0x3a28b13b,0x3a815f38,0x39de6bc2,0xbb45f6df, +0xbafd370e,0xbb39f383,0xbb20e836,0x39f126a2,0xbbe24c9f,0xbc7c2038,0xbce5096b,0xbcceab5c,0xbca64516,0xbca93ec4,0xbcac9f70,0xbca21f9b,0xbca612e8,0xbc9799e8,0xbc887ddb,0xbc57a083,0xbc1bde51,0xbbf2803c,0xbb04f0cf,0x39bc228e,0x394da60d,0xb9fdcea1,0xbad83662,0xbabd12e8,0xba9950b6, +0xbafeede6,0xb947a522,0x3a31e46d,0xb95e78b8,0xbaf2da68,0xbab8991a,0xbae63c6e,0xbaf0d382,0xbb374f1a,0xbba4a37e,0xbc06af17,0xbc404a40,0xbc68fd69,0xbc4f419d,0xbc82b13c,0xbb5bbfc5,0xbc5886a4,0xbc7cede5,0xbc792055,0xbc8ee2ec,0xbc8f5823,0xbc89803e,0xbc8bbdac,0xbc1edc37,0xbbaa7513, +0xbb2a08ed,0xbb88e544,0xbbaab761,0xbbad2347,0xbb7f14fc,0xbb37c4af,0xbad9a943,0xbb0915f9,0xba028939,0x3b50a8df,0x3b2e2bde,0x3aeeae0f,0x3933caed,0x38557b3c,0xb9ae9398,0xbaafb5f0,0xbbb4bb84,0xbbeb0e84,0xbbe8a825,0xbc0b8f02,0xbc1bbad8,0xbc2af7ee,0xbc1b3e44,0xbc11584e,0xbba6cfbd, +0xbc1efdcf,0xbc6dc15f,0xbc77d29b,0xbc6c6ed6,0xbc665c5f,0xbc5da6a6,0xbc457235,0xbc2ff5a9,0xbc22c626,0xbc11d795,0xbc04bb56,0xbbd658c2,0xbb4b69b8,0x39360b0e,0x3b506cf4,0x3b3e43d9,0x3b43a246,0x3b54e728,0x3b121389,0x3a8f265d,0x398d8580,0x3a011fff,0x3a13b7dd,0x3956cabc,0x3940e702, +0x3a800fb0,0x3a93b826,0x3a990f59,0xbb036bb6,0xbb065ea1,0xbb57d424,0xbb3c0575,0xbb8a27ab,0xbbd53a65,0xbc15b599,0xbc2dcdbf,0xbc51d124,0xbb132f48,0xbc0ba440,0xbc035b7b,0xbc08b99d,0xbc0974e2,0xbc0ec2b8,0xbc109dba,0xbc0f9ded,0xbbdcb216,0xbb9aaf5a,0xbb4efa52,0xbadf6cb3,0xba17679a, +0x3a6f6ce4,0x39a1539b,0x38165dea,0xb963f6fb,0xb9bbffe9,0x395899a9,0xba784f47,0xba9bfd54,0xbb09eb3c,0xbb40f362,0xbab01bca,0xbae1885e,0xbb38e2ee,0xbb705937,0xbb929bf9,0xbb7dcda7,0xbba23443,0xbb9d322c,0xbb836a45,0xbb9af076,0xbb7695ef,0xbba21ad7,0xbbd2472c,0xbba807f8,0xbbb61ff1, +0xbb95504b,0xbb9ece75,0xbb9b0eca,0xbb9a1067,0xbb98f594,0xbba4dc23,0xbb8ad107,0xbb75b10c,0xbb4ced02,0xbb279469,0xbb020075,0xba9cc344,0xbabc639b,0xbabe5c4f,0xbac57db7,0xbae065fd,0xbae5d749,0xbae39d13,0xbb57ad30,0xba93cfad,0x3b995709,0xbb850acc,0xbaaf9f46,0x3bc45abd,0x3bb5deda, +0x3ba9be7d,0x3b9493a3,0x3b8713bd,0x3b683fb7,0x3b3eb155,0xbb1322a2,0xbbb9589a,0x3b68cf7b,0xbb0d0e89,0xbb5855f5,0x3bfce0e0,0x3b90b9d7,0x3c219a1d,0x3bd6784a,0x3be46b8e,0x3bbf5843,0x3bf15b1f,0x3c01be99,0x3c099db5,0x3c052f48,0x3c033f71,0x3c074fd8,0x3becc588,0x3be56b11,0x3be6447d, +0x3bf717ac,0x3bfed208,0x3c035e67,0x3c017b87,0x3be3fc0b,0x3c14c9d0,0x3b7f0eb9,0xbb1462ae,0xbc3d59eb,0x3bbb1c09,0xbab170cf,0xbc247f7b,0xbc1c3d47,0xbc18b9f9,0xbc0f0779,0xbc16c73a,0xbc184564,0xbc14ed1f,0xba616264,0x3bebe9a6,0xbc2d6acb,0xbb221538,0xbba39f88,0x3c1bfc0a,0x3bd9f25d, +0x3bc3eabd,0x3b804d3c,0x3be7dad9,0x3c10c465,0x3c2a5f74,0x3c2c6213,0x3c297f1d,0x3c310718,0x3c001b15,0x3be1d36c,0x3bef361d,0x3c0c32ba,0x3c1c51f1,0x3c29462e,0x3c1c8296,0x3c120a34,0x3c04cbb8,0xbb873ee9,0x3b871ff2,0x3b6bc5ec,0x3b144364,0x3b016eda,0x3bc08fd6,0x3beaf811,0x3c043667, +0x3ba01be1,0x3be8169d,0x3bdd4877,0x3b6d2d14,0x3baf2e2b,0x3b1feac6,0x3b233fc9,0x3be0e5fe,0x3b8c751c,0x3c1d5bc3,0x3c0a1da2,0x3bafc999,0x3acd605f,0x3bf4c024,0x3c317c7d,0x3c67b9bf,0x3c5d1395,0x3c4f6840,0x3c630702,0x3c020538,0x3bdc48d2,0x3bee5078,0x3c237fac,0x3c3989de,0x3c5098a5, +0x3c3056a6,0x3c319596,0x3babb5e4,0x3b111ca1,0x3b30a476,0x3ae1a85a,0x3b3a2205,0x3af5889f,0x3bbf528d,0x3baba23b,0x3c198b61,0x3b8f5f56,0x3bbf0684,0x3b53f5bb,0x3b557e14,0x3b6b504f,0x3b5c5e50,0x3ac78a76,0x3ba602c8,0x3a1b9426,0x3c0a0e93,0x3bbe1bb5,0x3b0a4d74,0xbb79fbfb,0x3b36669e, +0x3c12c994,0x3c84115d,0x3c89803d,0x3c8a7352,0x3c9abd92,0x3c1e0f27,0x3bb8f524,0x3bd42cbc,0x3c2b750f,0x3c6714e6,0x3c8589bf,0x3c597813,0x3c3546fa,0x3bae3d65,0xb98ef047,0x3b860b8e,0x3ac75724,0x3b80809b,0x3b68344f,0x3b6dd2b6,0x3bf70d1d,0x3bf8ba3f,0x3b95ee0b,0x3b850fa9,0x3b7f0c96, +0x3abeb6c2,0x3b87d822,0x3b99c57c,0x3b460843,0x3ba82bd2,0x3bfb7d2f,0x3c967bda,0x3c86aa06,0x3c5e348b,0x3c67c186,0x3cc8f695,0x3cd34c94,0x3c9a2d4c,0x3c82c625,0x3c14baa2,0x3b6e5cfc,0x3b0817d5,0x3bc17f70,0x3c71bbbd,0x3c40afb5,0x3c31c13f,0x3c5e56df,0x3c50a3f9,0x3c740285,0x3c2312e1, +0x3b301bf9,0x3be00c8b,0x3b98aaa6,0x3b67b6c3,0x3b508797,0x3bc545ed,0x3b014f21,0x3b10b830,0x3bff1722,0x3c2f3ede,0x3c0befec,0x3b46a012,0x3b05204e,0xbb134507,0xbbbaf548,0x3b6973bc,0xbc22a6c9,0xbc2a6bda,0x3bcb4c94,0x3c06110f,0xbb3e26cb,0x3aced447,0x3aba4342,0xbb2bb4ab,0x3bbe9cff, +0x3c0dd3f6,0x3bbcb38f,0x3b02dfdd,0x3b1b4ae6,0x3c00c912,0x3c575572,0x3c929a31,0x3cb68774,0x3c61c75c,0x3c289778,0x3b9fc3d3,0x39154012,0x3abb42fe,0x3b26db7d,0x3bcec90b,0x3bd7d7b0,0x3b5f9d8a,0x3bc3537c,0x3be7ffc4,0x3bcc8373,0x3b0f1618,0x3b15853d,0x3bc075d4,0x3b6c411c,0x3bd6b551, +0x3c000c28,0x3a97235c,0x3ae57dd2,0x3ba7d54f,0x3c3bedd9,0x3c80dc54,0x3cd9a0db,0x3cc48a6d,0x3cb95ef9,0x3cb04470,0x3c842b85,0x3c602c45,0x3c80db05,0x3ca24df9,0x3cb3f341,0x3c99f775,0x3c630e1a,0x3bfeab8d,0x3ba0ab4b,0x3a58549e,0x3adc5791,0x3b0bb6db,0x3a2b9a08,0x3a612f5c,0xba03d629, +0xba4fee6e,0x3a9b4ee3,0x3b7d246b,0x3b39724f,0x3b1e55bc,0x3b14331e,0x3b396f49,0x3b212ad3,0x3601f178,0x3b8d275d,0x3bbfa03a,0x3b0e8480,0x3b43b12a,0x3a89d3fe,0x3b8432ba,0x3c6741f4,0x3cb0be47,0x3d0b743c,0x3cedabcd,0x3cbfe246,0x3c7f05d0,0x3bde167d,0x3b4cd72a,0x3b8242af,0x3a8819c8, +0x3a9703ac,0x3add11e3,0x3bb30d8b,0x3c11996c,0x3c4cbf67,0x3c3a9514,0x3c142e0c,0x3b91a8cd,0xbaa7bd69,0x3941ead3,0x3ac68c2a,0x3a7eb775,0x3a8fa118,0x3abfb8c8,0x3b39017e,0x3b40f617,0x3ac0c242,0x3b07b607,0x3ac7fa87,0xba866de6,0xbae33112,0x39589c6c,0xbb413d3b,0x397ecc76,0xbc5c4673, +0x3b11e78d,0x3c83830f,0x3c8bb2cd,0x3cac32cf,0x3c96ab6b,0x3c72d5db,0x3c14fdef,0x3b853df2,0x3b7b26fa,0x3c0b41f1,0x3bc4f225,0x3bccdc8e,0x3bdebd08,0x3b8f938a,0x3b117845,0x3aa10c61,0xba09c691,0x3a75137e,0x3b73cd33,0x39f076cd,0x3b069d7f,0x3a1d2aa1,0x3a827d11,0x3a023bc6,0xbaaa7e30, +0xba61e8b7,0xb9f64880,0xba487b25,0xba6ad77a,0xbb72752d,0xbbd92c2d,0xbc268e38,0xbc4940f6,0xbc4f88f3,0xbbf7b2b5,0xbc4e4505,0xbb0c22e6,0x3b286bee,0xba646357,0xbb10d1ce,0xba5409d4,0x3ad0bf5d,0x3ba2f4ad,0x3a600bd7,0xbacc1bc4,0xbb1ed187,0xb74d32c5,0x3b0889a6,0x3b7f521b,0x3bbdbf81, +0x3bd82aa8,0x3ba05946,0x3b8d5226,0x3b4e9b61,0x3ae6b432,0x3b1a1337,0x3b3989e2,0x3b023b10,0x3b39f685,0x3a8d8511,0xbabec06c,0xbb997ecd,0xbbd2e922,0xbbb934ba,0xbbdbd5db,0xbbf9e538,0xbc07d600,0xbc10ed1f,0xbbcd9c21,0xbb92f82f,0xbb3c568d,0xbbfc6445,0xbbd202f8,0xbb8e094a,0xbb942238, +0xbb6718fa,0xbad89389,0xb8b8efa9,0x3b142436,0x3b1af4dd,0x3b586f30,0x3b62453e,0x3b940f29,0x3ba68895,0x3bb4549c,0x3b9cd1de,0x3b8e39fb,0x3b8b25dc,0x3b98147a,0x3bbac169,0x3bac8379,0x3b3bed96,0x3b19e5dd,0x3b094e3f,0x3abff49f,0x3a05ff92,0x3a8f0d13,0xba5c0d38,0xbaa5858d,0xbb6c4248, +0xbb4536e3,0xbb54eeb0,0xbb13871b,0xbb86a950,0xbbce5043,0xbc116738,0xbbf7b65c,0xbc1e293f,0xbb8c37dc,0xbb463b85,0xbab1a990,0x39af06c4,0x3afc0c21,0x3b6aea0c,0x3bb12286,0x3b9def79,0x3b8df369,0x3b80ec5e,0x3b5c6baf,0x3b3dd01b,0x3b347654,0x3b3013e9,0x3b2d381a,0x3b2103c3,0x3b19164c, +0x3affb2d1,0x3b356262,0xba2ceb93,0x3b13981e,0x3b294bf4,0x3a980f5f,0x3a609fee,0x3b169952,0x3ae69026,0x3ab77b29,0xb9c44895,0x39a6fc29,0xb9faa6c5,0xbaf88030,0xbb126dcc,0xbb7c6410,0xbb74d0c9,0xbb3eefb8,0x38cef84a,0x3adb3b7d,0x3aab9190,0x3b0b7e10,0x3b284319,0x3b4a1bda,0x3b66f454, +0x3b8c4054,0x3b8171b4,0x3b8118bc,0x3b7e00fe,0x3b7ce0b6,0x3b797fca,0x3b6db301,0x3b6cae3a,0x3b6aecd2,0x3b6865c1,0x3b6c3e04,0x3b571725,0x3b81e681,0x3b1d9818,0xba732172,0xbbda5f7c,0x3b5608a6,0xba80a5fc,0xbbe53199,0xbbe48f38,0xbbdb421d,0xbbcd0f20,0xbbd617b6,0xbbd763f4,0xbbd553e1, +0xbb22058b,0x3ace9d49,0xbc0172c8,0xbb694ee2,0x3b88ead3,0xbba52e8f,0x3af2798d,0xbbde4c82,0xbb82687c,0xbba1849c,0xbb9a3d91,0xbbb453f8,0xbbbb70e1,0xbbb55f76,0xbbba1e7c,0xbbb8ea51,0xbba88bae,0xbbc0efda,0xbbc5c1fe,0xbbc883b7,0xbbbf3fde,0xbbb6b3d3,0xbba816e1,0xbba5639f,0xbb88b51f, +0xbbe79122,0x3ad9c2bb,0x3bf36694,0x3c58867c,0xba89666e,0x3be5ef1f,0x3c5b2ce0,0x3c642517,0x3c6395f7,0x3c4a05fb,0x3c5bdacb,0x3c5b52d6,0x3c4de677,0x3be3c0d8,0xbae0f265,0x3c5569cb,0x3c0b81e1,0x3c1a6009,0xbba1ea2a,0xbba18592,0xbb9e263b,0xbba075b1,0xbbe1ca32,0xbbf359c3,0xbbdfda57, +0xbbe74c66,0xbbe5ad71,0xbbc3f095,0xbc059a1f,0xbc17153d,0xbc1a48db,0xbc1640b0,0xbc041b37,0xbbdaeace,0xbbb170be,0xbbb2bc75,0xbb993f6c,0x3c05fa90,0xbabc99f2,0xba58bdb6,0x3932bd56,0x3af0f9db,0x398ba260,0x398e3063,0x39cabd95,0x3b0ce50f,0xba84b0f0,0xbb1294d4,0xb980c356,0xb9b55e0d, +0x3b49758f,0x3b10c1da,0xbb45fa0f,0x3b84f6b9,0xba19ea4e,0xbba0f8f1,0xbb9e3853,0xbbb3391e,0xbc0b9325,0xbc1eb4ba,0xbc1038f8,0xbc1d627d,0xbc1d8d20,0xbbf21034,0xbc3820b4,0xbc47d265,0xbc47d398,0xbc3aab15,0xbc1fbe00,0xbbf6a472,0xbbb533c0,0xbbd46077,0xbade0a97,0x3b2bfeb2,0x3a0a3534, +0xba84bec1,0xba87183a,0x3b545178,0x3aede895,0x3be43189,0x3b26d4b3,0x3baca766,0x3b0f936a,0x3b92c8c8,0x3a930529,0x3b560543,0x3b25b234,0x3b46688e,0x3a9c0b19,0x3b18e813,0xbab9f106,0xbb8c0ed0,0xbb6999e7,0xbb9f6981,0xbc2e05ab,0xbc3ffe76,0xbc1f48d5,0xbc259ef8,0xbc265490,0xbbda2991, +0xbc522129,0xbc8ee1b1,0xbc99a23f,0xbc97a242,0xbc6faf17,0xbc277611,0xbbdc4900,0xbbdcdff1,0xbb53cedd,0x3b653fa8,0xbb275492,0x3af07674,0xb9716924,0x3a592f6f,0x3b137676,0x3bd2a20b,0x3c09cadd,0x3b55070d,0x3b78f197,0x3b1e1509,0x3a6e3f32,0x3b3aa006,0x3b83a605,0x3afdc85b,0xba4882c5, +0x3c740a62,0x3b71ed19,0xbc1c6272,0xbc2edbcb,0xbc0db3b7,0xbae73a4c,0xbb177a52,0xbc5abb17,0xbc4c3674,0xbc8b3b06,0xbcb66ae5,0xbcb0e656,0xbc5b2ee1,0x3b635d68,0x3b065918,0x3a77ae2b,0xbb8a3b8a,0xbb7092b6,0xbbbec0cb,0x3a66ecf7,0x3c018786,0x3a9af5de,0x3b4528c9,0x3aba3a4c,0x3b20e0df, +0x3bb68966,0x3a90f9f9,0x3b09dae0,0x3c10d5d7,0x3c1967de,0x3bd7111e,0x3b3792f5,0xb953edd4,0xbaea3135,0xbb2cd6c0,0x3c084831,0xbc8432ce,0xbca35a32,0xbbb9bba4,0x3b113cfe,0xbb365836,0xb9c47fe6,0xba2575aa,0xbb565820,0xb9f8a10b,0x3ac56e54,0x3b5bd655,0x3aefeabe,0x3abf6d0b,0x3aec2bd1, +0x3a3c18c4,0xba664b31,0xbb8f3f13,0xbb8142fd,0xbbaf2a45,0x3a8913c2,0x3b291103,0x3a88bd7b,0x3b01d3d6,0x3ae85d25,0x3b2845ef,0x3b16d10a,0x3bc210b2,0x3bea707a,0x3badf71a,0x3a9ba77f,0x3b09e493,0x3b937248,0x3b667c4f,0x3b2591b6,0x3c0a400b,0xbc4c64b9,0x3bff9c15,0x3bc0d88a,0x3c18bf05, +0x3b9fdf8f,0xbbcb89c4,0xbc67a905,0xbcb3803e,0xbcb63b80,0xbcbc53a9,0xbc88fa06,0xbbd66301,0xbc5768e1,0xbc64f61f,0xbc65cee7,0xbc4cdf56,0xbc037f0b,0x38c4f3ed,0xbb25af51,0xbbd62f74,0xbb7bf8b8,0xbb2a87ef,0xbb3cad72,0xb85b9ba1,0xbb0667f0,0x3a0870e8,0x3b6ccb20,0x3ae89fe3,0x3a8a90af, +0x3aadff1b,0x3b1bba25,0x3afb974a,0xb9ba9c2d,0x3ba08e65,0x3ba6ccb4,0x3bbe5b92,0x3bbd9ca7,0x3962f18c,0x3acff3e6,0xbb83ab92,0xbbc6a3b9,0xbc7b6d77,0xbc04a7b7,0xbb039c33,0x3b89f928,0x3b0b531d,0x3a33ba3b,0x3b3cbbf3,0xbb6bc70e,0xbba08ef8,0xbb798258,0xbb86a26c,0xbb9495d4,0xbb5634d9, +0xbb0bea15,0xba9a0c2c,0x3a9d33d2,0x3b193e02,0xba66d826,0xb70654f7,0xb9b3b6a4,0xb964d8e9,0x39d72c4c,0x3b15d751,0x3b450c10,0x3a9a8c9f,0x3af5e149,0x3a5e6665,0xbb6090c7,0xbb0c7c33,0xbb4d4760,0xbb521498,0xbb3a94b5,0xba0524f4,0xbba75fca,0xbc8074ce,0xbc4fc8b6,0xbc36f3ba,0xbc3cd40c, +0xbc7130ec,0xbc96759f,0xbc758932,0xbc47233e,0xbc09dbbd,0xbbcb98ea,0xbb9071fe,0xbb361617,0xba86c6f1,0xb9b6d802,0xbac4e3ff,0xba01ccec,0xbac612ff,0xba65772c,0x3a90fac5,0xbabf8fa7,0xb984312c,0x39c22c8b,0xba20eea0,0xbb4e764e,0xbab528aa,0xbb0556b9,0xbac0ae7f,0xbb3b3e89,0xbb886e60, +0xbbc62d74,0xbc0caa42,0xbc1e3691,0xbbd3e3b2,0xbc0f1e99,0x3b14d8b3,0xbbc562ac,0xbc38cda0,0xbc2ff535,0xbc62f907,0xbc5a921d,0xbc559ae8,0xbc669c47,0xbbf1f1df,0xbb99b6e2,0xbb861163,0xbb888841,0xbb6c85ed,0xbb057142,0xbab49645,0xbae09d41,0xbb64f710,0xbb4bba1d,0xbae40f75,0x3b13914a, +0x3b12edf7,0x3aee4ded,0x3b304d5c,0x3a810099,0xba50d7b2,0xbb56d1de,0xbbd35287,0xbbedca4a,0xbc007baf,0xbc09fdaf,0xbc1b3c41,0xbc31e661,0xbc2c7c4e,0xbc1ed386,0xbbcc0ead,0xbbccf4e2,0xbbfb1252,0xbc2641bf,0xbc401fc0,0xbc36b6ec,0xbc45065f,0xbc37ea72,0xbc356ef5,0xbc37d468,0xbc1bf678, +0xbc017b05,0xbbbc398c,0xbb3fe614,0xb9773b64,0x3b37d1d2,0x3ab07182,0x3a3da0c5,0xb8dea924,0x39ada837,0xba67e653,0x3a1e84f0,0x3b4560c3,0x3b219fd0,0x3b163f46,0x3a0c9127,0x3a3ddaa8,0xba95b3ed,0xba0b4ff4,0xbba4c189,0xbb75f2ba,0xbba8d364,0xbb27e305,0xbb42b9b8,0xbb741eb9,0xbb8c1c42, +0xbb842cc7,0xbbdf695d,0xbb10b42f,0xbc12a4fb,0xbc09a985,0xbc01227a,0xbbf454ce,0xbbeaef3f,0xbbda8f9b,0xbbc5877a,0xbb977c78,0xbb5a74f1,0xbb0f78e2,0xba729e2d,0x39a1f3ad,0x3b1112f6,0x3aee3eda,0x3aeed8b0,0x3acc2823,0x3ac383b2,0x3ad5c781,0x3a562e4e,0x3b30167c,0xba38d3e8,0xba80cbe1, +0xb9da8651,0xba1097e8,0xbb292557,0xbb7e5600,0xbb7ff5dd,0xbb30ab72,0xbbaa67bb,0xbbcec754,0xbbac939a,0xbbccabf2,0xbba1f2a8,0xbbbbb491,0xbc043169,0xbb084d73,0xbbda1711,0xbba33a64,0xbba95548,0xbba3a64b,0xbb9ec6ef,0xbb9bf97f,0xbba0d8c6,0xbb8dec49,0xbb7ae35b,0xbb558241,0xbb3169d6, +0xbb126635,0xbad2b3ff,0xbaefd912,0xbaeea887,0xbaeb5456,0xbaff65ea,0xbaec0253,0xbb2a90b7,0x3987a7f3,0x3b6ee7b0,0x3bf17cba,0xbab27c8b,0x3b53d4f3,0x3c03ac9a,0x3c016d95,0x3bf1abfe,0x3bcd3de3,0x3bd557db,0x3bc6e9d8,0x3bae464b,0x3ad4f625,0xbb5d6b75,0x3ba52dac,0x3aeb8557,0xbb7a8fb1, +0x3b6f6296,0xbb4a2931,0x3be1df5f,0x3b4e3fc1,0x3b496f8f,0x3b1503b1,0x3b2d8e9a,0x3b441776,0x3b8097c0,0x3b693249,0x3b67c047,0x3b801ff3,0x3b4063b9,0x3b2c8033,0x3b1cf15b,0x3b489096,0x3b6231d2,0x3b810e8b,0x3b81ee53,0x3b64c599,0x3bbdcc21,0xbb70a29b,0xbc0103cb,0xbc12bf14,0xbaf863f0, +0xbbf16c99,0xbc0070b6,0xbc06048a,0xbc059a21,0xbbee76de,0xbc0ea9f3,0xbc12f052,0xbc12b67b,0xbbdf24f4,0xb982339e,0xbc074bdf,0xbc050e36,0xbc037504,0x3ba1acf1,0x3b77ca6f,0x3ae064f7,0x39c19d29,0x39b91d7a,0x3a9d15cf,0x3b7bf97e,0x3b77c784,0x3b856098,0x3b9c6e51,0x3b23bc4a,0x3ac9e5cd, +0x3a9f2219,0x3b1ede66,0x3b5e1498,0x3b9b7b26,0x3b90d611,0x3bae0e20,0x3b454fc1,0xbbde3987,0x398c5c56,0xbb074aa7,0xba9f69ba,0xbab02750,0x3adc39db,0x3b4f2bb9,0x3b30abe7,0xb9ca97b3,0x3b204b0e,0x3b5e6fae,0x391cc738,0x3affa337,0xba0db10b,0xbaf6bb41,0x3b31e16d,0xba0f1cc8,0x3be45288, +0x3bc71c92,0x3a370d81,0xba94fe63,0xbad71a76,0xb9d3a3cc,0x3bb7416f,0x3b85b0c1,0x3b892f73,0x3bbb1ed7,0x3a4367cb,0xba5d142b,0xbaf932d0,0x3aa5251f,0x3b52f97f,0x3bc2cf31,0x3bb5c1ea,0x3bf4b018,0x3ad5d44a,0xbb1e72a1,0xba90878b,0xbb04605e,0xba02396f,0xba9bfd31,0x3b8101c0,0x3b42d2d2, +0x3c023952,0x3ac9f731,0x3ba91c0f,0x3aa33e00,0x3a79ff45,0x3af6cf80,0x3abf72c5,0xbaa40fb5,0x3ad8dbf3,0xbb1d3c3f,0x3bf08c51,0x3ba8ddbd,0xbab06616,0xbb9add09,0xbc06807b,0xbbc5784c,0x3b889909,0x3b7a6b4c,0x3bad5e82,0x3c0bcd3b,0x3abf6f1b,0xbb523786,0xbb9f96a2,0xbaf834c6,0x3afdbdfa, +0x3bcd2e8c,0x3bc8684c,0x3c0384aa,0x3b0d5318,0xbb38f3b0,0x3b113eef,0xbb29c664,0x3aef6be2,0x3b5be904,0x3bae41f6,0x3c08332f,0x3c089c0f,0x3bc2f8b3,0x3b865a4a,0x3b943f55,0x3b01e5bc,0x3baa0f39,0x3b9577af,0x3b0efe5a,0x3b214e91,0x3b94a52c,0x3c48227a,0x3c253f1f,0x3ba8b31f,0x3b94a716, +0x3c668766,0x3c68e07d,0x3b9f7f16,0x3c18ffec,0x3ba22561,0xbaed2937,0xbac7ef55,0x3b3950ef,0x3c48928c,0x3c2cb98c,0x3c22df8d,0x3c5ea682,0x3c205257,0x3c2cf432,0x3b8d40bc,0x3990a3cc,0x3bdf8c58,0x3b7d7867,0x3b2f1993,0x3ab7c8ba,0x3b979c63,0x3aadb2ff,0x3b45e001,0x3c2fed0d,0x3c1224c9, +0x3bb34c7a,0x3af8a0e1,0xba99ea51,0xbbb66ab5,0xbb957796,0x3b212f23,0xbcc6d10e,0xbc127842,0x3c045245,0x3bf4044b,0xbaa086df,0xb95f4844,0xbb30c943,0xbc023d5e,0xbaf7315e,0x3b32a741,0x3bedf632,0x3a9b4aaf,0xb8bbb2ec,0x3b2c127e,0x3c000940,0x3c2f0a2d,0x3c38c6e7,0x3b94cbd9,0x3b910e75, +0x3ad7fb9c,0xbab71021,0x391d35a3,0x3a2a808c,0x3b748298,0x3b9878c7,0x3b344972,0x3bd9304f,0x3bf7373a,0x3ba46464,0x3b149dbc,0x3b29431d,0x3bc11fd8,0x3b3b3041,0x3bcb76b1,0x3c2c4812,0xbc382c7f,0x3c0d7c79,0x3c3bd141,0x3c5090e3,0x3c2ed8db,0x3c17ad26,0x3bb48626,0x3b372af9,0x3b70b330, +0x3b813950,0x3bbe2751,0x3c3bb658,0x3c2ef322,0x3c448ca9,0x3c2798a9,0x3c03f3e2,0x3b8cbb31,0x3b30b6ed,0xb94d352a,0x3aea8634,0xb8295d8c,0xbaf77e5c,0x39a970c4,0xba6177f1,0xbad3a72c,0x3a727020,0x3b6f7f84,0x3b282d9d,0x3b171752,0x3ae6e354,0x3b4b2442,0x3b1a311a,0xba209e5e,0x3b483edc, +0x3bb470f1,0x3b45cb18,0x3c07de33,0xbb7ccb17,0xbb28d26b,0x3b16c8ce,0x3b779dc6,0x3c1cc151,0x3c3b05fe,0x3c4fa866,0x3c833034,0x3b62dc2d,0xbac3d852,0x3ae153df,0xbb8d15ab,0xbb9eeffd,0xbb0b3e70,0x3ac8394b,0x3b81036b,0x3be66470,0x3be520d2,0x3be4559b,0x3b576aa4,0xbb08cbe2,0xba22fbbf, +0x3a38d96f,0xb9e70e67,0xb9927d53,0x3984ffb5,0x3b3c1029,0x3b4b8299,0x3ad7c0dd,0x3b1fce61,0x3ae4fe28,0xb9a5f353,0xbae55623,0xb9b89261,0xbb65e579,0xbb172340,0xbc55381f,0xbbe14bf2,0x3a2ccf54,0x3a8cb1a9,0x3b9fccf5,0x3b0bce58,0xba252310,0xbb93ffb1,0xbb805181,0xbb35f889,0xbaad1144, +0xba436b30,0x38c57010,0x3a6da82f,0x39a61693,0xb91c645a,0x3812b09f,0xba7ab8d6,0x3a085dca,0x3abfac4d,0xbaef11eb,0x3a0a9ad1,0x393487e3,0x39bff7ee,0xb7178878,0xbb388945,0xbaee9d7e,0xbab2c3d3,0xbb396175,0xbb14f25e,0xbb99e547,0xbbe1bcfc,0xbc0c371e,0xbc21fe42,0xbc1fced2,0xbc1f8d14, +0xbc37b9c0,0xbbcb7e60,0xbac2cb2a,0xbb563c79,0xbafbdebd,0xb99d8d6e,0x3b016ce2,0x3b3b3bd2,0x3ad51086,0xb84fdf3a,0xbaa64ce6,0xb9891418,0x39ca665c,0x3ae0e9c8,0x3af23238,0x3af2d7be,0x3ac8b730,0x3b138f2e,0x3b17fa23,0x3ab23a64,0x3ac4f790,0x3ae46218,0x39e91dd6,0x3a3245b6,0xba2c0e9a, +0xbb68226a,0xbbb35113,0xbbdd15ac,0xbbb6e5ab,0xbbe9253e,0xbc0eeea7,0xbc277736,0xbc307334,0xbc20c47d,0xbc1599f6,0xbbd36d94,0xbc04dbe3,0xbbb1fd98,0xbb52eb65,0xbb9b4112,0xbb934a13,0xbb98977e,0xbb95262c,0xbb7bd464,0xbb5127a9,0xbafa7d85,0xba82391d,0x3a5307f2,0x3b1f39e6,0x3b885468, +0x3b54186c,0x3b2823b3,0x3b053134,0x3b167fc7,0x3b7259b7,0x3b2d7d56,0x3a28acf0,0x3af545ea,0x3b3da938,0x3a7af712,0xba82a077,0xbb02d93d,0xbb75e1a8,0xbb8e1dfc,0xbbfcce91,0xbbb10262,0xbbab71de,0xbb5e045a,0xbb983598,0xbbc3610d,0xbbfa848f,0xbbddb880,0xbc3280a3,0xbbd7f687,0xbb9e549a, +0xbb6c344f,0xbaf019eb,0xb93c117c,0x3acceacb,0x3b46b5d9,0x3b568e78,0x3b5fe80d,0x3b685858,0x3b67effe,0x3b5af6a9,0x3b59e666,0x3b5ed02d,0x3b6fb0dc,0x3b79cd48,0x3b77ebf2,0x3b79c30a,0x3b8b4cbd,0x394cec61,0x3ad4d0a3,0x3909390a,0xba857155,0xbb174a00,0xbb11f430,0xbb0d7757,0xbb4a0752, +0xbb97b9a4,0xbb6bb212,0xbb7d1ca4,0xbbb1b4ad,0xbbb63aba,0xbbe046a1,0xbbea1fee,0xbbbbba75,0xbb940082,0xb9b842ee,0xba51e524,0xb927f98a,0x3980e972,0x3a1a79d0,0x3a74fb60,0x3acaca30,0x3ac81ea3,0x3adc3001,0x3aed06d5,0x3afe0c9c,0x3b09c5a9,0x3b0fa787,0x3b0fd474,0x3b0d45a1,0x3b0d2103, +0x3b10247f,0x3b00bed2,0x3b4844c6,0xbaa885cd,0xbb8c11d5,0xbbb7cb29,0xbab6413b,0xbbacf533,0xbbd63514,0xbbde680b,0xbbd9ca43,0xbbc9698b,0xbbe4201f,0xbbe89cb8,0xbbe713d2,0xbbd2d55b,0xbb48c67c,0xbbec708c,0xbbeb15cd,0x3aafad5f,0xba044c73,0x3be412eb,0xbacb6df9,0xb98e34ea,0xba318f02, +0xba5100e0,0xba06fcc6,0xb9cf4a92,0xb931097f,0xb9fcbd95,0xba25d3e1,0xba0ff6b2,0xba93a4ab,0xbaabf77e,0xbac4cfb2,0xbaa29499,0xba7cc38b,0xb9fa1ab7,0xb987772d,0xb827d1ff,0xbb03f7e4,0x3bd0c37b,0x3c02e1ec,0x3b8c4a4d,0x3b99b649,0x3c05c880,0x3bb880af,0x3bd3f8bc,0x3bd9b368,0x3bb39021, +0x3be45860,0x3be7a06f,0x3bd205ff,0x3c0ac60c,0x3b982093,0x3ba4c089,0x3c170bbe,0x3c083a0d,0x3ad56e4a,0xbaa47174,0xba2046d0,0xba9884ff,0xb99c9b93,0x39840fad,0x3a3e77e6,0x39411ae2,0xb987e7cd,0xb93c4377,0xbafaf497,0xbb47b6e3,0xbb658510,0xbb51d80c,0xbb0141ac,0xb9d995d0,0x3a82090c, +0x35ef932c,0x3a9678c2,0x3bc7ea0f,0x3a6d4dc2,0x3b18d339,0x3ad1db82,0x3b4474e6,0x3b83a4f2,0x3b60ffaf,0x3b98c193,0x3bbcebda,0x3b5df4f6,0x3ac4421f,0x3b063fe2,0x3b445a41,0x3b99c61c,0x3b8e4508,0x3adc1274,0x3c0e286d,0x3bab078a,0xbabc73b5,0xba4cb7ee,0xbb14e2d6,0xb96ad9a9,0x3a8588c8, +0x3affb25e,0x3a1f4a60,0xb9bf2ffb,0xb9b70183,0xbb53850f,0xbb94a185,0xbba1ed70,0xbb8dd298,0xbb20217b,0x38abb4b8,0x3afa4d59,0x39f071cb,0x3b1ad0ea,0x3b99bdd8,0x3af6a760,0xb8aeb25f,0x39fb9d43,0x3b7906d1,0x3b824976,0x3be27b56,0x3b7a1e61,0x3bdbf3c0,0x3b54659e,0x3bb7d3e3,0x3b0db978, +0x3b9ca6d5,0x3b92efe4,0x3b8bbabf,0x3ba88dc5,0x3bd865a8,0x3b977721,0xbb0a5a06,0xba75f078,0xbb41928c,0xba343aa5,0x3b0a872f,0x3b8dd928,0x3b355312,0x3ab84eb5,0x3ade1491,0xbb2b65fb,0xbbdf51ed,0xbc0a3d34,0xbc049b3e,0xbb89b005,0x3a148225,0x3b794ac4,0x3abddfa6,0x3add45a5,0x3b6977a7, +0xbb296ec6,0xb95d9f3e,0xb9a3444d,0x3aa68d60,0x3b6647f4,0x3bf2bd6a,0x3c0d45eb,0x3b68392d,0x3b8c945b,0x3b4495b4,0x3a811ab8,0x3b92a9bf,0x3bd5f234,0x3b04fdab,0x3b42c96c,0x3cb41337,0x3c4ce2e7,0xba267ce9,0xbb0cd8df,0xbb87ee13,0x3bef26f3,0x3c0e18fa,0xbad1c0a4,0xb9f157ff,0xbbed234d, +0xbc8723d4,0xbc8a8d4f,0xbc42d7d1,0xbabb93bb,0x3b167d51,0x3b4fb1ad,0xbac46541,0x3ab336e5,0x3a8d2832,0x3bdf259b,0x3c26e79e,0x3b89e7af,0x3ba25692,0x3b22fddb,0x3b11b99c,0x3b89d96f,0x3a24149d,0x3b4f9326,0x3c3eb14c,0x3c0ada20,0x3b94ef50,0x3b56e353,0xbad4ce52,0xbaf50194,0x3af1ac52, +0x3c805650,0xbc9e6b1d,0xbc41ce73,0xbbdf23b9,0x3b3e3c9f,0x39d75b8e,0x3be31a57,0x3bc24c83,0xbb1cc542,0xbb21caab,0xb9fb4150,0x3bd82800,0x3b2c8580,0x3af25bd8,0x3b7d34fc,0x3baeed26,0x3beef74c,0x3bf2f94a,0x3b96f8fc,0x398b624c,0x3b61c330,0x3b2ec059,0x3acddcfc,0x3b497e3e,0x3a9a2fca, +0x3b0d6384,0x3b146b10,0x3bd08a94,0x3bec9a5f,0x3b8ce8cf,0x3af2ff5f,0x3b35f23e,0x3b8a07f9,0x3b8905df,0x3bb94b38,0x3c60c431,0xbc8017fd,0x3c6910ec,0x3c6ca64c,0x3c5a3058,0x3c493245,0x3c5ff4b1,0x3c3f1e6d,0x3bc02cde,0x398b0d99,0xbc2774f4,0xbc306042,0xba1188cb,0xbb1e5162,0x3a8c4ba9, +0x3b594420,0x3aa0be1a,0xba24aabc,0xba80d191,0xbaddbfe5,0xbb96d981,0xb9af1a69,0x3a996b65,0xb9aeb3a2,0x3af7c644,0xb8528059,0x3ad33bdd,0x3b63bfd6,0x3b02dcad,0x3abc53f5,0x3ab49640,0x3b501207,0x3b44f48e,0x3aa07a12,0x3bba68dd,0x3ba6d987,0x3c0121d3,0x3c3189f2,0xbb5dad12,0xbad51195, +0x3b791e03,0x3c34c83c,0x3c54a117,0x3c83cd37,0x3c844328,0x3c44f6b8,0x3c1bd83c,0x3bf4928b,0x3c309020,0x3b2fffd7,0xb95c8803,0x398fcfd9,0x3b39ded4,0x3b70f474,0x3b668faf,0x3b670c2d,0x3ad2adcc,0x3b24252a,0x3b1f33f3,0x394df209,0x399a3dba,0xb9dbb989,0xb9a295d2,0xb65aeed0,0x3af8ce20, +0x3b63d365,0x3aee5ffb,0x3b09ccf2,0x3a7d09a8,0xbaf21704,0xbaa48d49,0xba50d0b1,0xbb17252b,0xbb899df2,0x3a35a32d,0x3bb19791,0x3bb7f10c,0x3be520a9,0x3bb492f8,0x3ba81b70,0x3a599b43,0xbbc33173,0xbb224c4f,0xb9698eca,0x3b863434,0x3b8c577f,0x3b891b55,0x3b852c7a,0x3af4933e,0x3a36d8cc, +0xba6d8935,0x39ebf69b,0x39cb078f,0x3a937a7b,0x3b284c38,0x3a0224dc,0x3984494e,0x397f212c,0xba11740c,0xbb44ffcc,0xbaf40530,0xbb2df186,0xbae5b74c,0xbb0fdf11,0xbb278f96,0xbb5098cc,0xbb960fce,0xbbae9f9b,0xbb99399a,0xbad2f561,0x3a64e3a4,0x3a5694a7,0xbb05ef4c,0xbaf11742,0xbb3c66e0, +0xbb82db3d,0xbb76caca,0xbb1ce416,0xbb2e4977,0xbb59a97d,0xbb6beb60,0xbad4c583,0x3a299939,0x3b4158bd,0x3b1d26fa,0x3a9e1740,0xbaa43f95,0xba50e60f,0xba21fa37,0x3a93f053,0x3ad04b51,0x3af8744b,0x3b8c4a70,0x3aabb33b,0xbac184a0,0xbb8ae6ad,0xbbbd88ed,0xbbce077f,0xbbf478bf,0xbc006a8c, +0xbc14d072,0xbc2d50db,0xbc2dd50e,0xbc143bab,0xbbeb751e,0xbb185475,0xbb087372,0xbb84c45c,0xbbb655e1,0xbba6189e,0xbbbd50db,0xbbb05ecc,0xbbbbf08b,0xbbc25d51,0xbb8ef581,0xbb25af25,0xba85284c,0xb9fe712d,0xb7b042fc,0x3a94160f,0x39d79c3d,0x39577fce,0xb9c88439,0x3a3de82e,0x39d4b95c, +0x3b2a0743,0x3b8c352e,0x3b5c081c,0x3b5761cc,0x39bc7bbd,0xba588915,0xbb849953,0xbb7267b1,0xbbdc83be,0xbbb9b4ad,0xbbcf9ea3,0xbb7c9ffa,0xbb5cb127,0xbb3408ab,0xbae1874a,0xba48ea74,0xbb143470,0xbb9a8d92,0xbbc2884f,0xbbb24a25,0xbb8c92df,0xbb68561d,0xbb2cae9e,0xbad52632,0xba2914c6, +0xba442636,0xba8a9f8a,0xba8beb11,0xba5c2158,0xb9a45d8e,0x3a2465f2,0x3a21ad8d,0x3a45ea77,0x3a2c75f6,0x3a4ac05c,0x39dd9ef2,0x3a2ed0a6,0x3b5349f5,0x39ac8392,0x3a53c570,0xb8c96473,0x397be77e,0xba6665c4,0xbb029da9,0xbae3749f,0xbab20b09,0xbb685609,0xbbab505e,0xbbac4782,0xbbbeab80, +0xbbb2ae7c,0xbbb0e553,0xbbd582c4,0x3a0b0010,0xbb79a513,0xbb3b7d53,0xbb2e117c,0xbb1ee8de,0xbb0fa453,0xbb052fd9,0xbae15310,0xbaec9033,0xbad58473,0xbac466d0,0xbab110b0,0xbaab557d,0xbaa47507,0xbaa7d075,0xbaa006f3,0xba964de6,0xba93a378,0xba708f53,0xbaef07bd,0x3b2473f7,0x3b85a649, +0x3b36702d,0x3ac2c9a1,0x3b7ba7c3,0x3b214527,0x3b2520f0,0x3b0f4786,0x3ab6f83a,0x3af4bacb,0x3adf3e88,0x3aa3696d,0x3b048b99,0xb8f9aada,0x38899a57,0x3af3513c,0xbad41311,0xbb2ed138,0xbbd37b07,0xba3a0b35,0xbb0b6c4d,0xbb3aeb5a,0xbb411c2b,0xbb7ea5c1,0xbb802162,0xbb3e81cc,0xbb565b5d, +0xbb51416f,0xbb364e00,0xbb5c3e61,0xbb6c9f52,0xbb845749,0xbb686f51,0xbb501b38,0xbb2d289c,0xbb1cd427,0xbb042c22,0xbad0f176,0xbbe2f046,0xbbc429d0,0x3a8cfb91,0xbbe15863,0xbbc908a8,0x3abf5d13,0x3a5cb234,0x3a40043b,0x3a6d72a9,0xb8f0877f,0xb9d0a41c,0xba73a273,0xbbbb6e39,0xbbc677a3, +0x3a90228b,0xbbbbfacb,0xbb5bebdf,0xbb1d2c0d,0xbaf375d3,0xbb8070aa,0xbb86d533,0xbbe8cd77,0xbbf225b5,0xbb9a050b,0xbba76026,0xbb9469d4,0xbb6f405d,0xbb9868ae,0xbbb539cc,0xbbd968f6,0xbbc876b4,0xbbb1b6ec,0xbb82bff1,0xbb4cf876,0xbac6dcd3,0xbb6c0367,0xbb4e2ab7,0xbb5a8fd6,0xbbb2b26a, +0xbb5c7bb4,0xbb33abb2,0xbafd7033,0xba939bc8,0xbb12ef2f,0xbb504efd,0xbb0f5a2e,0xba9c3847,0xbb2e5158,0xbab6d1d8,0xbabe5013,0xbb79f590,0xbb2a4537,0xbb17ea04,0x3acd32ed,0xb9a6aacb,0xbb9dade1,0xbb927a01,0xbc2e7296,0xbc40911f,0xbbbcc4fd,0xbbfcc11e,0xbbde2700,0xbba9e328,0xbbfb502c, +0xbc142771,0xbc3969dd,0xbc1a53e5,0xbbf8df75,0xbb9a15b8,0xbb26f109,0xb9d0566f,0xbb13fa50,0xbb849f2a,0xbb686cea,0xbb83b37d,0xbb5ea49d,0xbb0df766,0x3ab943dd,0x3b0c39f8,0x3b8594cb,0x3a270345,0x3b62af7a,0x3a8e548d,0xba839569,0x3a819abf,0x396b9c6a,0xbb10ce84,0xbaab2ba4,0xbb1e3a85, +0x3b0453f2,0x398c830a,0xbb97a551,0xbba4cd2a,0xbc83f7d0,0xbc937d8c,0xbc1000c2,0xbc2a54f5,0xbc090811,0xbb931696,0xbbfa3a22,0xbc44aa83,0xbc83e8bc,0xbc817119,0xbc553bdb,0xbc0639fe,0xbb849323,0x391431d5,0xbb0fc832,0xbb30803f,0xbada0ca8,0xbb806603,0xbaa363f4,0x3ad4c50d,0x3ba8bfc9, +0x3c00216c,0x3c0d6bb6,0x3bb92c0f,0x3b8580f4,0x3b8aae7f,0x3af80563,0x3babc92b,0x3b8af69f,0x3a0c41c9,0xba8ad9fe,0x3bd08723,0x3b8275df,0xbabfd3fa,0xbbea923f,0xbc1ca4c7,0xbaea8b47,0xbb161ec8,0xbc4f6c76,0xbb853db5,0xbbbd467e,0xbc51238c,0xbc2d2c61,0xbbb3a407,0x3b78fb37,0x3ba29731, +0x3ba8b771,0x3bb829e8,0x3b1c8545,0x3aaf18b5,0xbaa854f5,0x3a8a59b0,0x3b85dc28,0x3b23a97b,0x3acf8374,0x39cc1985,0x3b537143,0x398affb6,0x3b53d5c4,0x3c4e8a58,0x3bd87d4e,0x3b246683,0x3a1687c2,0xbb9d5951,0xbbef47a2,0xbb12db8d,0x3b9be275,0xbcec1008,0xbc42eb6a,0xb8b6cec1,0x3b0ed1c1, +0x3ae18d61,0xba51e2fa,0xbb84d665,0xbc14b0d0,0xbc04f6ec,0xbb672768,0x3be5cdb3,0x3a8cc145,0xba8d42a8,0xba6a6d42,0x3a4dcc5c,0x390aaee7,0xbb7aaf63,0xbbb3b8af,0xbb68f9c3,0xbaa7d27c,0xb9c7cd27,0x398d6edd,0x392345c4,0x3a858b12,0x3b0f56b0,0x3b184e23,0x3bd9299e,0x3be7cd7d,0x3b6463ea, +0x3b087d7f,0x3b18c579,0x3b7a3aba,0x3b665c4e,0x3bb3467c,0x3c1fad32,0xbc9acc18,0x3c6f5ba0,0x3c730920,0x3c3ee3e2,0x3b9c9924,0xbc00c55e,0xbc2d039a,0xbc7f8312,0xbc9e0c04,0xbc5cd86c,0xbc01250e,0xba05eef4,0xbb9a49ef,0xbb8df4ba,0xbb571989,0xbaf2bc1d,0xbab31524,0xba897c9a,0xbad6e903, +0xba8b6e59,0xbb7013f1,0xbb7cfe6e,0xba9a67d2,0xba72038e,0xbae122f9,0x3a5ddeb6,0x3b462256,0x3ae0961c,0x3ac6b865,0x3aa8241d,0x3b48866b,0x3b3e8187,0x3a89ef22,0x3b50c7f9,0x3b8fe860,0x3b9a779b,0x3c435e22,0xbbeff749,0xbbe09e85,0xbc1ec62f,0xbc53ae54,0xbc8763e3,0xbc0889ee,0xba526808, +0x3c0ff7ee,0x3b1fb461,0xba8e1c3b,0xb8170943,0xbbb241f2,0xbbe398de,0xbb9f16ec,0xbb285ee1,0xbafa9db6,0xbaa040e6,0xba4f1e1a,0x3a5f2ce4,0x3a5cf97e,0xba497c24,0xba906762,0xba881697,0xbac2e1cc,0xba990a60,0xba4e7c8f,0x3af1c6d2,0x3b1a3c29,0x3abb1ea7,0x3adfe047,0x3a7a1bb8,0xb960055e, +0xbaaa3771,0xba74e8e7,0xbb13b1ea,0xbb93c7fa,0xbbc908f1,0xbc268484,0xbc7ec33b,0xbc8174bc,0xbc54f8c3,0xbc6cf0e6,0xbc7c21a1,0xbc836283,0xbc388257,0xbc1a43a3,0xbc30c57c,0xbbe92095,0xbba55260,0xbb871ad4,0xbb13a623,0xba5c92f9,0xb8c3fcf2,0x39bafce9,0x3a0e0e45,0xba5c5068,0xbb0ac90a, +0xba8df41e,0x39a60957,0xb9d63bc9,0xba900380,0xbb5e39cd,0xbb443fd9,0xbb4542f8,0xbb82b1d6,0xbb497a30,0xbb86174b,0xbba6096f,0xbbaf72d4,0xbbd091cb,0xbbce71a1,0xbc14b769,0xbba23364,0xbc0ca2e1,0xbbe246bb,0xbbc496f2,0xbb822b24,0xbb71252e,0xbb2d027f,0xbb633ea3,0xbafa8dd5,0xba8c2e18, +0xb91263d9,0xba3042fb,0xbaa2fc76,0xba8379f9,0xbb327bf8,0xbb4c4681,0xbb17dcc2,0xba7b433d,0x3a015892,0x3ab045cb,0x3a94b5b1,0x3a68d77f,0x38a221ad,0xbada57ba,0xbb36f510,0xbba24f06,0xbbbe61a0,0xbbd881c4,0xbbd311eb,0xbc033880,0xbc2033a1,0xbc3d7f47,0xbc43ba15,0xbc474d86,0xbc360c8e, +0xbc0c497b,0xbbec9629,0xbbaccc1c,0xbb91f6ac,0xbbc51663,0xbbd41100,0xbbfaa4b5,0xbc0d0bff,0xbc1b5437,0xbc033872,0xbbd6590d,0xbb9f0635,0xbb572dca,0xbac6ae00,0x39e7bcd7,0x39bf2112,0x39da7795,0x39d63129,0x39b3f5c5,0x3a601e54,0x39a8b9ef,0xb92e6781,0x3a903fc8,0x3b0e522d,0xba1f4dbf, +0xbb355c82,0xbbb61ec1,0xbbc4415c,0xbbeb4415,0xbc13e0d6,0xbbec9b0b,0xbbd7bc6b,0xbbb726f2,0xbbb2e365,0xbbacf937,0xbba4ede3,0xbbb82aee,0xbbe41979,0xbbde92bb,0xbbbcb856,0xbbb77919,0xbba05544,0xbb8b96e2,0xbb63094e,0xbb4fbce7,0xbb0b7f94,0xbab9dffc,0xba4e366e,0xb9075a69,0x398824c1, +0x3a1cebef,0x3a167220,0x3a38c777,0x3a5fbb94,0x3a6a0c52,0x3aa3954a,0x3a7552d1,0xb9c31e62,0xbabc9293,0xbb55018f,0xbb51a315,0xbb896d5f,0xbbafe0a6,0xbbaaacd6,0xbbca91b4,0xbbd677fe,0xbbd38840,0xbbceeca2,0xbbe9a701,0xbbe68abc,0xbbe9c6e4,0xbbfe0f92,0xbbe27bb5,0xbbcf74dc,0xbb6a4816, +0xbb6c169a,0xbb65ecd2,0xbb5b707c,0xbb5a8d42,0xbb5695b8,0xbb503ae3,0xbb3b5cf0,0xbb28b464,0xbb13ca58,0xbb01b751,0xbad9ca33,0xbaa69ccc,0xbaab1a4e,0xbaaa9421,0xbaa6e2f2,0xbaabccbd,0xbaac552d,0xba572f37,0xbb82beb3,0xbb89efd4,0xba1af52b,0xbba48a98,0xbbadff22,0xba97405d,0xbad26f0a, +0xbaed7330,0xbaeebd1d,0xbb2926d9,0xbb3cc5b2,0xbb47f58d,0xbbc2362b,0xbbc53959,0xbb0fae92,0xbbc26e9b,0xbb4743a0,0x3b7ed0fa,0x3bc98fab,0x3b9d9c69,0x3b55aa2b,0x3b5e7bb2,0x3b3c1027,0x3b7a36f7,0x3b8a969f,0x3b9c2f29,0x3b8dede5,0x3b8784af,0x3b83dc29,0x3b6de3fc,0x3b6084c8,0x3b4b3f09, +0x3b5d3482,0x3b6c495d,0x3b820912,0x3b8c5b00,0x3b79a7cc,0x3b87c17c,0x3baf405a,0x3b00f1f3,0xbbe343e0,0x3bbb2150,0x3b2c7e04,0xbba451d4,0xbb9412a6,0xbb8b5786,0xbb8c726b,0xbb6cb157,0xbb692c63,0xbb8047bc,0x3b580d33,0x3bdb1b90,0xbbbe91f0,0x3b2fcbd5,0x3a74d2f2,0x3bdaad00,0x3b37b6f5, +0x3b3ca76c,0x3af7970b,0x3b8a72c5,0x3bb6ce42,0x3bdef90e,0x3bcb1476,0x3bbed4eb,0x3bb6410d,0x3b952652,0x3b6a9db1,0x3b31100a,0x3b4c36ba,0x3b824715,0x3ba88986,0x3bc86c9f,0x3bad3701,0x3bb247a3,0xba1eb2d6,0x3afdb400,0x3b2e4999,0x3a97572e,0x3adff114,0x3baf36a3,0x3ba04600,0x3bcc0aaf, +0x3bb5e733,0x3bbb0f1b,0x3b940a91,0x3b27ceaa,0x3b95e980,0x3b5c4cb5,0x3b2debbb,0x3b9b5f62,0x3bf4a1d1,0x3c0c1c8d,0x3b51dbe7,0x3b125761,0x3a0d9ee1,0x3b958f8e,0x3bf0e62b,0x3c277e7c,0x3c0b89d4,0x3bf96457,0x3bdd48a5,0x3b9d5006,0x3b5e353f,0x3b03ebb0,0x3b3d4c89,0x3b8fca9f,0x3bd427dc, +0x3bfaab2a,0x3beeac19,0x3b92679b,0x3b3c75f3,0x3a9efbce,0xb87e8f1d,0x3a3b7db8,0x3ad480f9,0x3ba58251,0x3b8f9d42,0x3bad8efa,0x3babfdfb,0x3b94532e,0x3b94b522,0x3afdac6b,0x3b8c5950,0x3b87f220,0x3b05bfcd,0x3bbdc0f2,0x3ba8c25c,0x3c01cf10,0x3aa86415,0x3a09c8e5,0xbaef401b,0x3b67029d, +0x3c093a62,0x3c5d11d5,0x3c3e13e4,0x3c311984,0x3c298a05,0x3c0251a9,0x3b9176f9,0x3ada262e,0x3b18e413,0x3ba2f7d0,0x3c0c0ff1,0x3c2ffd63,0x3c0f7d1c,0x3b9c4537,0x39ee0474,0xbaa2ac1c,0xbb1bd09e,0xb99a6d61,0x3ad31e1c,0x3b9d32d0,0x3c000683,0x3c043a08,0x3b8fe12f,0x3b96c042,0x3b859604, +0x3aadcadc,0x3bc60838,0x3beb0a30,0x3a58c612,0x3b8c8d70,0x3c9f6ce7,0x3c8f8f0e,0x3c18ce29,0x3bafa6ec,0x393e0bd8,0x3c566031,0x3c814397,0x3c08224b,0x3c314c98,0x3b96d440,0xbbb210e7,0xbbdf870a,0xbbac51f9,0xbadf2ad2,0x3b8e4862,0x3bd42534,0x3ba9a93d,0x3bfa8c15,0x3c1859ff,0x3c1ce61e, +0x3be845e5,0x3bce471a,0x3b9f54d0,0x3b4b1432,0x3ad19407,0x3b2b522e,0x393e9cc6,0x3b6f4ea6,0x3c52fc22,0x3bde4f5a,0x3b1fbb93,0x3aefbf18,0xbb8e9d4a,0xbb9118b5,0x3b3cf51d,0x3c806ef4,0xbca7cd31,0xbbd8e9ed,0xbbb9cac8,0x3b32f0bc,0x3b825139,0x3c12da21,0x3be60d1b,0xbb003f0c,0xbb625770, +0xba9f617a,0x3c0fb692,0x3b28df5f,0x3ab2a723,0x3b94845d,0x3c11ec91,0x3c52d081,0x3c7103e0,0x3c1d55ab,0x3bb09b8c,0x3b7329ce,0x3add8fb1,0x3b0f3106,0x3b547073,0x3ae99940,0x3b33c1d8,0x3b3d2afb,0x3bd7b0cc,0x3bdcafdd,0x3b52cebb,0x3b24e736,0x3b38a049,0x3b7b4259,0x3bac1ff8,0x3c0a47ef, +0x3c4b3483,0xbc674c68,0x3c89acc2,0x3c990bf3,0x3c76d315,0x3c8291c6,0x3cc47734,0x3cf65f57,0x3cdf8219,0x3c69eda2,0x3ba3ec03,0x39955aca,0x3ba6051f,0x3c290500,0x3c843cb5,0x3c92e37e,0x3c6dbf02,0x3c02480d,0xb9a07548,0xb9aabfda,0xba176584,0x3ab0a1f3,0x3afcaedf,0x3ab8088a,0x3ae900c1, +0x3aabaca8,0x3b17fb22,0x3b3cb457,0x3afa1d16,0x3adfdbdb,0x3ad69733,0x3b6fc310,0x3b87acc3,0x3b765c0a,0x3ba135f1,0x3b78737b,0x3bd0e07f,0x3c59f239,0xbbec7194,0xbb910e02,0x3bd80a0c,0x3c925692,0x3cf5e5f5,0x3ce81d70,0x3cc86655,0x3c6c02a1,0x3c5d5711,0x3c374eb0,0x3c396305,0x3bd23db6, +0x3b65f0d9,0x3b3e1707,0x3bedb201,0x3c1ce63f,0x3c154143,0x3bfbe599,0x3b8d375b,0x3b37c02b,0x3a3f871c,0x3a23a670,0xb98f20e5,0xba545447,0xb9f08d7d,0xb98bf0a1,0x3a863f5f,0x3b22d079,0x3adcc56e,0x3ab83128,0x3a16e901,0x397a3922,0xba401405,0x3a8900c6,0xba85e43a,0xbba0a84e,0xbae62ffc, +0x3c2be504,0x3c9428cb,0x3c8a460c,0x3c8580e9,0x3c73a8c5,0x3c498287,0x3be9111c,0x3bf51264,0x3bf1af87,0x3c1a81da,0x3c0f84bc,0x3c053693,0x3bef3783,0x3b741769,0x3aebe38d,0x3a8c0816,0x3ad5758b,0x3b1851fc,0x3b2d1518,0x3aeca2a9,0x3aea4911,0x3a9c7657,0xb994061f,0xba88730d,0xbb0ce6cd, +0xbb2dc53c,0xbb3ee3be,0xbb078bc3,0xba8fa985,0xba9b06fc,0xbaa205a4,0xbadfb1b1,0xbb20bdfa,0xbb7cdd8c,0x3b061835,0xbbb33232,0x3b23e814,0x3b9ed298,0x3b91853d,0x3ba531f3,0x3b8cdb50,0x3ba09e83,0x3bf5fd6d,0x3ad8f18f,0xba635729,0xba86c0f3,0x3acd45e1,0x3b8219fc,0x3bbcd7bb,0x3b8a0dc2, +0x3b636eae,0x3b018bde,0x3b1a0619,0x3ae63921,0x3a290d39,0x3ac6e3e4,0x3af5d294,0x3b46ac17,0x39b59c07,0xbb1075e4,0xbb924c79,0xbb9a671a,0xbbaf72df,0xbbd229a3,0xbbe9a111,0xbc09ba67,0xbc1bf525,0xbc2e66de,0xbc14fd1a,0xbc081a3d,0xbb04dd49,0x399f38c8,0x3a0c6c67,0x39bf3281,0x395298f2, +0x38d71416,0x399db0ad,0x3603e57b,0x398b5c6d,0x3a87b915,0x3b11a5f8,0x3b2f8c14,0x3ad69d02,0x3a05e27b,0xb93f90cb,0x38f6a3d6,0x3a012bfe,0x3a3a5f04,0x3adf2e80,0x3b20c091,0x3b74a83a,0x3b50df48,0x3b1d0ae3,0x3b20dc72,0xba0aff32,0xbb49dfef,0xbbc76fbf,0xbbda3dda,0xbbe2aec8,0xbbf252ef, +0xbbddf127,0xbbc2e1ee,0xbba06a3f,0xbb5eaa42,0xbae9ddce,0xba6417b8,0xb9c55875,0xbbda6092,0xbb0bccd4,0xbaeaab6d,0xba33ac72,0x38e7dbbd,0x3a944708,0x3b0fd72f,0x3b496ebc,0x3b0e538a,0x3a8b3206,0x39a6296e,0xb992a106,0xba0e7416,0xba5b2f93,0xba34007e,0xba36b9c2,0xba4b667d,0xba408686, +0xbaa81da9,0xb9fac676,0x3849ba79,0xb934db7a,0x39ea5b5a,0xba83b036,0xba16c91f,0xb90da2a9,0xb9e3ac79,0xb9aaf2b3,0xba9773a1,0xbacf2169,0xbb2cdf19,0xbb7e732b,0xbb744d40,0xbb9873e0,0xbb87cbec,0xbb5abfe4,0x3a1cc0d7,0xb9d065f9,0xba277d8b,0xb913dcc4,0x386d10b9,0x39903f69,0x39e73456, +0x3a7c2cca,0x3a0380aa,0x39d729e8,0x3981f33a,0x38f1cffe,0xb8a55cb5,0xb9b351a0,0xb999648b,0xb988dfdb,0xb97312db,0xb90beee6,0xb8f4cc4d,0xb9cd8bdd,0x3ad721fb,0x39d1712f,0xbb85ea89,0x3ad4adf2,0x39778184,0xbba56458,0xbba2ba84,0xbba1a615,0xbba07e0e,0xbb9a91d9,0xbb97f31f,0xbb954c8b, +0xba4a4690,0x3a896353,0xbbb9d812,0xbaa174e7,0x38ff95a7,0xbbc81f3f,0xbb754029,0xbbcf4922,0xbba580ee,0xbbc4e124,0xbbb6e261,0xbbe36385,0xbbeaa2a3,0xbbd3777c,0xbbddff91,0xbbdb490d,0xbbd0e84e,0xbbd553e3,0xbbda07a5,0xbbea49ee,0xbbe4e0b7,0xbbddda20,0xbbd065cf,0xbbc362ef,0xbba69dbc, +0xbbdc553f,0xbb86e419,0x39f03ed8,0x3c0f8c57,0xbbbf8f8d,0xb7666737,0x3c1282f5,0x3c0cafe7,0x3c0b4c43,0x3c003aa6,0x3c03b395,0x3c013e68,0x3be2be23,0x397f4eaf,0xbbc2c991,0x3c09d0ca,0x3ab1d84d,0x3b79d585,0xbbc9c664,0xbbb5acea,0xbbd3041e,0xbbc0236a,0xbc183b66,0xbc24be32,0xbc09298d, +0xbc140d8e,0xbc0bdc5b,0xbbfcf9f8,0xbbfa2b9d,0xbc0a3758,0xbc24dd52,0xbc293a93,0xbc22ab22,0xbc0f8360,0xbbe47ff6,0xbbbf4ae8,0xbbceb254,0x3b26bc99,0xbb89abd9,0xbb9ac2b3,0xbb474251,0xbae0bdbe,0xbb0f3636,0xbb2ee699,0xbb581cf4,0xbae0944a,0xbb554edf,0xbb571c92,0xbb39b8a6,0xbb0b1293, +0xb8927a18,0xbb28b9f8,0xbb9e8fb1,0x38310948,0xbae30687,0xbbb31dff,0xbbe7d675,0xbbb6e4a1,0xbc4a85ff,0xbc673a64,0xbc2adf87,0xbc49d56f,0xbc39f2c8,0xbc24e44b,0xbc277372,0xbc37df1f,0xbc64c58d,0xbc646fe5,0xbc51c6a6,0xbc2c7c6c,0xbbe2b96a,0xbbc135f5,0xbb57299c,0xbb05c1eb,0xbb56591a, +0xbb71f4eb,0xbb841474,0xba820432,0x3a19b821,0x3b20127e,0x3a0367d3,0x3b0950a7,0x3b0af6e7,0x3b279af3,0xbabd5ce1,0x3abd5000,0x3a21b61a,0xba9dc60a,0xbaa21ac4,0x38e72783,0xbaf07e9e,0xbb9606b4,0xbbb5aadb,0xbb828764,0xbc6dda55,0xbc8fe6bf,0xbc4f6ceb,0xbc72f813,0xbc5a74dd,0xbc229f36, +0xbc1b06a7,0xbc56d551,0xbc99bf1e,0xbcaa947b,0xbc9ef4e6,0xbc7ac7b7,0xbc1223f2,0xbbb4e3d8,0xbb7b5321,0xba394186,0xbb98520a,0xbb45de7c,0xbb606ad7,0xb9cea684,0x3b888279,0x3bd3a0ad,0x3c018177,0x3b903ff2,0x3b8c9d55,0x3b7564a6,0x3ab72cf8,0x3ba516ac,0x3b8dc7ac,0xbac0f1f5,0xbb3ac240, +0x3c567d0b,0x3a53aaf2,0xbc16bb02,0xbc6a1772,0xbc90dbc0,0xbc348952,0xbc2bbe38,0xbc9c78f7,0xbc39bfc5,0xbc4ce088,0xbc9f3874,0xbc92f305,0xbc58d7b4,0xbba7a171,0xba545199,0x39e29870,0xbb4c576a,0xbb5fffaf,0xbba76de3,0xbaed7564,0x3b8cf97c,0x3aa535af,0x3aba0eed,0x3a8b0070,0x39da230a, +0x3afb2dd7,0xb9e814e3,0x3b48c41e,0x3c49c55a,0x3b98ded7,0x39fee693,0xba34d2ac,0xbbfb76b4,0xbbe6af3f,0x3ad93a1b,0x3c2ec17c,0xbccf2625,0xbc818f36,0xbc2b1479,0xbb14bd00,0x3ba90107,0x3ab0765c,0xbaea3f85,0xbbb63fcb,0xbc164084,0xbbcb0c5c,0x3bd3e18a,0x3ab053de,0xba5d0010,0xbae7229c, +0xbb219b71,0xbba03999,0xbc335c51,0xbc0be18e,0xbbedd020,0xbb0099ee,0x3aea9231,0x3acdcf77,0x3a9e7ce9,0xba238f4d,0x3a1ad3a1,0x3b28ba0b,0x3bcb4417,0x3bc78f02,0x3b133d84,0x3ad93921,0x3b03fb36,0x3b36052d,0x3bb66c0d,0x3baa201b,0x3bc13dc5,0xbcaad853,0x3c91d8fb,0x3c7d5f2b,0x3c2deeb9, +0x3b1d5d7a,0xbc615331,0xbc25831e,0xbc7f7b2e,0xbce5cab8,0xbcb18a4b,0xbc889317,0xbc3666d8,0xbc555d8d,0xbc417e3e,0xbc1a64e1,0xbbdbb653,0xbb7d4e2f,0xbb2da38c,0xbb0f0ad0,0xbb782dcf,0xbba43100,0xbb7d3fac,0xbb0fc332,0xb98da92a,0xb9f9a2d1,0x3aac8856,0x3b073418,0x3a5de373,0x3a2fb68e, +0x3a827f51,0x3b4e2e76,0x3b7bc83f,0x3b853520,0x3b56ade2,0x3af1bfab,0x3bada663,0x3c58b977,0xbc0f85a7,0xbbf2f1c6,0xbc63a0c2,0xbc865220,0xbcbc28e9,0xbc749433,0xbbe57aa8,0x39eb861a,0x3ba0dd59,0x3b8b8329,0x3b0f7566,0xbab0086d,0xbb7290d1,0xbb45dee1,0xbb595ed5,0xbb7dbc79,0xbba21ee2, +0xbb986d05,0xbb64d50a,0xba679e51,0x3aa1e745,0xba75c3dd,0xbb197d14,0xbb0fff3b,0xbad638e0,0xba965e66,0x3921d8b7,0x3a7d1518,0x3a3da9ce,0x39ba3082,0xb9c71955,0xba3b29c1,0xba98fc60,0xbad35c41,0xba4e177d,0xbbd36aa0,0x3b53c957,0xbb733e62,0xbc8c6d06,0xbc935afa,0xbc8d179c,0xbc8f3743, +0xbc88fd88,0xbc76264a,0xbc360286,0xbc27eecd,0xbc466489,0xbbf91194,0xbbb4622c,0xbb9f8447,0xbb0b2f45,0xb98a70d6,0x399e6500,0x3adde6bc,0x3a12e7ca,0xbad79870,0xba1b8703,0xbad62fa8,0x3a38aa4b,0xba8c056b,0xbb107104,0xbb455034,0xbb651b89,0xbb795321,0xbb4648c3,0xbb1df59b,0xbb0829c6, +0xbafba7d6,0xbabce75e,0xbae350e3,0xba33aeef,0xbb652e4c,0xb6194a06,0xbbe0ee74,0xbc0dbb68,0xbbca9d42,0xbbc6944e,0xbbc3d222,0xbbd07a5b,0xbc062303,0xbb94fb8c,0xbaf28332,0x388bc8dc,0xba650830,0xbac7749c,0xbabea79b,0xbb78df60,0xbb8eb0e6,0xbb5cb338,0xbb1e41ce,0xba25143d,0x3ace36e2, +0x3ad9a541,0x3a465cf9,0x3912c7f7,0xbb38bfa3,0xbb7ff40d,0xbba882bc,0xbbb36628,0xbbc1f07c,0xbbea00a1,0xbc077f3b,0xbc1e3767,0xbc32b3a1,0xbc42edd0,0xbc4fb30e,0xbc30c1eb,0xbc13964f,0xbb7f48ee,0xbb85adaf,0xbba5cfe8,0xbbb24ae7,0xbbc9b0ff,0xbbe7e400,0xbc050615,0xbc1c5c03,0xbc051021, +0xbbeb9d2c,0xbbb6d98e,0xbb965236,0xbb5d9ce6,0xbafd4ceb,0xbad25efb,0xba9005fd,0xba62e915,0xba659329,0xbab493f1,0xba504671,0x397d93cf,0x39f2175e,0x3a5e8990,0xbafb3229,0xbb771b3e,0xbbeb8bf5,0xbbda7a05,0xbc0aa60d,0xbc05ef2f,0xbc019ae9,0xbbdeb8c6,0xbbe384a3,0xbbac0b9c,0xbb65f896, +0xbab7df6d,0xbb4e6a48,0xbad1a500,0xbbb12612,0xbbb1fd7c,0xbbc26224,0xbbcd7dc1,0xbbd8eb53,0xbbde0b36,0xbbed080e,0xbbc16ca9,0xbb9fe816,0xbb83a71b,0xbb44da10,0xbb09d4b2,0xbaa4d10a,0xbac468ae,0xbad6ef81,0xbae344df,0xbaeb212f,0xbac9420b,0xbb19f88a,0xba88ac1b,0xbb705d80,0xbb971c4b, +0xbb7578e5,0xbb7b0025,0xbbb06195,0xbbb26b2d,0xbbbd0c0b,0xbba1b4c6,0xbbc4c53d,0xbbc24234,0xbbba771c,0xbbbb3abd,0xbba23c6d,0xbbb5fcdc,0xbbc578ba,0xbb9fc961,0xbbbfcbde,0xbbac07c8,0xbbb6fa63,0xbbb93e42,0xbbbec63c,0xbbc3dee4,0xbbcf999d,0xbbbf73e3,0xbbb495d0,0xbba6b113,0xbb9a7677, +0xbb8e728d,0xbb77d5ac,0xbb8124a8,0xbb812b1d,0xbb81193a,0xbb851d1c,0xbb809ceb,0xbb8cae90,0xbb85c567,0xbae906dd,0x3b4f116d,0xbbb357be,0xbb209bfc,0x3b4eddd7,0x3b3b8ecc,0x3b2282f1,0x3b01db30,0x3aeeaf5e,0x3acba8bb,0x3aa79cf4,0xbb25c5bb,0xbbbbb0af,0x3b0f63d3,0xbb058bba,0xbbca9db4, +0x3b8ba4b3,0x3a2a477b,0x3bdb6c5e,0x3b6280ce,0x3b719ebc,0x3b4988ff,0x3b77ceab,0x3b8a5d57,0x3ba62205,0x3b978b63,0x3b94428b,0x3b933f62,0x3b8cddb8,0x3b86491f,0x3b6cdf80,0x3b7dd310,0x3b8428e8,0x3b8cd79d,0x3b963b5f,0x3b823150,0x3bc469c1,0xb8e2a31b,0xbba89c5c,0xbc3a3770,0x3ac63ff6, +0xbb9293dc,0xbc1ee131,0xbc23b98c,0xbc20c542,0xbc111d5c,0xbc1a3dbf,0xbc1c2367,0xbc1fa491,0xbb739457,0x3b4856af,0xbc2d545d,0xbba41d41,0xbbc0e577,0x3bc96faf,0x3b6ccff5,0x3b29e751,0x3adad22c,0x3b4a7d1f,0x3b8becc0,0x3bcdcaf2,0x3bbdeab9,0x3bc375c8,0x3bc56be3,0x3bc26b23,0x3baaa75b, +0x3b767560,0x3b85c201,0x3b8f316d,0x3ba988b2,0x3bb5802c,0x3bbd6ce2,0x3b9bb9ec,0xbbc97b9a,0x3a1c45a1,0xb98b26f8,0xba70ef48,0xba7f3d04,0x3b5b9a73,0x3b4fbbd1,0x3b6edf0c,0x3b0632a6,0x3b87885b,0x3b8d2667,0x3a74b031,0x3b4ebbbb,0x3999cb45,0xbab8577a,0x3b73141c,0x3b1d7b4a,0x3be80362, +0x3b946a19,0x3abbabf9,0x3a050c92,0x3b17a1eb,0x3b97a369,0x3c1a82a9,0x3bfb1091,0x3bfb0458,0x3bf103ba,0x3bd6d8fc,0x3bab5a9f,0x3b2771d9,0x3b67fb89,0x3b8e652d,0x3bc89a97,0x3bdc8c12,0x3c04d45e,0x3b4d7205,0xba93af5d,0xba8d193a,0xbac6c094,0xba454de9,0xbacbcffc,0x3b8f27b1,0x3a831afa, +0x3ba4f549,0x3b1fe4be,0x3b9f5835,0x3b1aa662,0x39fabec6,0x3b153770,0x3b0385ad,0xbaebd913,0x3b5272ff,0x3a3a8b4a,0x3be022ff,0x3b2d71f0,0xba2b3090,0xbb11b468,0xb97f079f,0x3b46977f,0x3c28d0dc,0x3c10b360,0x3c234ca3,0x3c341d39,0x3c3292b0,0x3c00bd36,0x3b48ec54,0x3b5bc796,0x3b8dbfb0, +0x3be48179,0x3c097715,0x3c166d93,0x3b85de59,0xbb458c9e,0xb99211e9,0xbb82a0b1,0xba744920,0x3a9af469,0x3bb78b00,0x3be46389,0x3bdd877b,0x3bad6c52,0x3b9fe1a5,0x3ba7e2d0,0x3af1bf82,0x3bd93f26,0x3bb5aa1b,0xbacea99d,0x3b16c8dd,0x3c458d74,0x3c6570a8,0x3c37728b,0x3ba2f6ea,0xb9d4c196, +0x3c1b3f5e,0x3c4f2255,0x3c126b93,0x3c5978bb,0x3c1ae77f,0x3a847716,0xba1269b8,0xb9e65b80,0xb9363e52,0x3ba9f024,0x3bf53334,0x3c19869c,0x3c158b03,0x3c3620d0,0x3bebb387,0x3afc90f8,0x3bbd8ef0,0x3b395b89,0x3b3daaeb,0x3a639eb5,0x3a93cfec,0x383e8404,0x3b666b4f,0x3c3fee95,0x3b9847ae, +0x3a0573c3,0xba986744,0xbbf40b16,0xbbea6864,0x3b2836a7,0x3c3dc019,0xbcb313bf,0xbbdc15f5,0xbb63a7e3,0x3b0ea7a3,0x3bf7a15c,0x3bc72adf,0x3b22a75a,0xbb4e5df1,0xbbaab61e,0xbb08cdbe,0x3c1ad46c,0x3ade85d8,0xb95a6850,0x3b448429,0x3bf4a40a,0x3c2fd64b,0x3c3cd797,0x3be93947,0x3bbba6f0, +0x3ad9c30f,0x3991510c,0x3b11adde,0x3b0cdbca,0x3afefb36,0x3b4481a8,0x3b679382,0x3bc95bb0,0x3bb9014a,0x3b0d3348,0x3b11d626,0x3b17ac99,0x3b914cd8,0x3bdd5f9e,0x3c124e6c,0x3ba36f3a,0xbc5e76cf,0x3c826078,0x3c93957f,0x3c57f662,0x3c3d38df,0x3c719890,0x3cd884a5,0x3cde37b3,0x3c47ae74, +0x3c355c0b,0x3bd687f8,0x3ba6b48d,0x3c6254ba,0x3c9dc530,0x3ca29a9d,0x3c88a6c7,0x3c238222,0x3a11c2ad,0x39d8612e,0x3b1f09c9,0x3a691124,0xb8d5509f,0x3aa4e8db,0x39d07b87,0x3adce9f1,0x3b1e1eb4,0x3ae3b793,0x3abb35ca,0x3acd9275,0x3ac18550,0x3b7f97aa,0x3b9d15f9,0x3bb51b3b,0x3b0aa8eb, +0x3a2d1980,0x3b3b71c7,0x3c541bb1,0xbc1cb637,0xbbe44d39,0x3ab7f18a,0x3c1a58f8,0x3cb6df35,0x3c9d23b3,0x3c8266ee,0x3c1b7f6b,0x3c3770d0,0x3c1eb1a6,0x3bebec3f,0x3bb40238,0x3b5fcd6e,0x3b6a7f85,0x3bc74efc,0x3c09e6a2,0x3c09e2ad,0x3be17c2a,0x3b8e815d,0x3ab1860f,0xba9c8909,0x38e66b8a, +0xbaafbff2,0xbae925d1,0xba92a0bc,0xba0c7f38,0xb92d7b89,0x3a0aadf8,0x3a492123,0x3960fe70,0xb9278454,0x3aa6624d,0xba2900d4,0x3a9c8dcb,0xb9ef59d4,0xbbb472b4,0xbb515bd2,0x3bf74c25,0x3c790254,0x3c4c71cb,0x3c56f5de,0x3c37511d,0x3c3d5670,0x3c372888,0x3c01babf,0x3bbecd13,0x3b9bc688, +0x3ba26254,0x3ba3974d,0x3b8df006,0x3b2b2d9d,0x3ae8dd93,0x3b1b60c7,0x3af8e923,0x3b324120,0x3b152f5a,0xb9287e0c,0x3ac26e98,0x3ab07e1e,0xba56ea3a,0xbad6ff37,0xbae2b217,0xbb507fbe,0xbb28faf6,0xbae2b57e,0xb9c1938f,0xba25479f,0xb9e380fa,0xb804c455,0xb995b427,0xbac9c7c6,0x3b07b183, +0xbc31405a,0xba8717d2,0x3b89d0ab,0x3b753b7a,0x3ba4f53d,0x3bca3157,0x3beaaf65,0x3c0dd211,0x3b62c699,0x3ac0656a,0x3a8e508e,0x3b42d40a,0x3b836460,0x3b96fe99,0x3b497be8,0x3b39de93,0x3b6b97a0,0x3b71c243,0x3b4c8785,0x3a6c4f87,0x3aec0e9a,0x3ac02eaf,0xb9bc9f96,0xbad5a3f1,0xbb3b997b, +0xbb850818,0xbb7a0f25,0xbb9b991b,0xbbaf69d1,0xbbd7a424,0xbbfe0169,0xbc0720a2,0xbc2d9aaa,0xbc281bf4,0xbc272cd6,0xbbbe0623,0xba35bd27,0x3ad1389e,0x3b3dd2e4,0x3b149fa3,0x3b3db07a,0x3b2b724a,0x3b2000fe,0x3b33ca9a,0x3b34a3b3,0x3b46fbe6,0x3b3be83c,0x3afa9b83,0x3a5f2a09,0xb9234532, +0x3a23628b,0x3a977295,0x3ad983bf,0x3b02855d,0x3b5a5170,0x3b434249,0x3a164bcd,0x3a0d9ec1,0x3a47f962,0xbaba0464,0xbb91522e,0xbbd1c743,0xbc00bef8,0xbbd49939,0xbc0e1f7b,0xbbe1c764,0xbbf8b431,0xbbd203d9,0xbb9ba61d,0xbb58caa8,0xbb310da8,0xba916899,0xbbe44dd9,0xba997e07,0xba3b9d76, +0xb8d734ea,0x3a1f55cb,0x3abaf27f,0x3b15fa1f,0x3b3f7e29,0x3b199941,0x3ada3163,0x3a92162f,0x3a0a14e1,0x38bbf661,0xba220eb2,0xba0cbcec,0xba2a67d8,0xba2c7be7,0xba407abb,0xba8d6e94,0xb9c80081,0xbb346555,0xba6cb8a4,0xba9231c6,0xbb1277c9,0xbb145155,0xba93def3,0xba197542,0xba4e6084, +0xbb0a1891,0xba75a590,0xba7583a3,0xbb23a2e0,0xbb0dbcf4,0xbb75b4a5,0xbb60725f,0xbade0e4a,0xbb04e783,0x3a3381ed,0xb955e64a,0x39929d9a,0x39d79ebc,0x3a128559,0x3a33cac9,0x3a8fad78,0x3a462c49,0x3a25c19b,0x39fa9f59,0x39b7b11b,0x395e8049,0x37f4ff19,0x3844de39,0x37aa817e,0xb78219e6, +0x387f1eb5,0xb9019743,0x39f1e396,0xbabd609a,0xbb8c9940,0xbc04acde,0xba795bdb,0xbb997848,0xbc163db8,0xbc15f5f2,0xbc1156a0,0xbc063663,0xbc0ac13b,0xbc07b82c,0xbc00a3da,0xbb9757bb,0xba55c7d7,0xbc0650c8,0xbba7d915,0xb8dcf7de,0xbb930ac4,0x3aec0d2b,0xbbc160fb,0xbb77f79c,0xbb90e0c1, +0xbb841875,0xbb9a772f,0xbb9de374,0xbb928c25,0xbb9b4646,0xbb9b0ea6,0xbb9759a1,0xbb91efe9,0xbb947503,0xbba4dc05,0xbba7fb5b,0xbba693e6,0xbb9d9a73,0xbb92062d,0xbb77adb3,0xbbc15a05,0x3ab3d3b1,0x3bad3cf2,0x3bfe6b1f,0xba36a82b,0x3ba57420,0x3c0b0002,0x3c0b3e32,0x3c0c41e2,0x3bfdde67, +0x3c115e99,0x3c116fed,0x3c019461,0x3bad2d98,0xba892f2f,0x3bf9ebc4,0x3bd511f7,0x3beebff7,0xbb85325f,0xbb9c2c6a,0xbb90895f,0xbb813ac3,0xbbaccfbb,0xbbb87a09,0xbba671dd,0xbbbcf8d1,0xbbb50778,0xbba52a8f,0xbb8e6cb3,0xbba68ad3,0xbbe28bd1,0xbbf99f32,0xbbf3b159,0xbbd5b8bf,0xbb9d61d7, +0xbb9b020f,0xbb684ec3,0x3ba61845,0xbb19d318,0xbabded8a,0xba9a26fd,0x398842b1,0x3a02132b,0xba893b12,0xba1bbbe6,0x3b0ac588,0xba0e7da4,0xbad6452d,0xba338539,0xb92fe806,0x3af7f177,0xb70aa2ec,0xbb328011,0x3b86d44c,0xba7475f2,0xbbbafbf6,0xbb9fcd80,0xbb840d41,0xbbd74d2c,0xbbe6425b, +0xbbbdd18d,0xbbea8998,0xbbdc3e12,0xbbce7f1c,0xbba4420b,0xbbbfbca8,0xbc0d0c2b,0xbc210188,0xbc1b27b4,0xbc004147,0xbba06f11,0xbba937a0,0xba893069,0x3a92a239,0xbaaba5d7,0xbb0c1030,0xbb27699b,0x3a2c160d,0x3aecf91e,0x3b3341fc,0xba121b8a,0x3b8f0951,0x3b0879d2,0x3b87bdb8,0xb9cb82cc, +0x3b1ee3ce,0x3aed163a,0x390f2b8b,0x3aae686e,0x3b5ec62a,0xbae93f54,0xbbb8e618,0xbb6fb6cd,0xbb22eee3,0xbbb9a111,0xbbdfdc9a,0xbbc3994b,0xbbfdcc15,0xbbe5d98e,0xbbaa1d6d,0xbb1abfca,0xbbaa6ec2,0xbc39cf08,0xbc6906a2,0xbc63e6db,0xbc316323,0xbbb95329,0xbb9ce667,0xbabd1600,0x3a966a33, +0xbba1ddf7,0xbaf59667,0xbb7730f9,0xbac1fd33,0x3b701b55,0x3ba076b6,0x3bcd8874,0x3b6ecc0b,0x3ba0b053,0x3b7cdc59,0x3aae4d12,0x3ba401a4,0x3b8f35d3,0xbb4e1823,0xbae69af6,0x3c9a25d9,0x3b50d65a,0xbbfbfc9b,0xbc3c884b,0xbc784fae,0xbc165b6c,0xbbd10d57,0xbc26852e,0xbbe64086,0xbc1bfe3a, +0xbc87334f,0xbc918d70,0xbc74a782,0xbc1c1063,0xbb4fd986,0xba75c4b0,0xbbc13980,0xbb7190b1,0xbb97b0e8,0x3af3636a,0x3bda596d,0x39cfef2b,0x3a95271a,0x3ad3726d,0x3a94f1a7,0x3a2cf7f9,0xb9a40b56,0x3b439eac,0x3c238f8e,0x3b60e974,0xb9c1c5b7,0xbb077791,0xbc0ff9b0,0xbbaad75c,0x3bb45310, +0x3c848ced,0xbc9b2c67,0xbc78ec9e,0xbc76ba42,0xbb40b468,0x3c162765,0x3bb00864,0x3b11fc3b,0xba11de1e,0xbbea099c,0xbbb7e34c,0x3bd83d40,0x3b0a8455,0x39927d9e,0x39d42cf2,0xbaaed337,0xbb3742c6,0xbbd5b61b,0xbb688da1,0xbb8f9577,0xb9248e48,0x3b404077,0x3b281ed3,0x3b1ee34a,0xba3ed009, +0x39f953dc,0x3b4dc2bc,0x3bacc07f,0x3b984ff3,0x3aacfad4,0x3a5c1d60,0x3ad96df2,0x3b67d0f4,0x3c065906,0x3bbf2e20,0x39de474f,0xbc993e94,0x3c898497,0x3c7ce58f,0x3c16c680,0x3b137e91,0xbbe900c8,0x3b096b4e,0x3933b5b0,0xbc5e02cb,0xbc5a45d9,0xbc5f2973,0xbc46dd84,0xbc1490cc,0xbbb844e2, +0xbb3568f0,0xbb1188d7,0xbab06ffb,0xbb1df712,0xbaf1b00a,0xbb8ae951,0xbb398a66,0xbac61665,0xbad3b1a7,0x3a4dce48,0x3ac8b9f4,0x3b0cafe5,0x3a85ecfd,0x39bd011a,0x39957444,0x3a39388c,0x3b670e08,0x3b9b5164,0x3bca26de,0x3af42cd8,0xbad9817e,0x3b8d7076,0x3c430dae,0xbc04b620,0xbbdfa46b, +0xbc14cc1c,0xbbca09ef,0xbc07e699,0xbbaf6b92,0xbb3b0701,0xbb3ac5ac,0x3c0a912c,0x3c2c669c,0x3be96b34,0x3ba9cf80,0x3b1e41c2,0x3ae125fb,0xb929de71,0xba54207f,0xbb33276c,0xbb458a30,0xbb7ebdf8,0xbae392e2,0x3ae85ace,0xba1e97c6,0xbb2d1ab0,0xbb2734fb,0xbaef5d03,0xba68aa97,0xbaad1c7a, +0xb9bd9f1c,0x38334b86,0xba2cf7a6,0xba9139e4,0xba4aae2d,0xba0abf39,0xba849b3d,0xb96cb208,0xbbdf141e,0x3c0e763d,0x3bd8d269,0xbb157f4c,0xbb4d0c36,0xbbaccca4,0xbba15dce,0xbb81b024,0xbb1be744,0xbb3f2557,0xbb7cee50,0xbb9e8ea7,0xbb27c793,0xbab9af82,0xbaa1bfba,0xb7c4681c,0x3a7f1fad, +0x3a7beb25,0x3b1847ac,0x3a8955f5,0xba07637f,0x3ace6411,0xba226480,0x3a243540,0xba93341b,0xbb20f27d,0xbb1fe0ba,0xbb500637,0xbb510677,0xba2c0f87,0xba6a3d9c,0x389fdbaa,0x3a90a13e,0x3ae29231,0x3b12884f,0x3b64a6b9,0x3b5c030f,0x396c7add,0xbb39d902,0xbbc4f741,0xbb75cfbc,0xbba1d6ca, +0xbb96292e,0xbbad417f,0xbbc41dac,0xbb67cd66,0xbab8214d,0xb9575138,0x3915163c,0x395fddfb,0x39bcb4d7,0xba8bcf3f,0xbaeaf16e,0xba8f94cc,0xba99004f,0xb9c5bd2b,0x3acc8a46,0x3b07baab,0x3a6b0475,0x387bcfe2,0xbb38e243,0xbb7da778,0xbb87dd1e,0xbb8e9308,0xbb9e124b,0xbbe075ce,0xbbf603e8, +0xbc0808ef,0xbc0e3b29,0xbc2e7dc4,0xbc391303,0xbc1da2e0,0xbbf8cc61,0xb91f8978,0xbab211e1,0xbb455576,0xbb0eddcc,0xbb226066,0xbb2deead,0xbb4ecbad,0xbb85843b,0xbb541a70,0xbb3a6455,0xbb01f203,0xbb0758a4,0xbb0643a4,0xbaeaa5f9,0xba9f24f1,0xba16cdc7,0xb9a1b692,0xb8ba8fc4,0xba51245b, +0x3a0a707b,0x3abcf92c,0x39c1dfc0,0xb98fd584,0xbb17b9a3,0xbb785d73,0xbbdb5959,0xbbce0559,0xbc01a478,0xbbdc3d94,0xbbf3236c,0xbbced71e,0xbbe1fab9,0xbb946028,0xbb0acfe7,0x39c06dbc,0xba6392d5,0x3994429b,0xbb5af350,0xbb79090d,0xbb8599be,0xbb96bcc6,0xbba4c0b1,0xbbaf0934,0xbbb914b9, +0xbba3f0a9,0xbb9355c5,0xbb838c94,0xbb5cae27,0xbb25fb85,0xbada3ac3,0xbafcb47e,0xbb0d610a,0xbb1a750d,0xbb1c1c81,0xbb20bd9a,0xbb3bd20b,0xba3b8952,0xbb4b07c5,0xbb42dab8,0xbb2735c1,0xbafd81ab,0xbb3bba37,0xbb4c5782,0xbb32e699,0xbada5974,0xbb4e50f9,0xbb672199,0xbb3b4e31,0xbb5243a5, +0xbb276a98,0xbb359364,0xbb804d25,0xbacc1822,0xbb9b4ece,0xbb843e48,0xbb8e8762,0xbb926f3e,0xbb9632ff,0xbb9b2cbc,0xbba5d666,0xbb9d7bb8,0xbb97715a,0xbb8fa027,0xbb87f771,0xbb82f6a5,0xbb7157ac,0xbb7a2f34,0xbb78b1cf,0xbb78856f,0xbb7dee75,0xbb73244f,0xbb927373,0xbae1d181,0x3a390fbb, +0x3b266a7f,0xbb2cd9b7,0x3a0eff42,0x3b2b509d,0x3b2ef1c0,0x3b1cccc7,0x3af0fd41,0x3b14bef4,0x3b114f92,0x3b04bcda,0x3a136faa,0xbb27ae23,0x3b045c29,0x3a7d9082,0xbba8b4a9,0x3a2e1bf9,0xbb98185d,0x3b3fa635,0x39dc3c91,0x39a23c7f,0x382bcf86,0xb92cc46f,0x37cb7266,0x3a6502c3,0x3a1983c4, +0x3a2de3fb,0x3a62f769,0x3a6405a2,0x3a364313,0x38b182ab,0x396f9127,0x39a22bfc,0x3a0dd0c8,0x3a462f4e,0x3a202bee,0x3b1f6069,0xbbaa187c,0xbbfaa344,0xbbd828f6,0xbb82482e,0xbbf2026d,0xbbb8b4b4,0xbbd74f9c,0xbbd6c423,0xbbb1214e,0xbbd7b3ac,0xbbdfe306,0xbbe9f64c,0xbbe02675,0xbb330abd, +0xbbd4e9df,0xbbf9e719,0xbbde1b1f,0x3a646ec9,0x3a47c8a5,0xba567b82,0xba8ecb0d,0xbb05a753,0xbaf15a0e,0x3954c1e9,0xb8abdc6c,0x3a35afbf,0x3aba2144,0x3b0bf9d4,0x3ad2a6f9,0xb9b51690,0xb9f8d130,0xba338ef4,0xb81f4db3,0x3923693a,0x3abd928f,0x390bdc35,0xbbd24958,0xbb03ac89,0xbb80f9dd, +0xbb43ce72,0xbb41a21d,0xb8e7b1f3,0xb9a741ae,0xba5631ff,0xbac9b9be,0x399ff0e5,0x3aaf2190,0xbaa56e65,0x3903f40a,0xbb04e72e,0xbb94dc43,0xb93e6309,0xbb0abd0f,0x3afd37a1,0x3ae2b08d,0xbb03204f,0xbada1b5f,0xbb8c2ed9,0xbb81bcaa,0x3a699583,0xb9c0ef8d,0x3a5d1f41,0x3ae35d7b,0x3b123c40, +0x3a91b37f,0xbb2d020e,0xbb0e479c,0xbb0770ee,0xb9e910ac,0x39b94f20,0x3b3056db,0xb98c5c09,0xbb86e727,0xbb5b3b12,0xbb6055a6,0xbb37d292,0xbb60fb4e,0x3b256856,0xba8cae0b,0x3b3bd4c6,0x3a424b4d,0x3b82efd1,0x3a69b526,0xba6eefbe,0x399c05ca,0xb98abc76,0xbb8dd0bd,0xb978b610,0xbb31a445, +0x3ae52300,0x3a91b688,0xbb364d9d,0xbb381f36,0xbbed7d72,0xbc025d35,0xbac406cf,0xbb0e1f5e,0x3a560ed8,0x3b835094,0x3bcba1a4,0x3b67de93,0xbb565bf6,0xbb8f93a7,0xbb9f7730,0xbb2bb832,0xba42c332,0x3b3e88c7,0x3a472590,0xbb865223,0xba779881,0xbb944f6f,0xbb1511ad,0xb84ab9d8,0x3bb52eca, +0x3ba980de,0x3bac5a8a,0x3bbfeec2,0x3bab4034,0x3bb61949,0x3b20da72,0x3bc66160,0x3b45569d,0xbb73ecaf,0xba883b99,0x3bc1e430,0x3b9ebf4c,0x3b8a7adc,0xbb19021c,0xbbc81384,0xbadcd64f,0x3aaec913,0x3a8d92ab,0x3bc06abb,0x3ba7fe12,0xb8b1889e,0xbb188f89,0xbafb6032,0xb9e56dfc,0x3b486fe1, +0x3ba0c75f,0x3bf03089,0x3b989f89,0x3ba86880,0x3aafe35b,0xbaca0ac6,0x3b3cf223,0x39796947,0x3b13e52c,0x3a0676b7,0xb98194d1,0x39a40def,0x3b53a3f9,0x3c0cc6d8,0x3b2f2974,0xba4e6716,0xbb87dc5c,0xbc1b3b52,0xbc019861,0x3b2a189c,0x3bfd8ac1,0xbcb5372d,0xbc17e931,0xbb74491c,0x3a362e6a, +0x3c394c79,0x3b22ef7d,0xbb1b29b8,0xbb3e1ba7,0xbbdf9f9d,0xbb6e0d56,0x3bfcca58,0x3aaf865a,0xba7d0ff3,0xb6309968,0x3accb1c0,0x3ae9902d,0x38ae02b7,0xba2a53f6,0x3aac4501,0xba2e3304,0xb9f2e156,0x3aca339b,0x3a3d0e80,0x3a9ff864,0x3b212583,0x3b75f042,0x3ba68e07,0x3b847a20,0x3a677b06, +0x3a561a63,0x3ab75051,0x3babfdd3,0x3c0d0243,0x3bf08268,0xbb8d81fd,0xbc7a8047,0x3c525295,0x3c820199,0x3c097762,0x3a6d79ea,0xbbbf11a4,0x3b6f4b97,0x3be445e5,0x39d81216,0x3bb2c7a8,0x3b7a0fde,0xb943c5d5,0x3bc99b9a,0x3c16ff37,0x3c1b2a8a,0x3c10d2c3,0x3bc09bb4,0x3a0b58a2,0xb97be28e, +0x3ae925e4,0xba8bc4d7,0xbb1fcfa2,0xb8c2f654,0xba67cb6e,0x3abbf1e1,0x3b09a083,0x3a1f1776,0x3a0f219c,0x3a66eb46,0x3a5b26db,0x3b7988e7,0x3b9d30d9,0x3bb547f5,0xbac0deed,0xbb51658d,0xb9380c4c,0x3c2339fa,0xbc18e102,0xbc16cd83,0xbbf88d0c,0xbbc7f107,0xbac003a8,0xbaf8b7b4,0xba91b39d, +0x3ad2248d,0x3bc02db7,0x3bd0d1fd,0x3b15819f,0x3b492d77,0x3b05eb23,0x3b09657f,0x3aa8c6e2,0x3b07f8d7,0x3b12442f,0x3aa81f5b,0x3a6ddfca,0xbabfab7c,0xbb1eeb5f,0xba9b1345,0xbb23bfef,0xbb3c592a,0xbb07dfe2,0xba4fd9b4,0xbaa1da0f,0xbaa03a24,0xb96c8285,0xba37bd48,0xb9fe921a,0x3aaf429a, +0xb80495a8,0x3a174ea0,0xba5594bf,0xbbac2795,0xba88c5f3,0x3ac03d1b,0x3b5ef67b,0x3ab426c4,0x3b145e56,0x39cd0cdd,0x3b2151f5,0x3bcd2177,0x3b07e027,0xba320586,0xbb939b88,0xbb5976e5,0xbb0c3ced,0xbab9271f,0xb90d06c2,0x3a5d4cd4,0x3b0eeb36,0x3ae229d1,0x3b07fd81,0x3a243138,0xbaa75565, +0x39625f74,0x39e2c1f0,0xba988a1c,0xbb097c8a,0xbb0d10bd,0xbb4f0911,0xbaf66db1,0xba54a96e,0xb9718401,0xba11d034,0xb948f439,0x3a2f886c,0x3a84f7e3,0x3a416be0,0x399a930c,0xbc33ac76,0xbbd6a85c,0xbb379acc,0xbb14d64b,0xba0be497,0x3ad67602,0x3b33da2f,0x3b3cc43c,0x3b05097c,0x3b169687, +0x3b2d1d8b,0x3b3e766c,0x3b007e45,0x3a80063c,0x35b60ce2,0x3946f42e,0x3b2b889a,0x3b273249,0x3b2d2984,0x3abc83ef,0x3adb90ea,0x3a0bb871,0xbb4fd895,0xbb705fc2,0xbb6b3cb7,0xbb60752e,0xbb5c02e6,0xbb9136ef,0xbb9b5284,0xbbce0079,0xbbed6375,0xbbf0365d,0xbc25d867,0xbc376170,0xbc3a0c5d, +0xbc2350d4,0xbb3a1ccb,0x39127ac8,0x3ad656a6,0x3a81139c,0x3add0ae3,0x3a8f6a62,0x3a89c572,0x3a919fef,0x3a7c662b,0x3a4eebe5,0x3a4412c6,0x3a25bef2,0x3a240c88,0x39d65787,0x3aa2c264,0x3ae001c8,0x3b153dd4,0x3afb570b,0x3b3dcc72,0x3ae58996,0xba914e4d,0xba799d36,0xba94541c,0xbb109075, +0xbb939cf1,0xbbb6573d,0xbbea5865,0xbbc5a1d4,0xbc0d3f91,0xbbdd7190,0xbc010e9a,0xbbede722,0xbbc517e1,0xbba6c9a2,0xbb9975a8,0xbb48c837,0xbba53b34,0xbb01d897,0xbacced07,0xbad72199,0xbaadcdbe,0xba8912a0,0xba455054,0xba2d6214,0xb9b1f00a,0xb8840a3d,0x38c16f0a,0x39107f02,0x3890502c, +0xb9963e35,0xb9b00017,0xb9e325a6,0xb9c547f5,0xb9d9eb59,0xb9b1cebe,0xb905a227,0xbb516ff7,0xbacd5057,0xbb31a10b,0xbb46624f,0xbb691087,0xbb450ff8,0xbb0ed986,0xbb2af411,0xbb612eac,0xbb06b986,0xbab8b2ae,0xbb1515b1,0xbb0aafe8,0xbb4bb806,0xbb54853c,0xbaf4f294,0xbb86c90e,0xb8a5820e, +0xba692e79,0xba43ae4a,0xba450e0f,0xba4cb8e6,0xba4bb52c,0xba40e9e2,0xba30d834,0xba2d4cdf,0xba244379,0xba1b2355,0xba0b07ef,0xb9e45899,0xb9ed5b15,0xb9fb0854,0xba06d02b,0xba0421c9,0xba343153,0x393a8e03,0xbb748084,0xbbbe8564,0xbbc82e55,0xbb665036,0xbbd33af9,0xbbdfdfbc,0xbbe2d815, +0xbbdbd978,0xbbc5ceaa,0xbbd6937f,0xbbd34610,0xbbc80d32,0xbbbf80ab,0xbb511d5d,0xbbb75052,0xbbc30c4d,0xba9f7f10,0x3895955e,0x3ba744f7,0xba4aa31a,0xb8818163,0xb8e6d940,0xb8d5edf2,0x3954e471,0x39ba6519,0x39fd2f2a,0x39b0ede3,0x399e2e5e,0x398fb220,0x39fe0027,0x39cf2a78,0xb8cf03ce, +0xb990251c,0xb9b0bf25,0xb94d3eff,0x38424e66,0x38ba4794,0xba40e465,0x3b943afa,0x3b9648e0,0xb9313ab8,0x3b723bb9,0x3ba031a0,0x3aaa0715,0x3ab84fd0,0x3ad37145,0x3ac6102a,0x3b23683c,0x3b271937,0x3b03245f,0x3babb051,0x3b7df2af,0x39804459,0x3bb779b3,0x3b949064,0x3a9c85b8,0xba6abef9, +0xb91ed706,0xb94e4aff,0x3a705178,0x3aaa6ad3,0x3aa7c8e4,0x3a752f19,0x3a8e74fe,0x3ab0b4e7,0x3b089e76,0x3abd9c7d,0xb9a4967d,0xba873acb,0xba8d6154,0xb9fb8f68,0x39f2c7b8,0xb909b9fb,0x3ac051ca,0x3b266687,0x38e8e01a,0x3a9714d9,0x39a3ac09,0x3aa12eab,0x3b59a62b,0x3ad53a48,0x3b3940b7, +0x3b9e86af,0x3b49fe5d,0x3ae8f37b,0x3ae1c178,0x3b1b3cd3,0x3b262590,0x3ab7d13d,0x3aa846f1,0x3bc345b8,0x3b0eeaaa,0xbae0a970,0xba21aefd,0xba5f99bf,0x3a95510d,0x3b222ae0,0x3b27b85a,0x3b0eb7aa,0x3b19de33,0x3b0a0801,0x3b6736ec,0x3b2c58b6,0xb9525010,0xbac17933,0xbae3230a,0xba3bb682, +0x3a05b647,0xb8afd0c1,0x3af7f0bb,0x3b17f5f6,0x38e89eb1,0xba84e206,0xba2f5aca,0x3a839ba3,0x3b6b2f70,0x3b09995e,0x3a51392c,0x3bb5863f,0x3b47e231,0x3b90d737,0x3a8ff4aa,0x3b37848d,0x3b26398f,0x39f6758b,0x3b7ad950,0x3b9287ea,0x3a86cb6e,0xbb35403e,0xba44b0b9,0xba4ac03e,0x3b48791f, +0x3b8dc140,0x3b71284f,0x3b5910bd,0x3b85c049,0x3b9d5970,0x3c0447fe,0x3bc5486f,0x3865ac92,0xbb14f378,0xbb387488,0xba91b101,0x3a8fe8f6,0x3946bde2,0x3b0c3322,0x3a8d8f60,0xbb4a66f0,0xbaf60289,0xbb357e65,0xbab2c2ca,0x3b83c774,0x3b7b86c4,0x3b94e0a7,0x3b8c31a7,0x3bb998e6,0x3b95f3c8, +0x3b007680,0x3ba98cec,0x3b867403,0xbb6a186e,0x3a535b48,0x3c93885a,0x3bf1836f,0x3922cd1a,0xbb3c3941,0xbbd56b69,0xbaac0928,0x3b68b0bf,0x3bafdbf4,0x3b84db24,0x3a209e85,0xbba8abb5,0xbc2ac2bd,0xbc2b7a71,0xbc05e47f,0xbb0a456e,0x3a16cf56,0xbafddc95,0x3a192ec4,0x3a729490,0x3bab7858, +0x3baf0842,0x3a91dea7,0x3a82bc4f,0x3b2d7939,0x3aef39ee,0xba2a8801,0x3a1d5d9c,0x3b57285b,0x3bd59c88,0x3b2f6127,0xb9fa8fd2,0xbb5ad37b,0xbc096ac8,0xbb64e566,0x3bf532b3,0x3c8aff4d,0xbc60dc8b,0xbc1b767b,0xbc4d24e7,0xba60ed93,0x3c577686,0x3c0e4618,0x3baab50a,0x3b81b4b1,0xbb7b085b, +0xbb5f5661,0x3bc354c2,0x3b2a47b4,0x3ab1584b,0x3b0742bc,0x3af4a324,0x3b2db5b9,0x3b4496fb,0x3b719ed7,0x3ac15180,0x3b0ddf8b,0x3b0f81e3,0x3b1d25dc,0x3b392e4b,0x39f5dd5b,0x3ad95271,0x3b73e46c,0x3b8cca69,0x3b4aebbc,0x399c085b,0xb8979114,0x3ab959c5,0x3bb1e737,0x3c2a6b77,0x3bd8dfee, +0xbbacbe06,0xbc6bd4b3,0x3c4ae568,0x3c862b50,0x3bf40eac,0x3aea3f95,0x3b214a6c,0x3c3d159d,0x3c7ec929,0x3c39bc7a,0x3b66af58,0xbb21279e,0xbb97266c,0x3b2071b4,0x3beeb25c,0x3c153953,0x3bf30e0f,0x3b92e346,0xb9943249,0xba653699,0xbb1a3fb0,0x3a167e56,0x3aa1a258,0x39107355,0x3aa66d1d, +0x3b489b8a,0x3b30e407,0x39c53545,0x389fa90f,0x3968842e,0x3a14c503,0x3b7d11e7,0x3ba4daee,0x3bc612ba,0xba5622b4,0xbb988e64,0x3adb7192,0x3c02ab5d,0xbbd6df20,0xbbdd0782,0xbab3ef47,0x3bdb8750,0x3c46637e,0x3c14ebd8,0x3bbbab66,0x39b5f690,0x3c29f401,0x3c5cae07,0x3c237718,0x3c284b71, +0x3c072080,0x3bc04eb2,0x3b81b9cb,0x3b7878a6,0x3b25e8ea,0x3aa0591b,0xbab1c00c,0xbae17738,0x38825536,0xba4610ac,0xbb1599b5,0xbb2c33d2,0xbafd2a1c,0xba0d7843,0xbb0303d5,0xba9af5b9,0xb9a5e23a,0xba7421e7,0xba382216,0x392c682a,0x3a37568f,0x3a3a0e15,0xb9ed9d26,0xbba5c355,0x3c02dc89, +0x3c61df16,0x3c851596,0x3c821f60,0x3c555db1,0x3c46f430,0x3c453b77,0x3c4a9be3,0x3c02622e,0x3bab6a14,0x3b8cc54a,0x3b469060,0x3b2ac472,0x3b439445,0x3b111802,0x3aeb3986,0x3ab13c11,0x3b11c3cb,0x3af962cd,0x3ab93ac8,0x3b2bb5c1,0x3a6431e8,0xb718b19b,0xba8c351e,0xbb0d75fb,0xbb03c258, +0xbb172237,0xbac890f3,0x3ab14943,0x3a22846c,0x3aaa0b3f,0x3b199df4,0x3b366203,0x3b6e75a1,0x3b83d933,0x3bedb1d4,0xbb935e0e,0xb9828e6e,0xbae695c7,0xba5971f3,0xbaa2e757,0xb9f53757,0xb982d153,0x3ab569d9,0x39c01fdb,0x3a149825,0x3a613ae8,0x3b19339d,0x3b46e704,0x3b4534de,0x3b2aa719, +0x3b1922a7,0x3b1d651d,0x3ae5f154,0x3aa1843b,0x3ab58f2d,0x3adb7ab9,0x3a20872e,0xba0f8956,0xbb1ef738,0xbb5a8669,0xbb3fd889,0xbb4b29bf,0xbb774cd9,0xbbb0c0eb,0xbbc40db3,0xbbd189c2,0xbbc69bb5,0xbc0c3aaa,0xbc107f58,0xbc0b6b0f,0xbbc942b3,0x3ad95393,0x3aa0ff02,0x39abc0a1,0x3ac6b706, +0x3aeae304,0x3b1bec04,0x3b33a204,0x3b4a1da5,0x3b4e2182,0x3b4fc413,0x3b4deccd,0x3b046aff,0x3a803694,0x38e21923,0x3a2a4b9d,0x3a90f64a,0x3abe65c3,0x3af37400,0x3adde0b8,0x3b4401ba,0x3b11fe33,0x395d5a5d,0xbaab7b81,0xbb110658,0xbb5c8d31,0xbb9c71b4,0xbbb20b72,0xbbc57ca2,0xbbbd45d0, +0xbbcfd2a9,0xbbc4a395,0xbbd0b539,0xbb8fb8b0,0xbb1d69fd,0xba618b1f,0xb940aa03,0xba7af6ad,0xba44bff3,0xba985810,0xba70c91d,0xba8b6c80,0xba8c2744,0xba941ffb,0xba8696a7,0xbab1bc54,0xbad95d19,0xbaec94f2,0xbaef5ecb,0xbacd908c,0xbaab15af,0xbab22976,0xbac2dbe6,0xbad74355,0xbacfbbba, +0xbafc19d6,0xbacb3113,0xba0647c2,0xba95d539,0xb9fd023f,0xba8b73f8,0xb9eb02ff,0xb990eee0,0xb9f31998,0x390d87af,0x39c2c7bb,0xb9d53641,0xba895888,0xba63b0ed,0xba92546e,0xba98d063,0xba5ad370,0xbab148fb,0x3abf4b0d,0xba629f28,0xba437928,0xba4aca87,0xba61565b,0xba63a841,0xba6fc166, +0xba7929f5,0xba8af064,0xba8ef011,0xba96fd8c,0xba9ad468,0xbaa8b4ba,0xbab1c11c,0xbab45a0b,0xbaaf225e,0xbaacb00a,0xbaa8b54c,0xba9ea420,0xbadeceaa,0x3a79e941,0x3abbab6f,0xba85425f,0x3a6c3430,0x3ac99432,0xbaaf5284,0xba8c7e5e,0xba8e3377,0xbaa07ecd,0xba372853,0xba0e709b,0xba0b7bbe, +0x3ab73ae1,0x3a876b2e,0xba9df37e,0x3acb4664,0xba8afb09,0xbb68879d,0xbbb7bb5c,0xbb3d18a7,0xbb48b00f,0xbb6977f7,0xbb5b11ff,0xbb8e10d2,0xbb921630,0xbb81bffa,0xbb825818,0xbb77093b,0xbb5f9617,0xbb563a5c,0xbb5ed85a,0xbb836f7f,0xbb854d8f,0xbb859b9b,0xbb7fee3b,0xbb72ec55,0xbb53f395, +0xbb484116,0xbbc3c5da,0xbb8c0792,0x3b0b1513,0xbbcba7e8,0xbb90ccac,0x3b25b293,0x3acb16f5,0x3ac22e71,0x3b095b83,0x3aa7a227,0x3a880b7f,0x3a126776,0xbb8900f9,0xbbbdb120,0x3aec865c,0xbb7c9de1,0xbafb9925,0xbb900ccc,0xbb4447d3,0xbb887065,0xbb71dac7,0xbbd171f2,0xbbeaa863,0xbbc48137, +0xbbc45468,0xbba20186,0xbb770ad3,0xbb320e29,0xbb4dbb7a,0xbba9b5fc,0xbbc2446d,0xbbd24c58,0xbbc2686c,0xbbb08c9f,0xbb804c93,0xbb904d2c,0xbb0e530c,0xbb79ad07,0xbbb1d189,0xbb649088,0xbb3c4593,0xbb134869,0xbb3b0301,0xbb6cf170,0xbb1842af,0xbb25de7d,0xbae4f4e5,0xbb0d7932,0xbb01747b, +0xbb040464,0xbb92628e,0xbb67391b,0xbb3cb81c,0xbb35f506,0xbb2cd7af,0xbba1704e,0xbb6a9083,0xbc15d1a9,0xbc2d2775,0xbc0098bf,0xbc033df1,0xbbc8616d,0xbb93e6a4,0xbb4a08a8,0xbb80a715,0xbc0092b5,0xbc0a619e,0xbc11d5e0,0xbbfcd05a,0xbbc9d7cd,0xbb8c9996,0xbb478d60,0xbb8a5ab7,0xbb874ac1, +0xbb8eaceb,0xbb7adcd7,0xbb40e297,0x3a797fa4,0xba8289eb,0x39316f89,0x3abd8073,0x3b285cb1,0x3a89b589,0xba96fd75,0xb98ed209,0xba71f81e,0xbb7bdfc2,0xbaee961f,0xbb222991,0xbb3d78db,0xbaf37df9,0xbb80e8f7,0xbb20c48b,0xbc2f91d2,0xbc700173,0xbc4306c0,0xbc3b55bf,0xbc00b459,0xbb6d21e8, +0xb8980172,0xbb0dbf9c,0xbc1d0c03,0xbc4cd65f,0xbc64bb19,0xbc49d602,0xbc198235,0xbba4cd49,0xbb346a70,0xbb348d01,0xbb396c73,0xbb7f4f7e,0xbb66546f,0xbabe5276,0x3b9a78bc,0x3b56e1b7,0x3b8472d0,0x3bc51b55,0x3bb88f79,0x3bab6a8d,0x3b3bdc65,0x3b9de727,0x3ab258f3,0xbb8fc55d,0xbb487e7d, +0x3b96b663,0xbb58f617,0xbbad2061,0xbc25c9ec,0xbc458b84,0xbc47a71f,0xbc1621a2,0xbbde9e28,0xbb6695fb,0xbb24c48d,0xbb969570,0xbc1110a5,0xbc017543,0xbb60db04,0xba9aff66,0x3993f1b8,0x3a6564a8,0xbae1c5b0,0xbb48bf14,0xbb5d4776,0xbae1689c,0xba2f8bae,0xbacf6d11,0x3adc0832,0x3a5427da, +0xbaab3e31,0x3a8a1c7f,0x3b54bd4f,0x3b9b6e85,0x3ab411bd,0xbab1d0d5,0xbbb479d8,0xbc1ba82a,0xbbc3b019,0x3b8a53ea,0x3bea0532,0xbc9883fc,0xbc2b929a,0xbbdf9336,0xba868eed,0x3c6b1676,0x3b03c36b,0xbb4e13f7,0xb801e1fd,0xbbe76a76,0xbba89d61,0x3b89013a,0x3acbde48,0xb9c4180b,0xbb26772b, +0xbb8493ee,0xbbd40783,0xbc20e1f0,0xbbe5e406,0xbb82c564,0xbafad812,0xb9781870,0x3a31343a,0x397f99c0,0x3981ae4b,0x3ad62ee9,0x3b6a0b38,0x3b7a1587,0x3b1758f5,0xba1a03e0,0xba3c9f6f,0x3a8033e4,0x3bc7936d,0x3c23756d,0x3b8dba13,0xbc375362,0xbc867875,0x3c10e9d2,0x3c6d2e74,0x3b72b590, +0xbc0c39c9,0xbcba9a70,0xbca33312,0xbc6e6cb9,0xbbe996b3,0xbb9240f0,0xbb850393,0xbbcd6557,0xbb9e46b4,0xbb86d758,0xbb5db359,0xbac041e1,0x3845cdf6,0x39b627b0,0xba9a9ea0,0xba8ccb6f,0xbb21d7a6,0xbb3b9fd6,0xba90c46b,0xba86921c,0x3aa94ff8,0x3ad77e7a,0x37cc6814,0xb9f2e52c,0xb8f7e727, +0x39813331,0x3b65a23c,0x3b88b741,0x3b82703e,0xbb7434b5,0xbbbc1ac8,0xbacca6fd,0x3ba41cef,0xbbe3f2d1,0xbc1e5fa6,0xbc5d61b8,0xbc855f8a,0xbca89010,0xbc927fb3,0xbc5c5abf,0xbb5ca839,0x3af4980a,0x3b8fa1aa,0x3a6213fd,0x3b375b2f,0x3b18dd81,0x3aaacd4b,0xbb2717ea,0xbb8a0b09,0xbb8e54a2, +0xbb9b1155,0xbb675342,0xbb6b1afe,0xbb1d0e79,0xbb1e8902,0xbb51f937,0xbb5ed6f1,0xbb2f48b9,0xba8c85b9,0xbaf85bce,0xbb072a68,0xba5bd795,0xba90898d,0xb9bf6954,0x3a1cd7e9,0x3a61a8ba,0xb708361f,0xba884b10,0xbb825e1b,0x3b817acb,0xba851495,0xbbb18e9a,0xbbb0ebf8,0xbba41867,0xbbdea0df, +0xbbab287d,0xba0e5d58,0xbb284d96,0xbb99d4c6,0xbc1dddbf,0xbc08700d,0xbbedb9a1,0xbbba2940,0xbb068ef5,0x37e4413d,0x3a8f0d7f,0x3abef041,0x3a862b5b,0xba4b7b7a,0xba64fa83,0xba8f852c,0xba658e72,0xbacd5a38,0xbb1fa5b2,0xbb2dfab7,0xbb180c76,0xba61fb17,0x39b139dc,0xb9650185,0xb9bf3296, +0xb83776d0,0x3a747ebd,0x3ae92ebe,0x3b41f93a,0xb8ad193a,0xbbedbfc9,0xbc149a17,0xbc198a70,0xbbfd0ed7,0xbbd024ae,0xbb8983ba,0xbb54bfd1,0xbb806e3f,0xb9fbf081,0x3af4accb,0x3b4c6b2d,0x3af6a327,0x390a5c0b,0xbabbf642,0xbb03b816,0xbacd70d0,0x39fdc4b1,0x3a0d209e,0x3aa99fac,0x3afc8d6d, +0x3a88fed3,0xba2b4407,0xbb83479b,0xbb929cf1,0xbb7fd1bd,0xbb46e632,0xbb57ff5f,0xbb86bc0c,0xbb90a835,0xbbbda7e8,0xbbd31cb4,0xbbccae75,0xbc0999a4,0xbc29ad3c,0xbc3131e6,0xbc429209,0xbb7922c9,0xbb00e89d,0xbac18c08,0xbac97a4b,0xbaa92d0f,0xbadb3ca7,0xbacab1fe,0xbad849f9,0xbabb8c9c, +0xbacc3915,0xba8ed7fc,0xba1921f9,0x397a312b,0x3a7008ae,0x3aa8aa18,0x3ac4e7af,0x3aef62ef,0x3aa5a9b0,0x3a992bb8,0x3a1e65d9,0xba868925,0xbacafaef,0xbb20d1a3,0xbb2de01c,0xbb67d220,0xbb830584,0xbba78ab2,0xbbb477c1,0xbbeacb35,0xbbd4064d,0xbbe98f28,0xbbf6a7c8,0xbbd74af9,0xbbbd1c4b, +0xbba34cd3,0xbb86b09b,0xbab0d596,0xbb2bfa15,0xbb2affb9,0xbb524560,0xbb61eeae,0xbb7a5e31,0xbb8a38fd,0xbb9ada6a,0xbb75796d,0xbb350a82,0xbb01d825,0xba9f3bfd,0xba3d16dd,0xb9cfde13,0xba0351d8,0xba070d5f,0xb9ea7699,0xb9d694cb,0xb8314b4b,0xb9c3348e,0xbaf27c38,0xbb01edd0,0xbb549e52, +0xbb36ed07,0xbb6163e4,0xbb81ee10,0xbb65db9e,0xbb7a8890,0xbb72120e,0xbb591094,0xbb329e7b,0xbb2a2f49,0xbb28a86b,0xbb19f8ff,0xbb331c75,0xbb26af2e,0xbb6bdc51,0xbacb852c,0xbae3fbed,0xbb04f629,0xbb104201,0xbb1ddd10,0xbb2725d7,0xbb3e1a97,0xbb211cc0,0xbb152395,0xbb06a641,0xbaf3d12d, +0xbad40838,0xbaa3bc79,0xbaab33bd,0xbaaac8e6,0xbaaac631,0xbab0b3f6,0xbab35b49,0xba74beb1,0xbb65ddc6,0xbb57da60,0xb9c710fa,0xbb81ad1b,0xbb7f08c8,0xba136496,0xba3ce8e4,0xba4df47a,0xba25d420,0xba82e8a0,0xba8b11d1,0xba8c81d5,0xbb6106a7,0xbb7a7fb8,0xb62bf2bf,0xbb3fd4ed,0xbb163d22, +0x3b6170df,0x3b6f188c,0x3b86abb3,0x3b324282,0x3b487724,0x3b2f5938,0x3b626dd1,0x3b76f29a,0x3b7fdbc3,0x3b80ab31,0x3b80fba8,0x3b802241,0x3b835bb4,0x3b7dfba1,0x3b615628,0x3b579c52,0x3b517bf2,0x3b53a9b0,0x3b5cdf49,0x3b3eb6db,0x3b80cfe8,0x3b427fac,0xb9f75fa9,0xbbff9db3,0x3b7a5ac5, +0x397e4410,0xbbc60fbe,0xbbcba720,0xbbc3b5b4,0xbba68e96,0xbba79c58,0xbba8815d,0xbba9fef2,0x3a3ae9a3,0x3b9bad12,0xbbe4c660,0x3851f6be,0xbabd201a,0x3b9c5a0c,0x3b2b3937,0x3b324df3,0x3b0db08d,0x3b85cd63,0x3b9da2a1,0x3ba304b9,0x3ba97c73,0x3bb545be,0x3bbe9eaf,0x3bd05a86,0x3bc1e6a3, +0x3b92974d,0x3b7c4663,0x3b65ee7e,0x3b752c60,0x3b78899d,0x3b5ea069,0x3b878e3e,0xbb2a84f5,0x3a72eb1f,0x3a70b1ae,0x3976bf3a,0x39f3b4ef,0x3b76bc61,0x3b33f679,0x3b78c818,0x3b8dfc3b,0x3b90e108,0x3b7d4c62,0x3b209060,0x3b54fc5f,0x3ab1570c,0x3a1517d3,0x3b6e44d3,0x3b83376c,0x3b87f339, +0x3b2ab96f,0x3b0a5de5,0x3a977c26,0x3b8f9636,0x3bd226b8,0x3be64893,0x3bfaab95,0x3c05523a,0x3c008c0a,0x3c0eb9a5,0x3bfee652,0x3ba6fc22,0x3b8b9dcd,0x3b6c0cea,0x3b860037,0x3b7c8842,0x3b83b86c,0x3b326450,0x39eb0454,0xb9cf35e5,0xbab5bb03,0x382b38b6,0xb95c3000,0x3b88aa3e,0x3a1a7118, +0x3b2a4a5e,0x3b9ec162,0x3b7c6649,0x3b4c2e71,0x3ae23429,0x3b0c7df8,0x3b0bc485,0xba1b7fcb,0x3b8322a0,0x3b3de92f,0x3b743523,0x3abd17bb,0x3a8e25e4,0x370bdbf6,0x3baaf582,0x3be80cfe,0x3bf5e2d7,0x3c1040f6,0x3c2bbc50,0x3c38a656,0x3c63590a,0x3c500cff,0x3bf8a296,0x3bba18de,0x3b8cbfad, +0x3b98d7b5,0x3b8d3cca,0x3b728587,0x3b5301d2,0xba9e9490,0xba9b5a0a,0xbb47a92d,0xbad626e0,0xba2dc79a,0x3b9a578d,0x3b53a284,0x3b54e48a,0x3bc14b37,0x3bcc519f,0x3bb087c9,0x3b4078ad,0x3bab9d5f,0x3b55b400,0xbb4c5171,0x3b1e1e01,0x3c2bd9b6,0x3bf8d9ab,0x3bd49b77,0x3b61a44f,0x39a7343c, +0x3b5d2f99,0x3c122cb7,0x3c73d427,0x3c4c588d,0x3c20a6dd,0x3bd2081e,0xbaf83f9b,0xbb8be4c8,0xbb838a5d,0x39c01ff9,0x3b3f9578,0x3b8da8c7,0x3ba7a6f0,0x3bc8e8f2,0x3bac23e6,0x3a87b86f,0x3ae491db,0x39d3a3f2,0x3b4d714a,0x3b01cdca,0xbad69c78,0x3b013caf,0x3b7e8d7f,0x3b52a841,0x3afba6ad, +0xba3692ba,0xbb8c66a2,0xbbed3fb7,0xbb2e2ef3,0x3be9d9f8,0x3c4a715a,0xbc306fa0,0xbb2b8b5b,0xbbc70cb6,0x3ae71411,0x3c8092c9,0x3c1d827e,0x3bac5f03,0x3bac0925,0xbb180b4c,0xbb061464,0x3b92c7db,0x3b40c24c,0x3b077e97,0x3af47fcc,0x3b5b2c4d,0x3bb305c4,0x3c0c8f11,0x3bd7ecbe,0x3b9b4934, +0x3b0c93bd,0xb846881e,0x3a8fe648,0x3b0fbf0a,0x3adda187,0x3b3eb7f0,0x3b7a0f8b,0x3b5787e7,0x3ace3b61,0xba789f04,0xba1e2e8f,0x3ad45bd8,0x3bed4fdc,0x3c2b2fa0,0x3bb6d5e5,0xbc1b40a2,0xbc27b955,0x3bd2b526,0x3c8b05b2,0x3bacba4b,0xba556c3c,0x3b53e23e,0x3c0b6760,0x3c925fa2,0x3ce9bb2a, +0x3c80bef3,0x3befcdcc,0x3b893cc9,0x3c37e1c4,0x3c7dcdb5,0x3c83cc78,0x3c5ac89c,0x3c0861e7,0x3b14feb7,0x39b5e2f0,0x3a37dd60,0x3b3ac02c,0x3b1ec454,0x3ae8c92a,0x3a871265,0x3b57b696,0x3b1d9e5e,0x39366d38,0xb97fbaa3,0x390aef5e,0x3a146b89,0x3b7997c6,0x3b8aa3a3,0x3b6fd9d9,0xbb4d0cd1, +0xbbb8ff83,0xbaaa8f34,0x3b2d7b5e,0xbb9f0a7c,0xbbf19f12,0x3aee6b1f,0x3c2a6d49,0x3ca2cb8c,0x3c70553f,0x3c1b15b0,0x3bb01b53,0x3c0b9260,0x3c3594fb,0x3c1a3f8d,0x3c36392c,0x3c263ff7,0x3bf25fd7,0x3bc06e1d,0x3bb0692b,0x3ba6e85c,0x3b583ce0,0x3a463801,0xbac5c33e,0xbb25f0a0,0xbac43e75, +0xbb046e27,0xbb23d9ee,0xbafa8273,0xba072263,0xbaf780d4,0xbacc5987,0xba0dc1c2,0xba61573b,0x38b05dc6,0x3a875757,0x3ac8aaf3,0x3b01f540,0xba312770,0xbb15f28b,0x3b6910a4,0x3c4cedbc,0x3cc22b8d,0x3cc4d752,0x3cb82f28,0x3ca4a927,0x3c9c3b0c,0x3c97d287,0x3c5baba1,0x3c28980e,0x3c0b308c, +0x3bacabc5,0x3b6ba84c,0x3b63ccc3,0x3b23d82b,0x3aeb6465,0x3af0d623,0x3adc4456,0x3b133550,0x3b26e4ae,0x3addc874,0x3aad07a7,0xba5be771,0xbab7f30e,0xbafbf68d,0xbae85d7c,0xba940ebd,0x39e9b0a6,0x3b057412,0x3aae8fe0,0x3a9ad5a4,0x3acde318,0x3b0e6451,0x3b4debcb,0x3b4297cd,0x3bdb21a6, +0xbc254308,0xba58f35d,0x3a5ab80c,0x3a1c3b5f,0x3ac50593,0x3b4c2e55,0x3b93657b,0x3bea108a,0x3b7ec5a0,0x3b293b3d,0x3b15d540,0x3b71814e,0x3b94c489,0x3b8ea9f8,0x3b95b3e8,0x3b9e192f,0x3b969934,0x3b83e5a7,0x3b37d3aa,0x3aa31580,0x3a3992b7,0xb9b29c33,0xbb089cd8,0xbb101d3d,0xbb2ba9b3, +0xbb16c10f,0xbb1a6faf,0xbb4b6442,0xbb64029f,0xbb89fe83,0xbb916598,0xbb74ad05,0xbbc0b34a,0xbbd04f43,0xbc043292,0xbbd08b89,0x3a0c6bf8,0x3af555b7,0x3b1c28c6,0x3b49117a,0x3b7547a7,0x3b950431,0x3bb32765,0x3bdf2c03,0x3bd48414,0x3bd08791,0x3bbe7600,0x3b948bc2,0x3b58e2e8,0x3b0dbf22, +0x3b1e8710,0x3b23a15c,0x3b2e5113,0x3b3beb46,0x3b543805,0x3b6c8707,0x3ab7dc67,0xb9d6f876,0xbb01645c,0xbaffcd77,0xbb3a05ae,0xbb315237,0xbb9126ea,0xbb831651,0xbbb609f0,0xbbb0bc4b,0xbbccc746,0xbbce2742,0xbba9a762,0xbb878f8c,0xbb7ab11a,0xbab01a4d,0xbb411a8a,0x3a513499,0x3a3b68c7, +0x3a9e5661,0x3ac9cdbc,0x3afb38a1,0x3b0abe81,0x3b1d7809,0x3ad2136c,0x3a7fc612,0x3a172c8b,0x3957de21,0xb7e81c90,0xb9bb08a1,0xb94bd3e2,0xb90f020a,0xb8ae3d37,0x37b4ea96,0xb986b863,0x3a0fc617,0xba2ef32b,0x3a104898,0x3a7057fb,0xb96d861d,0xb97523c6,0x3a2e08dd,0x3a45df68,0x3a8a35bb, +0x3993d18e,0x3a3ba102,0x39a0d957,0xb9afabb8,0xb93fcdbd,0xba6b04f9,0xb9adc097,0x3990eca8,0x3afe52f5,0x3b1a44e9,0x3ae87247,0x3b01b0fb,0x3afc13b2,0x3b00ac0b,0x3b040185,0x3b1177b3,0x3b017ecf,0x3af062ca,0x3ad1ccb0,0x3ab896d0,0x3a9e4069,0x3a7aade6,0x3a8842c2,0x3a8cae18,0x3a8ef011, +0x3a9e6754,0x3a974996,0x3ab1de36,0x3adac7d4,0x37bebaf3,0xbb8babab,0x3b0fe888,0x37d2070f,0xbba31df8,0xbb9c7a8c,0xbb962d02,0xbb8a11f4,0xbb859c49,0xbb7cb931,0xbb6ffd39,0xb95763cb,0x3b1034bc,0xbb87a2c4,0xb95d2647,0x3b0c6284,0xbb9ee79f,0xbb0991e1,0xbbbf983a,0xbb8655ac,0xbb9956c8, +0xbb8b8612,0xbbacc1f8,0xbbb48157,0xbbb291fd,0xbbab7277,0xbba43baa,0xbb9ac9e1,0xbb93e01c,0xbb9675ef,0xbba49ba4,0xbbae1aac,0xbbb17ff6,0xbbaeea9c,0xbba948b3,0xbb925802,0xbbbd8fe7,0xbb1fadf7,0x3ab88a37,0x3be82612,0xbb777307,0x3aa1edea,0x3bf5b1be,0x3be56018,0x3be5153e,0x3be437d9, +0x3be5b7b8,0x3be1a385,0x3bd0ffaf,0x3aa827d3,0xbb833cba,0x3be345df,0x3b18dd7d,0x3b82e136,0xbbb42e3d,0xbb8ee46d,0xbb951d3d,0xbb7fbe45,0xbbd0fa54,0xbbf23d97,0xbbf0a7fc,0xbbe6f367,0xbbca96d3,0xbba98f0a,0xbb891388,0xbb93657a,0xbbc71adc,0xbbf19a37,0xbc02333f,0xbbfb8b19,0xbbe0a97d, +0xbbc983e6,0xbbaf67f9,0x3b194383,0xbb67eb35,0xbb808063,0xbb0c79e9,0xba881c6d,0xbadf0546,0xbb31ecbb,0xbb3f8d00,0xb8dd28cd,0xbb1785b4,0xbb217281,0xba8babc0,0xbad5b6df,0xb8c32547,0xbada5dff,0xbb6cd9c0,0xb8acf8ce,0xbb7f8011,0xbb9dac79,0xbb9d3811,0xbb7017ec,0xbc09822d,0xbc234e15, +0xbc21f3b6,0xbc11e722,0xbbebcca5,0xbbc663e1,0xbb8b18c6,0xbb9c85d6,0xbbf84e8a,0xbc1afa58,0xbc28f41a,0xbc1fb2d2,0xbc042b28,0xbbf99acb,0xbb5ae5ee,0xbb056127,0xbb4f6c43,0xbb7f62f5,0xbb41bd07,0xba4e4691,0x3a1c81ef,0x39e79135,0xbaa0ee12,0x3b6cff97,0x3ac7ed12,0x3b135831,0xb9025723, +0x3a243471,0x394a42ac,0xbaab3571,0xba361e89,0x3a7bab69,0xbb7231aa,0xbb55758d,0xbb2f2251,0xba95f9f4,0xbbfb4565,0xbc42790c,0xbc55aa9a,0xbc3c7753,0xbc0ffce4,0xbbba9579,0xbaef12cc,0xbb355f16,0xbc0d2397,0xbc56f324,0xbc786252,0xbc6b83a7,0xbc3d3706,0xbc156f5f,0xbb8749dd,0xba721906, +0xbb92d7c6,0xbb469953,0xbb703c8e,0xbb04bbdc,0x3b7077f4,0x3b01603e,0x3b4fa313,0x3bc226b6,0x3bc6c665,0x3b9a5db3,0x3b4e75ed,0x3b7f3b4b,0x3aab963e,0xbb65d9ce,0xbb0e6b9d,0x3bcaec59,0xbbccb018,0xbc24d528,0xbc4bc7be,0xbc5ec13f,0xbc7c8052,0xbc40bf32,0xbbec4dd4,0xbbdc899d,0xbbbf58c5, +0xbbc9bfe7,0xbc56b26d,0xbc51973d,0xbbf016ab,0xbb8c958f,0xbb2b497f,0xbb8e9988,0xbb98e275,0xbbdcc31d,0xbb6a125a,0x39c5f1b9,0xbb2ca450,0xbadb8714,0x3ac2c663,0x3abf0da2,0xbaec3d23,0x3b15198b,0x3b76e48d,0x3ad9b66d,0x3a3a332c,0xbada8043,0xbbab9481,0xbbfd19be,0xbb262466,0x3bd21d34, +0x3c082495,0xbc3e694f,0xbc04dd32,0xbc1ed26f,0xbabd243f,0x3c810a76,0x3bb00d07,0x3a3709c1,0x3b736cd7,0xbbb668d0,0xbbb3fee6,0x3a903832,0x3b520518,0x3b07e436,0xbb417441,0xbbc488e3,0xbc138528,0xbc39666b,0xbbf75782,0xbbc9f870,0xbb0c3cb5,0xb89a6f12,0xb903ce96,0x3a644726,0xb99ba064, +0x3a9076ef,0x3b480b45,0x3b224576,0x3a2d656f,0xbafc8213,0xbabd57ea,0x3ab12b9b,0x3bd3bd03,0x3c196dc7,0x3aa78190,0xbc4feccc,0xbc6dd3b4,0x3b9e54ca,0x3c6427c6,0x3a1371f9,0xbc469593,0xbcd310a3,0xbce00cda,0xbca7b3d8,0xbb20e608,0xbc05c926,0xbc0ed83a,0xbbf737c8,0xbc1ece18,0xbc1f558e, +0xbc01a328,0xbbb79648,0xbb264b7b,0x3a28023f,0xba99f7da,0xbb428430,0xbad15378,0xba7bc2f4,0xba559942,0x38e8c79d,0x3ace095e,0x3aa1d517,0xb81518b0,0xba981673,0xba67df73,0x38c146cb,0x3b42fa9e,0x3b3d709b,0x3ad3ac18,0xbb6f3737,0xbbbf3c1a,0xba91216a,0xb89e157f,0xbb77f175,0xbc09c026, +0xbc47c36d,0xbc64b062,0xbcac6fb2,0xbc8b9b29,0xbc505745,0xbb4a8a1a,0x3aa5239f,0x3ba3f63c,0x3b88be27,0x3bae58dd,0x3b96057f,0x3b24ed11,0xbb140e59,0xbbbeb76a,0xbbe595e6,0xbbec0da4,0xbbc8bfaa,0xbb8670f6,0xbaec2769,0xbb4324bd,0xbb54872c,0xbb496490,0xbb230a03,0xba95cb3b,0xbaff4b86, +0xbb0193bd,0xba90879f,0xbaa471f3,0xb942e368,0xb99d8698,0x3a9cfa78,0xb9825ad5,0xba1b6c2d,0xbb05d1c1,0x3bfd0cf3,0x3a15de9a,0xbb879464,0xbb03b180,0xbb40a08d,0xbb7fdea2,0xbb826f5f,0xbad4ec9a,0xbae440ad,0xbb371ecd,0xbbc34ba1,0xbbc41e3c,0xbbc71f83,0xbbb3aaae,0xbb03de83,0x38c8afd5, +0x3a2b9677,0x3abd343d,0x39f6676e,0xba2fb3aa,0x3a08e3c7,0xbaca4973,0xbaed96f7,0xbb0682ae,0xbb299f48,0xbb2cb866,0xba5dcedc,0x39df1e8f,0x3abc460c,0x387a14dc,0x393b56d5,0x39fa85ef,0x3addc6bc,0x3b3e760d,0x3b9504e9,0x3adf1cd3,0xbb4230f1,0xbbe7fb87,0xbc2037d4,0xbbf9e573,0xbbf57bd5, +0xbbc72d65,0xbbb966e0,0xbbca81c3,0xbae9c63f,0x3a56a402,0x3b1105df,0x3a4d22fb,0xb939c7eb,0xba8ecda3,0xba962c2d,0xba893faa,0xba0a2167,0xb9ede4f4,0x38fb5166,0x3adebf49,0x39199909,0xbad92d9e,0xbb5aed91,0xbb71ad79,0xbb59d2f7,0xbb3bd99e,0xbb54facc,0xbb6adf8c,0xbb7dc4ff,0xbb940402, +0xbb999caf,0xbb8db853,0xbbb0af13,0xbbf1d0c8,0xbc0aecb2,0xbc22156b,0xbb44ddc3,0xbb342c2e,0xbb64ef18,0xbb39c08c,0xbb446d36,0xbb397677,0xbb21131d,0xbb1a63d1,0xbadebd97,0xbac7dc03,0xba529310,0xb9a55c7d,0x39e78539,0x3aa92cd6,0x3a9af137,0x3a96cd92,0x3a84903e,0x3a1304b6,0xba06b13a, +0xb924c31f,0xb8845fbc,0xbaa7c883,0xbb2cf859,0xbb2830d0,0xbb1a544d,0xbb30d2da,0xbb4ba89d,0xbb9c515d,0xbba3719e,0xbbbedc2c,0xbbc1e6ec,0xbbe9e7a4,0xbbcdd399,0xbbb040f6,0xbb8b0e69,0xbb7d6540,0x3acb3c98,0xbb0cee35,0xbb25e94c,0xbb49e36d,0xbb6a0f5c,0xbb89af8a,0xbba1073f,0xbbb8687d, +0xbb9cc402,0xbb7cca79,0xbb44ab8d,0xbb05d071,0xbaa1a33c,0xb9d16c14,0xb9fcc43c,0xb9d7ede0,0xb9a92b85,0xb9559461,0x3928fde2,0xb994366f,0x39a9b021,0xbab81e77,0xbb02ddba,0xbaba2d85,0xbaeab509,0xbb40e49a,0xbb4b851e,0xbb47a966,0xbb13911e,0xbb489caa,0xbb4757cd,0xbb188dfd,0xbb1a03e7, +0xbaaa77ec,0xbacd9204,0xbb1feeb4,0xba9ad1da,0xbb1c9c86,0xbb00e3ae,0xbb1fc5ef,0xbb2fbeb0,0xbb3f07d8,0xbb4a2f21,0xbb6682d0,0xbb460c65,0xbb37c673,0xbb28b699,0xbb1af74e,0xbb0c3fb7,0xbae81992,0xbaeda96a,0xbae78b32,0xbae2e64b,0xbae7493f,0xbad43167,0xbaef55a3,0xbaabedb4,0x3a2f9634, +0x3b801ffc,0xbb0e9ac5,0x39b02e43,0x3b84c2d9,0x3b8152f3,0x3b6faf4b,0x3b55f2a9,0x3b5773b2,0x3b4eb23a,0x3b3b1529,0x3977661e,0xbb1ce333,0x3b7707ba,0x3a8b89a5,0xbb2b5cdc,0x3b4c71d7,0xba49990e,0x3b9cbd4d,0x3b23a7d3,0x3b357edb,0x3b173513,0x3b31e408,0x3b423981,0x3b545f6b,0x3b5fd728, +0x3b67d734,0x3b6cca4e,0x3b6db785,0x3b645d59,0x3b4f736b,0x3b45441a,0x3b3ef56b,0x3b3deeb2,0x3b415027,0x3b23024f,0x3b8fb61f,0xbab857ff,0xbbaa33db,0xbc13e44d,0x397c3f55,0xbb9293e1,0xbbfaa056,0xbc061ae5,0xbc039f71,0xbbda6aff,0xbbfbd983,0xbc00980d,0xbbf9cda3,0xbb8493fc,0x3abc1edf, +0xbc069e94,0xbba4f515,0xbbaf03b8,0x3b80f2da,0x3b4ef5b4,0x3b1838b0,0x3ad904a8,0x3b12a119,0x3b2a5abf,0x3b59f403,0x3b812378,0x3b983366,0x3ba7e1bb,0x3bb8ee1a,0x3bb3879a,0x3b91747b,0x3b718974,0x3b46e0c6,0x3b43f7dc,0x3b242ccd,0x3b3ab05c,0x3b22600b,0xbbc2f0f8,0xb9b148b7,0xbad4cadb, +0xba7fdbbb,0xba8cc18a,0x3ad0b490,0x3ac1bade,0x3adef6e5,0x3ab301de,0x3b2926f9,0x3b49cdb1,0x3ab226e4,0x3afd21fa,0xba09815c,0xbab62cf9,0x3b359e3d,0x38a4367f,0x3b43be4c,0x3b802103,0x3adaaff6,0x3a528bc0,0x3aadb5c3,0x3b22cc7d,0x3b8e2ccb,0x3bb73016,0x3bde128e,0x3be09d49,0x3bf3c061, +0x3bdbfdb3,0x3b954a32,0x3b744780,0x3b36f52b,0x3b43e74f,0x3b0e478b,0x3b59134b,0x3a3da818,0xbb35cb30,0xbb106e34,0xbb3bbe59,0xba0ee4ae,0xbadbc958,0x3b3fb2dc,0xba46fbc2,0x3b446c9b,0x3b438761,0x3b662c01,0x3aa085cd,0x3ab27fce,0x3a6b09cb,0x3a780ff4,0xbaf9b9da,0x3afcb232,0x3a00e477, +0x3b7a2133,0x3b8331e0,0x3aaca6be,0x36a7a151,0x3a03e4a3,0x3a088b06,0x3b382f67,0x3babacfe,0x3c016f95,0x3c1a317f,0x3c3ed678,0x3c3c9ec9,0x3bf976ec,0x3ba1a54a,0x3b308602,0x3b15af69,0x3a6c9014,0x3b015bec,0x3a47a99d,0xbb806ba4,0xba68b8ac,0xbb94c135,0xba919948,0xb7d10e4e,0x3b9d29a1, +0x3b309e54,0x3b282b7a,0x3beef42a,0x3bd1cc2b,0x3bbdbf40,0x3b8226a2,0x3ba38daf,0x3b0ed8eb,0xbb078149,0x3b125e55,0x3a12952e,0x3b0cd5e4,0x3bb426bc,0x3b130293,0xb9a9ce26,0x39925a85,0x3ba8f2cc,0x3c4f3786,0x3c42bfbe,0x3c3cabad,0x3c36c6f1,0x3b07bf37,0xba99e6aa,0xbaa8dffe,0x3adbebe8, +0x3b758a63,0x3bee1816,0x3bc6d914,0x3bd69815,0x3af96a34,0xbb45d308,0x3aa2efd6,0xb97137bb,0x3b2d3768,0x3acc8935,0xbb05ca7b,0x3b5dd1ca,0x3b94cc40,0x3a72f86b,0x3a5ac201,0xbacdc8fa,0xbba5beb0,0xbbc3a828,0xbb1562cd,0x3bb14a02,0x3b9be650,0xbc12f2e0,0x3aa255db,0xb9fa56a1,0x3b53ea74, +0x3c8225ed,0x3c079f8a,0x3b5d486e,0x3b873548,0xbb215900,0xbb0654dc,0x3b185715,0x3b803a86,0x3b4cb325,0xba00814b,0x3a9f87cc,0x3b1ebcf5,0x3bab38c1,0x3b40517f,0x3b3db356,0xba032a7e,0xbb254e3a,0xba3ffe9c,0x3a8483d7,0x3af8b3b0,0x3b4d8597,0x3b576011,0x3b0d4fc4,0x38d094a0,0xbb10d4ec, +0xba3a1d09,0x3b025c5c,0x3bf330d5,0x3c05dd95,0x3b2ddd69,0xbc3bf3f8,0xbc01b1fb,0x3a96da6e,0x3c6be14b,0x3a30f6e4,0xbbd403f0,0xbbc318ac,0xbbc36bfe,0x3ba7ef28,0x3cd64358,0x3c80e032,0x3c218c92,0x3c015ae2,0x3c2d2c08,0x3c4ab5d5,0x3c4fe189,0x3c3b91d7,0x3bfe4b24,0x3b7698d9,0x3aa0cb01, +0x3b2e025e,0x3b392e1e,0x3acdabe4,0x3b05925e,0x39c9cdcf,0x3b149b02,0x3ab96852,0x3932789d,0xba33ba1f,0xb93420d5,0x3a3546bf,0x3b417d70,0x3b15f3fa,0x398c8195,0xbb82763d,0xbb9c31f1,0xbb2e22ef,0xbb1222b8,0xbb61c3da,0xbbf74e60,0xba2b2f8b,0x3b71609f,0x3c243d50,0x3c007f46,0x3baeb019, +0x3bdd3115,0x3b7e8da5,0x3bbeca71,0x3bd9fd99,0x3c056713,0x3c01c054,0x3bc32de0,0x3b881cd5,0x3b2722ba,0x3b23a80b,0x3a8de142,0x3915f447,0xbb023842,0xbb92120f,0xbb2b6c08,0xbb133aa4,0xbb187f4e,0xbae9637b,0xba4d84bf,0xbaa84033,0xbad1d999,0xba72de3d,0xba78e57b,0x3a034712,0x3aa81c7b, +0x3aa6189a,0x3ae46cd6,0xb93bb4f2,0x37604f65,0xba71c43d,0x3b613040,0x3c78a0b0,0x3c87ac67,0x3c8c08d6,0x3c7548de,0x3c682e57,0x3c69b5a8,0x3c3048cb,0x3c0a1f2a,0x3bccec4a,0x3b44992c,0x3aab5285,0x3a3dcee2,0x3a7a6e0d,0x3aa51b65,0x3b098335,0x3a9b50f8,0x3afc846b,0x3b13f0ea,0xb889e9ad, +0x39c88531,0xbae32e7e,0xbb097626,0xbb0372ba,0xbaea3bbe,0xb8574751,0x3af34c8a,0x3ad9b382,0x3a99b9ae,0x39ebbae5,0x3998c184,0x3ad154a1,0x3b22171d,0x3ad654c1,0x3b2e06ee,0xbc368287,0xbb80a044,0x39b1a865,0x3982833c,0x3af1a48c,0x3b722973,0x3bacd78c,0x3be4cda6,0x3b93e194,0x3b5747ea, +0x3b49cc02,0x3b520c76,0x3b5f10c1,0x3b499f38,0x3b67d86f,0x3b7dc44d,0x3b84b9ab,0x3b7fef16,0x3b364c16,0x3a3dcff7,0xba13cc18,0xbaddefe7,0xbb7763d7,0xbb1c621f,0xbb0a1d1f,0xbb193e04,0xbb185787,0xbb3bcbbf,0xbaf3426d,0xbb246ec2,0xbb285272,0xbb02cde8,0xbb58659a,0xbb90d83e,0xbbf0aec2, +0xbbda56c7,0xbb20ac7b,0x39af3cfe,0x3adba901,0x3ac673cb,0x3b0fb435,0x3b30abce,0x3b707e35,0x3ba852df,0x3ba56abc,0x3ba6a749,0x3b9c7f03,0x3b891f14,0x3b6dd0b3,0x3b459cbd,0x3b4769fb,0x3b3d2027,0x3b3c016f,0x3b22ea75,0x3b3b5eb7,0x3b032ee9,0xb9e2b0e8,0xba994629,0xbb0ce830,0xbaf342ce, +0xbb25a49a,0xbaebafdf,0xbb6b970a,0xbb397ff4,0xbbaedcb6,0xbb9b743f,0xbbd0e389,0xbbd36fbe,0xbbccfb9d,0xbbcc2a29,0xbbdf0f8e,0xbb761a94,0xbb617e53,0x3a275c27,0x3a6a070e,0x3aa69ebc,0x3aeba625,0x3b109c40,0x3b1e9914,0x3b278dd0,0x3b063bba,0x3ae37adc,0x3acc8150,0x3aadbc33,0x3a886da4, +0x3a1d5a85,0x3a585422,0x3a828825,0x3aa1b668,0x3ab0e9c2,0x3ab66b49,0x3b061c92,0xba0e0a4e,0x3a909bc8,0x3a2b0a1d,0xb990038e,0xba806026,0xb9b320f3,0xb7c27d2b,0xb95c9ece,0xbaa5ab66,0xb9120fbe,0xb8665721,0xba7ecdf9,0xba04db67,0xba9b94d6,0xba5576e3,0x39c704c2,0xb8db0cad,0x3b2550e5, +0x3ae33cd7,0x3afe077b,0x3af97254,0x3afdd1f4,0x3b0577df,0x3b158ece,0x3b0e7a02,0x3b07b23d,0x3af725af,0x3ae2e0c0,0x3ad3f4f9,0x3abdd24e,0x3acc69aa,0x3acf6b7e,0x3ad10310,0x3ae19eb9,0x3ad29252,0x3b181aae,0x39329393,0xbb089f0f,0xbb97b158,0x3a14881f,0xbb202abd,0xbbb1a39d,0xbbb209ff, +0xbbac1ab3,0xbb9aa4d9,0xbba59337,0xbba18e32,0xbb9b8001,0xbb2db968,0x39b533b9,0xbb91d953,0xbb280c91,0x3b079c15,0xbb20e73d,0x3b23bc90,0xbb80d2f1,0xbb06dde8,0xbb19faf3,0xbb0cc747,0xbb252b39,0xbb2c1d38,0xbb3774f6,0xbb21c51f,0xbb18043d,0xbb13c2a9,0xbb061065,0xbb087978,0xbb13acb1, +0xbb310cd4,0xbb3cb6be,0xbb3ed442,0xbb381be8,0xbb1ef573,0xbb7dca3d,0x3b05c893,0x3b956a35,0x3b9cd355,0x3a6b6a3c,0x3b9b5e3c,0x3bb831a3,0x3bbaec2b,0x3bbedc9e,0x3bb785b9,0x3bcb6e08,0x3bcba192,0x3bc3b3c7,0x3b9c9b8f,0x3a1e0ca4,0x3bac05fd,0x3bb975da,0x3bc7d7e3,0xbb07c539,0xbb132776, +0xbadecbd1,0xbacde780,0xbb1b22dc,0xbb3dfaad,0xbb60ddd1,0xbb3ef2cb,0xbb1eee9a,0xbb017e0c,0xba9fb693,0xbab32919,0xbb0f7818,0xbb732fb3,0xbb8d07cf,0xbb8da5fe,0xbb74ce83,0xbb84e403,0xbb24461b,0x3b5df3a4,0xbad24653,0xba7ed81a,0xb8a54bfe,0x3a817011,0x3a15510f,0xb9dd88be,0x3925aec9, +0x3b3a9d95,0x398ecf9d,0xba1d3a28,0x3a97a947,0x3a03d3ee,0x3af688f3,0x3ac6b45a,0xba29d214,0x3b6070b8,0xbabe7e0a,0xbb44e096,0xbaddcac4,0xbaeac847,0xbb4d506c,0xbb62638a,0xbb9a32ac,0xbb420a2e,0xbaf9cb4f,0xbaff6b7c,0xb98f4671,0xba0e26a6,0xbadb8971,0xbb8f2f2b,0xbbb3eba8,0xbbb7332f, +0xbb9d3692,0xbbb6464b,0xbacb6138,0x397fcbc5,0xbab76846,0xbb27b876,0xba4d20a9,0x3aa1f4f4,0x3aa95fba,0x3adfdb4a,0xba222aab,0x3ba82417,0x3aa237a4,0x3b48bb3e,0x3acb6c3e,0x3af07853,0x3af40d60,0x3aa9cbf4,0x3af9f013,0x3b97e49a,0xba4ca86f,0xbab5c8cf,0x3a0f2d9f,0x3a156fa1,0xba5d9872, +0xbb3eb004,0xbbba0204,0xbb5c951f,0xbb00dfcc,0xba9519a1,0x3b18771c,0x3b3963f4,0xb967f994,0xbbaff8eb,0xbbffc862,0xbc053f77,0xbbe805ca,0xbbf50169,0xbb455ed3,0xb9ad9b84,0xbb958c60,0xbb35216d,0xbb20affb,0xbab02195,0x3b3f961c,0x3ac84af8,0x3b299e2d,0x3bc202fc,0x3bcda691,0x3b93d59b, +0x3b73ea23,0x3b6ee416,0x3b13c935,0xbac6879b,0x3a80c7e2,0x3bd638cc,0xbb82b5d1,0xbbfcbb66,0xbc090862,0xbc26d4ba,0xbc2e97db,0xbbc97448,0x39aa9e71,0xbaf09603,0xbb0b5726,0xbac1891a,0xbc2d0936,0xbc496915,0xbc14e747,0xbb902098,0xbb100030,0xbb940853,0xbb1aa927,0xbb718937,0xb954eb98, +0x3b0d4038,0xbb024256,0xb90b1360,0x3ae01d8d,0x3afb0832,0xbaf6ac42,0x3b7391a5,0x3b973cf4,0xb888ee01,0x39894642,0xbb0c62a8,0xbb93045d,0xbba5c37d,0x3a38b0c7,0x3bf89efe,0x3c06acd6,0xbb874741,0xbb340210,0xbc05b0a7,0x3a087144,0x3c7566e0,0x3c22d7e8,0x3bcc7d10,0x3bd181c6,0xbb33776e, +0xbb83c66c,0xb9b54ace,0x3ba64fed,0x3ba1d112,0xbacb7a99,0xbb712d1c,0xbba93947,0xbb9a1401,0xbb318011,0xbb7f23af,0xbad22a07,0xba291335,0xba503297,0x3adf746e,0x3745f07c,0x3aa1be12,0x3b26d9cf,0x3aa87ee3,0xba48cd04,0xbb3acd12,0xba8c571f,0x3b109768,0x3bc337a5,0x3bed3bd7,0xba40b1ef, +0xbc383851,0xbc24a9aa,0x3a554fc1,0x3c2662e7,0xbb6b6746,0xbc3848be,0xbc74eb92,0xbc9abc76,0xbc373875,0x3c219096,0xbaecf0cc,0xbb9a233d,0xbb281edd,0xbba9b8fb,0xbb9cad4a,0xbb20d87f,0xba913608,0x39868bdb,0x3af952fe,0x3938589e,0xbb10148f,0x3a6b010d,0x3ae0a40f,0x39d7ad4c,0x3ab57e50, +0x3afc549e,0x3a75cfa1,0x38fcc864,0xbab06484,0xba8a968c,0x3a07ebb7,0x3b06ff27,0x3a94a0d6,0xba5483fe,0xbb18e05d,0xbb86e738,0x384d1847,0xbb7262e0,0xbaa40ffc,0xbba8368f,0xbb830947,0xbac32404,0xbb9129a1,0xbb120af0,0xbae91664,0x3a220df9,0x3b47590a,0x3be54466,0x3c137498,0x3c0df8fa, +0x3bf6740a,0x3ba04daf,0x3a8e78d9,0xbb28b45a,0xbb952db2,0xbba652a3,0xbbb0e92d,0xbb5934ac,0xbaee7ab1,0xbb41c9c1,0xbb3754c0,0xbb112a59,0xbadcf506,0xba849302,0xbab406c6,0xbaaaadd0,0xba9f3458,0xbaa2cf3e,0x37ff3996,0xb9f2b183,0x3a6f8794,0x392035a4,0x3a4347ef,0xb97c6146,0x3bd6d03f, +0x3b4d3a46,0x3b80e7b9,0x3be9254a,0x3bc26b49,0x3bd00e9b,0x3bb022d5,0x3ba19159,0x3b9b12cc,0x3b80b0bd,0x3b713d2d,0x3aa2d3fd,0xb9a842dd,0xba7bdabe,0x386c9da2,0x3a805829,0x3a7efaf0,0x3ac73401,0x3a45e2e5,0x3a48bc62,0x3ae1efd7,0xba8d6376,0xbb1b9e31,0xbb239e0c,0xbb21ee02,0xbb063fa4, +0x3a02e754,0x3acb069e,0x3b0bf867,0x3a4d2bb5,0x3a8cd7af,0x3ab8e7b5,0x3b38ec01,0x3b7ed30a,0x3b872406,0x3b678904,0xba70822a,0xbb30a33b,0xbb83dd75,0xbb0f4d84,0xbb35b619,0xbb2c95a3,0xbb35f33a,0xbb1da10f,0xba07742b,0x3a067788,0x3a9699a3,0x3a12d5fc,0x3a69defd,0x3a905842,0x3ac32323, +0x3a9b4430,0x399cf50b,0x3934a7b6,0xb96d1a5c,0x3a01ea4c,0xba83c836,0xbb1538de,0xbb0c6862,0xbb107180,0xbb1919e5,0xbb2f0e7a,0xbb409fda,0xbb38caea,0xbb2c6e81,0xbb1cf02f,0xbb088052,0xbadbadd5,0xbb0609ac,0xbb552f35,0xbb9ff742,0xbb9e0301,0xbad9160b,0xbb05ed69,0xbb53bbc8,0xbb16412f, +0xbb207e5d,0xbad36e8c,0xba669384,0xb98558eb,0x3a117271,0x3a88f3dd,0x3adaf5de,0x3ac0695f,0x3ab147c0,0x3abf89d5,0x3a9ea285,0x3a973bae,0x3a789a18,0x3a2c0cab,0xba26b56f,0x38e3c0df,0x3a63f064,0xba25e5dd,0xbb031942,0xbb0b8624,0xbae34056,0xbb0d3b71,0xbb0c9a70,0xbb74a2ae,0xbb4e7086, +0xbb9d7ee7,0xbb9d5a52,0xbbca1f8e,0xbbb5f360,0xbb9f72f3,0xbb86c114,0xbb5a2685,0x3af72753,0xba2883b2,0xba89e6df,0xba845b11,0xbaa5b6e6,0xbad36621,0xbb08dba1,0xbb203a8e,0xbb1ba068,0xbb0e75d1,0xbaf0ae94,0xbab39d6e,0xba50b677,0xb8f5e2c2,0xb8e8170a,0xb871c407,0xb7dfab27,0x38cc6092, +0x394c7891,0x38ec0951,0x3ae282f2,0xb948d002,0x37909420,0xb5c162b8,0xb793d272,0xba7fffba,0xbac58f7b,0xba9a8dc9,0xb9fc2016,0xbadb83a3,0xbb1043f3,0xbad0a682,0xbac5875d,0xb9ee09cd,0xb9953380,0xbaa89dfb,0x3a8cec9d,0xbaec2f86,0xbaa3d69d,0xbac8c49f,0xbadb34cd,0xbae34d00,0xbae708c1, +0xbaf93034,0xbae1f82b,0xbad7ae88,0xbad25d99,0xbac99a98,0xbac5640f,0xbab7a93b,0xbab797f1,0xbaaf3c33,0xbaa91f8d,0xbaa52634,0xba8d6036,0xbad47398,0x3a80d99c,0x3b371202,0x3b690826,0x397d020e,0x3b2fd62c,0x3b677926,0x3b69c0b2,0x3b571142,0x3b3403ef,0x3b48d4ce,0x3b441ec1,0x3b2d6766, +0x3b061871,0xb986e237,0x3b4005b7,0x3b3471cb,0xbae1677c,0xb78ba087,0xbb86cf25,0x3aa76f7a,0xb7a69040,0xb8fcb193,0xb9ad6948,0xba4595d6,0xba41ec67,0xb9d9fc92,0xb8d17528,0x3909e272,0x3995edab,0x39adcefe,0x397b3e5c,0x38c34f82,0xb9304d0a,0xb9958835,0xb9b4e741,0xb9a96aba,0xb9c0b687, +0x3a6113ed,0xbb96f2a1,0xbbba834e,0xbb6bccd5,0xbb647ffb,0xbbad8bc2,0xbb42b0c1,0xbb6c4154,0xbb6b8296,0xbb2a2960,0xbb7a0302,0xbb83c86e,0xbb782b14,0xbba75377,0xbb34eecc,0xbb4977bc,0xbbb46769,0xbb8844a2,0x3714ef41,0x3a892501,0xb9383db2,0xba12cbef,0xbb10ee27,0xbb2d2257,0xbadd1ed9, +0xba65d176,0x384cba7f,0x3a2f8661,0x3ab4e4c8,0x3ac2515b,0x3a67f281,0xb982e1f6,0xba948ce8,0xbab94f00,0xbaeee74c,0xba73d9d1,0xbadbf34c,0xbba46579,0xbb14e2a8,0xbb8221cf,0xbaff31c8,0xbaf21f26,0xbaa14981,0xba59c9ed,0xbab63205,0xbabd0a14,0xba28e879,0x39b6a01e,0xb935f35c,0xb99d9d2c, +0xbac6666a,0xbb1d98c5,0xb8053567,0xbb213e54,0xb9ad1a13,0x3af30568,0xba37644c,0xba7a0e11,0xbb90f241,0xbba1fd92,0xbb34ad6c,0xba8b4d99,0x3a3b87d0,0x3a8ea6fd,0x3b01e1c7,0x3ad99633,0x39e70a6f,0xba8f3e0c,0xbb139346,0xbb1e6c8e,0xbb342dc8,0xbab1d048,0xbb1dba0a,0xbb97fd74,0xbb69e072, +0xbb813906,0xbab2fba2,0xbaffc4dc,0x3a5c1a80,0xba78848b,0x3adc7959,0x3ab1cf6f,0x3b019c32,0xb7a83763,0x3a45dcda,0xb8dfd069,0xb83ad9f4,0xbb014b02,0xb9c1687b,0xb9f22b1a,0x3abb0743,0x3b800d90,0x3a73cd77,0x39014429,0xbbbb11a1,0xbc0bdaf6,0xbbc50f2e,0xbb4a7a70,0xb888f478,0x3afae3ae, +0x3b9371eb,0x3bb1233f,0x3b41d191,0xbab5a479,0xbb908b4e,0xbbb08d1c,0xbbc6240f,0xbb6fb27d,0xbb59e925,0xbba0bcaf,0xbb0ba1c9,0xbba4900e,0xba98d06e,0x395a5e67,0x3b82505a,0x3b087aa8,0x3b1a9867,0x3bf614bf,0x3bc6daae,0x3bb26ef5,0x3b9b14b8,0x3b878285,0x3aa4c909,0xba5c62fc,0x3a8cb6b6, +0xbbb34c36,0xbbab88ec,0xbaf35bd9,0xbb992bc5,0xbbd720d8,0xbc007dbd,0xbb8ba23c,0x3b41c145,0x3b886876,0x3bc1d46c,0x3c090dd4,0xb8d8bfd1,0xbb4f0998,0xbb1224d9,0x3997a67f,0x3b069f75,0x3ba069e4,0x3b4894bd,0x3b1967d2,0xbb0b3451,0xbb84a4b3,0xb84b4241,0xb9712c3d,0x3ad7bad6,0x3a886528, +0xbb05ceb2,0x3b92e432,0x3ba58996,0xb9a74573,0xb9ef6c22,0xbb3ebd65,0xbbb51aca,0xbb96f577,0xbaa2bfc7,0x3b81f177,0xba3a60c8,0xbbe4bc04,0x3abd7db6,0x3b138987,0x3b72bb86,0x3c62178d,0x3bdf3d72,0x3b18d881,0x3b227fd5,0xbb550d37,0xbb4255c0,0x38b4f44d,0x3b9bd4d6,0x3b905e98,0xbb1f6797, +0xbb2cdce0,0xbb75f12f,0xbb48d5ff,0xbb5ef77e,0xbaf72082,0xbb67dfac,0xbb64f51b,0xbb02ca81,0xb822e490,0x3a89ac36,0x3b123e1f,0x3b22f6e4,0x3a811aa6,0xbaa37734,0xbb4ca9fa,0xb996fbfb,0x3b2851b7,0x3bc4121b,0x3ba64af1,0xbab66d13,0xbc4a1158,0xbc012692,0xbb20bde6,0x3bc5e855,0xbbd8b1f4, +0xbc59d5ec,0xbc8a4d93,0xbcbaa476,0xbc69c77c,0x3c0f5dae,0x3bd7893d,0x3bc70c29,0x3bacbea5,0x3b29505c,0x3ab41f0d,0x3af74cd9,0x3b71fb6c,0x3b7e9254,0x3b7db30f,0x3ae16c5d,0x3b1e727a,0x3a819946,0xb822994e,0x3a84663e,0xb87141bc,0x3a57a28b,0x397f5788,0x38bf2b6e,0xba9762d6,0xba187e71, +0x3a6e8cb0,0x3abd75e8,0xb8710877,0xbb30bd88,0xbb598f83,0xbb423a8e,0xbb1a2a40,0xbb984a6f,0xbae8c176,0xbba817a1,0xbb8850d2,0xbbb379b0,0xbbcb7070,0xbb884d90,0xbb30ed04,0x3b64d3d1,0xb9fef4cf,0x3abc80b8,0x3b803b4e,0x3b8f4a64,0x3b910a6b,0x3b5fc7ca,0x3a195af3,0xbb0dc278,0xbb3ce27b, +0xbb63ba68,0xbb2bca18,0xbb43fc57,0xbb9912f1,0xbb67e333,0xbb37afdc,0xbb09c136,0xbac23cd6,0xba9225d9,0xba1a8d59,0xbaabe0a2,0xbab245eb,0xba8e56e4,0x39f60abd,0x3a4f4fc8,0x3a17793a,0x3a46bbf7,0x3a94f72f,0x3a8b8bcb,0xbb291b6e,0xbbc7102a,0xbad61b1c,0x3a143026,0x3b4573a6,0x3b43d109, +0x3b75b0f8,0x3bb41ad4,0x3b99e885,0x3b66a465,0x3ac325f8,0xb9e982cf,0xbad0c549,0xbb149684,0xba1ed2fe,0x3a230359,0x3ad6a94b,0x3a804e0f,0x3a952668,0x3a672924,0xbaa8e57a,0xbab19d1c,0xbb29e1e9,0xbb3931ba,0xbb154794,0xbae3409a,0x3a163ba9,0x3b111d88,0x3a8928bd,0x3a5eea63,0x397c2ea7, +0xb8d3447c,0x3ad295bc,0x3b0a1581,0x3a7b41f7,0xbac3da09,0xbbe1eed9,0xbbc36c30,0xbae095a8,0xba32ac2f,0x3a561e13,0x3ad4fafa,0x3b0eaabd,0x3b0062e3,0x3b1f9c55,0x3b27d0d1,0x3b32cc6c,0x3abbc164,0x3a4fb585,0x3a01d34c,0x3a54b443,0x3a89de6d,0x3aca345c,0x3ae219f4,0x3a9ba69f,0xb9079c64, +0xbae8623a,0xbb39a410,0xbb8b3e77,0xbb375229,0xbb0c52e7,0xbb2abedb,0xbb29c36a,0xbb2b8ed2,0xba585075,0xba88b957,0xba677205,0xba1f1f5f,0xba8438d7,0xbb23f4b6,0xbba300e2,0xbbb97cc8,0xbba6c5aa,0xbb2277b4,0xbab4ec8d,0xbaf358c7,0xbab8ab5f,0xba937f99,0xb9a71bec,0x3a1b7dbf,0x3a8259bd, +0x3aa2a584,0x3ac93024,0x3ae9c0f6,0x3b08ace5,0x3b14ff9c,0x3b0f5a85,0x3b09dda0,0x3b0f7162,0x3aa23a36,0x3a7d22ac,0xb9d1b31c,0xbade3912,0xbad4ec5b,0xbb05246e,0xbaff832b,0xbb1804ff,0xbafb551f,0xbb3d43b4,0xbb2dc651,0xbb96deef,0xbb8f6387,0xbbbfaf49,0xbbd05321,0xbbdd720e,0xbbf23dbc, +0xbc05b0ba,0xbbbfd915,0xbaf29295,0xba0ad128,0xb92dd7af,0xb8b249c5,0x39795370,0x39abdf33,0x399910ec,0x39295579,0x39bee037,0x3a36d659,0x3a83e8d2,0x3a9ed59c,0x3aa2c71b,0x3a92adc2,0x3a9cb207,0x3aa41cf8,0x3ab96a3e,0x3abcfdff,0x3ae436f4,0x3ae9c4c5,0xb95db590,0x399a877c,0xba44254e, +0xba7f0710,0xbafe1276,0xbb12d074,0xbb011eb1,0xbb207cc9,0xbb4133bd,0xbb0bc7fc,0xbae370ec,0xbb0fa09a,0xbad5fe04,0xbac8576d,0xbac06ed1,0xba2b68c8,0xbb2387c5,0x38ba5ee0,0xb9977ac0,0xb991807e,0xb9948814,0xb988d2b7,0xb91ff477,0xb843aaba,0x38b3a8cc,0x38c9c892,0x38ad62c8,0x38bf63bf, +0x3923ab4e,0x397aac0e,0x398cf46b,0x3990fc21,0x39910dd2,0x39ae6b76,0x398b4e39,0x3a6b576b,0xbaf02930,0xbb3e134b,0xbb04b8c9,0xbb09060b,0xbb68eb0a,0xbb28aead,0xbb351a27,0xbb3625a8,0xbb25b369,0xbb46e68a,0xbb4abd61,0xbb4cd012,0xbb769a85,0xbb26301a,0xbb09f698,0xbb5c1b56,0xb9e88a8a, +0x3aafd155,0x3b8fcf77,0x3a3dab3f,0x3a95665f,0x3aa466b4,0x3a8996a9,0x3ab1b8f9,0x3abfafa3,0x3ab0359d,0x3ade35c1,0x3ae9029f,0x3ad56ed6,0x3ae9d4a8,0x3ae863a7,0x3af2c025,0x3ab39b62,0x3a97dc47,0x3a82cd6f,0x3a8829e9,0x3a648015,0x3a15b1f7,0x3b79192b,0x3b4a0132,0xbaeea5f4,0x3b8049f6, +0x3b7275fd,0xba2cfc03,0xb9a574e5,0xb9059c35,0xb871baed,0x39c5e56c,0x39e7a33b,0x3a2929d4,0x3b786112,0x3b83983c,0xba527ec4,0x3b7f58fc,0x3b599009,0x3b2e5719,0x3ac7f181,0x3b05b8c9,0x3abca75e,0x3b0a78b1,0x3b125ae3,0x3af8651e,0x3b29a86f,0x3b391a59,0x3b32f82c,0x3b57bbd6,0x3b5de8e2, +0x3b5baa13,0x3afbd00f,0x3aa2ebfd,0x3a56f157,0x3a5a20d2,0x37955575,0x3aa2c5ab,0x3a1965b3,0x39a7343f,0x3a86c4d0,0x3aa0b5e1,0x3ae8ceef,0x3b1c14bd,0x3afdcf59,0x3b38a9d7,0x3b7f6895,0x3b301023,0x3af7ef42,0x3b3361fe,0x3b1d36ae,0x3b16f859,0x3b3705e5,0x3b32d08a,0x3b957b71,0x3afb06dd, +0x3a8cd4d1,0x3affa5fe,0x3a364565,0x3b0af016,0x3b4df690,0x3b18a572,0x3b917f54,0x3ba3da81,0x3b7f1dbd,0x3ba7278d,0x3ba4d37f,0x3bb1cf9c,0x3b2f1b1e,0x3ab5dca2,0x3a1abcdc,0x3968cdb8,0xba43b89a,0x39af1a3b,0x3a31b1ba,0xb982ca3f,0xbaad3052,0x3aa321ef,0x3aeef99c,0x3b084081,0x3af03856, +0x3a922b2f,0x3b92ce0a,0x3aaa347b,0x3b1fcfab,0x3b2b39b7,0x3b08f93e,0x3b2832df,0x3b132a25,0x3b6fca85,0x3bbb77a6,0x3b516b22,0x3b2c5ef1,0x3b788303,0x3b0aaf35,0x3b8d2ab8,0x3b940176,0x3b395112,0x3bb9190d,0x3bcf48c1,0x3baf21b9,0x3c05116d,0x3c21c11c,0x3c1f09fb,0x3b9db861,0x3afacebf, +0x395b2915,0xba6113f7,0xbb388e37,0xbaa391e5,0xbabf8138,0xbb4d7346,0xbb47e941,0xba08cfe7,0x395ffa80,0x3b34ae01,0x3ae7a896,0x3b117bbf,0x3bc32613,0x3bc34c65,0x3b947fe9,0x3b90209c,0x3b69ecb3,0x3b389c8e,0x39e40324,0x3b800d56,0x3b6e3d1e,0xb9d440fb,0xbb008eb8,0xbb17f209,0xbb986f12, +0xbb4e35bd,0x3adce0e2,0x3c1dbec9,0x3bd812c1,0x3bb4c6b0,0x3bdee1d5,0xbb5b4775,0xbbf5ad93,0xbbf7d4b7,0xbb1ec049,0x39bbe9c0,0x39224138,0x3b3bd7b5,0x3b3c6bf2,0x3b52838f,0x3afb8d82,0x39bb377b,0x3aed63a4,0x3b033352,0x3af2a65c,0xbaf1c045,0x3ba05b34,0x3bb034f7,0xba2aff80,0xb9a551b7, +0xbb41373a,0xbb895292,0xbb2a329a,0x3b1c79d8,0x3bdb85f2,0x3bbbd2b3,0x383c30e0,0x3b4e674c,0xbad1ec22,0x3b874b7c,0x3c48781e,0x3c4adfe9,0x3c205780,0x3bd53781,0xb9cf5986,0xbb08c009,0xb9d85ec7,0x3bc7898f,0x3be1ffd7,0x3a51cbae,0x387a391a,0x39c5697d,0x3b6c48db,0x3b37c31a,0x39a20e56, +0xba9cbae8,0xbad0eb6b,0xba9e425e,0x3ad4eff6,0x3a328dc2,0x3adc3584,0x3b114486,0x39b2fc40,0xbaf16f39,0xbb4f0df1,0x39567428,0x3b54d0c8,0x3ba54f64,0x3b884c89,0xbb17c8bd,0xbc1c1b53,0xbbbcbe3d,0xbb1f2906,0x3b1a4d98,0xbc067a44,0xbc18d4d7,0xbadb901d,0xbbc064b8,0x3a34bc52,0x3c8bde64, +0x3c14e769,0x3bb36a90,0x3b9e11ea,0x3b88fccf,0x3b9da2da,0x3bcc3de0,0x3bd293b8,0x3ba7d3ab,0x3b621acb,0x3b0d1b34,0x3a1fff0a,0x3b337285,0x3b4f7533,0x3ad426c5,0x3af79e83,0x3ae9a66b,0x39f6b808,0x38e25d93,0xba9387f4,0xba2a49cc,0x3a93bcef,0x3a725c9a,0xba22e460,0xbb35178f,0xba8da54c, +0xbaee4995,0xb9188677,0xbb8d95f4,0x3a1e47de,0xba3cef13,0x3ba9dbf4,0x3c2cc5cc,0x3c6a3e18,0x3c517e72,0x3c16cc3d,0x3b94676a,0x3b887e65,0x3be09993,0x3c2a6249,0x3c1ff77c,0x3c1129dd,0x3bdc5988,0x3b8f880a,0x3aff8bbc,0xb8520745,0xba8b4179,0xbb2efc1a,0xbb13de55,0xbb2be90c,0xbb34590f, +0xbb1835a9,0xbaae5aa6,0xba3d05d0,0xba4f3b0e,0xba0d96c8,0xba197406,0xbaa05c44,0xba84babb,0x398390e7,0x38809fce,0x3a091817,0x3a9284d2,0x3b195067,0x3aadc31a,0x3ab5947e,0x3b51fa37,0x3c20afea,0x3c4b617c,0x3c4dd1ed,0x3c71d736,0x3c6f4f3b,0x3c5255d9,0x3c3e97d4,0x3c2df3e9,0x3c43e7ff, +0x3c057192,0x3bb73c2a,0x3b74a8dc,0x3b245fcc,0x3af418ff,0x3aa0b5b7,0x3ab897d7,0x3aa61591,0x3afc03f6,0x3ab520e6,0xba327891,0xbb2c3fa3,0xbb38c354,0xbb0d3a2d,0xba87365a,0x3a9d7085,0x3b0e509c,0x3b0d7276,0x3ae2fcf2,0x3afae1e3,0x3b03f023,0x3b547fa8,0x3b6f4f8f,0x3b0ace17,0x3b697e00, +0xbae8080b,0x3ac9da62,0x3b670f2a,0x3b90670c,0x3b898f1b,0x3b5256c4,0x3b2b35ba,0x3b6e7d48,0x3afd9bf2,0x3a75eeac,0x3a02e5bd,0x3a6292df,0x3b0869c5,0x3b49d0c0,0x3b730201,0x3b60f9b1,0x3af679e1,0x3ace6687,0x3940b9f9,0xba7eee73,0xbb041dfb,0xbb25080a,0xbaba6b9a,0xbaa61e50,0xbae0204b, +0xbb1cfbae,0xbb16f75c,0xbaef47c5,0xba5b3351,0xb86d7465,0x3a13e957,0x3a84b7ac,0x3a831c41,0x3a553c47,0xba69350c,0xb6bcd9dc,0xbab8aab7,0xbab0f655,0xbae15472,0xba641fc3,0xb9ddb10a,0x3a495c60,0x3aec1fc3,0x3b3eb117,0x3b5a007d,0x3b73c4df,0x3b76714f,0x3b43bcfc,0x3b09e8f8,0x3ab9b5ed, +0x3aa6d79a,0x3ab13bc5,0x3abb8e7e,0x3a8d61e1,0x394f7d3b,0x3a001a80,0x3a419c37,0xba01a7ed,0xbabeb42f,0xbadc81ba,0xbadb4ed7,0xbafa229d,0xbb0be895,0xbb2f5340,0xbb26fd09,0xbb7f6e58,0xbb8d8ffc,0xbbaa43f5,0xbba567e3,0xbba2d9e6,0xbba60b04,0xbb5b94e1,0xb7f542d0,0x3a348ef2,0x3a26d79a, +0x3aa3f0f5,0x3abe7bea,0x3ad46e02,0x3adab760,0x3afa90ec,0x3aacbb87,0x3a66288e,0x3a2f3994,0x39ff59d7,0x3a0a348d,0x3a212137,0x3a2836f3,0x3a0e0669,0x39eb3460,0x39e94998,0x39729088,0x3a0a8f93,0x3ab7df96,0x3a3502e5,0x3a9c056a,0x39e3d8e8,0x39f81257,0x3982b42f,0xb95284bf,0x389f5725, +0x387ab82e,0xba0995bc,0xba9a7dfd,0xba9e9388,0xba615e7d,0xb9d2cc04,0x3930ab77,0xb897fab3,0x3ac693d4,0xb9cc0264,0xb94d46f2,0xb8ce9506,0xb811dc77,0x391829e1,0x39a9a3b9,0x3a1ae6d5,0x39c72ee1,0x398d8170,0x38ca0a8b,0xb771d501,0xb928b2c6,0xb9a70924,0xb99fc815,0xb98dafe8,0xb9893f88, +0xb93c1fc4,0xb8e1ead3,0xb9ef44a8,0x3ae0ef19,0x3aef8a12,0xb9a2fa06,0x3abe2318,0x3ae42788,0xba4bab09,0xba2dad73,0xba48b90f,0xba8351ea,0xba3f4e94,0xba363e41,0xba67d4dd,0x3a66ac34,0x3a566cef,0xba8901a2,0x3aa2f772,0xb98bd49f,0xbb41c0a5,0xbb76d6c6,0xbb430ad6,0xbb1be0a6,0xbb36dd64, +0xbb2e93d6,0xbb6f8769,0xbb7c861f,0xbb6ff760,0xbb55b651,0xbb450b58,0xbb3e15a1,0xbb340957,0xbb340e3c,0xbb2ec8ca,0xbb4acc61,0xbb559607,0xbb5e9028,0xbb5bbe47,0xbb42dca6,0xbb54ce2a,0xbb86e089,0xbb030a7e,0x3b5d9254,0xbb87ff2e,0xbafa62cf,0x3b5fee09,0x3b496928,0x3b441596,0x3b4a837d, +0x3b25309f,0x3b1d1ef9,0x3b255d8e,0xbb05d248,0xbb8b5def,0x3b6e9afb,0xbac63547,0x3a22df0e,0xbb569362,0xbab5d6f1,0xbb0e027a,0xbb0ef025,0xbba6f0f8,0xbbc74b2a,0xbbb42559,0xbb9a6711,0xbb802d80,0xbb6235f2,0xbb271a8c,0xbb1285a3,0xbb15455c,0xbb79eb7d,0xbb9c6210,0xbbae184b,0xbbad8340, +0xbb953b46,0xbb9c0659,0xba94ecd5,0xbb4d94e5,0xbb84d0d7,0xbad40591,0xba8c0648,0xbb213adf,0xbb0a2768,0xbb3ae544,0xbb07d037,0xbb2d0116,0xbb02756e,0xba42dd13,0xbacf9f70,0xba6fd105,0xbabbdf86,0xbb09566a,0xbafc24c1,0xbb3e45ed,0xba9e8e51,0xbb1c7fa0,0xbb07de74,0xbbf667cc,0xbc156b93, +0xbc02b818,0xbbc552c1,0xbb8ceae1,0xbb887361,0xbb341b5f,0xbb2ab9bd,0xbb1f1696,0xbba3e6f3,0xbbcf0d2f,0xbbe6c374,0xbbd6a5ce,0xbbc22cf3,0xbb8a57d7,0xbb8032bc,0xbb5a7603,0xbb68f469,0xba9ef72c,0xba174a2c,0xba175f9c,0x3905acf9,0xb92c98d3,0x3a40a2bd,0x38577883,0xb94dca1a,0x3a03b865, +0xb99feb04,0xb909e6fa,0xb9e66f0c,0xba8ecb98,0x3a5dceed,0xba528847,0x3b17743f,0x3a986670,0x3a86dfcd,0xbbfa0500,0xbc436960,0xbc38d1d9,0xbc09bddd,0xbbc90749,0xbb9f42b5,0xbad824b6,0x394c226a,0xb984ee98,0xbbc5aa4d,0xbc1c92c9,0xbc388c03,0xbc30de3d,0xbc0fcd30,0xbbca0d56,0xbb7e23f4, +0xbb717339,0xbb842b8d,0xba8514a0,0x39d816d7,0x3b32cf9e,0x3ad766aa,0x3b184531,0x3bcbd01f,0x3bac4012,0x3b905fb4,0x3b9e13e1,0x3b3cd789,0x3a63985b,0x39cbadb0,0x39cc3365,0xbbb16ee7,0xbc1e7d3a,0xbc1e3a9f,0xbc389cc7,0xbc46965f,0xbc643051,0xbc38a99c,0xbb9627f6,0xbb522f70,0xba498eb6, +0x3b4476a5,0xbb9ed9f7,0xbbf982e9,0xbbb34398,0xbb3ad6a5,0xba53e7a2,0x393e0da6,0xb9ce4cbd,0xbaffc29c,0xbb67b4ef,0xbad94372,0xba55bcc6,0x3a2bd15f,0x3a4ce302,0x3a456e53,0xbaeaa603,0x3ba3218d,0x3bac6187,0xba3d160c,0xbab713ca,0xbb8538ac,0xbbb3c304,0xbb445b4f,0x3a220fe1,0x3b676c08, +0xbadf54ba,0xbb7bb650,0x3a2248db,0x3b1dec0c,0x3b6ffcd3,0x3c23f277,0x3bda28f5,0x3b7bea71,0x3b1fa792,0xbb50844b,0xbb7e4c76,0xbac94fec,0x3bb37143,0x3bc48dd3,0xbb0d0c61,0xbba80bc5,0xbc07320d,0xbc19c48d,0xbbeeced5,0xbbb6e726,0xbba073b3,0xbb2b0242,0xbb0d2f66,0xba0fc97c,0xb98285ee, +0x3a591b5c,0x3ae5151f,0xb91a76e6,0xbb1781f1,0xbb5ce440,0x3a04211b,0x3b5173e4,0x3b819751,0x3aef497e,0xbbab34aa,0xbc40a9d8,0xbc0749b9,0xbb6a26d7,0xbb9221e5,0xbc5150a8,0xbc8938d5,0xbcad8345,0xbce96344,0xbcce677b,0xbc26de79,0xbb253f1f,0x3ac96506,0xb88a7277,0xbbb1e9ed,0xbc0921f8, +0xbbf4960a,0xbb6fea85,0xb90fe1d5,0x3b4191d5,0x3af8d224,0x3a3bebb4,0xba96ceed,0xba6ea70c,0xb9471362,0x3973a357,0xb92be5b6,0xba3431fc,0xb96693fc,0xbaae5bc2,0xba390cc3,0x3a81df13,0x37860bae,0xbaf333ad,0xbb8b39bf,0xbad6593a,0xba79b4a3,0xbabef65f,0xbb7f9bf6,0x3a321f45,0xb99b9079, +0xbb82b3ee,0xbc0b6fe8,0xbc707992,0xbc331505,0xbbf160a8,0xba743d8c,0xbb32edda,0xba66c8d4,0x3b267ce4,0x3b2cf2d9,0x3b2fe054,0x3b16548e,0xbad8d7e6,0xbba4e6a4,0xbbe16b4d,0xbbde263c,0xbbadb184,0xbb7c5842,0xbb62d95a,0xbb79d984,0xbb4fae55,0xbadf5f20,0xba7ae17e,0xba98e01f,0xb94b8add, +0xba6128fe,0xbacb700f,0xba8b8007,0x39244fad,0x38811750,0xb79cb508,0xb7c5aee3,0x3b343603,0x3ad1a180,0xbaace3da,0xbc2625ab,0xbc63b805,0xbc3cf19f,0xbc104096,0xbba9fa76,0xbb3ad4f1,0xba7e6f9f,0x3a2ce3f2,0x3a3e83f3,0xb9941ec2,0xba792933,0xbadf59da,0xbb346b7f,0xba337f79,0x3a1a833b, +0x3a3b334b,0x3a7f2356,0x396072eb,0xba37a5b8,0xbace1447,0xbb3f01c2,0xbb4b5b14,0xbb5569fe,0xbb1dc003,0xba9bf78d,0x3a602d2a,0x3aef4449,0x3a5cea7a,0x3a79d9cb,0x3a61b06c,0x3a0f017b,0x3b013732,0x3b045573,0x3a97320a,0xbb3b828b,0xb9417e72,0xbb7fe9f0,0xbb054412,0xb9230123,0x39d55a83, +0xb9e09a6c,0xbab6f8cf,0xbb47d88a,0xb9ed6d5f,0x3a3d9d80,0x3a922d6f,0xba17c93d,0xbaab0768,0xbaa9dbe8,0xba827d9d,0xba80335c,0xba78cd18,0xba3c8405,0xba58ae02,0xba84724e,0xbb1fbe1e,0xbb53ea13,0xbb5682a1,0xbb3eb687,0xbb206f41,0xbb368eb3,0xbb2b2443,0xbafd8027,0xb9661758,0x3986bebc, +0x3a4323c6,0x3a62fb4c,0x3ab19fea,0x3938a5a7,0xba80e398,0xbb399189,0xbbbc8da7,0xbb9c4f07,0xbb909a0d,0xbb8b6cbb,0xbb743ee9,0xbb649943,0xbb45415f,0xbb3dfd08,0xbb158f3a,0xbb025e14,0xbab8c7c9,0xba36e63d,0x386d820b,0x3a4c0e2d,0x3a242bc7,0x3a3dd61d,0x3a6e9e21,0xb9840b6b,0xbab47cf7, +0xbb1a39ad,0xbb008778,0xbaf373bf,0xbb074928,0xbb0d0452,0xbb035f5a,0xbb12da3c,0xbb113985,0xbb44d04a,0xbb678125,0xbb8897f0,0xbb9e5bb9,0xbbbdda54,0xbbccdbd8,0xbbe2a9b6,0xbbeb65ff,0xbbccc0f1,0x39b92e2e,0xbad7bd90,0xbab4884a,0xbac69185,0xbacd7d44,0xbaec20ec,0xbb03d9fd,0xbb0fc94e, +0xbac30264,0xba451f44,0xb9086806,0x39dbc3cf,0x3a523273,0x3a96521b,0x3a7be3aa,0x3a4c7ab9,0x3a395c92,0x3a1bb5ef,0x3a643ba7,0x39ae58c9,0x39626313,0xba6b9c38,0xbaf141b5,0xbac6ab62,0xbb117b07,0xbb5a6999,0xbb5ebfa4,0xbb773395,0xbb624c1a,0xbb6dad10,0xbb5e44f9,0xbb4e99a3,0xbb30bdf7, +0xbadf75cc,0xbaece404,0xbaf9eee3,0xbb54f7e6,0xbb34580b,0xbb213dbc,0xbb2b4a36,0xbb27b82a,0xbb232949,0xbb1c315f,0xbb1e390c,0xbb0e71e9,0xbb082b21,0xbaff776b,0xbaed3e41,0xbad62e21,0xbab242ed,0xbabd981b,0xbabf0d30,0xbac31ff2,0xbac7986a,0xbac3819d,0xbab91bbf,0xbb256c7e,0xbae6dd4f, +0x3aaa1719,0xbb5e505a,0xbb1d4ece,0x3a902d1a,0x3a6615d6,0x3a25e209,0x39cf458c,0x38c1b134,0xb8c248fe,0xb9cf4bf5,0xbb37706c,0xbb849e8a,0x3a4f84f6,0xbb09d766,0xbb46b1cc,0x3b5cfdcc,0x3b1fbec0,0x3b84004c,0x3b3c0b4a,0x3b50a7f6,0x3b3200a8,0x3b50e778,0x3b5e37cf,0x3b63848c,0x3b7a1a19, +0x3b7ec343,0x3b6eac46,0x3b759be1,0x3b76174a,0x3b83a649,0x3b6b7461,0x3b5e356c,0x3b4d7a8d,0x3b4d428d,0x3b2c9103,0x3b6e52b5,0x3af1161a,0xba934f44,0xbbdacd45,0x3b524a34,0xb9a4d6c6,0xbbb9c4f9,0xbbb3215e,0xbbaf353d,0xbba133ca,0xbba8075c,0xbba741f3,0xbb952b5c,0xb98709d9,0x3b71b815, +0xbbb68c78,0xba5384e4,0xbaaf5e24,0x3b9da9bf,0x3b81d602,0x3b7c1580,0x3b39e7da,0x3b6bfb05,0x3b81a94d,0x3b894508,0x3ba4e530,0x3bac0543,0x3b9f19fb,0x3bb05800,0x3bbcb241,0x3bd0007b,0x3ba8efce,0x3b8e47c8,0x3b672995,0x3b42d617,0x3b1e4a25,0x3b2a4e78,0xbb5b01b6,0x3a447a96,0x3a51f1cf, +0x3a91ab1f,0x3a9069b3,0x3b0fd3c0,0x3b24a9db,0x3b40ac86,0x3b0c11c6,0x3b35fe8d,0x3b34ba61,0x3b2776db,0x3b21c271,0x3a87e713,0x3ae56d75,0x3b7de6d7,0x3b286b3f,0x3b58cd00,0x3b880ea9,0x3b6b0dda,0x3b041319,0x3b62d672,0x3b9beff4,0x3bab56eb,0x3bf3906e,0x3c0198c0,0x3bd1ba0d,0x3bebd21d, +0x3bef0411,0x3c0edc64,0x3bd19623,0x3ba63c5a,0x3b7685b1,0x3b2fb2e3,0x3b1a7960,0x3a1065bb,0xba76e430,0xb9ea89d9,0xba62d5db,0x3b033ac2,0x3a8ef9ae,0x3b022a32,0x3a832804,0x3b16b338,0x3aed40ed,0x3a7b6b51,0x3a0e72bd,0x3b19ac49,0x3a9016c0,0x3aef9333,0x3accfa3b,0x3b4fc005,0x3b81ec2d, +0x3ba9c706,0x3bc5f28c,0x3bae05d6,0x3b3ab358,0x3b9201ca,0x3ba8abec,0x3bb22eb6,0x3c0cfb30,0x3c18e089,0x3bfa1fef,0x3c22954c,0x3c4c6c5f,0x3c6d7758,0x3c27b0c3,0x3be23a0c,0x3b83df01,0x3ad267ab,0x385f1cd7,0xba883711,0xbb698298,0xbacd8ec6,0xbb5c2aaf,0x3a9d7ff3,0x3af3b730,0x3b3b86cc, +0x3b1594d5,0x3b044a3c,0x3bb0301a,0x3ba2fa2c,0x3b8d94a0,0x3b9a5102,0x3b4fea26,0x3b19be67,0x3aef11bc,0x3b9af01c,0xbb0cef7e,0x397caf8f,0x3ab736bd,0x39eef2a6,0xbab24e14,0x39ff1c89,0x3b995d02,0x3c5c6ef1,0x3c390034,0x3c318b36,0x3c5681e4,0x3b61f19d,0xbb0e3c05,0xbb9298a4,0xba345e5c, +0x3b1b9195,0x3bb1e7e2,0x3be7e3b0,0x3c038ee4,0x3b8ca4c8,0x39c94a06,0x3b2f8ec9,0x3b45c518,0x3ae9ed4f,0x3a97fb0b,0xbad0f215,0x3bac62e4,0x3bb6ba09,0xb9ff9dd5,0xba702b6d,0xbb77358b,0xbb94714b,0xba891a62,0x3b197289,0x3b8f70fa,0x3a7fca4f,0x3a8cfafa,0x3be177ef,0x3bbf638c,0x3bd53ed0, +0x3c02026b,0x3c380532,0x3c1fb6f9,0x3b9b2f20,0x39f71161,0xba8fd9b4,0xb9c92412,0x3bc01928,0x3bf1f0b5,0x3b219e04,0x3b09a258,0x3b35eacd,0x3bce49a4,0x3b858bfb,0x3b265324,0xbad611cb,0xbb17a5d6,0xbab8f4fa,0x39e0f2ba,0x3a65109a,0x3ae20eda,0x3af50ad2,0xba06b177,0xbb2c2289,0xbb455a8b, +0x3ab55df9,0x3b750ec2,0x3b73e90c,0x3a1783c0,0xbb8984b2,0xbc136ae6,0xbb479a56,0xbb8e61d2,0xbbf62185,0xbc4be957,0xbc0ebe27,0x3b3d9410,0x3a1985d7,0x3b955735,0x3c4c89dc,0x3c82f2a5,0x3c6b691c,0x3c0e1a0b,0x3c1eebbc,0x3c1ff1de,0x3c23a651,0x3c21de95,0x3bf7bcfa,0x3b87e666,0x3b5f9191, +0x3b4cb44f,0x3b1492a8,0x3b14f228,0x3af4fa30,0x3acbcb00,0x3a82d596,0xb9836e83,0xb98ed82f,0xba30fb57,0x38c80d79,0x3ab0dd16,0xb8a1efa1,0xbafea1f8,0xbb8386d2,0xb9981c89,0x39ee976b,0xbac3a1c2,0xbb34c74c,0x3b13fa66,0x3b77d83f,0x3c2668a4,0x3c615e84,0x3ca1465d,0x3c83ab6d,0x3c3e2a89, +0x3bac793e,0x3b07c09e,0x3b3f477b,0x3beafa47,0x3bf92c5d,0x3bf72e87,0x3bdacf74,0x3baaaad0,0x3b7eee66,0x3b0941e0,0x3a833623,0xba2455dd,0xbb017e87,0xbb739b9d,0xbb3853ee,0xbb0d0779,0xba605bd8,0xb8bdd421,0xba1845c7,0x3814b165,0xb99170a2,0xba9be95b,0xba2d67c6,0x39cdac85,0x3a60fb92, +0x38932cf5,0x3ad327d0,0x3b669a43,0x3b2ac187,0xbb8e6a43,0xba9935cb,0x3be25946,0x3c09ce1e,0x3c2bd787,0x3c71d2d1,0x3c8598b8,0x3c6e0192,0x3c58f29e,0x3c4a9939,0x3c616e16,0x3c2535e0,0x3bfd71ab,0x3bba23be,0x3b607e37,0x3b0a44c7,0x3ab468aa,0x3a87b16d,0x3a9834ff,0x3abf0445,0xba1249cd, +0xba9a72a6,0xbb342d56,0xbb45fbff,0xbaf1114f,0xb720de14,0x3a9f9f7c,0x3b0a7a17,0x3ace8063,0x3b149fff,0x3b0b7b61,0x3af38bc2,0x3b2aed49,0x3b1a62f4,0x38c47646,0x3ab4468c,0xbb278fc5,0x3b6a9d52,0x3c04bbd7,0x3c046ea9,0x3c0c0c9a,0x3be6e36a,0x3bcd523f,0x3be6619a,0x3b5fc369,0x3aa9e4d3, +0x3984164a,0x3a6e97f4,0x3b027253,0x3b3fcd5e,0x3b76c6d2,0x3b756e9f,0x3b25ca6d,0x3b0e6ca4,0x39fd4b06,0xbb01044a,0xbb24d56b,0xbb24fa18,0xbad989b0,0xbaae5299,0xbade51d3,0xbb176716,0xbada1fb8,0xba5f4b05,0x3a66040d,0x3aee4c0c,0x3b2905e2,0x3b4472ad,0x3b57497b,0x3b6de3ee,0x3b075214, +0x3b2d5ea8,0xbb325d90,0xbadb7f96,0xba27a2eb,0xb7d60609,0x3aaa12a0,0x3b0fa72a,0x3b4721e6,0x3b82f5b7,0x3b7b03e5,0x3b80aaf0,0x3b629ce3,0x3b37b7de,0x3b01748d,0x3a9aa181,0x3a95a714,0x3aa3daba,0x3ac98071,0x3a6be5b3,0x3a0f58e4,0xb9150bdd,0xba533816,0xbaac2f56,0xbade8e79,0xbae48d4e, +0xbb04dbeb,0xbb0174d3,0xbb266983,0xbb0913e6,0xbb42aba6,0xbb5b3c4f,0xbb8c76b9,0xbb93423e,0xbb9f32a1,0xbbb38597,0xbbcebef3,0xbb864903,0xbb1c8941,0x3a2e2fdc,0x3a94027f,0x3af8bd34,0x3b1f2d3f,0x3b4345f2,0x3b67d899,0x3b8bbedd,0x3b6b8ec3,0x3b45337f,0x3b290f69,0x3b064a8b,0x3ad6c36f, +0x3a9dbd98,0x3a959c41,0x3a6c8595,0x3a3e790e,0x3a147509,0x3982cb24,0x3a212d8c,0x354c5b08,0x3a238252,0x3a4575ed,0xb99017b0,0xba05256b,0xb94b0045,0xb9acd3b9,0xb9c69610,0xba8a74bd,0xba4460c8,0xba93100e,0xbae6d35e,0xba9b448d,0xbaa7550a,0xba2893cc,0x38680b84,0xb9144227,0x39a734e4, +0x38c5d002,0x39fb7fb4,0x3a3fff89,0x3a8dddff,0x3ab657f6,0x3af877b2,0x3ac3fc69,0x3aaa84d0,0x3a8b04cb,0x3a665bf7,0x3a371580,0x39f1f166,0x39ee196f,0x39dfe9bc,0x39c2136f,0x39e653d1,0x39b94551,0x39ed8e55,0x39f821ba,0xba8525e3,0xbb81aea7,0x3a13dd94,0xbaa757e8,0xbb9b120c,0xbb998c87, +0xbb97cf94,0xbb933396,0xbb94c81c,0xbb927394,0xbb9394d3,0xbb0693d6,0xb8dc3502,0xbb94cacc,0xbafdf3f9,0x39a4ab4a,0xbb552bdf,0xb9ef37ef,0xbb9017ad,0xbb285cbc,0xbb42984c,0xbb32b3ea,0xbb6bc14f,0xbb7b1c66,0xbb7e9b61,0xbb60e646,0xbb55011f,0xbb5b1af7,0xbb4a69c6,0xbb45172f,0xbb30e32c, +0xbb54d9ae,0xbb62cc3f,0xbb71ddad,0xbb6e9b0d,0xbb51a9d7,0xbb937721,0xba44d505,0x3b1fdd46,0x3bcaf148,0xbabffb7e,0x3b2445a9,0x3bc85538,0x3bccd184,0x3bc9dd6d,0x3bb3af2d,0x3bbe999d,0x3bbf6dea,0x3bc3538e,0x3b0ce41a,0xbb0cb10d,0x3bd3def5,0x3b5056f0,0x3b9ba327,0xbb55c87e,0xbaf27414, +0xbae715e0,0xbae10f77,0xbb84f005,0xbba3b1c1,0xbba88f0f,0xbb8f35e6,0xbb820700,0xbb8447d4,0xbb4b5713,0xbb2c9357,0xbb0638e5,0xbb72ac18,0xbb96475b,0xbbb07b3a,0xbba85e60,0xbba91039,0xbb94e12b,0x3b0a68b1,0xbb15601d,0xbaefe9e9,0xb915ca6b,0x3a2a0f7f,0xbabc2a33,0xbab61668,0xbae4f21e, +0xba2cf72d,0xbb10f549,0xbb15ff05,0x384840ab,0xba94cdbd,0x3a0e4e20,0x3a61cb8f,0xbae2b7d8,0x3a44fbe6,0xbb3ae17c,0xbb1937bc,0xbad9dfdc,0xbac27337,0xbbb2c729,0xbbdfb7d9,0xbbf3dcaf,0xbba85300,0xbb86699d,0xbb9e7d5e,0xbb4d0a0d,0xbb2fec5f,0xba87bd30,0xbb8b4dc2,0xbbb7aff0,0xbbe3c0e4, +0xbbcc8304,0xbbdfafcd,0xbb6f1d89,0xbaceac45,0xbae3da72,0xbae9459a,0x39076a1c,0x3ac23709,0xba1cd3e4,0x3acb3607,0xba93d8b9,0x3a334e17,0xbab3b73c,0x3906dfb2,0x3a5cc489,0x38cbb2bb,0x3a13cc88,0x3af14159,0x3885de9b,0x3b57a012,0xba828320,0x3ab9dc22,0x3b2ae024,0x3b1fd0e9,0xbb710cbe, +0xbbeb6d1f,0xbc172898,0xbbce3259,0xbbb22cf5,0xbbc785b3,0xbb2bfe71,0xb652da08,0x3af7505f,0xbb84c6b2,0xbbfaa9b3,0xbc282f1b,0xbc208ef8,0xbc2062d9,0xbbcfe88f,0xbb1a5ded,0xbb8a6a32,0xbb1060a8,0xb8b16888,0x3a82d374,0x3ae0c47d,0x3adaa95c,0x3b111ab6,0x3b7959e6,0x3b84784a,0x3b4a8eca, +0x3b8bda61,0x3adb45ad,0x3a8036cb,0x3adf455e,0x3a916e65,0xbb19531d,0xbc10d5d1,0xbc475114,0xbc49864f,0xbc4b2c43,0xbc5976d8,0xbc2ff469,0xbb83d471,0xbb90ba66,0xbb32a40b,0x3a903d12,0xbbd5d053,0xbc22dcde,0xbc0a452e,0xbbb4508b,0xbb34e9a6,0xbb36eb78,0xba641160,0xbaf122f2,0xba25a12f, +0x3b19d56d,0x38311802,0x3b0edc55,0x39b87260,0x3a1a597e,0xbaa1a183,0x3b9b1046,0x3ba57098,0xba063a73,0xbacdd615,0xbb902eaa,0xbba0563f,0xbaa7fcb1,0x3b26f416,0x3b811dd6,0xb96d4609,0x3a62acb9,0x3aa2608a,0x3af88bf0,0x3b5db6fc,0x3bb5c942,0x3c042e54,0x3bf292ae,0x3b748e91,0xbadd2c42, +0xbb7aad8e,0xbb2be143,0x3bae845a,0x3bebe2eb,0x3a508af1,0xbb869007,0xbbf7a121,0xbc0edaf1,0xbbc56528,0xbbb30813,0xbb821a77,0xba6ddeab,0xbab998ad,0xba0d2b7d,0xba94ef34,0xb9744698,0x3aa06a1f,0xba9522ba,0xbb478d37,0xbb48b4fd,0x3a8db59b,0x3b5b1084,0x3b022165,0xba7f3495,0xbbf56c49, +0xbc285c95,0xbbd6743a,0xbb804b2d,0xbc6b8661,0xbc84d9ad,0xbc7619b3,0xbc80993a,0xbca6e7c1,0xbcab21fa,0xbc85b8d2,0xbb55ce25,0x3acbda37,0xbb4b7aa1,0xbbf04c39,0xbc226e1d,0xbc0eb580,0xbbacdc43,0xbaaacbb6,0x3afc8e0d,0x3afdef13,0xba2041ff,0xbb01846b,0xba18a266,0xba156123,0x3a95cb4b, +0xb9842029,0xba898e2c,0xba34bc9a,0xba83c300,0xb98f4476,0x3a687b75,0xba62dd8b,0xbb2e7b39,0xbb92a845,0x39f85187,0x3a9287c8,0xba8d52ef,0xbaf2744b,0x3b7afb6b,0x3bc40f52,0x3b015f64,0xbb126bf8,0xbc189558,0xbbe90090,0xbba439c5,0xbb54df9f,0xbb2f82d4,0xba8a0909,0x3b400d20,0x3b580005, +0x3b5bd992,0x3b4fa894,0xba2271e2,0xbb70f37d,0xbbd757c8,0xbbd3d001,0xbbbf5119,0xbb80e654,0xbb11802f,0xbb6508ca,0xbb42f7bb,0xba9dd3e6,0xb9be16df,0xba568842,0xb91e5fb6,0xb9f69172,0xbabb424e,0xba407c57,0x364ba0fb,0xb9457d38,0xb99cc1ef,0xb9205904,0x3b790374,0x3b132658,0xb85acf4c, +0xbc05df35,0xbc6efa3a,0xbc4a654b,0xbc268553,0xbb7dd89a,0xba8d27fb,0xba502a31,0x3ae4aaeb,0x3b2033b9,0x3b4d8435,0x3b18b96d,0x3ac90daa,0x3a1391b0,0x3a5468f9,0x3a88d6f6,0x397c78b6,0x3a6de0d0,0xb9f6b40c,0xbad88baa,0xbaaef481,0xbb66f361,0xbb54eef0,0xbb583de4,0xbb1376b4,0xb98f1d01, +0x3a631809,0x3a963d8d,0x3a88f822,0x3ab7f954,0x3ae901cb,0x3ae05f4e,0x3b13f39e,0x3b068236,0x3ad601c6,0xbac3bb55,0x3baf0275,0x3a94f5d7,0x3a783b36,0x3b2cad50,0x3b00c1ad,0xb9452c50,0xbb097395,0xbb78835f,0xbace7737,0xba29606f,0xba007b18,0xbac469e5,0xbae4b081,0xbab8b365,0xba5ab62e, +0xba8352bc,0xbadb3610,0xbae7fb42,0xbb032e35,0xbae23397,0xbb2157f0,0xbb3a79ea,0xbae09eb5,0xbb20fa22,0xbb28a649,0xbb361bc5,0xbb0ce9b5,0xba5ccd2c,0x39e2b847,0x3acecdb0,0x3b1cb2b9,0x3b25ee70,0x3b6251d5,0x3b49c1ba,0x3b3bdef6,0x3ac2d3e6,0xbb917ed0,0xbba449ef,0xbbaa33c2,0xbb86d59a, +0xbb530af8,0xbb3b2bec,0xbb314db5,0xbb4c3b58,0xbb349ef0,0xbb28b2ec,0xbb0eb4b6,0xbad0d074,0xba819843,0xb9a10931,0xba100e3b,0xb9e824a9,0xb999da3f,0xbaa18ba8,0xbb31b83a,0xbb41d7b5,0xbad9a23b,0xbb0492b4,0xbb1a9bc7,0xbb2383ae,0xbb019423,0xbb2f7ef0,0xbaff2779,0xbb531e71,0xbb222101, +0xbb724910,0xbb6a2025,0xbb952c52,0xbb9e292f,0xbbaba405,0xbba69215,0xbba5a37f,0x3a94e961,0xbb03e659,0xbaf0e076,0xbaf40fb8,0xbb081de8,0xbb1729d5,0xbb1a567f,0xbb115b41,0xbad50598,0xba8df63c,0xba24c483,0xb9490648,0x394a9669,0x3a37cd5f,0x39ab922b,0xb7b19452,0xb9ae07c4,0xba0d6868, +0xba09194d,0xba98bc08,0x39b46057,0xbacfd926,0xbaf8cb60,0xbad0e5ac,0xbae9bb9a,0xbb4505a3,0xbb625205,0xbb670736,0xbb387fec,0xbb7b0554,0xbb853daf,0xbb65fafe,0xbb5242d0,0xbaf6fc23,0xbaf2f185,0xbb278f1d,0xbb140e48,0xbb838e50,0xbb586acf,0xbb5fdd25,0xbb561825,0xbb4a3079,0xbb4207f6, +0xbb429cd6,0xbb3bc7eb,0xbb369291,0xbb2e2431,0xbb252ac4,0xbb1c3a26,0xbb0c99de,0xbb1644e2,0xbb186659,0xbb1c476a,0xbb2206b8,0xbb1d3e55,0xbb3d22b7,0xbadf79c1,0x325d04ae,0x3b244271,0xbb2ffe98,0xb9c68a81,0x3b225647,0x3b19e9e2,0x3b03803c,0x3abdb630,0x3ac39e34,0x3aab4fcb,0x3a61e94f, +0xba8ce44e,0xbb6245f8,0x3ad6bfa6,0xb9b3e492,0xbb7e80a5,0x3b1bb679,0xba9f0271,0x3b6bb499,0x3b08b73d,0x3b159f6f,0x3af93ed2,0x3afd8b1b,0x3b058c06,0x3b122dcd,0x3b2c3df0,0x3b33b70b,0x3b2374bb,0x3b2bcd85,0x3b2e1e95,0x3b456fd1,0x3b2dac38,0x3b22283a,0x3b0f1192,0x3b0d071c,0x3ae59fdf, +0x3b4c8166,0xbad9c07c,0xbb88ee64,0xbbc2f128,0x37d797e4,0xbb68404a,0xbbb5b60f,0xbbb8c41d,0xbbba5fdc,0xbbad33d5,0xbbc3efcd,0xbbc51c56,0xbbaf78d4,0xbb703297,0x39e90172,0xbbaa8daf,0xbb89c32f,0xbb7a0abc,0x3b4c5a0a,0x3b6a103a,0x3b3d507b,0x3b08fb81,0x3acfb242,0x3ace7c8a,0x3b0b4291, +0x3b4cf50b,0x3b63f0e1,0x3b452481,0x3b72a006,0x3b8d389d,0x3bab7c82,0x3b8a2275,0x3b579a1c,0x3b12898d,0x3abe2ca3,0x3ac17486,0x3a414bc9,0xbba69f12,0xb99a7de1,0xba525386,0x392772c5,0xb8acb469,0x39b5a278,0x3a98f666,0x3a46a229,0xba814afa,0x3a0a6ac2,0x3aab703a,0x3a885b58,0x3a45d9fe, +0xba3b7096,0xb8a7af65,0x3b145367,0xba2b7133,0x3aec1ad8,0x3b88d9da,0x3b2913ef,0x3adfac65,0x3a436c6b,0x3a8c4d50,0x3b121435,0x3b96730d,0x3bae91cf,0x3b8054cc,0x3b9bac66,0x3ba420eb,0x3be14a49,0x3ba31c51,0x3b731513,0x3b0aeda0,0x3a92ed86,0x3ac55a7d,0xba87ba4d,0xbb445170,0xbab763dc, +0xba6474c1,0x3ac6938a,0x39169620,0x3a6b8442,0x38ee6424,0x3af87c01,0xbaae3416,0xb94f5875,0xbac8e08c,0x3a9b4736,0xba002e18,0x3996d19a,0x3a161104,0x3a87e25a,0x3a99f738,0x3b7f366b,0x3bdd85cf,0x3ba082cc,0x3b4d171f,0x3a548a4e,0xb89afe56,0x3a8441b8,0x3b93419c,0x3bb7af5f,0x3b840a91, +0x3bd09799,0x3c17b893,0x3c4a315e,0x3c0cac8b,0x3ba370dc,0x3abd04d4,0xba7d2f36,0xba99fa3e,0xbb449ab7,0xbba8eaae,0xba7ef427,0xbb38de74,0x3b0802de,0x3b370dc4,0x3b312cda,0x3b2c6b75,0x3afacdbd,0x3b7313a8,0x3b5d006d,0x3b5ec89c,0x3b8da467,0x3b072d84,0x3a82914b,0x3b2b6abf,0x3b5c09bf, +0xbbf6f33a,0xbb2e5ad2,0xba28eda8,0xbb01e056,0xbb26c4c6,0xbae9de76,0x3a8ec086,0x3c165c4b,0x3c1195c4,0x3c26075d,0x3c5efd1f,0x3bbaf788,0xb915ef21,0xbb3b6620,0xba99db0a,0x3af73c86,0x3be5e065,0x3bf518db,0x3c0f9ed2,0x3b7205a9,0xb95d5785,0x3b726ae9,0x3b50fe31,0x3a70d83e,0x3926805a, +0xba805a7d,0x3b97ba59,0x3ba32569,0xb8fc7a0c,0xbaa743a8,0xbb86243b,0xbb9e1265,0xb9e30097,0x3ac4abf3,0x3b095a52,0xbb7d2fb6,0x3a93f870,0x3be64af5,0x3c1ee582,0x3bc80d13,0x3b6c747f,0x3c057af9,0x3bfdf45f,0x3b3191a4,0x38eb4482,0xbace9b6b,0xbad29ffb,0x3b8d2c9e,0x3bdaba83,0x3b6f3da9, +0x3abeb00b,0x3a1e21fc,0x3b1947d8,0x3a3f5640,0x3aadf94a,0xbb269f25,0xbb0a1936,0xbaa3f144,0xba93ba36,0x3974510e,0x3a7edb6f,0x3aba05c8,0xbaa4ef1b,0xbb48abf1,0xbb2828f8,0x3add6837,0x3b57b56b,0x3b04b3c2,0xbb1b3175,0xbbcc139b,0xbc196f0d,0xbaf4c01f,0xbbbf10fb,0xbc8f83b8,0xbc7fc43e, +0xbc216adb,0xbb2f2959,0xbb87076e,0xbb3a5a2c,0xbab1663a,0x3c683f2a,0x3c858a26,0x3bdb3c6b,0x3bf0ecfb,0x3bc7344f,0x3bb8b013,0x3bd40b30,0x3bbaa53e,0x3b667aa3,0x3b543e8a,0x3b6e3091,0x39335eec,0x381bec43,0x3a920bb8,0x3a726624,0xb70d6cc6,0xba7b95e6,0xba657754,0xb9939eb3,0x3a3efabe, +0x3a8c8638,0xba6211b7,0xbb2d47ee,0xbb92c09b,0x39ea306f,0x3b1183d4,0xbb5d2112,0xba921dd0,0x3b95e64f,0x3c0624dc,0x3c23d8c9,0x3c02f2ad,0x3c1f9a4e,0x3be6941f,0x3ba4647c,0x3b20c655,0xbae737be,0xbb0d8cb8,0x3ad3afce,0x3b5d16a2,0x3b8e521a,0x3ba09af5,0x3b5f392d,0x3b1a6ae2,0x3a3239c8, +0xb9370657,0xba4b7152,0xbb262ed5,0xbb8bd81c,0xbb4a155c,0xbb0f6575,0xba4fa292,0x3897dd9b,0xb9bda29b,0x392ce509,0xb9ce2236,0xba94e73c,0xb96d61dc,0x3a039e7f,0x3aa67fe7,0xb924f020,0x3aae0188,0x3b740f48,0x3b6d8742,0xbbef9450,0xbbedfa46,0xbb67cc6b,0xbb2a08c5,0x3ab46795,0x3bd17916, +0x3c18d3b5,0x3c15cb61,0x3c16d983,0x3c119363,0x3c15c8b1,0x3be7ce1e,0x3bbdf535,0x3b9949e3,0x3b38d6cd,0x3add0ae4,0x3a95039b,0x39d3198d,0x39437746,0xba07334b,0xbb37f394,0xbb2161ff,0xbb46aa75,0xbb4cb4b5,0xbae2ec21,0x3a05bbd6,0x3a3c9593,0x3ab86e2f,0x3a4a8018,0x3b065043,0x3ae34325, +0x3ab3ca4a,0x3ab6ecf6,0x3a5ea3c0,0xba450dab,0xbae6657b,0xba41f150,0x3b4d9d18,0x3bfffe00,0x3bf77d99,0x3c06b352,0x3bdda5fb,0x3bc2ab5d,0x3bb65c18,0x3b48a5ca,0x3ab793bf,0x39d4fb32,0x39ce7d7f,0x39de288b,0x3a36c99e,0x3ac438fe,0x3ae5c4a6,0x3ac59c41,0x3aa25257,0x38b4cbb4,0xbb121bbb, +0xbb1f860b,0xbb19ec54,0xbb18820a,0xbb056454,0xbb098ccb,0xbb1c8ff4,0xba9d1a19,0xb839f9aa,0x3b06dd1c,0x3b3f0662,0x3b6dee60,0x3b7e4ace,0x3b8d3ab3,0x3b950053,0x3b604a79,0x3b5e0623,0xbb91a206,0xbb389afc,0xba8284f7,0xba1373d2,0x3a9cdaca,0x3ac01c56,0x3ae84d89,0x3b06471e,0x3ac70526, +0x3aad24c9,0x3a526387,0x3a5d5ab0,0x3a5086d1,0x3a25e337,0x3a11697e,0x3a0fa219,0x3a5b60ee,0xb877e176,0xb93555c6,0xbacabf74,0xbb2e8ea8,0xbb22e2e5,0xbb2038f9,0xbb18973c,0xbb2cd587,0xbb24cac4,0xbb3fbd22,0xbb099b05,0xbb5e2159,0xbb40a61f,0xbb814f8a,0xbb74f378,0xbb9401d8,0xbbb89361, +0xbbde95aa,0xbba220a7,0xbb62eb08,0xba48abe2,0x36d8a30a,0x3a05126f,0x3a88038f,0x3ad2730d,0x3b19eefa,0x3b508711,0x3b44b3a8,0x3b3862f8,0x3b296910,0x3b0f98ce,0x3adff475,0x3a9bef75,0x3a7bae76,0x3a2845d8,0x39d0880a,0x39178a4d,0xb85817e7,0x37ce5139,0xbab94d27,0xb9f4d4a8,0xba7e90eb, +0xbad65bfe,0xbb0e8900,0xbb006818,0xbaf42a00,0xbb14b89b,0xbb474a32,0xbb199e45,0xbb181170,0xbb48d143,0xbb1fcc43,0xbb2740ee,0xbb0e03ac,0xba919f6a,0xbb2bb3e2,0xba135f79,0xba60da11,0xb9ed9ff7,0xb909b24b,0x397139bf,0x3a07f2f1,0x3a7a0e97,0x3a2ea83a,0x3a0dc79f,0x39dbbf34,0x39a772b5, +0x39883384,0x392e0e10,0x38d8d61e,0x37e36391,0xb8943234,0xb8ae801a,0xb98ae474,0x38c1a6e1,0xbae54808,0xbb623a25,0xbb998e9a,0xbae01b4f,0xbb8058e6,0xbbb0d0c3,0xbbb488a1,0xbbb30b45,0xbbaaad00,0xbbb680a9,0xbbb68f4c,0xbbb7a100,0xbb925f3c,0xbb19bf67,0xbba71b77,0xbb8dd231,0xba298184, +0xba5b0507,0x3b3afb35,0xbb07bcca,0xba0fddc9,0xba27d9a8,0xba0bc2ad,0xba55c505,0xba70f30f,0xba9739d3,0xba2c69d1,0xba17e720,0xba74a6dd,0xba22fb6f,0xba03b40a,0xb889f99d,0xba1d70a4,0xba59bea4,0xba94dd68,0xba9380c0,0xba852e6b,0xbb0c28a7,0x3b27745a,0x3b872704,0x3b5a7e08,0x3b0ee675, +0x3b90bb77,0x3b62a146,0x3b80cbbb,0x3b7dd9ff,0x3b44df01,0x3b77b242,0x3b808c21,0x3b8ad898,0x3b82f5e8,0x3ac1dc58,0x3b7b7c96,0x3b9cd856,0x3ba4b2f5,0xb96068e2,0x3855a202,0x3a44a17a,0x3a1fca53,0xb8eac28b,0xba0be841,0xbaa18bcf,0xb9adf7bf,0xb9a80636,0xba8a8c9f,0xb948774d,0x39c46050, +0x3ab9e457,0x3874309b,0xba361224,0xbadf6aac,0xbadd9d35,0xbb23da49,0xbad0b72a,0x3b14ae1f,0xb9c3bd0f,0x3a8b4cb7,0x3ac0e1de,0x3b04f617,0x3a3462d9,0x3a195408,0x3a3931f6,0x3a8d2b59,0xb98e05ca,0xba4e8aaf,0x3ab6cbf7,0x39aab219,0x3acb6b2f,0x3b39cfff,0x3a0a76f5,0x3b424a2d,0xba0941e8, +0xba2b0b75,0x3a7b0347,0x3a35955e,0xb8e2befd,0xb9bc6d49,0xbb0d9f3c,0x3a15e3ab,0x3a5d87e3,0xba892327,0x3a2aa697,0x3a986a59,0x3b7182f3,0x3a42d39a,0xba09d513,0xbb1a7abf,0xbb143a83,0xbb6d19d0,0xbacc13ff,0x39d4e404,0x38e30b8b,0x39f3c30e,0x3af87f73,0x3b37da61,0x39aa4ae0,0x3b103532, +0xba42e4cb,0x3990abcd,0xbb0110e8,0xb797462e,0x3ab25276,0x39b9a99f,0x3a9a984f,0x3b62e9e8,0x3ae92844,0x3b95922c,0x3a6ca6b3,0x3b182e76,0x3b98331e,0x3b86b677,0x3b3f81ac,0x3aca3efd,0xbb04c539,0x3aa7843b,0x3a7c7236,0xbaf37d0d,0x3ab57545,0x3b921e94,0x3c04bea0,0x3b6a2ac4,0x396065b3, +0xbb5a0168,0xbb87e70c,0xbbcf8bc1,0xbb944f9b,0xbaeea810,0xbb4bb97e,0xb9832e2c,0x3ac8a0ec,0x3b013fa2,0x3aacff54,0x3b094ae0,0x3afd127e,0x3a9fbc01,0x3b1f9893,0x3ae14be5,0x3b58d419,0x3a24e90d,0x3a887d3f,0x3b47e4c6,0x3b280985,0xb9e447c5,0xbb8ef559,0xbc0e8584,0xbc014fc3,0xbbf78bf9, +0xbbdeafa3,0xbb84f220,0x3b30ed5e,0x3a3baa3f,0x3ab7232c,0x3b94969e,0xbb456c9c,0xbc02976a,0xbc110292,0xbbcbc3d1,0xbb365050,0xbacfb87f,0x3b0b5ba5,0x3b3cebec,0x3ba056cd,0x3bb3d154,0x3b113633,0x3b6541ad,0x397f75f2,0x39b2894a,0xb9bef9d2,0x3b7d2ce1,0x3b8d0a09,0xb92d46c2,0xba8ef53c, +0xbb764004,0xbb776469,0x3914012a,0x3b5f6a75,0x3b7cc3ae,0x3a222f64,0x3bb06dc2,0x3b7b9cdd,0x3b2dadf2,0x3b48e617,0x3ae0c51c,0x3c1ee4f7,0x3c334e67,0x3bac83e8,0x3a2c8da3,0xbb3ba4a3,0xbb684bfa,0x3b804ad9,0x3bee3639,0x3ba69f7b,0xb9a644a2,0xbb323d57,0xbb10b42c,0xba9c048f,0xbb006c15, +0xbadd6a0e,0x39f7ba27,0xb9a2c8c6,0xb9f1541f,0xba9f7907,0xba1b5dbc,0x3a804880,0xbae45e34,0xbb52d1fe,0xbb174423,0x3aa25589,0x3b3c6f94,0x3a22f7ee,0xbb3c4bde,0xbbfe4534,0xbc06fc38,0xbb1b6b95,0xbbb4df78,0xbcb15ec0,0xbc83491f,0xbc1a2972,0xbb9584e3,0xbbc6a6dd,0xbbfa8b72,0xbc2d0146, +0x3b64bcf5,0x3bd5c50d,0xbad1ee89,0xbb2120b2,0xbb729a1e,0xbb3463ea,0xba9df6b2,0x3a36e767,0x3aca6151,0x3b005130,0xb9b6c5b3,0xba73e228,0x3a17b3b5,0x38e937d5,0x3b0045bc,0x392704ff,0xba8199cd,0xba98ae8f,0xb9c33f49,0x3a0901cf,0x3a4911bd,0xbaa02304,0xbb2caa36,0xbb74e51d,0x3b0bcb44, +0x3b2b1fe3,0xbb09aee8,0xba4e3bea,0x3bedc22a,0x3c40832d,0x3c261493,0x3bfcdb5a,0x3b8ee9de,0x3b422470,0x3af0d67f,0xbaf8502c,0xba7361d5,0xb9597114,0x3b430911,0x3b936d8f,0x3ba4a301,0x3ba33898,0x3b224163,0x39f78f6d,0xbb1abafd,0xbb423c93,0xbb7f96f4,0xbb4de4cd,0xbaf5bdfe,0xbb35677e, +0xbb0cb3f2,0xba256ec5,0x3933797f,0xb923374f,0xb974e8f3,0xb99b6192,0xba87357d,0xb90ccba1,0x393b2132,0x390b53b5,0xb8285c4f,0x3a0b0de5,0x3b752d8e,0x3b6ae880,0xba725822,0xbb689716,0xbbddd7ca,0xbba40904,0xbb43ea8c,0x3b49c3ca,0x3bb18ecc,0x3b91f131,0x3bd031e7,0x3be64004,0x3c0dd3f7, +0x3beac638,0x3bc3ace1,0x3ba6ae57,0x3b4972ed,0x3ae78838,0x395e924b,0x39e967ad,0xba6e95bb,0xbaf5146f,0xbaaf12c9,0xbb51ea86,0xbb587f56,0xbb483743,0xbaf90b51,0x3a004d3c,0x3a234dbd,0x3a157d6a,0x3aa2b7f4,0x3aec18cd,0x3b179e38,0x3b26d73d,0x3b0082d9,0x3ad8ce8a,0x3abcc61b,0x39dd546e, +0x3be45a07,0x3bc1bb3c,0x3bb6bf22,0x3bca4056,0x3ba3a1f8,0x3b28389f,0x3a521e81,0x38c15e36,0xb8df23c5,0xba108a48,0xba8e3764,0xba8f49a6,0xba45508b,0xb941c377,0x3a13902e,0x39d47a20,0xba45193d,0xba99fe13,0xbaed5ad2,0xbb0695f2,0xbb06bc09,0xbb03c495,0xba2555a6,0xbae60d00,0xbb1974ab, +0xbb1e7d26,0xba9c7de7,0x39e12b10,0x3ac0150e,0x3b3a7902,0x3b72d9eb,0x3b7e2b0a,0x3b97ae08,0x3ba74fc6,0x3baa933e,0x3bb00bc9,0xbb254e85,0xbb681b4d,0xbb6bc005,0xbb05148f,0xba457192,0xb97bf76b,0xb97f98d1,0xba201e11,0xba4ea644,0xba55733c,0xba6a608e,0xba5834a9,0xba53020b,0xba2ac98a, +0xba71cff1,0xba701074,0xba603d25,0xbab14055,0xbb20177d,0xbb12e1e0,0xbaaf0773,0xbb0aa7e5,0xbb2a2a71,0xbb3151a3,0xbb174d3e,0xbb42fd70,0xbb0fb162,0xbb3cb9e4,0xbaec60a5,0xbb370f4a,0xbb1bb636,0xbb389442,0xbb494f45,0xbb61209f,0xbb647a2f,0xbb5d2330,0xb9663a75,0xbaeac50d,0xbacf5905, +0xbaa67f7d,0xbaab7ff1,0xba9c3c0a,0xba5790ae,0xb9577688,0xb92d3a3f,0xb93f17a4,0xb955ae16,0xb95930f0,0xb90a9613,0x39088439,0xb98fb532,0xba31182c,0xba90da9e,0xbab00e78,0xbad6fd11,0xbafeed09,0xb9658633,0xbad4be19,0xbaaea78f,0xbac545e8,0xbaae1c5f,0xbaff6a3d,0xbb24d1ec,0xbb1da713, +0xbb04829d,0xbb4a92d5,0xbb735fc6,0xbb60ab43,0xbb5137be,0xbb13cee4,0xbafbf328,0xbb224f3b,0xba7683ab,0xbb597483,0xbb2fbe8a,0xbb2887bc,0xbb18c1b5,0xbb05e44d,0xbaf70b0c,0xbae2415d,0xbaf52ade,0xbaf5c08c,0xbaf3589a,0xbaefdc44,0xbaf04d41,0xbaead7c0,0xbafd4074,0xbb01f98a,0xbb0723c5, +0xbb0d08b4,0xbb0c0952,0xbb370493,0xba11aade,0x3a14002d,0x3a20b960,0xba912767,0x39fb473a,0x39fa776b,0x39f361fe,0x39610087,0xb98bc17a,0xb80a3147,0xb8f5ab4f,0xba012719,0xb9d2466b,0xbaf1daef,0xb9a4cbe0,0x389328d8,0xbb39b686,0xb9963a27,0xbb5787a9,0x39c675fc,0xb8c63ab7,0xb9310d60, +0xb944e559,0xba51d25f,0xba6ca5ac,0xba4e380c,0xb9988aac,0xb9068435,0xb9c18f79,0xb9155e31,0xb893e17c,0x399397a6,0xb81e1feb,0xb9493876,0xb9f78d7a,0xba090ac7,0xba11d545,0x37c6b89b,0xbb654258,0xbb6929cd,0xba2f5247,0xbb25e94f,0xbb5888a2,0xba80ab44,0xba9d47d5,0xbab8711b,0xbac2b66f, +0xbb091c59,0xbb0b968b,0xbacdc02f,0xbb7135a5,0xbb2c12fd,0xb9e196d0,0xbb6c885e,0xbb1b058f,0xb9daeeed,0x3aa3f40c,0x3a1e53cd,0x39fd56ab,0xbac79042,0xbb0b28d1,0xbaeaabc8,0xba340c50,0xb99238b6,0xba529c16,0x3909c6fe,0x3a5ab495,0x3aeb34ac,0x3a6e8438,0x371ccb23,0xba8ef260,0xbae2af52, +0xbab913f0,0xbb186238,0xbb5c9e7c,0xbac5d740,0xbaeead99,0xb9dbd32b,0xba081539,0xbabf923f,0xba33f264,0xbadc3faa,0xbb48ae72,0xbb10050d,0xba9dfce4,0xb9e4dd31,0xbaa3cdfd,0xbac3d930,0xba4ba6c5,0xb9df2ba1,0xbb25aead,0xba7c3a22,0x3adea08e,0x39f6b273,0x3a563dce,0xbb38f992,0xbb7bbeb1, +0xbb53291f,0xba1f0bcd,0x39c484bb,0xba6e65d8,0x39c53c16,0x3a49f3a6,0x3b2b8ff7,0x3a80d401,0xb9212d19,0xbaf06077,0xbb13a64b,0xbaf06f4b,0xbb3e2835,0xbb6b21d0,0xbaf11031,0xba0e5dd6,0x3a4abfe6,0x38a84bb2,0xb9dd00fb,0xb8b5d3eb,0x39373595,0xbb527f96,0xbaf7b53e,0xbb338319,0x3885a581, +0xbad6ec67,0xba708ae2,0x3a22ad0b,0xba81b731,0xba16ae48,0x3a77ee33,0x3ba0f097,0x3b775849,0x3b73408b,0xbb213ade,0xbbaed6cf,0xbbaeb006,0xbae39050,0xba2727a1,0xbb0bed79,0x3a211d85,0x3b64ac1d,0x3bdae7d3,0x3b64bdc5,0x378e6826,0xbb719082,0xbbab2670,0xbb99d5cf,0xbbb34064,0xbba55d0a, +0xbaa8674a,0xba7aff4b,0x3b15731e,0x3b3c078d,0x3b08a75c,0x3b26c3d9,0x3ae3cdcf,0x3a9a85b0,0x3aaf78d6,0x3ad0015c,0x3b55757b,0x39b7aeee,0xb9dea5c2,0x3b55653f,0x3a8f75ad,0xbc17b799,0xbbd34167,0xbbcd9cee,0xbbe9cb07,0xbbc6b9fe,0xbbe0ed80,0xbbb166ba,0x3a38c04c,0x3b16ab8b,0x3bad0312, +0x3c1ac72e,0x3b6816f5,0xbadded53,0xbb6c89a5,0xbb722018,0xba55255b,0x3b8f6dff,0x3b9b0141,0x3bbdf155,0x3b4958cc,0x3ac251d9,0x3b5c8fab,0x3b2b432d,0xb990c5f6,0xba2e58c9,0x37cc36de,0x3b579e37,0x3b7043a3,0x385270f3,0xba9e7c7b,0xbb6b7f18,0xbb8879c2,0xb9250d36,0x3a7f769b,0x3a380f0a, +0xbbc98574,0x3b1f277f,0x3ba6e144,0x3c09664d,0x3b50fd41,0xb880a024,0x3bb9cbed,0x3bda0304,0x3b1510f0,0xb987e0b3,0xbb3d7d4c,0xbb822e02,0x3b0156af,0x3baee3f8,0x3b994f04,0xb9926b71,0xbb5ab1e2,0xbb835eda,0xbb7efaf3,0xbade420c,0xbb327605,0xba4a4147,0xba1da6d9,0xbb0806ab,0xba56ed55, +0xb9a2590b,0x3a676ef4,0xbaeaa2d0,0xbb46e1e2,0xbb002ef5,0x3aa37a5c,0x3b15f088,0x39ac652b,0xbb8a44ee,0xbc00e005,0xbc159bd4,0xba7a3fb6,0xbc064220,0xbcc8fcb2,0xbc7cc284,0xbc1dd44f,0xbc2db13f,0xbc52dd91,0xbc691dd3,0xbc84fb05,0x3bb51f06,0x3c385951,0x3aa09abb,0xb6db4301,0xbb2ea8dd, +0xbb41c2b6,0xba63ed84,0x3a9b8db9,0x3b08f5a4,0x3b0a1c3f,0x3b0cbdd4,0xbad759f9,0xbac60487,0x38f4ca42,0x3a14e0b6,0xba4d5079,0xbabb5559,0xbabbd860,0xb871abd2,0x3a8604f5,0x3a326071,0xbab74927,0xbb332852,0xbb744d96,0x3aa2dab1,0x3b3b1b8d,0xbb98bb18,0xbaca0e5b,0x3bfdb393,0x3c46aabe, +0x3be9840e,0xba317eb8,0xbbac21a6,0xbbba9bca,0xbb869b7f,0xbaca9e42,0xbb909f1b,0xbbaefba7,0xbb608c40,0xb9790d6d,0x3ad1f2c8,0x3b3f4545,0x3a6bb2c8,0xba2ff7fc,0xbb10a0e7,0xbb39185d,0xbb1dc733,0xbb4f37ba,0xbb6fef04,0xbb4525a1,0xbb01b28d,0xba3e1ecb,0x3820a110,0xb8778c9d,0xb81d4ee0, +0xba2c2664,0xba7411b6,0x391816a3,0x39f86815,0x3a83e416,0x38e6e97d,0x3a50f701,0x3b492964,0x3b9bacb4,0xbbd28ac1,0xbc2ea05b,0xbc62e8ce,0xbc53603d,0xbc0ba9ca,0xbb84c258,0xba325075,0x3a863321,0x3b444c50,0x3b7370e3,0x3b49d334,0x3b42035e,0x3b30ba1a,0x3b22ffce,0x3ae382fa,0x3a91422a, +0x39fcaf35,0xb9a111e0,0xbaa94f5a,0xbb3caae5,0xbb856a78,0xbb7747c6,0xbb63435c,0xbb46726f,0xbae59d22,0x39df9c96,0x38e20d57,0x39e778f7,0x393ce12c,0x3aaa01f1,0x3a9a83a3,0x3a90896d,0x39a61f05,0xb9569989,0xb9e3f423,0xbb78f5bc,0x3b4e1044,0x3b11b2db,0x3b95017d,0x3b96532d,0x3b9fe30a, +0x3b771441,0x3b434f4c,0x3ace6db9,0x3aca7c53,0x3a8a62e8,0x3a0f34d9,0xb9d5f749,0xbaaf1268,0xbadc5bfc,0xba980b64,0xba60c901,0xba1ca709,0xba30bb50,0xba5db17a,0xbaea8737,0xbafb2c9c,0xbb0291b4,0xbb23add9,0xbb2ba85c,0xbb1fc211,0xbb144031,0xba3bf084,0x3a3db7e6,0x3b2829cc,0x3b569c20, +0x3b7621fc,0x3b72b6c9,0x3b8a2d8e,0x3b88bcaa,0x3b7fded0,0x3b53869f,0xbba71511,0xbb823ad7,0xbb2012bf,0xbafcbed3,0xb9d05a6e,0xba1c9ae6,0xba5401d0,0xbaa0996b,0xbadc79a0,0xbaf9806c,0xbb048b45,0xbab2954f,0xba34e65a,0xb91ff621,0xb9c18fbe,0xba071c2f,0xb9e4a3d4,0xbaabba39,0xbad36ea1, +0xbb3ae635,0xbb6775d0,0xbb4fc9b1,0xbb4793d7,0xbb3c4a6c,0xbb40da0e,0xbb418059,0xbb3ba8d6,0xbb193c35,0xbb48c4d6,0xbb1d99d2,0xbb3a7465,0xbb27a96a,0xbb64c86b,0xbb9a68b4,0xbbba99f0,0xbba0b4e8,0xbb4132a9,0xbb31bfb9,0xbb048317,0xbafec8eb,0xbade0f1d,0xbab4de30,0xba518b21,0xb95db2c1, +0x39546bd8,0x3a0b05ec,0x3a30d41a,0x3a3d09ae,0x3a157ee2,0x39e4ebbc,0x388ada3a,0xb9878ae4,0xba0acc5a,0xba5021f0,0xba56c3c0,0xba990e9a,0xbb0a57d6,0xbafcab40,0xbb33be54,0xbb341d2d,0xbb5a03a5,0xbb6cbb7c,0xbb6902f3,0xbb86420f,0xbb921311,0xbb880517,0xbb8336ad,0xbb8f1e55,0xbb7fc46c, +0xbb695995,0xbb653990,0xbb3bd9e7,0xbb88f267,0xbb22f4b1,0xbb212e5b,0xbb13783c,0xbb021d3c,0xbae53aa6,0xbad0ec48,0xbaba639c,0xbabaf949,0xbab5a5f1,0xbaaabd7f,0xbaa2fbe7,0xba9657e2,0xba853116,0xba963a11,0xbaa283a3,0xbab0d64a,0xbabf08f6,0xbad3e594,0xbab83215,0xbb5b1f9a,0xbb7ed343, +0xbb2bd516,0xbb6c72bd,0xbb8eac8e,0xbb40d7bf,0xbb5081e5,0xbb56db69,0xbb530a42,0xbb6e8080,0xbb75e706,0xbb80ac39,0xbb9c376a,0xbb89dd44,0xbb45317e,0xbb924054,0xbb1dafbe,0x3b083506,0x3b68b336,0x3adc2ccb,0x3af4346f,0x3b0a7ab7,0x3b031a02,0x3b115354,0x3b14b0b2,0x3b0556ec,0x3b26aa46, +0x3b284b2f,0x3b079c6e,0x3b1ab6bc,0x3b218518,0x3b3cf2bb,0x3b24adf7,0x3b17d4b4,0x3b02d198,0x3afc0536,0x3ad24eef,0x3ac7221c,0x3b562e15,0x3b124c50,0xbaf0d4de,0x3b7c95bc,0x3b34368a,0xbad1b73d,0xba965f17,0xba9ceb29,0xbae1ce21,0xbaa074be,0xba8b1fa5,0xb9ee8013,0x3b1bf441,0x3b676b92, +0xba996260,0x3b241657,0x3ae0c300,0x3b47499a,0x3b2a384a,0x3b56dcc2,0x3b41a033,0x3b607612,0x3b669b5f,0x3b39322f,0x3b7de0b5,0x3b735bed,0x3b27ac89,0x3b5724af,0x3b7f2271,0x3ba68e78,0x3b8e9241,0x3b74f6b2,0x3b2d85d9,0x3b09c545,0x3a85641d,0x3abc2732,0xb966c330,0x3a9359cb,0x3b2c9192, +0x3b0e6ba8,0x3b0f5174,0x3b053399,0x3b073732,0x3b1444ba,0x3ab55dbf,0x3a92facb,0x3a54443b,0x3b0710f2,0x3aacdbd3,0x3aa8b157,0x3b50599b,0x3b269561,0x3b36d86c,0x3af83d71,0x3b155dd3,0x3b63b5dc,0x3b40f863,0x3b8a1102,0x3b9fbbed,0x3b527f1c,0x3bc89e9d,0x3bc6dba5,0x3b6b92c6,0x3ba135d0, +0x3bae0c29,0x3c0000ef,0x3bc4d640,0x3ba25c41,0x3b44a0cc,0x3b096048,0x3a557170,0x39792fe4,0x3a271698,0x3a860e63,0x3b01aa67,0x3b401633,0x3b2e48da,0x3a904f16,0x3ad07c58,0x391929b8,0xba7dd550,0xbb0b0d6d,0xba8f1279,0x3ac0022c,0xb8386ab7,0x3a82d2f6,0x3b6d77c1,0x3b1b2cd4,0x3b5fd1c1, +0x3b4abdb8,0x3b8c943e,0x3bc636ee,0x3baf4241,0x3be8ce68,0x3bf41a00,0x3b91afa1,0x3c01fa94,0x3bed7c3a,0x3b5d790b,0x3bbf9d68,0x3c11fbe9,0x3c58891d,0x3c35aad7,0x3c071247,0x3b8b0960,0x3adaac08,0xbabc2b6e,0xbb20ef32,0xbb254cdd,0xba8da9bc,0x3aa66de6,0x3b4e972b,0x3b41f11e,0x3ac0ff6b, +0x3b20b77e,0x3ab7ce14,0xba58143d,0x39fb9c44,0x39ac121c,0x3b16457a,0xb9af83ee,0x3a12713e,0x3b88a7ba,0x3b5469b5,0xbafd67d8,0xb9c51813,0xbb4eee33,0xbb135ff3,0xbab91389,0x36c276ba,0x3b200327,0x3c0dac8c,0x3bedb487,0x3c030528,0x3c2b3eb7,0x3b7ee162,0xbb1e4a97,0xbbcd785e,0xbba5932d, +0xbad5dd40,0x3b12cde8,0x3bc4edcb,0x3c08e530,0x3c11cf79,0x3bcc726e,0x3b8e53a1,0x3b6fd73d,0xb87ab370,0xb974dcfb,0x3a284e3c,0x3b2d0f12,0x3b47e736,0x38864698,0xb9e0f729,0xbb2685c4,0xbb1a8b93,0x3a952e8b,0x3b439d05,0x3b289927,0xba5d1b11,0x3c0348e8,0x3be428c5,0x3b93ba13,0x3b1250da, +0xbadaf14d,0x3c1d7f9f,0x3c478e66,0x3bbdb691,0x3b1dbb4a,0xbaff4732,0xbb997b75,0x3aabdcd2,0x3bbc7d31,0x3c05b31b,0x3b6cc8c3,0x3b1de803,0x3b8e8baf,0x3b3bbede,0x3af24491,0x3a1016ca,0x3a8b2133,0x3a1cd687,0xba23091b,0xba2ea28d,0xb9ff88ad,0x3a3db5ac,0xbb01798a,0xbb396f40,0xbac51113, +0x3a8f5a5c,0x3b04a0ce,0xb982687f,0xbb8f34c3,0xbbea4ac6,0xbbcee357,0x3b1ca8f7,0xbc1ccf04,0xbcca3f87,0xbc481744,0xbb1d800b,0x3b8be7c3,0x3b923eec,0x3b4f8772,0xbb010063,0x3c2a5684,0x3c42237c,0x3b32ee3e,0x3b8ccf0f,0x3b7bdda7,0x3b869f7a,0x3b722ad4,0x3b4faad9,0x3ad2746d,0x3b02af25, +0x3a9ea740,0x3a565a56,0x3ac9a7b8,0x3a991a03,0x3b0087b4,0x399d1403,0xba667fad,0xbac3ea59,0x398fe561,0x3aa06948,0x3a2b5d56,0xbaa7b057,0xbb0fad69,0xbb0fa470,0x3b2689e9,0x3b39dd7e,0xbb6ee9cf,0xbb3522ca,0x3c27089d,0x3c78719c,0x3c7225ed,0x3c53ef77,0x3c65c1b4,0x3c21da95,0x3bdae1d3, +0x3a19b3d0,0x384c1af0,0xba12cf76,0x3a6e853e,0x3b84fe6a,0x3bb4abf3,0x3bbddb2b,0x3ba4a4ec,0x3b874d77,0x3b188ca4,0x3a6af687,0xba887667,0xbb03ac79,0xbb133d36,0xbaf79627,0xba859661,0xb8b8e15c,0x3a014772,0x39ef0368,0xb98e81fd,0xb9bb736a,0xba19e263,0x39bd52db,0x39dd7838,0x3a49c779, +0x3a367914,0x3ad2cfc9,0x3b437e35,0x3bb5cbbc,0xbb735ac9,0xba5bbb7e,0x3a696ed0,0x3aff0c6b,0x3b80bc1b,0x3c05ca1f,0x3c226f6b,0x3c105d15,0x3c1dd526,0x3c27c070,0x3c41e6b7,0x3c22b0f0,0x3c0b9bf4,0x3bfe7fbd,0x3b8c6188,0x3b0225d3,0x39b2ae71,0xb9bc9948,0xbaacd4c0,0xbb0119e6,0xbb0b96a0, +0xbb324799,0xbb5d39cf,0xbb2c9fe4,0xbac08e07,0x3a4004d5,0x396bad6e,0x394c9cc8,0x3a79cc51,0x3adb1d12,0x3b06c0f9,0x3b246244,0x3a827de1,0x3a1f0c81,0x39a597f1,0x3a3ebde0,0x3ba444e8,0x3c007e98,0x3c0de451,0x3c037b84,0x3bef60d7,0x3bbf4077,0x3ba5f7be,0x3bb29901,0x3b2d3119,0x3a3b6a8f, +0xb9a962c9,0x39563521,0x3a33a4bd,0x3a83a536,0x3ae4c056,0x3ae09f45,0x39f7e77e,0x38322a5b,0xba4fc89d,0xbaee7c2f,0xbac3c3ec,0xbaa35248,0xba0e19f0,0xbaad8cba,0xbaf792d7,0xbae27cda,0x36bccc0f,0x3acef66c,0x3b279683,0x3b6e7e80,0x3b89050f,0x3b8a3996,0x3b97c8c2,0x3bb75083,0x3bb83e50, +0x3bde5a67,0xbab70f8f,0xbae940f2,0xba948f86,0x392fb908,0x3ac914c0,0x3b013483,0x3b00a399,0x3b02b781,0x3abe6c68,0x3ab43e3b,0x3a846042,0x3a1f2a40,0x38f6a85f,0xb999a2fa,0xba1ed486,0xba5563ea,0xba730e6c,0xba8d3fd5,0xbab8f305,0xbab0e348,0xbacb3e7f,0xbb1628b3,0xbb32a3fd,0xbb2dd0b5, +0xbb2aaac8,0xbb36433e,0xbb243b63,0xbb0699ff,0xbad3b760,0xbad4100f,0xbab355bf,0xba8024fc,0xbabdc163,0xbb078a69,0xbb3147d2,0xbb0556a3,0xbb394de5,0xbae61a9c,0xbab70d00,0xba5cd02f,0xba0bdcb4,0x36f5f350,0x3a437e44,0x3ad4cdf6,0x3a9a2c6d,0x3a32ee1c,0x39887aaa,0xb8fcf3bd,0xb9c24533, +0xb9f71973,0xba44acbb,0xba8935e2,0xbab62d29,0xbad14431,0xbb0415b8,0xbaf9c78e,0xbaaee226,0xbab61096,0xba7c7c34,0xbace7223,0xbab91451,0xbaa04f58,0xbad3afd4,0xbad230d9,0xbb009513,0xbb1e0e3d,0xbb4a2791,0xbb607acf,0xbb4ea3be,0xbb41c3ae,0xbb209637,0xbb1679fb,0xba3ba542,0xbaeb8c55, +0xbad0006f,0xbaa3661a,0xba7fb087,0xba314c3d,0xba0478e9,0xb93e51ae,0xb9f6f7e3,0xba0acc97,0xba1f7876,0xba339856,0xba5242e6,0xba7769ce,0xba883475,0xba9149b1,0xba9d37d1,0xbaa5605e,0xbab1cbec,0xbae0a0b8,0xb9b2586d,0xba29c9d6,0xbb327a88,0xb98c9c9e,0xba1692c3,0xbb46ba22,0xbb46286b, +0xbb4abdb1,0xbb52910a,0xbb4a4de6,0xbb4943bd,0xbb5570be,0xbab840e0,0xba67252a,0xbb601c6e,0xbaadd315,0xba9be864,0xbb0df8c2,0xbb16e6b3,0xbb2a7bbb,0xbad5a7f5,0xbaf49923,0xbacce730,0xbb225b68,0xbb3295cb,0xbb38c9f3,0xbb149871,0xbb09c945,0xbb1a94f8,0xbb061ca1,0xbafeede8,0xbad69077, +0xbafc21a8,0xbb074721,0xbb16ac3d,0xbb1c9351,0xbb0c40ad,0xbb33792a,0xbb1875a7,0xb91a9ecb,0x3b93d2ec,0xbb1cd584,0xb93ad64c,0x3b783a4f,0x3b72ea4b,0x3b61b183,0x3b367777,0x3b3204d3,0x3b348067,0x3b50be1e,0xba40b62b,0xbb48ade6,0x3b91e74b,0xb7495d38,0x3aa1b66f,0xbb302a19,0xba4973c0, +0xba54911f,0xb9ba4cce,0xbb37e476,0xbb72d6aa,0xbb81dd04,0xbb3efa29,0xbb2df5d9,0xbb57e4f1,0xbb185ac5,0xbada29e1,0xba48d082,0xbabde6a8,0xbb0c2d8f,0xbb4b3e50,0xbb65a13e,0xbb63d215,0xbb7cb733,0x38ba13a9,0xbadf7ce6,0xba94fcc3,0x36179f7a,0x3933e367,0xbaead6ed,0xbac62234,0xbb236cee, +0xbb3c679a,0xbb5fff66,0xbb3b180e,0xba51e833,0xbb083645,0xba7009e5,0x3965b5ca,0xbb00ad6a,0xbafc82dc,0xbb2a5ad4,0xba4a23c4,0xba10a371,0x3a061531,0xbb75d4a2,0xbbb154e7,0xbbca6d90,0xbb63f2fe,0xbb29d179,0xbb7bf422,0xbb143f8d,0xbaed17ad,0xb8b55e5d,0xbac687f7,0xbb200397,0xbb8390ca, +0xbb85cd1d,0xbb8f7f3d,0xbb5db650,0xbb15df75,0xba9e7bae,0x39d5e96e,0x3a275393,0x3a81e35e,0xba8bb91e,0x39a8f4e5,0xbadb0596,0xbb5980d9,0xbb5c902b,0xbb38d5f0,0xb99dbbe9,0xbaed5344,0xba933c99,0x3aed2814,0xbac909d8,0xb9e00267,0xba980d12,0x3b20b146,0x3b575448,0x3b95601a,0xbb0a01b5, +0xbbb629a1,0xbbfa9dda,0xbb925544,0xbb83bc25,0xbbbe63f8,0xbb4d0959,0xba03bcbd,0x3b2cfaaf,0x39e37657,0xbb1b5e46,0xbbbb48d9,0xbbdd3274,0xbbe3a51b,0xbbcde8d1,0xbb62175f,0xbae8e986,0x3ac74e46,0x3b1b650e,0x3b26b1b7,0x3aae6909,0x3b04d19a,0x3aa308de,0xbac47722,0xba472ee8,0xba1d6efa, +0x3af38868,0xbab9cf35,0xbaa7d9ee,0x3b7a5548,0xb9e25a41,0xbbe73dd4,0xbc001702,0xbc2bee4f,0xbc2673a8,0xbc0352bb,0xbc1f936e,0xbc181a6c,0xbbb0d51f,0xbb341fe8,0x3a8e257b,0x3ba1a837,0x3ab4675f,0xbb4e2880,0xbba936b4,0xbbc9a575,0xbb7b0b0a,0xb94b85f2,0x3abacf5e,0x3b1b9e79,0x3b655e10, +0x3b941f99,0x3b294ea2,0x3ae56e79,0xbabd3a78,0xba9f6ee2,0x3a8f14ac,0x3ae897ee,0x3b04a24f,0xb843307c,0xba4cc6bd,0xbb1e78d3,0xbb1dc308,0x3a0f481d,0x3aba065a,0x39e0d0fc,0xbbadb130,0x3bb4a134,0x3b5f82cc,0x3b7a5f00,0xb9fda1f2,0xbb55a831,0x3b9c3771,0x3bedbfc1,0x3b669783,0x393e4a33, +0xbb7da00c,0xbbd6e6f0,0xba0be3ce,0x3b76fd7a,0x3bbbbb9f,0xba42cd66,0xbba2e93f,0xbbe25df3,0xbbbc8c79,0xbb6d87a7,0xbabb2a12,0x3a920e3a,0x39ccbcd5,0xbaf59b45,0xbabbd4ba,0xbab69b69,0x3959eb0d,0xbb0766dc,0xbb28037f,0xbab4460c,0x3a11b50a,0x3a9866dc,0xba9b3427,0xbbb1171f,0xbc0e48f9, +0xbbf501a7,0x3a4bd4d4,0xbc43f384,0xbcda47b9,0xbc3f31f1,0xbbbe33a0,0xbc52a960,0xbc803610,0xbc9972ca,0xbcb05326,0xbb4ceba0,0x3b762506,0xbb297d67,0xbbc240d8,0xbc155671,0xbc1007e9,0xbbd5138b,0xbb31eacd,0x3a00571c,0x3a74de93,0x397c70aa,0xbaebc351,0xba9f9bd9,0xb9946b80,0x3a1b6207, +0xba88c80c,0xbac2cd9a,0xbae4c3a0,0x38d3fe9c,0x3a87e3e4,0x39c8b982,0xbacc2e6b,0xbb150e98,0xbaf1c099,0x3ad4ffb8,0x3b0b354e,0xbb8c61a3,0xbba413b0,0x3c32c108,0x3c6b4d68,0x3ba0938f,0xbb9b4104,0xbc527e1c,0xbc40a8b8,0xbc0cfe99,0xbb918a13,0xbb9db445,0xbbb5278f,0xbba8a6a8,0xbac82417, +0x3a2740a4,0x3af5853a,0xb90791b8,0xbb09e4ea,0xbb638288,0xbb888aa5,0xbb6ed6e7,0xbb4b6a06,0xbb0ffcd7,0xbb149978,0xbaa7a2eb,0xb9cbe87a,0x388b3b7d,0x3983e2f0,0xb9afb037,0xba4aabc6,0xba1fd751,0x3983e588,0x398ca999,0x3a0f1b71,0x3a7b4f2a,0x3a4e8070,0x3b228cf3,0x3bc81f12,0xbb65d953, +0xbc15ed85,0xbc85bcde,0xbc78aab7,0xbc4b57a9,0xbc0dbaa5,0xbbc2586a,0xbb7fd36a,0xba1c1bf1,0x3a8b33c7,0x3a1d5879,0x3abea143,0x3acaf08b,0x3ae6d7df,0x3aa0d20f,0x3a315647,0xb983a9a7,0xba8048ad,0xbb2a8a04,0xbb8e0eee,0xbb844908,0xbb908d38,0xbb7804dc,0xbb2ddb62,0xbad71bcd,0x382f1097, +0xb9a09f31,0xb9cface0,0xb91df6a7,0x39ddcce9,0x3a542109,0x3aa86223,0xb97540d7,0xba199b6d,0x3953e1e2,0xbb7480be,0x3bd974e2,0x3b268065,0x3ae22a4c,0x3b0dad7c,0x3af70093,0x3aa8008d,0x3a36ca59,0xba450200,0x3a2d9117,0x3a6749bb,0x3a56a349,0xba03d293,0xbaddcb97,0xbb211d70,0xbb0d36ff, +0xbb09d050,0xbb11c576,0xbb0ad6e0,0xbad464d8,0xba8e9f81,0xbaa68b12,0xbac9c4b6,0xbafd0473,0xbb28bb8d,0xbb191a2a,0xbae17f21,0xb79a7161,0x3ac7cf44,0x3b23ab5c,0x3b48b0fb,0x3b53e86b,0x3b3f8f24,0x3b682809,0x3b64ea65,0x3b837f73,0x3b500f15,0xbb785691,0xbb7d7274,0xbb5447f8,0xbb2752b8, +0xbae3afd1,0xbb081e3f,0xbb264b9a,0xbb5418cd,0xbb58943d,0xbb54a5fc,0xbb396bf1,0xbb0cedc1,0xbab37b0c,0xba248967,0xba8f7626,0xbabd3297,0xbae159a0,0xbb13bfa6,0xbb3c3c35,0xbb5ae392,0xbb4edfea,0xbb4c4569,0xbb51fb0c,0xbb455ea9,0xbb31ba7d,0xbb3eb47b,0xbb169c5c,0xbb157526,0xbaf9f482, +0xbabe7346,0xba88e44f,0xba4cabcd,0xbac848cf,0xbb1fd444,0xbb3e4142,0xbb54878a,0xbb03ccba,0xbb834a0d,0xbb703bbe,0xbb7b004d,0xbb7c4d40,0xbb776893,0xbb646216,0xbb54fb51,0xbb2b5d1e,0xbb0a8afe,0xbae81797,0xbab455b8,0xba92936b,0xba433cf4,0xba91af9e,0xbaaf42da,0xbaced48e,0xbae7f0cb, +0xbae21b2b,0xbb154a15,0xbb01f62a,0xbb37aecc,0xbb5cfa49,0xbb420795,0xbb569e89,0xbb815fb8,0xbb87ede2,0xbb94ded8,0xbb911387,0xbba0aa2a,0xbba341d2,0xbba0e769,0xbb99f5c7,0xbb81438c,0xbb84f51d,0xbb876cb9,0xbb808fb0,0xbb814012,0xbb6712bf,0xbb66f7de,0xbb5deacc,0xbb58ef1b,0xbb57f6ee, +0xbb5b9d72,0xbb4dfaf4,0xbb425db6,0xbb342565,0xbb28d309,0xbb1dd7f4,0xbb0da830,0xbb1859d1,0xbb1dc5bf,0xbb23c157,0xbb2e1b0b,0xbb32e00c,0xbb3e7aa9,0xbb5c02a9,0xbb23cb79,0xb89289a3,0xbb7b090e,0xbb331ced,0x38413998,0xb951bc57,0xb9e728b3,0xba33eb2e,0xba6ca8c6,0xba8d049e,0xbab72451, +0xbb4edc1a,0xbb8efcb0,0xba197f95,0xbb3708a3,0xbb69c0b5,0x3b502981,0x3ac0eeb6,0x3b74ae03,0x3b362182,0x3b4e4e2d,0x3b412801,0x3b510a7f,0x3b56ef08,0x3b4fb4ab,0x3b6e5437,0x3b710269,0x3b53e376,0x3b6297c3,0x3b674d28,0x3b7c7d4a,0x3b7145da,0x3b68b7a0,0x3b57cec6,0x3b4c3cdd,0x3b2b197d, +0x3b621515,0x3aa64ba8,0xba937ffe,0xbb996dab,0x3b28aaf1,0xba1e2e98,0xbb981f45,0xbb938db2,0xbb96e179,0xbb98f7b7,0xbb9decec,0xbb9a6de5,0xbb8045e2,0xba7065cd,0x3b2a4eca,0xbb86da0c,0xbaa7ee4d,0xbb0aa053,0x3b7f0814,0x3b7497f2,0x3b814a4c,0x3b7077ec,0x3b854aa8,0x3b8be147,0x3b819fd9, +0x3ba3e4a4,0x3ba10027,0x3b78eb9c,0x3b8f51bb,0x3ba3b16f,0x3bc7bb76,0x3bc3eedc,0x3bb3e37c,0x3b93bb70,0x3b61c167,0x3b2e1125,0x3b119ce0,0xbb3ae204,0x3aa75a27,0x3b0d80fe,0x3ae02b63,0x3aa5bda5,0x3ad5e5e9,0x3af8fb83,0x3addb9db,0xb840fbcb,0x3a357767,0x3a82ce61,0x3ac21b7e,0x3a75db50, +0x37f27507,0x3aff0599,0x3b2ee8ad,0x3a097172,0x3b21f77c,0x3b84b0e8,0x3b87789a,0x3b7c55f2,0x3b9b1232,0x3baeb13c,0x3b96ee17,0x3bec39c1,0x3bf06f93,0x3bac22a1,0x3bc7ab1a,0x3bd07367,0x3c07cbc1,0x3bfde5e0,0x3be49d07,0x3baead57,0x3b7117c7,0x3b45e665,0x39f77f66,0xba226664,0x3a31574e, +0x3b0fcaf4,0x3b2ee7b5,0x3ac0973f,0x3a7a91dd,0x3950babb,0x39d2215f,0xbb2dc1de,0xbb1afb15,0xbb2c630a,0x3a70b4c1,0xba828a67,0x36b1357c,0x3b27b398,0x3aa9e8f3,0x3a2ea7cd,0x3b6d2f7f,0x3bb579de,0x3bc32d36,0x3bb9e2d5,0x3bd82d8c,0x3be6fffb,0x3bb9a72c,0x3c0ecaf2,0x3c093608,0x3ba64b29, +0x3bd4b17c,0x3c1671d6,0x3c593c04,0x3c5a049c,0x3c3675f5,0x3bf55f4e,0x3b76d63b,0x3aa24960,0xbadbe3c9,0xbb66909f,0x3a0dee5c,0x3b0b2c24,0x3b83743b,0x3b63dbb4,0x3ae97df1,0x3b17511d,0x3a2a49f0,0xbb0d0e7b,0xbac5c97c,0xba8626e0,0x3aaf2bc7,0xbab0f745,0xba0faed1,0x3b956fdd,0x3b1be0fc, +0xbbb500aa,0x39ac21bb,0xb81da15a,0x39e003f2,0x3acb9420,0x3b0ece36,0x3b67430f,0x3c0575a3,0x3c198469,0x3c3da8fd,0x3c62f774,0x3c28ccaf,0x3b7d0b5b,0xbb2b2ddc,0xbb5920cf,0xba798249,0x3b99c1c2,0x3bed5951,0x3c27922b,0x3c12b21d,0x3b9eec25,0x3ba20403,0x3b1d01d6,0xba8080bf,0xba9cc5b6, +0x3ac106fc,0x3ab1c987,0x3ac19540,0xb82e72a2,0xb8ea2c66,0xbaaf7807,0xba680b11,0x3aecbba6,0x3afcadcf,0x3a036715,0xbb7cf9cf,0x3c0c76f0,0x3c03ff0a,0x3bb6efe8,0x3a128a31,0xbb964502,0x3be36092,0x3c249407,0x3ba2c55e,0x3b36d517,0xbae9038c,0xbbcc57b6,0xbad428cd,0x3b516887,0x3c09ca13, +0x3bae4e30,0x3b90305d,0x3bcaca33,0x3b53208d,0x3b4c7f99,0x3ad93dfb,0x3a953f43,0x3a918949,0xba722303,0x3702d26d,0xb9ba4b4f,0x395ce3c2,0xbafd91c6,0xbb0a08eb,0xba7625ca,0x3a35b88a,0x3a676bd5,0xba98f7f5,0xbbbd5f5b,0xbbde672c,0xbb9eafcb,0x3bbbdc45,0xbc73a3de,0xbcca75f5,0xbbf31fe2, +0x3b24c718,0x3ba0bb6b,0x3bbeae61,0x3ba42bff,0x3a6e2110,0x3c2f2321,0x3c4ce38e,0x3bcf373f,0x3be6d4dd,0x3bc6178e,0x3bb98745,0x3b960482,0x3b59a4e6,0x3aae38d5,0x3ae19483,0x3b2f9a2f,0x3af08318,0x3acdfd95,0x3adee51f,0x3a8c953f,0xb922f4f8,0xba726caf,0xbadf2838,0x3a1be9e8,0x3ab6ca18, +0x39e1eac4,0xba9acc33,0xbad00317,0xba0dbcfb,0x3ab772b1,0x3ad3b720,0xbb88e381,0xbbef1162,0x3c4387a0,0x3c7176ba,0x3c51106d,0x3c210610,0x3c492259,0x3c041eb0,0x3badb56f,0x3ab7b410,0xba6c1fc1,0xbb1e28f9,0xbb0bb176,0x3ad35a15,0x3b7c4701,0x3b96eb9e,0x3ba3fee7,0x3b9c4fbc,0x3b8eddd8, +0x3b21b504,0x3a3daef3,0xba9bc278,0xbb28cc30,0xba8fcf8c,0xb7216f47,0x3996fb1b,0x3a080670,0x3a34be38,0xb97a86e5,0xba12a640,0xb9adee49,0x39ceb4f2,0x39f368a1,0x3ab86c00,0x3ae6bdc6,0x3b268ced,0x3b22c599,0x3bf6f948,0xbbcda328,0xbae5a1de,0x3b14e4c3,0x3b2f7eb9,0x3b9462e0,0x3bdf97a3, +0x3c06f8be,0x3c0427f6,0x3c0dabeb,0x3c1a1767,0x3c2495a3,0x3c0f95c6,0x3bf9b619,0x3be712b1,0x3b787cb2,0x3ac487a8,0x39990f16,0xbab3c9b5,0xbb047c87,0xbb2322ec,0xbb6441a4,0xbb36ac94,0xbb6578cb,0xbb0e9ad8,0xba8db0a7,0x39ca2c65,0xb97917e0,0xb92345cb,0x385cfb8d,0x3a5d21a1,0x3a9394d2, +0x3ae54d48,0xb96b6586,0xba276663,0xba8a261c,0xba833ee4,0x3b11f22f,0x3bca45e7,0x3c0111e8,0x3be15d07,0x3bed1df6,0x3bea7216,0x3bf77c24,0x3c0a22cd,0x3ba0706b,0x3b236241,0x3ab0678d,0x3ad3a00d,0x3ad2dbac,0x3a9d53f4,0x3adb4eed,0x3adb6ebc,0x3a49725f,0x3a253ae8,0x37aa3f7a,0xbaa5490f, +0xba8b5962,0xba7860a9,0xbaaaf2bf,0xbaba3334,0xbac11390,0xba769391,0x3a840d32,0x3b1530de,0x3b4c7a55,0x3b688739,0x3b6b2f2f,0x3b61d23a,0x3b6de036,0x3b923f3f,0x3b8ea4bf,0x3bb0cf88,0xba912b98,0xba124417,0x3a43853b,0x3a9f5f9c,0x3b0def50,0x3b115fe8,0x3b0e4379,0x3b2152d6,0x3b01367d, +0x3b04e826,0x3aecb09e,0x3aaa4e30,0x3a471f5d,0x39662bdf,0xb95ee390,0xba317e44,0xba833b09,0xba8923d5,0xba4dd035,0xba9c7a02,0xbb1597a8,0xbb27bdc3,0xbb356398,0xbb22027d,0xbb2e6083,0xbb1b897a,0xbb229c54,0xba90a718,0xbab977fa,0xb9911a37,0xb98563a8,0x3a54879f,0x38a9a7f5,0xba5c05d1, +0xbaf9ab9c,0xba86413c,0xbb9e9189,0xbb12100d,0xbae97313,0xbaa9338a,0xba44da72,0xb8253812,0x3a4209d5,0x3abe33bb,0x3a80c4be,0x39efa525,0x37996dda,0xb9c26497,0xba34d17b,0xba780e5b,0xba8cf021,0xba9d8798,0xbab4877d,0xbac86f79,0xbaf07ab6,0xbacf1170,0xbb1ac8f2,0xbab70b2f,0xbaacff88, +0xbb004d20,0xbb07c491,0xbac54403,0xbad06ef8,0xbaf1a6ec,0xbb3253ac,0xbb21f4c0,0xbb3a8274,0xbb6e615d,0xbb59336e,0xbb6fe287,0xbb570895,0xbb20967d,0xbae377c4,0xba619861,0xba8b8d7d,0xba30d7d1,0xb9f87620,0xb9961b0a,0xb9232911,0x3938ebec,0xb7e5cf31,0xb84c4923,0xb8f2c100,0xb9460174, +0xb998b18d,0xb9e784af,0xba05965f,0xba1b9ca3,0xba334810,0xba41725f,0xba71be08,0xba5f40c6,0xbaa819dd,0xbb2a3194,0xbb9da265,0xba646d0e,0xbb289656,0xbba9637b,0xbbab7d03,0xbba9d07d,0xbba2d564,0xbba78198,0xbba62638,0xbba6c848,0xbb4a1c1f,0xbaa48483,0xbba9f3bd,0xbb57a281,0xb9e31166, +0xbae3d6c7,0x3a1f80a0,0xbb3c93d6,0xbaa55603,0xbab88a02,0xba8667a9,0xbadf3a53,0xbafe2714,0xbb11c107,0xbae1f3e3,0xbad376c3,0xbaf7f08b,0xbacecf84,0xbac016f2,0xba9c5de7,0xbabae6a0,0xbacb81cf,0xbae340dd,0xbaf8ed1d,0xbadd7e6d,0xbb3cbf18,0x3a264e84,0x3b48a298,0x3bb78e81,0x389312fe, +0x3b44a8cc,0x3ba1c45c,0x3ba73e10,0x3ba06cda,0x3b82c103,0x3b915ca2,0x3b95ece2,0x3ba35ca9,0x3b1f98b7,0xba57d622,0x3bb7365d,0x3b5af299,0x3b75882f,0xbb0397cd,0xba60cac9,0xb946a2cf,0x39e339d3,0xba9441a9,0xbaf0962d,0xbb2d45ff,0xbaecf5fc,0xbaeec7ec,0xbb28f44f,0xbaf02841,0xbaa636e5, +0xb9d3a9bb,0xba424b9c,0xba94f3a5,0xbaf8c061,0xbb17049c,0xbb3fdc1f,0xbb2f21d2,0x3b2173ad,0xba1da5f2,0x3a5a2493,0x3a93b995,0x3ab2c3d5,0xba130800,0xba546387,0xbaae7585,0xba8a7dae,0xbb270523,0xbb2bb8c9,0xb82eb9e2,0xbab4a312,0x39940810,0x3b00a248,0xbaab5c0c,0x39642a14,0xbafaf39a, +0xba9b8bc2,0x39da3d5e,0x3abc50ca,0xba887b62,0xbb161863,0xbb8bdccc,0xbaf9556c,0xbabaab31,0xbb2e35e6,0xbaa462e3,0xba539ee1,0x3a5a52a7,0xb95c8b5d,0xba68b0b6,0xbb13509e,0xbb2f5a01,0xbb7dd4d8,0xbb0bd5ea,0xb8f10f74,0x3932054d,0x3ad7a17c,0x3aa3e1cc,0x3b074a2d,0xba51d2fb,0x3a39861a, +0xbb232d79,0xbb1ba1c3,0xbb834038,0xbb1a0974,0x382e066c,0xbaa8bd9f,0xba13a094,0x3b4d9957,0xba0ae6c1,0x3a4ee054,0xba8cd582,0x3aa4398a,0x3b7ccfdc,0x3bb4530a,0x3afe76f4,0xb9a933d9,0xbb82b101,0xbae019b9,0xbb0df368,0xbb8eee32,0xbb21a611,0xb8b8a2ae,0x3b4fab84,0x3b22af58,0x3a2766f6, +0xbb0d58c6,0xbb77fb3a,0xbbbb6bf1,0xbb9cd4c2,0xbac31363,0xbabc67e6,0x3b643713,0x3b3343a4,0x3b1860b9,0x3a5fed06,0x3ab0c85f,0x39d28f74,0xbb6088d8,0xbb262784,0xbb2246f5,0x3a0b434c,0xbb30d0f9,0xbac4f67a,0x3b8707cf,0xb9e28ddd,0xbb55120b,0xbbb26bd1,0xbc1d5735,0xbc06f02c,0xbbd218eb, +0xbbfe1c6f,0xbbfb816b,0xbbb84ee8,0xbb3a9656,0x3a6c2b6c,0x3b6ff62f,0x3b31e3e7,0xbad064c4,0xbbc198b5,0xbbdd6f65,0xbbac30e0,0xbb5d1d3d,0xb925a3bf,0x3a9ca4cc,0x3ba2edee,0x3bd73cb0,0x3afde7bb,0x3a5e66bd,0xbb197152,0xbad367be,0x3af9d65c,0x3a0b7fb0,0x39e5f785,0xb9dad971,0xb9ce5b0c, +0xba85c6bc,0x37cee0fa,0x3ae7b394,0x3b197df9,0x3a29df07,0xbb3d7f49,0x3c1439af,0x3b4329e8,0xb9c9a89d,0xbb449dbd,0xbbbeeefa,0x3b95ff2b,0x3c0655c0,0x3ba94fbd,0x3acbf1c7,0xbb778f66,0xbc097f0a,0xbb2f0bb9,0x3b0f5327,0x3bcfe709,0x3a95b39a,0xbb1ce6dd,0xbb80fca3,0xbb611ac3,0xbb33bc25, +0x3a5dfcab,0x3b27c4c6,0x3ab950b9,0xba59f24a,0xba8eb8de,0xbad76e3b,0xb9e4fe6e,0xbb06f156,0xbaf0a511,0xba65a4bc,0x3808023c,0x38a55553,0xbb21c387,0xbbccf1c3,0xbc098dc9,0xbb98f7a3,0x3b6dafb5,0xbc84a6d7,0xbccd7eb6,0xbbd97143,0x37f058ba,0xbbf6fd19,0xbc086062,0xbc3dc4b4,0xbc804cb6, +0xbbcc1f13,0xba1cf4b1,0xbac1a6f3,0xbbc0c8b8,0xbc0f91cb,0xbc04632f,0xbbe3a0b7,0xbb78234b,0xba2db00e,0x3982de23,0xba0dcf50,0xb95e36d9,0x3a0115a0,0x39170d22,0x3a3240f3,0xba68e2ee,0xba9f6c48,0xbaf454a3,0x39765698,0x3a6a8222,0x395ff945,0xbaa70c17,0xbab9697f,0x3927c2be,0x3a7c99bf, +0x39e385e0,0xbb1d14c0,0xbc1e20f6,0x3c52bc1d,0x3c5c9876,0x3b93c839,0xbb01ac94,0xbbfecb79,0xbc005ede,0xbbcacecb,0xbb8968ac,0xbb399741,0xbb5752ad,0xbb6d7f5e,0xba23e72a,0x3ab4e686,0x3b062960,0x3a6e4447,0xba32d9fe,0xbaca0d0e,0xbb336983,0xbb49e522,0xbb0a2c3a,0xba461bf3,0xba841e11, +0xb8f927a0,0x394b790e,0x396b8a50,0x39e117d2,0xb9fca370,0xba367ed3,0xb9b80674,0x38e02c97,0x381c0514,0x3a191e23,0x3b0ec184,0x3ad71645,0x3b2d5847,0x3bfd55c0,0xbaaede4a,0xbb842886,0xbc1b1962,0xbc0b03ac,0xbc023692,0xbbaca8b0,0xbb7c495b,0xbb36d625,0x39aa9a5a,0x3b17b4c7,0x3b34e294, +0x3b5ba1d0,0x3b44edd7,0x3b3ba020,0x3ae6fa07,0x3a2a8344,0xba3dc101,0xbad527b8,0xbb5952c6,0xbb8f4fd2,0xbb5b3119,0xbb887be5,0xbb7a61fd,0xbb08bc86,0xbaa793d0,0xb9a7f4f9,0xba010414,0xba60a50a,0xb9cd47c9,0xb97d88d3,0x3a2ab7d8,0x3adbb125,0xb99c72f5,0xba0169a4,0x39875e83,0xbb13ca72, +0x3bef6c38,0x3b6c0e0f,0x3a8bf690,0x3ae145b1,0x3abd20c2,0x3aa53d6b,0x3a9bb818,0x3a6cfb11,0x3ae13d6d,0x3ad1b556,0x3ab5ae28,0x3a0a652d,0xb9373872,0xba855cc5,0xba7cac69,0xbaaeefde,0xbb154e7e,0xbb0cf8fe,0xbade5472,0xba2fe5e8,0xba66310f,0xba9bcf88,0xba98c763,0xbb001fd1,0xbae68dd0, +0xba5fee42,0x3a57aad4,0x3b0e1c82,0x3b0f24bf,0x3b2761c5,0x3b1fe436,0x3b0994de,0x3b2c56f7,0x3b3aa4aa,0x3b7245c0,0x3b613b70,0xba807437,0xbb00e352,0xbb068f1a,0xbab99306,0xbab5cce6,0xbad22222,0xbb026320,0xbb207d4e,0xbb124f36,0xbaf5fda3,0xbaa3ddf8,0xba9a48e6,0xba82fdcd,0xba350668, +0xbaae094a,0xbaef0b64,0xbb1b4633,0xbb1f2202,0xbb49ee8b,0xbb35521f,0xbb0ad845,0xbb267d6d,0xbb3d661c,0xbb2ff0c4,0xbb11ba60,0xbb23a392,0xbacefcc5,0xbacaf005,0xb992fac2,0x385b9c8d,0x3a8da6a4,0x3ac64cbd,0x3a86b479,0x3a0de339,0x39e229da,0xb9eec471,0xbadecf2d,0xbb7e41f0,0xbb8043a9, +0xbb835c3c,0xbb858938,0xbb8479e9,0xbb817d7f,0xbb81326c,0xbb6a8894,0xbb5b6784,0xbb4be814,0xbb311443,0xbb1417fe,0xbad980c9,0xbafb39ec,0xbb0558f3,0xbb12f39f,0xbb1aed38,0xbb1f19f3,0xbb3a9f18,0xbad48862,0xbb37946f,0xbb386b80,0xbb22d477,0xbb1f33c2,0xbb47694d,0xbb6067cf,0xbb67b287, +0xbb562e39,0xbb89973a,0xbb960d21,0xbb8ef0db,0xbb8d5a26,0xbb6ba531,0xbb7004e1,0xbb85a6a1,0xbb1ad832,0xbb7cbf92,0xbb5a6f95,0xbb5ecf69,0xbb5daecf,0xbb5f942a,0xbb62d1c0,0xbb69a5c9,0xbb5b0631,0xbb4dd488,0xbb40c116,0xbb35b151,0xbb2e2fd4,0xbb218e3a,0xbb2bad82,0xbb2ff058,0xbb344b32, +0xbb3ddd5c,0xbb3ed061,0xbb5f115d,0xbb0e27dc,0xba532ed8,0x3a3c9f1c,0xbb2820e3,0xba47d5b8,0x3a804c32,0x3a5e3672,0x3a1cce79,0x39772f5d,0x399e500d,0x393ba02c,0xb9074852,0xba9695c9,0xbb3d0bd1,0x3909b8e6,0xba79d049,0xbb5d33d4,0x3afe0010,0xbaa3c227,0x3b34e31a,0x3ae815e4,0x3b032dc2, +0x3b00d003,0x3aeac1bd,0x3ae873d0,0x3ae617bc,0x3b0c4d4a,0x3b127995,0x3b02ec4b,0x3b0c9c3a,0x3b0fd388,0x3b1d492c,0x3b1c6fe6,0x3b18321b,0x3b0d9d7c,0x3af926c4,0x3aca9dd4,0x3b1fbd32,0xbaad5169,0xbb3df098,0xbb47747c,0xb9077d3f,0xbb2cbd20,0xbb614856,0xbb6d14f6,0xbb78b0b4,0xbb7171be, +0xbb8c6ea5,0xbb8aff38,0xbb63c7e5,0xbb41bcbd,0xb8e049f6,0xbb37a0d8,0xbb548557,0xbb5c228f,0x3b025431,0x3b34547f,0x3b2a1a4c,0x3b3235a3,0x3b0738b2,0x3afba404,0x3af61831,0x3b327965,0x3b385da2,0x3b0b4a4b,0x3b291c45,0x3b4fe983,0x3b835fa0,0x3b8d6393,0x3b8154b3,0x3b4fec9b,0x3afcf80b, +0x3ad3a138,0x3a241910,0xbb5419fa,0x39e11637,0x3a283013,0x3a49cbbd,0x395b6493,0x38589929,0x39d349a3,0xb9b0ed56,0xbafbb472,0xba94ee0e,0xb9c0850f,0x39156c7f,0xb9f2a459,0xba9784a2,0x39cb4afc,0x3a841ff6,0xbaeee3a1,0x3a84f5c1,0x3b628b28,0x3b3f2044,0x3b607fdb,0x3b0f8403,0x3af10590, +0x3ae89646,0x3b70af70,0x3b8a1b38,0x3b55b46a,0x3b74bc2e,0x3b8232c8,0x3ba7961f,0x3bb34394,0x3ba35123,0x3b79d4b8,0x3b04872a,0x3af39714,0xba30bbe8,0xbaf20c6b,0xb9051d90,0x3acb8666,0x3acb4c92,0x39ae5a3c,0xb8b33d57,0xba850893,0xb9f23b86,0xbb763dfd,0xbb4383d8,0xbb7835ad,0xb711f651, +0xbafb0f73,0xba945d57,0x3ab0a4df,0xba0245f9,0xbae44265,0x3b05fd71,0x3ba1930c,0x3b9bbb77,0x3bb78e84,0x3b5b3569,0x3b1fe540,0x3b025c9d,0x3b83bd16,0x3b8a7d82,0x3b2c01ae,0x3b525e19,0x3bb10add,0x3c0c1f3a,0x3c22a8eb,0x3c0a8e28,0x3bb936bf,0x3afae650,0x3a0ad8e8,0xbb15acc9,0xbb629df8, +0x3a9c05ef,0x3b2e2433,0x3b7d5d0d,0x3b540480,0x3ae03734,0x3aca4ba2,0xb9688dd4,0xbb3d7327,0xbb55c9f4,0xbb20e9cd,0x39cb6ad0,0xbb2192c8,0xbaf0ef65,0x3b87d5eb,0x39f6dc77,0xbbfdfe7e,0xbaddfe02,0xba448b99,0xba4178a4,0x384b7e87,0xba2ec0e0,0xba3be03c,0x3ab6f8a6,0x3bb80734,0x3c1eb83f, +0x3c4480ed,0x3c4a479d,0x3be55fad,0xba5fdf38,0xbb30a4df,0xbaebf600,0x3b594852,0x3b9605f4,0x3be503f2,0x3bb7ce71,0x3b315df5,0x3b57ca86,0x397dfb1b,0xbb1bb0f8,0xbb0ee23f,0x3b07b34f,0x398125a5,0xb8da6e6d,0xba080a23,0xb9b09814,0xb9cd630c,0x3a473f30,0x3b1828de,0x3a9910e7,0xba8efa98, +0xbbc2b600,0x3c004c1c,0x3bc75501,0x3b903f7e,0xbae2b17e,0xbbdf96d5,0x3b30fdd2,0x3bc3c4f2,0x3b6d464e,0x3b14e6d2,0xbb1a39bd,0xbc017511,0xbb883e52,0x39eefbac,0x3bcbdac8,0x3b9a0a94,0x3b50a0c0,0x3b465ecb,0x39e9fa1c,0x3acc7484,0x3ae4f684,0x3aa9ad16,0x3ab8f329,0xba83bc6f,0x39d276dd, +0xb9e8d4bf,0xba048aa0,0xbae980fe,0xbab3b6d2,0xba22aa8b,0x3974014b,0xb9ac55c1,0xbb22281f,0xbbe4df00,0xbbe621f7,0xbb70821b,0x3bd9a0c3,0xbc9b93f2,0xbcbd1dc8,0xbb8a7ab8,0x3b6277a3,0xba31b325,0x39ec9659,0xba69d58f,0xbb8ff6d8,0x3b574438,0x3bf69c12,0x3be8fb3c,0x3b8c9142,0x3ad4840c, +0x3a84b52f,0x39f78c86,0x39d7a040,0x395ee51b,0x3a6f9131,0x3b346bdf,0x3ad57f87,0x3a644365,0x3aabcee7,0xb942c904,0xba83b715,0xba9478b3,0xbaeb6c99,0x39f835bd,0x3a88617d,0x3949f90c,0xba7e955d,0xba859bef,0x3a1b03ed,0xba295c2f,0xb9ab21dd,0xbb32b90c,0xbc3fd119,0x3c486038,0x3c30dfda, +0x3bb87916,0x3aa4156e,0x3b1f3b88,0xba28fdab,0xba94f2bc,0x395989fa,0xbb1993a8,0xbb86a0fe,0xbb9e0515,0xbab68189,0x3a996556,0x3b13eaa5,0x3b3827b4,0x3b2e63a2,0x3b534e06,0x3ab600ac,0x3a1ffa5b,0xba5e476f,0xbb096905,0xb9dca7fc,0x3a3a04f3,0x3a0771b7,0x39ad0d39,0x39ed3de3,0xb96af35c, +0xba38d5cc,0xb966cd78,0x39056d57,0x399e64ab,0x3af71fc6,0x3b31c54b,0x3b3f2ed1,0x3b3de943,0x3c14d34f,0xbbd4cc7d,0xbb876f24,0xbaf9abc3,0xbb05c4cc,0xba2f0fc1,0x39676c13,0x3acb71a9,0x3b3d35bc,0x3b82948f,0x3bacf114,0x3ba5c3e6,0x3ba38418,0x3b8e7616,0x3b7e65a0,0x3b15bf22,0x3a381c19, +0xb974368e,0xbb129ec9,0xbb3d37f2,0xbb5d81e2,0xbb95d423,0xbb5da0c2,0xbb6ad28e,0xbae81a68,0xba54d869,0xb98d0d54,0xba269e6c,0xba1b8e2b,0xba82e508,0xb9a6ec76,0x38cc29c4,0x3a6c8f41,0xba8537ec,0xbab88387,0xbafb8281,0xbb5ce5c4,0x3a67d2f0,0x3b19b578,0x3b67eb4b,0x3b56b14f,0x3b98d2ed, +0x3bba16a4,0x3be0982e,0x3bfa8c12,0x3bb74921,0x3b807bd9,0x3b4851da,0x3b2b26aa,0x3af9f483,0x3a47d1c3,0x3a2a847d,0x39ea2871,0xb858c7b7,0x390c6df3,0x36f6ae7f,0xba4aab82,0xba7aea00,0xba94c676,0xbb0e2041,0xbae83eaa,0xba9ac7b0,0xb9886568,0x3ac6f646,0x3b1cf6e2,0x3b3b1881,0x3b2fe60b, +0x3b15f71e,0x3b02f0d5,0x3b0addbc,0x3b1df36f,0x3b1e9f84,0x3b296005,0xba5a388f,0x392737e4,0x3ac82e1d,0x3a9a7ec1,0x3ab3017f,0x3a793b1c,0x3a5112f2,0x3a8452f2,0x3a5b0d88,0x3a8a5160,0x3a9e0daf,0x3a5d5d3c,0x3a0b0324,0x396273ef,0xb99407fe,0xba6087b4,0xbaad95f9,0xbaba0f4b,0xba899d26, +0xbae4526a,0xbb3ce808,0xbb304950,0xbb305334,0xbb12666c,0xbb1bffb0,0xbafc28e9,0xbaf8ef8b,0xb97eb392,0xba21f838,0x3a8dfaa7,0x3a99fc19,0x3b20665f,0x3acd363a,0x3a18cf25,0xb9f400a0,0xb7f199c9,0xbb9df097,0xbb3b7a9f,0xbb274bb7,0xbb1cfb85,0xbafd9a24,0xbabd45a2,0xba85029d,0xba55782c, +0xba657d8b,0xba86797c,0xba92af94,0xba96cb1d,0xba9d0e43,0xbaa6a5bd,0xbab0baf5,0xbab41ca9,0xbabbeaa6,0xbaccc90e,0xbad9f840,0xbad4d5e2,0xbb3bfd19,0xbaf9e4fd,0xbb16111f,0xbb25adc8,0xbb3d2ce6,0xbb28977b,0xbb1d5c69,0xbb383b18,0xbb6b15ab,0xbb4855bc,0xbb452b6d,0xbb722c1c,0xbb5dff87, +0xbb75cba1,0xbb726e5a,0xbb347111,0xbb468d38,0xba9a9b54,0xbac352c9,0xbaa728f6,0xbaa050ba,0xba9f31bc,0xba99c056,0xba85bb2b,0xba7e9200,0xba68d959,0xba5df191,0xba56731a,0xba539437,0xba50f4b2,0xba66a12b,0xba7d6bf8,0xba894eb7,0xba932c29,0xbaab7498,0xba886fa2,0xbb2d1a2d,0xbb77af82, +0xbb8cebd1,0xbb1b41cf,0xbb800977,0xbb94d7e8,0xbb9947f2,0xbb9786e2,0xbb8d9ec6,0xbb97b214,0xbb976c6a,0xbb959b10,0xbb807773,0xbb1e4478,0xbb8fc1c2,0xbb88ff22,0xba973e35,0x39d8d96c,0x3b3e6f2d,0xba0b1e02,0x3a08fd41,0x3a271379,0x3a69f003,0x3a3b0e2d,0x3a1deae1,0x3988f7ca,0x3a239708, +0x3a2f33c2,0x39df17af,0x3a2590bd,0x3a3c9c28,0x3a7396a5,0x3a5ab6a3,0x3a4266c6,0x3a1dfaf3,0x39b6424e,0x3986170d,0xba1680b1,0x3b3c79a2,0x3b6f0d37,0x3b21fe34,0x3b2b8aaf,0x3b749a8a,0x3b09de90,0x3b1dbecc,0x3b16aa0c,0x3ad7c91e,0x3b0cdbfc,0x3b192fb8,0x3b3a33ab,0x3b588d91,0x3b0044c1, +0x3b2fdddb,0x3b7c9206,0x3b545ae5,0x3a2fa63c,0x3a459cb3,0x3ae469a4,0x3b135227,0x3b07061f,0x3aede39d,0x3a574569,0x3ab6a6f8,0x3a9b5f9a,0x39ff4189,0x3a5cb66f,0x3aaa5efd,0x3b0723b3,0x3b1448a5,0x3b0be82e,0x3ac89ea4,0x3a56cf41,0xb99e9bdd,0x38d7047c,0x3b14675b,0x3a81c9f5,0x3b29c01e, +0x3b071d7f,0x3b065b23,0x3a82c39d,0x3a113ee3,0x3a01ba97,0x3a29df25,0xba42b1e6,0xba950f3a,0x3a68ef0b,0xb86e5e2e,0x3a7e57f6,0x3b3f4209,0x3a23d058,0x3af61381,0x399600e3,0x3a0d2b2c,0x3b253b55,0x3b50f15b,0x3b500df1,0x3b3a9519,0x3a1a6a09,0x3b1568c5,0x3b1a9761,0x3abbde61,0x3b0de990, +0x3b24b9b9,0x3b7982f7,0x3b6d926f,0x3b53d5a8,0x3b0a48ac,0x3a51ba15,0xba569000,0xb9640218,0x3aaec642,0x3ab60ad3,0x3b1f5e93,0x3b027381,0x3b1a8ef2,0xb95a626b,0x39ed0d63,0xbb0d5e7c,0xbacd0207,0xbb7c4219,0xbb0fe016,0x39d7dc7a,0xba505784,0xb6bb48bd,0x3b62d9da,0x3a613adb,0x3ac333ee, +0x3a342ea0,0x3ae8eb83,0x3b9ea16f,0x3bd0295a,0x3bdafa3d,0x3bcbe4f4,0x3b222dbd,0x3b72d6d8,0x3b363fac,0x3a4e539b,0x3abd3883,0x3b66725f,0x3bd6a780,0x3bffb60c,0x3be37628,0x3b9816a1,0x3ad93485,0xbadbc754,0xbb008044,0xb94652a9,0xb5a2b3ca,0x3b8b1c72,0x3b564d5e,0x3b18a49a,0x3a35208b, +0x3a27740b,0xba2e87ac,0xbb84f40e,0xbb8148b2,0xbb783871,0xba11d42c,0xbb5c2462,0xbac66fb7,0x3b7e09d2,0x39dbcd55,0xba1dfc08,0xba854961,0xbb8249a9,0xbb25b049,0xbb1a5e1b,0xbb23460e,0xbb1f4276,0xbada0c8c,0x3a8e1838,0x3b896d16,0x3bb507f8,0x3bdd98bb,0x3b17f1a1,0xbba9efeb,0xbbb452c1, +0xbb9e44c6,0xbb6d446f,0x396016e5,0x3b066c0c,0x3bb805f0,0x3bbb8fce,0x3a9ea68a,0xb9670049,0xbb41c0b8,0xbb01378b,0x3b1dc7be,0xb9802c88,0xba43af56,0xba642694,0xb9950d30,0x398bf8e4,0x3b21e3e9,0x3b4dd9f9,0x3b45c2ba,0x3a4648a4,0xba71e25c,0x3c303031,0x3b68462c,0xbaf69a8f,0xbb7abc2e, +0xbbf61371,0x3b69e6b4,0x3bfdd9a4,0x3bb9fcc5,0x3b484988,0xbb32d2f6,0xbc123762,0xbb939c21,0x39ae4fc9,0x3bc50c06,0x3b926292,0x3b421329,0x3b1a2ab3,0x3a8dc1a2,0x39a44831,0x3b49e5aa,0x3b456e92,0x3b0be8be,0x399b305c,0x38082de5,0xba89a653,0xba80f68e,0xbaf006a9,0xba8f0a92,0xba0a712f, +0xb82f0344,0xba3d2028,0xbb64b0a1,0xbbe7157f,0xbbf2d949,0xbaefc57a,0x3bd158bb,0xbc9d1eb7,0xbcb0f84f,0xbb542627,0x3b915205,0x3b011570,0x3b60062b,0x3a22c4ac,0xbb99abff,0xbb8598fc,0xb9c672d1,0x3b7fbc24,0xba0b9a26,0xbb43cd64,0xbb2b4ece,0xbb5a635f,0xbb25ac76,0xbab467f8,0xb804b717, +0xb60235f0,0x3ae4f9d0,0x3b0c534c,0x3a60c8c9,0x39c54340,0xba45edd7,0xba76c558,0xbae64e8b,0x399a3f04,0x3a2ec4e5,0x3912e764,0xba4f72ef,0xba27c5f7,0x3ab2550a,0xba1ac50c,0xbaa3b574,0x38dcaeb2,0xbc55eece,0x3c4f7321,0x3c18d9d8,0x3b9bb502,0x3b6af5e8,0x3b93ef72,0x3a8a3138,0xb9a273c1, +0xbac0bbff,0xb9176d00,0xba4016a2,0xbac7020d,0x3a417afe,0x3b22cd35,0x3b2a54a3,0x3b3cf142,0x3b1f4602,0x3b1585e6,0x3a0957f6,0xba712cdf,0xba2e9b8b,0x389ea2d5,0x39a757e8,0x3a92160e,0x3a558f2b,0x39ce828f,0x39a397d6,0xb9e116f1,0xba0c3b85,0xb9321fa2,0xb7b8c1d2,0x3817cc59,0x3ab8bcea, +0x3b487075,0x3b33e8b2,0x3b7404f3,0x3c162742,0xbaa32dd7,0x3a9861d4,0x3a96b461,0x3ab23358,0x39905f88,0x3ad386a3,0x3b0386a6,0x3b03aabc,0x3b6a7ac3,0x3baf6da1,0x3bddb608,0x3bd11980,0x3bb01d1c,0x3b971a03,0x3b3060ac,0x3a56f942,0xba7d8e77,0xbb0f3f68,0xbb59a96a,0xbb6285a8,0xbb3c0d14, +0xbb5d0c96,0xbb65b33d,0xbac361a1,0xba4430e3,0xb9faeacd,0xba11f547,0xba7a4b52,0xba3d49dc,0xba17ac5d,0x3a05b7fb,0x3ae7027d,0xb9273491,0xb9c5dafc,0xba25c506,0xba790c1c,0x3b953496,0x3b7b046f,0x3add7c4e,0x3b14de9c,0x3b310593,0x3b5b11b8,0x3b864b34,0x3badb177,0x3b8b43c3,0x3b51ca75, +0x3b2b2146,0x3b252cca,0x3b1fe0e5,0x3ad72296,0x3ab1c9a3,0x3a2110e5,0xba7746f7,0xba710998,0xba8aa122,0xba3ba3cc,0xba6ff78f,0xba8e861c,0xba56f42c,0xba98427d,0xba73a509,0x388f3927,0x3acaf32c,0x3b1f9909,0x3af53604,0x3b02c54e,0x3adbc762,0x3ab9f368,0x3ae2047c,0x3b1234ed,0x3b3cf33d, +0x3b59cc94,0x3af87099,0x3a841251,0x3a68c060,0x3a9b4f60,0x3a444714,0x3a23b71f,0x39edca95,0x3a03d9a2,0x3a3522f9,0x3a920168,0x3ac54cd2,0x3a3bb159,0xb7b8e6a0,0xba0b0b48,0xba90a285,0xbad21ce6,0xbb102502,0xbafb880b,0xbb110ab9,0xbad5a3e1,0xbaa68fb4,0xbaf96e3b,0xbb1a93f7,0xbb04e08e, +0xbadae863,0xbade3a46,0xba64acb3,0xb9462b49,0x3a9f9d95,0x3adfe823,0x3b34cf0a,0x3b659e66,0x3b4e72ef,0x3b405ca7,0x3b36e0f6,0x3b0eab46,0xbb101c3d,0xbb2ef26a,0xbb3df488,0xbb35d05f,0xbb2f6756,0xbb251dfc,0xbb21c1be,0xbb24d6fc,0xbb2d339c,0xbb3b7ed8,0xbb3dae13,0xbb336800,0xbb1cd023, +0xbaffbc09,0xbb071f39,0xbb0a92e0,0xbb146af5,0xbb1a99b7,0xbb29afd4,0xbb305797,0xbad8f47f,0xbb12f2c7,0xbaf41e39,0xbaff24b4,0xbae1c42e,0xbaf9427a,0xbb0da947,0xbb053474,0xbb019e92,0xbb2c0bb2,0xbb476952,0xbb434917,0xbb411f24,0xbb31fa6f,0xbb2c6ebe,0xbb38b68e,0xba712132,0xbb201413, +0xbb0f395f,0xbb0ec878,0xbb12434f,0xbb15a8e0,0xbb17a26c,0xbb178fe0,0xbb126321,0xbb0af02a,0xbb06d1c6,0xbb025cce,0xbb02f9fb,0xbb00d36a,0xbb07c364,0xbb0afaee,0xbb0e35b0,0xbb13c31a,0xbb14f701,0xbb32bc20,0xba89b4d6,0xb9bfc801,0xba57b505,0xba9503f9,0xb946d9e9,0xba44682f,0xba3b94d3, +0xba55e76a,0xba81ed26,0xba48d57a,0xba45f32c,0xba5fd449,0xb9a2f040,0xba8ce78c,0xba9c85d5,0xb9e57e89,0xbb118427,0xb98ccf86,0xbb1666ca,0x37dbc092,0xb81008e9,0xb80e2af9,0x396c73a6,0xb9d61ed6,0xba190a4c,0xba293e3a,0xb9bbd137,0xb96d86ca,0xb970649d,0xb913e52d,0xb8d34f88,0xb755c9ac, +0x3899ff63,0x385c7aba,0xb7e52105,0xb9a9f097,0xb9c10abd,0xb9758291,0xbb140f9d,0xbaeb7434,0x3aa6723d,0xbaf4966c,0xbaf5760e,0x3a011c06,0x397046b0,0x376112a2,0xb872ba38,0xba1ed229,0xba17088d,0xb7d4bc86,0xbb12d0c4,0xbb0caacc,0x3a99ae37,0xbb049ddb,0xbabdc3e4,0xba45236e,0x3a311e74, +0x3a1c8095,0x3aa5bb6a,0xb9bbe778,0xba7a8d70,0xba94568c,0xba205d41,0xb9dcb0ce,0xba14b574,0xb9826975,0x397c16fd,0x3a3ccaf3,0x3aa546ac,0x3a8adb05,0x3a07a04d,0xba0c2d20,0xba269dd2,0xbac7435c,0xba93c2be,0xb9cbe90b,0xb9cb9f30,0x3971aed1,0xb9088450,0xbaaf3812,0xba97ae6c,0xbb0a17af, +0xbb321afd,0xbb396e0a,0xbb0b6b98,0xba82f8bd,0xbae1de43,0xbab70e4a,0xb9a2f0cc,0xba7ab842,0xbb1e574f,0xba68df87,0x3aae131c,0x3a9cc679,0x3b2739d2,0xba0150a7,0xbaf1422e,0xbb0f9e8f,0xba8f7f29,0xb99f6830,0xb64d36b4,0x398d8794,0x3a0af5ac,0x3a6bf264,0x3ae00638,0x3ac19459,0x3a3bc8da, +0xba427ebb,0xba7cf6f8,0xbaf5e8ea,0xbaef3d4d,0xb9ee28cb,0x3a59e403,0x3a0415e4,0x386ec2d2,0xbaaddbe0,0xbabb406e,0xbb015db8,0xbb72bb0e,0xbb77825d,0xbb835dc4,0xba651492,0xbb1028c2,0xbad6bf62,0x3a539c27,0xbad1d9fb,0xbb1806e5,0xb91d74e1,0x3b38050b,0x3b5c9599,0x3bb76221,0x3a767c4d, +0xbab70d49,0xbb1dc2c5,0xbad39b4a,0xba9aa065,0xba7be367,0xba640c9a,0x3a496815,0x3b2bc895,0x3b97a7f9,0x3b7ff5df,0x3b082fbe,0xba6d1471,0xbad9d563,0xbb3de7c8,0xbaf5e288,0x3a891e83,0x3b4a5312,0x3b4a6718,0x3b1f0108,0x3a85e26b,0x39a2f7e4,0xba95e6c0,0xbb546335,0xbb98868d,0xbb80f004, +0xba446ac1,0xbb6538d2,0xbb30200d,0x3b4832ca,0xbaa780f9,0xbbcb9622,0xbb6f4f09,0xbb3d24b7,0xbb46a64a,0xbb5f23f0,0xbba16cbf,0xbbc6042d,0xbbd490a7,0xba2af8b8,0x3b8ccaa9,0x3bce4e04,0x3c1e0e2c,0x3bc4f91a,0xbae69411,0xbb6c5b68,0xbb811e5a,0xbaa7a47b,0xb9ba192d,0x3a4bba61,0x3a75acb4, +0x3a6b4da0,0x392ae5ab,0xbafc3f4c,0xbb71c701,0xbb34e39d,0x3b21fbdb,0xba090171,0xbaa2801c,0xba8aaae5,0xba44072d,0x39db3fc2,0x3b2f2889,0x3b45ab32,0x3abc8305,0xbaa80807,0xbba6a9db,0x3be50536,0x3b275589,0x3a8d9e05,0xbb8246a3,0xbc01b2fb,0xba8e256f,0x3b1db629,0x3b35f3bc,0x3aef5abd, +0xbb36d2e6,0xbc11ef0d,0xbbbf456b,0xbae622cd,0x3b531efb,0x3b59388e,0x3ab1f1c9,0xba96a781,0xbb119e19,0xba2c93f9,0x3af3ec91,0x3af5d43c,0x3adcf013,0xba098ba0,0x3a0bd277,0xba2c572e,0xbaaae5a3,0xbad1cb50,0xba462e09,0xb9df62d9,0x388a8b5f,0xba951b7b,0xbb802377,0xbc0280f4,0xbbf76a36, +0xbb183ee8,0x3bc055cf,0xbca64bd0,0xbca6d972,0xbb6bca92,0x3ac71401,0xbba21f3a,0xbbac235b,0xbc084d67,0xbc3cc388,0xbbe66040,0xb9f31617,0x3bbd6eea,0xba5fae8d,0xbba5b54c,0xbbb77d86,0xbbada658,0xbb6ffec9,0xbaca5d90,0xb990c888,0x3a9da800,0x3a07a86f,0x3910ead0,0x39a3f046,0xba98fdd6, +0xbae7a67b,0xbab2d259,0xbadd7ecf,0x392ae886,0x3a071882,0x38570e23,0xba36666c,0xba28ff79,0x3a741fc5,0xbb1c8fbb,0xbb01099f,0xb916d63d,0xbc660e50,0x3c3381c7,0x3ba9681b,0xbaaef631,0xbbb92616,0xbbcb07e1,0xbc0583bd,0xbbdd063e,0xbafbaf9b,0xbb409bd9,0xbb89363e,0xbbaf7a9a,0xbb44b8ae, +0xba4d17eb,0x38c6f1bd,0x39dc1dd7,0x396b6943,0x3a71077a,0xba04a889,0xb9f3225e,0xba3d6dbe,0xba3d0a61,0x398b95dd,0x3a9c2b0d,0x3a3abf33,0x38f1015e,0xb892cbf5,0xb9919ce7,0xba22cfe3,0xb8608ab3,0xb7d5af89,0x3966eb0d,0x3b0fa03a,0x3b477feb,0x3b2dcd5b,0x3b8a04a4,0x3c1d747a,0xbb853709, +0xbb9b7b84,0xbbc7d2fe,0xbbd88011,0xbbd4adbf,0xbbc9fe85,0xbba0e632,0xbb3204d2,0xba67ee18,0x3a803786,0x3a41cdfa,0x3ad75d20,0x3ac2fab5,0x3a8f5a8e,0x3a748586,0x3826ed56,0xba858fb5,0xbb2e4b7b,0xbb65e614,0xbb855ff2,0xbb9989b2,0xbb7f0520,0xbb5cb55d,0xbab4e7a5,0xba1e0332,0xba4d1f8f, +0xba59ca25,0xba838ed5,0xbacc4ab9,0xba91ce2b,0xba0075cf,0x39ceb3de,0xba846681,0xbab764fb,0xbb0372d4,0xbb943bd5,0x3a92d8da,0xba8df70a,0xbad74034,0xba3fe35e,0x3a8afe53,0x3b3f8429,0x3b8e93ee,0x3b9b2cc0,0x3ba481af,0x3b99f754,0x3b92d92c,0x3b5e036b,0x3b10490f,0x3a28c82c,0xb68fb6e5, +0xba1da864,0xba920012,0xba528740,0xba23e12e,0xba239a93,0xba94816e,0xbac4380f,0xbb1c8ada,0xbaefa6e7,0xba62391b,0x398ff5ba,0x3aceab90,0x3b0822fd,0x3af5d38f,0x3ac31dd8,0x3a7c7fe7,0x3a193f1a,0x3a5581d2,0x3a21722f,0x3a72637b,0x38fec2bf,0x39a15647,0x3a7daef3,0x3ae62e14,0x3a924862, +0x3a1ae460,0xb92e31bf,0xb9fac997,0xba134318,0xb9ca7fff,0xb8ce9a29,0x39bec424,0x383342f3,0xb9175d5e,0xb99e2681,0xba4aa943,0xbaa7e697,0xbaea393a,0xbafae2b0,0xbaf0c41b,0xbb17f384,0xbb33ccf9,0xbb206166,0xbb1f4485,0xbaf2042c,0xbad9cbcf,0xbaa353cd,0xba46d614,0x3a06a5fb,0x3a590e35, +0x3b0f4bef,0x3b2956b1,0x3b679302,0x3b3854ac,0x3b0d7790,0x3ad26d5e,0x3aaa1bfc,0xbb462b34,0xbb48865d,0xbb480e52,0xbb540ae4,0xbb480822,0xbb426d05,0xbb4548d5,0xbb591b7a,0xbb4291fb,0xbb329f11,0xbb20002d,0xbb08780c,0xbae6dcff,0xbac40312,0xbacf42ed,0xbad04825,0xbad2d45b,0xbae192ed, +0xbadb80b6,0xbb00cc55,0xbb2fd351,0xbb238f6b,0xbb48cba3,0xbb3bb757,0xbb561182,0xbb66ed5f,0xbb54f7d3,0xbb66a173,0xbb718b29,0xbb5c1f3d,0xbb45247f,0xbb4b97cf,0xbb40cb84,0xbb4235d1,0xbb515eae,0xbb334511,0xbb5f1c6b,0xbb0a791b,0xbb11daa5,0xbb14cd40,0xbb1aff24,0xbb235bf4,0xbb264f57, +0xbb2af9bc,0xbb1aa672,0xbb10b79c,0xbb0856d4,0xbb00242f,0xbaf2496e,0xbadc35f8,0xbae91b6d,0xbaf1820e,0xbaf8f564,0xbb028b12,0xbb0902aa,0xbafcd4e7,0xbb58f4d6,0xbb612f12,0xbb0b5f61,0xbb6099e8,0xbb6f5db3,0xbb0d7b22,0xbb13cd64,0xbb14297f,0xbb09ab52,0xbb178578,0xbb18ec65,0xbb150ac6, +0xbb50dc2a,0xbb4adb6c,0xbb024647,0xbb5b77ea,0xbb213add,0x3b1a0e67,0x3b3c0689,0x3b1301f5,0x3b0b57c4,0x3b208949,0x3b25c5ea,0x3b30d678,0x3b310af1,0x3b1f0cc6,0x3b2c99b7,0x3b2dd076,0x3b26d123,0x3b2a1ef8,0x3b2ce34c,0x3b33ec1d,0x3b39ce72,0x3b371311,0x3b302f14,0x3b1b915e,0x3b027b28, +0x3b05c8b8,0x3b35153d,0x3accc8eb,0xbadff67b,0x3b511fe9,0x3ae85253,0xbaf608ed,0xbad9266b,0xbadfc164,0xbaf1e9be,0xbae3d69a,0xbacf29e3,0xba838af3,0x3ac85443,0x3b441755,0xbab3e102,0x3ac8ca0b,0x39fdeaa3,0x3b3e44f1,0x3b1f9fcc,0x3b521d2d,0x3b691c83,0x3b8957c7,0x3b8be6d2,0x3b62e0da, +0x3b79dbad,0x3b6d5f4d,0x3b5502ea,0x3b547265,0x3b6c7fbf,0x3b87e9d8,0x3ba02db7,0x3ba1683d,0x3b914c12,0x3b5cce66,0x3b146875,0x3b134c06,0x397f9578,0x3af896d9,0x3b3a01f3,0x3b097fe4,0x3adf90dd,0x3ac450aa,0x3aa6541d,0x3aadfa4b,0x3a61105b,0x39b6fef9,0x38ffbfa7,0x3a7e768f,0x3a303245, +0x3a224ce6,0x3b13731d,0x3b03be36,0x3ae94c89,0x3b0e59b8,0x3b30af1e,0x3b8261bf,0x3b9175a1,0x3bba9222,0x3bc32ced,0x3b8b5c01,0x3ba8df33,0x3ba8debd,0x3ba3f4ff,0x3ba1f54c,0x3ba8e3f4,0x3bbd05c4,0x3bd9df01,0x3bd57b02,0x3bb950ed,0x3b6b7006,0x3b154142,0x3a7f63ce,0x3a9fc012,0x3ad874d1, +0x3b1048f1,0x3b09eafb,0x3ad46ebc,0xb8df0657,0xb9f77b22,0xbabf46f1,0xbae0ac35,0xbb5de409,0xbb2cbd80,0x3902d2be,0xba473daf,0x379c4e80,0x3b1c3025,0x3ab2ab87,0x3a5a6610,0x3b181f4f,0x3b391f2e,0x3ba59aec,0x3bd56f8c,0x3c0dd3ca,0x3c1672bb,0x3bd6f8fe,0x3be2ba15,0x3bcd79ea,0x3bb2878d, +0x3ba1768a,0x3bd68be0,0x3c1020c4,0x3c401529,0x3c3ec387,0x3c211b8f,0x3bbe047b,0x3b1fdbab,0x3a06dc75,0x3943b9db,0x3adf3cd4,0x3b7329e8,0x3b67a04d,0x3b1b36a0,0x3a07ba1b,0xb90e5759,0xbadf3c91,0xbb6e023b,0xbba3cc9c,0xbb960637,0xbac9cf61,0xbb676c80,0xbad9c7ac,0x3b39363f,0x3a613bcd, +0xb7a337e4,0x3b248c04,0x3b321780,0x3b51cf23,0x3a961de6,0x3b07d56a,0x3b018982,0x3ad784ee,0x3b9bf44a,0x3bf24e02,0x3bfec5b0,0x3c2db8a4,0x3bd17f4e,0xbb54c838,0xbb68d413,0xbb75e04a,0xbb1af7d2,0x3a41a819,0x3b2bf36c,0x3b6ec6f4,0x3b07ab32,0x385f522f,0xbad4141a,0xbb5dd008,0xbb1803cb, +0x3b2ae9ee,0xba2752b0,0xbab37fd5,0xba915d4f,0xb9c4ad9c,0x3aa66854,0x3b8f8400,0x3b8c79bf,0x3b4fee04,0x3a004cea,0xb93b3fde,0x3c1d1fa0,0x3b79ac45,0xba9580c0,0xbb7216fd,0xbc02ebb7,0x3a74457d,0x3ba66b77,0x3b99ee63,0x3b812243,0xbaa10598,0xbc07986f,0xbbc34597,0xbaefc199,0x3b892f54, +0x3bdea6a4,0x3bf3ba38,0x3bed75eb,0x3b945118,0x3b5a8f86,0x3b8fa9d6,0x3b2bcba5,0x3b16a65f,0x3a7dd6c6,0x3aa4702d,0xb92fac21,0xbabd5ae8,0xbac3648c,0xb9f916d8,0xb99acf51,0x3951fed6,0xba986b57,0xbb8a98ec,0xbc0419c4,0xbbd4c408,0x39590eda,0x3bfda0e0,0xbca0cd57,0xbc8c7bbc,0xbb1e206d, +0x3ba9de2e,0x3c1a9a66,0x3c3182df,0x3c050a86,0x3b356681,0xbab3e24b,0x3aaa5f8f,0x3c1a7c66,0x3bac5fa7,0x3b3b454b,0x3b1114da,0x39aa09df,0xba878218,0xbaf6a67b,0xb99c22e0,0x3a5e7839,0x3b17381f,0x3b1b9ade,0x3a8cfe87,0xb9ee98a7,0xba849983,0xba76c81a,0xbabebdc2,0x39706353,0x39d16759, +0x383dfe94,0xb9c35715,0xb99ef0c2,0x3aa7bd60,0xbb13a6db,0xbb152b34,0x3ab59805,0xbc664ef0,0x3c2861f7,0x3b67aad9,0x3b87b888,0x3bdf6c1c,0x3c5b9e85,0x3bff7c7c,0x3b8fa910,0x3a8372f9,0x3a90e080,0x395b934a,0xba008320,0x3a6cf248,0x3b1bd8d8,0x3b1190c0,0x3b7ffbe3,0x3b9d1dd7,0x3bad46be, +0x3b5c2325,0x3ac6644e,0x3a10e449,0x399b9ff4,0x3aa6a7dd,0x3b01a882,0x3a9fef9f,0x39dbb82a,0xb88edff6,0xb9aa3c0e,0xb9bc098e,0x37fefa6d,0x37c93007,0x399861f6,0x3b1f5147,0x3b4a10e8,0x3b53e97c,0x3ba6d889,0x3c1e5a56,0xbb20ae08,0x3b5c6d3c,0x3c038b20,0x3bece551,0x3bb02f38,0x3bb40dad, +0x3bb5aa9e,0x3bab3e9b,0x3bb21dc8,0x3bdd95c5,0x3c0974cb,0x3bf64a80,0x3bd07ebc,0x3bac6fca,0x3b42c126,0x3a4412e3,0xba8982b6,0xbb265ecf,0xbb42aad2,0xbb28c7b8,0xbb44cdac,0xbb2b4a0b,0xbb39a434,0xba7c579b,0xb96f6888,0xb9eb1069,0xba1cc080,0xba69ff36,0xba8afa6a,0xba335556,0x392de64c, +0x3a9b40be,0xb8dd5de2,0xb9ff0506,0xbaf5b9ae,0xba6dd7e6,0x3917bcb7,0x3b097819,0x3ac7ec38,0x3b046899,0x3b6839d3,0x3bae83a8,0x3be07ea2,0x3c0ffd34,0x3bd6cd92,0x3ba655a7,0x3b9110d2,0x3b9865fb,0x3b990ce3,0x3b749b48,0x3b53e8d2,0x3b17e1a2,0x3a235ce6,0x3a0a9683,0xb988c556,0xba8b908e, +0xbaa4005f,0xbaa268d3,0xba8af4d9,0xba1befa6,0xb922e7bd,0x3a4ec488,0x3af746b9,0x3b100f4c,0x3ac21bf3,0x3ab85061,0x3a8911ac,0x3a5cf959,0x3a739b5d,0x3abd0013,0x3ad02bc3,0x3b0bcc79,0x3b6d79eb,0x3b6b3b3b,0x3b80a9cc,0x3b742fb7,0x3b50e452,0x3b3f1783,0x3b3c5215,0x3b5710c4,0x3b54fe5f, +0x3b646b07,0x3b643b7d,0x3b0c8f5c,0x3a5d7a6d,0xb9a1dbd6,0xba38a2b7,0xba945f71,0xbad32bb9,0xbaa74bcd,0xba8c6932,0xba4bcdb3,0xba8e3429,0xbac6f4b1,0xbaf3439d,0xbaa50c80,0xba88f142,0xba187f20,0xb912329b,0x3aa738bc,0x3b0b2ad7,0x3b3ed103,0x3b63b885,0x3b90f04c,0x3b871d65,0x3b82cd0e, +0x3b6f1ba1,0x3b720de6,0xbb3b156a,0xbaafcf99,0xbac62170,0xbaa1836f,0xba6d195a,0xba1dfe43,0xba01da14,0xba0402af,0xba7f9ea5,0xbac085b1,0xbadfea6b,0xbaf12f0f,0xbae62dc6,0xbadbf793,0xbad9873b,0xbadbf2b1,0xbae5241c,0xbaf0f48e,0xbb0bb6ae,0xbb020b18,0xbb04764d,0xbad5fcb2,0xbaac5240, +0xbaeac140,0xbae32051,0xbac4a6b7,0xbab5b141,0xba99c845,0xbab85c7f,0xbaa5c6fa,0xbab26bed,0xbac27428,0xbab9f6db,0xbae660d2,0xbad0755c,0xbaa77327,0xb9fb1534,0xba39d3be,0xba627a9b,0xba4677ce,0xba594b74,0xba5fcb7c,0xba5976de,0xba36b58f,0xba4d4c20,0xba50ff56,0xba68737a,0xba74da70, +0xba889365,0xba97749c,0xba9cb413,0xbaa15cc4,0xbaa62159,0xbaa89766,0xbab0d161,0xbabf8287,0xba50c3de,0xbaa91bb7,0xbb4de5fe,0xba1a126a,0xba9c2dfc,0xbb5d4023,0xbb522f12,0xbb4ab83d,0xbb3f73b4,0xbb32dadb,0xbb299373,0xbb1e03d0,0xba5ddfb6,0xb8d05822,0xbb468540,0xbaa2162b,0xba7a38bd, +0xbac787c2,0xba878698,0xbb02715a,0xba8b281c,0xba9a9936,0xba3b230d,0xbabe362f,0xbadfe457,0xbafdbfc0,0xbae464cb,0xbad403fd,0xbabdc7d3,0xbab96115,0xbab439c6,0xbab2dc82,0xbaa2c1be,0xbaa3bae9,0xbaa97da9,0xbacecd27,0xbabacc80,0xbb0c52eb,0xba7fce7e,0x3a730e3d,0x3b91bb8a,0xbab7baac, +0x3a2de1b7,0x3b6ba532,0x3b661996,0x3b59941f,0x3b40c733,0x3b3a054b,0x3b3f0e78,0x3b51996f,0x399cd253,0xbb0091d6,0x3b89fa44,0x3a7cf7dd,0x3ad0a521,0xbb0763b6,0xba557a58,0xb9e5875c,0x3a183b8e,0xba86fa27,0xbaedf44c,0xbb21e429,0xbb136a9b,0xbb0979a9,0xbaedb838,0xbadfb105,0xbab2eab0, +0xba9813fb,0xba075b07,0xba09a6b4,0xba6915bd,0xbad09694,0xbaf56d4a,0xbb0fb29c,0x3ad8fcbb,0xb9c813eb,0xb925066e,0x39ea3ea6,0x39b5cf27,0xbacca08e,0xbad6ce5f,0xbb175a08,0xbb00ada5,0xbb48d5a7,0xbb3ce31f,0xbaacea2d,0xbaf80da2,0xba2e82e3,0x385a5b24,0xbade1459,0xba84f44e,0xbacad7cd, +0xb9fc3afb,0x39e20a1e,0x3b0cbf9a,0xba4da6f7,0xbb1d6959,0xbb7a8854,0xbb5b9b2f,0xbb2df7da,0xbabc88f0,0xbab13f6d,0xba8c72da,0xba96ec13,0xb9911240,0xb9af7c3c,0xba675a77,0xbb00623a,0xbb2f46b5,0xbafa6ca8,0xba0bb800,0x364b6d15,0x3a065539,0x39303c75,0x3a18636a,0xbb06bbb6,0xba952b02, +0xbb4dfdaa,0xbb3b4fbc,0xbb8aecce,0xbb5b625a,0xbab5f41c,0xbadc4654,0xbaa0afce,0x3a70109c,0xbaaa21fe,0xba9fab66,0xbab780fa,0x39f8fd8a,0x3b25eafd,0x3bb88725,0x3acd4649,0xba8c2f6d,0xbb6f88ad,0xbb7913d9,0xbb67650a,0xbb0a14dd,0xbb1e3100,0xbaa5982d,0xb9b50331,0x3af80d44,0x3af5df90, +0x3a4ceb83,0xbab94e94,0xbb2360e5,0xbb118701,0x39eab183,0x3a4970ba,0x3b52554e,0x3b16ac75,0x3acf2780,0xb8f4dcb0,0xba77b5d4,0xbb0063f0,0xbb5eaea7,0xbbb53806,0xbba937d8,0xbb08b7f6,0xbb84a390,0xbb31d8db,0x3acb9be2,0xbafc6ab4,0xbabf33d3,0xbb3dd671,0xbb3cb2ce,0xbb490bcf,0xbbad2203, +0xbbcbcae9,0xbbf96a0c,0xbc2245e1,0xbb9888e7,0xb9cd60e5,0x3a7344a7,0x3bb8820b,0x3b6699cd,0xbb6f7a23,0xbb9f996f,0xbbc42461,0xbbcf67a2,0xbb989bc7,0xbb93c02d,0xbb2d956b,0xb9be3c82,0xbb35bed1,0xbb60fa6e,0xbb8d8d22,0xbb33f1b1,0x3b2c0103,0xba69930e,0xbad61319,0xba956a68,0xba47829c, +0x3aab5a76,0x3b969207,0x3b848a8a,0x3b2f069c,0xb8fb6394,0xbac37e17,0x3bcf8c35,0xb9d7f3dc,0xbb322b52,0xbbaf45fb,0xbc007d3b,0xbb5621eb,0x3a0aacae,0x3b3dacd0,0x3b1821e5,0xbb0c083b,0xbc0d3620,0xbbd986e6,0xbb596fee,0x3a37d88b,0x3b2d1522,0x3ab89b43,0xbb0b4aa0,0xbb0075d8,0xba91d0e1, +0x3b2f7019,0x3b2ab3de,0x3af8d523,0x39e886d9,0x3a2ef4b8,0xba3edbc5,0xbaf4772c,0xbab61ea7,0xb998865c,0xb9778e88,0x38c58f5e,0xbac8613e,0xbba2d37b,0xbc0ecc33,0xbbfaaa44,0xb9fa79f1,0x3b9af067,0xbc95ac5f,0xbc82d4d1,0xbb867512,0xb9d861ff,0xbb4617d7,0xbba1fa31,0xbc1eba1a,0xbc61211c, +0xbc5ff660,0xbbdf0621,0x3b8d3b93,0xbb6b9358,0xbc03de03,0xbc109208,0xbc084241,0xbbc8f805,0xbb4aec81,0xbab2d496,0xba67cf08,0xba34989b,0xb91608ec,0xba226ba9,0xbacc8eda,0xbb0ae857,0xbac00588,0xbab2bca8,0xb7cca35e,0x39483cc1,0x3768c00e,0xb9b9c833,0xb9e0af97,0x3a04433c,0xbb445ff5, +0xbb2df566,0x3abc2d29,0xbc606202,0x3c0abfbf,0x3997f27e,0xbb7e7672,0xbbbeb77f,0xbbd57cfa,0xbbfa2e06,0xbbd1c3da,0xbb50e458,0xbb06a72b,0xbb26b855,0xbb5b4f0c,0xbb2a20b0,0xba9b7d33,0xba739230,0xb9d537fc,0xb9a47d58,0xb839a1d9,0xba816760,0xba5acb93,0xb988855d,0x3a6a2f2d,0x3a81e8c0, +0x3ad02848,0x3a739960,0x375feb11,0xba0cd6de,0xb9c1e362,0xb9b9bd84,0x3930661b,0x3819357a,0x39a5e508,0x3b0b2b04,0x3b24c6e6,0x3aff439f,0x3bb2b2d1,0x3c122c37,0xba2bfcb8,0xbb13d181,0xbbafc9a0,0xbbc90d35,0xbc005784,0xbbfb1460,0xbbdfd324,0xbba6721d,0xbb3b8ec7,0xba578c30,0xb9a2cd06, +0x3a59d93a,0x3a64c856,0x39d6f9eb,0x3a184cc3,0xb94a0d63,0xbad68885,0xbb2a1d3c,0xbb6969be,0xbb845bb8,0xbb7adc42,0xbb729154,0xbb2f35b1,0xba6d136d,0xb9af8c1d,0xba6016bb,0xba4b57bf,0xba953912,0xbab28bb3,0xba9b72f0,0xba03cea5,0x39544338,0xb9d5a51f,0xba4bf20e,0xbac718ac,0xbb702d51, +0x3abf3691,0xbb2f6e08,0xbb9e9db9,0xbb4b22af,0xbab1d341,0x3a51680a,0x3b0786bb,0x3b1987d8,0x3b893145,0x3ba28cf7,0x3bae8ad7,0x3b884be8,0x3b453931,0x3abf208d,0x3a2bcdc2,0xb9aa1212,0xbab1c082,0xbaa5c92a,0xbaa69657,0xba6cef48,0xbabe20aa,0xbae3768b,0xbaf0bb4f,0xbaac78d3,0xb9c73c60, +0x3a3d9a6f,0x3ab3faac,0x3ac67896,0x3a32f0c7,0x39f4fe2e,0x38f59708,0xb9755ce1,0x3890269b,0xb9951c00,0x3944a4a2,0xba8345f8,0x3b1694fe,0x3b0fb78a,0x3b0ebaff,0x3ae413f1,0x3a61e5f6,0x38848087,0xb9a6eba7,0xba211014,0xb9aef8d0,0xb922e181,0x39a0794c,0xb965014d,0xba142e61,0xba635ceb, +0xbaa6660f,0xbad7af96,0xbb0a0812,0xbb0ad64d,0xbb19e7bb,0xbb15a1e1,0xbaf5dba3,0xbaefc1cf,0xbb006296,0xbaa46c23,0xba2c200f,0xb98d8902,0x3a1957d5,0x3aa5c456,0x3b1af856,0x3b3e1b95,0x3b697833,0x3b82f441,0x3b727ab8,0x3b6c55e7,0x3b71a969,0x3b3cc3ea,0xba6cdc0d,0xbb1dcff1,0xbb2dd3f7, +0xbb403c76,0xbb435709,0xbb509314,0xbb66f1a7,0xbb83e0b2,0xbb6f78a2,0xbb5b0d8c,0xbb429805,0xbb24e805,0xbb05a745,0xbacf19ee,0xbadae3b3,0xbadf6eee,0xbae5f488,0xbaf3489a,0xbaf01653,0xbb14fbdb,0xbb0496bb,0xbb2e1102,0xbb455e24,0xbb3054e7,0xbb409906,0xbb6aa13f,0xbb5b9132,0xbb570f67, +0xbb39c87d,0xbb3c50ff,0xbb234f18,0xbb00ff3a,0xbb0314fe,0xbade0e22,0xbb018dd5,0xbb0bf72c,0xbb1b3732,0xbb21def3,0xbb1903b8,0xbb26d1fe,0xbb31f3b4,0xbb3c3897,0xbb4171bb,0xbb4d28a4,0xbb3d46f6,0xbb358ce8,0xbb2ec392,0xbb268eb8,0xbb20459e,0xbb14af72,0xbb1a61c2,0xbb1c5217,0xbb1e0368, +0xbb2369a6,0xbb231453,0xbb2a668b,0xbb318e63,0xbaf995e8,0xb9020fc8,0xbb4b0695,0xbb072e48,0xb84bff75,0x36f70fca,0xb7928843,0xb820372d,0x37ed016b,0x38247456,0x38cf7e12,0xbaae5c62,0xbb218c74,0x393f4140,0xbab45779,0xbb47c0e7,0x3b276334,0x3a66c7c4,0x3b512a09,0x3b16008c,0x3b2b57fe, +0x3b2dddd6,0x3b3699bc,0x3b375a07,0x3b2acae2,0x3b311758,0x3b342dee,0x3b3c47cd,0x3b3600c5,0x3b361396,0x3b362a73,0x3b454944,0x3b45ab4a,0x3b4090c3,0x3b2c1823,0x3b0fd20a,0x3b3bec95,0x3a4699cf,0xba9340bd,0xbb61d178,0x3ace77c3,0xba7ad325,0xbb716038,0xbb706dc8,0xbb74f9b9,0xbb667829, +0xbb7d9243,0xbb77b9ef,0xbb576cdf,0xba8c10d5,0x3ae077e0,0xbb534904,0xbab192ef,0xbb0676f6,0x3b3f33c7,0x3b3019e8,0x3b4428f1,0x3b5e5b47,0x3b7be628,0x3b7cde42,0x3b589b38,0x3b6680de,0x3b67f977,0x3b751eda,0x3b63ff4f,0x3b76cba4,0x3b8424de,0x3ba661d5,0x3ba982a0,0x3b9c0d0f,0x3b6c0686, +0x3b41b75e,0x3b1a7935,0xbac60396,0x3ad358f7,0x3acc933d,0x3aa7825b,0x3a2c189a,0x3a137c47,0x3a43cb65,0x3a1a4356,0xb9c54cd8,0xb701437d,0x3925ccd3,0xb70c88e1,0x39953daf,0xb9bfded9,0x39ed98ff,0x3ae34724,0x398eb09e,0x3b1bebc9,0x3b60b52a,0x3b713d45,0x3b8f0eef,0x3ba5764e,0x3ba774f1, +0x3b859ef7,0x3b8dba9a,0x3b95e6d5,0x3bb7dd66,0x3ba18a3e,0x3ba55e52,0x3ba249ce,0x3bd5f313,0x3bd75185,0x3bc2d4f3,0x3b78fc10,0x3b50945a,0x3a5d7f15,0x38808359,0x3a7dca2e,0x3a8f5ee5,0x3ab25ccd,0x39d011ef,0xba560a78,0xbac7e1eb,0xbaa69bcd,0xbb2ea6e9,0xbb4c4a02,0xbb55f75d,0xba6ad379, +0xba8da10c,0xb9e3b9be,0x3a12fb85,0x3a2e459f,0xba4ee24e,0x3b1687c8,0x3b3f4f6a,0x3b82eacb,0x3bbf760b,0x3be53f39,0x3be5d93a,0x3bb39b4c,0x3bae80c4,0x3bb48651,0x3bd902f1,0x3bad04ce,0x3bcf848b,0x3bf83c3c,0x3c373020,0x3c3d79a7,0x3c27c1e8,0x3bcec780,0x3b88bb68,0x3aca1ea0,0x394943f4, +0x3b302a5f,0x3b1fdc3e,0x3b4f2f66,0x3b0d0a87,0xb839b456,0xba77d6b6,0xbb1fa4d9,0xbb40f0b2,0xbbb7c435,0xbba44b74,0xbb2940e0,0xbb61462a,0xbb013164,0x3a922af2,0x394798d4,0xb9bd0788,0x3b6e31b2,0x3bd9b0ef,0x3bbc3d3c,0x3aec9e1b,0x3b46b9cb,0x3b2717d2,0x3a97a274,0x3b9ab3e9,0x3beb3789, +0x3bf30c18,0x3c3ac085,0x3c07524e,0xbaae4bf4,0xbb16db32,0xbb5f0559,0xbb0eb413,0xb9efc64e,0x3a65d38f,0xba20f6ae,0xbb1fa2d9,0xbae0459a,0xbb54483d,0xbb6e17b0,0xbb22d5bd,0x3b263831,0xba473ad9,0xbab7331e,0xba677569,0xb99d2d80,0x3b050124,0x3bb4ce1f,0x3ba4463c,0x3b4a16d1,0x399bfe5f, +0xb8b96e67,0x3bca025f,0x3b27d330,0xb974ec3a,0xbb6abf39,0xbbf70dc4,0xbb36277a,0x3a6e8383,0x3b3ccfd7,0x3b8324a5,0x39359ef0,0xbbe31a3d,0xbbe413f6,0xbb8416b9,0x3aa01cd5,0x3bd7c661,0x3c0acf19,0x3bfbd940,0x3ba49b38,0x3b923962,0x3b92e669,0x3b011375,0x3afff763,0x3a8dcf51,0x3af8484d, +0x39c9997a,0xbae41604,0xba9af799,0xb8b5ee96,0xb907b15b,0x39960051,0xbac72f84,0xbb9ae14a,0xbc11d618,0xbbc420e1,0x3aa66862,0x3be1dc61,0xbc8b17d1,0xbc497bea,0xbb5a2cf2,0x3b31313e,0x3c2eac57,0x3c28ecbb,0x3bef3777,0x3b30ea65,0xbb03a68a,0x3a70b083,0x3c35814b,0x3beda3b4,0x3b9459ff, +0x3b23820c,0x3a439574,0xba93906f,0xbb1fc618,0xba5c73a5,0x3a6a783d,0x3a7e92da,0x3a87cd9e,0x39e9ca93,0xbac4308a,0xbad8c57e,0xba9eae67,0xba8a7369,0x3908d533,0x3949dfb6,0xb8a51570,0xb8d6221f,0xb9a316a3,0x392fc90c,0xbb46c457,0xbb1bfeb3,0x3a243254,0xbc503479,0x3bd72b6d,0xba9f2003, +0x3b137ee0,0x3bb2de40,0x3c4ff967,0x3c0927ed,0x3ba7633f,0x3ac6f84b,0x3a07b3a5,0xba25deed,0xba6ff16e,0xb9f29848,0x3a4d4249,0x3a43f71c,0x3b4d7c10,0x3b9c414a,0x3bb4b464,0x3b860b42,0x3b3b2656,0x3aa02ea1,0x39d359c3,0x3adaf023,0x3b149e10,0x3aa98da3,0x39836658,0xb9fffd36,0xb99b2883, +0xb9372d47,0x39731df5,0x390925a3,0x3a0f479e,0x3b2dfdde,0x3b083140,0x3b25cdd6,0x3bb8739f,0x3c0b79bf,0xbb49388c,0x3b141bbb,0x3bf9e2cc,0x3bc8f1b0,0x3b87e851,0x3b5aa726,0x3b662e30,0x3b7531ff,0x3b71a954,0x3b9ba62e,0x3bc490df,0x3bb4e055,0x3b9f33c3,0x3b80c7bf,0x3b1529cb,0x39cb4c1f, +0xba93ee6b,0xbb2790f0,0xbb2ac120,0xbb17ff66,0xbb5e8895,0xbb0f4e42,0xbafc738e,0xba04f168,0x3912e568,0xb9d254ea,0xba2699a2,0xba51a023,0xba8f61d9,0xba2dd628,0xb996b303,0x38e049a7,0xb922faa0,0xba278d8a,0xbb218353,0xbaea72df,0xbb580379,0xbaa3e8d0,0xba193d07,0x38a73d37,0x3b230aec, +0x3ba16825,0x3bdd4fe0,0x3c0b1726,0x3be4acb3,0x3bc95ac4,0x3bc1c30a,0x3bc0e76b,0x3bb446e5,0x3b8c3f41,0x3b708bb2,0x3b3348e9,0x3ab010de,0x3a889060,0xb8022d2a,0xbac1784a,0xbadc576f,0xbacab9f9,0xbaccaa00,0xb9d2f426,0x39ae51b2,0x3a9b5816,0x3adcd74c,0x3abe4b1b,0x3a62e98d,0x3a31eed7, +0x39e8fbf9,0x398c1100,0x39531df0,0x39b81a2e,0x38745a1c,0xb759af11,0x3b7c7b52,0x3b9738ee,0x3bae04c1,0x3b9ab6de,0x3b8c7f46,0x3b77392a,0x3b741206,0x3b86fde7,0x3b7b8766,0x3b74b33f,0x3b6187ce,0x3b0cbee0,0x3a728ed5,0xb9a6a2cc,0xba0afe64,0xba61bebb,0xba9941b7,0xba7e0498,0xb9ed3d6a, +0xba24e73d,0xbab41cd4,0xbab4413b,0xbac3cd1e,0xba21a1ad,0xb9c257dc,0x3a11e2c9,0x3a35dc0f,0x3b1bf34f,0x3b25be19,0x3b61f21d,0x3b5fef01,0x3b8b534b,0x3b830948,0x3b7e14c8,0x3b61de51,0x3b7ea108,0xbb31158a,0xb9d98a5b,0xb9e19f9e,0xb971eb2e,0x39150365,0x39d111bf,0x39f59ae8,0x39e06832, +0xb8171a5a,0xb9f1355f,0xba37d673,0xba780460,0xba8bd7a9,0xbaa68fef,0xba9e315c,0xba9ffdd6,0xbaa1f00a,0xbab056e9,0xbace6806,0xbabbe568,0xbb1b08ed,0xbabf300a,0xbac57f00,0xbb03680d,0xbb1353a9,0xbafe02c4,0xbac3ae50,0xbab2d566,0xbadb791b,0xba643817,0xba079014,0xba26cffc,0xba0aa12a, +0xba8b9847,0xba790b34,0xb98bd2fb,0xba744a79,0x3987f6f6,0xb9390139,0xb8979cd0,0xb91d8439,0xb92ed729,0xb9032fd7,0x37b921a2,0xb8fc4d9a,0xb964ccdc,0xb9c5e85d,0xb9fb04fa,0xba1dc9cb,0xba45a80f,0xba44eb36,0xba4c78c8,0xba5345e8,0xba504770,0xba677188,0xba2f3abf,0xbab4d964,0xbb23b652, +0xbb85bbeb,0xba90b199,0xbb2827ff,0xbb933935,0xbb8c75cc,0xbb8442f3,0xbb6d6be5,0xbb6a2086,0xbb5db7e8,0xbb4773cc,0xbaea91dc,0xb99df8e2,0xbb63d963,0xbb0f384c,0xba0f472c,0xba7dc354,0x3a9e2381,0xbae5bfdb,0xba20b234,0xba2bb772,0xb951180e,0xba2395f3,0xba5b2b95,0xbaa22443,0xba922077, +0xba871df6,0xba49d22d,0xba55d93b,0xba4da174,0xba550139,0xba2ea2bc,0xba30f65d,0xba3f5204,0xba7fb149,0xba66381b,0xbaf0fc27,0x3a9deb43,0x3b3bd20c,0x3b85b8b5,0x3a092dbc,0x3b2d4840,0x3b632e65,0x3b6ea52b,0x3b6690e6,0x3b44fc0a,0x3b5acd45,0x3b63faa1,0x3b69fa86,0x3b1c3698,0xb7828b9c, +0x3b810879,0x3b49a7c0,0x3b4c0fc3,0xba94b34d,0xba4388f1,0x388cd0f7,0x3a8d2acb,0x39e68644,0xb92ed59a,0xbaabb6ae,0xbaa24fd7,0xba9a5c42,0xba2550a1,0xba5a53d8,0xba296f57,0xba162f1a,0x39380cdb,0x39b1bc07,0x3856ec26,0xb9d6c398,0xba88adc8,0xba5e7baa,0x3b43895c,0x39dcb575,0x3a6a2925, +0x3a88e1c4,0x3a8568bc,0xba436aef,0xba6d1be5,0xba879d94,0xb9f4708d,0xbae9a29c,0xbb0cfaf9,0xba78439f,0xba82cfa4,0x399b752d,0x3a419d22,0xba646aa4,0x3a85749e,0xb9f4374a,0xba25212f,0x3a890506,0x3b24b772,0x3abe9360,0x39ca20a1,0xbb07797d,0xbafab015,0xbaca3b13,0x3924e82f,0xb9159b21, +0x38c18122,0xb8f554fe,0x3a4d2229,0x3a5becd1,0x39988225,0xba322611,0xbaf14e72,0xba2e8e4b,0x3a8365ac,0x3a558e0e,0x3a0ba3eb,0x39e8b31a,0x3a96c785,0xbb08532e,0xba4809a4,0xbb5962b4,0xbb0a30fa,0xbb857135,0xbb206172,0xbad39c63,0xba52433c,0xb9aeec57,0x3a89ac24,0xb85440b7,0x395ac6e6, +0xba7b57ad,0xba33f992,0x3b1b982e,0x3bb35657,0x3b9455b3,0x3b371e3a,0xba954b90,0xbad4fc2f,0xbaca74af,0x39eb7024,0xb9f88398,0x397c67b6,0x3a572547,0x3b5a8555,0x3b7fc7d1,0x3b4b16bc,0x3a9ca1b1,0xba340545,0xb906ab16,0x3b15330e,0x3a7f743b,0x3b3482ea,0x3af0d1e4,0x3a8b2378,0xbaa6f147, +0xbaea8bd9,0xbb248bd0,0xbb5da8dd,0xbbbd35da,0xbbbaf52e,0xbb61bf02,0xbb800345,0xbb0a35c6,0xb78abaf8,0xbac11ad7,0x3b6c1235,0x3a427e4b,0x3a27535d,0x3977395a,0xbb7d8dca,0xbb5ef57e,0xbb8dcc4f,0xbbe7f343,0xbb837b30,0xbad3e5a3,0xba9a76fb,0x3b5e5ff1,0x3b0d7739,0xbb93fd2c,0xbbaa24b0, +0xbbdb1401,0xbc136323,0xbbd1fbc8,0xbbd2d53f,0xbb876196,0xbad83623,0xbb918941,0xbb8910e8,0xbb84d064,0xbb1161ba,0x3b23aacd,0xba533751,0xbaa738ca,0xba251c9b,0xb92d6e74,0x3b18f43d,0x3bc50a1f,0x3ba8079f,0x3b855336,0x3ad16d29,0x3b2c58eb,0x3bb0abb9,0xbacfd4ae,0xbb9fb3a0,0xbbb13fcb, +0xbbe61e65,0xbb838af0,0xb94cfdb8,0x3b4e8c8b,0x3b5cfeaa,0xb9d99bf4,0xbbe6d328,0xbbdf9913,0xbb8f0786,0xba329ee8,0x3b4e09b1,0x3b783d4b,0x3a900d0b,0x3ab843cb,0x3a6aba78,0x3b806df5,0x3b40b890,0x3afa947b,0x3ab5596e,0x3a7f85df,0xb9e75f8f,0xbb01feff,0xba9ce09a,0xb7935102,0xb8d9c6b9, +0x37e97606,0xbae93301,0xbbacc6d1,0xbc102937,0xbbe08644,0x3acd50b4,0x3b819beb,0xbc64c638,0xbc2ede1d,0xbb9caf9d,0xba74d9ea,0x3b8b30dc,0x3acdbfc3,0xbb54907a,0xbbfc15fa,0xbc543409,0xbc0a2f33,0x3b87c02f,0xbad49ac8,0xbba3fe0f,0xbbdca5b8,0xbbdefc9d,0xbbbd0153,0xbb7e9aa7,0xbb02f2fe, +0xbb0ee9c8,0xbaae94cb,0xb8477b27,0xba86ee3b,0xbac82385,0xbb0703de,0xbab22a6d,0xba6a8656,0x38828378,0x3913fd6a,0xb888be9d,0xb69cd01c,0xb98e1896,0xb9e2914b,0xbb183ebf,0xbb139dc3,0x3a599fc3,0xbc39e448,0x3ba59feb,0xbaec58db,0xba841763,0x39ad520e,0x3a8b7818,0x39ec9bed,0xb9a84971, +0xbb102529,0xb96d6fbb,0xb9d936e0,0xba020e64,0xba879e06,0xb9b862cd,0xba331ed0,0x3a1e3d48,0x3aa64315,0x3a8dc043,0x3a1327f7,0x39776c9c,0x3a309952,0x3b021bbf,0x3ad6cf6b,0x3aff94e9,0x3a93d568,0x38757c80,0xba3fcdf1,0xb9d57aae,0xb8870176,0x3977141a,0x38e68dac,0x39da3d7d,0x3ad9251e, +0x3aa7d7c8,0x3a8d417c,0x3bb1b901,0x3bd8e818,0x3ad455c4,0x3ae92627,0x3950df85,0xba3fc3fa,0xbb7ac500,0xbb84722a,0xbb81afa7,0xbb5f411a,0xbae328eb,0xb7134f5f,0x3ad22017,0x3b0b0663,0x3b075e14,0x3ad0da65,0x3a90a604,0xb77e79fa,0xbae27c83,0xbb0f1760,0xbb436422,0xbb53b1c0,0xbb282ec2, +0xbb2fc9d0,0xbad27bf7,0xb9be1b05,0x366cd491,0xba10adb8,0xba20c4e0,0xba70dd34,0xba37b155,0xba421fc6,0xb97b7f64,0x3892f9ef,0x3994c5bc,0xb7050854,0xba5af026,0xbabfbabb,0x39e29db7,0xbb316eb4,0xbba36819,0xbb5567a8,0xbae8320d,0x385a96b0,0x3a8eb306,0x3af67691,0x3b7601f6,0x3b9f5421, +0x3bb496c7,0x3ba14aad,0x3b8ba531,0x3b468981,0x3b15c8ad,0x3a8ddf68,0xba070a89,0xba7c1860,0xbac6c753,0xbabceb31,0xbaeab28d,0xbae62848,0xba834028,0xb9e99c4e,0x395a3f7a,0x3a8d94b7,0x3a8be4f3,0x3a60af1a,0xb947a6a2,0xb8e708a5,0xb935e133,0xb9d0c1a3,0xb9616587,0xb9ecf9e3,0xb93394ce, +0xba8f195d,0x3b8592bd,0x3b60a7ff,0x3b3d851d,0x3b397134,0x3b08e261,0x3ad1b38c,0x3ab2993d,0x3a990998,0x3a9c2cb8,0x3a8e2539,0x3a98acbe,0x398c89f0,0xb9f896c2,0xba99c6c8,0xbabacc46,0xbad99423,0xbb031c35,0xbaea1706,0xbb03e1ea,0xbac4457c,0xba5438c5,0xba8f378d,0xbab770bc,0xba1724fd, +0x398e1871,0x3a5a6651,0x3add8b4d,0x3b087649,0x3b60de97,0x3b53bd18,0x3b78bc0e,0x3b7aaff9,0x3b811c53,0x3b8d5dfd,0x3b9ad4f0,0x3b830cab,0x39e2b5a8,0xba48391c,0xba917bf9,0xbaa8d50b,0xbabd9f37,0xbae2c874,0xbb0b99d4,0xbb2606c7,0xbb26721a,0xbb25229c,0xbb1cff1c,0xbb11865a,0xbafce5d6, +0xbad4b3b8,0xbadbd9e7,0xbae3a120,0xbaef3244,0xbafccf7f,0xbb0687e9,0xbb1b8527,0xbac68e62,0xbb16848c,0xbb117564,0xbb08b35b,0xbb0a03de,0xbb2c2e4c,0xbb235d59,0xbb0c82e1,0xbac6b0fe,0xbadc4c96,0xbab9b1be,0xba3bdccd,0xba4f7de2,0xb9ecc45c,0xba0aa4c2,0xba61cbe3,0xba2de748,0xbadf8c93, +0xbacceac9,0xbae84dbe,0xbafdf8fd,0xbb06101a,0xbb0a9f30,0xbb13f6f2,0xbb10a39f,0xbb1141d5,0xbb13350a,0xbb11ed05,0xbb130278,0xbb1156f8,0xbb13ed2b,0xbb142e0b,0xbb143de8,0xbb16bf59,0xbb1288a0,0xbb25bc0b,0xbabf6ee1,0xba050dda,0x3981749f,0xbae68de8,0xb9fc874b,0x3990fbd9,0x39fd41f1, +0x3a06dd68,0x39e97b85,0x3a4235d0,0x3a58132a,0x3a750db1,0x39970404,0xba7247e7,0x3a3d5daf,0x3998d70f,0xbb2779b7,0x3a8ef84e,0xba9ab719,0x3af1fcc4,0x3a8cbe67,0x3aa02d82,0x3ab50183,0x3a9e51ad,0x3a939db9,0x3a7454fd,0x3a827733,0x3a8f5d75,0x3abd2c4a,0x3aa5a6d2,0x3aa36a36,0x3a984339, +0x3abe6797,0x3ac2a19a,0x3aba41e4,0x3a98c8a0,0x3a75b0eb,0x3ac731a6,0xbaa47366,0xbb0f1365,0xbae56384,0xba337328,0xbb1139c5,0xbb125d13,0xbb1afad7,0xbb2384fa,0xbb17133f,0xbb3647c4,0xbb339548,0xbb241a40,0xbb156ae1,0xba07dd74,0xbaebe194,0xbb1ecf29,0xbb1e27f0,0x3a8507d5,0x3ab71847, +0x3ab84ea4,0x3b062302,0x3ae1aebc,0x3ab508a7,0x3a5ffb1e,0x3a849761,0x3aa7d0e9,0x3b069f27,0x3ad926eb,0x3af1c3a9,0x3af305cd,0x3b40f787,0x3b48bca7,0x3b31fd3e,0x3aedf8cb,0x3adb53f9,0x3a5a91c8,0xbabf9162,0x3a1d20f0,0xb8e58424,0x39860687,0xb99ef028,0xba8265c8,0xb9ffd1ff,0xba6c17d8, +0xbaefa689,0xba9c8718,0xba55359b,0xbab3289e,0xba3e3bc4,0xba90f9ae,0xba9aa2c4,0x393dd6b9,0xba98cd54,0x3a9a7702,0x3b175ab6,0x3b0768a8,0x3b52b4de,0x3b1d516d,0x3ae2557f,0x3a4e3534,0x3a3efab5,0x3aaa5144,0x3b61d002,0x3b220975,0x3b2717de,0x3afed71d,0x3b7278df,0x3b7b9c25,0x3b5a6d23, +0x3ae9636c,0x3adb9ad1,0xb8ad3b13,0xba6d02c8,0x37ef3475,0xb93e9d2e,0x394579af,0xba041dec,0xbb00849e,0xbb09e718,0xbaf261b3,0xbb7041a7,0xbb5141f9,0xbb64b44a,0xbb0e6225,0xbaad6fe4,0xba630494,0xba6b48e7,0xba043dff,0xbb08d795,0x3a5b6ac4,0x3ad94254,0x3b135cab,0x3b9bcf13,0x3b721b8a, +0x3b17f41c,0x3a5b9861,0x3a0ff102,0x3acc57ba,0x3b937c03,0x3b340490,0x3b4e72df,0x3b62e98f,0x3be262f3,0x3bf82f71,0x3bd9d5b1,0x3b80d838,0x3b534175,0x3aadf931,0x3a1394ca,0x3b285a67,0x3a9d23ff,0x3b0c2c09,0x3ac56260,0xba8b25d9,0xbad97fdf,0xbb313a45,0xbb288e7c,0xbbb84d7f,0xbba71b94, +0xbb72fc4a,0xbb53498f,0xbb0f5811,0xba4e4c98,0xba9e3d44,0x3926977b,0x3b3f8fb1,0x3bdc6915,0x3ba0161d,0xb6cd3759,0x3a3c0b0a,0xb94ef289,0xbb17c2d7,0x3a8d3259,0x3b57439d,0x3b75ba3b,0x3c07a05a,0x3be08a47,0xba00873d,0xbb1ac9e6,0xbb8a68a3,0xbb88d595,0xbb69713b,0xbb4c0dcf,0xbba95688, +0xbbb90516,0xbb7b91d8,0xbb98d180,0xbb68f07d,0xbb0f5326,0x3b122a89,0xba199c1f,0xba71398e,0xb9911e33,0x390f3ebf,0x3b2ccb0c,0x3bbf2808,0x3baccb8f,0x3b5281d6,0x3a489981,0x39ff33ce,0x3b19a6d4,0x37406852,0xba2981ca,0xbb7e1c31,0xbbd72a0f,0xbbc31822,0xbb3bdc14,0x3aa4478b,0x3b5f3b28, +0x3a891cfe,0xbbb2f39d,0xbbedea44,0xbbb6d0eb,0xbad64dbf,0x3b87411d,0x3bcbd435,0x3b9651ff,0x3b61010c,0x3b71a4e8,0x3b786573,0x3ad3d5be,0x3ab9cdd9,0x3a71adce,0x3ae4ee91,0x39be4b78,0xbaf211d4,0xba80ca13,0x389b4c7f,0xb8b7302a,0x388360c9,0xbaee7777,0xbb9e0f96,0xbc10aee1,0xbbbc12f0, +0x3ae5ea1c,0x3b8e8511,0xbc4a4013,0xbc03eca0,0xbba868df,0xba9dc110,0x3bef318b,0x3b8fff88,0x3a93a38b,0xbad8437c,0xbbc06375,0xbb253f2c,0x3c0654ec,0x3ba1b8c7,0x3af923f4,0xbac2fdda,0xbb0575e7,0xbb3b07ad,0xbb4f15c7,0xbad88325,0xb9629ddb,0xbaaf3b8c,0xba664095,0xba395040,0xbb12a5bd, +0xbb148a0b,0xbab984d0,0xba1f9bf2,0x392bb23b,0x38ec486b,0xb904bc81,0x38c3b899,0xb996d6e4,0xba969656,0xbb1c2a16,0xbade0b96,0xbac6b2e9,0xbc227f2a,0x3b25ab3c,0xbb1ffcb2,0x3a79e999,0x3b01da8f,0x3b9e9186,0x3b8af4ad,0x3b3d8ac8,0x3a401a46,0xba45b3fd,0xbb02f7c9,0xbaf6bf14,0xbb0eb97b, +0xba94bdf8,0xba73bb74,0x3aa62d89,0x3b32daeb,0x3b56537c,0x3b37f4d9,0x3b302249,0x3ab7eb98,0x3a5eb863,0x3ade0782,0x3b0b6894,0x3a9266b6,0x37bdc607,0xba363edd,0xb9a27ee7,0x37a77bf7,0x3977d8ec,0x38cf9f9c,0x3a117c4d,0x3af85f0f,0x3a20a451,0x3a81dc4a,0x3b968a22,0x3baaaa87,0xbaf8a54f, +0xb825ed72,0x3b171414,0x3a5d5ac9,0xba9226bb,0xbb201b8c,0xbb113793,0xba97ffc9,0xba20f783,0x39fd7795,0x3aac1b8f,0x3add2b62,0x3af0309a,0x3acc0f15,0x3a81d41f,0xb8bd93ba,0xba998fd0,0xbb0ed3de,0xbb1665b4,0xbb25bc83,0xbb5ba6d4,0xbafd6a9d,0xba7fdcdb,0xb90e38c4,0x398fe984,0xb9c6522b, +0xba1b6fb6,0xba22ee71,0xba2c3465,0xb9f7ad64,0xba01d822,0xba4add3f,0xb9638111,0xba144737,0xbaea6b7a,0xbb16b2e8,0xbb8c3681,0xbb90fe0d,0xbb69fa4e,0xbb2d4e0f,0xb9a8266a,0x3afdd950,0x3b658d53,0x3b94c27e,0x3babea83,0x3bbf5453,0x3bd0b220,0x3bc1595b,0x3ba4b921,0x3b6c40bb,0x3b3b3243, +0x3afb6897,0x3a7123db,0x39b0dea8,0xba15cd13,0xbae38d08,0xbb0314cc,0xbaebaa9f,0xbae81862,0xb9c6cb48,0x3a08cb4c,0x3a9e5588,0x3a87a42d,0x39fa7c29,0x38873f71,0xb8d61ccf,0xb90c8687,0xb9a88832,0xb9d5f999,0xba504b22,0xbaa645b3,0xbb105d04,0x3b46cd50,0x3b7d48eb,0x3b8fe08e,0x3b794e88, +0x3b686fd6,0x3b451bf1,0x3b417f9c,0x3b4c7208,0x3b31a4fd,0x3b172156,0x3affa4d5,0x3a89a2d3,0x3996ce50,0xba206811,0xba364085,0xba729ed5,0xba90b4de,0xba884f97,0xba161ff9,0xba7a843a,0xbacafa49,0xbaa4bd2b,0xbaa2f129,0xb95e8ba1,0x3996e55d,0x3ac083ce,0x3acf5400,0x3b3b4363,0x3b34e523, +0x3b5899b7,0x3b3dd70f,0x3b534db0,0x3b4a7f6e,0x3b49245e,0x3b38b751,0x3b4b88cf,0xba974895,0x39a9d696,0x39ad1bba,0x3971e456,0x39b2bbfb,0x399d1bc4,0x39196450,0xb87f2104,0xb997343e,0xb9e3b256,0xba0b194c,0xba38945b,0xba6548fa,0xba97900e,0xba922759,0xba9472a3,0xba937b4b,0xbaa3c7ec, +0xbaafc5f7,0xbab98bf0,0xbb1e00ac,0xbadc822a,0xbb0395c1,0xbb0c5880,0xbb266b65,0xbb20bcba,0xbafc3137,0xbaf69136,0xbaff73e1,0xba853963,0xb9a9a92b,0xb9830d7f,0xb8aa17e3,0xb9c9dd8e,0xb9c0f92c,0x39a1db6b,0xbac19876,0x391dc0df,0xb99afa5c,0xb9a6c69a,0xb9daa572,0xb9f7dbb3,0xb9fcdbf5, +0xb9f61cb5,0xba11314c,0xba2fc862,0xba556803,0xba6c81e4,0xba803a06,0xba8d2a35,0xba8a8df3,0xba8d4881,0xba8e9d94,0xba8d7110,0xba94960e,0xba58e7bc,0xbb0d76b5,0xbb3fcf97,0xbb47cf89,0xbb03170d,0xbb478448,0xbb59dcab,0xbb4f8d01,0xbb401f50,0xbb26be8c,0xbb2a0163,0xbb211a90,0xbb0b4c75, +0xbb050369,0xba852c53,0xbb0a94a4,0xbb106323,0xba97b658,0x3a2a6916,0x3b234a8f,0x396fcc08,0x3a384b13,0x3a5aa321,0x3a90cec2,0x3a9533a1,0x3a88cc02,0x3a16c642,0x3a2afd2c,0x3a3789fc,0x3a84b59b,0x3a633c7d,0x3a662c43,0x3a57246d,0x3a85447a,0x3a848e9d,0x3a72aa07,0x3a3dab36,0x3a1d98b5, +0x38ee014a,0x3b1d81d1,0x3b280806,0x3a71248b,0x3b0884ee,0x3b2415d7,0x3a230077,0x3a72b2a1,0x3a62282a,0x39ff13d8,0x3a75d323,0x3a9021fa,0x3a9061c7,0x3b1ea498,0x3af66ddd,0x3a7aab35,0x3b3380ae,0x3b09311d,0x3a798200,0x39f11717,0x3aaf4c7b,0x3b0744a9,0x3b29125b,0x3b187b18,0x3a855c07, +0x3a8df0e3,0x3a92d895,0x3af071a2,0x3aaaaabe,0x3ab1c5f5,0x3ab57caa,0x3b168ee1,0x3b287d6b,0x3b15d79a,0x3af44c39,0x3a8a4018,0x3aac8d98,0x3b0c8d38,0x3aa8959c,0x3adac127,0x3aae8377,0x3a96e221,0x39313708,0x396fae81,0x3a051d65,0x3a02ab3c,0xb8a38de5,0xba25cd29,0xba066546,0x3909b9e9, +0x3a368f8f,0x3a5d9228,0x3a0f43cf,0x3b0673ab,0x3ab90d3f,0x3a2b5850,0x3b11e2dd,0x3b4d0e38,0x3b884350,0x3b806690,0x3a9b42eb,0x3aa3194c,0x3ab0e9b4,0x3b584f07,0x3b2046ff,0x3b2809b6,0x3b16cba2,0x3b622cf6,0x3b6b1f70,0x3b4140a1,0x3af27a40,0x3a328d51,0x3a69589c,0x3ad66d52,0x3aa2f7a2, +0x3a04754d,0x3a3b09d1,0x3a897b4b,0xbaeabfeb,0xba5acb16,0xbb2c3477,0xbb10ae5c,0xbb5f9802,0xbb00effc,0xbaf6c669,0xb92b952e,0x39bb3b05,0x3a28f7ee,0x3a848814,0x3a2df4ad,0x3a02bac9,0xb9de26b6,0x3b1e35d0,0x3ba01843,0x3be8f06a,0x3bd9471d,0x3b26f453,0x3b0e271a,0x3b1c8d95,0x3b9b5ecb, +0x3b42f09c,0x3b50e43e,0x3b73c45d,0x3bdd84a5,0x3bfe5ff1,0x3be35586,0x3ba23644,0x3b2d2894,0x3b153c61,0x3b37de31,0x3ad45599,0x3adf1ad2,0x3ac87cb5,0x3a4e3c8f,0xbb0784c6,0xbb052874,0xbb2cfdd1,0xbb4d5ba8,0xbbae94e8,0xbbadf89b,0xbb934458,0xbb52eaf9,0xbab77526,0xbab73afe,0xba3cd763, +0x3bcc983f,0x3ba4b469,0x3bc16893,0x3ba39444,0xb980af00,0x3aa8523c,0x3a73cb29,0xba8d1ef6,0xb9c671a7,0x38aacbe2,0xb93f22c5,0x3b688c1d,0x3b368ec1,0xbb4c49db,0xbb86d11a,0xbbc08d8d,0xbc0abc57,0xbbc0143a,0xbbb3cc8c,0xbb8d7980,0xbb64aa9b,0xbb9f730f,0xbb928623,0xbb4a296f,0xbab19550, +0x3b07b595,0xb9d5bf76,0xba0525f7,0x393ba8ca,0x3a29a031,0x3b4c5482,0x3bcd8db2,0x3bbc583b,0x3b9f7b5b,0x3b3eac52,0x3ba59752,0x3b6c39fc,0xba9f2f2c,0xbb91b2c2,0xbb910aab,0xbbc41fe6,0xbb8df798,0xba5c5bc6,0x3b3dae19,0x3b8a5c76,0x3ad21ef5,0xbb9dda82,0xbbdaac79,0xbba9b6f6,0xbab2b0a0, +0x3b744549,0x3bd3667d,0x3bbe69dc,0x3bb46446,0x3b830b92,0x3b9a423d,0x3b294b8d,0x3ad80e05,0x3ae98b0a,0x3ab0f07b,0x374b8937,0xbaec52fe,0xba75cd13,0x38dc90c2,0xb94de05b,0xb93370bf,0xbaf6e4de,0xbb9caeba,0xbc03ee3e,0xbbaea9aa,0x3b4769f2,0x3b61b0fa,0xbc19af7f,0xbbbd41ca,0xbbb03211, +0xba3a0661,0x3c44b83b,0x3c142380,0x3bb4f468,0x3af53355,0xbbf1e487,0xbbca2695,0x3ba733f1,0x3b603580,0x3acfd834,0xbae64b87,0xbb2a61c3,0xbb6393a6,0xbb79bed4,0xbb0ebe0d,0xbb1201c6,0xbac00a6d,0xb86b5b44,0xba802f26,0xbac1e9e2,0xbaebd1cb,0xba92b4cb,0xb9c463ef,0x39925325,0x38b2115e, +0xb823a047,0x397069dc,0xb77e0ea0,0xbaaac6be,0xba77c41c,0xba963f57,0xbadf85a0,0xbc08a227,0x3aaca248,0xba0cde8f,0x3b90058e,0x3bf49a73,0x3c1b716e,0x3c1bd413,0x3be4b102,0x3a5f636a,0x3ab30f8c,0x3a3832a5,0x3aa310d0,0x38f5d9db,0x3a026638,0x386be548,0x3b0abbe7,0x3b587085,0x3b4af085, +0x3b3fe12f,0x3b0d7b05,0x3ae63ba9,0x3b12baa4,0x3b072eee,0x3b11ca3f,0x3a9d0cba,0x390dd991,0xba2b908b,0xb99ebf43,0x38a1a827,0x38672891,0xb8095e85,0x39bf0cae,0x3a82722f,0x3890b9c9,0x3990cb9f,0x3b6e4b77,0x3b3518b6,0x3b0043ba,0x3b94a52f,0x3bcd249a,0x3bb0ff32,0x3af5774e,0x3a7eb34a, +0x3973a420,0xb9878d43,0x39ac24b5,0x3abcfcb4,0x3b6dd947,0x3b60e4f5,0x3b57f1c0,0x3b45df62,0x3ad7c050,0x397a17a3,0xbaa6c267,0xbad73c76,0xbb050946,0xbb05de17,0xbac8fa3f,0xbaa4714f,0xb9f0d886,0x390d9257,0x39a2d6cc,0xb94863c9,0xb9e58c06,0xb9f37e69,0xb8d8ae48,0xb94d91b3,0xb825e254, +0xb952ff51,0x3a00431e,0x39e19a8d,0xb91e3df6,0x3a40186b,0xbaf96ab1,0xbb17140a,0xbb496e0f,0xbb0bd191,0xba8e7546,0x394f8e58,0x3a95bbb5,0x3b2abfa3,0x3b6d8f7b,0x3b949b01,0x3bac3d2c,0x3bb15b23,0x3bacb1c4,0x3b8fb437,0x3b74535b,0x3b255123,0x3a3513db,0xb97da3d0,0xbaab515e,0xbaf97f44, +0xbb040951,0xbad26536,0xb9e633f1,0x39b0cbd4,0x3a3d3e0a,0x3a9c24de,0x3a3a9674,0x396c98a8,0xba08b13c,0xb99f868e,0xb9261bc3,0xb98be33a,0xb9a3af3d,0xb9e83ee3,0xba2d30ff,0xba895bbd,0x3b910f90,0x3b7905db,0x3b5615f3,0x3b623045,0x3b50002b,0x3b507c00,0x3b55d73e,0x3b60defc,0x3b4a85b6, +0x3b31fa26,0x3b1a2c13,0x3a953b83,0x38299f49,0xba8a59a6,0xba977b55,0xbaaae0f2,0xbac5315c,0xba93416f,0xba8b8758,0xba06a965,0xb918bfb1,0xba0d082d,0xba63c75c,0x37f15b81,0x3a663513,0x3aecb1a7,0x3b1517b0,0x3b323970,0x3b6ccaab,0x3b490804,0x3b4c9a0e,0x3b3ebd44,0x3b548c61,0x3b78299b, +0x3b870ed5,0x3b7fe20b,0x3a744ee7,0x3aa50184,0x3a7b3d45,0x3a6fbe87,0x3a4387d3,0x3a091e41,0x3969a14f,0x38237f68,0xb9ee2ead,0xba5b6cdd,0xba8e9cfb,0xbaafd639,0xbabc5589,0xbac9e4e3,0xbac6a585,0xbacd228e,0xbad7abd7,0xbae57354,0xbb02a506,0xbb06ac7e,0xbababff3,0xbacde413,0xba992fb3, +0xbaaa7149,0xba9cd1e3,0xbaa01222,0xba8e5034,0xba26cd3f,0xb975b758,0xb8f7aae5,0x39020846,0x3a13b9fc,0x3a1c917e,0x3a28c395,0x3a5d5d6a,0x3a579357,0x3a199373,0xb9849600,0xb9b3b4b1,0xb9e44d02,0xba0f1511,0xba1a1b97,0xba2588c9,0xba2ee5bc,0xba5d725a,0xba82ca60,0xba9ba947,0xbaab93a9, +0xbabefd81,0xbad5c4d9,0xbad28df0,0xbad1df5b,0xbad027e1,0xbacdbc35,0xbac6712c,0xbae25ba4,0xba0e013e,0xb9765d6f,0xba83559d,0xb9eb1dd5,0xb6a81ce9,0xba884cf2,0xba48aa03,0xba24ed29,0xba181bcf,0xb9831708,0xb8d82abb,0x38e402b4,0x3a442515,0x3a095668,0xb9843831,0x3a384250,0xbab7dc19, +0xba30f936,0xbadb87d6,0xb9cbd08d,0xb9cebe64,0xb9e9915c,0xb909567d,0xba101986,0xba408e10,0xba86d0fa,0xba79bc6e,0xba5779df,0xb9a9b1ef,0xba0d03bc,0xba10d038,0xba31e69e,0xb9d60e78,0xb9c45707,0xb9e2ab1d,0xba2029bb,0xba166ff9,0xba1f6567,0xbadd552d,0xba894109,0x3abe0dfa,0xbae8b028, +0xbaa97643,0x3a494bd7,0x3a2fa068,0x3a03a328,0x39baec81,0x3946d8a8,0x3975e1ea,0x391d08ea,0xbab081ea,0xbaea598c,0x3a99ed74,0xba91fa20,0xba2fd014,0xba892aaa,0xb9ada0b6,0xb9842290,0x3a1f0e9b,0xb971b686,0xba671afd,0xbad8eeaa,0xbac9b935,0xba96a920,0x3721f397,0xba08d0a9,0xb9f58b59, +0xba1d450b,0x39b977fe,0x3a09d673,0x398a32d8,0xb93eca24,0xb908e6b2,0xba3ab452,0x39419d9f,0xb97ac223,0xba74ae21,0xb9a1e996,0xba1d2894,0xbb007019,0xbab367fe,0xbaeaaf09,0xbb15b65f,0xbb00a5af,0xbae3ad08,0xbb0e370c,0xbab78496,0xba86c25c,0xbadafcf9,0xbaaad8c3,0xbaae8480,0xb9146650, +0x39c650c5,0x39f0f514,0x3af54344,0x3953d873,0xba888764,0xbb27bbd8,0xbb2ec012,0xbb010d0e,0x3a638b83,0xb962bcbb,0xb91f1c34,0xba6e2e09,0x3a1b8c7d,0x3a4a3fc2,0x39a16a33,0xb9df52c5,0xba0a2c7d,0xba40de72,0xba6007e9,0xb9f10bf6,0xba6a2dd8,0xba3f288a,0xba31a578,0xbb3b324f,0xbb03763b, +0xbb301e6b,0xbb865997,0xbb5beb33,0xbb483ea5,0xbb4c5e34,0xba945f80,0xba558a79,0xbaae0eb7,0xba94ab84,0xbb10bac9,0xba57a396,0xb980f7ab,0x3a49eeab,0x3b70a098,0x3acbd182,0xba4c2b44,0xbb531393,0xbb6751dc,0xbb0cb7d6,0x3af3922f,0xb93a52b2,0xb9e6e742,0xba2129be,0x3b15610c,0x3b51b1f3, +0x3b2b998a,0x3abbc959,0x3ab4cd3d,0x3a7cd2d1,0x3ab973d6,0x3adb8f66,0x39e0e828,0x3a54545a,0x3a09fb00,0xbb0c9bb1,0xbb01be10,0xbb2003a7,0xbb2376c7,0xbba282b6,0xbb9a63a1,0xbb978fc5,0xbb3ead89,0xbb0580ca,0xbb1796c7,0xbb1ae8f2,0x3b17b918,0x3b181dc3,0x3ba1a54f,0x3b43424a,0xbaf369e9, +0xbb01e1ab,0xbb5018ab,0xbbad6a0a,0xbb4fc421,0xbadc7eee,0xba920e73,0x3b56cc20,0x3b6eed2f,0xb9a27bcd,0xbb48406a,0xbbb354df,0xbbed3e9a,0xbbe41095,0xbbed11e8,0xbc011667,0xbbd8ab5e,0xbbb71235,0xbbb11b02,0xbb3fdca7,0xbaa8421e,0x3ae2bb96,0xb95122cf,0xb959fdd2,0x39eb9ce2,0x3a42892c, +0x3b439fd2,0x3bb05a88,0x3ba85beb,0x3b78a008,0x3b0137dd,0x3b0e2c65,0xb96bcc69,0xbb1f0e34,0xbb140ba0,0xbb8cdc32,0xbbb496fb,0xbbf01237,0xbb951755,0x3a4e787a,0x3b42062a,0x3ad9acb4,0xbb815de8,0xbbe38348,0xbbd09d0c,0xbb62fe50,0x3a8ae344,0x3b422c7c,0x3aa30bab,0x3b01f20c,0x3b1fd159, +0x3b47ab56,0x3ad564f9,0x3a8022b5,0x3a568ab0,0x3a926146,0xb70ef176,0xbae2fa73,0xba3c0f46,0x38f95dd1,0xb982ede2,0xb9701098,0xbaf181b5,0xbb8f9000,0xbbfa8c1b,0xbba99f11,0x3b07f963,0x3acb176c,0xbbfdeb0e,0xbb96f2d1,0xbbd3b0bf,0xbb7f998e,0x3b8f6b98,0xba18e0a8,0xbb859ba4,0xbbb4e396, +0xbc25d8c6,0xbbe6a1a3,0x3b554ea3,0x3ab6b1d8,0xbaa92cf6,0xbbb94be3,0xbba84693,0xbb979154,0xbb6ff076,0xbb1f251d,0xbaf86891,0xbb4d1754,0xbb0af61b,0xbadcc730,0xbb1da343,0xbb1c33cf,0xbaa50e40,0xb92272f9,0x3999c496,0x38096b7e,0xb6bd94d4,0x39922a10,0x38fe7748,0xbaea7789,0xba4f6b20, +0xba34ab8d,0xbb7f07cd,0xbbe97c82,0xba650062,0x39518732,0x3aa430c9,0xba0a0589,0xbb5bc756,0x394db209,0x3aa0c458,0x3a0cd773,0xba8cdc13,0xbb1e4747,0xbb020c4e,0xbb4155f2,0xbb0fdb4c,0xbae82201,0xb9bb0e96,0x39c884e0,0x3a16060a,0x3a8c3b92,0x3aedc77d,0x3ac4a2bd,0x3ada96c8,0x3adce46d, +0x3af7cf76,0x3a62160c,0xb8a625eb,0xba25c57f,0xb95e418f,0x38a870eb,0x380c43b0,0xb8fa9b14,0x39a42970,0x3a380584,0xb9dbf794,0xba237fc2,0x3b00d5d5,0x39ceb402,0x3a536ba2,0xba77a959,0xbb16ba84,0xbb469256,0xbbac6702,0xbbdb52c8,0xbbe451fc,0xbbbcc69a,0xbb92b040,0xbb552324,0xbb224ed9, +0xbab15a71,0xba1a4711,0xb9608ab0,0xb7805047,0xb9a804c6,0xba832765,0xbac6445c,0xbafbcb0b,0xbb252bce,0xbb205f36,0xbabd3665,0xb8af37fa,0x39590bb7,0x39986dc9,0xb9979cf5,0xb9cefa1e,0xb98f9b89,0xb82678c1,0xb8ecba5e,0xb99f1583,0xba826752,0xb95dae55,0xb93b57c6,0xb89b908d,0xbaa6703f, +0xbb50e419,0xbbb7f67a,0xbbafb3b6,0xbb91857e,0xbb507de5,0xbae8f110,0xba4ad01d,0xb99c8190,0x3b261c78,0x3b90cec9,0x3bb7798f,0x3ba22ac6,0x3b829fbf,0x3b31d152,0x3af749b7,0x3a67a68e,0xb890b420,0xba5ee75f,0xbab77bc6,0xbae9f852,0xbb08465e,0xbaebb449,0xbab5b0bf,0xb96c1a47,0x3a1149d2, +0x3a712e75,0x398bd3bc,0xb99bf04f,0xba1978c9,0xba24aacc,0xba0b329e,0xba4ee2b7,0xba576e3b,0xbaccc6da,0xbb021601,0xbb5d0f38,0x3aff4d1d,0x3b09e2a0,0x3b05191e,0x3aedfd1d,0x3ade6c6e,0x3ac2e142,0x3ac75d6c,0x3ac4c712,0x3a9d4a75,0x3a44cfb4,0x3a16ecdf,0x36f78f59,0xb9c6b532,0xba6f8eae, +0xba80d3f7,0xba94ef48,0xbaa62e30,0xbaa152fe,0xba8e379c,0xbaa8c7b2,0xba9f988a,0xba70f880,0xba6435b7,0x38bd457d,0x3a6c504b,0x3b0791b0,0x3b162674,0x3b311546,0x3b388f03,0x3b2bcec7,0x3b0d6b44,0x3aee820a,0x3afbbfb0,0x3b0a4970,0x3b11bf8c,0x3b0426f1,0x3a9a528e,0x3a897f2f,0x3a71b6b1, +0x3a0dc406,0x398ddfb9,0xb8dff32d,0xba059fa3,0xba64dfd1,0xba70bdaa,0xba647f55,0xba60bd73,0xba705350,0xba85e662,0xbaa00943,0xba9f50a5,0xbaa2d033,0xbaa3cb8d,0xbab3765c,0xbab1d40b,0xbad8a68d,0xbb004011,0xbaec2245,0xbb06e74d,0xbae6b096,0xbb06157e,0xbb10c6d4,0xbaee01e1,0xbade9c65, +0xbab0b5b2,0xba47505b,0xb79dbd8f,0x39b987dc,0x39fefa3f,0x3a13ea27,0x3a0a5d11,0x3a55bd10,0xbaabffe4,0xb9eb729e,0xba2fc2aa,0xba5b6d1b,0xba791f56,0xba8a54ef,0xba95822a,0xbaa919a3,0xbaaaa3f7,0xbab7854d,0xbac4dea9,0xbacc159c,0xbad0a2e5,0xbad5d054,0xbad37d75,0xbad4d85c,0xbad3e710, +0xbad4a784,0xbad2c097,0xbabf4845,0xbb163981,0xbb0e27b3,0xba85f38c,0xbb137465,0xbb0c0c96,0xba75840d,0xba59202c,0xba37679e,0xba0b75df,0xba0cd020,0xb9f92020,0xb984ac47,0xba93352e,0xbaa119a7,0x385359a0,0xba89f6fe,0xbafc04e5,0x3aee4336,0x3afa666a,0x3b08ef86,0x3ad7a744,0x3af6b737, +0x3aff68f0,0x3b139429,0x3b133194,0x3aef9491,0x3af62d04,0x3afc36f7,0x3b179a3d,0x3b06bdd3,0x3b05c943,0x3b009947,0x3b10fdd8,0x3b11cd1c,0x3b0bca65,0x3b00980f,0x3ada78e9,0x3af8ff74,0x3ae89c02,0x3a0ece73,0xbb0e98fe,0x3b02b47e,0x3a192380,0xbb18e6c3,0xbb095ccd,0xbb0c86d3,0xbb14df26, +0xbb03b3db,0xbaf6f699,0xbafe3e8f,0x3a3023b4,0x3b10740c,0xbb077daf,0x3a10047b,0xb9acf3d4,0x3b16d062,0x3ac63604,0x3b072d8f,0x3b21da60,0x3b67428d,0x3b65efea,0x3b1c447e,0x3b22e940,0x3b2bb81b,0x3b68647c,0x3b320374,0x3b2edff3,0x3b3100b0,0x3b745162,0x3b846799,0x3b785248,0x3b583a38, +0x3b2e7bf2,0x3b295572,0x394606a7,0x3ac05cb6,0x3abbce74,0x3a703798,0x3a0b2f62,0x39ab34dd,0x3a492bfb,0x3a900b14,0x3987b308,0x3a54efc6,0x3a00066b,0xba112552,0x3a2630ea,0x39aa40ad,0x38bc713c,0x3aa4a5b1,0x3abf45ee,0x3b28a762,0x3b03b8df,0x3b358290,0x3b50aafb,0x3ba6ef41,0x3bad7811, +0x3b476932,0x3b4708ec,0x3b4d1c3b,0x3bb1d9eb,0x3b822c30,0x3b81ef95,0x3b6df8bb,0x3ba70744,0x3bad9a2f,0x3b99bf3f,0x3b64d607,0x3b34b7ef,0x3adc69cd,0x3a893234,0x3a696d0c,0x393d35ce,0x39e9f6f3,0x393dca4f,0xbadfeb27,0xbab11004,0xbae7af10,0xbb4da085,0xbb2dbfb9,0xbb05914b,0xbb1ed258, +0xb875030f,0x39efe485,0xb9a3d971,0x3a8dc84a,0xb94db762,0x3ac8ed00,0x39cf721d,0x3b046c33,0x3b74bb15,0x3be9ce03,0x3beef81e,0x3b862dd0,0x3b7d7b55,0x3b96f9ca,0x3bf8ea58,0x3ba16a33,0x3b94af39,0x3ba6537e,0x3c0af5ea,0x3c1fe23a,0x3c139c87,0x3be652fd,0x3ba8f984,0x3b736aa2,0x3b0dc3ac, +0x3b0996a7,0x39d0b3f9,0x3a8013cd,0x39e50c20,0xbb1b54a5,0xbae831aa,0xbb164a2d,0xbb26a6c0,0xbb8dc03d,0xbb898266,0xbba117c5,0xbb19e823,0xba81973a,0xbb1fde43,0xba0da9b7,0x3bc33079,0x3bf5b5c9,0x3c20632b,0x3c08583d,0x3b4ce1dd,0x3b8e94fe,0x3b85acc7,0x3b5ac67e,0x3b2b1b52,0x3b00686a, +0x3ac07137,0x3b93ee1a,0x3b904ade,0x39225533,0xbb10f37b,0xbb90b222,0xbbcbf7a6,0xbb9bdc29,0xbb850365,0xbb96969b,0xbbb5e6f1,0xbb9951c5,0xbb95e42a,0xbae67551,0xb9cac85a,0x3abbadb1,0x386bf038,0x3967c319,0x3a4a1fd4,0x3a96dfa1,0x3b52ed4d,0x3badf03e,0x3bb40967,0x3b9f66f8,0x3b62a2ad, +0x3bab0385,0x3a8547f2,0xba08a4d5,0xbb221df9,0xbb58284b,0xbba6cf89,0xbba6a853,0xbb08fadb,0x3b0af867,0x3b8ec6bb,0x3b4e25d4,0xbb242dae,0xbbd36aae,0xbbc818c2,0xbb0d9098,0x3b4e6827,0x3be7b3ae,0x3c07b7a0,0x3bf5fb3b,0x3bc43bd9,0x3b91f17f,0x3adbdef1,0x3a9011fb,0x3ac5a1e8,0x3aba9863, +0x397824d5,0xbac058df,0xba08d6a5,0x370f262f,0xb9d7ad10,0xb9b40ccf,0xbada897e,0xbb790be5,0xbbdab2ed,0xbb6f7bca,0x3b61bad1,0x3b27ef6f,0xbbc5ea81,0xbb04b34d,0xbbaff4db,0xb9f8a1d2,0x3c7cad29,0x3c4669d6,0x3c224c75,0x3bf987da,0xbb1cddb7,0xbb5943a5,0x3bae0516,0x3bf8e66e,0x3be72a10, +0x3b0bceda,0x3a628a77,0xbaaa07d5,0xbb50586f,0xbb0e2f41,0xbad3d072,0xbac6f081,0xb9f8f0bf,0xba59465d,0xbad598c4,0xbacaea53,0xba5c588c,0x38bfe56c,0x399b70a4,0x381b440f,0x390d45bd,0x399c3d2a,0x39ea0676,0xbac8b84c,0x395f61d8,0xb8c2c34b,0xbb987365,0xbbc1b8ba,0xbb007fca,0x3b4d8cdb, +0x3bf9cc76,0x3c190c34,0x3c312d5f,0x3c4e1595,0x3c2edb2a,0x3b9165a4,0x3b07dcf9,0x39c528a8,0x3a913785,0xb8e70706,0x399e40ec,0x39ade7de,0x3b246a5a,0x3b7915d4,0x3b843fec,0x3b8b5e1e,0x3b6ef27e,0x3b269f20,0x3b00b5b6,0x3b0fe875,0x3b156d57,0x3a85e344,0x38f46dd2,0xb9ddf07e,0xb90a3cdb, +0xb608bce9,0xb898940a,0xb9838597,0x39081097,0x39b7c6a0,0xba063ae4,0xb9e92d81,0x3979380b,0xbafcb0fc,0x3abbe257,0x3b950979,0x3c095271,0x3c01626f,0x3ba0e26e,0x3b58a59d,0x3af121cc,0x3a767466,0x3a40990f,0x3ab17615,0x3b57d082,0x3b4502ac,0x3b46d20e,0x3b4ad89e,0x3acd5e34,0x39c665e8, +0xb9f6c355,0xba8c7cac,0xba8f581d,0xba7e7110,0xba6f49f3,0x37f713c1,0x3a1067b3,0x3a0c6dd9,0x3a0178a6,0xb71c9053,0xb9633c2c,0xb80272d5,0x391bdbe9,0x3902fc3a,0x383a75ec,0xba084fdc,0x3912250d,0x39ed563f,0x3a1c00db,0x3b11eb96,0xbb86e399,0xbb17598b,0xba974713,0xbaa23e64,0xba2e56a0, +0x388ecc2b,0x3a885633,0x3b362d0d,0x3b52f380,0x3b7f3c19,0x3b94f65d,0x3ba785e4,0x3bab3cbc,0x3b975f1b,0x3b83db2b,0x3b40df4c,0x3aa44ccb,0x3936212b,0xba807d0a,0xbb0610ee,0xbb05272d,0xbab7b2bd,0xb9c19f75,0x3a317453,0x3a778fb7,0x3a7a1f06,0x3989113f,0xb99f280e,0xba050a81,0xb9b9b08c, +0xb9436758,0xb9ac0cc7,0xba06b5b5,0xba373c11,0xbab5dcba,0xbac5e8d7,0x3b493433,0x3b39b4b0,0x3b2ccbde,0x3b3928a7,0x3b43bc8c,0x3b60a087,0x3b7ae7fe,0x3b8e8da8,0x3b7d17ed,0x3b61aab3,0x3b40a2cc,0x3ae39221,0x3a1f18a4,0xba193d80,0xba23c0dd,0xba44a97e,0xba5f40a0,0xba063d09,0xb946cade, +0xb7fa353e,0xb8c1ae56,0xb965e3b8,0xb9a8a150,0x3a095903,0x3a9e36ee,0x3b205f2e,0x3b1b3384,0x3b3debec,0x3b414201,0x3b21bc12,0x3afb082e,0x3ad07f66,0x3af9d4ba,0x3b166f1f,0x3b19175d,0x3b295c76,0x3a8814da,0x3b2ba9f5,0x3b21700d,0x3b209e7a,0x3b178a31,0x3b0f9dd0,0x3b04d51c,0x3b03cac8, +0x3aa663ed,0x3a2f4d35,0x393fd2d1,0xb9b8adce,0xba479805,0xbaa304b2,0xba96a70a,0xba99b722,0xba9e5a20,0xbaac177e,0xbac9e60d,0xbabbf256,0xbac76e73,0xba5b21ae,0xb9d30fd2,0xba1fb582,0xba0ac1f2,0xb8902de9,0x39300ab1,0x3a0da4b2,0x3a20c51d,0x3a97f205,0x3ac3cee4,0x3ad08ea3,0x3adfb830, +0x3aba2c8a,0x3ae47d05,0x3b0b7d9e,0x3a50f09e,0x3a7815bb,0x3a20f7a7,0x3a27d178,0x3a1d3433,0x3a1a4926,0x3a130e38,0x3a1f51ab,0x39a5e4b6,0x38c1420a,0xb93c8af5,0xb9c8a19e,0xba1b3450,0xba6558bb,0xba543924,0xba54d30c,0xba516940,0xba43ede8,0xba4271b6,0xba38d695,0xb9ccac95,0xba67538a, +0xbb1d525b,0x38db41c3,0xba0b5ddb,0xbb1dc228,0xbb0e62fa,0xbb005dba,0xbae43f7d,0xbaca9490,0xbab43d6e,0xba8eb7fd,0x39500655,0x3a8ca7ab,0xbab28989,0x38b044d8,0xb9b07aa3,0xbab4a0f6,0xba013a0b,0xbad80893,0xba81beeb,0xba91ce9c,0xba457276,0xba932b35,0xbaaf1d75,0xbae6a923,0xbadb5775, +0xbacb726a,0xba836a4d,0xbaa41aba,0xbaa493f3,0xbab24b55,0xba97365d,0xba942a76,0xba9a0b93,0xbaaaefe0,0xba966145,0xbae3ef78,0xba009c62,0x3a814075,0x3b587138,0xba924ac5,0x3a29b61a,0x3b2c7317,0x3b31af69,0x3b27f152,0x3b081102,0x3b1d9627,0x3b22fa9b,0x3b0d237e,0x3a2713d7,0xbaa5baff, +0x3b4384fa,0x3a939aa4,0x3ab95984,0xbadbb736,0xbaa0cfe8,0xba5f4e75,0xb6101ca0,0xba18156f,0xbaa32ff8,0xbb1a80c7,0xbb16f8a2,0xbb002a0e,0xba2a3e69,0xbab8caf2,0xbac4fc38,0xbad0d470,0xba5768b7,0xba102c45,0xba321d10,0xba4a80ac,0xba689fd2,0xba7b2885,0x3af95537,0xb9b4871c,0xba0e7010, +0xb9878d0b,0xb9948d30,0xbae47872,0xbaa8e61c,0xbabaab00,0xbac7cdd9,0xbad085d9,0xbae45e58,0xbb03ddae,0xba997e61,0xb99b1ae5,0xba8b78be,0xbad6a5f0,0xb985f31b,0xb9df6f0a,0xba5d7a03,0xb883c9fd,0x3a931349,0x38aa1d99,0xba923e3f,0xbb604e14,0xbb653e71,0xbb423d60,0x38ac1e58,0xba9e6d67, +0xba9734fa,0xbadca0ff,0xba16ed61,0xb9c29ace,0xba47c90a,0xba857593,0xbac38a9d,0xb9ecb0b5,0x3829a9a6,0xb9a5b605,0xba4f611b,0xba86ae5f,0xb9d4da6f,0xbb45bb3c,0xbac4abd4,0xbb488e98,0xbb7ff465,0xbb51e6c9,0xbb0e914d,0xbb61de89,0xba1246e4,0xb9866ebc,0xba70b8f4,0xba52a8a1,0xbaaca180, +0xbabcc03d,0xbad2817e,0x38dc2b4d,0x3b32b204,0x3af3a930,0xb96e16c2,0xbb7bf6b0,0xbb8afd7e,0xbb42af3d,0x3aa3bdef,0xbaa5177f,0xbb09b25a,0xbb0c788e,0x3995e3bf,0x3ac8852b,0x3aab641b,0x3a890827,0x3a2c2d81,0x3aafd0e2,0x3b13d029,0x3a3f4a9c,0x38cc0f8d,0xb9bce48d,0xb9e0fcf4,0xbb32171c, +0xbae8e670,0xbae8a582,0xbb121914,0xbb757554,0xbb7965aa,0xbba0c8ac,0xbb1c9db8,0xbac1e073,0xbb4ed26c,0xbb2a09de,0x3ba9ee5c,0x3b53a3a7,0x3b872141,0x3b34100f,0xbab4e7f1,0xbb1d1677,0xbb6ee0ca,0xbba0331a,0xbb9d24d0,0xbb93931b,0xbb8b10e9,0xb9effd0f,0x3aa15fa8,0x39a1b7dc,0xbb4f1376, +0xbbc3543a,0xbc1658f2,0xbc0ed1c5,0xbc16cbb6,0xbc026123,0xbbc0708c,0xbbca3fbe,0xbbab6543,0xbad8e513,0xb7eaacc7,0x3a939c3f,0x397cec0f,0x39c5f6c1,0x3a642eaf,0x3a907dd4,0x3b3a65f0,0x3b8dcca8,0x3b9999c4,0x3b959e77,0x3b676677,0x3b90c73c,0xba957b6d,0xbb6034ee,0xbb7a6409,0xbb90423f, +0xbb98e3a2,0xbbe3f4bb,0xbb8b7436,0x3ab6a66d,0x3b402d56,0x3b16e891,0xbb1152e7,0xbbcafb12,0xbbd7cc1e,0xbb8545a6,0xba7db00f,0x3a8d1f7e,0x3a0eaa6e,0x3b13306b,0x3b095017,0x3b31bca3,0x3ad4f017,0x3a2a75da,0x3a61438b,0x3a0ebc96,0xb9b798ba,0xbab41062,0xb9b38d18,0xb8ac0486,0xb9e91511, +0xb9cb5c60,0xbab6be62,0xbb62ceb9,0xbbbdf9bc,0xbb848536,0x3b2028b4,0xb99773d7,0xbb8f3434,0xbab137f4,0xbbc34aab,0xbb70b813,0x3bab5f78,0xb93cff1e,0xbb6759cd,0xbb949ba1,0xbc360818,0xbc1c645a,0xba433b95,0x38c51093,0xbaaae49e,0xbbca3ab2,0xbbb9c05e,0xbba0f76e,0xbb6d4c9a,0xbb39acf7, +0xbb49ea82,0xbb60cc96,0xbb0650b6,0xbafaa795,0xbb0399a6,0xbaf3dcc6,0xba4b5071,0x397210b2,0x39861958,0x3825b705,0x3973a27c,0x39591f43,0x3a422226,0xbabb2142,0x3a1d1f51,0x3928ca4c,0xbbae466f,0xbba32696,0xbb4cef4e,0x3ba79ce8,0x3b2f9433,0xba546743,0xbbd98627,0xba4599ff,0x3b066e34, +0x3b17ccbe,0x39889487,0xbab770b9,0xba86e7dc,0xbb1c1e8c,0xbb022acb,0xbac3b6f1,0xba5daa43,0xba3aab7e,0xba2e52af,0x39d153b6,0x3aaeda5a,0x3af00cf3,0x3b21b7d2,0x3aee6544,0x3ae4e90d,0x3a20accb,0xb8a56365,0xb9cf948b,0xb8ac12c2,0xb890c6f5,0xb9091899,0xb9971f7a,0x38033b08,0xb95ca20b, +0xba21df05,0xbacd712b,0xbaf1a643,0xbb97504a,0x3b796536,0x3a1da0c1,0xbb1818ab,0xbb0fe123,0xbb9b2cbb,0xbbc655dd,0xbbf0f271,0xbbe70ad3,0xbbb930bf,0xbb915035,0xbb577f99,0xbb078c6c,0xba9aff12,0xb9f25dff,0xb9226d8a,0xb8d337a9,0xba0725f1,0xba39f58e,0xbaa864e8,0xbae89b8e,0xba61f63e, +0xb9e89109,0x3a45b069,0x3a162b51,0x39b1dc37,0xb8ea662e,0xb8ab50e5,0x38d141a8,0x39a0ab7e,0x3948b75e,0x3892390f,0xba30302e,0xb9057714,0x39d3bd75,0x3af34c5a,0x3ac4eafb,0xbadb585f,0xbb9034fe,0xbb99d90a,0xbb8abca1,0xbb8d538d,0xbb83a63e,0xbb6631c9,0xbb48b648,0x39ea1902,0x3b2ee222, +0x3b7f9fff,0x3b6cfc41,0x3b4b532c,0x3b170fae,0x3acc5f5d,0x39f4b444,0xba4e4b84,0xbad75d8b,0xbafdd90b,0xbadeed2c,0xbafc9de6,0xbac86db5,0xba202208,0x39016488,0x3a0a0049,0x3a010499,0xb9a2b08f,0xba2cb8a8,0xba5c4485,0xba41ebfd,0xba2fda43,0xba83287f,0xba85322f,0xbae5d7e9,0xbb06cbfd, +0xbb54d59a,0x3a908c8c,0x39cab739,0xb98fc6e3,0xb7d99678,0xb8732c66,0x39a47a06,0x3a1a5101,0x3a2bff01,0x3a1529ed,0x39a9b47d,0x39ca13bb,0xb89e72e7,0xb9cd5c4d,0xba4cb2a2,0xba723a66,0xba89a7fe,0xba9d78fb,0xba9332df,0xbaad0f56,0xbaa1d7d0,0xb9fa776a,0xb9a5e970,0xb98353f5,0x39f3068d, +0x3aba46f1,0x3b1c64f8,0x3b2afc21,0x3b12a5b8,0x3b2cd755,0x3ae9a5fe,0x3abe2e4b,0x3a292fe8,0x3a7ceea0,0x3aaeb638,0x3adfc82c,0x3a917da1,0x3b3eff68,0x3ae82c83,0x3ac65517,0x3a8c07d8,0x3a1478e1,0x3887b81e,0xb9df1e15,0xba4d3fa2,0xba66f2d7,0xba6c52b6,0xba77bc9c,0xba84d1ee,0xba8d4f34, +0xba9d83c2,0xba9e5a1a,0xbaa2c679,0xbaa7aaec,0xbab4c37d,0xbab1b4b3,0xbadf6033,0xba9cefa8,0xbabc90ea,0xbaae1889,0xba5887fb,0xba551ab7,0xba7ca202,0xba531836,0xba09e736,0x3894fb74,0x393a7274,0x3a2bd789,0x3a9ddf2a,0x3a9e500c,0x3ac53be4,0x3ac5c313,0x3ab33d50,0xb9b89a46,0xba2e1c86, +0xba28425e,0xba5e3764,0xba756d3a,0xba8a77f7,0xba9aa4b6,0xbab5a678,0xbab795c5,0xbac2b19e,0xbace7255,0xbad4ceff,0xbadaa6aa,0xbae0c9be,0xbadeb347,0xbadf039e,0xbadcc88a,0xbade1bd3,0xbad57d36,0xbae05611,0xbac3ea9e,0xba3cb9dd,0x3a077d53,0xbab877f2,0xb9df1018,0x3a757001,0x3a85df17, +0x3a897dbb,0x3a827622,0x3a933b9d,0x3a97510b,0x3aa43e37,0x39a80f5b,0xba107484,0x3ac6e6c7,0x3a0510f0,0xbafa2f4a,0x3ace965c,0x3912146a,0x3b1786a7,0x3abb3891,0x3ad417a5,0x3ad27034,0x3af27ef9,0x3af0f8da,0x3ac542f7,0x3aca5bca,0x3ad432ce,0x3b0ac3f2,0x3ae764e6,0x3ae39ab3,0x3ad9cd86, +0x3afc03c9,0x3b004da8,0x3af9b895,0x3ae5184e,0x3ac08e4e,0x3b07e390,0x37a4f88f,0xbab8cabf,0xbb3a1781,0x39ec9725,0xbabc063c,0xbb4ad25f,0xbb470050,0xbb4c50c9,0xbb4bdca0,0xbb4a2de2,0xbb45faa7,0xbb4fca26,0xbaa2ffe2,0x3a692729,0xbb3a618f,0xbac9b0dd,0xbb0920b3,0x3af6fb58,0x3abba400, +0x3ac9f90b,0x3aeccf51,0x3b29afe3,0x3b25c8a9,0x3add4a1f,0x3ae9e493,0x3b080d13,0x3b565d78,0x3b11cbcb,0x3b097bd4,0x3b0df628,0x3b4e25ab,0x3b62b079,0x3b5ab4e1,0x3b39cd14,0x3b29523d,0x3b0ad669,0xba9aa404,0x3a54190e,0x39c19311,0xb667191c,0xb9e3c84e,0xb9bdab61,0x39ae605c,0x39ef00c2, +0xba56b963,0x39fdf353,0x3a0ac8d9,0xba8f62c1,0x39912af7,0xb9cf58b7,0xba8730ed,0x3a39936b,0xb836ef0b,0x3b15857a,0x3b0fea2e,0x3b0b0851,0x3b1d5699,0x3b71fb0f,0x3b70a309,0x3b07a891,0x3b004a19,0x3b126114,0x3ba4a1e4,0x3b4b3bd4,0x3b471d02,0x3b2f75e2,0x3b8ae476,0x3b933b4e,0x3b872d9e, +0x3b481ca1,0x3b39deed,0x3aade6b9,0xb909f683,0xb77d927e,0xb9a90857,0xb9d20806,0xba7cfcc1,0xbb0004e7,0xbaf8b9f6,0xbabc7285,0xbb895af3,0xbb0d8440,0xbb147bec,0xbb4a150a,0xb9aa9894,0x38ee98a5,0xbaab093f,0x3976f599,0xbaca409a,0x3aab8bd2,0x3a2910f6,0x3a811da1,0x3b15ce97,0x3b996ebd, +0x3b94401c,0x3b148464,0x3b023bc7,0x3b5ae2ad,0x3bebe576,0x3b798c09,0x3b372527,0x3b574dac,0x3bd71541,0x3c036641,0x3bfbf8eb,0x3bc900df,0x3bac3f3b,0x3b6be3b3,0x3a98ba99,0x3af4b4bf,0xba22ff4f,0xb6892355,0xb931e827,0xbb131f82,0xbaa8a8c1,0xbac8cfff,0xbad7ba18,0xbb4515fb,0xbb392033, +0xbb964ffa,0xbad247fc,0xba7125dc,0xbb4c0725,0xba9721b9,0x3b8936fe,0x3bed7869,0x3c2936bf,0x3c0e99ab,0x3b96e8b7,0x3b824d21,0x3b4e93de,0x3b679bf5,0x3b21d69d,0x3adc2867,0x3ab08954,0x3b90e9f1,0x3bb32644,0x3b70d33b,0xb9dd8206,0xbb574c4e,0xbb925131,0xbb9973d4,0xbb877c08,0xbbb4be1c, +0xbbe15c31,0xbb9248d5,0xbb935ce9,0xb9de3148,0x39e7c587,0x3a46e5c1,0x39dbf819,0x39f7ca30,0x3a53a5ab,0x3a8f7d37,0x3b2928a5,0x3b6a0010,0x3b9384c8,0x3b8ee1da,0x3b6bf57f,0x3b854bbe,0xbac723d2,0xba0690ed,0xba5a18e7,0xbb3847d5,0xbb92be63,0xbbce3473,0xbb7ea815,0x3a9bd775,0x3b677a6c, +0x3b6d2294,0xba11164a,0xbbc49294,0xbbe2b833,0xbb61b8ed,0x3a86a21a,0x3b9fa28a,0x3be2dcf2,0x3bd286f5,0x3bb839d0,0x3b52e021,0x3a30ac10,0x39c83335,0x3a64bc2e,0x3a846be6,0x38750a1a,0xba875dec,0xb946f416,0xb965d385,0xb9d27a5a,0xb9e7091e,0xba84e9b4,0xbb2bbf30,0xbba29193,0xbb231410, +0x3b3b9997,0x3a888ca9,0xbb705a0f,0x3a84928a,0xbb900c39,0xba1462d2,0x3c560ad1,0x3c1c0656,0x3c031e83,0x3bec1f9b,0xbaa6ae63,0xbb2fac16,0x3b59754c,0x3c043833,0x3c081075,0x3b2ea9f1,0x3ab5a222,0xba4a2dbe,0xbb265c43,0xbb100531,0xba9a2171,0xbadfbf6b,0xba89fd72,0xba4dbbf1,0xbaea2498, +0xbaa5764b,0xba001398,0x39aad673,0x39355cac,0x38c58dcb,0x39858a6b,0x3916a785,0x3a496b1c,0xba738fed,0x3a3bbccb,0x3a0b5bef,0xbbcb550e,0xbb8815b9,0xbb861799,0x3be9c3b5,0x3bcfefe4,0x3b94e41a,0x3b71223e,0x3bf2f99a,0x3c0c1ee7,0x3be699b9,0x3b07a8ec,0xba1ac8f6,0xb9db43bb,0xbab209da, +0xba612113,0xb9733dd6,0x3aa1fae0,0x3b0ed728,0x3b410004,0x3b6e05ea,0x3b789825,0x3b356c06,0x3adeda2e,0x3b087695,0x3b00fd71,0x3a1cf1d5,0xb7c44eb1,0xb947955e,0xb8cedc87,0xb900aa61,0xb8f72d17,0xb98ae9be,0xb8641571,0xb8f810e0,0xba0004d1,0xba8e9c94,0xbb7d41e2,0xbbd06457,0x3af147e5, +0x3b39bc3f,0x3bb96e54,0x3bb51ffd,0x3b6e35c5,0x3addfdbc,0xb959eea8,0xba7bb94d,0xbaa9918d,0xba50fbbf,0x39e491c4,0x3a24c4ba,0x3a8b92eb,0x3ad7040a,0x3a696778,0x39d3e1ac,0x398a0a8e,0xb9f9ae88,0xb9b90164,0xb97c6646,0xb9d20a35,0x3a6bafcd,0x3aaa2b2a,0x3a507256,0x3a091a47,0x37ae7b6e, +0x383b96c6,0x3958dbb8,0x394ee942,0x396cd0a7,0x38f3df8e,0xba167702,0xb9a2bd9a,0x39b71530,0x3acd3cdd,0x3b5b1b6b,0xbb9be8ae,0xbb3096fd,0xba0c55d2,0xbaa5988a,0xba9ad6e6,0xba7aace8,0xb8126571,0x3ab01369,0x3b0e25cb,0x3b3da406,0x3b5f8103,0x3b813f8c,0x3b82753a,0x3b64b8f8,0x3b40262a, +0x3b0430b6,0x3a43f2e0,0xb91e16e1,0xba728d7b,0xbaf2beb7,0xbaf2b1fa,0xbaa0cd31,0xba10ddb3,0x3a0ea9d5,0x3a47d7bd,0x39e3b221,0xb972522c,0xba2885eb,0xb9f4451a,0xb9e55921,0xb9bd784a,0xba2fc4e8,0xba67ce4d,0xbaa8f0cb,0xbb0a7053,0xbb1e3c98,0x3a51df2a,0x3a5ceb9f,0x3a6d120a,0x3a7cd1ef, +0x3aa91a7f,0x3b041a35,0x3b2ce535,0x3b5a5db1,0x3b445f0a,0x3b36002a,0x3b24c308,0x3ae12ea6,0x3a7c4f5c,0x38cf2d58,0xb527700c,0xb93023d6,0xb9897a2b,0xb9277eb9,0x391e9c4a,0xb9565bc3,0xb9c0eb79,0xb836a244,0x393d7925,0x3a5f0466,0x3ab63a50,0x3b2a8b82,0x3b0ee77f,0x3b24f2de,0x3b02814c, +0x3ada3101,0x3a4b34fd,0x39b5cdb3,0x3a09709d,0x3a25dce2,0x39e76137,0x3a407fad,0x3aa6b4e0,0x3b3de59c,0x3b3cdbc6,0x3b360aba,0x3b2c5725,0x3b270887,0x3b1fc211,0x3b2091fa,0x3aef0530,0x3aaa79fb,0x3a59453e,0x39999b1e,0xb94c27ba,0xba52820a,0xba378596,0xba3750de,0xba3456a1,0xba4cdba7, +0xba644d7d,0xba526f44,0xbabab1bb,0xb9b17e94,0xb8af051e,0xb8b7e62b,0xb8b22fbd,0x3a13da3b,0x3a60319c,0x3a87ed31,0x3a73bc63,0x3ad7430b,0x3b070947,0x3b02633b,0x3b091ac9,0x3ae1b12f,0x3b01023c,0x3b2564ed,0x3994764a,0x3aa96dfb,0x3a6c9f28,0x3a7d0ee7,0x3a800abe,0x3a784f9d,0x3a6f5e07, +0x3a7ae7a6,0x3a3b22b3,0x3a08a7a8,0x3996e869,0x38dd5bd2,0xb88ce64f,0xb9a6cdbe,0xb981c515,0xb988e1b9,0xb9859df5,0xb95c17bb,0xb97ffdcc,0xb61de7a9,0xba36bb64,0xbac0e889,0xbb239b59,0xb858bed1,0xba919a8c,0xbb197c80,0xbb12f2e0,0xbb0629be,0xbae9403e,0xbae76ecd,0xbad79c48,0xbab715c2, +0xba051e76,0x3a38ec02,0xbab5dd71,0xba1b37f4,0x39098e4d,0xba3b3356,0x3a8ee6f4,0xba94558c,0xb9f1193f,0xba031595,0xb9863c2d,0xb9a41d52,0xb9f42560,0xba7bf1ec,0xba69c348,0xba53d98b,0xb98ec5ed,0xba18809b,0xba17e9f1,0xba224020,0xb9fb10dc,0xb9f35cd5,0xb9fae5ea,0xba1d9d35,0xba0b71ea, +0xba9a174c,0x3a89d422,0x3b0774dd,0x3b20084a,0x39c18eba,0x3ae9e55a,0x3b020f09,0x3b10c098,0x3b0a98fe,0x3acb078c,0x3b0fac85,0x3b172ab5,0x3af84561,0x3af681b2,0x39a09c9a,0x3b129929,0x3b16199e,0x3b063206,0xba2a16df,0xba5dbf1f,0xb98c80b6,0x39a4277c,0x3a187b39,0x394c9866,0xba9080b6, +0xba930dd2,0xba6a723a,0x39cb8fcd,0xba2bf4d7,0xba644335,0xba5110b3,0xb9307690,0x3956e28b,0x398362f3,0x3975118c,0xb931407f,0x38c071a4,0x3b13663b,0x38fa2b05,0x39dd8fa8,0x3827ea12,0x38c77a9a,0xba453038,0xba004c84,0xb98358a7,0xb9bd2f4f,0xb9c89dd8,0xba54adf7,0xbaa4f589,0xb99a6111, +0x39d9d7d2,0xb951f568,0xba56ea59,0x3a829973,0x39e946fb,0xba2829ae,0x3a0fa1e3,0x3a94dd2b,0x3ae0b62c,0x3a8f2456,0xbad50a24,0xbae084bd,0xbac3ec51,0x3abc1756,0xb96cfeda,0xb9486a8c,0xb9aa7fe3,0x3a002e12,0x3a3e548b,0x3a0723fd,0x39535af6,0xba21756d,0x39fd670d,0x3a685eef,0x388123e9, +0xb96279e7,0xba702931,0xb99ebc4d,0xbb1e00b3,0xba92eeb4,0xbb307038,0xbb63f644,0xbb2a90a0,0xbab2e091,0xbb524741,0x37c0a3fa,0x39cee10a,0xb9d12f61,0x382166eb,0xb9a6d6c6,0xba46abf8,0xbae2fd1d,0x3914dc8f,0x3af90bcc,0x3b7186de,0x3b385aa6,0xbaab51c4,0xbaf5b9f3,0xba6a8826,0x3b4434d3, +0xb92e3566,0xbabd3af9,0xba83f6dc,0x3aa2ff97,0x3b38cd47,0x3b45cd95,0x3b3641f3,0x3ad611a3,0x3b15d165,0x3b1dc568,0x3971efa2,0xb8dd64f3,0xba9049c4,0xba849243,0xbb24cc6c,0xba9dddc7,0xba75ec99,0xbac6c7fd,0xbb1994f3,0xbb27b99c,0xbb8e350b,0xbadafe63,0xba4a65d3,0xbb5b8f54,0xbb028222, +0x3be2ee15,0x3bad295e,0x3bb220fb,0x3b9ec811,0x3ae577c1,0xb96590f1,0xbabf567c,0xbaa82569,0xbb4a3a5d,0xbb833cea,0xbb8c55cb,0xba7bdae2,0x3aba71c3,0x3b0c3b83,0xbaf975a5,0xbba45a76,0xbc0b752f,0xbc045ca6,0xbc075ead,0xbbca3145,0xbb9ac10d,0xbbb34349,0xbb8b5aca,0xb8875a4c,0x3a7e498d, +0x3a1369c0,0x3a086fde,0x39deaa9a,0x3a541969,0x3a728b67,0x3b117386,0x3b38b4a9,0x3b8082d9,0x3b9fbf68,0x3b9aa4da,0x3bc0b1e0,0xba90bbda,0xbb2c0a21,0xbb8446cc,0xbb8148d5,0xbb86fa8c,0xbbc273f3,0xbb5fc707,0x3b05ccda,0x3b3f9ef8,0x3b3d1cac,0xb9785c43,0xbbac7fc3,0xbbd8ba52,0xbb859f47, +0xbace8cbb,0x3a9275fa,0x3b26d381,0x3b7eb6b1,0x3b3851ec,0x3b249797,0x3a9df94b,0x39a07d88,0x3a733173,0x397ad9ea,0xba01dff8,0xba58b538,0xb90f13cf,0xb991f860,0xb9bbb91a,0xba03f88d,0xba348686,0xbb0b810c,0xbb7faadf,0xbb2dac55,0x3b2b33ae,0xba60c359,0xbb0064c0,0x3b06c974,0xbb7889b3, +0xbaa181c0,0x3c0f370e,0x3ba06ed2,0x3b1c3c63,0x3aaf82d0,0xbbfadb52,0xbc0b9d46,0xbb1373a9,0x3aff6f4a,0x3b1e3b5b,0xbb16b229,0xbb488e14,0xbb61c54f,0xbb468dc9,0xbb31e989,0xbb4643d1,0xbb175f50,0xba7d82be,0xbaa94127,0xbaabf4ff,0xba866ffe,0xb9555f18,0x39b536e1,0x39098d67,0x38fdddf5, +0x3998ffd2,0x38d4798f,0x3a481af6,0xb9e580f5,0x3a8ddc6e,0x3a1a3e5f,0xbbad233a,0xbb5cc4d7,0xbb8a2bc6,0x3c11314b,0x3b6a2c08,0x39109a3f,0xbb999f1b,0x3a276091,0x3b8957e7,0x3bbb0bac,0x3b2961b4,0x39d8b6fb,0x3809323e,0xba97ea5a,0xba8fed95,0xba3f2d3e,0xb9ed5708,0xb9c59545,0xb8d914a7, +0x3a8b4c4a,0x3adcdf82,0x3b199129,0x3b35f482,0x3b02afc7,0x3acdd82c,0x39ad9414,0xb8aefaeb,0xb93ee761,0xb8c1c9e9,0xb92b5bbf,0xb926b0c9,0xb9916249,0xb8abfe09,0xb9f8b364,0xb9d3bdb1,0xbaeacb35,0xbbb99701,0xbc0a97ae,0x3bc348c7,0x3b729f36,0x3ad9e65f,0x3b02b6e9,0xb9c89bd8,0xbad1576b, +0xbb7cb269,0xbba23a31,0xbb8b8ed7,0xbb569463,0xbadd6e07,0xba89b634,0xb9caf7aa,0x3a0bc6fa,0x39e1fe74,0x39e50b34,0x3920f971,0x381ecf60,0xb9b688ac,0xb9be0a10,0x3a54bf56,0x3a732c8a,0x3abc8608,0x3a609614,0x39cd613e,0x3899a787,0x3917b5db,0x397f26a8,0x39a5e0c0,0x397b18ec,0x3993bba5, +0xb96e35e5,0xb8b3a756,0x3a6c0f7a,0x3b52b479,0x3ba3f7c0,0xba91a67a,0xbb02c807,0xbb0b0020,0xbb1c162c,0xbb5b7a1c,0xbb7fb234,0xbb6c4138,0xbb36b7ae,0xb9449d6b,0x3ab1d676,0x3b08c369,0x3b1edfd7,0x3b255d35,0x3b135761,0x3adf7d56,0x3a2d590b,0xba5b9560,0xbad4a991,0xbaf599b8,0xbace7118, +0xbad8c28b,0xba933226,0x38edade2,0x3a034b6b,0x39ef37ef,0x388e4ba5,0xba0e8a7a,0xba2f8309,0xba4680df,0xba0fdbf4,0xba17924f,0xba754a36,0xba8868b0,0xbac9ddfc,0xbaf1f9a7,0xbb1994eb,0x39f29b68,0xba3b2b93,0xbac966ef,0xba889272,0xba8397b6,0xb8933aff,0x3a03ac07,0x3a696a42,0x3a81c89a, +0x3a8cf473,0x3aab4627,0x3a58f17b,0x39d1b30f,0xb7faf5dd,0xb990e103,0xb9ea430f,0xba2a67f8,0xba1367fc,0xba6a9887,0xba3ebf43,0x3979e693,0x399fe48c,0x39d7a4ac,0x3a5af798,0x3adb9439,0x3b18f0b5,0x3b1b7e71,0x3ae07f1b,0x3b0c2f5e,0x3a8d2953,0x3a5b5e5b,0xb87f4dd3,0x39aa1381,0x3a3a3111, +0x3a8c84ad,0x39e7c566,0x3b55cdb0,0x3b1c46a9,0x3b0b32d9,0x3af25418,0x3ab5fdb4,0x3a8819cf,0x3a33e90b,0x3a073932,0x394556eb,0xb8d1f7c9,0xb9b8c01b,0xba184638,0xba3dce3a,0xba6bc915,0xba67cc84,0xba6e283f,0xba7abcef,0xba862cb6,0xba897eaf,0xbaa51e10,0xb9f6fb57,0xba16c115,0xb89f7d75, +0x39adaab3,0x3a224e5a,0x3a50534b,0x3a47e22c,0x3a901fb3,0x3acd4f1f,0x3ab4cd37,0x3ac25e9c,0x3af8fc4b,0x3aee097c,0x3b056f30,0x3b0d777b,0x3af8d022,0x3a552342,0xb8cd7484,0x36ac2c2c,0xb8dfa907,0xb9086b04,0xb964b6ed,0xb9a74ab3,0xb9e8fe1a,0xba0e344b,0xba25f6ce,0xba43793f,0xba5774d6, +0xba70506c,0xba87e88f,0xba840a16,0xba83f2b7,0xba81b87c,0xba818de6,0xba727a56,0xba90fbaf,0xb9685983,0x3a01ae5e,0x3a45a501,0x38850c61,0x3a812de6,0x3aa8ae4f,0x3aafb194,0x3aae90fd,0x3a9cd894,0x3ab8aff7,0x3abdadb7,0x3ac09006,0x3aaba035,0x3a1be021,0x3ac7cef5,0x3ac10ca1,0xba6b377b, +0x39b3acd3,0xbaa7cf3e,0x3a873406,0x39d96bbd,0x39f1a76e,0x3a035840,0x3a0571f3,0x39dd6020,0x3907afcb,0x39271799,0x3989744c,0x3a5ec311,0x39eb1aa0,0x39dc098f,0x39c3c6de,0x3a16de79,0x3a231776,0x3a284c76,0x3a007933,0x39c803ef,0x3a509fcf,0xbab13fe8,0xbaf2ba08,0xba89cbc5,0xba9b4887, +0xbb068a8d,0xbac1f7ee,0xbacde6f5,0xbadc81b6,0xbae384de,0xbae79dee,0xbae56e6e,0xbb04ab8c,0xbaf02ff1,0xba4ae819,0xbaa4d8cb,0xbb0147ba,0xbb029680,0x39b786e6,0x39f1fd04,0x39aed705,0x3a2507db,0x3a50e5a6,0x3a0d6365,0xb92d734f,0xb9245c29,0x396ea251,0x3ad4e559,0x39f91ce7,0x398d20a0, +0x39be8439,0x3a8f7b43,0x3ab7ca44,0x3ac56c20,0x3a93b5f8,0x3a9bd4df,0x3a1d13c9,0xba8aa920,0xb907d8cf,0xba24a474,0xba512b94,0xba8fb269,0xba9d783e,0xba1a409d,0xba380d02,0xbaeb0f9c,0xb9e73ac2,0xb93a8568,0xbad7742e,0xb9d51a30,0xba4f7c06,0xbadc4e02,0xb9f6057f,0xba93098f,0x3a900722, +0x3aa73317,0x3a77f5fe,0x3aafa64c,0x3abff7d4,0x3a6adade,0xb9de0c36,0xba3602fd,0xb98f847a,0x3b3cbfa4,0x3a4cc9c1,0x3a3f07be,0x39dac1c3,0x3ad9dc45,0x3afe5fbf,0x3b008cc6,0x3aa10b9f,0x3aa3dd3b,0x39c208e4,0xba70f903,0xba587775,0xba27c169,0xbab77d2e,0xbae5b526,0xbb0e3719,0xbb062761, +0xbad7401f,0xbb91e58e,0xbaf86535,0xbb0ca91a,0xbb5ddcc3,0xba128a74,0xb9707988,0xbae430db,0xba3a1db3,0xbb13b029,0x395d655b,0x393839f7,0xb820f67e,0x3a99c4ef,0x3afe8fe9,0x3a8f8d68,0xba6b90c2,0xbac361ef,0x390ce2c6,0x3b951d85,0x3a6792e0,0xba2a69c1,0xb9a47a65,0x3b12588c,0x3b7843f9, +0x3b897d69,0x3b5f7fcc,0x3b5bf58f,0x3b1c93ad,0x3a0edc0e,0x3a74951b,0xba88e0ef,0xba955d6a,0xba5809f0,0xbaee3af8,0xba45e1aa,0xba2ae838,0xba307516,0xbadbf1ba,0xbad37a8a,0xbb6c781d,0xba8b52f5,0xba73ceda,0xbb5aead7,0xbb0358ca,0x3b426fa1,0x3bb1964e,0x3c06a66f,0x3be770a3,0x3b957ae4, +0x3ac661f4,0xb9085ac8,0x3a6267d2,0xb8bcc8c4,0xba19dfb5,0xba359e88,0x3b42cc44,0x3bb1ee57,0x3bc9955d,0x3a64dbb3,0xbb2c527b,0xbb830c03,0xbbb737d0,0xbbb60b27,0xbbcef9d7,0xbbdc2fd0,0xbb8edd2d,0xbb81667c,0x3a2b147b,0x3a7e8563,0x3990479e,0x3a05a7f4,0x3999a2b6,0x3a127390,0x3a1a1b37, +0x3ad97c2e,0x3aecef7e,0x3b5229a6,0x3b75a9c5,0x3b719fc0,0x3b4d4e5e,0xbb448583,0xba8bc7bc,0xb9c4d0b6,0xbb366021,0xbb788b19,0xbbe67ff3,0xbba9d155,0x3a4255c4,0x3b1ccbb1,0x3b5e42e2,0x3aa0b9b6,0xbba43e0c,0xbbea08c4,0xbb98f839,0xbacc8a48,0x3ab6f458,0x3b5b3ee6,0x3b7127a5,0x3b67d2af, +0x3ace7361,0xb83d8968,0xb9870011,0x39c0822e,0x39a3c23d,0xb9a1247c,0xba0df2ca,0xb8c6cc35,0xb9845df2,0xb96be5ae,0xb9cf0e30,0xb9e992aa,0xbaa46439,0xbb533fdf,0xbaea87d5,0x3af16655,0xba36de83,0xbabe398d,0x3b67b13e,0xbb1f743d,0xba00fe67,0x3bfebd07,0x3b9c1aaa,0x3b586618,0x3b5ead7e, +0xbb43fa2f,0xbb8476b6,0xb96c2e1c,0x3bb10f1e,0x3bcb6562,0x3aa09d4e,0xb92fe7e0,0xbaca2768,0xbb03a5f4,0xbb0d9665,0xba93bb70,0xbadf55be,0xbaa128f3,0xba3e432e,0xbad2412d,0xba538234,0xb8b47da9,0x39927e54,0x38b7fe93,0x3907fe4d,0x394b5756,0x38e00e30,0x39f0053a,0xb874c0c1,0x3a3392b7, +0x3a1ec504,0xbbb97a42,0xbb311de5,0xbb9fd0de,0x3c0eafe2,0x3af630d6,0xbb42dca4,0xbbd6d944,0xbae8aac2,0x3b45c703,0x3c04ab75,0x3b203b8e,0xba15c42f,0xbaea4edc,0xbb151a40,0xbafe4ee9,0xba92a879,0xba49d225,0xb9b8d387,0x3a3267c8,0x3ae915ab,0x3b38af26,0x3b2980c8,0x3ae5ab7a,0x3af25919, +0x3aac7fe1,0x38fb8398,0xb928a101,0xb8b6e9a8,0xb9038369,0xb919ee93,0xb8f925f5,0xb9547890,0xb8852d55,0xb9803988,0xb9a10aa9,0xbad2b10b,0xbbedcc5c,0xbc193b0f,0x3b8623b7,0x3b048473,0x3aaa74ad,0x3a8a74fb,0x3945f557,0xbacfedd0,0xbb6bc54e,0xbb888462,0xbb86ffc4,0xbb6055e2,0xbb348a7d, +0xbb030b82,0xba947ded,0x37e1191a,0x39968123,0x3a105ddc,0x3a5113b8,0x39764b49,0x39a92515,0x39b756d2,0x39d05403,0x3ac38386,0x3adddca2,0x3a6b837c,0x39e80dc5,0x383e5272,0x395b5d8b,0x39821158,0x39605391,0x39442302,0x3971bbcb,0xb9a41328,0xb9df9ed0,0x3a0bb880,0x3b316b9a,0x3b9e5592, +0xbb65db45,0xbb2e9c6f,0xba60e7e1,0xbadaffd1,0xbb060f72,0xbb16c939,0xbad46f0c,0xba77d3fd,0x3a5dd438,0x3aebc8f1,0x3b0edb82,0x3b19c941,0x3b0ca33e,0x3ae2ef03,0x3aa03505,0x3a00ee4b,0xb9b26342,0xba6a28df,0xba8c5887,0xbaba7aa0,0xbac869a6,0xba82425f,0xba0eaba4,0x398a67a9,0x39ca5f57, +0xb8ab0bb0,0xba0d25fb,0xba3763fb,0xb9e53398,0xb9e77a8d,0xb9f1c7de,0xba6e1696,0xba948f7d,0xbaeab8b3,0xbb20376e,0xbb414f68,0xba944f3e,0xba9a1434,0xba8ec2b8,0xba915728,0xba6486e9,0xb839c820,0x3a214de7,0x3a9ee1d6,0x3aa719c2,0x3abc5dde,0x3adbc843,0x3abef9bd,0x3aa5039d,0x3a76ed39, +0x3a34ade6,0x39e18464,0x39820c02,0x389499e7,0x38f0c09b,0xba0ebe75,0xb9ef8dc1,0x3928c9fa,0x3a1ba082,0x3a81eb78,0x3ab9deb0,0x3b104c3d,0x3ae98671,0x3ae2923f,0x3a9b8d25,0x3a6792a6,0x386f0918,0xb9fea515,0xb9e3b520,0xba01df97,0xba314a28,0xba419c36,0x3aea72a3,0x3b1f3225,0x3b219888, +0x3b1311af,0x3b062c9a,0x3afe3a40,0x3aee0370,0x3ae86b37,0x3ac2eaf3,0x3a9ea4da,0x3a708cd2,0x3a1a0042,0x397d8544,0xb9644d8f,0xb92949bf,0xb91ad1f6,0xb8f4e98c,0xb941fd46,0xb8e8d18f,0xb96e0a77,0xba69eae4,0x38414925,0x390d6157,0x39f02c19,0x39eee170,0x3a8579cd,0x3a9faa2a,0x3a9c6717, +0x3a8f9d60,0x3acdde30,0x3aff9d1d,0x3af5f38f,0x3afb8368,0x3ae096b6,0x3aeae641,0x3b0fe420,0xb9030bdd,0x3a854f0a,0x3a4b9223,0x3a519b1b,0x3a5a98e9,0x3a492e21,0x3a3af9e4,0x3a350536,0x3a198ea0,0x3a014b27,0x39c70203,0x3998e527,0x395f8f9e,0x38b17b3c,0x390a6efa,0x38ed533c,0x38ee2b3f, +0x39016ec4,0x38ae82eb,0x39bef1ca,0xba4a277e,0xba9da7f0,0xba9476ab,0xb97d508c,0xba6ad30d,0xba49410d,0xba58fbb0,0xba4129fd,0xba1861fe,0xba330ae7,0xba2df0c3,0xba11ec1f,0xba113b0e,0x392a3373,0xb98572f8,0xba062a88,0x39799521,0x3a38346f,0x3af4d202,0x3a2512fb,0x3a3cc643,0x3a591b03, +0x3a64c457,0x3a980b2b,0x3a90e53d,0x3a2a7a1d,0x3a304fd6,0x3a3bbe4a,0x3a9edbb4,0x3a5ac8ed,0x3a584b39,0x3a5b93aa,0x3a751948,0x3a79569f,0x3a813aae,0x3a5c42cc,0x3a3bfb63,0x3a063aea,0x3ae5c8be,0x3ac7739b,0xb8c6877c,0x3abd249c,0x3ab1a9ae,0xb99a4191,0xb8ba5371,0xb8dd2116,0xb9eb3de2, +0x38ef8f63,0x3966057f,0xb8e8a136,0x3ad0b4a1,0x3ad9430a,0xb91f4b6e,0x3adadcd3,0x3a82782a,0x3a967045,0x39eaf3ad,0x3a79a14c,0x3a976645,0x3b12afa2,0x3b10eff8,0x3a86e721,0x3a739475,0x3a8afd0c,0x3b12f73b,0x3a82a149,0x3a35c615,0x3a664cdb,0x3ab68c09,0x3aec9bbe,0x3b05f677,0x3af52541, +0x3ab014ac,0x3ac8a305,0x3a97180e,0x3a384131,0x3a98e848,0x396326dd,0x3917005a,0x3998212a,0x39d03aab,0x3a4a6820,0x39a14363,0x3a6696fd,0x3a006f4c,0xb9f0e106,0x3a2ace2e,0x3a357f63,0x39833f70,0x39f243d1,0x3acb7551,0x3aef0289,0x3a4b1264,0x3ae6e8cc,0x3ae3ce35,0x3b74c5a2,0x3b766fa0, +0x3ab10885,0x3a923df0,0x3a8b4201,0x3b740707,0x3adf4a9c,0x3adb445f,0x3ae6d78b,0x3b1f8387,0x3b307c86,0x3b36eb7f,0x3b0915f2,0x3aa66dda,0x3ab247fa,0x3a8afcbe,0x398e39f7,0x39bd3a54,0xba4c577c,0xba2a3c4b,0xbabeaf38,0xba99457a,0xbae2787c,0xbb420227,0xbae3b65a,0xba7c3a06,0xbb285bf7, +0x39b83bfa,0x3a4f204f,0xb9811230,0x3a4a6f72,0x39023b20,0x3a2edf70,0xba1385cb,0x3a318e8d,0x3abb2e13,0x3bb0dc52,0x3bbf0347,0x3b15dc74,0x3abf5df1,0x3b1234bb,0x3bb89432,0x3b03b33c,0x39d4d45d,0x3a8da567,0x3b4fe456,0x3ba19cbf,0x3bb8e3bf,0x3ba0e474,0x3b5bfb32,0x3b4711ab,0x3ae1aa4e, +0x39799125,0xb9c2d727,0xbab9c998,0xba95ca0e,0xbae68083,0xba064024,0xb9eac82a,0xba41b732,0xba8adac4,0xbaae7f09,0xbb4ca674,0xba683df8,0xb9482c45,0xbb445785,0xba8be272,0x3bdc8f2e,0x3beb1a87,0x3c04e928,0x3c05cec7,0x3bc8f093,0x3b523aaf,0x3af5b957,0x3b5aebaf,0x3a22b893,0xba864c9a, +0xbaeb8f18,0x3aae1489,0x3b825688,0x3bac4616,0x3a4eb54f,0xbb294423,0xbbace9f1,0xbbb72a6f,0xbbb0d72b,0xbb81ac40,0xbb84de2c,0xbb823cb4,0xbb35fec2,0x3a9ec4b0,0x3ab16f1f,0x39452ca0,0x39f3e2ed,0x39549560,0x3a10f186,0x39b22fc4,0x3aac3a78,0x3abb4937,0x3b393167,0x3b8de42c,0x3ba14580, +0x3bc28341,0xba6f9024,0xba107a6e,0xbb12b871,0xbb2d1b92,0xbb55ab99,0xbb9e1924,0xbb362d72,0x3b1bf7bc,0x3b4784b1,0x3b7601f6,0x3b16dad7,0xbb77e7a1,0xbbc952fd,0xbb741f11,0xba898dc5,0x3b16de19,0x3bae40ce,0x3bb411bb,0x3b7b5812,0x3b076c15,0x39cfceef,0xb8314d17,0x3a6a1e5c,0x3860e400, +0xb9ef7c97,0xb9ae2890,0xb8e659c0,0xb95906aa,0xb95c09c8,0xb9990b19,0xb9d4eb18,0xba3f47ba,0xbb16f041,0xbaaedf44,0x3b163638,0xb9fedc6b,0x39207e41,0x3bab396c,0xba060a13,0x3b01e4ba,0x3c411034,0x3c2d883f,0x3c189f03,0x3c07cb29,0xbabb260f,0xbb904c8d,0xbaba0142,0x3bb52448,0x3bfc5b7f, +0x3b79f022,0x3a9ba003,0xba760aa9,0xbaeafacf,0xbb0162ea,0xbadc55ff,0xb9eb7d39,0x39c77ca2,0xb91817bd,0xba2bc967,0xb982dfe3,0x391f13c5,0x3957c43b,0x389c0380,0x3903c885,0x392142ce,0x38fbf637,0x399d77cd,0x3921d5fe,0x3a5e3560,0x3a086c5c,0xbb854aba,0xbae5cfe9,0xbb8c101a,0x3c121fb0, +0x3b298780,0x39a44932,0xbab8e4e4,0x3ada883e,0x3bb3b02e,0x3c145f0e,0x3baae31f,0x3b2d235c,0x3a362bb0,0x38e8ec24,0xb9176e7d,0xb673ec45,0x39749250,0x3a2ef928,0x3ab2ceef,0x3b186250,0x3b2aa58b,0x3b3d6796,0x3b273758,0x3b0a17c5,0x3aa07e91,0x38862152,0xb8fc5878,0xb8f51606,0xb8ccadc6, +0xb90fcf9f,0xb8f8b145,0xb923f9a8,0xb89faa29,0xb9998500,0xb9540e4c,0xbacbfedf,0xbc03ef97,0xbc22bf70,0x3befb5ca,0x3be3d91b,0x3bcf9b99,0x3bc43470,0x3b917046,0x3b52ffea,0x3a25cb34,0xbabbd13f,0xbae6daee,0xba92989c,0x3a09e3e3,0x3a0329f1,0x3a6e3250,0x3afe453a,0x3ab68551,0x3a9dd92b, +0x3a85b8de,0x3a5f088e,0x3a71192e,0x3ab5526c,0x3b099fa7,0x3b19ff91,0x3af7300a,0x3a80b935,0x39d90f1b,0x3905d671,0x392dad83,0x396f5868,0x3963845c,0x3914450b,0x394de6c7,0x3875a6d5,0xb8360ab8,0x3aa7d5a6,0x3b746ec3,0x3c04b40f,0xbab760ec,0x39a82cf3,0x3a7c7233,0x38cc4c56,0xba80e9b4, +0xbaeffe64,0xbac4aa15,0xb9db4934,0x3a20956c,0x3a8b93e5,0x3a91cf0d,0x3ae7e661,0x3b0e8628,0x3b110ef7,0x3af83e19,0x3a9132b4,0xb987883f,0xba56b330,0xba9001cd,0xbaa13f53,0xba9d829d,0xba0f13cb,0x3a1a2a1b,0x3a47bb1f,0x39d1fea3,0xb924a753,0xb9f3e16a,0xba0ec366,0xb9ff91d8,0xb99c648a, +0xb9a0667e,0xba24caea,0xba5fe41a,0xba8a815b,0xbabd6be5,0xba9781b2,0xb84aba98,0xba7e7e23,0xbab77996,0xba7cd990,0xba568e4a,0x39afa0d9,0x3a8b550d,0x3ae1ab28,0x3b010570,0x3b1b93de,0x3b328b66,0x3b16b472,0x3af0a247,0x3ab42c24,0x3a85a8ea,0x3a3fc2dc,0x39eb3a22,0x39e9b9b8,0x39690772, +0x3916f114,0x3a42bb1b,0x3a5dfebe,0x3a89159d,0x3a9f749f,0x3ad352e0,0x3b00b735,0x3addf7f0,0x3aae3e2f,0x3ab68d9d,0x3a2d4026,0x39a58df4,0xb9a8d4cc,0xb87a05eb,0x392575bb,0x3986bf93,0xb812b68e,0x3b224a47,0x3b3566a0,0x3b2ccc2b,0x3b2b9044,0x3b1db577,0x3b1ac888,0x3b165278,0x3b1be741, +0x3af7a881,0x3ab5226e,0x3a79aacc,0x3a12886a,0x39981aa7,0xb644b677,0x382db72a,0x38341140,0x3779dce1,0xb7bef678,0xb8b88e70,0xb8d75610,0x39188e18,0x3a30f63c,0x3aacc417,0x3ac20080,0x3af527ee,0x3b248da1,0x3b1daed4,0x3b2a5724,0x3b2c3634,0x3b230faa,0x3b1a8ac3,0x3b1a9c6c,0x3b163513, +0x3b0fd235,0x3b1e6980,0x3b1c0e51,0x3adf4131,0x3a98c467,0x3a9863bd,0x3a9f036d,0x3aa58879,0x3aa1b95d,0x3a9c5f8c,0x3a9ea8e3,0x3a871710,0x3a75f333,0x3a549c0a,0x3a3b5fcd,0x3a1a2d4f,0x39d551d4,0x39eba353,0x39e8d550,0x39ec0f4f,0x39f3adea,0x39f5eec3,0x39daa379,0x3a878da2,0x3a8c4d64, +0x3896172d,0x3acb217f,0x3ace7cf2,0x3a05cb7d,0x3a0523ad,0x3a0aff80,0x39fb5b2d,0x3a25afee,0x3a30d956,0x3a33d389,0x3ac98a86,0x3ae2603d,0x3a16c2c5,0x3ace91dc,0x3a6794f5,0xba761eff,0xbaa05913,0xba438b20,0xba274b43,0xba3ed67e,0xba1d43c1,0xba4696c6,0xba6ff0d0,0xbaa17b55,0xba9e996c, +0xba90af2d,0xba0356d6,0xba69af69,0xba6ece35,0xba72f2ea,0xba588f9c,0xba4d8e59,0xba346e4f,0xba5a30f2,0xba451f31,0xba70f066,0xbaa51cc8,0xba07c149,0x3ad891cb,0xbad6c63e,0xba66102e,0x3a9663ef,0x3a87e20b,0x3a79c011,0x3a3c7089,0x3a5f0c47,0x3a618588,0x3a00df09,0xba2c3027,0xbabc3c3c, +0x3aaaa569,0xba011abc,0xb930bde6,0xba8c5386,0xba3a87c3,0xba46d808,0xb9e07b31,0xba1b6341,0xba816d8b,0xbae5e2cb,0xbaf42760,0xbac4af81,0xb8990c07,0xba9c3811,0xbac2178a,0xbaba1c9f,0xba88e312,0xba3e781d,0xb9bfa47a,0xba0a559f,0xb9e03692,0xba496d1f,0x39b1f96c,0xba31d60d,0xba4e31b4, +0xba863497,0xba9084aa,0xbabb3de1,0xbaa6e84d,0xbac3d257,0xbafae778,0xba89cec9,0xba6a37c3,0xbade7f6a,0xba49822a,0xba0441ab,0xbab27c35,0xbaae13e3,0xba6bd73a,0x37cb3dbc,0xb8f54dd2,0xb71a4e1e,0x39d41937,0xb81a030f,0xba7b20f6,0xbb209601,0xbb3a64c5,0xbb204de7,0x3a3373da,0xbaa4914a, +0xbaa82bff,0xbac6a323,0xba63a301,0xba1c4276,0xb9299235,0xba0bc5d5,0xba315e64,0xb9d2d2e9,0xba3fc682,0xba81685f,0xb9ff2236,0xbb03162f,0xbaea3a93,0xbafce60b,0xbadbdc4a,0xbaee3c7b,0xbb5b2b76,0xbad775ce,0xbabf7b56,0xbb3fd7f4,0xb9d52def,0xb94890c7,0xbab33208,0xba82e357,0xbadb0d2b, +0xba5322b9,0xba4e5577,0xba3d9152,0x39abae62,0x3a06a738,0xba1f8383,0xbb43a867,0xbb807aed,0xbb226888,0x3aefb692,0xbaca2963,0xbb5dbb3f,0xbb5c7bfb,0xbaf95c63,0xb99b0cb8,0x3a771deb,0x3a6abebc,0x3a81c2f2,0x3a8a5061,0x3a1d31d4,0xb93f39f8,0xba53d487,0xbaf8fd97,0xba9c0ea0,0xba9eefed, +0xb9915cb0,0xb949bc25,0xb97cc123,0xba146eb4,0xba50b7a3,0xbb195ca0,0xba2c09ef,0xba2a7306,0xbb464471,0xbb1aeb6d,0x3b5b02ee,0x3b680787,0x3baf18b4,0x3baabdc6,0x3b85d369,0xba49de3c,0xbb46440c,0xbaf14001,0xbb4019da,0xbb58f576,0xbb562024,0x3a169775,0x3b8806f4,0x3be28307,0x3ad61dd9, +0xbb0c27d9,0xbb8f77a6,0xbbd2523c,0xbbe2e0b0,0xbbc81b1d,0xbba80720,0xbb852afd,0xbb2f1f87,0x3aa876c2,0x3a992b44,0x382fd825,0x39cc994d,0x386a7bb4,0x39aa29ba,0x391eb0a1,0x3a44dc9d,0x3a45c761,0x3af76839,0x3b4fb57e,0x3b73c844,0x3b557d35,0xbb2f8c48,0xbab28a23,0xbaa312a0,0xbb4ca65e, +0xbb61e8fc,0xbbe8cef5,0xbbbaf024,0x39f19c3d,0x3a9e0328,0x3b33f17a,0x3b2e68f6,0xbb6fe7e3,0xbbddf5aa,0xbbb73974,0xbb6b723c,0xbab9b753,0x396158c5,0x3aacbcb4,0x3a9a5110,0x3970ed5c,0xb99afccc,0xba0deb98,0x398c070b,0xb99c58a5,0xb9fe2d0f,0xb936e65d,0xb8e71359,0xb8f16fe0,0xb9018aaf, +0xb92466ac,0xb9913c5b,0xb99d3d39,0xbacdc5bb,0xbaa79695,0x3a892661,0xbaeacc2e,0x3a963f22,0x3bafc06f,0xba0b57ea,0xb9bb49dc,0x3b3b395c,0x3acb2a3b,0x3927c245,0x39b13340,0xbb9a0e57,0xbbbc461c,0xbb852785,0x3acf9ab2,0x3b4d99e6,0xb769cf6c,0xbb00f4be,0xbb309218,0xbaeb0c31,0xbb0ae477, +0xbac07733,0xba95bbd0,0xba23e4a7,0xb9d67959,0xba6f1bf8,0xb9647bb9,0x39425a4e,0x390dfc4f,0x388d721a,0x38c2dc8b,0x38b34743,0x38caa464,0x3925f715,0x390b3350,0x3a190101,0x39a3bd37,0xbb68ce28,0xba919b4d,0xbb9237a5,0x3bca9dc7,0xbb808624,0xbc142cf9,0xbc5e749f,0xbc19500e,0xbb23bfef, +0x3beb066c,0x3b5e595c,0x3a4b541c,0xbb1a12b8,0xbb245c85,0xbb302821,0xbb0b866f,0xbb2a0dfe,0xbb1fb9db,0xbabb44e3,0xb88c3507,0x3ab3b4c7,0x3b1209ed,0x3b104b5b,0x3ad6534e,0x3a25632a,0xb93e6663,0xb95230f9,0xb8a025b2,0xb8d8bbbb,0xb8e9367e,0xb8b2cbff,0xb8f1b70f,0xb897f305,0xb9334921, +0xb90f2df9,0xbaf3f132,0xbc0b927b,0xbc22bbcd,0x3bf96f71,0x3b56e1b0,0xbac93c4f,0xbb1a8cfe,0xbb291384,0xbb7445e7,0xbbb49946,0xbbcc2fc1,0xbbc07024,0xbba551b2,0xbb96a34b,0xbb69ee19,0xbb23319f,0xba7df57f,0xb76b08cb,0x3a38b48e,0x3a80d414,0x3a6cdc82,0x3a6f07f8,0x3a8a08fa,0x3ae005d0, +0x3b064105,0x3af15158,0x3a705076,0x39a8c72f,0x38bd5f11,0x39561a8e,0x39485ebd,0x39319fbe,0x38f7ef4d,0x39540cf7,0x385e91c4,0xb930ff7d,0x3a8fceee,0x3b726c37,0x3bde7c87,0xba729cdd,0xbae92a38,0xbaac5883,0xbae232c1,0xbb20c191,0xbb47ebb1,0xbb35adb7,0xbb36344d,0xb9c5893f,0x3a2efae6, +0x3a663fd5,0x3a2cc41e,0x3998db03,0xb7fd0e7a,0xb9c73aae,0xba626974,0xbab50f40,0xbacadaa9,0xbaab6c69,0xba7010b3,0xba71cb97,0xba156cfa,0x37620254,0x395be9b1,0x3908ddca,0xb9a131ff,0xba0634e1,0xb9f190b6,0xb9b3a1a2,0xb991e227,0xb9a9938f,0xba49aa42,0xba7e6d74,0xbad35150,0xbaff425c, +0xbb20652a,0xbaf3811d,0xbb1b789d,0xbb269b1e,0xbb1e58f3,0xbb1b2119,0xbad40139,0xba9231a9,0xba4f1eb1,0xb9a3f8d9,0x395efec8,0x3a6f2cc7,0x3a9c5c44,0x3ac1c675,0x3add4c35,0x3aa7f4e5,0x3a779104,0x3a248e62,0x39a64a23,0xb808d65e,0xba106dff,0x388f0393,0x3a20c9dd,0x3a89080b,0x3a915bda, +0x3abb7d84,0x3acbe916,0x3ab6669e,0x3a5fe9af,0x3a557485,0x3997faf2,0xb8bdc736,0xba420dd7,0xba44bb6f,0xba5f7d31,0xba5be5b9,0xbab4c48a,0x3b280917,0x3ad37552,0x3acf8993,0x3ab1d50f,0x3a92aa40,0x3a828747,0x3a63f14c,0x3a4ef4d9,0x3a5ea432,0x3a57d236,0x3a4392ac,0x3a32b81b,0x3a1ae99f, +0x39f5ed85,0x39ed7f6d,0x39f7f435,0x39fe4d4a,0x39ef1001,0x3a195682,0x39b57d7a,0x39a9dcc0,0x3a1cbb1c,0x3a3b2132,0x3aa376a9,0x3ab6e31a,0x3adc2bae,0x3ad8432f,0x3acba622,0x3ad588ab,0x3ac9ad60,0x3ad693ad,0x3ae00d8b,0x3ad79e33,0x3ae4db5a,0x3adfab7e,0x3ad07220,0x39a4bf60,0x39fd78d7, +0x3a19346d,0x3a0d242c,0x3a1673e8,0x3a01723b,0x39e09696,0x39b28f29,0x39c2c04d,0x39cce465,0x39d7af78,0x39e496c8,0x39ed8baa,0x39efded0,0x39f2e8d6,0x39e92abc,0x39e5eaff,0x39d81ca0,0x39d28708,0x39f9e99c,0x38272e17,0x39a0c7f5,0x3a9c15bb,0x3987c7ef,0x3a0e64fa,0x3adcf281,0x3aca4946, +0x3ac48594,0x3abb247a,0x3ab44d24,0x3aad0634,0x3aa5074d,0x3a153702,0x3986f9c2,0x3ad3f46f,0x3a3c879a,0x39b6f41f,0x3a8bae88,0x3a6cb257,0x3ac16d31,0x3a81ea03,0x3a95de71,0x3a86fc48,0x3abc6a40,0x3abc0ce3,0x3a8ec374,0x3a8cde5a,0x3a91cc4d,0x3ad00933,0x3a9c128e,0x3a992a99,0x3a9c8f8a, +0x3aa5f737,0x3aa9ce43,0x3ab76963,0x3aa25e61,0x3a863abb,0x3aa643a2,0x3a4a79ed,0xb9746980,0xbaff5a21,0x3a5900c1,0xb9bb71de,0xbb05b7ab,0xbb04143a,0xbb0173b4,0xbb0471f7,0xbaea2a65,0xbae5f649,0xbb00da1d,0xb7eae59f,0x3aa42cbf,0xbb03c176,0xb97f4bd1,0xba5ad111,0x3ace8d2e,0x3a67bc0e, +0x3a873109,0x3a7002c9,0x3b0e48ed,0x3b17d4a8,0x3ac0262e,0x3aaedd6d,0x3ac37a03,0x3b2bea50,0x3ab9a315,0x3a8e437e,0x3aa21e0a,0x3ad1ee75,0x3b0256d9,0x3b1fe0c3,0x3b0aa6fd,0x3ae8be6a,0x3ad2b425,0xba062996,0x3a0191e6,0x3a4e333e,0xb99e0fbf,0xba08f089,0x39a796a7,0x39574cec,0x39ca9e4b, +0xb9943a57,0x3a5c3f83,0x3a51e072,0xb9f3b06b,0x3a226731,0x3908dfd3,0xb9a077d3,0x3a2c446a,0x3a382f9f,0x3b04eae1,0x3abc3046,0x3ae61ce5,0x3aad103b,0x3b63ec92,0x3b735460,0x3b07ed39,0x3add71b8,0x3ad7ab72,0x3b86bf74,0x3b088918,0x3b034cf1,0x3b05662f,0x3b2a0e97,0x3b3c386d,0x3b5f4177, +0x3b223a50,0x3b047602,0x3a90513d,0x397b1f31,0xb9007525,0x39b73a98,0xba9aa01f,0xbab953ae,0xba6f5519,0xbac58bbe,0xba8ea579,0xbb20f5cb,0xba924a08,0xba88e95a,0xbb06fd1b,0x38bb4e1a,0x39f0060f,0xba50bc9c,0x39e601e2,0xb9e0a90b,0x3a93337c,0x3927e9da,0x395cf381,0x38c40188,0x3b89827f, +0x3ba7d3e5,0x3b38598f,0x3af72a41,0x3b35c068,0x3bc2f579,0x3b25bad8,0x3a4a77d0,0x3a945b3b,0x3b338ca4,0x3b93a2b4,0x3bc100f1,0x3ba13687,0x3b76ee63,0x3b288557,0x3a0b64eb,0x397192aa,0xba27ebd0,0xbaca5b6c,0xba86967d,0xba539ca1,0xb90103cd,0xb94c16f1,0xb9029965,0xb9a1a4c9,0xb9d9e6ec, +0xbae9ff37,0xb9c4e4d0,0xb8b6cae1,0xbb26dcad,0xba5ea1fa,0x3b928eb3,0x3bd749db,0x3c121bdf,0x3c175397,0x3c041b92,0x3b856d35,0x3b1b4b2f,0x3b90aaf5,0x3aed2ad0,0x39837444,0xb99816af,0x3b29483c,0x3bb3d5f3,0x3bee81e6,0x3b3cbab7,0xba13bacc,0xbb1527df,0xbb70f9ff,0xbb5b8516,0xbb47a1e0, +0xbb860a14,0xbb29fd22,0xbabc9b23,0x3adcd548,0x3a92d78b,0xb75841e7,0x3992a37d,0x38667386,0x395bedeb,0x38c3a156,0x39d93bdb,0x3a03e463,0x3abfa189,0x3b3f9c5c,0x3b768942,0x3b8a9cc3,0xbaac7403,0x3a40dc30,0xba49b6c9,0xbb22c529,0xbb736ea2,0xbbbd9c0d,0xbb9409b4,0x39e8a48a,0x3aa1d076, +0x3b3a9aea,0x3b57d269,0xbb5ecb3c,0xbbdb0e00,0xbba4c879,0xbaf5d0a6,0x3aed92e5,0x3bb07307,0x3b9e6916,0x3b5c868e,0x3a4a5d1c,0xba3117bc,0xba0695fc,0x3a0daa45,0xb97535db,0xb9c5043a,0xb8ce4bc7,0xb8b945a8,0xb8a98556,0xb8c00598,0xb89fd166,0xb9563408,0xb8fbc8f2,0xba824087,0xba18830f, +0x3a9e9f69,0xb9fb2d91,0x3ae8541b,0x3bd19b9b,0x3a8cfb17,0x3b217c14,0x3c1ec06d,0x3c36f4a6,0x3c352c5d,0x3c2537e6,0x3b14e2aa,0xbae2be3a,0xbb0e640b,0x3bc0f95e,0x3c170c5b,0x3be5b619,0x3b4c1a72,0xb4d94794,0xbab1af05,0xbadf2afd,0xba16ab8d,0x3a3b5cf5,0x3a78c418,0x3a1d08e5,0xb9c233c9, +0x393b19e9,0x392250e4,0x38b854f0,0x3847c505,0x38959558,0x386722e5,0x387960fa,0x38c61be7,0x38a860d7,0x39e21365,0x391d881d,0xbb397b0c,0xba01a834,0xbb947ed8,0x3b6ff835,0xbafaf199,0xbb3e9caa,0xbafce7d6,0xbaaef9b1,0x3b233e27,0x3c0b1caf,0x3bb42357,0x3b463deb,0xba5ac90e,0xba533c64, +0xbab18747,0xbaa56a33,0xba6c3f72,0x389ed7f1,0x3aaad3dc,0x3b1110e3,0x3b284bac,0x3b29009d,0x3af72ab0,0x3adab3cf,0x39f87768,0xb93ea3c7,0xb937050f,0xb8422edc,0xb896ab04,0xb8aace58,0xb8845662,0xb8670826,0xb878d361,0xb8afc86a,0xb90a5efc,0xbabedaae,0xbc09fb17,0xbc17430a,0x3bf779b0, +0x3bfa7b43,0x3bd8c375,0x3ba2e99a,0x3b9bff72,0x3b699232,0x3ac33567,0xba25120c,0xbad8dfef,0xbab45460,0xb966050a,0xb9badc5a,0x390dc832,0x3ab2f0d4,0x3a92ab3b,0x3a8eb0a5,0x3a9a39fe,0x3a825aba,0x3ac3bfc2,0x3b12616e,0x3b2a51c1,0x3b3f793c,0x3aee1277,0x3a5a1111,0x396b5a49,0x3876df4a, +0x390b5733,0x3917d638,0x38e7ec28,0x388d794d,0x38a933b4,0x38fb9ff6,0xb89b154d,0x3ab5a452,0x3b55c1ef,0x3c11386c,0xbb054d60,0x3a25eace,0x3aed64b8,0x3a5b655e,0x391c5b44,0xba1fb56f,0xb99c14aa,0x39ed53a6,0x39de3d08,0x39230c8a,0xb96b92c1,0x39adf9e9,0x3a275e49,0x3a35f4a4,0x3a30d2c3, +0x39c5a812,0xb9c62abf,0xba20e7a8,0xba6167bd,0xba979fad,0xba649306,0xb99e6a50,0x3a009a92,0x3a0c277a,0x395cc7a1,0xb975ddd4,0xb9a20e58,0xb9a5be6a,0xb9742c16,0xb8fb04d9,0xb900acd6,0xb9d34609,0xba39bed1,0xba5daeb2,0xbaa8a4cc,0xba557204,0xba96ae79,0xbad97355,0xbad1ac27,0xbab2f65a, +0xba96934e,0xb980e1af,0x39b97e75,0x3a80411f,0x3ab0e361,0x3affabfd,0x3b1e9eb1,0x3b1a835e,0x3b110e0a,0x3b065f78,0x3ad9aa38,0x3aaab6db,0x3a81a365,0x3a60662f,0x3a42de3c,0x39c558a7,0x3a239f8f,0x3a6b0f74,0x3a9fda01,0x3a988e2e,0x3a9e357d,0x3a9ad7b8,0x3a67d45f,0x3a29da7f,0x3a0c228e, +0x3900efa8,0xb97037b5,0xba256515,0xba2fec9c,0xba4c7258,0xba8359d7,0xba8df550,0x3aabc993,0x3aeb05d1,0x3af46765,0x3b02e75f,0x3b04e4ff,0x3b11864c,0x3b1c7d02,0x3b2b3881,0x3b141397,0x3aef855d,0x3abe2459,0x3a8fe93e,0x3a59dcb1,0x3a161468,0x3a229e4b,0x3a2ed704,0x3a32e8da,0x3a30c826, +0x3a25643b,0x3a3cda37,0x3a3146b2,0x3ab472cc,0x3aefcc3b,0x3af91b1f,0x3b1370b9,0x3b3f7346,0x3b37e4ed,0x3b33b31e,0x3b23f4f5,0x3b1eab05,0x3b11efc9,0x3b02bf56,0x3afcc4ab,0x3adb1ab2,0x3af129d5,0x3af0d68c,0x3abc5f29,0x3abbe118,0x3abb0d2f,0x3acb1ed9,0x3ad7be17,0x3ad97043,0x3adad1ad, +0x3ae80d64,0x3ad49832,0x3acedb82,0x3ac5c2d8,0x3abeb475,0x3ab3fc9f,0x3aa16daf,0x3aa57548,0x3aa314f9,0x3aa1bf83,0x3aa35404,0x3a9f0355,0x3aa55070,0x3aad9986,0x3a708cf7,0xb8d4f4b4,0x3ae97ff5,0x3aa036fb,0x390b0ed0,0x389033e0,0x38f124f6,0x39017ef9,0x392d4de2,0x393d2318,0x3937938d, +0x3a81e5aa,0x3ad29c98,0x38b31be4,0x3a756440,0x3ad84333,0xbaac19b9,0xb9bc9329,0xbabd406f,0xba780347,0xba88bdbd,0xba73d7ee,0xba8317f4,0xba975c1b,0xbac52914,0xbac7432b,0xbabe6729,0xba7665a5,0xbaa62f59,0xbaa7cd18,0xbaa717d0,0xbaa80b5a,0xbaa45fef,0xba8ec524,0xbaa03952,0xba8fd860, +0xbad28a95,0xb9d54c33,0x3a3559be,0x3b16c6fb,0xba8a0569,0x39a188ef,0x3afc2557,0x3af27428,0x3aeef150,0x3acca8c9,0x3af26106,0x3af452c2,0x3ac3d6be,0x3a0e8e12,0xba7ca37b,0x3afe73a1,0x3a5896c2,0x3a862712,0xbaa7fc88,0xba914b00,0xba7c3316,0xba4799fd,0xba23dd73,0xba72dd7d,0xbaeabf85, +0xbb061490,0xbaf179f3,0xba25e7b3,0xbad27006,0xbb008479,0xbb0148a1,0xbafed9fe,0xbad30be4,0xba81c806,0xba828017,0xba88bd1e,0xba8d9b4b,0x3a924ac3,0xba410ede,0xb9b5b914,0xba7e81f5,0xba6f9d51,0xba803863,0xbaba0f14,0xbac81953,0xbab7f7a8,0xba80e92f,0xba7f9906,0xbaa6664e,0xba3115d1, +0xb912d4ef,0xba475556,0xbaab43b1,0xb8b42b3d,0xb92aa398,0xba331c1f,0xb8a5ce6d,0x37ccc6bf,0x396597e5,0xba0611f3,0xbb13f277,0xbb397360,0xbb31717f,0xb8fe1f5e,0xbad893e9,0xbadd45d0,0xbaf0c91e,0xbaf1f1a0,0xbad26ed8,0xba440ae1,0xba845ade,0xbab82a45,0xba22dc24,0xb9643410,0xba53ae56, +0xb92a0679,0xbb0a1ee6,0xbacef87b,0xbaaea459,0xbaabe6e2,0xbae1b72c,0xbb02dd81,0xba9fb836,0xba5b1bd4,0xbb07f71c,0xb94e6800,0xb87ab1ea,0xba676ce2,0xba3f0def,0xba392634,0xba7f1823,0xba9b08b3,0xba42eea6,0xb9824626,0x3a8c1543,0x3a0b9eca,0xbb0ea047,0xbb640e63,0xbb2ebd20,0x3a3d2d0c, +0xbafa34e2,0xbb79093d,0xbb875906,0xbb7735c3,0xbb0e2201,0xb8ee0a5d,0x3921ac59,0xb91c4fcb,0x39a535df,0x3a29835f,0xba756adc,0xb9e26703,0xbb064268,0xba92a5ca,0xba056b64,0xb8a9e079,0x391902a6,0x392b0467,0xb8c42297,0xb9633abd,0xba999164,0xb9d3c5f8,0xb9b3a634,0xbb20b898,0xbb02f296, +0x3b893c2d,0x3b4c20cb,0x3b8dbf2a,0x3ba617d9,0x3b9c22c6,0xba14ce4c,0xbb422269,0xbae2adc7,0xbb6a8cbe,0xbb8e2770,0xbb908e39,0xba92ff86,0x3b3c8a58,0x3bd72a79,0x3b20eaa0,0xba96065b,0xbb8c57c4,0xbbc9dfb8,0xbbdf4583,0xbb9ddec3,0xbb5fb740,0xbb54e585,0xba944edf,0x3ab4476f,0x3a7556f5, +0xb69fdf74,0x3957645d,0xb89fa51d,0x37e06a77,0x380d4f91,0x397a76d7,0x395f7474,0x3a62bc62,0x3b164449,0x3b57994b,0x3b6d10be,0xbaf14dc8,0xba5fa515,0xbac252bc,0xbb32268a,0xbb3f07cc,0xbbc9d563,0xbbacef48,0x398394c5,0x39784ed7,0x3b009f07,0x3b635438,0xbb29503d,0xbbcc61ab,0xbbc51a3f, +0xbb8c43bc,0xbb0ae5d9,0xb9b74218,0x3a41f7a3,0x38388450,0xba17dbab,0xba2373dc,0xba2cb090,0x3975f611,0xba11a88d,0xb9b8d33e,0xb89eb8c8,0xb889ed00,0xb6ef37fb,0xb6da6270,0xb82ba108,0xb8eebbdc,0xb8ab697f,0xb9eda83b,0xba3a1af6,0x39ea8bab,0xbafce684,0x3b419ea0,0x3bd5dc14,0x3b033f98, +0x3a856d3d,0x3ae4ac15,0x3b3e469e,0x3afa39d0,0x3a8499a3,0xbb795da7,0xbbc29d90,0xbbd16a5f,0xb9c2c95b,0x3b235a17,0x3aeeb2aa,0xbaa28b1d,0xbb1a302d,0xbaac4110,0xbadb17c6,0xbaaa455e,0xb8f722e8,0x39a2910a,0x379d94e8,0xb997d29c,0x392bbbae,0x3950a5b0,0x3869d717,0x383dde5a,0x37b4efed, +0x3784cc15,0x37d244d4,0x38ab6a35,0x375c9a39,0x39af3d62,0x38bc17d2,0xbb0882ee,0x39534f83,0xbb8d4c9f,0x3a350155,0xbbdd6058,0xbc1c1527,0xbc532c3f,0xbc352a87,0xbba311b1,0x3ba3aaf0,0x3b9e2445,0x3b5638b0,0xbacb38df,0xbac8b8f4,0xbb1d358e,0xbb1ca716,0xbb46fd1d,0xbb35e7a5,0xbaff63fb, +0xba3296b3,0x3a0cd561,0x3ae4658e,0x3b0a40c7,0x3a9247ab,0xb88da92f,0xb9997da2,0xb908a25e,0xb865c19f,0xb8800409,0xb82d6662,0xb7e767ca,0xb818102c,0xb85b7957,0xb8a840d2,0xb815abd1,0xbada7757,0xbc00f8d2,0xbc078481,0x3c235613,0x3bcf3583,0xba11cef0,0xbb2c5eaa,0xbb276b32,0xbb58846c, +0xbb9a02e1,0xbbbb9db5,0xbbb702ca,0xbb9c94d4,0xbb810042,0xbb4b1e0f,0xbb094d2f,0xba0e242e,0x39ca06b7,0x3a869d47,0x3a99d2cd,0x3aba7ea5,0x3ac61057,0x3ae2f69b,0x3b2ba72c,0x3b15c0cf,0x3ac0cbf2,0x3a2734ba,0x38d389ba,0x38d6372c,0x38f27060,0x38a2cd52,0x38877eb3,0x383b196c,0x38b29379, +0x39088bb3,0x3812065e,0x3ac1b332,0x3b6f5abb,0x3c078ceb,0x39c688f5,0xb9856180,0xba45342f,0xba830636,0xbb00a48f,0xbb3aa0cc,0xbb4564b6,0xbb5b9771,0xbab158a1,0xba2385dc,0xba1f0deb,0xba3dd50a,0xba6e2a81,0xba8ebdce,0xba91b84a,0xbaaceda8,0xbadecae3,0xbae7023b,0xbab7b86f,0xba58861c, +0xba44d63e,0xb991cd84,0x39ccbeff,0x391c68ed,0xb8283a3e,0xb99d0a51,0xb989a5ad,0xb918cafb,0xb919bff3,0xb8776869,0xb8f196e8,0xb9c45a64,0xba32ccc4,0xba8d57d4,0xba9f5f71,0xbaae49d6,0xbb0ab0e5,0xbb41e2a6,0xbb50e0d3,0xbb3f0551,0xbb3dfc4c,0xbb1480e7,0xbafb286b,0xbaea3cb6,0xba8cf045, +0xb9ad6ad6,0x3a140570,0x3a8ae966,0x3ac99e0f,0x3b03b87a,0x3ac7fe2a,0x3a937082,0x3a3d26aa,0x39e6ca91,0xb80e2403,0xb9a7a42f,0x39daf00e,0x3a3b39d3,0x3a8367f5,0x3a521d54,0x3a76df86,0x3a2a7aca,0x3a29f693,0x37665082,0x39959deb,0xb999bcd8,0xb9c85fd4,0xba823211,0xba8e1a7b,0xbaa05a09, +0xba9942c8,0xbaf1a1d8,0x3afe0121,0x39ea7eca,0x39e7ed5c,0x39b0023e,0x39363268,0x38f1424b,0x38a5b138,0x38969a3d,0x398fe765,0x39b1904a,0x39c0d4ce,0x39e50861,0x3a0793e4,0x3a2baaee,0x3a214569,0x3a2f8741,0x3a335508,0x3a36bc78,0x3a53edbc,0x3a193480,0x3a858450,0x3a7457eb,0x3a97c074, +0x3ad8ff32,0x3afead74,0x3b053eb8,0x3aebd644,0x3adaf089,0x3ae6745c,0x3aa9fc54,0x3a91fbea,0x3aa1919f,0x3a8a1c83,0x3aa1b6f7,0x3a94c1ea,0x3a2dc907,0x3a30fe19,0x38dbe9b5,0x39c7cc82,0x39af8a30,0x39c862f1,0x39b191c8,0x399b9fd9,0x396470c6,0x39996429,0x39c2ff49,0x39f2a684,0x3a113d1d, +0x3a21c503,0x3a32a5b5,0x3a2f5482,0x3a2bf413,0x3a2a5998,0x3a20eae5,0x3a254fb0,0x3a106358,0x3a4945cb,0x3aaf476f,0x3b0c3b46,0x3a532965,0x3ac80334,0x3b2b1bc0,0x3b218bb2,0x3b1a6239,0x3b0da358,0x3b0e2da7,0x3b0887b7,0x3afbb468,0x3aa34c46,0x39ff0358,0x3b071d5f,0x3ab08739,0x3a1032fb, +0x3a2a72fd,0xb9e1dd6f,0x3aaefc1f,0x3a30b875,0x3a4cdd3f,0x3a23ec37,0x3a7448d0,0x3a710e34,0x3a387bb7,0x3a24ca9f,0x3a2d07e9,0x3a8df3b8,0x3a44c0d1,0x3a3bfd39,0x3a3a8a9e,0x3a3f8258,0x3a48b02c,0x3a781a52,0x3a4ecd2d,0x3a21457d,0x3a84f81a,0xba185f42,0xbac72b7e,0xbb0826e7,0xb9d1ccf0, +0xbadc79a5,0xbb0ea7d0,0xbb1b464b,0xbb1835b5,0xbb0e7450,0xbb10c58c,0xbb13a60b,0xbb1c1382,0xbaace116,0x38c71e90,0xbb11f4f7,0xbad19479,0xbaeaeacd,0x3a8be70b,0x3a4dc441,0x3a244fa0,0x39cb9dff,0x3aa92baf,0x3ab721ec,0x3a702630,0x3a295eb9,0x3a522a02,0x3aec77ea,0x3a688bcd,0x3a0ebafa, +0x3a04130b,0x3a1a927a,0x3a69747e,0x3accace4,0x3aa0a778,0x3a9caed4,0x3a3e0092,0xbabc2a69,0xb8b72609,0x379f4a6d,0xba796848,0xbaa14d2f,0xb914fe5d,0xba19929b,0xba2c796d,0xba955a89,0x38c76bd1,0x39e91aa2,0xba386b5c,0x38f07fbf,0xba01053d,0xba7c10b9,0x3961a6ed,0xb99694a4,0x3ace4e83, +0x3acb4936,0x3ab26e81,0x3a648e6e,0x3b1827de,0x3b19d987,0x3ac771ed,0x3a4bfc5e,0x3a4008f8,0x3b39fab9,0x3aa8e888,0x3a99830f,0x3a727885,0x3a926b76,0x3ab0a847,0x3b1b3165,0x3ac31361,0x3abc0163,0x3931c2d8,0xba40b698,0xba453ee6,0x38159151,0xbae1ec0f,0xbafe7b0a,0xba23fe37,0xbad19418, +0xba54add3,0xbaea2cf3,0xba23c052,0xba836d7f,0xbabf74ad,0xb96b6448,0xb8541b2c,0xbaa3a155,0xb950e017,0xba805f5c,0x3a79e033,0x3a2c8f07,0xb8f3e25c,0xba13c601,0x3b19db52,0x3b46de8a,0x3afc4837,0x3a122eff,0x3aa99f38,0x3b84fa01,0x3ad1b5fa,0xb95024b8,0xba2409a6,0xb8b852dc,0x3abf080e, +0x3b6eb5b0,0x3b41358f,0x3b29c36b,0x3a9c77f4,0xba0a668c,0xb8c2ea7f,0xba4e9543,0xbac83544,0xba395f7c,0xb8d487a1,0x378cfd32,0x39037e1c,0x39dbe25c,0xb75fad3d,0x38c94209,0xba29f11d,0xb8d2d773,0xb91b6b42,0xbafc5036,0xba7d18b4,0x3b2b6700,0x3ba2082d,0x3c07c32a,0x3c11a01c,0x3c0d62ef, +0x3b76c1cc,0x3ad7a24f,0x3b6d15bf,0x3ad5bfb0,0x3a1220aa,0x3971e4ef,0x3b40671e,0x3bccf296,0x3c108bfa,0x3ba45aa2,0x3ad05249,0x38048945,0xbb292ab9,0xbb2fc76b,0xbb4bb530,0xbb879558,0xbad5444f,0xb9dad343,0x3abfd631,0x3a161f1b,0xb870ff72,0x38d69de5,0xb8a49d89,0xb8c85503,0xb83fa15d, +0x38e1d1f1,0x3879d572,0x3a01eab4,0x3ad1517c,0x3b1f0880,0x3b21dedc,0xbac597c2,0x3aea2d64,0x3aaf5272,0xba9d4679,0xbb3916c7,0xbbc12703,0xbbb3859b,0xba14a4ed,0x39df21e6,0x3b334db2,0x3b980c68,0xbafd0555,0xbbc0c53c,0xbbb64563,0xbb29116c,0x3a2f0308,0x3b69966c,0x3b41e23b,0x3b070449, +0xba00b54c,0xbaa5da36,0xba346ca4,0x39427447,0xb9d54f53,0xb980cc24,0xb792ae52,0xb807ecf7,0x3790b5e8,0x3835a621,0x379c164b,0xb87ac40e,0x359fa449,0xb9ad1505,0xb89563f3,0x39adba3e,0xb9d63975,0x3b71f600,0x3bf49b15,0x3b3d10f3,0x3b1290b7,0x3b8f4c6d,0x3c03ac71,0x3c0ee6fd,0x3c0063d1, +0x3b6cee2f,0xb8e6c51e,0xbb430b1b,0x3b9203ac,0x3c0665b5,0x3c041e98,0x3b770453,0x3a2964c8,0xb9d3ae42,0xba6bb657,0x39ea1f5f,0x3aa70068,0x3a86992d,0x3a56d036,0xb94dfd27,0x399b3fe7,0x38be2c4b,0x3811d511,0x3782c154,0x368df55f,0xb7b513ed,0xb711ed2a,0x37d999dd,0x3605cd93,0x39371ce0, +0x3919c259,0xbaf7b42d,0x3a353d76,0xbb8a2e08,0xbb5f2c60,0xbbd55f19,0xbbd681fb,0xbbc5780f,0xbbd3045e,0xbb2120be,0x3bb97c13,0x3bb349c0,0x3b81d8fc,0xbabbc4b8,0xba8f87b9,0xbb050af0,0xbb05aa2e,0xbaef628d,0xba4e1ebe,0x39dc3a09,0x3aa66b0a,0x3af74dcb,0x3afdaaca,0x3a9f80fc,0x3a76b16f, +0xb957a13a,0xb96a566f,0xb8baa20f,0xb70ddd1a,0xb82995f1,0xb7399a77,0x36f43401,0x374fc3fd,0xb735f5d8,0xb7af7bb2,0xb6c242ac,0xba8f67f0,0xbbe0967a,0xbbd3f04e,0x3c0356b0,0x3bec63b9,0x3b64d273,0x3a2723b3,0x3abca4af,0x3a106424,0xb9ba01dc,0xbaaedddc,0xbb1e16ce,0xbb120ba3,0xbada735a, +0xbabd62d5,0xba376157,0x3a330e41,0x3a7daaaf,0x3aa1d891,0x3ad27684,0x3acd6ded,0x3b0f6b98,0x3b301b1a,0x3b2aadbf,0x3b335ff1,0x3ab5044a,0x3a001984,0x3735fa11,0x38443e02,0x38847f74,0x38210ae6,0xb746714d,0xb76155a2,0xb7bb02a4,0x389baf3c,0xb8a27b2a,0x3ab7da35,0x3b317439,0x3c03a70b, +0xbacb6b56,0x3a03cd5e,0x3ad0c55f,0x3a76095c,0x3a093ff0,0x37838b82,0x39128a66,0x395b1c63,0x396f3da9,0xb85ac0e6,0xb9ee0d98,0xb99a25e0,0xb9df6c86,0xba33ec51,0xba16b6ba,0xb9fd6e19,0xba096b0c,0xb9fe4dc4,0xb9ec4bdd,0xba486e26,0xba09985d,0x38219b39,0x39955306,0x398a5c9c,0x382b5ee7, +0xb92ae3c9,0xb8e500c2,0xb8c16b65,0x3835b5de,0x3835391c,0x38bbdc03,0xb88894bf,0xb9c1cd95,0xba027a68,0xba7319cd,0xba02a0e2,0xbb12a285,0xbb0df3e6,0xbadda381,0xbadd0426,0xbabae37c,0xba5f9265,0xb9e593f4,0xb7ffeb25,0x39d79327,0x3a862ec4,0x3ace832e,0x3aff2cc6,0x3b147241,0x3b25d2c3, +0x3b0c010e,0x3ae0b234,0x3ab166b6,0x3a9087a6,0x3a8f9aea,0x3a06ef3d,0x39bf154f,0x3a3dd44a,0x3a84f5a1,0x3a4ea639,0x3a1459b2,0x39d2a6d8,0x39021005,0x38574ccd,0xb935d3fe,0xb9b39bda,0xba449b7f,0xba8490e1,0xbaaa795f,0xbadbf51c,0xbb0b699c,0xbb078e94,0x388f6623,0x3a0f1f0e,0x3a47e624, +0x3a74f023,0x3a916e2d,0x3ab3f442,0x3ad757b5,0x3af94473,0x3af5ba82,0x3ae4a002,0x3ad1ee38,0x3abcce78,0x3aa7f518,0x3a98224f,0x3a99596f,0x3aa3e127,0x3aaae4ac,0x3aad5119,0x3ab12d3e,0x3ab9a903,0x3a5ce664,0x3ad9c58b,0x3aeeb12c,0x3af7b893,0x3b044d30,0x3b22f0b4,0x3b1a27d9,0x3b0832e3, +0x3aded233,0x3adea062,0x3ad228f6,0x3aa5b9bf,0x3a9d20f5,0x3a65111c,0x3a6ae82b,0x3a7bc3ab,0x3a4e9b8c,0x3ab7d1e1,0x3ab351fb,0x3ac4fac6,0x3ad2bb30,0x3ad7a89e,0x3adc8229,0x3ae90af9,0x3ae32d96,0x3ae5ea2a,0x3ae8557b,0x3aebc62b,0x3aed1a42,0x3ae8ff5a,0x3aeb2ea5,0x3ae89c31,0x3ae67462, +0x3ae60911,0x3adda110,0x3af73453,0x3a9c8305,0x3a193dc9,0xb844c2cb,0x3ac3dab0,0x3a32cd7b,0x391b686e,0x38292032,0x3896cc0a,0x38de62ae,0x37817e4a,0xb821055b,0xb89d2c42,0x39bf71f2,0x3a919483,0xb919f517,0x395bf95a,0x3b034348,0xba404b0b,0x3a36b6bf,0xba6fb178,0xb9f29de4,0xb9fdb1e2, +0xb9fca11e,0xb9a396aa,0xb9cf66e7,0xba3ab6bd,0xba4b9200,0xba46c3fa,0xb9d4434d,0xba21d854,0xba250a94,0xba28825d,0xba4248c7,0xba40ee23,0xba09d9da,0xba2a2c9c,0xba1faaa9,0xba9072e9,0x3a1a515e,0x3a9dbd18,0x3aaa0669,0x371b6ff6,0x3a6b66b9,0x3a981a9c,0x3a8e4185,0x3a92fdc2,0x3a826fec, +0x3aae09ea,0x3ab2b977,0x3a8f2be1,0x3a9b726d,0x3903c188,0x3a8bc97d,0x3ab66f96,0x3aad47e4,0xb9d76a14,0xba2719d9,0xb9c8cb40,0xb9f04f2a,0x3992fecf,0x39842234,0xba0775f8,0xba662866,0xba5e0d2a,0xb782d1d0,0xba3135b8,0xba8b3c8e,0xbaa24dd4,0xbac55117,0xba9e2780,0xb9d0b401,0xb9c20928, +0xba180cee,0xb9f98989,0x3a867ab5,0xb9bc2abc,0x39baea5c,0xba33c4cd,0xba2357a0,0xb918560d,0xba89631f,0xba8349fc,0xba17cb38,0xb9aa4404,0xb9d63612,0xb9f5da24,0xb91daeec,0x395abc59,0xb8c24b64,0xba1309c7,0x3a56c701,0x39f4dd6d,0xb9a8f1a1,0x3a0ab7c9,0x390c0ee5,0x3ac27540,0x3aab7cb5, +0xb981a406,0xba806b4b,0xba986c4c,0x3a0b7025,0xb9acb68a,0xb9d38461,0xba2990f9,0xbaa0c018,0xba8f2252,0x38c84cf5,0xb998ac56,0xba5674cc,0xb9c82ccc,0x394ee199,0xb9f7927f,0x3972a1e3,0xbaeb1459,0xbaafa1a1,0xba1d32fe,0xba89d0ff,0xbaa16076,0xba74b911,0xba34ebf5,0xb9b8e233,0xba8c954e, +0x37c876ec,0x39072df3,0xb9c716b5,0xb8ddb71e,0x3984a17e,0xb992aa1e,0xba7090c7,0xb9e0ddc3,0xba3d96c5,0x3b172e83,0x3b3beb41,0x3a2289a6,0xba72eeb7,0xba547fbf,0x3a9f019f,0xb9820cb3,0xbb015de8,0xbb39ae2f,0xbb639a60,0xbb06868b,0x3a1e4b74,0x3a4efc87,0x385ea401,0x3906fdd2,0x39bcf56c, +0xba8ee315,0xb96536da,0xbadcb8b8,0xba204c46,0xb88873a3,0x38d0f894,0x39d7401e,0x39674a3d,0x39372bf8,0x3678ea64,0xb98ec630,0xb96329bb,0xb8496e86,0xbada35f6,0xba972104,0x3b9984bb,0x3b58985f,0x3b99432b,0x3bc88f87,0x3bd0715b,0x3ab9967d,0xba37df48,0x3a3e096f,0xbad2be5e,0xbb2b2f91, +0xbb2d39ab,0xb999412f,0x3b64dc8c,0x3be8081e,0x3b90e31d,0x3a94291e,0xbb205c3c,0xbb8c7f44,0xbba0309c,0xbb3e4ae9,0xbb097510,0xbaf5b60e,0x393c1a07,0x3a8b9cb6,0x39f31a1d,0xb7970e3f,0x36ac258d,0xb92f55a9,0xb8afc755,0xb8a13f89,0x3853f390,0x389a96cb,0x3947d128,0x3aaf8b7f,0x3b19e29f, +0x3b62cedb,0xb9467cd0,0x3a0d58d0,0xbab5db3f,0xbb0df94a,0xbb3def00,0xbbad060e,0xbb9e28ce,0xb9cc95fe,0x366cf8fa,0x3b0b414e,0x3b9875f3,0xba809879,0xbba33f03,0xbbba427b,0xbb7a4c82,0xba9de887,0x3a8ef9a7,0x3ad0ce0c,0x39a36ca5,0xba3b3609,0xba1f60b4,0xb9d24e0f,0x394f2961,0xb9ed67d7, +0xb9409ed4,0xb80e7680,0x3798f38a,0x387a0362,0x3857bf16,0x37fe005a,0xb7be0e1d,0xb7bd21d9,0xb928e4dc,0xb964ba45,0x39c8e562,0xba847181,0x3b995e93,0x3be2fae8,0x3b38e0eb,0x3ab605fc,0x3abd4832,0x3bc0a2df,0x3bcb47b8,0x3b8e0904,0x379ad245,0xbb6e1a9c,0xbbd4c797,0xb9aa10ef,0x3b720b78, +0x3bacb650,0x3aadb01a,0xba57b01d,0xba52167b,0xba8aeebd,0xba4359dd,0x3a8aeb8c,0x3aa7e74f,0x39fbb94b,0x39496272,0x395611f9,0x38d30145,0x37a477c3,0xb6cb2565,0xb8062fd9,0xb7e061b8,0xb7eb677b,0x37b220f6,0xb7baba47,0x39181663,0x39734651,0xba9dcc8d,0x3a786bf3,0xbb8e5b29,0xbbe9f499, +0xbc021757,0xbbdb102d,0xbbfeef32,0xbc08701f,0xbba070c4,0x3b0bb782,0x3bb92f95,0x3baf705b,0xb9cd99d3,0xba24dbbb,0xbb0e6e9f,0xbb2806f1,0xbb358b75,0xbb099c4d,0xbabfdbde,0xb9f1145a,0x3906f7c6,0x3a9cc301,0x3ada456a,0x3a096845,0xb9c7e304,0xb935c0b3,0xb8440d25,0xb7af5d96,0xb499ff12, +0x37c214ec,0x37d6a605,0x37bc55da,0x37af715a,0xb82be658,0x38804b91,0xba67c1e0,0xbbba6ce9,0xbbaaf86a,0x3c225d8f,0x3c06f3af,0x3ae4ee7b,0xbaa10f2f,0xba6f8b6b,0xba943b9a,0xbae1e1b5,0xbb34659a,0xbb59d5e4,0xbb492bac,0xbb106567,0xbaf8b315,0xba96d5a2,0x3974cb3e,0x3a27f4c7,0x3a86ce0d, +0x3aa155a4,0x3aea2c7e,0x3b0bd4ea,0x3b268ade,0x3b5984cc,0x3b1d1a3c,0x3a8aeff2,0x39a44cad,0xb820bf0f,0x38895094,0xb6cfe3fd,0xb7f74764,0xb80742c5,0xb85232cf,0xb83a46ed,0x38337ca2,0xb8bf2c9b,0x3ab6c737,0x3b3fcf77,0x3bfcd14a,0x3a864275,0x3aae9f22,0x3a45c081,0x3a309489,0xb95438e5, +0xba943a98,0xbad11221,0xbb0139db,0xbaa82e1e,0xba963471,0xbab0231e,0xbaab7136,0xbab5f1f4,0xbacd54fa,0xbab375a1,0xbaa641e0,0xbab98709,0xbaa53fee,0xba7d22c5,0xba073416,0xb98400e7,0x39768dd4,0x3a4f9731,0x397f1033,0xb8028356,0xb8ceeb4d,0xb7467522,0x38c5cfd6,0x382faf3c,0x3922edf3, +0x38bfc47d,0x38861f27,0xb9361a95,0xb95f18be,0xb9a6878c,0x393046ec,0xbaea24d6,0xbb207801,0xbb258c8c,0xbb103cd0,0xbb07ebbe,0xbad0a312,0xbab4654b,0xbaacc22e,0xba468f10,0xb92445db,0x39fe3673,0x3a7e1597,0x3aba75c2,0x3af9fd36,0x3ac7f629,0x3a9a9256,0x3a52af71,0x3a36c9b5,0x39c09bb6, +0x39d09d7a,0x3a6c3701,0x3a604c57,0x3a66da36,0x3a0a469e,0x39f12355,0x3822c577,0x383923b8,0xb9d00154,0xb90632fb,0xba111987,0xba0f76dc,0xba826b53,0xba992cfd,0xbab35c63,0xbab5b05c,0xbaeba24c,0x3a67c351,0xb91fc9bc,0xb896de32,0x38a448fe,0x38f49447,0x39709627,0x39cb026e,0x3a175b34, +0x3a419609,0x3a4f0440,0x3a587ffb,0x3a689c06,0x3a812ccd,0x3a9e936b,0x3a95b6ee,0x3a9bdd51,0x3a9a97fa,0x3a9ddc8d,0x3a9ddbc6,0x3a929c67,0x3ad0e127,0x3ac28b14,0x3aeaf32c,0x3b0165a5,0x3b12424f,0x3b118b1e,0x3af7fd97,0x3ae6b86a,0x3ae337f5,0x3a9da29b,0x3a5e4670,0x3a6e303d,0x3a3ad33a, +0x3a55867e,0x3a408768,0x395c2257,0x3ab0bbf9,0x3a00f428,0x3a4e4a8a,0x3a54184c,0x3a670e2a,0x3a7035b9,0x3a73d7f8,0x3a7519cc,0x3a7eac87,0x3a89b07a,0x3a95bb1d,0x3aa212a0,0x3aa9d308,0x3ab12ded,0x3aaea7cb,0x3aad7a3c,0x3aac02f8,0x3aa7d3a4,0x3aa8fb7e,0x3a95ab04,0x3ae63a6d,0x3b0c3f48, +0x3b0c57ad,0x3ae58f57,0x3b16632b,0x3b23a873,0x3b1dfc6c,0x3b17a844,0x3b0b02fc,0x3b0de41f,0x3b08cd16,0x3af9050a,0x3aebc38a,0x3aa2136b,0x3adebbde,0x3ae636e7,0x3ab9ac89,0xb9f39b0b,0xbab59085,0x389c3a26,0xb97f6db6,0xb98448cd,0xb9c214fe,0xb979f9ae,0xb994ab78,0xb9d4029a,0xba064518, +0xb9fcd170,0xb924af01,0xb9b066fb,0xb9c329b1,0xb9e77ac3,0xba06f56a,0xba01f093,0xb989215a,0xb9c7164f,0xb9d3cb23,0xb9873037,0xbac4c62e,0xbad48dcf,0xba1165ae,0xbacbfe26,0xbaf8df59,0xba4002f6,0xba8cd645,0xba8c9cc4,0xba6db347,0xba840ab5,0xba8ab7e3,0xba98d161,0xbaccf680,0xba9ba1fc, +0xba59ea0f,0xbadafbf7,0xbab88926,0xb99b53f6,0xb8dc2faa,0xb9c7782d,0xba253140,0xb9531ced,0xb94dc07f,0xb9d483fb,0xba4b55e7,0xba2a9d54,0x38d80edc,0xb9abd07b,0xba30a0da,0xba84cf8b,0xbaabe1ef,0xba93f072,0xb996b028,0xb9de969b,0xb955cbba,0xba3eca19,0xba9dd42e,0xba5515d9,0xba3a4b33, +0xbabc27ae,0xbad0bdd7,0xba44e4c1,0xbacb558d,0xbae86c84,0xbade2984,0xba5b47af,0xb9cbc2ad,0xba725762,0xba1ab6d9,0xba69d7a3,0xbab14ea8,0xba425c11,0xba83b564,0x39e0f20c,0x3a26bb43,0x39c2a842,0xb8d259fb,0x3a096df2,0x39918ff3,0xb7a46a4a,0xba7c2acc,0xba7f0f45,0x3a0e5a9a,0xb8857e9b, +0xb96604c7,0xba62325b,0xbaaeb59c,0xbaa369a0,0x3908df63,0xb9bf99ac,0xb948c38b,0xba817a8f,0xbaaeb514,0xba9f599d,0xb9979b04,0xbb06ffd6,0xbaf987f7,0xb9df4d44,0xbaa08f0e,0xba1fa005,0xba661291,0xb998b984,0xba24f9b4,0xba584388,0xb9d0d895,0xb9f76f33,0xbab088b1,0xba790e4e,0xbaa6d165, +0x366665f0,0x396d44e7,0xba449be4,0xbab45ed4,0x393ab45e,0x3a024fec,0x392f622f,0xbabaf947,0xba85b865,0x3a76e512,0x3824baae,0xbad7922d,0xbb4cd526,0xbb854184,0xbb406ba1,0xb8a7cfc2,0x3808f88f,0x39ce103a,0xba0025c9,0xba88dbfe,0xba2bdeb9,0xba2d39b9,0xbaa925e6,0xb96ab9aa,0x3931504b, +0x394d7d0c,0x39937c65,0x398dc6fc,0x38dc2d37,0x3940bcb1,0xb7d0afc4,0x35a6298d,0xb97ba5ce,0xbab52675,0xbaa94e65,0x3aa848e6,0x3b0c1367,0x3bb0b566,0x3bcf1bf2,0x3be4b0c5,0x3b02cebb,0xb96268c5,0x3a9fdcc3,0xb91e5c7f,0xba06dc1e,0xb84032ae,0x3b12d40d,0x3bbe4694,0x3c14135d,0x3bcfbaa4, +0x3b474369,0x3a14b0c2,0xbb2ecec0,0xbb5c31d0,0xbb62e929,0xbb5fe508,0xba87b3c9,0x399842d9,0x3a5b8c97,0x3926d4e0,0xb88ab81b,0xb8875120,0xb9039d4f,0xb8e971bc,0xb87ea553,0xb8626d39,0x370a0411,0x36a9bfc4,0x3a1457cf,0x3a94997d,0x3a901e85,0xbac2800c,0x3aa521ea,0x3aaf8f67,0xba8854ab, +0xbb127618,0xbbbe3d8f,0xbbc8ab4b,0xbafc0d96,0xba306183,0x3b08b070,0x3ba438fb,0xba377264,0xbba23317,0xbbcc4c78,0xbb861026,0xbacd2841,0x39de1d4a,0x3a18cae9,0x399e48b8,0xbab6424c,0xba939151,0xba009440,0xb8a55943,0xb9b467b1,0xb8cbdc15,0x37ef5c51,0x380284ec,0x388201cf,0x3855e920, +0x384d43d6,0xb588887f,0x388bdc5c,0xb925b7f3,0x3842f0fa,0xb7303352,0xba12eedf,0x3b99649a,0x3be3ba5a,0x3b79a6cb,0x3ab4cf2d,0xba86465b,0x3b7f7f1f,0x3ba2349d,0x3b674b03,0x3b17ae59,0xba832b3a,0xbbb21be1,0x39956733,0x3b8818cd,0x3bce1afd,0x3b2e25fa,0x39aa056f,0xb8ef9346,0xb9f36e79, +0x3a133606,0x3a8d1417,0x3a214a4a,0x3a07db40,0xb7c3a9c9,0x3963bbc1,0x37ed417f,0xb63bc7aa,0xb7cab3c8,0xb80459b8,0xb8276153,0xb7e1653a,0xb805ff2e,0x362775b1,0xb82e106f,0x3a000cd5,0xbac907c4,0x3a8c0d5b,0xbb9c8d3a,0xbc2acf27,0xbc0c7d8e,0xbbf8861d,0xbc136b57,0xbc1db4ae,0xbbd4db20, +0x3a753f99,0x3b99dcab,0x3b9a7909,0xba9a7555,0xbabaaf8f,0xbb44a689,0xbb4aef8f,0xbb56f25a,0xbb22d85c,0xbac70679,0xba27c559,0x3973aacb,0x3a4241d0,0x3a175105,0x3901b56a,0xba088706,0xb88ddbe6,0xb80970d6,0x3762623c,0x3742e699,0x38131dad,0x3815726c,0x3846199d,0x3808c03c,0x3815b548, +0x367d7c3e,0xb9a3d4dc,0xbb92a8b0,0xbb6611ff,0x3bf779c5,0x3bc473f2,0xb986fc31,0xbb7399f4,0xbb2484b3,0xbb48823f,0xbb3e6464,0xbb37bdf2,0xbb71326b,0xbb71295a,0xbb67e5f9,0xbb38ebfc,0xbaf11b84,0xba03a9a7,0x399bbf31,0x3a6b8102,0x3ac3a9a7,0x3aea3698,0x3b1952c5,0x3b28adcd,0x3b244cad, +0x3b05997b,0x3a599616,0x39226ed3,0xb835f099,0x378cabdc,0xb80b1585,0xb830d15c,0xb897d00e,0xb8877783,0xb8f0676f,0x37473975,0xb95c0e93,0x3a857567,0x3b110955,0x3bbe1cc9,0xb98378d7,0x3a1b4477,0x3a8ab622,0x3a777bad,0x3a25770d,0x36ec9178,0xb9da76a1,0xba9fd58e,0xba65add7,0xba65cd78, +0xba8ae2ec,0xbaa8973a,0xbae35a7a,0xbb10f128,0xbb025b4e,0xbad535a7,0xba97fc54,0xba5c435f,0xb9ebf92d,0xb9b083f2,0xb83421b8,0x39b6681a,0x39a29e5a,0x38d80714,0xb7a97a04,0x374a789e,0x38669c68,0x38da40c4,0x391430b6,0x393138d8,0x3967f474,0x393c225b,0x37ea548d,0xb890645b,0xb9bd6d58, +0xb915a483,0xbb275eb2,0xbb18a6a7,0xbaec73fa,0xbaf7c1f0,0xbad7074d,0xbabce373,0xbaa8e0e9,0xbaa39175,0xba5a2b00,0xb9ce638c,0x38e9784d,0x3a4cdb4a,0x3abd3bf7,0x3b068344,0x3ae6f341,0x3aba9a87,0x3a9397fb,0x3a6c8154,0x3a6a54b9,0x39e9f647,0x39723bbf,0x39f95af7,0x3a1854fe,0x39a06b47, +0x38d2c033,0xb906c693,0xb9644756,0xb9a94dc4,0xb9c858e4,0xba025472,0xba492427,0xba849f50,0xbab7b266,0xbaf5c663,0xbb14fc4b,0xbb17d9ed,0xb9c7d36d,0xba250260,0xb9a99a8d,0xb914c68c,0x38ad150d,0x399fa6e7,0x3a17eb4e,0x3a57a330,0x3a936bfe,0x3aaf0d4d,0x3ac05083,0x3acbfe99,0x3acf2451, +0x3adbc74c,0x3ad3881b,0x3adbc77c,0x3ae07575,0x3ae14d9b,0x3ae981ab,0x3ae1e6ac,0x3aa26d50,0x3ad5e29c,0x3ac4ff7a,0x3ad14a77,0x3ac78419,0x3aca4d50,0x3ab12c99,0x3a838e65,0x3a3e0b6e,0x3a212168,0x3a10ef33,0x39ca5840,0x399caa53,0x3930d379,0x37fccc44,0xb8ac7336,0x39e2d1c2,0x3a6ffbff, +0x3a8377d0,0x3a8d2cee,0x3a992b1e,0x3aa0f4ca,0x3aa771a5,0x3aad9051,0x3ab79d58,0x3ac34f75,0x3ad1fa23,0x3ae08f8e,0x3aee5986,0x3afbb41a,0x3af87cfc,0x3af4d8f9,0x3af138d3,0x3aecc487,0x3ae55ad8,0x3af80a7d,0x3a93c178,0x3a5ef493,0x3a90cc91,0x3a96b8fa,0x3a5103c7,0x3aa7e60d,0x3a98c662, +0x3a947602,0x3a905f27,0x3a7d61b1,0x3a617574,0x3a42cb4b,0x39db0feb,0x3a20d06b,0x3a401da3,0x399ffe74,0x3af03852,0x379eff94,0x3a5e4193,0x39088299,0x3920f6e6,0x396b0be2,0x38798248,0x39f4816b,0x39fbde7a,0x3995c931,0x3914fe1d,0x38e30f52,0x39909426,0x395d9dc5,0x394a8448,0x39041492, +0xb79d8faa,0xb7f12886,0x394ea7c6,0x38e4abf2,0x37e98bb7,0xb910ef64,0x3a325a27,0x39da4149,0xba36fd55,0x39e2d737,0x39709ce1,0xba1b86b2,0xba461a31,0xba2e67e2,0xba12c6cc,0xb9c60de3,0xb9b56126,0xb9e5c5b8,0x3a145752,0x3a341301,0xba5671f9,0x3a0cc632,0x396c9a59,0x3a12c38d,0x38c91dd8, +0x3982bb24,0xb91f2545,0x3a8c2b51,0x3aacb53d,0x3a679ea4,0x39d1fb46,0x39964129,0x3a32f03e,0x39f15d51,0x38d7b5a5,0xb998f23e,0xba43d2ff,0xba0cfbae,0x39b3fedb,0x39c3ac7f,0x393e25e1,0x392311ea,0xb8b0e99b,0xb9128723,0x3a136234,0xba3084e6,0xba41911e,0x39842918,0xba52ff86,0xba4097bd, +0xb995d1ea,0x3919353e,0x3920e976,0x37cf892e,0x38f6ab47,0x36bef71e,0xb85e7348,0x38cbf3e8,0x3a663d3d,0x3a92b0c6,0x3a119432,0x3a91cbb3,0x394127fa,0x3b1f283c,0x3b3790bc,0x3b014b32,0x3a777975,0x3a04ed3f,0x3aa059c2,0x3a9b0b31,0x3a8aa037,0x3a07d082,0xb9c92a9f,0xb9c28b63,0x3a826d6e, +0x3a0c7271,0x394f683a,0xb98e5145,0xb849c3e4,0xb9e84874,0x3967545c,0xbac61514,0xbaa42553,0xb90c2885,0xba607a59,0xba0828fc,0xb9a8d75d,0xb9914f54,0xb94aa283,0xb9a1c677,0xb822aa7d,0xb7d5154a,0xb9de5583,0x391edd17,0x39ba3d55,0x3a13dcfb,0xb8b54a2f,0xb904a362,0xbaac63ef,0x3b3368e8, +0x3b8a37dd,0x3b5573ae,0x3abeae80,0x3a845f92,0x3adbcfb9,0x3ad5dd5a,0x39733d8d,0xbaabfc47,0xbb31514d,0xbad863c3,0x3aa5b107,0x3ab9b291,0x3a41d12d,0x36a5cc2a,0xb9c395e7,0xba678229,0xb9984c6c,0xba883534,0xb8842a99,0x38fb85eb,0x39496280,0x398358a5,0x391d76de,0x38c7595b,0x385afe54, +0x37e7feb8,0xb87737fa,0xb6c1823e,0xba8bdf6e,0xba018d9d,0x3b6b7922,0x3b70e5cc,0x3bbf95b0,0x3bf28e3e,0x3c07abb0,0x3b8d9df4,0x3b28bc8a,0x3b7fcff5,0x3a9a9180,0xb8afd94b,0xb84cd288,0x3ab1fcac,0x3b933bb7,0x3bf13b2a,0x3bcaa88b,0x3b602928,0xb5a268f6,0xbb057689,0xbb24a63e,0xbace64b1, +0xbad7870b,0xba1fad4d,0x3a501164,0x3a006cca,0x38eaae7e,0xb88d963c,0xb895a075,0xb8f09a3f,0xb8a44ed9,0xb8229966,0xb80931d7,0x37a805c3,0xb856707c,0x39e59ff5,0x3a9ea3d0,0x3b14f8c3,0x39ef6596,0x3b07d01c,0x3a4aaa33,0xb8a16d1e,0xbac4de49,0xbb7ba0d3,0xbb8bca20,0xbaad65e5,0xb998bafd, +0x3b0904e8,0x3b9e2767,0xb802a154,0xbb82eb57,0xbbb27b2c,0xbb621dcf,0xb9e17505,0x3b1ce9d2,0x3b18f844,0x3a895453,0xba235d9d,0xba101188,0xb9246097,0x37963007,0xb9955cd8,0xb81dbf65,0x37abe0ca,0x3834c047,0x386c5f1a,0x382b1471,0x3812576c,0xb626ef6e,0x383f8746,0xb88cf0ad,0xb8f0164b, +0x399b9b7e,0x38c2bc58,0x3bb67e08,0x3bfac57d,0x3b9408d7,0x3b1ca3f3,0x3ad67ec9,0x3c0b2eea,0x3c2a89bb,0x3c0516a4,0x3b9d52fc,0xb934f88a,0xbbaf14c0,0x3a089e56,0x3ba838bc,0x3c07fec8,0x3b9165cf,0x3ac071d5,0x386e8987,0xb9274a85,0x3982f838,0x3ae981c8,0x3abf0b31,0x3a176941,0x3961689d, +0x38acf0d7,0x38043372,0xb7a57098,0xb7e7775c,0xb81610bb,0xb817c29c,0xb7a637e1,0xb80d1f6d,0x37667d82,0xb8cb403f,0x39ea2e2f,0xba805130,0x3a9b11fe,0xbb8d1aa3,0xbc502c22,0xbbdd63cb,0xbb213849,0xbb1b8462,0xbb82692d,0xbb5e869b,0xb9e3b9b5,0x3bbc7838,0x3bdf20bb,0x3ab62c7e,0x39f8c48a, +0xbadc0b53,0xbb12adf8,0xbb1092fc,0xbaacefc6,0xba3833ae,0xb885e503,0xb8138ea8,0x39f9fceb,0x3a2269f9,0xb89a4019,0xb9d21295,0xb607d270,0xb707553f,0x37a8e6c5,0x37f3d121,0x3836ec57,0x38120ed9,0x38599ec3,0x3785c303,0x38992f87,0xb813435c,0x37deda7e,0xbb49b04f,0xbb11a119,0x3bf8095b, +0x3c05a88f,0x3b5b123e,0x38a6535a,0x39d2e902,0x39f35e9b,0x3a2d5a2a,0x3920024e,0xba9a9db5,0xbac0682a,0xba282cb1,0xba106f00,0x3842c07b,0x3a89a574,0x3a881e8e,0x3a9b2d06,0x3acb4008,0x3b01e41a,0x3b223d97,0x3b4068e0,0x3b4b913c,0x3b0244e3,0x3a11fe03,0x36870898,0xb85e3dbf,0xb726529b, +0xb8875ec8,0xb87f47e7,0xb8a8e080,0xb88097c7,0xb8f7e508,0x37abd17c,0xb9a13fe3,0x3a458327,0x3b08e9e9,0x3bba7c6d,0x3a8de56e,0x3b29b223,0x3b1eea18,0x3b1c3396,0x3ade7b26,0x3a4f36d1,0x3867c4dd,0xb9a8fc73,0xba790bf7,0xbaac0ad1,0xbad2a89e,0xbab077d9,0xbaaea030,0xbad046d1,0xba998dde, +0xba5735dc,0xba3cf18c,0xba053d27,0xb9b202ec,0xb97d3c63,0x39582247,0x3a224d44,0x3a486c9c,0x397a45e1,0x378a2b3e,0x389e315b,0x38f2e254,0x391f2169,0x39128d66,0x3940e57c,0x39313ec8,0x3961e666,0x38f3487b,0x39e171ef,0x39b32a51,0x3aa2dd1a,0xbaaf5382,0xbacbed79,0xbab6dab8,0xbaa24f63, +0xba884cab,0xba294147,0xb9e03499,0xb9999d3c,0x383b9c38,0x39db404a,0x3a412df6,0x3a905df5,0x3abcf534,0x3aee80f5,0x3acea5d3,0x3aab0f01,0x3a87e178,0x3a8b1b1b,0x3a8647b0,0x3a8fa6ee,0x3a809d83,0x3a403605,0x3a14a235,0x39672264,0x35e3386e,0xb99197e1,0xb9a72fcb,0xb9e32031,0xb9a26fb6, +0xb9ff5f0d,0xba0b311f,0xba3b974e,0xba7bfc8c,0xbaa35351,0xbabaa750,0xbabd4741,0xb9d8ae47,0xba24a26b,0xb9cf227c,0xb678e06d,0x39899f19,0x3a0d1925,0x3a612c05,0x3aa01ca8,0x3aaba2ef,0x3ab0c528,0x3ab59a83,0x3ab86659,0x3abf5859,0x3ad80142,0x3acfcacb,0x3ad60532,0x3ad470c7,0x3ad5d594, +0x3aca85ea,0x3ad50924,0x3ae7eedd,0x3aee0595,0x3b01c53e,0x3aebb270,0x3af2d3a4,0x3ae98bb8,0x3ac17027,0x3aa86e27,0x3a8c64d1,0x3a4078b7,0x39d0b274,0x39a3ece1,0x3936d7ca,0x39186999,0x38ff4ce3,0xb9716f2d,0x3ac8e0f5,0x3a6db0d2,0x3a92bf37,0x3a9fa8a5,0x3aacb936,0x3abadce0,0x3ac4cc1b, +0x3ad19956,0x3ad17a33,0x3ad9bbb5,0x3ae30f1c,0x3aedfe83,0x3af5669d,0x3afb9387,0x3af81938,0x3af5b479,0x3af2ab92,0x3af044b9,0x3aed5067,0x3ae07fb0,0x3b10d4bb,0x3b0d3f9e,0x3ac73155,0x3b108bf8,0x3b1105c3,0x3ad7fba0,0x3ad3673d,0x3ace1cee,0x3ac06071,0x3ac064f9,0x3ab73dd4,0x3aa32f90, +0x3ad3aed6,0x3acc66cd,0x3a69001e,0x3abfecf9,0x3b08420e,0xbab47712,0xbaaf38ce,0xba987273,0xba7d86e7,0xba8a2ad6,0xba944f92,0xba913f7b,0xba9b1b5f,0xbaa598b7,0xbabb11da,0xbabb9712,0xbaa61c4a,0xbaa17242,0xbaa3758e,0xbab3c2c7,0xbac81cb2,0xbac8a9d2,0xbaa93229,0xbaaf8cc2,0xbaa1ea0b, +0xbac27a77,0xbabe65f6,0xba4d83df,0x3a778e3e,0xbaec2102,0xba8cc42a,0x3a49410e,0x39d218af,0x39b3926a,0x39f419dd,0x39ed41be,0x39f41ad3,0x39cce58a,0xba568adf,0xbad4743a,0x3a257e61,0xba3c145b,0xb991bfdd,0xbaa51e51,0xba5d9015,0xba85f07f,0xbaa8df3d,0xba929e51,0xba9ccff2,0xbaa9f37a, +0xbaf1e906,0xbaf37012,0xbac0c7ab,0xbaacb44f,0xbad2e331,0xbb107307,0xbb37d15f,0xbb328ba5,0xbaf1dbad,0xbadbda0d,0xbab6e9cc,0xbae364ed,0xb9c9bc99,0xba9c4db5,0xba6672d5,0xbabfe8e6,0xbac5c9d0,0xba859fce,0xbb040364,0xbb0b6b0e,0xbac44904,0xba989a60,0xba6a81cb,0xba4aad46,0xba70627c, +0xba5ae3ab,0xba96c09b,0xbaab456e,0xba5152dc,0xb9af75c1,0xb919f6b2,0xb900ebbd,0xba35e08e,0xb9da2cb2,0xba576326,0xba786607,0xbb0fed96,0xbb1bc996,0xbae16577,0xba95ff24,0xbaa051b2,0xbb0c6ce3,0xbb50de71,0xbb54d7ef,0xbae99af4,0xbae98003,0xbad43064,0xbae2bb41,0xbaa86a58,0xbaa7c297, +0xb9d83ee5,0xbafea837,0xbab23470,0xb92bceeb,0xba04ecf2,0xb9692dc7,0xb93af7e3,0xb6e20bb6,0xb919193d,0xb9469c64,0xb9a5eb02,0xba19fa94,0xba7f3a32,0xba8980ef,0xba59a1df,0xba24226f,0xb93a0fc3,0xba56ea3c,0xbade4eb2,0xba4be71e,0xba1fc14b,0xba2e05bb,0xbb2f1aae,0xbb41780e,0xbb0cc7fa, +0xba9c539b,0xbb204d4d,0xbb9b344d,0xbbe07be0,0xbbca9934,0xbb4cb70b,0xbb09d778,0xbac22fb2,0xbadcdc19,0xba83e21d,0xba90e063,0xb9deb53f,0xba4d1e4a,0x394063e1,0x3912b29c,0x392c16fe,0x3951fae8,0x38b0a030,0x38678597,0x3855a71f,0x3858bf52,0x38886c72,0xb93764df,0xba6b1d06,0xba979b15, +0x3ad07fd4,0x3a6f6802,0x3b518057,0x3b93eee7,0x3bc58891,0x3ab0c887,0xba68c93a,0xb99def5c,0xbadba714,0xbaf8197b,0xbaa14835,0x39b4f46e,0x3b78a45a,0x3bf32b8f,0x3bd74237,0x3b7e780b,0x393bbc74,0xbb38c684,0xbb8287e2,0xbb5c4761,0xbb0dcb30,0xba3136cc,0x3a252103,0x39844b29,0x382a24d2, +0xb8d52dc8,0xb8879592,0xb8dc1470,0xb8434560,0xb80cfdcb,0xb7cb841c,0xb7e59201,0xb79e9af7,0x38f0ec3d,0x3a0db7d9,0x3a5e9a65,0xb9968484,0x3a986395,0x3a9727e8,0xb9664c69,0xbaa839c0,0xbb9c4701,0xbbb59312,0xbb17c887,0xba8795b7,0x3acf9acc,0x3b92e713,0x39a4eaed,0xbb73c3bb,0xbbcecc5c, +0xbbae419c,0xbb63a48d,0xbb019fab,0xba76fb88,0xba69fb93,0xbac6920b,0xb9fd2e06,0xb9517d02,0xb91d376c,0xb930b04b,0xb69a6fb8,0x381ff7f0,0x3836a9db,0x3855d4f3,0x37f6911e,0x37e1625e,0x36fe52e9,0x382455f1,0xb74db6a3,0xb8a9de26,0x38d700da,0xb93ef9c0,0x3bbc4dcb,0x3bdc1421,0x3b656284, +0xb938b773,0xbbaef8d1,0x3a8c4b7f,0x3b4306b3,0x3ab2afe4,0x3ae51c37,0xbac5258c,0xbbe2e77d,0xbb4de8e5,0x3a191533,0x3b903983,0x3b0bb8b3,0x3a303b67,0x39a67e12,0x3814b83d,0x39870b4a,0x3a2f6b7d,0x39890a99,0x38b05a63,0x39030bd2,0x389ecde7,0xb62d6470,0xb7adc3c9,0xb80e1a2f,0xb8017f0c, +0xb809350c,0xb746e46d,0xb8431838,0x380a6077,0xb92bb421,0x39e92c9a,0xba5334ba,0x3a816051,0xbba003e0,0xbc7d47c2,0xbc192b69,0xbbda85c3,0xbc1c2076,0xbc200c75,0xbc06ea49,0xbb70709c,0x3b6ca06c,0x3bb2076e,0x3a1da93e,0xba6b17db,0xbb4f19f7,0xbb581829,0xbb7f4884,0xbb64c7ad,0xbb401b87, +0xbb08188d,0xbaa9a277,0xb9efb4ef,0x369e3f8a,0xba014d38,0xb9bfd3fa,0x38479e4a,0xb79cd300,0x38129929,0x37f6c9ca,0x38387702,0x37ff00f1,0x384a4943,0x379738fc,0x38a71e64,0xb7f43f3d,0x390ee0c2,0xbaf93862,0xbab622ec,0x3bb9839c,0x3b729a66,0xbb4c1de0,0xbbc91e12,0xbbb3dc13,0xbbad4f46, +0xbb8c1943,0xbb5b9977,0xbb829382,0xbb8a6efe,0xbb8ab314,0xbb57efcf,0xbb11aa20,0xba8b51d2,0xb834f0b3,0x3a4b145c,0x3aca87ec,0x3b04e841,0x3b16ec39,0x3b13d55d,0x3b115786,0x3aa5c829,0x39a3f41d,0xb7cbc977,0xb7be6b98,0xb81f54a5,0xb8798df3,0xb88bfdfd,0xb8907d5c,0xb884901a,0xb8d0bf69, +0xb810f41f,0xb954d8f5,0x396f66d3,0x3af2b413,0x3b3f423d,0x3acd42c5,0x3a893f9e,0x3a1e06e7,0x3a7db341,0x39dae104,0xb9a0b21b,0xba9fbd58,0xbb1cda1d,0xbafdbdca,0xbad76845,0xbad24510,0xbafa262e,0xbb1bc9c0,0xbb3cc4b1,0xbb20184a,0xbb00804c,0xbab47820,0xba80bf70,0xb9d30e9c,0x390f9eb0, +0x39d1b3e5,0x3a16198c,0x39c90e66,0x38610363,0x38089920,0x38df3323,0x38d892c1,0x391d4f4a,0x38fdd0e5,0x39212f9b,0x392c4f36,0x39570ec5,0x39627ef5,0x398b34a8,0x39a20409,0x39c89481,0xbb0e9000,0xbb0f2595,0xbb00706a,0xbb056681,0xbafb63e1,0xbaf04439,0xbaeaa923,0xbaff7374,0xbace4430, +0xbaacd443,0xba734e12,0xb967dc21,0x3a093823,0x3aa477d0,0x3a8d4f3e,0x3a671065,0x3a34dfc2,0x3a216fcb,0x3a0a101d,0x39fed768,0x39d6a579,0x39b3a1e9,0x3980e8ed,0xb839be5e,0xb926499f,0xb9a5049e,0xb96aa6a0,0xb9ab2322,0xb9802ab0,0xb99ba115,0xb9d38229,0xba25fabe,0xba849aa1,0xbac02287, +0xbae35d73,0xbafd8efa,0xba0874ef,0xbac9c37c,0xbaa25e2c,0xba888d74,0xba5da01c,0xba3d5a9f,0xba09b46e,0xb9adffbc,0x3911180c,0x3a128a37,0x3a68b46a,0x3a99a8ac,0x3ab5275a,0x3ae056e3,0x3ad2969c,0x3ad7c6c2,0x3ad7c7d3,0x3ad83053,0x3ade25d4,0x3ace9d36,0x3ad29319,0x3aaa8c92,0x3a8a3b91, +0x3a9417b0,0x3a7f7083,0x3a18d642,0x39aceaf3,0x383f336b,0xb8a593b7,0xb9bfdbe0,0xba02ea1c,0xb9f79234,0xba18678e,0xb9f68e43,0xba318728,0xba88ffa0,0x3992e6d9,0x390cf51c,0x39c8180b,0x39c69a2d,0x39e9e010,0x3a069cc7,0x3a135124,0x3a1120a0,0x3a386166,0x3a591171,0x3a814d8e,0x3a9629ef, +0x3aaa3e14,0x3ac1e50a,0x3abb63fa,0x3ab90080,0x3ab63c5c,0x3ab08237,0x3aaf19c8,0x3aaad633,0x3a922081,0x3ab251cd,0x3b122639,0x3a5d5f88,0x3a9f0da3,0x3b15cf71,0x3b0f0855,0x3b076bb6,0x3aff8892,0x3af10920,0x3ae180e9,0x3ac983a7,0x3a430515,0x395d9a84,0x3acd7279,0x3a3771b7,0x3a9ec040, +0x39a0eb89,0x38c63a50,0x3a49ab2f,0x39d98f60,0x3a064935,0x3978782b,0x3a2f8d30,0x3a409749,0x3a3bec78,0x3a03a779,0x39e54201,0x39e538ed,0x3a0d13ca,0x3a086eb4,0x39cc2a74,0x3974dc15,0x395e99d5,0x39d78423,0x39c5c247,0x39802a57,0x39dae6e1,0xb8f7ce3f,0xba70416f,0xbb067805,0xb80198be, +0xba823992,0xbaeb86f4,0xbb083da7,0xbb03cf24,0xbae5eb39,0xbae2bbd0,0xbae0ee7b,0xbad72ff6,0xba30073c,0x39a8bbf4,0xbb0a18d5,0xba6361dd,0xba8dec5f,0x3a64f533,0x3a10ed62,0x39f6e0a0,0xb90f392b,0x3a832fb5,0x3ab195dc,0x3ab8db72,0x3a5799bb,0x3a2660ec,0x3a26432d,0x3a6fc774,0x3a2a26f5, +0x3844f996,0xba04e945,0xb9e9fd4e,0x39b47c3f,0x39d878c0,0x39e1493e,0x3924346b,0xbaab9d2d,0xb989774c,0x392fc121,0xba6d364a,0xba902b87,0x389e406d,0xba602f6b,0xba49923c,0xb9b09a12,0x39155f35,0x39ab2fa8,0x392aea12,0xb63c7f23,0xb9f81908,0xb9df44d1,0x395cfb04,0x398fe993,0x3aa4602c, +0x3aa27a3e,0x3aa6109a,0x38aef73b,0x3b0c32a3,0x3b2e92cb,0x3b3d99e1,0x3accdaa4,0x3a873179,0x3a6272e0,0x3ade5122,0x3ad03542,0x3a39c764,0xb99a785f,0xb9dd58bb,0x3a653119,0x3a0ddfc2,0x3a1bf1b0,0xba1d1b53,0xba488c9f,0xba35bb0c,0xb90b7291,0xbaa9c97b,0xba85b397,0x386efc7c,0xb9f8020c, +0xb7ae1f31,0xb8f9f28e,0xb880529d,0xb93dd8de,0x3802a5ab,0xb922a14e,0xb99618dc,0xba2bb37e,0xb74a2b65,0xb8718887,0x3a786c60,0x3a401b7c,0x364f8665,0xbadd25ee,0x3adee348,0x3b5e11fe,0x3b85fa49,0x3b063629,0x3a9ee9f7,0x3a4ad238,0x3b0d62ba,0x3aa21758,0xba74bc98,0xbb39e8fe,0xbb18995c, +0x39c7e04a,0x3a540a93,0x3a430701,0xba0c8877,0xba9a63e3,0xba297296,0xb9e26446,0xb9bf826d,0x39853f9e,0x389709fb,0x392256be,0x388eb5e4,0x380cef6e,0x3835172e,0x383e4843,0x36e9beda,0x381a4145,0xb42f1a6a,0xba1ba8df,0xb98ea71f,0x3b0056ac,0x3b468de4,0x3bb685e8,0x3be382f7,0x3c0b6a0d, +0x3baef974,0x3b7ef2d0,0x3ba2cad3,0x3b39ce35,0x3afbe049,0x3b0aecec,0x3b30c1e0,0x3ba66f70,0x3beff5b4,0x3bf793dc,0x3bb2302a,0x3b13d4b6,0xb97ee4fa,0xba679c1b,0xbaa4ebbc,0xbae0f7d8,0x39586fdf,0x3a2bf3f2,0x38a4ef55,0xb7cab153,0xb8a58fc9,0xb85dea71,0xb8427e1c,0xb7743ca6,0xb7d04f31, +0xb78edec6,0xb7531a63,0xb77fef5e,0x37a9d996,0x39b11fa7,0x3a8845a5,0x3a33f1ba,0x3b291efc,0x3afa248a,0x3a66cf0a,0xba3ea26c,0xbb474633,0xbb810946,0xbb08a152,0xb9702d59,0x3b183a37,0x3b9f5035,0x3a8a74b3,0xbb2be538,0xbb9fcd4d,0xbb622660,0xba5b6c39,0x3af2c89e,0x3ae5cc68,0x3a99f86b, +0xba0cb4f1,0xb9d13fa0,0x37570785,0xb93e272d,0xb8b16f55,0x37e9bb94,0x3813374c,0x380d099a,0x37d374a4,0x374507b1,0x379de8c3,0x370c813a,0x37a2c5b0,0x37884b11,0xb8847436,0x38a4cd15,0x3a458de8,0x3bad3590,0x3bde5319,0x3b8e69f3,0x3af22c83,0x398f2e3d,0x3bfaf024,0x3c2cdbcd,0x3c07fbdc, +0x3bed4b18,0x3b18e604,0xbb813648,0x3a3929f9,0x3ba78c63,0x3c15b769,0x3bd81d56,0x3b73db51,0x3aa4d752,0x3a6e6c0e,0x3aa5c158,0x3ae145cb,0x3a549ba7,0x39bb3ba0,0x389227a0,0x3841e9c4,0xb7f0a4ee,0xb7b35141,0xb7fbada5,0xb792a3e3,0xb7abce97,0xb6f6ddac,0xb82e542e,0x38137fe6,0xb9244dbc, +0x39adcc75,0xba26e8fa,0x3a58c045,0xbba469e8,0xbc812cf9,0xbba9dce0,0x393148cf,0x3a3376c4,0xbab5c1c0,0xbb3e69b6,0xbb541ae6,0x3b83d8aa,0x3bce042a,0x3b2acd90,0x3a28d6e3,0xbaeb9613,0xbb06a4ac,0xbb08c9c1,0xbaa581b8,0xba202421,0xb967f7ed,0xb9a6c40a,0xb9aed797,0xba0a06c8,0xb9ea9b7d, +0xb95e423d,0x38857d9e,0x36b02bbc,0x382b5b17,0x380319b6,0x38053317,0x37afce93,0x381e4c56,0x379fb33c,0x38889aa5,0xb7511089,0x39382dd5,0xba7faea2,0xba284484,0x3b4b1a33,0x3b968e89,0x3b1f93c8,0xb9907fa1,0xb8df322d,0x3821b97b,0x3a673c9c,0x3a976b11,0xba07b242,0xbaab6de7,0xba766c41, +0xba43d79d,0xb8dd3f17,0x3a252061,0x3a3d612d,0x3a8667a6,0x3aea2953,0x3b0a101d,0x3b2e8e3b,0x3b3f4311,0x3b1639ad,0x3ab1ce40,0x3917828e,0xb8c2228d,0xb8132c94,0xb8815624,0xb888c0a0,0xb85279a5,0xb8616f61,0xb84e94de,0xb8b8ed6a,0xb82854c4,0xb918311b,0xb8a35144,0x3a93e87b,0x3b25ea64, +0x3a35ceb2,0x3b38cea3,0x3b502dce,0x3b481041,0x3b258697,0x3ae7e3a5,0x3a73c408,0x39f82a16,0xba72e82f,0xbac83ce0,0xbaf18959,0xbac96c1d,0xbac85b1f,0xbaf0bb6d,0xba9d62a3,0xba314589,0xb9aed30c,0x3811d268,0x398588a8,0x3973481a,0x3a215fee,0x3a54b6ad,0x39fff961,0x391b8e26,0x38a3ac97, +0x391406a1,0x390b982a,0x38e588fa,0x38d6ab82,0x38fc524e,0x39196e7a,0x393e76e2,0x39170f19,0x39fa5297,0x3a18844b,0x3ab47e8c,0xbaa48d79,0xba881f88,0xba29a400,0xba426bf4,0xba05139c,0xb992bd83,0xb8fa98a8,0xb7434ee3,0x39016e0d,0x397f27ba,0x398f0c95,0x3a02bbc5,0x3a3e24f7,0x3a7a104f, +0x3a6d53a6,0x3a4fc9df,0x3a38b692,0x3a53a526,0x3a80968b,0x3a8b2ef2,0x3a117755,0x3990fdb5,0x38d2384a,0xb8f10a44,0xb9a66871,0xb9affe91,0xb9b2314c,0xb97e0735,0xb970cdd0,0xb980cc41,0xb9b30028,0xb9ceffd8,0xba39ad5a,0xba8901ef,0xbac36777,0xbaa475c2,0xbaca71f1,0xba8706d2,0xba2fa9b7, +0xb976e8ff,0x390f9e07,0x39e90a4f,0x3a53baf4,0x3a9d4d95,0x3aa91a48,0x3ab4f449,0x3abfec5d,0x3ac2ee89,0x3ac610dd,0x3ad63083,0x3ad1a377,0x3ad75604,0x3ad886ec,0x3ada8481,0x3ad12053,0x3ae55627,0x3ac20de8,0x3ad30273,0x3ac59c04,0x3a970a13,0x3a84d84c,0x3a69aff9,0x3a2dadb5,0x39e0913a, +0x391d8528,0x37ccdb2b,0xb93346bc,0xb9bf21d0,0xb9eaadef,0xba217a6f,0xba235ec9,0xba347263,0x3a6f6081,0x3a74c90b,0x3a813640,0x3a919c5e,0x3a9e82e5,0x3aafa538,0x3abca202,0x3acd2d83,0x3acc0af4,0x3ad1a600,0x3ad84110,0x3ae181ec,0x3ae96b57,0x3aefde8f,0x3aee0141,0x3aecb005,0x3aea7e69, +0x3aea1d01,0x3ae589d3,0x3ae83a03,0x3ae24e72,0x3aae1ffe,0x3a33f58c,0x3add9ef3,0x3aa263ea,0x3a1d7aa8,0x3a16345f,0x3a119faf,0x3a0623c0,0x39ea37aa,0x39c4b88a,0x39914c3b,0x3a327b1b,0x3a8bd1cb,0xb762532c,0x3a033e28,0x3b026539,0xbab8cddd,0xba012fe0,0xbac4bcbb,0xba85e8c6,0xba9149cd, +0xba9dc624,0xba9006ea,0xba936591,0xba936366,0xbaafd56e,0xbab6c1c9,0xbabb47c4,0xba9ef14d,0xba9ed939,0xbab39055,0xbacdbf0f,0xbad22f60,0xbaba1740,0xbab7f525,0xbaa86045,0xbae25e65,0xba2223c0,0x393df4e4,0x3a9dfc33,0xba8a45c6,0xb78ae283,0x3a92ce8c,0x3a4f9bfd,0x3a4090a0,0x3a6abc7e, +0x3a7b1f66,0x3a87e9e5,0x3a884edb,0x391f3f3b,0xba86179f,0x3a855300,0x39b64813,0x3a29c9af,0xbaa796c3,0xba87c565,0xba870b8d,0xbab3b3cb,0xba827978,0xba71b98a,0xba5b7833,0xbac5033e,0xbaded052,0xbaea65c9,0xba9ccf4c,0xbab96bd3,0xbb0bfcf2,0xbb3bc48c,0xbb3cff37,0xbb0d0ffe,0xbae94d64, +0xbad1c6f7,0xbadb3157,0x39607996,0xba8327b6,0xba00ec9d,0xba964d06,0xba9ba32a,0xba4ffda9,0xbad2b077,0xbaca3448,0xba570b11,0xba442278,0xba3a259a,0xb98aa4ac,0xba4185ea,0xba09da29,0xba1168f9,0xba93db3f,0xb89a7419,0xba03d6bd,0xba21744a,0xb978264f,0xba85977e,0xb96f1cae,0xb9921568, +0xb8709ec5,0xbac302c7,0xbafd1202,0xbb1666e9,0xba59a17f,0xba5e64c7,0xbaf3ca2a,0xbb516818,0xbb5f84b9,0xbb10ae56,0xbafb4756,0xbaf643e3,0xbadb86fe,0xba51ea82,0xba8149f0,0xb9b789d9,0xbab204e5,0xba22a893,0x38eb37bc,0xb82fb16f,0x39136abd,0x390fce41,0x38c4dc07,0x38899305,0x39037211, +0xb8e2d5c7,0xb9f657bd,0xb9ff9527,0xba33f78c,0xb92aba44,0xba56b08c,0xba3561b1,0xba5d771b,0xbb05bd3b,0xba088db7,0x398e285f,0x3a4ef133,0xbabc8bc8,0xbb24f48c,0xbb518d11,0xba6a5f57,0xbacf6e29,0xbb87cd8a,0xbbdd247c,0xbbd78029,0xbb82042e,0xbb23c3f2,0xbb044920,0xbafc7e79,0xba571a60, +0xba973c08,0xb94fccac,0xb96f221b,0x39a56d95,0xb79d241a,0x3830bbf2,0x35a2199b,0xb82fe3c1,0xb78eeb9d,0xb7a76d30,0xb825f4f5,0x386f1b63,0x374d551e,0xba0a712c,0xba47dc5a,0x3b01e38f,0x3a1913f0,0x3ac7465b,0x3b471d9e,0x3bad89b8,0x3afc4fb1,0x397e266d,0x39c65875,0xba7ca8d3,0xba9cda10, +0xba2084a0,0xb85459aa,0x3b28251d,0x3bb8aff7,0x3bd62525,0x3b996c96,0x39b8bfb3,0xbb02a786,0xbb58fe01,0xbb1bbbe1,0xba70ab3e,0xb94c0406,0x3a161523,0xb8495fea,0xb8068b54,0xb8661299,0x3566635f,0xb7a0b3df,0x379d4785,0x35f46f90,0x37480e97,0x36a1bec4,0xb7a74e5c,0x3799a099,0x39448bae, +0x3a51ca66,0x3a3138f5,0x3a7015d8,0x3a7904b8,0x3a70915a,0x394cbb35,0xbb34a2e9,0xbb7e99ae,0xbb14d56a,0xba4c94e7,0x3acd4c7c,0x3b865391,0x3ad9f287,0xbad65a19,0xbb9c3967,0xbb9fd659,0xbb6fbd97,0xbb139d46,0xba716d2a,0xba5b2971,0xba5698ea,0x39279585,0x360c5a28,0xb9134936,0xb85a272a, +0x3855da6f,0x37629f5d,0x376555e3,0x36cf006c,0xb636fe60,0xb554ad40,0xb5bb1226,0xb6072c3e,0x381bdf2c,0xb8ad1762,0x38c4aeeb,0x392b71da,0x3baecb13,0x3bcd2fc7,0x3b77dc00,0xb81b2f73,0xbba6a89a,0x3a9e691a,0x3b68454c,0x3ad74b6e,0x3b10712c,0xba91077b,0xbbd75a30,0xbb8b7441,0xba4dfe2c, +0x3b75b4c9,0x3b465413,0x3b0c1abc,0x3a9f5ae8,0x3a7511db,0x39e30565,0x3a35d47b,0x3983cf43,0xb8c978ac,0x39409fcf,0xb81e8726,0xb6bd28ec,0xb7d97c82,0xb71ed6fe,0xb716440e,0xb68749d7,0x35ec3bd2,0xb790b64a,0x37ad6096,0xb8d1bcf1,0x394205f0,0xb9aa2268,0x3a2b0d8a,0xbb9b7b90,0xbc7f9a47, +0xbbdfe4fd,0xbb3cb453,0xbbb806e7,0xbbc0fbb7,0xbbd423b6,0xbbc9af40,0x3b08797e,0x3ba741ef,0x3b277b64,0xb8330df8,0xbb2dceb3,0xbb3e14f3,0xbb6ca525,0xbb5f4f09,0xbb4b97df,0xbb201bf4,0xbb06ba68,0xba974f71,0xb9cae162,0xba24a97c,0xb7c20247,0x37b773eb,0x37cf7894,0x37d7701f,0x37b3783a, +0x376c9828,0x3712f84e,0x3707ceec,0x3783d697,0x37ac5c22,0x38329c2c,0x385aad30,0xb9aee3c5,0xb9b847e1,0x3b2dc2be,0x3ab1214a,0xbb39cc81,0xbb97e8b4,0xbba3b2a6,0xbb8b3d66,0xbb4c512f,0xbb12b1ad,0xbb40ad67,0xbb6388d6,0xbb5b659d,0xbb2cd180,0xbae45ac5,0xba7994be,0xb9377f41,0x3a1b1014, +0x3ab60fa4,0x3b057f65,0x3b0eb32b,0x3b0e4fae,0x3b059d8a,0x3a4df4b5,0xb6809ece,0xb89ba5d5,0xb7fa6980,0xb86f1052,0xb8134cab,0xb80917dd,0xb75971a0,0xb7d2c655,0xb7912a2d,0xb8ac5354,0x371f4b54,0xb9bd4df4,0x3a932f1f,0x3a5d5f38,0x3b2a1c66,0x3b0fd5f6,0x3aa151f3,0x3ad71af9,0x3a56d77a, +0xb870f95e,0xbaa0348a,0xbb0ed3ff,0xbb0e2b88,0xbb02bfa5,0xbb02d907,0xbb07fb38,0xbb174f8a,0xbb30f976,0xbb0880fc,0xbad42fe3,0xbaa337fb,0xba467903,0xb933e4ce,0x3a11d360,0x3a51dea3,0x3a3b0128,0x39d5e7c1,0x3897cf8e,0x38d73546,0x38df06dd,0x3898a358,0x38820b93,0x37cc20d5,0x380bd293, +0x38867f4c,0x38c5cfe5,0x393bf397,0x3978b3f2,0x3a372580,0x3a77ac26,0xbaa90c2c,0xbac57b3d,0xbacc40aa,0xbacd8f12,0xbacb30e4,0xbabdf55f,0xbabb5e12,0xbad587e4,0xbab28049,0xbaa4e145,0xba8b023b,0xba32db78,0xb981cfec,0x395261e8,0x393a349a,0x391a8add,0x38ca5a82,0x39304d93,0x3866a7be, +0x39b1283b,0x39b1af38,0x385e4500,0xb8bccfdc,0xb99c1d78,0xb9993d6e,0xb96cabdc,0xb907971d,0xb8c9a5c9,0x36db07e9,0xb7bc3913,0xb8b6d8e7,0xb936571b,0xba02a4c2,0xba50b6d7,0xba80e36b,0xba9873f5,0xba301b70,0xbad22f03,0xbab36663,0xba95b2eb,0xba805c56,0xba6ff15e,0xba4c63c7,0xba1e30f2, +0xb972db43,0x39068226,0x39e973d8,0x3a3d91ba,0x3a7f0a25,0x3aae9e90,0x3aa5e69d,0x3aaa7725,0x3aab07d6,0x3aaf2b19,0x3ab32d55,0x3aad689f,0x3ad4c5e2,0x3a815e96,0x3a4dea5f,0x3a3f6b1d,0x3a0d9bdf,0x38672a2b,0xb933c7ef,0xb9acf131,0xb9d8009a,0xba33066c,0xba681ef1,0xba6024cc,0xba79ebd2, +0xba4dd4d6,0xba739545,0xbaad48d0,0x39d6b49e,0xb96cb120,0x3816fd5b,0x3791cbb1,0x38876c3d,0x39130ce9,0x39466120,0x393944b2,0x399bc4b1,0x39d12bf3,0x3a098da1,0x3a2e200d,0x3a5044ea,0x3a7a3c86,0x3a714fa8,0x3a720191,0x3a70c167,0x3a6a609d,0x3a700dc5,0x3a4ca253,0x3a98dea7,0x3ad38121, +0x3b13a4fb,0x3a58b108,0x3ac1bd12,0x3b0fe879,0x3b0a334c,0x3b007db1,0x3aef1476,0x3ae3aac5,0x3ad7aaa8,0x3ac166f7,0x3a760add,0x39615ae6,0x3ac05229,0x3a73ce58,0x3a44a666,0xb917dd57,0xba7203d6,0x39c20df4,0x37835582,0x387d53d2,0xb953f44b,0x38b7cef7,0x39216e78,0x39978f24,0x37f86d3c, +0xb83af178,0xb929a32c,0x38ae935c,0x38a5bd47,0xb8ba21ec,0xb9764672,0xb98b8fe9,0xb90bb82c,0xb8dc6e16,0xb937eb24,0x388eca68,0xba8cd931,0xbad81d03,0xbae6fa3d,0xba64cd1c,0xbad7fefe,0xbace06a9,0xbafe3890,0xbafbc4f4,0xbad6dd3a,0xbadcb691,0xbadbc53f,0xbac57a01,0xbabb78ea,0xba1f1be3, +0xbaf16a12,0xbad8fdc4,0xbad4147a,0x390273c7,0x39607780,0xb823e05b,0xba20f904,0x38955648,0x39c481af,0x3a56a43c,0x3924246e,0xb881586e,0xb9b42d2f,0x39bffad8,0x39733017,0xb9f922b4,0xba896f2b,0xba95299f,0xba168354,0xb9cc7a8d,0xb901487b,0xba069abd,0xbadb68fb,0xba198097,0xb9ec8d34, +0xba979c9d,0xbaadd46c,0xb9b68038,0xba7b67cc,0xba69fcb2,0xba0278c6,0xb9440963,0x38a47130,0x38843ea9,0xb9b9368c,0xba640339,0xba5deb73,0xb998cebf,0xba223140,0x39d68cc9,0x3a744afe,0x3a1b6582,0xb9ee0435,0x3a4ba5b0,0x3a9421f9,0x3b0f739e,0x3a2cd222,0x393c8af5,0xba186824,0x3a7d5180, +0x3a7bad1c,0xb8eae790,0xba8e30a0,0xbab008dd,0xb9c5eddc,0xb9bec437,0x37c3aa36,0xba954253,0xbaa9cc05,0xba6b3e36,0xb9fa6443,0xba748a9f,0xb9f5d289,0x39197c55,0x376b57df,0x39655dce,0x387bda37,0x38a4b343,0xb8bd34b3,0x38c5eef1,0xb923543d,0xb9ef6fe8,0xba5e1408,0xba0197d6,0xba451934, +0x39450134,0x3a3371de,0xb9dc21e8,0xbb062a74,0xb9448ec2,0x3a9b9dde,0x3b46eee7,0x3a5e0075,0xb973454b,0xbab3828b,0x3a95197f,0x3a49debc,0xbade98b3,0xbb7ae158,0xbb7f3bca,0xbaf07a60,0xba64b065,0xb92b815f,0xbaa43b7a,0xbac61109,0xba08e977,0xb9b62c72,0x38afbf50,0x397d15e8,0xb7c9bd1e, +0xb6811f9e,0xb86fc074,0xb811fc6e,0xb7717107,0x374ba199,0xb7a64af7,0x388f5127,0x38ccb8a0,0xb9b1b9f2,0xb9db4824,0x3a0cb75d,0x3adb45ca,0x3b7add4d,0x3b9e497f,0x3beb3e1d,0x3b932d1d,0x3b497c71,0x3b5964d4,0x3b240984,0x3b18ccfe,0x3b348d44,0x3b401b59,0x3b98db97,0x3bd71fe5,0x3bfd46cd, +0x3bccd7f7,0x3b53f0fa,0x3a0997a0,0xb9ec9e02,0xbabf7f72,0xbac298bf,0x3a061012,0x396f0f5a,0xb7eaa51b,0xb8c8303d,0xb72f3611,0x3700e382,0x37962a65,0x37939327,0x3694d5ed,0xb654de3f,0x37062f79,0xb84f44c2,0x37b3e8d4,0xb7eab177,0x396e68c4,0x39d5b478,0x3b0da332,0x3b36d731,0x3afc2ac7, +0x3a017fda,0xbb14ba2a,0xbb69872b,0xbb2cecb0,0xba1a2785,0x3ae06aed,0x3b700b28,0x3ac974cb,0xbab6faa6,0xbb893055,0xbb8013a1,0xbb1c61eb,0xb9c838ed,0x38ea40b8,0x3a037c4a,0xb9d49d1b,0xb8457ddf,0x38982889,0xb95760c2,0x38504492,0x37f9d1f6,0x379f8e77,0xb6d112bc,0xb698d1de,0xb72a14ed, +0x36374b29,0xb6dd0edd,0x378a4947,0x340941b7,0x383a1c02,0xb8e26361,0x3a3b77a4,0x3b99477f,0x3bc2d0d1,0x3b5995d9,0x3947f806,0xbb4c80ec,0x3b5be57f,0x3bd5bc49,0x3ba7b31d,0x3bc5d7d9,0x3b1564da,0xbb7a771f,0xbaad18d7,0x3b047f1b,0x3bc816e1,0x3bbbd117,0x3b8884f3,0x3af6c6fa,0x3ac5977c, +0x3ac88f98,0x3a8e39dc,0x38923d49,0x38e879d4,0x384d7c39,0xb7350894,0xb805178c,0xb73949d4,0xb6732fdc,0x3654a134,0xb4aa482e,0x36ae0006,0xb772b28c,0x37a5dd04,0xb8b750f6,0x39092a1b,0xb9a5508b,0x3a023b46,0xbb9f5584,0xbc77d70b,0xbb9c523f,0xb934407d,0xb9dfe966,0xbac33f35,0xbb612e8e, +0xbba7afdb,0x3aaf740f,0x3b8c9550,0x3b4e68fd,0x3990d3f8,0xbb1341d1,0xbb1f06c9,0xbb32fe0d,0xbb13526e,0xbae0102d,0xbaae6dfe,0xba9efc94,0xbaa23095,0xba928f5b,0xb9f63652,0x37affc7d,0x37e8eb14,0x37ede750,0x37b34c91,0x36f293c5,0x364187eb,0x35b69adc,0x35c8bd92,0x36cf5eab,0x378153b3, +0x381231a8,0x386a8253,0xb8808081,0x38137a7f,0xba387611,0xba29fecf,0xb9c0bfb0,0xbadef6ad,0xbb06a576,0xbad145b6,0xb9fe1a6c,0x39b3ca42,0xba675267,0xbae921ff,0xbafbfb6b,0xbace268d,0xba63c202,0xb9c7917b,0x3846ce99,0x3a1c3a5a,0x3ac8431e,0x3aeba5bf,0x3b114b08,0x3b146f2a,0x3abe9a92, +0x3a2cb15f,0xb8c7ce19,0xb84f5d46,0xb8564128,0xb824827f,0xb7839435,0xb7201c4b,0xb6281ac5,0xb718069b,0x35ddb0c7,0xb8836760,0x36e4ac6a,0xb998bb53,0x39e75647,0x37de30cb,0x3a8226cd,0x3b134104,0x3b2a4354,0x3b24cfbd,0x3b0783da,0x3ac30405,0x3a23408f,0x3866fb2b,0xba93e79c,0xbac972dc, +0xbae4d694,0xbad32799,0xbadfd98a,0xbb030f13,0xbaa9a0f6,0xba45ab64,0xb9aa86b1,0x3911be20,0x3a04a9bf,0x3a29c802,0x3a58928b,0x3a43d288,0x394b55b7,0x38db408d,0x38f41ec5,0x389b57b4,0x3809cd77,0x3774d69c,0x3720ac23,0xb5df484f,0x37c72fd9,0x385a4060,0x39248b17,0x39518d83,0x3a1467df, +0x3a8cdb88,0xba9f509f,0xba5a6ebf,0xb9e36951,0xba2b233b,0xb9fed435,0xb9e4bf11,0xb9b7d6c9,0xb9b0e55b,0xb99bb6b9,0xb9afa023,0xb9d82bfe,0xb98d6f7a,0xb8c00083,0x383e9bf6,0x38ff0d5d,0x391029a6,0x394b39c2,0x39949923,0x3a023500,0x3a062309,0xb881311d,0xb928a756,0xb96d33d5,0xb99e7f81, +0xb9a735c9,0xb8f3f777,0xb8868a83,0x3648a0b0,0x369feb03,0x3870048e,0xb7a96527,0xb85b2c12,0xb9bb4608,0xba2ef208,0xba981dae,0xba8813eb,0xbadd151c,0xba9f120f,0xba6170d5,0xba1173b2,0xb979ee17,0xb7e4aff6,0x39735d0c,0x3a03ffeb,0x3a2f835e,0x3a5fea3c,0x3a855be8,0x3a915c51,0x3a98d6cd, +0x3aa6d2ac,0x3aa893fb,0x3ab0320c,0x3ab6e02b,0x3abb3d6f,0x3abd62ee,0x3acf3db6,0x3a9358bf,0x3a91ee0a,0x3a4e4186,0x3a008d87,0x396e42b7,0x380c596b,0xb8d7c688,0xb98cd5b1,0xb9ee4fb6,0xba06b31e,0xba17f65c,0xba486c38,0xba58b0a7,0xba832a90,0xba898529,0xba7a63f1,0x38a2ab77,0x39f71717, +0x39f14fa6,0x3a0e835d,0x3a20dd84,0x3a3bcadb,0x3a51c025,0x3a683799,0x3a702ced,0x3a7b8949,0x3a84c301,0x3a8e3976,0x3a9857d5,0x3aa231fd,0x3aa1caac,0x3aa1f324,0x3aa171b8,0x3aa2873d,0x3a9f56b8,0x3aabb725,0x3a6801b5,0x3a0b4eed,0x39e16264,0x3a4617d3,0x39b52e21,0x39824a5b,0x3945a767, +0x39099ea8,0x38b4ca48,0xb6dc7af5,0xb8ab5a23,0xb910f816,0xb8d66f54,0x39748dc3,0xb9649ee6,0xb9742907,0x3aa05f96,0xba3ad079,0x39651aa4,0xba4fdd88,0xb9f1316a,0xb9f49e64,0xba2294c7,0xb9cfe13f,0xb9bc77b9,0xb98f4687,0xba0c8b8c,0xba261d0f,0xba585236,0xba047494,0xb9ff810c,0xba2817f4, +0xba574468,0xba64caae,0xba4dd234,0xba3bffe5,0xba318ee2,0xba7c8c41,0x38bb680d,0x39b01e88,0x38fe9277,0xb92ff86b,0x397a0388,0x3943662a,0xb88acc68,0xb87bda04,0x39370d57,0x39835d5a,0x39b23a5c,0x39e66a44,0x39c3694f,0xb91fadc9,0x3889c176,0x39fe693d,0x39e8d63e,0xb9f1c3fc,0xb9f17f1c, +0xb9c0eab4,0xba4f5d27,0xb9298cd2,0x38abe953,0x39b690bf,0xb9c584c1,0xba3af86a,0xba998704,0xb9b1f7f8,0xb9ec3d02,0xba95d425,0xbae98ab2,0xbaf69041,0xbabc5a29,0xba8526b7,0xba7390dc,0xba606678,0x383cc2c6,0xba0750b7,0xb8ac3888,0xba5c9362,0xba632612,0xb9a7eb3b,0xba509ee2,0xba255cdb, +0xb9405909,0xb91e55d4,0xb9403a5a,0x3967ccb4,0xb9bcc4a0,0xb9bd0c66,0xb91ca900,0xba01d156,0x39cafc27,0xb881b88f,0xb8a0aba9,0x39ad9bec,0xba196645,0x3a312da4,0x3a80754c,0x3ad1bd6b,0x38a9bafb,0xba0ec3c5,0xbadaf05d,0x394fd0d8,0x399256ad,0xba29c2af,0xbaf01f1a,0xbb0c98e8,0xbabe00de, +0xba8d4779,0xba8aadef,0xba8d0400,0xb9cb0c45,0xba239ac3,0xb99b5e8c,0xba20fea7,0xb8b5b1fb,0x3905a5cf,0x38ba64c5,0x390cce34,0x384b07ce,0x38196efa,0x3711101d,0x387c90c6,0x37417bcd,0xb98f5bc5,0xb99e8e51,0xb96e892b,0x39051b3e,0xb9a98e87,0xb97190b1,0xb980c270,0xbad5b953,0x39c91b2c, +0x3ae35807,0x3b3a81e1,0x3a143363,0xba7f7fa8,0xbb313283,0x39545702,0x38a73e0a,0xbb1483ca,0xbb95f983,0xbb9daa2f,0xbb4f01de,0xbae0c22c,0xbab54f2f,0xbabb9a12,0xba3c5720,0xba4cd77f,0xb84f4c79,0x38ab23d0,0x3907e10a,0xb88b5ea8,0xb7809dee,0xb8359461,0xb7c0e530,0xb720d47a,0xb6366a87, +0xb80b0084,0x3712e94a,0x38d69126,0xb961d8df,0xb9bfbf8e,0x3afc8356,0x3ac1611a,0x3ad557d5,0x3b47094c,0x3bb6434c,0x3b5f3b31,0x3b10d130,0x3afcb98a,0x3a8905bb,0x3a43de7c,0x3a604b52,0x3a4ac378,0x3b186a41,0x3b8ee0a0,0x3bcfc9fd,0x3baf0513,0x3ac461cd,0xb95a1f5b,0xbab5b082,0xba75d408, +0xb9310f51,0x39596b37,0x39544539,0xb8cbad48,0xb7f85ca7,0x36dbfbac,0x3786131d,0x374ca320,0x375fd196,0x36556a9b,0x360316c1,0x37980e95,0xb79bfd97,0xb72d0d5d,0x37d731ff,0x3a21544f,0x3aaaf5ea,0x3a9e583e,0x3a734800,0x3accddd1,0x3a6b2b4a,0xba8ca683,0xbb0d719f,0xbaebcc99,0xb9c480a8, +0x3aa98157,0x3b3b0939,0x3ae80f63,0xba2722b3,0xbb670ea7,0xbb8b449e,0xbb5e997c,0xbaded392,0xba0ee3e9,0xb9b4fe69,0xb8820801,0x39ef143d,0x37d45d16,0xb8e04dbb,0x38229ec8,0x37c8ce25,0xb66e63aa,0xb6a29b82,0xb6ccdc2f,0xb6da836a,0xb5850d1b,0xb6a2df03,0xb664bbd3,0x36b3beeb,0x377cc260, +0xb848425d,0x394c1058,0x3b897f19,0x3ba91250,0x3b4700b4,0x394c0e11,0xbb4053fb,0x3b25f624,0x3ba882e2,0x3b6f64ab,0x3b76aea3,0x39f5e3a3,0xbb92e7ee,0xbb4d15bd,0xb9545684,0x3b816f23,0x3b9238e4,0x3b78b6c8,0x3b056de1,0x3ad859ff,0x3a5a3962,0x3a47f258,0x3958ab36,0xb8bb0c7c,0x38e59e86, +0xb8827d5e,0x34eb078a,0xb739eab9,0x368def5a,0x359c6cd8,0x3650d68a,0x369297f1,0xb6218217,0x378c4be0,0xb82dffcc,0x38823f5f,0xb93227b9,0x399c24ed,0xbb8ff0c2,0xbc5671ae,0xbb769b95,0x3a462289,0x39028b1c,0xba2148db,0xbb373aae,0xbbbc3ca9,0x3a7bb178,0x3b90723b,0x3b97f605,0x3ab57338, +0xbaa656d9,0xbaf23a56,0xbb1f07ea,0xbb19b9fd,0xbb15521e,0xbaf867de,0xbafc3cc4,0xbac3856d,0xba54d134,0xb9d8c232,0x38f855d8,0xb6bfbe7c,0x380cc13d,0x3689c08f,0x36c6bc0e,0xb5d3c10b,0xb5e12d99,0xb6b97b12,0xb6003461,0xb705dabc,0x37b3643b,0x379c4e27,0x38012869,0x38a28cf1,0xba3c964f, +0xba91b6cf,0xb98a5772,0xba211c7c,0xbaf38de9,0xba99615f,0xb9eedf3e,0xb8e96f92,0xba702758,0xbadb2249,0xbabd63ac,0xba962831,0xba09ed5a,0xb954cd08,0x3942ae6d,0x3a34e52f,0x3ab1c364,0x3aefc21f,0x3b004541,0x3b04961e,0x3acc6f27,0x39d594e9,0xb928ddaa,0xb805ff8b,0xb820d237,0xb7b41f34, +0xb6efc3e4,0xb68d620e,0x371085b9,0x3505a287,0x37d3c7bc,0xb7eb0cac,0x385d7542,0xb972cb1f,0x3988117f,0xb9a46841,0x3b1aa71d,0x3b3f4e5a,0x3b0c857e,0x3b114461,0x3ab4d335,0x3a222516,0xb9d67eb8,0xba628895,0xbad8f1bb,0xbaf25c61,0xbb013d5c,0xbae7400d,0xbada1e4d,0xbae6ddde,0xba876027, +0xba2500c5,0xba060411,0xb8889522,0x39ba7fea,0x3a64864c,0x3a7d7f32,0x3a436630,0x3983b651,0x38991d98,0x38b9718f,0x380f3e5f,0x37953d77,0x36068e1b,0xb743d09f,0xb7cdb0a3,0xb77b7e58,0xb83b254f,0x38c33d56,0x37dc9be7,0x3a0b4e48,0x3aa0acb0,0xba04ce18,0xba2abffa,0xba407457,0xba381eeb, +0xba36518b,0xba16d8a3,0xba0be1b6,0xba24f66b,0xba0aa96a,0xba107654,0xba19a896,0xba1a0d34,0xba0f3ea7,0xba035b27,0xb9da7c74,0xb9b121fb,0xb991853d,0xb8c3cf83,0xb8d8b49a,0x39969cdb,0x3933227e,0xb913cce9,0xb94ef183,0xb99b274d,0xb93dc321,0xb84807d3,0xb744087a,0x3794d354,0x385c431c, +0x38af15da,0x38b380af,0x390e458d,0xb8e8243e,0xb98f4640,0xb9ca2e61,0xb9ff016f,0xba660858,0xba93d3cf,0xba794cea,0xba3b6f67,0xba11ae62,0xb9f9c68d,0xb9b8095c,0xb93368d7,0xb782c485,0x3921789a,0x39ad8dc9,0x39f998a9,0x3a26fcaf,0x3a63655b,0x3a67b0f9,0x3a74d4c5,0x3a7da281,0x3a85ff93, +0x3a868f5e,0x3a92cb28,0x3ab04636,0x3a4877c5,0x3a1ea894,0x39bc3104,0x392a0191,0xb908b2d3,0xb98289d6,0xb997fb21,0xb9c3d913,0xba091442,0xba3c3470,0xba489be3,0xba6496fe,0xba54ece1,0xba66627a,0xba8b31e3,0x39f0e8b4,0xb90bb786,0x37770f1c,0x380846be,0x389600e2,0x391b8359,0x3951efac, +0x396c6cfb,0x398a13c6,0x39a319a7,0x39c122a8,0x39ea4d6c,0x3a07aac1,0x3a1cffd3,0x3a1c6bf3,0x3a211587,0x3a23cba2,0x3a262203,0x3a2e5822,0x3a106222,0x3a8d24bf,0x3aac9f6f,0x3aaf5392,0x3a570bba,0x3a9acec9,0x3a96b923,0x3a8e1d50,0x3a7d8e48,0x3a6393bc,0x3a5377cf,0x3a45b9b1,0x3a293b39, +0x3a2ab2f6,0x399b66d2,0x3a201ff5,0x3a2ef53a,0x3a1446da,0xba495a60,0xba9e2bb7,0xba017b13,0xba0933ef,0xba0fded7,0xba3a1b8b,0xba227b16,0xba1a10d1,0xb9ca293b,0xba2c80d9,0xba41c1f8,0xba72bfb1,0xba1f060f,0xba1adebe,0xba44b4b6,0xba64a5c7,0xba6eafe8,0xba61a37a,0xba4c4671,0xba421570, +0xba337110,0xbaa963cc,0xbaa4167c,0xb9fe6718,0xba9d4bcc,0xbaa67d69,0xba0e4fac,0xba67af14,0xba6f8bfd,0xba2d74cd,0xba31f835,0xba24a8e2,0xb9e09153,0xba946196,0xba901eed,0xba18c913,0xbaa28fb3,0xba7f4387,0xba418be9,0xb9b9712f,0xba1551db,0xba7a9300,0xba4cffd6,0xba21f80a,0xb8384a8e, +0xba41e83a,0xba8198f3,0xbabbb08f,0xba0a037c,0xba10a6b3,0xbaa04457,0xbae2cfd9,0xbafa4aab,0xbad6080a,0xbaab1957,0xba745cd0,0xba9a85fe,0xba8731f6,0xba4094a8,0xba4a0853,0xba949db7,0xba8b98ab,0xb9f2a0ec,0xba3cb082,0xba29e47f,0xb9c5d52e,0xb9a0eda2,0xb931f3af,0xb5fe6339,0xb9ff7c4d, +0xba5fc20c,0xba599f98,0xba3b6543,0xba4ab1a9,0xb9eb4280,0x39581ef9,0xb86551c3,0xba3f81a3,0xb9dbe487,0xb9ba318a,0x3a7e81a6,0xba1d142b,0xba890dd0,0xbb0bb738,0xb99abd1b,0xb9323928,0xba98540f,0xbb023a03,0xbb16e429,0xbaedd05f,0xbab93c4e,0xba7929de,0xbabc5c5a,0xba984f52,0xba58f5e2, +0xb9ffe0f3,0xb9aa413d,0x388838eb,0x39338214,0x391af974,0x39852694,0x390756e5,0x38f6826f,0x37be3c8a,0x38a78589,0x37bdc811,0xb977b22c,0xba22b37c,0xba267ec9,0xba3b6cf0,0xba1aced7,0x397606ff,0xba0a14a3,0xbadb3ef3,0xbaab58cf,0xb9ff223d,0x3acfeacc,0xba25ef5b,0xbaf6857b,0xbb5cf260, +0xb9e4d54e,0xb9b9b554,0xbb2dbd9b,0xbb973c95,0xbba69217,0xbb80f671,0xbb25604f,0xbab9fc00,0xbae48eee,0xba9bcfbe,0xb9dbd689,0xb8a34a7a,0x393a28df,0x370c4bb7,0xb88a3dd1,0xb885a520,0xb8cfa12f,0xb88a6654,0xb83543ba,0xb7921d15,0xb8150d1c,0x36918313,0x390a5cda,0xb7f359e3,0xb9cd04c0, +0x3998432a,0x39b15a1d,0x3a992a42,0x3afeb445,0x3b9660a1,0x3b22942d,0x3aa261e1,0x3a2f5f8b,0x3a8425fa,0x3aa96998,0x3abc4212,0x3ab3f933,0x3b2780b4,0x3b8cacfa,0x3bc7f9aa,0x3bb087e0,0x3b2e8107,0x39ef91cd,0xba3f9fa4,0xbabfcc83,0xba371b2e,0x39be6ced,0x376b2c4c,0xb8663b55,0xb7d14c06, +0x380ec8f7,0x37f5b32b,0x383c82ea,0x380add5a,0x37af0173,0x371833c0,0x37b2e2b2,0xb7966376,0xb81a237e,0x361af938,0x38a3a4d9,0x39c067dd,0x3a730aa0,0x3b02bda8,0x3af8ff90,0x3aa17867,0xbab72f99,0xbb32a38c,0xbb22438b,0xba34565a,0x3a8cd650,0x3b1f3b00,0x3ae28e3e,0xb9cb2b84,0xbb57ff03, +0xbb8d6104,0xbb85798d,0xbb3c8520,0xbae68a35,0xba3ecab4,0xb9d9e877,0x39480a42,0x365aa7f4,0xb8b9065f,0x387ef030,0x3251b8d8,0xb709cd7d,0xb7a15b23,0xb7ab9cd9,0xb7ac80ae,0xb719a6d1,0xb7527ec2,0xb50cefd4,0xb713e469,0x3865087d,0xb894e1eb,0x39581990,0x3b588547,0x3b915972,0x3b206d0e, +0xba2840b1,0xbb9e5a4a,0xb9f93dcd,0x3b0ef5dc,0x3ae6116a,0x3b6cb114,0x3abdfc33,0xbb5690a7,0xbb3a1b80,0xba4c4f0b,0x3b334567,0x3b891ff1,0x3b860c87,0x3b259b79,0x3aff1bbc,0x3ab3e797,0x39cb40df,0xb9b7bcbb,0x380334d5,0x38068579,0xb81412f6,0xb6370c07,0x364f72d6,0x374233ba,0x37701624, +0x3764b16b,0x3753a279,0x363c9423,0x37aa30df,0xb81a7480,0x38640e15,0xb9282583,0x38b651be,0xbb80d414,0xbc3d135a,0xbb92ed59,0xbac6476a,0xbaf90905,0xbb0a0f8e,0xbb6e8bfe,0xbbb2c69b,0xba576329,0x3b1620b8,0x3b69805e,0x3a1c6575,0xbada628a,0xbb0cf16f,0xbb315837,0xbb302157,0xbb22de19, +0xbb094bc0,0xbaeadefc,0xbad9dcc9,0xba95a963,0xb94c15a1,0x38ac9193,0x33272e6e,0x37a43a25,0xb6caca7b,0xb70b3846,0xb7893b71,0xb79171ef,0xb789bf20,0xb723607f,0xb78b69fe,0x37a008c1,0xb57cc2ed,0x388cad41,0x39899cbb,0xbb1c9c88,0xbb8dbb1e,0xbb04d250,0xbae99913,0xbb2ffcf4,0xbb16cdc7, +0xbad0b757,0xba791131,0xbad18068,0xbb1b3c08,0xbb2de278,0xbb11a78e,0xbac1fc02,0xba92fa47,0xb9ad9bfd,0x39c88a9c,0x3a9f0bd4,0x3ac721fb,0x3ae0f320,0x3ad9eda0,0x3a747b26,0x3940c937,0xb90b364a,0xb72404af,0xb7fca2b4,0x36e65d65,0x375350a9,0x37d8b16b,0x381158a8,0x37c66e16,0x38103f5c, +0xb6115a6d,0x383c60bf,0xb92f622f,0x394936de,0xba697b82,0x3ad72546,0x3adce54f,0x3abb4c01,0x3ab5760e,0x3a7bff62,0x3a0a3ef0,0xb97b82ac,0xba49ce31,0xbab06040,0xbac04c78,0xbace156b,0xbad3a235,0xbae69ae2,0xbafebd66,0xbaa6ec87,0xba508fab,0xb9c733f4,0x391c7c78,0x3a20df6c,0x3a83393d, +0x3a811a80,0x3a2025d7,0x388e3ed3,0x38ce24b4,0x37f806ce,0xb6e330c8,0xb7e30638,0xb86b6b74,0xb889633b,0xb88e0d5b,0xb820336c,0xb89c2ec6,0x38471519,0x37f30809,0x39a8ec69,0x3a479951,0xba649ad7,0xba1e0de5,0xb9e4c809,0xba29b351,0xba2e2a97,0xba3b744c,0xba3a5a3a,0xba55609d,0xba4e8bac, +0xba65eb00,0xba790336,0xba63307b,0xba3fdd20,0xba2d0e5b,0xba0aab60,0xb9e1b59b,0xb9a72370,0xb98716d7,0xb92f5f18,0xb8d31395,0xb9c63b3a,0xb9b32025,0xb98fa499,0xb967fa81,0xb83b46ad,0x38478c30,0x388cf1a9,0x3915ab4d,0x391fcc52,0x393432ae,0x38e09d16,0x3942695e,0x37a7c219,0xb9680b18, +0xb9f84782,0xba17e21d,0xba972358,0xba96e73f,0xba720550,0xba516ba3,0xba26b17c,0xba13a693,0xb9f29f7f,0xb9b9fdf1,0xb908e9e9,0x38d9d955,0x39a34c79,0x39f3bf95,0x3a16ee4b,0x3a38f4a6,0x3a444bad,0x3a5517dd,0x3a692f78,0x3a787222,0x3a8779e1,0x3a9152af,0x3a63fd03,0x3a0cce6b,0x393b6e70, +0x371d3122,0xb94b5c3f,0xb9afb590,0xb9be9ff6,0xb9ddebbb,0xba01bf9e,0xba0efad6,0xba1af5c8,0xba3fc360,0xba592f93,0xba76ae7e,0xba8c961c,0xba84e1dd,0xb9cf7079,0xb9255c08,0xb911c2d9,0xb8fe3824,0xb8ba7e9b,0xb82df42d,0x35216e54,0x37714a42,0x38a0a624,0x38fd3856,0x393b03a7,0x3982d379, +0x39ad8c26,0x39dd24b9,0x39e1d0c2,0x39ea9846,0x39f0ab7d,0x39f7db7a,0x39fcf5ae,0x3a0d912f,0x397d88b6,0x39613877,0x3a2700b3,0x3819b972,0x3654ae1f,0x39b88444,0x3982a7f5,0x3913683b,0x38a128b5,0xb6fce560,0xb8734930,0xb8be7d1b,0xb9bd0329,0xb9c75d90,0x389d07d5,0xb9bdb04a,0x398f550e, +0xb937d712,0x39259a4c,0xb8c85f1a,0xb85dea83,0xb6e07dde,0xb9418c13,0x3862dc44,0x39036916,0x3997535b,0x37bfb486,0xb8b0a87a,0xb9adc6c8,0xb6c15b46,0x37bbe547,0xb8d2d869,0xb9618872,0xb98b01ac,0xb98c32e8,0xb93a1d62,0xb956a7c9,0xb95149ff,0x387c8dbf,0xb96f5e5c,0xba7ed37d,0x380e5c25, +0xb991d5f5,0xba5508d3,0xba7ef53f,0xba683110,0xba2b155f,0xba211532,0xba0ece2c,0xb9c4ba08,0xb8f85eb5,0x38d1ce10,0xba782a25,0xb92601e7,0xb9a3ab1a,0x3851cc11,0xb7281e00,0x379f7539,0xb9ce6eb3,0x395e75d3,0x3a085ed7,0x3a78e830,0x398f9835,0xb89b1d07,0xba2ac90f,0x39580959,0x395bd9b8, +0xb9b3516a,0xba47ec18,0xba709974,0xba4d0362,0xb9ea0353,0xb9b294e1,0xb98dd243,0xba0a5657,0xb959565e,0xb8eff31c,0xba29f65c,0xba19b2af,0x370b19f4,0xb9533cd8,0xb9130cca,0x38535c8b,0x38be0ec7,0x38b61a3a,0x399f253e,0xb91d49a9,0xb9d06ef1,0xb92d1f74,0xb8d6d443,0x396b8ba7,0x38ca69e4, +0x39acfd0d,0x39fe1e6b,0xb9a024e0,0x3a5bf217,0x3aa614b8,0x3b1536cb,0x3a59ea5e,0x3967c0f2,0xba950d01,0x3a2679fe,0x3a556bd0,0x38c4b346,0xba281762,0xba7c9401,0xba4a71de,0xb9ec748d,0xb9979842,0xba22edbf,0xb9b720b5,0xb9d31838,0xb98ae123,0xb8841f3b,0x38bf3de7,0x388bc2da,0x388ab259, +0x3896ee7f,0xb6223ed0,0xb6b79a92,0xb83627ab,0xb856202c,0x380df8f0,0xb8a0a9c3,0xb994905d,0xb8d67083,0xb8212a06,0xb9167df6,0x38d08c44,0xb8a73e25,0xbaaa87a0,0x39c33962,0x3aeae010,0x3b5f8851,0x3aabef4b,0xb965dc58,0xbb0de895,0x3a2c6355,0x3a813bb9,0xba56e914,0xbb1c85a3,0xbb3ca42a, +0xbb144d13,0xba960df9,0xba3a0666,0xba794095,0xba3b3e0a,0xb9a02c73,0x381e0177,0x388e69db,0xb7d375c9,0xb81748f7,0xb803de9f,0xb7fdae8a,0xb6c7e925,0x35ebb86e,0x378b743f,0x37866bca,0xb7879116,0x389137fe,0x3796efa2,0xb9327112,0x3a88d45a,0x3ac5e1da,0x3ac507f8,0x3b1eb591,0x3b9f58bf, +0x3b7156be,0x3b3d6fe2,0x3b13f319,0x3b192b5d,0x3b0f5dde,0x3aeaa882,0x3aa006bc,0x3aeb74f2,0x3b40ef2e,0x3bab605b,0x3ba338e3,0x3b2055e7,0x3a9c442f,0x39a96341,0xb8483de0,0x36dbb70f,0x398781e3,0xb800670c,0xb7c9ff84,0x35b4597e,0x37b0287f,0x376f6c4f,0x3773b7c3,0x36907f8e,0x34fdb24a, +0xb709bf67,0xb525b4e1,0xb68e0bc6,0xb74a3b14,0xb851a36a,0x394a598b,0x3a708fcf,0x3a98a48d,0x3aba3dba,0x3b0c40c3,0x3ace90fe,0x38a87022,0xba84b8d8,0xbacaa5c8,0xb8b35ba8,0x3a9b5998,0x3b09c71b,0x3b0449e5,0x39e8dd3b,0xbb01d202,0xbb4c6c87,0xbb392b61,0xbaa3f4e5,0xba104a19,0xb8eeafab, +0x3937bdc1,0x396908ec,0xb8592587,0xb7e9c7cf,0x380b3a5c,0xb6f97ff2,0xb6da106c,0xb7213a05,0xb6e093a6,0xb6934014,0xb544791e,0x34a6cb3a,0x34c95438,0xb55170ed,0x36f58be4,0x380f86e2,0xb902fcd4,0x3b2d9a99,0x3b8310db,0x3b17d5dc,0x39935aeb,0xbac5c4de,0x3b237b98,0x3ba6fd8f,0x3b96ec87, +0x3b972dc4,0x3b00dfd9,0xbb0b0e4d,0xbad09506,0x39fa97c3,0x3b714f2b,0x3ba75793,0x3b9cf353,0x3b387749,0x3b102475,0x3ab3f9f1,0x3a53a2f7,0x388a1371,0x3775cb13,0x3725e790,0xb7c554c7,0x36793366,0x3637ed84,0x36e2829c,0x36ab89eb,0x36992a47,0x368df5f6,0x361bbe3d,0x3702898a,0xb70474d7, +0x378ff368,0xb851a5d4,0xb91240ee,0xbb54d4fc,0xbc16632d,0xbb16840f,0x3ac6beaa,0x3b5a7eca,0x3b0f5f6e,0xb9d7a7c0,0xbb880ed1,0xba0050c3,0x3b222a43,0x3b9a40c7,0x3af5b488,0xb99b6842,0xba9ebdbd,0xbac551d8,0xbabd26c7,0xbabfc10c,0xbaa33fa1,0xbab4e99c,0xbab9b2a7,0xba6cbaa4,0xb8995559, +0x388a1673,0xb58917e4,0x37202837,0xb6c8a8ee,0xb6bc05bc,0xb6ee1a21,0xb6ff1a39,0xb711915b,0xb72300ad,0xb74772fb,0x33258129,0xb6a1751f,0x375fd783,0x39c895fc,0xbb318a4d,0xbb52b375,0x3adc841c,0x3b2059cd,0x3a8d3634,0x3ab37d2d,0x3ac52cea,0x3a9c869d,0x3992dfd6,0xba1498c9,0xb9c3253c, +0xba175709,0xb95d11d5,0xb8d1822c,0x39175ac7,0x3a004cac,0x3a894ccc,0x3ab5a617,0x3ad55cc5,0x3aecaacc,0x3a8d2f62,0x38c0dc12,0xb90df0b2,0x373e6732,0xb7cb7151,0x37591275,0x36f0a3f6,0x375e8ed8,0x37814390,0x378d4e6f,0x37d25ef5,0x3797dd16,0x37a65237,0xb7dd5c2e,0x37d5a499,0xb9f62bcd, +0x3ad4124f,0x3b2575ca,0x3b0acc89,0x3aee55cb,0x3ab097c1,0x3a636581,0x39517aa4,0x39317da1,0xba78ee7c,0xbab49d8e,0xbad522e2,0xbab12eb8,0xba949671,0xba87c7d6,0xb9a3f11e,0x38a11cff,0x391f36cd,0x3a0eb03f,0x3a497179,0x3a81a405,0x3a7cf852,0x3a139135,0x3816f08b,0x3897bee4,0x37162e57, +0xb7391430,0xb7aaa52d,0xb7d246d4,0xb80ac01a,0xb81fc9b9,0xb849c520,0xb8652dc8,0xb7a07e65,0xb4da9604,0x37ff310f,0x3a7c5f34,0xb8c00618,0x38b0b748,0x38a29bbd,0x37dd8290,0xb7891ebc,0x37ff5169,0x389458f7,0x388b8fde,0xb5cae417,0xb8eee466,0xb9a3b92e,0xb9fa72a2,0xba24f51a,0xba547b09, +0xba30f7f3,0xba11a862,0xb9e35933,0xb9904e71,0xb94f9845,0x3863b45b,0xb9342ecc,0xb9916d66,0xb95e408f,0xb905b832,0xb73b7fef,0x38061aee,0x3838495d,0x387790c5,0x38a4810a,0x38b471a0,0x38ed26f5,0x3902370b,0x38caf899,0xb78fc68a,0xb8528648,0xb7e7043d,0xba830622,0xba29c920,0xba08f2b8, +0xb9b1c140,0xb94d35c8,0xb8b57c0f,0x37c6c5fc,0x3934d5c8,0x3939d5e3,0x3953f3af,0x3983e9e5,0x398e88f3,0x39a52e6b,0x39c90698,0x39eec3ad,0x3a069f4e,0x3a168a20,0x3a278e7e,0x3a29eb5d,0x3a5887e2,0x3a580361,0x39f7a7c8,0x39a09b82,0x35d81917,0xb8d5c197,0xb8c1172b,0xb908a4ad,0xb9377b09, +0xb9694bab,0xb98850bf,0xb992e74d,0xb9d488e6,0xba10b8fc,0xba2b3692,0xba3a85be,0xba356740,0x3936f6f1,0x378ff7dc,0x37d260bc,0x389e5c7e,0x38e51db6,0x392b4079,0x3959333c,0x3987679f,0x39755431,0x3975c653,0x39773860,0x39852986,0x398e5bda,0x39936c5d,0x39a0a488,0x39ad6ff0,0x39b6e1ed, +0x39c74352,0x39d37d1b,0x39c5d659,0x3a23ab20,0x3a136c97,0x3985bfe0,0x3a01cb19,0x39d2e7d8,0xb7a9bba1,0xb872e149,0xb8cf0484,0xb921cd66,0xb95549cf,0xb98cca40,0xb99b3ca3,0xb61d38dc,0x38ee4b5f,0xb99fab62,0x382b1ce0,0x39c2bfdf,0xba7df13d,0xba59a3a4,0xba7e80f2,0xba411f47,0xba4d1094, +0xba60311d,0xba60a08f,0xba5cef85,0xba29d694,0xba691a19,0xba7dbb6b,0xba997043,0xba6210b1,0xba59f2d9,0xba788e94,0xba875e4c,0xba8cc2b1,0xba8fd762,0xba831e7c,0xba6f1ece,0xba84dab5,0xba5e0def,0xb9f3f956,0x398b0125,0xba75ee66,0xba1899e7,0x387016c9,0xb9146cce,0xb9117ff0,0x3845ece2, +0x382327fd,0x38e684f5,0x399d1b36,0xb9f78ea4,0xba74f047,0x39641b25,0xb9ea9b1e,0xb94f7ffd,0xba8c247d,0xba359a72,0xba49c5b4,0xba800dae,0xba81b63d,0xba69fb0b,0xb9cf4375,0xba85b4f9,0xbaa76d74,0xbae5a137,0xba6cc3b6,0xba611301,0xbab3d306,0xbae2e854,0xbafbf745,0xbaf8455a,0xbac938bd, +0xbaa10428,0xba9fa811,0xb98949d6,0xba1e9edf,0xba3efa6b,0xba3c9583,0xb9fe8841,0xb9852c68,0xb9a8e37f,0xb99f6c42,0xb93796c1,0xb9485f9d,0xb931420e,0xb7d61827,0xb9a44a12,0xba13063f,0xba1c31e6,0xba414fe1,0xb9fd9104,0xba6c2b4c,0xb9d3ca9c,0xb9d3dc7a,0xba488ff0,0xba4b1fb8,0xba5462a9, +0x39b47fa1,0xba848237,0xbab91ca2,0xbb263474,0xba632273,0xba295c13,0xbab0f6c2,0xbafbd01f,0xbb12155a,0xbb0f7592,0xbada55f2,0xbaae7ad2,0xba9abdbb,0xba1e7082,0xba102d14,0xb9145d64,0x38cc3c83,0x391ed2ac,0x38e59aaa,0x38dfb211,0x38e69489,0x3888e94d,0x3890cdd7,0x38390bd1,0x380bd627, +0x38d8a6d7,0x3817fefb,0xb959042b,0xba0758b1,0xb9e27b40,0xba8d9d66,0xb9cd8661,0xba213b28,0xbaa91a22,0xbab455b2,0xba5605b4,0x3a60ba27,0xba8f29c4,0xbb191f2f,0xbb7c4294,0xba9a312c,0xba5237db,0xbb249b85,0xbb80f46f,0xbb94d729,0xbb8b5b35,0xbb3dc832,0xbafb62dc,0xbacb43e8,0xba1c044f, +0xb959d16f,0x38c2c9de,0xb7877136,0xb88365a1,0xb854cfa9,0xb8424a39,0xb8427b42,0xb802e80b,0xb7f52733,0xb7901f9a,0xb7b76c63,0xb820c005,0xb4e4adc5,0x38e63087,0xb92ddb35,0x39e24035,0xb7f69f7a,0xb9a4e0bc,0x39bd91fd,0x3b3472ad,0x3ab7d38d,0x39f35835,0xba2b405c,0x39e1c52f,0x3a581d81, +0x39fb1f23,0x3930d94f,0x3a51ba85,0x3b134ff7,0x3b89e941,0x3b86e9ec,0x3b01331d,0x3a1e896d,0xba0a04af,0xba569bd6,0x38533440,0x38fc94d5,0xb7b8df99,0xb70b9a14,0x3808d155,0x37c2d3b7,0x37c2ae45,0x37b119f0,0x378cb68b,0x3759cb9e,0x3733ea7c,0x372052ad,0x37bba84b,0xb7486aff,0xb80db0e6, +0x388e95a4,0x39d1494b,0x39ab0870,0x3a9870ba,0x3ae6f4fd,0x3ada9e66,0xb9787094,0xbaaf4b51,0xbadb8e40,0xba045be9,0x3a20b34c,0x3ac60d03,0x3afaf574,0x3a268c3c,0xbaf6bd95,0xbb6aaec3,0xbb88ad2c,0xbb6c8dab,0xbb1d4ac4,0xbab3362c,0xb9b661c4,0x3954a4bc,0xb8cabaca,0x37a949f0,0x360c1690, +0xb7656bf1,0xb76694ee,0xb7456679,0xb7476c39,0xb7191578,0xb71ab1a4,0xb68e2148,0xb76d8660,0x36843e27,0xb7fbfe43,0x38c37aa4,0xb943fdaa,0x3b01560a,0x3b442037,0x3acf1463,0xba4d06ca,0xbb8f8cad,0xbb03f535,0xb8bb9979,0x398fb188,0x3ad9ce02,0x3a08ae50,0xbb2a4060,0xbb5de959,0xbb1452bb, +0x3a0937f6,0x3b327ff5,0x3b6836da,0x3b34bc36,0x3b0a318f,0x3a984f08,0x390fa615,0xb94b5c68,0x38492aae,0xb764271e,0xb691c329,0x37198863,0x370e9ee0,0x3714aad0,0x3709b2be,0x370c55f8,0x36edf1db,0x3708b084,0x3707f176,0x3722806b,0xb69a85b8,0x37f14dc6,0xb99c4777,0xbb208dad,0xbbed1e93, +0xbb671745,0xbadd484c,0xba8603b6,0xbab64117,0xbb2ce5d4,0xbb895e98,0xbae37661,0x3a70a07d,0x3b6d7a96,0x3aa6272e,0xba0d8d28,0xbac76152,0xbb0845e7,0xbb19b330,0xbb23424f,0xbb0be5fc,0xbaecc586,0xbacb1331,0xba36f776,0x384b8d00,0x37c65664,0xb3fb4ba1,0xb6c7e18f,0xb72c05cb,0xb720f961, +0xb72e2ad2,0xb73483e4,0xb744f6f7,0xb73dea63,0xb78a588a,0xb72faef4,0x360ef9ba,0xb878870c,0x3a015f47,0xbb1ab9fa,0xbba2657a,0xba90e9e5,0x388c9f1d,0xba8b495d,0xba77f80d,0xba668aba,0xba6b57f8,0xbaaf908a,0xbb0146b5,0xbb09889c,0xbafeb1ae,0xbab6f0b2,0xba9d9aab,0xb9d48989,0x39624d9b, +0x3a480fa1,0x3a96f252,0x3aa129ba,0x3aa563df,0x3a34c99d,0xb893ecd5,0xb8839cef,0x373c827a,0x364dc750,0x37a93bf0,0x3775f830,0x379a6d5c,0x37ada74b,0x37a535e0,0x37e7d198,0x37ae2ac2,0x38365719,0xb82358dd,0x38ff0dd5,0xb9ddc85a,0x3aee359d,0x3ab266df,0x3a04bd3a,0x39be19e6,0x36ae0137, +0xb9a07bb9,0xba5eb826,0xba911027,0xbaa344ba,0xba9f47e2,0xbaa8d830,0xbab0c7f5,0xbab6101e,0xbab336f4,0xba4b93f8,0xb9dbf84b,0xb9463779,0x396c52a2,0x3a1bbcf5,0x3a88fb96,0x3a6f442b,0x39b35178,0x370c6dbe,0x3806d351,0xb80c90bf,0xb7f76072,0xb81080af,0xb81958da,0xb82faac2,0xb8404013, +0xb842febe,0xb88f1237,0xb82b3cf5,0xb830396a,0x375f8190,0x39b92c77,0xb988823a,0xb9224240,0xb96eae5b,0xb9aaebbe,0xb9faf275,0xba1563e6,0xba23b609,0xba4c06ba,0xba5749d9,0xba784de6,0xba88efd7,0xba8529df,0xba79f466,0xba76d450,0xba599bd1,0xba3caf34,0xba20981b,0xba14bd2f,0xba1c4f8a, +0xb9f97ec3,0xb9e8051e,0xb9ae610e,0xb90dfa58,0xb62479fd,0x38802478,0x38a7fa75,0x389e66cc,0x38b6c920,0x38caccc4,0x38d753cb,0x38e92f56,0x39100011,0x39160840,0x388182d7,0x380beb91,0xb8168ff7,0xba174ea5,0xba5c7590,0xba496027,0xba461c95,0xba3d9dde,0xba3dae83,0xba3e94a7,0xba3b545c, +0xba0c2c1e,0xb9b9de23,0xb9509cd5,0xb8949e17,0x3800a87e,0x3916dd5a,0x394a2199,0x39810304,0x39a48319,0x39c4986d,0x39f36018,0x3a054068,0x3a138a2d,0x3894186f,0xb92d6a2b,0xb94e1c42,0xb9573e9c,0xb980eb8b,0xb972b373,0xb989d2b1,0xb98dca9c,0xb99d63aa,0xb9973ab6,0xb9c66271,0xb9eda5e1, +0xba179250,0xba3f898c,0xba536c64,0xb9ca1bc3,0xb9f73e2f,0xb9db6c10,0xb9e2cfe2,0xb9de88ca,0xb9db0e1e,0xb9d5fb7b,0xb9e22859,0xb9c9e073,0xb9bc1a0f,0xb9a6c5d9,0xb98e2a14,0xb9628874,0xb91f487a,0xb90d63b4,0xb8e995c4,0xb8c264c8,0xb89ff23c,0xb837d08d,0xb8703ab3,0xb7c24b78,0x393c3c98, +0x3a260304,0xb9657fe7,0xb79ff5a8,0x3998acb2,0x395de560,0x3910c7b3,0x38b6d2ae,0x37c3bcc0,0xb7f6dfd1,0xb85110d8,0xb9997550,0xba04f42e,0x394b4491,0xb936b1ae,0xb9929569,0xb8a422ee,0xb99e0c39,0x38bad09f,0xb7a9cc6e,0x37ff97ab,0xb8cf3fab,0x384a684c,0x38ead653,0x399f1c4d,0x389cc4ab, +0xb768e1fd,0xb96e01f1,0x37faa750,0x38744fab,0xb7dd37f3,0xb89460d8,0xb8e22415,0xb92bbfb4,0xb8a88ea0,0xb8e9ca2f,0x3877d43a,0xb9a78757,0xba37297b,0xba9f913a,0xb98369b6,0xba4484ce,0xba84578b,0xba90d11f,0xba87e32f,0xba649005,0xba607e0a,0xba52e3a3,0xba292d61,0xba1c0015,0xb9226b71, +0xba9a50a8,0xba3ecb8a,0xba5614d5,0xb77b02e0,0x3857531b,0x35d82280,0xb98be866,0x3890a6a3,0x39a16795,0x3a4bd0a2,0x396ddb32,0xb84e4891,0xba0ea959,0x391c79de,0x396048c9,0xb92cd42f,0xb9beeb96,0xba0af514,0xba1f5fe7,0xb9ccb254,0xb96185e5,0xb93588ff,0xba4c8c7a,0xb9180e7e,0xb9a9a88f, +0xb9ba4938,0xb95f6fc7,0x3915d233,0x38a2144c,0x38cce936,0x39040764,0x39076119,0x38d8ad80,0x39613b27,0xb82a41c8,0xb9bc1256,0xb9b84e86,0xb8b6f1c9,0xb9774206,0xb93153fb,0x39aba859,0x3981ad68,0xb937f892,0x39d4db90,0x3a3629ed,0x3aeee37b,0x3a2365ef,0x39340997,0xba7e927e,0x39b9f67c, +0x3a150e89,0x3894c7ba,0xb9607323,0xb9fe0160,0xba26a01a,0xb9c67ce7,0xb8c41905,0xb9de34ec,0xb9c9e0c4,0xb96096c0,0xb89f03c2,0x3906c8a6,0x38769580,0xb6704ae2,0xb6999777,0xb57fb5a1,0xb7e10645,0xb7aded8b,0xb7eb298f,0xb87022e9,0x3802118d,0x38bf7009,0xb91cc466,0xb9379618,0xb9a91301, +0xb9c7f9b4,0x39325d58,0xb90c281e,0xba5ec3e7,0xb8e022dc,0x3a6a3645,0x3b284dd6,0x3a60c597,0xb9b4284f,0xbaf870bc,0x398e0ac1,0x3a418bb5,0xb9f86386,0xbaa9b60c,0xbaf357b0,0xbb020fbc,0xba9f9167,0xba1ccaa7,0xba35ee0e,0xba0f02b9,0x37c74d65,0x378d730f,0xb7d5bcc8,0xb81a80ba,0xb4496dac, +0xb6a5ed44,0xb618cd9d,0x36e19f3e,0x36d29779,0x3732dddf,0x37b5bde3,0xb7b56790,0xb787807c,0x38871ec8,0xb7bc6295,0x397e6240,0x3a852cab,0x3a874fbb,0x3abe814e,0x3b5b6629,0x3b2f5f50,0x3b09deaf,0x3a99b900,0x3b1524b1,0x3b1ff310,0x3ae84f75,0x3a9e4935,0x3aa79808,0x3b00ba7e,0x3b7ac7e6, +0x3b83bfa4,0x3b3951d9,0x3af15ddc,0x3a9584e8,0x399b589a,0xb6413f5a,0x39076bba,0xb881934a,0x38024a8f,0x36f963eb,0x36d8bdab,0x35648773,0x36269348,0xb61908a5,0xb622a3bb,0xb69b890d,0xb70a3fc7,0x37358cf2,0x36bc61bb,0xb813d864,0x37f83e4e,0x397ac33c,0x3a81754c,0x3ab99c59,0x3afd9018, +0x3acb288e,0x39bd9340,0xba20cbfa,0xbaba4a9b,0xb97a7bc4,0x3a2ebf65,0x3aa8fac8,0x3ae6b135,0x3a5c1016,0xba8aaac0,0xbb16cc23,0xbb28d3eb,0xbad98174,0xba9955c3,0xb9fabd30,0xb8841bbc,0xb8334fa4,0xb7904f4a,0x361f41dc,0x3600f618,0xb74ab885,0x333c5aae,0xb6351959,0xb57813bf,0x351cc536, +0xb5512974,0x36ae31d0,0xb6bd2be9,0x373a1723,0xb82412d0,0x38b94632,0xb91c2a7b,0x3a9ac258,0x3b246524,0x3ab06d98,0xb8597ab6,0xbabeb608,0x3a25c323,0x3b2f2d3f,0x3b53c5bb,0x3b6f2b9d,0x3b0cf10b,0xba37b26b,0xba8e59f0,0xb7fc948d,0x3b0c06e9,0x3b7f1e46,0x3b87423d,0x3b393997,0x3b0deee0, +0x3ac28fce,0x3a1edab7,0xb82ee259,0x388a145e,0xb82bee86,0x378f3bc1,0xb60127c6,0x36ad6d44,0x3461e418,0x360e3a20,0x355893e0,0x3551973e,0x358af785,0xb5222b99,0x373b16ce,0xb7869862,0x388e4547,0xb99c4c9a,0xbad305eb,0xbbb43919,0xbb011774,0x39b19d82,0x3b598bf6,0x3afab390,0xb8b26d21, +0xbb25c6d4,0xbacbc2d5,0x3a0a2480,0x3b648e60,0x3ae91fd3,0x39af3387,0xba6177bb,0xba834eaa,0xba88726a,0xba940c3b,0xba7efda1,0xba7b65fc,0xba98b585,0xba1d3018,0x390e342b,0xb7ac8287,0x372274e6,0xb71f613d,0xb500014b,0xb6806504,0xb5dd1b67,0xb6852c67,0xb51bbd73,0xb7037b56,0x36cacce1, +0xb80b49e3,0x3865f1f8,0xb933db56,0x3a103291,0xbb2386fe,0xbb7fcaa8,0x3b09295f,0x3b568cd8,0x3b18171a,0x3b0b44e1,0x3af18863,0x3a9f7ac2,0x39adcbd8,0xb9ec49e5,0xb9e72336,0xba4b4dec,0xba044dfc,0xb9e45040,0xb8c67548,0x3954f522,0x3a1f0fed,0x3a61285c,0x3a9322b8,0x3aaebabf,0x3a109794, +0xb90a7c2e,0xb784d793,0x370d3f7c,0x36456bae,0x36f83d49,0x365acdcc,0x36d72ca0,0x368dfe3a,0x371b8397,0x35aeef42,0x37bd2410,0xb716a289,0x388a80de,0xb8c4e911,0x3974bd28,0x3a80d588,0x3ac03c8a,0x3a954f14,0x3a2a653b,0x3a035555,0x399a7379,0x3803d1ad,0x396e1ca3,0xba06b55c,0xba5897ad, +0xba895c79,0xba69a64f,0xba467dca,0xba1f037e,0xb886199c,0x398dfad0,0x39d0fbec,0x3a3a5e9d,0x3a5764f9,0x3a6b3fb9,0x3a47ff12,0x3963fc4c,0xb70204f7,0x370a05eb,0xb7ae222c,0xb6d2f127,0xb730ca77,0xb714b985,0xb75f9d3e,0xb724d521,0xb7aa8ca7,0xb726f151,0xb86bcf82,0x37104abe,0xb8f5b37a, +0x398d8f7d,0x389e2f3c,0x39e14d06,0x3a00706a,0x39c28762,0x3990b9c4,0x395ceb36,0x394a7398,0x3930cdf7,0xb6ae2a44,0xb93223d2,0xb9d5468c,0xba0a70f3,0xba29e975,0xba55efcd,0xba363577,0xba1ce101,0xb9ff6a0a,0xb9da3167,0xb9a5455a,0xb98c0914,0xb9e00f67,0xb98c5188,0xb88e1e48,0x3816de4e, +0x37f453a5,0x3788ab62,0x375526b8,0x3783759f,0x37ad27fc,0x379e595f,0x37e95b74,0x38177d3e,0x38ab8d19,0x38d1d5d4,0x37e5bce6,0x392b6a41,0xba5fe54a,0xb9e1b80b,0xb9bf60cc,0xb9974479,0xb951be52,0xb8e55292,0xb8370eb0,0x381cabbc,0x37e3310f,0x37e06c2b,0x3806d9bd,0x37228e1a,0xb7672c1f, +0xb826d609,0x3818f006,0x38bf0636,0x392aac2e,0x39658f9b,0x3985e341,0x39d7b67c,0x398b5e67,0x38e12471,0xb8311edc,0xb91658e6,0xb8cba36e,0x36de7cc7,0x37a44f8a,0x37067e82,0x36f2de9e,0xb5b80f76,0x375a6a87,0xb8968bcf,0xb9435bfb,0xb9ca0a5e,0xb9f5847f,0xb9dcdde3,0xb94f745d,0xb828ecd3, +0xb8c28b98,0xb845a90d,0xb7dc7243,0xb6f03ac5,0x3785afd0,0x385d4fab,0x379c56f3,0x355aa055,0xb77097ed,0xb7b88366,0xb7b56a2d,0xb80ec1e5,0xb4c2fb64,0x37b0411a,0x381edfc4,0x38953ed1,0x38b0d33f,0x39039a1e,0x38a5e9b4,0xb8a1a981,0xb9959020,0x3690b147,0xb981fe3c,0xba043479,0xba0c07d4, +0xba109cbf,0xba180218,0xba1e01db,0xba2647ac,0xba251225,0xb9ef9fc4,0xb95878ca,0xba25db05,0xb9d957f7,0x38378315,0xba27241f,0xb98bd780,0xba41645a,0xba018ab0,0xba04e223,0xba0b5954,0xba0ce722,0xba0a03d7,0xb9c83709,0xba1545be,0xba273de1,0xba52f9bb,0xba184b2e,0xba0fe337,0xba20614f, +0xba2b3283,0xba34182a,0xba443475,0xba2ea7d6,0xba1d9cde,0xba3867ee,0xb97c4dd0,0x3816e46c,0x38fff6ef,0xb9dc1e85,0xb8d193cf,0x38870803,0xb623c8a2,0x37c13f25,0x390debce,0x390a34e0,0x39404c8f,0x39a774cc,0xb81c8af5,0xb9e3592f,0x392656a1,0x37e6162f,0x38b80258,0xba35e72a,0xb9ffe59e, +0xb9e9d84e,0xba0c3513,0xba0bbebe,0xb9ef61bf,0xb9057515,0xba213e47,0xba5dfb20,0xbaa178fa,0xba266615,0xba1540cf,0xba656a09,0xba8ad4e6,0xba9e4f92,0xbaad3a9c,0xba896cc1,0xba659335,0xba377602,0x38bdb515,0xb9b73c23,0xb9be37ec,0xb94400d9,0xb8c3e829,0xb85d7897,0xb89926f3,0xb893ad51, +0xb859cf94,0xb88149a0,0xb8864038,0xb8355c2f,0xb89ff9ea,0xb9398a17,0xb993c431,0xb9eb2d1e,0xb916fce1,0xba38bad1,0xb9beef63,0xb95aaac2,0xb9b21501,0xb9ae1726,0xb9b29e2a,0x39eee50b,0xba126f8c,0xba6bff17,0xbaeb0ea7,0xba296648,0xb9dc7c07,0xba4e48a2,0xba8b8190,0xbaaab238,0xbac85e06, +0xba922c7f,0xba76e531,0xba195608,0xb8eb98dc,0xb9297026,0x38e5285d,0x38922447,0x3838f4be,0x37d057be,0x38057cbd,0x3800b305,0x37a6230d,0x37bca8b5,0x37b78021,0x3700c106,0x38307970,0x386f9be4,0x38957d41,0xb944930f,0xb8e85a66,0xba5d6d91,0xb9bddfda,0xb96a8ed3,0xba093e6c,0xba102bfc, +0xb8e57065,0x3a7e183d,0xba0d81bf,0xbacfff97,0xbb364c00,0xba70b5de,0xb9fd3edd,0xbabf5bd8,0xbb11358a,0xbb347324,0xbb45c876,0xbb093f11,0xbac3a8fe,0xba6a0ca6,0xb90e12bd,0xb80641e9,0x3794bad2,0xb86b89e9,0xb72cb265,0xb790f172,0xb752a8ca,0xb78072b9,0xb70ffa9f,0xb73b94db,0xb6e5fe2a, +0xb7084563,0xb7305de8,0xb8419306,0x37cfd654,0x35b19fa7,0x39d6eaa3,0x397d455b,0xba1aa520,0xb89ea24a,0x3acebed2,0x3a7ecbec,0x39e63920,0xba3dc042,0x3a28940d,0x3a810901,0x39ac35cc,0xb8dedc3b,0x38371998,0x3a7c9df2,0x3b28877e,0x3b3b551a,0x3ad7dfb7,0x3a83e6ba,0x394522db,0x38e698f5, +0x399e4d29,0xb8859471,0x37e8c49b,0x36ca1228,0x3787a869,0x365a2975,0x37169c88,0x36c0eeb7,0x36c7db7d,0x3674e7a4,0x36d947da,0xb5b79f09,0x378be40f,0x358c2f79,0x37e6ab35,0xb8cd1458,0x39584c62,0x398ee4d1,0x3a0fb927,0x3abc7b47,0x3ac9c64c,0x3a220f24,0xb92663b5,0xba73aeb5,0xb97c976a, +0x39b22ed3,0x3a5dc06a,0x3ad5c67a,0x3a7f55ff,0xba5a0052,0xbb1c7349,0xbb4e399f,0xbb3e06f7,0xbb05c1c0,0xbaad1365,0xb9a02a24,0x3885b54a,0xb8934eb0,0x380e52e5,0xb7c8a419,0x353d6990,0xb6d8191b,0xb62f1825,0xb69ef5b2,0xb60145f1,0xb6ac739e,0x3600ae5f,0xb74c10b0,0x3787dfd0,0xb861f428, +0x38c09010,0xb9257af9,0x3a36f1d7,0x3addbdab,0x3a620af9,0xb9effee6,0xbb207519,0xbac1dc6f,0xb93e767b,0x3a1565be,0x3a927aa6,0x39f4b872,0xbab221b7,0xbb20b6e1,0xbafc047e,0xb8498bc9,0x3af3b1aa,0x3b3670ef,0x3b21f1e8,0x3af5e2f4,0x3a8286f2,0x39532a8c,0x385d8e92,0xb5e1ef42,0xb6a0727f, +0x36fc27ef,0x3674c2cc,0x36365eb9,0x36545858,0x3637db12,0x36535a77,0x3606852b,0x36930ee8,0xb5cd1ee6,0x377fdcdc,0xb7c033fe,0x38b81b87,0xb985c833,0xba48a767,0xbb8042d7,0xbb112e42,0xba6bf1de,0x3a9323c1,0x390776c9,0xba8c48c8,0xbb1d0140,0xbae16e3f,0x388f678d,0x3b3f445b,0x3ae0f0d8, +0x3a15889b,0xba3773a1,0xba8ce80d,0xbab541d8,0xbad869cd,0xbabbb39e,0xbaa28d2f,0xba8c9386,0xb96f0c25,0x3895cadb,0xb760193d,0xb64d93fb,0xb6ac7c0a,0xb6584bee,0xb6829d32,0xb66badd9,0xb69e0f98,0xb6255cb3,0xb7063bf3,0x369703c6,0xb7e934d4,0x38415efd,0xb91d20f3,0x39bfc6e8,0xbaa1ea9e, +0xbb5e51ac,0x3a82ed04,0x3b10c0d2,0x3ab8cf7f,0x3a98c9ed,0x3a47389d,0x3900c4ef,0xb9d03413,0xba7c58bd,0xba7793ac,0xba97051b,0xba682b7f,0xba4d1ce8,0xb99203fc,0x38ab0b42,0x39af48d5,0x3a39e1b8,0x3a4e224b,0x3a7df455,0x39ca36ba,0xb91a1675,0x38134194,0x331e8ab8,0x372ee7c3,0x36a13167, +0x36e6f07d,0x36eb6bd2,0x36ddc95e,0x3721a19b,0x3687e555,0x378e98f2,0xb6c900d1,0x384d0a26,0xb8567b5b,0x395cd149,0x3aa00936,0x3a880334,0x386e7c3e,0xb972d243,0xb9ef4aee,0xba2ecadd,0xba727f61,0xba631a31,0xba605f97,0xba530a54,0xba61e4a1,0xba609998,0xba4ff2cd,0xba259da5,0xb95ae598, +0x3830dcd5,0x3901d53f,0x39ccaab9,0x3a10e8b8,0x3a5f8e7f,0x3a21de54,0x3859f112,0xb6ebb744,0xb7ce7c9a,0xb727afd8,0xb76ba8ab,0xb74a4fce,0xb76d0d9e,0xb77a28b0,0xb781dd2d,0xb790aa00,0xb783b12a,0xb7d364c6,0xb7daab41,0xb829adeb,0xb90439ac,0x398263ca,0x39b19fd7,0x3943c009,0x3932dd65, +0xb6fc4275,0xb8fca4a8,0xb96488d0,0xb9c55501,0xba01a901,0xba275822,0xba4c141e,0xba505245,0xba525fb3,0xba5d3114,0xba482da5,0xba326a85,0xba1e8649,0xba1309dc,0xba1b2c54,0xb9fd5c45,0xb9b08f03,0xb92ae47c,0x387f173b,0x382302e7,0x37e798af,0x37db6708,0x37de1f7f,0x37f2b54f,0x37ffa822, +0x38081bf4,0x380eb515,0x380d32d2,0x384257ca,0x388f8ceb,0x38c22603,0x393e229c,0xb9af45fa,0xb9fa585b,0xba028c80,0xba0a0eb2,0xba0f8a7b,0xba12133c,0xba19c0f9,0xba1cb0c1,0xba08890e,0xb9eaaed2,0xb9cb3c64,0xb9b1c015,0xb99d301c,0xb984dbc8,0xb95932d9,0xb92e720f,0xb8ed0d4a,0xb883ec56, +0xb69b4082,0x38491479,0x3954c801,0xb937a844,0xb94f7732,0xb8ebd947,0xb86eb1de,0xb87659e0,0xb86f2df7,0xb87d2747,0xb881b5c6,0xb883b486,0xb88ce15b,0xb87b27ea,0xb8ada132,0xb9534f2c,0xb99e17f2,0xb9db44d9,0xb96c09ad,0xb9d5b520,0xb9c693d1,0xb9cb3800,0xb9cccea9,0xb9d22775,0xb9d49c3f, +0xb9dfcead,0xb9dd50e3,0xb9ddf737,0xb9d952e0,0xb9d43034,0xb9cbb9c8,0xb9c2e149,0xb9b6b160,0xb9ab574a,0xb9a2005b,0xb997ce05,0xb986ed92,0xb9999001,0xb8bcf03a,0x38c352e4,0x3976dc70,0xb974eef4,0xb8404bb5,0x37b6a599,0xb7421263,0xb82add31,0xb889d2aa,0xb8c09db4,0xb8f64c45,0xb9106f6f, +0xb9507008,0xb9bc810f,0xb828ef06,0xb8e9df58,0xb9cc8e53,0xb9803a75,0xba0514e0,0xb90f57d0,0xb9417f88,0xb92b6404,0xb95e36e3,0xb948ccc7,0xb92ccc65,0xb77d275c,0xb933702b,0xb96c8e2a,0xb9ba3139,0xb94f585a,0xb937e1ce,0xb966bcbf,0xb96c82e8,0xb981b7cb,0xb9a332a8,0xb981fa32,0xb97d9ec7, +0xb8f5055b,0xb9f58947,0xba1fe53f,0xba40326d,0xb9d86ec4,0xba18997a,0xb9f957d8,0xba089105,0xba02cc0f,0xb9e2aa05,0xb9e517f8,0xb9d72b60,0xb9a2df58,0xba0740ce,0xb9c4cb0a,0xba351dd7,0xba2d7838,0xba240c6e,0xb9978cef,0xb9078ea2,0xb944c853,0xb994d071,0xb989116b,0xb9291d64,0x3946887c, +0xb94175aa,0xb9b81571,0xba2978f6,0xb957bbce,0xb90d10ad,0xb9b4e217,0xb9d91d31,0xba0e7ad3,0xba34bd78,0xba10961f,0xb9c1047b,0xb9a3934d,0xba058c97,0xb92a8ed1,0xb9688e9d,0xb3b0c953,0x38a5d6fa,0x38f61cd1,0x38b29208,0x38c98eb7,0x38c61b81,0x38c6ca38,0x38a21982,0x38eb52d6,0x38aa004c, +0xb84ede93,0xb97f3d3f,0xb94d94ba,0xb9c3455c,0xb9e86270,0x38202aa0,0xb892ec74,0xb916d96f,0xb9231f95,0xb8dd74d5,0x3a43ec40,0xb888a255,0xb9a4e17b,0xba82fa95,0xb962eb04,0xb80bab87,0xb99df407,0xb9b39f3a,0xba090f48,0xba4d231a,0xba106b77,0xb9962a63,0xb9ba5bf7,0xb98a0730,0x37ff4bab, +0x383111da,0x382cb0e5,0xb7c31d6d,0xb7f0acc5,0xb7c4b43b,0xb7bc5d05,0xb7ec8d10,0xb7cd19f8,0xb7c00e6e,0xb8186fd6,0xb78e5a20,0x382c2f3a,0x387bcb1c,0xb81b916a,0xb9398d8b,0xba1ad94a,0xb78e6c27,0xb963193e,0xb9dc5141,0xba0f3399,0xb912a855,0x3a89204a,0xb8f79494,0xba606304,0xbae1cfe0, +0xb9cdb840,0xb6e6983a,0xba2ecea9,0xba844339,0xbac0d175,0xbaf6a7d4,0xbab1f9da,0xba475f9f,0xba0dc1f1,0xb95c32a9,0x38a8120a,0xb84cbf5b,0xb6d12df5,0xb2b53277,0x37738423,0x36f95937,0x371b0496,0x37322160,0x37276792,0x37139215,0x378d052c,0x354b92b8,0xb757ecce,0xb81e41a2,0x38ab1820, +0x35f54550,0x394bbeb0,0x38f8c9a2,0x3993b9e1,0x3acc89af,0x3a9f9fe9,0x3a631272,0xb8aea220,0x3aaf1126,0x3ad897f1,0x3a80e5a5,0x3a1ae7c2,0x3a040737,0x3a80c465,0x3b0a2f45,0x3b212a81,0x3b0e393c,0x3ac7a5b0,0x3a80f21a,0x39a3c192,0x37c836b3,0x3775e8c8,0xb6ceae8e,0x378b7bc8,0xb6b5d065, +0xb6731c6f,0xb6a3ea64,0xb668ebb1,0xb6b30bc2,0xb67db020,0xb6c40e54,0xb68cb6ab,0xb6eae47f,0x37bc8c60,0xb7917685,0x37c8d289,0xb903a9f9,0x3a0cb251,0x3a81fa21,0x3ab0e2ca,0x3aa894c2,0x3a042612,0xb9516e3a,0xba82f848,0xb99397a6,0x3983bdac,0x3a2b54bb,0x3aa57ebc,0x3a4febe5,0xba0e98e4, +0xbad58347,0xbb11220b,0xbb03689d,0xbad3b36a,0xba73e207,0xb9d278ec,0xb8603d9c,0x37a683f0,0xb7210724,0xb5d72f20,0xb5a806f0,0x36783338,0x35caa5f8,0x3619569e,0x361da026,0x3605b9fa,0x364cfae0,0x35f793ab,0x3646f04a,0xb71ee149,0xb5cf2633,0x37dc658d,0x3958554c,0x3a96b4cf,0x3a151d5a, +0xb9ba3e34,0xbad5ab9b,0xba8faabd,0x38cfbad8,0x3a937484,0x3ae7b8b8,0x3aa8d372,0xb97f674a,0xba9466f6,0xba5a316f,0x39f1c63f,0x3aff9227,0x3b280d71,0x3b0f7aa4,0x3adb3294,0x3a98e872,0x39a94df4,0xb7fe1327,0x37d743f0,0xb79639ab,0x3768864e,0xb6b608b7,0x356aacf3,0xb6236c7d,0xb530ae08, +0xb5dd7413,0xb59d847b,0xb5a8f195,0xb64b772a,0x369db811,0xb7393290,0x38487fcd,0xb8fa8995,0xb8cebb15,0xbb3b57f4,0xbae40220,0xba4c9b61,0x3ae73d16,0x3a2d6d00,0xb9d391a5,0xbab21a35,0xbae00aa6,0xba08b08b,0x3b01aa79,0x3aba983d,0x3a3861bd,0xb9dd8661,0xba24d1e5,0xba54f0a1,0xba73d7bd, +0xba563f12,0xba2ed4ed,0xba467f41,0xb92c5556,0x38ba270d,0xb808de77,0x36fd64b4,0xb689311c,0x365f76b4,0x3493326a,0x35ea2af3,0x34a4f379,0x36378276,0xb6195bb2,0x371e36a1,0xb797a1ea,0x38139efe,0xb8c32ea6,0x392e8312,0xba436e6c,0xbb35e0a0,0x3ad1cf73,0x3b2478bd,0x3b11a1f0,0x3ae7f3ed, +0x3ab2dad3,0x3a471a2e,0x3890392f,0xba0b4a8b,0xba2dc617,0xba73acb0,0xba44bd0e,0xba32fccc,0xb99781cb,0xb7c87afd,0x396a019c,0x39ee291d,0x3a225634,0x3a52702c,0x38ef7c67,0xb8c3e3f5,0x3813f28e,0xb69d9947,0x36521205,0xb67d8b72,0xb5b1bfc2,0xb5be0737,0xb62b70d8,0x34def071,0xb6c8a00f, +0x36e665a0,0xb7a6d0ac,0x3862fe87,0xb8c94a1c,0x398fba3d,0x39f369a9,0x3a0429fe,0x37f6b86c,0xb9c24c91,0xb9c3d791,0xb9e1e741,0xb9f4e04f,0xb997da47,0xb9e1c165,0xb9f58ecf,0xba0d0d50,0xba0a25f2,0xba039c73,0xb9c7e360,0xb87568fd,0x394640cd,0x39b44e9d,0x3a1434f3,0x3a1e688e,0x3a38a64f, +0x39cb210d,0xb7877adf,0xb528b3c1,0xb797f676,0x36d05509,0x3659e301,0x369373ff,0x3658d08a,0x366da25e,0x3688566c,0x35f7e375,0x370a8dd1,0xb696581b,0xb74fe1b3,0xb781c320,0xb8d3d625,0x392ca1a0,0x3a022644,0x3a02022a,0x39d53682,0x39932a48,0x3916d4ee,0x3862725d,0xb8413fa0,0xb965b678, +0xb9c7b45f,0xba135895,0xba160e23,0xba1883ed,0xba2658d1,0xba1187e0,0xba017a8a,0xb9dce341,0xb9d80cb3,0xb9b77d7c,0xb9cf2f13,0xb9bf1394,0xb8277e05,0x384d2bb5,0x3766139e,0xb6fc00a6,0xb781fb3f,0xb726cdb7,0xb73f4c53,0xb73953b2,0xb73e1ec8,0xb721e123,0xb788440f,0xb6c119a1,0x3813cd29, +0x3849d8bf,0x38aa3b09,0xb9fcf067,0xb9a99b80,0xb9a14b5d,0xb9acc463,0xb9a3a6e9,0xb9931802,0xb98efe68,0xb98a4d5b,0xb97969c8,0xb95d97bc,0xb95311e7,0xb95d5656,0xb97e3118,0xb993eaf0,0xb9766b28,0xb9503de9,0xb9164acf,0xb8dfd3bb,0xb864b9e2,0x37aba9db,0xb8d4d088,0xb9104461,0xb8e85e21, +0xb74b2f58,0x38681e29,0x38817c33,0x385a8677,0x386f0a43,0x38679559,0x387445fd,0x385ffb56,0x388b999d,0x387400ce,0xb8687f89,0xb942cc99,0xb92fc33d,0xb9bd6db2,0xb92a0dab,0xb95dbfe0,0xb94d29fd,0xb94a2c02,0xb952b192,0xb951a98f,0xb94e2499,0xb95fb617,0xb9710a1e,0xb97af71b,0xb98305b4, +0xb982a0a7,0xb986401e,0xb970fce2,0xb961934e,0xb9550f34,0xb93e8c1c,0xb936cf00,0xb9059a9f,0xb97e306d,0xb9a8a6e0,0xb9b99b13,0xb9928832,0xb9c50e32,0xb9ba98b0,0xb9c22934,0xb9c50fbe,0xb9c95633,0xb9cc31ad,0xb9d11ffe,0xb9d03785,0xb9de130b,0xb9ad99dd,0xb9febbec,0xb9f80dca,0xb97b4a97, +0xb986a321,0xb84bd3a0,0xb9a17f63,0xb9564ebb,0xb944ced5,0xb94cbb86,0xb94261f6,0xb935b64d,0xb8b70d67,0xb951f4ba,0xb9804840,0xb9b41261,0xb970626a,0xb95afd0e,0xb971a73d,0xb97aae7d,0xb9877567,0xb9a4c5b3,0xb98a3630,0xb97eed99,0xb986c64d,0xb712c4ce,0xb6d7c598,0xb98d1d24,0xb8a66fd5, +0xb79d252f,0xb8b4f18d,0xb8bd2803,0xb89d04b8,0xb82a5c62,0xb825cd1a,0xb7bf2b49,0x37c3c70c,0x337a04a3,0xb8d191ac,0xb95deb47,0xb7faecbb,0xb8934ef4,0xb98e5b76,0xb95fa36e,0xb92545ed,0xb93e1272,0xb913b446,0xb8a211aa,0x38d4fd4d,0xb941ca31,0xb9af9673,0xba12ba12,0xb9870da7,0xb9574516, +0xb9adda99,0xb9c9bdc0,0xb9f73260,0xba1d8cad,0xb9f48ed4,0xb9cbfc73,0xb966c22b,0xb7442711,0xb8d75e9c,0xb7d7454c,0x36749ed1,0xb5ecca15,0x381a5141,0x380f78a9,0x37f48038,0x379bc807,0x378a6c17,0x36d055e1,0x359e9554,0xb7088563,0x35e64e9b,0xb80037ec,0xb91c989d,0xb7cd00b1,0xb9d49878, +0xb92f16f8,0xb85add60,0xb850fbea,0x3745124e,0x383d7f2d,0x3a0309fb,0xb8ab0eb6,0xb99f51e3,0xba56cc9c,0xb98d85df,0xb8f911fc,0xb976eb9f,0xb998f527,0xb9df3844,0xba31874a,0xb9f17003,0xb9c2f521,0xb928db81,0x38387c54,0x352c9d06,0x37fc901a,0x3537d405,0xb41b549b,0xb7422901,0xb758697d, +0xb725d6a5,0xb6fb5c18,0xb6bba39c,0xb610b84b,0xb5e6c238,0x36a07942,0xb58d3c8e,0x381118a9,0x3714a50f,0x383ac58e,0xba07be0b,0xb97c8799,0xb8a042fe,0xb90bf0a0,0xb87adbb0,0x39839117,0x3a5e2b6f,0xb80c54c5,0xba3116e7,0xbab21c5a,0xb9df1f26,0xb8ed8e7e,0xb9fd6c09,0xba3c56ad,0xba8b951a, +0xbabfebdd,0xba88a0d8,0xba470101,0xb9a1d17f,0xb5529ad9,0xb6bdd4b3,0xb710ece2,0xb6b08f7b,0x362ac392,0x3679b04c,0x36d0bd02,0x368aa494,0x36772162,0x360de849,0x35ebd0bc,0xb51364da,0x35647349,0xb6c6a0be,0xb706bfd5,0xb7527370,0x3829b71f,0x39b25bed,0xb94b9830,0x384d66ab,0x3a646c44, +0x3a47d4c0,0x3a0fd984,0xb9a108a9,0x3a4e33e2,0x3a806606,0x39c1d319,0x375bcf19,0xb8b1f209,0x39a51b1a,0x3a9fe388,0x3ad011da,0x3aadc0f5,0x3a8db117,0x3a2ff33e,0x3a0ac333,0x3814d6c2,0xb7d48334,0x378a8f43,0xb62c4d44,0x359c28b0,0xb6491ed6,0xb61f13c4,0xb6253847,0xb5d5a9a5,0xb5c28d76, +0xb4fafd96,0xb56ac4dd,0x35d7452f,0xb5e72cc6,0x37893af2,0xb7d963bd,0xb88b8ef0,0x39bf6ad3,0x39cfc02e,0x3a7eb7ea,0x3a8aa25d,0x3a4443ea,0x39916ce0,0xba07d712,0xb916293c,0x391a5218,0x39f4f7ff,0x3a8fda2b,0x3a5c8710,0xb91eb17d,0xba8fabb8,0xbad69493,0xbace669a,0xbaa2f23c,0xba6648a5, +0xb99b14b9,0x34c15a90,0xb5b64559,0x35907d98,0xb68a3987,0x360f7b10,0x34e985d6,0x3604bfe3,0x3598b7d9,0x35b30951,0x351ef77a,0x35aa9d6d,0xb535a251,0x3600582e,0xb66f2563,0xb65de701,0x37649b74,0x37704665,0x3a3416f0,0x39cc5173,0xb93573bf,0xba61b98c,0xba368a4b,0x388efffa,0x3a69e882, +0x3a7811f6,0x3a1a700c,0xb995d615,0xba927e57,0xba7479d7,0x388d2522,0x3a99ffe2,0x3ae67697,0x3ada5ff4,0x3aa9ced7,0x3a4c73f3,0x39971185,0x380828bb,0xb7a7887f,0x37089582,0xb527db6b,0xb41e79f2,0xb5a4c70d,0xb5a7003b,0xb5b13c13,0xb589ee8b,0xb5ac725b,0xb4e9d4a6,0xb6159bcc,0x36601ef7, +0xb70ea4cc,0x37d662ff,0xb83b2a7a,0x394ea892,0xbae07b76,0xba94966a,0xb98249bf,0x3af2cec9,0x3a6f292a,0x3746a0df,0xba6c4951,0xba9ae667,0xb9ab02ed,0x3ad60f45,0x3abbf3ef,0x3a793524,0xb898cad9,0xb99bd377,0xba062a82,0xba32968d,0xba1eac26,0xba118871,0xb9f37185,0xb785b2f0,0x37b783ff, +0xb7292e9c,0x3525d156,0x35532df7,0x35bd57b0,0x3604758c,0x35ed397a,0x35ea3fa3,0x360799c6,0x35a9b6fc,0x3650d0f7,0xb6235223,0x36bfe4d4,0xb76f6690,0xb6f34e7d,0xb946b7a6,0xba9da7f0,0x3aeed8f6,0x3b2730ab,0x3b1a2cf9,0x3b018cbd,0x3ac93761,0x3a63b9d2,0x399adb49,0xb945fa40,0xb95c52a4, +0xba085dda,0xb9f0e67c,0xb9dcf7ad,0xb94d2890,0xb8320dc6,0x388b5f1e,0x39aaadbf,0x39d47641,0x3a224333,0x3779ee9d,0xb83525ca,0x37e993fd,0xb70ea607,0x362c6f8c,0xb6a3c084,0xb62d878d,0xb67c4b71,0xb66373b2,0xb6666ae6,0xb68d6104,0xb61d7f55,0xb6b264ed,0x3749cc1a,0xb7cd7930,0x38c36444, +0x3990404b,0x3a0de7ff,0xb9328a81,0xb9e8d591,0xba0b09cf,0xba2447e6,0xba2b36bf,0xb9e4e8fa,0xb9e86e4e,0xb9d8e210,0xb9e3abf3,0xb9c8e5e5,0xb99dd28c,0xb91e519d,0x38ab5fb2,0x397f23c4,0x3995fd08,0x39dfb0e1,0x39d8ee4b,0x3a13ae72,0x3945199d,0xb8774d99,0x3722312e,0xb73b1a3f,0x3701e5fe, +0x36936c79,0x370726f1,0x36da0d8b,0x37027f68,0x36e57c10,0x3718ded3,0x36affde8,0x3731818f,0xb7ad8917,0x3815e0d0,0xb913c5db,0x39867d4d,0x3a0e442c,0x39cd7ae3,0x39d59890,0x398ea432,0x393a31d8,0x38a76ae0,0xb80c2c09,0xb92be34d,0xb9951d67,0xb9dbbaf9,0xb9ea7e5a,0xb9faae13,0xba09faa3, +0xb9f7ea16,0xb9ddeaef,0xb9c43531,0xb9b4c6d7,0xb9ae8407,0xb99d65c7,0xb9167628,0x3823c680,0x37b719dd,0xb3e2a501,0xb6cdc69c,0xb7862259,0xb780628b,0xb7881ab4,0xb7897257,0xb7916df1,0xb78d6c01,0xb7ad1eb0,0xb6bbb5cf,0xb5c6c428,0x380f1d9d,0x3620b1be,0xb935acb2,0xb95b8c24,0xb976194a, +0xb98781e3,0xb990cd06,0xb98ea787,0xb99638e7,0xb998733a,0xb996b82d,0xb995fb16,0xb9981613,0xb99cc5c5,0xb9a3ac52,0xb9aa75d7,0xb99b16d4,0xb9902481,0xb97fc014,0xb965d7fd,0xb9484443,0xb91a775a,0xb8b5c6c5,0xb91595e9,0xb7525bc3,0x360011d2,0x37bdcf3f,0x38384aea,0x38339f22,0x383d2e5a, +0x383fb47b,0x384adc4f,0x384634d5,0x386b3abe,0x37d73759,0x36a97924,0xb82f004b,0xb88d397e,0xb9203674,0xb954cfd0,0xb95a49e1,0xb95a3062,0xb95d8a77,0xb9687d1b,0xb96e01ac,0xb974179f,0xb9840c41,0xb98c2d81,0xb991d871,0xb9985f64,0xb99c11a0,0xb9a201ee,0xb99867f5,0xb99217a1,0xb98cfe50, +0xb9851274,0xb97ca172,0xb9832de5,0xb8fc7d2f,0xb8c5448a,0xb9340cf1,0xb9085f26,0xb88baffd,0xb8dfe053,0xb8e8c97d,0xb8eca754,0xb8f6ddf2,0xb8fbff9e,0xb904dc0f,0xb905ff90,0xb8d1cb9f,0xb9162bbf,0xb97e6846,0xb92a7342,0xb99315a4,0xb9853fbf,0xb9abaac5,0xb96c4369,0xb95e744e,0xb954fa5a, +0xb953da93,0xb9733254,0xb97239c4,0xb9293ed0,0xb9755353,0xb986d207,0xb9a19233,0xb97fc930,0xb972fd93,0xb97fe29c,0xb97bc3ee,0xb9829fe5,0xb996a748,0xb98549dc,0xb9784d68,0xb94f3933,0xb99693d7,0xb993ff6a,0xb975fc06,0xb8cf1b7e,0xb8ed6dc5,0xb81ddc1c,0xb8613da2,0xb852a1c7,0xb81d5960, +0xb8293936,0xb80fdb20,0xb6a7ebec,0xb8eaebd5,0xb8e02cb5,0xb966cdc6,0xb9aa75a1,0xb99714da,0xb9a01a7f,0xb93e5ca8,0xb953adf4,0xb948fec2,0xb9909a41,0xb98ad605,0xb8ee5125,0xb999a67a,0xb9c12016,0xb9fd14ab,0xb99cd727,0xb986ce53,0xb9ac37c5,0xb9b47215,0xb9d5d215,0xba043d33,0xb9e5a2b3, +0xb9ad9c85,0xb98ce009,0xb92d6c02,0x37cf29e3,0x370304ec,0x38951844,0x37f03ef9,0x37d76292,0x3794ef4e,0x37b35284,0x37845647,0x37960ff7,0x371f2a83,0x37821948,0x37ecb261,0x388e6718,0x37b6919b,0xb6b42bfe,0xb86d23ec,0xb9ec7ba0,0xb8d65a51,0xb9262ce6,0xb89b87ff,0xb987f351,0xb9a335d2, +0x388ea1ab,0xb9a1c9b3,0xb9d72b2a,0xba311326,0xb9c1e61e,0xb98ca9b4,0xb9b34738,0xb9a8f830,0xb9d384bf,0xba17fb21,0xb9e5455e,0xb99dd415,0xb96fd570,0xb6bd28dd,0x3805eb6e,0xb7416f84,0xb7956477,0xb77309fb,0xb7000378,0xb7005a22,0xb6e0f212,0xb6e2819b,0xb6b81c4a,0xb69840b7,0xb69f48df, +0xb7696274,0xb783d48e,0xb7b92f69,0x388d78e9,0x38b3e24b,0xb9f4feac,0xb8f89ec6,0xb90977f0,0xb8aacf4a,0xb9ce07d9,0xb9b3361a,0x391cfa0e,0xb9d67d8d,0xba4495f5,0xba8c08c0,0xba098a73,0xb9a9a3d5,0xba0c1e9c,0xba2659d6,0xba667263,0xba9b61c7,0xba715f47,0xba1dcdab,0xb994ade2,0x37bb5aca, +0xb709ea24,0xb57aa081,0x3722e58e,0x36bcc271,0x368503e8,0x3656524c,0x364ee4b0,0x364869f6,0x362694b5,0x36034055,0x363115d6,0x36bb58a9,0x370afcbd,0x36a9ec1b,0xb80161af,0x382e7d0c,0xb85215b3,0xb970da1a,0xb92d99f8,0x39ae9340,0x397cde67,0x38b592af,0xba0e51a6,0x39d6ff89,0x3a2a533a, +0x398aa565,0x38a59762,0x376d4af5,0x399e0147,0x3a43f0f1,0x3a84d5e6,0x3a8f2575,0x3a532bbb,0x3a0522be,0x396bd1c7,0xb72e527d,0xb610be98,0x367d405a,0xb6bf9deb,0xb61a90af,0xb614e4b1,0xb5c4f0ab,0xb5d4d4a7,0xb5c37144,0xb5a95730,0xb581a995,0xb5dafe1b,0xb5fbda0d,0xb6e73fd8,0x3701306e, +0xb76d526c,0xb8bd5361,0x394ea55d,0x39e67fab,0x3a26be5a,0x3a3deede,0x39e40204,0x38c23ea2,0xb9ea739a,0xb93a3064,0x383c1f1b,0x3997e85e,0x3a3d9837,0x3a13a812,0xb9057cf0,0xba4869ea,0xbaa16fbe,0xbab37780,0xba959044,0xba4e6018,0xb9ba0f6b,0x386e15c4,0xb7724084,0x369cbb95,0xb49f1d5d, +0x3643ca7f,0x350da307,0x35a26eb5,0x355364bd,0x35752b31,0x355c7498,0x34fda867,0x35cb6127,0xb4998692,0x36f91d1c,0xb7751278,0x3813437b,0xb6f9a639,0x3986fd5c,0x391867f6,0xb993fd00,0xba85ba76,0xba981841,0xba39bc7b,0x38921037,0x39d78f4a,0x39c5be8d,0xb9155565,0xba659083,0xba6bc632, +0xb99c1ff0,0x3a025395,0x3a84773b,0x3a9345e9,0x3a67e33e,0x3a1b7587,0x39125131,0xb2f84156,0xb706ce83,0x36a52a3f,0xb666eb0b,0xb51de302,0xb5a3d590,0xb52ff655,0xb5704e5c,0xb533c205,0xb57ad7e6,0xb4af532d,0xb5d8842f,0x34f3b484,0xb6afe1d7,0x370395dd,0xb7390363,0x396dd3b3,0xba70ee0d, +0xba89b8ca,0xba355b42,0x3a0e4199,0x38a2e01d,0xb9a2ef0b,0xba0c2c18,0xba80e6c8,0xba0855f7,0x3a492442,0x3a600877,0x3a29bf46,0xb7fd36b7,0xb987c482,0xb9eaf452,0xba08821c,0xb9fa1d2b,0xb9c149f6,0xb99138f7,0x37cef6ab,0x3642d205,0xb684a1f9,0x36707320,0x35950903,0x35b73c42,0x35971cd1, +0x358a71f7,0x35b795eb,0x3528af18,0x3614239b,0xb59b708e,0x36e5df73,0xb7279a51,0x37ece6fb,0xb89cd111,0x38d1de7c,0xba3ca396,0x3a5f6f97,0x3aaf59f4,0x3ab7f64a,0x3a8d8da5,0x3a523a61,0x39edb736,0x383d4c80,0xb9a2147e,0xb9f1943c,0xba1e88e2,0xba0d7296,0xba01041f,0xb984cdc4,0xb8d7ef3e, +0x369a225b,0x392a3ffe,0x396f3ccf,0x39a2c493,0xb86ead92,0x3733cf84,0x34e73ccc,0xb697aad2,0xb624b365,0xb61f15b3,0xb60478c6,0xb6154928,0xb5ffc6ac,0xb63109dd,0xb59d19bc,0xb6916d39,0x35ab7a70,0xb73db2eb,0x376c6404,0xb7dbe1f6,0x38885131,0x3890b642,0xb9ca8903,0xba16a5c0,0xba1a53a8, +0xba1ecf2e,0xba162580,0xb9eecb3b,0xb9acb40b,0xb976209b,0xb95761d5,0xb96acc67,0xb96a66d1,0xb91efd5b,0xb7bee07f,0x38c75656,0x39449350,0x3993cc32,0x39975bd6,0x39c70cd7,0x3810adb6,0xb7e740f3,0x36dccdf8,0x36de93ba,0x36c81ea0,0x3693b3af,0x3692e3c2,0x368cf65b,0x369e464b,0x36861e5b, +0x36b86708,0x363e8348,0x3720c091,0xb5ad006a,0x37b1325d,0xb84b9419,0x384a9f9c,0x39c8848a,0x39969603,0x398dedb8,0x3932686f,0x389287ac,0xb7ad63dc,0xb9021963,0xb96405b4,0xb9a1ff6c,0xb9cdc9c6,0xb9c11990,0xb9b3525c,0xb9afd1de,0xb99ce645,0xb98db9be,0xb975f5b6,0xb97cbbf2,0xb96487b1, +0xb98d96af,0xb865d03b,0x3865c645,0xb79d2540,0xb76d25d1,0xb765bbe0,0xb7214b6b,0xb7257971,0xb721b2ea,0xb72ae512,0xb72a76a7,0xb725de8d,0xb74638b5,0xb723e7c1,0xb7b8df1c,0x3664ec0f,0xb6e4a63c,0xb8e1bb79,0xb93682d6,0xb94a2cf9,0xb96decad,0xb980cd71,0xb9839ab7,0xb98cd8b0,0xb996a6af, +0xb987b6af,0xb974e842,0xb969ae58,0xb965ceec,0xb9738008,0xb9834633,0xb9779d33,0xb96bab82,0xb9542867,0xb94aa17d,0xb922ffd6,0xb9294b5a,0xb937c72f,0xb6ad3cf2,0x37c06f9b,0x386cd329,0x37f2e614,0x38011e1c,0x37ceeba5,0x37ed5391,0x37e51687,0x37f29fe3,0x37e11069,0x3808d6df,0x37ef5dbf, +0x38627238,0x3794c90f,0x37b53a54,0xb98707e1,0xb92c3e39,0xb93a8d3e,0xb9417b37,0xb946be4c,0xb9540d69,0xb95b3283,0xb9666c9b,0xb96a8b0a,0xb973a028,0xb9771f38,0xb97ded36,0xb97d6e75,0xb97e333d,0xb9735504,0xb96d8eb4,0xb9689a09,0xb960b8f4,0xb95fc281,0xb941c445,0xb98305bd,0xb98a928a, +0xb958ed7d,0xb8aad938,0xb8d63ad7,0xb87f2f2d,0xb88d4ebf,0xb88ef885,0xb891801e,0xb89373d0,0xb8965530,0xb8902d33,0xb8d02fa3,0xb897bdc6,0xb9590c47,0xb984db70,0xb9871e9c,0xb87b2876,0xb889ff0d,0xb8520ef8,0xb863767f,0xb82be93b,0xb82ed0a4,0xb8276530,0xb814d819,0xb6fa0877,0xb82ee2d4, +0xb8670634,0xb8ab96f4,0xb866b969,0xb84d45f0,0xb8543742,0xb848485a,0xb85b9b3d,0xb898157b,0xb871f8b9,0xb87429e1,0xb80dc51e,0xb8169869,0xb8a4bcfa,0xb94022c7,0x3823bcfa,0x378f14bd,0x378bb028,0x37919b48,0x37907276,0x37905367,0x37906b35,0x3791aed3,0x378b701a,0x3790e73d,0x381bc44a, +0xb931cac8,0xb8ca1ef2,0xb8db6038,0xb89fc182,0xb8332083,0xb82105c3,0xb8103367,0xb7f9a916,0xb71fd5b4,0x38438795,0xb8184082,0xb8a947ee,0xb9138a8d,0xb88ffacd,0xb84dcfd6,0xb8910f84,0xb891940c,0xb8c64741,0xb918a176,0xb8fa2ada,0xb8c1809a,0xb818d0aa,0xb89892ed,0x3821fd9a,0x3850671e, +0x36894897,0xb75ca7b2,0xb6811606,0xb6e86a96,0xb6c7f31f,0xb6d52ef6,0xb6c93ff9,0xb6e4a202,0xb68b6d4b,0xb74e9de3,0x361aecf7,0x384ef7e9,0x382fe8a0,0x385318f9,0xb91d84ff,0xb7dcd040,0xb7726802,0x3785b734,0x37586dd9,0x37c74430,0x39342f4e,0x36a7d6fb,0xb87d593f,0xb94e9556,0xb8a5253b, +0xb801160f,0xb8178c24,0xb7945267,0xb85d05a0,0xb91edb96,0xb8cd8875,0xb88a475c,0xb7a6bab8,0x378ad294,0xb6a2b7d0,0xb792672d,0xb64ffce9,0x368b69e8,0x360bdadf,0x3603a8ff,0x361ce0a1,0x360b99eb,0x3616b406,0x36126f14,0x35e16ae0,0x369f248d,0xb679dfa5,0xb783a6f6,0xb7200257,0x3823c053, +0xb91f15f4,0xb888f467,0xb783795e,0xb62398da,0xb7a671ff,0x3885e513,0x39873e4b,0x36c9b934,0xb93b82ba,0xb9b9eff8,0xb90ff7b0,0xb8101389,0xb8a7fb62,0xb8bd821d,0xb9539703,0xb9c37f94,0xb99aedb6,0xb9530903,0xb848c4aa,0xb6de130d,0x36ec710c,0x36479115,0x3686ddd9,0xb632afc2,0xb525d252, +0xb58a98fb,0xb57de272,0xb57c3323,0xb5908ebf,0xb535b2e5,0xb5c52406,0xb52538a0,0xb57cf399,0x376c95f7,0xb794a717,0xb7d3aa07,0x38d04830,0x369254bd,0x37fc7ee7,0x39714f3c,0x398d9c9e,0x397a6731,0xb8a02047,0x39bb2463,0x39e2d613,0x395da19a,0x38ad23af,0x36ce3097,0x38c42a2c,0x39a3356c, +0x39f9d8b2,0x3a1b7efa,0x3a03349c,0x39db7830,0x396ada34,0xb875384b,0x379a2f97,0xb72641ab,0x35f0c7ed,0xb51afa81,0x359f937e,0x340afca0,0x352e2b5a,0x34c77147,0x3527f703,0x3451decf,0x358a0436,0xb46fb641,0x358a5151,0xb7005d76,0x373748a8,0xb887c1dd,0x3912e0a7,0x39621dab,0x39abdac6, +0x39c4958b,0x39b0ecb7,0x393c68ef,0xb93cdc67,0xb871add9,0x37fd085d,0x3919b7d1,0x39c7ee53,0x39af1e09,0x380a1ab0,0xb981d390,0xb9e9a716,0xb9fb94f4,0xb9e44995,0xb9ae707a,0xb91279e8,0x37b12dd6,0xb53e82d4,0x33cba1bf,0x35d66821,0xb56b3765,0xb3f1dd5d,0xb4d83ad8,0xb4553a6e,0xb4dc0d9b, +0xb3cc9658,0xb53b2ef4,0x35269c74,0xb631ce8f,0x36c50e74,0xb734131a,0x37e9ae8c,0xb6c61b75,0x38a41ae3,0x389a0153,0xb8504749,0xb93f451f,0xb9846938,0xb73f4918,0x39c9914f,0x39c5d877,0x3993eeb1,0x3865fd16,0xb9927f8e,0xb990db2b,0x370603d8,0x39adfeb9,0x3a0a5536,0x3a113741,0x39e92adc, +0x39a5627d,0x38fb4c2a,0xb7a31d56,0x36070fda,0xb585288d,0xb50df2b1,0x349e53ae,0x34c8d31f,0x346b7c1b,0x349d6a37,0x348ec67c,0x34927d6a,0x3491480b,0x348e8d56,0x3508f8db,0xb58139d4,0x348e4399,0xb5ddc5c6,0x38ad8029,0xb9a23415,0xb9ca33bf,0xb88162de,0x3a40f981,0x39e191aa,0x390c60b7, +0xb9179838,0xb9da3723,0xb96cf313,0x39d3440b,0x3a0dbb7a,0x39f98ef5,0x38ebc082,0x35057bd3,0xb8ba52ea,0xb8fad28e,0xb905bfd2,0xb8f5a94d,0xb8a00728,0x369e8fb7,0x367773be,0xb5b30c0b,0x3602177e,0xb5a1b7fe,0xb41069c0,0xb50e065f,0xb4bee2c8,0xb4cfda5e,0xb50dbcd0,0xb38736b5,0xb5a4cd19, +0x35afcbe1,0xb6808f20,0x37435d1e,0xb7e3253a,0xb76f12bc,0x37e15819,0x3a550a2f,0x3a85f4b0,0x3a8f4938,0x3a72441a,0x3a47a445,0x3a09525d,0x3983dba8,0x3813475a,0xb817c411,0xb92aaba8,0xb92f8397,0xb922d9f7,0xb8cbfaf5,0xb8727a20,0xb75a1d20,0x386cb2e1,0x38ea69f4,0x39173474,0xb82d1a2b, +0x3780fb77,0xb71d7942,0x3614bf76,0xb490186f,0x35c12f61,0x34ebe1be,0x35755361,0x353c1430,0x355cfd03,0x35347fdb,0x357ac4fc,0x355016e6,0x331ffc13,0xb68d1eb4,0x369e0ab6,0xb836a837,0x389388fa,0xb90d6189,0xb98bc5d5,0xb99169b2,0xb99a12af,0xb98722e7,0xb919564e,0xb91356c1,0xb8f398f1, +0xb8de014a,0xb8a27d63,0xb843fc43,0x368fc6ff,0x38903475,0x39009eef,0x391d8911,0x393bec9d,0x392e3dbd,0x393281a6,0xb825a35b,0x373aa97a,0x3631de52,0x36371361,0xb65772e0,0xb5a24b2b,0xb5e83fab,0xb5cc8e70,0xb5e2f53b,0xb5c695c1,0xb5f9b319,0xb56c761e,0xb6869974,0x369f8208,0xb659399d, +0x37b01ec3,0xb7f7b496,0x398bccf2,0x3958ce60,0x39584b5b,0x3926ff8c,0x38f48dea,0x3894f85e,0x37cf7823,0xb800ec1c,0xb8a62bd3,0xb90c017c,0xb9119e42,0xb9186b00,0xb9252ded,0xb911148d,0xb902127c,0xb8ddf89c,0xb8d1648b,0xb8ae6747,0xb8c39c4b,0x37f9fdc0,0xb6c0fbf1,0xb7966533,0x3515fe5b, +0x36a43b27,0x367cfb39,0x36631590,0x3682028b,0x3669a084,0x3682ec56,0x365e4a53,0x368411a4,0x36979852,0x35a23abb,0xb7935650,0x364d3806,0xb8357e94,0xb7f87295,0xb890e5ef,0xb88cb862,0xb8a177e6,0xb899efc4,0xb8a2e12e,0xb8a79468,0xb8b4c501,0xb8c264d6,0xb8d5e512,0xb8ee2e41,0xb9073ed7, +0xb9192944,0xb9125f49,0xb90f01fd,0xb9064cf8,0xb9053583,0xb8eb5f25,0xb90417ee,0xb8a5d0c3,0x38574454,0x382d8330,0xb61764ee,0xb789c808,0xb70ce73c,0xb73a8602,0xb72bae08,0xb7323579,0xb72be6c5,0xb739b320,0xb70f9fdc,0xb785fcd6,0xb64526b6,0x3822e929,0x3822490f,0xb8add3e9,0xb86ee7d0, +0xb87a13c8,0xb87bff27,0xb8835a0d,0xb88bcc5e,0xb8910bb6,0xb891cf15,0xb8a7fe16,0xb8ba40c0,0xb8c99143,0xb8db780b,0xb8e782ec,0xb8f810f7,0xb8ebd74c,0xb8e70998,0xb8e26f2a,0xb8da7c78,0xb8d9ecc7,0xb8bb0c89,0xb8f58fd7,0xb8e3b27e,0xb91a32be,0x384aca54,0x37f2b6e4,0x37ef5aef,0x37f4dd47, +0x37f3b6bd,0x37f3aa22,0x37f3b2e3,0x37f4d916,0x37ef85b1,0x37f3031c,0x38458b01,0xb90eed11,0xb8bfe5eb,0xb8d3ec31, +}; + +const uint32_t defaultHRIR_rom_AlphaR48[470 * 128] = { +0x3e094595,0x3e0070b5,0x3e249d6a,0x3cdebe05,0xbcb8b8ac,0xbd743498,0x3d767ab7,0xbc7e793e,0xbd7b74ec,0xbd83ebe3,0xbd77e4f6,0xbd3b83f5,0xbd7150b2,0xbd7e0636,0xbd7119ac,0xbc7c942a,0x3d352f28,0xbd848755,0xbc870462,0x3caef063,0x3e15c18c,0x3dee7ab7,0x3dfce600,0x3e00876d,0x3e01163c, +0x3e024a33,0x3e035f7f,0x3e04b5f7,0x3e06feee,0x3e09c88a,0x3e0d20e6,0x3e10371e,0x3e151794,0x3e12d853,0x3e1028ae,0x3e0987f9,0x3e0931f2,0x3e20e8e2,0x3e0b90d0,0xbd02dc11,0x3dd27b26,0x3d122337,0x3d2c1d55,0x3d888631,0x3d6ef13d,0x3db299a0,0x3d78d706,0x3d017832,0x3d617605,0x3d82a0c4, +0x3d694f61,0x3d00648f,0x3d4abe94,0x3d45c45e,0x3d7d8112,0xbc9cc1ae,0x3dddca9b,0x3e051b61,0x3e012b5e,0x3e0b9909,0x3e0c1d7a,0x3e106cf1,0x3e133fa9,0x3e162ff7,0x3e1bd401,0x3e247577,0x3e2f6688,0x3e3a7047,0x3e463a8e,0x3e44da00,0x3e3c22ab,0x3e29207f,0x3e200d41,0x3e3a14f6,0x3e02f236, +0x3d13cc60,0x3d7cd57f,0x3c867a71,0x3ce6b061,0x3ccc0823,0x3cbd7e35,0x3b645ab3,0x3d2cb2a4,0xbc17826b,0x3d4c34fa,0x3af31597,0x3cfb2a34,0x3b90b90a,0x3ce80da7,0x3cec41dd,0x3cec2f91,0x3c98453a,0x3d957269,0x3e02685e,0x3df2c132,0x3e0f08cb,0x3e0fd707,0x3e17edad,0x3e1dca8c,0x3e249ea3, +0x3e304162,0x3e40f8ed,0x3e528311,0x3e681e31,0x3e7eb4b4,0x3e79b8e8,0x3e68f514,0x3e44e649,0x3e2fdee8,0x3e4c92e2,0x3dd12cbd,0x3c86d9d0,0x3d678820,0x3cfcc451,0x3ca616e5,0x3cccdb61,0x3c934c02,0x3c6d584e,0x3bdbbe3f,0x3c90630e,0x3b541073,0x3aef66f7,0x3c3bcbe4,0x3bf143c2,0x3c8aacb5, +0xbbf3e38b,0x3cdb4d74,0xba818a14,0x3d66b380,0x3de1730f,0x3de4c8e1,0x3e0a9799,0x3e0bfcc5,0x3e16e14b,0x3e1f99f3,0x3e2663f3,0x3e375f5d,0x3e51af28,0x3e7091a0,0x3e8aeff4,0x3e9f2451,0x3e9dc5e0,0x3e8eed58,0x3e64d701,0x3e3bd239,0x3e8d5739,0x3e1e412c,0x3d246c2b,0x3d493d16,0x3cb16f14, +0x3c1cee42,0x3cdedc6c,0x3c3f5bba,0x3c540526,0x3c21cecf,0x3c421806,0x3c2fbff5,0x3b97d6ed,0xbac12178,0x3b9ec1d7,0x3c838b2d,0x3bb94c23,0x3cfc0a96,0x3bf25a88,0x3d8556c4,0x3e0d36fd,0x3e0ea62d,0x3e3e16e5,0x3e4cdf7c,0x3e61c2aa,0x3e6c10f7,0x3e859436,0x3e8f8477,0x3e903571,0x3ea9a0bc, +0x3eafeba1,0x3eab4a09,0x3ea5a7e4,0x3e9b53b7,0x3e91e606,0x3e80d6c0,0x3e9a2bd0,0x3e03191e,0x3c6096cd,0x3d8653ae,0x3d811170,0x3d015304,0x3d330778,0x3c669eeb,0x3c8108f0,0xb82fc02c,0x3c0dafcf,0x3bf8a2a4,0x3bd815f4,0x3c5d5358,0x3c86ff8f,0x3cacb82f,0x3bf13f65,0x3d09fb60,0x3bc07b73, +0x3d9ce3ac,0x3e1e7153,0x3e22e413,0x3e595906,0x3e66b5b3,0x3e7fc06a,0x3e89f455,0x3e88af01,0x3e8a8d72,0x3e8e2e5d,0x3e9fad4b,0x3eaa8185,0x3eaf5903,0x3eb40538,0x3eaf29f3,0x3ea9b428,0x3e91ada4,0x3ec8e1f3,0x3e33d418,0xbc3e53cc,0x3d9e654c,0xbae50000,0x3d649c84,0xbc14061a,0x3cc2159e, +0x3b9f41ab,0x3cc12d49,0x3c4a53a1,0x3bdc38de,0x3c4e078a,0x3c6133de,0x3c8feee4,0x3d101c44,0x3c7e8306,0x3d35a757,0x3cbcbbcc,0x3d92eddc,0x3e24939f,0x3e21dd97,0x3e577100,0x3e8107c0,0x3e9b39f6,0x3eb32895,0x3ebd665a,0x3ebd0f21,0x3eb12a54,0x3e9edc5e,0x3ea1033f,0x3eb3442b,0x3ebfc82a, +0x3ecb4568,0x3ee537e1,0x3ec6aef4,0x3edd6967,0x3e53e71f,0x3cf6f3da,0x3dfa4e3e,0x3c22ef66,0x3d7a11de,0x3cdd1847,0x3c90a6a4,0x3b989102,0x3ca35b3d,0x3cdb269c,0x3c8196c3,0x3c1a9dd8,0x3b2084a3,0x3ca84d9e,0x3c86e7ad,0x3c920006,0x3d535c60,0xbbb3d49c,0x3dab615a,0x3e18ddc9,0x3e1666c9, +0x3e3f3dfa,0x3e624a2a,0x3e830a64,0x3e8f8696,0x3e9e3399,0x3ea5c6f9,0x3ea7ce1f,0x3eae3532,0x3eaebb2b,0x3eaceb1f,0x3eaf980d,0x3eb16b96,0x3ec2f11d,0x3ec0d2ac,0x3ec0fa35,0x3e8136ab,0x3ce1613a,0x3d6be9d8,0x3d8ceb29,0x3c76d985,0x3d5b75bd,0x3d43c2cf,0x3c231b88,0x3c970205,0x3b82f96b, +0x3c7718b5,0x3cac9266,0x3c910634,0x3c9f26bf,0x3c695c43,0x3d0e8bbc,0x3d2d1d54,0xbbb02f4c,0x3dc5df37,0x3e1adb91,0x3e05d927,0x3e14ea98,0x3e28abe1,0x3e4facc0,0x3e7fd6b7,0x3e8e7a66,0x3e9bf12c,0x3ea7f980,0x3e9adcde,0x3e94ced1,0x3e9ce3c1,0x3e968a79,0x3e9b8af3,0x3eaf4b48,0x3eaeb9c3, +0x3e871eb8,0x3e432124,0x3c597938,0x3d549215,0x3cb6433f,0x3c66ad21,0x3d16c0d7,0x3cb1ff3c,0x3d0afe6d,0x3cd86cad,0x3d3f00ed,0x3c17188f,0x3c450b5b,0x3cad5ae3,0x3d03a62c,0x3d087ed8,0x3d48ae0f,0x3d4740e8,0x3ccd0da2,0x3dba995d,0x3e2148c7,0x3e12056e,0x3e1e73f3,0x3e2fe45f,0x3e420cef, +0x3e4b5ca8,0x3e52b60f,0x3e51f68a,0x3e503a06,0x3e5a3a26,0x3e6d12ac,0x3e7d1865,0x3e786b0a,0x3e71e50f,0x3e6e6fef,0x3e6916e0,0x3e4cdaf7,0x3e02191e,0x3d45534a,0x3db7fee8,0x3d0ff223,0x3d311970,0x3cfcd265,0x3ccb28b2,0xbb08c5d4,0x3d34d285,0xbc8d227a,0x3d80b58c,0xbb0d931d,0x3d09f2b3, +0x38962bc6,0x3d07cc2a,0x3cab5565,0x3d181f55,0x3ca9595c,0x3dbb20d2,0x3e1185bb,0x3de54f1e,0x3dff5960,0x3e058238,0x3e12686e,0x3e19443b,0x3e32bff4,0x3e478537,0x3e5bf84a,0x3e61b9f1,0x3e64c828,0x3e69ae3c,0x3e62a692,0x3e581165,0x3e54cf24,0x3e3814bd,0x3e210374,0x3e137ec2,0xbd314e2a, +0x3dd21757,0x3d0706c3,0x3d2f2b9c,0x3d9cdee6,0x3d8ac808,0x3ddbb83c,0x3da2cdc5,0x3d262ce3,0x3d8fbc44,0x3daedb8a,0x3d9cc2a3,0x3d2e51ef,0x3d869d54,0x3d89836e,0x3d997a33,0xbcb690f6,0x3dead195,0x3e02007f,0x3df4baf6,0x3e001c1e,0x3dfb500b,0x3dfefd2a,0x3dfca0ef,0x3e0dcdf9,0x3e17299f, +0x3e21a6b4,0x3e297a6c,0x3e3288d4,0x3e3c480c,0x3e344b56,0x3e2c49e5,0x3e29034f,0x3e1d34ed,0x3e1710fb,0x3e3eaef4,0x3cfdd759,0xbccb286b,0xbd8efddf,0x3d96688d,0xbca67db0,0xbd9a5c5a,0xbda5e43b,0xbda00bdd,0xbd70fda5,0xbd9b3bb0,0xbda63b49,0xbd9d8384,0xbcaeb0f1,0x3d5745f5,0xbdac5d81, +0xbcc1857e,0x3cc1c426,0x3e349546,0x3e0ebba6,0x3e14ab28,0x3e14eb73,0x3e14beca,0x3e150f7c,0x3e134260,0x3e1725db,0x3e19d2ee,0x3e1cba26,0x3e20f6f0,0x3e248a52,0x3e2a3649,0x3e263bfd,0x3e246166,0x3e220a03,0x3e20aa6b,0x3e2ff142,0x3ebd3e60,0x3eb1330d,0x3ec8464f,0x3e868ae6,0x3e1f9162, +0xb9c67cc8,0x3e9a6b90,0x3e2858e1,0x3c5cc5da,0x3bc30407,0x3bb42eec,0x3c9cc248,0xbb160584,0xbbc2ca14,0xbbcfb1b0,0x3e215c6b,0x3e8b51af,0xbcade073,0x3e1c3a7c,0x3e760d09,0x3eb85558,0x3ea41f7e,0x3eaca088,0x3eae9b71,0x3eb016af,0x3eb1e22b,0x3eb3c2b3,0x3eb61c88,0x3eb92710,0x3ebc8f09, +0x3ec0b6b4,0x3ec4b19c,0x3ecb2247,0x3ec8455a,0x3ec53914,0x3ebd39b0,0x3ebbd0b2,0x3ed4592d,0x3ed0b71f,0x3e046116,0x3ea8b74a,0x3e65ccfe,0x3e5be330,0x3e82d61a,0x3e6a5747,0x3e8b0b0a,0x3e810a4b,0x3e4ff18d,0x3e7a0485,0x3e744e71,0x3e6c4883,0x3e35e945,0x3e533946,0x3e6cf826,0x3e70d49a, +0x3ddfe003,0x3ea5f80d,0x3eacc212,0x3eb2a993,0x3ebbb64f,0x3ebf1ceb,0x3ec4a393,0x3eca25b8,0x3ecfe5eb,0x3ed82a7d,0x3ee2b844,0x3eef968b,0x3efda383,0x3f073132,0x3f066b70,0x3f01a647,0x3eeaddaa,0x3ee0bea1,0x3eeb3984,0x3ec88f74,0x3e8363a9,0x3e851ebc,0x3e2644bb,0x3e2ab4eb,0x3e19c930, +0x3e142ac5,0x3dd026a7,0x3e193276,0x3da449ac,0x3e2c11b3,0x3d9d0b2a,0x3e103172,0x3dbb30c5,0x3e0fc466,0x3e1aeb39,0x3e1719f9,0x3e24a834,0x3e76471e,0x3ea2b2ba,0x3ea89ebd,0x3ebe2fed,0x3ec46490,0x3ecf8357,0x3eda344c,0x3ee644a1,0x3ef5cf58,0x3f051831,0x3f1008c1,0x3f1dd872,0x3f2d34b6, +0x3f2a2b02,0x3f2123de,0x3f09131d,0x3ef91e2e,0x3efec4ce,0x3eb997e6,0x3e506030,0x3e65fe3d,0x3e1da56f,0x3df627eb,0x3de190f4,0x3d942eda,0x3d74b5f0,0x3d1addf9,0x3d5d58fe,0x3c8aa7e0,0x3cb97c36,0x3d1bc907,0x3d120c6f,0x3d86eebf,0x3ce400da,0x3dc35506,0x3d955567,0x3e367c8d,0x3e89e963, +0x3e987600,0x3eb41677,0x3ebbeadb,0x3ecba170,0x3edad066,0x3ee9752d,0x3f0100b9,0x3f105b07,0x3f22f346,0x3f3b06aa,0x3f575d60,0x3f56ffd9,0x3f46c53f,0x3f20099d,0x3f06fea1,0x3f29c90e,0x3ef304f4,0x3ea4819c,0x3e7b9b40,0x3e1c4056,0x3def2ed2,0x3e096bd0,0x3db17389,0x3d987273,0x3d63dc2f, +0x3d5e4662,0x3d294f9b,0x3cf38c11,0x3c9058a5,0x3d29297b,0x3d9323b3,0x3d882d09,0x3dfc8a89,0x3df94f43,0x3e6b464d,0x3ec01913,0x3ed6eb03,0x3f060659,0x3f11f518,0x3f201a63,0x3f2b556c,0x3f3a937b,0x3f4673c3,0x3f492dd4,0x3f6e74a7,0x3f781c98,0x3f720f4e,0x3f6618d9,0x3f580317,0x3f4af428, +0x3f335b37,0x3f4967d1,0x3eed290e,0x3e8b0188,0x3e97b871,0x3e903a5f,0x3e3625e7,0x3e225e96,0x3db3ac73,0x3d95647f,0x3d1cecc3,0x3d4188ae,0x3d3b6e3c,0x3d2ffe21,0x3d811b82,0x3d98eafe,0x3dbcafd8,0x3dd3823a,0x3e216438,0x3e0a0d14,0x3e8a7955,0x3ed4c715,0x3ee8cec7,0x3f117543,0x3f1fb39e, +0x3f33d295,0x3f474aef,0x3f4e75d8,0x3f5677ff,0x3f5bb981,0x3f73e1e8,0x3f805d3d,0x3f80c405,0x3f813f54,0x3f79b8c5,0x3f6ed14d,0x3f531cbe,0x3f792a1e,0x3f1ea472,0x3e80fcda,0x3e9ff2eb,0x3e30500d,0x3e6d6999,0x3d97e532,0x3de73b2f,0x3d6cc3d1,0x3dbf99d5,0x3da81c02,0x3d5bee64,0x3d8183c4, +0x3d9a8ec9,0x3db59271,0x3e16f79a,0x3dff3225,0x3e344037,0x3e35113b,0x3e82da60,0x3ed074ca,0x3ee3748c,0x3f0ffe5e,0x3f24b379,0x3f404483,0x3f5d06f9,0x3f701eaf,0x3f7b3cf8,0x3f7bebcb,0x3f6c3529,0x3f68c9f3,0x3f72b167,0x3f75e995,0x3f7f2739,0x3f881629,0x3f7f9f65,0x3f7502bf,0x3f2e5bf6, +0x3ebef280,0x3ecc7e43,0x3e25bd13,0x3e725cd2,0x3e072203,0x3ddcd1fb,0x3d7dee80,0x3dc183fd,0x3e1753d5,0x3db31688,0x3d7074b2,0x3d8629c3,0x3de6b3bc,0x3ddf1f15,0x3e159667,0x3e6103e3,0x3e0cadc4,0x3e905ce0,0x3ec2b5f8,0x3ecf71e4,0x3efeb354,0x3f1a911b,0x3f325789,0x3f43d0cd,0x3f58a6d4, +0x3f64c835,0x3f698203,0x3f77f494,0x3f7b713a,0x3f7aeefc,0x3f6d7c8e,0x3f6093d0,0x3f5ae230,0x3f6ac3a3,0x3f61f977,0x3f3bda06,0x3ec431fb,0x3ea93f2e,0x3e981e66,0x3e27285d,0x3e4c8cf4,0x3e4f61a9,0x3dd23ac1,0x3deecba9,0x3da3ee9f,0x3db80b95,0x3dc93b66,0x3dd083a9,0x3df1eebb,0x3df0470c, +0x3e310972,0x3e486fe6,0x3e0dce87,0x3eb53116,0x3edc2e46,0x3ed2ef30,0x3ed59157,0x3ef40688,0x3f10c753,0x3f2f2618,0x3f427a49,0x3f552f5d,0x3f64fb6b,0x3f5dea65,0x3f5ae325,0x3f662f08,0x3f59f7d8,0x3f5ba528,0x3f61a727,0x3f666c0a,0x3f3630cb,0x3f1cff6b,0x3e9cd9a0,0x3ea2635b,0x3e4b5d64, +0x3e3dc4dc,0x3e490217,0x3e1434f7,0x3e2305e3,0x3e0aa062,0x3e39c441,0x3dadf83a,0x3dbfccf3,0x3df15b45,0x3e1f2057,0x3e41f430,0x3e7ac723,0x3e76aea5,0x3e624a8b,0x3eb1cc0e,0x3eea4a56,0x3ee12ee8,0x3ee04d39,0x3ef6eb47,0x3f07c374,0x3f12d55e,0x3f1d8732,0x3f2527fa,0x3f2bd475,0x3f33b5ae, +0x3f3cfd65,0x3f4250fd,0x3f3f6dc6,0x3f3adc9e,0x3f30ff68,0x3f315be0,0x3f16f3c4,0x3ef2859f,0x3ea5b2f3,0x3ebc3b1c,0x3e7bcfaa,0x3e6d5f2f,0x3e3edecb,0x3e1f6b50,0x3dd153e2,0x3e4146c2,0x3daf0d73,0x3e77e632,0x3dac2c1c,0x3e3b4b7b,0x3dd0373f,0x3e4264d3,0x3e34d971,0x3e5fdcd8,0x3e5cfcc1, +0x3eaf3236,0x3eda79db,0x3ec5a313,0x3ed2bfb9,0x3edf9afb,0x3eeed6c6,0x3ef89318,0x3f0bdea2,0x3f187ca8,0x3f2508d1,0x3f2a4165,0x3f2e61e6,0x3f336f78,0x3f2e45c0,0x3f286058,0x3f237e2f,0x3f155f03,0x3efbdf75,0x3efe031b,0x3dd39d38,0x3ecb34fb,0x3e866f17,0x3e8642af,0x3eab0011,0x3e9a2bc8, +0x3ec368cd,0x3eb7e7fe,0x3e8d5138,0x3eb23f82,0x3eb434ae,0x3eace303,0x3e835ff0,0x3e9854ee,0x3ea72d07,0x3ea146b6,0x3de2d6a6,0x3ed0699e,0x3ed0ff8e,0x3ed19c2c,0x3ed6c420,0x3ed81791,0x3edcb3d9,0x3edefa69,0x3eefd589,0x3efacaf1,0x3f03622c,0x3f07ced7,0x3f0c8d61,0x3f1265b3,0x3f0ccc0d, +0x3f085b1f,0x3f055367,0x3f0049ba,0x3eed5668,0x3f0851b4,0x3ea976fb,0x3e40d30a,0xbca3b156,0x3ecfede4,0x3e4bfaf6,0xbc2419a0,0xbcbba915,0xbcce003a,0x3b5fe713,0xbd01990f,0xbd1c8d29,0xbd0f1c67,0x3e474a11,0x3eb9e655,0xbd76c714,0x3e3c9d20,0x3e9d8d6f,0x3f012267,0x3ee0fb7e,0x3eea0982, +0x3eea057f,0x3eead1fb,0x3eeb40a3,0x3eea05ff,0x3eee2217,0x3ef148a0,0x3ef49e24,0x3ef98a48,0x3efdbe45,0x3f022b24,0x3effbf26,0x3efda656,0x3efa30e5,0x3ef9ac5b,0x3f082bd2,0x3e55bff9,0x3e4bb958,0x3e12cedf,0x3eadee33,0x3ecd9629,0x3ec89e80,0x3e8d4aa3,0x3ec02004,0x3ec94ffa,0x3eca2660, +0x3ec58973,0x3eb87a9f,0x3ec024b0,0x3ec1f2e5,0x3ebdbb44,0x3ebc699f,0x3e93c889,0x3ec1eaf2,0x3ebfe052,0x3ea7797e,0x3e134842,0x3e3ecd9f,0x3e3b8e11,0x3e3d14b5,0x3e404b63,0x3e4380bb,0x3e474d06,0x3e4c64b7,0x3e4f0f96,0x3e50cde8,0x3e510799,0x3e51f19a,0x3e536056,0x3e5368da,0x3e532f70, +0x3e53c25f,0x3e49f47f,0x3e5aae82,0x3e74d658,0x3edf1eb6,0x3e6a174c,0x3e99671f,0x3e8e4651,0x3e6f042c,0x3e6a0b11,0x3e37e5f8,0x3e5c80f0,0x3e835748,0x3e64fca5,0x3e4fa609,0x3e5c6f75,0x3e7a1984,0x3e6e1b5d,0x3e7fad3c,0x3e6b7278,0x3eafdb56,0x3e4da08c,0x3e30d4a6,0x3e45a018,0x3e446d7d, +0x3e4e0013,0x3e563acf,0x3e6361ec,0x3e7332e6,0x3e7d3a38,0x3e8088a0,0x3e7fc39c,0x3e812def,0x3e84492f,0x3e85aea3,0x3e854822,0x3e8388e3,0x3e7943d6,0x3e4e7388,0x3e839d15,0x3ead296c,0x3e8413af,0x3e896cf2,0x3e6c26b3,0x3e58ea65,0x3e43400c,0x3e487f82,0x3e09fb3a,0x3e4e41f1,0x3e00bd73, +0x3e33086e,0x3e1cb208,0x3e3be37e,0x3e306351,0x3e488967,0x3e4db166,0x3e7909be,0x3e495cf1,0x3e160953,0x3e3e8754,0x3e3fa509,0x3e5323f1,0x3e6554c1,0x3e7cc060,0x3e8cc723,0x3e945688,0x3e98bba9,0x3e9a698e,0x3e9be62a,0x3e9e37ac,0x3ea05146,0x3ea10d78,0x3e9c2451,0x3e8d22a9,0x3e56e8c9, +0x3ea1bd29,0x3eadd2a3,0x3e58f6dc,0x3e3d3e90,0x3e2e873f,0x3e057f5e,0x3dbd068d,0x3d84d6ed,0x3d629cf8,0x3d1eb30d,0x3d286cc7,0x3d305c88,0x3d24d20e,0x3d5fe81a,0x3d97a228,0x3de284cc,0x3dde22a3,0x3e2d4336,0x3e180b96,0x3df262a3,0x3e1885ee,0x3e2351bc,0x3e3e9d50,0x3e58e0b0,0x3e7c67b0, +0x3e96359c,0x3ea52caf,0x3ea9c547,0x3ea96f08,0x3ead6e06,0x3eb5d2f9,0x3ebdb6b6,0x3ebf2951,0x3eb3237f,0x3e9f6f66,0x3e38a5c9,0x3e86bc14,0x3ed34d72,0x3e961725,0x3e756b50,0x3e52132a,0x3e123158,0x3dfd135d,0x3dbf4376,0x3d91d552,0x3d9456e7,0x3d5f3afc,0x3d616b78,0x3d689ef8,0x3d9fa6f7, +0x3dbfde1e,0x3e01c3c9,0x3e19164b,0x3e6c3a4e,0x3e65e02f,0x3e6811cd,0x3e9a36a3,0x3ea124ca,0x3eb0cdc3,0x3ec3c93f,0x3ee58f13,0x3edf658c,0x3ee88962,0x3efc021b,0x3f028375,0x3f00e460,0x3eee3e06,0x3edcecbf,0x3ed2734d,0x3ed11cff,0x3eb21605,0x3e856416,0x3edc6f93,0x3f07827a,0x3eb8dc7b, +0x3e9957a6,0x3e7b5050,0x3e2e43bb,0x3e1de746,0x3dd88b7d,0x3db9a1a9,0x3da6d728,0x3d8c12a1,0x3d82034d,0x3d8da5d1,0x3da637df,0x3ddea6d2,0x3e3c34f5,0x3e538449,0x3e943ff8,0x3e86b400,0x3e6baae5,0x3e88bf77,0x3e7a83f6,0x3e950cb1,0x3eaeaaa2,0x3ed2df13,0x3f032dec,0x3f157724,0x3f1d4e48, +0x3f231c53,0x3f2156be,0x3f0ffdfa,0x3f085841,0x3efa9013,0x3ee18f5c,0x3ecb7830,0x3e434e20,0x3ef7df06,0x3f1d657d,0x3eb469c8,0x3ed3b503,0x3e8541d6,0x3e7b3992,0x3e1fb57c,0x3dfd2c32,0x3dedd014,0x3e2345c0,0x3de80068,0x3de89f6d,0x3e048968,0x3e09d0d1,0x3e2263d1,0x3e6a984d,0x3e550521, +0x3e8bfd73,0x3e772aa6,0x3e20ad2c,0x3e5c1e98,0x3e5571d1,0x3e32401e,0x3e1e3840,0x3e244536,0x3e68950b,0x3eb07d7b,0x3f0133a8,0x3f19fcc3,0x3f127607,0x3eebc91a,0x3ec79cec,0x3ea6fff6,0x3e3b07bf,0x3e866ddd,0x3d2ae3b7,0x3ed36c93,0x3f1a58b7,0x3e989da9,0x3eb0dfa6,0x3e60d585,0x3e433ced, +0x3e1dba0d,0x3e08a778,0x3e119d7b,0x3e8439ea,0x3e089cbc,0x3dc5edd9,0x3e118e3a,0x3e295365,0x3e46d4d3,0x3e7f07e6,0x3e809c3b,0x3ea8c5ab,0x3e79eb7e,0x3e2117c8,0x3e4787a9,0x3e46fc44,0x3e783b06,0x3e85d66d,0x3e8e6950,0x3ea010dc,0x3eb644aa,0x3ecf67ac,0x3efc0f9a,0x3f0e2324,0x3f17b639, +0x3ef6a17e,0x3ec67418,0x3e7743ca,0x3e705982,0x3e5581ff,0x3ea08c57,0x3f18a705,0x3ed11192,0x3e992023,0x3e95a79e,0x3e5f6345,0x3e5c1113,0x3e54a719,0x3e4342f5,0x3e534c06,0x3e1d0cb7,0x3e162305,0x3e31d973,0x3e5402bf,0x3e73c866,0x3e84cdc4,0x3e9356a9,0x3ec2b414,0x3ead5bca,0x3e8ae941, +0x3e9778e4,0x3e7538c5,0x3e8545b2,0x3e84f5dc,0x3e8de2d3,0x3e989563,0x3eab5a3c,0x3ec1e2de,0x3ef8a799,0x3f0f6919,0x3f195dbd,0x3f1854ec,0x3f0c0a0d,0x3ed0307c,0x3ec7403f,0x3ec4ac8c,0x3ed6cada,0x3f1adb62,0x3eeaab7d,0x3ec26065,0x3eb4ab7f,0x3e8c1a87,0x3e74b400,0x3e637d4f,0x3e619e09, +0x3e5a3236,0x3e437f68,0x3e3ab418,0x3e459c4b,0x3e603487,0x3e8b3c05,0x3ea19348,0x3eaeda1d,0x3ecd0046,0x3ec03939,0x3ea73bee,0x3eaca7fc,0x3e8a400d,0x3e88ca06,0x3e8fae1b,0x3ea862ee,0x3ec658d2,0x3ef0216c,0x3f0ebfa0,0x3f16b9b8,0x3f17d7d1,0x3f161653,0x3f1bb2c0,0x3f18c8e7,0x3f0878d8, +0x3f0143f5,0x3ee78aa7,0x3eff7320,0x3f01e37a,0x3ed42618,0x3ece35e1,0x3eb01af7,0x3ea18b14,0x3e871c5f,0x3e926e93,0x3e80d2de,0x3e9a1719,0x3e85c8e4,0x3e8ac545,0x3e8fa74e,0x3e94bacc,0x3e9eb364,0x3eaf1556,0x3eb624d6,0x3ed02a13,0x3ebc68cc,0x3eab52d6,0x3ec3b201,0x3ec85b4c,0x3ed120f8, +0x3ed136f8,0x3ed2d5af,0x3ed738df,0x3ed99a38,0x3edbd48d,0x3eea312c,0x3efabad5,0x3f05441f,0x3f052c18,0x3f07c90e,0x3f085f12,0x3f05609b,0x3edc5720,0x3ee92038,0x3f0ae2f4,0x3ee1df47,0x3ef1a768,0x3ee2ebbd,0x3ecf1221,0x3ec54cc3,0x3eb80206,0x3ecb2bc8,0x3ed6b930,0x3ece8ff6,0x3ebbc23b, +0x3ec01186,0x3ecb1340,0x3ec9f6ef,0x3ed38f32,0x3ec9648c,0x3ee5df07,0x3ed404dc,0x3ecf4914,0x3edcac53,0x3ee07d8e,0x3eea2890,0x3ef37e13,0x3efdd967,0x3efa79a1,0x3efa3800,0x3ef9087b,0x3ef84122,0x3ef541ab,0x3ef56476,0x3eef5607,0x3eebb839,0x3ee5e635,0x3ee6a81b,0x3ec8ffba,0x3eb8de0f, +0x3f085a15,0x3f0f471c,0x3ef81b51,0x3ef6e88e,0x3f0b4865,0x3efd2988,0x3eff7dac,0x3efb7de0,0x3ef0cc8a,0x3ef6291a,0x3efa78c5,0x3ef59a18,0x3f09c302,0x3ef89e8e,0x3ef2950c,0x3f0b77ff,0x3f049b1a,0x3eb2940a,0x3ec22f6a,0x3ec541ce,0x3ec724a3,0x3ec9f072,0x3ecb612a,0x3eceeec8,0x3ecda2ec, +0x3ecdc45a,0x3ecdc591,0x3ecd3845,0x3ecce581,0x3eccaaa8,0x3ecb90da,0x3ecad0c0,0x3ec8f7a8,0x3ec9573f,0x3ed73623,0xbdb20078,0xbda3068e,0xbe0820ea,0xbc803ecd,0x3de4b7f8,0x3ea9edf5,0xbd96ae4e,0x3db6fd1c,0x3e967c23,0x3e9a19fc,0x3e99d4be,0x3e957de3,0x3ea00574,0x3ea2f557,0x3ea4dd1d, +0x3dc0e3ed,0xbd30e039,0x3eb3481a,0x3de1e6de,0x3b68bd51,0xbddd93df,0xbd840eea,0xbda93e8e,0xbdaf3a3a,0xbdb0e0d5,0xbdb133e5,0xbdaecc64,0xbdaf585a,0xbdb4d198,0xbdbc3cab,0xbdce01a6,0xbdde9199,0xbdfe2844,0xbdeb1e88,0xbde14631,0xbdc6d5b4,0xbdcd7e40,0xbde4ea27,0xbdf54122,0x3e420b20, +0xbd8add3a,0x3d0abd05,0x3d3bc163,0xbc645793,0x3bd9b2d4,0xbd60075b,0xbd2a93a0,0x3c72826c,0xbd048558,0xbca079b2,0xbc7897e0,0x3d73352b,0x3d14fdb1,0x3b33d79f,0x3c9c1a3f,0x3e2fbf12,0xbd859b02,0xbd863396,0xbda306de,0xbdbf5c78,0xbdc36ed8,0xbdc3a450,0xbdb936df,0xbdb350ac,0xbdc073aa, +0xbddd3fbe,0xbe0a20bd,0xbe292c8e,0xbe563a55,0xbe497eb1,0xbe3a1e73,0xbe102686,0xbe084c84,0xbe0535b7,0xbd9be4e2,0x3c50a154,0xbc6bd0e0,0x3d88832a,0x3d612e57,0x3d594f5e,0x3d0682b4,0x3d82d24b,0x3c803a1e,0x3db064e9,0x3ae3b1d3,0x3dc405c8,0x3cd9cd84,0x3db16b49,0x3d41b31f,0x3d5eb511, +0x3d9d2c1b,0x3d88cab3,0x3c177ba0,0xbd5e54f3,0xbd87af14,0xbdcfec92,0xbdd60dab,0xbdd50c2f,0xbdc0d5a7,0xbdb7a2cf,0xbdc8906b,0xbdfbbf51,0xbe2b3ad4,0xbe6e7e40,0xbea4878b,0xbe935197,0xbe83e80d,0xbe2a4e46,0xbe0ede22,0xbe00f997,0xbc33374d,0x3da9dd48,0x3b8d8068,0x3d0d9def,0x3d6c2a9d, +0x3d3650d1,0x3d38b792,0x3cd8fe0a,0x3d091d63,0x3cd8d091,0x3d50652c,0x3d2df52b,0x3d2153d0,0x3d565a12,0x3d4de086,0x3dce3407,0x3d95d50d,0x3ddba832,0x3d3ebb48,0xbc9b8449,0xbd47d2f3,0xbdbcb489,0xbdbc2736,0xbdb6deed,0xbd89fdad,0xbd403954,0xbd836abc,0xbdcf1584,0xbe388466,0xbe994a6e, +0xbeecdde4,0xbedd5f2b,0xbebe878b,0xbe6073e0,0xbe12fc59,0xbe9538cf,0xbe40a8c1,0xbd572735,0x3cb15c7f,0x3d71b917,0x3d65df97,0x3b18ece6,0x3cdfb0b7,0x3c5c813b,0x3c98e3c3,0x3d135146,0x3d360886,0x3d607893,0x3d710cda,0x3d6ec94d,0x3d65b833,0x3dae55b7,0x3daedb2a,0x3df5413a,0x3d251b75, +0xbd92a577,0xbdca6499,0xbe46b0bb,0xbe612259,0xbe719906,0xbe631925,0xbe802ab7,0xbe8019e0,0xbe405e31,0xbed3c684,0xbeeebcc8,0xbeeac535,0xbecce332,0xbeb97136,0xbea9f316,0xbe918992,0xbefeb445,0xbd698cfd,0x3e2005e4,0x3d93b002,0x3cdf5abf,0x3db57a2a,0x3d8ab514,0x3deaf5be,0x3d9e30cb, +0x3d9ec099,0x3da13fea,0x3d22614f,0x3cdfca01,0x3c684953,0x3cb090b6,0x3d12b566,0x3d90a04f,0x3d8aa881,0x3e143f00,0x3d1974b3,0xbdaeb810,0xbe017ecd,0xbe8cbfb6,0xbeab7af3,0xbed2e097,0xbef04e67,0xbedc140b,0xbeca6745,0xbeb1a599,0xbee16243,0xbef5a9f9,0xbeffe10a,0xbeee7cc7,0xbee96136, +0xbef5733c,0xbef873d9,0xbf1ed7dd,0xbe7bc2a6,0x3e3d3e1c,0x3d30e01a,0x3e18af04,0x3cd5a79a,0x3e26481f,0x3d9f2f0c,0x3dc1c2b3,0x3d8e0778,0x3e18686c,0x3df097a6,0x3de5745a,0x3dc99926,0x3d9db07b,0x3d11da8a,0x3df368fd,0x3da3af04,0x3dafa1d7,0x3cfa37f1,0xbe09b3f7,0xbe454c6c,0xbeae56ec, +0xbed7d653,0xbf074d80,0xbf230132,0xbf30a207,0xbf2c47a4,0xbf12f1c5,0xbebc6406,0xbe8ca41a,0xbe9ec23b,0xbe75c958,0xbe9f38e5,0xbee94785,0xbf08f3e1,0xbee0ffa9,0xbe8e4d08,0x3ceaf712,0xbceacfdc,0x3e2fd2e0,0x3cdb588c,0x3dd69d06,0x3dae4039,0x3dd1f249,0x3dd37f61,0x3e4ea42b,0x3da74ce0, +0x3d7dfccb,0x3dd46c07,0x3da6485f,0x3dfd0f00,0x3dfffd85,0x3d8a73b1,0x3e24ce9b,0x3b96582a,0xbdd8a30a,0xbe0c0dc4,0xbe75139c,0xbeb52255,0xbee7b173,0xbf02b217,0xbf10f46a,0xbf0e1928,0xbefa1761,0xbeeb4336,0xbec2347f,0xbea69266,0xbe3a574a,0xbd4e10b6,0x3db6e6cb,0xbe85e2d1,0xbea21e3d, +0xbeb77127,0xbc624ef3,0x3c2ee7d7,0x3c8c3419,0x3df5e16e,0x3d7775f5,0x3cc2134e,0x3e04a851,0x3debdf42,0x3e49bf3e,0x3df7951f,0x3dd6a7e6,0x3dfc7b11,0x3e05507f,0x3e2ac256,0x3e014da4,0x3e14fdd3,0x3e7c7dd4,0xbb85fda5,0xbdeeefff,0xbde31801,0xbdfe18de,0xbe34b7fc,0xbe87b8f8,0xbec369e7, +0xbee1629f,0xbef6941f,0xbef84853,0xbec485bd,0xbe8ca97f,0xbe7d0bba,0xbdc77a34,0xbdd0af55,0xbe1c383e,0xbe86202f,0xbe54da06,0xbe2e282e,0x3e257d24,0x3db3ffa4,0x3e2f5800,0x3e0ddbb6,0x3dbc15e4,0x3de69397,0x3def0aa0,0x3e193b74,0x3da767cf,0x3e336e4c,0x3e1b81e8,0x3e0a6e23,0x3de60509, +0x3dd2b027,0x3d96d09b,0x3de9e5ae,0x3e39af64,0x3ce1489a,0xbdb4755c,0xbd6cff8f,0xbda77b26,0xbe003d53,0xbe3143c0,0xbe5380d0,0xbe71c51b,0xbe6f0071,0xbe4dcfc4,0xbe483687,0xbe4060f9,0xbe1b98c8,0xbda4073a,0xbd56120b,0xbd021e87,0xbdecc29a,0xbd90c8b2,0x3d02a431,0x3e414c68,0x3daf977b, +0x3e47767f,0x3e287eec,0x3e3f0d14,0x3e30b13b,0x3e703b04,0x3df3c775,0x3e70f549,0x3d685d6a,0x3e7e3eea,0x3e072b01,0x3e7b2246,0x3e1f5479,0x3e42b384,0x3e2475ef,0x3e3f4856,0x3d4d3442,0xbd09b285,0x3d3949f7,0x3d27d072,0x3c8bbb94,0xbc771305,0xbd051911,0xbdad1998,0xbe018798,0xbe313ae8, +0xbe2da90d,0xbe254867,0xbe1f6215,0xbe00d494,0xbda5b43c,0xbccfda68,0xbc3052ba,0xbca1f59d,0xbd190b72,0x3ef3b4a5,0x3d4b385b,0x3e5431a3,0x3e45b92c,0x3d983ebd,0x3dbc0cc4,0xbc784229,0x3c63ee0e,0x3de683cd,0x3c75e32a,0x3bc656b2,0x3c6ac682,0x3e14a56e,0x3de803d5,0x3dad1393,0x3def554b, +0x3ed07382,0x3d0ed124,0x3d58167f,0x3d8ec196,0x3d9d8f78,0x3dbc0c16,0x3dcfe68a,0x3dec22f6,0x3d99d60f,0x3d5282c1,0x3ccd8ed8,0x3c0ba8f5,0xbc494906,0xbd0e4a38,0xbcd6f6ee,0xbccb8815,0xbcecf24d,0xbca22b73,0xbd38cd71,0xbe144d01,0x3e04b876,0x3ea4f8e2,0x3f1c1e5e,0x39fe9be3,0x3e8ff8ff, +0x3f1068c0,0x3f150567,0x3f14af7b,0x3f0bc380,0x3f167e5b,0x3f18ecda,0x3f173ddf,0x3e8d4fef,0x3d38b8b5,0x3f24589b,0x3e9db9c5,0x3e115e8e,0xbdfa8632,0xbce70d4e,0xbd351524,0xbd1a95b8,0xbd00b972,0xbcce1ad9,0xbc3c95c1,0xbcbcc15b,0xbcf19def,0xbd165712,0xbd4a156d,0xbd76aa46,0xbd97ec3f, +0xbd92fc30,0xbd930c1d,0xbd8fd6a7,0xbd93d351,0xbdc274b4,0x3d898d77,0x3d8046f3,0x3deb9726,0xbd222642,0xbdf90cfb,0xbe1a8e4c,0x3bd648bb,0xbdccb159,0xbe190227,0xbe1d1bc8,0xbe175665,0xbdfc2ef1,0xbe0dac04,0xbe0ee109,0xbe0977b0,0xbdc43c09,0xbc0b4eb7,0xbe0d4d19,0xbdcae833,0xbd1416ba, +0x3dccc590,0x3d830de0,0x3d8bac7b,0x3d831972,0x3d7a3220,0x3d70d332,0x3d702f66,0x3d5dc842,0x3d5c0e25,0x3d60b79f,0x3d695788,0x3d72d60c,0x3d777559,0x3d85792c,0x3d8375f8,0x3d632d31,0x3d8a31b9,0x3db23b69,0x3d9d8d37,0xbe10da40,0x3d60fd0e,0xbce670c5,0xbc9a35cd,0x3c999265,0x3c5817e8, +0x3d5561ce,0x3cf52bc9,0xbb925351,0x3cd97550,0x3d15438f,0x3cafc774,0xbaf29dca,0x3c35be95,0x3c1e4d79,0x3cf67d19,0xbd8ba95a,0x3d9d315a,0x3dc60f9b,0x3dabf73d,0x3da0e229,0x3d8fb360,0x3d859a54,0x3d837aec,0x3d4fea8b,0x3d3fbb35,0x3d5132f2,0x3d650edd,0x3d6c2a88,0x3d53e08d,0x3d808f17, +0x3d8590bf,0x3d50a3cd,0x3d8e0938,0x3e18efb5,0x3dcf1863,0xbc7741f1,0x3cd43a32,0xbcdb0d26,0x3aee8fa2,0xb98c93a0,0x3bfa8151,0xbc595310,0x3d2ad7e2,0xba322ce1,0x3d8863d4,0x3c414567,0x3d042e6d,0x3c53834a,0x3d0f1062,0x3cac9a99,0x3d0e6bd2,0x3c854761,0x3d93b4a2,0x3df0a273,0x3db01f83, +0x3d9758b0,0x3d638a3c,0x3d31b92d,0x3d3547f3,0x3cb94d7f,0x3cc23911,0x3cfb80aa,0x3d06efdd,0x3d26c90e,0x3d140cc6,0x3d8304ba,0x3d7a233b,0x3d30b331,0x3db5f93f,0x3e457790,0x3da1ca7c,0xbb4af62f,0x3da39500,0x3d16a778,0x3cc3c790,0x3d11957d,0x3d13c247,0x3d250bc8,0x3d1f895f,0x3d86326a, +0x3d2e5a73,0x3d434c14,0x3d547e0b,0x3d6e5123,0x3d798961,0x3d3913b9,0x3d96a357,0x3d5806fd,0x3de144f7,0x3e1bf82c,0x3e08c1d0,0x3dedd6db,0x3dbf126f,0x3daca85f,0x3db859f1,0x3d67a1e7,0x3d3fb9c0,0x3d681cfc,0x3d738900,0x3d2cd7fb,0x3a9c0887,0x3cd78646,0x3d084fe6,0x3d1d5202,0x3dd00e52, +0x3ebb81db,0x3e616f14,0xbcb9f66b,0x3d68d674,0x3cdc02d5,0x3cf96a9b,0x3d90fc76,0x3d098da6,0x3cc0744b,0x3cd34b47,0x3d02bcbc,0x3d4d0356,0x3d43f1a0,0x3d16b7cb,0x3d0e1241,0x3d3c2805,0x3d64bd42,0x3d85f2cc,0x3cc805d6,0x3d1708f0,0x3cda666e,0xbd5190e8,0xbdd8372d,0xbe1dbcaf,0xbe534bf5, +0xbe87d823,0xbe651ec6,0xbe559cc9,0xbe4b5441,0xbe4497db,0xbdb6674f,0x3db58583,0x3e288ead,0x3e3e7326,0x3e0a3450,0x3e39756c,0x3ea6f61c,0x3c960075,0xbe228300,0x3c7c5319,0x3d42d444,0x3d3599b7,0x3d940793,0x3d87a2dc,0x3d97afc6,0x3d7b46a2,0x3da266eb,0x3d1a534f,0x3cc68603,0x3c90056c, +0x3d219cda,0x3d1b6df1,0xba5b82bd,0x3bb3b52e,0xbccc1a35,0x3d51c7b9,0x3dcb0cc6,0x3d91bf9d,0x3d8d1fea,0x3c55cb25,0xbd76e700,0xbe225937,0xbe9062cb,0xbeafd0ed,0xbea86dbd,0xbea0a5e1,0xbe6d105f,0xbcdc89ab,0x3d895a11,0x3e2c40e1,0x3e75e9be,0x3e55b12e,0x3f151b2d,0x3d26f77b,0xbe73a3df, +0x3d09e00f,0xbe1371ec,0x3c4e755d,0xbd04be52,0x3d4dfb90,0x3d476262,0x3d892ebc,0x3ded8e27,0x3db0551d,0x3d9c516c,0x3d2ac084,0x3d1690ed,0x3d2815bb,0x3b8c315e,0x3d91e42c,0x3cebd22e,0x3dcbf52d,0x3e648fcc,0x3e20a2eb,0x3e0d40d5,0x3e36b5ad,0x3e4826b9,0x3e4406f5,0x3df038a7,0xbac68b64, +0xbe240142,0xbe2e8cd0,0xbc924010,0x3e640c50,0x3ecb4d7b,0x3ef57ac4,0x3f2585ea,0x3f087d6a,0x3f32db24,0x3e7dbec2,0xbded2785,0x3e21ada1,0xbc495ca5,0x3dd92421,0x3d8fbdf3,0x3dc20d55,0x3d8368f4,0x3db5c7fd,0x3dfd2d4f,0x3d6d35ca,0x3d3d7e53,0x3d6ee792,0x3d4198a3,0x3d530d83,0x3d1cb066, +0x3d717fd8,0xbc416508,0x3dc36be6,0x3e6011cf,0x3e3b7ca9,0x3e3e3fb9,0x3de0464e,0x3dccd33f,0x3dffee65,0x3df40638,0x3de6634e,0x3dc50023,0x3d13e041,0x3b630159,0xbc9d67a9,0x3e633cba,0x3ecab89f,0x3f1bbd44,0x3f0473e1,0x3ea26427,0x3e625ec2,0xbdc18896,0x3cda17d2,0x3dc4ede6,0x3d43fc5d, +0x3d8b602b,0x3cccdbb2,0x3d13c128,0x3d506368,0x3dadb04b,0x3db05abf,0x3d9fe46c,0x3d539721,0x3cc40e9a,0x3ca51ffb,0x3c3955f1,0x3c465ab6,0xbd3c6e4d,0xbc6af41f,0x3d49c24e,0x3d7779e3,0x3e34f69b,0x3e2f9e2b,0x3e3ac83e,0x3e1e51c4,0x3e17498f,0x3dd7d025,0x3d45dcf5,0xbdde1659,0xbe31ace1, +0xbe317806,0xbdb0aee6,0x3c6a6912,0x3e43234d,0x3e306df0,0xbc216de0,0xbab6b44a,0xbe418e34,0xbdc6344f,0xbd5027de,0xbd74cf3a,0xbbbf637b,0x3cd76adb,0x3d2073ee,0x3d20c819,0x3c4da622,0x3d984250,0x3da5eed8,0x3d846433,0x3d3b15c6,0x3bd35a19,0xbd178248,0xbd0e3c37,0xbd7f2689,0xbda87b8b, +0xbccb4fd6,0x3c883618,0x3e0d6ccf,0x3e31ac24,0x3e2a5035,0x3dce6e90,0x3cbb7fca,0xbdacc7ff,0xbe3b897b,0xbe5c40c4,0xbe553452,0xbe4cc55b,0xbe3f2807,0xbe1c75a4,0xbdb2e97c,0xbdac5482,0xbdfe7d02,0xbe100be9,0xbd9081b8,0xbcc55f5b,0x3c9a650a,0x3d110014,0x3d0e4d89,0x3d61ffbb,0x3d246eec, +0x3cfe1d38,0x3c64af90,0xbaa761a7,0x3d070536,0xbaf89531,0x3cb87015,0xbc25ee85,0xbcce51f0,0xbcf66239,0xbd6b1749,0xbd04b6a5,0x3c4f9ae1,0x3c879ee3,0x3d050efe,0x3cefb7f6,0x3d3be073,0x3d8ab6ca,0x3d6ba929,0x3d679ca7,0x3d5bd5ce,0x3b076972,0xbd542a8f,0xbdd50329,0xbdf51204,0xbe102bf1, +0xbe1a6923,0xbe14344d,0xbe0921a9,0xbe236504,0xbd96cd22,0xbe0ec6c4,0xbde9e402,0xbdd9b818,0xbdd37371,0xbdbc5a01,0xbdc43e07,0xbdd696bd,0xbdcc5407,0xbdd76ac0,0xbda55310,0xbdb5cb53,0xbd846dda,0xbd95f130,0xbda86130,0xbd70bc48,0xbc243ab8,0xbde0774e,0xbdd80796,0xbde88ab4,0xbde7267a, +0xbdf96891,0xbe0a2022,0xbe1620f5,0xbe197907,0xbe1f6318,0xbe218248,0xbe208b58,0xbe1a35ac,0xbe1aca68,0xbe12ed2c,0xbe0f00ba,0xbe0c1b03,0xbe0f854d,0xbe091982,0xbe152002,0xbe289a67,0xbe16dd3d,0xbc8b2400,0xbe2ea5ce,0xbe1e089f,0xbd51b6b2,0xbd52ea16,0xbd4dcb6f,0xbd3676da,0xbd37db04, +0xbd4a528b,0xbd378057,0xbe1aeb9d,0xbe222e70,0xbbe40a42,0xbe141b70,0xbe1a0360,0xbe00a1a5,0xbdeafa5c,0xbdfa7132,0xbdfc14ed,0xbdf9f03b,0xbdf276e8,0xbdeea24a,0xbdf3c06e,0xbdf9899e,0xbe007795,0xbe029d2a,0xbe05a5c8,0xbe07fd78,0xbe09ae59,0xbe0b764a,0xbe0b18ec,0xbe0eb8ed,0xbe1c830e, +0x3dce82c0,0x3dd55707,0x3dcc5e72,0x3e19b2fe,0x3e0b75b9,0x3d24f953,0x3e0bc7d0,0x3e01d335,0x3d78197f,0x3d72838c,0x3d6b827d,0x3d48780a,0x3d4e725e,0x3d46402c,0x3d2239e2,0x3dfe72f1,0x3e04f430,0x3d03f6d0,0x3df6287e,0x3e051a38,0x3da832c4,0x3db81e7e,0x3dbe4752,0x3dbdd9e0,0x3dba3b5b, +0x3db4d1be,0x3daeb7df,0x3da6bdfe,0x3da2797a,0x3d9f9104,0x3da82a80,0x3db56a68,0x3dced484,0x3dcd5617,0x3dd2c0e0,0x3dd68287,0x3ddb41a9,0x3e07653b,0x3e17376c,0x3e02471a,0x3e0572b9,0x3dfd669f,0x3dd38a64,0x3dcd0aa8,0x3dc6cd41,0x3dc42e18,0x3ddfb77f,0x3df2a008,0x3de73e63,0x3dc80c46, +0x3dca5a91,0x3db6ea64,0x3db7133f,0x3dde1da3,0x3db72533,0x3dcb5c9e,0x3dd59c10,0x3dbc4daf,0x3dd8b780,0x3dd45282,0x3dd31407,0x3dc5c15a,0x3db47918,0x3d9c9911,0x3d91516e,0x3d8b0c40,0x3d94de3e,0x3db1fe91,0x3df75a6c,0x3df9dc33,0x3e09f609,0x3e0ede39,0x3e1552b9,0x3e231776,0x3e32b3ac, +0x3e51a60e,0x3e2bf642,0x3e04680b,0x3dcd3df2,0x3db404b0,0x3dc1f2fe,0x3dac1ef8,0x3d927933,0x3dc36a66,0x3d9bd717,0x3d95113c,0x3d86dd53,0x3d9a7e86,0x3d9d98f3,0x3d9e42e3,0x3d930c51,0x3dd51656,0x3dbd3776,0x3da9e6b1,0x3dd9ea29,0x3dd04e9e,0x3dc7aa7a,0x3da0bc13,0x3d69126a,0x3d02f020, +0x3c587543,0x3c0f5e80,0x3cc334f6,0x3d93c4bd,0x3e19bbc5,0x3e1608ee,0x3e2b61e7,0x3e248b3e,0x3e3034fb,0x3e1eb3f0,0x3e3a35cc,0x3e47e7d7,0x3e2df703,0x3e02d038,0x3dab57b4,0x3d7c26f1,0x3d7d3770,0x3d5307f2,0x3d5954bb,0x3d6ddd3b,0x3d4099b8,0x3d4a64fc,0x3d17d217,0x3d589bf7,0x3d4fa7f4, +0x3d6cda5d,0x3d6013eb,0x3dc7a372,0x3db03c80,0x3da61882,0x3de069d2,0x3de4eab0,0x3de5b9a1,0x3dbfce9f,0x3d7a02ef,0x3c9b0f69,0x3b1cddaa,0xbc93d628,0xbc29bd28,0x3d4255fe,0x3e271e57,0x3e27fd07,0x3e4645f2,0x3e3f05bb,0x3e44a250,0x3ed7e396,0x3efcf99b,0x3ee0b397,0x3e99a479,0x3e80ee64, +0x3e67011f,0x3e4d8acd,0x3e0e325c,0x3dd1af80,0x3d933821,0x3d82fd7a,0x3d583397,0x3d2b4a2c,0x3cfa2bf4,0x3d27bbf1,0x3d40a20a,0x3d8d2929,0x3d2aa64f,0x3d63271e,0x3d8c8b5e,0x3db58b95,0x3ddcdc29,0x3dcd926f,0x3d25c884,0xbcde5a0b,0xbda98ee1,0xbe11dc2f,0xbe45412d,0xbe87e070,0xbc3e93a0, +0x3de8a800,0x3e7684a0,0x3e867f17,0x3ea8fa95,0x3ecd04be,0x3ed6a67a,0x3f235095,0x3ebd919a,0x3e70472f,0x3e3faaef,0x3e2f4cda,0x3ded2db1,0x3dad4a04,0x3d7f552e,0x3d9d6b45,0x3d9e1b6d,0x3d9bc504,0x3d821ff7,0x3d80f859,0x3d460a79,0x3d8b45dd,0x3d8ec59e,0x3d90b5ad,0x3d8727d6,0x3d9eb300, +0x3e00a392,0x3e07039a,0x3e28b5e6,0x3e6ab081,0x3e8e84ef,0x3ea14a8f,0x3ea304cd,0x3e827aac,0x3e485d70,0x3df1229e,0x3e46d8bc,0x3e75cc34,0x3eaf22a8,0x3e7671c6,0x3e97d07a,0x3ee4b9f2,0x3f236636,0x3eae9010,0x3f039487,0x3eb1d4e6,0x3e5e9c61,0x3e5311e9,0x3e25841e,0x3dd329b7,0x3da42d49, +0x3da22be7,0x3d9e365a,0x3df0fd51,0x3d5cad69,0x3cf96841,0x3c908b08,0x3d6849de,0x3db7eae0,0x3d99c396,0x3e0224a3,0x3e3abba4,0x3e480660,0x3e7d4173,0x3ea482eb,0x3ec02888,0x3eb797b2,0x3eaf5993,0x3ea9ebfc,0x3eb2b996,0x3eb40519,0x3ea3321d,0x3e674515,0x3e1a4115,0x3df94aac,0xbdb3f343, +0xbe22b337,0xbe866c01,0x3e0d3239,0xbeae7ea2,0x3e7783c3,0x3ec7545a,0x3de8bc24,0x3e19fdf6,0x3de48c37,0x3dc6d347,0x3dd0aed9,0x3dc3512f,0x3daa3af5,0x3db046dc,0x3d996d0f,0x3dabdcb1,0x3d93b508,0x3dab77f5,0x3d99df50,0x3db233f1,0x3de17d16,0x3e170ad4,0x3e541694,0x3e816255,0x3e8f3331, +0x3e96c349,0x3ea7344b,0x3eb3ddb4,0x3eb457e9,0x3eacf4e4,0x3e8cd011,0x3e2d68b8,0x3dc8dfb2,0x3ba42ecd,0xbd18e36a,0xbe80d2f0,0xbee28aa5,0xbf48df8b,0xbec8b044,0xbec296b4,0x3c8b1372,0x3e9a5721,0x3e3efe14,0x3dd330a8,0x3e0d2d62,0x3d984028,0x3d6805f4,0x3d838a0b,0x3d55fe07,0x3d02678c, +0x3d92d77b,0x3d8dcd35,0x3cf94c9e,0x3ce22f65,0x3ca278ae,0x3d548210,0x3cd43565,0x3ca53dcc,0x3dd2cd95,0x3e4638b0,0x3e89ae55,0x3ea2d7a6,0x3e9ab7f4,0x3e96d797,0x3e9352e6,0x3e845151,0x3e5af083,0x3e0ecc08,0x3d9c1215,0xbcf9a6e7,0xbdeaf7e3,0xbe8cf66d,0xbeaa0432,0xbedc4f73,0xbeaf4be0, +0xbe394f8e,0xbd87597a,0x3dd20780,0x3d5c7b00,0x3d3d0dc7,0x3d417aad,0x3d1172ac,0x3d9f1ae1,0x3c7fff28,0xbbb48f61,0x3b257dce,0x3cc55737,0x3d2eb6f3,0x3d09381e,0x3d0f86e6,0x3ce70f4a,0x3c9785af,0x3cd159af,0x3c3908da,0x3d6d6530,0x3dd222c7,0x3e0a44ad,0x3e547691,0x3e69f65f,0x3e7f75f7, +0x3e846fed,0x3e8a7d29,0x3e89e489,0x3e74d9b0,0x3e3a58f8,0x3db685c6,0xbd444e4c,0xbe0cd842,0xbe3ff9ea,0xbe82c684,0xbe3e3515,0xbe0bfa18,0xbdb200b9,0xbd9c2ee3,0xbd850d11,0xbce95301,0xbc349e36,0xbbd9d16d,0x3bbdf918,0x3bf7b1fb,0x3c5a964a,0x3c88309c,0x3c6f6026,0x3a561de3,0x3c7e4a9f, +0x3ac1718b,0x3c7ed9c6,0x3c5fe722,0x3cae6f81,0x3cdb05e5,0x3d13782b,0x3d6119d0,0x3d86b03e,0x3da2afd7,0x3de4db62,0x3e1523c7,0x3e39769c,0x3e21574e,0x3e0e7837,0x3e05db00,0x3da376f5,0x3d0dade5,0xbc7a6ce6,0xbd85a4b1,0xbe0164b3,0xbe57bca1,0xbe2277a1,0xbddde803,0xbdc6fbf8,0xbdf641b0, +0xbd93f778,0xbd95476a,0xbd9d7a24,0xbd5a6a1e,0xbd386750,0xbcfe9b4d,0xbce11b3d,0xbcd10656,0xbc4dd8f4,0xbc96ce3f,0xbc2534b9,0xbd093604,0xbd36042d,0xbd225dfd,0xbd7a3f30,0xbdc2eb93,0xbd955335,0xbdb87786,0xbdc60d54,0xbddee140,0xbdefc33a,0xbe0424cc,0xbe0a14e3,0xbe111bf4,0xbe15d529, +0xbe1aaaf9,0xbe2293de,0xbe277722,0xbe2b728a,0xbe1e782e,0xbe09f3e8,0xbdf7eabc,0xbde12d40,0xbdafec28,0xbd9d17b6,0xbda985cb,0xbdd4bd46,0xbe2b5484,0xbd5b611f,0xbda50d9d,0xbe0f70ad,0xbe10e723,0xbe0db645,0xbe0ee7db,0xbe0eb9b0,0xbe0c9e19,0xbe0c4f6b,0xbd91ab57,0xbd421eb9,0xbe1c4b45, +0xbdaacf6d,0xbd860d66,0xbd8e0bb0,0xbda1ed41,0xbda5cb45,0xbdaef1c5,0xbdb9f830,0xbdc58c38,0xbdd53081,0xbdd4c77b,0xbdd70622,0xbdda20d4,0xbdd4f63e,0xbdd1662a,0xbdd41262,0xbdc4ed50,0xbdbdec27,0xbdb26df0,0xbdb0acea,0xbda06812,0x3d11b5bd,0x3d0f5bab,0x3c8c0893,0x3cb406a7,0x3d823359, +0x3e0ee267,0x3c106515,0x3d3b539c,0x3deb5ff3,0x3ded1b40,0x3ded6794,0x3df2c301,0x3df43a7e,0x3df3859e,0x3df5682d,0x3d3838f5,0x3c5dbe1e,0x3e035b91,0x3d4edb7c,0x3ca9cd37,0x3cdeebc5,0x3d0f2ddd,0x3d084bb9,0x3d1afcb5,0x3d214c28,0x3d258026,0x3d222f34,0x3d20a8e5,0x3d154816,0x3d05c021, +0x3ce7a9d9,0x3cb98cab,0x3c65a792,0x3c50857c,0x3c8daf17,0x3d084596,0x3ce5decd,0x3ce0de59,0x3c562f3c,0x3df3c1c7,0x3cf67249,0x3d79619c,0x3d6989f7,0x3d18fc01,0x3d277379,0x3cd439a5,0x3cc71152,0x3d1cfc7f,0x3cea5a07,0x3d1a6c81,0x3d03c12e,0x3d570681,0x3d5401fa,0x3d154555,0x3d40d53f, +0x3d97be1c,0x3cbe2f0b,0x3d130533,0x3d0d5de3,0x3d3b6d4f,0x3d5367e3,0x3d61a4e4,0x3d50f5d8,0x3d54562a,0x3d3bb85b,0x3d069f15,0x3cb1df8d,0x3bc7a304,0xbc3b83b6,0xbcc667af,0xbc9f47e5,0x3c9801f8,0x3c810b22,0xbc09130b,0x3c059112,0x3d7e5325,0x3d64cfc1,0x3dbca3cc,0x3d828ad2,0x3d632823, +0x3d307857,0x3d33f79d,0x3d2c199a,0x3d68231e,0x3d405957,0x3d6b9f49,0x3d16c728,0x3d50a894,0x3d41acce,0x3d60860f,0x3d541b44,0x3d3eb112,0x3d0741e1,0x3d21277f,0x3d407790,0x3d849b5f,0x3d99cc04,0x3da2a7a8,0x3d8945df,0x3d7a389f,0x3d299f04,0x3c9d0c2d,0x3c1c2da1,0xbc9ed29c,0xbd5b3e07, +0xbdaad4af,0xbd80b3cc,0x3c136a44,0xbbceb948,0xbd7a7b11,0x3c2b7cb3,0x3d935a8d,0x3c8d679e,0x3d8b0c02,0x3d78f0f0,0x3d2b5a7b,0x3d1e67da,0x3ccce608,0x3cf00167,0x3d6501b5,0x3d5a2ad3,0x3d47d870,0x3d323b50,0x3d527768,0x3d6abdab,0x3d51916d,0x3d866a42,0x3d6abcd1,0x3cf423b3,0x3d0a6801, +0x3d15f1de,0x3d6975f6,0x3d96ed32,0x3d9a21cf,0x3d5b5a1a,0x3d4378ff,0x3cd31fdf,0xbaea5717,0xbca31ce3,0xbd2b3bb6,0xbd952bdd,0xbdf3957d,0xbddb904d,0xbd0abcd5,0xbd4473d0,0xbe4e256a,0xbc647226,0x3e3a766a,0x3e08bf76,0x3e1f831d,0x3dfc38ae,0x3d8ae20c,0x3dc51506,0x3d99b298,0x3d7543bc, +0x3d8a38d8,0x3d5fe84c,0x3d443a6d,0x3cd534da,0x3d4d2f78,0x3d713852,0x3d4ddee8,0x3d82b767,0x3d7a4aeb,0x3d97d87d,0x3dd766d0,0x3e070587,0x3e46d5bc,0x3e56f123,0x3e6676c0,0x3e5da78c,0x3e1f377d,0x3deabd85,0x3db57af8,0x3c9a0b52,0xbe174a18,0xbeb9299a,0xbed7429b,0xbebf95b6,0xbe6431c3, +0xbe02805a,0xbf0ed6ce,0x3c1ca63f,0x3e8b2e4a,0x3d8f2d93,0x3cd9002f,0x3d836d75,0x3d2138ac,0x3d4b9899,0x3d570b32,0x3d7db738,0x3d85dc73,0x3d835b54,0x3d8718eb,0x3d454db9,0x3d44b29d,0x3d5c5c83,0x3d9533e6,0x3db20ceb,0x3dcdf8ea,0x3d99bce6,0x3d47db01,0x3d5fbae2,0x3d9a33d2,0x3dae60e9, +0x3dd9b133,0x3e082066,0x3e3497f2,0x3e39642a,0x3e169d6c,0x3d7139e5,0xbd8fee27,0xbe93ab6c,0xbedd07de,0xbf11b714,0xbf362117,0xbf0abf7a,0xbf8d5a6a,0xbea81967,0x3e4b2949,0xbd907239,0x3e349834,0x3b85e869,0x3e15fe43,0x3d4003b1,0x3d96f4a5,0x3d79dcb0,0x3dd8b48d,0x3d1dd67c,0x3c8b5382, +0x3cd73289,0x3d7736d8,0x3d8a3777,0x3dc589d5,0x3dc01669,0x3dfd70b5,0x3da6dcdc,0xbb887304,0x3b8aad26,0xbc8b7eea,0xbd1e8dcd,0xbd92f83b,0xbdf16472,0xbe2474e9,0xbe33735e,0xbe168ada,0xbe45aa0d,0xbeaab19b,0xbf10cbac,0xbf2ec83f,0xbf4757ae,0xbf7eb3c4,0xbf804ae5,0xbf79b0e7,0xbf41485a, +0xbe5c0cf6,0xbe8b7916,0x3d01dc6a,0xbdb62ef1,0x3c9adaad,0xbc54c652,0x3d705e31,0x3ce5fa72,0xbc19c72c,0x3d7ca248,0x3dbd9ca0,0x3d383d86,0x3d77d4a5,0x3d6ff20f,0x3d4ef4c5,0x3d022065,0x3dd49443,0x3d94537a,0x3c96e611,0x3c862da0,0xbd3d9d6c,0xbd56e140,0xbe0ea75e,0xbe8c19b4,0xbec56d87, +0xbeec1a29,0xbef51c8c,0xbf0250fb,0xbf040af3,0xbf08006e,0xbf22bf10,0xbf29acce,0xbf2b1485,0xbf4bf978,0xbf0ed26c,0xbf1eefec,0xbebf5bb4,0xbe85f16e,0xbe65cdc7,0xbdb9495f,0xbda5f422,0xbd39f0f1,0x3c59e2de,0x3ca2e173,0x3b5ce937,0x3d154d61,0x3d2bcd16,0x3cf5f7f0,0x3d36fd5c,0x3d56401f, +0x3d8af2ef,0x3d780d50,0x3da6e36c,0x3d3adf27,0x3d4af71e,0x3cf13507,0xbd83d9e2,0xbe1485e3,0xbe61baf1,0xbe82c026,0xbea80384,0xbeaf6595,0xbe9e7766,0xbe319fc1,0xbdf2f2d9,0xbe26a94c,0xbe75e9da,0xbebe19ee,0xbf02a506,0xbf0ced90,0xbe9b1ba1,0xbeaaa165,0xbe0a7ee3,0xbdd37a40,0xbd1b46f8, +0xbc9130f5,0xbc87d3cc,0x3bed9c1c,0x3b1f98ee,0x3c097589,0x3c2cbe95,0x3c22f62b,0x3c21ec5a,0x3c40912a,0xbb1bbcab,0xbc286673,0x3c204003,0x3b96be73,0x3d07699d,0x3d330e53,0x3c32a674,0xbbdfad05,0xbd94dbad,0xbde56510,0xbe02c234,0xbdd8d497,0xbdde36aa,0xbd911e31,0xbced12c3,0xbd3be487, +0xbd9bd704,0xbd91b2b9,0xbdfea3cb,0xbe49a6c8,0xbe887338,0xbe99fe41,0xbe0d0fdd,0xbe0c913c,0xbe267bed,0xbe257b30,0xbe1c94fc,0xbde42980,0xbd8f381f,0xbd1d89b1,0xbcdd5798,0xbccd4698,0xbc6d337c,0xbcad2934,0x3bbe451a,0xbc08c142,0x3c2dada8,0xbc199154,0xbc82aa20,0xbcd0e364,0xbc1bc129, +0xbda74dfa,0xbe14a5ef,0xbe15f7e9,0xbe2ae486,0xbe36d864,0xbe510a7b,0xbe69e903,0xbe7f1494,0xbe8a7905,0xbe9468bd,0xbe85a5ec,0xbe70452e,0xbe58a06b,0xbe47d2e5,0xbe3265bd,0xbe240bea,0xbe1c869f,0xbd825bc3,0xbd886363,0xbda39b50,0xbd0f947c,0xbd34fba4,0xbd127913,0xbd08a4b3,0xbcc494d0, +0xbcd0bc16,0xbd358f5e,0xbd3e1365,0xbd639dcf,0xbd493271,0xbd5a51c6,0xbd6a7c4c,0xbd822a44,0xbd8f05d1,0xbd88576b,0xbd892d36,0xbd9eef13,0xbd85bf4f,0xbd8fe070,0xbd9bb4b8,0xbd96319f,0xbd898edc,0xbd8108c4,0xbd8f3786,0xbd9094f6,0xbd98eb67,0xbda3539f,0xbdb32a19,0xbdbdd1f9,0xbdb336cb, +0xbdaf63d2,0xbda55e54,0xbd9bb0a5,0xbd421568,0xbd0e6ac9,0xbdd8940d,0xbdd52809,0xbdaa436f,0xbda591ff,0xbdb16e58,0xbd894e68,0xbd8aa1ee,0xbd7cc0f5,0xbd6d567a,0xbd628ff9,0xbd68f3b1,0xbd5edb38,0xbdb708d0,0xbdb2918e,0xbd833dd2,0xbdc2af4f,0xbdd371c1,0xbd689a36,0xbd7db0c2,0xbd8932cf, +0xbd89c4de,0xbd958b3a,0xbda3e32f,0xbdafa67d,0xbda5851f,0xbd9daf9d,0xbd94d1ef,0xbd9091f5,0xbd8a1e5e,0xbd86f06f,0xbd7b3c0c,0xbd6b356e,0xbd58d34a,0xbd4fd90b,0xbd47ab6e,0x3df75052,0x3db930b8,0x3dd3c09c,0x3db51a15,0x3d44467e,0xbbd63eae,0x3de270bb,0x3d78cd7f,0xbbdf1a66,0xbc124796, +0xbc10df58,0xba9b02bf,0xbc09ea06,0xbc15eb64,0xbc34cd1c,0x3d7116a5,0x3ddf6506,0xbc737ad2,0x3d6731d9,0x3dc8f3f6,0x3df28669,0x3dd8b231,0x3de700a9,0x3dee8044,0x3df60ba7,0x3dff38fa,0x3e05001a,0x3e090a81,0x3e0e2d2e,0x3e1446e0,0x3e14bc92,0x3e0f3ac7,0x3e043b6f,0x3deea607,0x3dd8c915, +0x3dba992d,0x3dc11e6a,0x3d82073d,0x3dac40de,0x3d0627f3,0x3db3f77b,0x3d9ca0ed,0x3d87abad,0x3dacc310,0x3d9beb09,0x3dc4d531,0x3dccfc3a,0x3db84e54,0x3dd95c20,0x3dcc7da4,0x3dbfacf5,0x3d998ec1,0x3da540df,0x3dc8e784,0x3dc5f5c8,0x3d3ce2d0,0x3decd852,0x3de6e633,0x3df85173,0x3e08144b, +0x3e0db5a8,0x3e1681df,0x3e22aca3,0x3e2b2a13,0x3e39dcc1,0x3e4e50d2,0x3e5ec5ec,0x3e59325b,0x3e397cb2,0x3e17c6b2,0x3de249dd,0x3d8f2176,0x3d8cad92,0x3b7829d1,0x3cd4b976,0x3cb58007,0x3d13ded2,0x3d4e4794,0x3d626a94,0x3d57a8fc,0x3d4070e5,0x3d2ff5b5,0x3d8495ef,0x3d8cd023,0x3db85422, +0x3d7acce9,0x3d96f5e2,0x3d7c6330,0x3d9f0e5c,0x3da86ff6,0x3db12a66,0x3dabed56,0x3dc4a0ae,0x3de9da3b,0x3df88aca,0x3e1acaa8,0x3e2b9522,0x3e455062,0x3e66bbe0,0x3e7a65b7,0x3e8ed067,0x3e9dc5e5,0x3ea5189a,0x3e94df25,0x3e5dcc1a,0x3e1deb23,0x3daacace,0x3c5f1f12,0x3c2c0b21,0xbd08a89f, +0xbc174b6f,0xbb34c0ca,0x3ba21857,0x3d0989ae,0x3d321280,0x3d0f710f,0x3c8513f4,0x3cc8c071,0x3cf5edfb,0x3d7ee9e0,0x3d4ca0c7,0x3d6a8ed3,0x3d49e21d,0x3d6c7b5f,0x3d8d2ee7,0x3d8a59b0,0x3da6ec30,0x3d8437f8,0x3daa6e73,0x3ddc7fdb,0x3dfa78ad,0x3e2026b2,0x3e29830e,0x3e43ecfc,0x3e68c5c1, +0x3e80127e,0x3e9481f8,0x3eb7880a,0x3ed8702c,0x3ed1e011,0x3ea2a017,0x3e63f2fa,0x3de3885f,0xbc35297a,0xbcdd5813,0xbeab5a13,0xbe8aaab6,0xbe119518,0xbd69f23f,0xbd3151d7,0xbcf04a36,0xbc832298,0x3d085804,0x3d166c5f,0x3d504d33,0x3d73622f,0x3d836509,0x3d804641,0x3d2babb5,0x3d843709, +0x3da08b35,0x3da72568,0x3df1889b,0x3e0048c4,0x3e074f0b,0x3e01180e,0x3e14a84b,0x3e5d0ea9,0x3e9c1b23,0x3ec7e092,0x3ee4a890,0x3f09f86b,0x3f15baab,0x3f1dabcf,0x3ed19711,0x3e7eb49b,0x3da050f6,0xbd93baf4,0xbe5df235,0xbebc3936,0xbeaafcfe,0xbf025ca9,0xbebbdd62,0xbe550e11,0xbde2d153, +0xbd85cd56,0x3bfc1dc4,0x3d00adae,0x3d44a533,0x3d4c8c24,0x3d6fb6b7,0x3d9baaf9,0x3d813928,0x3d6dece9,0x3d407c57,0x3d760055,0x3d8d1e26,0x3d9eb4cf,0x3dc8a7c3,0x3db47d24,0x3dd693b6,0x3e15164b,0x3e2aa069,0x3e4b5b14,0x3e4bb861,0x3e467fa4,0x3e47777b,0x3e27842f,0x3e146399,0x3e2fa44e, +0x3d08eeb4,0xbd714b77,0xbe3fa460,0xbd4eaf65,0xbdc884c1,0xbe91c79f,0xbefacfba,0x3e0c53f0,0xbefa7b2d,0xbf082a56,0xbe6a36ff,0xbe821d13,0xbde971a3,0xbd845eb3,0x3c81fae7,0x3c85e538,0x3d2d21ed,0x3dadcb58,0x3d5c4650,0x3d3fda1a,0x3d67eb85,0x3d8a3305,0x3da54c56,0x3da2a577,0x3dace5d2, +0x3d92d826,0x3dc5c79d,0x3e12a295,0x3dd8a8f1,0x3dbe0b08,0x3ddb4920,0x3e0d41bf,0x3e3b1617,0x3dd44e95,0xbc9abe0c,0xbe1cbb9c,0xbea10c62,0xbeb2452f,0xbe95343c,0x3caf4289,0x3e998fd4,0x3f39fee1,0x3eabc4ce,0x3f5c6ccb,0x3d155c57,0xbee9b50b,0xbb968ce4,0xbe2cdffb,0x3b89c0cd,0xbcca0196, +0xbc468424,0x3c9e9450,0x3d205d9c,0xbc351fde,0x3d96c675,0x3d98df97,0x3d2686a0,0x3d445834,0x3d4c9919,0x3d5a98ad,0x3d786a42,0x3d20a528,0x3d82ffbc,0x3d8765bc,0x3d8a42dd,0x3dc41b9f,0x3db4c0e5,0x3d9f5e23,0x3d8d11fd,0x3d8122ae,0x3d7709f5,0x3d827250,0x3da7dee2,0x3db8a5ef,0x3d8d00f5, +0x3e8bc579,0x3ed4a312,0x3f3d437d,0x3f277d74,0x3f1453de,0x3ea4ea17,0xbe678c05,0xbdc5ad7e,0x3ab96730,0xbdc56021,0xbb9e9064,0x3d49d26c,0xbc14aac3,0x3c7588ea,0x3c4413ab,0x3d1d2e93,0x3d3a389e,0x3d54283f,0x3d6dd17c,0x3d5cc2c9,0x3d288f7a,0x3d936421,0x3d95941b,0x3dc7e39b,0x3d8f50ba, +0x3c760999,0xbd44db79,0xbb847932,0x3d30f754,0x3dcee600,0x3e1af3b8,0x3e40cab7,0x3e515c49,0x3dfc0c7f,0x3debf706,0x3e28046b,0x3e5fa5d0,0x3e9622a1,0x3eee6260,0x3ee3a5b6,0x3e8a31af,0x3e63e699,0xbe47a52b,0xbd8a4f52,0xbdacb438,0xbd461fea,0x3c2363fc,0xbc8b48b8,0x3d220314,0x3d1a50f3, +0x3d32f7ed,0x3c07d348,0x3c680925,0x3d12a1c4,0x3cbe1c41,0x3d0e2c4e,0x3d8d0165,0x3d215f81,0x3ccf5303,0x3cddd797,0x3ce4aa3e,0xbaf68b53,0xbd56f6ba,0xbccdfa7d,0xbc11d324,0x3c114304,0xbc959acb,0xbd7c3034,0xbdb9908f,0xbd9e4663,0xbc9648b1,0x3d73c29d,0x3da57206,0x3ddf393c,0x3e419310, +0x3e3f4c83,0x3e058c06,0x3d1a1a9d,0x3bcfcc03,0x3d9664ef,0x3c242d0f,0x3c688548,0xbbbfc374,0x3ac736f4,0xbcee68e5,0x3c7e914b,0xbcd25f3c,0x3d22c488,0xbcfaa2ea,0x38e3aa0a,0xbd22ffbd,0xbd076130,0xbd7d7264,0xbd8bb737,0xbda82348,0xbd647acc,0xbd2d657c,0xbdaaf118,0xbdc5863c,0xbdeb6697, +0xbe0928c1,0xbe23e794,0xbdd778fe,0xbd6714e9,0xbc6860b5,0x3c1c3145,0x3ce2790b,0x3d4b467a,0x3db55001,0x3dfbaf17,0x3e2880ab,0x3df542ff,0x3e0bebfe,0x3e14a08a,0xbdb7cf7e,0x3da0dda9,0x3c931499,0x3ceda467,0x3d9eb2c3,0x3d8ffde2,0x3dda7738,0x3dcc75be,0x3d6c0f3a,0x3dbc37bd,0x3dc87f9f, +0x3db97f72,0x3d0460e6,0x3d28ba7c,0x3d571973,0x3d2ded53,0xbda086e2,0x3d7ba3c2,0x3d7c963f,0x3d5e57b8,0x3d603a78,0x3d4e3765,0x3d559991,0x3d36dce2,0x3da0efec,0x3dc67f3c,0x3df4af57,0x3e0ee67e,0x3e250b7e,0x3e3732ea,0x3e2a2418,0x3e1b17b3,0x3e161c9d,0x3e0d0ace,0x3e01edaa,0x3e2bb7af, +0x3d970609,0xbc2d6b2a,0xbe03b18a,0x3dea38b9,0xbbcc9384,0xbde869cc,0xbdfc096b,0xbe026a49,0xbdef4b14,0xbe0a4604,0xbe13362b,0xbe11cf57,0xbc4b3eb5,0x3db0c933,0xbe24adef,0xbd0570d1,0x3d1e73ff,0x3e14dbbb,0x3de3a3a6,0x3df3db4d,0x3df338ce,0x3df3b2af,0x3df4d100,0x3def2208,0x3dfc73af, +0x3e02aed8,0x3e079a3f,0x3e0d1f84,0x3e123315,0x3e1caecb,0x3e161251,0x3e141943,0x3e0ea21f,0x3e0ff10b,0x3e1e3471,0xbd64d9cc,0xbd8c0167,0xbdd827b5,0x3cf564e3,0x3de61522,0x3e3bed1c,0xbc1dfc3c,0x3dd7a7ab,0x3e39eeb8,0x3e400ee8,0x3e3ff418,0x3e3179c9,0x3e4387a7,0x3e458fa6,0x3e4027d8, +0x3dde6237,0x3c59d465,0x3e4c4074,0x3debf9a3,0x3d3c6a66,0xbda7ecaf,0xbd3999fc,0xbd609a65,0xbd5fc114,0xbd60989d,0xbd614eef,0xbd64d778,0xbd5d112a,0xbd57fdc4,0xbd500e79,0xbd5aaf3b,0xbd604ebd,0xbd5c0b6f,0xbd730416,0xbd85a43f,0xbd9516bd,0xbd9e067d,0xbdda91d7,0xbdca6740,0x3dd4cb59, +0xbd38f756,0x3cdd1bd4,0x3ccd6d9a,0xbbe5f0cc,0x3c882320,0xbc8bf283,0x3b44b554,0x3d3a88a9,0x3c1ca04f,0x3b43f0ef,0x3c1a9a8b,0x3d3a1713,0x3cd73a6c,0x3cc6a225,0x3c3bac81,0x3dfcdb4e,0xbd221ca7,0xbd6ce6d3,0xbd5ccd4a,0xbd711796,0xbd726437,0xbd7b45cc,0xbd7d8ada,0xbd6dfe3b,0xbd62d391, +0xbd51fda6,0xbd6adaf8,0xbd731d95,0xbd69766d,0xbd8545a1,0xbd98a1f9,0xbdb8c010,0xbdcc7157,0xbe26446c,0xbdf50b13,0xbc86ac80,0xbd01fd0e,0x3c8d16df,0x3c270dff,0x3cadab50,0x3d269bae,0x3d88e580,0x3cc7defe,0x3da9f4ac,0x3be0de1c,0x3d91e857,0x3c8bb68c,0x3d685476,0x3cd5191a,0x3d101add, +0x3d2a0b44,0x3d53f6be,0xb956b32c,0xbd7fbc2d,0xbd4cad59,0xbd811152,0xbd75ae16,0xbd72e991,0xbd65da11,0xbd27f72a,0xbd015115,0xbcd695b2,0xbd47ecec,0xbd7f4acf,0xbd7151f5,0xbd9bed39,0xbdd3ef05,0xbe13d02c,0xbe183803,0xbe280f65,0xbdea1f5c,0xbc9ddc48,0xbc58ef98,0xbc9e4d07,0xbc992414, +0xbc599074,0x3d05ea3a,0x3d040c2c,0x3d3c90a3,0x3d2074ac,0x3d65cc4a,0x3d3befd1,0x3cd1e0f7,0x3d10b695,0x3cc2ff2a,0x3d9c967d,0x3ce5182d,0x3d8c7c4e,0x3c912465,0xbd4fcee7,0xbd4a0fc9,0xbd65090b,0xbd538dd8,0xbd52b9fe,0xbd376d85,0xbcce648d,0xbc322af3,0xbc2265f3,0xbd19c50b,0xbd75fc40, +0xbd76d931,0xbda3ebef,0xbddadf99,0xbe13db91,0xbe0fec9b,0xbe23ea21,0xbe3c2ad6,0xbe3b8532,0xbdd49067,0xbd266e97,0x3c30b0fa,0x3c977265,0x3c499895,0x3ca5bfd9,0x3d0a15e7,0x3d3568f2,0x3d4be935,0x3d5944cb,0x3d42bffb,0x3d4b34b0,0x3d1dceb2,0x3d899005,0x3d15c5c5,0x3d8fdb2f,0x3c57a1a0, +0xbd74e8df,0xbd2f4590,0xbdbff622,0xbdf13374,0xbdea3c56,0xbd589519,0xbd6953ae,0xbd88d1b4,0xbdcf8fa9,0xbe07480f,0xbda704d7,0xbc3d9ff3,0x3c68578a,0xbc8bb929,0xbdcfd262,0xbe4a700b,0x3eb85d7e,0xbdef3159,0xbe8ee885,0xbe040601,0xbdbe8b89,0xbd8a67ec,0xbce3ffed,0x3c1eabd4,0x3cd5631b, +0x3d465778,0x3d89ac54,0x3d5c3924,0x3d49af2b,0x3ced80cd,0x3d44e192,0x3d4d2cf9,0x3d7ce2e4,0x3d517e87,0x3dc58721,0x3d0198c4,0xbc844986,0xba619333,0xbd361e0e,0xbd0a804d,0xbd5f2b8b,0xbdbb995f,0xbe01dcf9,0xbe41e346,0xbe91e7e5,0xbe8ec2c1,0xbe8b0cb4,0xbe577655,0xbdcbc65a,0x3dad8f7b, +0x3ec7a191,0x3ec3e8b1,0x3f0c91fc,0x3e9dbc99,0xbd0b4d24,0x3d40674a,0xbd4e4ddc,0x3caa9144,0xbd1cc349,0x3b80037a,0x3bcb345d,0x3c68bba3,0x3d44fe9e,0x3d7c2bdf,0x3d85667f,0x3d5006de,0x3d74357c,0x3d17819c,0x3d8e61ec,0x3cb0acbc,0x3d747436,0x3cd55f8b,0xbd4ea2be,0xbc620bd4,0xbd11cd70, +0xbe25e6aa,0xbe7d3a6d,0xbe9457a0,0xbe6901c8,0xbe1d5e49,0xbdc27429,0xbd66ac56,0xbda965b8,0xbd61a7c1,0xbe2af1bb,0xbe35574d,0xbe0944b4,0x3e81695b,0xbdc30df7,0x3ef093cb,0x3eb87d9f,0x3de225fe,0x3d007681,0x3d3d646e,0x3c9dd628,0x3d115c36,0x3d68d24e,0x3d967aa3,0x3d51e0b3,0x3d8e49f7, +0x3d406c8b,0x3c90c143,0x3beff203,0x3ca915e5,0x3cf058d0,0x3c16ea6a,0x3db3bba2,0xbcb9b32e,0xbdbb2ef0,0xbd54a81a,0xbd074ee5,0xbc88b9af,0x3d092848,0x3dc0f9cf,0x3e42c018,0x3e5bf27a,0x3e1a8663,0x3e2f3c21,0x3e246ffa,0x3e557f31,0xbc2579d2,0xbe696822,0xbf1953a7,0xbe59dc2d,0xbe2d58cd, +0x3e45afbf,0x3ee0d432,0x3e87393b,0x3e1d8296,0x3e011dde,0x3da2fd77,0x3d960f1f,0x3d2f7d38,0x3ceefe3a,0x3d4a8901,0x3d3a0f53,0x3d2a2141,0x3d0f5b55,0x3d271ae5,0x3d0653dc,0xbbb866fa,0xbbd9d7d8,0x3d91c2f3,0xbd19ba1e,0xbdb90ac6,0xbcccbcd4,0x3caf3932,0x3ded6244,0x3e36edde,0x3e54b13a, +0x3e813102,0x3e7d7954,0x3e479a3f,0x3dee9ad5,0x3caed420,0xbcce1b42,0xbde7dc27,0xbe011d0f,0xbe5cd0f6,0xbdef4519,0x3c0895a3,0x3dc56aeb,0x3e72e8bf,0x3e02802c,0x3db933f8,0x3db9e552,0x3d69c6fe,0x3d2fa59b,0x3c87d13e,0x3c8f2878,0x3cba5a1f,0x3cad1476,0x3cdc11ee,0x3d32b3eb,0x3d21b4d2, +0x3d374689,0x3cb0b9a4,0x3d3de70a,0x3d13f4f6,0x3787da2b,0xbc50fd73,0xbc310bd4,0x39527127,0x3a5c070e,0x3c98d012,0x3d65e69e,0x3de18d94,0x3e119f2e,0x3e1498fe,0x3e0123f0,0x3d8b059f,0xbd47deb3,0xbd4b597f,0xbc80f65d,0x3c3d207d,0x3d44afe5,0x3d2502bf,0x3dc0200a,0x3de81f90,0x3db1ea80, +0x3debac01,0x3da132f2,0x3d7ca051,0x3d0a32b4,0x3d6aede9,0x3d28352e,0x3d8f29a0,0x3d485fc2,0x3d557b51,0x3d822124,0x3d2c6ffc,0x3d7af001,0x3da1fddd,0x3d8ad771,0x3d1c332e,0x3db564f7,0x3e070ba6,0x3e053f1d,0x3e136cd1,0x3e1d8517,0x3e2ca6ee,0x3e36f23e,0x3e2b6140,0x3e20b92d,0x3e1ad12d, +0x3df54446,0x3dd13c47,0x3db05781,0x3d92deb3,0x3d4a1511,0x3ce05d66,0x3d55f7b8,0x3d3e58c6,0x3d6ba750,0x3e21f01e,0x3d86e0eb,0x3dcf07b5,0x3dbed41d,0x3d8842cf,0x3d8ec8fc,0x3d40a4b8,0x3d8c6fd3,0x3dc28035,0x3da8b5f1,0x3d87c064,0x3daacddc,0x3dc2da73,0x3dcf913d,0x3db346c2,0x3da93685, +0x3db26b8c,0x3df1e285,0x3dd7066f,0x3dcc3937,0x3dc7ef4a,0x3db68d7b,0x3da13a30,0x3d94e98b,0x3d8d6a95,0x3d7f6212,0x3d5fc647,0x3d433cbf,0x3d2435a0,0x3d00694e,0x3d111b2e,0x3d386708,0x3d42eba3,0x3d5a421c,0x3d3f8cb1,0x3cbcb892,0x3e0700b0,0x3e317ec2,0x3e2cbdae,0x3dc44fb3,0x3e26bfe2, +0x3e309e40,0x3e372ea2,0x3e34b558,0x3e284792,0x3e31ce7f,0x3e38a514,0x3e3411e6,0x3e2a5247,0x3deb55be,0x3e1dee8f,0x3e30b09d,0x3e11db9c,0x3d916ecb,0x3d960767,0x3d9fff3e,0x3d9e020a,0x3da46323,0x3dac17f6,0x3db33eb8,0x3da00e1c,0x3d90e4c8,0x3d823118,0x3d6bc8f8,0x3d50db1d,0x3d2b82a8, +0x3d3519d6,0x3d31b639,0x3d323306,0x3d32230a,0x3d53ed89,0xbce4b897,0xbc3d8a07,0x3c3e2114,0xbdbe9d89,0xbdf13abb,0xbd8892e7,0xbd9290cf,0xbdde3ef6,0xbd8643cd,0xbd88d7e5,0xbd809e11,0xbd4b945e,0xbd66437c,0xbd690da3,0xbd53c9f0,0xbdd505bf,0xbda5b30e,0xbd44020a,0xbdd4890b,0xbdba0659, +0xbbe86b3a,0xbcb44952,0xbcbec94a,0xbcd43675,0xbcdd4bf5,0xbcf2a625,0xbd09c62f,0xbd1be135,0xbd3597fd,0xbd56b0a8,0xbd6cbf45,0xbd6ee13f,0xbd6c42a6,0xbd1fe508,0xbcd0d57b,0xbbe5593f,0xbbfa5d08,0x3d0cb51d,0xbc579fe5,0xbe08898a,0xbcd1ba5d,0xbd949aa1,0xbd5a9371,0xbd16373d,0xbce8c59c, +0xbc699de3,0xbcf67fbe,0xbd491ac1,0xbd19d64a,0xbcd17dc5,0xbd1d0682,0xbd1f5a24,0xbd17505f,0xbd542f49,0xbd06c64d,0xbd875a85,0xbce6c871,0xbc278191,0xbcc75f70,0xbce7f6ba,0xbcf476b9,0xbd0aa923,0xbd34d97f,0xbd525538,0xbd903853,0xbdc930df,0xbdff213e,0xbe055ef7,0xbdf43661,0xbd95ec7a, +0xbd060980,0x3c8160f2,0x3c90c17f,0x3df6fd0f,0x3c1d71dd,0xbd93cd10,0xbc8e89eb,0xbd5e2c4e,0xbd0bc9d7,0xbcc8e9eb,0x3b42b551,0xbba6000c,0x3ca3338b,0xbc406ff7,0x3c9334f0,0xbba311ba,0xbc496dea,0xbcab77c8,0xbc9dfc40,0xbce6ae1e,0xbcb7cbc5,0xbd26bb61,0xbc9b1a35,0x3b1f7530,0xbca33b85, +0xbd07048d,0xbd21d1a9,0xbd49214a,0xbd97a081,0xbdb4f86d,0xbe016a32,0xbe2e32c6,0xbe56a6fc,0xbe63bfe3,0xbe4dfd84,0xbde2a17a,0xbcde70a3,0x3d9a3f4b,0x3d9d213b,0x3e557257,0x3c5ea1ed,0xbd800ffd,0x3c9e0e9a,0xbb641a1d,0xbcc9ba87,0x3ac5c306,0x3d309f71,0x3d2f25a0,0x3d2d8bf2,0x3d737ee6, +0x3d4c6da0,0x3d24e1e2,0x3cf09272,0x3cf510aa,0x3ccdeb04,0x3cbbb0c1,0x3cf01f2d,0x3c0c15c2,0x3c27295c,0x3c4c91c0,0xbbd7e23f,0xbccb0f30,0xbcd4bb52,0xbd1957a7,0xbd64f88d,0xbd85cd14,0xbdeec96c,0xbe4a25ce,0xbe989297,0xbeac625c,0xbe9c2472,0xbe2be394,0xbd3752d4,0x3df488d3,0x3e0400fd, +0x3e9d5dc1,0x3e0d8ba4,0xbd581d1d,0xbd19bc75,0x3aaa5b3d,0x3cb80592,0x3d63bedd,0x3cefdbbd,0x3d0d168c,0x3d0b2ff3,0x3d0c21fe,0x3d2b41bd,0x3d311619,0x3d00d71e,0x3cd6831b,0x3c735ae9,0x3b85f9e5,0xbc3a13cc,0xbd10bf97,0xbca808b2,0xbc111582,0xbd4799cc,0xbdcb16b5,0xbdf4964c,0xbe2206bb, +0xbe5ca4b3,0xbe98587a,0xbeb05e02,0xbec62d1b,0xbeaf32f9,0xbe927654,0xbe80653c,0xbdc99c04,0x3d2eaad2,0x3e6adb48,0x3e76dcf5,0x3d159b17,0x3df7e611,0x3d11c503,0xbcb65ecd,0xbc85ca64,0xbd55b2a4,0xbd191bc9,0xbd0e6016,0xbb4c4827,0x3c853abb,0x3d48a651,0x3d4ea7ae,0x3d45164a,0x3d0691db, +0x3d15caf0,0x3cd6da17,0x3c8da004,0x3aceecf4,0xbbdd8798,0xbd4ea9ab,0xbd874012,0xbdb3f9e2,0xbe04509c,0xbe60c540,0xbe9b69ab,0xbec2f5fc,0xbebf1ed9,0xbebe1df4,0xbed3208e,0xbe7e519c,0xbe17b3d6,0xbd74de0b,0xbe4bbfb0,0xbe7e5f5d,0xbe6991a2,0xbd5b062d,0xbf2f5d90,0x3be4be31,0x3e817b7f, +0x3d13fbbe,0x3e033968,0x3d34a329,0x3d87bb18,0x3bf3317e,0x3d4042e2,0x3d1d4779,0x3c5892a4,0x3d850fc6,0x3d89902f,0x3c6c19fe,0x3cc8ffc1,0xbc8a5cfa,0xbcf007c4,0xbd8d57bb,0xbda8b4db,0xbde186a8,0xbe26993f,0xbe1e54fb,0xbe017676,0xbd8faff7,0xbd2ef9c6,0xbd734528,0xbb857724,0x3d5714df, +0x3dc11138,0x3e816362,0x3eaeadec,0x3eb33afc,0x3dd86bc4,0xbe45b589,0xbf321009,0xbf2f301e,0xbf266972,0xbf015b27,0xbcd651e6,0xbe238aeb,0x3ceec5b1,0xbd6762bd,0x3c0ec626,0xbc41735b,0x3d3ecd2c,0x3d337703,0x3c703248,0x3d2fdbfc,0x3d09eb9c,0xbd07ee67,0xbd178278,0xbd3517a5,0xbd9b1620, +0xbda27d58,0xbdb64925,0xbdd557fb,0xbd04dab2,0xbc1d85a6,0xbc84df69,0x3c9b4a9c,0x3d3acdc2,0x3d69000a,0x3da895e9,0x3e0c4cec,0x3e652249,0x3e26a83c,0x3df00e44,0x3d760dd8,0xbd3003d0,0xbd52b2db,0xbdaa6e37,0xbeac9e3d,0xbdeaafbc,0xbea467fe,0xbe57abcc,0xbe0863d5,0xbde3d1dc,0xbcadbd8c, +0xbc2d6e02,0xbc11bacb,0x3d20805e,0x3d55fc6b,0x3d538aa6,0x3d2ce72c,0x3d1adb6f,0x3cc33bdd,0xbb4051db,0xbcb1d369,0xbce5ce79,0xbd61a107,0xbdcf59b0,0xbe01f3ef,0xbdaed8ed,0xbd55cc6a,0x3d6e7b62,0x3d84787d,0x3da697f3,0x3db41ae0,0x3d96b1cd,0x3d8f5233,0x3dd1985a,0x3e20ed12,0x3e1da887, +0x3d927e6c,0x3cc9ba5c,0xbd7d11e1,0xbe12dfe4,0xbde6e238,0xbdd34cf1,0xbe3b295c,0xbcbe936e,0xbbbb89e1,0x3d15616e,0x3cfc360d,0x3c244b34,0x3bc8813a,0x3bb49ad7,0x3caaa5a2,0x3d20ca72,0x3d46e526,0x3d45d2b0,0x3d27f077,0x3d56050c,0x3cfd922c,0xbb68ea4a,0xbc2d4598,0xbc986eb6,0xb9755281, +0x3ce50f87,0x3d3e738e,0x3dcb4377,0x3da517b7,0x3d7b3124,0x3cf9027d,0xba7ea581,0xbbf7b86f,0xbbd9bd5b,0xbcc6ed7b,0xbd1bdede,0xbb916a3d,0xbc25fff8,0xbcf4a221,0xbda09d75,0xbdb96f47,0xbd0f17c0,0xbcefe97a,0xbd1a11d8,0xbd777edc,0xbd3c0453,0xbcde7fb1,0x3b59b371,0x3c974362,0x3ceabc47, +0x3c999d14,0x3cb1e97a,0x3ca76619,0x3d7494a5,0x3d5e4de7,0x3dad219b,0x3dc1e8c6,0x3de8bf4b,0x3dfbb7ab,0x3df13049,0x3e061f42,0x3df3caa7,0x3ddda7ca,0x3dbec8f6,0x3da9c9b4,0x3da23087,0x3da5ec2f,0x3d3cbd42,0x3c49fc94,0xbcb9b9f8,0xbc88f59c,0xbc676506,0xbc32f0bb,0xbcdaa2d0,0xbcf8ee3d, +0xbcbda9a0,0xbcf8b9d5,0xbcd45718,0xbd2881f3,0x3d3e3ee9,0xbb502d67,0x3c327927,0x3c1a6b1f,0xbc1a7405,0xbbfbf643,0xbc968e04,0xbccb2a55,0xbca89bcf,0xbcf3c7ac,0xbca8d013,0xbcd1ec1f,0x3c074f97,0x3c84ad00,0x3c9e89ea,0x3d27f4de,0x3dc83285,0x3d465277,0x3d3dd27d,0x3d5505a7,0x3d624502, +0x3d63e004,0x3d5082c8,0x3d454a67,0x3ce7baab,0x3c9c2f15,0x3bd90ce2,0xbb26feac,0xbc638955,0xbcbc628d,0xbc9cabba,0xbcaaaad8,0xbcd0ac15,0xbcea71f3,0xbc0dd7db,0xbcb74789,0xbd277a76,0xbc869937,0x3d992774,0xbd451441,0xbc889500,0x3d6ade53,0x3d78ef53,0x3d826400,0x3d8b124d,0x3d90896e, +0x3d927935,0x3d949bca,0xbc23cb34,0xbce68b40,0x3dcbec6b,0x3c5ac6e4,0x39f49471,0x3980a040,0x3c09f9ee,0x3b60234a,0x3af47ad9,0x3ab54983,0x3b12377e,0x3ba9b89c,0x3b85009f,0x3b3c33c6,0x3ae4f761,0xbb1c4ecb,0xbbbb58a7,0xbc30b3a7,0xbc4036ed,0xbc4fdcbc,0xbc417c32,0xbc5e39ee,0xbc4dc6d9, +0x3d183f3f,0x3d64b965,0x3d644f9d,0x3da9218d,0x3d35116e,0xbd71fff1,0x3da67efe,0x3d2fefd0,0xbd0ff50f,0xbd1424c2,0xbd1bd401,0xbd3a08b2,0xbd3e02e1,0xbd47bb14,0xbd6537c8,0x3d190b20,0x3d858432,0xbd899a78,0x3cec703d,0x3d689d06,0x3cd02998,0x3cd32d27,0x3ce9b11b,0x3cd9e5fb,0x3cdd45ad, +0x3cdda33b,0x3ceb31d1,0x3cd92643,0x3ccc01da,0x3cba2378,0x3cc84964,0x3cd7645d,0x3ce1bdde,0x3d04a80b,0x3d25bfd0,0x3d5f0680,0x3d7618a0,0x3dc4c0d9,0x3de7e9ec,0x3d3f256b,0x3da01baa,0x3d7e6258,0x3d42f7e0,0x3d55a22b,0x3d1bafd5,0x3d3f3f86,0x3d6b29a3,0x3d5c9e7d,0x3d726790,0x3d335d84, +0x3d2ce305,0x3cb79c83,0x3ca0d8c1,0x3d20b52e,0x3caa273c,0x3bd21ab8,0x3cebd257,0x3c43cfd0,0x3caeb1b2,0x3c734509,0x3c8172b9,0x3c7878c3,0x3c95cbcc,0x3c638cd1,0x3c41a067,0x3c068672,0x3c198156,0x3c47ed2a,0x3cb5a16e,0x3d021685,0x3d61acec,0x3db99072,0x3dda44ec,0x3e1b9881,0x3e133b66, +0x3e0cb457,0x3de78a00,0x3da3994d,0x3d7b1188,0x3d538bea,0x3d3485ac,0x3d307627,0x3d100e43,0x3d390486,0x3d192a1e,0x3cddc72b,0x3cc8afb0,0x3cad0d36,0x3c942645,0x3b921bd0,0x3b508881,0x3cbb8646,0x3b232c20,0xbc39fddd,0x3a12ab26,0xbbd6a02a,0xbbd1531d,0xbc2c97b9,0xbbf22263,0xbcb548e2, +0xbd0489d0,0xbd226d9f,0xbcee0041,0xbc596a40,0x3b066fae,0x3cca8a1e,0x3d8aa651,0x3e14f1c0,0x3e2a03d5,0x3e44c450,0x3e4d821a,0x3e3f0cc8,0x3e08a189,0x3df8eefa,0x3dbce99f,0x3d8d4256,0x3d1a9cf9,0x3d176c4d,0x3d1576fd,0x3d2c0e6a,0x3d225a2d,0x3d0d695e,0x3bdd4156,0x3ca7c93e,0x3bf849ab, +0x3c7d9831,0xbbcbffb8,0x3cb45ab1,0xbca24a00,0xbd1ede0e,0xbc717e1d,0xbcda19c8,0xbced5533,0xbd07a050,0xbceabd3e,0xbd40c3a7,0xbd62040a,0xbd7f959c,0xbd7defdf,0xbd604f82,0xbca1669a,0x3c791ce8,0x3dcf9aed,0x3e5d8311,0x3e6ff441,0xbdc505a0,0x3d054310,0x3e1b6f84,0x3d70b534,0x3d3dc54c, +0x3d38989a,0x3d366be3,0x3d8878e5,0x3d8870e6,0x3d6290b6,0x3d28ccf9,0x3d27e720,0x3d1f642c,0x3d11a5ed,0x3cbbe46d,0x3b84746d,0x3c611216,0xbcd1c78a,0xba9ec4a0,0xbcda9a98,0xbd6d8705,0xbd362376,0xbd995b5b,0xbd4c7261,0xbda2513c,0xbe1849c2,0xbe24332a,0xbe2b43a7,0xbe1b05b6,0xbc9c4246, +0x3d789816,0x3e1ae6f0,0x3d725951,0xbbca4477,0xbd85a1c3,0xbb84d4cd,0xbee7eaca,0xbde104fb,0x3da13c67,0x3c2ac443,0x3c9f0764,0x3d096f1d,0x3c4d8e63,0xbc0e8889,0x3b54240f,0x3cc2f3b5,0x3d17d108,0x3d6c9463,0x3d6e976b,0x3d115216,0x3ce56c95,0x3c7d99d1,0x3c3ae7c7,0xbc989793,0xbd10f650, +0xbd5ebc5a,0xbdaadaf7,0xbd8c3e27,0xbd2300ab,0xbc0f4286,0x3cc9cefc,0x3d823ed4,0x3db518c1,0x3e26542e,0x3e97a75a,0x3e9fe17c,0x3eb0e239,0x3eb74fe0,0x3e6b8048,0x3d87d134,0xbe602a16,0xbecae48c,0xbc90cb5a,0xbece7657,0xbe85ea49,0xbe0d2f64,0xbd9d6c7e,0xbd357a48,0x3b5eec23,0x3b3321a2, +0x3d5a86f7,0x3d61f4dc,0x3b303752,0x3d6eeb0b,0x3d2cbc7e,0xbcb6e2c4,0xbcb82906,0xbd2d201f,0xbdb0ffd9,0xbd8e99fd,0xbdb6bed8,0xbd03c18d,0x3dd6a6ae,0x3e2563af,0x3e8dd5d8,0x3ee2f62a,0x3f0f126f,0x3f2121c3,0x3f1ba795,0x3f0b1684,0x3eed0b57,0x3ea8efbe,0x3e9d5f59,0x3e878b92,0x3ec2a0bc, +0x3efdd764,0x3f3291d6,0x3e9da187,0x3f3084ce,0xbc987f09,0xbea8fa34,0xbc8c4c9e,0xbd952abc,0xba2b50a0,0xbc63fbb5,0xbc58ea16,0x3c68490d,0x3cd06bdc,0xbc88f05c,0x3d2f6ffa,0x3d44bb50,0x3c2fe059,0x3c47c1fa,0xbbf71edf,0xbcaecfe1,0x3bbe2104,0xbd7cb53e,0x3d43e3f7,0x3e1bec77,0x3e2fe324, +0x3e7867e2,0x3e8eabc8,0x3eaf0d58,0x3ed8b71e,0x3eccaf89,0x3ece010c,0x3edd52fd,0x3ec5deb2,0x3e9adb03,0x3e2a8e18,0x3e978add,0x3ed1ae33,0x3f3aac4c,0x3f1a16e0,0x3ecfd7b1,0x3e875d5f,0xbd4c3c27,0xbd4f51a2,0x3c647894,0xbcadaa2e,0x3ca84d7a,0x3d04c83a,0x3d4ba744,0x3d6b8927,0x3d385c2b, +0x3d204e59,0x3d0d27da,0x3d0a425f,0x3c7c3282,0x3bb53ebd,0x3d175b10,0x3c9bdf35,0xbd449ebc,0x3da674d4,0x3e0efe65,0x3e10f924,0x3e329ae3,0x3e252136,0x3e1641f0,0x3dead975,0x3df122d9,0x3dc124c0,0x3ce63746,0xbbfe1de8,0xbb008768,0x3cbf4109,0x3da6cd9f,0x3e36bc4b,0x3ecb01a2,0x3ec1cf6d, +0x3e2a2360,0x3e34e48d,0xbd5504ab,0x3c07c4a5,0x3af8b7a0,0xbc21ace7,0x3bc75f41,0x3c2af6b4,0x3d09437b,0x3d134e4e,0x3d254d62,0x3d636e5c,0x3d6e08bf,0x3d1669b3,0x3d554d63,0x3d858f45,0x3d9bbc16,0x3d790039,0x3d732988,0x3d8fbe39,0x3d685fbc,0x3d6ef555,0x3d62e517,0x3d86cc00,0x3d7a69a8, +0x3cc2d50f,0xbc8b3261,0xbd8320bf,0xbdb6119e,0xbdad901c,0xbd1e5e18,0x3d0efe52,0x3d57014e,0x3d61a110,0x3d8c8b6b,0x3df908e5,0x3c833634,0xbbb8de94,0x3caa50af,0x3d38829b,0x3cf2c091,0x3cea9243,0x3c82c7d5,0x3c8ed361,0x3c2ab8b8,0x3c94ab92,0x3c96222e,0x3c97fce6,0x3c9f72fe,0x3c7cfc99, +0x3d2242c5,0x3d029a21,0x3d0ac139,0x3d365dd0,0x3dab1cc9,0x3d083a86,0xbc087edd,0x3bb907d6,0xbc31c27e,0xbc733c72,0xbcd6c2ff,0xbd052a26,0xbc5f9ca2,0x3b5592cb,0x3c8bfdc4,0x3ca65bfb,0x3c891dd3,0x3c03130e,0x3caaf108,0x3d0ae299,0x3d018fb5,0x3c954bf5,0x3cd795f4,0x3d0ac006,0xbd0db45e, +0x3b2c29fe,0xbb5b9f9d,0xbb01e286,0x3c6aeda1,0x3c4e53ed,0x3cc9a599,0x3d0ef80e,0x3d0cd3de,0x3d38046e,0x3d37cf1b,0x3d37ae67,0x3d075730,0x3ca5f7a2,0x3d22b97f,0x3cd793aa,0x3d1d9559,0xba8b1149,0xbbb38c83,0x3a2fd9c0,0xbb0f359d,0x3af0e35a,0x3bb87e55,0x3bdb0a28,0x3c1ed745,0x3c4f34dd, +0x3c9db147,0x3cca78e1,0x3cfbd153,0x3d104228,0x3cf7ae32,0x3cc647ec,0x3cd5be0d,0x3ce27e5d,0x3cb3d9e2,0x3cfcb795,0x3d36676a,0x3ca37204,0xbd102861,0x3d4b2827,0x3c9faadf,0xbcd88f6f,0xbce9774a,0xbcfbdbc9,0xbd0543e9,0xbd0bbdb4,0xbd12c1ca,0xbd11b563,0x3cf54099,0x3d45daff,0xbcab3c1d, +0x3cabc7cc,0x3d0903e1,0x3bbbcc6e,0x3c6e4440,0x3c3438a1,0x3c2e7a16,0x3c0dbb24,0x3bc35a54,0x3b508646,0x3be4a589,0x3c1e4f18,0x3c3dddc3,0x3c701c99,0x3c993788,0x3ccf2a4b,0x3cd09dcb,0x3cdbb5da,0x3ccff690,0x3cd57974,0x3d03de98,0xbdc3abcf,0xbdc9d8bd,0xbe0672df,0xbd73c1c5,0x3c9eb2ea, +0x3df354f7,0xbdb45d51,0x3a8a7655,0x3db87692,0x3dc32fb8,0x3dc198c1,0x3db47b4a,0x3dc9567c,0x3dcaace7,0x3dc95460,0xbb5ba32c,0xbd9b26be,0x3dd60cd6,0xb9662f82,0xbd75eb31,0xbdd5adfd,0xbdb0bec6,0xbdbf5d18,0xbdb94238,0xbdbc1263,0xbdbc7d13,0xbdbb50d2,0xbdba5ac0,0xbdb832cc,0xbdb4fc23, +0xbdb7512a,0xbdbb91f4,0xbdbefa93,0xbdd69f88,0xbde33b9b,0xbde71c18,0xbdea6e0a,0xbe1a7b9f,0xbe0f1094,0x3dc58892,0xbd979d9c,0xbc01d552,0xbc732441,0xbd3e0112,0xbd16d046,0xbd77d469,0xbd672786,0xbd10cfb8,0xbd6722b3,0xbd533dcf,0xbd4ffceb,0xbcc68fa8,0xbd16c67d,0xbd72b61c,0xbd6be629, +0x3bed0934,0xbdce2291,0xbdcb0a81,0xbdd36f15,0xbdc4f8a8,0xbdc3f50f,0xbdbf4295,0xbdbe861a,0xbdc578d8,0xbdc7ecc4,0xbdc446fb,0xbdc7ad1f,0xbdd8d12f,0xbdea82e6,0xbe187543,0xbe270f9e,0xbe26e156,0xbe25632b,0xbe7e483d,0xbe187ea0,0xbc75f6be,0xbd50c663,0x3ce1a09b,0x3a3aee1c,0xba0950d0, +0xbc465ee7,0x3c68acde,0xbc096e43,0x3c077aa6,0xbcda9110,0x3c4b8ceb,0xbcb24b92,0xbc0f8a78,0xbd0bac17,0xbd1579ce,0xbd232b69,0xbd6975dd,0xbdabad77,0xbde1221f,0xbde35c0c,0xbdd5a735,0xbde20db9,0xbdeae338,0xbdeef9de,0xbdfe9e74,0xbdfc50d8,0xbdf42895,0xbdf09e6b,0xbde9fafd,0xbde4305b, +0xbe3bea3b,0xbe669a3c,0xbe798adc,0xbe74df35,0xbead49d6,0xbe0c8730,0x3d1e800e,0xbc8c942f,0x3ca882e2,0x3d1eae45,0x3ca7f44d,0x3ce24fe0,0x3ce47f06,0x3d035a3b,0x3ce049fa,0x3d2ed812,0x3cb2511f,0x3b5c3f4b,0x39234fac,0xbc89b098,0xbcbd8e46,0xbd2ec8ae,0xbd5250c6,0xbda20f98,0xbdca0d75, +0xbdddcf52,0xbdbd3497,0xbdba0e61,0xbdb729a2,0xbdcfc7c3,0xbe047756,0xbe136cc8,0xbe17b223,0xbe0d2c8e,0xbe07715e,0xbe0e64c2,0xbe83f67c,0xbe9a7ebe,0xbea342f7,0xbe96f8dc,0xbeec4722,0xbebf5f18,0xbe4820d0,0xbe08f86d,0xbdc88397,0xbd8a1645,0xbda89127,0xbd04b2fa,0x3b088745,0x3ca905d5, +0x3d0ace44,0x3d1231ac,0x3d153d18,0x3cdb8c9a,0x3c45cb06,0xbbc6e270,0xbc582573,0xbd191c33,0xbd8b6605,0xbdf6ef83,0xbe0ba333,0xbe168b1a,0xbe208cec,0xbe572994,0xbe70b0fe,0xbe6606fc,0xbe49f4fa,0xbe2aa375,0xbddcae67,0xbddb2abd,0xbdd0e931,0xbd703050,0xbe08b91b,0xbe688202,0xbec179bb, +0xbee57193,0x3d7c6c40,0xbe53d233,0xbe54261b,0xbdcc30ca,0xbdbc4225,0xbd16f441,0xbba2c426,0x3c0192bf,0x3c144eee,0x3cc403ae,0x3cb63fdd,0x3d3eda88,0x3d30619c,0x3c5fc389,0x3b811054,0xbc88976e,0xbd50de15,0xbd764263,0xbd9e9fca,0xbd2ed0e0,0xbce67592,0xbc6694a1,0x3d35cfa3,0x3e3474de, +0x3e9d3b39,0x3ed4e692,0x3eec09f7,0x3eea22d3,0x3ee1b198,0x3e6902fd,0x3d0cb503,0xbe107baf,0xbdb70c28,0x3cd7d241,0x3e7ae487,0x3e17a385,0x3ed924ba,0x3dd95a8d,0xbe18eddd,0xbd07f7a0,0xbdb3974a,0xbd17a5dc,0xbd5ba6d1,0xbceb9fe3,0x3c82b588,0x3cf230ff,0xbc648dba,0x3d0ae73f,0x3c57f647, +0xbd2c7905,0xbd3fb311,0xbd4a17c4,0xbd5bd07b,0xbc9bc1cc,0x394ae8d9,0x3d1ea96d,0x3d5dc3a5,0x3db44a2b,0x3e065547,0x3dcde5f9,0x3d749b24,0x3bc42009,0xbbb8b3e9,0x3cb1f43a,0x3da7844d,0x3d757eec,0xbd81fea4,0xbe451903,0xbe756ed7,0xbe66632c,0xbd0b03fb,0x3e4e3657,0xbe587ee4,0x3e93ef16, +0x3e661334,0x3d93bc5e,0x3cc39d4c,0x3c1a534c,0x3c6783c1,0x3cc9f8b1,0x3cd26248,0x3ce32bf0,0xbca02379,0x3d044d3f,0x3d39cc15,0x3d0aa880,0x3d187fb3,0x3ccfd3f1,0x3d230bb7,0x3c22b004,0x3d59f9d1,0x3d1a9f23,0xbd51c2b6,0xbd84027a,0xbda11d32,0xbe125e19,0xbe446889,0xbe659354,0xbe85b728, +0xbeb33bd8,0xbf010c49,0xbee0ef2d,0xbec4f56e,0xbe8c13d7,0xbec07bc7,0xbeed861d,0xbf23164e,0xbeca0ce1,0xbee006e4,0xbe05a019,0x3e45dfd1,0x3dc358db,0x3d0b1732,0x3d5593c9,0x3c116cbf,0xbcb9630f,0x3c1e5898,0x3c3053be,0x3c91f438,0x3c3c8aa2,0xba09ebbd,0xbbe7b2c8,0x3c6cb53a,0x3d16f581, +0x3d1e43af,0x3d317b87,0x3dc51435,0x3d1459ba,0xbd107796,0xbd43008d,0xbdfff798,0xbe311fec,0xbe77b9d5,0xbe9e081b,0xbebd54bb,0xbecb9176,0xbed36f56,0xbec6810f,0xbebed739,0xbea9ee37,0xbe981ca6,0xbe89d2e1,0xbe9f4744,0xbeb5668c,0xbe1ed5b6,0xbdb58204,0x3dd15cba,0x3c627e1b,0x3c21fb60, +0xbac3da45,0xbbbd02bc,0x3c9f8366,0x3c48def6,0x3c629937,0xbbdfd1fa,0x3c5731c6,0x3c2b8e11,0xbb06a57e,0xbcb71880,0xbd0b7b46,0xbd540281,0xbbe46cd3,0x3ced8acc,0xbd12a28a,0xbdac636e,0xbdc4cf73,0xbe1f31a9,0xbe49b033,0xbe5a2e19,0xbe4ad8a0,0xbe0830b6,0xbd9623ac,0xbd12e297,0xbc3f4bb3, +0xbd0ccbc5,0xbdf6cbd0,0xbe022714,0xbdf9a23c,0xbdcbb10f,0xbdf057b7,0xbd87f41d,0xbc318a80,0xbc1330b5,0xbc86eeda,0x3ca70648,0x3c08b849,0x3c05f523,0xbb9f3b12,0x3c673250,0x3b1fcd1f,0x3ce7039c,0xbc6d5821,0x3c50b502,0xbc99e4c4,0xbb31f857,0xbd019a47,0xbceacc7d,0xbd48b846,0xbd536780, +0xbdc7ee26,0xbdcb3543,0xbd797ad7,0xbd105ff9,0xbd0ac582,0xbd1cbb30,0xbd3c8d32,0xbd7ade25,0xbd991054,0xbdaa7b3a,0xbdd294fa,0xbdea9a91,0xbdffb90d,0xbdf9e3f7,0xbe02bed0,0xbe0eb641,0xbdbd8de9,0xbd879def,0xbd8f3db4,0x3d054f8e,0xbd441b9d,0xbcb894ff,0xbc928e2b,0xbd26e1fb,0xbd0dd16d, +0xbd523858,0xbd507a5d,0xbcbc98f0,0xbd34eb40,0xbd322478,0xbd0eacb2,0xbc30d09d,0xbcaaef9d,0xbd2dc154,0xbd0e61a3,0x3c7efdae,0xbd463bad,0xbd279dbf,0xbd4f2e80,0xbd6863e7,0xbd69e5cd,0xbd5c1851,0xbd42aa30,0xbd5ee387,0xbd7b5190,0xbd8d3c3f,0xbd9d559a,0xbdaac0a2,0xbdbad4a4,0xbdb05459, +0xbd9ecf15,0xbd94f326,0xbd8a6fc7,0xbd931a28,0xbdb4cc66,0xbd18d00a,0x3c4868c5,0x3da25a9f,0xbd81d5c2,0x3bbedd39,0x3d902d55,0x3d9df2ed,0x3da5ec08,0x3d9ccafe,0x3db7e2b5,0x3dc54e31,0x3dcbc5e1,0x3c0621a3,0xbd6253d9,0x3dbac611,0x3c02a21d,0xbd2bd59b,0xbdae637f,0xbd8f22a1,0xbd93851c, +0xbd8f1ce3,0xbd8f3ca1,0xbd930118,0xbd956b45,0xbd9e10aa,0xbda26fea,0xbda6f7b1,0xbda9ad4e,0xbdadf244,0xbdb6eaeb,0xbdaca691,0xbda80c92,0xbda0564f,0xbda0cb21,0xbdb71d8e,0x3d614f99,0x3d1098b2,0x3d96c6d1,0xbd3be8a9,0xbde43e39,0xbe1a9d2a,0x3b2e0173,0xbdb7a8c1,0xbe18744e,0xbe1b220a, +0xbe18c254,0xbe0abd3e,0xbe183626,0xbe1a74b9,0xbe16889f,0xbdb6b66a,0xbbc3de52,0xbe22edfe,0xbdc1eb0a,0xbd017ec7,0x3db07dc3,0x3d4dad22,0x3d77c201,0x3d811985,0x3d859aaa,0x3d89505a,0x3d8e38cf,0x3d8a3b55,0x3d890c02,0x3d842fa6,0x3d82afc6,0x3d7ca742,0x3d763bf7,0x3d6f2046,0x3d5895a7, +0x3d13da79,0x3d31d164,0x3ca7a226,0x3bec5b15,0xbe1dabe1,0x3c3d44ee,0xbd37b94a,0xbd1f815b,0x3a8971bd,0xbb35ab35,0x3d23bc7e,0x3cd79499,0xbc653f21,0x3c96efb5,0x3cb2ddd0,0x3c72bff6,0xbcc1a2db,0xbc3359a0,0xbbdec11b,0x3beeaa6d,0xbdcdd299,0x3d7ab578,0x3da0d210,0x3d9ecb63,0x3db94659, +0x3dc20e12,0x3dcd21a4,0x3dd2ae3e,0x3dc4563a,0x3db3f691,0x3da11ce3,0x3da40273,0x3da3428b,0x3d96f4a0,0x3d8ec374,0x3d436682,0xba5e6a13,0x3bf28ed8,0x3c35f106,0xbd31d996,0xbde3e901,0xbd656fc6,0xbd8afaf0,0xbd0c5027,0xbce7d975,0xbc96ef97,0xbc9c16dd,0x3ccf28d1,0xbcc19883,0x3d1b06c8, +0xbc81eb53,0x3cbfda59,0xbcd8e7fb,0xbb96c8d5,0xbb8fccf0,0xbbc78d79,0xbcdaafc3,0x3d2c3356,0x3dcf4038,0x3dbb43fb,0x3df7ccf8,0x3e05ed80,0x3e143bda,0x3e1f8469,0x3e158404,0x3e0fd8b1,0x3dfcbc69,0x3df9048b,0x3de775f6,0x3ddd3fb2,0x3dc74f71,0x3d7f22b5,0xbd15d37f,0xbc9f5007,0xbcd878f4, +0xbe0db756,0xbe3d862d,0xbd8a693c,0xbd768833,0xbd181bae,0xbc6504c1,0x3ba615ff,0x3d1b8e99,0x3d15886b,0x3d2a8ae6,0x3d0093e8,0x3ce59681,0x3ce4e03f,0x3c0b9667,0x3c54cc19,0xbce680fc,0x3c7da9ca,0xbd1d6c71,0x3d62837d,0x3e03d461,0x3e015bf8,0x3e22f315,0x3e2bdd1e,0x3e3beeef,0x3e4401d6, +0x3e2857f2,0x3e03c6fd,0x3dc3e289,0x3de3d28c,0x3e043870,0x3df807e7,0x3dd34d63,0x3c4c4cca,0xbe167ea3,0xbdfad7b7,0x3e9c0e6b,0x3d8d3c41,0xbe20971e,0xbd98ded0,0xbdc3f2a1,0xbda08047,0xbce53ba8,0xbd47048c,0xbc73d85d,0x3c86c228,0x3cb82dcd,0x3d2de4ee,0x3d3b22fc,0x3cea0b84,0x3cae6dd7, +0x3cb9c1b2,0xbc0885da,0x3ce5fd65,0xbcec145d,0x3d27f8f4,0x3df82732,0x3dd33219,0x3e3d687e,0x3e7e3669,0x3ea02694,0x3eb5ed95,0x3ecfafb0,0x3ee3c40e,0x3eeebb2f,0x3eb67de3,0x3e885237,0x3e1e69c6,0x3e735c61,0x3e92c930,0x3ea34bc5,0x3e7317e5,0x3ebe8df1,0x3dfaf9df,0xbd8f622e,0xbb86e637, +0x3cdcdaa8,0xbc593308,0x3beb6e15,0x3ba08d21,0x3c7a7170,0x3c7f330c,0x3cef1d7a,0x3d329b90,0x3d175b89,0x3cd691e1,0x3d005465,0x3ca3d9f3,0xba925fa2,0x3c55347b,0xbc37cbb9,0x3dafc78f,0x3e35c8a5,0x3e442ac5,0x3e6d43dc,0x3e7ec945,0x3e88a765,0x3e9483a0,0x3e870d33,0x3e4f5ab4,0x3d9b73ca, +0x3d945297,0x3d4803aa,0x3d2eac26,0x3df04b58,0x3dfc7078,0x3e21b508,0x3e8b937f,0xbe21b6eb,0x3e6e6d15,0x3e4cfdab,0x3dd7b2b5,0x3d464141,0x3d3eab12,0x3b41a379,0x3b64f7cd,0x3d0a7e06,0x3d38bcf4,0xbc5b3d2b,0x3d0fd2ce,0x3cc59d2f,0xbbe02355,0x3bcb2d1c,0x3ce9f4ac,0x3cce4e98,0x3d2075af, +0x3d458771,0x3cf64dc8,0xbd09e01c,0xbda64edb,0xbe10b029,0xbe24dc49,0xbe3424f9,0xbe3746da,0xbe7f1e7b,0xbe959aba,0xbeaa1aab,0xbe686996,0xbdd8cf1f,0x3dacd3a7,0x3d8644c6,0xbcddb46e,0xbe5427ce,0xbe75529d,0xbe1b06c3,0xbe501206,0x3ccdcb8e,0xbc354f40,0x3bd40c2d,0x3c852779,0x3ce59db9, +0x3cd59b58,0x3d0308ee,0x3cf4f049,0xbc7f5d85,0x3ce8d9be,0x3cde5f34,0x3c908dcb,0x3c7987ed,0x3bf2e7db,0x3c692ac6,0xbc605314,0xbc686a9b,0xbd55af74,0xbdd6aa8b,0xbe048a47,0xbe31b63b,0xbe4e6a03,0xbe84dcee,0xbea26096,0xbea35963,0xbe8e9ce2,0xbe4ee038,0xbe33b859,0xbdf731fa,0xbda4a7f9, +0x3caa3943,0x3e022aea,0x3e3c4c5e,0x3d2aa30a,0x3e12afa2,0xbde52732,0xbe80fc4f,0xbde867a9,0xbd60ac6a,0xbd3ee311,0xbc55e044,0x3c134a74,0x3b40f6aa,0x3cac8da5,0x3beb7313,0x3be99510,0xbb5107ce,0xbbcf6209,0xbc523e80,0xbc5ee3fd,0xbd0a2c14,0xbb05e03e,0x3c049bf5,0xbd6f48d2,0xbdbca7f5, +0xbe122cdd,0xbe39d599,0xbe4241e0,0xbe2f50dd,0xbdd52cbd,0xbdb02ffd,0xbc6ee650,0x3e02c56c,0x3e141f10,0x3e25bb9a,0x3e1d9476,0x3e3b2f91,0x3e1e9ca4,0x3dbae86f,0x3dbaf3ef,0x3cd96162,0xbd6793be,0xbde9ed51,0xbd58e2ed,0xbd4078f5,0xbcc0ff73,0xbb967ccd,0xbab85a42,0x3c9daea8,0x3c83a361, +0x3c39c9e9,0xbb5d53fb,0xbb9455fc,0xbba4e5af,0xbcb92a44,0xbd3b1361,0xbd4899ab,0xbdac1302,0xbdd015e1,0xbdb590ee,0xbd71f3df,0xbd4ccb95,0xbc7cbe23,0x3ccb74b0,0x3d086fd1,0x3cd8402b,0xbbc1808d,0xbcd88b5a,0xbd099a15,0xbcd90b0f,0xbc6046d1,0x3c953481,0x3cadd10f,0x3d158713,0x3d4379db, +0x3bf87063,0x3d17d854,0x3c1f0390,0xbcbceb55,0xbc82eb10,0xbd247043,0xbc8c11ff,0xbb887007,0x3c5a8af4,0xbb83b13e,0x3c341ada,0xbbedff01,0x3bdd3b86,0xbcc12a06,0xbcc3877f,0xbd2019a1,0xbd228c88,0xbd7489fd,0xbd6c0778,0xbd93a74d,0xbd316301,0xbcbc5f8d,0xbd26be15,0xbd270f37,0xbd44224d, +0xbd33bf71,0xbd1b3a54,0xbd0a5bf1,0xbcdd4786,0xbcc86392,0xbbd12cf2,0x3bea15a7,0x3ce62027,0x3cb380cb,0x3cafa26e,0x3d237ca9,0x3cde46ad,0x3bc86704,0xb776c595,0xbda049ff,0x3a615566,0xbcf00627,0xbced7585,0xbbf5ddfc,0xbc5cabd3,0x3b974595,0xbc35ac09,0xbd134bf8,0xbcbd5436,0xbc6a4c01, +0xbcc588b9,0xbd249157,0xbd1b3d5f,0xbcef2261,0xbcd46caa,0xbd8104e1,0xbd13f2ac,0xbd133612,0xbd06f9b2,0xbce2c1e5,0xbcc47af0,0xbcb84209,0xbcc301ef,0xbc65e81d,0xbbade4fc,0x3b5500ae,0x3c5f13dc,0x3cc9fd68,0x3d1b0714,0x3d0bf354,0x3cef97b7,0x3ca78890,0x3c2c31fc,0x3c33c343,0x3ccfe40d, +0xbd5adff1,0xbdc3b8cf,0xbdeac4b4,0xbcbd79f6,0xbdadccf4,0xbde8c330,0xbdf2f99f,0xbdefe861,0xbdde3532,0xbdeec5aa,0xbdf765ac,0xbdf4132c,0xbdbee490,0xbd1e3ce4,0xbded023f,0xbdc35deb,0xbd63c633,0x3bcb38ea,0xbb7d1020,0xba8ce611,0xba5f6648,0xb92abdd0,0x3ad40b10,0x3b29ffdc,0x3c14ac7a, +0x3c664b12,0x3c9e1c7b,0x3cba55a8,0x3cce34b6,0x3cf36248,0x3cbb5608,0x3c9fdac4,0x3c8cca82,0x3c833619,0x3c4676a7,0x3d4c45b8,0x3d47e097,0x3d21e35d,0x3db3cb72,0x3dbb8b90,0x3d1d702c,0x3d9e3a0c,0x3dbb9234,0x3d687079,0x3d7a0dc9,0x3d7a50d9,0x3d4a1173,0x3d616899,0x3d5cb7e3,0x3d4c6a30, +0x3dbf57ea,0x3da09eae,0x3d31abe4,0x3dbfb236,0x3db22d59,0x3cf8d107,0x3d3322d8,0x3d35845f,0x3d33791f,0x3d40da24,0x3d493c22,0x3d4d1154,0x3d556394,0x3d596600,0x3d5cb0ae,0x3d6a61de,0x3d76caf4,0x3d8ab88f,0x3d75d396,0x3d6b94db,0x3d5a2866,0x3d5ddf99,0x3d692148,0x3d8630c8,0x3d42e5d6, +0x3d291236,0x3d5c2b48,0x3d4f8576,0x3d3fa4fd,0x3d3b94d8,0x3d4bf534,0x3d7462c9,0x3d87af45,0x3d763d73,0x3d4d91be,0x3d75f86d,0x3d475eee,0x3d37379f,0x3d818427,0x3d3c21f2,0x3da0aa41,0x3d401f2a,0x3cf9b36f,0x3d22dd40,0x3d0674b1,0x3d16fa29,0x3d1614fb,0x3d1f28c1,0x3d3f2fe9,0x3d68e3d0, +0x3d85347d,0x3da00300,0x3db28810,0x3dd0ec5a,0x3db24021,0x3da442bb,0x3d8ee74b,0x3d9127e4,0x3dc0cead,0x3d86aad6,0x3d546ca1,0x3d32d7aa,0x3cec4edd,0x3cd4931e,0x3cee067f,0x3cd4d023,0x3d404dd0,0x3d033da2,0x3d2c30c4,0x3cada6a4,0x3d17fb38,0x3d1f7544,0x3d034a2a,0x3cc11b44,0x3d15a90e, +0x3d03119d,0x3d87924d,0x3d33c77c,0x3c9acfd0,0x3d31b40d,0x3d1392cc,0x3d69275e,0x3d8ac946,0x3da38490,0x3dc741d0,0x3ddd2f2c,0x3df3e94f,0x3e0be544,0x3e123025,0x3e260d23,0x3e07ed14,0x3e03fefb,0x3de51399,0x3dedc35f,0x3deea7a6,0x3d92d801,0x3cb67d29,0x3c828a83,0x3c4d39ca,0xbb53ecb0, +0x3b18c0e9,0x3ab85229,0x3cded041,0x3d10434a,0x3c3910b2,0x3ccda914,0x3ca1809a,0x3c62560a,0x3ab2866e,0xbbf40e84,0x3cbd56fa,0x3b8c2565,0x3d52afb3,0x3cb8ba7f,0xbc73ff7e,0x3a9cd162,0xbc51e2e9,0x3b4f5f33,0x3be73e62,0x3c880089,0x3d418615,0x3db6ccf8,0x3e01093d,0x3e25b134,0x3e2ec4c4, +0x3e47590a,0x3e248560,0x3e0f7dec,0x3df7c05b,0x3dfc2604,0x3e5fb39e,0x3e7c723b,0x3e43c5f7,0x3de1ff22,0x3ddbaf9b,0x3daa868f,0x3d97153d,0x3d2790aa,0x3cdb68af,0x3cabb6ec,0x3c8056a6,0x3d019152,0x3d10978b,0x3d141fab,0x3cbf6441,0x3c3b9153,0x3cd87081,0x3c1bbd53,0x3d7d682f,0x3d8a9758, +0x3d8a29b2,0x3e16451f,0x3e3dcb01,0x3e6df216,0x3e947028,0x3ec0d524,0x3ec2bd23,0x3eb3abcb,0x3e827433,0x3e90af9b,0x3e954910,0x3e91d785,0x3e95796e,0x3e9ca9ac,0x3ead5ecf,0x3ea491bb,0xbe291c0d,0x3df5cdc5,0x3e3f6214,0x3da077fe,0x3d906c41,0x3d38d732,0x3c9caae3,0x3c17b113,0x3c8bf744, +0x3cba844b,0x3cc6ab4d,0x3d1daaec,0x3d12db1a,0x3cea4aa7,0x3ccb1ece,0x3ce2307c,0x3d838397,0x3d710690,0x3ddc380d,0x3c9eecca,0xbdc1ce18,0xbdf13c2d,0xbe4b2aef,0xbe4004c2,0xbe5c5053,0xbe70e329,0xbe8ce0fd,0xbe8354e3,0xbe55221e,0xbde0108a,0x3cbe16cf,0x3e27020d,0x3db14f28,0xbcbe831a, +0xbe4f308b,0xbe4cc392,0xbe0385cf,0xbe029ff4,0x3d95f79e,0x3d1e9f46,0x3da9572d,0x3d3c31f9,0x3d806843,0x3cb6ae8e,0x3d690260,0x3d4b5fed,0xbbd2eb2a,0x3d272e2f,0x3d0fbb12,0x3cec7e78,0x3d033d79,0x3cb9837c,0x3d488a4a,0x3b7009ca,0x3a8e09d7,0xbd559945,0xbdc4bee8,0xbdb90a1c,0xbe200643, +0xbe4d09b1,0xbe5c26a6,0xbe20fc6f,0xbe29a438,0xbe2a8499,0xbe1ffa95,0xbe692920,0xbe6ba2ed,0xbe80c28f,0xbe4dbea2,0xbd498a0a,0x3dffed1b,0x3d24adbd,0x3e7aa9df,0x3ce68552,0xbddf4510,0xbc952b53,0x3bad3719,0x3c488aa2,0x3c2e0998,0x3bee1a12,0x3cc68554,0x3cda8c56,0xbb0d6646,0x3c76aa79, +0x3bc9879a,0x3c3a54be,0xbc91dbb8,0xbcadc4ad,0xbce2e291,0xbcbd1a8b,0xbc8db8b5,0xbd6c4693,0xbda72bbf,0xbda48a89,0xbd855a96,0xbc96f6bf,0x3d02cfec,0x3dac458e,0x3e0200d7,0x3e42ff84,0x3e8ce760,0x3e6f868f,0x3e31352d,0x3dafef02,0x3dc232e3,0x3d8b7675,0x3e16ab8a,0x3e49be5e,0x3de023ee, +0x3e1ebff9,0x3dd03b92,0x3ce6468b,0x3d3b08f6,0x3c9a29b8,0x3d0b226d,0x3d81f3a0,0x3d441c81,0x3cb56d02,0x3bbae065,0xbb0a577a,0xbb5a3250,0x3c38d991,0xbb32278e,0xbcbd2887,0xbd1c81a8,0xbd73b9d6,0xbd6fddf8,0xbd460fab,0xbc9fbf0f,0x3b9f8109,0x3d00d4ec,0x3d856f50,0x3dad877b,0x3dadfa05, +0x3e1e14ba,0x3e105d33,0x3d4b4a3f,0x3cf95e76,0x3c154bc0,0xbb4600ed,0xbd52bb17,0xbcd8f5ee,0x3d5fcb16,0x3dda53d5,0x3d939e67,0x3dd8a3cb,0x3ccfe8d3,0x3bf62750,0x3bc0e829,0x3a771c04,0x3b294d6e,0x3c51f135,0x3b456eca,0x3b18f5f2,0x3b1b387e,0x3bdb8da9,0x3af4a8f1,0xbb60f73f,0xbbe6f233, +0x3ba2366c,0x3cda8c7f,0xbbaf99a9,0xbd15c465,0xbc3349dc,0xbce3c992,0xbd1e81a1,0xbcbd227b,0x3c48c777,0x3d292af9,0x3d7fe3ee,0x3d4bcb25,0x3cf2a0cb,0x3c7effcb,0xbca400e5,0xbd018141,0xbcc2faf6,0xbc934fd7,0xbc3e1dce,0xbc0f6015,0x3d7ffa1d,0xbbe7f925,0xba8a0d79,0x3d192c9b,0x3d01cc93, +0x3d0da940,0x3cd24a06,0x3c83a8fd,0x3c2f89d9,0x3c80db82,0x3b81a79a,0x3c8d11c2,0x3a93d513,0xbb2f5962,0x3b58d98e,0xbc46a2d4,0xbc1b89a3,0xbc4778ee,0xbc5482cf,0xbc107bc7,0xbc679133,0xbcc9d555,0xbd01c693,0xbd40e3b0,0xbd07804d,0xbcbff718,0xbc3ea13d,0xbc33b85a,0xbbd6117b,0x3a1aeb73, +0x3b9394b9,0x3c5684de,0x3c81c07f,0x3cc7a7c8,0x3cfcdab3,0x3cc6971f,0x3c7dd955,0xbbf54f67,0x3b5b8e28,0x3cac6650,0xbb938d86,0x3c72bd66,0x3c318221,0x3bd2ffbd,0x3c3e1be8,0x3a9a0363,0x3c4d49aa,0x3cae4bf8,0x3c97f148,0x3c1329e3,0x3c65ccc9,0x3b2f40a8,0xbb1b95e4,0xbbc296a8,0xbcc12e34, +0xbd07832c,0xbce134d8,0xbcdd2052,0xbcc2548a,0xbcb60c4b,0xbcbc2af5,0xbcd06b98,0xbcd45a0d,0xbcb3f476,0xbc94c4f8,0xbc811f41,0xbc6aad2b,0xbc8a7881,0xbc9e3937,0xbca11df4,0xbc95051f,0xbc50b436,0xbbeda903,0xbbed2603,0xbc57dfce,0x3d33d46d,0x3d5fcdfa,0x3c83a6ba,0x3d0ddf52,0x3d59384a, +0x3cf453b5,0x3cebf334,0x3ccff891,0x3c8231e3,0x3c8872f2,0x3c7f7e14,0x3c36e19c,0x3d485562,0x3d0713ec,0x39a7767b,0x3d266aeb,0x3cfdc8ed,0xbbc3b377,0xbb71b93f,0xbb672e2f,0xbb60f5c7,0xbb4f5c4d,0xbb132427,0xbb03a501,0xbb98102a,0xbbf9df88,0xbc2650d9,0xbc4120a1,0xbc3f8ce2,0xbc3d82a4, +0xbc1bbb2d,0xbc0e674f,0xbc1d7b3f,0xbc023354,0xbb6f5982,0x3ccbbc4c,0x3cdcdcd7,0x3ceead27,0xbb17cef7,0x3b9fbcf4,0x3d610e39,0xbb794e88,0x3afb4c66,0x3d2ef1e3,0x3d3c5729,0x3d3f85b0,0x3d4ba714,0x3d481200,0x3d4e1486,0x3d664cc2,0x3b67b82c,0xbb9d5446,0x3d744627,0x3bcda8ea,0xbb931ee9, +0x3c99085d,0x3c9ce7ca,0x3c866c35,0x3c6d8815,0x3c660195,0x3c5229ce,0x3c22d95d,0x3c41909d,0x3c5e574a,0x3c90c30e,0x3ca7962f,0x3cce0814,0x3d0a30b9,0x3d0078a2,0x3d03e2dc,0x3d1f5b8a,0x3ce5809a,0x3d4e4780,0x3cecf47c,0x3cbbe377,0x3c910377,0x3c4e3e77,0x3cb236e2,0x3ca317cc,0x3c863541, +0x3cab7f04,0x3c712b80,0x3b850532,0x3c0d7e27,0x3c88a20a,0x3c7cc53d,0x3c8b4968,0x3c83c268,0x3ba816b3,0x3c7584cf,0x3ca72d73,0xba400065,0x3c2dc366,0x3affb8ff,0xba6819b0,0x3a225aaa,0x3895e51a,0xbb9666a1,0x3a978177,0x3c170e47,0x3cc15cfe,0x3cfea4fc,0x3d28eb6c,0x3d6a721b,0x3d4d928c, +0x3d5e0e80,0x3d9d80d6,0x3d6079ce,0x3d88603b,0x3d3e22f9,0x3ca849c3,0x3cc1672b,0x3c813218,0x3c2d4175,0x3c5122c6,0x3c00bba0,0x3cad6866,0x3cf7af52,0x3b1ebfb2,0x3cb1b9fb,0x3c7d399d,0x3cb8a4d5,0x3bc13b36,0x3b719528,0x3bcf71cb,0x3c0c63c9,0xb980527e,0xbc31311a,0xb97923fa,0xbc46fd30, +0xbcd0eae8,0xbcda17d2,0xbd016404,0xbd2ee01a,0xbd027b3b,0xbc9b84f5,0x3c377439,0x3cdcae63,0x3d4cdb1e,0x3db29c22,0x3d91fec2,0x3d9b5529,0x3df52156,0x3d90c1e0,0x3de84c9e,0x3d95837a,0x3d3b4c03,0x3d033fd4,0x3d02ab1e,0x3cc46d69,0x3cc100da,0x3c6bcb70,0x3cef89e2,0x3d01ed4c,0x3cabe0f0, +0x3cccfbf6,0x3c990374,0x3cd759e3,0x3b756305,0xba3dd603,0x3b6698d3,0x3c2f9a76,0x388ebcec,0xbcb9d418,0xbcac0a1a,0xbd19f6d6,0xbd55f95b,0xbd2c8634,0xbd24228d,0xbd415d32,0xbcc26700,0x3c0db508,0x3d8188f8,0x3da27b03,0x3dd99efe,0x3e1735e3,0x3df04845,0x3e0536ea,0x3e56d11f,0x3e14def7, +0xbd37f722,0x3b8da530,0x3d9db3e7,0x3d710276,0x3d3a3acc,0x3ccdabca,0x3c2350e5,0x3cf343dd,0x3cb1abc7,0x3c4c49de,0x3c6be344,0x3cc5c84e,0x3cd32730,0x3cbfbc92,0x3c66f0d1,0x3c1a67a1,0x3c047053,0x3c67f062,0x3c3689f2,0xbc1d2d23,0xbd0bc134,0xbd6bc05d,0xbdaec282,0xbe0dddd3,0xbe2ef4dd, +0xbe3fb5b6,0xbe34c6af,0xbe2dad08,0xbe305c89,0xbe2a4764,0xbe251a8d,0xbe231b7a,0xbe07c1e1,0xbdfe21d5,0xbdcf691a,0xbd9ee547,0xbe57b8ef,0xbde00865,0xbc1ecf5e,0xbbbd8342,0xbbc18b2d,0x3c8a1a56,0x3cdc709a,0x3d09fee0,0x3d0c4bd3,0x3d06e7a3,0x3cb3a392,0x3d0e8f9d,0x3cd209ae,0x3cacb917, +0x3bb71c1b,0x3ad8ae2f,0x3a8c8735,0x3b8f221d,0xbc7bab56,0xbd94749c,0xbded7bcf,0xbe309b76,0xbe5cc6ce,0xbe8c7e7b,0xbe99cb92,0xbe9de9cf,0xbe88bace,0xbe609718,0xbe0a4abd,0xbe0d0dbe,0xbe1d5339,0xbe77d63a,0xbe74f741,0xbe4dda7f,0xbe1396b3,0xbe298032,0x3c8b23a9,0xbd933052,0xbdf55846, +0xbd53a896,0xbcd1b03a,0xbc6f1c1f,0x3c1a6e02,0xb9f14046,0x3d05c0d8,0x3d2f5638,0xbba2cd79,0x3d2d2665,0x3d3474e1,0x3d1b470e,0x3c8e90ab,0xbb89bcff,0xbc0010ba,0xbccc80ca,0xbd7bf03e,0xbd8f9794,0xbda9d061,0xbdc7eb43,0xbd89d68d,0xbd726542,0xbd21ea30,0xbd162b1c,0x3d632967,0x3df55eb5, +0x3e319444,0x3e2e7608,0x3da80784,0xbda7b45a,0xbd9c4910,0xbdd09c7c,0xbda4c20f,0xbd342876,0xbea581f1,0x3b660bf0,0x3d6d9c30,0x3bf60877,0x3c93a84a,0xbbf2fe58,0x3c89b0ea,0x3cdaa46d,0x3cd4d3c5,0x3c836bf4,0xbc35816b,0x3b64a758,0x3bb6f51a,0xbb932ff7,0xbc971342,0xbd1d857c,0xbd774033, +0xbd4236b5,0xbd7f2e15,0xbd329329,0xbc21a21e,0xbb849d55,0xbbede2b6,0xbccc0e8f,0xbd3871d5,0xbdbfcb2d,0xbd98715d,0xbdff9bff,0xbe6a6497,0xbe6e725f,0xbe58f362,0xbe2cbf40,0xbe4c708d,0xbe6657f2,0xbe8175b3,0xbeb9b0ad,0xbe741af9,0xbe3cdc53,0x3bf17545,0x3c7f968f,0xbc59c8d9,0x3c535e3a, +0xb9d2c5be,0xbc2272b6,0x3b85ff2c,0x3ae1b513,0xbc6b0419,0xbc35b19a,0xbb8b2408,0x3bcdd323,0x3b897665,0xbb0a3f00,0xbc18926e,0xbce7ba47,0xbd6f7440,0xbd17f8f4,0xbd314702,0xbd4d8a16,0xbd0a859e,0xbd470b70,0xbd7d2353,0xbdb3672c,0xbe0f01d6,0xbe389dce,0xbe510f2b,0xbe3a6225,0xbe2cbeca, +0xbe24356b,0xbe088a15,0xbe08a3e3,0xbe0543a1,0xbe3c5ac1,0xbd957282,0xbdd69865,0x3ba96285,0xbccf791a,0xbc496509,0xbc536fa6,0xbb76cfff,0x3be5ab1f,0x3a9a9eae,0x3b45f683,0x3b95053a,0x3c286b8b,0x3b895267,0x38e1c25d,0xbbf9e39f,0xbc597b62,0xbcc05b2c,0xbac036a9,0x3bc0a030,0xbb1d5422, +0x3c1807f0,0xbc43b631,0xbd7fcd3f,0xbe042947,0xbe19ddd5,0xbdf8e1f9,0xbd997957,0xbd05f91c,0xbcafd311,0xbc59c3b2,0xbc3f156a,0xbc4aed45,0xbce27b36,0xbd2e3819,0xbd130d9e,0xbd505656,0xbb79f09f,0x3ba19b5c,0xbcdfc2b9,0xbc9d87e8,0xbc47b6c1,0xbc062fc0,0xba81c021,0x39f66723,0xbb5efeb6, +0x3a4148d8,0xbc841a65,0x3b8ac9ee,0x3c339b72,0x3cbb287d,0x3c63d3b4,0x3c7f9a74,0x3c7a6bb8,0x3bbb6c5f,0xbc9a6954,0xba628b8b,0x3b2423de,0xbc8343a8,0xbc70e956,0xbc3c8a0f,0xbc7b8b3f,0xbcf61b8b,0xbd1c9ba5,0xbd47caee,0xbd618271,0xbd6bf4f8,0xbd82227d,0xbd8e247a,0xbd6f207f,0xbd4c9c49, +0xbd31a3ca,0xbceae710,0xbd351523,0xbd53eb35,0xbcb04568,0xbd0db9be,0xbd17a62c,0xbce05b69,0xbcfed9b1,0xbce3980e,0xbce49db4,0xbd1665ee,0xbd2046c7,0xbd22a143,0xbd131d1e,0xbd1ac60e,0xbcd30ca0,0xbc73ef81,0xbceea1d4,0xbc742f5c,0xbc7d6380,0x3bd49f73,0x3bc1a7e1,0xbb664de4,0xbc1f2370, +0xbcb0ac08,0xbce885bb,0xbd05bbb3,0xbd0f7e38,0xbd1f2574,0xbd37ca14,0xbd584390,0xbd6d5257,0xbd85f29a,0xbd74b1df,0xbd6a5e6e,0xbd5a5553,0xbd5405e2,0xbd1801a9,0xbd184280,0xbd78d2e9,0xbd3441ae,0x3c9a241d,0xbd7f248d,0xbd359150,0x3b910927,0x3bad8b5e,0x3be9178c,0x3c574bc9,0x3c3fbbc3, +0x3c59013e,0x3c830054,0xbd35d810,0xbd6763fa,0x3c78e35c,0xbd0e6ddf,0xbd3567d6,0xbc8bcb3b,0xbcdc332f,0xbcebf948,0xbcfcc916,0xbd042e8d,0xbd0c6f58,0xbd1978e7,0xbd249895,0xbd2e3e00,0xbd343eaa,0xbd394c33,0xbd40c119,0xbd4ff57c,0xbd41a752,0xbd386f14,0xbd2b17b1,0xbd27ab44,0xbd37de32, +0x3ce67d59,0x3d24e1e0,0x3d0fbdc0,0x3d973f10,0x3d70c6b9,0x3c582f00,0x3d82cedf,0x3d69b1bc,0x3cc49f84,0x3cda2288,0x3ccbe993,0x3c81e42f,0x3c9d7737,0x3ca3ba62,0x3c938f77,0x3d644367,0x3d73737c,0x3c388fc2,0x3d52660e,0x3d7852e7,0x3c82a099,0x3cb1b39e,0x3cb42240,0x3c9e4cd5,0x3c9a8fbb, +0x3c985306,0x3ca7bc16,0x3c9674c2,0x3c90fae2,0x3c8a87ce,0x3c7ac2af,0x3c75a43d,0x3c6bd4da,0x3cae98be,0x3cec7611,0x3d2d52a5,0x3d2e39e0,0x3d853d27,0x3d929574,0x3d5c8499,0x3d588be0,0x3d453462,0x3d33af5f,0x3d289bea,0x3cf39c43,0x3d047be2,0x3d38a4b4,0x3d44c379,0x3d4388e2,0x3d1ac72f, +0x3d304cd3,0x3d095e61,0x3ce5d7dc,0x3d1e43df,0x3ced2f1c,0x3d010dda,0x3cdc4964,0x3ca91507,0x3ce3c13b,0x3ca85366,0x3ca03973,0x3ca05a7e,0x3cd691a1,0x3cb81882,0x3c9217fb,0x3c555762,0x3bac2d80,0x3be96ccc,0x3c625f60,0x3cf912c5,0x3d3cc59e,0x3d923c97,0x3d94b9b9,0x3dc21e8c,0x3dc25fc8, +0x3db7b7a3,0x3d960e63,0x3d5476e3,0x3d45bf1c,0x3d1aa2f2,0x3ca51a6e,0x3d16a9fb,0x3ccfbf06,0x3d1a89d8,0x3cd5b021,0x3d0a3b58,0x3d155fe5,0x3cf97b19,0x3cc3d9a0,0x3c865411,0x3cb3ea0f,0x3cd37878,0x3c1fa581,0x3c089251,0x3c0eecb5,0xbb30b20e,0xbc04ab02,0xbc316a02,0xbb67a53b,0xbc86e616, +0xbca933a8,0xbcf0718f,0xbd24e0a6,0xbd18d5a4,0xbcd661a4,0x3c7eae6e,0x3d4a0b41,0x3dd94bf9,0x3dd112b1,0x3ddfeece,0x3dd9eb12,0x3dabea35,0x3d798627,0x3d42990c,0x3d5de934,0x3d0cd236,0xbb8e88ac,0x3caa05b0,0x3cd3f3cb,0x3bf11dc1,0x3c9d38e2,0x3ca3614a,0x3c5d150d,0x3b026fa6,0xbbd1a6ee, +0x3c133d3f,0xb9ba7f29,0x3c498b3d,0x3adf938c,0x3c90f632,0x3d082aba,0x3c7f688a,0x3bd25c10,0x3bb6f297,0x3ccd5584,0x3c67ad34,0xbc1aee64,0xbd22f1d9,0xbd878feb,0xbd525017,0xbcc65de5,0x3d2501ec,0x3db8ea4b,0x3e18a636,0x3e07e274,0xbd275bef,0x3b653bc7,0x3dc0035f,0x3dc098f9,0x3cba928e, +0x3c766c1f,0x3c2b5edb,0x3c983004,0x3d0528fa,0x3d1df03c,0x3cb91821,0x3cb7a61c,0x3ca33724,0x3d09252e,0x3c609589,0x3af03be0,0x3c2f6bba,0xba30c9e3,0x3c11c388,0xbc6d0ab2,0xbdabf340,0xbdf95300,0xbe2b82bd,0xbe01b5e8,0xbe0f8667,0xbe510d20,0xbe4ec914,0xbe21a7bb,0xbd45b557,0xbd033685, +0xbca66dcf,0xbb91093c,0x3c2bccc8,0x3bba6f38,0xbc20495b,0xbd391cc6,0x3daeb0e3,0xbd74fae7,0xbdbe6fda,0xbcda0c09,0xbbc66b9f,0x3c9aabd7,0x3d01179a,0x3d5dd049,0x3d4b2c84,0x3d417500,0x3cec3f48,0x3d193c0d,0x3cd6329d,0x3ca66342,0x3b6c13c4,0xbb869f88,0xbc28d94b,0xbcdcb17a,0xbd3483d7, +0xbcf1f472,0xbc179f9d,0x3c3f2608,0x3d321556,0xbcd202db,0xbd08da8c,0x3b757813,0x3d99a172,0x3de02d5d,0x3dd9f727,0x3e3fe5e3,0x3e576105,0x3e3e489b,0x3e90b0df,0x3e8951f1,0x3e4d4b72,0x3e092d3c,0x3d5cb6bc,0x3d8369ad,0xbc5e257e,0xbbb0e744,0xbce73a2a,0xbc318364,0xbc2b6a2d,0x3c15a009, +0x3ca5472d,0x3d02b6c8,0x3b31d6e1,0x3d0455d2,0x3d136c8e,0x3d2ff547,0x3c7a89a6,0x3bdbe7a0,0xbc22cc09,0xbb8a038e,0xbc167c9f,0x3be8b174,0x3d47ae26,0x3d56123a,0x3dc4666c,0x3e1669b1,0x3e3cb5cb,0x3e3b9e42,0x3e356207,0x3e04eab8,0x3d0bda32,0x3d35a7eb,0x3dbcc437,0x3e3f5be3,0x3eac8a1e, +0x3ea7221a,0x3e3ed50b,0x3da8b5ce,0x3e3ccc54,0xbca5d58e,0xbcee78d8,0x3cec79b8,0xbc544172,0x3cb3ce94,0x3c89d2ad,0x3d246931,0x3cb7a5d0,0x3c4a8dcf,0xbbfffd4e,0x3c4055b9,0x3c90e98c,0x3cd2264f,0x3cb22e65,0x3c448fee,0x3c1c6d37,0x3c3ea5c8,0xbce144f5,0x3c0a9521,0x3d3257b3,0x3d42f7fd, +0x3d814b0f,0x3d72f219,0x3d76b8a4,0x3d9817ae,0x3d3712f5,0x3d3da2ba,0x3da9e16b,0x3d98816e,0x3dbfb996,0x3d95bb9c,0x3e74262e,0x3eaad302,0x3ec10ce6,0x3e8bd322,0x3e7cb74d,0x3e045abe,0xbd9b6e5d,0xbc155c57,0x3c1a4a28,0xbaf67012,0x3c5c7b9b,0x3cc22fa2,0x3c454556,0x3c843033,0xbb5e8ad4, +0x3c71486c,0x3cb9ee61,0x3cdd326a,0x3c612cc1,0x3b9764ae,0x3b902b77,0x3d0cdc81,0x3c817679,0x3d60020f,0x3d62d9b0,0x3cd08f55,0x3b55386a,0xbb645a3b,0x3c8a895a,0x3d7908fa,0x3d613d19,0x3ddd68d5,0x3e5deecd,0x3e2afdaf,0x3e25c96e,0x3e24f29d,0x3e797209,0x3e8c031f,0x3e950fd7,0x3e684301, +0x3dc17ec3,0x3d7d0005,0xbd2f9622,0x3c077aa8,0xbb1e043d,0x3c931c47,0x3cc226ee,0x3c66a2c7,0x3cd1abb0,0x3c9c20f0,0x3cb08516,0x3c1874e0,0x3c2f93ef,0x3c86a045,0x3cbd6ee3,0x3d02a135,0x3d19f764,0x3cc68e6b,0x3c80f8fc,0x3cf8ec32,0x3d5e9315,0x3d7c9249,0x3d84a2f2,0x3d7986e3,0x3d2da12e, +0x3bd321d2,0xbcba3eac,0xbd5d5b30,0xbd8a283b,0xbd5785f2,0xbc9bd1ea,0x3cb52ebc,0x3d8d7267,0x3dd970da,0x3e034982,0x3dc840bd,0x3d81b82f,0x3d591d20,0x3d4c4aae,0x3d379ba8,0x3c8b93fe,0x3ccd0322,0x3ca7ad75,0x3ced529f,0x3c66e9d0,0x3cdcb9c8,0x3c7ce134,0x3d09b483,0x3c6759e9,0x3caa2220, +0x3c90fb96,0x3c9e0130,0x3c174129,0x3cc93b95,0x3d186c17,0x3d5d077a,0x3d42e71d,0x3d09ed4e,0x3cccff14,0x3c38e35f,0x3aa00c48,0xbc156787,0x3c301271,0x3cc07843,0x3cec07d3,0x3d1d0b69,0x3d1d0de2,0x3d13a978,0x3d3527f6,0x3d620e71,0x3d9bbb8d,0x3d85c02d,0x3d623d2f,0x3d862998,0xbd20f038, +0x3d38ab87,0x3c9d3c5e,0x3c90fc8a,0x3d2a3e7f,0x3d0dd1d2,0x3d55d9c6,0x3d4e7ae3,0x3d070ad5,0x3d361f0e,0x3d263729,0x3d0fb126,0x3c909fd4,0x3c8fe4af,0x3d1d35e2,0x3cfa314d,0xb89ebcc2,0x3cc0487d,0x3c3cabaa,0x3c636568,0x3c3389e0,0x3c2a913a,0x3c1524ec,0x3b514cad,0x3c078158,0x3c39a3ea, +0x3c93e038,0x3ccdb642,0x3d124ecf,0x3d3e9205,0x3d4bf565,0x3d4f73cf,0x3d534d84,0x3d5b4200,0x3d4fad5e,0x3d90241d,0x3cf3afb1,0xbc64808d,0xbdaeaba6,0x3d6386dd,0xbb94c7da,0xbd91931e,0xbd9be90a,0xbd9e2634,0xbd9917ac,0xbda48040,0xbda9acf4,0xbdac313e,0xbbdac58f,0x3d24801f,0xbda471e7, +0xbc56113f,0x3cb70409,0x3d26de0d,0x3d09fd1d,0x3d0bfd25,0x3d02f622,0x3cf90757,0x3ceccc4d,0x3cdc210b,0x3d0aa326,0x3d20ba03,0x3d347452,0x3d4435f1,0x3d503cad,0x3d613abd,0x3d5a3b46,0x3d5ae8c9,0x3d58e320,0x3d618cfa,0x3d74370e,0xbdc9ebf2,0xbdb9e9b5,0xbdf5514f,0xbd6d46dd,0x3c00d8c6, +0x3dc7941c,0xbdb3c180,0xbbfad1e9,0x3d97ad34,0x3da3afec,0x3da508c3,0x3d9b33e6,0x3db04165,0x3db45fdb,0x3db7e719,0xbc0e4505,0xbd9b2c8c,0x3dc484a1,0xbbc381f8,0xbd76c214,0xbdd617ce,0xbdaed385,0xbdbeb8ea,0xbdbba23d,0xbdc07c79,0xbdc13409,0xbdc20960,0xbdbe146e,0xbdbe078b,0xbdbf2848, +0xbdc40537,0xbdcb8c9d,0xbdd980cc,0xbde1296a,0xbde2898a,0xbdd8490c,0xbdd51b6e,0xbe11197d,0xbe0121a6,0x3d853837,0xbda26891,0xbcf52a7d,0xbcfc7398,0xbd6b165d,0xbd430a11,0xbd8914cf,0xbd8349d2,0xbd2e3252,0xbd7e176e,0xbd61d93c,0xbd518cbf,0xbccf34d1,0xbd18622c,0xbd6d31c0,0xbd69400c, +0x3c346652,0xbdc3a816,0xbdc3d76b,0xbdce7b36,0xbdcdccc9,0xbddb3cd7,0xbde1c390,0xbde66ab8,0xbdde315d,0xbddda312,0xbde98da7,0xbdf7eeb5,0xbe0b7071,0xbe2058aa,0xbe2c25cb,0xbe2d6830,0xbe22fcfd,0xbe1ed109,0xbe35cef5,0xbdd41a6a,0xbc57bbc6,0xbd440062,0x3a505b03,0xbc2e8df1,0xbc3871f5, +0xbcbfc00b,0xba4fed3c,0xbc94a061,0xbb8a118c,0xbd05d62d,0x3bf39a92,0xbc9585fe,0xbb61db0e,0xbceabf9b,0xbd075e2b,0xbd1cb8f5,0xbd3a294c,0xbd8da212,0xbdcad96a,0xbdcbea72,0xbdd23eeb,0xbdec7b82,0xbdf83314,0xbe01cc47,0xbdf440e9,0xbdf67df3,0xbe03e8fd,0xbe0e3555,0xbe25403b,0xbe4de410, +0xbe5e3984,0xbe5e2964,0xbe48b391,0xbe33536f,0xbe97abb4,0xbdf594ee,0x3c39f2dc,0xbd1f10d1,0xbd03d05e,0xbc45f0d0,0xbc94ff10,0xbc5316ee,0x3bd156da,0x3c8672c9,0xba236dbd,0x3cac9412,0x3c2bbc55,0x3bc2e259,0xbbe114b0,0xbcb83257,0xbc7e40e2,0xbd21de18,0xbce32065,0xbd8060d2,0xbdc492f6, +0xbdd57f73,0xbdd56e0f,0xbdf93777,0xbe0eedf0,0xbe213d25,0xbe19df38,0xbe15a3ac,0xbe293e07,0xbe3da277,0xbe778663,0xbea2ad02,0xbeb1a428,0xbeae295d,0xbea233ab,0xbe92f3f1,0xbd1a2888,0xbd86580e,0xbd98e29e,0xbcf52e13,0x3c82072e,0x3cce5e21,0x3c22adf0,0x3a5ae5d4,0x3bf94dd7,0x3c7a8491, +0x3cbe9e9e,0x3c2c0042,0x3c024b09,0x3cd2b629,0xbb154c3a,0xbca7ebb0,0xbcb3d500,0xbd634017,0xbd867b3c,0xbdd7390d,0xbdc939f5,0xbdc12366,0xbe014b21,0xbe30913b,0xbe38dbe1,0xbe1a478d,0xbe2932a7,0xbe396863,0xbe413531,0xbe0c83fa,0xbd8b3726,0x3ce61d38,0x3d3590ce,0x3d58c389,0x3cf2d493, +0x3a980c93,0x3d811d75,0x3d6db4d2,0xbc014c32,0xbc43dc82,0xbd03944e,0xbcb49051,0x3a8aa8c6,0x3c9b4555,0x3d201218,0x3d263534,0x3c62240c,0x3ca6a509,0x3c8b1246,0x3cc2d51f,0xbc10569e,0xbce1c426,0xbd37535f,0xbd87be07,0xbd67e485,0xbd9b4d71,0xbdd8137c,0xbdb498f5,0xbd7a590f,0xbcfa1099, +0xbc62d0e6,0xbc1b89ec,0xbb6209a8,0x3bb15723,0x3c167884,0xbd16f667,0xbd065694,0x3d109d8b,0x3b896c25,0x3c84d24d,0x3da372cc,0x3d0cb87f,0x3c39bddd,0x3ace8cfa,0x3d4ef671,0x3d054974,0x3d009f0c,0x3c4a443b,0x3c121323,0x3c98a77d,0x3c6d3e31,0x3c81a3a5,0xbb390ab6,0x3bd4489b,0x3c27b839, +0x3d1d5b84,0xbb178066,0xbc80c835,0xbbc27e4d,0xbabea2c6,0x3c06d667,0x3c05751e,0x3cd361b6,0x3cf8f477,0xbc171f29,0xbd40cd37,0xbda60e6d,0xbdbbb17a,0xbdfff9cb,0xbdf9259f,0xbdbad676,0xbe111ddf,0xbe369c2d,0xbe7aee90,0xbe8d8e6e,0xbe74b504,0xbe56ad81,0xbd05c8a1,0xbc6d7272,0x3db9c73c, +0x3cc5825d,0xbc2c155c,0x3c95673e,0xbbccb66f,0x3bcdd11c,0x3ccdeb72,0x3c26009a,0x3b882ca0,0xbc02f5a7,0xbb4f31df,0x3c02c98a,0x3d3edb4d,0x3ca65747,0x3cb63ed0,0x3d3b4617,0x3cb7a815,0x3cec66bd,0x3c43fd89,0xbd004039,0xbd55d130,0xbd5275cb,0xbd4155ff,0xbd01ee78,0x3b524c56,0xbd282916, +0xbd2fcf83,0xbbc3bdeb,0xbca87ec1,0xbc2cda5d,0x3d3c0434,0xbd6bb60c,0xbe2ed2d8,0xbeadcd79,0xbe08298b,0xbe70164b,0xbb356309,0x3e03b663,0x3d303a1c,0x3cc020b7,0x3d066d39,0x3caba730,0x3c2ee752,0x3c59776c,0x3b3700b5,0x3b8a7cbb,0x3cc4944d,0x3cd76996,0x3cb6a3ad,0x3c8d5eb8,0x3c803055, +0x3ca46a31,0x3b9b3919,0x3d096e25,0x3cccd108,0x3cc352ac,0x3d3e0a03,0x3cf4dbf5,0x3a99a29b,0xbd1c17e9,0xbdd13a74,0xbd9852bd,0xbdc9ee10,0xbe2de632,0xbe1f2c8c,0xbe12d541,0xbdd37f16,0xbe0e6930,0xbe1e97a8,0xbe5a57a0,0xbe6a524f,0xbdd5f0d2,0xbd726a56,0x3d193d33,0xbb2936b8,0x3c874b79, +0x3c95bcd7,0x3c5ee4b9,0x3c085008,0x3b4ecdfd,0x3c055163,0x3bd0122d,0xba70b147,0xbb242428,0x3b73274b,0x3c12d790,0x3c76167d,0x3c8909c4,0x3ceecef1,0x3d15c7ce,0x3ca4a3dc,0xbc2852c1,0xbc3a9773,0xbc264d8d,0xbcba1c80,0xbd014826,0xbd805d0f,0xbd5f72aa,0xbd4c746b,0xbd163edd,0xbd0872af, +0xbd20aca1,0xbd6db245,0xbd2da6d8,0xbd2975fe,0xbd68c16e,0xbd87b5ce,0xbd66cc74,0xbd0bc47e,0x3b5b7916,0xbca3a0e7,0x3b0154af,0xbbbcdd1d,0xbb709fa2,0xbbc156e9,0x3c8f51e0,0x3c09242f,0x3d141347,0x3c1428c7,0x3cbb53c7,0x3be60641,0x3c44a6e1,0x3b143e75,0x3bc1fc89,0x3be98137,0x3ca1b22f, +0xbae8f795,0xbba410db,0x3c78d7e7,0x3cb7b2b7,0x3c474fc7,0x3b9a3a8d,0x3ad74ecc,0xbc3271e3,0xbcbe9e5e,0xbd0e60a2,0xbd24416c,0xbd179086,0xbd16d445,0xbd20232c,0xbd27cade,0xbd3f8e32,0xbd237f8c,0x3a73887a,0x3b72400b,0x3dab02a3,0x3c61ab13,0x3d2921f1,0x3d19a023,0x3c805f3c,0x3cb12be1, +0x3a372db5,0x3bd6fba6,0x3cb10901,0x3bfd49c4,0x3bd59297,0x3c32dbdb,0x3c9575bb,0x3c8688b7,0x3b9c10fa,0x3b62109d,0x3ccc510f,0x3ba844f9,0x3c43d992,0x3c144c3a,0x3c1cadbd,0x3c5d820b,0x3c8a9f90,0x3caa3247,0x3c5cc67f,0x3c12aca3,0x3b6a95f5,0xbacf917d,0xbc3f6376,0xbcaf5937,0xbc92330b, +0xbc538f71,0xbc0ca6b9,0xbb069622,0xbc06a87e,0xbcaf7285,0x3ce25623,0x3d81e1b6,0x3db2e815,0x3bf8eb95,0x3d696fbb,0x3db53b59,0x3dba5221,0x3db73e56,0x3da7d7be,0x3db2c32b,0x3db32068,0x3dafec7e,0x3d5e6eca,0x3c6530ec,0x3da0ba53,0x3d4fb6a6,0x3c9f1582,0xbc1f51c7,0xba89a176,0xba83dbc9, +0x3a67f2a2,0x3ae4ffe5,0x3b115218,0x3b8d937e,0xb9d6b245,0xbb8b67e6,0xbc0c28ba,0xbc5370cc,0xbc7ee9d1,0xbca5805f,0xbc869782,0xbc784803,0xbc61d8f1,0xbc59c732,0xbc60efc0,0x3cc3f898,0x3bf8ce83,0x3d213788,0xbd605a76,0xbdde145c,0xbe122793,0xbc777ca0,0xbdb88edf,0xbe0d6e04,0xbe112a31, +0xbe0ffbf7,0xbe038783,0xbe0ee405,0xbe0f9df0,0xbe0ba959,0xbdb27579,0xbc962b2a,0xbe15f095,0xbdc31f45,0xbd31ceb4,0x3d4e00df,0x3ca87592,0x3ce31547,0x3cf744f6,0x3ce79583,0x3cdfad06,0x3cd2524e,0x3cd72b4d,0x3ce05525,0x3ce88d81,0x3d02a413,0x3d079688,0x3cfbf091,0x3d0f5e94,0x3cf942fe, +0x3c79e6ff,0x3c685586,0xbbf8a99b,0xbc9e27f4,0xbe0f9fe1,0xbc5b458e,0xbd6e740a,0xbd512cc3,0xbc838ab4,0xbc84a874,0x3c83c021,0x3bea5674,0xbcbdcbd4,0x3ac033e3,0x3ba06b2a,0x399ef2cf,0xbce5efe5,0xbc9b3b5d,0xbca94d36,0xbc431a1a,0xbdca799d,0x3cd71c48,0x3d0cbc63,0x3d00559a,0x3d31763b, +0x3d24c06d,0x3d1ed97b,0x3d011579,0x3ce943b1,0x3cf0d6d7,0x3d12ed84,0x3d4dd896,0x3d6ab977,0x3d3e3164,0x3d775b14,0x3d42ef4e,0x3bc9a40f,0xbbaf7530,0xbc8869e5,0xbd3f85dc,0xbdc813bc,0xbd79b221,0xbd9dc019,0xbd42da9d,0xbd09b193,0xbc8c5f28,0xbccabc57,0x3c648dbc,0xbcc85243,0x3cd446f1, +0xbca03fad,0x3c9ef1db,0xbc8f1659,0xbad9eead,0xbc6d72d6,0xbcad3568,0xbd1e2eea,0x3c37c669,0x3d44817b,0x3d17e263,0x3d7e1703,0x3d5788c6,0x3d49838c,0x3d26a7ff,0x3d21c853,0x3d379f57,0x3d674ea1,0x3d9d1c98,0x3db4079f,0x3d8331e7,0x3db1b070,0x3d766524,0xbc87d14d,0xbd002cf5,0xbd1ba473, +0xbe0a41bf,0xbe25c7ec,0xbd9f4b78,0xbdaa03f7,0xbd789abd,0xbd0ddfc1,0xbc2a1e77,0x3c8dabe2,0x3cc6e105,0x3ce01e02,0x3c65725e,0x3c9aa406,0x3cec9324,0x3c239df9,0x3c2e6679,0xbd03196b,0xbbb3c73a,0xbd4a500b,0x3c181f2f,0x3d4e1581,0x3d3cc5ba,0x3da60de4,0x3d967a4f,0x3d8ea4c4,0x3d4ab88b, +0x3d0ed262,0x3d19ddc2,0x3d8c15f6,0x3df7da2f,0x3e169ff4,0x3de30dc3,0x3e0cb1ca,0x3db5ca19,0xbcfc8bf5,0xbd83df3a,0x3eaf8110,0x3e4f9f60,0x3cc03776,0x3c7e10c4,0x3bfe8579,0x3b20cd5d,0x3d114f05,0x3cf3f316,0x3bafd61c,0x3b270939,0x3ca1a9a9,0x3c50c218,0x3c3d8fd7,0x3c914c25,0x3bd88234, +0x3c3a454d,0xbc8bf634,0x3be53a2a,0xbd1e9976,0x3b056db0,0x3d8de724,0x3d29ec44,0x3d972e37,0x3d7d9ea4,0x3d702ecd,0x3d03428d,0x3d716c86,0x3d42ce1c,0x3b947871,0xbd592a85,0xbdb35a5b,0xbe11c84c,0xbd8e7db8,0xbbfa59b0,0x3d16a728,0x3e5bcdfb,0x3d68fbe7,0x3dc36a7d,0x3d8d6e9e,0x3d80aff2, +0x3dafc190,0x3d120a12,0x3cf3a2cb,0x3c631d4e,0x3d209502,0x3d151d69,0x3c8016f8,0x3c8d8c9f,0x3c91da47,0x3d25e36b,0x3c90164e,0x3bc9cf19,0xbcaa6cde,0xbc49a1ac,0xbd583467,0x3c3b19a3,0x3dcba8dc,0x3dc4581b,0x3df46c5e,0x3dfc2427,0x3df05863,0x3db2b30c,0x3d58cee8,0x3cd01320,0x3cece299, +0xbda1288c,0xbdd5c190,0xbdbb67d9,0xbdbe7c50,0xbd81180d,0xbd3d4c77,0x3c78fcfa,0x3c032d3e,0x3d811f9c,0x3c815e18,0x3d23874f,0x3cca233c,0x3ceeb4f3,0x3c8b8f8a,0x3d5a75b2,0x3cf3a13e,0x3cefcf66,0x3b57d23d,0xbb3f89b5,0x3b9f5442,0x3d63e253,0x3c78565f,0x3cb41936,0x3c6cb22e,0x3d0084ee, +0x3cde129d,0x3ccff543,0x3c9ff579,0xbc564a80,0xbd0cd0ae,0x38c38fd6,0x3cf073b8,0x3d31cf82,0x3d535805,0x3d653ec5,0x3dad98c8,0x3dbb9aa6,0x3e0827ad,0x3e60fa8e,0x3e1b25af,0x3d95596d,0x3ca574a8,0xbce9c1f3,0xbd4ca188,0xbd0cc4c1,0x3d1409ad,0x3d1618be,0x3c53bd8c,0x3cb226d4,0x3cba73ec, +0x3d3ce307,0x3c51c304,0x3ab18e81,0x3ad92bf8,0x3b5ad219,0x3c3d2695,0x3d4f134d,0x3cd4380e,0x3c6de9be,0x3ca6bc96,0x3c8b6491,0x3bd20d20,0x3c93874e,0x3d0896c6,0x3d0a863a,0x3cd295b8,0x3c7ef0e2,0xbcae00ee,0xbdb44fd2,0xbdacfeac,0xbdd77926,0xbe06c01e,0xbdc13269,0xbd3851a1,0x3c846f14, +0x3cb4a72c,0x3d851188,0x3dd382af,0xbc231497,0x3d9a022b,0xbd482683,0xbdccd3e4,0xbcdc47fd,0xbc1b0d0c,0xbb941808,0x3b9f0e14,0x3bbed29b,0x38592157,0x3c8df07b,0x3ca138fd,0x3cc98953,0x3cb36f8a,0x3c9d0958,0x3c5bf6ee,0x3c93f2f8,0x3c98a228,0x3ca3f315,0x3bfc05bd,0x3ba7925d,0xbbe077cd, +0xbce658f7,0xbcd8812a,0xbd06ff48,0xbd00a385,0xbccd8b45,0xbd5a878a,0xbd8d9831,0xbd70a6de,0xbd077f2d,0x3bdb0089,0x3d57a9bb,0x3daa2ac0,0x3d85f100,0x3c82587e,0x3d2094a2,0xbc1528fe,0xbd43cc80,0xbd845b80,0xbc5d4161,0xbc0c7766,0x3bfd1f66,0x3ca935e0,0x3c47a7ee,0x3ccaf4f1,0x3cbff2ef, +0x3cb209d3,0x3c82c52c,0x3c81830c,0x3c59c287,0x3c88adb7,0x3c156f87,0x39958528,0x3a322868,0x3b03f857,0xbc23605e,0x3b981824,0x3c2f419b,0x3cacf9a3,0x3cd8b569,0x3cdc473d,0x3cc1c131,0x3c18ffc5,0x3b26dea6,0xbc2e05ec,0x3cb5905a,0x3d4ec4df,0x3dad6ab7,0x3d0970df,0x3b1715bd,0x3b84a587, +0xbcec04c1,0x3cd38116,0xbc16eb15,0xbd231166,0xbc8bc349,0xbcece642,0xbc9c0e19,0xbc2cb9f0,0xbb046267,0xbbbd2fff,0x3c34ce41,0x3b2bc783,0x3caeb714,0x3bd92437,0x3c9aa3bd,0x3ba6d4e1,0x3c3a470f,0x3bf85b0f,0x3bc50020,0xbaf7c54b,0x3c55def7,0x3cd1f966,0x3c9509b6,0x3ca89f79,0x3c53d940, +0x3c22bd9d,0x3bc2e591,0x3c9ca3bf,0x3d0d1c93,0x3d49cd74,0x3d3e5935,0x3d1e35e5,0x3d27cb57,0x3d07ea98,0x3cd6d04b,0x3cc57e35,0x3c70e8c6,0x3c5fc7d8,0x3be40d97,0xbc937d11,0x3c2a99c8,0xbb5f34cc,0x3a7369e2,0x3c48af65,0x3c11f960,0x3cb7c828,0x3c80c58e,0x3b7b5ed0,0x3c8f3f53,0x3ccad536, +0x3cc0cdd3,0x3c97ba51,0x3cbc35d4,0x3cbcfc7a,0x3cd3eb20,0x3c299102,0x3ce22336,0x3cce9113,0x3cd718ee,0x3ce82851,0x3ce8eed1,0x3cedd5bf,0x3ce17e00,0x3cf8f00c,0x3cf85e4a,0x3d047b6d,0x3d0e7099,0x3d29c8ed,0x3d3b2ae6,0x3d2715e4,0x3d0dc75f,0x3cdd9bef,0x3c968991,0x3c8919c3,0x3ca23bb2, +0xbc79c8e8,0xbd01a933,0xbca02802,0xbbb766e1,0xbcf67905,0xbcf5484b,0xbcfe3cf1,0xbcf4e08f,0xbcbb522f,0xbce505fb,0xbcec43dd,0xbcd3b3fe,0xbcc53be2,0xb9cda76d,0xbcad8f88,0xbca4afb6,0xbb185a79,0x3cd868a6,0x3ca8097b,0x3cb56320,0x3cb2fbaa,0x3cbb1346,0x3cc4ff3a,0x3ccee4b4,0x3cd2f1ed, +0x3cd7f3d6,0x3cda9ddf,0x3ce234fe,0x3cdd3c27,0x3ce5709b,0x3cc5b521,0x3cb680ad,0x3cae7498,0x3ca0bfb6,0x3c86f146,0xbc019588,0xbb767567,0xbc44dfc5,0x3d3b4413,0x3d6f2a04,0x3cbb3e93,0x3d040c26,0x3d685491,0x3d3267ac,0x3d40fc77,0x3d419ae9,0x3d137e7c,0x3d2bf356,0x3d2a7842,0x3d1d5b96, +0x3d7fc5de,0x3d1245da,0x3d035906,0x3d765263,0x3d349640,0xbca1dacb,0xbbdf80ac,0xbc0113fd,0xbbe555d7,0xbbf65707,0xbc05591b,0xbc1b82ea,0xbc266751,0xbc3b9a67,0xbc495792,0xbc7e706d,0xbc89b7ff,0xbc918803,0xbc7870c1,0xbc3f2a96,0xbbab20e9,0xbb5ed69e,0x3c9d8e92,0x3cba71be,0x3c801abe, +0xba860409,0x3c98e518,0x3cab7455,0x3c24597d,0x3c2d5cc6,0x3b526a15,0x3c79cf20,0x3d101689,0x3ca45737,0x3c496525,0x3cc351d6,0x3cba1b92,0x3c8431ff,0x3cbee98c,0x3befc98f,0x3d30645b,0x3b1e4b6c,0xbc73e7cd,0xbbf6f091,0xbc2be5b0,0xbc7057f5,0xbc9a8f4d,0xbca8dcb5,0xbcabe2f8,0xbcadce7c, +0xbc9df055,0xbcd8076a,0xbcd7a8e2,0xbcb05e38,0xbc3496de,0x3b368d1f,0x3cb61524,0x3ceed159,0x3d2df0bc,0x3cfbca65,0x3cb7e3d3,0x3cc1ce47,0x3c2ea428,0x3bd5e9f7,0x3c432ba9,0x3c1b88b0,0x3cd4a833,0x3bb5e336,0x3d0dc698,0xbab878bf,0x3cc93b69,0x3cc95345,0x3ceb9417,0x3c78143e,0x3c79f657, +0x3c187306,0x3ce4853b,0x3c1ac7ce,0xbca83f80,0xbb9b9d6f,0xbb85a441,0xbb7100c5,0xbbd8c926,0xbc2d9cbf,0xbc3c8c28,0xbc8ef1a5,0xbcc84434,0xbd3b80de,0xbd61e92c,0xbd66ab45,0xbd21934d,0xbc8755da,0x3cfbb71a,0x3d2d4661,0x3e02a40e,0x3d8ffe3d,0xbb27eb34,0xbc340c11,0x3b889702,0xbc09b7ac, +0xbb6ed592,0xbc549940,0x3b32c385,0x3c93e641,0x3b9e52d5,0x3c472387,0x3c528f94,0x3c900f81,0x3b8579db,0xbb9bd2e3,0x3bbb571e,0xbc8f5a7f,0x3c109827,0x379ee9bb,0xbcdef419,0xbc88861d,0xbc94081e,0xbd0134e1,0xbd2c9085,0xbd35dc18,0xbd2cf983,0xbd341b59,0xbd3f5900,0xbd92c114,0xbd8d1dfb, +0xbd4f676b,0xbbdac06e,0x3d28972b,0x3dee2223,0x3e091258,0xbd8aa93d,0x3def1972,0x3e7de66b,0x3e21b8c7,0x3dcd2f82,0x3d8a9da3,0x3d4f3b95,0x3d80120d,0x3d36b3bb,0x3cdf8ee8,0x3c9d2d65,0x3c0c0725,0x3bb452e2,0x3ccf9c79,0x3c4b145f,0x3bb10a85,0x3bcf4773,0xbb2d7bc6,0x3cf03b10,0x3cbe7031, +0xbb706ca1,0x3d297f80,0x3d95e6b6,0x3ded3fd5,0x3e154984,0x3e2f6212,0x3e179d15,0x3e06500a,0x3df20cf6,0x3d834bad,0xbb58f48d,0xbd9dac30,0xbe02ea15,0xbe0d57c0,0xbdf7ee76,0xbd273743,0xbcf1f879,0x3c279b94,0x3d8bf580,0x3d1da7fd,0x3d60b57f,0x3d900181,0x3d2c39da,0x3d086e94,0x3cf81941, +0x3d07f46d,0x3c2bb8c2,0x3cadccda,0x3ccb521c,0x3d050ac6,0x3c6673bb,0x3c94f3bf,0x3d0e3343,0x3d1cd58a,0x3d80c6a7,0x3cd1c781,0xbcabbd90,0xbd23c532,0xbddf171f,0xbd9ef7e8,0xbd878dbb,0xbd917c54,0xbd41806a,0xbd12c49e,0xbcdb6e64,0x3d894ee7,0x3e11d9e4,0x3e56eac7,0x3e6d4ea3,0x3e3889f6, +0xbb42b5c4,0x3cb5b5b3,0xbcc56ec6,0x3bbc2b84,0x3d8a84d4,0x3d0ca1f4,0x3d618f90,0x3c329f39,0x3d29b04e,0x3d8d7dd2,0x3d0e4702,0x3c809a5a,0x3bed38e5,0xbc69bc08,0xbb0c8e68,0x3d946670,0x3cb0f939,0x3be70c9d,0x3ccb4e16,0x3ae5ee5b,0x3c415426,0xbb47da5b,0xbcb4625e,0xbb181c2e,0xbc369fdc, +0xbd5ff0f2,0xbdb84a75,0xbde2a347,0xbdc42172,0xbdb5d260,0xbdb3c87a,0xbd8fc3b9,0xbd19b4b1,0x3d1cd0e8,0x3d5869e3,0x3daab49c,0x3da63f94,0x3d568a91,0x3e0b9eb8,0x3cf97985,0x3adc1003,0x3b8cbd10,0x3c589890,0x3c8b459e,0x3c87c6d6,0x3d0834b1,0x3c19c623,0x3aa4d5b4,0x3cc07eba,0x3c502299, +0x3c935e21,0x3d57c24e,0x3cb08698,0x3ca42a38,0x3c08828d,0x3c7ecd98,0x3d14dae7,0x3bed4fe5,0xbcaa6bb0,0xbc6b46ba,0xba919b0b,0x3cb85244,0x3d455785,0x3d9707a7,0x3d9055b8,0x3d8838d6,0x3d73ce40,0x3da6d10b,0x3d84bb28,0x3b072f40,0x3d342c72,0x3d51c384,0x3d17f5c7,0x3e200a14,0x3dcabb33, +0x3ddf1bab,0x3d918fce,0x3d1b2c4e,0x3cfe50be,0x3ccf9998,0x3ca5ffe7,0x3d0feaac,0x3ce45c8a,0x3c806b82,0x3ca3a321,0x3c1e8bde,0x3c10459e,0x3c530f32,0x3c3fc10c,0x3c4fdfa3,0x3bb676a8,0x3c6d5307,0x3cd5cff4,0x3c30958e,0x3c584c2e,0x3c702d22,0x3c33a215,0x3d3370cb,0x3d6b75fc,0x3d9a32d3, +0x3d6e64af,0x3d732b10,0x3d68e34f,0x3d2017bb,0x3cb89a68,0xbbebf0e1,0x3bf77490,0x3cca7e53,0x3cb52fff,0x3dbd8611,0x3cc9c5e6,0x3db5da0e,0x3d4eaee2,0x3d5478a5,0x3d252190,0x3d0bb8b8,0x3cbb83c9,0x3cfc2f6d,0x3cc2ca4b,0x3c9fc746,0x3bf8170d,0x3caabc2c,0x3ca3ff55,0x3c86e95a,0x3c5f6299, +0x3c99f4c4,0x3cc5d525,0x3c84fa29,0x3b9f46fa,0x3c29337b,0xbc5c07fe,0xbc436867,0x3b9b3209,0x3d45eeb8,0x3d7c2d40,0x3d799ffd,0x3d0ee0cc,0x3cae7e89,0x3ce9defe,0x3ba22c6e,0xbca400d3,0xbd79de1b,0xbd06e8cf,0xbc8eae4f,0xbc9e64ca,0x3b68a11c,0xbaa45d06,0x3b28d194,0x3ce1e7be,0x3cc098c0, +0x3cdd7d4c,0x3cb20f58,0x3c80d731,0x3c2378b0,0x3c864782,0x3c096966,0x3ccf4f68,0x3bfb4c44,0x3cb4c016,0x3c945bb1,0x3cc580f2,0x3c9e4e4a,0x3cb804dc,0x3c95332b,0x3cd12291,0x3b5b3e3f,0xbbe53e69,0x3b822978,0xbb5f8df0,0x3b7e47d4,0x3c2b9785,0x3cb62197,0x3cbbe657,0x3cb249c0,0x3ca0027e, +0x3c3f0d79,0x3c008340,0xbb34ad8a,0x3c24db3b,0x3c8a9861,0x3cc41de2,0x3c93bfe7,0x3c3cc3ed,0x3cbb7cc5,0x3ccf92fb,0x3ca89b47,0x3cf92228,0x3cf46e14,0x3d00c498,0x3d054b48,0x3ceaf0e1,0x3d04c428,0x3d2d3fbe,0x3d0a6cc8,0x3cd4647b,0x3cee2f92,0x3cf91db7,0x3c97af11,0x3cae6d1a,0x3c1bd230, +0x3cdb950e,0xbc7017b3,0xbc7e50f8,0xbc417714,0xbc2f2f97,0xbc061f8f,0xbc0cdfbb,0xbc091669,0xbc46dbdf,0xbc683703,0xbc812a88,0xbc8b2a6b,0xbc942007,0xbc9d8f71,0xbc6a2961,0xbc0f8f91,0xbb084a48,0x3bb19e8c,0x3bf5dd5d,0x3bf3c7e5,0x3d10af2c,0x3d21c728,0x3c620387,0x3d06166d,0x3d28a754, +0x3cc92695,0x3cd33ca8,0x3ce0040b,0x3cb80d77,0x3ce9d98a,0x3d004889,0x3cf50561,0x3d2cd503,0x3ce47152,0x3ce042a7,0x3d1a8eae,0x3ce365a3,0xbc0f6213,0x3a9006b3,0xba4c9602,0xba40688a,0xba865ef2,0xba560cef,0xb905e23a,0xba4f7c32,0xba7a80c9,0xba897ae4,0xba682c6a,0xba0ecdfc,0xba75df3b, +0x3af4bc0a,0x3b56c0fc,0x3b80ad1f,0x3bd17a64,0x3c2856f8,0xbc8f8449,0xbcb5cb0f,0xbc914640,0xbd5921d0,0xbd3b10d8,0x3bb83cce,0xbd407428,0xbd4213f7,0xbc43569f,0xbc371813,0xbc0fcc94,0xb9db2f2d,0xbb8bc720,0xbb55bbf7,0x3b6c7a2f,0xbd408492,0xbd4290d7,0x3bad6a6c,0xbd3aaf43,0xbd4f5f79, +0xbbe6e14a,0xbc53e219,0xbc63b06c,0xbc55efc4,0xbc724bc4,0xbc82ed92,0xbca29ae2,0xbc8ce566,0xbc8703ca,0xbc6abc60,0xbc812f0c,0xbc8abc6a,0xbca2fc03,0xbcb6be73,0xbcc9c19f,0xbcd7ff65,0xbcd4e5e8,0xbd282e6a,0xbd02bf37,0xbbf12b60,0xbc9047ac,0xbc91c760,0xbc856db7,0xbc81909f,0xbc8db546, +0xbc7acb29,0xbcdf4366,0xbd0887af,0xbcec568f,0xbc8b7b68,0xbc919981,0xbc7b3e40,0xbc5df2ac,0xbcf4825c,0xbc83d42b,0xbcd2aa35,0xbca6dada,0xbbff5bb9,0xbc85af4b,0xbc47c2f2,0xbc8d0fe5,0xbcaa3365,0xbcf1ca83,0xbcb51663,0xbc9349fd,0xbc6ed0dc,0xbca7a924,0xbcfdf16d,0xbd3a10c2,0xbd690a93, +0xbd826313,0xbd78db53,0xbd69720d,0xbd8cda4f,0xbd04944c,0xbc60f87f,0xbc3a3a42,0x3b7981b9,0xbbaf408a,0xbbbf35b7,0xbbe8e0ab,0xbc3460bb,0x3ac29e9a,0xbc8d0c72,0x3af095c2,0xbba8693f,0x3bf5b596,0xbbcccdca,0xbbcfd0d5,0xbc0bfd48,0xbc121403,0xbcba4012,0xbc34afd7,0x3b72d935,0xbbd9ab2e, +0xbb9a2ca6,0xbc706415,0xbcaccf3e,0xbd29132e,0xbccf19fa,0xbc9836c8,0xbc372468,0xbc85ad8e,0xbcf3d0b2,0xbd5dd0e6,0xbd967ea8,0xbdb2dec9,0xbdae6583,0xbd9e6b9b,0xbe03f3ee,0xbc488a5d,0x3d3f5f40,0x3cbe20cb,0x3d0b00df,0x3cbf0d0a,0x3c9a8f9a,0x3c2f23d7,0x3c07c73a,0x3c0f6c55,0x3c58e7b3, +0x3c4c52eb,0x3c7f641b,0x3d16ffa6,0x3c6bfcf0,0x3c8026b9,0xbb3992f7,0x3c491905,0xbc593459,0xba191e6e,0x3be4cf4c,0xbc1ec8c7,0xbabefbce,0xbc636a9b,0xbcd8e70e,0xbd645642,0xbce9a7d6,0xbc1dfc05,0x39f46741,0xbcad5547,0xbd8e358a,0xbe020eb8,0xbe279ea9,0xbe3ae1c7,0xbe2ca6ee,0xbe11fcc2, +0xbe0d313d,0xbdf19a98,0xbd970999,0xbcacb34e,0xbb0770cd,0xbbaf5759,0xbc8e9b98,0x3b73bf40,0x3cff2c1c,0x3d01ae9a,0x3cdebd5b,0x3c2c202d,0x3bcaccc3,0x3c880842,0x3c1c9221,0x3c304d9a,0xbc4b17f9,0x3c73574c,0xbbddc3fd,0x3b5b3b56,0x3d095538,0x3c509092,0x3c3f653a,0xbd664f32,0xbd8672e5, +0xbcef95ea,0xbbfa89cc,0x3bfd61db,0x3c9bcfa1,0x3cad71e4,0x3d2432c3,0x3dcc8e26,0x3d3406b4,0x3c7b78c2,0x3c84a464,0xbdd69ef9,0x3cef91f4,0xbc321b06,0xbc2f999d,0x3bd9ca9c,0xbc9dec22,0x3ca115b4,0x3d0eda76,0x3ce3e87d,0x3cf4c403,0x3cec71ac,0x3b469045,0x3c82f234,0x3ca04699,0x3d112225, +0x3c63f111,0x3c478981,0x3b914c1c,0x3c662b90,0x3ab662c6,0xbc8b1946,0xbd004abd,0xbd810452,0xbd907695,0xbdbc9f20,0xbdec7d5f,0xbe1f4711,0xbe2af07e,0xbe28c4ad,0xbe1569d0,0xbd99d235,0xbd40bf42,0xbcd4c4c8,0xbc90a783,0x3badcd29,0x3cdd36b7,0x3cf01e92,0xbcc8f306,0xbd4cf486,0xbd17ad57, +0xbcdf35b2,0xbc5785c1,0xbcb6427b,0x3b39aa7f,0x3d532c1c,0x3c81526f,0x3ba98051,0x3a025eb3,0xbc22d82f,0x3bd60824,0x3d86d79d,0x3c687386,0xbaeeedef,0xbc26d1de,0xbc4322c8,0xbcd5328b,0xbcb6df71,0xbce8651a,0xbd586ce2,0xbd87a20a,0xbda3e686,0xbd9dabe5,0xbd81f383,0xbce6911c,0x3bf61e9d, +0x3ce34b1b,0x3d41c9b1,0x3c1688a1,0xbdc290d8,0xbe39e798,0xbe62b70e,0xbe66fb20,0xbdb8c745,0xbe226e70,0xbc61fcb9,0x3a734a96,0xbce01933,0x3bbf4a9d,0xbc23b12e,0x3bfe89f4,0x3caa4108,0x3b8f2888,0x3b4348da,0x3cac1983,0x3b84ee16,0x3c561430,0x3d166903,0x3b332ee7,0xbbc24834,0xbc12beb0, +0xbbb398b8,0xbc040176,0x3af1ab56,0x3ca360ee,0x3c41d8e7,0xbbc9d73a,0x3c00fcf7,0x3c50c388,0x3badbe31,0xbc910ab3,0xbd6c8682,0xbdf4c24c,0xbe266d03,0xbe2fb3a0,0xbdecee38,0xbe39c194,0xbe686aab,0xbe99f9d7,0xbe67b31b,0xbe437a1e,0xbdfde098,0x3b2b8daf,0xbb31e1da,0xbc3b3cae,0x3a2df63c, +0xbb1ceba9,0xbb717913,0xb9da97e1,0xbab8a6b0,0xbb21667c,0x3b5fbebf,0x3bce9f05,0x3b968f37,0x3be6f29d,0x3c115ba8,0x3c3f9d1f,0xbc1b259f,0xbca9092d,0xbc6a3b4b,0xbc5f12d0,0xbabc8a39,0x3c8519bf,0xb7c5f234,0xbcd2c921,0xbd7d957c,0xbd9b7d54,0xbdd423d7,0xbe0c0f01,0xbdcf008d,0xbdbb1f76, +0xbdb52d45,0xbe0ef7df,0xbe308a58,0xbe5a2c17,0xbe3e4882,0xbd954431,0xbd749486,0x3c181d9b,0xbc7dfe1e,0x3bac7d18,0xbb63f137,0x3b0a293d,0x3be073f5,0x3c376f2e,0x3c7a1d34,0x3c119584,0x3c0c073f,0x3bed7995,0x3c1db50e,0x3b54a1eb,0xbbd6d7cb,0xbc602c24,0xbb9ca2fd,0x3b2bd332,0x3baa4fe2, +0x3b61879b,0xbbd3b971,0xbcc3e1a5,0xbd2756ec,0xbd5c084f,0xbd686475,0xbcb22b8d,0x3beaea3a,0x3cc5ddad,0x3b17160a,0xbc809e98,0xbcca2442,0xbbe55ab4,0xbc925af4,0xbd8356a3,0xbd8d947a,0xbd081722,0xbd0b2562,0xbd10960b,0xbcf67da1,0xbc827996,0xbc64f209,0xbbda3246,0xbba82a87,0xbb44a930, +0xbb02ba92,0xbbd8587a,0x3aedd4b5,0x3c0ddf44,0x3c0df852,0x3c3838c1,0x3c1c075d,0x3c0cbf0c,0xbb2cf435,0xbc9b433c,0xbccb83a4,0xbc8f7ef4,0xbc850ff3,0xbc0f18c4,0x3a507891,0x3bfd4940,0x3c387fdf,0xbc8134fa,0xbd3329df,0xbd88d9ab,0xbd64b5b3,0xbd2a8c82,0xbd04860b,0xbd0e6ff1,0xbd0ed7ce, +0xbd08e4db,0xbd032815,0xbbad6d7c,0xbc163a9b,0x3c8bae17,0x3b1076f5,0x3b8bcd46,0x3bd4f008,0xb9eded7c,0x3bc0bd44,0xbb4d1b3c,0xbbefb9b0,0xbc2846a7,0xbc6cd898,0xbc205a29,0xbc56ada3,0xbc40a01c,0xbc218f77,0xbc9a10fd,0xbc2d4f97,0xbc6d6fd0,0xbb8e0362,0x3ac6d77d,0xbba50bcd,0xbbe65639, +0xbc2e583b,0xbc46788a,0xbc133684,0xbc09a292,0xbb7297aa,0xbbab275a,0xbc135a73,0xbc93c907,0xbcbffd4b,0xbcae7b6a,0xbc9c35f4,0xbc854f2f,0xbc59e339,0xbb8047e8,0xbb60f21e,0xbcbbf591,0xbc715da0,0x3ca6ed65,0xbcc3f006,0xbc818f56,0x3c873404,0x3c8c7965,0x3c889cea,0x3c98613a,0x3c8ca6f5, +0x3c7d9530,0x3c82afe0,0xbca8037f,0xbcb8aff3,0x3c415383,0xbca69606,0xbcc0990e,0x3b73c4a8,0xbadbb26c,0xbb192b34,0xbb17ebdf,0xbb51d128,0xbb9d5a31,0xbbfe1406,0xbc0f8020,0xbc2b0327,0xbc2f2e13,0xbc3c1107,0xbc2ed8c2,0xbc40f97b,0xbc17b88c,0xbc021c2a,0xbbd0b151,0xbbcea0fd,0xbad55195, +0x3d236a20,0x3d0607fc,0x3d0b0dda,0x3d28c866,0x3c8aafa5,0xbd31010d,0x3d5e2e21,0x3cd6c944,0xbcf712ad,0xbd0921c2,0xbd0fe6b0,0xbd1a45ca,0xbd20802e,0xbd217187,0xbd269876,0x3cd3c26f,0x3d5d145f,0xbd4bb7bc,0x3ca75300,0x3d414d3a,0x3d1b44a6,0x3d0c270e,0x3d18f1cf,0x3d10f044,0x3d1374b1, +0x3d1376c1,0x3d170a27,0x3d157fae,0x3d1a3ccf,0x3d1bbba4,0x3d2f4be1,0x3d39a73b,0x3d3caa56,0x3d534445,0x3d5136a6,0x3d2f44c6,0x3d23c3b7,0x3cae405f,0x3cb4c2f6,0xbbd48678,0x3d074f21,0x3cc54aa3,0x3c90aa0c,0x3cff76df,0x3cefd141,0x3d106468,0x3d26da66,0x3d13ca42,0x3d31573b,0x3d15381b, +0x3d27ee71,0x3cc89b29,0x3cca5325,0x3d137b0f,0x3cf39187,0x3bd59e70,0x3d34bd98,0x3d1d10ed,0x3d3d33ca,0x3d2bd536,0x3d3943f8,0x3d3e6127,0x3d490f86,0x3d458035,0x3d44b1e7,0x3d4402b6,0x3d76d2a6,0x3d92b8f1,0x3d99fb00,0x3db6ef2e,0x3da28b12,0x3d3bf4ac,0x3d111d19,0x3b54c526,0xbc329575, +0x3a9ed76f,0x3bc3b2f3,0x3c0bc38e,0x3c93aa6e,0x3c9af7f1,0x3cc399f6,0x3c869bdb,0x3c8e42e7,0x3cb47ddd,0x3cd5b68a,0x3ca00a65,0x3d0cad62,0x3ce3689e,0x3cf259eb,0x3c8259cd,0x3cc6e646,0x3d0c6785,0x3d017e11,0x3d163084,0x3d228ba5,0x3d08879f,0x3d1220e7,0x3d0dbaab,0x3d1b5bac,0x3d06dcba, +0x3d1edb28,0x3d380fbb,0x3d948dff,0x3dc4d00f,0x3dc893c9,0x3e05d7b8,0x3df28e5a,0x3d3c1199,0x3ce12042,0xbd837c47,0xbdadde8a,0xbd20eb15,0xbb65c577,0xbbb713f1,0x3c61ae20,0x3c4a04ae,0x3c2fd0d7,0x3c59c68a,0x3c519f96,0x3bc8bec2,0x3bd7ed7d,0x3c9d92eb,0x3ce4992c,0x3ca66b85,0x3c6de314, +0x3c583d11,0x3c840105,0x3cdd432f,0x3ce8adf8,0x3d20f907,0x3d79762d,0x3d48470e,0x3d6080aa,0x3d735119,0x3d89d6eb,0x3d839b77,0x3d7863c3,0x3d7bbeee,0x3de0b137,0x3e194bd5,0x3e2503ec,0x3e51e6c4,0x3e281813,0x3c8fefbe,0xbcf2824c,0x3e0ad80a,0x3d83695c,0xbcf55dc2,0xbcf52b83,0xbcc38484, +0xbc925425,0xbb272e03,0x3ab822cf,0x3c92ae5a,0x3ce7fbb7,0x3ce8e1bf,0x3c80d680,0x3c5ee3ae,0x3cda39be,0x3c9aa590,0x3c9d5abf,0x3c9e2d2d,0x3cdde53b,0x3d322b3a,0x3d7defba,0x3b9ebc26,0xbce30088,0xbd7bd523,0xbc26a328,0xbcb3b4d1,0xbdc8f2bd,0xbdb12372,0xbd9c7c65,0xbd5fa9be,0xbd0268df, +0xbb3a2756,0x3d04f99e,0x3c9f171b,0x3d2d1ddc,0x3db7c44a,0x3dd1ca0f,0x3e01cf77,0x3d470866,0x3d205ae1,0x3d71dcb8,0x3d71870e,0x3d3d0c51,0x3d297760,0x3cfd7be5,0x3d043506,0x3d08f52e,0x3c6f4c91,0x3c4361f5,0x3c7f72ac,0x3d15a6c9,0x3caf8123,0x3cafc1ce,0x3c897cf4,0x3c9c1691,0x3c4a8e7d, +0x3d1fe9e8,0x3d8a9bb7,0x3dc5ca9c,0x3e06a8c0,0x3dae3aec,0x3d898ff9,0x3dabd300,0x3d8cbaa2,0x3d7b2f08,0x3d621f9f,0x3ccb998b,0x3c8cb624,0x3d0c6ab2,0x3d47de74,0x3d684a96,0x3da67e67,0x3df85914,0x3dd1a92f,0x3d6ff701,0xbc98c2c8,0xbbab06e9,0xbcf766bf,0xb93ff3c5,0xbb57ac69,0x3d564194, +0x3c8a8631,0x3ba91a00,0x3b6a9f2a,0x395eadff,0x3c8278ec,0x3d6d3534,0x3cc74916,0x3cbd6166,0x3c992888,0x3c1c8a9f,0x3c2691c8,0x3af9cc18,0x3c635193,0x3b658011,0xbb74647a,0x3d9314da,0x3e031e6b,0x3e25c8a4,0x3e231f9a,0x3e03a2df,0x3da6e918,0x3d8956c9,0x3da57626,0x3e22d15d,0x3e1b5cf4, +0x3e05d8ef,0x3dd45a7b,0x3d834191,0x3df3a50e,0xbae47588,0xbaae7b11,0x3d30ab5d,0xbb946614,0x3ce951cf,0x3c545071,0x3d04f741,0x3c37c687,0x3c2502d3,0x3cb5a2c8,0x3b3b6d52,0x3c2a5990,0x3d24ff02,0x3cb8f98a,0x3c83d680,0x3c52a30c,0x3c84a39f,0x3c22b66f,0x3cfe7065,0x3d9e6bf8,0x3dbbecc9, +0x3d9b262d,0x3db290ce,0x3da6c563,0x3d88c218,0x3d9a4943,0x3d933482,0x3d8c8dd1,0x3d338b16,0x3d004228,0x3cb7a6a2,0x3d990d69,0x3e266d39,0x3e9eb25a,0x3e35aef7,0x3e474de9,0x3daea4cc,0xbd4e095a,0xbb6014f3,0x3c8456c4,0x3af1f816,0x3c6d52fc,0x3cdf5d08,0x3c4ac664,0x3c5f64ad,0x3c0cb022, +0x3c8526de,0x3ca64c98,0x3c9dfe48,0x3c775c77,0x3c3d431a,0x3c0726a7,0x3ca7a35c,0x3c25bfce,0x3cbf9e7c,0x3ccbf1af,0x3c9f9619,0x3c1f53c1,0x3c6ff949,0x3ce8a014,0x3d45c190,0x3d57bcc4,0x3da365d6,0x3e0add77,0x3dfea5a9,0x3e040398,0x3e03fae9,0x3dfc392f,0x3dfd273e,0x3e24524e,0x3e2cdac0, +0x3dadea87,0x3d70ac19,0xbc97ed0c,0x3c942acc,0x3c399eba,0x3c5d7463,0x3c67a717,0x3c3b63b7,0x3c80abed,0x3c562a37,0x3c574e59,0x3c33cefc,0x3c370e93,0x3c1ac84c,0x3cab0f5a,0x3cd684b3,0x3cc3631c,0x3c28cc01,0x3bd05e95,0x3c96a214,0x3cfcaf1e,0x3cf70fa0,0x3ceaef49,0x3cd87f60,0x3ce24f16, +0x3d14b96e,0x3d09235e,0x3c6fdb11,0xbc9fee81,0xbc5f7a07,0x3c4fe650,0x3d878a8d,0x3d324ce4,0x3d221b2c,0x3d210eaa,0x3d765c22,0x3cdb7771,0x3c8416b7,0x3c5ae937,0x3cf586d8,0x3cbe2a51,0x3cc7c8b9,0x3cc19811,0x3ccf96b1,0x3c6d0b9c,0x3c8a1bc9,0x3c1b4e4f,0x3c8cb8f1,0x3c0dcd91,0x3c8718de, +0x3bedf1b2,0x3becfe21,0x3a378b41,0x3b8c3ea8,0x3b8e5658,0x3c3f5cfc,0x3bd0476f,0xbb6e52cd,0xbc03cd38,0xbb97d066,0xbb65369e,0xbbb6590f,0x3c0f407a,0x3cdead10,0x3d38c5fb,0x3d70656c,0x3d78d79e,0x3d882154,0x3d44f971,0x3d15e5ae,0x3cc5b671,0x3ca7b4ed,0x3cfba3b3,0x3d03e384,0xbc417e45, +0x3c9541e7,0x3c0d34ce,0x3bb4b6c4,0x3c66fb19,0x3c4c9e8a,0x3cad5749,0x3cdd013f,0x3cc24a75,0x3d081229,0x3cf89b86,0x3d099902,0x3cb8e47c,0x3cad28e4,0x3cfaa790,0x3cc3da50,0x3b5cdd4a,0x3cbeef64,0x3c880ba9,0x3ca18b1c,0x3c8f0c37,0x3c85d06b,0x3c7dd4e1,0x3c5a2211,0x3ca129b1,0x3cbb730f, +0x3ce30312,0x3d0b0c03,0x3d351af1,0x3d67db20,0x3d564f39,0x3d481993,0x3d349beb,0x3d227b70,0x3d12bad6,0x3d20e325,0x3d179b63,0x3c7288cb,0xbcd446ae,0x3d2f5d2e,0x3c7cc758,0xbcac4aba,0xbcaf4b09,0xbcb97e8f,0xbcbaa4e9,0xbcccce41,0xbcd27530,0xbcd9bfb9,0x3cab287f,0x3d33013a,0xbcebe3d7, +0x3c8c2fba,0x3d11789a,0x3d075a50,0x3cec3bc9,0x3cf3af86,0x3cebd5ad,0x3ce6f000,0x3ce0479c,0x3cd10dff,0x3cfc88dd,0x3d109372,0x3d220a76,0x3d31fed0,0x3d3ba8ef,0x3d4d62fa,0x3d3b56fe,0x3d33c4f2,0x3d2a9081,0x3d24519b,0x3d3ba4d2,0xbd5ad34c,0xbd3d9b17,0xbd804078,0xbcd84320,0x3c9206ce, +0x3da0cfdd,0xbd351fef,0x3c4c3a82,0x3d96968a,0x3d9b5a19,0x3d9b8649,0x3d9388f8,0x3da29735,0x3da5f900,0x3da86b1c,0x3c786711,0xbd158f2a,0x3db05614,0x3c928184,0xbccab268,0xbd80b502,0xbd3ce21d,0xbd559077,0xbd580006,0xbd575d5e,0xbd5880b7,0xbd591a7d,0xbd5d13aa,0xbd62594f,0xbd690dba, +0xbd742c59,0xbd7b8289,0xbd7b5249,0xbd877d34,0xbd8457fa,0xbd603941,0xbd5bb6f0,0xbd43d0a5,0xbd75be20,0x3c9a761f,0xbd4f73c9,0xbc87315d,0xbbfb347a,0xbcd42104,0xbc865966,0xbd133125,0xbd0ca82b,0xbc869772,0xbd0272d2,0xbcd9cd57,0xbcbfa6b5,0xbab59e3b,0xbc1f29c0,0xbcd8dfda,0xbcd6d0b0, +0x3cf1e9d3,0xbd63cd3b,0xbd5db3b9,0xbd6b395e,0xbd80c818,0xbd7f5aec,0xbd80680f,0xbd7d01ac,0xbd805b4d,0xbd886a6c,0xbd969e28,0xbda7dc3c,0xbdb52b4c,0xbdac1837,0xbdbfe1d1,0xbda6a28d,0xbd5c44b9,0xbd4f3148,0xbd5f77f8,0xbd68e8da,0xbd31c584,0xbd277f37,0xbc285cfa,0xbc08b35d,0x39334ef8, +0xba8f82ba,0x3bfe4787,0xbbf549b4,0x3bb3e254,0xbc8524ce,0x3c625ef0,0xbc0502e7,0x3c3c0903,0xbbbdba74,0xbc675a64,0xbc5d328f,0xbc6ded0d,0xbd1ff9c7,0xbd7396f3,0xbd749c42,0xbd92ea2b,0xbd92350c,0xbd96159e,0xbd99a9ec,0xbda23027,0xbdb7c77b,0xbdcff690,0xbdf4caca,0xbe04c53e,0xbdf63e01, +0xbe134a8e,0xbe00f2ba,0xbd9d8500,0xbd887eb9,0xbd303ad0,0xbd85eb00,0xbd999a72,0xbd8bf350,0xbd0706f4,0xbca520b6,0xbbbc6c83,0x3b5390bd,0x3b9518b1,0x3c33848e,0x3b7d33e7,0x3c55fa09,0x3c466ff7,0x3c886617,0x3c5c4aef,0xb9bd6a62,0xbb8e2921,0xbc8dea7d,0xbadeb433,0xbd181c5e,0xbd75204a, +0xbd876b93,0xbdb06ef3,0xbdb37bd8,0xbdc08699,0xbdbc3b4b,0xbdc13a0e,0xbdd5294c,0xbe02a5f6,0xbe20cb98,0xbe339178,0xbe1d5ac5,0xbe30a8b7,0xbdfbda3e,0xbd3deab2,0xbd32bed7,0xbd89fd74,0xbd0f17e2,0xbb051f1c,0xbcf2b9a6,0xbb7cdcaa,0xbb81a45b,0xbb383211,0x3bf4b8e5,0x3c0889b2,0x3c15d0ca, +0x3c7515d5,0x3c349dc3,0x3c4a7496,0x3cbb24cc,0x3bbffc69,0xbb4514db,0x3b9ee023,0xbcd76541,0xbc5fa1fe,0xbd2a9c4a,0xbd8e7f5a,0xbd4c5756,0xbd9bf2e2,0xbd67f53e,0xbd4b837d,0xbd350ca3,0xbdc1006d,0xbe09564a,0xbe2886c0,0xbe132d43,0xbe0880f7,0xbdf96615,0xbe42b6e4,0xbe423185,0xbe1ccd09, +0xbd9d614d,0x3dab179a,0x3d9af5f0,0x3d767fed,0x3d17fbc9,0x3d0c31c5,0x3cb7fe4a,0x3c9b4821,0x3cdf2649,0x3c839a15,0x3c981106,0x3c122f22,0x3ba41d0e,0x3c1fa3c6,0x3cb84d90,0x3b11b482,0xbb88e7e6,0xbc0bad0e,0xbc87b2d1,0x3c3baf43,0xbd0347bc,0xbdc1a9c9,0xbdaebd60,0xbdc69038,0xbd623b8e, +0xbd179053,0xbcd34dd0,0xbb014398,0x3c97db5a,0x3cce2b01,0x3bcb1937,0xbc3b0a32,0x3c5493e1,0xbd86f6ca,0xbd6ee82c,0x3c8a89b3,0x3d61e14d,0xbc29be35,0x3a225b4c,0x3d86cef4,0x3cce6f2b,0x3cc1d78c,0x3cc346e1,0x3cfb54b9,0x3d3b7165,0x3c557a6a,0xbb374ef5,0x3bb328ad,0xbaa18e77,0x3c52d152, +0x3d31877a,0x3c14c33f,0xbbdedc8e,0x3c3883b7,0xbb53a391,0xbc11c94e,0xbc9f7713,0xbc8d1cfa,0xbc33b7c5,0xbcf675bb,0xbd770e87,0xbdd68d27,0xbe1d630d,0xbe2a658f,0xbe1e468e,0xbdfd57c2,0xbdb87a95,0xbdd7b974,0xbe1123a2,0xbe35a691,0xbe019022,0xbdaa3fbd,0x388f7333,0xbce7d2d6,0x3cf9b5d5, +0x3cc64427,0xbc1efa78,0x3ca1352e,0x3bfa10b4,0x3c40a8f0,0x3c6790f3,0x3c05bffe,0x3b80a11d,0x3c684fa5,0xbbaabaef,0x3b3f2439,0x3ce5109b,0x3caefcb3,0x3cf0abde,0x3cc15264,0x3c5c58e5,0x3cfbddba,0x3ba2d834,0xbd0759a0,0xbd2d04d8,0xbd341c56,0xbd4bf010,0xbd21a3cc,0xbc1f336b,0xbbcaa510, +0x3be4a1cd,0x3c9fc991,0x3cf18b61,0x3c386386,0xbbb358ee,0xbdb8e033,0xbe143e40,0xbe384da6,0xbd7cc3fc,0xbe11bb2d,0xbc757202,0x3da026b5,0x3cb095a3,0x3c0edf3a,0x3caeeafb,0x3c84d7bf,0x3c953404,0x3c8946c6,0x3b178fc1,0x3b1b0f4c,0x3c0808f6,0x3c511f64,0x3c2226be,0x3c2fa194,0x3bf9b70c, +0xbb343b57,0xbbd63e7a,0x3c720b79,0xbbe9e991,0x3b4136f4,0x3c895b31,0xbc789939,0xbb3e19af,0xbc5d5c5d,0xbd37905e,0xbd0458ed,0xbd05e9cc,0xbd7ab1f4,0xbd87c7a6,0xbda99310,0xbdbc04fb,0xbdff2ee7,0xbdf9a9b2,0xbdd13162,0xbe023180,0xbd081239,0xbc07ca69,0x3d6b8660,0x3cbf0449,0x3cbfdc0d, +0x3c37834a,0x3aa7871e,0x3c5bd9c5,0xbbef240a,0xbb993d7b,0xba80b35b,0x3b4b1418,0xb8c8795b,0x3ac68684,0x3b79877e,0x3b9829fc,0x3a932105,0x3c02bf10,0x3c5c7b89,0x3bf23ccd,0xbc8194e3,0xbcaff78d,0xbce83e56,0xbd219bfd,0xbd03a7a2,0xbc496c2b,0xbc193370,0xbba33f43,0x3b0aa881,0xbc23aac6, +0xbd04d208,0xbd8405e8,0xbd91e7d6,0xbd8b4d9b,0xbd77ad48,0xbcd7e0a2,0xbcef740c,0xbae4c23d,0x3c2da3f4,0x3b8c0428,0x3cc77be0,0x3ca83d5d,0x3cb21f77,0x3c932bae,0x3cca0607,0x3bef323c,0x3c728585,0xbbc645df,0x3c8493fa,0x3b56d7e6,0x3c212f35,0xbaa67393,0x3b3deaab,0xb9d1fc9a,0xbb115a4b, +0xbc5624b5,0xbc881306,0xbc19c2be,0xbc152185,0xbc3c8d93,0xbc608fc4,0xbc55c7a1,0xbc90460b,0xbca37e6d,0xbcba6cd3,0xbd01c0dd,0xbd118e1c,0xbd216dfd,0xbd2af7a0,0xbd36a850,0xbd5b85f1,0xbd15ea34,0xbcc94593,0xbce9749a,0x3cf9762e,0xbca4f442,0xbb50cacf,0xbb7b99d2,0xbca336b5,0xbc8e99d7, +0xbcee93c7,0xbcd37425,0xbc249477,0xbcbf9e03,0xbcc85c79,0xbcad4a50,0xbbad8556,0xbbd061b8,0xbc7bb265,0xbc339730,0x3ca87829,0xbc3da255,0xbbeba198,0xbc08e7b8,0xbc00a707,0xbbe60fc3,0xbbf412fc,0xbc09834a,0xbc5881af,0xbc9535ff,0xbcb988f1,0xbccbd02d,0xbce75a53,0xbd03d5d5,0xbcf5ba8a, +0xbcdd96ad,0xbcc75fc2,0xbcc014bf,0xbca443bc,0xbd00b076,0x3a981c7d,0x3cf7d03b,0x3d83b8a0,0xbc8437b1,0x3cccd672,0x3d74e3e9,0x3d8256fd,0x3d85af7a,0x3d7f6f6e,0x3d8e73cc,0x3d954fe5,0x3d968cb0,0x3cce69fb,0xbc406c1d,0x3d91c8db,0x3ce17acc,0xba169bca,0xbccdf2f2,0xbc84a146,0xbc8fcfec, +0xbc868a22,0xbc821714,0xbc6fefbe,0xbc4902eb,0xbc701cdf,0xbc832506,0xbc911681,0xbca36a67,0xbcb3ef4f,0xbcca8078,0xbcbf4377,0xbcbe7e1f,0xbcbb2a08,0xbcbef771,0xbcbb7bb2,0x3ceb202d,0x3ca675d1,0x3d37ee8f,0xbc905a49,0xbd76fda0,0xbdb15db6,0x3beff6fc,0xbd464f9d,0xbda84cbe,0xbdafb57a, +0xbdae5e33,0xbd9d3f1d,0xbdad4006,0xbdadd27a,0xbda9ed4e,0xbd45f402,0x3a974fb8,0xbdb60199,0xbd5ac7d3,0xbc839578,0x3d3a5e6b,0x3cd55502,0x3cfeb72e,0x3d012573,0x3cf7d8ab,0x3cf37192,0x3cf3656c,0x3cee0f82,0x3ceb971b,0x3ce07254,0x3cf80bce,0x3cf90dfd,0x3cdc4f6f,0x3ce9aad3,0x3cd7bafc, +0x3ca38824,0x3cbfa36f,0x3ccecc6e,0x3cee51e1,0xbd922e37,0x3c8c298b,0xbc55e28f,0xbc245ad2,0x3c395dfa,0x3ba4dc06,0x3cadcebb,0x3c5eb611,0xbbb63cd7,0x3c44c3fe,0x3c672438,0x3c0c1915,0xbbcbf578,0x3a2506f9,0xbabcd453,0x3ba58182,0xbd65f821,0x3cfd0279,0x3d211ff9,0x3d1867eb,0x3d2da10d, +0x3d239c12,0x3d1eb4fc,0x3d1405e8,0x3cff3657,0x3cf79fd9,0x3cf02842,0x3d1b30a1,0x3d0c1b7f,0x3c91a112,0x3c9edddc,0x3c8eeb66,0x3c2cf813,0x3c99db3e,0x3ce3175a,0x3cb275db,0xbcd2e586,0xbba72509,0xbc9f05fa,0xbbd08c90,0xb9c37a40,0x3be65692,0xbc0a2d9a,0x3c5cf67d,0xbbe1e1f0,0x3cdb7fe9, +0xbb85eab5,0x3c7e0857,0x382d9de9,0x3c6547cf,0x3b22df5c,0x3960a99a,0xbc64cc90,0x3ca8ab80,0x3d559601,0x3d2f4da6,0x3d619492,0x3d398dd0,0x3d328fe6,0x3d36305e,0x3d20a321,0x3d211715,0x3d05d806,0x3d40cf0a,0x3d2c1379,0x3c685cd1,0x3caeec38,0x3c414625,0xba03c82c,0x3c0c4f4d,0x3d571d67, +0x3c98fb7a,0xbcff3b26,0x3b3e0150,0x3c2e9245,0x3bd4d80d,0x3c9b56c3,0x3c83fa79,0x3c66d7ad,0x3c51c797,0x3cc83ae5,0x3c34d938,0x3ca5ba05,0x3ceed06c,0x3cdd0f4c,0x3cf997dd,0xbc1508f8,0x3c7c2d98,0xbc8b4da5,0x3cbcb701,0x3d773bf6,0x3d62396f,0x3d990e34,0x3d85caa5,0x3d8215df,0x3d7600a8, +0x3d326d93,0x3d266cad,0x3d24ce3b,0x3d81f46e,0x3d2cf822,0xbc84af46,0xbc8215ae,0xbc846672,0xbc25e0a9,0x3c945d50,0x3db1d76a,0x3cdf68d4,0xbcb53fcf,0xbc66f4c4,0xbcf7bbfc,0xbcd46d62,0xbb3d93a6,0x3bf0886b,0x3c955269,0x3c9a293f,0x3c3b70cd,0x3c9a5b36,0x3cac3c8f,0x3c844da0,0x3c5ae54e, +0x3c94752e,0xbacfd753,0x3c79f5ed,0xbc91e2d2,0x3bde072f,0x3d83a3ef,0x3d180e7d,0x3d07ace1,0x3bcdd6d8,0xbc312f8b,0xbc9ae6cc,0xbb9fbed2,0x3aa17b85,0xbc02dd7c,0xbaed704c,0x3c164f42,0x3d189fb6,0x3ce3294a,0x3bceddbc,0xbba2e798,0x3cb981c3,0x3d5dbb8c,0x3da9c522,0x3db6dc43,0x3d9d7c11, +0x3d93a061,0x3d00d06d,0x3cc2b2f0,0x3d1c0534,0x3c99bd3b,0x3c54000a,0x3bc31bae,0x3bf0852e,0x3c52d8d1,0x3cc1efef,0x3c6b5c5e,0x3c0624d3,0xbc6cc5cb,0xbc8f91d3,0xbd43ff10,0xbc8715d0,0x3d279f60,0x3d42c7e7,0x3d8fd9e7,0x3d8f6231,0x3d5817b0,0x3bfbc69c,0xbcf777d0,0xbd7d8780,0xbda62c94, +0xbd5be350,0xbd843308,0xbda94cb0,0xbdcf9e24,0xbcd4a17d,0x3dd1bf00,0x3d5c81f6,0xbc83dda2,0xbceb42a4,0xbd278b67,0xbcd1ac4b,0xbc24ac28,0x3cda6ef9,0x3d1152e8,0x3d493422,0x3c657a8c,0x3b9f521c,0x3c534698,0x3bcded59,0x3c8ccc18,0x3ce64c59,0x3ccb3f8a,0x3ccbc050,0xbbc182ad,0x3ca15f89, +0x3c3fc622,0x3c286df9,0xbc3829c4,0xbd2e1c83,0xbd1da18f,0xbd000caa,0xbc521a7d,0x3bc2715d,0x3c327362,0x3cdf8924,0x3d3b1e2e,0x3ddd9c27,0x3e2abc6c,0x3e3e3880,0x3e2298cb,0x3dc2c75f,0x3d9417de,0x3c3ce799,0xbc310f95,0xbd070132,0xbc4c64eb,0x3c0712fa,0x3c1b5e97,0x3ca7cfd4,0x3c829411, +0x3c7f16ac,0x3c35a158,0x3bdfa8b5,0x3c5ae084,0x3bdf17c6,0x3c2019a5,0x3c8962ef,0x3ca07008,0x3ca95b25,0x3c4554a1,0x3bd019f6,0xbc21b7cf,0x3acd3617,0x3c8adf17,0x3cb372c2,0x3ce27c73,0x3ce63b22,0x3c83fc53,0xbb0b1d22,0x3c95762b,0x3d178584,0x3d30d5b3,0x3cf68ed8,0x3cc05477,0x3d0bf32d, +0x3d212e83,0x3d644f4d,0x3d922c05,0x3b69a223,0x3d41a2f1,0xbce2b038,0xbd8b1798,0xbcb3fddc,0xbc3232f9,0xbbeeae97,0x3bddfd02,0x3c7362b4,0x3ba93043,0x3c23a199,0x3bb5acbc,0x3c286e30,0x3c490309,0x3c69f078,0x3b8da99c,0xb94ac87c,0xbb230ae1,0xbbc05bf6,0xbc86dd8a,0xbc4815db,0xbb71a643, +0xbc350ab1,0xbbe6bbd1,0xbb495c55,0x3c0cce43,0x3ce31aa4,0x3d0e1647,0x3cf548c3,0x3d09055f,0x3cba0782,0x3ce6bebb,0x3d690c27,0x3d5646e4,0x3d3a0e78,0x3d3ba751,0x3d0364c8,0x3c21b755,0xbcb5d606,0xbd16223f,0xbc66dedf,0xbc6ea485,0xbb7961a4,0x3ba69cde,0x3b89b688,0x3c1aa965,0x3c20ad7e, +0x3c85c6be,0x3c0d5884,0x3c3a04c5,0x3ca17ce5,0x3c513c1f,0x3b2f6150,0x3a02798d,0xbb464d05,0xbb85a6d1,0xbc25d74d,0x3c934d28,0x3cedb20e,0x3d01513e,0x3d05cac8,0x3d041bc0,0x3cdd0da3,0x3cba221a,0x3cbde655,0x3cb1d79c,0x3d3b879e,0x3d769ed6,0x3da42dda,0x3d42c1a6,0x3cfe239f,0x3cea05dd, +0x3c0f7975,0x3d1c74f4,0x3cd2fdd0,0x3b2c5cd3,0x3c1b6452,0xbb43a9ab,0x3bc51188,0x3c0bc94a,0x3c8d28d9,0x3b8bd6a8,0x3c5bed50,0xbbea1e70,0x3c613c11,0xbbf46081,0xba075ca6,0xbb68c210,0x3bee790c,0x3bd34179,0x3bef7748,0x3a531a7c,0x3cabce1e,0x3cecd584,0x3c52b4bb,0x3c1efd55,0x3bcff829, +0x3bed1675,0x3bf2b0b9,0x3c1fa03d,0x3c34c142,0x3c2a3d74,0x3c8fd655,0x3cc25c79,0x3d1cefc0,0x3d0894e5,0x3cee928a,0x3cc3d7d4,0x3cd21b0a,0x3c74d0c0,0x3bce2174,0xbd28e8a1,0x3a67f2cd,0xbc93b871,0xbc96a892,0xbc098431,0xbc4341b8,0x39e1b62b,0xba871b6e,0xbc6a1db3,0xb7816156,0x3bfa9fe2, +0x3b84d266,0xbbf33069,0xbb3bdbb1,0x3ac040f7,0x3b92b542,0xbca91044,0x3c3649ff,0x3bf8ada5,0x3be1f705,0x3bf5d169,0x3bb70e33,0x3b52549c,0xba0ecb7d,0x3c32ee44,0x3cb427b4,0x3d081d93,0x3d2c1e71,0x3d48c1c6,0x3d63747e,0x3d3e8970,0x3d20f14d,0x3cfebac4,0x3cb0aa3d,0x3cb85734,0x3cf31f3a, +0xbc3f97d8,0xbd11d759,0xbd328636,0x3ad89011,0xbd03e93d,0xbd3c2de4,0xbd45cdc1,0xbd4a2ebb,0xbd3381fe,0xbd503fe6,0xbd5cdda7,0xbd55a08a,0xbcf89a44,0x3b25665a,0xbd413799,0xbcf0e1a2,0xbba75457,0x3d05a76b,0x3cc0a314,0x3ccc4407,0x3cc47d0d,0x3cc27417,0x3cc67aa9,0x3cbd4375,0x3cd6a218, +0x3cdd53ae,0x3ce5bd01,0x3cf23583,0x3d00f05f,0x3d12f1b5,0x3d028d7d,0x3cf5ae36,0x3ce9eb93,0x3cd8e1d4,0x3ce94a36,0xbcb39af1,0xbc72a0ef,0xbd058669,0x3cfe9c48,0x3d66abd0,0x3d40be60,0x3c6917e2,0x3d52e6b6,0x3d6451eb,0x3d680395,0x3d63fb47,0x3d3e16f9,0x3d5ada72,0x3d5a693a,0x3d49c158, +0x3d573856,0x3c9e3ba6,0x3d4ab66c,0x3d561b66,0x3cf1d0b7,0xbd0fc417,0xbca35e59,0xbcbd1d09,0xbcc0a247,0xbcc2119d,0xbcc1e9f1,0xbcb4166f,0xbcc1b2c8,0xbcca00b5,0xbce5298b,0xbcc9b2ff,0xbccf16a1,0xbcfb736f,0xbcc6bff2,0xbca591c2,0xbc7d6fa3,0xbc7f14f0,0xbc01dc0d,0xbb9e7a0f,0x3d4b6a40, +0xbb417b9b,0x3cd8eae5,0x3cbc3344,0x3bfb4dc0,0x3c248533,0xbc080f6b,0x3a6176c4,0x3cb3f517,0x3be70604,0x3af253b1,0x3befa091,0x3c91ecc8,0x3c2207ac,0x3c64402d,0xb9689a3f,0x3d36a084,0xbc683246,0xbcf9868f,0xbcd68f4f,0xbd035955,0xbd09b1cc,0xbd0bbe31,0xbced8fd5,0xbd093294,0xbd127e92, +0xbd2f1c6e,0xbd06ccc4,0xbcfc682e,0xbd267ad8,0xbcd43f23,0xbca6ae0d,0xbc2287b1,0xbb39ce33,0x3c2a9e59,0x3bcd70b1,0x3d086a58,0x3ca284d5,0x3cf56fde,0x3cb00655,0x3ca0770f,0x3c8cf3e4,0x3ca4c787,0xbb4d3876,0x3cf17c53,0xbbbccbf3,0x3cbfb80b,0x3ba2faac,0x3cd56fb6,0x3c4eeb6b,0x3c355af8, +0x3be76890,0x3cb20917,0xbb477cb1,0xbd1fb2c8,0xbce6262c,0xbd0d8dff,0xbd0ac9fc,0xbd0eb8ee,0xbccd79ef,0xbd0dc386,0xbd1fb0e8,0xbd5f924c,0xbd0e1f28,0xbd182273,0xbd88754f,0xbd043c2f,0xbc84f4ee,0x3c880933,0x3ccbfe85,0x3d5560c9,0x3d2d548c,0x3d510046,0x3d046e62,0x3d29b63e,0x3d008860, +0x3cd51b9b,0x3c91bec6,0x3b739f25,0x3bc1985e,0x3b828fe8,0x3c30bd81,0x3c572746,0x3c1b9e6f,0x3c5af814,0x3b792454,0x3c8781e5,0xbc35d6dd,0x3c93f6b7,0xbb51a7f1,0xbd302b51,0xbd12be71,0xbd41b23b,0xbd5a95e3,0xbd5863ba,0xbd0c7640,0xbd43d822,0xbd6b4417,0xbda01093,0xbd3ab224,0xbd1ee0e7, +0xbd91ab8f,0xbcc5e00b,0xbbb20eb0,0x3d0c7126,0x3d8df6df,0xbdd90501,0x3b013b18,0x3d5e81ec,0x3cc16e4b,0x3cbd8b71,0x3cbb3977,0x3c127f9a,0x3bbe8444,0x3ce03d03,0x3cee6129,0x3c4a9beb,0x3c96210c,0x3c99b28e,0x3c8f4aa7,0x3c8b956e,0x3c44bfa9,0x3c7f3643,0xbc1451f2,0x3c8917bd,0x3c0ef865, +0xbcf648e9,0xbb87596f,0xbb7c4e7b,0x3cfdef9b,0x3cfd9255,0x3c8ad0c0,0xbc65d36c,0xbccd0a0b,0xbd1b9425,0xbcfdc74b,0xbd4c0feb,0xbd9da301,0xbd7724d4,0xbd84dd69,0xbd597d59,0xbd8bd391,0xbb565c07,0x3c686318,0x3d4f96e2,0x3d367652,0x3d08c310,0x3cfd641d,0x3c99748a,0x3d3b4fe3,0x3c869381, +0x3c2b66e6,0x3b3805bc,0x3bba6aed,0x3c54188f,0x3c542624,0x3c257e13,0x3c057544,0x3b867c33,0xb9433da8,0x3c394f4d,0xbc105f19,0xbcaad5bc,0xbc9fc510,0xbd813823,0xbd53f305,0xbd14524f,0xbb8a9d60,0xbbe2f1dc,0xbc83659e,0xbd15ada5,0xbc876e92,0xbc372202,0xbd0fd5e9,0xbbddc2fd,0x3c6eabde, +0x3d774727,0x3d0b9cf5,0x3c5e3fc0,0x3b55f087,0xbc8fed3b,0xbc8f18f6,0xbb5ca8b3,0x3cc3fcb5,0x3d21e41b,0x3d19abc3,0x3c0f094f,0xbc0b3df3,0x3bf83d73,0xbb2d0ae9,0x3b927007,0x3bdfa836,0x3cdeec62,0x3cb8aef9,0x3b1c5898,0xbc25001d,0xba03b0b9,0xbc9b9f6e,0xbd429dac,0xbd001dfd,0xbcfbaded, +0xbd6e5a3b,0xbd962aa2,0xbd778cf1,0xbd30c78b,0xbcc1c877,0xbc28fd50,0xbc79926a,0xbbe325e5,0x3cbd020a,0x3d5ab72d,0x3d3ca4a9,0x3d8f46a0,0x3ccebf1d,0x3d685e40,0x3d064255,0x3c343bd1,0x3cbb7df1,0x3c4693b7,0x3c5a061d,0x3b71dba9,0x3bcbba0c,0x3c88ccfb,0x3c90f2d5,0x3cab31fb,0x3c661e79, +0x3c753c4c,0x3c0d95cf,0x3c9b78e8,0x3cb21d66,0xbbc2e867,0xbbd69c0a,0x3ba6ce10,0xbc2d6730,0xbcac36f0,0xbc1e85ea,0xba0c8918,0x3c93ed5b,0x3d305e7c,0x3dab7de9,0x3dc38034,0x3df5111e,0x3e19e470,0x3e228f99,0x3dfadaec,0x3d382871,0x3d09ebfd,0x3cde04d0,0x3d5e9382,0x3d7acd28,0x3d7629b6, +0x3d97d87e,0x3d533650,0x3cc5ac5b,0x3cbf83e3,0x3cd51324,0x3cd6f8a5,0x3cf42659,0x3ca13e18,0x3bb830cd,0x3c3f9614,0x3b9f9ab6,0x3ba2a7af,0x3c45c267,0x3b786491,0xba20e274,0xbb82e513,0xba6a94e8,0x3bbec405,0xbbb533f9,0xba5d6fae,0x3bed4751,0x3c9dffc3,0x3d09de47,0x3d44461c,0x3da05c0c, +0x3d9f9924,0x3da51e39,0x3d99f3c8,0x3d746ddf,0x3d2f2772,0x3cb7eb05,0xbbe8a91d,0xbbda5334,0x3cc5566f,0x3d79a377,0x3c1f339c,0x3d2a0b58,0x3cde99c0,0x3cbadfae,0x3c4942b4,0x3c3bebde,0x3b4fa988,0x3bb9a58b,0x3b2450e9,0x3ad6d32b,0xbb2724e3,0x3c1a59d9,0x3c64505d,0x3c92d64e,0x3c150e96, +0x3c475817,0x3c8f458e,0x3c76102e,0x3bd7adea,0x3bc3658c,0xbb6a0407,0xb9d51d28,0x3c284217,0x3d08c817,0x3d244f84,0x3ce226fd,0x3c7a24c7,0x3c06f8be,0x3be25b87,0x3ca1a5ad,0x3c4ef351,0xbc7a8580,0xbcbb8627,0xbc900068,0xbb18d8cc,0x3bbed36e,0xbbd8ac24,0x3bdf5f17,0x3cfaee25,0x3ca8486e, +0x3cd15507,0x3ca43702,0x3c72d2f3,0x3c37205a,0x3c92ec7c,0x3c609dd2,0x3cdc3131,0x3c2cf54d,0x3c25950d,0x3b39734d,0x3bfcfdd8,0x3c140e06,0x3c5b6bc2,0x3c8fd0ea,0x3ce9e423,0x3cafcbb8,0x3bbc68a6,0x3bb6b9dc,0xbbb24de8,0xbb5212a3,0xbb02adce,0x3aefb0d3,0x3c24adda,0x3c8fea2c,0x3cca1479, +0x3cad54ad,0x3c9bc426,0x3c7f79b0,0x3c793b91,0x3c293f2d,0x3af5d1cd,0x3b6483f3,0x3bf3acf6,0x3c313eb9,0x3cc209b5,0x3b543595,0x3c49ebfc,0x3c08a2f8,0x3b7d009d,0x3b0279a9,0x3ab911b3,0x3c084ff5,0x3ca3f06c,0x3c93b64b,0x3c79b8d4,0x3cbb08a2,0x3cc2d81e,0x3ca0924c,0x3c9ec8e5,0x3c42ba4a, +0x3c8e5aa2,0x3c384347,0x3c4c80f7,0x3c816a98,0x3c8cbf4e,0x3ca5f5e4,0x3cb02568,0x3cb8f8b0,0x3ca6aa93,0x3c9029e5,0x3c84df8a,0x3c601543,0x3c40cfd1,0x3c1ec5fd,0x3c009f13,0x3c10ccd5,0x3c0fdce8,0x3c37f942,0x3b8d37bf,0xba5164a3,0x3d117f37,0x3d3a2dbe,0x3cde9e2f,0x3ce6e001,0x3d331f4e, +0x3d00b18e,0x3d083c32,0x3d0aee82,0x3cf3e079,0x3d0ca7d4,0x3d16730a,0x3d15836d,0x3d4531fb,0x3d004a85,0x3d053fc1,0x3d3fdaba,0x3d127854,0x3b256084,0x3bf73549,0x3bf94292,0x3c0300d9,0x3bfd35fa,0x3bfa4968,0x3c073d40,0x3be81bdd,0x3bce6ae8,0x3ba5a882,0x3b9f6e1f,0x3b92565b,0x3b7cff9b, +0x3b95e1c7,0x3b9397f9,0x3b874232,0x3b7af6e5,0x3b887a42,0xbcb97b91,0xbcc3a476,0xbc9077cd,0xbd6b3dce,0xbd63e732,0xbc332af3,0xbd4936b7,0xbd5e4592,0xbcc5feab,0xbcd498a0,0xbccb2f77,0xbc85c95c,0xbca2d26d,0xbc9f22f9,0xbc7eb9c5,0xbd616f09,0xbd4e1ed4,0xbc423344,0xbd5f7caa,0xbd645236, +0xbc372347,0xbc978f31,0xbc99e41d,0xbc96309b,0xbc97a503,0xbc9acaec,0xbca414ff,0xbcacac51,0xbcb0873e,0xbcaade41,0xbcaf7007,0xbcbef2c4,0xbce89f40,0xbcf5e4c0,0xbd02c2d2,0xbd06bebf,0xbce896e6,0xbd08dc04,0xbd0d365c,0xbcee8521,0xbcc950fa,0xbcddfc19,0xbcc6ec9c,0xbcac8582,0xbc9fcfd2, +0xbca0b50b,0xbcf46e2d,0xbd1bb25d,0xbcf9245a,0xbca8ee94,0xbcdbb8da,0xbcb32718,0xbca44a86,0xbd0b4676,0xbcc0feeb,0xbd1fde45,0xbccdd53a,0xbc6becb8,0xbcbbbdd7,0xbc9f93bb,0xbca446db,0xbca51d58,0xbcb932d8,0xbcc52234,0xbcce4d39,0xbcd68273,0xbcf40f97,0xbd1f05d2,0xbd545052,0xbd647ff1, +0xbd6c2eab,0xbd64df75,0xbd42d948,0xbd365bf3,0xbd028dc6,0xbd066bc9,0xbcde72ff,0xbc06dbcb,0xbc1a778b,0xbc253772,0xbbfae73d,0xbc8c68e0,0xbb88d0ca,0xbca85ff4,0x3addcf89,0xbc1543ca,0xbc0b248b,0xbc6bb152,0xbc32efea,0xbc65c0f6,0xbc97dbbf,0xbd10fb1a,0xbc94eeea,0xbb439fd1,0xbc520c01, +0xbc3972ed,0xbc4966f5,0xbc6e9fb0,0xbcbf291d,0xbcd6addc,0xbcf49385,0xbce5dbfb,0xbd068766,0xbd396c45,0xbd85b69c,0xbda334a6,0xbdb7a1a6,0xbdbbbade,0xbd85193f,0xbd914f3d,0xbca79ec9,0x3be12044,0x3bc6026f,0x3ca7bc77,0x3c9c922b,0x3ca04416,0x3c988e87,0x3c027cf7,0x3b6840c3,0x3c754fe6, +0x3c633a6a,0x3c8fd7f7,0x3cc82e25,0x3c9c77f3,0x3c947cb8,0xbb875117,0x3bdc2704,0xbcab8cbd,0xbb8933c0,0x3b2c7358,0xbc94af78,0xbc6a797e,0xbc5fb46a,0xbc824594,0xbcedeb8a,0xbcf56506,0xbd0513e8,0xbd0746f1,0xbd4e89c2,0xbda56921,0xbde17dc9,0xbe0163e0,0xbe0bebbf,0xbe075778,0xbdcbf0a6, +0xbdc42dee,0xbdda19c4,0xbe052ada,0xbdb64272,0xbd148e4e,0xbc98c8e8,0xbc891933,0xbcbca435,0x3c0420ab,0x3ca14d51,0x3c490070,0x3ca0ff5e,0x3c9532c0,0x3a9c42dd,0x3c190e11,0x3c68469f,0xbbaf8fe8,0x3abd83e7,0xbcbbe749,0xbc612590,0x3cd51d49,0x3cc3a1f6,0x3d361e82,0xbbefc6d9,0xbc671875, +0x3c990c66,0x3cb43cbf,0x3c97ab75,0x3be5f5cb,0xbb2c9341,0xbc4ec64c,0xbd2dead9,0xbd5976f3,0xbd502284,0xbccc44d5,0xbd9589f3,0x3d7939dc,0x3d548855,0x3b969b4d,0x3c51960a,0xbb7c0f5e,0xbb81c171,0x3c3472f0,0x3cffa7fd,0x3c5a202a,0x3b97fed9,0x3aa6abc5,0xb9611adf,0x3bf2b4dd,0x3c99c111, +0x3ca875d5,0x3c6ecd0f,0xbbf2abbf,0xbbcd67f9,0xbcbbe6ce,0xbce880d6,0xbcf6d711,0xbd760763,0xbd9bedb9,0xbd96c111,0xbd915de6,0xbd839c4e,0xbd7300b3,0xbd01121d,0x3abdd1eb,0xbc768c8b,0xbd764c2d,0xbe0b801c,0xbdf459d3,0xbdf8659f,0xbdb1fafa,0xbcaa91ce,0xbcd43278,0xbc2136a1,0xbbcb1d97, +0x3a5f6ac3,0xbac29813,0x3d099381,0x3ce17206,0x3caf764f,0x3a711b3d,0xbc1d8196,0xba80edc4,0xbb1ebcf3,0x3b3549d1,0xbc6a846c,0x3c5d18cc,0x3c6b6af4,0xbcc06855,0xbc9229a2,0xbd150132,0xbcdf39e5,0xbcb8172f,0xbce51188,0xbc9d3cc2,0xbcd563b7,0xbd0f5995,0xbd2f1929,0xbccb49bb,0xbb226b61, +0x3c848349,0x3d257603,0x3cd0c38f,0xbcea9499,0xbd07cefc,0xbc3c855e,0x3cf841e6,0xbc237a14,0xbdb1842e,0xbbc3bbdd,0x3c84a68d,0xbb904031,0x3b76f955,0xbb70c3e4,0x3b995760,0x3b74e580,0x3caaecfa,0x3cac7490,0x3c609906,0x3c219445,0x3c5885a3,0xbb9b5f38,0x3c822ffb,0x3c49fcfa,0xbc67bd9f, +0xbc3ae763,0xbccd505f,0xbc630c6d,0xbc30fc69,0xbcaf2fad,0xbccef833,0xbd293cd0,0xbd1d6077,0xbc9f72fb,0xbca8dd03,0xbcdc7b68,0xbd3e95cb,0xbc3b9980,0xbaaf138c,0x3c52d768,0xbd83030e,0xbddc3de9,0xbdfbee02,0xbdf1935c,0xbdb820d5,0xbd9a519a,0xbc546072,0xbc17bc78,0xbb87e1ed,0x3c6654d8, +0x3c6577e2,0xba86f382,0xb9ef7cd7,0xb9e42cb3,0x3aa05534,0xbab016a0,0xbac82f31,0x3ad00d2b,0x39d5ff0a,0x3aff1f6c,0x3bd6772c,0xbb8b0594,0xbc8660a2,0xbc365a6b,0xbca13135,0xbc83377e,0x3bf4ea62,0x3a08c9d0,0xbc1aa350,0xbc925777,0xbd1a9763,0xbd4fb4bd,0xbda43ee8,0xbd32cd55,0xbd16eb6f, +0xbd10c482,0xbd80b662,0xbd9fd38e,0xbd9a0339,0xbda9872c,0xbc9f400a,0xbcf42267,0x3b15bc2b,0xbc20136f,0xbc210270,0xbc256cfb,0xbb4a1ea3,0xb9e676c0,0x39c2ddd6,0x3a9c22ba,0xbae476fe,0x3b890f04,0x3bfbad77,0x3c01beb3,0xba914bda,0xbc0e9630,0xbc667ab3,0xbbc99d48,0x3b20c382,0xbaf4df00, +0xba9b7dad,0xbbf59d06,0xbcc21fc1,0xbd003533,0xbd1424ff,0xbd1a0738,0xbcd56c8f,0xbc4da35d,0xb9c4aa00,0x3b58c968,0xbbb0e7ea,0xbcb70142,0xbcdf57f4,0xbcf4ce7f,0xbcaa40fd,0xbcb6707d,0xbc5c1ba4,0xbc4a34f9,0xbcc9daee,0xbc849e40,0xbc214b5f,0xbc03654d,0xbb94070e,0xbb7e9512,0x3a3c1d4f, +0x3bbd9cd6,0x3bda0b1a,0x3bba9044,0x3bd98d46,0x3a75ae33,0x3b78763d,0x3b340552,0x3b8183dd,0x3b3ad577,0xbb2884eb,0xb99bf125,0x3b61d4bc,0x3bba2d9f,0x3c2a2589,0x3b25eaec,0xbbe01bff,0xbc8cf418,0xbc832a79,0xbc8fddaa,0xbc931baa,0xbce46e3b,0xbd092c7a,0xbd22db7e,0xbd0c39aa,0xbcfb37dc, +0xbcd00d7c,0xbcc0be60,0xbc81c018,0xbcb097b6,0x3a6d3e1a,0xbc4badf0,0xbc507110,0xbbf594c8,0xbc12c47f,0xbc2a3bba,0xbc2a706a,0xbc92bb46,0xbca08d50,0xbcb78fc2,0xbc8f7908,0xbca4ad6b,0xbc11ed82,0xbb397187,0xbbfe6b3a,0x3b174389,0x3c69d1bc,0x3c56ea2b,0x3c911493,0x3c82b8e3,0x3c905a1a, +0x3c99fcf1,0x3cbd8cab,0x3cdf5949,0x3c9e5119,0x3c336470,0x3b37a237,0xbba655da,0xbc4f2879,0xbcb3be60,0xbca344db,0xbca54613,0xbc9e0884,0xbc9a08fa,0xbca7d8ad,0xbcb69bf5,0xbcf4cc17,0xbc986e16,0x3ca6f52c,0xbd02e724,0xbc9ac1b1,0x3c2ee97b,0x3c2b82f5,0x3c441004,0x3c77d050,0x3c7f3c10, +0x3c863163,0x3c95976b,0xbcb749e8,0xbd01a3aa,0x3cb3114b,0xbc8289a1,0xbcbd39ca,0xbc5a36d0,0xbc570c6a,0xbc524cc9,0xbc46684f,0xbc3a515b,0xbc3e568b,0xbc2a2ec7,0xbc67ddd9,0xbc8324cc,0xbc9468fa,0xbca36644,0xbcb28a07,0xbccd9675,0xbcc036d3,0xbcbb8ce9,0xbcb428d5,0xbcb697a5,0xbce6d2e2, +0x3ce77e37,0x3cabde6f,0x3ccefe67,0x3cf581ab,0x3c15f370,0xbd37b40b,0x3d283d2f,0x3c86eb2c,0xbd0423ad,0xbd0f6b0e,0xbd13f2eb,0xbd1f11c0,0xbd20aca4,0xbd24c881,0xbd333763,0x3c847a12,0x3d25bdb9,0xbd4d5bfb,0x3c405661,0x3d0d50a0,0x3cebcd25,0x3ccf98df,0x3ce9a5e9,0x3cd8bd01,0x3ce228f0, +0x3ce620bf,0x3cf721a9,0x3ce3983d,0x3ce55c07,0x3cf17430,0x3cf86211,0x3cfe0ae9,0x3cf7581e,0x3d0bac3c,0x3d06aa80,0x3ccd5f45,0x3cd0261e,0x3c992a35,0x3cbe90b0,0xbc58cc2e,0x3ca5d23d,0x3c884ffd,0x3c321952,0x3cb032dd,0x3ca0d558,0x3cc986b4,0x3cec8efa,0x3ccedac5,0x3d051db2,0x3cd69b78, +0x3cdd2bcf,0x3c7ba128,0x3c881a84,0x3ce69771,0x3ca0c3d1,0xbb07ab2e,0x3d11a530,0x3cfcab2f,0x3d19f0f7,0x3d076c05,0x3d15e2b5,0x3d182423,0x3d2732de,0x3d0c0e14,0x3d0df4b8,0x3d2aabcd,0x3d39f68e,0x3d48caa5,0x3d3f14b4,0x3d666506,0x3d56d3ea,0x3cf83b28,0x3ce7cb2a,0xbbf952b4,0xbbadfd97, +0xbaedc60d,0xb86d71da,0x3baadaa5,0x3c1d29f9,0x3c33e66a,0x3c6e4fde,0x3bf0260b,0x3befff93,0x3c69ff6c,0x3c93c031,0x3c54c62d,0x3c86e9a4,0x3c8a2e5e,0x3cabb133,0x3c65cc8b,0x3c7090e3,0x3cbd83cf,0x3cde33bc,0x3d0a6cbc,0x3d1d8d91,0x3cf58248,0x3d146b4d,0x3d159ea8,0x3d3e9be7,0x3d07765a, +0x3d15b724,0x3d3dce78,0x3d46fb20,0x3d5d2eea,0x3d5bdc7b,0x3d9d26df,0x3d91b343,0x3c4eadc8,0x3be80e46,0xbcef139b,0xbd19b21c,0xbd01bdbd,0xbc3111b5,0x381e2621,0x3c2a949e,0x3c3b1183,0x3c2166a2,0x3be7bb2a,0x3bf46c6b,0x3bf5b943,0x3c2f917e,0x3ca83261,0x3c78aa80,0x3ca8756c,0x3c895e0c, +0x3c809dfc,0x3c4e9234,0x3cad85bd,0x3ceab7d0,0x3d23d7b3,0x3d5bc5d1,0x3d22af69,0x3d4f1c6c,0x3d66dcba,0x3d8392e6,0x3d3bcb65,0x3d30575f,0x3d7d3500,0x3d98bcb5,0x3db3746d,0x3db660e0,0x3df6a861,0x3dd5924f,0x3c4b6a3e,0xbc2c8340,0x3d52f8b7,0x3cf11430,0xbd0d8852,0xbd1c8e38,0xbce1781b, +0xbc36c9f9,0x3ae79365,0xbbda5e3e,0x3bf250c8,0x3c9f0f01,0x3c042c34,0x3ca7b212,0x3c925d22,0x3b231cea,0x3c8142dd,0x3c886c98,0x3c05ff96,0x3c5f2943,0x3cdf4be0,0x3d086e10,0x3b561b0f,0xbb5087ed,0xbbf081db,0x3b89b8ad,0xbc47518c,0xbd2ef769,0xbc974ee2,0x3b7b909c,0x3d0f649b,0x3ca53ddf, +0x3cb7d20c,0x3c8e6194,0x3cfdf458,0x3d1134da,0x3d342016,0x3d14de42,0x3bef09b7,0x3d50a625,0x3d9a675c,0x3d52f717,0x3d082c78,0x3c985531,0x3c675c1b,0x3cd91392,0x3c324261,0x3b96838a,0x3bcfe979,0xbb21e9d1,0x3c01ddcd,0x3cb8d819,0x3cd44892,0x3ce0b548,0x3ca706d2,0x3c89bd8b,0x3b0b957b, +0x3ccef86f,0x3d3bd03d,0x3d5aec7a,0x3d8c0c65,0x3d6a9aeb,0x3d48f9c9,0x3d5cb837,0x3d18a6c9,0x3cdd60f7,0x3c7aa267,0x3d069d33,0x3ca30a30,0xbcf06f27,0x3cbba609,0x3cd19b1a,0xbc3ff33c,0xbb34a914,0x3d852404,0x3c889f94,0xbcba5e84,0xbbdb4617,0x3c913e63,0x3d3f7c4b,0x3d1accd6,0x3c8767bd, +0x3be2a815,0xbbbb659a,0x3a23af4e,0x3a6c5887,0x3b6d8e53,0xbcabbc9c,0x3cd2c7a1,0x3d0ba7d9,0xbc0621d7,0x3a1ac58b,0x3b0292bf,0xbad6ceef,0xbb0bc597,0x3bcdbff8,0x3c9a46c6,0x3d3bfbaf,0x3d871850,0x3dadea6d,0x3d553c68,0x3cf0426e,0x3ca993c8,0x3cbb08c4,0x3d825053,0x3e06e9d4,0x3e4b962f, +0x3e6c7935,0x3e738530,0x3e02474f,0x3dc967a6,0x3bc932d6,0xbc009a6e,0x3c91f1b5,0xbbbc2dcd,0x3c9de98f,0x3c71f488,0x3c4b9deb,0x3ccf6c7c,0x3cb712a7,0x3c6984b0,0x3c49280e,0x3c6f6d85,0x3ba532cd,0x3cd3222b,0x3cc16444,0x3b72e85b,0x3bb2337f,0xbb1de43b,0x3b076969,0x3bcc0173,0x3c121049, +0x3bc456c1,0xbb851700,0xbc092f9e,0xbbe69040,0x3ca655a7,0x3d322061,0x3d5b7347,0x3d98753a,0x3da75623,0x3d5151d7,0x3db84ff8,0x3df2b3a1,0x3e306500,0x3dfe1e16,0x3e0c4704,0x3d90b58d,0xbc164fc7,0x3c5c847d,0x3c8cda71,0x3c80e4a2,0x3c8f7c34,0x3c4bf2f9,0x3c1e42d6,0x3c09a5f1,0x3bd4084b, +0x3ad394aa,0x3b217be7,0x3c36a874,0x3c0c736d,0x3c00453e,0x3bfa6640,0x3c9873d5,0x3c55afb5,0x3c4a809d,0x3ba7bcec,0x3b507ea1,0x3c4d12de,0x3cb236a3,0x3d10f22e,0x3d5c29dd,0x3d47370d,0x3d669b7f,0x3d95d41b,0x3d9d36f2,0x3d9b8bf2,0x3d75b28d,0x3dd8ae79,0x3e02a220,0x3e129dff,0x3e084827, +0x3d8ae6c2,0x3d5a06d9,0xbb8fcd26,0x3c405f67,0x3b86cd5f,0x3c4176df,0x3c642b2a,0x3c38113a,0x3c75285a,0x3c32884b,0x3c0188f6,0x3bf362e9,0x3c1af871,0x3bb4fea7,0x3c1e6f1e,0x3c526254,0x3c5115ba,0x3a5e7fff,0xbb350ca3,0x3ad61ab9,0x3c5c05b3,0x3c52049f,0x3bb212e2,0x3c8d94f9,0x3cb3a9b6, +0x3ce92f86,0x3c508637,0xbb0cbc1f,0xbc6d8f02,0xbc259b0e,0x3a12e84a,0x3c813770,0x3c97c932,0x3cdaf2cc,0x3d39f006,0x3d684137,0x3d0a277c,0x3cf453d5,0x3cd6446d,0x3cf70b5e,0x3ca344f1,0x3c96641e,0x3c53b458,0x3c4370a4,0x3c048fcc,0x3c34d8a4,0x3c4438e4,0x3c3594e2,0x3b5ad29d,0x3b9b0c60, +0x3b74fe0a,0x3bc6db19,0x3bc99dac,0x3bcfaeeb,0x3c51aa7c,0x3ba085a1,0x3a8425d6,0x3bbfce3b,0x3c033c1c,0x3b5a81a5,0xbb7cd26d,0xbc384ff2,0x3a6e78d9,0x3c5650ac,0x3cc140d9,0x3ca73d3d,0x3c767611,0x3c267ae1,0x3ca358f6,0x3ce82738,0x3d12035b,0x3d04e2f3,0x3c859be9,0x3cb114d8,0xbc90cd1f, +0x3c69c8ea,0x3be3f7c4,0x3bfdc191,0x3c9046c1,0x3c872786,0x3ca7f120,0x3ca7e8f8,0x3c81d9bb,0x3c9cae92,0x3c810aa9,0x3c6656d2,0x3c16e095,0x3bd65f3c,0x3c869d0c,0x3c496809,0x3c0b1640,0x3bf32d43,0x3b2d0d4c,0x3b7ec2b0,0x3b1b15d2,0x3adb90bd,0x3b38fb90,0x3aefb0f5,0x3b258b65,0x3adb0222, +0x3b7c06b6,0x3bd77b86,0x3c43991d,0x3c771e43,0x3c7fe0ef,0x3c749d38,0x3c811cac,0x3c852245,0x3c1c6915,0x3c803b98,0x3c1a8154,0xbbeb8d19,0xbd190d59,0x3c916146,0xbb476607,0xbcec8031,0xbcfff5e3,0xbd042829,0xbd0a0e82,0xbd1203ed,0xbd17af0c,0xbd1fe8af,0xbb6d71dc,0x3c514fcb,0xbd0d026b, +0xbbab512a,0x3be01db5,0x3bb00dfc,0x3ba64254,0x3b9a8610,0x3b815a4c,0x3b82d6b9,0x3b5f34b0,0x3b389460,0x3b8f75f9,0x3bc3ec0c,0x3be79b33,0x3c0bf22a,0x3c1ccfb0,0x3c416747,0x3c37e1b3,0x3c397cfc,0x3c327d08,0x3c40bc4b,0x3c0cbb64,0xbd0ca859,0xbce94f4e,0xbd24a3c9,0xbcb8c3db,0x3c049259, +0x3d62014a,0xbd0aae70,0x3b96ee34,0x3d48f338,0x3d4e32b9,0x3d4ffe4f,0x3d49efba,0x3d5e42d4,0x3d61eef5,0x3d63588e,0x3bcfdd51,0xbce820fe,0x3d795585,0x3c1a2a21,0xbcaac2c2,0xbd2c3532,0xbcf78ad1,0xbd0e48fe,0xbd143e98,0xbd0ea0e4,0xbd0d57df,0xbd0c2434,0xbd0e6430,0xbd104bec,0xbd0bee6c, +0xbd1dad81,0xbd24571d,0xbd1d4053,0xbd294576,0xbd1d216f,0xbcf3c66a,0xbcfee903,0xbcaac742,0xbd0be70b,0x3c231e9a,0xbd113dea,0xbc29d7d1,0xbbafa6d5,0xbc94e6d2,0xbc39fdee,0xbcc95267,0xbcd305a9,0xbc7c3b8a,0xbcc0ebb4,0xbc9897b5,0xbca0dd02,0xbb03a176,0xbbcf93f5,0xbc88d008,0xbc944513, +0x3caac47a,0xbd2420bc,0xbd14e9ad,0xbd2294a3,0xbd3fa0a8,0xbd364089,0xbd35d0d0,0xbd2f3352,0xbd322dac,0xbd349a69,0xbd2daf86,0xbd59445e,0xbd62e081,0xbd41a413,0xbd6bc5a8,0xbd5432e6,0xbcee60ec,0xbcccf5d1,0xbca2cf64,0xbd186569,0xbd14f085,0xbd001581,0xbbe1ece2,0xbc1bf9ce,0xbb82a35d, +0xba957d26,0x394edda9,0xbc0e9589,0xbb089fbc,0xbc4859ad,0x3bd7e3a3,0xbc6b40c0,0x3b700ac3,0xbbc14965,0xbbb873ed,0xbc3c0094,0xbc346345,0xbd02f3f9,0xbd335d10,0xbd333852,0xbd748248,0xbd546d5a,0xbd51473c,0xbd4a8eb6,0xbd53c68b,0xbd61658a,0xbd4da468,0xbd90f601,0xbda39bb5,0xbd81f435, +0xbdac088d,0xbd839f16,0xbc95862c,0xbca6b1f9,0x3c9ff226,0xbc8ab723,0xbd44d324,0xbd3b49c5,0xbc49a7fa,0xbc5480ec,0xbaab4a1d,0x3c2805fb,0x3aba99c6,0x3b862d6a,0x3b6c23e5,0x3c75f9ea,0x3c6013eb,0x3b8274a1,0x3c383584,0x3b78569c,0x3b9ed37c,0xbc2cb5d0,0x3a9dc98b,0xbcec9e4f,0xbd2e9e82, +0xbd48e8e6,0xbd9c6162,0xbd8e66d3,0xbd9489bf,0xbd899244,0xbd8e7a06,0xbd8d9ec9,0xbd7db848,0xbdc138a0,0xbdc5f9e9,0xbd87180c,0xbdcab429,0xbda1db00,0xbbcf01eb,0x3c0d8235,0xbde778f3,0xbd58db44,0xbca8c973,0xbcfaaa83,0xbc36efce,0x39bc5dc4,0xbb90631d,0xbbce4462,0x3b88daf1,0x3c17cc3c, +0x3b1550d8,0x3c5910ee,0x3c32f0dd,0x3a1cfb3e,0x3baec052,0xbb078978,0xbbd93abd,0xbcdc92cb,0xbcaeab2e,0xbd437561,0xbd8a8925,0xbd43fec0,0xbd56b859,0xbd274d53,0xbce3588f,0xbc32bc69,0xbd300d93,0xbd55f054,0xbd5e152a,0xbd8b7041,0xbdb5254f,0xbdf4e2d0,0xbdad44e7,0xbd82f37f,0xbd69e5d1, +0xbdbaaf60,0xbcd7c56b,0xbc0f6977,0x3b95659b,0xbbbda0ae,0xbcf688b7,0xbbb8b341,0x3be8955d,0x3cbd0169,0x3b830098,0xbbb66617,0x3af00afe,0xbb6cd40f,0x3be19be8,0x3c5e70a2,0x3c1f1203,0x3bba63a1,0x3aacef6b,0x3a174f53,0x3c5ee961,0xbc361a1c,0xbd6829e3,0xbd788ae8,0xbd82868a,0xbd84229b, +0xbd78e388,0xbd2f5694,0xbce61cf7,0xbcf702b6,0xbd4418f1,0xbd4f1533,0xbd3329a3,0xbd7775c6,0xbd6ddf88,0xbd7829f6,0xbd5efec1,0xbcd3f6fd,0x3d1da9c9,0x3cc135b1,0x3c3a31fb,0x3c53ab63,0x3d13c541,0x3d38479d,0x3d108f5f,0xbbb07f32,0xba28e0b6,0xbbf39915,0x3964c1dc,0xbb160329,0x39e1da6a, +0xbca36990,0x3c842bc0,0x3c839f1c,0xbbb139cc,0xbc4c6fdf,0xbcac9335,0xbcd00b35,0xbca2ed53,0xbc1d0a5e,0xbc830b14,0xbd46da76,0xbda28188,0xbdcf163c,0xbdee9d5a,0xbddb8298,0xbda84f61,0xbdaf3950,0xbdee9883,0xbe2e4667,0xbdf98f77,0xbd9d4c76,0xbd6c4416,0x3cb55021,0xbd460378,0x3cadfaec, +0x3c6a5b41,0xbbd6c9cd,0x3be0d6fb,0x3b8a30fb,0x3c6dbc5e,0x3be3c288,0x3ca9698f,0x3c82c8c3,0x3b96f838,0x3be3bf9e,0x3c3a3f95,0xb9fb4641,0x3c98d880,0x3ca87147,0x3a89ecfa,0xb6d0d508,0x3b32b37d,0xbc9c43a7,0xbd5c5050,0xbd89d316,0xbd8f3600,0xbda62ddc,0xbda4aec6,0xbd8df1cc,0xbd89aae7, +0xbd413f49,0xbcc9294f,0x3b87484e,0x3b94cfa6,0xbceb27ac,0xbd8ec25a,0xbdfa0d8d,0xbe3837dd,0xbdbd948d,0xbde1136e,0xbccd04c9,0x3d5ecc66,0x3cabf47f,0x3bedaf1b,0x3ca374aa,0x3c3a1a15,0xbb14e4da,0x3b121de9,0xbba97e28,0xbb9654d3,0xbb9499ee,0xba89bf6f,0x3ba2a7df,0x3c39598f,0x3c331178, +0x3b908bf1,0x3b4b6217,0x3bd5ec56,0xbaad9b32,0x3b92cb17,0x3c3742e2,0x3bed008f,0x3b1f108e,0xbaf46e25,0xbc84a91b,0xbc2a0cad,0xbc9e09b2,0xbd37dafa,0xbd3bd3f2,0xbd8da5ca,0xbde9ae4c,0xbdc57fdf,0xbdab9ffa,0xbda8e264,0xbdbe2018,0xbceb76bd,0xbc8443f6,0x3ce71b3e,0x3b232851,0x3c3568a5, +0x3c016a63,0x3bff7dad,0x3c3827f9,0x3b7404f9,0x3b870c3e,0x3b9336e5,0x3b1a1344,0xb9d6224a,0xbb106a6d,0xb9ebb0ae,0xb95d5f67,0xbbc5ef00,0xbaeaf72f,0x3904dee9,0xba81364e,0xbca5fbec,0xbce74e65,0xbceed758,0xbd101312,0xbd17a9c6,0xbd034013,0xbccee038,0xbc39d3ee,0x3bcd62c0,0xbc19a104, +0xbcf1e265,0xbd912e0d,0xbd2a7f59,0xbd03839b,0xbd02c89b,0xbc90bb17,0xbc8ded1f,0xbb4d9454,0x3bda7b73,0xbb7d78e8,0x3bd6c791,0x3b3401db,0x3b0926f5,0xbae956d9,0x3bb6c128,0xb9a02cad,0x3bcab538,0xbaea9bff,0x3c0f8dff,0x3b981132,0x3bcb9d1c,0x3b080282,0x3b9cd82c,0xbb64c74a,0xbc32af42, +0xbcb90dcc,0xbca1a627,0xbc623f82,0xbc46844f,0xbbb2b403,0x3acbb379,0x3c1e5f91,0xba2ae3cf,0xbc2bc071,0xbc924407,0xbcdd8e8c,0xbcfdaa80,0xbd23a39c,0xbd0538ea,0xbcdefb67,0xbcb70c02,0xbc78039a,0xbc827734,0xbc4beafe,0x3cd79af1,0xbb931074,0x3be25567,0x3bcf8068,0xbb4a70bc,0x3abd628b, +0xbc1ca995,0xbc3601e0,0xbbc56403,0xbc762ddf,0xbc84a925,0xbc853037,0xbc0c2382,0xbbf9b72a,0xbc5d113a,0xbc0ce57f,0x3ba16d8c,0xbb5b9654,0x3a7b8b7b,0xbad57166,0xbaca9d6f,0xbb539455,0xbbc74cb1,0xbbe0192e,0xbc447611,0xbc8715ca,0xbcbb0dab,0xbced7ebf,0xbd145b39,0xbd33f05c,0xbd1bab3b, +0xbd0730a4,0xbcde59cd,0xbcb2d76f,0xbc95904e,0xbcbab0b6,0xbc25eb7d,0x3be7db98,0x3cdd9863,0xbc8c62f8,0x3b9af40b,0x3cd88faa,0x3ce29a2b,0x3ce4aac4,0x3cd48594,0x3ce898bd,0x3ced1f70,0x3ce39787,0x3a40e4ab,0xbc8b8230,0x3cd4451b,0x3b2a0098,0xbc412e26,0xbc8131e0,0xbc6179bf,0xbc6e108b, +0xbc644dc4,0xbc5ea763,0xbc512e6c,0xbc3dddf1,0xbc794844,0xbc939977,0xbca82aea,0xbcbccd35,0xbcce6328,0xbcf11e55,0xbcd3da88,0xbcc7f331,0xbcbbc30b,0xbcb0b207,0xbcba2701,0x3cfa2577,0x3cd52519,0x3d2730bf,0xb9fc0153,0xbd0e3c24,0xbd7cf845,0x3c847007,0xbcd3eb81,0xbd69bc6b,0xbd77feb6, +0xbd781156,0xbd645c09,0xbd790864,0xbd7ac7da,0xbd7b8d22,0xbcd5d277,0x3c52283c,0xbd835000,0xbcf4b2ab,0xb9a2b245,0x3d22123a,0x3cd93746,0x3cfd7888,0x3cfd9779,0x3cfed4b0,0x3cff09b1,0x3cf747d3,0x3d01111b,0x3d0270da,0x3d09268b,0x3d03c862,0x3d064d68,0x3d0d200d,0x3d0b2e28,0x3d03898f, +0x3cd7b761,0x3cf2fbb9,0x3ce79fee,0x3d0a2fae,0xbd25f84f,0x3caf3d56,0xbad6ed44,0xbb58c440,0x3c5bd8fb,0x3c2f4252,0x3cb49b8b,0x3c91496e,0x3b1cfc3a,0x3c8e3d96,0x3c8b8af5,0x3c3f1654,0x3a8f79c5,0x3beda95a,0x3c250fa6,0x3c43dde6,0xbd11a3d4,0x3ce45aec,0x3d118d8b,0x3d1256d7,0x3d1dd247, +0x3d201a12,0x3d1f5a65,0x3d12195e,0x3d216a31,0x3d297520,0x3d36b274,0x3d1a86d3,0x3d11f2f0,0x3d1967a9,0x3d14efca,0x3d0399af,0x3c9b0710,0x3cd0499f,0x3d202be6,0x3cfad030,0xbbb2335f,0x3b2ac425,0xbc13e28d,0xbb706d83,0xba8b0186,0x3c2aa63d,0xbb96ef0a,0x3c1f25cc,0xbbb32820,0x3ca8d90f, +0xbaedd0ea,0x3c140b6b,0x3a80ce0f,0x3c614ca5,0x3c1e82c5,0x3b855c83,0xbbd4fab0,0x3c4c753a,0x3d2b46bf,0x3d1aef5f,0x3d3a4f22,0x3d36e854,0x3d3dee3a,0x3d311b08,0x3d4d9133,0x3d507063,0x3d71ce2d,0x3d4979da,0x3d537223,0x3d803fc8,0x3d6d9cf4,0x3d3eca1b,0x3c83259e,0x3cf17b4f,0x3d2a8812, +0x3d23e096,0x3bbe6df0,0x3c78870b,0x3c7d5964,0x3bd42c64,0x3c357365,0x3c906ea7,0x3c1857b9,0x3bbed55f,0x3c514b08,0x3c493e87,0x3c92c8e0,0x3c1a6359,0x3c9e43e7,0x3cd8e7b5,0x3b5bf286,0x3c850291,0xbc1b23c2,0x3c2586be,0x3d3fce73,0x3d458a64,0x3d72e828,0x3d7ebaba,0x3d7ec222,0x3d62d63c, +0x3d83f161,0x3d8f0d71,0x3da8de21,0x3d686d2f,0x3d51b88e,0x3d7ac464,0x3d516db6,0x3ced61f0,0xbb851cb6,0x3c8b4e08,0x3cdc16b9,0xbc26fc86,0xbd123df5,0xbca10960,0xbce941c5,0xbc832085,0xbb961b15,0xbb8f82e6,0x3c122e59,0x3c80d850,0x3bd4fc5f,0x3c767a0c,0x3c688e22,0x3baf3b9f,0x3c19004b, +0x3c131a81,0xbbf7f82e,0x3bbfb1d3,0xbc9eb914,0xba89769a,0x3d37cfd6,0x3cabeb70,0x3c9a4d65,0x3b8e9aba,0x3bbb1864,0x3c6fe333,0x3cf3dda3,0x3cfd8124,0x3ceffc38,0x3cbf16fb,0x3d057344,0x3d114732,0x3d96742b,0x3da7e910,0x3d42f7bc,0x3cc1805d,0x3af162d8,0x3cae32e5,0x3b00e061,0x3ba410f8, +0xba9ed8f4,0x3b82166f,0x3c85487b,0x3cbd5c5b,0x3c33fb08,0xbadb0286,0x3b6f0086,0x3b05a2d1,0x3c0cb985,0x3c333e86,0x3ca2f300,0x3c943ebd,0x3afc0847,0xbabe87bf,0xbcb0cbf0,0x3bed1693,0x3d24038a,0x3d39042f,0x3d9d067d,0x3cdd6a7a,0x394ed90f,0xbc5d4387,0xbce3abc1,0xbcef14c8,0xbc701899, +0xbd81284e,0xbd903d54,0xbd82d1c5,0xbd4f450e,0xbd617638,0xbd9015ad,0xbd0a7fe5,0x3d6b227c,0x3d54a167,0x3c8a7c81,0x3cff97d4,0x3d077151,0x3d4cd0f4,0x3cded3f9,0xbbb2d7f3,0x3bb0df83,0x3bb78c42,0x3bdc6e63,0x3bcf0ad5,0x3c124d8b,0xbc256d4b,0x3cb8681a,0x3d05ea2c,0x3a0e922e,0x3c2496d0, +0xbb053903,0x3bbc2d31,0x3b97f469,0xbc298353,0x3b49f861,0x3ce548ba,0x3d5ec847,0x3d8cd75f,0x3d8cd197,0x3d6b3fa9,0x3d0e1f3f,0x3d3bdeb3,0x3d89ebc4,0x3d848df6,0x3e0538b8,0x3e11b98e,0x3df1b0a8,0x3d9980b4,0x3cacf283,0xbc87287a,0x3a70846b,0x3c5341cf,0xb919c915,0x3c9725d6,0x3cb4d8a3, +0x3ca7b7f4,0x3c9f2272,0x3c3724d8,0xba886c5a,0x3c3ca1de,0x3c46daef,0xbba7277c,0x3c856993,0x3c8484a8,0x3bd69768,0x3c10d57f,0xbc6918ec,0xbbb43c89,0x3c122ae3,0x3bf99a03,0x3baeb493,0xbbe35581,0xbce86ac1,0xbd70f9d8,0xbd6a524e,0xbd372ef2,0xbca8e440,0xbba6720a,0x3c8ab524,0x3ceedfa9, +0x3db71e21,0x3df21b30,0x3e01c0bc,0x3d4d2ccf,0x3da3dd8d,0x3c1ceaf9,0xbd3d9a5c,0xbbeab392,0x3c035569,0x3bdff989,0x3c1cd9dc,0x3b61c8ba,0x3a0b76d3,0x3c16158f,0x3aa01b74,0x3b967618,0x3c04ddff,0x3c4e2b6a,0x3c83dae9,0x3c78bac6,0x3c1f4e2d,0x3c5c412b,0x3b5e6701,0x3ca01ed0,0x3c91d6bd, +0x3bc4c7ab,0x3c15e15b,0x39059ca9,0x3c7124c9,0x3d14dfa6,0x3d5556d3,0x3d75ca10,0x3d9be83c,0x3d332d73,0x3d1651dd,0x3d1eb3f4,0x3d9169b1,0x3da3c80a,0x3da35463,0x3d943df9,0x3d128083,0x3bb0d116,0xbcb0e129,0x39fc9b0e,0xbb297ff1,0x3c08ccf5,0x3c905e48,0x3c785b5a,0x3ca397fd,0x3c852b1c, +0x3c93ea23,0x3c2af1f4,0x3c262b07,0x3c45407b,0x3c4b06aa,0x3bf0577c,0x3a839043,0xbbb0aa26,0xbc03aaf3,0xbc071b13,0x3c009b4e,0x3c72bc5c,0x3cacea5e,0x3c01bbbd,0xbb5ccad5,0xbc35fbd0,0x3b0646a8,0x3c22a20b,0x3c770427,0x3c8d407f,0x3d0173e0,0x3d593111,0x3d5d0c90,0x3d5747cb,0x3d50505c, +0x3d1a5ac6,0x3d0c4917,0x3cb31e78,0x3b1479d8,0x3c07ab51,0xbb864bbd,0x3aa4a538,0x3b0c7177,0x3bc6e9d3,0xbb07f2d5,0x3c14e089,0xbb2a2e34,0x3c8211c3,0x3ac308ae,0x3c33235f,0x3b9d3f81,0x3c3cc785,0x3c0b2ee1,0x3c1bb64b,0x3aaf05c1,0x3caebaf5,0x3cf09d0b,0x3c75b732,0x3c538df4,0x3c8bc3dd, +0x3cc3c9b0,0x3ce00a37,0x3cf51c0d,0x3cfd8f89,0x3d041ed6,0x3d0359b9,0x3cfb209c,0x3d08c5f9,0x3ce86214,0x3cd849fd,0x3ce30f21,0x3ccfae17,0x3c1c93ad,0x3c03b234,0xbcbaa720,0x3c069b6d,0xbb3f0999,0xbb1dddb2,0x3c06cf3c,0x3befbfd6,0x3c87081a,0x3c633a73,0x3ad5c420,0x3c3f2489,0x3c692945, +0x3c30ab91,0x3ae972f7,0x3baf0aae,0x3c3219b4,0x3c362807,0xbbdc7504,0x3c5f7d91,0x3c0f0ba7,0x3c3037e9,0x3c355be5,0x3c1cd8b1,0x3bf20be1,0x3bc435e1,0x3c025dc1,0x3c349b96,0x3c6ea82d,0x3c99df8f,0x3cbfabaa,0x3ce36817,0x3ccb3b4d,0x3cad887a,0x3c8d7aba,0x3c52e739,0x3c80d45c,0x3ca9facc, +0xbb69c6b2,0xbcb1be64,0xbd0cff85,0x3bfa41f2,0xbc95ae44,0xbd11422b,0xbd1c92bd,0xbd221339,0xbd1402ce,0xbd2bd3fa,0xbd36cd01,0xbd37003f,0xbc967e5b,0x3bd90e1a,0xbd24b973,0xbc950aa6,0x3a8ebcb7,0x3caac1aa,0x3c74164f,0x3c832218,0x3c78fec2,0x3c7866d5,0x3c7bfaad,0x3c747b44,0x3c8ae550, +0x3c942045,0x3c9bb138,0x3ca21ffd,0x3ca6ab43,0x3cb53d02,0x3ca46f09,0x3c9ec1cb,0x3c98efab,0x3c94527c,0x3ca84596,0xbc9fb7d0,0xbc6210f5,0xbcf2229c,0x3c9d3a4c,0x3d37ca35,0x3d482873,0x3b537725,0x3d213661,0x3d5b2060,0x3d5e0eb0,0x3d5a8e14,0x3d3bd249,0x3d579733,0x3d587d88,0x3d4b17a6, +0x3d280f84,0x3c1fab97,0x3d57666c,0x3d2d1b38,0x3c9e1db1,0xbcfd6d11,0xbc923d0d,0xbcab48e2,0xbcabe2b0,0xbcb1a959,0xbcb263cb,0xbcb03bcc,0xbca49043,0xbca5b6dc,0xbcb0dbcd,0xbcc01ed2,0xbcc45a36,0xbcc4a6d1,0xbca524ff,0xbc8f1979,0xbc5e2118,0xbc7fa199,0xbc71888b,0xbc797293,0x3d31172f, +0xbc3cef87,0x3c4767df,0x3c3772b2,0xba394bfa,0x3bbab901,0xbc230001,0xbb80f478,0x3c46cf06,0x3830b6e3,0xbb437de5,0x3a632876,0x3c4e57f5,0x3bf5d616,0x3c256bcc,0x3712a1bc,0x3d1c634e,0xbc8eda30,0xbce4796f,0xbcd12815,0xbcea3ee6,0xbcf6b829,0xbcf29f3a,0xbcdee1cd,0xbcb28604,0xbcb10d33, +0xbcce1a7c,0xbcf72d69,0xbcf86eb2,0xbcdfea59,0xbc89659a,0xbc10d87e,0xbadb46d5,0xbbd00447,0xbc56aa7f,0xbbd91627,0x3ca4c0ef,0x3b87e238,0x3c605da6,0x3be04f5f,0x3c038e2f,0x3c439fc4,0x3c4f95b5,0xbbb7330f,0x3c81c5d9,0xbc26abfa,0x3c7c157c,0xbae40dbb,0x3c8e0997,0x3bef6664,0x3c30ca90, +0x3bc802f0,0x3c5f4a42,0xbc371b95,0xbd180680,0xbcf8eef0,0xbd0b1e08,0xbd14f8c7,0xbd14070a,0xbd05621e,0xbcc61127,0xbccd29b3,0xbd097e29,0xbd3eb95b,0xbd4bf8e3,0xbd390864,0xbcb01fde,0xbb91a82e,0x3c4fb5e6,0x3b42ba6b,0xbc26bd86,0x3ab90e7a,0x3cc6e28a,0x3a9dbd71,0x3bbae408,0x3bbdc112, +0x3ba14c6d,0x3c68f617,0x39e0b3d0,0x3b0dab21,0xbb158c1e,0x3c39a132,0x3bf740e0,0xbbf1d0fb,0x3b81e82b,0x3af95c7c,0x3c925223,0xbc19210e,0x3c141d82,0xbc96af62,0xbd418cc9,0xbd2de243,0xbd41d99e,0xbd504aaa,0xbd4377f1,0xbd19c5df,0xbcaa530a,0xbca2e5ab,0xbd0b2486,0xbd560b31,0xbd5add40, +0xbd2e06a7,0xbb8fb9a1,0x3cdb4c10,0x3d4d1dd8,0x3cfba64f,0xbda24954,0xbcd7a6cd,0x3c956560,0x3c0c6f79,0x3c048167,0x3bbc7d59,0xbb8b948f,0xb97012d4,0x3bbb76fd,0x3c5b4fa7,0x3beb93a3,0x3c1dfc07,0x3c375eba,0x3c8b5839,0x3c22ed0d,0xba63cd05,0x3bd322cd,0xbc74b1e3,0x3bbd25ad,0xbc206809, +0xbd3134a6,0xbcbdc4c4,0xbce8ad8b,0xbc226286,0xbc11b086,0xbc8ae863,0xbd00bd65,0xbd4e2b90,0xbd5c294e,0xbd827059,0xbd7aa8ef,0xbd54e983,0xbd213ae1,0xbd5192c1,0xbdb451b0,0xbd840bf2,0xbda87278,0xbcd7a6f5,0x3b2f296f,0xbc290177,0xbc8b9b43,0x3c1c4186,0x3c36d388,0x3c21c70b,0x3bc08632, +0xb7321d03,0x3b182920,0x3abad78b,0x3b7a17c9,0xbb73ee16,0x3c061d69,0x3c35d6c5,0x3c11bc25,0x3aa031a1,0x3c69aa88,0xba33957d,0xbcd7991f,0xbcd1aa75,0xbd4fe943,0xbd2253a8,0xbcebef76,0xbc2d0977,0xbb87850b,0x39c81187,0x3bfc7c92,0xbcf4b700,0xbcf7b841,0x3b4db275,0x3c55af1e,0x3b90ed84, +0xbce832c7,0xbd6bb3c8,0x3d95e20b,0x3d4b22a0,0x3d5a8487,0x3d3920a8,0x3d6faea6,0x3d26c9a5,0x3d0291e3,0xbb9bf39f,0x3c163bf9,0x3af103c4,0x3b5febd4,0x3a70e796,0x3b9a863b,0xbb2bc8d1,0x3caac251,0x3c9cb6b7,0x3c46dc29,0xbbfba5cb,0xbba94fe5,0xbc53098c,0xbcd8bf5a,0xbc25302d,0xbc087c57, +0xbd14de2d,0xbd66efab,0xbd6726fa,0xbd8569bc,0xbd85e39f,0xbd4761eb,0xbdae8819,0xbdb6a101,0xbda9a8d2,0xbc724830,0x3cf524c3,0x3cf63d6c,0x3d9edd19,0x3c9bdc5c,0x3c5ec96a,0x3b27001d,0x39e0db03,0x3be133f9,0x3c4a798d,0x3c9d33e5,0x3c9332e2,0x3c710a6f,0x3bf93287,0x3b13d63d,0x3c082542, +0x3bc39cdc,0xbbff6bef,0x3bbf96c2,0x3c37f75a,0x3b508099,0x39c6066d,0x3c1a65cd,0xbc5100ad,0xbd0e8dd4,0xbd22852a,0xbd454cbe,0xbd4f183b,0xbd2b6517,0xbcbd3deb,0xbca0db46,0x3aa0d3e4,0x3d3de28a,0x3d337b15,0x3d35b0df,0x3c43a20c,0x3d346224,0x3d1bb620,0x3b1e209d,0x3ceea0e9,0x3b028717, +0x3d39885f,0x3d5fa585,0x3cdfb37e,0x3ccae59f,0x3cd2f1e1,0x3c8f9abe,0x3c4fc1a8,0x3c64c117,0x3c03dc6e,0x3bf96a4d,0x3bcdbd84,0x3c12e227,0x3c414992,0x3ca62c23,0x3c950c03,0x3bc9a895,0x3bbe262a,0x3ca71675,0x3c0ef29e,0x3c270be6,0x3c8a4bde,0x3c31dfb1,0x3ca3b261,0x3cbbfe55,0x3cb7e22e, +0x3d1429c7,0x3d3a4d7c,0x3d6a290f,0x3cc6e706,0x3b5ebda3,0xbcb581aa,0xbc999b3e,0xbbececd2,0x3bf4c151,0x3c189c54,0xbb0e50a0,0x3cbca490,0x3cf44a14,0x3ca3b0a0,0x3c9068e1,0x3c908726,0x3c5ac8b0,0x3c80dbef,0x3c7786fb,0x3c4cdc58,0x3b9c081c,0x3c4087cc,0x3c380d15,0x3c1ebef8,0x3be439ce, +0x3c15e4c2,0x3c62740f,0x3c216751,0x3ac4d164,0x3bd1c5e7,0xba8b0c59,0xbb3f0c49,0x3aab0992,0xbc49fa1f,0xbc39f762,0xbb9f3efb,0xbac3f8e0,0xbb488e8f,0xbab001c9,0xbca0184d,0xbce3bb0b,0xbcf763b3,0xbc9fc82a,0xbbd1f7c2,0x3c164331,0x3b913a6c,0xbaaa3ccd,0x3c397fa9,0x3cd63158,0x3c70e9ba, +0x3c89ad06,0x3c598f9e,0x3c2d301f,0x3bff91e9,0x3c5830f6,0x3c0d57a3,0x3ca4b2d3,0x3c01deed,0x3c6ad1b4,0x3c20b428,0x3c67b79b,0x3c409304,0x3c5debea,0x3c895bff,0x3cd89f3c,0x3c903907,0x3c00776f,0x3c5932f0,0x3c5a355a,0x3c6eadb7,0x3c5d197e,0x3c409cf9,0x3c109209,0x3bae415f,0x3a9b44fc, +0xba50afca,0xbb2c8bae,0xbbee8b72,0xbaf13ae5,0x3a57c61f,0x3b041b5e,0x3ba9dde5,0xbad79446,0x3b23dd70,0x3c980fd7,0x3b953809,0x3c6ae14e,0x3c70ee90,0x3c48f8d1,0x3c6a4da9,0x3c30a7e2,0x3c597463,0x3caec039,0x3c834521,0x3c4f7c67,0x3c81a8ed,0x3c8ce487,0x3c346526,0x3c100b18,0x3b10dd94, +0x3c4f5999,0xbc1fccf9,0xbc26c640,0xbc1f1977,0xbc48aaab,0xbc3b19b0,0xbc390cb6,0xbc2f6373,0xbc627373,0xbc7c8304,0xbc8551ca,0xbc854153,0xbc8628b1,0xbc8b5bad,0xbc66b976,0xbc2f7965,0xbbfcce54,0xbb6111c0,0xba2a73dc,0xbb68a77e,0x3c9cd633,0x3cf1ae4f,0x3cc3f65c,0x3c71118f,0x3cf275e9, +0x3ce69bfa,0x3cf02657,0x3cf73100,0x3cdd1e9f,0x3cfc7e20,0x3d04f5e6,0x3d03a384,0x3d01ee82,0x3c765ab1,0x3cedd91a,0x3ce7a661,0x3c8336bf,0xbbff2e93,0xbb1bc32b,0xbb799b4c,0xbb6e2b6b,0xbb92c802,0xbbb05e73,0xbbbecb07,0xbbb9557f,0xbbb1815c,0xbbb4137c,0xbbc40487,0xbbc8cab0,0xbbce312a, +0xbb9cf448,0xbb8030a0,0xbb4a0fe2,0xbb112991,0xb940eef5,0xbb460200,0xbbb08e48,0x3b9b397d,0xbd0fe6b5,0xbd363e79,0xbcb85912,0xbcd8a40e,0xbd2a4afb,0xbce7b19a,0xbcfb5a34,0xbcf699a7,0xbcbd362d,0xbcdd63a0,0xbcd9ce89,0xbcc016c8,0xbd2a503e,0xbce4d906,0xbca7b1bc,0xbd283a5d,0xbd0bec4b, +0x3bf05141,0xbb1b962c,0xbad3d9d4,0xb9abd5e1,0xbad590f6,0xbb05fe59,0xbb544abf,0xbae9bb8f,0xbac8c0f9,0xbaccdbb8,0xbb6bc47a,0xbb9e3b84,0xbba43dc6,0xbbdb470d,0xbbec57d9,0xbbce3d38,0xbbcefa9f,0xbbf664e4,0xbc347c47,0xbd10a7c1,0xbc51a4f6,0xbcc96a2d,0xbc9c269a,0xbc31f023,0xbc0ec980, +0xbba5c0b6,0xbc583ac3,0xbcc20090,0xbc7d8365,0xbc182e70,0xbc5a660f,0xbc659737,0xbc1ebd49,0xbc882a11,0xbc076254,0xbd049e69,0xbbc5f8a9,0x3ae4153c,0xbb9454fd,0x3b1933bc,0xbaa4aca1,0xbabf49a1,0xbb91d18c,0xbad91117,0xbb46018d,0xbbd47d7d,0xbc3cc835,0xbc67f0ee,0xbc4f0606,0xbc85ece2, +0xbc8e4f15,0xbc5c6ba2,0xbc6a3c9b,0xbc33a453,0xbc2aa884,0xbcdb7117,0xbc99a2e5,0xbc9a521d,0xbc5973dd,0xbc19801b,0xb95d0f9f,0xbc49c9aa,0xb8ec2a93,0xbc8d9fbc,0x3b84a055,0xbc1f5d21,0xba3169c5,0xbc375fcf,0xbb6c57f9,0xba9c7d99,0xbbb1f5ac,0xbcb564d7,0xbbcecdc8,0x3c1057c2,0xba84f9c3, +0x3c0a65ed,0x3916be57,0xba83660a,0xbc1ccde4,0xba3a15e9,0xba652fbf,0xbb7e0cb9,0xbc410b75,0xbc9a47f1,0xbc8f2cf3,0xbcfcecd6,0xbd10c08f,0xbcac12c3,0xbcb69809,0xbc4c17a8,0xbc85b5fc,0xbce4b9d3,0xbcad1931,0xbc5925bd,0xbbb81e2d,0x3b66c87a,0x3c7c6b43,0x3bbcc24e,0x3b2931eb,0x3c155f70, +0x3c354f09,0x3c19de3e,0x3c1029d8,0x3c123ab1,0x3c864b14,0x398fc13c,0x3c1378ca,0xbcb1e270,0xbae6d98c,0x3c3c6138,0xbbac2050,0x3c6116a0,0x3b54ace5,0xb96f5f3d,0xbc486f62,0xbb56b0b3,0xbb606fbf,0xbc606a29,0xbce132c1,0xbd19dcf0,0xbd01a384,0xbd4d184f,0xbd5a0b62,0xbce620f4,0xbce1104d, +0xbd0c33ad,0xbd6b1f35,0xbd80248f,0xbd15d095,0xbcdaecf7,0xbcd4bd3e,0xbc91c37e,0xbbefb7e0,0xbb94e7d9,0x3b9fc547,0x3bd9089a,0x3c1059b4,0x3c491afa,0x3c66e395,0x3bd3fcdb,0x3bf8e8c3,0x3ae85a98,0x3c018862,0xbca850bb,0xbc9d6a99,0x3cceaff9,0x3c972cd2,0x3d0a0dc3,0xbc64071e,0xbc42fcba, +0x3c7f25b5,0x3ca4c1f4,0x3c8260a2,0x3b92e6bf,0xbb53398b,0xbc1afe72,0xbc823a32,0xbc9f6ac5,0xbcf0fec9,0xbd428201,0xbd3a8142,0xbc8b09c4,0xbc9268aa,0xbd24d41e,0xbccaf10d,0xbcac2c6c,0x3acc423e,0x3c5626db,0xbb9261a8,0x3a7dd7bb,0xbb6a75ef,0x3afd9cbc,0xba9ed534,0xbaa4c6aa,0xbb592758, +0x3c73a927,0x3c735429,0xbabc5821,0xbbbb0793,0xbc982196,0xbc80de58,0xbc4d8450,0xbcda5580,0xbcb7be57,0xbc8076d1,0xbcaba1d6,0xbd38597e,0xbd2493a3,0xbd0e0de4,0xbc995b96,0xbd231eb6,0xbd212591,0xbce7d918,0xbd12b1f6,0xbd0b4921,0xbce873f9,0xbd12051f,0x3d4aff39,0x3d662484,0x3d1ac46e, +0x3d3ba222,0x3d217f03,0x3d020805,0x3c770b36,0xbb9fdd45,0x3be3b7a4,0x3bad4724,0x39b70d5e,0x3b451278,0x3bda73d7,0xba267703,0x3c2eb3c1,0x3c5f4b13,0x3ae8277d,0xbb0932da,0xbc9937c2,0xbc12a7d0,0x3b30c973,0xbc4158f1,0xbcac3dbe,0xbd10d713,0xbd0ecbf1,0xbcf209d0,0xbbd457b2,0x3be1e7f3, +0x3cbd20a8,0xba214a46,0xbc8e0bed,0xbd2e52cd,0xbd44ed45,0xbd2e653e,0xbcf1809c,0x3c9c0137,0xbd6ea8ce,0xbc8e991c,0xbae2fec4,0xbaba8a8c,0x3c0d1ca5,0x3c700493,0x3cb754ef,0x3cac12cd,0x3c3382df,0x3b777d7d,0x3b161520,0x3b60f0e6,0x3aa79a24,0xbbdea3d5,0x3ad7fb35,0x3a07fe24,0x3b3c5160, +0xbaf4301e,0xbc933662,0xbc677fea,0xbc4d009a,0xbcd1801b,0xbd00156b,0xbd281345,0xbd357d83,0xbd40ad05,0xbd540ead,0xbd6f61e1,0xbd5ff7b7,0xbd6fadea,0xbd00c1fb,0x3c63d972,0x3c9872dd,0x3bd0a0b5,0xbd33ae71,0xbd73bc8d,0xbd428afa,0xbd3dc485,0xbc752457,0x37af4b4d,0x3b6526e1,0x3bf9eed6, +0x3bea4d62,0xba51e939,0xba2843f5,0x3bfcbdd9,0x3c25ec2a,0x3c1bfc39,0x3c1c565e,0x3bb63781,0x3c931c08,0x3c928a2e,0x3c4290ee,0xba81bbf1,0xbc3ada6c,0x3b0f1f8c,0x3b25602c,0x3aed27f2,0x3c1777c4,0x3b86106a,0xbb9b68df,0xbc8ab995,0xbc67d0f7,0xbc5a675c,0xbbe2b56c,0xbc453e27,0xbc74ad57, +0xbc1a04e4,0xbccbba09,0xbd08b037,0xbd267599,0xbd540ad1,0xbc85390d,0xbce2024b,0xbc325d0e,0xbc334c4f,0xbb2dba18,0x3b362c37,0x3c41f741,0x3bfea5c6,0x3c84f4f8,0x3c85093e,0x3c3f9d84,0x3c2e0a7a,0x3c24c545,0x3bbdb1f7,0x3a325cfe,0xbb28ed8c,0x3b0ecd7f,0x3ba13fcb,0x3c09aa59,0x3bf921b7, +0x3c49750c,0x3c2df347,0x3b82542f,0xbc428557,0xbc43f414,0xbba62338,0x3b4ec1ec,0x3bb63568,0x3b91d714,0xbc72c4b9,0xbc7834dd,0x3be356a9,0x3ba6672e,0x3b901687,0x3b9ac32d,0xbc52d5f6,0x3b415d8f,0xbb980237,0xbc529bb6,0xbc221352,0xbc43259f,0xbbfcd50c,0xbb5d2ffb,0x399f3c55,0xba1e8908, +0x3b7a2e78,0xb908c886,0x3c0c9cc6,0x3bf66668,0x3c4c7b89,0x3c17b03d,0x3c0e5866,0x3b879810,0x3b978b32,0x3a9095b2,0x3c133728,0x3c8bc431,0x3c7bdb6e,0x3ca27af9,0x3c8a46c6,0x3c69b6a3,0x3c2e59d3,0xb8c5eb96,0xbc33d3ab,0xbcabe15b,0xbc67c48f,0xbc29b3c4,0xbc127c02,0xbbde7cf5,0xbb477ed8, +0x3b43b6f6,0x3a9a3987,0x3b18e765,0x3a0d958e,0xbab9cc71,0x3bc0831c,0x3b0ac930,0x3bc10ad3,0x3c105968,0x3c27b9d1,0x3c316763,0x3bb7e8a1,0xb9f5668b,0x3a21a2f7,0x3b6c4c25,0x39c5f232,0xbad30867,0x3904e10a,0xbb846cbd,0xba188ac4,0xbbfcdc99,0xbb0d45ab,0xbb16d18f,0xbbc40fdc,0xbbf85789, +0xbc16b57b,0xbc229b5d,0xbc261af7,0xbbd49b18,0xbb48077f,0xbb2815b6,0xbb463504,0xbb9104f0,0xbba6d1d6,0xbb2f9cc2,0xbb1efe98,0xbb05af46,0xbae22bfa,0x3b730bdf,0x3bd51145,0xbc547c2c,0xbc6d69b0,0x3a8c60ce,0xbc068dd3,0xbc571dff,0xbb14708a,0xbb481534,0xbb2369d9,0x3a07dc73,0xbaaf05e9, +0xbb03a308,0xba3ab6a2,0xbc7fd341,0xbc237656,0xbae80f6c,0xbc81778a,0xbc48aba6,0x3bc56945,0x3b3d980a,0x3b585861,0x3b5b28ca,0x3b4d27dd,0x3b392489,0x3af488b7,0x3af5fbf5,0x3ac68a55,0x3b060878,0x3af3932f,0x3b059f60,0x3ad1fa5b,0x3ad93f9d,0x3b0852bc,0x3b43bdaf,0x3b55dbf4,0x3b8e719c, +0x3c8439be,0x3c4ba629,0x3c25d7de,0x3cfd0863,0x3cc02d8b,0xbc7481ac,0x3d03c33d,0x3cd44145,0xbb40c628,0xbb94ff43,0xbbbd26a8,0xbc28fe07,0xbc127566,0xbc1a79b6,0xbc436d04,0x3cda70e2,0x3d0ad42e,0xbc76cf8e,0x3ccb6a35,0x3d0aee34,0x3c6ee62a,0x3c6c6c29,0x3c80d23e,0x3c8066e3,0x3c7388ef, +0x3c7536af,0x3c85a019,0x3c81ad4c,0x3c812386,0x3c81e77d,0x3c855549,0x3c91ee2b,0x3ca5092e,0x3cb67e77,0x3cb17d1a,0x3c91f96d,0x3c7e9b77,0x3bf4aab7,0x3c528ea0,0x3bea06d7,0x3c46098d,0x3c5dfd46,0x3c46cbc5,0x3c86018a,0x3c895e4d,0x3c7f0938,0x3ca7bb21,0x3cbb109a,0x3cb83a3e,0x3c8ac004, +0x3cb58fbf,0x3c79dfe1,0x3c7ff0df,0x3cd71dbc,0x3c9adef7,0x3c69a6c8,0x3cd52380,0x3c8ba1e1,0x3cb3ae80,0x3cb22bad,0x3c9d149a,0x3c955b65,0x3ca5a057,0x3c930c6d,0x3c91b457,0x3c993869,0x3c943fa0,0x3cb15f17,0x3ce38b60,0x3d109618,0x3d09f371,0x3cb01e85,0x3c883acb,0xbba3ede0,0x3aa05fac, +0x3c46413f,0x3bdc1de2,0x3b1f5adb,0x3bf73fe1,0x3c2ed7e3,0x3c7e326e,0x3c35ba36,0x3b69306a,0x3c67a8a7,0x3bc82ff3,0x3c38b1e8,0x3c94c8d1,0x3c8bb35e,0x3c975ad6,0x3c9f48a4,0x3ca8b44c,0x3cdd48eb,0x3cc946f0,0x3c8d71c3,0x3cadb155,0x3cb5f717,0x3c8f0127,0x3c8960d8,0x3cbfede2,0x3ca09a44, +0x3c9af31a,0x3ca40c99,0x3cb07939,0x3d06d146,0x3d3ed569,0x3d7f6713,0x3d62cfee,0x3cac727f,0x3c11a0bd,0xbc9ab2a7,0xbc692cdf,0xbc3b5bef,0xbc6221ac,0xbc3dce9a,0x3a450716,0x3b94d98d,0x3c23b0ce,0x3b4e43fc,0x3b77a3da,0x36b2883d,0x3be6469d,0x3c0f040f,0x3bd20d40,0x3c07385c,0x3c2e5abd, +0x3caed479,0x3c643f0a,0x3cbf4d8d,0x3ce0f415,0x3cc0af51,0x3d04b92e,0x3d0c9141,0x3cdc023f,0x3cd8123b,0x3cff0d51,0x3cb40078,0x3c9f278d,0x3ca49895,0x3cb2c737,0x3d147a6d,0x3d7145fb,0x3dadba12,0x3d9617d1,0x3c89c738,0xbb071ef4,0x3c36099d,0x3cb11b43,0x3cdb5cb8,0x3c8deee7,0xbaff6bde, +0xbbf21b99,0xbb2a0b10,0x3c0f6209,0x3b45da13,0x3be71de0,0x3ba68109,0x3bfb1d2f,0x3c41b2bd,0x3c9f5b1f,0x3c48a882,0x3c33bf70,0x3ca103d4,0x3c87f058,0x3cbed3bf,0x3cabe961,0x3b339343,0xbafe3f07,0xbbdcf4d3,0xbbb181ec,0xbc8c0723,0xbd0f09d6,0xbca33e46,0xbc3a339d,0xbc8e7272,0x3bf3ef66, +0x3cc15c4a,0x3d0a6e3e,0x3cefe123,0x3cbcbae7,0x3c3f16fc,0x3c5b6556,0xbd27a277,0xbcbc1581,0xbc0e1463,0xbbe69473,0x3c3a1b2d,0x3ca4b839,0x3c6c0791,0xbba93dca,0xbb09accb,0xbb42bc65,0x3b6d571b,0xbafbb11b,0xba989ead,0xbb61623c,0x3c92ebf3,0x3cbda1c8,0x3c91135f,0x3c29c68b,0x3ba9465d, +0x3c5ef5cb,0x3cd4dedd,0x3d10ae48,0x3d2695cd,0x3d0b683f,0x3d070c82,0x3cccf8a7,0x3cd30fb2,0x3c04933c,0xbc7273dc,0xbcdbcc99,0xbc2a36b7,0x3d1a739e,0x3d596b10,0x3d4b9b4a,0x39ad4675,0xbcba6101,0x3d90801b,0x3dabb1a8,0x3d62d832,0x3d4344eb,0x3d4ac563,0x3cf5b6b7,0x3c90bacc,0xb920e07b, +0x3c104a26,0x3b24dca1,0x3a354f69,0x3b0e8efd,0x3b24fcef,0xbae97a43,0x3c18626c,0x3c6b42f9,0x3ca9e636,0x3bc78676,0x3c0a8ff5,0x3b0d2b8c,0x3a30ec51,0x3b2f5b04,0xbba6394c,0x3a0fbe4a,0x3c6b673f,0x3cd91ac3,0x3d1d69e9,0x3cd35efb,0x3becb5c2,0xbcdd6670,0xbc496d03,0x3d7ce914,0x3d5099e1, +0x3d7a8f88,0x3dced54f,0x3d960cd0,0x3d5b17b6,0x3b3ee5b6,0xbb826add,0x3ca01155,0x3c51b2f2,0x3ce74178,0x3cc0edcd,0x3cb5c085,0x3bfa9d95,0x3ac0a369,0x3bea28bc,0x3b77adde,0x3b0f09cc,0x3c02b656,0x3c1087d0,0x3c24b09d,0x3ca6c684,0x3bfb2788,0x3abe4517,0x37d61508,0x37930b16,0x3a2c852f, +0x3ad5ff49,0x3c36f180,0x3c505156,0x38eacde0,0x3c2b1938,0x3b8d4f23,0x3c12752f,0xbbf71585,0x3c333cfc,0x3d49213f,0x3ddcf957,0x3e11d5e6,0x3e20ed73,0x3dc5d2fd,0x3dc16fa5,0x3d85cfc1,0x3c5c643c,0x3cb0e0d1,0x3cc1e7c8,0x3c8243b5,0x3c57583f,0x3c759a38,0x3c64e68f,0x3c87fe00,0x3cc69669, +0x3c6a82cc,0x3c48f511,0x3c3248c7,0x3c8f9344,0x3c89506e,0x3c29aa3b,0x3c68546f,0x3c7d1df4,0x3c6a6b76,0x3c0cb93e,0x3be1259e,0x3b9540ff,0x3b6ba198,0x3c3b8dd0,0x3d017738,0x3d38dd00,0x3d7866c4,0x3dac740d,0x3d64d965,0x3d5dd728,0x3d914222,0x3d8fc9c2,0x3d948c2f,0x3d80cdb4,0x3da6eee2, +0x3ce10c2a,0x3cd8b22f,0x3b08ec63,0x3c880653,0x3c8a87ed,0x3cb559ea,0x3ca263d2,0x3c7a04f7,0x3c8f2355,0x3c7befb9,0x3c5eadde,0x3c430d74,0x3c2e39d7,0x3bbc6f8f,0x3c0564b8,0x3c797185,0x3cc06d66,0x3c8742d7,0x3c3dbd7e,0x3c2825a4,0x3c6e5948,0x3c970e1b,0x3cb215a7,0x3d3614e5,0x3d57f2ea, +0x3d444d66,0x3d0eef6a,0x3c639aea,0xbbf615aa,0xbc069742,0x3add89ce,0x3cd24964,0x3cd628fd,0x3cdf68f2,0x3cb498be,0x3cd924b7,0x3c92f837,0x3c3ff3a5,0x3c928248,0x3c99f355,0x3c75ca34,0x3c5f0a0a,0x3c47a6e2,0x3c49a7a5,0x3c20fb91,0x3c0f0eef,0x3c229a3d,0x3c377765,0x3c49af59,0x3c941837, +0x3c5ab568,0x3c1e5089,0x3b85a416,0x3c277137,0x3ca1a706,0x3caa6f99,0x3c7450bf,0x3c708760,0x3c275448,0x3c0f9a87,0x3be8b28e,0x3bf5b447,0x3c122720,0x3c5980b8,0x3c8737ce,0x3cc0c221,0x3cd926c5,0x3cf54b45,0x3ce87f12,0x3cf230bd,0x3d004fbe,0x3ccbccf1,0x3cb7dfa2,0x3cd9b7ae,0x3becdc0f, +0x3ca7dec0,0x3c9c1a9a,0x3c99e790,0x3cb6c254,0x3cb9ffbb,0x3cc243c5,0x3cdad4f4,0x3cdb8273,0x3ce54401,0x3cc12f07,0x3cc823f2,0x3c92bfa8,0x3c654535,0x3c8a217c,0x3c1da6b8,0x3ad9a757,0xb8060a2a,0xbb435527,0xba9d4fed,0xbaa1fd4c,0xba83f680,0xba96beef,0xbafbb995,0x3a6cae36,0x3b6a266f, +0x3bde9286,0x3c35f34d,0x3c86060b,0x3cb74a35,0x3cb842b5,0x3cb8d584,0x3cb99806,0x3cbc5650,0x3c9ca9a5,0x3cb071df,0x3cda200c,0x3c9e586f,0xbb86bcf8,0x3cec2feb,0x3ca85bf6,0x3b17879a,0x3ae2b5a1,0x3a83ae5a,0xba6981eb,0xba8cd657,0xbaaeea78,0xbb1b96ed,0x3cb1b04b,0x3cd772d8,0xbb9968f9, +0x3c8af0f9,0x3caa9380,0x3c2e0782,0x3c3fd69f,0x3c3fe9f9,0x3c38264d,0x3c37938b,0x3c353b98,0x3c293087,0x3c5380a2,0x3c730113,0x3c886b6f,0x3c92aa7d,0x3c9a4a60,0x3ca88c94,0x3ca1bd0b,0x3ca18dd8,0x3c9e5501,0x3ca501b4,0x3ca8bb38,0xbcc997fb,0xbcb768c9,0xbcde6409,0xbccfb071,0xbbb326fa, +0x3d0a59a9,0xbcfbbc07,0xbbf7d4dc,0x3ce717c8,0x3ceb1192,0x3cee70ee,0x3cf549d5,0x3d0291f7,0x3d06ffdf,0x3d130ed9,0xbbcee320,0xbce28623,0x3d254fcc,0xbb467155,0xbcb8ae72,0xbccff71b,0xbcac2e28,0xbcc6a0ab,0xbcc3e8b9,0xbcc7f15a,0xbccb5687,0xbcd00026,0xbcd2743c,0xbcd6eb07,0xbcd1d9a8, +0xbcef9ccb,0xbcf4c1b5,0xbcde190e,0xbcf2c3ff,0xbce9bb00,0xbcc34d0c,0xbcce5967,0xbcc77e85,0xbd045653,0xba9b858a,0xbcdf9b79,0xbc8d83f6,0xbc079bf7,0xbc6a2b80,0xbc252e13,0xbc954046,0xbcb5ca1c,0xbc92ee6f,0xbcbd6158,0xbc8d8c65,0xbc712019,0xbbad2a5f,0xbbdb82eb,0xbc6bf65b,0xbc31551b, +0x3c375cd9,0xbcc808d4,0xbcc0abf7,0xbceba138,0xbcf5692c,0xbd02a96b,0xbd04898b,0xbd053d96,0xbd034d56,0xbd0610fd,0xbd0097d3,0xbd256939,0xbd2d415f,0xbd0e3f6f,0xbd2a5256,0xbd1b3004,0xbccf0917,0xbce3c5b6,0xbcea7baa,0xbcfa982b,0xbce6bd1b,0xbcbac0ef,0xbc614028,0xbbf9dfd3,0xbb26c11f, +0xba13955f,0xbaf7f128,0xbbd495e6,0xbbfa22e1,0xbc3cfd2a,0xba27f7a8,0xbb0dc69e,0x37da487c,0xbb8bed37,0xb97a8404,0xbad7a19c,0xbb9d6f5f,0xbc6ea551,0xbcd6287a,0xbcf75d08,0xbd0b16ca,0xbd109944,0xbd187e25,0xbd236aca,0xbd2920aa,0xbd3ac743,0xbd277e80,0xbd78f85b,0xbd85088e,0xbd469e30, +0xbd8343be,0xbd5de990,0xbccd1c17,0xbd060f09,0xbcabd7f5,0xbce78182,0xbd069dc7,0xbd06c232,0xbcb525b5,0xbc1bd50c,0x3b0a3508,0x3c497867,0x3ae02bd8,0x3a6cbf5e,0x3a07cb36,0x3c035456,0x3bafbe88,0x3c2b8286,0x3bb3c437,0x3b9f397c,0x3c288e07,0x3ba3dbbd,0x3c0e7eea,0xbbf483b4,0xbcd158f3, +0xbd14e4ba,0xbd3b876d,0xbd4eeb7c,0xbd59ed54,0xbd51f66a,0xbd5579ec,0xbd53ff00,0xbd36d450,0xbd9ccbf5,0xbdaa9dfb,0xbd6f6e4c,0xbda11c22,0xbd7bf136,0xbc7a4c9a,0xbcc81868,0xbd94db9a,0xbd35f0db,0xbbf4b334,0xbb66a586,0xbb819cff,0xbbcbd189,0xbc1ae194,0x3a32eb68,0xb8bcc751,0x3a400533, +0x3b04aef2,0x3b2886a7,0x3beb238f,0x3c7a15f5,0x3b89ac3f,0x3ad2d220,0x3c096ee0,0xbbd842b6,0xbc49056e,0xbcecef19,0xbd1d6050,0xbcd700e3,0xbcac38c0,0xbc8f64ce,0xbc7b0c42,0xbcbbda7b,0xbd18ac3f,0xbd3eb360,0xbd84e9d5,0xbd1c901d,0xbd1596a9,0xbd48fcbf,0xbd6ad599,0xbd7eea49,0xbd8901a8, +0xbd969a87,0xbd2567ac,0xbd390c0c,0xbd52a0a7,0xbd1ce505,0xbc91cc90,0x3b239160,0x3c0c5c68,0xbc0edc89,0xbb595d39,0xbbad4ce9,0x3a6a9d3c,0xbaaf138e,0xbb0d48b4,0xbae4ea03,0x3c3ac79d,0x3c235a29,0x3b21a058,0x3b3e4f0a,0x3c134ba0,0xbc44be24,0xbd1456b0,0xbd3b4e24,0xbd6eca31,0xbd412849, +0xbcf7a5a8,0xbca4081a,0xbb1b3c66,0xbc1c4f02,0xbd34edde,0xbd3a32b0,0xbd419ba4,0xbc7543d5,0xbcd9c1d4,0xbcdb4f66,0xbce37bcc,0xbd036a09,0x3cf97eb4,0x3d6278fe,0x3d8debf3,0x3d5f1c43,0x3d644e01,0x3ca6730a,0x3c1007fa,0xbbb0b52e,0xba0f8870,0xbb4ed2b1,0xbb1e1719,0xbaf293f9,0xbb863d97, +0xbb432958,0xbc12d77b,0xbbe8fa6c,0x3ca5b7db,0xbb6cabdd,0xbc7e4410,0xbc98cc47,0xbc0500b9,0xbc18b2fa,0xbca55b41,0xbd2897e5,0xbd851882,0xbdc0d786,0xbda0ad1c,0xbd96e240,0xbd9cbcd4,0xbdb21951,0xbddf59db,0xbdd6f58f,0xbe2a41ee,0xbe1cee91,0xbdd0bbe7,0xbc3e289e,0xbd325fb1,0x3c45aa84, +0x3c09a128,0x3ae5cf92,0x3cb60e2d,0x3c84d4d6,0x3ca75efa,0x3c55d6f4,0x3a5f20e1,0xbb26d94f,0x3b1177ac,0xba351b5a,0x3a1bc955,0x3be16c64,0x3b4b6704,0x3bbb5331,0x3c985b43,0xb89d3af7,0xbaa5dbfb,0xbc27ef61,0xbd0449c6,0xbd31ef4b,0xbd306131,0xbd3cfcdb,0xbd1648f3,0xbce1810c,0xbcdbd2e4, +0xbd25c527,0xbd5d1d3c,0xbd8e587e,0xbd76d7ec,0x3a629419,0xbd1476df,0xbd66d91b,0xbdaff055,0xbd7a2c36,0xbda9fe62,0xbcc398c7,0x3d06881c,0x3c699059,0x3c1dfbb5,0x3c4ec663,0x3bf609ff,0x3b54859c,0x3c1ea4a3,0x3c1f1e23,0x3c8a49d1,0x3c165e0a,0x3be1d265,0x3b924bc8,0x3c34d8a6,0x3c36a907, +0x3c0e9457,0xba1dfa95,0x3a9956de,0xbc07743c,0xbc1ceaec,0xbbe229bc,0xbc5415a9,0xbccb1073,0xbd09401d,0xbd32169d,0xbcfe76d7,0xbcf51b2d,0xbd2d93aa,0xbceaa867,0xbcf024ef,0xbcca97e1,0xbd7b085e,0xbd9f5505,0xbdb13872,0xbda86b61,0xbd24ba5d,0xbce84db3,0x3c12d496,0xba8264a7,0x3c3a6202, +0x3c11f342,0x3c1dbd7a,0x3c2f00b1,0x3b974fc6,0x3bb0eefe,0x3c1ecca0,0x3bb4222f,0x3b1d45ec,0x3aaa89b6,0x3b694daf,0x3bc5bf58,0x3bac4da1,0x3c42fd1c,0x3c597cf4,0x3c2e1733,0xba416771,0xbb85588f,0xb992d071,0x3c1a521c,0x3c7211da,0x3c7c96fc,0x3c337c2d,0x3bbbc3ae,0xbb12022e,0xbac58e6b, +0xbc52ae7b,0xbd0e0dea,0xbc966c61,0xbca64cfc,0xbd11f7ad,0xbd0e16b2,0xbc389818,0xbc0905ac,0xbb871930,0xbbb8ffa1,0x3b2762c7,0x3b00a522,0x3b91e843,0x3ba8a27e,0x3c02e6f3,0x3b53acd9,0x3b8e5f37,0x3b3d6169,0x3c67955e,0x3c5eaa5c,0x3c2a6aa1,0x3a73c001,0xbb634d2c,0xbb4d22ea,0xbaafd561, +0xbc0bc14a,0xbc0e023b,0xbb0ea095,0xba323c3b,0xbb18c016,0xbb78f509,0xbb2cbb27,0xbc07091c,0xbc3c9d3e,0xbc75f19c,0xbc75f047,0xbc4cf0d6,0xbc46763a,0xbc47b0a9,0xbc4d9ce9,0xbc299513,0xbc142efe,0xbaadc4f4,0xba81cbf7,0x3cd51be3,0x3b8a5096,0x3c2aeb43,0x3c3a8989,0x3b880db1,0x3bbf85a3, +0xba12b90c,0xbadd8d78,0x3acd05a4,0xbb8c5609,0xbb99b01e,0xbba25a53,0x385c701f,0x3ad63a7c,0xbba1fea8,0xbb207aa6,0x3b85c18c,0xbab9711f,0x3b5b6e0c,0x3ad9f848,0x3b3a3d47,0x3b64d7e4,0x3b8c98fd,0x3bad2644,0x3b117075,0xba9418cc,0xbbaaccb4,0xbc15fe86,0xbc646f9e,0xbc924d79,0xbc6f048d, +0xbc3660c3,0xbc02baad,0xbbb4316f,0xbb75ce5c,0xbbd5f86d,0xbab3f9ec,0x3c3462f2,0x3d06297a,0xbc081bda,0x3c0053c3,0x3cebc1f9,0x3cf70b9a,0x3cfc3fa7,0x3cfbfab1,0x3d056683,0x3d0906b4,0x3d0b1de2,0x3bb86aaf,0xbc0490a2,0x3cf7d0a9,0x3bc353ad,0xbba1d14f,0xbb8f96cc,0xbb456e24,0xbb6191ae, +0xbb3e7568,0xbb2999fe,0xbb148722,0xbabdee16,0xbb51d9dd,0xbb8d2683,0xbbb18782,0xbbdd7ac9,0xbc03ade4,0xbc32f24f,0xbc0fe1c6,0xbc039db9,0xbbe6a0b9,0xbbc87acf,0xbbf48dff,0x3cd879aa,0x3c9b61f4,0x3d03df65,0x3c20eb36,0xbc84f367,0xbd450c6a,0x3cb46c40,0xbc1890b1,0xbd252cf8,0xbd30a4bc, +0xbd33241e,0xbd2c1e38,0xbd3ac860,0xbd3b9892,0xbd37ab72,0xbc218918,0x3c9f6dba,0xbd4748de,0xbc49ea71,0x3c3c1dab,0x3d0993f7,0x3cc3a51b,0x3cdfa6a2,0x3ce42445,0x3ce2dc04,0x3ce09898,0x3cd85ac3,0x3cd869fd,0x3cdb09ef,0x3ce859c9,0x3ce4a639,0x3ce977a9,0x3cf8b75b,0x3cee0404,0x3cd88a12, +0x3ca1b9de,0x3cafdc3c,0x3c6d4bba,0x3cdd36d5,0xbcdb6702,0x3c9ef711,0x38312f30,0x3b22667c,0x3c8068b6,0x3c4eff49,0x3ca857c2,0x3c980a2f,0x3bff7bc5,0x3c8c1ff6,0x3c824f04,0x3c91a370,0x3bb93c5b,0x3c26a23e,0x3c823f82,0x3c8cb04a,0xbc84b939,0x3d000279,0x3d01734a,0x3d0783b0,0x3d12f675, +0x3d122488,0x3d0d7b46,0x3cffb888,0x3cfe7d18,0x3d024293,0x3d1369e4,0x3d0ee511,0x3d1c8abf,0x3d30b12e,0x3d2d9b03,0x3d0f1146,0x3c82d733,0x3c70e3f4,0x3c34bfe2,0x3cb6b180,0x3b2a18c6,0x3c126ea9,0xbc0f9958,0x3b7892d8,0x3bce9077,0x3c3caf32,0x3af3659b,0x3bf5fc0d,0xbadc1079,0x3c484a9e, +0xba0db902,0x3c93fe82,0x3bd8bde3,0x3c8348ce,0x3c606e0f,0x3c7bbc26,0x3c3f6708,0x3cc685e9,0x3d1df99a,0x3d168326,0x3d38469b,0x3d343f78,0x3d316a1c,0x3d1f822b,0x3d15d464,0x3d1b7436,0x3d462136,0x3d3e63e4,0x3d556873,0x3d6f13e6,0x3d4fbb16,0x3d073074,0xbb177b7f,0x3b835ed3,0x3acc0efd, +0x3c8d6e88,0xba96d681,0x3c0f1311,0xbb82a89b,0x3c00e2cd,0x3c43ba90,0x3c604bd9,0x3bf1a212,0x3b2c4c88,0x3b6c8d04,0x3b7a297e,0x3c2469dd,0x3c97c4af,0x3c776b30,0x3cac233f,0x3c500f95,0x3cd0d9a4,0x3c4739ef,0x3cd5cd3b,0x3d38ad35,0x3d46c0a0,0x3d715a33,0x3d7147e9,0x3d6870a8,0x3d496f4f, +0x3d38641b,0x3d3f5d87,0x3d7858cb,0x3d674520,0x3d8a3988,0x3da665c1,0x3d94865f,0x3d2c6778,0xbc275a1f,0xbc54a03d,0x3ce1cc85,0x3b2870a7,0x3bbd2c6b,0x3c33d5f2,0xbc87bbd6,0xbc37073c,0xbadd8253,0x3b427a9d,0x3b16ef1b,0x3bb9e600,0x3b8532fb,0x3b680aaa,0x3bfb7af7,0x3c6c08f7,0x3c06a235, +0x3c3095a3,0x3c23eed9,0x3c96af1a,0x3b2e2a14,0x3c7a0d71,0x3d0ab3ac,0x3c6191fb,0x3c423925,0x3c9c6d94,0x3c9deffb,0x3b99dfb5,0x3c38162a,0x3c82864a,0x3ccab88e,0x3d596926,0x3d713785,0x3d319573,0x3d1fc7ce,0x3cf0e4d4,0x3c01ffc0,0x3c39b886,0xba872eeb,0xbc85dae3,0xbcab55a4,0xbc1a93aa, +0x3c8bee59,0x3c55b1cb,0x3c3d44b0,0xbba562b8,0x3b56661d,0x3acd9b8c,0x3b5a8f2d,0x3b0db19e,0x3a202aa2,0x3ba6ef7a,0x3c967b06,0x3c9cbba3,0x3c64b25d,0x3c0a6c00,0xbba9ceac,0x3c1fa753,0x3d1a0208,0x3d3b4380,0x3d86d865,0x3d1b2225,0x3caf8ae8,0x3c0297f2,0xbc0e648f,0xbc98e93d,0xbd1e298f, +0xbc8bbbb5,0xbb2a63e2,0x3c9d6ea4,0x3c79023d,0x3c22d2fb,0x3b833898,0x3c04f23e,0x3cf1cb54,0x3d3c94d0,0x3d3af811,0x3d350dce,0x3d2e7b2b,0x3c7da1a3,0x3aec9a04,0x3950a3c1,0x3ad8324a,0x3b02a749,0x3b0db82a,0x3b81d527,0xbaac7845,0x3acd4d9c,0xbbbf131e,0x3ba3abda,0x3ce6ee9f,0x3c944d82, +0x3c0d7dd4,0x3c08a814,0x3c0c125e,0xbba5a89d,0xbb06308a,0x3cddf329,0x3d4d54cc,0x3d4d7aae,0x3d78993f,0x3d37be2f,0x3b71e265,0x3c5d7f8b,0x3d08775e,0x3dad6888,0x3d422f08,0x3d006019,0x3ce455cf,0x3c35f8da,0x3d838fd7,0x3c273f67,0x3c2e5a5c,0x3cda0fb2,0x3cbe86f7,0x3cfcc080,0x3cc043c2, +0x3c8d9c2f,0x3aab79cc,0xbb101e00,0x3a8935ad,0x3b366212,0x3b2a27a3,0x3c0a9f0f,0x3b8ffd3d,0x3baa35c8,0x3cc70415,0x3b6a8f13,0xbc37503d,0xbabb402d,0x3c3202a5,0x3c8fdb79,0x3cc0eceb,0x3c8921cc,0x3c395139,0x39e68eb1,0x3c8e14ea,0x3c120ada,0xbcd023d2,0xbd155d89,0xbcc59572,0x3d1d2588, +0x3d9ce0a9,0x3df97425,0x3e2919ad,0x3dc9824b,0x3daf32bb,0x3cf404c2,0xbcabea6e,0x3bc52f23,0x3c81f051,0x3beb71d7,0x3c24c988,0x3c61a24d,0x3c61625a,0x3ca738cf,0x3c9ecab7,0x3c6251a9,0x3c31df44,0x3c0cdaf3,0x3c163ce1,0x3c1a5a2c,0x3c5b38d5,0x3c1cd084,0xb9eae3e1,0x3b61fac7,0xbba62029, +0xbc839271,0xbc7a309e,0xbc9ea189,0xbc16c433,0x3be6fc66,0x3c5f80c4,0x3cb5bea2,0x3d183de5,0x3d6b84ce,0x3d9e96c2,0x3dda14c7,0x3dc82d94,0x3da524e8,0x3d8b1042,0x3d985883,0x3ccf2ccf,0x3c56ebae,0xbc8592d5,0x3b8f99b6,0x3bea0577,0x3c6128ab,0x3c8e97b6,0x3c4f59d8,0x3c4c5eab,0x3c281ce6, +0x3c7f6dc7,0x3c1030e7,0x3c0020e5,0x3c24e46d,0x3c79a942,0x3c7e6151,0x3c3209b5,0x3c13833a,0x3c0d66af,0x3bed2969,0x3c9fa29f,0x3cf0e9a9,0x3d19ec97,0x3d3ca305,0x3d3fb587,0x3d3f9ead,0x3d1b1d6b,0x3ce0a87f,0x3c2ac69c,0x3cb05e58,0x3d0b7e5e,0x3d546026,0x3d22c18a,0x3d169283,0x3d03f85e, +0x3cb10f96,0x3cc7c8e8,0x3c71e89e,0x3bd196f0,0x3c4c2ad5,0x3b853fd0,0x3bec9870,0x3c041fb2,0x3c4ae8d8,0x3bc569b4,0x3c27931c,0x3b373162,0x3c507252,0x3bdabdfb,0x3c4b1eca,0x3ba10a05,0x3b86f3af,0xba429962,0xba499921,0xbab18d44,0x3b1f25e1,0x3bbad61e,0x3b061dca,0x3aefd06b,0xb98c0913, +0xbaa10ce5,0xbb08cf8e,0x3bbf35c7,0x3c71700a,0x3cba423c,0x3ced46b9,0x3d009715,0x3d130d39,0x3cf7f7e3,0x3cd25c9c,0x3cbe46ae,0x3caa6335,0x3c9872eb,0x3c9985d8,0xbbc115d3,0x3c758ab2,0x3c01e772,0x3bebfdea,0x3c57a582,0x3c3f968d,0x3c8a92f9,0x3c926074,0x3c40bc77,0x3c95daf3,0x3c9800cd, +0x3c916a1b,0x3c31d4b3,0x3c3f0f60,0x3c84c5d6,0x3c5a2e51,0x3a94b3a4,0x3c35e7b6,0x3c04e79d,0x3c1a3bbe,0x3c22dc7f,0x3c2723a3,0x3c30ea08,0x3c227c31,0x3c5d343c,0x3c830ef3,0x3c9ffdb3,0x3cb144a6,0x3cce3e08,0x3cf31f88,0x3ce2b758,0x3cd6407e,0x3cc15fdd,0x3cad2181,0x3c9f4d22,0x3cbe43b1, +0x3c2a559b,0xbb5ec688,0xbc910bca,0x3c839ea9,0xbb13b9d3,0xbc8d8433,0xbc97be86,0xbca0ad1d,0xbc95a6e2,0xbcaf70f0,0xbcbbe1ca,0xbcbd2257,0xbaa7b3b3,0x3c7ccbcd,0xbcb125ca,0xbb2187be,0x3c29c507,0x3c9ed510,0x3c870abe,0x3c8c705b,0x3c87904e,0x3c87658b,0x3c871d4d,0x3c84e126,0x3c919afb, +0x3c9a15fb,0x3ca258c9,0x3cb042d4,0x3cba7124,0x3cc902e0,0x3cba889f,0x3cb4ff74,0x3cb0d401,0x3cadd40b,0x3cbeba07,0xbca3dd75,0xbc8dbe10,0xbce47261,0x3ba67a62,0x3cf2d7de,0x3d32e3f0,0xbbd7df60,0x3cce3881,0x3d3a28d5,0x3d3ecb1e,0x3d3bd1e8,0x3d261100,0x3d3aa6ff,0x3d3da96e,0x3d3e191a, +0x3cda76ab,0xbaae6e9c,0x3d477bca,0x3cedcc40,0x3bf3b0e4,0xbce14749,0xbc8eff95,0xbcaaa86f,0xbcad9e4a,0xbcada19b,0xbcaff839,0xbcb31bc2,0xbcb34fe5,0xbcb33f6c,0xbcb0b84d,0xbcb55c3a,0xbcb3363d,0xbca78541,0xbcaaa88e,0xbca19d8c,0xbc80a37a,0xbc9f0a7f,0xbcb323d9,0xbca59c55,0x3cf0ae67, +0xbc86a378,0x3a79f9cc,0x3bd3fc65,0xbb63b4f3,0x3a0d8a30,0xbc3d2d23,0xbc1521c0,0x3af39ae7,0xbc09bf82,0xbc012df6,0xbaf96606,0x3c005bf2,0x3b844fa9,0x3b49c069,0xba474979,0x3d08b1dc,0xbc8602f3,0xbcc58e4a,0xbcc76d64,0xbce6b97b,0xbce4a1c2,0xbce729c2,0xbce49d72,0xbcdc62c9,0xbcdb2efe, +0xbcdd7531,0xbcee16d1,0xbce453fe,0xbcc18ee2,0xbcbe7887,0xbc9dfd9f,0xbc25f388,0xbc97d463,0xbcf8a1db,0xbc7355b9,0x3b94fd44,0xbb1f9e9a,0x3b075915,0x3b8bdae8,0x3be3dcec,0x3bb87eb9,0x3c193356,0xbbb57481,0x3bbb4ce0,0xbc5cbf8f,0x3c00912b,0x3a8b5625,0x3c5fc9c0,0x3ba8a1a1,0x3bed7124, +0x3c0bc04c,0x3c751235,0xbbb134e4,0xbcf249a8,0xbce11f3f,0xbd096d62,0xbd066c17,0xbd0c423c,0xbd109d95,0xbd127de1,0xbd12e2c2,0xbd0d96b5,0xbd1e1c84,0xbd139b9d,0xbce4e507,0xbcdf4790,0xbc996a6a,0xbb63ef39,0xbcbcbf17,0xbd195bbb,0xbc298808,0x3b3e5756,0xbc480ee4,0xbc3b8ac2,0x3b8b0760, +0x3bd3d3f8,0x3c1bbf56,0x3af7b8a6,0x392a5189,0xbbabf6f7,0x3b5d3645,0x3b46f903,0x3c001ae1,0x3ba5cbfc,0x3b35a04e,0x3c9b2e20,0x3bae722d,0x3cb24eb8,0xbb4a4767,0xbd0473bc,0xbd089c08,0xbd379a79,0xbd3853de,0xbd3bb2b5,0xbd2e6026,0xbd21153c,0xbd1ab0ff,0xbd2a467f,0xbd4f9887,0xbd3091b8, +0xbceb25b2,0xbcb42251,0xbbb85145,0x3c851b6d,0xbc80b549,0xbd886229,0xbd1f037f,0x3cdf736b,0x3cb398e8,0x3b93cff3,0x3b785c3a,0xbb306dd3,0x3b66b903,0xbb533019,0xb997379d,0x3b805447,0xba8ab694,0x3b2b1150,0x3c79c951,0x3bf76d89,0x3aa230fd,0x3c18bd6a,0xbc09ce56,0x3be9a64e,0xbbb7d3fa, +0xbd230b08,0xbcde58b1,0xbd0fb878,0xbbcd826a,0xbbdcf6ac,0xbcb4d96b,0xbd49dae7,0xbd68be45,0xbd43e5a2,0xbca5c9aa,0xbcca5703,0xbd5efd8e,0xbd699de3,0xbd8979bd,0xbd9e404e,0xbd7a2e0e,0xbd112440,0xbd3c66b7,0xbce4ee54,0xbcc8f035,0xbb9e82cc,0x3b74a722,0x3ab9aad5,0xbb9b6c16,0xba4058be, +0xb8d2b299,0x3a66d5fc,0x3a334af8,0xb903862b,0x3a7b93b1,0x3b188bc1,0x3ba331fa,0x3c8a532c,0x3c1da115,0x3c9cfe78,0xbb6f794d,0xbcd49a01,0xbcd11ca7,0xbd34ee11,0xbd17c820,0xbce6986e,0xbc0e771f,0xbc4a8a19,0xbc96a981,0xbd0174bb,0xbcb572ae,0xbabeb7ca,0x3ceb5d4c,0x3c68b140,0x3c81b6b2, +0x3cd8d082,0x3a01354b,0xbc44ade6,0x3c6aefc7,0x3d610604,0x3d2687ec,0x3d2c328f,0x3b9a7e4b,0x3ad635c7,0xbb0c101a,0xba281c5c,0xbb3aabb3,0x3a9823a5,0x39d7974b,0xbbaf627d,0x3b8058c6,0xbbd7b266,0xbba48feb,0x3cf6b8e3,0x3b1105e8,0xba08ea7c,0xbc22c348,0xbc9b9005,0xbc0436e9,0xbc04ec4b, +0xbcba0cc8,0xbd1fba1d,0xbd5d7d05,0xbd8f6001,0xbd93e6c7,0xbd8bdc16,0xbd8ff299,0xbdb19e19,0xbdc55812,0xbde8c008,0xbde9a682,0xbdf097ed,0xbd45f0e1,0x3d34f5ca,0x3d226577,0x3cbe8d05,0x3c87d208,0x3d055a2f,0x3ca3d084,0x3c8bb3ce,0x3c24606d,0x3a771baa,0xba11559b,0x3a124856,0xb83c22f9, +0xb99d53ee,0x3bc08fe0,0xb982e719,0x3b4f9cc1,0x3c85946b,0xbbc425e9,0xb915aa1b,0xbc3bb807,0xbcf113bd,0xbcf6fb48,0xbd004b71,0xbcecf264,0xbc98ef45,0xba1a5001,0x3c223d84,0x3c2604cd,0xbc22d70c,0xbc5fd100,0xbcb7e9a1,0xbcaf858f,0xbc9c3321,0xbc347f3b,0xbbc7edde,0x3d26a29e,0xbd03754c, +0x3c7d8476,0x3d3ea233,0x3cb0f2ff,0x3c998675,0x3c938895,0x3c707a24,0x3c99c8b6,0x3ca1a31c,0x3c5a7506,0x3c68b047,0x3c49dc37,0x3c267a1c,0x3b897788,0x3bc6c0d1,0x3bf7aa52,0x3c237d1d,0x3b6c39c2,0x3bf3dcd0,0xbc1de975,0xbc4d1c5e,0xbc411e9e,0xbcb492a6,0xbc48721a,0xbc43312c,0xbc7fad28, +0xbcc085aa,0xbccec1ed,0xbceedd2a,0xb88b651e,0x3c679d26,0x3c7f2db5,0xbb03b193,0xbc8daea8,0xbd0ba674,0xbcddf7af,0xbc1f5fc2,0x3c01a464,0x3cddfea0,0x3c941d26,0x3cb9d539,0x3c8873db,0x3c184ed4,0x3c0f57b8,0x3ad4c1d6,0x3abb4532,0x3aa83e03,0x3bb57d16,0x3bab8205,0x3c14a393,0x3c33a093, +0x3c38b8a1,0x3c01e456,0x3c2c0839,0x3c154006,0x3c3f9679,0x3bba1d70,0x3be115fe,0x3c50dcc2,0x3c81c340,0x3c90a21e,0x3cb50b97,0x3c6c6aa3,0x3c85ee31,0x3cb61bea,0x3c7cd000,0x3b3ecf74,0xbc87eae9,0xbca5cdde,0xbc7d85f5,0xbc23857e,0xbbd9f4d4,0xbc6363b0,0xbb51f57b,0x3c3c20d8,0x3bbeedd7, +0x3c53f7b2,0x3c261020,0x3c2c2640,0x3c1a31ec,0x3c664dc4,0x3c0b9285,0x3c78d3fe,0x3b84c517,0x3c40f278,0x3baebc08,0x3bf9f3dc,0x3b7dd695,0x3bc9a640,0x3ae48825,0x3a478472,0xbc2d1bda,0xbc8088b6,0xbc4ede77,0xbc6248a3,0xbc466dcc,0xbc36d5b8,0xbc1969e4,0xbc13c5d2,0xbc124205,0xbc022497, +0xbc1578b9,0xbc0ffd12,0xbc39aff7,0xbc130725,0xbc242aa4,0xbc518221,0xbc28ef7c,0x3b3b696c,0x3b9add55,0x3cc6cced,0x3b9be731,0x3c4ce798,0x3c38524c,0x3b9c83b9,0x3bb75399,0x3a7a469f,0x3b565aec,0x3c37ce87,0x3bc19de4,0x3b8ad72b,0x3bec9079,0x3c38101f,0x3bfd6e6b,0x3b8ea5f5,0x3b1aefd1, +0x3c495e75,0xba9ff36a,0x3b059884,0x3b2bc977,0x3b417cb2,0x3b85cde6,0x3b94edb9,0x3ba49d1e,0x3afe1bc8,0xba6a2e9d,0xbb7e162b,0xbbe62b6b,0xbc2771c9,0xbc57830e,0xbc25fba3,0xbbcf6766,0xbb3bc266,0x3aab0bd2,0x3a6e1a9c,0xbae70292,0x3c5d018f,0x3cc6c80b,0x3ce7b8ac,0x3bed62d2,0x3cb64a77, +0x3cef5690,0x3cfead10,0x3d022b46,0x3cf2c058,0x3d080354,0x3d0ed6f3,0x3d0f2042,0x3cbd0cad,0x3c004d30,0x3cfd5ccd,0x3cb13e8a,0x3c26aa02,0xbb70f2ca,0xb95aa439,0xba9734dc,0xba55b871,0xba8f4ed1,0xba9d7259,0xba3283c6,0xbb01e9f6,0xbb2ed991,0xbb56a969,0xbb6e41b1,0xbb7a631a,0xbb9ffd9f, +0xbb510e56,0xbb24c417,0xbae3dc2d,0xba9fd108,0x3a91f2ee,0x3c0e3865,0x3bad9530,0x3c93807e,0xbc96e3a8,0xbd0d6bdb,0xbcff24ff,0xbbfd7bf5,0xbcf33cc4,0xbd04d0b2,0xbd0c37fb,0xbd0b800d,0xbcef0ddb,0xbd0829d3,0xbd068f5b,0xbcf2e54d,0xbcf7d891,0xbc2f8f92,0xbcf1ae7c,0xbcf9d6b2,0xbc903619, +0x3c905bfc,0x3c02e987,0x3c199665,0x3c1d230b,0x3c1ddb6a,0x3c17164e,0x3bfbb6ed,0x3c033d8f,0x3c090520,0x3c1c01d1,0x3c15961d,0x3c126603,0x3c21449c,0x3bc918f0,0x3ba1cd7f,0x3babcde8,0x3bb63ca9,0x3ba346c8,0x3be85bb9,0xbd079dd9,0x3a540571,0xbc84f0c9,0xbc12a12f,0x3a89a629,0xbaa41889, +0x3bb29312,0xba8cea8c,0xbc50d0b5,0xbb9195c4,0xb9e41c55,0xbb05d8de,0xbbd0fa98,0xbae1f8ef,0xbb9bae3c,0x3b14f6e5,0xbcc73115,0x3c04cbe6,0x3c585830,0x3c146c87,0x3c4a193c,0x3c5033e1,0x3c49ba7e,0x3c05dfcc,0x3c0c9f88,0x3c1114f1,0x3c29165c,0x3c28f22e,0x3c10d867,0x3c0a870f,0xbac5c441, +0xbba380ac,0xbabcf5fc,0xbaa781a3,0x3b6a66bb,0x3bcc04d8,0xbc90a47e,0xbbf0b0ee,0xbc7c92e2,0xbb7c1a4e,0xba26218e,0x3b01c5b2,0xbbc08900,0x3b529ee4,0xbc5ae162,0x3bab2042,0xbc12094b,0x3ba34ab1,0xbb831d9b,0x3b851402,0x3b735ad6,0x3b664433,0xbbe13ab4,0x3be5c0e9,0x3ca046e2,0x3c3c1010, +0x3c86e5cb,0x3c764742,0x3c5c5f77,0x3b56016c,0x3bca7590,0x3c018f71,0x3c62e3e2,0x3c5ae367,0x3c25f0c1,0x3c462ffb,0xbc41bdda,0xbc96c9a8,0xbb696346,0xbbf40c72,0x3adc25c1,0xbb287fcc,0xbcbfbc51,0xbc6443a1,0xbc82814d,0x3b30793d,0x3c20322c,0x3c39544b,0x3c041e89,0x3adade79,0x3b8c50c7, +0x3b1906a7,0x3bdcb17c,0x3c8f0cd8,0x3c3d5505,0x3c9505fe,0x3bf279cb,0x3cb471b1,0xba750039,0x3c4d7d27,0x3cb43751,0x3c346189,0x3cac740a,0x3ca81760,0x3c8e86be,0x3b4e527e,0x3bdf123e,0x3c2ed30b,0x3c72a65e,0x3c4882e5,0x3bb75106,0x3b72effc,0xbd031c89,0xbd2892b7,0xbc68518a,0xbc83bb7c, +0x3bc99217,0xbd28183b,0xbcb12c29,0x39bbcd7e,0xbc9a2e23,0xbc59bc3a,0xbb9f90f6,0x3b34ab2d,0xbbf4df6e,0xbbb0e533,0x3ba40279,0xb93dc79a,0x3b4c6106,0x3c1b01cf,0x3c05b2b1,0x3c2e7038,0x3ad858a4,0x3c2bd4fc,0xbc137c10,0x3af8b0ca,0x3d122ef5,0x3cbd00a9,0x3cdae589,0x3bab821f,0x3b3e4d8b, +0x3ba3daf1,0x3b8ebda7,0x3c603229,0x3ca9db6c,0x3d2f13a0,0x3d242104,0x3c1c22ad,0x3c1beb13,0xbb0ff6b5,0xbc97b3c9,0xbc554c2d,0x3ca642c6,0xbc7c316d,0xbd170720,0xbca134b5,0x3bba7360,0xbb641312,0xbadba3d1,0xbba8197c,0xbb08610e,0xbb2f9748,0xb9ccaf03,0x3980ca40,0xb9a05f35,0x3b863713, +0x3b9615c1,0x3bd20be2,0x3c5e0ff1,0x3bbfcbe7,0xbc0f4caf,0xbbf97292,0x3b8946f0,0xb9f1b65e,0x3c4e3696,0x3bbb2b13,0xbb5df03f,0xbc811678,0xbd003f1a,0xbcf727fe,0xbc800805,0xbc1f9569,0xbc7f946d,0xbd033306,0xbd1ad771,0xbcb98397,0x3c1b293e,0x3c4bf5ba,0xbd35df3d,0xbc15c78f,0x3cb9480e, +0x3ce189e1,0x3c5b9473,0x391fc120,0xbbdd6a05,0x3a359c20,0xba277d6a,0x3b05672e,0x3ae9d476,0x3ba11586,0xba83c306,0x3b9082d4,0xbbe43ec6,0x3a31cacf,0x3c8d0ca0,0x3c473bfe,0xbadd7ebd,0x3b89f799,0x3c5d990b,0x3a6c7311,0x3a7c434a,0x3c6184f0,0x3cc2c434,0x3cebe0c6,0x3c4b27e3,0x3bb445d2, +0xbae6a44d,0x3cf9ed4e,0x3cfb414d,0xbbc842ec,0xbcc3b715,0xbd71521f,0xbdc19098,0xbd8f5a91,0x3d60e7e8,0x3cff9b7a,0x3cde4e75,0x3cd1634f,0x3cffb74f,0x3cc39be7,0x3c92f32b,0x3c575a34,0x3b913967,0x3b03cbbb,0xbaad1d2a,0xba36aed1,0xba899482,0x3bb4aa85,0x3ae93b7b,0x39efa7ce,0x3c4b68b4, +0xbadcb238,0xbc8f1709,0xbc0c4076,0xba67a204,0xbb1b4f7e,0xba9ce40f,0xbb6067ec,0xbbf8187e,0xbb9ef49e,0xbc996735,0xbce01212,0xbd351633,0xbd162e7c,0xbd068013,0xbca96179,0x3b0bee6c,0x3cef976e,0x3d4d6d02,0x3d5fc3b5,0xbbb37d8e,0xbcce6d12,0xbcbae6cf,0xbb54f244,0x3bf2f88a,0x3bab968a, +0x3c3aca4e,0x3c8650e6,0x3c32be3a,0x3c685540,0x3c232c93,0x3c7ef9dd,0x3c48c440,0x3ad507b7,0x3b5658fd,0x3bc8eaf5,0x3c6ae11e,0x3b8874f8,0xbc288185,0xbb8474a4,0xbb8cd4cc,0xbc4616a7,0xbc75043a,0xbc4a2cb1,0xbc9272da,0xbcc0ecd6,0xbd192ba7,0xbd198fd0,0xbcfc14d4,0x3ba4e007,0x3d017f7a, +0x3d507c49,0x3d3e30f1,0x3cfa4cb1,0x3c606017,0xbba35bf8,0x3c88554c,0x3a98456a,0xbafca68c,0x3bbec947,0x3bf176ff,0x3bdbcd75,0x3c134b31,0x3ba75c39,0x3b959bcc,0x3b5f90b1,0x3b6ebe76,0x3bbda790,0x3c197a59,0x3c582afe,0x3c4542a4,0x3bc714fd,0x3b1adde2,0x3b729942,0x3c0ab48d,0x3c1d82df, +0x3c8f1fba,0x3ca79c06,0x3ca5f114,0x3c5c921c,0x3c332e9f,0x3c4d0b19,0x3c895b59,0x3cda5851,0x3d1b6b7b,0x3d0d25d1,0x3d056805,0x3d201ed2,0x3cbb082e,0x3c5a39e7,0x3c51f666,0x3c3c9f10,0x3b877792,0xbb0668fd,0xbc14a6a5,0xba1b21c0,0xbad44ea5,0x3b1243eb,0x3bb53ebc,0x3c14ed53,0x3bc2036b, +0x3c231a07,0x3b69ff8a,0x3c136dcb,0x3b1c402f,0x3b5b8c91,0x3b3a103f,0x3beaf0f8,0x3c01824e,0x3b8d1958,0xbbc25d24,0x3b3823ab,0x3c1cac20,0x3b0c119e,0x3b17cdea,0x3b025451,0x3b48e1a4,0x3b12ac4f,0x3b2aaa41,0x3a8be66e,0x3a50303c,0x3b56b04f,0x3bb6c34e,0x3c0499ae,0x3baa4698,0x3b39b1a1, +0x3923a43b,0xbad5ee33,0x3c30d99c,0x3c0623c7,0xbb17d9f4,0x3bfd3c88,0x3add46f3,0x3af6f2ca,0x3b9cb2cf,0x3b57343d,0x3be128cb,0x3b886430,0xba8c3429,0x3b32f3d9,0x3bc57c25,0x3b8186e5,0x3a88f32f,0x3b425772,0x3b414a1a,0x3bbe7504,0xbb02fe68,0x3c2328b5,0x3c22eacd,0x3c21819b,0x3c2e2972, +0x3c286bb3,0x3c26f451,0x3c2930fc,0x3c538701,0x3c75712f,0x3c804337,0x3c82410c,0x3c809587,0x3c83817b,0x3c789c3d,0x3c66ae28,0x3c56c262,0x3c3e3fd3,0x3c4b5e89,0x3c74a4a6,0xba666212,0xbbfd1f2a,0xbb88c9b9,0x3b4047c2,0xbbeffd42,0xbbee6a21,0xbc025ea4,0xbc02e9d3,0xbbb65c4e,0xbc001988, +0xbc107dca,0xbc032709,0xbc11800b,0x3b01f0f7,0xbc043a06,0xbc083249,0xb934e365,0x3c78a56c,0x3c3d29fb,0x3c4a73a0,0x3c493f19,0x3c4b38a0,0x3c4eca3a,0x3c4c4132,0x3c4db952,0x3c4f19df,0x3c595965,0x3c62fef2,0x3c6ce65f,0x3c775d7c,0x3c6947de,0x3c625547,0x3c5ea555,0x3c55a8f4,0x3c820370, +0x3b48bdc6,0x3adcaa2d,0xbb41c4f0,0x3cc95622,0x3ceae41e,0x3c016736,0x3ca70b30,0x3ce6be7f,0x3c80dc20,0x3c810d5f,0x3c6f46f0,0x3c1537a2,0x3c43661c,0x3c40d47e,0x3c22ef7d,0x3ce8f540,0x3cb89211,0x3c14737e,0x3ce53a38,0x3cd20e8d,0xbabc2e10,0x3b375bc0,0x3b176221,0x3ad719f4,0x3ae602a8, +0x3afa3e09,0x3b1ebaa1,0x3b298f81,0x3b365405,0x3b28af8d,0x3b7125db,0x3b8853d1,0x3b87102e,0x3b97097b,0x3b8d0839,0x3b7873d1,0x3b0aef84,0xbb0e8a30,0x3ba68244,0x3cab358b,0x3bc5dd31,0x3c3fe604,0x3c5d1aca,0x3c3dcddb,0x3c343647,0x3bd1908a,0x3c2bce8d,0x3c80ff03,0x3c38123a,0x3bfa73ec, +0x3c4d84d7,0x3c578c21,0x3c4744d2,0x3c9858ec,0x3c4448fb,0x3cb81a6b,0x3c263fa1,0x3a8f9773,0x3b90f3be,0x3afbb8cf,0x3b18a0e9,0x3ace1803,0x3ad04a04,0x3a984430,0x3aedc1cf,0x3b090c80,0x3bbe0666,0x3c0cc157,0x3c1622c8,0x3c50516d,0x3c3cfd2c,0x3beee2ab,0x3b76b81b,0xbc12f17e,0x3b86f97a, +0x3c8271fc,0x3c13ba5d,0x3bcff29e,0x3c445cdf,0x3c5b278e,0x3c2e5ef1,0x3c4a8bb4,0x39b6985c,0x3c2308c0,0xbb5a9dbe,0x3c0181e0,0x3c0f9f9a,0x3c8b32d5,0x3c72e67d,0x3c73b5ab,0x3c84be9c,0x3cc1696e,0x3c641ed4,0xbab59fce,0x3b18361e,0xba94a18f,0xba929cf9,0xbab59cd4,0x3abb553a,0x3ab3a825, +0x3b689312,0x3accb684,0x3c1ce8fd,0x3c6509f4,0x3c352f77,0x3c968192,0x3c53b479,0x3a42e81c,0xbac6aac5,0xbc34cf1c,0x3b2abc3c,0x3b9f0421,0xbbac71d9,0xbc248b99,0x3bf89635,0x3c0f9277,0x3bf6dba7,0x3b893b51,0x3ab66f99,0xbb93f25d,0x38e48364,0x3b84df64,0x3c06c3f2,0x3bf5c9e1,0x3c03af1b, +0x3cb99728,0x3c69eeb1,0x3cd2fe62,0x3c809643,0xbb004b4d,0x3b94f080,0x3a037c2e,0x3a8f819d,0x3a3c4c11,0xba22950d,0xba81708a,0xba332d64,0xbb8d5a16,0x3c3d5fcd,0x3cb85b37,0x3cba3704,0x3d1adf4b,0x3cf96d9e,0x3b768871,0xbac0c397,0xbcb8ca4c,0xbc05f5b9,0x3d1b0b5c,0x3d1199ce,0x3be8fca8, +0x3bf7f1d5,0x3be4d448,0x3c61c3ef,0xbb00dad4,0xbb898237,0x3b5314ce,0xba7569fc,0x3b07fefa,0x3c36c20d,0x3c652c4e,0x3c40d9b4,0x3c4a90e5,0x3c098f44,0x3cc5e637,0x3cafd270,0xbbbdaf4b,0xbc06d271,0xbc9973d0,0xbc27eefc,0xbca14df4,0xbd0ab301,0xbcca65f0,0xbc7c46d3,0xbbcac4da,0x3c26b917, +0x3c26e445,0xbbac9689,0xbc468341,0xbcaeb528,0xbcef3d97,0xbc84071f,0xbc8908a2,0xbccbbc3b,0xbb35488f,0xbb6b98b6,0x3ca08def,0x3b0dfa38,0xbc319352,0xbc018b4c,0xbbc85a8e,0xbb663e51,0xbb1e3861,0xb9d84b61,0xb9c29dcc,0xba61c56a,0xbac38b66,0x3ba89438,0x3cc7335d,0x3c3579ad,0x3c10208f, +0x3bd49903,0x3c176933,0x3c97edce,0x3c9e171d,0x3cb7e2a5,0x3c90727d,0x3be982c0,0xbc00be21,0xbc58b32d,0xbc70f7e7,0x3c06d365,0x3c60b19b,0x3bc769f8,0x3c9e542b,0x3cbd2a30,0x3c7ac8b8,0x3c082141,0xbd5866b8,0xbcd042a9,0x3c3bdb01,0x3be22cf6,0x3c08c849,0xbba74439,0x39bdf67d,0x3b8fe979, +0x3b584778,0x39400ebb,0xb8943d9a,0x3af39399,0xbb5218b5,0x3b145d39,0xbaab79b0,0x3b529d2d,0x3cb6ec1c,0x3c4eb5f9,0x3c944e21,0x3bfb2486,0x3a8842a3,0x3bf9098a,0x3b80f1e5,0x3c09dbcd,0x3c39fdeb,0x3cb92635,0xb9466fa3,0xbc6d467f,0xbce4495c,0xbc8047ec,0xbaf7c2a3,0x3c0f7da7,0x3cb1748c, +0x3b204c88,0xbcd7769a,0xbd46ef59,0x3ddc87bb,0x3d6d2025,0x3d204cff,0x3d1f27fc,0x3d0df0f9,0x3ce4b3ba,0x3c8722eb,0x3c21ad95,0x3bd87c9f,0x3b7f8190,0x3abad0f7,0xb8df452e,0xba094699,0x3c13473f,0x3ba4c389,0x3bd6ed34,0x3c6b5eb0,0x3b9a0bd7,0x3b94d36b,0xbb8cf9b6,0xbbbaa948,0xb7f6276d, +0x398fb688,0x3c87d126,0x3c882c51,0x3c64c970,0xbba9c3f6,0xbbe14bea,0x39cbcea9,0x3c8f9010,0x3c73cc60,0xbcb827db,0x3c965d6e,0x3d5ad029,0x3dc3b5aa,0x3df393a7,0x3d27d23f,0x3d2556ca,0x3caf96e4,0x3c9421a7,0x3cbf2b80,0x3c8d51a1,0x3c8d912a,0x3cc8412e,0x3ca8fa83,0x3c763f5f,0x3c54efa7, +0x3c805aa9,0x3c46b841,0x3b81ef0d,0x3b725da9,0x3bc2063d,0x3c488a46,0x3c299a63,0x3c410976,0x3b57d34d,0x3b26dfe3,0x3a0cedea,0xbc21b9ee,0xbc0907a8,0xbc5a3a25,0xbc1a1433,0xbca849bc,0xbc1cbb4f,0x3c941d99,0x3cd427b2,0x3d35ebf8,0x3d69419f,0x3d990577,0x3d970eb3,0x3d6e4e8b,0x3d45d5dc, +0x3cf1628d,0x3d14e3c9,0x3ce1718e,0x3ceb25cf,0x3cc06c23,0x3c97bf55,0x3c303853,0x3c2c4852,0x3b87ee58,0x3aebf739,0xba91e757,0x3bbe28b8,0x3c2c2e65,0x3c491a47,0x3c56fef2,0x3c586588,0x3c661b6d,0x3c138782,0x3bfc1fe5,0x3c05332b,0x3bdc9d8d,0x3bf57964,0x3bf62807,0x3c8a86c9,0x3cafc944, +0x3c968ac6,0x3cc70d5e,0x3cd524db,0x3ce440ed,0x3ce5e465,0x3cd4252a,0x3cb8b919,0x3c15d618,0x3bddc5ab,0x3c4debd8,0x3cda02eb,0x3b3e0f64,0x3bf3e0ae,0x3c8775d8,0x3c8e09ec,0x3ca75be5,0x3c960166,0x3c88e085,0x3c7e5429,0x3c81769a,0x3c4df70e,0x3c756bc5,0x3c031cbf,0x3be536e6,0x3b85e647, +0x3bf59cc5,0x3c2ba8ff,0x3c720334,0x3c78e092,0x3c916a34,0x3c69fb3a,0x3c1a9797,0x3c326eb4,0x3c13dad1,0x3bf85e86,0x3bc34a1d,0x3b7e914b,0x3bea582d,0x3c2bc62b,0x3c725d10,0x3c567767,0x3c389ec6,0x3c276826,0x3c204b8e,0x3c0a5248,0x3b81e4aa,0x3b8ee28c,0x3c4be1fe,0x3c623d0f,0x3c472f22, +0x3c1e8d43,0x3c4730c2,0x3c30a6a6,0x3c22979d,0x3c1a7870,0x3c0b53c4,0x3c380ff4,0x3c78bbbc,0x3c6d45b4,0x3c4d2daa,0x3c72711d,0x3c632004,0x3c251069,0x3c2f545b,0x3bd7bbc9,0x3c143ed4,0x3b7b480f,0x3b174590,0x3b3a08b2,0x3b1f571a,0x3b39d2b2,0x3b5089ad,0x3b633b6b,0x3b84f31c,0x3b9ed35c, +0x3bd7bf96,0x3c0fcee9,0x3c3f9872,0x3c68e6a6,0x3c5a1ab2,0x3c5c8103,0x3c631942,0x3c6ad2c9,0x3c1dc499,0x3c0878e7,0x3cb5d313,0x3cbf554b,0x3c46a6f3,0x3ca1bf43,0x3cbeb021,0x3c7e66c7,0x3c83688b,0x3c82dbf2,0x3c63a7c5,0x3c78c613,0x3c7fa671,0x3c7535e5,0x3ccabeb4,0x3ca4194d,0x3c62023e, +0x3cbd5853,0x3ca2c316,0x3bc36b7c,0x3c02d191,0x3bf93820,0x3bed9c6d,0x3be460c2,0x3bd7a4e3,0x3bc4ff6d,0x3be5b746,0x3c005238,0x3c0a42bc,0x3c18499c,0x3c239120,0x3c3b87ef,0x3c337c76,0x3c2f3629,0x3c26554e,0x3c23b18f,0x3c3c7826,0xbc65469e,0xbc57d78b,0xbc43a2b7,0xbcc7f402,0xbc872926, +0x3c3f903c,0xbcc3b090,0xbc87d65e,0x3bc95c59,0x3bd1a9b8,0x3bd932b6,0x3c10998f,0x3c0c53c9,0x3c190ca8,0x3c46f8f6,0xbc873448,0xbcc181ae,0x3c8449d8,0xbc7134a7,0xbcc00461,0xbc453df1,0xbc4ad19f,0xbc68ca7a,0xbc6b037c,0xbc67e71f,0xbc6a6200,0xbc78f2a6,0xbc6b669e,0xbc69cb4b,0xbc6e4348, +0xbc7c4700,0xbc8415b3,0xbc865628,0xbc92ed4d,0xbc8ead7a,0xbc62ba1f,0xbc774aa1,0xbc5811be,0xbc9203fe,0xbc16a231,0xbc71a21f,0xbc825a5f,0xbbea5560,0xbc07a3a9,0xbc0a67bd,0xbc287881,0xbc7f375e,0xbc93deac,0xbc981d1d,0xbc58ac9b,0xbc5eedf6,0xbbdfcdb3,0xbbc1d253,0xbc53aca6,0xbc0d7f37, +0xbb5d4053,0xbc85e999,0xbc6056c5,0xbc9a23a8,0xbc9c845b,0xbc9bf55e,0xbc98d76a,0xbca4207e,0xbc8fd136,0xbc9383fe,0xbca58a34,0xbcb67c9b,0xbcca2c9d,0xbcd1bfef,0xbcf77dfd,0xbcdeaa4a,0xbc817069,0xbc94d771,0xbc82ec48,0xbc611ade,0xbc9b8e59,0xbc4b96fe,0xbc390143,0xbb08b7d1,0x3a14a5b9, +0xbb053db9,0xbb20625a,0xbb1e2b3d,0xbc43b760,0xbc00efcd,0xbbdf14a6,0xbb96571a,0xbad9d80a,0xbab46bec,0xba1791ab,0xbb323dd2,0xbc130544,0xbc2cd844,0xbc6f408a,0xbca72280,0xbcbeb992,0xbcb8d5b7,0xbcbdb57a,0xbce32e7d,0xbcba62fe,0xbcb7a809,0xbcd1c804,0xbcf42d02,0xbd0d9364,0xbd1421a1, +0xbd34de54,0xbd19006c,0xbc7dcd88,0xbcc16670,0xbc044c29,0xbbb944fc,0xbc3f3929,0xbc250c77,0xbc42dc6a,0x3b21613e,0x3c172cec,0x3c2b6073,0x3bcb32a6,0x39f8c301,0x383bb542,0x39cbf557,0x3b22a0a5,0x3c358fa8,0x3bfdf5c0,0x3c141efe,0x3c082323,0x3c1b4d8d,0x3b13acf3,0xbb78f9f6,0xbc7047cc, +0xbcdd59cc,0xbd02975e,0xbd046f50,0xbd045c2c,0xbd130ae7,0xbce93155,0xbce9e5c0,0xbd116f2e,0xbd304fd2,0xbd4ed9a1,0xbd58dcbc,0xbd826779,0xbd403d8e,0xbc166274,0xbc978dd4,0xbd4a8b3e,0xbd52fdc6,0xbcc39638,0xbb82915f,0xbb7bf82e,0x3a6b0df5,0x3a9ddb56,0x3b87b727,0xbbae2252,0xbbfc2304, +0xb8cae761,0xbb2ad466,0x3a4a2836,0x3bc8fa1c,0x3c28dee7,0x3c32a5b0,0x3b3bb48d,0x3a83d4c5,0xbbb17fa0,0xbc783b96,0xbc6bf6f7,0xbc11426d,0xb944a2a1,0xbc3fe2af,0xbc5a7e35,0xbc590d24,0xbbcb6f3c,0xbbaef344,0xbbb3dc69,0xbbcdc35c,0xbc943b26,0xbd0788ed,0xbd4a6982,0xbd6aea04,0xbd5abcea, +0xbd62dd36,0x3bc74c6c,0xbce879b9,0xbd13338e,0xbca1df7e,0xbafc4d74,0xbc1e70e8,0xbc5aa21f,0xbc5d8847,0xbbf8fd77,0xbbcacdce,0xbbab0ea0,0xb92d4a14,0xba9aa535,0xba3f2068,0xbb9fec60,0xbb34cd61,0x3c24a2f1,0x3b9dfeb3,0x3b248bf5,0xbbdc9cbe,0xbc845c42,0xbcd76fc2,0xbd07cfce,0xbc980ad1, +0xbc91be6f,0xbd005e13,0xbcc6105c,0xbca61b32,0xbc9a1057,0xbbd6e277,0xbc155308,0xbccf3f69,0xbcdea2aa,0xbcab71a4,0xb9911686,0x3b20d418,0xbda0d0ba,0xbd4f334b,0xbc28c712,0xbb48d081,0xbc15b920,0xbc359cdf,0xbbe4e779,0x3a062e8e,0xba76a2fd,0xba23d48c,0xbb7624a5,0xbade1b07,0xbb9e4cb5, +0xb9e05b86,0xbbd09683,0xbb86a2fe,0x3c130693,0x3baa5956,0xbaf74cc0,0xbbac28ca,0x3b1c7071,0x3a8c5e84,0xbb4ea77f,0xbc4c0660,0xbcdeefd0,0xbd274020,0xbd3891b3,0xbd1f8ab1,0xbcff1f2b,0xbc9f3195,0xbd023d42,0xbd9d2784,0xbdb7d1d4,0xbdd7d42e,0xbde67210,0xbdc2f2d9,0x3cf3eadf,0x3d7c8b17, +0x3d4c7295,0x3d1330b3,0x3d19308a,0x3cbfee96,0x3c837f8c,0x3b9a8c73,0x3bbb4495,0x3b5aac47,0xba8c7bba,0xba8f28cc,0xba143722,0x3b2ea690,0x3acbd5d0,0x3b1e87d9,0x3bd7222d,0x3ba957c4,0x3a30e954,0xbbda2c2f,0xbc0d4cc2,0xbc6ed34e,0xbc9f2d4e,0xbc4bce50,0xbc8702cc,0xbcc172bf,0xbd514e6f, +0xbd6b3cd6,0xbd4350bb,0xbcdb6592,0xbcce792b,0xbd24b51b,0xbd9a3794,0xbda5a71f,0xbd802442,0xbc060ac6,0xbd706166,0xbcfafb90,0x3c0cdf11,0x3bd7f7f4,0x3c2a4869,0x3c3566bc,0x3c3e0509,0x3c331923,0x3c28737f,0x3c04c5c7,0x3bb06978,0x3c278929,0x3bfc3671,0x3a6d3e95,0x3a4450e4,0x3b242c42, +0x3c2b6861,0xb9df0193,0xbb98ce02,0xbc05ecb6,0xbc03885d,0xbc0b9433,0xbc586556,0xbcd13582,0xbd25412c,0xbd5ca8ca,0xbd8619ce,0xbd85e630,0xbd67a119,0xbd1f7486,0xbcc34bb7,0xbc3515b6,0xbc2758de,0xbc663efb,0xbca00d5b,0xbd3c2dc4,0xbc1446ed,0xbc043f21,0x3c82cda5,0x3c072c3e,0x3c2bb24a, +0x3b951339,0x3b9308f4,0x3bc4833c,0x3ab1fbaf,0x3a90308b,0x3ab4174c,0x3ae756b9,0x3ba380a5,0x3be5acac,0x3bef9f4f,0x3b921d75,0x3b63553a,0x3b4a7620,0x3bc05fc4,0x3b6b077b,0xbb5c3459,0xbc1cf166,0xbc73fad7,0xbc5370f1,0xbc1f2632,0xbc27f493,0x3bf2329b,0x3caaf2d8,0x3cfa3503,0x3cf4be8f, +0x3ca7a381,0xba0a6958,0xbb5e17e5,0xbc0f3440,0xbc571c26,0xbc27153f,0xbb896ff5,0xbafdc489,0xbb68c6cb,0xba38e863,0x3bbaace0,0x3bd96c16,0x3c0bb024,0x3c197625,0x3c247d21,0x3c1c36fc,0x3bdd5712,0x3bf3e3fb,0x3be785a1,0x3ba6f4d1,0x3bd5a87f,0x3c05f539,0x3c2e54a5,0x3c0bbd53,0x3b893ee2, +0x3b39aecd,0x3c04d5fb,0x3c3f6c7b,0x3c74f902,0x3c476c84,0x3c258499,0x3bf461c8,0x3b791a65,0xba342625,0xbb56a92f,0xbc1c4ed9,0xbc55e24d,0xbc87d647,0xbc595e4e,0xbc3f710d,0xbc2f6c1f,0xbbff0c77,0xb99c4ef0,0xbb1553a3,0x3c28c694,0x3a82a848,0x3ae8bdd9,0x3b3279af,0xb98af0c7,0xb884a988, +0xbb2fde55,0xbba21ad0,0xbbb5ed5a,0xbbebae9d,0xbba89987,0xbbc79918,0xbb10cad9,0x398e5550,0xbb7307ba,0x3a955eca,0x3b7d0e9b,0x3c0937d4,0x3c1c5f1a,0x3bbd9a5a,0x3bb25334,0x3b862f58,0x3b697447,0x3b5d1fca,0x3b61b877,0x3b428724,0x3af5059f,0x39b12eac,0xbadc372d,0xbb9d644d,0xbb863515, +0xbb73afc9,0xbb2a07a3,0xbb08751a,0xbb10e1dc,0xbb5c660b,0xbbcfe95a,0xba047da9,0x3c8ba038,0xbc07f39d,0xbaa32539,0x3c5f7a35,0x3c6530cd,0x3c6c015d,0x3c801980,0x3c7fbf0d,0x3c81c9e7,0x3c86abc6,0xbb65223a,0xbbff7e40,0x3c85851f,0xba39dede,0xbb908787,0x3b824245,0x3b0ae515,0x3aeaf6c0, +0x3ab04363,0x3a8699e5,0x3a2c4623,0x3859b5ff,0xba4f3034,0xbad48c7c,0xbb1e3fc8,0xbb43412c,0xbb611a37,0xbb8db1af,0xbb65ba0e,0xbb5441ec,0xbb3f77d8,0xbb4a1121,0xbb53adb7,0x3c9bfdd6,0x3c715c25,0x3cadf41d,0x3c87074f,0x386a4218,0xbcf5a95e,0x3cbdd4ae,0x3b930d02,0xbcb84c94,0xbcc1ec88, +0xbcc8bd66,0xbcd2b75e,0xbcdf5637,0xbce30720,0xbce87685,0x3b6ec54f,0x3cb0e9c2,0xbcfad3b1,0x3a98aae8,0x3c86814e,0x3cae0a5e,0x3c892c5c,0x3c9bc606,0x3c9a73d0,0x3c9dd3cd,0x3c9f32ec,0x3c9caef1,0x3ca33849,0x3ca5865e,0x3ca46c38,0x3caa1ed3,0x3cac69b1,0x3cac576e,0x3cae8f8a,0x3ca3cc4b, +0x3c821742,0x3c8a0ab9,0x3c60ce48,0x3cc0336f,0xbbe1092f,0x3c9ac46e,0x3be698e6,0x3c0d5be5,0x3c82b250,0x3c3dd71f,0x3c8a56c5,0x3c8c267a,0x3c304508,0x3c7ab001,0x3c51510c,0x3c6abb68,0x3c08fd91,0x3c379d4c,0x3c8891c9,0x3c62b8c1,0xbbb4b167,0x3cb69a37,0x3ca8553a,0x3cbe2513,0x3cc16db5, +0x3cc74769,0x3cc60d8d,0x3cb9fd54,0x3cc940a8,0x3ccd71fb,0x3ccc1e9b,0x3cd8fa97,0x3ce19848,0x3cdfe529,0x3ce74f79,0x3cc6f966,0x3c65f45a,0x3c7116c1,0x3c49aa64,0x3c9dbd24,0x3c56b62a,0x3c61d993,0xba3e135b,0x3c316a3a,0x3c3b7254,0x3c166dd3,0x3be87273,0x3bcdf099,0x3aab50f7,0x3baebf76, +0xb54b97bd,0x3c29ae28,0x3c2cc145,0x3c865a2c,0x3c51f774,0x3c46ebad,0x3c43e94d,0x3c8ecb6b,0x3cc1ef73,0x3cccbd5b,0x3ce1204e,0x3cef2e73,0x3cf47363,0x3ce97ff2,0x3d042425,0x3d0b81c1,0x3d09e0d1,0x3d17880b,0x3d1dd8c1,0x3d16e1ae,0x3d1aade2,0x3ce839de,0x3c1fff79,0x3c54a0ed,0x3c3ea679, +0x3cb46c41,0x3c87c435,0x3c975f2b,0x3ab62026,0x3c712b1e,0x3c7292ab,0x3c2179f5,0x3c17a8b4,0x3b26f992,0xbaec161e,0xbb4a7edb,0x3b8bd98e,0x3c31d287,0x3c6b902d,0x3c943fc2,0x3c62e036,0x3c938ded,0x3c4a9752,0x3c9a77e4,0x3ce3e4c5,0x3d0690b7,0x3d160721,0x3d1ff893,0x3d22a3db,0x3d114bfb, +0x3d23748c,0x3d220973,0x3d1cf4b6,0x3d3621ef,0x3d3fc35f,0x3d39f01f,0x3d3aa97e,0x3cf72f86,0x3b88c928,0x3be8b52b,0x3c819830,0xb95dee10,0xbb1d7f7b,0x3bbdda6b,0xbb143e2d,0x3bc4c38b,0x3c272ae2,0x3bb81a79,0xbb0487a1,0xbb77bf41,0xba18f062,0xbac5b433,0x3b006688,0x3bdbb67c,0x3c6ff22d, +0x3c8c17b6,0x3bfc5c0f,0x3c9157c4,0x3c65d025,0x3c99f750,0x3ccb5125,0x3c59345a,0x3c488753,0x3c40e3d9,0x3c0a59a9,0xbab1dbb0,0x3c8ba0fa,0x3ce12c9d,0x3d1fa1b3,0x3d115d0b,0x3d14af7b,0x3d2eefdb,0x3d05b651,0x3cd4963d,0x3c9357eb,0x3c30f031,0x3c47fe8b,0xbabbef5b,0x3a12c400,0x3bb58d71, +0x3c85c8f3,0x3b0f2db6,0xbbe07ed1,0xbc1c94f8,0xbba356bd,0xbb487fbf,0xbb8c0924,0x3ab616a2,0x3a8acba9,0x3aa4228e,0x3a867a83,0x3bc3ef93,0x3c9cee25,0x3c33ee48,0x3b4a5481,0x3c4f7ab8,0x3cea01a4,0x3d0de92b,0x3d34ab62,0x3cebba21,0x3c4276bd,0xbbd1878c,0xbc2476dc,0xbbedbc9e,0x3beb20dd, +0x3c4ec191,0x3c7306d5,0x3b19b356,0x3c7a6b64,0x3c6f238d,0x3bd42add,0x3c3b6d0b,0xbd6bf845,0xbd2caf97,0xbcf05361,0xbc7f61f4,0xbc706aca,0xbc13043c,0xbbb1da2a,0x3b0a3817,0x3acaad75,0x3b092025,0xbac5c422,0x3910c8c1,0xbb2d5ac1,0xba84dfa5,0xb848277b,0x3b64a7fa,0x3bf98f02,0x3c714960, +0x3c8e011e,0x3c3bdd14,0x3be1f915,0x3b5c9c21,0x3bc8cfda,0x3ce0cb5f,0x3d20e0a5,0x3d23ea36,0x3d1b4c64,0x3cf8d7b5,0x3cbbf3f5,0x3ce72d03,0x3d3d2ab5,0x3d8280f1,0x3d86a641,0x3d4ed30e,0x3d17ed30,0xbd2ced8a,0x3db65ee7,0x3d8028bd,0x3d69aecd,0x3d6214f7,0x3d199840,0x3d085e71,0x3c9265d0, +0x3bd6d77e,0x3bd0fbc8,0x3b3aad18,0x36a62b16,0x3b1cc429,0x3add1f36,0x3b2692cd,0x3b56919d,0x3bb3614d,0x3c245412,0x3c4c7d0b,0x3be256d7,0x3b4d969d,0x3ca41c2f,0x3cd8735f,0x3cc7f9f8,0x3cc294a9,0x3c3b9eaa,0xbbccd970,0xbc51559c,0xbc36f307,0xba165263,0x3b7a2249,0x3ba58369,0x3ac19cef, +0x3c4f8bda,0x3d3b68a2,0x3de70f7f,0x3dba84ca,0x3db19187,0x3d2137db,0xbb43bfef,0x3c729c98,0x3cad6336,0x3c6511d8,0x3c776890,0x3c901281,0x3c6a58e4,0x3c6c9460,0x3c225bf7,0x3c218362,0x3c019981,0x3c01b42b,0x3afed0c3,0x3aa83d27,0x3bf81b27,0x3c0c9b1b,0x3ba5a5ac,0x3a1fc523,0xbc126f9e, +0xbc5f6d82,0xbc2340b0,0xbc79bcc6,0xbc42fc8e,0xbbd192e7,0xbb997f3f,0xba7c3218,0x3c2d207e,0x3c43bf8f,0x3cf577de,0x3d74d382,0x3db18665,0x3dcce720,0x3dd93ea5,0x3dbdfe77,0x3d07163c,0x3cee6cfb,0x3be4d1cf,0x3c910aed,0x3c37b124,0x3c4f75a1,0x3c3b4554,0x3c1e06dc,0x3c257f13,0x3c080f8a, +0x3c0b6210,0x3bacdc66,0x3bde54af,0x3c0817ae,0x3c52facf,0x3c773a22,0x3c89e7a1,0x3bc90f3e,0x3b17e347,0xbaa3326e,0x3aecfd04,0x3b3b2790,0x3a1e8038,0x3c25c1e7,0x3c5da373,0x3c669feb,0x3cbb48d0,0x3cd096d9,0x3cc37538,0x3d0a023e,0x3d2e0670,0x3d51d6ab,0x3d15d8d1,0x3cf06f94,0x3cdb41ca, +0x3cdc10c7,0x3cb45658,0x3c9e33ed,0x3c809b54,0x3ca0bcbe,0x3c840ee1,0x3c86bb71,0x3c74820a,0x3c7bed92,0x3c457f10,0x3c689b3e,0x3c3acc0b,0x3c79512a,0x3c069bad,0x3c29445f,0x3c0d97e9,0x3c41a718,0x3c43efd6,0x3c5b632e,0x3c6efdda,0x3c9002fa,0x3ca17bff,0x3c9c2302,0x3c9708c9,0x3c928020, +0x3c8e9f3d,0x3c8782ed,0x3cacd457,0x3ccfa606,0x3cf2b743,0x3cdb7bec,0x3cbbf965,0x3cb2ebbb,0x3cafaec0,0x3cadfa14,0x3c9a5996,0x3c9deb11,0x3c4e0bfb,0x3c4dc0cb,0xbb71e7e7,0x3c17af82,0x3bbb151f,0x3b997612,0x3c0c3b57,0x3c00d637,0x3c32d7f0,0x3c531f32,0x3c260c3d,0x3c6a9efd,0x3c678463, +0x3c6bf67b,0x3c32e36a,0x3c433fe4,0x3c87ec81,0x3c767598,0x3c070d67,0x3c90f980,0x3c584817,0x3c4bb544,0x3c3b9897,0x3c1f8fa6,0x3c0bf1d5,0x3bdaf32b,0x3c1d7c8c,0x3c45fc7c,0x3c822e9e,0x3c9daa35,0x3cc0982c,0x3cdb5a40,0x3cc0d80e,0x3ca93135,0x3c954063,0x3c81db5d,0x3c4b9445,0x3c6000dc, +0x3c44daad,0x3b6c34bd,0xbc2d09e2,0x3c7c19ce,0x3bab35f7,0xbbfd71c8,0xbc0f4735,0xbc20c056,0xbc245198,0xbc435831,0xbc5596b4,0xbc646122,0x3bd6d9a3,0x3c880d6b,0xbc361393,0x3be8b934,0x3c77ff73,0x3c87b517,0x3c67178a,0x3c669088,0x3c528963,0x3c4a2260,0x3c3fcaf0,0x3c2ab327,0x3c4633a2, +0x3c542ed7,0x3c5d21ec,0x3c6eb5c4,0x3c7c4371,0x3c8ec8a1,0x3c838650,0x3c7f2449,0x3c723132,0x3c67c929,0x3c72a347,0xbc8f7630,0xbc6a4244,0xbcb684c4,0xbbaf6ef6,0x3c6365c3,0x3d0af902,0xbc5477ad,0x3c2e5d48,0x3d022a14,0x3d08d224,0x3d076324,0x3cf77ce6,0x3d0851ef,0x3d0ac567,0x3d0d0d2d, +0x3c393aaf,0xbc1e6476,0x3d1c414f,0x3c558c09,0xbb997657,0xbcba2995,0xbc7fb578,0xbc969c32,0xbc9c09cb,0xbc9a5d0b,0xbc999e6b,0xbc99aa6a,0xbc8f7184,0xbc8fb78c,0xbc97f9fb,0xbca231be,0xbca6c67f,0xbca39aab,0xbca6720e,0xbc9ca477,0xbc72ac4e,0xbc86acb4,0xbc769185,0xbc940666,0x3ca59935, +0xbc55cd71,0xbb3f6993,0x3b460936,0xbb97a5b2,0xbb6f519c,0xbc2817ec,0xbc304fdc,0xbbc687a2,0xbc4edf52,0xbc2b5263,0xbc06cfcf,0x3b3d9175,0x3a728d9e,0xbb53cf70,0xbbb491c2,0x3c966059,0xbc9d0008,0xbcaeceeb,0xbcbcadb1,0xbcd72114,0xbcd11cb0,0xbcca60ea,0xbcc57bf5,0xbca63fc3,0xbca8b39c, +0xbcc28894,0xbcdaee37,0xbce3c2e4,0xbcccd5c9,0xbccd78fb,0xbcab7e89,0xbc368fd0,0xbc76793d,0xbc888be4,0xbc6a5089,0xba5800f9,0xbb94fae3,0xbae5b479,0x3b944f1e,0x3bc6332e,0x3948e8f1,0x3bd12dc4,0xbb34bedb,0xbb26efdb,0xbc4b4c21,0x3a676c6b,0xbbbb9ac2,0x3c0a1073,0x3b591f28,0x3b62c814, +0x3a07364d,0x3b0acefe,0xbc4888c7,0xbcd6e3e4,0xbcd642c8,0xbd0992aa,0xbd01bb31,0xbcfeaf1c,0xbcfe7d40,0xbcb99a0d,0xbcbeb50e,0xbcfa02c5,0xbd183804,0xbd267892,0xbd1303d9,0xbd1376f7,0xbce5a091,0xbc100300,0xbc67583e,0xbc6c9025,0xbb97a8d5,0x3c0bcaf1,0xbb5c0234,0xbc0775b5,0x3bc1bb76, +0x3c209da1,0x3bfe7738,0x3be6e18a,0x3ae8647a,0xbbc0db15,0xbb26cdec,0xba7dce44,0x3b563e08,0x3c0f0e44,0x3bf0b2f6,0x3c4912ad,0x3a5ac1b0,0x3c0b84da,0xbc4098cc,0xbcffe09b,0xbd0dfe98,0xbd40df9f,0xbd33f8e4,0xbd2c5451,0xbd23e016,0xbcd40b11,0xbce03bdb,0xbd215926,0xbd44bacf,0xbd4a52f2, +0xbd21fe28,0xbd0ca347,0xbca112e0,0x3bb61e45,0xbba7ef4d,0xbd5a0486,0xbd224e78,0xbc8bfbdf,0xbc0466ab,0x3c11e4a6,0x3c3aa7c6,0x3b9cf11f,0xb93862df,0xbbbf87a7,0xbc05ad50,0xbb2a2403,0xbb89e877,0xba068abf,0x3bcaff8f,0x3c3b97d1,0x3c11166f,0x3b962d3f,0xbb683d3c,0x3b990bfa,0xbbd51727, +0xbcfb5bb6,0xbcae4c91,0xbcb082a1,0xbc3577cb,0xbc335149,0xbc388989,0xbc89fc20,0xbc8cd560,0xbc5ddc8f,0xbd020af7,0xbd3f39cc,0xbd5cae32,0xbd80f7e0,0xbd76bfce,0xbd407163,0xbd31d37b,0xbc94e224,0xbc85ff9b,0xbbf26869,0xbc06c2f5,0xbc5fddd0,0xbc1e815e,0xbc193cae,0xbbe3454d,0xbbe4551d, +0xbbba97b7,0xbbcb3933,0x3a46a2b4,0x3a93f910,0xbad708b8,0xbbd539c1,0xbb85848d,0x3c0e0d04,0x3c061d68,0x3c79a907,0xbb5d8af2,0xbcd17e1b,0xbd03f43c,0xbd4d937c,0xbd23385b,0xbd00a443,0xbc9f8a1d,0xbc68ffda,0xbc396bb0,0x393a9801,0xbade49cb,0x3adbe820,0x3b27e0d5,0x3b54d450,0x3a99188b, +0xb8e35cb0,0xbc5ce548,0xbd749799,0xbd5e509e,0xbcd77b5b,0xbca357d6,0xbc1112fa,0xbc27ef21,0xbb86bc5c,0xbb850436,0xbafe3e9c,0xba5893f6,0xbb3841ac,0xbb42b851,0xbb8aa295,0xbaf2f0b1,0xbb0c653f,0xbbf2ede8,0xba8a26ee,0xbaa47125,0x3ae1b94b,0xbbfe7d54,0xbc57576b,0xbbe9a1cc,0xbc022642, +0xbce51f70,0xbd5351d1,0xbd8c7144,0xbd93595a,0xbd71afc7,0xbcf18f82,0xbd33ff0d,0xbd86304f,0xbdb3855f,0xbdbc06b8,0xbda096f9,0xbd815ec1,0xbd6bebe9,0x3c231a03,0x3d673714,0x3d6f5665,0x3d228eca,0x3d22685b,0x3ca39c86,0x3c4bfacd,0xb94fdc13,0x3b624ba4,0x3a989088,0xbaab7a84,0x398727e9, +0x3853c1eb,0xbb12573b,0xbae2935e,0x3ab7e843,0x398a2d76,0x3bc5871b,0x3c5c4c8d,0xbbc0aee6,0xbc504e3e,0xbc93f513,0xbcc691ae,0xbceb8850,0xbcde7ccc,0xbcc4f2b9,0xbcbd191f,0xbcaeabd3,0xbc8979c8,0xbcb63d94,0xbcd977f2,0xbcfa1378,0xbda2e6f3,0xbdc63bf3,0xbda6a98f,0xbce89fbc,0xbc8719f4, +0x3c4c2ddb,0x3d29b5ec,0x3cbc9873,0x3c8e4b77,0x3c9ad6db,0x3c75e726,0x3c51d51a,0x3c5f8e51,0x3be74766,0x3b8d0a94,0x3b60530e,0x3b6c6a7d,0x3be1a14a,0x3aaf40fc,0xb8db10a4,0x3aa42920,0xba617639,0x3b10b765,0xbc83d49e,0xbca9947c,0xbc90cb05,0xbc998aae,0xbc92400a,0xbcb5e2de,0xbd218b19, +0xbd043785,0xbd20856f,0xbd79d30d,0xbd577b25,0xbd48d670,0xbd34a3be,0xbcdec184,0xbc21c9e4,0x3a6c0e65,0xbbb71c34,0xbc5b17b1,0x3a0b04ca,0x3cc5bf00,0x3c4dcd9c,0x3c4d521a,0x3c07b576,0x3ba5808f,0x3bc5e5f5,0x3bac3091,0x3bd618ef,0x3bab65b0,0x3b900e63,0x3b3c8554,0x3b8c2f13,0x3bea9386, +0x3c1e1743,0x3c241583,0x3bf31319,0x3b2dab76,0xb9af93b6,0xbc308c79,0xbc8ec51b,0xbca9c855,0xbcba6ad1,0xbcaa9a45,0xbc60407c,0xbb852054,0x3bc73fb5,0x3c80ea5c,0x3ca3780d,0x3c603725,0xbb9c9325,0xbb7c6ff2,0xbc056d0f,0xbc40bf7f,0xbc27a9a3,0xbb1d5219,0x3bcac356,0x3c46eb32,0x3c0d808a, +0x3c7edca9,0x3c4cecc9,0x3c39faf0,0x3c10f9ac,0x3c5875fa,0x3c25dcfa,0x3c7982a8,0x3c165d65,0x3c65f041,0x3c1c2458,0x3c391498,0x3c0bc59e,0x3c22c585,0x3c14ae02,0x3c20d454,0x3b9178c5,0x3b68547c,0x3c099faa,0x3c28dad9,0x3c5201fb,0x3c683be3,0x3c840f03,0x3c48e03e,0x3c099fb5,0x3ba54e57, +0xbb2e82de,0xbbe9702c,0xbc4350c1,0xbc0e0a3d,0xbbe2eac6,0xbbe2bd91,0xbb0d276d,0xbb653f4a,0xbb71500a,0x3c6ce830,0xbaa8f96f,0x3b7e44b7,0x3b8931c4,0xba17fb25,0x39423520,0xbb56016b,0xbb374230,0x3b05e74d,0xbae74bc6,0xbabeb8ab,0x39fe2870,0x3bdd978f,0x3c0a16fa,0x3bc91f8a,0x3c10b381, +0x3c90424c,0x3c605445,0x3c74ff68,0x3c4f4f09,0x3c369aec,0x3c252913,0x3c13fe47,0x3c0a671d,0x3bae422e,0x3b23e96e,0xb967d723,0xbb40f42d,0xbbcd87c1,0xbc335cb3,0xbc1f96e1,0xbc0c74bc,0xbbe41160,0xbba9ad42,0xbbb23162,0xbc070d60,0x3a2d87f3,0x3c307489,0x3cb5913b,0xbb845a82,0x3c1cf892, +0x3caf76df,0x3cb9ef6c,0x3cc02e73,0x3cba54ab,0x3ccd5ed1,0x3cd70695,0x3cd86133,0x3c352774,0xba771ab0,0x3cd6a04a,0x3c5764ff,0x3b886f74,0xba7428bc,0x380af538,0xba2f2bee,0xba1bc712,0xba838b45,0xbabb6380,0xbac65e75,0xbb4b24cc,0xbb90f337,0xbbc2bae6,0xbbeda3f0,0xbc076cf2,0xbc20b1a1, +0xbc057824,0xbbf62ee9,0xbbe1a365,0xbbdd9b88,0xbc03f1aa,0x3c811141,0x3c526275,0x3cb6ee90,0xbb50d4b1,0xbcacd196,0xbd02d118,0x3bd02512,0xbc855791,0xbcf9269f,0xbd005581,0xbd00fe66,0xbcee9305,0xbd04e5c4,0xbd051e37,0xbd005fec,0xbc8e30fa,0x3b61a438,0xbd00ba3f,0xbc9a1384,0xbb7dc9ac, +0x3cae4c8f,0x3c612939,0x3c815b94,0x3c7fb9fa,0x3c836959,0x3c849133,0x3c7e77ed,0x3c88d090,0x3c898f3e,0x3c844d78,0x3c8042b0,0x3c7d2c9a,0x3c86ca0e,0x3c736ac4,0x3c64d2bc,0x3c4b97ad,0x3c66062c,0x3c71e05f,0x3c8af2bb,0xbca9c08c,0x3c4b35a4,0xbba67af0,0xba7d55de,0x3c097e2d,0x3b84ef8d, +0x3c4e9c60,0x3c0feba2,0xbb35721c,0x3ba2aa38,0x3bc488cd,0x3b86018a,0x3988ea4a,0x3b9018be,0x3b940fe8,0x3bd22056,0xbca32de7,0x3c56a0d0,0x3c9272c7,0x3c8b1569,0x3c9b0c17,0x3ca3a504,0x3ca8ad22,0x3c97d37a,0x3cb19904,0x3caf1dad,0x3c9f7d7f,0x3c997d87,0x3c95aba3,0x3ca818b0,0x3c85c656, +0x3c61bad2,0x3c296740,0x3c44d3bc,0x3c838c00,0x3c488f52,0xbb0f1ce1,0x3b72cc52,0xbc1a49c6,0x3b8bcb26,0x3ba745c8,0x3b3931b0,0x3a3f116a,0x3be9b85a,0xbc0dd9c1,0x3bd34672,0xbbcb6b24,0x3b699c03,0x3ab2a597,0x3c1de93e,0x3bfcc552,0x3b8bd642,0xbb630a12,0x3bdd816d,0x3cb59cac,0x3c96705c, +0x3cade164,0x3cb88274,0x3cc207e2,0x3c9909ff,0x3cdbb6e3,0x3cdddead,0x3cb9f857,0x3ca6cfab,0x3c934e11,0x3cc3351b,0x3c6e24b5,0x3c1f01c5,0x3bd87980,0x3c2bed9c,0x3c6ef171,0x3c0ed0e7,0x3b0bc8f5,0x3c070323,0xbbd75ad0,0x3c0934ac,0x3c614aef,0x3c03485d,0x3c48e16e,0x3b8bb57a,0xba6f24c9, +0xbb72d473,0x3b223ee2,0x3c08e615,0x3c7c2a9b,0x3ca963e1,0x3bd111c4,0x3c6370c3,0xbbaaa2e7,0x3ba75443,0x3cb8bc95,0x3ca4082d,0x3cd9f22e,0x3cf55706,0x3cfbc069,0x3cb46e72,0x3d0c2725,0x3d0624f4,0x3cd1bc40,0x3cc4243d,0x3cb68882,0x3cf50938,0x3c84e0e7,0x3c0295e2,0x3b67de83,0x3b94e9fd, +0x3cf9f1a5,0xbc6b451b,0xbd27f1b5,0xbca74437,0xbb410402,0x3a09d5fb,0x3b984b7f,0xba598128,0xbbb39a40,0xbbe2e7d4,0xbb16ac85,0xbb034b7b,0x3ab892ac,0x3b74161a,0x3c2c330f,0x3c781b0b,0x3bb8747f,0x3c7fd751,0x3a4a87d4,0x3c47ca49,0x3d079292,0x3c9fa695,0x3cb09652,0x3b9b0ed0,0x3bb28b30, +0x3c4fcdf0,0x3cdc0f33,0x3d1703d3,0x3d4056b6,0x3cd06889,0x3c6d8df3,0x3c8ad1d9,0x3c00e1f9,0x3bec93df,0x3c3b2b25,0x3ca56a51,0x3c1eb7ef,0x3c400b2e,0x3b67d29f,0x3b9e37e6,0xbb53b3e5,0xbc2f234b,0xbbfccf76,0xbb5e9515,0xbb888a5a,0xbb8cbcb4,0xbba525e5,0x3ac1aa30,0x3b08ba9a,0x3aa901a3, +0x3ac578f9,0x3b0bc28b,0x3b706dc5,0x3bea0bc8,0xbaf04f00,0x3b2bef41,0x3c51000b,0x3c137678,0x3c9d48d5,0x3c29f30f,0x3afc13b1,0xbbcfb60c,0xbc570425,0xbc20ba7a,0x3be96647,0x3bb8feed,0x3bcc87b1,0x38668a29,0x3bbba66a,0x3bab7c7f,0x39515754,0xbbc25bba,0xbcd9696e,0xbd401691,0xbd363099, +0xbccc614d,0xbc9eac8a,0xbbbfcfaf,0xbb97eb25,0xbb3ceeff,0xba45f903,0x3b741286,0xba033765,0x3b0d086b,0x3a95423a,0xba45fa1f,0x3a0f44bd,0xb8b78394,0xbc08e46b,0x3c240d39,0x3c03bb5f,0x3bc43008,0x3bfb9eeb,0xbb9c4a5f,0xbb82700b,0x3ba141ad,0x3c5fbaaf,0x3c91ae4b,0x3cca90cc,0x3ce7fc11, +0x3cf89677,0x3ced0393,0x3ce4b0bf,0x3cb02f87,0x3ca8eced,0x3cac621b,0x3cad3f48,0xbc0bf410,0x3ccc5a09,0x3cf15a73,0x3d46c12b,0x3d38e361,0x3d07c162,0x3cb73f75,0x3c382b00,0x3b4e06e4,0x3b739694,0x3a29b69d,0xbaf3dd0f,0x3a9f267a,0x3998f400,0xbb2a460b,0xb930d057,0xba241dec,0xbb296267, +0x3c28ad02,0x3b49ac9e,0xbada3a04,0x3c4bcb18,0x3c4976ca,0x3c5dfa5c,0x3b776bd0,0xbb935e75,0xbc8c3791,0xbc36b41e,0xbc6857eb,0xbcbfdb87,0xbcdab603,0xbc9e2d39,0xba0030b8,0xbb91c3bc,0xb9062978,0x3c84c911,0x3c190155,0x3d9453bc,0x3ce1bcd7,0x39a03cf7,0x3c7a8b97,0x3c856ba2,0x3c5b17f4, +0x3c7849d9,0x3c67775b,0x3c234985,0x3c284b4c,0x3b442f7f,0x3b467c8f,0x3b840baa,0x3c189bbe,0x3b4e47eb,0x3ac1a490,0x3b1701b4,0x3afb27a4,0xbc08cd81,0xbc0dbf84,0xbc5ab272,0xbcb20849,0xbca37d3d,0xbc8c2c32,0xbc54d42c,0xbc80ab5a,0xbaffd19d,0xbafd792b,0xbc786c45,0xbc5b0b39,0xbc23a576, +0x3b416b25,0x3d049201,0x3d60b158,0x3d96a145,0x3d91aaba,0x3cb78c3b,0x3c27f3b9,0xbb818800,0x3ba6dcea,0x3aeb1968,0x3bc4dd19,0x3c2a755e,0x3c019473,0x3c5d4514,0x3c5e184c,0x3c514a97,0x3c170967,0x3c050cdc,0x3bfffcf8,0x3c1723bb,0x3c1573ff,0x3c0754eb,0x3bc253ed,0x3b61404a,0xbb24bf9e, +0x3ae606fc,0x3b44b724,0x3b012c78,0xbc12756f,0xbc4db7d3,0xbbfd7cca,0xba9098bd,0x3b9bea8b,0x3c145fcd,0x3cb7e0cb,0x3d1516e0,0x3d55f709,0x3d43561c,0x3d1de784,0x3ce9ae17,0x3caa3b59,0x3cb39e47,0x3c8193cf,0x3bf88385,0x3c4d8be0,0x3c11fff2,0x3c1ac353,0x3c02c86c,0x3c024f4e,0x3bc3715e, +0x3c25721a,0x3bfabcdd,0x3c583ff1,0x3c084564,0x3c26ef2e,0x3c0cd920,0x3c255497,0x3c0fb730,0x3c1ab273,0x3bf154f6,0x3c8a1cf7,0x3cb4324d,0x3c92efe3,0x3ca0e6b9,0x3cafbec6,0x3cc4861a,0x3cce2deb,0x3cda53be,0x3ce5e748,0x3cef0a66,0x3cdbd664,0x3cc55459,0x3cc60a5f,0x3ca5e03c,0x3c9bd92c, +0x3c95c85a,0x3c96c487,0x3c2598cb,0x3c17ef97,0xbbe9e531,0x3c016be0,0x3acdd23f,0x3adb4228,0x3bdbd6c5,0x3bb1668b,0x3c249d32,0x3c10d441,0x3b869e0a,0x3c0994ba,0x3c2cdbd1,0x3c1de20c,0x3c0251c3,0x3c384c92,0x3c7c056b,0x3c929eaa,0x3c48d489,0x3cad2f20,0x3c959f76,0x3c955c18,0x3c8c84bd, +0x3c84219b,0x3c73ecc5,0x3c5e2e6a,0x3c74f7eb,0x3c814a02,0x3c89dbe4,0x3c909c99,0x3c9952aa,0x3c9c5b1e,0x3c904813,0x3c7c8809,0x3c58adf6,0x3c34a641,0x3c2e479a,0x3c5ad3f4,0xb994c24f,0xbc178708,0xbc64f273,0x3ba726e8,0xbbfa7b02,0xbc69706e,0xbc7a5b8a,0xbc7ce681,0xbc619da4,0xbc80bbfa, +0xbc887dd7,0xbc875e15,0xbbdcd31c,0x3bba241f,0xbc540027,0xbba68266,0x3b917dc7,0x3c72e76c,0x3c49592c,0x3c56b10f,0x3c56bb3f,0x3c58588d,0x3c5bc882,0x3c5c7f24,0x3c5d2ad5,0x3c5a818f,0x3c580e75,0x3c5948fe,0x3c590086,0x3c5f2579,0x3c536ef3,0x3c4fd7ee,0x3c4d0393,0x3c45deaa,0x3c4704ff, +0xbb88bbcf,0xbb52806a,0xbc3a4fe7,0x3c7d8360,0x3cdb5dd1,0x3cb05105,0x3c0f8bdb,0x3cc87a52,0x3cce765e,0x3cda325c,0x3cd3ba70,0x3caa1738,0x3cc4c045,0x3cc4af23,0x3cb6935a,0x3cca515c,0x3c3e3ea9,0x3cc4de94,0x3cce95e4,0x3c814598,0xbc27e801,0xbb7a40fc,0xbba5d542,0xbbba7e71,0xbbb17d30, +0xbba3c54a,0xbb86f46f,0xbb6ae612,0xbb827428,0xbbc29312,0xbbb6abce,0xbbb01836,0xbb92eac8,0xbb7cc393,0xbb4e2397,0xbb04d6cb,0xbb663929,0xbb8e83b4,0xbb56ad4b,0x3cdcdf60,0x3a9179df,0x3c0cb2a9,0x3c2dc723,0x3bb13c49,0x3bb0ea99,0x3a574758,0x3b7e9c71,0x3c129259,0x3b527895,0x3aa0b27d, +0x3b8c39d1,0x3c28f85a,0x3c0d6f4b,0x3c3d07d5,0x3ba31cd3,0x3cb0c4ec,0xbb2c044c,0xbbfaa4d8,0xbbb61c60,0xbc0acbbd,0xbc05ce4e,0xbbf9702a,0xbbb08ed9,0xbb679359,0xbb87c133,0xbc0699a6,0xbbf53b43,0xbbbef5f1,0xbada8b6a,0x3a28752c,0x3b0052b5,0x3b13d16e,0xb8481876,0xbc066aad,0xbbb0f5a1, +0x3c5b9eaf,0x3bd6179d,0x3b6c385b,0x3c2ae0db,0x3c2d6237,0x3b8cd892,0x3c39c62a,0x3a7a1671,0x3bb38ed3,0xbbd384e4,0x3bb7aebf,0xb877bd5f,0x3c56b772,0x3c2766db,0x3c3fb9ac,0x3c1070b6,0x3c5606de,0x37e2ab2c,0xbc3b8ad1,0xbc0132e2,0xbc544e96,0xbc40f0ce,0xbc20e256,0xbb961564,0xbabc01a4, +0xbb571ce7,0xbc62cebe,0xbc40908c,0xbc28bdf0,0xbb876192,0x3b032246,0x3b979d94,0x3b168cc2,0xb83c276f,0xbbe6411c,0x38c88139,0x3c8f99c6,0x3bb658e5,0xbbed1e53,0x3bd3e614,0x3c1c4475,0x3b954d6e,0x3c00e121,0x3b8181fd,0xbc025851,0xbb7a1876,0xba973d3e,0xb9fa5f99,0x3c15b356,0x3c09ad4b, +0x3c89e87f,0x3b4f56b0,0x3c43ba60,0xbb48a82b,0xbc75f006,0xbc248948,0xbc90d18e,0xbc83ebc4,0xbc5e4102,0xbbf8fcd2,0xbab1e3c9,0xbbab8621,0xbc9e2dbf,0xbc617a9c,0xbbbe5cc8,0x3bebc675,0x3c926611,0x3ca6caf6,0x3c17a66a,0x3bb60b2b,0xbcb415b6,0xbc11429f,0xbbaf02cb,0xbb578e23,0x3ca17de6, +0x3c65695d,0x3bdeb28f,0x3b3f93fa,0xbb79ba1b,0xbbd6d9bf,0xbb6b8574,0xbb174d98,0x3a3e95db,0x3b9c3358,0x3c20905f,0x3c1b1a11,0x3c6ffba5,0x3ba1acca,0x3c8db709,0x3c5ed96e,0xbc763048,0xbc6088bd,0xbcb8ade9,0xbc7e26a2,0xbc81e4c8,0xbc3bbe56,0xbc50ef4d,0xbc69a030,0xbc0a2de0,0xbce76372, +0xbd172208,0xbce7a120,0xbd014239,0xbcdec5bd,0xbc996738,0xbc0fc743,0xbcf12870,0xbc08721e,0x3c95a967,0x3bb63395,0xbc431edb,0xbc6c8e01,0xbc82a44e,0xbbbce915,0xbbcc9228,0xbb7e60fb,0xbbb1d93b,0x39843a47,0x3a6a7684,0xbb454dcd,0xbb61c751,0xbae989bb,0x3b572060,0x3bfb4158,0x3c6da40f, +0x3b41f0e4,0xbc121ea2,0xbbfda078,0xbc8c8fbd,0xbc296486,0xbc03bfd8,0xbb924919,0xba0cba5a,0x3b23415f,0x3bed27f1,0x3b61318c,0x3c0aa7b8,0x3c82da66,0x3cc12fac,0x3ca16309,0x3ba15c93,0xbc5be2d1,0xbb14ce83,0xbd0aef9a,0xbcffb776,0xbcd9e75a,0xbc472ff3,0xbbce93ef,0x3b4ea648,0xbb1db49f, +0xb92e848f,0x3a388191,0xba8ba883,0xb883b2c8,0xb8c5f6fe,0xba27bc23,0x3b82f421,0xbb1ea173,0xbba2f2ca,0x3b9451c7,0x3c59643b,0xbb11a85a,0xbc537ad6,0xbc15b6f0,0xbc5af59b,0xbcb4fdcf,0xbce134bc,0xbce1f400,0xbcd89331,0xbce6f486,0xbcdf128a,0xbd1e1994,0xbd30580e,0xbd195607,0xbcc8b328, +0xbc0110e5,0x38cd576b,0x3c0cb32d,0x3ac4f9c1,0x3cb0eb3f,0x3d27fbe5,0x3d0edb2c,0x3cf670eb,0x3c53f0e5,0x3b89202c,0xbadd96a6,0x3ae6d062,0xb9e1dfef,0xbab0735d,0xb9f11b47,0xba9eb31b,0xbb591407,0xbb17c7fc,0xb98b34a4,0xbba31fa9,0x3bf6f8c4,0x3c7576ef,0xbb9b69a6,0xbc3a0341,0xbc438d1f, +0xbc26c616,0xbc25ee59,0xbc1e58f5,0xbc5f4e87,0xbb845e78,0x3882e6f8,0x39fb38e5,0x3aa145e9,0xbb3f684c,0xbcc86254,0xbc7b9660,0xbcc04459,0xbd2f1cb7,0xbc3cb22c,0x3d58cc07,0x3d774937,0x3d57721c,0x3d0d0e4e,0x3cd0996c,0x3cc86023,0x3ca4b398,0x3c9073c4,0x3c7aa3cf,0x3beca793,0x3b1ca710, +0x395d7b98,0x3b2701b2,0x3c14676b,0x3b98eb21,0x3b2bbba7,0xbb35aeb6,0x3a48d57e,0x3b813585,0xbc220569,0xbc40e452,0xbc6a893c,0xbca2f62e,0xbc70aaa9,0xbc283bbc,0xbbaea081,0x3b5335bf,0x3b73a22e,0xbbac00cc,0xbc99c0ca,0xbce37ed9,0xbd18ec04,0xbc0a8a64,0x3c973191,0x3d0b0276,0x3d595531, +0x3c699f53,0x3ca9aa92,0x3cbfe6a1,0x3c9bdea6,0x3c81fe0f,0x3c69d344,0x3c342357,0x3c493009,0x3c3f7513,0x3c3ff890,0x3c0ffe69,0x3c31185c,0x3c09e877,0x3ba3c7a2,0x3b9b4f82,0x3be3b89e,0x3c06e979,0x3c03b555,0x3b380656,0xbb1248c7,0xbc042985,0xbc255d90,0xbc1b6d6f,0xbc7db50e,0xbc91ed75, +0xbc94845b,0xbc9f15cc,0xbc8b107e,0xbc0e12b6,0x3b27793f,0x3c5431ef,0x3c8e5ff1,0x3cce1717,0x3cd9cb94,0x3cb1ca87,0x3ca9b8d1,0x3c07d062,0x3c54fb84,0x3ca546bf,0x3c85cad4,0x3ca18e28,0x3c76bd82,0x3c35fb01,0x3bdd06fe,0x3c233e3f,0x3be59ed4,0x3c5475db,0x3bc85d39,0x3c32fbea,0x3bec302e, +0x3c311c80,0x3c146848,0x3c32a8ed,0x3c5195e3,0x3c9898ae,0x3c802c4a,0x3c2faca0,0x3c57e730,0x3c4ddf9d,0x3c79f45a,0x3c903d40,0x3ca461b0,0x3cb09269,0x3cc2b43b,0x3cd15db1,0x3ca97438,0x3c8acf7f,0x3c6aab0a,0x3c4e2286,0x3c3be1c3,0x3c17370a,0x3c38ec57,0x3bd0dec2,0x3c0190f1,0x3c5ffab8, +0x3be06a21,0x3c2a8c59,0x3c19d60a,0x3bfdb71f,0x3c07e205,0x3be8fb1e,0x3c0fbacb,0x3c5fa24a,0x3c3526bf,0x3c2028c6,0x3c43c00a,0x3c682dfe,0x3c441b43,0x3c511754,0x3c36f718,0x3c95570d,0x3bdb30e2,0x3be61ff0,0x3c0ccb82,0x3c077e4e,0x3c160630,0x3c13ad4b,0x3c163820,0x3bcfa832,0x3b8907b8, +0x3b51d6bd,0x3b4b63d1,0x3b626a94,0x3b563c98,0x3b8128df,0x3b9e1923,0x3bb5a5a4,0x3bd37946,0x3ba8176c,0x3b6886a2,0x3c5a2256,0x3c8df485,0x3c51fa1c,0x3c358f69,0x3c8c0643,0x3c7a8d5c,0x3c838f57,0x3c86ee62,0x3c71f9cc,0x3c8a937c,0x3c910ba5,0x3c8d8066,0x3c9afe68,0x3c4240ba,0x3c8d9f01, +0x3c93808e,0x3c4e5287,0x3aa8bc73,0x3b9e45ab,0x3b94bb5e,0x3ba9fe42,0x3bb1635d,0x3bbe363c,0x3bdb60bd,0x3bc7f00a,0x3bbe9907,0x3ba878db,0x3b96ef17,0x3b834d33,0x3b62f992,0x3b864c83,0x3b8f89f1,0x3b9566e4,0x3b9c8525,0x3babbee2,0xba1a95e9,0xba6cdd40,0x3b2658e8,0xbc874335,0xbc9d12ca, +0xbbb1c6a7,0xbc43eec5,0xbc8ea165,0xbc11d977,0xbc0dad21,0xbc0902fa,0xbbb93c38,0xbbf35155,0xbbe6f867,0xbbaaaea6,0xbc929ccf,0xbc579fd2,0xbb0595c9,0xbc8abe57,0xbc82a0c8,0x3b3dd4e7,0xba1a11f3,0xba38d1a0,0xba4b42c0,0xba41d215,0xba360158,0xba0c6b95,0xb9db75d2,0xba59dc8b,0xbb2462ea, +0xbb1ed199,0xbb2586b0,0xbac520a3,0xbb3b9d51,0xbb25f74d,0xba3d823b,0xba92ba9a,0x3a7a00c9,0xbb8144bd,0xbc538a7a,0xbb12be03,0xbc2fe0c2,0xbbad920c,0xbb19c5cd,0xbb8216cc,0xb97e5a77,0xbb98d002,0xbc381741,0xbc09a6f5,0xbba5f960,0xbbe259d4,0xbb945ac7,0xbb0abd93,0xbbac2f0e,0xbb135a72, +0xbc37514c,0xbb8d8101,0x39c1906b,0xbb5bd89a,0xbb1a37dd,0xbb2613bb,0xba990bc6,0x39387172,0x3a122f44,0xbac350bc,0xbbc82150,0xbbd06b84,0xbbdf418e,0xbb826373,0xbc057ab2,0xbbe46189,0xbadf0a84,0xbb26f5bf,0x3ad1e6b8,0xbbb2934b,0xbc550083,0xbbc46049,0xbc38f783,0xb9c96525,0x3a347515, +0xbb2415b8,0xbae4c851,0x3b620493,0xbc1fe15b,0xb8b49efb,0xbbdffd07,0xbb4c22cc,0xbb511e58,0x3add128e,0x3b8c489b,0xb963ea7b,0xbc10773b,0xbbae956d,0x3aeb076b,0xbb6f884b,0xbb7715b5,0xbb84d1a3,0xbb2f4538,0xbb0088e0,0xb9f32839,0xbb6b6005,0xbc4ccc0d,0xbc544da8,0xbc68fe61,0xbbf38c2b, +0xbc7cedae,0xbc3e9246,0x3994310f,0xbb8a0adb,0x3bd75be0,0xbab45521,0xb9d42c65,0x3b5be927,0xbc03dddc,0x3b0c70de,0x3c206761,0x3bd3d492,0x3c2aa597,0x3b9a5999,0xbab0096e,0xbb5b4f3d,0xb9d4f860,0x3b98bfb4,0x3c244c44,0x3c554a37,0x3bdd536a,0x3c028b09,0xbbc644ee,0xbb9a6dc7,0x399de753, +0xbc0d3549,0xbc0c8570,0xbc0c2bf3,0xbba6b71b,0xb99b3ee1,0x39305068,0xbbd5d64e,0xbc97de17,0xbca358dd,0xbca5ac56,0xbc2cf5e1,0xbcc197fc,0xbc84ee05,0x3ab5e40a,0xbb367c1e,0xbb841aa8,0xbcd82c69,0xbd53fec5,0xbcffe878,0x3befcb58,0x3b18d0f1,0x3a7d658f,0xbb09415d,0xbbc15182,0xbbf957d9, +0xbb88fccc,0xba969a1c,0x3add85a8,0x3a24e338,0x3ba3e7ff,0x3c221044,0x3c3572f3,0x3bf26837,0xbba96b74,0xbb6551d8,0x3bf69cb2,0x3bcd547a,0x3c45ea62,0xbb8c5537,0xbada747a,0x3c47ff23,0x3c71971c,0x3c666714,0x3c4b63b5,0xbc5f6663,0xbcc2e7f5,0xbc94d3f1,0xbcbce259,0xbca08372,0xbc3d91bc, +0xbbc8a0cf,0x3ba9e5f7,0xbb4cb560,0xbb8a4fcf,0xbb066047,0xbcaa3b73,0xbcb24888,0xbc809a04,0xbc19ddd6,0xbbc78385,0xbb891754,0xbba565cf,0xb9477acb,0xb8f6c9e0,0xba7fbbb0,0xba918df2,0xbb6c5652,0xbc04d806,0x3b76b735,0x3b26ba1c,0xbb8b0cf9,0xbbefe13b,0xbc916709,0xbc9b1218,0xbc584c3c, +0xbc463d50,0xbc8f6e6d,0xbbbddea5,0xbae7491d,0x3b75dd1c,0xb7e8871e,0xbbf58595,0xbc8f2124,0xbc7182df,0xbc575644,0xbc1145f2,0xbbe6bd75,0x3b98c031,0xbcab53c7,0xbcec7eed,0xbca19f18,0xbc9cc0cf,0xbbc5d418,0xbae6ae5f,0xbb287538,0xbb46c638,0x3a9d8b27,0xba5f315f,0x39fabd8e,0x3a8b85a3, +0xb7b9e3b7,0x3b0a2b4c,0xbb0686fe,0xbc3fcb11,0x3b95cbfe,0xb9a8b151,0xbbbbd0c5,0xb8ade1e0,0xbc16139d,0xbc478ddb,0xbc874d2f,0xbc95fc52,0xbcb239d3,0xbc29a5cb,0xbc14a983,0xbc864811,0xbc206a1a,0xbc93e3e4,0xbd393367,0xbd2f238c,0xbd153278,0xbcf0cb6f,0x3a9da711,0xbd48fa7c,0xbb7cd076, +0x3cc415af,0x3cbb434d,0x3ca8c0d5,0x3bc03d7c,0xb93d0a8f,0xbb84710b,0xb994f881,0xbae70361,0xbb837acc,0xbae97625,0xbae2937a,0xbbd6c0f1,0xbb94b21f,0xbba28c09,0xbbf7b929,0x3bd2a026,0x3b1a1f98,0xbb5c36a5,0xbbb1865a,0xbc51ed5c,0xbc27b790,0xbc796ace,0xbc8eb641,0xbcb7252d,0xbcb33f50, +0xbcb6c067,0xbcc46a86,0xbcb3efe6,0xbcbae9ae,0xbce2ba20,0xbd028ef5,0xbd4ea1ac,0xbdb73d6c,0xbd964ee6,0x3ca674ad,0x3cbf4046,0x3cd13725,0x3cc05462,0x3c96f972,0x3c9fd301,0x3c9e835a,0x3c4a2cc0,0x3bea550d,0x3b98c87e,0xbae5f8e1,0xba210568,0x3adcefd4,0x3bac3b70,0x3b608bb8,0x3ac2faea, +0xbb25307c,0xbbcbf3dc,0xbc54012d,0xbc2edb3a,0xbc13b6e8,0xbc50824f,0xbc3d0c56,0xbc7fc00b,0xbc6d2998,0xbc2f6f85,0xbc741949,0xbcb054fb,0xbcea1ea3,0xbcfec930,0xbd1e7e48,0xbd4dbc6a,0xbd25e392,0xbcbd1af3,0xba5c4c86,0x3c349b32,0x3c503a7f,0x39f54477,0x3bbfb76f,0x3bca9bf8,0x3bca639e, +0x3bf1b276,0x3c3b0841,0x3c2a134b,0x3c4f15f5,0x3c50ff6e,0x3c52a049,0x3c33e737,0x3c05dcc0,0x3b3f5f5f,0x3984ee2b,0xbaea462b,0xbac034f4,0x3b4e999c,0x3b533990,0xbb019ddb,0xbb8c7292,0xbc11ef7e,0xbc49e9c7,0xbcaf65f0,0xbcdb16d8,0xbd017a38,0xbd0406a7,0xbccd81f5,0xbc35c402,0xba518d32, +0x3c574df8,0x3cd8b976,0x3d208d03,0x3d1fc307,0x3cfc631f,0x3c99ef6e,0x3c83d6e2,0x3c37dee5,0x3b80d503,0x3bb7f71f,0x3ba42c13,0x3b9f9964,0x3b7ff35b,0x3b50e030,0x3b25f38d,0x3ba30e57,0x3b1cf495,0x3bd2f7fb,0x3bb65a89,0x3bd86649,0x3be16c49,0x3bf150f7,0x3bdeeec2,0x3be5da72,0x3bd19ea0, +0x3c1e82fa,0x3c51e5e3,0x3c45197c,0x3c5806e2,0x3c6e5dcc,0x3c885df7,0x3c95b0c8,0x3ca7bb37,0x3caeda61,0x3cb3d07c,0x3ca257d4,0x3c979cef,0x3c95dcaa,0x3c70e7c1,0x3c59946b,0x3c61e321,0x3c60ca70,0x3c0955b1,0x3bd54aa3,0x3b75ca05,0x3c04bb51,0x3b9949c7,0x3bb2ab20,0x3beed490,0x3be0da46, +0x3c0d6b3c,0x3bbdb341,0x3b357634,0x3b73c826,0x3bb67677,0x3b84339c,0x3b7c54ce,0x3bb43aba,0x3b9fa5a1,0x3bf6aa4e,0x3badebb0,0x3c04e4d8,0x3c2189f3,0x3c2c0247,0x3c406d2f,0x3c500bd9,0x3c5c906c,0x3c6bce26,0x3c65cf50,0x3c608689,0x3c5acbad,0x3c57731a,0x3c51903a,0x3c4c5d86,0x3c48aa1c, +0x3c389c0d,0x3c23a2ed,0x3c074472,0x3c209c45,0x3c30f454,0xba07f276,0xbb2ebca2,0x3b688ae2,0x3aee773c,0xbb1fe7e2,0x3a8d09b7,0x3a43bdfb,0x3a988613,0x3b432b94,0x3b0a6f63,0x3afd8b25,0x3b2b42cc,0xbb6e7bb5,0x3a60f76c,0x3b4083fa,0xbb3a8489,0x38165801,0x3c322f64,0x3c26786c,0x3c322ab6, +0x3c3e74e3,0x3c47ea05,0x3c53940f,0x3c6373a1,0x3c58736d,0x3c5126cc,0x3c48d80d,0x3c413a04,0x3c387af8,0x3c2cc7be,0x3c28e989,0x3c272890,0x3c28bb83,0x3c25d5b0,0x3c3444b3,0x3c335fac,0x3c125998,0x3c00d9d3,0x3c97beaf,0x3c5ad2d5,0xbc04232e,0x3ca06057,0x3c736d20,0xbb09c224,0xbaf6d24b, +0xbb21a830,0xbba97129,0xbba2ce76,0xbbb309f2,0xbbe8526f,0x3c6b48fa,0x3ca1b191,0xbbee9108,0x3c6071c0,0x3c9db514,0x3c219708,0x3c2235d4,0x3c320691,0x3c2e603c,0x3c2e7c69,0x3c33a63f,0x3c49ea26,0x3c3aac1e,0x3c324822,0x3c16d524,0x3c30e205,0x3c3bbf4c,0x3c47998c,0x3c551506,0x3c504324, +0x3c2e75c4,0x3c2ba868,0x3bf36fc1,0x3c4458ce,0x3c14e5bd,0x3c59acec,0x3c310da8,0x3c1f76c5,0x3c3901c7,0x3c19f780,0x3c34eb56,0x3c5f455a,0x3c5a5329,0x3c4f52e5,0x3c1a5ce3,0x3c3cbefc,0x3c1a2057,0x3c29eae3,0x3c8b9e36,0x3c460741,0x3beddc89,0x3c6ef503,0x3c3bc437,0x3c68d9b2,0x3c5e826b, +0x3c5771e3,0x3c5d4706,0x3c86befe,0x3c5f5d0d,0x3c430b1e,0x3c1598f1,0x3c519d7e,0x3c8216fa,0x3c9800fa,0x3cabe880,0x3c9bd572,0x3c4604a6,0x3c39f999,0x3bc9dde8,0x3bde3512,0x3c60a4d2,0x3c2f1062,0x3b648c1f,0x3c287505,0x3c1c050c,0x3bb63b3d,0x3c0bdf6f,0x3ba94e9a,0x3bdfae58,0x3b246b2b, +0x3b506d09,0x3bc1556d,0x3c1bff41,0x3c543869,0x3c739606,0x3c543be1,0x3c67a05e,0x3c486db7,0x3c517894,0x3c77c54c,0x3c7fb08d,0x3c7ab0e5,0x3c8ab551,0x3cc6718e,0x3c98335c,0x3c82a321,0x3c045152,0x3c7a7614,0x3ca3b6d0,0x3cc11d41,0x3cf4c31b,0x3cd00557,0x3c562fdc,0x3c523a8f,0x3b51dce6, +0x3be5c41a,0x3c9e6702,0x3c7fdd4a,0x3a214068,0x3c07e424,0x3c19c8c4,0x3b626c44,0x3c098044,0x3bb19c87,0xbb96480c,0xbb9c85a2,0xba06dd38,0x3b07e417,0x3c23f313,0x3c48b9ac,0x3c86ab34,0x3c2f96cf,0x3c34304b,0x3c2a63fe,0x3c6e1d7e,0x3ca55262,0x3cacda6e,0x3ca8d47b,0x3cc042e7,0x3d05c2c6, +0x3cb9036f,0x3c604654,0x3ba3154a,0x3c9916c3,0x3cf644e8,0x3d1877c7,0x3d343a38,0x3d111ec3,0x3c4e909c,0x3c4530ab,0x3c624aa7,0x3c27151a,0xbc52f018,0xbc30f538,0x3c88735c,0x3c259fc5,0x3bdff7fd,0x3b4bb954,0xbb0054f0,0xbb84c7a6,0xbb832fc1,0x3952a0fe,0x3b1b59b8,0x3ac6b35f,0x3bcd0325, +0x3c2b10e8,0x3c9b571f,0x3c5f2ffe,0x3c77219a,0x3c8bfa34,0x3c629592,0x3c104e3c,0x3a85a9ae,0x3b47158c,0x3b107819,0x3aae3d1f,0x3beba137,0x3c3999fd,0x3c8c7009,0xbc012c7f,0xbbee6120,0x3c8540a3,0x3c86438f,0x3c8ab4cd,0x3c3690b1,0x3c9437e4,0xbbd064f6,0x3b3797fa,0x3cbd7013,0x3c5b3fbd, +0xbbbaaf14,0xbc3d5462,0xbc56eba5,0xbc02f1b4,0xbbc35c64,0xbb19d213,0xbb77f8ca,0xba55f6f3,0x39ef80fd,0xba37cd29,0x3ad49b5a,0x3ab3e818,0xb8a12b2d,0x3bec8bbc,0x3c0dc7ae,0x3c0e8b50,0x3c5f87a4,0x3c8e2bda,0x3cae61ca,0x3c568beb,0x3bf286ec,0x3af67d46,0x3bda18e2,0x3b83de7c,0xb9ce06b4, +0x3bc3664a,0x3bf6cf81,0x3abec19e,0x3c87e956,0x3c3db92d,0xbc4fb9d8,0xbb8c02b1,0x3c957fcf,0xba210cd2,0xbc89e443,0xbc889a4f,0xbc339bfd,0xbb93958e,0x3b0c798e,0xba7c08fa,0xbabfdf1a,0x39f0571b,0x3a951b4a,0x3a25035d,0x3a1c346d,0x399220e4,0x3bb5a02e,0x3af6f726,0xbb862f5e,0x3c08234e, +0x3c59b487,0x3b3c56a1,0xbb88a92c,0xbbcfae62,0xbbe04137,0x3a993e2b,0x3c33f419,0x3c9125f2,0x3cc41eeb,0x3c80114f,0xbb8dd401,0xbbc2ad13,0x3bcc7dd3,0x3cc95399,0x3d3de9ae,0x3d54e79d,0x3d4d311c,0x3d026704,0xbccbe2aa,0xbc5641ff,0x3c280761,0x3c922e8f,0x3c432ccb,0x3b442f0e,0xbba85ad1, +0xbbe473cc,0xbb11ebb7,0xbb5786cb,0xbb79407f,0xba440ddf,0xb9bf8251,0xbb77aff9,0xbb31d12b,0xbb00a988,0xbb261f5c,0x3bc79e6c,0x3bfe0c4a,0x3b69d03e,0x3b384238,0x3b95026d,0x3bf50200,0x3c167003,0x3bf5a1a5,0x3b04253c,0x3be3f9c9,0x3c15f5ed,0x3c2d78fb,0x3c1d83c3,0x3bc355cb,0xbc0bac86, +0x3cd131eb,0x3cf59050,0x3c8067a6,0xbc4fba01,0x3dbb0e00,0x3da1d2ab,0x3d346b60,0x3d22603d,0x3d030793,0x3cf58f44,0x3cdaba9a,0x3ca3cb1d,0x3c5a67f4,0x3c051f54,0x3b6e9bae,0x3a8c250f,0x3af8a4aa,0x3bae036a,0x3b636c7d,0x3ab67882,0xbb676758,0x3a4a4669,0x3a75cccc,0xbaa8bd4f,0xbb696a87, +0xbba0a0fa,0xbb6d8af8,0xbb284d48,0x3bb6800e,0x3c990ba9,0x3c4e52c4,0x3c39717e,0x3c9bd105,0x3c01f986,0x3b41ae2a,0xbb5ffc18,0x3bef4754,0x3cdbd7d0,0x3d5f572d,0x3d9eebef,0x3d1c23a9,0x3d07d98f,0x3c907c4f,0x3cba2c8b,0x3c8bc202,0x3c9e4f0f,0x3c8b81a6,0x3c65a349,0x3c786c33,0x3c6a4cb9, +0x3c5ed5c1,0x3c581642,0x3c21b0dc,0x3b5237c5,0x3a921fbb,0x3b1ac143,0x3bb1b2f7,0x3bbf45e2,0x3b531669,0xbb03735c,0xbb8952d7,0xbbbe3e85,0xbbfd5c38,0xbbbc6f55,0xbc10d33c,0xbc75b90e,0xbcbc4816,0xbcd48192,0xbcafc76d,0xbc3d4c0c,0x3bf0de9e,0x3d086565,0x3d335e24,0x3d49f8d5,0x3d429a21, +0x3d2d2fb5,0x3cdd686e,0x3cc14f55,0x3cb7d120,0x3ca62333,0x3c830101,0x3c613267,0x3c2bad74,0x3c065eb7,0x3bee8c9c,0x3bf398ff,0x3c0489d6,0x3c033946,0x3be6ca22,0x3c12d4cd,0x3c13de52,0x3c1bba51,0x3c15fdb9,0x3c22d942,0x3c6e2c33,0x3c4bd9ca,0x3c0fd89c,0x3c126eb5,0x3bd16c5b,0x3c13e561, +0x3c368271,0x3c5d0461,0x3cb67b73,0x3cf89241,0x3d191844,0x3d224e1a,0x3d260f70,0x3d2e42f6,0x3d164f4a,0x3d0a9a37,0x3d01841a,0x3cf41841,0x3c9f3517,0x3ca374b1,0x3c0d48d7,0x3c8982f8,0x3c792ed0,0x3c6df989,0x3c8ac537,0x3c8766ff,0x3c934b94,0x3c9b7d31,0x3c9a43e3,0x3ca20a5c,0x3c924665, +0x3c93acde,0x3c73281b,0x3c4e1b62,0x3c753eae,0x3c36f8c0,0x3c0e57c7,0x3bc43670,0x3bc93c07,0x3c15ca49,0x3c2ebbd0,0x3c4d9ee1,0x3c67b7d1,0x3c7b0a7b,0x3c824221,0x3c899346,0x3c9b82ca,0x3cb1fef6,0x3ccea7b5,0x3cf22f0d,0x3ce2aa46,0x3cd583a8,0x3cc35542,0x3cb29b58,0x3c9c2a5c,0x3ca04b0e, +0x3cb0fab7,0x3c8d2f29,0x3b79f495,0x3cbde9de,0x3c93698c,0x3bda4419,0x3bcacc7f,0x3bbeb8d1,0x3ba076c1,0x3b9982bc,0x3b93a160,0x3b8193d2,0x3c96e2f9,0x3cafd445,0x3b8240de,0x3c883d61,0x3c9b8986,0x3c5da0b6,0x3c7a3ab6,0x3c8142ab,0x3c859c26,0x3c89aae5,0x3c8d9ad2,0x3c92d6e4,0x3c9a394f, +0x3ca191be,0x3ca681f1,0x3caca826,0x3cb068c0,0x3cba26ef,0x3cafbafa,0x3cac0965,0x3ca77dbc,0x3ca6030c,0x3cae982d,0xbc420121,0xbc24c5ea,0xbc6f8223,0xbc43ccae,0xb83e2119,0x3cabcd7b,0xbc730148,0xbaf2531a,0x3c88be17,0x3c92ea27,0x3c9510a7,0x3c97d3de,0x3c9d42de,0x3ca0ae96,0x3ca94cd8, +0xbabd0799,0xbc59100d,0x3ccb9edc,0x3a71941f,0xbc269e89,0xbc5331a2,0xbc258328,0xbc44923e,0xbc48da0d,0xbc4e30b0,0xbc4d3232,0xbc3b0a15,0xbc4a9c33,0xbc536c80,0xbc6633bf,0xbc6594f6,0xbc662daa,0xbc5daf3e,0xbc602a56,0xbc5275fa,0xbc24ebef,0xbc39673c,0xbc362190,0xbc8c1c0c,0x3bc4de2f, +0xbc2bc1e0,0xbbac4ba3,0xbb156a95,0xbbda6068,0xbbae9e43,0xbc032ce0,0xbc1bd5bd,0xbbf891c2,0xbc3d03e9,0xbc1408ed,0xbc0e6ead,0xbad64237,0xbaf9beca,0xbb9b66e4,0xbb859ec0,0x3c02e825,0xbc51e614,0xbc45a67a,0xbc787f4a,0xbc872c06,0xbc8e2612,0xbc88539d,0xbc5f6ea9,0xbc84e467,0xbc963c1c, +0xbcad40ec,0xbcb0551f,0xbcacef91,0xbc99b147,0xbc9aeab8,0xbc84db95,0xbc1b2055,0xbc45194e,0xbc4980b4,0xbc8d5390,0xbc1d01a1,0xbc020d8b,0xbb48f3a8,0xb9263646,0x38e8a635,0xbb51456f,0x3a5837ef,0xb976b0b2,0xbb23486f,0xbbbd3aca,0xbb03a09d,0xbba7b5a1,0x39e71ada,0x3741b857,0x3b928ca2, +0x3ade0735,0xba86c4eb,0xbc01701c,0xbc5bec21,0xbc860c18,0xbca5b99a,0xbcb24931,0xbcac9d4b,0xbc7c72fa,0xbca39f89,0xbcbea466,0xbcf3b5d6,0xbcf51417,0xbcf4670f,0xbcd3d609,0xbccce28e,0xbc9ff303,0xbbcefb3c,0xbc3cb866,0xbc55a080,0xbc7a0056,0xba8efd00,0xbb49ec73,0xbba06ef7,0xb958bbdd, +0x3b95c441,0x3b3d7850,0x3bcde114,0x3b907b74,0xbb0a09b3,0xbb4e0c93,0xbb3c4379,0x3aade185,0x3bbb8637,0x3bd70e14,0x3c3d5e67,0x3b6cfa10,0x3b6cf3ea,0xbbca3901,0xbc751860,0xbcb6671c,0xbcf08517,0xbd012e78,0xbcef053e,0xbc9f9695,0xbcda7813,0xbd0e5154,0xbd2efd9f,0xbd2ecd12,0xbd1e982b, +0xbd03538d,0xbcf6b42c,0xbca3da47,0xbaa74d70,0xbc01b3a4,0xbcea338a,0xbcb1cae1,0xbd0c13e1,0xbcd4128c,0x3c5ba557,0x3bdf2b3c,0x3a9bb7aa,0xbadb7b72,0xbb763c8b,0xbbba0098,0xbb9cbf72,0xb9ec184b,0x3a93afe2,0xb9eea944,0x3b2e82c1,0x3baf81b2,0x3c580499,0x3aa6ca56,0xb99c17e8,0xbc1d1a8b, +0xbc7479b8,0xbbec619e,0xbbb90a0b,0xbb9be96e,0xbb56de3b,0x3b65dfc3,0xbb11ac6b,0xbb8a00bd,0xbb4cf551,0xbd0b97f4,0xbd395e8f,0xbd1ded89,0xbd105f6b,0xbcf23cf9,0xbccb22db,0xbcce4f35,0xbbd0b79a,0xbc0ee693,0x3a86d709,0xba7cd6fb,0xbca49c90,0xbc911f67,0xbc51ffb6,0xbbf4b911,0xbbd8ab69, +0xbb892df6,0xbb7db056,0xbaaf962f,0x393e0583,0xb6e19cc0,0xba936a57,0xbb8ef0f0,0xbbfa3594,0x3b283260,0x3c0861b4,0xbb3c0492,0xbc885486,0xbcd709fc,0xbd175af1,0xbce81cb6,0xbc9bbbc6,0xbc3baa00,0xbbc33eda,0xbbfeaa3a,0xbc672105,0xbc685c19,0xbc6c4375,0xbc97d7e0,0xbc720452,0xbc87b505, +0xbcb4e447,0xbc478970,0x3baf142a,0xbaf91ed9,0xbbfa1b58,0xbc381a0b,0xbc0a9f54,0xbbeabf23,0xbaf0cd0e,0xbbc53521,0xbba61255,0xbab88397,0x3919843e,0xbadadca5,0xbab937a1,0x3922ea3f,0x3a80dab9,0xbb9d3fe1,0xbbd9bedd,0xbb10d34e,0xbb866d17,0xbc15ec8f,0xbc1abfa7,0xbc19aa6f,0xbc145056, +0xbcc582b4,0xbd1509fc,0xbd31dc23,0xbd2b341f,0xbd0e54ba,0xbceb295f,0xbd1710b7,0xbd530135,0xbd92f670,0xbd821fda,0xbd562436,0xbd2b83c6,0xbb37b3d5,0xbdbba244,0xbcebd57a,0xbbe512df,0xbbc83fbf,0x3b24670a,0xbc3bf5bd,0xbc3a2ed3,0xbc599cc2,0xbbc39946,0xbba6a92f,0xbbb36ab6,0xbaf84caf, +0xb9db59bd,0xbb984181,0xbb943369,0xbb9babd4,0xbbcccc6e,0xbac953f7,0x3b1e217d,0x3a9cdb9b,0xbc3e543d,0xbca5397c,0xbcb8a336,0xbcbcb5d2,0xbc93907a,0xbc336ad6,0xbc6e1ad3,0xbc8d1a2c,0xbc9187a1,0xbc9ecfa6,0xbcb36646,0xbcca4305,0xbd515e8e,0xbda1b5ce,0xbde18bd9,0xbddac755,0xbc03a486, +0x3cfad95c,0x3d5d4258,0x3d186596,0x3cd72642,0x3d020b5d,0x3cd979da,0x3c53d9e7,0x3c112e82,0x3b2ccc32,0x3a7dbcdb,0xba6ee3f8,0xba904a8f,0xba30bf76,0x3a09ad94,0xb993ff66,0xbb9e0e6b,0xbb801781,0xbb84a366,0xbc0caeb1,0xbbf4d011,0xbb897bfc,0xbb5fa4e9,0xbb940888,0xbc1c1f00,0xbca56d53, +0xbcf1cc57,0xbd140e19,0xbd25e89e,0xbd18973e,0xbd31e12b,0xbd66cf04,0xbd94ea91,0xbd874a2f,0xbd248999,0xbcb8b132,0x3bc22978,0x3bba4b34,0x3cbb55f8,0x3c764c6a,0x3c7dd41d,0x3c5f31e6,0x3c50822a,0x3c2f3a60,0x3c38b5e4,0x3c46b686,0x3c4b5495,0x3c307d31,0x3be0104b,0x3b01fb92,0xbb28506e, +0xbb8146e4,0xbb5d1a1a,0x3b05ed9c,0x3b236f48,0xbaa88065,0xbc2e1650,0xbc94134d,0xbcba6025,0xbcdcf6d4,0xbcf72163,0xbcf8ba57,0xbd06728d,0xbcefa02b,0xbc9f4eef,0xbca6e2dd,0xbc9b4fec,0xbc8f8e84,0x3be3219d,0x3c8b6d31,0x3c81c670,0x3c450c1f,0x3c7dfda6,0x3c652a33,0x3c448b30,0x3c0af574, +0x3c166d68,0x3bf82d85,0x3bec3d8a,0x3bad600b,0x3bdb24bd,0x3bc1d7fc,0x3bbf66bb,0x3bbcef1e,0x3c1189d3,0x3c171b0e,0x3c163159,0x3be88eb4,0x3bce9aa2,0x3b430694,0x3ad649bd,0xbb9003db,0xbba181a3,0xbb1498b2,0xbad659e8,0x3afd3701,0x3b93a7b6,0x3bf21297,0x3c0ca416,0x3c15943b,0x3c1ebcef, +0x3c4b2145,0x3c8b5f52,0x3ca18be4,0x3c96c827,0x3c92c6a2,0x3ca49940,0x3c966c92,0x3c5cc0cf,0x3c5358a8,0x3ca46d6e,0x3c62e7d8,0x3c698242,0x3c777268,0x3c4c035c,0x3c4bd780,0x3c284cc8,0x3c0637c3,0x3c0cb179,0x3bbfcdc0,0x3bb27e9d,0x3b89df00,0x3bce4b88,0x3bd9396e,0x3b65b5db,0x3ba5ae42, +0x3c014d31,0x3bb78cd7,0x3c1ea263,0x3c23e456,0x3c38e60f,0x3c4d3ead,0x3c6459ed,0x3c813e55,0x3c71b26c,0x3c62189a,0x3c463940,0x3c32aff1,0x3c0f4262,0x3bfe1fb3,0x3c14819b,0x3c290440,0x3c3705e9,0x3c3e42f3,0x3c33c1f2,0x3c2c8d0e,0x3c16aa59,0x3c67dea7,0x3cc28931,0x3be95f1b,0x3c543b01, +0x3cb18fc9,0x3cb3bd67,0x3cb6e904,0x3cb96fe0,0x3cbe255b,0x3cc2b9fd,0x3cc64de6,0x3c2e1be3,0x3b9be7d2,0x3cb77e72,0x3c2f853c,0x3bc236a6,0x3c0432a9,0x3c13ea81,0x3c1859f2,0x3c28f788,0x3c30feac,0x3c38a079,0x3c458021,0x3c368f40,0x3c30dd7c,0x3c2da51d,0x3c2585d9,0x3c1fc399,0x3c0ee4f9, +0x3c18be29,0x3c1b53c3,0x3c201d14,0x3c26a019,0x3c201200,0x3c7ed749,0x3c480a05,0x3c9375d3,0x3bd6f422,0xbbf61eba,0xbcc5339e,0x3c59a4cd,0xbb89e599,0xbcadce5b,0xbcb3ba11,0xbcb3e014,0xbca9679d,0xbcbf14d9,0xbcc26b20,0xbcc370e0,0xbb9c1165,0x3c3a724f,0xbcc6d58c,0xbbb27d81,0x3bf2668a, +0x3c9ebb90,0x3c69a8e7,0x3c83cf92,0x3c83d17a,0x3c829c10,0x3c831866,0x3c88c039,0x3c7c6e7b,0x3c76d8b0,0x3c7433cd,0x3c808cde,0x3c8531a2,0x3c89f945,0x3c8c7a32,0x3c845f40,0x3c4e90da,0x3c63b02b,0x3c3fc14e,0x3c7a0852,0xbc41ba91,0x3c5f2b7b,0x3b852e48,0x3b1d085e,0x3c0b4583,0x3bd42073, +0x3c4955df,0x3c457578,0x3bdfc15f,0x3c2b17bd,0x3c12c6f5,0x3c0b2c33,0x3b61317e,0x3bd2d15e,0x3c2ddcdf,0x3c2fd69e,0xbc037885,0x3c915979,0x3c9cc5bc,0x3ca18508,0x3cabcb69,0x3ca74e62,0x3ca53ae9,0x3cac375a,0x3c8ca56d,0x3c8245f1,0x3c8750d8,0x3c9339d6,0x3ca0eaf7,0x3ca7aa57,0x3cafb2fe, +0x3c97d56c,0x3c219b06,0x3c4080ea,0x3c22138f,0x3bf0fbb7,0x3b2650dd,0x3be62bd1,0x3a123a94,0x3b901bde,0x3b5a4725,0x3b6c8cf9,0x3af83272,0x3bdc63d9,0x3b25b8ad,0x3c03501f,0xbab5852b,0x3bc13907,0x3b2bb500,0x3c1db293,0x3c377ba1,0x3c2c4dd8,0x3bed4e42,0x3c600c07,0x3cc305a6,0x3cb7be70, +0x3ccfeca2,0x3cc556f8,0x3cc70c9f,0x3cdcd534,0x3ca21d5e,0x3c93ecd4,0x3c944bd3,0x3cb24a3a,0x3ccfde62,0x3ce0794e,0x3cf33895,0x3cbce40b,0x3bc9f1cf,0x3c1c7e6a,0x3b84b636,0x3a1d5fcb,0x3b073758,0x3c2b2c4a,0x3b41144c,0x3b9029ad,0x3bbfcb21,0x3b2117ab,0x3bf0c62b,0x3bae9fe6,0x3a7d7ea5, +0xbb69550c,0x394bf1e6,0x3b8a65b4,0x3c1cc764,0x3c6dea50,0x3c41ddda,0x3c6c4d08,0x3b9f391f,0x3c624128,0x3ce34d46,0x3ce5b577,0x3d099ce8,0x3d0351ca,0x3d03d2bd,0x3d088664,0x3cb087ab,0x3c766624,0x3c8cca46,0x3cc17ca6,0x3cf4eed8,0x3cfd929b,0x3d032be4,0x3cac443c,0xbb127f12,0x3a817ef8, +0x3ce994ae,0x3c235ab5,0xbcb4de9c,0xbc8848be,0x3bd2a96c,0x3ba72ac1,0x3bde0f60,0x3aa6263b,0xb87e39d5,0xba9fb006,0xbb4cdcad,0x3ae47bd7,0x3b15c936,0xba377f1f,0x3b8b05ad,0x3c2ac973,0x3c667015,0x3c90510c,0x3c02b51f,0x3c4a3a49,0x3cf17411,0x3ca69078,0x3c9b663e,0x3c32730c,0x3c26d060, +0x3c4cef03,0x3ca1723e,0x3ce18b86,0x3d24138f,0x3c8b7cf8,0x3c8f23f4,0x3d09ee59,0x3d1cd07f,0x3d1739aa,0x3ccced57,0x3cc80525,0x3c583b39,0x3c4ca081,0x3c5690f1,0x3c343b1b,0xba117d2d,0xbc122ecd,0xbc07eb39,0xbb82643d,0xbb6c0ba9,0xbaed7a90,0xbae2d65c,0xba250477,0x3aa0708a,0x3b4144a4, +0x3bbce935,0x3b734a98,0xba69e0e8,0x3b738c10,0xb9e16a82,0x3c1de38a,0x3caa85dd,0x3ca70ea9,0x3cf0aa46,0x3c922df7,0x3c3feabd,0x3bf5b8e7,0xbb82a312,0xbbf6fd36,0xbb870986,0xbbbb86ed,0xbbbc7881,0xbc27af5e,0xbb6fd24c,0xbbd743fe,0xbca014df,0x3a1ba088,0x3c7d28b5,0x3c120312,0xbc22832a, +0xbc212be1,0xbc529d95,0xbbbd42dc,0xbb65372e,0xbbba7460,0xbb703d08,0x3a549a49,0x3aec8bc2,0x3abd94b9,0x3a9a8631,0x3aa95e12,0x3b278a3e,0x3b2e3111,0xbb277515,0x3bff21f7,0x3bdcc530,0x3c04962e,0x3bc0068f,0xbac8d923,0x3b600145,0x3c594a89,0x3cd5dbe2,0x3d18b21f,0x3d115f08,0x3ceff89c, +0x3c838835,0x3c87bda1,0x3ce4f8dd,0x3d34ec29,0x3d69497c,0x3d61a3e5,0x3d48c371,0x3cbee4f1,0xbd2ba769,0xbd25cde7,0xbcacbf87,0xbbf776b9,0xbc16173a,0xbc1b8697,0xbc3efcd1,0xbc2facf0,0xbbcf7c9d,0xbba8de3f,0xbb7d3d19,0x39cdbf45,0x3a937a77,0xba473ebd,0xb991cc6d,0xbafc94b5,0xbae35aa7, +0x3a286756,0xbb01e901,0x3c21db3c,0x3c55c66d,0x3c599183,0x3c6625e5,0x3c319256,0x3c0b9e00,0x3bda1095,0x3ba2e387,0x3b4c9b44,0x3b373030,0xbb6aade5,0xbb1a2041,0x3c2761b0,0x3c8eb24b,0x3cc1209e,0x3d08bb23,0xbcc4149e,0x3d93b8d8,0x3d5a0b62,0x3cea2b6b,0x3d149e9c,0x3d0287a8,0x3d035d84, +0x3ce3981e,0x3c769771,0x3c119e2b,0x3bdb45be,0x3ba19e83,0x3ac4663e,0xb950ca93,0xb9818dc0,0x3a21789c,0x39e019dd,0xbb13dc0a,0x3ba72342,0x3a1a89a3,0x3b7fbe90,0xb969e2fd,0xbb71ffbf,0x3a1d43e1,0x3aebfd5e,0x3abac04a,0xb8f70171,0xb9b6998f,0x3af18631,0x3c06c698,0x3befa87b,0x3c1472aa, +0x3c6fa193,0x3b9e808a,0x3c0a0bda,0x3cf04f0f,0x3d51fc13,0x3d24bd39,0x3cf38d57,0x3c4bc648,0x3ca0dae2,0x3c6853b8,0x3c8c231d,0x3c9312cf,0x3c73ceae,0x3c90d653,0x3c860a7f,0x3c85f823,0x3c4f5a56,0x3c27be8c,0x3bf3855b,0x3b75cec4,0x3b1d2a37,0x3ad8e7e6,0x3a278a1e,0x3985253d,0xbb815862, +0xbb517f2e,0xbb589759,0xbbcbdd85,0xbbfb5197,0xbc1bf38b,0xbbe89d95,0xbc30cba5,0xbc6f851a,0xbc90ff2f,0xbc877384,0xbc010a4c,0x3c418c3e,0x3cdb4e98,0x3d18e1af,0x3d2238f7,0x3d1c3f93,0x3d15568c,0x3ce0bcf9,0x3ca488d3,0x3cad9230,0x3c67398b,0x3c65bc0c,0x3c507347,0x3c41e6a1,0x3c04dbf2, +0x3c29e5c1,0x3bd2abef,0x3c3c2071,0x3bf3918c,0x3c3ab0da,0x3c0d6454,0x3c167bef,0x3be3ecea,0x3b91a082,0x3b0129dc,0x3b3d05cb,0x3b8c47ac,0x3afc2639,0x3ab573fc,0x3b757fd8,0x3bb397ea,0x3bd66f2d,0x3c3795a1,0x3c847512,0x3ca77721,0x3cfa62e8,0x3d21d019,0x3d465dbb,0x3d384fff,0x3d326b1e, +0x3d37d852,0x3d1edcac,0x3ce03f5a,0x3ce4ac14,0x3c3b9322,0x3cc6a304,0x3c9b300d,0x3c9644da,0x3cb13c49,0x3ca56b58,0x3cbbf62d,0x3cb63740,0x3c940337,0x3ca961ab,0x3ca13c65,0x3c91309e,0x3c5a141d,0x3c58a6d9,0x3c812988,0x3c6a640d,0x3bf41138,0x3c54eb53,0x3c4a5e8f,0x3c639a44,0x3c6f48a1, +0x3c78dc0f,0x3c83a5e3,0x3c88bfdb,0x3ca4df9d,0x3cbc2881,0x3ccf7f33,0x3ce4a2ec,0x3cf56a69,0x3d0a8787,0x3d04de68,0x3d011db4,0x3cf624af,0x3ce95b11,0x3ccec004,0x3ce2a492,0x3ca9a836,0x3c4debb7,0x3b1ed02e,0x3cc18fca,0x3c523be7,0x3b2ac086,0x3ab11e19,0x3a074476,0x3a5645e4,0xba9a11b7, +0xbb100063,0xbb29d9ef,0x3c34f36e,0x3ca60050,0xbaf59f01,0x3c23162e,0x3c8baabf,0x3caa54b9,0x3ca2bfd5,0x3caaae0b,0x3cadcb69,0x3cb1b7ff,0x3cb4ffc1,0x3cb59edb,0x3cbf1b54,0x3cc790a0,0x3cd25442,0x3cda28da,0x3ce18275,0x3ceb9944,0x3ce18f02,0x3cdd37f8,0x3cd824c4,0x3cd88892,0x3cdd63e2, +0xbc136c6d,0xbc02390e,0xbc774d0f,0x3b6e8d5b,0x3c8e71b4,0x3cd2f3f3,0xbb1e8cec,0x3c67c39f,0x3cca226f,0x3cd3abdb,0x3cd38a59,0x3cc33b1b,0x3cd28705,0x3cd2fb84,0x3ccd49c6,0x3c75b95d,0x39669e69,0x3ce2a668,0x3c8ac032,0x3bb1ef01,0xbc520005,0xbbef2619,0xbc145ffe,0xbc1a5317,0xbc1f4114, +0xbc1ec64c,0xbc0d4dd8,0xbc234615,0xbc2c3ccf,0xbc348df3,0xbc30670a,0xbc2c3d67,0xbc29e879,0xbc177caf,0xbc0b88df,0xbbf602ae,0xbc102c25,0xbc1fc03d,0xbc39a8bb,0x3c97ed2e,0xbbb51480,0x3bbc991a,0x3b8d3fa7,0xbb1a05be,0x397c1487,0xbba6d3bc,0xbb478127,0x3b8000d2,0xbb3d871b,0xbb5d9cfb, +0xbad98f03,0x3b98a254,0x3b54fdb4,0x3b7620e0,0x3ac96ac0,0x3ca0460d,0xbbd3f101,0xbc1b5411,0xbc1f837d,0xbc48c4b2,0xbc586f64,0xbc5ef177,0xbc34c246,0xbc6e56c7,0xbc7ec828,0xbc80423b,0xbc7ace12,0xbc650711,0xbc5383f7,0xbc1d327d,0xbbfe1288,0xbbd0efac,0xbc007706,0xbc6c8d42,0xbc5e8d72, +0x3ad756cd,0x39919bd6,0x3bf78a6a,0x3b566fd3,0x3b1691f6,0x3a87382d,0x3b9d2aa2,0xb9b8d9fc,0x3bec2ee4,0xbb9876c6,0x3b7c293e,0xbb08c5a2,0x3bd5fbb3,0x3b7d4e87,0x3bf66629,0x3bf8c9e0,0x3c30abf1,0xba1af2a7,0xbc37837f,0xbc27795d,0xbc74d0fa,0xbc856d02,0xbc868593,0xbc29d924,0xbc95cb2f, +0xbcaae0ea,0xbcbc617e,0xbcb06eaa,0xbc9e4346,0xbc95d770,0xbc2a1908,0xbbd94660,0xbbe446fa,0xbc224472,0xbc6d97cc,0xbc2dd48d,0x3b279bd1,0xba509471,0x3b1cea89,0xba0b6c7d,0x3966ea76,0x3a90d252,0x3b3a2ebf,0x3b7a90fd,0xba69dcbe,0xbad514b2,0xbb225b5e,0xbaac66e8,0x3b6c9858,0x3b83db9c, +0x3c772d15,0x3b9ad94a,0x3c5d753c,0x3a09caef,0xbc3af2b2,0xbc465dcb,0xbca7b419,0xbcbd2adc,0xbcbec91d,0xbc7e7473,0xbcd640a9,0xbcfd1fce,0xbd00d153,0xbce4605f,0xbcad8268,0xbca29f41,0xbbf80e90,0xbb0a5655,0xbbad9dbf,0xbbdd0cee,0xbcfc0010,0xbc237ba2,0xbba62ed9,0xbbf0ee08,0x3c808f49, +0x3c55ff0f,0x3bebf545,0x3af89277,0x396e04ef,0xbac51233,0xbb3965cb,0x3a73b639,0x3a813885,0x3915acf2,0x3b755deb,0x3ba16f25,0x3c5bdbb7,0x3ba7d4a8,0x3c58f980,0x3b0ac10f,0xbc87b18b,0xbc3c350a,0xbc8530a5,0xbbfbc542,0xbbe9b632,0xbb5c63d6,0xbc8d9320,0xbca6f063,0xbc4623ff,0xbd075d1c, +0xbd14aeb4,0xbccd5e95,0xbc87631c,0xbc54e815,0xbc8c32f9,0xbc9266b2,0xbc10eb03,0xba03d4ab,0x3bbff9e0,0xba1ac516,0xbc433b73,0xbc3b2631,0xbc32617d,0xbbaa1e9e,0xbb9a28ee,0xbb0fb124,0xbaf536da,0xbace4cf9,0x38e4b14c,0x39b43fac,0x3a5e45fe,0xba33743c,0xb9237011,0x3b084ad2,0x3c192168, +0x3ba0b9d7,0xbc17aa73,0xbc4d0c49,0xbcc95381,0xbc943570,0xbc446331,0xbb7bdc01,0xbbcb84c5,0xbbfd4c45,0xbbdb2d8b,0xbc2b4998,0xbc130942,0xbb157e31,0xbc446c9c,0xbc8d7447,0xbca1a4ae,0xbc100c2e,0x3b8e33cc,0x3beb1124,0x3b93769e,0xbbb41997,0xbc10f99b,0xbbfb1f2a,0xbb107ac9,0xbc06f1bb, +0xbba892a5,0xbb236824,0x38c36935,0xba8aa56a,0xb9c3b010,0x3aa5b9d1,0x3abb0891,0xbb01a055,0x3aa97383,0xba441f59,0x3b343e64,0x3ab75f06,0xbc05cb18,0xbb50dab3,0xbad25540,0xbc674923,0xbcc229da,0xbce08cdd,0xbd060296,0xbd073eeb,0xbce49445,0xbd1e42f1,0xbd343a12,0xbd18daac,0xbce1be65, +0xbc925381,0xbc71f3ff,0xbb05c8e5,0xbd72792b,0xbd261729,0xbcf15a48,0xbccd5237,0xbc74a1af,0xbc925618,0xbc5a888b,0xbc52118b,0xbbfdcbb7,0xbbace658,0xbb233263,0xba1d6eb4,0x39a9d2ce,0xba4e7d9e,0xba74464a,0xba959101,0xbb739440,0xbb96b6ca,0x3b851b0f,0x3bbefae2,0xbc04c2bd,0xbc4ced14, +0xbc8f6ba5,0xbc719188,0xbc2c0eae,0xbbc29e0e,0xbb92e730,0xbb15c25a,0x3b07d62c,0xbb4e41cc,0xbc212eea,0xbc834f72,0xbd0eb8e3,0xbd409dfa,0xbd6201b1,0xbd657bb0,0xbbd763b0,0x3cff8e8a,0x3d68a14f,0x3d25d13c,0x3cfde83a,0x3d0e513d,0x3cca047e,0x3c1b4bb5,0x3c0a8802,0x3acb86c1,0x3b577795, +0xb9f56ee1,0xbaec252e,0xbb35a489,0x393a8309,0x3a38f5d5,0xbb6decfb,0x3b255742,0x3be89494,0xb8afbc04,0xbb36e8a0,0xbaddbaff,0xbb35f2a4,0xbb4b0189,0xbc2c6b72,0xbc9e2367,0xbc83d8b0,0xbc8f02dc,0xbcc6e30e,0xbcc82f6f,0xbcdff7ef,0xbd0752bb,0xbd3b7907,0xbd48cc8e,0xbd386075,0xbca0398e, +0x3c72a75e,0x3cb99f16,0x3d0b8d7a,0x3cca3b5f,0x3cb63d19,0x3c8decac,0x3c6fc42c,0x3c9135c1,0x3c7032ee,0x3c5f589a,0x3c3e3904,0x3c2ede8d,0x3c0b769b,0x3c0432dc,0x3b65950d,0x3add09b5,0xba9df748,0xba98dfc4,0xbb670ed2,0xbbac85b0,0xbc643bdf,0xbc942385,0xbc9f7c99,0xbcb3cf60,0xbca71ae5, +0xbc6f943d,0xbc91e70a,0xbc9a920b,0xbca04018,0xbcc66094,0xbcfeb8be,0xbd235241,0xbcace5a3,0xbb8bf00f,0x3be6f518,0x3c751bc7,0x3c8acc7c,0x3c9c8933,0x3cbf0694,0x3c9802d6,0x3ca599b9,0x3c8f6e20,0x3c851dd9,0x3c566b66,0x3c61e4bc,0x3c2ac007,0x3c41a937,0x3bee672f,0x3c34a742,0x3c0aeb8b, +0x3c1a50fb,0x3bd5ee87,0x3bdac0ea,0x3b804979,0x3b3d55f5,0xbb887f93,0xbbef3f16,0xbba89446,0xbbbb0b41,0xbb899a49,0xbb8c0e6e,0xbb82ab15,0xbbb141e7,0xbbbde618,0xbbda6b2d,0x3afc8e40,0x3c41dd99,0x3ca2e82e,0x3cb6040d,0x3cbc7209,0x3ccf10c8,0x3cb53e4b,0x3c900187,0x3c9ba485,0x3cf6e981, +0x3c99876f,0x3cb57020,0x3cb05381,0x3c90be54,0x3c91ac56,0x3c720398,0x3c7041af,0x3c909286,0x3c62be81,0x3c4394ba,0x3c42e640,0x3c62c52c,0x3c40fff4,0x3c16a92b,0x3c07e951,0x3c63fe9a,0x3bc0f95b,0x3c0bffa4,0x3c1914cc,0x3c243480,0x3c373515,0x3c4a442a,0x3c61852b,0x3c5745cd,0x3c5056b6, +0x3c3cc96c,0x3c2ee629,0x3c08fd54,0x3bf6ba90,0x3c10370d,0x3c37c3c0,0x3c5a8881,0x3c812bc0,0x3c5e66c0,0x3c45f681,0x3ca68715,0x3cdaa945,0x3cf8d6be,0x3c8447d6,0x3ccbca0a,0x3cf12b74,0x3cf54d30,0x3cf5bde6,0x3cebc3fb,0x3cf7323c,0x3cfc4757,0x3cfb248a,0x3cbd41db,0x3c63c1ec,0x3cebea4d, +0x3cb453e3,0x3c756a21,0x3be6aca4,0x3c1e1f2e,0x3c1d708f,0x3c29ef9c,0x3c2fa356,0x3c350c55,0x3c3f1bb1,0x3c381508,0x3c379d6a,0x3c3a55ce,0x3c3450c6,0x3c34605a,0x3c2abb84,0x3c3ad99d,0x3c3fa59f,0x3c42b7d9,0x3c4ba3f6,0x3c519c6e,0x3c048606,0x3bc2d25e,0x3c409bce,0xbbf3be35,0xbc87638f, +0xbc7204e2,0xba8c5e1e,0xbc6acfa9,0xbc8bf916,0xbc92a28a,0xbc8ea471,0xbc619536,0xbc8a2d48,0xbc8adccc,0xbc827cce,0xbc6d7602,0xbb421a06,0xbc73b501,0xbc65ccf2,0xbbcdf6bc,0x3c51b7be,0x3bfd36ff,0x3c0c7770,0x3c0c4c51,0x3c0955cf,0x3c059371,0x3c05fce7,0x3be38493,0x3bda30eb,0x3bde1891, +0x3bf10b16,0x3bfbd003,0x3c02f9a2,0x3bface40,0x3bed93f0,0x3bc2f720,0x3bdb62bc,0x3bea9f55,0x3bc4dd05,0xbc868153,0x3bb28f67,0xbaabaf6c,0xbb49c895,0x3a987f06,0x3a745758,0x3baec5d2,0x3b400c41,0xbadb2779,0x3a9c428a,0x3b0e538c,0x383a0fdc,0xbb00ceba,0x3a804247,0x3a1bf9f7,0x3b944ca8, +0xbc27880f,0x3c01eca1,0x3c3f626c,0x3c1bdfcf,0x3c2f39f0,0x3c287b47,0x3c244751,0x3c228b65,0x3bc97b7f,0x3ba00e09,0x3bb2f629,0x3bddbd24,0x3bf5ca7f,0x3bf18150,0x3bcf970a,0x3baaac93,0x3b30ab87,0x3b91d935,0x3bcdcbcd,0x3b127df5,0xbc02b1f7,0x3a0e7549,0x3ad1ec07,0xba429d1e,0xbac7fbe8, +0x3ad66a8c,0xbb230155,0x3ba87be0,0x38a08585,0x3be14ae5,0xbb72212a,0x3ae5a01f,0xbb0dafb7,0x3b7bd91b,0x3bbaebec,0x3bc273a7,0x3a1285d9,0x3bda4c01,0x3c821354,0x3c3d90e3,0x3c53fc36,0x3c3fae03,0x3c3342fb,0x3c2d73a6,0x3b658ade,0x3adcc7f2,0x3b44952b,0x3bcd2e18,0x3c08abef,0x3c1099e5, +0x3bca144c,0x3b9a18ed,0x3a451e1d,0x3ab0c79a,0x3c03c961,0x3ad1ffb4,0xbba30ccb,0x3bb6987a,0x3c177d28,0x3a2330fb,0x3ad6ef14,0x3b6b59b5,0x3badea88,0x3b988fbb,0x3bcf1edc,0xba2a9517,0x38f93f69,0x3b7b8d6f,0x3bd9d3cd,0x3c3dfd9e,0x3bf8c986,0x3c614016,0x3b287542,0x3c12f076,0x3c9c1b8d, +0x3c54e0a8,0x3c7c5f09,0x3c655eaf,0x3c5bc35c,0x3c533d2b,0x3a52685c,0xbb6d38a7,0xba0714fc,0x3b8c873b,0x3be891aa,0x3b9e1a6d,0xb974d9b9,0xbb2664e5,0xbbe3ddef,0xbb54b36b,0x3c368e00,0xbc2a36e7,0xbce65568,0xbc923adb,0xb96d5a8f,0x3b6fbf6c,0x3beed547,0x3b0d497e,0x3a4eec10,0xba018bc5, +0xbadd5f7f,0x3b16c733,0x3b18367e,0xba855feb,0x3b5623db,0x3c0d038f,0x3c137ace,0x3c7d539c,0x3b8b84c7,0x3b52c176,0x3ca1008c,0x3c6d5607,0x3c983862,0x3be2c4fe,0x3c0655e3,0x3c806b34,0x3c6919c4,0x3c8a43b7,0x3cb982a9,0x3c0fd154,0x3c03d232,0x3c8a14ec,0x3c92b4f6,0x3c9aeeb2,0x3c6eae3d, +0x3c2cb83b,0x3cc68d0a,0x3cb4946e,0xbb8fb8be,0xbb32b284,0xbbb001bb,0xbc19b152,0xbbe3c63d,0xbbb54409,0xbb413131,0xbaa0a998,0xba23b92e,0xbab215b7,0xb959d3c9,0x3b292e0e,0x3ba9fc72,0x3b357223,0xba7c3c49,0x3aa0238c,0xbb2dae30,0x3be0662d,0x3c29f75a,0x3b97df2b,0x3c064e78,0x3b8c88be, +0x3a51f095,0xbbb1f08d,0xbc1d1c5d,0xbc0ed4f0,0xba6ba8e6,0xbb35ccd4,0xbbe62d36,0xbc163ac5,0xbcdc4187,0xbcf2c841,0xbc979feb,0x38fae95e,0x3b052c21,0x3c028c2a,0x3ac0341e,0xb903bc8c,0xbc86b7ff,0xbbba0b71,0xbbadf8f8,0xbbeb90d0,0xbbb65950,0xba658997,0x3a23923b,0x3a9539b6,0x3b0c6f0c, +0x3aeef73f,0x3a986c64,0x3b35b0fd,0xb9e085d7,0x3b8d368d,0x394eb3f2,0x3c37e9b3,0x3c2f238a,0x3b4e9522,0x3bc5e649,0x3c40e14a,0x3c7ccf6e,0x3c449d62,0x3c8193f0,0x3c6a70b8,0x3c1be7ea,0x3c5aaaf2,0x3c7aef51,0x3c7757b9,0x3c9a099d,0x3c77a3f4,0x3be6f638,0x39ad5568,0xbcef2b28,0xbd36e363, +0xbd194193,0xbcd8eb7d,0xbcb61843,0xbc5f5076,0xbc15409a,0xbc064d45,0xbbd51d17,0xbb9041fc,0xbac83b79,0x392fd0de,0x3a56669a,0xb9c2858b,0x3a589f01,0xbac9e7cc,0xbb0e8c02,0xbaf6a4c9,0xbbabc140,0x3c18430a,0x3c199c9e,0x3bb74bec,0x3b230987,0xba549353,0xbbb4cd98,0xbc305e7f,0xbc1fd293, +0xbc1b88f1,0xbc0e56da,0xbc2d568a,0xbc3e8c59,0xbb455148,0xbc4490ba,0xbc5370c2,0xbc39e3cf,0xbcc7d2e1,0x3a66e0ce,0x3b4e9155,0x3c3a6655,0x3cb5eaf1,0x3cb822a7,0x3cba9846,0x3c897a0e,0x3b57f534,0x3aa51561,0x3ab68297,0x3a96654f,0x3a487720,0xb9f80683,0xbb3f624e,0x3a2d0fad,0x3ac9aa7a, +0x3a1bfdda,0x3a6f856d,0xbb7749d2,0x3baf3f50,0x3aae4ff9,0xbb83aa6f,0xbab3e42e,0xbbf6d69d,0xbc2cf53a,0xbc17ed60,0xbbf52ffe,0xbc17abb4,0xbc44420a,0xbc2964f8,0xbc13b699,0xbbaa5c6e,0xbc357f1e,0xbca34443,0xbcc8872d,0xbc5edf85,0x3cfbe458,0x3cc31f14,0x3c90c872,0x3c9f0f4b,0x3c85f8da, +0x3c634328,0x3c9027fa,0x3ca9873c,0x3c9da393,0x3c86f41a,0x3c7641a4,0x3c31b8ff,0x3c2a8843,0x3c3cb11a,0x3be25fa1,0x3ae8fb26,0xbb717fae,0xbb9e5d40,0xbbb5ad03,0xbbd8211e,0xbbd2c425,0xbbe5b92e,0xbbd47b80,0xbc489327,0xbc4895b0,0xbc17532a,0xbc2ef8dc,0xbc2c9d9f,0xbc579fce,0xbc7a3103, +0xbc8793f6,0xbc739ade,0xbc0308ee,0x3b62085f,0x3c9911db,0x3cbd6529,0x3cdc00d6,0x3cadee7d,0x3c6f3198,0x3c8a3fd2,0x3c5775bb,0x3c750109,0x3c7b52e5,0x3c815f13,0x3c3f2bbf,0x3c5985fe,0x3bff6c30,0x3c390bc1,0x3bdb2063,0x3be754a2,0x3bac0afb,0x3bb3d831,0x3b700614,0x3b12ec40,0xbb0dc635, +0x3aa33ae9,0x3b78c294,0xb92c7847,0xba6f6456,0xbb0f7628,0xbb63bcff,0xbbb0bc61,0xbbb16a93,0xbbbd79da,0xbbe2f6d1,0x3b8002a5,0x3c640bdf,0x3cc3de87,0x3cd48772,0x3cdfdb7e,0x3cfd9475,0x3cd6fd99,0x3cafab51,0x3cb0c312,0x3c7c9059,0x3caf2775,0x3c919085,0x3c9045c3,0x3ca015fe,0x3c98a0db, +0x3ca43212,0x3c929ffd,0x3c5fe790,0x3c763479,0x3c7c669c,0x3c54248e,0x3c2b526f,0x3c2955b0,0x3c266c1e,0x3c2be768,0x3bcd0f2d,0x3c113b63,0x3c17f67e,0x3c2d1518,0x3c4257e2,0x3c4fa0ec,0x3c5f66c1,0x3c6b6b76,0x3c883ec3,0x3c99de74,0x3ca365a2,0x3ca80580,0x3ca2d6a5,0x3ca71754,0x3ca49476, +0x3ca61fba,0x3ca6c42c,0x3ca9cc01,0x3ca8155c,0x3cb6c26b,0x3c5cb7ee,0x3c12bae2,0x3c1d595b,0x3c8155f2,0x3c12bff0,0x3bf3d55e,0x3bd3f19e,0x3bc37efd,0x3be5458a,0x3babff82,0x3b91799c,0x3b95662d,0x3bb9cbba,0x3c47516d,0x3b9c3ee3,0x3bab28fc,0x3c240027,0x3c89c6ec,0x3c82a42f,0x3c878a82, +0x3c897e94,0x3c8cb426,0x3c908caa,0x3c939922,0x3c9824bd,0x3c9ba38b,0x3ca1e818,0x3ca4c1fb,0x3ca9f713,0x3cae1d0c,0x3cac1edf,0x3cab14c2,0x3ca9c8ae,0x3caa0981,0x3cbbac72,0x3b3dd872,0x3b079930,0xbb075571,0x3c71b0eb,0x3c993b3d,0x3c279df0,0x3c421f32,0x3c8d5069,0x3c48dbff,0x3c49f689, +0x3c46e4d6,0x3c27c4ad,0x3c33b804,0x3c2c3a8f,0x3c1110b3,0x3c90dc0c,0x3c594b45,0x3c17033a,0x3c959ac0,0x3c840c72,0x39b4f837,0x3b54ca98,0x3b40f9c9,0x3b2d974a,0x3b2ad811,0x3b27e4b7,0x3b4b5eb9,0x3ae64b4a,0x3aaebc87,0x3a7af7b0,0x3b1a005c,0x3b45e0e2,0x3b413e29,0x3b90ae53,0x3b901438, +0x3b36abb7,0x3b278692,0x3a1a1964,0x3b3cb2c1,0x3c7dcb06,0x3bcb2893,0x3c6ae044,0x3c0a48f9,0x3ba5b87b,0x3be785e9,0x3b80db87,0x3bee564a,0x3c5552b6,0x3c0546dc,0x3baf8b90,0x3be56b4a,0x3c08277f,0x3c0138f1,0x3c3ff7ed,0x3c12d36b,0x3c8429ce,0x3bee470c,0x3b6dd2ed,0x3bb6122d,0x3b78a06d, +0x3b66009c,0x3b250356,0x3b513649,0xba298689,0xbab2c6c3,0xba800ed2,0x3b223744,0x3ba22a3d,0x3b9d8442,0x3c11890b,0x3c052016,0x3b442e20,0x3b6ab164,0xbb30e00a,0xba26b83f,0x3c3a99c0,0x3c143244,0x3c81692e,0x3bd69783,0x3b9d1b2a,0x3bd98adb,0x3bdbbb23,0x3b240544,0x3c54e73b,0x3aaff948, +0x3bbabcc3,0x3b5aebba,0x3c11e026,0x3c0dd64c,0x3c2ac012,0x3c4d624d,0x3c89d5da,0x3c26a8ff,0x3b86dcc9,0x3bd49af2,0x3b9598b7,0x3b8eef6b,0x3b6822bd,0x3bd79f75,0xbaf947a7,0xbb808893,0xbba26c17,0x3b306906,0x3bfe5758,0x3bc5654a,0x3c7e8810,0x3c5cd9b4,0x3b0a3b0f,0x3b78723e,0xbb47b611, +0x3ad4912f,0x3c42e380,0x3c21edf6,0x3c8374a1,0x3b750c5a,0xba55546b,0x3b24da94,0x3b0c2aae,0x3b8e8680,0x3b75ec02,0xb7ea7c44,0xba8ff82b,0xb99a9e89,0x3b914d10,0x3bd081f1,0x3c731ef4,0x3c28a818,0x3c8fa440,0x3c330630,0x3be50c59,0x3c322602,0x3c00199a,0x3be3633a,0x3bab391c,0x3be5083a, +0xbbc04ab4,0xbc25ee76,0xbc1cb80a,0x3b81f251,0x3c4f949b,0x3c212c87,0x3cb9bcbe,0x3c96d4e8,0xba575445,0x3b86d0bb,0xbbe5299b,0x3aa515e3,0x3bbd08fd,0x3aa52a68,0x3bee147a,0x3c3dfbbb,0x3c3a778c,0x3c00d72b,0x3b5d222c,0x3a250f47,0xbabce00f,0x3b0b7094,0x3b17cb88,0x3abc6179,0x3ba99408, +0x3bdd6eff,0x3c50a062,0x3c609c24,0x3cabf710,0x3c4f880b,0x3aaa58c5,0xb9e7d4d7,0xbc1224b8,0xbb10f277,0xbb391ad3,0xbba9fb0f,0xbc1623ce,0xbc2031ae,0xbbf8aa4b,0xbc3ab1fa,0xbb9bd970,0x3c5a910e,0x3c6e1154,0x3c70fb15,0x3c13504c,0x3bbb8583,0xba2c9eae,0x3cb4bcfe,0x3c420e71,0x39073ff3, +0xba11fa35,0xbb559b2c,0xbbdf17cb,0xbbaad85a,0xbb53d663,0xba0765de,0xba313214,0xbb05201b,0xba10dbfb,0x3a18f927,0x3b58fc7e,0x3b6c03f1,0x3bc07a9c,0x3b3779b9,0x3bd6cc0b,0x3c3796d2,0x3be402c7,0x3c2b02fa,0x3c097484,0x3b08f439,0xba115985,0x3a194f1d,0xbab5a6b4,0xba3cc173,0x3a97989f, +0x3ae5dd73,0x3b1ea7f1,0x3c0ca470,0xbc1c1c88,0xbc810277,0xbc531b72,0xbbb3678d,0xba1ac3fd,0x3bb5174e,0x3c0fbffe,0xb82d593e,0xbc229049,0xbbd61035,0xba938110,0xbbc1e9fa,0xbb8f1311,0xbb3cbb93,0x3a04bb5e,0xb8096e93,0x3a9e0a72,0x3aba571d,0x3b4c0e1b,0x3b570707,0x3bd59a4c,0x3b4cf993, +0x3c12ffcd,0x3c6efeae,0x3a969f9f,0x3b4a3979,0x3b73e369,0x3b799650,0x3b60006c,0x3b12edc8,0xbb503c66,0xbc0a7f0b,0xbc1cdb1d,0xbc3be709,0xbb75da63,0x3c7fbc4e,0x3cf4c105,0x3cfad40a,0x3c9ceaf2,0x3bb04451,0x3a1c7443,0xbced3b9b,0xbd0e15fc,0xbceab8a8,0xbcbab61c,0xbc511316,0xbbf11ab4, +0xbbfa5787,0xbbbf63b9,0xbb73e6c3,0x394704ad,0x391442df,0x3a3b0d4b,0x3aadbd47,0x3abcc625,0x3a75ca02,0x39a5da0a,0xbb14be12,0x3b73f78a,0x3c1d0c70,0x3b52895e,0x3b65cd02,0xb946805c,0xbacfba9e,0xbb9561f5,0xbb3c0a23,0x3a106b8f,0x3ba8c65d,0x3c3e9481,0x3c3294a3,0x3b8cd0ed,0xbc2b73e0, +0x3900f8bd,0x3ba0d521,0x3bd13906,0x3c63586f,0xbb77e946,0x3c6f3533,0x3cd569d3,0x3cc963fe,0x3cbc8eee,0x3cadb72a,0x3c3dbee0,0x3b1b52d2,0x3b5a6806,0x38018e9d,0x3b03bab2,0x3a98128e,0x39a48e42,0xbacf67e7,0x3acb2af0,0x3b23d52e,0x3aabe67d,0x3b076a5f,0x3bcd0fde,0x3bcb42be,0x391e887c, +0xbb00d1a9,0xbbab62f3,0xbbb8cae6,0xbb459d22,0x3b99f2ca,0x3b68bc90,0x3b8aab8c,0x3c07b763,0xb926ccdc,0xbab50aec,0xba93f6a6,0x3b556721,0xbb05f6e0,0xbc87fdc2,0xbbf0944f,0x3d044daa,0x3d29f1b6,0x3d1c286f,0x3d0bc8ca,0x3cf1191a,0x3cbc97a5,0x3ca42774,0x3ccc26ec,0x3c9f4420,0x3c81ed1f, +0x3c392d32,0x3c2f6bee,0x3c28f2cc,0x3c3205be,0x3beeb337,0x3b88d548,0xb972c514,0xbb5e0130,0xbbddfcd1,0xbbadd6d4,0xbc1802a2,0xbc1bc42f,0xbbd5b34b,0xbbd26680,0xbb9d7fbc,0xbb991843,0xbbfc5d94,0xbc3b0ae7,0xbc8be664,0xbc9c2d4c,0xbcb63613,0xbccf6a9f,0xbcced0cb,0xbc5447e2,0x3c1356bd, +0x3cc2182c,0x3c9006bc,0x3cae4d78,0x3cd16d72,0x3cbd992a,0x3cbc890c,0x3cb4d0d0,0x3cabadc1,0x3c9f9f48,0x3c95502e,0x3c76e124,0x3c8029b1,0x3c212978,0x3c1420ee,0x3bab3410,0x3bc72821,0x3ba20164,0x3ba59863,0x3bafffcf,0x3bea0b60,0x3b4c7fa0,0xbb153186,0xbb4ef301,0xbbd623fd,0xbc06088a, +0xbc274509,0xbc462db3,0xbc35fb4c,0xbc245aa6,0xbc21ca24,0xbb1f5f0e,0x3b7ca219,0x3c23179f,0x3c7d1a79,0x3c9b4bd5,0x3caf8643,0x3ca1e6ce,0x3c93a4ee,0x3ca373bb,0x3cc50a80,0x3c9d8c13,0x3cb60be6,0x3cadeee4,0x3ca30de2,0x3ca6cada,0x3c953ad4,0x3c9b8d46,0x3cabd4ab,0x3c99b399,0x3c87b56b, +0x3c891e32,0x3c8068cb,0x3c3b346b,0x3c2a4f24,0x3bcfee7f,0x3c121690,0xba4403bd,0x3875a87f,0x3b11cb22,0x3b553a4e,0x3b9983fb,0x3bbab95b,0x3bd384a2,0x3bdf705b,0x3c022363,0x3c19f271,0x3c2ea8b8,0x3c3fec22,0x3c5784d2,0x3c5987b1,0x3c6af699,0x3c80be7b,0x3c9177af,0x3c87ac3b,0x3c7f8545, +0x3cc961b8,0x3cda3f18,0x3cb33049,0x3cba4bc7,0x3cd75b3a,0x3cbfb60e,0x3cbf827a,0x3cbbe15a,0x3cadbf3c,0x3cb360fc,0x3cb3937e,0x3cae020e,0x3cc810f2,0x3ca2692f,0x3ca160d0,0x3cb51306,0x3c98e19a,0x3c0622ec,0x3c3380b7,0x3c2dae25,0x3c303e53,0x3c3252d4,0x3c35a394,0x3c3a57eb,0x3c49bcbd, +0x3c560c09,0x3c617117,0x3c69594c,0x3c742915,0x3c81becb,0x3c82c2f0,0x3c83b92c,0x3c8275bb,0x3c84238b,0x3c9b0b7d,0xbb361768,0xbb2dc6b7,0xbb067d1b,0xbc39d4e7,0xbc07a2d3,0x3c01f819,0xbc263d03,0xbc119083,0x3b2aa2bb,0x3b17a59c,0x3b3b3382,0x3bbdfb90,0x3b8d052f,0x3b90bde5,0x3bb46a00, +0xbc0b1651,0xbc27a677,0x3c0299fe,0xbbdf8000,0xbc207b04,0xba654c83,0xbaf90eda,0xbb3231ba,0xbb3c545f,0xbb451400,0xbb5aa4fe,0xbb75b49b,0xbb9299e3,0xbb9a9ac8,0xbb9d87bf,0xbb876035,0xbb830d6a,0xbb8ea95f,0xbb87b39a,0xbb7b5536,0xbb46e64b,0xbb500f9b,0xbaed8062,0xbbcfdfc3,0xbb989eda, +0xbb4a9328,0xb9dd88f6,0xbb41b1ea,0xbb8a8163,0xbb0005f6,0xbb2ba6f7,0xbb98053f,0xbb8ca1e1,0xbbbd9208,0xbb78dd80,0xbbaddddc,0xbb13592e,0xba9c5fc5,0xbb8c589c,0xb997e4cf,0x39c010c0,0xbb5b02a8,0xba8a2e0d,0xbb87b8eb,0xbb8f30bb,0xbb94a4d1,0xbba79c0e,0xbbcc91cc,0xbc0b8575,0xbc197664, +0xbc1bee08,0xbbfabecc,0xbbf3efcd,0xbc10ac43,0xbc0f6c25,0xbbfddfef,0xbb9dcf95,0xbb9595c7,0xbb098624,0xbbeb3870,0xbc1a0142,0xbb5038f2,0x3bdc3c69,0xbae7995f,0xbb1dc5df,0x3ac6d8be,0xbad1b04d,0x3b0cfe92,0x3afa2dce,0x3adf986f,0xbafa4086,0xbae65ba0,0xbab497ee,0x39e92e22,0x3b2556b7, +0x3b6e90a0,0x3a0ecff5,0x38fbfd94,0x3980893a,0xbb7ed9eb,0xbbb5b6d4,0xbbcf98fc,0xbc01c31e,0xbc2a0f2d,0xbc6c8166,0xbc842858,0xbc85c1bc,0xbc437cd1,0xbc34a223,0xbc61d420,0xbc513657,0xbc23a915,0xbb8d1d5b,0xbbb14891,0x3a7e42f4,0xbbaff462,0xbba480f4,0x3ae485e7,0x3c6af6ce,0xb98c67f8, +0xbacd95de,0x3ba97c08,0x3b4fd459,0x3b8b9092,0x3c19103b,0x3ad80484,0xba8ad2ec,0x3b381997,0x3b8d43d3,0x3beca7ba,0x3bed196f,0x3c25300b,0x3bca4951,0x3b5e9d9b,0x3ab7b267,0xbbcd77ff,0xbc14e077,0xbc277a39,0xbc4f8052,0xbc8202e4,0xbcbb6a07,0xbccee72b,0xbcc6e0db,0xbc9053da,0xbc8c0cba, +0xbcb9d95f,0xbcb6334a,0xbc8cb4b8,0xbbe2ed21,0xbbba47c9,0xbc1f9653,0xbc95aa90,0xbcbdc75e,0xbc81045c,0xbb9e919b,0x3b4eb095,0x3bede792,0x3bb886e2,0x3ae997ac,0xba93a4e7,0xbad81c9a,0x3aff249f,0x3b2f2bdf,0x3a17b4f2,0x3b70feaa,0x3bc7cd12,0x3bdf0a01,0x3c2cc8aa,0x3bb01d3c,0xbb3bfe52, +0x3a784908,0x3ab2f555,0x3b85a1d5,0x3676fad8,0x3b06dca2,0x3c00b997,0x3b9082f3,0x3abdb9ab,0xbbb2bf3a,0xbc154208,0xbc2844d1,0xbbd0e8b7,0xbbe84374,0xbb4816f7,0x3b5d0752,0xbbc37ddd,0x3c394337,0x3cc0233e,0xbbfa66df,0xbc297660,0xbc017b3e,0xbbc96e4b,0xbb863262,0xbba710f3,0xbaeffe45, +0xba50f822,0xba60457f,0xbae260e3,0xba4ad432,0x3b013387,0x3b36267e,0x3a93839b,0x39567a61,0x36bf5e72,0x39b77f78,0x3b2a2e9e,0xbb944c0e,0xbc41300e,0xbc8467a8,0xbc76c1aa,0xbc4d56c1,0xbc223ff6,0xbbf1ef8c,0xbb60dc35,0x3a929b80,0xba4091b1,0xbbc01c95,0xbbc73fd3,0xbd052518,0xbd0f7ad4, +0xbc54170f,0xbc09d82a,0xbc005abc,0xbb5d3f83,0x3b4b7a03,0x3a91abda,0xbc6415a6,0xbc149d6b,0xbbd410dc,0xbbcb481f,0xbbc6fe01,0xbb442c50,0xb96ffa9f,0xb9f13e9a,0x3aa92e00,0x3ab0e597,0x3a1e0f89,0x3ae7618c,0x3b5bdc62,0xba0f3777,0xbb2c49b6,0x3c2110d2,0x3be37471,0x3b36e46b,0x3b04aed4, +0xbbe4485e,0xbc5c24d5,0xbc845546,0xbcadf6df,0xbc97f996,0xbc2424bb,0xbbd49c1b,0xbc451fe4,0xbcdbf284,0xbcc7c9b2,0xbcd26862,0xbd048e04,0xbc510d9b,0xbc9a834a,0xbca9f976,0xbd0a8960,0xbd06b976,0xbcbef025,0xbc65daee,0xbbb38f08,0xbbc82d7b,0xbba78d80,0xbb2f4a45,0xba2a75a1,0xba217562, +0x3909ddd2,0x39c5e6e5,0x3a03f11d,0xbad258aa,0xbb00de77,0xbb3ae25d,0xbaedf2ba,0x3bdc5b30,0x3a3f3fd2,0xbbbeb510,0xbc380187,0xbc838fdb,0xbc91307e,0xbc47dcc8,0xbc828ae2,0xbc8064ff,0xbc563566,0xbc445654,0xbc6a818c,0xbc9ba148,0xbd171879,0xbd45df04,0xbd71a8a8,0xbcfaae81,0xbd8b7d85, +0xbd255dbf,0xbb263299,0x3b95f9aa,0x3bf2fc30,0x3bda7732,0x3a3247c7,0xbbe1b8f6,0xbba4ed16,0xbb8d96be,0xbb0a5573,0x3a881a66,0x3a1a78ed,0xbb375c6b,0x39a57dbc,0x3ae4a40d,0x3b6f1d45,0xbb70b032,0xbbc7e1ac,0x39e8b200,0xba484008,0xbb164bd9,0xbbbcec0b,0xbc04bbc5,0xbc2d9bc2,0xbc7130d1, +0xbca760b9,0xbcbac29a,0xbcba80e0,0xbcabf55d,0xbcb4aac0,0xbcce4cc3,0xbcf29ebd,0xbd229745,0xbd60dacb,0xbd8867cd,0x3c86c4eb,0x3caa54f6,0x3cfa5807,0x3cc95bc0,0x3cca1c85,0x3c949652,0x3c9afbd6,0x3cb63134,0x3c9cbec6,0x3c83991e,0x3c3a21ba,0x3c141c2e,0x3c0a0b03,0x3c090dad,0x3b9ac045, +0xba670b4a,0xbbca4ccb,0xbbc8ae95,0xbbb2bf34,0xbb2b23f3,0xbbd3e7ae,0xbc192379,0xbc120464,0xbc5a67d5,0xbc5ebc22,0xbc520128,0xbc316e59,0xbc14f5d7,0xbc2a8c60,0xbc52b962,0xbca473e0,0xbd014d17,0xbcf5e4a0,0xbcc25da3,0xbc003e38,0x3bae6a90,0x3c3cc75d,0x3c6567db,0x3c4103ed,0x3c56b74a, +0x3c67bf49,0x3c7d16eb,0x3c88fed4,0x3c8ed96f,0x3c7e309e,0x3c6fec67,0x3c406278,0x3c2bcca8,0x3c002e50,0x3ba303fb,0x3b856148,0x3b59289f,0x3b0d3cf2,0x3a0a424e,0xbb36fda4,0xbba73e84,0xbbbd9ec9,0xbbf4b6bd,0xbc0d9934,0xbc2cd012,0xbc46c60a,0xbc650752,0xbc87ff55,0xbca33322,0xbcc189cf, +0xbca1ad6e,0xbc810d41,0xbc4a1eff,0xbb807857,0x3b1fc051,0x3c0bb2f5,0x3c12089b,0x3c3d0ebc,0x3c39e27e,0x3c92dd39,0x3c618084,0x3c6a432c,0x3c79a57a,0x3c697edd,0x3c6e1884,0x3c4b88bf,0x3c1ff569,0x3c02dc0a,0x3bc8b088,0x3bcae0ff,0x3b8cf475,0x3b942adc,0x3b6b92a1,0x38c1c69c,0x3a050a49, +0x3a4414cb,0xba0fbf7b,0x3ac6e600,0x3aaec935,0x3b00bbe0,0x3b201434,0x3b3d0cbe,0x3b5eb246,0x3b9189fd,0x3bb86fde,0x3bc8e0cc,0x3bc6805b,0x3bafbd38,0x3b8fc126,0x3bb13285,0x3bcc3639,0x3c013bcb,0x3c1b7610,0x3c2f4821,0x3c2d0c1a,0x3c0bc3d7,0x3c36f820,0x3ca980f9,0x3c01f085,0x3c31ea79, +0x3c98599d,0x3c95645b,0x3c94e8dc,0x3c98cbe7,0x3c959b3a,0x3c94892b,0x3c960cc9,0x3bdfe304,0x3b96d2ac,0x3c87367f,0x3bd53028,0x3b95010c,0x3bfe6f6e,0x3bfc06b0,0x3bf91fee,0x3c001733,0x3c0080da,0x3c028e60,0x3c031211,0x3c0631c8,0x3c073291,0x3c0b3f48,0x3c0b3945,0x3c0f1014,0x3c0f9620, +0x3c17fe76,0x3c1cb36f,0x3c1fed81,0x3c22e6c6,0x3c44b543,0x3c5249a0,0x3c2a3c00,0x3c4f29ce,0x3c5f44d2,0x3bc90589,0xbc0f238a,0x3c83b27c,0x3becc1a7,0xbbd35088,0xbbf4262b,0xbbf71736,0xbbf12b2b,0xbc0f94c5,0xbc19b863,0xbc2bbf15,0x3be8e1e2,0x3c7b9fda,0xbc3bcdbc,0x3bdaf9eb,0x3c6a8cae, +0x3c649343,0x3c4424de,0x3c556784,0x3c53453a,0x3c54256d,0x3c5078b4,0x3c483e7b,0x3c3dd3c8,0x3c3b8a28,0x3c3a18b1,0x3c582621,0x3c630e65,0x3c59ffda,0x3c6e955a,0x3c647933,0x3c310f5e,0x3c3fbbec,0x3c272e78,0x3c7374bc,0x3ae410c9,0x3c680ec4,0x3c634270,0x3be6f5a1,0x3c0fda32,0x3c1afce3, +0x3c2dd414,0x3c4bdcea,0x3c54aaad,0x3c4fd833,0x3c2509fe,0x3c28d5f0,0x3be63d28,0x3c089033,0x3c4aeb13,0x3c4459c2,0x3b781cb6,0x3c88ed5f,0x3c7868de,0x3c897cdb,0x3c89ea39,0x3c8a0943,0x3c7bfc59,0x3c58c3e9,0x3c33fe2e,0x3c32d7b1,0x3c41cad7,0x3c87f5f4,0x3c993c7f,0x3c889405,0x3ca292c5, +0x3c8dd960,0x3c1913ad,0x3c36f7a4,0x3c0ac579,0x3c254c1d,0x3c28db75,0x3c4085ae,0x3c76771f,0x3bcfa19f,0x3b930c4c,0x3c0cfc05,0x3ba28ea4,0x3bb3258a,0x3c35d66d,0x3becf923,0x3b6c6587,0x3bd9080e,0x3bd2b224,0x3c1fe65e,0x3c1e74d7,0x3c4f79ec,0x3c66dbf2,0x3c82bf7e,0x3c960873,0x3c9a826f, +0x3ca43275,0x3ca42074,0x3c948099,0x3c773f30,0x3c2e0934,0x3c270451,0x3c3729a9,0x3caddb03,0x3cd2478a,0x3ca91973,0x3ce42649,0x3cbac869,0x3bf78cb0,0x3c35c14b,0x3be26344,0x3c141c83,0x3c21a03c,0x3c77e18a,0x3caeb876,0x3bbe043b,0x38bec248,0x3ba7b94c,0x3b5ba52a,0x3b9dd5cb,0x3c101106, +0x3aa2e2e2,0x39cb634d,0x3b458372,0x3bda3f2b,0x3c2451e7,0x3c34c380,0x3c72c54a,0x3c640fb2,0x3c8955e3,0x3cb508c4,0x3ccd28e4,0x3ce7127a,0x3ce31ef5,0x3cbf7b59,0x3c8120ed,0x3c006b2c,0x3bd58839,0x3c1f6b52,0x3cd85002,0x3d045ba5,0x3cc8dbc1,0x3d06f6c5,0x3cbd99c4,0x399f6c93,0x3bb30f34, +0x3ca17fce,0x3c354842,0xb8ce18c0,0xbb27787e,0xbb8dbf22,0x3bc90f76,0x3c5046f5,0x3c3159c1,0x3ba4cfa3,0x3aacdce6,0xba839e6d,0x3b35b809,0x3b7049b2,0x3b21851f,0x3bd459ba,0x3c1493e2,0x3c2834aa,0x3c99bb72,0x3c928e92,0x3c93d8d2,0x3cac244f,0x3c4a0b4e,0x3bda33ab,0x3bb19f14,0x3ba3d177, +0x3b36752e,0x3c186514,0x3c4d6801,0x3c38059d,0x3c88ba24,0x3cc4454a,0x3d0e256d,0x3d05e803,0x3d096fb3,0x3d0e3db8,0x3ccf2dd8,0x3bc0d74c,0x3d0a9d9b,0x3c2a5713,0x39256673,0x3bc85373,0x3ae40060,0xba93cdb9,0xbb1bb50e,0x3a0983c6,0x3b007b32,0x391fae09,0xba92a283,0x38626d80,0x3b39f214, +0x3bad0019,0x3bcecccd,0x3bf7e145,0x3b47dedd,0x3a7c1016,0x3c364649,0x3c839de5,0x3c9f0bb6,0x3cc59b4c,0x3c630625,0x3bf3aede,0x3ba568f7,0x3b219198,0x3b88eb57,0x3bfb7368,0x3c01f0b6,0x3c06965a,0x3c365b1c,0xbbc0098c,0xbc4f8dd3,0xbc130c0b,0xbbc49570,0x3ae382ee,0x3918a27b,0xbaab1901, +0xbb119080,0xbc40ee01,0xbc148465,0xbbc38594,0xbb48c0b0,0xbb7016c5,0xbb22f60f,0x3a2d7c87,0x3a8bb37c,0x3b1ef7c7,0x3abcb7cb,0x3b5ea1f6,0x3bdc8713,0x3bfe470f,0x3bb22a06,0x3c1b4e6a,0x3c9b20e0,0x3c1e7934,0x3bbae578,0x3b83cc09,0x3c36378b,0x3ca55ad7,0x3cf0edfd,0x3cbeb47f,0x3c8a7f88, +0x3c4079cf,0x3c82d4d9,0x3cef21b0,0x3d3bd204,0x3d6a2cff,0x3d58c4fa,0x3d183cea,0x3c58dd2c,0x3cd8d1d4,0xbb8e1676,0xbccd3621,0xbcba730c,0xbcaf4f4e,0xbc0573f5,0xbb5c0003,0xbb237f2d,0xbb4b85fe,0xba890176,0x3a5e5e9a,0x39ab4fbc,0x3a0326ea,0x3b5e9e59,0x3b438c69,0x3acb0ebd,0x3b1774f4, +0x3aea548e,0x3b2d2c47,0x3c0a40c8,0x3c2cc429,0x3c537f8e,0x3c31d46a,0x3c2e9202,0x3bd82999,0x3b8a5ee0,0x3b437180,0x3b9e2e77,0x3c0f2dd5,0x3be1d569,0x3bb5ae6d,0x395379a2,0x3c85d7af,0x3ce1be5d,0x3d27b344,0x3d12c0bb,0xbc04876c,0xbc88b8dd,0xbc82dfcb,0x3a63ec55,0x3be98b7b,0x3a8d106e, +0xbb6bebc3,0xbb8bfc97,0xbb7dbd0f,0xbb1d0af6,0x3a07890e,0x3b4fcb9e,0x3b2e22f1,0x39e5144b,0x3a8fcac1,0x3b0c3217,0x3ba7d30d,0x3afce6b3,0x3a82fa2a,0x3bf2d738,0x3ba3609c,0x3af220fa,0xbb43cf17,0xbb066ed6,0x3ab1fddb,0x3bf38501,0x3bb88150,0x3c27938e,0x3ca28d53,0x3c79712f,0x3c8bbf23, +0x3cabc438,0x3cdf8795,0x3cc11db7,0x3c4689a5,0xbb06ed20,0x3d084695,0x3d2616c8,0x3cf6fb12,0x3d02c394,0x3ce9442a,0x3ccd95b8,0x3cb97c3e,0x3cc3be2f,0x3cb2db86,0x3c926d3a,0x3c3d8cd9,0x3c246094,0x3c14c617,0x3bf24c59,0x3bd4f694,0x3b82737d,0x3aadf43d,0xbb3e03e3,0xbb6e1627,0xbb15e386, +0xbafa7d84,0xb8eea432,0x3a2a5df0,0x3b8014a8,0x3b868569,0x3b72ea17,0x3b14fc4b,0xbb2b9355,0xbc343d0c,0xbc15fb49,0xbc04e0d1,0xbbb67d7d,0xbc45203a,0xbc1faafa,0x3ad9067b,0x3c970d07,0x3c998ebd,0x3cb3ac3d,0x3cb4e9b4,0x3cc4f995,0x3cb82ecc,0x3cb50dd1,0x3cad058a,0x3caa1f81,0x3c91c19c, +0x3c8634c1,0x3c7a3ea1,0x3c551f01,0x3c145716,0x3bf92f29,0x3bba4c17,0x3bb1fb3a,0x3b7dc90d,0x3b28e50f,0x3abf3c3f,0xbaa9929e,0xbb9d8f5a,0xbbf61e89,0xbc323313,0xbc45991d,0xbc571df3,0xbc6c361d,0xbc59e805,0xbc4513cb,0xbc3b9faf,0xbbf17a39,0xbbaa0345,0xbb1eb968,0x3b8c8970,0x3c2fccb0, +0x3c7b4328,0x3c89c669,0x3c7a8ba2,0x3c886d58,0x3c49f16c,0x3c810553,0x3c83493b,0x3c83903e,0x3c8f7d15,0x3c9181fa,0x3c89113c,0x3c876b28,0x3c74898a,0x3c6b9338,0x3c487a8b,0x3c36952d,0x3c0c864a,0x3bcc3567,0x3bd9ddf4,0x3b6b198e,0x3acd3b3f,0x3a0bebcc,0xba2b7b14,0xb786b8fb,0xb95ba4fd, +0xb960140f,0xb9f5124e,0xba8f7644,0x3ad406cf,0x3b8f0a2b,0x3bf30eb4,0x3c275e19,0x3c5d593e,0x3c86ca0b,0x3c8171b6,0x3c76cd13,0x3c787750,0x3c7e7f98,0x3c5e1bf9,0x3c60d74c,0x3c90f9d3,0x3c7cce5b,0x3c16a98c,0x3c965da1,0x3c85546d,0x3c38e08f,0x3c280476,0x3c1a1c85,0x3c07dafc,0x3bf7826c, +0x3be08d36,0x3bc19227,0x3c6082b7,0x3c7b2d2f,0x3bb4e106,0x3c48b79f,0x3c5fe2fa,0x3c0f8f35,0x3c148b31,0x3c122b18,0x3c0cde84,0x3c08a726,0x3c05980b,0x3bf70343,0x3c1540c6,0x3c25e74c,0x3c376bac,0x3c4779c9,0x3c563907,0x3c70674b,0x3c67a03a,0x3c686e1d,0x3c63ef03,0x3c64d2f8,0x3c7c194f, +0xbbe7bb0c,0xbbbfc937,0xbc23fe95,0xbb3a9d17,0x3c03cb96,0x3cbec34c,0xbbe2a056,0x3baad687,0x3c9cb14d,0x3c9f0fc6,0x3ca0d401,0x3ca36aa8,0x3ca87b80,0x3ca91d9d,0x3caa5645,0x3bc15423,0xbbaf2ab2,0x3cbce4f3,0x3bfff0c8,0xbaca9580,0xbc0d4269,0xbbb86965,0xbbeee953,0xbbf90597,0xbbfdbe14, +0xbc04ab98,0xbc0f0f99,0xbc11b8bb,0xbc145b4b,0xbc1a04ef,0xbc0a1e58,0xbc0791bb,0xbc1455ab,0xbc042f4d,0xbbf2a8ac,0xbbc8347c,0xbbe08756,0xbbc3492f,0xbc0b5191,0x3c47f67d,0xbb78134f,0x3bbbd62c,0x3b071954,0xbb66563a,0xb90b8924,0xbb978cc1,0xbb8e1957,0x39ff581c,0xbb8d7502,0xbb618051, +0xbb5cd07e,0x3b01db5d,0x3a8bb216,0xba8a5c8f,0x39baf429,0x3c5b9922,0xbbb44df4,0xbbe31cec,0xbc0ea8cd,0xbc2ab10b,0xbc3115ed,0xbc43bd6c,0xbc5e3831,0xbc68e79d,0xbc69ad3d,0xbc71022f,0xbc4354b9,0xbc3a64be,0xbc5b0c93,0xbc33d56c,0xbc191e65,0xbbc8734b,0xbbdf090e,0xbbede8a9,0xbc01fa11, +0xba21cd97,0x39d9eb4d,0x3c4a7ab0,0x3ab8f6af,0x39cb0129,0x3b48b008,0x3b2dbfa0,0x3a18bf56,0x3bc8c9ca,0xbad83921,0x3b3299c5,0xbadddeaf,0x3b5cb3ae,0x3aac6975,0x3b365d48,0x3bac0b89,0x3bdc38bb,0x3a176388,0xbbfb469e,0xbc175ba0,0xbc5715b4,0xbc61760a,0xbc83930c,0xbc9bd2e5,0xbca7ef09, +0xbcad52a9,0xbcb3dd7c,0xbc88e778,0xbc801c29,0xbca2a0f4,0xbc6a1e90,0xbc243763,0xbb9f66eb,0xbbc57a0d,0xbb7e0835,0xbb234a82,0x3b83f2c0,0x3ba21f7e,0x3c8e4aa9,0x3aa4c9c2,0xbb2043df,0x3bb36a0d,0x3b057ba5,0x3b822ca4,0x3c12947f,0x3b3c7e92,0xba98f0d7,0x3abb8f97,0x3b61fb51,0x3b6ec24f, +0x3c0e89d6,0x3bf620ad,0x3c4ce1d7,0x3b710040,0xbbf54583,0xbc3e9756,0xbc94a6df,0xbca398c0,0xbcc63d24,0xbcec3a68,0xbcffa148,0xbcf84151,0xbcf7eccd,0xbcb1a29c,0xbca27fcc,0xbcd71eda,0xbc8f687a,0xbc463d51,0xbba4f5b3,0xbb8abcf6,0xbcb35d89,0xbc476ab4,0xbc098bb7,0xbc203fb8,0xbb643c36, +0x3bd34ffe,0x3c201622,0x3c17a86b,0x3b7ed5c9,0xba409b62,0xbae7ad7d,0x3acffb05,0x3b416ec9,0x3b2ca5b8,0x3bbc59d1,0x3bb37205,0x3bf9b7d7,0x3bcc2593,0x3c2be79e,0x3b409d1c,0xbc3e0e31,0xbc17d440,0xbc2bf7d0,0xbbcaed71,0xbb9cec01,0xbb3137d8,0xbbf85087,0xbc46b637,0xbcad6060,0xbc84b4b4, +0xbc90b05b,0xbcadb007,0xbc951e14,0xbc2a45d1,0x3b850150,0xbc1ce0d0,0xbbaf5a9f,0x3ca10203,0xbafef6d2,0xbc27b0b8,0xbbc463a2,0xbb9a0bbe,0xbb560877,0xbb2ccf2d,0x39b44918,0x3af06938,0x392dfb73,0xba80858a,0xb9523025,0x3b03c7b7,0x3a77d742,0x3abc3702,0x3b61f617,0x3af7c3db,0x3bb056ff, +0x3af356d7,0xbc30a6c4,0xbc7a621b,0xbcd4c73b,0xbc9e29ea,0xbc57a6ad,0xbba31d4b,0x3a27da32,0x3b9097dd,0x3ba810f4,0xba470b8d,0xba29ae9a,0x3bde8e21,0xbc8b07e0,0xbcc02f63,0xbc41f422,0xbc6d457c,0xbbf4f301,0xbbc70725,0x39d7146b,0xbb2bbfba,0xbc0c3615,0xbc362259,0xbc06cfa7,0xbb868f39, +0xbba3cf93,0xbb8c1c82,0xba8336c6,0xba002ce7,0x3ab6cf51,0x3a59efe1,0x3adba857,0x3b091b33,0x3bb66bb4,0xbb198def,0x39452c71,0x3bce9ae0,0x39c3e4ab,0x3b13b0ee,0xbb00a96a,0xbc4d9179,0xbcba2dde,0xbce45b7d,0xbd0d9272,0xbcfb4b4a,0xbc85f936,0xbca1e739,0xbcdc5c86,0xbd130ec7,0xbd107136, +0xbcfa6a13,0xbd06fed8,0xbc3e6060,0xbc3f859d,0x3b6a6d4c,0xbc8e686b,0xbcd87ccd,0xbc8bbc7b,0xbc4cdd7d,0xbb7f53b1,0xbb46b6bc,0xbb3a8957,0x38140bd8,0x3a53a059,0xba81195e,0xb9b6f89e,0x3b133cab,0x3abb06bb,0x3a71680c,0x385f4461,0x39d50710,0x3b92646c,0x3ac7b3bf,0xbbbc57e5,0xbc1ead87, +0xbc702025,0xbc46973e,0xbc248598,0xbbe02ab1,0xbc544fac,0xbc4ad63c,0xbbe646c6,0xbc1c9c43,0xbc4b69d6,0xbca05441,0xbd2181c6,0xbd5429f7,0xbd6f6ed2,0xbce22357,0xbd9fb334,0xbd56d507,0xbc2c72b5,0xbbf2d4f8,0xbb5b80a8,0xbbbe1133,0xbc2a7642,0xbc1ee426,0xbbf6a0e4,0xbbff237a,0xbb3e94e3, +0x3abd6314,0x3afc5f7c,0xba09b4b1,0x394d84f4,0x3a953641,0x3b66fd2d,0xbb18f78b,0xba068ffc,0x397578f1,0x3b11610c,0x3b33788c,0xbb977278,0xbbcdbe30,0xbc2e04bc,0xbc7d60d2,0xbc8cc4a6,0xbc919679,0xbcb61d20,0xbc999c72,0xbcaa4c36,0xbce350c4,0xbd0b3394,0xbd241fb7,0xbd4663fe,0xbd878044, +0xbb511545,0x3c56f84a,0x3d03c271,0x3cbb61e4,0x3ccf4a78,0x3c9ecf12,0x3c8988fe,0x3ca1c2e9,0x3c878b57,0x3c6d29ba,0x3c0b129d,0x3bf6db1f,0x3bab48f2,0x3b5d3ad6,0x3b3e11ae,0x3a1b489b,0xbacfbff2,0xbb196896,0xbb25a3a8,0xba940f72,0xbbd3ba0d,0xbc19328e,0xbc2de173,0xbc25500d,0xbc2affa5, +0xbc1bc0e6,0xbc1343ce,0xbc0b8d92,0xbc1d292b,0xbc314ab1,0xbc994247,0xbd0bae56,0xbd06d77f,0xbd03585c,0xbce0f538,0xbc52204b,0x3b341dee,0x3c4415b4,0x3c813401,0x3c7f6632,0x3cab9684,0x3c9a764d,0x3c96c64e,0x3c89ba42,0x3c8aebd8,0x3c5bdb44,0x3c667641,0x3c1d9d59,0x3c3b8cd4,0x3c011e3b, +0x3bdbf637,0x3b691e79,0x3b08f400,0xbabb2be7,0xbba5e69a,0xbc42df51,0xbc7574ec,0xbc754218,0xbc88cae2,0xbc8c2f34,0xbc913e1a,0xbc943959,0xbcb529b3,0xbcd3d35b,0xbcf1ce71,0xbcf563a4,0xbcf1d4a6,0xbcf897e2,0xbca84dbe,0xbc491ff6,0xbbb39557,0x39448880,0x3b3840c2,0x3b6e9e6b,0x3c90b738, +0x3bd14c0c,0x3c2bd3d1,0x3c3ea6dc,0x3c0d6471,0x3c23f345,0x3baf5f4c,0x3b76f84e,0x3b98d391,0x393b26d1,0xbabaec09,0xbb26bcd9,0x39b5521b,0xb93c7fcd,0xbb6d3ba2,0xbb37eb92,0x3b118932,0xbad955fd,0xb9b46082,0xbaf11f52,0xbb29c5e7,0xbb58bd96,0xbb8a0bd8,0xbba0f337,0xbba2c1b1,0xbba2792b, +0xbbb0eb11,0xbbc06fb9,0xbbd8b70b,0xbc04d68a,0xbbc82c4c,0xbb990264,0xbb14d967,0x37df759d,0xba005aa3,0xbb0802f1,0x3b890dff,0x3c3b6176,0x3cb53377,0x3a862873,0x3c328463,0x3cb1c20a,0x3cb0ea5c,0x3cb0170e,0x3ca94766,0x3cafbb59,0x3cb19da0,0x3cae5b1e,0x3bfd55ef,0xba6c7aed,0x3ca1eaca, +0x3bff152b,0x3a9d9f84,0xbb185fce,0xbae3e4ba,0xbb210d49,0xbb29bf2d,0xbb48e775,0xbb603fbd,0xbb805501,0xbb8301b6,0xbb890460,0xbb8b1795,0xbb9449a7,0xbb98072f,0xbba68f3f,0xbb7a94bb,0xbb4766a9,0xbb1bf908,0xbaef81fb,0xbb246ce8,0x3c564da1,0x3c3275c6,0x3c85c6b0,0x3b6977bc,0xbbe75450, +0xbc67ff0a,0x3c0b5960,0xbba88596,0xbc6d8bac,0xbc808f7d,0xbc7edfb7,0xbc5a619a,0xbc812d19,0xbc83e072,0xbc82b5ea,0xbbb43b29,0x3bdbd31a,0xbc88418f,0xbbbcb5c7,0x3b7b5362,0x3c89db8d,0x3c46d182,0x3c599e67,0x3c5854af,0x3c57da61,0x3c5135ef,0x3c3f841a,0x3c3e621f,0x3c3fca69,0x3c4266e1, +0x3c58b834,0x3c5fedd5,0x3c5849af,0x3c5fb14f,0x3c566133,0x3c300139,0x3c4403ef,0x3c493709,0x3c73594b,0xbc01e9de,0x3c55ae3e,0x3bf3389a,0x3b1ebe30,0x3bcaa9e8,0x3bca9934,0x3c235659,0x3c1a4c02,0x3bba9321,0x3c0eeca2,0x3c03c8d1,0x3bd402ab,0x3b291449,0x3b99facd,0x3bcbfa75,0x3c12b7f8, +0xbba6157a,0x3c7c5226,0x3c859254,0x3c8123be,0x3c885400,0x3c87c9e8,0x3c7aba7b,0x3c44fe53,0x3c3678bb,0x3c37dd38,0x3c43ce89,0x3c819e11,0x3c89cb50,0x3c6d9e24,0x3c7d5cdf,0x3c5be934,0x3c05b4c3,0x3c2b236b,0x3c59e9ba,0x3c4779be,0x3b85a860,0x3c0c3b06,0x3c22e1e0,0x3b4e99bc,0x3af3b522, +0x3bd195e5,0x3ae479d6,0x3bd30dd8,0x3b9fecf6,0x3c14a129,0x3a50fa97,0x3bb19e6c,0x3ae32963,0x3bd10e16,0x3bbcdc0c,0x3c0e6683,0x3bdd57e9,0x3c6611f9,0x3ca67cfe,0x3c91b714,0x3c9ea1a4,0x3c9b8673,0x3c86ee0e,0x3c2b8db2,0x3c195fc0,0x3c224423,0x3c4b6c07,0x3c9c990c,0x3cb1103b,0x3c932f60, +0x3c9d594c,0x3c85e43b,0x3be7835a,0x3c30d93d,0x3c6dac48,0x3c52dcda,0x3bf35646,0x3c87da1a,0x3caf844b,0x3bb00239,0x39dd3ff7,0x3bc798f7,0x3b981640,0x3ba82293,0x3c3a9c63,0x3b2ef0e1,0x3ade6858,0x3ba15473,0x3beb0b0a,0x3c25e867,0x3bb71931,0x3c794979,0x3c0de0a6,0x3c8bdb22,0x3cc76148, +0x3cb4b47c,0x3cd0c24e,0x3cca4f95,0x3ca63059,0x3c1ef2d3,0x3bbd97d9,0x3be89ece,0x3c38e690,0x3cb5df7a,0x3cc49561,0x3c8b267e,0x3c93c9f1,0x3c300eb1,0xbae9765e,0x3b83b63c,0x3cbf610a,0x3ba0a006,0xbc542b10,0xbc45eabb,0xbc4826ea,0x3af99954,0x3c48c5bc,0x3c3a5045,0x3bc70d87,0x3a966f11, +0xbac1f8d5,0x3b25b730,0x3b84f916,0x3b2d4c88,0x3be7168b,0x3c1ff9ec,0x3bf808e5,0x3c786860,0x3c0abdc7,0x3c6444fc,0x3cb3a22e,0x3c65c51c,0x3c84c135,0x3c03a11e,0x3c030792,0x3c0e3ab0,0x3c9e5c90,0x3cb54dba,0x3c65d675,0x3cd1b2b6,0x3cef1180,0x3cd4295e,0x3cd8c7dc,0x3d02fde0,0x3d2cfc55, +0x3ce34193,0x3c4067ac,0x3d00f4a3,0x3b83f465,0xbaa4a80d,0x3bdd289d,0xbb04ca51,0xbb0532e6,0xba9d19fd,0x3b0a3d15,0x3b705f07,0x3b0de0fb,0x398e587c,0x3a4ff75e,0x3b840790,0x3b9fd78c,0x3bcd95f3,0x3bc4169e,0x3b98c8ab,0xb97f1101,0x3c03bcb7,0x3c74a9fb,0x3c6a1342,0x3c9b385f,0x3c56b370, +0x3c155f77,0x3bc61fbc,0x3b49049e,0x3bbcbb87,0x3c3ba20e,0x3bdfc603,0x3bced3fd,0x3c0f85c6,0xbbde71e1,0xbc5ac00f,0xbc3643de,0xbbd3d2de,0xbaa1ecfc,0xbaacc394,0xbbc75de0,0xbb50303e,0xbc2cb472,0xbc09a96a,0xbc1add0d,0xbab833f1,0xbb631d2d,0xbb0b66a1,0xb80b4457,0x3b12e09f,0x3b7162b0, +0x3a982bdd,0x3b4dd698,0x3bf2552f,0x3b95dc55,0x3ba55295,0x3ba36d58,0x3c505ed5,0x3c5a89c2,0x3c02fcd0,0x3bbc2a1a,0x3c716eba,0x3cb24f81,0x3cd2077f,0x3cbb5e9b,0x3ca4834d,0x3ca2a2c9,0x3ccc50a7,0x3d0857ba,0x3d1fefff,0x3d192b52,0x3d043490,0x3cb85100,0x3bc4a1a1,0x3c89a588,0x3b25d8c8, +0xbc3c6265,0xbc626ce6,0xbc70eb03,0xbbc10f41,0xbad44586,0x3b09ce76,0xba2d4116,0x3acaaf6c,0x3b0047ef,0x39d50cde,0x3a24f17f,0x3b6ccaba,0x3b7d32ba,0x3b4c5468,0x3b896bc3,0x3bcadcf9,0x3ab59a0f,0x3b9fed05,0x3c518d76,0x3c69a211,0x3c5be7aa,0x3c534880,0x3c1bfdab,0x3b8c4f77,0xbad2622a, +0xbb173574,0x3a7476f8,0xbb8785d9,0xbb4c07bd,0x3b53c5e5,0x3c05ddc7,0x3c856ef7,0x3cedf4ed,0x3c917fe0,0xbc570fae,0xbd220fc4,0xbd236b1a,0xbc8a77d7,0xbbe91810,0xbc6218d6,0xbc63ae17,0xbc06bdf5,0xbc1abe34,0xbbb8de22,0xbb1cdee2,0x3b2b5984,0x3b637b2d,0x3b06f4cb,0x3aa1f3f3,0x3ac646c8, +0x3ba59de6,0x3ae088d6,0xbadefa41,0x3be45209,0x3be0ad42,0x3b241b18,0x392ae4f2,0xbb013c92,0xbab44159,0x3ae60508,0x3ba01c7e,0x3be4bf64,0x3bd8b753,0x3c27d8f8,0x3c41f582,0x3c5fb14a,0x3c42ddf1,0x3c0bb946,0x3bdde4c8,0xbbfc6153,0x3c0ef554,0x3c619fde,0x3c2897dc,0x3c738751,0x3c75f6a0, +0x3c83e656,0x3c8c7b8c,0x3c936d2d,0x3c8ebc8f,0x3c72565a,0x3c2edefe,0x3c03de6c,0x3bc75946,0x3b923bf2,0x3bb60b4a,0x3b899e68,0x3b54e635,0xba06733b,0xba7f0f50,0xbacc73c0,0x3b07ad16,0x3b8397bf,0x3b66c93c,0x3b5a6f66,0x3adb80be,0x3a58dd94,0xb919a587,0xbb1d9ace,0xbbe43e7f,0xbb383a49, +0x39ce29fb,0x3b945b6f,0xbace76ea,0xbbc75b1a,0xbbf7af30,0xbaf4e7a3,0x3c7056b1,0x3c90cc32,0x3c7b93c3,0x3ca003a9,0x3ca0ae66,0x3c9bf1b9,0x3c918780,0x3c8ecf86,0x3c65fdd4,0x3c686a8f,0x3c354551,0x3c5415c2,0x3c188743,0x3c1fa0f4,0x3bbf1aef,0x3b92eba8,0x3a900095,0xbac15059,0xbbc919ba, +0xbba60bd2,0xbba47865,0xbc1c9e6c,0xbc41370d,0xbc5211be,0xbc5ae6cd,0xbc6bd4d4,0xbc6491b8,0xbc5e8f53,0xbc5e6682,0xbc520fc5,0xbc5a24ee,0xbc5caa53,0xbbfdd648,0xbac46290,0x3b83a078,0x3c147ee1,0x3be8a2b5,0x3c02d217,0x3b18871f,0x3c054992,0x3bd83988,0x3be9710f,0x3c1e1f01,0x3c268239, +0x3c23482c,0x3c1017d9,0x3ba384f4,0x3bb2100e,0x3b8f3f19,0x3b175a9a,0x3a15cd35,0x3ab1e5a0,0x3b2bd242,0x3b3119af,0xba376140,0x3b68b806,0x3a929e11,0x39b0246a,0xba467e75,0xbb0ff687,0xbb73aa60,0xbbb9a00a,0xbb481525,0xba7e70b2,0x3a9d6d61,0x3b4cbcc8,0x3bb4e47c,0x3bed8f2e,0x3bf5bdae, +0x3be2be1b,0x3bdf96ed,0x3bda9c1a,0x3ba91676,0x3bd06d3f,0x3b403bfb,0xba6c5249,0xbb355014,0x3ba43874,0x38a1f236,0xbb0168fb,0xbb599483,0xbb8934e3,0xbb8982d2,0xbbbd56b8,0xbbdf7f95,0xbbf81b50,0xbb167680,0x3b4476fe,0xbbd49e2b,0xbb1ba8f9,0x3af68a05,0x3b97b267,0x3b3fc078,0x3b369b0e, +0x3b09a181,0x3ace9544,0x3a99a72b,0x39759b16,0x3abb10a5,0x3b05b05c,0x3b339032,0x3b5e2d15,0x3b80929d,0x3b9d01cf,0x3b97c1ec,0x3ba1d4b2,0x3baa01e6,0x3bb1cfac,0x3b98cb9c,0xbb14084f,0xbac1cc16,0xbbd7bcbe,0x3c138fc4,0x3c9119c0,0x3ca5e357,0x3b7a0ceb,0x3c74a6fa,0x3ca0831b,0x3ca409ed, +0x3ca2aeaa,0x3c9430ea,0x3ca0d81d,0x3c9fa76d,0x3c974328,0x3c7c76d8,0x3bb96c40,0x3c9da4d5,0x3c87dcfb,0x3c1f3563,0xbba395a7,0xbaaf7fb3,0xbb2319e8,0xbb3915c3,0xbb3fb0a7,0xbb52055f,0xbb719ef8,0xbb760c7f,0xbb7b64e9,0xbb87d2d7,0xbb4a4f32,0xbb363414,0xbb5c771f,0xbb0c3f98,0xbadb6d38, +0xbabcf3c5,0xbafe1403,0xbb0f0893,0xbac16b16,0x3ca055c6,0x3b261695,0x3c40e84d,0x3be26c31,0x3ac77d69,0x3b86e9e6,0x38f69a0c,0x3b2c3559,0x3c00aa8e,0x3b63048b,0x3b110015,0x3b47a618,0x3bcfe604,0x3ba1fe6f,0x3bc93195,0x3b9febb0,0x3c92d398,0x3af6986e,0xbb086df1,0xbae340e6,0xbb7b2b14, +0xbb8c78a0,0xbbb8e0e9,0xbbeb1347,0xbbf8aa11,0xbbf024f4,0xbbf4ace6,0xbb8b37b7,0xbb444e03,0xbb8d00c7,0xba892f86,0xb9e7db7d,0xba259c26,0xba7a9d2b,0xbb51a36e,0xba881300,0x3c2f31fe,0x3be422ac,0x3c746a14,0x3b9d5f8d,0x3b6a25e9,0x3bad1a2d,0x3bdbb126,0x3b059df8,0x3c1baebe,0xb6ae81bc, +0x3bd805c1,0x3aa0eb6a,0x3be9d39a,0x3b947de2,0x3bb41222,0x3c09c246,0x3c53dbea,0x3beb287e,0xbb37b405,0xbae68635,0xbba90440,0xbbb28c2c,0xbbff8e0e,0xbc20edc0,0xbc3533bd,0xbc358c52,0xbc3e6a20,0xbbd061cb,0xbb84533c,0xbbeac818,0xb9b45b0b,0x3af9baa2,0x3a6c6b53,0x3ab727b5,0xbafb1a7d, +0x3b8f1e7d,0x3c73b3af,0x3c44aca0,0x3c969755,0x3b80dfd1,0xbb13bae1,0x3b855fa3,0x3b115041,0x3b9a5cb6,0x3bf90eb3,0x3b64c6d1,0x39789cd0,0x3a34f01e,0x3b7b60f6,0x3b391bda,0x3c19e0af,0x3bfbf8f5,0x3c8c459d,0x3c31d69b,0xba5a4486,0xb9bbaea5,0xbbc34a71,0xbbf8ccb1,0xbc40c995,0xbc883875, +0xbc9b799f,0xbc8f4ba8,0xbc8d0150,0xbbee8148,0xbb5b579c,0xbbeb4dc0,0x3b6a2351,0x3b7eb1cf,0x390682b1,0x3b0d98b9,0xbc47af79,0xba63e633,0x3b955ebe,0xbb8a1f51,0xbb938ffb,0x3bf56ba2,0x3c47cad8,0x3c55d8d0,0x3befc735,0x3a8c6a61,0xbb0c799d,0x3aba1d45,0x3b49ffe4,0x3b800a52,0x3bf77c77, +0x3bcbb895,0x3c13686d,0x3b9e39ac,0x3c577357,0x3c1edc6e,0xbc1dcb15,0xbbfd2768,0xbc3bf0e2,0xbbb18840,0xbbbeeda7,0xbc07cef9,0xbbb31715,0xbc11b4af,0xbcb7e514,0xbc2a2d71,0xbc053920,0xbc3dafef,0xbbe9e32a,0x3aebb676,0x3c88f949,0x3b84b335,0xbc7f9190,0x3c54e66d,0x3c194413,0xba917ffd, +0x3b2b6c85,0xbb4ee405,0xbbb6f2a4,0xbb0b523e,0x3a221103,0x3b529525,0x3b235132,0x39eb0bf0,0x3a5d4390,0x3b0064c6,0x3a785616,0x3b6d44ce,0x3bf389b2,0x3bc18f57,0x3c2332c9,0x3bb74cf5,0xbb12366a,0xba9d0183,0xbc1dea07,0xbbcc0f70,0xbb397698,0x3b4b4613,0x3bc3c705,0x3beec3c8,0x3b952c79, +0x3adf1790,0x3b945dc0,0x3c52c913,0xb9973fe1,0xbc0ec17b,0xbc55e436,0xbc823cb7,0xbbcf8bd1,0xbb48d15b,0x3a2318ff,0xbb7b60a2,0xbb4c46aa,0xbc07471c,0xbbd0b33c,0xba624aa1,0xbb45baf7,0xbb747e0b,0xba3bbdfc,0x3a4a5a16,0x3b152032,0x3a45345b,0x3b50b616,0x3b888234,0x3bcab3e2,0x39da6db7, +0x3badec5d,0x3b8cbecd,0x3a0bbcc7,0x3bb5d670,0x3a35d6b7,0xbb99020b,0xbc379e36,0xbc65f628,0xbca9824d,0xbca8e50a,0xbc2b79c3,0xbc5c90d4,0xbc4f3f71,0xbbc6bb19,0xbc003ee3,0xbba799b0,0xbc047656,0xbb99da07,0xb9816df1,0x3b5c4050,0xbba85da4,0xbc56c85f,0xbc198f31,0xbc106d51,0xbb53b0c7, +0x3ae6bcd3,0xb9778662,0x3b089f2e,0x3b3106d1,0x38c17eac,0x3a00b8c9,0x3b5bc50f,0x3b577922,0x3b9f2ee4,0x3b979aa2,0x3ba22932,0x3c0ead3d,0x3aff951c,0xba03431c,0xb95449af,0xbb662783,0x386d6e73,0x3b048017,0x3b0c0d92,0xb76ddbd0,0x3aa52082,0x3ba74233,0xb9b713ed,0xbba3e865,0xbc64aa12, +0xbc642bac,0xbc6b8519,0xbc7d1419,0xbad479ef,0xbd050158,0xbcef6bb9,0xbc5aab75,0xbc504854,0xbc09c294,0xbc48b29a,0xbc6d477d,0xbc049041,0xbbf086ae,0xbc03079e,0xbb549570,0x3a1c48c3,0x3b201816,0x3b2121db,0x3ae7d175,0x3ae9c41a,0x3b4381be,0x3b025636,0x3bd1189a,0x3b456d7a,0x3b715a2d, +0x3b8a6069,0xba145e39,0xba89b60c,0xbb3e0410,0xbb9d56ad,0xbacf9839,0xbab24d54,0xbbd81d35,0xbb74a5cd,0xbbe0697f,0xbc7f09cd,0xbc9aec64,0xbca8716f,0xbcc68b8e,0xbcd090fb,0xbc80979b,0x3adaf37c,0x3c85c02b,0x3c4ca65d,0x3c6a496e,0x3c649cd3,0x3c3f7b83,0x3c694be4,0x3c29ed33,0x3c146168, +0x3bb3d516,0x3bd277c3,0x3b8b13c1,0x3b5759e2,0x3b7e8174,0x3b8b2da4,0x3b9638f4,0x3aa71d33,0xbaa69491,0xba64e4d7,0xbb3c1652,0xbb5e744e,0xbb5bb094,0xbb8e8700,0xbba0becc,0xbbcad6af,0xbbdf9b52,0xbc06f7b2,0xbc25d03b,0xbc0913ac,0xbc1ede01,0xbc64337b,0xbc8d71a9,0xbca23482,0xbcb0ce82, +0xbc92693d,0xba4a7c78,0x3c241e36,0x3c8f6240,0x3c85b4a6,0x3cb7aaa6,0x3c9de975,0x3c8cfd88,0x3c752656,0x3c80d1b4,0x3c463e37,0x3c68f98b,0x3c12a309,0x3c3d181d,0x3c0603c1,0x3be59646,0x3b48cf56,0x3ac00662,0xba2c8316,0xbafb41b1,0xbbdbe88d,0xbc39c05a,0xbc48807f,0xbc737651,0xbc7d15f3, +0xbc855ad4,0xbc8b0b26,0xbc91436c,0xbc9551e9,0xbc98af70,0xbcafb07d,0xbcc6d6a6,0xbce558fd,0xbcb19e30,0xbc82bd3a,0xbc40a217,0xbb752310,0xbad1b50e,0x395bc578,0x3c31cc16,0x3abe3958,0x3bc45b61,0x3bc6db30,0x3b81d695,0x3bb89e30,0x3b025841,0x3b17f4f8,0x3b96087a,0x3a89bcaf,0xba6c3cc8, +0xba4f0fce,0x3ab2a2ff,0x399fd0f1,0xba85b6ab,0xbae6cdd4,0x3b5dd6f9,0xbb58801a,0xbb7b11a4,0xbb99edec,0xbbc33fee,0xbbe43af5,0xbc084aeb,0xbc1fd798,0xbc2c04c7,0xbc37560e,0xbc3a6285,0xbc38ac63,0xbc2cd83b,0xbc301dc2,0xbc0c9ce3,0xbbe51151,0xbba9d87a,0xbb507e1e,0xbba01330,0xbbced100, +0x3b1fdb8f,0x3c0296de,0x3c33a13b,0xb98f0613,0x3bfad425,0x3c491948,0x3c4a29a3,0x3c46b439,0x3c2e9fcc,0x3c40466f,0x3c4383e1,0x3c38c14d,0x3bdda56b,0xba633f84,0x3c2d8ccf,0x3bc4fdf2,0x39e51646,0xbbfb1602,0xbbcfe88c,0xbbed2041,0xbbfa02b4,0xbc06c4fd,0xbc0eb559,0xbc182baa,0xbc13ca50, +0xbc124a10,0xbc131e28,0xbc143d44,0xbc163076,0xbc19da7d,0xbc088288,0xbbf69216,0xbbdb3388,0xbbc69808,0xbc00c6bb,0x3ba54fdf,0x3b96e6ce,0x3c02e6f9,0xbbbb5765,0xbc22907e,0xbb6ac27a,0xbb35adaf,0xbc181fbe,0xbbe10e30,0xbbef1485,0xbbe4c427,0xbb92c824,0xbbc85b32,0xbbc6c389,0xbbac8e1e, +0xbc1a6dd0,0xbb7c05c4,0xbb94177d,0xbc0e932f,0xbbaf2f4e,0x3c07bfb2,0x3ba29e73,0x3ba680c2,0x3ba2a1ab,0x3b9f4c83,0x3b91900c,0x3b6231d7,0x3b69a2a2,0x3b6f15cc,0x3b739a17,0x3b8dd7cc,0x3b91a6f6,0x3b890037,0x3b85b483,0x3b85fb53,0x3b84ee2d,0x3b99178e,0x3bd08127,0x3b91e1e5,0xbbdc7ccf, +0x3b9c7017,0x3a8de0fa,0xba9ffb2f,0x39fe0649,0x3a6c92cf,0x3b7a9121,0x3b0f1c88,0xbac12581,0x3a984120,0x3b128f28,0xb93d0cb8,0xba6ec3cf,0x3a0f1e1a,0xba123d87,0x3b4b5e20,0xbb7a6d88,0x3bc099fd,0x3bf6b50c,0x3ba83a24,0x3bb2733e,0x3bab6a14,0x3b926e6a,0x3af9db75,0x3ae3eb0e,0x3ad73a5e, +0x3ad56a3c,0x3b7561a0,0x3b7af1b8,0x3b2562d3,0x3ae8d4ae,0x3ad8b4c8,0x3b221cc4,0x3b672c0a,0x3c0ef515,0x3b9ab8a8,0xbb102f9d,0x3b0205f5,0x3ba06c8a,0xb9be5fe3,0xba46d14c,0x3b2b00db,0x39e786d2,0x3bb1ab8b,0x3a201b37,0x3bd3ba1e,0x3916b8e7,0x3aae7864,0xbaa128fc,0x3ad089d5,0x3b256788, +0x3b80f455,0x3aabff06,0x3be9a5e4,0x3c22b9f4,0x3bc608a3,0x3bbb863f,0x3ba7c479,0x3b386bb1,0xbb29efad,0xbb00be57,0xbac6fefb,0xba08b5a6,0x3b1db898,0x3b409c55,0x3abce07f,0xba367884,0x3a1fd519,0x3b5b4e81,0x3b9bf083,0x3c3385fc,0x3bc33683,0x3b3c685e,0x3c2b5332,0x3c7930c2,0x3b3520dc, +0xba10c965,0x3b9fec39,0x3b9cfe86,0x3bb98195,0x3c3496ad,0x3b866491,0x3b07e58e,0x3b83a226,0x3bb59d85,0x3be5c44c,0x3b561ed9,0x3c382e31,0x3bd744bb,0x3c4ca334,0x3c50f7aa,0x3bc7aa06,0x3bb50300,0x3b8c7d65,0x3a8634fd,0xbbe43df6,0xbc02b6b8,0xbbd0720a,0xbb8dce09,0x3a618224,0x3950271b, +0xbb417682,0xbbd618df,0xbbdbbe7f,0xba833f70,0x3aa9ba4d,0x3c4f3444,0xbb8fb085,0xbc8cc90a,0xbc84b5ed,0xbc80b4f8,0xbaa6c4c2,0x3c1511ce,0x3c35690e,0x3bf8ab68,0x3acadf9e,0xbb0b20da,0x3ad8d246,0x3b613ddb,0x3b420609,0x3bdddcc3,0x3bffaf45,0x3ba70dd8,0x3bdcfb8e,0x3883cce0,0x3b27bd1e, +0x3c05100f,0x3be51bc3,0x3c590065,0x3bb1c2bf,0x3bd9f02d,0x3c252143,0x3ca56347,0x3c9be6d6,0x3b134b53,0x3c2a9891,0x3c1462bd,0x3aa9dfc4,0x3b414cc0,0x3c42a862,0x3cef12e0,0x3c836226,0x3b01589e,0x3c3a7f25,0x38827f81,0x3a4f5a69,0x3b5a6d3d,0xbb36125f,0xbb58f180,0xbb39ba59,0x3aadb9a7, +0x3b57fe9e,0x3b74890a,0x3ad462c8,0x3aae6df8,0x3b765093,0x3b4c5edd,0x3b91c334,0x3b8ba713,0x3bbd9164,0x3b42e933,0x3b5bb66e,0x3bbf97fb,0x3ac5e2ee,0xb9f4efb8,0x3a858e86,0x3aa1c3de,0xb9903e06,0x3b613d85,0x3b9fa420,0x3b105ad1,0x3b46fa38,0x3a87d0da,0xbacc4f72,0xbc3b039d,0xbc83ab84, +0xbc6680ec,0xbc3a5556,0xbbb8edf8,0xbb4c7013,0xbb928996,0xbb1a9d09,0xbbc8e201,0xbbd5d841,0xbc15bcf0,0x39fa3b52,0xbb3a4ef5,0xbaf2c584,0xb90ea294,0x3b02c1df,0x3b522687,0x3a9cfb6e,0x3b0615fa,0x3bb27f7c,0x3aff1e77,0x3b1080f5,0xba3f13e5,0x3b5bd63d,0x3c3f0d16,0x3c0b90ce,0x3b9187e4, +0x3bd5c4fe,0x3bb1c334,0x3b0a3307,0x3b252ebe,0x3b9e94eb,0x3c181746,0x3c7e7f50,0x3c7f481f,0x3bebec2d,0xbb21d105,0xbbe905d8,0xbc343fdb,0xbbd23d59,0xbb9751d1,0xbbb455d3,0xbba57138,0xbbe623b2,0xbbffdce8,0xbbd36369,0xbb21655b,0x3b90d481,0x3a771e99,0x3b337c30,0x3b20b8cb,0x3a5a41af, +0x3a8b559a,0x3b3b8488,0x3b74bb4b,0x3b88e40a,0x3ba054f9,0x3bdf9fb6,0x3b291190,0x3b5fa074,0x3c089b62,0x3bd9cda9,0x3b9a070c,0x3b95687b,0x3b580197,0xbb059382,0xbb6af1c5,0xbbbb7279,0xbc1d540a,0xbc54fc13,0xbc4e4a6a,0xbbf25954,0xbc2455ea,0xbc22a5c3,0xbc449712,0xbc1713fc,0xbcbcbe9b, +0xbd19611d,0xbd0dc358,0xbcbd10ef,0xbc80bc3b,0xbc94e505,0xbc809a36,0xbc272023,0xbc35d9db,0xbbfda5ba,0xbbac218e,0xb93fce76,0x3b08edde,0x3b2ca55a,0x3b02e3e5,0x3b09c450,0x3b978aa2,0x3ac20562,0xbad2fce1,0x3b3937c8,0x3bb11a30,0x3b75aba9,0x3b449ccc,0xbac6a489,0xbb855c86,0xbbe58d22, +0xbbbed56d,0xbbd87c28,0xbc2f82ba,0xbb0ed9f7,0xbb859cce,0xbc3f11e5,0xbc944640,0xbcb2b295,0xbcae47ed,0xbcc2ac33,0xbc9283f8,0xbc7bcf37,0xbbf1e41d,0xbb4aab88,0x394cf068,0x3ba4bf70,0x3c0a6718,0x3c0598e8,0x3beef40f,0x3bd166b3,0x3bbc548d,0x3bbf536b,0x3ba5fdb0,0x3b9b9a6e,0x3b88f6a6, +0x3b2c2db1,0x3b1f2f1a,0xb9be3e21,0xba2314cf,0xb9030c2f,0x3b5c0127,0x3b705306,0x3b4bae5b,0xbb2eb778,0xbb9fb768,0xbbde5f5e,0xbba48f5a,0xbb85d3fc,0xbb9dd340,0xbb6b0c7b,0xb9b91983,0x3bb09875,0x3a8fae26,0xbba46f36,0xbc372840,0xbc95b79d,0x3aff8631,0x3bb3590c,0x3ba28ab1,0x3c06c54f, +0x3c37d794,0x3c3aaa3d,0x3c33ffd8,0x3c3f3f77,0x3c29084d,0x3c361f46,0x3c11e105,0x3c254a60,0x3c001dc1,0x3beaae56,0x3b8ceac1,0x3b1c49c7,0xb99039bb,0xbb0f540c,0xbbcd2c56,0xbb86e1f1,0xbb66692b,0xbbf795b1,0xbc12c54b,0xbc27cc34,0xbc345913,0xbc4d0711,0xbc4c5d8d,0xbc57cdec,0xbc5c61c9, +0xbc8018d1,0xbc985c06,0xbcb28258,0xbc996e14,0xbc74599b,0xbc30c589,0xbb913c96,0xbaa9841a,0xba3f1768,0xbaa9c683,0x3a2982d5,0xb9d08d46,0x3955783d,0x3ae42a97,0x3b1644bc,0x3b0f461a,0x3a0c2817,0xbb0f4093,0xbb01fa29,0xbac9d057,0xbb4a40d1,0xbb636f53,0xbb195299,0xbb3b7127,0xbad3c8b1, +0xbb6242f9,0xbab64b3f,0xbb2d734e,0xbb7389c5,0xbb980929,0xbbc4a3fe,0xbbf10564,0xbc10f0f9,0xbc01b5a1,0xbbf5bcd8,0xbbeba70f,0xbbe50ee8,0xbbccb6b2,0xbbd026e8,0xbb8fe65f,0xbb71e700,0xbb4b8997,0xbb2bf5c3,0xbb49eb3a,0xbafebd03,0xbbfb74d6,0xbc120fdd,0xbb9bfd82,0xbbc51c0c,0xbc08cc9c, +0xbbb4abad,0xbbcc5c29,0xbbd3c0c8,0xbbbd1a7f,0xbbdb7a81,0xbbec8b32,0xbbeaf532,0xbc251121,0xbbef7ef9,0xbbe44ad9,0xbc250778,0xbc0222b7,0xbb3624cb,0xbb8b63f4,0xbb93c888,0xbba31d3f,0xbbb0b907,0xbbbac86f,0xbbcef7b0,0xbbc433dc,0xbbc231d0,0xbbbe601d,0xbbba8151,0xbbb9ae8c,0xbbbddfb2, +0xbbaf6094,0xbb9d52ad,0xbb826f93,0xbb683c75,0xbbad020a,0x3bd2ea80,0x3bc201e6,0x3b89800e,0x3c666f8a,0x3c6179e8,0x3b88720e,0x3c480f83,0x3c558179,0x3bca3197,0x3bcf970b,0x3bc7b3e3,0x3b8e305a,0x3ba673f5,0x3b9a3699,0x3b538704,0x3c553d54,0x3c51a56f,0x3b307e3a,0x3c57511e,0x3c68d2ec, +0x3bab3e30,0x3bcca8d8,0x3bd0731a,0x3bc8ce04,0x3bca25ed,0x3bc43821,0x3bb843d2,0x3bb356b8,0x3bb1d1bb,0x3baad07c,0x3bcd31ad,0x3bdaa940,0x3bd2c2b0,0x3bf2ce90,0x3bf0955e,0x3bc4376d,0x3bd103d5,0x3bb95955,0x3c0c676c,0x3c4bc79d,0x3c1a9a2d,0x3c48f823,0x3bfc80af,0x3bd0aa70,0x3be434a0, +0x3bdf26e5,0x3c1d9ac4,0x3c3a9c55,0x3c2bb831,0x3c032b06,0x3c045047,0x3bed9a80,0x3be3b825,0x3c3166d5,0x3c0fdd35,0x3c38e044,0x3c30a51e,0x3bf41384,0x3c129d0f,0x3bfdf7f3,0x3bfa44d5,0x3bd6ed36,0x3ba90ffa,0x3b942324,0x3b99cc54,0x3ba1bdec,0x3c01ec55,0x3c197e67,0x3c0ffeda,0x3c37aff1, +0x3c27fa37,0x3bd162ce,0x3bf108fd,0x3bb46e85,0x3bf704eb,0x3c635cc9,0x3c267355,0x3c45f839,0x3bbeb466,0x3b9bbf1b,0x3bc3c2a8,0x3bf729e1,0x3ba5a67a,0x3c1a8e98,0x3ba0ba74,0x3be82d91,0x3b880668,0x3be1c8c9,0x3bdbcc4a,0x3c014972,0x3c1e3211,0x3c5e6707,0x3c4fa3a6,0x3c089d35,0x3c2485de, +0x3c1061a3,0x3c167e65,0x3bf213c0,0x3bb43f49,0x3b8a71d9,0x3b9613a5,0x3b91fe5a,0x3c1a69c4,0x3c48c7af,0x3c2c0461,0x3c828db9,0x3c6c7e07,0x3bdc5911,0x3c205050,0x3b8bb062,0x3c1053e6,0x3c7c0c61,0x3c6cf1ed,0x3c7c2cde,0x3baf8f8c,0xba2b18fd,0x3b261b3a,0x3b643282,0x3bc30d62,0x3be4fa56, +0x3b840b8a,0x3b0edbfe,0x3a4b2081,0x3b98e59d,0x3b980dbb,0x3c144642,0x3c1c2615,0x3c81aeff,0x3c843e4b,0x3c3ff5cb,0x3c6931b7,0x3c4c005c,0x3c45344e,0x3c12e011,0x3b73f9ce,0x3a64dce6,0x3ade6631,0x3b49534f,0x3c521c25,0x3c883673,0x3c74aa8f,0x3cb31336,0x3c87691a,0x3b7a91f3,0x3bfa3dcc, +0x3c3cdde8,0x3c44ec77,0x3c1dbc5e,0xba5b78d4,0xbc090c66,0x3b79e841,0x3c3299bc,0x3c5f642e,0x3c2cb1e0,0x3b7e63d9,0xbafaa7a5,0x3ab63bf7,0x3b470cd2,0x3b9f28ee,0x3c077c21,0x3bec6491,0x3c05d4cf,0x3bd6435c,0x3c324bc0,0x3c3c1323,0x3b8217d7,0x3b46d971,0xb9dec206,0x3b09dbfd,0x3abd5bdc, +0xbb02ab0d,0x3c14bc02,0x3c0be5ab,0xbba00083,0x3b6b8a09,0x3c045864,0x3c51bbe5,0x3c6504ec,0x3c9ee353,0x3cf45104,0x3caca1aa,0xbc8147aa,0x3aae0fb5,0x3c85d4a1,0x3c344ab0,0x3bfa3778,0x3b4cab88,0xbb24471e,0xbb3ff85d,0x3a447a31,0x3b838ac1,0x3b973246,0x3aff2cf8,0x3ad26e93,0x3b36dd02, +0x3b4b04be,0x3bd23fcb,0x3c189a09,0x3bf9bb5f,0x3c0de01c,0x3bf95cf1,0x3c31fc32,0x3c728ff0,0x3c432108,0x3c0a65a9,0x3bcfcf0d,0x3be20a71,0x3c1ebbba,0x3c070500,0xba9b88af,0x3ba1c10e,0x3bcfbaf2,0x3b491556,0x3b952ae5,0xba696843,0xbc44caee,0xbc43c69f,0xbadae9cf,0xba217776,0xba82bc69, +0xbb5fdf46,0x3a292a40,0xbb9a5dea,0xbbb82cd7,0x3b05a5ac,0xba26c2dd,0xbafe0c1f,0x3a11fa32,0x3aebbb1b,0x3b26d599,0x3abc2e03,0x3b6481eb,0x3bc2c465,0x3ba3be94,0x3b5ce92a,0x3be93ad1,0x3bb0c45b,0x3bc3917d,0x3c07f7a3,0x3b5c9682,0x3c0be539,0x3c275782,0x3c1a3112,0x3c11d7b2,0x3bea5504, +0x3b9ecb72,0x3c071c2c,0x3c8d71e0,0x3cf7ebbc,0x3cee63b0,0x3cd05f8d,0x3c99120b,0x3b962b13,0x3c582bf2,0xbb4c5bf6,0xba424a4a,0xba59ed4f,0xbb9659d5,0xbb872ec6,0xbb2c563c,0x3b8c4958,0x3ab08da7,0x3b367d5d,0x3b5b220c,0x3ab3033c,0x3ab9c3df,0x3b892c02,0x3b92dd89,0x3bd70edb,0x3bea0386, +0x3bec551a,0x3c0fb467,0x3b932614,0x3be8bf52,0x3c2ee1fc,0x3c290a56,0x3c4dbfa3,0x3c376df4,0x3ba48b12,0x3c153ff9,0x3c14fde5,0x3ba78247,0x3b2c84d9,0x3a0d9438,0xbba44186,0x3c7a5d9d,0x3cd1e933,0x3cef6113,0x3cc6ab3e,0x3c594a4a,0x3a0c3274,0xbc6d6e28,0xbc673bab,0xbc3df247,0xbc50d471, +0xbc3ec6ee,0xbbc7f50d,0xbbca3e13,0xbbbfcf0d,0xbb6075df,0xba6fbfbe,0x3ace98d8,0x3b8da50e,0x3b43dded,0x3b45a7d9,0x3b84b062,0x3bb617f0,0x3c048cfb,0x3b97d093,0x3bc53986,0x3bca63dd,0x3b54a8d0,0x3afe7eec,0x3b4d31b7,0x3be4f2b6,0x3c069433,0x3c28b6b9,0x3c4a9f32,0x3c500b63,0x3c27fa51, +0x3b3b5f23,0x3b94000d,0x3bb506f7,0x3b9815dd,0x3c4e796f,0xbc5a7b91,0xbbd118f7,0xbbb2f1b9,0xb9949ba2,0x3ad2ea04,0x3bf2fdd7,0x3bd8fc3e,0x3ba7c631,0x3b4cb0f7,0x3b242375,0x3b02b5ea,0x3bbe86c4,0x3bc5c89e,0x3baca00d,0x3b976fbd,0x3ba5d33f,0x3bc685f4,0x3acca862,0xba07b87c,0x3901850f, +0x3b423e67,0x3b9bf04c,0x3b9e38d2,0x3b8f66cf,0x3b5a4bbf,0x3a68ab4b,0xba895907,0xbb8cce54,0xbbeca732,0xbc0788d8,0xbb442ac2,0x3c10f768,0x3b67dd83,0x37a3a23e,0xbb9d81ac,0xbc2616d6,0xbb03f3c3,0x3b7edcfe,0x3c290dc2,0x3c2ac0cb,0x3c62f242,0x3c4ac382,0x3c322ebc,0x3c2cee34,0x3c3a5f70, +0x3c260739,0x3c4e33ef,0x3c05d730,0x3c0391fd,0x3bbb1d32,0x3ba17230,0x3b3b9310,0x3b018043,0x3ac3af67,0x3b0f4ace,0x3a0ffd0f,0xbb65884d,0xbbb1564c,0xbc06646e,0xbc166b9f,0xbc278737,0xbc3d00a1,0xbc19b9c5,0xbbf1da0f,0xbba373cb,0xbbd67fc8,0xbc1cf51c,0xbc524c96,0xbc4a6f39,0xbc314876, +0xbc2668a6,0xbb945c82,0xba6651a1,0x3aa42285,0x3b08ab6f,0x3a5689a8,0x3b41ea83,0x3b22c741,0x3b3ea85c,0x3b77029b,0x3b333033,0x3b6bd522,0x3b9d725e,0x3b7d92b8,0x3b29d647,0x3b46ee5d,0x3b0c366c,0x39040bc5,0x39510e11,0xbb1b0f14,0xbad18469,0xbbdf49e8,0xbc0a931b,0xbc09d149,0xbc19584b, +0xbc26c4b3,0xbc377406,0xbc4d3b74,0xbc4825fd,0xbc4438d5,0xbc36de64,0xbc2328d4,0xbbfe3fab,0xbbc6fca3,0xbb8c1296,0xbb483fca,0xbb11782f,0xba978023,0xbb6ab12c,0xbb6f29a7,0x3acd757c,0x3b079f65,0xbb2d4867,0x3ab8c6a2,0x3b2ad9ee,0xb9bf8d44,0xba212f41,0xba6fac6f,0xbb0d628d,0xbadf8ef9, +0xbaf2104b,0xbb1a4a01,0x3b2219a5,0x3a2397e1,0xbb3fd440,0x3a55729d,0xb9d9cde3,0xbbe7ff44,0xbbca9bc9,0xbbdfdbab,0xbbf02469,0xbbfe71f5,0xbc058f18,0xbc0f340f,0xbc031e31,0xbbf696dd,0xbbe9faa5,0xbbdbf34d,0xbbd363f6,0xbbc4dce3,0xbbbb6a30,0xbbab25fb,0xbb9635b5,0xbb84f4ce,0xbbbe000d, +0xbb5992e8,0xbb0cfba8,0xbb6101bb,0xbbd480af,0xbacc79fb,0x3c410984,0xbbfe9495,0xbb3ac209,0x3c00af3e,0x3c0a828e,0x3c0f7d57,0x3c1ebdfd,0x3c21e4c0,0x3c252d2a,0x3c2b86a0,0xbb2cba83,0xbbef9695,0x3c4a820a,0xba9ad685,0xbbc19c1f,0xbb484340,0xbb286625,0xbb6854fe,0xbb757b26,0xbb786a26, +0xbb84d976,0xbb95bd00,0xbb93411e,0xbb940258,0xbb970da2,0xbb95aa6c,0xbb97de56,0xbb9cf8a1,0xbb9d4067,0xbb8ca040,0xbb3aca4d,0xbb40d329,0xba9ae40c,0xbba528f1,0x3b592571,0xbb22807a,0xb99edc43,0xba72fbef,0xbb463d7b,0xbafe7788,0xbafb7648,0xbb2c67c0,0xbb38df55,0xbb3d6c9e,0xbad40e56, +0xbb6c9595,0xba415c46,0xba4db56b,0xbb1e59f9,0xba170993,0x3b98b9d0,0xbb52dad0,0xbb35a60e,0xbba67a6c,0xbbc3834e,0xbbc33e40,0xbbcbd869,0xbbf14cfe,0xbbec4776,0xbbf1da6a,0xbbfd69f4,0xbbedc671,0xbbfbd65a,0xbc04f9f5,0xbc0e9f22,0xbbee83a4,0xbb4ae00f,0xbb43f5cd,0x3a144419,0xbb5e3ffc, +0xbb366a8e,0xbad68db1,0x3b662544,0xba67c7ec,0xba5cfa08,0x38a23cdd,0x3ae93c77,0x3b6186ff,0x3a6d3c1f,0x3b29fb30,0x3b21d629,0xbaec52ca,0xb9a76420,0xba623a2a,0x3af52900,0x3ae418f5,0x3a9bfe18,0x3a0ae665,0xbb414fdc,0xbbaec0f3,0xbc041fea,0xbc03bfbf,0xbc1bd808,0xbc471e84,0xbc38d3c0, +0xbc383c03,0xbc3bf970,0xbc3d7f76,0xbc47a499,0xbc4e800a,0xbc5bda6f,0xbc1b4b48,0xbac498fe,0xba9d4db0,0x3b34928f,0xba638e34,0x3b0b081d,0x3b8baa3b,0x3c104a01,0x3a23252f,0xbaace3c0,0x3b24667e,0x3b75974a,0x3bbdeb7f,0x3c077a43,0x3bb09870,0x3b07c646,0x3a724b43,0x3b44cb0d,0x3b39297a, +0x3b9c549d,0x3bc9b56a,0x3bfb3a7b,0x3bb6e7d4,0xbb035b52,0xbc045860,0xbc5a6fb4,0xbc5f2f9d,0xbc764657,0xbc97ea9e,0xbc9163c2,0xbc871609,0xbc7f6ee4,0xbc731117,0xbc8b0de4,0xbc92327b,0xbca0bf22,0xbc6d7d0c,0xbafbcfdd,0xba09383e,0xbb436cc6,0xbbe4d6bc,0xbc1c6aa7,0xbc439d54,0xbc3af5be, +0xba889ccb,0x3bb18330,0x3c1a1dad,0x3c1f0782,0x3b66607a,0xbb05aa9a,0x3a1658ee,0x3b1d8777,0x3b953f72,0x3bd959c2,0x3bad9281,0x3b8661cb,0x38c85497,0xbab85d2f,0xbb9fef57,0xbbf77ced,0xbb2b8ac6,0x3b0267b7,0x3a869d22,0x3b0cb32b,0x3b961d47,0x3c272a60,0x3bbda539,0xbc3f901b,0xbc34b002, +0xbc649ecc,0xbc80a7e4,0xbc59cb3e,0xbbb1e12f,0x3c2d6eaf,0x3af774cc,0xbc273161,0xbc47ce57,0x3b398eb3,0x3bd976a0,0xbb5c66a7,0xb933dd97,0xba8bd68c,0xbb870903,0x391205bd,0x3b4349da,0x3ba876f2,0x3b17247b,0x3aa7754d,0x3b49a782,0x3b10b3be,0x3b76d682,0x3b6f61ec,0x3ba77993,0x3bc42ae8, +0xb9e85293,0xbb351d19,0xbbfbfff2,0xbc8b955c,0xbc371f22,0xbbc1925c,0xbaa0389a,0x3b91f6e5,0x3b8d6076,0xbba1f67c,0x3a39255e,0xbb523fd0,0xbc806657,0xbc8215f4,0xbc819a5a,0xbc51a1ac,0xbc49bf49,0xbbefdb11,0xbba374a2,0xbafb380e,0xbace83ed,0x3a8acee7,0xbb5fff40,0xbbeb6c8d,0x3a8c3d4e, +0xbaada8fa,0xbae6f866,0x391e3ee5,0x3a6c6d3c,0x3afacba6,0x3aea79c2,0x3a7d7897,0x3b192856,0x3a2b6d90,0xbad01e00,0xbb4e4353,0xbb103ad5,0x3bae8288,0x3bc72a5c,0x3a9eba32,0xbb6d4a67,0xbc42f93f,0xbca55745,0xbc935cdb,0xbc3b50e8,0xbba75fbf,0xbaca64ca,0xbbe4d368,0xbca8bc40,0xbcf45cac, +0xbd03435c,0xbcf462af,0xbc58b5de,0xbc8203a2,0xbbc4ce18,0xbaa3bc34,0xbb3f6f1e,0xbb51ffe2,0xbbb5e4ff,0xbb2194a2,0x3b2af6a2,0x3a3f669e,0x3b1c5269,0x3b144b57,0x3a27bf56,0x3a8d4030,0x3b20f94d,0x3b465d80,0x3b948df6,0x3b823928,0x3b976bb8,0x3b9f1fd4,0x3ad0584c,0x39827bee,0xbb1c15cc, +0xbb8d460a,0xbba19452,0xbb8eace3,0xbbaef0b3,0xbbb83339,0xbc11a6c5,0xbc7e7ca1,0xbc71ba5d,0xbc71adb1,0xbc6f7619,0xbcb39dc0,0xbce8b4ea,0xbd1e4ba5,0xbcc6aaff,0xbd040e2a,0xbcb7c083,0xbc61c8b3,0xbc9b2e91,0xbc9a88d6,0xbc6f55b8,0xbc411404,0xbc210d88,0xbc0d423f,0xbbfb1668,0xbbc967b7, +0xbb3a2122,0xb7d73bc5,0x3b3f3d22,0x3b0edf66,0x3b251dfd,0x3b676237,0x3ae5ade8,0x3ab5a851,0xbab53277,0x3b5b201c,0x3ba284d9,0x3b3491a8,0xb9da31a4,0xbb8f5e3b,0xbc1615ac,0xbc2fcde3,0xbc5caf0d,0xbc9982f4,0xbc538a45,0xbc82f212,0xbcd6603d,0xbd096a3f,0xbd14ed0f,0xbd14546b,0xbd09cc03, +0xbcf2270c,0xbce4098d,0xbc6dccff,0xbc542a76,0xbbc6d9bf,0xba846813,0x3a463c48,0xbae0939a,0xbb1942e1,0xbac02f2e,0xb912857b,0x3b73ade9,0x3b979765,0x3b87019c,0x3b0bc04f,0x3a163d71,0x3928afa8,0xb908b40f,0x39983239,0x3acf1f6b,0x3b3d761c,0x3ab1c17b,0xba7b5c3f,0xbb93f468,0xbbdb56a3, +0xbbf9ee9f,0xbbf5e6ec,0xbbc1d662,0xbb3013b5,0xbbff5811,0xbc11fa56,0xbbfa68d6,0xbb8dde35,0xbbeaa8bb,0xbc7228bd,0xbcc0d4f5,0xbc2487f1,0xbbd7c9ce,0xbb619c26,0xbb198e3b,0x3b2634c0,0x3b2a335c,0x3b5af95b,0x3b93f3e1,0x3bd48fad,0x3bde536f,0x3c0477db,0x3bb80b77,0x3bc3b254,0x3b74a345, +0x3b47ee19,0x3a8bc031,0x390d9ce3,0xbaaccf53,0xbb5f83f4,0xbb9b2c45,0xbbad829b,0xbbc7c6c1,0xbbcfeed9,0xbbf0f3b5,0xbc079c01,0xbc1b16b4,0xbc30bbdf,0xbc508ced,0xbc629229,0xbc81d2e0,0xbc8f2122,0xbca6f089,0xbca2814c,0xbc9ab88e,0xbc8d14a9,0xbc55c9b7,0xbbc89d10,0xbbaf73f2,0x3aa6e4ff, +0xbb494b86,0xbadded39,0xba76b03a,0xbacababe,0xba6029bb,0xbb17d218,0xbb7d5fa2,0xbb81bf39,0xbbaff50b,0xbb9f0f77,0xbbb29cb6,0xbb9a93e1,0xbb9e6125,0xbbf58dd2,0xbbde8448,0xbbcd0889,0xbbf8248b,0xbbec9488,0xbc0e2020,0xbc1b89aa,0xbc2d0b89,0xbc3bc208,0xbc4ac549,0xbc4b988a,0xbc5298f8, +0xbc62eaed,0xbc702223,0xbc7e738f,0xbc886f57,0xbc615b68,0xbc3ed375,0xbc21962e,0xbc07e355,0xbc0e10bc,0xbc0b42d0,0xbc249833,0xbbe78e72,0x39caf96e,0xbc2907bd,0xbbe5afce,0xb9e3ac27,0xba01eff0,0xb9819e0b,0xb79a6aa9,0x399174c5,0x39c259d8,0x3a3d4952,0xbc0b81e6,0xbc38143b,0xba48dcdb, +0xbc117179,0xbc361095,0xbc0daa93,0xbc168f38,0xbc1ec002,0xbc22abe7,0xbc28592c,0xbc2d5040,0xbc33fa52,0xbc397874,0xbc3e9c45,0xbc411139,0xbc457276,0xbc48be28,0xbc550d5e,0xbc449198,0xbc39fe0c,0xbc2a89fc,0xbc20549f,0xbc44dd8d,0x3c3a2dca,0x3c23d1fe,0x3c4c09de,0x3c180e66,0x3ac9fbce, +0xbc232a53,0x3c3f4471,0x3b3e4cdc,0xbc0431a7,0xbc0687e5,0xbc06b833,0xbc084466,0xbc12f33f,0xbc18d569,0xbc291f12,0x3b24bd8c,0x3c304077,0xbc360c2b,0x3b069ea2,0x3c159807,0x3c4d51e8,0x3c28f5ee,0x3c39b9c3,0x3c3906d9,0x3c3b75fe,0x3c39eb6e,0x3c34284a,0x3c320dfd,0x3c3289fb,0x3c3564b3, +0x3c3c3444,0x3c410100,0x3c42f395,0x3c4751fe,0x3c3fbb46,0x3c1e2621,0x3c324ffe,0x3c2d4ebd,0x3c58dc07,0xb9b5d379,0x3c3b3712,0x3bec8afd,0x3b8ffcd6,0x3be772a6,0x3bc29176,0x3c1e426e,0x3c32f925,0x3c0abc17,0x3c3bdaf9,0x3c1cc10e,0x3c01e7be,0x3b90b3d3,0x3bb485ec,0x3c181fca,0x3c0d53e2, +0x398a83fa,0x3c5b030d,0x3c528d62,0x3c62f39d,0x3c688f5c,0x3c6fab6a,0x3c6825d1,0x3c50d75e,0x3c47fabc,0x3c48ad41,0x3c582b3a,0x3c6cec8a,0x3c7637c1,0x3c72f132,0x3c77481e,0x3c5b91e7,0x3c0afdc3,0x3c303dac,0x3c48c7e5,0x3c3a352c,0x3c0b1410,0x3c04c63d,0x3bbdf333,0x3b7ba733,0x3b594fc4, +0x3b8ff4b8,0x3b9ee61a,0x3be15535,0x3bba4ac4,0x3c156a14,0x3ba76a37,0x3b9d6c8e,0x3b5cb8e9,0x3bbf52ba,0x3bf18cf8,0x3bf5248f,0x3c02d34d,0x3c3fc571,0x3c73c526,0x3c7b603d,0x3c860613,0x3c8d4587,0x3c860e4b,0x3c67e01e,0x3c5de9a5,0x3c65001c,0x3c80d4c7,0x3c8dbfde,0x3c9bf676,0x3c9b74c8, +0x3ca1eb64,0x3c87a1e9,0x3bf050bb,0x3c4b5b6a,0x3c2a29a8,0x3c264756,0x3c1c1f9d,0x3c5091f5,0x3c2f87ee,0x3b8fbceb,0x3a3997d4,0x3aa9bb0b,0x3b8b728f,0x3bcdb0d6,0x3be65176,0x3ba6a693,0x3b81ce51,0x3a804e15,0x3b9ad1ab,0x3bca9120,0x3bde528c,0x3c27dfdf,0x3c183a88,0x3c6855bc,0x3c932cdf, +0x3c9d8780,0x3cae3f28,0x3cb93329,0x3cb05704,0x3c83da42,0x3c69da2a,0x3c71ea84,0x3c99d238,0x3cbc0db4,0x3cbddf62,0x3cb7e0aa,0x3cafd4e6,0x3c70a203,0x3abd6a89,0x3bfa5356,0x3cdee1e2,0x3c5ed93b,0x3ab93945,0xbb9a16b3,0xbc332456,0xba5a663d,0x3bed04c0,0x3c2c451d,0x3c489f30,0x3bdb1407, +0xba8b0f52,0x3a84d6ff,0x3b32bf50,0x3bc24dfa,0x3bfd7182,0x3bfa2a03,0x3bc8ba23,0x3bf5ab81,0x3b8e39f8,0x3bfbe868,0x3c72878b,0x3c489055,0x3c50b96c,0x3c169df4,0x3c080a99,0x3bd68fe8,0x3c9f9a3f,0x3ca52cba,0x3c1c4c52,0x3c4952f3,0x3c8ccb4e,0x3cdc4b8d,0x3cd0cae0,0x3ce189ac,0x3d07e6c1, +0x3cec9c0e,0xbbaa4a50,0xbc08215e,0x3c859646,0x3c9a49eb,0x3bc2a1fc,0x3bc06485,0x3ae70a17,0xbb461754,0x3a6b1c93,0x3b86c053,0x3bd7e7c9,0x3b416309,0x3aeff0b8,0x3b76838d,0x3bbac0ec,0x3c0d4288,0x3bf71723,0x3bd273f0,0x3b6e1f07,0x3bcb2f30,0x3c8d7fdc,0x3ca01f6f,0x3caca662,0x3c81465e, +0x3c4afbf2,0x3c26d41e,0x3bee7176,0x3ba65f3d,0xbab81f58,0x3c11782d,0x3bae5112,0xbc5671ec,0xbb4ab7c4,0xbb0b2879,0xbc1a47d6,0xbbad3f71,0x39960a96,0xba414c7b,0xbb904ad6,0xbb1feb4c,0x3b09ff42,0x3a330da7,0xbb70e475,0x3b5405af,0x3a8ed7ca,0xb982e2a9,0x3ac58268,0x3b0e5353,0x3b3b07a2, +0x3b1dcae6,0x3b13a8d0,0x3bac1a44,0x3ad8e33f,0x3b5ec73e,0x3b930277,0x3ba99364,0x3c1bec0b,0x3bfe4d38,0x3b9b31cc,0x3c633375,0x3ca150a1,0x3cba1bb5,0x3cd246ef,0x3cc876f5,0x3c83180e,0x3cbd608d,0x3d088827,0x3d2ee4b0,0x3d2418a4,0x3d063877,0x3cefd0a3,0x3bffce6c,0x3c850caf,0xbb32528b, +0x3a9b7f33,0x3bb49ac2,0xbb1a19d0,0x39ed5390,0xba57205d,0x3b4845da,0x3a8bb873,0x3b06a5ac,0x3b3198eb,0x3ac1123d,0x3ad52e3a,0x3b6b2d41,0x3b938d08,0x3bc62504,0x3bc350c6,0x3bce406c,0x3b9808d5,0x3b9a7522,0x3c32c90d,0x3c6f2eef,0x3c83ea4c,0x3c6e4ba5,0x3c3d9ce3,0x3be59935,0x3c0581d2, +0x3ba701c4,0xbb0bd5fe,0xba564789,0x3a3bc687,0x3b88e62b,0x3cc6f9d8,0x3d15f0e6,0x3d38cc01,0x3cdb2e0b,0x3cd4d52e,0x3bd3101e,0xbc933d51,0xbc79c1e5,0xbc7b9797,0xbc4ff6f3,0xbc120588,0xbbb991f1,0xbbb04c42,0xbb6b9ef9,0xbb63c491,0xbb07531f,0x39c1ab3e,0x3b9d0e00,0x3b3e1eec,0x3b432562, +0x3b77ee86,0x3bc576ef,0x3b9f325e,0x3b89adaf,0x3bbe942e,0x3bab9c03,0x3bbe4e04,0x3bb418c5,0x3be33898,0x3c261717,0x3c3e418e,0x3c490947,0x3c5c2841,0x3c521ca7,0x3c5fbe93,0x3c6c178a,0x3c800167,0x3c85e2e7,0x3c9a25cc,0x3cbc9961,0xbbf83365,0xbc3d95c5,0xbca9a8cf,0xbc326918,0xbbe3a343, +0x394ddc4d,0x3a867d0c,0xbb4753fe,0xbb1ec223,0xbb08982e,0xb96fdbdb,0x3b725e2d,0x3bb2f42a,0x3ba115af,0x3b777c3b,0x3b6498c9,0x3b73c10b,0x3ae5ebd2,0x3ae2e211,0x3acab93d,0x3be8fd9f,0x3c18d7ff,0x3bfdf236,0x3c084cdb,0x3bd2a353,0x3ba114c6,0x3b13c1a3,0xba0ee978,0xbb0cd2cf,0xbb7f45aa, +0x397c371a,0x3c354fb4,0x3c38902c,0x3c168a4c,0x3b2b0ed1,0xbb8ebe23,0xbae52538,0xbb258f29,0xba3bdcff,0x3ac0c3a8,0x3ae72673,0x3b1200f4,0x3b15867d,0x3b762d77,0x3b952adf,0x3bcccd82,0x3bfc37ad,0x3bd0e9d5,0x3b829d50,0x3b7739a9,0x3b1e0d00,0x3b041591,0x3a5235b0,0x3a0bc3c5,0x39b6e43c, +0x3a991176,0x3a484a4d,0xba4d0086,0xbac30b8e,0xbb253c83,0xbb67687e,0xbba1efc9,0xbb31a9bd,0xba514d35,0x3aa3ee1e,0x3b0fcdfe,0x3b10b6a3,0x3b069e55,0xba7a85ac,0xbb2c9235,0xbb76e9c6,0xbb403008,0xb92d387f,0x3aaddacb,0xbb93a9fb,0x3a8c9392,0x3a0e4396,0x39ff2db3,0x3b3d2cb0,0x3b4caa9f, +0x3b7918e9,0x3b76f2f3,0x3b2370fc,0x3b6c3482,0x3b53adb8,0x3b418160,0x37315b9a,0xba95d4e4,0xb9b46c02,0xbb1d0f16,0xbbd35c0f,0xbbaad687,0xbbee4896,0xbbfad85b,0xbc0b9b2c,0xbc1c100f,0xbc2891f0,0xbc3d2ae0,0xbc20e479,0xbc0c6e13,0xbbed809a,0xbbbf13c2,0xbb87df5a,0xbb0b985a,0xbaae365e, +0xba226c6d,0xb9dbd1cd,0xb91c4a78,0xbb041be7,0xba5e9020,0xbb038bd1,0xbbb4f47b,0xbc40711f,0x3905af0b,0xbb90b625,0xbc229698,0xbc2e60da,0xbc34c97a,0xbc3bea45,0xbc4644a9,0xbc5086db,0xbc560a19,0xbba246f0,0xba5598b8,0xbc5ac393,0xbbcba451,0xbb464bd0,0xbb4c4b54,0xbb80b10b,0xbb861cc9, +0xbb976f9c,0xbba0e60d,0xbbab43bd,0xbbbfe583,0xbba666aa,0xbb969223,0xbb83afca,0xbb61a0df,0xbb422f74,0xbb1c2e2f,0xbb255c2e,0xbb1c5835,0xbb0c8c95,0xbaf25ac3,0xbb5b7395,0xbbaa63d3,0xbb71ce67,0xbc072cd1,0x3a43515a,0x3c1d3f15,0x3c96b3e3,0xbb60990a,0x3bf28116,0x3c87bcc0,0x3c90af49, +0x3c91c472,0x3c88ceda,0x3c9691fb,0x3c97423f,0x3c917b2b,0x3bffb397,0xbaf8450a,0x3c9f29da,0x3c14675c,0x3aa3a137,0xbbfd2c94,0xbb915e93,0xbbb84b5b,0xbbbc011c,0xbbbaffe1,0xbbbbe6c1,0xbbbc3cf8,0xbbbde7af,0xbbc0ed20,0xbbc1d12c,0xbbcdbbd1,0xbbd08daa,0xbbd0a185,0xbbc7d04a,0xbbb6a392, +0xbb8e2ba5,0xbb96cfda,0xbb8ba85b,0xbbd903aa,0x3c52264b,0xbb55f1bc,0x3b44fcae,0x3b1d9d86,0xbaea3579,0xba2430c9,0xbb2e16eb,0xbabd221d,0x3ad6f7d2,0xb9aae7d9,0xb9b6cfb1,0xbab4ac82,0x3b1991b0,0x3a99fa25,0x3aa96c49,0x397586ee,0x3c44cef9,0xbb9dd417,0xbbcf2d66,0xbbdf19d0,0xbc03439b, +0xbc010ba4,0xbc02b20e,0xbc02f86b,0xbc00dea4,0xbc009222,0xbbfa52db,0xbc089a31,0xbc0f4803,0xbc0b5c91,0xbc06ca2e,0xbbe07864,0xbb807ddd,0xbb82c6a0,0xbb60a0c6,0xbba3bcfb,0x3b1cb231,0xb9ad21db,0x3b95ed97,0x3a825b8a,0x3a96d356,0x39ec981f,0x3b8e84c7,0x3b189b50,0x3b8b8f49,0x3aad88dd, +0x3bccf555,0xbab37d18,0x3b47798c,0x39acec17,0x3b6fbc71,0x3b319fcb,0x3b9a4041,0xba9b749c,0xbc07a4fb,0xbbfa4463,0xbc28a310,0xbc1f6457,0xbc25c7b2,0xbc23526b,0xbc21c145,0xbc27bc1e,0xbc25ff4b,0xbc4a5e6a,0xbc527232,0xbc4a8eb3,0xbc32f494,0xbc01a812,0xbb46c844,0xbafc393f,0xbb800a5c, +0xbb26fcf7,0x3baa91f6,0x3b1315eb,0x3ba54f5c,0x39c79484,0xbab50e5e,0x390e5d47,0x3b0fcb3b,0x3ba8fda0,0x3ba1270a,0x3bcf8eb4,0x3b356b67,0xbaedb05a,0x3aa76288,0x3a0158ef,0x3bf8927f,0x3b4852b8,0x3c17cf1e,0x3aaa8006,0xbc103c2c,0xbc22bbfc,0xbc72221c,0xbc69990f,0xbc6d6f71,0xbc71ec04, +0xbc622a17,0xbc53addb,0xbc37bd61,0xbc57ff16,0xbc77bea7,0xbc6d9983,0xbc569872,0xbc1310c4,0xbb269cc9,0xb9ca3545,0xbbf91927,0xbb1ccb30,0x39d9036b,0xbbde5000,0xbbd5ca3b,0x3a012454,0x3b71416c,0x3bf6e507,0x3c3ba8c6,0x3bd4f5ac,0xba4db82a,0xb940e6bf,0x3ad8391f,0x3bdd3c0e,0x3bd4c799, +0x3b79cdb0,0x3b9fe0ec,0xbb0f6a3f,0x3ad9cea6,0xbb6b1926,0xbc4ba2d4,0xbbcb5224,0xbbce5401,0xbb0385e2,0xbae6d4fe,0xbabb3f87,0xbaaf6b47,0xbc005199,0xbca9ed79,0xbcb112c9,0xbcacd64e,0xbc6c1747,0xbc4f02cc,0xbc0373ee,0x3ad12af8,0xba8a5b84,0xbc96611c,0xbcc788e7,0x3c359d03,0x3c6c70bf, +0xbb89dd6c,0x3b38b931,0x3a1dbe39,0xbb6b3488,0xb93dd4c3,0x3b45f9e9,0x3bd29868,0x3b46e36c,0x3ad91b77,0x3b21bd9a,0x3b3f616c,0x3badab57,0x3b8dbfa5,0x3b8ff0c1,0x3bf745c3,0x390a04cc,0xbb6d70cf,0xbbb075ae,0xbc77dddd,0xbc127fd9,0xbb69746f,0x3b2d2a60,0x3ba3a5a7,0x3b59a253,0xbbcc604b, +0x3b4da975,0xba8fd9c7,0xbc91a404,0xbc40761b,0xbc15c4fb,0xbc147e15,0xbc36dc87,0xbba297e3,0xbbc394df,0xbad1c42c,0xbb4803e1,0x3b96e63f,0x3abcfba1,0xba1fb8d9,0x3b0fb0e5,0x3a670f38,0xba965729,0x3a5d776f,0x39c6c09a,0x3ac62b61,0x3b11f944,0x3a0e7056,0x388dd905,0xb7f2a24b,0xbb64054a, +0xbac525bb,0xbb6f7976,0xbadb38ac,0x3b241a62,0xba2e4060,0xbc10924e,0xbc917ed6,0xbcb383fb,0xbcac1236,0xbc80dc85,0xbc3a383e,0xbc2de284,0xbc7728fc,0xbca8bacb,0xbcd47a54,0xbccf567b,0xbc936276,0xbbf95cac,0xbc320d3d,0x3aadb66c,0x3b3a3ba0,0x3a1d0610,0xb92322ac,0xbb37a924,0xbaebf94c, +0xba61ac60,0xb99a76fe,0x3a8cda45,0x3afe48d8,0x39bb1567,0x3a72da8a,0x3b036923,0x3b3194f6,0x3b998ae2,0x3b1d31a2,0x3afe60fc,0x3bb831d8,0x3a018f69,0xbb6d5508,0xbb9e0d1a,0xbbd332f7,0xbbc2bd8a,0xbb85f9f5,0xbad54c83,0xbaeed38c,0xbba52d14,0xbc41c7cd,0xbc09ad6b,0xbc1c1ad4,0xbc523294, +0xbc89e0df,0xbcad0cf4,0xbcdba5ed,0xbc852178,0xbcc35578,0xbc0642ed,0x3a087915,0xbc4cb8c5,0xbc92eb59,0xbc36a592,0xbc13507d,0xbbf73c9d,0xbb91f83a,0xbbad607f,0xbb8f48dc,0xbb71315f,0xba8f9fce,0x3b545a43,0x3b0a8f2a,0x3b14da76,0x3a9ec046,0x3b392043,0x3bacf458,0xbab58a6e,0x3ab5cd89, +0x3b982b01,0x3b9095df,0x3b755f77,0x391543b8,0xbbb0e375,0xbbc5c9d5,0xbc184cf2,0xbc7e5bf5,0xbc694ba8,0xbc80b924,0xbca49fbf,0xbccaae3a,0xbcd60bc9,0xbcd4180a,0xbcb6f56b,0xbccd3046,0xbcb63563,0xbc458cef,0xbc4d75d5,0xbbaa53b4,0xbb6281c2,0xbb91ebb0,0xbbd48347,0xbbf66cf7,0xbbc0d67b, +0xbb749b26,0x3a307ff1,0x3b0aa15e,0x3b30639a,0x3a56c771,0x39eadb79,0x39914b7b,0x3af9b5c0,0x3b0a450d,0x3b279dea,0x3acce036,0xb97fb97e,0xbb00a69b,0xbb497b16,0xbb8aab51,0xbb9c6604,0xbbc83c29,0xbbac7a75,0xbb02c8af,0xbbc39bde,0xbc4139f2,0xbca75dd0,0xbc5c114a,0xbc415578,0xbc81c9a0, +0xbc9e2230,0xbc73dc76,0xbc42d07e,0xbbc47ed4,0xbbe75f7e,0xbb1bcfb1,0xbb3260b0,0xbad687cb,0xba7700f9,0x3b42ec51,0x3b300e1b,0x3bd9afe2,0x3b110ab5,0x3b948fc1,0x3b14e65d,0x3b17f149,0x395d1aaa,0xb95c854b,0xbaaedce8,0xbacc2508,0xbbab76e7,0xbbbbd480,0xbb5ab02e,0xbb114415,0xbb3eb559, +0xbb83a18f,0xbba31b22,0xbbd651fb,0xbc07cc69,0xbc1f0e96,0xbc2ae1b1,0xbc1e06e7,0xbc2808f8,0xbc3c4073,0xbc5aea99,0xbc6e390b,0xbc5f674e,0xbbed3bd1,0xbbc7fc52,0x3b5661d0,0xbb7493a2,0xb9c468b6,0x392a4ba2,0xbac8b1bc,0xb9d64c5d,0xbb3ae08d,0xbb5b51ff,0xbabecbe6,0xbb6ba288,0xbb787028, +0xbb5ccec0,0xbb1f508a,0xbb60ecd4,0xbbbefb69,0xbbc805d2,0xbb852821,0xbbe8bbd2,0xbbd7b05b,0xbc03e6b2,0xbc1129a8,0xbc1e681f,0xbc267dc0,0xbc2e531f,0xbc3cadc2,0xbc4d32a9,0xbc638533,0xbc776499,0xbc8a691c,0xbc95f409,0xbc8411ee,0xbc5e922d,0xbc3b3442,0xbc17fb1f,0xbc1ab644,0xbc25e958, +0xbbd6b2a2,0xbafdc3f1,0x3b3eabc6,0xbc028536,0xbb04fb55,0x3b5a6777,0x3b6ef07f,0x3b80742a,0x3b56c035,0x3b8af141,0x3b9403d9,0x3b956564,0xbb2ab9ab,0xbc02e62b,0x3b342c8e,0xbb56cb1f,0xbbf779e0,0xbc1d1e48,0xbc17a4cd,0xbc1fc52f,0xbc2205a0,0xbc257c5f,0xbc29d2fb,0xbc2d5cf5,0xbc365463, +0xbc3ccd21,0xbc41d13f,0xbc484771,0xbc4c2eb2,0xbc5aaee8,0xbc478c17,0xbc3f6b97,0xbc35144a,0xbc2cd654,0xbc4827aa,0x3c0c14cb,0x3bf7aabe,0x3c38f0c9,0xb9973683,0xbc01d5d2,0xbc34a012,0x3b67c25b,0xbbc8f8d5,0xbc3954d9,0xbc3bdc21,0xbc371a29,0xbc1ee2cd,0xbc31cd01,0xbc33af5d,0xbc3698d1, +0xbbd42008,0x3b0d4a03,0xbc36c0a1,0xbbdcaa05,0xb9cbfe2c,0x3c30d58d,0x3bf71614,0x3c0a1a4a,0x3c0d10a4,0x3c0e9e24,0x3c0dbc8b,0x3c086113,0x3c072a70,0x3c080754,0x3c0ecfa7,0x3c0aa3b2,0x3c0b2b62,0x3c0fbec6,0x3c07aff7,0x3c00ff17,0x3bddaa3e,0x3c037a6b,0x3c096eac,0x3c05716f,0xbc07c10e, +0x3bd5da20,0x3a0a8aed,0x386827e0,0x3b68f0f7,0x3b0baf5e,0x3bda1a1d,0x3bc55408,0x3b00008d,0x3bd0b2d3,0x3bca0d34,0x3b598ca6,0x39eb7a9f,0x3afe7fba,0x3b5c63c6,0x3b939fde,0xbbc35bf0,0x3bfbea86,0x3c1bde66,0x3c14a11a,0x3c2b87bc,0x3c326ddf,0x3c335f1f,0x3c221dd2,0x3c1de7a2,0x3c1d41b4, +0x3c2fcd9b,0x3c27288a,0x3c1f4e5f,0x3c1f1dd5,0x3c002f90,0x3bdb617c,0x3b999429,0x3be23157,0x3c374b23,0x3bf48e3f,0xb9b6ad73,0x3b0ebc5d,0xb86a6330,0x39f8133d,0x3a4cfbdb,0x3aef00b1,0x3ac17848,0x3bceca5c,0x3ab8e118,0x3c1c610c,0x3b4e7613,0x3b497a89,0xb99a6e20,0x3b27f34f,0x3b95d45b, +0x3b53ca63,0x3a1ad559,0x3ba843ca,0x3c35462f,0x3c20f42e,0x3c43d085,0x3c4cc540,0x3c4aa871,0x3c25ffc8,0x3c28550b,0x3c29e6e7,0x3c57f763,0x3c3a3dd3,0x3c38b44f,0x3c4a209d,0x3c0b503c,0x3bd4f0cc,0x3b56dd73,0x3bf7f39a,0x3c17a2f1,0x3b99a29d,0x38b4eacb,0x3bc5f02f,0x3bb7596b,0x3b0bfa03, +0x3aaa3ba0,0x3a40fba9,0x3b81ab37,0x3bb05a2b,0x3bd57ec4,0x3bd01d48,0x3ba55e19,0x3a8a1646,0x3b6b2db9,0x3bc16655,0x3ba17609,0x3c057bbb,0x3b093111,0x3bcf4f2a,0x3c42b76d,0x3c296acc,0x3c67053b,0x3c7c5d42,0x3c7d1b3f,0x3c3d42fe,0x3c390bed,0x3c46c5a6,0x3c8dfaa5,0x3c77c69c,0x3c4575c5, +0x3c4283f0,0x3b86d575,0x39d9c45a,0xbb2d8722,0x3b2f9b10,0x3cd3203e,0x3be5d53d,0xbc169ee6,0xbc3b5bd2,0xbc64f612,0xbb991f94,0x3b56b4d2,0x3bbcd8c5,0x3c423752,0x3c0a719f,0x3a1e369d,0x39ea2a80,0x3b13a08f,0x3bdec8fd,0x3bc6e3dc,0x3bca55fb,0x3b719a4d,0x3b9d6384,0xbb24f5b7,0x3a7dbdc1, +0x3c65f336,0x3c4bb457,0x3c899bba,0x3c24494c,0x3c2e1c88,0x3c5a51c2,0x3c9d5a82,0x3c896530,0x3c005b5b,0x3c0609fd,0x3c3a7198,0x3c9e7b5e,0x3c94e165,0x3ca00690,0x3cbeb1e1,0x3cb10bc8,0x39e3c3b5,0xbc865ee5,0x3c29e247,0x3c9f5eda,0x3afd99d8,0x3bb86220,0x3b6a2e8b,0xbafe826b,0x3a91dae7, +0x3b675464,0x3bf04c8b,0x3b874b19,0x3b29490f,0x3b8793ab,0x3bdb847d,0x3c0b336a,0x3b6f00f4,0x3b8d1c6d,0x3a33954f,0x3b64a78b,0x3c54268a,0x3c42772e,0x3c724e8e,0x3c454064,0x3c2224d5,0x3be15ab7,0x3b885acb,0x3b365384,0xbaba2d6b,0x3c1ed9ec,0x3b6f38d5,0xbc8c4abc,0xbc287db8,0xbbe5ac0a, +0xbbc91b0a,0xbb235cc5,0x3adb616d,0xbb8df6a1,0xbc021ab4,0xbb7e3ce9,0xb9810e6c,0x3b762a41,0xb7ebd0ee,0x3b4450d2,0x3b034327,0x3aa13591,0x3afa19fe,0x3b03e5cd,0x3b3da4e6,0x3b3105b7,0x3a0719a7,0x3b0fcbce,0xbb1fdae6,0x39fab2af,0xba88b945,0x3aa6c40a,0x3bf859a0,0x3b9363c6,0x3b8eb55a, +0x3c0777b7,0x3c405242,0x3c64adec,0x3ca337b5,0x3cb49e0d,0x3c74dd60,0x3cc19b3d,0x3cda3360,0x3cc1caef,0x3c9ac3d5,0x3c5cdfb0,0x3c897ae4,0x3bbcd75c,0x3bf0d990,0x3aefa7b1,0x3b5aa271,0x3bc6f6f0,0xba2f7d28,0x3ae053bf,0xb94d85dc,0xb933efc4,0xb885ce3e,0x3a4923ba,0x3ad7330a,0x3a97803f, +0x3ab9bd0a,0x3b0b9765,0x3b6d0817,0x3b88b763,0x3b2b1ab7,0x3b5d9565,0xb721ff18,0x3b46bfcb,0x3c0e59bb,0x3c1de6f8,0x3c322a39,0x3c06dc76,0x3bb2371c,0x3b3437c3,0x3ad321ea,0xbb4dd14c,0xbc40d649,0xbbf9a4fd,0xbb94e761,0x3b787767,0x3c219026,0x3c881633,0x3cc65331,0x3c11b22b,0x3c16793f, +0xbbe23061,0xbca18e3d,0xbc8710c8,0xbc9ac355,0xbc7059c6,0xbc1d1587,0xbbd99d64,0xbba55755,0xbb141eee,0xbb436070,0xbb276664,0xba0e8dc2,0x3b5fe790,0x3b0b5379,0x3b0a1719,0x3adbefc9,0x3b6e0cb9,0x3a35c402,0x3b403e95,0x3b5b3522,0x3b361f38,0x3be5eda1,0x3b9df61e,0x3b8bcb1b,0x3b5c10df, +0x3b366dcd,0x3adcb91a,0x3a5e98c5,0x3aaaa5f7,0x3b592bfc,0x3c0c614e,0x3bc948e3,0x3b9f073c,0x3c04b8e3,0x3bf908f5,0xbbf232de,0xbc7b6255,0xbcb989a4,0xbc7067df,0xbc132d35,0xbbbaa866,0xbb864df6,0xbbf44cef,0xbbc73b95,0xbba81331,0xbb0422a8,0xb9ceb051,0x3add2327,0x3b5f43b3,0x3b0584de, +0x3abc4a84,0x3a92e686,0x3b14bc1c,0x3b5dced3,0x3b318af9,0x3bd6d275,0x3bf8fbe4,0x3bf4b934,0x3ba7f89e,0x3b613f7d,0x3adf225d,0x3a3b6d5b,0x39a65a84,0x39223a64,0x39f5abf9,0xb8412b97,0xb9855863,0x3ab4bde5,0x3aa46bf8,0xba9939cc,0xbbd3d2a1,0xbbbbe7dd,0xbc21fb27,0xbc31a6ad,0xbc05687d, +0xbc0bd13d,0xbbcffd59,0xbb92c157,0xbafb2878,0xba838da3,0x3b076dd8,0x3b1aa929,0x3b84bdfb,0x3ae0da21,0x3b4b58df,0x3a56f930,0x3a45c149,0xba996c9a,0xbae599d5,0xbb6817eb,0xba6056fb,0x3b3d8b89,0x3b2395db,0x3b8cfc6e,0x3b422639,0x3b031768,0x3a18c22d,0x3a8a4850,0x3a89668e,0x3a68d13e, +0x3b1d87d2,0x3b87ef8d,0x3bc54c68,0x3b19ccf5,0xba99c346,0xbb5883f6,0xbbb8f967,0xbb07952d,0xbad0b513,0xbbe17f39,0xb9ead940,0xbb0384a3,0xbad4c35a,0x3a4b6a59,0x3a887d70,0x3b08ea8c,0x3aa5f05e,0xba980884,0x3a3d2936,0x3ac23ae3,0x3a6e1e91,0xbaead3ff,0xbac59c0a,0xba6469a1,0xba86d9bf, +0xbbc46fb4,0xbaa7649c,0xbb369114,0xbb6f9679,0xbb898b0e,0xbba7062d,0xbbb5fd72,0xbbcc6b02,0xbba43cff,0xbb8c9eb4,0xbb7eff96,0xbb78a843,0xbb879675,0xbb814cb1,0xbb709b91,0xbb43a8df,0xbb34cfb8,0xbb25c6ca,0xbaf26272,0xb9c574b3,0xbbceeff7,0xbc284bf6,0xbc4e6aa2,0xbb629ec7,0xbc16f958, +0xbc45574a,0xbc4f342f,0xbc525b66,0xbc4ac277,0xbc5c9d45,0xbc683211,0xbc68b7e5,0xbc1eddef,0xbb73823b,0xbc6a9e4d,0xbc264ff3,0xbbbc3e25,0xb9963d3e,0xbb014b74,0xbae4e334,0xbb07d70b,0xbb085e8a,0xbb0d9807,0xbb2162f8,0xbb17ed95,0xbb15f36b,0xbb0a0676,0xbafbd68b,0xbadec50b,0xbadd7932, +0xbadb1ee3,0xbae0f7a9,0xbad87494,0xbad14b76,0xbaef261f,0xb9cd343b,0x38f261c2,0xbb713ccb,0x3c0b0cbc,0x3c5c9877,0x3c3b9829,0x3ba66fe9,0x3c472097,0x3c4da20f,0x3c5a9ffe,0x3c5a1063,0x3c3a550d,0x3c576a56,0x3c54cbe9,0x3c3c3a07,0x3c4ad16a,0x3bccb428,0x3c42b4c8,0x3c4f73b7,0x3c0d7fce, +0xbb54750b,0xb9a2fd31,0xba436631,0xba2f6769,0xba220dc8,0xba0c09c7,0xb9b7c5ae,0xba196771,0xba340b8f,0xba064664,0xba4f0547,0xba42e7a0,0xba1fa471,0xb998aa1b,0xb949b5fd,0xb9d10610,0xb9635062,0xba9a36f5,0xba2c1f4a,0x3c51aeac,0x3aa6cb6d,0x3bd6dd5c,0x3baeabc9,0x3b21e1fa,0x3b3a816f, +0x3ab0325d,0x3b719435,0x3be4382a,0x3bb7e603,0x3b87b96d,0x3b723e1b,0x3ba57be7,0x3b8048d9,0x3bcca6e1,0x3b6858da,0x3c3c8a8e,0x3a25d0b6,0xbae3d6c4,0xb9d24de0,0xba76fd74,0xba64ac38,0xba947fab,0xba6846be,0xbaa541e3,0xba81c7aa,0x3910eeb7,0xba0e1067,0xb9efbbbc,0xb60c29ae,0x3a0c51dd, +0x3a07ed05,0xb9cb69c1,0x39d67ae4,0xba92e7c8,0xb8e55d51,0x3bf76ebe,0x3b64be24,0x3bb61c40,0x3b67b5d2,0x3b6cbb0d,0x3b279124,0x3bc484a8,0x3b485f3e,0x3be8bf67,0x3b676931,0x3c098fd2,0x3af205cb,0x3bb49570,0x3b4cd317,0x3bb3bbd8,0x3b98a3a3,0x3bf31124,0x3afe35fc,0xbb5a8a50,0xba4430bb, +0xba9de3e2,0xba223602,0xba0764e2,0x39eee0aa,0xba3ed2fe,0xba96ad83,0x39f2bd70,0xbabbe0e6,0xba6e0c68,0xb932212a,0x3aec1bd1,0x3ac6e292,0xbaa9e24f,0x3ad87ed2,0xbb843c17,0xb9531f2c,0x3bd1a68a,0x3b5a0eb1,0x3b8fd2b5,0x3b0a66d9,0x390bff8d,0xba16291e,0x3ae4720f,0x3b8ee68f,0x3b2bd3f6, +0x3bdb6e6e,0x3b89d56c,0xbaff65a6,0x3aa85e4d,0x3aaf3f5f,0x3c185749,0x3b408c46,0x3c075ea9,0x3ac3c7b2,0xbb8a82b5,0xba434777,0xbac4ae91,0xba5f265c,0xbab48f95,0xbaabb3b0,0xbb01400d,0xba56ff42,0x3b4e7b64,0x3ab4c4b8,0x3a88ce4a,0x3af49da7,0x3b5c1bb9,0x3b04d4f1,0xbb3e076c,0x3ab0a424, +0x3ab9026b,0x3c0e5fc4,0x3c1728a6,0xbab0784a,0xbbcabd67,0x3a872371,0x3b7766b3,0x3bb17cfa,0x3c454c6b,0x3c191b00,0x3ad5e205,0xb85dc968,0x3ad33637,0x3c0454f8,0x3bc106ba,0x3b5a179e,0x3bad1661,0xb5c946c9,0x3ba4d804,0x3b491419,0xbb7a457e,0xbaaae4b9,0xbb90b1ec,0x3a082af4,0x3a760ac5, +0x3aa9f2e3,0xbb568957,0xbc2179af,0xbc865d35,0xbc7513da,0xbc1d0a8f,0x3b1d5da0,0x3b89af49,0x3ba68239,0x3bb70653,0x3bb0c51f,0xbc860570,0xbccf4c53,0x3c754cfa,0x3c987c54,0xba14b417,0x3bc9d13c,0x3b2686da,0xba32d021,0x39b4af05,0x3b3c9bb2,0x3be45e67,0x3b8e8a31,0x3b462ce4,0x3b2bb097, +0x3b9e7dce,0x3bed7e92,0x3b9f443f,0x3b81c210,0x3be10198,0x3b6e6eef,0x3b322dd5,0x3bb0189b,0x3b18359f,0x3b21f7a8,0x3b7420b1,0x3bd6205b,0x3bc55f5b,0x3b86f91a,0xbb459549,0x3bf28a06,0x3ba84f14,0xbbe4638b,0xbb188e33,0xbaed8bd2,0xbb9ea869,0xbbb10388,0x3b0ef6fb,0xbbb590dc,0xbb6f0edc, +0xbbad9672,0x3b580934,0x3b7e0da2,0x3b75dcbe,0x3b008b19,0x3b2d872a,0x3a2ded5f,0x3ae23752,0x3a79ba34,0x3af18aff,0x3b2ca85b,0x3a411674,0xba4006da,0xba573cce,0xbb21857d,0x3ab4e9c8,0xbadcdb22,0xbb644569,0x3a7cdc46,0x3a9606ea,0xbb8e7a01,0xbc00abf5,0xbc023239,0xbba76af6,0xbb2c377f, +0xbb9175a5,0xbb115e09,0xbb0ef84c,0x3a444c47,0x3ad8a6fb,0x3b53c264,0x3c1b0f48,0x3bb0e678,0x3b952f04,0x3bf216ff,0x3bcf0631,0x3b82bff1,0x3a454cc5,0x37e701fa,0xba8d4dcb,0xbb2480dc,0xba2cd0a1,0x398a5a57,0x3ad95f75,0x3a6d82eb,0x3a9e2d40,0x3b00a58b,0x3b3604cd,0x3b8d8bb2,0x3aee2035, +0x3a8163b5,0x3b92529d,0x3ac45dba,0xb962e230,0x3aa951eb,0x3ae016a8,0x3aab62e6,0x3aa02498,0x3b3ea311,0x3b48d861,0x3a5a081d,0xbb751423,0x3987a314,0xba155ca5,0xbb9eef0f,0x3ad355df,0x3ba6d05f,0x3bfdc3ef,0x3be9262d,0xba87ded7,0x3b10f616,0x3a96b29e,0xbc0f39ae,0xbc827370,0xbc3bb1cb, +0xbc163a16,0xbbb2ff67,0xbaea3b46,0xbb0de404,0xbac07ec2,0xbb363b57,0xba8828db,0x3b2b3eef,0x3afa2079,0x3af7f822,0xb9b478c6,0x3b505d3e,0x3bd8773a,0x3ac95ec9,0x39648194,0x3b1509af,0x3b82ec58,0x3b8dce9a,0x3b73eeee,0x3b02f61b,0x3a835016,0x39e27992,0xb9a7f793,0xbb9f7a75,0xbba5c018, +0xbb08d725,0xbb17d3ee,0xbaeeb100,0xbb1d43e7,0x3aeb8a00,0xbc3e74c3,0xbc13dffd,0xbc004939,0xbbe613c9,0xbaecb4f3,0xbb4614d2,0xbbc43b76,0xbbf61e10,0xbc0b92d7,0xbbef98ae,0xbbb0a679,0xbb2dc7c5,0xba5cef29,0x3af280d7,0x3a678035,0x3b015c98,0x3b1301c8,0x3b74adf7,0x3b5038da,0x3b4277a4, +0x3ab6399f,0x3ab3f0d3,0x3b4276ed,0x3b1298e1,0x3afef1c6,0xb7d6f9be,0xbae72ac1,0xbb67d9d1,0xbb989ca1,0xbb9c0255,0xbc0d5091,0xbc7f8c1b,0xbc80e4e3,0xbc59ee1b,0xbc2a00b8,0xbc1dda36,0xbc68061e,0xbc5a4f55,0xbbf54959,0xbc0feb9f,0xbbc84a8f,0xbbb8e3e7,0xbb848459,0xbb408eff,0x39cec980, +0x396d29c3,0x3b907913,0x3a903e49,0x3b61000c,0x3b2befdc,0x3b0cfa51,0x3a11c571,0x34933253,0x37c2a8df,0x3aa02760,0xba29e255,0xba31b8fd,0x3aeba305,0x3b4e1eab,0x3b06a043,0x3a72974b,0xb873f2a2,0xba1ce7c8,0xba62defd,0xbab848a0,0xbaa2bd26,0xb9da68c9,0x39959c65,0xbb057e64,0xbbb1357c, +0xbc12fb61,0xbc30ab11,0xbbacd7eb,0xbb8c3217,0x3a87f36e,0xbb33991e,0x39a30822,0x3998505c,0xba360bf4,0x39d90e91,0xba8b456d,0xb959e241,0x3b053822,0x3a93422a,0x3a3c9ca3,0x3b052d09,0x3ae01deb,0x3900adec,0xba1798aa,0xbb0c9a39,0xba6dda7e,0xbb93d3a1,0xbb99cc1f,0xbba6e363,0xbbb3e2c9, +0xbbb9a8fe,0xbbbaaf98,0xbbbad295,0xbbdb392f,0xbbf8b481,0xbc08381d,0xbc139b33,0xbc234da2,0xbc2d9eb4,0xbc24e9b8,0xbc0cc4be,0xbbf1b720,0xbbc211fa,0xbba2b5f6,0xbbbbd16c,0xba26ce67,0x3adfd9fd,0x396ce129,0xbabcc2a9,0x3b0001ae,0x3af9ad14,0x3b18fd83,0x3b237923,0x3acd3415,0x3b1e08b2, +0x3b276165,0x3b1a11cd,0x3b3dd513,0xb9f33ae6,0x3a8c871a,0x3ae31f9c,0xba6c8500,0xbbb6e48f,0xbb99109f,0xbba0c8af,0xbba31035,0xbba2577e,0xbba4aa56,0xbba3ff7e,0xbbad8abb,0xbbb27bca,0xbbb8eda1,0xbbbebeec,0xbbc22433,0xbbcd5e7e,0xbbbb466e,0xbbb7ac8d,0xbbb46650,0xbbb0bcfd,0xbba42caf, +0x3a815ae8,0x3a92d5f1,0x3b367396,0xbbd3a298,0xbbfa4732,0xba093c0b,0xbb99e04b,0xbbe617d7,0xbb387f27,0xbb2b4de8,0xbb111cb0,0xba238f55,0xba892128,0xba6fc066,0xba2a3185,0xbbe830ae,0xbbb1ceb8,0x3969d60d,0xbbdea844,0xbbcfbca5,0x3b152a11,0x3a4ef737,0x3a4cf470,0x3a82d750,0x3a7652e6, +0x3a5cd9a9,0x3a0ea47c,0x39ffc260,0x3a0ecae5,0x3a98f493,0x39e91d07,0x39826964,0x39e8b2b4,0xb990a5fa,0xb99a4e1b,0x38e2bddb,0x3a42c473,0x3adad454,0xba84d1e6,0xbbc6f4e6,0xba53223c,0xbb461f60,0xbaf570a1,0xba544455,0xbab36ad3,0x3a618107,0xb9e49404,0xbb30267b,0x3851ea02,0x3a993cc4, +0xbac32468,0xbac95a7f,0xba80beef,0xbb0be548,0xb9bcc12f,0xbb716d36,0xba8f11fe,0x3a7d196e,0xba02834a,0x3a0524e2,0x3a0b6b84,0x3a111e78,0xb88b1d05,0xb976a2ae,0xb84c03dc,0x3ac43e06,0xb952e982,0xba9ad355,0xba97edc7,0xbb71fd8b,0xbb68d2d3,0xbad80916,0xb9b4da4b,0x3b8223f1,0x3970b7ef, +0xbbab0ada,0xbb23d9f3,0xbaf9a0f2,0xba8a13f1,0xb97a3951,0xb8005a03,0x39b55926,0x3b8ce3a8,0xb916e1c0,0x3bd8fc28,0x3b45749e,0x3a5c1c0f,0xbaa37985,0xba2ec943,0x3a8d83af,0xb994e802,0xbb4edb59,0xbad4ca65,0x3a87e19f,0xba3d9054,0x39a6f613,0x38e5c814,0xb880f360,0xbaf80603,0xbadfaef2, +0xbadf5a15,0x3b00eb44,0xbb0258cd,0xbb5cbde9,0xbb12ce55,0xbbee5745,0xbbd31976,0xbb3b6a0c,0xba047f87,0x3b640789,0xbad1d741,0xbbabb63a,0xb9fc9eb0,0x3b05e156,0x39da2732,0x3aae09c1,0x3a5dfcfa,0x3b5014bd,0x3b874207,0x3ba4e905,0x3bede687,0x3bacd728,0x3a8b96fb,0x3b085cc1,0x3b70c387, +0x3b84b7e3,0x3b80502c,0xbaaab2c7,0xbabccac5,0xb9b62944,0xbb686fd6,0xbb0c801b,0xbb0420a0,0xbb2d76ef,0xbb9763b4,0xbb850b8e,0xbaf049df,0x3b93c755,0xbaeed494,0xbbbe71d0,0xbbc0881a,0xbc7507f9,0xbc623a03,0xbbcb5ef3,0xbb1a42a5,0x3c0b99b1,0x3a24a339,0xbc115dc9,0xbc29b214,0xbc4b2cc1, +0xbb8738dc,0x3aa988ae,0x3b03290b,0x3c2a99ec,0x3c1ac5b2,0x3b434428,0x39aa7595,0x3af2ee6c,0x3be71081,0x3b89a25f,0x3b5cf7c2,0x3aee2658,0x3a3d18a1,0xbb8a3cdd,0xbb57cbde,0x3b8c72b7,0x3bb54dbe,0x3c2d7bed,0x3bddc872,0x3c12df56,0x3c7a0752,0x3c0b5e26,0x3b009165,0xbb8dde23,0xbba8e3a7, +0xbb75673e,0xb9054efa,0x3b475e0c,0x3ba17e80,0x3bda970a,0x3b86a19f,0x3aa6e01f,0xbcb6d7a3,0x38eddbb7,0x3c42e6a5,0xbb472eda,0x3b716b2b,0x3b870d5b,0x3a4e1139,0x3a70e4fc,0x3af98355,0x3be432e8,0x3baaae66,0x3b711032,0x3b74d33b,0x3bc35da8,0x3bd02d0a,0x3a1f846a,0x3b102b72,0x3a8090df, +0x3a1009c5,0x3b08d388,0xba6f30d9,0xb99992f0,0x3ad19829,0x3b4f5748,0x3b31ae4a,0x3b0630ed,0x3acefd05,0xba3c5285,0x3bf56b3a,0x3b055a3b,0xbc541490,0xbc552960,0xbc31c5d2,0xbb944f05,0xb8f4fb43,0x3b347321,0xbbd0009d,0xbbd8da08,0xbb60705d,0xba13e63b,0x3b9a3d4a,0x3b07cb04,0x3a3afa14, +0x3afcc992,0x3b00ed2e,0x3ae84d73,0x3ac4f4c3,0x3b1deb8c,0x3b4b8f61,0xba0a3464,0xbad228ee,0xbb8a01d9,0xbb3cf9b9,0xbba7eaf1,0xbb5fde4e,0x3af21ce7,0x3aa210e8,0x3b86b2a6,0xbb197323,0xbbb26338,0xbbbd4ccf,0xba1e6fa7,0x3b9b8a42,0x3ba4ffb2,0x3c287fed,0x3b91166c,0xbc1f4225,0xbc5d27d6, +0xbc5c6712,0xbbbcdfad,0x3ab1543c,0xbb815bf8,0x3b97ea4b,0x3b905418,0x3b3459be,0xba47f6df,0xb9636225,0xba2ff37d,0xbb0be49e,0xb9c1d1ff,0x39d318c7,0x3a590167,0x3a9458a8,0x3abccda0,0x3a82c2de,0x3b0769d8,0x3b075c97,0x3930981a,0x39e4d7b9,0xbaad57d0,0x3ad12f25,0x3b504647,0x3a983663, +0x3ab97869,0xbb2d4497,0xbb7b1afc,0xbb22b450,0xbbb80e3a,0xbc179432,0xbc65a113,0xbc22f77a,0xbbf6505f,0xbaf6a86e,0xbc121ba7,0xbc3ebe04,0xbc4f2514,0xbc312727,0xbc8a7d28,0xbc90d5e7,0xbc6ee361,0xbc807fae,0xbca1f52c,0xbc844cb2,0xbc3db24b,0xbc069ffc,0xbba5a4d8,0xbb16f588,0xbb192fa3, +0xbb178e19,0xba917757,0x3a4dbdd0,0x3a874afc,0x3aad760b,0x3998078d,0x38e396af,0xbaf256ee,0x3956e26b,0xb9aa3274,0xb8329ac1,0x3b6c53af,0x3b07cd41,0xb98cb60e,0xbbb0f1c8,0xbbf16d39,0xbc20ba04,0xbc473846,0xbc50e9e4,0xbc4c392f,0xbbff8e41,0xbc41b6af,0xbc5f24c3,0xbc495d14,0xbc84591e, +0xbc43f6b1,0xbc87dbf2,0xbc72f6ad,0xbc48a4a9,0xbbcf07a7,0xbbfbebd5,0xbbf44e12,0xbc1a4849,0xbc0acce3,0xbbef59da,0xbb9d3e72,0xbb98f1df,0xbb248003,0x3a9f7982,0x39eba96c,0x394b5002,0xb9df5fee,0x3b12f9c9,0x3b630cdd,0x3b5e976d,0x3b4d1031,0x3b2f60f1,0x3b877fe2,0xb7b16759,0xbac9e56a, +0xbb590641,0xbb3ad35a,0xbb0e4a54,0xbae8aee1,0xbb1f60e7,0xbbb6dd93,0xbc309636,0xbc46d98f,0xbc4c7d8e,0xbc2d2818,0xbc498d88,0xbc45c97b,0xbc7ed12b,0xbc87868f,0xbc7196bf,0xbc632c56,0xbc338854,0xbbfa38d8,0xbb96fdca,0xbb537d1f,0xba8b3d08,0xba1fe91d,0x3aac24bf,0x3ab907a4,0x3b2a52af, +0x3a433a1d,0x393343dd,0xbaa8fd2f,0xbaadeab2,0xbb38a83d,0xb972858c,0x3b617a36,0x3b799105,0x3bca117d,0x3b9ce65f,0x3b813035,0x3b362f3b,0x3a8fcbb1,0xba6cc42d,0xbb4d3bbf,0xbb3b20fe,0xbb09d445,0xba9376db,0xbb613c27,0xbbd111c1,0xbc0eb57c,0xbc3ac8b5,0xbbabc4e6,0xbbbcdf94,0xbbae5949, +0xbb55144f,0xbb7a1914,0xbb47647c,0xbb187689,0xbaf63c26,0xbac2b05f,0xbb1b9b17,0xbb67dd12,0xbb23f31b,0xba993a15,0xba94cc35,0xbb093cf2,0xbac562fd,0xbb1821af,0xbac2a733,0xbb8575f0,0xba8ef41e,0xba83d0c7,0xbae4e57f,0xbaec83fa,0xbb064e48,0xbb0124a1,0xbae5a27c,0xbaf5794e,0xbb11a142, +0xbb459994,0xbb87be6f,0xbbbe050f,0xbbee1eef,0xbbead32f,0xbbdb23ce,0xbbcdc1aa,0xbbc3a8a2,0xbb3b46d3,0xbb1647d1,0xbbeea667,0xbc0642c8,0xbba6801d,0xbbbd93f8,0xbbf9750f,0xbbb6a361,0xbbb46ecd,0xbbaa5022,0xbb8ed119,0xbb9baa3a,0xbba17f76,0xbb93f24b,0xbbf256af,0xbba41ba4,0xbbaf18c5, +0xbbf585df,0xbbc0c49f,0xb9963467,0xbab561e3,0xba964657,0xba93ec0a,0xba80fd5d,0xba703eca,0xba5c34cf,0xbaaff2fd,0xbae049e5,0xbb012c3e,0xbb1461a7,0xbb208605,0xbb42a4ca,0xbb326908,0xbb3698ad,0xbb355bc3,0xbb3ce6c4,0xbade0673,0x3bc1da67,0x3ba8d167,0x3ba957d1,0x3c24524a,0x3bf59289, +0xbb07b94e,0x3c22a98f,0x3c0334bd,0x39e63ab4,0x3a1d5ee8,0x3a0fdd11,0xba15c2f5,0x38601141,0xb97b2b24,0xbad17fe1,0x3c002ad1,0x3c1eebad,0xbb29d8ab,0x3be9cbda,0x3c1fbce0,0x3ba53b6f,0x3bacd540,0x3bbeb190,0x3bc41b47,0x3bc34eba,0x3bc2b52b,0x3bbf5b99,0x3bb80378,0x3bb9a74f,0x3bcfcf00, +0x3bc97bd7,0x3bcdbbbc,0x3bd413d4,0x3bd4df41,0x3bc87e95,0x3b983baf,0x3bb2e849,0x3b8e7e9f,0x3bea405d,0x3b90141f,0x3bcfc4f9,0x3bd53d43,0x3bad15da,0x3bbbe189,0x3ba05f9e,0x3bc16447,0x3bfe5723,0x3c09637a,0x3c1bcd2d,0x3bfb8f6a,0x3be5309c,0x3ba1138e,0x3b96ddf6,0x3bf4b04d,0x3bb7f13c, +0x3b82dedb,0x3be53911,0x3bbc7ba7,0x3bf63fad,0x3c00aa98,0x3bfb31c5,0x3be47a0d,0x3bd2ec8f,0x3bbb2ad5,0x3bd09a82,0x3c10fab3,0x3c09e411,0x3c10579b,0x3c1327df,0x3c0ed908,0x3bee1e5c,0x3b6c92f8,0x3bb09fda,0x3b9ee719,0x3be6283c,0x3c08a7c1,0x3bc6df9e,0x3b8c5d32,0x3b9205a1,0x3b971bee, +0x3b82efab,0x3bb2e5e3,0x3b9eb8d9,0x3be5f7a9,0x3bf05964,0x3bfca1d1,0x3ba61c94,0x3ba2e9e1,0x3b90d219,0x3b9caf13,0x3ba165ff,0x3bd2c94f,0x3bb9a0bf,0x3bc31a3f,0x3c0532b5,0x3c1e4bab,0x3c1df872,0x3c176f09,0x3c0c8f61,0x3be67410,0x3bf1a548,0x3c4014d3,0x3c2c9e7c,0x3c3f4e2b,0x3c46bb6d, +0x3c4630a4,0x3c13ac69,0x3aaf3b9a,0x3bb6acb1,0x3af5d409,0x3b9b80cb,0x3ba68ca2,0x3bae9ed8,0x3b938d0d,0x3b78f65b,0x3b0bb50f,0x397b594d,0x3b2a8907,0x3b822874,0x3b2fad3a,0x3be2ca4d,0x3bc19d87,0x39f5c9ae,0x3b26d269,0x3b627681,0x3be4c261,0x3b81f990,0x3b92ecf8,0x3b7c6532,0x3bc279eb, +0x3c28f2b7,0x3c5761c2,0x3c544837,0x3c315c66,0x3c0acc3d,0x3bd83f67,0x3c13d830,0x3c88f41a,0x3c7e8bd8,0x3c84842f,0x3c83ad33,0x3c611338,0x3bfaa089,0xbb41bb25,0x3b444c99,0x3c54a26e,0x3c802852,0x3c3a6b13,0x3b36ec56,0xbbe38c04,0x393dafd2,0x3b850772,0x3b80766c,0x3c3624a4,0x3c356bea, +0x3b99937d,0x3a7e94a9,0x3aff6458,0x3bfd8f70,0x3b9ac6f7,0x3b63ac5c,0x3b924620,0x3b8c0866,0x3bc8ed8d,0x3c0a1007,0x3c1b36d2,0x3bf95ee9,0x3bae85ca,0x3bd7f5ac,0x3bf1989f,0x3c173a40,0x3b00ff3c,0xbb2f4374,0xbb46d64e,0x39ba146a,0x3c0428d1,0x3c92ff13,0x3cb3277c,0x3ca69062,0x3c5e8ec7, +0x3c4cb835,0xbb811e5e,0xbc94dd79,0x3be68d66,0x3c54d6f5,0x3b9375b2,0x3bdf9281,0x3b8b621d,0x3b47c8d1,0x3aa12def,0x3b08cc1c,0x3be1d8ca,0x3bbbf763,0x3b960279,0x3b4f7771,0x3bd6a05b,0x3c020056,0x3b93d3ec,0x3b4a4933,0x3b4d62c5,0x3bb5fc71,0x3c1abc24,0x3c651508,0x3c9b84e3,0x3c71f34e, +0x3c3ee280,0x3c1de295,0x3ba411a0,0x3b4d8335,0x3ae8f549,0x3c28aed4,0x3c0a5002,0xbaf60875,0x3b2a692b,0x3af17147,0xbb5654c9,0x3b4100d7,0x3c03171b,0xbac3e7c1,0xbb55bd26,0xbb405df0,0x3b16d37e,0x3bbfdb98,0x3ba826b7,0x3a8a0cac,0x3b46e175,0x3b0f58de,0x3b1655f9,0x3af822c3,0x3b22a630, +0x3b60b33b,0x3a897ccb,0xba11894f,0xba86bb88,0xb92b407b,0x3b0d865b,0x3a610c4e,0xba512f24,0x3a9d074d,0x3b9c27ee,0x3b546a84,0x3bd5f042,0x3c4c3ef9,0x3c7575ee,0x3c69805b,0x3c178153,0x3c2df51c,0x3c67865f,0x3ca8ecbe,0x3cc88b19,0x3cd06ad1,0x3ce77542,0x3c6e12f3,0x3c876e73,0x3bedfddb, +0x3bb82c70,0x3b9b0265,0xbaab00b3,0x3a717787,0xba760408,0xbaf2d752,0x39c3e329,0x3a4ecb09,0x3ab3e86c,0x3b017b9f,0x3b05f5dd,0x3b061e25,0x3b1d44f3,0x3b3fc946,0x3afbd952,0x3a6692a9,0x3b011872,0x3b5ad126,0x3bc3c54d,0x3c0dd9f0,0x3c27ad79,0x3bfb742b,0x3bb34382,0x3b921aa5,0x3b8ef70b, +0x3b6ee686,0x3b3f0960,0x3ba246ca,0x3bc41b5a,0x3bd6c2a5,0x3ca2f2d7,0x3ce19c63,0x3d0b7a76,0x3cc8d6dd,0x3c84569d,0x3bd65828,0xbbfb4d42,0xbc1bf532,0xbc565e54,0xbc5512bd,0xbc273c5e,0xbbaacdea,0xbb0e70ed,0xb9ecfd46,0x38d97d12,0xba9b1576,0xba312ec7,0x3a53faa0,0x3a99f00a,0x3ac93887, +0x398b220c,0x3b268542,0x3b74fa06,0x3b65f1d4,0x3a1fb40c,0x3a0ac7fe,0x3b286aef,0x3b872566,0x3bc02b53,0x3bf0c314,0x3bf1a290,0x3bf6caa4,0x3c286efe,0x3b5aa129,0x3b7a49ca,0x3c35cb8e,0x3c7ddcdb,0x3c93eddf,0x3c994dbb,0x3c94c5f9,0xba2031aa,0xba3f5461,0xbbf705d3,0xbb7276e3,0xbacfd74a, +0xbb67126c,0xbbd4c9fb,0xbc013ad3,0xbbfd3378,0xbbecd2eb,0xbbc442bb,0xbbac052d,0xbb492ef5,0x3a201683,0x3abe6748,0x3b4cc7db,0x3b634a46,0x3b6b128c,0x3b4a6af8,0x3b308eca,0x3b1b1f24,0x3b7fe1da,0x3bcb7f9d,0x3bdcd47a,0x3bc35110,0x3b666b70,0x3af3edba,0xba9ac317,0xbb919092,0xbb985aa5, +0xbb88c456,0xbaea43f1,0xbbf30e4b,0xbbfd9464,0xbb99f174,0xbb14e599,0xbc14d332,0xbc2f7e7a,0xbc0df537,0xbc089d7f,0xbc0aad27,0xbbdca3e9,0xbb984608,0xbb2ded98,0xbac034b6,0xba99d2be,0x3a931e9b,0x3a13eece,0x3ae6cebd,0x3b27472a,0x3ad6d5e3,0x3a9ab7da,0x3a40cf0b,0x3afe6f9a,0x3b77cfc3, +0x3ba06938,0x3b9d2d90,0x3bac41b2,0x3bb6eab5,0x3b9b98a8,0x3b8721c0,0x3b65cb00,0x3b798463,0x3b89b63e,0x3b850b0e,0x3b97ea7a,0x3b92fcef,0x3ba41092,0x3b001c20,0xba8b6924,0xbb9e3035,0xbbe54bf8,0xbb39b4f7,0xbb266e54,0xbb8b29c0,0xbaf1ac0a,0xba732492,0xba8255c8,0xb99a920b,0x39a2d86c, +0x3a2405d1,0x3af53114,0x3b3844ee,0x3b6df517,0x3b6422ff,0x3b9d216c,0x3b4d537c,0x3afd00f4,0x3b2d5e23,0x3a3c477b,0xba5a2817,0xbad5b2dc,0xbb1a7de2,0xbaf6b7ea,0xbaf56163,0xbacfea2e,0xbaa8f598,0xba85bcc7,0xbaa96ed1,0xbaada06b,0xba85dbef,0xba4f5804,0xb9e6db4d,0x38f64264,0xba69de2f, +0xbaa325ee,0xbad59708,0xbaf5e22f,0x39242262,0xb8be0064,0x3b242949,0x3a93a894,0xbb8fbd14,0x3b4f9966,0x3af59090,0xbb1ee44d,0xbb1013dd,0xbb0adeb3,0xbb2a2489,0xbb1b0a97,0xbb21aace,0xbb2c8a05,0x3b66ca3a,0x3b9445f6,0xbb57b848,0x3b2131bd,0x3b578372,0x39bde906,0x3a4bfea8,0x3a64d426, +0x3a58a1a9,0x3a6e6912,0x3a6c2f7c,0x3a76bdd8,0x3a8ed57e,0x3aa0dac3,0x3aa8228d,0x3ab5aee5,0x3abf9a68,0x3ae54d28,0x3aba91fc,0x3a9905d6,0x3a56bda3,0x3a178455,0x3b216b97,0xbba1a11b,0xbb7e7638,0xbbb0d72a,0xbb9e651e,0x3a2470ec,0x3c320ab3,0xbbd6e765,0xb9ba75f2,0x3c0cc622,0x3c1765c7, +0x3c1bc658,0x3c20f215,0x3c2ee533,0x3c320d47,0x3c325c3a,0xb94cca59,0xbbcca4a6,0x3c405c89,0x39db4c9c,0xbb99a1c1,0xbbbb1d04,0xbb8cfbfe,0xbba7c573,0xbba55741,0xbbad9959,0xbbb3c794,0xbbbe1e85,0xbbbd8801,0xbbba48c4,0xbba10df9,0xbbbae793,0xbbc1952f,0xbbbe3833,0xbbce05ef,0xbbc4fca0, +0xbb9cd469,0xbb9f66b9,0xbb8a8911,0xbbd651cd,0x3b3fca3f,0xbb9b57c1,0xbae0bd84,0xb978c11e,0xbb1c5bb5,0xbb0a138c,0xbb40c39d,0xbb55e327,0xbb0a63ff,0xbb14031b,0xbaa026db,0xbb293965,0xba05cd50,0xbac01a25,0xbb62be24,0xbb26eafe,0x3b667b54,0xbbcb42e1,0xbbb6a032,0xbbdcb256,0xbbe5b8c4, +0xbbfc8e7c,0xbc073817,0xbc0db922,0xbc0dbbec,0xbc027371,0xbbc00e76,0xbbfb3754,0xbc09000e,0xbc084cdf,0xbc248a4a,0xbc16d274,0xbbb77c8c,0xbbb0a079,0xbb48dc79,0xbb65f94b,0xbb310aee,0xbb2d37fc,0xb828d479,0xb7b66ffd,0x3a6fa5f7,0xb890f652,0x3b015665,0x3b271489,0x3afb2b92,0x3b630af8, +0x3ba26f51,0x3994f5e1,0x3a2dbcf4,0xbaebc2e5,0xba82cdc0,0xba8bce8d,0xbab84620,0xbb8b020f,0xbbdbfb57,0xbbf2be01,0xbc08aac0,0xbc1c2119,0xbc2ae70d,0xbc41902b,0xbc4072a2,0xbc39c7e4,0xbbeae8c5,0xbc358d2d,0xbc47bfdf,0xbc3abe0c,0xbc6dba0b,0xbc4aae75,0xbbc56b9f,0xbbb6db1b,0xbb3e79e7, +0xbb69ce90,0xbb61cc91,0xbb38ddf3,0x3a3c8a68,0x3a5fc14b,0x3acebe19,0x3a8844bb,0x3b260cc7,0x3b65b439,0x3b761c0f,0x3c01b48d,0x3bb700ba,0x3aac4aa9,0x3a98e17b,0x3a4b156f,0x3b4d4e3f,0xb8f555e8,0x39247ca4,0xbb9433fd,0xbc0c367e,0xbc2e40d2,0xbc514839,0xbc73c395,0xbc8e8ccd,0xbc954275, +0xbc8d255a,0xbc5b66db,0xbbd00bf2,0xbc50c141,0xbc75113c,0xbc761e4e,0xbcaac7a4,0xbc915c6d,0xbbd6fe55,0xbb91514e,0xbc07c841,0xb9b3e9ab,0x3aa8dd58,0xbb1334ec,0xbbe27018,0xbb019715,0x3a2774a4,0x3abe25d5,0x3c0c1b61,0x3c1e0fce,0x3bbe1c98,0x3a7b2aa2,0x3ac39ca8,0x3bd87d77,0x3b3e827f, +0x3aa484f4,0x3b057891,0xba6abe93,0x394340e3,0xbb1b3d73,0xbbab43b0,0xbadfaac9,0x3a23d136,0x3b1cb40f,0x3b9b75bd,0x3c2e6b1b,0xbba8cc00,0xbc65f2a9,0xbc8afc03,0xbc8327f6,0xbc69014b,0xbc683afb,0xbbb5700e,0xbb73cefc,0xbbd46410,0xbc184129,0xbb1ed141,0xbcbac416,0xbc25f41a,0xb9224de4, +0xbaa8c5c4,0x3b0d5673,0x3b4f74bc,0x3b6a5ceb,0x3a9369bd,0x3a8790f6,0x3bc997c9,0x3bcc8602,0x3ba2643a,0x3b376f85,0x3b8f75df,0x3b836a5f,0x39ac9e03,0x3a61b8fb,0x3b1ec31c,0xba0f3265,0xbbbaa570,0xbbf0a678,0xbc0f5f34,0xbb7f76a0,0xba29d687,0x3ad7351e,0x3a909b1e,0x3a73867d,0x3a23b13f, +0x3b8e6cb5,0x3a466bda,0xbbf889f3,0xbc11b49d,0xbc06490b,0xbb89f36f,0x3ab7c266,0x3b8e80d0,0xbb23a027,0x393b3afd,0x398754f7,0x3b213016,0x3ba615aa,0x3b82e156,0xba1fe67f,0x3acfd521,0x3aeb055e,0x3ac93844,0x3a869de7,0x3af20579,0x3b661e16,0xb9b57be4,0xbb6cdfd0,0xbb2a4f2a,0xbb8b04cf, +0xbbad5ff6,0xbbafc06c,0xbb89bc83,0xbabf0222,0x3afae045,0xbc1d479e,0xbc8388b2,0xbc9089a9,0xbc80d9bf,0xbc344f51,0xbb8fb138,0xbc06c7b2,0xbc933e50,0xbcf312cc,0xbd024536,0xbcd6ac8d,0xbc8674cb,0xb9305374,0xbc0f468d,0x3b9a7fa7,0x3b36a036,0xbaced6ab,0xbb08d37f,0xbb43d03d,0xbb099e8a, +0xbb48e5b5,0x39c1c07d,0x3a969d37,0x3a3a987e,0x3ae8c766,0x3b033a38,0x3a340863,0x3a068cdf,0x3a0904e9,0xba15293f,0xbacc8fbc,0x3910e27f,0x3a5e5000,0xbacc8fdd,0xbb8afc79,0xbbafb3dc,0xbc03911b,0xbbfc93cf,0xbbbe493a,0xbbfdd390,0xbc11170b,0xbc012ab9,0xbbcbbd45,0xbba0a683,0xbb294906, +0xbc61d97d,0xbcb44647,0xbcf29f9b,0xbc89287f,0xbce59dc0,0xbc785aa5,0xbbaf4f8c,0xbc47a7c8,0xbc73ee32,0xbc62afa1,0xbc3c5e86,0xbc0c02ca,0xbb9a4596,0xbb3f5c36,0xbaf74afc,0xbaea4651,0xbabdbdd9,0xbadff74e,0x380b69a6,0x3a4811e5,0xb97d306a,0xbab3ab39,0xba639ae6,0xbaa2f4ea,0xbae330dd, +0xb9ea68aa,0x3943d16c,0x39becba8,0xbb0519f0,0xbbf24268,0xbc1bda99,0xbc5790e9,0xbc889090,0xbc9795cd,0xbca60b04,0xbca21a94,0xbcacacd6,0xbca925d2,0xbca6884a,0xbcce2229,0xbc776d38,0xbc6442e0,0xbbb2a9b8,0xbbfe5165,0xbb828a80,0xbc0677e2,0xbc232103,0xbc22a09d,0xbc1e624b,0xbc09de16, +0xbbe93f01,0xbbeb371e,0xbbb2188a,0xbac8bce5,0xb9e5c2b3,0x39806cb0,0xb94ef476,0x3b0260cf,0x3b253b69,0x3b3fa0af,0xb9cb6afb,0xbb0b6708,0xbad7a48d,0xbb382575,0xbb7f0cd0,0xbbad01b8,0xbbaae2fe,0xbb88def9,0xbb29ff2d,0xbbaa51d7,0xbc1f0339,0xbc8b8c77,0xbc89835b,0xbc8f80cd,0xbc8e73b9, +0xbc7b6431,0xbc6edf75,0xbc6fc3b9,0xbc61765b,0xbc5e7bf2,0xbc388b72,0xbc19ae8c,0xbbd20cf0,0xbb8e67e1,0xbb3bc7c0,0xbb57fdbb,0xbb06b17d,0xbb034c4c,0x3a95c316,0x3a9ec847,0x3a839ad4,0x391810e8,0x39a87f8d,0x3a09e6b8,0x3a0ce010,0x39c7caf2,0x3a8bbc22,0x3b120912,0x3b54fd11,0x3b438ebe, +0x3b3e548b,0x3b504f5c,0x39376f9f,0xbb4b4c47,0xbbd68a90,0xbc04b08a,0xbc11c943,0xbc22f34e,0xbc2fe80b,0xbc45739e,0xbc5dbac5,0xbc65ca89,0xbc0285ae,0xbc1117a7,0xbb2a3d12,0xbbc5ca6a,0xbb935a84,0xbb6d7be2,0xbb9b6ef3,0xbb81fb3e,0xbb9c9868,0xbba26b7d,0xbb7d9c91,0xbb927d1e,0xbb700abf, +0xbb3bbd5a,0xbae33e3f,0xbaafa42d,0xbb44038b,0xbb09b1c9,0xba9f30ca,0xba83d22e,0x395b57cd,0xb9b890d0,0xb96699ed,0x381a855a,0x39a124e3,0x3a6fa155,0xba179817,0xbadf826a,0xbb4ebdaf,0xbb9abeeb,0xbbdcbc7c,0xbc0f87ca,0xbc10a4f4,0xbc0eb38f,0xbc0998da,0xbc089f87,0xbb955088,0xbbb17b51, +0xbba43e0a,0xbb15cce8,0x3b5bf262,0xbbbb88f9,0xbb135aab,0x3b3df2a8,0x3b678c46,0x3b8727a2,0x3b94921e,0x3ba9a2cb,0x3bb5eea8,0x3bc4d60a,0xbaaed9c1,0xbb84eb12,0x3b99c362,0xba934809,0xbb56fa5f,0xbae0e633,0xbae56c46,0xbae0e674,0xbac5675c,0xbabe5f01,0xbabc6a23,0xba9cca30,0xbb01fc94, +0xbb279595,0xbb4d022f,0xbb75a6f2,0xbb8ad056,0xbba4e81d,0xbb98f85c,0xbb9a1903,0xbb9ae1ac,0xbb9f3642,0xbb5851dc,0x3bfce09c,0x3bd6c8bf,0x3c22ca94,0x3b9270b3,0xbb23f8c6,0xbc2e69b2,0x3bea5a54,0xba61d711,0xbc14bcef,0xbc183c7a,0xbc16d7d0,0xbc0f108e,0xbc18a985,0xbc1c1a4e,0xbc244be4, +0xbab1a1f0,0x3bba2d2f,0xbc3dba49,0xbb1571ee,0x3b7ff898,0x3c158a02,0x3be454c5,0x3c01537f,0x3c036886,0x3bfec8d6,0x3bf71486,0x3be63d2b,0x3be571f2,0x3becceab,0x3c0745be,0x3c033bb8,0x3c0530f1,0x3c09a368,0x3c01c25c,0x3bf14d73,0x3bbf85de,0x3be4064e,0x3bdaa4aa,0x3c188011,0xbba70440, +0x3be2eec7,0x3b2ced6f,0x3b278ad4,0x3baede5c,0x3b6ba4ad,0x3bdd0ed1,0x3be87cd2,0x3ba03916,0x3c041507,0x3bea5236,0x3bbfb52d,0x3b00f06e,0x3b1957a4,0x3b6f1b81,0x3b8809a4,0xbb876953,0x3c026355,0x3c1227d2,0x3c1cbcad,0x3c2929da,0x3c1c6872,0x3c0c2b24,0x3bef58ca,0x3be1be50,0x3c000b99, +0x3c3122fc,0x3c29835e,0x3c2c5ee7,0x3c2a56b7,0x3c10af10,0x3be82131,0x3b7faa8c,0x3bc468a6,0x3c07780a,0x3c251883,0x3b8ef692,0x3ba49ee7,0x3aa2caf1,0x3b507feb,0x3b6d7780,0x3b5760e9,0x3b553dac,0x3bbe121d,0x3b8f746e,0x3c19a322,0x3bacdd6d,0x3bc0650a,0x3af99df6,0x3b3140ce,0x3ad4dfcf, +0x3b30dd20,0x3b0c39dd,0x3bb6eccd,0x3c2fde41,0x3c30c492,0x3c50702d,0x3c398409,0x3c238889,0x3bee0bff,0x3bdc6f34,0x3c0223e7,0x3c62da15,0x3c4f6b95,0x3c5d0ea4,0x3c67d1cc,0x3c318f78,0x3bf4a275,0x3acca218,0x3bb13fb0,0x3bd75fac,0x3be55bf5,0x3a605bcb,0x3b9fb9de,0x3b7fe489,0x3ba291aa, +0x3b865134,0x3ab6a1f6,0x3b7b457b,0x3b87b7a3,0x3b94e319,0x3bf9193a,0x3bf400e4,0x3b6a2d52,0x3b62fdcb,0x3b888c82,0x3af3f22a,0x3b7e3591,0x38eae5c5,0x3b8e35d5,0x3c3d6bbd,0x3c5572f1,0x3c86a007,0x3c662224,0x3c2bd5b3,0x3bd47338,0x3bb8b031,0x3c1de5b5,0x3c9abfc4,0x3c8a66ef,0x3c89a94a, +0x3c83b7f2,0x3c138472,0x3b306dbe,0xbb6da62f,0x3ae16d76,0x3c936f6d,0x3c7c2990,0x3bfe05c2,0x3b64319c,0xbc001f52,0xbb588c8e,0x3b09d488,0x3b481e65,0x3c0c8cf1,0x3c2f3711,0x3bfbf1fb,0x3b123580,0x3b013ab2,0x3bca3ef9,0x3b4e7453,0x3b6dd78d,0x3b6bf494,0x3be9a7ba,0x3b8f1d77,0x3c0395eb, +0x3c811f91,0x3c4a2879,0x3c6159f4,0x3c305c4a,0x3c415a4d,0x3c71192b,0x3bc1618d,0x3b06615b,0x3b6f8337,0x3c1474d3,0x3c82e760,0x3c99d23d,0x3cd40f1b,0x3cc7f5f9,0x3c6cd5e8,0x3c52bd02,0x3bde9474,0xbc3ca1d9,0xbc17b89f,0x385dc34a,0x3c23fcbb,0x3bb90233,0x3b8e3eb7,0x3bafdad0,0x3b1d6e88, +0x3b0358bd,0x3bced9b5,0x3be7ef90,0x3bc34260,0x3b6161fd,0x3bd16799,0x3bce6147,0x3b3b1484,0x3ae154f4,0xba5e0fec,0x3b998ab0,0x3c2c6e7b,0x3c5f587b,0x3cb783e7,0x3c92289c,0x3c57c1fe,0x3c00b644,0x3b1b3233,0x3b01ee8d,0x3bbcdc57,0x3c0dd99d,0x3bbed463,0xbb2b3b87,0x3abfcd51,0x3ac48136, +0xbb32676a,0x3c002a89,0x3c405cbf,0x3b984acb,0x3a80e7e0,0x3b2bbf4b,0x3b061526,0x3bc8129a,0x3b88f743,0x399f63e0,0x3b23137e,0x3b4988c5,0x3b130431,0x3b1e2638,0x3b39c28c,0x3b7d8d5b,0x3a88954d,0xb98a652e,0xba709737,0x3a86f4f8,0x38e33fbb,0x3ad2220c,0x3afb328a,0x3a3f9ca9,0x3ba220a7, +0x3bfdd2b3,0x3c634b24,0x3c99d3d9,0x3cb40950,0x3ca24e30,0x3c80f156,0x3c5fec83,0x3c8430cd,0x3cb01f07,0x3cb9976f,0x3cc435a7,0x3cda3c84,0x3c7f7e37,0x3c7011b9,0x3b4e8b83,0x3ab4bd1c,0x3b0091e1,0xbb5e2f03,0x393745f8,0xbab67665,0xbab6b9ee,0x3ab91032,0x3af71d98,0x3aab638a,0x3b4a85ca, +0x3b3611f5,0x3ac93806,0x3aa1c5f6,0x3a6127b9,0x3acdc162,0x3a32035a,0xba61ccfa,0x3b829477,0x3c183c92,0x3c3868c5,0x3c4dfc85,0x3c111a18,0x3bb374ef,0x3add7f56,0x3a978d58,0x3a87f6f1,0x3b823c93,0x3b4c7bb1,0x3bde9389,0x3c7eaa05,0x3cc02d20,0x3ced4793,0x3d0be63b,0x3caeb58e,0x3c8586fd, +0x3ad044d8,0xbc7c0724,0xbc38c53f,0xbc219482,0xbc521f6c,0xbc2356f1,0xbbc56b90,0xbb87d4b5,0xba4c7f08,0xba10707e,0xba1718d6,0xba3e862f,0xbab599d7,0x3995c53b,0x3a6aeca0,0x3a431e19,0x3aa62d72,0xb934d8ea,0x3b63f951,0x3a89f23b,0xba14ade4,0x3aa3c600,0x3b10acd9,0x3b8fd5df,0x3bde4cd5, +0x3bcce3b1,0x3bc4c184,0x3c0b6250,0x3b7aa7d6,0x3b859be2,0x3c14d79d,0x3c73419b,0x3c968584,0x3cac9996,0x3c8ac1fe,0x3b11f8d1,0xbaace356,0xbc20e29d,0xbbb051b7,0xbbc328c4,0xbbf004fe,0xbc087703,0xbc13593d,0xbbf072af,0xbbdee52f,0xbbb93ce4,0xbbd445cf,0xbb9916cb,0xbabb2e1d,0x3a9c3cfc, +0x3b30faa1,0x3b3eb301,0x3b262ae8,0x3b2d310b,0x3b042d15,0x3b47b40d,0x3b8e80f8,0x3b9fca55,0x3bd852a7,0x3bbdc585,0x3b7f162a,0x3b08d123,0xb782c86f,0xbb1e8756,0xbaccc4d0,0x3a6148e2,0x3ba25c7c,0x3acfed9c,0xba516fac,0xbb1367c6,0xba458434,0xbb88c625,0xbbe4cca5,0xbc0e55e6,0xbbd81a86, +0xbc02e785,0xbbc15813,0xbb88e03a,0xbb0856aa,0xbb55dd35,0xbb464bc0,0xbb6ac56f,0xbaa45cfb,0xba5b30e3,0x3a8ac48b,0x3a04f759,0x3abb153b,0x3ae7e0bb,0x3b1c310a,0x3b370155,0x3ba83eed,0x3bbbc3c5,0x3b980021,0x3b8b284b,0x3b8e44ff,0x3b9cc65d,0x3bb4606c,0x3ba684af,0x3b9402b2,0x3b62a011, +0x3b58539e,0x3b1ae05c,0x3b14b514,0xb8b77c07,0xbad8305d,0xbb66f3b6,0xbb951c4f,0xbb4a04ba,0xbb7e4d1a,0xbc16a617,0xbb5daf21,0xbb8e4596,0xbb85ba20,0xbb137d48,0xbb002311,0xba028b85,0x39b0154b,0xb9cb0455,0x3ab67cf4,0x3ae6a65e,0x3b17d593,0x3a5f7371,0x3a9f8ccb,0x3b337448,0x3b15043b, +0xba244469,0x3b3a2b54,0x3aff1ef7,0x3b18b5d8,0x3b2128c4,0x3b2d20fc,0x3b301f66,0x3b346af4,0x3b3dd472,0x3b5c74fc,0x3b80ce20,0x3b8dfbd2,0x3b9df1c9,0x3bb0fb48,0x3b6ae4a1,0x3afb648c,0x39b3f848,0xbab2e5a8,0x3aab98f3,0x3ac495f5,0xb857070f,0xbb5e91d3,0xbbfa4394,0x3adcbf01,0xbb20c17f, +0xbbd4c522,0xbbd6fede,0xbbd643fe,0xbbccf558,0xbbdb1a7d,0xbbe49fc1,0xbbe55dde,0xba80a9e0,0x3b53f742,0xbbdc2394,0xba78938e,0x3b1cb4b1,0x3b810b93,0x3b56d95e,0x3b6c8308,0x3b685936,0x3b6af1ba,0x3b6cafa7,0x3b6db641,0x3b797ee8,0x3b7ce2b2,0x3b7e17d6,0x3b811744,0x3b81738e,0x3b8c4c7e, +0x3b6705fa,0x3b4a3715,0x3b27e2c4,0x3b0c7654,0x3b88e848,0xbba52bc6,0xbb82b93a,0xbbe0b5f7,0x3aebfbc3,0x3c0bb337,0x3c55d091,0xbadc6d64,0x3be408dc,0x3c4db91f,0x3c5b399b,0x3c5be547,0x3c4a026e,0x3c637e13,0x3c641f64,0x3c5af3ec,0x3be62ffb,0xba839396,0x3c586e57,0x3bf20b10,0x3ad64562, +0xbbe891fc,0xbb88ef58,0xbba528bf,0xbba8321b,0xbbb6afcd,0xbbbf4524,0xbbc88eb8,0xbbc5c25f,0xbbc0ef9f,0xbba8a072,0xbbb8f792,0xbbba2067,0xbbb55c17,0xbbbb6820,0xbbb44193,0xbb9a6868,0xbba117c9,0xbba24a86,0xbb9ac519,0x3c1beb3f,0xbb481014,0x3b0dd122,0x3b430a00,0xb9b96c18,0xb969cdc0, +0xbb117d19,0xba861f3e,0x3b0d10f7,0x39d33f6d,0x398da466,0x3999463b,0x3af23663,0x38034f61,0xba530cb0,0xbaad0d97,0x3c06602f,0xbb95d4ea,0xbbb2ff84,0xbbb1cb7a,0xbbda9bc2,0xbc042d3e,0xbc163491,0xbc1a3f40,0xbc171289,0xbc05a20b,0xbbc3b7f2,0xbbe59ec9,0xbbe73e76,0xbbdff405,0xbbf3556c, +0xbbe21a1f,0xbba006ba,0xbb9eb11a,0xbb9b8069,0xba8bead1,0x3b82c26a,0x3a9ec614,0x3b4ae75c,0x3b31dff3,0x3b551c3e,0x3a8fe88b,0x3b91874f,0x3b11b72b,0x3bac3076,0x3b25856a,0x3be3ec37,0x3aecab77,0x3b4ee715,0xba41aa3e,0xba8a7353,0x3993295e,0x3b2f919b,0xbafffbb4,0xbbd17cb9,0xbbb5e042, +0xbbf6a81e,0xbc1fb42e,0xbc3ab70a,0xbc47e661,0xbc47d95f,0xbc380aa8,0xbbf26ff0,0xbc1d8b5b,0xbc1d73f1,0xbc102246,0xbc1eade9,0xbc0b7b6c,0xbbb2fca3,0xbb9f9eab,0xbba55da5,0xb6f9d9de,0x3b09aa22,0xba0b7483,0x3ad74355,0x3b6e5b05,0x3b3d49ad,0x3a78dad7,0x3b2411f9,0x3b71e652,0x3b5a33b0, +0x3c098fdf,0x3bd5bffc,0x3b0b851e,0x3a9c5d96,0xba7e995e,0x3af82ac5,0xbaf75ec9,0x3b4f39da,0xbb21a006,0xbbea4778,0xbbd5ea66,0xbc28e252,0xbc6ef5b3,0xbc97d514,0xbc9962a5,0xbc8ef6f2,0xbc5213f0,0xbbda4a71,0xbc263aaa,0xbc25be9d,0xbc1f0911,0xbc40e08d,0xbc2cb1b1,0xbba57344,0xbb50cb79, +0xbc34cbd4,0x3bd71ae4,0x3c7058b5,0x3bf8c1b0,0xbaadea0f,0xba8a405a,0x38b90b3b,0x3b2cec95,0x3bdcddaa,0x3c17f920,0x3c1136ab,0x3b08cbd0,0x3a933edd,0x3bbdd374,0x3b156e02,0x3a82202e,0x3b851ca2,0x3a953132,0x3bce225b,0x3b210828,0xbbd5f4fe,0xbb5ba939,0xbb8f39aa,0x3a83fc4d,0x3b0558d9, +0x3b6078e0,0xbc5b7298,0xbcb12034,0xbcb66135,0xbc8b3ba6,0xbc4cabcc,0xbc59a608,0xbb1aea29,0xbacf92d7,0xbc1360d0,0xbc22ca6a,0xbbceb0a4,0xbc9a510a,0xbc894e70,0xbc20b766,0x3bd40cf3,0x3b6d2929,0x3b1e8978,0x3ba77472,0x3af38f92,0x3ac1bccd,0x3bad659b,0x3be82bcc,0x3bc5dcb4,0x3b001874, +0x3b3d0cea,0x3b2176d5,0x3ae1e213,0x3a26b5c3,0x3b615b8b,0x3a82d0eb,0xbbb2c2e7,0xbb7c0f16,0xbb915bcd,0xba5e8554,0x3a38e93e,0x3aed51ba,0x3abf7888,0x3af0326e,0x3b5c0a90,0x3ac716a6,0xb9ff5625,0xbb5430a9,0xba3145bd,0xb99bd631,0xbb40155f,0x3b240d2c,0x3c1722a2,0x3bc4700f,0x3c09d129, +0x3baf7370,0x3bbd4f44,0x3ba29b0f,0x3b9e35b8,0xba459976,0x3afeba25,0x3b06a0d0,0x3ab32543,0x3a9076d6,0x3adfc8f5,0x3b6ae453,0x3a2fcb3e,0xbb45efcb,0x392e258f,0xbb3e1071,0xbafd02e8,0xbb6484ac,0xbbdae002,0xbb21ee80,0x38cbce4f,0xbc0357e6,0xbc4d18e9,0xbc6575ba,0xbc654229,0xbc577477, +0xbbd6a239,0xbc890c38,0xbcbc652b,0xbcb5fb97,0xbcb3b939,0xbc679134,0xbbcc0cb6,0x3ba0eb06,0xbb915af9,0x3b12fe82,0xb8c4ba0a,0xbb79913d,0xbb394cbd,0xbb4fff08,0xbb20db43,0xbb45647b,0x3a834762,0x3b058fcf,0x3ab09ae6,0x3b35bdcb,0x3b1fca81,0x3a009602,0xb9cc237a,0xb7b75c23,0x3914e485, +0xbad19f20,0x3b0326dc,0x3ac3a7c4,0xbab1bd48,0xbb060777,0xbb58d383,0xbb93f547,0xbb87001e,0xbb78d767,0xbba0ded3,0xbb6bf1dd,0x3b3d31ae,0x3a34a8f8,0x3b0b9154,0x3b89767a,0xbb05247a,0xbc0411a3,0xbc7cd4f6,0xbbc04d0c,0xbc838ca0,0xbb8cd7e8,0x3ab2db9f,0xbbe6e4c7,0xbc04d5bd,0xbc17d886, +0xbc10c59d,0xbbda3b25,0xbb6be200,0xbb446d47,0xbaed729b,0xbae96727,0xbade5301,0xbb3c79d2,0xb9680261,0x39eaf95e,0xba24fa98,0xba0e90df,0x3b017de0,0xba229fd0,0xbad5cbd4,0xb9ea895f,0xbac8141e,0xb9b1d7bd,0xba8720fe,0xbb362ace,0xbb907adb,0xbbcb8ff3,0xbc09f50f,0xbc471f80,0xbc75b941, +0xbc962c16,0xbc7182a6,0xbc3c2dfe,0xbc3848a7,0xbc4cd110,0xbc34eb72,0xbbd9a8ff,0xb89018c3,0xbb8cc0d5,0xbb971675,0xbc0a69c3,0xbc3553d6,0xbc25cd7a,0xbc22155c,0xbc099b68,0xbbfd6c17,0xbbf04408,0xbbce347a,0xbb69d706,0xba6b527b,0x3a80215d,0x3ac9f291,0x3b128707,0x3aeb0f86,0x3b0021e2, +0xbad3d8fd,0xbb4e1088,0xbb6450b2,0xbae146c1,0xbab42494,0xbb05b398,0xbb6c9f52,0xbb888a5e,0xbb861a0f,0xbb997219,0xbbf248ec,0xbc66277e,0xbc55c7ee,0xbc5a98c3,0xbc62ab7a,0xbc3127e5,0xbc42043a,0xbc1f15a3,0xbbdf94a0,0xbbf7b309,0xbba2cbb5,0xbb9c2bab,0xbb7015b5,0xbb4d5349,0xbb25440a, +0xbba7bae5,0xbb784abf,0xbba4c74f,0xba130e3b,0xba86f19c,0x3a45bcae,0x3a285146,0x3b31d934,0x3b1d9202,0x3b4d7702,0x3a48b7e9,0xba72839c,0x39aea631,0xb8d85566,0x3a3d4d88,0x3ab079ac,0x3b37e404,0xb9766220,0xbb3fd445,0xbbbc4ea1,0xbc017936,0xbc1beac4,0xbc3802a9,0xbc355f7b,0xbc37f23b, +0xbc4504cc,0xbc366702,0xbc08f4e2,0xbc17bc08,0xbb2abaa3,0xbbfc4bb0,0xbba7874d,0xbb987526,0xbbcbd757,0xbbaaf637,0xbbce7418,0xbbab3114,0xbb2fd56d,0xbb7f13c8,0xbb7e548c,0xbb2cb154,0xba1681c1,0xba07e931,0xba9b9e76,0xba3e543d,0x3b2c952a,0x3a3d7b50,0x3ad6dca8,0x3ac471ca,0x3acb9821, +0x3aef0444,0x3aee33e5,0x3b110a41,0x39a19ac8,0xba72bb7d,0xbb0f5ce2,0xbb5a8613,0xbb978026,0xbbc55d0f,0xbbda98c4,0xbbeadabb,0xbbf49114,0xbc0103ae,0xbba33e5f,0xbbd598dc,0xbaff4c9a,0x3ad9ec4f,0x3b9c9b61,0xbb660b8e,0x3ad192f3,0x3bade22a,0x3bc69fbe,0x3bd5980e,0x3bcd2c14,0x3bf16544, +0x3c018160,0x3c03f51d,0x3b54c9d8,0xbaabbddb,0x3bf3db25,0x3b7091df,0x399251f5,0xbb2848da,0xbaeb8c78,0xbb0008e9,0xbaeb1f3d,0xbaeead71,0xbaefdd26,0xbad2ac05,0xbb1261a2,0xbb3169e4,0xbb558c35,0xbb7adc37,0xbb8dee77,0xbba0e4e5,0xbb9bfd2a,0xbb9ecbc1,0xbba381ec,0xbba9b220,0xbb7a8c7b, +0x3b6f5a5c,0x3b4ef68b,0x3be45b3f,0xbb4704a9,0xbc05112f,0xbc0764d3,0xb98e0858,0xbbdf3507,0xbc1272ce,0xbc12cd1e,0xbc0eca98,0xbbeeeacb,0xbc05a7b0,0xbc05ded0,0xbc0008fe,0xbbf16c80,0xbafd5d14,0xbc1297d5,0xbc001941,0xbb6e8181,0x3bbe50f5,0x3b64eacd,0x3b81d19b,0x3b811958,0x3b622857, +0x3b488df4,0x3b1ce208,0x3b2c8626,0x3b406e0c,0x3b800c0d,0x3b67b13b,0x3b693569,0x3b80a87b,0x3b444db6,0x3b2d97a1,0x3b156aa2,0x3b488773,0x3b794d90,0x3b9a3cda,0xbc04d97c,0x3b32439b,0xbaf710eb,0xb9f3c140,0x3afe624f,0x38f4bdf5,0x3b5cebbe,0x3b21d52f,0xb9ba67fe,0x3b3138ad,0x3b4dd9eb, +0x3ad52882,0xbab2c9e8,0xba90398b,0xbb08a022,0x38edbb99,0xbbdfcb20,0x3b41d566,0x3bae5546,0x3b90f270,0x3b9b67a8,0x3b5e3ee6,0x3b1ed1a5,0x3a9f9bfe,0x3ac9cbf0,0x3b2394eb,0x3b9ca585,0x3b856c0d,0x3b77c391,0x3b7bce7b,0x3a9ba9bd,0x39bb11bb,0x39b99251,0x3ae2c5cb,0x3bc1768b,0x3bf4b13b, +0xba02b31b,0x3adb2290,0xbaa15d23,0x3aa9e2db,0x3afd894b,0x3a811f9e,0x3aaa3ac1,0x3ba73240,0x3ac5a0ed,0x3c01c344,0x3b45ee32,0x3b83042f,0xba915014,0xba3fc453,0xbb02c50a,0xba521c00,0xbb1dc82e,0x3ae7cc3c,0x3bf2c6f9,0x3bb66e3c,0x3bc28533,0x3b530879,0x3aa533c6,0xbafa16b3,0xba5cbb08, +0x3a44b583,0x3bbacaad,0x3b892dbe,0x3b85a6cd,0x3bb76aa4,0xb9cbfbc6,0xbad6899e,0xba95cdac,0x3a427ea8,0x3bc2b8a7,0x3bc1ec06,0xbb0dd8b6,0x3b0f4558,0x3b11f5c8,0x3ba22472,0x3ba4b550,0x3b0079b4,0x3b8fd46f,0x3b8cd284,0x3bc24986,0x3c0af8b0,0x3c0515b2,0x3bae069c,0x3b4748d8,0x3b1d8724, +0xbb29ec36,0x3ac24476,0xbb31652f,0x3ae55a6f,0x3c079902,0x3bc3ebf9,0x3bcfb206,0x3af94a2a,0xbaf69854,0xbb9f2e88,0xbb5292e5,0x3abf2598,0x3c0bbf41,0x3bad47c9,0x3b7b77b6,0x3b876596,0xbbc4c522,0xbc08435c,0xbb948db1,0xbae3bf9a,0x3c3ba993,0x3c1d8a7f,0x3ba140c3,0x3b7ab138,0xbbba6052, +0xbbc24ff8,0xbaa833be,0x3b0016ce,0x3bb0e87e,0x3c125eb3,0x3c2cc093,0x3b4871bf,0x3ab0a0d0,0x3b936e36,0x3ada1e67,0x3b4a6c2e,0x3b4aa39a,0x3bd350f2,0x3aebf71c,0x3b5383c1,0x3c34be93,0x3c1ce764,0x3c607671,0x3c2217b7,0x3c2d1ee3,0x3c480059,0x3b3925a7,0xbaca8cd2,0xbaebbc74,0x3ba1ca0e, +0x3c190ea6,0x3b9ecf56,0x3c6a455b,0x3c64e965,0x3b9d7ac0,0x3b9484f4,0x3c0a1239,0xbc1a4bc0,0xbcc7e49d,0xbc53d34e,0x3c436ef7,0x3b9e5555,0x3b843bd9,0x3bac231a,0x3b3efe65,0x3b00f59a,0x3ba81271,0x3bf7bbc5,0x3bd513a5,0x3b470bb6,0x3b8d0af5,0x3b47fec7,0x3a3b42ce,0x3a18498b,0xbb02ef63, +0x3afc6092,0x3b90c6b6,0x3b942108,0x3c395907,0x3c2ebd50,0x3c002a86,0x3b2cbb11,0xb8ce5827,0x3a99e5b3,0x3bee2af2,0x3b32825b,0xbaf72c79,0xbc01ee7c,0xbb2f469b,0xb990080a,0xba8e915c,0x3beb6c90,0x3c533a8d,0x3c35118e,0x3c033a67,0x3c0e83d3,0x3b5be4cf,0x3bb8895b,0x3b527c0a,0x37e6a2b8, +0x3b123422,0x3b63a3eb,0x3adb9926,0x3b12a456,0x3b2cc7c9,0x3b753627,0x3a53ead9,0xba2b9e28,0xba73de2e,0x3993dca3,0xbb294348,0xb93b6815,0x3af15208,0xb955afbe,0x3b310622,0x3b8ca553,0x3c03f27d,0x3c279a8b,0x3c448698,0x3c2eee3e,0x3c3bcbf8,0x3bbe0a03,0x3b817cc1,0x3b700f4b,0x3b384976, +0x3bb3dbfc,0x3c183b77,0x3c2dc3d8,0x3b1e83a0,0xbb280ef7,0xbb5ab3b4,0xbb0c22dd,0xbb70ce2f,0xba0ae622,0xba9dc2f7,0xba93ba76,0x3ac1057f,0x3b1c9180,0x3abd3e81,0x3b5dc894,0x3b2e03fa,0x39352ba9,0xb8fb257e,0xba472a25,0x39ff533f,0x390bca57,0xbafe9c3a,0x3b5252bd,0x3be6c043,0x3be36360, +0x3be797ab,0x3b808da6,0x3ac8dadb,0xbb0af084,0xbb9f291c,0xbb8d6755,0x3ae28946,0xbac5c89a,0x3b647c64,0x3c82b059,0x3c501fef,0x3c3a9ed7,0x3c1d7dc8,0x3b71ff32,0x3a86880e,0xbbfb65eb,0xbc6e9276,0xbc2cc9b7,0xbc09d810,0xbc2a6245,0xbc013e6e,0xbbc8f4b3,0xbbaaeb2a,0xbb0f102c,0xbb2527e5, +0xbacff560,0xbaceb6a9,0xbb45ae7c,0xb993c551,0x39a2d54c,0x3a1081e8,0xb98dd328,0xbb2fa200,0x3aa8b919,0x3a20be44,0xba81a249,0x384fa401,0xb924f68b,0x39a8f9cf,0x3a6b2a1c,0x38d1e60e,0xba43d1a0,0xbaaceb33,0xbb3663a3,0xbb802b41,0xbb9401ee,0xba1e6d28,0x3b0a7210,0x3ba1b4c7,0x3a72f2d5, +0xbad1a14e,0xbbbee296,0xbc187a67,0xbc0147c3,0xbc28eec2,0xbc33e9e3,0xbc2ae98a,0xbc31f304,0xbc091407,0xbbe8803e,0xbbba7cc3,0xbbdb0ef3,0xbbb4b203,0xbb6260f1,0xba0f2a8a,0x3a377c39,0x3ad3b2c9,0x3ab69c39,0x3afd5dec,0x3ac8646b,0x3b136188,0x3b14cd3f,0x3ac7f37d,0x3af2fe76,0x3af2699d, +0x3ae04400,0x39cae6c6,0xb98ae78b,0xbaa5b5bf,0xb851efc3,0x3ad556a3,0x3b3a9807,0x3b01853b,0xb99fd4cf,0xbafb8d0a,0xbb552e97,0xbb4e7461,0xbbbb9809,0xbc1005bf,0xbbccf695,0xbbe346ad,0xbbb448c6,0xbb9819a6,0xbb54df7f,0xbbac7078,0xbbb26c4d,0xbbfb89d8,0xbb8e5a92,0xbb75b7aa,0xbb05b1d5, +0xba85008c,0x3a5c167b,0x3b214dd7,0x3af8f344,0x3a0bd1dd,0x3b2615a3,0x3b745023,0x3b164aa4,0x3b052d4e,0x3b282c3e,0x3b540ccd,0x3b88636a,0x3b1f45e5,0x3a52e797,0xba81da04,0xbafab16c,0xbb511fda,0xbb7ba007,0xbb9521c0,0xbb988d64,0xbb93562e,0xbb9b7761,0xbb9f4672,0xbbd0c714,0xbc2d38d6, +0xbbc3b99b,0xbbf99eb4,0xbbe912da,0xbbb80327,0xbbb33a09,0xbb7dae67,0xbb6a006d,0xbb982c1e,0xbb4a5768,0xbb0d0d64,0xbb107e27,0xbb16aa24,0xba6e4bce,0x39b5224f,0x3ad9f07b,0x397be179,0x3b8d96d6,0x3b794244,0x3b77aa49,0x3b79f0e7,0x3b6fa3a2,0x3b5ed5de,0x3b59d5eb,0x3b5aef1f,0x3b67f17c, +0x3b683810,0x3b5ff28b,0x3b568916,0x3b469931,0x3accdcf8,0xb93d8f7c,0xbaef9351,0xbb6c9146,0xba51a557,0xb9ec7d0b,0xbb978a1a,0xbbe83bf8,0xbbe5d60d,0xbb40f783,0xbbd1accf,0xbbe6a235,0xbbe862de,0xbbe46062,0xbbc95990,0xbbd9a6d2,0xbbde8ffd,0xbbd66d63,0xbbad37d7,0xbabd54f2,0xbbba58a6, +0xbb8d1bcd,0xbaaabaf2,0x3b468f59,0x3b009bba,0x3b105f94,0x3b0d106f,0x3b0d47e0,0x3b0fd60b,0x3b0facfd,0x3b09c939,0x3afe118b,0x3aed1ee2,0x3adc2e73,0x3ac8248d,0x3acade06,0x3a751905,0x3a1a99fe,0x397f201b,0xb920247b,0x3aafaa0c,0xba0426c3,0xb9924875,0xbad177fb,0x3be3375d,0x3c16bebe, +0x3ba3c256,0x3b9838a2,0x3c0ae456,0x3bd1a769,0x3be73ed7,0x3be47ea5,0x3bb3f1f7,0x3bd9de42,0x3bd3f04d,0x3bb7dba7,0x3c05dd38,0x3b9af391,0x3b8b4e52,0x3c01744f,0x3bcfb491,0xbb038263,0xb8181f6e,0xb9878e38,0xb9fab549,0xba7cd941,0xbaa2a535,0xbac4f011,0xbaabff6e,0xba93a4f2,0xba10593f, +0xba2639ac,0xb9fcc659,0xb93010a4,0xb9cf2ef5,0xba06e3a4,0xba51ee3e,0xba2f56af,0xbaa62553,0x3ae7eb9d,0x3c08de8a,0x3ae0b0b2,0x3b915faf,0x3b98c3e6,0x3b43b1e0,0x3b07cd67,0x3ac85a1e,0x3b5cd8bf,0x3bbc11b3,0x3b98678b,0x3b60f1ee,0x3b850795,0x3b4548aa,0x3ac19deb,0x3b1d8303,0x3a94ba03, +0x3bc99852,0x3a94591b,0xb6da312a,0x3a821698,0xb9d8332d,0xbb013f5f,0xbb51ce50,0xbb655d80,0xbb47b3cc,0xbafb139a,0xb9389355,0xb986a154,0x39421f80,0x3a3d4a2d,0x3984eed4,0xb99e9a3c,0xba9763c1,0xba232353,0xbaaeac80,0x3ba0dd48,0x3c0e0c1d,0x3ba6afd1,0x3b85433d,0x3b964928,0x3b9c4b5f, +0x3b0c4de7,0x3bb5b28a,0x3b57997f,0x3bdcc832,0x3b7c17c0,0x3be20597,0x3b81228d,0x3b735c7d,0x3a455244,0xb95b9c89,0x3ac11789,0x3b988283,0x3b1bd2bb,0x39fa0e89,0x3af9b719,0x38a63bcd,0xbb20311f,0xbb8dcf2f,0xbba21743,0xbb94a031,0xbb535ead,0xb9ba137d,0xb9c03643,0x3a1e6137,0x3b0076fd, +0x3a853d2f,0xb96ab954,0xbb149076,0xba53e40a,0xbb29429a,0x3bb34cfd,0x3bd3310b,0x3b50fa4d,0x3b2415a3,0x3bcba37a,0x3b951497,0x3a82fd10,0x3b4e0aa4,0x3b86a46c,0x3b6b1580,0x3c0aa8b0,0x3bf79891,0x3b5f3d52,0x3adc1b4f,0xba8c0005,0x38e00389,0xbae1cc4b,0x3b6ad293,0x3adb3bc2,0x3ab7bdaf, +0x3b7a830a,0x3a146e2c,0xbb8977ce,0xbc04b916,0xbc09f5eb,0xbbdf7e7b,0xbb2b5b7f,0x3ade476d,0x3ab8e5a2,0x3b358555,0x3b8d83d0,0x3b091d8f,0xba261a5d,0xbb4901be,0xba38d4bf,0xbab15d13,0x3c63649a,0x3cb1fd77,0x3c658bf1,0x3ae764a5,0xbb029159,0xba9b5ddb,0x3b4cacbf,0x3b9cea15,0x3c08db1d, +0x3c40ca96,0x3b4d1596,0x3a27b0a7,0x3b976a71,0x3afa1fd5,0x3b0230cb,0x3baec0d7,0x3b9d605e,0x3c17e6a4,0x3be8e42a,0x3a7bd655,0x3ab8e241,0xbac89109,0x3b500b8e,0x3b16a778,0xbabdcb75,0xbc4311c5,0xbc8ab419,0xbc872547,0xbbed4088,0xb9fe5731,0xbacb5038,0x3c0dd3b6,0x3bf2b9f7,0xbb8ddac4, +0xbae9919e,0xbbe400fa,0xbc40c378,0xbc9c71d6,0xbc653d96,0x3c5ade10,0x3bdaffd1,0x3b505269,0x3b98c9c4,0x3b2081b4,0x3b0fc1e6,0x3b8af358,0x3beb3b70,0x3bd638b9,0x3af1f274,0x3b1ed371,0x3b0b1032,0x3b4b961d,0x3aa1781c,0x3b3a7bb7,0x3b46dc7e,0x39d18c42,0x3b95beca,0x3bf3f4bf,0x3beea071, +0x3baf1f00,0x3b7d2ad7,0x3af22394,0x3b2c1472,0x3bd869a5,0xb9f7fbd5,0xbb215594,0xbb1be9c0,0x3bc2448c,0x3be49705,0x39b848a3,0x3b43d057,0x3c5a9ff4,0x3c6d6214,0x3c6ae06d,0x3c245a0d,0x3bf322dc,0x3ba81be1,0x3bb25c83,0x3a6947f6,0x3b4c4790,0x3b38b0d3,0x3ac07592,0x3acd768e,0x3af2de78, +0x3b5ba3ee,0x3ae1fa74,0xba76adbb,0x3ae1a4c0,0xb931e503,0x3ad97c1d,0xb9e8fa08,0xbb94b893,0xbae264e9,0xba7c14fc,0xba27a535,0x3aa178f0,0x3b589aa1,0x3a8c16f2,0xbb1ef305,0xba0eebac,0xbc30ddb7,0xbc27785c,0x398b6248,0x3bc063c2,0x3c3f129b,0x3c603985,0x3c48a77c,0x3b7e3ae7,0xbb000832, +0xbb6b21c6,0xbb62afb2,0xbb103251,0xba44ade3,0xbabaf743,0xbabbec6c,0x3a949e72,0x3b0df546,0x3afce738,0x3b4c9927,0x3b142fd7,0x39273295,0xb9de3ee7,0xb8a50b17,0x3a1fbab3,0xb9e46606,0x3b22de98,0x3b1b5c62,0x3ad6d71a,0x3b66703c,0x3b673207,0x3b70dc27,0x3b39bb27,0x39970a71,0xb967bfc8, +0x3b2f85fe,0x3c30a74a,0x3bf4b7ac,0x3c1bf737,0x3c44f89b,0x3c844450,0x3c83dade,0x3c5494cc,0x3c3494ef,0x3bad594f,0x3bc588d3,0x3aaabbbf,0xbb557da2,0xbb8d0147,0xbbad127f,0xbba469b7,0xbb646ea9,0xbb143625,0xbb123585,0xbb07df75,0xbb1a12d2,0xbb0f63ef,0xbb37b18d,0xb9935a24,0x398eae89, +0xb8f73210,0x3a8200bb,0x3b53f981,0x3a9f2721,0x39b07a88,0x39f535c5,0xba722abd,0x3a383aca,0x3af47a06,0x3b84f4e7,0x3b891f11,0x3b8c5c4f,0x3b862d8c,0xb96b4b40,0xbb23384d,0xbbc1e7ea,0x3a56371e,0x3ba93135,0x3bb2a1de,0x3be98934,0xbb099921,0x3a596965,0x39a81ba6,0xbb093044,0xbbd5a385, +0xbc07f249,0xbc3056db,0xbc28728a,0xbc196794,0xbc01c658,0xbbef8dd6,0xbbd19037,0xbbb9007b,0xbb91d2eb,0xbac3b0ee,0x3a90428e,0x3b5c9ecf,0x3b102ca0,0x3aa1114d,0x3a874626,0xba174c98,0xba52d46b,0xbaa4ad3f,0x3a9e1698,0x3b1d6259,0x3b40ac24,0x3a2a7cd0,0xbad4ef99,0xbb6bf4b3,0xbb5962a9, +0xbb2e75dd,0xbb1c8a05,0xbb77c60f,0xbb828475,0xbb3e0bea,0xbaeb38e6,0xbbb5e871,0xbb846de4,0xbaf6790d,0xbb175f7e,0xba95ad85,0xbb05170f,0xbb35187c,0xbb5fb11c,0xbb7a2dc1,0xbbce59a7,0xbbbacd16,0xbbdc745e,0xbb7379f0,0xbb826255,0xba54108a,0x3a07c321,0x3b6ea7f1,0x3b59a36f,0x3b8f42e3, +0x3b2f1bbd,0x39c9380c,0x3a3e78f5,0xb9c73ccb,0x3956e68f,0x39d754c4,0x3a948f09,0xb7b1c9bd,0xb9fed480,0xba84d03d,0xbb25deaf,0xbb8ef893,0xbbc2617a,0xbbbbd25f,0xbbb05a0e,0xbbbd30d8,0xbba66c65,0xbbb24f34,0xbbc344a1,0xbb9dd903,0xbbd4a974,0xbba94c94,0xbbaca0d2,0xbbbd6d72,0xbbac03b9, +0xbbab859c,0xbb699790,0xbab0d7d3,0xbae202e2,0xbb02dc8a,0xba6e14b9,0x396666d7,0xb96069c3,0x3a240288,0x399fdfac,0x3b50eed0,0x3a217738,0x39e15417,0x3a4b56ba,0x3a2bc8c0,0x3a461544,0x3a21a3b6,0x3a23f272,0xb9a47755,0xba5c0e65,0xba8c19df,0xba8a736c,0xba43ec98,0xba292be2,0xbad55233, +0xbb2ccdde,0xbb68508c,0xbb8c8688,0xbb3b88c7,0xbb78ae8a,0x3a145589,0x3af17cdc,0xb7edc11c,0xb950092e,0x3b02fdd7,0x3aa35708,0x3adf5710,0x3af57ffd,0x3ab6cc80,0x3b0ede73,0x3b256666,0x3b21dc4a,0x3b7c9750,0x3ac9ec51,0x3b3adfb1,0x3b866ad1,0x3b254443,0xbaec76e2,0xba7053e3,0xba93f070, +0xba962686,0xbaa009c9,0xbaa7cc94,0xbaa45fb9,0xbaab4fee,0xbab10faf,0xbac45817,0xbad59136,0xbaec9eb3,0xbae14ca0,0xbb0525f0,0xbb0f96e6,0xbb1eec81,0xbb2e150b,0xbad41646,0xbb2ed98d,0xbb0b4192,0xba368776,0xbbd366f0,0xbbbb2e7c,0x3a96644a,0xbbc5c997,0xbbbb59e3,0xba71a7bf,0xb9cd3220, +0xb8fb7cfd,0x3a69dd4a,0x3a3e5c43,0x3a5e0ca3,0x3ac18928,0xbbc8ece4,0xbbe1b873,0x3a90a1fc,0xbbc1ecaa,0xbbe23bcd,0xbad3f5d7,0xbb049e6c,0xbb1c7e71,0xbb2d3871,0xbb501688,0xbb6870f3,0xbb845eb6,0xbb6ca550,0xbb5c419a,0xbb366ae2,0xbb515199,0xbb565d01,0xbb3e6222,0xbb7ffffd,0xbb7e78e5, +0xbb40fdaf,0xbb3b2674,0xbaf2ad21,0xbb202484,0xbb5b7ac4,0xbb2d7d9e,0xbb814f84,0xbac238a6,0xbab7f1e3,0xbb2f4ef5,0xba9e7670,0xbb0e6424,0xbb4e33f6,0xbb11f1a1,0xba951f44,0xbb012d46,0xbb34ba22,0xbb59c06f,0xbbb4a13f,0xbb660467,0xbb513f10,0xbb673fea,0xbac68b30,0xbb4d9c99,0xbb829b21, +0xbbb1c85b,0xbbc86ca2,0xbbd956e7,0xbbb52db5,0xbb986a31,0xbb6ef209,0xbb945c04,0xbba759f9,0xbb9a218a,0xbbf279d6,0xbbe8f886,0xbb86f286,0xbb80483f,0xb9bad91f,0x3ada2560,0xbb19a63f,0xbaa356f1,0xbaff14e4,0x396bd15b,0x3a864618,0xba82567a,0x3a931301,0x3b605ab1,0x3a1beffb,0x3b847ed3, +0x3b0e12d7,0x3abf4d15,0xbb0a934d,0xbb65136d,0xbb809df7,0xbb552569,0xbb81f67f,0xbb1e4962,0xb9bfda19,0xbb26df07,0xbb9a2fe7,0xbbf8c96e,0xbc1a5af1,0xbc3979d2,0xbc143261,0xbbfb469a,0xbbaa1ce2,0xbbde2f6c,0xbbfcd0b5,0xbbbc9a98,0xbc404f23,0xbc2e44bb,0xbb928e5d,0xbb9d66ba,0x39d84150, +0x3aecd98c,0xbb1bf3e2,0xba950819,0xb934fbe8,0x3b8f5947,0x3ba6c8a4,0x3afbc8be,0x3b87ec19,0x3b89dc98,0x3bb9c8b3,0x3c0f9ae2,0x3bfbfd1a,0x3ba8a1e9,0x3ab89eba,0xba787b9e,0xbb8879b3,0xbb1117d9,0xbb3fc0d7,0xbae627dc,0xb81aecb9,0xbb826904,0xbc06b747,0xbc55006d,0xbc818482,0xbc83c330, +0xbc44b56d,0xbbf9fefd,0xbb934615,0xbc090175,0xbc2a487b,0xbc103449,0xbc93b0e4,0xbc844f4a,0xbba377d3,0xbb99fc25,0xbab1aa4d,0x3b787e9f,0x3bdba318,0x3bcdd1e4,0xbad25e5c,0xbbdc579e,0xbba007cf,0x3a16d792,0x3b206ad3,0x3bd81715,0x3c4c64a2,0x3b5568e6,0x39a0593d,0x3b47648a,0x3a32598b, +0x3af7e4e9,0x3b2eca46,0x3b60dc35,0x3a9d4719,0xba46a189,0x3a8dbc6b,0x3b249865,0x3bb6b717,0x3ba96f24,0x3ba2694c,0x3b779324,0xbbb3cb9e,0xbc2d57ff,0xbc512b22,0xbbbd3a0e,0xbb85bacd,0xbc4efeb5,0xbb1492f0,0xbae75b8a,0xbc1c9cf8,0xbbeb9bcd,0xb98b1651,0xbc3a5596,0xbcf2656f,0xbc9fbf7d, +0x3c172d7c,0x3b9f5f49,0x3b84962a,0x3b6bfa3e,0x3b27e377,0x3aff6217,0x3b68b5f4,0x3be8064b,0x3bd4a95f,0x3b28254d,0x3b02faf2,0x39c92027,0xb892e332,0x39f6c089,0xb91e31a0,0xba56bbc5,0xbb76dabb,0xbbb00ef9,0xbb7ee7ce,0x39257e72,0x3a4ac485,0xba66b898,0xba8eb7f4,0x3a8c2906,0x3be608c2, +0xbb6759d5,0xbc051562,0xbc144bcb,0xbb854856,0xba4fc2d7,0x3adffc20,0x3b10fb63,0x3c3e0947,0x3c720380,0x3c6f0a46,0x3c4e7bad,0x3ba90946,0x3b8d3736,0x3b5fa505,0x3ac9dc7b,0x3b334b3f,0x3b53716b,0x3a9e40cd,0x3abece9f,0x3ae8d324,0x3b4c8706,0x3a5af84f,0xba9e397b,0xba26c7b1,0xbab46104, +0xbb85f1ab,0xbb5a9e40,0xbaa01664,0xbaccddd8,0xba8dc8eb,0xbab0940f,0xbaf45d1b,0xbb565f5a,0xbb8e4f17,0xbb9a55e8,0xba072a87,0xbc010285,0xbc5ccf60,0xbc9ddd36,0xbc7f930d,0xbc2cb3be,0xbc013da4,0x3b9e0667,0xbc245b15,0xbbc6c01e,0xbbe699a9,0xbbbda77a,0xbb05b88f,0xba972e55,0xba884fc7, +0xba4be99b,0x3a44cbcd,0x3af0199a,0x3ab1dd11,0x3b23ad54,0x3adcd704,0xba74e38c,0xba90fb40,0xbadf1a64,0xbaa9a742,0xba484c42,0xba819e01,0x3a99d894,0x3a39d803,0xba3eff9d,0xbaa36a0d,0xbaf93398,0xbb28cc55,0xbb9ecc51,0xbbe4046c,0xbbb29039,0xb7d4f9e7,0xba8f540b,0x3b209e35,0x3c0f2040, +0xba5185c5,0xbc08328a,0xbc87cc8c,0xbc519fab,0xbc7bc3a7,0xbc2b92a6,0xbbc82e4a,0xbbe5fefa,0xbbe72063,0xbbd350b2,0xbb9c2f73,0xbb9ae99c,0xbb8ca215,0xbb4937aa,0xbb7c0284,0xbb4ed5e7,0xbb3bb320,0xbb661b54,0xba93427b,0xb9bb8822,0x3a106916,0xba9d6fe9,0xbb212f0f,0xba5599dc,0x3a0c9324, +0x39bc1dbc,0xb8c9330f,0xba5c115f,0xbb13b4d8,0xbb8718eb,0xbba51e8b,0xbbe90056,0xbc30de5b,0xbc1a488c,0xbc389545,0xbc834974,0xbc7c0a23,0xbc6d065c,0xbc54b50d,0xbc81de93,0xbbdca459,0xbc11607f,0xbbad0fda,0xbc00d088,0xbc36b9f4,0xbc4c9339,0xbc454a16,0xbc3f5f75,0xbc1db0a6,0xbc01aaf8, +0xbbd6848f,0xbbd5d2aa,0xbbbf153d,0xbba1ed35,0xbb365135,0xbacaf6da,0x39eaf34f,0x3a4cb23e,0x3aad7dea,0x3aaa76a1,0x3a0610ae,0xba7d9800,0xbb17bfec,0xbb4c57ba,0xbb326ad0,0xba840c6e,0xbaa33236,0xba306225,0xb9115d65,0xba8bc5b5,0xbafac79e,0xbb6306c1,0xbb2cb5f9,0xbb722087,0xbb80ebb0, +0xbbc7704e,0xbb941cc9,0xbba6dfe7,0xbbe92762,0xbbc23840,0xbba4dcd9,0xbba818c3,0xbbb0bc86,0xbbb6a806,0xbbd87cf9,0xbbedb172,0xbc13838c,0xbbebb274,0xbbc47b18,0xbbb60b58,0xbb35da60,0xba341a44,0x3b04bd91,0x3a907b70,0xb9611796,0x39a65708,0x3a6117f7,0x39b33183,0x39d72a8e,0x39da0fc0, +0x39bf4bdd,0x39e89a60,0xbac6918b,0xbb5726a1,0xbb9f144c,0xbbd6644a,0xbc033475,0xbc1b60e9,0xbc0d0748,0xbbfaa8e7,0xbbd431de,0xbbc46d11,0xbbbc1c47,0xbbe22130,0xbbe56826,0xbbdd6f76,0xbbfd8142,0xbbecb451,0xbbe8134e,0xbbe9d0b3,0xbbceac9e,0xbbd3108f,0xbbd69fd4,0xbbca811a,0xbbaa72d7, +0xbbaff2b7,0xbb893167,0xbb4df246,0xbb4ff4b6,0xbaba2885,0xb9b9c9a5,0x3a77b771,0x3aa31c50,0x3a6a42c6,0x3a5f8551,0x3a38d676,0x3a16667f,0x3a1cad2e,0x3987d2fd,0xb90787d4,0xba4de623,0xbab9c94b,0xbb0b81df,0xbb4fa272,0xbb631958,0xbb8b8279,0xbba07598,0xbbb76b50,0xbb6c033a,0xbb678e18, +0xbbcf2656,0xbbc4243c,0xbb1080e7,0xbbc413e5,0xbbc179b9,0xbb47d2c1,0xbb3cef30,0xbb296db5,0xbaeec373,0xbaed72ad,0xbad2ce99,0xba972808,0xbbae27e0,0xbba55d8a,0xba22c16b,0xbb8a5cca,0xbb82ee5c,0xba58588d,0xbaac38e5,0xbaabc667,0xbaa6e285,0xbaaa9351,0xbaab18ed,0xbaa69176,0xbad9c0e4, +0xbb01b79b,0xbb13d314,0xbb28b8fe,0xbb3b6030,0xbb5040e1,0xbb569704,0xbb5a9990,0xbb5b4a27,0xbb663a19,0xbb4741cb,0x3b7ed5d1,0x3b55b133,0x3b9e2f52,0x3bca17f2,0x3b2dc633,0xbbc05ed0,0x3bda3c50,0x3b582ef1,0xbb805a61,0xbb69aeb7,0xbb6c8c1d,0xbb8c0aba,0xbb8af69f,0xbb93f8bf,0xbba49430, +0x3b2c7fe0,0x3bbb4205,0xbbe42f38,0x3afa35d5,0x3baee675,0x3b88e1d8,0x3b7a5228,0x3b8c2957,0x3b821538,0x3b6c3b51,0x3b5d30a0,0x3b4b3450,0x3b607dee,0x3b6de366,0x3b83d63b,0x3b877c08,0x3b8deed0,0x3b9c3c68,0x3b8a9c56,0x3b7a2970,0x3b3c22a3,0x3b5e4ccd,0x3b3837d6,0x3bd91fe4,0x3a69f25b, +0x3b9d9443,0x3b37528d,0x3b5fb8d7,0x3b9599f8,0x3b282ad7,0x3b94b5e1,0x3bbaca25,0x3bb5021f,0x3bcb1d85,0x3ba00857,0x3bafda09,0x3ae066d2,0x3a94d9f9,0x3b325585,0x3b0862c7,0xba168378,0x3baebebe,0x3bad2494,0x3bc8b4e8,0x3ba86323,0x3b82678e,0x3b4c1d36,0x3b313bba,0x3b6a9fdb,0x3b9526ac, +0x3bb64bb5,0x3bbee799,0x3bcb148c,0x3bded3f1,0x3bb6bda6,0x3b8a8a54,0x3af72c20,0x3b3ce03a,0x3b4f399f,0x3c0dd52e,0x3bf6463e,0x3bbb1d3b,0x3ae73f4d,0x3b862ea6,0x3b8cc232,0x3afd183a,0x3b937056,0x3b95216a,0x3bad159e,0x3baf5c21,0x3b8fb6ec,0x3ba4cb92,0x3ad168cb,0x3a4a72bc,0xb9321d1f, +0x3a8150fb,0x3b370f95,0x3b9a4735,0x3becd1ff,0x3bfb2f43,0x3bd40183,0x3b8fb4c8,0x3b3d7a00,0x3b039108,0x3b5e44a3,0x3b9d4c04,0x3bdd3b9d,0x3bf94cb0,0x3c0b82bd,0x3c27a704,0x3bf0eec3,0x3b95807e,0x3a0d41ba,0x3b13018f,0x3ac26055,0x3bf78b6d,0x3baa2322,0x3b8d7294,0x3ad2791e,0x3beb2850, +0x3bc63acb,0x3aacd279,0x3b8826ca,0x3b935da0,0x3b8fa305,0x3c015d72,0x3c0108f0,0x3b9bdb48,0x3ae6936c,0xba08cba6,0xbb0616ab,0xba6b3cf2,0x3a463ed1,0x3b861837,0x3c1476f3,0x3c2d7097,0x3c0d6469,0x3ba1e91b,0x3b19a4f8,0x3adaac91,0x3b917c7d,0x3c025202,0x3c299615,0x3c311659,0x3c3e4abc, +0x3c5c8081,0x3c097ffc,0x3b65647f,0xbae8d5bc,0x39e06a8a,0x3c22642a,0x3c864e7e,0x3c9ef475,0x3c6f3181,0x3ac9e8e1,0xbbaa9f83,0xbb84688b,0x3ae6eb83,0x3b29683e,0x3bdbacf5,0x3c54e2de,0x3b6d9f34,0x3951216f,0x3b3f8404,0x3ab915b8,0x3b3ed18e,0x3b8fc94a,0x3be3c367,0x3bf7632a,0x3c0b3807, +0x3c2093a4,0x3bf2d1a0,0x3bacf285,0x3bd27b36,0x3b8eedc9,0xbade8ff0,0xbbac9998,0xbbdfd3e5,0xbbb21b9b,0x3b96a3d6,0x3c312a49,0x3c083e65,0x3c819e09,0x3c560429,0x3994f62e,0x3ba74f75,0xbbadff8b,0xbbf3b1c9,0xbca1e32b,0xbc6d1a53,0x3c5fdad9,0x3c0d73e8,0x3ba79b34,0x3b77c874,0x3b2f8b25, +0x3b2e8b41,0x3b4ff7b1,0x3bdcdb69,0x3bda87ea,0x3b319de0,0x3b342bc0,0x3b134a27,0x3b64217b,0x3b0ee243,0x3a9441e1,0x3b59f8ab,0x3bb864b1,0x3c1b5944,0x3c7279be,0x3c523022,0x3c1237ba,0x3b946af7,0x3ab1dcf6,0x3b2801ac,0x3c0fdc6e,0xba9fefad,0xbb612080,0xbb00abf9,0x3be73aeb,0x3c12965f, +0x3b847c64,0x3b28514a,0x3c78eb7c,0x3c9840ab,0x3c8601b1,0x3c50cf30,0x3bc0c454,0x3b817388,0x3b98edd9,0x3b7a9f87,0x3b8a49a7,0x3b67f369,0x3adf1ef1,0x3aee1a76,0x3aebc3a4,0x3b35dd97,0x3b16f416,0x3a9a937f,0x3ab818c8,0x3ad205d0,0x3af3b3c5,0x3a717462,0xb9c95899,0xb9d7974a,0xb9956933, +0x3c01f0f4,0x3c6e0902,0x3c92a473,0x3c845ade,0x3c28e7af,0x3ba6983f,0x3987f4d0,0x3ba3f005,0x3c69db7f,0x3cdfcb11,0x3cf664e2,0x3cc4b46e,0x3c82013c,0x3be6b3ff,0xbbaec471,0xbbe90475,0xbb51826c,0xbaa0e622,0x3a8aebd4,0xba269373,0x398ca26a,0x3a23bc0e,0x3ab01a49,0x3ada09a7,0x3b15d690, +0x3aab811c,0xb923bb3b,0xb9d8e890,0xba3a907d,0xb848ecb6,0x3a1574b4,0x3a8cc421,0x3b1dee65,0x3b9370a4,0x3bf8ff11,0x3c161178,0x3c1c93dc,0x3bedec74,0x3b3ed899,0x3b6597ca,0x3bd20e75,0x3c39602f,0x3c375f55,0x3c5d68c5,0x3c6c33ac,0x3cc8947e,0x3ce7f303,0x3cf674bb,0x3c90dfb2,0x3c9416b1, +0x3c2abf5c,0xbb37c942,0xbad3959d,0xbadd113e,0xbb36778a,0xbaf51666,0xba75412c,0xbab8f926,0xba8303d0,0xbb09f532,0xbb391912,0xbb3243b4,0xbb0e25f2,0xba88b4d7,0xb9a24cf2,0x3a8e351a,0x3aca109f,0x3ae5966d,0x3b256d1b,0x3b1b555f,0x3ad29807,0x3a8c813f,0x3aeb6f2b,0x3b7445b5,0x3beee889, +0x3c053fdf,0x3c0f8119,0x3c1a963f,0x3bf190da,0x3bf4e8dd,0x3be9875f,0x3c498fe1,0x3c73add0,0x3c858b3e,0x3c8a3317,0x3b960269,0x3b486ec3,0xbb808f59,0xbb5f865d,0xbc14ba58,0xbc1abbf1,0xbc292fd9,0xbc22671b,0xbc08318f,0xbbed2a1d,0xbbd00c1e,0xbbb11c8e,0xbb996ceb,0xbb9282ce,0xbb0c5165, +0x39036567,0x3b441dc3,0x3af33251,0x3ac67ff9,0x3a5097cf,0x3ade02f1,0x3b1b9d57,0x3b00739d,0x3b63c6ef,0x3b8a19f1,0x3bbc7d41,0x3b824c30,0x3acd122b,0xba86b090,0xba640de4,0x3ad9b762,0x3bf563b6,0x3ba065e6,0x3b8d4a1d,0x3ba3d094,0x3b9512c5,0x39fc6217,0x3926f142,0xb9878359,0x39499014, +0xb9e2e470,0xbad91fe5,0xbb631b1c,0xbb9cbe3b,0xbbc2c997,0xbbddb173,0xbbf26476,0xbbe2a6de,0xbbda1fc8,0xbbc7dc58,0xbb4a2824,0xb9ea6ada,0x3b2347f6,0x3b1dd844,0x3b506b9a,0x3b7119e7,0x3b217639,0x3adf40c0,0x3a3acf79,0x3a0145b6,0x38f49714,0xb93b2db8,0x3a059eea,0x3ad65dcb,0x3b2fe718, +0x3b116130,0x3a875696,0x39901e1f,0x362dd97d,0x399e9f2f,0x38decd76,0x3937197a,0xbaefe7fa,0xbaf667dc,0xbbd1aede,0xbb6d108d,0xbb91af68,0xbb9adc5f,0xbb7381f0,0xbb80a0f3,0xbb2dfb94,0xbaceaa30,0xba97c711,0xb9aa33b0,0xb9e52e88,0xb9039bac,0xba182a5e,0xba8959ae,0x39db5da8,0xb93df701, +0x386d202f,0xb9ed4662,0xbaa8054b,0xba418292,0xba4b5eb0,0xba36dd10,0xba33f642,0xba5bb6b6,0xba0e5f1d,0xb9923841,0x39a48126,0x3a8b8d76,0x3b0e6c91,0x3b491e01,0x3b0fd04c,0x3a93c576,0x38f5a5d0,0xba351437,0xba276400,0xba046636,0x3a05d057,0xba94d413,0xbbb58226,0x3a8e4b36,0xba49f865, +0xbb94e26a,0xbb97a2c9,0xbb9a9d5c,0xbba0798b,0xbba1a50b,0xbba2b7f4,0xbba58084,0x397bed2b,0x3ad6d125,0xbb857797,0x39d3a646,0x3ad687c9,0xb9d22565,0xb8f92b0c,0xb909d651,0xb972e18b,0xb988cf37,0xb99940f6,0xb9b2f578,0xb8a558f2,0x38f1dbbc,0x39827e92,0x39d6ad7e,0x3a0369b0,0x3a7c90b0, +0x39e7b8d9,0x3990eb25,0x385c3a8d,0xb909a292,0x38fef46a,0xbbc8201d,0xbba5b6b8,0xbbd0e3f7,0xbb77bdcf,0x3ab501c6,0x3c0aabe7,0xbbc177b7,0x39827b64,0x3be29324,0x3c013ce1,0x3c03b705,0x3c002f26,0x3c0b43e2,0x3c0cb1c8,0x3c127469,0xb710faa1,0xbbbec908,0x3c0fde31,0x39fa98d6,0xbb871622, +0xbbdd8faf,0xbba6e706,0xbbc31a61,0xbbd0792c,0xbbddd44a,0xbbe4e24f,0xbbea517b,0xbbda10a7,0xbbd55b4a,0xbbd0f00b,0xbbdb5226,0xbbde02bd,0xbbd36d52,0xbbea8c2a,0xbbe34a07,0xbbb6fc09,0xbbc4a14b,0xbbb61a79,0xbbc52471,0x3b7eff16,0xbba042fc,0xbb31307d,0xb92bd6e2,0xbb0b5d43,0xbb390452, +0xbb56f4ac,0xbb559ad2,0xbadf6dd2,0xbb57db04,0xbb2f00c0,0xbb0ece33,0xbae0ee4e,0xbb4b9819,0xbb9c08ed,0xbb8b02e4,0x3b2631a8,0xbbcab3a8,0xbbbf7a01,0xbbe4f73a,0xbc0f6404,0xbc22bd43,0xbc29314e,0xbc24d86b,0xbc0a2a4d,0xbbfa1d7a,0xbbfce80c,0xbc0bd435,0xbc1406c7,0xbc093962,0xbc24cfef, +0xbc186556,0xbbbfda47,0xbbd352c6,0xbbafb6ea,0xbb0605a7,0xb7d22329,0xba9ccb59,0xba7b0a1d,0x3a45bce1,0x3abd7275,0xbabf5b83,0x3b26fb3d,0x3b0be52b,0x3b07f1d5,0x3a032a3d,0x3b1ff242,0x3a199b41,0xba8484b9,0xbb800bec,0xbb6dc12a,0xbb541e40,0xbb0096e6,0xbb69cbdb,0xbbbe6cd4,0xbbe33391, +0xbc2c72d4,0xbc51bd70,0xbc6478e4,0xbc64ce0d,0xbc37f4fe,0xbc277d8f,0xbc24f043,0xbc39fa78,0xbc49e136,0xbc2ac7dd,0xbc6716d4,0xbc4a5ace,0xbbb6c913,0xbbe8c8fd,0xbba6b0e0,0xba633fa9,0xb8759cec,0xbb2f754f,0xbb11d161,0x3b87ed72,0x3ba3a2ee,0x3abd9357,0x3b778e43,0x3b8b6224,0x3b9205eb, +0x3c014a7b,0x3bd43f2e,0x3b87bedc,0xb9a6dd3d,0xbb713ff1,0xbb53ce84,0xbb95b2ca,0xba8a7ac6,0xbb45fa18,0xbbc22fe4,0xbc0f26ee,0xbc7c4a2a,0xbc9e98e6,0xbcaac420,0xbc999595,0xbc56d116,0xbc1acff2,0xbc22b72d,0xbc5a6152,0xbc7314df,0xbc4f4c07,0xbc90531f,0xbc6d32bb,0xbb866927,0xbbad531e, +0xbc27fc30,0x3b3a1aef,0x3c577378,0x3c358b25,0x3b4e8339,0xbbc9c384,0xbbf86097,0xba4b7568,0x3a0a9714,0x3b96fbd8,0x3c4a77b1,0x3b47dcba,0xb9d0fb75,0x3af84d09,0x3a0167d7,0x3a83618a,0x3b16d741,0x3a6cb6a0,0x3b4cd441,0xb9a7a748,0xbbbdb077,0xbb4ba166,0xbb55aadd,0x3a01be02,0xba5aa98f, +0xbba7c0c2,0xbc590690,0xbc92ff47,0xbc9f4a45,0xbc4cbcbb,0xbc3a344d,0xbc9bfa0c,0xbc2c53de,0xbc325a02,0xbc92dabb,0xbc61be71,0xbc33a5ca,0xbc7273f6,0xbcd58cd8,0xbca25bd6,0x3b8546df,0x3bbf22bb,0x3ba65db8,0x3b4b7ba8,0x3b0072a5,0x3af0cb18,0x3b115070,0x3bc733df,0x3bca89f2,0x3b268f41, +0x3a3488e8,0xba26c7a8,0x3a6d1bc7,0x3ab67d15,0x3b282f5a,0xbae0e00f,0xbbf4d00e,0xbc0999ca,0xbc34f3a1,0xbb9edc6c,0xbb22d578,0xbae57583,0xba5fb304,0x3ab03687,0x3bd41090,0xbbcb1819,0xbc165d6e,0xbbb59b10,0xbaef44b2,0x3ab9003a,0x3ba4a67c,0xbb03a341,0x3c2ae5bf,0x3c80ca5c,0x3c95e9cb, +0x3c5d468c,0x3bb250f9,0x3ad86da7,0x3b58bb21,0x3b86b38e,0x3b75b574,0x3b423350,0x3a826248,0x3a327909,0x3a580556,0x3b0874c3,0x3ab957d8,0xba53632c,0x38b7446c,0xbb19e689,0xbb666acc,0xbb955914,0xbb82c0c4,0xbb095d73,0xbb2ffbd7,0xbb7be926,0xbbdc1f3a,0xbc1a3eb3,0xbc41a10e,0xbc5561cf, +0xbc367f5d,0xbc888139,0xbcb19ff1,0xbce55e85,0xbc7fac84,0xbc24aa1d,0xbc6259d8,0x3b23b9f6,0xbc6b486f,0xbbd774b2,0xbc10ff69,0xbc00b40d,0xb9cc0ab3,0xbae562f9,0xbaaa7aeb,0xba34fd1a,0xb9bd5513,0x3a0fee4a,0x3a5a9a43,0x3a5e4e99,0x395c631e,0xba9fcf57,0xbade372f,0xbb0b65c9,0xbb1d2fe0, +0xbaa3eec7,0x3a6675a9,0xb9f4e57a,0xbb72eddb,0xbb94dbf3,0xbba3d402,0xbb7c4abc,0xbb5a1539,0xbb45682e,0xbb735fdd,0xbab0bb19,0x3b0fbd05,0x3b8ba6a6,0x3ba0a2f9,0x39eb0e66,0xbbe63777,0xbc73d446,0xbcbcf114,0xbc849504,0xbc8d7cc5,0xbb5adc92,0x3b954176,0xba839a8b,0xbb1ac04f,0xbabdab6c, +0xbaadbc25,0xbb0b0de9,0xbaf5b3a7,0xbb228090,0xbb4db400,0xbb77228a,0xbb6a43dd,0xbb41b3a3,0xbb014b0a,0xba7e6353,0x3a19293f,0xba89017b,0xb962e3c9,0xbabec9e2,0x39f6728b,0x3ae20693,0x39965df3,0xb9862825,0xbb0b7751,0xbb9f5394,0xbbb44144,0xbbf8dc5b,0xbc468392,0xbc27df9e,0xbc362724, +0xbc75ea26,0xbc8920fc,0xbc8f1abf,0xbc8d6471,0xbc92b16a,0xbc0937a5,0xbbf5a784,0xbafc51dd,0xbbe54585,0xbc20a452,0xbc45a6d4,0xbc491bce,0xbc2cc90d,0xbc203cc8,0xbc0614e1,0xbbeaab4b,0xbbc0a763,0xbbb28314,0xbbab5fdd,0xbb82bd3a,0xbb321fc4,0xba0f7145,0x3a7f7edc,0x3ac19d10,0x3ab3a421, +0xba0f1db6,0xbb200435,0xbb5c2b1f,0xbb8ec961,0xbb78cb1e,0xbabf496f,0xbac7bcba,0xba64ba56,0x38869be5,0xbaf1f2a1,0xbb95214a,0xbc05e7bb,0xbbd0586a,0xbbc425b8,0xbbc5597e,0xbbce1c43,0xbba9e848,0xbb6eb746,0xbb5392e8,0xbb80b24d,0xbb0436ac,0xbb746b26,0xbba9be12,0xbbe640d4,0xbbdeb234, +0xbc01a728,0xbc060eaf,0xbc0ad706,0xbbdae894,0xbbe9f231,0xbb7697bf,0xbaf7d7f0,0x3a8f6604,0x39e2de64,0x3996ae69,0xba36802a,0xbab7a3b1,0xba6548ab,0xba626180,0xba90326c,0xbad24481,0xbafd110c,0xbb5d91c2,0xbb964a19,0xbbb6f6af,0xbbeb9fef,0xbc050c01,0xbc1c78a0,0xbc0504f0,0xbbe7f889, +0xbbc9c6a0,0xbbb1680e,0xbbb09799,0xbbbae790,0xbaf95d63,0xbbb8edef,0xbba7fe08,0xbb9e0812,0xbbbb86c3,0xbbb9a0cd,0xbbc1ce07,0xbbc4e73a,0xbba181f6,0xbbbcc44a,0xbbb250a6,0xbbb13860,0xbb7b1ab4,0xbb782d0e,0xbb9aeee6,0xbb714216,0xba8b3fcc,0xbb1d80f5,0xbac8d9af,0xbaea8719,0xbae3a06d, +0xbad6cba8,0xbac47c2c,0xbaa4f04f,0xbb09df0e,0xbb44dfa5,0xbb83929a,0xbb9fe6d3,0xbbc16c25,0xbbecea2a,0xbbde0cf6,0xbbd8c82d,0xbbcdbd19,0xbbc22e48,0xbbabfff5,0xbbbba42c,0xbb9ca112,0xbb0e5ece,0x3b031d6d,0xbbbdbed9,0xbb25f895,0x3aa6cbaa,0x3acaae32,0x3aeed5af,0x3b01b934,0x3b22383f, +0x3b3b9cfd,0x3b4f6024,0xbb207051,0xbbb29461,0x3b51b5f1,0xbae724df,0xbb857f71,0xbb8c0fc1,0xbb808505,0xbb8536d4,0xbb8111d2,0xbb812c55,0xbb81243d,0xbb77cf74,0xbb8e701b,0xbb9a7717,0xbba6b955,0xbbb4974d,0xbbbf76f9,0xbbcfa248,0xbbc3e499,0xbbbed14c,0xbbb917df,0xbbb7567b,0xbbca9c2a, +0x3b8ba31e,0x3b62fb5a,0x3bdd5a52,0x3a348c15,0xbba4b3f4,0xbc2dde77,0x3b464fc3,0xbb73c719,0xbc1f7f9e,0xbc1c1a15,0xbc1a45b1,0xbc1110a2,0xbc209c68,0xbc239e41,0xbc1ebb94,0xbb92a8cb,0x3ac2dc1c,0xbc3a4d4d,0xbba846ae,0xb8c07f8c,0x3bc569e8,0x3b8272a3,0x3b960ad9,0x3b8ceaf4,0x3b842325, +0x3b7dd32a,0x3b6cd654,0x3b8642a4,0x3b8cdb04,0x3b933c30,0x3b943ded,0x3b978b96,0x3ba6310a,0x3b8a6c63,0x3b77c70c,0x3b49d315,0x3b70eacc,0x3b6e160c,0x3bc3bbab,0xbbc362d0,0x3b75ef27,0xbaaee745,0x39c557ae,0x3b4e748a,0x3a6fecb2,0x3b8cf6a8,0x3b87bb66,0x3b05d497,0x3b6d310a,0x3b4ee5e5, +0x3b5a8632,0xba80e012,0xba5c73f5,0xb986baaa,0x3a12bbb9,0xbbc9e0c4,0x3b987410,0x3bbd8e43,0x3bb5c1ae,0x3ba9542b,0x3b8f532d,0x3b85b204,0x3b76a0bc,0x3baab1a1,0x3bc2755c,0x3bc56fb6,0x3bc38395,0x3bbde970,0x3bcdb070,0x3b8bb6cd,0x3b4acc4c,0x3ad9550f,0x3b2ad492,0x3b8ffe06,0x3bf49c2c, +0x3b211bef,0x3b4fca9f,0xbafc39c4,0x3af3960b,0x3b171027,0x3a02a64c,0x3b1b9294,0x3b9edea4,0x3b2085f7,0x3ba65855,0x3a861c61,0x3b8f7d9a,0xbac56e3c,0xba6de3d2,0xbac9264e,0xba7fcfad,0xba9a655b,0x3b5d1add,0x3c039fd2,0x3bdd463d,0x3bc87553,0x3b8e558b,0x3b682841,0x3b271e8f,0x3bab5307, +0x3bd6c08c,0x3bf10734,0x3bfaeeb1,0x3bfb0bcd,0x3c1a9deb,0x3b97e15d,0x3b17ac23,0x3a03b0d8,0x3ac00453,0x3b568a06,0x3bbac557,0x3a6bbed2,0x3b0d2bef,0xba97bfbf,0x3bbf1931,0x3bd6d01f,0x3aed8ec0,0x3ba6b98d,0x3ba11d4e,0x3bac6712,0x3bdb02c4,0x3be226b0,0x3bb87db2,0x3a840559,0xba184255, +0xbb7dd61e,0xba273b1d,0xbb32597f,0x3b5e1a8f,0x3c1c43dc,0x3c06721a,0x3be77945,0x3b8c726a,0x3b5cd026,0x3b48eb8a,0x3c00d542,0x3c32a541,0x3c341bdf,0x3c233d55,0x3c10f230,0x3c283105,0x3b4875df,0xb9a9b439,0xbb07ba57,0xba7ba883,0x3c4bca0c,0x3c3e9b90,0x3c48bd73,0x3c42d4bc,0x3a91ad47, +0xbc0150d7,0xbbf38d7b,0xba934a94,0x3a019389,0x3b97ef49,0x3c408198,0x3b66077f,0x38a18d0d,0x3a979e7f,0x3a793398,0x3b4c4ec3,0x3b050344,0x3bc39dc8,0x3b5090c3,0x3bbeaddb,0x3c4050f3,0x3c10ec89,0x3c1bb3f2,0x3bf34134,0x3baa9a4e,0xb9295fa9,0xb9e881bf,0xba132c72,0x3a845914,0x3c1ad3bf, +0x3c598676,0x3c120ea2,0x3c504cb0,0x3c19a890,0xb9207023,0x3b9020c1,0xbb42e3a0,0xbbf9eeb2,0xbcaf2e32,0xbc79a462,0x3bd6c7ef,0x3c08b677,0x3bf39c17,0x3b833c9e,0x3b1ee7e0,0x3b0dbc02,0x3b0d2b5e,0x3bba7347,0x3bc7c497,0x3b70da34,0x3b350a45,0x3ada4281,0x3b1aea03,0x3b236203,0xb9eb0978, +0x3ad35692,0x3bc01b27,0x3be63b83,0x3c3df5b5,0x3c2f4f46,0x3bf51e73,0x3b447f5f,0xb967231b,0x3adc7a19,0x3c1af836,0xbb099db3,0xbbaa2bc6,0xbb4f0277,0x3b250495,0x3bc55c93,0x3bfb9a32,0x3afc9da7,0x3c59f733,0x3c923bad,0x3c7b23d3,0x3c54fc0c,0x3b31f31d,0x3a4ee11c,0x3b02aaab,0x3bc3b764, +0x3b9c422e,0x3b8444d0,0x3ac07305,0x3ad0855d,0x3ab8198a,0x3ae23bde,0x3b174da1,0x3b1643df,0x391acb96,0x3aafa34c,0xba2124ab,0x3a093720,0x3b291d7f,0x39b907d1,0x3a12a93c,0x3c234dd8,0x3c88c665,0x3ca25ddf,0x3c9defa1,0x3c62518a,0x3ba73037,0x3bd6614b,0x3c355721,0x3c47c7ab,0x3cde8a53, +0x3cd8aa4a,0x3c71d2a4,0x3c3c6994,0x3aeab412,0xbbf9443a,0xbc16ff81,0xbb8c6b22,0xba41b8a4,0x3a931a30,0xb99730fe,0x3a58c71e,0xb98fbaf9,0x39046800,0x3a2b4929,0x3a1d5c15,0xb91119a2,0xba10ad8f,0xba7bb21e,0xbaffa0b9,0xbab1dc06,0x3a192721,0xba6499b7,0x3a8c7117,0x3b93e03b,0x3bdeb864, +0x3c0aa44a,0x3c099314,0x3bc79cda,0x3b6a89db,0x3b5f9b02,0x3bb3cfe4,0x3bebd3a9,0x3c1eb134,0x3c376a41,0x3c1bb59c,0x3c82944b,0x3c9cef3c,0x3cb77300,0x3c178d2a,0x3c7d6a82,0x3be39803,0xbb9fd533,0xba191381,0x3a1abfbb,0xba42d4a5,0x397cb891,0x397e6b14,0xba993530,0xb9760436,0xbac34562, +0xbb34177f,0xbb4373aa,0xbafb2bf4,0xbaf4e8d3,0xba66948c,0x3ac83501,0x3a530518,0xba554914,0x3b086348,0x3b382ce4,0x3af3f774,0x3b1c9035,0x3ae7bba4,0x3b2b7317,0x3b8dc613,0x3ba3c45d,0x3ba26be3,0x3b9bea13,0x3bbeb973,0x3c01d911,0x3c36d5e4,0x3c3d9292,0x3c36e048,0x3c57dcce,0x3c4a6d9e, +0x3b81ffcc,0xb9e8d976,0xbc0d9503,0xbbf59889,0xbc3d95a4,0xbc399fc3,0xbc25b99c,0xbc1335f5,0xbbf1ea4b,0xbbd8d4ac,0xbbb1a394,0xbb99fece,0xbb7f0fb6,0xbb7ff981,0xbb35b233,0xbadea152,0x39b14631,0x3a9ef887,0x3b0a3e04,0x3a94c773,0x3b46310f,0x3b73b7dc,0x3b6ae575,0x3b3a20df,0x3b498325, +0x3b96c015,0x3b838685,0x3b42b9f4,0x3a8e801a,0x3abfa023,0x3b634868,0x3c0d759e,0x3beae563,0x3bca66ac,0x3ba433e8,0x3b7a284a,0x3b455c5b,0x3a9ac437,0xbac29edb,0xb9efc15b,0xbafb5784,0xbb3d6552,0xbb9d58a8,0xbbcc40ed,0xbbf9c204,0xbbe2ce21,0xbc0da4ce,0xbbd4c6d8,0xbc00816b,0xbbd3e766, +0xbb920548,0xbabf282c,0x3a07140e,0x3a16d1ec,0x39fd50ad,0x3b3b6405,0x3b5c3b34,0x3b026ef6,0x3ad953df,0x3a978da9,0x3a23368f,0xb92032fb,0x3a5f0302,0x3afa672d,0x3b3c34a8,0x3b46d853,0x3b347c35,0x3b34640b,0x3b1fd0b5,0x3b2b7ecf,0x3b3dbedf,0x3b135cb3,0xba46f1bf,0xba65ec04,0xbbd7e9c7, +0xbb03f9b7,0xbb814c95,0xbb82d622,0xbb0f81a8,0xbb279219,0xba78e1f2,0xba6f67df,0xbb0ad1c3,0xba4fcc7c,0xba1914f8,0xba8f9d3d,0xbb138756,0xbb0f39be,0xba82d9bf,0xba68d9eb,0xbb31a0a7,0xb9a3cf22,0xba8e1cd5,0xba41eaa2,0xba2bc24a,0xba2a9ff7,0xba0cb59f,0xba226fbc,0x38bc607a,0x3a0a4033, +0x3a91b7b8,0x3ada68d9,0x3b19a593,0x3b3f3458,0x3b160cb3,0x3abaa87c,0x3a211721,0xb8e6452e,0xb9549916,0x3a118edb,0xbb0d3ab5,0xbba41f0b,0xbc02ab89,0xba38d3a6,0xbb9683b5,0xbc005e11,0xbc078e30,0xbc0ae175,0xbc063094,0xbc114306,0xbc1604f5,0xbc166a0f,0xbb99b51a,0xba802f37,0xbc055675, +0xbb8d21b2,0xbabf8eba,0x39e47f0f,0xb9048887,0x38879bf3,0xb78a3694,0x37ab27f2,0x38461f10,0x37f9084b,0x395e82a9,0x39b7b563,0x39fb21e6,0x3a259e00,0x3a462d42,0x3a8fd849,0x3a33e1d0,0x3a12abb9,0x39d57443,0x399848f0,0xb8dd8154,0xbb93080c,0xbb789448,0xbbc388d6,0x3ae63a06,0x3bd532e0, +0x3bfa5b7e,0xba85f5dc,0x3bad5809,0x3c0167be,0x3c115762,0x3c1174ed,0x3bfe2cc2,0x3c0c5755,0x3c0b34e1,0x3c0ab416,0x3ba59696,0xba2cbdd5,0x3bfe3f71,0x3babd8c1,0x3ab076ba,0xbbc1f996,0xbb77dd82,0xbb91dc5c,0xbb9da97f,0xbba6905c,0xbba7fd99,0xbba4e33f,0xbb9481ce,0xbb91f9f9,0xbb975af1, +0xbb9b170f,0xbb9b4a55,0xbb9287b6,0xbb9dde93,0xbb9a69b3,0xbb8440cc,0xbb908348,0xbb9ccded,0xbb7d9d9d,0x3bf174dc,0xbb334a9f,0xb7ee9168,0x3aee52e3,0xb930e0cb,0xba2df8a1,0xbad3f9ef,0xba133397,0x3b098c0c,0xba1f4573,0xba88b128,0x3a0c6931,0x398d9256,0xbaa942b5,0xbabbf529,0xbb12083c, +0x3ba72679,0xbb6410d2,0xbb9b4eed,0xbb9d9f6a,0xbbd590e8,0xbbf3c7ca,0xbbf99351,0xbbe28246,0xbba66c9c,0xbb8e552a,0xbba52d28,0xbbb4f70d,0xbbbcea23,0xbba68e23,0xbbb86ce4,0xbbad1197,0xbb80d36c,0xbb90fd20,0xbbb634c3,0xbab24dff,0x3b84fbd6,0x3aad6590,0x392c274a,0x3b0009a1,0x3b1d54e8, +0xb9d50c02,0x3b864f38,0x3b0bae5f,0x3b8f6ffe,0xba0858d3,0x3b31ddb6,0x3ae7dd8e,0x3a1ace4b,0xbb17f28b,0xbb0db2b5,0xbacab0ad,0x3a948faa,0xba9e942d,0xbba71a46,0xbba0eb64,0xbc0031cc,0xbc1b27f2,0xbc210390,0xbc0d156d,0xbbbfea15,0xbba46bdd,0xbbce7641,0xbbdc52ad,0xbbeaa2ea,0xbbbda01a, +0xbbe648ae,0xbbd72953,0xbb83dddf,0xbba11924,0xbbcef5c8,0xba0f515a,0x3b5211c3,0xbac68fed,0xbb593c4a,0x3b85403e,0x3ba65809,0x3aaff7a2,0x3b824b1b,0x3b9b2420,0x3b72468b,0x3bc859c6,0x3ba4cc5e,0x3b6d918a,0xba9c7a6a,0xbb8effe8,0xbaf288d3,0xbb8e689f,0x3a7fe45a,0xba7ccdee,0xbba5fd87, +0xbbb5057a,0xbc327eb4,0xbc6355f5,0xbc695480,0xbc399151,0xbbaa4216,0xbb19dbfd,0xbbaa3331,0xbbe5b6b5,0xbbfe0389,0xbbc3498d,0xbbe13543,0xbbb743d0,0xbb2d8057,0xbb599e34,0xbc11d850,0x3bb4cc15,0x3c9878ae,0x3c7ab7d5,0x3bd40136,0xbb9d09a2,0xbc0c3d00,0xbb0eacc7,0xb979a6e3,0x3b5c0ae1, +0x3c26a876,0x3b40508b,0xb990225d,0x3a607d61,0x3a7fc581,0x3aa6d25e,0x3afff3bb,0x3a209d2b,0x3bac064a,0x3b44cf0f,0xbba84b7d,0xbb62c370,0xbbc4e818,0xba69a676,0xbb512a17,0xbc1bdead,0xbc74e89c,0xbc91985e,0xbc874698,0xbc1be0d7,0xbbe70f04,0xbc25acaa,0xbbd2a430,0xbc141817,0xbc7cbe22, +0xbc3313e6,0xbc7d192d,0xbc6f27f8,0xbc9ce39e,0xbc8b6aee,0xba94f211,0x3be9f68a,0x3beb7a33,0x3b8601f8,0x3ab32672,0x3aa10c8e,0x3aa05cd3,0x3b97e626,0x3bafde2e,0x3b3c2402,0x3a3f30a5,0xb9264116,0x3b16267a,0x3b0f2703,0x3b6a2075,0xb99fea72,0xbb90d35b,0xbb6514fd,0xbbd74111,0xbb35dc46, +0xbaaff31c,0x39d4a525,0x398f26ba,0x3b0a49c6,0x3bd872f6,0xbbb800c0,0xbbe9e5d0,0xba110053,0x3b101893,0x3bb20f04,0x3c1406cc,0xbb30cfce,0x3c1487af,0x3c80fc90,0x3c8db37b,0x3c3dbf54,0x3b8482b4,0xbaec0eae,0x3ad75090,0x3bc0b6b9,0x3b9cba58,0x3b4d5364,0x3a49f38d,0x39c38b29,0x3984b30c, +0x3a792904,0x3b14a2b5,0x3a3c4ad1,0x3a6f4038,0xbad1b93e,0xba794c69,0xbb2d3c08,0xbb8d6174,0xbaee37b0,0xbb1edeaf,0xbaaf9ef9,0xbb118e62,0xbb35fc74,0xbbb81b37,0xbc149789,0xbc46d5df,0xbc5f30a6,0xbc5a7715,0xbc5d6a30,0x393307c9,0x3b0c8458,0xbbea6aa0,0x3b176d59,0xbc1844ce,0xbbd862bc, +0xbc0959e7,0xbbe90428,0x3812416d,0xba847292,0xba4f8029,0xb9c5e21d,0xba778209,0xba09197c,0x39674130,0xba271f17,0xba8dde32,0xba5a2cfe,0xbafd7c35,0xbb14f94d,0xbb2167ee,0xbaa3c979,0x3ad11493,0xbacc5c63,0xbb832a1c,0xbb414815,0xbb355d47,0xba5073e8,0xb93059d6,0x3ae17aba,0x3b1dc548, +0x3ba9bd17,0x3be95594,0x3c2c9a2f,0x3c0a4208,0xbb37db98,0xbb3cb5c4,0xbbae5c38,0xbc08e301,0xbbc61dd9,0xbb29049f,0x3bee7e12,0x3c23d20d,0x3b838e1d,0x3b231450,0x3b275e56,0x3ab6c2bb,0x3a34c002,0x39d43515,0xba7c54cd,0xba6c344a,0xbb468f0e,0xbb5d3997,0xbb153f76,0xbb0e0395,0xba8b86d2, +0x398e559e,0x38f5cbcc,0x3b13c338,0xb9b00f73,0x3a7a5242,0x3b1a555e,0x3a780a7f,0x3a807e0b,0xb7e67ccf,0xbaa0fd78,0xbab9a29e,0xbb27773e,0xbb9eb0fa,0xbb7c9f8e,0xbb3f8045,0xbb1babae,0xbb826bf8,0xbba0beb2,0xbbae890c,0xbb448b06,0xbbc068df,0xbb54a8c3,0xbac01969,0xbbc7c440,0xbc0c56b1, +0xbc2ac50a,0xbc336a55,0xbc074e85,0xbc0bcbca,0xbbf575f9,0xbbde5ef5,0xbb9ec149,0xbb8caf75,0xbb8be3d1,0xbb81af4c,0xbb3a3107,0xba86e66f,0x3aa35abf,0x3ae0eae8,0x3ab481c3,0xb99d5327,0xba9beb81,0xba8e5943,0xbaeb5852,0xba8b90ee,0x39b9d2ab,0x3960904b,0x3916d267,0xb95a980b,0xbab7dea1, +0xbb67fdea,0xbbc3bf0a,0xbbad3cbf,0xbb961426,0xbba1a0e7,0xbb78379f,0xbb4a1a36,0xba8b25ca,0x39e80374,0xbab997d8,0xb98de94b,0xbb213d5e,0xbb93afad,0xbbe4d47d,0xbbce5095,0xbbf2828f,0xbbdd126b,0xbc01ba57,0xbbce6029,0xbbd98252,0xbb7786b5,0xbb10a191,0x39074154,0x39ac5f92,0x3ac86471, +0x3a2793e2,0xba58bec6,0xb8b579a1,0xb9a1b089,0xba170a73,0xba9f13a0,0xbaea6911,0xbb064712,0xbb0757a2,0xbb0208fd,0xbb3a619c,0xbb54197d,0xbb85a802,0xbb4ed816,0xbb2e1421,0xbb2252a3,0xbb0e2bab,0xbb7735a5,0xbb68ffbf,0x36de6551,0xbb6f116c,0xbb199d99,0xbb1a22b7,0xbb509a10,0xbb399f25, +0xbb6691ba,0xbb4f26be,0xbad8fa89,0xbb324568,0xbb4c728c,0xbb3d8ba3,0xbafe98ff,0xbb2dc677,0xbb4feac0,0xbb4cce8d,0xba4461ac,0xbb402db2,0xbb204f05,0xbb1bd1f2,0xbb1a9743,0xbb0d4d8c,0xbafcc911,0xbada568f,0xbb25fd6f,0xbb5cac90,0xbb838388,0xbb93569d,0xbba3edc3,0xbbb9022d,0xbbaf03e1, +0xbba4ad48,0xbb96e323,0xbb856f94,0xbb843d60,0xbb983093,0xbac040bb,0x3a6465c6,0x3af0c9bc,0xbb2dbb7a,0x3a0e4c9d,0x3b044f17,0x3b10f0f0,0x3b14f9e7,0x3af0ab32,0x3b1c70cf,0x3b2f25ba,0x3b2bda7e,0x3a11093a,0xbb2997b3,0x3b2b1e9d,0x3a3fd2ff,0xbae02a9f,0xbb91a7b9,0xbb72fc27,0xbb7e2a7f, +0xbb7876d9,0xbb78b62e,0xbb7a2d3d,0xbb715209,0xbb82f5e9,0xbb87f888,0xbb8fa3e8,0xbb97719f,0xbb9d7e36,0xbba5dc67,0xbb9b3214,0xbb963944,0xbb9257d9,0xbb8ec558,0xbba8b417,0x3a2dfdcc,0x39dfeb2c,0x3b429f41,0xbb973d2c,0xbbf9a600,0xbbd482b6,0xbb33acc3,0xbbe04483,0xbbe98fb7,0xbbdf96e5, +0xbbd7d355,0xbbb158ba,0xbbd6b1b9,0xbbd7214b,0xbbb83048,0xbbf20fae,0xbb8331e8,0xbbd7922b,0xbbf8b947,0xbba9441b,0x3b1f82d8,0x3a201c21,0x3a461134,0x3a0e1873,0x39a22a9b,0x396fa5ac,0x38b0120e,0x3a35eb27,0x3a63cabc,0x3a62e1ed,0x3a2dd292,0x3a197149,0x3a655845,0x37dfa45b,0xb92bc9e4, +0x383b58df,0x399d899b,0x3a4b635d,0x3a403112,0xbbdf7877,0xb94c2103,0xbb966213,0xbb021881,0x39042521,0xbaa8e53b,0x3aac1e98,0x39a67d8d,0xbac79120,0xba5832e3,0xb9ac92e2,0xb91638a2,0xbb4298f3,0xbb3de20d,0xbb825a70,0xbb0de6bb,0xbbd38da4,0x39014ff9,0x3abe3010,0x39230176,0xb8287a4c, +0xba33562c,0xb9f91c4e,0xb9b3fa91,0x3ad30fce,0x3b0c2410,0x3aba3010,0x3a35ed51,0xb8aabbec,0x395339c9,0xbaf25688,0xbb0599ed,0xba8ffdd8,0xba5336df,0x3ad4dc0e,0x3b12ab04,0xbb0a0088,0xb959c15f,0xbb8a6afe,0xb9c4e8f7,0x39a92b55,0xba672388,0x3a75909d,0x3b81dffd,0x3a3d3cf1,0x3b3c53a1, +0xba896c31,0x3b274b50,0xbb5c55bf,0xbb449747,0xbb5bc47b,0xbb486a48,0xbb864aa4,0xb97064d2,0x3b2ebb1e,0x39befe30,0xb9e9bff6,0xbb076e6e,0xbb0e3a5e,0xbb2d3e8e,0x3a911a5b,0x3b11ea59,0x3ae3737e,0x3a5cbd96,0xb9c144cc,0x3a6a1cd5,0xbb8163d8,0xbb8c041a,0xbadaa9f2,0xbb018670,0x3ad0c36e, +0x3a681b72,0xbb26bd09,0xbaa0abf0,0xbb813459,0x3b594286,0x3bc3246e,0x3b1e5ccf,0x3bb308c7,0x3baee833,0x3bbf5d14,0x3bada56c,0x3ba57466,0x3bb70e4d,0xb9b5f1e1,0xbae63f10,0xbb994989,0xbad057e9,0xbb84fb08,0x3a2440d4,0x3b45185e,0xba523d3e,0xbb2a1761,0xbb9fdbc6,0xbb8f74f9,0xbb5609b9, +0x3b687799,0x3bcc054d,0x3b832641,0x3a554017,0xbb0daf71,0xbac64ab3,0xbc023b43,0xbbefc543,0xbb306bf2,0xbb4593a8,0x3ba47b9b,0x3b5b9bb1,0x3bcb794a,0x3c13c684,0x3b0f1f52,0xbc03915d,0xbc1e9645,0xbb8509a3,0xba6d3e4e,0x3b31d4a6,0x3c0c5fc5,0x3b53a506,0x39baea1d,0xb9e5aa71,0x3a4af2e6, +0x3b2d350b,0xb915c223,0x3b269d2a,0xba36c52e,0x3a6967df,0x3baed09f,0x3b95f38a,0x3bf1d45a,0x3ba03363,0x3b48a232,0xb9dfdf1d,0xbafc5088,0xbb18c69c,0xb8b33c86,0x3ba7fe26,0x3bc08d63,0x3a8acbe2,0x3ab4d43c,0xbae59b99,0xbbc298d7,0xbb31a079,0xbb652927,0xbc1c934f,0xbcb69255,0xbc892d60, +0xbb7ab4db,0x3bda7f85,0x3c1a1c9d,0x3b9f1639,0x3ad236ff,0x3a37a28e,0x3a6e73be,0x3b8609ae,0x3ba234c8,0x3b8479c3,0x3b0fbb47,0x3a0bfd70,0x3a3f40e9,0x3aed15a6,0xba3aa81d,0xb9cc16d7,0x3aa40282,0xba2699ea,0x389acc00,0x3ae99ea7,0x3acca43a,0x361a255b,0xba7ff664,0x3aae638d,0x3bfd0105, +0xbb6f089e,0xbbdf607d,0xbb3e7152,0xbb1ab64c,0x3b1fef8e,0x3c3a705c,0x3a15efa1,0x3c0a0a01,0x3c812c64,0x3c4dfcf2,0x3c2c301e,0x3809bf4f,0xbb51e3ab,0xbabbc5e0,0x3bc561f4,0x3b99dc48,0x3b832bd4,0x3a49ab4a,0x3a5b4367,0x3a1a82ec,0x3a31e5f0,0x3b0391ed,0x3b0e971c,0xba56d6f5,0xb9370d62, +0xbb3fa2f4,0xba8d604b,0x3ae85937,0xb96d3636,0x3a05f902,0x3bc0ca7c,0x3c10ddc6,0x3c1af45d,0x3c1733e6,0x3bc9be7f,0xb940a4a0,0x3b7b0201,0x3bb2cf1a,0x39db1e51,0x3be4e1fb,0x3b70c24e,0xbbbf72cd,0x3a6e4e9d,0xbbf80490,0xbc1502b0,0xbc138acb,0xbbafa305,0xba6bfd5c,0x39ea75ac,0x39a9b881, +0x3a49013b,0xba301586,0xba395484,0xb9aa0c1a,0xba83b73e,0xbab92d12,0xba6bf920,0xbafdc5b5,0xbb4d3b58,0xbb30c6c9,0xba2c3666,0xbb1bfa5a,0xbab7f234,0x3a6df7c0,0x3aa6eb31,0x3b12b479,0x3b07b177,0x3aa93a18,0x3b090bda,0x3b05def3,0x3b490125,0x3b155e9d,0x3bd0bb77,0x3bc005a8,0x3ad28b7d, +0xba90db61,0xbaf9aa98,0xbabe1aeb,0xbbc8c15f,0x3b72233f,0x3a69fca8,0xbb01ede7,0x39f1f724,0x3aa0f07f,0x3a4b6e88,0x3a95f101,0x39b2c636,0xba8201b3,0xb928afdf,0xba092ea2,0xbb0cc516,0xbb3cadf8,0xbb1a31d8,0xbb16a9f2,0xba9c6793,0x3a32fd45,0xb986f71d,0xbafc504e,0x3a0932de,0x3b0b78f5, +0x3adf37ea,0x3b0ff83f,0x3a5bc1b2,0xb90b83bc,0xbab8cd3c,0xbb0c11d4,0xbb596a7f,0xbb93976b,0xba320970,0x3b089e80,0x3bcbfcd0,0x3b2218cd,0x39bc9bfc,0x3b17fdbc,0x3aa3f469,0xbb38d4e6,0xbbd225f4,0xbc2359a8,0xbc2c3128,0xbc47c41a,0xbc46355e,0xbc218ceb,0xbc00642f,0xbbe1d49e,0xbbcbe7db, +0xbb9fb24c,0xbb8dcf35,0xbb62866e,0xbb564ecd,0xbb685a72,0xbb69bf46,0xbb2187de,0x39a3467f,0x3b034892,0x3acb1f8a,0x3b2a30bb,0x3b27de75,0x3b2ba901,0x394711ef,0x35855fcc,0x3a7fb8ec,0x3b0091db,0x3b3e84fc,0x3b2d296c,0x3b1652b1,0x3b055024,0x3b3c234a,0x3b34b515,0x3ad5c17f,0xba089f3b, +0xbb15cc93,0x3ad90de8,0x37d74474,0xbb522f98,0xbb3d0966,0xbb89e423,0xbb9ad951,0xbbc4fc71,0xbbea7982,0xbc01c225,0xbbdefd99,0xbc0cb066,0xbbc5f3fe,0xbbea07a5,0xbbb80acd,0xbb94475d,0xbb17341a,0xbab76fe2,0xba74ae63,0xba9d6967,0x3adb7494,0x3b3f22a7,0x3afb1aff,0x3b15163f,0x3ae00b69, +0x3aa2c7e9,0x39d69217,0x3a23ef4d,0x3a259107,0x3a441f43,0x3a4f0ce3,0x3a7c3a57,0x3a91fd14,0x3a894dcf,0x3a8f56ca,0x3adcbdc1,0x3a815f47,0xbace6e6f,0xbaf78390,0xbb9f4d83,0xbb0036dc,0xbb686d8e,0xbb59a37d,0xbb0d8a48,0xbb172a94,0xbab87592,0xbb04f7f2,0xbb61cbab,0xbb2b4d03,0xbb0e8308, +0xbb4380ee,0xbb67f126,0xbb411202,0xbb28c3c5,0xbaca0cab,0xbb4eceec,0xb8a4448a,0xb9b4dfa0,0xb9db360b,0xb9c3fca4,0xb9e350a3,0xb9b00f15,0xb9965b49,0x3890d418,0x3910ed13,0x38c117dd,0xb884004f,0xb9b1ff17,0xba2da131,0xba44f38e,0xba88f21a,0xbaada07e,0xbad78041,0xba68dcba,0xb901be9b, +0xbb88da4a,0xbbc1ed6b,0xbbb32e46,0xbb4b19d3,0xbbbe8db7,0xbbc7c93c,0xbbd331a8,0xbbd6dba2,0xbbc5caf4,0xbbdbb590,0xbbe2fc6e,0xbbe02092,0xbbd39489,0xbb68d5ed,0xbbc9cffa,0xbbbf32f4,0xbb757973,0x39269c48,0xba347920,0xba038a1c,0xba0716ba,0xb9fb0c43,0xb9ed468f,0xb9e4515d,0xba0b0d96, +0xba1b2c56,0xba24407a,0xba2d4e8e,0xba30cd65,0xba40dbb6,0xba4bcf3c,0xba4cd8e4,0xba454936,0xba42e7a7,0xba9f80b0,0x38967c4d,0xb88b0ef8,0xba51c2d5,0x3ba6cf8e,0x3bb6e72b,0x395e6efc,0x3b7d56f2,0x3babbda8,0x3b02bd1e,0x3b26b34d,0x3b23bf24,0x3ac7ddd2,0x3ad4b35d,0x3ab81aff,0x3aa7c739, +0x3ba035ea,0x3b73ac3e,0xb9490ab1,0x3b942b62,0x3b937884,0xba3dc62d,0x38c47265,0x383b5672,0xb94d2152,0xb9b0d1d6,0xb9904418,0xb8d0a501,0x39ce4f16,0x39fd65b9,0x398fd30d,0x399de7a7,0x39b0b7fe,0x39fd3a27,0x39b9fe0b,0x39549cce,0xb8daf51b,0xb8dca9f3,0xba6d0736,0x3aa78a7a,0x3b952b46, +0x3aacb73c,0x3ac42050,0x3b2678d7,0x3b1b4415,0x3ae33bc0,0x3aeb44f7,0x3b48ea25,0x3b9d8bcb,0x3b37aa25,0x3ad5a466,0x3b5c3615,0x3aa2ab76,0x397c1b65,0x3a9db285,0x399260c2,0x3b2934c9,0x3abbb139,0xb9100524,0x39f4813f,0xb9fc3fed,0xba8d44ed,0xba874517,0xb9a3ad73,0x3abe0c01,0x3b08d117, +0x3ab08289,0x3a8e9c08,0x3a757b83,0x3aa78dc1,0x3aaad661,0x3a6ffe1c,0xb9489ba5,0xb924a6b5,0xbad83cde,0x3b02f2a2,0x3bc34d56,0x3b77d352,0x3992ff37,0x3b285167,0x3b361904,0x3a8fa874,0x3b8f7635,0x3b4acd3d,0x3bb692dd,0x3a5f4155,0x3b08643b,0x3b684570,0x3a78f4fc,0xba0625af,0xba8fd84c, +0xb93f1454,0x3b148406,0x3b007706,0xb8b3ca37,0x3a0541a4,0xba3b3818,0xbae369e4,0xbac141a0,0xb955d2f4,0x3b2c0d3f,0x3b66d40e,0x3b0a3d08,0x3b19bf57,0x3b0e94dd,0x3b27fa15,0x3b21d87a,0x3a951760,0xba5ec27b,0xba269111,0xbb4719e8,0x3ac45015,0x3b90520a,0x3a719d35,0xbb4a3e7d,0x3b813c3a, +0x3bace302,0x3afbf542,0x3b998b8d,0x3bb415dc,0x3b8cc7b2,0x3b8e8531,0x3b81ee74,0x3b831881,0xba924fe6,0xbb525a68,0xbada2ad1,0xbb23d971,0x3a9cf70f,0x3b00196a,0x3977c5d4,0x3a8d6b44,0xba90d1be,0xbb386a9e,0xbb1520fc,0x387df26f,0x3bc599bd,0x3c047747,0x3b9d5006,0x3b85c3e6,0x3b591864, +0x3b710f7f,0x3b8d93af,0x3b4ad01b,0xba5c84f6,0xba1feb4b,0xb9625af1,0x3c049685,0x3c91b587,0x3c808249,0x3bea6254,0xbb7bbeaf,0xbc061c17,0xbb5e1d13,0xb9ba6f18,0x3b2cba03,0x3bdc7319,0x3b536cde,0x3a23a3a4,0xb9cfb9ec,0x3ad17956,0x3b188faf,0x3a96f005,0x3add8fdf,0x3b9cd152,0x3baa58e5, +0x3a7b7843,0x3a134dd6,0xbafd7599,0x3a159520,0xbb0a6da7,0xbc058efb,0xbc2bc7c0,0xbc2ae7be,0xbba8b61a,0x3a20948e,0x3b84a3e8,0x3bb01345,0x3b67dacf,0xbaa64f41,0xbbd81a87,0xbb30da71,0xbc4c060b,0xbc207dc5,0xbc59a6df,0xbc5e854d,0xbbb021fb,0x3bf83fa6,0x3c1ea116,0x3bbc911c,0x3a926607, +0x3984eb36,0x395848b6,0x3b4b310b,0x3b9099e7,0x3b62aa7b,0x3aeffa0f,0x3a8ee184,0x3b4097c5,0x3b0af982,0x3b11ffc7,0x3aea91cd,0x3ad449f9,0x3b6da7d1,0x3b46aa83,0x3b2ce332,0x3af572eb,0x3b06f68a,0x3ab134ed,0x3b29ec71,0x3bc386e9,0xbb5fea8a,0xbb79db93,0x3b812138,0x3baaca6b,0x3c0e59af, +0x3c57176c,0xba58ca32,0x3bf4c8ff,0x3c872b46,0x3c4c73eb,0x3bf31018,0x3a9a6b57,0xbb980fab,0xba927713,0x3bbc0916,0x3ba90917,0x3b691c50,0x3a268db8,0x39ad7e4c,0xb8335345,0x39916c62,0x3b341331,0x3b229d71,0x3a8fdb2b,0x399cabe6,0x3ac685f5,0x39c56af8,0xbb13b88e,0xba711727,0xb98e98a8, +0x3b9283eb,0x3bf37791,0x3c14d0b3,0x3bef394e,0x3b2056b0,0xbb96d1a1,0xbb21f1c1,0x3b66b27e,0x3c397b77,0x3c7f0a5b,0x3c3d3af1,0x3b21c176,0x3ae78345,0xba9bde3a,0xbbedc421,0xbbdd0401,0xbb8552c8,0xb9fea4c0,0x3a5012db,0x3a133b8d,0x3a0b0cfa,0xba0cac8b,0xba75c4cb,0xb95d2d74,0xbab7e48b, +0xbae6c26b,0xb9d9a401,0xbb0238e0,0xbb1ca851,0xbb05036d,0xba9bbc4e,0x394097b4,0xbaf76a54,0xbaa9b30d,0x3a9d38fa,0x3b26ac7b,0x3b7825f8,0x3b81d316,0x3bc04658,0x3c072dc3,0x3c2857e0,0x3c23581d,0x3c5cdb22,0x3c29bb68,0x39ced17d,0x3bbb7ffa,0x3c14d78b,0x3c46b322,0x3bd9a0be,0x3c8379a1, +0x3c67e7c7,0x3c05c18a,0x3bb59d9a,0x3b9670f3,0x3b71f9ac,0x3b1bc2a1,0x3b0cdb27,0x3ab7b6f1,0x3a2211e7,0x3a9d44b2,0xbab9a460,0xbb1e9c76,0xbafbfd9e,0xbb0431f1,0xba8d8dc4,0xb9a7b80c,0x3a9a80fe,0x3b4573f7,0x3abd293b,0x3af6598b,0x3b120290,0x3ab0e803,0x3aeb4ece,0x3b1105fc,0x3b43ae4e, +0x3b2a6bab,0x3b46657f,0x3b8ce18a,0x3bab72c4,0x3c026590,0x3c4a6ce2,0x3c450f1f,0x3c4706be,0x3c55045d,0x3c82a460,0xbaf2fc09,0xb903aa7d,0xbb95c0c7,0xbbcc5f50,0xbc087143,0xbc0bea79,0xbc0b5013,0xbbc510ac,0xbbd418e4,0xbbc59f68,0xbbae3b31,0xbb7a18e8,0xbb48d005,0xbb436093,0xbb5c1b76, +0xbb260042,0xba9cb76f,0x3a594d71,0x3abe7b65,0x3ab2a1cb,0x3aa2efc0,0x3ae5eaca,0x3b1d644c,0x3b1929a6,0x3b2ab4cf,0x3b44f3f4,0x3b473357,0x3b195985,0x3a60a4c7,0x3a141fe2,0x39c15d6f,0x3ab50228,0xb983d169,0xb9ef6cd3,0xbaa64a92,0xba4b1c4e,0x39bccf30,0x3a97f006,0x3adc87e8,0xb8e80192, +0xba7d4deb,0xbb2591ab,0xbb911de3,0xbbd0abdb,0xbbc46126,0xbbcf5a99,0xbbbde17a,0xbbc5742a,0xbbb21b09,0xbb9bcca4,0xbb5c3adb,0xbb0a7437,0xba8af64b,0x394284d9,0x3b153fb5,0x3b465c3e,0x3adc59ed,0x3af3b2c7,0x3abe5145,0x3a90f3d4,0x3a2a470b,0x38e4b5e1,0x3a800101,0x3b0454a2,0x3b4e044b, +0x3b4fc099,0x3b4e060b,0x3b4a4916,0x3b338d2c,0x3b1be959,0x3aeb48d7,0x3ac51595,0xba996c63,0xba3b8917,0xba7e5734,0xbab6572e,0xba4b0899,0xba8ea753,0xba8e6550,0xba6428c5,0xba89a1b1,0xb9d78a24,0x39c5e2f1,0x3911f429,0xb9f4c3ef,0xb995676b,0xb9ee41da,0xba95a90f,0xba1fa12f,0xba97f90f, +0xba0a5e55,0xbace8ac9,0xbafb7f99,0xbacfa558,0xbad750a7,0xbac2cfac,0xbab2318f,0xbaab24e0,0xbacd768a,0xbaef45a7,0xbaecadda,0xbad95164,0xbab1a3ff,0xba86c156,0xba9404f7,0xba8c4e92,0xba8b3146,0xba70c945,0xba439556,0xba659ee2,0x3abff7de,0x3accd847,0xbaa0eaa9,0x3a8313b5,0x3ab55f2a, +0xba0b6cf4,0xba0e38a3,0xba36f5fa,0xbaa0aebb,0xba8e82b9,0xba8c36f0,0xbaaf08e6,0x3aca5901,0x3a75b37c,0xba7e3bde,0x3abdba56,0x3a7b2b56,0xbadd8727,0xba9e9de3,0xbaa8dbb5,0xbaaca334,0xbaaf2644,0xbab45536,0xbab1bbec,0xbaa8bd6d,0xba9adbcd,0xba96f584,0xba8ef4fe,0xba8af4ac,0xba7915d4, +0xba6fc1a3,0xba6390da,0xba619cda,0xba4a5424,0xba8aff7b,0xbb688cdc,0xbb489ef3,0xbb3d52d1,0xbbb7f783,0xbb7b219b,0x3af1eb5e,0xbbbd2193,0xbb8904f6,0x3a13f92c,0x3a8913d3,0x3aa762b2,0x3b08d8b1,0x3ac1ba03,0x3acb3e76,0x3b26315f,0xbb90c648,0xbbcbd090,0x3b0c99c3,0xbb8a5f80,0xbbc3675c, +0xbb49e8e5,0xbb546763,0xbb729573,0xbb7ffbe1,0xbb85965a,0xbb854d91,0xbb837659,0xbb5ef4e4,0xbb5650be,0xbb5f9a5a,0xbb770afa,0xbb825cf0,0xbb81be39,0xbb92071d,0xbb8dffc2,0xbb5b111b,0xbb697f2f,0xbb4474c5,0xbb8fd9c6,0xbaf89479,0xbb6a651a,0xbb960530,0xbb05d94c,0xbb014946,0xbb0e69f4, +0xbae775cf,0xbb2575cf,0xbb1703b7,0xbb6c7b16,0xbb3b1fe6,0xbb1461df,0xbb3cc028,0xbb63288e,0xbbb37ba0,0xbb80ff4a,0xbb1032cd,0xbb8db431,0xbb8047ff,0xbbb0d457,0xbbc24e56,0xbbd26316,0xbbc23ae4,0xbba9ab50,0xbb4d6eee,0xbb31d75c,0xbb7704c4,0xbba20043,0xbbc44826,0xbbc48020,0xbbeacb8a, +0xbbd19aa3,0xbb71d661,0xbb8860e1,0xbb2c578f,0xbb36d8b7,0xbb3f0cb3,0xbae6d484,0xbb6d957d,0xba6e89b0,0xb98cfdbe,0xba947cfc,0x3a8e029f,0x3b274ead,0x3ab9fa48,0x39227b05,0xba8180fb,0x3a7dc81e,0xbb3ed819,0xbb7ebfee,0xbb8bc90f,0xbb80a060,0xbb883d0a,0xbb530338,0xbb8b3afe,0xbbca1054, +0xbbfcb7c0,0xbc11cf3a,0xbc0a6685,0xbc0099db,0xbb80e6ac,0xbb4a67bf,0xbb93e1ae,0xbbc861cf,0xbc03440e,0xbc00a010,0xbc2d0734,0xbc15b2c7,0xbb6a8c41,0xbba19e99,0xbaf9327f,0xbb37a41b,0xbb21fbf1,0xbb4b9ed5,0xbba37c7d,0x3abbcad5,0x3b9c788f,0x3b3a1fcd,0x3ba9986d,0x3bba9182,0x3bc5b230, +0x3b86a120,0x3b5298c9,0x3b9bc4d5,0xbad294ff,0xbb586169,0xbb881f45,0xbb4fa5c0,0xbb42d818,0xbb147a8d,0xbbabf3f7,0xbc17de86,0xbc4ac1ea,0xbc64540b,0xbc4d0b17,0xbc1cddb9,0xbb0d0fe7,0xb8671edc,0xbb6dbbea,0xbc00b2e7,0xbc3b6a8a,0xbc42d2b9,0xbc70623f,0xbc2fb43e,0xbb21696a,0xbb7ff98a, +0xbbb5d6c0,0xbb350e27,0x3b9c722f,0x3c069790,0x3ba4af6e,0xbbb36744,0xbc1ee825,0xbbb2bd6b,0xbabdbd11,0x3ab9be3b,0x3b9b19d0,0x3b540dae,0x3a8f02e2,0xbac649d4,0x3a85ba72,0x3af6a7a2,0xbaa19449,0xba97a336,0xbb0366c7,0xbb2af0a7,0xbb60128a,0xbacbb648,0x3a54583a,0x39a5f875,0xba9d4227, +0xbb606130,0xbc01b8cd,0xbc1137fb,0xbb967c42,0xbb248cf0,0xbb66c5c6,0xbbde9ed9,0xbc1643db,0xbc473a72,0xbc46684d,0xbc23e50e,0xbbe4f3e6,0xbc2484dc,0xbc9d5e46,0xbc87d9ae,0xbc45c541,0x3b8b130e,0x3c2608cc,0x3bc7849a,0x3a8a0c8f,0xba3c0120,0xba16fc01,0x3b18d233,0x3b73e40c,0x3b7539b2, +0x3acb1c54,0xb9675c31,0x38696691,0x3a34df96,0x39380071,0xbacf02eb,0xbb88efc7,0xbbe2a5be,0xbc220edd,0xbbd3102f,0xbb850af2,0xbb25c9ca,0xb9c63825,0x3acc1c53,0x3b89195f,0xbba9009c,0xbbe754d7,0xb811c982,0xbb4facc0,0x3b03683a,0x3c6a868b,0xba74cc75,0x3b6e3771,0x3c6e5e9c,0x3c149913, +0x3bb6208e,0xbaa795fa,0xbbc01ece,0xbb6c5046,0x3b86c1af,0x3b866ae4,0x3b67f1ed,0x39401c24,0xb927c612,0xb9dcf0a4,0x38d4dae4,0x3ad7ed40,0x3ac9ffa7,0xba4151ef,0xbaa39d00,0xbb40afae,0xbb0e3a90,0xba9ea498,0xba91a063,0x39a65966,0x3886e470,0xbac14c73,0xbb5d7e16,0xbb86d614,0xbb9e2751, +0xbbcd8df5,0xbb848562,0xbb9205a0,0xbbea0ebb,0xbc6e9339,0xbca31e78,0xbcbacf38,0xbc0b74df,0xbc628a9a,0xbc13ced8,0xbbe19f0f,0xbba5c439,0xba62a930,0xb8eb58bb,0x3a74f83f,0x39be025c,0xb9e19fb5,0xba86aefb,0xba57036a,0xbafc27a0,0xbb083a1f,0xba998402,0xbb2ec373,0xbb66e407,0xbb5dbb70, +0xbb1689f3,0xbb2c4979,0xbb566d0b,0xbb70d353,0xbb98e671,0xbb8f60d7,0xbb89a1f0,0xbb2759ba,0x3aa9efea,0x3b1906f8,0x3b378932,0x3a61c6a3,0x3b8f98ae,0x3af41c00,0xbb5d122d,0xbc5c8d48,0xbc9264e2,0xbca8ef97,0xbc845e65,0xbbaf04e6,0xba8f9d24,0x3b8ff602,0x3b0d1562,0x3aef140d,0x3af83bb7, +0x3aa37889,0xb68821b0,0xb9de5c9a,0xb984c2d7,0x39ea86d4,0xba879983,0xbb0d492d,0xbb33c580,0xbb1eced8,0xbac93f06,0xba52cefe,0xba7d47bc,0xba81daa0,0xba3a8c6b,0x3a82cca8,0x3abfe81f,0x3a8f2d33,0x37f00d7c,0xbb06bbf7,0xbbb9d92d,0xbbedd1cc,0xbc0870fa,0xbc1de8da,0xbb99c52e,0xbb280c7f, +0xba14281b,0xbbab3c42,0xbbdf164a,0xbba3a601,0xbbb1cdcc,0xbc1678e2,0xbc1a9be1,0xbc040c36,0xbc32c261,0xbc2dbcf3,0xbc2c7307,0xbc0ae472,0xbbccb2d1,0xbbcef76b,0xbbba10a1,0xbb93b506,0xbb83ec66,0xbb5b1868,0xbb442f07,0xbb8147ab,0xbb8cc43d,0xbb81bae0,0xba261dba,0x3a925f78,0x3af0c9a1, +0x3aaea1b2,0x3a09077a,0x3a018b6c,0xbacdce59,0xbb03c4a0,0xbabb949c,0x3908d9de,0x3af70940,0x3b4c4fb6,0x3af4cb69,0xb9fc4fd8,0xbb8034e0,0xbb5417c7,0xbb89dd13,0xbbcf0f1b,0xbbffb33a,0xbacbaa2a,0xbae246b6,0xbb66d03c,0xbb93b60b,0xbba7c96a,0xbbba86a8,0xbbd5e534,0xbbf736f4,0xbbea7d8e, +0xbbd51873,0xbbea5e36,0xbbb4ca65,0xbba7a88b,0xbb82fc12,0xbb681f50,0xbb325ae8,0xbb23146f,0xbacd25fe,0xba895030,0x3a257594,0x3a988253,0x3aa59c9a,0x3aef4825,0x3ac4d413,0x3aa8c6d9,0x3a6fb722,0x3979e900,0xba1902e2,0xba8f5c3a,0xbacbf742,0xbabb7714,0xbad8d688,0xbacaf031,0xbadb7337, +0xbaa99420,0xbac70373,0xbb2963f3,0xbb3636b6,0xbac12571,0xbb19fbd1,0xbb2c1f23,0xbb1cd6b3,0xbb2a7d03,0xbb297d1f,0xbb31ae3f,0xbb582209,0xbb721608,0xbb7a801e,0xbb657d41,0xbb820a02,0xbb60c3bb,0xbb34881b,0xbb52f885,0xbb011194,0xbaf16d1b,0xb9c89594,0xb8371566,0xb9d573d3,0xb9ea85dc, +0xba06ed2f,0xba0369a9,0xb9cf8b4d,0xba3d0bc6,0xba9f3c12,0xbb01ae79,0xbb351bf1,0xbb7580da,0xbb9ac551,0xbb8a3308,0xbb7a28b5,0xbb6238df,0xbb520b66,0xbae3e529,0xbac31bdd,0xbb695ad3,0xbb44159a,0xb85c7bd2,0xbb79a1fe,0xbb602717,0xba8d0633,0xba8bd4a5,0xba838941,0xba26323f,0xba4dea8b, +0xba3d733b,0xba132849,0xbb7f6585,0xbb8223c9,0xb9cd45bd,0xbb5847e9,0xbb6602ec,0xba740a5d,0xbab32a4c,0xbab0d592,0xbaaacaa7,0xbaaacbfc,0xbaab342e,0xbaa3c375,0xbad40aeb,0xbaf3d871,0xbb06b55d,0xbb151f2f,0xbb211b85,0xbb3e2806,0xbb27325f,0xbb1def32,0xbb1015b4,0xbb055fa1,0xbb163b50, +0x3b6173c1,0x3b327dd3,0x3b879781,0x3b709909,0x37e625a6,0xbbe646f3,0x3b9aaac3,0x3a3a564f,0xbba9de9b,0xbba885e4,0xbba78eda,0xbba6483a,0xbbc3713c,0xbbcba06b,0xbbc6305b,0x397afd51,0x3b79cb70,0xbc002431,0xba046ffd,0x3b42481d,0x3b81bdd2,0x3b3f36af,0x3b5c81a8,0x3b53c741,0x3b5173e4, +0x3b579bf7,0x3b614ddc,0x3b7de505,0x3b835464,0x3b802496,0x3b80fc60,0x3b80a8a7,0x3b7fda49,0x3b76e7c7,0x3b625bda,0x3b2f73a2,0x3b48269e,0x3b2ba414,0x3b99bf19,0xbac3c0cb,0x3b717310,0x3a338922,0x3aba462e,0x3b55054c,0x3b1fed38,0x3b7d7385,0x3b90bf55,0x3b8d5ca1,0x3b776f8e,0x3b33e2ce, +0x3b77753d,0x39f583e9,0x39866414,0x3a7bc7dc,0x3a83f09c,0xbb294aa2,0x3b849296,0x3b5eb22b,0x3b791c4c,0x3b74cd9b,0x3b6623aa,0x3b7c2b4e,0x3b92a5d9,0x3bc1fcae,0x3bd06f9b,0x3bbe932b,0x3bb545fe,0x3ba9806c,0x3ba307a0,0x3b9da6d8,0x3b85ef51,0x3b0d5e46,0x3b32c70b,0x3b27155b,0x3b8db921, +0x3b84cead,0x3b8197ba,0xba55cbcb,0x3b05ce12,0x3b0c5a0e,0x3ae4e2a7,0x3b4bb8cb,0x3b7d1a25,0x3b9f99a9,0x3b2cc4fd,0x3a1a2692,0x3b880696,0xb95d30e8,0x37092053,0xbabecfe8,0xba05bc04,0x39c75a6e,0x3b400439,0x3b81e7da,0x3b7d50c6,0x3b85fb2b,0x3b6be387,0x3b8bb38d,0x3ba6e29c,0x3bfec89f, +0x3c0ea404,0x3c00999b,0x3c054fd6,0x3bfaa52c,0x3be64949,0x3bd21616,0x3b8f7a03,0x3a97576b,0x3b0b220d,0x3ae3173d,0x3b4ec0a6,0x3b443617,0x3b192565,0xbb2180b1,0x3b5bfe9c,0x3bad220e,0x3b3be272,0x3bb13d13,0x3bca80ad,0x3bc0ac69,0x3b4ddda6,0x3b5570d1,0x3b9b0836,0xba297e63,0xbad188ed, +0xbb3a2d88,0xba89fba1,0xba771378,0x3b2c3b04,0x3b826a2b,0x3b88e7af,0x3b9adf9a,0x3b8bdeca,0x3bba7487,0x3bf886c6,0x3c503f81,0x3c637d27,0x3c3899ff,0x3c2bb211,0x3c105e71,0x3bf589ea,0x3be8d3f6,0x3baa04f3,0x389ce106,0x3a786cae,0x3be8e7e0,0x3bd2be87,0x3c2b1cbe,0x3c409375,0x3bc2e4e8, +0xbb5f76d9,0xbbebfecd,0xbb8b1cea,0xba2b6e3f,0x3afd4437,0x3b596bfc,0x3b7c63a5,0x3b01cb90,0xbac7c7ca,0x3af6e4e0,0x3b4a075b,0xb8c64500,0x3b0fc318,0x3ad217ef,0x3b8b8746,0x3bd7f74e,0x3ba0aa7d,0x3b90ed8b,0x3b3cb1fc,0x39c6472f,0xbb82d7c1,0xbb8c8076,0xbaf9ee0d,0x3bd25ec0,0x3c2086f1, +0x3c4c84a1,0x3c73384a,0x3c12adc4,0x3b58fa93,0x39efd4a1,0x3b4deb32,0xbbb89745,0xbb674873,0xbc25c048,0xbc32c622,0xbc07552a,0x3bb5f90c,0x3c2b6e5a,0x3beaa74c,0x3ac499bd,0xba08cd32,0xba802617,0x3ad1a15f,0x3b5a92ee,0x3b7616d7,0x3b3bf2cb,0x3af52bf6,0x3b1ec30a,0x3a8fe32a,0xba062f66, +0x3af6bedd,0x3ba13b9c,0x3bd4713f,0x3c0dbdb9,0x3bb20304,0x3b5c075f,0x3af42359,0x3b07b56c,0x3b407fd5,0x3b92e391,0xbb06edf5,0xbb166403,0x3bab0d9c,0x3bad4c40,0x3c1c9f19,0x3c814684,0x3ad0ce1e,0x3bb184b0,0x3c8a236f,0x3bc77d4f,0x3b1a5e86,0xbad6086c,0xbbb492ad,0xbb56d8ba,0x3b69cbb1, +0x3b8ec8aa,0x3b76b7b8,0x3a182cd6,0x394e047d,0xb99d5587,0x3901b713,0x3b1ab797,0x3b5cf6ac,0x3a420fdf,0x3aff32c0,0x3b11f037,0x3b219571,0x3a6629d4,0x39918582,0x3b163233,0x3c081a74,0x3c5b0c9d,0x3c8392fb,0x3c7e18b7,0x3c37d973,0x3b89bac0,0x3bef41ab,0x3c80e1a9,0x3ce92ba7,0x3c928d78, +0x3c0ae380,0x3b56da2a,0xba692d13,0x3b0f96fa,0xbc04e955,0xbb9c7a10,0xba6df48f,0xba733b6b,0x3b0657d1,0x3ad33dfa,0x3a89d827,0x3923f52b,0xba807940,0xba114dcb,0xbaceedb9,0xbaeefdeb,0xb9e2cac2,0xbaf5cefd,0xbb230a60,0xbaf79830,0xbaba1f26,0xbb131753,0xbaefb53b,0x3a707ff9,0x3b531803, +0x3ba83fb6,0x3bafd84a,0x3bc0bc8d,0x3bf22f95,0x3c266af5,0x3c364d76,0x3c1a20a2,0x3c359ea6,0x3c0b99da,0x3bb09f95,0x3c1b5589,0x3c6fc2a3,0x3ca36181,0x3c27ccc3,0x3cc28ec4,0x3c4a1214,0x3b2aa084,0x3b87656c,0x3b968ee8,0x3b3da792,0x3b087e83,0x3aeaabb8,0x3a756a0d,0x3ab6e17e,0x3b09dbeb, +0x39cae62c,0xba8734b0,0xbaf37b26,0xbb0321e6,0xbabf1701,0xba6b7bf0,0x3a88d26b,0x3ac5ce45,0x3b1eebbb,0x3b16bbbf,0x3ad90ab9,0x3af25321,0x3aeaa0f2,0x3b23f389,0x3b63d844,0x3b6b4f63,0x3bac857e,0x3c0b4c3f,0x3c288d44,0x3c5bbe3f,0x3c97a9d8,0x3c9c484a,0x3ca488b0,0x3cb86603,0x3cc471da, +0x3a21276e,0xb9b788e9,0xbc0dfec0,0xbbfeb535,0xbc11af1c,0xbbe46113,0xbbb3fe18,0xbb888ea5,0xbb8ab505,0xbb8bb7f4,0xbb62fd0d,0xbb4c0a81,0xbb1bef01,0xbb127a2c,0xbb292af1,0xbb156ef0,0xbafb24e0,0xb9c49889,0x3a4a967f,0x3ab3a418,0x3b347d88,0x3b8471cf,0x3b96692b,0x3b9e2ce9,0x3b95b1ad, +0x3b8e9dab,0x3b94e922,0x3b7193a9,0x3b15cc68,0x3b28fc6f,0x3b7f340a,0x3be994e4,0x3b93646b,0x3b4cd979,0x3ac0be29,0x3a338634,0x3b22a5f9,0x3aca0650,0x380de7d3,0xba4d424a,0xbb5a5330,0xbb803d2d,0xbbabe850,0xbbcac655,0xbbcd6743,0xbbb12b80,0xbbb5e63f,0xbb83028b,0xbb90ed14,0xbb33427d, +0xbb3a8057,0xbafdb8b3,0xbb050aa8,0xb9d6f0c7,0x3ab4b437,0x3b69135b,0x3b54f2e3,0x3b3bf1b1,0x3b2e3aae,0x3b23ac1c,0x3b1e80c1,0x3b0dc6ba,0x3b58cada,0x3b947f8b,0x3bbe8c45,0x3bd082e5,0x3bd46fd5,0x3bdf66e0,0x3bb31aea,0x3b950e40,0x3b7574bb,0x3b4793ee,0x3a32780b,0x3a85fc75,0xbb31e61f, +0xb64f2065,0xba2ff49e,0xba85f154,0xb93bce18,0xb9c0a66f,0x399ccd65,0x3a3f534a,0x39928d02,0x3a89cdce,0x3a45b25d,0x3a320f94,0xb9725ab6,0xb96ec983,0x3a76be3c,0x3a122b97,0xba2b1755,0x3a16f9a3,0xb9870426,0x379bc1de,0xb8ab1c0d,0xb90f7c80,0xb94bbe83,0xb9bb173a,0xb7e16d07,0x39589bc9, +0x3a16bd59,0x3a7ff33a,0x3ad22bf0,0x3b1d3e2c,0x3b0ac9da,0x3afad771,0x3aca9031,0x3a9dc976,0x3ae87165,0x3b14041f,0x3af47c77,0xb8e9259b,0xbb82c5d9,0x3b13fedb,0xb9503183,0xbb6f7886,0xbb7c56ed,0xbb85c6fd,0xbb8a13a7,0xbb961ab7,0xbb9c82cd,0xbba348bb,0x37c831f9,0x3b0fcc26,0xbb8beb6d, +0x37945e18,0x3ad9e74a,0x3ab09676,0x3a971258,0x3a9ea131,0x3a8ee414,0x3a8cb002,0x3a884818,0x3a7aafdf,0x3a9e379c,0x3ab893ab,0x3ad1e16b,0x3af05b7e,0x3b017fef,0x3b118824,0x3b0408f7,0x3b00bb3e,0x3afb9c57,0x3b023cc5,0x3b0c5d9d,0xbb9ee717,0xbb867ea0,0xbbc10b88,0xbb0b9aee,0x3b19ffa0, +0x3be455c1,0xbb826516,0x3aa88bab,0x3bd0e9d7,0x3be1b24f,0x3be5ca53,0x3be433eb,0x3be4f856,0x3be54270,0x3bf57521,0x3aa22966,0xbb7630d1,0x3be867f8,0x3ab8b7aa,0xbb2065ab,0xbbbe8563,0xbb9293fe,0xbba91450,0xbbaef910,0xbbb17a13,0xbbae1ad8,0xbba4a060,0xbb968321,0xbb93eba7,0xbb9ac9f7, +0xbba43bd2,0xbbab7823,0xbbb29826,0xbbb47e29,0xbbacb1bb,0xbb8ba1c6,0xbb991a2a,0xbb8f6cb5,0xbbafeac3,0x3b84ea70,0xbb6f8001,0xbae448f0,0xb925c6f8,0xbad569ea,0xba8b45e5,0xbb219ec1,0xbb17f609,0xb8d974ac,0xbb3f018e,0xbb317286,0xbadd14f3,0xba876351,0xbb1029a9,0xbb80fdf5,0xbb679821, +0x3b1990a7,0xbbac4ac9,0xbbc9a461,0xbbe0f8ef,0xbbfb60eb,0xbc024263,0xbbf18d74,0xbbc71a77,0xbb934170,0xbb88f921,0xbba99195,0xbbca9953,0xbbe6e401,0xbbf09f40,0xbbf236bb,0xbbd137ac,0xbb7f3039,0xbb95601d,0xbb9a4048,0xbb892b80,0xb90a76be,0xba2be41e,0xba9933fa,0x399df931,0x3a1f0fec, +0xb8fb69f6,0x3b132393,0x3aca2fb5,0x3b6c78c1,0xbaa238f2,0x39dfbbe0,0x3a189ab7,0xba55b491,0xbb3abdef,0xbb7d6754,0xbb522646,0xbb01f708,0xbb699898,0xbbf7624f,0xbc046f30,0xbc1f9dd8,0xbc28ef44,0xbc1b003a,0xbbf84978,0xbb9cc4fe,0xbb8b44a3,0xbbc659b9,0xbbebc812,0xbc11ef96,0xbc22014d, +0xbc234912,0xbc096b16,0xbb6fcfe3,0xbb9e35f3,0xbb74a757,0xbb3a0e37,0x3a58205c,0xbb07b664,0xbb811e25,0x3a9300ad,0x3b8138bd,0x3b4cf2d2,0x3b9b42db,0x3bc4ec68,0x3bc37291,0x3b4fc1d3,0x3b047b24,0x3b70e754,0xbafd56e8,0xbb7ecf1d,0xbb4fdec8,0xbb8b9ac8,0xba9c770f,0xbb641af5,0xbc1acc87, +0xbc3a975b,0xbc6ce91b,0xbc77be55,0xbc5740ef,0xbc0cff79,0xbb34b34c,0xbaeced50,0xbbbadf5b,0xbc0fec0e,0xbc3ca3ef,0xbc55303b,0xbc431625,0xbbf9ace9,0xbaa51489,0xbb1f4450,0xbc358858,0xbb8b8e7f,0x3bc894f5,0x3c08a8a0,0x3bf9b7e1,0xbafda34a,0xbbfe1e5b,0xbbac0f4c,0xbad61220,0x3a3b64f0, +0x3ae165dd,0x3b75005f,0x3b1620c5,0xbaf24d4b,0x3abef9ab,0x3ab21a8b,0xba77b4b2,0xbb39ebe2,0xba3d7bb1,0xbb18bfaa,0xbbef37cf,0xbb90838c,0xbb92522b,0xbb27d011,0xbb8d6503,0xbbefb587,0xbc51fda8,0xbc56eff0,0xbbc9845b,0xbbbf4a82,0xbbdcd81b,0xbbebc7d8,0xbc4188dd,0xbc7afa26,0xbc62338f, +0xbc44228b,0xbc247054,0xbbf4d947,0xbc463919,0xbc5d3460,0xbc66d013,0x3af648ac,0x3c0f6897,0x3be0af81,0x3a9b424e,0xbaa613c8,0xbaffe779,0x3a2b8e1e,0x3b2389c6,0x3b42a40d,0x3aa2bc0a,0xb9442893,0x3a2e0376,0xb9c53012,0x3a2499f8,0xbb046f55,0xbbced615,0xbbf43979,0xbc3a8e69,0xbc12fe19, +0xbbc50fdf,0xbb40cf11,0x3b08570e,0x3b52c575,0x3a90083e,0xbbb42cd8,0xbbb63443,0x3b72cb7e,0x3a2ee80d,0x3bb0fa1d,0x3c8036d5,0xbaa0d4ab,0x39f121ba,0x3c67736b,0x3bae6cb7,0x38666563,0xba8757e0,0xbbc387bd,0xbb6b18b8,0x3aaa967d,0x3b40fec2,0x3b35e893,0x38a3fc4b,0xba63416b,0xba99c6e2, +0xb7b62b12,0x3aade3df,0x3a9a2962,0x39bf2579,0xba68eb6c,0xba22553f,0xbaa7d084,0xbb4b4945,0xba91c6ec,0x3a232dd5,0xbb2563a3,0xbbb7dc07,0xbc0185fc,0xbc1f7032,0xbc1ed386,0xbbf74e03,0xbc0edf7b,0xbc0593e2,0xbb23a9ec,0xbca7e329,0xbce02206,0xbcd3330a,0xbc45cec0,0xbc4d9983,0xbc001f8f, +0xbb828881,0xbb484333,0xb9a4d1aa,0xb9880832,0x3a7f8fcf,0xb8c9b734,0xb87ccc65,0xba9805ed,0xba7ebe3b,0xbb0564c3,0xbb01c0a9,0xba972816,0xbb2a5299,0xbb42c195,0xbb54854a,0xbb5a7273,0xbb087795,0xbb7969f1,0xbbcdfbfb,0xbbe95d17,0xbbe6fa5a,0xbbbe2381,0xbb1478a6,0x3b248a63,0x3b962a3d, +0x3bae85f5,0x3b88b4f9,0x3ba40aa2,0x3aa520d6,0xbb4acf68,0xbc50a8c2,0xbc8b74ea,0xbcacf0aa,0xbc6221f9,0xbb8d5998,0x3a821783,0x3c13e288,0x3b7d7100,0x3b44af68,0x3b520627,0x3ad8c5b3,0x390a6a3f,0x39d7c6b7,0xb8086267,0x3aacfff2,0x39e449eb,0xba64e8e7,0xbb298d96,0xbb1c4b41,0xbb02ace9, +0xbb02ddef,0xba7ad572,0x3a795743,0xba0564ba,0x39cf0b1b,0x3ac0a0f0,0x3a28cc8e,0x38d57632,0xbb0433cd,0xbbb3410f,0xbbc74c29,0xbbc4158e,0xbbc36b0e,0xbb36f8d2,0xbae4e4cd,0xbad5184b,0xbb82de0c,0xbb7f49ab,0xbb429dd5,0xbafd9811,0xbc1cb58b,0xbbf8d195,0xbb98f900,0xbc0afab4,0xbbf98a3c, +0xbbe28f94,0xbbb8b3b5,0xbb8332ae,0xbb9c2805,0xbb9183ef,0xbb7d429d,0xbb69e62a,0xbb534ed7,0xbb40bec1,0xbb5fdc12,0xbb6a0325,0xbb8210ab,0xbab862d1,0xb898473b,0x3ac3c7a1,0x39585adb,0xb9fd4847,0xba069994,0xba89d65c,0xba9625e8,0xba8e7745,0xb93c68d1,0x3a4dca17,0x3b10d6ec,0x3a57ab5c, +0xbaea2be2,0xbbca06b2,0xbbb95a30,0xbbc762ec,0xbbf4ac7c,0xbbfc4dc7,0xbb6b556c,0xbb1d0d1d,0xbb1c7a11,0xbb9073aa,0xbb9b907e,0xbbb63496,0xbbcc9226,0xbbeca4dd,0xbbc22b17,0xbbbf1755,0xbba3eb67,0xbb9c72b6,0xbb4c77e5,0xbb2df19d,0xbb1998c0,0xbb2716ba,0xbb1eaf8e,0xbaad7289,0xb69e50e7, +0xb86520b9,0xba0d3de7,0x3a13793f,0x3a849218,0x3a96afe6,0x3a9b10a8,0x3aa90271,0x39e7a603,0xb9a4cc54,0xba53b76a,0xbac7a49c,0xbadea7e5,0xbb1ad0fb,0xbb210dc3,0xbb3990cd,0xbb448126,0xbb3897b2,0xbb23a244,0xbb1cfb74,0x3aa4fa41,0xbb0edd4e,0xbaa0e8ab,0xba9bf9b4,0xbb19e0dd,0xbb1683f0, +0xbb4641fc,0xbb48942c,0xbb1300ec,0xbb4750ed,0xbb4b5a66,0xbb426e7f,0xbaeb10bb,0xbabec9d9,0xbb09749a,0xbab8d46d,0x399c4621,0xb9b25277,0x392d06cd,0xb950b0e4,0xb9aa2d2e,0xb9d769db,0xb9fd059b,0xb9d115a7,0xbaa1a8fb,0xbb05d679,0xbb447c8e,0xbb7cdb83,0xbb9cc4fe,0xbbb84be9,0xbba107cc, +0xbb899850,0xbb6a70e3,0xbb497dbb,0xbb00e35f,0xbb15a22d,0xba8e14e8,0x3a7fb3ca,0x3b6d65dd,0xbb207275,0x3970a165,0x3b3a78d0,0x3b4e2240,0x3b5765aa,0x3b55c375,0x3b6f762f,0x3b815c62,0x3b84ffd9,0x39b1975f,0xbb0d4447,0x3b813c19,0x3a3279fc,0xbaaa97c2,0xbaec9fb0,0xbad3d4a0,0xbae7b639, +0xbae2cedc,0xbae78fd1,0xbaedaad1,0xbae81eb6,0xbb0c3e8f,0xbb1af8a5,0xbb28c733,0xbb37c222,0xbb460e48,0xbb669402,0xbb4a3874,0xbb3f156d,0xbb2f8387,0xbb205dd9,0xbb2b5c04,0x3b4c6ea1,0x3b242da3,0x3b9e779c,0xba40101e,0xbba53a35,0xbc06f66d,0x3ab8b100,0xbb84b2a8,0xbbf96e5c,0xbc007e62, +0xbbfbe86f,0xbbda728b,0xbc0396d3,0xbc06133b,0xbbfa519d,0xbb92b8cd,0x395e1bcf,0xbc13ef61,0xbba98985,0xbab639d2,0x3b9055d0,0x3b23418f,0x3b41096a,0x3b3e0da1,0x3b3eef8a,0x3b45487f,0x3b4f7295,0x3b644e7a,0x3b6dac8b,0x3b6cccfe,0x3b67e022,0x3b5fd2a8,0x3b545d4a,0x3b424194,0x3b31de8c, +0x3b17720e,0x3b34e061,0x3b4fcce0,0x3b77b9df,0xbbb14930,0x3b36ec7f,0xbab07fea,0xb9ed7402,0x3afd3b7f,0x3aaec91a,0x3b48cb25,0x3b29a519,0x3ab32b34,0x3ade42f9,0x3ac15d99,0x3ace481d,0xba8d7b19,0xba6935b3,0xbad472d2,0xb9d0ec66,0xbbc37c26,0x3b1e3329,0x3b3b1716,0x3b249112,0x3b43a262, +0x3b470cf9,0x3b716d71,0x3b917982,0x3bb398a5,0x3bb8fe84,0x3ba7dbfe,0x3b982c18,0x3b812539,0x3b5a136d,0x3b2a2173,0x3b12e2f9,0x3ad7bf94,0x3b1918a5,0x3b78fcd8,0x3b5a21fb,0x3905ca57,0x3afc24b7,0xbb01d155,0x3a5648f1,0x3a6e76cf,0x3ab73080,0x3aa48668,0x3b64c82c,0x3b43d345,0x3b449df7, +0xba43d29e,0x3b40685e,0xbad59a55,0xba3ce8d3,0xbb3be302,0xbb07e1b6,0xbb378738,0x3a668ac6,0x3b557244,0x3b0f32d1,0x3b43d177,0x3b36e09f,0x3b74665c,0x3b954620,0x3bdbe1cd,0x3bf39fc7,0x3be0af8b,0x3bde174d,0x3bb73169,0x3b8e0e59,0x3b2313f6,0x3aadb941,0x3a51893a,0x3ade1683,0x3b94cb92, +0x3b37d596,0x3a2d6d0a,0x3b051bcc,0xbae9324c,0x3b1ed274,0x3ba2d24e,0x3b7f4e10,0x3bbb8f08,0x3bd3d960,0x3bedddf2,0x3b29f330,0x3b2bebf9,0x3b9f0792,0xb971c67b,0xba314999,0xbb93bc2e,0xbaa3e2dc,0xbb751be3,0x39a18310,0x3b119f76,0x3a4d1268,0x3b19522d,0x3b2ecc33,0x3ba20c3f,0x3bf92afd, +0x3c3cd0fd,0x3c3ef587,0x3c1a19d4,0x3c01670b,0x3babe838,0x3b37b2bb,0x3a0ef2cc,0x39e595c4,0x390be4d6,0x3a8a83f6,0x3bd3055a,0x39c4faf5,0x3a39ed98,0x3bac6bd5,0x3b91260b,0xbb380955,0xbbc8ea7d,0xbba27454,0xbad30936,0x3a674b8e,0x3a6cafb2,0x3b94a191,0x3b5dd85c,0xbb0c436d,0x3ad9604e, +0x3b3b7cac,0xba66e599,0x3aa0af72,0xbb01c564,0x3a6ed1d4,0x3be51410,0x3bc0432a,0x3bf17224,0x3b72d670,0x3add43e4,0xbaa65a3a,0xba9c3acd,0x3b06dde5,0x3c370abb,0x3c3c80df,0x3c43027a,0x3c4e61f9,0x3baa63ba,0x3939abac,0xb8e89457,0x3ae9c890,0xb81845b8,0x39f69f70,0xbc0ddd5c,0xbc1a13ba, +0xbc266748,0x3afc8bda,0x3c0f1efb,0x3be8d828,0x3b0692bb,0xba5ca2bd,0xbb0ea3ec,0x390d669e,0x3b0a3024,0x3b6185d9,0x3b409c71,0x3acb4e73,0x3a983a68,0xba07f670,0xbb4556b5,0xb9ecce37,0x3b41e28b,0x3b3c79f8,0x3bacbdde,0x3b1d6700,0x3aa063b5,0xb9fde0a4,0x3b4d341d,0x3b8064d6,0x3b18365d, +0xbb0719c5,0xbb1ffac3,0x3b864964,0x3b5f2e80,0x3c068320,0x3c83056f,0x3b4715b9,0x3a5042c3,0x3c696445,0x3a473a3b,0xbb055e98,0xbb2baad6,0xbb98555d,0xbb8028f6,0x39ce67d4,0x3b1a5d03,0x3b4be72a,0x3a2832f9,0xb939f8f8,0xba2ce5c3,0x395184ce,0x3aaebc9d,0x3b3a22ca,0x396f12d5,0x3b08b890, +0x3a926d74,0x3b294060,0x3b34e2b1,0x3a9c99ef,0x3b770846,0x3bfe09d4,0x3c3bb4c4,0x3c4fa863,0x3c4ad6b8,0x3c2d22bc,0x3c018832,0x3c21609b,0x3c811167,0x3cd596a0,0x3ba840b9,0xbbc4e3f0,0xbbc1c707,0xbbd5c28d,0xb9de5328,0xbc0159f6,0xbb529213,0x3a25c674,0xb9cd964a,0x3ae348b1,0x3ac3de6d, +0x3a78ada6,0x39f16a20,0xba8b60e9,0xba84db0a,0xbabc1feb,0xbabaad14,0xba518fb9,0xbadefe8f,0xbb2494c9,0xbb175d77,0xbb0f322e,0xbb8b7bf2,0xbb0e222f,0x3985d463,0x3a862ed9,0x3b25a000,0x3b2644c4,0x3b8860cd,0x3bc2dee7,0x3c01ecfe,0x3c05768b,0x3bd9e5e0,0x3bbe9482,0x3b7f736b,0x3bdc8824, +0x3baf61a5,0x3bffe1dd,0x3c2535e6,0x3b69b22d,0x3c7c47fe,0x3b3fd7af,0xbb06d926,0x3abdfeb8,0x3b3dfeab,0x3b0ca9c0,0x3af4ef86,0x3a471839,0x376d02e4,0x3aa363dc,0x3af6dde8,0x3ad9855a,0x39436a19,0xbb01cd51,0xbb0ff6b5,0xbb0cffd1,0xbacde4b4,0xb90fcbe5,0xba1ea669,0x3b0a03ff,0x3b033be5, +0x3a974ef0,0x3b0aa24f,0x3aa42791,0x3a7ad5b0,0x3a3ee75d,0x3aaae20d,0x3b4463e0,0x3bcd12ed,0x3c0a0e7e,0x3c30631a,0x3c695ab4,0x3c687467,0x3c74e30d,0x3c8c732a,0x3c86beee,0x394272e5,0xbb671b45,0xbc1cd5ec,0xbc05a86e,0xbc0ac936,0xbbb28ebf,0xbb3c0717,0xbb2af2a5,0xbb0f86b1,0xbb243f66, +0xbafb0c1a,0xbb394fa9,0xbb1c749b,0xbb10d021,0xbb0686e2,0xbb1b1fb6,0xbb4975f1,0xbaf6ef69,0xb9a4b361,0x3a618964,0x3b32a89b,0x3b8068fc,0x3b84a7b9,0x3b7dd372,0x3b67ccfc,0x3b49b54b,0x3b5f1d86,0x3b52047a,0x3b49ddcb,0x3b571308,0x3b94156a,0x3be45e4c,0x3bacf52b,0x3b723a5d,0x3af02017, +0x399ad142,0x3ae5f9de,0x38306e3b,0xbb448e7b,0xbb50fb68,0xbbc8ff75,0xbbbf3c8d,0xbbce5c40,0xbbcf212e,0xbbd248d7,0xbb9cc7fc,0xbbae233f,0xbb397c0e,0xbb6b0e07,0xbaf24d9a,0xbb268605,0xbafc68f3,0xbb1e0cc9,0xba97b030,0xba02be6e,0x3afc04d3,0x3b3cac0e,0x3b22e078,0x3b3be3bf,0x3b3d2bf2, +0x3b4767cb,0x3b4592b9,0x3b6dcec5,0x3b891bf8,0x3b9c88e3,0x3ba6a5df,0x3ba55c36,0x3ba87fde,0x3b7068af,0x3b30c275,0x3b0fb4d4,0x3ac4b7eb,0x3a62302c,0x3a5ded44,0xbb50f7f4,0x38c6745d,0xbaa5c554,0xbab95d61,0xba0bd6ea,0xba848dc1,0xb872715f,0xb8e9d0a4,0xbaa6997c,0xb9640646,0xb7a7838c, +0xb9a6537c,0xba7e2d91,0xb95ca2fa,0x3a4d395c,0x3a93ef86,0xba068532,0x3b092f46,0x3ab5d8cf,0x3ab073b5,0x3aa1fe17,0x3a8272ef,0x3a585c0a,0x3a1d6d95,0x3a88720f,0x3aadc001,0x3acc648c,0x3ae3888f,0x3b0641f4,0x3b276362,0x3b1e9f32,0x3b107b96,0x3aec4547,0x3aa60038,0x3ae34f9d,0x3b1f5323, +0xb942efcf,0xbb2125c5,0xbb8b853d,0x39ea50e9,0xbb2c2f1d,0xbb9b2f8c,0xbba164e4,0xbba5e1f2,0xbb9aa3ce,0xbbabf41e,0xbbb22639,0xbbb1e435,0xbb209ec2,0x3a0c2068,0xbb993d92,0xbb09e9ea,0x3926d921,0x3b16f93c,0x3ad25c7e,0x3ae1f609,0x3ad0ea38,0x3acf6f7c,0x3acc6dad,0x3abdd021,0x3ad3f482, +0x3ae2e407,0x3af73245,0x3b07b025,0x3b0e7c7c,0x3b159b66,0x3b057e69,0x3afde658,0x3af9115e,0x3aff03ed,0x3b079718,0xbb20e17f,0xbb073fe5,0xbb824a20,0x3b21f99c,0x3bb96f01,0x3babf427,0x3a20d0a8,0x3b9cb777,0x3bc37d9a,0x3bcb7f6e,0x3bcb980e,0x3bb7cdbb,0x3bbee2c9,0x3bbabeef,0x3bb7b013, +0x3b9b614e,0x3a719500,0x3b9c6bb7,0x3b9406a9,0x3b045bb1,0xbb7e6bae,0xbb1f1186,0xbb37f58f,0xbb3ee535,0xbb3cb2aa,0xbb310b40,0xbb13ac90,0xbb088a52,0xbb0620ea,0xbb13bbc9,0xbb180064,0xbb21cd37,0xbb378744,0xbb2c2a60,0xbb251dbd,0xbb0d04e7,0xbb197456,0xbb1437f4,0xbafdd400,0x3bc95cfb, +0xba2a900b,0x3ac91682,0x3af13f09,0x3a043024,0x3a991b2a,0xba19f188,0x3986e707,0x3b395113,0x3924da86,0xb9d7d534,0x3a1e1dd8,0x3a832a1c,0xb9215e23,0xba7735b4,0xbac32c8f,0x3b5ff3ca,0xbb221628,0xbb850b10,0xbb74fdfd,0xbb8d934d,0xbb8d13e9,0xbb7329ce,0xbb0f89de,0xbab2d18d,0xba9f68cd, +0xbb019629,0xbb1efaa1,0xbb3edd84,0xbb60c5e3,0xbb3dbe24,0xbb1b752a,0xbaccb5e2,0xbae00e50,0xbb3dd0a4,0xbae5824d,0x3b5eedd7,0x3af94d2e,0x3aa36ef1,0x3b006cfe,0x3aeccba2,0x3acb4004,0x3b469e2c,0x3aa73e2a,0x3ba8d738,0xba1fe9df,0x3adc7ea8,0x3aa4905b,0x3a9a9e77,0xba23ed76,0xbb2a9ed2, +0xbad45d49,0x397e087d,0xbad70b9f,0xbbb513cd,0xbb9d9899,0xbbb711e1,0xbbb3f0e2,0xbb8f2ed1,0xbadb3506,0xba0f6858,0xb9915f88,0xbaff11e2,0xbaf9b54b,0xbb4222a6,0xbb9a4cac,0xbb62a1dc,0xbb4d3563,0xbaea421f,0xbae199e3,0xbaf413b4,0x386e24a7,0x3b9358a4,0x3a91fc18,0xbabc01cb,0x3b032410, +0x3b75ea9c,0x3b71ceb3,0x3b969b07,0x3bc924ac,0x3bc2d494,0x3b24a574,0x3ad75841,0x3b3ef957,0xba931c88,0xbb3ab0ff,0xbb30b6fe,0xbb841d15,0xb9e04625,0xbb338a08,0xbbfa51a8,0xbbe533d3,0xbc0600f6,0xbbff0bbc,0xbbb04c5b,0xb96ab3f5,0x3b3a0518,0x3b191d66,0xba95d561,0xbb008e53,0xbb5d143b, +0xbbb93266,0xbb4049bc,0xba4f28df,0x39ef2c46,0x3a4d7be1,0xbc0cb4b9,0xbb16717d,0x3bcf1203,0x3bf09545,0x3c05a159,0x3a67b293,0xbba26828,0xbb9457be,0xbb03e06b,0x3974d702,0x3852f4ed,0x3b95df4f,0x3b731b7e,0xbae61b21,0x3ae329df,0x3ab7392c,0x39b140b4,0xbae85509,0x3a9dd679,0x39f5822c, +0xbb829170,0xbb124a48,0xbb961c85,0xbb0e3494,0xbb90a25b,0xbc148fc4,0xbc49d733,0xbc2d4af4,0xbabff286,0xbb0b9935,0xbaf1728c,0x39aef769,0xbbcaedb6,0xbc2d577d,0xbc29c288,0xbc0280e4,0xbc08d0b0,0xbb2470b9,0xbb87259f,0xbc11181f,0xbc4505ae,0x38d4e616,0x3bd066e5,0x3bd2b9da,0x3af994df, +0xba5ca8cc,0xbb3e2ea2,0xba4ccfbe,0x3ab6a10c,0x3b16d15e,0x3abe76ad,0x3a0d6f47,0x3ad8f494,0xba8ef347,0xb97a33d7,0xbae7e073,0xbb7ed4d3,0xbb30885b,0xbb9a8550,0xbba8eab5,0xbb719a92,0xbacaa859,0x3ba2515f,0x3ba6d7bc,0xb9b843af,0xbb83d1ba,0xbb328f63,0x3bd0e021,0x3bcc30c9,0x3c23517d, +0x3c7411ff,0x3a326d51,0xbb70af86,0x3c2a8b5a,0x3a9cb75b,0xbb84b68c,0xb91b9089,0xbb884f85,0xbb1c6d43,0xbaac6565,0x3aa9d7bb,0x3ae95be8,0x3a10c4fb,0xba812cce,0xbab8c87a,0x388d7c34,0x3a888f64,0x3aa7079c,0x3ab7a256,0x39f454a8,0x3b0c6540,0x3a7d50a2,0xbb115ebd,0x39415855,0x3af9e50d, +0x398674ae,0xba9139fe,0xbb20d898,0xbb9cd90e,0xbba9ea26,0xbb27d7e0,0xbb9aadea,0xbaeb190b,0x3c209ac6,0xbc378cc3,0xbc9af708,0xbc74e0ed,0xbc37e0d1,0xbb864ca8,0xbba74788,0xbaca15a6,0xb9b4b338,0x3a6e4ad7,0x396c5b5a,0x3a27ba1c,0xb8846b3a,0x3982bec4,0xba9ecb7e,0xba8d8c68,0xbac1a2b1, +0xbaa54ef0,0xba740d30,0xbaef228f,0xbb02b4b1,0xbb2c17a8,0xbb630923,0xbafb8619,0xbb561763,0xbbb26ffa,0xbba543ac,0xbb95d785,0xbb2825c6,0x3a8e206e,0x3ba02990,0x3bf6a530,0x3c0e0ecb,0x3c136ecb,0x3be55fb2,0x3b479996,0x3a230e55,0xbaea25df,0xbb119ba5,0xbb91f285,0xbabbb484,0x3b717d7f, +0x3b6ebba1,0x3bf7e3e9,0x3b7f4cfc,0x3b654cab,0x3b866bbe,0x3b24c300,0x3a8ac2bd,0x3aa96a8a,0x3a3ccdf1,0x3afe1c50,0x3adb5637,0x39bfd0cb,0xbb0027f4,0xbb138420,0xbb21a624,0xbb2ef5aa,0xba0a5f1f,0x3b1659cb,0x3a680be5,0x3a366b6d,0x3ac9d671,0x3a7cb612,0x3a80f5ac,0x385b521b,0xba7967c8, +0xb9abf9c4,0x3aa2ae78,0x3b7138bc,0x3b80b04f,0x3b9ae060,0x3ba1c412,0x3bafcbf4,0x3bd0a1ba,0x3bc121e7,0x3bec428b,0xbb81f251,0xbb3f1243,0xbb04434d,0xbb8a7351,0xbb8c336e,0xbb352d72,0xbb0d9704,0xbabcd268,0xbb0f1feb,0xbb1cc4d0,0xbb27562d,0xbb3bc774,0xbb3ca84a,0xbb35a5b8,0xbb1d687f, +0xbb11dded,0xbb3c6c47,0xbb03282e,0xbaac32cf,0x39b0c591,0xb9274d13,0x391dfaf4,0x39a0fb56,0x3a9adeb4,0x3ac33aea,0x3a906dab,0x3a6993fb,0x3a130d73,0x3a96524e,0x3a073af1,0xba07cfa6,0xbb1d039f,0xbb364fae,0xbb2c72f0,0xbb35dfd7,0xbb0fbb85,0xbb55f4fb,0xbaf6bab1,0xbaa37653,0xbb675321, +0xbb9209ab,0xbba61618,0xbbb61e47,0xbbcbda2f,0xbb9d52ee,0xbb9d412a,0xbb5008fb,0xbb7479c4,0xbb0d539b,0xbb0a7031,0xbae16a23,0xbb0675a0,0xbae306df,0xba30747a,0x3a7a0f95,0x39542ea7,0xba2d0b00,0x3a2cc767,0x3a78b8da,0x3a972b33,0x3a9eb23f,0x3abf7701,0x3ab150cc,0x3ac0824d,0x3adab4da, +0x3a890635,0x3a11594a,0xb986fca4,0xba663ba8,0xbad370d1,0xbb206a63,0xbb161af5,0xba88014e,0xba486e00,0x3adcbf6c,0xba9cfda5,0xb87df1d3,0xb9add51b,0xbac285fb,0xbace3840,0xbb0fb4a1,0xbadbeefd,0xb9f7232f,0xba99df15,0xbac5a741,0xba82b72a,0xb7e315f2,0xb8965509,0xb8ee8f7d,0xb9574153, +0x3addd110,0x386a5786,0x39523f5e,0x38d338cc,0xb7f077e7,0xb86eb8ab,0xb8e8ccfd,0xb8f53eee,0xba50c54b,0xbab3a871,0xbaf0844e,0xbb0e7b79,0xbb1b99ec,0xbb2021d7,0xbb08e2d8,0xbad36210,0xbaa5fe57,0xba83f0b0,0xbaa3e102,0xbae4cf01,0x3a962402,0x3b328a40,0x3b39e037,0xb9a3f018,0x3b05229b, +0x3b2d0883,0x3b43d04a,0x3b48d6b9,0x3b33d9c1,0x3b56d5f5,0x3b69e7dd,0x3b67e392,0x3b304bb3,0x3990a513,0x3b6c196c,0x3b3827c7,0x3a8297d9,0xbad1a7a5,0xba8d1e87,0xbaa582a1,0xbaa900a8,0xbaaf3e47,0xbab7976b,0xbab7a974,0xbac55fce,0xbac99828,0xbad26b11,0xbad7abea,0xbae1fda7,0xbaf93e65, +0xbae7083a,0xbae34a22,0xbadb0606,0xbac947c6,0xbae16c48,0xb78e895d,0xb76bde86,0x3aab941a,0xbb863039,0xbbb409f4,0xbb485cd2,0xbb35195d,0xbba767c5,0xbb778eaf,0xbb838e20,0xbb7a26d0,0xbb2a86c5,0xbb6bc26a,0xbb6c3884,0xbb41e194,0xbbada64c,0xbb6620e9,0xbb6ade8a,0xbbb8d753,0xbb964d82, +0x3a5fba3e,0xb9c22e61,0xb9a91dd6,0xb9b49784,0xb9957a48,0xb92fd3bb,0x38c42867,0x397abff7,0x39ad83b1,0x39960ad1,0x390ac174,0xb8d1fc29,0xb9da2dbc,0xba41920c,0xba454ccc,0xb9ac2779,0xb904885f,0x3a8a05dc,0xb8b59cb4,0xbb8942cf,0xb8609ead,0xbb211575,0xbac3b8ca,0xb99ca4a0,0xb94c5483, +0x39ad7e56,0xba26b6e6,0xbabb8443,0xbab4ee47,0xba59d3c2,0xbaa4c335,0xbaf310ac,0xbaf4e1d3,0xbb8336d6,0xbb1db797,0xbba57adf,0xbada3109,0xba725d45,0xbaef1ad5,0xbab972b9,0xba948b6c,0xb9833dc3,0x3a679ef5,0x3ac2899d,0x3ab51916,0x3a2f651f,0x3845e9e0,0xba65bf4c,0xbadcc62c,0xbb2d72d8, +0xbb10f98f,0xba144a2e,0xb92f9296,0x3aea4e95,0xb8fe8b7e,0xbb2081a8,0xb9ad595a,0xbaf43206,0xb8e1a575,0xb8c74af0,0x3a4ce774,0x37776a46,0x3afffb7c,0x3ab09fa0,0x3ad924b9,0xba759d72,0x3a61ffa8,0xbaf9031c,0xbac93b2f,0xbb7e97ac,0xbb5a2fa9,0xbb96fe5d,0xbb1efd0d,0xbab315a4,0xbb33e892, +0xbb1e608d,0xbb138c79,0xba8f38f4,0x39e8c314,0x3ad91b86,0x3b01b41b,0x3a8edc26,0x3a3bf5b6,0xba8b3b56,0xbb351474,0xbba1bc24,0xbb90c6b3,0xba7b015a,0xba3327a1,0x3b8a4863,0x3a5eab71,0xb9c00a3f,0x3a70bc50,0xba8f55a9,0x3abcfaf1,0x3b85d8bc,0x3b99cbf4,0x3bafd3ea,0x3bc9be0e,0x3bf54965, +0x3b21b699,0x3b024993,0x3b844b74,0xb81b69f6,0xba372f75,0xbba9b7e6,0xbb2c2cd7,0xbba23393,0xbb56f86a,0xbb6ebaff,0xbbc66b00,0xbbb094bf,0xbb909d7e,0xbab54835,0x3b411b00,0x3bb1783f,0x3b93af3b,0x3af9d545,0xb886dd9e,0xbb4a77e2,0xbbc4c92e,0xbc0bd7da,0xbbbca56b,0x395454ec,0x3a4b628b, +0xbaba2545,0xbbc60c2f,0xbbac6072,0x39b64670,0x3b81abe2,0xba980304,0xbb9ef621,0xbbb1ff13,0xbb4309e2,0xb9d665f9,0xb9cf43d7,0x3ba5ad8a,0x3b92c896,0xbb13585e,0x3aa03fdf,0x3afb3ed1,0xba004e0b,0xb9f06b4f,0xbb62c92e,0xbb16150d,0x3b1d448e,0x3b46f10a,0x3ba12cec,0x3b0653bc,0x3995cb18, +0xbb11076c,0xbb503546,0xb8f3d572,0x3c095ab7,0x3bc19414,0x3b88bcae,0x3b3f97a8,0xbb8b1098,0xbc016379,0xbbd3ad2c,0xbba07539,0x3b1b0eac,0x3ab20b5b,0xbbecc67e,0xbc11a545,0xbc44f793,0xbb068726,0x3bb5caa4,0x3bbd400d,0x3b2fcd9f,0xb9f6e8f0,0xbb498875,0xbaa02b0f,0x3a6cf486,0x3b3042a5, +0x3b071fef,0x3a0dbff0,0xb898318e,0xbae9c0ec,0xbb6ba265,0xbb557ed3,0xbb019cf8,0xbb5d062f,0xbb49b400,0xbb75907c,0xbb2d42c0,0xbb1e9b7f,0x3b90bde9,0x3b9c57e0,0x38a431eb,0xbb42c68f,0xbb5478c6,0x3b2180a2,0x3b1980eb,0x3bde421f,0x3c62acd3,0x3b6f68a8,0xbbd96342,0x3bc68f24,0xbb26b1af, +0xbb8a2da9,0xbb06122d,0xbb4212e9,0xbb4c346b,0xbb27a2e7,0xb84f5f90,0x3ad50801,0x3a5c77a1,0xba2541e3,0xba8ec6cf,0x392c75aa,0x395a5394,0x3ab02879,0x37c8f5bf,0x3a719390,0xb9b5a115,0x3a8b48d0,0x3b1bd2f5,0x3ae52019,0x3b7d0b92,0x3b7efdb5,0x3b71bba2,0x3af82c4f,0x3ab34a8a,0x3b2937c9, +0x3bacc3e3,0x3bc726eb,0x3bd81778,0x3c0e7a4e,0xbc6a09f4,0xbcbaebda,0xbc8a4239,0xbc598563,0xbb8a7c9b,0xbba0e595,0xbad2dc84,0x3a17d8a6,0x3a958e33,0x3a342b63,0x3a4735e4,0x39da5ae4,0x39d2b764,0xba92a610,0xbabb3fad,0xba915837,0xba551479,0xba9cb6f1,0xbabdfb95,0xbb172087,0xbb42a45a, +0xbb4fba25,0xbb9a9293,0xbb3e2dcf,0xbb2d4c2c,0xbb632b5f,0xbb3d52e9,0xbb0da489,0x3a199995,0x3b5f32bf,0x3b91399d,0x3b8f5789,0x3b80500c,0x3abb3c64,0xb9f77cd5,0x3b6290e6,0xbb302c77,0xbb8898d0,0xbbcb494a,0xbbb330c5,0xbabc54f4,0xbbd39d68,0xbb418ac7,0xba1471bf,0x3a72302c,0x3b019b18, +0x3b01ce7f,0x39752739,0xb8a4c130,0x3a663856,0x3aa320c8,0x3b045860,0x3a4d5a1c,0xbafa2965,0xbb1d490f,0xbb39f61c,0xbb1d30d8,0xbad54865,0xbadb6aaf,0x3a5a97b3,0x3a99294c,0x3a7d791d,0x3ad80ddf,0x3a223d85,0xba1f0678,0xbb140959,0xbad11634,0xb9ea20cc,0x3ac3265e,0x3b667753,0x3b9a12ee, +0x3bb389ce,0x3b76a250,0x3b42d0d2,0x3b47b5c6,0x39fcc351,0xbadde009,0xbbc2dfce,0xbbd318d9,0xbbc791f5,0xbbb79b0f,0xbb54229e,0xba52b52d,0xba804958,0xba15dd78,0xba806215,0xba6f65a4,0xbb2763b7,0xbb2d5019,0xbb24809d,0xbb0adea6,0xbb30c556,0xbb70edd5,0xbb4342e1,0xbacf9717,0xb8f07981, +0x3a9ad77f,0x3ae18df5,0x3acabd43,0x3a89acac,0x3a5479e6,0x3a02b622,0x3a4ee9c7,0x3abba845,0x3b32df91,0x3b27cbec,0x3b1fbd99,0x3b00491a,0x3b0efcee,0x3ad3e8b1,0x3a5a2a26,0xba3947f8,0xbab4ceb3,0xbb245b4b,0xbbabc314,0xbbbb10f8,0xbbff5db4,0xbbe8a14c,0xbbdd4e81,0xbbce1676,0xbbc1180b, +0xbb90d414,0xbb962344,0xbb2e10a2,0xbb3d2ce9,0xbaff6aef,0xbb18b273,0xbb05849e,0xbb13b753,0xbad4444a,0xbae3e3cb,0xb9e09a74,0x3a7f8aeb,0x3aa22ddf,0x3b0f65e5,0x3b09df51,0x3b0f61c1,0x3b14e8ba,0x3b08bdc2,0x3ae9e16c,0x3ac8f08b,0x3aa2c57f,0x3a82576d,0x3a1b69cc,0xb9a75d9c,0xba9369bf, +0xbab8f93a,0xbaf2b229,0xb9318af3,0xba02f841,0xbae98d39,0xba40902a,0xbadf1dec,0xbadeb818,0xbada8482,0xbb10c097,0xbae28b81,0xbb0a218e,0xbb418ecc,0xbb20c5f9,0xbb00beb6,0xbb11e4a5,0xbafcbddd,0xba6d2473,0xba260bf0,0x39a6ca71,0xb94e4c85,0x3aec734f,0x3ae3b4ce,0x3abcdea4,0x3ab98300, +0x3aa41631,0x3a9cafed,0x3a92c0d4,0x3aa2b63c,0x3a9ec531,0x3a840ac6,0x3a36b89d,0x39bec041,0x3929b2eb,0x39990b78,0x39ac06ac,0x3979851e,0xb8b5464b,0xb996fcff,0x38996c30,0xbb24f49b,0xbb59ceac,0xbb03929c,0xbb21638f,0xbb751cb2,0xbb4c9638,0xbb4ac570,0xbb477368,0xbb25b94a,0xbb35f274, +0xbb3554b1,0xbb28f8dc,0xbb6961ce,0xbb0b1ee8,0xbb07895b,0xbb3f3142,0xbaf0cf9b,0x3a694f20,0x398b542e,0x39aefcce,0x3990df00,0x39910a76,0x398cf87f,0x397a8c5c,0x3923e6ad,0x38bfbfbb,0x38acd0f7,0x38ca191b,0x38b407c7,0xb843f639,0xb91fee88,0xb988dd44,0xb9948f08,0xb990fe80,0xb9e8a219, +0x3aafdbec,0x3a953825,0x3a3b77c5,0x3b8fc88d,0x3b7e4f7b,0xba5ab8d3,0x3b832eb0,0x3b7867e9,0x3a2800d2,0x39e45834,0x39c85b00,0xb83de1c8,0xb900e24e,0xb9a74f52,0xba2fd7b0,0x3b72489e,0x3b8079e7,0xbaf1655d,0x3b4704ea,0x3b7832ef,0x3a198cc5,0x3a6599e4,0x3a87ca6d,0x3a82e344,0x3a97d24a, +0x3ab3a623,0x3af2d6f1,0x3ae85b6d,0x3ae9c737,0x3ad58920,0x3ae91a48,0x3ade31e5,0x3ab0166f,0x3abf8f37,0x3ab1ada5,0x3a897177,0x3aa4af11,0x3ac75163,0x3b304095,0x3b59216f,0x3b34e742,0x3b3cbf86,0x3b1814ea,0x3b1d4a69,0x3b33e1bf,0x3afa3bc3,0x3b2f2a89,0x3b7d7b2c,0x3b380cd7,0x3afec361, +0x3b1db686,0x3aea5145,0x3a9da4f6,0x3a8cbb48,0x39e434be,0x3a20f95a,0x3a9cc2a7,0x378b9ae4,0x3a5b6e5b,0x3a563b4d,0x3aa322ba,0x3afba36e,0x3b5b896f,0x3b5df18e,0x3b57d01b,0x3b32d1b2,0x3b3902c0,0x3b29aa00,0x3af8a3ab,0x3b128527,0x3b0a7699,0x3abcfd7f,0x3b0589aa,0x3a905275,0x3af2987e, +0x3b96301e,0x3b6d49d4,0x3b07afef,0x3b288644,0x3b07db44,0x3b2b3154,0x3b1d6a3b,0x3aae932d,0x3b941ae8,0x3a94b29d,0x3aee0205,0x3b063342,0x3aea70f9,0x3aaab88c,0xbab6b9b5,0xb9e9ef28,0x3a254f4d,0x39e24870,0xba48fc76,0x396a662b,0x3a1b2662,0x3ab59788,0x3b2f36ec,0x3bb1f22e,0x3ba4c7e9, +0x3ba7136a,0x3b7f5e8c,0x3ba3e34b,0x3b918081,0x3b186e49,0x3b4dbb10,0x3b0ade3c,0x3a364efc,0x3afee398,0x3b262abe,0x3b5a5abf,0x3bba63ef,0x3b818c9c,0x3a6ddb36,0x3b321159,0x3b6f78b9,0x3b8f3642,0x3b9704ed,0x3bbf3df9,0x3bc298ab,0x3b0bb893,0x3af2b746,0x3b34e1e4,0x39b974a8,0xba37c2f8, +0xbb3c0d63,0xbb34bd98,0xbaaec857,0xbac63ae2,0xbb316de3,0xba6cbd35,0x396f49db,0x3af9bf09,0x3b9de6c5,0x3c1ec3c8,0x3c21e731,0x3c051a08,0x3baf0ccb,0x3bcf601d,0x3bb916f7,0x3b39eb3b,0x3b9414d7,0x3b8d934e,0x3b0963dc,0x3b7b666f,0xbb055a52,0xb9882d55,0x3b635625,0x3b9bd93e,0x3bcd7275, +0x3b0635b8,0xbb2426b5,0xbb8990ef,0xbb393109,0xb9b29d76,0xba10a307,0x3baf0cd2,0x3b9f909d,0xbadb8a4f,0x3ad77fd0,0x3ae7ff2a,0x3adb4051,0x3a450b40,0x3af47c3f,0x3b3adf7b,0x3b476a61,0x3b362425,0x39472666,0x39b3193d,0xbb1eac06,0xbbf6f445,0xbbf66881,0xbb5c3e52,0x3bdf7a25,0x3bb4753a, +0x3bd8387b,0x3c1d706d,0x3adba8f5,0xbb4e6ff3,0xbb98acef,0xbb166581,0xbac0f53b,0x3b35d24a,0x39f3a357,0xbbb15597,0xbc158e16,0xbaf9c4f5,0x3b6e912c,0x3bac7108,0x3b4598a9,0x39a49b7f,0xbb51db7a,0xbaf1a3d7,0x39edfc82,0x3b03d3ae,0x3aeba00b,0x3a990d10,0x3ae6313f,0xbaac9b93,0xbae70f4a, +0xbac0f2ec,0x39e71386,0x3b334631,0x3b6f7669,0x39bc1859,0x3888847d,0x3a520847,0x3be297ad,0x3bc80d80,0xb9dd253d,0xbb08da46,0xb9c66c18,0x3bd475a0,0x3c20b2bb,0x3c4ae5bf,0x3c487821,0x3b86e39f,0xbc06866c,0x3b242bfe,0xbb203524,0xbb9e2b17,0xb9e099f9,0xbae598d7,0xba9a3e56,0xbb4bb485, +0xb9ec6bdf,0x3a4c4b47,0x3a99a6e0,0xba17c678,0xba9c225e,0x381a5963,0x3a0743b8,0x3ab9bf95,0x3adc5469,0x3ae51993,0x3b5a6097,0x3b2638d5,0x3a392761,0x3b0a4337,0x3b636ee9,0x3ba76b02,0x3bd2d953,0x3bcc0053,0x3b9da391,0x3b88cbc4,0x3b9e59a9,0x3bb2efb4,0x3c150bd2,0x3c8b7cd9,0x3a32360f, +0xbbc18db2,0xbad8b76c,0xbc190453,0x3bb0f779,0xbaa357eb,0x39f2fefa,0x3b0c82e6,0x3b1544ef,0x3a9e5a77,0x39d9df5d,0x39a2d642,0x39d84c2a,0xba8d8d8b,0xba9af6a4,0xba3a20ef,0xb9d8c8da,0xba345cb3,0xba504fde,0xba9b3b9a,0xbb0b5d19,0xbb44c1b5,0xbb23952d,0xbb21336d,0xbb29479c,0xba8fb48c, +0xb81e413a,0x3afedcba,0x3b8fa2ab,0x3bdc3281,0x3c1141d6,0x3c20024e,0x3c2a5baf,0x3be099a4,0x3b88ae42,0x3b949c57,0x3c16f409,0x3c51483c,0x3c6ac3c0,0x3c2b73dc,0x3c1ed0e1,0x3b5e2ca8,0x3aaf3f01,0x3b0723c5,0x3b39d476,0x3b6d0eab,0x3b421d0d,0x3b001f21,0x3af75850,0x3ae4c53a,0x3b07aa62, +0x3b14090e,0x3a93b4b8,0xba85dcc2,0xbb08ebb1,0xbb3a1561,0xbb38217d,0xba149573,0x3ad7add2,0x3afb68b3,0x3aa5dd2d,0x3ab85e5d,0x3aa0b15e,0x3af413ae,0x3b244f98,0x3b74f297,0x3bb712bb,0x3c05687c,0x3c43f522,0x3c2de9fd,0x3c3e96af,0x3c52504f,0x3c6f6036,0x3c72038e,0x3c4d97a3,0x3c4bec47, +0x3b5e6c3a,0x3ae713e1,0xbaba8073,0xba3925c3,0xba94bae1,0x3a437eb8,0x3a9a2734,0x3a687c32,0x3a204d4b,0xb8ddea1c,0xba49b3f9,0xbaf5c418,0xbb148a93,0xbb1ecf03,0xbadf4973,0xbab48015,0xbadbe69c,0xbb1e7621,0xbb0e8f00,0xba810292,0x3945b9cc,0x3ace289f,0x3af64324,0x3b60fc4b,0x3b730641, +0x3b49c1d2,0x3b086f3b,0x3a6247ba,0x3a02e7ae,0x3a75c8c9,0x3afde81e,0x3b6e4164,0x3b2ac4c6,0x3b52d0e2,0x3b88bca1,0x3b9261ad,0xbada60e7,0xbac3dcd2,0xbac6fdb0,0xbb47b15a,0xbba11152,0xbba27924,0xbba709f8,0xbba929f0,0xbb8dc3bf,0xbb7f5488,0xbb27b928,0xbb2f0e26,0xbb0c18d6,0xbaf9910a, +0xbadaeb9d,0xbad3fce3,0xbab161a3,0xba04e2ff,0x3a4dc73d,0x3a059f30,0x3948e067,0x3a8da67d,0x3abb9b01,0x3ab14043,0x3aa6d5df,0x3ab9bb71,0x3b09ed7b,0x3b43be7e,0x3b76828f,0x3b73c0b8,0x3b59ecd4,0x3b3edd11,0x3aec409c,0x3a49c62d,0xb9dc6731,0xba67d7f4,0x3a228362,0x3a4bfc60,0x375034b1, +0xb973a215,0x38733f85,0xb9d4d1a2,0xba5c3b3b,0xba9fea05,0xba9ac6bc,0xba08847b,0x38834212,0x38a1dce9,0xb953ab49,0x39827f76,0x39f52470,0x39cce396,0x3a95029a,0x3a3300b7,0x3ab54f7a,0x3a064a63,0x39757472,0x39e91bd7,0x39eadb9a,0x3a0e0758,0x3a2832cf,0x3a211b1c,0x3a0a2720,0x39ff47b4, +0x3a2f094e,0x3a663830,0x3aacca90,0x3afa5efd,0x3adaaa91,0x3ad419b9,0x3abedfae,0x3aa3b29b,0xb94d6066,0xb9de6772,0x3ac551ba,0x3aaaae18,0xba8263ca,0x3a5777ac,0x3a6507cc,0xba674d41,0xba35c351,0xba3fd4bb,0xba837090,0xba48e8f3,0xba2d7c74,0xba4bb62d,0x3ae4b6d1,0x3ac0a3fa,0xb99831e8, +0x3af08bd5,0x3ae1d02b,0xb9eb9a25,0xb8e1db07,0xb93c7392,0xb988fe01,0xb98da5cc,0xb99fbb4f,0xb9a6f847,0xb9288c33,0xb76eb017,0x38cac4c7,0x398d7cc3,0x39c7331c,0x3a1b074a,0x39a9eddd,0x39191c3c,0xb818ee1a,0xb8c6399e,0xb98bfefc,0xbb41c3da,0xbb1be3eb,0xbb43d397,0xbb778aeb,0xbac3b3a3, +0x3b70e1f1,0xbb8ac433,0xbb05d15c,0x3b255c8e,0x3b1d3569,0x3b253f7f,0x3b4a63d3,0x3b43bd5f,0x3b494510,0x3b603282,0xbafa8f86,0xbb882439,0x3b5e9fea,0xbb009931,0xbb86a6f7,0xbb56484a,0xbb434ba8,0xbb5b748c,0xbb5e9c82,0xbb558e57,0xbb4ac3fe,0xbb2ebb45,0xbb340ff4,0xbb341166,0xbb3e0d53, +0xbb44fb6c,0xbb55b98d,0xbb7004a0,0xbb7c7371,0xbb6f6799,0xbb2e9ffa,0xbb36bc6a,0xbab69ddd,0xbb546468,0x3a29b742,0xbb0c097c,0xbac7bdbc,0xba797629,0xbacf3c55,0xba432c2c,0xbb029d11,0xbb2d2183,0xbb07985a,0xbb39f644,0xbb09d729,0xbb21df16,0xba8c0622,0xbad1cd56,0xbb85f704,0xbb53a797, +0xba97a01b,0xbb99b310,0xbb952f18,0xbbadbe61,0xbbae02b3,0xbb9c7490,0xbb79e6a6,0xbb157808,0xbb1272d8,0xbb27066e,0xbb6247ef,0xbb803e98,0xbb9a642e,0xbbb40e96,0xbbc7605c,0xbba71dc8,0xbb0ec2c5,0xbb0e2cd5,0xba9aa90e,0xbb433702,0xbaffcdd8,0xba88a857,0xb98aa3f5,0xb8bf68d2,0xb9a1914f, +0x3a040321,0xb9498057,0x385c3935,0x3a4041ff,0xb94b85ed,0x3903cae9,0xba1511c0,0xba13cd3d,0xbaa4f52c,0xbb64c786,0xbb5115d2,0xbb7cba64,0xbb8f8e09,0xbbc0f3dd,0xbbd6e8b6,0xbbe6a56f,0xbbcf0383,0xbba3f03d,0xbb1ea6d1,0xbb2af1eb,0xbb3438d0,0xbb886324,0xbb8cd827,0xbbc54dda,0xbc02d445, +0xbc155361,0xbbf62aca,0xbb07ed4f,0xbb1ceebe,0x3b0e2aaa,0xba0de82e,0x3a515748,0x39cbc199,0xb8e7c50d,0x3a60fa57,0x3b3b70af,0x3b9e8801,0x3b8fe778,0x3bac9263,0x3bcb79d3,0x3b1e2ee0,0x3ad2e744,0x3b351aaf,0x39a5ef33,0xba5d0e7b,0xbb8aebbd,0xbb7f107f,0xbb860049,0xbbbb2dbf,0xbc13222e, +0xbc2f3ec0,0xbc39731d,0xbc1c3561,0xbbc5e653,0xb98b61e9,0x39543760,0xbad76515,0xbb9f80e7,0xbbc8e3db,0xbc09ddd0,0xbc386a1a,0xbc43cfbe,0xbbf9efd2,0x3a835964,0x3aa0f94f,0xbc2492ea,0xbc1200f2,0xbbae8c05,0xba86c992,0x3b8fedac,0x3a96620b,0xbb4ed22c,0xbbb2a286,0xbb85d4c5,0xbab4d15c, +0xba46f999,0x3bac3810,0x3ba2b35c,0xbafd2a3d,0x3a5c5099,0x3a623c0c,0x3a75186f,0xbaa4a15d,0xbafb5d5e,0xbb3b23e2,0xbb14fd3b,0xb9822033,0x38ff5b19,0xba4bc2ab,0xbb3be9f1,0xbbb2bffc,0xbbfa2046,0xbb9f44da,0x3b459db8,0xba4a9d53,0xbb521f60,0xbb965ca7,0xbc390e4b,0xbc63c759,0xbc47c962, +0xbc35d2bd,0x3b0f0b3c,0x3a924869,0xbb8eef28,0xbc04e13d,0xbc4d487b,0xbbacb5cd,0x3ae23412,0x3b854c35,0x3b51db1d,0x39e9ab23,0xbb5bf613,0xbb174fad,0xb933c56c,0x3aed6df3,0x3a58b3a1,0xb9f216f7,0xba3add96,0xbb0acc47,0xbb163b83,0xbb97eb9c,0xbbbc0429,0xbbec2a5c,0xbc1aa4ec,0xbc06ccb0, +0xbba87f6a,0xbb0c59d8,0x3bc5089d,0x3bb42b5d,0xbacaeb3c,0xbb7e5ec5,0xbb509a62,0x3b1f6c35,0x3b7b4feb,0x3bdaf0ce,0x3c2305cc,0x3b77e04d,0xbc538f8a,0xbb8b2eca,0xbb591b76,0xbb6d2b07,0xba98c0c5,0xba89b199,0xbabd9190,0xbb8ce671,0xbaf369d8,0x383b38c1,0x3a7b24d4,0xba42c80d,0xbaa99d36, +0xb934bd4d,0xba27f34c,0xb903f83d,0x39ebe067,0xb9aa30e5,0xba58d26b,0xba610144,0x3a187017,0x3b0056b3,0x3b40846a,0xb901f4bf,0xbb7096e3,0xbbf3fdd6,0xbc095e8d,0xbbb1f064,0xb8997851,0x3acb5fcf,0xbb253883,0xbc26e14c,0xbcceacf9,0xbce97745,0xbcadb900,0xbc88a313,0xbb8b0f18,0x394aab19, +0x3a27172e,0x3a174b9b,0x3b409266,0xb8a57577,0xb8274066,0xb840867d,0x3922533a,0xba84ab30,0xbaca05ca,0xba4c8aca,0xb9aa72fb,0xbaa13a24,0xba84801f,0xbae6bc54,0xbb56c744,0xbb7a1b58,0xbb724216,0xbb6b8f34,0xbbb1c50d,0xbbdc1218,0xbbe2a4b3,0xbba46b0e,0xbad98e1e,0x3b15db7b,0x3b2fe7d0, +0x3b2cf7e8,0x3b26bb9a,0xba687aa0,0xbb329795,0xba79f7df,0xbbf195f9,0xbc32d376,0xbc712d26,0xbc09b35f,0xbc638854,0xbc256cb8,0xba36f953,0xba566283,0x38784674,0x3b0d6d26,0x3b0cac19,0x3a05d67d,0x3a5f225b,0x3a6f7d3a,0x3a6551ee,0x3ae6fab2,0x3a6d8ff5,0xbaa3a380,0xbb1b073c,0xbb534340, +0xbb48d2ae,0xbb31f43e,0xbac21d29,0xba1ffba6,0x39387bac,0x3a816b09,0x3a39efe1,0x3a1b7924,0xba3452ed,0xbb33c19d,0xbadf7d72,0xba78ae7c,0xb995fb2e,0x3a3e9613,0x3a2d3088,0xba7fb3ab,0xbb3a7240,0xbba9bf30,0xbc105e28,0xbc3cd348,0xbaf746b8,0xbb8a655e,0xba86fc89,0xbb0ca751,0xba4d2105, +0x39026227,0x3aa7906d,0x3a6d3438,0x3a5aab83,0x39afe8e6,0xb98b55fa,0xbaf827b7,0xbb2b62fb,0xbb36a73b,0xbb22382d,0xbb37e7dd,0xbb57b09d,0xbb51e9d8,0xbb2259a7,0xba94d519,0xba4b6153,0xba41f51f,0xba76727e,0xba80a33d,0xba828a04,0xbaa970a6,0xbaaba5bb,0xba17f1aa,0x3a92353f,0x3a3e2c47, +0xb9eea8c5,0xbb4744e8,0xbab6ba91,0xb9e5efff,0x39e2a5a1,0xb96548ab,0xbb92a605,0xbb955603,0xbbb26a2b,0xbbd5bbf4,0xbbef71b0,0xbbe1c01f,0xbbcbd485,0xbbbea238,0xbb9f1d17,0xbb896230,0xbb6723de,0xbb453181,0xbb11bf2c,0xbb12413d,0xbb036d5c,0xbb0f5cb8,0xbb0799ad,0xbaf4e3ff,0xbafe6451, +0xbb17062b,0xbab5c3a6,0xb983ab26,0x3a6ebdd1,0x3a3db17e,0x3a246010,0x3a4bb39f,0x3873d2ff,0xba3679a3,0xbab9394c,0xbb024346,0xbb1579b0,0xbb3e497d,0xbb45348b,0xbb649bb8,0xbb746421,0xbb8aecf2,0xbab1dfac,0xbaea600f,0x395787b6,0xbae96820,0xbae0a697,0xbae18522,0xbb31d5bb,0xbb4dcad9, +0xbb5d6a45,0xbb6cf7eb,0xbb623cdb,0xbb7719f7,0xbb5e6b61,0xbb5ac674,0xbb113b96,0xbac4637b,0xbaf03bed,0xba6a6fe3,0x3953f3d2,0x39a13bcf,0x3a643343,0x3a1c5210,0x3a390f73,0x3a4c97a0,0x3a7bd173,0x3a966412,0x3a51fb31,0x39db5bc1,0xb90653fb,0xba4565a1,0xbac317ce,0xbb0fa19d,0xbb03e238, +0xbaebe846,0xbacdfa90,0xbac6381f,0xbb2131b6,0xbb3066f0,0xbb51b64d,0xbb0c6ab9,0x3a4454fe,0xbb84854f,0xbb36f802,0xb9d19517,0xb8cdc886,0x38b9ca88,0x39ce9d00,0x3a25b6a8,0x3a65b571,0x3a90629a,0xbb1d72a0,0xbb5eb98a,0x3aa97cfd,0xbae702dc,0xbb2504bd,0xbab7ea48,0xbac34547,0xbac7c501, +0xbac31436,0xbabf0c7d,0xbabd994e,0xbab24580,0xbad622f9,0xbaed382f,0xbaff8c4d,0xbb082509,0xbb0e6f3d,0xbb1e43b3,0xbb1c34c3,0xbb233104,0xbb279103,0xbb2ba12e,0xbb46b2ab,0x3b5cfe8c,0x3b3c517c,0x3b84fb45,0x3b2141fd,0xba579fcc,0xbbb79d58,0x3b70217d,0xb988aabb,0xbb952747,0xbba765ee, +0xbba7f2d4,0xbba0e64a,0xbbaf0e72,0xbbb3240d,0xbbb9bcc9,0xb9a77dba,0x3b5124d9,0xbbdb3519,0xba949d68,0x3af1b566,0x3b6fdd0e,0x3b2cec58,0x3b4cefaf,0x3b4d98f6,0x3b5e2d00,0x3b6b7dab,0x3b83b055,0x3b761e5d,0x3b759d80,0x3b6ebc92,0x3b7ed77f,0x3b7a1d41,0x3b637940,0x3b5e31ee,0x3b50dc62, +0x3b322051,0x3b505c08,0x3b821154,0x3b9ada46,0xbab5c563,0x3b801768,0x3aefe0b7,0x3a8f5ffb,0x3b21e038,0x3b275ca3,0x3b357e35,0x3b359320,0x3b0a93c5,0x3b400c5f,0x3b24bbba,0x3b0fcc03,0x3a90e6ba,0x3a981fd3,0x3a5851cf,0x3a498432,0xbb5ac69f,0x3b2549eb,0x3b1e8be2,0x3b43551c,0x3b66cc87, +0x3b8e6183,0x3ba8dd19,0x3bcfe9e7,0x3bbca9b5,0x3bb059fb,0x3b9f0513,0x3babf2e4,0x3ba4dd8b,0x3b895b0c,0x3b81a400,0x3b6c2df6,0x3b39981e,0x3b7c6ead,0x3b860e41,0x3b652875,0x3b2b61ec,0x3b4d9d3b,0x3ab966d1,0x3ae46aac,0x3a906665,0x3b19dda9,0x3a096c72,0x3a7eacfe,0x3af21da8,0x3b177fef, +0x3a83491d,0x3b01b470,0x3a907889,0x3afa276d,0xba6cdb1f,0xb9f01cd5,0xba81a767,0x3a3f3406,0x3b16e798,0x3b3077fe,0x3b76820c,0x3ba62beb,0x3bd1a73f,0x3c0ef40f,0x3bef0ba2,0x3bebcb3d,0x3bd1dc4f,0x3c01a030,0x3bf39fce,0x3bab2e9d,0x3b9bf2be,0x3b62c874,0x3b03d105,0x3b6c42ce,0x3bcfeb85, +0x3b96aa9a,0x3b84ba20,0x3b98531d,0x3b14df7d,0x3b21dacc,0x3b506357,0x3b9a0d75,0x3b8e5466,0x3ba186f2,0x3bae59a5,0x3b028daf,0x3b152cab,0x3b3d9bd6,0x3aec3004,0x3ab90620,0xbb5446a9,0xbad6540b,0xbb5bc040,0xbaca9532,0x39a1b4e1,0x3ac2c79f,0x3b85aed1,0x3be1579c,0x3c27f2ab,0x3c6d09e6, +0x3c4c8dcd,0x3c2286db,0x3bfa14de,0x3c18e2c7,0x3c0d0dd8,0x3bb225e9,0x3ba956c3,0x3b90c8f3,0x3b3fdf9c,0x3ba8db56,0x3b06a418,0xba844ec5,0xbb0c9501,0x3a37ef09,0x3b61ec30,0x3aed2ca2,0xba8c8393,0xbb930834,0xbb74ecd1,0xba6f0cbe,0xb9f1f05c,0x3bb641e3,0x3bab5490,0xbac8ab38,0x3a8ce98e, +0x3aeab745,0x3b2006a8,0x3b3d2766,0x3a9cbec4,0x3b582bcb,0x3c0addbb,0x3be0fe46,0x3bb5220a,0x3b18ce43,0xba317040,0xbb91c504,0xbb0f3a9e,0x3b61265b,0x3c56dde4,0x3c315807,0x3c394046,0x3c5bb5fd,0x3b9a25f9,0x39d655c9,0xba9eba13,0x39117c79,0x3bca45d4,0x3bcb5c9a,0x3ac89561,0xbb796c90, +0xbc00b5b2,0xbb926aab,0x3a36a0f8,0x3b6be843,0x3b726a82,0x3aad252d,0xbb45c522,0xbb2afce1,0xb9f50cc9,0x3af25c10,0x3ada4124,0x3a7c100a,0x3a20cb4e,0xbaa5a556,0xbb3b6bb0,0xbae8ca51,0x3b2f2105,0x3b82a7f5,0x3bd067a7,0x3b34240b,0x3b0a4dfb,0x3b217056,0x3bf278e3,0x3bc088ce,0xb9cef8a4, +0xba90600f,0x39fdd785,0x3b9a8f4b,0x3c2056e6,0x3c37a204,0x3c031bd0,0x3bd0711a,0xbc4b4a61,0xbbf536af,0xbb98768a,0xbb440c8c,0xbad408a8,0x3a12cf02,0xb99e2f3f,0xbb842ce8,0xbaf2cacf,0xb79561d9,0x3ab30839,0x38f6a0b2,0xba3767b0,0xb99fccfb,0xb992b765,0x3a97e61c,0x3aabebf8,0x3b00569a, +0x3b095b8a,0x3b02c6aa,0x3b5451b3,0x3b5c33b3,0x3b8881c8,0x3bf74c77,0x3c2207ef,0x3c238335,0x3c1ffe7e,0x3c1ee10d,0x3c0e35dd,0x3c6b7378,0x3c82eff4,0x3c4c5d88,0x3b954be7,0x3a13431a,0x3b3ef6ec,0xbc0f178c,0x3c2bd7b8,0x3b4e950b,0x3b1887d2,0x3b6a69ee,0x3b587732,0x3ad93f73,0x39448765, +0x3a49cece,0x39d3acf6,0xba482bf4,0xbaa4c832,0xb9853787,0x3879149c,0xba0ccee6,0xb88b7180,0xba697074,0xbb0843a5,0xbb2e0daa,0xbb661365,0xbb1213a4,0xba0217ad,0x3a768a3a,0x3b0aee3d,0x3b7e2cdf,0x3baae085,0x3bda95ad,0x3bf7578e,0x3bf92c9f,0x3beaec71,0x3b3eee49,0x3b081621,0x3bac79f6, +0x3c3e70e2,0x3c837aee,0x3ca1c032,0x3c5f11ae,0x3be57d0c,0xbab979f0,0xbbab6b24,0xb9ff1577,0x3aba5d2f,0x3b0b7f90,0x3b293c66,0x3b0b338b,0x3af43d97,0x3b18a71e,0x3ad9b62c,0x3b08689e,0x3aa72edd,0xb8e5dc34,0xbb001226,0xbb494b20,0xbb31977c,0xbac50470,0xba428e54,0x3ab23f0d,0x3a9e041c, +0x3a853ee8,0x3ab55728,0x3b0a0504,0x3b609c42,0x3bba1d73,0x3bfd6ab4,0x3c252ce8,0x3c6182a5,0x3c4a8c78,0x3c590b45,0x3c6dda04,0x3c85c191,0x3c71d0f5,0x3c2c29ed,0x3c08f651,0x3c017543,0x3b83b3df,0xba9de1d7,0x3a9df0c0,0x3a9c244e,0x3b449108,0x3b6ec4e5,0x3b282540,0x3b379e3e,0x3ae904fc, +0x3a667558,0xba61fc04,0xbadb7ca5,0xbb136a59,0xbad6344a,0xbab9b994,0xbaaac7c1,0xbb2c96c4,0xbb1ff1e7,0xbaf4a1be,0x39e680b5,0x3b0f34db,0x3b257656,0x3b75861b,0x3b76c47a,0x3b3fc871,0x3b027c96,0x3a6e0020,0x398510df,0x3aa96e55,0x3b600c9e,0x3be5f22c,0x3bcd379b,0x3be70cae,0x3c0ba27b, +0x3c05a20e,0xba0fccd0,0xbb01aabe,0xbb513cdf,0xbb676212,0xbbbd96cc,0xbbabda0e,0xbba10958,0xbb900255,0xbb8d2ad6,0xbb5c65e3,0xbb420b33,0xbb08f638,0xbb262592,0xbb039828,0xbb058176,0xbae4a8b4,0xbaeed0fe,0xbaa9f9f8,0xba570d75,0xb94804e9,0x3a1287a0,0x3a6bfcc4,0x3ac96f22,0x3aa3ef9e, +0x3a959beb,0x3a9aa2eb,0x3b017a72,0x3b37b330,0x3b62c8a4,0x3b80a7c9,0x3b7af2d2,0x3b832841,0x3b472742,0x3b0fcc66,0x3aaa4da1,0xb837e57a,0x3a8fcf90,0x3a64945c,0xbb0e7f98,0xb9720a67,0xba82f842,0xbab904b0,0xba9b8a8c,0xbaeae5e6,0xba93e27a,0xba404ff0,0xba8b0b0d,0xb9c84507,0xb9ac517e, +0xb938692a,0xba0454d8,0xb987f887,0x3a548793,0x3a24ef37,0x36cb7b23,0x3a27f81d,0x3981e6b4,0x3a13b16a,0x3a3ebeae,0x3a6c6112,0x3a95a1f1,0x3a9dbb1c,0x3ad6be38,0x3b064a01,0x3b28f119,0x3b453969,0x3b6b8ff1,0x3b8ba487,0x3b67d36b,0x3b4310c9,0x3b1f84e6,0x3af81b5d,0x38c67c34,0x39718b9f, +0xb95b5780,0xbaf059de,0xbb8fb9cf,0xb8312ab3,0xbb05fd2c,0xbb935434,0xbb9247c7,0xbb94f4e0,0xbb9330b3,0xbb97bba0,0xbb999b62,0xbb9b4316,0xbaa796bd,0x3a1139f5,0xbb82506a,0xba85fd54,0x39f6d80f,0x39e8fcf0,0x39b895c8,0x39e749e3,0x39c1f486,0x39dffcf5,0x39ee276f,0x39f1fd60,0x3a371c80, +0x3a666b91,0x3a8b1de4,0x3aaa843c,0x3ac40585,0x3af89988,0x3ab670fa,0x3a8e01a9,0x3a3f2e4d,0x39ffb39d,0x39a47f0f,0xbb552a2a,0xbb28adf0,0xbb916d32,0xb9fdb563,0x3b5113bc,0x3bd49324,0xbb0b6104,0x3b0cfbaa,0x3bc306dc,0x3bbf370f,0x3bbec058,0x3bb3e7ff,0x3bc9cf5f,0x3bccaff0,0x3bc81920, +0x3b243b89,0xbabe2e4d,0x3bcb1964,0x3b1fbbd5,0xba473814,0xbb941e8c,0xbb51fedc,0xbb6e5479,0xbb71ef2d,0xbb62c567,0xbb54d1a4,0xbb30d02b,0xbb451289,0xbb4a6e22,0xbb5b0bc0,0xbb54ef41,0xbb60e6db,0xbb7eb04e,0xbb7b1d1c,0xbb6ba923,0xbb32e60a,0xbb421a1d,0xbaf44381,0xbb4de465,0x3b9d626a, +0xbae63807,0x3a5535d2,0x3a00757c,0xba945fab,0x388af509,0xbb14c88f,0xbb11e8e6,0xba3138c8,0xbae420ec,0xbab50855,0xbaba3d70,0x3a2c797c,0xb940d077,0xbaf12539,0xbb14a097,0x3b0acd2f,0xbb92c20a,0xbba922ad,0xbba892d3,0xbbb06304,0xbb965a37,0xbb72a6f6,0xbb067c6d,0xbb2c9266,0xbb4b4be2, +0xbb8459c9,0xbb821a6f,0xbb8f357d,0xbba877fb,0xbba3a5f1,0xbb8523d1,0xbadff597,0xbae871f5,0xbb131430,0xbb4c551b,0x3a3b0d93,0x38b0970c,0x3afcaab0,0x3a2bae65,0x38a888fe,0x3a56f514,0x38bf5c6a,0xbaaf4da8,0x3a38eddf,0xba9525a8,0x3ac94227,0xba20f083,0x3abe2f58,0x3959efd9,0xbae69131, +0xbae9a699,0xbaca4030,0xbb7933e6,0xbbde2c3c,0xbbcce7b3,0xbbe3992d,0xbbb7ab8a,0xbb8b55c7,0xba86a5c1,0xbb3007f2,0xbb4d1866,0xbb9e638a,0xbb865530,0xbba84b91,0xbbf41203,0xbbdfb6ef,0xbbb29d7b,0xbac2494e,0xbadca2a8,0x3a810f3c,0xb9578e11,0x3b4ec1c2,0x3aa17c71,0x3ab7aabd,0x3a573403, +0x3adee826,0x3b8d79cb,0x3b4f504c,0x3b81328a,0x3b78a8a7,0x3b114ed0,0x3ae110a8,0x3ae17fd1,0x3a8f5860,0xb981fae7,0xbb171083,0xbb841741,0xbb26f424,0xbbc11f68,0xbc241eed,0xbc1eaebf,0xbc2934bc,0xbbf9ccd5,0xbb850cc4,0x3af5368f,0x36169257,0xbb2be492,0xbbc7a79d,0xbbb1fd19,0xbbce8a83, +0xbc16a716,0xbbec6741,0xbb6e4c8f,0x3b1980c0,0x3b385a54,0xbc5496ad,0xbbee8196,0xbb1ff272,0xb9df4340,0x3ba01390,0x3b469b35,0xbaa6ae8c,0xbba174bd,0xbb8e7739,0xbad020f1,0xb9f459ef,0x3ba4bfa5,0x3b9a38d1,0xba9eb872,0x3a033e80,0x394591b6,0x3b2f5024,0xb8c41b32,0x3ad411c2,0x394a2897, +0xbb116ac1,0xba3882e5,0xbb3bf5dc,0xbb328ca8,0xbbb4e53e,0xbc09fa54,0xbc232788,0xbbd633c9,0x3a926480,0xbb32d526,0xbb90d00d,0xbb83a89f,0xbc30b6a0,0xbc5861b4,0xbc4de7a5,0xbc435ce7,0x3ace2cdf,0x3aeb7bf1,0x3a0babc8,0xbbb70028,0xbc3990a0,0xbbe44042,0xbacc5929,0x3b18bf0a,0x3b522641, +0x3a9b0d62,0xbb4ac659,0xbb487439,0xba8ce443,0x3a908d07,0xb8ac9494,0xba696627,0xba333131,0xbaca70dd,0xba063ef6,0xbb80d33a,0xbbb5d288,0xbbc38dbd,0xbc0f8e57,0xbbf6f8cc,0xbb86e2b9,0x3a505f5b,0x3bec7089,0x3baf3292,0xbb2cb8f6,0xbb7a9310,0xbadd9f12,0x3b74897b,0x3bf240df,0x3c0515c1, +0x3bb29cdc,0x3b698fd1,0xbc86353e,0xbc6675ce,0xbb66633d,0xbafeb1c2,0xba85dde4,0x3a84240a,0x3a0d05b4,0xbb9ae669,0xbb2c3aa6,0xba84262a,0x3a6e7230,0xb98abab4,0xba870818,0xba38d5ad,0xba7a4aa9,0xba313259,0x3aa94860,0xba2679d2,0xb9631d61,0xbae24a64,0xba3d9866,0x3b01a0fd,0x3afba9ea, +0xbaa9c0e6,0xbbad13cc,0xbc0e7c19,0xbc22a008,0xbbf052fb,0xbb4c031d,0x3ace5166,0xbb56b190,0xbc856a58,0xbcab638e,0xbca6d4e9,0xbc80ddcf,0xbc74e0a2,0x3aea1c01,0x3bcca241,0x3b6be7c3,0x3ad2ec2e,0x3b827c37,0xb910e246,0xb9f71df0,0x3755a071,0x38ad3253,0xba2be0c0,0xbab21a22,0xba1186af, +0xb8e6127c,0xba55aa04,0xb9f55cce,0xba8e487c,0xbb404e7c,0xbb7ac938,0xbb203f5a,0xbb74f8cd,0xbbc3005e,0xbbd1c1cc,0xbbd8a0d4,0xbb6ff2c6,0xba23f5e6,0x3b4f4e3d,0x3b5bcbae,0x3b580762,0x3b402394,0xba8a4149,0xbb2fd0cb,0xbb54a62d,0xbba4c366,0xbbe85306,0xbc194e41,0xbb0c46b6,0xbc7181d5, +0xbbff5c96,0x3a7b6761,0xb8afac09,0x3a06f189,0x3b1769a6,0x3b0a8dbe,0x3ab8af54,0x3b02f00a,0x3aae8e29,0x3a7032b7,0x3aa2291e,0x3a44cb97,0xb958e601,0xbb0953ab,0xbb55ab76,0xbb5e903b,0xbb4813c9,0xba659265,0xbac53c07,0xba0e1849,0x3a74a71a,0x396e42b9,0x3a89b7b9,0x3a539b08,0x3a14bd58, +0x3ac8ec76,0x3b18cc7b,0x3b4d61de,0x3b2056ac,0x3ae467be,0xba4e2e16,0xba8d1e6a,0xbb7c3c3b,0xbc2721da,0xbc492580,0x3a8caf54,0x3a513c6e,0x3b85c892,0x3b1e3c50,0x3b67bd49,0x3b687def,0x3b55787b,0x3b384070,0x3b1640b3,0x3ad47e28,0x39ef08ff,0xba5f13a3,0xbb09eb35,0xbb3b6a10,0xbb2bcf63, +0xbb1f0538,0xbb118bce,0xbb2fa0bf,0xbb3032a3,0xbaf7a077,0xbafdab6c,0xbaeaeefb,0xbada0fe5,0xba83c82b,0xba5a972c,0xbab86d5b,0xbae5178a,0xbac4743c,0xba00ab82,0xba28d3f0,0xbacef6ac,0xbb77dd9a,0xbb09ae71,0xb94a27ad,0x3b019499,0x3b29f48b,0xbbac35b0,0xbb9c75d0,0xbb8279c9,0xbbb110b9, +0xbbb34a15,0xbbb1bcfb,0xbb9d6a7c,0xbb976b5f,0xbb6a2020,0xbb724a1e,0xbb22f487,0xbb534f42,0xbb005a34,0xbb2d2457,0xbb01182d,0xbb21304a,0xbb0e9a67,0xbb05c3f8,0xbad0b736,0xbb3c4dae,0xbb33042b,0xbaa15555,0xb99981e9,0xb9e86ed6,0xba0fea35,0xb9a18c6e,0xba8177b3,0xbad0a8e2,0xbb0ed958, +0xbb289cec,0xbb3486fe,0xbb4c8247,0xbb313048,0xbb3b2e30,0xbb530ea5,0xbb867b60,0xbaedf0d2,0xbb0eff71,0x3a702bcf,0xbb1cb5f8,0xbad0db0c,0xbae884b2,0xbb519c5a,0xbb64667e,0xbb84e008,0xbb7b2e27,0xbb381760,0xbb66aca4,0xbb6233d8,0xbb462c90,0xbaea48bc,0xbad60107,0xbb023054,0xbad1c623, +0x39a35bd7,0xba9f27af,0xba083d71,0xba0c81b3,0xb9aeff83,0xb7ac237e,0x39ab7001,0x3a37e9b5,0x394a064b,0xb949a1e1,0xba246c6d,0xba8e16c3,0xbad5191f,0xbb1139b0,0xbb1a63e6,0xbb1717c0,0xbb085ecd,0xbaf3908d,0xbb586805,0xbb811b63,0xbb0f2cb3,0xb9d19491,0x3ac826a9,0xbb65a08f,0xba8e2b2a, +0x3a6014b4,0x3aaa806f,0x3ac3aa3c,0x3abd79e6,0x3b034a12,0x3b19fa40,0x3b22aee0,0xb9c4a51a,0xbb2ea982,0x3b264d38,0x37620681,0xbaddc972,0xbb3bef33,0xbb1d1a19,0xbb223089,0xbb1c3b65,0xbb186728,0xbb1645f0,0xbb0c9ad7,0xbb1c36b0,0xbb252885,0xbb2e2afd,0xbb368c87,0xbb3bc5e6,0xbb42a55a, +0xbb4208db,0xbb4a3440,0xbb55efeb,0xbb603fa0,0xbb7e80c9,0x3b1bb299,0x3b091c37,0x3b6e43ef,0xba9b9b5d,0xbb89d3b0,0xbbaacd9c,0x39e0a061,0xbb707cc8,0xbbaf6436,0xbbc52e8e,0xbbc3ece6,0xbbad1628,0xbbba4ff9,0xbbb8b78d,0xbbb5649f,0xbb68976a,0xb5a1e8ce,0xbbc2bfe5,0xbb87db1f,0xbad7651d, +0x3b4d46a9,0x3ae5d981,0x3b0cd8e8,0x3b0f2d21,0x3b2223ce,0x3b2db79b,0x3b458781,0x3b2e2b5a,0x3b2bd24f,0x3b238593,0x3b33d161,0x3b2c4365,0x3b12224a,0x3b05929b,0x3afd89c4,0x3af99f0d,0x3b1533fc,0x3b6abd9c,0x3b44c422,0xbb7d32e4,0x3b14ca1e,0xb893f774,0xba2e9a39,0x3a4676c7,0x3a87b9d5, +0x3aac3829,0x3a0a4952,0xba82888a,0x3a45ca3d,0x3a98a7aa,0x39ab294c,0xb8b27d4a,0x397e5dc3,0xba569fb0,0xb9ca09e8,0xbba75bd5,0x3a369b93,0x3ac2483f,0x3abea7b3,0x3b123fd7,0x3b57bb9e,0x3b8a12e6,0x3bab60c4,0x3b8d2c12,0x3b729cb4,0x3b44feda,0x3b63c04a,0x3b4cde98,0x3b0b7dcb,0x3ace1a26, +0x3acffe01,0x3b088aba,0x3b3dce11,0x3b8612f4,0x3b06ab74,0xba22ac51,0x3a881f76,0x3a144ab7,0x39440c4a,0xb9f83cfd,0x3a9b35f4,0xbac9822c,0xb952f968,0xbaab5be3,0x3af80d59,0x390417ac,0x3a6f28bb,0x3942b804,0x3aaff76e,0xba5ca430,0xbaa0415a,0xbb44ea12,0xba741f66,0x3abfc56f,0x3a94692a, +0x3b0aee1d,0x3b730a48,0x3ba3256b,0x3be18491,0x3ba42c0e,0x3b9bad45,0x3b807270,0x3baea83e,0x3b968bcc,0x3b119af0,0x3a8cdba8,0x3a43e6be,0x3adef645,0x3b2ab979,0x3bea7fbf,0x3b4f5ea1,0x3aa8424b,0x3b53850f,0x3b2f7482,0x3aa15705,0x3b02cb52,0x3b8e91af,0x3b5da91f,0x3b5e8858,0x3b6e8a49, +0x3b0086bc,0x3b27619f,0x3b34b23a,0x3b29ea36,0x3b252e38,0xbb3c8b26,0xbab797ee,0xbba555ce,0xbb5888f7,0xba8270d3,0xba8a0390,0x3ac1f935,0x3ba2beb5,0x3c0ce6fc,0x3c49c0b5,0x3c17d1f4,0x3bd07159,0x3b83fb35,0x3bb7b2ea,0x3b935465,0x3a84b5fa,0xb8715d7f,0x3a4694e1,0x3b53d370,0x3b99cae6, +0x38dcb35c,0xbb85c67a,0xbbf20eeb,0xbb58cf43,0x3ac71321,0x3aa29617,0xba14edf7,0xbb9c1a58,0xbb880dc5,0xbaa3035c,0xb925ce51,0x3ba355c5,0x3b96bab3,0xba8bcb75,0x39694e39,0x3a91dcf2,0x3b2ef999,0x3b68d12d,0x3a48f17b,0x3b3e210a,0x3c15499b,0x3befdea5,0x3be88c5a,0x3af31d4e,0xba98d7c6, +0xbb3a1a9f,0xb91f7e33,0x3bbaabdf,0x3c5f551b,0x3c25dfbf,0x3c11e042,0x3c1598c7,0x3a9268e9,0xbaf56a64,0xbb1bb718,0xbb195693,0x3c231862,0x3bd81a17,0x3aa43f55,0xbb48496c,0xbc0a6016,0xbbe1e3f6,0xbaf33a22,0x3ae4b42d,0x3b5fddc1,0x3ac79f5c,0xbb26adc9,0xbb472da8,0xbaa8b62f,0x3accc76a, +0x3a55a7ad,0xb8844125,0xba891b57,0xba80033f,0xbb29255e,0xbb207f60,0x3ab1e73d,0x3a353220,0x3b1b3e4f,0x3a1a6122,0x3abf8420,0x3b6eb214,0x3bdb2846,0x3b8d8757,0xbad407fb,0xbacf5b23,0x38f1a1aa,0x3b3101c1,0x3bfefd5d,0x3c05274c,0x3b70b91b,0x3bc3890d,0xbc7fba42,0xbc8f8b7e,0xbbc7cad7, +0xba76e4f9,0xbb54ce30,0x3b14f0ca,0x3a101c00,0xbb8bc176,0xbb2e7344,0xba32f944,0x3a8a5d9b,0x3a353e19,0xb985c3c8,0xba5f62ce,0xba850ceb,0x39f47b09,0x3a5a4bc6,0x3a90494e,0xb9986c8a,0x387dd83d,0x3b70a7b1,0x3b532f6b,0x3b66c086,0x3bba813e,0x3bd42f39,0x3bb8a6a4,0x3bc73ab1,0x3bf0f977, +0x3bdb2e70,0x3c85bbad,0x3c68141b,0xbaadb9e2,0xbb3aa37a,0xbb872c73,0xbb2efafe,0xbc21619c,0x3c26f676,0x3c0189d5,0x3b9b0f24,0x3b826b23,0x3b673c74,0x3aabe8f1,0x388b1eb3,0x3a7c2de5,0x39d0a119,0xb996e0c9,0xbaa300fd,0xb984c9e5,0x3892ea6e,0xb9d351fa,0x39123ae9,0xba7a8886,0xbb14f021, +0xbb310234,0xbb88cd35,0xbb2c4af7,0xba3abcaa,0xb9591f68,0x3a353b02,0x3b19fb8a,0x3b5f89e8,0x3ba04e2d,0x3b8e6e85,0x3b5d0663,0x3ad39cd6,0xbb0e24d5,0xbae6fa86,0x3b203616,0x3ba4b6d8,0x3be609d3,0x3c203fd9,0x3c017449,0xbb5a51e8,0xbbfbd2db,0xbc0636ac,0xbb1cbcc9,0x38246e06,0x3a28b9f3, +0x3ad1d736,0x3ae115f1,0x3abcc51d,0x3b098b90,0x3a780c34,0x3aa95c88,0x3a5ef2dc,0x39c64432,0xbaf9f32c,0xbb4f8686,0xbb3a7d39,0xbb3d730a,0xbb51c7ac,0xba1e593f,0x3970d638,0x39ca06dd,0x3a96163c,0x3adc8e60,0x3b3902a4,0x3b992c43,0x3bbe054e,0x3be7bcc3,0x3c15d982,0x3c118d7c,0x3c16faaa, +0x3c159b02,0x3c193512,0x3bd14727,0x3ab89a21,0xbb2f9439,0x3bfc5e7e,0x3b60957c,0x39df3b94,0x3b1831c7,0x3b2b79c8,0x3b7bbaa2,0x3b966f96,0x3b633b88,0x3b7ea588,0x3b3fffbe,0x3b02d25f,0xb6ce1981,0xbaa29953,0xbb1675b5,0xbb058d2c,0xbb05064e,0xbae08a78,0xbb278a19,0xbb12927c,0xbb0b5ff5, +0x382feedd,0x3aa3bbea,0x3ac550a2,0x3ae5d7b9,0x3ac42794,0x3a37488a,0x39dde0d9,0x39cd86d4,0x39d6084f,0x3ab718b9,0x3b48d46a,0x3bb5fd37,0x3bc2b55c,0x3bdd95e9,0x3c069970,0x3bf871bd,0xba764eeb,0xbb4652f1,0xbb9f0f4a,0xbb9516ba,0xbbcecc57,0xbbafa5e1,0xbb94c4fb,0xbb6f3814,0xbb8236fc, +0xbb42acf4,0xbb5cbe95,0xbb09d283,0xbb3f683d,0xbb27666a,0xbb2dbcba,0xbb1c7680,0xbb2f0746,0xbb211733,0xbb31a182,0xbad2f8aa,0xb9235d01,0xb87baf6d,0x3a5b1ecc,0x3a0fcaea,0x3a115c7c,0x3a25b498,0x3a50a62e,0x3a5d5832,0x3a52d43b,0x3aad2f0c,0x3ac706ea,0x3b068f34,0x3ae84c6f,0x3ac05055, +0x3a9cd43b,0xba158cdd,0xb780b1ca,0xba215442,0xbb56784a,0xbaab9b19,0xbb230e34,0xbb31aa96,0xbb212090,0xbb4a8cbb,0xbb183371,0xbb18576d,0xbb47bc2d,0xbb14fc1a,0xbaf3ba6a,0xbafe3335,0xbb0df79d,0xbacf085a,0xba61805f,0xb9ee0eb9,0xbab7037b,0x38820668,0xb869a5dd,0x3914b0dd,0x39d15a21, +0x3a281e01,0x3a7bbc88,0x3a9bf860,0x3adfefad,0x3b0f96c2,0x3b29544d,0x3b386105,0x3b44abc6,0x3b5062b6,0x3b19ea75,0x3ad23ca6,0x3a886fd2,0x3a040cf0,0xba60adc4,0xba24c235,0xbb2fc133,0xbb8b70e7,0xbba29c61,0xbb150fa1,0xbb91d3d0,0xbbb769b0,0xbbb6743f,0xbbb6b590,0xbbaaa8d1,0xbbb2f13d, +0xbbb4a267,0xbbb10667,0xbb808a87,0xbae3c68a,0xbb9adb1e,0xbb631d87,0xbae61e82,0x38a5468b,0xb98b7f97,0xb8aa0bb9,0xb8956e17,0x37e46a48,0x38d8e64c,0x392dfc4a,0x39883a87,0x39a78b2c,0x39dc0596,0x3a0dd0dd,0x3a2ec14e,0x3a7a3f57,0x3a08124a,0x3971c673,0xb90bc11a,0xb9eab88a,0xba298cb5, +0xba5af334,0xba1115a7,0xbb09e630,0x3b39b7d4,0x3b9cba5b,0x3b7afde8,0x3ac26c16,0x3b82fac5,0x3b8a73fc,0x3b8029cd,0x3b781344,0x3b45bffa,0x3b7e1c4c,0x3b80af9a,0x3b61db39,0x3b90ad45,0x3b0fe277,0x3b59fe5a,0x3b862a39,0x3b268292,0xbb0c4751,0xba852beb,0xba936b9d,0xba94e2ed,0xba59bb3a, +0xba1d527f,0xb88747cd,0xba038e03,0xba22f813,0xba745027,0xba178df7,0xba2c5a0b,0xba976a7d,0xba713e49,0xba55b541,0xba0c7482,0xba261da0,0x38286796,0xb8eeef53,0x3ba5bda3,0x3a0bbd60,0x3b3ba441,0x3ac8a288,0x39ac0eb7,0x3aba15d5,0xba462f62,0xb998086e,0x3a891548,0x3a37335a,0x3a1b115e, +0x3a3b300a,0x3b05d118,0x3abaa1d5,0x3a8d79c9,0xb9992b17,0x3b162fe4,0xbacfca3c,0xbb240630,0xbaddad0c,0xbadf6e42,0xba3626b7,0x3871c87b,0x3ab96174,0x39c3ced9,0xb94856ba,0xba8af690,0xb9a9702e,0xb9ae5bd0,0xbaa12563,0xba0af160,0xb8f0f78b,0x3a21aba0,0x3a421e7d,0xba16d271,0xba43357a, +0x3b418da2,0x3ae72108,0x3b5f093c,0x3aa1f7ac,0x39b0a083,0x3aae661f,0xb8a78fc7,0xbafbf690,0x39a62f8a,0xba3e84a2,0x3b0f1cce,0x399aaaaa,0x3b34f81b,0x3b02c9c9,0x39e71413,0xb8364997,0x39cdf476,0xbacf372b,0xbb6c2b53,0xbb1498e6,0xbb1a3e66,0xba0a0917,0x3a42e64e,0x3b720555,0x3a988111, +0x3a2a93f6,0xba888e8b,0x3a5e30d6,0x3a166575,0xbb0e06de,0xb9be9675,0xb8e15f59,0x3a35d43c,0x3a76d5fc,0x3b015744,0x3ac81bf5,0x3b91c740,0x3b304b8f,0x3b4edf01,0x3a6bab13,0x3a31544a,0x3b5c7e2c,0x3af0f06f,0x3b159c96,0x3a9c2579,0x3af2df47,0x3b0eb4ec,0x3aacb8f8,0x3b0c17bc,0x3aa76e70, +0xb95d22b2,0xbb34d296,0xbaf13a9b,0xbb919b5c,0xbbd18363,0xbb86c025,0xbb5b73fc,0x39695bf4,0x3b6a26e5,0x3c04683b,0x3b924017,0x3ab5080d,0xbaf38230,0x3a7dbeeb,0x3aa6848b,0xbb032e00,0x3ac8724d,0x3b422066,0x3b842c6f,0x3b9d8884,0xbc173eeb,0xbb5acc28,0xba222a21,0xb9438930,0x3b886262, +0x3b63d019,0x39898967,0xbb7b3a93,0xbb71328c,0xba92766c,0xb88dd906,0x3b8c3cbb,0x3b7addb4,0xb967bd5e,0x39153861,0xb76deb2c,0x3b7661aa,0x3b1f2e67,0x3ba44b4e,0x3ba80048,0x3b36195d,0x3b0dd7ca,0xbad289db,0xbb35ad3a,0xbbcc014d,0xbc10ab1b,0xbc02d0a0,0xbb460fde,0x3b9519da,0x3ab697c0, +0x3a3c2aca,0x3b30b080,0xbb8610bb,0xbbdd60ea,0xbbfb27af,0xbbfa6575,0x3b254635,0x3b8181f9,0x3bb42e82,0xbace5256,0xbc0d60e7,0xbbeb78d0,0xbb63cf79,0x3a72b493,0x3b30e515,0x3ab57ac7,0xbb1a62c7,0xbb53d6e9,0xbad62948,0x3a4d24a8,0xb9dde494,0xba422d37,0xb9f90826,0xb9eca2e7,0x3a15824d, +0xbaf52e29,0xbafa93ba,0xba9dfaa6,0xbb1068a2,0xbb324a86,0xb9a51fd6,0x3ba611c1,0x3beec0c4,0x3b80b128,0xbb68f296,0xbb3ba313,0x3a2c99c1,0x3bac5bc3,0x3c33729f,0x3c1fa838,0x3ad8f550,0x3b4ee4fb,0xbc841464,0xbcaf75df,0xbbac98ef,0xba9512aa,0xbb157b16,0x3b28df81,0x3b070019,0xbb82f599, +0xbb28d388,0xbab64188,0x3a54ea1e,0x3a13f277,0xb9e44c01,0xbaa0b805,0xba6ffcb2,0xb9ae6c91,0x3afad631,0x392a74a1,0x3a6b2482,0xba6feeef,0xb9b8e68c,0x3aff7f17,0x3acb94eb,0x3a35cd96,0xba9d93d0,0xbb3452c1,0xbb72c893,0xbb212ee3,0xbad27de3,0x3bd65994,0x3b6380be,0xbc2c32a7,0xbbfb155c, +0xbbc65422,0xbb95f27c,0xbc19acd4,0x3c26e4c0,0x3c3cfd07,0x3be59e2b,0x3b7b3253,0x3b75ae71,0x3a1e56ad,0xb94d14aa,0x39e6d65e,0x399236db,0xb8dbfa23,0xba7f78de,0xb9e7af8c,0xb8b87c5f,0xb8c59998,0x38b1cbc7,0xb9f19ad8,0xbb038d68,0xbb4be20b,0xbafcafbd,0xbb4efdc3,0xbb802177,0xbb4159df, +0xbb1b985c,0x39f9d390,0x3b2237cd,0x3ba306ed,0x3ba4b3bf,0x3b937b67,0x3b42dc6d,0xb958a6d8,0xba75dbce,0xbaf5b353,0x3aef37ab,0x3b4284e3,0x3b8ec30e,0x3bfcb8a7,0xbbe3583f,0xbb50c4bd,0xb9c6dbcf,0x393f1000,0x3a9d4d17,0x3aee0709,0x3ad80198,0x3b140dff,0x3b26200c,0x3ae5bbd0,0x3a8e305c, +0x3a3c4dff,0x39f08a5e,0x3a1c2571,0xbae8cc69,0xbb47d844,0xbb64f403,0xbb3c0c0e,0xba6a2c2b,0xbae95dd4,0xba7b4491,0x39f22073,0x39537681,0x3ae8129c,0x3b496c14,0x3ba696af,0x3bc3a618,0x3beab9c4,0x3c0ddf04,0x3be6509d,0x3bd02658,0x3b924256,0x3bb196ed,0x3b4b5162,0xbb463652,0xbba196bd, +0x3bb691d3,0x3bbf8dd5,0x3bd19297,0x3bb9453b,0x3bb93ded,0x3bb65824,0x3b948399,0x3b861782,0x3b69f26a,0x3b3a01ad,0x3ac77004,0x39cf4d1f,0xba95f9dd,0xbb2376bb,0xbb1b1d54,0xbaed610b,0xba93bf45,0xbaf4c045,0xbb155460,0xbb0bb4e1,0xbae94df2,0xba9b1c8d,0xba4484fc,0x39d3db05,0x3a13b1a2, +0xb94134d1,0xba4560df,0xba8f5840,0xba8e58b0,0xba1096a2,0xb8e342e5,0x38c5f28c,0x3a506bce,0x3b286b85,0x3ba3508b,0x3bcab7e5,0xbb6c2165,0xbb644454,0xbb176bfb,0xbb62d6be,0xbb7502a5,0xbb6d98e4,0xbb49f0d2,0xbb3b7276,0xbb1ae9bc,0xbb364b37,0xbaee7dd3,0xbb3cc78e,0xbb10226d,0xbb413565, +0xbb16d225,0xbb2d0147,0xbb1dd72c,0xbb0b37c1,0xbaa6cb83,0xbb0f6a9d,0xbb20f6ca,0xbab10f58,0xba602012,0xba701798,0xba71ce1a,0xba2add66,0xba52f783,0xba582528,0xba6a3747,0xba555247,0xba4e7e7d,0xba202dcd,0xb97dde14,0xb97b7031,0xba44fd48,0xbb053e23,0xbacec892,0xbaf15200,0xb9a9f36f, +0xbb1fabd0,0xbae6eb0d,0xbb0c6929,0xbb4f9ca9,0xbb5fc831,0xbb73327c,0xbb4b02e8,0xbb041f80,0xbb1d4fc8,0xbb24e481,0xbb00840e,0xbaaf02c5,0xbacc5621,0xbabb1e55,0xbad75230,0xb9813667,0xbb01aa5a,0xbad68758,0xbaafd6b7,0xba910117,0xba310433,0xb98fbd1e,0x3908ac4c,0xb90aa923,0xb9596379, +0xb95616bb,0xb93f877d,0xb92d80c2,0xb95795c0,0xba57bf49,0xba9c53e9,0xbaab953d,0xbaa652de,0xbb2fc1f4,0xbb57d672,0xba6ce845,0x38666cd9,0xb9c794eb,0xbaf84ac7,0xb9da4683,0xba0220c9,0xb8fab44f,0xb802a90c,0xb98c73e4,0x395ddae9,0x39f43abd,0x39fc615e,0x39fe084a,0xba8dc8b1,0x3a29eadb, +0x3a17ff7b,0xba0ef41d,0xbb362a42,0xbb0bf97c,0xbb0d226c,0xbb071a8c,0xbb01f9fd,0xbafd4190,0xbaead83a,0xbaf04c8a,0xbaefd8cc,0xbaf35280,0xbaf5b9cb,0xbaf5270a,0xbae23dc4,0xbaf701fe,0xbb05defc,0xbb18ba9f,0xbb289d97,0xbb39b720,0xb996613f,0xb8bfc70d,0x39ce6d83,0xbb570166,0xbb6bb9eb, +0xb9d74b35,0xbb2be613,0xbb716a14,0xbacdd26a,0xbb0bc204,0xbb091c21,0xbac29bfb,0xbab87a74,0xba9d1f00,0xba7f0e67,0xbb58bf0e,0xbb26fcc5,0xba2a8e8c,0xbb660ebb,0xbb64335d,0x37848d1a,0xba12a597,0xba08b3b6,0xb9f74f3b,0xb94909b5,0xb81b8f6a,0x3994428a,0xb89260e2,0xb91524c3,0xb9c10504, +0xb904be97,0xb9985d52,0xba4e77df,0xba6c7cd6,0xba5197d4,0xb943880e,0xb933a88a,0x3aa46ace,0xb9f384f8,0xbb1bb1f0,0xb9ec11de,0xba5aec9f,0xbac308cc,0xbaa364f4,0xb9e41514,0xba9d02a0,0xbb101255,0xbb48d54f,0xbadc08d4,0xba347143,0xbac20567,0xba08d8a1,0xb9bf25e7,0xbaf434eb,0xbad5fc45, +0xbb5e77be,0xbb16e95d,0xbab888e1,0xbae303e8,0xba8f0c45,0x37164d68,0x3a6e5744,0x3aeabfd2,0x3a5a6aba,0x39099c67,0xba532b15,0xb993eeb0,0xba346132,0xbaea269f,0xbb0b5427,0xbac7ba50,0x39fc14a6,0x3a1ef879,0x3ada42f5,0xba61bd14,0xbb25acad,0xba7adce0,0x3a42a0ce,0xba7b097b,0xbad567bd, +0x386293bc,0xbb341d79,0xbaf7d49c,0xbb51e792,0x392ccc8e,0xb89f9fae,0xb9d50b5a,0x38f091c9,0x3a2a959e,0xb9f62e3e,0xbad50296,0xbb691828,0xbb40e305,0xbaf07b4a,0xbb138696,0xbaf0226d,0xb92068d1,0x3a80c943,0x3b2c09c0,0x3a4a1743,0x39c55d57,0xba6d9219,0x39c6352e,0xba1e2fce,0xbb53bcfe, +0xbb7b6a4f,0xbb38b1a3,0x3a5551a3,0x39fcbf9a,0x3ba5a8b3,0x3a352ab3,0xba0ef4f4,0x3a862eb8,0x3b3fedb5,0xb989c4cd,0x398f1520,0x3b590cb5,0x3acf82e0,0x3ab25c38,0x3a93bf98,0x3aec3d7e,0x3b21d33e,0x3b0befa5,0x3b305147,0x3b2c97bf,0xba96e24b,0xbae0864e,0xbba782ae,0xbbafa07c,0xbb9aa426, +0xbbaad01a,0xbb724bf0,0x3792a3d9,0x3b64fd31,0x3bda3db9,0x3b64e9ac,0x3a206f95,0xbb0c1f34,0xba2670c3,0xbae431ac,0xbbae1d58,0xbbaef537,0xbb22f56a,0x3b760145,0x3b721dec,0xbbc66780,0xbbe06274,0xbc15516b,0xbbae9169,0x3a746623,0x3a9888a5,0xb9a081a2,0xbb875765,0xbb71618b,0xba99b485, +0x369ad60e,0x3b713260,0x3b56033c,0xb8f10bf2,0xba11fa85,0xb8c9135d,0x3b27338d,0x3b44f31a,0x3af7c04e,0x3b47df22,0x3bbdd2ea,0x3b9b0d8c,0x3b8fc0a3,0xba54b650,0xbb72658b,0xbb6b9bf3,0xbadeb463,0x3b67afc4,0x3c1b0c9d,0x3bace537,0x3b17606e,0x3a327d84,0xbbb150ae,0xbbe20fbb,0xbbc501ad, +0xbbed398e,0x3c097037,0x3ba96454,0x3b0f6396,0xbad72134,0xbc14fd3f,0xbc08c775,0xbb7ca2bc,0x3938454e,0x3b1f336a,0x3a927879,0xbafda3af,0xbb462180,0xbaf0e63a,0x3a87d8ae,0xb9da92bb,0xba9a4a8d,0xbb0d4793,0xb9d66ffe,0xba5ef9bb,0xbb23f3a9,0xbae8c081,0xbb7cf20b,0xbb8413a1,0xbb5a3890, +0xb992ee34,0x3b98cc2f,0x3baf3c49,0x3b01dd8c,0xbb827598,0xbb3dcfa2,0xb98b2251,0x3b1512a1,0x3bda6cbe,0x3bba2068,0xb869cb12,0x3b4fcfaf,0xbc7dd42e,0xbcc8a47b,0xbc057f45,0xba97a8b2,0xbb909e40,0x3b38d50a,0x3ab366a2,0xbb655e19,0xbb386faa,0xbaa4f16d,0x3a2bd1d2,0x3a7c5a0b,0xb774e832, +0xbab5bf75,0xbabe414d,0xb9e08ecd,0x3a2f62b8,0x37f5312a,0xbadf728c,0xbac74019,0x3b089127,0x3b0bde37,0x3b086246,0x3a9c4f54,0xba64ad85,0xbb41351a,0xbb2ef54d,0xb658b12c,0x3a9f568f,0x3c38edd0,0x3bb497ad,0xbc848560,0xbc695c10,0xbc52b206,0xbc2df0c2,0xbc1d5c8f,0x3be7be01,0x3c4995a5, +0x3bff9fe4,0x3b8dfd70,0x3b469f76,0x3a43f5cf,0x398990c7,0x3a45c96f,0x39bafffa,0x392cb02d,0xba81c5d5,0xba0ab5df,0xb92710a5,0xb910538b,0x3899585f,0xba652839,0xbb0ba350,0xbb32f964,0xbb764090,0xbb47a627,0xbb20a09f,0xbb37d2d1,0xbb117b9c,0xba2f0e1e,0x3a6bda10,0x3b3e9a70,0x3ad2523d, +0xb9785ddc,0xbb609a70,0xbbaf3b15,0xbb90c163,0xbacbf2bc,0xbb86cca2,0xbbba9aa8,0xbbac3f8a,0xba2e10a6,0xbc609b18,0xbc32720a,0xbbd7ce58,0xbb39ed8d,0xba44ec14,0xb963989d,0x3a0e9612,0x3aa1d8b5,0x3a8f2a3c,0x3aa91214,0x39960448,0x39b96c92,0x394a46bd,0x39bdf177,0xbaf274e9,0xbb46fc24, +0xbb583129,0xbb813d62,0xbb8cbff4,0xbb3ca46a,0xbaa8f896,0xb9a17f63,0x39fd6728,0x3a91340e,0x3ae3bd2e,0x3b22c72c,0x3b30eb3d,0x3b41efc5,0x3b49f802,0x3b73882a,0x3b44a69c,0x3a856a56,0xba2ecb69,0xbb84d047,0xbc0b6bf9,0xbc5419a2,0x3b96752a,0x3b0dedcf,0x3b545688,0x3b553498,0x3b7491a2, +0x3b7fe8fe,0x3b8af168,0x3b6c54bc,0x3b7d3da0,0x3b5ab046,0x3b236305,0x3a4dc22d,0xba4637d1,0xbb10847c,0xbb1ed0b0,0xbb2640a0,0xbb0c1274,0xbb0acf4d,0xbaea2eec,0xbae91e6f,0xba5f53ee,0xba30f173,0xba1c0a1c,0xba610437,0xba982222,0xbadbec2f,0xbaaf56a2,0xb9d6552d,0x3a0f4b9e,0x3a8a292a, +0x3aca61a4,0x3ace2aee,0x3b43853b,0x3b76a1e2,0x3ba05a31,0x3b955eed,0xbb210464,0xbb813523,0xbba8374f,0xbba1bb14,0xbbb748ca,0xbb96c686,0xbb639959,0xbb26ddb6,0xbb3b7b5e,0xbb1f2f3a,0xbb47c841,0xbb19cde8,0xbb3b8f21,0xbb42ac1b,0xbb415de9,0xbb4077af,0xbb50b7ca,0xbb4eb650,0xbb696a98, +0xbb3c37ba,0xbad27e96,0xbaabda7b,0xb9e4e03c,0xba07131b,0xb9c17a69,0xb92132fb,0xba34bfdc,0xbab28263,0xbb048fb8,0xbaf95baa,0xbadc5338,0xbaa09af9,0xba53ff1a,0xba1c940d,0xb9d1356d,0xbafbde54,0xbb04533c,0xbb32af0e,0xbb400392,0xbb3acf80,0xbb693514,0xbb6daa1c,0xbb8085dc,0xbb8f2c77, +0xbb830fcc,0xbb87a8b8,0xbb922a0e,0xbb86431a,0xbb68c459,0xbb6c39cc,0xbb5981cc,0xbb30fece,0xbb2f0e71,0xbafb991e,0xbb09b7b6,0xba972565,0xba578fe2,0xba503a20,0xba0aa40b,0xb987a44b,0x388b0503,0x39e52fca,0x3a15716f,0x3a3cf289,0x3a30d885,0x3a0ad798,0x39539b34,0xb95d9d01,0xba519c71, +0xbab4c5e4,0xbade2d74,0xbafed299,0xbb212365,0xbb22b326,0xbb892bc8,0xbb926191,0xbb439fd4,0xbb88f4b3,0xbb9bde63,0xbb80ab8d,0xbb760007,0xbb6eb96c,0xbb5310b5,0xbb56cd0d,0xbb50a93c,0xbb41008e,0xbb8ed861,0xbb6de204,0xbb2d9404,0xbb7f625f,0xbb5b4fde,0xbab8eead,0xbad3e309,0xbabef34a, +0xbab0e1cf,0xbaa28225,0xba963c48,0xba8536e6,0xba96568e,0xbaa2f81c,0xbaaabce7,0xbab59c7b,0xbabaef75,0xbaba624a,0xbad0ec94,0xbae542df,0xbb021473,0xbb13837f,0xbb1daede,0x3b08381f,0x3af4234a,0x3adc2199,0x3b68ee75,0x3b233e70,0xba9ce634,0x3b66823b,0x3b1bd44f,0xb9f2afe5,0xba8c8d99, +0xba9fef13,0xbae00bea,0xba9be7f0,0xba966c80,0xbad2a629,0x3b34011e,0x3b7cb0d7,0xbaf240d5,0x3b108e7d,0x3b55c663,0x3ac92a99,0x3ad2df5c,0x3afb9d9c,0x3b02e1f5,0x3b17cfdd,0x3b24b516,0x3b3d0714,0x3b219183,0x3b1abcb9,0x3b07b360,0x3b2864de,0x3b26b20e,0x3b0541e3,0x3b149afd,0x3b11476f, +0x3b031474,0x3b0a8b0f,0x3b2a2e14,0x3b478feb,0x3adf0bb1,0x3b28593e,0x3b55036d,0x3aac2710,0x3aad2b72,0x3b082f31,0x3a5bf35f,0x3a912b8f,0x3ab15313,0x3b131b7b,0x3b074519,0x3b0651b4,0x3b0fe68c,0x3b0df02d,0x3b2dff54,0x3a9c1987,0xb9542c8f,0x3ab5a76c,0x3a856056,0x3b0a1c50,0x3b2d4c8e, +0x3b75147d,0x3b8e85bc,0x3ba6759e,0x3b7f0333,0x3b571dd6,0x3b2774fd,0x3b732b8a,0x3b7dc6d8,0x3b3969dd,0x3b66c960,0x3b608bf4,0x3b41b0ca,0x3b56b62b,0x3b15a7ec,0x3af6ec1e,0x3b3869af,0x3b18fd86,0x3b648a85,0x3a7ed011,0xb8537af9,0x3abd2d88,0xba9631ce,0xbb08c2e7,0xba72b2c2,0x393b49bb, +0x3acfc277,0x3a8d37ed,0x3b2cece1,0x3b4169ef,0x3afec771,0x3a70325c,0x3a1bc790,0x39b6cb42,0x3a4e4db9,0x3b09a8c5,0x3b44b3b4,0x3ba24f6f,0x3bc4e206,0x3c00190c,0x3bae2150,0x3ba137ea,0x3b6be2cc,0x3bc6efd8,0x3bc8b8d5,0x3b5215f7,0x3b9f9c14,0x3b89feeb,0x3b40e204,0x3b63e000,0x3b8c4a95, +0x3b4a98f4,0x3b5e9528,0x3b568fa1,0x3b948021,0x3a14698b,0xb9a2f0fa,0x3b18e9be,0x39dff768,0x39be33cd,0xba6417c2,0x3aaabee1,0x3b23b501,0x3ac27f57,0x3b473821,0x3b49bc73,0x3ab3b3fa,0xba6dbccc,0xbb1bbfa7,0xbb354e0c,0xbaa9c8fe,0x3ad27cff,0x3b8bf3c9,0x3c06d625,0x3c35d351,0x3c582c7c, +0x3c1206bf,0x3bbf67ef,0x3b5d94f5,0x3bed96af,0x3c01f093,0x3b92109b,0x3bf45eff,0x3be8f386,0x3baf557b,0x3bc614f1,0xbb463618,0xba23bc0f,0xbb066c7c,0xbac8779d,0x3b0a73b8,0x3b2d57ad,0x3aa137b3,0xbb1c2c5c,0xbb243c1c,0xb9e50ce1,0x39175d62,0x3b474a06,0x3b2acbae,0x3a4efd31,0xb9d1e4b1, +0xb964a7f8,0x3b66290c,0x3b98eb43,0x3bd2d001,0x3c099080,0x3c0cafe9,0x3bc12a14,0x3b163636,0xbad8c8b8,0xbba568b6,0xbbccc645,0xbb1eb390,0x3b7e8957,0x3c2b7a0d,0x3c02ee97,0x3bedfe7e,0x3c0d5d3a,0x3b1fd273,0xb793d564,0xbab51e33,0xbb173285,0x3b98ec83,0x3bd6fb51,0x3c0a5a80,0x3b186b78, +0xbbbd0c76,0xbbe5b4bc,0xbb9592bb,0xb9470fc8,0x3afd8c8e,0x3a978a3c,0xbac8c879,0xbb39d0ec,0xbaf822f4,0x3a1e7f6b,0xb9e29ff4,0xb9b3163f,0xba08d39e,0x3a1a3441,0x3a4b95d4,0x39a7511d,0x3b01a9b9,0x3b374501,0x3b8ffd5a,0x3b1ca46b,0x3b6d9d47,0x3c05396e,0x3bbce974,0x3aac0cec,0xbb99a802, +0xbaffb2bc,0x3b1e088b,0x3bbd4ed0,0x3c480fc5,0x3c1dbb4c,0xbad8f3f2,0x3b0e6c0a,0xbc480171,0xbcc9ef36,0xbc1d1b23,0xbb47adcf,0xbb7e7db8,0x3b3dff3c,0x3b1d078f,0xbb139d15,0xbb0d1b88,0xbaaefeba,0x3a335f89,0x3aa50bf7,0x396720fb,0xbacb7c54,0xba64f81c,0x390e726e,0x3ae8f038,0x3aa8234e, +0x3acc8aa8,0x3a233e96,0x3aaa5a6d,0x3aff6972,0x3ad4d4ec,0x3b4ed764,0x3b72d2f6,0x3b86574d,0x3b7c2da3,0x3b8cca94,0x3b32eb2a,0x3c42621e,0x3c2a142a,0xbafc99f4,0x3b4f79ec,0x3b923ac7,0x3b8c5fef,0xbb1f47f2,0x3c761384,0x3c703038,0x3c25568d,0x3bd1a037,0x3b38d2cb,0x3adbf6ef,0x3a38d3e8, +0x3a70732b,0x39eead6a,0x39abf12a,0xba1a1e42,0xb9e5f5f2,0xb91e7d6f,0x3a089d89,0x39fc18f1,0xb7744c36,0xba6deca7,0xbb00542b,0xbb0b4440,0xbb1019e6,0xba79ff4b,0x3a60f335,0x3b19aec7,0x3b870807,0x3ba4d2d2,0x3bbd9c52,0x3bb4df6d,0x3b85177f,0x3a6d0166,0xba12ba97,0x38279c1b,0x3a1ee54c, +0x3bdacff6,0x3c21a384,0x3c6659ed,0x3c526831,0x3a5f3cf0,0xba4ceaf9,0xbb832933,0xba3ca8d5,0x3a84ecb5,0x3a139bb9,0x3a4b7742,0x3b20c227,0x3b0a6cd8,0x3adb3357,0x3a68fddd,0x3995c260,0x3912f25f,0x3a4da4a0,0xbac2d3cf,0xbb2ed59b,0xbb619347,0xbb359ef9,0xbb04a4df,0xbb029d9f,0xbaac1e14, +0xb9be4296,0x39b1fdb5,0x3b0213f5,0x3b8c7bc5,0x3bfe3095,0x3c0b9f58,0x3c22a297,0x3c42034d,0x3c27c397,0x3c1dde40,0x3c1069fa,0x3c228a28,0x3c05f100,0x3b807960,0x3b007e7f,0x3c0bd86f,0x3c046246,0x3bb4cdc3,0x3bcb4bf5,0x3bb38ef0,0x3bb8b977,0x3b9ab5c9,0x3b892d2f,0x3b879f9d,0x3b6c37c5, +0x3b29c92b,0x3accd8d6,0x376d2415,0xbae2750d,0xbaf5466a,0xbab82f4d,0xba2329ba,0xbaa2c98b,0xbacae4c7,0xbae7f081,0xba5586b5,0x38571c71,0x39f56158,0x3ae0ce3f,0x3ae4c104,0x3a83ac50,0x3a341b87,0x395574c3,0xb9a9c364,0x3a3a9c9c,0x3b2d478c,0x3bb250db,0x3ba5d3c1,0x3bbf7a22,0x3beea6fc, +0x3c045dd9,0xba8de9e2,0xbafd644c,0xbace5552,0xbaeb31d2,0xbb2b1d87,0xbb095b3f,0xbac22a8d,0xba7c5c7e,0xbab20307,0xbad31245,0xbad470b9,0xbb06c1a4,0xbb24055f,0xbb36a6b5,0xbb2ab4d9,0xbb2b61e4,0xbb302f3a,0xbb159292,0xbac966b0,0xbab29863,0xbab89ebe,0xba8d328e,0xba730ea9,0xba55464e, +0xba1ef281,0xb999a4b1,0x38f5ad0f,0x3a1f082d,0x3a84bf65,0x3ab4357a,0x3abe5df8,0x3b030067,0x3b00ac1f,0x3b0143c5,0x3ac95c2f,0x3922a53c,0xbab92abc,0xbad91f48,0xbb3406b8,0xbb1e29fb,0xbb255837,0xbb40a86a,0xbb4d7875,0xbb60e5f4,0xbb4a88ef,0xbb1e375a,0xbb007bf7,0xbad1dee7,0xbad3f0a2, +0xba9fccdc,0xbab95c8e,0xbad154ef,0xba81329e,0xbab74f64,0xbaaf875e,0xbaf93789,0xbb0407ec,0xbad16c2c,0xbab62509,0xba893f95,0xba449e73,0xb9f713dc,0xb9c21a2f,0xb8fcb7d7,0x39878d90,0x3a32fc6c,0x3a9a2cd7,0x3ad47f4b,0x3a436bf5,0x36b69033,0xba0b1ebb,0xba5d6337,0xbad00934,0xbaf0de91, +0xba424b6f,0xbaa8a787,0xbb5de546,0xba6854ab,0xbab93d49,0xbb555262,0xbb491ade,0xbb4a41c6,0xbb5297e0,0xbb4acc53,0xbb4622c2,0xbb46d0d3,0xba161c4f,0xb987e7b7,0xbb31d992,0xba287424,0xb9b19e75,0xbae0c225,0xbab1e3ca,0xbaa54faf,0xba9d36ba,0xba91481e,0xba8834e7,0xba776c2c,0xba524c01, +0xba33924f,0xba1f4cd0,0xba0acd83,0xb9f6e475,0xb93d8ae0,0xba045963,0xba31237c,0xba801177,0xbaa2de75,0xba9bea99,0xbb0dfad0,0xbad5e3bc,0xbb2bae2e,0xbb17d470,0x365c987c,0x3b92cf11,0xbb47a26d,0xba40ee91,0x3b505711,0x3b342aa5,0x3b321e83,0x3b36a68d,0x3b61b9a2,0x3b72e9f0,0x3b783b35, +0xb93b8654,0xbb1c9235,0x3b9459e3,0xb8ff40d7,0xbb184707,0xbb34aee3,0xbb0c92f0,0xbb1c569a,0xbb16b8b9,0xbb07402a,0xbafc13ca,0xbad66fd1,0xbafeda74,0xbb061a6c,0xbb1a84c3,0xbb09b131,0xbb1493ba,0xbb38de2d,0xbb3293ba,0xbb224778,0xbacd0f32,0xbaf42788,0xba4b0875,0xbb2cb853,0x3aa5bbed, +0xbb02d6c5,0x391afd76,0xba78c5b7,0xbb07f6bc,0xba4e8305,0xbb3a24f6,0xbb606c47,0xbb3ccac5,0xbb23780b,0xbac61c9d,0xbaeae287,0x39360356,0xb6afad60,0xba99a79d,0xbae7a3a0,0x38a14579,0xbb78e442,0xbb63da3c,0xbb65fcc9,0xbb4b1749,0xbb0c4ec3,0xbabddcaa,0xba49a2a4,0xbada44aa,0xbb185d26, +0xbb580680,0xbb2e2638,0xbb3f0a24,0xbb81bec0,0xbb72d77e,0xbb382819,0xb9b83fd4,0xba55e844,0xba3f5fc4,0xbb321853,0xbafff808,0xbac4d50a,0x3aff85d1,0xba8e36c8,0xbaedc68a,0xb9a86dc1,0xbb3a9920,0xbb5b8315,0xbb58fa50,0xbadaf9af,0x39a9456e,0xba8bde4e,0x3a81cc5e,0x3a2889eb,0x39f694c1, +0xba927997,0xbb13382a,0xbb6656a5,0xbb8e5d6c,0xbb86117b,0xbb837699,0xbb1ff16e,0xbac6a992,0xb8a829c9,0xbaed0e43,0xbb143a6f,0xbb7bc5f6,0xbb29a255,0xbb63c2e0,0xbbcab2fc,0xbbb142b7,0xbb758e45,0x3a05fee2,0xba12b980,0x3b135c1a,0xba4bd25b,0xba04216c,0xb9c8dd16,0x3b5e9911,0xbaa8e275, +0xbabd9457,0x3afb997d,0xba114a7b,0xba50e3b4,0xbac75d98,0x3aa4392c,0x3b03e6dd,0x3ab16ef4,0x3b24fef8,0x3b1da4aa,0x3aaedc11,0xbaf85d84,0xbb6c9f91,0xbbc1b605,0xbbe962d0,0xbbda60a1,0xbbbccf68,0xbb1a2cd0,0x39e099e6,0x3b2c32a8,0xba039f3d,0xbb4d1d6d,0xbbbe78bc,0xbb838e42,0xbb92ad92, +0xbbf9b470,0xbbb6d684,0xbb08e671,0x3b93f5ff,0x3b5d73b9,0xbc32af43,0xbbe5b80e,0xbbe6b761,0xbba0f755,0x3a9eb293,0x3af2eb0b,0x39fbc523,0xbb1e4fe7,0xbb21c1fc,0xba49412c,0xb825b3a7,0x3b0533ce,0x3ae65f18,0x3a881000,0xba9ba9b5,0xbabdd174,0x3b0ce76f,0x3b17ca43,0x3b883f2b,0x3b8764d3, +0x3b0871c2,0x3acbcf8a,0xb981c4a9,0xbb7934e3,0xbbca1614,0xbba8d417,0xbb4e55ff,0x3ab43eca,0x3ba1ef8b,0x3a8e5fc5,0xbb34225d,0xbbb09c62,0xbc1890cc,0xbc1f1111,0xbc04c09b,0xbc2334e9,0x3b6caddc,0x3b7b7e91,0x3ba99a1b,0x3a80a1e3,0xbc05e320,0xbc0db8c4,0xbbb41fae,0xba8d88a4,0x3a9c4543, +0x3a143624,0xbab58874,0xbb286d18,0xbb07e646,0x39760158,0xbab322cf,0xbac85b31,0xbb05c2c7,0x39c8fddc,0x3ab745e3,0xbaa7a7c1,0xbb746c07,0xbbba7691,0xbbe3e927,0xbba2489d,0xba43e8d5,0x3bbaf941,0x3b779325,0xba0ad7c7,0xbbd70ba1,0xbb7dbd1d,0x3935db76,0x3b6690c8,0x3bedbe25,0x3b9d96bf, +0xbb5957da,0xb9c905a9,0xbc411209,0xbcd96046,0xbc3e8025,0xbb9b593b,0xbb8717d9,0x3b063a94,0x3ad72138,0xbae95f8c,0xbb19fc09,0xbacca720,0x39c57418,0x3a83ea4a,0x38f26004,0xbae225cb,0xbabe9e86,0xba8dc5fa,0x3a4ac9e8,0xb9bcfec6,0xba95d843,0xbacd82fe,0x39107306,0x3a7f890d,0x39fb2279, +0xbb315b9e,0xbbd54228,0xbc0fd52e,0xbc1577c0,0xbbc22fdd,0xbb2a4d9d,0x3b780a2a,0xbb4dfcb1,0xbcafd7b9,0xbc999f54,0xbc801896,0xbc52fc01,0xbbbd0e5d,0x3b99ec2f,0x3c71c890,0x3c31319e,0x3bb0a178,0x3b2a0121,0x3a44a2b8,0x3a7c0242,0x3a0d3a6f,0x3969f942,0x39adcd3c,0xba1ad342,0xba47cb71, +0xb9c4b7b8,0x39587223,0x3822da82,0xb9d807f1,0xbab3c132,0xbb162f6c,0xbb1cf6fb,0xbb3e557f,0xbb755dd7,0xbb86e6c6,0xbb652f70,0xbb094533,0xb90a1af3,0x3af46caa,0x3a28088d,0xbac7c285,0xbba8b532,0xbbb53550,0xbb9e01be,0xbb91888b,0xbc0d4e75,0xbc406ea3,0xbc531593,0xbb98603c,0xbc85ea8c, +0xbc141732,0xbb3f43f0,0xbb0cccc7,0xba584fbf,0xb9da5600,0xb93ff1a0,0x3a917444,0x3a822267,0x39bda3c4,0xb94ff012,0xb9c2fffa,0xb9b56f72,0x38c000d0,0xbad357f4,0xbb2c649f,0xbb761f92,0xbb8a6313,0xbb7ff15b,0xbb8b43dc,0xbb2d1ac4,0xba7c7630,0xb987840f,0x3a322524,0x3aa0ec3e,0x3ae64080, +0x3acb4c98,0x3abe988f,0x3a1d849c,0x3a8ba3ea,0xba1c1041,0xbb7f8a91,0xbbc25de1,0xbc0d93dc,0xbc4b9831,0xbc7836a6,0x3af3d251,0x3b12f4ba,0x3bbc6bc2,0x3b852ca8,0x3b93ea9f,0x3b798334,0x3b5aade4,0x3b4f9685,0x3b4d7f81,0x3b4cb83e,0x3b21c62c,0x3acd505e,0xb7f2b540,0xbae2b3ea,0xbb1b66eb, +0xbb22f900,0xbb07e677,0xbac48d2b,0xbaac6dbe,0xba997bc1,0xbad0115d,0xbb0b9185,0xbb1179c5,0xbb09eda5,0xbb0d3d09,0xbb20df82,0xbade1373,0xba03ab41,0x3a56316d,0x3a67647d,0x3a2cc01d,0xba43b50a,0x3a37531f,0x3aa7353a,0x3af993f0,0x3b0a2889,0xbb58442e,0xbb6fee00,0xbb63d74e,0xbb6bc0a0, +0xbb51c109,0xbb2764ee,0xbac3745e,0xba5cc888,0xba881ee1,0xbabebf5f,0xbafa30e2,0xbb161546,0xbb16bf64,0xbb3df21d,0xbb319eda,0xbb469bc5,0xbb4f0c9e,0xbb4c7a31,0xbb4df549,0xbb588f22,0xbb3cb8d4,0xbb13c0b6,0xbae148b4,0xbabd3b24,0xba8f6d85,0xba24e097,0xbab371fe,0xbb0ce054,0xbb39845d, +0xbb54928e,0xbb587da0,0xbb544652,0xbb2645db,0xbb082f7b,0xbae3e119,0xbb266ed7,0xbb6edd73,0xbb87e18b,0xbb0d3c64,0xbb81a57b,0xbb7c84ff,0xbb7e2e18,0xbb9a0a0a,0xbba037b9,0xbba3053d,0xbba0c7d3,0xbb90f643,0xbb94b8a6,0xbb87e129,0xbb819c33,0xbb5678a6,0xbb41c98e,0xbb5e328f,0xbb37f6ce, +0xbb027d85,0xbb168140,0xbae210f1,0xbae7af33,0xbacef0b4,0xbaaf3af2,0xba91af8e,0xba43133c,0xba92959e,0xbab462e1,0xbae7f7c2,0xbb0a97b3,0xbb2b67b1,0xbb54e399,0xbb6466b7,0xbb7746bb,0xbb7c8a1d,0xbb7ad166,0xbb67104d,0xbb7e96fb,0xbb7e16be,0xbb3b2216,0xba30e552,0xbb9006de,0xbb4f13e6, +0xbab7e2fa,0xba8d9e79,0xba6c51c4,0xba344021,0xb9e84679,0xb951f5a0,0x384acf92,0xbb333059,0xbb7b04aa,0xb886e446,0xbb2392d4,0xbb5bc369,0xbb3e0ddd,0xbb32cc11,0xbb2e2e82,0xbb23bded,0xbb1dc61e,0xbb185c4c,0xbb0dac16,0xbb1dd866,0xbb28d290,0xbb342b3f,0xbb4259bc,0xbb4df91d,0xbb5ba3de, +0xbb57fb98,0xbb58fa27,0xbb5dc619,0xbb674f72,0xbb69bd9c,0x3b5028ac,0x3b365d79,0x3b767bd1,0x3ac39049,0xbaa93def,0xbb878ed2,0x3b290e03,0xba7163aa,0xbb80530d,0xbb9a9f69,0xbb9de60f,0xbb98b85d,0xbb96a2c2,0xbb9377c9,0xbb98112a,0xba1f1da9,0x3b27d92c,0xbb9980d0,0xba933d0d,0x3aa73632, +0x3b6342f8,0x3b2b63e8,0x3b4bf9d3,0x3b57e498,0x3b68b1ad,0x3b714c85,0x3b7c8e41,0x3b675b4e,0x3b62a0f5,0x3b53f514,0x3b711a72,0x3b6e5cca,0x3b4fa696,0x3b56e4ae,0x3b50fd73,0x3b414738,0x3b4e0767,0x3b751f55,0x3b79cb16,0xbb0d5125,0x3b307472,0x3b02c0ef,0x38a32a1e,0x3a767c4d,0x3ac2973d, +0x3a84e301,0x3a347781,0xb8840dd4,0x3adb54fb,0x3af8532c,0x3ad5ae3d,0x3aa5dacd,0x3ae528bc,0x3b0da26a,0x3aa608bb,0xbb3b03a8,0x3b0dbb93,0x3b2e3b3e,0x3b622d76,0x3b93997c,0x3bb3f6e7,0x3bc3e0f0,0x3bc7aaaf,0x3ba39f4a,0x3b8f4ac9,0x3b78c37e,0x3ba0eac1,0x3ba3d570,0x3b81bb31,0x3b8be0ec, +0x3b856697,0x3b702ba7,0x3b8170c7,0x3b82bdcd,0x3b2d6bcc,0x3a131329,0x3aa6e04c,0x3b21ffb2,0xb8a39de1,0xba81a7aa,0x3a6ea858,0xbb2e206e,0xbb1a5386,0xbb2c10f1,0x39e1da27,0x3959f1d5,0x3a793ef2,0x3ac286b3,0x3b29e710,0x3b0f924f,0x3a3b0aa9,0xba2bd645,0x3a20bca6,0x3b4318bd,0x3b71abed, +0x3baea552,0x3be492ec,0x3bfdf2cd,0x3c07db8f,0x3bd08fb2,0x3bc7b263,0x3bac405b,0x3bf07fdf,0x3bec589e,0x3b96b8f8,0x3baeb060,0x3b9b02b0,0x3b7c1b5b,0x3b8810b2,0x3bbea416,0x3b4b06db,0x3a407516,0x3b17d42e,0x3b9e1c57,0xb9ccb12f,0xbab4192f,0x3ab24632,0xba810266,0xbac9de1e,0xbb106c80, +0x3a1a6447,0x3b15c9cf,0x3aed875c,0x3b5f9c04,0x3b89437f,0x3b0dd5f2,0x39c92afd,0xbb5ab323,0xbb08e398,0x3abd758f,0x3b707c5e,0x3bf6ee1f,0x3c361398,0x3c5a3ac1,0x3c58ee1f,0x3c167196,0x3bd47768,0x3ba657e9,0x3c093e38,0x3c0eccce,0x3bb9c0b6,0x3be79a12,0x3bd72c0c,0x3bbc3379,0x3bbe6e03, +0x3a162338,0xba5a12c3,0xbbb432c8,0xbb7f6409,0xb95fdab6,0x3ac737f1,0x3ae9b0a0,0xba605636,0xbab491f8,0xb8c9d0e0,0xb76da4dc,0x3ac32f73,0x3aaef80b,0x3ac757d1,0xbaa14a20,0xba79ad2a,0x3b05d5cf,0x3ba741d5,0x3bb41379,0x3c063f33,0x3c2d367d,0x3be7fd38,0x3b9c5a6c,0xba8109a5,0xbb5882cc, +0xbb29fb52,0x3b7d491a,0x3c28da82,0x3c6318f1,0x3c3d9996,0x3c19b1f2,0x3c05162c,0x3b688e57,0x3b0a6332,0x3adcb327,0x3919384c,0x3bc04d52,0x3bf6215a,0x3c12de4d,0x3b9fc403,0xbb7d2913,0xbbeafeb6,0xbbb3e78d,0xbab0eb53,0x3a74dc51,0x3a28d4c3,0xba76d501,0xbb09a428,0xbafc315a,0x39807459, +0xb9e59bea,0xb81649fa,0xba56861c,0x3aa284ab,0x3a3cc325,0x3accef4e,0x3b5339d7,0x3b4f18d3,0x3bcc3d56,0x3b8f8394,0x3baec4a1,0x3c094638,0x3b51e52e,0xbad4e3d3,0xbbcc5d2f,0xbae9a015,0x3b372da9,0x3ba23621,0x3c253766,0x3be30922,0xbb9440dd,0x39dac054,0xbbf1d580,0xbccb3ae1,0xbc76a9cb, +0xbbeed405,0xbb8ba95b,0x3ae112c0,0x3aa6e33e,0xb9c2772d,0xbad1d969,0xba9232a3,0x39e673d8,0x3ab6e117,0x3a18d15f,0xbae1994c,0xba7ff60d,0x38c097d4,0x3a6ee9a3,0x3ae9e3b2,0x3aac00e7,0x3ad3ff01,0x3b35f23d,0x3adbedc8,0x3aafff74,0x3b58eac2,0x3b96520f,0x3bb9492d,0x3bc641e8,0x3be6d6be, +0x3bcf2ef0,0x3c4d16e5,0x3c2efeeb,0x3a753f2c,0x3ba4609e,0x3bbe796d,0x3ba180f7,0x3b21b150,0x3c54b2e7,0x3c6b70bc,0x3c452163,0x3c072554,0x3b1659a0,0x3b272586,0x3afe5a45,0x3aa968f7,0x39d040f4,0x39b99382,0xb9c59d7a,0xba0d3389,0xb967672a,0x3a390ada,0x3a1791dc,0x395ded21,0xb79ec846, +0xba61828c,0xbb1e3df3,0xbab4c17f,0x3a58dada,0x3b1e5889,0x3b8fd1db,0x3b9be4b3,0x3ba43d42,0x3b96a6b7,0x3b7cc409,0x3ad3c277,0xbb0c02be,0xbb1e42a2,0xba6d6875,0x3ab8bb5d,0x3badd153,0x3c03cfbd,0x3c49d545,0x3c1f71fc,0x3b1c31ae,0xbb04086c,0xbbe74b4e,0xbb173723,0xb9043f5f,0xba56a86e, +0xb95219be,0x3afba91b,0x3a85cc21,0x3a653c27,0x38cb5143,0xb92d1a75,0xb958046b,0x39bbffaa,0xbaa09861,0xbb11ad9c,0xbb5e751e,0xbb4d60de,0xbb745d4f,0xbb293f89,0xbb01a1c7,0xbab5e3ae,0x399c8cea,0x3ac3ec61,0x3b78d183,0x3be6b161,0x3bf9d087,0x3c0f894f,0x3c24b088,0x3c1a170a,0x3c0dbf64, +0x3c0416bd,0x3c07242a,0x3bdf6b04,0x3b94febd,0x3b2c64d0,0x3bfdc8b2,0x3bd4b35b,0x3b55f083,0x3b9396b2,0x3b7aaed2,0x3b876879,0x3b796d03,0x3b53d7ca,0x3b6fc2c8,0x3b670c22,0x3b4b9b57,0x3b16a76f,0x3a7d6bf3,0xba627300,0xbabbb5eb,0xbabe2fa4,0xba7c3a2e,0xba8c2669,0xba760f41,0xba963a97, +0xb7ec373f,0x3a2965de,0x3a478612,0x3adbbcac,0x3adb3c8d,0x3a9d8411,0x3ad31686,0x3ad3903b,0x3ab05e24,0x3b232039,0x3ba08b48,0x3c09e830,0x3bf78303,0x3bea93dc,0x3bec9c75,0x3be2e182,0x3a535fbb,0xba4b81bf,0xbac1f853,0xba32e564,0xbad0620f,0xba3b1d6d,0x385edd43,0x3a623ad5,0xb9854eeb, +0xb9936b83,0xbab89dc7,0xba9156d1,0xbb21e8c5,0xbb1dba80,0xbb2eefbf,0xbb234ff7,0xbb3d755c,0xbb267f73,0xbb17e6e8,0xbaa3e984,0xba4a2d42,0xba893b1b,0xba833f00,0xba31511c,0xb95f7d56,0x3965cea0,0x3a46f570,0x3aaa3826,0x3aed0f40,0x3b04e02c,0x3b012a01,0x3b21b68e,0x3b0e395b,0x3b116c26, +0x3b0dfc77,0x3a9de658,0xbaec3cf9,0xbb082bb2,0xbb98d1bb,0xbb2b6751,0xbb6519df,0xbb74c0c3,0xbb5945f4,0xbb6f905e,0xbb3b0954,0xbb21ae3f,0xbb32749b,0xbaf1b419,0xbad094a1,0xbac31e2c,0xbb076ec6,0xbafd66f7,0xbaa54f3c,0xbab65381,0xbb19ba0d,0xbacae2fe,0xbaf0c525,0xbac8c9e4,0xbab463cc, +0xba9d9d3c,0xba8ce38c,0xba7800d2,0xba34b270,0xb9c24a5f,0x378aaed8,0x39efe3c8,0x3a80c4d2,0x3abdd000,0x3a420d45,0xb82b83db,0xba43e780,0xbaa9af4b,0xba8b92e0,0xba72ba31,0xbaeb17b8,0xbb53e6ee,0xbba6e806,0xba9fd964,0xbb49d23a,0xbba69e0f,0xbba6013d,0xbba78bae,0xbba2d59d,0xbba9c703, +0xbbab877d,0xbba98e9a,0xbb28cf08,0xba67e2e8,0xbb9e4c90,0xbb2aa985,0xbaa8f238,0xba624ad3,0xba722000,0xba40f784,0xba3360b5,0xba1b9539,0xba059921,0xb9e795f6,0xb998cd2c,0xb945f3d7,0xb8f173ba,0xb84cd7f7,0xb7e44a81,0x3939dfeb,0xb922bcdc,0xb995e4ac,0xb9f99e0d,0xba2f60e7,0xb9e315be, +0xbae3d313,0xbaa5ee3b,0xbb3ec1b7,0x3a19a354,0x3b5b5644,0x3bb79cf7,0xba5447ee,0x3b1fa1da,0x3ba30d1d,0x3b95ab9d,0x3b917403,0x3b82fa9a,0x3ba08b37,0x3ba736a7,0x3ba17ba1,0x3b44b21c,0x38b8639c,0x3bb7b3cd,0x3b480011,0x3a239e11,0xbb3d9800,0xbaddd1d9,0xbaf898e2,0xbae366aa,0xbacb7819, +0xbabadf6a,0xba9c45f0,0xbac00438,0xbacec8e2,0xbaf7d58b,0xbad356ae,0xbae1ec4b,0xbb11d508,0xbafe3c76,0xbadf24ed,0xba86ba4e,0xbab7b9cf,0xba636028,0xbafa40cc,0x3b784868,0xbaad3830,0x3afddff4,0x39807acf,0xbab4336e,0xb7b84d60,0xbb2a4fe7,0xbb27bc5c,0xba8c64e6,0xbaaf9dc0,0xba53f8f1, +0xba0e0873,0x3ab3b769,0x3a8ce7de,0x3a57bbd8,0xba15b5a8,0x3b2238b5,0xbb2c5d31,0xbb402061,0xbb1735a8,0xbaf864b0,0xba9529f3,0xba4232ef,0xb9d4e847,0xbaa65b8b,0xbaf0352e,0xbb291238,0xbaef08b6,0xbaed0ee7,0xbb2d18f4,0xbaf042e5,0xba94bd51,0x39e6ca26,0xb94fe0e0,0xba91c757,0xbb0bce54, +0x3947e89c,0xba09b7f8,0x3b50b371,0xba02185d,0xbaaaa89c,0x3792e14a,0xbb1ce055,0xbb8244fa,0xbb1aa3e8,0xbb21d61b,0x3a374e1e,0xba5752c1,0x3b0533be,0x3ab14116,0x3ad9d5b8,0x38d1e8c8,0xb8d64f64,0xbb1277f3,0xbb7b78b6,0xbb301769,0xbb1325a7,0xba689fb7,0xb95d0a4e,0x3a5b7988,0xba534445, +0xbaa44f4e,0xbb2e0e62,0xbaba754d,0xbaf90960,0xbb8c0f26,0xbb1636ce,0xba8847e0,0x3abc82fa,0x39d17e39,0x3a6c1e0e,0xb9dfc86d,0x3a300abb,0xb9a16601,0x3b80eb67,0xbad497ae,0xbb2f050a,0x3a178972,0xbb1c560b,0xbb2c4a21,0xbb60aead,0x39ac9ae0,0x3ab7783f,0x3a5fb9e7,0x3b204e93,0x3b23a1a3, +0x3b5fe2ac,0xbaa193a5,0xbacff860,0xbb93676c,0xbbc09d88,0xbb729061,0xbb100271,0x3a2c2591,0x3b223ba0,0x3b4f3850,0xb8bed1e2,0xbb21c953,0xbb8ef0f2,0xbb0d8a47,0xbae184c7,0xbb81d8fc,0xb9b41574,0x3b01e14c,0x3bb1aa0f,0x3b83eb9e,0xbc2770cb,0xbb8b93c6,0xbb5cf617,0xbb515e8a,0x3aaa6bfc, +0x3b2d3a9c,0x3aed90ad,0xb70fa89f,0xba847b22,0xb9d6ae62,0xb9b55ddc,0x39e52b89,0x3a08aafb,0x3b01f231,0xbadf0f1f,0xbb259399,0x3ab30ae3,0x3b01938e,0x3bbf2c48,0x3bb94cf5,0x3a6960b4,0xb7e5f1ad,0xbb612723,0xbbab42df,0xbbddde8d,0xbbc11e7f,0xbad00645,0x3b3257bb,0x3b6fe82a,0x3a6d5588, +0xbb3b0c59,0xbbb77e21,0xbbfcc499,0xbbfc47e0,0xbbd68441,0xbc020dd9,0xba1e14e2,0x3b5b93ee,0x3c125c93,0x3b8eaae2,0xbbaffdc6,0xbc02d65d,0xbbdad54b,0xbb1159ba,0xb703f2f8,0x391ff471,0xba6f6741,0xbaf2b0e9,0xbb03cf79,0xba0f278e,0xbac708fb,0xba63105e,0xba7a514e,0x3aa45921,0x3b3e98ad, +0x3a53309f,0xbb3623ea,0xbb5e7a48,0xbb820158,0xbb1c0226,0x3a959292,0x3bcf0190,0x3b0fcb42,0xbb2f1758,0xbc097ed3,0xbb777810,0x3acb8691,0x3ba90400,0x3c065f28,0x3b97a52a,0xbbc139ae,0xbb3cac26,0xbbdceb44,0xbccc79cd,0xbc81bd62,0xbc1ef045,0xbb1f1928,0x39cd9576,0x3a59e979,0x3877c6d0, +0xbabebb72,0xbab3a6dd,0x3969bc62,0x3a6e95e8,0x3956948f,0xbaf7df88,0xba981b38,0xbaa1a912,0x3a4d5ca9,0x3918bbde,0x3a3df6ad,0xb89743cf,0xba1c0586,0x398bc9fc,0xba2e0ceb,0xbb77f5f8,0xbbe3b462,0xbc043f35,0xbc0faf82,0xbbc0cdc6,0xbac2f079,0xba19f36b,0xbbcc7cd3,0xbc7fea82,0xbc3dff30, +0xbc083372,0xbbf74e7d,0x3835b5d3,0x3b8e9482,0x3c60b60d,0x3c504346,0x3bf140e7,0x3b36f546,0x3ad76d42,0x3b085d3f,0x3a4e329c,0x3898db49,0x393acb86,0xb99c49c0,0xba4c655d,0xb9dc8cf8,0x39efe259,0x392adaf8,0x3997ad93,0xb8ce23a5,0xbaa45290,0xba6a12ac,0xbb033ee8,0xbb4e2739,0xbb310525, +0xbacc0ecd,0xba3126a9,0x3a6dc836,0x3b05cb2d,0x3ab55e7b,0xba22d437,0xbb6da32a,0xbb570f7f,0xbb3a4988,0xbb88ff0a,0xbbcb7e55,0xbc00263c,0xbbffed3c,0xbaf8bc97,0xbc1d596a,0xbb73db69,0xba196855,0xbab68e6c,0xba181104,0xb99e42ba,0xb9eb32ba,0x3ab204c7,0x3a79523e,0xb9a4f362,0xba0b18c7, +0xba424c5a,0xba247311,0xb9508ed6,0xba9b8333,0xbb071848,0xbb803d7d,0xbb7b19a3,0xbb443cb8,0xbb8c29c5,0xbb5c5b4d,0xbad2b37f,0xba404ea6,0x3a2b69ab,0x3ae71757,0x3b3b4353,0x3b450f9a,0x3b5ba456,0x3b34e79b,0x3b17eaaa,0x39a901a4,0xbb3627cf,0xbb7cdb09,0xbbac2735,0xbc02bc40,0xbc09e1a9, +0x3a994c43,0x3b5af19e,0x3bcdfb52,0x3b8ea19d,0x3b902254,0x3b61c0ec,0x3b1c05a9,0x3b212873,0x3b123b2a,0x3b28b904,0x3b1088a0,0x3b0e4a2b,0x3a5b7694,0xba6bfdba,0xbaed0e8d,0xbafc3442,0xbad48754,0xba88ccb3,0xba88a572,0xba4a0977,0xbad90386,0xbb0db5b1,0xbb1530b3,0xbaaf103d,0xba7cb182, +0xba850a8f,0xb937f980,0x3a0aba71,0x3ab5577d,0x3ad1da6f,0x3ae0e584,0x3a6e032b,0x3a9b9e80,0x3aa5135d,0x3abe3d78,0x3add34ca,0xbb09ed78,0xbae8f28e,0xba222f49,0xba527686,0x37953e30,0x39a27434,0x3a89e5ca,0x3abbe59a,0x3a90674d,0x389218c0,0xb999957c,0xbacb9be3,0xbacf46b9,0xbb2218e4, +0xbb114386,0xbb2de37b,0xbb32a652,0xbb2776a4,0xbb080809,0xbb31a316,0xbb4ad8c1,0xbb1f143e,0xbb1b2fe1,0xbaef15d4,0xbaae066f,0xba353e57,0xba83062c,0xba9a3ca1,0xbaa3fa9e,0xbaf5ecf9,0xbb124392,0xbb209956,0xbb0258e5,0xbad2431b,0xbab5d1d1,0xbab872ad,0xbb7f3e55,0xbb838de3,0xbaf4dfe2, +0xbb7ff2e6,0xbb5df2c3,0xbb62d417,0xbb8cd880,0xbb8e21a7,0xbb95eb9b,0xbb8a07bd,0xbb55d0ce,0xbb6755f7,0xbb607ffc,0xbb483ade,0xbb1f62fd,0xbb251e97,0xbb3d9ede,0xbb386c62,0xbad6f116,0xbb3cc7b9,0xbb1eea9a,0xbb1ac601,0xbb130ed1,0xbb055388,0xbafb392f,0xbad971ba,0xbb1414cc,0xbb31170f, +0xbb4bdce6,0xbb5b6d22,0xbb6a8cad,0xbb812b81,0xbb818053,0xbb846dee,0xbb85a2c7,0xbb834247,0xbb5a77df,0xbb78d993,0xbb173c8e,0xba853223,0x375ff3f3,0xbb410327,0xba98601f,0xb90dee97,0x39379493,0x39a0a509,0x397633e3,0x3a1bff7a,0x3a5e9c08,0x3a80ceae,0xba472d04,0xbb26efb5,0x3a43fd22, +0xba503688,0xbb0daf55,0xbb5e476e,0xbb3ebb30,0xbb3dfaef,0xbb34415f,0xbb2ff0b2,0xbb2bb00c,0xbb219157,0xbb2e31cd,0xbb35b1f2,0xbb40c5cb,0xbb4dd360,0xbb5b0665,0xbb69a975,0xbb62d44a,0xbb5f9bed,0xbb5d8f9c,0xbb5f2151,0xbb5d30f1,0x3afdf8ab,0x3ae8a335,0x3b36cc48,0xbaa162fc,0xbb547a27, +0xbb37a086,0xb8f3e490,0xbb41fc9c,0xbb63ae1d,0xbb8b0bc9,0xbb8c7b2c,0xbb716351,0xbb786790,0xbb6cdbfd,0xbb60dcbe,0xbb2ce4b0,0xb916b6bc,0xbb46ce19,0xbb3c19f8,0xbaab9935,0x3b201b4d,0x3acac35c,0x3af8e969,0x3b0da680,0x3b183019,0x3b1c752f,0x3b1d5507,0x3b0fe0cc,0x3b0ca4f9,0x3b02f4e0, +0x3b128a3f,0x3b0c5304,0x3ae606ce,0x3ae87ab9,0x3aeabdca,0x3b00f51a,0x3b02dabd,0x3b34eb45,0x3af93c25,0xbb5e4258,0x3a846178,0x39c66a27,0xba933e9c,0xb9f1284f,0x3912685e,0xb9be5584,0xba947ea0,0xbafbd843,0xb9b701c8,0x39cfeb36,0x38247da2,0x3956c1b5,0x3a5648d8,0x3a21d263,0x39b94aac, +0xbb553538,0x3a1ebfd5,0x3ad3f547,0x3afd63a0,0x3b4fd1aa,0x3b815d5b,0x3b8d5bcb,0x3b83546e,0x3b4fca4b,0x3b290c90,0x3b0b3a34,0x3b3840da,0x3b326273,0x3af674a8,0x3afb5e72,0x3b075ac0,0x3b31de6e,0x3b2a7ab7,0x3b5e3d17,0x3a9de15f,0xbaec29e6,0xba01e4eb,0x3ab476fe,0xba9e2411,0xbaf98db8, +0xb72ec0ff,0xbb7878ff,0xbb440381,0xbb75febf,0xb9e939d4,0xba83322d,0xb8a3bf3d,0x39bf1089,0x3abdd4f6,0x3ad0c559,0x3794e335,0xbaf2b10c,0xba21eeb8,0x3af0acce,0x3b04ce1b,0x3b79becf,0x3ba34f81,0x3bb349be,0x3ba7aa40,0x3b824bf2,0x3b74d0d8,0x3b55cd6a,0x3b8a252c,0x3b70e4c3,0x3ae7d0a7, +0x3af174e7,0x3b0f8c65,0x3b60433c,0x3b405ac0,0x3bab3f18,0x3ac60350,0xbada8da5,0x39ce097a,0x3b861f69,0xbad7d60f,0xbb25313b,0x39d70deb,0xbb214308,0xbb539865,0xbb3fbc92,0xb97391c6,0x3ac23ebf,0x3ae58e2d,0x3b4aca87,0x3b8786e5,0x3b290c4b,0x3a5ca308,0xbb5d1f8c,0xbb2188fc,0x3a262dbd, +0x3af49ebd,0x3bba0e96,0x3c0a56c7,0x3c22c6c6,0x3c0bf2f5,0x3bb0ef26,0x3b520f65,0x3b2c00d5,0x3b8a8f48,0x3b83b1f8,0x3b02a007,0x3b209686,0x3b58d297,0x3bb9f9ec,0x3b96cd7c,0xb956860e,0xbb330be9,0xbbfa118d,0xbbb09450,0xbabd8d29,0x3a869b15,0x3b104bcf,0x3a576521,0xb9fc048d,0xb9a32351, +0xba0bb6ce,0xb8aa2303,0x397ea174,0x3b03c3d4,0xbb0967ec,0xbb12850e,0x38504bc0,0x3b51fb4a,0x3b51aa8f,0x3bac1247,0x3bea3ffc,0x3b93834d,0x3b5bf95b,0xbaede233,0xbb30778a,0xba5bc1fb,0x3be5beb8,0x3c4a7d53,0x3c447b48,0x3c1ebd31,0x3bb8346e,0x3ab5f09c,0xba3739a3,0xba3dc2b7,0x392bfe00, +0xba81aeba,0x3b95f1ba,0x3bbf4674,0x3c018b9b,0x3bbb34d2,0xbb46bba0,0xbbf8c25d,0xbbd58ce0,0xbb31d714,0xb951dd4f,0x390f7043,0xba20e58e,0xbab22593,0xbaefcdb7,0xb9c31e72,0xba16bd00,0x38b89032,0xba82a11c,0x3accdb97,0x3a8e9c5c,0x3af07f8d,0x3accc7f1,0x39e71034,0x3b46e36a,0x3b5048bb, +0x3b9a4305,0x3bcb08ff,0x39f0051d,0xbb887879,0xbc016a8d,0xbb1a6bd2,0x3b14fecf,0x3b6c3277,0x3bc4ac7c,0x3b305cd5,0xbbde04a4,0xbaf00b78,0xbb8a5e5b,0xbcbe0382,0xbc9cb155,0xbc3b8d99,0xbb2ae61d,0xb9892450,0xba35da84,0x3a5d87b3,0xba8cc4cb,0xba64660a,0x394923cc,0x3a8496f1,0x3a038131, +0xbae90def,0xba9be5a6,0xba1d9a2f,0xb94dc12b,0x3aabd563,0x3a127ddc,0x3acd2ba4,0x3b363623,0x3a6cecee,0x395f980b,0x39d6837d,0x39f8a139,0x3a8514e8,0x3ad44b3c,0x3b8c965b,0x3be8c8f1,0x3bf6f001,0x3b571a43,0xbb8f4e1e,0xba68858b,0x39ec2eaf,0xba2eb14c,0x3b60a93a,0x3bb96bd4,0x3c31bb18, +0x3c4baf8f,0x3c1577cd,0x3b39fcf2,0x3b3be0af,0x3b3f085c,0x3ad690d0,0x393e5618,0x390a127f,0xb98c4ece,0xba267d2c,0xb996070d,0x39d9df91,0x39d56bf2,0x39bdaba4,0x3a1a94e2,0xb8bde7aa,0xbb057182,0xba6a44ca,0x3a29e618,0x3ab32c18,0x3b5473c6,0x3b2dea04,0x3b38721c,0x3b136a2d,0x3a9a2818, +0xbab62bb8,0xbb9e0fdf,0xbb86b137,0xbb19bb81,0x3953e12e,0xba952763,0xba2bbbef,0x3b201c0d,0x3aa1b582,0xbae51ae7,0xbb926748,0xbbe85f68,0xbb652732,0xbacd15f6,0xbacc63ab,0xba54c627,0x3a912df6,0xb800bda6,0xb99a9734,0xba71edb5,0xba2b921d,0xba110219,0xb9ab70d2,0xba7f5aeb,0xbaeb74d5, +0xbb5dd2a5,0xbb741269,0xbba10125,0xbb6273d0,0xbb3a9277,0xbb137b3b,0xb96cbc13,0x3a36fa24,0x3b1608da,0x3b7ddf98,0x3b8e9a21,0x3ba37d4d,0x3ba5d8b6,0x3bacf0c0,0x3b82bbc5,0x3b3cc2ab,0x3acc85ac,0x395cd53f,0xba28dd80,0xbb09bbd1,0x3b65bab0,0x3b228d26,0x3aca171a,0x3b0df48b,0x3b03e283, +0x3b075bcd,0x3b10ec34,0x3aefba99,0x3b1be7f1,0x3b30ae5c,0x3b384504,0x3b201e53,0x3abed493,0xb92a7ea0,0xba975c29,0xbae1ee0b,0xbae32c82,0xbaa66f9f,0xba4c949b,0xba36563f,0xb7d572ca,0x391649bd,0xb86d852a,0x39eb0003,0x3a2a4457,0x3a487e5e,0x3af9ffb1,0x3b2b2bf9,0x3b484d3d,0x3b806848, +0x3bb75cd9,0x3bfa31d7,0x3be0c0b4,0x3bba03cb,0x3b98eb35,0x3b56dc22,0x3acac3e4,0x387ecb3d,0xba8c9654,0x38f372cc,0xb970c4e8,0x3a3db3a6,0x3acd4d8e,0x3b22bc4e,0x3a9933be,0x3a8c8cf2,0xba1f70ae,0xb982dd2d,0xbaf76feb,0xbb0069fc,0xbb1ca050,0xbb161ef1,0xbb3b30e9,0xbb2f5fd3,0xbb40185f, +0xbaeaa804,0xba87f359,0xbaba31d4,0xbaad89ee,0xba606f64,0xb9942ab7,0x3961a993,0x3a0ae93e,0x3a5d4777,0x3a9e3077,0x3a8a4d3a,0x3a5afdb5,0x3a84d3aa,0x3a50d46e,0x3a793fa3,0x3ab2defb,0x3a9a5e1c,0xbb27d50d,0xbb369f03,0xbb9a1f3c,0xbb38e136,0xbb7c7f98,0xbb7b54c7,0xbb5ef7a3,0xbb72ebb4, +0xbb45655b,0xbb47f34e,0xbb6b32dd,0xbb384fd5,0xbb1d5dd8,0xbb2787de,0xbb3c99e9,0xbb229b5b,0xbb10989f,0xbaf8272e,0xbb3aa169,0xbad0edc2,0xbada62e3,0xbacd08c0,0xbabbd3b9,0xbab42dca,0xbab0b104,0xbaa6994d,0xba9d02a6,0xba96c797,0xba92c4aa,0xba8671b8,0xba658c41,0xba55ef2a,0xba850002, +0xbabd43c0,0xbafd6c9a,0xbb1d1e52,0xbac355eb,0xba9f11d9,0xbb492cd4,0xbb88384c,0xbb8da4a4,0xbb1bc6b7,0xbb802527,0xbb958082,0xbb975905,0xbb97c056,0xbb8da166,0xbb977a67,0xbb995627,0xbb950188,0xbb803b3c,0xbb1cbceb,0xbb8debac,0xbb787599,0xbb2d9ba5,0xba89eb2b,0xbaab9262,0xba92f83d, +0xba895a32,0xba7d648f,0xba66a6cd,0xba51016f,0xba53a002,0xba56740e,0xba5de48f,0xba68df95,0xba7e8650,0xba85a8ae,0xba99bbe9,0xba9f3595,0xbaa06d19,0xbaa6d83f,0xba973c24,0x39d8f6a6,0x3a081839,0xba10428f,0x3b3dae5f,0x3b7c217b,0x3b2f273d,0x3b00426b,0x3b588a43,0x3b39a43e,0x3b18a4bf, +0x3b0d01f3,0x3ad8e6d6,0x3b17151e,0x3b1db49d,0x3b09285c,0x3b749dea,0x3b2c9ade,0x3b21923a,0x3b6d0ffa,0x3b3b9d02,0xba15ead2,0x3987090c,0x39b5dab1,0x3a1dd08a,0x3a426419,0x3a5abbc4,0x3a73b603,0x3a3cc2b1,0x3a25a750,0x39df57a7,0x3a2f50c5,0x3a23a195,0x39888311,0x3a1da4e9,0x3a3afa90, +0x3a6983c8,0x3a281b85,0x3a4454a9,0x3a3f5b89,0x3b55800e,0x3a2769fb,0x3b416b55,0x3a7c3fb7,0xb86317ea,0x3a6db17b,0xba9229ed,0xba452234,0x3a252552,0x39faeec2,0x3a118977,0x3a860511,0x3b06db10,0x3b03da1c,0x3b2aac03,0x3a8c559b,0x3b15f18c,0x38ca23dd,0xb9a0ea10,0x3a57804c,0x3ac8ba1f, +0x3b0be947,0x3b1444b8,0x3b070f4b,0x3aaa2a87,0x3a5c86a1,0x39fea599,0x3a9b4532,0x3ab6917e,0x3a57b962,0x3aee499c,0x3b06fa61,0x3b139969,0x3ae3a37e,0x3a18a433,0x3920c19d,0x3af5be99,0x3a5a53e4,0x3b5e8fdb,0x37cd8500,0xba53ee42,0x39ccb406,0xbb12bb10,0xbb7a756e,0xbaca8962,0xbb0b0e12, +0x39e7ed09,0xb978dae1,0x3b184c00,0x3b094489,0x3b1dd210,0x3aa33b79,0x3aab7258,0xb95a8ea2,0xba54527a,0x3a4ff467,0x3b0a5029,0x3b53c71a,0x3b6d9d8d,0x3b79a18f,0x3b24e8a2,0x3b0df8bf,0x3abc1319,0x3b1a9a94,0x3b158593,0x3a198353,0x3b3a5633,0x3b4ff416,0x3b510009,0x3b24a19e,0x3ace18d8, +0x3a8ae3ce,0x3ab94d8d,0x3a0a4983,0x3b83b40f,0xbad24dc7,0xbb593a8e,0xba09a327,0xbb7237a6,0xbb8469c9,0xbb84d7b7,0xba4dab1d,0x3a39dd30,0x3a341cef,0x3b2274c1,0x3b44396d,0x3b8d1dc0,0x399a716c,0xb90f6cb9,0xbb027e74,0xbadd62f0,0x3adb333c,0x3b97fd62,0x3be38e3d,0x3bffaaf4,0x3bd6806b, +0x3b661ad5,0x3abcbcf3,0x3a4ebf03,0x3b368e00,0x3b726fd7,0x3b230c0a,0x3bcbb493,0x3bdbe917,0x3bce96cb,0x3ba1d1c0,0xbb8b7cb8,0xba00d3bc,0xba436351,0xbace43b7,0x3a4b1bef,0x3b41ea58,0x3b537f6c,0x3b20c512,0x399baf32,0xb9a1b3bb,0xba4cfc1a,0xba454709,0xb9826881,0x3b274673,0xbb0a3d22, +0xbb4ff5f4,0x3850fd73,0x3ac58388,0x3baac23c,0x3bbefefe,0x3b00d8b9,0x397d1e57,0xbb6e861d,0xbb9e06ec,0xbbb481f3,0xbba94bdd,0x3b18844f,0x3bde15fd,0x3bb4c4db,0x3b899193,0x3a8d2a2a,0xbad6f505,0xbb20af3e,0xbb217cb8,0xbb1e934c,0xbb1c8e24,0xbafc3a28,0x3b693d37,0x3c338874,0x3be20957, +0xbaf9c998,0xbbe6ed23,0xbbf3330f,0xbb5952d0,0xba57967b,0x387a8279,0xba138641,0xba90e529,0xbae76fbd,0xba93f94e,0xba75ce45,0x39bab81d,0x3997ca9c,0x3b013dbc,0x3b4de382,0x3b3db8d9,0x39c25774,0x3a8c6f11,0x3b1a87b5,0x3b41f669,0x3b928e23,0x3bc43767,0x39b02a75,0xbb93cbab,0xbc12273b, +0xbb32a5ce,0x3b488624,0x3bb95e99,0x3bfe5724,0x3b6bdaf0,0xbbf705bf,0xbb7839b3,0xbb571821,0xbcb08c3c,0xbc9c1259,0xbc5a2196,0xb898aaa3,0xba9ee64a,0xba4f258c,0x3aa154dc,0xba29f039,0xba60dbc5,0x391bcaee,0x3a37597b,0x39814a04,0xbaecde3f,0xba6ed637,0xba8dd6c1,0x39b02c7f,0x3a751c7f, +0x3b170941,0x3ade5486,0x3802112a,0xb85a7ed2,0xbab33af8,0xbb2606cb,0xbb5a33ff,0xbb2b28a7,0xbb441041,0xba0c49f8,0x3b7f6b9b,0xb9c97159,0xbb85b54f,0xbb9921c5,0x3a234ccf,0x3b604a34,0x3b0176ab,0x3b90c92f,0x3b9b9f82,0x3c181be8,0x3c4e79ee,0x3c19c773,0x3b7876c9,0x3b35eba8,0x3b42cdd9, +0x3ad558c2,0x38b66de9,0xb7346558,0xb91408c9,0xba208687,0xb9b2d856,0x39cc8509,0x39b98202,0x3a726742,0x3a9cde40,0x38d55015,0x38ccf81e,0xba3fc334,0xba6c0b8f,0x3a082d25,0x3b160c81,0x3b1f1f9a,0x3b3d0638,0x3b2a202b,0x3b2315b3,0x3a4275d8,0xbac73d0a,0xba3e6417,0xb91fa3ae,0xbabe87f1, +0xb9a9673a,0x3a8a3f30,0x3b93b03b,0x3b6c2981,0x3a86aea8,0x3ab5d644,0xba7f6b57,0xbab558dc,0xba2ed0f3,0xb9a7b490,0xb9c0e8ff,0x3acb54a5,0x3a386115,0xba1fb6a6,0xba585abe,0xba5d61e2,0xba3234b6,0xb9c5d547,0xba387013,0xbac2f05c,0xbb6b7456,0xbb5225b8,0xbb2ad210,0xbb60a1d7,0xbb5aa364, +0xbb0ec67c,0xba7ef898,0x3a572392,0x3b3084cd,0x3b96e21e,0x3bb02a96,0x3bd11825,0x3bddbf6b,0x3baf756e,0x3b6a5902,0x3b042865,0x3b03170b,0x3ad509fa,0x3984287d,0x3ab8f93f,0x3adcbdc3,0x3b79a6f6,0x3b8a4961,0x3b6a67c6,0x3b53b6cc,0x3b2d27ad,0x3ad39808,0x3ad52d0b,0x3ac66fb5,0x3b0102d8, +0x3af9d392,0x3b1e4ad6,0x3acc5cc1,0x38404849,0xba7a3210,0xba9c3a92,0xba993f39,0xba7ef1f9,0xba897a0c,0xba44757d,0xba88da4b,0xba71892a,0xba7836fe,0x3a214fec,0x3ab1c5f3,0x3ad739f1,0x3b1ff572,0x3b2540d6,0x3b2b0013,0x3b51cd15,0x3b8b45af,0x3bad9265,0x3b863cf4,0x3b5b4e97,0x3b308659, +0x3b15b1d4,0x3a67b485,0x3a87731c,0x3b03dd86,0x3b0940b8,0x3b297d57,0x3b35a2c4,0x3b4e302b,0x3b6306b8,0x3b3627b5,0x3ae2d9aa,0x3a9e6e0a,0xb946171b,0xba642063,0xbadcffcc,0xbada4182,0xbb01f7bc,0xbb12171d,0xbafae3f2,0xbaa24151,0xbad1e872,0xbb119167,0xbafb68c1,0xbb100b90,0xbad21fe6, +0xba90a964,0xba0b159f,0xb7befae5,0x3a3b9816,0x3ac56421,0x3a91f44d,0x3a350ad9,0x3a045a2a,0x39edee59,0x3a23a3a8,0x3a448f8f,0x3a9b0552,0xbb3db5fc,0xbb308ca2,0xbb13b167,0xbb35ea5d,0xbb23d31e,0xbb2bbf24,0xbb3fcc86,0xbb4293b0,0xbb478a9a,0xbb2cec03,0xbb017dc5,0xbb050bb1,0xbb0ddc82, +0xbaf9e235,0xbae233a2,0xbb020294,0xbafc9b57,0xbb13a253,0xbada9810,0xbb318f0e,0xbb2984c4,0xbb1a8e11,0xbb147fcc,0xbb0a91dd,0xbb071d21,0xbaffb751,0xbb1cc8c7,0xbb336506,0xbb3db308,0xbb3b79f6,0xbb2d317e,0xbb24e798,0xbb21c55f,0xbb251ed4,0xbb2f6ab2,0xbb35c181,0xbb0f47db,0xbb1f431a, +0xba6c621b,0xb9eec22e,0xbaa3b419,0xba9242f9,0xb9a9c233,0xba60802a,0xba460e22,0xba47a877,0xba81dd46,0xba5649a4,0xba3b2b61,0xba4408a6,0xb943f8e5,0xba92b100,0xba517c0a,0xb9bb0940,0xba892000,0xbb324677,0xbb14f170,0xbb13d09e,0xbb0e2cfb,0xbb0afa70,0xbb07c4f5,0xbb00d4f0,0xbb02fd3a, +0xbb025e0b,0xbb06d0e1,0xbb0af26f,0xbb12637c,0xbb178aa0,0xbb17a01a,0xbb15a8f9,0xbb124112,0xbb0ed5f6,0xbb1182f1,0xb98ce97c,0xb80b0c4b,0x380c2639,0xbb1647f3,0xbb0402c1,0x3a9c2078,0xbb0c441f,0xbb12f612,0xb7da4a06,0xba1723db,0xba1f427f,0xb87c3f80,0x37741662,0x3971f73c,0x3a020c4e, +0xbaf576ec,0xbaf504e7,0x3aa85f8b,0xbae7a234,0xbb138d0b,0xb97f62e8,0xb9c2498f,0xb9a95729,0xb7eafeed,0x385d450e,0x389a4d5a,0xb750af14,0xb8d22a91,0xb9139140,0xb9706dd0,0xb96d30b6,0xb9bbcd09,0xba2958f5,0xba18e977,0xb9d5d2ca,0x396d36e7,0xb8142c9e,0x3a31f692,0xba4b4632,0xbabdaf66, +0xba7f3cf3,0xb9bf1a7e,0xbab7ccf8,0xbae16dca,0xba82b301,0xbb0b5b61,0xbb392e39,0xbb31ac73,0xbb0a5e0e,0xba980a6c,0xbab0251d,0xb90d2302,0x3980b258,0xb9dcf152,0xb9f2fc08,0xba95bdcd,0xbac384e5,0xba26a864,0xba0c6f7b,0x3a081f39,0x3a8abe8a,0x3aa54c1d,0x3a3c98f2,0x397ae847,0xb982ca68, +0xba149e58,0xb9dcf9c4,0xba207a62,0xba94163b,0xba7b04f3,0xb9bc5cc2,0x3aa590ef,0x3a1cdc26,0x3aab9282,0xba5be6e5,0xbb1ec9e5,0xbacfa048,0x3a70bf50,0xbad87a58,0xbb0fd50b,0xba675436,0xbb8357c4,0xbb780e38,0xbb736038,0xbb00e9bb,0xbaba6922,0xbaad5012,0x38a193f5,0x39f359f6,0x3a6851e0, +0xb9abd7b3,0xbaec5ba2,0xbafd9b72,0xba7959dd,0xba43dd2d,0x3a3bad00,0x3ac1aa7f,0x3adffd53,0x3a6c4123,0x3a0b7421,0x398e202c,0xb66af407,0xb99f511e,0xba8f4422,0xbb0feba3,0xbaf0ca71,0xba00b019,0x3b271d53,0x3a9d88ef,0x3b3c833a,0xb986148f,0xbb17b226,0xbaa8bd5e,0x3b341efb,0xbb2a2c57, +0xbb683169,0xba3ab154,0xbb813af3,0xbb973f99,0xbb54a597,0xba954556,0x398ecbb1,0x3a8a15c6,0x3b18f165,0x3b52e248,0x3b412685,0x3a5136ec,0xbafc6015,0xbb3440ee,0xbae2372f,0xba63e5a4,0x3b07527e,0x3b802a58,0x3b979123,0x3b2bbc79,0x3a47e0e3,0xba645a14,0xba7c49d8,0xba9a344b,0xbad44f98, +0xbb1d0f8e,0xbab7d2cd,0x3a736564,0x3bb7fc54,0x3b5a3c71,0xbb385e7b,0xbb78e334,0xbbc815d4,0xbb9245a3,0xba896c63,0x3ad5e4ee,0x3b3d47ae,0x3b32ac81,0x39b00496,0xba3f6b47,0xba8cc72e,0xbaa06fba,0xba067bba,0x3b1c9ae0,0xbb2e2612,0xbb6b1b2e,0xbae5e659,0xb83317fb,0x3a52d4db,0x3aa51c83, +0x3a2535ac,0xb999089f,0xbaab1601,0xbb80a3e8,0xbb6cea8e,0xbae4ab8a,0x3bc56c5c,0x3c1e5ead,0x3bcdf754,0x3b8cfe9a,0xba2c2bf6,0xbbd400b8,0xbbc61c61,0xbba1a667,0xbb5e3adb,0xbb48c2d6,0x3a86c853,0x3b345d59,0x3bddef8c,0x3bb5a984,0xbb1ecd96,0xbc00c549,0xbbfccca7,0xbb8339f0,0xba890c49, +0x37083c1f,0xb9e10ea3,0xba43ae6e,0xbad8d643,0xba9ce211,0xba3d7cbe,0x397bd517,0xba23d71a,0x3ae2af74,0x3b052631,0x3b045eb6,0xba41b834,0xbb0e4d46,0xba9ae90f,0x3ab39e98,0x3b590c0e,0x3b522b05,0xbae66c7b,0xbbbf720e,0xbc11dc5e,0xbb36bd67,0x3aef01f5,0x3b351947,0x3b1e3287,0xba8ce5fc, +0xbc01c373,0xbb81f9e2,0xbb6f0770,0xbca732f3,0xbca60be3,0xbc611fdf,0x383468bd,0xbb0156a2,0xbb1bce6e,0x3a8b8d36,0xba37fbe8,0xba26f492,0x385596c2,0x39fe2b35,0x3950722f,0xbada5712,0xbab4d742,0xbacade62,0xba871cfe,0x39827db7,0x375f06d3,0x3a2749ca,0x3a96c562,0xb984c6ba,0xbacbab5b, +0xbb6f8f8f,0xbbadd5b8,0xbbb70cce,0xbba60689,0xba5f99c8,0x3bbd1547,0xb9f107fc,0xbbe6585f,0xbc3c806e,0xbc0850e6,0xbbabe59f,0xbba259df,0x3ac7cef8,0xbac58439,0x3bb6c1da,0x3c360756,0x3c13f5a5,0x3b8d991e,0x3b29a0e7,0x3b4c2916,0x3b05d4bd,0x390f8173,0x3703f3b6,0xb8974801,0xba15b050, +0xb9b45c72,0xb8f75605,0x391d9cd4,0x3a1d5648,0x3a89e9b6,0x39e3c86a,0xba507935,0xba21270f,0xba0585ee,0xb9fe6cc1,0x3a70241d,0x396da847,0x39dbb202,0x38beb798,0xba4c7fc9,0xbb449b40,0xbbaf6793,0xbb892f5b,0xbb40c540,0xbafcbcf7,0xbbdd6555,0xbc05755d,0xbbcbd6ec,0xbbb6c583,0xbbc57082, +0xbb9ff4d9,0xbb845f95,0xbb671a95,0xbb20d09a,0xbab801c6,0xba57a212,0x39e41e7f,0xba032be2,0xba92a079,0xbac81322,0xba885fdb,0xba4f0635,0xba52f022,0xba32451a,0xbab36e0a,0xbb524fc0,0xbb82a2b9,0xbb9e61d1,0xbb856896,0xbb65727a,0xbb2e43f7,0xba8580c5,0x3822dd37,0x3a751e99,0x3a8ed793, +0x3ac38054,0x3ad78f91,0x3a413cb9,0x3a804159,0xba6782ba,0xbb3232f4,0xbba0e024,0xbbca1b93,0xbbd47692,0xbbd9336e,0xbacc4603,0xba9fbc30,0x3a6d1046,0x3a04a8aa,0x3a8183fe,0x3a1a819b,0x3a411166,0x3a24e2e3,0x3a7e79fe,0x3ac76a0c,0x3af0bc98,0x3b0ae107,0x3ac8a96d,0x39aecc88,0xba653fe6, +0xbae3eedf,0xbb10dd49,0xbac99927,0xba89a08f,0xba27a091,0xba2264a3,0xba535791,0xba921b7f,0xba1d9b64,0xb6ab6f31,0x3a298f16,0x3b10386f,0x3b5e18ec,0x3b92d20d,0x3b99fc13,0x3ba482fc,0x3b9b150d,0x3b8ec356,0x3b3f23af,0x3a8d2f4e,0xba49ed8d,0x3ae1beb3,0x3a8a5b16,0x39c66011,0x3a947d19, +0x3acc3070,0x3b0ee029,0x3b3a0ce8,0x3b66868f,0x3b292753,0x3b0f01ae,0x3a5a4872,0x3a0566ac,0xba451bf6,0xbaa56672,0xbada40b3,0xbaf84782,0xbb243f4e,0xbb2065b2,0xbb35422d,0xbb182788,0xbaf0841d,0xbafaf32e,0xbaea13a6,0xbaa7eba3,0xba4aa3c6,0xb99ea35c,0xb9178e73,0x3833f970,0x39be1c60, +0xb8cdf5a0,0xb9ca4d81,0xba13344c,0xb9fb2a35,0xb92f1bbe,0x3a1a6ef4,0x3a9376ec,0xbb47584a,0xbb4c187b,0xbb480840,0xbb2dc7d3,0xbb4ec19d,0xbb432e89,0xbb419fe3,0xbb4b2eda,0xbb44f094,0xbb5c1d9f,0xbb71898e,0xbb66a9d0,0xbb54f688,0xbb668b21,0xbb55a66b,0xbb39a7f5,0xbb461247,0xbb22f52c, +0xbb2f470d,0xbb007e92,0xbadbb6bf,0xbae18c7a,0xbad2e4a0,0xbad04ae4,0xbacf3e92,0xbac3f3d7,0xbae6d6b1,0xbb08788c,0xbb1ff218,0xbb32a0ef,0xbb4297de,0xbb5919e7,0xbb454817,0xbb425193,0xbb482698,0xbb53f847,0xbb11de2b,0xbb0911ed,0xbb5e9ff4,0xbb5d650e,0xbb038ca2,0xbb4a870d,0xbb5087a3, +0xbb152837,0xbb190616,0xbb17836e,0xbb09b049,0xbb1420d2,0xbb13da15,0xbb0d9779,0xbb6fa5d8,0xbb6181d5,0xbb0c6fc0,0xbb619d2e,0xbb5921c5,0xbafd1f9d,0xbb08fd44,0xbb0288c9,0xbaf8f3f5,0xbaf18010,0xbae91fbf,0xbadc3cd3,0xbaf24d44,0xbb0025ad,0xbb085cb2,0xbb10b7fd,0xbb1aa4d1,0xbb2af9f9, +0xbb2652a4,0xbb2365eb,0xbb1aed66,0xbb14f6ad,0xbb213858,0x3b1a10cf,0x3b0b566f,0x3b137c3a,0x3b3c733e,0x3ac72699,0xbab6c1aa,0x3b434c8c,0x3ac80cf4,0xba842063,0xbacfe5c8,0xbae3d286,0xbaf13726,0xbadefe33,0xbad926a6,0xbaf6ceb5,0x3ae8424e,0x3b515ec8,0xbae11759,0x3ac9bad0,0x3b34baf4, +0x3b06ad04,0x3b02c368,0x3b1b58e4,0x3b30307d,0x3b370e28,0x3b39ce8e,0x3b33efa5,0x3b2cec43,0x3b2a25ef,0x3b26d137,0x3b2dd02a,0x3b2c9a3a,0x3b1f0579,0x3b30fd04,0x3b30c7c3,0x3b25cc48,0x3b2078bb,0x3b1fe5d5,0x3b3cf6d0,0x39f52b6d,0x3b059505,0x3b172084,0x3a28d4e0,0x3a30d65b,0x3a80a0d3, +0x390e5426,0x39b5f00f,0x3a5e3458,0x3aabefcb,0x3aa6630f,0x3ac63dae,0x3adfd9cd,0x3b08b0e2,0x3b3b2c98,0x3b001976,0x39882e4f,0x3b107206,0x3b1448fb,0x3b5d3c22,0x3b914202,0x3ba174e0,0x3ba0272a,0x3b87e993,0x3b6c6330,0x3b546336,0x3b550198,0x3b6d62a1,0x3b79d415,0x3b62f410,0x3b8bf3a3, +0x3b896b93,0x3b690b85,0x3b5226f9,0x3b2f791a,0x3b113540,0x3aec0c8c,0x3aade9fd,0x3b154641,0xb74213d9,0xba4826c3,0x38e43474,0xbb2e4f05,0xbb5d54d7,0xbadf2cc5,0xbabb1d17,0xb9fa57fe,0xb905165f,0x3ad32b66,0x3b0bd72f,0x3b0e3e5b,0x3accae26,0x3a9a4d67,0x3a8cafa5,0x3b13defb,0x3b6b7471, +0x3bb94141,0x3bd57029,0x3bd9ea8b,0x3bbd014f,0x3ba900e5,0x3ba1feb3,0x3ba3f6c8,0x3ba8d75a,0x3ba8e91f,0x3b8b4c31,0x3bc31716,0x3bba7a38,0x3b916c22,0x3b8293b3,0x3b3e7c01,0x3b0e87fd,0x3a5d7892,0x3a6825cc,0x3b4c6134,0xbad6629c,0xbb664226,0xbac6369e,0xbb949241,0xbba4f2cf,0xbb6deb43, +0xbaeba7ed,0xb8c7cb8d,0x3a0a6607,0x3b1eee5a,0x3b610121,0x3b79f410,0x3aefff25,0x39b47b8a,0x39676b95,0x3b282899,0x3bbc4f23,0x3c21a535,0x3c3e8d06,0x3c402a31,0x3c1014d7,0x3bd6592c,0x3ba154f0,0x3bb296ac,0x3bcd8b7b,0x3be2b4a9,0x3bd6fa57,0x3c169f6c,0x3c0dc48f,0x3bd610c4,0x3ba43e2b, +0x3b42a436,0x3b030e5e,0xb8996be4,0xba1de531,0xb88c2e86,0x3b3a1e76,0x3b8d728c,0x3b904c94,0x3aa5dd1f,0xb9c7350e,0xba8c163c,0xbab370aa,0xba26ecbf,0x3b3221f8,0xbb1d3333,0xbb639c95,0xbadf4add,0x39bef73a,0x3b08946b,0x3b5aabe2,0x3b35bb27,0x3a2d26db,0xbb190cc6,0xbb76cd69,0xbb68b0ae, +0xbb5362fb,0x3bd1ee9e,0x3c2e0d7c,0x3bfe6179,0x3bf268a6,0x3b9bd79b,0x3ad9176c,0x3b01eff0,0x3b0667de,0x3a9cd75f,0x3b4a287b,0xba820684,0x3b65e3dc,0x3c22dfeb,0x3bf92b40,0x3a4dfb25,0xbbd4cd4d,0xbc0446f0,0xbb8b9df5,0xba9ac6bd,0x3955ae5f,0xb99ebdc8,0xb9fc29d6,0xbabf8ac3,0xbac5b349, +0xb921b8e0,0x3ab7f3d7,0x3a8995c9,0x3b138843,0x3b22d268,0x3b89e7db,0x3b60dfaa,0x3b92fc8b,0x3bee6f4d,0x3bf34f20,0x3bdeecee,0x3b88a388,0xbaeffeb8,0xbbc391bf,0xbc077e70,0xbaa0a7c4,0x3b815da6,0x3b992d71,0x3ba736ae,0x3a738c94,0xbc027487,0xbb7689d2,0xbb1bd2f1,0xbc8d24c3,0xbca23925, +0xbc699975,0x3a9efb8f,0xbb0f9fc2,0xbb1c9303,0x3aa07da5,0xb999c09b,0xb9bff453,0x384db5e1,0x39d87d1c,0x3956aa6f,0xbac2caf9,0xba7be89b,0xba8a92a4,0xba16e0ba,0x3a9895e7,0x3b18d9a7,0x3b0be12f,0x3a74521e,0xb9b0f770,0xbaf52c20,0xba889eb1,0x39ac87ef,0x3b110db4,0x3b3b28a9,0x3bac4e74, +0x3c1a7381,0x3aa870e0,0xbab36bdc,0x3b35274e,0x3c0547ca,0x3c31782a,0x3c1adea0,0x3ba89f46,0x3b8b97e0,0x3b595484,0x3c29f613,0x3c2718eb,0x3ba556cb,0x3b56004c,0x3b4966c2,0x3b24bf3e,0x39a179ed,0xb729f9ef,0x37ced0d1,0xb9c27b49,0xb994f06b,0xb6ff4b89,0x39e49279,0x3aa2b9ef,0x3b04cb40, +0x3aa6c8aa,0x39e6b5fa,0x39c9b4c9,0x3ad0e3d9,0x3b59ba5f,0x3bae1bf7,0x3b9cd044,0x3b801b52,0x3b11922c,0x3b1c1007,0x3a6d7259,0xba0083a7,0x3961673b,0x3a907aa0,0x3a85135b,0x3b8f9ad5,0x3bff1bb1,0x3c5becbe,0x3bde1d01,0x3c03594e,0x3b5a172c,0xbb390efb,0xbb096b31,0xbaa00728,0xba1a39cb, +0xb957ac02,0x3a9dc2cf,0x391b9517,0xba2dc616,0xba8bca4f,0xba623dac,0xba2395f4,0xb9e23b21,0xb997cab6,0xba80ad28,0xbb37a441,0xbb34a6a2,0xbb466042,0xbb2c5a75,0xbb40ed52,0xbb26e7ce,0xba89526d,0x3a435e97,0x3b42faa3,0x3bac2fdf,0x3bd0919f,0x3bf64a35,0x3c097872,0x3bdd8870,0x3bb220c0, +0x3bab45d7,0x3bb5ac6d,0x3bb416e9,0x3bb033d5,0x3beccd0b,0x3abca430,0x3b162096,0x3a28193d,0x3add2473,0x3ab7c538,0x3abab560,0x3a830a7b,0x3a50b214,0x3a85e44a,0x3ab26608,0x3ac45be3,0x3b0f283a,0x3af4e084,0x3a58fb52,0xb91747f2,0xba27b768,0xba86cc11,0xbaa2cde0,0xbaa38817,0xba85088c, +0xb993d15f,0x3a0cb168,0x3a216eb1,0x3b180834,0x3b53e426,0x3b749e1b,0x3b991eb4,0x3b986e28,0x3b910a30,0x3ba64f9f,0x3bd6e620,0x3c0fd120,0x3be08066,0x3baeae41,0x3b674215,0x3b06eb5a,0x3b81d9fe,0x3b62cfe9,0x3b61b664,0x3b7df67d,0x3b763056,0x3b82eccd,0x3b865a65,0x3b91820b,0x3b643be3, +0x3b3f9f44,0x3b0b3178,0x3aa790d1,0xb9096c74,0xba1d146c,0xba8920c4,0xbaa310be,0xbaf49194,0xbac6cd07,0xba8eaa83,0xba5096a3,0xba8bec53,0xbaa7418e,0xbad30314,0xba945814,0xba38c198,0xb9a1ccc0,0x3a5d3ae2,0x3b0c8244,0x3b645177,0x3b645cf3,0x3b54ed4e,0x3b575e36,0x3b3c4929,0x3b3f1a3c, +0x3b50f9e9,0x3b739360,0xbac79da8,0xbaa49b47,0xbb358969,0xbab2eabb,0xbada8624,0xbae6c18c,0xbab89fba,0xbac3619e,0xbab33116,0xbaa6736e,0xbab8a212,0xba9a0617,0xbab617dd,0xbac386e6,0xbae310cf,0xbaeb9d98,0xbaabe338,0xbad5f017,0xbb04423e,0xbb01761d,0xbb0bb408,0xbaf1226e,0xbae52dbf, +0xbadbfd2d,0xbad97e38,0xbadbf712,0xbae61af9,0xbaf12212,0xbae002fd,0xbac06f9c,0xba7f8e77,0xba049b36,0xba01d3b0,0xba1e3e19,0xba6c841c,0xbaa1b459,0xba62aedd,0xba434743,0xba04e144,0xba9e44ea,0xbb44477d,0xb8c8f0ae,0xba5ed6f2,0xbb1de1a3,0xbb296520,0xbb32bcc8,0xbb3f5f69,0xbb4aa697, +0xbb52280f,0xbb5d6d67,0xba9c3546,0xba1992a9,0xbb4dedea,0xbaa92ecd,0xba513149,0xbabfe936,0xbab0e92f,0xbaa87f40,0xbaa61c04,0xbaa159bb,0xba9cb5da,0xba9776b3,0xba889ae1,0xba74e141,0xba686533,0xba511092,0xba4d48dc,0xba368821,0xba5964f3,0xba5fba7a,0xba59a83c,0xba45ac60,0xba7a394b, +0xbac787f1,0xba8b856c,0xbb039bda,0xba896061,0x3a7f4270,0x3b8a9eb2,0xbaff48f8,0x399c8cb6,0x3b514134,0x3b3eeca8,0x3b39fe9e,0x3b40b04b,0x3b598bc0,0x3b6603c3,0x3b6b6a21,0x3a2e6b9e,0xbab6431c,0x3b920614,0x3a74d42b,0xba805daf,0xbb0d4a60,0xbabb37f3,0xbace7d5d,0xbaa9aedc,0xbaa3b0f5, +0xbaa2c326,0xbab2dd6b,0xbab42fef,0xbab95d4a,0xbabdd658,0xbad40f30,0xbae46db2,0xbafdcff3,0xbadfe274,0xbabe209b,0xba3b6f9c,0xba9a3a34,0xba564eda,0xbb040b08,0x3ad47dc2,0xbae07969,0x363aca5f,0xba370f7e,0xbaf796bd,0xbaab45af,0xbb3c9847,0xbb48d532,0xbb0060d2,0xbb175d15,0xbad664d6, +0xbacb97e3,0x39b544e8,0x39da4720,0xb9387802,0xb9cf2f93,0x3ad8ffcb,0xbb0c9806,0xbaf5d76b,0xbad0ea84,0xba6817c6,0xba0a1bf6,0xba07247f,0xba981b88,0xbab2fdc5,0xbadfc1b0,0xbaed9147,0xbb096fe6,0xbb1362c7,0xbb21d153,0xbaede781,0xba8751f8,0x3a191da0,0xb9e7a89c,0xb9ea1311,0xbad9b784, +0xba8839a2,0xbaa88c89,0x3a849113,0xba9ab46d,0xbadd12a5,0xbab8bf4c,0xbb5bdb05,0xbb8ae143,0xbb3bff98,0xbb4db90e,0xba9623b6,0xbb075c21,0x3a16c77b,0x396a5ebe,0x3a0e722c,0x3757c847,0xba05977f,0xbb0456df,0xbb2cfd24,0xbb012612,0xba67403a,0xb9af1e19,0xb9916b6f,0xba96e9ae,0xba8c4db7, +0xbab11fed,0xbabcc17b,0xbb2e05b5,0xbb5b98af,0xbb7ab801,0xbb1d5f26,0xba4d1f39,0x3b0ccaab,0x39dd7459,0x399968c2,0xba88695b,0xbaa837aa,0xbaf2bca3,0x3aa52592,0xbb3528e5,0xbb84d1dc,0xbb052df7,0xbba8c8b0,0xbbb51778,0xbb5d2b2e,0xbb016bd4,0xba72171f,0xb8dc80d3,0x3ad287c6,0x3b0f145b, +0x3b4c19d2,0x3a517522,0x39b37171,0xbafbfa89,0xbb2d86ed,0xbaae9990,0x3a43ce38,0x3af81b21,0x3af6e44f,0xb9b1ee16,0xbaa68354,0xbb1e1f09,0xbb0a33b3,0xbb672399,0xbb7996e1,0xbb6e8650,0xba8e4b68,0x3acfe3cc,0x3bb718c4,0x3b2bde5f,0xbb54e378,0xbb112d88,0xbabf173e,0xbaaa29d9,0x39d494b8, +0x3b432d2f,0x3b82a0f3,0x3b9736ee,0x3aa68ff5,0xba471967,0xba958443,0xbad5e098,0xba671610,0x3b2b2ea5,0xbb31e3f4,0xbb8e63b8,0xbb4586d3,0xbb3cabbd,0xba7f6e87,0xbafda426,0xbb9e38ad,0xbb940b19,0xbbd1a8fb,0xbbc31f3b,0xbba01525,0xbb6e88ac,0x3b676d06,0x3bb9341f,0x3a6f2819,0xb9c8ffcb, +0xbb98efbf,0xbc21b1af,0xbbfa1d01,0xbbca7862,0xbbafc7f2,0xbb3dc84a,0xbb3f4c97,0x37abb064,0x3bc6f89a,0x3ba87aa4,0xba8d5700,0xbbf692da,0xbc107185,0xbb9fa4ab,0xbac81ffc,0x38dbb429,0xb9823ae0,0xb997eabd,0xbab807b7,0xbaf50528,0xba331c24,0x3a220255,0x39a4fe87,0x3aeb7902,0x3b436be3, +0x3b349f77,0xba9cee45,0xbaf88ba2,0xbb0e3706,0x3abb1d27,0x3b2c9e58,0x3a368c56,0xbb59c595,0xbbd9a9a7,0xbc0d1f53,0xbb0ba83d,0x3b17e800,0x3b3cf507,0x3a08ccf2,0xbb547a9f,0xbc013c7c,0xbbac38d4,0xbb884583,0xbc82c7b5,0xbc949571,0xbc5e5a78,0x3ac76642,0xbb3154bb,0xbb42ef0e,0x39df3f3c, +0xb9f42bb9,0xb9b389e4,0x3735188b,0x39389a9c,0xb6dc4d79,0xbab1d5d8,0xbabc408e,0xbb11f66a,0xbab6edbc,0xba323186,0xb7ccae18,0xba04a142,0xba7bf11d,0xbaaefb75,0xbb4ba02a,0xbbc8b067,0xbc086521,0xbc104c0a,0xbc041113,0xbb6b8c4c,0x3b8cd8e6,0xbbdf35c3,0xbc5fef0f,0xbc60efe1,0xbc1ec771, +0xbba19c4d,0xbb471b87,0xb9cdb80c,0xbb868ac0,0x3a3d9e2d,0x3c0b0f46,0x3c072e13,0x3bb8458d,0x3afd01a1,0x3b1d3eb5,0x3b10b0e9,0x39aabf79,0x3840d771,0x393b418e,0xb9b2b10c,0xb9d004b1,0xba0fcf9a,0xb726d2ed,0x3a740d2f,0x3ac75005,0x3a6db02d,0x3a49a140,0xb8f608a5,0xba6ec597,0xba788d0f, +0xb875e055,0xb9a0be1c,0xb9d775be,0xba730dc4,0xba9baef4,0xbb2a1344,0xbb5b0ac3,0xbb2662e6,0xbb06eb0d,0xbb50c68f,0xbbd2428e,0xbbf9bf17,0xbbd6d55e,0xbbbb5b2e,0xbbb1c492,0xbb0a9f0a,0xb90e1d7b,0xbb245452,0xbb17abe1,0xba2b4b9a,0xb9cdca13,0x385368a2,0xb9cc8fe8,0xba9e53c4,0xbab4ccda, +0xba93683f,0xba538a27,0xba55ea08,0xb9a21db7,0xba6459fc,0xbb2c47d0,0xbb68660c,0xbb728534,0xbb827226,0xbb6aef1c,0xbb295c01,0xbad76a85,0xb947b6c7,0x3a18662c,0x39d603ac,0x3a657b82,0x3a5a9823,0xb9a56f4a,0xba57725f,0xbb3bc13e,0xbba64348,0xbbe01239,0xbbfadea3,0xbc009664,0xbbc80aea, +0xbb9a7eda,0xbb412623,0x3a27f5b0,0xb92625e3,0x3a2a78e6,0x3829cf2a,0xb8fbbc3c,0xb5aaef1d,0x379c5641,0x39ff6b6e,0x3a2fa14d,0x3ac7a0f3,0x3ab26824,0x3a3dd72b,0xb9db470c,0xbaa3ee7d,0xbb0395bc,0xbada1de0,0xbac5a19a,0xba811e84,0xbaa24632,0xbaa72ed5,0xbab19a67,0xb9aa6624,0x3a2bbbd5, +0x3abf6c92,0x3b4527e1,0x3b885d9a,0x3bae7ccb,0x3ba2a67e,0x3b892488,0x3b19c2c0,0x3b07bad2,0x3a505fb6,0xbaafc328,0xbb4e0a84,0x3b0b0408,0x3b1bdd4b,0x3b2967c3,0x3b272896,0x3b5f250c,0x3b6495d8,0x3b7467ba,0x3b811b90,0x3b69e04c,0x3b3ec4b9,0x3b1ae527,0x3aa5e8cd,0x3a19a90c,0xb989f959, +0xba2b2798,0xbaa54ad5,0xbaf9a5f7,0xbaf15838,0xbaf3c97d,0xbb13323b,0xbb1a75c1,0xbb0ad07f,0xbb09ec5c,0xbad7bde8,0xbaa6619e,0xba638bc8,0xba144392,0xb964a690,0x399f2cca,0xb9227665,0xb9aeadd8,0xba219c53,0xb9a70c19,0x3881a905,0x3a61a79e,0x3ae57923,0xbb2c8243,0xbb2614e9,0xba87ace4, +0xbb013d74,0xbae99c1d,0xbad52828,0xbb03020e,0xbaff7b0d,0xbb22efa8,0xbb3ce152,0xbb39c2c7,0xbb571826,0xbb5ba12c,0xbb6af16c,0xbb408bcf,0xbb30987a,0xbb46e592,0xbb2e2197,0xbb051acc,0xbb1649a6,0xbaeff926,0xbaf30f23,0xbae6257c,0xbadf6695,0xbadae291,0xbacf0d27,0xbb05a425,0xbb24e878, +0xbb427c31,0xbb5b11c0,0xbb6f7d23,0xbb83d6ad,0xbb66f132,0xbb507182,0xbb438e12,0xbb40047c,0xbb190ac9,0xbb1e5893,0xbb1874fa,0xbabbf8b9,0x38cc6541,0xbb23a6fb,0xbaaef5fa,0x38c45f63,0x381561a7,0x3802e270,0xb81d6f66,0xb7941f8d,0x3708ca06,0xb8456785,0xbb07350c,0xbb4acd1f,0xb8f4c36a, +0xbaf93ee2,0xbb3154ee,0xbb29f12f,0xbb2301df,0xbb237c22,0xbb1dfbe3,0xbb1c51e8,0xbb1a6424,0xbb14b24b,0xbb204736,0xbb26915d,0xbb2ece81,0xbb358ce8,0xbb3d46e5,0xbb4d2eb0,0xbb417775,0xbb3c43a4,0xbb31d388,0xbb272692,0xbb47be1e,0x3b2762c1,0x3b16291d,0x3b52c509,0x3a6b1a30,0xbab29c94, +0xbb5431f7,0x3adeccc7,0xba8c848e,0xbb5772a3,0xbb77c5b8,0xbb7da719,0xbb667e62,0xbb74d3a7,0xbb70690e,0xbb714a9c,0xba7ae6a1,0x3acd8260,0xbb61f3ce,0xba932bc6,0x3a47dfff,0x3b3cbfa2,0x3b100989,0x3b2be048,0x3b409661,0x3b45a68e,0x3b4548eb,0x3b362a73,0x3b361b30,0x3b360733,0x3b3c3f36, +0x3b34279b,0x3b311478,0x3b2ac82d,0x3b375528,0x3b368ca9,0x3b2dfbdd,0x3b2b0dcf,0x3b30c064,0x3b3a746f,0xbb0897c6,0x3ae5d986,0x39fd8468,0xb9ae226d,0x39969843,0xb6ac631a,0x3925e511,0xb686feec,0xb9c44c26,0x3a185c13,0x3a43e442,0x3a133002,0x3a2acad8,0x3aaa8346,0x3accfd38,0x3ad29ffe, +0xbac62f5a,0x3b17c472,0x3b41c625,0x3b6c6b9e,0x3b9c009d,0x3ba98fc6,0x3ba65bcc,0x3b842a5b,0x3b76b3f8,0x3b63ef81,0x3b7533d4,0x3b680820,0x3b6680de,0x3b58ac2e,0x3b7cd71a,0x3b7c1d4c,0x3b5e0e9d,0x3b448276,0x3b5cd183,0x3b265da4,0x399c15ad,0x3a28d5c9,0x3a055923,0xba01cf72,0xba8cbc4e, +0xba6e1057,0xbb55a14e,0xbb4ceb25,0xbb2edcec,0xbaa4d62d,0xbac7e99c,0xba5718f6,0x39da5c14,0x3aac56f1,0x3a8e68cc,0x3a822cf2,0x38117862,0x3a7780d6,0x3b4eb8b9,0x3b7935c6,0x3bc2bd83,0x3bd74af7,0x3bd5fc60,0x3ba23b85,0x3ba57725,0x3ba1958c,0x3bb7d007,0x3b95db9e,0x3b8dbe62,0x3b8590fe, +0x3ba77473,0x3ba56581,0x3b8efab5,0x3b723b87,0x3b509434,0x3aefe47d,0xba3cf4d9,0x39165bed,0x3aa8b76f,0xbaf2b1aa,0xbb62e236,0xbb26e00c,0xbba501a7,0xbbb699cc,0xbb40ea1a,0xbb215714,0xba796a85,0xb7a58771,0x3b08d7f6,0x3b55b72c,0x3b230f0c,0x3b285d17,0x39af0927,0x3aa2f778,0x3b8d8c17, +0x3bcca938,0x3c28655b,0x3c3d34b5,0x3c374a88,0x3bf83c7a,0x3bcf50e0,0x3bacee99,0x3bd90449,0x3bb487f8,0x3bae8e79,0x3bb375af,0x3be65ea2,0x3be45ecc,0x3bc17b0a,0x3b7d6ef9,0x3beaffd5,0x3b29b157,0xb99e8990,0x380b635e,0xb9b07d5d,0x3b3525d8,0x3ba2035f,0x3bb6af52,0x3b0188bc,0xb99234e4, +0xba6e5c74,0xbab5f829,0xba45861c,0x3b270692,0xbb209473,0xbb68a3f3,0xbb64945c,0xbad14d80,0xbb0875f4,0xba89e10e,0x3a8d6bb8,0xba11c482,0xbb0c11a2,0xbb60318e,0xbb169d01,0xbaac00b3,0x3c079227,0x3c3b1af0,0x3bf29fb4,0x3beb4e0b,0x3b9aac04,0x3a98273d,0x3b289354,0x3b43a140,0x3afb7267, +0x3bb3edf4,0xb81d35ed,0x3b1315aa,0x3bd151e5,0x3bcdd876,0x3b027f42,0xbbcf8dce,0xbc0c0e18,0xbba10bb7,0xbabd8d07,0x39687698,0xb8efd57c,0xb8adb3cf,0xba9e674d,0xbadcd4f7,0x399e4c46,0x3ae7347b,0x3a9815d9,0x3b0438ff,0x3ae65a8f,0x3b919e88,0x3b94019a,0x3ba3aea5,0x3bfc9ae5,0x3c0aa1e7, +0x3bd7f388,0x3a9f8979,0xbb84576b,0xbbe46773,0xbbe2e240,0x3938c0ec,0x3b834fb9,0x3b3b882b,0x3a73bc2a,0xbb37afa1,0xbbf54027,0xbb71d2b9,0xbb55121f,0xbc4c5400,0xbc8d9fab,0xbc4f7a57,0x3a1ae35e,0xbb18030f,0xbb45b021,0x3938e43e,0xb9984856,0xb8a189db,0xb88eb91e,0x393a43ff,0x3917ae67, +0xba89f158,0xbaa4c91e,0xbab9f08a,0xbace9d75,0x39fbb012,0x3a5b7bd3,0x3a59db42,0x3a7adef8,0xba63c972,0xbb1f80ae,0xba9423ad,0x3a44056c,0x3b23b4cd,0x3b944d80,0x3bedac24,0x3c35736b,0x3a6ce6a3,0xbb0336c0,0x3b30414e,0x3befc33d,0x3c28deb1,0x3c2ee289,0x3b2f01ee,0x3b1a5edb,0xbab0a658, +0x3bdcf2c1,0x3c10bbd4,0x3bb50061,0x3b26d9a0,0x3b0a8764,0x3b2a7bec,0x3a0dbe87,0x38cb6217,0x396a2be1,0xb91b530f,0xb9a19f27,0xba011c1d,0x39a4207e,0x3a9e7151,0x3b11ee91,0x3af5c5fd,0x3a0ed208,0x3a8f04f8,0x3b3fdb28,0x3b84d949,0x3bb5801f,0x3b9bf534,0x3b4dab2a,0x3a44c21c,0x3a4d5fb8, +0xb9f2bf8f,0xba6f512d,0xba250f9a,0x3a07eade,0x3ac77419,0x3ba79976,0x3c08fae2,0x3c5053a5,0x3bb15e9b,0x3bfcc384,0x3b04e5f9,0xbb72fe0f,0xbb2f73c6,0xbae69599,0xba50de35,0xb8b7265e,0x398dfbd2,0xb9e1f9c6,0xba23db39,0xba88d778,0xba5bf40c,0xba181f2f,0xb9ec594b,0x36fbcfc9,0xba0abbcf, +0xbae845fc,0xbb251e8f,0xbb6fca8a,0xbb1dbd9e,0xbb27cc48,0xbb288da9,0xba934495,0x39c946b1,0x3b1561ea,0x3b80940f,0x3b9f4b30,0x3bb4e5bd,0x3bc48a76,0x3b9b8f53,0x3b71beec,0x3b750356,0x3b6672be,0x3b5a2295,0x3b8889b7,0x3bc76f89,0xba2d4552,0xba888519,0xbb24ed9b,0xba21781e,0xb9cc5129, +0x381cfac2,0x39b4e90b,0x38a9fe5c,0x3a0a2b11,0x3a2aff49,0x3a61c88b,0x3abeeeb5,0x3ad738b9,0x3aa61767,0x39bcf0e6,0xb9d86769,0xba9f7b6f,0xbad7c413,0xbacbf57f,0xbab6b3a5,0xb889acdf,0x3a89f8b9,0x3aaf2c19,0x3b336d7d,0x3b70858c,0x3b8c43b5,0x3bb454f1,0x3bc0f172,0x3bc1c118,0x3bc958e7, +0x3be4c76b,0x3c0aeba1,0x3bdd6751,0x3ba17b53,0x3b227e70,0x38e17fa3,0x3baf3d17,0x3b92584c,0x3b6a0565,0x3b86cf8e,0x3b72ca3c,0x3b831c63,0x3b825fbc,0x3b8cc4b4,0x3b5f9646,0x3b61c5e3,0x3b2606e8,0x3b1c1981,0x3a38df4b,0x3a0903d7,0xb9c553db,0xba28880b,0xbad4a0f5,0xbab2f778,0xbab8a339, +0xba3086ec,0xb9e76fcd,0xba7e285b,0xba992956,0xba61a9a3,0xba0b1d98,0xb9a6a006,0x3a725306,0x3b0cb382,0x3b618f91,0x3b74a951,0x3b7b79a4,0x3b87204c,0x3b74013e,0x3b773b4d,0x3b8c82d6,0x3b9a76ed,0xb9e89cef,0xb9a239d2,0xbb284a10,0xb9c5bf6d,0xba9319d4,0xba95374d,0xba0bb1e5,0xba2a8f16, +0xba08dc3c,0xba6336e8,0xbadbbbee,0xbab35ae0,0xbac3f4be,0xbafbe3f3,0xbb130903,0xbb019c1c,0xbabd3a79,0xbabdceb7,0xbb1a08f4,0xbab880b3,0xbaceafff,0xbab09dac,0xbaa1e22b,0xbaa00d2f,0xba9e2732,0xbaa68e15,0xba8bc636,0xba77ea0b,0xba37e6b3,0xb9f0f146,0xb816c74d,0x39df654b,0x39f5c28f, +0x39d0b65a,0x3917714e,0xb973e01b,0xb9396947,0x395f28c7,0xba800dbb,0xbb0cb114,0xbb5f05b3,0xb98c3907,0xbae9d5e5,0xbb4735d0,0xbb5d825f,0xbb6a368e,0xbb6d6557,0xbb842f90,0xbb8c7b4d,0xbb9362bb,0xbb2860c9,0xba929146,0xbb867842,0xbb244f24,0xbab5a21d,0xba31bb94,0xba67b720,0xba4fe278, +0xba5351c6,0xba4c71e4,0xba44ee25,0xba45ade2,0xba1dd73a,0xb9fb17f6,0xb9c5e2b3,0xb96505c8,0xb8fc1292,0x37bdcde9,0xb90306bb,0xb92eacc3,0xb91f1496,0xb8905453,0xba0f4762,0xba7db7b4,0xba21db1d,0xbae90180,0x3a9bf90c,0x3b49b679,0x3b81301b,0xb6bfb494,0x3b1c390c,0x3b697b38,0x3b63c38e, +0x3b5ad9b9,0x3b450463,0x3b6685e0,0x3b6e721e,0x3b62a474,0x3b2d7a44,0x3a0dcb4e,0x3b85a87a,0x3b3a90ea,0x3a9c6f40,0xbaf1f736,0xba667f8c,0xba7f66fd,0xba3fa78e,0xba30ec65,0xba2eae8a,0xba550f74,0xba4d9513,0xba55d45f,0xba49fff5,0xba87377c,0xba922f22,0xbaa23818,0xba5b59e6,0xba239243, +0xb952ff3d,0xba2aa245,0xba44bce4,0xba8b1065,0x3b4e0b10,0xba652d78,0x3a3fe350,0x398bf1f4,0xba827107,0xba736cd9,0xbb0c887f,0xbaea01ce,0xb9f479c6,0xba878c25,0xba6b64c4,0xba3ead6c,0x3a8592fc,0x3a81f5fd,0x3a6bb179,0x39f8872c,0x3b448876,0xba57d941,0xba89394b,0xb9d6fc82,0x38634762, +0x39b125f4,0x3938ca16,0xba1619e9,0xba29919b,0xba5a7787,0xba24e3b5,0xba9a2fc1,0xbaa22f96,0xbaab9ee2,0xb92c2417,0x39e59f0e,0x3a8dc91e,0x388107c4,0xba1800d2,0xba2489ce,0x3a82fa56,0xb86ee215,0x3a8acd10,0xb990b472,0xba553587,0xbad76561,0xbb211fa6,0xbb852fd6,0xbb0a8668,0xbb590ee0, +0xba4c2d86,0xbb099629,0x3a93c646,0x3a10731c,0x3a08d926,0x3a3a69fc,0x3a839855,0xba3f22b9,0xbaedce63,0xba34eecf,0x3998a2db,0x3a5befa9,0x3a4d0e72,0xb8f786bb,0x38c404c5,0xb91480a3,0x39226487,0xbaca6c3f,0xbafad18e,0xbb0790d4,0x39c87e12,0x3abe8664,0x3b24d5fd,0x3a874335,0xba74eac6, +0xb9fddd39,0x39049d18,0xbab3ade7,0xb89fadc1,0xbb120e34,0xbb7e4ce9,0xbb5dcaaa,0xbbba37a5,0xbbbdf211,0xbb5b7e2b,0xbb271064,0xbae2142a,0xbaa7f9db,0x3a99afd0,0x3acd5ef1,0x3b358b08,0x3aa06aed,0x3b11f451,0x384b31e2,0xba503e72,0x3aa490d6,0x3b4986dc,0x3b805247,0x3b5a06bc,0x3a5920a6, +0x3974fbfa,0xb9f81066,0x39eada31,0xbaca0b2d,0xbad5cf71,0xba938dde,0x3b3656f2,0x3b956a26,0x3bb14f2f,0x3b23d6f0,0x39575506,0x3ac8dadd,0x3b65c1b4,0x3b17e40b,0x3afb42aa,0x3b89d896,0x3ba8d45f,0x3bc4b36b,0x3b19354e,0xb934f0f5,0xba23f68d,0xbaa80b7c,0xba5305d1,0x3b285cfc,0xbb147508, +0xbb888e83,0xbb7a5609,0xbb8e2368,0xbb186639,0xbb6a7454,0xbbdacff9,0xbbce9d9b,0xbc145b40,0xbbda48f4,0xbbaa8633,0xbb938b19,0x3b0e2860,0x3b5fa616,0xba9c8bc0,0xbad30647,0xbb83e8ac,0xbbe6cf0f,0xbb8e8543,0xbb5bcb69,0xbb81d46d,0x39e323f1,0xbba53bd0,0xbaa715d0,0x3bae3fd7,0x3b988d48, +0x3a8a1957,0xbbd4b462,0xbc1469a0,0xbba7b0bf,0xbaeebb0f,0x3885d8c7,0xb8eb0de7,0xb7d537a9,0xba99bffc,0xbb08186b,0xb9b3eaa6,0x3a97553d,0x3aad5fd9,0x3ae42cb6,0x3b553f42,0x3b7cc1d0,0x3a6547ba,0x3abc50b5,0x3a8d063b,0x3b78f187,0x3b4db96d,0xba325473,0xbb8f4721,0xbbdfc736,0xbbe6a2d5, +0xb9d58344,0x3b5cf840,0x3b4dcad9,0xb955d400,0xbb82d357,0xbbe793b0,0xbbae56a8,0xbb9d0625,0xbc2ee1e8,0xbc6348c7,0xbc3b5ead,0x3a465a69,0xbb169f36,0xbb1792f9,0xba21ea82,0xb996582a,0xb6bc4358,0xb88feddb,0x390d9755,0x388851b0,0xba6c0d02,0xbaacd277,0xbb1a09cf,0xbabee1cc,0xba877291, +0x39347387,0xbaa29e61,0xbb112d10,0xbb026521,0xbb7ed578,0xbbbce2ae,0xbbdf2955,0xbbdc3e9d,0xbba43c1c,0xbad469af,0x3b877dd2,0xbc0a70d4,0xbc542964,0xbbfc05f2,0xbb5481cf,0x3aceb769,0x3b8adbbd,0xba71d969,0xba922017,0xbad782f8,0x3ba275cb,0x3bcfd150,0x3bb48e8c,0x3a92993f,0x3a8e785a, +0x3af61123,0x39fe654e,0x38a0be5b,0x398751b4,0xb87f7817,0xb9d75b30,0xba388ca4,0x372ccb04,0x3a9f792d,0x3b0154ba,0x3abac456,0x3afcb2be,0x3a3e00e4,0x394f23f3,0x3a18fc90,0x3a8ca9f8,0x3aa6de15,0x3a1d3acc,0xba31702f,0xb9ba06f9,0xba879b06,0xba01268e,0xb9d54471,0xb971593b,0xbb0f547a, +0xb9ac5dcf,0x39f34e2c,0x3a8813cb,0x39ca78e6,0x388eb309,0x3b05f7ec,0x3b0be22d,0xba9085a8,0xbaaa572e,0x39058998,0x39054e59,0xb8eff87b,0xb8faecce,0xba43d740,0xba3e6abc,0xba68d936,0xba2f0cdc,0xba00d378,0x3893d8e2,0xb9b0b69e,0xbad79b99,0xbb22857e,0xbb184112,0xbb500ff3,0xbb450d09, +0xbb0e5afe,0xbae396a2,0xb751b083,0x3a90a392,0x3ad090cf,0x3b076d0a,0x3b0b295d,0x3ad1944b,0xb71ac8e0,0xbae3dd1f,0xbb5e8cda,0xbb82090f,0xbb842052,0xbb7c348f,0xba3255b3,0xbba1194a,0xbb3d6b1e,0xb98f00fd,0xb9eb57e7,0x399efd04,0xb80c627e,0xb9c4630a,0xb9236161,0xb9a2ddc1,0xb8fd4299, +0xb93b45da,0x3a5a5bde,0x3a8dd178,0x3a896c9e,0x393956e8,0xb9e90cd4,0xbaabf38f,0xbad812e4,0xbafa9635,0xbac61d64,0xbac30aa2,0xba7e1a83,0xba071520,0x3a8dd6d3,0x3b15ce01,0x3b469157,0x3b8ba8a2,0x3ba15f24,0x3bb48476,0x3b9f7292,0x3b75e7f3,0x3af705db,0x3a8e9b69,0x385d92df,0xbae7ccb7, +0xbb5670ad,0x3b3b3897,0x3b692229,0x3b8dbc1c,0x3b76658b,0x3b917a17,0x3b8812f6,0x3b817eed,0x3b7732e6,0x3b799fe6,0x3b54fbf8,0x3b60af51,0x3b08e999,0x3add4996,0x3a5e5451,0x399122b2,0xba0f7ef8,0xbaa8c392,0xba90df2c,0xba4bbd44,0xbabf0409,0xbb048ac3,0xbaea015a,0xbb030366,0xbad99f18, +0xbabacf16,0xba99c85a,0xb9f8fbbd,0x398c8c8a,0x3a9869a9,0x3a8e2a2a,0x3a9c33bf,0x3a98cf22,0x3ab2a0a1,0x3ad1955f,0x3b08ead9,0x3b39b05f,0xba8fb386,0xba605fed,0x39a5f43f,0xba42a319,0xb9b13981,0xb9bb6315,0xba4c1062,0xba3769fa,0xbab963a0,0xbaddecb8,0xbac6d964,0xbb0c9f15,0xbb237859, +0xbb2cac5e,0xbb0a3ad3,0xbb0a85fe,0xbb1508e9,0xbb170647,0xbac86395,0xbb1d1297,0xbb0663e7,0xbafc9ae8,0xbaef61fc,0xbae39840,0xbadbd8ba,0xbad4afb1,0xbafcd9ed,0xbb1183b1,0xbb1ce7c3,0xbb2524d5,0xbb2672b8,0xbb25f799,0xbb0b9a26,0xbae2a91f,0xbabde5b6,0xbaa86f33,0xbaccfb89,0xbada3aac, +0xba23f99a,0x3982206e,0x3a27f257,0xba7d67d1,0x3991a40a,0x3a73dc52,0x3a577a1b,0x3a435451,0x39ea66a4,0x3a06dfcc,0x39fe0b6b,0x39922d04,0xb9fb407e,0xbae4bcef,0x398bac4c,0xba0318d6,0xbabeba94,0xbb252960,0xbb127a73,0xbb16d38b,0xbb143541,0xbb142e39,0xbb13eec1,0xbb115866,0xbb1304a8, +0xbb11f070,0xbb133e52,0xbb114253,0xbb10a464,0xbb13fbd0,0xbb0aa282,0xbb0614b5,0xbafdd0d8,0xbae8c742,0xbb2777ef,0x3a8ef396,0x3a8d067c,0x3af49935,0xba992447,0xbb1eaf12,0xbaeb5637,0xba089a05,0xbb159ae3,0xbb2406dc,0xbb335d1d,0xbb3658a7,0xbb176132,0xbb239f0a,0xbb1afb04,0xbb120be1, +0xbb112866,0xba358238,0xbae49abc,0xbb0ddb67,0xbaa3507b,0x3ac76c7b,0x3a75b611,0x3a98a516,0x3aba406e,0x3ac2a003,0x3abe64f0,0x3a983c44,0x3aa374d7,0x3aa5af55,0x3abd0ce8,0x3a8f47bc,0x3a826a16,0x3a74481f,0x3a939f84,0x3a9e4991,0x3ab536c0,0x3a9fa796,0x3ab835d9,0x3a7a3b07,0xbb1f8195, +0x393c0713,0xba9cc9a9,0xba8f2560,0xba3da417,0xbab3120d,0xba57f9e4,0xba9bf1a0,0xbaee226c,0xba6b850b,0xb9ff445a,0xba83ae20,0xb9a39111,0x3993e803,0xb900f472,0x3a0ff9ac,0xbac13f7c,0x3a58ca6f,0x3adb8b83,0x3aee3f1e,0x3b31fe42,0x3b48c26f,0x3b40f713,0x3af3248c,0x3af1a885,0x3ad90a18, +0x3b06c7b4,0x3aa7fa18,0x3a84ace3,0x3a604710,0x3ab4e58d,0x3ae1ec78,0x3b05e097,0x3ab8fc78,0x3b141124,0x3aabd692,0xba976119,0xba02ed86,0xba61729b,0xba6d44ab,0xbaac291a,0xbb0f2942,0xbb630ffb,0xbb524925,0xbb714137,0xbaf305c5,0xbb09d20a,0xbb000526,0xb9f88992,0x3908f493,0xb9291132, +0x390115c5,0xba6c19b6,0xb8806eb4,0x3ada406a,0x3ae97c95,0x3b5a4c0c,0x3b7b9f69,0x3b727ad0,0x3afe93b8,0x3b273466,0x3b2223cf,0x3b61976d,0x3aaa26d6,0x3a3ed8de,0x3a4da3ea,0x3ae28084,0x3b1d4c4a,0x3b529765,0x3b0828da,0x3af55894,0x39f62ba4,0xbb054403,0xbaa5e88a,0xba627631,0xbb08126b, +0xbb564600,0xbb700eab,0xbba913fa,0xbbb60976,0xbb28411a,0xbb2f264e,0xbadd4a8e,0xba881c94,0x3ab6e1d7,0x3b15fee3,0x3a988567,0x3b19b1fb,0x3a1c1920,0x3aa417b7,0x3b566395,0x3b803457,0x3bda5237,0x3bf7fb7b,0x3be2702f,0x3b633ac5,0x3b4e0a20,0x3b33ff4f,0x3b936c01,0x3acc5565,0x3a0ff19a, +0x3a5bc5ef,0x3b187de6,0x3b70965b,0x3b9d66cc,0x3b0cc0b8,0x3be83e95,0x3b103382,0x3989d0ee,0x3a826c27,0x3a0b5bf7,0x3b4dad92,0x3ba8d4ba,0x3bc0cd0d,0x3b28a0b5,0x3929d0bc,0xb9af8712,0xba6f1310,0xba1667bd,0x3b0e1c98,0xbb07f4a1,0xbb5dda2f,0xbb9d2de2,0xbb814bf7,0xbbb0b467,0xbbad7435, +0xbb487286,0xbb6b4147,0xbb889438,0xbb8a819c,0xbb1ada9d,0xb9fc00d4,0x3be0fd3e,0x3c07ef04,0x3b74ec78,0x3b577871,0x3a8ce3c1,0xbb17606b,0xb93cc505,0x3a33d49a,0x389bd4e2,0x3b9a25b8,0xba14e038,0xb82d7a0f,0x3b1650a3,0x3b79ea78,0x3b061c1c,0xbbc8e3c7,0xbc098950,0xbba42388,0xbae1b8c2, +0x3686ec25,0xb8878a8e,0x38adbb91,0xba87fb36,0xbae3f3fe,0x39892a25,0x3ac05a43,0x3a72ec08,0x3ac47ffe,0x3acc704c,0x3b7efe0a,0x3b6feb57,0x3b61bfea,0x3b962ef4,0x3bcbdbda,0x3b8734ec,0xbad58ac9,0xbbb732d9,0xbbee3315,0xbbb2c25f,0x3a89a4dd,0x3b5f436a,0x3aa2c607,0xbb3b9457,0xbbc3c8df, +0xbbd60260,0xbb80f80b,0xbba6399c,0xbc06a62a,0xbc4db3ca,0xbc1e49c2,0xbab97266,0xbadedd79,0xbb133bbe,0xba94d832,0xb98bd6a7,0x38c1bd22,0xb8fa7a2e,0x38bedfcb,0x3951c5bc,0xba19d31f,0xbabd777f,0xbb018df7,0xbb10744b,0xba42bb33,0xba8b52b1,0xbaaf1af6,0xb9668a29,0xbad84e5c,0xbb4f80fc, +0xbb3ad3b7,0xbb05b89a,0xbac1a68e,0x3af8d4d7,0x3ba1e0cf,0x3c063bb4,0xbb25f425,0xbbc02b58,0xbad95417,0x3a94d144,0x3b8ff9c6,0x3bef31c4,0xba9eba20,0x3a783eea,0xbb1a2944,0x3b2d0a02,0x3ba4cc0c,0x3b93edd1,0x3a81e3f3,0x3a259e8c,0x3aede4b9,0x3a10b585,0x38c0ade8,0x397a7507,0x3810c79d, +0xb9b06b24,0xba44af61,0x38aec5fa,0x3a82dca5,0x3b04816d,0x3afc75dc,0x3a696741,0x3ab78635,0x3b30d569,0x3b3762b4,0x3b56d743,0x3b32ad60,0x3aa627d0,0xba7281b0,0xba950c65,0xbb0ed1df,0xbaf63e0d,0xbb02e186,0xba44ee88,0x3a3f002d,0x3b3e1302,0x3b8af6aa,0x3b9eb2d7,0x3b016169,0x3b1d5cb1, +0xb9835134,0xbb149915,0xbb135d25,0xbad1792f,0xba28cb40,0xb8947bce,0xba2984fc,0xba1ff99c,0xb9ecc299,0xba21ad12,0xba2fbc0d,0xba0a4800,0xb9e16d0a,0x392bf756,0xb912f515,0xba4f6f7e,0xbb10b34c,0xbb6e07fd,0xbb294de1,0xbb146391,0xbb0f782a,0xba992298,0xb8c264a0,0x3a821861,0x3acb945b, +0x3af081b9,0x3add4dfc,0x3aabcb58,0x39fc35fe,0xba20f406,0xba98298e,0xbb1119b8,0xbb20bf24,0xba8f8c36,0x3a515334,0xbb69eca0,0xbb8f8eb3,0xbb7f6b8c,0xbb1c9fae,0xbacad4ce,0xba8bcdcb,0xb9afe98f,0xb9e73098,0xb85a4573,0xb8ce14ff,0x385a664d,0x3a010d76,0x3a829024,0x3aa7209d,0x3a0cdbe3, +0xb9b4d6af,0xbab8cd74,0xbaf97a28,0xbaf3c933,0xbadd40be,0xba1b23a3,0x39b3d392,0x3a705e2a,0x3afb86e2,0x3b3b2f11,0x3b6c4edb,0x3ba4bf03,0x3bc168cc,0x3bd0abd1,0x3bbf612a,0x3babf25f,0x3b94a852,0x3b65c652,0x3afd9b29,0xb9a5e6f2,0xbb2d9dba,0x3b9009e6,0x3b7aa603,0x3b3d989b,0x3b4f6260, +0x3b42f3db,0x3b5086fe,0x3b4a67d0,0x3b54dc1c,0x3b3d3ee9,0x3b580a16,0x3b350339,0x3b3b5421,0x3ad06b5c,0x3abd236e,0x3995014d,0xb986b74d,0xbab500f3,0xbaa38ae4,0xbacfda36,0xba81aa13,0xba13bdf7,0xba8870df,0xba90a7f9,0xba729520,0xba365297,0xba206efb,0x39966811,0x3a899b0f,0x3aff7a99, +0x3b172318,0x3b31a3ed,0x3b4c7f25,0x3b41738c,0x3b45188d,0x3b68651d,0x3b794ee7,0x39ab7a92,0x39bbad36,0xba8e3a1c,0x3993dd07,0xb9f52d53,0xb9ecc4d7,0xb8c08264,0xb98660cd,0xb9a9ecc8,0xba8476c2,0xbaff62ff,0xbaf6f8c5,0xbafc4fa9,0xbb1ff7a7,0xbb262270,0xbb09e587,0xbafe0d41,0xbadaeb57, +0xbb1d01cf,0xbab6bfa3,0xbab01ae4,0xbaa3ee4f,0xba936d5e,0xba947c0f,0xba9220b6,0xba978be6,0xba652df6,0xba3882ef,0xba0ae102,0xb9e3b34b,0xb9974972,0xb88014de,0x3919a4bf,0x399d40f1,0x39b2f069,0x3971951c,0xb99aeff1,0x390c4170,0xbac4c2f8,0xbb0fbf3e,0xbb07e1c6,0xba816045,0xbb04843f, +0xbb0b35d1,0xbb210b16,0xbb2a2483,0xbb26c9bc,0xbb400322,0xbb4f99c1,0xbb5a160f,0xbb47c2a1,0xbb0445dd,0xbb497b19,0xbb40790b,0xbb0dd41e,0xba5b09be,0xba94a8c0,0xba8d4d99,0xba8ea61a,0xba8d46a5,0xba8a8faa,0xba8d2dfa,0xba803eff,0xba6c8eb8,0xba557eea,0xba2fcbdc,0xba112ad7,0xb9f616ce, +0xb9fce780,0xb9f7ec0a,0xb9dad32a,0xb9a6652b,0xba97b43b,0x3a2a770d,0x3a378907,0x3963f224,0x3b22ece2,0x3b330dcd,0x3a779d23,0x3af64508,0x3b1ea24b,0x3a8fb113,0x3a8fdc75,0x3a75f1a3,0x39ff0f67,0x3a61ec70,0x3a720051,0x3a214cad,0x3b244569,0x3b0953f2,0x3a6ec06f,0x3b262aee,0x3b1cd940, +0x38f822e6,0x3a1e1337,0x3a3d56a2,0x3a728df7,0x3a848b38,0x3a853c59,0x3a570f41,0x3a6639a4,0x3a6347b9,0x3a849847,0x3a374cae,0x3a2add4f,0x3a169edd,0x3a88a4fe,0x3a951c1d,0x3a90aed5,0x3a5b1ca4,0x39f0d2ca,0x3a814887,0x3b09a878,0x3a12d075,0x3a66affe,0x3a356906,0x390ab008,0xba02b349, +0xba24fadd,0xb8a6104a,0x3a02cdf9,0x3a057c6c,0x39758ea6,0x3940406a,0x3a96d7a5,0x3aa96aee,0x3add85b9,0x3ab24c83,0x3b0dbbf3,0x3aaab505,0x3a89edf3,0x3af4adc1,0x3b15e03c,0x3b288203,0x3b169210,0x3ab59c6d,0x3ab1ad30,0x3aaa8fed,0x3af0b73e,0x3a930e08,0x3a8e1394,0x3a8573f0,0x3b18b13f, +0x3b29211a,0x3b0768a8,0x3aaefb6b,0x3a30b81d,0x3aaf3341,0x3b06901a,0x3a81f50f,0x3a164d33,0x39c6f805,0xb931f1cc,0xbaf9df48,0xbb012701,0xbb5f6c88,0xbb10f007,0xbb2c13af,0xba5e4b1a,0xbaeca323,0x3a87305d,0x3a5105b2,0x39f53363,0x3a921bca,0x3ad39bc2,0x3a70703b,0x3a3284b9,0x3af1fdb7, +0x3b41333c,0x3b6b1585,0x3b6231f9,0x3b16a5f5,0x3b282676,0x3b20608f,0x3b581b21,0x3ab0b51e,0x3aa2e730,0x3a9b2a4e,0x3b803cc7,0x3b882aed,0x3b4d2398,0x3b117687,0xba09ed15,0x3a376549,0x3a24b87d,0xba2ea8e4,0xba9f45f4,0xbac1f8d2,0xbb512ccd,0xbb91c6c1,0xbbadc8fa,0xbbaedd39,0xbb4b9a42, +0xbb2ee22b,0xbb015200,0xbb08bf3a,0x3a68c76c,0x3aa9af7c,0x3aecc500,0x3af59e30,0x3b3b3f43,0x3b1035a0,0x3b2e6457,0x3ba22783,0x3be38b02,0x3bfe5b4f,0x3bdd7945,0x3b743404,0x3b5076db,0x3b42e453,0x3b9b5cae,0x3b1ca08d,0x3b0e0778,0x3b27572f,0x3bd9593c,0x3be99b57,0x3b9f2494,0x3b21e296, +0x3bbd461d,0x3bab5020,0x3bc90c0d,0x3b9606bd,0x3b34e549,0x3b9aebd5,0x3bbe455e,0x3bccdc8e,0x3b4d1ddd,0x3a280f4b,0x3931b97b,0xba06928e,0xb9d7be43,0x3b0dab35,0xbab8c3ee,0xbb4f8dbe,0xbb90305d,0xbb97d2b8,0xbb77e229,0xbb8bfb3e,0xbbb43d7b,0xbbc01ba7,0xbc0af6e1,0xbbc07660,0xbb86e4a7, +0xbb4bb1f6,0x3b372ac9,0x3b69880d,0xb94c09e6,0x38b055ef,0xb9ca6073,0xba8acd25,0x3a723546,0x3aaa82b0,0xb98da796,0x3ba52f2d,0xbb920749,0xbaa10bd8,0x3b766756,0x3b7b7d1d,0x3b461498,0xbba65876,0xbc05d8d1,0xbb9ae287,0xbaf7dedc,0xb9274a3a,0xb9473c48,0x38c7d845,0xba703f78,0xbaf757a5, +0x388a6fb2,0x3acc38ea,0x3aef27b9,0x3ac81ce1,0x3b2d3ebf,0x3b95af8e,0x3b849d19,0x3bb3de4f,0x3bbec7d0,0x3bd34712,0x3b74504d,0xbab22bfe,0xbbaa08a8,0xbbdaf396,0xbb9daa21,0x3ad30759,0x3b8a7a6b,0x3b3cdc67,0xba5c79f2,0xbb8dee0c,0xbbc45290,0xbb90a576,0xbbae4f68,0xbbbf582e,0xbc1a9484, +0xbc0b479d,0xbaf3af85,0xba982006,0xba764e63,0xbabafb2c,0xb7a4f6c3,0x397171db,0xb825d91f,0x38a3d6e7,0x39962210,0xb9c51dbb,0xba903783,0xbb0342d4,0xbac911ee,0xba733f51,0x3889b91e,0xbac79275,0xbb101247,0xbb0ff293,0xbb797bd9,0xbb63c24c,0xbb2a68be,0xbae593b2,0x3acffe36,0x3b60788b, +0x3ba71e1a,0xbbcad52f,0xbbf1bef5,0x3af3cc3b,0x3bb532bd,0x3c141c56,0x3c44c18d,0xba3c3ff4,0x3b921c5d,0xba37b95d,0x3a9d7858,0x3b436790,0x3b699f4b,0x39b48b34,0xb8702117,0x3a98b5dc,0x39dc3ab8,0xb88fe074,0x38935c8f,0x38a5c4a3,0xb9a2382c,0xba2491b8,0x38e9fa6b,0x3aa80cbe,0x3b15aab6, +0x3afc869b,0x3b16a06b,0x3adc64d3,0x3b0f42a8,0x3b3f2038,0x3b4b661a,0x3b584d50,0x3b0ab091,0x3884c32b,0x3a01bbfb,0x38f4b754,0x3aa34dac,0x3a39d27e,0x3ab30cba,0x3a62c3bf,0x3be4e35c,0x3c1be76b,0x3c1b86aa,0x3bf3d5b4,0x3bca008d,0x3b9a249a,0x3b0570dd,0x38ae8fef,0x385385b1,0x39f57b55, +0x399f3b82,0xb98b35fc,0xb6b13532,0xb93bdcc2,0xb8e7b34b,0xb9ee6fae,0xb9ef0f96,0xb9281461,0x39b0892c,0x390c6a53,0xb9ff844a,0xbaa01ee9,0xbab91b72,0xbb05f196,0xbb0514c5,0xbad71b56,0xbaa74750,0x397a902b,0x3ad7dfea,0x3b459526,0x3b57f356,0x3b60e7ca,0x3b6dc604,0x3abcbd9d,0x39a9e24f, +0xb982bf3b,0x396bf9e0,0x3a7fc76f,0x3af42855,0x3bb1e93b,0xbb4b1fd9,0xbb155771,0xbb0062cf,0xba86af7d,0xba0a6f7a,0xb97e4ad6,0xb9b1f193,0xb93de236,0xb97bf6ef,0xb9af4a76,0xba032ca1,0x394a4eff,0x3a3f311d,0x3a98fda6,0x3a3d5fbc,0x3996d5c0,0xba1a69d7,0xbacc6947,0xbb084c5c,0xbaf9681f, +0xbaab5e5d,0xb97b24a0,0x3a34378b,0x3b255ed5,0x3b745d4e,0x3b8faaaa,0x3bacc302,0x3bb16e01,0x3bac2b5e,0x3b94b154,0x3b6d8811,0x3b2ad2d8,0x3a955519,0x395401b5,0xba8fbf5e,0xbb0a813e,0x3b56a42e,0x3b780460,0x3b91aec1,0x3b801166,0x3b8471a1,0x3b72d472,0x3b53d894,0x3b3dcc9f,0x3b4d6c20, +0x3b49fc61,0x3b6cb0df,0x3b32ba52,0x3b1505e6,0x3aed8a41,0x3a66d2c6,0x387f14a1,0xba5468e5,0xba0dadd6,0xb907a7c6,0xba04c0f0,0xba8bde7e,0xba933b4a,0xbac515d5,0xbaaadfc1,0xba9788cd,0xba8a4641,0x3824afc4,0x3a952dcf,0x3b1a1e61,0x3b31f7f1,0x3b4a80c6,0x3b60dfe0,0x3b55dd92,0x3b507cb9, +0x3b5016bd,0x3b61daf0,0x3a7ac43a,0x3aa5e59c,0x3a71e193,0x3a576b4c,0x3a6a4518,0x3a354a0e,0x3a202e88,0x3a14a2d6,0x38fd8dbf,0xb90421af,0xb977d702,0xba276e44,0xba8e847b,0xbaa05df8,0xba9d44dc,0xbaad5e68,0xba9d3b7b,0xbaceae60,0xbabb8cc0,0xbb070f07,0xbb028e5d,0xbae570b7,0xbad7bd2e, +0xbacd22d3,0xbac6a171,0xbac9e9aa,0xbabc434c,0xbaafca1c,0xba8e876f,0xba5b68ba,0xb9ee198f,0x382329a9,0x396998e6,0x3a08f729,0x3a43a610,0x3a6ff25e,0xb9b3d9fd,0xb98582b7,0x3a1a6e4c,0x3a37de0e,0xb98ea688,0x3a040c79,0x3a421bfd,0x38e26a00,0xb8d69687,0xb9819f81,0xba17ad28,0xba24c280, +0xba486468,0xba883977,0xb62eb297,0xb9e5e71d,0xba81c9dc,0xb9718542,0xba0d78ed,0xbae20b66,0xbac675dd,0xbacdc389,0xbad0203b,0xbad1df1d,0xbad28ece,0xbad5c540,0xbabf0361,0xbaab9ae7,0xba9bb268,0xba82ccb3,0xba5d7492,0xba2ee650,0xba258519,0xba1a0cc6,0xba0f2b87,0xb9e436c4,0xbab7db52, +0xba3100a5,0xb9ceed19,0xb9cbc32f,0xbadbb6ee,0xba90e163,0x3a9c09e4,0xbae94119,0xbab09328,0x391d440a,0x397a4ba7,0x39469e08,0x39b80485,0x3a02bf9b,0x3a2f7af7,0x3a4a18b9,0xbaa91a28,0xbae88d36,0x3abf21d7,0xba871545,0xbadccdac,0xba21ab2a,0xba171c45,0xba1fcf88,0xb9e300ce,0xb9c43ea9, +0xb9d6270c,0xba320077,0xba10c388,0xba0cfb56,0xb9aa51d5,0xba57b42a,0xba79e1d2,0xba86df66,0xba409629,0xba100ee9,0xb9092e24,0xb9e9e7c9,0xb9ac7d5d,0xba897156,0xba2e4465,0xbaad2313,0xbae09b3d,0xba88c1c9,0xbab77303,0xbb0e12b0,0xbae54bb6,0xbb007d61,0xbb14d5de,0xbae9bd4b,0xbab32eac, +0xbb00e444,0xba1f2be7,0xb9a20796,0xba792137,0xb9932be9,0x3936561f,0xba337af9,0xb9087d25,0xb940b20a,0x398b3aa7,0x3a09927d,0x39b9e094,0xba1d0429,0xb9f5b1f2,0xba090718,0x375690c9,0xba967971,0xbac98f73,0xbad8c6ef,0xba670ca6,0xb971ff95,0x3a1ef934,0xb983893d,0x39c3635c,0xb90fbc00, +0xbaafd573,0xba91f0ee,0xbaa31c5c,0xba527510,0xba939ca1,0xbb4d1e2f,0xbb468c2a,0xbb5ca7f9,0xbb86f3c1,0xbb30f808,0xbb0386f2,0xbb3aa623,0xba2d4138,0xba405979,0xba633f21,0xb9cdcbd3,0xba59b4c4,0xba50de37,0xba066174,0xb9e197a1,0x39a125c4,0x3a4a7b09,0x3a1b523e,0xba6eb36c,0xb91e8501, +0xb960c4fc,0x3a62522e,0xbb011dce,0xbb2ed9e2,0xbb27e318,0xba8887d4,0x395449d8,0x3af54b32,0x39f091f6,0xb979e89e,0xba54aebb,0xbb10e69e,0xbb1bf3d8,0xbb2671a7,0xbb047f70,0xbb40ebc0,0xbb963e73,0xbb9c2e1a,0xbba09fe5,0xbb22ac29,0xbb1d0a16,0xbb02d492,0xbb0c5311,0x39f5e99d,0x3a5b3895, +0x39bcf10d,0x3acc4b78,0x3aaf722b,0x3a945a75,0x3aab09a8,0x3ac0c752,0x3b2a95de,0x3b522fcc,0x3b15130e,0xba1ea5ac,0xb9ea45b4,0xb939025d,0x3af33177,0xbb0cb02c,0xbb678315,0xbb527a0d,0xba4d09c5,0x3acbf78d,0x3b707d7f,0x3a4ab4e2,0x3b9fee5f,0x3b1d0ffc,0x3b1b4bd8,0x3b2bd686,0x3b11b519, +0x3b81cf55,0x3ba5e997,0x3bb09ab5,0x3b41a910,0x3a447a45,0x39d51398,0xb9596eae,0xb943a39d,0x3ada337a,0xba9a22c0,0xbb373fb4,0xbbadcf63,0xbbbd1a35,0xbbdc97a6,0xbbf84c4d,0xbbf1a5d9,0xbbe1fb76,0xbbee6efc,0xbbb2d1c9,0xbb48a8dc,0xb9a2cd79,0x3b6f9a54,0x3b57a6a7,0xba936fb5,0xbadc0d7c, +0xbb50206c,0xbbad0187,0xbb503276,0xbb017033,0xbaf430b9,0x3b43f13d,0xbb19b95d,0xbb0f678f,0xb9f2d5d0,0x3ac74c16,0x3ae82182,0xbbadf6b7,0xbbf337b6,0xbb91b52d,0xbae9e87c,0xb98190a6,0xb9766aa7,0x38fda05f,0xba4650fe,0xbada65a4,0xb84f1a25,0x3a6f0029,0x3a467161,0x3a80c679,0x3aeb755c, +0x3b508e65,0x3b1ac014,0x3b04a317,0x3a9fa9b7,0x3b42e792,0x3a89ffa4,0xbb624934,0xbbd10a9d,0xbbe3c138,0xbb813399,0x3ada6075,0x3b41d49a,0x3a4d58dd,0xbb9578a1,0xbbf03784,0xbbb4d078,0xbb8bf38a,0xbbd2acac,0xbb99cc73,0xbbfe06fb,0xbbe0a063,0xbb75f8dc,0xba473aa9,0xba2aa588,0xbaeaa4e1, +0x3900d099,0x398da049,0xb61ec1c9,0x37c9b9f8,0x39adb500,0xb9139eda,0xbaa3ab60,0xbb14daf9,0xbb160d91,0xbae5778d,0xbb0d2e66,0xbb45113d,0xbaffde98,0xbb1d9aa0,0xbb70b561,0xbb97509d,0xbba88611,0xbbb8d0d3,0xbaa9610b,0x3ab7ba65,0x3b54cd55,0xbbe6ea61,0xbc25c45a,0xbbb5012a,0xbb85a506, +0xba18756d,0x3b8f0a66,0xbb7e63f7,0x3a96f9a7,0x39e10c69,0xba6f5fd2,0xb8f1c557,0x3afda546,0xba22b322,0xb9ed6b19,0x3a338cf5,0x39a9541e,0xb9031ff3,0x38261dad,0x38a2f5b2,0xb972d887,0xba33a3a6,0xb87b0229,0x3a5259c4,0x3aeaf3ef,0x3ae88d59,0x3ad28e60,0x3ad1c92a,0x3ae7a8ab,0x3a8ed44d, +0x3a139500,0x39caa821,0xb9bc8de3,0xbae78b30,0xbb101bd5,0xbb4172d8,0xbb01ca05,0xbb1e3715,0xba8c5d34,0x3a0ab487,0x3aa1970f,0x395aec1d,0xbb5cd441,0xba015194,0xbb15b329,0xba7afcd6,0x3a738091,0xba0bacc8,0xb9e86086,0xb9045012,0xb9059a22,0xba820715,0xb9a71adb,0xb8e7140d,0xb80dda9b, +0xb99b19a0,0xb9bf8f09,0xb99e5c5f,0x398977a2,0x3969d695,0x3803fee3,0xbac4d5c7,0xbb271f25,0xbb24cb72,0xbafbb023,0xbac61a33,0xba83556d,0xb9a7cf78,0xb777e843,0xb962acc8,0xba19d8b9,0xbab137f4,0xbb2281dd,0xbb553b20,0xbb92c405,0xbbbca5a6,0xbbe4751b,0xbbdb7a3c,0xbbac3a11,0xbb472f05, +0xbbad60be,0xbbbc8fa5,0xbb61ba6b,0xbb4543ec,0xbaf6a0e2,0xbacbf92e,0xba674444,0xba40ea93,0xba0b40ee,0xba1ff60c,0xba1b07a8,0xb998ae54,0x398636e0,0x3a73df1f,0x3a1004f2,0xb93bd4de,0xbaa5bda0,0xbaf05dbd,0xbb048229,0xbaeb701b,0xbab6e432,0xba5f4728,0xb890100f,0x3a678efa,0x3af75176, +0x3b31d919,0x3b829fca,0x3ba23e8d,0x3bb769ee,0x3b90ebbf,0x3b25f9a2,0xb9995fd8,0xba4a8525,0xbae96b27,0xbb4fb9a3,0xbb9277f1,0x3b033fc1,0x3b0faa25,0x3b0568d6,0x3af46da7,0x3b0d41d4,0x3b0a9e65,0x3afdffcd,0x3aec4b76,0x3b0d46fb,0x3b2ba2db,0x3b3862b3,0x3b312bf8,0x3b163d3e,0x3b076d45, +0x3a6c7827,0x38822f65,0xba714347,0xba705f9f,0xbaa189f4,0xbaa9124a,0xba8e0eab,0xbaa16e0e,0xbaa61e2b,0xba94f188,0xba80d7fd,0xba6f8d76,0xb9c70eeb,0x36ff83a6,0x3a163c52,0x3a44fe75,0x3a9d603c,0x3ac467cf,0x3ac7617d,0x3ac2d2d5,0x3ade4bd0,0x3aeecebf,0x3a73f5d8,0x3a822eda,0x3a954a89, +0x3a69d06a,0x3a17cf1f,0x3a12fe89,0x39fb352f,0x39bd1cc5,0xb785f05c,0xba472852,0xbab06d6a,0xbadec215,0xbaee08ee,0xbb10c061,0xbb06006c,0xbae429ba,0xbb052964,0xbaeb7a94,0xbaffce22,0xbad838d1,0xbab1f6b7,0xbab3687f,0xbaa3d12e,0xbaa2d038,0xba9f4e68,0xbaa00656,0xba85dd1f,0xba704cee, +0xba60492a,0xba64a000,0xba70cff0,0xba647bcc,0xba059f54,0xb8ddfe96,0x398d03f0,0x3a0e35dc,0xba2fa823,0xb9dfa51e,0xbaaa8095,0xba8d7d93,0x37e0a615,0xbaa11d95,0xba92dc66,0xb985bf4b,0xb9f9ebe6,0xba0ce5fa,0xba0ba978,0xba37553c,0xba591e26,0xba757d25,0xbb0c24af,0xbb1402ef,0xba874bfc, +0xbb0e69d3,0xbb1654f4,0xbabf7c4e,0xbad2bb10,0xbad4a800,0xbad3e8c5,0xbad4d838,0xbad37f5c,0xbad5d371,0xbad0a5b7,0xbacc1cca,0xbac4f4a7,0xbab781dc,0xbaaaa31f,0xbaa929a2,0xba958a86,0xba8a5e51,0xba78e208,0xba5c1077,0xbafc010a,0x3aee4642,0x3ad7ac74,0x3b098744,0x3afb75ff,0x3a0dcfc2, +0xbb08910b,0x3b0fde0a,0x3a300262,0xbafe3e5d,0xbaf6c3cb,0xbb03b834,0xbb1509c2,0xbb0ca05c,0xbb096db8,0xbb18eee8,0x3a19aab3,0x3b02c341,0xbb0f207a,0x3a0a8b7c,0x3ae85f63,0x3afa897a,0x3adadc56,0x3b006bd3,0x3b0bd045,0x3b11c8e0,0x3b10f9b6,0x3b00933a,0x3b05ce23,0x3b06c2d6,0x3b1787e3, +0x3afc1811,0x3af61d8d,0x3aef847e,0x3b131eea,0x3b138209,0x3aff7a7f,0x3af67ac7,0x3ac6dabb,0x3b151f23,0xb9b67c5d,0x3aa6fd63,0x390b16fc,0x39b40490,0x3a25cea0,0xba1073bf,0x39fd0756,0x3a55666b,0x398adc3f,0x3a906dec,0x3a49c7c7,0x39abdace,0x3a0a0ca9,0x3a6f2411,0x3abe28f8,0x3ac591f7, +0x394dcfee,0x3b26e7b4,0x3b2e84a5,0x3b5884a5,0x3b783c12,0x3b8471bc,0x3b744eb7,0x3b311814,0x3b2ecfd4,0x3b31f00f,0x3b68928b,0x3b2bd26d,0x3b22f978,0x3b1c5437,0x3b6616cb,0x3b677642,0x3b21bc5c,0x3b0757d2,0x3b0229bc,0x3b2c753c,0x3ac1a3c7,0x3a8b8252,0xb9cfab90,0x39e41a0e,0xb860d2c1, +0xbb1f66d2,0xbb04ad17,0xbb2e2fdd,0xbb4e33c6,0xbae83301,0xbab1ab0b,0xbadff3d2,0x394165e4,0x39f107ff,0x391a5e5d,0x3a59ff75,0x3a85d9de,0x3ae75f33,0x3b334624,0x3b650c66,0x3b99aeb1,0x3bad9521,0x3ba70af0,0x3b6dc6c0,0x3b820078,0x3b823f29,0x3bb1b705,0x3b4d076b,0x3b46edaf,0x3b475aae, +0x3bad5405,0x3ba6ce87,0x3b50aa7d,0x3b35cc16,0x3a03f6b7,0x3ab020c4,0xb92cd350,0xba1444a3,0xbb0fa435,0xba800099,0xbb19f572,0xbba07e5e,0xbb8a75d2,0xbb8ce4ac,0xbb25c0da,0xbb15f2ae,0xbae5fbd0,0xbb1c4a33,0x39ed3cc9,0x3a6fba36,0x3a050396,0x3b0e75f9,0x3b1498bd,0x3b63c734,0x3baca74f, +0x3be4ab94,0x3c141820,0x3c1fb050,0x3c0b0721,0x3ba683a5,0x3b947cde,0x3ba15766,0x3bf8ea16,0x3b96ef83,0x3b7d9ee2,0x3b862775,0x3bef7126,0x3be9b427,0x3b761270,0x3b015c51,0x3c246cc7,0x3be5467c,0x3bc1e45a,0x3ba3c486,0x3b43fb5a,0x3b9603b1,0x3bb563a1,0x3bad58bf,0x3b53326b,0x3a96df5e, +0x3a44a642,0x3965fbf0,0x3872c03b,0x3ac06f6f,0xb9c7db18,0xbae1ca82,0xbb9cfd48,0xbb937fa7,0xbbaf7af0,0xbba2e0ed,0xbb7eb5af,0xbb9e877f,0xbbcb1ee8,0xbb912d0a,0xbb108bc1,0x392164fc,0x3b9099ff,0x3b943f0d,0x3abf6fbc,0x3b0058fa,0x3b2b1773,0x3b5a976a,0x3b860ffc,0x3b8dcabc,0x3b50b673, +0x3c063a25,0xbb19a45f,0xba4b4cd3,0x3aa3634a,0x3b1d9bb7,0x3b7cc392,0xbb733222,0xbbd59136,0xbb7ea6dc,0xbad41fc1,0xb9bf2cdf,0xb9d09a36,0x370ab580,0xba0c1082,0xbac0cf22,0x3954ecfa,0x3ac18c45,0x3ad2500c,0x3a8f2f38,0x3ac6ea7f,0x3b8ecf59,0x3bc65982,0x3bf4b245,0x3c083a09,0x3be74afe, +0x3b4ea909,0xbb0d28f5,0xbbc87eb8,0xbbd3ca1e,0xbb23cb0c,0x3b4e6b95,0x3b8ef117,0x3b0a3399,0xbb089456,0xbba75956,0xbba5ac1f,0xbb5c6ae5,0xbbac9409,0xbb0d3344,0xbbcc2f1f,0xbbc398e9,0xbb9b6d69,0xb8b6d5bb,0x3972babe,0xbac8e75b,0x39ef9b21,0x399a368a,0x390fe619,0x3804e3fd,0x39a269ec, +0x38d6bc72,0xba607caf,0xbac6504f,0xbae39914,0xba4a6dfd,0xba0db20d,0xbad8dbaf,0xbacbdd8c,0xbb10084a,0xbb4ffaed,0xbaaab8dc,0x3a631955,0x3b0be758,0x3be77135,0x3bf925fc,0x3bae0607,0xbb5a7b16,0xbb1c721b,0x3bf8f1e8,0x3c22793c,0x3c46423b,0x3c7cd965,0xba01c0cd,0x3bff1476,0x3b39f2cd, +0xbb043866,0xbac51450,0x38281904,0xb9ccf63b,0xba06be08,0x39c541bc,0x3914d518,0xb985aa5c,0xb89a4b28,0x338ff216,0xb9151983,0xb9e0a919,0x3912f63b,0x3a868965,0x3b171380,0x3b137a69,0x3b091d40,0x3b1e2399,0x3b7324e4,0x3b8a4894,0x3b84ce12,0x3b78a4aa,0x3b24905b,0x39b0062b,0x399d9828, +0xb8e9e56e,0x3a915797,0x39c6230b,0x3b083b27,0x3b9163ca,0x3c2f26c4,0x3c4e0c46,0x3c319af7,0x3c17d9dd,0x3c094b9e,0x3b93f79d,0x3a8938cc,0x3a9693dc,0x3aa23b51,0x39c8b006,0x38916e7e,0xb9f35e59,0x37375e9e,0x3914110e,0x392001af,0xb83398e0,0xb94dc873,0xb7898f44,0x39ed16d6,0x3a07a73f, +0x3a1daf7f,0xb926e849,0xba8656b0,0xba87052a,0xba8bc0df,0xba8dc204,0xb9f54be8,0x39c53741,0x3acda524,0x3b4a788e,0x3b46dcb8,0x3b44ee35,0x3b57e74b,0x3ab110da,0x3a4041a8,0x3a777077,0x3af0fe66,0x3b584d84,0x3ba12e76,0x3c0126bd,0xbaa23674,0xbb0bcdbe,0xbb69b888,0xbb02a748,0xbad64793, +0xba5816fb,0xb9da2148,0xb9d812f4,0xb93c8005,0xb9c6f496,0xba00913a,0xb9a8c208,0x398b5ff0,0x3a7b130a,0x3a7eb214,0x3a22c195,0xb96f4ce4,0xbabeae03,0xbb01cb27,0xbb01877a,0xba843473,0x39419e73,0x3aa38b15,0x3b40fa07,0x3b83dfee,0x3b974f45,0x3bab5234,0x3ba7946e,0x3b94e7f2,0x3b7f565b, +0x3b52f79f,0x3b361667,0x3a87e96e,0x389761f4,0xba31c3ed,0xba9dade4,0x3b2f4412,0x3b319f23,0x3b3c43a2,0x3b35df29,0x3b22a816,0x3b1973e5,0x3af6d48f,0x3ad3757e,0x3afbc218,0x3b21de91,0x3b41381f,0x3b3e27b9,0x3b1b5299,0x3b1fe0b6,0x3a9e1502,0x3a0b3486,0xb9c13864,0xb95c2726,0xb8e237b0, +0xb88041f2,0xb93f86b4,0xba0665c9,0xba5f2c82,0xba44905d,0xba23e8b0,0xba1900f8,0x3a1ec6b7,0x3ae37fc7,0x3b40a214,0x3b61a821,0x3b7d115a,0x3b8e9731,0x3b7aeeaf,0x3b60ae05,0x3b43ce55,0x3b38921c,0x3b2091d0,0x3b3131c0,0x3a943750,0x3b057986,0x3ad728f0,0x3ab6b259,0x3ae077b1,0x3acf8778, +0x3ac30374,0x3a97fdb1,0x3a209081,0x3a0d3410,0x392f06c7,0xb886474a,0xba0b3529,0xba1f1230,0xb9c85390,0xba5ac62e,0xbac6676e,0xbab9b942,0xbac9f97d,0xbaac4750,0xba9e4c15,0xba99c23e,0xba96a01c,0xbaa30eb9,0xba4772f2,0xb9b87797,0x393ff34b,0x3a2f52c3,0x3aa66894,0x3b03bfd0,0x3b04d3ea, +0x3b0f85ad,0x3b17af6b,0x3b2087cb,0x3a2102f0,0x3a6e9ad5,0x3a48f136,0x38f18fc7,0xbaacae1d,0x3a8e63ac,0x394f56ae,0xba8e7098,0xbab3dffb,0xbaca94cb,0xbae434bf,0xbb005023,0xbb0e62c4,0xbb1dda44,0xba0b3133,0x38d5ec09,0xbb1dbf32,0xba67fc0b,0xb9ce6c5a,0xba3a6f2d,0xba42b5ee,0xba43ae37, +0xba517257,0xba54cfb1,0xba5437bf,0xba6556d5,0xba1b3f4a,0xb9c8bae4,0xb93c9d4a,0x38c128aa,0x39a5e7c3,0x3a1f5c9b,0x3a131ca8,0x3a1a69d9,0x3a1cd738,0x3a289de8,0xb9b07d52,0xbab4a077,0xba821a31,0xbada4194,0xba044e59,0x3a947c39,0x3b446470,0xbaa4307d,0x3a278ba9,0x3b0d1955,0x3b2333cd, +0x3b1d99f6,0x3b07c90d,0x3b27bd1b,0x3b31a5cc,0x3b2c67f0,0x3a2ab754,0xba90ee0d,0x3b58a7ef,0x3a8124af,0xba019f99,0xbae54ca9,0xba96bc6f,0xbaaaacd4,0xba9a2a44,0xba942380,0xba973fe4,0xbab25b1e,0xbaa48e27,0xbaa41736,0xba83967b,0xbacb9574,0xbadb6c22,0xbae6bf2c,0xbaaf346f,0xba93298d, +0xba45c3d2,0xba917b18,0xbaa14520,0xbad541ac,0x3abc76cc,0xbad8b7c3,0xba8f7ca9,0xb9aa9e6d,0xba99a9a7,0xbb03b1e6,0xbae5a62f,0xbad06ecd,0xbac67cb3,0xbab9b72f,0xbaa8c825,0xbae467bb,0xb996ab55,0xb99762e2,0xba0fca9e,0xb9b1b6a3,0x3af96819,0xba722497,0xba68f3c9,0xba4b3fd6,0xba316974, +0xba108a39,0xba571cc7,0xbad0b33f,0xbac503c0,0xbab8eb08,0xba295582,0xbb000fa0,0xbb16de79,0xbb1a6f21,0xbaa2e1f8,0xba185db9,0x3559bc89,0xba600a14,0xba548c3a,0xba0c0d05,0xb9905023,0xba4e8518,0xba626880,0xb959dbec,0xba12b029,0xbb6242d8,0xbb0d63ad,0xbb52388c,0xbb8075ab,0xbb495308, +0xbac4f97b,0xbb457992,0xb9d74567,0xba7dc285,0xba4d95c3,0xb9b08950,0x388295e3,0xba0bd5a2,0xbac04e13,0xba865972,0xba47c0d0,0xb9c224b4,0xba173ff8,0xbadce4f9,0xba972a56,0xba9e1d19,0x38a0a99d,0xbb424ac4,0xbb656539,0xbb606c35,0xba92a34b,0x38a8cd9f,0x3a93583e,0xb89ad4fb,0xbae8a0bb, +0xba921597,0xbab317f2,0xbb27a750,0xbb59c920,0xbacd1dd6,0xbb1c7c15,0xbba04e54,0xbb7b7474,0xbb739c59,0xbb10f8a8,0xbae4f109,0xbae7f11a,0xbb3384e4,0xb9ce883b,0xba03cd76,0x38923234,0x3a56131a,0x3b0cf940,0x3aced9c4,0x3a0ced31,0x3a90d504,0x3aa7ed05,0x3aca3aa8,0x399228be,0xbb0bb3dd, +0xbb0a229a,0xbaa4fe34,0x3aa37776,0xbb42a803,0xbb8b1ff7,0xbb7b17ae,0xb976861e,0x3af6ea1b,0x3b2fb788,0x394ce5c7,0x3b76fd4e,0x3b7ef811,0x3ba897ba,0x3b92b412,0x3b81c89a,0x3b9cb282,0x3b9a0a19,0x3b8cb1c1,0x3b3b818e,0x3a8f5852,0x3a617299,0x39c28789,0x3981be50,0x3a918bcc,0x3791feee, +0xbad52864,0xbba42441,0xbbcd2d13,0xbbcd648d,0xbbf59477,0xbc1a3e7a,0xbc0d3cad,0xbc173d63,0xbbc29e3a,0xbb4f7c3e,0x399c186c,0x3aa25d2c,0xb9ec6682,0xbb8b586f,0xbb937e1f,0xbb9d5e40,0xbb9fb691,0xbb6fff40,0xbb1af573,0xbabdfd02,0x3b3e17fb,0xbb827c47,0xbb4b3dfd,0xbab0bf57,0x392d80be, +0x3af48357,0xbb7dceb6,0xbbbf67ae,0xbb5feecd,0xbab62549,0xb9cd7d7b,0xb9e5f86e,0xb8a8647a,0xb9b57dfa,0xbab54a85,0xb9aa3d62,0x3a0a6911,0x3a527382,0x3a1333cd,0x3af78baf,0x3b358492,0x3b052c4a,0x3b159400,0x3a08ab4c,0x3a8e99d3,0xba7f84e6,0xbb84e94e,0xbbd836d0,0xbbcb3af5,0xbb10febf, +0x3b174400,0x3b400645,0x3ab6413b,0xbb8c07a8,0xbbe3b264,0xbb99fa16,0xbb8dc0f3,0xbbc2b0b2,0xbab42be1,0xbb8bbe6e,0xbba00629,0xbbabbb93,0x389e2eaa,0x3a2def11,0xbab95a7c,0x3a3f4cfc,0x395c8ab4,0x3973d5f8,0x37f89aa4,0x399269fb,0x39736280,0xba413869,0xbb00bb5c,0xbaf9e37f,0xbaffeaf7, +0xbafdefa4,0xbb584e98,0xbb4da435,0xbb383975,0xbb6ddb54,0xbba0c32f,0xbbb9f68b,0xbbc9d37d,0xbaaa88fd,0x38d9233c,0xba44e44b,0xbc1c8f2e,0xbc35f7e1,0xbb94bc45,0xbb67ac3c,0xb93d7342,0x3baafe69,0xbb6f44b7,0x3b29ce9f,0x3bacc355,0xbb574287,0xbba4c711,0xbaf41a4b,0xbacb6b8c,0xba319528, +0xb93b251f,0x3804bc79,0xb99a17ce,0xb9061bda,0xb886a0b8,0xb8c60b96,0xb9da652d,0xb8cce876,0x3a295471,0x3ae07d6b,0x3ae36f65,0x3b1c55bd,0x3afd6fc4,0x3aa78de6,0x39deffaf,0xba3227de,0xba390f22,0xba5e78b9,0xbac363d0,0xbb0260aa,0xbb1c3629,0xba868c03,0xbab74a91,0x398b5e1d,0x3b17088a, +0x3b06d366,0xba41671e,0xbbda2b46,0xba4b017b,0xbb1d2693,0x3a4ddfd3,0x3b89e64b,0x3b0b1099,0x3ab25763,0x3a07d7ed,0xb92b5999,0xba3e7124,0x38dc71ab,0x394a2d20,0x399f366a,0x38c83855,0xb8a89118,0xb8c81d77,0x39c5a023,0x3a1b7df0,0x3a486567,0xb9aa4bb0,0xba49e011,0xbae35b9f,0xbaaacc31, +0xba37c92a,0xba083849,0xb8cf4571,0xb922ae10,0xb9f32fbc,0xba9aea56,0xbb0788f7,0xbb579b43,0xbb9159b9,0xbbb9508a,0xbbe6c1d1,0xbbf135f0,0xbbc646fa,0xbb9b8010,0xbb0dfd75,0xbb975b5a,0xbb9670a4,0xbb1318b5,0xbb2f7d02,0xbadf21e2,0xbac4de7d,0xba96c9c0,0xba5eec16,0xba41a64d,0xba3f10c1, +0xba5c1553,0xba2f0d78,0xb9998428,0x39ed4abd,0x3a07de80,0x39112908,0xba449960,0xbac35f87,0xbb00ddc6,0xbae449a8,0xbafb95b6,0xbad7e080,0xba4e3268,0x39f45efa,0x3acc75f9,0x3b170300,0x3b4b5843,0x3b6d24f2,0x3b7f717e,0x3b2f2b58,0x39e80eba,0xbb480132,0xbb6661e4,0xbb83b74e,0xbb8d0d93, +0xbb8b939a,0xb9a196c7,0x3a06da30,0x3aaaf5e2,0x3a68e9fc,0x3ac3e8ad,0x3aa24017,0x3a816442,0x3a20069f,0x3abee8d6,0x3aea6c9a,0x3b2cabd7,0x3b12d74f,0x3b2aaf4c,0x3b1d777e,0x3aba6304,0x39f61b1a,0xb951fdee,0xb9a7b5bc,0xb9f53f27,0xba9f3b72,0xbaadb863,0xba933d94,0xba9d5e55,0xba89abcc, +0xba72442a,0xba4c956c,0xb9cdbcd8,0xb89dcf93,0x39c8c443,0x39aa1e1c,0x3a1567ab,0x3a2adc60,0x3a1a9954,0x39a45e91,0xb874c11d,0xb7a7a57b,0x3ac7d43a,0x3adcbde9,0x3b38e3eb,0x3ac1beb2,0x3ad8a946,0x3acc7bc4,0x3a9e524f,0x3a9f49f4,0x3a2c9fda,0x39353f6a,0x38966778,0xba09f14a,0xba530da1, +0xba7ea6b9,0xba555cad,0xba5ab369,0xbab146ca,0xbabd19c6,0xba9d874c,0xbae0ce3f,0xbab197e0,0xbab49b3e,0xbaa7c2d1,0xbaa2c212,0xba9e5a0d,0xba9d86da,0xba8d46e7,0xba84d003,0xba774b0e,0xba6c7eed,0xba6701ff,0xba4cb351,0xb9df45c6,0x38890812,0x3a13eeb5,0x3a8c5981,0xba28220f,0xba244f5a, +0xb9a8cb60,0x39f541d7,0x3abeb89f,0xba1732bc,0x39a6648f,0x3aa3e763,0x3a970ab5,0x3a9373cc,0x3a827f98,0x3a896e63,0x3a85f7e5,0x3a760cbe,0xb9de8c76,0xbab7dba9,0x3a09b400,0xba3bd47b,0xbac3a9df,0xbadfd5e7,0xbad56e0a,0xbade343d,0xbadcc1b8,0xbadf03ef,0xbadeb48f,0xbae0ca84,0xbadaa887, +0xbad4d5bd,0xbace877e,0xbac2ab67,0xbab79701,0xbab5bc21,0xba9aab0e,0xba8a7c4e,0xba751c05,0xba5f161f,0xbafa2bbf,0x3ace9414,0x3abb7ffd,0x3b18c55a,0x391ffb06,0xbaca230f,0xbb3add7b,0x3a6735f9,0xbaa300e1,0xbb4f7da8,0xbb45a72f,0xbb4a3305,0xbb4c22c7,0xbb4c6d60,0xbb46f692,0xbb4a86f4, +0xbabbe8cd,0x39e8a8f8,0xbb3a2e55,0xbab83029,0x37d750dc,0x3b08723f,0x3ac0c2c2,0x3ae4d575,0x3af9c82f,0x3b004a08,0x3afbfc29,0x3ad9c0ca,0x3ae3a797,0x3ae7713c,0x3b0aad66,0x3ad413e4,0x3aca4c6a,0x3ac53627,0x3af0df9b,0x3af26087,0x3ad29c93,0x3ad39c65,0x3abc8bdc,0x3aef9815,0xbb0ac88f, +0x3a3bb830,0xba851b6d,0xb9c475b0,0x398f4f92,0xba90745c,0x3a073e2b,0x39ff5238,0xba542275,0x39f0b6ec,0x39ae0a57,0xb9c2dd58,0xb9e70a73,0x37a00309,0x39c314b8,0x3a503b7b,0xba9b88c8,0x3b0908c0,0x3b297d67,0x3b39fd9c,0x3b5aa136,0x3b62c169,0x3b4e258d,0x3b0e0f01,0x3b096b3a,0x3b11b3b2, +0x3b569946,0x3b0825be,0x3aea05fe,0x3add7007,0x3b25da7a,0x3b29e8a3,0x3aec5003,0x3acaa7b1,0x3b0cf9f4,0x3b1db436,0xb7d8f0a5,0x3973db67,0xbaaece91,0x389e1952,0xb9a3a2ab,0xbb49a62c,0xbb12bd88,0xbb0e3a8e,0xbb89c199,0xbabd5942,0xbaf85fec,0xbafe7910,0xba7804c1,0xb9e8f4af,0xb9ad1bf4, +0x37b2ffd6,0xb912ff18,0x3ab67d18,0x3b385fab,0x3b4876fd,0x3b87183d,0x3b933ba4,0x3b8ae3ab,0x3b2f4417,0x3b473ae6,0x3b4b6ea5,0x3ba4737e,0x3b1254d9,0x3b002d00,0x3b0791d8,0x3b707965,0x3b71c585,0x3b1d4bac,0x3b0ba4e8,0x3a5ee093,0x3a7649d9,0xbac20c3d,0xbaa04376,0xbb44cd7e,0xba5e4aee, +0xbad67a14,0xbb968e18,0xbb3cb086,0xbb41e305,0xbad7d8d6,0xbac4a7c1,0xbaab6ac4,0xbb1386dc,0xb9724d3e,0x38becd04,0xba179144,0x3ae54850,0x3aa17be5,0x3b5f8bbf,0x3baf9a84,0x3bc75fc8,0x3bfce80d,0x3c03324e,0x3bd73cd8,0x3b57bb01,0x3b36bff4,0x3b795e9f,0x3bebe114,0x3b5ab536,0x3b026f66, +0x3b146734,0x3b94c914,0x3b98e883,0x3b18abfb,0x3a6976ca,0x3c2f4324,0x3bd5d475,0x3b8a8825,0x3b8b29b0,0x3b52500d,0x3b8876fb,0x3b93cc12,0x3b68e1cf,0x3b29c30c,0x3a8e91fd,0x3a536ba5,0x39f58e19,0x39e253ad,0x3a403df5,0x3a053c1e,0xb9a029dc,0xbb9cdb81,0xbb92696f,0xbbd39abf,0xbbc231c5, +0xbb817a07,0xbb9c1a71,0xbb915236,0xbb58538b,0xb9d8e86d,0x3b6ff06c,0x3bb37be2,0x3b9115fc,0x3aafe2e9,0x3adbe993,0x3b2211e5,0x3b66c25f,0x3b4fa6bb,0x3b80ee34,0x3b99ca66,0x3c0b8372,0xba344cd6,0xba458103,0xbab8c00b,0x3a1666fb,0x3b5838bb,0xbb3505b6,0xbb989a04,0xbb351d7b,0xba78a815, +0xb9f33d1c,0xb9cef483,0xb95dadd7,0xb96cd716,0xba7fc07f,0xb79b99f6,0x3a6c95c5,0x3a75ed13,0x39f1d66c,0x39fe2713,0x3b544e35,0x3bb8f6aa,0x3bd1ac76,0x3be3b1f5,0x3b9f4e0c,0x3a86f179,0xbb61205b,0xbbe32b6a,0xbbc4f75c,0xba0f91cb,0x3b6d3906,0x3b67b8e6,0x3a9a965f,0xbb7e60ea,0xbbcf2e3f, +0xbb9138cd,0xbb3da8b6,0xbb8ca372,0x3a60dd56,0xbb7f0cea,0xbb84ca90,0xbbc9c5fd,0x3a0c3823,0x3a438dce,0xba6095d9,0x3a4b373d,0x390a1dc0,0x39881119,0x38c45978,0x393964ec,0x39b18468,0xba08ce83,0xba8bffb8,0xbaf2c29e,0xba485f49,0xbaa1fd20,0xbaec3550,0xba950a53,0xbb1101ae,0xbb264fb2, +0xba4ad512,0x3ab5c25e,0x3b2ebffa,0x3c084147,0x3c046374,0x3b5973fe,0xbb30791a,0xbaa5a34c,0x3beb7f8d,0x3c03450f,0x3c1bd608,0x3c5632cc,0xba18d81c,0x3bd41632,0x3be3d669,0xbb855512,0xbbc87d09,0xbb853e22,0xba8c8d43,0xb9e3ecc2,0xb940b21c,0xb85d0d5d,0xb9858c88,0xb8fdb21d,0xb9033658, +0xb8c6c62c,0xb965152c,0x37d21305,0x3a0c6f90,0x3afe53bd,0x3b1492cf,0x3aec7c79,0x3b304330,0x3b7bae01,0x3b6c392b,0x3b41df16,0x3b0e7803,0x3aa25c2e,0xb973b879,0xba611f24,0xbab245f3,0xb9dac951,0xba1b725c,0x3b08612e,0x3be5e7fd,0x3c0c74a5,0x3bf2d8f8,0x3b72aef5,0x3b92e03c,0x3bbba379, +0x3b2f509e,0x3aad771f,0x3b2cc56a,0x3b0b41ba,0x3983f46f,0xb9807f4e,0xba040379,0x38ada68f,0x39642541,0x39584392,0x394e175e,0x388acd58,0x368ecb8b,0x39f0fca4,0x3a4c5626,0x3ab82346,0x3a2439ec,0xba2d4978,0xb9a4ab7a,0xb9a63e52,0xba00128a,0x398d7c85,0x39d22a86,0x3a6a0282,0x3ad665ae, +0x3a8bb870,0x3a2440de,0x39e5f862,0xba51e4bb,0xbaa96b84,0xba7bbe4f,0xb9569c61,0x3adc9ea1,0x3b6f74c1,0x3bb3df0c,0xba1d8057,0xbb260b25,0xbb86600d,0xbb3fc269,0xbb224ab3,0xbacf226a,0xba477b09,0xba526784,0xb9a012fc,0xb9e87962,0xb9f2056e,0xba28ed8d,0xb97647ea,0x39eb246c,0x3a4f60c7, +0x3a07725f,0xb979606a,0xbaaefa07,0xbae1dfa2,0xbae799a0,0xba7ba136,0xb9116ed7,0x3a427ad4,0x3b0448f5,0x3b402d31,0x3b649c39,0x3b8285f4,0x3b814bb1,0x3b5f6648,0x3b3dbcfc,0x3b0e1d95,0x3ab0125b,0xb81c7b07,0xba7a7094,0xba9b9a50,0xbaa2e405,0x3a75bf51,0x3a3df0a8,0x3a13f4ac,0x3a72916a, +0x3a2bef30,0x3a43e93d,0x3a04b3be,0x39c50023,0x3a4a8941,0x3ad93958,0x3b0292c5,0x3b24e834,0x3b0f1674,0x3b29cb46,0x3ab63ba6,0x3a59e9cf,0x388e71e2,0xb7fc3052,0xb9d3cf9e,0xb9833725,0x392a15d2,0xb928afeb,0xb989651f,0xb92faadb,0xb59b6f5a,0x38d0edfe,0x3a7c0cbd,0x3ae121b2,0x3b24c1c3, +0x3b360227,0x3b44604d,0x3b5a62c2,0x3b2ceeb3,0x3b042a50,0x3aa91c75,0x3a7b517f,0x3b3c032f,0x3b43755a,0x3ab55c90,0x3b1f6a72,0x3aef0fc4,0x3ad8f871,0x3b08e7a4,0x3b01d932,0x3b06cb73,0x3ad7f92d,0x3a73bf4d,0x3a87dc5f,0x3a60219b,0x3a156dfe,0xb8b4f6cd,0xb88809c7,0xb7f67337,0xb9ad7e29, +0xbab89129,0xba4b6a99,0xba64ced1,0xba4d52ae,0xba3424a6,0xba376ead,0xba3777d2,0xba529592,0xb94bb250,0x3999c3aa,0x3a594d5e,0x3aaa74c8,0x3aef02e3,0x3b208def,0x3b1fbee1,0x3b26f44d,0x3b2c788f,0x3b35ecb1,0x3a6cc3ec,0x3aa48092,0x3980dda0,0xba12ea35,0xbaadb796,0x3a40cc17,0xba03e4c7, +0xbab6d839,0xbad758ef,0xbae7aa6b,0xbae952cb,0xbb062035,0xbb12fcce,0xbb19968f,0xba91a857,0xb8856f7b,0xbb24da1b,0xbac1e774,0xba3864fd,0xb74e41ca,0xb9809c14,0xb95aa834,0xb985c7b3,0xb988d7b3,0xb981c146,0xb9a6ca7a,0xb88d2771,0x38dd0959,0x3996e11b,0x3a08abd6,0x3a3b2751,0x3a7aeb4e, +0x3a6f6b10,0x3a786b4c,0x3a7fc2d5,0x3a7dd8f3,0x39098d0a,0xba3b2b79,0xb9f2b178,0xba96ba18,0x3a8d6ac6,0x3b161631,0x3b12a489,0x39a3e021,0x3af6e326,0x3af85f10,0x3b175c3a,0x3b0fa6ad,0x3aca9bf2,0x3b0a76cd,0x3b10c1c9,0x3b01eea1,0x3aea5e15,0x39c79de9,0x3b1fbef0,0x3b065906,0x3a88c86a, +0xba9a8ce0,0xba0ba544,0xba1d6af4,0xb9fb3f42,0xb9f35a41,0xb9fb3c39,0xba225e1f,0xba17d7eb,0xba187333,0xb98f7c1e,0xba542442,0xba69e880,0xba7c2131,0xb9f4ca4a,0xb9a45dfd,0xb986ffb4,0xba024ef0,0xba5ee4a2,0xba1bd57c,0x3b0786f7,0xba5748f1,0xb94dffd8,0x39cedcb7,0xb99bded4,0xbaa53297, +0xba56d40b,0xb9c79237,0xb9b991f1,0xb9809bbc,0xba00914a,0xba44632a,0x38c4406c,0x3687e426,0x39e37603,0x392d7dad,0x3b140f59,0x38db561b,0xb932e1ca,0x3974091d,0x3984588b,0x39563538,0xb92f8a07,0xba50c9b9,0xba646990,0xba2c48d0,0x39cd6e5a,0xba6a046f,0xba92dc52,0xba906504,0x3950878d, +0x3a187f94,0x39a5e3b8,0xb98e4b46,0xba1e01e0,0x39ab0ead,0x3a80e999,0x381bd18c,0xb9d87813,0x39e76595,0x3792b8e6,0xbb51e268,0xbab12943,0xbb2ae8b1,0xbb649b57,0xbb30f988,0xba92f6e3,0xbb1dd272,0xb9a6533a,0xba5c55b1,0xb9775b6c,0xb7ddf9bb,0x3a693e16,0x39eaf272,0xba1dcd6e,0x394ed8a3, +0x3a06f5e9,0x3a3e6f7b,0x39ffdd52,0xb9aba578,0xb9477f29,0xb969dba0,0x3abb546f,0xbac4025d,0xbae0d9f2,0xbad52745,0x3a8e6939,0x3ae05a34,0x3a95318e,0x3a0c8449,0xbafab186,0xb9dd3d1f,0xb9bfdf12,0xbafe62b4,0xbb5a1f1e,0xba69e82a,0xbad67d24,0xbb8f103c,0xbb28cf0b,0xbb187a2e,0xbac4f308, +0xba726514,0xba9bfd4f,0xbb2742f8,0xba742acf,0xbaaa4f4a,0xb881fd8a,0x39e693ed,0x3b1a98c2,0x3b1d017f,0x3acdbd71,0x3b385dc7,0x3b450714,0x3b394340,0x3aa271fc,0xba8296eb,0xbabe1c18,0xb92f969f,0x3b442c08,0xba6ab92f,0xbaf60af1,0xbaa9fe10,0x3b3834a2,0x3b73832e,0x3af29ae6,0x3979625b, +0x3ba74455,0x3bc17aac,0x3bdfae74,0x3bb66943,0x3ba22618,0x3ba28276,0x3b82e94d,0x3b35b2ec,0x3b141766,0x3a6c42a7,0x3a583829,0x39d9b900,0x3a08b3d2,0x3a1a053b,0x3a7c3004,0xb8dab89c,0xbb87588a,0xbbb10c9a,0xbba5dc64,0xbbc21be9,0xbc092a24,0xbc0384e2,0xbc0c072b,0xbba3fb7b,0xbaf97f78, +0x3b0b0268,0x3abb661a,0xba7b1e9a,0xbb8c8e5a,0xbb83352d,0xbb4a8875,0xbaa703bd,0xbac1c1cd,0xb94aefa7,0x3add3b96,0x3ba37b3d,0xbb8780f4,0xbb221bbf,0xba93bf58,0xb9a3f373,0x3b12006a,0xbb1c6dce,0xbb842e63,0xbb082422,0xba37dc01,0xba0159d9,0xb9be48a5,0xb9921839,0xb909d43c,0xba628b6f, +0xb9f087f8,0x39b7e5db,0x3a74f45d,0x39484985,0x3ab34b66,0x3b2181b8,0x3b37e27b,0x3b7efee6,0x3b26e408,0x3a92ba5d,0xbaceec05,0xbb854f35,0xbbd91d9f,0xbbaccc09,0xb972c839,0x3b3d5687,0x3b3fb983,0x3b055b9b,0xbb6093e6,0xbbc24ba9,0xbb87c8bf,0xbb7eff7e,0xbb764f14,0x3b05ff4e,0xbafa254a, +0xbb647d6c,0xbbad4106,0x3a0c7088,0x3a8c2245,0xb9c7b99c,0x3a44058b,0x38dfa1b5,0x39988ad4,0x38fa1474,0x39108dd7,0x39b2ff82,0xb92f7e84,0xba9cfe37,0xbaa9cb63,0xbaa7d406,0xba5963cf,0xbb1545c8,0xbb47059f,0xbb31b99e,0xbb469c04,0xbb61b96c,0xbb48ab91,0xbb1676f5,0x3b1ed1f8,0x3b0053bf, +0xbb138eee,0xbc0bd525,0xbbfaae39,0x3aadeccf,0x3b1c3fd5,0x3ba047ec,0x3c0f2a41,0xbaa075aa,0x3b6a436e,0x3c10b91a,0xbb8e9f5b,0xbc0adbbb,0xbbbb2a71,0xbae82234,0xb9ebcc99,0xb9ed53f7,0xb8be496c,0xb991c4ba,0xb927b2d2,0xb927b13f,0xb8d05501,0xb93d5535,0xb8e5936f,0x39d777f7,0x3ad1f6d7, +0x3af258b9,0x3b34b869,0x3b1ad178,0x3ada9db4,0x3a8c6a3d,0xb8e72514,0xb9c41be7,0xb9edb6db,0xba3f449a,0xba8ffda7,0xba980340,0x380b3404,0x39d91695,0x3b29eb50,0x3bba7175,0x3b899626,0x3a296a18,0xbb99d73a,0x39169568,0x3acc3e07,0x3b807465,0x3bcc2b4d,0x3ba08e25,0x3b494d6b,0x3a7d8d3a, +0xb937d803,0xb981d8ba,0x3999dd88,0x3982a8ea,0x39a360db,0x397fe813,0x39179d84,0x38b67868,0x39e73adb,0x3a627846,0x3ab54dca,0x3a8a9e3f,0x3a7a5f44,0xb9b0994b,0xb9bde206,0x383a3650,0x391dff6a,0x39e5a79f,0x39e212d1,0x3a0b1a4f,0xb9cb3ef5,0xba89ef72,0xbadd2fe2,0xbb56b5b9,0xbb8ba850, +0xbba1e705,0xbb7d20b2,0xbad0c029,0xb9cffdfa,0x3b054187,0xbb09bfdb,0xbb080ef5,0xbabe838e,0xbb0677b9,0xbacb9eda,0xbaa93d3d,0xba94865d,0xba5afc45,0xba2710b0,0xba10694a,0xba44ad17,0xba33abe4,0xba07e571,0x37a3f39c,0x39f121fd,0x39f81e41,0xb8c8c939,0xba8c2f90,0xbae1cbd0,0xbad0e634, +0xbaf47e3d,0xbad4aa62,0xba5c2874,0x3a2d5efd,0x3adf9a77,0x3b1336b7,0x3b257472,0x3b1f0179,0x3b08906d,0x3ab25558,0xb9487526,0xbb361f64,0xbb6ca50e,0xbb7fa160,0xbb5b92a2,0xbb1c3110,0xbacac942,0xba2c6936,0x3a1960c6,0x39afff82,0x3a6ceebd,0x3a1fc60b,0x39b06a4c,0xb8a91d26,0x3a5cda4d, +0x3a8e06da,0x3b0c1b78,0x3ae0e357,0x3b1b2411,0x3b1a1793,0x3adb6252,0x3a622f50,0x3a00fe6f,0x399e990a,0x3985ac98,0xba3ac307,0xba6bd3d0,0xba1369c1,0xba2a2a60,0xb9ea3d82,0xb9910b5b,0xb7f3d856,0x39d13aa5,0x3a58f244,0x3aab21aa,0x3a8d0344,0x3a81e0a7,0x3a689706,0x3a0419d9,0xb8927172, +0xba83873d,0xba88844e,0x3b0b7606,0x3b1991b1,0x3b520326,0x3affe7cb,0x3b149ddc,0x3b09564d,0x3aee874a,0x3af9943a,0x3ac2898e,0x3ab4385b,0x3acd38eb,0x3a9024e2,0x3a47e8de,0x3a4e5e17,0x3a21f3e4,0x39a23528,0xb8f65f8b,0xba18e0f2,0xb9fa42ba,0xbaa665c4,0xba894965,0xba8615e8,0xba7aebf5, +0xba6e264a,0xba67ca05,0xba6bdbdd,0xba3db7bb,0xba183d30,0xb9b850e6,0xb8d3074c,0x39453b24,0x3a079533,0x3a33c69d,0x3a880d0f,0x3ab5e5e2,0x3af27fa1,0x36b6fd58,0xb8a64ac5,0x3a5a2c4c,0x3abe59aa,0x3ac1cabb,0x3a14f7cc,0x3aab0769,0x3ac07c73,0x3abd89fd,0x3ab8e279,0x3a9cf11a,0x3aae8182, +0x3aafcc04,0x3aa8f29b,0x3a816c3c,0x389adc4f,0x3a49a822,0x3a03482c,0xb965fa33,0xba908210,0xba727476,0xba81a03f,0xba81af7c,0xba83f23b,0xba840a39,0xba87e71f,0xba7055a2,0xba577f5d,0xba438e00,0xba25ead1,0xba0e3700,0xb9e9355c,0xb9a7448e,0xb9647d8a,0xb907f72f,0xb8e29984,0xba6b3476, +0x39b39967,0x39da6161,0x3a88e455,0xbaa6d64b,0xbb011327,0xbaa40f90,0xba4ad1d9,0xbaf009b3,0xbb0440c8,0xbae49e3e,0xbae7ac04,0xbae413cf,0xbadcab6b,0xbacdb499,0xbac148d3,0xbb068727,0xba9c39e7,0xba892194,0xbaf07589,0xbab03c6a,0x3a5068b3,0x39c782b2,0x3a007523,0x3a284abd,0x3a23127c, +0x3a16d04f,0x39c39476,0x39dc3f00,0x39eb45b1,0x3a5e5e66,0x3988f475,0x39269b85,0x39075070,0x39dd1f58,0x3a05518e,0x3a0397a5,0x39f04015,0x39f43c43,0x39a2ef24,0xbb035b9a,0xb9f8f171,0xbadeca92,0xba4e4a5f,0xb9d74530,0xbad944bc,0xb94ac118,0xb9e5b509,0xbae9bc13,0xba37764f,0xba1af137, +0xba9f05ef,0xba90470c,0xba4b3976,0xba2776ac,0xb937d234,0xba8c76f8,0x3a1da616,0x3a9c28ce,0x3a93aa25,0x3ac57e2b,0x3ab7cbc6,0x3a8f8b66,0x39bf2808,0x398cb8a7,0x39f8587c,0x3ad56e61,0x39701bcc,0xb9233098,0xb92c5527,0x3a0d9116,0x3a5170d6,0x3a24520f,0x39b0f54e,0x3aa33bc7,0x3a9b5f5b, +0xba929702,0xba3759aa,0xbadf178e,0xb981e358,0xba0f4407,0xbb5cad25,0xbb0ad725,0xbaf9d33d,0xbb924f69,0xbad7f6c0,0xbb05c1bc,0xbb0d4007,0xbae376f4,0xbabdac28,0xba23a87d,0xba42c810,0xba6d5bb7,0x39c11891,0x3aa31d40,0x3aa16178,0x3b0064d4,0x3afe7aa2,0x3ad9bddf,0x39d98a94,0x3a3f5104, +0x3a4daccf,0x3b3c52f0,0xb98fadec,0xba3683b1,0xb9ded63b,0x3a6a74f0,0x3abfb675,0x3aafa328,0x3a796689,0x39a301f5,0xb7f77df6,0xbb10e5b0,0xbb06cd6c,0xbb609be6,0xba64d519,0xba902ad7,0xbb6e80a9,0xbada7f97,0xbad5678a,0xba316d54,0xba225759,0xba4e7b06,0xbaeec78e,0xba6a2bfc,0xba8572a6, +0xba8cb46a,0x3a45e541,0x3a095d47,0x3b1cda00,0x3b5cd771,0x3b5ee090,0x3b89c6d5,0x3b7805e4,0x3b126b28,0xb9a02e07,0xba2c0231,0x3a670689,0x3b951414,0x3909bb68,0xbac33a46,0xba6b0508,0x3a90c158,0x3afd4d5c,0x3a9d53db,0xb8cea8b1,0x3c09b9a3,0x3ba5b492,0x3b471c86,0x3b6632ff,0x3b6fa3ab, +0x3b774122,0x3b51b3bc,0x3aeab185,0x3add1619,0x3a1257f7,0x3a14189a,0x3995cfa5,0x3a0a9ff2,0x39732c8a,0x3a88d8db,0x3a46cddf,0xbb8635b6,0xbb9440e4,0xbbd310cb,0xbbd2e4c1,0xbbb47088,0xbbb7b8c9,0xbb82ec7a,0xbb2c89d1,0x3a666844,0x3bc8ca20,0x3bb24769,0x3b42f9d8,0xba36ec8c,0xba19ed49, +0xb8b78df6,0x3a5fe2e9,0xb90283d1,0x3ac29823,0x3b972646,0x3be41408,0xb9ad2f40,0xba8fef51,0xbb49cb90,0xba8754e7,0x3aff10cd,0xbb05a40c,0xbb43cd22,0xbab1a32d,0xb9d87a30,0xb9d0d55c,0xb969732d,0xb982ba8b,0xb8ec125a,0xba00cbc2,0xb9bb9432,0x3930be3a,0x39be11a6,0xb937abc7,0xb8c5b7c0, +0x3add5596,0x3b657270,0x3b717a1a,0x3b5b94c8,0x3ab6d486,0xbaccca80,0xbb989139,0xbbea7d52,0xbba4962e,0x3aa16fec,0x3b5e3996,0x3b1ce16c,0x3a408c90,0xbba9f7c9,0xbbe73831,0xbb76e214,0xbb38bce5,0xbb1b5ebd,0x3b60bf71,0xbad25f90,0xbb2700ff,0xbbb4b14f,0x3a1b4cb7,0x3a3c0611,0xb6981b47, +0x39ed4a8b,0x38d3b98d,0x394b860d,0x390bae8b,0x38abeb94,0x399700c3,0xb8eb6e0e,0xba26bb57,0xbad0a59f,0xba43d40b,0xbab5eaef,0xbadd9072,0xba950148,0xbb0d14d3,0xbb040670,0xbac9d677,0xb931bf74,0x3aa0cbc1,0x3bcbc223,0x3bb1670c,0xb96d2742,0xbb84ac09,0xbb436b14,0x3b5d90d7,0x3b58bfdc, +0x3b9bdc1d,0x3bfec585,0xba011125,0x3af83861,0x3c0f635d,0xbb9d2e14,0xbc1a8935,0xbbf0f74e,0xbad52b50,0xb9905802,0xb99deb88,0xb8648671,0xb950348c,0xb8f7cf64,0xb91e66ad,0xb8f533e2,0xb8d98911,0xb905fed0,0x386e95e3,0x3aa536be,0x3b045ba3,0x3ae838d4,0x3b2af1cf,0x3b3896f4,0x3ae893e9, +0x3a3288c9,0xb9b9215f,0xba496c16,0xba931f66,0xbafe27b8,0xbb1530fc,0xbaea3a54,0xba16deb3,0x3b211673,0x3c040eff,0x3b469c9c,0xbae8f4bf,0xbbd6ab4b,0xbb439d42,0x3ab32556,0x3af7e2e3,0x3b793a59,0x3b9dd76a,0x3b3aceea,0x39fc00fa,0xb9a21081,0xb99acc26,0x396dfbb9,0x3935ea41,0x3966cfd7, +0x39808310,0x395e702e,0x382527fe,0x39d68c68,0x3a6a65cc,0x3aea46c5,0x3aac83a6,0x392f153b,0x39a0fd89,0x39b4a8a2,0x396fa161,0x3a526201,0x3a0fd798,0x399743bb,0x37c863cb,0xba9465e7,0xbb0332fb,0xbb34557a,0xbb608979,0xbb86f3c8,0xbb887c4a,0xbb6b95ea,0xbad10141,0x39544784,0x3a86bf56, +0xba62171a,0xbb2c82ee,0xbb5200ca,0xbb4c464d,0xbb2d3f4e,0xbb04391a,0xba8c710b,0xba80ae32,0xb9d82e99,0xb9e4cec8,0xb9e76991,0xba359c49,0xba0d9a15,0xb8a2bfeb,0x39d1476d,0x398cb7f7,0xb98cd8b5,0xba8f2806,0xbab8804e,0xbab36e21,0xba8f2edc,0xba68327c,0xb9b45e48,0x3a01235d,0x3aa03e34, +0x3ae2cd7d,0x3b0cb2f6,0x3b19df9e,0x3b0ebb29,0x3aec1551,0x3a5d4008,0xba76be7e,0xbad4b733,0xbb16ef4d,0xbb05cce7,0xbadbaf5b,0xba8de3cd,0xba9e1d63,0xbaa2abd8,0xba338c36,0xba12994c,0xb9d39101,0xb9e59907,0xb9f7cb10,0x38577a74,0x3a65b422,0x3a9bc33a,0x3ae23580,0x3ae9ad10,0x3b0ff8ff, +0x3aba39fe,0x3a7c9a62,0x3a014b0a,0x39351647,0xba008edc,0xba1786eb,0x39010dc6,0x389229c2,0x39823ce2,0x39e1ac9a,0x3a349663,0x3a7712a1,0x3aa4ecff,0x3abef9f5,0x3adbb26f,0x3abc6d97,0x3aa732c6,0x3a9ea92c,0x3a218d11,0xb83728f3,0xba64b7f2,0xba91415a,0x3b215450,0x3b20ea6b,0x3af15eff, +0x3b0e4f7e,0x3ae0d7c5,0x3ad9a5d5,0x3afa948e,0x3af5a361,0x3aff9ea3,0x3ace739a,0x3a8fa300,0x3a9c7ea1,0x3a9fb62a,0x3a85c3c0,0x39ededa3,0x39fd5701,0x3941067d,0x385f4f80,0xba66219f,0xb958699a,0xb8ecc063,0xb943191e,0xb8f4021e,0xb91b2c8f,0xb929223a,0xb9647edc,0x397dcddf,0x3a1a0684, +0x3a70ad69,0x3a9e950b,0x3ac2e11e,0x3ae88404,0x3aedf765,0x3afe2ce7,0x3b063379,0x3b130588,0x3a4bbe9b,0x3a83a1c6,0xb916147e,0xba03e738,0xb9691351,0x3941f867,0xba0fcc51,0xba11e11f,0xba2de151,0xba336f37,0xba18886d,0xba412a81,0xba59229e,0xba495035,0xba6ae980,0xb9851154,0xba96c968, +0xba9e91e3,0xba4b91b1,0x39bad3d7,0x38acf913,0x39027296,0x38edad69,0x38ed7a28,0x390a709a,0x38b17acf,0x395f7ef8,0x3998d69d,0x39c6eaad,0x3a0157b4,0x3a1993c9,0x3a34f6bf,0x3a3afecf,0x3a4939b8,0x3a5a8737,0x3a51d34e,0x39799d4a,0x3a383b4b,0x3a3c7cd2,0x3a23ee5f,0x3af49a2f,0x3ada036a, +0xb92a88de,0x3ad8f2fb,0x3ad117c4,0xb8e12138,0x39696996,0x38ee2756,0xb9ec21b4,0xb8dd1298,0xb8b7a46e,0xb99a4919,0x3ab1e5c3,0x3abda86f,0xb8d69b80,0x3ac51e05,0x3ae51a36,0x3a07a46e,0x3a3c5cf9,0x3a5bf8e6,0x3a813653,0x3a794754,0x3a750699,0x3a5b7b98,0x3a58632e,0x3a5adc95,0x3a9eaed1, +0x3a3b77d4,0x3a303415,0x3a2a5733,0x3a90b746,0x3a97e91b,0x3a64a0b3,0x3a594a85,0x39ea85cb,0x3a98448f,0x3a828c7d,0x39f932b4,0x39935f69,0x3a358583,0x3a298b4f,0xb9f57510,0x39fc8340,0x3a676227,0x39a2f54f,0x3a4a7725,0x39ce7604,0x3997cf76,0x39160b5d,0x3954b7cd,0x3a9b22ec,0x3a444d37, +0x3a986a7f,0x3ac67f9b,0x3ab009ef,0x3af55d91,0x3b05fb97,0x3aecae01,0x3ab696e0,0x3a6698c8,0x3a358a13,0x3a82720f,0x3b133233,0x3a8b3180,0x3a73deb3,0x3a86fa1d,0x3b112c38,0x3b12d41b,0x3a977fa8,0x3a797f3d,0x3a4d9471,0x3aeb1f0b,0x3acbe9ba,0x3a463146,0xb9a278de,0x3a52e167,0x39b7cddb, +0xbb272d62,0xba78f761,0xbae4a290,0xbb423e7e,0xbae28c18,0xba98b49a,0xbabe0465,0xba2c2b92,0xba43ef01,0x39ae5e82,0x3949f259,0x3a891892,0x3ab6acf5,0x3aa5841b,0x3b0929c7,0x3b36c476,0x3b307b8f,0x3b1f7c58,0x3ae68a8a,0x3adb7441,0x3adfb6bb,0x3b73a645,0x3a8b3032,0x3a91f350,0x3ab10816, +0x3b760a85,0x3b747b6b,0x3ae4046d,0x3ae65e2f,0xba1da545,0x3a400bdc,0x38fa8e72,0xba8921d7,0xbb38ba0e,0xb98b594a,0xba5f4b76,0xbb5078e4,0xbab00f8e,0xba88a50d,0xba4136e8,0xb9eae86c,0xba063089,0xbaea7f82,0xba8fada9,0xbac6806c,0xb99b89b6,0x39cdd37c,0x3ae62c08,0x3b416512,0x3b5e54ee, +0x3ba0519a,0x3bb95b31,0x3ba175e9,0x3b4ffbb7,0x3a8e998d,0x39d1c7ed,0x3b037e61,0x3bb89a9f,0x3b1208b0,0x3abf7b1f,0x3b160151,0x3bbf4ec7,0x3bb162b1,0x3ab92ae4,0x3a38181a,0x3c042933,0x3beda7a0,0x3bda3a84,0x3bb564f7,0x3b9d39fd,0x3b8b75d2,0x3b3eaf44,0x3ab6b999,0x3ab07b88,0x39a63a91, +0x3a12fc7f,0x3951b693,0x39f36f00,0x39629a56,0x3aaea815,0x3a9aee84,0xbb3cc51e,0xbb7b761d,0xbb850be1,0xbb86946e,0xbbae8831,0xbbb81994,0xbbacc4f4,0xbb29ae7a,0x3a50b8e8,0x3bab7cb9,0x3b829e94,0x3aae3726,0xbaec4bf3,0xba86565c,0x3a22b652,0x3b5ab867,0x3af4c836,0x3b51c7ae,0x3bc8f0da, +0x3c05f80a,0xbb0ff498,0xba309705,0xba47354a,0xb98ecc35,0x3b1b05e3,0xbaa20fc2,0xbb192bf8,0xba3f6198,0xb9dbac4b,0xb9959ef5,0xb95d43bf,0xb95a5258,0xb8dee033,0xb9b3a69d,0xb9ef25e0,0x392851b9,0x3a7926bb,0xb8b3d67f,0x39b5ae2b,0x3b017bbe,0x3b7e267c,0x3bb31f68,0x3baf1fe3,0x3b1649ff, +0xba894ccf,0xbb738276,0xbbc9b197,0xbb7897df,0x3b17394e,0x3b760197,0x3b47deda,0x3b1b430f,0xbb3650fe,0xbb9e75bf,0xbb551037,0xbb2e0e33,0xb9ea8ff2,0x3ba988bf,0x37fe0b51,0xbb016eac,0xbb86aca8,0x3a0882f9,0x3a56fd8b,0x394a81dd,0x39983bcd,0x39037129,0x391e3fda,0x39053e10,0x389a6136, +0x395b289a,0x39250b4e,0xb9a81456,0xba3c9be1,0xb8d339a2,0x39d5fc74,0xba0b7d87,0xbad7395c,0xbb027a55,0xbaea5026,0xba772a8f,0x3a9c091d,0x3b79768a,0x3bfcd1b9,0x3bb56516,0xbab98e07,0xbb90c0b7,0xbaba1c37,0x3c076ead,0x3c18c65e,0x3c2d6458,0x3c41321f,0x3b01073b,0x3b2fdb0c,0x3c0f034e, +0xbb8bc5bd,0xbc1c7831,0xbc05389a,0xbacab301,0xb95ad8c1,0xb99ba6fb,0xb8aeb678,0xb9219edc,0xb8fbed05,0xb90d7494,0xb8d41c6e,0xb8eec0e1,0xb905113e,0x38edbfc8,0x3aa6b53a,0x3b06969a,0x3b2bfadf,0x3b38578f,0x3b2cf754,0x3b173cf7,0x3ab3a8c1,0x3a2e3e79,0x39773652,0xb6cfe731,0xb914ba11, +0x38e8827f,0x3a35b782,0x3b2d1e91,0x3bab3b17,0x3c13f0f2,0x3bb3f864,0x3ad9b3ca,0xbab73904,0x3992e832,0x3bcdde24,0x3be6cd52,0x3bebbc17,0x3bee2772,0x3b862e23,0x3aa2c614,0xb8bb4cb0,0x389b59c1,0x3951c0a3,0x39161c78,0x39634a4f,0x396db322,0x393012b6,0x3907e2a4,0x39e21811,0x3a7ed9dc, +0x3af30146,0x3b18adf1,0x3b0b0cc0,0x3ab1ed63,0x3a73756b,0x3a5e8827,0x3a85d4da,0x3a9dc12f,0x3ab6a6c6,0x3afdc13b,0x3a6de451,0x3a02484c,0x3a0b3c42,0xba92fd42,0xbae6f20a,0xbabadb90,0x3a256c4a,0x3b53247b,0x3b913b61,0x3bc4d368,0x3a6ed2d8,0x39d6c479,0xba9d7b9b,0xbab5b106,0xbac0c4e0, +0xba897b57,0xba5860f4,0xba2b0e1a,0xb9a355e6,0xb9a04bd2,0xb9fc4a42,0xba10ec9f,0xb9ec2b5c,0xb93d40a0,0x39db4c8c,0x3a39a485,0x3a112403,0xba131016,0xba9e52a7,0xba9b3ff5,0xba926b17,0xba546cce,0xb98aa92e,0x3a91650a,0x3af84f9e,0x3b10ebd1,0x3b0ea8d5,0x3ae80ec3,0x3a91791b,0x3a8bdf9c, +0x3a200277,0xb9d95ab1,0xbac582d1,0xbaef929e,0xba8236ae,0x38fca434,0xbab493fa,0xba8735ed,0xb8f3b7fd,0x3882a7bb,0x39930de9,0x391c062c,0xb88ea227,0xb9a4a571,0x39a6fcaf,0x3a2d5f1a,0x3ab6a5a0,0x3aae4115,0x3addb0d4,0x3b010e74,0x3ad321aa,0x3aa2490d,0x3a8bac3d,0x3a606702,0x3a427a32, +0x39062f68,0x396be79c,0x39e991ed,0x39eb9943,0x3a3fd886,0x3a85978a,0x3ab44c47,0x3af08298,0x3b16b051,0x3b3292a9,0x3b1b9445,0x3b010b42,0x3ae191cf,0x3a8b8912,0x39b0126b,0xba564900,0xba7e56ce,0x3b2c4feb,0x3b37f91f,0x3b24414f,0x3b18fac8,0x3b1cf8b7,0x3b1043f1,0x3b16735c,0x3b1a6242, +0x3b1a68c7,0x3b231125,0x3b2c279d,0x3b2a6091,0x3b1db033,0x3b247653,0x3af4eaeb,0x3ac072ad,0x3aab0e78,0x3a2f4b26,0x391a8267,0xb8c77bbb,0xb8b778d4,0xb7c62317,0x37790bdd,0x3832ee33,0x382e613f,0xb65c1063,0x39984f38,0x3a12942c,0x3a79a0e8,0x3ab51ad1,0x3af7a791,0x3b1be967,0x3b1649ce, +0x3b1ab2a7,0x3b1dc991,0x3b2b8448,0x3a986a0f,0x3a96acb5,0x3ade0bf9,0x3ad099b1,0x3a19adc5,0x3ae21761,0x3ac9538a,0x3a3423b8,0x3a3113d9,0x3a25b472,0x39fb8138,0x3a0af2e6,0x3a052b37,0x3a05deac,0x3aceafa1,0x3acbc112,0x38a2143a,0x3a8caed4,0x3a876bf4,0x39d94444,0x39f58abf,0x39f3ed7d, +0x39ec17af,0x39e8de48,0x39eba691,0x39d55a5e,0x3a1a270a,0x3a3b5a46,0x3a549fd3,0x3a75fb71,0x3a87178d,0x3a9ea818,0x3a9c685e,0x3aa1ca26,0x3aa57043,0x3a9f3a63,0x3a6792d4,0xba762568,0xba275ca6,0xba4492c3,0xbaa0e2ff,0xb9fef1c9,0x3aac5963,0xbabb31d5,0xba2b8cce,0x3a02102f,0x3a62c7aa, +0x3a5f3aa5,0x3a3c26c4,0x3a79e548,0x3a882fb0,0x3a96c2d7,0xba66002d,0xbad6e836,0x3ad934ae,0xba0491e6,0xbaa4c8cb,0xba730f8d,0xba45c4c1,0xba59ca6a,0xba349a46,0xba4d8ca6,0xba589d8b,0xba730ba1,0xba6ebba3,0xba69a405,0xba03b8b4,0xba90cf53,0xba9ea7e6,0xbaa1882d,0xba7014dd,0xba46a269, +0xba1d57ac,0xba3ec025,0xba3ae185,0xba8af35c,0xb9260bc3,0xbaafcbcb,0xbab6e493,0xba08a85e,0xba4a612b,0xbae0042e,0xba6d147e,0xba89ddd2,0xbafa966f,0xbac3f476,0xbaa79966,0xbabc22b4,0xba909a55,0xba85be5c,0xba50b917,0xba39bad9,0x39ad9f04,0xba429c89,0xb9dfdd3c,0xba0b0ca3,0xb9be6ddd, +0xba3ead95,0xba88c540,0xbab9ff7f,0xbac22333,0xba9c5f90,0xb890b907,0xbac48323,0xbaf3ff37,0xbae5cbbb,0xba813a1a,0xba1b4ce5,0xb9e03ab8,0xba46cb3b,0xb8e3b9fa,0x35990397,0xba6f10ed,0xba80fabc,0xbaaad8e7,0xb9316b91,0xb9d3c8ae,0xbb3e7e53,0xbabd6110,0xbad7b00b,0xbb5b4cfa,0xbaee3c83, +0xbada9f0c,0xbafb91cc,0xbae9e325,0xbb03aa55,0xb9f6ebe8,0xba76ad7f,0xba39bb72,0xb9f1d39b,0xba2dd2e8,0xba0c4963,0xb92b9073,0xba1bf898,0xba640197,0xbac6d737,0xbaa82646,0xbaa42ad6,0x3a31c5e7,0xbb204ebc,0xbb3a87e2,0xbb20a5b5,0xba7bbc15,0xb81fed0d,0x39d4d656,0xb7625ba2,0xba593f83, +0xba3e470d,0xbadc2d78,0xbb1ad97c,0xbb51d177,0xba31b809,0xba2d0d52,0xbb1c9333,0xba560f0c,0xba10ece8,0xb983c788,0xb93d5048,0xb9a09d86,0xbaa05897,0xba9e61e0,0xbaf48ba7,0xba608aee,0xb98220b9,0x3a0695e7,0x3aa0ce02,0x3a6fbad7,0x3a7362cf,0x3a741dc7,0xb997e4a1,0xbaf9c51e,0xbb5be130, +0xbb5e12da,0xbaca443f,0x3aef83d0,0xbb2291e1,0xbb808883,0xbb433634,0xba1fa6c9,0x3a097fae,0x39a3b983,0xba369439,0x3baa235c,0x3b7aff82,0x3b5d43ef,0x3b648177,0x3b849da3,0x3b5becd7,0x3af82d8f,0x3a427d38,0x3a49cea9,0x391b56bd,0x39ab48c0,0x3863532e,0x39d15683,0x37fc153a,0x3a9cee7e, +0x3aab1cec,0xbb2c24e8,0xbb8b03b9,0xbba9ded4,0xbbc0fe69,0xbbe6369e,0xbbd0889c,0xbb906112,0xbb0b7b8d,0x3ad658aa,0x3be18a99,0x3b885315,0x3a16c9ff,0xbb567edc,0xbb58d0ed,0xbb402be4,0xbaf11bf8,0xbb47137b,0xba49899f,0x3b85255f,0x3baca2ba,0xbaacc73d,0xba9c0b65,0xbb3bd775,0xbade43cd, +0x3a434197,0xbaaa35ab,0xbaca7668,0xb99e0097,0xb9911b44,0xb926d6a8,0xb9006f5e,0xb8f46612,0xb8e811e3,0xb937e62e,0xb9fac77e,0xb9bcd213,0x397be914,0xba0d14af,0xb9338186,0x39b15845,0x3a922173,0x3ab00aaa,0x3956f14e,0xbab8e415,0xbb6bcaed,0xbbb6bc0b,0xbbde5d22,0xbb706abe,0x3b2eb82e, +0x3b33dad5,0x3a9df9d8,0x39ef4bf3,0xbbbb64de,0xbbe90022,0xbb627d5d,0xbb4aab86,0xba0a736c,0x3baf26c4,0x3a97bf34,0xba882d31,0xbb608618,0x399668ae,0x3a1f4b33,0x39097784,0x39252f48,0x38cc61a6,0x38b2ea11,0x38c3a91d,0x388e8e10,0x390dcf5d,0x394251c3,0xb94f2ee2,0xba60fa74,0xb9eac5e8, +0xba2569b3,0xba8a0ecd,0xbac5db1a,0xbb0986f5,0xbaec1bee,0xbb303d60,0xbb012758,0xb7829430,0x3b4e3277,0x3ad0a9aa,0xbb852cb5,0xbbbc643d,0xbb99cee3,0x39a9c027,0x3929fc6d,0x3acb492c,0x3b3a8844,0xb9b0828d,0xbb845bd9,0x3bd338ce,0xbb8f13f4,0xbc2833d2,0xbc0a9e57,0xbaf82e6b,0xb9175845, +0xb938dfd3,0xb8908347,0xb8f4740b,0xb8b13759,0xb8eaca26,0xb8d77d28,0xb8a48e56,0xb9513efe,0xb9439750,0x3a1f1cb1,0x3ad7d790,0x3b0cf563,0x3b17a739,0x3aae7539,0xb84ea4dc,0xbabcb8d1,0xbb1f7175,0xbb2a1498,0xbb0bc1e0,0xbb300d69,0xbb2465fc,0xbb1a1938,0x3a4ab281,0x3b5f0a67,0x3be9bf07, +0xbb23c797,0xbc19439c,0xbc5ec92f,0xbc134f83,0xbac8db20,0x3b5796f2,0x3bfdf2f0,0x3befea55,0x3b5efb68,0x3a93af0e,0xb9015f97,0x384d5a1a,0x39531771,0x38f5024f,0x39323484,0x3947cb9f,0x395689cf,0x38bedd67,0x39afcc67,0x3a72b6d1,0x3af1a9c2,0x3b08766c,0x3adb725a,0x3a8bc7f4,0x3a6d9215, +0x3a6df1a5,0x3a80c9ad,0x3a38d96f,0xb76cdc8f,0xba7e310a,0xbb233c09,0xbb6a154c,0xbb968837,0xbba5636f,0xbbc06fff,0xbbcc052d,0xbbb4a01c,0xbb7435af,0xbb295c92,0xbb19f3de,0xbaa53142,0xbaf7c876,0xba9af2c7,0xbb0d8c48,0xbaf1751b,0xbad08740,0xba83ec78,0xba45bf76,0xb9a6f28f,0xb98e46d5, +0xb9b5ffd9,0xb9ef7862,0xba05688c,0xb9a69eb3,0x39049890,0x396e09f2,0x37bb42cc,0xba17582c,0xba6d299b,0xba721c27,0xbaaaf029,0xbacaeae8,0xbab5345b,0xba626bd1,0xb9c719a8,0xb7fed6c1,0x3998e7a5,0x3a2d17e0,0x3a659d75,0x3a2fc522,0xb9c75ddb,0xbb35b54d,0xbb35d841,0xbb482665,0xbb201c6f, +0xbae57ec1,0xbb2815cc,0xbb16b49c,0xbae794f2,0xbac3f7a7,0xba6cf52f,0xba610329,0xba41dbf1,0xba42e6b7,0xb8c475a5,0x39973174,0x3a559760,0x3a5f97a9,0x3ab63d65,0x3acc887b,0x3abba0c6,0x3a9056e8,0x3a888c37,0x3a20e1c0,0x38840d30,0xba101e8e,0xb80a536e,0x39a615b9,0x3a24bb75,0x3a779210, +0x3aa7f040,0x3add5351,0x3ac1b881,0x3a9c67c8,0x3a6ee502,0x395fa679,0xb9a361d4,0xba4ff51f,0xba9206c0,0xbad3fda8,0xbb1b30b1,0xbb1df223,0x3ad078e8,0x3acd3c23,0x3b254cf3,0x3ad7ea49,0x3ae5d10d,0x3ae55bd4,0x3ad6f5ca,0x3ae023de,0x3ad6de82,0x3ac9c2dd,0x3ad589e1,0x3acbbe01,0x3ad84fa6, +0x3adbd556,0x3ab6d96e,0x3aa40690,0x3a3bbe69,0x3a1cecfb,0x39ab02b1,0x39b58b39,0x3a194ec9,0x39ef360b,0x39fe1f9b,0x39f7edce,0x39ed864a,0x39f5e88b,0x3a1af330,0x3a32b17e,0x3a43c63e,0x3a57a7d6,0x3a5e8ad6,0x3a4f57e7,0x3a63cf56,0x3a8294e4,0x3a927d86,0x3ab1ecfd,0x3a19460d,0x3a03e5f4, +0x39abbab3,0x3a376991,0x3ad12f2c,0x39856c24,0x3a15bb91,0x3aa505b8,0x3aace7cf,0x3ab442c9,0x3abb2175,0x3ac47aef,0x3aca496c,0x3add113d,0x3a0e63c1,0x3986f1c2,0x3a9bf0b3,0x39a07b62,0x382445d3,0x39f9ca23,0x39d28f4e,0x39d811e3,0x39e5f5c7,0x39e92fd5,0x39f2e5de,0x39efdbdb,0x39ed893a, +0x39e48fa0,0x39d78bbe,0x39cd05ff,0x39c2c71a,0x39b25856,0x39e09321,0x3a016dab,0x3a16abf8,0x3a0cadd6,0x39b6f8cc,0x3a8bae8c,0x3a820c60,0x3ac2a43a,0x3a6e5f96,0xb98263d4,0xbb044b73,0x3aa38e8d,0xb7daa6c2,0xbb008cc9,0xbae581e6,0xbaea10fc,0xbb0478c6,0xbb0171e8,0xbb0400bd,0xbb0597b2, +0xb9bba9da,0x3a57eeed,0xbafffa40,0xb97ac2f4,0x3a4aae8c,0x3aa758fc,0x3a867ad4,0x3aa22273,0x3ab76ef5,0x3aa9c27c,0x3aa5f12c,0x3a9c8635,0x3a9934cc,0x3a9c1b70,0x3acfdfda,0x3a91afc6,0x3a8cd532,0x3a8eba78,0x3abbe97f,0x3abc44d8,0x3a870dee,0x3a95a5e7,0x3a688d3f,0x3acafd4d,0xba5e47f5, +0x3a2f8027,0xb995fc88,0x39145595,0x3a210c8d,0xb9f962c9,0x3a4fd7f1,0x3a5bf365,0xb993d827,0x39caa0fe,0x39547843,0x39a54471,0xba08fb4b,0xb998561e,0x3a50c348,0x3a053639,0xba059f84,0x3acf3cd7,0x3ae8ea21,0x3b0ad01f,0x3b1fdaec,0x3b0269d9,0x3ad1ed22,0x3aa241ed,0x3a8e2aca,0x3ab97a14, +0x3b2c2106,0x3ac3a3ed,0x3aaef624,0x3ac032fc,0x3b17fb44,0x3b0e7fdd,0x3a6f8678,0x3a8783c6,0x3ab96bfc,0x3b08e492,0x3a3af941,0x39deccc9,0xba5ab90c,0x39e86536,0x38caea36,0xbb05c119,0xba877eee,0xba922e5b,0xbb20f8ac,0xba8ec8c3,0xbac4e81f,0xba6da034,0xbab908a9,0xba9d1f7a,0x39aeb345, +0xb91299b4,0x396b2d76,0x3a983c15,0x3b03413d,0x3b228d03,0x3b5f0566,0x3b3c36ca,0x3b2a0b07,0x3b054434,0x3b035f2b,0x3b08b8a2,0x3b869363,0x3ad7a4c1,0x3add3845,0x3b07f2c4,0x3b730925,0x3b63a414,0x3aad18e0,0x3ae6a9e1,0x39891ae0,0x3a74b15a,0xb9cead75,0xba622fc9,0xbb1efc46,0xb8a8a322, +0xb9c597aa,0xbaf0bf6f,0xb9de0fe4,0xb9a27086,0xb906f378,0xb9460bd7,0xb90d3357,0xba56fa84,0xba8747aa,0xbac5c41b,0xba1a7f4f,0x397b21a4,0x3a1bf8b1,0x3b1d949c,0x3b7c7d0f,0x3b9fc889,0x3bc1eccb,0x3b93456b,0x3b33dbba,0x3a94f377,0x3a4976ba,0x3b25897d,0x3bc2f753,0x3b357e70,0x3af788d9, +0x3b381fd8,0x3ba853cd,0x3b89759a,0x38ec1671,0x392d3541,0x3c155e67,0x3bca8728,0x3b9262e6,0x3b860c5d,0x3b66d1ae,0x3b3aa77d,0x3ac709db,0x39fee66f,0x39dd4e7d,0x38b95be4,0x395e94c4,0x386d5244,0x39901ebe,0x3684e2db,0x3a90d1df,0x3adc7bf1,0xbad86b6a,0xbb25f4e1,0xbb79951f,0xbb5f6fa9, +0xbb50b537,0xbb757d83,0xbb135ddc,0xba17cf52,0x3b3d7ad9,0x3beda4eb,0x3bb41fc3,0x3b2945af,0xb999f1f9,0x39832bf5,0x3aedacda,0x3b904920,0x3b1b83f0,0x3b845583,0x3c04fc78,0x3c159ac1,0xba2c1168,0x3a0734b0,0xba9842c6,0xba262d48,0x3ac2c169,0xba2aa501,0xba77e2ca,0xb91bc646,0xb948b947, +0xb8a9005c,0xb8be7c78,0xb8a7b8f6,0xb8c12f2f,0xb8c0f450,0xb9ccb6fa,0xb946b987,0x3a1d13b6,0xb9f95f74,0xba5c1ed5,0x3a4065ba,0x3b5f32b9,0x3b9d4904,0x3bb18852,0x3aec0368,0xbaf57071,0xbba46039,0xbbdb69f7,0xbb5f71ef,0x3b5824b3,0x3b3a63a3,0x3aa299e3,0x39e30a03,0xbb93f950,0xbbbe5754, +0xbb71622d,0xbb266ee4,0x3a92cc9d,0x3bd02baa,0x3ad06a7b,0xba236f78,0xbb3ac625,0x3933a040,0x39dbc35f,0x38b3776e,0x38c44d16,0x3878df3c,0x3866148b,0x3898a9cc,0x383a56ab,0x38c98c2d,0x3910eb98,0x3950b833,0xb9eccb22,0x3a27d706,0x3a65598a,0x3a1e715e,0xba0a2aa0,0xbae16af9,0xbab143e2, +0xb6981bee,0x3b4c6752,0x3be53b48,0x3c174af4,0x3bc126ca,0xbb0dfa84,0xbae401b2,0x3b1574e1,0x3c24cf35,0x3c3566db,0x3c36e76b,0x3c1ece3a,0x3b211d84,0xbaf1bb3c,0x3b697e34,0xbb8f4686,0xbc117997,0xbc0ab503,0xbac05d06,0xb900b07c,0xb8ae1194,0xb8832de5,0xb8600292,0xb885dd61,0xb8aa1dec, +0xb897459e,0xb84386fc,0xb939caa5,0xb9308ab9,0x3a067796,0x3ade5b76,0x3b01a081,0x3b23bbc0,0x3b2b20b3,0x3b0f921b,0x3aac2a9f,0x3895b5d3,0xba6b5415,0xbaa5c682,0xbab10957,0xba534649,0xba5b9677,0x3b462eaa,0x3bb4743b,0x3c0aa16f,0x3b238f78,0xbab090ad,0xbafb33e9,0xbb40497c,0x3bd9f4ce, +0x3bf7369d,0x3beac29e,0x3c050772,0x3b7283c9,0x3aab4fb8,0xb869ceb8,0x38f910a6,0x38b4026d,0x38872d6a,0x38eba03a,0x3915f9db,0x390d6272,0x38672a2f,0x397e7a78,0x3a56505f,0x3aeaaca2,0x3b39877b,0x3b23be33,0x3b0f8e22,0x3ac65169,0x3a8189fd,0x3a9ab8a2,0x3a8e6d6e,0x3a92d2ce,0x3ab27fa4, +0x390c37cc,0xb9bce259,0xb95f21b9,0xbab4c1a0,0xbad8a81d,0xba24565c,0x3ac3b4d9,0x3b697d99,0x3b9c2310,0x3ba28fce,0x3ae497d2,0x3a4f510d,0xbac98a24,0xbaa5944f,0xbac4c195,0xba81bd75,0xba25325c,0xb9f419d4,0xb8d28f68,0xb905eac3,0xb9710ad1,0xb9a5c7b3,0xb99f1263,0xb97f250a,0x396a34ce, +0x3a00d875,0x3a19a18d,0xb9b2e427,0xba5a6339,0xba911498,0xba669827,0xba1f0242,0xb9c87bc3,0x39c63d66,0x3a30f04a,0x3a359e49,0x3a27e105,0x39ae407f,0xb96d7a8f,0x3923ddf2,0x39dde2f4,0x39ece6a9,0xb99e17b9,0xba1f3abe,0x39141a71,0x3a614b5e,0xbacdaf4b,0xbae7ad3a,0xbaadae9b,0xba6ec210, +0xba632bcb,0xba3e9911,0xba33e9eb,0xba21ed32,0xb970c5b6,0x38fd725c,0x3a0c9105,0x3a294a5a,0x3a67cfa0,0x3a9ad171,0x3a9e737a,0x3a997d34,0x3a9bf13a,0x3a6c9fa3,0x3a20a197,0x39b9630b,0x3a4420fc,0x3a605743,0x3a81afd2,0x3aaac042,0x3ad99c40,0x3b06689f,0x3b110164,0x3b1a7de8,0x3b1eb285, +0x3affa6ad,0x3ab0e7ff,0x3a805a8f,0x39b9ffe0,0xb980692a,0xba9686aa,0xbab3a79e,0x3af3051f,0x3af4c6a3,0x3ab67b90,0x3ae60688,0x3ae4aae6,0x3ad71fb2,0x3afd0ad6,0x3b028926,0x3b11ce75,0x3b1eca05,0x3b23e7eb,0x3b33c44a,0x3b37e695,0x3b3f7ca7,0x3b133f05,0x3af920c6,0x3af1703a,0x3ab49ae7, +0x3a32d0d0,0x3a4015ba,0x3a254f6e,0x3a307b88,0x3a32f676,0x3a2ec560,0x3a22a910,0x3a1607dc,0x3a59f529,0x3a8fee0c,0x3abe0e99,0x3aef8370,0x3b1412d3,0x3b2b2f54,0x3b1c7663,0x3b1171a7,0x3b050371,0x3b02c456,0x3abb0879,0x3ab7b229,0x3ab8dd7f,0x3a7cc432,0x39059d7c,0x3ad48667,0x3a81f8c2, +0x39382695,0x393e2f45,0x392cc4a7,0x39018145,0x38f0c784,0x388fb4d3,0x390b09dc,0x3aa0638a,0x3ae95d08,0xb8dcfd51,0x3a701698,0x3aad44aa,0x3aa4bbf5,0x3a9ee9c6,0x3aa36c71,0x3aa1bdfc,0x3aa316db,0x3aa575c4,0x3aa16e6a,0x3ab3f8fe,0x3abeb3b9,0x3ac5cad7,0x3acede20,0x3ad49a1c,0x3ae8139d, +0x3adadb8e,0x3ad97e6c,0x3ad79ab3,0x3acb7f52,0x3ad841bd,0xbaac18e8,0xba78731e,0xbabef5ba,0xb9c17693,0x3a595ecb,0x3aff5a46,0xba7adf16,0x3a0f422c,0x3ac43b2d,0x3af4c32f,0x3af2692c,0x3acc9b67,0x3aeef259,0x3af293db,0x3afc3120,0x39a1ea75,0xba899cb9,0x3b16c57a,0x3a351925,0xb9d70862, +0xbad38d11,0xba9017ce,0xbaa00548,0xba8ee36c,0xbaa46176,0xbaa81160,0xbaa72260,0xbaa7ca1f,0xbaa62f1b,0xba76b49f,0xbabe84e3,0xbac74f11,0xbac53466,0xba9776b9,0xba8322d3,0xba741c6e,0xba88767c,0xba91d3d3,0xbaa2fbc7,0x3a88957c,0xbaac3ebd,0xba4b3fde,0xb92628af,0xba31b002,0xbaa788ac, +0xba80ca09,0xba80d6fc,0xbab7ef2c,0xbac80c1c,0xbaba59f2,0xba807530,0xba6f61fc,0xba808c75,0xb9b55638,0xba3fd414,0x3a9281ac,0xba8a4c8e,0xba88ded1,0xba82d729,0xba816a94,0xbad3245a,0xbafebee6,0xbb013eef,0xbb0083d1,0xbad2874b,0xba251741,0xbaf15090,0xbb0602ad,0xbaeaba32,0xba7231e7, +0xba23d7f7,0xba4701ab,0xba7ccfd0,0xba2b8812,0xb9810a9b,0xb8d5eb37,0xba3d3b04,0xba60f46b,0xb7ce1392,0xb9540905,0xbb06acde,0xba58bee7,0xba9ff23d,0xbb02d4c0,0xbae1dae5,0xbaab8b64,0xbaade28a,0xbacfd0ea,0xbb08ddb1,0xb9286dca,0xba5858a4,0xb9549895,0xba32b69b,0xbab5c9bb,0xba84d1d6, +0xba448e5e,0xbad256d7,0xbaf219bf,0xbaf0e9ba,0xbadd556b,0xbad84d2f,0xb9045ebc,0xbb317326,0xbb399511,0xbb13eed6,0xba07169b,0x396362b3,0x37de0dfc,0xb8b82899,0xbaac7601,0xba3f1e26,0xba40a310,0xbb01222a,0xbb25d629,0xb9de3582,0xb9c2495b,0xbaa1a161,0xb962cbd8,0xb8c05008,0x392852a9, +0x391b36af,0xb8ae04b2,0xba0a83d4,0xba8fb759,0xbb08b340,0xb9f00872,0xba60bf73,0x3a13f07f,0x3a01cc32,0xb97ab574,0x394c11cb,0xb905a05f,0xbb0d9884,0xbb7778f6,0xbb8718d3,0xbb793d33,0xbafa356c,0x3a3ceed9,0xbb2ee636,0xbb643054,0xbb0e3ba8,0x3a0b167a,0x3a8f0f43,0xb9955e22,0xba309d83, +0x3b84729f,0x3b6f80f0,0x3b884b40,0x3b685917,0x3b6d12ae,0x3b207851,0x3a6671f3,0x395c82ec,0x3982c852,0x37e98c90,0x37f44ea5,0xb89f9ebe,0x39558b0d,0x368fadc7,0x3a737239,0x3aaf086f,0xba86939f,0xbb59e7d0,0xbb702d2e,0xbb942388,0xbbe3a8ab,0xbbc7a1d3,0xbb8d8164,0xba946249,0x3b20f909, +0x3bd63ccd,0x3b3cf1ae,0xba932332,0xbb90b9a4,0xbb8e1033,0xbb6aaf0c,0xbae20110,0xbb4366f9,0xba11296c,0x3b9a7e61,0x3baa1c3b,0xbacf6741,0xba2ec531,0xbb00eb53,0xbacc6b6e,0x38d54276,0xba2364dc,0xba06131c,0xb872b941,0xb9026436,0xb81adf1c,0xb6f4c9a3,0xb70f2767,0xb8818ad6,0xb8b58db4, +0xb9ae6387,0xba0f73b7,0x3965522f,0xba385418,0xb9f35c41,0xba1001ad,0x36c19824,0x3a46aa44,0xb9ba8fce,0xbb0a8bf8,0xbb8c6cb3,0xbbc4956a,0xbbccb4ad,0xbb29b385,0x3b6395bc,0x3b007c96,0x39797f6d,0x3980fc75,0xbbad6a77,0xbbc9ce92,0xbb4062f1,0xbb2edcb4,0x3b0320c0,0x3bd641f6,0x3b429b75, +0x38cf965b,0xbb045928,0x38af4ddd,0x39b60ee6,0x372e850a,0x38ab3588,0x37d4b303,0x37859eba,0x37aca93e,0x384a387e,0x384e58c2,0x396496b1,0x38d9eb2d,0xb978ea3d,0xb7986560,0x39d76413,0xb8388a7e,0xbaae6505,0xbad91940,0xbaacebf3,0xbb19f9b7,0xbaa2a244,0x3aed60c1,0x3b23ee92,0xb9c0c293, +0xbbd152c8,0xbbc2c573,0xbb790327,0x3a82f41b,0x3afada23,0x3b3e847e,0x3ae3c1b5,0x3a86f853,0xbbe041bb,0x3a5e5694,0xbb8af7a2,0xbc0a07b3,0xbbfe631b,0xbade940c,0xb7e61286,0xb8af5180,0xb8529771,0xb81bc68c,0xb7e3925c,0xb82d9703,0xb8821419,0xb8561d11,0xb91aa81a,0xb98918bc,0xb8829e5d, +0x3a8608b3,0x3b0646dd,0x3aedbdf6,0x3a02e0ea,0xba2dbb6d,0xbb00742a,0xbb359b14,0xbb4705bd,0xbb1cc6c3,0xbb1d11d5,0xbac8b07f,0xbacb8c26,0x3b564fdb,0x3b9e4d78,0x3ba2d0dd,0xbba35851,0xbc35360a,0xbc536981,0xbc1b651a,0xba1d58cf,0x3bd2eccf,0x3c27f98e,0x3c0d5558,0x3b5d887d,0x3ac5a01d, +0x38055dcc,0x390b229e,0x38acdb40,0x383ea274,0x38870cbd,0x38a184b1,0x38f75e99,0x38ca45fd,0x39046950,0x3a29b2c4,0x3ab8f7ae,0x3b1ff261,0x3b3264b5,0x3ae6d3fd,0x3ac40e71,0x3abb75db,0x3a9976ad,0x3a86cfbd,0x39c99452,0xba0e3558,0xbb096f35,0xbb4b44c1,0xbb80e138,0xbb9c9dc2,0xbbb70ba7, +0xbbbb5c44,0xbb9a2103,0xbb581f73,0xbb285b28,0xbb2a3ede,0xba39997b,0xb9bf5b05,0xb64d361e,0xba847446,0xba85b1e2,0xba807af7,0xba3f1e5f,0xb9b95862,0xb8f76f03,0xb86e2c31,0xb91a6d7c,0xb918e110,0xb98975d2,0xb9a146eb,0xb845a13f,0x392b450a,0x3986ed09,0xb984c1a9,0xba4ff003,0xba5f0f44, +0xbab64bf5,0xbae74f6a,0xbaded5ec,0xbaacf52c,0xba91ac74,0xba8ebe50,0xba6e0ef6,0xba3d8d27,0xba1fb4dd,0xba22d9bc,0xbab1ce02,0xbb5b1336,0xbb459fe2,0xbb3ab000,0xbb00562c,0xba853275,0xbb523de3,0xbb3cd8c9,0xbb01a88e,0xbb00ad50,0xbaa833f4,0xbaa59ef8,0xba8ca9d0,0xba82822c,0xb9c99f1f, +0xb9995ff0,0x399562df,0x376df9e0,0x3a29d24d,0x3a2bf94c,0x3a764dac,0x3a53b5f4,0x3a89f275,0x3a3b897b,0x39e0cb8b,0xb9a04225,0xb81e5e9e,0x39e6cc2d,0x3a3d4f4d,0x3a936ef8,0x3ac7fa24,0x3b03b985,0x3ac98f22,0x3a8af074,0x3a13e691,0xb9ad347f,0xba8cd1f7,0xbaeaa238,0xbafb00a2,0xbb14833d, +0xbb3dfd8d,0xbb3ebcc8,0x39ebd6cf,0x39ce50b8,0x3af57324,0x3a3ccafe,0x3a9ed075,0x3aa500a5,0x3a89bc63,0x3aa17b8b,0x3a923f17,0x3aa9f0b1,0x3ae6761f,0x3adaf24d,0x3aebcb11,0x3b050dd2,0x3afee9b1,0x3ad7e955,0x3a948248,0x3a72a7ca,0x3a84dd50,0x3a170d43,0x3a542b18,0x3a36eab9,0x3a3330a3, +0x3a2f8b0e,0x3a2147b7,0x3a2bad16,0x3a07a0ac,0x39e4fde1,0x39c10add,0x39b14dc1,0x398fcc06,0x38997162,0x38a4ea77,0x38f1e905,0x3934c6d4,0x39b08669,0x39c7d298,0x39068f6b,0x3a36b12f,0x3aadf878,0x3b04f318,0x39f893d8,0x3aa356fb,0x3afbc93b,0x3b087b54,0x3b0e2d2a,0x3b0da4b0,0x3b1a602e, +0x3b219315,0x3b2b2874,0x3ac7f7b8,0x3a545b4d,0x3b0cd078,0x3aafd72d,0x3a49d032,0x3a112b8b,0x3a256084,0x3a20cb68,0x3a2a670d,0x3a2bf584,0x3a2f52e3,0x3a32a3c2,0x3a21c229,0x3a113ba3,0x39f29521,0x39c31c2f,0x399962d5,0x39640bab,0x399b99af,0x39b18e1c,0x39c8d33e,0x39ae9225,0x3a10329a, +0x3a2a6dac,0x3a314110,0x3ab0e70e,0xb9dd2d39,0xbad1c3de,0xbb11fe8a,0x38c29baf,0xbaacbfbb,0xbb1bd120,0xbb138554,0xbb10c649,0xbb0e7705,0xbb1834b5,0xbb1b4609,0xbb0e8c7c,0xbadcb6ee,0xb9d5a69a,0xbb081bab,0xbac6207c,0xba16ec94,0x3a858e53,0x3a2173c9,0x3a4e8655,0x3a781cb6,0x3a4899d3, +0x3a3f7d7d,0x3a3a7c69,0x3a3c0367,0x3a44c594,0x3a8dd28f,0x3a2cda5a,0x3a24bd57,0x3a387c96,0x3a70e8eb,0x3a741121,0x3a242d64,0x3a4c2e26,0x3a4ee3a4,0x3a86379d,0xbaed2265,0x3967a951,0xba7cb273,0xb9fd76e6,0x38e86d6c,0xba3ae6e7,0x39e71a5c,0x38c8876e,0xba954df9,0xba2c9330,0xba197149, +0xb9188ce2,0xbaa13197,0xba73bfb9,0x379276bc,0xb8e66876,0xbabd2456,0x3a3a237f,0x3a9cf3e6,0x3aa0cc1e,0x3accb4b1,0x3a69b26b,0x3a1a8cfb,0x3a044816,0x3a0eb1b2,0x3a686470,0x3aecce92,0x3a527010,0x3a298351,0x3a7023e6,0x3ab74141,0x3aa98d87,0x39ca23b7,0x3a25426e,0x3ac72397,0x3adaa93d, +0xb98fbc24,0xb9593fcc,0xbaa27a3b,0xb896101f,0xb9609862,0xbabd8b59,0xba82c1ba,0xba2440df,0xbaea2a46,0xba54a020,0xbad19868,0xba234d14,0xbafda70e,0xbae7758e,0x381888e1,0xba39313d,0xba411602,0x3957a260,0x3aba1954,0x3ac3bd2a,0x3b1aef4d,0x3ab0ad9e,0x3a92611f,0x3a722045,0x3a9982e3, +0x3aa91f4f,0x3b39b691,0x3a3fff56,0x3a4ba456,0x3ac78d9a,0x3b19b167,0x3b17f45d,0x3a647aff,0x3ab35a26,0x3a52cffe,0x3a331944,0xba78a74e,0xba80b696,0xbafd913a,0xb8cda0a4,0xb90635a8,0xba31fb2d,0x38c2dc74,0xb6d08e8f,0x39d9c7b3,0x39076894,0x3739eb6d,0xb8c7d142,0xba420236,0xbabae552, +0xba4c05ca,0xb95bde8f,0xba02f111,0x3a8f3715,0x3b2db9e0,0x3b3ef733,0x3b704445,0x3abdcfb0,0xb8af7096,0xba234f1e,0xb95129c9,0x3ad18ea2,0x3b84f912,0x3aa90630,0x3a12f05a,0x3afb898b,0x3b47c62a,0x3b193874,0xba0bb999,0xb9418c1a,0x3c0bc3d3,0x3b92a489,0x3b2f0627,0x3b2ad87f,0x3b156b46, +0x3ad11189,0x3a09daf6,0x383ce3e6,0x38ef3028,0xb850ceae,0xb8c7410e,0xb8a0b272,0x38cc7beb,0xb8429fbd,0x3a130665,0x3ac01ba3,0xba17fd52,0xbadf71a7,0xbb773b60,0xbb5f770f,0xbb26f47c,0xbb2c9c22,0x3868606a,0x3acea0b7,0x3ba4afa0,0x3c101ebc,0x3bcd2ec5,0x3b405560,0x396e8c92,0x3a124ca5, +0x3ad6688c,0x3b6c3cfb,0x3ad86b2a,0x3b742f84,0x3c0e723a,0x3c0f8a8e,0x3abedc36,0x3ad0282a,0xbabe1aeb,0xba49c70d,0x3a1ddbde,0xb96cc117,0xb98d865a,0xb7bc4f32,0xb84b44f3,0x3773c1e6,0x383be50d,0x37949269,0xb8123d0a,0xb759ff27,0xb98573a1,0xb9d35bc3,0x395069ac,0xba1a14c6,0xbabbecb6, +0xb9eccc92,0x3b078bb0,0x3b40b1a5,0x3b6b0225,0x3a2d0940,0xbb2906ff,0xbbb5c054,0xbbc1198b,0xbafe0156,0x3b982bed,0x3b32fcd5,0x39e11158,0xba16695f,0xbbb38ade,0xbbc2074a,0xbb369f11,0xbaa5e653,0x3b3fb84c,0x3bf21340,0x3b66c9d2,0x3a3a2956,0xbaf61e4b,0x393b4e10,0x39358073,0xb6511e1f, +0x37efebc3,0xb72f77af,0xb7b44fd4,0x36be4902,0x37413a50,0x383c83fe,0x388d63b1,0x39b932b1,0xb981e367,0x3a5a4eb6,0x3a6bcc68,0x3a9f2637,0x39f67216,0xba6d16ea,0xb9d48b3c,0x3a2918ca,0x3b77409a,0x3c03d36f,0x3c0698c0,0x3b921919,0xbb42986b,0xb8ee6ccb,0x3b6d5ed0,0x3c001404,0x3c0f1fce, +0x3c03b3c3,0x3b8f5666,0x3b123167,0xbbd61e88,0xbb594efb,0xbb82f83a,0xbbd13f24,0xbbdfb45a,0xba916124,0x37003369,0xb7bef0a1,0xb7287fec,0x37544290,0x36f756ec,0xb73bbd9b,0xb8294235,0xb711c291,0xb8b8f345,0xb97ae3c0,0xb94e9244,0x3a86d08f,0x3aa8a65f,0x3af8a90f,0x3afabf98,0x3aa469e0, +0x39dfcbc9,0xba4ef188,0xbaeeffe0,0xbb05c6e7,0xbb04d3da,0xba8f8cc6,0xbabc418c,0x3b81d93f,0x3bb37408,0x3bb8b472,0xbb214cdc,0xbbd362d4,0xbbc55c08,0xbbd65e89,0x3b69dd79,0x3be6c459,0x3bfd4052,0x3c014fd1,0x3b3e45c8,0x3ab29669,0xb880c356,0x3884161b,0xb784e8dd,0xb79a8a08,0xb71945ed, +0x38188516,0x388ae4d5,0x38276274,0x37e2a27c,0x39f92c4a,0x3ab615b1,0x3b2bfba3,0x3b1f1124,0x3b2d1f58,0x3b10cc8d,0x3acc8f8a,0x3ad2fd1c,0x3aa19f80,0x3a7dc97a,0x3a3298ef,0xba37da60,0xbabdcb61,0xbad9ba42,0xbb122cc0,0xbb1ded3e,0xbaaee950,0xb9b82724,0x3a0fcb69,0x3abd67ba,0x3a229e31, +0x3acc51d1,0x3a1fa411,0xba997801,0xba653022,0xba97ae78,0xba2f1d6a,0xb99b1b8a,0xb8eec3d7,0x38e924da,0x381ae699,0x38409338,0xb8c3dc34,0xb8e4a689,0xb92a4e14,0x384979b6,0x3976c0bb,0x39fa35de,0xb840c227,0xb9e63ceb,0xba37b8fc,0xb9f9fce2,0xb9f9bf71,0xba0a7207,0xb9fcc16d,0xba16c173, +0xba33d703,0xb9dec87d,0xb999e928,0xb9eebc69,0xb85a3f2a,0x396ebcf4,0x395a4b82,0x39119326,0x37817530,0x3a09059d,0x3a777d32,0xbadb784e,0xbb12be9e,0xbb1b4d90,0xbafcd215,0xbb021cfe,0xbad35bd8,0xbaac28a1,0xba83a523,0xba446bce,0xb9b47dfc,0xb934c7c1,0x3853e6b9,0x390399ef,0x39d0b876, +0x3a15b77f,0x3a4cd3bf,0x3a78b926,0x3a417048,0x39b28aa2,0x39fc5ef7,0x3a90a6f1,0x3a90734a,0x3ab16547,0x3ae0bca2,0x3b0bfb92,0x3b25d2ab,0x3b146874,0x3aff24f8,0x3acea257,0x3a862eca,0x39d7afa0,0xb7fcaef0,0xb9e568ee,0xba5f78a3,0xbabaef2d,0xbadd23b1,0x3a465bb9,0x3a1cabab,0x3906f28c, +0x3a69c320,0x3a51c1a0,0x3a5adc7c,0x3a9d3d3a,0x3aa5b1d4,0x3ad1daae,0x3adec978,0x3adec6c3,0x3b0833ae,0x3b1a2360,0x3b230d57,0x3b040862,0x3af92729,0x3af2a6fb,0x3ada08fe,0x3a5fbcad,0x3abc2d75,0x3ab1001a,0x3aad2153,0x3aaaf95b,0x3aa3d615,0x3a995fc4,0x3a98241e,0x3aa80030,0x3abcd15b, +0x3ad1dcb5,0x3ae49c4b,0x3af5b722,0x3af93b94,0x3ad752ce,0x3ab3e528,0x3a9190b7,0x3a7467ce,0x3ab3454d,0x3ab4dafd,0x3a498bff,0x3975ce5c,0xb8dd3255,0x3a93f200,0x39c01e9d,0xb89e3108,0xb81cd62a,0x377f3422,0x38de3bf4,0x389730eb,0x38282c04,0x391b4fd3,0x3a331aea,0x3ac31356,0xb86fa820, +0x3a1846d4,0x3a9bf5ee,0x3af64680,0x3add84b2,0x3ae62bbc,0x3ae66cb9,0x3ae89e2b,0x3aeb2e76,0x3ae8fd5f,0x3aed1681,0x3aebc5f4,0x3ae85c1f,0x3ae5ed3b,0x3ae32f8a,0x3ae90e38,0x3adc8665,0x3ad7ad28,0x3ad2a83d,0x3ac53e83,0x3b0342a8,0xba404515,0xb9f37ca4,0xba72f7a3,0x3a34bf86,0x3ab671fb, +0x3a8bc160,0x39070d95,0x3a9bbf8a,0x3a8f47f9,0x3ab2ddfb,0x3aadff1a,0x3a826cad,0x3a92ff6b,0x3a8e450f,0x3a97fdfc,0x3a6b6f1a,0x373f1cfe,0x3aa970ad,0x3a9c7ee2,0x3a18fe3c,0xba90ac5c,0xba1fb1fe,0xba2a12f2,0xba0a06bf,0xba40fd08,0xba424f9b,0xba28911e,0xba2514fe,0xba21e2ca,0xb9d4a11a, +0xba46f17e,0xba4ba05c,0xba3ac022,0xb9cfe3e8,0xb9a3e7c4,0xb9fd2ce7,0xb9fc8e09,0xba283451,0xb9c3eb03,0x3aaf12b7,0xba139ad8,0xb8b86f3f,0x394e24d2,0xb91febb1,0xb9f78e2f,0xb9d76485,0xb9a99366,0xba17e488,0xba834164,0xba89780e,0xb916a58b,0xba22f893,0xba35ad34,0x39bfae7c,0xb9ae9dbb, +0x3a8778c2,0xb9f66489,0xba1862a6,0xb9c26de6,0xb9cfb0c3,0xba9e253a,0xbac5466f,0xbaa24097,0xba8b2ced,0xba31374c,0xb769178b,0xba5dc83b,0xba65f75e,0xba07964c,0x3985a9f6,0x399366e2,0xb9ef2c26,0xb9ca1193,0xb99a1b32,0x39cadde9,0x3a5415dd,0xb8d636fb,0xb9cf1be2,0x392779a4,0x3790b2c6, +0xba8b11f8,0xb9b8f3ab,0xba3556c0,0xba747c5f,0xbaa17a7a,0xba89ab97,0xba1d9501,0xbab050d7,0xbae9417f,0x39687bd6,0xba094267,0x394dce1d,0xb9d135c8,0xba546bac,0xb9995b00,0x38c2e75d,0xba8f2145,0xbaa0d1f9,0xba29b7a4,0xb9d40eff,0xb9ac63d0,0x3a0ab802,0xba9875a9,0xba80a0b4,0xb980cd79, +0x3aaade3c,0x3ac20ba0,0x390e5033,0x3a089057,0xba886254,0xb880911c,0x3974ab34,0xba954470,0xbad53749,0xb9152736,0xb9326f6c,0xb9a98dbf,0x37dbf26d,0x39325a4b,0x3968bb62,0x39d73498,0x38cfed49,0xb88a3fbe,0xba1c1163,0xbae0255c,0xb9656477,0xba7a9191,0x39ae2aed,0x39456411,0x37901bc1, +0x3a52bec0,0x3a1e3ba0,0xbb0658ae,0xbb63b05f,0xbb396e32,0xbb0157c3,0xb981aec7,0x3a9efc30,0xba55384a,0xba731682,0x3a22c10e,0x3b3c0989,0x3b18ad27,0xba4675ee,0xb9bf58a2,0x3b918361,0x3b75a70d,0x3b9809c1,0x3b50625a,0x3b2671ab,0x3ab910ba,0x395b0b24,0x3895a314,0x3853719e,0xb8a4fedb, +0xb8b01330,0xb92ce053,0xb5be24a4,0xb614e9d9,0x39e4048d,0x3a86bf8f,0x39558406,0xbaf07166,0xbb145f34,0xbb3780f4,0xbba1a0d0,0xbb8b9ded,0xbb217c32,0x3a949e0a,0x3b9102fe,0x3be73f6d,0x3b65187a,0xb99a7295,0xbb2d7986,0xbb2b0602,0xbad2e1cc,0x3a3eff2a,0xba3c5e32,0x3abad363,0x3bcf1ea6, +0x3bcbe2fa,0xbabd65d0,0x3a225895,0xb954da87,0xba2be0c7,0x393b600a,0xb8fe7e5a,0xb96eab4b,0x368d029f,0xb80ae976,0x38152e6e,0x384f4810,0x387bc6c3,0x37a2c7f7,0xb820dacb,0xb937ee03,0xb9df6216,0x395e3285,0xb9e5fead,0xba1332bc,0xba4815e8,0x39a7c825,0x3ad00a82,0x3a902edc,0xba9e0e6f, +0xbb7a6f76,0xbbb9be71,0xbba37d6f,0xba812cd0,0x3b988b61,0x3b0b182a,0x36bccc98,0xb9ce36f5,0xbb9e8817,0xbbad0045,0xbb3ef6b9,0xbb0bacb2,0x3b374bd0,0x3be4dd4c,0x3b9b66af,0x3a4e3912,0xba9e20bc,0x397af472,0x391ba69c,0xb7b2c34d,0x37a3cac0,0xb7e818f5,0xb7e0476f,0xb80a1bc0,0xb65d5b07, +0x375500a0,0x38f99a5b,0x39189db0,0x3961c7ab,0x39ed0b21,0x3aba4e9d,0x3a8b2b14,0xba437193,0xba8ab701,0xba528b60,0xba57ae92,0x3aae099e,0x3bac1bca,0x3b72a0b8,0xb9aa3c51,0xbbd48d3d,0xbb6e745e,0x37b23fc0,0x3b8da9a4,0x3bcb86a3,0x3bc0fbe5,0x3abbd3d5,0x3ab85d58,0xbc03778e,0xbbe5bdbf, +0xbb8be70d,0xbbaca9e1,0xbbb66b6c,0xba6e44e8,0x389faf59,0xb8489a7d,0x37cadaaf,0x37b55798,0x37da4967,0x37c1782b,0xb58e0ebb,0xb790af6d,0xb879a9d1,0xb915f709,0xb9bbf917,0x39d8cdcb,0x3ad6fc0f,0x3a9f204b,0x38f2e0da,0xb9ed4651,0xbac08c68,0xbb0977fa,0xbb3589ac,0xbb27f391,0xbb0e53e6, +0xba24c925,0xb9cfdf4c,0x3baf952b,0x3bb924ca,0x3b0b4a91,0xbba0d455,0xbc087c51,0xbbff56d7,0xbbd9e704,0x3ae039e3,0x3c082503,0x3c26587b,0x3c00a9bd,0x3b36a9fc,0x3ab8d39c,0xb8db8a9b,0x384c0c0e,0xb84526e4,0xb8522b1e,0xb8071d51,0xb7f8d3d2,0xb6b040e3,0x3881b3a6,0xb7f0f6a1,0x39a8d4a8, +0x3a80faca,0x3b265168,0x3b62ad24,0x3b27f070,0x3b0aec43,0x3aeafad3,0x3aa0e54f,0x3a8705df,0x3a279a49,0x39748e35,0xba97423a,0xbaf904e9,0xbb101d2d,0xbb4932f1,0xbb59e084,0xbb340f36,0xbae255f1,0xba934327,0xba737e5a,0xba9ce123,0x3a47d507,0x3aab59ba,0x3a4d113b,0x3990ff11,0xb9473b0b, +0xb90f1d1b,0xb94d9dee,0x388066ee,0x38c321ab,0x39249998,0x382b827e,0x38c778c1,0xb75dfb9f,0xb8c73c6a,0xb8193c04,0x3981f3a4,0x3a28a684,0x398aec53,0xb9a4b5b0,0xba0adb0d,0xba7b7bc9,0xbaa559de,0xbab9a975,0xbaa639c5,0xbab36ec3,0xbacd4a10,0xbab5cfd7,0xbaab5850,0xbab06451,0xba9613b5, +0xbaa8665c,0xbb00f992,0xbad166f9,0xba941ccb,0xb954f8e2,0x3a2fe545,0xbb260a76,0xbb1ec110,0xbade5f46,0xbaf05ee1,0xbabe9be1,0xbab7eb98,0xba9870cf,0xba81f3e0,0xba0f976e,0xba111ffc,0xb9066548,0xb9cfc9dc,0x383646e0,0x3826a8ed,0x39ef7373,0x3a0d47d8,0x3a757da7,0x3a60f445,0x3a709ae6, +0x39d6ee0e,0x39beaff7,0x3a36defa,0x3a52ceb1,0x3a9a910c,0x3ac7f114,0x3af9f996,0x3aba6370,0x3a7e0fc0,0x39fe7397,0xb9243529,0xba467e9b,0xbaacebc3,0xbab451c1,0xbad0a3ac,0xbb07e9d1,0xbb101d9b,0xb88e40e6,0xb936e829,0x3a5c3fa8,0x396bd481,0x3a4bece3,0x3a5b34d1,0x3a3a8cb5,0x3a6d6964, +0x3a5e4c3f,0x3a9da51a,0x3ae339cc,0x3ae6b46c,0x3af804bc,0x3b1184e7,0x3b126aed,0x3b00a2cb,0x3ae744ae,0x3ac1723a,0x3acfed6f,0x3a9191da,0x3a9e05a6,0x3a9de8ca,0x3a9a88f6,0x3a9bdef4,0x3a95b92a,0x3a9e9701,0x3a8136c4,0x3a689da2,0x3a587361,0x3a4ef891,0x3a419892,0x3a177e12,0x39caec39, +0x39709825,0x38f3abea,0x38a3b480,0x3a4e1c0a,0x3a03c200,0x3ab2baaa,0x3ae59f3e,0x3adc5fdd,0x3aa0c83f,0x3aebb96c,0x3af93325,0x3b08cf86,0x3b0de2f0,0x3b0b0364,0x3b17a811,0x3b1dfde6,0x3b23a518,0x3b165a59,0x3ae65509,0x3b0d050a,0x3b0c993d,0x3ae698d7,0x3a961255,0x3aa8fe46,0x3aa7c793, +0x3aac0a03,0x3aad7ac5,0x3aaea6f7,0x3ab12c59,0x3aa9cfca,0x3aa21287,0x3a95bdca,0x3a89b3e4,0x3a7ea970,0x3a751075,0x3a73d917,0x3a703687,0x3a67272f,0x3a53f715,0x3ab9aaef,0xb9f3a484,0xb97e1336,0x38ab733c,0xbab51da5,0xbadaacb9,0xba585285,0xba9b5cd3,0xbaccfca6,0xba98b8ea,0xba8ab9f6, +0xba840b07,0xba6daedc,0xba8c9dfc,0xba8cd7d3,0xba3fc752,0xbaf918e4,0xbaccad1f,0xba109d9f,0xbad2fa7e,0xbac4236b,0xb98863bc,0xb9d44dac,0xb9c6e044,0xb98951c5,0xba01ffce,0xba06f526,0xb9e79130,0xb9c34bf5,0xb9b08404,0xb9254223,0xb9fd0e86,0xba064ecf,0xb9d3ea5e,0xb994c74c,0xb97a67d3, +0xb9c1d24a,0xb984fa9c,0xb8d8a5db,0xb9a6dd49,0xbab938b0,0xba433695,0xbab3bb95,0xba6a273d,0xba1ad5fd,0xba72ced4,0xb9cb6ff8,0xba5b585d,0xbade258b,0xbae871df,0xbacb43ca,0xba456657,0xbad08235,0xbaba295a,0xba3bc401,0xba5d6bba,0xba9f139c,0xba3ceb21,0xb9547916,0xb9df3652,0xb995f340, +0xba93e825,0xbaabde90,0xba84c396,0xba306c66,0xb9aba8e8,0x38dad8eb,0xba2a6bd1,0xba4b3740,0xb9d4cad5,0xb94d54fc,0xb951904d,0xba2593a6,0xb9c6776f,0x3a22d166,0x39f99325,0xba8367ad,0xba788e85,0xbaab638b,0xb9fb313a,0xb9ce0e4a,0xba57feb8,0xba25251d,0xb9987e68,0xba66293f,0xba1f8850, +0xbaa0a585,0xb9de82dd,0xbaf93c4f,0xbb08f81d,0xb993d12c,0xba97ef9c,0xbaad08a5,0xba835f78,0xb9489121,0xb9be8e29,0x39059cc5,0xbaa35f11,0xbaaec663,0xba62493e,0xb967b1bf,0xb885a6cc,0x3a0dd813,0xba7f17b3,0xba7c7027,0xb7989124,0x3990ec44,0x3a090038,0xb8d21bc1,0x39c448e6,0x3999cbb0, +0xb8fac78a,0xbaa5aea2,0xbaa9d29a,0xbac30d43,0xb95171e2,0xb7e8035c,0xb789fd7d,0x393c888f,0x38e06d56,0x398d15e8,0x39944a90,0x394add76,0x3936987d,0xb97fed76,0xba9eea7d,0xba3178e1,0xba4a12cf,0xba8d1820,0xb9ea164e,0x39c8a683,0x3804d473,0xb89a520a,0xbb408126,0xbb853a6e,0xbb4cb68e, +0xbad742ef,0x382be4ea,0x3a769641,0xba863707,0xbabacb9c,0x392ad2a0,0x3a04056d,0x3936f69d,0xbab2a401,0xba4cb243,0x3bb2fea9,0x3b036128,0x3ab000fb,0x3aafde1d,0x3a9b90ee,0x3a25c18a,0x347bc258,0x374910bd,0xb86982f7,0xb87a906b,0xb8ebbf49,0xb90172f8,0xb8916caf,0xb8638dcc,0x390d2204, +0x3a56a91d,0x398becef,0xba9a7c09,0xbb53fafc,0xbb653498,0xbb5b4761,0xbb2e8f09,0x3a1459f1,0x3b472901,0x3bcfe65f,0x3c13b2ab,0x3bbe6a92,0x3b12b2d0,0xb847d9ac,0xba065a54,0xb91ae375,0x3a9ef130,0xb963bd03,0x3b017618,0x3be588c4,0x3bcdb0e4,0x3ab1a98f,0x3aa5e1a6,0xbaccc436,0xba460902, +0x38109bcf,0xb8224086,0xb90c8308,0x386e3268,0x36412280,0x38473475,0x3857893b,0x38822f7d,0x3802f32f,0x37da627a,0xb8b5e35b,0xb9b69245,0xb8bc7780,0xb9dc1ee1,0xba99ed18,0xbaab1b0f,0x398e4787,0x3a1a8940,0x39df628a,0xbacd107c,0xbb862ae4,0xbbcbb5e6,0xbba27653,0xba386ac5,0x3ba445ff, +0x3b086a76,0xba305ad7,0xbafc03b7,0xbbc8f082,0xbbbebc00,0xbb1193cb,0xba8a82b7,0x3b7a5375,0x3be2a1c2,0x3b972ac4,0x3a9516b4,0xbac36015,0x3a022e43,0xb821a8dd,0x34d3acef,0xb800b029,0xb7e69888,0xb826a3d4,0xb8033969,0xb7d4de61,0x35bb41ca,0x377f370f,0x397ba6ca,0xb7facd93,0x3a03cc67, +0x3a129c8c,0x3a90e836,0x3a0ee258,0xb9ed5e0e,0xb8fffa6e,0x39ab9572,0x3b2e3c36,0x3bcd86ff,0x3b8856ab,0x3994fd4e,0xbbb1e29b,0xba830b21,0x3b17d8c2,0x3b66bb3e,0x3ba27ff6,0x3b800418,0xba86e43a,0x3ab54804,0xbc0da612,0xbc2854ec,0xbb982114,0xbb6f6953,0xbb8fc44a,0xb9b0e235,0x365f73fc, +0x381b3242,0x380681cd,0x3846b5cd,0x381536f9,0x3813add3,0x373d359a,0x37690122,0xb8051575,0xb8955639,0xba09b27e,0x392c2685,0x3a14528d,0x3a4d3c2f,0x396441a8,0xba265bbd,0xbac7777a,0xbb22c42e,0xbb56e8d9,0xbb4ae6a4,0xbb449732,0xbabac476,0xba9af373,0x3b9a8b00,0x3b99cd95,0x3a732dad, +0xbbd52155,0xbc1dd62c,0xbc137051,0xbbf80547,0xb9437566,0x3bc03b3b,0x3bf73914,0x3bcaee60,0x3b0a4873,0x3a88523b,0xb956ac3a,0x36fa83a6,0xb8ebb392,0xb889b560,0xb89658ea,0xb8348fad,0xb80387aa,0x375679a3,0xb816a467,0x391c88e2,0x3a564ad4,0x3b058d71,0x3b1e520f,0x3b27eb28,0x3b19a532, +0x3aea1397,0x3ac3d754,0x3a6b7b6e,0x399b51a5,0xba0393dd,0xbaf159e4,0xbb390515,0xbb67b06b,0xbb7129ee,0xbb710fd9,0xbb37e69e,0xbb3e501e,0xbb48a8eb,0xbb24434d,0xbb7459c5,0x3a8c267c,0x3a1bb767,0xb94bcbcd,0xb96f72f4,0xb9f7d7fa,0xb916d7b1,0x3840a7ea,0x3935cddd,0x396a3131,0x39302907, +0x3914d076,0x38d9340d,0x3868e631,0x374350a3,0xb7a4e2b0,0x38d6a4c2,0x39d4142e,0x399b907a,0x36ba995a,0xb9a5a187,0xb9f051a8,0xba5baa3c,0xba98167b,0xbad529dd,0xbb025fa5,0xbb10d812,0xbae34e4f,0xbaa88834,0xba8b0248,0xba65dba5,0xba65e0c0,0xba9f994c,0xb9d9de46,0x36b8c4bc,0x3a26be03, +0x3a7486d6,0xbaecfd80,0xbb18aab4,0xbb28922a,0xbb15ec20,0xbb10e76d,0xbaf183e6,0xbab7fb12,0xba84b814,0xba48f27e,0xba026dae,0xb9c83c1d,0xb9a9659d,0xb963f29c,0xb907d00d,0x38d8c812,0x399bc660,0x3a0ff8eb,0x39fe301d,0x3964d55e,0x39e2f8ee,0x3a6b35ee,0x3a6c6d70,0x3a939514,0x3aba9d9e, +0x3ae6efd1,0x3b067a97,0x3abd3117,0x3a4cd59f,0x38ea484b,0xb9ce4bf9,0xba5a1e1a,0xbaa3ad1e,0xbaa8ea5a,0xbabce905,0xbad71e6c,0xbaf752a0,0xb9a8ffd9,0xba2478ef,0xb9c406cd,0xb8cf6dfa,0xb70bb57b,0x391b1e10,0x399c3f77,0x39cafa85,0x3a10ca14,0x3a212b98,0x3a3e0927,0x3a838da0,0x3ab12d67, +0x3aca55f8,0x3ac74b91,0x3ad2592b,0x3ac6f27b,0x3ad5e197,0x3aa31ccf,0x3ae2fac5,0x3ae9665b,0x3ae13d4a,0x3ae07e9f,0x3adbc351,0x3ad38bee,0x3adbd066,0x3acf2c37,0x3acbfefd,0x3ac049bb,0x3aaf07bd,0x3a936b43,0x3a57bfda,0x3a17f60e,0x399fd737,0x38ac904e,0xb915b8c7,0x3a8370d1,0x3a6f9a9e, +0x39e1e328,0x39a3c310,0x3a443d10,0x3a23479a,0x39dba072,0x3a42a1cc,0x3a617fd0,0x3a7d633a,0x3a905e84,0x3a9477eb,0x3a98c2d2,0x3aa7ec05,0x3a511672,0x3a963887,0x3a901fce,0x3a5e910c,0x3a9383b7,0x3af7a1c3,0x3ae55266,0x3aecd26b,0x3af13519,0x3af4da04,0x3af87bf1,0x3afbb07d,0x3aee566b, +0x3ae08fc6,0x3ad1fd10,0x3ac3527f,0x3ab79cd6,0x3aad8bf7,0x3aa76e1c,0x3aa0f043,0x3a9931b5,0x3a8d32ea,0x3af03728,0x379f71d7,0x39208ea7,0x3906f230,0x3a5e54cf,0x3a0c3723,0xba5796e8,0x3a33d109,0x3a147dbd,0xb9e5f15e,0xb9b558d5,0xb9c60fcf,0xba12c891,0xba2e692c,0xba461acb,0xba1b7e3e, +0x39702ad3,0x39e2400b,0xba3810ec,0x39d62674,0x3a31c822,0xb90c544c,0x37f5a29d,0x38e2f620,0x394e6fe4,0xb7f42042,0xb79d85af,0x3903f5d8,0x394a16fe,0x395d4f40,0x39908373,0x38e23bca,0x3914eb4b,0x3995e42c,0x39fb7c39,0x39f40e04,0x387899dc,0x396b8649,0x38c855b2,0x3a141637,0x396a7014, +0x38d4c6cf,0xb828f05e,0x36b99c40,0x38f50fc8,0x37d6f10a,0x39206dd8,0x39196a35,0xb995d95a,0xba4096c6,0xba52fa8d,0x3983f230,0xba416170,0xba2fb9c2,0x3a154e94,0xb8fab8ab,0xb8a4fa28,0x3914874e,0x393d87ac,0x39c43814,0x39b44b6c,0xba0cbecc,0xba43e301,0xb998cd36,0x38d9ab18,0x39f1bace, +0x3a32f4e1,0x3996a9b3,0x39d227fe,0x3a6754c8,0x3aacfb58,0x3a8c6d89,0xb91ee9d8,0x3982622b,0x3a127c5e,0x3a91524f,0x3a676d84,0x391a557f,0xb9ec7b05,0xb79c3a21,0xb82b1ee7,0xb9a1dfda,0xb94a267f,0xb9917beb,0xb9a8be5c,0xba0830db,0xba60784c,0xb90be500,0xbaa42071,0xbac6f8dd,0x395f88b3, +0xb9fabdc2,0xb878f812,0xb97d4d9c,0x3948d1b2,0x3a0d0d3f,0x3a820b01,0xb9c2d706,0xb9c91361,0x3a07bc4f,0x3a8a69f1,0x3a9ae701,0x3aa05a99,0x3a04c9af,0x3a773383,0x3b017bd8,0x3b374c8d,0x3b1eef30,0x3941eaf4,0x3a91b659,0xb8cd18a9,0x3a184e9d,0x39b9607b,0xba016044,0xba81b85f,0xb830769e, +0xb8283025,0x37a4edee,0x3868e9df,0x38c49ac3,0x391dd1d2,0x39838552,0x39486a74,0x38fecd65,0xb88df9a9,0xba858a98,0xb994d6b2,0xba5411b3,0xb9b48c3c,0xb897c149,0x3a4a6427,0x3ab723e0,0x3aa7c438,0xbad8fa86,0xbb312bc4,0xbaac0965,0x39779dd1,0x3ad610d1,0x3adbdb6f,0x3a83e66c,0x3abefc6f, +0x3b54f852,0x3b8a84a3,0x3b33f8e3,0xbaad12d2,0xb8fcc188,0x3bbfc967,0x3b6f6887,0x3b68eff0,0x3b0764e9,0x3a99fa0f,0x39ea9b7c,0xb8442359,0x3798413d,0xb806053b,0xb8231f3e,0xb8a54ae7,0xb8ed93b3,0xb89d3530,0xb8778696,0x38c92438,0x39ff08b7,0x3a40b2c1,0xba0bff08,0xbad0ab93,0xbae22bf4, +0xbb1fe8ad,0xbb073108,0x36e78cb7,0x3b5fa6c8,0x3bcae3d8,0x3bf0a9c7,0x3b934924,0x3ab1962b,0xb8509386,0xb8adcf60,0x3a9aeb83,0x3b7f7830,0x3b287814,0x3b8d3554,0x3c07d4e1,0x3bf23b16,0x3a582f1b,0x3b0013f4,0x3a0d80a1,0x39187fba,0x39b6e069,0xb8cb76b3,0xb8aa836d,0x3857abca,0xb6a24b5c, +0x3816d90f,0x38288898,0x386e5844,0x3832fd38,0x37ad5056,0xb81f4951,0xb98dfffd,0x380a0cf9,0xb91bb935,0xba27a5e1,0xba376294,0x3a8ea6dc,0x3b1748a2,0x3b1e6742,0xb9e541e9,0xbb62140c,0xbbb1ffe6,0xbb8317ae,0xb80fb758,0x3b9e2e92,0x3b08d14e,0xb997424c,0xbaad86eb,0xbb8be895,0xbb7c696e, +0xbac3214a,0xb8d34fd5,0x3b94e924,0x3bf9a34d,0x3bb54020,0x3a900761,0xba84c470,0x39f68994,0xb8d4e240,0x378f176b,0xb815adb1,0xb79d9639,0xb81948fa,0xb816c6fb,0xb7dff001,0xb7ba062b,0x382013a2,0x388156b1,0x395fb6f1,0x3a154fcd,0x3ac86c5b,0x3ae08de7,0x399273f6,0xb932a72e,0x38708dd5, +0x3ac016b2,0x3b919221,0x3c079f87,0x3ba87fb6,0x3a07aecd,0xbbaebcd8,0xb9399174,0x3b9d5824,0x3c04eb10,0x3c2aba74,0x3c0b5032,0x3ad6a81c,0x3b1c0995,0xbbde11ba,0xbc500e62,0xbb8bbe1f,0xbb0cc769,0xbb455d92,0x371864c9,0xb83348be,0x389f2b21,0x3780a504,0x3859d5df,0x38124415,0x3836d04d, +0x37f2021c,0x37b2ef49,0xb750493d,0x37202309,0xb9ca72b8,0xb9011d4f,0x3a27d1cb,0x39e6db67,0xb7987f99,0xb8963d60,0xba3754af,0xbaad1919,0xbb107ec0,0xbb128142,0xbadbfa97,0x39f8922c,0x3ab57edf,0x3bdf4d2f,0x3bbc45fb,0xb9dddf04,0xbb5f17a7,0xbb82a013,0xbb1b44a7,0xbb2169da,0x3b5af019, +0x3c057ca7,0x3bfb2f22,0x3bb95971,0x3b09739c,0x3a47ec4a,0xb995dc85,0x372edfec,0xb8ef8a5a,0xb883ebc6,0xb8a76c64,0xb880874b,0xb886165b,0xb7420d09,0xb84df67c,0x365e2b15,0x3a05eb32,0x3b05b216,0x3b4fcd2c,0x3b40293f,0x3b2217a5,0x3b01f3f5,0x3acb3167,0x3a9b39ae,0x3a87fcfd,0x3a89943d, +0x3836ef9f,0xba10dca6,0xba272ca3,0xbac05b93,0xba9a7eec,0x391f177b,0x3a2ce7de,0x39f5407c,0x39cf26a0,0x38c58434,0x3b1cfa83,0x3b2e10ec,0x3a90f86a,0x3a898f91,0x39b219b6,0x39e1d004,0x38edbf8e,0x3961b79d,0x39320861,0x39405a24,0x3912ce7a,0x391f171e,0x38f2586a,0x38a02114,0x37806dd9, +0x3975780a,0x3a3a4400,0x3a214c54,0x393d3a48,0xb96cd98e,0xb9b53a7a,0xba047f90,0xba3d69ea,0xba5709bd,0xba998d4b,0xbad02c4e,0xbaae7091,0xbab06a0f,0xbad2cc0b,0xbaac293e,0xba78fd0a,0xb9a922bd,0x3864574e,0x3a4fba8d,0x3addd586,0x3b1ce035,0xbab5a4fb,0xbad09053,0xbaaf91c6,0xbab313da, +0xbab88e24,0xbaa410b8,0xba7b56ed,0xba3ba611,0xba0b3bd1,0xb9ff50c1,0xb9a27869,0xb9e312c8,0xb9a744ea,0xb9917dbe,0x3561a500,0x396dc534,0x3a1a6355,0x3a4226d7,0x3a817505,0x3a8f3f8c,0x3a864c41,0x3a8b217d,0x3a87e353,0x3aab1245,0x3ace9ec6,0x3aee7652,0x3abce1ce,0x3a904eee,0x3a4188d8, +0x39db24a7,0x3839fc6a,0xb9995994,0xb9e04aa3,0xba2937f4,0xba88437b,0xbaa275d9,0xb9cfeb39,0xba1f77a2,0xb9da1ead,0xb98e0f6d,0x38deab98,0x391c3bc6,0x3935ec57,0x39a3cb9e,0x39d0cc76,0x3a40742a,0x3a8c64f6,0x3aa86d62,0x3ac17117,0x3ae98adb,0x3af2e3dc,0x3aeb0153,0x3b00fd70,0x3aed27b6, +0x3ae798cb,0x3ad51ff1,0x3aca9819,0x3ad5ca37,0x3ad47166,0x3ad602ca,0x3acfcf01,0x3ad807cf,0x3abf6533,0x3ab86bca,0x3ab58035,0x3ab0c8d3,0x3aababb5,0x3aa01323,0x3a6133c8,0x3a0d0372,0x3989efce,0xb6ac976a,0x3a929f5c,0x3a6bd899,0x3ac92e61,0x3ac1e1c7,0x3a6b2127,0x3acc48cb,0x3ad3aa6a, +0x3aa339fa,0x3ab73aea,0x3ac065f7,0x3ac06173,0x3ace1d32,0x3ad368c6,0x3ad7f8da,0x3b110605,0x3b10b701,0x3ac7cf02,0x3b0d76d6,0x3b10e4d2,0x3ae07d39,0x3aed47aa,0x3af048c2,0x3af2ad31,0x3af5b52f,0x3af81869,0x3afb90dd,0x3af5617f,0x3aedfe7e,0x3ae318cb,0x3ad9bba6,0x3ad17789,0x3ad19bf2, +0x3ac4cda7,0x3abadf32,0x3aacb150,0x3a9fcdf4,0x3b0840ea,0xbab4772f,0xba7d8b0a,0xba98f162,0xbaaf96eb,0xba3b1b56,0x3a26deef,0xbad4230b,0xba56953b,0x39ccc6a9,0x39f426d6,0x39ed3fce,0x39f41b72,0x39b38ba4,0x39d226b1,0x3a49492c,0xba8cf1b9,0xbaec6af3,0x3a77f270,0xba4bb3b8,0xbabe4e57, +0xbac3513d,0xbaa21fc0,0xbaaf5ecc,0xbaa94741,0xbac8ae45,0xbac81b26,0xbab3c70c,0xbaa38a42,0xbaa182db,0xbaa61b40,0xbabba0d4,0xbabb161c,0xbaa58ddd,0xba9b1e4c,0xba9144b4,0xba9458e4,0xba8a145f,0xba5e1f94,0xbaa3b55a,0xb98e2d37,0xbaac8266,0xba98685d,0xba5c45e4,0xba701e8b,0xba4a9c46, +0xba6a8f43,0xba989775,0xbac44ab6,0xbb0b6a02,0xbb040336,0xba85b8c2,0xbac563d5,0xbabf2d9e,0xba670fe5,0xba9e94ec,0xb9cbd30d,0xbae0b6a7,0xbab6f6f3,0xbadc2eef,0xbaf1978b,0xbb328f81,0xbb37cde6,0xbb107358,0xbad2acf5,0xbaac8aac,0xbac0d386,0xbaf35af0,0xbaf1da46,0xbaaa1aa9,0xba9cbd13, +0xba929695,0xbaa8ce4d,0xba86063c,0xb90fd651,0xb9bbafc7,0xba5394ff,0xba879495,0xba7967e4,0xba180d01,0xb9a735dd,0xb9467400,0xb918f002,0xb6e5399b,0xb93af7ae,0xb9690e35,0xba050d31,0xb929fa66,0xbab2c082,0xbb00057a,0xb9d622ee,0xbaa4560f,0xbaa67d51,0xbae8d5ea,0xbad29327,0xbae9a317, +0xbae9d66f,0xbb54d582,0xbb50e5fc,0xbb0c65f6,0xbaa0b2a6,0xba96436b,0xbae14a29,0xbb1bd236,0xbb0ffc4e,0xba77c483,0xba57b05f,0xb9daaeb4,0xba35a03d,0xb903b97a,0xb96512af,0xba10f2f5,0xba5a5fc7,0xba9a29ec,0xba7b225a,0xb9401b54,0x3891f149,0x3855ced8,0x3854ff27,0x38684649,0x38b0b158, +0x3951a829,0x392d05a9,0x39104b59,0x394350d4,0xba44c92c,0xb9e99798,0xba951ec4,0xba8bec20,0xbacb376e,0xbaca698a,0xbb0838fb,0xbb4d3d77,0xbbca6ad1,0xbbe08d41,0xbb9b2f53,0xbb1fed32,0xba9bcbf2,0xbb0cd7a0,0xbb41aa0e,0xbb2f1640,0xba2f007a,0xba1fb28d,0xba49fb1d,0xbadfce86,0xba5184bd, +0x3b493c94,0x3a9714ce,0x3ad84736,0x3a7aa132,0x3a351589,0x392107e4,0xb821bc16,0xb7a189f7,0xb7e7793f,0xb80749b2,0xb8454833,0xb8dc257f,0xb886c2af,0xb8d62b78,0x382c13d9,0x397be8fa,0x3a335ef4,0xba4c50b7,0xbb1149c0,0xbb506d29,0xbb8538ff,0xbb35b69d,0x3923c44e,0x3b7ef3f2,0x3bd74940, +0x3bf29ffc,0x3b78a8df,0x39b34002,0xbaa15ea0,0xbaf7c20f,0xbadb8e0a,0xb99d96ac,0xba6b4a26,0x3ab0eb99,0x3bc4ec82,0x3b95a4fe,0x3a8f0f79,0x3aa9c6ce,0xb9d95363,0xb9393914,0x37074633,0xb88ddb10,0xb7a1c0d8,0x3834e0ca,0x36bb670c,0x37e924f0,0x37f3d8ca,0x38555815,0x3839b31f,0x3816e503, +0x358ee5d7,0xb9394049,0xb9277a00,0xb941c1aa,0xb9e165f0,0xbabe0cbb,0xba74a4f3,0xba7228ad,0xbb02316f,0xbb6342d8,0xbbae6f2c,0xbbce3c7d,0xbb74188c,0x39a4e6bb,0x3b92e2bf,0x3acf4766,0xba87e425,0xbb176bbb,0xbbb60521,0xbb9c5fae,0xbaa961d0,0xb94c2049,0x3b634bf4,0x3bdd3a90,0x3bbfa2bf, +0x3a8da996,0xba4bbdfe,0x39e988a4,0xb92a2961,0x38070149,0xb841bf90,0xb748eaca,0xb808ccd9,0xb8023984,0xb80cd805,0xb7b0d298,0xb624a676,0x38996154,0x391ecf19,0x3838f610,0x39a7bc2e,0x3a451ea7,0x3964b77c,0x3867f281,0x39a109ac,0x3a317844,0x3b0bb99e,0x3b8fb940,0x3a19de3c,0xbb4e279e, +0xbbe2add6,0xbac4c1d1,0x3ae4eaae,0x3ab29d03,0x3b434147,0x3a8e5bb8,0xbbaf721c,0xb922ba2b,0xbc1baba0,0xbc78e61a,0xbb9eb627,0xbae8efbc,0xbae6a738,0x38ef7da0,0xb7e5bebb,0x38a7553e,0x37961529,0x384ab5e2,0x37fe8cb2,0x38386a4c,0x37f7acf3,0x381148c3,0xb79660c7,0x384635d3,0xb9c19ce7, +0xba075043,0xb8893564,0xb9c1d9d3,0xbaaf2789,0xbb06c7b3,0xbb40d196,0xbb647aae,0xbb7f632d,0xbb57ec69,0xbb4f3d6c,0xba6b768f,0x3a1ccb9e,0x3bb22a55,0x3b6c1859,0xbb6fa572,0xbc072115,0xbc1ffdf0,0xbc1c691e,0xbbd8f59c,0xbb4ab74a,0x3b711fe6,0x3bc46cdb,0x3b70b667,0x3ac71e21,0x3993c923, +0xb9630384,0xb7f09036,0xb8d6e2ac,0xb88174cc,0xb892225d,0xb88af0ee,0xb87b6c86,0xb81d6059,0xb7c236e5,0xb7c24817,0x39949304,0x3ab1377a,0x3b143995,0x3b156bad,0x3b16129f,0x3b053bf5,0x3aca6526,0x3a4b73cc,0xb83d17ed,0xba8b0ab3,0xbb11cd69,0xbb57f27c,0xbb8aaa87,0xbb8a6158,0xbb828c12, +0xbb5bd3d1,0xbb8c3014,0xbbad4337,0xbbb4034a,0xbbc8d6d0,0x3a2bacde,0x3a77bf67,0x3aa1704e,0x3a1de3c9,0x39b0cbfb,0x39a9e426,0x39442fe5,0x396384d0,0x39270d9d,0x39239305,0x38fb4df5,0x391e4c58,0x38d5a486,0x38e58dfc,0x37d3ee03,0x3897588a,0x39b84216,0x3a1619a0,0x39cce324,0x38f4aabe, +0xb9ce7b8f,0xba8121b9,0xbab44ac2,0xbb00875a,0xbb201b50,0xbb3ca108,0xbb1bcc47,0xbafa14ea,0xbad25e94,0xbad77639,0xbafdd404,0xbb1c9fa0,0xba9f7352,0xb9a22034,0x39dfa9eb,0x3a7745ed,0xbb020408,0xbb0a5569,0xbb06ae1b,0xbb040509,0xbae7a704,0xbac26201,0xba83fdb5,0xba25fe64,0xb9d3d30a, +0xb99b6101,0xb98057e6,0xb9aafaf7,0xb96b0036,0xb9a4d964,0xb925f71b,0xb84b3ef3,0x3986ed2f,0x39b49fa9,0x39d856dd,0x3a019be6,0x3a098d40,0x3a216e4e,0x3a34e268,0x3a670c32,0x3a8d5076,0x3aa45bdf,0x3a092e03,0xb967e7ba,0xba7346da,0xbaaccc60,0xbace4278,0xbaffa933,0xbaeab9cf,0xbaf05389, +0xbafb8269,0xbb04f417,0xbaa13fa1,0xbad04fd9,0xba17ae72,0xba84ad84,0xba29dfc2,0xb9f29a6d,0xba1876b8,0xb9f8307c,0xba02bb5b,0xb9c004b1,0xb8a54dd7,0x383eb317,0x39ad0765,0x3a18b6d3,0x3a7fa102,0x3a942fa0,0x3a898a81,0x3aaa415f,0x3ad24cca,0x3ace0e43,0x3ade2a61,0x3ad840ee,0x3ad7c229, +0x3ad7c852,0x3ad29881,0x3ae0648f,0x3ab52d2c,0x3a99a82e,0x3a68b261,0x3a127f25,0x39113378,0xb9ad8aa9,0xba09a54b,0xba3d1b94,0xba5dff37,0xba888394,0x39c7f4da,0x39234a7e,0x399d7552,0x3a3515f4,0x3acb98fe,0x3959ebd2,0x3a42ff4a,0x3ac9938a,0x3ae17c4b,0x3af109b0,0x3aff89d3,0x3b076b93, +0x3b0f084f,0x3b15d1fc,0x3a9effcf,0x3a5d6bb9,0x3b1243a7,0x3ab27c17,0x3a92438d,0x3aab086c,0x3aaf22f9,0x3ab07925,0x3ab63e54,0x3ab9011d,0x3abb624b,0x3ac1e09e,0x3aaa3b5c,0x3a962a64,0x3a814e76,0x3a5916af,0x3a385b38,0x3a110ef3,0x3a1342c8,0x3a068739,0x39ea5d52,0x39c5b72c,0x3a9ebecf, +0x39a0e6c5,0x39da261b,0x3a4bd1cf,0x38d3488b,0xba63c5c0,0xbb0a3efe,0x39a816b4,0xba3000cf,0xbad72611,0xbae0f288,0xbae2ba8e,0xbae5eae6,0xbb03ceb8,0xbb083eed,0xbaeb7d9b,0xba824564,0xb8084803,0xbb067ba4,0xba706450,0xb8f37fa3,0x39ddfd92,0x3980f681,0x39c537a2,0x39d796c9,0x395e3e1b, +0x3974f6ee,0x39cc266c,0x3a08450d,0x3a0cf7a3,0x39e56ef0,0x39e53146,0x3a03a949,0x3a3c1196,0x3a40883b,0x3a2f5e6f,0x3978fc9c,0x3a060035,0x3a116d59,0x3a5edd16,0xba8fb70f,0x39629366,0xb9dd15b2,0xb9f61e53,0xb68444e5,0x392a9494,0x39ab5af8,0x39152f47,0xb9b08baa,0xba499b1e,0xba602104, +0x389d9563,0xba903470,0xba6bddcd,0x392f7b97,0xb989383a,0xbaabc738,0x39109a40,0x39e18c18,0x39d91a83,0x39b454f7,0xb9e96382,0xba050bf6,0x38458049,0x3a2a84a8,0x3a702350,0x3a25e6b0,0x3a2685c3,0x3a579d36,0x3ab8a4f4,0x3ab1a8ec,0x3a8376e3,0xb910b712,0x39f785d4,0x3aa0784e,0x3aaaca78, +0x3998aa2f,0xb7b453ac,0xba2d14af,0xb99a4f09,0xb91e4a01,0x37fe136c,0xb93dd3e0,0xb8801758,0xb8fa29b6,0xb7ad9c19,0xb9f7f6e4,0x386c7cc7,0xba855c41,0xbaab1ca6,0xb90b8a39,0xba34baa1,0xba4aa0af,0xba11dbfa,0x3a18ad18,0x3a0f0a92,0x3a648976,0xb9ddb9e3,0xb99a3372,0x3a39c986,0x3acfea44, +0x3addf885,0x3a63192a,0x3a87164f,0x3accc9e7,0x3b3dd763,0x3b2e7278,0x3b0c09c2,0x38ae8c91,0x3aa6a749,0x3a536614,0x3a52ec01,0xb882703b,0xb98a7396,0xba173721,0x3790f3d6,0x37c6facc,0x37539807,0x38343f1d,0x3839f9f6,0x3809a033,0x3890c882,0x39206369,0x389f4474,0x3980ab73,0xb9b4d4da, +0xb9dd9593,0xba3065c4,0xba94f5b5,0xba2bbf8e,0x3a529a95,0x3a4b3f80,0x39d29f58,0xbb191379,0xbb39a9b6,0xba75940d,0x3aa3080d,0x3b0d901a,0x3a4aff75,0x3a9e69f7,0x3b0677af,0x3b859211,0x3b5ec8bd,0x3ade4d76,0xbadaf9d3,0xb80f8e7c,0x3bbb2cf6,0x3b34dd2e,0x3afd2c97,0x3a87174a,0x397ca313, +0x37fbeb11,0xb7994b93,0xb7337820,0xb79841c5,0xb7ca1b1d,0xb780bb15,0xb83cf6b8,0xb86949f9,0xb899084b,0xb81d37e1,0x38e3a9c5,0x3a1b4bd4,0x3970b9eb,0xbac53e1c,0xbac7359a,0xba47cb35,0xb998bf55,0x3b1523d0,0x3bb1c9c7,0x3bf7d238,0x3befa10e,0x3ba66b35,0x3b308a5f,0x3b0afc3d,0x3afbec05, +0x3b3a17a6,0x3ba27a3c,0x3b7f31c5,0x3bae31d1,0x3c0c06c3,0x3be128a9,0x3b021847,0x3b1f08b9,0x3a47440f,0x3a264129,0x3945b2ba,0xb89f7f99,0x37ab20fd,0x379261fe,0x371a43f4,0x379c1f6e,0x374296f6,0x37d78b99,0x3808f031,0x381a7d40,0x37d2b1e6,0xb8ab0f14,0xb93bb045,0x38660de3,0xba0d6e34, +0xba16ed43,0x3a9eb9c8,0x3ae26604,0x3af5ad31,0xba5d6773,0xbb621949,0xbb9f5fe1,0xbb2c20b5,0x3a8a5130,0x3b9f4881,0x3b180a77,0xb96f553e,0xbb0860eb,0xbb81190e,0xbb484087,0xba38f1d0,0x3a5c3852,0x3b8f19a6,0x3bddb7b5,0x3babbe06,0x3a59f27b,0xba2eac70,0x39aa19ca,0xb922e40b,0x3814b34e, +0xb82fe588,0xb6ede171,0xb7ad9e92,0xb7907c67,0xb7ff4b8f,0xb7ac9c3e,0xb7fd8234,0x385236a2,0x3856f9d6,0x39c294d7,0x3a4cd231,0x3ad75cc6,0x3aa9ed6c,0x3a6b77fb,0x3aa4b351,0x3b73af03,0x3bd84a69,0x3c1560e3,0x3ba7c02b,0x3a37cea3,0xbb80daee,0x3b18dee9,0x3bed3f71,0x3c07e326,0x3c2d0872, +0x3bfb3abb,0x398fc9a8,0x3af1101f,0xbba90974,0xbc81c7b7,0xbba4edb9,0xba0f56b4,0xba803653,0x395bcadd,0xb7d3defe,0x38923733,0x3791df53,0x3820d9c6,0x37adf46d,0x38059993,0x38025db4,0x382e307c,0x3644867e,0x38914ed0,0xb95c436e,0xb9e18f6c,0xb9fd0e0e,0xb9c7c9d8,0xb9989dbb,0xb976877b, +0xba1e42bf,0xbaa5ddf4,0xbb08b13a,0xbb0676d2,0xbaebd0a2,0x3a2857e6,0x3b2a8a00,0x3bce24cb,0x3b839203,0xbb52a711,0xbb3eb065,0xbab6b44f,0x3a3737d4,0x39122596,0x3b22a972,0x3b9330b8,0x3b4688ad,0x3b2602a3,0x3a97f0ff,0xb8f5d2c6,0xb90aef91,0xb83c6f7c,0xb8b4a07b,0xb852b1c1,0xb85ecec2, +0xb8557e57,0xb885ef25,0xb887bd1a,0xb7eb109c,0xb8ddd30f,0x390e6b18,0x3aaed91c,0x3b1288b6,0x3b3d6395,0x3b2f4563,0x3b09be63,0x3aea9645,0x3a864a52,0x3a3d2b68,0x3a253fb7,0xb8e15795,0xba44014a,0xba75d80c,0xbaab4c40,0xba07055a,0x3a9669ab,0x3a678c2a,0x381514d5,0xb8d24ed3,0xb9979707, +0x3b4d6863,0x3b3fc0a1,0x3a6f9fb4,0x3a8bec4e,0x3a0c18f8,0x39f810a6,0x3924d41f,0x3937466a,0x391cb27f,0x38f94a37,0x38d8659b,0x38e3ea82,0x390cd46e,0x3911b9a5,0x38ad1bd0,0x390dbf23,0x3a08d900,0x3a4b8681,0x3a292e9e,0x398edacc,0x3979e2c0,0x3828ba22,0xb9b00f48,0xba310aa6,0xba9d6ce1, +0xbaf085cf,0xbac83a04,0xbac96b63,0xbaf1869c,0xbac88888,0xba727b99,0x39f6aa4b,0x3a7429bd,0x3ae80a1c,0x3b253d16,0x3b48e446,0xba2550bb,0xba908628,0xbaae4780,0xba95a36c,0xbabd25bc,0xba899ed6,0xba3a5607,0xb9cea968,0xb9b2f3ad,0xb980e81e,0xb9709c49,0xb97e3483,0xb9b215e5,0xb9b02bf5, +0xb9a61a0f,0xb8ee4da2,0x38bf864b,0x399629ea,0x3a0ebec7,0x3a88d651,0x3a8119e5,0x3a53a67e,0x3a38a675,0x3a4fdad4,0x3a6d450e,0x3a79e641,0x3a3e0d55,0x3a0294d5,0x398fe9c7,0x397ed608,0x3900a60f,0xb72bba32,0xb8fc6aeb,0xb9929687,0xba051957,0xba42ece4,0xba30e62a,0xba819bae,0xbac63343, +0xba429562,0xba2d2f77,0xba20eb2a,0xb9e9bc34,0xb9bf3d87,0xb93371f3,0x37cde918,0x391d71ed,0x39e098d5,0x3a2da6c6,0x3a69c3ed,0x3a84ba87,0x3a9723a2,0x3ac5f95b,0x3ad297eb,0x3ac2c485,0x3ae69ee9,0x3ad11361,0x3ada64d3,0x3ad894d9,0x3ad74ef6,0x3ad1a983,0x3ad63b55,0x3ac61bd1,0x3ac2f56b, +0x3abfca3c,0x3ab4fd57,0x3aa9269e,0x3a9d3829,0x3a53d378,0x39e8da1f,0x3910c66a,0xb978e94f,0x3a811e7e,0x3a705771,0x3a6ccb0f,0x3a0802c0,0x36804d7a,0x3a8be7b7,0x3a322315,0x39916018,0x39c4c028,0x39ea3442,0x3a0623d7,0x3a11a0bf,0x3a163323,0x3a1d78f7,0x3aa26ef7,0x3add8b98,0x3a33d3ae, +0x3aae3089,0x3ae2067d,0x3ae7bfff,0x3ae5787d,0x3aea2fda,0x3aea7a51,0x3aecb0d9,0x3aedff95,0x3aefd9fc,0x3ae965aa,0x3ae181ca,0x3ad84cff,0x3ad1a338,0x3acc0735,0x3acd3278,0x3abca1e7,0x3aafa626,0x3a9e7053,0x3a91d96c,0x3b02651e,0xbab8cc1d,0xba860ace,0xbac6433e,0xba031a26,0x39b79aa1, +0x3a8570a4,0xba860238,0x391fed51,0x3a884193,0x3a87ecd2,0x3a7b1de6,0x3a6abb07,0x3a408f72,0x3a4f9c1e,0x3a92cdc0,0xb78bac9b,0xba8a46c2,0x3a9debce,0x393ea0c0,0xba22a49a,0xbae3019a,0xbaa87b00,0xbab7ce1c,0xbaba27e4,0xbad232d8,0xbacdbccb,0xbab39295,0xba9ef46d,0xba9f0582,0xbabb33ae, +0xbab6c608,0xbaafd6f9,0xba935237,0xba936794,0xba900b9e,0xba9de03e,0xba9105b8,0xba885d02,0xbaa3391c,0x3a2e056d,0xba952edb,0xba10f8c3,0xba0ad420,0xba41af48,0xb98a2966,0xba3a469f,0xba441397,0xba571043,0xbaca3364,0xbad2af32,0xba500896,0xba9b9288,0xba9659dc,0xba008f2e,0xba834c83, +0x39623ae4,0xbad9290d,0xbad1fa3d,0xbae99005,0xbb0cf7f8,0xbb3d016d,0xbb3bc37e,0xbb0c006b,0xbab92aa5,0xba9c92a2,0xbaeaa7b7,0xbadebdb8,0xbac4fa0e,0xba5bf605,0xba7183c6,0xba828009,0xbab3797d,0xba875e58,0xba1b0b50,0xba15c572,0xb8c76eac,0xba2e1823,0xba02873e,0xb9efeae8,0xb8e8eb90, +0x3903971c,0x388a3a40,0x38c45546,0x390fec1f,0x39136f0f,0xb8306ebb,0x38ec2279,0xba22df4a,0xbab1ff9e,0xb9b7c0b2,0xba819b20,0xba505bad,0xbae040d3,0xbaf4a904,0xbafb7b46,0xbb10b886,0xbb5f89dc,0xbb51690e,0xbaf3b311,0xba5f3bd5,0xba5a869e,0xbb162de0,0xbafd32c4,0xbac31824,0xb860f0f3, +0xb992e0dd,0xb970231a,0xba856cc7,0xb97dfbdf,0xba4ff12f,0xba26d275,0xb914263c,0xba54986a,0xba01af5f,0xb7f21186,0x389f31da,0xb8478911,0xb78ae940,0xb79b2c1b,0xb82d3b23,0x3584c4b7,0x38304ecf,0xb7984904,0x39a474f2,0xb967e858,0xb95d8917,0xba93ea7f,0xba614675,0xbaeecbb1,0xbb07ea84, +0xbb224b1f,0xbb8250f9,0xbbd74d93,0xbbdd374f,0xbb87d81c,0xbace684e,0xba6926e8,0xbb518ad9,0xbb251b0e,0xbabc72f8,0x3a4d4767,0x398d6fc4,0xba050f7a,0xbb075193,0xba50f879,0x3aad9e23,0x3a79512f,0x3b04d0df,0x3a3df95f,0x39a60e01,0xb6bd2b77,0xb742b178,0x35929cca,0x37658dd0,0x3581310a, +0x37a118d7,0xb7a3af28,0x35b51a08,0xb86a3e6e,0xb7f684d6,0xb8733562,0x3a22de05,0xb964ae98,0xba88b034,0xbb104450,0xbb5e1714,0xbaffb53e,0x39ac8b05,0x3b99a730,0x3bd62390,0x3bb869c5,0x3b27f67f,0xb864491d,0xba206080,0xba9c9364,0xba7cdccf,0x39c89fa0,0x39715fa2,0x3afde6fb,0x3bac478f, +0x3b4d1ebe,0x3a6387be,0x3a8b0d8f,0x3a1aa1fb,0x39a18fae,0xb792bc24,0xb8682728,0x37efab82,0x358fde4b,0xb62985be,0xb4e5a588,0xb636b7af,0x36c4b717,0x3772562e,0x374600f2,0x38645b9e,0xb86fb6f2,0xb9182d13,0xb73381bd,0x395ebf57,0xba569805,0xba5f3b3c,0xba6f0056,0xbb13f65a,0xbb6f73d7, +0xbb9ff9e0,0xbb9bd16c,0xbad68fd8,0x3ada457e,0x3b86410b,0x3acd378c,0xba4d6a59,0xbb143b68,0xbb7f7343,0xbb3466bf,0x393aa950,0x3a7a9acf,0x3b76ddee,0x3bce1c7f,0x3bb25f32,0x3a32f7bc,0xb9a67502,0x39403d62,0xb8d32b6e,0x37b37120,0xb7941d2c,0x36017827,0xb686d7f3,0xb719ec2c,0xb715f95a, +0xb7e2a265,0xb6639305,0xb8360d99,0x3955c500,0xb907b091,0x39bb0be0,0x3a455b28,0x39d4de4e,0x3a784add,0x3a9e6cbb,0x3b0c467e,0x3b4662b7,0x3b74e346,0xba4dd866,0xbb8ba444,0xbbd71c07,0xba90b591,0x3b102ff4,0x3ad7b452,0x3b6865b3,0x3aa01c37,0xbba6e8b6,0xb7f63c0d,0xbbe2b742,0xbc7df23a, +0xbb9dd396,0xba18f6fa,0xb986f460,0x383fef55,0x38357d9c,0x37ad766b,0x37816101,0x370c40ad,0x370fa355,0x376ee2e8,0x37b2f21f,0x37d66502,0x37d5365b,0x37a731c6,0xb79c0871,0xba2faeb3,0xb9f00a3e,0xba8f759a,0xbb08ea1b,0xbb1ef718,0xbb4c357c,0xbb5f05d4,0xbb6cca4a,0xbb3dd239,0xbb2e142c, +0xb83b908a,0x3b275157,0x3ba76720,0x3b07c63d,0xbbc8d0ff,0xbbd47b81,0xbbc0d7a3,0xbbb84f07,0xbb3b50c7,0xbb3c046b,0x3abd0206,0x3b47bc2d,0x3aaff1dd,0x3a653299,0xb9a5da46,0xb701d992,0xb89b3227,0xb7b26380,0xb7c23794,0xb76cab90,0xb804d128,0xb8199a98,0xb862eaa0,0xb8166501,0xb881479f, +0xb80e7402,0x3a653b38,0x3b0e4938,0x3b10e7dd,0x3b0d527b,0x3b05f4eb,0x3ab5c73c,0x3a1b9345,0xb939e646,0xba78e23a,0xbae4a050,0xbb2cc72c,0xbb5b6a38,0xbb6360bc,0xbb40aa19,0xbb12f5bb,0xbb4c9613,0xbb8b23fb,0xbba3f726,0xbb973d91,0x3aa6f8df,0x3b08a800,0x3b10932d,0x3a98ff92,0x3a47c9b9, +0x399d0272,0x391dcefa,0x38df4d9c,0x3876ca3c,0x38163692,0x37c0551c,0x3884b93e,0x38946d36,0x38e7be6e,0x38c2c2e3,0x38d0a2e6,0x39a53a7f,0x3a453495,0x3a443352,0x3a07bc9b,0xb9232c41,0xba47bc14,0xbaa3093a,0xbad4416e,0xbb088315,0xbb30d447,0xbb1751b7,0xbb07f412,0xbb02e03d,0xbb02cd0a, +0xbb0e2ede,0xbb0ea010,0xbaa0076f,0xb876fd9b,0x3a582806,0x3ad50273,0xbaced865,0xbabbaacb,0xba96542b,0xbaa23c38,0xba879795,0xba55f2e0,0xba01660d,0xb9368897,0xb8b7f598,0xb7b833ac,0x36ce02a2,0xb8c8c4c3,0xb9083a20,0xb96b9611,0xb99a0482,0xb99cd852,0xb878b01d,0x3847a49f,0x39b9c13f, +0x39bb8160,0x3852a4b2,0x393085b3,0x38cb1445,0x391a66d5,0x393a46d0,0x39516903,0xb981dbad,0xba32e83f,0xba8af43f,0xbaa4de02,0xbab28793,0xbad5b166,0xbabb6b2f,0xbabe0227,0xbacb3346,0xbacd0a0b,0xbab27b44,0xbad90987,0xba4277fb,0xbaa97b7e,0xba69549a,0xba4b0725,0xba7a0fb8,0xba606afa, +0xba67f3e1,0xba331a58,0xb9d7ef70,0xb9ad02af,0xb9338168,0x3863dc26,0x3a0e27a6,0x3a3ea022,0x3a4a563a,0x3a811efb,0x3ad3cbe2,0x3aabec2d,0x3ab348e7,0x3aaf48be,0x3aaaf6b0,0x3aaa7a9f,0x3aa5e83a,0x3aaead4c,0x3a7f157c,0x3a3d9416,0x39e954b7,0x39067208,0xb9729833,0xba1e04f0,0xba4c55bc, +0xba6fc689,0xba80890e,0xba958feb,0x38176dca,0xb954ae93,0x39e39a47,0x3a71e154,0x3abe0537,0x395bba6f,0x3a760cd0,0x3ac176f0,0x3ad7a60f,0x3ae3abd7,0x3aef1623,0x3b007d4c,0x3b0a346d,0x3b0fea4a,0x3ac1a385,0x3a593df2,0x3b13f076,0x3ad3cb05,0x3a9942ef,0x3a4dbf90,0x3a702eb1,0x3a6a3933, +0x3a70cf4a,0x3a7203a3,0x3a714bd6,0x3a7a340c,0x3a503f20,0x3a2e2185,0x3a099499,0x39d131c6,0x399bb33b,0x39390fe8,0x394634c7,0x3912daf2,0x38891fa2,0x3782f413,0x3a44a179,0xb917f076,0x378e823e,0x39c706fa,0xba705e34,0xbad90880,0xbaf1532e,0xba1f35b5,0xbabb8ddb,0xbac56db3,0xbadbc7a4, +0xbadcb5a7,0xbad6dc61,0xbafbc416,0xbafe389f,0xbace04a3,0xbad7ff18,0xba64df42,0xbae6a272,0xbad7845a,0xba8c6510,0x38947f6f,0xb9375ee6,0xb8dd181d,0xb90b7eac,0xb98baa84,0xb976239b,0xb8ba1f1d,0x38a42486,0x38ad8593,0xb928d066,0xb83ac8bc,0x37f8dd83,0x3997f6df,0x3921ba9c,0x38b71949, +0xb9534529,0x3878215f,0x3962f1e3,0x38cc4698,0xbad5d5b8,0xb996db38,0xba5f24b9,0xba632fa3,0xb9b8e5d4,0x38828505,0x38a55a14,0xb9443eea,0xba02741a,0xba69febe,0xba7b6a47,0xb9b66e04,0xbaade2c9,0xba977308,0xb9ef3623,0xba1cca59,0xbadc1ae1,0xba08d77e,0xb9006b2f,0xb9cc76a6,0xba169ee3, +0xba951184,0xba897d0f,0xb9f92bbb,0x3975048d,0x39c0ea99,0xb9b57333,0xb8807397,0x392417c7,0x3a561f27,0x39c424e8,0x38980d3a,0xba21619e,0xb81ef087,0x3a6fa92b,0x39f38e3d,0xba1dbed0,0xba043c39,0xba5a69c0,0xb9f52fc9,0xb920936c,0x38c58f9b,0xb8bdb5a1,0x38a52073,0x387b7551,0x39655a47, +0x376e3673,0x39190e85,0xb9f56a7b,0xba74e582,0xb9f84060,0xba6451f4,0xbaa9b051,0xba928ef8,0x3783ac38,0xb9bcd8dd,0xb9c68333,0xbab01afd,0xba8e22bb,0xb8ea0732,0x3a7af555,0x3a7c5e5c,0xba174af8,0x393b6543,0x3a2cc642,0x3b0fb71c,0x3a942651,0x3a4b6e8e,0xb9ee6c3e,0x3a1ce7df,0x3a47fa65, +0x382d7f68,0xba494b84,0xb9d0827d,0xb9c6e9b4,0x390df937,0x385546f1,0xb74d73b9,0x37141c09,0xb758a48f,0xb814b28a,0xb86ec020,0xb6805ef9,0xb7cd59eb,0x397eac3b,0x38a6f282,0xb9b25bfb,0xba1c20c7,0xbac3e324,0xbaac0238,0xb907e982,0xba6a4a63,0xbaef01c7,0xbb7f80c5,0xbb7ab62c,0xbadf1d5c, +0x3a4c1fb2,0x3a959826,0xbab373ca,0xb9768bb9,0x3a5f0203,0x3b460d1d,0x3a9c9030,0xb94dfdca,0xbb04de4a,0xb9f20f0a,0x3b8216f2,0x3ab92646,0x3a06204d,0x39bffbdb,0xb8d71d57,0x3846339a,0xb8805897,0x37637028,0xb6c174d9,0x36bdcf9b,0x378e40fb,0x3799f839,0x36ee43b7,0xb71b10c5,0xb8ce4066, +0xb7b463be,0x3968f2ea,0x39fe1eff,0xbaa9d98b,0xbad52b3e,0xb9c4514d,0x3a0245c8,0x3b54bb24,0x3bcc97a0,0x3bfd6ed1,0x3bd6f599,0x3b98cd8c,0x3b3fe6a5,0x3b34b56b,0x3b18d3a0,0x3b243a76,0x3b590163,0x3b49cba9,0x3b9280ae,0x3bec5f2c,0x3b9c0e65,0x3b3a6e8e,0x3b074891,0x39dc86bc,0x3a161254, +0xb88100f0,0x3808eb2d,0x368b0639,0x377d09ee,0xb6cea4f8,0x36336bb3,0xb72bd32f,0xb69054ee,0xb6e20bd6,0x37a78583,0x37ec2c79,0x385a8ce4,0xb95d9527,0x38da3152,0xb91143c4,0xb9cb5bd8,0x3a053529,0x38d5f748,0xb9c36e1e,0xbb1c8d37,0xbb801c37,0xbb88da5f,0xbab7284e,0x3ac9ac67,0x3b6fdf23, +0x3ae032e2,0xba1ab583,0xbb2c6502,0xbb69c618,0xbb15930f,0x3a067a86,0x3af7abd2,0x3b5a0105,0x3bc2916f,0x3b991d28,0x3a140bad,0xb9ab0ed9,0x39064c61,0xb8b3e298,0x37a04312,0xb76e5249,0x36abb0ca,0xb4c3bec6,0x365fe3c3,0xb68664b1,0xb72b2323,0xb80d5641,0xb6c2d924,0x3817663c,0x390763bf, +0x37ba7ef8,0x3a8b46eb,0x3ac97d45,0x3ac57d01,0x3af631fd,0x3b88842f,0x3bbbe7a1,0x3bc7aeef,0x3b049b09,0xbaadd26d,0xbb79e5d7,0x3b15a1c6,0x3bc5c4f7,0x3ba7a7c5,0x3bd5ef48,0x3b5c7d3a,0xbb4ca2dd,0x394671e5,0xbb9cb7fa,0xbc77bacc,0xbba022b9,0x36823601,0xb8a4e2ca,0x38979617,0x37e565df, +0x379c8b52,0x369f9aef,0x360f42ca,0x358f97cd,0x364b2000,0x36eee70a,0x37b4e6ae,0x37ea4ddc,0x37edd755,0x37ba39b9,0xb9eb48e6,0xba90bd75,0xbaa2a648,0xba9e29af,0xbaaefa88,0xbadfc3fa,0xbb135bc8,0xbb330122,0xbb1eccc1,0xbb138702,0x398f676f,0x3b4e47fe,0x3b8ca1ea,0x3aae63ee,0xbba6e7d6, +0xbb61589d,0xbac363f1,0xb9dc6d9f,0xb942bbbe,0xb9a5e490,0xba4591c3,0xba45330f,0x396e4629,0x39c45b2b,0xb9909a06,0xb458ed62,0xb877f652,0xb3b419d2,0xb70ad5e4,0xb63a77f0,0xb7217d09,0xb77e9f02,0xb829e224,0xb84a7b0e,0xb8649928,0xb8c34512,0x3a2912f1,0x3ab61a7d,0x3b135519,0x3b11c109, +0x3aeb2755,0x3ac8ba53,0x3a1c0f52,0x384279cf,0xb9c6b177,0xba64033e,0xbace14ae,0xbafbf61f,0xbae8ec49,0xba66b29a,0x39aeda10,0xb9fd3ae2,0xbad1e906,0xbb05fba9,0xbae1e00e,0x3b297a4b,0x3b161e8b,0x3a92cb6e,0x3a729a5a,0x3a1153a6,0x39641dd2,0x391d7001,0x386570d3,0x37bdcedb,0xb5a1de09, +0x371ef831,0x3771a494,0x380c53eb,0x38986fa7,0x38fab5d9,0x38c9cd5a,0x396cb5e9,0x3a3cfe8a,0x3a614e90,0x3a2f40ad,0x3a027dd9,0x39140fdb,0xb9ab035e,0xba459871,0xbaa9ac64,0xbb02eb7b,0xbadfd751,0xbad32c8a,0xbae4c4cb,0xbac9bbe1,0xba93af2c,0x385d59f1,0x3a23feb1,0x3ac2da1c,0x3b0799bd, +0x3b24d0c8,0xb9e0ac07,0xba615e07,0xbaa50a4c,0xba81b152,0xba959a02,0xba31cf48,0xb9b9dc88,0xb85dba06,0xb7a84238,0x386fda2d,0x36a13700,0x3642fc6e,0xb8862d40,0xb8f4b5ab,0xb9a6dd6e,0xb99eb08a,0xb976b475,0xb922dc35,0xb8979d1b,0x3a03407d,0x3a02e074,0x39949f82,0x394b112c,0x39105bca, +0x38fed70f,0x383b0e40,0xb8c00f0e,0xb98da40c,0xb9d79037,0xb9afb6a0,0xb99c0a05,0xb9b06e5e,0xb9b852d4,0xb9e49f09,0xb9ff24bf,0xba2afc7d,0xba61e426,0xba9cafc3,0xbada86fe,0xba80016c,0xba8b80ce,0xba827b27,0xba58b75b,0xba488585,0xba17e7b0,0xba06b95e,0xb9ee4ad1,0xb98cd4ab,0xb8d7e85c, +0x380d519d,0x396d8512,0x3a00efda,0x3a4f28cb,0x3a91d3b9,0x3a940860,0x3ad0197f,0x3abd524d,0x3abb2afd,0x3ab6e854,0x3ab02cc9,0x3aa898f6,0x3aa6e026,0x3a98dc67,0x3a916017,0x3a854324,0x3a5ff76c,0x3a2f973e,0x3a03e9a1,0x3973b4b9,0xb7e483f8,0xb97977f7,0xba11bc21,0x39f12b2e,0x39f2fe47, +0x3895ca50,0xb96d2d04,0xb95d7bf6,0x3973686d,0xb8d7c9f2,0xb9109c77,0xb8ab9334,0xb6dc0024,0x38b4c469,0x39099fcd,0x3945a0bc,0x39824917,0x39b549d7,0x3a45e18c,0x39e0de3f,0x3a0b3568,0x3a677ca9,0x3aab617f,0x3a9f4ef2,0x3aa292fb,0x3aa16ee2,0x3aa1f3fc,0x3aa1c86a,0x3aa22ce3,0x3a9853d1, +0x3a8e39e2,0x3a84cb98,0x3a7b84af,0x3a7025b6,0x3a683baa,0x3a51bc1d,0x3a3bc532,0x3a20d0c8,0x3a0eb894,0x3aa06040,0xba3ace88,0xb9f15856,0xba51a019,0x39611a3e,0x39fef4ed,0x38870102,0xb9208e21,0x39c3aaeb,0x39e65433,0x39b23cca,0x39835cd1,0x393709fe,0xb87be64b,0xb88acb65,0x3943657c, +0x3979de44,0xb92f8942,0x38fed848,0x39af6ded,0x38b89b3a,0xba7c97f7,0xba316eb3,0xba3bec6a,0xba4dd5d5,0xba64d11e,0xba573f2a,0xba281862,0xb9ffee6a,0xba04990c,0xba5811d5,0xba261cd5,0xba0c8980,0xb98ee9dc,0xb9bc725f,0xb9d00133,0xba22b3bb,0xb9f3ee1b,0xb9f350d6,0xb9e7b806,0x39ed5f11, +0xba034b2d,0xb91640dd,0xb9bce043,0xb9bd4120,0x396866ca,0xb940836a,0xb91e352f,0xb940646e,0xba255c54,0xba509bf3,0xb9a7ff17,0xba63086f,0xba5cc6ca,0xb8aea307,0xba0654c4,0x3848b4bd,0xba604704,0xba73efa2,0xba853831,0xbabc579d,0xbaf68758,0xbae990bc,0xba95db06,0xb9eb4771,0xb9b0f755, +0xba99e9cd,0xba3ad52e,0xb9c57ccf,0x39b5672b,0x38acc8d4,0xb92937e3,0xba4f1f1e,0xb9c1c08e,0xb880c332,0xb8d184dd,0x39c41b86,0xb95ede29,0xb9a76401,0xb98d050a,0x3734bd6e,0x387c07cf,0x3714fc99,0x3818baa3,0x384b5cc5,0x390ccf29,0x38ba2d05,0x3905e861,0xb8b6a0e1,0xba20f6b4,0xb99939ad, +0xba25b01c,0xb9cce0af,0xba8d347f,0xba8a444c,0xba8d4045,0xbabdfac7,0xbb0ca3f5,0xbaf013c6,0xba299be6,0x3990ded5,0x394bb3f5,0xbada48f2,0xba0f21ac,0x38a915fb,0x3ad25177,0x3a804f79,0x3a30db12,0xba192969,0x39ac0fc0,0xb9963e98,0xb97366d0,0x391ff183,0xb9d529fc,0xb92bac79,0x38a32706, +0x37a7a39b,0xb820493d,0xb4eef3eb,0xb731bc5e,0xb7bd4998,0xb836223a,0xb7818a7c,0xb88a5041,0x3906565a,0x38b4e319,0xb8889802,0xba47400c,0xba3b1853,0xbabaf37d,0xbab6775e,0xbae0973a,0xbb4f14f7,0xbb9d9ba5,0xbb95fb18,0xbb14b69b,0x38b8d09c,0x39588307,0xbb312077,0xba7ffcb3,0x3a14d332, +0x3b39d0db,0x3ae38ea8,0x39cd278c,0xbad766dc,0xb967ac25,0x3ac89fbd,0x3ad99be2,0x3afe2cbb,0x3a008d55,0x38aacbc4,0xb80dc077,0xb7145b87,0x376a6413,0x367d7d13,0x361da321,0x37668ea7,0x374860f0,0x378887a9,0x36c89406,0xb7ec1bdd,0xb8d45a0d,0x3960cc9f,0x39776367,0xb9654f3e,0xba721758, +0xbab641c6,0xb952aeb4,0x3ac369dd,0x3baf05e0,0x3bcfd65c,0x3b8ecf92,0x3b1830c8,0x3a49e260,0x3a60c387,0x3a44172e,0x3a88dbd8,0x3afd4b7e,0x3b105c65,0x3b5f9f9f,0x3bb597a6,0x3b4a4100,0x3a684342,0x3aa4cbe4,0x3aa9c4d6,0x39a533f8,0xb8cc0ff8,0x3808b347,0xb5181cc3,0xb5bb2de7,0xb6b9cc63, +0xb5512ddd,0xb6dad423,0xb6d16316,0xb6976682,0xb68eea08,0x37d483d8,0x38190224,0xb8dd8a3e,0x370a042d,0x39f2538e,0xb8e28170,0xb9ad61e1,0xba10a4bd,0xbade3c67,0xbb5e9b02,0xbb8b52d2,0xbb6693d8,0xba26fab0,0x3ae8761d,0x3b3ad6c0,0x3aa98e9d,0xb9c5ad9c,0xbaeab06a,0xbb0df5ab,0xba8c4c11, +0x3a687170,0x3acfb24b,0x3b461de4,0x3baac565,0x3b8c337e,0x398acaac,0xb9326fff,0x38896689,0xb83a3759,0x379adbc5,0xb65ce408,0x36a050fd,0x364713c2,0x35973359,0x3695c74b,0xb742ccb1,0x35ca36ea,0xb8878740,0x38f6bab6,0xb8d11ab4,0x399141aa,0x3a4904f6,0x3a59b6bb,0x3ad86cce,0x3b0540cf, +0x3b78b135,0x3b924a29,0x3b812216,0xb954a7fe,0xbb4d7dd2,0xbb92a56e,0x39f66e03,0x3b767174,0x3b6f79bd,0x3ba897aa,0x3b268d72,0xbb408d02,0x394ed604,0xbb75e8a0,0xbc57e160,0xbb936ed1,0x38ba658d,0x3802e3f3,0x37bb0cf0,0x37a209c4,0xb6e7438f,0xb627ffcb,0xb6ae937d,0xb5f90f0f,0xb5c7a056, +0x36c68b56,0x36838edf,0x380fda7e,0xb6ffe8f8,0x38fb7af3,0xb9e2e348,0xba5d085a,0xbac2b1fe,0xbafd1665,0xbaf7d4c8,0xbb1582ce,0xbb199c3e,0xbb1f22f5,0xbaf19d92,0xbaa6f73a,0x3ab52d58,0x3b97e836,0x3b90896f,0x3a795935,0xbbbb47e5,0xbb378123,0xba20e5e2,0x3907479e,0x3a42756c,0xb99dfff0, +0xba86c620,0xba0db7bb,0xb977163c,0x3952ae64,0xb962bd95,0x38448a55,0xb7d4d20b,0x37c9697c,0x3594d8aa,0x3709f268,0xb67da169,0xb70470e5,0xb7a70466,0xb82ef0b0,0xb7d5ea0a,0xb92e0649,0x39e84e8b,0x3ad8e2c8,0x3b05d572,0x3aff0b0c,0x3af02cd6,0x3ab1b1b2,0x3a352eff,0x3940e3e4,0xb952a055, +0xba0a4695,0xba960502,0xbabd7f30,0xbadadab8,0xba7020df,0xb8f28b77,0xb9f00456,0xba994d7d,0xbaf3c902,0xba1efa40,0x3b0cbefb,0x3b3d7336,0x3b10e8d0,0x3aa6a5b3,0x3a19e61b,0x37edc57d,0x38bbbd6e,0xb8337a5b,0xb7851951,0xb7c9c7a8,0xb749c883,0x36265c8d,0x378db3ea,0x3817423d,0x38b03d82, +0x38b34d56,0x39509193,0x3a48e9bb,0x3a7465e5,0x3a60a022,0x39bdab9c,0xb88b706e,0xba0620c1,0xba2501a5,0xba876462,0xbae6a3d0,0xbada1f34,0xbae741e6,0xbb0139e0,0xbaf28a80,0xbad8d659,0xba627a48,0xb9d62544,0x3a222c82,0x3ab4ae9a,0x3b115ab9,0xba40f2b5,0xba25e311,0xb9ebbefa,0xba02f877, +0xb9d90078,0xb990c299,0xb8e4305a,0x390dadbf,0x38b3c2c5,0x38af1e61,0x385bf1d8,0x3796155a,0xb748c5ea,0xb845aa0d,0xb93eda8a,0xb99afd4f,0xb93cf524,0xb915b5af,0x393d8403,0x399b640b,0xb8dd8b26,0xb8c38893,0xb99150d4,0xb9b12160,0xb9da81f1,0xba038c52,0xba0f3d5a,0xba1a2246,0xba196918, +0xba108547,0xba0acd1b,0xba24eff4,0xba0bfa85,0xba16d5b8,0xba363865,0xba3845b8,0xba7911f4,0xba95be78,0xba6d8c17,0xba8ab029,0xba61dd19,0xba541300,0xba64ea07,0xba48910b,0xba3c327a,0xba091727,0xb9c3d590,0xb998017d,0xb9827aeb,0xb90917a8,0x392b343c,0x39bb0c66,0x3a1ca025,0x3a47f9e4, +0x3aafaac1,0x3a92100c,0x3a86a1e6,0x3a860ac2,0x3a7d8b8d,0x3a74d351,0x3a67b7b7,0x3a637bf8,0x3a270481,0x39f9a289,0x39ad3fb7,0x3921a8c2,0xb77fa9c1,0xb9337079,0xb9b7f180,0xb9f9c9eb,0xba11bce3,0xba3b4da5,0x3779b84f,0xb90458be,0x39f6424d,0x3a2ed8e1,0x3a1e5880,0x399a482d,0x3a2ad628, +0x3a293df3,0x3a45b6cc,0x3a5379e4,0x3a6394a7,0x3a7d8dd8,0x3a8e1ebc,0x3a96ba1d,0x3a9ac227,0x3a57645d,0x3aafac33,0x3aacd3dc,0x3a8d613b,0x3a10f2f9,0x3a2e63a1,0x3a261121,0x3a23d57d,0x3a21185e,0x3a1c67fa,0x3a1cf8e0,0x3a07a574,0x39ea5195,0x39c13f63,0x39a312a8,0x398a0144,0x396c6b36, +0x3951e4ac,0x391b8640,0x389644c8,0x38069334,0x3a144426,0xba495c32,0xba0902d4,0xba00e00a,0xba9e0cb9,0xbaa28801,0xba1888b9,0xba9019c7,0xba9468c4,0xb9e0850e,0xba24a96c,0xba31f7bf,0xba2d7439,0xba6f8b2c,0xba67af47,0xba0e4eae,0xbaa67ab5,0xba9d5b01,0xb9fdb9a5,0xbaa38eec,0xbaa9331c, +0xba33e010,0xba423381,0xba4c2163,0xba619bd7,0xba6eb17a,0xba649fcb,0xba44b554,0xba1b12fa,0xba1f2873,0xba728123,0xba41be3b,0xba2c7fcc,0xb9c9be07,0xba19ed38,0xba22784f,0xba3a0e84,0xba0fe974,0xb9b9a9d5,0xba434cf3,0xba7fa381,0xba3b6992,0xba5a701f,0xba5fa8bf,0xb9ff519f,0xb60f49e7, +0xb931d6f6,0xb9a0f3a0,0xb9c5d447,0xba29e3e3,0xba3cb3cf,0xb9f28f94,0xba8ba511,0xba947d62,0xba4a6bf6,0xba438000,0xba87990c,0xba99da2a,0xba74508c,0xbaab40e8,0xbad60e24,0xbafa4829,0xbae2d41f,0xbaa04a86,0xba102eca,0xba09879c,0xbabc0fc9,0xba818a2c,0xba41e6ed,0xb8411dbb,0xba22420e, +0xba4cfcbe,0xba7ab070,0xba154f70,0x39555746,0xb9e4200a,0xba4a7cb7,0xba269e88,0xba20ed8f,0xb97a30d3,0x37c1102d,0x38a7a42a,0x37bd7d52,0x38f69e25,0x390754dc,0x3985225a,0x391b10dc,0x39335603,0x3888cb20,0xb9aa689e,0xba0042e3,0xba53563c,0xba97c3c1,0xbabdb796,0xba78b904,0xbab915c1, +0xbaedbe17,0xbb16e923,0xbb02375f,0xba98405a,0xb9351d33,0xb99cbda5,0xbb0b651e,0xba893aa5,0xba1d1ba0,0x3a7f8a42,0xb9b9908b,0xb9dbb972,0xba3f8f0b,0xb85dfc52,0x3982db88,0xba234f13,0xba3b7d1d,0xb9cc7e10,0xb84514d3,0x3914c5c0,0x33945474,0xb80d7e4a,0xb7989656,0xb833f07a,0xb88a89f7, +0xb8cfeced,0xb884c1b2,0xb88c465e,0x37303270,0x393518bd,0xb88936dd,0xb9f70cc9,0xba9cdd68,0xbae11da2,0xbabb3377,0xbb2552b3,0xbb810c94,0xbba68750,0xbb973b2b,0xbb2df09c,0xb9b57174,0xb9e2b038,0xbb5ceae2,0xbaf6c50c,0xba2540d2,0x3ace78bf,0xb9feb0aa,0xbaabdf74,0xbada8889,0xba0cf299, +0x3a9aa102,0x39ad0a25,0x39a10857,0x39237be7,0xb7737813,0xb800511f,0xb7af7495,0x37bf49fc,0x370c8f8e,0x37b169ce,0x380aa722,0x383bd653,0x37f9c7f9,0x380a02d3,0xb7bbe37b,0xb87e6665,0x37e3e67e,0x39b1f5c6,0xba290051,0xbabe9d01,0xba409297,0x39f3939b,0x3b2e3b1a,0x3bb08b16,0x3bc800d1, +0x3b8ca347,0x3b27527d,0x3ab39c7e,0x3abc91e6,0x3aa988f5,0x3a840d49,0x3a300fde,0x3aa23c42,0x3b225252,0x3b9678df,0x3afe606a,0x3b01bf04,0x3a7b10eb,0x39b08a11,0x3939aa14,0xb89297c7,0x386a1085,0xb71f2b40,0xb45c0bba,0xb7550969,0xb7186cb9,0xb7acae0a,0xb7abc720,0xb7a0de51,0xb70b951a, +0x342f68dc,0x387e69d4,0xb8b9fa81,0x367dcbd9,0x3944e780,0xb9bfe274,0xba4446ea,0xbae57d7f,0xbb3cd543,0xbb855fa2,0xbb8d7a0d,0xbb578baa,0xb9caebc5,0x3ae30a2a,0x3b1f01bd,0x3a8cd716,0xba356bcb,0xbb219529,0xbb3320ba,0xbab7a03f,0x3aa19b08,0x3af93041,0x3b1fe378,0x3b9207a9,0x3b5b20d5, +0x38e97e82,0xb92b7c86,0x3862a2c9,0xb8194899,0x37a99ac7,0x363c210a,0x37542482,0x3763f9a0,0x37713bd9,0x373fbd52,0x3667bf86,0xb674b8da,0xb80a790d,0x37e29fa9,0x382cdb19,0xb9c34ee0,0x39db8212,0x3ab1df3e,0x3b0011b1,0x3b254444,0x3b861aa9,0x3b8920d7,0x3b33028a,0xba4ce3a7,0xbb3a6f5b, +0xbb563317,0x3abea6b0,0x3b6c88d6,0x3ae647f5,0x3b0f0e01,0xb9f59e21,0xbb9e7350,0xba27a73e,0xbb936dbc,0xbc3d0bcb,0xbb8206f2,0x396d11e0,0x388dddab,0x3666c1ca,0x37876dba,0xb77c6b33,0xb730c9de,0xb78668db,0xb7930f9a,0xb7888c1a,0xb70b20fa,0xb6cfdd81,0x37a8852f,0xb5a7ee6e,0x38aff312, +0xb9457057,0xba979ce1,0xbad6a451,0xbaec4049,0xbb08fbb8,0xbb231077,0xbb300689,0xbb317364,0xbb0caed5,0xbadb026e,0x3a1bd575,0x3b697b00,0x3b161c94,0xba58f745,0xbbb222ab,0xbb6eabd0,0xbb09eb8f,0xbaf8e4a1,0xbac6b484,0xbb0437e8,0xbb8ded47,0xbb1a700d,0xba3f4f5c,0x390c39e4,0xb919b2f1, +0x38180a2d,0x35e456e6,0x3808d151,0x37cd4033,0x380fc128,0x37da4a29,0x3751762a,0x36e9a715,0xb7fde180,0xb720a967,0xb90ae9ce,0x3948a873,0x3a70031c,0x3ada6bdc,0x3ae0c863,0x3ac7097d,0x3a9f50ed,0x39c89972,0xb9ae46ba,0xba92a551,0xbac20e61,0xbb1192bb,0xbb2dfb67,0xbb1b1c3e,0xbad15f71, +0xba7aaa2b,0xbad0ab4a,0xbb1706aa,0xbb2f8bfc,0xbaeb414a,0x3abdc3d7,0x3ad7632e,0x3ad07ac8,0x3a57a62f,0x39a7bc98,0x3820ec5a,0x38304d4b,0xb896b0a2,0xb8255c78,0xb88cd4db,0xb88a0044,0xb86a97ca,0xb7e50e3a,0xb6d36a68,0x37eec7be,0x38d47bf5,0x38713088,0x3a21766f,0x3a8240c7,0x3a826a47, +0x3a2190b1,0x391b02bb,0xb9c706f4,0xba509ea7,0xbaa6f791,0xbafe714b,0xbae6b381,0xbad3aa42,0xbacdffdb,0xbac07a45,0xbab04330,0xba49e80c,0xb979245d,0x3a09b763,0x3a7d0a35,0x3ab46272,0xb9e802b2,0xba17d020,0xba5fea16,0xba1e244e,0xb9fa958e,0xb969d55a,0x37add6a8,0x39424b8e,0x38e082e2, +0x3934450c,0x391fbc05,0x3915baf0,0x388ccb99,0x3847fa2f,0xb83bc064,0xb9684781,0xb98daa1d,0xb9b446d5,0xb9c7ec2f,0xb8cf8673,0xb92fb051,0xb98702ad,0xb9a71ae6,0xb9e1ac14,0xba0aaa5a,0xba2d4b18,0xba3fcce5,0xba633860,0xba78e182,0xba65ed47,0xba4e9ed1,0xba5560bf,0xba3a7dcf,0xba3b7468, +0xba2e3ed9,0xba295641,0xba71b4a9,0xba98c2d6,0xba9848cb,0xba8369d5,0xba8be6a4,0xba769c79,0xba592eef,0xba3fcd61,0xba1aeec6,0xba0efe88,0xba01bdc2,0xb9ddeea8,0xb9be9b25,0xb9afc220,0xb94b1ddd,0x3717f3be,0x3939a9f6,0x3a0d17a4,0x3a646d24,0x3a914138,0x3a8774e0,0x3a787523,0x3a6929fa, +0x3a5513c1,0x3a4451d6,0x3a390ffa,0x3a16ee5f,0x39f3bdbe,0x39a31f09,0x38d9ff9b,0xb908be07,0xb9b9f42c,0xb9f28757,0xba1393cf,0xba26ce7b,0xba514368,0xb9113a97,0xb91f8d43,0xb9cdd317,0xb9bf926b,0x389711ca,0xb9c771fe,0xb9bd00a2,0xb8be6779,0xb8735b78,0xb6fcc392,0x38a12adb,0x3913673f, +0x3982a8a5,0x39b88665,0x364e18be,0x381ace87,0x3a272296,0x3960d64c,0x397ce660,0x3a0d9521,0x39fd0818,0x39f7d7ef,0x39f0afc8,0x39ea9ca4,0x39e1c81e,0x39dd1340,0x39ad864c,0x3982d90c,0x393b25bf,0x38fd2cfc,0x38a07dad,0x3770bd67,0x350a53c6,0xb82e58da,0xb8ba0a32,0xb8ff7ee7,0x398f547d, +0xb937db78,0xb85c6f39,0xb8c82a4a,0x3925f1ce,0xb925eac1,0xba783207,0x38d1bca0,0xb8f84963,0xb9c4bacb,0xba0ecddb,0xba2114c0,0xba2b152c,0xba683075,0xba7ef5eb,0xba5505b8,0xb991e028,0x380e7769,0xba7eb245,0xb96fe609,0x388020ed,0xb94e190e,0xb9559eb4,0xb93a768b,0xb98c0869,0xb98b0993, +0xb96174c5,0xb8d2cafa,0x37b62a06,0xb6cf30a4,0xb9ad3ec5,0xb8b08cb4,0x37c02846,0x3997b96c,0x3903ad1f,0x3861ff98,0xb94188b2,0xb6d7b0f3,0xb737a734,0x3850bfc1,0xb9a409ed,0xb8d73049,0xb92cbbda,0xb9d06ba4,0xb91d61c0,0x399f2bc3,0x38b60f4c,0x38be0f55,0x38536098,0xb9131123,0xb953360c, +0x370a890a,0xba19b55f,0xba29d804,0xb8f38641,0xb9582597,0xba0a6f8f,0xb992cc55,0xb9b2d1e5,0xb9e9c7b8,0xba4d4345,0xba707aae,0xba480024,0xb9b362de,0x395d6365,0x3959c93a,0xba2b9531,0xb89a0d35,0x398f920e,0x3a785750,0x3a08487e,0x395f0706,0xb9ce78b4,0x379b140c,0x39adaf83,0x38cd0236, +0x396bf42c,0xb8d557b4,0xb9950d06,0xb8a03f58,0x380e3778,0xb856730e,0xb835f13d,0xb6b8824f,0xb620f34e,0x3896e202,0x388ad101,0x388b6b95,0x38c03b8e,0xb886d0ca,0xb989710c,0xb9d313c0,0xb9b96cc0,0xba1d48a4,0xb99a08a9,0xb9eb8839,0xba4a41cd,0xba7cc13b,0xba27f725,0x38c573a3,0x3a54deb5, +0x3a258766,0xba94604e,0x3966260c,0x3a59e323,0x3b157e2b,0x3aa61122,0x3a5bc16c,0xb9a01fa8,0x39fe961a,0x38d1ee78,0xb922530d,0xb80484a6,0xb9362583,0x37b8387c,0x388d48d0,0xb7819f65,0x378463cb,0x378c0ddd,0x35eaf646,0xb6c91745,0xb7fcf35b,0xb804a8f8,0xb8159f55,0xb7da3ddc,0x38917b13, +0x3819021e,0xb9a5d0d7,0xba349537,0xba84b489,0xba330d83,0xba97f571,0xbb13fda7,0xbb3cc47a,0xbb1c6bff,0xba57e05e,0x3a823691,0x3a2d27f2,0xbb0dd0bd,0xb967834b,0x3aac5e13,0x3b5ebab6,0x3aeb4cd0,0x39c306c7,0xbaaa5067,0xb8af7ccb,0x3ac7b565,0x3ac1d304,0x3a835e34,0x392c625b,0xb84cc8ea, +0xb736301c,0xb6a43eaf,0xb4b67c25,0xb70bbdf5,0x3512a748,0x368d9803,0x377655e9,0x3769f364,0x37b63a0d,0xb4adec21,0xb7a81c6d,0xb82cf884,0x3997390c,0x3832caf4,0xb921dee1,0x39c4110a,0x3a99a54c,0x3b20c526,0x3ba30eca,0x3bab753b,0x3b4111ef,0x3aeb0251,0x3a9faaac,0x3aeaf873,0x3b0f6033, +0x3b19113a,0x3b1433a7,0x3b3d62dd,0x3b712a9b,0x3b9f6f80,0x3b1e6c40,0x3abb56e4,0x3a9371b7,0x3a75b559,0xb86113fc,0x37a5d48e,0x37396207,0xb6158778,0x359287e7,0xb3980694,0xb50b087b,0xb697e038,0xb6dc451b,0xb72446ee,0xb6cfc722,0xb704d285,0x380cf256,0xb7dcf856,0xb886f192,0x3950548a, +0x39066a61,0xb8b91ade,0xba13ff0e,0xbaa2bbcb,0xbb395aa9,0xbb4c6a56,0xbb019f2f,0x39e9ef84,0x3b0481ca,0x3b099008,0x3a9b7179,0xb8b74ad0,0xbac9a452,0xba85203f,0x38a4de5a,0x3aced317,0x3b0bf8d7,0x3b17df1d,0x3b83ee4b,0x3b2f56d4,0xb9497cb9,0xb85de111,0x37c5fe9d,0xb7468738,0x37245d6d, +0x35b4af12,0x369d8675,0x3691b525,0x36af3e74,0x36e05ced,0x363c4799,0x366dea3d,0xb7bf82b8,0x36e866cb,0x37e280a2,0x38928b10,0x3a4a312e,0x3ab6209e,0x3b0fa8f1,0x3b388b5a,0x3b9ce069,0x3ba76b91,0x3b70fa27,0x39fa073f,0xbad14962,0xbb0a9d8d,0x3b00f1d0,0x3b971f8b,0x3b96d828,0x3ba71bbe, +0x3b23bbae,0xbac58f1c,0x3990bc13,0xbb126fc2,0xbc18e92a,0xbb5a299f,0x3a08d6ff,0xb7d9a676,0x37089936,0xb69dfa67,0xb728716e,0xb72f7f14,0xb70c507c,0xb70200ea,0xb6eb0429,0xb6bf12c0,0xb6c4c91a,0x371e162b,0xb586e525,0x388adb2b,0xb89be6cb,0xba6ba1f9,0xbabd7c0e,0xbab3281b,0xbaa40a4d, +0xbabf7516,0xbabd3838,0xbac56f84,0xba9e1f59,0xb99d6efc,0x3af586a5,0x3b9a3afa,0x3b222a48,0xba019557,0xbb875da4,0xb9d74204,0x3b0f40a9,0x3b5b3b02,0x3ac2e15d,0x3adaeea3,0xbb51b977,0xbb34b60e,0xba1adaf6,0x387cb8f2,0xb82668e2,0x37d56c25,0x37832cc2,0x37db77e3,0x37897007,0x378287ab, +0x375f7fdf,0x36e6eafa,0x37649ed4,0xb7d7b276,0x376dca6a,0xb912960c,0x38c9f19d,0x3a908cb4,0x3aec3afa,0x3ad56df8,0x3ab57845,0x3a897882,0x3a00530a,0x39163fd4,0xb8cdf78d,0xb95e2938,0xba172986,0xb9c37554,0xba143d6f,0x39931cc8,0x3a9c0beb,0x3ac5436d,0x3ab3300e,0x3a8dff63,0x3b1fb0f3, +0x3b09612f,0x3b281f5d,0x3adc6609,0x3a70eb6b,0x38a1d2f1,0xb7ae1939,0xb72db750,0xb8754d2d,0xb842a655,0xb822e0c8,0xb8099d35,0xb7d21815,0xb7ad6de7,0xb72a4ef5,0x36e62d54,0x38a264d7,0x37c2b30b,0x3a158b18,0x3a7a9405,0x3a81dab6,0x3a4947e8,0x3a0ebd7a,0x391e6916,0x38a14da1,0xb9a4012c, +0xba8798f7,0xba9499ee,0xbab13ea3,0xbad50b89,0xbab4d23c,0xba789378,0x392f068d,0x395202af,0x3a638178,0x3ab01f9b,0x3aefb672,0x38b46c82,0x387aebee,0xb8f1818d,0xb7812548,0xb88512f1,0xb7739003,0x38cae97a,0x3901d77c,0x38edbde5,0x38b41966,0x38a4a787,0x387789e4,0x3838101e,0x380684b8, +0xb73c5511,0xb90656b8,0xb95a3cc5,0xb9920484,0xb931fc1d,0x3865b4b4,0xb94fdd01,0xb99032c4,0xb9e340ce,0xba11a243,0xba30fc98,0xba54a3c8,0xba24eb76,0xb9fa96e8,0xb9a32907,0xb8ef7e58,0xb607bc32,0x388ddeac,0x3893aade,0x3801885a,0xb787ff43,0x37c91e5c,0xba099917,0xba25ed6a,0xba81664f, +0xba362cbb,0xba396782,0xba2afd0d,0xba10f9f1,0xb9d4451a,0xb99303c1,0xb988456f,0xb9695152,0xb9377cc0,0xb9089724,0xb8c158f9,0xb8d53515,0x35ba530f,0x399fcaf2,0x39f79328,0x3a57d415,0x3a58631b,0x3a29f739,0x3a2786b8,0x3a1682d8,0x3a069a36,0x39eed23f,0x39c92b59,0x39a533e0,0x398e8f9c, +0x39838d4a,0x39543305,0x393a16b3,0x39344a13,0x37c77533,0xb8b6557b,0xb94c9154,0xb9b1e254,0x37d19823,0x373f053a,0x3931efc3,0x382a881b,0xb9a01de5,0x38eca084,0xb60302e7,0xb99b4ab8,0xb98ccabf,0xb95548c0,0xb921d122,0xb8cf07a6,0xb872eadc,0xb7a99540,0x39d2d869,0x3a01d860,0x39860008, +0x3a137d3f,0x3a23b8c8,0x39c5f5b5,0x39d378a5,0x39c74552,0x39b6e8e7,0x39ad72e9,0x39a09c2d,0x39935f4f,0x398e5336,0x39852e4d,0x39777881,0x3975b035,0x39753f22,0x3987798f,0x395942f5,0x392b595e,0x38e46eb9,0x389f9464,0x39c2c333,0xba7df050,0xba41115e,0xba7f6dde,0xba5a8bd0,0xb9ea62f7, +0x396495fc,0xba750197,0xb9f7839b,0x399d17fc,0x38e68363,0x38232706,0x3845e57b,0xb9118071,0xb9146d83,0x3870008e,0xba189562,0xba75fc2a,0x398b1cc0,0xb9f32bf9,0xba5e35bd,0xba85373e,0xba6f4299,0xba8306bf,0xba8fd478,0xba8cc02e,0xba875d10,0xba78901e,0xba5a1ec1,0xba622d0d,0xba995359, +0xba7dbac1,0xba691b05,0xba29a840,0xba5ccdbd,0xba60955f,0xba603c9b,0xba4ce562,0xba363840,0xba8aec7c,0xb94629ef,0xba4217f9,0xba1c35e7,0xba12ecfd,0xb9a46c1a,0xb7d4f2fc,0xb931531f,0xb9485721,0xb9379b2a,0xb99f6976,0xb9a8e804,0xb9852286,0xb9fe9aba,0xba3c8955,0xba3ee192,0xba1fc1a1, +0xb988f4b9,0xba9e8f65,0xbaa11208,0xbac96103,0xbaf84cf6,0xbafbfead,0xbae2e724,0xbab3d8f9,0xba60b008,0xba6c5b14,0xbae5f933,0xbaa75cf2,0xba85b290,0xb9d043eb,0xba6a3971,0xba81c6d1,0xba8000ca,0xba49fa24,0xb9cfabe0,0xba70bb06,0xba02d818,0xba051416,0xb95bc819,0x381b008a,0x38d864b0, +0x380bb18d,0x383947eb,0x3890b4c5,0x3888fcbf,0x38e682de,0x38dfc14a,0x38e5964c,0x391eb9e9,0x38cd3f0d,0xb91677a3,0xba0e2ffa,0xba1e18f1,0xba9d1a98,0xbaadcf79,0xbada63f8,0xbb0f5cd5,0xbb12186c,0xbafbcf17,0xbab0e67d,0xba29f0a1,0xba63ff48,0xbb25e95a,0xbab94c80,0xba848637,0x39b653a5, +0xba54119f,0xba4afa3d,0xba487ffe,0xb9d47054,0xb9dc2f5f,0xba87c732,0xb9d2d17f,0xb9478980,0x38ffb701,0xb6d7c0ce,0xb8148e97,0xb7c3169c,0xb78a88e5,0xb7f7f901,0xb8020bfc,0xb8434e53,0xb840fb49,0xb8576bf8,0xb880a2be,0xb79f279a,0x38cff57c,0xb968fdb7,0xba1ea8b0,0xbac4eb61,0xbafe7794, +0xbb3d239a,0xbb8ba1f5,0xbb94baf4,0xbb80fba1,0xbb24bdec,0xba5082c7,0xba99c084,0xbb7c35f0,0xbb192db9,0xba8eedb7,0x3a5e79d0,0xba569319,0xbab4414e,0xbaa9b7fa,0xba1e7fc5,0xb9c2caed,0x38b7fdc1,0x3a004366,0x37d5e2b3,0xb7493fe5,0xb7b5c017,0x37df75c3,0x370098a2,0x37423b59,0x3752e408, +0x378ec18b,0x37af1ce6,0x37c5efa8,0x37bc13b0,0x38104d8d,0xb74e4662,0xb7682b67,0x38e59d0b,0x38062eef,0xba42c494,0xba132a5d,0x3a23bee5,0x3b008978,0x3b8707dd,0x3b89e19d,0x3b136217,0x3a50e1ac,0x392e51db,0x39fc0639,0x3a58616b,0x39dfe36f,0xba28e651,0x39f12719,0x3ab8a95c,0x3b337b40, +0x39cea01f,0x3a92b51b,0x39d0671e,0x39c47043,0xb92a4855,0x38baff64,0xb7f9233e,0x368a864a,0xb770d2a3,0xb6899c9c,0xb71c337e,0xb717e5d1,0xb748afb9,0xb743aa9d,0xb769094f,0xb762ac27,0x3608d786,0x37a8fd75,0xb8d3766d,0x396e5dad,0xb9a3a38b,0xbab61b88,0xbb1c88b2,0xbb6d20fe,0xbb88881a, +0xbb6adde9,0xbaf65808,0x3a272084,0x3afb8a7d,0x3ac5a048,0x3a2101e1,0xba055ba1,0xbada61e5,0xbab046c3,0xb975c48a,0x3ad97b7e,0x3ae97b1b,0x3acc7d36,0x3b47866a,0x3b0442ea,0xb9a37cfa,0x37cb8ac5,0xb5ae8bcd,0x3708cb63,0x3712ef69,0x37040d8f,0x36f1b0a1,0x370bc200,0x37097d37,0x3715a505, +0x370c91ff,0x371d454a,0xb69d3c4c,0xb763e64c,0x385d1146,0xb94526bd,0x393f6d10,0x3a959fd5,0x3b0ac39e,0x3b348946,0x3b685110,0x3b327110,0x3a096828,0xbb14974c,0xbb5e34f2,0xbb2a04d1,0x3a09a18f,0x3ad99946,0x39903a93,0xb8bcdb36,0xbb03b52b,0xbb8f9fed,0xba4c00bd,0xbb66814f,0xbbeeddf4, +0xbb227af8,0x3a0b9e33,0xb8860f66,0x36595040,0xb73c5723,0xb78604c0,0xb7431417,0xb74231bd,0xb735c353,0xb72e1a64,0xb71f755f,0xb730e0e7,0xb6adf3fd,0xb60c08ba,0x37f0719b,0x38138721,0xba3d274a,0xbac82ce4,0xbaee7c66,0xbb0b6c3a,0xbb2398a0,0xbb198add,0xbb086b9f,0xbac6ca4e,0xba0e8a96, +0x3aa60d43,0x3b6d814b,0x3a7055c3,0xbae3e2a5,0xbb88f113,0xbb2d0198,0xbab614e4,0xba85f65f,0xbadda9eb,0xba947de3,0xbba01792,0xbb18c573,0xb9eec05b,0x38eaeffd,0xb8041a41,0x3826c76f,0x37bcb1dc,0x37e0f7db,0x37a88f3e,0x37abcd51,0x379be9bf,0x3771f616,0x37ad03cd,0x360e7a76,0x375e369d, +0xb88d4c8e,0xb86db6b0,0x3a3fa3b8,0x3aa7ed90,0x3aa017ca,0x3a973152,0x3a4813d2,0x39632245,0xb9d53eb4,0xba9d40ab,0xbab70872,0xbafe895c,0xbb09a7de,0xbb012bf6,0xbaaf9593,0xba6bdb25,0xba66a495,0xba784ade,0xba8af098,0x3887abfd,0x3a0aa4a5,0x3aa9c7fd,0x3ae121cc,0x39ff9ee3,0xb790d3c5, +0xb8049937,0xb83e035d,0xb88ac875,0xb846f7a7,0xb83e56a2,0xb830c6f9,0xb818499e,0xb8123c9a,0xb7f0241d,0xb814c2ae,0x381a1197,0xb630233d,0x39bf725b,0x3a6a1ec6,0x3a85a8e5,0x3a1e6c15,0x396889ec,0xb9450c0c,0xb9dc4181,0xba4b9d09,0xbab2fe08,0xbab62e76,0xbab0d44e,0xbaa8c2a3,0xba9f5dcd, +0xbaa33e00,0xba90fe06,0xba5e8677,0xb9a12871,0x36fcc887,0x39bb11fb,0xb9760de7,0xb8f9bc95,0xb96da114,0xb8a71c68,0x3805f875,0x3887892c,0x39147e2c,0x3910be77,0x38e870c0,0x38d7b9c4,0x38ca8f40,0x38b6fc3f,0x389e2ad7,0x38a84f46,0x387f9251,0xb62daa80,0xb90be813,0xb9b26214,0xb9e444eb, +0xb9f3a669,0xba1cf039,0xba14b60a,0xba20870d,0xba3cb26e,0xba59967a,0xba770452,0xba79dcef,0xba852858,0xba88ea81,0xba784cc5,0xba574c11,0xba4c1bc4,0xba23ba4d,0xba15671b,0xb9fad20e,0xb9aae446,0xba491221,0xba623267,0xba1b5d79,0xba4e8cef,0xba3de472,0xba1861b8,0xb9ed25cc,0xb9c687ba, +0xb997301c,0xb99d6738,0xb98dc97b,0xb989d527,0xb972a818,0xb980fb9c,0xb956f5ac,0xb94e9d81,0xb92d5984,0x389a900f,0x3a1290c0,0x3a03a1ce,0x39f37eae,0x39c4dbe5,0x39a458d7,0x398106a1,0x394a2c09,0x39172fb2,0x38003fc8,0xb894c9ae,0xb950bfab,0xb9b9deaf,0xba0c28c6,0xba3b497c,0xba3e934c, +0xba3da3f9,0xba3dc740,0xba45b967,0xb9daf36a,0xb9f2ab1d,0xb9c762a5,0xb93c6a18,0x394748ef,0xba04ad73,0xb99978cf,0xb851694e,0xb7f6632a,0x37c397eb,0x38b6dbc6,0x3910c720,0x395de8c7,0x3998ae74,0xb7a086ba,0xb9653ac7,0x3a25ec64,0x393b67b1,0xb7b67adf,0xb8666b90,0xb8366d3d,0xb8a0998b, +0xb8c22780,0xb8e9861d,0xb90d7124,0xb91f5e71,0xb96285ac,0xb98e228c,0xb9a6bda0,0xb9bc1893,0xb9c9e4a8,0xb9e22d9a,0xb9d6015e,0xb9db0e10,0xb9de6770,0xb9e3595b,0xb992982c,0xb8a43128,0xb7a4f098,0x38c3587c,0xb99c9ae8,0xba3f25fe,0xba9a65c4,0xb9220860,0xba1c0618,0xba292c04,0xba52e2e9, +0xba607dc4,0xba648f68,0xba87e2de,0xba90d12a,0xba845685,0xba4486ea,0xb98366fa,0xba9f8a83,0xba374f07,0xb9a6fa0f,0x3881def6,0xb8e86f9c,0xb8a94fc5,0xb92b5249,0xb8e21e9f,0xb8944bd0,0xb7dd2907,0x38723b72,0x37f85846,0xb96d2bb6,0xb76873b9,0x389cd783,0x399f77d5,0x38ebb5a9,0x384a287a, +0xb8ceb7e4,0x37fcad30,0x385a033c,0xb7d92f66,0xba57e84f,0xb8abf41b,0xb9b83023,0xb9bc6523,0xb828e770,0x39611395,0x38d8ce6a,0x39075885,0x39040aaa,0x38cce1e0,0x38a2187c,0x3915d16b,0xb95f81a5,0xb9ba21d2,0xb9aa1eda,0xb9169c89,0xba4cd4e4,0xb93ec7ca,0xb96129d5,0xb9cc7611,0xba1fac8a, +0xba0ae287,0xb9bf05b0,0xb92cdfbb,0x3961614b,0x391dbe93,0xba0f49e8,0xb84c57df,0x396dcf2e,0x3a4b58f1,0x39a0ef5f,0x38914ddf,0xb98c2fb6,0x35ea6c10,0x39a8b562,0xb91b7b26,0xb96ad2b7,0xb9448d0c,0xb919d387,0x38be844f,0x38020591,0xb86fce87,0xb7ebb8ec,0xb7ad8d5d,0xb7e12e80,0xb5808754, +0xb6980683,0xb679091b,0x3877f8e2,0x390601d7,0xb89c3a03,0xb9616c40,0xb9cb2b04,0xb9d3cb3e,0xb8d00e3c,0xb9c595dd,0xba265906,0xb9fe3311,0xb960240c,0x38951ddc,0x3a14ad9b,0x39b88b7d,0xba7d80ea,0x39329e4f,0x3a2362ef,0x3aef5683,0x3a366438,0x39d4ddfe,0xb938617f,0x3982f2a4,0x394ced9d, +0xb9e3f000,0xb9b49ccb,0x372c508b,0x38536b00,0xb7272151,0xb7cdd3fd,0x37c17817,0x37279c7c,0x36dd7b7f,0x36dbf084,0xb611608e,0xb6a9a8bc,0xb30b77df,0xb81b719c,0xb7d49a83,0x3795aa9b,0x3790239b,0xba0a27d3,0xba449b57,0xba15a227,0xbaa15a6e,0xbb01d76d,0xbaf3a053,0xbaa980c1,0xb9f9d4b8, +0x3a42f997,0x398f1b46,0xbaf84dc6,0xb9b4b14a,0x3a618b5b,0x3b279c4f,0x3a6ac3dd,0xb8e99c12,0xba5cc40c,0xb91c3e86,0x3a8eb8f2,0x3a720694,0x3935dc3b,0x387c926c,0xb86492ec,0x3780da0b,0x36d3fa3c,0xb6d06bb2,0xb6ba707c,0xb60527f7,0xb6296352,0x36346630,0x351352a2,0x36ed54ca,0x36caab95, +0x38100ece,0xb8917c7b,0x3914addd,0x3810df5f,0x3950af70,0x3a9ba1ee,0x3aeecd8d,0x3b39e84f,0x3b8398d4,0x3b7ae6c5,0x3b00e722,0x3aa740e0,0x3a9e0842,0x3ae89742,0x3b1ff57b,0x3b14faaf,0x3a9a6cbd,0x3b09f96e,0x3b2f14ed,0x3b5c100a,0x3abb94e2,0x3abc78b3,0x3a749cff,0x398b084e,0xb8f957d1, +0x38a2e2aa,0xb812c823,0x37182272,0xb698579e,0x3699f057,0xb4f07da1,0x34d054c1,0xb54e6638,0xb64219fd,0x34c8097e,0xb754b43b,0x36406473,0x35bcb370,0xb78ed5d4,0xb86f75b7,0xb8a4aaa8,0xb9f3af93,0xba9a7385,0xbad8d95b,0xbb28f1c0,0xbb16c927,0xba8a8914,0x3a5cb0ad,0x3ae71e49,0x3aa89a9d, +0x3a2ef468,0xb97c8d7a,0xbab96cdf,0xba214127,0x39bbffb7,0x3acbe944,0x3afc07e8,0x3ab08b8f,0x3b257c03,0x3a9bbe19,0xb9a69bc1,0x38868c69,0xb72e802c,0x36fe8f43,0x35a8595d,0x340a77a1,0x35a2f7b1,0x35210dab,0x3614ec8d,0x3432a577,0x36ad6bcf,0xb5fc1e3b,0x378f31f1,0xb82f7517,0x38957f8d, +0xb8832915,0x3a16547b,0x3ac4822e,0x3b0d8217,0x3b396142,0x3b87327a,0x3b7f32b8,0x3b0bf863,0xb8084307,0xba8ee1de,0xba369491,0x3b0d0e11,0x3b6f2885,0x3b538af7,0x3b2f59a6,0x3a25e45d,0xbabe5cd1,0xb86f24dd,0xbafa6ffa,0xbbb83e4e,0xbad78f11,0x3a2d68c7,0xb95e3a47,0x388f7713,0xb81f266a, +0x3702f4e1,0xb70f03de,0xb49e980e,0xb6897100,0xb5d3a24c,0xb6828e55,0xb4cd5fd6,0xb721ec09,0x37248d96,0xb7a71e7a,0x3908d7c1,0xba19be74,0xba9c7b30,0xba777f78,0xba8070e3,0xba93b3ac,0xba8891f8,0xba8365c7,0xba60582b,0x39ae1a25,0x3ae91f29,0x3b648d79,0x3a09aa46,0xbacbe8a4,0xbb252483, +0xb8ae8ae0,0x3afa47ae,0x3b5a25cf,0x39a5c849,0x3b095996,0xbb8071a1,0xbb2d088a,0x390959a3,0xb863d059,0x385a4e25,0xb67e80d9,0x37ac10ae,0x360f7f47,0x3715c909,0x369218ed,0x36d70ec8,0x3653676f,0x37010055,0x36186872,0x37273b68,0xb7a45d0f,0xb901026e,0x3a0f37b5,0x3aad8d47,0x3a93bf19, +0x3a606cac,0x3a1f8601,0x3954a229,0xb8c7aeb5,0xb9e399f0,0xba047fc0,0xba4b313a,0xb9e77ea2,0xb9ebe74a,0x39ae1c03,0x3a9f2aa6,0x3af1cffd,0x3b0b10bd,0x3b18a140,0x3b55780c,0x3a92b2c0,0x3ac6657d,0x3a8e78d5,0x398b389c,0xb8daf4ab,0xb3c72be4,0xb858b43c,0xb74b64e2,0xb7a21ec4,0xb72c6018, +0xb75c7f4a,0xb7155fae,0xb73223fb,0xb6ca8277,0xb7b2fb3e,0x371fc043,0xb738d57b,0x396fe77d,0x3a47563a,0x3a6ba232,0x3a57487f,0x3a3a437d,0x39d0f5f9,0x398dea40,0xb8863c86,0xba1ebc86,0xba469257,0xba69cfc3,0xba893e46,0xba58e5f2,0xba066eb3,0x396b681f,0x38051b6a,0x399a6f19,0x3a02a3b5, +0x3a2ccf7b,0x3a02577f,0x39d38c44,0x38089a5e,0x3927a89a,0x37cc962e,0x38d58eb4,0x38aa6252,0x3817c9f4,0x37e9b92b,0x379de820,0x37ad660a,0x3783603e,0x3754e4f3,0x3788fa52,0x37f3c16e,0x38172929,0xb88d773b,0xb98e8463,0xb9dff7f6,0xb98c0acb,0xb9a5559c,0xb9da0669,0xb9ff6c97,0xba1cdaff, +0xba3637a7,0xba560f60,0xba29d9fc,0xba0a77a4,0xb9d4ee85,0xb93248dc,0xb6b62b93,0x3931f225,0x394a4931,0x395d7fb3,0x3990a0d7,0x39c1906b,0xb9c07c30,0xb9d8f2de,0xba59a7af,0xb9d9f576,0xb9f53bee,0xb9ca2ab4,0xb9437d4f,0xb8963383,0x3758df30,0xb5b10bce,0x36f265b6,0x3706a3b9,0x37a46e58, +0x36dd9534,0xb8cb71c1,0xb91693c4,0xb82fc719,0x38e550c2,0x398b8ed8,0x39d7a1be,0x3985f030,0x3965642f,0x392aa71e,0x38beed8d,0x381939d0,0xb825f53c,0xb767e45c,0x37226ef7,0x3804f332,0x37e18477,0x37e3a12c,0x381a8380,0xb83730e4,0xb8e627fa,0xb9511161,0xb9976f94,0xb8c2d724,0xb846c16f, +0xb959462d,0xb9db2520,0xba25e087,0xb95875af,0xb9ef9791,0xba251675,0xba26477b,0xba1e02fa,0xba180315,0xba109db1,0xba0c08a5,0xba043583,0xb9820229,0x36937e27,0xb995b456,0xb8a31e9f,0x38a55343,0x3903a91f,0x38b0c67a,0x38954e5a,0x381ef0cf,0x37b04088,0xb4ddfff5,0xb80f13d2,0xb7b5a434, +0xb7b83b1b,0xb76dff0d,0x354daed9,0x379c4b4c,0x385de80f,0x37866bfa,0xb6ed629b,0xb7df277c,0xb8435c78,0x3837b794,0xba27232d,0xba017edd,0xba422877,0xb98d6b0e,0x37e5d807,0x39269c66,0xb9e3704b,0xb81c47ee,0x39a771fd,0x39404bc8,0x390a3451,0x390dea58,0x37c136ae,0xb623ec95,0x388702b3, +0xb8d1905d,0xb9dc20c3,0x38fff789,0x3816eccf,0xb97d3534,0xba38b6f4,0xba1da1f1,0xba2e91c9,0xba442a81,0xba3411f6,0xba2b3243,0xba206289,0xba10002e,0xba185c7e,0xba52cebb,0xba274050,0xba154766,0xb9c7f14d,0xba09ec06,0xba0ce017,0xba0b63ad,0xba04c038,0xba007750,0xba33e898,0x38c7fbd9, +0xb9ebe950,0xb993baff,0xb9394ac3,0xb8a05f47,0xb834eb87,0xb8865989,0xb8813d6e,0xb859d93a,0xb893a8a1,0xb8992a45,0xb85d6eb4,0xb8c3e567,0xb9440c5f,0xb9be25c4,0xb9b75c77,0x38c17fda,0xba3694ba,0xba65b78b,0xba897b9a,0xbaad4aeb,0xba9e555e,0xba8ad365,0xba657081,0xba150190,0xba2620dc, +0xbaa1ba73,0xba5ddb1a,0xba2138d5,0xb906fba5,0xb9efb7ee,0xba0bd3b5,0xba0c20f5,0xb9ea20e2,0xb9bb8098,0xba3c61c3,0xb924cc07,0xb93f34e4,0x389139df,0x38720f70,0x383018ad,0x37003b72,0x37b7da19,0x37bc665c,0x37a64b26,0x3800a840,0x38057923,0x37d09265,0x3838961f,0x389291b5,0x38e4600c, +0xb928f536,0xb8f01e46,0xba1b278d,0xba762df2,0xba923ed3,0xbac82a0b,0xbaaab78b,0xba8b8070,0xba4e3856,0xb9dd3110,0xba29fddb,0xbaea9f16,0xba6c5303,0xba1277e9,0x39f04af4,0xb9b22caf,0xb9adf719,0xb9b1e806,0xb95be4ef,0xb9c9ad23,0xba54d73b,0xb8afd598,0xb77aafc3,0x380f7c7f,0xb8558384, +0xb70a3e1d,0xb71a5e9c,0xb6d4abf6,0xb73fdc76,0xb70db341,0xb7813a9b,0xb750e638,0xb7925daf,0xb72792fd,0xb86d968a,0x379991d1,0xb806e75e,0xb90b9ec7,0xba6570fc,0xbac50c33,0xbb08e667,0xbb462ed2,0xbb34507e,0xbb113cba,0xbabf8a47,0xb9fafee6,0xba702ee3,0xbb363eda,0xbad00cf5,0xba0d1def, +0x3a7c57b6,0xb8e8a774,0xba0fe578,0xba0a5e61,0xb9610ffe,0xba26ae3e,0x39adfb81,0x39f7ead6,0xb914ed03,0x38464728,0xb70178ca,0x37ad79c2,0xb658cfe6,0x36f6788f,0x3658e5be,0x36cf2f5b,0x36bbb0b1,0x3719e557,0x364136d6,0x378e9a6c,0x3689cb6b,0x380669ce,0xb893f68a,0x39948f3d,0x391d47fc, +0x393174c9,0x3a854354,0x3ad72e56,0x3b3b75f1,0x3b287c70,0x3a7d1a02,0x382bb660,0xb8e2c570,0x39acf063,0x3a8120c8,0x3a277204,0xba3b14b3,0x39e459d5,0x3a805329,0x3accfc73,0xb849703b,0x3a05b5b9,0x39ad5940,0x3946aeee,0xb92a6162,0x38d1584c,0xb876d58f,0x379cb823,0xb75f979c,0x36248f32, +0xb6b507e3,0xb5f03d71,0xb6a23ae9,0xb62794a1,0xb6ddface,0x358678ed,0xb7cc6a43,0x381097e3,0xb8954079,0x38a08ccf,0xb99cde17,0xbaae20d5,0xbb056a6b,0xbb3e5da5,0xbb4e1048,0xbb1c8b3c,0xba59d7c5,0x3a8004bf,0x3ad643b5,0x3a5d1274,0x39b2ebb3,0xb97f1fed,0xba721171,0xb92b29d8,0x3a2329cb, +0x3ac892d1,0x3abef0f3,0x3a5db276,0x3ae3d9f0,0x3a3e35b6,0xb98cf40a,0x38b8a2da,0xb7b3b069,0x37702bca,0xb59516d4,0x368daaf4,0x3609c889,0x365393f1,0x36351b79,0x365a81b9,0x362a504e,0x3685b850,0x36e6b2dd,0xb66675e3,0xb6a7e3a5,0x38742a4c,0x396e6431,0x3a81219e,0x3af664b0,0x3b21f301, +0x3b367671,0x3af39d57,0xb841d9a6,0xbafc84e0,0xbb20f21d,0xbab1d22a,0x39f58d71,0x3a926961,0x3a152578,0xb93f0e9d,0xbac1b79b,0xbb2081a1,0xb9eec5c7,0xbb0f0dd5,0xbb83269b,0xba4d62a0,0x39d6c608,0xb92c9c38,0x38536d28,0xb7f41ae2,0x36a5ec13,0xb70902b6,0xb6211ff5,0xb69e7c0f,0xb66ddcb5, +0xb67e10f4,0xb66acb84,0xb695c09f,0xb69c00da,0xb72a472f,0x388e4db6,0xb97dae3b,0xba8c5325,0xbaa31d9b,0xbabb42df,0xbad8d66c,0xbab50f9b,0xba8d217c,0xba36643a,0x3a151e3e,0x3ae109d8,0x3b3f46c6,0x388cc364,0xbae18f2f,0xbb1c8a10,0xba8c659f,0x39065055,0x3a937a76,0xba6ded3b,0x3a7de4c7, +0xbb59d551,0xbaa7f561,0x39294400,0xb80b73c5,0x3836d96d,0xb695c0e0,0x378ae3fb,0x368c1de4,0x37213c5a,0x36dd3a43,0x36ed1565,0x36e34952,0x36a917d4,0x37269d57,0x3581f313,0x380f6391,0xb91f406c,0x39e3fb0c,0x3a815194,0x3a4c32a1,0x3a3a604f,0x39aed6b5,0x38acbc9e,0xb99285f5,0xba4ca989, +0xba6869db,0xba96f29d,0xba77e57a,0xba7c16e2,0xb9d07767,0x3901653c,0x3a47302e,0x3a98bd0f,0x3ab9005e,0x3b10bab9,0x388828ea,0x3a83add0,0x3a9bc994,0xb89292a6,0xb870c5fb,0xb7b25ccb,0xb7dfa8d2,0xb77f0ce0,0xb792404c,0xb7811a9f,0xb77b71bc,0xb76b0907,0xb74e82c8,0xb7625107,0xb73d1500, +0xb7b4fc22,0xb7783b58,0x3899e76b,0x3a1bdadf,0x3a5949b1,0x3a135edb,0x39cafc1d,0x3902e589,0x382ed5b2,0xb95ae191,0xba255fd4,0xba501a08,0xba60b69c,0xba61be16,0xba53218b,0xba605e7a,0xba630ef1,0xba7296cc,0xba2ee047,0xb9ef765c,0xb97214a8,0x39429966,0x39b91100,0x3988ee20,0x392ad561, +0x38c400b8,0x38928cf0,0x383e547e,0x380f2dab,0x380dca55,0x38088e7a,0x37ff2109,0x37f33661,0x37dd68f5,0x37dc9b5f,0x37e5b43b,0x3823e64f,0x38810f46,0xb931b97e,0xb9ac2748,0xb9f7ae9d,0xba1bc305,0xba130614,0xba1e755a,0xba326ff9,0xba482900,0xba5d4d74,0xba524d0f,0xba504c40,0xba4c0f4e, +0xba275574,0xba01a497,0xb9c55fec,0xb96453dd,0xb8fc8722,0xb6ebb6e1,0x39314c36,0xba02a541,0xb9fec859,0xb9b24c6f,0xb9d734c0,0xb99d17a5,0xb954f0a7,0xb8ac6559,0xb87bdfc2,0xb88ccd8d,0xb883b7ad,0xb881b6b6,0xb87d2f5d,0xb86f13ed,0xb876aeb4,0xb86dd17e,0xb8ecdd7d,0xb94edcd7,0xb9351089, +0x395024ea,0x382f6068,0xb693ace4,0xb882e468,0xb8edadad,0xb92e6423,0xb9592f33,0xb984c44d,0xb99d3dd8,0xb9b1cb10,0xb9cb46fb,0xb9eab340,0xba088abc,0xba1cb04f,0xba19c5f3,0xba121aa7,0xba0f99ac,0xba09c1c1,0xb9c64531,0xb9d3f01e,0xb96a0844,0xb8ee9262,0xb82e8bc1,0xb9bc33a7,0xb9508164, +0xb91078aa,0xb8f6394a,0xb8c0a3e2,0xb889cc69,0xb82adf9e,0xb741df21,0x37b6a385,0xb8406d2b,0xb974b8f2,0x39765f39,0x38c21f7c,0xb8b96702,0xb9985280,0xb986c405,0xb997f6bc,0xb9a1f248,0xb9ab5516,0xb9b6b5c9,0xb9c2e6b7,0xb9cbb68c,0xb9d429df,0xb9d94d27,0xb9ddf467,0xb9dd4f81,0xb9dfcd2f, +0xb9d49972,0xb9d21bae,0xb9cccb10,0xb9cb7c40,0xb9cc902e,0xb9803cb2,0xb9412c1d,0xb90c9833,0xba04718c,0xba2d774d,0xba35321b,0xb9c4b920,0xba074288,0xb9a2de5b,0xb9d72a74,0xb9e51797,0xb9e2a933,0xba02cbc7,0xba0890cd,0xb9f95607,0xba189b09,0xb9d8669c,0xba403114,0xba2006d4,0xb9f5801c, +0xb8f3514b,0xb97d7548,0xb98203fe,0xb9a30d9e,0xb981aeac,0xb96c814d,0xb966bf6b,0xb9383185,0xb94f83db,0xb9b9f1eb,0xb96c949f,0xb9337203,0xb7756e11,0xb92c6170,0xb948b4e5,0xb95e0c8e,0xb92b9c23,0xb9072685,0xb99b0c8e,0xba25a769,0xb94c76e4,0xb97ef10f,0xb850013c,0x38aa47ee,0x38eb3174, +0x38a226f8,0x38c6c2ec,0x38c61de7,0x38c98a9a,0x38b296c8,0x38f610ae,0x38a5e6d4,0xb3aa0708,0xb968e4da,0xb9292bb4,0xba057ad8,0xb9a4f7f8,0xb9c0e21d,0xba109017,0xba34f193,0xba0e7b71,0xb9d92115,0xb9b4e48d,0xb90c6602,0xb956fb19,0xba29d8e6,0xb9b7e3b6,0xb9416d41,0x39454fa4,0xb92a0df5, +0xb98921bf,0xb994f7a2,0xb944b017,0x38138410,0xb9e227b3,0xb9bdaf5e,0xb82bf532,0x387f67ec,0x382bb6f2,0xb78e9fae,0xb8183bff,0xb7c05d5d,0xb7cce45f,0xb7ecabbf,0xb7bc490c,0xb7c4b8f6,0xb7f0c5ab,0xb7c28d0a,0x382ba2fd,0x383494c0,0x37eee008,0xb98aef28,0xb9b71b7e,0xb99741c0,0xba1047c3, +0xba4cd3fc,0xba0915f0,0xb9b396cd,0xb99de8b0,0xb80f5c17,0xb9649d7c,0xba82a7f9,0xb9a561f9,0xb888cd3c,0x3a447c49,0xb8db0d74,0xb9229c27,0xb9171f58,0xb8903a4f,0xb690118d,0xba21f3da,0xb951f05f,0x38c725f3,0xb8378570,0xb7295eb1,0xb5174127,0x3792582e,0x370e7839,0x3729e4c0,0x3730c923, +0x371c0129,0x36f6d4d3,0x3775dfd8,0xb4b153c0,0xb6ba0a21,0xb852ef4f,0x38ac2b89,0xb953593e,0xba1290a5,0xba44dfbb,0xbab28525,0xbaf6cc5e,0xbac0dfa5,0xba842dd3,0xba2f2983,0xb6794f4d,0xb9cd09a8,0xbae1be90,0xba6081c1,0xb8f41162,0x3a884c39,0xb912f0bf,0xba1019e9,0xb9da1a35,0xb96b6c9f, +0x3914cdd0,0x39299ce7,0xb7e12b6d,0x382bd0b5,0xb7dcd61e,0x37e04237,0xb7158ff6,0xb6604666,0xb6d0d65a,0xb671b56d,0xb6b63814,0xb6640f0e,0xb6a720d0,0xb6670c02,0xb6c29185,0x379265b2,0xb70569ad,0x379a752f,0x378cefc4,0x399968db,0x3a8260f4,0x3ac71265,0x3b0e73d4,0x3b2115a3,0x3b0a34e7, +0x3a80ff2d,0x3a039117,0x3a1a965a,0x3a81101b,0x3ad8a6da,0x3aaeac7a,0xb8a12d5f,0x3a6333e6,0x3a9f95d1,0x3acceb80,0x398fbdc0,0x3a8278a0,0x3a09a248,0xb90c818c,0x38099630,0xb6727878,0xb7128bcf,0x362d902b,0x360b0014,0x3643d489,0x360b25e1,0x361a255d,0x361c5256,0x35c3112d,0x367e3a63, +0xb5bbb94a,0xb5bb9298,0xb7240641,0x37a42fea,0xb85540fa,0xb9cd7f09,0xba746acf,0xbad3a7b8,0xbb037f11,0xbb111aef,0xbad59179,0xba0e88a8,0x3a5074ba,0x3aa5daad,0x3a2aca69,0x398428ce,0xb9949852,0xba824b33,0xb9536ee4,0x3a040377,0x3aa8bf99,0x3ab08939,0x3a135582,0x3a999f02,0x3956b6bc, +0xb904c6d2,0x384d0936,0xb72e732d,0x36879ff4,0xb62ffa37,0xb5c6f73b,0xb58d90e9,0xb5e6525b,0xb524228b,0xb62701bc,0x35821e80,0xb6bd2907,0x3770f0c2,0xb7a0756f,0x37f04a18,0xb821649d,0x39a389e1,0x3a99a3f4,0x3adad97e,0x3b0fa027,0x3b27ff42,0x3aff93ba,0x39f28b16,0xba5af2a3,0xba94c027, +0xb97d6f07,0x3aa90fd1,0x3ae7c349,0x3a9325cd,0x38d0af8e,0xba8fbf06,0xbad58979,0xb9ba9d2a,0xbadfbfa0,0xbb3f67cf,0xb9064831,0x3956914f,0xb8e6d323,0x382fc671,0xb7ae4326,0x3731523c,0xb63ab19f,0x3646c701,0x3451b41b,0x35f336dd,0x3462df53,0x36657653,0xb68e66d7,0x3703737a,0xb80b2bff, +0x38bb8d7f,0xb927072d,0xba4a8e9b,0xba2cc558,0xba5731ae,0xba739ff8,0xba550a04,0xba24f97a,0xb9dc0f48,0x3a384935,0x3abab994,0x3b01ac79,0xba0934db,0xbadff834,0xbab1cfaf,0xb9d3173d,0x3a2cce4f,0x3ae7c193,0xba4f014c,0x3ad25e14,0xbb36b0d9,0xba5bfcb7,0x3992fa83,0xb8ccf160,0x3869bc73, +0xb7afb08c,0x36fa213c,0xb6d2b2fa,0x351971c7,0xb631a3a9,0xb5b3cdca,0xb5bfb27e,0xb6712192,0x363ae458,0xb689ac72,0x38111927,0xb8c58b68,0x39001bbf,0x3a51f599,0x3a22dfca,0x39ed4906,0x396b046b,0xb7c9d059,0xb997b33a,0xba32b1ae,0xba44e472,0xba739b9d,0xba2dfb78,0xba0b2b29,0x3890ef22, +0x3a46e222,0x3ab31091,0x3ae7a8d7,0x3b120098,0x3b23b61a,0x37c95580,0x3a084016,0x3a04a682,0xb8c9cbe0,0xb796e7b8,0xb74446a1,0xb69d227f,0x370c0ab0,0x35f102c6,0x3689a0e2,0x366b0393,0x365ccee6,0x368f8779,0x366b48be,0x36bc30a8,0xb78bafa9,0xb690df76,0xb6f5afab,0x39c88d21,0x3a36046a, +0x3a1f7f51,0x3a13aa6e,0x39b4cce0,0x3945d52e,0xb87571a0,0xb9c77c2b,0xba03b9e4,0xba0a4605,0xba0cdb77,0xb9f5da03,0xb9e1907f,0xb9987418,0xb9f4d32a,0xb9e21ac3,0xb9c42dd0,0xb9c09393,0x3a0280ed,0x39fff5b7,0x391ab119,0x38a0e661,0x384fdc08,0x3812de62,0xb6c09ba1,0xb788454d,0xb721e3c6, +0xb73e1836,0xb73974d3,0xb73f08e1,0xb72757cc,0xb78186d7,0xb6fe86b6,0x37660070,0x384fc2a1,0xb834621c,0xb9be09c0,0xb9ccf866,0xb9b7f5cc,0xb9d7ecc5,0xb9dce723,0xba017ae6,0xba1184d8,0xba2670aa,0xba18740a,0xba160a16,0xba1351fa,0xb9c7ae46,0xb965afd7,0xb83f71f3,0x3862767e,0x39172b49, +0x39931491,0x39d4d3ec,0xb9a191f1,0xb9a6c2a3,0xb9f7e8fe,0xb92c00f4,0xb94387e9,0xb868b43e,0x38744a94,0x388b8d4b,0x386004ff,0x3874451d,0x38679978,0x386f065f,0x385a97f8,0x388167d0,0x386889b7,0xb74e4fdd,0xb8e83393,0xb90edb8c,0xb8d7145a,0x3798bbfe,0xb864948f,0xb8df94cf,0xb91660ca, +0xb95037a5,0xb97667fb,0xb993d678,0xb97e4857,0xb95d6527,0xb9532efb,0xb95d99c2,0xb9797bcb,0xb98a68cd,0xb98f06fa,0xb993317b,0xb9a38687,0xb9acbe99,0xb95dd2a8,0xb92c922f,0xb9bf69c3,0xb9f8fd04,0xb9fea925,0xb9ad8b73,0xb9de1a38,0xb9d036d8,0xb9d1209f,0xb9cc3270,0xb9c956a6,0xb9c5109d, +0xb9c2297c,0xb9ba9924,0xb9c51224,0xb9927c0d,0xb9b9b026,0xb9a8db97,0xb97dc171,0xb904bbf6,0xb936a805,0xb93ea70e,0xb9550705,0xb961941c,0xb9710450,0xb9864601,0xb9829f15,0xb9830170,0xb97aeb41,0xb97108f1,0xb95fac8b,0xb94e1337,0xb9519b5a,0xb952a437,0xb94a4b55,0xb94d0e59,0xb97b464e, +0xb986a3ad,0xb956349d,0xb9a19d25,0xb84c32cb,0xb7f98ee3,0xb95de60e,0xb8d1a46b,0x33a26f70,0x37c3c078,0xb7bf27dc,0xb825cb7d,0xb82a5b6d,0xb89d03ff,0xb8bd277c,0xb8b4f0a8,0xb79d274e,0xb8a66b37,0xb98d1eef,0xb6d8c517,0xb70de743,0xb986858d,0xb97ec9ff,0xb98a35e3,0xb9a4af83,0xb9876cb7, +0xb97aaf55,0xb971a856,0xb95b32b6,0xb9707eb7,0xb9b3e3bc,0xb9804e16,0xb951f89d,0xb8b6661e,0xb9357dde,0xb94259b9,0xb94cbe35,0xb944af2b,0xb9601dfb,0xb98dffd8,0xb892d682,0xb91d29ee,0xb7ff9fc1,0x35eb1f67,0xb709285e,0x35a13d72,0x36d002b7,0x378a737f,0x379bc3d1,0x37f4804f,0x380f7860, +0x381a5029,0xb5eca1b1,0x36746960,0xb7d75a56,0xb8d715f3,0xb74dc595,0xb96829ff,0xb9cc0d83,0xb9f487f8,0xba1dae86,0xb9f73b0b,0xb9c9bc26,0xb9addf10,0xb956d3ec,0xb986cbbf,0xba1300ef,0xb9af6a55,0xb941bd04,0x38d33576,0xb8a2eccb,0xb913c589,0xb93e0d0d,0xb925744a,0xb92dc110,0xb9d5535a, +0xb7d0432b,0x3728b483,0x380f06e1,0xb5772bac,0x369fd1a5,0xb5e76696,0xb6103538,0xb6bbd0ff,0xb6fb3c6c,0xb725e025,0xb758602b,0xb7423593,0xb414c565,0x3533ec1d,0x37fcfc0a,0x34e33c0d,0x383affd6,0xb9260df6,0xb9c31435,0xb9f17c10,0xba3143c2,0xb9df42a4,0xb998f18a,0xb976d655,0xb8fa429d, +0xb98e1d0e,0xba5653be,0xb99fbb5f,0xb8ab41f5,0x3a037483,0x383f9329,0x37467d81,0xb850afcc,0xb85b0e04,0xb98066b2,0xba06fee1,0x383e9e5e,0xb784ae04,0xb6cafb18,0xb6e71fb6,0x35af6897,0xb54dc10b,0x35f9e1cc,0x360a6946,0x3678e801,0x368a2470,0x36d116ad,0x3679018b,0x362bb2d7,0xb6b143e3, +0xb710a4b1,0xb6bb0935,0xb5592318,0xb9a58a74,0xba46807b,0xba88a741,0xbac037d5,0xba8b8888,0xba3c4cca,0xb9fdde19,0xb8e924ac,0xb9deb3e0,0xbab20a1a,0xba3124c2,0xb807ac5c,0x3a5d07e1,0x39836589,0xb87c1f0f,0xb90c6da1,0xb89e0e6a,0xb952227c,0x39b91d89,0x388c0f51,0xb819859f,0x37af9a47, +0xb680e0cd,0x362fca8c,0xb5b71371,0xb47aa5c6,0xb5d18cc8,0xb5ce788d,0xb6270dfb,0xb61dd906,0xb64a820e,0x35a0fab7,0xb630fd8f,0x378c0a89,0xb7d92cfc,0x381a359c,0x3a0a4224,0x3a302ce2,0x3a8daad9,0x3aadd706,0x3ad00bf7,0x3a9fe1dc,0x39a5e172,0xb8b54443,0x374a1421,0x39c244f3,0x3a8071d4, +0x3a4d6644,0xb99d6da6,0x3a0f9446,0x3a489fc2,0x3a636764,0x38691b6a,0x39ca1576,0x39c5dc12,0xb889f345,0x36e0b4f4,0x35adae4a,0xb6c56a91,0x3648220b,0xb59b0422,0x35c6f1d4,0x3505d6c0,0x35b88ecf,0x35966312,0x36052b9b,0x34e85e18,0x361005e8,0xb68b42d7,0x3595e50c,0xb5923f63,0xb5907c86, +0xb9a05a79,0xba6577fd,0xbaa30c5e,0xbace82cf,0xbad68b0d,0xba8fb162,0xb91f243e,0x3a5d0cf4,0x3a90250e,0x39f42d5e,0x391b4a89,0xb9174c28,0xba06ebd7,0x3990afa6,0x3a44cfdc,0x3a8a3528,0x3a802329,0x39c7b21a,0x3a3a5f8f,0x3808a5d1,0xb848d479,0x37d2aad6,0xb702adf6,0x3641f9b5,0xb605f80e, +0xb5133eb0,0xb5a565d5,0xb58d022b,0xb5b01054,0xb5a76c5b,0xb5a3a421,0xb44697ee,0xb50a4fa8,0x3705fd4f,0xb7ab8b06,0x3818e46e,0x3997bc97,0x3a4c99a1,0x3aa9ae39,0x3ada9c39,0x3ae6626e,0x3a99ff1d,0x388f959b,0xba751ac2,0xba92c84f,0xb9951eb9,0x3a1a855a,0x3a781d32,0x3a695ddb,0x388eaff2, +0xba36ac25,0xba61a938,0xb9348f9b,0xba90a6b6,0xbae84456,0x3906a031,0x37b34610,0xb7d47d00,0x3729d32f,0xb68f16f9,0x3682d20d,0x35773e7d,0x3611a0ca,0x35e24b58,0x35ee629a,0x3606e5bb,0x35af22af,0x35897aed,0x342588eb,0xb71e998f,0x37ba9882,0xb7b6bf7f,0xb9f89dc6,0xba10e108,0xba1ec03e, +0xba32c7f9,0xba0611fe,0xb99c37ce,0xb893fe60,0x3a794315,0x3abc1f53,0x3ad60c14,0xb9ab8ff4,0xba9ad8a7,0xba6bb0f3,0x374dcd99,0x3a6ea500,0x3af33d92,0xb9867a12,0x3aeeb498,0xba9e60e5,0xb931ec29,0x38bbbfcd,0xb7d0ef5b,0x3756d5ab,0xb6c3b419,0xb60a6bd2,0xb6923b78,0xb661adb5,0xb6658c78, +0xb67bdd35,0xb62c3954,0xb6a611f2,0x363a2f91,0xb7192115,0x37fb1e2b,0xb85351ac,0x381a8cee,0x3a25af28,0x39d1de8e,0x39ab59e4,0x3889aa09,0xb82ffa28,0xb94db03b,0xb9dc88d8,0xb9f14bcb,0xba0859b9,0xb95ce47b,0xb945a61f,0x399ad333,0x3a63cd3a,0x3ac954df,0x3b0177f1,0x3b1a6613,0x3b26c138, +0xb933930a,0x3a0e8cfe,0x398a9d72,0xb91485c1,0x381be85c,0xb7b3fa84,0x3736e629,0x36abe1f5,0x37198a90,0x36e52db2,0x37026383,0x36dac7e3,0x3706417d,0x3697e2da,0x36f84453,0xb72b4b7c,0x36e95358,0xb8570113,0x39356db8,0x3a0f9419,0x39dbff13,0x39de9928,0x39966462,0x397ed0df,0x38ab7588, +0xb91de611,0xb99df1a3,0xb9c9135d,0xb9e369bf,0xb9d90a88,0xb9e856f1,0xb9e53763,0xba2b498c,0xba245ff3,0xba0b269b,0xb9e7d1e7,0x39cd8e37,0x3a0dfeac,0x39888e01,0x367344ca,0x380b9dd7,0xb5a071c2,0xb6bde3bb,0xb7ad1262,0xb78d5f58,0xb79172f5,0xb78979f0,0xb787fab2,0xb780aac5,0xb7858b31, +0xb6d22db6,0x33a42f41,0x37b7bfa2,0x381bb4d1,0xb90fedf9,0xb999cf44,0xb9af2b58,0xb9b4c6f8,0xb9c4222d,0xb9ddf5cd,0xb9f7e22e,0xba0a08f7,0xb9fa995c,0xb9ea775c,0xb9dbb5e5,0xb99518ae,0xb92bd8dd,0xb80b3d74,0x38a7ba3c,0x393a78a6,0x398e9e61,0x39d550aa,0xb975ea55,0xb95b4a6d,0xb937aae6, +0xb88f5af5,0xb82d45e2,0x36a7b2ad,0x37d6fd34,0x386b5231,0x384626b5,0x384ae109,0x383fb152,0x383d2c31,0x3833a675,0x38382bed,0x37be84ff,0x35e333dc,0xb74cda88,0xb9151de4,0xb8bd2c54,0xb91e8b60,0xb9483489,0xb9658388,0xb97fedd0,0xb9901e0b,0xb99b173e,0xb9aa6a73,0xb9a3b49d,0xb99ccb75, +0xb9981d92,0xb995fd3e,0xb996bef0,0xb9988345,0xb9964840,0xb98ebddc,0xb990c0bb,0xb9876a7a,0xb95a6d05,0xb954c801,0xb91f8512,0xb929f3be,0xb97e81be,0xb9163382,0xb8d1bb07,0xb90601b2,0xb904da9c,0xb8fbfe61,0xb8f6dc2a,0xb8eca6dc,0xb8e8c5df,0xb8dfe186,0xb88bb2ef,0xb9084af9,0xb93444b7, +0xb8c5286d,0xb8f98bab,0xb9825fc3,0xb97c6832,0xb9852b25,0xb98cf6cb,0xb99216f1,0xb9986a07,0xb9a2041a,0xb99c0f7c,0xb9985bd6,0xb991d486,0xb98c2bdc,0xb9840864,0xb9740aa5,0xb96df0b9,0xb9686cf1,0xb95d93ba,0xb95a3eb7,0xb99316ea,0xb98540cd,0xb95e43b7,0xb96b18b4,0xb9ab291c,0xb9aa6d26, +0xb966ea5c,0xb8e016e0,0xb8eaee84,0xb6a7dbe6,0xb80fd762,0xb82937bf,0xb81d5646,0xb852a012,0xb8613a0a,0xb81ddb94,0xb8ed6c15,0xb8cf1515,0xb97607c4,0xb993f53f,0xb99670ae,0xb94f14c3,0xb9785950,0xb98545c3,0xb9969693,0xb9829838,0xb97bc534,0xb97fe439,0xb9731cba,0xb97fd9cf,0xb9a1790f, +0xb986d6b1,0xb975587e,0xb929074e,0xb972000a,0xb9731b3e,0xb953c9dd,0xb955144a,0xb93e5b39,0xb9a195aa,0xb99851ee,0xb6ad2e29,0x37b7bea2,0x388e3267,0x37ed118e,0x3781eeb3,0x371f47d3,0x3796082a,0x3784568f,0x37b34f9f,0x3794f0b6,0x37d755ca,0x37f0607e,0x3894fe82,0x3704bd81,0x37cea407, +0xb92e32f5,0xb98d0313,0xb9ad8a77,0xb9e5a7c1,0xba0454a5,0xb9d5de30,0xb9b46ddc,0xb9ac3a20,0xb986ac12,0xb99cb158,0xb9fd6203,0xb9c10407,0xb999a051,0xb8ef6376,0xb98b184e,0xb990b024,0xb9491f73,0xb95392d8,0xb8d83aaa,0xb9e9e4e9,0xb85c2a3b,0x388b3fde,0xb7b7da68,0xb783aad3,0xb76a0303, +0xb69e5149,0xb698da05,0xb6b7bbe1,0xb6e2bdc7,0xb6e0b574,0xb7008261,0xb6ff7009,0xb77393f8,0xb794ec6d,0xb7424765,0x38050111,0xb68945fd,0xb96f972c,0xb99de9ac,0xb9e54f11,0xba17c980,0xb9d38245,0xb9a8fcbf,0xb9b33fcb,0xb98cd9cb,0xb9c23c44,0xba30cfd0,0xb9d76ae8,0xb9a1d1ad,0x389085ea, +0xb9a2d710,0xb987c462,0xb89ba44a,0xb925d64c,0xb8f08416,0xb9fa57ae,0x389fca87,0xb7dd69dd,0x3653da4e,0x37193279,0x36ae6b10,0x363cdf04,0x35fbbebb,0x3629108a,0x36472610,0x364fc203,0x3655310b,0x368626d0,0x36ba0e55,0x372646d3,0xb5c6a898,0xb6de8561,0x3796f30e,0xb994b611,0xba1dc8b4, +0xba713723,0xba9ba7ce,0xba665c2d,0xba26545a,0xba0c3ca2,0xb9a8fed8,0xba096729,0xba8c027e,0xba449f64,0xb9d62c66,0x391a56a6,0xb9b39c5b,0xb9ced3d8,0xb8a801b4,0xb90bf38d,0xb96f801f,0xb8453074,0x3822d94c,0xb741e972,0x36d3c25f,0xb6d2cfc3,0xb60e94bc,0xb5cdab12,0xb5870c8c,0xb5a70ef2, +0xb5c477b3,0xb5d44dba,0xb5c5295c,0xb61501b0,0xb619b919,0xb6c14581,0x368530cb,0xb641ec79,0xb710b2b3,0x3978afc8,0x3a03e376,0x3a53ba45,0x3a8f3414,0x3a84de16,0x3a43e586,0x399e45b3,0x375f4cfa,0x38a43c9e,0x398af040,0x3a2a6c3d,0x39d5e758,0xba0d1790,0x38b50e72,0x397e6cce,0x39ae027e, +0xb92c6d68,0x39e339ca,0x3958697a,0xb8ba6301,0x38061941,0xb7554649,0x36dbb3cc,0x33ac9e23,0x35b7d8a4,0x350deb7e,0x3556d6a7,0x3576e393,0x35536772,0x35a1de2a,0x350f8ddb,0x36435d69,0xb49ef208,0x369bbb70,0xb76a8e3b,0x386237d0,0xb9b74e77,0xba4f25f9,0xba955106,0xbab3c9f6,0xbaa155ea, +0xba488075,0xb905a26f,0x3a13fe38,0x3a3e025a,0x399760c5,0x383e4a98,0xb93b4e34,0xb9e9084f,0x38bfd323,0x39e4809c,0x3a3d8dd4,0x3a277c81,0x3912c297,0x398e6045,0x3698c7fc,0xb770fa0d,0x370d1238,0xb6afbac7,0x34cf54a3,0xb5d21617,0xb4be3ee6,0xb5768fbd,0xb536cbd0,0xb56cbccd,0xb536791f, +0xb59c821b,0xb5404fc3,0xb6531843,0x3690f562,0xb6f06e69,0xb4719c12,0x39170ebc,0x3a1b3c19,0x3a67d826,0x3a9373f5,0x3a847056,0x3a023fe2,0xb99b63f4,0xba6c49d9,0xba65eb80,0xb914d495,0x39c62fec,0x39d7ba74,0x388f7b6a,0xba39d7f7,0xba983835,0xba85a6f1,0xb993eb36,0xba8754a5,0xba7a45f7, +0x394cdd17,0xb88080b9,0x37c26561,0xb706fa12,0x36cb7b19,0xb55e5772,0x360a887e,0x3539ca21,0x35b3745b,0x358cfcb8,0x3594b6aa,0x35ba8896,0x358f5a42,0x3676e65f,0xb68ff38b,0x36911c2a,0x37a6321f,0xb993a5d7,0xb9c0ac95,0xb9fa1ce6,0xba08a7ec,0xb9ead8de,0xb987fa15,0xb7f44c32,0x3a29e064, +0x3a604d45,0x3a492855,0xba089c70,0xba80cefa,0xba0c4693,0xb9a2a642,0x38a00132,0x3a0ec162,0xba36855b,0x3a5ff233,0xba3dfbd8,0x38f943f7,0xb7fe4bff,0x37731a9c,0xb73a1839,0x358ff5b8,0xb68d4b79,0xb5a60ed5,0xb62ea27e,0xb6016667,0xb613d392,0xb60686b8,0xb61ba2cf,0xb62a16b8,0xb695161a, +0x3527d3c8,0x37179e53,0xb8547c5f,0x39a84ec9,0x396ba108,0x392b1201,0x368ec18f,0xb8d76cce,0xb984f3c2,0xba00d8ba,0xba0d8d8a,0xba1e83cb,0xb9f1dc7d,0xb9a1f791,0x383dda13,0x39ed9a88,0x3a526ac4,0x3a8d69ec,0x3ab843dd,0x3aaec363,0xb9c9316b,0x388595e8,0x386c0851,0xb845b177,0x37b216b0, +0xb5c4e81e,0x3722367b,0x363c5414,0x36b8a0ea,0x36863aaa,0x369de1da,0x368dcfb0,0x36910026,0x369805a8,0x36bdda46,0x36f81b46,0x3698db4a,0xb7b79154,0x37a67517,0x39c0cc04,0x3999b96c,0x3992e6df,0x3945682f,0x38c6c488,0xb7befac2,0xb91e9b4a,0xb96ab0fc,0xb96b052b,0xb956fb79,0xb97647ec, +0xb9acb3ad,0xb9eeda39,0xba162a65,0xba1ee4dd,0xba1a452c,0xba16acd5,0x399619ba,0x39ca2745,0x3859340a,0xb6e1033d,0x364b711e,0xb7b75bdd,0xb724ee1e,0xb745e80d,0xb725f303,0xb72a674a,0xb72afb65,0xb7217eaf,0xb725e080,0xb7207b26,0xb76735b0,0xb76afcdd,0xb79d168f,0x38609b3d,0xb84b8eb0, +0xb98abd6a,0xb965a006,0xb97cac03,0xb975efed,0xb98dc0e1,0xb99cde57,0xb9afe916,0xb9b340ea,0xb9c10eec,0xb9cddb2f,0xb9a1f358,0xb963ef8b,0xb9021684,0xb7acbf95,0x3892bf0f,0x39326422,0x398dd9c7,0xb949e8e4,0xb9387abf,0xb8e5f911,0x37b2afb1,0x3796eced,0x38622660,0x37ef65c0,0x3808dbc4, +0x37e10417,0x37f2a293,0x37e51290,0x37ed4e73,0x37cef6bb,0x380106ba,0x37f36767,0x386c25bd,0x37c2ee9f,0xb6aa5495,0xb93b7366,0xb92ca9f4,0xb922e234,0xb94a6654,0xb95441d4,0xb96ba051,0xb977a0bc,0xb9833cba,0xb9738ff8,0xb965da8c,0xb969a05a,0xb974f5a9,0xb987bf88,0xb996a7e3,0xb98ce005, +0xb983a0e2,0xb980d27e,0xb96dab87,0xb93a8921,0xb92b71f0,0xb9869897,0xb984bf8c,0xb959251d,0xb897ba21,0xb8d02824,0xb8902ec6,0xb8965258,0xb8937289,0xb8917e1b,0xb88ef79e,0xb88d4b83,0xb87f302a,0xb8d63b14,0xb8aabd31,0xb9591ba8,0xb98a7a35,0xb9824cff,0xb9406499,0xb95f9bb1,0xb960df4f, +0xb9689062,0xb96d8ec0,0xb97356ee,0xb97e36a3,0xb97d6930,0xb97de85d,0xb97721ac,0xb9739a83,0xb96a82a3,0xb9666951,0xb95b2c9c,0xb9540646,0xb946ba1f,0xb9419fa0,0xb987200f,0xb87b2c24,0xb8630639,0xb850c0ee,0xb8899705,0xb8ca30c4,0xb931ccd0,0x381bcd1d,0x3790e350,0x378b741b,0x3791b073, +0x37906d71,0x37905587,0x37907473,0x37919db0,0x378bb216,0x378f14ce,0x3823c494,0xb94026bf,0xb8a4c306,0xb815a48e,0xb80c5476,0xb873cbd5,0xb8721dfa,0xb897f665,0xb85b7e5f,0xb8484c1a,0xb85436cb,0xb84d721d,0xb866cbd9,0xb8ab67d8,0xb86719c2,0xb82ee7be,0xb6f6d61b,0xb8148804,0xb82752ca, +0xb82ebd4b,0xb82c0a13,0xb833a060,0xb8a1993d,0xb8dc3369,0x38307de7,0x384edd27,0x361af43c,0xb74e97ef,0xb68b7bd7,0xb6e49eb4,0xb6c94660,0xb6d5308b,0xb6c7f658,0xb6e86d89,0xb6811cf8,0xb75c9eea,0x3688fe8d,0x38507011,0x38225669,0xb89991e3,0xb81cc5e0,0xb8c1a93a,0xb8f9f587,0xb918d38a, +0xb8c655e8,0xb8918fb3,0xb891139a,0xb84d7579,0xb88fc320,0xb913d215,0xb8a910ee,0xb8183071,0x38427f14,0xb7229ea4,0xb7f9c720,0xb810720a,0xb820c141,0xb7de56f0,0xb91b9005,0x3854b73a,0xb723e479,0xb782f22e,0xb67be637,0x369f8bbe,0x35e0cb36,0x361293f2,0x3616a754,0x360ba384,0x361cdd2e, +0x3603adf4,0x360be46b,0x368b5a6a,0xb64fba35,0xb79246c8,0xb6a81f1e,0x378fa2e3,0xb796f792,0xb88ab6a4,0xb8cdbd93,0xb91e7cf4,0xb85d115c,0xb794510e,0xb8177d4e,0xb80185cc,0xb8a5adba,0xb94e1aad,0xb87e4de7,0x36a6d321,0x3934a90b,0x37c92365,0x37591428,0x3785feab,0xb7718391,0xb8850595, +0xb9252e78,0x3825c9c3,0xb794b737,0x376c8cae,0xb57d7662,0xb524d094,0xb5c554a1,0xb535718e,0xb590baae,0xb57bbcc4,0xb57eab9c,0xb589e0b4,0xb528a994,0xb631687f,0x3685e374,0x36480b9d,0x36f24474,0xb6ed476e,0xb85e260b,0xb951608c,0xb99b13e1,0xb9c3d498,0xb95393f3,0xb8bd4fd4,0xb8a874ce, +0xb80e1d31,0xb90fd51c,0xb9b9dc70,0xb93b929c,0x36d5c8e6,0x39868c1f,0x3885b54d,0xb7aa6e87,0xb600714d,0xb78c4a03,0x36c96d54,0x38cafb8f,0xb7cf4195,0x37355287,0xb6ff828a,0x3587aecb,0xb461db00,0x3588f811,0x345721aa,0x35271cfc,0x34c93057,0x352cce55,0x34162665,0x359c7626,0xb50c8ba7, +0x35deb444,0xb7202a3e,0x379170d5,0xb86ab9b6,0x396c5130,0x39db717a,0x3a031e27,0x3a1bbc8c,0x39f9be94,0x39a33255,0x38c52835,0x36beb932,0x38ac80a9,0x395decd6,0x39e2e77d,0x39ba9708,0xb89b4ce3,0x397a58ed,0x398e0ba4,0x3970c701,0x37fed8ee,0x395f9335,0x3917d266,0xb8879331,0x37e62165, +0xb72fcc27,0x36c0c676,0xb62db2e0,0x351f19ca,0xb537ad65,0xb3d9e5cf,0xb4da2815,0xb458aafc,0xb4d5e833,0xb400da0b,0xb5680d85,0x35d5031e,0x334be125,0xb4c425e6,0x37aa9f5a,0xb919fd18,0xb9ad1727,0xb9e4b6db,0xb9fb9b71,0xb9e9b311,0xb981cb67,0x380910e7,0x39af7d1b,0x39c8500b,0x39193448, +0x37ff7901,0xb8730f67,0xb93b936c,0x393c3ed4,0x39b14582,0x39c43d78,0x39ac6e81,0x38994355,0x38a672ac,0xb6a7a6d4,0xb6102f77,0x34fc05d2,0xb58bf7da,0x35117077,0x3487affd,0x34943411,0x349111d2,0x348fc9f9,0x349c49e7,0x346eae4b,0x34c6b965,0x34a08e18,0xb5104e08,0xb5777d06,0x35d12c25, +0xb7942e84,0x38fa4679,0x39a5ecc3,0x39e8c072,0x3a117312,0x3a0a4181,0x39ae01b1,0x370cf810,0xb9914acc,0xb992e072,0x386795a1,0x3993f4b3,0x39c5f0ce,0x39c90b16,0xb740df5e,0xb984abb6,0xb93ee901,0xb851e148,0xb9c66ae9,0xb9a9b397,0x38ae4102,0xb7de32de,0x373dba37,0xb676cd4c,0x35a69493, +0xb5a0c896,0xb3a3b7d8,0xb50c42fc,0xb4d0a68f,0xb4bfc596,0xb50c32f6,0xb4245740,0xb59bb3e3,0x35f76726,0xb5a08a57,0x367b4713,0x3681711a,0xb8a85278,0xb8f40c07,0xb905ca86,0xb8fb1e8a,0xb8ba3257,0x34bd6ba7,0x38ecb219,0x39f9d034,0x3a0de6f6,0x39d33930,0xb96d65e3,0xb9da00ad,0xb917922c, +0x390cc761,0x39e14f2f,0x3a412136,0xb8842bd0,0x3a55db10,0x379fe60e,0xb76f698d,0x36ae1ac9,0xb6968f38,0x343b430c,0x353eeb94,0x35816528,0x3530ac6d,0x355f10a4,0x353a8c95,0x357745da,0x34e52089,0x35c46140,0xb4a6e475,0x3618516a,0xb71cd27e,0x37775ca5,0xb823f35f,0x391d44c4,0x38e73078, +0x386ddef1,0xb75d0ae6,0xb8721530,0xb8cc31a7,0xb922a87f,0xb92fc758,0xb92ab995,0xb8186b96,0x38136e9a,0x3983e8f7,0x3a0947b4,0x3a47c321,0x3a722435,0x3a8f721d,0x3a8598bc,0xb90d72c9,0x38976af7,0xb835ea84,0x37aec384,0xb6559530,0x369f0dec,0xb6868966,0xb56c0701,0xb5f9ffff,0xb5c62289, +0xb5e3d123,0xb5cabd2c,0xb5ec59de,0xb598e832,0xb6628b73,0x365259fb,0x35d536e2,0x376a201e,0xb83f9229,0x39291fc4,0x3931bc13,0x393a91a6,0x391e2149,0x390064e1,0x389053cf,0x3692bda8,0xb844232f,0xb8a2bbf0,0xb8dd9019,0xb8f3dfe5,0xb91339fb,0xb919b3e4,0xb98727f7,0xb99a3330,0xb9915ced, +0xb98ba8bc,0x3958be2a,0x398b5345,0xb7f8cb86,0x3651c45e,0xb7936866,0x35a1bd2c,0x3697b677,0x368401ab,0x365e5313,0x3682f505,0x366975e7,0x368232b0,0x36625d7d,0x367e5971,0x36a31c90,0x351f2fd0,0xb795a7ab,0xb6dbc007,0x380976ef,0xb8bbe057,0xb8afbd81,0xb8d15f15,0xb8ddde76,0xb902201c, +0xb9110a5a,0xb9254125,0xb9185e93,0xb9119af9,0xb90c0400,0xb8a620e3,0xb800dc4b,0x37d07988,0x38951843,0x38f4c2a5,0x3926ef4d,0x3958401f,0xb890a7cd,0xb7f453fa,0xb834e578,0x382216d4,0x3822ea2e,0xb644eea6,0xb7860150,0xb70f9e18,0xb739b536,0xb72be86d,0xb7323549,0xb72bb4e2,0xb73a765f, +0xb70d1ab0,0xb789846f,0xb61c7ea0,0x382dfa53,0x38580731,0xb8a989c6,0xb9063c0c,0xb8eb61e4,0xb90507d9,0xb9066291,0xb90ef892,0xb9126254,0xb91921c0,0xb90743c4,0xb8ee330e,0xb8d5e8ec,0xb8c268a2,0xb8b4d2a8,0xb8a7b4ee,0xb8a2fde4,0xb89a09bf,0xb8a165c5,0xb88cb6c2,0xb87a62ee,0xb86fab3d, +0xb8adfea5,0xb8bfdd3e,0xb90eebca,0x38458914,0x37f30681,0x37ef876d,0x37f4dafc,0x37f3b4ac,0x37f3acab,0x37f3b745,0x37f4e1d2,0x37ef5aac,0x37f2af15,0x384aeb24,0xb91a4941,0xb8e39e44,0xb8f40b4d,0xb8b96003,0xb8d9a8ef,0xb8dab0ba,0xb8e26219,0xb8e70a4b,0xb8ebd981,0xb8f81313,0xb8e780b4, +0xb8db74bf,0xb8c98e54,0xb8ba3e83,0xb8a7f64b,0xb891c20d,0xb890fcbf,0xb88bc3ae,0xb8835e51,0xb87bff26,0xb8d3ede1, +}; + +const uint32_t defaultHRIR_rom_AlphaL32[470 * 86] = { +0x3e8066b7,0x3d6b6818,0x3e9b1d76,0x3e6eb9f6,0x3e80f9a1,0x3e7fc18c,0x3e872602,0x3e89dc1c,0x3e8bfd52,0x3e879b23,0x3e84b0af,0x3e814fd4,0x3e7d129a,0x3e789b9a,0x3e7672bf,0x3e74293d,0x3e71fca2,0x3e70cc6c,0x3e6dc4f6,0x3e5e0778,0x3e8d7812,0x3d3ed63e,0xbd3edf1a,0xbe2f4824,0x3dc2aa83, +0xbd25c67f,0xbe208217,0xbe25cbab,0xbe20144f,0xbe03eb2f,0xbe21c0e0,0xbe2920f9,0xbe21eb2a,0xbd20e547,0x3e036d5d,0xbe231008,0xbd6c7998,0xbdafc7d5,0x3e88ca90,0x3e9511fa,0x3e95b010,0x3e9c8165,0x3eb08521,0x3eb9821a,0x3ebae5d7,0x3eb09cec,0x3ea5f616,0x3e9aa337,0x3e91d0b0,0x3e8c628e, +0x3e8a3da9,0x3e87695d,0x3e839cc8,0x3e833683,0x3e742754,0x3e790812,0x3e55b244,0xbd6373eb,0x3df04bdf,0x3dbe5205,0x3dad30a9,0x3d57c4d3,0x3ddfaa8d,0x3dfadb9c,0x3de1a54f,0x3d6bbfb7,0x3df7a8a4,0x3e2cd1e2,0x3dda7a9a,0x3dff2189,0x3d8722f0,0x3d6d82e4,0x3e45eb79,0x3d7b915d,0x3e6c7ef4, +0x3eb11802,0x3ea46d18,0x3eb4f88f,0x3eda7dc2,0x3eeb9896,0x3ef00e47,0x3edcb4f3,0x3ec877a9,0x3eb6c7e1,0x3ea61a3d,0x3e9a4b89,0x3e94e56c,0x3e8e8542,0x3e87360a,0x3e8694a2,0x3e654023,0x3e76c045,0x3e0a62a3,0x3d0a16bb,0x3d30f600,0x3d49a008,0x3d646c2f,0x39e8faf2,0x3d718e6c,0xbb857593, +0x3dcbf7b6,0xbca00739,0x3da4897d,0xbb863e7d,0x3d1adf88,0x3d26aa76,0x3d55c4b0,0x3cd473fe,0x3deaa24d,0x3c8d651d,0x3e633011,0x3eb88a9a,0x3eb42f74,0x3ed034a5,0x3f06dd52,0x3f15143a,0x3f16f6ef,0x3f055563,0x3ee7e7c8,0x3ec78e27,0x3eac94ca,0x3e9c4058,0x3e97995c,0x3e8e62c6,0x3e84ce8f, +0x3e83cb85,0x3e5ea884,0x3e53af3d,0x3de973c0,0xbc048f3c,0x3d87c41c,0xbc5690e4,0x3cc704c4,0x3cb97262,0x3ca46547,0x3bc30305,0xba0460d2,0x3d081064,0x3b9a75f3,0x3d055323,0x3d1480fb,0x3d312dd0,0x3cdb67de,0x3d253734,0x3dde5e87,0x3d7d5d30,0x3eb07b3d,0x3ef67b29,0x3ef1d5fc,0x3f008cb7, +0x3f0fd78b,0x3f1a55af,0x3f2149a3,0x3f23b537,0x3f1daa0b,0x3f07c88b,0x3f06710f,0x3ef7fd0d,0x3ed55b26,0x3ece9bdd,0x3ebb640b,0x3ea9e961,0x3e80869d,0x3e7875ef,0x3e0ad375,0xbc01c760,0x3d87824d,0x3ca33f6d,0x3c9a29a5,0xbb34429b,0x3bd9ba9a,0x3c028aa6,0x3c938261,0x3cdcc0fa,0x3c71b331, +0x3cf2a6ae,0x3c625d4e,0x3d7a24df,0x3cab8465,0x3d879f2a,0x3d8ba412,0xbc720628,0x3e57c661,0x3f04dd83,0x3efb1862,0x3f17204e,0x3f231071,0x3f279f82,0x3f201890,0x3f17ad80,0x3f0bcb50,0x3ef7a24c,0x3eeceed0,0x3eeb7f3b,0x3ef503b7,0x3ee63d86,0x3ed35c35,0x3ec9c5b0,0x3e96a713,0x3e90b00e, +0x3e088bca,0x3c5a8ae1,0x3d1e6570,0x3cb3026c,0x3d6b9135,0x3d3345cf,0x3c62038f,0x3c9ff4e9,0x3c484df1,0x3c1251a8,0x3c679b68,0x3c29eab7,0x3d4699cc,0x3cd10a29,0x3ddc9243,0x3d856a5a,0x3e06aed5,0xbd15bc1b,0x3e9003ef,0x3f41de0c,0x3f4c5a58,0x3f74e519,0x3f51c535,0x3f3e12e2,0x3f27a72b, +0x3f0e4542,0x3f086567,0x3f1daae0,0x3f30a24b,0x3f36cc47,0x3f30a1f5,0x3f17ce56,0x3ef90da9,0x3ec9a440,0x3e97a801,0x3e9cfcfe,0x3e025fec,0x3d663dbe,0x3d9fba4c,0x3c3726d8,0x3cf69635,0x3ce6d3d5,0x3c61b7ed,0x3c3e56ec,0x3c9d2142,0x3ce09430,0x3cbc9dfb,0x3c4e1308,0x3c274fa6,0xbd56dd86, +0x3da4f3a2,0xbd8601b2,0x3e0a6d38,0xbaf56263,0x3ef4ad4f,0x3f674a82,0x3f5689cd,0x3f566148,0x3f3a387a,0x3f2e18aa,0x3f1ffe20,0x3f242372,0x3f2539a6,0x3f21119b,0x3f1e2856,0x3f1691f6,0x3f0914d3,0x3ef7da13,0x3ed60895,0x3eb6a440,0x3e8fa95c,0x3e8fcd72,0x3e1b0613,0xbcf4d5b9,0x3d695bec, +0x3d37b250,0x3d156f6e,0x3d010032,0x3c595841,0x3d1470fa,0x3b186edd,0x3d416d07,0x3d026cbd,0x3c772f08,0x3d9a5eb0,0x3c630b40,0x3dfe53d1,0x3be5a3b0,0x3e097457,0x3dabfc72,0x3f07623f,0x3f474961,0x3f33e3f6,0x3f3204c2,0x3f16f9da,0x3f0c949a,0x3f0ef01b,0x3f060e8b,0x3f0d5766,0x3f1f2bcd, +0x3f14bcb5,0x3f080d8a,0x3ef27b5d,0x3ec3651e,0x3e9c3b31,0x3e87b7c5,0x3e6fdbff,0x3e88be13,0x3e3cbc18,0x3abad8ac,0x3dcefee4,0x3cad7ef0,0x3cb47c93,0x3d328723,0x3d1c4f2d,0x3ca7612c,0x3d24dea7,0xbc79506c,0x3cf344a3,0x3cf0e539,0x3d5bddbb,0x3d64178b,0x3d2ec65e,0x3cf25be8,0x3e6a7d72, +0xbdea8686,0x3eb295e7,0x3f03d73c,0x3ed6d07f,0x3edbab26,0x3ed77838,0x3eda89da,0x3edd34c9,0x3ec7664b,0x3eb13389,0x3ea8166f,0x3eb0f721,0x3eba14a4,0x3eb964c1,0x3eb46867,0x3ea3290d,0x3e8fe28e,0x3e7d7b97,0x3e908c06,0x3e057cd2,0x3a8931f3,0x3de42939,0x3c99986e,0x3d601e81,0x3d49c101, +0x3cea9bc5,0x3cc2fede,0x3bc78070,0x3db7f6e1,0x3d1dfc9f,0x3d172146,0x3d8269cd,0x3d1984b0,0x3d9adbf2,0x3d8eb093,0x3e212dcd,0x3de120f1,0x3e6cc823,0x3eb25260,0x3ea2f465,0x3ebdceed,0x3ec06589,0x3ec97fb9,0x3ecf3cd8,0x3ecbece9,0x3eca9fef,0x3ec5f322,0x3eb0c7ec,0x3e9abc11,0x3e806283, +0x3e74313f,0x3e5c9314,0x3e532d6c,0x3e3e5fd6,0x3e76fa36,0x3e24dbc8,0x3ce056e7,0x3d282d6d,0x3d2e1613,0x3d579fe2,0xbc7a2bd1,0x3d5a2b73,0xbcb1ba50,0x3de17315,0xbd422301,0x3d9c7c6b,0xbc6b6825,0x3d085fd3,0x3d3fd4c0,0x3d3ead8e,0x3cb8e5c5,0x3e0446d1,0xbe062617,0x3e7770be,0x3e8d0a0d, +0x3e89985f,0x3e94582f,0x3e97fa1d,0x3e9fbfb8,0x3ea79bd7,0x3e9d540e,0x3e93506b,0x3e8acf46,0x3e7f722e,0x3e6c3f43,0x3e4c0281,0x3e5034ab,0x3e4e782c,0x3e537829,0x3e4aab3c,0x3e5778bc,0x3e3fc463,0xbd8d884e,0x3e0055ef,0x3dd3b7ad,0x3dc96648,0x3d8316fe,0x3e0919e5,0x3e1d1234,0x3e01f22e, +0x3d8427ee,0x3e10c913,0x3e420124,0x3de684ca,0x3e071b9d,0x3d91597d,0x3d827016,0x3e3fbb2b,0x3d694f59,0x3eac6fab,0x3e83ba52,0x3e8d85d2,0x3e8ef9ff,0x3e915d57,0x3e934077,0x3e9762f6,0x3e917c53,0x3e8de23f,0x3e899945,0x3e86b34d,0x3e83fbd0,0x3e7fdb4c,0x3e81cf34,0x3e81730d,0x3e81a546, +0x3e8195b2,0x3e780980,0x3ea09d25,0x3d1a0e40,0xbd8be2d3,0xbe4dbb8f,0x3dc9df9e,0xbd79e4da,0xbe450e4c,0xbe4d6316,0xbe42e4f4,0xbe1f63e1,0xbe4400b4,0xbe48119a,0xbe3bb17c,0xbd7aa61d,0x3e045d52,0xbe3e57c4,0xbd9a3f39,0x3e9b4cf1,0x3eee9e16,0x3f030144,0x3ed73574,0x3ee16cfa,0x3ee8c036, +0x3eef1ab7,0x3ef48dac,0x3ef6e650,0x3ef98874,0x3ef2c530,0x3eeedef9,0x3eeb61bb,0x3ee8196f,0x3ee4a773,0x3ee08288,0x3eddbb0f,0x3edb06e7,0x3ed87778,0x3ed5f9e6,0x3ed0e1f3,0x3ecb0cb0,0x3ef64e1c,0x3eed28ce,0x3ea9fc2d,0x3ef07717,0x3eec3d3d,0x3eac30d8,0x3eb0d6a7,0x3eb0e123,0x3eb1bc59, +0x3eb99280,0x3ebddc5d,0x3ebfca61,0x3ef250a9,0x3ef5c522,0x3eb9c652,0x3efd16a3,0x3f016b8c,0x3f06021c,0x3f01b918,0x3f0e0082,0x3f15d17b,0x3f1fac39,0x3f2343cd,0x3f238f79,0x3f19d4b6,0x3f132abe,0x3f0e8560,0x3f09d3d1,0x3f04846f,0x3efd7419,0x3ef44372,0x3eec80a2,0x3ee55438,0x3ede3a7d, +0x3ecf727f,0x3ed8634d,0x3ecb1042,0x3ec43029,0x3eccf687,0x3eba1983,0x3eb592a3,0x3ebcdd2d,0x3eb9072f,0x3ec54244,0x3ec5f459,0x3ec48de5,0x3ebbc446,0x3ec35407,0x3ecf234c,0x3ed51acb,0x3ee2335a,0x3ee8f666,0x3f01c8a9,0x3f06d4bc,0x3f06160e,0x3f1e8c07,0x3f3092c8,0x3f45e774,0x3f4c0e61, +0x3f4e85c6,0x3f3da364,0x3f3065a4,0x3f26d964,0x3f1d4e80,0x3f14a1fa,0x3f099d6c,0x3f01742c,0x3ef304a3,0x3ee52432,0x3ed31727,0x3eba4751,0x3eb34066,0x3ead50a1,0x3e912b91,0x3e9310e0,0x3e85214d,0x3e6b409f,0x3e754d02,0x3e591c09,0x3e70f95c,0x3e77253c,0x3e6f5db5,0x3e82684d,0x3e8ff4a6, +0x3e9c31a8,0x3eaa226b,0x3ec0b5cc,0x3edede30,0x3eefcdfa,0x3f0e4750,0x3f0eb5f3,0x3f2e5173,0x3f4df71a,0x3f722f1a,0x3f7decfc,0x3f7b9345,0x3f5ac43e,0x3f43169d,0x3f34e6a7,0x3f28444e,0x3f1876ce,0x3f08792c,0x3ef8f443,0x3ee253cd,0x3ece61ec,0x3eb38470,0x3e9619b0,0x3e86cb8f,0x3e480e1f, +0x3e28cbda,0x3de4d2a0,0x3dca43fc,0x3d977921,0x3d69dafd,0x3d583134,0x3d28eb55,0x3d9151da,0x3d93e8c6,0x3dd33aab,0x3e133273,0x3e438e94,0x3e7fa87d,0x3e867527,0x3eb98a54,0x3f236f02,0x3f1c5950,0x3f31d7d7,0x3f61055e,0x3f82c178,0x3f85e09b,0x3f8c9572,0x3f94ef2e,0x3f9bf74b,0x3f97d0b2, +0x3f827fea,0x3f7d6850,0x3f724ae8,0x3f6cbab8,0x3f546c6a,0x3f4220db,0x3f32fe62,0x3f1acf75,0x3ef84e58,0x3ec3440b,0x3e89d64c,0x3e59a332,0x3e32b8c6,0x3dfd62f3,0x3dbcb2e9,0x3d86f625,0x3d86b548,0x3d982276,0x3ddd1a24,0x3dd8d7e1,0x3e11c04b,0x3e39c25f,0x3e6a2af2,0x3e99e8f9,0x3eb3cdb5, +0x3efe137b,0x3f30cea3,0x3f51e380,0x3f6b96dc,0x3f8d4c03,0x3f973ec2,0x3f9c7239,0x3fa38e9a,0x3fa9649a,0x3fb256d2,0x3faeb3d7,0x3fa13168,0x3f9e3754,0x3f935723,0x3f840c8c,0x3f652c8b,0x3f4602c7,0x3f2c3e51,0x3f189919,0x3f053a5b,0x3ee58da7,0x3ec20ac0,0x3e952ad8,0x3e749a8f,0x3e3042f7, +0x3e074d74,0x3dd26c18,0x3dbac4bd,0x3dbf58c1,0x3dbfb9ee,0x3df3eb92,0x3e07f77a,0x3e55a8b4,0x3e8301c5,0x3eb9c412,0x3ee4f470,0x3f14e020,0x3f51849f,0x3f8457eb,0x3f6af469,0x3f773163,0x3f55cec2,0x3f76a99b,0x3f8328ad,0x3f92e379,0x3fa036e8,0x3fa8ea7f,0x3fa47930,0x3f8eeb8c,0x3f73fcbe, +0x3f50a11b,0x3f399f73,0x3f2a4d1b,0x3f24c36e,0x3f0bdd75,0x3ee27b64,0x3ed62e7b,0x3eca4816,0x3ea27ac9,0x3e9bf55a,0x3e6ac309,0x3e4024a1,0x3e22ea67,0x3e02c6fe,0x3e0c3931,0x3e4c4945,0x3e0def24,0x3e22b5ef,0x3e49a5ea,0x3e904a8f,0x3ed40608,0x3f0cffe1,0x3f16bbfe,0x3f68a8e2,0x3f64523f, +0x3f1e6703,0x3f418864,0x3f230910,0x3f6293d6,0x3f895a6c,0x3fa58157,0x3fa0ab48,0x3f98df78,0x3f892c12,0x3f840abf,0x3f769c9f,0x3f5d33dd,0x3f4c3b14,0x3f33b647,0x3f0f2086,0x3efa57eb,0x3ed5ef06,0x3ee7353f,0x3ec929b7,0x3ebbb525,0x3eac1ffa,0x3e84fddb,0x3e64efcd,0x3e2d1e07,0x3e15f41e, +0x3e1ce506,0x3eae1e6b,0x3e517a68,0x3e330c07,0x3e6760d0,0x3e805c6c,0x3ebd480e,0x3ee1e498,0x3f136334,0x3f57aa05,0x3f4b30da,0x3f441d2e,0x3f738c8b,0x3f711f2c,0x3f8bc1af,0x3f93ee8d,0x3f9e1c4b,0x3f97043c,0x3f90ed0b,0x3f85eead,0x3f758348,0x3f5e72a0,0x3f4b37a1,0x3f2e42d5,0x3f1c56c2, +0x3f0baa15,0x3f18e263,0x3f140347,0x3f156e96,0x3ee453f4,0x3ee0880a,0x3ea8021d,0x3e961ae7,0x3e986a8c,0x3e6bee36,0x3e3674e2,0x3e58de7c,0x3e50a50b,0x3e7b9a3c,0x3e8ceb57,0x3eabef64,0x3ebc8b4f,0x3ec91528,0x3ef4a2fc,0x3f267553,0x3f59f2ec,0x3f5664c0,0x3f5d1638,0x3f781a06,0x3f7c0db8, +0x3f8b6a97,0x3f8fe73b,0x3f907abc,0x3f9291e8,0x3f9086fe,0x3f8a3f85,0x3f78535f,0x3f5b0bf3,0x3f40c99a,0x3f2a5932,0x3f1c60b5,0x3f15e3ce,0x3f2584a3,0x3f2a9400,0x3f17802c,0x3f035287,0x3f0103fc,0x3ee1e7c6,0x3ec40a17,0x3e984507,0x3e6e6f66,0x3e6975e4,0x3e55bf94,0x3eaac8a9,0x3e8edc61, +0x3e968840,0x3eaf13f6,0x3ec24ad4,0x3ef1d853,0x3f047b2a,0x3f2dc9c6,0x3f2d7d13,0x3f503603,0x3f5bec8f,0x3f69376c,0x3f74fbc2,0x3f7b452b,0x3f7f9247,0x3f82b19e,0x3f7a6dad,0x3f6fc079,0x3f65a251,0x3f5b3888,0x3f514345,0x3f43e20c,0x3f3eb0b1,0x3f37a250,0x3f2d5b93,0x3f25c688,0x3f22fd26, +0x3f1ba479,0x3f085b6f,0x3ef5ffd2,0x3ee5051a,0x3ed73f67,0x3ea72a7e,0x3ec8e6a2,0x3e94dd99,0x3ed5a974,0x3ea3a51b,0x3eb9d536,0x3ea44b3e,0x3eab8c2e,0x3ed3d229,0x3eef9489,0x3f0646bf,0x3f2204e8,0x3f0d625a,0x3f4b9ca8,0x3f434f5f,0x3f49d5e9,0x3f4d1a72,0x3f519fa1,0x3f5607ff,0x3f5cd835, +0x3f5873e4,0x3f5697ac,0x3f53ea82,0x3f500148,0x3f4bdc98,0x3f46ec28,0x3f415504,0x3f3b8fb6,0x3f36e36f,0x3f33bba2,0x3f2dcffc,0x3f2f0236,0x3eeb10f5,0x3f16d371,0x3f1d5d64,0x3f13b6e3,0x3f0b7efa,0x3f183ec9,0x3f1949a5,0x3f21d0d5,0x3f1644c9,0x3f21b884,0x3f1e1560,0x3f134a81,0x3f1dd2e0, +0x3f18096d,0x3f1fb510,0x3f358e7c,0x3f39caf2,0x3f3d7efd,0x3f363328,0x3f3b5f32,0x3f3b428b,0x3f3d38db,0x3f3e36e5,0x3f402988,0x3f3dc6ba,0x3f3c2f36,0x3f3a652e,0x3f391179,0x3f37ca16,0x3f36c0bb,0x3f35fcf8,0x3f3578ba,0x3f342766,0x3f3362bf,0x3f2e4fae,0x3f3629f8,0x3f335fd6,0x3f1f8fda, +0x3eb07469,0x3f37febf,0x3f20cbbe,0x3ec1a228,0x3ec45ad1,0x3ec240b9,0x3ecbdc83,0x3ec9ea3a,0x3ecdc26c,0x3ed0bddb,0x3f22977d,0x3f3f9c3e,0x3ec3e302,0x3f221f41,0x3f4afa25,0xbd4a6add,0x3d1c19f7,0xbdd0c11a,0xbd37a103,0xbd8b479b,0xbd87ffcc,0xbda0ca82,0xbdaa95fb,0xbdc35e76,0xbd99eff8, +0xbd85c2a1,0xbd62e56e,0xbd558982,0xbd4c2d23,0xbd4bfc23,0xbd58ae77,0xbd5aa2cb,0xbd586a6f,0xbd460f60,0xbce5b559,0xbd9d89f3,0x3d759b0a,0x3e2e2dcc,0x3edb825b,0x3babf80e,0x3e1a834f,0x3ecaa5f5,0x3ec85c14,0x3ec487da,0x3eb8d7a7,0x3ebd4fbf,0x3ebe95b0,0x3ebafdbe,0x3e15839d,0xbcf52bee, +0x3eceaa98,0x3e2a93bb,0x3e810f03,0xbdac1ea1,0xbd9ecab3,0xbdce0449,0xbdeb6134,0xbe1ef6c4,0xbe2ed5e8,0xbe405fb5,0xbe03525d,0xbdbabaf0,0xbd7d70dc,0xbd481bbc,0xbd33c758,0xbd4501e3,0xbd712b0b,0xbd757896,0xbd6cb2d1,0xbd1efbf0,0xbcc47ae4,0xbcadfea0,0x3e7598bd,0x3d8c5cf5,0x3d518bb5, +0x3db02ded,0x3de227ff,0x3cdcac46,0x3cc21102,0x3c453943,0x3d8222de,0x39f805bf,0xbcb22b1c,0x3d40edc0,0x3cf0451c,0x3dc8fdeb,0x3db7f7d5,0xbcc9102f,0x3d88daf8,0xbc5511f2,0xbdb77795,0xbdc82646,0xbe0fe33c,0xbe75d7a1,0xbe8a6fe0,0xbea2c987,0xbe487aa4,0xbde68746,0xbd7da812,0xbd1b6c05, +0xbd126dfe,0xbd33e94e,0xbd888641,0xbd91f442,0xbd8cd195,0xbcc5badc,0xbc2bb233,0x3d89b6cd,0x3e021237,0x3e1115ac,0x3dd8009f,0x3dbec8a9,0x3e0eba0b,0x3d8be20a,0x3e138dcf,0x3d286069,0x3e0a89dc,0x3d42502e,0x3dd93846,0x3d97287a,0x3dc8b55b,0x3dceee9b,0x3dd1a12b,0x3cc352d3,0x3e162f2a, +0x3d01f314,0xbd5d44af,0xbdd0e1de,0xbe4867ce,0xbebed527,0xbedfdf53,0xbef75a46,0xbe8336a4,0xbdd4475c,0xbc8083bb,0x3c716e9e,0x3ce14cbe,0xbb1316f7,0xbd35c65f,0xbd5e36f2,0xbd533726,0xb9a1ea6b,0x3d25363f,0x3dcab891,0x3e30cb93,0x3de1d412,0x3e185abb,0x3dc1b024,0x3d9dd02c,0x3d8af352, +0x3d89b64e,0x3d9a3ddb,0x3d51d1d2,0x3d74558b,0x3d35f9f2,0x3d732c54,0x3db6999a,0x3dd257b8,0x3de17de4,0x3d53172c,0xbcb40f14,0xbe696590,0xbe87b8a0,0xbe9b703d,0xbeb4e084,0xbeb8cac8,0xbec39894,0xbee558b2,0xbef2fb35,0xbed46076,0xbde0b0e7,0xbe5295b9,0xbe64b139,0xbe5b04e9,0xbe6e4858, +0xbe639c55,0xbe4dd5af,0xbdb02be8,0xbd064bb3,0x3da28b48,0x3e6684aa,0x3e1298b5,0x3dfbd66d,0x3dd6c858,0x3dcd7a9a,0x3da5ef86,0x3db056b8,0x3d94d8a6,0x3d581925,0x3d1e3a25,0x3cd8a5d1,0x3d5b7327,0x3cd37189,0x3d676760,0x3d353ba0,0x3d1298b3,0x3e78f2c0,0xbdf415f8,0xbf18e9ec,0xbf2143b1, +0xbf085f46,0xbee87ac1,0xbee741e8,0xbf07e353,0xbf09c7e1,0xbf029549,0xbec95663,0xbef88108,0xbf08c2b5,0xbf121e38,0xbef8bb7e,0xbec0aa80,0xbe92e856,0xbdd083e8,0xbd2fab53,0x3db361ae,0x3e3ebba8,0x3e11da70,0x3dd6aa03,0x3d5011d0,0x3d04acc8,0x3d312afc,0x3d1a8deb,0x3d8623bb,0x3e0518cb, +0x3dd695a1,0x3e0fcc61,0x3e17a6c8,0x3e337113,0x3dbc838c,0x3e370592,0x3d949422,0x3ddeae1f,0xbec8e353,0xbf11c036,0xbedd8e87,0xbe2ae05b,0xbdbbfe62,0xbd7b2c58,0xbe828e05,0xbe8d6328,0xbee13488,0xbf3084ab,0xbf465db4,0xbf433b06,0xbf2d362f,0xbf0f19af,0xbee4c74a,0xbebca73e,0xbe39c3f8, +0xbdb1c1c1,0x3d9d591a,0x3de073ff,0x3e08bb07,0x3e361b3f,0x3df1f628,0x3df1c095,0x3e237074,0x3e39e265,0x3e2ff987,0x3e61a601,0x3e0812b5,0x3e08bb0a,0x3e1f19ba,0x3e6c325e,0x3d892f7c,0x3e2ff5a7,0x3d567090,0xbb83e0ce,0xbe8e68f5,0xbdeb896e,0x3d1ae272,0x3f140ea2,0x3e85e8ae,0x3ca6f1a4, +0xbe8a31e6,0xbea5de10,0xbedb49e5,0xbeef8fcc,0xbf13b042,0xbf1b9f98,0xbf0b9075,0xbefac943,0xbebf5529,0xbe5fec76,0xbddc4fd2,0xbd4d3058,0x3d137181,0x3e7da2dd,0x3e38dac8,0x3e34b74c,0x3e2f4684,0x3e0e8d52,0x3e1bccc8,0x3d9e9b3e,0x3e1c5703,0x3e99b23f,0x3e2103d9,0x3e0cd4bb,0x3de38122, +0x3e3ff1e0,0x3dc09334,0x3e579b13,0x3dfc3791,0xbace7923,0xbe75f4db,0xbdf36b12,0xbd8c6b78,0x3da39388,0x3d902bd6,0x3d049b5b,0xbe4eb13f,0xbe85989c,0xbecdd59a,0xbefe4d0c,0xbefbc641,0xbee4558a,0xbec74132,0xbe7f8a7a,0xbe1a47c7,0xbdc271df,0xbdbda744,0xbdab95bc,0x3cfaf862,0x3e9d8c7b, +0x3e289386,0x3e7f9372,0x3e741f48,0x3e295471,0x3e3c3fde,0x3e39b62f,0x3e30dcc1,0x3e9f8cd0,0x3e3edead,0x3e287e40,0x3dd9d0e9,0x3df63ed4,0x3e247ac3,0x3e3cd196,0xbd7f56de,0x3e86b132,0xbd8b0be8,0xbe09ebfe,0xbc955876,0x3daa8801,0x3d1d6349,0xbc661a34,0xbdfb0817,0xbe4edfa9,0xbe71c613, +0xbe7dd60a,0xbe8b464a,0xbe7ede5e,0xbe4396ea,0xbe0d56a7,0xbda0cc1d,0xbd351d37,0xbc82ecc6,0xbdb1118f,0x3de945f0,0x3ea2491e,0x3e080827,0x3e74da75,0x3e3305be,0x3e47ca64,0x3e661b19,0x3e683ec8,0x3e89d542,0x3e06ddb3,0x3e7570db,0x3e62cabe,0x3e06519e,0x3e3f46e3,0x3e098ebd,0x3e3c9a4b, +0x3d48f562,0x3e99584a,0x3db2021e,0xbc343751,0x3d8baeef,0x3d83b4de,0xbc67c766,0xbd9c4c1b,0xbdf28b8a,0xbdfeacc2,0xbe07cb95,0xbe0ca0c4,0xbdb48720,0xbd42d534,0x3bc7e296,0x3cd9a837,0x3d8a6e09,0x3dcb512a,0x3dd53454,0x3bf62249,0x3dae9d6e,0x3e870af2,0x3e817471,0x3e762d50,0x3e657e2b, +0x3eb1618d,0x3e4a9ac7,0x3eb40b22,0x3de81c4c,0x3eae78e3,0x3e42112a,0x3eacd0bd,0x3e8e44fe,0x3e92d35b,0x3e98b9b3,0x3eb69390,0x3e6c18bc,0x3f28413a,0x3ccfaf0b,0x3d1217c7,0x3d29484f,0x3d057bc4,0x3d2711b9,0x3d332602,0x3d16c346,0x3d788cde,0x3da69be5,0x3dc77b61,0x3e014d74,0x3e1d364b, +0x3e4c2051,0x3e3aa03f,0x3e2cb31c,0x3e18562f,0x3e0b86ba,0x3de251ab,0x3dd36310,0x3f13f63c,0x3e4d9a75,0x3e381c59,0x3e4e67de,0x3e71fb72,0x3d99badc,0x3d845037,0x3d9b6cfb,0x3e4720c5,0x3d9edbd2,0x3d02944b,0x3e26b082,0x3e14a6c3,0x3e8e85be,0x3e92b0b1,0x3db9719c,0x3e6db8b0,0xbe092675, +0xbb4c76f7,0xbd0f2888,0xbd052e11,0xbd0380e2,0xbcfc88a4,0xbcff5f9c,0xbc7fff17,0xbb19bcce,0x3c5578e4,0x3cb1fc5a,0x3cefd123,0x3d309a99,0x3cc799aa,0x3c71577c,0x3ba45d91,0xbb354e12,0x3c7f6a54,0xbde36311,0x3e75a2fc,0x3ee0ee85,0x3f580f9e,0x3deedadf,0x3eccacdf,0x3f467add,0x3f48f0c5, +0x3f46757b,0x3f396a7c,0x3f44bb18,0x3f462ce6,0x3f40cf39,0x3ed1cf6e,0x3d942b22,0x3f534e86,0x3ef23caf,0xbd7c2e50,0x3dea5fec,0x3d3a52ea,0x3e239fd7,0x3dead300,0x3df87902,0x3de05d08,0x3dee513d,0x3debcb26,0x3de48135,0x3dc805e7,0x3db6aeb1,0x3dab49ca,0x3dabdc9e,0x3db0ac79,0x3dc01732, +0x3dc7efd3,0x3dd22711,0x3ddbfc7c,0x3de3cb1b,0x3dd7fe04,0x3e08b18e,0x3d0a8609,0xbcd37735,0xbdf37c53,0x3d7626d8,0xbca1d410,0xbde07041,0xbddd6112,0xbdd71374,0xbdbc67bb,0xbdde8dd8,0xbde9cea7,0xbde127eb,0xbcb2f4f4,0x3da61915,0xbdfc8ac4,0xbd0721ad,0xbd6fae37,0x3e22c7e6,0x3e225661, +0x3e1c2649,0x3e09adde,0x3e12c8d0,0x3e04cbfb,0x3df0a44f,0x3db3b7ee,0x3d9308ff,0x3d83d77f,0x3d83446d,0x3d9712b1,0x3dc5d8cd,0x3ddc2487,0x3df28f3a,0x3e02a773,0x3e087ae5,0x3e0b8f8c,0x3dfedea4,0xbc4ada87,0x3d902953,0x3d850f47,0x3d635bd1,0x3d316b14,0x3d9242b7,0x3daba994,0x3dabf5a8, +0x3d7551b6,0x3daf4bf9,0x3dd148ca,0x3d892714,0x3d8da442,0x3d06b1a2,0x3d17443d,0x3dfdca72,0x3de9999b,0x3e429841,0x3e74bb02,0x3e3e490a,0x3e1245c9,0x3e2d24ff,0x3e1dc6d7,0x3e06c04f,0x3d5ce182,0xba4a1511,0xbc65cd0a,0xbc822e39,0x3ac2f5eb,0x3d30a563,0x3d893762,0x3dc7564f,0x3df6ee7d, +0x3e0a9cda,0x3e17faab,0x3de22bd0,0x3d86b1b9,0x3d7464ec,0x3d5fb39e,0x3d8bc66c,0x3d41b5f2,0x3d73fb3b,0x3d40f313,0x3dcc810c,0x3d50dd4f,0x3da4a428,0x3d092591,0x3d78db90,0x3d3daa31,0x3d7a6cb7,0x3d711bb5,0x3e067db6,0x3de74a1b,0x3e4b6a56,0x3e83fa51,0x3e6436b6,0x3e215d6b,0x3e2c26f0, +0x3e08feb1,0x3de0fc77,0x3cd14830,0xbc856b7f,0xbcaa30a7,0xbbced3ee,0x3ca4969f,0x3db62b9f,0x3df405b2,0x3e15f7dd,0x3e2bf3b4,0x3e3a3204,0x3e36afdc,0x3e15e4b7,0x3dc6be16,0x3dba2f62,0x3d894b78,0x3da03d27,0x3da97822,0x3d86debe,0x3d902d7b,0x3d86fecc,0x3dc0a307,0x3d85c370,0x3d98b713, +0x3da90277,0x3d6cd87e,0x3d56d3d8,0x3dab2875,0x3e4343ee,0x3e980464,0x3f2d1c1b,0x3f2bb99c,0x3f09d27b,0x3ef4feb1,0x3eef63bc,0x3ebe6b3a,0x3e8825b3,0xbcae3d3e,0xbe74917e,0xbef92005,0xbed9bda7,0xbec90583,0xbebf55e5,0xbe8b5cbe,0xbe22c59d,0xbd48a142,0x3c2e9783,0x3d8d13b6,0x3d5e0419, +0x3cdfd2cf,0x3d851005,0x3da5af03,0x3d7368da,0x3d3487a1,0x3d416769,0x3d812036,0x3d96141c,0x3d94becd,0x3d8675c0,0x3dc76695,0x3df0f86a,0x3e64fb14,0x3e63f237,0x3e86f5d8,0x3e859bc6,0xbca58623,0x3ec4c75d,0x3f74d398,0x3f62735d,0x3f3242b4,0x3edd4ea5,0x3e7fe2a1,0x3e8145e5,0xbcdc4af7, +0xbe0f3cd0,0xbe6dfdac,0xbe1e890a,0xbd240437,0x3dfec6e5,0x3e5397c7,0x3e7085ea,0x3e72fa4b,0x3e385bae,0x3e359903,0x3dfbda14,0x3c30ba29,0x3cc1d850,0x3d18f61c,0x3da8595b,0x3dab90d6,0x3d1fc19a,0x3d86b59c,0x3d9348c6,0x3dea0778,0x3dd73dcb,0x3dcd6edb,0x3dd55e96,0x3d8a5e0e,0x3e153bbe, +0x3daa440c,0x3e4c2703,0x3e2482f6,0x3f24d5f5,0x3f5c069d,0x3f190419,0x3e64600c,0x3e6379ef,0x3e7e949c,0x3eac7b15,0x3e197741,0x3daf52e2,0x3e1dde68,0x3e9af1c4,0x3ec247b0,0x3ed122cb,0x3edadb48,0x3ede4c2d,0x3ed8abb8,0x3ec613f9,0x3ebea9d5,0x3e6bff93,0x3e29e47d,0x3e10388b,0x3d1927d7, +0x3d9a4a4b,0x3d73cdcb,0x3d06a184,0x3d964c4d,0x3dc800ca,0x3e2774ed,0x3dd9ce52,0x3db0ea2f,0x3db26c4c,0x3c887294,0x3e12234f,0x3cffc864,0x3e600970,0x3ea13fb2,0x3efe6ee9,0x3e30659c,0xbc3cc81f,0xbeb0c45d,0xbe0dda28,0xbda94cff,0xbd4f6d8d,0xbc5d4a18,0x3dbca1cb,0x3e4f8a47,0x3ea7e142, +0x3ec795bd,0x3ec9a8c2,0x3ebc3083,0x3eb31f8a,0x3ec46bcd,0x3ebdfc04,0x3ebe1a99,0x3e738359,0x3da0068e,0x3dd3a667,0x3da6fb7b,0x3db029bb,0x3db41d79,0x3dbe56ab,0x3db773d4,0x3dcd443f,0x3e1f2d20,0x3df959c3,0x3e056cba,0x3e209cf1,0x3dfc5b66,0x3e24129b,0x3dff5ba3,0x3e5671da,0x3e42572f, +0x3e1b23f9,0xbe0bd0cf,0xbe6b8421,0xbe9903b6,0xbeaca5e1,0xbeb9d7b9,0xbe906d1b,0xbe4b386e,0xbd160308,0x3e206378,0x3e892e79,0x3eb019c3,0x3ec1c38a,0x3ece7a20,0x3eca6423,0x3ed03dd5,0x3e822508,0x3e2e3851,0x3d2a0019,0xbd474efd,0x3a512eda,0x3c9af555,0x3bd1184c,0x3c3eb449,0x3d21bfb3, +0x3de0b616,0x3dd72fac,0x3dae1332,0x3d836d7f,0x3d81c5ae,0x3d37e12f,0x3dff12bc,0x3e24bdff,0x3e15055a,0x3e620b7e,0xbd8c7850,0xbdc2a411,0xbe4e3994,0xbe889903,0xbea86e03,0xbea613bc,0xbe9e399e,0xbe72af3c,0xbdcf85d6,0xbc7efdcc,0x3d7d7b95,0x3e2f6848,0x3e821ae7,0x3e98a179,0x3eafb800, +0x3ea97f64,0x3e9335cd,0x3de21fec,0x3d58bbd1,0xbd71aef8,0xbdc499e0,0xbce2ace7,0xbd99d998,0x3b024cd8,0x3d35c97d,0x3d8b35bc,0x3d9f4577,0x3d832d25,0xbc73e07f,0x3bdb5f27,0x3cbeaa78,0x3d952a32,0x39fa9c45,0xbccc6ea2,0xbc9d3e60,0xbd06ddb9,0xbe250e59,0xbe599f02,0xbe795de5,0xbe93a9b6, +0xbeb0ec14,0xbe8335b4,0xbe34182b,0xbde3c113,0xbc9d8155,0x3d91f27c,0x3e2a1ef0,0x3e37bea3,0x3e4e15ea,0x3e70f0e9,0x3e3a5314,0x3e078953,0x3dd66cf1,0x3d96135a,0x3d84dc12,0xbaedacd6,0xbd560016,0xbceac60e,0xbcb66a80,0xbc59e23d,0xbbe5eaa7,0xbc2331ea,0x3b896c44,0xbbf634f1,0xba39676c, +0x3c8c84b6,0x3c703bb0,0x3cdfa3ef,0x3aca0afc,0xbbb99de1,0xbd1b781a,0xbde8e031,0xbe4bfcac,0xbe815815,0xbe71e6ab,0xbe7ad9d4,0xbe8068ce,0xbe8828d7,0xbe93e492,0xbe9dcea9,0xbe9af19d,0xbe9a9a7d,0xbe966fa0,0xbe926b9e,0xbe8d19df,0xbe87ed99,0xbe7efda4,0xbe663fc5,0xbe549309,0xbe4a0160, +0xbe391110,0xbe317968,0xbe01b9a7,0xbe027a04,0xbe0c1e11,0xbe0204bf,0xbde736a5,0xbde9174e,0xbdeb45fa,0xbe09c96a,0xbe12c147,0xbe15bb0e,0xbe0aeb01,0xbe17b8d8,0xbe2a0c88,0xbe41a049,0xbe4593c6,0xbe52689c,0xbe83cbef,0xbe5a61da,0xbe5a80f8,0xbe5fe63b,0xbe5d231b,0xbe6339d1,0xbe64a567, +0xbe6a4e52,0xbe658bd3,0xbe63af1c,0xbe639219,0xbe5e3fb5,0xbe59e56c,0xbe56d9a1,0xbe5179ad,0xbe4fc1ff,0xbe4bb275,0xbe46d329,0xbe3ef18e,0xbe38c060,0xbe63733f,0xbe6ea930,0xbe292045,0xbe5bd9e6,0xbe6d1729,0xbe3b5a1c,0xbe40c2ff,0xbe3ededc,0xbe3db3b4,0xbe457844,0xbe4b216b,0xbe49f1c3, +0xbe78a0c1,0xbe6e045d,0xbe40fbfc,0xbe85018b,0xbe667d70,0x3e02a845,0x3e188447,0x3dca8d70,0x3df9b795,0x3df228d6,0x3dfb4d70,0x3dd9abba,0x3dd18759,0x3ddc8fb0,0x3deec704,0x3dfa3b4f,0x3dffc0f9,0x3e0327cd,0x3e05520e,0x3e052e2f,0x3e048834,0x3e020935,0x3dfd5ebd,0x3df06187,0x3deae901, +0x3dd2e295,0x3e0c335e,0x3e18973b,0x3e17b2f4,0x3e0619f6,0x3e168c07,0x3e152a36,0x3e1a59f5,0x3e1bbb75,0x3e1b31ab,0x3e1f4677,0x3e2290d4,0x3e2334d4,0x3e1a8dfd,0x3e030d98,0x3e2d9c2c,0x3e2ff4a9,0x3e6383b9,0x3dfb706a,0x3df8ebca,0x3df88da8,0x3df8d370,0x3db24c2f,0x3db24be9,0x3de2af97, +0x3e019b3d,0x3e0eed9e,0x3e12e1ed,0x3e1c7871,0x3e1ecf23,0x3e1caeb7,0x3e1e2e1e,0x3e1889d8,0x3e0e35ad,0x3dfe7d6e,0x3de54c35,0x3de476e1,0x3e18dfbe,0x3e01b9eb,0x3e05083e,0x3e0093ac,0x3e00cb81,0x3def42f5,0x3df78b32,0x3dff893c,0x3e098d41,0x3ded9d8c,0x3dd1a942,0x3dedc449,0x3dfce58c, +0x3e16ac81,0x3e2aa6eb,0x3e05aa38,0x3e42e6dd,0x3df7b745,0x3d96f146,0x3dd6b5ad,0x3df37257,0x3d5f234e,0x3d2170d5,0x3dbc86bc,0x3e026a4e,0x3e1aeffd,0x3e16458c,0x3e288617,0x3e39e98b,0x3e406143,0x3e478644,0x3e3d96d2,0x3e28e4a7,0x3e0ac3e2,0x3dda8a02,0x3dd61153,0x3e03ca89,0x3de5ab1c, +0x3df660e0,0x3de0ba83,0x3ddb1781,0x3dbdc4b9,0x3ddf76b4,0x3dd7d834,0x3dfef09a,0x3db6e2a6,0x3dd3015a,0x3dda2d05,0x3dfb2a2e,0x3e079a27,0x3e3986e0,0x3e214c87,0x3e45257f,0x3dcdbd2f,0x3c9ee695,0x3d48451b,0x3db37f38,0x3d15ce55,0x3d32798b,0x3dee9c15,0x3e094d40,0x3e0b0e34,0x3e00096f, +0x3e0e9e30,0x3e1bcbc3,0x3e23acef,0x3e3842dd,0x3e324f73,0x3e180b7b,0x3de8ab2e,0x3daed974,0x3d9ea224,0x3df12498,0x3ddd48f2,0x3db6c92a,0x3db97c56,0x3da9de72,0x3d829d49,0x3da0d58c,0x3d9ca5a4,0x3db1b147,0x3d5c4706,0x3d260ff6,0x3d6369a6,0x3db48a7e,0x3e10cabd,0x3e27f9a7,0x3dbcd0ed, +0x3ec445cb,0x3a9da1f5,0xbe243b19,0xbdaed9e6,0xbe418189,0xbeb57c40,0xbebb7339,0xbe70a920,0x3d349e39,0x3e7f14f9,0x3e94a718,0x3ea9236b,0x3ec25124,0x3ee2c945,0x3ee6cb7e,0x3ed5bcfd,0x3ebbee0d,0x3e87eed5,0x3e4ab69e,0x3e294414,0x3dfadbc2,0x3defa291,0x3dd4cd24,0x3dc21ed1,0x3da9a062, +0x3d466d2b,0x3d9a0282,0x3db215b8,0x3dd87c55,0x3ddcc6a1,0x3e019eef,0x3e36be9a,0x3dfb00d6,0x3e43e6c6,0x3e4ef6f4,0x3e93d904,0x3ee0f6d1,0x3c86d2ff,0xbf310850,0xbf2d7a7e,0xbf523b1e,0xbf0d82a8,0xbea797fa,0xbe0fe5c6,0x3e04470d,0x3e8de10f,0x3ec2813f,0x3ecf38b4,0x3ecb0cb1,0x3eb67010, +0x3e9b53b1,0x3e838557,0x3e61c6e5,0x3e2761ce,0x3e061f5b,0x3e20d9b7,0x3e3c2752,0x3e193de3,0x3e0a490e,0x3dca140a,0x3db0996a,0x3da8e4bf,0x3dd7bb2d,0x3dd5bbb3,0x3ddaab51,0x3dc137cb,0x3dcf5242,0x3d7ffb61,0x3e0d80c2,0x3d9bc939,0x3e30897d,0x3dc27f89,0x3df48683,0xbeff394a,0xbf9637ab, +0xbf815cfb,0xbf622b6e,0xbf4485ac,0xbf3e793b,0xbf2ac97c,0xbec53c79,0xbe397adc,0xbcc17401,0xbbc123fb,0x3d4eceac,0x3df47f90,0x3e0ce4ba,0x3e1823d0,0x3e18c31a,0x3e17d6fd,0x3dedd0e2,0x3e30326b,0x3e539139,0x3e2dd510,0x3e1f182b,0x3e03aa67,0x3dcf5f71,0x3d3f4967,0x3cf55f26,0x3d7ed8b0, +0x3e27557e,0x3de3daf9,0x3de14e0a,0x3dd4f3f5,0x3e59cf44,0x3d0a33a5,0x3e73bd6b,0xbdc23601,0xbea549ce,0xbf646063,0xbf4efc65,0xbf372cc4,0xbf1ad053,0xbf29ef84,0xbf20e28e,0xbf07088f,0xbeec2c4f,0xbed69532,0xbebcee14,0xbeb1aa6d,0xbe80a1d5,0xbde501d3,0x3d058cd2,0x3de9f201,0x3dbc0080, +0x3e0d7f78,0x3e03a4c8,0x3e2cd96c,0x3e341653,0x3dc88548,0x3dd1c5d2,0x3dd44ca1,0x3ddb4c61,0x3da9cd72,0x3e0ed637,0x3dec1dc7,0xbc2502a8,0x3d67b221,0x3d93604c,0xbcb804ff,0x3d8d3306,0xbd7db673,0x3c61d30d,0xbe4f86f3,0xbec8e628,0xbf0490c0,0xbef7ecf4,0xbef6733e,0xbee97f3b,0xbeae5510, +0xbe4eb617,0xbda9693f,0xbd09228e,0xbda11a9b,0xbe54c7be,0xbe6b3afc,0xbe613fc9,0xbe1e108e,0xbe09b497,0xbd7145cc,0x3ce27576,0x3e1fbf6c,0x3e35f37f,0x3e197661,0x3e07a4be,0x3df36705,0x3de31fb4,0x3daafae8,0x3dae1977,0x3d75aedc,0x3d9e0041,0x3d8117b5,0x3c85083e,0x3d3f3edd,0x3d04af83, +0x3b882801,0xbda302c1,0xbdeb4604,0xbe1cb0fd,0xbec0fcdc,0xbe18d1fb,0xbe88af44,0xbe819546,0xbe8a8f91,0xbe87eb64,0xbe3506bd,0xbdab576f,0xbba77fd4,0xbc9156c7,0x3c620590,0x3d26dc09,0x3b3d5d4f,0xbcdef120,0xbc87aff3,0xbd53d4da,0xbd4b0b41,0xbcd0776d,0x3d6bbc9f,0x3da60c77,0x3de53c8f, +0x3d9b7175,0x3d4ccfac,0x3d8d85d9,0x3ce265b4,0x3c8f48dc,0x3cf548a1,0x3cd5c66d,0x3cad5757,0x3cff8e8d,0x3cae70f0,0x3cee9154,0x3c8dd310,0x3c87f888,0xbcaec886,0xbd811192,0xbdeb79db,0xbe31ae06,0xbe0b09d1,0xbded0b5e,0xbe0a34c3,0xbe0afa94,0xbe0ff6a8,0xbe26f88f,0xbe3bc93d,0xbe571c13, +0xbe784ce9,0xbe8f16b6,0xbe8cad5e,0xbe890980,0xbe86d684,0xbe7203cc,0xbe55601c,0xbe4dcb61,0xbe2e7e72,0xbe26817d,0xbda65d59,0x3ba3e2af,0xbce9ef2a,0xbcb7da8d,0xbc029a19,0x3b99a676,0x3acfb0e4,0xbb8dcac1,0x3a74b548,0xbc3a7d07,0xbc828865,0xbd120b9d,0xbd0e758a,0xbda30756,0xbddd3e67, +0xbe1d1563,0xbe0f89d1,0xbe13395e,0xbc108e1f,0xbcb48ea1,0xbd038143,0xbd204234,0xbd3e3b79,0xbd41abb5,0xbd4b4c51,0xbd523a0b,0xbd4c1703,0xbd509156,0xbd636df6,0xbd7fba84,0xbd874925,0xbd8eb4e6,0xbd9ef85b,0xbda56e04,0xbd9107f7,0xbd88393a,0xbd949b93,0xbdf4a7ab,0xbd793cd3,0xbd35598a, +0xbd53048d,0xbd2905ab,0xba7d7672,0x3b807469,0x3b4ad259,0xbbeedd4c,0x3c443e7d,0x3ce37d79,0x3c152a90,0x3b5cae0b,0xbd00dbc6,0xbd3212d5,0xbbe5c19e,0xbd89cece,0x3d04bd04,0xbaaf04ad,0x3ac6a926,0xbb289242,0xbbda83be,0xbc42a74b,0xbc8a0804,0xbcc7548f,0xbd0334a1,0xbd1da69b,0xbd3cdb92, +0xbd59e02e,0xbd8107cf,0xbd5785a1,0xbd2cd9a5,0xbd0a5405,0xbd03b881,0xbcefee88,0xbc2ce16e,0xbda13617,0xbddc2e4e,0xbe3b296b,0xbd05e6c0,0xbdafbbf1,0xbe221d5e,0xbe2406a1,0xbe1fae5b,0xbe1b34ca,0xbe2021e0,0xbe248e39,0xbe1eb8a0,0xbdaab4e6,0xbc44dbc9,0xbe46b656,0xbde3b9ba,0x3c6e5aee, +0x3d0b05b9,0x3d254630,0xbc855a96,0xbbca3475,0xbc3dc3d6,0xbc271b20,0x3c499a1f,0x3ce97b15,0x3d36a19c,0x3d5e23f5,0x3d786cc2,0x3d80c233,0x3d620790,0x3d49c0b5,0x3d349272,0x3d25864a,0x3d172176,0x3d0d43d4,0x3cfe8839,0x3d0889bb,0x3cb541df,0x3d8b9799,0x3db5365c,0x3e033450,0x3d5f0888, +0x3daa88e1,0x3df42b35,0x3df81c0f,0x3df54d40,0x3de9f363,0x3de599b8,0x3de23155,0x3ddc7250,0x3da5b889,0x3d133914,0x3df40f7f,0x3d9349d8,0x3d602613,0xbd69201f,0xbd9052c7,0xbd8a151d,0xbd659d9c,0xb9dd9f0e,0x3d3b335d,0x3da9946e,0x3de86a23,0x3df8df1d,0x3de6ab10,0x3db8978a,0x3d9a9374, +0x3d863d02,0x3d655aab,0x3d4bfb40,0x3d3f04c6,0x3d1d467c,0x3d0f13f9,0x3d2c859b,0x3dc7a8d3,0x3d8366c3,0x3d87a6b4,0x3d82ccd9,0x3d91c97f,0x3d6641fa,0x3d73c001,0x3d7f04cf,0x3d94c9f8,0x3d5f258c,0x3d352c11,0x3d4a6211,0x3d0a8732,0x3d2362c9,0x3d35daea,0x3a7045d4,0xbd74b216,0xbe01f562, +0xbe3896c3,0xbe357a0b,0xbe2b6347,0xbd70c906,0x3d1d8e8b,0x3de1eebb,0x3e38689c,0x3e63e47f,0x3e6ca505,0x3e4a195f,0x3e1fd19e,0x3e011423,0x3dc2c846,0x3d94eaf7,0x3d75f0eb,0x3d30f630,0x3d204670,0x3d7b5913,0x3da023e4,0x3db94aed,0x3d9ec9df,0x3d85c73d,0x3d9beb10,0x3d71912a,0x3db47782, +0x3d89799c,0x3dc0d341,0x3d71080d,0x3d7b4fe7,0x3d36a345,0x3d077488,0x3cbe0829,0x3c18457d,0xbd37a622,0xbdb9a699,0xbe38728a,0xbe5ce42a,0xbe5cafd8,0xbe50c0dd,0xbd4e1b31,0x3db3ab56,0x3e49a85d,0x3e975fc5,0x3ea8d6ed,0x3e97e1d3,0x3e6c8215,0x3e3e582e,0x3e1a0a43,0x3de72973,0x3db4bd63, +0x3da4c184,0x3d5a8216,0x3d5e0f84,0x3d984406,0x3da9d489,0x3da20039,0x3dd16756,0x3d9b68ef,0x3d88b05b,0x3d7ce0d9,0x3d9d2c65,0x3da7877e,0x3da01035,0x3d609f0c,0x3d26d1fd,0x3cf9be64,0x3abf6013,0xbc2b89a2,0xbc4fb521,0xbd6eb74a,0xbec47c34,0xbeed6d11,0xbeed349a,0xbf095213,0xbef47dd5, +0xbe84a43a,0xbdd8a000,0xbc756756,0x3da3919e,0x3e44d7ab,0x3ee3a6a9,0x3edbba8a,0x3ec3dbee,0x3e93707d,0x3e3da9ba,0x3dde8ec2,0x3d835dc6,0x3d38e48a,0x3d2d8384,0x3dbd1091,0x3e1a45a4,0x3df4d8a4,0x3dd7653e,0x3dc3faa5,0x3db6f612,0x3d834cef,0x3db7a48d,0x3db1a300,0x3d9444d4,0x3d515d02, +0x3ca36a05,0xbb1cf98d,0xbd04fdf0,0xbdad762f,0xbe069c2f,0xbe618c72,0xbf03e467,0xbef7b81b,0xbdba6cd7,0xbd94b568,0x3df22c99,0xbd2a7fcb,0xbe5023cb,0xbeee6a39,0xbec5a678,0xbe925373,0xbe0c4473,0xbd91dff7,0x3bea2da1,0x3d86aafb,0x3dce6e1d,0x3e01918d,0x3e00f3ac,0x3e0ab498,0x3dedf660, +0x3dc9de45,0x3de532fd,0x3de31abb,0x3dad69cf,0x3da4a9ab,0x3d947c90,0x3d5707ac,0x3d93df28,0x3daa4fef,0x3ddde9b6,0x3d9be7a1,0x3d72df66,0x3d2a5fd9,0xbbf98293,0xbd88e638,0xbe2b2cb1,0xbe8e17d9,0xbef8d2ee,0xbdd7ea0f,0x3f217e7e,0x3f084641,0x3f02183b,0x3de0c2e8,0xbde8cc73,0xbe9e3ad3, +0xbed06e59,0xbebffe8d,0xbe9b1562,0xbe759896,0xbe4a2688,0xbe37a79e,0xbe2bbc29,0xbde7c991,0xbc12669a,0x3d0b1bff,0x3d76b383,0x3db6a9f5,0x3da1eb79,0x3d9e4a52,0x3de2580e,0x3dc46f11,0x3dc84173,0x3dafa9a9,0x3db552de,0x3db1f94c,0x3dc7bd3c,0x3d0366a6,0xbb04b1f2,0xbb38cbc7,0xbe04f3e7, +0xbde473d1,0xbea9b199,0xbe0cfe65,0xbd834dd7,0x3f0c92f9,0x3f16361b,0x3ebef686,0x3e0229d5,0x3e2a7267,0x3e46ae01,0x3e32ce9d,0x3de46e0c,0x3da79bf3,0x3cfca39d,0x3dc9149a,0x3db1adfe,0x3c253a14,0xbc69e803,0xbcd152e5,0xbbb3d48b,0xbd08eaf4,0xbd57ffd9,0x3bda24b2,0x3dadde0d,0x3d633627, +0x3d4e206b,0x3d2b89e1,0x3d0baa09,0x3d04ef5d,0x3db3f23d,0x3dc6dc00,0x3cf2917e,0x3dac3a83,0x3d5de32b,0x3d0fe36b,0xbd165410,0x3d0ee6e8,0xbde32022,0xbcd2f1dc,0x3e13892d,0x3ebc93a6,0x3eb095ab,0x3e8315de,0x3e57c67f,0x3e12fcd1,0x3da8964b,0x3d9f68b7,0x3d7deb40,0x3e0e7959,0x3e8ca9ae, +0x3e915743,0x3e81b08e,0x3e3c0712,0x3de26208,0x3c9c8092,0xbdbe22c5,0xbd9951eb,0xbd810157,0x3c7081d1,0x3dc4915c,0x3cea5f75,0x3d0153da,0x3d88c3a4,0x3d8527cc,0x3d778c05,0x3d719dc0,0x3d78b281,0x3d0aecdd,0x3c95a28f,0x3c6faa7e,0x3d84d859,0x3d37633e,0x3cc65791,0x3cb4fa06,0x3e8a001a, +0xbd4e9ebf,0x3e6396ba,0x3e67b37b,0x3e33cbec,0x3e353453,0x3d85a19a,0x3baf4549,0xbca795d1,0x3c0bd1f2,0xba3bced5,0xbbbd3da8,0x3c8a3c1a,0x3cc919e0,0xba8a0d12,0xbd3b20f4,0xbd8ad8e0,0xbdaae4fb,0xbd3d688f,0xbcbd3245,0xbc247477,0x3d0dc230,0x3d2698d3,0x3d47f80c,0x3d0ba758,0x3d248e16, +0x3d5d4f48,0x3cba798a,0x3c4d87d8,0x3d44633e,0x3d246a46,0x3cfe5667,0x3caed1a9,0x3cbdb3b5,0x3d495470,0x3c87836d,0x3d88afda,0x3dc437de,0x3ddd3257,0x3e0c8ad6,0x3e0a4818,0x3e1aa876,0x3dfe68d2,0x3de3d44c,0x3db39099,0x3da6c455,0x3da8c2c2,0x3db7cc8b,0x3d754050,0x3ce1b56f,0xbc129249, +0x3c03e326,0x3c590d9a,0x3ccf926e,0x3c984a16,0x3d73a6e2,0xbbb4b733,0xbda94d58,0xbce9399c,0xbc3fccca,0x3b972086,0xbc69b7be,0x3d1d00f6,0x3c07cb94,0x3d7fe33f,0x3c987d86,0x3d23c744,0x3c606449,0x3c9be2ce,0x3d28bd91,0x3d54ed47,0x3d91c795,0x3dcc211c,0x3d2341ce,0x3e0fe72a,0x3e0f83d1, +0x3e129928,0x3e18a855,0x3e1cc671,0x3e2258d7,0x3e29bc85,0x3e21fb37,0x3e14e366,0x3e0997c9,0x3dfae31d,0x3de82897,0x3db2aaaf,0x3dcbb31d,0x3ddb58f6,0x3df4fec7,0x3df46106,0x3e088e86,0x3e1095f2,0xba37ab69,0x3dbc23f6,0x3dc02454,0x3dd02f26,0x3dae6fac,0x3def4019,0x3de314a4,0x3de78099, +0x3dc7f299,0x3de55263,0x3ddd1221,0x3dc6ca01,0x3dccc1a7,0x3dbd0eae,0x3dbc47f8,0x3de68eed,0x3e0a5e12,0x3e143b71,0x3e036e08,0x3e0b7e16,0x3e0b9439,0x3e0ff99b,0x3e133416,0x3e17f159,0x3e17fe1d,0x3e1a747b,0x3e1b9510,0x3e1dd060,0x3e20bbad,0x3e23d632,0x3e2227e6,0x3e1d3d23,0x3e1967cd, +0x3e1a0c43,0x3e0ee8a0,0x3e2b8dbb,0x3de97593,0x3daa6b85,0xb969d2fd,0x3e02a1b0,0x3dba2fdb,0x3cf2e9e4,0x3cfac6dc,0x3d057cfd,0x3d26349f,0x3d1cc3ff,0x3d2dd830,0x3d37346d,0x3dc1720c,0x3e07073d,0x3d0cfbcd,0x3dcb57a7,0x3e197d97,0xbd244668,0xbce0d93f,0xbc4ecf0b,0xbc5d5fbc,0xbc1d88d8, +0xbc1cf977,0xbd0ed111,0xbd5898c0,0xbd996fac,0xbda2f852,0xbda563d8,0xbd99bfe6,0xbd84d2f8,0xbd693c6e,0xbd53b4bd,0xbd3fe360,0xbd32474c,0xbd2d715f,0xbd1bd71e,0xbd07d13c,0xbd24b0e6,0xbcffdc8b,0xbca47603,0x3cb148cb,0xbd171492,0xbca7ee28,0x3c93598c,0x3c9d6c73,0x3ca3506d,0x3c8a6edd, +0x3c947000,0x3c7f13a1,0x3c6a8ca9,0xbccaee19,0xbcf0bb40,0xbb494cf0,0xbce192e3,0xbd5a8481,0x3c5d4e68,0x3d3d1c0b,0x3d25922a,0x3d0f847b,0xbd028568,0xbdb66b72,0xbe1668e3,0xbe313ae4,0xbe2e3bbb,0xbe0d746e,0xbdd69036,0xbdaaedca,0xbd9b0e97,0xbd830acc,0xbd6664df,0xbd5f2d41,0xbd284146, +0xbd0f8ecc,0xbd09a272,0x3bcac87c,0xbca8af6d,0xbc9e0102,0xbc66f2f6,0xbbe7f8ab,0xbc7ac2db,0xbc030004,0xbbf7b541,0xba3458b8,0xbb8d1d7e,0xbba7bb7c,0xbb1ef024,0xbc7eac20,0xbc94a180,0xbcf9d7bc,0xbbf9224b,0x3a5e9640,0x3d2f5a2e,0x3e2858a7,0x3e097371,0x3dfd726d,0xbc56ec23,0xbe039449, +0xbe789ec4,0xbe9471b3,0xbe913dc6,0xbe714c5f,0xbe39a610,0xbe090f9b,0xbdf29a94,0xbdb7c87b,0xbd994df4,0xbd8fe40c,0xbd25a1e3,0xbd119d0a,0xbc5ee5a5,0x3ae1fb05,0xbaab280f,0xbc28e869,0xbb9f4431,0x3c6585e6,0x3a3951b5,0x3d083a3f,0x3cc530c8,0x3d2bdd73,0x3d1a4509,0x3d351ae1,0x3d2bd58d, +0x3bf83741,0x3a96c258,0xbb891061,0x3d0fc2f9,0x3cf890ab,0x3deea082,0x3e8a38a5,0x3e71adb1,0x3e53065e,0xbc6e05ae,0xbe4a422a,0xbec1aced,0xbee6fe6a,0xbed03571,0xbe8e5f7c,0xbe34f1d3,0xbdfde1a9,0xbdf039f5,0xbdc5b5a5,0xbd9d3ea0,0xbd9b0456,0xbd27619a,0xbd0b9967,0x3be0b0c5,0x3d6b9277, +0x3cb2adad,0x3d6f1fba,0x3d0aff61,0x3d1b83b7,0x3d081b13,0x3d71910a,0x3d9bb040,0x3d9a1ad0,0x3d8b0cf7,0x3d81dc69,0x3d8cc2cb,0x3c92970e,0xbbbf2242,0x3cda0576,0x3db78c02,0x3d44ae73,0x3e8cd91b,0x3eb5de23,0x3ebc65db,0x3eb8db28,0x3e2e2a95,0x3c6546e9,0xbe1880d0,0xbe8efdea,0xbeda71f9, +0xbf140d9c,0xbefe1e07,0xbed63541,0xbe96d35f,0xbe6e424a,0xbe33eed2,0xbe197fe9,0xbd784d56,0xbd2feb4f,0xbcf41235,0x3c077028,0xbcc50a9b,0x3c8c3a02,0x3cd5399a,0x3d4c6985,0x3d4d5600,0x3d84ebbb,0x3d7f6aaa,0x3d642d56,0x3d826458,0x3d9adf5d,0x3d99d466,0x3df08481,0x3de3d7cb,0x3daae193, +0x3c34452d,0x3db46b96,0x3e61d052,0x3dc66f16,0x3d33b10f,0xbe125ea9,0xbe1acc5b,0xbdad0448,0x3e003a39,0xbd8d463f,0xbe819ad1,0xbf030a8d,0xbef3cce1,0xbef97e48,0xbefa0fdc,0xbeca4ffd,0xbe992b97,0xbe59f989,0xbe164e98,0xbe08c0c5,0xbd7d931b,0x3cd775f5,0x3ce47659,0x3d58a08d,0x3d286fd8, +0x3d587d65,0x3d778413,0x3d9c0940,0x3da7ad98,0x3d9ee85f,0x3cfdfaa4,0xbb32cdf4,0xbd1ecbe6,0xbd6a8cd0,0xbd2a2b09,0xbce25adc,0x3d543adf,0x3e9aaf51,0x3d7b9068,0xbf1a94f9,0xbf1b0a6e,0xbf2e091c,0xbe1af26c,0x3e264f3b,0x3ef9accd,0x3efb2c80,0x3ecfa861,0x3e84b3a2,0x3e4cca8d,0x3de844c1, +0x3cc38127,0x3cdda582,0xbb8f5609,0xbd84263f,0xbdf81e00,0xbe35fc09,0xbe07d420,0xbdc6963b,0xbdb71644,0xbceb7479,0x3b0adde2,0x3d170ec2,0x3cdfd4c1,0x3dd001dc,0x3dc8598a,0x3cab6bea,0x3d872649,0x3d991a8c,0x3ce36dae,0x3dccaf41,0x3db58dc7,0x3e4cf0c2,0x3d2321c4,0x3d4912fb,0xbef1a38c, +0xbf0c72b7,0xbe9a87cf,0xbe1f92e3,0xbd15c16d,0x3d8aa42f,0x3e87f626,0x3ec5ee70,0x3efd77f4,0x3f16df96,0x3ef4c556,0x3ec7b4bd,0x3ea7d93b,0x3e77f15e,0x3e18429b,0x3d87bbb9,0x3d163f82,0xbc4a7efc,0xbde2669e,0xbd8f110e,0xbd8ae6c9,0xbd9f1ef7,0xbd5355ee,0xbd09d933,0xbcea86ef,0x3d51ac7f, +0x3dab49e5,0x3d10fb63,0x3d9b954f,0x3d8feeaf,0xbc9d3816,0x3d14f118,0xbd226fd9,0x3d2b52d1,0xbcfa6505,0xbc582715,0xbe1dcaef,0xbddc01d0,0xbd89eb15,0xbe20aadc,0xbdaaefe0,0x3aeffe0f,0x3dd7e1c8,0x3e649ed5,0x3e8a165f,0x3e7a1dc2,0x3e8c2e56,0x3e95989c,0x3e8e258e,0x3e8bb95d,0x3e711aa7, +0x3e461f77,0x3cdd77d4,0xbd6f8ef6,0xbdfde45f,0xbddd54fc,0xbd9c88cc,0xbce7a604,0xbca1741b,0x3b8b32a1,0x3d44133b,0x3d841280,0x3d8e1409,0x3dbdf5a6,0x3db32f88,0x3db3fc83,0x3d563489,0x3d3f8da5,0x3d0af92b,0x3d0ee030,0xbe18f217,0x3e1c7501,0xbdacbe63,0xbd9a5c87,0xbd173b6c,0xbda9c4f2, +0xbc7da13a,0xba43364d,0x3bb6929b,0x3b1317f8,0x3d24ba43,0x3da17750,0x3daa08d9,0x3dbfde68,0x3dfc28e6,0x3e1fb7f5,0x3e290f10,0x3e2f8bd4,0x3dbe0adc,0x3d8430c3,0x3d2e8ba8,0x3c88c75d,0x3d3b9658,0x3d14423a,0x3db282ad,0x3dc0e370,0x3d8eb74e,0x3da3ccf7,0x3d9b6e31,0x3d7009c8,0x3d056b1b, +0x3cb9f1c3,0x3cccdcb1,0x3d649c32,0x3d68f6f3,0x3da79e90,0x3d3c86f7,0x3c82d955,0xba18f520,0xbce76959,0xbc106db9,0xbc0889ea,0x3bea3bd0,0x3cbe37a6,0x3d4ecc49,0x3d73f451,0x3d8540a6,0x3d92f313,0x3de58a9d,0x3e1ceb60,0x3e491b3e,0x3e3b59ca,0x3e36b8b8,0x3e375763,0x3e4bc9e8,0x3e4ba1b2, +0x3e6177d1,0x3e57c6d5,0x3e4c1cac,0x3e41cf26,0x3e1afe4f,0x3e0558dd,0x3dc3a22e,0x3dc83207,0x3d420edb,0x3d9106c3,0x3d2ce37f,0x3d89653d,0x3d3a3385,0x3d1b9599,0x3cfde8d1,0x3cf98361,0x3a998c14,0x3e07b475,0xbbb80c7a,0xbc0e86be,0xbbb28c56,0xbc0f683b,0xbbfcac4d,0xbc2d5f08,0xbc85c56d, +0xbb13860b,0x3c730607,0x3ce5324a,0x3d366249,0x3d6c31e1,0x3dad1ade,0x3db3aca6,0x3dc40b4c,0x3dc260b0,0x3dbf0446,0x3da8d7fd,0x3dc0624b,0x3e291fcb,0x3db1c003,0x3d9cd7ca,0x3d8db57e,0x3d89d1e1,0x3ce5888f,0x3cc17641,0x3cdb4c03,0x3d295b62,0x3ca47dd1,0x3bdd9cf7,0x3cefb684,0x3cd2f181, +0x3d4e4821,0x3d69de9e,0x3cac7a52,0x3d339da3,0xbc8d67fe,0x3c49c1a0,0x3bbeca15,0x3bdcc478,0x3bc19459,0x3bc8e507,0x3b96c02f,0x3c478401,0x3c8b0b07,0x3cbf35ed,0x3ce171d0,0x3d00e79d,0x3d126590,0x3d02e56b,0x3cfcff9f,0x3cfff5bc,0x3d09d120,0x3d2073f6,0x3ca81f50,0x3dbe6344,0x3df87df3, +0x3e349121,0x3d575c56,0x3dc782fd,0x3e1ac02e,0x3e1de385,0x3e19c56b,0x3e10f47b,0x3e17179b,0x3e16d18d,0x3e107356,0x3daef76b,0x3cc1320d,0x3e1be4ba,0x3db93410,0x3c65b785,0xbcd8b56e,0x3a538c7b,0xbcd32b70,0xbc815d34,0xbcbd78ba,0xbcd66379,0xbd1210c0,0xbd1828b6,0xbd0646ec,0xbcfc3d4d, +0xbcf934dc,0xbd00fb82,0xbd025c5b,0xbd02c7bd,0xbcf8860a,0xbd058c80,0xbd056643,0xbd01c8c3,0xbd05c3c8,0xbd027b38,0xbd04f6f2,0xbcb438b8,0xbca6ea83,0xbcf3d480,0xbc87caca,0xbc6d381e,0xbcc1e065,0xbca26b58,0xbc949d0e,0xbc9ca00e,0xbc7efe5d,0xbc5d93ea,0xbc6f845e,0xbbc8efe2,0xbc0ef067, +0xbc1ac15f,0x3b8d9824,0x3d8c9770,0xbbc17054,0xbc95d254,0xbcae6749,0xbd0d1858,0xbd7b6e31,0xbd88c9e5,0xbd435e18,0xbd345041,0xbd243ba3,0xbd2ef864,0xbd340064,0xbd2a9662,0xbd0c91ae,0xbd1c1f5c,0xbd282d9a,0xbd2de8db,0xbd3caddf,0xbd423b8c,0xbd329e1b,0xbcfaaa29,0xbcf2ad94,0xbcbeb07c, +0xbc983d0b,0xbc51b397,0xbc0a92af,0xbb45a483,0x3b0236c7,0x3ad2ea5d,0x3b37ea47,0xbb31b67a,0xbb6c9db9,0x3bf545df,0x3c9c1a3d,0x3d066765,0x3c7952e9,0x3daea8a4,0x3ca0e958,0xbd5cf32e,0xbd21ab56,0xbd5fe1d6,0xbdd2f8b9,0xbdcb2481,0xbd7b7d9f,0xbd8985cc,0xbdac0065,0xbdcc7a70,0xbdd22be5, +0xbdc98f00,0xbd9e67d8,0xbda3363c,0xbd9738e3,0xbd88a26e,0xbd94b401,0xbd93f915,0xbd7cadcf,0xbd34e5a3,0xbd0a6442,0xbd01651d,0xbc87d070,0xbb32f6e2,0x3b1964f0,0x3c8ae951,0x3c8ecf1f,0x3cc0ec00,0x3cae7a22,0x3cef7169,0x3c928eb9,0x3d084d69,0x3d1a6509,0x3d904538,0x3d3e2aa0,0x3e28d368, +0x3d118164,0xbd956c1f,0xbcf61a66,0xbd310b0b,0xbdfb2c27,0xbe170a2f,0xbda391b5,0xbdbb3554,0xbddfd523,0xbe060d66,0xbe07a064,0xbde65847,0xbd8f8fe3,0xbd896849,0xbd8d992e,0xbd8865c2,0xbd9d7b93,0xbda7f9c2,0xbda7e650,0xbd1f01ad,0xbd185311,0xbc9ae322,0x3b069898,0x3c86937f,0x3c2bfb45, +0x3d2d4899,0x3d7c464c,0x3d6e66ab,0x3d4f4fec,0x3d3f066b,0x3d373352,0x3da20331,0x3dfd282a,0x3e00c07d,0x3db1f496,0xbd89bdf5,0xbebd751b,0xbeede34b,0xbee5513a,0xbeea8872,0xbe920c88,0xbe0df14f,0x3c35e72b,0xbd83b344,0xbdd0438f,0xbe319912,0xbe85f916,0xbe97aaa5,0xbea846ee,0xbe82ab93, +0xbe56316b,0xbe43f589,0xbe2c1bd0,0xbe1584dd,0xbdf97b1b,0xbd818ef6,0xbd2c9197,0xbc2243db,0xba5886ae,0x3cb62656,0x3d3379dc,0x3d652f28,0x3d73b609,0x3d603dc2,0x3d6f3fd6,0x3d3252b0,0x3cc88e33,0xbd7e11f9,0xbd95e3e7,0xbdd7d2e5,0xbd7531e9,0xbe0905b8,0xbeb81f02,0xbedb2fdb,0xbeaa6f9b, +0xbd82cdbe,0x3cd8f135,0x3da44016,0x3df68d3e,0x3e9e1cbe,0x3ef2880f,0x3f2c902f,0x3f0de863,0x3efa14f4,0x3ed89b03,0x3e980f38,0x3e26a5dd,0x3d3806a5,0xbd348814,0xbd7f40f3,0xbdaf1ff4,0xbe04f71f,0xbd926a61,0xbd388bfd,0xbbf54a3c,0x3cca977f,0x3d15d6ea,0x3d9a2eee,0x3da007b4,0x3d327504, +0x3d047aef,0x3c696f9b,0xbb93db5f,0x3cf6d6ca,0xbc2b14cc,0xbd007826,0xbe11c603,0xbedbb206,0xbeb5c0cd,0x3e98c9f9,0x3ee04686,0x3f2fd13d,0x3eae4c50,0x3e631b0d,0x3dcef0aa,0x3e6b8ff9,0x3eafcd2e,0x3ef5e842,0x3f069f73,0x3f150983,0x3f1ebddb,0x3f196be6,0x3f02943f,0x3eb7c40c,0x3e5bb8b6, +0x3e1fd6d5,0x3c13243d,0xbd979cf9,0xbda3e506,0xbe084c23,0xbdb346db,0xbd8ec2c3,0xbd61b288,0x3d254f20,0x3d8b094e,0xbc36a261,0x3d8ca219,0x3d3b9875,0xbcebfdd0,0xbd7b1950,0xbdd2aeeb,0xbe4d4931,0xbe26792b,0xbe369e37,0x3e61fcd5,0x3eea0133,0x3e9316cd,0x3e9a3833,0x3d8c17f4,0xbd14080d, +0xbe0f3ba8,0xbe00c4f9,0xbdf4f6f7,0xbe130d79,0xbcf51887,0x3d6abd4e,0x3dfdd009,0x3ddf1c8b,0x3df546a3,0x3e229cff,0x3df00d97,0x3de7fe74,0x3db0fb3e,0xbd29cc6c,0xbb637fdc,0x3c118f3f,0x3ca02d9a,0x3d2f64e8,0x3d0a544e,0x3d8faaf9,0x3d64c9e0,0xbd2e59f9,0x3ce95c96,0x3cafa649,0x3c3c0baa, +0xbca3abd5,0x3b09a08f,0xbd7f0605,0xbd4cb52e,0xbc040943,0x3d975b1f,0x3db1fa57,0x3dd28dcc,0x3e3ddb99,0x3b5ee64e,0xbdedc13a,0xbe73e92d,0xbe9f9944,0xbeb2f19a,0xbeafb2a7,0xbe9c30d6,0xbe893b17,0xbe4f18ba,0xbdfffb5a,0xbd549bf4,0x3c41b24e,0x3d801868,0x3dc2cbdc,0x3de4d3c7,0x3d2b3c58, +0x3d9ff27f,0x3d7baba0,0x3d04de8e,0x3cda27a2,0x3c4f22d9,0x3cf384ae,0x3cfd1b02,0x3d38f535,0x3d4eeb4b,0x3cbf9ff3,0xbc551696,0xbb54d42e,0xbc1e84d4,0xbd2882d0,0x3d5b1219,0xbd91e4cd,0x3d7156da,0x3d2c2ff3,0x3c1d421e,0x3bc8206b,0xbd1f628a,0xbd2fa510,0xbd5a84d9,0xbda2aeab,0xbdfdf205, +0xbe256da1,0xbe297cdc,0xbe2acde2,0xbe3484e4,0xbe1b36b7,0xbe018f05,0xbdbfafc9,0xbcfb22dc,0xbc91de80,0x3cae4af4,0x3d845142,0x3cab68bd,0x3d070290,0x3c9dae76,0x3c80b409,0x3cf27194,0x3d4cb456,0x3d6cfb4d,0x3cc82ac8,0x3d32d5d1,0x3d1774e9,0x3c59a906,0xbc954321,0xbcd5c165,0xbca0af4c, +0xbc21d9bc,0xbc4b9153,0xbcb65761,0xbced8c56,0xbd6a9cb1,0xbd9c2959,0xbd9f4c2a,0xbdbd2e7c,0xbde73783,0xbdced7f5,0xbdb85cfb,0xbdab0736,0xbdc19c0b,0xbdd98d48,0xbdf49e1f,0xbdcb69b2,0xbda30320,0xbd8ff6ab,0xbd9cd7a8,0xbde34c28,0xbd9a9a8c,0x3b4a944b,0xbcb4a6ae,0xbcd11700,0xbc8e3280, +0x3ca14f45,0xbc817b7e,0x3c50fbf3,0xbb36f273,0x3c62b89e,0x3c216823,0x3a6ce630,0x3b05c0cc,0x3bbae978,0x3c00ffdf,0x3c26925d,0x3bb8d892,0xbd6c6687,0xbd0e82ea,0xbce92488,0xbd005a33,0xbd048eb4,0xbd104b8a,0xbd06441e,0xbcfa8e8f,0xbd03b54e,0xbd17f7cd,0xbd1dae36,0xbd28f0d1,0xbd2569c3, +0xbd2b9c3a,0xbd3f8756,0xbd5cba05,0xbd665921,0xbd48bc9b,0xbd36d152,0xbd4b527c,0x3cad0732,0xbc802754,0xbc48bdac,0xbc73fa32,0xbacc92f9,0xbbbd1092,0xbbf0e79a,0xbc7aba4b,0xbc70a831,0xbcc72fcc,0xbcc37ed4,0xbd02f09e,0xbd06fb50,0xbd193348,0xbd407ddf,0xbd384701,0xbce6e176,0xbd069b6a, +0xbd1e0ed8,0xbd1cb613,0xbd1c194d,0xbd21fbb8,0xbd2c2633,0xbd3573d3,0xbd47aa4f,0xbd53f930,0xbd61c618,0xbd69d306,0xbd74ab7c,0xbd7e3bc2,0xbd6d1e89,0xbd5c1083,0xbd537ac0,0xbd592084,0xbd457e6a,0xbd7b6c0c,0xbd2ffe71,0xbcee89ca,0x3c0e4bf2,0xbd0f3ccf,0xbcb2e15f,0xba91d284,0xbbd3987a, +0xbc0526f1,0xbc5258c8,0xbc6ea7b4,0xbc8a360d,0xbc976efe,0xbd04e2c2,0xbd0f1c0b,0xbc674a5f,0xbced031f,0xbd3451a5,0x3ab9a68b,0xbd4c47df,0xbc3d971e,0xbcad8c49,0xbcb25c60,0xbceff9e1,0xbc017f4b,0x3b204709,0x3c5804cd,0x3c6270c5,0x3c8b87d7,0x3c982c2d,0x3ca9d08c,0x3caaf5fb,0x3cb0b2be, +0x3c9aef59,0x3c86e3bd,0x3c63119e,0x3c1e759e,0x3b9690bb,0x3c97150d,0xbd02309b,0xbd37dbcd,0xbd52c297,0xbccb6c7b,0xbd2f821f,0xbd3135a6,0xbd3748e2,0xbd30a2c9,0xbd281b29,0xbd358c00,0xbd3d9bb3,0xbd479cdb,0xbd2de1ce,0xbce64633,0xbd270679,0xbd572598,0xbd9a5059,0xbd964fe9,0xbd9655f6, +0xbdb42aa1,0xbdcb603d,0xbd298ccf,0xbc028f69,0x3c95f964,0x3cd08342,0x3cf74cdd,0x3cf2cff3,0x3d1f42bd,0x3d3898a6,0x3d4c6cf5,0x3d40a3b6,0x3d2ab2db,0x3d1710cb,0x3cc0e0ed,0x3cb95d14,0x3c61213a,0xbd45bf39,0xbc241528,0xbc97bf0f,0xbc8f7dbe,0xbc9d05a9,0xb9997df8,0xb98e349c,0xbb2eea14, +0xbc569895,0x3b4e5273,0x3c0a860c,0xbc61c60a,0xbcafd817,0xbd1b8469,0xbd1b5e0f,0xbd103afb,0xbdf124f7,0xbe069eb2,0xbdffecdf,0xbe152251,0xbe317997,0xbd3c02f3,0x3c53158c,0x3d8d5655,0x3d918279,0x3daefb80,0x3db90abb,0x3ddf96fe,0x3de70bab,0x3dee6e3f,0x3dd2e815,0x3db1fee5,0x3d93e852, +0x3d31cac7,0x3d2a7047,0x3c5c4a3a,0xbcdc70b0,0xbc8d0ac8,0xbc0dc271,0xbc73876f,0xbc93f28e,0x3c8b4cdf,0x3b506247,0x3c72837e,0xbb9ccd4e,0x3c9bfeac,0x3af21ff6,0xbca083ed,0xbcd0953e,0xbce44da1,0xbd59a285,0xbdacdc8f,0xbe3a3a66,0xbe6766a3,0xbe6251d4,0xbe990d3d,0xbeb57f71,0xbe21a298, +0xbd043225,0x3d5a2c3c,0x3d8668ae,0x3d6d9f2d,0x3d270c0c,0x3da16fcc,0x3dde9e95,0x3e08a591,0x3e054f0a,0x3dee3f0d,0x3dd0ec47,0x3d8d8b0a,0x3d88bc62,0x3d17516c,0xbd22b1af,0x3b59432e,0xbcde3b22,0xbbafece7,0x3ba9a972,0x3cd8a855,0x3d13c38a,0x3d4fe138,0x3d360063,0x3d5cd001,0x3d4be6c2, +0x3c02ac39,0xbcb3fd70,0xbd74fa28,0xbd93aea8,0xbdcb9bb1,0xbe4b3a00,0x3d4d2527,0x3e3db690,0x3e53a5fe,0x3eb51a0b,0x3ebd4ce9,0x3eab82c2,0x3e8689ea,0x3eb197a3,0x3ed9002d,0x3f05fed5,0x3f067e18,0x3efbbc23,0x3ee1df88,0x3ea9cf79,0x3e7f6d4a,0x3e4a9619,0x3dded9a1,0x3dab9248,0x3cb71203, +0xbd584433,0x3c556288,0xbaab766c,0x3c91bb57,0x3ce32cff,0x3d4508d2,0x3d821f20,0x3d701e85,0x3d083634,0x3cc1700a,0xbc67fa5d,0xbd84c464,0xbcd4cb12,0xbd665220,0xbd869451,0xbe0744d9,0xbdc265fe,0x3e3d8d6b,0x3f04de55,0x3ee871b0,0x3e9f834e,0x3e335da0,0x3df4d9ab,0x3d22d890,0x3cece365, +0x3d9481ab,0x3ddd4425,0x3e8dd085,0x3eb72b14,0x3ec942ee,0x3eadd881,0x3e8e9be5,0x3e425ac3,0x3e259d97,0x3e0d1520,0x3dc42c01,0x3d167068,0x39274e18,0x3bece013,0x3cbc98f8,0x3d1dcfc2,0x3ce865f7,0x3d6a37d0,0x3d80e5f1,0x3d21e5e7,0x3cdbf89d,0x3c7675a3,0x3c87517e,0xbcc5fb22,0xbb0003e3, +0xbd070d28,0x3d261b0d,0x3e9d4a88,0x3ed08e9e,0xbc80168d,0xbe58c88e,0xbed41a36,0xbe9ef63b,0xbe803072,0xbe278b0c,0xbe9d2274,0xbec4f0c8,0xbefa258d,0xbf010dd2,0xbefc4953,0xbed2b433,0xbec55bac,0xbe9b7e10,0xbe489917,0xbdc4af1d,0xbd88c8c0,0x3d363d52,0x3d960941,0x3d59ebe7,0x3d4062ea, +0x3c9bc08c,0x3c3385fb,0xbc80fa6f,0x3d02732d,0x3d48fbc4,0xbcb0e198,0x3d7162b9,0x3d4dab95,0xbad1c252,0x3b96534e,0x3d9d7477,0x3dbc2af8,0x3e116213,0x3e42a369,0xbd9468a4,0xbe97d9ed,0xbe5a83f3,0xbe9ea9e9,0xbe3790cf,0xbe263edc,0xbe15db73,0xbe65898d,0xbe914652,0xbea69f77,0xbec3b11d, +0xbed80afe,0xbedad530,0xbec3a45f,0xbea71a39,0xbe954a6f,0xbe72f351,0xbe4d0b2b,0xbd8d6c13,0x3d444073,0x3a8165af,0x3d0d691d,0x3c8325ad,0x3c9db185,0x3d198a0c,0x3d0f7ffe,0x3d31a2da,0xbc2e411a,0x3d4379d0,0x3d5df89b,0x3d2350cc,0x3d405e76,0x3cc2f236,0x3d39ce55,0x3da0af90,0xbd49d8e4, +0xbe01589e,0xbe0f98f5,0xbe11292e,0xbe2bf094,0xbd352393,0xbba698fb,0x3c5d4cfb,0x3ccf1c5e,0x3cc68426,0xba996cbf,0xbdcfaac6,0xbe2642cc,0xbe49beee,0xbe747902,0xbe751f6a,0xbe6d7575,0xbe2dc581,0xbe0b58d7,0xbdaa0aba,0x3d02d09e,0xbcf9a082,0xbcae92fe,0xbbcbe41f,0xbc8cddff,0xbc283bb9, +0xbbca7135,0x3bf02422,0x3c6f221c,0x3cca14d8,0x3cd4d1a8,0x3cbd91eb,0x3c570c0a,0x3bf2a156,0x3cc52294,0xbd9f3e41,0x3cb27b17,0xbd99f2dd,0xbd889678,0xbd3e61e4,0xbced46d0,0xbd0e31d8,0xbd6c8777,0xbd7932ae,0xbca911dd,0x3bc49a11,0x3c48999c,0xba880ee1,0xbc16b2e4,0xbc18971b,0xbcaa5479, +0xbd20b645,0xbdad058c,0xbde3dc39,0xbdfa69ca,0xbdd7295c,0xbdc7d389,0xbdc6b8b2,0xbd8dddec,0xbd8a8aef,0xbd187571,0xbc425ce0,0xbc35bb6b,0xbbd480c5,0xb9574e00,0x3c6adf30,0x3c9dd586,0x3c761055,0x3bb08f09,0xbc57c199,0xbcbbff22,0xbd03952f,0xbb5fbb8c,0x3be37c87,0xbbe9c20e,0xbc43dc46, +0xbcb53946,0xbccfb7aa,0xbc8404ba,0xbbb32e70,0xbcc142f6,0xbd154a7c,0xbd312a9f,0xbd16322c,0xbcf48212,0xbc8c3591,0xbd03a55e,0xbd33fe6e,0xbd3e5649,0xbd674bda,0xbd6be43e,0xbdb1a02a,0xbdc9e5cd,0xbd9dc5de,0xbd8f6852,0xbd5eb232,0xbd4157c4,0xbcfca013,0xbc7aaf20,0xba45708c,0x3cc8df99, +0x3c5809d2,0x3c8b30f3,0x3c742948,0x3c10ffd7,0x3b80dc46,0xbbaefc5c,0xbc0898b8,0xbc1fd33e,0xbcc924f5,0xbcda5e4a,0xbcaa2ea4,0xbc8fb3d2,0xbc619b1a,0xbc8a962e,0xbc8daae4,0xbcbd2527,0xbcd3753e,0xbcfdb1c7,0xbd0bf522,0xbd228630,0xbd35632c,0xbd3f95ed,0xbd46ddd9,0xbd596f84,0xbd6cd346, +0xbd6f576d,0xbd728d4b,0xbd6a6564,0xbd46f287,0xbd3ff4fd,0xbd27b19a,0xbd123506,0xbcf75d3b,0xbcf2d2fa,0xbcfa7a3b,0xbcd42dd3,0xbcc6fa8a,0xbc8cd8eb,0xbc605d45,0xbc682192,0xbc7b2a17,0xbc45c8ab,0xbc4bd608,0xbd0f6480,0xbce0dfdb,0xbcbf409b,0xbcc040c7,0xbcbc0cbe,0xbcb5b8fa,0xbca338b0, +0xbc8aabcb,0xbc8babd7,0xbc8cd939,0xbc90c547,0xbc9f5553,0xbcaa637a,0xbcb7c2db,0xbcc8c856,0xbcdb9a14,0xbce8a325,0xbcf4d69a,0xbd074146,0xbd0f04f5,0xbd319629,0xbd395018,0xbd2f5d70,0xbd15ed0a,0xbd262b87,0xbd07f520,0xbd0549fe,0xbd0359f2,0xbd090076,0xbd039999,0xbd0a2bf0,0xbd072f0a, +0xbceeab61,0xbcd65bde,0xbd187ab3,0xbd0f1a91,0xbcf58ddb,0x3dda55e3,0x3dbd81b4,0x3dec22d5,0x3dd97546,0x3df38514,0x3e0108d4,0x3e0008da,0x3dffe52a,0x3e04cfa5,0x3ded10d5,0x3dddb315,0x3dd05249,0x3dc86ed5,0x3dc3e7fa,0x3dbea440,0x3dc0cc01,0x3dbecc65,0x3db895be,0x3dbe0ec1,0x3db90d18, +0x3db9e834,0x3db8e534,0x3d929b24,0x3c7850a3,0x3dc006b9,0x3d93ef3b,0x3cbb054a,0x3cb146e6,0x3cb6c439,0x3cc5cd1c,0x3ce69bc5,0x3ce04678,0x3cc2fba1,0x3d8c8e80,0x3dce95bd,0x3becc364,0x3d8033b2,0x3c808c54,0x3e10faeb,0x3e1cca05,0x3e317722,0x3e4472cb,0x3e3e5547,0x3e3e864d,0x3e46cdcd, +0x3e292380,0x3e133caa,0x3df9dfa8,0x3dd0e594,0x3db17103,0x3d9cc8ea,0x3d9e7064,0x3d9e55e7,0x3d9273de,0x3da3c5d4,0x3d9da7c0,0x3da7317b,0x3d7deea1,0x3d91f1e7,0x3da1e101,0x3d8066d2,0x3d7957db,0x3dafd376,0x3da58c2f,0x3daf9600,0x3d98658f,0x3dba167a,0x3db855d7,0x3d8cf807,0x3da12245, +0x3d87a8c1,0x3d737370,0x3dad6464,0x3d82fc25,0x3e0f5747,0x3e67faba,0x3e7a9f7d,0x3e92104b,0x3e8886f1,0x3e848656,0x3e8d98b3,0x3e69ad29,0x3e4a9f06,0x3e26bc44,0x3e01ac46,0x3dda542a,0x3daff7c0,0x3da7123b,0x3d985aa4,0x3d6140db,0x3d8e5ece,0x3d72f6d7,0x3d6811de,0x3d8f37b2,0x3d3bc55e, +0x3d3bbd16,0x3d10dc3c,0x3d056201,0x3d805168,0x3d1dc8ea,0x3d5bc318,0x3d10f9cc,0x3d7ad258,0x3d56349c,0x3d09bc31,0x3d183007,0x3d045000,0x3d0916a1,0x3d9bac5e,0x3d28742d,0x3e436136,0x3e9d6185,0x3eb0d350,0x3ecf2903,0x3ebbdc1c,0x3ebbc1c7,0x3ec7837f,0x3ea610ab,0x3e8eef67,0x3e637c02, +0x3e0d2abd,0x3d9ae93c,0x3d043190,0x3cbfb9cf,0x3c6e8668,0xbc10af64,0x3c6e7323,0x3c17ff50,0x3cb6b3b0,0x3d4b638d,0x3cb48d08,0x3cc5ca43,0x3a6f90ef,0x3bf002a9,0x3d0ec4cd,0x3d00411d,0x3d11c9a5,0x3cecf78b,0x3d534c8e,0x3d39dafa,0x3c693000,0x3cc3e04e,0x3cad8887,0x3cef60f0,0x3d6604a9, +0x3e8b218e,0x3e959e09,0x3e80bc83,0x3e953048,0x3e6eee9a,0x3e277dbf,0x3e0a05d5,0x3dd322a5,0x3e0e7f41,0x3e14a456,0x3e033cb1,0x3e5d174c,0x3e712dae,0x3e617326,0x3e3c5142,0x3e20785f,0x3e07ec02,0x3de6168a,0x3d8d0c54,0x3dae7b3a,0x3da75295,0x3d02bc56,0x3d117747,0x3cc8e6b5,0x3d0b02e6, +0x3d2cdfe4,0x3d457588,0x3d30f7e0,0x3cad241e,0x3cce7eb3,0x3d36cecc,0x3d90445f,0x3da49c33,0x3dcc7923,0x3e10d51b,0x3e3f544a,0x3e3fa661,0xbb1f657b,0xbed0011b,0xbed96bec,0xbecc37f1,0xbe4efecd,0xbdbf1557,0xbca5016f,0xbd999164,0xbe49411b,0xbe966723,0xbeda4bc6,0xbef9cbb4,0xbef68ca4, +0xbee41a55,0xbec392bf,0xbea2300c,0xbe58d84d,0xbe1070ab,0xbcfc0b0d,0x3d9c0620,0x3d964f02,0x3d76f416,0x3cea9ca2,0x3ce1821b,0x3d378f54,0x3d3ceb32,0x3d676a61,0x3d163a81,0x3d2f6650,0x3d205030,0x3d030c25,0x3d481a9e,0x3d65f276,0x3dbc982e,0x3d805376,0xbdc4dff5,0xbe914ce7,0xbe28f757, +0x3c3394c3,0x3e641aeb,0x3d652671,0xbd79a66a,0xbe21c37b,0xbd5b3158,0xbc35da29,0x3d815214,0x3d373470,0x3c962874,0xbd3d8de9,0xbdf5bfa0,0xbe239e97,0xbe315754,0xbe1e35b9,0xbe0bda7f,0xbde4d1ba,0xbd7f905b,0xbc959853,0x3d0d09c8,0x3cf868f1,0x3d2bfbee,0x3d6573cc,0x3d8293ef,0x3d897223, +0xbbe5692c,0x3d9ca93c,0x3d96c938,0x3cacbc64,0x3d90b90f,0x3c9a92fe,0x3d29bfbb,0xbc8ea84f,0xbe1e1e5c,0xbd0a07f4,0x3dd191e6,0x3db6ab61,0x3e8a01e4,0x3dab17b6,0x3d428581,0xbc7a8002,0x3d81aba9,0x3ddd545a,0x3e1c788e,0x3e1031ad,0x3dee0917,0x3d6f2a11,0x3d68111c,0x3cdf2203,0xbbc37eec, +0xbcc991cc,0xbd15f50f,0xbda9a5e6,0xbdc0fdcf,0xbd7f0d3e,0xbdac93eb,0xbd6e90e7,0xbd015992,0xba583406,0x3bf83cc4,0x3c68d797,0xbc5af8ec,0x3cfd88bd,0x3d0bc8ae,0x3cb83b57,0x3c5a0223,0x3bfa39df,0xbba7baee,0xbd7325a0,0xbb934cae,0x3d0aa0fd,0x3dea8cfe,0x3dfe1840,0x3dfb71c0,0xbab33fbc, +0xbd1ad495,0xbd30d3ee,0xbd247170,0xbd1f889d,0xbcf9b37b,0x3d477b57,0x3dacf123,0x3d88a897,0x3d87e3d5,0x3d36fa87,0x3caa4d6c,0xbcdc8a88,0xbd027ed0,0xbd7e122c,0xbde170fc,0xbd8555df,0xbd5a156d,0xbcd06738,0x3b22aba2,0x3c94bbce,0xbbcd4031,0xbc45d60c,0xbb9dec19,0x3cc3d717,0x3d1bc0d8, +0x3d4e1944,0x3c91d14c,0xb9db3f74,0xbc7b4d4c,0x3d196b7e,0xbd6a779f,0x3d37f23e,0x3da5b4bf,0x3d73a8c2,0x3c289a4c,0xbbc88e48,0x3b5a7bc4,0x3c697515,0xbd0a1adc,0xbd40d9e8,0xbce0c40a,0xbc06adcc,0xbb394edd,0xbbbae00f,0xbd2f3a2d,0xbd596037,0xbd1f678b,0xbcadcf1a,0x3c119e97,0xbc575b1b, +0xbd2c8572,0x3beb6df8,0x3ba2e241,0x3b82764f,0xbbc3e82f,0xbae07bc4,0x3c3a841f,0x3c8b91f7,0x3c449740,0x3bea1926,0x3bc3335b,0x3c387238,0xbc056ba1,0xbc2f3aeb,0xbc6eb68b,0xbc80da04,0x3c13444d,0x3c08997d,0x3c94c5a3,0x3c8f4b7e,0x3ce0b6cc,0x3caf23ea,0x3b8c7099,0xbc74ea4b,0xbc6cfb25, +0xbc907eab,0xbccfe47c,0xbd15c04b,0xbd35aff2,0xbd525f12,0xbd42146d,0xbd4e7147,0xbd7fbbf4,0xbd2c8892,0xbc380e52,0x3b87120d,0xbc65eb6d,0xbbd8d139,0x3b9393d8,0x3c01fabc,0xba2d0b7b,0x3cbcf323,0xbabf5432,0x3c026729,0xbc4ea4d9,0x3b62c5ae,0x3a8a4404,0x3c3454f4,0x3c20cda3,0x3c007ef6, +0x3bbb4e49,0x3c680712,0xbd2a2222,0xbccb4bcb,0xbcc573f5,0xbcf04f74,0xbd00d86b,0xbd14d405,0xbd0e2b1b,0xbd120063,0xbd07ce05,0xbd073852,0xbd03910d,0xbd09a35b,0xbd156833,0xbd2d9ea5,0xbd15caef,0xbced2a71,0xbc9b871f,0xbc83d256,0xbc66d8c7,0xbc6df2f9,0xbd4c77f5,0xbcb929a5,0xbca68b47, +0xbc64a16a,0xbc9acf48,0xbc29669f,0xbc1538e6,0xbbdd08ab,0xbc6b1423,0xbc096bba,0xbc078c52,0xbc40c67f,0xbc7a4f09,0xbca4d606,0xbcce19fe,0xbccd956d,0xbc49cffe,0xbc4b8f69,0xbc8f1e2e,0xbc90d031,0xbc9ee143,0xbca29b76,0xbcb039f3,0xbcc0ca68,0xbcc3346a,0xbcc4aaf2,0xbcc17c6f,0xbcb69bc1, +0xbca3a083,0xbc96621a,0xbc7f3bfa,0xbc720c1f,0xbc5dab75,0xbc3bfa19,0xbc2344c8,0x3ae637a6,0xbc261414,0xbc80ef79,0xbd08071c,0xbc2b1f17,0xbc7f0a42,0xbcf25d40,0xbceb704c,0xbcddd602,0xbcb137f2,0xbcb7ede7,0xbca930bc,0xbc9283fd,0xbc664e9c,0xbc3610a2,0xbca1c5db,0xbc7cf561,0xbc7ed3dc, +0xbd0a65f8,0x3cdc81c1,0xbd1e9754,0xbc7dde5e,0xbcc28928,0xbc9ee6ef,0xbd269877,0xbd461030,0xbd5373ac,0xbd4f7124,0xbd4aebea,0xbd3cc131,0xbd3f782c,0xbd3e6517,0xbd3ba5d5,0xbd3ba99a,0xbd35eb3d,0xbd2c343b,0xbd216870,0xbd050d95,0xbd5476ba,0x3c2e8b93,0x3d465ca4,0x3df19c9b,0xbb7e4439, +0x3d410afc,0x3dec449d,0x3de7e3ef,0x3de1cfad,0x3dcdf944,0x3de22b77,0x3de518e4,0x3dd69441,0x3d496473,0xbbefd908,0x3df21917,0x3d843e33,0x3debf487,0xbbf2aef1,0xbc1a3915,0xbc46dbeb,0xbc07c1b9,0xbd694066,0xbd9b0bcc,0xbda36b6d,0xbda7d0c6,0xbd9bc651,0xbd79d51d,0xbd6a64fc,0xbd5cd92a, +0xbd5c01d2,0xbd68b690,0xbd61b8be,0xbd518e3c,0xbd31413d,0xbd2a1d3a,0xbd3520f3,0x3d47ef4b,0xbbc8a4e3,0xbb80a135,0x3c0a9c4e,0x3ca8d550,0x3ba03d59,0xb9a657ae,0xb9806ebe,0x3c5bd433,0xbaf17f58,0xbc53e015,0x3ad58848,0x3c0c0fe5,0x3d11280d,0x3d151fe9,0x3bcb149c,0x3dbf488d,0x3d4602cc, +0xbc2be053,0xbab6a24c,0x3c358819,0xbdb325b0,0xbdfaefcb,0xbe1104ff,0xbe1c0399,0xbe193030,0xbe04f77c,0xbe0114f7,0xbdfd9b36,0xbdefbe49,0xbde838fb,0xbdd3b445,0xbdb41f56,0xbd895e32,0xbd70d050,0xbd329a4a,0xbc089b2d,0x3b961d71,0xbb6df382,0x3ab16f3a,0x3cd422d7,0x3cb55561,0x3d200a78, +0x3bb7786c,0x3cfa52b3,0x3c8e440f,0x3d26f523,0x3c1826db,0x3d1072fa,0x3d3833fd,0x3d821e9f,0x3d5ad7b3,0x3e099571,0x3d67ca64,0xbcd0b8b2,0x3b47733d,0x3ce669b6,0xbdd5c1d1,0xbe2bf6bf,0xbe4601f4,0xbe4eef95,0xbe436b3f,0xbe0e2817,0xbddf5ebf,0xbdbc862d,0xbdbb2207,0xbdc59b92,0xbdb3e04d, +0xbd93ac8d,0xbd4a9c3f,0xbd35c1ee,0xbd4e702e,0xbba9ffcc,0xbcb012bf,0x3b6262e4,0xbc5aa9c2,0xbb76ca64,0x3ca7bdb9,0x3cc84154,0x3d0cba2e,0x3c1302f8,0x3d19e120,0x3cd87ce3,0xbb76891c,0x3d273729,0x3d96fb95,0x3d8768f3,0x3d7b7db6,0x3cd51cdd,0xbe30e65e,0xbe603895,0xbe6fb865,0xbe07afd8, +0xbdc14d2d,0xbd98a554,0xbdb8fc6e,0xbe2caf43,0xbe600bb6,0xbe8638dd,0xbecae65c,0xbee4c59a,0xbee3aea0,0xbec60808,0xbeaf998b,0xbea0a288,0xbe6da53f,0xbe2b45bc,0xbdcca0f2,0xbc5c320a,0xbcd34b1e,0xbc23ff01,0xbbc0123c,0x3c565ca8,0x3d2d212d,0x3cd1e771,0x3cf0f576,0x3d0660a8,0x3d3c9f9f, +0x3d0ba2de,0x3c596361,0xbc3921c9,0x3b380a5b,0x396838c4,0x3d8415bd,0xbe29e031,0xbdfd0915,0x3dda9449,0x3e3da17a,0x3e91075d,0x3e5934a7,0x3e21f09b,0x3d41c265,0x3dfa7d7e,0x3e0f1f21,0x3dab2e05,0x3d96ffa8,0x3cb180f7,0xbdadd850,0xbe0514a6,0xbe0875bc,0xbd7bbda3,0xbdcac736,0xbdd77db2, +0xbdccb8aa,0xbdceca20,0xbd67babb,0xbd26645b,0xbccc9586,0xbbc307bf,0x3cdab29f,0x3d10b331,0x3d4c2019,0x3d125a44,0x3d89cf4d,0x3d957f28,0x3d8c3bc2,0x3d252e80,0xbc1338aa,0xbd515173,0xbda22a23,0xbce01ff1,0x3df951fa,0x3e004922,0x3d0f80a5,0xbd88f99c,0x3db36435,0x3e0237ac,0x3cab169b, +0x3d709d10,0x3daa49e1,0x3d86e55f,0x3de5cae8,0x3de9552b,0x3db3b9e8,0x3df2d38e,0x3ddc5566,0x3db803cd,0x3d19e571,0x3cf55dd0,0xbbb8f643,0xbcb4c5d5,0xbcc281c9,0xbcf646d5,0xbc56e033,0x3c020ecc,0x3d71023e,0x3d4a68eb,0x3d337565,0x38feef42,0x3d271e19,0x3caca2f9,0x3b80f857,0xbcbcbcb5, +0xbcad0816,0xbd353af7,0xbcb39ae7,0x3db8842e,0x3d456160,0xbde3fc0d,0xbddce459,0xbdee34fb,0x3cb80808,0x3cd8d55b,0xbd198aec,0xbdba34ad,0xbe09e11e,0xbe005212,0xbdc8e85a,0xbd720d02,0xbc1dab42,0xbc6235ff,0xbb6b10ba,0x3c987a96,0x3c52179b,0x3c80f10e,0x3b7af8b1,0xbce84206,0xbb77dff0, +0x3c5a5c84,0x3c43a8f5,0x3cbd8653,0x3d15d0c9,0x3cb572da,0x3c2d43ed,0xbc798b8f,0x3c9a65a8,0x3d008369,0x3d5cf27e,0x3cde27c8,0x3c119aad,0x3c57c1ca,0x3d47164f,0x3c89a7d1,0xbc8cb0c7,0xbdd6667e,0xbd98d7b3,0x3cffd777,0x3d9de009,0x3d886b3d,0xbbae7774,0xbc8c3874,0xbc8e6a22,0x3c20a90e, +0xbd8f9580,0xbdc47ef4,0xbd85cdfd,0xbd7fab18,0xbd4c1c28,0xbc880671,0x3c7f21ff,0x3d0c91f4,0x3d5a3e9c,0x3ceb52df,0x3d1c3549,0x3c293dd8,0x3c6fb13d,0x3cbbe32e,0x3d0259aa,0x3cb760d0,0x3c901b98,0xbc619c00,0x3c01265a,0x3c16b78c,0x3be38a06,0x3c8ee5ed,0x3cd08c42,0x3cdd0d7e,0x3c283983, +0x3cd62f8f,0xbd3b528e,0xbd16477c,0x3c4e0ba0,0x3d851f02,0x3d5c3340,0x3c9a60e0,0xbd11cd02,0xbd19f1d8,0xbd5cf270,0xbd953710,0xbdadbc5a,0xbdbf3be2,0xbddbeb2e,0xbd921a9b,0xbd06833c,0x3c97175b,0x3d3c7451,0x3d45a535,0x3d0724cc,0x3d2001e0,0x3d0208c5,0x3c804e1d,0x3cb2d1f3,0x3c87ef56, +0x3c65bfbe,0x3be25e40,0x3bea79e6,0x3c9a7fd3,0x3c8ffcb0,0x3cb217d1,0x3c9147d3,0x3cd81f62,0x3ca5686e,0x3b82ee1b,0xbbb9669d,0x3d0be069,0x3d265027,0x3cc7df2c,0x3c903e6c,0x3c05c864,0xbc44d1ba,0xbcbc48bc,0xbd069bc9,0xbcdb1a42,0xbccba57a,0xbce1c803,0xbc750150,0xbbd85880,0xbbef2624, +0x3c2dbfc4,0x3cc9f0d9,0x3d264142,0x3d1ac30e,0x3d33ef01,0x3d3f29d6,0x3d0a5042,0x3cf22f29,0x3caf71ed,0x3cd6fe29,0x3cfb4378,0x3cee680e,0x3cf44ecb,0x3d0633a7,0x3cbf3205,0x3ce0046f,0x3ca7990d,0x3cc32b07,0x3c913a78,0x3c9516fc,0x3c72acb3,0x3cb72daf,0x3ab9371b,0x3d0a8c66,0x3ccd7675, +0x3c8f52a5,0x3c2c84fb,0x3b9d990b,0xbb1028e5,0xbc4180cb,0xbc4c2b7a,0xbc553e80,0xbc4056e6,0xbc3305e8,0xbc12c6e0,0xbbe29042,0xbb0362e8,0x3a5b50f3,0x3baccc82,0x3c4489c3,0x3c8f7851,0x3ccf5846,0x3c1e3b1a,0x3ca6bde6,0x3c8ec45a,0x3c3dc52a,0x3bfb9cf1,0x3c159d6e,0x3c5ec2bf,0x3c859193, +0x3c8a6120,0x3cca5fbc,0x3cec7906,0x3cce9105,0x3cdf99d1,0x3ca76f46,0x3c97a106,0x3cf5c19e,0x3b301beb,0x3cf79083,0x3ca2a6d1,0x3c97f4b1,0x3c8167fe,0x3c58521f,0x3c3489c4,0x3c078dfd,0x3c18a420,0x3c10faa5,0x3c033e5a,0x3bc4c22d,0x3b763790,0x3a478556,0x3b68ab47,0x3bc9ceab,0x3c04be89, +0x3c265456,0x3c31edc6,0x3c889e4d,0x3ac6ec51,0xbbf08669,0xbc9acb8d,0x3be7a08f,0xbbbc93b7,0xbc95ddb5,0xbc93d056,0xbc90608d,0xbc852b20,0xbc926bf7,0xbc91fc33,0xbc8091e4,0xbaa3e12b,0x3c843401,0xbcafa204,0xbbe0910d,0x3ca3218a,0xbd43371e,0xbd835a65,0xbd5438a1,0xbd5a70f3,0xbd66c81f, +0xbd6f5dd6,0xbd4a0541,0xbd3bde1d,0xbd42e8b8,0xbd236d29,0xbd1b478a,0xbd21f8ad,0xbd1f53ba,0xbd222909,0xbd2826e8,0xbd271380,0xbd257f63,0xbd1aef60,0xbd270b61,0xbd2a3d7d,0xbd0c575c,0xbd6d0700,0xbd82829c,0xbd706801,0xbd4b17f5,0xbd6be2b9,0xbd5727a3,0xbd5ea81d,0xbd60690d,0xbd604c3f, +0xbd6bd39b,0xbd6f784c,0xbd742bcf,0xbd70b723,0xbd62e66f,0xbd5c5d08,0xbd81b637,0xbd7f8b5c,0xbdcad3db,0xbdd5fab0,0xbddc04ec,0xbdd59ef8,0xbd94830b,0xbd7b383e,0xbd8b9b89,0xbd36e460,0xbd2718c4,0xbd4b027f,0xbd43d216,0xbd44b708,0xbd43b52e,0xbd308c4e,0xbd2453ac,0xbd096720,0xbd29f964, +0xbd22bef8,0xbd2017c5,0xbd7bc0a8,0xbd378662,0xbd3d8726,0xbd18fd14,0xbd0d9c69,0xbcdfb515,0xbceaa700,0xbd0113a5,0xbd119d58,0xbcf8d8e2,0xbcf49e11,0xbd2a1d56,0xbd4ad3ae,0xbd74e0f6,0xbd79beb2,0xbd809750,0xbda2fb29,0xbdd5aac3,0xbe02bbc9,0xbe07c6e0,0xbe12279e,0xbdb52617,0xbd91573f, +0xbdb1c7cc,0xbd0a5d75,0xbcd3ea4d,0xbd1b83ec,0xbd140490,0xbd1bb128,0xbd250d07,0xbd13c5e3,0xbd02b0e3,0xbc988764,0xbd14a359,0xbd0a1513,0xbd092a8a,0xbd53c3bb,0xbd2d3866,0xbd014dfc,0xbc89fda4,0xbc2cb071,0x3baa3d04,0xbbbe679d,0xbb381729,0xbc637828,0xbb226ff8,0xbc822490,0xbce1f95f, +0xbcfc70c2,0xbd1d1f0d,0xbd74fe2a,0xbd9e2cc8,0xbe06bfbb,0xbe56f41d,0xbe73107c,0xbe80d68c,0xbe801fb5,0xbe1735d8,0xbde8d283,0xbe053305,0xbd38b5f2,0xbcf0246f,0xbd87f429,0xbd8f323b,0xbd93f191,0xbd803135,0xbd27af91,0xbcd11f0a,0xbbfb3061,0xbd032a3a,0xbd0740e1,0xbd0694af,0xbd4901e6, +0xbd122bfd,0xbd0baba3,0xbc50a421,0x3b42b811,0x3cb09f3a,0x3cb678ac,0x3ccda98a,0x3c8e192b,0x3cfa7e40,0x3c86f440,0xbcb740e2,0xbd3d68ca,0xbd95020f,0xbdc73390,0xbdd196cd,0xbba131bd,0x3e5152ac,0x3e9f9762,0x3e8aea89,0x3df2efdb,0x3dc083d3,0x3cd18192,0xbd4db11e,0xbd9274e5,0xbdc76dc5, +0xbdc676a3,0xbd381194,0xbc76d6ef,0xbc9bc13d,0xbc8b4062,0xbcb276c6,0xbc479914,0xbc921c51,0xbc8252e0,0xbd7a5169,0xbd9f8c1c,0xbd1c2024,0xbcbd40d2,0xbc1ede92,0x3b16831f,0x3d1407ee,0x3c68108b,0x3c948041,0x3d0264c4,0x3c5f2bc8,0x3c2d5e1e,0x3cd80b36,0x3d5d9b0a,0x3d1fb492,0x3d394981, +0xbbfabc8c,0x3da43e7a,0x3e2c1ab3,0x3d94d1f0,0x3c1b59cc,0xbc2c94ff,0xbc023fcd,0xbb18dce9,0x3d2239e8,0xbd7ff94e,0xbd897904,0x3d5dfa8f,0x3d4e0101,0x3d879e51,0x3dcae47d,0x3de83d35,0x3dd97e5a,0x3d999155,0x3d0f592a,0x3c1a78cd,0xbd0671ce,0xbd81b5ba,0xbd838cf6,0xbd25d140,0xbc2eec7e, +0x3c260c2a,0x3d4450fe,0x3ce2323e,0x3cd795f5,0x3cc3499d,0x3d6adcd8,0x3d65a00e,0x3cd6bd93,0x3bfd0a5d,0x3d0791cf,0x3d2d9876,0x3d9f20cf,0x3d97591f,0x3c9cf46e,0xbc9063ba,0xbc9dc0f9,0xbd2d7c18,0xbd3228bb,0xbd3ddb25,0x39d21523,0xbd8db16a,0xbdc5b065,0xbd1d2fc1,0xbd7a1b76,0xbd26c78f, +0x3b68285b,0xbc531783,0xbc8b1bbf,0xbce36ba3,0x3d005e9b,0x3d468425,0x3d00467c,0x3d1c50be,0x3cf3a821,0x3c863075,0x3ba22df5,0x3c63df2b,0x3d8dbeb2,0x3c1b6b10,0x3aa55121,0x3b0617df,0x3d1202be,0x3d1cb65b,0x3d5dff43,0x3cca2462,0x3d1fb1b3,0x3d5480ea,0x3d89419f,0xbc809950,0x3d12bc58, +0x3df00a9f,0x3da21245,0x3ceb7d41,0x3d74039d,0x3daa012d,0x3dfc8bb4,0x3d895c77,0x3d0e7d7f,0x3ca1e9c6,0xbd11725d,0xbd2a72ca,0xbc3ef17f,0xbb8f92e2,0x3a467a45,0xbbb7c989,0xbbd067bb,0x3bf81212,0x3cef4b52,0x3cfc9973,0x3d1cf567,0x3d6eb743,0x3d111837,0x3d1af6bb,0x3da13ce1,0x3c5abdd3, +0xbaac0605,0xbbb7fd11,0x3b4bb40d,0x3c8a00ed,0x3d600a1d,0x3c7c3f57,0x3c88c711,0x3c81b922,0x3c0d653e,0x3c28a0f8,0x3d50ebff,0x3ca2e752,0xbcd62c78,0xbd33fba2,0x3c08ffb9,0x3cbb3d80,0x3cdd810d,0xbd25ba48,0xbda00f8b,0xbdc51dcd,0xbd4c83d6,0xbcf81d44,0xbd5180d4,0xbc8c047d,0x3b1ac7f6, +0x3cb13973,0x3d09ed20,0x3d06fd1d,0x3d02a136,0x3d01a2fd,0x3cb32c06,0x3cdfb6e7,0x3cba2a28,0x3cd143aa,0x3d103c58,0x3d2fb539,0x3d2f3fff,0x3cafbfb9,0x3cab77ac,0x3c8b4fd7,0x3cccc9b4,0x3cc64a71,0x3c9588ae,0x3bb19378,0x3c880b72,0xbd46a626,0xbd054617,0xbd10b341,0xbd12825b,0xbc82d803, +0xbc4d55cc,0x3be9acc5,0x3d0e2ab3,0x3b8b3f0b,0xbcbaccfa,0xbd4e78d6,0xbd1952a1,0xbc5dbe10,0x3c576d33,0x3d3c6e05,0x3d349616,0x3cf359f5,0x3bbbf1ca,0xbb17b3f3,0x3c724e49,0x3ceeec05,0x3cd62596,0x3d0e063a,0x3cf56635,0x3ccb49c6,0x3c671ac6,0x3c34da44,0x3c3dae47,0x3cc92e6b,0x3ccbdc04, +0x3cb49339,0x3c8a4de5,0x3cd99fc6,0x3cd05bc2,0x3c3082c3,0x39a8ef85,0xbc5911a9,0xbd033937,0xbc83f3fd,0xbb5b17f4,0x3be3eb5a,0x3c6ef9e7,0x3cb04e61,0x3cf8d502,0x3ce50446,0x3cff6a95,0x3d116c23,0x3cc29228,0x3c2c66f6,0x39c02de1,0x3b6e4dfe,0x3c4b0e8a,0x3ce4d31a,0x3cd7e657,0x3c87e896, +0x3c6b18c6,0x3cbcce70,0x3c355e9c,0x3b938f03,0x3be74bea,0x3c269526,0x3c949c2a,0x3cacb48e,0x3cd6ce00,0x3d127d4a,0x3c90909d,0x3c41179d,0xbb5e2777,0xbc004b17,0xbc6addd7,0xbc8a29ab,0xbc9b9ccf,0x3d4c0074,0x3cd3a068,0x3cdb0afe,0x3cfd2526,0x3d07f3d8,0x3d16a09f,0x3d21db6d,0x3d2edb4b, +0x3d32bcff,0x3d2fdf7e,0x3d2ca541,0x3d2e2b43,0x3d3a6f49,0x3d422d4c,0x3d3af76d,0x3d282a7f,0x3d0f68ef,0x3cff9640,0x3ceb8bca,0x3cdb160e,0x3cf60c98,0x3cf03939,0x3d12746e,0x3d1fd01f,0x3d21177d,0x3d3392c5,0x3d23be8a,0x3d193c98,0x3d0fe27c,0x3d04c64d,0x3cf110d4,0x3d06f384,0x3d03991b, +0x3d19033c,0x3d26c5e3,0x3cf36009,0x3d0e544a,0x3c5dc728,0x3ca48923,0x3ca4aa58,0x3cad0729,0x3cb575be,0x3cbed5fc,0x3cca9eb9,0x3cd54f5d,0x3ce57e87,0x3cf62318,0x3d0598aa,0x3d0c1876,0x3d1556e5,0x3d06eee3,0x3cfe0869,0x3cefa1cd,0x3ce3342d,0x3cd42f9a,0x3cb11739,0x3d0682a1,0x3d1d2cf2, +0x3d082f9c,0x3d0d599d,0x3d2a5ecf,0x3d1096c2,0x3d108c27,0x3d157c29,0x3d160b0b,0x3d201c6a,0x3d24f55e,0x3d23be68,0x3d1af6f0,0x3cde02d2,0x3d28f9b3,0x3d2823b1,0x3c99e2e2,0x3b9dc039,0xbbea4bec,0x3c43a62d,0xbae60c15,0x3a5e306f,0xb91c60b9,0x3a06fb97,0x39a29788,0xbb232ec8,0xba686c6f, +0xb903ce8f,0x3b2f2b5b,0x3addec59,0x3b16411b,0x3af50208,0x3bc49ce3,0x3bfe99f5,0x3c21ba2a,0x3bf7d11a,0x3ba73597,0x3c45584e,0xbb1b8997,0xbc480f68,0xbd17c788,0x3b91026c,0xbbee5cf8,0xbce83662,0xbcf99bc0,0xbcf69aec,0xbce007b8,0xbce2cc7c,0xbcf2fa3c,0xbd00db4e,0xbc748492,0x3b9105e1, +0xbd39a28e,0xbcb07e1c,0xbd7a737a,0x3c9562db,0x3c9709a2,0x3ca87775,0x3c98e2fa,0x3c2deca5,0x3b5f4b34,0xbbda03fe,0xbb724d74,0xbb37e1b3,0x3af6f702,0xbbd75835,0xbc0ada31,0xbc1260fe,0x3a263e81,0x3bd81236,0x3c6050e0,0x3c038fb6,0x3bfd0bdf,0x3c4706ce,0xbca4b42e,0xba3e0207,0x3a7d9af2, +0x3ad3b7d5,0x3abfd549,0x3c7333c1,0x3c076f86,0x3c009f45,0x3bdbb4b2,0x3c0025ee,0x3c0456d5,0xbb19a7ad,0xb99e098e,0xbc06fa1d,0xbc90c219,0xbc00b9a1,0xbcf8adf3,0x3bdad606,0x3cf4860c,0x3c40e928,0x3c045958,0xbc6ff33c,0xbca2ce2b,0xbd04dfcd,0xbcac540a,0xbc48aa89,0x3bce45a5,0x3b1fcb22, +0x3b62f1dd,0xba5a140f,0x3c896eb2,0x3cc407b8,0x3d0330ac,0x3c908e6a,0x3c7a6537,0x3c49990f,0xbb2e7c63,0xbb995513,0x3bc008cb,0x3c3b62e9,0x3c36f274,0x3d035d5e,0x3be5bea2,0x3c514bf9,0x3c2208b1,0x3c589fcd,0x3bb5c749,0xbb3362b3,0xbc14a1a3,0xbcad1c7d,0xbcc03940,0xbbb149ce,0xbd5663c7, +0x3d6ddde5,0x3ddba12e,0x3dcac3df,0x3dac5454,0x3cfa9047,0x3bb31711,0xbcd47b86,0xbc8d0507,0xbc6ac986,0x3b87988b,0xbc8bccb3,0xbcc40d4d,0xbcee55f2,0xbbad6245,0x3c1ec144,0x3ceaefba,0x3c0c9d95,0x3c2f6239,0x3c2af70c,0xbcca61dd,0xbb5863d7,0xbc2eae3d,0x3bd096c3,0x3c6c36ec,0x3d275c53, +0x3cc0c11d,0x3c9bccd9,0x3cbf8d1d,0x3ce2b808,0x3c4586e8,0xbc1a34b1,0xbbf9c207,0xbc9ea4f8,0xbc8f2e9b,0xbcb3ba55,0x3e6200b1,0x3deb1a30,0xbc199387,0xbd505118,0xbe202e23,0xbe3b47f9,0xbe3519f9,0xbe096cd9,0xbd31ccc0,0x3d3ef6e5,0x3e0f9a3d,0x3e25870c,0x3e2ebb72,0x3e2c7979,0x3e0ad825, +0x3df02b59,0x3dfb4d44,0x3d95a563,0x3d4e96db,0x3d05b3ea,0x39912d05,0x3c7d149d,0xbb405291,0x3c67d583,0x3c82a8c4,0x3cf69ab5,0x3c26473d,0x3c5e7bf2,0x3cfd42e6,0x3cfd5d6b,0x3d5c5940,0x3d99a83d,0x3d36af6d,0x3d663619,0x3db488b6,0x3e2c55d5,0x3d958a90,0x3bcfc9e5,0xbbb2625c,0x3d11d209, +0xbc44276c,0x3e01d2d0,0x3e09681a,0x3dc8f569,0x3d63efe0,0xbb344b59,0xbdae846a,0xbdd0b4f9,0xbdcd49bf,0xbde2104f,0xbd8ecacc,0xbd8fba69,0xbdc21320,0xbcdb0076,0x3c8e196b,0x3cbf7cd8,0x3d328f75,0x3d1c5abd,0x3cd69cda,0x3cd95abe,0x3cc59efb,0x3d5568ca,0x3d0db696,0x3cf55a11,0x3c53af9d, +0x3d48a3c2,0x3d46d360,0x3d2cdae7,0x3d8a9289,0x3d9ccc87,0x3da78271,0x3d3a82e8,0x3d10f584,0x3cc73849,0xbcb4b0a2,0xbbdc9bdd,0xbc74c762,0x3cd54dab,0x3d8ec79c,0x3e01c22f,0x3d95f859,0x3d23ddb2,0xbc80670c,0xbd4f5b1b,0xbdb69fd8,0xbe0d91e6,0xbdf0bad2,0xbdbb8aa6,0xbd480687,0xbd2b6176, +0xbd0d1048,0xbb2893c9,0x3b603783,0x3c3a7541,0x3caed737,0x3c605cca,0x3cfc9aa7,0x3dd586b4,0x39099d7d,0xbc9bc339,0x3c177a3d,0x3cd725c8,0x3d3c7aae,0x3dc98980,0x3d430c7a,0x3c2d1072,0x3d6e251e,0x3cf56186,0x3d49ad15,0xbbd6d8b5,0xbd3d1134,0xbd08be73,0xbdee8752,0xbd837e37,0xbd893bf8, +0xbda7e4e2,0xbda4443b,0xbdbbdf06,0xbdfc08e0,0xbd4dd512,0xbc3db7ea,0xbc13064a,0x3c66de43,0x3c5d2015,0xb8a73ef3,0xbb1880b2,0xbbd2c8f8,0x3bdb65bf,0x3ceb6187,0x3c61ecc7,0x398845ae,0x3c6d103b,0x3cd79871,0x3d91ee3a,0x3cd38274,0x3c741b5d,0x3cf91f49,0x3b035cad,0x3c57d05c,0x3d510723, +0x3d048606,0x3c97bcac,0x3cb1a707,0x3c8e5987,0x3c61dd9d,0xbc9ba9a9,0x3b81e74f,0xbb250745,0xbdabce56,0xbd0405f6,0xbcdd69a6,0xbd41713b,0xbd0c1529,0xbd1b6e69,0xbd4a4f41,0xbd3d5f51,0xbcd17722,0x3cd6d442,0x3c7088ff,0x3c172c10,0xbc7584c5,0xbcb2d8cb,0xbc596a8c,0xbbbcb354,0x3c47ffba, +0x3c46b521,0x3c8f6fd4,0x3ca8305c,0x3c48fccd,0x3c50ebe6,0x3c540706,0x3c386f11,0x3cc0709a,0x3c94b6dc,0x3c9b8444,0x3cc1fe5f,0x3c5d899b,0x3c917a9e,0x3ca3e5d6,0x3c63444e,0x3d0366f4,0x3c94104c,0xbcd63039,0xbd4bf883,0xbd3beaa1,0xbce93c33,0xbcc54bcf,0xbd0be6d6,0x3be9a761,0x3d043527, +0x3d45facc,0x3d02d082,0x3cc9da58,0x3d0c260a,0x3cef1e44,0x3cc2f714,0xbbe90e1c,0xbc5b17a0,0xbc652c27,0xbacf765a,0x3a94577d,0x3b6d8c9d,0x3b56ac06,0x3bf0569d,0x3c81a261,0x3cc1c7af,0x3ce0891e,0x3cf0ed62,0x3c8787bc,0x3d01becc,0x3d11cf22,0x3d0fe0b9,0x3ce9f022,0x3cda82bd,0x3cf43cea, +0x3d050e82,0xbc4deb1f,0xbbf895a3,0x3b6bfccd,0x3c292264,0x3c7fcca4,0x3bafbc7c,0xb9b2e704,0xbc4a13a5,0xbbb4df44,0xbb00ece2,0x3baf7c4e,0x3c6a85cf,0x3cc78737,0x3d0234e8,0x3cb0e406,0x3c5343d7,0x3b898fde,0x3ba1bc22,0xb99cd894,0xbb8af00c,0x3bf79b66,0x3c91911c,0x3cf15f78,0x3ce17ede, +0x3ce32722,0x3cd660eb,0x3cbb199c,0x3c4be21e,0x3c468c07,0x3bf9b176,0x3bc30280,0x3b775a1d,0x3b919464,0x3b7f1b1b,0x3b101b07,0xba53afce,0x3bd9ae4c,0x3bf0e8ea,0x3b46146b,0xbbb887f7,0xbc1b37ce,0xbc617beb,0xbc8f75a1,0xbcb225f7,0xbc9e96c5,0xbc8e0c1d,0xbc767fb3,0xbc5e3e0c,0xbc603b6c, +0xbc3d40de,0xbc3d715f,0xbc1c09e3,0xbc0af68a,0xbc149413,0xbc100449,0xbc090f0d,0x3c9c4d39,0x3c1a93cd,0x3c44e8a9,0x3c675f81,0x3cad3a43,0x3c966313,0x3c9ce4ee,0x3ca43081,0x3cc00f92,0x3cbcfa00,0x3ce45f8f,0x3cdc1dc9,0x3ccfb79a,0x3c9b9178,0x3c6427ba,0x3c743a8c,0xbba98473,0x3bd4a628, +0x3b5340aa,0x3b0d6d8b,0x39b142f7,0xba97a4d6,0xbb2352a2,0xbb9f31a1,0xbb8a26cc,0xbb93ad84,0xbb9d924d,0xbb9cc293,0xbb836d94,0xbb4557ce,0xbb2597f4,0xbb1f3e85,0xbb05c8bf,0xbac344ac,0x395e6821,0xbb3447c9,0xbb17a6da,0xba60ccfa,0x3c68eac6,0xbb4919ff,0xbac00d9a,0x3c6690f8,0x3c53cb6f, +0x3c326f34,0x3c0a3e8a,0x3bdb93cc,0x3b803513,0x3b4890e2,0xbb28bcc5,0xb9971d70,0x3b2465ed,0xbbbdb397,0x3b955bc2,0xb9a005eb,0x3b21f4d9,0xbc3de769,0xbb7fce32,0xbb832ba2,0xbb1a616e,0x3a95f2b0,0x3af5583b,0x397a6196,0x3b24cdfd,0x3b12adc1,0x3a08f51b,0xba7a6764,0xbb0ddb05,0xbb87256b, +0xbb0e1d2b,0xbacbb235,0xba8c4795,0x38d7e393,0x3a923f6b,0xbb0aa8f7,0x3bbf224c,0x3c0e7919,0x3c427e22,0x3b9ec4c5,0x3c1d4c2f,0x3c776aa4,0x3c4216bb,0x3c337f54,0x3c301916,0x3c2f4d0a,0x3c2a2c06,0x3c30e8d1,0x3c23f2f3,0x3b191887,0x3c7dff3e,0x3c26390c,0x3cf682c9,0xbcaf0a6b,0xbcfb445a, +0xbd04b3f1,0xbcfd82b8,0xbc8167a6,0xbba7d270,0xbb966ac8,0x3b49014a,0x3b956a3b,0x3b2f63b1,0x3b43c86b,0xb71f9205,0xbbe25000,0xbb7e6896,0xbb0203a0,0xba1420cf,0x3b3f700f,0x3b17d510,0x3ad3d976,0x3c6d458c,0x3be68598,0x3bb70a4b,0x3c23388f,0x3c4e3bf9,0x3c6e2388,0x3c0ecdff,0x3bbec306, +0x3bcdb065,0x3b461f41,0x3b8aba35,0x3c0a642a,0x3c18090d,0x3c3f0b61,0x3c92926e,0x3bbf6194,0x3c5f68ee,0xbcf8241b,0xbd8660f2,0xbd36d493,0xbd329136,0xbc05f728,0x3b99320e,0xbb26d6b7,0x3c8605a3,0x3c571ba0,0xba0bf7dd,0xbbe3f42b,0xbc7a6bdc,0xbcd3522a,0xbc692afb,0xbc13f8c2,0xbbb416d0, +0x3b91310f,0x3ba0cb6f,0x3bdf4ce7,0x3c8efba5,0x3c629d27,0x3bde54e1,0x3c827bad,0x3cbaf2de,0x3ce348ad,0x3c9654de,0x3c331020,0x3c3e37ef,0x3c0e0f46,0x3c3fd691,0x3c75b619,0x3c90cdc9,0x3c94f2a7,0x3cd63eb8,0x3ba403dd,0x3d303957,0xbda3b2e7,0xbe2a67fb,0xbe1cf8e0,0xbe1343ed,0xbd853eb9, +0xbcd68aa5,0xbcf047fe,0x3bc180dd,0x3ca82e5b,0x3c219685,0x3c3b050f,0xba7df939,0xbcd6b941,0xbc5189ff,0xbba087d0,0x3a42e7d2,0x3c59d91e,0x3bee1271,0x3c4b1fc9,0x3cb1b778,0x3c71ef51,0x3c6fef63,0x3c8691dd,0x3cbc84cc,0x3d377e05,0x3cc5daf0,0x3c683b17,0x3bfb39ee,0x3c6883c5,0x3c47fabb, +0x3c8a4939,0x3cd660d8,0x3d33246f,0x3d27eb14,0x3ccf3433,0xbd92c31a,0xbda9fd52,0xbd843e14,0xbcd9ab97,0x3dd458b9,0x3d869955,0x3d9b38a5,0x3e1036dd,0x3d59fe11,0x3bc62bbb,0xbcfad591,0xbd6d2afc,0xbd96d24a,0xbdb3266e,0xbd89fa96,0xbd6fcbf8,0xbd625fee,0xbcbde101,0x3b91b13b,0x3d33dd2d, +0x3d1a1f4a,0x3cb35576,0x3c082d8a,0x3c9c01a0,0x3cafe001,0x3d0d0ccc,0x3c58b3ef,0x3c9b3fc0,0x3d30b253,0x3d5369e0,0x3d1d3d19,0x3abf3964,0xbc7c8d22,0xbc6d9e79,0xbcb48819,0xbd290e42,0x3c7ba4a1,0x3cbd007e,0x3ddbae21,0x3dd8fbf6,0x3da311eb,0x3d9586c4,0x3d9799a7,0x3d7e7de8,0x3c2583f7, +0xbcccd379,0xbd9bdb0a,0xbdb4ce99,0xbdbf6afa,0xbda4180d,0xbd976944,0xbd37e40b,0x3bc1f381,0xbbc9ee32,0xbbd38219,0x3c5817aa,0x3cc5d10d,0x3cfa866d,0x3ca3a2a1,0x3cba0430,0x3cc8c954,0x3d5a4461,0x3cd6187d,0x3cadaed7,0x3c50c2bc,0x3d3d930e,0x3d448beb,0x3d2cb2cb,0x3d76bfdd,0x3d3deac2, +0x3ca2ae1d,0x3d09f145,0xbce1a57f,0xbc788535,0x3d3884c9,0xbcb626c7,0xbdf3d6f4,0xbdef8f0e,0xbdd0fb11,0xbd3303d0,0xbbca06e9,0x3ce9d8b8,0x3d3c2af0,0x3d9b6aa7,0x3d9e3444,0x3d713229,0x3cabea37,0xbc80038c,0xbd59ed9c,0xbcf8a67e,0xbc5fa9cd,0xbcc47c30,0xbc8775a8,0xbc39b0fa,0x3bd7d300, +0x3c3f8ce1,0x3cdb4a27,0x3dc10bb8,0x3c8724f1,0xbc1b4f63,0x3a972a70,0x3ba980c8,0x3cb8da29,0x3da0ee17,0xbb4a589a,0xbcb9b6d2,0xbd0ef9a8,0xbcc4bc06,0xbcb6678f,0x3bef579a,0x3c9d6a9c,0xbb9f0ed0,0xbc304114,0xbd7af516,0xbd9fdb8f,0xbd708bb4,0xbd98f6c8,0xbd2a044a,0x3cb7b06c,0x3d57990e, +0x3da2c7ee,0x3dcc8bf5,0x3db97fed,0x3d994e86,0x3d394d33,0x3d8eb86e,0x3d884b24,0x3cc56fb0,0x3ba57099,0x3bd90488,0x3b6f54b3,0x3c09ce5c,0x3c8ffca3,0x3d6d0bd8,0x3c877092,0x3bb8589f,0x3d0c6b5a,0x3c227546,0x3c1ed61e,0x3d0eb9a1,0x3c22af9d,0x3c1c1560,0xba18f7ca,0xbb8273b7,0x3ab4427a, +0x3b9549a5,0xbbf8412c,0xbcae9686,0xbd68aff7,0xbd8720bd,0xbd30ecfa,0x3c9904ac,0x3cdaf406,0x3cc3ba86,0x3c0f213e,0x3b99ef25,0x3b41ef56,0xbb2dd067,0x3c8efe79,0x3cf9918d,0x3d201714,0x3d0683c7,0x3c93e37a,0x3c44277c,0xbb7a8ffe,0x3bcfa5a3,0x3c543d7d,0x3c67f3fa,0x3c94e276,0x3c9c78ea, +0x3c9da636,0x3c6ec21a,0x3b7c54b0,0x3be83700,0x3c5b46d9,0x3cbcbe3d,0x3c4b33c3,0x3bde423d,0x3c09a5c4,0x3bf9db2d,0x3c097ef1,0x3c9f60e5,0x3c253b46,0xbb743105,0xbcedc3b8,0x3c2edcef,0x3c68ca0a,0x3b0d75db,0xbcc80114,0xbcc1fd38,0xba227798,0x3c392cc9,0x3bd5df0c,0xbc92a7e1,0xbc8cdd90, +0xbc1d02c5,0x3a6330db,0x3c4c8c45,0x3cc43134,0x3cce7c71,0x3c16760d,0x3c37df3c,0x3c741ad5,0x3c997d18,0x3c8d5e77,0x3c555494,0x3c409166,0x3c576d5c,0x3c507b41,0x3c9fa9c5,0x3c9337be,0x3c4a5b48,0x3c2f391d,0x3c3209be,0x3ca900e0,0x3c11a598,0xbbeebd8b,0xbcb8c0e1,0xbcb4ef7a,0xbc8a6365, +0xbc6eeda4,0xbba53435,0x3b513231,0x3c99212e,0x3c0a5365,0xbbdd2a1c,0xbcda4c74,0xbca4fff5,0xbc20308a,0x3b517318,0xba07e474,0xbbffb869,0xbca2f71f,0xbca78c5c,0xbc9a4428,0xbc5e8032,0xbbb4c396,0x3a4fd3a5,0x3bcba5a9,0x3c380f58,0x3c82ce95,0x3c917615,0x3c87460a,0x3c4152dc,0x3c1af15d, +0x3c239386,0x3c518c39,0x3c6fff84,0x3c74251f,0x3c3cf1e3,0x3c589b98,0x3ad0ba19,0x3cce9622,0x3cb5de25,0x3ca8ef15,0x3ca29a28,0x3c8d66f9,0x3c832bb0,0x3c714ee6,0x3c70348f,0x3c3c3cd4,0x3c6278b1,0x3c6225d1,0x3c5916da,0x3c0b1164,0x3bafcc29,0x3b4e4124,0x3b87a488,0x3bcf9dbc,0x3c1b3528, +0x3c3d4a38,0x3c1f500f,0xbbadfe9f,0x3bfd37d3,0x3c19eea5,0x3c22dc42,0x3c464c61,0x3c977cc5,0x3c885a89,0x3c93e296,0x3c9d2ea7,0x3c94748c,0x3c5bee31,0x3ca31f7e,0x3c6ee8ff,0x3c9cd394,0x3cb4d150,0x3c9c21f4,0x3cde557d,0x3cbbaf20,0x3cbaefbc,0x3cbcc950,0x3cc19969,0x3cc4999b,0x3cc32ca1, +0x3cc34cf4,0x3cb6c2b3,0x3ca44ba9,0x3c964f95,0x3c81b486,0x3c699eeb,0x3c414c1e,0x3c7a77f9,0x3c8dac28,0x3c979d32,0x3c991e1f,0x3c9a662a,0x3cbc36dd,0x3ca40013,0x3c8bd0fa,0x3bab2dc1,0x3cd7319d,0x3cb67e9b,0x3c59942e,0x3c72d087,0x3c85692a,0x3c88a29e,0x3c997f05,0x3ca8b2d4,0x3ca0eeca, +0x3cbc1bff,0x3ccb3e86,0x3c753c78,0x3cccbfc4,0x3d05a5e0,0xbc04be1a,0xbc5136da,0xbc1e2a5b,0xbc2d44f2,0xbc36ebad,0xbc42ebf7,0xbc4fc79f,0xbc47f9bf,0xbc2ffd9a,0xbc3c34c8,0xbc3fb4d4,0xbc4c4e99,0xbc335306,0xbc27ef0c,0xbc0ab513,0xbc141023,0xbc0d4f85,0xbc0f6729,0xbbf488fb,0xbbdeaefc, +0xbc05df50,0xbbc8adf9,0xbb88831a,0xbae8882d,0xbb5d8bbb,0xbaaa8e13,0x3b1c1339,0x3ab555f2,0x39a81caf,0xba8648d3,0xba5af84a,0xb930d997,0x3abb4112,0xbb78b867,0xbbd48d8d,0xbb8d4e18,0xbc369dca,0xbd123d1c,0xbcca7a24,0xbc412a13,0xbbe6c9d2,0xbb882557,0xbbcd7bf2,0xbc4d507a,0xbc46d579, +0xbc8236b0,0xbc854189,0xbc93963d,0xbc569882,0xbc0b483e,0xbb70392f,0xbba26daf,0xbbb6757c,0xbc0388c0,0xbb8b52f5,0xbb91d3f1,0xbc09b4f5,0xbb85081c,0xbbb0cb6f,0xbbc7f332,0x3b45c36d,0x3bb9fe09,0x3b6ca148,0x3b133101,0x3a344de9,0x3979a86a,0xba447e37,0xbabb9373,0x3af1941e,0xbb6b1e9c, +0xbc083fb1,0xbc82b6c1,0xbcb0d430,0xbd85d2b0,0xbd4e6a69,0xbccbf7a6,0xbd17fab3,0xbd0d86b6,0xbce3c88f,0xbd058d09,0xbceb5a97,0xbd1ede4e,0xbd31a74e,0xbd303ae5,0xbd10be55,0xbce5487b,0xbc897e23,0xbc990292,0xbc883ca0,0xbc7a18ed,0xbc0ad991,0xbb91e05e,0xbc071850,0xbbbcc264,0xba7007ea, +0xbbbe8f12,0x3c5db99a,0x3c9a03b1,0x3c650f25,0x3c7df193,0x3c3dd15e,0x3c0b98d4,0x3c0a8b7e,0x3c00982f,0x3c2805ba,0x3b5e4e5f,0xbc008b06,0xbcdf67d9,0xbd3397f4,0xbe0a9442,0xbdcf8854,0xbcfe15d8,0xbcc33954,0x3aa1a47d,0x3c7ce312,0xbc445aa1,0xbc8edeee,0xbd1ed999,0xbd34cbf2,0xbd4bd6de, +0xbd0c3808,0xbca0eb23,0xbb622bb9,0xbc16dcf9,0xbc0577af,0xbc1ed543,0x3b5a9432,0x3a9a5cac,0xbc2c951c,0x375e0665,0xbb6275be,0xbbb51ec0,0x3c8c825f,0x3cf2b7b5,0x3d0bb44c,0x3cc94149,0x3c840706,0x3c83937a,0x3ca5cea0,0x3c81431a,0x3c1027de,0xba4c3160,0xbcf1857f,0xbd499b2a,0xbdadd4a4, +0xbcb8f84f,0x3d5d29ec,0x3dc206bc,0x3ca93682,0xbdfcce2e,0xbe31473e,0xbe3d9f9a,0xbdf7236f,0xbe131ef1,0xbe284a29,0xbe3da5aa,0xbe263ab0,0xbe06a169,0xbdce9666,0xbd6747ac,0xbd47978b,0xbdabafae,0xbd3a9276,0xbcfe949f,0xbc2de858,0x3b0379cc,0xbb9d0694,0x3c242398,0x3c3f2d6f,0x3c7cbd17, +0x3d0903da,0x3cbe4d5e,0x3cae486d,0x3cc452ac,0x3c85bcfe,0x3c4e405e,0x3c2507e0,0xbb322265,0xbcdea12e,0xbcdc4bf2,0xbd50f933,0x3ddb193d,0x3e08a457,0x3e1eab2f,0x3dfac341,0x3d97c72c,0xbd6225b5,0xbdcab51b,0xbcb28d2f,0xbd044795,0x3c30271b,0x3d761a9e,0x3d830fd3,0x3d7c3054,0x3d721087, +0x3d7143e7,0x3d5ca7a4,0x3d038e24,0x3c077929,0xbc9e7631,0xbc4660ba,0xbc57f129,0xbc600b0a,0xbc118ee0,0x3be3f786,0x3c813dd3,0x3d283656,0x3c7a2cfe,0x3c1f3df3,0x3c8bed5c,0x3cf83f95,0x3cf531b0,0x3d3741c4,0x3d0c9788,0x3d62904b,0x3dacb153,0x3dd11a61,0x3d30f8c8,0x3d1c2792,0x3d30b477, +0x3d58791a,0x3d355e3d,0x3d13f53b,0x3cc8a800,0x3d881695,0x3d06f9d8,0x3bc2e281,0xbd514ceb,0xbd8723fd,0xbd7ee97d,0xbd34fb43,0xbc52e8ab,0xbbfc1e26,0xbcdf509f,0xbc634811,0xbb240fb1,0xbb6e468e,0x3c0d014e,0x3c63b0fb,0x3c9aac9d,0x3c53f7e3,0x3cb297a6,0x3d8b0ec0,0x3cce8278,0x3b672e0f, +0x3c3e026a,0x3b8da210,0x3cb75b27,0x3d95989c,0x3d0a7170,0x3d10813f,0x3c15fb52,0x3c8c6b5f,0x3cecfcaa,0x3bab2e3c,0x3c9256fa,0x3d1e329e,0x3d49a4ab,0xbb4e046e,0xbc6a2861,0x3cbfc240,0x3cee1d8b,0x3d1e71bb,0x3cfd6eaa,0x3cbe07f6,0x3bb098fa,0xbc8ecd3c,0xbc7a3a86,0xbbaccb1c,0x3bced4fb, +0x3c51ddd7,0x3c4fe4c3,0x3cb14e18,0x3cfaf09f,0x3cd001cf,0x3d0e98c0,0x3d2929ec,0x3d14190b,0x3d2daa75,0x3be5442c,0xbb817467,0x3cb11f74,0x3bf63592,0x3c7b82ba,0x3d075cbd,0x3cc1831f,0x3cf29870,0x3c959c7c,0x3ccd01fd,0x3b532340,0x3c227cec,0xb938bf46,0xbb7aeb18,0x3d15e1fc,0x3b60b53f, +0xbb31a0fb,0x3c0ea413,0x37a1cb6d,0x3be039e0,0x3cb6dafa,0x3c0da68d,0xbbaf7838,0xbc86a8c9,0xbbfed912,0xbc4d8f59,0xbcf27a02,0x3c1dc5a9,0x3c223f47,0xb8a0fad6,0x3c63ebf2,0x3b78010f,0x3ab6e03e,0x3c4f3bf8,0x3c8a4552,0x3cabfc27,0x3ccae6ef,0x3c92d21a,0x3c021763,0x3c530fe7,0x3ca1fab7, +0x3ceaeea4,0x3ca4c1c2,0x3c6d0433,0x3c164bfa,0x3b0494f3,0x3cb8cd2c,0x3be02211,0x3cba6dd2,0x3c81b1e9,0xbc5cc88c,0xbcf05ca1,0xbcb88403,0x3c86dd53,0x3bd4ec3f,0x3b646e8c,0xbb713bcd,0x3c1945eb,0x3c873d59,0x3cae13f9,0xbbcfe94f,0xbc71e5ae,0xba2fa763,0x3be44e05,0x3bc4363d,0x3be6b09b, +0x3c556afa,0x3bbf6ccb,0x3c1dda4d,0x3c7749e1,0x3c86fce7,0x3c162d5e,0x3bef4b91,0x3c1beaf7,0x3c3988dc,0x3b5b4499,0x3b3c7184,0x3c9dfd88,0x3c24748e,0x3c501f2d,0x3c7a8872,0x3cc0a80e,0x3c77ffab,0x3cd26dcf,0x3c60025f,0xbbf67746,0xbcbbf4a9,0xbc0e233a,0xb8a629e5,0x3c3865b4,0x3c090df7, +0x3c57bf4c,0x3c7fdd28,0x3bb5477a,0xbbeaaffa,0xbc8380fa,0xbc4b55fd,0xbc080281,0xbb346259,0xbab90d5e,0x3b82802b,0x3b3b2a59,0xbb475540,0x3b3a1571,0x3b1ea566,0x3b2b0756,0x3c06b8f0,0x3c1d60d9,0x3c543497,0x3bd1312e,0x3c2c7968,0x3c9b126b,0x3ce9d376,0x3d106187,0x3d0a17de,0x3d04d6fd, +0x3cf79bf6,0x3cc37798,0xbc04513a,0xbc5b230e,0xbbb9884f,0x3b5e8773,0x3c2cd648,0x3c712678,0x3c90123d,0x3caf90c8,0x3c73d826,0x3becedbb,0x3ac32bbb,0xbae1332f,0xbb05ad39,0xbbacc328,0xba23af58,0x3a929ba0,0x3b05e3d6,0x3b1d6df2,0x3afaf320,0x3b9b7da4,0x3c6b1323,0x3b6a098a,0x39f74bbc, +0x3a8692b4,0xb9a3b8a9,0xbbcc4f17,0xbc05fb27,0xbc187f5d,0xbc14d011,0xbc6c4f32,0xbc90db15,0xbc9f48fc,0xbc94e2f5,0xbc7ad07d,0xbc725e08,0xbc61a65b,0x3b8dbd96,0x399b7e65,0x3ba561c0,0x3bcf87b5,0x3c09c77c,0x3c20dcce,0x3c3fd8e1,0x3c76463e,0x3c5b5e78,0x3c5edc7a,0x3c5366b5,0x3c3f9fb1, +0x3c21d587,0x3c00f77d,0x3bd43db1,0x3ba96723,0x3b9c4668,0x3b9d5c73,0x3ba529f8,0x3b214780,0x3be8ef17,0x3c3a0be3,0x3cc5f6a0,0x3b5b3a81,0x3c1465ef,0x3cb915dd,0x3cadb3e3,0x3c9f4ad5,0x3c8e1ed6,0x3c8613ae,0x3c7b8555,0x3c59e4ae,0x3b9b9863,0xba4f9bd9,0x3c95b147,0x3be4c1c2,0x3c037cb1, +0xbc4ffbbf,0xbbdadc9f,0xbc071122,0xbc3049a8,0xbc3fa5f0,0xbc7bc8fc,0xbc919d7d,0xbca11743,0xbcc26c0c,0xbc834106,0xbc6e7f73,0xbc93b042,0xbc673859,0xbc515603,0xbc3ccc34,0xbc479efe,0xbc3f638c,0xbc27f1fe,0xbc30cbb7,0xbc2d3d79,0xbc22f68f,0xbc0c4e82,0xbbece377,0xbbaba7fb,0xbbc858d0, +0xbba46349,0xbb837911,0xbb68a651,0xbb6ef2e6,0xbb7de46d,0xbb8ac4a5,0xbb9a081e,0xbb7b9140,0xbbc5e3f6,0xbbc2132e,0xbbf6aec7,0xbbfe6e24,0xbc04f047,0x3bcf248e,0xba4a5f2e,0xbc14d817,0xbcd42f51,0xbd2a582d,0xbd3efd37,0xbd57ee02,0xbcf33aaf,0xbcc22a06,0xbd0b2320,0xbcd65a1d,0xbcc2880c, +0xbc92aa01,0xbc971e4b,0xbc85a0b9,0xbc3dae67,0xbc40f13f,0xbc27345b,0xbbdca0a3,0xbbff6d87,0xbbf93b87,0xbb9c9019,0xb933426c,0x3aecf536,0xbb0e1481,0xbab290c0,0xbb2304bf,0xba8763a6,0xbbb783de,0xbb8ba7e5,0x3ac6af16,0x3b77c593,0x3bab678c,0x3b4ca56d,0xbb0b0bac,0x3bbf82c6,0x3c93902b, +0x3ca77722,0x3c1deed8,0xbc5474db,0xbd6d08f6,0xbd893eb2,0xbdaf1888,0xbd13864a,0xbcad626e,0xbd298f17,0xbca9335f,0xbc805336,0xbc037d0d,0xbc557042,0xbc2d8231,0xbadf95af,0xbbdcce95,0xbbce3aa2,0xb911c9be,0xbbb44c15,0xbb2cb35b,0x3b9b9265,0x3c4c321f,0x3c68e32e,0x3bec086f,0x3c3c38dc, +0x3c0459d6,0x3c3bb1fe,0x3b446c37,0x3bad0de3,0x3c538196,0x3c390a21,0x3c0373fe,0x3c339ca1,0x3c054080,0x3d047029,0x3d9e006a,0x3da5a7aa,0x3d691545,0xbc8d0c25,0xbdd61164,0xbe045add,0xbe1580e6,0xbd82c0eb,0xbd0d15bf,0xbd80fc56,0xbd29e32c,0xbd0bbafe,0xbc8095f8,0xbcbc4a05,0xbc91ad65, +0xbacef162,0xbc185fcd,0xbb778f7c,0x3b9b4115,0xbbd108f0,0xb79c37f1,0x3b2542cd,0x3cc3fc8f,0x3cf2bd77,0x3ce88fa1,0x3cc1b6b0,0x3c8eead3,0x3cb1dbbc,0x3c53b0eb,0x3c410b99,0x3ce1f03b,0x3d0fa99e,0x3d0b33f0,0x3d33580c,0x3d14b2d7,0x3cc54d7a,0xbcbe0a8e,0xbd99e94a,0xbda1c2ed,0xbd6e32a0, +0xbd4e78e9,0xbcaca4f8,0xbca76f5b,0xbcd1377e,0xbc9b3798,0xbd08cb60,0xbc0be1f9,0xb98eee58,0x3caffb8a,0x3c45fad9,0x3ca4b3b9,0x3cf83bf8,0x3cf3ce93,0x3cb61693,0xbbe4628b,0xbc8b5d11,0xbb2aceb8,0x3be9bc07,0x3c93e695,0x3ca29cba,0x3cc586c4,0x3ced01b6,0x3cdc713a,0x3c8e49a6,0x3d137274, +0x3d1658f8,0x3c2dd632,0x3b0d3258,0x3b825073,0xba486b1e,0x3c84a8a0,0x3dc9bdb0,0x3d7e3808,0x3cde2fe4,0x3d57aaba,0x3dff91b6,0xbca80a9f,0xbdc2555f,0xbdb852d0,0xbd87dbb4,0xbd997a8f,0xbe076415,0xbdd234ba,0xbd960bcd,0xbd369e16,0xbcdcd031,0xbcd8bebd,0xbd2fa9ad,0xbc94a5d5,0xbc893822, +0xbd14c4b2,0xbce95179,0xbcac7a1e,0xbc66ab4a,0x3c06b752,0x3c745156,0x3ccd6d80,0x3ca0fe82,0x3c226fd7,0x3b78c10c,0x3c78f2f7,0x3cd322ef,0x3d800047,0x3d062496,0x3d0b1950,0x3d92c6e6,0x3d92f07a,0xbd3485eb,0xbd3e8c69,0xbd0ba7b5,0xbc09ea47,0x3d08dd1c,0x3cb4137e,0x3d9a30a1,0x3dacc3a5, +0x3db2648f,0x3d45172a,0xb92d8c14,0xbd15c9e8,0xbd9e0b9a,0xbdcda7d0,0xbdf30969,0xbdd91eb2,0xbd897d5c,0xbd8747d3,0xbd58bee6,0xbc4724d3,0xba487ae3,0x3ba52e5c,0xbbf70e12,0x3cfd0f25,0x3d17c570,0x3ce3138e,0x3c86d425,0x3a92ede6,0x3c869957,0xbb8f8639,0x3c7a8548,0x3d872203,0x3d7c3096, +0x3d1607b1,0xbbb5a736,0xbd0436b2,0xbbb7e43e,0x3b396b68,0xba839f98,0xbc744bd4,0xbcad9ce0,0xbc122f9b,0x3c806e80,0x3d44bb38,0x3dc64082,0x3e0b0624,0x3e13c610,0x3de84acc,0x3da4d021,0x3d82391f,0x3d15a3b5,0x3ca30c5b,0x3b00ecc7,0xbc5510fa,0xbca5080e,0xbc7f5b86,0xbbc29921,0xba94fa87, +0x3b1e3d5d,0x3cef6237,0x3cd03616,0x3c79d2e2,0x3c9841ee,0x3c7260dd,0x3cce7718,0x3c8f3b2a,0x3c954666,0x3c2753db,0x3c67d54f,0x3c99c65a,0x3c9d15ca,0x3bcc2633,0x3bddb567,0x3bd6c72f,0x3bbaa79f,0x39f7f495,0xbcaa10c0,0xbd132753,0xbccf6638,0x3c8b4508,0x3c3b3e2c,0x3cc4166f,0x3d292c4c, +0x3d845675,0x3d99e351,0x3d8744ba,0x3d1cc436,0x3cce0725,0x3c726a95,0xba58bd75,0xbbd00f64,0xbcadf16b,0xbc72e43e,0xbc7aa266,0xbbdc4c52,0xbb56f5b5,0x3b6181d7,0x3c8c0b6e,0x3c45bbb8,0x3c158d2a,0x3c294925,0x3c093538,0x3c918d4c,0x3d009a67,0x3cbf61cf,0x3c6a6c57,0x3baf0588,0x3b8b6573, +0x3ad13bbe,0xbb980183,0xbc886998,0xbc4aef73,0xbac10156,0xbb345506,0x3bbfd5e2,0x3ce60461,0x3d4dd67e,0x3d5f6c19,0x3d024b20,0x3cbe4a9a,0x3ca68011,0x3ce164db,0x3d3d75a5,0x3d302b96,0x3cce4145,0x3c64f21b,0x3b6b4d8c,0xbb8dac18,0x3b21e26b,0x3c157cf9,0x3c0eccb3,0x3bd26d06,0x3c5968ae, +0x3cea801c,0x3c8e7f3c,0x3c40ee73,0x3c183913,0x3bd7ab7a,0x3bc6e384,0x3b8437a9,0x3b659833,0x3b042c2a,0xbb4ffd5c,0xba8c16e0,0x3ca53bc7,0x3c672761,0x3c132754,0x3c29d370,0x3bc6a553,0x3c834df9,0x3cb5df89,0x3ccb0a50,0x3c78648c,0x3c153fc3,0x3bde3879,0x3c2242c9,0x3c47f16e,0x3c4ab490, +0x3bbfaeb5,0x3ade94ca,0x3a5534c4,0x3c3c52fb,0x3cb876a1,0x3cdc664d,0x3c9c1885,0x3c8f045a,0x3c809e51,0x3c3b9cdf,0x3b39a8c8,0xba9a3009,0x3ada6cd1,0x3c758ce3,0x3c5c0682,0x3c8dd6aa,0x3c7d240a,0x3c8be8bb,0x3c54f7c2,0x3c689baf,0x3c4cca75,0x3c5690ee,0xbb221037,0x3bb268dd,0x3c25fa6b, +0x3c80f421,0x3ca12299,0x3cca05e2,0x3ce795bc,0x3d125cb4,0x3d13e2a6,0x3d15a8e4,0x3d0a3f15,0x3ce02fe9,0x3ca7aac1,0x3c697fce,0x3c7df09f,0x3c893f9a,0x3c80e571,0x3c5dd992,0x3c53d2cc,0x3c406a85,0xbbcf5e61,0x3ba41a9f,0x3bca6a7c,0x3be984dc,0x3bc85268,0x3c41b2cc,0x3c15c6fa,0x3b88708c, +0xbb018933,0xbb25f670,0xbbcfd7e5,0xbc33cca2,0xbc066984,0xbbf4a0ed,0xbb884c87,0xbaa08201,0x3c45a807,0x3c522920,0x3c5a174d,0x3c6e1464,0x3c846da0,0x3c8b0d17,0x3c933d30,0x3c9cdce7,0x3c901d5f,0x3c8ab803,0x3c8c5edd,0x3c97d957,0x3ca44784,0x3ca4a926,0x3ca61d81,0x3ca1f928,0x3ca4f80c, +0x3ca54407,0x3c9cb27f,0x3cb2441a,0x3c887410,0x3c525a91,0x3b0ab58a,0x3c8c391b,0x3c50c9df,0x3b2e23f9,0x3aaf711f,0x3afab9be,0x3b4ab68b,0x3b19d61e,0x3b3239c4,0x3b2c0b4f,0x3c21d728,0x3c5c6774,0x3b3069bf,0x3c227749,0x3c89cdfb,0xbc6ae618,0xbc869df5,0xbc8e4ed3,0xbc7a945a,0xbc8f32de, +0xbcaa4a43,0xbc8fce85,0xbc8ae455,0xbcac5aec,0xbc68ff7e,0xbc5689c9,0xbc770bbb,0xbc751219,0xbc6b8f03,0xbc3fe8f3,0xbc4aa72d,0xbc48cd18,0xbc4e383b,0xbc43caed,0xbc417db4,0xbc37f305,0xbc5f4438,0xbc5725c5,0xbc251b1e,0xbc3eec7a,0xbc3bbf0b,0xbc2ad5d1,0xbc24b7bb,0xbc2124e2,0xbc233774, +0xbc35c820,0xbc2fa8b1,0xbc076994,0xbc31ee48,0xbc558efc,0xbbeef82e,0xbc500e23,0xbb4fb0c8,0xbcc4902d,0xbcc8774c,0xbcdbf6de,0xbd05df46,0xbcbe330a,0xbcb08f68,0xbd060301,0xbc93ab40,0xbc72c2c2,0xbc9ac3a9,0xbc929d87,0xbc845ffe,0xbc31a47a,0xbc56f3c1,0xbc606fad,0xbc7002c3,0xbc5a29f1, +0xbc402f79,0xbc1bb249,0xbc338ff8,0xbc1405df,0xbbee9133,0xbb90a0ae,0xbb2fa0e2,0xbbaa339e,0xbb69085d,0xbbbc77da,0xbc058bcc,0xbc19563d,0xbc06a607,0xbb0e5f1d,0xbb8046d5,0xbb81ae1d,0xba879d89,0xbc29dcb6,0xbc021cb1,0xbcd17da5,0xbd22a8b5,0xbd226b54,0xbd79adb4,0xbd1068e7,0xbceaf96a, +0xbd43a327,0xbcaa914d,0xbc864f03,0xbcc7371b,0xbcc9703e,0xbcaf0745,0xbc14a9f4,0xbc1fb175,0xbbf8b365,0xbc301fe1,0xbbc1dd75,0xbbb06202,0xbb436360,0xbbdd58d8,0xbb97e100,0xba0fb36a,0x3b9ccb7e,0x3bcecc90,0x3b3a2d6a,0x3c044d20,0x3bc44eec,0x3b3c989c,0xbb0a3c61,0xbaa02f05,0x3bfa83e6, +0x3baf92bc,0x3be220a8,0x3c20fede,0xbc39c09b,0x3cb9130b,0xbd176976,0xbd847dd9,0xbd8b1201,0xbdab737d,0xbd1e5e28,0xbccbde79,0xbd6e756d,0xbce6bcbf,0xbca2de66,0xbcebe803,0xbcdd20ce,0xbc96f10b,0xbbd33810,0xbbf94196,0xbc319443,0xbc805c82,0xbc06949c,0xbaf81e1e,0x3c13fba4,0x3abe7b72, +0x3be0a5bc,0x3c3978fe,0x3ca66d2c,0x3cd828d7,0x3ce8c183,0x3cd33061,0x3c922970,0x3c6d5858,0x3bf1f51b,0x3c1e16ca,0x3cc7e2a7,0x3cfbb6fa,0x3d17ff89,0x3d193fa9,0x3c8f1966,0xbdd5ea5a,0xbd9983cc,0xbdb564f7,0xbd7d6b24,0xbcae5c3a,0xbd7ab6ab,0xbd8bb2b6,0xbd92703a,0xbcc833ff,0xbc0971ff, +0x3ba2a127,0x3bcc4cdd,0x3bbe0460,0x3b367302,0x3b76231b,0x3c920b7e,0x3d0ee9a4,0x3c8d3fd3,0x3c250575,0x3c96b829,0x3bdb74a0,0x3bc9b3ab,0x3c0ed46b,0x3cc63aca,0x3ca9e136,0x3be48ed3,0x3ce5f04f,0x3cfc7c2d,0x3c944f83,0x3d10a1c2,0x3c8c1128,0xbcba2e72,0xbc1476bd,0xbc57c28c,0xbd105e0d, +0xbdb1216d,0x3d336e55,0x3d89a7cc,0x3d6f96ec,0xbbf571c0,0xbd9a7ffa,0xbdb31015,0xbda8cda1,0xbe0f2c9d,0xbd1c33c7,0x3c7cb0d2,0x3d12f1b2,0x3c33ad7d,0xbc664d54,0xbc82b900,0xbd4d9dd0,0xbd76e6b2,0xbd7898a6,0xbcf3137a,0xbbe4a988,0xbc22fbf5,0xbbe847a2,0x3b897985,0x3beed44e,0x3cea5d62, +0x3d04579c,0x3ce38bf5,0x3c4c79e4,0x39de268f,0x3bb71f57,0x3c1e6a76,0x3cbaddc3,0x3d4b838b,0x3cbce472,0x3c806336,0x3cd4ae72,0x3d2e1f77,0xbc64f804,0x3c77f65c,0x3c90d39c,0x3d79ce75,0x3e36ee77,0x3e03e5fa,0x3dc0c456,0x3d639079,0x3d3db540,0x3d2e90f3,0x3d090db5,0x3cc6dde8,0x3c4cbbcf, +0x3a53bdca,0xbbba2706,0xbba032dc,0xbc21a823,0xbcd80147,0xbd155e91,0xbd05298a,0xbd0054f4,0xbcab9871,0xbca92d38,0x3d039268,0x3cef4006,0xbca029be,0x3b8f8fc3,0xbb844bc1,0xb994d8ab,0xbc5939c7,0x3bc28401,0x3d1f6e11,0x3d39c052,0x3d5231a9,0xbb12c90d,0xbb7b6597,0x3cac23ba,0x3c50dae5, +0x3a7f8bf3,0x3a7a259d,0x3d1a27b4,0xbbf0fb87,0x3be62dc6,0x3d5fcf7b,0x3db13300,0x3db0ddc5,0x3d22b3c4,0x3d3a730c,0x3d1cb41d,0x3cc9032b,0xbc23fdb7,0xbcaef939,0xbc21bc39,0xbbd17e7f,0xbbb6586b,0xbc37fdbd,0xbca585ac,0xbc561574,0xbc855027,0x3cd99d08,0x3cf0f844,0xba06b1c9,0x3caabb77, +0x3c9dd12a,0x3cd04d68,0x3d093575,0x3d084296,0x3c1bb732,0x3bf70371,0x3c07e3a9,0x3b98dcd3,0x3ca09863,0x3b64406c,0x3bfc083c,0x3d066384,0x3d14cf33,0x3cea7842,0x3aa2cfee,0x3bba3a3a,0x3cbefe93,0x3d127d37,0x3d083acf,0x3b6ba762,0x3c6cf30d,0x3c846eff,0x3d2b5f82,0x3cd2b6d2,0x3cb60046, +0x3c8bbcec,0xbc44b95a,0xbc877995,0xbb2e0707,0xbab251fe,0x3c107ff8,0x3bdcc1f9,0x3b893d68,0x3b996bc6,0x3c07f6c6,0x3af80e59,0x3a2fed09,0x3c2d8b18,0x3bca953e,0x3c3f85ad,0x3c8f57a5,0x3cfd30e4,0x3cf7a5e8,0x3c6bc73d,0x3c0a6adc,0x3c2bac7d,0x3cc42f10,0x3cde5138,0x3c53df94,0x3b8fc6f1, +0xbcc03c19,0xbce3c38e,0xbc914d09,0xbb681413,0xba29aa99,0xbc4daa00,0xbc447f64,0xbc30ef5d,0xbc044d92,0xbbd33844,0xbbf313db,0xbc73d80d,0xba3fb111,0x3ba75445,0x3b6e708b,0x3b816941,0x3ae5405a,0x3b20f488,0x3b825e44,0x3bc2dcdb,0x3c837280,0x3c805424,0x3c328862,0xbb660dbf,0x3b95ce7c, +0x3bc3b809,0x3baed92e,0x3b12f789,0x3afd6f51,0xb77973bd,0x3c462173,0x3a823726,0x3b59d3b9,0xba9e3b41,0xbbe128ae,0xbbd03de1,0xbc256dc1,0xbc61a110,0xbcafc29e,0xbc23c443,0x3a47bdc4,0x3c5b800b,0x3ab474b9,0xbc31c7af,0xbcd19d73,0xbc3b76ed,0x3b13eb8a,0x3c42665a,0x3c3a6b82,0x3bcc18a8, +0x3c6adcaa,0x3c9d3b7d,0x3c5f36a3,0x3c2650a2,0x3c031d39,0x3c109f8d,0x3b9a5a24,0x3c56c74a,0x3c651175,0x3ccb03f8,0x3c7df196,0x3c3b95e6,0x3bb7c061,0x3c03ec57,0x3c16e201,0x3c35639c,0x3c0279f2,0x3b61aec3,0xbba74700,0xbb8216d5,0xbb8b0d0f,0xbbcad524,0xbbedf4d6,0xbbee3116,0xbc12adea, +0xbae7baf8,0x3b2c7975,0x3c281742,0x3c9a12dc,0x3cf9de3a,0x3d24fe14,0x3d122586,0x3cf09fab,0x3cd8b403,0x3cce6b42,0x3cc1be79,0x3cb08cf0,0x3cf9373c,0x3c84cd41,0x3c61ccf9,0x3c58a1e4,0x3c3c38a4,0x3ae0d3a8,0x3999eaed,0xb9746a0c,0x3b048004,0xba9416e3,0x3b1d0c67,0xba045b8c,0x3b43d563, +0x3aab26c5,0xbb210b7c,0xbb6b6862,0xbb47dcb2,0xbc70f83d,0xbc5539fb,0xbc61d38b,0xbc60e67e,0xbc6658f6,0xbc6d7b3d,0xbc811d74,0xbc5d1b26,0xbc44e68a,0xbc396783,0xbc215930,0xbc186c17,0xbbd01355,0xbbf94bfc,0xbbdf1346,0xbbf2200c,0xbc01ad8c,0xbc01f1b5,0xbc3da91a,0x3b174fee,0x3c2100fc, +0x3cc2cd54,0xbbc580a6,0x3ba9b3d4,0x3ca726ed,0x3ca001b9,0x3c8fa7a3,0x3c74fbc8,0x3c723d87,0x3c56a89b,0x3c58def8,0x3bb1479b,0xbbbc20d8,0x3c886c40,0x3b98d647,0xbcac16ed,0x3aae1f10,0xbc0ba7e3,0xba5af020,0xbb2c933a,0xba925677,0xbaba6f37,0xb9c96934,0xb9c9284f,0x3a53a26e,0xb86bfe2d, +0x3a667c55,0x3b87c6c5,0x3abd8ac8,0x3ac5e756,0x3b6fe647,0x3b13c2c1,0x3adb5b9a,0xb963a45c,0x3b17d099,0x3b071126,0x3afcf6b0,0xbb58b180,0xbbdf4fd5,0xbc66ff59,0x392530cf,0xbbb05661,0xbc525814,0xbc43453f,0xbc4279f1,0xbc4d6398,0xbc57d051,0xbc57af97,0xbc3a6d78,0xbbc51b60,0xbaa6264d, +0xbc5c2ad2,0xbc3acd00,0xbcc25c4f,0xbb95f51b,0x39951180,0x38e50120,0xbb4fa6ef,0xbb01990f,0xbaa1ae77,0x3b95faf9,0x3ab8f4ec,0x3b237229,0x3c1ad988,0x3a9ecb1c,0x3a841f9a,0x3be5944b,0x3b9b45fe,0x3b96d434,0x3994f04a,0x3be70b27,0x3bd1979f,0x3a8f11a6,0xbbbdbcfe,0xba20f04c,0x3b14010f, +0x3b7ed188,0x3b5980d3,0x3b1609d0,0x3ba27b72,0x3b757df9,0xbad8128f,0x3a548e44,0x3b1e6bcb,0x3b330598,0x3993cdf1,0xbb869152,0xbb8f5eea,0xbc36cfdc,0xbd2bf333,0xbd0b692b,0xbcc11136,0xbcaeee96,0xbc9b9950,0xbb68b481,0xbc070917,0x3abe4fdb,0xbc30aa45,0xbbae3405,0x3c3c640c,0xbb3162c1, +0xbb712671,0x3bfd4368,0x3ac7b043,0x3a606af5,0xbc111438,0x3bf014b8,0x3c0062e6,0xbadc61d1,0xb98d071d,0xba18fc5f,0x3b3cae8d,0x3c147264,0x3c096c0b,0x3ab8c9c3,0x3c0a3bf0,0x3c0fcef6,0xb7f1440c,0x3a103b77,0xbabad29c,0x3bc6c61b,0x39c452f8,0xbba90624,0xbc273315,0xbcf614b1,0xbd960a95, +0xbd27b33a,0xbc88a478,0xbcc10bf2,0xbcc96241,0xbbec3997,0xbb4d0417,0x3c86d386,0xbb759aaf,0xbb6df43a,0x3c8b6fa5,0xbc008ada,0xbc008a8c,0x3c13c49b,0x3bb84da3,0x3baa91a6,0xbc01bdd4,0x3c978bbe,0x3c9137d9,0x3b858aa6,0x3c19c279,0x3bcbc444,0x3c365cff,0x3ca7b049,0x3cd75d3e,0x3c974627, +0x3cddacad,0x3ca4b64a,0x3c4278c5,0x3c16d966,0x3bff72a9,0x3c704239,0x3be09d33,0xbc04cf23,0xbc4c9804,0xbd4edb9e,0xbd88c012,0xbcb94f70,0xbd0ba73a,0xbd0984df,0x3bec20bc,0xbae34590,0xbc976612,0xbd4c6500,0xbce991ca,0xbc91c79e,0x3ba1b82a,0xbca5374a,0xbd1446d2,0xbd20a8a0,0xbd248990, +0xbd154b2a,0xbd0dc5ee,0xbcf81420,0xbcf919ec,0xbc8e1908,0xba9f0a80,0xbbe24bc0,0xbbb6bed5,0x3c52f28a,0x3c76abd7,0xba9ae143,0x3cb2b774,0x3cd29be6,0x3bcffac8,0x3ca0f131,0x3bda862e,0xbc4b6be7,0xbb93098e,0xbc887355,0xbd1c0c8e,0xbd89f1df,0x3d7bc8a0,0x3d25f014,0xbae165a1,0xbcb1fb27, +0xbd52703f,0xbd112e75,0xbd241346,0xbd9baf12,0xbcab0d09,0xbc95e9df,0xbd2c4931,0xbcab9113,0xbc1db5dc,0xbb4cdae9,0xbb85a360,0x3be8696c,0x3c98f5b9,0xbb53fa56,0xbb810838,0x3c00258f,0x3a8fb4de,0x3c464cec,0x3c6df16f,0x3cc8fb5c,0x3cea7171,0x3cf50246,0x3c2bf09b,0xbbacf910,0x3bc75842, +0xbb504601,0x3c2adaed,0x3d101433,0x3c6f29d4,0x3b98f1c9,0x3a9fc7cd,0x3d130574,0xbc7e622b,0x3c9f6e18,0x3d8a2650,0x3dd7a6ca,0x3e032702,0x3de1a6f2,0x3d6749a7,0xbcab07dc,0xbc97d046,0xbcf1499d,0xbd22c592,0xbd5b045d,0xbd353df0,0xbbbc23d7,0xbb876a01,0xb97194c1,0x3a5332e4,0xbb3ea255, +0xbc182539,0xbc89dc7a,0xbc6d77ad,0xbbe25783,0xbc8072b8,0x3d19b7de,0x3cf59da8,0xbd043029,0x3b680bfd,0xb95669c5,0x38eb4265,0xbc0619ac,0x3b67a5ee,0x3c12e830,0x3d61db40,0x3d9012cc,0x3d21a2e4,0x3a9e40d4,0x3949a3bd,0x3c42e16b,0x3c993eea,0xbb482820,0xbd10410d,0xbc99e06a,0x3bae2729, +0x3c4e6e76,0x3d2f176b,0x3cf5007f,0xbbe20810,0xbcbe98c8,0xbd5b42fe,0xbd9b5908,0xbd9d6ffe,0xbd8c9c67,0xbd4692b2,0xbd363469,0xbd0765e1,0xbc56f699,0xbbad8557,0x3b9286bf,0x3bad7530,0x3d0581bf,0x3d078ec1,0x3b739653,0x3c9c286a,0x3c6b0756,0x3c4e04c2,0x3ce47f03,0x3d0bdba5,0x3c6aed39, +0x3cb996e2,0x3c8aabed,0xba8c41b8,0x3b0551d4,0x3c8e0750,0x3c086e94,0xb9b4da1c,0x3c10b9f1,0x3d08fa61,0x3cf763b8,0x3bc5fa8e,0xbd40d2eb,0xbbe863d0,0x3bdf3470,0xbb0742e3,0x3c1e9763,0x3c757b9d,0x3c706365,0x3c8ebd6c,0x3c5ba19f,0x3c63b354,0x3c021dc0,0x3bb5bbf6,0x3bdfdef4,0x3c131710, +0x3c803651,0x3c1dd721,0x3c6717aa,0x3c7b8a11,0x3c38619e,0xb92d9bec,0xbb49d382,0xb9871a03,0x3ae04964,0x3b952986,0x3b3ab3a4,0x3c904d8a,0x3cb1d608,0x3c43de2f,0x3c9af446,0x3c19f815,0x3c678fc8,0x3ccf23b4,0x3cdf603b,0x3c341fe6,0x3afca46f,0xbc101c61,0xbd09ee80,0xbc96ce15,0xbc4e4137, +0xbb3a3d91,0xbc18704c,0xbc40e69d,0xbbf84aab,0xbc8ae5ca,0xbc8ed15c,0xbc9cbadf,0xbc185f34,0xbb54e59c,0xbb05cb89,0xbb60c51b,0xbbb5b822,0x39858390,0x3ba9034a,0x3bb6a5da,0x3a317502,0x3bae0ac9,0x3bcd0aa1,0x3c3f7043,0x3c48d8c5,0x3c69c7e8,0x3c853907,0x3c830183,0x3c428442,0x3bdd1876, +0x3a7b0474,0x3c8aa3ca,0x3ca09f20,0x3c853b72,0x3c65af84,0x3c383232,0xb9e948cc,0xbc4fa5f1,0xbcd9eb15,0xbc95e5a4,0xbc5486f8,0xbba35b49,0xbb89f0a8,0xbb240374,0xba28669a,0xba714ea2,0xba563dbb,0xbac6ce41,0xbbe2e30f,0xbc64a5f9,0xbc9b2303,0xbbe183bc,0xbae66bf6,0x3bcbe15b,0x3ba88702, +0x3ba8966d,0x3bbe0314,0x3bb9b372,0x3bc6aa5b,0x3be46574,0x3bcfa072,0x3bd035fb,0x3bbcc7fc,0x3c00f3df,0x3c2ebba1,0x3c50c605,0x3c744fed,0xbae8deff,0x3bb039a4,0x38b89919,0xbbb34ab6,0xbc0f61d6,0xbc5b67ff,0xbc8196e6,0xbca81ce0,0xbc8bb738,0xbc7fc0b6,0xbc61f2c7,0xbc425266,0xbc2188ae, +0xbc09158b,0xbbd64954,0xbb986220,0xbae73f7a,0xba2c9b53,0x3ae55968,0x3b165fc1,0x3b33afbf,0xb9f6267a,0xbb82a1a1,0xbbf05e55,0xbc0198ad,0xbc0e7718,0xbb9968cd,0xbb464dfa,0xb9ca60f3,0x3b81eb39,0x3bf26148,0x3c49a8f3,0x3c18e017,0x3bf6a6b7,0x3bd4019a,0x3bea7d2a,0xbc4b01d3,0xbb56d3d0, +0xbbd6feb3,0xbbe69f21,0xbc0e40bb,0xbc1c91d2,0xbc2f519b,0xbc505a5e,0xbc3bf1ef,0xbc31d4a5,0xbc2452c5,0xbc136532,0xbc00b4dd,0xbbd109e0,0xbbd7a397,0xbbe22e69,0xbbf02ade,0xbbe737a0,0xbbd3d029,0xbbac8c59,0xbc765ecf,0xbc97866e,0xbca4906f,0xbc4f8585,0xbc9ea573,0xbcc30010,0xbcb006fc, +0xbca12950,0xbc93040f,0xbc8a07f1,0xbc81d44c,0xbc672cbf,0xbc66c8f2,0xbc041dc5,0xbc9c7201,0xbc855450,0xbc2cb66b,0xb9d576c0,0x3acda3cd,0x39e5cdb2,0x3b3fc06e,0x3b85908f,0x3b329db5,0x3a6a11b1,0xba1e3b93,0xba210654,0xbb52d1be,0xbb491933,0x39f36101,0xba1237c5,0xb9f59464,0xbb0b42be, +0xbabb0b97,0xbaca8d2c,0xbb08f1af,0xbac71653,0xbab045cb,0xbb67d871,0x3ae4dde4,0x3b8f66bb,0x3bd40b50,0x3b6ab6fc,0x3bada215,0x3b990458,0x3bccb013,0x3bc486e8,0x3b8ded8e,0x3bab1208,0x3bb21530,0x3be0327f,0x3b7830b8,0x3a383ef9,0x3b731c9c,0x3ac2cc74,0xbb33ffb5,0x3c004b70,0x3c20cb9d, +0x3c181362,0x3b533565,0xbab1bafc,0xbb96333a,0xbb763157,0xbc3ab36e,0xbc130143,0x3b6f86d0,0x3b211222,0x3a578f69,0xbbad8e8f,0xbb917d00,0xbb97f76f,0xbbb997c6,0xbb370de9,0xbb350eee,0xbbacc1c5,0x3b358de7,0x3ae148e1,0x3bc48ac6,0x3be768a0,0x3be0c798,0x3a858fa7,0x3b7b94b1,0x3b7b10a6, +0x3b23545a,0x3aad25f1,0x3af01e29,0x3bdbadf0,0x3b500ed4,0x3b23755f,0x3b0bb0e3,0xbaf8c6b9,0xbbcb7863,0x3c352dc8,0x3cf14917,0x3ce75830,0x3ca86b33,0x3c39ca1b,0x3b1814dd,0x3b9b4af5,0xbc818837,0xbc6b2556,0x3bf7700f,0x3b368dc8,0x3ba8b0e2,0xbb88d72d,0xbb7a961c,0xbbc734f3,0xbc0f4e1e, +0xbbd287f4,0xbbf2059d,0xbc37477e,0xbb4da8a2,0x3a1ef55c,0x3c21885a,0x3c35042d,0x3c32e119,0xba4d073d,0x3c122a13,0x3ba101fc,0x3b603592,0x3ac11478,0x3b77793d,0x3c569cb6,0x3ac57b37,0xbb301bb2,0xbaa9105a,0xbbb60f1d,0x3baee5bb,0x3d3343b5,0x3d644410,0x3d4a3805,0x3cdf72f2,0x3b6d8de0, +0xbb0e9498,0x3b8901da,0xbcd3df4a,0xbcb4e203,0x3cb7eb14,0x3c7f7c90,0x3c27de44,0xbbb98fe4,0xbc10f781,0xbc148061,0xbc5aece5,0xbbe8d52b,0xbc0ad318,0xbc8f642d,0xbaf361ce,0x3abd8059,0x3c434a66,0x3caac16c,0x3c9d740b,0x3b23dfa2,0x3ca9a240,0x3ca29362,0x3c154b47,0x3bd4a376,0x3bed3fea, +0x3cc5503b,0x3c25917c,0x3b522cb5,0x3c52b8e4,0x3b0f7b33,0xbc5a2a42,0xbd147cd1,0xbd82b30a,0xbd35ff66,0xbc9ca0e2,0x3ca9bcec,0x3b8e0dc8,0xbd60d57f,0xbd3500c1,0xbd33911b,0xbd0786e2,0xbcbc9cb3,0xbbe075ab,0x3bff91cf,0xba49d88c,0xbc40b093,0xbcc2f487,0xbc849808,0xbc7d73f8,0xbce622a1, +0xbcc88c00,0xbc880135,0xbc00d576,0x3b78bcb2,0x3c524197,0x3c39557c,0x3c972217,0x3c9e1d78,0x3c098d5f,0x3caf67f2,0x3c54e11e,0xbb81e174,0xbba634c1,0xbb404c14,0xbc6dbde4,0xbc2be651,0xbb83c91a,0xbbcf9199,0xbd2d4d2c,0xbd796029,0xbdcb7795,0xbd9ee1c4,0xbd867792,0xbda08a25,0xbdc96899, +0xbdc0a891,0xbcc4381f,0xbcff752e,0xbd0552a9,0xbd082999,0xbd3dffa4,0xbd04ae78,0x3c2a7f5c,0xb910f521,0xbb9d4e2e,0x3aa8799d,0xbb53f10d,0xba8f9eb3,0x3b73e927,0x3c895db6,0x3c9d1c6f,0x3c39886e,0x3c3b1cff,0x3b01c35a,0x3b7d9393,0xbb6d96d7,0x3c51eeb7,0x3d0ac308,0x3ca712f1,0x3b35421e, +0xbcbd756b,0xbc4151a9,0x3d3bbfd8,0x3d9f5d18,0x3db1dc07,0x3db8165d,0x3d86ce5d,0x3da55d0d,0x3d14765d,0xbd88817d,0xbd236df0,0xbd1cebf3,0xbd032f85,0xbccd78af,0xbca06f97,0xbc5ab8fb,0xbc4b4dd3,0xbc377310,0xbbe43caa,0xbc8b8cdd,0xbc8ee9d5,0xbc3975d2,0xbc3c8eb8,0xb89334ab,0x3bc70e19, +0x3d201506,0x3d05203c,0xbc7ecc9e,0x3c0ed4eb,0x3b8cb34d,0x3c00faf6,0x3afbe82a,0x3bdeb336,0xbc3e5a9c,0x3d3d70bf,0x3d92cbd3,0x3d7bf61d,0x3d54f253,0x3c472196,0x3b8d6b28,0x3ba99f12,0x3c89adab,0x3d0cb3a0,0x3d7309fe,0x3d6b5fda,0x3c3d349a,0x3d1082f6,0x3cb03572,0xbb4fa894,0xbd619bab, +0xbda69b6c,0xbda5d279,0xbd897ed7,0xbd5c4411,0xbd278302,0xbd11cf2f,0xbcee91d8,0xbc89d3eb,0xbb8e21ea,0x3c039a19,0x3bc94acb,0x3cd05f51,0x3cb02638,0xbc0c29ef,0x3c889f23,0x3c7c5c70,0xb9e7f79a,0x3c8ac70d,0x3ce4946f,0x3cd22f64,0x3cea4e79,0x3ca25416,0x3bc7ea7d,0x3c2c063e,0x3c20106d, +0x3ca9aa77,0x3cb2246d,0x3cd4218c,0x3cf07e37,0x3ca30398,0x3b5b5b1a,0xbce96b05,0x3a21c06a,0x3cddd4d4,0x3d9745a7,0x3d898e5f,0x3d72df01,0x3d117943,0x3ca033b5,0x3bbef309,0x3c559651,0x3c8ff115,0x3cb80048,0x3ca6c8d4,0x3c7ea5e3,0x3c6a363a,0x3c25889c,0x3cbb6368,0x3ccbe94e,0x3c8e8b6d, +0x3c0aca0d,0x3b8c9334,0x39e435a8,0x3be79661,0x3c02b153,0x3bd2c724,0x3c9a9c81,0x3cc4f578,0x3c9b8693,0x3c52c0b5,0x3c0afc9e,0x3bea373d,0x3c613b22,0x3cbd477d,0x3ce9d504,0x3cd3b42e,0x3c98f2fc,0x39deab37,0x3c0139eb,0x3c0a8c77,0x3c8ba812,0x3b233354,0xbc3979d3,0xbce9cff4,0xbcbad469, +0xbc3c23e4,0x3bdfc8bc,0xbb9588a3,0xbbe11b07,0xbbcccfdd,0xbbebc24f,0xb992a7c1,0x3b049a96,0x3c2e3224,0x3c5ba4bb,0x3c492fda,0x3c46b374,0x3c4e4d46,0x3c913ed0,0x3c8de753,0x3caaf670,0x3cc22a0f,0x3cb03aec,0x3c8ec53c,0x3c39c809,0x3c60737a,0x3c7494b8,0x3c9da20e,0x3c89da83,0x3c593b20, +0x3c2b5400,0x3c20cbe3,0x3c3a0948,0x3c5f6605,0x3c8c975c,0x3cb0290b,0x3ce41109,0x3cf5d242,0x3d08ab09,0x3d112dbc,0x3cdcd438,0x3c81b8ae,0x3bdb2d64,0x3c29103a,0x3ca31215,0x3c901d8b,0x3bee0d78,0x3c5e71ff,0x3c72f264,0x3c70e078,0x3c4476f5,0x3c77137c,0x3c30dd60,0x3c787d74,0x3c0d9c70, +0x3c2a81ca,0x3bc47e0a,0x3bd9210a,0x3bddacaf,0x3bf6ae4e,0x3bcf8b70,0x3c1c5567,0x3b8a8170,0x390d9bec,0xbabc5fa3,0xb9e86031,0xba013f71,0xb9f11644,0xba6f1f4a,0xbac3bbab,0xbabd13b1,0xbae8bda9,0xbb0d4cb3,0xba8f3936,0x390a2271,0x3b5f1ecb,0x3b90c0ab,0x3bf81c6b,0x3c0c78ba,0x3c0b438f, +0x3bd407d8,0x3c0808f5,0x3b6acf53,0x3bf730e5,0x3c068d47,0x3bfdbe97,0x3bd76808,0x3c1982b1,0x3c1fb993,0x3c1df8ef,0x3bf30968,0x3c286e6d,0x3c334e67,0x3c17eb5d,0x3bf9cfc3,0x3bae7e20,0x3bca70c6,0x3b9c9d13,0x3b975d74,0x3b81b032,0x3b9918d1,0x3b908e16,0x3b8966e9,0x3b838883,0x3b77ffac, +0x3b5dae90,0x3b8a141c,0x3ba6dfbc,0x3bc17596,0x3bd3f05e,0x3bdaba4b,0x3bda08e8,0x3bce335c,0x3bc1a243,0x3bc78bcf,0x3bcf5cc6,0x3bcb2926,0x3bf70379,0x3bf1c4a7,0x3b97beb2,0xbb7a1532,0x3bfcd6fc,0x3b9c9d1e,0xbb9ac90f,0xbb899e1a,0xbb5caeb6,0xbae91d5c,0xbb14d433,0xbae16316,0xba7d9864, +0x3b98420b,0x3be2c017,0xb9fb34b1,0x3b7246c7,0x3bf1a059,0xbb8a1c3c,0xbb84cb40,0xbb80787d,0xbb90eb71,0xbbb2f0ea,0xbb923863,0xbb9c1c07,0xbbade41a,0xbc01b364,0xbbea94bc,0xbbc97217,0xbb832ad9,0xbb42bd11,0xbb56969a,0xbbb9021f,0xbba32cd0,0xbb965b97,0xbb386cd9,0xbb7dd2a3,0xbb7fd51f, +0xbb1a1aca,0xbb65638b,0xbb44d316,0xb94c6e72,0xbb236c03,0xbb32eeeb,0xbb2d893c,0xbb016813,0xbb0ab6d7,0xbb360d48,0xbb38caf7,0xbb1a407a,0xb9331b95,0xbb694d1c,0xbba1dc4f,0xbb1f59ad,0xbb70ab0d,0xba4b3330,0xbc004766,0xbc15da82,0xbbcaabe4,0xbab020c1,0xba763cc9,0xbb877a1a,0xbc4e7b0e, +0xbc6148aa,0xbc46cc12,0xbbd4daef,0xbad56799,0xba91cf5a,0xbbf27c16,0xbbd31e59,0xbbd7c19a,0xbb21797b,0xbbe607be,0xbbb820f3,0xbb4777cb,0xbb85c22a,0x3a4dfd56,0x3b198b8d,0x3af5c9cc,0x3a5c033e,0xbaddcb7a,0xba9e3a22,0xbaeb1a07,0xbb35adbd,0xbb44b581,0xbaf1685c,0x3b3b6df2,0xbae9f138, +0xbb86f764,0xbbb43ae5,0xbbe84f61,0x3b6bdaab,0xba7b6583,0xbc71d411,0xbc28b6ae,0xbb676f32,0xbbf5961e,0xbc278043,0xbcc97b2a,0xbccbbba3,0xbc9a23df,0xbbd95636,0x3b1ad09b,0x3aba51fd,0xbc49fc63,0xbc0fdc79,0xbc055943,0x3ae7005e,0xbbd410af,0xbb86e203,0xbb337057,0xbb3c6d0c,0x3b8ba842, +0x3c30857f,0x3bf8ee36,0x3bb72368,0x3b5fb10f,0x3b81825f,0x3ac33b7c,0x386d14f9,0xba97a89f,0x39f6666b,0x3c3dba1b,0x3a2e970a,0xbb31fb02,0xbb36d0a4,0xbb718314,0x3bd24cc0,0xbc3f52c7,0xbcbce3d9,0xbb644bd5,0x3c823a33,0x3c0226ed,0xbba5898f,0xbcf700e0,0xbd10310d,0xbcddf9c7,0xbc1561ce, +0x3c18af65,0x3c097863,0xbc3ca0cf,0xbc03204e,0xbc0cb159,0x3b1aa280,0xbc753a90,0xbc1afbba,0xbba91e88,0xbc2400ae,0x3bbdc077,0x3c661ee7,0x3c8ec0bd,0x3c38c41e,0x3b01da92,0x3c6189c7,0x3c86bbf3,0x3bd223cb,0x3b8e3a59,0x3bb5c199,0x3cb685ed,0x3c0a5734,0x3b9d341d,0xb9d86a0f,0xbbcaf410, +0xbd179f52,0xbd5db51c,0xbd68a86e,0xbd7ee8c1,0xbdb269d6,0xbd1f19d6,0xbc8407cf,0xbc9053a2,0xbcee8fff,0xbd008c21,0xbc80c3cf,0xbc31ba8f,0x3affaa7e,0xbb0b45b4,0xbc7229c7,0xbc4aa8c7,0x3c7db71b,0x3c1125dc,0x3bb1c261,0xbbe691fa,0xbc09326b,0x3b5f9ac9,0x3c170fe4,0x3bee1ac0,0x3c61f6cb, +0x3cc81060,0x3c97eddc,0x3c74a12a,0x3c3389a5,0x3c7ef7b6,0x39e0499d,0xbbba14df,0xbc8d0448,0xbca6007c,0xbc9ff627,0xbcb51cba,0xbc8f49a9,0xbcc76a1c,0xbd94bb11,0xbd8f1951,0xbd0cc8cb,0xbbfbc44b,0xbb5f09f8,0xbc1d903b,0xbd2f5a24,0xbd2f3304,0xbb03b863,0xbcd23835,0xbd053dbe,0xbd067521, +0xbc9c6151,0xbc8dbd2d,0xbce1ec5f,0xbc914796,0xbc24330f,0xbc040af6,0xbbfd6755,0xbb84efcd,0x3c046727,0x3cbdeb05,0x3c9dd114,0xbba72069,0x3ae7d40d,0x39dcb23d,0x3b819405,0xbaf8782c,0x3be80af8,0x3b234d81,0x3ca39898,0x3c3fdc81,0xbc9ebb4a,0xbc993063,0x3d82f42a,0x3d9dc5e0,0x3dc73dd9, +0x3db99128,0x3d42545a,0x3d3fd524,0x3c5158bb,0xbd2aa8a0,0xbd2ef7ed,0xbd26a104,0x3b7ffa33,0xbc8523e5,0xbcb264ee,0xbcfc7a05,0xbd3537dd,0xbd244656,0xbc8f7a51,0xbc7de468,0xbc650bfe,0xbc1fb4ff,0xbc581e3b,0xbb35cb9a,0x3c1f1b1f,0x3cebf589,0x3cdb7ace,0xbab2b9a1,0x3c2d8b96,0x3b8e0f95, +0x3b7b4fe4,0x3bf9b941,0x3c6c1b6c,0xbb93a7aa,0x3d1662fb,0x3d615dda,0x3d95959a,0x3d89d684,0xbb9bc1a0,0xbc1cb68b,0xbc1b4d1f,0x3c284478,0x3cd4a0ce,0x3da386f8,0x3da30457,0x3d01e849,0x3c97a564,0xbbc2097d,0x3ae25698,0xbd0abe0c,0xbd3aa2ec,0xbd45bf01,0xbd62eaef,0xbd67c58d,0xbd3f915c, +0xbd116ad1,0xbcc942e2,0xbc8ff30d,0xbc01e89b,0xb99e2685,0x3bae6c8f,0x3c017ffd,0x3bb07771,0xbc36bf2c,0x3ba43d00,0x3c1b9d58,0x3b55379d,0x3c180e9f,0x3c9b02b8,0x3cfee143,0x3d0357c8,0x3cc0a62a,0x3c0e78b6,0x3aa16c61,0x3c81be4c,0x3c2a2e29,0x3ba76d29,0x3b6b14b2,0x3c4eaa20,0x3bff2edb, +0x3b8e1c7a,0x3bd930a1,0x3c6cb4a5,0x3ce90144,0x3d742179,0x3d179f8a,0x3cdc20d5,0x3c77848f,0x3ca7aa43,0x3cb4727a,0x3c8977fb,0x3c59c2fb,0x3c357f75,0x3c3806aa,0x3bd5339e,0x3bbdb1d7,0x3c6b5b09,0x3ce4670b,0x3cef2f99,0x3c69810b,0x3c763667,0x3c67bf0b,0x3c5de1ff,0x3c6d2c3b,0x3c2bdb64, +0x3c33be6d,0x3c997e4b,0x3cbff680,0x3cb58435,0x3c9c7a88,0x3bf86099,0x3bbf2774,0x3a582aab,0x3bd64df8,0x3ce6e4b5,0x3c513e56,0x3b60f47e,0x3b543905,0xbcd56e44,0xbcd35096,0x3ad3ec53,0x3b9dbb2d,0x3beaea24,0xba248990,0xbc3ad8db,0xbc41bb50,0x3c42d8a2,0x3c74a30e,0x3c7ea463,0x3c1bb534, +0x3bbdbbdb,0x3c43c870,0x3c4cf436,0x3be648c2,0x3bede3e8,0x3c6ee7b9,0x3c92387f,0x3c966537,0x3c69de0d,0x3cc64f2c,0x3cdfaaf2,0x3c8fb800,0x3cab468c,0x3c8419d9,0x3c1cdebe,0x3bb94843,0x3c4fc2fb,0x3c3bc654,0x3c3e4edf,0x3c64a97a,0x3c6bf0d6,0x3c0aa7d6,0x3b47ee68,0xbb414012,0xbb0af425, +0xbb86bb56,0xbc241493,0xba22df9c,0x3c08c80a,0x3c86130f,0x3cbdbf2c,0x3ce53ee3,0x3cfe9d30,0x3cdccf21,0x3ccf2217,0x3cdafacc,0x3ccb2eb3,0x3c9598fc,0x3c77c253,0x3c8abac4,0x3c8c37f8,0x3c872180,0x3c73ce1e,0x3c76e2f2,0x3c709148,0x3c371efe,0x3c11848e,0x3c065b67,0x3bcc1b7c,0x3bab4486, +0x3b72a8ce,0x3c11d3f8,0x3b241db3,0x3bf57f2c,0x3bbf22fa,0x3b2120ee,0x39630ed6,0xba867c32,0xbb1fa5df,0xbbac4479,0xbbdb865c,0xbc05a510,0xbc24f1a3,0xbc490d59,0xbc7fd3c9,0xbc93338a,0xbc938172,0xbc929eeb,0xbc8cc0c0,0xbc5ada3f,0xbc37f9b5,0xbc106a41,0x3b0b3a87,0x3b89d72a,0x3bff6a90, +0x3c25f403,0x3c6aa3e0,0x3c92e806,0x3c97f412,0x3c98d028,0x3c9b8855,0x3ca55890,0x3cb62aca,0x3cae34e8,0x3c9fa0e5,0x3c7808d9,0x3c3b2cbb,0x3c2f6b16,0x3bcced41,0x3c27ab4f,0x3c036268,0x3bf95cf2,0x3be362c3,0x3bc2419d,0x3baaffa6,0x3ba41d96,0x3b819c3e,0x3b4dce21,0x3b3ace2f,0x3ae5710a, +0x3a89c4e3,0xb98cf26f,0x3ab1e7c5,0x3b2ade65,0x3b6bb7db,0x3b74a0cb,0x3b90ea40,0x3b6f807d,0x3b9c1988,0x3bb08f35,0x3be9d36f,0x3c0b01d8,0x3c124b08,0x3c0f708b,0x3c0432ec,0x3c023a53,0x3bfc76c2,0x3bf1715e,0x3bd8fbe5,0x3beb256e,0x3c0c5437,0x3c28e5de,0x3ba2d0af,0x3bc2bd66,0x3c29af7d, +0xb9ac74ce,0xbb504b07,0xbb5333b4,0xbb3ab1c3,0xbae10ba4,0x3a969862,0x3a6e114f,0x3a6cb6a0,0x3ac69b8a,0xbae2695f,0xbb174ad8,0xba0b3ea7,0xba5d118c,0xba17ede3,0xb9b0faab,0xba75b14b,0xba45ca3f,0x3a06ef0c,0xb7182a05,0x396db68e,0x3b1cc9aa,0x3a680d8f,0x39489f85,0xbab0be7b,0x3a87cfe6, +0xb913b25a,0xbb0d9c81,0xbb40acc8,0xbb5191eb,0xbb5d155f,0xbb5bf636,0xbb3dfa68,0xba86e90c,0xbaa95f86,0xba69e198,0xbba009b2,0xbb5f6871,0xbc333978,0xbc284e64,0xbbee1259,0xbba4f88b,0xba17e130,0xba4ff4b2,0xba19683f,0xb924f184,0xbc1b5d06,0xbc2a0aeb,0xbb8f31ce,0xbb80d458,0xbb293ec4, +0xba6836e3,0xbad207d7,0xba0ecf21,0x3b7db6c6,0x3af7c3ed,0x3b545ec5,0x3bc96a83,0x3b1a3ba0,0x3bb6fb32,0x3bbd7a9f,0x3b849b4a,0x3b3326b6,0x3b8b38a0,0x3a78460c,0xb897781c,0xba4f8e76,0xb946aaa9,0x3a90464e,0x3b78109a,0x3a4c26f9,0xbb426bf1,0xbc04caa8,0xbc1c925a,0xbc943b66,0xbcaa0e68, +0xbca1b9d1,0xbc76e933,0x39a94276,0x3b909793,0x3be5403d,0x3c264665,0xbc278914,0xbc7f14cc,0xbbf01642,0xbc136069,0xbbbf23d0,0xbb8cb532,0xbbb48db7,0xbb6f5fde,0x3b78afdd,0x3aff22a0,0x3ba657a7,0x3c196ea7,0x3c1189f1,0x3c3e57d0,0x3c548f0f,0x3c1c3fc4,0x3bec87b1,0x3c45351c,0x3b712ec6, +0x3a81a6a4,0x380a9350,0xb9eee27f,0x3b023960,0x3c2684ea,0x3b154e92,0xbb8311cd,0xbc557786,0xbc782220,0xbd34f570,0xbd0dc047,0xbccc4867,0xbcba7994,0xbc007422,0x3a1d4665,0x3b9dd830,0x3bde929d,0xbcdd57b8,0xbd04de44,0xbc8d4184,0xbc843de8,0xbc59172b,0xbbb8ab0d,0xbbb5bc51,0xbada3de7, +0x3c36a952,0x3bfc7531,0x3c523744,0x3ca0251f,0x3c4510b9,0x3c889ffe,0x3ca073a7,0x3c70e7c1,0x3c30822d,0x3c4e4223,0x3c45095a,0x3c51b781,0x3b7d72d5,0x3b8ed5b8,0x3ba215f5,0x3c8b5af5,0x3b6cc3d7,0xbc1de6ad,0xbce24aee,0xbd27e757,0xbbe845da,0xbc9ff405,0xbd0e0dd6,0xbd090fdc,0xbcd53b1d, +0xbc8a6f0c,0xbc340b20,0xbb76ad62,0xbae21b76,0xbc3ca405,0xbd296add,0xbca54e63,0xbcc311ed,0xbcfb4355,0xbce3dbbf,0xbca71f6f,0x3906fc74,0xbba9499b,0xbb9e403c,0xbba43abe,0x3b8d290c,0x3c5efa00,0x3ca66333,0x3c4cb3ad,0x3c5dfa26,0x3ccf96f4,0x3c85a81e,0x3c22b045,0x3bcff2a1,0x3bb5462a, +0xb9fe341e,0x3ba1643e,0xbc4f1f4f,0xbc97cded,0xbc3448b9,0xbb8ef3c9,0xbd48d0d2,0xbd39085c,0xbd41ce54,0xbd259dc7,0xbcb239c2,0x3c656e7f,0x3c6bb6c7,0x3c2f5a7f,0xbd36854c,0xbd6e7a38,0xbd1694f2,0xbc1472d9,0x3be610c3,0xbbeda928,0x3b93eb84,0xba5a9705,0xbb8029ff,0xbbbde7e0,0xbb38aa68, +0xbadc05e0,0x3ac90188,0x3bd39b91,0x3c625b72,0x3cd982b7,0x3cbaa94f,0xbba7e502,0xbb49156a,0xbb771e69,0x3b792380,0xbc00aa4d,0xbb9262ec,0xbc2c3a5c,0x3c99a0be,0x3c8d34fd,0xbc236c19,0xbd08ed76,0x3dac6f95,0x3decbbc6,0x3daa149e,0x3d552fcf,0x3c84a476,0xbd4e5a60,0xbd81698b,0xbc9aa90e, +0xbd8460fb,0xbd5fe18d,0xbc3d3516,0xbb9a6c4f,0xbb891d91,0xbd055597,0xbd04484d,0xbd092be3,0xbcb44b5c,0xbb8028c3,0x3a81920a,0xbc2db3df,0xbc07151e,0x3a7c830a,0x3cbb086a,0x3c45e6e6,0x3bef9aca,0xbb6d7898,0x3b3b9e31,0x3abacb1c,0xba992a08,0x3b46249f,0x3c0314f0,0xbb7068b8,0x3cb23d34, +0x3d2abf30,0x3d906ce2,0x3d9a29aa,0xb9a50d05,0x39f131e0,0xbc1fe435,0x3c689e25,0x3d662d59,0x3da2affb,0x3d8d8eef,0x3d2bc0c4,0xbd069f5c,0xbd804332,0xbd30000e,0xbd2d7764,0xbcd2cf13,0xbceddfd2,0xbc9fe53e,0xbcbfa44d,0xbceb0bfe,0xbce6a345,0xbc91d122,0xbc126285,0xbbdea5a9,0x3b929ee2, +0x3cc2a2fe,0x3c305bc3,0x3c21ec85,0x3c0041cc,0x3abdd384,0x3b56a2ae,0x3c00196f,0x3af34176,0x3c1488ef,0x3cee451a,0x3d0b98ea,0x3d06a0b1,0x3cb0cdfd,0x3c678728,0x3c91c8da,0x3c8e6459,0x3c44854a,0xb99d74e0,0xbc72f4c1,0x3aaebba2,0x3c12be53,0x3d05b2fb,0x3c71a763,0x3c9aaf3c,0x3d232e58, +0x3cdaa17a,0x3c70d769,0xba98cf1c,0xbc01d622,0xbbb53a71,0x3b700c35,0x3b9de55b,0x3b9cef07,0x3c0fd576,0x3be6b183,0x3c3228b3,0x3c806080,0x3cc0cd16,0x3cbf9fbc,0x3c39e5cc,0x3c7c200c,0x3c966796,0x3cf34b46,0x3c909aa2,0x3c528ada,0x3c348c0b,0x3c7383b6,0x3c9ac48f,0x3cae6d98,0x3cb32b64, +0x3a2e2f34,0xbbc82367,0xbb7fa1fd,0xbaa72b31,0xbb27250b,0x3c3cc24c,0x3c5b6403,0x3bb5d9a8,0xbc425a0e,0xbc66f93a,0xbbbe2715,0x3c67395f,0x3d02c616,0x3d2a0980,0x3d358680,0x3d0e5ae5,0x3c706229,0x3c6668ff,0x3c6912b5,0x3c7f7523,0x3c9d3285,0x3ca315a2,0x3cac434d,0x3c3ee60a,0x3bc5cbcf, +0x3ba6b094,0x3c41832d,0x3c763309,0x3c95c4df,0x3ca30f16,0x3ca71e58,0x3c92e731,0x3cba43f0,0x3cae9726,0x3c8d2fb8,0x3bf174f5,0x3b5b7cad,0xba6d1359,0x3be1bff5,0x3c5eb097,0x3ca326bf,0x3c75788e,0x3c4d3135,0x3c5ec792,0x3c24c4ef,0x3b9b3ffa,0xbb798289,0xb91fa111,0x3b552a2d,0x3c29a67a, +0x3c16f273,0x3c32e726,0x3c5629b8,0x3c7d4a6e,0x3c6d7c80,0x3c7b999c,0x3c53310f,0x3bedc759,0x3b0c2928,0x3c2e8e4f,0x3c936806,0x3ccc1cb0,0x3c934fc1,0x3c3fe8e4,0x3bfae52b,0x3c00a2ec,0x3c19d521,0x3c245c9e,0x3c0f9a15,0x3bd66454,0x3bcda071,0x3ba9d8ed,0x3c96133e,0x3caafe8b,0x3c94846b, +0x3c748a1f,0x3c5bfb30,0x3c3e9b38,0x3c241298,0x3bf1079d,0x3b9b8d93,0x3b6e3f7e,0x3b1d178e,0x3b015756,0xb8b474b8,0xbb2b13c1,0xbb11eeb9,0xbade40d5,0xbaa9937a,0xbadf59dc,0xba6714d2,0xba8f08a6,0xbb09797e,0x3ba4354d,0x3bf184f0,0x3c2809cd,0x3c3c7b26,0x3c74d829,0x3c81030f,0x3c96cb12, +0x3ca4030d,0x3cab26af,0x3cae3804,0x3cc28644,0x3cb31838,0x3cb41d64,0x3ca8bb60,0x3ca69c33,0x3c6fc1df,0x3c82557e,0x3c6b2b28,0x3c62c512,0x3c4eb087,0x3c47b922,0x3c3faea4,0x3c397db0,0x3c40cb3d,0x3c4049dc,0x3c3d9df4,0x3c2a6af8,0x3c1db7b0,0x3c0b60a9,0x3c131fba,0x3c101cf2,0x3c0c668c, +0x3c0d4a13,0x3c0a1e4d,0x3c0b6575,0x3c0a2556,0x3c13f6f0,0x3c17e7ea,0x3c4444dc,0x3c4c5ed3,0x3c60852a,0x3c6387f6,0x3c645225,0x3c655ac3,0x3c6b25e7,0x3c6cd01f,0x3c6e7450,0x3c67f0cb,0x3c71d0b1,0x3c4eff2b,0x3c6ad1fd,0x3c5fdfa8,0x3a79eb76,0xba1c49bd,0xb9365d85,0xbb299c05,0xbb3178bc, +0xbb31552a,0xba2bd29c,0x39a651d4,0x3b0976a5,0xbac729d6,0xbae6ead0,0x3a9daf41,0xb9c19727,0xb909b33f,0x3982d3c2,0x3a88966b,0x3ac4d8c9,0x3b01a3f3,0x3ac9668c,0x3aea0ae0,0x3b22def5,0x3b4e3526,0x3b4cd38e,0x3b202ac9,0x3b3fd3a7,0x3b298569,0x3b22b5da,0x3a287651,0x3887a2a9,0xb9b242c2, +0x39a021b6,0x3a47b610,0x3b0852c4,0x3ae75661,0x3aac94ee,0xbb080751,0xba4d25a8,0xbc0a08e8,0xbb544ce6,0xbc0b5e05,0xbbfb7182,0xbb5c31dc,0x3b7ff4c0,0x3bbf8ca1,0x3c0701e8,0xbade3f1e,0xbb70bd17,0x3b747164,0xba88c72c,0xbab85c87,0xbacceedb,0x3844e8e3,0x3aa63973,0x3b30a0c5,0x3b4dc064, +0x3b8615de,0x3bdae22e,0x3c054757,0x3c01fdf8,0x3bf86709,0x3bd50a1c,0x3bb56d8d,0x3be05573,0x3adec95b,0x3913b05f,0xb6120427,0x3a5eb3b3,0x3b356048,0x3bb3fdb4,0x3b8d10c1,0x3aba7928,0xbbc434fa,0xbb8003b1,0xbc318b23,0xbbd57bf0,0xbc820786,0xbca1522a,0xbc923021,0xbbafab58,0xba68edfe, +0x3c0ad092,0xbc1883e5,0xbc4afb88,0x3b951762,0xbbd92e07,0xbb90082c,0xb97cf9ae,0x3b05aaac,0x3b7e28b7,0x3ba2f29b,0x3b6fd5cd,0x3ba67a6b,0x3c200456,0x3c5fecfd,0x3c66e017,0x3c5861b9,0x3c438b85,0x3c2decc3,0x3c618dd3,0x3b67ce3f,0xbaa2c84d,0xba7ac92c,0x39a57701,0x3b950dc1,0x3c3039d3, +0x3bd01f99,0x3a8c94dc,0xbc3dcac1,0xbbc4c4bf,0xbc9225bb,0xbbb5cb9e,0xbcac494f,0xbcc47208,0xbc260133,0x3c024102,0x3c74036e,0x3cc2c515,0xbbe4bddd,0xbc58f4a3,0x3c5ec07d,0xbb5f1fb2,0xbb9c38a5,0xb9653ad1,0xb9133e3e,0x3b10d5e6,0x3b9ed1a0,0x3c07b6bf,0x3c171ba5,0x3c719ac7,0x3cc19085, +0x3cae7d49,0x3cae7ce8,0x3c8ba502,0x3c70237c,0x3ca519a1,0x3c3963a3,0x3c1021b9,0x3a892dae,0x3b2cc1b6,0x3bc01d42,0x3c9ba1e0,0x3c3175aa,0x3a35f9f7,0xbc9552a4,0xbc631197,0x3c5d0ac4,0xbca9ea1e,0xbd14b9e1,0xbd3b009d,0xbd438ffc,0xbcda4e18,0xbc70ada1,0xbb5f4577,0x3c514572,0x3b725a0c, +0xbd22e40e,0xbd0bbad7,0xbcf3df38,0xbccb8a2f,0x3a8df4ce,0x3aaedd0f,0xbc9af677,0xbc918e9f,0xbc6f54c3,0xbbba72e8,0x39daf439,0x3bef2990,0x3c8104ee,0x3c147e26,0x3c2d9236,0x3cbb0315,0x3c36d6d3,0x3b8e3825,0x3b8cf5d4,0x3bc844e2,0x3b716e3e,0x3b99c98b,0xbbc296d2,0xbc0133a1,0xbc132903, +0x3c7d871c,0xbd3b4a03,0xbd470626,0xbd329540,0xbcb26b39,0xbc83ca50,0xb927df74,0x3bd11fce,0x3c72ad13,0xbd07dac7,0xbd331f1f,0xbd7ffdc6,0xbc63aa44,0x3af8cfa1,0x3b0231c4,0xba2b8be0,0xbb7f3929,0x3bfe161d,0x3bc46593,0x3b6bccc8,0x3b34d3e9,0x3c0a0d48,0x3c2cdb85,0x3c7983e2,0x3cb038b9, +0x3cb292ec,0x3b2126ab,0xba6dc8e0,0x3a894d8d,0x3b5ae60f,0xbadefc7e,0x399a868b,0xbc2965c7,0x3c7fb533,0x3c661b6f,0x3b2d6610,0xbd02ef31,0x3db8827a,0x3d9bdb96,0x3d52d163,0x3c557e12,0xbd10f8ca,0xbd99c640,0xbda1c881,0xbbfb1193,0xbd89793c,0xbd90cfb3,0xbd8a5c4a,0xbcf7ef88,0xbc966268, +0xbd0fd36a,0xbc40340f,0xbc125ec3,0xbc70f574,0xbc2759fd,0xbb777f19,0xbbf36f05,0xba8d9b53,0x3c34744d,0x3d240445,0xbac87974,0xbc290821,0xbb018b55,0xbb9e18af,0x3a700ed1,0xb9700eed,0xbaee11e2,0x3a925ae8,0xbb44c77a,0x3c38c0f0,0x3ce17a7b,0x3da38d37,0x3d9a2339,0x3c60dc50,0x3caa470b, +0x3cf050e5,0x3d413df5,0x3da0ca34,0x3d7be0cb,0x3d1ece8f,0x3d0ba759,0xbd62efca,0xbd8cee91,0xbd3d1cc8,0xbc479ed5,0x3b151e54,0xbc6df856,0xbc6a0742,0xbc9f8e52,0xbc68ac22,0xbc9d3fa2,0xbc90ecdc,0xbbea7181,0xbb7bd624,0x3b88c055,0x3d0cf26b,0x3c20b417,0x3bcae02c,0x3c4da9bb,0x3b3ba73d, +0x3b0e5965,0x3b41f7cd,0xbb8a3303,0x3a749146,0x3cb41dfd,0x3d08bd78,0x3d15297c,0x3d0a628b,0x3cad7db6,0x3c9f6e95,0x3cbf2167,0x3c8e941e,0x3c23dcfd,0xbb0bf34b,0x3c4cac28,0x3d1223c4,0x3d8b4049,0x3d335e0a,0x3cfd90e9,0x3c14b91c,0x3b9757cb,0xbbaa72ab,0xbcb7983e,0xbcfa72c5,0xbd0a7c87, +0xbcb97f18,0xbc85e151,0xbc31be66,0xbb4a0085,0x3bb4beed,0x3bf87b5c,0x3c873830,0x3c73c58c,0x3c711ad9,0x3c34f408,0x3c5a50d7,0x3c8a2641,0x3cef5b1b,0x3cc16aeb,0x3cac83a6,0x3c6a6595,0x3c672ac2,0x3c8d9bec,0x3cbb9c68,0x3ca92671,0xba9230ee,0xbb553a10,0xbc0b627a,0xbbe027ab,0xbad689e2, +0x3c4a4fa9,0x3c67043c,0x3c115a5e,0x3c74b2f9,0x3c62753f,0x3af82ca1,0x3cc7def1,0x3d231f0f,0x3d5761d3,0x3d57a487,0x3d3f538f,0x3ced7da4,0x3c955e50,0x3c4fae55,0x3c63c5a3,0x3c88237e,0x3c8886e9,0x3c854721,0x3c9a7586,0x3c82d23e,0x3c07164d,0x3bffcac2,0x3c32a929,0x3c999da8,0x3c3cea2b, +0x3c54a9ca,0x3c9e1ce6,0x3cae41cd,0x3ca363a3,0x3c8e2d7e,0x3bf50f73,0x3c134a9d,0x3c10b5c6,0x3c39d869,0x3c410b74,0x3c46ba21,0x3c519f74,0x3c88c174,0x3ca889bf,0x3c8cda7d,0x3c67f893,0x3c2a04b6,0x3ba5f705,0xbadd2bdd,0xbbb54e6a,0xbbaf55e7,0xbb303e4f,0x39e7407d,0xb8a3f8d9,0xbb8e37dc, +0xbb6fe081,0x3b2c321a,0xbac9bec7,0xbb5ca242,0x3b696774,0x3c494456,0x3ca3d3f9,0x3c8b58f3,0x3c3fa7aa,0x3c04e1aa,0x3c32306b,0x3c547ad6,0x3c79873e,0x3c48b393,0x3c361127,0x3c2b6db0,0x3c295667,0x3c8ff832,0x3c7861a4,0x3c6319b7,0x3c54f1ec,0x3c4e387f,0x3c422af5,0x3c23a620,0x3c15b33c, +0x3c0609d4,0x3c097982,0x3c192539,0x3c1c7dfe,0x3c33324a,0x3c3bd6dc,0x3c380b09,0x3c1f8090,0x3c0c6794,0x3bf20a7b,0x3be67bed,0x3bc6b124,0x3befe75f,0x3c13469d,0x3c3c30c1,0x3c491eb1,0x3c40602c,0x3c51f2c3,0x3c4f7d26,0x3c66aa56,0x3c6b8857,0x3c6db2b4,0x3c57d7ee,0x3c6fbae5,0x3c6d954b, +0x3c831713,0x3c8557eb,0x3c7a441b,0x3c4e96ac,0x3c4563e7,0x3c4298a9,0x3c3ae629,0x3c31e7ae,0x3c2cfe50,0x3c2ba497,0x3c24fefc,0x3c2ecf1e,0x3c2e7d02,0x3c287c7e,0x3c2a2012,0x3c26b27c,0x3c2522d4,0x3c1dc882,0x3c1ca150,0x3c1a4576,0x3c1bd360,0x3c1e3d53,0x3c190925,0x3c114df0,0x3c1ccf4d, +0x3c274167,0x3c258e14,0x3c323398,0x3c45f48c,0x3c469dda,0x3c49463a,0x3c4ce1ba,0x3c4d2f8a,0x3c535423,0x3c4d9243,0x3c328ecd,0x3c282e88,0x3c610803,0x3c4e5889,0x3c3e6cd7,0xb9a3f718,0xba5ce356,0x3a3df2b4,0xbb31b607,0xbb4d3011,0xba836b02,0xbabdfb9c,0xba30524d,0x3ae7af0a,0xb98aee7a, +0xba251c04,0xb93473b4,0xbad2649a,0xbb018ce7,0xbb0e7aae,0xba26ed7a,0xb8f89505,0xb91171fa,0xb98931b1,0x3931d3ec,0x3a85983c,0x3ae109f9,0x3b0ec9ae,0x3b322531,0x3ad4b86d,0x3ad10c92,0x3b2b03f2,0x3a35fe78,0x384b99be,0xb9ab1fea,0x3a27f933,0x3ab426c8,0x3b23893f,0x3a7dacc4,0x3864e0d1, +0xbaa49f54,0xb9fe909e,0xbb5e5a9f,0xb8d7315d,0xbc035271,0xbc0db4d4,0xbacfd82b,0xbb2b0d43,0xba5b38e5,0x3b6dff60,0xba9465c8,0xbb3bd348,0xbaa7b633,0xbb38a7a9,0xbb560fb3,0xbb8ec764,0xba9e3d6f,0xb9d0eee9,0xba5eceea,0xba60f3d0,0x3a012503,0x3b6204a7,0x3bcf6804,0x3be2124f,0x3bbfc58d, +0x3bc0ac8b,0x3b9f3daa,0x3b9175b8,0x3968a2b5,0xbabc8b4a,0xbac2b0e5,0x3914ece2,0x3afdd61d,0x3b959fe1,0x3b74c58a,0x3ac3e5cd,0xbbd35fe6,0xbb773684,0xbad77666,0x3b3b3d72,0xbc829184,0xbc954fa5,0xbb34c573,0xbbe3fc73,0xbb4a59f1,0x3c2bbcc0,0x3aea46d7,0xbab48655,0x3a6b05e8,0xbbdfbc50, +0xbc095b7e,0xbc0e02a1,0xba39ee2e,0x3aa23348,0x3ac4e43a,0xb965289f,0x3b24b1ac,0x3c027035,0x3c3bd1de,0x3c566fd4,0x3c3b1d48,0x3c39c629,0x3c283c12,0x3c1dc272,0x3aac8a98,0xbb2febf7,0xbb2de0d6,0x39c2aa00,0x3b985c9e,0x3c1744e0,0x3bd9a904,0x3b2071e3,0xbc0771e0,0xb841116b,0xbb785597, +0x3a81f976,0xbcdc0eb8,0xbcc8ac83,0x3b72259b,0xbbb0127d,0xb9bcc4bb,0x3c74b139,0xb8ef2731,0xbc0b89d1,0xb6777803,0xbb342436,0xbbd025e7,0xbc19b56c,0xbaf62278,0x3a9f7f23,0x3ab93d17,0x39288486,0x3b93ff8d,0x3c4c2c08,0x3c94eda0,0x3cbc6809,0x3ca93f25,0x3c94b150,0x3c701c8f,0x3ca59840, +0x3c0e5149,0x3b9f7f24,0xba1ebf49,0x3ae9fc61,0x3bfa9ba6,0x3c88f328,0x3c61bfe8,0x3c1591d1,0xbc6acaa9,0xbc017788,0x3c27a61e,0xbd44999a,0xbd0e141a,0xbd3ad8b6,0xbd793df5,0xbd1ad17a,0xbcb32e4a,0xbca7d3da,0x3cc7f97d,0x3cec3b5e,0xbc3c63c5,0xbce483e2,0xbcda72f6,0xbb6f59be,0x3c1c87a2, +0x3c0e3bec,0xbbfb0bbf,0xbb27326a,0x3ae62136,0x3b1a26a9,0x399e77bc,0x3ba20837,0x3c282a9c,0x3c08f70e,0x3c38368e,0x3ca3bcab,0x3bb9bf64,0x39b141c6,0x3bd8b470,0x39f0af27,0xbbb88371,0x3b3add62,0xbbb711c6,0xbc045f54,0xbc585b08,0x3c94a7b0,0xbd378094,0xbd3df9fd,0xbc50107e,0x3c77034c, +0x3d07a82c,0x3c02e418,0x3b42995c,0x3cb9cf3c,0xbb753d4b,0xbce77e14,0xbd383b59,0xbd1a0655,0xbcfe8d0e,0xbc6945cf,0xbc9f7213,0xbc58cf66,0xbae789e2,0xbaabd950,0xbb351d67,0xbb2c9591,0x3c09a34c,0x3c48ed5f,0x3cc1513a,0x3c526d65,0x3c2f62a3,0x3bb89d27,0x38c13f9c,0x3af6790a,0x3b153c9b, +0x38b51f6c,0x3ac7b154,0xbbe685cc,0x3bf5fb39,0x3bb68e0f,0x3b876266,0xbcf5422d,0x3d862ca0,0x3cc6729f,0xbc6da5b8,0xbd86d354,0xbdfdcc56,0xbdcd5dd9,0xbd9e75cf,0xbd33b571,0xbd0fe84d,0xbce18f67,0xbd2e25a3,0xbcecefb6,0xbca32d57,0xbbbdc491,0x3b56a1cd,0x396a45f5,0xbbe0a33a,0xbc1edd78, +0xbbdf110e,0xbb1ac4e2,0x3accdf9f,0x3c5e1ab5,0x3d28526d,0xbaa36a7a,0xbc26679c,0x3bc46450,0xbb986885,0x3b8c4fff,0x3b4d58fe,0xb9896757,0xb9c9ea24,0xbb1b1b8f,0xbb079f18,0x3c0c0d03,0x3d58d853,0x3d7297d4,0x3d061445,0x3d37b4c7,0x3da13f61,0x3db90233,0x3da65d88,0x3d57141f,0x3c8bed1a, +0xbc1debf0,0xbd247bf9,0xbd1e10f0,0xbd0cba9c,0x3bccc110,0x3c3a3367,0xbb18995f,0xbc618a36,0xbc8a6cf3,0xbc50da98,0xbc70a3df,0xbc895eda,0xbc5f0c85,0xbc65309a,0xbbb59e8f,0x3cd1215a,0x3b3631f7,0x3aa7eedc,0x3c0f9d73,0x39bd6c25,0x3a5e2891,0x38e83d19,0xbaa1e606,0x3b49e3fa,0x3c9fde42, +0x3cea3f77,0x3d1391d7,0x3d3a1d52,0x3d024a55,0x3c6f8a9c,0x3c2a4017,0x3c0244b4,0x3be72666,0x3b9cd729,0x3cf7df96,0x3d6703ae,0x3d9c8535,0x3d6526dc,0x3ccdc140,0xbcbe86c0,0xbcd4caba,0xbccfa0e2,0xbc639490,0xbc801d17,0xbca34571,0xbcf2024d,0xbcb9fe9e,0xbc747971,0xbc0db9b8,0xba3cff09, +0x3bf58f3c,0x3c96cd06,0x3c391450,0x3c0922a3,0x3bdaee7d,0x3c85f332,0x3ca68712,0x3cb088d4,0x3cbfb08c,0x3cc30a03,0x3ccd037c,0x3c9b1f46,0x3c8d8dd0,0x3cb5a017,0x3c80964f,0x3c2fb20b,0x3c27f028,0x3c2106bc,0x3c0a07c0,0x3c5d85ff,0x3c18bd1f,0x3c1d0cd7,0x3cd8a4d1,0x3cf13645,0x3d0cffe8, +0x3d1eacea,0x3d0bc094,0x3cff82ae,0x3d23e24a,0x3d0dc52e,0x3d1104df,0x3d104787,0x3cdf52c1,0x3ca5325a,0x3c787e8c,0x3c505a30,0x3c42c2d5,0x3c1afd70,0x3c877487,0x3c9ccf72,0x3c83bd17,0x3c2c4234,0x3c1982a5,0x3c0a5f6c,0x3bd5dce8,0x3c00dbc7,0x3c4a6a29,0x3c8c2fd8,0x3ca3d362,0x3cb3adc1, +0x3c925770,0x3bd3d754,0x3ae42009,0xb9044d5c,0xbab238a0,0xbacee79b,0x3b366ed2,0x3bd25046,0x3c003934,0x3bece697,0x3ba0128c,0x3adcbcf6,0xbb031434,0xbb951cb8,0xbc0554cf,0xbc1d3276,0xbc3aa6ba,0xbc4f9b03,0xbc3d5bf2,0xbc0300cf,0xbc15d67d,0xbbcaca88,0x3a6e01a9,0x3beb4190,0x3bde58ae, +0x3bfb590f,0x3c184734,0x3c3cea7b,0x3c3f4541,0x3c5d0a26,0x3c646087,0x3c666e10,0x3c6973f7,0x3c3f5363,0x3c19ec98,0x3c05d7cb,0x3be0b7f8,0x3c5aa6c9,0x3c5f40fd,0x3c5c186e,0x3c5f6fe2,0x3c428892,0x3c2fb247,0x3c11a5ee,0x3bf7ac14,0x3c0477cd,0x3c1c3455,0x3c39ee7a,0x3c449a0e,0x3c451e09, +0x3c3d79c6,0x3c4122ac,0x3c3d5eb1,0x3c32cd00,0x3c2637e8,0x3c159892,0x3c00fb35,0x3c096af9,0x3c1eb3ea,0x3c32d79e,0x3c3bd86d,0x3c54bbe0,0x3c677d44,0x3c55377b,0x3c4b54b8,0x3c4283f2,0x3c30baef,0x3c204abf,0x3c1850e7,0x3c2134fa,0x3c324c54,0x3c4b2eff,0x3c4abd2d,0x3c4c6a0d,0x3c6dc34a, +0x3c5e7c59,0x3c5327f0,0x3c541029,0x3c4dd3e4,0x3c4c2b07,0x3c492db7,0x3c460172,0x3c3a5702,0x3c2ea24e,0x3c2b2eb0,0x3c2e9563,0x3c3614ca,0x3c326ed1,0x3c32185c,0x3c35bd7a,0x3c362989,0x3c374f12,0x3c3deb76,0x3c31a0d0,0x3c2458d7,0x3c0f7859,0x3c4835f7,0x3c391368,0x3c36fc73,0x3c30eb45, +0x3c2de38c,0x3c272df1,0x3c25c486,0x3c253c94,0x3c1b8855,0x3c3231b4,0x3c4b9bea,0x3c1fb29e,0x3c3b5483,0x3c8df493,0xb994bf04,0x38add493,0x39e0a3d7,0xbafd37e2,0xbb1dacac,0xba295e13,0xbb334c3d,0xbb16ed6f,0x397c4a3d,0xb9fe0b80,0xba107078,0xba3b4047,0xbaa3f6ad,0xbacc4ded,0xbaf68337, +0xba9f563c,0xba80fa64,0xba8b2896,0xba12e9c2,0x386eaaf1,0x3a94f125,0x3adf2af9,0x3b0258f4,0x3af3699f,0x3aefde50,0x3abce77a,0x3a85a85b,0xb97aa5fd,0xba2f6fde,0xba7dc06b,0x386c802b,0x3a2e17fa,0x3aadc543,0x3aacbc13,0x3ab25526,0xbac10644,0xb8ad1591,0xbb2370d3,0xba9af900,0xbb9d85f8, +0xbba682fd,0xbad35bcb,0xbbe49684,0xbbbc66b1,0xb9bcd718,0xba0a695d,0xba4154b5,0xbb35635d,0xbb7005ea,0xbb8a98e8,0xbb8d6670,0xbaed80f9,0xba95014e,0xbadeb023,0xbaa7394b,0x39ba1fdb,0x3b823475,0x3bafce10,0x3bcd7e0a,0x3bc35750,0x3bb2964d,0x3b81d39c,0x3b2eeb3a,0xb8f2b782,0xbab3c804, +0xba9e20f9,0x39d29852,0x3b10ef5f,0x3b7c16d7,0x3b99754a,0x3b14c410,0xbbb7431c,0xbb3ce0f3,0xbba36150,0xba84571c,0xbc3be0e7,0xbc546a61,0xbb9d7e1f,0xbc958043,0xbc6cf822,0xbaed8cc8,0xbb128419,0xbae074af,0xbba821af,0xbbe0dcdb,0xbc174fe9,0xbc402e6b,0xbbd8f6be,0xbba2b4a7,0xbb802a70, +0xbb1cfa5b,0x3a9833e9,0x3c17593d,0x3c35b514,0x3c4c9e5f,0x3c43c586,0x3c33eb76,0x3c19999c,0x3bdd3f7a,0xb972c39f,0xbb4cab00,0xbb388567,0x38ee4939,0x3b9fedb6,0x3bf65ae1,0x3c0cde2b,0x3ba36a10,0xbbd941f2,0xbb678f3f,0xbc9a4e31,0xbc099119,0xbc5b0184,0xbc727116,0xbbb4c60d,0xbcb608aa, +0xbc9fcd81,0xbb967781,0xbb807eee,0xbb9984f7,0xbc3dc9ea,0xbc286cf2,0xbc5c8154,0xbc8d2503,0xbbeb4868,0xbb9f559d,0xbb9c5d00,0xbbaa1347,0x39893c25,0x3c796cc6,0x3c9d9ebb,0x3cc218eb,0x3cbbcac9,0x3c868ff9,0x3c4c5422,0x3c9026c1,0x3be68423,0x3b1968e9,0xba87b803,0x3b026313,0x3c0513ee, +0x3c610333,0x3c49f18b,0x3b9a6d47,0xbcbd71f7,0xbcb459f8,0x3c54494d,0xbd39eff1,0xbceafead,0xbd113a12,0xbd582438,0xbd179103,0xbcaedc2c,0xbc84ab44,0x3cacaa4c,0x3cc5dc47,0xbba1b633,0xbc6dca97,0xbcdb9d58,0xbced3f70,0xbc9f7f61,0xbc21c7cd,0xbab26b0c,0x3b7c91ac,0x3c10be21,0x3c4cbb49, +0x3c1cb738,0x3c144bec,0x3c2d229e,0x3c6d01d0,0x3c8241a2,0x3c7b1139,0x3b4be37d,0xbaa88168,0x3bc0e3b0,0xbc0cc28c,0xbbfe3c28,0x3c486792,0x3a44b8b7,0xbb00577c,0xbba40609,0x3cdfa6d9,0xbd097028,0xbd0e6d42,0xbb957064,0x3c2407ef,0x3c8a5a05,0xbb77a633,0xbca51f58,0xbccd11c8,0xbbdb8a1c, +0xbb43ab5a,0xbcb6c9b8,0xbd000578,0xbce63258,0xbbfde853,0x3b544d77,0x3be2e14a,0x3ad0812d,0xbb1235b7,0xbb416bd3,0xbb9ea9bc,0x3b4e8b66,0x3c4a9b59,0x3ce0e146,0x3bca33e8,0x394f0a49,0x3af1d617,0xba81ecef,0xba1df118,0xbb1bb701,0xbbcde73a,0xbbe6d8c6,0xbc24f7f0,0xbc276fc7,0xbb7cdea0, +0x3c5eca3a,0xbcaaa66f,0x3ce8a224,0xbcfe0261,0xbd9f25cb,0xbdc6d887,0xbdf34e0b,0xbd970b18,0xbd151aac,0xbd084e17,0xbb079467,0xbbc342e5,0xbd1fd55b,0xbcfbd548,0xbc8df430,0x3c894e54,0x3bf5eec2,0x3bcdfe29,0x3b224703,0x3bd33b24,0x3bfedf94,0x3b9f2f60,0x3c1fd8e1,0x3c6d4ae3,0x3cf52dfd, +0x3a41055d,0xbbf92866,0x3babd773,0xbb6c47a4,0x3b9075c4,0x3a4992fe,0x3aa12a9f,0x3ada3e63,0x3b60f31c,0xbb7a86fb,0xbb8dbf8f,0x3c9de571,0x3ce1268e,0x3d4cbec2,0x3d8ec1bf,0x3de5b534,0x3de5f94b,0x3d8f7b83,0x3d087c56,0xbb8f084d,0xbd312fd8,0xbc8cb92a,0xbc8149af,0xbd0e2e63,0xbcf9ed63, +0xbcba1de5,0x3bba9598,0xb9c4d18a,0xba5f6e11,0xbc543bf2,0xbc550e12,0xbc5df409,0xbc3b1bc2,0xbc09094c,0x3a1544da,0x3c9b8133,0x3ba04f88,0x3ba0dba1,0x3c2f6e5f,0xbb0653d4,0xba97f804,0xb8087e7e,0x3b90ef1f,0x3c07ca3c,0x3c8263d5,0x3cc9cff5,0x3d154cea,0x3d4be0f6,0x3d2f2e80,0x3c16a22a, +0x3b766af2,0xbaf9bf3a,0x3bd2d947,0x3cf0b340,0x3d5dc2b9,0x3d898f9a,0x3d786d2e,0x3d2d3ba6,0x3c2a81a4,0xbcc63987,0xbd3ce009,0xbd595127,0xbd076fdc,0xbcd97f82,0xbc79f314,0xbc9e6d63,0xbbe19d47,0xbaf209b4,0xbb3c8181,0x3ae9d2b3,0x3c1b5d11,0x3c9fc6f7,0x3c12df02,0x3b9b7bb0,0x3b482c95, +0x3c9735ca,0x3cbce8a1,0x3c87c1d7,0x3ca89020,0x3cc40dd5,0x3cfd618c,0x3cb359e0,0x3c922f62,0x3cb4bc22,0x3c5ac6e2,0x3cccccc1,0x3cc1a02d,0x3cd570c7,0x3cada589,0x3c0f46ea,0x3b93cc96,0x3c57bfa7,0x3d03774a,0x3d181136,0x3d39021c,0x3d4cec26,0x3d161aa9,0x3cd51600,0x3c905763,0x3c96aa9f, +0x3c877675,0x3c818bdb,0x3c87c80c,0x3c83403b,0x3c6c055e,0x3c4f0f26,0x3c231a8a,0x3c31a77e,0x3c592658,0x3c90b560,0x3c9ac8fe,0x3c6c9b05,0x3c04679f,0xba1a4b64,0x3b123021,0x3b8ea654,0x3c33d61f,0x3c549d0a,0x3c96c939,0x3ccabc96,0x3cddef2e,0x3b97769d,0x3926532f,0xbadc7fa1,0xbb844d46, +0xbb72fc7a,0x3aad752f,0x3b68eb2c,0x3ba3ea1c,0x3b99b43b,0x3b8ec4ba,0x3ba777d9,0x3b760dd6,0x3b8c8cff,0x3b5afb3b,0x3bb23df5,0x3bc23ab3,0x3be81cc7,0x3c0498c8,0x3c373c25,0x3c3552d7,0x3c15cf52,0x3c733c63,0x3c902825,0x3c51fa74,0x3c06429f,0x3b91bbda,0x3c000825,0x3c333ef3,0x3c7886d7, +0x3c8511a5,0x3c8dd86e,0x3c9147ce,0x3c88ac25,0x3c79f57e,0x3c70bf22,0x3c23f56b,0x3c4c7c35,0x3c589735,0x3c69e875,0x3c7ac4a9,0x3c778935,0x3c6d75be,0x3c69ca86,0x3c710ad9,0x3c66e61f,0x3c5d5cc5,0x3c502cd7,0x3c497d68,0x3c38ff1e,0x3c2832cc,0x3c1ab950,0x3c140c68,0x3c0eb6d7,0x3c095d2f, +0x3c07d827,0x3c02a103,0x3bd4c5f5,0x3bd9dfc3,0x3be11984,0x3c07af41,0x3c232809,0x3c2f3e8f,0x3c278bd7,0x3c17bebc,0x3c149c86,0x3c0375f4,0x3c083d1b,0x3c03c22f,0x3c17c6cd,0x3c226d9a,0x3c2d9d44,0x3c3500cc,0x3c747c9d,0x3c4f3529,0x3c51f8c2,0x3c52977c,0x3c586688,0x3c5de95e,0x3c62bded, +0x3c688b6e,0x3c59fdb7,0x3c5047ff,0x3c46a142,0x3c3cee04,0x3c37516b,0x3c33c823,0x3c38e0a8,0x3c3a5f80,0x3c3bbedf,0x3c3c9722,0x3c3a9afb,0x3c3e7603,0x3c554ecf,0x3c60ca48,0x3c676b99,0x3c59bcd2,0x3c6b433c,0x3c83836b,0x3c80cf2c,0x3c7ff291,0x3c7a3ca0,0x3c7aaf4c,0x3c7502de,0x3c6e29b3, +0x3c7107f5,0x3c5fb52f,0x3c759279,0x3c78c5ce,0x3c8122cb,0xba497472,0xba7b5e1f,0xba8aa90d,0xbb3cc5fc,0xbb4bc392,0xbafe3a39,0xbb0b2b44,0xbae4fcca,0xbaa69ee6,0xba41e25a,0xba074a03,0xba5c9715,0xb9e0a1bd,0xba3827e0,0xbadd571c,0xba9895bc,0xbaa18587,0xbad1d728,0xbaa0f534,0xba39b679, +0xb916a606,0x393b73a6,0x3a3d49bc,0x3ae1dc6e,0x3a8a51fe,0x3a2fcb88,0x389f558c,0xba65d612,0xba996917,0xbab9f6bd,0xb9c78b49,0x398a76b5,0x3a253d90,0x3a713b63,0x3a4ad7bc,0xbad06214,0xba395799,0xbacae70a,0xba83c3d4,0xbba4ee64,0xbbbe7371,0xbb400d32,0xbb80825e,0xbb80184e,0xbb58b130, +0xbb1970eb,0xbb1f5d22,0xbb5fa460,0xbad447d0,0xbae06d77,0xbb83ec11,0xbb23aff2,0xbb1818e9,0xbb2ec16d,0xbadec605,0xba0f9194,0x3afd2b6d,0x3b7cb75b,0x3b87e310,0x3ba17934,0x3ba40571,0x3b6a3b6d,0x3a9bd36e,0xba8b8fa0,0xbb176cef,0xbb0d0f8a,0x39237acd,0x3b116098,0x3b4add72,0x3bb05b87, +0x3b793b0e,0xbb72bfd6,0x38c21160,0xbae19ce3,0xba101ab2,0xbc3087a0,0xbc5f832f,0xbc11f799,0xbbfc5d19,0xbbc77957,0xbbc49736,0xba8142d8,0xba0aa7c9,0xbb610abf,0x39ccbe30,0xbad663ec,0xbbc7f751,0xbb839b2e,0xbb7f504b,0xbba93710,0xbb423366,0xba768b04,0x3bb48b68,0x3c004ddb,0x3c1e6bef, +0x3c30ba0f,0x3c3ec091,0x3c1dc21b,0x3b9a2c76,0xbaf309e9,0xbb9cae81,0xbb84cb77,0x3a702afe,0x3bc21e2e,0x3bd9fa11,0x3c2bfbb7,0x3c0265f4,0xbbb3b1c5,0x3a4306ab,0x3a946621,0x3c1fe7be,0xbbaf8d09,0xbc4b8241,0xbbc10376,0xbbb47228,0xbc033d34,0xbc1c39ee,0xbbb9acd4,0xbbe2b566,0xbc47a991, +0xbb995112,0xbb87a02f,0xbc226ec2,0xbbb52cf7,0xbbbaeeaa,0xbbc510b6,0xbb2b8d92,0x3ac9c1c9,0x3c458b63,0x3c8de169,0x3c9fd159,0x3ca736f0,0x3c85a24b,0x3c683621,0x3c80307c,0x3bab897a,0xba2fe75d,0xbb12852f,0x3ae6bca5,0x3c1c2ec2,0x3c6d3c20,0x3c831564,0x3c367a2d,0xbc38614b,0x3a8a98c3, +0xb9e2ad0b,0xbd2063c0,0xbd25c036,0xbd3511e3,0xbd301c2e,0xbd25e9a5,0xbce49a6a,0xbbda2b22,0x3bc2c385,0x3c7147d7,0x3c34077e,0x3b489615,0xbb9adfee,0xbccd0ea6,0xbc7d15e1,0xbc17d166,0xbb5bc248,0xbbc22300,0xbb8212aa,0x3b93bc6e,0x3c4bc11a,0x3c452a4d,0x3c3196d4,0x3ca275bc,0x3c9c53f9, +0x3c330752,0x3b0ea3f0,0xbb317fff,0x39f086cf,0xbc0828b4,0xbb8e6ce2,0x3c3e507f,0x3c1475b5,0x3bebb453,0xba1595c1,0x3c78ee4f,0xbce0e590,0xbd075703,0x3b8ffdd6,0x3c48ed42,0x3c0e46dc,0x3a7bb416,0xbb4f8b99,0xbc562fa4,0x3bfc04ad,0x3b8359b9,0xbcabefe7,0xbcbd8d64,0xbccc4d1b,0xbcc8bd7e, +0x3b2f9e1e,0x3c530252,0x3bcd6397,0x3bcc350c,0x3bdcd681,0x3b900820,0x3bbf5ccb,0x3c3f8f1e,0x3cc7fbd9,0x3b0ea2be,0xbb84374d,0xba42ce14,0xba7122f3,0x398552d5,0xbbd86f7f,0xbbedc536,0xbc26ae4c,0xbc99f576,0xbc992fb6,0xbbc2267d,0x3c863665,0xbc5dcc60,0xbc99916d,0xbd891948,0xbdd31597, +0xbddc9465,0xbd95fbae,0xbd50833a,0xbcc49b72,0xbcae38d5,0xbb1e2fde,0xbc0ad393,0xbcc16a82,0xbc879d15,0xbc4248c5,0xbb064adc,0x3b44bb43,0x3bd97732,0x3ae87ac4,0x3bc8a23b,0x3bbca316,0x3b917409,0x3c6fc2bf,0x3c7d5a48,0x3ca08ee2,0x3a670dc9,0xbba6b8ef,0x37c31e32,0xbbc45af5,0xba80d201, +0xbb87e355,0x3a37975c,0x3ad92c3e,0x3b947381,0xbbdd7893,0xbc723ce0,0xbc3e7b2e,0xbbf6e36d,0x3d9a59a7,0x3dc4a8d8,0x3dd1fda7,0x3da52a1a,0x3d2616c2,0xbc95633a,0xbd2ba114,0xbd19a405,0xbbb96c04,0xbbfc04b5,0xbd189d64,0xbd5cb38b,0xbd474b8f,0xbc7500ca,0x3b59d4f4,0x3c5158f3,0xbad1be95, +0x3b25a33c,0x3a9a88a1,0xbb8a81a0,0x3bb29bef,0x3c4211d6,0x3c6de584,0x3bddd65c,0x3ba2e004,0x3bd33955,0x38389b20,0x39de8479,0xb91926e9,0x3bb6255b,0x3c1670aa,0x3c124dd5,0x3cd0a958,0x3d2ca15d,0x3d621a4c,0x3d810638,0x3c4af262,0x3c0c46da,0x3bfc1e2f,0x3cbdbc3d,0x3d5979fd,0x3d7e5ecf, +0x3d7939ed,0x3d2cd220,0x3c731f84,0xbc2c29b5,0xbcc3a934,0xbd56ebb5,0xbd777f02,0xbd3f8709,0xbd2f3188,0xbcf81f88,0xbc84ecbc,0xbc1e25f4,0xbbcfe967,0xbb3230b8,0x3b749e77,0x3beda0e2,0x3c89c94c,0x3b9bdcf5,0x3b16497a,0x3ba2b639,0x3c635c7f,0x3c8d5948,0x3c54c7dc,0x3c8ed510,0x3caa0a26, +0x3cc70a00,0x3caafeae,0x3ca42faa,0x3ccc0b50,0x3c9bb7e8,0x3ccce4a6,0x3ca8bb00,0x3c9bf328,0x3c6cfe60,0x3bd7d27b,0x3c0f2ed5,0x3c7c9055,0x3ce8403e,0x3d2eac47,0x3d3d6221,0x3d2d09de,0x3d17b032,0x3cd47a54,0x3ba8883b,0x3c071cd0,0x3b016ecd,0xbc1722f2,0xbb834e81,0xb99792a1,0x3ba2400a, +0x3c0a85a9,0x3beb0cda,0x3c6b79bc,0x3c631198,0x3c7c0762,0x3c557b1c,0x3c2612f2,0x3bb5036e,0x3b66913a,0x3b8aa7d8,0x3bcea161,0x3c50058f,0x3c4559dc,0x3c7ce739,0x3cac9fb9,0x3cc36bdc,0x3c27a993,0x3c1cb779,0x3bf77481,0x3b903166,0x3aec83d2,0x3b63171d,0x3b326bba,0x39861cc4,0x3b84f48e, +0x3c1b39a0,0x3c8500e1,0x3c6626c6,0x3c63273e,0x3c581805,0x3c8c2d06,0x3ca63ea5,0x3cc618ad,0x3cb79f3f,0x3c97e6d3,0x3c77a7c5,0x3c89d383,0x3c9517b0,0x3c9927f9,0x3c748048,0x3c2f91ac,0x3c15a70d,0x3c2cfd96,0x3c69973e,0x3c6c778b,0x3c8e7ff4,0x3c94a4f8,0x3c9e5a7f,0x3c9a422c,0x3c99afa0, +0x3c9a4f78,0x3c6ca186,0x3c2e2caf,0x3c1557f6,0x3c22fd45,0x3c2ed2b3,0x3c3693f3,0x3c374081,0x3c46139f,0x3c59ae24,0x3c5219ca,0x3c3251af,0x3c1ace12,0x3bf801d3,0x3bce2b1f,0x3b8f3473,0x3bacbe20,0x3bc57ecf,0x3bfbeb96,0x3c0b9136,0x3c410e45,0x3c6236d5,0x3c0cf89d,0x3c0ae9e6,0x3bef48ed, +0x3c062d3d,0x3bfb3766,0x3bdd3730,0x3bd64599,0x3bc83daa,0x3bbba341,0x3bc72368,0x3bbf3b4c,0x3be9d1c1,0x3bf1c11d,0x3c07002e,0x3c097251,0x3c090d7d,0x3c0ee3d6,0x3bc6ca25,0x3be1c35a,0x3beaf7ec,0x3bf9d345,0x3c0297ab,0x3c04a805,0x3c08d4a6,0x3bf43d1c,0x3be89285,0x3bd84343,0x3bdaaed7, +0x3bd5b7ab,0x3bc04608,0x3bec5ad4,0x3c024f7c,0x3c0c1579,0x3c1eaf22,0x3c26286c,0x3c40be37,0x3c2883e6,0x3c33345e,0x3c464492,0x3c0c6dcd,0x3c16960a,0x3c382a08,0x3c3caf55,0x3c3fb964,0x3c47e5b1,0x3c48401a,0x3c4caec8,0x3c4ddd07,0x3c25204e,0x3c00e1a3,0x3c4bc0af,0x3c222952,0x3c00683a, +0x3a86ae4f,0x3999b03f,0x3ad71f96,0x3942e2b7,0x38369717,0x39415e2a,0xb9af32c7,0xb9692886,0x39d0564f,0x37c7fbb0,0x39cc35cd,0x3a96f5cd,0x3af27971,0x3ad7fe5d,0x381d7ebd,0x3a1facd7,0x3a063c1c,0x382403f7,0x3a0c1646,0x3a44a165,0x3a4ecf8a,0x3a348c04,0x3a65825b,0x3a7793c9,0x3b191f50, +0x3aadd065,0xba0f13c2,0xbab3c0ff,0xbad38c91,0xbadda55f,0xb9c44946,0x398e2883,0x392b0a7b,0x3ad1b366,0x3af078cc,0xbb04f7d2,0xb8eaa410,0x3aab87d1,0x3b5bfbc8,0xb970c9ed,0xbada7c7b,0x39054c87,0xbad601e7,0xbb00296c,0xb9fdead0,0xbb06cbe0,0xba85fcbc,0x3a7fad16,0x3b5ecf22,0x3b5c095a, +0xbaa27c07,0xb83e703c,0xba40f82b,0xbaf3c6f5,0xba04aeb1,0x39273bfb,0x3a23c61f,0x3b10e75d,0x3b79cb2e,0x3bb0b633,0x3bd123fb,0x3ba09258,0x3aa9296c,0xb9d97446,0xbac6be15,0xbaf29267,0x3b037a77,0x3b856e09,0x3b591ec6,0x3bcd01b9,0x3ba3e6cf,0xbaea0b06,0x3b391e96,0x3b46873f,0x3b61b2b5, +0xbaa603ec,0xbaedf87d,0x39f8c140,0xbbc9fb36,0xbbc99ad1,0xbb1761e3,0xbbafe1df,0xbb141353,0x3b29b4c4,0x3bf2221d,0x3bdbe7e0,0xbb583435,0xb983ef92,0xba78f853,0xbb75f6b2,0xba7da473,0xb8aeee9f,0x3ad9cf7e,0x3b9da6b4,0x3bdfde26,0x3c21f91b,0x3c4fc159,0x3c2e3b3f,0x3b1583cc,0xbb17c9f7, +0xbb977257,0xbba3bd71,0x3b3d25e4,0x3be89e01,0x3bb0da58,0x3c3253d8,0x3c118f34,0xbbb3a6aa,0x3b7e80e6,0x3c7a8fad,0x3c4694b3,0x3a702e51,0x38352741,0x3bccdc96,0xbbac2fa0,0xbbe49604,0xbb69db89,0xbc1550ea,0xbbbbcae1,0x3a20e155,0x3c1c4e3d,0x3c2e7fd8,0xbb916a41,0xbab62c21,0xbb560be9, +0xbbf518a2,0xbb225fe9,0xb973ce44,0x3b671c88,0x3c3ae8d7,0x3c69a8f5,0x3c8a55d9,0x3ca5aba1,0x3c93ead1,0x3c406128,0x3b240cb0,0xbb81bbd7,0xbb92e481,0x3b551133,0x3c53faff,0x3c61145c,0x3c9a980c,0x3c794aef,0xbbada0af,0x3c2d2247,0xbcd2bced,0xbd16c694,0xbccd1343,0xbcd34c46,0xbca7dff4, +0xbcc41ce7,0xbca74f84,0xbbb98cf6,0xbb9a077f,0x3bc986dc,0x3cbfd1d2,0x3c57f77d,0x3bb4fa5d,0xbb747f66,0x3b2190f8,0x3b77b00c,0x3a700ae5,0xbade1b16,0x3981e8f8,0x3b88bc69,0x3c0a39d0,0x3c2bed60,0x3bdf541a,0x3ca15237,0x3c9cd54b,0x3c10c2b5,0x3a87a62a,0xbb938f56,0xbb2bfc2f,0xbc19543f, +0xbbdf74e8,0x3b104185,0x3c26a9e0,0x3c31963e,0x3a40df20,0xbc12c79b,0xbc3e0388,0xbc299cdf,0x3b1ee502,0xbaadd935,0x3af455fb,0x3b5fe14f,0x3b7c02f0,0xbb8e3249,0x3bf62ba8,0x3bdf294a,0x3c021c0d,0xbc742f10,0xbca8cbe1,0xbcc58b9d,0xbc9fa29f,0xbc58e42f,0xbc0bb5c7,0xbb3f6db8,0x3a176eec, +0x3ba3ba63,0x3c3f33e9,0x3c64f96f,0x3c9a5af1,0x3a42ce8e,0xbb85de39,0x39e9dda0,0x3acd5ac8,0x3af47243,0xbc02be68,0xbbe44a31,0xbc106458,0xbc4fc542,0xbc332b9f,0xbbf03680,0x386799a1,0xbb8db54c,0xbd319fe6,0xbd97fdb8,0xbdbd6375,0xbda87510,0xbcf0ec2e,0xbd047ac7,0xbcf18aad,0xbcbc57a5, +0xbc2ca884,0xbbaba66c,0xba6b855b,0xbca92dc8,0xbcdc7468,0xbcc7bbab,0xbc142d11,0x3a25af99,0xba4ea9f9,0xbb52c6ee,0xbb23a7f8,0x3ad50573,0x3c2ca33b,0x3c1589fb,0x3b61c88c,0xbb388577,0xbb321124,0xbb19efeb,0xbbabf321,0xbb111069,0xbb665525,0x3aa1b9bc,0xba97f85f,0xbaf38834,0xbc16c8c7, +0xbc6f132e,0xbc9d2326,0xbcd5d486,0x3db275a3,0x3db67a9f,0x3d880e1f,0x3d0891fe,0x3c3a51eb,0xbd4fc29c,0xbd742fa3,0xbcb3aa0a,0xbcc15e2d,0xbcb23670,0xbc9a7cd8,0xbcf68d28,0xbd02fd00,0xbcdd6ebd,0xbc887ae6,0xbbfae53a,0xb9fad7c8,0x3bd14e38,0x3becb6fd,0xbaf08d3c,0x3c57d145,0x3c6dd868, +0x3be35ad3,0x3b7e8177,0x3a3bcdb8,0xba4a2bb2,0x3aa5d992,0x3b0b03f0,0xbab8cff3,0x3b373030,0x3be30f30,0x3b91cd53,0x3cc31aca,0x3d22b057,0x3d6ebd91,0x3d9070c9,0x3cbd3f9e,0x3cde9d86,0x3d2d51c8,0x3d62044c,0x3d9717ff,0x3d725aaa,0x3d182ae3,0x3bf86359,0xbca8c831,0xbd1bf205,0xbd497440, +0xbd191348,0xbd052a54,0xbd2000c5,0xbce09fbf,0xbcd4936a,0xbcafae03,0xbcd0a273,0xbcc4a735,0xbc5afde4,0x3ae2713c,0x3b7e29c8,0x3beeb348,0x39e98255,0x3aebfff5,0x3c33315b,0x3c0c6ecb,0x3c1981db,0x3c25acb6,0x3c80a0b0,0x3c9ec985,0x3caac5b8,0x3cafe046,0x3cbce0fd,0x3cd5286d,0x3cd96152, +0x3c9a1797,0x3c8224cf,0x3c378336,0x3c076bc1,0x3c17a204,0x3c7c102a,0x3cd2730c,0x3d137254,0x3d324437,0x3d2d3c88,0x3d0327ac,0x3cc83dfa,0x3c5637a3,0xbaf20d02,0xbc0997f7,0xbc44d7f8,0xbc85ecb3,0xbc3a57cc,0xbbd965a9,0xbaa05d29,0x3b7d47d5,0x3c180ff6,0x3c9d13bb,0x3c8fe6db,0x3c720f80, +0x3c11f090,0x3bd2284d,0x3bdd4f8c,0x3c336fc6,0x3c33d0db,0x3c36b6f1,0x3c2eb33f,0x3c3ee685,0x3c5a0943,0x3c6c3781,0x3c970b6a,0x3c8da6d9,0x3c95ac56,0x3c787e15,0x3c43fff6,0x3c04d254,0x3c17ae1a,0x3c001a19,0x3bb410d8,0x3c202651,0x3c81a16f,0x3cc34459,0x3cc5eade,0x3ccc1a5a,0x3ccd28ed, +0x3cc60d3f,0x3cbf5789,0x3cb2db5f,0x3ca6c64a,0x3c931190,0x3c72d0f3,0x3c760a96,0x3c7da405,0x3c7d2e73,0x3c761360,0x3c6ea507,0x3c7a9329,0x3c866e5b,0x3c9af3ef,0x3c982633,0x3c95df71,0x3c926d1f,0x3c9020d6,0x3c9653db,0x3ca1369a,0x3cac0049,0x3c9a7353,0x3bba094a,0x3b9b8a14,0x3bba90ea, +0x3bdbfd9d,0x3bf76338,0x3c0a6834,0x3c25709c,0x3c40bfae,0x3c5bdb82,0x3c59aa0b,0x3c570359,0x3c4c7091,0x3c4e4af6,0x3c4c082f,0x3c6bf8cb,0x3c84e55a,0x3c98ae54,0x3ca726f9,0x3cbdfed3,0x3cd0ee99,0x3c9259d0,0x3c9223d6,0x3c7f56d1,0x3c6543c9,0x3c2f1323,0x3c0c286f,0x3bf9b8ca,0x3bdbba45, +0x3bbd9be7,0x3bb9fb6d,0x3b9bce03,0x3b956ee3,0x3b987540,0x3b9f4172,0x3ba13d43,0x3b9e8ea7,0x3baac077,0x3b848e25,0x3b9d200c,0x3ba7b719,0x3bb6e8c8,0x3bb97daf,0x3bb60bed,0x3baf24cf,0x3ba904db,0x3bb0465d,0x3bba3b24,0x3bd4fef8,0x3be5d76a,0x3be8621d,0x3c060127,0x3c12f95f,0x3c1e3a83, +0x3c2d561a,0x3c3426a2,0x3c584b41,0x3c3466d0,0x3c271ec5,0x3c0bd6b6,0x3c063267,0x3bf8003c,0x3bcec3ba,0x3bd9bbd6,0x3bded050,0x3be74bba,0x3be66968,0x3beda2f1,0x3becef11,0x3bc3bc01,0x3ba11598,0x3be2302b,0x3bbaf9e8,0x3b94ebea,0x3b3a93c5,0x3b2f1276,0x3b2f2e5a,0x3b2831a7,0x3b1b593d, +0x3b1a1598,0x3a9c5e95,0x3a8e4cad,0x3b1025be,0x3a71b2a8,0x3aa6ce9c,0x3b0cf66b,0x3b76faab,0x3b7b3b7f,0x3b0ad540,0x3b12be8f,0x3af8eacd,0x3ab4177c,0x3b0996d4,0x3b145737,0x3b0683bb,0x3b1da7cc,0x3b2e5045,0x3b301a9a,0x3b808538,0x3b3a286a,0x3a263344,0x39b94625,0x3918d03d,0xb8cc34c9, +0x3acc084b,0x3b0dcb3b,0x3acbd5b0,0x3b54df05,0x3b6390b2,0xb956a3ce,0x3b0cdac3,0x3ba3ba2c,0x3b7aa930,0x3b4e1639,0x3b54cbad,0x3b9694d6,0x3b5b23fb,0x3b47e795,0x3ba31638,0x392d7008,0x39103a49,0x3ae3fadd,0x3bc07531,0x3bcecaa5,0x3ab986c4,0x3b056bea,0x3a8fc58c,0xb983697e,0x3a6b58c3, +0x3a9bb9ca,0x3a2cb4ba,0x3b0cac7b,0x3b942afd,0x3be26442,0x3bf0586e,0x3bc1b483,0x3ad19f7d,0x3a6aff00,0x396d93e9,0xb9cdb9e1,0x3b811f38,0x3bb3fc5c,0x3b7caca1,0x3bd7278f,0x3ba479e7,0xba80cbcb,0x3b8c7eea,0x3b8d366d,0x3a995df2,0x3af3aa8c,0x3b1daafa,0x3ac2efd4,0xbb0a3ce3,0xbb20f72c, +0x3ac52f9e,0xbbf517db,0xbb9c71c5,0xba701aa0,0x3c1f2c09,0x3c2672e0,0xbac1b742,0x39bbaa28,0xbacd7724,0xbb782aad,0xba11da92,0x3a2280a1,0xb9030bab,0x3b7c03b8,0x3bdf402c,0x3c3ee6df,0x3c4da97f,0x3c245a3a,0x38d069cc,0xbac279c2,0xbb3cf4d1,0xbba127e5,0x3b91fa28,0x3c02d38e,0x3b80f85f, +0x3c2b1e1b,0x3c18779d,0xbbb9c15d,0x3b6b5295,0x3c32b29d,0x3b3af7d6,0x3a6ff301,0x3b607cb8,0x3c0f742b,0x3c167e18,0x3c166de2,0x3c368d34,0xbb9c7c49,0xbbe7debf,0xbb9f8407,0x3c38eb11,0x3c66d670,0xbba442fc,0xb9a84bb3,0xbb1a8335,0xbbe92ecb,0xbb7d6263,0xbb4e9af1,0xbb627107,0x3b7f31d1, +0x3c313a7d,0x3c82d973,0x3cae5a97,0x3c95d855,0x3bd7a548,0x3a38687f,0xbba9cda4,0xbbd3138e,0x3bb1002a,0x3c730212,0x3c243304,0x3c9016b4,0x3c29d75d,0xbc3f5837,0x3ba3fbae,0xbd199f27,0xbcf00feb,0xbbba9ae5,0xbb7ecfec,0xbc9e9b4d,0xbd084787,0xbd15b859,0xbcca5ab4,0xbccd869b,0xbbaeefc2, +0x3cde53cf,0x3c70ee73,0x3becc5d8,0xba37c040,0xbc08ed67,0xbc0f1ef3,0xbb7e40fc,0xba25c6b5,0x3bb57f9d,0x3c5b7562,0x3c1fc186,0x3c4035d0,0x3c3c3165,0x3c95d695,0x3c857b60,0x3be1dfef,0x3a6ebc1a,0xbb8b6d1f,0xbb86e941,0xbc349db9,0xbc003e77,0x39c4bc45,0x3bf44bab,0x3c2dee85,0x3c1aeac9, +0xbc9b8e31,0x3c193f7f,0x3aa3acdf,0xbc7c263d,0xbc90e8e8,0x3b3de7e2,0x3c7fcf96,0x3c9f0aeb,0x3c4a14f8,0x3c30508c,0x3b8f30f7,0x3bc34a96,0xbc4a5f77,0xbc844a53,0xbc396908,0xbc5b4582,0xbc4d0a7b,0xbc5ae9d5,0xbc249af2,0xbbae8f0d,0x3ab54cd8,0x3c27b52f,0x3c3dfd62,0x3bdb265d,0xba84353e, +0xbb3606f6,0xba45663e,0x3b2a7101,0x3adb2439,0xbc06a041,0xbbeb797e,0xbc0212c0,0xbbc8b373,0xbc5f6ceb,0xbc9421bf,0xbc4998f4,0x3b83baeb,0xbd69c9ad,0xbd93d0a1,0xbd312ba8,0xbcb2f21b,0xbbd3c7d9,0xbc8b95c3,0xbd023247,0xbd10e850,0xbccf81ef,0xbc43379f,0x3b5a2170,0xbc59b03d,0xbcb7a846, +0xbcd9b890,0xbcc72b28,0xbc994c51,0xbc42e7fa,0xbc2a374f,0xbba7f832,0x3a3f7e51,0x3c468525,0x3bfddc84,0xbc14ff43,0xbb6f6567,0x3a820f3a,0xbac0b9b8,0xba15d7d0,0x3a2bd735,0xbaefe850,0x3b45ea4c,0xba9ec596,0xbba80052,0xbb786e50,0xbc25380f,0xbcada7f4,0xbd1ebbeb,0x3d97f8fc,0x3d4e899d, +0x3cc811a7,0xbc0f84d0,0xbd1f659f,0xbd48ea07,0xbd2561c7,0xbca211ac,0xbcdb8d3d,0xbcfa879e,0xbccfa5d3,0xbc89d187,0xbc828870,0xbcdc05a7,0xbc902f58,0xbc58804e,0xbb86ba9e,0xbb5875ca,0xba81a7a5,0xbbc9e941,0x3c6107d2,0x3c547123,0xbb9fba2a,0xba0e3657,0xbacf0acd,0xbb81566a,0xb9ef77e9, +0x3aa036b9,0xbb104ef7,0x3a28ff72,0x3b97df9e,0x3ab94c11,0x3c80c61e,0x3ced959a,0x3d5593aa,0x3d80fef9,0x3d1f8d52,0x3d4c8555,0x3d8dec50,0x3d9540d2,0x3d8e0fb3,0x3d38faa4,0x3c233023,0xbd04442d,0xbd20c34d,0xbd1df649,0xbd1b360d,0xbc57ba95,0xbc3c3564,0xbcffd798,0xbcb42439,0xbccd8527, +0xbd0242f7,0xbcf1d0f6,0xbcbd7f3d,0xbc8e2f88,0xbb77ef7a,0x3a9157c4,0x3aa635ed,0x3b19b5a4,0x3ba35d19,0x3c5c1151,0x3bac6320,0x3b3eb09e,0x3ba2ed01,0x3c578914,0x3c9ad3c6,0x3cb54304,0x3cc627a8,0x3cdaa886,0x3ce1cdff,0x3d10a054,0x3c720164,0x3c7b04e4,0x3c7bb87a,0x3c93adca,0x3cbabee7, +0x3d0a1094,0x3d2c095e,0x3d2d6d6b,0x3d16cc99,0x3ccf96b0,0x3c1899a8,0xb4cf3794,0xbc148174,0xbc914aec,0xbcd2e003,0xbcb9269e,0xbc13d27a,0xbc00cef4,0xbbc1afa4,0xbb38338a,0x3ba64f41,0x3c319575,0x3c6b96d6,0x3c62fef7,0x3c40cd58,0x3c216ab2,0x3c2b0f9e,0x3c5181da,0x3c709f26,0x3c8e79ab, +0x3c861558,0x3c52b7b8,0x3c587045,0x3c59ea9e,0x3c44b7d7,0x3c7cb01f,0x3c9b0fbc,0x3c9aa569,0x3c8ff7f1,0x3c888211,0x3c60923d,0x3c77a23c,0x3c81862d,0x3c962404,0x3cad990c,0x3cd8c66a,0x3d07c5c5,0x3d082e69,0x3d07dbcd,0x3d09eacb,0x3cfcc1b2,0x3cdedd70,0x3cbfe233,0x3caecd57,0x3cb15a3a, +0x3ca6ec7b,0x3c856c7e,0x3c7a9939,0x3c677556,0x3c678bfb,0x3c7b5cb9,0x3c6901c7,0x3c86f8e9,0x3c80f891,0x3c8edd91,0x3c66f308,0x3c5efa86,0x3c3b4334,0x3c6e9f51,0x3c9064c8,0x3ca8f0f2,0x3c9d38a1,0x3bb44775,0x3c064d3d,0x3c042b2b,0x3bfd52a3,0x3c02588d,0x3c09af32,0x3c127513,0x3c12a35f, +0x3c34ce28,0x3c419ff2,0x3c4ffea0,0x3c61c738,0x3c7cf8b1,0x3c8bb530,0x3c95ec6a,0x3ca2a2d6,0x3ca9b510,0x3cb92939,0x3cbb80d9,0x3cc9264d,0x3ccdb9a6,0x3cb537e6,0x3ca251c2,0x3c8ba4b3,0x3c70023f,0x3c45e21e,0x3c3266e2,0x3c1e08fd,0x3c169665,0x3c0a52b8,0x3c0ad06c,0x3be3f548,0x3bf3d345, +0x3bd1cbd1,0x3bd6b7cf,0x3bf73768,0x3b9ba2e8,0x3be8a2c0,0x3bdc47ca,0x3be75821,0x3beb99ae,0x3be24da6,0x3bd95686,0x3bc7695c,0x3bde0f2b,0x3bf5851a,0x3c07619a,0x3c18be57,0x3c271ded,0x3c37ea72,0x3c30e697,0x3c2e5660,0x3c2e5edb,0x3c27d7c7,0x3c240484,0x3c211554,0x3c1e4037,0x3c0eca1c, +0x3c05ab0c,0x3c01e542,0x3be48162,0x3bb2f2f1,0x3bb1936e,0x3bab7858,0x3b98a2fd,0x3b91d71d,0x3b820326,0x3b7af8f0,0x3b9780bf,0x3bbf69ca,0x3b51d115,0x3b834e1c,0x3bd4e669,0x3b33e073,0x3b21be32,0x3a8d3301,0x3b04a75e,0x3b1a6753,0x3b55c0e5,0x3b1cac4c,0x3b02406f,0x3b271169,0x3a871e69, +0x3a571eb0,0x3966b0cb,0x3b3f8ff5,0x3b66f0a9,0x3b4861ff,0x3b1bf065,0x3b03ba32,0x3adf7d46,0x3b0c2072,0x3b143453,0x3b0cd7ea,0x3b3b6ce1,0x3b643cf9,0x3b96d615,0x3b71fd58,0x3b4a16a8,0x3af39879,0x3b00678b,0x3af3c053,0x3ad0b1c1,0x3b45de22,0x3b628ec4,0x3b2b8359,0x3b6a34cc,0x3b5e2c00, +0x3a7e30dc,0x3b2e6aa1,0x3bb82f73,0x3af76aaa,0x3b3e49f0,0x3b63c6a6,0x3b9c0c89,0x3b6a74f8,0x3b454c53,0x3b9be931,0xb98a10be,0xbab28936,0xbb14e7f6,0x3b81c054,0x3bbffbce,0x3b8c0729,0x3b007816,0x3a204614,0x3a0060a7,0x3a9c95de,0x3ae4c492,0x3acb1777,0x3b42a392,0x3ba7f35b,0x3bff973b, +0x3bd4d0a7,0x3ba568da,0x3acb2018,0x3a7b5275,0x3a2c3f10,0x3a42abbf,0x3b84c3e4,0x3ba62007,0x3b63540c,0x3bb9a410,0x3b974bd9,0xb9b85a81,0x3b97ecc2,0x3b1f5c60,0xbb2f3416,0x3a311b0d,0x3b0003ab,0x3bb983ea,0x3b7dcb7f,0x3ac40411,0x3b6cdda4,0xbbc6892e,0xbbdd76d3,0xbc168512,0x3b9da825, +0x3c0a00e8,0x3bac760f,0x3ab5a039,0xbaa03950,0xbb02698b,0x38df2f1c,0x3ab7e249,0x39ec9a87,0x3b84520d,0x3c030601,0x3c5c449b,0x3c32d5c5,0x3bf489e8,0xb8aac6b4,0xbaa8e330,0xbaeb2c93,0xbb437964,0x3ba44181,0x3bec3108,0x3b2adc4f,0x3c164c51,0x3c0c5331,0xbbc47321,0x3b5f6c95,0x3c63ce2c, +0x3b64053f,0x3ba3ee99,0x3ba4ca1f,0x3c0699e7,0x3c2b2758,0x3bf4c32a,0x3c42cf6d,0xbb8e12f2,0xbc248f79,0xbc72b326,0x3b68bc54,0x3c384fe5,0x3be82581,0x399481b6,0xbb8445a6,0xbbab93e5,0xbb31dbae,0xba9714e6,0xbad32ed3,0x3b714cfb,0x3c33c10a,0x3c8f2e88,0x3c95c013,0x3c7c668e,0x3b84f98c, +0xba02dc0a,0xbbb66863,0xbbd69397,0x3bde2a4e,0x3c6cdf17,0x3c08997d,0x3c7fa446,0x3bf3d4d5,0xbc2ec14a,0x3c2da9b1,0xbd2d6377,0xbca44a0a,0xbbbf30c2,0x39013da4,0xbc32a3d6,0xbca2ce33,0xbcc7d15c,0xbc961592,0xbd051b9b,0xbcacab80,0x3c3cedf2,0x3bee3339,0x3bf64ced,0x3b5b9ae8,0xbc29ea66, +0xbc43d28b,0xbac63f22,0x3a9431be,0x3ba869b8,0x3c4807d0,0x3c27813f,0x3c566037,0x3ca583d3,0x3c84766c,0x3c3c4b4d,0x3b6cc668,0x3b0d1bf4,0xbb127e2c,0xbbb9469b,0xbc2668e2,0xbbe3cf1e,0x3aa05dd5,0x3bcda3fe,0x3c3fc460,0x3c9deaa3,0xbcd0525e,0x3c51ca61,0xbb9eaecd,0xbc685162,0xbc4c70a5, +0xbac020e3,0x3be731e9,0x3c070a22,0xba813114,0x3b0c4334,0x3ba67cab,0x3c46e7ff,0x3b21cc1c,0xbb66c967,0xbc6ae2e9,0xbc0e5df7,0xbbedf897,0xbc4bb431,0xbc18e023,0xbb885585,0x3a95f3d6,0x3c2ea044,0x3c10fe7e,0xbb5a4ad1,0xbb3c1281,0xbb0d3991,0xbb2a856d,0x3a2b9a4f,0x3941f930,0xbbf9115a, +0xbbb7eeb8,0xbc0d4d33,0xbc402462,0xbcc03a74,0xbcdd55b0,0xbcadab68,0x3bafacd2,0xbd3fafb0,0xbd1e5a83,0x3bcdc86f,0x3c755e20,0xbb84a88c,0xbc3d63a3,0xbcd13cb3,0xbd1bd234,0xbce29519,0xbcc713e3,0xbcc74779,0xbc57dbee,0xbc1560d8,0xbc9ea321,0xbca716a9,0xbcaf5566,0xbc93b455,0xbc52c2af, +0xbbd601ab,0xbb4082d7,0x3c46ca25,0x3c1b57fe,0xbc5105ac,0xbaaf5273,0x3babe4e7,0xb9370b8e,0x3ac6e876,0x3a832953,0xbaa1fa96,0x3b15f2cb,0xbb04347d,0xbb21deef,0x3a929801,0xbc092b2f,0xbcd12d55,0xbd150e46,0x3d45481d,0x3c30c3be,0xbccff46a,0xbd463d5d,0xbd947869,0xbd035099,0xbc9a1d6c, +0xbd0c6692,0xbc7649d6,0xbc45d9ad,0xbc6fba05,0xbc63da1b,0xbc8b3d90,0xbccd73e3,0xbc79db3a,0xbc3f0de5,0xbbf06dc6,0xbc4466a9,0xbbff44dd,0xbba41725,0x3c4682f8,0x3c442d21,0xbc161d8f,0xbb7f96aa,0xbb9de811,0xbbebdcea,0xbb205460,0xba8a4bb4,0xbb8416bb,0xbab1483b,0x3a860bba,0xbb80381f, +0x3b966ce4,0x3c7f0530,0x3d1d70a2,0x3d417d29,0x3d57a849,0x3d8c624e,0x3d98fac2,0x3d884db6,0x3d2d30e2,0x3c607bdb,0xbca9d170,0xbd5a6af3,0xbd22b17b,0xbce4e0ea,0xbc5a2601,0xbb8fadd7,0xbaae01c5,0xbbaf3d17,0xbc87311f,0xbcba7154,0xbcc0f78e,0xbcaa8192,0xbc69bb45,0xbc5a270d,0xbbe53714, +0xbb6e1be6,0xbb4f713f,0x3b63daea,0x3bcdd183,0x3c3675f8,0x3b7710a3,0xb9036b02,0x3a6a2b4e,0x3c212d0b,0x3c889af7,0x3cbd8f21,0x3cee87f7,0x3d044362,0x3d043b43,0x3d33a09a,0x3c8f7baf,0x3ca1ff5b,0x3ce55c24,0x3d150b89,0x3d4181e0,0x3d6cd62d,0x3d6c51c3,0x3d35973a,0x3ccc02cf,0x3b3af11b, +0xbc7978a9,0xbcfc2075,0xbd16c4a1,0xbd0decd6,0xbcf2c8d8,0xbcc01982,0xbc4a16d1,0xbc2ebfc0,0xbbed2d25,0xbb7093dc,0x3b90c1d5,0x3c043543,0x3bd9340f,0x3b9a1bae,0x3b8e4922,0x3be71e5d,0x3c56482e,0x3c8b84b7,0x3c8c2451,0x3c9df1a0,0x3c9f344e,0x3c951abf,0x3c8f5b2b,0x3c90214f,0x3c85af69, +0x3ca202f2,0x3c99c13f,0x3ca6e4df,0x3cb72eb8,0x3cb6e9a9,0x3cb064f8,0x3cbf578a,0x3cd2cf3d,0x3cfb746f,0x3d03f2b3,0x3d13b2fb,0x3d26918f,0x3d1ab40d,0x3d0c04ee,0x3cf734d6,0x3cdfffbf,0x3cc4ae52,0x3cae8f78,0x3cae6cbc,0x3caec82d,0x3cb5728e,0x3ca29766,0x3c8102b5,0x3c57cf1f,0x3c4f4acf, +0x3c533d04,0x3c263c1a,0x3c3b77f8,0x3c2637cb,0x3c2f4ba8,0x3c1741ee,0x3c0df348,0x3bfe9457,0x3c3c1710,0x3c75470c,0x3c94a9ca,0x3c928c4c,0x3c1d64b7,0x3c565f93,0x3c5b8bd2,0x3c688cb4,0x3c7e6d82,0x3c886d6b,0x3c8e95e9,0x3c918b1d,0x3c8a5435,0x3c8080e5,0x3c753c5b,0x3c762772,0x3c84487a, +0x3c91251e,0x3c8c4205,0x3c890647,0x3c7b8e83,0x3c6e9285,0x3c4b803a,0x3c415436,0x3c884825,0x3c7db95e,0x3c7d49f4,0x3c646448,0x3c6bdca3,0x3c6e30c4,0x3c694787,0x3c61053c,0x3c5fc289,0x3c5ca758,0x3c68e8a0,0x3c4ca44f,0x3c4ec1c6,0x3c35a966,0x3c3ea93b,0x3c5338d1,0x3c35778a,0x3c6d0654, +0x3c67eb42,0x3c6fb96a,0x3c713f60,0x3c715bec,0x3c720880,0x3c74f8bc,0x3c7c7f58,0x3c83710a,0x3c8702c4,0x3c8bebe2,0x3c8de487,0x3c91faf4,0x3c86f3b7,0x3c7f35b0,0x3c74836a,0x3c652d93,0x3c5d2773,0x3c4143db,0x3c32babe,0x3c1fc569,0x3c08a952,0x3c474263,0x3c26506b,0x3bf6f5da,0x3bf693ee, +0x3bf4c804,0x3bea6eb0,0x3be3ad95,0x3bd72a71,0x3bd87166,0x3c1d32a5,0x3c4cf9d2,0x3bc31e4e,0x3c1511a1,0x3c83a66f,0x3b1c835f,0x3ad3cf2e,0x394266df,0x3adc3cc2,0x3b0e511b,0x3b4b541a,0x3b21c3f7,0x3b0c07ac,0x3b0c9bdd,0x3a89a238,0x3a23166c,0xba3d9520,0x3ae6b848,0x3b25a2a3,0x3b6dad33, +0x3b0516ba,0x3ae873f1,0x3afc3f8e,0x3b10d28b,0x3b1c7c41,0x3b246ea8,0x3b4ebeca,0x3b6ce050,0x3b9bc504,0x3b53935c,0x3b307ebd,0x3af4c96d,0x3af38ab2,0x3af8b48d,0x3b0c716f,0x3b3d0a82,0x3b4a02ec,0x3b15a0e0,0x3b4b37ea,0x3b405a21,0x3a9788b2,0x3b04ec59,0x3b86e579,0xba1663db,0x3a55615f, +0x3b05f777,0x3b901688,0x3b864a9c,0x3b7997d9,0x3b74325b,0xb9b3eeba,0xbb351a90,0xbbb640f5,0xb989f109,0x3b3e249e,0x3bcb473c,0x3b00fe6e,0x3a464c59,0x3acb75eb,0x3b0d7117,0x3b43bde9,0x3b50599e,0x3b8c099a,0x3bc2598c,0x3c049582,0x3bb85973,0x3b86fbb7,0x3aeb6ca1,0x3a4f502b,0x3a3fd030, +0x3af20420,0x3b7564e3,0x3b8a6edd,0x3b348dd1,0x3b8c12c7,0x3b812823,0x3aaf0ce0,0x3b8837aa,0x3a3568dc,0xbb812555,0x395df230,0x3b5243d2,0x3c039b83,0x3baa1f70,0x3b916589,0x3b29286b,0xbb87849f,0xbbee8b61,0xbc5244e5,0xb947bca8,0x3b925694,0x3c297a6f,0x3af79361,0xb92ee9f3,0x3a61490e, +0x3b0c4784,0x3b7dc2eb,0x3b4d8e22,0x3bc67081,0x3c1fc860,0x3c671992,0x3c1ee8c5,0x3bb60640,0x3a5db0ce,0xbaa9ac17,0xba5a5509,0x39006ce5,0x3b9fefb8,0x3bbda1bc,0x3ad699e2,0x3bea6040,0x3bec328e,0xbb549d0b,0x3ad37fe8,0x3c6ecc1e,0xbaa771e2,0x39587401,0x3bb0193a,0x3c3aad72,0x3c3c8337, +0x3c237b58,0x3c18f8ad,0xbb28f168,0xbc548620,0xbcc0b0c3,0xbc05b4e8,0x3ba4df91,0x3c87958c,0x3b209c2e,0xbb1d6c25,0xba942f39,0x3aa55580,0x3b7a6d0c,0x3b42da75,0x3be2bab9,0x3c462b7e,0x3c9c631c,0x3c850258,0x3c567b05,0x3b7e2a77,0xbaf9b838,0xbbc7f681,0xbb9f4fe0,0x3bf6bd23,0x3c4fcc4a, +0x3bc10689,0x3c507e49,0x3bdd5a96,0xbb91183f,0x3c46cc22,0xbd35f2a7,0xbc478416,0xbb86c886,0xb9304b6e,0xbc090637,0xbc204c84,0xbc660d14,0xbc4eefe2,0xbd11f5b7,0xbce23164,0x3c6add43,0x3c436010,0x3c25c153,0x3bf2aad4,0x39efe680,0xba235b0a,0x3b57b60c,0x3bbe2ad6,0x3bc4cb65,0x3bc09c97, +0x3c05140b,0x3c503535,0x3cc2607e,0x3c5c8c24,0x3beb96b3,0x3a543825,0x3b3ee3d9,0xb9fa8199,0xbbd54e1c,0xbc0a0b62,0xbbb23c4b,0x3a5d33f7,0x3bb07d42,0x3c31b20c,0x3caa99b6,0xbd0221c3,0x3c771f7f,0xbb44a59a,0xbb97335a,0xbc2e0c94,0xbcbe92a1,0xbb7c98bc,0x399cd0b3,0xbc6676e7,0xbb011b90, +0x395dc77a,0xbbc3d0a5,0xb848c8fb,0x3ae9ef53,0xbc39432d,0xbbfc60b8,0xbc042daf,0xbc02613e,0xbbbf6728,0xb9c450ca,0x3b4c7785,0x3c34102b,0x3c00679f,0xbbe70311,0xbb288f9a,0xb874db8b,0xba94694c,0x39854277,0xbabce0cc,0xbbcfbdbf,0xbba09a13,0xbc1eaf8f,0xbc594af1,0xbcb0a122,0xbcc2d60a, +0xbcb196cc,0x3c15466b,0xbcc5ed96,0xbbcf2a67,0x3c9226ef,0x3cbe4fd7,0x3befcd05,0x3aa127b1,0xbc2487dc,0xbd005eff,0xbcc75506,0xbcc44324,0xbcb930a0,0xbbc8591a,0xbb764342,0xbc7e7a36,0xbc758cf6,0xbc82bb55,0xbc657222,0xbc477342,0xbbeed2f8,0xbb99f3ab,0x3be1a9c5,0x3be103d3,0xbc2fa558, +0xbaab5a32,0x3bb26f44,0x394e1edc,0x3835a158,0xb96aee17,0x3a243d0b,0x391cf30c,0xbb959eca,0xbb2dec4b,0x39e5428a,0xbbff6371,0xbc9869d7,0xbcc7c281,0x3c550c8b,0xbcc8c308,0xbd9d0f1f,0xbdadf4f5,0xbd93f323,0xbcfc847b,0xbc6c7b8a,0xbced3ef1,0xbc5a13f9,0xbc0ee9f7,0xbc0ab641,0xbc0f2fe4, +0xbc165f4e,0xbc3ea18b,0xbc0a9357,0xbc0f5426,0xbc10adcb,0xbc32fadc,0xbbb92e28,0x3ad8975f,0x3bf3fa14,0x3bd87ea1,0xbbef003e,0xbbba4cc4,0xbbc46866,0xbbf5386e,0xbaaa06af,0xbb0db685,0xbbe9235d,0xbb9f1d7b,0xbb9f2b71,0xbc55c987,0xbbee433b,0xba19abd6,0x3c9a04b0,0x3cad926b,0x3d83bb86, +0x3da332f3,0x3d8eb3d7,0x3d4ba5f7,0x3cb49c39,0xbc998106,0xbd2e1757,0xbd414a45,0xbcfcd97a,0xbcaf90d2,0xbc675703,0xbc82e92d,0xbc091663,0x3b8c3ddc,0xbb840565,0xbc150311,0xbbde3930,0xbc12fc8f,0xbc1007f9,0xbc0efcbf,0xbbd6c62c,0xbb9ee3d1,0xbbb48fb5,0x3aa8c137,0x3b77b000,0x3ba7b5d4, +0x3af9de09,0x3910821b,0x3afefaf2,0x3c0bbd99,0x3c829ed5,0x3cc95705,0x3d18cef4,0x3d2ba547,0x3d21c805,0x3d5bf0a6,0x3cc209d8,0x3cd425a5,0x3d0e0c46,0x3d30cfcb,0x3d5df311,0x3d71571e,0x3d51ce92,0x3cee9096,0x3b4aa48f,0xbc9136ed,0xbcedc4be,0xbd2e7596,0xbd37839c,0xbd172c5c,0xbcec9f5d, +0xbcbdf413,0xbca84f30,0xbc7f137d,0xbc129bf4,0xbb1b070e,0x3b9e7bcf,0x3bd17c60,0x3afac71c,0xbaba9518,0xba8bbb21,0x3b6e5538,0x3c4f6ae0,0x3c94a6e9,0x3ca19323,0x3ca20bc8,0x3ca2d797,0x3c96495e,0x3cb0e6dc,0x3cbf10bb,0x3cb22d58,0x3cd1025d,0x3cb627c5,0x3cdc3f1a,0x3d01b9f2,0x3d0a158b, +0x3d111362,0x3d1427e4,0x3d20a29a,0x3d3bd2f0,0x3d33d085,0x3d2d9ba4,0x3d273e60,0x3d0ea176,0x3ce49240,0x3c9e2613,0x3c80e6b4,0x3c4c4cdf,0x3c0e1daa,0x3c24dc54,0x3c122ff7,0x3c31f016,0x3c65afe0,0x3c342b2e,0x3c3a8fa8,0x3c4934c2,0x3c4c4de1,0x3c4a2d24,0x3c29164c,0x3c268369,0x3c0c605b, +0x3c179863,0x3c09e288,0x3c0e8f41,0x3c38f330,0x3c60a0f0,0x3c81eda0,0x3c9d1976,0x3c7477fc,0x3cadef0c,0x3cb5b1e7,0x3cbe9caf,0x3cd11503,0x3ce221a7,0x3cecf51f,0x3cf67da5,0x3ce03661,0x3cd2d2b4,0x3cc7272b,0x3cc04439,0x3cbf9866,0x3cc1bdf2,0x3caf9b11,0x3c9c479d,0x3c879ea3,0x3c67963b, +0x3c3b7b67,0x3c0d962a,0x3c28f248,0x3c45274e,0x3c5ad041,0x3c5b14cd,0x3c69eda1,0x3c821aae,0x3c899958,0x3c909f07,0x3c9128fb,0x3c9a6daa,0x3ca56a81,0x3c9ef0aa,0x3ca28444,0x3c980389,0x3c95b284,0x3ca737fa,0x3c99dee5,0x3cb657a1,0x3cb26386,0x3cb861ae,0x3cb958a1,0x3cbb75e4,0x3cbe3975, +0x3cc56729,0x3cc3bc3b,0x3cc3ef93,0x3cc27233,0x3cc18a33,0x3cbed80f,0x3cbecdc9,0x3cb4da7e,0x3cae2e36,0x3ca7a522,0x3c9e84e5,0x3c98286c,0x3c8c7de1,0x3c82b4a7,0x3c7a09ad,0x3c5bba72,0x3c8f2faa,0x3c84694d,0x3c68b858,0x3c66f946,0x3c654298,0x3c68e592,0x3c652ae3,0x3c6326cf,0x3c68af28, +0x3c8d0526,0x3ca37a01,0x3c6293b8,0x3c8aa4a9,0x3cc04df7,0x3b21c88a,0x3ab13b92,0x3a02afc9,0x3aba9e7b,0x3ae904f0,0x3af7329f,0x3b35a101,0x3b3c5e99,0x3b1a7d47,0x3acd515d,0x3a8de235,0x39b0430f,0x3ab1e1c3,0x3b060719,0x3b798e2c,0x3b135ce6,0x3b092434,0x3b1fcaf0,0x3b30859a,0x3b3c4007, +0x3b4c0c47,0x3b5bf31c,0x3b612575,0x3b85ae02,0x3b3e555d,0x3b12f6b4,0x3ac6faa2,0x3aba91c2,0x3ac61250,0x3b13cfb5,0x3b154461,0x3b14338b,0x3adc25ba,0x3b14dda2,0x3b266e7a,0x3ac330d7,0x3ae13fbf,0x3af5638b,0xbaab9934,0xb9fcfec7,0x39543b49,0x3a5c7f98,0x3b60d2b0,0x3b747503,0x3affd51a, +0xba092ce6,0xbb2417ae,0xbb6b699b,0xbb0c4857,0x398a5895,0x3bad1aa8,0x3b074527,0x3af69dbf,0x3b42c6d0,0x3b6caca0,0x3b93d813,0x3b9425b1,0x3baa6b28,0x3bd265d4,0x3bf2b9da,0x3baa3365,0x3b75dda4,0x3af90c0a,0x3a93de1d,0x3aa90e75,0x3b3f2472,0x3b64e784,0x3b65bd37,0x3b1d6b82,0x3b2e7024, +0x3b29c9d5,0x3b1ec3ee,0x3b4f55cf,0xba6fc627,0xbbf8f98f,0xbb5ee354,0xb9fcb63a,0x39c4eacb,0x3bc46442,0x3bf57545,0x3b1f4b87,0xbaebcb48,0xbbab2d1a,0xbc0c1a1a,0xbb6c9a03,0x38e44eea,0x3c1bf475,0x3b0909ad,0x3aada8db,0x3b5dcf0f,0x3b976e38,0x3bd0dcc2,0x3bb9f0ab,0x3c0a61c4,0x3c316b55, +0x3c577fe5,0x3c0c4d0f,0x3b9c733e,0x3aa62f75,0xba0d0687,0x3a6063a7,0x3b32a92b,0x3b954871,0x3b860efe,0x3ab12596,0x3b853471,0x3ba40365,0x3a18c9c4,0x3aa6b6c8,0x3b70a533,0xbc45eb1e,0xbc1afb5f,0xbb8049ec,0xbae51bfc,0x3bd3118c,0x3c0c3c17,0x3b1ee152,0xbb62566e,0xbc4eb49c,0xbc9bb7cd, +0xbc70a6bb,0xbb76f4a2,0x3c343f9e,0x3b0447c0,0x39b562a7,0x3b53d462,0x3bb08577,0x3c067b27,0x3bdfbcef,0x3c1b09f5,0x3c56d62a,0x3c9ed049,0x3c79d403,0x3c372ddb,0x3b5f95be,0xbb194658,0xbbaf2943,0xbb02be9f,0x3bebf64d,0x3c1fb40d,0x3b521e39,0x3bfc51c4,0x3b676991,0xba899d4c,0x3bd2163f, +0xbd0fce90,0xbb74ff4f,0xbb0a49ea,0xb9fb6ab4,0x39e666ee,0x3bed093e,0x3b83b4fc,0xbb4e4edd,0xbcb90321,0xbc7c70e9,0x3ccb1008,0x3c5e43b3,0x3c16e59e,0x3c0a2e77,0x3b749b5d,0x3b716149,0x3ba12d28,0x3bf4dd3d,0x3c0369cf,0x3b9b3bd9,0x3c11b2b2,0x3c673397,0x3caf9fda,0x3c3e07cc,0x3bb300c6, +0xba11923d,0x3b2282cd,0x3a771f1e,0xbbc00ead,0xbba3dbdc,0xbb17dfa3,0x39c01a70,0x3be5880d,0x3c2fcf82,0x3c8d2c13,0xbce953b3,0x3c79ddc2,0x3ae1dfc9,0xb99c1e1a,0xbc183d37,0xbcfd0a04,0xbc510ece,0xbc0bb5a3,0xbc979453,0xbc64c05e,0xbc80274c,0xbc6baa6a,0xbc2ef2ce,0xbbc6b228,0xb98da226, +0xbb92137d,0xbbe2957e,0xbb7ee533,0xbae632ca,0x3b6ca035,0x3bd46f2e,0x3bfc5a49,0x3ba83211,0xbba53cab,0x3884fc44,0x3b61f18d,0x3b00ac32,0x3aa9635e,0xbaced436,0xbb8bac01,0xbb885bca,0xbc01c788,0xbc03b1e6,0xbc861aa4,0xbc990e9f,0xbc65b095,0x3c277e73,0xbc49884e,0x3bd3ab46,0x3c893050, +0x3c95aa09,0x3c40e89c,0x3c0db1f8,0x3a181676,0xbc91a64f,0xbca8fe0f,0xbca15fc2,0xbc39d075,0xbbd25863,0xbbcc4e8e,0xbb771967,0xbc05ccae,0xbc0cedbf,0xbb905e02,0xbc0b77f0,0xbba9bf8b,0xb9d75a1b,0x3b7edb28,0x3b8d7c0f,0xbbc49d4b,0xbb0469df,0x3b44c4ba,0x3a6bd00b,0xba260be5,0xb961fe8a, +0x3ad77451,0xba3cdf92,0xbbd04b13,0xbc077b76,0xbb4c3821,0xbc1a9f8b,0xbc6dae50,0xbc901708,0xbcafed87,0xbd5938de,0xbdc8d624,0xbdbf027f,0xbd4945da,0xbd126378,0xbcaba820,0xbc1e31a4,0xbc6ec9ad,0xbc55ce04,0xbbdce086,0xbbdb1683,0xbb6e69fc,0xb60f84a9,0xbba98abd,0xbc00db22,0xbbc0d5cd, +0xbb96d2a7,0x39d439c5,0x3c11b2f6,0x3ae14cfa,0xba8a48c5,0xbbb448bf,0xbb8f03fe,0xbb5f1058,0xbb5d122c,0x3a427184,0xba95f15f,0xbbe94339,0xbbf82f88,0xbc22dd35,0xbc9d019a,0xbc8dfc0b,0xbc864a53,0xbb8e5820,0xbc06c24a,0x3d8a1243,0x3d922066,0x3d627ccb,0x3cec7ea7,0xbb421374,0xbd1fe8d7, +0xbd439f26,0xbce77470,0xbcba7e61,0xbc9e3f56,0xbc9f41e3,0xbcb7eaf0,0xbca53663,0xbc5815d9,0xbb8233b6,0xba0955b0,0xbb1437a0,0xbbaf1b83,0xbbc42c91,0xbb46a7d0,0x3a428e1e,0x3b185131,0xbbbf23aa,0x3841ba4c,0x3a57a50e,0xba6822fd,0xba6e6722,0x3a0e40ba,0x3ba7014f,0x3bf54fb9,0x3c6e6d86, +0x3cb9e540,0x3d2d0f43,0x3d4b70ea,0x3d3a8595,0x3d6c2c4c,0x3cf3a812,0x3cf8a90d,0x3d128b89,0x3d20baa2,0x3d2aef02,0x3d2689c0,0x3cc6335d,0xbbc59a6b,0xbcb43188,0xbcf0c106,0xbcef66c9,0xbd0868ff,0xbd02825d,0xbcd9c3d3,0xbce9368b,0xbccc5d2a,0xbcb39c2b,0xbc86cf64,0xbc341462,0xbb72e813, +0x3b0a3953,0x3b19debc,0x3748ecca,0xba54c663,0x3a7f2fb8,0x3bdbabf6,0x3c53faae,0x3c9178f4,0x3cae9425,0x3cae27bc,0x3caf29f2,0x3c9fe2e9,0x3cbd30e2,0x3ccd8511,0x3cc8fdd3,0x3cee5382,0x3cdc1bec,0x3d03263f,0x3d1f7745,0x3d3410e2,0x3d4c365b,0x3d43218e,0x3d495792,0x3d57d62a,0x3d34c2c4, +0x3d0b1616,0x3cc71ced,0x3ca3c8ea,0x3c78474f,0x3c2942f6,0x3be5ba23,0x3b683c9f,0xbab4d4c4,0xba871791,0xbaf84848,0xba98eaee,0x3b8dfdcb,0x3bcce638,0x3c2c89e8,0x3c4f1d41,0x3c659bef,0x3c81fb01,0x3c532465,0x3c50c18b,0x3c2a4e82,0x3c4987d2,0x3c44704e,0x3c577d28,0x3c826ec9,0x3c8ecffb, +0x3c9e4442,0x3cc37276,0x3cd2a173,0x3d02a76d,0x3d00a7ec,0x3cfdce5a,0x3d014100,0x3d022faf,0x3d002c2e,0x3d001b1b,0x3ceb46b7,0x3ce93b58,0x3cdefadd,0x3cda9908,0x3cd022d0,0x3cc30dad,0x3cb3e5a2,0x3ca5f0a6,0x3c9a451a,0x3c8ed7fb,0x3c81a248,0x3c59a903,0x3c504172,0x3c7030d3,0x3c7e0d32, +0x3c810caf,0x3c85493b,0x3c928db3,0x3ca2b140,0x3cb0bf68,0x3cb5fb71,0x3cc3f0ef,0x3ccf6deb,0x3cd02ad6,0x3cd7af5b,0x3cd8e1df,0x3cda19e7,0x3cf087fb,0x3cd18bb0,0x3ce9f53a,0x3ce09a26,0x3ce2707a,0x3cdf117e,0x3ce16182,0x3ce385c1,0x3ce70bad,0x3ce4e06a,0x3ce118ba,0x3cdd9cdb,0x3cd6162d, +0x3cd0e0ec,0x3cce85f0,0x3cc98392,0x3cc48816,0x3cbec90c,0x3cb629a6,0x3caf9a8b,0x3caa279d,0x3ca2112f,0x3c9e040d,0x3c911e7e,0x3cade28e,0x3ca7617e,0x3c997c83,0x3c9ae4ec,0x3c9cbb4b,0x3ca24795,0x3ca3667a,0x3ca699e5,0x3caba7de,0x3cbe39f7,0x3cd0d9c1,0x3cafe00b,0x3cc46009,0x3ce2b136, +0x3b3fada2,0x3af69068,0x3a98025c,0x3aba1e44,0x3ae6b401,0x3af5a748,0x3b4b47c8,0x3b4c911e,0x3b17f286,0x3af5a2cf,0x3ab292e2,0x3a49ab0a,0x3a8a69dc,0x3addc9a7,0x3b6fcae2,0x3b2d5717,0x3b3170df,0x3b49777e,0x3b5a211c,0x3b65a986,0x3b70ab39,0x3b8160bd,0x3b80012d,0x3b80f2de,0x3b4fef7d, +0x3b2a9bde,0x3af33798,0x3b009b9d,0x3b0a370e,0x3b4adfe9,0x3b22ef34,0x3b157f25,0x3b060a09,0x3b141d15,0x3b3c7e13,0x3b2ec5db,0x3b1c2cb2,0x3ac838f1,0x3a17c829,0x3a081820,0x3a329bcf,0x3985616f,0x3b74c5f1,0x3b81ae04,0x3ad115f2,0x3a2a8e13,0xba93a052,0xbb0bdd5e,0xbb3a6a1d,0xba9f2750, +0x3b8d90e5,0x3b0ee35e,0x3b310f9d,0x3b7b8e55,0x3b976d5f,0x3bb424b9,0x3bb4b71b,0x3bd2354b,0x3be70eb0,0x3be1a77c,0x3ba82cca,0x3b73c9c9,0x3b04b21c,0x3af8c396,0x3b1c05cc,0x3b9514cf,0x3b6a29c0,0x3b547d7e,0x3b3fe1b4,0x3b00a062,0x3b2195ce,0x3b9c8d7a,0x3b664b1e,0xbadc92c0,0xbbc8ffd8, +0xbb8c8ffa,0xbb795fb9,0xbb48a8c8,0x3bc23cb4,0x3bca3197,0x3a3c18b9,0xba829027,0xbb980ec7,0xbbfdb3bf,0xbbf02adb,0xbb880764,0x3beda75b,0x3b0c7a69,0x3b255f5d,0x3b9646fd,0x3bccb0e0,0x3c00f327,0x3bf573e1,0x3c2d6e1b,0x3c40167d,0x3c42b0a8,0x3c002ae5,0x3b984c80,0x3abce1d3,0x3a303128, +0x3b33b60e,0x3bc59bdf,0x3b92fc48,0x3b3f48d8,0x3b27f3cf,0x3b060ace,0x3b6d5e33,0x3bbf79f3,0x3b40b82b,0xba3b32dd,0xbbd28253,0xbbc362c2,0xbbe3d5bf,0xbc0be69c,0x3bb1e3bc,0x3bd12ae3,0xba4eda9d,0xba7d6c67,0xbc135ee2,0xbc74e481,0xbc903003,0xbc28accf,0x3bde1f81,0x3a857f6e,0x3ac7d7b3, +0x3b9a47d6,0x3bf73fba,0x3c299ad0,0x3c1968f6,0x3c48c518,0x3c709ed5,0x3c953bf0,0x3c5b6c6d,0x3c0ff21c,0x3b0f7366,0xbad77863,0xbb41d07f,0x3b081df9,0x3bd2e429,0x3be3e498,0x3b433090,0x3b3f4f21,0x3a47aa01,0x3bb4cb02,0x3bb0542c,0xbcc00e03,0xbbe42e0e,0xbbddf4b4,0x3a8a320d,0x3b3469d6, +0x3c569c9f,0x3c3156e4,0x3acbce19,0xbc818e08,0xbc57d1c9,0x3c8bb7ed,0x3b182807,0x39adb554,0x3c1ad9bc,0x3b050033,0x3ab0b7f2,0x3b64a70e,0x3bb6e158,0x3bfbbe8f,0x3c067b8e,0x3c5f3ac0,0x3c8a3e1a,0x3c962c03,0x3c348fa9,0x3bb364ec,0xba33c978,0x3b1ee6cb,0x3b1a1bfd,0xbb6d1c16,0xbacb5f73, +0x3a23fa52,0x3b0e6e8b,0x3c376eb2,0x3c5778b5,0x3c67c607,0xbc985aa4,0x3be8724c,0x3c4aab88,0x3c144307,0xbbae2229,0xbcf39c01,0xbce150a5,0xbcaf5e02,0xbc191e95,0xbc470da7,0xbc36d7fb,0xbbcb6d80,0xbc53d106,0xbc2d45b9,0xbac3de37,0xbb5acfbd,0xbb83ec31,0xbb5ffaba,0x3a31e967,0x3bb9dcbd, +0x3c272622,0x3bab6391,0x3b4f1f6d,0xba376733,0x3b16702d,0x3bac8aa4,0x3b257a88,0x3a165f58,0xbaf30287,0xbb101050,0xbb1daeca,0xbbbdce26,0xbbe740e7,0xbc68d581,0xbc80e6a8,0xbc2edfd6,0x3b227958,0x38034238,0x3c5c285f,0x3c2cc18e,0x3bf62303,0x3c4d017a,0x3c7b5513,0x3c2a64e4,0xbb0fbfe4, +0xbc6d5efb,0xbc83971d,0xbc24d47b,0xbbc6d608,0xbb0f5f94,0x3a99d6d7,0xb93ccd71,0xb8b73566,0x3b4b7e30,0xbab2dd33,0x3a5c21b5,0x3c112e2e,0x3b95f712,0x3b91a6e5,0xb98b112f,0x39920910,0x3b1378fc,0x3b1661b7,0x3a8f1218,0x39e16ee8,0x3a8509d3,0xbaf54a7c,0xbbf4ad8a,0xbc388a69,0xbbbd4cb7, +0xbc21fd50,0xbc9976d8,0xbc0eb29f,0xbd3b3025,0xbd878214,0xbd93c3df,0xbd7807ab,0xbce9e4af,0xbcf31688,0xbcc18c52,0xbbec8a83,0xbc58ca4e,0xbc0702cf,0x376b5051,0xbb5f20b3,0xbb94b00a,0xbbb66c0c,0xbbb390bf,0xbbcc8458,0xbbcdc216,0xbac876ca,0x3b455d31,0x3c441e8f,0xb905caa8,0xbb891dd7, +0xbb8bc140,0xbaf38f7b,0xb9911991,0xba3a34a6,0x3a8c4c1a,0xb95d9b17,0xbb7c8c59,0xbbf79103,0xbc32c4c6,0xbc8b8e99,0xbc98d812,0xbcbc62c6,0xbcc49651,0xbcfad953,0x3d669b75,0x3d3994d4,0x3cd10cc4,0x3a886e76,0xbd04d36e,0xbd293f95,0xbd12cd41,0xbc9daf08,0xbc9fe97a,0xbc9d43b9,0xbca73169, +0xbc7ce509,0xbc76b583,0xbca63dd7,0xbc4707ed,0xbb80d34e,0xbad5c2bb,0xbb8103af,0xba95de0d,0x3b88e08c,0x3b8ef50e,0x3ba0c2c1,0xbb75758c,0x3a8dab15,0x3a441bfd,0xbb6f1e30,0xbae7b111,0x39df81f6,0x3ba68b06,0x3b988f52,0x3c1ddcf5,0x3c785ec4,0x3d170c0f,0x3d41624f,0x3d3c4cf4,0x3d4e9c9d, +0x3d146e27,0x3d1683b7,0x3d1ca82f,0x3d0e0afe,0x3ce29a95,0x3c539ec3,0xbc0de4aa,0xbd02a3cf,0xbd070573,0xbcf634e1,0xbcd4d780,0xbcb782e1,0xbca44464,0xbc812681,0xbcc0861a,0xbcc7e637,0xbca02acc,0xbc8d8998,0xbc6954f4,0xbc073eaa,0xbb9cf9fa,0xbb4b8fae,0xba8fb699,0x3b4185a6,0x3bed092e, +0x3c5a3b39,0x3c6cfb62,0x3c89b6c1,0x3caa7262,0x3cba358a,0x3ccbc6e5,0x3cda8362,0x3cc3024b,0x3cc2e9ac,0x3cdecf03,0x3d07807d,0x3cfa38e6,0x3d0895b7,0x3d1b7f8b,0x3d2e5a67,0x3d4ae2a1,0x3d3c089e,0x3d3ab89a,0x3d36c4c4,0x3cf88594,0x3c70957f,0xba3949ed,0xba85d3bd,0xbb169f60,0xbb2852e4, +0xbb1481bd,0xbb13d6ac,0xbb78d185,0xbb5224ec,0xbb13353b,0xbb0af151,0x3a9b0e68,0x3baf8ce6,0x3c12f6f0,0x3c2e3ecf,0x3c4c6498,0x3c61ea6a,0x3c5fc70b,0x3c6a0567,0x3c64458c,0x3c898c01,0x3c90f173,0x3ca701f4,0x3cbd4422,0x3cc859d7,0x3cd1f37f,0x3ce9d9a9,0x3d07be37,0x3d0a574b,0x3d04b359, +0x3cffa96b,0x3cf4bdf9,0x3cec9a04,0x3ce004c7,0x3cde35a0,0x3cd63e14,0x3ce1db74,0x3cdd9567,0x3cda003d,0x3ccbd347,0x3cbb94b7,0x3caeffc8,0x3ca26f0f,0x3c97ffdd,0x3c8e989d,0x3c823b51,0x3c699a93,0x3c84a148,0x3c87578f,0x3c8ede37,0x3c95b242,0x3ca074e6,0x3caaa0a3,0x3cb9bc16,0x3cc6b976, +0x3ccfb9b1,0x3cd9ef46,0x3ce3e578,0x3ce70766,0x3ceeabe5,0x3cf4aab4,0x3cfc99ab,0x3d037a3f,0x3ce6a19c,0x3ce9fd0b,0x3ce56cd0,0x3ce33929,0x3cdfa880,0x3ce11cbe,0x3ce18ce1,0x3ce023e8,0x3cdea175,0x3cd9c635,0x3cd82b44,0x3cd06f7e,0x3ccc3ee6,0x3cc9c2d1,0x3cc4cdaf,0x3cc00d5d,0x3cbb0f60, +0x3cb46c6c,0x3caee920,0x3ca6262e,0x3cb177d1,0x3cb39620,0x3cb3b931,0x3cbb8263,0x3cbe1153,0x3cbae56b,0x3cbc3cb0,0x3cbe8929,0x3cc2a66a,0x3cc50dca,0x3cc90a46,0x3ccd48c1,0x3cd86c8d,0x3cde7f7b,0x3cdb9ef4,0x3ce2d2cf,0x3cec859c,0x3b74782d,0x3b2808a0,0x3aecd3da,0x3b178594,0x3b351b3f, +0x3b374a5c,0x3b834c9f,0x3b83ed35,0x3b52f00e,0x3b480e5c,0x3b1c77e9,0x3a8991dd,0x3aad1e0a,0x3af6d9ba,0x3b7ac1fa,0x3b5a6c4e,0x3b689f82,0x3b75de6f,0x3b842874,0x3b8b1f79,0x3b93e550,0x3b98d356,0x3b91f1f0,0x3b812c5f,0x3b777f4b,0x3b4e5133,0x3b0da416,0x3b22922e,0x3b34e110,0x3b8336eb, +0x3b383ffc,0x3b24a6c3,0x3b34e0f7,0x3b33bfca,0x3b6899dd,0x3b8aa323,0x3b4b1dc7,0x3b1d026c,0x3aaec307,0x3b06b744,0x3b0bbb81,0x3a7b501d,0x3b8dbfc2,0x3b9e6905,0x3b2d99f6,0x3b308ef7,0x39fa5cf2,0xbb350a45,0xbb4f1e76,0xbad024e9,0x3b858280,0x3b57f45d,0x3b87337c,0x3b9a7597,0x3bb8b4b7, +0x3bd1f890,0x3bd47f32,0x3bf15e9a,0x3bfefd6c,0x3bdcedf5,0x3bae4ef9,0x3b820996,0x3b22e46b,0x3b342a59,0x3b641d30,0x3bcf6821,0x3b864bee,0x3b6a2336,0x3b871619,0x3b08d2a4,0x3b5378dc,0x3c0b4538,0x3b9d785f,0x3a137095,0xbb41f7da,0xba8f8744,0x395979c1,0xb9a9d712,0x3bdf9364,0x3bf518d5, +0x3b21c51d,0x3b4fbbe7,0xbae044c6,0xbc174d6e,0xbc115e05,0xbbbd6deb,0x3bc0ff07,0x3b59c2a0,0x3b92bd74,0x3bb8e7c5,0x3bee8574,0x3c12e4d8,0x3c17c138,0x3c4520b0,0x3c4d3587,0x3c335121,0x3bfce77a,0x3b9b18d6,0x3b048110,0x3acbebd3,0x3b86a1e8,0x3c19add8,0x3b977a43,0x3b3b7e4c,0x3ba7746a, +0x3ae0aeab,0x3b667533,0x3c559ae1,0x3b9b2c41,0x3b896ef4,0x38fdc867,0x3a8ec6e6,0xba6ba031,0xbbd81208,0x3ba6e176,0x3bdb16d9,0x3a0bd69e,0x3b7c44fb,0xbb923816,0xbc8c5791,0xbc9aa580,0xbc4b7e68,0x3bc77926,0x3b71da0b,0x3ba939b1,0x3be6f002,0x3c226054,0x3c502401,0x3c46494b,0x3c79bdb7, +0x3c8772de,0x3c892738,0x3c461517,0x3bf1907d,0x3b04c38d,0xbaa1aff2,0xb9c7b87c,0x3bedf260,0x3bd28780,0x3ba8d47a,0x3b974635,0xb8fa35c9,0x3b12e36e,0x3c94f105,0x3c1ce60e,0xbc91858d,0xbc4506fc,0xbbe8640b,0x3b832cff,0x3c1ebe1c,0x3c7a3a71,0x3c57d4ab,0x3c376644,0xbbfa0f1b,0xbc2a6121, +0x3b65f84a,0xba93e62b,0xba5007c2,0x3bd5b53a,0x3ae8bfc6,0x3a682c23,0x3b38c971,0x3bb7f204,0x3c0288ce,0x3c0dd55e,0x3c9243af,0x3c9f7d7c,0x3c81c89e,0x3c2d4e2d,0x3bc3a95e,0x39d1f3b9,0x3b5759e7,0x3b4bc239,0xbb1ad2d2,0xb9bf209c,0x3b3d5a3c,0x3be55611,0x3c5fc460,0x3c403b36,0x3bc2d411, +0xbc55ecc1,0x3b657af9,0x3cfcb8bf,0x3c7cf017,0xbbaf703e,0xbcc5364e,0xbd175657,0xbcf8b361,0xba741b13,0xbba5d008,0xbb18686d,0xba8c7d94,0xbbf5fc9e,0xbc162fbd,0xbbdd285a,0xbb974ab3,0xbb1ce0cc,0x3af627b9,0x3b89589f,0x3bed0c17,0x3c45cd8e,0x3b8b6664,0x3b2c30cb,0x3b48d627,0x3b772c24, +0x3bb5185c,0x3af4d0ef,0xba4b314e,0xbb341506,0xba95294b,0xbac38993,0xbbaa89ed,0xbc0965a0,0xbc3cb604,0xbc2b6240,0xbbe5baca,0xbb8d0a91,0x3c175fc1,0x3c1d5fb6,0xbaaf96ad,0xba992393,0x3b9b74a3,0x3c8dbd8d,0x3c90c422,0x3bb0c724,0xbb895c9b,0xbbebc5fe,0xbbe1f927,0xbbca6461,0xbb4d5ece, +0xbb1f3f27,0x3ba741a5,0x3be5c2bf,0x3bcdddfc,0x3b8533b7,0x3bda7a48,0x3c8f5ad3,0x3ba5ce91,0x3b809f26,0x3b8a8861,0x3b4e5316,0x3b3fcbde,0x3b1a019a,0x3b0f9c7c,0x39c068d3,0x3a1c2b5a,0xbb5aacb6,0xbc002134,0xbc292e0e,0xbb99511a,0xbc1502aa,0xbca0cac9,0xb849ce1f,0xbd5d6c8d,0xbd671b9a, +0xbce69255,0xbc9c486d,0xbcd0449f,0xbcb81a04,0xbca801d0,0xbc7acfc3,0xbc0a3c5c,0xbaf342ee,0xba3cd39a,0xbbd42b83,0xbc28de73,0xbc62d885,0xbc4703ff,0xbbedd956,0xbb87f2b0,0x3aef718a,0x3bbe5a4b,0x3c592e1c,0xba2b3f1d,0xbb83bf29,0xbafbc3bb,0xba0351f3,0x3a9f359a,0x39ce9a47,0x3a89f4ac, +0xb8291a7b,0xba80e35f,0xbbcd22d6,0xbc18b1ce,0xbc51b04c,0xbc50776c,0xbcadf56e,0xbd0b33f8,0xbd2be451,0x3cfcc5e5,0x3c0a487a,0xbc8c0582,0xbcf64ea3,0xbd3a47ff,0xbcf2deb4,0xbc932ef1,0xbc7fc168,0xbc85e3e7,0xbc7c5986,0xbc322d57,0xbc18dfa0,0xbbea9638,0xbbebd604,0xbc52a4f0,0xbc3b6c5d, +0xbbba7738,0xbb98a263,0x396b5ae3,0x3bf5759f,0x3abc17ff,0x3a912105,0x3a52afab,0x3b3e06b0,0x3ae7281a,0xbb7af1eb,0xba10c289,0x3a7ea264,0x3af243ff,0x3a0d7b75,0x3b23465f,0x3b94f543,0x3cb4802b,0x3d064964,0x3d146185,0x3d004592,0x3d38d12a,0x3d3b9ff1,0x3d2c5e0c,0x3cfc3936,0x3c83a27b, +0xbc54df5b,0xbd01c2b2,0xbd1c82c0,0xbd05cf5d,0xbcdd7661,0xbcbbd0cf,0xbc9495fa,0xbc87e089,0xbc5bfdbf,0xbc828ef1,0xbc8d7e75,0xbc484d1c,0xbc768713,0xbc5d77c9,0xbc144675,0xbc1ec0cf,0xbbd8f0c2,0xbb7142c3,0x3b7926e5,0x3c28088f,0x3c88683a,0x3c7a23d0,0x3c8171d6,0x3c9cd8cb,0x3cc1e8d4, +0x3ce767e1,0x3d0b72e4,0x3cdec17f,0x3cdb1a57,0x3d0e8c62,0x3d2681d6,0x3cec34b5,0x3cf4821e,0x3cf7005c,0x3d011c70,0x3d1334c0,0x3cfeeacf,0x3cdf2995,0x3cab40f8,0x3c14dde9,0xbb51ea21,0xbc872521,0xbc7288aa,0xbc6a6df1,0xbc66c3a0,0xbc375b84,0xbc0bed03,0xbbcc8869,0xbb571e15,0xb96101aa, +0x3b0c571f,0x3b622a99,0x3bb1fdaa,0x3bcacecc,0x3bee551b,0x3c0ac9ae,0x3c0deae7,0x3c457c2d,0x3c7610c7,0x3c9163f4,0x3cab6cd3,0x3cb9f242,0x3cd5f3b3,0x3cdda445,0x3ce0adaf,0x3cdafba0,0x3ce5d3b8,0x3d042838,0x3cf0e79c,0x3ce3d1dd,0x3cd8f41b,0x3cc54ece,0x3cb7b9cd,0x3cab7917,0x3ca82ada, +0x3ca41f37,0x3ca915a8,0x3ca3d8ae,0x3c99a89d,0x3c8a90c6,0x3c809a3b,0x3c6bb408,0x3c51fa8d,0x3c346769,0x3c15aa2a,0x3bd9dc8f,0x3ba4df20,0x3c4533e8,0x3c3cf90d,0x3c63dc44,0x3c80e04d,0x3c9bde6a,0x3ca8f5c7,0x3cb63e76,0x3cc07b67,0x3cccfd83,0x3cd4589d,0x3cde1952,0x3ce90376,0x3ce9c900, +0x3ceec827,0x3cf5f67b,0x3cf28a54,0x3cdde36f,0x3cd55e4b,0x3cd44f22,0x3ccfded6,0x3ccdbf22,0x3cce4cb1,0x3ccd41d0,0x3ccaeba4,0x3cc52ae3,0x3cbea183,0x3cbb9a42,0x3cb48580,0x3caf204c,0x3ca8ac20,0x3ca37a05,0x3c9f2693,0x3c9beaa2,0x3c98d478,0x3c987cc5,0x3c89b1e6,0x3ca404e1,0x3cabd38a, +0x3cba4afd,0x3cb2d932,0x3cbbd3e7,0x3cc5daf0,0x3cc82ce7,0x3ccb027e,0x3cce1735,0x3cd28008,0x3cd6ee38,0x3cdb089c,0x3cdd0711,0x3cdab408,0x3ce24558,0x3ce0aea4,0x3cee5e3f,0x3b928910,0x3b537a8c,0x3b4267e6,0x3b53db07,0x3b6b9d7c,0x3b5db4be,0x3b9cc704,0x3b9ed28b,0x3b6a2add,0x3b860bb1, +0x3b62c972,0x3adcc66d,0x3afb7c6c,0x3b180c48,0x3b6e91b8,0x3b80d0ac,0x3b8bd748,0x3b8e1cf3,0x3b97063c,0x3b9f42b7,0x3badc40d,0x3ba9b3ba,0x3ba0e2a0,0x3b8d5e8e,0x3b8a315e,0x3b7138df,0x3b398912,0x3b4ff901,0x3b682549,0x3ba1ba37,0x3b635457,0x3b501e36,0x3b78bc4e,0x3b572c6e,0x3b8425f6, +0x3bc041ff,0x3b7891c3,0x3b523876,0x3b28995c,0x3b4dadf6,0x3b34da0a,0x3acd75a9,0x3b9cbe14,0x3bb167f3,0x3b204dec,0x3b904db0,0x3b20c9c6,0xbb0f27ba,0xbb2cce69,0xbadf116a,0x3b1b1552,0x3b7bdfed,0x3babc95a,0x3bb0d2dd,0x3bcaf421,0x3be37a20,0x3befdbef,0x3c024d53,0x3c062e28,0x3bd79c94, +0x3bb8b77e,0x3b932e71,0x3b50c855,0x3b6618e8,0x3b8b8b71,0x3bf277fc,0x3b97abf3,0x3b8479e3,0x3baddc6a,0x3b269579,0x3b83796b,0x3c35a3d6,0x3bc53dc1,0x3af8ac14,0xbacb9b8f,0x3a8b4a66,0x3b173c69,0x3a60e1a7,0x3bf9bae2,0x3c0e6234,0x3a848c15,0x3bc128ee,0x3abaa4a9,0xbc124b51,0xbc0f45d2, +0xbbd45916,0x3aceee60,0x3b647063,0x3bbaa052,0x3bccbb3b,0x3bf8657e,0x3c190f1a,0x3c2d34fd,0x3c4ff8a2,0x3c4f1e4d,0x3c20f34d,0x3bfb205e,0x3ba5d660,0x3b35b015,0x3b16184e,0x3b9c8829,0x3c365fe2,0x3b9c5730,0x3b610f0e,0x3bed8ee5,0x3afee01b,0x3b7ab090,0x3c8d69b0,0x3bc2c8ee,0x3b9cea16, +0xb96a17e7,0x3b07e33a,0xb8a21101,0xbba4a0b3,0x3b8e38d7,0x3bd1bf57,0xbb2242dd,0x3bc82117,0x3914c4ec,0xbc8b038e,0xbc9ce7da,0xbc76835f,0xbae4f450,0x3b5103ff,0x3bf2a668,0x3c0c24b7,0x3c27de78,0x3c52d993,0x3c5e62fe,0x3c8a4ef6,0x3c8d776d,0x3c7bd918,0x3c417fbe,0x3bf3eba0,0x3b4c2329, +0xba8e77b3,0x3ad23d81,0x3c4212b0,0x3bd7bbe7,0x3b8e7126,0x3be38554,0xbade6054,0x3b6d8ce5,0x3cd14f32,0x3c371d40,0xbc658939,0xbbfe1a64,0xba851877,0x3c0d30b3,0x3ca39904,0x3c925b55,0x3c7699ab,0x3c87a905,0x3a8de25b,0xbb8e916c,0xbb42fb77,0x3b2c0f1c,0x3b767b0d,0x3b914591,0x3b23a259, +0x3ac4af45,0x3b12bd22,0x3bcbfc58,0x3c26a236,0x3c22c729,0x3c9eac11,0x3ca9f308,0x3c61c87a,0x3c2b535b,0x3be7cd04,0x3b0e9726,0x3b8e97fd,0x3b5bfb0c,0xbb07b148,0xb861b252,0x3b9ca103,0x3c3cc5c7,0x3c73b705,0x3c0fdb6e,0xbb5a1e42,0xbc3d2d73,0x3b7e0498,0x3d232f72,0x3c256ba5,0xbc2caa55, +0xbc8cb309,0xbd16deec,0xbcf8fa99,0x3b34d5ff,0x372ff6b4,0x3b8397e0,0x3b90a7cc,0xba9752ba,0xbba69b78,0xbb9bdbfc,0xbbd1cee9,0xbb8d76b6,0x3b2dba9c,0x3b867916,0x3bd02608,0x3c310343,0x3b436ec3,0x3b0d7882,0x3bb9fe92,0x3ba0ef89,0x3bb4bd48,0x3b295586,0xba4b5ce7,0xbb290ba9,0xba7b4204, +0x379b1948,0xbb316399,0xbbd52107,0xbbcd99ae,0xbb8a3495,0xbb38772b,0xbbeb5d50,0x3b9facce,0xba8ec0c4,0xbbc05d1c,0xbaf22758,0xba60ce9f,0x3c7fd418,0x3c9998fe,0x3bcb0f6f,0x3b35d074,0xbb177469,0xbbe3acf9,0xbc2c670d,0xbbf2038d,0x3b1be089,0xba308f80,0x39748041,0x3b9d39c8,0x3bb7b47e, +0x3c1f5b3e,0x3cacc2d3,0x3bb7274d,0x3b4b85ce,0x3c09b10e,0x3ba58341,0x3b4299f4,0x3b088d5b,0x3b11dfad,0x36b81441,0x39c46944,0xbb92420e,0xbbf49a3e,0xbc07a89c,0xbbe52daf,0xbc4ee1ad,0xbc9a20a3,0xb9595ac5,0xbd432574,0xbce0baa1,0xb9c0daff,0x3a599338,0xbcb7f9cc,0xbca45652,0xbc99c230, +0xbc960900,0xbbb4b698,0xba0db715,0xba42f9f8,0xbbde79a0,0xbc1d5cd0,0xbbf673e4,0xbc55b62c,0xbc116542,0xbb5f52d7,0x3b36ef13,0x3bd75f99,0x3c4d4fa3,0x3a9d2dcb,0xbb2e4e35,0xb9822c55,0xb941bd40,0x3b071a9c,0x3b108203,0x3a297cfe,0xb989006f,0xb7a07483,0xbb823c3d,0xbbe0907b,0xbc0e8c2c, +0xbbfaa4aa,0xbc966911,0xbd0f0215,0xbd324099,0xb8cfb17d,0xbcfc54b4,0xbd62ac76,0xbd5823ac,0xbd28513d,0xbc945f1c,0xbbebdce8,0xbc16387f,0xbc0f4125,0xbc06c874,0xbb6ea728,0xbc307221,0xbc38c9a8,0xbb9b2b64,0xbbe76f7c,0xbc0a89cd,0xbc020ae9,0xbb0b2ed1,0x3a726d10,0x3bb1bb14,0xbb031b5a, +0xba9bd3f7,0x3bb06ed8,0x3b4c9e0d,0x3a9f8e4a,0xbb1c8304,0x3ac37d3e,0x3b2a1033,0xba1968d0,0xbb787822,0xbb9abd37,0xbbac4014,0x3b78fe9e,0x3c4add97,0x3ca3b18c,0x3c0af91d,0x3d521d29,0x3d49a24e,0x3d220cb3,0x3cb35474,0xba5816af,0xbcd9cc55,0xbd168c0b,0xbd0cf57e,0xbcd5cc14,0xbca4f796, +0xbc971123,0xbc3ede1a,0xbc1a33e6,0xbc1c7258,0xbc1cff4a,0xbc257f93,0xbc057d28,0xbc261bfc,0xbc0db2ea,0xbb952537,0xbc08d16d,0xbbe97419,0xbb9a2a9f,0x3b26be0e,0x3c0fd026,0x3c5eadce,0x3c6205db,0x3c70fdbe,0x3c8b40aa,0x3ccc0ca9,0x3cfa257e,0x3d0fb09f,0x3cfe8563,0x3d034e2a,0x3d27a8c7, +0x3d378157,0x3cd8d3f7,0x3cdb7ef1,0x3cb7d463,0x3ca7ad80,0x3ca6f6ef,0x3c581494,0x3b91b234,0xbbdd6fba,0xbc4b6dc1,0xbc951696,0xbccedb8b,0xbcbbe228,0xbcb0cecd,0xbcaa189b,0xbc9398cf,0xbc7e47e1,0xbc517e4c,0xbc16fee8,0xbbd9ee68,0xbb16fee0,0x3b0b1ed8,0x3b75e10e,0x3ba74d13,0x3bcd467b, +0x3be97f11,0x3c03a5dd,0x3c4b4110,0x3c881ef1,0x3cab9a73,0x3cbe42e7,0x3cd1d1ab,0x3cecaded,0x3ceb0ac3,0x3ceabb08,0x3ce4c281,0x3ce43cc8,0x3ce096b8,0x3cbb4c1b,0x3cb15723,0x3ca6981f,0x3c95dd65,0x3c87b11d,0x3c82b838,0x3c7e3c6d,0x3c6a11e1,0x3c5101ac,0x3c344740,0x3c0d399e,0x3bc7c16c, +0x3b83c731,0x3b6716eb,0x3b388d86,0x3aec7bf8,0x3a8132a6,0xb81e0d5a,0xbac39dcd,0x3b798570,0x3b7506ca,0x3bd69585,0x3c1b6a1a,0x3c55c1ac,0x3c6f09eb,0x3c84d7eb,0x3c91eafa,0x3ca4f71f,0x3cae56cd,0x3cbbf5a2,0x3cd1e935,0x3cce3d61,0x3cd242de,0x3ccfb21f,0x3cc3523a,0x3cbffb11,0x3ca0f6d8, +0x3ca52150,0x3ca0f580,0x3c9f61ed,0x3ca02106,0x3c9e4df0,0x3c9d7e25,0x3c942aaf,0x3c8d6a61,0x3c882cb9,0x3c80c2ab,0x3c745ff7,0x3c605a29,0x3c62407a,0x3c60980f,0x3c60ed9d,0x3c5f127a,0x3c6334a1,0x3c4f6436,0x3c876f1d,0x3c995248,0x3cb48331,0x3c9268df,0x3ca898f1,0x3cc72a5c,0x3ccb2fca, +0x3cce25e2,0x3cd09cba,0x3cd6e571,0x3cdb5d46,0x3ce0cd86,0x3ccf19dc,0x3cba463b,0x3ce16c7f,0x3cceafc2,0x3cbd7834,0x3babdd54,0x3b919465,0x3b8e1c3a,0x3b87109f,0x3b907d8e,0x3b86e394,0x3bb2cd42,0x3bb3c3d0,0x3b84ce46,0x3ba5a476,0x3b931a03,0x3b203316,0x3b30d39d,0x3b3d4f42,0x3b606fe6, +0x3b914374,0x3ba0dd21,0x3ba36154,0x3bacc3e0,0x3bb5d932,0x3bc833af,0x3bc2281a,0x3bb7e0a9,0x3b9e0776,0x3b9f0e42,0x3b9367ad,0x3b75bc5b,0x3b83ef8b,0x3b8fa2e9,0x3bb888bf,0x3b8c9e3f,0x3b8567ab,0x3b9d3981,0x3b88bbbf,0x3b9ca6f1,0x3be5bb9b,0x3b9fc776,0x3baba54c,0x3bb37aad,0x3b903912, +0x3b66317b,0x3b22dcc1,0x3bb6ab83,0x3bcef94b,0x3b3d2900,0x3bc7c668,0x3b8f6abb,0xba972734,0xbac58f3e,0xbab43bd3,0x3a317207,0x3b7ad24c,0x3bbb3931,0x3bc363f4,0x3bdc164b,0x3bf648cc,0x3c0c263f,0x3c0d6d64,0x3c0c2308,0x3bd96a0c,0x3bc3dbb4,0x3ba808f1,0x3b868d45,0x3b935f59,0x3ba97e16, +0x3c00246b,0x3bb07b30,0x3b9c2efa,0x3bc9372c,0x3b5b2515,0x3ba42346,0x3c4bbd38,0x3bfe58ab,0x3b8436d6,0x3b0d433d,0x3b2e4f3f,0x3b6f25fd,0x3b01afa5,0x3c07bbbe,0x3c10250b,0x3a77d547,0x3c01dfcd,0x3b8bddb1,0xbbe3d1ce,0xbbf3dc1e,0xbbdcc678,0xbb33fb0f,0x3b308fe5,0x3bc23124,0x3bd5800c, +0x3c0356a9,0x3c227b9d,0x3c42e3a7,0x3c55b178,0x3c4bed6f,0x3c0b7dad,0x3bf4f9e8,0x3bb62aaa,0x3b661446,0x3b55aa8c,0x3baa975d,0x3c3568ff,0x3ba3adf1,0x3b89a734,0x3c058cc0,0x3b2df2c6,0x3b991b13,0x3c998e2a,0x3bff9bf5,0x3bf72ef1,0x3bb37bbd,0x3b8a7a4d,0x37af7bcc,0xbb8d37a7,0x3ba16e27, +0x3c01bf09,0xbb1ba66e,0x3c0f987d,0x3b8140be,0xbc69c766,0xbc8b975b,0xbc8a6af5,0xbc1eba4b,0x3a003de5,0x3be4b9ff,0x3c0ea469,0x3c28a2b9,0x3c5248cf,0x3c76cb92,0x3c8f629c,0x3c8e67c9,0x3c5c62d1,0x3c3864dd,0x3c015f44,0x3b86435a,0xb9dd5650,0x3b499f57,0x3c69027f,0x3bd7b8b9,0x3b92f229, +0x3c0b323b,0xbace40ac,0x3ba01841,0x3cec7151,0x3c6ccc64,0xbc3c4e95,0xbb15d0aa,0x3add3850,0x3c52aee2,0x3cfc942c,0x3c942024,0x3c3a2718,0x3c38dc9a,0x3bf8b654,0x3b8e469e,0xbb364e77,0x3ba36a87,0x3bb5c4e8,0x3b72bb17,0x3b151c65,0x3a90c7c3,0x3ad49231,0x3b9cff98,0x3c277aa7,0x3c6b240e, +0x3c9bfbce,0x3c9c9324,0x3c4e6e23,0x3c3578aa,0x3c10de99,0x3b759220,0x3ba710d0,0x3b5bb0ba,0xbb06088e,0x39649818,0x3bd51ea5,0x3c6be958,0x3c86c8ba,0x3c009a3f,0xbc038253,0xbc46472e,0x3b68a407,0x3d2a3a14,0x3b90b541,0xbc72da36,0xbc80bae5,0xbcf22557,0xbca48bac,0x3c3b7ffb,0x3ba112fd, +0x3bb2237f,0x3c1f57d4,0x3bc06ba5,0x3ab7bb01,0xba9e2059,0xbb90b47a,0xbb8382d0,0xbad220dd,0x3b0128de,0x3b8fa16c,0x3c11b622,0x3b453cd1,0x3b590f95,0x3bf4bef2,0x3bc0a041,0x3ba73a94,0x3b80d660,0xb8b92859,0xbac6a0c0,0x39577758,0x3b5159d7,0x3a4fbac4,0xbb680bf5,0xbb2b8ee5,0xbb1d5058, +0xba0cd1a5,0xbc0c7a26,0xbb11cf38,0xbb9fd620,0xbb8b9acf,0x3a11efac,0x3a1bb05e,0x3c690834,0x3c70fded,0x3beacc23,0x3bb12c35,0x3aee0b40,0xb835dd73,0xbbd63edf,0xbbb2e09d,0x3b3f1b51,0xb90c6695,0xb88391c7,0x3ae40411,0x3bc85660,0x3c1b88ce,0x3c9b74ae,0x3bc11aec,0x3b1bedfa,0x3c182bea, +0x3bd5b20d,0x3b62c27d,0x3ae5305e,0x3b402c92,0x3a2323e2,0xb98c39d3,0xbba99b15,0xbbd823dc,0xbbbdbc63,0xbc3b51d1,0xbc7c1008,0xbc86efd8,0xbb6b5a9c,0xbd00f626,0x3982581f,0x3c1bbbb5,0x3b23332a,0xbc864793,0xbcae9e00,0xbc9e990a,0xbc5f13d6,0xbbf053db,0xbbaf0ca1,0xbb1e9814,0xbc08ce33, +0xbc1a84cb,0xbb56ce62,0xbb3c4b44,0xba876c9b,0xbb25de03,0x3b2df9c0,0x3b965691,0x3becc6ca,0x3b815253,0x3ac42bcc,0x3ac1ec74,0x3ac4cf46,0x3b574f39,0x3b888713,0x39330cbc,0xba27cf83,0x3a9a9449,0xba4443df,0xbb833ba5,0xbb835756,0xbbaa2d76,0xbc7ef384,0xbcf29889,0xbd16a94d,0xbcd64de6, +0xbd6e106c,0xbd8cedbf,0xbd631d4a,0xbce83da0,0xbc66a2bf,0xbbc55fdc,0xbba85754,0xbb5eb0be,0xbb720ca1,0xbb8bd23f,0xbc0248fc,0xbc31b855,0xbc01b05f,0xbc02ea83,0xbbdbeb33,0xbbaea7f9,0x3b6349d5,0x3bc037b0,0x3bb63563,0xbacea83e,0xba21b9a3,0x3bdee664,0x3b1b69e6,0x3a468f41,0xb8dfb8ca, +0x3b6049e2,0x3b6a7732,0xbb0b458d,0xbbfb4a5e,0xbc26b531,0xbc30da03,0xbc3055e1,0xbbb4e2e8,0x3b84564a,0xbc2f003e,0x3d3da296,0x3d1fe898,0x3cbb7ef5,0x3b7bd3de,0xbc9fccc6,0xbcfb06cf,0xbd0411eb,0xbce9a28c,0xbc9b1f74,0xbc63b1e4,0xbc6be731,0xbbf5e227,0xbb9b8562,0xbb943a6e,0xbbaa03b7, +0xbb9d50c1,0xbbe9c125,0xbbd310a8,0xbbb519f2,0xbb273cbb,0xbb948ea0,0xbb87b2c4,0xbacfadc4,0x3b40b94e,0x3be005bf,0x3c0537a2,0x3c2e71f1,0x3c594252,0x3c7dfc18,0x3ccab25a,0x3cf37918,0x3d029fd5,0x3cf85536,0x3d007745,0x3d1c7017,0x3d1d3a79,0x3cd43e6f,0x3ccca838,0x3c8c4e94,0x3c54368f, +0x3bff1565,0xbaa3fb7b,0xbc4c90c5,0xbccba295,0xbcd97955,0xbceab74b,0xbd01200f,0xbcec3696,0xbcd9a766,0xbcc55d9e,0xbcbb2242,0xbcb1aa89,0xbca7e48c,0xbc8af221,0xbc6d43f9,0xbc2d0bc6,0xbb8ce7f3,0x39453eb4,0x3b8f4b83,0x3bde1f51,0x3c136563,0x3c408468,0x3c764281,0x3c8e7747,0x3cad7e4e, +0x3cb730c1,0x3ccfe3a0,0x3ce6aafe,0x3ced8891,0x3cf85d55,0x3d0256ba,0x3cf059dc,0x3cad8447,0x3c7b5f86,0x3c61d4b4,0x3c411ceb,0x3c24b4a9,0x3c08dedf,0x3c040044,0x3be900c4,0x3bc99784,0x3b8ed44a,0x3b2d5bf4,0x3a223fca,0xbadfbb2b,0xbb85df04,0xbb47f89a,0xbb0b329a,0xbabde07b,0xba440530, +0x38f05675,0x3806c039,0x3adcd00b,0x3a0d1794,0x3ac12365,0x3b786c15,0x3bb10cbe,0x3bb0a41b,0x3bf603f3,0x3c233413,0x3c5937c0,0x3c7407ee,0x3c893ba2,0x3ca893a3,0x3c9ffebe,0x3ca2fc60,0x3c982330,0x3c86b109,0x3c6c6178,0x3c19bc8d,0x3c262f9d,0x3c1cc06d,0x3c15c288,0x3c112331,0x3c075e27, +0x3bff48c0,0x3be35284,0x3bcf70ff,0x3bbe016a,0x3ba49368,0x3b91632c,0x3b5ae26e,0x3b8a2ccc,0x3b9718fd,0x3ba8d673,0x3bb479b9,0x3bc5f285,0x3bc4e5e9,0x3c1d3ade,0x3c490a10,0x3c8995c4,0x3c1a2adc,0x3c54e80d,0x3c9365d3,0x3c9ad283,0x3c9edf15,0x3ca1cc33,0x3caa46a2,0x3cb06283,0x3cb8e8a4, +0x3c91480e,0x3c5c2de0,0x3cb45631,0x3c8ed291,0x3c2505b7,0x3bb83ebe,0x3baa6bfc,0x3ba3a5a0,0x3b9f33a9,0x3ba55b77,0x3b989a79,0x3bbcff3c,0x3bbbc641,0x3b937696,0x3bb07072,0x3b9fd757,0x3b4a6c11,0x3b534576,0x3b54b5bf,0x3b5bb710,0x3b969111,0x3ba88671,0x3bac7fb5,0x3bb6f3ad,0x3bc0f3e6, +0x3bd6ab44,0x3bcab460,0x3bbfd7b3,0x3ba72b57,0x3ba56968,0x3b9d5841,0x3b906d32,0x3b989184,0x3ba12c64,0x3bbd22b3,0x3b9d17a6,0x3b999a8f,0x3bacca78,0x3b96c2a0,0x3ba29f75,0x3bf250a4,0x3bb457b5,0x3bf169cf,0x3bdffe4c,0x3bb576d0,0x3b8f21b3,0x3b48fc68,0x3bbc223f,0x3bced4a9,0x3b560b63, +0x3bcff0be,0x3ba1b974,0xb98721d6,0xba12322c,0xba438b02,0x3965917a,0x3b7eedf9,0x3bbe9579,0x3bcb2b83,0x3be900b5,0x3c03bcf4,0x3c1db430,0x3c13b35a,0x3c0ad838,0x3bd4dfb0,0x3bbf13d0,0x3bac4f58,0x3b96576a,0x3bad9a16,0x3bc274d2,0x3bf53c47,0x3bc72d33,0x3baee907,0x3bc75e2b,0x3b70bccd, +0x3bb2a4bf,0x3c4ce5e7,0x3c126bc2,0x3bed7590,0x3bab0645,0x3bb1ad44,0x3bc23359,0x3b5a1e9d,0x3c0f16ee,0x3c0537d4,0x3b10be34,0x3bfcf8f0,0x3b968778,0xbb8bccfe,0xbbbc1002,0xbbc231d7,0xbb8889a5,0x3b0eda6d,0x3bc07ddc,0x3bd53853,0x3c0877d2,0x3c29058b,0x3c57977c,0x3c51324d,0x3c40a8c9, +0x3bef7432,0x3be07fa8,0x3bb52219,0x3b753d61,0x3b8dd9cd,0x3bbd022e,0x3c1f12c5,0x3bb60a40,0x3ba2b357,0x3c027342,0x3b44ca55,0x3b9e6121,0x3c94a545,0x3c196a68,0x3c5db63a,0x3c308272,0x3c07fc7d,0x3b0d5264,0xbb6f7ea4,0x3b966492,0x3bf91116,0xbaab761e,0x3c0343ec,0x3b93d338,0xbc2ae749, +0xbc605a97,0xbc81a9d6,0xbc3a557f,0x3925ed1e,0x3bdb0d60,0x3c0d2e1f,0x3c35979f,0x3c664c0d,0x3c93bdb1,0x3c9317d3,0x3c893217,0x3c33a85d,0x3c21ed63,0x3c02a1c3,0x3b9108b4,0x3a58e9d2,0x3b8f2812,0x3c719579,0x3be4bac1,0x3ba3394b,0x3c075939,0xbace1dda,0x3bc6dddd,0x3cf7aef6,0x3c9b762e, +0xbc301907,0xbad6a749,0x3b17643d,0x3c900dfa,0x3d1f759a,0x3ca343ca,0x3c163144,0x3ba729f9,0x3c384ea9,0x3c054ca9,0xbc010122,0x3bd9e224,0x3bff6e21,0x3a9a9049,0x3a93c356,0x3a6c28f3,0x3b222840,0x3b365012,0x3be48bd7,0x3c7bf49b,0x3c840548,0x3c74ea6d,0x3c447590,0x3c3e330f,0x3c28e345, +0x3b9770d4,0x3baea6ff,0x3b442dfc,0xbb2bb82e,0x3a512d5e,0x3c107722,0x3c8a7475,0x3c912313,0x3be4bf72,0xbc42ff9c,0xbc67ace8,0x3bbe7541,0x3d14ee18,0x3a3b147b,0xbc861e23,0xbc90429a,0xbcb2c66c,0xbc35a5b2,0x3c7899a3,0x3bc95678,0x3bab123a,0x3c5d18d9,0x3c16cd33,0x3ba398d5,0x3b92d6ec, +0x3a0755bd,0xba457dfc,0xba12ab16,0x3b6cf791,0x3bb187e0,0x3c0ebb66,0x3bc156d2,0x3bd19db8,0x3c0eb6dc,0x3bd60750,0x3b8b15ae,0x3b90c74b,0x3a575330,0xb801b137,0x3b2c74eb,0x3ba3964a,0x3afac755,0xbb1715f9,0xbba3dfe5,0xbb9b262f,0x3b4aa1ac,0xbbb269c7,0xbb876acf,0xbb96b893,0xbbd53de3, +0xbb151b95,0x39398ba6,0x3c0fbf2c,0x3c14e060,0x3c37b64c,0x3bf6f9c0,0x3b8a0ae7,0x3b7328e5,0xbbd7cebe,0xbbca70ae,0x3abc91af,0x3b0f9c23,0x3b81fa62,0x3b7543ab,0x3c0efcad,0x3c1e6bba,0x3c56e726,0x3bc5eec4,0x3b3ab6df,0x3c00ce32,0x3bfa2d09,0x3b8a2d0d,0x3ab5a0a6,0x3b87476c,0x3aee3e7b, +0xba5a71c2,0xbba4c319,0xbbb62fff,0xbb6738d2,0xbc52705f,0xbc636702,0xbc46e83f,0xbba356b6,0xbc82ae47,0x3bd83f4f,0x3bf4f1f9,0x3a5fd6ec,0xbc02ff19,0xbc746279,0xbc7fd330,0xbc282e72,0xbc137408,0xbbdd6447,0x3a226e7b,0xbbd5a102,0xbbde77f3,0x3af26d08,0x3b7ed206,0x3b96d1c7,0x3b327cd0, +0x3bd112fa,0x3bd8cec5,0x3b8fa55c,0x3bcb08dc,0x3bd50361,0x3ba4d926,0x3b9abf2f,0x3b98f9f1,0x3b9ec0a7,0x3a137b01,0xb98f867e,0x3b461561,0x3b02594f,0xba9cfa11,0x3aa24432,0xbb7960b5,0xbc4d36a5,0xbcad9561,0xbccf11f3,0xbd216945,0xbd80a5cc,0xbd5d91ec,0xbd2b37ad,0xbcbe061d,0xbc92aad7, +0xbc4ee6ab,0xbbe23d96,0xbb236261,0xbae58ee8,0xbbe33f24,0xbaed0338,0xbb457bbc,0xbbd77638,0xbbd51072,0xbb933cc3,0xbb100822,0x3b8fd9bb,0x3bef94f2,0x3bd39330,0x3ac4acbc,0x3ab26453,0x3bc1ae08,0x3b0b231d,0x3ae0ef49,0x3b1ebb8f,0x3b903064,0x3b321bac,0xbb84bff9,0xbc2b4470,0xbc5a0c2b, +0xbc506183,0xbca6b968,0xbc93acbd,0xbc06e281,0xbcba3b73,0x3ce83ef0,0x3c83a517,0xbb0e1f1d,0xbc6d9233,0xbcd74df4,0xbcd0e73f,0xbcaec30c,0xbc85f939,0xbc30e00d,0xbc17ab21,0xbc511b4a,0xbc0d0507,0xbbd7db20,0xbbb25336,0xbb9c3984,0xbb4d633f,0xbb50280a,0xbb135255,0xbb13388c,0xbb081bf7, +0xbb09e0a3,0xb9889505,0x3b5a007e,0x3ba7f53d,0x3bd64822,0x3bad454a,0x3bfe51ee,0x3c388673,0x3c5a8d51,0x3ca6af64,0x3cc5bd00,0x3cd369b3,0x3cc7ca15,0x3cbe711a,0x3ccd65a3,0x3cb94cba,0x3cc78b1e,0x3cb15b08,0x3c3e87c9,0x3baba83c,0xbb85957b,0xbc4e09ac,0xbcbb025b,0xbd0995e9,0xbd018649, +0xbcf85af5,0xbcf11cac,0xbce3018c,0xbcd6c86d,0xbcc89572,0xbcc01ebe,0xbcb8de3d,0xbcb02ef0,0xbc954286,0xbc6fbb93,0xbc3e9c18,0xbbfd56d5,0xbb129879,0x3b12ba0f,0x3bc1de27,0x3c218f03,0x3c61b7cd,0x3c8358c2,0x3c87f4d4,0x3c9b9154,0x3ca45114,0x3cbbe5f4,0x3ccf2b4a,0x3cdd9cec,0x3cf4ca9f, +0x3d07319c,0x3ce6a190,0x3c564846,0x3be91e5c,0x3ba98c0a,0x3b4cbebf,0x3ac90dc9,0xb8d9c386,0xba6b14b7,0xbb333931,0xbb550189,0xbba11974,0xbbc95d26,0xbbf3a4c3,0xbc0d6d94,0xbc26ef9f,0xbbfe9e97,0xbbb87a58,0xbb76da7b,0xbb06f0f7,0xb9dd7dcc,0x3a9354a1,0x3b05b29e,0x399ae499,0xb8391220, +0x3a5ac1f3,0x3a3f3d9a,0xb95298ba,0x3ae495f9,0x3b84306d,0x3be54931,0x3c0beda3,0x3c2072be,0x3c5a6ab4,0x3c3f0fc3,0x3c3e16e2,0x3c2aa7bd,0x3c05c994,0x3b8f6969,0x3a304f82,0x3a937f61,0x399fcd40,0xb9c132d6,0xba973c7f,0xbb04fb98,0xbb3cd27a,0xbb520912,0xbb63df03,0xbb77c0b7,0xbb8a46f1, +0xbb96fdb3,0xbbb58521,0xbb8fd5a6,0xbb744368,0xbb3ccc0a,0xbb0baa23,0xbab1be63,0xba506d06,0x3af2700a,0x3b6e8f76,0x3bed6115,0x3a98215f,0x3b7cb764,0x3beabfe2,0x3c06300b,0x3c1028bc,0x3c16d47a,0x3c267968,0x3c33bb9c,0x3c4420a5,0x3beb11fa,0x3b6de06d,0x3c38dbdc,0x3be5bc10,0xbab5c2d5, +0x3bb28a54,0x3bafc2a3,0x3ba0a7c1,0x3ba7ef1b,0x3baa5e0e,0x3b9e6b72,0x3bb0d96c,0x3babdf91,0x3b8f374c,0x3ba2ee40,0x3b95f4ac,0x3b512a1f,0x3b5956d5,0x3b57cb37,0x3b57627f,0x3b90a12d,0x3ba179e7,0x3ba5aec2,0x3bafe717,0x3bba9be2,0x3bcdc6c9,0x3bc52644,0x3bbf7d52,0x3bb0c289,0x3b9f5513, +0x3b9d20e1,0x3b9e90db,0x3baad8ab,0x3bb0d402,0x3bbcb24a,0x3bac8f91,0x3bab008b,0x3bb22655,0x3b99a74d,0x3b9869b9,0x3bef1394,0x3bba299d,0x3c05f637,0x3bcf49c6,0x3bc20ca7,0x3ba39859,0x3b83f465,0x3bb05672,0x3bbafa6e,0x3b72a4cc,0x3bba9745,0x3b917e29,0x38bc8c87,0xb79b1239,0xb94075aa, +0x39cbfeb4,0x3b6f9ac4,0x3baf018a,0x3bbe517f,0x3be0a36e,0x3c006e77,0x3c1e7f85,0x3c14c8b6,0x3c01b622,0x3bd2aa4b,0x3bb031d2,0x3ba2ece4,0x3b939a24,0x3bb9b023,0x3bd0e647,0x3be21011,0x3bd45942,0x3bb5fd67,0x3bb10e6f,0x3b6be48d,0x3bab858b,0x3c371e9f,0x3c0d24de,0x3c0c63f6,0x3bcb18bd, +0x3be4c3b0,0x3bfa2f46,0x3bb20ee6,0x3bf1a15c,0x3bc8cdee,0x3b25500b,0x3bc66cbc,0x3b5eec3a,0xbb6039c5,0xbb881ed8,0xbb9756ec,0xbb7fa6ac,0x3af6fd34,0x3bb0fca6,0x3bc482c2,0x3c02739a,0x3c1f8d79,0x3c5d23a3,0x3c441ce2,0x3c2d02c0,0x3be64f8f,0x3bc1fbc0,0x3ba3d600,0x3b5bd72e,0x3bae4e1d, +0x3bd069f9,0x3c0899c2,0x3bd32c63,0x3bbee3a2,0x3be348d3,0x3b3aa1be,0x3b88113a,0x3c7a9f23,0x3c11eb93,0x3c76c057,0x3c27fbb2,0x3c120619,0x3b8cdc33,0x39c51875,0x3b75c5d8,0x3bcbfbc9,0x3a74776c,0x3bcf02f4,0x3b51bea5,0xbc19360b,0xbc3e227d,0xbc628055,0xbc2fb522,0xb978bbbc,0x3bb40340, +0x3bf6a947,0x3c2c1aa5,0x3c65bbef,0x3ca4342a,0x3c943a5f,0x3c798eae,0x3c1dfaaf,0x3c0acc1f,0x3bf73353,0x3b7f0994,0x3b05ad8c,0x3bb382c5,0x3c66cb57,0x3c0156fd,0x3bb564d9,0x3bd939b6,0xbadd50ea,0x3bc2dd73,0x3cd9769a,0x3c99bb19,0xbc058ac9,0x3971df36,0x3bea7c23,0x3caf3108,0x3d261b8a, +0x3c90765a,0x3b9fcf8f,0x3a54a4bc,0x3c07c6a8,0x3bc9da4b,0xbc26b79b,0x3c4123cb,0x3c64fc78,0x3b057375,0x3b05d67c,0x3ae8e65c,0x3b8c0574,0x3b3a5afc,0x3b8a2a53,0x3c40571e,0x3c3b5eaa,0x3c283634,0x3c30f8d3,0x3c378b3b,0x3c342cf6,0x3bad6d6d,0x3ba60c40,0x3b2326a7,0xbb4e1966,0x3b1326b7, +0x3c3e2c29,0x3c99202c,0x3c88a0cc,0x3b8f2f86,0xbc8332b0,0xbc6adcdd,0x3c13b3d7,0x3ca8815b,0xbc0e9aa4,0xbca0ad27,0xbca53445,0xbc835497,0xbbbb8bd1,0x3c2ade6f,0x3bc49b61,0x3ba3ca0d,0x3bc0f0f1,0x3c194f76,0x3bfa7492,0x3b876a5b,0x3b2fd52b,0x3afefb33,0x3a2e3974,0x3bc342d6,0x3be9dad3, +0x3c0735d7,0x3c160a97,0x3c18090f,0x3c1eef7b,0x3be2eeb4,0x3b6f1ca1,0x3b90e975,0x3ae7e1ed,0x3ad9047c,0x3b9e5d34,0x3bad7342,0x3ac5e7a7,0xbb561171,0xbbe1e2c5,0xbb4e4dfa,0x3bd454a9,0x3b0c663d,0xbb55826f,0xbb720a10,0xbbf74107,0xbb8ceb57,0xbb28ae47,0x3b8e6185,0x3be89405,0x3c74d494, +0x3c3f0386,0x3bfbfc7f,0x3b8a232d,0xbb812c93,0xbb839677,0x3a0d1a1d,0x3b3e1563,0x3bb4f4c2,0x3ba0037b,0x3c3a2818,0x3c2fba1b,0x3bede268,0x3ba72f82,0x3b5be2fa,0x3bd15dee,0x3c045775,0x3b8ced57,0x3ac665ee,0x3b906c72,0x3b214509,0xb9e73caf,0xbb884827,0xbb83da3d,0xb95d399c,0xbc3c8609, +0xbc328a79,0xbbf0fabb,0xbb99fa6d,0xbbf88f37,0xbad76ba1,0x3b2ab70f,0x3b1a604f,0xbb5ec873,0xbb96eb14,0xbc0ac45b,0xbc4c926d,0xbc2b1f21,0xbbf46036,0xb9c178d2,0xb927cfc2,0x39acffce,0x3b2266c1,0x3bfdb9f5,0x3c0310c7,0x3bb3468c,0x3c1148a6,0x3c0e9767,0x3b9e7778,0x3c095d28,0x3c1aa690, +0x3c01e529,0x3bedc10f,0x3bb9fce8,0x3ba1a1a6,0x3ab05525,0x3a649318,0x3b894434,0x3b70e1e3,0x3a97c176,0x3bb28c81,0xbb873e71,0xbc2dc49d,0xbc576882,0xbc621a22,0xbd1d9b46,0xbd3a82cd,0xbcf15920,0xbccfe65e,0xbcc13c5c,0xbcb08743,0xbc94ce00,0xbc4cd33d,0xbae2924e,0x3abfbc92,0xbbd1e8f0, +0xba4c30af,0xba983f6c,0xbbad9ec3,0xbb4e0909,0xba721d8f,0x3b23fce3,0x3bc6bf24,0x3bf73a07,0x3bbb88a3,0x3b890089,0x3b70313c,0x3bbda167,0x3b46c822,0x3b51cccd,0x3b8ac8d1,0x3b7a735b,0x39e9d3fd,0xbbbf4bf9,0xbc3a1b0c,0xbc64c423,0xbc553717,0xbcbb4631,0xbcbd8ff0,0xbc87fecf,0xbce24828, +0x3bc65b8c,0xbbed514a,0xbcb12a66,0xbcc3ac20,0xbcab9efa,0xbc745b0c,0xbc02449c,0xba110007,0xbb9e1749,0xbc03d9f9,0xbc3af618,0xbc07ad47,0xbbe859a6,0xbbfb3ad4,0xbba24269,0xbb3d48d2,0x3b020491,0x3b05f01d,0x3ab0e09b,0xba823c8c,0xbabb082b,0x3a8994f8,0x3bcae1e2,0x3bc4d8de,0x3bd74ad5, +0x3bcbc61f,0x3bf128d8,0x3c1a6d27,0x3c117b59,0x3c468bd3,0x3c70a0fa,0x3c8637e3,0x3c8784be,0x3c5bed07,0x3c15ae9b,0x3bb39f32,0x3c9309cc,0x3c5717c2,0x3b538bbe,0xbb853887,0xbc7150f8,0xbca98218,0xbce2464d,0xbd0be8c0,0xbcee789c,0xbcc9ae96,0xbcad6412,0xbcaf7b38,0xbcaf907e,0xbcb2766d, +0xbca40e00,0xbc9a09b2,0xbc8de50d,0xbc65b3cb,0xbc1f95f4,0xbbda859a,0xbbb56dab,0xbaee2929,0x3a838c29,0x3b8e506a,0x3c0b7eea,0x3c427635,0x3c6b7995,0x3c7443b4,0x3c8f2b53,0x3c912c66,0x3ca01bc1,0x3caa50c5,0x3cb136c3,0x3cc79afb,0x3cdc7c45,0x3caba0d6,0x3bb8d0a8,0x3a8d9ca8,0xba802fbe, +0xbb2dd2ca,0xbb8892e4,0xbbb632d4,0xbbe2d5fc,0xbc1dfc88,0xbc257a21,0xbc42966e,0xbc4e4b55,0xbc5827e5,0xbc5a1490,0xbc623954,0xbc3c12d9,0xbc1a5896,0xbbfa5ba8,0xbbc3b14e,0xbb9ca800,0xbb3c5e9b,0x388b1866,0xbab8e287,0xbaaee1ad,0xba401446,0xba396a5d,0xbaaafd23,0xb954b99e,0x3a8739e2, +0x3b3e039e,0x3b73fd01,0x3b8f3620,0x3bd6ad7f,0x3ba4a732,0x3b911f88,0x3b78a66f,0x3af24a69,0xbb2c058e,0xbb95b345,0xbb9625c5,0xbbb57c01,0xbbcde175,0xbbf32caa,0xbc08ea9a,0xbc172de6,0xbc178c99,0xbc188402,0xbc1c359e,0xbc1f72b2,0xbc2444a6,0xbc2fd667,0xbc204ced,0xbc168127,0xbc0a08fb, +0xbbfca2d9,0xbbe2b433,0xbbdb92c6,0xbb8ac5be,0xbb448361,0xb9b2e018,0xbb8aa182,0xbb147fb5,0xb9b1a4b8,0x396d8c9a,0x3a26aba7,0x3a495fdc,0x3ab59ba1,0x3af5e3cc,0x3b2633b2,0xba06ffa7,0xbb2f676c,0x3afb6d64,0xba4608e3,0xbc04bbf6,0x3ba750a0,0x3ba6412b,0x3b9798b9,0x3ba67963,0x3ba70c88, +0x3b98113d,0x3ba35094,0x3b9da218,0x3b881b3d,0x3b93305b,0x3b88e7f6,0x3b4da8f3,0x3b5ac22e,0x3b5bb589,0x3b5de71d,0x3b8b15b5,0x3b985a2a,0x3b996f2b,0x3ba34565,0x3bac9be3,0x3bb8aa34,0x3bb5da48,0x3bb313de,0x3bad554a,0x3b940467,0x3b9271b7,0x3b96f0e3,0x3ba99e6a,0x3baed5a5,0x3baf408d, +0x3bac4786,0x3baa2ea8,0x3ba397ae,0x3b91d139,0x3b8d8fed,0x3bd3630b,0x3bad061e,0x3bf727c8,0x3bb8dd56,0x3bc49c1a,0x3bb1255a,0x3b8d271b,0x3ba02c60,0x3ba3fd4b,0x3b79b0f5,0x3ba01c04,0x3b8215d3,0x3a40d7e2,0x3a54236e,0x3a54aee0,0x3aa5cea9,0x3b7289a8,0x3b9fd54d,0x3ba62670,0x3bcb68d3, +0x3be70868,0x3c0d1b1a,0x3c0aa06f,0x3be9486e,0x3bd2e0df,0x3b9dbad9,0x3b91eea2,0x3b874be8,0x3bbebca2,0x3bd94328,0x3bcea121,0x3bd761a6,0x3bb432d0,0x3b91c337,0x3b612a99,0x3b977501,0x3c12fb3b,0x3bf36b45,0x3c00cb3a,0x3bbde629,0x3bf6ca83,0x3c0943db,0x3bb8702c,0x3bd6f398,0x3bb37806, +0x3b3146b1,0x3b99494d,0x3b30afc0,0xbb0b1d50,0xbb0b15fe,0xbb2900cf,0xbb15d43d,0x3b1421b8,0x3ba6230f,0x3ba5b95c,0x3bed7edd,0x3c0c2594,0x3c46919a,0x3c2e6c6e,0x3c15be6e,0x3befc412,0x3ba10b75,0x3b8bafc6,0x3b3020a8,0x3bc6c918,0x3be59462,0x3becea32,0x3be9aa4d,0x3bce84a4,0x3bae67fc, +0x3b30e6dd,0x3b693141,0x3c416b12,0x3bf16a09,0x3c52a5c9,0x3c00cf30,0x3c0a5ac3,0x3bc1993c,0x3affdf2e,0x3b516f9c,0x3ba0cd4c,0x3b054a37,0x3b99efd4,0x3b423125,0xbbd6886f,0xbc09726f,0xbc257818,0xbc0370c1,0x395c075e,0x3b8c6fbd,0x3bae9958,0x3c147276,0x3c4d9eb8,0x3c99e5b3,0x3c8bc0a7, +0x3c5be3a6,0x3c1db489,0x3bee9c22,0x3bd9010f,0x3b2749fd,0x3b4c9923,0x3bd737fc,0x3c4f3b0c,0x3c10721e,0x3bc3076f,0x3b955808,0xba925ea5,0x3ba8dcf4,0x3ca8f549,0x3c8027fc,0xbb5efab6,0x3b926396,0x3c43d3f1,0x3cb3cb60,0x3d176f62,0x3c830aff,0x3baf9512,0x3b39a43b,0x3b62a96d,0x3b0df954, +0xbbeb285b,0x3c85b59d,0x3c9ba0d2,0x3b97e290,0x3b9864fa,0x3b82d601,0x3bb707a6,0x3b6d23f5,0x3b377ad9,0x3bdbdd11,0x3bf37a47,0x3be66303,0x3c162e38,0x3c28c9e4,0x3c37ebe3,0x3bd3e216,0x3b9334c0,0x3af4d3c6,0xbb49db21,0x3b985259,0x3c6c1e94,0x3c9404d7,0x3c5a3a5a,0x3ac7f253,0xbc8c6304, +0xbc3b0d70,0x3c49cabe,0xb9ae2aec,0xbc78bc68,0xbc9635e1,0xbc9e47ef,0xbc5737ce,0xbbeac74c,0xbb9486e3,0x3b6324ce,0x3b95efd0,0xbb32be40,0x3c220214,0x3c2bffc8,0x3b713715,0x3b0c863f,0x3ad50daf,0x3aa9b58e,0x3c033758,0x3c120a07,0x3bd5eeff,0x3c20284f,0x3c241028,0x3c20aa54,0x3bfd2b4a, +0x3b86cb59,0x3b973176,0x3b11a358,0x3b43a1ff,0x3bde3dda,0x3bb591cc,0x3a77fe6f,0xbb9d130a,0xbb824e9b,0x3ae21985,0x3ba8dc3f,0x3c3c628c,0xbb3eb3bc,0xbb79f3d0,0xbbc9eabc,0xbb9f4dbf,0xbb839903,0x3af0c0ff,0x3bf06b63,0x3c8230d0,0x3c81b1d7,0x3c3ef5f0,0x3ba4088b,0x3b27a33f,0x38afbab3, +0xba91806b,0x3ba05f0e,0x3bf5e13f,0x3b990e87,0x3c439b3a,0x3c374123,0x3b83da4e,0x3b5eee85,0x3b319702,0x3b95fa06,0x3bf4e7af,0x3b74804a,0x3b0ec57e,0x3b78e36e,0x3b2000c3,0x39c78887,0xbb418a38,0xbb0513f8,0x3b085f85,0xbc324156,0xbbfd9efc,0xbac7e622,0xbb7d8238,0xbb4c65ab,0xbbf20a92, +0x3a362b4d,0x3b7e7d31,0xb987e820,0x3b44041a,0xbaedfbc8,0xbc54d358,0xbc30079b,0xbc1a974a,0xbbdb00a7,0x3a7ef58b,0x3b4726fc,0xb8add70a,0x3bfbbf20,0x3c144d02,0x3bf639eb,0x3c182ce6,0x3c0adb11,0x3bad8e83,0x3c193c1b,0x3c222977,0x3c107e9c,0x3c06644a,0x3bc20466,0x3ba7ed10,0x3af304b3, +0x3adb5daa,0x3b9044c1,0x3b87e553,0x3af98976,0x3bcb0023,0xbb891476,0xbc021e93,0xbbf349da,0xbb98db97,0xbceac327,0xbcb712ac,0xbc4046ac,0xbc5e0eed,0xbca6d665,0xbca3a280,0xbc950da9,0xbc65324b,0xba0c84d6,0x3b69341b,0xbb26d2bb,0xba877df7,0xbaaa7e2b,0xbaba6d38,0xbac9af7b,0x392414e1, +0x3b988ba2,0x3c05436f,0x3c027bea,0x3b77ee9b,0x3bbfb20b,0x3bafedb6,0x3bcba91f,0x3b856338,0x3b80ac13,0x3bac6b7f,0x3b0870b7,0xbb0b160a,0xbbe3f68f,0xbc2cf695,0xbc4adb71,0xbc4ab69d,0xbc9e0b37,0xbcb39d60,0xbcb38f2c,0xbcd94e5a,0xbc57a978,0xbcbab98a,0xbcf19936,0xbcc6e80d,0xbc59097a, +0xbb8a6bc3,0x3b07300c,0x3be2592a,0xbbbdb6f8,0xbc32f068,0xbc05c78b,0xbbe81195,0xbbbe63f2,0xbbae13b6,0xbb1126c7,0x398b8b69,0x3b94a774,0x3bb3b02f,0x3b9a4ab9,0x3a18f76f,0xba414c5e,0x3a580213,0x3bb7c6c2,0x3ba1f0b9,0x3bbea0eb,0x3bf370cf,0x3c090669,0x3c02f668,0x3b639bb5,0x3b68de0a, +0x3b9636cf,0x3ba6ecc8,0x3c11eda9,0x3bb9d883,0xbb3550ca,0xbc10e4d8,0x3bfee011,0x3af0c6b3,0xbba7d311,0xbc31b7a5,0xbc9e0f67,0xbcb3d987,0xbccba38d,0xbcd8c9e3,0xbcaf4f42,0xbc8bfc71,0xbc679e8a,0xbc7cfcb2,0xbc81f85c,0xbc8b3cd7,0xbc74eb44,0xbc5da174,0xbc427b1d,0xbc14e39a,0xbbba8d52, +0xbb2cdb7b,0xbafaff22,0xb9282800,0x3ab5b960,0x3b5ca09a,0x3bd1c33c,0x3c076db6,0x3c36c458,0x3c45b024,0x3c81c7ea,0x3c6a5f94,0x3c71e995,0x3c68aa33,0x3c5a8c83,0x3c709def,0x3c820005,0x3c27646c,0x3aa1a165,0xbad5ffd3,0xbb78c6a6,0xbbafedf0,0xbbe3aaf7,0xbc0b6cd2,0xbc2ceeee,0xbc63cf07, +0xbc6f99cf,0xbc84aad1,0xbc897695,0xbc8b8954,0xbc8c7621,0xbc90707d,0xbc812f1c,0xbc681597,0xbc4f6926,0xbc39c9fe,0xbc2b6a7d,0xbc1352fa,0xbba91ba6,0xbbabd3c0,0xbb865c63,0xbb3a01cd,0xbae3cd4a,0xbaa1ec5c,0xba42b9b1,0xb99dc09a,0x3a58792e,0x3a8b19f1,0x3ad643aa,0x3b3ac911,0x3aedbc86, +0x3a802285,0x3a1caf15,0xba83887f,0xbbc8f557,0xbbe35141,0xbbf2ec86,0xbc09c611,0xbc174491,0xbc2ae780,0xbc38c9c5,0xbc45ae00,0xbc44f51a,0xbc46a98f,0xbc4aaf6a,0xbc4edb69,0xbc52b740,0xbc5b0bf8,0xbc4ddc0a,0xbc459d35,0xbc3bbdb2,0xbc318492,0xbc24ac4a,0xbc233804,0xbc05e800,0xbbebf155, +0xbbacdc9e,0xbbeb25a3,0xbbbdc32e,0xbb8c0dc1,0xbb86f679,0xbb7de798,0xbb82eea8,0xbb66491c,0xbb594379,0xbb3a4b55,0xbb918db1,0xbbb84d6b,0xbb6fb8ad,0xbba1ca7f,0xbc380a87,0x3b9b08af,0x3b935f5b,0x3b8b48d6,0x3b9e267f,0x3b9d1804,0x3b876287,0x3b93974f,0x3b8fa0db,0x3b829175,0x3b848b7d, +0x3b7c8723,0x3b63577e,0x3b63c257,0x3b655b10,0x3b6a0d16,0x3b86febe,0x3b8ed52e,0x3b8c0ff1,0x3b935c4c,0x3b9975e0,0x3b9d22d8,0x3b9f3c0c,0x3b9f6b7a,0x3ba3fdb6,0x3b856875,0x3b83bb8a,0x3b881ec8,0x3ba16941,0x3ba63ce7,0x3b9eac8d,0x3ba2ee0a,0x3b9ecc1f,0x3b8d7227,0x3b8502d0,0x3b80488f, +0x3bb06109,0x3b966d1a,0x3bda0953,0x3ba58c4a,0x3bb764ba,0x3ba65bdb,0x3b673531,0x3b876dbc,0x3b88c43c,0x3b7a08ae,0x3b89dc2a,0x3b80fadc,0x3b25facc,0x3b0bb292,0x3b0f02d7,0x3b2388d3,0x3b8968d6,0x3b9d515c,0x3b9303e2,0x3baee754,0x3bc047b6,0x3bdfe971,0x3befdc82,0x3bcb3e67,0x3bcc08d6, +0x3b8a8cea,0x3b7f9660,0x3b72353b,0x3bc2148e,0x3bde0df4,0x3bbaf49a,0x3bcd7eda,0x3ba7ed02,0x3b5dadf9,0x3b4daee7,0x3b806fad,0x3bdeb889,0x3bcaba22,0x3bd22289,0x3ba3dcd9,0x3bf99ed4,0x3c012001,0x3b841c25,0x3bafc280,0x3b96e0e6,0x3b52545e,0x3b734a44,0x3b2d37b3,0x3aad5c4f,0x3a070ab3, +0x396b53a3,0x3999bf9a,0x3b577ea2,0x3ba4d5c5,0x3b8b21a4,0x3bc89f29,0x3bdb8e3e,0x3c1666d1,0x3c0ef822,0x3bf97e3f,0x3bf350e2,0x3b84d6b8,0x3b6d72da,0x3b0bad3d,0x3bdf85c4,0x3bfdd48c,0x3bcd5ffb,0x3bed7851,0x3bc80275,0x3b729877,0x3b262b28,0x3b432ee6,0x3c08758e,0x3bb8b611,0x3c31c7fe, +0x3bd26f61,0x3bfd3d71,0x3bb810ca,0x38815fdb,0x3ae7f643,0x3b370fe3,0x3b2fb90e,0x3b759c69,0x3b949614,0x398c9125,0xbb48190f,0xbb8cbbe9,0xbb60ef38,0x3b2d62ae,0x3b94ac8b,0x3b76f898,0x3be9c3df,0x3c1f40f6,0x3c6d9cd2,0x3c6eb044,0x3c3a1157,0x3c1dfe7f,0x3bc5f69b,0x3bafb6ff,0x3a50083e, +0x3b8b0e6a,0x3bff8771,0x3c320610,0x3c13a2c3,0x3bb88bc6,0x3b189b5b,0xba2a6918,0x3b7dac84,0x3c746a5d,0x3c4de69c,0xbb02a2bd,0x3bbd8d64,0x3c6b1120,0x3cacf4f6,0x3cfa862e,0x3c707c0c,0x3bef76a3,0x3bc973db,0xba8511c7,0xbb43f6ff,0xbbb4ffa1,0x3c7b60aa,0x3c97afbc,0x3baf51ea,0x3bc125ae, +0x3bc45990,0x3be5f7e2,0x3b9b2503,0x3b187df1,0x3b277be6,0x3b8cfbb1,0x3ba228c3,0x3c03e2c8,0x3c1a6d68,0x3c342f97,0x3c05e847,0x3b77f9ec,0x3a8c1b43,0xbb1b22d4,0x3bfccce2,0x3c88fc68,0x3c7d81aa,0x3c1d827b,0xb9810af9,0xbc76580a,0xbc24b9a2,0x3c81f44d,0xbc8cd4ab,0xbc777087,0xbc66cd0a, +0xbc885f7a,0xbc468c76,0xbc4df10b,0xbcaa1777,0x3af357fb,0x3bdd8a60,0xbbad76f7,0x3bf2a53d,0x3c1ab789,0x3bedbbac,0x3b85633f,0x3b05557e,0x3aabfdf4,0x3c0bc386,0x3c1e576e,0x3b928ef1,0x3c0898ce,0x3c126a3e,0x3c11d667,0x3c1764ef,0x3bb3343c,0x3b9cb943,0x3b146f1f,0x3b7b980d,0x3c100940, +0x3bb33c80,0x39e00909,0xbbad85f9,0x384e3698,0x3ba19832,0x3ab20e48,0x3ca42b4a,0xbb6b812b,0xbb8e3c21,0xbbb283db,0xbb8903be,0xba01a38b,0x39a5b886,0x3bd83ada,0x3c6cb2e0,0x3c7c1f1e,0x3c3de89c,0x3b9f4646,0x3bc0247f,0x3b02e5ce,0xba95e741,0x3b4cf1d5,0x3bc41c9e,0x3b7b95a7,0x3c257b8c, +0x3c1afd4e,0x3b042af1,0x3aed39a8,0x3a8c0672,0x3b19a3be,0x3bb8a51e,0x3b29bbc0,0x3b4f2681,0x3b5d7758,0x3b0a3ff9,0x3a998926,0xbaf38626,0xb7c15a16,0x3b534be7,0xbc06ebda,0xbb13cbc6,0x3b660a71,0xbb40d79b,0x3985d91e,0xbbba1fab,0x39b86d7e,0x3b4e3fa0,0x3b88f9db,0x3bc629f8,0x3adb8904, +0xbc1787c5,0xbc1a4166,0xbc20dedb,0xbc396a3d,0xbac40f13,0x3b39b9d5,0x3ae8acb8,0x3baa3541,0x3bd54e29,0x3bfab6ff,0x3c04c09a,0x3be3a621,0x3b94c921,0x3c0844d0,0x3c065c73,0x3bf87ef5,0x3c0548ca,0x3bb97528,0x3b967290,0x3afce400,0x3acf76d3,0x3b7d483a,0x3b5d68f7,0x3aa868a9,0x3b854f4a, +0xbb36c751,0xbb877e0f,0xbb7fa384,0x3aaec949,0xbc9c6eea,0xbc0a7c2c,0xbb94fbb3,0xbbee1c14,0xbc6172c4,0xbc768991,0xbc64dab1,0xbc23f904,0xbb0f69d1,0xb91ed749,0xbb499af3,0xb88c59c3,0x3ab3c416,0x3aad8610,0x3b1875c3,0x3b85b336,0x3bc48981,0x3c026dc7,0x3bda41d4,0x3af3ab54,0x3bcc9c61, +0x3bc4cd23,0x3bb1f5d9,0x3b89909b,0x3b7b4c1d,0x3bbf9ed8,0x39a308ae,0xbb803efb,0xbbe66cf9,0xbc0eb749,0xbc20aa6b,0xbc3ab146,0xbc7710f6,0xbc9e4b45,0xbccd31f3,0xbcc13065,0xbcc97f4e,0xbceaf99e,0xbcec7796,0xbcae5467,0xbc2694e8,0x398f20b9,0x3b635c25,0x3a0fa1ad,0xbc04c36b,0xbc22f195, +0xbb8d3674,0xbbb51afc,0xbb89add2,0xbaef0dbd,0xb89a0e50,0x3b35c8b3,0x3b8b3f38,0x3becf3bc,0x3be198fd,0x3b15811f,0x3ab95747,0x3ac4f37a,0x3b5f5f76,0x3b57a646,0x3b8e7af7,0x3bdc2aea,0x3bf8c10e,0x3bbaf1f1,0xba619a9f,0xbb3ee195,0xbb676667,0xbb89a0af,0x3ada9028,0xba29ab85,0xbc187110, +0xbc90d9bc,0xbaef3a00,0xbbe8e777,0xbc25bf98,0xbc4fb360,0xbc88851a,0xbc89cd04,0xbc857278,0xbc6eba18,0xbc44c39c,0xbc2f5441,0xbc1f65ee,0xbc2d4893,0xbc2ed087,0xbc39a526,0xbc1b38a5,0xbc02bfc8,0xbbd6535e,0xbbb7d929,0xbb8fa32d,0xbb2d0278,0xba9a04f4,0xb93ada62,0x3a7ef9da,0x3b173d5d, +0x3b8f70c8,0x3bb315ea,0x3c00a277,0x3c0ca929,0x3c4ff316,0x3c1e3d12,0x3c0fd7ef,0x3bd12b95,0x3b94d70d,0x3b91fc76,0x3b96dbdd,0x39070c4c,0xba6fe040,0xbb53596e,0xbba8e920,0xbbdefa40,0xbc0a28ca,0xbc262be0,0xbc4c3c57,0xbc7baa58,0xbc83ad28,0xbc88e346,0xbc8c86aa,0xbc8d987d,0xbc9109fe, +0xbc9911ac,0xbc8bfcd0,0xbc820f33,0xbc6bf674,0xbc569455,0xbc40f895,0xbc2f169d,0xbc137601,0xbbf22f1d,0xbbc21ff6,0xbb8d4303,0xbb3e577f,0xbad15a68,0xbaa67cf8,0xba8ad215,0xb98c9a50,0xb8cf0961,0x3a3ed27a,0x3ae60a4a,0x3a79326d,0x387dfb63,0xb9ee702f,0xbaff5486,0xbc004982,0xbc05b3de, +0xbc0fa50d,0xbc1d7a08,0xbc298bd6,0xbc387352,0xbc42ceed,0xbc4f0da2,0xbc4c93fe,0xbc4f9a30,0xbc52fef6,0xbc57eecc,0xbc5a1afd,0xbc5f2d86,0xbc52a2ea,0xbc4a8a1e,0xbc424b8c,0xbc3930b7,0xbc2f1697,0xbc265add,0xbc1fd3bc,0xbc162a02,0xbc055d94,0xbc0a5fd7,0xbbfd95b6,0xbbd62c4e,0xbbd493e4, +0xbbcc3ff7,0xbbd060d0,0xbbc099ea,0xbbbdd4e4,0xbbaf51a5,0xbbd0e1dc,0xbbe86bc9,0xbbcf8670,0xbbe718f1,0xbc4d2cfb,0x3b8b936c,0x3b838fb7,0x3b6fcaa2,0x3b907c2e,0x3b8ca67d,0x3b63cac6,0x3b7c6573,0x3b7ada49,0x3b74a5a6,0x3b6968c6,0x3b659fd1,0x3b7599b0,0x3b66b61d,0x3b68998d,0x3b6fb3d5, +0x3b809a99,0x3b82d239,0x3b7d4408,0x3b7ed144,0x3b820820,0x3b7af9d6,0x3b8bc475,0x3b918c63,0x3b9ecc33,0x3b73b3bd,0x3b7a939d,0x3b81b7a9,0x3ba15a58,0x3ba58f9c,0x3b962c1e,0x3b9d4620,0x3b96c071,0x3b80b805,0x3b7ae237,0x3b6777af,0x3b95ec37,0x3b86f3c9,0x3bb6b376,0x3b78cfe8,0x3b955e22, +0x3b8a56c3,0x3b21ae6a,0x3b4dfdf9,0x3b565f90,0x3b759c9d,0x3b6dfd5b,0x3b8108b6,0x3b8b3a8e,0x3b560f2c,0x3b55a634,0x3b61e322,0x3b9106db,0x3b979eb9,0x3b881c9f,0x3b8cd940,0x3b90bcb1,0x3ba00de1,0x3bc9360b,0x3bae80a3,0x3bc1e25c,0x3b7719d4,0x3b66fcd7,0x3b619965,0x3bc4aa25,0x3be0115f, +0x3babc8e8,0x3bbaad3f,0x3b95b2d4,0x3b2db5d5,0x3b3ebe64,0x3b60c92c,0x3ba728d7,0x3b9d306f,0x3b9e7329,0x3b84af9d,0x3be6014f,0x3bdab933,0x3b0891ae,0x3b66a3be,0x3b63ec78,0x3b7352d9,0x3b3c45d9,0x3b2ca9b3,0x3b954a74,0x3b2d73ba,0x3b30a702,0x3b341bb4,0x3b8eb73d,0x3ba2d87a,0x3b815593, +0x3b9615a1,0x3b909b5b,0x3bbd8591,0x3bd98cfe,0x3bcaf4f0,0x3bf18468,0x3b64f544,0x3b59e08f,0x3b081e79,0x3bfc7956,0x3c0a1014,0x3bbb6475,0x3be21d99,0x3bb6d634,0x3b341858,0x3b1a831d,0x3b140fdf,0x3baca07f,0x3b78b747,0x3bfac01e,0x3b7f972e,0x3bac1f23,0x3b7c399f,0xbb13a306,0xb9c97c6e, +0x3a527024,0x3b5c347c,0x3b50791c,0x3bc112ab,0x3bde5c2b,0x3afa9e3f,0x3a5ce94f,0x3a593993,0x3b99aa0f,0x3ba78166,0x3b6cf954,0x3b989d91,0x3bba82b1,0x3c100be9,0x3c36add2,0x3c176fb1,0x3c23b3c0,0x3ba93fe6,0x3b85479e,0xba0d9c29,0x3bb4f882,0x3c139c80,0x3c12096d,0x3c085df2,0x3b9c1f30, +0x3a1a5b45,0xb94a1fff,0x3b385175,0x3c23d03a,0x3c10cb2c,0xbb4e2a0d,0x3bc817bc,0x3c82d435,0x3ca026fa,0x3cc01b00,0x3c510cbb,0x3c0703b5,0x3c088d11,0xbb794ce1,0xbbf122de,0xbbf88aec,0x3c17ea66,0x3c6d8fc5,0x3bd94c17,0x3bc9f194,0x3bcbc6f1,0x3bf32a5c,0x3bb33e11,0x3b30cfa0,0x39d632e0, +0x3afd5508,0x3b52d99e,0x3becfbd4,0x3c0876dc,0x3c27159a,0x3c224908,0x3b4eca8a,0x39b464a9,0xba45e273,0x3c2ecb3b,0x3c91a43f,0x3c4398d5,0x3bd5e16b,0xbb0c6ce5,0xbc6e5c90,0xbc3be01e,0x3c980f35,0xbce27b6e,0xbc73074b,0xbc36dbab,0xbc4ece05,0xbc25685f,0xbc68078f,0xbcd780e8,0x3b27d43d, +0x3c1e6038,0xbbbe169f,0x3ba93aa9,0x3c01f161,0x3c115f01,0x3bd64c7d,0x3ba0d1b1,0x3b5e8144,0x3c0df434,0x3c1cb4be,0x3b788fb9,0x3bddd8c1,0x3bf50496,0x3bf29cc1,0x3c2e7299,0x3be31d94,0x3b9f318d,0x3b3948ab,0x3ba141bd,0x3c26845c,0x3bae8a1d,0x3a0fa14a,0xbb996514,0x3b222617,0x3be155b0, +0xb7cb30be,0x3cd67d64,0xbbc5f53a,0xbbcec632,0xbb46a397,0xb975bb10,0x3bb7fabd,0x3912bf49,0x3ba19e58,0x3c4443c1,0x3c56f323,0x3c32b64b,0x3b8c2d63,0x3bf2028e,0x3b5e18da,0xba032d40,0xb9302d4b,0x3b211eb7,0x3b456ed2,0x3bd7ee8d,0x3bb838ca,0xb90411b8,0x38d0f1e1,0xba80eb35,0xb9b7fd6f, +0x3b56afa2,0x3abd13db,0x3b6e073b,0x3b5b405e,0x3afac3a4,0x3b00ffe5,0xba12fd03,0x3aff0b82,0x3b8e7771,0xbb045bf8,0x3b4768e8,0x3b8f9168,0xbb917307,0x3b7cf5e6,0x3a703715,0x3aaf201f,0x3b1b5217,0x3c0f3818,0x3bcb1dca,0x3adf6077,0xbbba6b89,0xbc0ab037,0xbc1c9a2f,0xbc6ad18b,0xbb3a1825, +0x3b2ff7e2,0x3b3e5e4c,0x3b7faa78,0x3b9ab0c2,0x3bc1746a,0x3bc66ce8,0x3ba7ea1f,0x3b58bc63,0x3bbbec7d,0x3bb07059,0x3ba223c1,0x3beddecc,0x3baa81c2,0x3b6bc029,0x3aed9df0,0x3aa27fb9,0x3b4a9828,0x3afa8475,0x38988913,0x39b763e8,0xbad8766f,0xba80317d,0xba98955f,0x3b9dbb56,0xbc66d6a2, +0xbbb8f4fb,0xbb34da76,0xbb666626,0xbbec083a,0xbc23b6a5,0xbc0f05bc,0xbba2272b,0xbb929bc0,0xbb9ce9d8,0xbbc02264,0xba848ef1,0x3ae8e2d5,0x3acf3ed9,0x3ba0bda2,0x3beea615,0x3c0d7c2f,0x3bdafff1,0x3b9a6e33,0x3ae607ea,0x3bc3d81d,0x3bbcb781,0x3b549dde,0x3b71488b,0x3b5fb705,0x3bb717ce, +0xba5b89ff,0xbb96751f,0xbbbd1969,0xbbcac307,0xbbe8c567,0xbc27d736,0xbc59bc91,0xbc97096b,0xbcd8d51c,0xbcabb2e8,0xbcdaf95c,0xbcdd29e0,0xbcc2c02d,0xbc933667,0xbc2dafef,0xbb73c7a4,0xbb8b4994,0xbc3305dc,0xbc07fa36,0xbba98db0,0xbad74cfb,0xbb6a8ddd,0xbb4a13bd,0xba275518,0x3a5ff1ed, +0x3b4cf56d,0x3b9108ee,0x3bd8a249,0x3bdbb0a5,0x3b63dad8,0x3b6ee6f1,0x3b462dc6,0x3b0599a1,0x3b0d73c1,0x3b3a9487,0x3bac52cd,0x3b8fed33,0x3b03bd17,0xbb6fc170,0xbbe96628,0xbc0f1aed,0xbc1aaaa4,0xbb912a3f,0xbbb29ed4,0xbc2d9e99,0xbca12abf,0xbc120aad,0xbc5ba7d8,0xbc5cff4c,0xbc53b3be, +0xbc526324,0xbc2e8a1a,0xbbe7f721,0xbb5c9152,0xbb7b32b9,0xbbb0eb7b,0xbbc57136,0xbbbba8f2,0xbbaa5f21,0xbba8abb4,0xbb5ae620,0xbae7b9d3,0xb9d78e0b,0xbae6abcb,0xbb3b332a,0xbb81118c,0xbb2a4397,0xbad881ca,0xb9e94234,0x3a950407,0x3b35d71c,0x3b88541d,0x3bae00b7,0x3bb5edbc,0x3c0d81f3, +0x3ba4a7c2,0x3b557cce,0xb93d2351,0xbb19aab5,0xbb7106f8,0xbb9462fd,0xbc003822,0xbb16d2f4,0xbb91ba0e,0xbbc600f3,0xbbfd5adc,0xbc1b7996,0xbc381627,0xbc5fc463,0xbc802cfc,0xbc7e1858,0xbc7049ab,0xbc6bc707,0xbc6703da,0xbc68934c,0xbc725ebc,0xbc5fc802,0xbc51df8b,0xbc3b14b1,0xbc27d7c6, +0xbc0d166e,0xbbf799aa,0xbc0437b3,0xbbbdb1ba,0xbb9c019e,0xbb6f333e,0xbb2ccc3a,0xba8867b8,0xba75f45c,0xba72066c,0xba191ca9,0xb9bfe938,0x39c15f65,0x3aba6997,0x39e35de4,0xb9bf5b91,0xba698140,0xbb1b969d,0xbc067e77,0xbc001ae1,0xbc0a22c7,0xbc1450f7,0xbc1ca0b0,0xbc25f86b,0xbc2c65ba, +0xbc39a4ef,0xbc32d415,0xbc34c790,0xbc3517a2,0xbc368452,0xbc35251b,0xbc34b445,0xbc2bca4d,0xbc25e3e5,0xbc216174,0xbc1a0a93,0xbc14b58a,0xbc06dece,0xbc156d33,0xbc164469,0xbc1a3175,0xbbfe479e,0xbc03d6a6,0xbc0279a4,0xbc0059b5,0xbbf5209c,0xbbf445c1,0xbbe58401,0xbbe37ea5,0xbbd8505d, +0xbbe98f56,0xbbeb4978,0xbc006420,0xbc02085f,0xbc3533b3,0x3b70790e,0x3b5fe524,0x3b4917db,0x3b74a872,0x3b6886d3,0x3b2f358a,0x3b498713,0x3b4ea6f0,0x3b5c57eb,0x3b4947f4,0x3b4a358a,0x3b6c6c27,0x3b517e6a,0x3b54a3c8,0x3b61e5ec,0x3b688a0b,0x3b679525,0x3b61f3df,0x3b55b683,0x3b547680, +0x3b46eea9,0x3b69aea6,0x3b77c375,0x3b8f7c6f,0x3b52e2c6,0x3b622c1f,0x3b6cbe15,0x3b989b1c,0x3b9c5be0,0x3b87e993,0x3b8d6803,0x3b85514b,0x3b6215b8,0x3b60eddc,0x3b4e3b55,0x3b7767f2,0x3b6424cf,0x3b77f7fa,0x3b1f29e8,0x3b5f1c37,0x3b4f506b,0x3aa190e5,0x3af9c7f1,0x3b1337b8,0x3b64e433, +0x3b4dd5aa,0x3b70b040,0x3b9fbbcb,0x3b5dcf95,0x3b556bfa,0x3b6b1cd5,0x3b852574,0x3b86fef7,0x3b77c9ac,0x3b566729,0x3b4c9757,0x3b5782a6,0x3b9a564d,0x3b904b15,0x3bab51be,0x3b5840c4,0x3b50d87e,0x3b580f3f,0x3bc0e399,0x3bd7f860,0x3b9aed22,0x3ba32a61,0x3b83d3d5,0x3b16db73,0x3b37a483, +0x3b49e59c,0x3b7ca2be,0x3b5eff54,0x3b58f4f3,0x3b445299,0x3bb792ac,0x3b95f00c,0xb8bd5cb3,0x3ac99a72,0x3b0afca5,0x3b81b55f,0x3b259127,0x3b2fe3a7,0x3bc7524d,0x3b461f94,0x3b5d92eb,0x3b7f17c5,0x3b9bb0e9,0x3b9b19cf,0x3b82572a,0x3b538924,0x3b2ca951,0x3b4e4be3,0x3b97aea2,0x3ba01f46, +0x3bdb0af0,0x3b489c6f,0x3b54fbf9,0x3b254cb1,0x3c077f41,0x3c10cbdb,0x3bb33723,0x3bd30de9,0x3ba51d47,0x3b21c923,0x3b26b7ee,0x3b0803ab,0x3b5d9a1c,0x3b1e427e,0x3b56f722,0x3a8b0fa2,0x3b258078,0x3ac52ffb,0xbba08808,0xbb51eb31,0xbabe0352,0x3b713c8e,0x3b4a4862,0x3bcea44a,0x3c29fad0, +0x3b80daab,0x3b1c5373,0x3b229879,0x3b9d46c4,0x3ba2e4b8,0x3b6f6e81,0x3b1b6630,0x3b0b7658,0x3b77c978,0x3beefafa,0x3befbd65,0x3c2a9c33,0x3b9f395b,0x3b4d7f16,0xba4c3fb7,0x3bdce6b9,0x3c225809,0x3be33978,0x3bec29df,0x3b862ab9,0x37cafec0,0x3a4998c0,0x3b22c480,0x3bdc9f9a,0x3baaa82e, +0xbb04c9a4,0x3c0b515d,0x3c8131e3,0x3c8202d2,0x3c8dff1f,0x3c526aa6,0x3c2ab377,0x3c1c7a06,0xbb8a24d7,0xbc1a974d,0xbc25075d,0x3b224c93,0x3c2800b4,0x3c2f6145,0x3bfba840,0x3bd91bb1,0x3bf9932e,0x3bc2a88e,0x3b825768,0x3a070647,0x3a2d4c14,0x3b0e9e72,0x3bc9dc66,0x3bdf71d7,0x3c114307, +0x3c352a70,0x3b39403f,0x387b1bd3,0x3adb30f3,0x3c56692a,0x3c90862d,0x3c030738,0x3b9819e3,0xbb4c3bd6,0xbc7a1da7,0xbc373276,0x3c8c6092,0xbd089b09,0xbc51c40d,0xbbe33bdb,0xbc08e4eb,0xbc100949,0xbc43958c,0xbc9fdb11,0x3bab22d8,0x3c4072c4,0xbb847026,0x3ba033e8,0x3be81428,0x3c09de95, +0x3bf1cbf3,0x3bd732d1,0x3bd9955b,0x3c0b30c7,0x3c0bc2bb,0x3b88ed1d,0x3bbf0989,0x3bc45b3b,0x3bb4b55e,0x3c35f2c6,0x3c04f37d,0x3ba3d197,0x3b872431,0x3bd03f89,0x3c2e0112,0x3b9a3c3b,0x3a71c6ae,0xbb103a7f,0x3b8b1d44,0x3c057887,0xba1f087a,0x3ce0332c,0xbc0e66d4,0xbc0a2a64,0x3ae92c23, +0x3ba84749,0x3c2b1615,0x3adad172,0x3b72c792,0x3bfb7ccc,0x3c3e8d7f,0x3c453f70,0x3b8d714a,0x3c113dcf,0x3b83d428,0xbb316e26,0xbb2792fb,0xb9501a98,0x3b5cef47,0x3b686435,0x3b0cec8d,0xbae53dfc,0xbaa97d8d,0xbb2699ed,0xbb3d9641,0x3a35f00e,0x3a271db8,0x3b7fe83d,0x3b5ca6c4,0x3b048b41, +0x3b29f738,0x3aa1c2a9,0x3b58c295,0x3b6bab00,0x3b25adb4,0x3bb3c61d,0x3b13c8d8,0xbbdeeea0,0x3bef3c52,0x3beb02d9,0x3b66e6fe,0x3b5d0909,0x3c2e41cc,0x3bb34ef5,0x3a52268c,0xbb6e7f32,0xbbd232dc,0xbc023ed0,0xbc6c0289,0xbb8c2b9c,0x3aa2c579,0x3b1aaf25,0x3b11c16f,0x3b783672,0x3bc26e59, +0x3baae337,0x3b910d21,0x3b327bd7,0x3b4f3257,0x3b43ce7b,0x3b306490,0x3bc34faf,0x3b967fe2,0x3b344756,0x3af684e8,0x3aabccfa,0x3b19179d,0x3a3d3a1f,0xba4d1f7b,0xbb21ab8c,0xba8c5d8f,0x3a32ff8f,0x39aac639,0x3bcebf79,0xbc4e7c6a,0xbc032384,0xbb52101a,0xbafe3de2,0xbb900393,0xbbc797f6, +0xbb9e7584,0xbaa9cc07,0xbbd09de9,0xbbf10093,0xbbaad49c,0xbb3538ac,0xba5a34c9,0x3a6d2eb3,0x3b90e380,0x3bcd157c,0x3c041593,0x3b70eecd,0x3b0a7473,0x3b1e322c,0x3b9dbfd3,0x3b899146,0x3a6cd551,0x3b3fd774,0x3b36bd0b,0x3b87fa5a,0xbaadfcd6,0xbb8b7ea1,0xbb77814d,0xbb7c3a86,0xbbafd0e7, +0xbc1e3074,0xbc688773,0xbca299ef,0xbcddcf1a,0xbc9bafb6,0xbcba8aa0,0xbcae295e,0xbc8fa362,0xbc758fb1,0xbc3b3ad7,0xbc4270c4,0xbc63e872,0xbc84f76c,0xbc029b75,0xbb5712be,0xbb4bf44f,0xbb4c424b,0xbb16cff6,0xba244e84,0x3b042680,0x3b652ab6,0x3bd28caa,0x3bb32ec0,0x3bb056cc,0x3b8f909b, +0x3ba29360,0x3b90cff2,0x3ae5396d,0x3afcbe40,0x3aee1d59,0x3b7a6d78,0x39874c7f,0xbb1cd27e,0xbbc00332,0xbc1d1a05,0xbc3a831b,0xbc4182b9,0xbc053895,0xbbf4cba2,0xbc067bca,0xbc895092,0xbc743a1a,0xbc99ae2e,0xbc88ca36,0xbc65f7bb,0xbc348d8a,0xbbe4d341,0xbaf902a3,0x3b12f303,0x39d8f9e6, +0xbad0149f,0xbb257b24,0xbab4ffe5,0xb9fde8a2,0x3965716f,0x3b01ae8d,0x3b68dd8e,0x3bb0c575,0x3b2ef0c1,0x3a3ec325,0xbb1aff55,0xbb2c6d36,0xbaf0b80a,0xba978da6,0x3a393ac3,0x3b0b979d,0x3b87167e,0x3b809bed,0x3b61be69,0x3b9d58db,0x3ab12cef,0xba3f02ce,0xbb88a3cc,0xbbe468d0,0xbc1f72b9, +0xbc425ce7,0xbc6af254,0xbb6d7268,0xbbb9f7f1,0xbbd811c1,0xbc004b73,0xbc1923ce,0xbc2fa3f8,0xbc4ed645,0xbc5d8087,0xbc4e2965,0xbc349bb9,0xbc263af3,0xbc1b5323,0xbc1456e3,0xbc1275d9,0xbc0b1bb3,0xbc0503b6,0xbbeec095,0xbbd78d95,0xbbb051b2,0xbb9363c4,0xbbaa0d22,0xbb4623b7,0xbb13287e, +0xbadb59dd,0xba6b09f5,0x3a562cf6,0x39a436bc,0xb8fa9692,0xba02b3ac,0xba02417e,0xb988210f,0x39cb869e,0xba3d296b,0xbaacb5ed,0xbad9f874,0xbb471fa7,0xbbdd111f,0xbbc0ba69,0xbbce15cb,0xbbd8ec26,0xbbde3f4b,0xbbe5397f,0xbbe8dc6c,0xbbfd99c1,0xbbed44b4,0xbbec7343,0xbbe77d9d,0xbbe2a71e, +0xbbda9bb6,0xbbcfd7e4,0xbbca99a2,0xbbc74da8,0xbbc7ebe0,0xbbbfe3dd,0xbbbec7b3,0xbbab1b61,0xbbd394a0,0xbbe5237d,0xbc06a154,0xbba2c117,0xbbc32dc1,0xbbe4fc35,0xbbe2ab7c,0xbbd8197e,0xbbd61d48,0xbbce98d8,0xbbd0fd61,0xbbcffc1c,0xbbc91a1f,0xbbb5d806,0xbbf98b7a,0xbbe5143e,0xbbd80054, +0x3b442f0c,0x3b398e8f,0x3b2e3ad9,0x3b41fe5d,0x3b30bebc,0x3aef9795,0x3b12dc7b,0x3b1b6171,0x3b3402f5,0x3b22754b,0x3b278d38,0x3b568958,0x3b23420b,0x3b227786,0x3b325ffd,0x3b3c9169,0x3b3e8293,0x3b3ff8bb,0x3b2e8206,0x3b2ac276,0x3b1f6a16,0x3b3bf3e1,0x3b46c386,0x3b72552a,0x3b293a11, +0x3b44ac76,0x3b5811bd,0x3b8b8d40,0x3b8ec756,0x3b72e361,0x3b78442f,0x3b67ed77,0x3b467b94,0x3b46ab05,0x3b33b1b0,0x3b50d7c7,0x3b3c652f,0x3b1b108f,0x3af9c062,0x3b2556ac,0x3b0dc457,0x3922c3d8,0x3a370cc9,0x3a9cad2b,0x3b3dbb78,0x3b2b4d73,0x3b4d88cc,0x3b9e0db8,0x3b1668c6,0x3aed3aa7, +0x3b1d7fde,0x3b3f4126,0x3b552021,0x3b547c35,0x3b273aba,0x3b183a22,0x3b17243b,0x3b61f30b,0x3b5f5d58,0x3b837f45,0x3b342a6b,0x3b3d5e34,0x3b5549ef,0x3bb79e93,0x3bc8180f,0x3b8a45f7,0x3b8cb27e,0x3b685af6,0x3b0c4266,0x3b32facc,0x3b3ce516,0x3b4724bd,0x3b228930,0x3b27a8da,0x3b3c19c9, +0x3b8e1dae,0x3b26f5f3,0xbb0af75d,0xb98a0d70,0x3a057e90,0x3b5a1b7b,0x3b061ac1,0x3b1d57da,0x3bd6d5ee,0x3ac996b0,0x3ad4ea9c,0x3b2ecabb,0x3b757d12,0x3b7f9b96,0x3b77b21e,0x3b22e3ca,0x3aec2242,0x3af33d53,0x3b509beb,0x3b6fcb49,0x3ba27779,0x3b270ecd,0x3b5a0700,0x3b5a0080,0x3c0b7e66, +0x3c14af16,0x3bb3cd08,0x3bca80d2,0x3b9c4d11,0x3b29e44a,0x3b4beaa5,0x3b2055ac,0x3b267e3a,0x3b0256a4,0x3a25ca6d,0x3a0cde5a,0x3ad38d8e,0x38ad3568,0xbbe2edae,0xbbbdc075,0xbb6d93e5,0x3b51f182,0x3b3f4a3b,0x3bbb87d4,0x3c3d2338,0x3b1b4858,0xba16a657,0x38bea46c,0x3b185153,0x3b747b6a, +0x3b59235f,0x3aa8925b,0x39c18e20,0x3a5adddf,0x3b8536c4,0x3bb14993,0x3c1b5c3c,0x3b995977,0x3b3a2de9,0x393fb730,0x3bfed247,0x3c2ba155,0x3bb50051,0x3bc9b6a0,0x3b8045e2,0x39d4f649,0x3aee92dd,0x3b2abbb8,0x3b9e375c,0x3b465454,0x3af8e36e,0x3c2bd695,0x3c43caa0,0x3c26318d,0x3c4bfb4f, +0x3c605e07,0x3c4fdb47,0x3c0a8b1e,0xbb546e17,0xbc1bbc69,0xbc2f3165,0xbb6c712d,0x3bb54d7e,0x3c7bc737,0x3c20a67f,0x3bfcf8fc,0x3c024e83,0x3bd7058f,0x3bb3bf6c,0x3b18f0cd,0x3a9f3f9b,0x3b0df7a1,0x3ba09242,0x3baa0230,0x3bee87e6,0x3c387d01,0x3b34b681,0x39f717e2,0x3b9ac90f,0x3c748e40, +0x3c882915,0x3ba26370,0x3b850433,0xbb190315,0xbc646eb7,0xbbe3d28b,0x3c1af873,0xbd099ec1,0xbbe45673,0xba68f7a8,0xbbccea1d,0xbbfda4cd,0xbc146297,0xbc49a500,0x3beae449,0x3c4da66a,0xba7efd07,0x3b852a19,0x3bc12d5c,0x3c085368,0x3c0a439e,0x3c04348c,0x3c0a7cd3,0x3bea8fa1,0x3bd1395e, +0x3b86f7b6,0x3b9895da,0x3b917082,0x3b84b553,0x3c2c430c,0x3c0f64af,0x3ba4d7a7,0x3bb7f1c4,0x3bfd016b,0x3c2aa64a,0x3b553a4e,0x3a9ec208,0x3accfe8f,0x3bbbd33d,0x3c010b71,0xba4ff3c0,0x3cac7175,0xbc03229b,0xbbfa470c,0x3bc9c8c0,0x3c17e3e3,0x3c3b6a44,0x3b23d439,0x3ac2e70a,0x3af96c15, +0x3c0d1527,0x3c38c827,0x3bb7305e,0x3c079342,0x3b7198f5,0xbb150805,0xbb91d8b6,0xbb0803d9,0x3bb4631b,0x3ae28b64,0xb9e9293b,0xbb38b060,0xbb179abd,0xbb4feab3,0xbb80acb7,0xbaca72b4,0x39b93339,0x3b949c97,0x3b5ea9b7,0x3b133bee,0x3b3e3ce8,0x3b2bc23f,0x3b7434b8,0x3ad42772,0x3ba45044, +0x3bee6e00,0x3ac95bf6,0xbbbf7e28,0x3c08d056,0x3c1c106f,0x3bc2532f,0x3badc81b,0x3c028a0b,0x3b9f0a71,0x3b0ecd21,0xba6381c3,0xbb4b35e2,0xbb9f999a,0xbc29143e,0xbb9c4b98,0xba830eb2,0x3ac0115b,0xb9003b13,0x3ada2790,0x3bc3e01e,0x3ba00a30,0x3b979acd,0x3b4a06fa,0x3ace96e8,0x3a98ae6f, +0x3ac4278e,0x3b8bcfb5,0x3b6aafa0,0x3b126091,0x3b196f73,0x3aee267f,0x3ae60215,0x3a1b6469,0xb9e85e66,0xbb584496,0xba8dea5d,0x39dadd89,0xba0bc3d9,0x3bb6badd,0xbc55d6e5,0xbc16b7d3,0xbbbd1c6f,0xbb558983,0xbb03fbd8,0xbb3826ca,0xbb2cb29f,0xbab002c6,0xbc182367,0xbc1de5d7,0xbb8e0ead, +0xbb719629,0xbb028ed2,0xb954c7d8,0x3b6f0616,0x3b9ef83d,0x3ba7702d,0x3a58dc09,0xb90963e1,0x3b0dff93,0x3b2923b9,0x3b09a379,0x392eda2a,0x3b16e97a,0x3af27719,0x3aeb0065,0xbabb321c,0xbb505bf0,0xbb0a4b60,0xbb25f300,0xbba5e239,0xbc233348,0xbc82edd6,0xbcafe358,0xbcd502d0,0xbc95017a, +0xbc88a445,0xbc7b6033,0xbc52be17,0xbc58421d,0xbc5ab7ed,0xbc92d650,0xbc97fbc0,0xbc6d629c,0xbc146a31,0xbbb74499,0xbbac0496,0xbb6015e4,0xbaedddb5,0xba6b3ac3,0x3b0f35fb,0x3b705410,0x3be6492c,0x3b86bb8c,0x3b72c990,0x3b9cad60,0x3ba6ed03,0x3b9736b0,0x3aff6099,0x3b0d8107,0x3aa6d7aa, +0x3b074f65,0xbb64d7f7,0xbbd3bfac,0xbc03e45c,0xbc3385db,0xbc4c5121,0xbc53506e,0xbc26cf76,0xbc028706,0xbbb0273b,0xbc480303,0xbc98111c,0xbcabe9ca,0xbc940648,0xbc7979eb,0xbc3ba742,0xbbdb39fc,0xbafe9679,0x3af64b22,0x3a14afd4,0xb98606ee,0xba5ca75e,0x3a792d2b,0x3b1201a7,0x3b64c072, +0x3ba6a4e1,0x3bd3cc17,0x3c088f83,0x3bc080dc,0x3b91f030,0x3ae54f5c,0xb7399854,0xb92c7898,0xba3752cd,0x3a56477d,0x3b04abbe,0x3b81c1de,0x3b4bbd92,0x3ad75712,0x3ae73ebd,0xba9c6ec6,0xbb3cae63,0xbbb99d4b,0xbc161aad,0xbc565d69,0xbc85348a,0xbc931032,0xbba7a721,0xbbdd2910,0xbbdfb356, +0xbbeca214,0xbc024a8c,0xbc0c6b3c,0xbc191528,0xbc16624c,0xbc04ae3e,0xbbdb5bd6,0xbbbad850,0xbba30ac8,0xbb8e437f,0xbb76b816,0xbb8599e2,0xbb8c5ae2,0xbb895b0b,0xbb83fb55,0xbb6b7db5,0xbb570c63,0xbb66092f,0xbac4d49f,0xba2d1caf,0xb8cd5fd7,0x3a306771,0x3b124948,0x3a904c3c,0x39b231a9, +0xb9e8603f,0xba660739,0xba91e61f,0xba838974,0xbb02843b,0xbb1da376,0xbb3907c0,0xbb805441,0xbb8cc610,0xbb722c63,0xbb74bedb,0xbb74e071,0xbb6a918b,0xbb641c31,0xbb5c9160,0xbb6d06a4,0xbb54b1b0,0xbb4bc7c6,0xbb3ccf03,0xbb2d7898,0xbb1c982e,0xbb0156cb,0xbb07c1af,0xbb0a15d5,0xbb1522dc, +0xbb139977,0xbb1bc973,0xbb0db01d,0xbb4ae7f7,0xbb6aa87a,0xbb9b5f63,0xbae10646,0xbb28d287,0xbb5dddcf,0xbb6814b5,0xbb60cda9,0xbb6a37f6,0xbb6d998d,0xbb8145bb,0xbb8bbd8a,0xbb7a2e73,0xbb53abcb,0xbbb179b2,0xbb99caa6,0xbaf475bb,0x3b141a23,0x3b2140c8,0x3b1b9cf6,0x3b100dad,0x3aefdb54, +0x3a8f2dc8,0x3abd82dc,0x3ad3eb55,0x3b0ab15c,0x3af52656,0x3afdb291,0x3b302c96,0x3ac8126c,0x3ab5bed8,0x3ac8139d,0x3afc0b56,0x3b097a0c,0x3b169edf,0x3b08a0e7,0x3b068690,0x3af52438,0x3b177341,0x3b1d4b62,0x3b3c9a65,0x3b000920,0x3b289139,0x3b48c39f,0x3b7cb208,0x3b80f3d0,0x3b593a99, +0x3b5afe10,0x3b4c8d46,0x3b300490,0x3b301c4a,0x3b1977d4,0x3b30c3e6,0x3b22c4e8,0x3aebc573,0x3aff4aa8,0x3adb174e,0x3a8d077d,0xba30bfea,0xb9df00eb,0x39896939,0x3b114975,0x3b0b8642,0x3b20613f,0x3b87dd6f,0x3a22ee04,0xb9bc9927,0x3950b54f,0x3a92543c,0x3b03561b,0x3b2ae1cc,0x3b0f691b, +0x3b02d981,0x3ae59ea9,0x3b298020,0x3b1dd3dc,0x3b234a7a,0x3b0615f6,0x3b2726f1,0x3b597245,0x3babe072,0x3bb76c91,0x3b7db10d,0x3b76e992,0x3b4d29cc,0x3b03c748,0x3b33d6aa,0x3b3e53a7,0x3b25e0c3,0x3b0677ff,0x3b3abd2a,0x3b7faf2a,0x3b5b263d,0x3a636033,0xbb3b9cdf,0xbae1a312,0xba2bda1c, +0x3b36aa8c,0x3aedfdce,0x3af92cdc,0x3bbe73b3,0xba82e4f5,0xbad67412,0xba2da2a4,0x3ab8546b,0x3b1cc1b7,0x3b592aae,0x3b1744c2,0x3aebde58,0x3ac43b3f,0x3b23728c,0x3b2c37f8,0x3b2ef1e8,0x3af0a74e,0x3b597ec8,0x3b8c219f,0x3c0dcb71,0x3c16c03d,0x3bbda199,0x3bc76c9d,0x3b9d2d65,0x3b3ae292, +0x3b73ef83,0x3b3a18cb,0x3b0ee671,0x3b161a40,0xb93933d8,0x3ad541bc,0x3aaefd26,0xba71bf0b,0xbbee7afd,0xbc02309e,0xbbaa84cc,0x3b31475f,0x3b4407a2,0x3b96b54f,0x3c2cc3a4,0xba838ae0,0xbbbb7473,0xbba5ee3e,0xbb02ffa7,0x3abed7a4,0x3b46d53d,0x3aced6e4,0x3a127e6d,0xb862e417,0x3b0eea5b, +0x3b675dbd,0x3bde0c0e,0x3b875c12,0x3b458a94,0x3b01732a,0x3c11abc9,0x3c34f72f,0x3bac4d58,0x3bb85243,0x3b891973,0x3a9e5e77,0x3b46d8c9,0x3b64b400,0x3b7807c5,0x3b0e966d,0x3bdaef48,0x3c3d2a11,0x3bf2a4ac,0x3b9ccd6e,0x3c02d311,0x3c781d9d,0x3c765713,0x3bc25c18,0xba63e439,0xbbfdfc81, +0xbc31dc64,0xbc0aaf0b,0x3a916718,0x3c8fb9e9,0x3c33555d,0x3c0abf9c,0x3c04c5ba,0x3be1deef,0x3bd192fe,0x3b92f824,0x3b584442,0x3b5e9762,0x3b8e1b50,0x3b8351af,0x3bbb084c,0x3c2bf26a,0x3b30432e,0x3ac21bfb,0x3c03abb8,0x3c8040d5,0x3c70215f,0x3b7a68ef,0x3b5c349e,0xbb10c55b,0xbc3c172e, +0xba8d05f7,0xbb4efcc3,0xbcf269e7,0xbab5f051,0x3b8e594e,0xbbb71700,0xbbb5a95d,0xbbbc37ca,0xbc05634e,0x3be745cb,0x3c3ea36f,0x3b155bd2,0x3b3545a0,0x3b8a5142,0x3c0df516,0x3c1b6835,0x3c24c9bb,0x3c26da74,0x3bc8f297,0x3b91f11b,0x3b777bd8,0x3b46f710,0x3b411ed1,0x3b58cd20,0x3c1457e2, +0x3c0ca41a,0x3b9ece3c,0x3bebd660,0x3c152875,0x3c209784,0x3b181d52,0x3af76c87,0x3ba681b1,0x3bc3dddd,0x3bdc062e,0x3b39668e,0x3c0ff569,0xbb5a4e43,0xbb388f15,0x3c1aa16a,0x3c3a6c70,0x3c2c8d87,0x3acf4f81,0xbb1cb340,0xbb552f1d,0x3b081901,0x3bd2551c,0x3beaba74,0x3bdf5252,0x3b7c4060, +0x3783cd69,0xbb83280d,0xbb3c2e0f,0x3bbc749d,0x39753e30,0xbb0c3e0d,0xbb450134,0xbb3e0a44,0xbb3f6d9c,0xbb4fb784,0xbb32b12b,0x3a02da45,0x3baa9504,0x3b5ec81c,0x3b1f023d,0x3b438fb2,0x3b51018e,0x3b6238f2,0x39b34dd1,0x3bd7dabc,0x3c090df1,0x3b3498aa,0xbad8613c,0x3bcab06b,0x3c0b4dac, +0x3bdf9f42,0x3bd94bd3,0x3bcf37ec,0x3bcd1533,0x3bc993d2,0x3b95e4ae,0x39e86a30,0xbafedf67,0xbb9e0010,0xbb96465a,0xbb3e4acd,0xba8b6a94,0xba96b3cf,0x3a4b85b0,0x3bac09e9,0x3b9a5d0c,0x3b9de486,0x3b5f17a6,0x3a37cf31,0xb95c0919,0x3a7cd907,0x3b1b3304,0x3b161ef6,0x3b043e3d,0x3b510d3f, +0x3b36eb29,0x3ac3ac81,0x3ac23d5c,0x3a343703,0xbb5f0903,0xbb05bd0d,0xba974d1c,0xbb320383,0x3b378181,0xbc5c0b9e,0xbc035b99,0xbbecb65d,0xbb88540a,0x3a8a678f,0xb94bb1dd,0xbb1141d0,0xbb8d66f6,0xbc35ab49,0xbc2bd08b,0xbb8ed95b,0xbb83f226,0xbaadc2cd,0x3944f71c,0x3b440cb4,0x3b5f02df, +0x3b1b68f2,0xb8eb9ed6,0xba0a86e3,0x3b0126fe,0x3a6db695,0x3a2dcd2f,0x39b69a44,0x3ae09fff,0x3a409a62,0xba611378,0xbac1f985,0xbb077eac,0xbab6b5ea,0xbb190e6c,0xbbb9ebb8,0xbc2c0fa9,0xbc88191a,0xbcabe2e0,0xbcb34d47,0xbc8d5158,0xbc427547,0xbc3c80cb,0xbc2c3a27,0xbc4c6a4e,0xbc794f91, +0xbc8d21f4,0xbc8266a8,0xbc3beb8a,0xbc15ec12,0xbbdcb80e,0xbb978be9,0xbb5d3fac,0xbb05408d,0xba896e26,0x3af77299,0x3b68407f,0x3b8f92a9,0x3b1718c7,0x3b0f9f03,0x3b8c6f37,0x3b8e32a2,0x3b82ab51,0x3b15ecb9,0x3b22898f,0x3a78daba,0xb9babd00,0xbbd28305,0xbc17f071,0xbc1ca2b7,0xbc3c8356, +0xbc50e8c0,0xbc5d42ad,0xbc475fd4,0xbc183c3b,0xbba0448e,0xbc145fec,0xbc927695,0xbc9a1082,0xbc881080,0xbc770a49,0xbc52272e,0xbc1317bc,0xbbb8c6a8,0xbb2244ce,0xbb153f9b,0xbad822ef,0xba96a5e2,0x3ac7913a,0x3b6f023f,0x3bb48291,0x3bc06507,0x3bd15de0,0x3bef7971,0x3bcaea62,0x3bb3715d, +0x3b8ed1b0,0x3b2f44b6,0x3adc2bd7,0x3a12d458,0x3a861aa9,0x3ae33070,0x3b3eb80b,0x3af761bb,0xba36aea3,0xbaa320e5,0xbb56646c,0xbb74466f,0xbbadddaf,0xbc0eb9ee,0xbc4fdc34,0xbc8250c9,0xbc8b7f5e,0xbbd79ace,0xbc058ad5,0xbbf6c6c6,0xbbe50662,0xbbd81969,0xbbcf0250,0xbbc23c86,0xbba348c1, +0xbb837b22,0xbb3cbc06,0xbb034958,0xbaaf0858,0xba3d0160,0x398d6768,0xb9b95eff,0xba4c55f8,0xba960b8c,0xbaa7f42b,0xba9f2b7e,0xbab5db46,0xbb1534c9,0xba37f494,0xb8ec81e1,0x39bf231e,0x3a39f548,0x3acbdb07,0x393f8767,0xba0cc2c9,0xbaa11ec3,0xbb0383a3,0xbb28a6e6,0xbb2fb4a6,0xbb698fe8, +0xbb7a3445,0xbb9171b9,0xbbb25796,0xbb24e598,0xbb3fd305,0xbb213059,0xbb11afdc,0xbaf92215,0xbacf9861,0xbaac675a,0xba9f9cb0,0xba6f5c95,0xba2b958b,0xb9aa5d22,0x3620c7ef,0x399acdf4,0x3a38fef3,0x3a08a346,0x3a041248,0x39cb30ff,0x39967e44,0x38bef0b3,0x394c2b5c,0xb9e74e91,0xba2a3bf9, +0xbaa896eb,0x395d3f20,0xb8e6792a,0x37af0bf9,0xb9769d64,0xb9a2ae86,0xba2c7e35,0xba618cb2,0xbaae0202,0xbaf09cc7,0xbaf7ce06,0xbafd83b8,0xbb377f3a,0xbb2d9d74,0x39f7f70b,0x3ac08368,0x3b04cf59,0x3b0984bb,0x3ac1fecd,0x3a83fdec,0x39ac7e50,0x3a20fdfb,0x3a5445df,0x3ab74ba0,0x3a92f9be, +0x3a949bdf,0x3aefeb64,0x39f5e78c,0x395b19f7,0x394a1c8c,0x3a532d2b,0x3a975a0f,0x3ad270c3,0x3ac73153,0x3ac93f52,0x3aac370a,0x3ad534bc,0x3ad30479,0x3aedde82,0x3a9b3a70,0x3af4c311,0x3b2cb4cd,0x3b52757b,0x3b56d2df,0x3b3288a8,0x3b31577a,0x3b256aef,0x3b09585d,0x3b0adc1d,0x3aeff02e, +0x3b073384,0x3b025a6d,0x3ab9fd81,0x3b093e63,0x3a862da6,0x3914bc3d,0xbabd07c8,0xbab6c7e7,0xba3412ef,0x3aa9b215,0x3aac67ae,0x3ac1a7c2,0x3b40f47e,0xba7a5d31,0xbb193cf4,0xbb09f9a9,0xba758d83,0x39ebb6bf,0x3af1b5e9,0x3afb851b,0x3af7dd56,0x3aaf84d7,0x3aeef5d8,0x3ab54acd,0x3a61cefd, +0x3a9388dc,0x3b015aaa,0x3b573b9b,0x3b9aa278,0x3ba31f99,0x3b65c693,0x3b591e2d,0x3b31c651,0x3adae436,0x3b326f58,0x3b40e4c9,0x3b07d4a0,0x3aeaa37b,0x3b6ef429,0x3bab4d6a,0x3b30d582,0xb9c03615,0xbb65a3f9,0xbb454206,0xbafc7cce,0x3af8fdee,0x3a683757,0x3a3aded7,0x3b84e43e,0xbb651ae8, +0xbba1287d,0xbb938759,0xbad94041,0x39ad66d3,0x3b30c4e6,0x3b20a4bd,0x3b193e0c,0x3ac1f97d,0x3b07f194,0x3adb48fc,0x39b6ae9b,0x3a65976a,0x3b4135e1,0x3ba42a8e,0x3c0b5d45,0x3c146777,0x3bc5c3be,0x3bc4a3a2,0x3b9fbaac,0x3b36bcc7,0x3b8af1c6,0x3b5b0af1,0x3b0e0f1a,0x3b437f3a,0xb8e8df2d, +0x3b68b53e,0x3ab0e6c0,0xbae8748f,0xbbede795,0xbc1889c7,0xbbd5c1b6,0x3ac2aada,0x3b01ee2e,0x3b3c067b,0x3c07b91d,0xbb779eb1,0xbc252c30,0xbc29ad35,0xbbe56ed5,0xbaeafdb6,0x3b212841,0x3b1cd444,0x3af2d93e,0x398a55f5,0x3abdf8c0,0x3af39e90,0x3b4e0090,0x3b4935f3,0x3b582247,0x3b847c9c, +0x3c262460,0x3c40f84d,0x3bc34404,0x3bbb30ef,0x3b9ada14,0x3aef9d9e,0x3b9aea39,0x3baecf4f,0x3b670bc5,0x3b0b18b0,0x3c4430f9,0x3c600ebc,0x3b99b7a4,0x3aa4f4e1,0x3b852744,0x3c7b9a95,0x3c7b65c3,0x3b1835fa,0x3a39868c,0xbbdbc3cf,0xbc554e4c,0xbc542a10,0xbb5ac271,0x3c86ba79,0x3c369444, +0x3c137da9,0x3c060167,0x3bdc1ab5,0x3bd326be,0x3bc4bc21,0x3bb7ae13,0x3bac7d14,0x3ba07662,0x3b65d68e,0x3b8ce83a,0x3c15cee8,0x3b20a986,0x3b35c9f4,0x3c3a346b,0x3c78e8b5,0x3c45b089,0x3b7cf59b,0x3ae05dd4,0xbb644a0c,0xbc0c94c2,0x3b989268,0xbc8cdaf2,0xbccb9adb,0x3ad7da0f,0x3bf21703, +0xbba1cc79,0xbb1854e4,0xbb27a352,0xbbb5e382,0x3b96903f,0x3c0d4b2b,0x3bbc6254,0x3b22a3fb,0x3b2e80c7,0x3be77dff,0x3c1a5410,0x3c315f4b,0x3c2fad47,0x3bac2c55,0x3b42e9ba,0x3b64fd2b,0x3adddad4,0x3ae5e11e,0x3b3c43d8,0x3be0434b,0x3bf3c565,0x3b91c165,0x3c0d7340,0x3c2aba29,0x3c1301fb, +0x3b1dbac6,0x3b3e1c46,0x3bf4f334,0x3babfd30,0x3bcc9e3d,0x3c173a2e,0xbba572dd,0x3b854363,0x3b9c1232,0x3c5f7918,0x3c55b570,0x3c20d1ea,0x3a3f3040,0xbbbcb583,0xbbbc2cce,0xbbaf02fe,0xba1dee77,0x3bdc423e,0x3b8bd019,0x3b6ec1f1,0x39f509b3,0xbac28dd8,0xbabb6dbb,0x3b8b5668,0xba987ee9, +0xbb4d6c37,0xbb1d36c2,0xbb3a8395,0xbb0d3e7f,0xbac9e721,0xbb372274,0x3a68cd2a,0x3bb5ee63,0x3b5ef41b,0x3b285f86,0x3b3616de,0x3b6e2cc4,0x3b4bf3f5,0xb9eabc59,0x3bd69734,0x3c06ea28,0x3b96bd2d,0x3b8d8a8c,0x3b069a70,0x3ba8977f,0x3bae4796,0x3bcbcad6,0x3bcf4e25,0x3c0c75b3,0x3c2a6c5e, +0x3c423668,0x3b7e3b5f,0x39687e15,0x3a83c17e,0xbb868d50,0xbb86f33a,0xbb3761c6,0xba6f8620,0x3aa34658,0x3bb2638b,0x3bb4145b,0x3bb1b4b7,0x3b7585e9,0x39739b2f,0xba5bf922,0x3a6b18dd,0x3a2fcd19,0x3a66ada8,0x3acd5c05,0x3b7c5831,0x3b82c8a5,0x3ae2ea4d,0x3b2e66fb,0x3ad89fcf,0xbb5d078e, +0xbb42c571,0xbb1da986,0xbb91d855,0xba637040,0xbc4dc05b,0xbbd1faf3,0xbbc60145,0xbb446edc,0x3b2e54f5,0x39e31f92,0xbb70a139,0xbc107ad8,0xbc37f7aa,0xbc1cb608,0xbb83cf2f,0xbb6a7ad0,0xba964f71,0x3a5ea7b7,0x3afe9063,0x3acb18c5,0x397a040a,0xba51a38f,0xba242371,0x3ae5028a,0x398e1402, +0x38118343,0x398cf6af,0x3a8fc608,0xb82fcbd8,0xbb44dbee,0xbadaa2ed,0xbae13a5d,0xbae5903d,0xbb3bb422,0xbbcfc7c2,0xbc2b922c,0xbc7d2700,0xbc95faee,0xbc861f3a,0xbc79d8d6,0xbc1624ee,0xbc14de02,0xbc107f85,0xbc356503,0xbc6d7a9e,0xbc522393,0xbc2d7a63,0xbc13204c,0xbbca9c88,0xbba46105, +0xbb8eb828,0xbb5e643a,0xbb0c2016,0xb963ec90,0x3b0579a0,0x3b4259cf,0x3a9d57da,0x3a65706c,0x3aa6c27a,0x3b5eba14,0x3b6d6536,0x3b628f43,0x3b26d0db,0x3b249ef9,0x39cdbd37,0xbb3ff5e0,0xbc06957a,0xbc2adeeb,0xbc23bbc6,0xbc3c00dc,0xbc5316f9,0xbc69aa32,0xbc69fed5,0xbc42715e,0xbbf7cbb6, +0xbc07759e,0xbc68a261,0xbc6d973a,0xbc5d01be,0xbc5a311f,0xbc5310bd,0xbc2edb2f,0xbc143355,0xbbea1a38,0xbbc0bfbe,0xbb88a51e,0xbb2177da,0x3a68087e,0x3b75b2fa,0x3bd4f3cc,0x3ba8ac1d,0x3b9465cd,0x3b88ad65,0x3b8cc3f0,0x3b863353,0x3b87ed2d,0x3b69d5d4,0x3b408eed,0x3b24956b,0x3ab2a8eb, +0x3a918c41,0x3a6999b7,0xb96e70f0,0xbb705718,0xbb9e7575,0xbbb328fc,0xbb8ee4c5,0xbb8d3cc9,0xbbe0863e,0xbc1eeb90,0xbc450a37,0xbc56477d,0xbc0c80a0,0xbc257060,0xbc0f8836,0xbbf3f226,0xbbc57fd5,0xbb9ff8b1,0xbb64fb32,0xbaf535a9,0xba6d25d6,0x389f0e92,0x3a6528a4,0x3acb6ca2,0x3b0de5a9, +0x3b6299ef,0x3b44b550,0x3b3b0ce6,0x3b228455,0x3b163cf8,0x3b16e69a,0x3b06ec52,0x391b6e50,0x3a06ca67,0x39a3377b,0x3942d507,0xb98c1583,0xba0aa0af,0xbae9f023,0xbb197cda,0xbb3a8b7c,0xbb78f512,0xbb9bbc14,0xbba3a547,0xbbc22889,0xbbc9a88c,0xbbe1a3d1,0xbc012804,0xbb2e4d30,0xbb734818, +0xbb3a43ba,0xbb2030fd,0xbb03e623,0xbacc23ba,0xba9bba13,0xba5e1de4,0xba0938c3,0xb8fe31ea,0x39aa3d63,0x3a4be5e1,0x3a99898c,0x3ad3de4e,0x3ab8d926,0x3ab620ec,0x3ab1aa47,0x3aa33d49,0x3a8918c2,0x3a9f57d3,0x3a31d1d9,0x3a17cff2,0x39ae8f8b,0x39956a16,0x398cd537,0x3a70439b,0x3a38a342, +0x3a0e8a31,0x390f7627,0xb8f78573,0xba123a86,0xba8c7a51,0xbaec02af,0xbb1cef8b,0xbaf9cde8,0xbb210fa6,0x3942d1c3,0x3a2d1202,0x3acdb229,0x3ae56169,0x3a4e25b3,0x396733ce,0xb9ba3c6c,0xb96d3bef,0xb7b2360b,0x3a40ac57,0x39b03e8a,0x3996b38b,0x3a5da785,0xb9f24336,0xba52dda3,0xba8502b3, +0xb9a46b45,0x392cfb89,0x3a5f057b,0x3a72f017,0x3a838a85,0x3a39e216,0x3a6d63c2,0x3a5fd371,0x3a5f596d,0x39da3191,0x3a940daa,0x3b0e70e9,0x3b26c9fb,0x3b2b59ee,0x3b0b6aa3,0x3b0b3a49,0x3b00da63,0x3abd16d1,0x3accaa3c,0x3aa5ca49,0x3ac6e1f4,0x3ac9288a,0x3ab534af,0x3b15a6e2,0x39f5ee9c, +0xba2b0dec,0xbb0067fa,0xbb157c93,0xbada0c0c,0x3a0809a2,0x399a9880,0x39b4e8d1,0x3ab8c77b,0xbb081da5,0xbb6e60d6,0xbb806701,0xbb352e80,0xba93329b,0x3a7498a1,0x3acd9ab4,0x3ae1ddfb,0x3a735db1,0x3a96451d,0x39b2ef64,0xba034746,0x393976fd,0x3aa5ed17,0x3b48baf4,0x3b83dd1c,0x3b8b0b5e, +0x3b4a5bd2,0x3b3c0b44,0x3b152eec,0x3a8e1df7,0x3b279c98,0x3b3a3a1c,0x3acd7839,0x3acb6806,0x3b960786,0x3bd8f071,0x3b09cc52,0xbab5067b,0xbb7a4910,0xbb89a5b3,0xbb564b5e,0x3ab5793e,0xb9943767,0xba2365bb,0x3ae14896,0xbba66ee3,0xbbe74661,0xbbf8c6fd,0xbb9809e8,0xbafaa2be,0x3ae4dcf2, +0x3b28ae35,0x3b3b0564,0x3ac40eaf,0x3ac5fdc8,0x3a1d24bf,0xbac3124b,0xb9428adb,0x3b16888d,0x3baaaab7,0x3c02927e,0x3c0b27cd,0x3bc50403,0x3bc03433,0x3ba12e4a,0x3b13dcdc,0x3b95514d,0x3b7b762d,0x3b113660,0x3b72c32a,0x3ab2b4a8,0x3bc9713d,0x3ab2e8c1,0xbb231872,0xbbd95243,0xbc24d74f, +0xbbfc58c3,0x3a63eceb,0x39be73a8,0x3a601f34,0x3ba48dac,0xbbaa4742,0xbc467416,0xbc6393da,0xbc369f1d,0xbba9add6,0x3aa89ce3,0x3b4da86d,0x3b57bb83,0x3a5d89bd,0x3a8c1dbb,0x390bae3b,0xb9abdd7b,0x3ad66d30,0x3b5ba658,0x3bbb48f9,0x3c377fe8,0x3c4d27ab,0x3bdd7ec8,0x3bc55343,0x3baad696, +0x3b09454c,0x3bcbbea3,0x3be7d364,0x3b5d86a1,0x3b2b30c4,0x3c8a915d,0x3c78e5be,0x3b58f7c7,0xba605099,0xb906d49d,0x3c5abddb,0x3c5ed010,0xbaaeaf7f,0x3ac100e4,0xbbcec693,0xbc832938,0xbc8374e1,0xbbedd023,0x3c3dee38,0x3c227ccf,0x3c11ea81,0x3bfd17a1,0x3bca3622,0x3bbc49de,0x3bced8fa, +0x3beceea8,0x3bdd8eeb,0x3bbe1a7f,0x3b613911,0x3b4ed470,0x3bfb8321,0x3af9dd04,0x3b819b31,0x3c717ebc,0x3c658379,0x3c17b832,0x3b81c59b,0xba184807,0xbb9f4456,0xbb981d71,0x3c230fc6,0xbcee78f2,0xbca5c696,0x3af0382b,0x3c032ae2,0xbb423339,0x3ac327e0,0xb9a52d57,0xbbece768,0xba16b156, +0x3b83b5ce,0x3c09fc04,0x3b27a698,0x3ac7801f,0x3b93b89a,0x3c0ace03,0x3c2dd186,0x3c21ab86,0x3b81f9dc,0x3acb3ba9,0x3b51259b,0x3a8fbee2,0x3a9559f1,0x3b24e619,0x3b90c617,0x3bba24c3,0x3b7db463,0x3c1b088f,0x3c35c966,0x3c009925,0x3b311824,0x3b70e14b,0x3c03f79d,0x3ba16342,0x3bea8942, +0x3c7a5a0e,0xbc89df25,0x3c4c217d,0x3c61d002,0x3c8f3cac,0x3c69e97e,0x3c1c1497,0x3af40276,0xbbb5739b,0xbbc1d0a9,0xbc2083af,0xbbbddafe,0x3bc2b3fc,0x3b069db2,0x3b661ce6,0x3b08edcb,0x39dac6ee,0xba36a6b8,0x3b252943,0xbae1c01f,0xbb55191a,0xbad97761,0xbb0b5485,0xbaa8061d,0xb90d07cd, +0xbb130e07,0x3ab0aaa5,0x3bb54332,0x3b5edf7f,0x3b2e056c,0x3b1dafac,0x3b8ae991,0x3b5aa1c5,0xba12f64a,0x3bcda1cf,0x3c0427ce,0x3be35f67,0x3c2fd022,0xbb22a77e,0xb8ea243b,0x3b2f033d,0x3babfbd4,0x3bc9c75f,0x3c32e061,0x3c64f781,0x3c8e5903,0x3bccd72c,0x3ab433ef,0x3bbee5b8,0xbb7f4eef, +0xbbb494d6,0xbb41b90d,0x39427657,0x3b0aa9a2,0x3bb0c78a,0x3bc1a478,0x3bb79d20,0x3b8327b7,0x39a9c51e,0xba4d45f3,0x3a658cf1,0xb9cbcc2d,0xb95167d0,0x3a2be6fc,0x3b7f922c,0x3b9d462e,0x3b132cff,0x3b5bde3a,0x3b0525e5,0xbb331695,0xbb3b73b2,0xbb105d0d,0xbba4ed4f,0xbb78c99b,0xbc25525c, +0xbbab23bd,0xbb7e8e9b,0xbab54d22,0x3b036835,0xb9f9fce5,0xbbb6a13e,0xbc4dd2c6,0xbc29b1ca,0xbbf9dfa7,0xbb386af5,0xbae9e236,0xb9e7c494,0x3a8e3b4e,0x3a2a6cfe,0x381854a2,0xba815a59,0xba89f6d0,0xb9eed4f6,0x3aa24026,0x392eaf7e,0xb849928d,0x38155e98,0x3a2c9959,0xb9a9f603,0xbb8d185a, +0xbb1273fb,0xbb1d014f,0xbb3b9047,0xbb65d36d,0xbbcda404,0xbc17d285,0xbc4d9154,0xbc6a570c,0xbc4547a5,0xbc452f00,0xbbee815d,0xbbe417a9,0xbbe5b989,0xbc099cca,0xbc221bd3,0xbc09916f,0xbbd1f3bc,0xbbbda07f,0xbb534020,0xbb5db488,0xbb8e5ec3,0xbb3e5917,0xbaaf12c9,0x3aa3cb73,0x3b03d365, +0x3ad9dbbc,0xb9fd3209,0x3936f507,0x3a4d88e0,0x3b26fd3b,0x3b3b1c30,0x3b3ec202,0x3b43be89,0x3af2ff70,0xba526bea,0xbba3e540,0xbc0ff340,0xbc296014,0xbc23d1ba,0xbc3b6b37,0xbc5b2b87,0xbc7d4a46,0xbc80e38a,0xbc65131f,0xbc34a8c5,0xbc05cf5f,0xbc2c8f73,0xbc2dea1f,0xbc2721a9,0xbc2f7d83, +0xbc36007f,0xbc29d26a,0xbc242d10,0xbc187193,0xbbfc3de8,0xbbb53bfb,0xbb633976,0xb9dc156b,0x3b193a0d,0x3bb4791c,0x3b6f398d,0x3b2bdefb,0x3ac88b7e,0x3b1771eb,0x3b2a9da0,0x3b53b8a0,0x3b61034e,0x3b6ec9c5,0x3b88646a,0x3aaf564c,0xb8a66bb4,0xbb104b50,0xbb521712,0xbbe0a9e7,0xbc093367, +0xbbfe98c4,0xbbb8411d,0xbb8f3e15,0xbbbd2b33,0xbbe67241,0xbc05c0ff,0xbc18134b,0xbc29f054,0xbc340a0a,0xbc17b9f2,0xbbfa8c3d,0xbbbf2ab3,0xbb8864ca,0xbb1657d5,0xb9f39ddd,0x39ba29c3,0x3a8936e2,0x3ae0e27c,0x3b1c5f7d,0x3b44673b,0x3b8c3fc4,0x3b8633e6,0x3b8d4185,0x3b89f368,0x3b87da1f, +0x3b85ca20,0x3b85fa28,0x3b256591,0x3aad9cdb,0x39ce58a4,0xb9fb5b69,0xbab3f927,0xbb241bb9,0xbb66d1ab,0xbb84ca4a,0xbb93a101,0xbbb8b2f4,0xbbe40a44,0xbbf64230,0xbc093323,0xbc0d077a,0xbc169f99,0xbc20f425,0xbb6e3d2d,0xbb91779b,0xbb6b7546,0xbb4c70a6,0xbb2d69f6,0xbb1091ec,0xbaf01866, +0xbab0495a,0xba8fbd7d,0xba3178f5,0xb984b5eb,0x393633b3,0x3a104b39,0x3a777325,0x3a52a7f9,0x3a4d2f1c,0x3a522219,0x3a467d99,0x3a32ab4a,0x3a579530,0x3a055aba,0x39bc0eb1,0x3994c4d2,0xba152965,0xba166d1c,0xb88ccdee,0xb9825459,0xb9f6646f,0xba670ee1,0xba97a18e,0xbac5f113,0xbb0207c5, +0xbb38be07,0xbb5d8c97,0xbb35766e,0xbb5eb35a,0xba6a2092,0xb8612ec8,0x3a8d78c3,0x3aa8dfe0,0x39171dc3,0xb9fa28be,0xba6ef97c,0xba793578,0xba423ddf,0x394f9a2a,0xb9a896d0,0xb9d6f906,0xb835ac80,0xba8d15cc,0xbabbd8f5,0xbaf0d69a,0xba9aefc4,0xba30041d,0x38d265e3,0x39bebdc7,0x3a009f0a, +0x391fbc51,0x39710228,0x391178e7,0x360df14b,0xb9848a1d,0x39d1e2b6,0x3acd2361,0x3ae866a9,0x3af3e5d9,0x3abd16d1,0x3ac74d22,0x3ab40501,0x3a364fd2,0x3a83cf0b,0x3a3566cc,0x3a5c1715,0x3a8689df,0x3abc475d,0x3b0b0b31,0xb945e968,0xbab74313,0xbb1cc44f,0xbb45eb8f,0xbb1e9149,0x3866c1de, +0xba0c2783,0xba05f386,0x39236ca9,0xbb1c4e10,0xbb80b102,0xbb9de8c2,0xbb800a1f,0xbb19e36f,0xb8a6e897,0x3a960ee9,0x3abe0f5f,0x3a03025b,0x39d4c96f,0xba27f6f3,0xbababb15,0xba3e4731,0x39fb08a6,0x3b30970c,0x3b5184f6,0x3b6045ae,0x3b2b4ab3,0x3b1f960e,0x3af5b4d5,0x39d657b1,0x3b16dac6, +0x3b25d27c,0x3a552ba9,0x3a9c94eb,0x3ba5a593,0x3beb1804,0x3a9e68d2,0xbb158890,0xbb801d96,0xbba9fdff,0xbb8c369b,0x3a9c8bed,0xba9b9ad0,0xbac254b7,0xb99361bb,0xbbad1e39,0xbbf2e2ac,0xbc14117b,0xbbd6ed0d,0xbb6f7584,0x39f53822,0x3b236e38,0x3b4aa457,0x3ab67777,0x3a3e2e00,0xba1286f1, +0xbb272116,0xbaa3e37c,0x3ab27e92,0x3ba15185,0x3be4276e,0x3bf55732,0x3bb806b1,0x3bbacb83,0x3ba05946,0x3ac3d528,0x3b94cd2a,0x3b7d603b,0x3addd798,0x3b78efa0,0x3b3f158c,0x3beb3990,0x3a2a9641,0xbb4c180d,0xbbc4f832,0xbc298280,0xbc07c797,0x3a8b4f47,0xba6e831b,0xba054709,0x3b21683d, +0xbb986633,0xbc3857a3,0xbc708a85,0xbc572352,0xbbfaaf9a,0xb9f40195,0x3b64bb1a,0x3b8c3ed3,0x3a998497,0x39bf1c5f,0xbadb45a3,0xbb3c5d65,0xb7534fbb,0x3b3f55c7,0x3bdbc1c9,0x3c3ff9cb,0x3c538bbb,0x3bea502e,0x3bcdccc1,0x3bb77741,0x3b1361b3,0x3befd499,0x3c05b5e6,0x3b2a15e0,0x3b321a7e, +0x3ca42085,0x3c78f18c,0x3b38c5f4,0xbb1f0405,0xbba6d85d,0x3c2452ac,0x3c317750,0xbb934627,0x3adda8e5,0xbbb7bd01,0xbc922d4b,0xbc8b500b,0xbc1db308,0x3bac195e,0x3bfe4b1c,0x3c06cc75,0x3bd6a8b2,0x3bbbce4f,0x3baf76c8,0x3bc222b8,0x3c002c3c,0x3bf26dcb,0x3bc8b4b5,0x3b624e69,0x3b1358dc, +0x3bc8192c,0x3a8c1322,0x3b9c5723,0x3c90b31c,0x3c47b984,0x3bcffcc7,0x3b5df381,0xbb630bbd,0xbbd147e0,0xbaa78d05,0x3c66f92e,0xbd11047a,0xbc85f31e,0xbab88d70,0x3bc4a3e0,0x39eb46f7,0x3b96c0e5,0x3ac64e81,0xbc10c245,0xbbc79aa9,0xba683a5f,0x3c2b0b3d,0x3b33de67,0x3a4a1649,0x3b5c90e1, +0x3be79f89,0x3c19bd29,0x3c05fc58,0x3b3616e0,0x39d7405c,0x3b28ff9f,0x3a931f9a,0x3a9aa1b2,0x3b1f03ef,0x3b2a9047,0x3b882514,0x3b67fd5e,0x3c205521,0x3c339e56,0x3bd22abe,0x3b46df7b,0x3b81aa0f,0x3be08ad7,0x3bb07a8f,0x3c0d53eb,0x3c9569d8,0xbcc17079,0x3ca0940d,0x3cac1c4b,0x3c9d2ebf, +0x3c727b40,0x3c256e5c,0x3bbb4d1e,0xbac30026,0xbbc542f6,0xbc3abc41,0xbc0fc19a,0x3b85b37d,0x39a8235f,0x3b63a9c8,0x3ba4962f,0x3b4b9506,0x39e4526a,0xb97b491b,0xbb01e65b,0xbb450b4a,0xbad9a1e8,0xbab53961,0xba0dadc7,0x3a357d26,0xbab7974d,0x3aefce30,0x3ba87f3f,0x3b4de07f,0x3b2783c5, +0x3b0d1f70,0x3b9a8751,0x3b891258,0x3a63c5b2,0x3bd6677d,0x3bfb2045,0x3c111b88,0x3c8280db,0xbbe24dcb,0xbba88371,0xb9b2bc14,0x3b8547a3,0x3bc7074f,0x3c4e7eb7,0x3c855fc4,0x3c99e14a,0x3c12a94f,0x3b83a385,0x3c0b65d4,0xbb10912b,0xbba8b609,0xbb2fd0e0,0x3aca0418,0x3b5966ce,0x3b98fc9f, +0x3ba0c3a6,0x3b8abe31,0x3b61e4a2,0x3a2180de,0xba0e9933,0x390766be,0xba8b7ed9,0xba573b91,0xb9888885,0x3b573804,0x3b9b4ab7,0x3b2885e1,0x3b536324,0x3aeea846,0xbac67349,0xbb07715a,0xba879b99,0xbb82288d,0xbbbada01,0xbbe9c2db,0xbb55bcb1,0xbb0a36fb,0xba849eb2,0x39a85293,0xbac90d77, +0xbbcb91c7,0xbc55a957,0xbc0414e8,0xbba679c5,0xbafb8c1b,0xb836b651,0x3a8454e5,0x3ac9045c,0x39eb6def,0x378c0c9d,0xba53c3e9,0x36cf743b,0x3a2eabd1,0x3a81b2ab,0x39825e55,0x38f57724,0x399ed371,0x39456482,0xba49cc4b,0xbb99b2bc,0xbb5394e1,0xbb6f1054,0xbb847614,0xbb77926e,0xbbb05b4d, +0xbbe6e401,0xbc0f5935,0xbc27065b,0xbc1f895d,0xbc0ea101,0xbbb69adc,0xbbac592b,0xbb9e461a,0xbba381af,0xbb88de5a,0xbb8e7f70,0xbb3b85f5,0xbaf2e8ba,0xbafc9a9f,0xbb387646,0xbb521cbd,0xbad115d4,0x389125fb,0x3b1b6171,0x3aaace29,0x394c384f,0xbab2567f,0xb9244754,0x3a1920cc,0x3aee788d, +0x3b088383,0x3b19c1ce,0x3b5a226b,0x3a103555,0xbb202549,0xbbd3ac15,0xbc0d39aa,0xbc202479,0xbc2501ac,0xbc3d96f2,0xbc62b527,0xbc854453,0xbc87c967,0xbc78ae39,0xbc599669,0xbbf6bb3b,0xbbf83b9e,0xbbe90c56,0xbbe468a4,0xbc010648,0xbc0ae03a,0xbc10af64,0xbc1bb54f,0xbc206c2b,0xbbfe5876, +0xbbad2c71,0xbb4c1f3a,0xbab7f7e9,0x3995c363,0x3b2b9950,0x3adf6f3e,0x3aaa5ed0,0x3a230e08,0x3ac50c3a,0x3b074072,0x3b4504bd,0x3b552bb6,0x3b6fa70e,0x3b932ad6,0x39ed3690,0xbb061b29,0xbbc33166,0xbbd6c0cc,0xbc1b4950,0xbc3136ff,0xbc1d2a13,0xbbf3d61b,0xbbc19985,0xbbc21fb9,0xbbb82752, +0xbbb447fe,0xbbd46972,0xbc2e587a,0xbc1f34ee,0xbc0656e9,0xbbdec3a6,0xbbabdcb7,0xbb6e5124,0xbaf3f988,0xb9e51b72,0xb7b7993b,0x3885aa37,0x39b658d9,0x3a4916a1,0x3a9ffac1,0x3b04930e,0x3b071683,0x3b19ed2c,0x3b1f8729,0x3b26ffa8,0x3b21334f,0x3b31d064,0x3b223896,0x39e16286,0xba1de958, +0xbae359c3,0xbb1ffa18,0xbb755ae5,0xbb91f089,0xbba5576f,0xbbb57385,0xbbdb024e,0xbc028661,0xbc12b156,0xbc19ac3e,0xbc1e383b,0xbc23835e,0xbc2197a3,0xbb83d902,0xbb8d35eb,0xbb7a4301,0xbb5d2068,0xbb42ee54,0xbb2e8ae0,0xbb1c21a1,0xbaf33f0a,0xbaed3f5f,0xbac63fa0,0xbaa3c954,0xba81e81e, +0xba4bb00f,0xba137521,0xba17b05a,0xba0e7e37,0xb9f7286e,0xb9e95206,0xb9c47c5d,0xb9cb37fd,0xb99d911f,0xb9ee66a0,0xb9d6f6cd,0xbac6db06,0xbac3c195,0xbaa764a4,0xbac78171,0xbaeb820d,0xbb0ecae8,0xbb229166,0xbb35e9eb,0xbb4f6160,0xbb68aa4c,0xbb775b87,0xbb74598f,0xbb81f9d5,0xbaecd05f, +0xba2c3198,0x39f59586,0x3a3a7e67,0xb9e74d2f,0xba89173a,0xbaadb57b,0xbaca8bb0,0xbab140b2,0xb99cf9cd,0xba652d64,0xba7a64f0,0xba3d27f0,0xbab77218,0xbae14ced,0xbb1531df,0xbae6f674,0xbaad5a9c,0xba27adcf,0xb944d038,0xb7c6443c,0xb9b03cd5,0xb9e737da,0xba16f147,0xba3a12bf,0xba68beb9, +0xb9b6b8cd,0x3a66ef39,0x3a70a2db,0x3a863dce,0x3a3da0e7,0x3a66b286,0x3a43797a,0xb89d8959,0x39c41792,0x38b18ee1,0x37aff011,0x39ce5e58,0x3a8efd7e,0x3ac3968b,0xba5bafcf,0xbb02adde,0xbb2cf674,0xbb67a2fb,0xbb431e7c,0xb9b0f1b0,0xba985dfa,0xba89e9f1,0xba14a35b,0xbb02f9b6,0xbb5fab4e, +0xbba1893a,0xbb904ec1,0xbb51ff04,0xba9dc250,0x3a04f208,0x3a7dca3f,0xb721825e,0xb9cd5120,0xbac0c702,0xbb061d86,0xbaca7831,0xb9b42700,0x3b130653,0x3b129e0c,0x3b22957c,0x3b096e91,0x3b00f109,0x3ac11c96,0xb97dfe86,0x3afeb5c3,0x3b028c63,0xb993737d,0x3a165e10,0x3b981ee0,0x3bd111b1, +0x397fec5c,0xbb43cacb,0xbb74c71b,0xbbc2bb3a,0xbba7c087,0x3a507b50,0xbafa76fe,0xbaf8f432,0xbaacd3e5,0xbb8e7074,0xbbd06e02,0xbc13c94c,0xbbf0bc9e,0xbb9ef56b,0xba916c62,0x3afce0d4,0x3b39c264,0x3a89d544,0xb91b9dc2,0xbad4b199,0xbb47a278,0xbb125406,0x397405b1,0x3b91eb55,0x3bb4079f, +0x3bc6dd05,0x3ba329dd,0x3bb378cf,0x3b9b49c1,0x3a291000,0x3b892551,0x3b62c673,0x3a0f98cb,0x3b565d12,0x3b41e881,0x3bc822c9,0xb9e42bc7,0xbb66e99a,0xbba87662,0xbc24d52e,0xbc0a8be7,0x3a8d0b16,0xbae05227,0xba897cf2,0x3abf596a,0xbb191692,0xbc073f1b,0xbc5d1275,0xbc5a3451,0xbc1704e2, +0xbb347572,0x3b3ba154,0x3b8ca9bc,0x3a861085,0xba356f99,0xbb4f6560,0xbb8c518f,0xbad87bba,0x3b02fbb1,0x3be7bd57,0x3c3cc991,0x3c4f11e9,0x3bea2189,0x3bd3e7ee,0x3bc19ca6,0x3b13a3c9,0x3c063525,0x3c0cff97,0x3a7e8905,0x3af89571,0x3caf4c3d,0x3c712c53,0x3b239004,0xbb8a73fd,0xbc2049e4, +0x3bb3a342,0x3be51c86,0xbbe23d13,0x3aa7cec0,0xbb97cce0,0xbc8eabe2,0xbc883583,0xbc3550e5,0xb9d4cb4e,0x3bb1a5f3,0x3beb912d,0x3ba4d82c,0x3baa86aa,0x3ba859b6,0x3bb58512,0x3bf46435,0x3be3b10c,0x3bb29d7e,0x3b57bd10,0x3acc2f5c,0x3b90e408,0x3965de91,0x3ba75639,0x3c9d047c,0x3c23e574, +0x3b6ed91e,0x3b00cbbb,0xbbe2fbf0,0xbc089124,0x3a8b14d1,0x3c887f2d,0xbd15adde,0xbc7b0f69,0xbbdddf2a,0x3b30e944,0x3b8a5114,0x3bd1104a,0x3b32dcb4,0xbbfe5dc8,0xbc13dce6,0xbb8b83ab,0x3c3aa0f3,0x3b3cb786,0x39d40038,0x3b1d9dff,0x3bc223fc,0x3bfaf96c,0x3bad9256,0x3abc5f9f,0xb9ef59bf, +0x3ad8fd23,0x3ad37608,0x3afe90d4,0x3b32c82f,0x3ace7e7d,0x3b510d61,0x3b7707b9,0x3c2183f7,0x3c2969e0,0x3ba2b458,0x3b591769,0x3b7aa3c7,0x3bb0f85f,0x3bd9eac7,0x3c2307a1,0x3c89ef89,0xbcd3b236,0x3cc622a5,0x3ccd10ce,0x3ca1ca1c,0x3c700205,0x3c1b47f7,0x3c39a3fc,0x3b932ac8,0xbc093d4a, +0xbc3a1ea9,0xbc2349ac,0x399ca0fd,0xb8da397f,0x3b8d6159,0x3be5e926,0x3bcaf686,0x3b3f5622,0xbae09eae,0xbafca488,0xbb2d8b40,0xbb1dcec2,0xbac78782,0xb99b9fd6,0x3a60ffb7,0xb9bb1f60,0x3b18f335,0x3b911951,0x3b28fda9,0x3b11119d,0x3b09264a,0x3ba29460,0x3bac6335,0x3b70decf,0x3bd34919, +0x3bc9678f,0x3c144754,0x3c9c5405,0xbc2e940a,0xbc0817d8,0xbb7578cd,0x3ae9e86e,0x3bb8bc85,0x3c4121c9,0x3c7eb93a,0x3c819177,0x3c43bae2,0x3c03d464,0x3c118459,0x3a5d81df,0xbb32f32c,0xbaf71c60,0x3b2cb71e,0x3b8f7914,0x3b858c61,0x3b6740b2,0x3b1dc8c4,0x3b1b5e86,0x3a3d0abd,0xb9cf46f5, +0xba965ac3,0xbae7a924,0xbaa72107,0xba61da40,0x3b06ee81,0x3b714aae,0x3b183c7b,0x3b161717,0x3a86917b,0xb9cc7ac3,0xbac71ff9,0xb992933c,0xbb1b61eb,0xbbf03847,0xbb6fc351,0x3a0546c5,0xba7518a2,0xbadde82f,0xba16038f,0xbb179e71,0xbba58717,0xbc1b9dfe,0xbb996819,0xbb431dce,0xbb1211d3, +0x39cd09b2,0x3ad2cb0a,0x3ae6bc0c,0x3a4dbe25,0x3a20e8b7,0x39e5146e,0x3ad5508c,0x3af7e753,0x3a6cfcaf,0x397409f5,0x394c9065,0x3a8c1377,0xba10d5fc,0xbae2f740,0xbb8cfa00,0xbb8b81ef,0xbb99800c,0xbb933fc6,0xbb589f28,0xbb7c80a1,0xbb92597d,0xbba4dd4b,0xbbcdffcb,0xbbe392ce,0xbba241e1, +0xbbaf135e,0xbb915cfb,0xbb483194,0xbb0d632b,0xba2a7490,0xbab2e840,0xba03b7ef,0x3a0cda39,0xbace5bdd,0xbb0f3b45,0xbaa31d9c,0x38f6f0e0,0x3ac1d85b,0x3b464e22,0x39f59f74,0xba09d64c,0xbaa619eb,0x38867a47,0x3a7d4cca,0x3accfd7f,0x3b03e883,0x3b04c9cc,0x3b365194,0xba889bf8,0xbb80ad5e, +0xbbec254e,0xbc048c90,0xbc143a93,0xbc249667,0xbc3e560a,0xbc632b91,0xbc83e24e,0xbc8ba974,0xbc83e45e,0xbc6b40f0,0xbc00c428,0xbba027c1,0xbb84c0b2,0xbb8ab3c8,0xbbac19ec,0xbbc1abc1,0xbbd89387,0xbbfb15b5,0xbc09253c,0xbbd37e11,0xbb8e88aa,0xbb23c54c,0xbb0497c5,0xbab9f0d0,0xb98f88e3, +0xb90fa96c,0x396fa811,0x39bab195,0x3a901b4c,0x3ad6a56f,0x3b2e2cf9,0x3b2dea50,0x3b35407f,0x3b63c5e2,0xba800ecc,0xbb8be638,0xbc12ff48,0xbc18270b,0xbc34128d,0xbc43eeba,0xbc2ebd04,0xbc157de4,0xbc018a42,0xbbd4d4c8,0xbba0200b,0xbb6b2489,0xbb8bd92d,0xbc11e35d,0xbbe756ba,0xbbcc12c4, +0xbbb13b51,0xbb93e795,0xbb64cabe,0xbb168df8,0xbad00d34,0xbaab9f7c,0xbabfd5af,0xbab80762,0xba97823f,0xba5aadde,0xba07780a,0xb9fa31d6,0xb9d738b6,0xb9d3f7e3,0xb9acd2b2,0xb9ed0c6a,0xb98eefd7,0x398790c1,0xbad790f6,0xbb1c0c95,0xbb506df2,0xbb60388a,0xbb8f92c4,0xbb99b208,0xbbaac69d, +0xbbb93556,0xbbd53b3e,0xbbf0ac7d,0xbc0b5932,0xbc09e396,0xbc0f390d,0xbc11a5e4,0xbc064edb,0xbb82c3b7,0xbb84a152,0xbb80b299,0xbb6d634b,0xbb5e9bbb,0xbb562be4,0xbb4e6254,0xbb37ee16,0xbb393829,0xbb2c3d51,0xbb204e42,0xbb156913,0xbb0c86ad,0xbb01186a,0xbb01f91d,0xbafebd62,0xbaf7ade3, +0xbaf5332c,0xbae9729b,0xbafefd70,0xbacfb241,0xbad2c130,0xbaaed274,0xbb2ed378,0xbb232ccb,0xbb1508f0,0xbb26df39,0xbb376d73,0xbb4804df,0xbb59c35f,0xbb67e4cc,0xbb750b17,0xbb788a53,0xbb7e41e2,0xbb8098c8,0xbb823a36,0xbb4dcb0c,0xba8dce6c,0xb7a56147,0x390ece55,0xba6ddfed,0xbabc85a5, +0xbacf2821,0xbaf86a30,0xbae07221,0xba29df97,0xbaa1afb7,0xbaa98fa1,0xba942094,0xbabec9d1,0xbae121aa,0xbb1cd490,0xbb072912,0xbae5ef14,0xba9fd909,0xba3351cb,0xba021ed9,0xba385432,0xba6e1681,0xba8a31d2,0xba9a9168,0xbaad8528,0xba60be56,0x39c24ba0,0x394dd28a,0x39a4e87a,0x3957a4e8, +0x39cf8c88,0x398acff9,0xba2b57eb,0xb8d144e9,0xb9c5bab2,0xba2f606f,0xb8b19363,0x3a22b067,0x3a48a750,0xbab3daea,0xbb1d4a4d,0xbb331a97,0xbb71fa6a,0xbb52d196,0xba38f9f3,0xbad50121,0xbab18b56,0xba627581,0xbaa08238,0xbb216fdb,0xbb9513a8,0xbb918963,0xbb72ecb8,0xbb0a8984,0xb9945092, +0x399de145,0xb9de9c44,0xba81d33b,0xbb034204,0xbb1f03a8,0xbb09f3de,0xba7ffb19,0x3af6cc4d,0x3aa98896,0x3acc646e,0x3ae4caef,0x3ad00b4e,0x3a9a41f3,0xba2f909e,0x3acc56fa,0x3ab360b3,0xbab60ff1,0xb8ad129e,0x3b7ef8c4,0x3ba50a6e,0xba4f067c,0xbb6ad71e,0xbb646d54,0xbbc67c07,0xbbac710a, +0x39f75cb2,0xbb167bcf,0xbb00d272,0xbac87989,0xbb3239e5,0xbb93d77d,0xbc047e95,0xbbf01f3a,0xbbb764ce,0xbb222812,0x3a630d84,0x3b048da4,0x3a32522f,0xba56de7a,0xbb18000c,0xbb551d64,0xbb3ee241,0xba4267f7,0x3b875a20,0x3b7a7f56,0x3b91e42b,0x3b925188,0x3bab7113,0x3b944313,0xb8f4cb46, +0x3b6d8363,0x3b3ccb63,0xba4f9453,0x3b2f069c,0x3b19efba,0x3b9814b3,0xbade8cf3,0xbb83c342,0xbb8f35c1,0xbc140cbf,0xbc023090,0x3a165e60,0xbb1b6176,0xba9b6337,0x3abf9ca6,0x3a5847a9,0xbb8e90c7,0xbc3a961a,0xbc4c5591,0xbc24a2aa,0xbb9a87db,0x3ab158bb,0x3b59d231,0x3a4a2292,0xbad3e188, +0xbb81420d,0xbb9b290a,0xbb416b90,0x3a5ba53e,0x3be86c03,0x3c2c512d,0x3c3d38ef,0x3be3c37c,0x3bddde71,0x3bce25f8,0x3b1115f5,0x3c0dbda1,0x3c06514d,0xbaad3566,0x3a18718e,0x3cb2b94b,0x3c58dad6,0x3ae1f3aa,0xbbc609e2,0xbc52171a,0x3a9631c5,0x3b7bb417,0xbbe16fe2,0x3aceef69,0xbb510761, +0xbc7defa0,0xbc7ecb6a,0xbc3e4732,0xbb9488ff,0x3b506c8e,0x3bc01c16,0x3b6c0a63,0x3b8dbba4,0x3b974ad6,0x3bb0c4ef,0x3bd8713c,0x3bbbfd39,0x3b8559a5,0x3b4b7acd,0x3aa02485,0x3b393cad,0xb995aee8,0x3ba4b34c,0x3c991ffe,0x3bffc3f0,0x3abb634f,0xb93a9443,0xbc27a4c6,0xbc1faf76,0x3b5b295a, +0x3c96da76,0xbd0ecd5d,0xbc86fe3d,0xbc37ad60,0x3951b535,0x3c0630dd,0x3be3748b,0x3b262979,0xbbc62425,0xbc24008e,0xbbbde1fa,0x3c422535,0x3b2a5915,0xb9535005,0x3ad4f787,0x3b9ea7f0,0x3bc52e92,0x3b2e2a5f,0x3a12a5f4,0xba46ff4c,0x3a30eea5,0x3b07cb23,0x3b3ecf1f,0x3b465b44,0x3a85b58a, +0x3b2f3ed0,0x3b8f5844,0x3c1bda8f,0x3c1812f7,0x3b72f054,0x3b4dcd1e,0x3b64d3eb,0x3ba82b02,0x3c0dc23a,0x3c2e9504,0x3c3a2dd7,0xbcd35808,0x3cd4914c,0x3cd2beed,0x3c9b3f55,0x3c53d9d8,0x3bc0859f,0x3c82479a,0x3c34573f,0xbc20dc45,0xbc158998,0xbc16a70d,0xbb82341b,0x39e8822c,0x3bbea977, +0x3c09f33f,0x3c002d50,0x3b94e1ac,0xbaea138b,0xbac15d91,0xbaf673cd,0xbb337f12,0xbb077d01,0xb9fe26f5,0x3a2cb614,0x3a5eeea3,0x3b386f75,0x3b593909,0x3afc3bbf,0x3ae93172,0x3b0196ce,0x3bab2f5c,0x3bce43e2,0x3bdaf8b1,0x3bac9bfc,0x3b51e0e7,0x3bf55bad,0x3ca43120,0xbc56bc28,0xbc2113ea, +0xbbde9139,0xba638d18,0x3b992d49,0x3c0a0523,0x3c38c656,0x3c21c700,0x3c5cd795,0x3c3af58a,0x3c10c072,0x3b78e921,0x390ab8f2,0x39d7d0cd,0x3b44a6e0,0x3b93828e,0x3b68e0a9,0x3b261c24,0x3a81f478,0x3a8fb3ed,0x3a3dd792,0xb9af2997,0xbb18b0fa,0xbb2917fa,0xbae88ba9,0xba98a50f,0x39e97b6a, +0x3af7c58d,0x3ac51234,0x3a65e80a,0xb90eb706,0x3916e72f,0xbab944fa,0xb983beb6,0xba889d6a,0xbc10063f,0x39b157c5,0x3b984b70,0x3a73ffed,0xbab37a98,0xba2f9560,0xbb121872,0xbb2204ad,0xbb5db3a1,0xbadc38bc,0xbb0237d4,0xbb434360,0x390bde52,0x3ab30ce9,0x3a9b5c89,0x3a8968a6,0x3aa37c37, +0x3ad3d306,0x3b2e5d4f,0x3b204f6e,0x3a4cc468,0x393a8bfe,0x3909ca09,0x3ad03eea,0xbaa2c091,0xbb2f5473,0xbb6dc625,0xbb9efdff,0xbba29226,0xbb76cf2c,0xbb16011b,0xbb0d7b15,0xbb02440b,0xbad4db71,0xbb13afc6,0xbb2b0b09,0xba479ae6,0xbbd546a9,0xbb8a5519,0xbb17c680,0xba68ad00,0xb839ad03, +0x39251d7b,0x39f5c5bb,0x3a457c93,0xba9986f7,0xba887a98,0x39373c88,0x3aa07961,0x3b0c7be8,0x3b4fe433,0x3919dce5,0xba1ff37e,0xb94ed411,0x3a38d258,0x3ac91c15,0x3ae0b1d7,0x3b23e8df,0x3af534a1,0x3a9bb2bb,0xbb2628bc,0xbb9e473f,0xbbe8ef45,0xbbee9d71,0xbc065c9f,0xbc1f9fa1,0xbc3986f6, +0xbc59e11c,0xbc730f71,0xbc8a9658,0xbc88ef00,0xbc75f53f,0xbc1b4b43,0xbb396309,0xbb0058dc,0xbb10892f,0xbb386cd7,0xbb4cb494,0xbb7a6252,0xbb9c152b,0xbbb63e68,0xbb8b965b,0xbb47acac,0xbaecb40b,0xbafc83c1,0xbb019207,0xbad9ce89,0xba80b550,0xb97955f5,0x3980086b,0x3a49ce44,0x3aa4594c, +0x3b0555ae,0x3ad2dea5,0x3abed4bc,0x3af6955c,0xbb0f20c5,0xbbbd249e,0xbc275258,0xbc2e478f,0xbc3ac0ac,0xbc48bf66,0xbc35c0b3,0xbc28869d,0xbc1bb67c,0xbbe483d7,0xbb922f2e,0xbb162dc9,0xbb320d09,0xbbd3c55b,0xbba3fd4d,0xbb9b8843,0xbb91dfc8,0xbb874434,0xbb710829,0xbb4827e2,0xbb38935d, +0xbb20bb3a,0xbb1f9b78,0xbb19cb16,0xbb09be23,0xbae56fc8,0xbace85f8,0xbad91f3e,0xbaeed4a5,0xbafda221,0xbb03b158,0xbb0f6aa9,0xbb0fa210,0xbb02b90f,0xbb502667,0xbb7059f1,0xbb84743e,0xbb808c95,0xbb8f48ed,0xbb8cd600,0xbb95c980,0xbb9ed388,0xbbace4f3,0xbbb7c1d2,0xbbd7dbd1,0xbbd067dd, +0xbbdfcd55,0xbbe2a7e1,0xbbcaf146,0xbb85651c,0xbb850d44,0xbb8653df,0xbb8173eb,0xbb7e07f6,0xbb7ce34d,0xbb7d0689,0xbb762aba,0xbb73fd0b,0xbb6a4186,0xbb5e95a8,0xbb53fd11,0xbb4b5060,0xbb3c09ac,0xbb424245,0xbb4284f7,0xbb42e7fe,0xbb44445e,0xbb428786,0xbb4bbc09,0xbb3fb2c1,0xbb3f8584, +0xbb2fef45,0xbb73cf7c,0xbb6d0961,0xbb655f20,0xbb70ffaf,0xbb7a6048,0xbb7e1755,0xbb8451b5,0xbb870c5d,0xbb864f6c,0xbb833660,0xbb83c7e7,0xbb82bba4,0xbb83dff9,0xbb934f8e,0xbaa3c155,0xb9adc2d9,0xb9962344,0xba95bae8,0xbacf2dfb,0xbadb0dcb,0xbb011f5f,0xbaea30cd,0xba518748,0xbaae61b4, +0xbab1b74a,0xba9f97ac,0xbaa275d4,0xbabe3993,0xbb116b52,0xbb07d7ca,0xbaf9c890,0xbac28e79,0xba83521f,0xba564cf3,0xba5c1195,0xba99387a,0xbab25299,0xbaccf3c3,0xbac8475e,0xba98fbf7,0xb7d250ab,0xb9e82f02,0xb9a8e328,0xb922c338,0xb78ef06b,0xb924da77,0xba8de2b1,0xb9eca5c9,0xba2867e7, +0xbaa6e186,0xb9e15ceb,0x3943c1d7,0x38722d39,0xbad66963,0xbb239ea6,0xbb307513,0xbb659b12,0xbb4e7eea,0xba7d0f06,0xbaf04669,0xbab1cb67,0xba4a1bf5,0xb965b0c5,0xbaa8990a,0xbb7b80eb,0xbb878d1c,0xbb7c4dce,0xbb271ca5,0xba80ea05,0xb9a9d2e6,0xba19e79f,0xbab62423,0xbb12969f,0xbb2f5bb0, +0xbb1cd374,0xbab257c8,0x3ad90b2e,0x3a0a8180,0x3a562e5f,0x3ad45e4b,0x3ab3ce79,0x3a8b6d6e,0xba40c18d,0x3aa1e81f,0x3a491ab4,0xbb14c8b4,0xba0524bb,0x3b5088ca,0x3b5f67ea,0xbac3bf86,0xbb782a04,0xbb61df92,0xbbbb306c,0xbba25801,0x392437ff,0xbb157f91,0xbad5a29b,0xba9962e6,0xba3f2ccf, +0xbb190411,0xbbd9b981,0xbbdc3208,0xbbbf85d8,0xbb50e9d9,0xb9a72ec0,0x3a802323,0x39e71c48,0xbaa41b29,0xbb2e99d3,0xbb602a6e,0xbb543bb3,0xbabafe7a,0x3b837d45,0x3b147cc4,0x3b47fe58,0x3b8b7278,0x3ba4f31a,0x3b8c0a93,0xba055bcd,0x3b40a0d6,0x3b0de83a,0xbb0a0747,0x3b0e7d76,0x3ae5de9e, +0x3b35622b,0xbb224a15,0xbb877d1e,0xbb83dc10,0xbbf98e63,0xbbeaaef5,0xb9b55538,0xbb37e931,0xba6ce6b6,0x3afee93c,0x3b87fdd9,0xb9b7f55c,0xbc1256b0,0xbc34fafd,0xbc270baf,0xbbbd07b7,0xb9dab944,0x3afb9d5f,0x3a5a9e78,0xbb079e7e,0xbb8507b7,0xbb9b51ad,0xbb79b185,0xb99f166c,0x3be692c7, +0x3c116e66,0x3c20f1c8,0x3be1d026,0x3bede752,0x3bded23b,0x3b2104f6,0x3c0e3f59,0x3be477ba,0xbb786091,0xba1a62ba,0x3caca0fb,0x3c2eb448,0x3a72d33e,0xbbe7716e,0xbc5e7d6a,0xbb2612e9,0x3ac24a54,0xbb924fa8,0x3b193ca6,0xbacb19b5,0xbc4fa511,0xbc684b81,0xbc3cce8b,0xbbdc5a13,0x3ac549e8, +0x3b9969fb,0x3b2e5b8f,0x3b545c92,0x3b6e7acf,0x3ba4e8ff,0x3bafefb1,0x3b8adcd4,0x3b23bf26,0x3b4bc46c,0x3aa2f028,0x3aaca0ca,0xb98d830c,0x3b9d8dc7,0x3c860146,0x3bbf9ebe,0xb8e45080,0xbb366239,0xbc4e448a,0xbc2357bc,0x3bb01931,0x3c9d5e30,0xbd031c34,0xbc8e7526,0xbc5b0474,0xba6ba6ab, +0x3c4c3dae,0x3be74a12,0x3ae14687,0xbb7f8bff,0xbc276218,0xbbcfb98f,0x3c4345d2,0x3b292d37,0xb9e5045a,0x3ad57782,0x3b552475,0x3b7aba0a,0x3a0fb557,0x3916e1f9,0xb9f171c0,0x394c1d91,0x3b0a0a4f,0x3b5dd703,0x3b41b885,0x3a3fdfb6,0x3b215ba0,0x3ba28716,0x3c0cabe0,0x3bfd8561,0x3b27a72b, +0x3b14d1b6,0x3b3d9f50,0x3bc11433,0x3c351bee,0x3c2f99ca,0x3b5dd56a,0xbccd461b,0x3cc8f744,0x3cc9d933,0x3c85c5d6,0x3c0d53b4,0x39e9ebcd,0x3c7f492a,0x3c6aea6a,0xbbdf3289,0xbb94d791,0xbbd7795e,0xbbd69625,0x3aa370ef,0x3bea9969,0x3c1e218b,0x3c0ad955,0x3baa5b6f,0xbacbe1d3,0xbaa170ca, +0xbaab65e9,0xbb18cbb3,0xbb12857c,0xba35beea,0x39df8994,0x3b03ef8a,0x3b536503,0x3b0406b0,0x3aa683e2,0x3aaf709d,0x3acfd1a9,0x3bb45b62,0x3be7670f,0x3c0db67b,0x3b30991d,0xba52baae,0x3ba58b1d,0x3c9933b2,0xbc5f11f8,0xbc32db0e,0xbc0eb779,0xbb393b7b,0x3b404678,0x3b8a4158,0x3bb2e8da, +0x3b6ee6d5,0x3c580025,0x3c5d2623,0x3c11c9da,0x3bcec79a,0x3b3ae704,0x3b3c6abe,0x3b3f7e69,0x3b80b571,0x3b294c54,0x3ac1c63e,0xb99d366f,0xba31432a,0x3955b463,0xba225ff8,0xbb537470,0xbb605f03,0xbb1a6fe7,0xba9c5bac,0xba911c18,0xb7f546e3,0x3a06936b,0xb9d38fbf,0xba83ac8e,0x39bece6b, +0xba819070,0xb933f304,0xba11f3a3,0xbc197cf0,0x3b70a9a9,0x3bf8a6eb,0x3b8c5007,0x3ac97c10,0x3a7dc2f3,0xb95be6fa,0x3aadab4e,0x3b57dfac,0x3a795b2f,0xba99153c,0xbb61b71c,0xba47eff6,0x3a1963fa,0x39e3998f,0x3a83749c,0x3ae01495,0x3b21dcb0,0x3b4a034d,0x3b2b5e82,0x3a44b047,0x39c31787, +0x393c72d4,0x3abbc680,0xbacaa939,0xbb50390e,0xbb55dde2,0xbba12c15,0xbb90ecc3,0xbb0a5713,0xba9d2fb0,0xba445f27,0x38cf1b46,0x3a834966,0x3a9bc1c6,0x3aba8808,0x3b2b5ba7,0xbc030ea5,0xbb986de6,0xbb48c994,0xbabe90bc,0xba9c7165,0x392d5b25,0x39ce65dc,0x39b20a5c,0xba17b4b1,0x38ee5a2e, +0x3a76b030,0x3b095789,0x3b1e36f5,0x3b2f6056,0x39b038e1,0xb9a8f100,0x3aa61d49,0x3ab9ddea,0x3afbf7bc,0x3b00cc94,0x3b3dff53,0x3ad46e94,0xba5963ed,0xbb793d3f,0xbbabdb9d,0xbbcd9879,0xbbccddfc,0xbbf01cbb,0xbc1604e6,0xbc2f998e,0xbc48e93f,0xbc54b29e,0xbc84c557,0xbc899074,0xbc7d149b, +0xbc384334,0xbad94430,0xba0a19dc,0xba22681a,0xba34b108,0xb9f5ce4e,0xba8aec2c,0xbade0162,0xbb1b9f1b,0xbada3816,0xba9ba1e4,0xba089286,0xba77867f,0xbaaea74e,0xbacbf070,0xba0a1cec,0x39b7f013,0x3a759178,0x3a979398,0x3ad1fbe0,0x3b02ded0,0x3a5d5b26,0x39bcb553,0x39661604,0xbb3ff06b, +0xbbced56e,0xbc2323c9,0xbc2fb97e,0xbc334f25,0xbc434aa6,0xbc326ce4,0xbc2f3f89,0xbc2861f0,0xbbf0be7b,0xbb962c6b,0xbb15204c,0xbb0d8730,0xbba0f6f8,0xbb812a75,0xbb7e59bd,0xbb7b3d8c,0xbb763499,0xbb6a507f,0xbb550e8f,0xbb4e2a7d,0xbb35d28f,0xbb2a6893,0xbb1f621d,0xbb0fb388,0xbaeb35ee, +0xbad23953,0xbae9558a,0xbb05b3ee,0xbb0e259c,0xbb1438c7,0xbb1f68f3,0xbb1e5e4d,0xbb40450e,0xbb5dbc9d,0xbb7ae944,0xbb855bd5,0xbb7aa258,0xbb7dd57d,0xbb67836c,0xbb690d64,0xbb70c54f,0xbb768d35,0xbb788143,0xbb904462,0xbb902220,0xbba3d50c,0xbba70349,0xbb97183c,0xbb7ead7d,0xbb69691b, +0xbb723d82,0xbb6ec4a5,0xbb6f61d9,0xbb709a60,0xbb73a808,0xbb75244b,0xbb70f20d,0xbb6a5db2,0xbb6133a4,0xbb57bf22,0xbb51a50d,0xbb43ec72,0xbb4b0c32,0xbb4bda78,0xbb4df56c,0xbb4ff9bf,0xbb51c0c5,0xbb516d1b,0xbb6399d1,0xbb6f553d,0xbb7a90d4,0xbb80911c,0xbb89e846,0xbb93a10f,0xbb949180, +0xbb954eef,0xbb9193a1,0xbb92cd21,0xbb9123df,0xbb8ba61b,0xbb82a9e6,0xbb74b532,0xbb88b88b,0xbb82830d,0xbb972ad9,0xbaa2e6b0,0xba02af8e,0xba0e19ec,0xba9d74f5,0xbaca7c24,0xbacf01fa,0xbaf3e715,0xbadf27a5,0xba6e14cc,0xbaa87a74,0xbaa3181a,0xba8c77e9,0xba6d3e36,0xba8f2281,0xbafc4e36, +0xbafdbd13,0xbaf7c53b,0xbacc8c4b,0xba9a1f72,0xba831955,0xba62578c,0xbaa8ae19,0xbac3842e,0xbae5d621,0xbacdc8ca,0xbaa77ce4,0xb94e4a13,0xba55a3c7,0xba364874,0xb9796f47,0xb96b9cfb,0xb9c58125,0xba9dbdd1,0xba2c5fa2,0xba4624ab,0xbacff153,0xba1c1619,0xb90f30ed,0xba01db9a,0xbaddbe20, +0xbb1a9b5c,0xbb1c5cb5,0xbb4b543b,0xbb409557,0xbaa76602,0xbafa9431,0xba9e9955,0xb9d4ec63,0x3a3b1540,0xb95626c8,0xbb476b2c,0xbb72d4dd,0xbb799622,0xbb33d179,0xbaccb8f9,0xba61c23c,0xba2d1ef4,0xbaca4e25,0xbb15947f,0xbb3bec07,0xbb20c15a,0xbac4e63b,0x3ac1d827,0x376cd6ec,0x39ac9067, +0x3ade74d8,0x3aa5f0a0,0x3a88912d,0xb9f80354,0x3a814ab8,0x39a558e1,0xbb30c137,0xba313aee,0x3b258ae8,0x3af32365,0xbae1a67d,0xbb6a6b66,0xbb4baa5c,0xbba6d1f1,0xbb92fc1c,0xba06662b,0xbb0c908f,0xba8a34c0,0xb9bf3145,0x3a94a07f,0xb9b53d1d,0xbbac2171,0xbbc27f38,0xbbbf65be,0xbb6d6ce0, +0xbabcc78d,0xb90485fc,0x395377ec,0xbac6b875,0xbb38a239,0xbb6f055e,0xbb55c60d,0xbaea6f5d,0x3b819ea3,0x3a91ac2a,0x3b0923e7,0x3b91483d,0x3b9feb26,0x3b8464f3,0xb9cd2509,0x3b1504ba,0x3ac6d6e5,0xbb3db22e,0x3af7fcc9,0x3a9b7e9e,0x3a6559fb,0xbb2989dc,0xbb733cce,0xbb57751e,0xbbc58166, +0xbbd3252e,0xbaea4384,0xbb504b90,0xb9f8ab59,0x3b35b71b,0x3be1c6a0,0x3b47e364,0xbbda3756,0xbc1c104e,0xbc23aa77,0xbbd428db,0xbb13388c,0x39a3d96a,0x3a70654a,0xbb03d411,0xbb7b846e,0xbb9981bf,0xbb8ac39e,0xba9c6f73,0x3be42c34,0x3be8b68a,0x3c02be63,0x3becfa4f,0x3c014976,0x3bef3bdf, +0x3b45f6bb,0x3c08fed5,0x3bb3b478,0xbbb21982,0xba976317,0x3c9b6017,0x3bfc9ce5,0x38bc54c5,0xbbf02697,0xbc53efee,0xbbaf4a10,0xb8fa93ba,0xba8372a0,0x3b495719,0x393cd1f6,0xbc0d88f6,0xbc51399e,0xbc3abebd,0xbbf3bb5f,0x389f1c43,0x3b5d422a,0x3b08ed9c,0x3b086e0d,0x3b11368c,0x3b7e91ed, +0x3b73ee2d,0x3b2e0d9a,0x3a842ef8,0x3b58028d,0x3ac7eb79,0xb94a751c,0x39933cad,0x3b9b46c0,0x3c4fee0f,0x3b8bee4a,0xba780e32,0xbba96eb2,0xbc5fffdb,0xbc15e0f0,0x3be64119,0x3c99c0c7,0xbceaf3b3,0xbc879ba2,0xbc6101b1,0xba8b503a,0x3c8ac9ee,0x3befd8f2,0x3aa273fa,0xba3b402b,0xbc16914d, +0xbbc8eb33,0x3c2dc373,0x3b3ab3ba,0xb83b9698,0x3a8b264d,0x3aaeca2f,0x3a9e42b2,0xbaae2a16,0xb9a9456a,0xb8fb0632,0x39b7745c,0x3ae4cd59,0x3b4d8cf3,0x3b2ac598,0x3a4266cc,0x3b283f7a,0x3bb1346a,0x3bf267d1,0x3bc29186,0x3aa90ae8,0x3a66b36f,0x3b0dc887,0x3bed27aa,0x3c5e0178,0x3c286dd8, +0xbba6876e,0xbcc4a6b9,0x3caaba3a,0x3cc32034,0x3c4e1bc0,0x3b175369,0xbbbd1c06,0x3c0f5e97,0x3c42ea0d,0xba2b03cb,0x3983cb14,0xbb65db6b,0xbbe2ec76,0x3af811cf,0x3bf44c56,0x3c1bc50d,0x3c0be9c3,0x3bb5075b,0xba41b790,0xbaa40d5e,0xbaae7796,0xbad68acf,0xbaf48218,0xba32f3d8,0x3941f594, +0x3b3da1cd,0x3b6261a7,0x3a73b9fb,0x3a148cdb,0x3a5ba77f,0x3a8e5ccb,0x3bb90e77,0x3bf0cef4,0x3c12eb40,0xba2c105c,0xbba09564,0x3b12764e,0x3c787a84,0xbc4d8496,0xbc43e23d,0xbc1bc03e,0xbb826caf,0x3a430050,0x398c6054,0x39a51baa,0xb953cb3c,0x3c40c263,0x3c69e901,0x3c0a4cb6,0x3c09a293, +0x3bbc68df,0x3b95b8a8,0x3b21ca91,0x3b36170d,0x3acf0ff3,0x398b9712,0xbabae9c8,0xbb2197a2,0xba7e3420,0xbaafb2b7,0xbb75e607,0xbb872fe7,0xbb430693,0xba912d2f,0xbb13c032,0xbacad770,0xb99d7b7e,0xba9b723a,0xba93dce5,0x3a3e4156,0x37c0101b,0x399113a4,0xba5d5cfe,0xbc0c3ac9,0x3bc4b14a, +0x3c1911b1,0x3c06e393,0x3bcc47e4,0x3b9baafd,0x3b57e4e1,0x3baba9bf,0x3c10cbc2,0x3b6a27a1,0x3856639b,0xbb5e3ebb,0xbb0d5ee1,0xba7bc6e1,0xb9585056,0x3a536034,0x3ae31b29,0x3b258e07,0x3b492bbb,0x3b2f9ada,0x3a5534f8,0x3a5012bc,0x399b4660,0x3a1c5e21,0xbadb807c,0xbb5a17a2,0xbb567b21, +0xbb926e25,0xbb54e24f,0xb9807f93,0xb9716e10,0x39688bfe,0x3ab2d279,0x3b1e4373,0x3b538afd,0x3b6ed76d,0x3b96ea5e,0xbc1b8205,0xbbbf373d,0xbba4083c,0xbb5b9d7c,0xbb371b36,0xba4ed5a2,0xb978067a,0x39803a34,0x393d0cf4,0x3aab463c,0x3b0b6cdc,0x3b4ac85c,0x3b30817b,0x3b0349fb,0x3a23f2aa, +0x39b3fdfc,0x3b221dc5,0x3b08418a,0x3b115ce8,0x3b0ec5e1,0x3b3371d4,0x3a86bd88,0xbb22d440,0xbb9af98f,0xbbb1c2c6,0xbbaa3a30,0xbbad63b1,0xbbd5f7f1,0xbc06f8e1,0xbc210603,0xbc33c006,0xbc34b55a,0xbc73c7bf,0xbc8306ee,0xbc7a073d,0xbc4ce1d6,0xbaaaacf4,0x393eda81,0x396e0a80,0x3a19a053, +0x3a90c151,0x3a5d3d5c,0x3a48aa26,0x3a16ffd4,0x3a4d6204,0x3a4dd7ca,0x3a89045c,0x39f3ab3b,0x37e15185,0xb9d84804,0x3a2f53d5,0x3abf44c7,0x3b0b5c0d,0x3b0a0465,0x3b221fcd,0x3b2f7a6e,0x3a2af386,0xb9f1c405,0xbabf9239,0xbb5dd3a6,0xbbc7a212,0xbc0c6cc3,0xbc208b68,0xbc212008,0xbc358d33, +0xbc27e7ad,0xbc2b9f2c,0xbc2a87c2,0xbbfea32d,0xbbaf8d17,0xbb63a5a5,0xbb257818,0xbb7c4eab,0xbb4462d9,0xbb479e47,0xbb4bf2fd,0xbb4ef167,0xbb4d0edf,0xbb493054,0xbb499991,0xbb32d807,0xbb20f9d5,0xbb11a552,0xbb004994,0xbaceaccd,0xbab50abb,0xbacb8969,0xbae890a0,0xbaf67eb1,0xbaf86ddb, +0xbb03e6b0,0xbaf44a3c,0xbb378336,0xbb378167,0xbb57d77a,0xbb6b8057,0xbb627f06,0xbb5aa4f7,0xbb3e82c2,0xbb37be6f,0xbb3bfb51,0xbb35b0c5,0xbb31bb75,0xbb42ad33,0xbb4cac88,0xbb6c7bc4,0xbb6fda0b,0xbb5b9750,0xbb4280a5,0xbb149bd0,0xbb258ce6,0xbb278cdc,0xbb2d1090,0xbb317ab9,0xbb3664e3, +0xbb3dd419,0xbb37c5f3,0xbb338b2a,0xbb2d997e,0xbb26d3d9,0xbb233bee,0xbb190e3b,0xbb1dd8b1,0xbb1d6601,0xbb1e919e,0xbb1f79ed,0xbb21fa85,0xbb19f334,0xbb4406f3,0xbb5b5b52,0xbb7e460a,0xbb516e25,0xbb79a1cf,0xbb9329df,0xbb90a30e,0xbb8f1add,0xbb881cd2,0xbb871bdb,0xbb830ff0,0xbb7a1d0b, +0xbb5ea5d7,0xbb3aee0b,0xbb768a9b,0xbb564153,0xbb5b9a02,0xba942b6e,0xba03c0d5,0xba2d1851,0xba941016,0xbab5720f,0xbab465db,0xbad7f96c,0xbac8ea9b,0xba8250b8,0xba957e8a,0xba8682ee,0xba527d73,0xba168ae3,0xba468bf9,0xbad102a5,0xbae21c8a,0xbae824b8,0xbaca7592,0xbaa18e47,0xba8b8ea9, +0xba5ee94c,0xbaa5fe8d,0xbabe4954,0xbae7f053,0xbabea25a,0xba9ab274,0xb94c56df,0xba6fb397,0xba4e9e79,0xb8b674dc,0xb976fb1b,0xb9cde8c0,0xba87d9db,0xba2c366e,0xba35957a,0xbacc3d2b,0xba11ecc8,0xb96cddd4,0xba3cbafb,0xbac8b5b5,0xbb062201,0xbafebc3d,0xbb2c540e,0xbb2ec860,0xbad3951e, +0xbaeffb2c,0xba737fe2,0x38c2d508,0x3ab3db08,0x3a19e26b,0xbb133a47,0xbb521242,0xbb6d570b,0xbb3a467f,0xbb01c5cf,0xbaaaabce,0xba4b0f92,0xbace5445,0xbb142be3,0xbb431419,0xbb18b511,0xbabbea9b,0x3aac4866,0xb97e850e,0x38e46720,0x3afda99d,0x3aa0d4f8,0x3a87fbe7,0xb78a7fac,0x3a60443d, +0x38e07f94,0xbb27a240,0xba1f342e,0x3b05ad39,0x3a4bc154,0xbad24252,0xbb4a54c7,0xbb2640dd,0xbb900a9b,0xbb829fb3,0xbab63463,0xbaef0ad4,0xb9a9c157,0x3a198f4f,0x3b242ce9,0x3a9385ae,0xbb836910,0xbba7471c,0xbbb89ffa,0xbb82c152,0xbb19df13,0xba93bb01,0xb9110c32,0xbae80752,0xbb41a766, +0xbb8032d5,0xbb495471,0xbaf21b74,0x3b7ce53b,0x39e3691e,0x3acb17d4,0x3ba2574e,0x3b9934ab,0x3b7a5f84,0x38e5fca0,0x3aefcd53,0x3a9d4102,0xbb4000c7,0x3af070fc,0x3a875b4f,0xb90d4536,0xbb0df702,0xbb44f2bb,0xbb190111,0xbb967608,0xbbc0b318,0xbb61fb15,0xbb562a26,0x38fdaac8,0x3b748406, +0x3c0ca9f6,0x3bb38669,0xbb939444,0xbc0259ee,0xbc1af04b,0xbbe8235b,0xbb80c43c,0xbab411ae,0x3a0efa23,0xbafa188f,0xbb6ec451,0xbb989875,0xbb8d0af1,0xbae895a9,0x3be12c5a,0x3bb533e0,0x3bd0688e,0x3c02cfc5,0x3c0b99ee,0x3bf98492,0x3b74d10c,0x3bfe57f9,0x3b891d71,0xbbc20d69,0xba8d7495, +0x3c821b30,0x3b9abf70,0xba3d8548,0xbbe55a4b,0xbc3b4a5a,0xbbec1c62,0xba8e28db,0x3b25979f,0x3b80a712,0x3afa1963,0xbb867d05,0xbc3c4a47,0xbc3a3efa,0xbbeea3c0,0xbaa15480,0x3afbcfd0,0x3ad95913,0x3a9af709,0x3a72c8ca,0x3b150d54,0x3af31f44,0x3a9134b0,0xb995c59a,0x3b6454dd,0x3b000372, +0xbac8ca92,0x3aaa5915,0x3ba273c9,0x3c0b0a67,0x3b4b00b4,0xbaacd765,0xbbdc5ac9,0xbc5b33c0,0xbbf24a8c,0x3c0b2d2c,0x3c8f2f0d,0xbcc8dec5,0xbc5f43ac,0xbc50f003,0xba224bc3,0x3caa31c5,0x3c05b655,0x3acbb97b,0x3b390819,0xbbfee5ed,0xbbbeb867,0x3c043db3,0x3b45c96e,0x3a216ad1,0x389a354a, +0xb9937952,0xba4533a7,0xbb10190c,0xba2d314c,0xb8cf03dc,0x3a12bdaf,0x3a8968ac,0x3b15e9a9,0x3b138a23,0x3a7f3ff5,0x3b3d5b60,0x3bb787c8,0x3bc9af63,0x3b861928,0xb92c6db6,0xb9fca6c8,0x3aee8be9,0x3c11ba40,0x3c7ba9c9,0x3c101e6d,0xbc4ac6fe,0xbcb62b98,0x3c801545,0x3cc0a20c,0x3c0f7ba3, +0xbb81efa0,0xbc42f042,0xbb1672c5,0x3bb5a307,0x3c02d0ba,0x3b7ee2eb,0xba9ff870,0xbbb2cef1,0x3b0ddb6d,0x3bdc2c4e,0x3c06ba91,0x3bfdc437,0x3bb062da,0x3a143d70,0xba9ad86c,0xbac1fbbe,0xba429557,0xba7b562d,0xb989be78,0x38ce3afe,0x3b5f4587,0x3b5c1af1,0x399f9a60,0xb92e8a5a,0x3985eedd, +0x3a355c03,0x3bb85090,0x3be58ce7,0x3bf8a2f6,0xbb703a09,0xbc008c85,0xb9c955d8,0x3c202d28,0xbc2a21e4,0xbc4bb79f,0xbc1acb2a,0xbb948808,0xba9893d2,0xbb31038f,0xbb48f5fc,0xba37b895,0x3c1e1368,0x3c5d31ce,0x3c05d053,0x3c260d1b,0x3c0a1fb0,0x3bc1a359,0x3b093575,0x3a9e433c,0x3a0337b6, +0xba84aad0,0xbb1b2afa,0xbb6e1f7e,0xbb172e5c,0xbb164a18,0xbb819deb,0xbb92aa54,0xbb5f19df,0xba955c28,0xbb3bceac,0xbb204072,0xba5856c9,0xbac0c22b,0xba34042a,0x3a790ef1,0x3aa1dffc,0x3a74ab02,0xba994753,0xbbd8540f,0x3bef0c96,0x3c263346,0x3c3e3cee,0x3c350243,0x3c1c212b,0x3bea005c, +0x3c06d4b4,0x3c426adf,0x3bcafbdb,0x3b0e5730,0xbb1b51c2,0xbb37f04e,0xbb23f0ac,0xba8c4449,0x3a1bec86,0x3ac8dac2,0x3b089804,0x3b317924,0x3b23b9d7,0x3a7c057f,0x3a8fc4ea,0x39672c5d,0xba196339,0xbafc2c94,0xbb5a5738,0xbb5d4849,0xbb640c58,0xbad69dd8,0x3aa77e82,0x3a0194d3,0x3a3a5835, +0x3ad94d8e,0x3b305288,0x3b7ff5fa,0x3b997ceb,0x3bb3a4ec,0xbc30c467,0xbbdc1920,0xbbddf039,0xbbad75e1,0xbb886728,0xbae73916,0xba185768,0x3a133c76,0x3a97d347,0x3b1e562a,0x3b57b9d7,0x3b766847,0x3b491c0e,0x3af2b411,0x3a9a34d9,0x3ab9f797,0x3b4a9da5,0x3b2a914f,0x3b24835b,0x3b1d292a, +0x3b04b0c3,0x3860966e,0xbb6d2f19,0xbba678a3,0xbbadd1c9,0xbb8ec8fe,0xbb9737db,0xbbbf201a,0xbbe78bc2,0xbc0d8494,0xbc1b1386,0xbc13b954,0xbc4fc2b2,0xbc68fd82,0xbc6f764f,0xbc5a64f7,0xbacd6eb9,0x38a6abef,0x398a43ae,0x3a72c8cf,0x3ac611cf,0x3adc1603,0x3b0c79bf,0x3b27ae07,0x3b28c263, +0x3b1eff60,0x3b2664a8,0x3af74f3d,0x3ac5aba8,0x3a905542,0x3af1d1d8,0x3b193e71,0x3b3e5949,0x3b37225a,0x3b410af2,0x3b52d6e8,0x3a49a488,0xba886b80,0xbb37f857,0xbb691743,0xbbadbf05,0xbbd3c907,0xbc057a86,0xbc08f0dd,0xbc239596,0xbc1b7d3c,0xbc24c8a3,0xbc29d7cf,0xbc0773dd,0xbbcfad62, +0xbba11a1a,0xbb52c8b9,0xbb3977b2,0xbb07bbb5,0xbb123fb1,0xbb1a77e3,0xbb20dc90,0xbb26bc30,0xbb31c8dd,0xbb3b703e,0xbb299366,0xbb152d3d,0xbb018243,0xbad5af14,0xbaa80eed,0xba9111a0,0xba99964c,0xbaa583fd,0xbaaaba12,0xbaa1f054,0xbaa5f063,0xba872c85,0xbb0c0870,0xbb000a41,0xbb206f50, +0xbb385484,0xbb402ee5,0xbb38ebb3,0xbb221ef0,0xbb190251,0xbb2051ca,0xbb16001a,0xbb1435a7,0xbb1ab6ff,0xbb201104,0xbb2ffb8b,0xbb2c04d2,0xbb1e84f0,0xbace9d6f,0xba51428b,0xba934bee,0xbaa1d838,0xbab68a02,0xbac65d28,0xbad31834,0xbae9fda4,0xbad6bb46,0xbacf41f6,0xbac90c1e,0xbac15d39, +0xbabb302a,0xbaa9ab9e,0xbaadbcac,0xbaaa77ed,0xbaa96bdb,0xbaa75593,0xbaa9aaf3,0xba9164d2,0xbaeed104,0xbb104015,0xbb3ceaf8,0xbafd31c7,0xbb29f176,0xbb61e21c,0xbb5bd3b4,0xbb58d9f7,0xbb49f5df,0xbb48a7a2,0xbb40abaf,0xbb396739,0xbb17ad27,0xbaddabfb,0xbb2b3d53,0xbb00e00b,0xbace5f3b, +0xba750551,0xb9ecb759,0xba2333f1,0xba79331b,0xba954f92,0xba967d4b,0xbab6b813,0xbaace448,0xba855787,0xba6fbb5c,0xba40b6e7,0xba00cfc0,0xb991df21,0xb9efbfb2,0xba9bfad1,0xbabbdaff,0xbacaad6d,0xbabadda2,0xba9a2bc4,0xba86edcd,0xba4c0e10,0xba9ea264,0xbab829de,0xbae98d6d,0xbaa4c694, +0xba872039,0xb95d640f,0xba7303c6,0xba4dfcdb,0x38acbe7a,0xb97cca9e,0xb9d3ea74,0xba59ec5f,0xba19eabe,0xba0a37ca,0xbab72c50,0xba01f295,0xb91335b5,0xba202aa8,0xba92b209,0xbaccfc80,0xbac42ea6,0xbb0f1b75,0xbb1c9096,0xbaf071b9,0xbacd3f25,0xba0e268e,0x3a0f1880,0x3ae4c0d4,0x3a949f82, +0xbab0e0c7,0xbb2acfd7,0xbb56986a,0xbb3853c6,0xbb11b752,0xbad69903,0xba7c43f1,0xbadf3eeb,0xbb14739e,0xbb48526d,0xbb0800ca,0xbaa03f37,0x3a90b15a,0xb998f5f0,0x389e9960,0x3b0c3001,0x3a9dc092,0x3a891231,0x39f0bbaf,0x3a5f7ef4,0x38fcf3c6,0xbb058448,0xb99cf802,0x3adaf7f1,0x3960aa4e, +0xba9abac2,0xbb1cda5c,0xbb07526d,0xbb7bf59f,0xbb6cee95,0xbb0db148,0xbab23622,0x39e315da,0x3ab0fba7,0x3b561fcd,0x3b065bf0,0xbb2927c5,0xbb87f989,0xbba8b334,0xbb870e2d,0xbb434dff,0xbafefd3b,0xba1dee7e,0xbb0beea0,0xbb4fb7ea,0xbb8b6d50,0xbb304a80,0xbad6c01e,0x3b6b31e7,0x39370ceb, +0x3ab3b6aa,0x3bb4006b,0x3b8ee14b,0x3b680cf5,0x3a3af02c,0x3ad7a0f9,0x3a9d8380,0xbb22d7a0,0x3af0aa70,0x3abab5d9,0xb8c38226,0xba8f7014,0xbaf8af7e,0xbaba2915,0xbb67bb86,0xbbb3c483,0xbb9aa21b,0xbb423f8f,0x3a487e64,0x3b8cb048,0x3c15508c,0x3be6b759,0xbaff9548,0xbbcc1763,0xbc0d140f, +0xbbf2a5df,0xbbae8c4d,0xbb481a6d,0xb9dd3674,0xbb128291,0xbb747725,0xbb9f1953,0xbb84f465,0xbafb95e9,0x3bdacbce,0x3b8d72c1,0x3ba772bc,0x3c1211b1,0x3c14af6d,0x3bfe4312,0x3b91d318,0x3be9bd1c,0x3b58577c,0xbbb28c7d,0xb9e5b587,0x3c427261,0x3acba234,0xbaca172c,0xbbd5c9ed,0xbc21cb5a, +0xbc0e1833,0xbb078014,0x3ba5510f,0x3b9aae79,0x3b6acfd0,0x3988eef3,0xbc26d2ed,0xbc39f895,0xbbe974b7,0xbb042b86,0x3a87a668,0x3acffcfa,0x3a7a2753,0x399af8ef,0x3a68fa9c,0x3934894d,0xb926ff69,0xba9053e8,0x3b6546d0,0x3b18c73b,0xbb20b216,0x3b306116,0x3bb44f1e,0x3b99e063,0x3b0eaed6, +0xbad996bd,0xbbf0d64d,0xbc451d53,0xbbabcf71,0x3c1994fc,0x3c772385,0xbca113dc,0xbc17ee31,0xbc33df3f,0x395d835f,0x3cbe9d19,0x3c1f74f1,0x3b30c8e4,0x3bad9987,0xbbdad75d,0xbbbadbc9,0x3bab759b,0x3b7d6b3d,0x3b05dfb8,0xba5ac29b,0xbadc4957,0xbb19f9cf,0xbb1adb77,0xba92e3b1,0xba2faa02, +0x33e9b045,0xb8be9b0e,0x3a865313,0x3b024fb5,0x3a9a820a,0x3b4ee888,0x3bafc7f2,0x3b9e1ae5,0x3b154aa8,0xbadd02e6,0xbab2762b,0x3b0553d8,0x3c2790b8,0x3c7a98bb,0x3bcb79a8,0xbc8786ee,0xbca0bd7d,0x3c22e0de,0x3cc0114f,0x3bb4a19a,0xbc1289fe,0xbc8db97d,0xbc580a57,0xbac552ba,0x3c896bef, +0x3bc9877f,0x37945431,0xbb2e09f3,0x3b0aae65,0x3bb1b94a,0x3bdf2ca2,0x3bd5adf6,0x3b9ded97,0x3b0376c0,0xba42a334,0xba9c4736,0x39cda84a,0x39669c2f,0x3a01afb3,0x39bad5d4,0x3b66641c,0x3b3c3b83,0x38b776e9,0xba5bb7b9,0xb9a89c00,0x3a022ca3,0x3bae695c,0x3bc0e4cf,0x3b9fcaa4,0xbbadde46, +0xbc101fa2,0xbb0b7098,0x3b780d4a,0xbbfaff92,0xbc4c8ee3,0xbc1405dd,0xbb9c516b,0xbb2cc0c0,0xbb784245,0xbb83223f,0x3a972127,0x3beda507,0x3c3e5724,0x3c0d29f1,0x3c377180,0x3c24cec8,0x3bdee310,0x3b113e8d,0xb9800f25,0xba748793,0xbb207ee8,0xbb5a924e,0xbb888b5b,0xbb62f0cb,0xbb52b105, +0xbb8304f6,0xbb8f7355,0xbb61cd1a,0xbaa2e138,0xbb3f8241,0xbb34e447,0xba975150,0xbac9c160,0xb9123499,0x3a5da888,0x3b034f55,0x3ab14b97,0xba9eb038,0xbb836378,0x3bf283ff,0x3c13233c,0x3c595816,0x3c6b32dc,0x3c54f5aa,0x3c253bee,0x3c2246d5,0x3c4a0faa,0x3c00acfa,0x3b8e9fc5,0xb995fbaa, +0xbb073efe,0xbb3dc305,0xbb07e5e3,0x39072d6a,0x3aa8b04c,0x3b00221e,0x3b1898cc,0x3b0dd5af,0x3a9dd702,0x3a8e9578,0xb8d83a55,0xbadc31a3,0xbb1de413,0xbb5bb11f,0xbb5cfdf2,0xbb07540c,0x392a1ce1,0x3b111c98,0x3a6cde90,0x3a4c764f,0x3aa9294c,0x3b26a1e6,0x3b859957,0x3baa8395,0x3bb4bc4d, +0xbc399103,0xbbe660fe,0xbbed3775,0xbbc1fac8,0xbb984640,0xbb0537cc,0xb9ef9f0e,0x3a80e617,0x3af3b50e,0x3b40a8db,0x3b7901a7,0x3b73c241,0x3b5443ab,0x3b086d6f,0x3b029a59,0x3b1faa92,0x3b56486f,0x3b3e5957,0x3b295708,0x3b1d09b0,0x3a83c162,0xba972a97,0xbb90afc1,0xbb9e77d1,0xbb9bc672, +0xbb80cba4,0xbb8ad4fe,0xbbab962d,0xbbbd0f27,0xbbe9341d,0xbbf94ce7,0xbbe07f5d,0xbc1e5a45,0xbc3df23b,0xbc5c509e,0xbc5aa7f4,0xbb1525ff,0xba0bc6d9,0xb991f9aa,0x39fd03e8,0x3a81eed1,0x3ac461d6,0x3b1b365a,0x3b5af1a5,0x3b6120ff,0x3b5b0e50,0x3b5ef18a,0x3b3d41fe,0x3b2e2f42,0x3b218ee4, +0x3b330c14,0x3b3a766a,0x3b464d63,0x3b369085,0x3b288b22,0x3b37188b,0x3a1f7055,0xbabc0951,0xbb653114,0xbb633fa8,0xbb8d5916,0xbb92a45c,0xbbcfcc95,0xbbe1a01a,0xbc0f6177,0xbc0e9ae3,0xbc1d597b,0xbc289a7d,0xbc0fc995,0xbbf0dd6a,0xbbd00b54,0xbb85bdb9,0xbaff4b4d,0xbaab73e6,0xbac88674, +0xbad8b6cb,0xbae1dabb,0xbaf514ba,0xbb0f744a,0xbb22e94e,0xbb18301c,0xbb02ad1d,0xbad34950,0xba99c870,0xba5614d2,0xba194879,0xba0e5388,0xb9f9205b,0xb9c4966d,0xb977e20a,0xb9145630,0x38f59f44,0xba8e7bc5,0xba7b8cda,0xbabb0d71,0xbaeec28d,0xbb12786b,0xbb141bf4,0xbb08793b,0xbb00a4cb, +0xbb0c34a0,0xbb03bae1,0xbb074712,0xbb0e53fd,0xbb077c8f,0xbb06ab94,0xbafa7161,0xbae7f66c,0xb9dc8a1c,0x393c51eb,0xb9130953,0xb9a08f76,0xba082a73,0xba30d738,0xba49c3ae,0xba787d78,0xba41c6bc,0xba31d3b6,0xba2e060c,0xba27c2cd,0xba1b9904,0xb9f8301a,0xb9edf006,0xb9d6ce3f,0xb9c8a776, +0xb9ad8273,0xb9a67384,0xb8b6d488,0xba2ce767,0xba73fc5f,0xbac7be75,0xba521ab4,0xbaa8c2ac,0xbb05864f,0xbb02d618,0xbb031e6e,0xbaf07756,0xbaf50c1c,0xbaeaa35e,0xbae91268,0xbaab3e8d,0xba580881,0xbaadb111,0xba493a61,0xb9ade0d3,0xba45eb1c,0xb9c84c19,0xba0f1dc0,0xba45dcad,0xba6ec302, +0xba7d2d42,0xba9f2c99,0xba98ea9f,0xba836bac,0xba395cec,0xb9fd9a84,0xb98c5892,0xb8b3dcba,0xb9809260,0xba4e98de,0xba9707f3,0xbaacb23c,0xbaa8254b,0xba91c454,0xba8286d2,0xba44cfe0,0xba961cf3,0xbaaba8a5,0xbadf5812,0xba86eea5,0xba57ce33,0xb94343d1,0xba4ecd0c,0xba269913,0x398a6550, +0xb93977d3,0xb9b47f9b,0xba127615,0xb9efdb2b,0xb9bc1737,0xba8e2cd5,0xb9cb7460,0x3914bfd6,0xb9aef186,0xba1f492d,0xba88c376,0xba92eb5f,0xbafc76c9,0xbb1385de,0xbafcab07,0xbaa579d5,0xb9635c50,0x3a498926,0x3af2bfff,0x3abffc2b,0xb9eac408,0xbb03cd6c,0xbb3cac21,0xbb319eb0,0xbb1d954f, +0xbb008c72,0xbaa57db7,0xbaf423ac,0xbb161d59,0xbb4b6978,0xbae0165a,0xba6ad0a3,0x3a51eb4d,0xb977946c,0x38d67196,0x3b0d1c29,0x3a8f735a,0x3a836cdb,0x3a67a03a,0x3a6f1c68,0x3996fa1e,0xbaa9e669,0x39045cda,0x3aba920f,0x372b4e3f,0xba1ba0a0,0xbad82f13,0xbadd2ca8,0xbb6d411b,0xbb65f9b9, +0xbb2c80b1,0xba686623,0x3a87dee2,0x3adb4cbd,0x3b64928d,0x3b26c2f1,0xba83565e,0xbb50fc5d,0xbb94dda0,0xbb847305,0xbb639ad3,0xbb315727,0xba9e445f,0xbb26d0fa,0xbb5c20e5,0xbb95c1f0,0xbb0a590c,0xba9b7d7a,0x3b481f0b,0x397b204c,0x3ab2f57a,0x3bbb20a3,0x3b7b5a70,0x3b4f4997,0x3aaec941, +0x3ad56201,0x3ab8d820,0xbadc7cf8,0x3af0b693,0x3b13dfc0,0x3a2762f5,0x39c4d7f2,0xb9fa522e,0xba06f74e,0xbb47c00d,0xbbb1a83d,0xbbafc0ba,0xbb1c894f,0x3aa133c2,0x3b87abdc,0x3c0eb6b8,0x3c0281bb,0x3a68aedd,0xbb92a511,0xbbf94cca,0xbbf26063,0xbbd4c978,0xbb9b44db,0xbaecd1e8,0xbb42ff58, +0xbb866ae9,0xbbaf1b7e,0xbb64c563,0xbad046b3,0x3bcc1ef4,0x3b62f49c,0x3b8b9011,0x3c1f0ba0,0x3c1a685c,0x3bff2a46,0x3baba87c,0x3bda739f,0x3b42406e,0xbb85ecfa,0x3a2fc14b,0x3be71b91,0xbad7a95b,0xbb317a00,0xbbd5986a,0xbc1b0575,0xbc20f4ea,0xbb4862c4,0x3bcc221f,0x3ba5bc5e,0x3b9d2251, +0x3b7f65e6,0xbc0ce1d3,0xbc34cdf3,0xbbeea279,0xbb14e003,0x3a3dc707,0x3ad0bf08,0x3aa89a0e,0x39a1d3ef,0xb79ddafe,0xba7b3604,0xba73ee71,0xba95f2b0,0x3b55e55b,0x3b22550a,0xbb3d281d,0x3b8b9f0a,0x3bcd3adf,0x3af51e63,0x3aa9c8c4,0xbb1677ea,0xbbf46114,0xbc24b33f,0xbb476891,0x3c1c7875, +0x3c39eefc,0xbc6a5341,0xbb9b17c2,0xbc0d146e,0x3ab159f5,0x3cc3cdc3,0x3c3b3f19,0x3b920f63,0x3be03993,0xbbb209e7,0xbbb19781,0x3b2aad72,0x3bb6086a,0x3b8b7f85,0xbaffc8c0,0xbb3921ea,0xbb727698,0xbb2c44a6,0xbaee3e31,0xbad962dd,0xbaadcaa7,0xbad33fb5,0xb9edec20,0x3aee28b5,0x3aa27765, +0x3b51c12b,0x3b9cad78,0x3b6263cd,0x3a11746b,0xbb4a914b,0xbad6e642,0x3b27c2ea,0x3c2bcf8a,0x3c5adbb4,0x3b4f05fa,0xbc90b175,0xbc863473,0x3b98c68d,0x3cb2d7e3,0x3ab8d5e0,0xbc50ef16,0xbca75321,0xbcac13c9,0xbbf01451,0x3cb0eab7,0x3be6dd18,0x3a88f610,0x3a1d4315,0x3add632e,0x3b6bebfb, +0x3baff397,0x3bb7985f,0x3b936f8a,0x3b57433e,0x38885c3b,0xba051512,0x3ac3a989,0x3aa0bbd6,0x3a9941db,0x3a487d2b,0x3b524e38,0x3b0c55ff,0x39032822,0xbab32a42,0xba52169e,0x3a1c0281,0x3b943507,0x3b830239,0x3ad0be73,0xbbb38817,0xbc02fdee,0xbb23aff9,0xbae5d0c8,0xbba8f0ec,0xbc3e9798, +0xbbffabc6,0xbb8864e7,0xbb5af1a7,0xbb3bd02e,0xbb324724,0x3b5fb5fb,0x3ba4f0d1,0x3c1b4fdd,0x3c1dabe9,0x3c3bc9c0,0x3c2cb5f4,0x3bebba7a,0x3b201c3e,0xbab18b4f,0xbb20ca7f,0xbb79c6de,0xbb8c2050,0xbb8e93f7,0xbb8f89f0,0xbb836dff,0xbb827b52,0xbb81657a,0xbb4c6f1f,0xbab3621b,0xbb2325a6, +0xbb2ab96c,0xbac088a6,0xbad7006f,0x396caa3e,0x3a2b0f4e,0x3afc7e3b,0x3aa6ed36,0xba0e7fe7,0xbac4b58f,0x3bc3db60,0x3bb3cd9b,0x3c45c800,0x3c729446,0x3c63f4cd,0x3c3eed87,0x3c2d1ef4,0x3c3dec53,0x3c0c73aa,0x3bc383f8,0x3b268aa4,0xb9ed2968,0xbb0b766a,0xbb18dedf,0xb934369a,0x3aa67c7d, +0x3b079936,0x3b074f2a,0x3af9c596,0x3acb5dc0,0x3a77c541,0xba15e2c3,0xbb2b3fa7,0xbb4889a6,0xbb5f47bf,0xbb53e16b,0xba13318e,0x3ae67246,0x3b2ad5a9,0x3a8fa88f,0x3a445865,0x3a76caa4,0x3b34c68e,0x3b8f9c23,0x3ba21442,0x3b955103,0xbc2704f5,0xbbe1e712,0xbbc691c1,0xbb980281,0xbb6db679, +0xbab012c9,0x38ca0b1d,0x3ab8078f,0x3b10d010,0x3b3edddc,0x3b704400,0x3b49ebdf,0x3b3f2f88,0x3b110255,0x3b2a9042,0x3b39ecfb,0x3b420917,0x3b37dbc3,0x3b0eda62,0x3ae8d22a,0xb98ceb73,0xbb1d79b4,0xbb9f63a1,0xbb8a9f92,0xbb8199b5,0xbb7bae11,0xbb86dc3e,0xbb9b5854,0xbb8f9751,0xbbab34a6, +0xbbaeb8e8,0xbb95b6fd,0xbbd0026f,0xbc0a8e68,0xbc3c3245,0xbc3e4e8f,0xbb5358f6,0xbaae1d0c,0xba928af6,0xba058840,0xb9062d28,0x3a12718b,0x3ad6ecea,0x3b4059e3,0x3b5acda7,0x3b66ca97,0x3b75755a,0x3b5fd852,0x3b572f20,0x3b543def,0x3b4efc93,0x3b45ae23,0x3b3b72b9,0x3b1cada5,0x3aedbfb3, +0x3ae745fd,0x3931fd56,0xbad0f9f2,0xbb65f00c,0xbb553067,0xbb67ec57,0xbb581937,0xbba0cb16,0xbbb9dbb4,0xbbf333e7,0xbc00c870,0xbc139e97,0xbc243e97,0xbc151904,0xbc06d994,0xbbfc35e5,0xbba7ba60,0xba9fe6ad,0xba49a41f,0xba79bdfd,0xba7ad659,0xba72933c,0xba8976e9,0xbab6bdf5,0xbae5b6f2, +0xbae10075,0xbabebf30,0xba8d78c2,0xba2866db,0xb9904855,0x37f8ba9c,0x39221c6b,0x39b0040b,0x3a12c459,0x3a4485ce,0x3a7a297e,0x3aa0afe7,0x3926f46d,0xb7118bca,0xb9f749bb,0xba6ae932,0xbac7616c,0xbaedb23b,0xbaeea3e3,0xbae6bbdb,0xbafcc640,0xbaf9109c,0xbb054a5e,0xbb0dc184,0xbaf4a6b3, +0xbad1c289,0xbab7d93b,0xbaaaf2dc,0x373b4610,0x399feef6,0x38b71dc4,0xb8af9e2d,0xb997ed84,0xb9da579a,0xb9f0c98e,0xba126a33,0xb9b536cf,0xb99883bb,0xb99eecaa,0xb99cf96d,0xb98e308f,0xb946fb01,0xb90544fe,0xb88a7a41,0xb7cd2e02,0x387e3a12,0x38dd135b,0x39ae416d,0x366b86bc,0xb8e91d98, +0xb9e0a972,0xb997a695,0xba04d2e7,0xba723ee6,0xba7803d5,0xba868270,0xba807293,0xba8bd2e7,0xba88c545,0xba95213d,0xba61164f,0xba27349f,0xba00724f,0xb9548107,0xb8b201c7,0xba0e258a,0xb96dc66a,0xb9d8c5bf,0xba03f261,0xba29348f,0xba4a0dbf,0xba8901a6,0xba856f2b,0xba6dba30,0xb9f740bf, +0xb969ab33,0xb8a739ab,0x38bb2cd0,0xb805c3d1,0xb9b2a1ae,0xba5812c8,0xba87a6ff,0xba8e25a2,0xba8160aa,0xba6f112d,0xba365ed0,0xba82f947,0xba93d6f6,0xbad00e17,0xba3af697,0xba11bc0b,0xb94f3a70,0xba2008fd,0xb9f0de8e,0x39af161b,0xb9127208,0xb9962b36,0xb9907a33,0xb992fefe,0xb9216ea5, +0xba3e3462,0xb95ad4c5,0x3a0cb0a8,0x3853b0c9,0x38522e93,0xb9cc6122,0xba3c245b,0xbae14d7f,0xbb0bccf2,0xbaf29475,0xba6d333e,0x38cd3ad3,0x3a62b242,0x3af6e2e8,0x3ae5c237,0x3a069654,0xbaacfe81,0xbb1a2155,0xbb22ed89,0xbb1fab23,0xbb0dc82c,0xbac6357a,0xbb012d40,0xbb10e6dd,0xbb42a3ce, +0xbaa30594,0xb9fe294f,0x3a045692,0xb8a5c097,0x394a8fd4,0x3b012df1,0x3a743737,0x3a700a00,0x3aa7b01d,0x3a80dcc1,0x3a056724,0xb9eb56f5,0x3a1dc6b2,0x3abb06ba,0xb7a267b4,0x391a7d3c,0xba5ce37c,0xbab3b0b2,0xbb66e989,0xbb665cc0,0xbb38116b,0xb9c7948b,0x3accac82,0x3ae301bf,0x3b657f8a, +0x3b3da139,0x3a3f4880,0xbb0af3a8,0xbb75d527,0xbb7888d3,0xbb732ac7,0xbb543587,0xbaed4de0,0xbb38d6a2,0xbb5a67f7,0xbb961c9b,0xbab0b561,0xba1ad07f,0x3b1c5497,0x3a05363d,0x3ab8fecf,0x3bb10eba,0x3b4959f2,0x3b2df275,0x3aff840a,0x3ad3d5a4,0x3adbc7b8,0xba2647f6,0x3afdd133,0x3b57a485, +0x3ac59334,0x3b0d634e,0x3aa3c38b,0x39d5ad9e,0xbb343836,0xbbb01a35,0xbbb24920,0xbad6ee87,0x3ad62c2c,0x3b6e527f,0x3c02ebd2,0x3c0df965,0x3b819627,0xbb24260c,0xbbcf1b0d,0xbbe7f0f0,0xbbeb5ea4,0xbbc6e166,0xbb52356f,0xbb774490,0xbb923f73,0xbbbe2f96,0xbb2f0fd1,0xba6ef6f7,0x3bb602fe, +0x3b409336,0x3b764aa0,0x3c26062b,0x3c1a9ffd,0x3bfb9c9b,0x3bc82b3b,0x3bcbdbb5,0x3b417ec1,0xbb11a34b,0x3b03a280,0x3b22973f,0xbb8a5f3b,0xbb84d615,0xbbe1f876,0xbc237337,0xbc2f46bb,0xbb878274,0x3bd05d68,0x3ba34833,0x3bb03c4b,0x3bdd7a64,0xbbdb4b10,0xbc2a99ba,0xbc00070c,0xbb1779d8, +0x3a3f4bf4,0x3acf5940,0x3af96d51,0x3a5bbd14,0xb9b0a246,0xbab4e44f,0xba85e325,0xb9b7ae4c,0x3b3e69df,0x3b1d2d2a,0xbb42a8bb,0x3bbd8ac5,0x3be81c46,0x38be02ba,0x39af6274,0xbb56627e,0xbbf1d81e,0xbbff114b,0xba667bc9,0x3c15c03b,0x3beecfb1,0xbc156734,0xba4fc27e,0xbba9aeaf,0x3b477438, +0x3cb8d7a5,0x3c55c01e,0x3bd95a7a,0x3bec96bc,0xbb89d659,0xbb9eabb5,0x3a2312df,0x3be7b70f,0x3bd4b49b,0xbb1f7a0d,0xbb562509,0xbb8c5da5,0xbb29f696,0xbb118f2c,0xbb21210d,0xbb376029,0xbb4036f6,0xbae0f81f,0x3ad2b953,0x3a9c6561,0x3b463143,0x3b85b926,0x3b0c3172,0xba870536,0xbb898c2c, +0xbaa1cc4e,0x3b5ae674,0x3c1d40c9,0x3c2b0923,0xb7d18824,0xbc8f5d34,0xbc59d6b7,0xb8c53ebf,0x3c80aa20,0xbb9f9a8c,0xbc82bdd8,0xbca4565c,0xbcd03813,0xbc428cff,0x3caf9349,0x3bf5bc2a,0x3b385a18,0x3b63fb1f,0x3ab73bca,0x3af81ca3,0x3b81590b,0x3ba8aef6,0x3b9be2bb,0x3b90e0ca,0x3aa6889a, +0x39ea65ab,0x3b1107b9,0x3af21b73,0x3ac82e3f,0x3a91b5a7,0x3b2a669e,0x3aad5fbc,0x39569c0e,0xbae02a07,0xba8da037,0x3a81e6e0,0x3b5398ef,0x3adbe1d7,0xbad4cac0,0xbb974740,0xbbc572dc,0xbafc2aa6,0xbbb9dd10,0xbb428b42,0xbc116bc1,0xbba1fd7d,0xbb02e438,0xbb04f9be,0xb9a54624,0xb9af40d3, +0x3b96c688,0x3b5f01b7,0x3bffb921,0x3c2eb898,0x3c367357,0x3c27dbe2,0x3bea8536,0x3b2baa00,0xbaeb1e05,0xbb659bcd,0xbb98a41b,0xbb9fa4d1,0xbb8e17af,0xbba2bff2,0xbb95f85e,0xbb829f67,0xbb5ab3ef,0xbb249679,0xbac27455,0xbae1b9bd,0xbb0960aa,0xbae93956,0xbadf42be,0x39dee4e1,0x3a00b8fd, +0x3ab4b31f,0x3a8b1947,0x3a628f58,0x39a1e3d2,0x3b56639c,0x3a87bd07,0x3c0658be,0x3c4488cc,0x3c49d2d8,0x3c3efbc4,0x3c3174c4,0x3c375334,0x3c19f41e,0x3bf43fc5,0x3bb8d130,0x3ae77242,0xb9fd2f9e,0xbab83571,0x38aa3fc1,0x3ab9c763,0x3b11da9d,0x3afc9182,0x3ae4af77,0x3aee8a17,0x3a387c12, +0xba95898e,0xbb60721c,0xbb74d616,0xbb62b738,0xbb3d6f2f,0x3a20bce7,0x3b365e1f,0x3b2aac72,0x3aad78e6,0x3a80db36,0x3a862ef6,0x3b569832,0x3b973de5,0x3b829dd8,0x3b3fff8c,0xbc0072e6,0xbbc5897b,0xbb6825ed,0xbaf16ebe,0xba88a4da,0x3928ff4a,0x3a7a550a,0x3aee3672,0x3b1e2210,0x3b31b6b4, +0x3b4fc10d,0x3b12f066,0x3b15de0b,0x3b0ef268,0x3b36587d,0x3b35f6ba,0x3b1ec5c7,0x3b1a8574,0x3aba20ed,0x3a20331e,0xbada3e21,0xbb62a0bd,0xbb9c379d,0xbb6bc387,0xbb581b9a,0xbb7cf552,0xbb84c520,0xbb89a99e,0xbb3fb966,0xbb4b6dc1,0xbb3a1bb2,0xbb1181a6,0xbb4dd7c6,0xbba6a0fe,0xbc0af91e, +0xbc0987fc,0xbb8999af,0xbb15fdd6,0xbb0f109f,0xbaecb852,0xbac57a7c,0xba1e7d1e,0x3a2364db,0x3b0497ae,0x3b34c54b,0x3b551a3d,0x3b744ffd,0x3b6286b6,0x3b5754e0,0x3b51fb34,0x3b43bc4a,0x3b396837,0x3b2fd90a,0x3afebe16,0x3a8afa58,0x3a359136,0xb97d02e9,0xbacbb347,0xbb499f9b,0xbb45a65a, +0xbb4d0527,0xbb424d8c,0xbb8469df,0xbb9caaf6,0xbbc925ca,0xbbe56db9,0xbc072927,0xbc1b2ecc,0xbc1597ca,0xbc11c532,0xbc120905,0xbbcba778,0xba3cb69c,0xb9ce488c,0xb9e7f11a,0xb97191a4,0xb8920af2,0xb9006700,0xb9d04ccf,0xba2e268a,0xba424785,0xba1bdcdb,0xb99e5c87,0x37a90166,0x39ad26ec, +0x3a1b94cf,0x3a3f9a75,0x3a662c68,0x3a8d1900,0x3aa1b2ae,0x3abec19d,0x3adc582c,0x3a83ee5b,0x39f9fede,0x37b245b9,0xb9e85664,0xba948463,0xbadef170,0xbaf23bcc,0xbaf72cf5,0xbb032a10,0xbb0854c3,0xbb140425,0xbb1b1eda,0xbaf8f932,0xbab3a009,0xba8de9e0,0xba82d1fd,0xb983d433,0xb96500b4, +0xb9974405,0xb9d6c1e7,0xba0b5f46,0xba129bd4,0xba02ed10,0xb9f169f4,0xb9a70b6f,0xb99ba98a,0xb9b582af,0xb9ba7ce6,0xb9b885f4,0xb9a43627,0xb983a979,0xb948fc2e,0xb91dda45,0xb862f793,0x36af4333,0x39279d78,0x387fc796,0x382fa098,0xb7ddca6c,0xb9dc3cde,0xb9e878b6,0xba15c054,0xba2569da, +0xba4a4927,0xba5d7e90,0xba7b4c78,0xba816039,0xba9a2e92,0xba8ba82d,0xba88eb21,0xb9e59155,0xb9be228e,0xba11dde9,0xb9aa856a,0xb8ac9bfd,0xb983841f,0xb9813ee9,0xb9c63b96,0xba0f837a,0xba66eb12,0xba652706,0xba4707ba,0xb978683c,0x37a7f816,0x38751aae,0x397a391c,0x39357f3b,0x38f94a93, +0xb9f6d365,0xba3d57d6,0xba65f8ee,0xba565192,0xba4dc3f2,0xba205e58,0xba5d32e6,0xba73dbe2,0xbab7e3f5,0xb9cca239,0xb9a34d40,0xb9718e6d,0xb9e5099a,0xb9a47b44,0x398a8f6c,0xb932705a,0xb98ed8db,0xb83d80b7,0xb92fcdb6,0xb6bf8b08,0xb9c9174d,0xb86943d5,0x3a6884e3,0x39e6f542,0x3a3f14be, +0x3997d0be,0xb981086e,0xbac864f0,0xbb03834e,0xbad89f2e,0xba0effc2,0x39bd1c6f,0x3a5c35de,0x3af4949e,0x3b0398a5,0x3ac31518,0xba1179db,0xbae33719,0xbb121e96,0xbb193a40,0xbb113d42,0xbadc5e34,0xbb03f6a3,0xbb048c5e,0xbb2d1926,0xba3fc693,0xb85836cb,0x39857c7f,0x38f37eee,0x398e9b6d, +0x3acb67bf,0x3a334106,0x3a437d0d,0x3ac97e28,0x3a7e31de,0x3a2ad4c7,0x398e66df,0x3a80ba24,0x3ac1fe2b,0x37416e5c,0x3a566261,0xb8c31ccb,0xba724c46,0xbb5ee49e,0xbb65a535,0xbb35222e,0x38f075bc,0x3b01cd0f,0x3ad01f03,0x3b5c466a,0x3b4c8074,0x3b2288c1,0xba7d76ed,0xbb38857d,0xbb661537, +0xbb708674,0xbb6334de,0xbb17b260,0xbb4024a7,0xbb493f98,0xbb88ea6e,0xb9f32b78,0x386fcad7,0x3ae39b35,0x3a5f1ea5,0x3ab8f35b,0x3b92cd4d,0x3b0921e7,0x3afe2062,0x3b18e9b9,0x3abbe873,0x3ae89d01,0x39b5ef51,0x3b03774c,0x3b853000,0x3b150735,0x3b7ceafb,0x3b443cfd,0x3acb9ba6,0xbb229e92, +0xbbaad909,0xbba87beb,0xba6873a3,0x3af9ec76,0x3b3d5334,0x3beaaf9c,0x3c15b1e6,0x3be55a03,0xb9b83a46,0xbb9e5f12,0xbbdbe9cd,0xbbf2645a,0xbbe0acfb,0xbb8ff22f,0xbb8fb732,0xbb9640c3,0xbbc123e9,0xbad8d5bc,0x37665d6e,0x3b9e1fe0,0x3b311afb,0x3b63ec78,0x3c238cc6,0x3c13a8a2,0x3bf03d4d, +0x3bdf1dd1,0x3bb6f0fd,0x3b3dd326,0xb9d9f97c,0x3b4b66d4,0xba7c497b,0xbbc28406,0xbbb5e50a,0xbbfce335,0xbc2efabb,0xbc344dca,0xbba0c1ca,0x3bc7e54b,0x3ba22796,0x3bbcd0ad,0x3c1042f2,0xbba1b512,0xbc2185c1,0xbc08f26d,0xbb27706b,0x3a4b261f,0x3af64059,0x3b2fe609,0x3ade33e2,0xb95fc102, +0xba9a3e24,0xb9fb0057,0x3a7a7244,0x3b2546d3,0x3b0d598a,0xbb3eb1ce,0x3be570e5,0x3bfed42e,0xba569a4d,0xba342a92,0xbb930e00,0xbbf0449c,0xbbb55df2,0x3a80f2bb,0x3c059f10,0x3b80f6b1,0xbbaba90c,0x3b13c0fd,0xba4ba670,0x3bab948f,0x3ca074f8,0x3c66731d,0x3c0fb42d,0x3bdc5343,0xbb501644, +0xbb8dca05,0xba29b07c,0x3c05fc65,0x3c0b4d7e,0xbae736c9,0xbb547062,0xbb958d23,0xbb1d576a,0xbb16649d,0xbb3788dd,0xbb82cb9a,0xbb6ae8cd,0xbb2091d0,0x3a97135e,0x3a78a1b4,0x3b2acbd6,0x3b6145d5,0x3a773287,0xbb1b064d,0xbb9d21da,0xb94836a8,0x3b8d6474,0x3c04d93a,0x3be4004a,0xbb553086, +0xbc8887c5,0xbc357666,0xbb673dfd,0x3bc56822,0xbc3dff77,0xbc95ee29,0xbc8f22ce,0xbcd42112,0xbc77a74d,0x3c745df8,0x3bff7e87,0x3bb97b07,0x3baf266b,0x3ada53b6,0x3a4b852e,0x3b24633b,0x3b9a0e68,0x3ba5cd3f,0x3ba787be,0x3b2ac9ec,0x3abd247e,0x3b0e0191,0x3b028111,0x3acafe2c,0x3ab05be9, +0x3aeb96c5,0x39e88a6f,0x390deb07,0xbaf142b1,0xba8f413b,0x3abf2af6,0x3addab92,0xba1d4c79,0xbb88fe61,0xbb542897,0xbb6fe802,0xbad18626,0xbbe11a15,0xba4fc10d,0xbb928f46,0xba8e0118,0x3a5dddce,0x3a449caa,0x3b1c7424,0x3b01b4d4,0x3b95b401,0x3b0d80a4,0x3bc2db0c,0x3c2b1953,0x3c25980f, +0x3c19c5c9,0x3be5d784,0x3b2d7eea,0xbad9cff1,0xbb80decd,0xbba10193,0xbba6b827,0xbb8ca9e5,0xbba7e92f,0xbb9ef50a,0xbb83a4ef,0xbb2e62a8,0xbae3d79d,0xbac5e578,0xba6affdc,0xbabf301e,0xbb035627,0xbad7362e,0x39ef3092,0x39bdbaf9,0x3a4d1c40,0x3a8aa0c1,0x3b2b72d7,0x3ad4e975,0x39a40990, +0xbb496a91,0x3b2ba35b,0x3bd4743e,0x3c081d6f,0x3c2669fc,0x3c2f540a,0x3c34f02e,0x3c273c04,0x3c108fb8,0x3c07077c,0x3b8f687b,0x3aecb624,0x381addb6,0x3a6b1fec,0x3ad9cf6b,0x3afdfa0d,0x3aef1972,0x3acd0c31,0x3adb2792,0x391f28df,0xbaf6d811,0xbb836d4e,0xbb8cac0e,0xbb611b78,0xbb11405d, +0x3aad6349,0x3b50c875,0x3b1b9e36,0x3ae63533,0x3accbe36,0x3abcae9a,0x3b726429,0x3b9140a0,0x3b328dcf,0x3aa1065a,0xbba5b2e0,0xbb80b86b,0xb960c7d7,0x3ad58e4b,0x3b1a43b4,0x3b0943a2,0x3af11f55,0x3b055768,0x3b1543e3,0x3b12fef4,0x3b16048d,0x3aa663d9,0x3ac66708,0x3b0222f9,0x3b2bfd2f, +0x3b26716b,0x3ae84ca0,0x3ae39e6b,0x3a0fae7f,0xba424643,0xbb3b139c,0xbb873bd4,0xbb8a8dff,0xbb52a825,0xbb45cf3c,0xbb7babca,0xbb7b174d,0xbb60df7a,0xbabf5167,0xba821907,0xb9d022ef,0x38cf9153,0xb8d2b38c,0xbac7e337,0xbb916f67,0xbb977b37,0xbba6a919,0xbb62e4ac,0xbb563720,0xbb3dfe74, +0xbb1d010f,0xbaae0724,0xb7ba1c6c,0x3aa9c886,0x3b08083c,0x3b2b2c76,0x3b491103,0x3b3bdb49,0x3b2e0150,0x3b25bd27,0x3b17bc6c,0x3b183f80,0x3b1e6ba2,0x3ab76018,0x398d278b,0xb9c63e34,0xba3720f0,0xbad1d674,0xbb2e25f1,0xbb387d32,0xbb3f8a58,0xbb422876,0xbb6b9989,0xbb8a3c33,0xbbaa5656, +0xbbcecf5d,0xbbf60f03,0xbc0f972b,0xbc11e8b9,0xbc176b24,0xbc1e6504,0xbbe74033,0xba0a010a,0xb998b248,0xb92236d7,0x396e128c,0x39f40aab,0x39ffb31d,0x39b13f43,0x398f0948,0x394ea465,0x39a81d9a,0x3a149239,0x3a4c8d92,0x3a84dc8c,0x3a9ce198,0x3aa1768c,0x3a9bcdb4,0x3aa05949,0x3aa328bb, +0x3ab44430,0x3abdb0b6,0x3a94e8d6,0x39d0a652,0xb8450330,0xba0b5605,0xba9c6b48,0xbafaf0cb,0xbb0c09e6,0xbb144349,0xbb198eb5,0xbb22edf8,0xbb2fcdae,0xbb364993,0xbb0d7406,0xbabb3753,0xba8aa68f,0xba7c6406,0xba762a2d,0xba89e321,0xba80e346,0xba84ec4f,0xba838512,0xba6a037f,0xba3b8dfd, +0xba0d5a49,0xba026809,0xba08612f,0xba1bd4e2,0xba2037e5,0xba21b8c9,0xba199d6d,0xba16ef86,0xba0d2b3f,0xba09e491,0xb9e9afbb,0xb9d0460a,0xb9adb251,0xb9acab4c,0xb9b3c061,0xb991bc30,0xba790bc0,0xba6dd8d3,0xba68c342,0xba7d81b7,0xba957ca3,0xbaa913fc,0xbab9cf99,0xbac292d9,0xbae3c84e, +0xbae077e7,0xbae990ff,0xba7cfbf0,0xba83ab3a,0xbaadfdd8,0xb93c8ddf,0x381e5d67,0xb928c74b,0xb86e5dc4,0xb937dde2,0xb9bbf87d,0xba44864f,0xba48837b,0xba26efd4,0xb8a414e7,0x392bf655,0x38af22e9,0x3999f7c8,0x399940c1,0x3a00079b,0xb93a02f3,0xb9f0e4fc,0xba3daac3,0xba31dbbe,0xba3242ad, +0xba172026,0xba335495,0xba336d5d,0xba8b43e6,0xb8d0c828,0xb84dd847,0xb9342479,0xb94bf67c,0xb9054d9f,0x391f2faf,0xb9374b3d,0xb96e80d3,0x39319c4f,0xb8a916b4,0x388b877c,0xb7b5665a,0x38df5638,0x3a9b20b7,0x3a39c2fc,0x3aa40b7e,0x3a5d56dd,0x393e7094,0xbaac6cd9,0xbaee87e7,0xbabad5a4, +0xb988fd82,0x39fff7e5,0x3a23c5cb,0x3addd647,0x3b09ef79,0x3b16ed07,0x392ad521,0xba922c86,0xbb02b7e2,0xbb105c31,0xbb116ff6,0xbaee0cb8,0xbaff7d1a,0xbae9fa29,0xbb0d1666,0xb95db7c9,0x39ca41f3,0x389be657,0x3999c359,0x39974567,0x3a75e45f,0x39abb798,0x39f62e0c,0x3ad152b2,0x3a5b7409, +0x3a33a838,0x3a51052c,0x3a9ac89c,0x3ac00f8b,0x386de6f6,0x3aa77a9d,0x3a0db43b,0xb9c29518,0xbb4b7a4b,0xbb589aae,0xbb295668,0x3a04c76b,0x3b0cb11a,0x3a9d4ab2,0x3b442058,0x3b4c129f,0x3b82917c,0x39018800,0xbaf32a01,0xbb528867,0xbb6250a8,0xbb668372,0xbb2d1f88,0xbb3dd058,0xbb2d3447, +0xbb5fa698,0x39eb2516,0x3a428a68,0x3a9cc4cc,0x3a9ebf43,0x3aa76921,0x3b477ad4,0x3a79d50a,0x3a89419b,0x3b1a527d,0x3a8ba240,0x3adab06c,0x3a9d6c6b,0x3b00299c,0x3b926804,0x3b3a1cef,0x3ba9585a,0x3b92fb84,0x3b322814,0xbaff5507,0xbb974469,0xbb97c456,0xb970dcc1,0x3afe6667,0x3aea4064, +0x3bc6c7b1,0x3c1543a8,0x3c1c970e,0x3ae965f1,0xbb529a7e,0xbbcd0220,0xbbeffa59,0xbbee8f4f,0xbbacc978,0xbb9c36ff,0xbb9290bf,0xbbb324f8,0xb9ea233b,0x3a930630,0x3b8827ef,0x3b340be7,0x3b598c6d,0x3c13a3aa,0x3c04e2c4,0x3bdaa77b,0x3be857cd,0x3b9b7472,0x3b30508e,0x3a9d6155,0x3b767e51, +0xbb5bf98f,0xbbe3cb5b,0xbbe656c6,0xbc0e6fd5,0xbc33d67d,0xbc328417,0xbbb1f531,0x3bc3746e,0x3ba0feaa,0x3bc5a9c9,0x3c26084c,0xbb5a2c53,0xbc1681e6,0xbc0d0459,0xbb4fb8c1,0x3a1aa85c,0x3b1ee276,0x3b72f60d,0x3b415bc4,0x39cb6502,0xb9bb76df,0x3a1dc670,0x3b1d4442,0x3b07d04a,0x3ae50037, +0xbb2e9cc8,0x3bfa57a0,0x3c052068,0xba85f8e5,0xbac7960e,0xbbb76769,0xbbf0e7ce,0xbb66920c,0x3b1af5eb,0x3be0d3a6,0x3ab48ae9,0xbb145a41,0x3b94e893,0x3b694062,0x3be4378d,0x3c788bc6,0x3c67cd70,0x3c2c5412,0x3bca9643,0xbb1071ab,0xbb824516,0xbab461b4,0x3c0f2359,0x3c23e048,0xb9a6e664, +0xbb372f68,0xbb966770,0xbb2e286f,0xbb1cf23d,0xbb3858f8,0xbb98b21e,0xbb642076,0xbb2bf1c0,0x39e4ed99,0x39f4e453,0x3b009ded,0x3b3b2178,0xb93c9aa0,0xbb6135f6,0xbb9fb418,0x3a878fba,0x3ba737ec,0x3bce9d5b,0x3b4e5f7d,0xbbcf45d6,0xbc801a8a,0xbc18e5fc,0xbbadaf1e,0xbba8c53c,0xbc8e5fcd, +0xbc9cd922,0xbc6b8ce1,0xbcb7041e,0xbc81f7bd,0x3b92da2b,0x3c06063f,0x3c14521e,0x3bb525ad,0x3aeaedb3,0xb89c0857,0x3a9de7c2,0x3b827a3d,0x3ba50fd6,0x3ba9fddb,0x3b6ddd39,0x3b078384,0x3aa24b71,0x3acd6bb5,0x3aa76c47,0x3ac7dbb3,0x3a7d09c0,0xb9dd290b,0xb94e092f,0xbadcd915,0xba4487a9, +0x3ae206fc,0x39a28dd1,0xbb1dde30,0xbbbdf3bc,0xbae12e8c,0xba9eb6fb,0xbad53b59,0xbbba51f4,0x3acc99a3,0x3a70bec3,0x3b54ff0f,0x3b716604,0x3b5ab102,0x3b810cc5,0x3b553731,0x3b5ccf5d,0x3a1c75be,0x3b57630f,0x3c10f911,0x3c1002ed,0x3c0a00e6,0x3be3f9dc,0x3b2bd34f,0xbaa5b9ff,0xbb84ec69, +0xbb9db145,0xbba568f1,0xbb8fbaa2,0xbba3592f,0xbba1051d,0xbb83e055,0xbb0648d2,0xba7f77e1,0xbab594ad,0xb99b4d13,0xba71be53,0xbb078b22,0xbabc4a11,0x39bd706a,0x39ce3af5,0x3958776e,0x3a8e2806,0x3b8e1cb8,0x3b31b4b0,0xbb111ea7,0xbbd49503,0xbb55c446,0x380c7710,0x3b3c8515,0x3c045171, +0x3c295142,0x3c285376,0x3c2af7b8,0x3c1f8826,0x3c25d543,0x3bdaea1f,0x3b885636,0x3ae57cb8,0x3af92eb7,0x3b04a5bc,0x3ac7e1a9,0x3adaee1d,0x3a96c820,0x3a6fc407,0xba48a0cb,0xbb36d0ca,0xbb8e647c,0xbb983453,0xbb57d5d3,0xbaa4d89e,0x3ad31e7a,0x3b47b5cb,0x3b083a66,0x3b159685,0x3b126ac9, +0x3afbe01e,0x3b76716f,0x3b7afdd7,0x3ad4b2a5,0xb8f835e5,0xbafccb9d,0xba4250c3,0x3b561af6,0x3ba27f9d,0x3bb42947,0x3b7e1198,0x3b2b279b,0x3b0c031f,0x3aeeb818,0x3ab6bfdc,0x3a8b96bc,0x398da37b,0x3a384a8e,0x3ac77376,0x3b171184,0x3b0fd139,0x3a8d4e60,0x3a826526,0xb9a874e7,0xbafc63d3, +0xbb6b000d,0xbb8dfb4f,0xbb6793b0,0xbb4944c6,0xbb488b28,0xbb7aee82,0xbb60f151,0xbb1fe8d4,0xb8ea25bb,0x3a715e4a,0x3aee95f1,0x3b135698,0x3b32f05a,0x3b01297b,0xb914c257,0xba7152f3,0xbbbc9a0b,0xbb9742ca,0xbb861af8,0xbb5fd53c,0xbb19746a,0xbaae1740,0xb9657e2d,0x3a3853b4,0x3aa4e6a7, +0x3adada52,0x3afa6c5b,0x3af0b31d,0x3adae814,0x3ace1b00,0x3ab80523,0x3acda519,0x3af47fff,0x3a2603bd,0xba2dfeef,0xbac8a703,0xbab6db91,0xbb02c5c1,0xbb2df8bc,0xbb39da9b,0xbb3ae810,0xbb4a70c5,0xbb5e963b,0xbb82844b,0xbb98fd7d,0xbbbeae80,0xbbe07323,0xbc029e24,0xbc099641,0xbc152f08, +0xbc1e9944,0xbbf38aa0,0xba34e59b,0xba16d330,0xb963d166,0x397dc6ad,0x3a03857d,0x3a23571c,0x3a3a74de,0x3a7d105a,0x3a7b41af,0x3a8c4c08,0x3aa4d4f2,0x3ab27329,0x3ac2dc1d,0x3ad01831,0x3abd4e05,0x3a99ecd2,0x3a8511ce,0x3a62f6f8,0x3a5e80ae,0x3a3f40b8,0x3a428735,0xb89f19a7,0xba01fc48, +0xba80ccb0,0xbaccfc10,0xbb17c9b8,0xbb29d2e7,0xbb356fb6,0xbb3928ba,0xbb478330,0xbb570ce4,0xbb5dad4d,0xbb2fbe7d,0xbaf0516e,0xbaba8e4a,0xbaaaf539,0xbae78be9,0xbb00b18b,0xbae87c32,0xbadd34c6,0xbac74f32,0xbaa4c4b9,0xba80b6c0,0xba34beb6,0xba489bce,0xba575aa1,0xba6b779c,0xba70b317, +0xba7295f9,0xba6922ee,0xba78ad1a,0xba79d2f7,0xba826a32,0xba7abd1a,0xba76381e,0xba7fd908,0xba6f8385,0xba7765c5,0xba54cded,0xbad1abe1,0xbac9e9a7,0xbabe9993,0xbacac53d,0xbae3d4e3,0xbafe4c55,0xbb0794f7,0xbb0d62d1,0xbb212451,0xbb225596,0xbb29971c,0xbade9b50,0xbaeb8719,0xbb0b0adb, +0xb8860f53,0x38ee186d,0xb8d3cc0e,0x38cf1225,0x36b35dd3,0xb9381f0f,0xba1a8724,0xba240c69,0xba09f9e1,0x388f6989,0x399390f8,0x388ebe5f,0x39a7aa03,0x39c5ee41,0x3a4f9876,0x38bbcf56,0xb95bcb97,0xba14ce80,0xba0cee69,0xba15d7b0,0xba09f1a4,0xba0e4ef7,0xb9fcb1ee,0xba44dfe4,0x391b7c65, +0x391cdb41,0xb9214f11,0xb831da84,0xb853e1b0,0xb8ca1501,0xb990364f,0xb992b37a,0x39827f8f,0xb88e948c,0x38c4793a,0x39640b91,0x39502e8b,0x3aaa11e4,0x3a586b52,0x3ad3604d,0x3aaa327b,0x3a183449,0xba811e30,0xbac541a1,0xba9e9044,0x37e0e648,0x3a1b8c45,0x39b0cfc7,0x3abec4e1,0x3b0ab263, +0x3b42afe1,0x3a63d07b,0xb9ec46a2,0xbadb781b,0xbb026e12,0xbb0d56bc,0xbaf88c46,0xbaf915c4,0xbac93950,0xbacb46ec,0x3985c13a,0x3a460847,0xb79b929d,0x39e3ffc2,0x39802d99,0x3957f4f1,0xb8dddce0,0x39041870,0x3ac5da4f,0x3a18de5a,0x3a14e279,0x3a979659,0x3aa12154,0x3ab10a18,0x37fc37c0, +0x3ad1c29f,0x3a9187cb,0x39479b85,0xbb240215,0xbb3765c7,0xbb1bf120,0x3a79455e,0x3b14b451,0x3a4cd8e8,0x3b2a2b14,0x3b44279a,0x3ba98523,0x3a999344,0xba5ae604,0xbb367e5e,0xbb4a046e,0xbb5e677a,0xbb364b80,0xbb35ccc7,0xbb0d14f2,0xbb1b945a,0x3aa59bc7,0x3ab25248,0x3a5337af,0x3ac276bb, +0x3a83650a,0x3aa6c37a,0xb98890db,0x3827d551,0x3b0aef7e,0x3a0a09ac,0x3ab4e0bd,0x3afcdc08,0x3aeaf096,0x3b933153,0x3b42f00a,0x3bc48490,0x3bb8c36d,0x3b748553,0xba82cbee,0xbb6a4ce1,0xbb87bebc,0x39f3e81b,0x3b027e1a,0x3a234fb7,0x3ba07528,0x3c0f5c06,0x3c3d206b,0x3b8044c2,0xbab2d92f, +0xbbb36161,0xbbe336fd,0xbbf32a1e,0xbbc22a86,0xbba5f392,0xbb889237,0xbb94523d,0x3a5a4ba4,0x3b12c3f2,0x3b6aebcf,0x3b451cdd,0x3b506e37,0x3bea3a35,0x3bdd8bf1,0x3bbaea9b,0x3be0e315,0x3b7254fb,0x3b137ead,0x3b291914,0x3b84115c,0xbba8310f,0xbbef8a08,0xbc046b2c,0xbc17b4e8,0xbc2dbf9c, +0xbc288225,0xbbb35f1c,0x3bc8cefa,0x3ba0a8b4,0x3bce8b58,0x3c36fffb,0xbacb290d,0xbc073919,0xbc103070,0xbb88a0fe,0x38641cae,0x3b3d9b98,0x3b9ec3d4,0x3b9aa2ec,0x3af66ea4,0x3a8a5d34,0x3b073e8f,0x3b729af0,0x3ac8a503,0x3a985e39,0xbb0dea1c,0x3bf738e0,0x3c02f639,0xba43a095,0xbb021d89, +0xbbccfc60,0xbbef9edb,0xbaf78696,0x3b533853,0x3bbaa835,0xba427559,0x3a129db8,0x3bc81f2b,0x3be2887e,0x3bf9269d,0x3c251001,0x3c5f7238,0x3c41b012,0x3bb884bd,0xbaa9ada1,0xbb7760bf,0xbb102d39,0x3c080018,0x3c2f8525,0x3b013ef9,0xbaf8c5b5,0xbb89e970,0xbb38ce6a,0xbb1e7e10,0xbb24b094, +0xbb99523b,0xbb367669,0xbb172963,0xb9d1978b,0xb91bdb15,0x3a9b758f,0x3b17ffab,0xbaa179ea,0xbb8bee18,0xbb9689a4,0x3af89d50,0x3bae237a,0x3b8d800d,0xb9f1910a,0xbc118fa6,0xbc734f19,0xbbf26030,0xbbd15091,0xbc885e4e,0xbcb2b21a,0xbc9860ef,0xbc3fa706,0xbc8d6655,0xbc705abe,0xbb9f065a, +0x3c19298b,0x3c4c6549,0x3b91f11b,0x3adeb645,0xba17c7c3,0x399a07af,0x3b4b3a16,0x3b96b397,0x3b99d0da,0x3b85e11f,0x3b16c4da,0xb8c7690e,0x3a4367d4,0x3a66651a,0x3ae1aea8,0x39af69cc,0xba8ebc52,0xba40a3bf,0xbaa608c4,0xb8ee1a77,0x3adc4555,0xba4487da,0xbb68c9cf,0xbbd6b7ad,0xb8ff48a5, +0x3a9c9b29,0xbb135b26,0xbb64337a,0x3b8d4363,0x3be4b09c,0x3c02b816,0x3bd1d6a3,0x3ba166ee,0x3b8e32d5,0x3b588b02,0x3aaf9596,0xbaad654e,0x39aa45ac,0x3bd491ad,0x3bed2775,0x3bf2a62c,0x3be0fe02,0x3b3b638e,0xb9e4d9d2,0xbb78f7ae,0xbb91ca5b,0xbb9db185,0xbb950917,0xbb9d6720,0xbb9fcdc5, +0xbb80f207,0xbad3a0d0,0xb9cd83a9,0xba90f93a,0xb7c7fe02,0xba230bfc,0xbb038ac5,0xba8ac466,0x39a97e2c,0x3a24192c,0xb96adbfa,0x3a89a480,0x3bb37c91,0x3b71363c,0xbb8af1f9,0xbc1100bd,0xbc03682c,0xbbae7498,0xbad72a24,0x3bcc686e,0x3c20ae2d,0x3c16c96b,0x3c27f5c5,0x3c260a14,0x3c389881, +0x3c0652ea,0x3bc60602,0x3b7de926,0x3b34d008,0x3b0ff033,0x3aa5698c,0x3ab6c21f,0x3a03bd0a,0xb9a61736,0xbafaf169,0xbb72185c,0xbb942d57,0xbb9cce8d,0xbb49ad97,0xb97e9c66,0x3ac6e71b,0x3b22c091,0x3ae7af27,0x3b2f48e8,0x3b32dd73,0x3b1bcd3f,0x3b6079b3,0x3b46a46a,0x3a806ea2,0xba870d25, +0x3ab9f160,0x3b29023b,0x3bcf0d5e,0x3bf883c7,0x3bfcba58,0x3ba82529,0x3b51e73b,0x3b13b483,0x3abf2319,0x3a34a050,0x38a318bf,0xb9e01c9c,0xb890b75f,0x3a3dda3c,0x3ae5747b,0x3add8461,0x3a1476ba,0x399e82ba,0xba87c489,0xbb34d1f0,0xbb78733c,0xbb87108d,0xbb40708a,0xbb48c8c5,0xbb55c225, +0xbb7c6433,0xbb3d2279,0xbaae7601,0x3a90e031,0x3b281dc3,0x3b72d114,0x3b8625d9,0x3ba40aa0,0x3b9e5e0d,0x3b60700a,0x3b24327a,0xbbc65fec,0xbbadc91a,0xbb8fa2d0,0xbb595872,0xbad22657,0xba50d3b8,0xb8a8df7f,0x39979709,0x39db8d27,0x3a1d0c21,0x3a14039b,0x3a31c163,0x3a354cc3,0x3a407346, +0x3a0da766,0x3a3604ab,0x3a897117,0xb9883c84,0xbacb4776,0xbb27abd5,0xbb168ce2,0xbb311c58,0xbb4be772,0xbb51d87d,0xbb4a38c0,0xbb640fe1,0xbb62b2dc,0xbb8128ef,0xbb8f3ae1,0xbbae7301,0xbbc84cb8,0xbbe3563c,0xbbf709be,0xbc0ad2ed,0xbc1560d4,0xbbf09836,0xbaa43ecd,0xba9b2cec,0xba206d3e, +0xb9013930,0x391720aa,0x39cabdc3,0x3a4b93ef,0x3ab6a42e,0x3abf47d3,0x3aca34a6,0x3ad63e11,0x3ad2d71c,0x3acdf4f8,0x3ace6f79,0x3aa338e0,0x3a54621a,0x39f78853,0x3942bbea,0x3800036b,0xb96feacb,0xb78744f7,0xba4e0fd1,0xba99b162,0xbad70f77,0xbb0ae0d8,0xbb3816d8,0xbb4d31b2,0xbb5ba282, +0xbb5fc3df,0xbb731fe1,0xbb82f48c,0xbb8797c9,0xbb60cd0e,0xbb27ccf2,0xbb0bf0cd,0xbaffc7d9,0xbb24cd3e,0xbb334df5,0xbb213841,0xbb13d5a3,0xbaff9cad,0xbacc8d52,0xbaa1b2af,0xba642e59,0xba89f3f2,0xba93937a,0xba9bcefd,0xba9e2951,0xba9e6677,0xba99ad15,0xbaa92b28,0xbab00690,0xbabc35e3, +0xbabeb366,0xbac35448,0xbad48d93,0xbac9106c,0xbad139cd,0xbabfc17a,0xbb105287,0xbb0e9500,0xbb09215a,0xbb106cce,0xbb1d9aaa,0xbb2cef0d,0xbb359350,0xbb3c3ce5,0xbb523896,0xbb50fb9e,0xbb5616c6,0xbb21744d,0xbb2732e1,0xbb33ec47,0x389b9b71,0x390da5c6,0xb72be47f,0x39856879,0x3951de66, +0x3881d5ff,0xb9bf1668,0xb9de43af,0xb9d29a91,0x39856077,0x39e49f4d,0x38a84387,0x39ce79b9,0x3a0349d4,0x3a8b182a,0x39c03288,0x38869412,0xb9bc11d6,0xb9ba19e5,0xb9dd3680,0xb9da5de1,0xb9dd1351,0xb9ab33fe,0xb9f14364,0x39b57b59,0x398e9d24,0xb91ec7cd,0x380da26c,0xb8775cb7,0xb9d09541, +0xb9e56989,0xb9ce5b12,0x398269a4,0xb90315b7,0x38bbb918,0x39c7c8fd,0x39628e2b,0x3a9e92ca,0x3a611ee6,0x3af1486f,0x3adb2d3c,0x3a89510c,0xba051af9,0xba899c05,0xba82daaf,0x39c2a9d4,0x3a4bb963,0x38fa0f05,0x3aad30d6,0x3b0e48de,0x3b6594fa,0x3acd6c38,0x39865d15,0xbaa00a84,0xbadad700, +0xbb026f49,0xbaf8e89c,0xbaf3c8f2,0xbaa41be8,0xba5fbc7d,0x3a2ceacf,0x3a86a96e,0xb8134b9e,0x3a0b9e81,0x39222980,0xba08baee,0xba196ad5,0xb99008be,0x3aae4d46,0x3974451e,0x39b36af7,0x3abba7f9,0x3a97d1ea,0x3a8b4c12,0xb83d311f,0x3aeb24ca,0x3acecc00,0x3a690159,0xbad74944,0xbb05e0bf, +0xbb0f75a1,0x3ac1c7f7,0x3b23d535,0x39eaa5ed,0x3b1c0b11,0x3b41afb5,0x3bc4bb5a,0x3b0e59c1,0x3969b7a7,0xbb0f2c15,0xbb2851fb,0xbb49c9ec,0xbb36f63c,0xbb2880e4,0xbad52ff4,0xba94a095,0x3afa7ffb,0x3af0971c,0x3a0b40ec,0x3ad1db83,0x3a21c3ac,0xba15c343,0xbac0ac15,0xba8703ce,0x3ae2c90f, +0xb92120af,0x3a70954f,0x3b25ea7d,0x3ac4db63,0x3b83fa84,0x3b344b9a,0x3bceff14,0x3bd1943e,0x3b9d693a,0x39a82fda,0xbb11af1f,0xbb727ee3,0x3aa27916,0x3b11838e,0xb99eb7e1,0x3b8367ae,0x3c08f0df,0x3c5266db,0x3bc33fd0,0x3a22c277,0xbb8f09ce,0xbbcba337,0xbbed9f53,0xbbd32f4f,0xbbae121a, +0xbb6d9f9c,0xbb461098,0x3b06fb40,0x3b50d8d8,0x3b4b85d7,0x3b5c7fad,0x3b4529af,0x3b981214,0x3ba3d44b,0x3b8ee668,0x3bc827ce,0x3b1d1025,0x3ac905a2,0x3b7570e4,0x3b7f8729,0xbbd30290,0xbbe91aa2,0xbc0f231a,0xbc1a2ecf,0xbc1f9514,0xbc16984a,0xbba55a06,0x3bc8290f,0x3b9f4833,0x3bd98b3b, +0x3c42e395,0x3987b0d3,0xbbecf88c,0xbc124493,0xbbb3a668,0xba5bcb6d,0x3b53c7a6,0x3bbf3fac,0x3bdac220,0x3b8d2e5a,0x3b41ce5e,0x3b68f91b,0x3b9687dd,0x3a6c8b04,0x39fe877d,0xbab29cc6,0x3bdd1a1b,0x3bef219c,0xb9b51add,0xbb031719,0xbbcba35d,0xbbe2c5d2,0xba3a5024,0x3b650ff6,0x3b96d230, +0xbb29662a,0x3b5834bb,0x3be6682f,0x3c10d760,0x3be64492,0x3bafdd4f,0x3c527892,0x3c51d633,0x3bb290b4,0xb9a810ab,0xbb752062,0xbb66c1ea,0x3bdf9ba6,0x3c2d4deb,0x3ba22271,0xba3dbf14,0xbb6ea740,0xbb2de22b,0xbb16d77d,0xbb022b3c,0xbb863b38,0xbadc10ed,0xbad0ca6a,0xba9e1da2,0xba4da378, +0x39bac7b0,0x3af565f8,0xbb077037,0xbb9a3504,0xbb81fe2d,0x3b0e50f2,0x3b9ee17d,0x3b1f6879,0xbb57bde8,0xbc2cd60d,0xbc65735b,0xbba14e07,0xbbfc853b,0xbcdd3f8e,0xbcc64e54,0xbc89f5f0,0xbc208baa,0xbc5702b8,0xbc577b4d,0xbc419766,0x3c29043a,0x3c7514ab,0x3b3bc89e,0x3ab46f54,0xba86c18b, +0xba02444b,0x3b07fa14,0x3b7be7f2,0x3b7d64ae,0x3b7eb476,0x3b10e2a3,0xba90be65,0xb70315b4,0x3a19af04,0x3af9a3f6,0xb84f0614,0xbac5608e,0xbab24140,0xba434aca,0x3a23e9f1,0x3ab9b98d,0xbac0a48b,0xbb84235a,0xbbd5f365,0x3ab71d74,0x3b4ee20d,0xbb6c4932,0xbad43598,0x3bf9184a,0x3c53eadc, +0x3c4687c6,0x3c055612,0x3bab3fe4,0x3b6a1ed1,0x3b1f9253,0xb9c64a05,0xbb341964,0xbb08b2ec,0x3b6b5f3d,0x3bb4a6c1,0x3bd1d3d2,0x3bdcab87,0x3b4fd724,0x39ec4e78,0xbb49a80d,0xbb7ce1e5,0xbb90e338,0xbb97988a,0xbb985d1b,0xbb99cfd1,0xbb6cfd5d,0xbaa8c7ca,0xb6a90300,0xba2b212e,0xb7ae18ac, +0xba126b5b,0xbaeb1ed6,0xba04e9af,0x39dd2b89,0x3a693451,0xb99b191d,0x3a8cd6fd,0x3bbbcd6a,0x3b9e51a7,0xbbb844d7,0xbc21af34,0xbc35a329,0xbc10e901,0xbb8db54b,0x3b8e14f5,0x3c0b7d99,0x3c036d26,0x3c216148,0x3c264b4d,0x3c391469,0x3c11c02d,0x3bec19a7,0x3bba4d3c,0x3b6b5cfa,0x3b18892f, +0x3a817758,0x3a5e2247,0xb9cdceea,0xbae5a03e,0xbb47e68e,0xbb9131a0,0xbb9b1ff9,0xbb9babab,0xbb3c0590,0x3a03a0c6,0x3a92a79f,0x3adbfef8,0x3abf9942,0x3b356e0a,0x3b3df523,0x3b309e0a,0x3b30bf35,0x3b08e5e4,0x3a327d5b,0xbad8e9f3,0x3b92a69a,0x3ba974d7,0x3c0808a7,0x3c13d2c6,0x3c0f1434, +0x3bbe3ea2,0x3b72e19e,0x3b2117fe,0x3abfac50,0x39f61263,0xb9d34899,0xba4d5c7a,0xba3b22a2,0xb91e14a8,0x3a7d7db9,0x3a85c2d7,0x39003d0b,0xb9991897,0xbac24de7,0xbb4dedd0,0xbb68a562,0xbb6c2b10,0xbb27028f,0xbb4b9968,0xbb622156,0xbb77b19d,0xbb0facfa,0xb94745a9,0x3b11fc87,0x3b7d995d, +0x3ba62775,0x3bb07e46,0x3bd100b4,0x3bd8a54e,0x3bbd1e6f,0x3bacd385,0xbbc20869,0xbbb174a1,0xbb89ceba,0xbb3922e5,0xba3196b3,0xb9122008,0x39041a27,0xb7351567,0xb9af57f8,0xb9e097d7,0xba359924,0xb9d0621a,0xb939b101,0x384100bc,0xb95f65fe,0xb9315ab7,0x390971f4,0xba8e52d4,0xbb0fbf4e, +0xbb51343b,0xbb4b02ba,0xbb603ad0,0xbb731c1b,0xbb741b8b,0xbb6a0115,0xbb84894c,0xbb737c1e,0xbb807f32,0xbb864f14,0xbb99380d,0xbba99c7a,0xbbb77343,0xbbd041dc,0xbbf41f50,0xbc06b56b,0xbbe0fe7e,0xbb07e803,0xbb049246,0xbaac29ed,0xba5b3fb0,0xba12dd75,0xb951478c,0x39f4de01,0x3ab49784, +0x3ac49bcc,0x3acdf591,0x3ace67b7,0x3abecd09,0x3aa811e9,0x3a9ea1a7,0x3a3f6941,0x394f0f61,0xb9937084,0xba28a4a0,0xba6c8ca3,0xbaa0b893,0xba76f121,0xbad1a1db,0xbb005697,0xbb1c5a4a,0xbb354f89,0xbb5b5724,0xbb718c80,0xbb818d65,0xbb8506cc,0xbb902698,0xbb9adba4,0xbba12255,0xbb8b802a, +0xbb615ffb,0xbb45acbc,0xbb355226,0xbb4c5311,0xbb5989b7,0xbb43eee9,0xbb30cef4,0xbb17381d,0xbaf31a3a,0xbac8cbba,0xba97ae7e,0xbab5f072,0xbabe6012,0xbac278b4,0xbac3867d,0xbac249df,0xbabcbc76,0xbad1baee,0xbadd53fb,0xbaedbde2,0xbaf8485b,0xbb0264e0,0xbb0fff8d,0xbb0b1a9e,0xbb10ef19, +0xbb097a8c,0xbb317380,0xbb32d957,0xbb2f271d,0xbb37f583,0xbb4546df,0xbb54c915,0xbb5e0998,0xbb6520ad,0xbb7c17cd,0xbb75db64,0xbb767c3e,0xbb4c208a,0xbb4fef58,0xbb4d9cdc,0x3987b950,0x395c70e3,0x38e08edf,0x39deb7d1,0x39dcab9d,0x39c2db86,0xb89d39e9,0xb92655d3,0xb9750416,0x3a02859c, +0x3a2c162a,0x3931b998,0x3a11aebb,0x3a35b8b9,0x3aaa0f73,0x3a2ff1ec,0x39c84611,0xb893f701,0xb8e5fb5f,0xb95c2c0d,0xb985880a,0xb961ee5b,0xb8ad30a4,0xb89ad03c,0x3a15c8ae,0x39ebd534,0xb8653958,0x392b5446,0xb6cb9960,0xba15c921,0xba04d58e,0xb9dd3cdb,0x39a47ebd,0xb8ccd294,0x39146533, +0x3a213993,0x399e7bb9,0x3a8ae541,0x3a642a06,0x3b000aac,0x3b01d477,0x3ad2bd47,0x38b454df,0xb9f4f5f1,0xba38f3f6,0x3a572a59,0x3a8e6887,0x383feacf,0x3aafa7b8,0x3b169596,0x3b7ce106,0x3b134a6c,0x3a84e9fd,0xba1de954,0xba9e3ba6,0xbadd4e26,0xbae6de42,0xbadc1030,0xba671a50,0xb860f8d1, +0x3a89c712,0x3aa4f9c1,0x380efd9e,0x3a1bbd4b,0x38827776,0xba8acef8,0xba896d8e,0xba3452d0,0x3a95582d,0xb8e819fe,0x390e74b8,0x3ae55b39,0x3a850c33,0x3a2e752a,0xb8cf4ee5,0x3af31e6a,0x3b01f171,0x3ae62b8c,0xba27b52d,0xba969521,0xbafbee40,0x3b0a4641,0x3b3f862f,0x39b49f4d,0x3b20b517, +0x3b4b2653,0x3bd3a984,0x3b4e5326,0x3ab01263,0xbab02804,0xbaf665bd,0xbb28c011,0xbb2dcb22,0xbb128177,0xba866043,0x3952c3be,0x3b1cc75a,0x3b0eaac4,0x39af08d2,0x3aca2259,0x38e955fa,0xbb0d110a,0xbb2b4d05,0xbb074dfa,0x3aaa6bf7,0xba5b7820,0x39cd4568,0x3b4b331a,0x3a926416,0x3b4e5173, +0x3b1d5f69,0x3bcbd780,0x3be09ee0,0x3bc54cc1,0x3af0ba38,0xba28fd6e,0xbb477181,0x3b110aec,0x3b320010,0xba599f0b,0x3b656596,0x3c037d86,0x3c5b16f5,0x3c00c89f,0x3b34044e,0xbb39ced7,0xbba74288,0xbbdae1d2,0xbbdb10d4,0xbbafa377,0xbb3a4ae2,0xba833632,0x3b501328,0x3b7d23d8,0x3b306832, +0x3b6d2043,0x3b324afb,0x3af5d327,0x3b3cfdde,0x3b2ae3f1,0x3ba2dacd,0x3a6a7787,0x3a2c2512,0x3b9f2fc8,0x3b5d8c0c,0xbbef776c,0xbbd86a0d,0xbc1528a3,0xbc1712bd,0xbc09161f,0xbc01750c,0xbb93e321,0x3bb50d78,0x3b9ec747,0x3bece129,0x3c4cedd5,0x3b099df0,0xbbc478fc,0xbc10106b,0xbbde7bc5, +0xbafc7c10,0x3b629b02,0x3bd6c90f,0x3c084990,0x3be5c818,0x3ba6da31,0x3b9bf25c,0x3b9f391a,0x393d25bb,0xb945f486,0xb98f3482,0x3bb2157d,0x3bc682ba,0xb859a009,0xbad7f209,0xbbb31bec,0xbbc1c043,0x39100983,0x3b59b744,0x3b60eeb3,0xbb857604,0x3bc9e634,0x3bfd4005,0x3c161f63,0x3bac0e41, +0x3aa29573,0x3c454ddb,0x3c60f4e7,0x3bbdf125,0x3a41f1b9,0xbb7cb072,0xbbaf06e7,0x3b92bd57,0x3c1cd096,0x3c00ab74,0x3a2b1a3c,0xbb3829c2,0xbb0eaa93,0xbb0a9ec9,0xbab59a47,0xbb3f4125,0xb9c4d13b,0xba289984,0xbaedf964,0xbaa6409e,0xb9e0e240,0x3ac0e0e7,0xbb2cd084,0xbb99e50b,0xbb4ef73a, +0x3b012640,0x3b812ec6,0x3a5bb62a,0xbbae864c,0xbc3a5006,0xbc5179e8,0xbae6ac5d,0xbc297aa9,0xbd0da96d,0xbcbfe4b9,0xbc594fa5,0xbc049bd8,0xbc283885,0xbc44ae5d,0xbc83c1b9,0x3c25f021,0x3c8138ac,0x3ac0460a,0x3a71bad1,0xbacd9a42,0xbaa560cc,0x3a65c032,0x3b39ffe5,0x3b46d9a2,0x3b586cf0, +0x3afec0df,0xbab18c60,0xb99da927,0x3a0c1fed,0x3b035027,0xb998d959,0xbae284c1,0xbafdea9e,0xb96edad9,0x3aa7a559,0x3a953f5b,0xbafb3988,0xbb82b9a1,0xbbb78212,0x3b288f0f,0x3b8a68e8,0xbbab8774,0xbace6d84,0x3c382e4f,0x3c94581f,0x3c7244db,0x3c07302c,0x3b8e25f1,0x3af3fd87,0x3a8ba510, +0xbab0e3aa,0xbb5b8c63,0xbb72f6d9,0x394c07f0,0x3b7a3928,0x3bb7eee9,0x3bd5f511,0x3b678b97,0x3a9baee1,0xbb00d2b8,0xbb49c241,0xbb7d8331,0xbb915a63,0xbb8fc82b,0xbb8aa29f,0xbb4212e2,0xba757de5,0x39804d25,0xb8bcca92,0xb929bd2c,0xba2f291c,0xbabc3d94,0x38889a21,0x3a12eb7e,0x3a88c8bc, +0x389573ca,0x3aa695ad,0x3ba84a5e,0x3bd0cb14,0xbbcfa00c,0xbc1d8e34,0xbc48a2e2,0xbc29c2a8,0xbbb39a83,0x3b1475fe,0x3bd2b2cf,0x3bd87b4e,0x3c1296cc,0x3c1fe80b,0x3c2ebe10,0x3c13b765,0x3bfc30ca,0x3bdcc1fa,0x3b87af34,0x3b1abb8f,0x3a34687d,0x38d67191,0xbabd03d1,0xbb4f2a24,0xbb8342a8, +0xbba11eee,0xbba447b0,0xbb947fe4,0xbb2e4d3f,0x3a57b961,0x3a1aadfd,0x3a623895,0x3a969575,0x3b24a573,0x3b32efeb,0x3b388286,0x3ae40177,0x3a8dff14,0x3a00925e,0xbb08a084,0x3bd98f49,0x3bdf9ef5,0x3c142d75,0x3c16ab9b,0x3c0de12a,0x3bc541c1,0x3b8aa420,0x3b45755d,0x3af2bc10,0x3a23fae1, +0xb9ccf9cf,0xba542379,0xba87d33e,0xba47fa09,0x398478b4,0x39cf4a81,0xb9bad8cb,0xba51d104,0xbad839ba,0xbb444a4f,0xbb44491f,0xbb3f4d9c,0xbb1588cd,0xbb4aedb5,0xbb635919,0xbb6215f9,0xbaac6ef1,0x3a7a0dbb,0x3b51a3c4,0x3b9c6071,0x3bbdf0f6,0x3bc28b66,0x3bded6a4,0x3beef46c,0x3be559db, +0x3be49e85,0xbbb2363f,0xbba84708,0xbb7968ea,0xbb14bd44,0xb7fa4438,0x399283db,0x394ad1f5,0xb9696809,0xba5b2269,0xba8c0d89,0xbab6c756,0xba876ac1,0xba401354,0xb9e71c5b,0xba4ab008,0xba660c00,0xba42fbc8,0xbae1be03,0xbb291976,0xbb60a0ad,0xbb6a4d45,0xbb8033cc,0xbb88d7b6,0xbb86c06b, +0xbb82bf26,0xbb900698,0xbb803e9f,0xbb756479,0xbb731c83,0xbb79ce7b,0xbb824b6c,0xbb812fe7,0xbb9f4589,0xbbc7c86b,0xbbe6b713,0xbbc61043,0xbb43be31,0xbb43c072,0xbb135a68,0xbaee9c4b,0xbac9e9bc,0xba8d59d6,0xb9770f54,0x3a52e677,0x3a763723,0x3a80babb,0x3a705b68,0x3a4b58b9,0x3a15c32b, +0x3a04026d,0xb8413bac,0xba1aa868,0xba91f63f,0xbac3de2e,0xbaeccfbe,0xbb0c4f46,0xbaf4810a,0xbb1b4c2a,0xbb2f91a3,0xbb46bc25,0xbb59e054,0xbb759a98,0xbb85e8b0,0xbb905fa8,0xbb9714ac,0xbba33bea,0xbbaffeb8,0xbbb83cd1,0xbba59dc4,0xbb8d983b,0xbb806d9f,0xbb6e3f06,0xbb6701bf,0xbb7328da, +0xbb5bc803,0xbb460835,0xbb2b3b63,0xbb0ed621,0xbafa72cf,0xbace3498,0xbae92b38,0xbaebce39,0xbae9b0a8,0xbae83b64,0xbae5fd47,0xbadf67c8,0xbaf7a317,0xbb031ee6,0xbb0c97cb,0xbb15084d,0xbb1e1a6d,0xbb2ebcc6,0xbb2a23c5,0xbb2f97e1,0xbb2a8613,0xbb46b4a6,0xbb4921c0,0xbb48f37b,0xbb537206, +0xbb6055a6,0xbb6e059b,0xbb77cb68,0xbb7ec0a5,0xbb8ad4ef,0xbb851d01,0xbb83e280,0xbb68d6c1,0xbb6ab9b2,0xbb5797cb,0x39f46017,0x399ac81b,0x39876703,0x3a1f5663,0x3a2cc132,0x3a371003,0x397a37ee,0x390c06e7,0xb7ef39ba,0x3a45dd9b,0x3a6c8dab,0x39b46fd2,0x3a49d131,0x3a6f8501,0x3ac161c5, +0x3a7e9670,0x3a3b3570,0x39918c23,0x393551bf,0x381efdb9,0xb8432b65,0x36db2480,0x391e282b,0x399feaa5,0x3a49901a,0x3a1dd752,0x3855065f,0x398765ad,0x380a76ea,0xba2abe99,0xba110bee,0xb9e5221c,0x39c9d496,0xb824bced,0x396a6fe3,0x3a5cc452,0x39c5b91b,0x3a54d556,0x3a663c31,0x3b0333ba, +0x3b117a02,0x3b0bdfd5,0x3a32cb78,0x3917d9d5,0xb9ad159e,0x3aa7ed49,0x3abb72ef,0x390b1002,0x3ab99336,0x3b1cf432,0x3b828f6e,0x3b3a0696,0x3ae7a214,0x39289bfb,0xba253a85,0xbaa58c16,0xbac1b9fb,0xbaba5062,0xba000088,0x3a38691f,0x3ab50990,0x3aba5b1f,0x390f22a7,0x3a185f51,0xb88d1615, +0xbab75da5,0xbabff89c,0xba8c38e5,0x3a7b754c,0xb9d64f5b,0xb83ec47e,0x3b05f387,0x3a5801d4,0x3955afe0,0xb8e9390c,0x3afe26b3,0x3b1dc76c,0x3b2b3d2f,0x39b77f4a,0xb987a099,0xbac7ee18,0x3b2fe230,0x3b5db389,0x3a1979f4,0x3b302e65,0x3b58b389,0x3bd58b77,0x3b837b60,0x3b2022d5,0xb989b773, +0xba8c5d12,0xbafdd548,0xbb1a3325,0xbaf58f3b,0xb9f78a3f,0x3ab57b7d,0x3b2ddd9f,0x3b19045b,0x393abd47,0x3aa3cac2,0xba0453f3,0xbb59d854,0xbb6d6c80,0xbb445643,0x3a73e0a6,0xbab9fe76,0xb8edde23,0x3b697f6d,0x3a2e0ba5,0x3b048b38,0x3b075742,0x3bc29fe3,0x3be884b5,0x3be8d99e,0x3b52ec84, +0x3a71e51b,0xbb08de4d,0x3b4cd6af,0x3b546ab5,0xba613627,0x3b4b2637,0x3bf4e003,0x3c560bfb,0x3c19f6ac,0x3b9f545b,0xba58e3c5,0xbb6e9e8a,0xbbbb0f85,0xbbd40f01,0xbba98672,0xbb026ad6,0x3a98c70a,0x3b864e35,0x3b8ba10b,0x3b1b9b75,0x3b6ae530,0x3b109029,0xba496d39,0x3a12cde1,0x3a20ad12, +0x3b6f7412,0xba31b4f4,0xb996df1f,0x3bbe2e63,0x3b274cbb,0xbc00d969,0xbbc3babc,0xbc13cc6e,0xbc0c58fa,0xbbd92066,0xbbd8aa94,0xbb872dde,0x3b8bd891,0x3ba116e5,0x3c052ae9,0x3c56207c,0x3b94adb5,0xbb7b3797,0xbc0363e6,0xbbf92bfe,0xbb47516e,0x3b56b5bf,0x3bdd25ba,0x3c1712eb,0x3c13d17a, +0x3be27978,0x3bb3ffa9,0x3b90019a,0xba3925f4,0xba6c42ed,0x3a6fc724,0x3b7ddb84,0x3b914656,0x389b7067,0xba8e9e35,0xbb89c877,0xbb8dabb6,0x3a77726e,0x3b48435f,0x3b1511ab,0xbba99fe9,0x3c11125b,0x3c086201,0x3c04e847,0x3b2e7c6d,0xbb277e1b,0x3c34377e,0x3c696b3a,0x3bd2089a,0x3adc70da, +0xbb85c988,0xbbf5c1c7,0x3ac4c06e,0x3bfd7d49,0x3c24988d,0x3b0b9aee,0xbada52ca,0xbab18de6,0xbaf342e5,0xba58cb6e,0xbaa746ab,0x3a7105a1,0x39b7aab1,0xbb06b9f0,0xbaba5db8,0xba8aff01,0x3a7bcdbf,0xbb41f39b,0xbb8ba4ec,0xbb1b5cf0,0x3ac4769c,0x3b386f02,0xba0ad2f7,0xbbe348df,0xbc3f4a33, +0xbc360ceb,0x3ad2bf73,0xbc6fd5dc,0xbd1c3c8c,0xbca05ec6,0xbc01b18f,0xbbcf2c94,0xbc073546,0xbc34ddb6,0xbc89b240,0x3c093947,0x3c6d319b,0x3a9aa109,0x3a1b7a49,0xbb05db3f,0xbaf12110,0xb9c973f5,0x3ad1e342,0x3b0d3472,0x3b2aff04,0x3ae69b60,0xba618f84,0xb83e4980,0x3a409b3d,0x3af690c0, +0xba065366,0xbaeb2976,0xbb191748,0x396b4e33,0x3ae08631,0x3a65caef,0xbb0a6346,0xbb6a68d9,0xbb790d52,0x3b487426,0x3b87088c,0xbbcd05cd,0xbb8cb6c1,0x3c711b9e,0x3cb0ac58,0x3c7cf6f2,0x3be5ef43,0x3b2c2463,0xb8ad21e8,0xb9d7e71e,0xbb04ee3c,0xbb6fc33d,0xbb9cc416,0xbb3fec0d,0x3b0bb378, +0x3b9d011a,0x3bc59b6a,0x3b7d71f7,0x3aed65ed,0xba2b15f6,0xbb0eaf16,0xbb50154b,0xbb814806,0xbb809ba6,0xbb62c9d5,0xbb058914,0xba062496,0x39d07e3d,0x39dbab27,0xb9b71b6e,0xba57f84f,0xba85b2f5,0x39ed209a,0x3a1f19a3,0x3a9607bd,0x3a640232,0x3ae1e513,0x3b8c0e87,0x3c06ade6,0xbbd74ffb, +0xbc0b7993,0xbc3dd3ea,0xbc23e1db,0xbbba8e90,0x3a1a9e6e,0x3b8c339f,0x3ba48814,0x3bfd011a,0x3c15557d,0x3c20c90a,0x3c0fb1fe,0x3bfd270e,0x3bece61e,0x3b8aab5f,0x3b0b6596,0x39aa0df3,0xba455b73,0xbb230e7a,0xbb8d4a3d,0xbb9b755a,0xbbaa3688,0xbbacdf02,0xbb876eeb,0xbb1d16c2,0x3a41cee6, +0x3894e101,0x390f2198,0x3a39b6c1,0x3af7ecd7,0x3b146d26,0x3b33b674,0x3a3e110d,0x38cc2b31,0x392aa16d,0xbb21f78a,0x3bf90cc7,0x3bf763a6,0x3c0e5efc,0x3c0991bd,0x3c007861,0x3bc7e5ee,0x3ba33893,0x3b85c9da,0x3b2eafae,0x3a9d893e,0x3981f9f2,0xb996d878,0xba5151db,0xba83b1cf,0xb9182e6a, +0xb729736d,0xba566611,0xba92bde9,0xbacd48e6,0xbb1ff487,0xbb1762f1,0xbb14214f,0xbb0ad777,0xbb450877,0xbb556d02,0xbb396e27,0xb998d147,0x3b054b41,0x3b7d2136,0x3ba8f7d9,0x3bbe551e,0x3bba2311,0x3bd285f8,0x3be8082c,0x3becdfae,0x3bf48dce,0xbb95d148,0xbb919932,0xbb4cebf8,0xbaddee6c, +0x397d9497,0x39b0d71e,0x38519db1,0xb9cda30f,0xba84323c,0xba9623bd,0xbaaa41cd,0xba877620,0xba4e04e8,0xba115d86,0xba887c85,0xbab5055c,0xbac967eb,0xbb105842,0xbb380404,0xbb6129b7,0xbb773f3d,0xbb87cffd,0xbb917764,0xbb8b0928,0xbb86dd58,0xbb8dbdce,0xbb7c3816,0xbb59cea3,0xbb4e10e0, +0xbb31d7f4,0xbb266ebb,0xbb060a75,0xbb4829d7,0xbb8e8596,0xbbb057fc,0xbb9b301f,0xbb81c710,0xbb81783a,0xbb56ff71,0xbb3faf14,0xbb2bcbfe,0xbb088270,0xba9dae2d,0xb97aaff1,0xb90bdc91,0xb91cbbe0,0xb9867349,0xb9b86191,0xba0013ed,0xb9f2fbcd,0xba7c6d08,0xbab73c68,0xbaf263d8,0xbb0edef7, +0xbb21f517,0xbb34c9f6,0xbb2a35e7,0xbb3e0fee,0xbb4e3c8e,0xbb5f9006,0xbb6ef939,0xbb7f4e0f,0xbb8ac5f3,0xbb96b984,0xbba20b84,0xbbaf0e98,0xbbbe02e6,0xbbc97da2,0xbbba7593,0xbba73630,0xbb9c098b,0xbb91a809,0xbb7582d7,0xbb7df7fb,0xbb67cdc1,0xbb5268b6,0xbb3af8a2,0xbb24b1e5,0xbb186448, +0xbb067265,0xbb0eab57,0xbb0ba78c,0xbb0755dd,0xbb04d3cf,0xbb035cc3,0xbb000a97,0xbb0c33af,0xbb14103a,0xbb1d9a97,0xbb2791ff,0xbb320169,0xbb421a66,0xbb3f8581,0xbb445af0,0xbb430b9d,0xbb4f8bed,0xbb52e834,0xbb565dec,0xbb62b9bc,0xbb6ef3f5,0xbb79b5fc,0xbb8229dc,0xbb859304,0xbb908216, +0xbb87f837,0xbb851435,0xbb7af234,0xbb7a5773,0xbb54a932,0x3a26fb37,0x39bd9de7,0x39d16c94,0x3a481b4f,0x3a6157cf,0x3a7e16e5,0x3a050f1c,0x39c94aec,0x392b2991,0x3a75ed3a,0x3a8d5b3f,0x3a092e56,0x3a788911,0x3a8e95cf,0x3ace74ea,0x3a9da217,0x3a818520,0x3a20aa61,0x39dc3bc2,0x3985c4b8, +0x3910ff92,0x39489bd7,0x39b36b17,0x3a2a604d,0x3a68d631,0x3a394e50,0x39386f3d,0x39aeafda,0x38a066b0,0xba226c34,0xba0fe3a6,0xb9d5da4f,0x39fba598,0x38041fd1,0x39952b11,0x3a8a69d3,0x39e2da21,0x3a14de36,0x3a661436,0x3b02abc1,0x3b1aa2f7,0x3b2539f0,0x3a996f2b,0x3a2ecdb5,0x383785fe, +0x3ad1bb1c,0x3ad8d2c1,0x398d561c,0x3abb56bb,0x3b1ba320,0x3b7f78f5,0x3b54cc39,0x3b1cd64f,0x3a76efd8,0xb871a034,0xba570c8d,0xba95d6ed,0xba907cf2,0xb907eea0,0x3aa89331,0x3ad3bd53,0x3ac5971a,0x395ff38e,0x39f8fbf5,0xb98535ab,0xbaceb05a,0xbaeca321,0xbab6d0b1,0x3a4c1bc4,0xba2af9e0, +0xb946380b,0x3b12adaf,0x3a24c9a9,0xb95fd28c,0xb89d7634,0x3b055ce7,0x3b3528fd,0x3b582089,0x3a9c6c38,0x3a01d6da,0xba8d66ea,0x3b423a3b,0x3b6c00e7,0x3a797b79,0x3b3b8eaa,0x3b606837,0x3bcdcf4b,0x3b97db94,0x3b5b9169,0x3a6a09a4,0xb9a3485b,0xbaae82e4,0xbb01ae8c,0xbac6015a,0xb83da143, +0x3b11ca82,0x3b3021c4,0x3b17f349,0x3763b612,0x3a47a3b3,0xba990212,0xbb8466df,0xbb90c138,0xbb74990c,0x3a2649bf,0xbaf1a81d,0xba103ea2,0x3b78d09c,0x395e950f,0x3a725451,0x3ae7cf93,0x3bb548e4,0x3be865a0,0x3c006e4a,0x3b8d1f3a,0x3b156e0a,0xba82b1f1,0x3b707323,0x3b64044d,0xba281aec, +0x3b257b47,0x3bd69efa,0x3c45fce3,0x3c29b1a1,0x3bda613d,0x3ab83d0f,0xbb06cf6b,0xbb95c5eb,0xbbc07c1d,0xbb9a4967,0xba9b48f7,0x3b4761df,0x3b9b9c03,0x3b90aef1,0x3b0e81c3,0x3b51a6e5,0x3abbf8f9,0xbb4320cf,0xbadf7f8e,0xbab12ff5,0x3b175373,0xbb0dea79,0xba9f51f7,0x3bd06259,0x3ad43c6e, +0xbc048b49,0xbbae3eb3,0xbc0a5f9f,0xbbf622df,0xbba4a6d9,0xbbb94e5d,0xbb889789,0x3b10e601,0x3b97545b,0x3c10f376,0x3c59ab5e,0x3bfe6d3d,0xb9eca453,0xbbdacd5f,0xbbfae1b8,0xbb843eeb,0x3b1c3432,0x3bc7e98b,0x3c1478c6,0x3c216855,0x3c019d79,0x3bb63bf4,0x3b5639b0,0xbaeb4172,0xbade933f, +0x3b008071,0x3b1834e9,0x3b2bd879,0xb899f6e8,0xba1e0c89,0xbb35902b,0xbb189d93,0x3af42eaa,0x3b3ccfdd,0x3a91a824,0xbbc18de6,0x3c391bf6,0x3c0a94e9,0x3bc75d30,0xb92ad936,0xbbc1d379,0x3c1a19e1,0x3c61fdf4,0x3be285bd,0x3b208a5d,0xbb8bc9d1,0xbc1f05c9,0xbac553aa,0x3bb2b280,0x3c3332d0, +0x3b6515ee,0xb9b548d0,0xb9a4d098,0xbac83513,0xb9e305f6,0x39e67c5d,0x3b03f614,0x3aa3fd5e,0xbaf80a83,0xba9bf285,0xbabcd1d9,0x399b0bcd,0xbb475104,0xbb66fa07,0xbae1fcf6,0x3a6dd7fc,0x3acbf41e,0xbaef54b3,0xbc084598,0xbc3f0f26,0xbc13bfbd,0x3ba0e223,0xbca39012,0xbd1e3289,0xbc695c54, +0xbb084f86,0xbba31c65,0xbbcf2f0d,0xbc1a57b1,0xbc74b402,0x3ba98a00,0x3c39fc86,0x3b0c272a,0x398b1275,0xbb2e3029,0xbb23bf22,0xbadeca3c,0x39792510,0x3a9ef861,0x3afaa8fe,0x3ae39e2b,0x38fc3a7d,0x3a18cfde,0x3a8a7b25,0x3ac3099d,0xba48e683,0xbae5eba2,0xbb29b0e4,0x3a090472,0x3aee07f7, +0x3a2256f8,0xbb07240a,0xbb3c6aa0,0xbadc3ea2,0x3b2640e0,0x3b3a84b6,0xbbc82475,0xbc1676b4,0x3c8e8f3e,0x3cb66f11,0x3c63e444,0x3ba510d3,0x3a497b98,0xbadea1fb,0xbae5be00,0xbb22b0e0,0xbb79aadc,0xbbad0fa1,0xbb9ba6ee,0x3a2f5782,0x3b7bdbf3,0x3ba90efc,0x3b805296,0x3b0f5fb5,0x3a2f67be, +0xbaa94782,0xbb1f2937,0xbb52bcfd,0xbb561215,0xbb20c6cf,0xba77bbc2,0xb8151ca4,0x39f9e016,0x3a43446f,0xb9fb1a68,0xba7ab29a,0xba32c864,0x3a01cb20,0x3a07080e,0x3aabe7a8,0x3b0642cd,0x3b2111a9,0x3b74ff08,0x3c26bbc2,0xbbd3c771,0xbbe66996,0xbc1d5ba4,0xbc083378,0xbbab6ef2,0xba05a3f0, +0x3b1e5d67,0x3b616748,0x3bd28f16,0x3c07d462,0x3c0f95ac,0x3c07e1ac,0x3bf26b51,0x3be834bb,0x3b82dbc4,0x3ae24955,0xb82b3706,0xbadec79d,0xbb658657,0xbba6d56c,0xbbacc66d,0xbbaf7cb5,0xbbb3502d,0xbb6c889c,0xbb06bf46,0x39b34efd,0xb9c12f00,0xb9efe569,0x38a49bf7,0x3a83678b,0x3ad353a6, +0x3b24b31f,0xb93105e0,0xba39f266,0xb9aef96f,0xbb3ee293,0x3bf56575,0x3bedf88e,0x3bf1a1d5,0x3be51c88,0x3bde0744,0x3bc7dab6,0x3bbf0577,0x3bb414a7,0x3b7f4fd2,0x3b1465cd,0x3ab32cb1,0x3a38c7e0,0xb7c6f0f7,0xba4faff2,0xb934bb81,0xb94e1352,0xba9c29d3,0xbaa595ae,0xbab401c0,0xbae7308f, +0xbae056ba,0xbaec73c5,0xbb09b563,0xbb3b8f97,0xbb3a7f42,0xbb029cde,0x3a4220e2,0x3b3e4ddd,0x3b86e45f,0x3ba28770,0x3ba91634,0x3b9e52ef,0x3bb347e1,0x3bc9e2b1,0x3bd79dbd,0x3be1b22f,0xbb5476e8,0xbb55ff07,0xbb07ffae,0xba85ceeb,0x3988aad9,0x39119e8f,0xb97b3b54,0xba136ef8,0xba775baa, +0xba580293,0xba2c86b3,0xba2054c2,0xba080003,0xb9da3e7b,0xba91dee3,0xbae1142a,0xbb0fb8b1,0xbb26d57f,0xbb3ff0ce,0xbb5a65f2,0xbb766f24,0xbb874423,0xbb91d0d4,0xbb870ab7,0xbb81b0ca,0xbb82aad7,0xbb64bede,0xbb2c211f,0xbb14b1de,0xbaab2be2,0xba546d8e,0x38d1431a,0xba6e5b0d,0xbb0d3d19, +0xbb4ef6d6,0xbb3e314e,0xbb9c3683,0xbb983c26,0xbb876650,0xbb7cf6cc,0xbb66a915,0xbb41c5a7,0xbb0ec034,0xbabf8503,0xbab6244a,0xbabf7053,0xbacc628e,0xbacbfb36,0xbacc7d0a,0xbab729e4,0xbae8e0d7,0xbb063905,0xbb1c3cc7,0xbb2ca60c,0xbb3c2d35,0xbb4a9b79,0xbb45eee4,0xbb4fa6be,0xbb5c01e0, +0xbb67e641,0xbb7496c0,0xbb7d0848,0xbb890b93,0xbb95bde3,0xbba4a818,0xbbb2059e,0xbbc19367,0xbbcfdea5,0xbbc44cbb,0xbbb71285,0xbbaf4ab0,0xbba3475f,0xbb76cb09,0xbb78e3ba,0xbb674f35,0xbb552234,0xbb44c524,0xbb379886,0xbb30e108,0xbb23eb32,0xbb24b03a,0xbb1d0b26,0xbb15e4ff,0xbb1111c6, +0xbb0ec1d4,0xbb0ac527,0xbb16572a,0xbb1e2976,0xbb26d185,0xbb314ffc,0xbb3c34b4,0xbb4aef9b,0xbb49a2d3,0xbb4cf35d,0xbb4d452b,0xbb4f1a38,0xbb523ef0,0xbb55db0d,0xbb630e91,0xbb6e3bfb,0xbb75c297,0xbb804bfa,0xbb8379c4,0xbb8d164b,0xbb82c0d8,0xbb7dd280,0xbb7ec9bc,0xbb7c52bc,0xbb4af0f9, +0x3a4fd7a6,0x39fa430a,0x3a0d24b1,0x3a6df5c1,0x3a887a0a,0x3a9f870e,0x3a47886d,0x3a231116,0x39c1c153,0x3a8be368,0x3a9d45bc,0x3a3e4bbf,0x3a904f54,0x3aa128b6,0x3ad62991,0x3ab6ce4d,0x3aa0e180,0x3a74b0b2,0x3a284e6d,0x39eb86d8,0x399c8eaf,0x39cd1b42,0x3a0ccab1,0x3a6ee438,0x3a81934c, +0x3a52f773,0x39983491,0x39cae605,0x39038dba,0xba033308,0xb9ffa0ea,0xb9ac7fb8,0x3a19eaad,0x391c2cde,0x39c34b26,0x3a9fe5a3,0x3a0ac0c9,0x39e6ac9f,0x3a6a30a8,0x3b00a9a7,0x3b20d91d,0x3b39bc9a,0x3ad3678a,0x3a94fda2,0x39dfc433,0x3ae95a49,0x3ae7e5b6,0x3a02b37a,0x3abd6486,0x3b18b887, +0x3b73d44b,0x3b691e24,0x3b406b7d,0x3adeed07,0x3a0112ec,0xb9c8e727,0xba4c0b3e,0xba372037,0x397a0141,0x3adeb0ff,0x3ae8eea6,0x3aca0bb8,0x3988d7d5,0x39acd9bf,0xb9e077ea,0xbacdaa71,0xbb03c6cb,0xbad4b5bf,0x3a1ec34b,0xba53e9a6,0xb98c96be,0x3b17a685,0x3a05eec2,0xb9db29c9,0x36ef6462, +0x3b0c171c,0x3b4a0c1a,0x3b7f3946,0x3b01e455,0x3a9bcbf3,0xba08ec4d,0x3b424fcc,0x3b6a31af,0x3abfb234,0x3b444657,0x3b66427c,0x3bc194db,0x3ba700ab,0x3b86e4dd,0x3b056514,0x39bf3de9,0xba527f3a,0xbad1961d,0xba8e49fe,0x39abb270,0x3b2ff4e0,0x3b27dc49,0x3b0e62c0,0xb9634d40,0x393220e0, +0xbaeb38f3,0xbb8c5ed1,0xbba32762,0xbb8af83a,0x39cb5fe7,0xbb09277b,0xba645988,0x3b781431,0xb8ced5b1,0x38916e83,0x3ac01120,0x3ba56b17,0x3be48fb6,0x3c08ffee,0x3bacd4a2,0x3b64c9a0,0x393a424a,0x3b7b3a6e,0x3b61ec5c,0xb8dcaf8c,0x3b057337,0x3bb99a87,0x3c324200,0x3c33dde4,0x3c06bed1, +0x3b70f3b9,0xb9e90fb1,0xbb5c6d85,0xbba3d6d1,0xbb7e079f,0xb9b0593a,0x3b90d525,0x3ba6f546,0x3b8e0e33,0x3b035b7c,0x3b24b80a,0x39f672c3,0xbb93d5ca,0xbb73e714,0xbb4e9830,0x3a8a1e08,0xbb622d03,0xbb05547d,0x3bd2c832,0x3a4fb713,0xbbfc581e,0xbb921c0d,0xbbec41c3,0xbbc55f38,0xbb7d1992, +0xbba0b677,0xbb8ef551,0xb983e344,0x3b80d6a3,0x3c15c1a9,0x3c542cd7,0x3c3503ec,0x3b58540c,0xbbb34955,0xbbeaef59,0xbb9de3c4,0x3a5f5334,0x3b983c87,0x3bff4c60,0x3c1a9d4d,0x3bfeca95,0x3b9b95e1,0x3adb2046,0xbb443ebe,0xbb23bce2,0x3b362f6c,0x3a7f585a,0x3a572e08,0xba033b16,0xb9de774f, +0xbab696a4,0xb84fc190,0x3b3c7b5d,0x3b3a8cd5,0x392448b6,0xbbc67e45,0x3c554821,0x3bff2ef1,0x3b7226f5,0xbb2e1460,0xbc0f2c8f,0x3be8e42e,0x3c485aea,0x3be8b4b6,0x3b4bf6ab,0xbb8e7067,0xbc3e8aac,0xbb8a954f,0x3b444f9e,0x3c2a7f06,0x3b9c4cf1,0x3aa34e58,0x3a5a3e64,0xba87f90d,0xb8ede594, +0x3b00b7bc,0x3b379a32,0x3b03fe5a,0xbab5dae6,0xba25a0d4,0xbac623c0,0xb9ddaaa9,0xbb411521,0xbb2f3856,0xbaa011f5,0x39bbd204,0x3982771d,0xbb50dabd,0xbc1bd0eb,0xbc3b4fbd,0xbbdafa31,0x3bf8d18f,0xbccd6fe6,0xbd1703f2,0xbc1527c9,0x3b2c67c2,0xbb7a5a4b,0xbb66f00b,0xbbd9d459,0xbc4d0a2c, +0x3a955834,0x3bf67b82,0x3b8985f7,0x3987f35f,0xbb53152d,0xbb4cd071,0xbb41a2f9,0xba9e2eaf,0x39303fea,0x3aa0f07e,0x3aebadee,0x3aa3e3b8,0x3aad8af7,0x3aad1ee6,0x3a5dba5b,0xba8e62fa,0xbadb6c6b,0xbb32cf2e,0x3a20552b,0x3ad483a0,0x39c97cf6,0xbae815dd,0xbb04d202,0x3954d64a,0x3a87a2c5, +0x3a57fa39,0xbb961d9a,0xbc6da222,0x3c9a9447,0x3ca36f95,0x3c2cf604,0x3b3d50af,0x3812aa6e,0xbb352b45,0xbb394dab,0xbb1cbc87,0xbb5d08d3,0xbba44dc1,0xbbb24af2,0xb9e3c9f5,0x3b3fb35e,0x3b8804a9,0x3b74d0c3,0x3b1fd1d0,0x3afc2e22,0xb9dc0049,0xbad89f8a,0xbb1718cb,0xbb1e482c,0xbaad0f0b, +0x3954162a,0x39efa881,0x3a03573a,0x3a4f72ec,0xba0aee9d,0xba8481f7,0xb9f51d82,0x39952bd7,0x39a81146,0x3add40af,0x3b5bdafe,0x3b5b57f6,0x3b7fdf02,0x3c467b95,0xbbc6d474,0xbbac76ca,0xbbda6e3a,0xbbbf5bae,0xbb88aa9d,0xba88c1e5,0x3a873ca9,0x3b14676a,0x3baa176a,0x3bf358e4,0x3c00bfdf, +0x3bff2185,0x3be0552b,0x3bd02ca8,0x3b6e9e47,0x3aacc359,0xb9f91013,0xbb2abea9,0xbb8e1435,0xbbb3663a,0xbbb77adf,0xbbb17296,0xbbb58a10,0xbb47555e,0xbad96c55,0xb9436746,0xba3a2dbf,0xba70b83d,0xba2eb6a2,0x3753eef1,0x3a726d8a,0x3b12815a,0xba46352d,0xba9e216b,0xba81de01,0xbb5ce9f5, +0x3bd43f00,0x3bc40b37,0x3bae48b9,0x3bac2241,0x3bbc3f79,0x3bc3f1e2,0x3bd70480,0x3be627fc,0x3bb044dc,0x3b705836,0x3b3189c7,0x3b0422e2,0x3a9ff10a,0xb75b55f6,0x393fa180,0xb91b8c4d,0xbab32a30,0xbaa2f547,0xba9b1369,0xbaa31c1c,0xbab565b0,0xbad6c8da,0xbb10b3da,0xbb2eb513,0xbb1745ad, +0xba8d12f3,0x3ad3c6e4,0x3b61030f,0x3b81cea1,0x3b8d554d,0x3b8588a2,0x3b6f5cd9,0x3b87d086,0x3b9b97ca,0x3bae60da,0x3bb840c8,0xbac5eb37,0xbad252f0,0xba1d7e23,0xb8e61769,0x39b8423a,0x38556d0e,0xb9a0b73c,0xb9e24900,0xba0ba20a,0xb92587ed,0x3992082b,0x36333bf9,0xb947d072,0xb99969fb, +0xba943adf,0xbafa9cf6,0xbb2c3fcf,0xbb322636,0xbb3fa461,0xbb4dbe6c,0xbb6a4be3,0xbb7fb301,0xbb8a97d3,0xbb784032,0xbb6bc591,0xbb653108,0xbb3d29fe,0xbad928a1,0xba88ba17,0x39b9331d,0x3a952e2b,0x3b1ce6ef,0x3ab817be,0x3998c1e7,0xba25e7e8,0xba4570a7,0xbba75680,0xbb9e699e,0xbb953b77, +0xbb8f0b48,0xbb8368c6,0xbb658920,0xbb4175a2,0xbb295ce6,0xbb261355,0xbb2ce2f7,0xbb2fcb58,0xbb277c4d,0xbb1c6d91,0xbb08da17,0xbb19ed6a,0xbb22e160,0xbb326880,0xbb3f1c68,0xbb4c4bdc,0xbb57fba8,0xbb543eb8,0xbb589232,0xbb616d97,0xbb6883c0,0xbb725723,0xbb778ada,0xbb83b690,0xbb8f5a0e, +0xbb9f1d28,0xbbaac5af,0xbbb81b90,0xbbc6cfd4,0xbbbd89fa,0xbbb630b6,0xbbb2432a,0xbba48f24,0xbb6b6b29,0xbb68b82c,0xbb5dd0d2,0xbb511ece,0xbb49c791,0xbb4648b5,0xbb444c4f,0xbb3ca45f,0xbb35e2fe,0xbb2a988f,0xbb21b145,0xbb1ad484,0xbb17bc5d,0xbb12553b,0xbb1d7711,0xbb24ff13,0xbb2c89f2, +0xbb36cf8f,0xbb414078,0xbb4f3c07,0xbb4bd690,0xbb4c614a,0xbb4b99bd,0xbb4bf39d,0xbb4cb74a,0xbb4e9608,0xbb5a53f7,0xbb635c5d,0xbb66cf6f,0xbb6ff5e8,0xbb749bbe,0xbb8124ec,0xbb6d2e37,0xbb66bf9e,0xbb739208,0xbb705b71,0xbb452072,0x3a7017fd,0x3a1bb535,0x3a306569,0x3a85f0ac,0x3a9b8ecc, +0x3abc5894,0x3a8097d3,0x3a591d7d,0x3a131f51,0x3a94a0b6,0x3aa4e1a1,0x3a73cf33,0x3a9e64fb,0x3aac6c55,0x3ad4427b,0x3ac88c30,0x3ab95c43,0x3a9d26f9,0x3a566bd8,0x3a1db80a,0x39de0fd4,0x3a11c9c7,0x3a337014,0x3a8b8c36,0x3a882168,0x3a5e5d4f,0x39b79917,0x39cffa6b,0x3920fad6,0xb9b3db1b, +0xb9da5b86,0xb98485ce,0x3a2a2721,0x3980f182,0x39ea6bf7,0x3aa97f8f,0x3a2087ca,0x39ca1e15,0x3a729dc3,0x3afa741b,0x3b23932b,0x3b4b6150,0x3b0365e6,0x3ac94f97,0x3a496086,0x3aef3ed7,0x3aea5afa,0x3a57143e,0x3ac2327a,0x3b151a44,0x3b6171bb,0x3b76e838,0x3b5d6beb,0x3b1ac140,0x3a8043bd, +0x37f55da6,0xb9dc31fd,0xb98a93bb,0x3a1dd28a,0x3afb2bda,0x3af2fa07,0x3ac5b80b,0x396e0548,0x391b1036,0xba1b3353,0xbabde33b,0xbb0a8b7c,0xbae9467c,0x39c9b2f3,0xba6dcc58,0xb9a900fa,0x3b10137c,0x39ee196d,0xb9e11e34,0x391a0a12,0x3b1317ed,0x3b5b5e72,0x3b9297b8,0x3b307cf5,0x3aec1394, +0x38714790,0x3b33a03a,0x3b5a5218,0x3b080ab0,0x3b49c605,0x3b6861c0,0x3bae23d5,0x3baff355,0x3b9a408a,0x3b46392d,0x3a6fbe42,0xb9bf38f8,0xbaa7349a,0xba2b39f6,0x3a2cffc5,0x3b34cc7f,0x3b181fe4,0x3afbac7d,0xba128ae5,0xb9f080ff,0xbb199d55,0xbb88662c,0xbbaf1e35,0xbb9660ef,0x38bb4fe9, +0xbb10d33c,0xba8e3d9a,0x3b64e049,0xb97f7abf,0xba00d7d3,0x3aa37520,0x3b947820,0x3bddbfd1,0x3c10cfa2,0x3bc9a506,0x3b939b7f,0x3aa53a28,0x3b7098da,0x3b548231,0x3a51b195,0x3af3d2c5,0x3ba4bf40,0x3c1c0483,0x3c38de0c,0x3c1b8b16,0x3bbc8ef1,0x3a8de036,0xbb09a543,0xbb7f8af9,0xbb31cfeb, +0x3a1a7283,0x3bab47d2,0x3ba89201,0x3b846eec,0x3ae34058,0x3acd2687,0xba26149a,0xbbacfafe,0xbbb3007d,0xbb9c17fa,0xb908cf43,0xbb9368bb,0xbb321b56,0x3bc34ccd,0x39082e34,0xbbd9150d,0xbb5ac830,0xbbaab732,0xbb865035,0xbb4f1d85,0xbb8b4606,0xbb92c608,0xbb2b2bda,0x3b473174,0x3c106c55, +0x3c40e312,0x3c596fc9,0x3bcc9f6b,0xbb9cb354,0xbbd6ece1,0xbbb3b1fa,0xba8a077f,0x3b2b2982,0x3bb4a411,0x3bf95606,0x3bcfad95,0x3b457b63,0xb946e3e9,0xbb88c75d,0xbb516ac5,0x3b5d6187,0xb873134e,0xba3a5dd7,0xba8ca701,0xba0ec5a6,0xb92a2cc6,0x3b18e392,0x3b81d47d,0x3b45ee54,0xb9cded40, +0xbbb4d24c,0x3c5f94c8,0x3bd46823,0x3ac0ae6b,0xbb955fe0,0xbc3171c8,0x3b89d089,0x3c201ab8,0x3bdde9c3,0x3b6dfad3,0xbb88fd0d,0xbc53080a,0xbbd73a10,0x3a024efa,0x3c101068,0x3bc4c490,0x3b506022,0x3b010c43,0xb9a9f1a6,0x39a62343,0x3b54501f,0x3b582407,0x3b2b433e,0xba3187f1,0x3900fe5a, +0xbaac2e2c,0xba99c9db,0xbb331ce9,0xbaf398cd,0xba65ca18,0x388c4253,0xba6093f4,0xbb963552,0xbc2d418a,0xbc364f24,0xbb8fc426,0x3c17bfe6,0xbceb17ba,0xbd0aaacf,0xbbbd075c,0x3ba721ab,0xbaff32fa,0xb9e725a7,0xbb7f25ce,0xbc28ef5c,0xbb4c131e,0x3b72acb4,0x3be415e0,0x3a37b201,0xbb686c7c, +0xbb6c3c15,0xbb84bd6b,0xbb2f0ac5,0xba8bb47d,0x3a0210b1,0x3ae0a8b6,0x3b0722bc,0x3af50e62,0x3ab07789,0x37b3f4e6,0xbac337ea,0xbad75f02,0xbb30c1dc,0x3a07b868,0x3aa13928,0x3973f802,0xbab3a662,0xbaa7f36d,0x3abdd131,0xba8060c1,0xbaa38c5b,0xbafd2897,0xbc994b43,0x3c99b26b,0x3c76a9dc, +0x3bcdfc58,0x3a83c5c4,0x3a6b0344,0xbb4db1c0,0xbb67595e,0xbaf9abb4,0xbb24eb23,0xbb8955c3,0xbbb13814,0xba96072c,0x3b0b4f15,0x3b4ccb87,0x3b608772,0x3b319cea,0x3b427706,0x39dcf4bf,0xba66b636,0xbab5106d,0xbab97b4f,0xb94104c4,0x3aa4cc33,0x3a739eed,0x39f8787f,0x3a0b7c64,0xba0676e1, +0xba7d03aa,0xb99d64ba,0x383f2ced,0x39570bb6,0x3b19cc61,0x3b8dd3dd,0x3b84c39d,0x3ba158df,0x3c5fd5ae,0xbbb0e855,0xbb5ca8fe,0xbb61f3f7,0xbb584b00,0xbb45b1e8,0xbaa40ead,0x3945b971,0x3ad099bc,0x3b84d72b,0x3bd67aa7,0x3becea2d,0x3beec578,0x3bcccf17,0x3bb29b51,0x3b577458,0x3a7f6bab, +0xba853ee4,0xbb5b0ff3,0xbb9ea4cf,0xbbb3dc7d,0xbbbbe8e3,0xbbaf6ddc,0xbbb0b9a7,0xbb22bcd7,0xbaa1a94d,0xba2eb5b8,0xba761fc8,0xbaa35c72,0xbab49c8b,0xba57bd95,0x39b41c1d,0x3af8f4cc,0xba7d668a,0xbab7e211,0xbae84439,0xbb76813c,0x3b9bbcda,0x3b827609,0x3b37a7c2,0x3b56fc9a,0x3b969e9e, +0x3bbee3d2,0x3bebab8b,0x3c092f99,0x3bdfba14,0x3ba9ee45,0x3b8b783c,0x3b6b12cd,0x3b36e791,0x3aa0bd70,0x3a6440c1,0x3921bd21,0xbaa5ed38,0xba88f4ab,0xba872da0,0xba865bd5,0xbab5fd84,0xbae323f9,0xbb1acfe5,0xbb1c6eef,0xbadd775f,0xb94ef256,0x3b11cb71,0x3b6a37f3,0x3b630f49,0x3b5ef0cb, +0x3b3a6546,0x3b1d06cd,0x3b35d764,0x3b5360d3,0x3b7bd6f9,0x3b82fa2e,0x39ee89d8,0x39e34c1f,0x3aa4f5fc,0x3a9d81e4,0x3a72a653,0x39e66a6a,0x3905ec10,0x393bfb15,0x3994bc2d,0x3a50492c,0x3aaf26ca,0x3a2a7d3a,0x3885633c,0xb9b802d4,0xba9aa0eb,0xbb0270aa,0xbb38137b,0xbb32a3d8,0xbb36e03d, +0xbb3c6176,0xbb564d6b,0xbb67dfe1,0xbb7cd183,0xbb56be20,0xbb477846,0xbb36afcc,0xbb050c40,0xb9ed584b,0x39e7bdbd,0x3b059574,0x3b43894a,0x3b9090d4,0x3b638a32,0x3b28808d,0x3ae7907e,0x3ab7c48d,0xbba0613a,0xbb936050,0xbb927fdd,0xbb8f576b,0xbb84722d,0xbb6fc623,0xbb5e4452,0xbb5dacc1, +0xbb5b04d8,0xbb623f9a,0xbb5fcbd6,0xbb5070cd,0xbb3abff4,0xbb21275f,0xbb2c3bf3,0xbb3034f3,0xbb3a93f7,0xbb459a0d,0xbb51cd4c,0xbb5d1dba,0xbb5cdec4,0xbb5c4614,0xbb63626a,0xbb676a5a,0xbb701297,0xbb75f880,0xbb7b529d,0xbb859e42,0xbb929f10,0xbb9933c4,0xbba0a6cd,0xbbabdb81,0xbba42ade, +0xbba22958,0xbba1d207,0xbb937a62,0xbb5ad7f1,0xbb522f95,0xbb4ef23e,0xbb4882ca,0xbb49f1b0,0xbb4e3004,0xbb4f568f,0xbb4c5f62,0xbb40c8de,0xbb347ac8,0xbb2bf4b5,0xbb244a43,0xbb21257a,0xbb1a9243,0xbb24e17f,0xbb2b9be1,0xbb31f96a,0xbb3b0410,0xbb43f666,0xbb4f828a,0xbb4d5b42,0xbb4ced21, +0xbb4adf4e,0xbb4cd02c,0xbb4cd185,0xbb4d642f,0xbb54957d,0xbb59e6b8,0xbb580f90,0xbb5d3a94,0xbb5e9403,0xbb63a70b,0xbb518588,0xbb4c9b57,0xbb628b55,0xbb5fabcb,0xbb46a98a,0x3a7838df,0x3a324375,0x3a435e7b,0x3a8b03b4,0x3aa28851,0x3acbcf28,0x3a90e918,0x3a767565,0x3a2be264,0x3a8dfef6, +0x3a9d5456,0x3a8a766e,0x3a9ff408,0x3aaa694b,0x3ac2f17b,0x3acb396e,0x3ac27a03,0x3aaeb282,0x3a69af8d,0x3a2e9005,0x39f217e1,0x3a2b5287,0x3a4d09f4,0x3a9730c6,0x3a844339,0x3a5dd31f,0x39cc53a4,0x39d57ead,0x394a2634,0xb92a2fae,0xb9a64f95,0xb926aa82,0x3a2fa33e,0x39a71487,0x39f743fd, +0x3aab0c3d,0x3a335cfb,0x39da7ae0,0x3a73a1c4,0x3ae9cbb7,0x3b1f05ab,0x3b5438c6,0x3b151d42,0x3aeb1aa9,0x3a7c6a69,0x3addc858,0x3ada0ed8,0x3a936a94,0x3ac29ab6,0x3b0d8118,0x3b45a64c,0x3b784b2b,0x3b6cebaa,0x3b379173,0x3aaec20a,0x39c1f40e,0xb8e28ee6,0x39388efc,0x3a6ada65,0x3afa9b5a, +0x3aefcf62,0x3ab844eb,0x38968f83,0xb8a2c1a6,0xba456e01,0xbaabdc99,0xbb0cbe01,0xbaf81f77,0x3861d9f5,0xba7d57cb,0xb9bcd259,0x3af350b0,0x39cfb8cf,0xb98bee72,0x39c295b5,0x3b14d919,0x3b63837e,0x3b9fd876,0x3b5382b2,0x3b13cf6c,0x39f01f56,0x3b1382dc,0x3b39ecdd,0x3b2b2957,0x3b48ae32, +0x3b632554,0x3b92bd65,0x3baf9c63,0x3ba3a5b5,0x3b711c27,0x3aa71536,0xb8612e70,0xba843e38,0xb98d2573,0x3a6d285e,0x3b2181ed,0x3b02d4a1,0x3ad402d6,0xba887323,0xba87e2d7,0xbb394a50,0xbb80256a,0xbbb5f250,0xbb9c9276,0xb9c5df3b,0xbb0f7c32,0xba993b9d,0x3b3f08be,0xb98362d0,0xba41d90d, +0x3a93916b,0x3b7d6559,0x3bd027b7,0x3c153fa8,0x3bdf5804,0x3baaea87,0x3b0394e6,0x3b4fa2c7,0x3b39c5b3,0x3af270f0,0x3afea217,0x3b95c121,0x3c02c829,0x3c364fe7,0x3c281ba8,0x3bf0ba13,0x3b1cdd12,0xba595282,0xbb2b4062,0xbaaf2bd8,0x3abe4d33,0x3bb13425,0x3ba12b3e,0x3b6b80d1,0x3aa29c05, +0x39e0501b,0xbae76a82,0xbbb0636a,0xbbe1b168,0xbbc8f54c,0xbab13900,0xbbabfc49,0xbb511353,0x3ba01a39,0xb9cd3db2,0xbb9b1981,0xbb029eaa,0xbb263a10,0xbaf11f00,0xbb3870d7,0xbb6d3ed8,0xbb91bd32,0xbb972605,0x3afd5137,0x3bfe89ee,0x3c212238,0x3c641494,0x3c011283,0xbb954c14,0xbbc7f08d, +0xbbca0bc3,0xbb52e826,0x393ecdbe,0x3b22ac4c,0x3b91a530,0x3b785d86,0x3a2a2e00,0xbb09d175,0xbba942d7,0xbb71c2d1,0x3b76d12f,0xba450153,0xbae98f1d,0xbace8457,0xba53926e,0x3a713dff,0x3b984ffd,0x3ba69d54,0x3b619f00,0xb9f929e1,0xbb874b51,0x3c578c38,0x3b9c8bce,0xb9e67e8e,0xbbbf7c96, +0xbc426534,0x3a86efa0,0x3bdf78b9,0x3bc77707,0x3b853256,0xbb6ba090,0xbc58c577,0xbc08ad11,0xbaf282f9,0x3bd18d62,0x3be2957e,0x3ba9556a,0x3b492966,0x3a2e6571,0x3a815095,0x3b8d44d5,0x3b6a80e7,0x3b439a50,0x390daf99,0x3a6e49d6,0xba771809,0xbaf93668,0xbb20dd5b,0xba94eefa,0xba226dcb, +0x38d92f3d,0xbacfb246,0xbbbfe6c9,0xbc3e9089,0xbc31cd11,0xbb13c058,0x3c2231fe,0xbcf68722,0xbcf515b8,0xbb973bb1,0x3ba75163,0x3a883340,0x3b082e71,0xbb126be8,0xbc0e6138,0xbbe9a622,0x384a19ed,0x3c1c7e15,0x3aae4436,0xbb6c6236,0xbb84f541,0xbba12c8a,0xbb832f30,0xbb1c9cc0,0xb9a4d738, +0x3aa3e175,0x3b09173b,0x3b00894d,0x3a8780d5,0xba62dc13,0xbafef7a7,0xbade7b31,0xbb23245f,0x39add397,0x3a4e224a,0x38dc7db2,0xba77aa25,0xba502d64,0x3aed0712,0xbb3dc258,0xbb3cd309,0x3a26b5cc,0xbcabaf73,0x3c8b3e0b,0x3c0f567a,0x3b22b397,0x38972ef5,0x3b3867b0,0xbb180b26,0xbb544339, +0xbac1a42a,0xbad9c5ca,0xbb4e5e23,0xbb97bbc9,0xbac1acf5,0x3ab6ca72,0x3b030137,0x3b45d448,0x3b482383,0x3b7423fe,0x3a9f892f,0xb8a7cdc6,0xba0e88ff,0xb9bd7f38,0x3a5e21f4,0x3b09eb62,0x3aae1a24,0x39d85cbf,0x386558fe,0xb9ff7c22,0xba51a686,0xb8cde2c7,0xb802284c,0x398e9a16,0x3b4c7b9b, +0x3b998cf2,0x3b8ddfe3,0x3bd4d515,0x3c6bd787,0xbb9054e5,0xbac7412b,0xba0a191d,0xba9460e4,0xbb114e2c,0xbabe1a25,0xb9d3de78,0x3a883c88,0x3b443ca3,0x3bb6215e,0x3bd872d0,0x3bdc59b9,0x3bbbe1e1,0x3b9a08c7,0x3b3f0653,0x3a2a7c1a,0xbac7e98d,0xbb78a057,0xbba4196d,0xbbace46c,0xbbb9bc67, +0xbba882d8,0xbba1baa1,0xbaff82ee,0xba5444c1,0xba7774ad,0xba8ac1d7,0xbabe943c,0xbaf2ac9a,0xbaad841e,0xb8c82322,0x3ac079b4,0xba5c9235,0xbab1df7b,0xbb21533c,0xbb820ee4,0x3b2c953d,0x3ad2fe46,0x390c94ef,0x3a9dd258,0x3b561c7d,0x3bb6dae7,0x3bf704c5,0x3c1518ec,0x3c01fe26,0x3bda18e4, +0x3bc42b4c,0x3bacceeb,0x3b90d59a,0x3b2bdde6,0x3aeef9f5,0x3a3ff47f,0xba70f305,0xba3a31cb,0xba76ef31,0xba928c29,0xbad78db0,0xbb016ae2,0xbb20a6bb,0xbb02e1e0,0xba87d5ad,0x3a119850,0x3b252e47,0x3b5b9155,0x3b2fb2df,0x3b1d7960,0x3ae3b1b6,0x3aa82359,0x3ad16eb4,0x3af4d667,0x3b1e1df9, +0x3b1373db,0x3b201241,0x3b278622,0x3b524421,0x3b357354,0x3b01d812,0x3aa88897,0x3a8114a1,0x3a934e15,0x3aad8e4e,0x3aece297,0x3b16b16e,0x3a9e654e,0x39811ab7,0xba0cde04,0xbaa4b507,0xbb0245c5,0xbb363ac8,0xbb2baeb2,0xbb29d9d9,0xbb296634,0xbb3ca624,0xbb4a998a,0xbb5e7a7a,0xbb2b8740, +0xbb14ecb8,0xbaecec9e,0xba7a335a,0x3a5469ba,0x3afe256c,0x3b612cd7,0x3b8f3021,0x3bbc0d9a,0x3ba26aa2,0x3b8e8523,0x3b75db5e,0x3b588577,0xbb89741e,0xbb771d9d,0xbb80f6ff,0xbb800456,0xbb6c4708,0xbb5c4a4a,0xbb5a9ceb,0xbb6af83f,0xbb6aa7e2,0xbb721c87,0xbb6bdb8e,0xbb5a30d5,0xbb3f9199, +0xbb25701b,0xbb2b92c1,0xbb2d869d,0xbb33dd4a,0xbb3dc7db,0xbb4934bf,0xbb553059,0xbb5d8d61,0xbb58a83f,0xbb60a90d,0xbb65fcba,0xbb7112fa,0xbb7afe61,0xbb71dbba,0xbb759132,0xbb815b04,0xbb802b28,0xbb7d58ab,0xbb8236b3,0xbb79ebaf,0xbb7eb914,0xbb818750,0xbb699f5d,0xbb4329bf,0xbb33a8de, +0xbb36c8ae,0xbb35e975,0xbb3ddb8b,0xbb4620b9,0xbb487e8a,0xbb486521,0xbb3caeaa,0xbb32d70d,0xbb2d7dbc,0xbb270710,0xbb2512b7,0xbb1f3c68,0xbb279e18,0xbb2ccfe8,0xbb31b103,0xbb38a64b,0xbb3f66af,0xbb465395,0xbb4a68ae,0xbb4c3e0f,0xbb4cd35a,0xbb4c295a,0xbb4f02bf,0xbb525993,0xbb51b3f4, +0xbb519c63,0xbb4a04ed,0xbb491e41,0xbb462777,0xbb412494,0xbb333135,0xbb2df757,0xbb4d535f,0xbb48fdb4,0xbb449f34,0x3a6f0085,0x3a41e99d,0x3a4aca1f,0x3a880406,0x3a9f7e61,0x3acf39ce,0x3a985871,0x3a818d6a,0x3a2e4291,0x3a7aa71b,0x3a8c455e,0x3a93f252,0x3a99e7fd,0x3aa0d836,0x3aab2efb, +0x3ac3b6e2,0x3ac00fcc,0x3ab1b633,0x3a6b27ca,0x3a30daa7,0x39f12fa9,0x3a3703c7,0x3a5582c7,0x3a9220d5,0x3a74f035,0x3a513b49,0x39b44c06,0x39bf9407,0x393960b3,0xb89434ae,0xb9868cc5,0xb8da7d84,0x3a1992ec,0x39bf2da8,0x39fc3b41,0x3a9c6341,0x3a3de13c,0x39f620ac,0x3a69579c,0x3acd57d6, +0x3b136322,0x3b536de5,0x3b203621,0x3afe1c08,0x3a829112,0x3abcda8a,0x3abeb6f8,0x3ab93a9d,0x3ac1f2ae,0x3b04c902,0x3b28cecc,0x3b7106c5,0x3b713694,0x3b467386,0x3ad12908,0x3a30e72a,0x3947ce58,0x3a10a264,0x3a8fafb7,0x3ae3057c,0x3ae14327,0x3aa38c20,0xb93edcee,0xb99bd090,0xba61991c, +0xba9eeb52,0xbb08ab10,0xbafdc3e8,0xb9c89293,0xba7e2fe2,0xb9c5a866,0x3aacf79a,0x39abf194,0x333a8025,0x3a2620c4,0x3b0e85e2,0x3b606922,0x3ba55fcd,0x3b6dc4f3,0x3b2b7413,0x3a26a18f,0x3ad4e3aa,0x3b11358f,0x3b498b91,0x3b45191e,0x3b5bdec7,0x3b70bd1b,0x3ba92aa0,0x3ba4da42,0x3b8305dc, +0x3ac6a703,0x39609de3,0xba403f68,0x383ce685,0x3a880679,0x3af9aeef,0x3ad5b354,0x3aab88d5,0xbad40409,0xbac3df64,0xbb5225bb,0xbb75d847,0xbbb794cf,0xbb9c70bf,0xba869c01,0xbb042e82,0xba8fec76,0x3b0a8608,0xb925c885,0xba595861,0x3a75ad18,0x3b429f87,0x3bba2ba5,0x3c141a27,0x3bed7d14, +0x3bb88397,0x3b15b27a,0x3b212642,0x3b19dacc,0x3b41219e,0x3b121608,0x3b8cbcc1,0x3bd8ea8b,0x3c2ed9a7,0x3c2d664b,0x3c0967fa,0x3b66b053,0x39f5449b,0xba9f85f1,0x3847c3ca,0x3b0c54a3,0x3ba3cc49,0x3b931063,0x3b4a8430,0x39ef25a9,0xba442b31,0xbb35eaea,0xbba80a9b,0xbc01f4e7,0xbbecbc5e, +0xbb2db970,0xbbb869cd,0xbb5df00d,0x3b581cd1,0xba55ba51,0xbb0e2dc5,0xb9941db8,0x3a249e2c,0x3a1f4fe6,0xbb2c336e,0xbb30fcdb,0xbb7eee52,0xbbbead4c,0x3a554a8d,0x3bca84cb,0x3bf69997,0x3c59ca88,0x3c0a54b0,0xbb91a50b,0xbbbe585f,0xbbe085db,0xbbb4bcc7,0xbb1a790c,0xba478f77,0x3a1bf534, +0x3a2a0bf0,0xbaf293c1,0xbb7d0fb9,0xbbbdafab,0xbb7f5e16,0x3b80825b,0xba976f38,0xbb15d16c,0xbadfe114,0xba6c95a6,0x3afa5c94,0x3bda4636,0x3bcb9c21,0x3b86747a,0xb8993e3c,0xbb03b6b7,0x3c3d3776,0x3b3cc6b9,0xbb0535eb,0xbbd786c1,0xbc43a7a1,0xbb0b9253,0x3b74297f,0x3bae882f,0x3b973757, +0xbb20f55e,0xbc4ec63b,0xbc1d0220,0xbb845278,0x3b697375,0x3bee1855,0x3be24208,0x3b8733a6,0x3afd7032,0x3afe72a5,0x3baa450c,0x3b710d59,0x3b4a4207,0x3a70d472,0x3acf761e,0xba0f1819,0xbb228bef,0xbb0bf15e,0xba12ce1f,0xb9d09a56,0x39848143,0xbb04f4b4,0xbbe0f61e,0xbc4fc9d4,0xbc2c7c4e, +0xb9a2a46c,0x3c1c8e43,0xbceb6fcc,0xbccbcb16,0xbb9ed129,0x3b6a2340,0x3b997278,0x3b8d14c8,0xba91f250,0xbc01ee0f,0xbc2a0165,0xbb4ad432,0x3c36fe67,0x3b0d0188,0xbb4b1a13,0xbb8dcb8a,0xbbb10fc5,0xbba38af2,0xbb6b1e28,0xba96ad83,0x39df40fa,0x3aa7c6a0,0x3ac8c447,0x39df4476,0xbadb3ac7, +0xbb1e81f7,0xbaf14566,0xbb0abcac,0x391a0893,0x39e490a9,0x38145bc5,0xba11a5b8,0xba15353f,0x3aac64ac,0xbb88209d,0xbb74c165,0x3b0077b8,0xbcaba182,0x3c651df9,0x3b29c80f,0xb7b53599,0x399ffac3,0x3ba886ed,0xb86796a0,0xbad53269,0xbaaa8219,0xba807bd8,0xbb108809,0xbb5d414f,0xbad71987, +0x3a27991b,0x3a5c9200,0x3b2b3447,0x3b63840f,0x3b8a72e9,0x3b04c61c,0x3a5b3fb5,0x398a513b,0x3a22e931,0x3adbbc94,0x3b3110e9,0x3ad2f80a,0x39a33e03,0xb9f3a150,0xba01400f,0xba126cc7,0x39232ef1,0x383e907b,0x39ffbadd,0x3b6a9e59,0x3b8aff02,0x3b83001b,0x3c01ffd8,0x3c671f99,0xbb4ee40a, +0x392bb890,0x3af6cd19,0x3a183afa,0xbaecded9,0xbae5a9b0,0xba806aba,0x39a119bc,0x3b024ee7,0x3b91aff3,0x3bbe8542,0x3bc69d56,0x3bacaa5f,0x3b8686c2,0x3b295f73,0x39c1a0e7,0xbaff4e3a,0xbb80b944,0xbb9f88f9,0xbba1c435,0xbbb157fa,0xbb9b2573,0xbb878414,0xbab82fa6,0xb9cf8366,0xba811fb0, +0xba8b0d52,0xbac5ee37,0xbafe4937,0xbabd2349,0xb9bfd86c,0x3a67034d,0xba0b4ca8,0xba93f34e,0xbb3a950e,0xbb7ce130,0x39e47213,0xba57726a,0xbb1acfa3,0xba4b86f5,0x3af97e23,0x3ba4e555,0x3bee3424,0x3c12338c,0x3c0a4071,0x3bff788a,0x3bf708b7,0x3bde27a0,0x3bbf2bf1,0x3b7ea166,0x3b3d8930, +0x3ac7a7eb,0xb9c489fc,0xb9b0c686,0xba7996f0,0xbac1c242,0xbb05bf8c,0xbb139d40,0xbb1d8565,0xbac51bbf,0xb9ca9623,0x3a9762cf,0x3b23a31c,0x3b372e93,0x3ae421b3,0x3abd5d37,0x3a65ca40,0x39ee18de,0x3a3a8b71,0x3a4f265c,0x3a968e52,0x3a2131d0,0x3b896a7a,0x3b90825f,0x3ba01746,0x3b8b7eb7, +0x3b54044a,0x3b1b05fc,0x3b0691f0,0x3b0f0918,0x3b187bb6,0x3b2b5686,0x3b3f75c4,0x3acaa779,0x39aecc59,0xba4947fc,0xbab0f20a,0xbb00aeae,0xbb2dce1e,0xbb212fca,0xbb1a834a,0xbb15c23b,0xbb20ba85,0xbb2ad3e9,0xbb3cf7a9,0xbaf5884a,0xbab042a9,0xba2173a5,0x3979179b,0x3b033f95,0x3b51d625, +0x3b905205,0x3ba9ad32,0x3bcef15c,0x3bbdab3f,0x3bb4b5a6,0x3ba9cd83,0x3b9c5ce2,0xbb53dde2,0xbb3816c5,0xbb481736,0xbb47e002,0xbb35f34e,0xbb2dd70b,0xbb368db6,0xbb4e8b31,0xbb533f61,0xbb5bdd39,0xbb55ab6e,0xbb478f46,0xbb2f6f92,0xbb1a338e,0xbb1cc8d7,0xbb1ecbe8,0xbb234a6e,0xbb2cef09, +0xbb38d482,0xbb458100,0xbb54613d,0xbb4ede79,0xbb58a21b,0xbb626a4b,0xbb71f64d,0xbb805de6,0xbb69ec36,0xbb60c198,0xbb5e8482,0xbb4b8e38,0xbb37545d,0xbb2ab80f,0xbb26a6fa,0xbb2fffcc,0xbb367b45,0xbb22ec7c,0xbb2074d7,0xbb0c38e2,0xbb13e8bc,0xbb172543,0xbb228f9d,0xbb2b4b00,0xbb2d5b19, +0xbb2e21eb,0xbb26a70c,0xbb21f348,0xbb21b3ff,0xbb1e58d2,0xbb1ed687,0xbb1c0707,0xbb21e786,0xbb25684b,0xbb28b3c1,0xbb2d66ce,0xbb31e919,0xbb34d3ea,0xbb3cba5e,0xbb41cbb1,0xbb48195e,0xbb41a9c3,0xbb4829e3,0xbb53a2cf,0xbb49acdb,0xbb432165,0xbb35f2f1,0xbb2e527b,0xbb266792,0xbb182e04, +0xbb0f3c4b,0xbb091f68,0xbb2ecfa0,0xbb275d47,0xbb3897a7,0x3a58dfcb,0x3a3f0286,0x3a4aaea4,0x3a7c4ffc,0x3a943f62,0x3ac81a04,0x3a982fe8,0x3a80ddc0,0x3a1ccb8c,0x3a4de99f,0x3a6c244f,0x3a985a2f,0x3a8e9211,0x3a9249a6,0x3a91495e,0x3ab5010a,0x3ab4d44d,0x3aa8ccbd,0x3a5fa9c7,0x3a294dc2, +0x39eb9728,0x3a2df237,0x3a446740,0x3a7b7702,0x3a50f7f4,0x3a307b32,0x395bfd73,0x3987380b,0x38b4b597,0xb8e00bba,0xb98bb228,0xb8f4564c,0x39c94f99,0x39b52ac5,0x39ee2930,0x3a7d38b0,0x3a33c993,0x39ec4fdc,0x3a52fc47,0x3aa853aa,0x3b01eae4,0x3b49b283,0x3b24b134,0x3b0153dd,0x3a6319ea, +0x3a927fd4,0x3a9efc69,0x3adda45a,0x3abfe05c,0x3af5e8dd,0x3b0e36ef,0x3b636f4e,0x3b6c348c,0x3b48a1e9,0x3ae8459e,0x3a777f7d,0x39f941fe,0x3a535203,0x3a9a8cff,0x3aba24e9,0x3ac6a851,0x3a866093,0xba0393a0,0xb9fa5b49,0xba6ccbbd,0xba9d8e9b,0xbafc5d9d,0xbaf7c4a7,0xba6a9100,0xba763224, +0xb9cdd6be,0x3a2b4abe,0x396a5317,0x3970c1a4,0x3a69ad82,0x3b02248a,0x3b525baf,0x3ba2cecd,0x3b7e5325,0x3b3b8508,0x3a1aab13,0x3a804076,0x3ace529d,0x3b646675,0x3b3ed170,0x3b51bd41,0x3b44d61b,0x3b9e7776,0x3b9f9b40,0x3b835591,0x3ad97404,0x39f410cf,0xb9da6db3,0x39885e2c,0x3a87c32f, +0x3a9d1d69,0x3a9fdfc6,0x3a80e991,0xbb117f1a,0xbaf0b94e,0xbb63ea88,0xbb79db78,0xbbb4d95f,0xbb972c37,0xbaed8a18,0xbae4e4d6,0xba721b71,0x3a9bc5ed,0xb83eba60,0xba74da79,0x3a344d2f,0x3b00f23a,0x3b9cfd85,0x3c0ca0b8,0x3bf3a26c,0x3bbbc5cd,0x3b06b542,0x3ad6ef84,0x3af7ed37,0x3b84f42d, +0x3b2b1089,0x3b865a5a,0x3bb5ecf4,0x3c24134e,0x3c2c647a,0x3c112172,0x3b90eb07,0x3ae09278,0x3940dc81,0x3aa57aa9,0x3b2b8167,0x3b8756e1,0x3b7f40d2,0x3b28874d,0xba16af3d,0xbaea22fe,0xbb67e0ad,0xbb9c7133,0xbc0b8572,0xbc01d56e,0xbb83f1dd,0xbbb881ca,0xbb5a06e1,0x3ab8879c,0xba9e05f8, +0x3a2bfc9c,0x3ae377c8,0x3b7ce449,0x3b43c984,0xbb1b8854,0xbad8cffd,0xbb402b8f,0xbbc4c85c,0xb90242d4,0x3b8c4768,0x3ba7ed53,0x3c3fd05a,0x3c05a47d,0xbb8ab372,0xbbb864c0,0xbbf47806,0xbbfbd48a,0xbb9bcf37,0xbb77faed,0xbb50c3dc,0xbb26f0cf,0xbb872517,0xbbaf4e6b,0xbbc2feea,0xbb76fbd7, +0x3b7c96d7,0xbaa3c062,0xbb105c17,0xbab3f569,0xba227a74,0x3b3d5747,0x3c06707c,0x3becb765,0x3b9f8433,0x3a4a185b,0x39e21a38,0x3c14db55,0x3a82457f,0xbb54c290,0xbbe03f04,0xbc38cc6c,0xbba0cb91,0x3a471d03,0x3b925331,0x3ba84de6,0xba68a561,0xbc36fd38,0xbc291af1,0xbbc2f177,0x3a580d53, +0x3be6cbf6,0x3c05c2ad,0x3ba60e54,0x3b5bb3e5,0x3b498416,0x3bbf639b,0x3b6d0195,0x3b3f554c,0x3ac831fe,0x3b04549b,0xb93c8e2c,0xbb36c01a,0xbaf3626f,0xb9262874,0xb95b2fbf,0x399219ed,0xbb1cc17f,0xbbf4d947,0xbc5a67eb,0xbc2416b3,0x3ab44434,0x3c098e2d,0xbccc841f,0xbc9da062,0xbbbe9796, +0x3aba0a50,0x3c05bc8e,0x3bc7f2d2,0x38a33b2e,0xbbdbb9c6,0xbc4760a4,0xbbb40401,0x3c39e6b5,0x3b491e45,0xbb0376bc,0xbb8ff3ae,0xbbb423ef,0xbbb62f0d,0xbb944e07,0xbafe1a7f,0xba1b2005,0xb8bd9b21,0x3a34eec1,0xb9b14e26,0xbb172898,0xbb3a2801,0xbb021f84,0xbad87ee7,0x38c1605c,0x39834711, +0xb8ac77c9,0xb9560936,0xba01950a,0x393b2462,0xbb8f63ae,0xbb73c340,0x3ac8fd4b,0xbc9c36a1,0x3c24f9a3,0xbaebac13,0xba190014,0x3ad5a281,0x3be560f5,0x3b4dc159,0x3a79dd26,0xba91b01a,0xba0233d6,0xbacadcd6,0xbb09474c,0xbae48aa8,0xb866c1a9,0xb90a00c9,0x3b16e013,0x3b78e7e3,0x3b8f0bc3, +0x3b34bfc1,0x3aeb92cb,0x3a886073,0x3abf040d,0x3b13ed38,0x3b46d8ca,0x3ae551f7,0x39592d6c,0xba64e358,0xba08decf,0xb9939e4a,0x39b6bff6,0x392fee9d,0x3a363230,0x3b615952,0x3b45e8a2,0x3b46a3d0,0x3c0ab352,0x3c4af65e,0xbae7cfac,0x3ac60bd2,0x3b659f19,0x3ae2a8ec,0xbad6b665,0xbb124554, +0xbae399d2,0xba311730,0x3a594254,0x3b49e0be,0x3b9e2781,0x3ba8a51b,0x3b98b2fa,0x3b6b74ca,0x3b16b64b,0x394b752b,0xbb0dcff2,0xbb74bb75,0xbb9235cb,0xbb944e3c,0xbba24a64,0xbb865c16,0xbb495ffb,0xba60779f,0xb7a22c4a,0xba5ee9fa,0xba837326,0xbab7c996,0xbad3738a,0xbaa3a4ff,0xba0425b5, +0x3945793a,0xb9118946,0xba485878,0xbb33911d,0xbb5a25b8,0xbad31608,0xbb482ae7,0xbb9005c8,0xbb245fc9,0x3a0b2643,0x3b7f420c,0x3bc8c308,0x3bff0b81,0x3c05ecbc,0x3c08638d,0x3c0c387e,0x3c005cd1,0x3be034b8,0x3b9f7ac5,0x3b7a6d90,0x3b157541,0x3970b70f,0xb8ef8f99,0xba91c9b1,0xbb019db4, +0xbb22ad19,0xbb232901,0xbb126985,0xba7ff5d6,0x393f144b,0x3acf53ff,0x3b0f57a2,0x3b01eef1,0x3a4ea9e8,0x3a1d321c,0x398d2aa7,0xb8b4bfaf,0x3881d64e,0xb873c126,0x3836d791,0xba5eabe6,0x3baff9eb,0x3bb80a63,0x3bc0f73a,0x3bac44d3,0x3b8c3f5b,0x3b5d91c6,0x3b4a7b63,0x3b4f9e1e,0x3b4b1715, +0x3b486c8e,0x3b4917cf,0x3acde314,0x3985d5d7,0xba88615b,0xbabe34ff,0xbafc7e41,0xbb216d46,0xbb12d1bb,0xbb06ca6f,0xbafec76d,0xbb04d710,0xbb0b222d,0xbb1c0025,0xba967050,0xb9d15754,0x3a24f056,0x3ab945ea,0x3b4778ba,0x3b879f63,0x3ba19079,0x3bb14245,0x3bcb059d,0x3bc30904,0x3bc42bd4, +0x3bc0ecd5,0x3bb7127f,0xbb0acb55,0xbacf055d,0xbaef7713,0xbaf3d434,0xbada9d7d,0xbadb79b5,0xbafb9144,0xbb174ef5,0xbb2360a9,0xbb2e758a,0xbb2c7c1a,0xbb273bcf,0xbb185721,0xbb0d541d,0xbb0e10ec,0xbb113d92,0xbb15907d,0xbb200156,0xbb2d6ffc,0xbb3ab1ff,0xbb48ebbc,0xbb446ea9,0xbb4e09eb, +0xbb5a1939,0xbb6c87fd,0xbb7cffe4,0xbb5e496a,0xbb4ccb06,0xbb3e914b,0xbb1e5d11,0xbafa038e,0xbac2d7ec,0xbac042f7,0xbad0c2a8,0xbad9989e,0xbab58467,0xbaf1b50f,0xbac07a8d,0xbada19cc,0xbae66781,0xbaff614d,0xbb074cd5,0xbb091a7e,0xbb0a7758,0xbb0984dd,0xbb0b465b,0xbb10d015,0xbb11bda7, +0xbb156e82,0xbb173591,0xbb1a6475,0xbb1c8c94,0xbb1e6f10,0xbb210583,0xbb2347de,0xbb23ffc7,0xbb2b214c,0xbb314b78,0xbb39ee47,0xbb30d619,0xbb386b51,0xbb4b03dd,0xbb3a0bcc,0xbb2dfc7d,0xbb1ce4c6,0xbb109aa8,0xbb0509dc,0xbae10a6e,0xbad8b5ca,0xbac997a6,0xbb095bb9,0xbb0048ac,0xbb2a6e34, +0x3a37429a,0x3a31e207,0x3a3ec593,0x3a5d7fb6,0x3a825c72,0x3ab78a34,0x3a9033c5,0x3a714889,0x39f12056,0x3a1ad9c8,0x3a3a1ae4,0x3a956b7f,0x3a7cdcd6,0x3a7f59e5,0x3a6b2fbb,0x3aa0fb4a,0x3aa2e2da,0x3a9642b7,0x3a48a962,0x3a18e3ea,0x39d7a482,0x3a1bb142,0x3a2caac5,0x3a4e9b98,0x3a24e5e4, +0x3a0cdc34,0x389e82a0,0x392a822e,0xb648f878,0xb955f8a1,0xb98e6b4a,0xb9000a10,0x3924b1c7,0x39a759d4,0x39d65d85,0x3a3f5db7,0x3a2578af,0x39d0447a,0x3a357c36,0x3a7f6234,0x3ada62ab,0x3b387244,0x3b21fba9,0x3af89065,0x3a1d4b7b,0x3a4a13a7,0x3a7d201c,0x3af8148f,0x3ab7c0fc,0x3adbd30f, +0x3ae7f07c,0x3b50d253,0x3b601586,0x3b4046f9,0x3af43ac0,0x3a96829a,0x3a3d5a10,0x3a80737c,0x3a96ca25,0x3a8b684e,0x3aa2d361,0x3a4632df,0xba5a44ee,0xba1c8e28,0xba64b543,0xbaa36b1a,0xbadc6266,0xbae5fcca,0xbab8010c,0xba6697dc,0xb9cc0ef5,0xb72d380a,0x38914560,0x39cb45c1,0x3a960ce4, +0x3ae382ec,0x3b3d6f45,0x3b991c80,0x3b820b19,0x3b421e79,0x39af736d,0x39d95c40,0x3a83d429,0x3b767315,0x3b33e47c,0x3b426222,0x3b1e7ed9,0x3b91b6cf,0x3b96b15e,0x3b777fd7,0x3ae24158,0x3a30b662,0xb898a542,0x39d26406,0x3a70edc7,0x3a0024bf,0x3a48318e,0x3a296c66,0xbb3570e4,0xbb073a8f, +0xbb6ef300,0xbb870557,0xbbae568a,0xbb8db490,0xbb2db41c,0xbababc1a,0xba33baa9,0x399a2ba8,0x38035f5c,0xba8b0d03,0x39f853a8,0x3a82f914,0x3b79b608,0x3bffd6e7,0x3bf12e2e,0x3bb553db,0x3aba4b33,0x3a5eeea8,0x3ac91e94,0x3ba3f292,0x3b3e7f84,0x3b780ec3,0x3b96563d,0x3c171bf8,0x3c270f30, +0x3c10c871,0x3ba6d793,0x3b369893,0x3abebb9a,0x3b11c81f,0x3b3b4294,0x3b458468,0x3b4ea913,0x3b0444e4,0xbae202b8,0xbb281ae2,0xbb81c49f,0xbb92decf,0xbc0c5c6a,0xbc0501da,0xbbb0a3c0,0xbbad978b,0xbb48bba6,0xba0ce7e6,0xbad0e6a3,0x3b59dbfa,0x3b76cd89,0x3bda800a,0x3ba4d86b,0xbaf99ae3, +0xba2248f5,0xbaec8ef9,0xbbadaf6f,0xba55b82f,0x3b181fdd,0x3b3729dc,0x3c1aa0cf,0x3bebdf99,0xbb7647fd,0xbbb39f9b,0xbc01ba0a,0xbc1b895f,0xbbe04510,0xbbceaedd,0xbbce34e3,0xbbae8105,0xbbc3a2c9,0xbbd48990,0xbbb7f18e,0xbb55b6a0,0x3b696e85,0xba881d71,0xbad67dd9,0xba2f54a1,0x37fe923f, +0x3b79bbdd,0x3c1404d5,0x3c024078,0x3bb7faa1,0x3afbe6b4,0x3b35a377,0x3bcb2fc7,0xba33197d,0xbb8546e9,0xbbdded84,0xbc2760ed,0xbbe77771,0xbaeeb85e,0x3b676177,0x3bb0ad91,0x3a3b5d33,0xbc17f960,0xbc2cfb08,0xbbf24567,0xbab8f3d6,0x3bc9d00d,0x3c0d784d,0x3bbff35b,0x3b9cd7b5,0x3b8a909b, +0x3bc95b2a,0x3b617ab3,0x3b285dda,0x3af741ff,0x3b0fb9ce,0x38832f13,0xbb3acead,0xbad5ce3a,0x3851307b,0xb90d90e7,0x38ba534a,0xbb30711f,0xbbf78d61,0xbc58f6db,0xbc17928a,0x3b358fc1,0x3bda844e,0xbca1eee3,0xbc625c07,0xbbecee4d,0xba64bb58,0x3c33dc38,0x3bebfc50,0x3ab2f24c,0xbb8d9ea0, +0xbc4b99b2,0xbbebd465,0x3c268e39,0x3b80de4d,0xba16724f,0xbb91e4be,0xbbae2470,0xbbbc8b37,0xbbaa9da1,0xbb2d6565,0xbad46fd3,0xbad43279,0xb9af44d7,0xba8f8107,0xbb311585,0xbb4c27cd,0xbb04c869,0xba92139c,0x39436a11,0x395741a3,0xb91e822f,0x38ae6465,0xb9d6dc3e,0xba96e54f,0xbb664969, +0xbb41a7f7,0xb9de3ab0,0xbc82b72d,0x3bbba0b8,0xbb53d35d,0x3a8a7004,0x3b7bc611,0x3c012396,0x3bcd6d4b,0x3b7b4aae,0xba00253b,0xb947cd74,0xbaa93d39,0xba9e0a3c,0xbaf2ec91,0xba1e44c5,0xba543f3c,0x3b078120,0x3b7d5c7f,0x3b880a1d,0x3b577c77,0x3b2cdc62,0x3ae51da8,0x3b0aecb0,0x3b2adde2, +0x3b4f6a97,0x3ae5e50b,0x38ee0d77,0xba89d732,0xba0bb774,0xb7d45a60,0x39bb65c8,0x392ff866,0x3a448f93,0x3b33ddb3,0x3abc5602,0x3ae087a5,0x3bf993d0,0x3c13785e,0xb9c4210c,0x3b1afe9f,0x3b8a69ef,0x3b1acaa6,0xbace3177,0xbb36360f,0xbb2fe621,0xbaf0d080,0xba047a53,0x3ac30bba,0x3b682b96, +0x3b7ecdf5,0x3b779d1a,0x3b4b73fc,0x3afd858e,0x38442785,0xbb0ba0d5,0xbb56aa25,0xbb7ce01f,0xbb856670,0xbb8c5cf9,0xbb55bdac,0xbaf81e58,0xb9b0e66b,0x39883364,0xba256504,0xba6968b1,0xba93ff02,0xba83157c,0xba610192,0xba012be4,0xb9e8e733,0x39113c2a,0xb9b918e4,0xbb06d011,0xbb1b9a4a, +0xbb5542f5,0xbb9ce460,0xbbb88c98,0xbb77e5b3,0xba6ba36c,0x3b0d5b1a,0x3b8863c5,0x3bbe5fcf,0x3bea89c0,0x3c054570,0x3c11af40,0x3c085382,0x3bf0dec0,0x3bb27bac,0x3b8f25cb,0x3b34386f,0x3a302fc0,0xb9232b54,0xbab9ecba,0xbb20ad8d,0xbb3ad735,0xbb2b5453,0xbafebe13,0xb9f0a3af,0x3a2718ac, +0x3ae9abf8,0x3ad9028a,0x3a8ada8b,0xb83c1d32,0xb8a6a95c,0xb914a1aa,0xb9db2690,0xb9cb6b6f,0xba3fe5bd,0xba76fc4e,0xbb08fd73,0x3bbb7b8f,0x3bc04734,0x3bc11832,0x3bb226c1,0x3b9ae503,0x3b83cac2,0x3b7c5620,0x3b80df04,0x3b6a909f,0x3b5048ce,0x3b3c3a79,0x3ab411bb,0x389c4459,0xbaa863ef, +0xbac754ad,0xbaf48a69,0xbb1341a7,0xbb0196d9,0xbae1e24f,0xbace4b73,0xbad1d4fa,0xbadb22d5,0xbafcba00,0xba0b87a1,0x39e63474,0x3ae924ad,0x3b205dcf,0x3b79b0ff,0x3b9aa5df,0x3ba35d60,0x3ba684c0,0x3bb146b5,0x3bb19849,0x3bbb2ef3,0x3bbdce90,0x3bb7897c,0xba4ab9c4,0xb8b3f1ea,0xb9aeb988, +0xb9ed00ae,0xb9e246ea,0xba1e9222,0xba7bad24,0xbab0494f,0xbad9fd77,0xbaf78255,0xbb00e8bb,0xbb076599,0xbb05e295,0xbb08f64f,0xbb0857c8,0xbb0c14e3,0xbb104aa3,0xbb1b7235,0xbb29a386,0xbb36fde1,0xbb3fd7c9,0xbb38d9e3,0xbb3dee9e,0xbb46c5a5,0xbb584fe7,0xbb654635,0xbb452003,0xbb2f40f2, +0xbb194209,0xbae1af30,0xba8bd162,0xba12b383,0xb9fcc6d9,0xba116c50,0xba0a9181,0xb958e2d0,0xbaa34bbb,0xba5d0565,0xba92d5a4,0xbaa3b2db,0xbabc1bda,0xbac9527e,0xbaced074,0xbad5252a,0xbae0554d,0xbaf08258,0xbb03421e,0xbb08bcb8,0xbb0faeae,0xbb16a417,0xbb16eaa2,0xbb180c92,0xbb189481, +0xbb192e14,0xbb192626,0xbb18a420,0xbb1beb21,0xbb1fdf29,0xbb2731dc,0xbb1d2d2a,0xbb2204eb,0xbb375d6d,0xbb236e45,0xbb145e35,0xbb0276f8,0xbae896f5,0xbacf58a4,0xbaa00ece,0xba98bbcc,0xba86abb2,0xbac45c57,0xbab04b3b,0xbb203628,0x3a1e27e8,0x3a22785f,0x3a3b973f,0x3a44886d,0x3a666042, +0x3aa5b538,0x3a8948ce,0x3a64c5fd,0x39b4ce41,0x39ed6cdb,0x3a1781d0,0x3a9555f6,0x3a66a7d4,0x3a655f77,0x3a43decb,0x3a91ab84,0x3a94a120,0x3a863609,0x3a3a1281,0x3a10669b,0x39da6af9,0x3a08ebad,0x3a0df66a,0x3a1504a7,0x39fb8d9f,0x39ca3bd1,0xb8e03cda,0x378d2477,0xb91a54f1,0xb9cf5d43, +0xb9ae5d77,0xb94014ec,0xb9034fa2,0x399296dd,0x39cedefc,0x39f1aedb,0x3a0f1579,0x3991ff09,0x3a264c6a,0x3a3e28da,0x3ab579a6,0x3b24516e,0x3b1d51d4,0x3aee7c3d,0x39c1668a,0x3a08aafc,0x3a54c8ea,0x3b094056,0x3ab126a7,0x3ac2b045,0x3abd6d1b,0x3b3ea6b4,0x3b52f7b8,0x3b35b876,0x3aff0a59, +0x3aafd3d2,0x3a7c88d0,0x3a8809db,0x3a89a8b8,0x3a443c14,0x3a712c92,0x39ef00f8,0xba8d283a,0xba1bff15,0xba3ed242,0xbaa902c9,0xbaadbddb,0xbac23695,0xbaeafff1,0xba48dcec,0xb9bc4f5f,0xba1234a1,0xb8a0e353,0x39f31fb8,0x3ab78c68,0x3ac57578,0x3b27c263,0x3b8ae9b4,0x3b81ccdd,0x3b45cf46, +0x38c130ac,0x3874c5d9,0x3a277c77,0x3b83afa0,0x3b2a6850,0x3b339c01,0x3b02a66d,0x3b86ab9a,0x3b8e0c51,0x3b64ed00,0x3aee3c25,0x3a6ef495,0x399a598e,0x39f3e320,0x3a3a6a10,0xb8cc6b1f,0x3995a11d,0x3991d956,0xbb51e85a,0xbb121f0b,0xbb7185a2,0xbb980be4,0xbba4d798,0xbb82dec9,0xbb61fe0e, +0xba8ea435,0xb9d9baf2,0xb9ed2c15,0x38809955,0xbaa1a17a,0x39b052df,0x39669d98,0x3b3d405d,0x3bdfb4fc,0x3be904a0,0x3bacac0d,0x3a5185b9,0x39983891,0x3ab7e31e,0x3bbff84e,0x3b4bf6c6,0x3b598d59,0x3b7362cb,0x3c09810e,0x3c1f8aa9,0x3c0c226f,0x3bb7fefc,0x3b721178,0x3b25faa2,0x3b38c439, +0x3b3ae335,0x3af123c6,0x3b1425ae,0x3ab35953,0xbb360d69,0xbb409245,0xbb81c0a5,0xbb8b39b4,0xbc039421,0xbbfcc485,0xbbd65d18,0xbb9b0990,0xbb2f7c66,0xbb14abec,0xbafe8e51,0x3bb37518,0x3bb92a87,0x3c10fee2,0x3bda52c5,0xba82f754,0x39cc2d76,0xba346ef2,0xbb7d6249,0xba99df1e,0x3a1fb9ff, +0x3a586093,0x3be695b3,0x3bc78b5d,0xbb2bb046,0xbba77280,0xbc04081f,0xbc2e3aea,0xbc09e5c9,0xbc04cbc0,0xbc092591,0xbbf355d4,0xbbee0de4,0xbbec6f05,0xbb9da184,0xbb1b6cb6,0x3b483b0e,0xba216543,0xba559dcd,0x395900e2,0x3a56140a,0x3b92f54f,0x3c1325c2,0x3c074983,0x3bcc7928,0x3b4e9d1c, +0x3b99b5d2,0x3b5ad4a1,0xbaf91106,0xbb8e8efd,0xbbd15e86,0xbc13801c,0xbc09c222,0xbb6d67ce,0x3b392f3f,0x3bb520ef,0x3b12467c,0xbbea66fe,0xbc29fe93,0xbc09f92f,0xbb479fb9,0x3b9aab9b,0x3c075d97,0x3bd23973,0x3bc695b4,0x3bacd745,0x3bc715dc,0x3b4d70f7,0x3b0b1d3c,0x3b017d15,0x3b0a2233, +0x3925c455,0xbb324fd7,0xbab1e969,0x39356d19,0xb98617e5,0xb94d4886,0xbb393831,0xbbe87872,0xbc49ca4d,0xbc057e4a,0x3b73d47f,0x3b9c0dbe,0xbc6d6da8,0xbc139d84,0xbc0afe2e,0xbb2da38c,0x3c57b8a3,0x3c010e6d,0x3b301fd5,0xbaca6591,0xbc3f602d,0xbc075798,0x3c062566,0x3ba052df,0x3aa82602, +0xbb88fd10,0xbb9bf0fc,0xbbb3b215,0xbbb2a18b,0xbb505cfd,0xbb20a8f6,0xbb3ce87c,0xbaa6f841,0xbadbe50b,0xbb3ee71e,0xbb4eb2f5,0xbaf66df3,0xba152673,0x39cd9c4d,0x38e9b8f5,0xb8ce3380,0x39a692fa,0xb8e9cf17,0xbb0e317c,0xbafd8fd7,0xbae5c4bf,0xbb5ba78b,0xbc4e611f,0x3ac6c58b,0xbaca9528, +0x3b835006,0x3bc4600f,0x3bf3e62f,0x3c0d26ff,0x3bd84f1a,0x3a81c37e,0x3957376e,0xbaa3a8c3,0xba226ddc,0xbaff276a,0xba7fccab,0xba8b86ff,0x3af45916,0x3b6bf032,0x3b736403,0x3b6d4a84,0x3b5a2fc7,0x3b1d4c93,0x3b2a7fba,0x3b3815bc,0x3b4fefa3,0x3ad7760a,0x388b4257,0xba84da4e,0xb9e3c00d, +0x38f722d1,0x3916318d,0xb7aa9d78,0x3a222d01,0x3ae1d420,0x38549847,0x39a48f05,0x3baeb4be,0x3b8bc87f,0x3a7da3f9,0x3b39fda2,0x3b90bbec,0x3b3dfcaf,0xbaaa381d,0xbb47bdaa,0xbb69410d,0xbb4357b8,0xbaefd9a7,0xb8fa626b,0x3b088038,0x3b261d46,0x3b3840d2,0x3b2e8d96,0x3acacb4d,0xb6dfc3ce, +0xbaeb69c0,0xbb2cb2ef,0xbb4c2f2f,0xbb63d35b,0xbb5f7c79,0xbb133821,0xba41170f,0x3904887e,0x39ebd2df,0xb9d3aa4d,0xba3ba702,0xba36541f,0xb9ac7775,0xb9c24b9a,0xb9bf67c2,0xba66942c,0x3951d0a5,0x37775158,0xba661f8a,0xba7a6963,0xbb8f02ed,0xbbbb9613,0xbbbf77ef,0xbb907076,0xbb112957, +0x3934f471,0x3af33266,0x3b640028,0x3bb9755e,0x3bf03af6,0x3c0c2408,0x3c068167,0x3bf138d6,0x3bb8f9ef,0x3b950c0d,0x3b3f7c8c,0x3a60d2e2,0xb9c0c6fc,0xbae11bf8,0xbb354683,0xbb491c53,0xbb291577,0xbacd680b,0x36e15b69,0x3a7a0215,0x3ae0d21f,0x3a8587c4,0x3953ce58,0xba21c378,0xba0dfa7e, +0xb9cced72,0xba26500d,0xba3c733d,0xbaa66d3f,0xbae9b48b,0xbb44bb6d,0x3ba9fd3a,0x3ba86dff,0x3ba1afac,0x3b9b89a5,0x3b904d29,0x3b8645f1,0x3b87a8ee,0x3b8d1b43,0x3b76a81d,0x3b4d62bd,0x3b2d5a72,0x3a9d45e3,0xb8075fcc,0xbab4efd3,0xbac4ebf9,0xbae6131b,0xbb0413ca,0xbadf1012,0xbab8d4d1, +0xbaa33756,0xba9d2496,0xbaa3b67b,0xbac08ab0,0xb7cef671,0x3a9178b7,0x3b31b060,0x3b50e97a,0x3b88e058,0x3b9e1489,0x3b95881e,0x3b8b1ec2,0x3b85b5db,0x3b8d548a,0x3b9ca378,0x3ba2ff18,0x3b9f1b22,0x3a3578a3,0x3ac02c83,0x3a9dd706,0x3a801918,0x3a4eb5bb,0x39edfd17,0x3745e379,0xb9b76a55, +0xba536659,0xba91ba99,0xbaad09a5,0xbad0e56e,0xbae88da1,0xbb05ca96,0xbb0376f3,0xbb06ef64,0xbb0aae6b,0xbb15f453,0xbb2359df,0xbb301c1a,0xbb349e42,0xbb24edb1,0xbb21cf0a,0xbb239f50,0xbb30f4f4,0xbb34bb07,0xbb1659d3,0xbafab751,0xbac5cf2e,0xba56531a,0xb885623e,0x39e1d480,0x3a186e11, +0x3a0b315f,0x3a2ef969,0x3a88687a,0xba34d317,0xb9985ead,0xba23c7c7,0xba49c5fc,0xba750504,0xba86bb85,0xba8fcad4,0xba9aa134,0xbab05f49,0xbaca3a88,0xbae8e9ec,0xbafbd730,0xbb07b85c,0xbb1373b1,0xbb113b4c,0xbb11bd0a,0xbb112380,0xbb102549,0xbb0e77b8,0xbb0c7d69,0xbb0dc3cf,0xbb0fbc55, +0xbb176945,0xbb04be10,0xbb07a0b7,0xbb1e9910,0xbb0ac1a7,0xbaf59fec,0xbad41c56,0xbab83f60,0xbaa06a41,0xba5f23da,0xba3c3209,0xba09b3dd,0xba7fa5ea,0xba4d8014,0xbb12bd56,0x39ff1c08,0x3a0b252b,0x3a2cf183,0x3a25fde2,0x3a4135ce,0x3a8cd2b1,0x3a77dea0,0x3a4c4fd7,0x39572624,0x39a0fc54, +0x39e60e94,0x3a90b851,0x3a48ad95,0x3a44a18d,0x3a1ccdef,0x3a7e64e2,0x3a830380,0x3a688beb,0x3a25da75,0x3a026e51,0x39ce7914,0x39e1e855,0x39e05700,0x39dfe0f2,0x39a50d6b,0x39780167,0xb96cc521,0xb892d48c,0xb9727552,0xba11562d,0xb9b45d60,0xb952c2b9,0xb9b774cb,0x39791c77,0x39ba6af8, +0x3991cae8,0x39efd58c,0x39180b1f,0x3a0fe16f,0x3a00b654,0x3a8ee9db,0x3b0a34ec,0x3b11ccff,0x3adaa68b,0x3907a46b,0x39914feb,0x3a29f254,0x3b110533,0x3a9e3318,0x3a9d629e,0x3a92762b,0x3b279caa,0x3b405041,0x3b27aea4,0x3affc932,0x3abdcd19,0x3a92fdfd,0x3a85f188,0x3a650b07,0x39ff5539, +0x3a10cc7c,0x390ac867,0xbaa1daf2,0xba0ed2c9,0xba137115,0xbaae19db,0xba7cb59e,0xba988cd9,0xbb056f31,0xba25e2b7,0xb9a24d5a,0xba779d13,0xb9814510,0x39e5d401,0x3acb570b,0x3aa680b3,0x3b105f60,0x3b6e4e68,0x3b777d8b,0x3b3f253c,0xb9424b36,0xb9831659,0x39a61d14,0x3b887f7b,0x3b198543, +0x3b1d9a64,0x3ad3f695,0x3b73e13c,0x3b8311ee,0x3b50ced8,0x3af4ebc8,0x3a8eb612,0x3a239ac2,0x39eca66c,0x39e15690,0xba008c53,0xb966e9c4,0xb90e9bce,0xbb65b318,0xbb1843c0,0xbb6c22dc,0xbbab011c,0xbb98099b,0xbb6e1b97,0xbb87eefd,0xba4f2b72,0xb934a666,0xba82bb3f,0x37a02cee,0xbabfa02a, +0x394ed708,0xb9be3c98,0x3b043b3d,0x3bb7aa58,0x3bd802c5,0x3b9f633e,0x394f5b9d,0xb9721410,0x3aa4a894,0x3bd3a699,0x3b4600a1,0x3b2605bf,0x3b36dcfb,0x3bf1b005,0x3c141794,0x3c043e21,0x3bc18ab8,0x3b8da8e5,0x3b5be027,0x3b47180d,0x3b29a108,0x3a4aec86,0x3aa177a7,0x3a20b1f0,0xbb66ea6a, +0xbb3d3c29,0xbb687f3b,0xbb7f09fd,0xbbe523a6,0xbbdea1b8,0xbbed5669,0xbb83f26c,0xbb12d372,0xbb6c71b0,0xbb1523b0,0x3be41b6c,0x3be9e640,0x3c2797ae,0x3c002205,0x399bf4e8,0x3a940e2f,0x38147030,0xbb13a27b,0xbab3a406,0xba5385eb,0xba488095,0x3b9dc49f,0x3ba8ab40,0xba461faf,0xbb914554, +0xbc012198,0xbc3529c2,0xbc1ad6b4,0xbc177cdd,0xbc1b0698,0xbc0ebd63,0xbc027cd7,0xbbf634f3,0xbb6a6c03,0xba9e4b95,0x3b1cba85,0xb8e41f18,0x37d5acf7,0x3a79e6f2,0x3abfcd77,0x3b9a6548,0x3c05008c,0x3c036b91,0x3bdb4dde,0x3b8cc7f0,0x3bc68899,0x3a59d733,0xbb2c7212,0xbb8d3e7f,0xbbc315bb, +0xbc02372d,0xbc169181,0xbb9c860a,0x3b1c812c,0x3bb3da64,0x3b647d53,0xbba2b508,0xbc23f7a3,0xbc180399,0xbb8b18c9,0x3b3d2747,0x3be91fe6,0x3bd78ba7,0x3be11d3a,0x3bc2c3b3,0x3bb96bf6,0x3b301a1e,0x3ad34719,0x3af0b994,0x3aec2b1e,0x38a91bb9,0xbb1e84b5,0xba77196b,0x38e83799,0xba044df8, +0xb9eba963,0xbb2e433e,0xbbcb1cc4,0xbc2f9247,0xbbdccf2a,0x3b8a3dce,0x3b3b2625,0xbc2644ea,0xbba458d5,0xbc13f037,0xbb66628b,0x3c6cf694,0x3c04ff62,0x3b6d49f5,0x3a323ed0,0xbc2de4a3,0xbc11df94,0x3bb820e3,0x3bba464d,0x3b53f148,0xbb6c550d,0xbb842693,0xbba2ba6d,0xbbae47d9,0xbb6a626e, +0xbb48525e,0xbb6eddd8,0xbafcb559,0xbb0430f7,0xbb413edb,0xbb40c05b,0xbacc224f,0xb826bc26,0x39f1730f,0x3851a837,0x38d8d9c4,0x39ef0ac0,0x39eafe52,0xbb2450e3,0xb99f7cc2,0xba19d946,0xbbcd4ec9,0xbc1f9ce3,0xbb08ae98,0x3b25b4e1,0x3bd5dfd1,0x3bd59c8d,0x3ba14818,0x3c163035,0x3c0cd7de, +0x3b558185,0x3a5139c5,0xbaacb36e,0xb9d63e71,0xbb0dcfe3,0xbab3a915,0xba923b3e,0x3abfb946,0x3b3be305,0x3b4725f6,0x3b6e903c,0x3b75ac4f,0x3b421fbb,0x3b422203,0x3b3f809c,0x3b4bcb34,0x3aba0123,0x381e2068,0xba5226fe,0xb986e572,0x388d373a,0xb8411a71,0xb999b08d,0x39a7ea83,0x3a37224d, +0xba410bd2,0xba7018f2,0x3ae19b1a,0xbaa13bb7,0x3b1944bc,0x3b435114,0x3b87a7fe,0x3b5a0497,0xba5643d9,0xbb423c66,0xbb8d730d,0xbb884647,0xbb4f2e01,0xbade66c9,0x39f9046d,0x3a95fa29,0x3ae543a6,0x3b091015,0x3a92eb01,0x37cc8700,0xba9d3ed4,0xbafa61eb,0xbb195034,0xbb326bff,0xbb1a1f85, +0xba93b7ec,0x39b28ab7,0x3a1337e8,0x3a152b84,0xb9607435,0xb9ec03b2,0xb96e222c,0x39181db8,0x38014fe3,0xb90f2faf,0xba8a7067,0x3831d02d,0x39a9ebbc,0x3a209c6c,0x3a66cf7b,0xbb9e6b28,0xbbbfb3d6,0xbbac5004,0xbb937d74,0xbb579256,0xbaea46ab,0xb9d93666,0x3a9d1c1b,0x3b818f03,0x3bc6376d, +0x3bf5df77,0x3bf33125,0x3bdf2968,0x3bb20551,0x3b8ecc8f,0x3b341e5c,0x3a30eea5,0xba4214e7,0xbb019889,0xbb3bc674,0xbb49c782,0xbb1da578,0xba996d96,0x39c13279,0x3a91b29a,0x3ab79ac2,0x39bc5536,0xb9f04ce8,0xba6ebea5,0xba4b63d9,0xba150be7,0xba635c49,0xba8375bb,0xbadeda10,0xbb2023be, +0xbb6c1209,0x3b80fe87,0x3b6d870b,0x3b5349bc,0x3b58d2e2,0x3b579719,0x3b64876f,0x3b7875c9,0x3b8674c0,0x3b69089e,0x3b3f4db8,0x3b20e7b9,0x3a944208,0x36c591df,0xbaa496d6,0xbab0ced7,0xbacac0e2,0xbae34dae,0xbaba33f5,0xba9a2ef7,0xba8a4578,0xba5ab0e3,0xba5185ee,0xba6a3852,0x39e7d97d, +0x3ad787d0,0x3b5d7781,0x3b6bf45d,0x3b8756df,0x3b92b26d,0x3b78a851,0x3b4f04f3,0x3b2841e3,0x3b40d61a,0x3b62ee8e,0x3b72c29a,0x3b6a3018,0x3b072311,0x3b314817,0x3b1f55ae,0x3b0a3c4f,0x3ae3b2d1,0x3aaad0bf,0x3a57e347,0x3a03d565,0xb8738a07,0xb9ea2a18,0xba4a011d,0xba999da0,0xbac47cc3, +0xbafd5675,0xbaf55fc9,0xbafb3b22,0xbb00b9be,0xbb0b9698,0xbb16790f,0xbb228c59,0xbb211fcc,0xbb081dc6,0xbaf5d586,0xbae5ade9,0xbaf1fc79,0xbae1d227,0xbaabe92e,0xba68d924,0xb9e7fe9b,0x397c8cf6,0x3a826e4b,0x3abed089,0x3ad35aed,0x3acda888,0x3ae8df3d,0x3b0aeec6,0xb968543a,0x38d8b629, +0xb96804ff,0xb9be24dc,0xba0055fb,0xba19762a,0xba3310ed,0xba4f71fd,0xba8369ac,0xbaa1cf6a,0xbac4ee44,0xbadcaeca,0xbaf3d180,0xbb08c5fc,0xbb051974,0xbb057617,0xbb043f7c,0xbb025ca9,0xbaffbfe8,0xbafa4809,0xbaf98906,0xbaf78691,0xbb02dc2a,0xbacdebcc,0xbacdc939,0xbaf69f32,0xbad394ff, +0xbab5f736,0xba9a0436,0xba7fa40b,0xba542e54,0xb9f13bb9,0xb994dbd1,0xb8a702d2,0xb9eee7f1,0xb9901a32,0xbafe02c2,0x39cce214,0x39ea94f5,0x3a2066ae,0x3a0c7bed,0x3a22656a,0x3a6a712f,0x3a5f2db6,0x3a360a0d,0x38c998d1,0x394a229c,0x39ab7a0d,0x3a8c5081,0x3a2aae97,0x3a252fe3,0x3a009ef1, +0x3a5d30a2,0x3a66837f,0x3a4e6949,0x3a15143a,0x39ec3fe9,0x39c58572,0x39b6304a,0x39a7aed7,0x39a12534,0x3933effe,0x38b53f93,0xb9aed09e,0xb9263be9,0xb9a5748e,0xba38f3f1,0xb9be07c2,0xb970578b,0xba10a3a0,0x3948f268,0x39ad5276,0x3900c194,0x39c04217,0xb19d2d7a,0x3a00df6f,0x39a6d2ce, +0x3a5cb6f1,0x3ae075f5,0x3b0568b8,0x3ac8d468,0xb8126c47,0x38b279ba,0x3a044696,0x3b154474,0x3a820176,0x3a5ff12c,0x3a57875b,0x3b0e6ea1,0x3b2b4fa0,0x3b1b19fe,0x3afaa6dc,0x3ac2bd39,0x3a9f28f9,0x3a743479,0x3a2e75d6,0x39a5d174,0x3935f483,0xb93322fc,0xbaa47a07,0xb9f2b475,0xb9c733a4, +0xbaab965d,0xba1c0e34,0xba547229,0xbb08f83b,0xb9f272ac,0xb98068dc,0xba97531b,0xb9c3978d,0x39c09375,0x3ad7d5a6,0x3a8ffa4a,0x3afa05b1,0x3b462b0e,0x3b695c44,0x3b36aafe,0xb9c3256c,0xb9f71770,0x386b87f8,0x3b8b1020,0x3b01f376,0x3b02451e,0x3aad2260,0x3b59bb28,0x3b6f14e7,0x3b42b969, +0x3af8d83f,0x3a9d3328,0x3a6aa389,0x39c9fcbf,0x38fa18b5,0xba286122,0xba398808,0xba1e7383,0xbb6d08ef,0xbb1b463b,0xbb60a3e2,0xbbbb507a,0xbb88ca7b,0xbb55b783,0xbb98ab42,0xba0e1506,0x38519878,0xbaad585e,0xb84260db,0xbad8860a,0x38fb5962,0xba3a597b,0x3aa6852a,0x3b8dec85,0x3bc51b03, +0x3b945c40,0xb948a75d,0xba2cb221,0x3a8e8ed3,0x3bdf73e8,0x3b2c201c,0x3abf9bb6,0x3aeee212,0x3bcb7e4b,0x3c05f804,0x3bf80f91,0x3bc49f9e,0x3b9892fe,0x3b7fb6a5,0x3b405a98,0x3b0ad4f6,0xb875ddf8,0x3907ce29,0xb95544a8,0xbb7972f0,0xbb232795,0xbb37bc87,0xbb564132,0xbbb6b67e,0xbbb3e351, +0xbbefd78c,0xbb555ca2,0xbaec4556,0xbb930595,0xbb24d8d4,0x3bfdb7cb,0x3c068a1c,0x3c3448c1,0x3c0f6fb1,0x3b08d147,0x3adb8f60,0x39c7d668,0xba2ad364,0xbaaedb10,0xbae34131,0xbaf6adf8,0x3b505f4b,0x3b9ba5e8,0x3ae4bad0,0xbb57f046,0xbbeecb4c,0xbc305f83,0xbc22f62b,0xbc208c00,0xbc1f3957, +0xbc1687df,0xbc03d1eb,0xbbf10819,0xbb064693,0x37d5488e,0x3ad9ac16,0x39c3dab7,0x3a1e0007,0x3aa9ce60,0x3ae16773,0x3b8ef42c,0x3bd910e2,0x3beff643,0x3be28672,0x3bae3449,0x3be0e8bc,0xba91e215,0xbb3c3b3e,0xbb825e19,0xbbb42812,0xbbe67859,0xbc1a9401,0xbbb03350,0x3b17d4d4,0x3bacbd32, +0x3b902810,0xbb341d19,0xbc18d2d7,0xbc2111de,0xbba6ade6,0x3a81a8e3,0x3bb5af76,0x3bd42cab,0x3beb9676,0x3bca259a,0x3ba3aa9e,0x3b08bd24,0x3a89c498,0x3acae045,0x3ab323a8,0xb8f152b1,0xbb01e569,0xba02f097,0xb915778d,0xba303675,0xba182348,0xbb08b9b2,0xbba4a1fb,0xbc0f1a6e,0xbbacc8c7, +0x3b8c13db,0x3a9ce9d4,0xbbe1c016,0xbaae4256,0xbc05ad2e,0xbb47d5c6,0x3c789d6e,0x3c0adbc4,0x3b9762c4,0x3b323dae,0xbc1863cb,0xbc15a393,0x3b400b06,0x3bd105bf,0x3bac555b,0xbb2260b6,0xbb4a188b,0xbb8b8f18,0xbb9def84,0xbb752337,0xbb583bc9,0xbb771ad2,0xbb0aeb91,0xbb04d627,0xbb381939, +0xbb2114ea,0xba8ef815,0x39bbf04a,0x39c32f00,0x388e6ac7,0x39b0d946,0x39a8297e,0x3a8ba8ba,0xbb072cf6,0x3a612c0a,0x39b12f5e,0xbc076bb3,0xbbf4474b,0xbb9bc5d5,0x3c008e32,0x3bfde9bd,0x3ba9a00b,0x3a9627e6,0x3bfad223,0x3c187da3,0x3bcbcd0d,0x3aeeacc0,0xba8fa410,0xb9d276ed,0xbb13a57f, +0xbad253c9,0xba7fa694,0x3a7687f5,0x3afa0e53,0x3b1879e4,0x3b62613c,0x3b81663a,0x3b60da4b,0x3b51c101,0x3b442a4c,0x3b40ed39,0x3a8e7625,0xb78e97fd,0xba08db5b,0xb9070d52,0xb8e289ab,0xb93bef30,0xb9dfbbd7,0x381d8b79,0xb8d1ac6e,0xba64d9d0,0xbae513e7,0xbb3419f2,0xbbd9e72b,0x3b810b8d, +0x3b595361,0x3b8166fe,0x3b7afcfe,0x388d837e,0xbb1789b2,0xbb967a26,0xbba4787d,0xbb8acd3f,0xbb40811e,0xba626eb5,0xb78b5370,0x3a526c1c,0x3acc4a84,0x3a629680,0x397c68d6,0xb9e0b7dd,0xba90bc39,0xbac12376,0xbae4e281,0xba975096,0x387cc077,0x3aa92638,0x3a7794ef,0x3a2b7bf9,0xb89db38b, +0xb9032d72,0x392f9fca,0x39c2401f,0x399b0729,0x38dcd3fa,0xba7921af,0xb932e848,0x3a1c84b0,0x3b0ea1ed,0x3b549e42,0xbb9cf81d,0xbba8b04e,0xbb82beb7,0xbb8373b9,0xbb7aa312,0xbb54f315,0xbb0c9f8e,0xba1975a3,0x3b1f3fac,0x3b966ff3,0x3bc31bca,0x3bcb19b4,0x3bc1568d,0x3ba0b10f,0x3b8038cb, +0x3b1951b7,0x398d3b95,0xba9605fc,0xbb0b11c5,0xbb34f8eb,0xbb3f925d,0xbb0b64cd,0xba520369,0x3a198189,0x3a8c424b,0x3a6e75af,0xb96be1c7,0xba65be4f,0xba81d014,0xba5ffbed,0xba37efd7,0xba91757b,0xbaa7f656,0xbb05d51a,0xbb3c1351,0xbb7ef5ee,0x3b17a2e1,0x3ae40b07,0x3aa01ac4,0x3ac4f8fe, +0x3ade1173,0x3b1f0661,0x3b46b7a6,0x3b698051,0x3b4f2b03,0x3b320e60,0x3b200d29,0x3aac0280,0x39ae3c64,0xba49ac83,0xba7111f2,0xba92e023,0xbaaa3699,0xba8b3dbd,0xba7618d8,0xba7bbae5,0xba099b61,0xb9acb91e,0xb9722bd5,0x3a684fe4,0x3b06635d,0x3b7523bb,0x3b714d3e,0x3b770c40,0x3b7b1a1c, +0x3b3e2a9c,0x3b076951,0x3a9b695f,0x3ad3c37c,0x3b083be2,0x3b1588dd,0x3b08ff8c,0x3b45321e,0x3b65cbf0,0x3b555c09,0x3b3d1e8c,0x3b1dcf21,0x3b00b65f,0x3ac4efd3,0x3aa351e8,0x3a245a3f,0x392c1223,0xb98349c3,0xba3f807a,0xba957d01,0xbadb3937,0xbad13895,0xbad5809f,0xbada1442,0xbaedebd3, +0xbafc21c5,0xbb09b999,0xbb0635c2,0xbac39cd1,0xba95c260,0xba637f9b,0xba593c6e,0xb9ff00e0,0xb925368d,0x398ab04b,0x3a3095b7,0x3aa69a7d,0x3afbfaa5,0x3b17ff08,0x3b1e033f,0x3b1a2562,0x3b294db4,0x3b3c0733,0x39380456,0x39e92ea9,0x392a9361,0x385a2875,0xb7bdc2a1,0xb9022af5,0xb9792fa2, +0xb9b73614,0xba16c15b,0xba52e248,0xba8c95ea,0xbaa58a61,0xbabdd0d5,0xbade5196,0xbad59f4f,0xbad6b097,0xbad40b23,0xbacfcfc6,0xbacb381f,0xbac35003,0xbac6d300,0xbac2ab60,0xbad51422,0xba81a055,0xba815ae5,0xbaa5c234,0xba8c21f6,0xba67b0a6,0xba3d7de2,0xba10e4c5,0xb9d8c8c2,0xb90424d1, +0x38b630e8,0x39a8dc0a,0xb824d3fa,0x3911c522,0xbabbf114,0x396d4321,0x39a89387,0x39f8e394,0x39c64e49,0x39e728c3,0x3a2a2949,0x3a3257c6,0x3a0ab543,0xb89e6b32,0x37313ec7,0x3917ae1a,0x3a78754b,0x39ecac1e,0x39e1f8ad,0x39b079f8,0x3a288caa,0x3a338510,0x3a27abec,0x39e2c448,0x39ad3f79, +0x3989cdec,0x396a1812,0x395bbbdc,0x398d5911,0xb793ac1c,0xb88efcef,0xb9b6cf71,0xb9449455,0xb9b1709e,0xba499318,0xb9a988da,0xb9561496,0xba29d50f,0x390b81ea,0x39797200,0x3845ea3a,0x398d6010,0xb8f58b0f,0x39c1bbe9,0x38e7388b,0x3a0d7e38,0x3aa20a55,0x3ae33988,0x3aaa479d,0xb984172a, +0xb9464e54,0x3983dc18,0x3b0e81b5,0x3a25424a,0x39c7cd7d,0x39f25a8a,0x3ad9a5c5,0x3b0d85bb,0x3b09e973,0x3ae39f0c,0x3ab307b9,0x3a94916f,0x3a4e1119,0x39d19cdb,0x393fff50,0xb95afbe4,0xb9f85728,0xbaa156fc,0xb9f5dd45,0xb9a17ae5,0xbaac10b2,0xb9b944ef,0xba112842,0xbb06b9b2,0xb9b13123, +0xb959ba41,0xbaa36583,0xba089c26,0x3980821b,0x3ad2effe,0x3a63c4bd,0x3acea9c0,0x3b1ad5d6,0x3b52bd0d,0x3b2434ca,0xba230f5f,0xba4dcf71,0xb9a34aaa,0x3b86c601,0x3abd517d,0x3abb8cd5,0x3a82358a,0x3b36fdf4,0x3b4f5bf8,0x3b34618b,0x3aedc821,0x3a96fa1e,0x3a821aef,0x3981bd37,0xb95e7920, +0xba20292d,0xbaa03dec,0xba93b8b5,0xbb64a662,0xbb1b24f3,0xbb54804a,0xbbc34209,0xbb6fc78e,0xbb3b4ba3,0xbba08827,0xb9c82739,0x3945ac55,0xbac35f2e,0xb92e644a,0xbae5fc5a,0x37878d3e,0xba81099b,0x3a0d28d5,0x3b43cdba,0x3bacf4ab,0x3b86a347,0xba11be1f,0xba9beb8f,0x3a39c211,0x3bdd9197, +0x3af67c21,0x39056d40,0x3a3ae757,0x3b9cfc58,0x3be6a143,0x3be4947c,0x3bbe7cb4,0x3b9752a1,0x3b8489e6,0x3b2838b4,0x3ac2d409,0xba249659,0xba771c4a,0xba770c6d,0xbb6bd650,0xbaf8c6e9,0xbaefa066,0xbb196f28,0xbb83bfaa,0xbb84695c,0xbbdc29b5,0xbb232292,0xbab81bcf,0xbba1d2ae,0xbb305575, +0x3c006009,0x3c0e07e1,0x3c365dbd,0x3c198e78,0x3b84e177,0x3aee6de4,0x38eecd6e,0x39d5b4f0,0xbabb3051,0xbb210f53,0xbb34655d,0x3b107877,0x3ba25f3b,0x3b917cef,0xbaf2aa1a,0xbbd20156,0xbc22ae95,0xbc240538,0xbc222054,0xbc19befa,0xbc13314c,0xbbfaa5fe,0xbbdcd36f,0xb9e2e4f1,0x3a876edc, +0x3a7f8223,0x3a3c4a15,0x3a3172e5,0x3a9e25b1,0x3ac7af89,0x3b6a9fd7,0x3b9b3cab,0x3bccc052,0x3bdf57c5,0x3bc7a03d,0x3be6fba4,0xbb1ab4c0,0xbb31fc88,0xbb6e7abc,0xbbabb2d0,0xbbd53a0d,0xbc1e324c,0xbbc52759,0x3b0b6f5a,0x3b95d595,0x3b9a097e,0xba37d8f6,0xbc0c1017,0xbc28e758,0xbbc3f495, +0xba757644,0x3b728dae,0x3bc39f55,0x3be202c6,0x3bbe38fa,0x3b843ff3,0x3ab32e5d,0x39eb9306,0x3aa12abf,0x3a6038a7,0xb9c9ff5e,0xbab881c1,0xb9767672,0xb9c74ee9,0xba13ed12,0xba3c8d93,0xbaa49006,0xbb6b7147,0xbbd9e27d,0xbb822d0d,0x3b80dab3,0xb93dca10,0xbb894b57,0x3b0e98cd,0xbbd3250e, +0xbb055ada,0x3c6f3899,0x3c0eb9d6,0x3bb5e17d,0x3b91615a,0xbc01283a,0xbc14b658,0x3972da64,0x3bd723ec,0x3bdfd52f,0xba823fe8,0xbb108780,0xbb71e4f9,0xbb8c27df,0xbb786c21,0xbb563944,0xbb5ae65b,0xbaf0b669,0xbae29189,0xbb20d0fc,0xbaed2204,0xba0db906,0x3a0714ff,0x396d7023,0x392c5598, +0x39dac184,0x3937345b,0x3a9b797f,0xba8842e9,0x3ab1523c,0x3a5d1add,0xbc0f4bbe,0xbbb945cd,0xbbcf87f1,0x3c444d1f,0x3bd6ba36,0x3af16e7a,0xbb5d072f,0x3b837e98,0x3c05bfe0,0x3c158c63,0x3b422401,0xba342028,0xba5e80d5,0xbb1ffc1c,0xbb00bbe1,0xba907b70,0x3866df72,0x3a3865d3,0x3ac46ee4, +0x3b445f31,0x3b7b4422,0x3b72d9ef,0x3b5b27af,0x3b43b448,0x3b2a18dc,0x3a2c5464,0xb8e0de81,0xb99131e5,0xb91a6214,0xb962d0c9,0xb95ac22b,0xb9d5e307,0xb8e5353b,0xb9ffaa1d,0xba32f950,0xbb15b556,0xbbec658a,0xbc383a5f,0x3bbe870a,0x3b8086e6,0x3b703153,0x3b7e07cf,0x3a53bfcf,0xbacbcec7, +0xbb957b84,0xbbb8d395,0xbba8b42c,0xbb81fd6e,0xbb073c8f,0xba9bc95d,0xb9648787,0x3a822880,0x3a2d0014,0x3a00b1fe,0x39883aec,0xb9c03938,0xba23f049,0xba2c02d6,0x3918ba92,0x3a9f9244,0x3b060cac,0x3aa13e9b,0x3a2e6807,0x384241f8,0x3925068d,0x39b35293,0x39d11225,0x39b97038,0x399e9142, +0xba28bc53,0xb9bbd4d0,0x3a6176f9,0x3b6c7921,0x3bbe5683,0xbb8c6958,0xbb85eeef,0xbb2d28ea,0xbb57094b,0xbb808953,0xbb8754e3,0xbb53828a,0xbae921b5,0x3a9f7f2a,0x3b4e076c,0x3b88ccd6,0x3b98c1df,0x3b9722b5,0x3b81a456,0x3b4ab25f,0x3ad6627d,0xb9a91f14,0xbaca6efb,0xbb10bc61,0xbb26874a, +0xbb2c537d,0xbaee69d1,0xb9f597af,0x3a2e7037,0x3a61fb42,0x39b18868,0xba289649,0xba869504,0xba796980,0xba51326c,0xba4adb95,0xbaaba136,0xbac76abd,0xbb172203,0xbb4d1c11,0xbb811d33,0x3a2700fa,0xb93aea42,0xba45b81d,0xb9c7a0ad,0xb90ac357,0x3a8a88b7,0x3afbf374,0x3b2eec6e,0x3b2532b5, +0x3b1e4d30,0x3b2055cd,0x3ad23aa7,0x3a5d9fb9,0xb71d553f,0xb98dccaa,0xba08acad,0xba42b19c,0xba29f16e,0xba3812a9,0xba6d0344,0xb9848613,0x390044b7,0x39d6f675,0x3aa1e975,0x3b170495,0x3b72ccdf,0x3b622585,0x3b4d2d49,0x3b48459b,0x3b03eb18,0x3a97cc04,0x3900e2cc,0x3a083812,0x3a609321, +0x3a82b319,0x3a2e11e8,0x3b68b981,0x3b78d75a,0x3b6b68dd,0x3b546810,0x3b3413ca,0x3b1bc552,0x3b023bfd,0x3aede079,0x3a9d7142,0x3a34bf25,0x39639412,0xb997f2b5,0xba3e41e2,0xbaa7ecac,0xba9defbb,0xbaa04489,0xbaa33820,0xbab33ef1,0xbab927ad,0xbacf2c2f,0xbabf99e7,0xba54f979,0xb9b3daa7, +0x386721f9,0x396b201f,0x3a451aed,0x3a7d6f45,0x3aad4fc2,0x3ad79924,0x3b05d173,0x3b23b4bb,0x3b37ed2a,0x3b38c03e,0x3b3589f6,0x3b444014,0x3b50f38a,0x3a05df78,0x3a31ff6b,0x3a002c40,0x39dc9730,0x39d3a6dc,0x399cbed7,0x3942cd56,0x38bfc838,0xb90033eb,0xb9a609c8,0xba109065,0xba3dfeae, +0xba6bddba,0xba95cf9c,0xba8cc7ee,0xba8e3936,0xba8c0186,0xba88850c,0xba85496f,0xba7b0a0d,0xba80b117,0xba70a61d,0xba89e4c6,0xb9b39345,0xb9a43e1f,0xba033d3b,0xb9d5cdfa,0xb9946dca,0xb94ebf73,0xb8738a06,0x3831e3a3,0x3973bb2c,0x39ddc922,0x3a24d7f9,0x39c8d1cb,0x3a078ed1,0xba588e0b, +0x3990835b,0x3985e58f,0x3a1a3a94,0x39e05e33,0x3a011c22,0x3a25632f,0x3a4109a8,0x3a1bed4f,0x37188ab2,0x388b3b3c,0x3946485d,0x3a853e3d,0x39eeb1ea,0x39e26679,0x39ccb508,0x3a24b78e,0x3a30a020,0x3a362a52,0x39fc572e,0x39c5ffca,0x39ba3c06,0x39165fde,0x388026d3,0x38aabc9c,0xb8f3b6c1, +0xb986d54b,0xb9fac1d4,0xb9c1da83,0xba023e67,0xba6a1d77,0xb9e32499,0xb9af1694,0xba5946b6,0x380d1cf8,0x3981aa9d,0xb92e9e33,0x38f6ca51,0xb993b84a,0x3a000f25,0x395631c4,0x3a0da491,0x3a8a901d,0x3ae2fd41,0x3ab67137,0xb8c58a07,0xb90de150,0x3991a578,0x3b135c39,0x3a054990,0x3921f746, +0x39af7a0f,0x3aabf67b,0x3af1c00d,0x3b05045f,0x3adcb778,0x3ab21e7a,0x3a921642,0x3a0ef4ac,0x39786ac4,0x393d7b4d,0xb9f89928,0xba35a7bb,0xba870944,0xb9e16d0f,0xb982dd45,0xbaa84bbc,0xb8b36f8d,0xb9674279,0xbaf1d910,0xb90a7930,0xb90c4b2e,0xba9c561b,0xb9eed63f,0x394d039c,0x3ae035eb, +0x3a834add,0x3ad3b9e0,0x3b0a3812,0x3b55738c,0x3b2c72eb,0xb9b4c5d5,0xba2dc1ce,0xb9a042a5,0x3b884177,0x3a9ad9d5,0x3a95f01d,0x3a714aa1,0x3b1d4473,0x3b3734bf,0x3b34dc59,0x3af07d5b,0x3a9deb3b,0x3a87036b,0x38e3c32b,0xb9f558bb,0xb9d4f6c9,0xbada3c4a,0xbad72ddf,0xbb49f52a,0xbb1b294a, +0xbb3ef966,0xbbbdb995,0xbb47cfc2,0xbb20cb44,0xbb9b33f2,0xb98362f9,0x39a230de,0xbac68719,0xb94055b3,0xbae0f4e6,0x390b89d2,0xba4582a8,0x39a446e5,0x3b0d619b,0x3ba52ce0,0x3b8c7c28,0xb9355abb,0xba9610c6,0x3a38ab3e,0x3bdcc6cb,0x3ab642d4,0xba604d7e,0xb9103b39,0x3b5fe591,0x3bbfc69d, +0x3bd4c25c,0x3bb5e47a,0x3b915c60,0x3b7d69ee,0x3b03dc5d,0x3a5e8486,0xba7d4b00,0xbaf04610,0xbabfd83f,0xbb448aca,0xba9dfe01,0xba7aa440,0xbaac855a,0xbb24d2fe,0xbb2d2d87,0xbbb5c4dc,0xbae571f4,0xba88cd55,0xbba19fcc,0xbb2ccecb,0x3bf641b1,0x3c11ada6,0x3c391f41,0x3c27c481,0x3bd32687, +0x3b198251,0x39315ae2,0x3ace5d29,0xba7a0dfb,0xbb1aac45,0xbb3c2d15,0x3b1648bf,0x3bc607df,0x3bf18f7b,0x3948741f,0xbba00ba7,0xbc080f39,0xbc1a07a4,0xbc192f69,0xbc0b2cce,0xbc07cf4a,0xbbe06385,0xbbb876c8,0x3a800c67,0x3ad9d8c3,0x39f69537,0x3a4adb16,0x39f2d8e6,0x3a7583a8,0x3a70de8f, +0x3b29bb06,0x3b3e4d20,0x3ba315af,0x3bcfc563,0x3bd4b191,0x3be2f86c,0xbb47d29e,0xbb06a8ab,0xbb321918,0xbb953b53,0xbbb61b46,0xbc16af69,0xbbc6c8fb,0x3b19ed53,0x3b868c50,0x3ba671c8,0x3ae08a4c,0xbbeaf6f0,0xbc2661c1,0xbbd10001,0xbb0ccfb5,0x3b1ae052,0x3bb6c21c,0x3bd1f773,0x3bab07ad, +0x3b41152d,0x3a167385,0xb8d41744,0x3a7db1fd,0x39b72891,0xba1c49a4,0xba58dfde,0xb91e502e,0xb9cc9959,0xb9c5e90d,0xba22d92d,0xba38030f,0xbb0151fe,0xbb9ad81e,0xbb374c7b,0x3b5637a1,0xba8d4393,0xbaee8925,0x3bb2ef48,0xbb5a58cd,0x38da16c9,0x3c64e202,0x3c1f6d5c,0x3beacb44,0x3bd19b09, +0xbbba0b97,0xbc031912,0xbad1353c,0x3be4091d,0x3c0d262c,0x3ad0144f,0xba4253a4,0xbb33a27f,0xbb581290,0xbb5d7d60,0xbb2d3e4b,0xbb1845fb,0xba94cd2d,0xba9043ee,0xbafdfdef,0xba8b63bf,0xb868bc6b,0x39e0db36,0x390e6a08,0x394d0865,0x39a7f411,0x39296b6a,0x3a41e5b4,0xb889d3ed,0x3aa54d7f, +0x3a700a81,0xbc0102ab,0xbb81f810,0xbbe48661,0x3c609558,0x3b88b22c,0xbade7b7a,0xbbe2c786,0xb9150cf4,0x3bcbdca7,0x3c41d7b0,0x3b9ffe49,0x3a54faab,0xba6d9ef6,0xbb0070f9,0xbae9e255,0xba81165e,0xba1307c4,0xb8bd80db,0x3a87f73c,0x3b2e300d,0x3b766dd8,0x3b80f86b,0x3b59f9dc,0x3b40ac1c, +0x3b0672e2,0x3974eef2,0xb94c7a8d,0xb931839d,0xb92fa556,0xb9722994,0xb950b3fc,0xb9a8c772,0xb8dc3717,0xba008077,0xb9ed3d61,0xbb21fce5,0xbc311d40,0xbc6844fc,0x3c04a261,0x3bba46a8,0x3b8c0983,0x3b874d60,0x3afed590,0xb9af527d,0xbb76460c,0xbbb2b41a,0xbbad4f3f,0xbb87a4c9,0xbb19fe3f, +0xbacf5d2d,0xba0f7ced,0x3a8a23f3,0x3a7b4ce6,0x3a8c03ef,0x3a8c0b5e,0x3a0b3b52,0x39f7e0e5,0x3a2cbeb2,0x3ab9c30e,0x3b1b7f40,0x3b261b90,0x3ab43433,0x3a28bbf9,0x39001ee8,0x3997508d,0x39c3f3f1,0x39c02a58,0x399709a8,0x39c4f3ce,0xb9964d2a,0xb9c1f54d,0x3aa08014,0x3b99f4e7,0x3c0e3cee, +0xbb6c7c41,0xbb24c6b2,0xba7af509,0xbb06667b,0xbb4fa751,0xbb817c96,0xbb531418,0xbb00a509,0x3a412f52,0x3b0fad34,0x3b353d1e,0x3b599c2e,0x3b5fc76e,0x3b480453,0x3b19e48f,0x3a8eb715,0xba2db1ec,0xbad2dd8b,0xbafdf294,0xbb0c9957,0xbb145f4a,0xbab58f63,0xb90b6116,0x3a33ce7a,0x3a1f9058, +0xb8f56c45,0xba524084,0xba822d1b,0xba528755,0xba2a002c,0xba344e38,0xbaa7a636,0xbacff260,0xbb198c5a,0xbb4ae1e9,0xbb66ba3f,0xba38554d,0xbacd321c,0xbb024b75,0xbad6d0e5,0xbab5b1db,0x387be6fb,0x3a8bed7e,0x3afca2f6,0x3b0a4de8,0x3b1f13ec,0x3b3974d4,0x3b16c77c,0x3aea7fa0,0x3a9c6417, +0x3a4b11cd,0x39d62b9e,0x38bf81fa,0xb6756899,0xb93f8e89,0xba26c414,0x37ee2bf7,0x3a0fdd38,0x3a8137de,0x3ac5abc4,0x3b16febf,0x3b57051d,0x3b3bf090,0x3b1f8a38,0x3b10c725,0x3aa9833a,0x39eac633,0xba10111d,0xb9840f23,0xb8609e5f,0xb7024d01,0xb9d61706,0x3b65c7a2,0x3b79e177,0x3b71f249, +0x3b5fb856,0x3b45084c,0x3b35c0fd,0x3b251d54,0x3b21282b,0x3afb0d33,0x3ab5c553,0x3a6a828b,0x39d192de,0xb7ada956,0xba104107,0xb9fcd087,0xb9fc0dd2,0xb9ff30e9,0xba1765e9,0xba11b9e9,0xba3f38f2,0xba59502a,0x385ddc23,0x3a1625a1,0x3a870b68,0x3aaa1909,0x3b063199,0x3b0c2b2f,0x3b18a5ea, +0x3b1ff345,0x3b2eae4f,0x3b401171,0x3b46bc64,0x3b44c12b,0x3b3d54bf,0x3b4a0bcd,0x3b56f329,0x3a65e586,0x3a99bbcb,0x3a863617,0x3a85d8f3,0x3a8abe8f,0x3a7ce4ca,0x3a640b53,0x3a5541d4,0x3a23578a,0x39fc6d45,0x399dd826,0x392e1687,0x379a6739,0xb94ffa9b,0xb90c03c5,0xb91be2e4,0xb9113664, +0xb9024232,0xb9057189,0xb6ceaca9,0xb98eaad2,0xb9a012c1,0xba17df46,0x39ea7120,0x39a7b66d,0x3899eca5,0x38473b87,0x38fa5d9e,0x392b453e,0x3970304f,0x399017db,0x39bf1dd6,0x3a2f7b7d,0x3a8591de,0x3a12e47d,0x3a4c7c8c,0x393272db,0x3959603f,0x39c30fea,0x39f9efa0,0x39c69f42,0x39e10d8a, +0x3a06735b,0x3a2eeca3,0x3a0b5fdb,0xb7bd9a0b,0x368a4685,0x38f00154,0x3a75d2f2,0x39b5ef5f,0x39a8086d,0x39a67221,0x39fc7f89,0x3a0aa2d2,0x3a23b219,0x39d2110d,0x39a3a531,0x3971115d,0x397ec645,0x3973f5f1,0x39b07a41,0xb8d6bf2d,0xb900ae88,0xb9257fce,0xb8edb633,0xb93efb27,0xba0b1e8c, +0xb8c6a3d7,0xb79222de,0xba049121,0x397fe7d4,0x399c4ae6,0x38884844,0x39a35fb5,0xb6e9c149,0x3a00b7f2,0x393ae029,0x39e9364b,0x3a4ccbef,0x3ace84c3,0x3aad17db,0xb892d77f,0xb9626150,0x392bfba0,0x3b0afc99,0x39a7cfa4,0xb8fa913b,0x38a30f97,0x3a4f660c,0x3aaf08ff,0x3ae8816c,0x3abd8fdf, +0x3a963efe,0x3a71c42b,0x3a1a6ae1,0x390d8b3d,0x399e2984,0xba2117c7,0xba51f267,0xba462662,0xba000b09,0xb9ca4a09,0xbaa22579,0x388c35a1,0xb80f4469,0xbacccd94,0x3845033e,0x38431874,0xba74ed7a,0xb9c90a8b,0x39bda09f,0x3ae02cc2,0x3a796d5e,0x3acec4d2,0x3aeb91ca,0x3b4c74a4,0x3b27793e, +0xb94c8815,0xba3263bc,0xb9ddb0a9,0x3b807bb9,0x3a62d147,0x3a5399ca,0x3a3459dc,0x3ae9fb53,0x3b0f9724,0x3b295c3d,0x3ad99a28,0x3a8604d2,0x3a69199d,0x38d6cf12,0xba116e46,0xb8aeb0a5,0xbb050f9c,0xbb00a854,0xbb213743,0xbb1440d6,0xbb218b84,0xbb9f8976,0xbb202c74,0xbafc719b,0xbb86eb46, +0xb89357cd,0x39e5d36f,0xbaaf3778,0xb8e47dfb,0xbaad0c7d,0x3982d862,0xba272420,0x389e1a38,0x3aabd79c,0x3b96e055,0x3b8afd46,0x38c58850,0xba9e6e99,0x3a078415,0x3bcf22b8,0x3a7d2e2c,0xbad4d7cd,0xba8b1dec,0x3ae6b3c4,0x3b8cb2a4,0x3bbb1b9c,0x3ba17294,0x3b7d56a4,0x3b59205d,0x3ac7d37c, +0x39858095,0xba83e467,0xbb1e8cde,0xbadeff04,0xbb0f3964,0xba12cadc,0xba046c20,0xba32b4c4,0xba9c020a,0xbac955cb,0xbb85ae87,0xba8f4205,0xba223496,0xbb938d84,0xbb1f7487,0x3beb51bc,0x3c0a513a,0x3c332519,0x3c3087cd,0x3c0916c8,0x3b28c9e9,0xb8b6e929,0x3b0696a8,0xba4af847,0xbb18a910, +0xbb3fe397,0x3b15f60e,0x3be0287e,0x3c1e19aa,0x3b105d31,0xbb4fc948,0xbbd47cd5,0xbc0a0c18,0xbc0bffc7,0xbbf1a1d7,0xbbeb6d32,0xbbbf0307,0xbb85a709,0x3aff83ff,0x3af6af6f,0x391cf7c0,0x3a286c38,0x3946f002,0x3a2a195c,0x39af2304,0x3ac7e10c,0x3ad02583,0x3b66f4f5,0x3bb6156e,0x3bd1c03e, +0x3bda29f5,0xbb368555,0xba857a79,0xbb055d7d,0xbb852722,0xbba4196c,0xbc132112,0xbbd2fd0a,0x3b0655a5,0x3b588f81,0x3ba6e0b4,0x3b802e47,0xbbb67673,0xbc1f2430,0xbbe1b01b,0xbb4e6b4c,0x3a9abfc2,0x3b9feab9,0x3bb59dd7,0x3b89f424,0x3ae9af27,0xb8450461,0xb9f49759,0x3a5e3b92,0xb90eff29, +0xba33272e,0xb9bd4a81,0xb92dd477,0xb97bd458,0xb97f5d7f,0xb9a92957,0xba074e5d,0xba394f14,0xbb3f4baf,0xbaf44adc,0x3b24ce64,0xbac1e850,0x3a803de1,0x3c058c08,0xba3d2eca,0x3abad41e,0x3c3e59cd,0x3c22aa50,0x3c05dab4,0x3bfb9b81,0xbb5c3a21,0xbbd72fc9,0xbb5a4060,0x3bd292c9,0x3c180726, +0x3b7a6eef,0x3970cfda,0xbb125710,0xbb2719ba,0xbb4342c8,0xbb06aeca,0xba85e69b,0xb9045fa1,0xb99578a6,0xba9f4fcd,0xb9b51206,0x3983187a,0x3983265d,0x38da08b4,0x392fcdf5,0x39316b07,0x39316a13,0x39a5e657,0x3977a73c,0x3a8830a1,0x3a24e478,0xbbbdf282,0xbb0b44a4,0xbbd69e19,0x3c3b74c9, +0xba4b350b,0xbbcb43e7,0xbc290836,0xbba3fc1d,0x3b3c4053,0x3c50c659,0x3bd5f297,0x3b22631c,0xbaadca84,0xbaec5455,0xbb07a5eb,0xbac41047,0xbac93700,0xba7f0eb5,0x39d867fd,0x3b09b885,0x3b5a3641,0x3b81cacf,0x3b6142b5,0x3b3aab88,0x3abb6431,0xb8bf8c66,0xb982db1a,0xb9123d17,0xb92325e7, +0xb94114d7,0xb91bf027,0xb94c2bc5,0xb8e8bd25,0xb9a9d54d,0xb9856b04,0xbb243084,0xbc4d3ff8,0xbc74ea27,0x3c304172,0x3bf9ed75,0x3b8bc1b3,0x3b5c774b,0x3b0dbb6a,0x39a2b6f7,0xbb427132,0xbba5fe1c,0xbbab7f90,0xbb8a446f,0xbb32f871,0xbb07a254,0xba8175a5,0x3a6f1589,0x3a93654f,0x3ac10dbd, +0x3ad0c079,0x3aac9075,0x3ac003c0,0x3b012d4a,0x3b37e3da,0x3b602528,0x3b3af237,0x3abd0f9c,0x3a1507da,0x391fa5c6,0x399263a6,0x39a699cc,0x39932df0,0x3944fcae,0x39935e17,0x3883b5a8,0xb95bf816,0x3ae3032e,0x3bb2ecb3,0x3c36e1ca,0xbb10e2bb,0xba8d031b,0x3909d170,0xba7576c5,0xbb0f3a44, +0xbb513f5d,0xbb2cdb56,0xbae2d29d,0x3a106d75,0x3ac686dd,0x3ad6593d,0x3b032a62,0x3b04eb46,0x3aec88ee,0x3aaa3791,0x39c30ad8,0xba82c683,0xbac91880,0xbad4e39c,0xbad24d71,0xbace2756,0xba537dac,0x39cf6903,0x3a44d6b5,0x39dea9c0,0xb9b4a45c,0xba3f63e4,0xba4bf049,0xba1bcb15,0xb9e28836, +0xb9efbd24,0xba885cc5,0xbab2ef8b,0xbb01958a,0xbb29b758,0xbb2fb2fe,0xbac05777,0xbb1adb13,0xbb2f8de4,0xbb181ddd,0xbb0bc6f1,0xba35a788,0x398a8005,0x3a8d2583,0x3ace2836,0x3b13bd0a,0x3b43ef04,0x3b3ad089,0x3b2f884f,0x3b1fa5c0,0x3af5c1c9,0x3ab75c0f,0x3a7b263b,0x3a3a69e1,0x39bff177, +0xb93b212e,0x3a162ded,0x3a9195ce,0x3ad3cf16,0x3aec7db7,0x3b1548ef,0x3b3023a9,0x3b1505a8,0x3ae1ff50,0x3acfd3eb,0x3a455aa2,0x38e52ca5,0xba4e9131,0xba252a76,0xba1ade50,0xba1c0d2c,0xba8dd2dc,0x3b682033,0x3b6187f0,0x3b5c0c06,0x3b523cb7,0x3b3f8719,0x3b3ac5b6,0x3b344303,0x3b371108, +0x3b1e919d,0x3b01513c,0x3acb2538,0x3a971a92,0x3a582d1b,0x39e7a936,0x39f94cb4,0x3a01b5f2,0x3a00cff5,0x39e65bcd,0x39fb6776,0x39b06305,0x398f452d,0x3a8df509,0x3ad5bd9a,0x3b08fe32,0x3b213ce1,0x3b55593f,0x3b51623b,0x3b541868,0x3b52a770,0x3b4f5464,0x3b4ffc53,0x3b4d5776,0x3b48c9bc, +0x3b42ac45,0x3b4d4b0c,0x3b4e4314,0x3ac5a68b,0x3ac78c75,0x3ac7eb98,0x3accbc5f,0x3ad67df9,0x3accf2da,0x3ac3f61d,0x3ac0fcc7,0x3aaf33d3,0x3aa63287,0x3a996d68,0x3a90392c,0x3a83c130,0x3a5ef9c2,0x3a6a4a66,0x3a650328,0x3a647702,0x3a63d3b2,0x3a5de133,0x3a744562,0x3a587f46,0x3a554083, +0x3a0082ce,0x3abd91b8,0x3ab2368c,0x3a965ade,0x3a87eb50,0x3a898bc1,0x3a84f123,0x3a8a9a0e,0x3a8a7f05,0x3a8964da,0x3ab2afe3,0x3acfac97,0x3aa111bd,0x3ac068f7,0x3a9bf391,0xb94bd158,0xb7965b72,0x38e48816,0x37a62b0d,0x384a8ea2,0x38860ab1,0x3988413c,0x390ae90e,0xb9c77142,0xb9c85c19, +0xb994889c,0x3a03d40e,0xb8907977,0xb8ca9f9b,0xb8a52ebe,0x371dd521,0x387516e1,0x3976d40d,0x3745d137,0xb862f907,0xb92919eb,0xb90e0770,0xb8bd428b,0x398000a8,0xba083d1e,0xb9fc0367,0xb938beaf,0xb96f9731,0xb97eb22b,0xb9fd9a45,0xb916d0ce,0xb8ec75f3,0xba13225c,0xb88af98c,0xb8e5ed37, +0xb8bb2022,0xb819abb6,0xb97c5b05,0x38ed12f2,0xb92f28d2,0xb7eb240a,0x38cd42a6,0x3a7e7d30,0x3a50bf44,0xb9f1c51d,0xba3344ac,0xb9b1043b,0x3ac82fd7,0xb937ae49,0xba2ed3a5,0xba0acbbe,0xb8e29e49,0x39e1002e,0x3a954009,0x3a5dd580,0x3a243b0e,0x39bd9379,0x3973a1a2,0xb97b58b1,0x38af297f, +0xba866c41,0xba9aeae2,0xba45017c,0xba785727,0xba79c59f,0xbac994a6,0xb97d918e,0xb95cccc9,0xbac9822e,0xb92745f7,0xb9372b1f,0xba8d565e,0xba25de84,0x389265ad,0x3aacd228,0x3a214848,0x3a9366a8,0x3a84a310,0x3b1eeac1,0x3afd0d80,0xba0bcfdc,0xba975d13,0xba7b0c73,0x3b4ab9d5,0x39817129, +0x392e7e1f,0x386046d8,0x3a3a0756,0x3a92059b,0x3b03456b,0x3a904f3a,0x3a137d2a,0x39bc0f0c,0xb95cba22,0xba526ad4,0xb7118de5,0xbb233ffa,0xbb19c903,0xbafff86a,0xbb134adb,0xbb101d25,0xbb7bfa78,0xbafeb8dc,0xbad79d69,0xbb63927a,0xb93fb1fc,0x39673d28,0xbac119f5,0xb9d9a2a2,0xbaa6d284, +0x37d313ab,0xba4526b9,0xba0ae6c5,0xb7b06b83,0x3b6316fe,0x3b62a5b4,0xb9699175,0xbae10b0d,0xb91aeb2f,0x3baa714a,0x39b3066c,0xbb1d2c97,0xbb12f8a4,0xb9bdcdd9,0x3b0ec581,0x3b924cea,0x3b7dfedd,0x3b43047b,0x3b1aaa69,0x3a67246a,0xb99e328f,0xba763f29,0xbb310b1e,0xbadcbf5c,0xbaa2df6f, +0xb957543a,0xb924b755,0xb9102fcb,0xb9e146b9,0xba2e66fa,0xbb2d20e6,0xba315a04,0xb9ee7450,0xbb835433,0xbb1bbff9,0x3bc74109,0x3beafdd8,0x3c23b20f,0x3c2b689d,0x3c14a1d5,0x3b0c91b3,0xba7071e8,0x3ac7474e,0xbac41a85,0xbb47242c,0xbb5cf4f0,0x3ac4b28b,0x3bd7dce7,0x3c2b5cc5,0x3b699456, +0xbaee3646,0xbba8c4e9,0xbbfbb984,0xbc0145b0,0xbbd5158e,0xbbccffaf,0xbb9bc1ff,0xbb24fe23,0x3b171d61,0x3adad013,0xb7180393,0x39e25c9d,0x380c6058,0x39992ba4,0x3913745b,0x3a2167aa,0x3a37844a,0x3b085459,0x3b8ae133,0x3bb2b3d6,0x3bbb3c94,0xbb3756df,0xba065d51,0xbaf96d70,0xbb8f4fb8, +0xbbb091a6,0xbc1ca556,0xbbfda58f,0x39db482a,0x3aa150db,0x3b71c7b4,0x3b984ba5,0xbba58094,0xbc255fe1,0xbc08e53c,0xbb97fdee,0xb9986e53,0x3b6e6e18,0x3b87fcd0,0x3b364a99,0x39b577aa,0xba663b20,0xba64f697,0x3a175508,0xba0c5853,0xba21ecd6,0xb9206cc8,0xb90dab9e,0xb8d791a4,0xb901a436, +0xb8ff749c,0xb997a524,0xb94a9e25,0xbabab21f,0xba9dac2c,0x3ab7dbc8,0xbafc9319,0x3b38230b,0x3c1549e2,0x3a9ffb4f,0x3afd122a,0x3c0e83ba,0x3c1dc419,0x3c0c4fd1,0x3bf7eff2,0xbb002e13,0xbbc79741,0xbbc36f45,0x3b91ce9d,0x3c0cf18d,0x3bb4e368,0x3a45b9c5,0xbb0df88c,0xbb180ecd,0xbb38d3cb, +0xbacf7e02,0xb77959f6,0x3a0bb162,0x398fec11,0xba3ea552,0x3916dd88,0x398dc1f1,0x390c933f,0x38a5d8be,0x38caa757,0x38ab2720,0x38bba135,0x3921f4ae,0x38e79d4b,0x3a2e1474,0x39706548,0xbb8997a1,0xba3e83ea,0xbbdfa707,0x3bb29fd2,0xbbbb2370,0xbc1de780,0xbc4377be,0xbc16d82e,0xbaaa1a23, +0x3c3253c2,0x3be7b305,0x3b6baa63,0xbb18b2ca,0xbb1a6d26,0xbb4ee618,0xbb3aad16,0xbb47f657,0xbb0e7652,0xba09a4a1,0x3a9c0afa,0x3b256ba0,0x3b5db0be,0x3b48a660,0x3b15e64e,0x3a0b7907,0xb9b1adf9,0xb98e837c,0xb8aa292a,0xb8ef108b,0xb8ff6568,0xb8c52d80,0xb8d051a0,0xb8c57155,0xb91e9422, +0xb9347b3e,0xbb22b92e,0xbc4fa0b3,0xbc658440,0x3c4a24e3,0x3c16e31b,0x3b7dad61,0x3acbbb48,0x3ab5c6a5,0xb980fb91,0xbb47553a,0xbbaeee61,0xbbc08bf1,0xbba53e77,0xbb73ab7d,0xbb495cf3,0xbaf7a957,0x39656523,0x3a5a2aef,0x3ab433a1,0x3ad2da43,0x3acbade4,0x3b0068ae,0x3b2ebc57,0x3b6bfa3b, +0x3b7a998d,0x3b2c4907,0x3aa0c843,0x39aae110,0x38efa0d7,0x396db2c7,0x395f495e,0x393bba56,0x38f5c433,0x393b97bb,0x393d28ec,0xb8c22c1f,0x3b04884a,0x3bac3ef1,0x3c4a6fa0,0xbade89fe,0xb9cfaa4f,0x39d91593,0xba104069,0xbadf74ea,0xbb3bc286,0xbb2acdaf,0xbb122a71,0xba0a3d2c,0xb823d59f, +0xb978ca3d,0x37d07b9d,0x383cce7c,0xb8a6cd49,0xb96a0388,0xba36b418,0xbad05707,0xbaf00885,0xbae7cfc1,0xbacacbe2,0xbaa81e78,0xba175a88,0x3a08415f,0x3a059b85,0x3934a270,0xb9df25de,0xba0cd895,0xb9efb265,0xb9c4f60e,0xb9652481,0xb98d697f,0xba47af0e,0xba9b1ab2,0xbae01e1c,0xbb103ff1, +0xbb0bf8f6,0xbb1ebfcc,0xbb5d62a7,0xbb663d38,0xbb50466f,0xbb4501af,0xbaefa1a4,0xba8d3fd1,0xb9f38a27,0x3996a0fa,0x3aa230fd,0x3b119d64,0x3b23c7d1,0x3b317fe7,0x3b3c6488,0x3b13019b,0x3adf1dd8,0x3a9d248e,0x3a632248,0x39e51fcf,0xb90c76d3,0x3a259148,0x3a99169b,0x3adea5a0,0x3ad18de6, +0x3aefa544,0x3adea0f9,0x3abe5f45,0x3a4867f2,0x3a57602d,0x3885f052,0xb9af2832,0xba949592,0xba9df8fe,0xbab47c27,0xbac4832c,0xbb07f259,0x3b376939,0x3b06d8f1,0x3b0956df,0x3b06a3d3,0x3afad504,0x3b01cae0,0x3b056a49,0x3b0d64f1,0x3b041062,0x3ae1a930,0x3abbe819,0x3a9bd33a,0x3a832b39, +0x3a59dfbd,0x3a5cf8f8,0x3a6d3b57,0x3a728844,0x3a6f4842,0x3a802be4,0x3a5fab44,0x3a8c9bbd,0x3acfa55b,0x3b05ba4f,0x3b24d8d8,0x3b41e1b4,0x3b6a25af,0x3b5d7703,0x3b5472a1,0x3b4eccde,0x3b3a766e,0x3b2e187a,0x3b296f07,0x3b1f96e2,0x3b1c4782,0x3b206255,0x3b0e7aa7,0x3ab9227a,0x3a9bb54b, +0x3ab1c6eb,0x3ab7b0cb,0x3ac513fa,0x3abf9ea0,0x3abae9b7,0x3abb9754,0x3ab3a40d,0x3ab532de,0x3ab5137d,0x3ab65d56,0x3ab312a6,0x3aa9b98d,0x3aabdc68,0x3aa8593d,0x3aa69a93,0x3aa44b9e,0x3aa20ffa,0x3aa389d8,0x3aa535ac,0x3ab042c9,0x3ab370b7,0x3adb1b5a,0x3ae21361,0x3afa4403,0x3ae4e69f, +0x3ae0c1bd,0x3ad2083a,0x3ad4bba0,0x3acecc00,0x3ac1cdfa,0x3abe60cf,0x3ab7f65d,0x3ad5c760,0x3ac8871f,0x3ac1b39e,0xb9907e8f,0xb8f12fa4,0x38c1b5a9,0xb7b8f69c,0x377275eb,0xb80b74ea,0x3962afa9,0x38de44a6,0xb9b2af2a,0xb9d82cce,0xb9b7110b,0x39b0df57,0xb9271e0e,0xb9490616,0xb93fadcf, +0xb93c1c06,0xb90db338,0x38ff1007,0xb8ccd4e6,0xb92ad96b,0xb9890bd1,0xb9905b96,0xb99736bf,0xb8a0a0d4,0xba233662,0xba2f72c6,0xb9c83b62,0xba0d2bed,0xba04ebe0,0xba1c0b0b,0xb9b8988c,0xb9bcaa2f,0xba3f82d0,0xb9603900,0xb93ff97c,0xb9db23e1,0xb96d74bc,0xb9c3f3d7,0x392279e6,0xb8c2a1a1, +0xb7a02bd9,0xb8a42163,0x3a6cebc4,0x3a563ee9,0xb9883da7,0xba2de7eb,0xb9e33fb1,0x3a9c36bb,0xb98495ea,0xba4d990e,0xba519666,0xba3a33ca,0xb9614efd,0x3a4679cc,0x3a03a114,0x39b5edcc,0x385c2df6,0xb8ddd3ef,0xb9de53d6,0x387106f6,0xbaa68039,0xbabc0828,0xba155b3d,0xbaa5dd5d,0xbaad3843, +0xbad0c0de,0xb9c469cf,0xb944e66d,0xbaa7d407,0xb956c13f,0xb994143b,0xba87567a,0xba109448,0x38e7a080,0x3aac2273,0x3a467c23,0x3a9e9688,0x3a5a4e1d,0x3b2140ce,0x3b0833a2,0x35fbc7d6,0xba808012,0xba83aaa3,0x3b200a5b,0x38e2e2ca,0xb6a25387,0xb976b65c,0xb8f855b8,0x397b3872,0x3ad65321, +0x3a3f1aa0,0x39949f55,0xb8c068d0,0xb9e4b1af,0xba81a791,0x385d78a4,0xbb332821,0xbb25a105,0xbab29784,0xbb0c719a,0xbaf2e599,0xbb344b7b,0xbab141c7,0xbaaabb79,0xbb284359,0xb95b5a80,0x387016f3,0xbabb4dba,0xb9df0ceb,0xba7b0f2e,0x394c763f,0xb9c5c94f,0xb9f4771d,0xba0953a7,0x3b569776, +0x3b6f5d14,0x3a1ccaa9,0xbaba8b21,0xb9c58ab1,0x3b862da9,0x3976ee74,0xbb250b23,0xbb43e3a5,0xbb14a7d3,0x390e059b,0x3b586ccd,0x3b3d4c5b,0x3b0bd289,0x3ab5a0c7,0x397560c7,0xba46bbef,0xba602333,0xbb2e5107,0xbab49f40,0xb9ebc00e,0xb863b102,0x394f4540,0x39eceb38,0xb89cea75,0xb8a6a07c, +0xbab20be7,0xb9c1a276,0xb99412d1,0xbb55a299,0xbb03ed3a,0x3bb82f21,0x3bd83eca,0x3c21f6ba,0x3c33f6f0,0x3c2c4586,0x3b45c3fe,0xb996daea,0x3b0f416d,0xba82a9e5,0xbb2a9d44,0xbb487118,0x3aae435e,0x3bdd1776,0x3c39d799,0x3bb5615e,0x39a78462,0xbb561c83,0xbbd1d9c6,0xbbe0fff7,0xbbb5a595, +0xbbb198db,0xbb6ae62a,0xba893b6e,0x3b0ec5ae,0x3a975781,0xb83eabc5,0x3974b409,0xb8f05370,0xb8791e2d,0xb7415593,0x398954d0,0x394d1a92,0x3a8673d6,0x3b43643a,0x3b9167d9,0x3ba1def4,0xbb120f17,0x3a70f181,0xb920bc5f,0xbb35d3c2,0xbb8a1aa9,0xbc0e6ffe,0xbbfbc828,0x371b1a7c,0x3a2b51d7, +0x3b6be88d,0x3bc8768e,0xbb5b62a1,0xbc13ba16,0xbc0afcec,0xbb9ee100,0xba20cde4,0x3b4d3d1d,0x3b5aacf1,0x3af6b9f8,0xba24fc2e,0xbab5b85c,0xba816405,0x39c7ae85,0xba3a77d7,0xb9e3c235,0xb8989f36,0xb89a35e9,0x36fbf349,0x38069107,0xb789fd02,0xb90a4836,0xb87b2866,0xba1033e9,0xba0d78f4, +0x3a3142f6,0xbad23c88,0x3ba65b3c,0x3c2ff4ca,0x3b7f0069,0x3b3c17b6,0x3bbb13e3,0x3c1d0113,0x3c1aa5e6,0x3c0225d1,0x3a024e6f,0xbb8bed8b,0xbbdef91d,0x3b6abf31,0x3c0f1b3d,0x3c0587ff,0x3b1dee4f,0xba853841,0xbaa437a7,0xbaf85bc8,0xba29c423,0x3a8cbe71,0x3aa375c1,0x3a3f873a,0xb998c0e3, +0x39c23e78,0x39691d3f,0x388a73e5,0x38440854,0x3799c2aa,0xb6ddf425,0x374305d2,0x38ab3dcb,0x36ad4728,0x39c896d6,0x3919cc0b,0xbb3e240d,0x3a409b41,0xbbcdf604,0xbaf40897,0xbc1ba75e,0xbc35e838,0xbc4fe032,0xbc436c00,0xbb9a8113,0x3c07eaae,0x3c04e830,0x3bbed12b,0xbaf2ea07,0xbaceea18, +0xbb42debc,0xbb492ae4,0xbb58e3f4,0xbb14f482,0xba4b8914,0x3a475fda,0x3b01170a,0x3b3b2413,0x3b27e9f9,0x3ad0508c,0xb93fb92c,0xb9ccb1b3,0xb925b59a,0xb850df4b,0xb89fd061,0xb81bc3a9,0xb763e96e,0xb76b315b,0xb855b5c9,0xb898f090,0xb804166a,0xbb06fe75,0xbc35c55f,0xbc35b3f0,0x3c60bee2, +0x3c329328,0x3b5c2698,0xb9b9a23c,0x3931315b,0xba85845d,0xbb3ab068,0xbb968670,0xbbb172d5,0xbb99c335,0xbb629ead,0xbb39e526,0xbad45094,0x3a0d30a8,0x3aa38d51,0x3aec932d,0x3b0b12c3,0x3b156316,0x3b398a08,0x3b6183bf,0x3b857b56,0x3b7e84be,0x3b0d0425,0x3a5dd663,0x38a6fd68,0x38ef054e, +0x39074887,0x38b2ceda,0x3815f033,0x37afae42,0x381b94dc,0x39246e79,0xb788ce21,0x3b10e5aa,0x3b9d6179,0x3c4f2885,0xba5e1552,0x3a15bf6d,0x3a81042b,0x3981cd9e,0xba5f8870,0xbafed036,0xbb019e8b,0xbb0557d8,0xba42fa67,0xba09c5c4,0xba6472fc,0xba3ad257,0xba5a91d3,0xba903b93,0xba83a5aa, +0xba9151c3,0xbac831b8,0xbad078f5,0xbab2a61b,0xbaa1d006,0xba80b08d,0xb92550a5,0x3a1dd3ac,0x39c20b38,0x378facb3,0xb9b560b9,0xb989f115,0xb937f4ba,0xb899f193,0xb681c869,0xb74f755c,0xb99da5b8,0xba4c469d,0xba8f7a9d,0xbac661af,0xba93df3f,0xbb496f96,0xbb749105,0xbb6afc0d,0xbb5a1619, +0xbb4c3e60,0xbb0ceb8d,0xbaca80e4,0xba8f8fb6,0xb970ffab,0x3a543fca,0x3af67071,0x3b213303,0x3b431910,0x3b630c72,0x3b374679,0x3b0e5ab1,0x3ad067eb,0x3aa0533e,0x3a629e74,0x398ea244,0x3a3c8fdc,0x3a966609,0x3acbe019,0x3a9fca9f,0x3a94e488,0x3a4d57cf,0x3a1067be,0x384fa2ee,0x38b70be0, +0xb9fb5d52,0xba5c60bc,0xbac1af22,0xbae3c8f6,0xbb095596,0xbb1bd7be,0xbb385bfb,0x3ac0f77f,0x3a5b3029,0x3a80a99e,0x3a8c1f37,0x3a8ed258,0x3aa5c368,0x3abf0ae2,0x3adb8d89,0x3ae4160d,0x3ad50eae,0x3ac3ff43,0x3ab5ecf0,0x3aac49c2,0x3aad19b8,0x3aab3820,0x3ab8cadd,0x3abf0efc,0x3ac2a904, +0x3acd17fa,0x3ac249f5,0x3abd382f,0x3b03cc15,0x3b1c3f5b,0x3b34e166,0x3b4c8955,0x3b6b1307,0x3b57b312,0x3b45ce8f,0x3b3636a9,0x3b1dc25c,0x3b0c48c2,0x3b002c49,0x3ae73a2c,0x3ad606dd,0x3ad2d29a,0x3aa8aa7d,0x3aad3a29,0x3a9eb537,0x3ab6a5ee,0x3ac15b59,0x3ad0ee92,0x3ad17116,0x3ad1a2ee, +0x3ad57ebd,0x3ad508e1,0x3add93ff,0x3ae66741,0x3af0674c,0x3af5635d,0x3af5b1be,0x3af6a8a4,0x3af3c07c,0x3af1bfe5,0x3aeea24a,0x3aea5dbc,0x3af24f73,0x3adc179b,0x3ad58660,0x3ac28480,0x3b00b3e8,0x3af606c0,0x3b014e63,0x3aeb5177,0x3ae44897,0x3ad46056,0x3acf9a7b,0x3ac3691a,0x3ab01d1d, +0x3ab63bc0,0x3abaeff7,0x3aad5a94,0x3aae3455,0x3b04bff0,0xb9f03bbd,0xb973eaca,0xb8dca0c8,0xb92c4a61,0xb91614ed,0xb981b803,0x382070c5,0xb845c67a,0xb9d52e47,0xba088cd8,0xb9fc2c5c,0x38965d34,0xb99634fc,0xb9a9277c,0xb9bc89ba,0xb9ed391e,0xb9dffbdf,0xb8e85ffc,0xb9a2ffcb,0xb9bc13bb, +0xba025b23,0xb9da663d,0xb9c8cfb2,0xb899afc1,0xba4e0220,0xba4c9f4e,0xb992787a,0xba0f0463,0xba02ccd4,0xb9f512f2,0xb9941fa3,0xb99ca1f7,0xba1ab943,0xb99b7afc,0xb9bdf821,0xb9d545e9,0xb99aedec,0xb99a9aa0,0x362328cc,0xb9453b74,0xb94114bd,0xb9e11505,0x3a1e1c99,0x3a23038f,0xb94f9090, +0xba37d664,0xba130560,0x3a415285,0xb99022e9,0xba5860eb,0xba8ff3f7,0xbab49891,0xba7f1bd3,0x395aad8c,0x380e8044,0xb81d84e5,0xb9bc2f50,0xb99eeab0,0xba21c57d,0xb7de1fda,0xbabc8332,0xbacca5c1,0xb9ee0159,0xbad2dd08,0xbadead98,0xbaca2562,0xba0fea6b,0xb993a0bd,0xba80254b,0xb99ba17c, +0xb9cbf18e,0xba7fb41e,0xba218a47,0x3899e9a3,0x3a92fd3c,0x3a23ddb1,0x3a8a3f7a,0x39d3f5eb,0x3b0c5896,0x3afaa158,0x39bdd765,0xba543b79,0xba78c0bf,0x3ae017f3,0x396b1d7d,0x388725cf,0xb9ed4581,0xba8096ff,0xba46eb91,0x3a89893e,0x39646aa4,0xb8e8b353,0xba1f68d8,0xba3303fc,0xba92e38b, +0x38967c9f,0xbb37871d,0xbb240cac,0xba5ee5cc,0xbaf70d11,0xbac2a825,0xbae0ee58,0xba60cc21,0xba6bcf48,0xbadb7b53,0xb9741868,0xb8eb3c64,0xbaa8bf09,0xba0c2201,0xba3528fc,0x393cbba1,0xb9a33d1e,0xba2de9ab,0xbaa819b1,0x3b29d022,0x3b5cc7c9,0x3a9ce9a0,0xba8b0ac0,0xba0482e7,0x3b3998d9, +0x39e410fb,0xbb0f531b,0xbb6897a7,0xbb88dbe3,0xbb097b11,0x3aedc519,0x3adef617,0x3a9af6f0,0x39b2b4b5,0xb9c55e19,0xba8ecffb,0xba3eb154,0xbb1a03c8,0xba548553,0x37110773,0x392fe3cb,0x3a05d024,0x39eb6243,0x395bf1e4,0x390d7088,0xb9cb562a,0xb94a042a,0xb941c0dc,0xbb21f24c,0xbae29ff4, +0x3ba07dfd,0x3ba5ca3a,0x3c0dbe97,0x3c291faa,0x3c2e49d1,0x3b4d4328,0xb8dc35b0,0x3b17215a,0xba1fc956,0xbaf10b11,0xbae9b2b4,0x3af5ffc9,0x3bf04fdf,0x3c487d7d,0x3bfd67d5,0x3b3107e6,0xbabb9668,0xbba71020,0xbbbfe989,0xbb9864e7,0xbb92b2bc,0xbb1b17b5,0x38ebb022,0x3add46f1,0x3a1c93e0, +0xb87bd408,0x36663668,0xb9641b15,0xb9214b21,0xb8f51d3d,0x383433f1,0x388ad0fd,0x39906a09,0x3ae90f0a,0x3b4783eb,0x3b7d956c,0xbaa35d55,0x3acf8ef3,0xb91c3427,0xbb2f5bcd,0xbb8d4394,0xbc0c4cb7,0xbc0561e7,0xbaaa19ec,0xb8ceb2c9,0x3b62c736,0x3bedfc22,0xbadaaa72,0xbc000be7,0xbc0f0a2c, +0xbbafdaef,0xbaa19b36,0x3b1723d1,0x3b2233d9,0x3a8f092a,0xbaab5006,0xbab82856,0xba46d076,0x3934eaee,0xba25b771,0xb98f6f57,0xb7a09592,0x37ab6596,0x38ad5b55,0x38ab6cc9,0x38702cf0,0xb7ed1077,0x372714db,0xb9987e20,0xb9081752,0x39bda866,0xba95bd7c,0x3bdbee57,0x3c2be074,0x3b906c89, +0x3b10e616,0x3b0ac707,0x3c0f1456,0x3c1ddd19,0x3bf1f3e9,0x3b15c131,0xbb483c33,0xbc033189,0x3ad235b3,0x3bf5be46,0x3c1aeeed,0x3b612df9,0xb98cac54,0xba534c32,0xbaad641d,0xb9134656,0x3ae03a3c,0x3ad14094,0x3a6ad374,0x38964318,0x39bd6860,0x38ea399c,0x37f8b785,0xb74b1b9e,0xb824f23d, +0xb84405cd,0xb830a4e7,0x37536af3,0xb7ae03a5,0x392f889c,0x39d621ea,0xbb0ca908,0x3ab89e48,0xbbdbcc2f,0xbc3269ec,0xbc43f307,0xbc2e7ad3,0xbc3eccd1,0xbc4e449c,0xbbeebf35,0x3b8573fa,0x3c035b3f,0x3beb7c76,0xbac2a353,0xbacda0a1,0xbb6eff53,0xbb819b5b,0xbb850a52,0xbb395cdb,0xbac6e5e3, +0xb8de49a1,0x3a70f303,0x3afbc7cb,0x3afcb0cb,0x3a4e21cf,0xba1dee30,0xb98144d8,0xb8a6e6a2,0xb73ffa5d,0xb700a441,0x38001f1a,0x38279f40,0x382e2cc4,0x38127761,0xb81c78bc,0x388c8214,0xba9fe871,0xbc0c4f68,0xbbfac31b,0x3c59eb31,0x3c35c055,0x3b1fd6ee,0xbb1299e7,0xba95d1f3,0xbaf3a6b1, +0xbb26f5fa,0xbb6e39bf,0xbb9dbdfb,0xbb961917,0xbb754f4a,0xbb4f7aa9,0xbaff492d,0x39173291,0x3a6807c2,0x3ac85eaa,0x3b07b9c0,0x3b2aeb8c,0x3b5b17e8,0x3b80b0a6,0x3b91892c,0x3b6e401d,0x3ad6e1f3,0x39fabb2a,0xb86a9a41,0x389cf21b,0x365393e3,0xb7fd5c97,0xb8795e4b,0xb89e4c44,0xb8b47e6e, +0x386b38d8,0xb933a882,0x3b02eef9,0x3b830fb5,0x3c3411b5,0xb60c4739,0x3aad5806,0x3ac97bac,0x3a9b8206,0x399a8092,0xba4fb5fc,0xbaa06e53,0xbaec1197,0xba99e187,0xba9d32c6,0xbacf9887,0xbad3cd7a,0xbafc7380,0xbb19e20a,0xbb08585a,0xbaeda4f8,0xbae1746a,0xbabbe40b,0xba88bdc4,0xba4cf9e5, +0xb9c9b7f0,0x39b06148,0x3a55dfca,0x39a21ee4,0xb7ccc42b,0xb906e9a5,0xb7bd5a5e,0x38bec29a,0x38ece687,0x39605f02,0x39510478,0x38e9dfbf,0xb97e960e,0xb9c815b6,0xba43f7a9,0xb919fb22,0xbb53a46f,0xbb69eaec,0xbb52750d,0xbb44ea76,0xbb3101e1,0xbb07fc50,0xbae15acc,0xbac73d23,0xba4dd5e3, +0x38688705,0x3a73218e,0x3adf9ee7,0x3b1fb80d,0x3b4e31cd,0x3b2ad9f8,0x3b072560,0x3ac8a862,0x3aa62651,0x3a85bf1f,0x3a2a7c10,0x3a694447,0x3a8fd3ed,0x3aa6e44f,0x3a54766e,0x3a198694,0x38d77774,0xb7f09ac4,0xb9e51285,0xb9b74eb4,0xba4a1764,0xba85cbee,0xbacbad74,0xbb003982,0xbb20005f, +0xbb373819,0xbb4a2820,0x3a046e3a,0xb9226823,0x38e3ae09,0x39b9127e,0x3a0d6174,0x3a55ade0,0x3a96af4b,0x3ac2b4e7,0x3ae14df7,0x3aeb31f5,0x3aee85d5,0x3af10401,0x3af35cf4,0x3b03dbb0,0x3afe161e,0x3b04d1ef,0x3b06991a,0x3b088fac,0x3b0afd05,0x3b06e9fa,0x3b01ce1a,0x3b1c09a6,0x3b2b826d, +0x3b389413,0x3b465901,0x3b522577,0x3b3a0ee3,0x3b238280,0x3b11c09a,0x3aea85a0,0x3ac10938,0x3aad3cca,0x3a928e68,0x3a843d47,0x3a6b8dea,0x3a03a0eb,0x3abd7271,0x3aa812fb,0x3ac67609,0x3ad35f11,0x3ae44773,0x3aec918c,0x3af245d9,0x3afa068e,0x3aff440f,0x3b0640be,0x3b0e1694,0x3b161dde, +0x3b1bef0e,0x3b20728b,0x3b1f6207,0x3b1dd1da,0x3b1c30e4,0x3b19a80b,0x3b16f43e,0x3b18d858,0x3b0f0735,0x3b09e476,0x3b009eb4,0x3b16e9fe,0x3b120d83,0x3b1b94f6,0x3b11bcd8,0x3b0d29e4,0x3b03e288,0x3b0033ce,0x3af086c2,0x3ad69ae1,0x3ad19391,0x3acdce7e,0x3abe6629,0x3abf3b30,0x3b276dcc, +0xba2f6a59,0xb9de0d3e,0xb9a2ed5b,0xb9b5d3f7,0xb9af6ee7,0xba04f97c,0xb9265bfe,0xb9546db5,0xb9eea3d6,0xba272632,0xba26ba76,0xb987894e,0xb9e40af0,0xb9f818ea,0xba16fb5e,0xba450da1,0xba43b722,0xb9cfc7e4,0xba0f84f4,0xba174cc2,0xba416ce8,0xba2215cf,0xba16ba93,0xb97e27b7,0xba7fb1d6, +0xba7b1ddd,0xb9b7927c,0xba3d971d,0xba2f9d57,0xba06516d,0xb9d7b918,0xb9d99614,0xba1c4795,0xb9f7b9fa,0xba15d612,0xba16bc75,0xba008d7f,0xb9eb9d2a,0xb9570308,0xb9abf42f,0xb9c6fd6e,0xba545465,0x39a52235,0x39eb6ab5,0xb8a59b9e,0xba3df7a6,0xba3b3b00,0x392d0ba9,0xb9a383f5,0xba5df063, +0xbab8bab2,0xbb040cf5,0xbae17212,0xb9d750fc,0xb9e5215c,0xb9d655cd,0xba471ebf,0xba193acb,0xba5c2f40,0xb93e1046,0xbad2b844,0xbae15c6b,0xba0058a0,0xbafc2874,0xbb05cfb3,0xbac9382b,0xba34d5b5,0xb9d0214b,0xba43d430,0xb9fbabfb,0xba23ae11,0xba8754c1,0xba401d56,0xb8b8e437,0x3a5f1392, +0x3a05e38e,0x3a5e71ed,0xb9018775,0x3af24627,0x3af08554,0x3a65f26e,0xba1aecd3,0xba6e2adc,0x3a520cd1,0x39bdc952,0x3924346a,0xba40300d,0xbaf232c0,0xbae91c27,0x399e89c0,0xb9a67bca,0xb9fcfecc,0xba929837,0xba804cb0,0xbaa63204,0xb8800c29,0xbb334358,0xbb1766fb,0xb9e290d2,0xbac40cc0, +0xba6b271a,0xba52f411,0xb9e02b3e,0xba0c500a,0xba5a9a3e,0xb9a0fb02,0xb9c6279f,0xbaa5ddcc,0xba38078d,0xba28ce0d,0x38c1a05f,0xb952e28a,0xba522b24,0xbb06a7c4,0x3afc80b3,0x3b4c3e76,0x3aff700c,0xba2040d0,0xba2cbca2,0x3ab0cacd,0x3a362c7e,0xbad7045f,0xbb81bcdd,0xbbbfbc09,0xbb8a2137, +0x393ba460,0x3a0ef652,0x39b0e58d,0xba1a5902,0xba74c7f0,0xbaabbecc,0xba28f1d5,0xbaebdc56,0xb967632e,0x39606463,0x399af3b9,0x39dd1fc0,0x3998254e,0x39250852,0x392dd775,0x37b1202f,0xb861b52c,0xb9403fcb,0xbaf31e81,0xbabee6af,0x3b7af82d,0x3b812d39,0x3bfd818a,0x3c1e4d8c,0x3c323681, +0x3b850a66,0x3a872e7e,0x3b437fd7,0xb870fcee,0xba9ddabc,0xba42d99b,0x3b0868a7,0x3bed81fe,0x3c4589d0,0x3c1624f1,0x3b962724,0xb8fbfa7e,0xbb83b0ea,0xbba3d811,0xbb82aea5,0xbb6c9dc5,0xbab34f38,0x3a6176cc,0x3a7fe91a,0x395b9ae5,0xb8c852e2,0xb8dedfc4,0xb9431726,0xb910b634,0xb8928f48, +0xb890a376,0x37e0f88e,0xb85c41ab,0x3a46dc8a,0x3aebc829,0x3b2cbd0d,0xba531a22,0x3b0cf2c6,0x3aa621c4,0xba7d4e1c,0xbb333b0e,0xbbedb7e7,0xbc003f4a,0xbb1f318e,0xba60563c,0x3b431c61,0x3befa112,0xba072b97,0xbbdb16d2,0xbc113f93,0xbbc32197,0xbb00d0ce,0x3abdaaa8,0x3ae85783,0x3a23b5f4, +0xbad31a67,0xba9b682e,0xb9f96c9b,0xb809bf46,0xb9fdf93c,0xb8c1f8a0,0x3811b6b7,0x3876d916,0x38c044b4,0x388e1716,0x388029c9,0xb64118d5,0x38b8a295,0xb9226111,0xb89373e0,0x3974c9fd,0xba0a927f,0x3bfe6680,0x3c3324b0,0x3bcec4c3,0x3b2ec162,0xb995f897,0x3c09d450,0x3c2b46cc,0x3bf9d103, +0x3b8ce9cb,0xbae1ce38,0xbc0fe6c9,0xb9afded2,0x3bc37991,0x3c25121b,0x3b95b446,0x3a665341,0xb928fbe6,0xba11abec,0x39c74b6e,0x3b03162e,0x3ac61fda,0x3a44fdf6,0x39473398,0x39641042,0x386556e4,0xb79f284e,0xb821c87b,0xb85f79c9,0xb86cff8d,0xb810b955,0xb84ad755,0x371d9575,0xb8d9b4b3, +0x3a3de6bc,0xbaf44f08,0x3ae20a9c,0xbbde8b7b,0xbc8ea502,0xbc42bec8,0xbc0579bd,0xbc1fd022,0xbc374e61,0xbc0547c4,0xb63dd46f,0x3bff2786,0x3c0e0d30,0x38bd7532,0xba51306f,0xbb6e49bf,0xbb886bd3,0xbb901d05,0xbb540247,0xbb0a9f11,0xba6f96d7,0xb91b35a3,0x3a58416f,0x3a83dc34,0x36abee2a, +0xba39b02a,0xb855a68b,0xb7ddea64,0x37b05a7b,0x380a4a04,0x388011ae,0x385f3496,0x389b33f8,0x38188221,0x38a97ca0,0xb7b4db75,0xb954103b,0xbbb9cc02,0xbb8c8ac6,0x3c416778,0x3c2e0f7f,0x3ace9aeb,0xbb637343,0xbb1aa783,0xbb2e1760,0xbb1bd649,0xbb2d1f0e,0xbb873940,0xbb8b9e02,0xbb66164b, +0xbb388af8,0xbad04af6,0x3952b6ed,0x3a6ad7fe,0x3ac6a8fc,0x3b10b21d,0x3b39703b,0x3b68831d,0x3b842568,0x3b8bf54e,0x3b425d69,0x3a8698f3,0x38e73b32,0xb895ac24,0x374980cc,0xb8a2daf3,0xb8a9d13c,0xb8f0a45a,0xb8c6b2d3,0xb939b0ed,0x37c362b9,0xb9cb0860,0x3ab18eb0,0x3b5b257e,0x3c0e08b5, +0x3a83c20c,0x3b182a26,0x3b14b48d,0x3b13c8c4,0x3abcecf4,0x39710802,0xba3cab24,0xbae197ce,0xbad79c08,0xbae83281,0xbb079f1d,0xbb0a474e,0xbb21e0a2,0xbb468c3b,0xbb27f654,0xbb05d28c,0xbad44953,0xba9f01d2,0xba3eb341,0xb9df9c9b,0x38fb560d,0x3a3a2e84,0x3a5ebf7c,0x398436e6,0xb74da69d, +0x3888bf3c,0x3909a815,0x3957d4d5,0x395674b3,0x398dfc4d,0x3998d9e6,0x399ffea7,0x39046d03,0x398ec4c3,0x37c6d81c,0x3a4f3e81,0xbb40c33a,0xbb4802b5,0xbb2c0419,0xbb2627f6,0xbb123b02,0xbaec4ff2,0xbacb6fb2,0xbac26d13,0xba657587,0xb9820260,0x39de2fe8,0x3aa3d293,0x3b06e662,0x3b3ba0c6, +0x3b2091b1,0x3b028796,0x3acc016c,0x3ab779dc,0x3aaa97a6,0x3a8b43fd,0x3a73a4fd,0x3a6f25f0,0x3a5edb61,0x39c265d3,0x38b823b2,0xb9aa13b7,0xb9cb41a2,0xba1e2f57,0xba013734,0xba44c962,0xba791267,0xbaab11eb,0xbae7bc88,0xbb182e6a,0xbb2fec39,0xbb39bf29,0xb9c9161e,0xba89f76f,0xba3031ba, +0xb98f4164,0x386f1f46,0x39cc8a15,0x3a523214,0x3aa075df,0x3ace1675,0x3aed1901,0x3b019513,0x3b0a3aee,0x3b1113a7,0x3b22a98f,0x3b1baab3,0x3b20ec42,0x3b21b6be,0x3b228c11,0x3b2232f7,0x3b2056eb,0x3b18ed20,0x3b252dd2,0x3b271526,0x3b26b735,0x3b2698bd,0x3b1f5f72,0x3b057aad,0x3ad7f1c4, +0x3aae849e,0x3a725abd,0x3a1e318e,0x39fa61f1,0x3998a0d2,0x3981e8e3,0x38cbce83,0xb9b49e5d,0x3ac01b9b,0x3a99de9f,0x3abe9932,0x3acc1c84,0x3addf216,0x3aed5a2c,0x3af88d43,0x3b01bc44,0x3b0715e5,0x3b0f823d,0x3b19afd8,0x3b244f28,0x3b2d3309,0x3b36010d,0x3b330711,0x3b30c5a0,0x3b2e4901, +0x3b2b43fe,0x3b281115,0x3b27885e,0x3b22e361,0x3b1e755d,0x3b1aa4a5,0x3b204eaa,0x3b1f0bb7,0x3b2bd874,0x3b23fd07,0x3b1eb050,0x3b15e825,0x3b0fefac,0x3b06dd62,0x3af021f7,0x3adcddef,0x3acaef74,0x3acf4f21,0x3ac6c86a,0x3b3543b2,0xba5d6937,0xba1b51c1,0xb9ea2f66,0xb9ec3107,0xb9e85042, +0xba3135cb,0xb9ac0ec5,0xb9b9610b,0xba02e4c3,0xba472153,0xba5255ba,0xba22558a,0xba172413,0xba1d884c,0xba497d30,0xba8308e1,0xba84f1c1,0xba2fc950,0xba457ecf,0xba48bff0,0xba74c469,0xba599ea0,0xba4f3dae,0xb9efadab,0xba955631,0xba90ce49,0xb9e43153,0xba6548dc,0xba5faa78,0xba21a004, +0xba10c2f8,0xba09e2ca,0xba19253a,0xba2c594f,0xba4785b2,0xba459f7c,0xba31ed5a,0xba179d5c,0xb99d38e6,0xb9a38acf,0xb9da0f06,0xba84fc31,0x3813b1e9,0x395bb15b,0xb7b3a240,0xba5cec9b,0xba7e5382,0xba0bfed7,0xb9cc9aef,0xba5d4df9,0xbadaded1,0xbb242a3c,0xbb194563,0xba87d368,0xba6618aa, +0xba42ce02,0xba91e0a7,0xba6137e9,0xba8550bd,0xb9b45f13,0xbadb78e8,0xbaed98a9,0xba1cd020,0xbb0b3482,0xbb0c8968,0xbaae7e34,0xba3e3598,0xb9e9f111,0xb9faf954,0xba1f53de,0xba4f4f90,0xba85fc83,0xba516b5f,0xb8ef65d6,0x3a428488,0x3a317c21,0x3a6f0bc4,0xb9b52592,0x3ac9fe32,0x3ad00719, +0x3aa2ca5f,0xba1bcd99,0xba91686a,0xb9ddca56,0x39a8a0f3,0x3939d553,0xba896d9c,0xbb279bb5,0xbb2d3856,0xba07df86,0xba5a9a0c,0xba584de5,0xbad01e05,0xbaa47635,0xbab43494,0xb98723ee,0xbb251a8e,0xbaf9e6e5,0xb916b654,0xba6726fb,0xb9ba6fae,0xb99a6b88,0xb8f1c8a8,0xb980dbc6,0xb95d19fe, +0xb9a6ef51,0xba1243d2,0xba93de9e,0xba32dd6d,0xb9f3d9e3,0x396449dd,0x3967d334,0xba15402b,0xbb1ab54a,0x3a9f9ed5,0x3b281eec,0x3b1d590b,0xba14c79b,0xbaa62594,0xba1aef04,0x3a2d5a4b,0xba972349,0xbb8c72f1,0xbbe99325,0xbbc56b01,0xbace2dc6,0xba2146b8,0xb9f35a0d,0xbabb04fa,0xbab153d9, +0xbab67d6d,0xba1e066f,0xba910cda,0x397a87d4,0x394c2ffb,0x398a3fa7,0x399306be,0x3915d3c7,0x38cde4f9,0x38999afc,0x3890e61d,0x3854e47f,0xb91495e5,0xbaa71b20,0xba902d4b,0x3b5bb28a,0x3b5ede58,0x3be450fa,0x3c14f6ca,0x3c363ec4,0x3ba06efb,0x3b026e49,0x3b5ae287,0x39cc1d81,0xba2d0067, +0xb8f29237,0x3aeca62f,0x3bd46b96,0x3c3659e9,0x3c26b047,0x3bcf5361,0x3a8cdd76,0xbb3c3f2d,0xbb87bb73,0xbb654423,0xbb3c78ac,0xba20dbab,0x3a8b43ba,0x39c70856,0x38725251,0xb9178c99,0xb8d4a622,0xb91934d9,0xb89bcc98,0xb85ef039,0xb81fa69b,0xb8051b2c,0xb82cadd1,0x39626409,0x3a7b530e, +0x3af6cafc,0x39bb6b56,0x3b391a71,0x3afe7a60,0x393090c8,0xbaf70213,0xbbcaa73b,0xbbed7f80,0xbb449717,0xba7bbeea,0x3b3a81a2,0x3be4dde4,0x3a126486,0xbbb05abd,0xbc0f02b4,0xbbd8c5a0,0xbb45abf9,0x398a2ef0,0x3a73d9b0,0x3967fc02,0xbacf6044,0xba3da8de,0xb94db137,0xb93d9f96,0xb986b973, +0xb70790d3,0x38659854,0x388b3227,0x38985608,0x383c9cee,0x3831a60a,0x373b9eae,0x386e1549,0xb7a0475f,0xb90e2342,0x39777a12,0x398c0ef9,0x3c0c8c14,0x3c2cb02c,0x3bc01b08,0x3ab559ed,0xbb593866,0x3bea61f0,0x3c2c7763,0x3bf99d9a,0x3bcbbbeb,0xb8ad38dc,0xbc0d1806,0xbae3cd0e,0x3b940cfa, +0x3c26499c,0x3bc2477e,0x3b253425,0x3a38c3fc,0x399587ad,0x3a474469,0x3af3ff8e,0x3a8ef11b,0x39de7267,0x3953695c,0x38d3247a,0xb6d34f8b,0xb8049e39,0xb8573d77,0xb83e788d,0xb84f04d4,0xb7a57651,0xb88f44ba,0x38502aa0,0xb97974f7,0x3a27fafa,0xba9a80ef,0x3ac801c6,0xbbea9d86,0xbcbac8ba, +0xbc3ecadc,0xbbbc292e,0xbbf5be66,0xbc15ec4b,0xbc0ab342,0xbb886e40,0x3bd6c4da,0x3c170db6,0x3b0849f3,0xb917a1e4,0xbb6c926d,0xbb84128c,0xbb91daa9,0xbb643d9a,0xbb2a395c,0xbacf937b,0xba8ba61d,0xb99c0cfc,0x3692d682,0xba1e9f7e,0xba07fa2c,0x3899a1a4,0xb7aa6977,0x3865bead,0x384634e8, +0x3889f274,0x3841cf62,0x389e8ae1,0x37c9931f,0x3902551b,0xb86d847e,0x397e6ec9,0xbb3a2415,0xbb02b778,0x3c07b037,0x3bfe17b0,0x377de9dc,0xbb95dece,0xbb7e6ffa,0xbb6e3c75,0xbb1f2a7a,0xbaebc0aa,0xbb6226c8,0xbb853453,0xbb6d4fcd,0xbb399e79,0xbace05e9,0xb867c915,0x3a389bd5,0x3abfbfd3, +0x3b21d752,0x3b4a7cf9,0x3b722f17,0x3b809903,0x3b726999,0x3b10e8a7,0x39fc656a,0xb8862528,0xb84d18f0,0xb882bd28,0xb8cc7cc7,0xb8cd50e0,0xb8e5d236,0xb8c3d9a2,0xb9268e6f,0xb7f99933,0xb9baf23f,0x39d5a558,0x3b29eb81,0x3bab6dab,0x3af0b808,0x3b3b7da3,0x3b2c52be,0x3b3ab699,0x3b02241c, +0x3a5b61e0,0xb9e640e7,0xbad4b609,0xbb0bab4e,0xbb16dfc2,0xbb24063a,0xbb23d80b,0xbb398e6b,0xbb5fd71f,0xbb2f86c9,0xbb0159b5,0xbab22d89,0xba61f764,0xb99e8713,0x38cd50b5,0x3a2188bb,0x3a81ee53,0x3a48ba2b,0x39412332,0x3881eb41,0x39332a66,0x393b6b4a,0x39692caf,0x394e2a9c,0x397cf175, +0x39804217,0x39a47dbc,0x39929d45,0x3a1acd23,0x3a1f8263,0x3aaf6a4f,0xbb2a05de,0xbb29b0c0,0xbb107527,0xbb12a20c,0xbb01bb62,0xbadb704c,0xbac3b008,0xbac54891,0xba8a68a7,0xba342f96,0xb992c24c,0x39fb4e83,0x3aa4ab28,0x3b05cfe1,0x3aeb8e7d,0x3ac4dd29,0x3aa01dd4,0x3aa0fca1,0x3aa0c008, +0x3aa68c6d,0x3a7a21eb,0x3a31d51c,0x39f05e73,0x377e4527,0xb983c3b7,0xba00beb7,0xb9e569b9,0xba088b46,0xb9db8da2,0xba05ae0e,0xba260e21,0xba6a4b48,0xbab6b5f5,0xbb01bf5b,0xbb1e8db1,0xbb21a66b,0xba9a7878,0xbaec98a7,0xbab0c951,0xba644ac3,0xb9f5d029,0xb91612fc,0x399065eb,0x3a3c6b22, +0x3a9476a4,0x3ac3f93c,0x3ae9fda6,0x3b03e50a,0x3b0ff13c,0x3b2817c0,0x3b204930,0x3b24600b,0x3b23fb08,0x3b248e0a,0x3b220274,0x3b22943e,0x3b21a301,0x3b16edb8,0x3b0c88ce,0x3b018a0f,0x3aef6db8,0x3abea216,0x3a8ab61b,0x3a322b12,0x39cd8b07,0x360189ce,0xb99f3066,0xb9cbc0a8,0xba10783d, +0xba0eed75,0xba39d232,0xba9633c1,0x3a9a0bb3,0x3a59127c,0x3a924b40,0x3a9daf69,0x3aae7252,0x3ac175e6,0x3acf58ca,0x3ada6ce9,0x3ae83ebb,0x3af99df1,0x3b078d0b,0x3b131e67,0x3b1d7456,0x3b2891b9,0x3b250411,0x3b235c75,0x3b214762,0x3b1e9f7a,0x3b1ca068,0x3b18c603,0x3b1c2e1f,0x3b1bae0f, +0x3b239895,0x3b0dbf5c,0x3b134cbe,0x3b267308,0x3b203a04,0x3b197685,0x3b104e07,0x3b096171,0x3b00138b,0x3ae17f5c,0x3abe1c5f,0x3a9ccbc1,0x3ac25233,0x3aa87a97,0x3b242d15,0xba72db60,0xba2e4fd8,0xba179a28,0xba0c11ff,0xba0d9c2c,0xba562a7d,0xb9ed57ee,0xb9e17a58,0xb9de7661,0xba442f5d, +0xba59a057,0xba5def48,0xba1fd44e,0xba23da80,0xba5e6a43,0xba91a9cc,0xba96b12b,0xba60efaa,0xba646ffc,0xba646c3c,0xba86ba3b,0xba6fab06,0xba68da3f,0xba248709,0xba959559,0xba8ff6ac,0xba08f097,0xba84ccc9,0xba85f3d7,0xba38e0eb,0xba2fabc0,0xba201dc5,0xba0f43f9,0xba3f3f19,0xba5b46e2, +0xba5ac040,0xba441999,0xba198fac,0xb9eea89d,0xb9d3f4e0,0xba0bd425,0xbaa25cbf,0xb96998c1,0x388cb935,0x397179e5,0xba392454,0xba7dfec1,0xba84fff1,0xb9b45359,0xba384cc1,0xbae0940c,0xbb2f9afc,0xbb2e6955,0xbac66980,0xba9c8a9c,0xba7f8e96,0xbaac46a6,0xba864cda,0xba8c638f,0xb9eb1a80, +0xbada1af3,0xbaf1fd7e,0xba33181e,0xbb02503b,0xbafa0bdd,0xba8791e1,0xba1f8654,0xb9cade71,0xb945c56b,0xba3158f1,0xba6af833,0xba73e0ea,0xba59616d,0xb917cdea,0x39e6bff1,0x39f8fd37,0x3a2900fa,0xba4ef66a,0x3a913e06,0x3ab52a90,0x3af24714,0xb979f9c6,0xba71aeb7,0xbaa79447,0x39edceca, +0x39b8dc64,0xba922be7,0xbb3aede7,0xbb4bd3cb,0xba9e357a,0xbaa09292,0xba8b2833,0xbaf54f0d,0xbab835e1,0xbab4e882,0xb9ef0a62,0xbb075456,0xbaa70cf7,0x38f9ffd6,0xb9c1d11d,0x38f99b28,0x37f71616,0x384baaa0,0xb8c1fb5f,0x38f9d0f9,0xb97a8cbb,0xba26e4f6,0xba7f830c,0xba35acf9,0xb9cc7c49, +0x366f4d82,0x38c9e819,0xba408c78,0xbb3bde0a,0x39dffb58,0x3b0c05ef,0x3b53b699,0x37e3d4ad,0xbaaee2b3,0xbb089ca8,0x3a3990aa,0xba06ea57,0xbb879a3e,0xbbf7aa76,0xbbe7c113,0xbb479ccf,0xbacf672a,0xba8df9ca,0xbb03e69e,0xbad77cd0,0xbab0f9b3,0xba06719c,0xb9e1bfbf,0x39ea4fb8,0x3839bcc3, +0x391dd04c,0x383f6a9f,0xb79fb5c0,0x379c99c5,0x37db56aa,0xb7bf494d,0x38b1fe20,0xb70b00a6,0xba5baa61,0xba64b28e,0x3b28254f,0x3b1aa4d7,0x3ba8f532,0x3bed3827,0x3c263d17,0x3ba82170,0x3b32d338,0x3b6e0806,0x3a9e6984,0x3a00d398,0x3a9ab5e8,0x3b08525c,0x3bc07566,0x3c228bed,0x3c2f39bc, +0x3bfb9235,0x3b0b0396,0xbae11e65,0xbb542420,0xbb442cda,0xbb0ea802,0x37298653,0x3a6bb4ef,0x3779dcf2,0xb84c45e0,0xb8d802bb,0xb82660b2,0xb83f6d7d,0x37187e21,0xb784e912,0xb6c0c869,0xb730cc5c,0xb7d12fe3,0x363026c7,0x39af938e,0x3a9c2542,0x3a4b88b3,0x3b2590f0,0x3b1739cd,0x3aabe752, +0xb9d98052,0xbb95d1aa,0xbbc9786c,0xbb62ff69,0xba5f88e8,0x3b3fa16e,0x3bdf1b8c,0x3b0819ec,0xbb528e4a,0xbbf0d2b8,0xbbd16211,0xbb6c35f0,0xba2f4007,0x39a0a774,0x38e9ae4d,0xba97c204,0xb97fad7f,0x36d0b1cd,0xb98c2601,0xb8c970f9,0x3885834f,0x382892cf,0x38152b40,0x37b8f592,0x3683477d, +0x37520689,0x36eab98c,0x378591e2,0x38509f3f,0xb8ceb845,0x38c96fab,0x3a2d9b9e,0x3c01bc36,0x3c1ef64c,0x3bc7a0ea,0x3a9af1c6,0xbb8b289d,0x3bc1e556,0x3c20f9e7,0x3bde3277,0x3be207bc,0x3a73516f,0xbc0248c7,0xbb39b978,0x3b44c676,0x3c1abe61,0x3be84a6a,0x3b8ec9ca,0x3af92c48,0x3ab88bd1, +0x3ab2bc51,0x3ae11664,0x3a269237,0x392dd6a5,0x393422b1,0x379cd6d3,0xb7f4e49d,0xb81302ed,0xb800770a,0xb79b82c9,0xb78ed5ff,0xb65dae78,0xb84081f4,0x383a10c4,0xb950c16c,0x39d12b26,0xba4268c7,0x3a900921,0xbbf3cf95,0xbcc2d334,0xbc187d58,0xbb2b8791,0xbb956fea,0xbbcbad19,0xbbf9aa43, +0xbbedcbd7,0x3b8e75b4,0x3c080ed0,0x3b69fc8e,0x39312e35,0xbb6b1e1c,0xbb7e59ae,0xbb92dfc5,0xbb742d08,0xbb4219a0,0xbb0cd4b4,0xbaeeb553,0xba98c8fc,0xba49f590,0xba5b0033,0xb946611f,0x38912b18,0x37b7d166,0x38584ed3,0x38265591,0x380cfbe5,0x37afc517,0x380ca873,0x37ed33e0,0x38844f1b, +0x37f3ed20,0x392f5dd0,0xba73b8a2,0xba3c5795,0x3b879d74,0x3b83ca0c,0xba81c207,0xbb9137b7,0xbb915bb6,0xbb7a2098,0xbb136172,0xba9f1319,0xbb41ee41,0xbb816ccf,0xbb7288d5,0xbb3f6915,0xbadf5811,0xba077fd7,0x398aa1e7,0x3a96b0f9,0x3b1c5d67,0x3b4b6f3f,0x3b6e7b80,0x3b77527a,0x3b4e1162, +0x3acc794e,0x38cd4ec8,0xb9059951,0xb83e1d15,0xb8bd30ba,0xb89ec35e,0xb8802501,0xb847130e,0xb869a1c9,0xb8a93e93,0xb8ce7fab,0xb8b0cddf,0xb9c5c010,0x3ade483d,0x3b197bc4,0x3b1a091f,0x3b6661bc,0x3b4e263c,0x3b5d1af7,0x3b1eba27,0x3aa0c291,0xb98ee8e2,0xbabb8472,0xbb1b9788,0xbb2d687e, +0xbb3b8928,0xbb351a27,0xbb45196e,0xbb6a93f3,0xbb2d68b7,0xbaf64969,0xbaa49bb1,0xba18b0f2,0x388ad105,0x3a1f796a,0x3a8bd0cf,0x3a94446d,0x3a246c00,0x391dd67e,0x390bbb3c,0x3947a7fe,0x39230237,0x39059619,0x38bcebfd,0x38ef0b99,0x392e64c7,0x3961954b,0x39819f1c,0x3a09eafc,0x3a76640f, +0x3ad28a38,0xbb086094,0xbb032dbb,0xbadd49fc,0xbaeea765,0xbad52607,0xbaba8793,0xbaab165f,0xbab771f6,0xba8f96f8,0xba7568f6,0xba462462,0xb984d201,0x399bef22,0x3a5e3da5,0x3a5202e5,0x3a365d8c,0x3a1cf404,0x3a381e25,0x3a4793b5,0x3a7f6455,0x3a12bf12,0x39472d42,0xb816e65a,0xb9b0fbfa, +0xb9faa860,0xb9e2b047,0xb9b7b926,0xb97eaf0f,0xb925f2c1,0xb94787dd,0xb9adb3f8,0xb9e99e67,0xba75e43a,0xbabd60bc,0xbb00de83,0xbafc805e,0xbae4d815,0xbb075dcf,0xbad122da,0xba92d5f6,0xba3b3e76,0xb9e76abb,0xb891bea4,0x39b4ae61,0x3a403d3c,0x3a91acf1,0x3abcbe48,0x3add14f7,0x3af896bc, +0x3b13dcc9,0x3b0ea7eb,0x3b1287ca,0x3b1387c3,0x3b15b8f9,0x3b150424,0x3b1924d8,0x3b14b245,0x3afb665a,0x3ad58887,0x3ab0da9e,0x3a8d3fd1,0x3a1fed31,0x3990412d,0xb82e1029,0xb9a262fa,0xba1b3a3a,0xba602541,0xba80a8d5,0xba923c74,0xba93aebf,0xbaa52463,0xbace0743,0x3a52c1ca,0x3a0575ea, +0x3a3ec8e0,0x3a528a7c,0x3a6ef127,0x3a8b4d13,0x3a99b5cc,0x3aa4011d,0x3ab1003f,0x3abffe4a,0x3ad26fbf,0x3ae8066c,0x3afc2e10,0x3b094172,0x3b06c7d3,0x3b065362,0x3b0533f3,0x3b03ad48,0x3b02b975,0x3afe6ae9,0x3b03ac7f,0x3b042d5f,0x3b0e7e02,0x3ae0fd2f,0x3aeeec2b,0x3b075850,0x3b0112ba, +0x3af1656b,0x3ae00988,0x3acf1d88,0x3abe38e0,0x3aa459b2,0x3a867089,0x3a50b00c,0x3a8c83f2,0x3a67a32a,0x3b041c71,0xba7706a3,0xba46f50b,0xba296bc4,0xba176f52,0xba18892a,0xba64bd12,0xba0a08e5,0xb9f73179,0xb9b16856,0xba3b71f3,0xba5928c0,0xba841466,0xba2088c2,0xba1f4881,0xba5fbfaf, +0xba91aaab,0xba992d21,0xba7d1258,0xba6ec6d5,0xba6bedca,0xba8520f9,0xba7d2d61,0xba7d8989,0xba4644a8,0xba8f22bb,0xba8c6dbe,0xba21c9ad,0xba91be8b,0xba9254a9,0xba46b6c1,0xba411b6b,0xba2eab34,0xba02d32d,0xba52bfee,0xba6892ca,0xba6d71db,0xba5e0c6e,0xba3f204a,0xba1e7a25,0xb9ec294b, +0xba1b722e,0xbaac8333,0xb9d563ae,0xb86398be,0x39d6857b,0xba21c39b,0xba81910b,0xbaba38b7,0xb9ac1cf8,0xba10c5ae,0xbad5237c,0xbb298b1f,0xbb30f9b7,0xbaef8b84,0xbab48cb6,0xba8e1787,0xbab2a0d2,0xba903fb5,0xba854201,0xba0b9843,0xbad1806b,0xbae6f0f8,0xba34aa5c,0xbad710cd,0xbac4152c, +0xba410f4e,0xb9f8b32e,0xb99242d7,0x3850b89d,0xba314b1e,0xba7ce7c2,0xba652ff9,0xba5e191c,0xb9a7ad16,0x38605322,0x39c4a58a,0x39e87914,0xba833bea,0x3a41ab9b,0x3a91c430,0x3b112245,0xb8549dad,0xba5711ee,0xbb022712,0x39fe7ddf,0x3a04ae85,0xba8849c5,0xbb34766f,0xbb4ebcd5,0xbadf8e22, +0xbabba531,0xba949c29,0xbaf999ab,0xbab6b18f,0xbaa69e5b,0xba1b729f,0xbabda419,0xba1b70af,0x3965c830,0x389f788a,0x39972c7f,0x390e6584,0x38fc2c11,0xb7d08cfd,0x392899d4,0xb91eb243,0xba27b469,0xba6f2758,0xba3a6cbc,0xba13834b,0xb9b50418,0x38c2e2d7,0xba4c5c10,0xbb44c528,0xb95b43ea, +0x3ada1b40,0x3b6fa6b6,0x39a080a8,0xbac7af11,0xbb5ad0d5,0x3a19bc90,0x37af6ece,0xbb7338cf,0xbbec796c,0xbbef4235,0xbb873089,0xbb14f9b4,0xbabe2920,0xbb11f2ff,0xbadec841,0xba95c14c,0xb9b6b6f0,0x3814e717,0x39c34c61,0xb879d998,0xb70d2966,0xb88a9f83,0xb851f96b,0xb7cec82c,0xb6a1fd23, +0xb8395fc7,0x38aecaba,0x3907fc58,0xba0e8acb,0xba3f09ea,0x3afcd778,0x3b060779,0x3b845fec,0x3bc22c76,0x3c1c6e16,0x3bb2adb7,0x3b57be5d,0x3b5dd29f,0x3af8fcbd,0x3acdb0c0,0x3b0ef5c0,0x3b21e843,0x3baf1e56,0x3c0ead70,0x3c2fb901,0x3c0befd7,0x3b4b51e1,0xb9e99fe7,0xbb0c3c79,0xbb1886ca, +0xbabffb7e,0x39db5d84,0x39f2a95e,0xb8ac6c96,0xb8e16898,0xb7c945ef,0x37a1e369,0x3764ae2e,0x37d42afa,0x36db0ad7,0x368a4c4d,0x3775f1ba,0xb8844949,0x381f6477,0x38202253,0x3a3ba10d,0x3a93c419,0x3b22543c,0x3b3cef5a,0x3b2462c0,0x3a65db43,0xbb4951fa,0xbba09b84,0xbb662869,0xba6b4eea, +0x3b1881bb,0x3bae49e2,0x3b2304de,0xbaf14b34,0xbbcc90d9,0xbbd0df4d,0xbb91d40e,0xbae91469,0xb9e345b0,0xb8585158,0xba1b990d,0x39866770,0x38a35890,0xb9820b1d,0x3829b336,0x38608dce,0x37955f58,0xb698ef1b,0xb6a2cefa,0xb73b660f,0x35314be9,0xb7116533,0x3747ace8,0x37872a00,0x3741245f, +0xb887f698,0x3a3cdba1,0x3bed3bcb,0x3c116600,0x3ba4a006,0x38ba997f,0xbbb6cef0,0x3b7c1816,0x3c056174,0x3bbd99b7,0x3bdbd3c1,0x3ab0883c,0xbbec92e4,0xbb836c2d,0x3a71f9e2,0x3bf094bc,0x3be63d32,0x3bada2bc,0x3b296dc5,0x3b08f1bd,0x3acf1913,0x3ab27feb,0x39849271,0xb609972e,0x392b0228, +0xb870068d,0xb7ded00a,0xb7c3cf97,0xb62b7a96,0x328d8356,0xb44bffe2,0x36da4831,0xb783f542,0x37dc2203,0xb8ec1a2d,0x392f49ef,0xb9c5f53c,0x3a43c071,0xbbe8361d,0xbcb749fe,0xbbf8ae43,0xba55845c,0xbb1e8736,0xbb67357a,0xbbc7e654,0xbc0b6c4a,0x3b0bfeec,0x3be0c01d,0x3ba8c2eb,0x3a362c17, +0xbb53b685,0xbb704db4,0xbb901758,0xbb80ec6c,0xbb5ef4b1,0xbb320d49,0xbb2435ce,0xbb01b5a7,0xbaa8da84,0xba4b459a,0x38a75c15,0x37ba53df,0x38452f58,0x37e844a0,0x377449b0,0x36c44a24,0x368bd99a,0xb4aa14db,0x371a8ea4,0x376598e3,0x38709329,0x387b98b6,0xb89ef5eb,0xb802d7b0,0x390de6ac, +0xb9e9a2a7,0xbacd664a,0xbb5cb1aa,0xbb8c9793,0xbb590448,0xbae20efb,0xba1ccb25,0xbb07721e,0xbb53ad8d,0xbb5238bf,0xbb288bf8,0xbac297f0,0xba3c8c81,0x37b044e0,0x3a6e654d,0x3b0dafe8,0x3b3781fe,0x3b51aebd,0x3b5578c6,0x3b213d52,0x3a73fac1,0xb92088a9,0xb89fe17e,0xb891327d,0xb881c625, +0xb7ca37a3,0xb7afa109,0xb6233e3d,0xb77b9f0d,0x3762d8be,0xb8cd60a2,0x381c737b,0xb9f883b6,0x3a58743d,0x38cd5812,0x3b3220fc,0x3b7014e8,0x3b53a7e9,0x3b5d5b40,0x3b1c6604,0x3aad1448,0xb940eb0d,0xba9676c9,0xbb18782d,0xbb2c0ddf,0xbb38da9b,0xbb2e9229,0xbb362a4d,0xbb508ac0,0xbb0c0357, +0xbab8c3ea,0xba71f0d7,0xb9711623,0x39e0bff1,0x3a8694d8,0x3aa9295f,0x3a924a72,0x39d0b805,0x390beae8,0x39379423,0x38e1095e,0x3859e80b,0x3807df0e,0x373ad9fc,0xb6bec26b,0x37c3a6d5,0x386324ce,0x39776ad6,0x397c9b18,0x3a7502b0,0x3ad9fc59,0xbacc8f8f,0xbabcc2b9,0xba9ed6f0,0xbab18096, +0xba9feda8,0xba8f7fb3,0xba83d277,0xba915c65,0xba769fb8,0xba777c44,0xba77736d,0xba37b9fd,0xb9cd37ee,0xb8d638a3,0xb7abd573,0x37699478,0x3886cccc,0x3977a6f1,0x39b4ab96,0x3a24a9ea,0x3928c425,0xb92397d9,0xb9972766,0xb9f5fa5a,0xb9e70fde,0xb93ac880,0xb8aa0802,0xb79941d4,0x381bc059, +0x38b7fb4a,0x378fd82e,0xb808002e,0xb9fe169b,0xba674784,0xbab2df65,0xbab5344d,0xbaf06933,0xbb0080d0,0xbaca5950,0xba94e8ca,0xba4c348f,0xba15a9f0,0xb993add5,0x3869e38c,0x39c75c1f,0x3a3d4838,0x3a87bd01,0x3aa6681f,0x3ac14cf2,0x3aea4806,0x3ae90e8d,0x3af2ec64,0x3af98a38,0x3b008640, +0x3b0212fb,0x3b0a0110,0x3b023f0e,0x3ac3c689,0x3a924d02,0x3a4ccf10,0x39e23870,0xb81417c2,0xb9905a13,0xb9f60b8c,0xba2f3013,0xba668e3d,0xba8de38a,0xba9fd5b5,0xbaaecc55,0xbab320ff,0xbac1a0b6,0xbad6cd75,0x39d5cbc0,0x3947e065,0x39b5f59a,0x39d50c9c,0x3a009901,0x3a244aeb,0x3a3ef139, +0x3a50cdc1,0x3a66e838,0x3a7e8d8c,0x3a8db8b8,0x3a9fcc4e,0x3ab172c4,0x3ac505cf,0x3ac2c492,0x3ac3ecab,0x3ac3d99a,0x3ac3e55d,0x3ac45632,0x3abff603,0x3ac930d1,0x3acbef56,0x3ae2de82,0x3a9dc195,0x3aacbd17,0x3ac56e81,0x3ab85ad7,0x3aa55734,0x3a94e18c,0x3a8493f1,0x3a6b8db8,0x3a43f450, +0x3a15ecf0,0x39c75968,0x3a2de293,0x39f8e49c,0x3ab744ed,0xba63a59d,0xba34215f,0xba278240,0xba0bf167,0xba0b6f74,0xba50ef5d,0xba076742,0xb9eb61d5,0xb9695ff1,0xba2527ae,0xba498a5e,0xba8b52f6,0xba191a7b,0xba12e21b,0xba50a7ca,0xba856db9,0xba8e4270,0xba811c52,0xba651544,0xba5ebaad, +0xba734192,0xba619f97,0xba671e1b,0xba45cd35,0xba6db4e1,0xba784ad1,0xba320776,0xba9367d4,0xba93d640,0xba42fca6,0xba396695,0xba2035d9,0xb9c3fcc3,0xba3ef47d,0xba4cda55,0xba5f0798,0xba4bd727,0xba32d6c5,0xba1db869,0xb9c5b1ef,0xb9ffd7d2,0xba956f34,0xb9e722d5,0xb8bb74f9,0x3a1547be, +0xba024fe3,0xba77de3c,0xbad7c71f,0xb9b4990f,0xb9e93668,0xbac00679,0xbb17540e,0xbb251ecc,0xbb02183f,0xbabe72bd,0xba92bf0a,0xbaa8070b,0xba81e308,0xba5e76e3,0xba16e236,0xbac1e55b,0xbac1ca05,0xba058be2,0xba89e7d0,0xba63dd22,0xb9c15382,0xb985f27a,0xb920bff3,0x396f160b,0xba17f592, +0xba762881,0xba3fb3ac,0xba420976,0xb99375cc,0xb91ff522,0x39c542e7,0x39db3757,0xba5cd564,0x3a0268be,0x3a6257c1,0x3b1cddf3,0x3887375a,0xba47f2aa,0xbb220b4d,0x399afd69,0x39e844c1,0xba82f61d,0xbb221713,0xbb412060,0xbb077dd9,0xbacafd51,0xba98c89e,0xbae5ed71,0xba9c8a92,0xba8c13d2, +0xba214662,0xba340c48,0xb7cc8ba5,0x395eb282,0x3924172c,0x3994aee5,0x38e00bea,0x38d1da63,0xb72137e2,0x38b6d886,0x371e5b27,0xb9cbec0e,0xba44113d,0xba196ca5,0xb9f6155b,0xb9e810be,0x39807a2a,0xb9e67824,0xbb1f3ef5,0xb9e410c3,0x3aaf2380,0x3b7c9adf,0x39fb0729,0xbad52f60,0xbb86c79f, +0x3986930a,0x397b99f9,0xbb5392ff,0xbbd10292,0xbbe26739,0xbb9e6591,0xbb36e87c,0xbae54426,0xbb121723,0xbac78c7c,0xba5bc2e6,0xb903ce60,0x396cca97,0x38c63f97,0xb8c27bf5,0xb8598d0b,0xb8de1934,0xb88163b4,0xb8027974,0xb643884e,0xb8339407,0x374511d6,0x3940b641,0xb933b171,0xba0c9549, +0x3acaccb6,0x3ad97a6d,0x3b2869d3,0x3b88b820,0x3c036ac1,0x3ba0e242,0x3b4d3b3e,0x3b2918c1,0x3b0b6c03,0x3b07478b,0x3b11aa9d,0x3b074ca2,0x3b83c83a,0x3bdb20ca,0x3c1c9a67,0x3c07cbd1,0x3b65628d,0x3a0bab0c,0xba9965be,0xbad36abd,0xba433a45,0x3a05c6ca,0x39072ea9,0xb8edaa5a,0xb847d35c, +0x3809dcd1,0x37f4b732,0x38387604,0x3808bc53,0x377e1744,0x3604209e,0x37df3cda,0xb802cdd7,0xb84bc278,0xb4c1f5eb,0x39f39065,0x3aa3e3a2,0x3aee8806,0x3b1a1c7a,0x3b2e05f2,0x3aca131c,0xbaed9dce,0xbb6d40c1,0xbb538b41,0xba3fb770,0x3af2e7a8,0x3b82e4cf,0x3b296b8e,0xba555080,0xbba6d484, +0xbbcd6f4a,0xbbadfd69,0xbb42947d,0xbabac207,0xba0bb6cc,0xb9923f5d,0x39e5ed59,0x380c530f,0xb92c302d,0x38b274b3,0x378578f3,0xb6c9ba60,0xb795cf06,0xb7a253be,0xb7a83c90,0xb6b7d07a,0xb73f3b61,0x35ba9ebe,0xb625982f,0x389338e5,0xb905604d,0x39bbfdc0,0x3bb65714,0x3bebe1b5,0x3b8819fb, +0xb90da3b5,0xbba9dd33,0x3b17e85e,0x3bd17e2e,0x3ba0ea84,0x3bce001f,0x3b0317ab,0xbbb0ef20,0xbb7d67b2,0xb81d1123,0x3bba27f2,0x3be74a37,0x3bcd561b,0x3b656389,0x3b34ff20,0x3aecb4ab,0x3a807bb0,0xb8e443f7,0xb7be0de2,0x38b751f9,0xb889d738,0xb6ab760d,0xb6aca32d,0x3732f4a7,0x3747e3ab, +0x37476d22,0x374d7655,0xb60a1b7f,0x37f8fb5e,0xb883a1ad,0x38c58642,0xb98ef55b,0x399a1a20,0xbbd0002b,0xbc9813d0,0xbbbdc640,0x387d494c,0xb9886bbe,0xba9d3ef6,0xbb8b6024,0xbc065ca0,0x3951bac0,0x3ba79417,0x3bce599a,0x3ad213d6,0xbb091d90,0xbb3cb0d1,0xbb6f5222,0xbb65f8ed,0xbb55ed6d, +0xbb334573,0xbb2acf5b,0xbb18e006,0xbacd3469,0xb9eaad92,0x3918cf80,0xb607d860,0x382b4da2,0xb5685463,0xb5d76748,0xb75daba7,0xb76fef58,0xb77b3121,0xb7136656,0xb78bbdba,0x37e0f1ce,0x37b25b96,0x38993356,0x398d9195,0xbb2f2328,0xbb837867,0xba8d5997,0xba9ac14a,0xbb367759,0xbb059dab, +0xba81412c,0xb99b7617,0xbac57026,0xbb31aaa8,0xbb340d89,0xbb1476f6,0xbaa7783f,0xba51d772,0xb70d2829,0x3a5eaba3,0x3b01f9f1,0x3b24c651,0x3b383a6b,0x3b3a3924,0x3af0c724,0x39eced00,0xb9715a39,0xb80480d6,0xb8639b2e,0xb72df140,0x363ed1ca,0x378c1a05,0x3803a6da,0x37939c50,0x382d79c0, +0xb7944d54,0x3890c7e0,0xb9939b0a,0x3983683f,0xba723b02,0x3b344e65,0x3b6a27ee,0x3b44e9ac,0x3b40e783,0x3b054118,0x3a972ca4,0xb928be71,0xba59cfe9,0xbb091d4d,0xbb2060a0,0xbb2e7029,0xbb2279a3,0xbb21fc16,0xbb2e9688,0xbad18f2e,0xba72b420,0xba0ac4e6,0x39503ef7,0x3a57822a,0x3ab7c853, +0x3ac0327b,0x3a883b97,0x39691668,0x390948a8,0x38bc0687,0x37b38c23,0xb68ad396,0xb829eb9d,0xb868467d,0xb88ad55a,0xb8148dce,0xb8bbbd00,0x38d46bce,0x38322fe2,0x3a234bde,0x3aca19b0,0xba85b375,0xba5dda91,0xba3bda2c,0xba648f8f,0xba5e64ea,0xba4ec08e,0xba41b5ad,0xba5ed91f,0xba4cf337, +0xba65b9a3,0xba82814e,0xba801d9a,0xba6a499c,0xba610bf6,0xba339a17,0xba0fed9c,0xb9d71998,0xb960e35e,0xb8dabde0,0x3963df92,0xb933bd63,0xb9c57939,0xb9c1b601,0xb9d05284,0xb93c1b9f,0xb6a7aa2e,0x37fda714,0x38f5b0af,0x391111b5,0x394019d6,0x390a1b0a,0x397dadd1,0xb8992c66,0xb9c6bc45, +0xba3642ed,0xba51fa27,0xbadd35b1,0xbad74af2,0xbaacbf82,0xba85eb20,0xba449313,0xba1ee13d,0xb9d5fe8b,0xb92da549,0x38a42997,0x39b4a6d4,0x3a1e25a9,0x3a4feb2d,0x3a7d7bb1,0x3a9d74a2,0x3aa4adf9,0x3ab0486a,0x3abbb903,0x3ac6d994,0x3ace5a74,0x3ae346bd,0x3ad4e2cc,0x3a87973d,0x3a27c6c1, +0x39904f15,0xb8292534,0xb9a8a8d6,0xb9de5d16,0xba039ce0,0xba26ca7c,0xba47a881,0xba754ae2,0xba90ccdb,0xbaa5b740,0xbab007d7,0xbac0c984,0xbac44e6b,0x38939f31,0xb8a05595,0x37358995,0x386e749a,0x38f359db,0x3963a7fb,0x399a9fd8,0x39b40920,0x39d1f320,0x39f1288d,0x3a0bfa23,0x3a26a4e3, +0x3a41fa7f,0x3a5fcd4a,0x3a6242ed,0x3a68f067,0x3a6d294c,0x3a72e0dd,0x3a792877,0x3a7514f5,0x3a866d05,0x3a8ad9c7,0x3aa0b6d8,0x3a3a06d6,0x3a500e3d,0x3a62f9db,0x3a43730e,0x3a1a7766,0x39fa823d,0x39c1a59b,0x399b4bcf,0x39532ca1,0x39009f15,0x36addeab,0x398b6077,0x38ef09f8,0x3a48233f, +0xba5f4c9a,0xba3704a4,0xba37ce4d,0xba154630,0xba1533c2,0xba4e4628,0xba1a362a,0xba086691,0xb97f1d71,0xba27477e,0xba4c1403,0xba9213bb,0xba240d26,0xba1988a1,0xba4d5bdb,0xba7889ba,0xba852dd1,0xba846657,0xba6489ef,0xba5b15b9,0xba625172,0xba53effb,0xba55f940,0xba3b478b,0xba5928be, +0xba6b18f1,0xba3b587f,0xba886a25,0xba8108c3,0xba2960b1,0xba249af6,0xba0a45f0,0xb981ee61,0xba344cba,0xba44f80d,0xba45d9e2,0xba43e10b,0xba273a2f,0xba3eb99b,0xb9f1062f,0xba11420b,0xba8de4dd,0xba1dee8b,0xb9941810,0x39ef2a82,0xba115c2e,0xba83df3a,0xbaeaf078,0xb9f3813c,0xb9eaae97, +0xbaac2b65,0xbb008a6d,0xbb11bfe3,0xbb04147e,0xbac39f2b,0xba95ffda,0xba9ae0aa,0xba60f145,0xba336d8b,0xba32b0aa,0xba9e44b6,0xba873a83,0xb996916a,0xba119932,0xb9fedac3,0xb941252d,0xb9184e93,0xb8b66145,0x39559432,0xb9e2f1f0,0xba5c2394,0xba2ee418,0xba2f4cfe,0xb9ab02d6,0xba04a317, +0x38e06593,0x38ff3296,0xba5f7bc8,0x38713d5a,0x39c0ba1a,0x3b08aea8,0xb8f552d9,0xba699101,0xbb34f91a,0xb8900111,0x395735f6,0xba80a443,0xbb075760,0xbb26e4cc,0xbb112ad5,0xbad15c88,0xba987000,0xbac58171,0xba780ccb,0xba59ee9c,0xb9eeb968,0xb8d59965,0x393fbb0c,0x392fd680,0x392fb3c9, +0x39587ac5,0x38bd5551,0x38a05fd1,0x3676bac0,0x36b1f9f7,0x38aa9417,0xb90b5e9f,0xba096e2e,0xba0aa7ab,0xb9f38fd0,0xba53b73e,0xb827ef9f,0xba0ee54a,0xbb0c4102,0xba65e29d,0x3a30eb51,0x3b5a6c02,0x392ff894,0xbafd3622,0xbb94c84b,0xb97b8a78,0x39598f8d,0xbb2f5ac1,0xbba8d84e,0xbbc2eeb6, +0xbba2ba3d,0xbb47060e,0xbaf70e80,0xbb04591b,0xba9e9a9d,0xb9f790cc,0x3866b68c,0x38f63576,0xb85b5022,0xb89a3582,0xb89f002e,0xb8acdd1d,0xb83b4d6d,0xb7f6a32c,0xb646da70,0xb6cce7eb,0xb7d35dab,0x38e9eab5,0x387da92f,0xb9b6a32a,0x3a88b0cc,0x3a913c16,0x3aa5e40f,0x3b234bf0,0x3bce5f18, +0x3b86a192,0x3b2ff844,0x3ac89cf6,0x3b0e30c5,0x3b195a31,0x3b010eda,0x3ab43e55,0x3b226888,0x3b957822,0x3bfde03e,0x3beea3a4,0x3b66af30,0x3aa1ae57,0xb9a179bb,0xba7b6dc5,0xb95377eb,0x39c1f017,0xb8100324,0xb8268c25,0x36f8fa0b,0x3829714f,0x3811c810,0x38217018,0x37c47527,0x37792ada, +0x35d97201,0x372a2e60,0xb69865d0,0xb7d0f718,0xb851e0a8,0x39409a24,0x3a7fa2c0,0x3aa474a7,0x3b1707f5,0x3b48edd3,0x3b1c9077,0xba05be35,0xbb1533df,0xbb33dcf8,0xba06fd55,0x3ac8a858,0x3b47fac8,0x3b417f9b,0x3a0624cc,0xbb5eb649,0xbbafc9d7,0xbbaf3529,0xbb67b715,0xbb090aab,0xba76dc7b, +0xb929da6d,0x39af05dc,0xb8b957df,0xb810a8d3,0x384e9252,0xb75480da,0xb77ce0ac,0xb7b0cca5,0xb79de8cf,0xb7823ab1,0xb70d82e9,0xb6eefe2f,0xb684ea78,0xb65e005d,0x378e1e02,0x384acfcc,0xb90b8a9d,0x3b82d1e2,0x3bbf36da,0x3b558d0c,0xb9d73234,0xbb9f2f54,0x3a2e7a8c,0x3b8eed6a,0x3b838d5f, +0x3bae5245,0x3b0d322c,0xbb7d46c3,0xbb720d95,0xba813580,0x3b793f02,0x3bd0c120,0x3bd4bbfa,0x3b882a00,0x3b529379,0x3b01f2d8,0x3a48af9b,0xb93ec089,0x382a42cc,0x37a46779,0xb818cf20,0x3700741d,0x36f5cb57,0x37777672,0x3763727d,0x375a377b,0x374397af,0x36f69cdd,0x37879233,0xb76e7bd8, +0x37e452be,0xb89bca2b,0xb95a7ef6,0xbb9e7dc0,0xbc6413eb,0xbb9f5c03,0xb985663b,0x3a92c9e5,0x39341bab,0xbb3674fc,0xbbe0f47f,0xbac0e5d1,0x3b4205c4,0x3bcca4a3,0x3b071eea,0xba9198eb,0xbb1970de,0xbb44e61d,0xbb493770,0xbb494645,0xbb2b574c,0xbb210352,0xbb17b92b,0xbab55dba,0xb8d0e81c, +0x38c9b6f7,0xb637809f,0x37462b2e,0xb7573291,0xb75aaf7c,0xb7926092,0xb797acbe,0xb7a48dae,0xb78b30ae,0xb7cfba8c,0x370486af,0xb78de606,0x383a59a9,0x3a179c81,0xbb8109d9,0xbbcb06ed,0xb925bf92,0x3a8735ed,0xba505bdc,0xb9b7eb03,0x3854b389,0x38935abd,0xba80980c,0xbb0c0a8c,0xbb0d8292, +0xbb09138a,0xbaada2b7,0xba87213a,0xb9649086,0x3a14d81f,0x3ac70665,0x3b0600ef,0x3b180ce0,0x3b1f9c66,0x3aba1dcd,0x38ca66d0,0xb93feee3,0x37717897,0xb7f9d63d,0x37cfa257,0x379fd5a1,0x37ff4cc8,0x38185c35,0x380a4d83,0x3845f17b,0x37c2e01e,0x384c9076,0xb8c55223,0x392d2f39,0xba7ec9bf, +0x3b2a2f29,0x3b44ead4,0x3b139bf3,0x3b017431,0x3aaec687,0x3a36cf2c,0xb9a33a09,0xba2b1438,0xbae1fd97,0xbb070771,0xbb17421b,0xbb0d8af5,0xbb081f5b,0xbb078897,0xba887c29,0xb9e15026,0xb8fd6f35,0x3a0d62c7,0x3a87a38e,0x3ac9b768,0x3abf1e05,0x3a4f453c,0x382b14cc,0x38ecb3a4,0xb4fbcd9e, +0xb7f3c1f4,0xb843a2d6,0xb8807d88,0xb89adfbf,0xb8a79fe8,0xb8a3d760,0xb8d4768b,0xb7829777,0xb6baa18e,0x38ffc171,0x3a98aca4,0xba0416f6,0xb973c8fd,0xb9644899,0xb9c5b51d,0xb9fe9962,0xba05b4d5,0xba0337e5,0xba1ed63f,0xba2ca520,0xba58290b,0xba8774ce,0xba91abd3,0xba961ddf,0xbaa36c29, +0xba899f8e,0xba659eca,0xba36a149,0xba0e0233,0xb9f6c83d,0xb95a7f64,0xb9ef3bee,0xb9f8daa4,0xb9ac0d94,0xb93d4ebd,0x379be817,0x38b5aafe,0x38db5596,0x391b1fd2,0x39382884,0x3942d176,0x39456908,0x396df923,0x392b5062,0xb872865e,0xb9294707,0xb97834b0,0xbab43e65,0xbaa390db,0xba88f50b, +0xba628801,0xba34edbb,0xba1a5c56,0xb9fb0d6f,0xb9ade085,0xb92f5009,0x3788f780,0x394f9213,0x39abca44,0x39ea6b2a,0x3a1c4f40,0x3a33e6f9,0x3a4b120f,0x3a659e12,0x3a7eadb9,0x3a89a22d,0x3aa0554c,0x3a98d38c,0x3a14a13d,0x395bc1f5,0xb8c7ae86,0xb986a258,0xb9a64461,0xb9b85686,0xb9dda1c4, +0xb9fc77c7,0xba0dd1f2,0xba1140a9,0xba40e01b,0xba6f6900,0xba8c3534,0xbaa14b8f,0xbaa044b7,0xb951bc8b,0xb98a36ab,0xb96e20c4,0xb949d7b8,0xb9212eb4,0xb8c845a3,0xb83c8ad8,0xb775c337,0x3750a7e3,0x382ba70e,0x38a9d042,0x39137fc7,0x395929c9,0x3990886b,0x399fa888,0x39b1b981,0x39bf4af2, +0x39d17ed9,0x39e407a6,0x39e1812c,0x3a06d490,0x3a11f6b5,0x3a388d60,0x398af002,0x399529b2,0x39851e4f,0x3922509c,0x38645c64,0xb80b5925,0xb906aa9d,0xb969cea2,0xb98936a2,0xb988d6db,0xb9974b2b,0xb8ca1491,0xb93d06f8,0x396ddc24,0xba3ff6ba,0xba2b329a,0xba293a87,0xba095b0b,0xba066de5, +0xba2ec4ab,0xba0cc3f1,0xb9f8b76f,0xb948e1f1,0xba0eef02,0xba30f102,0xba8290a2,0xba14ca5c,0xba08bbde,0xba2fc458,0xba4a0815,0xba5a07d8,0xba6a88ea,0xba46bafc,0xba3cd8bc,0xba355cd3,0xba3378ce,0xba377bae,0xba3d1a8a,0xba40eebc,0xba5ea054,0xba3eddef,0xba743732,0xba6303c8,0xba1cc02d, +0xba19eeae,0xba00e03d,0xb9734b36,0xba299120,0xba2eae96,0xba3afc88,0xba370ce3,0xba25e95c,0xba3fb230,0xb9ef7b2c,0xba06790d,0xba65c1b3,0xba15a797,0xb99d7aa8,0x39d2bd5a,0xb9fe1ee8,0xba6c5fda,0xbad86706,0xba00f803,0xb9d7a09e,0xba8d17fe,0xbac4640f,0xbae70598,0xbaec9249,0xbab29971, +0xba87edbc,0xba79e00a,0xba325932,0xba06b88b,0xba3c7143,0xba4b8d07,0xba01e828,0xb82732c9,0xb90f4172,0xb8de065b,0x35e8b6c2,0xb6b84ab0,0xb7b83651,0x393259cf,0xb97d1671,0xba2c5568,0xba275d17,0xba124930,0xb9d0ab9e,0xba412b1a,0xb8712173,0xb83b5243,0xba2d3f5c,0xb8de63d5,0x3908219e, +0x3aea9cd0,0xb900e1ac,0xba4f6a60,0xbb2649d4,0xb98fbad5,0x38697dbb,0xba5896ac,0xbac2cdf3,0xbafc4371,0xbb04c1e8,0xbabd1f5a,0xba8671ae,0xba92bf98,0xba262d61,0xba10bf0f,0xb90b7779,0x394c57aa,0x3924e816,0x38944a2f,0x3884faed,0x387e04fb,0x3723df01,0x37c642b1,0x363a4464,0xb7e32cf2, +0x38e01189,0x38f06700,0xb97ac286,0xb9f69ced,0xb9fd8fc5,0xba888f64,0xb95010c9,0xba02eb4d,0xbace0d00,0xba652607,0x39c8d2a7,0x3b390529,0x38944ee2,0xbaee695c,0xbb899a19,0xba109342,0x38ca400c,0xbb07d221,0xbb761a24,0xbb97b96d,0xbb947d56,0xbb4120a6,0xbaf1515e,0xbad30207,0xba52d11b, +0xb911cde4,0x38ce0321,0xb84c2fee,0xb8a14acd,0xb818b433,0xb804d4ec,0xb7ef526f,0xb7371bca,0xb7447b76,0x339da332,0x366cd37e,0xb850aa3f,0xb7da98fb,0x3916aa80,0xb9018b0b,0x3a23c5b1,0x3a7466bc,0x3a1b5c01,0x3ac16e3e,0x3b9932d9,0x3b53b385,0x3b0b9a68,0x3a1b92a0,0x3b0d5423,0x3b249dd7, +0x3adeff07,0x3a82ea57,0x3ac3d3da,0x3b48dd08,0x3bc50ea5,0x3bc87a87,0x3b68032b,0x3af601a7,0x3a0743fd,0xb97a997e,0x38f756fc,0x39411002,0xb8842aea,0x3788195f,0x380f14a8,0x37ad526f,0x378194ac,0x37685105,0x36fd3822,0x36b06bed,0x361f77b5,0xb5c7c99f,0x37f1808b,0xb7380cad,0xb88488e4, +0x38b22cd8,0x3a1981f4,0x3a86a3dc,0x3aecad94,0x3b352436,0x3b1e7385,0x3975e499,0xbaa8cbbe,0xbb107b7c,0xba00220d,0x3a805c87,0x3b094850,0x3b37362f,0x3a99e066,0xbb0a50a6,0xbb8dfe69,0xbba25b42,0xbb77d6b4,0xbb258d27,0xbaac9362,0xb96d95a6,0x390bc239,0xb8c9b5f1,0x37adbbc1,0xb5adf1d4, +0xb7a61fff,0xb72b2219,0xb71a6d05,0xb7031f3d,0xb6929813,0xb6d89c39,0x3635d556,0xb7863332,0x37730bb8,0xb8773874,0x3918c6a4,0xb995ea29,0x3b1a6bcf,0x3b86fef4,0x3b1169c1,0xba014ff3,0xbb82ba18,0xba224823,0x3b1a03e1,0x3b42986b,0x3b85e023,0x3b03127d,0xbb205eca,0xbb573725,0xbad1273a, +0x3b0cdd69,0x3ba6ebd0,0x3bbf79e0,0x3b8a0f26,0x3b53dcaa,0x3b00c2d3,0x3a1f2d23,0xb8f74620,0x38aee9d7,0xb8409178,0x37463fd0,0x36cdb780,0x3729a02e,0x36c57b09,0x36d5b938,0x36baef47,0x369d051b,0x36d92314,0x36a417cc,0x379881da,0xb79700d3,0x38a945b7,0xb9f8bcab,0xbb497f54,0xbc1ae71f, +0xbb7cf31d,0xba196e2e,0x3b18e038,0x3a6526a5,0xbae02a54,0xbba2f9c4,0xbb19e80e,0x3aa2b38a,0x3bb6539a,0x3b218bc2,0xb72a8ea8,0xbadd72cf,0xbb0ff2d8,0xbb1ecbd5,0xbb2c94a8,0xbb1447fb,0xbb07237d,0xbb049487,0xba7c28f7,0x391600a6,0xb4c34220,0x36ea6fef,0xb7546d0f,0xb704bd2e,0xb719d791, +0xb6fa0078,0xb71d32b0,0xb702673f,0xb76aaab1,0xb6f9a148,0xb818010a,0x3841a1d5,0xb94077ff,0x3a555089,0xbb72df03,0xbbd373a5,0x3a96ad17,0x3b41eddc,0x3aaaea58,0x3aa3f217,0x3a87ca31,0x39efa382,0xba141922,0xbad60ed6,0xbad7f87f,0xbaf0ae4e,0xbaa49727,0xba8e9481,0xb99b842b,0x39b902f5, +0x3a87a608,0x3ac825ab,0x3ae94ebd,0x3b0258f3,0x3a7eabb4,0xb923c925,0xb882729f,0x3778b667,0x36cadde4,0x37ac721d,0x37485e07,0x378679fe,0x37811971,0x37a4d524,0x37a81f12,0x38104c5c,0x37e70407,0x37ec2b1a,0xb61e188f,0xb8c026c5,0x3b0bda4a,0x3b166e15,0x3ab1d30d,0x3a62da4f,0x39ec9831, +0x38265396,0xba170ba2,0xba16f2ef,0xbaab487b,0xbacbdbe9,0xbaeb0eb3,0xbadbe731,0xbacc33b7,0xbab6c8f2,0xba0b1907,0xb7c40a97,0x394e913d,0x3a3edf26,0x3a8c2921,0x3abf7989,0x3aa67c8a,0x39df028c,0x361b8359,0x37c9278f,0xb8388619,0xb7dbdb65,0xb800f342,0xb7ecfff4,0xb811d4cf,0xb8183eab, +0xb84b82ed,0xb873dce8,0xb8a9a79d,0xb80aca8a,0xb8cd8805,0x3a02e095,0xb84e9b49,0x3988c667,0x3969a401,0x38b87d83,0xb8cf3ca2,0xb94fc3e7,0xb9817639,0xb9c2da65,0xba0d29f8,0xba460f73,0xba853966,0xba925f1e,0xba9c8f44,0xbaaf9dad,0xba98d576,0xba841d5c,0xba5d4ea0,0xba42049c,0xba359901, +0xba0aca81,0xba2195d6,0xb9ebcc48,0xb91bf5b8,0x381ab946,0x38897b37,0x388f2fc0,0x38729c44,0x388355f7,0x3894c233,0x38a12a13,0x38d39521,0x3903da02,0x39368fff,0x391352a5,0x38a8fb5d,0x391bb61e,0xba89fc93,0xba6f43db,0xba56950b,0xba423e81,0xba2ad674,0xba182264,0xba0b47a6,0xb9edd351, +0xb9b6a316,0xb975e359,0xb90681f1,0xb87d0762,0xb67f02a2,0x3882706b,0x3925eea3,0x3979f857,0x39b22f0b,0x39e0e4cd,0x3a064797,0x3a30b006,0x3a2a68de,0x390dccae,0xb90b99f5,0xb9874ad3,0xb967b5db,0xb92432aa,0xb90c203c,0xb92d5328,0xb935353a,0xb950af3c,0xb93d72b6,0xb9a60290,0xb9f4e59b, +0xba3a3c00,0xba64cd10,0xba6e02c5,0xb9b3bcf8,0xb9c237dd,0xb9bf0515,0xb9b10917,0xb9a5479e,0xb999ecb8,0xb98c94f6,0xb98533e8,0xb984f682,0xb98371f2,0xb977b9c3,0xb95cc345,0xb9371c8e,0xb915d56b,0xb8d9b9e9,0xb8911caa,0xb82f3642,0xb644d03e,0x380f7316,0x381f08df,0x390078c7,0x392fb34f, +0x398d85d1,0xb8b1c28a,0xb8ee0f92,0xb933cf57,0xb9820a49,0xb9a2e6a8,0xb9c19445,0xb9e2e32c,0xba025570,0xba05caa2,0xba00ea39,0xb9f3980f,0xb9aeabf2,0xb9b92099,0xb921dd46,0xba1dc477,0xba0f21a7,0xba13faeb,0xb9ec48c7,0xb9e2f694,0xba0781bc,0xb9f355ef,0xb9dd5205,0xb93ca3a5,0xb9f57204, +0xba16701b,0xba596058,0xba043431,0xb9f16211,0xba11a5af,0xba1dc96e,0xba2a394d,0xba4333f7,0xba24382c,0xba19c40a,0xba0db6d1,0xba067463,0xba0357a5,0xba2df082,0xba1c5995,0xba209049,0xba093911,0xba23e318,0xba15e285,0xb9d25bd4,0xb9d2411c,0xb9ae7ef2,0xb90673c3,0xb9fc801f,0xba10739d, +0xba1e14e0,0xba0f0798,0xba06efc9,0xba293024,0xb9cbf764,0xb9d49869,0xba1e963a,0xb9ff877b,0xb9a035f5,0x39892380,0xb9f01768,0xba5172a5,0xbab5dff8,0xba054077,0xb9d32c4c,0xba5f3466,0xba8dcab4,0xbaab8319,0xbac391cd,0xba976d6a,0xba66f1c6,0xba3b4c84,0xb9e6644d,0xb9c9bfd8,0xba037238, +0xb9831015,0xb8d5c7e5,0x3874ca99,0x37007e15,0x37a286d6,0x381eb3c0,0x37f2d0bf,0x3770b79a,0x389fd4e4,0xb80dae13,0xb9950643,0xb9f0a00e,0xb9ebbea9,0xb9c20a1b,0xba4bfaf1,0xb903c928,0xb8cbe1ad,0xb9bfae7a,0xb941b2ae,0xb89a441a,0x3aaa3959,0xb974ad8e,0xba44f526,0xbb0a85b3,0xb9f04f00, +0xb90a9503,0xba357bf7,0xba8355ce,0xbab13b8d,0xbadeafbb,0xba9d777b,0xba5ee199,0xba402f61,0xb9b30139,0xb935fcc1,0x38bbb174,0x38ec97eb,0x382f26b6,0x36929791,0x378bae03,0x37a7433c,0x366b69ad,0x36783ce4,0x362f3884,0xb7e78932,0x38022809,0x38c89f62,0x3817c4e4,0xb96f185d,0xb99b198e, +0xba847b73,0xb9432144,0xb9959fc9,0xba5bda0c,0xba361c2b,0x391a4396,0x3b0775fb,0xb92edfca,0xbadd0519,0xbb64be56,0xba49c83f,0xb8d925df,0xbac8d1e8,0xbb249f8a,0xbb595f4a,0xbb768f32,0xbb29718e,0xbad7ca17,0xba95911c,0xb9c8a05c,0x38222590,0xb739c880,0xb86b8e26,0xb7848897,0xb6b7533b, +0xb725180d,0xb736da48,0xb6084d18,0xb6784982,0x353843de,0x37282a39,0xb73a9cd4,0xb84dc985,0x37b1f1cb,0x381113b5,0x39c38281,0x3a1e16d2,0xb879c7ce,0x3a0901ab,0x3b42ab6e,0x3b0c9212,0x3ab76a6d,0xb9629adf,0x3af366cb,0x3b18ab7e,0x3aabf621,0x3a204e13,0x3a34ef05,0x3aed646e,0x3b8828e0, +0x3b96de3b,0x3b50ebb9,0x3b0897cf,0x3a82e6e0,0x39ab0978,0x3983d502,0xb76374a2,0x34d6d2b3,0x37e24e04,0x3721dd20,0x3634a05d,0x36c10a5a,0x36a403b3,0x3628a997,0x35882e2c,0x35dfaa29,0xb6e82966,0x374a79d4,0x37773217,0x375c76df,0xb8c222dd,0x39217809,0x3a48d2d5,0x3ab0f0e4,0x3b1a6684, +0x3b1484b1,0x3a57761c,0xb9d7bee8,0xbad5fd61,0xb9c9ecc0,0x3a1a66b0,0x3aaf92c6,0x3b1bea96,0x3ab4dc69,0xba9e9e5d,0xbb5792dc,0xbb8a8c6f,0xbb6ecb68,0xbb2e4cad,0xbacd07d4,0xb9de3f2e,0xb7372d01,0xb8523ff8,0x37e11536,0xb7b06a0a,0xb63aa336,0xb6505062,0xb6322773,0xb674d0b2,0xb54a558a, +0xb6872315,0x369f8b1b,0xb737be5e,0x37acf6c9,0xb887d898,0x38e90f6e,0xb932bae1,0x3a80c852,0x3b2bf33a,0x3aaf087e,0xba0b79dc,0xbb4905fa,0xbab917a1,0x3a4fcadd,0x3b0492d4,0x3b3ceaa5,0x3ade58eb,0xbaacc224,0xbb302929,0xbaef6eca,0x3a61b64a,0x3b6a6d26,0x3b98015d,0x3b79257c,0x3b3d534d, +0x3ae8d746,0x3a00fe1d,0x37752516,0x380724e5,0xb7cce778,0x37a23247,0xb54bf0e9,0x368c2e37,0x35edc35c,0x36502237,0x3629cc51,0x35e37d73,0x366624e1,0xb66aa2f5,0x3798c580,0xb801e11b,0x3902c770,0xb9bccfc2,0xba946796,0xbbc46b29,0xbb4cd02b,0xba7adfe0,0x3b358cd8,0x3a877de6,0xba851986, +0xbb54441f,0xbb2cb97e,0xb89e1564,0x3b8a26fb,0x3b2415e5,0x3a5df0f1,0xba860a22,0xbabafd84,0xbae523c6,0xbb0529b2,0xbae75306,0xbaca4505,0xbacab831,0xb9e8c358,0x391acaeb,0xb811f5b0,0x3683af04,0xb71cbdff,0xb58aad49,0xb6a0bd0c,0xb653a2b4,0xb6c5821f,0xb593ea09,0xb736161a,0x374cf11a, +0xb83a7be5,0x38a74713,0xb975986a,0x3a17b424,0xbb0e15b4,0xbbaaf110,0x3b0ec35d,0x3b80656f,0x3b3b7454,0x3b1d83db,0x3aed6f03,0x3a5a96d7,0xb9228145,0xba91064e,0xba96b1a9,0xbacb6a1c,0xba9af141,0xba88f9b1,0xb9c5983f,0x38e4e34b,0x3a0deae0,0x3a83c2ed,0x3aa1dd62,0x3ac78e57,0x3a0b8559, +0xb9664c39,0x38404996,0x35ae7acd,0x3737d25c,0x369b14fd,0x36e35ca2,0x370e5761,0x36e3112b,0x37521517,0xb427de81,0x37d50ea8,0xb7c2be44,0x38c8d479,0xb9063a6c,0x39df468c,0x3ac0edb8,0x3ac0c5c2,0x39e4bc60,0xb910140d,0xb9b35f3c,0xba1a3355,0xba6664cc,0xba33ad3e,0xba8132f1,0xba8c80aa, +0xbaa0a34b,0xba9933db,0xba8c21f9,0xba5c92b7,0xb951d911,0x395e82ba,0x39cbca4a,0x3a4fa4f0,0x3a7e8309,0x3aa3bf2e,0x3a6da433,0x38c7476a,0xb7746281,0xb7e27f99,0xb7486661,0xb74cb99c,0xb7555039,0xb780503c,0xb797a83b,0xb7810445,0xb7adb364,0xb6f3d116,0xb8315012,0xb73a1ad0,0xb8c51684, +0xb8c1ad08,0x39980f18,0x3a241f24,0x3a0edd4c,0x39e8bb39,0x3968f6ea,0x384e8fb4,0xb891b74b,0xb97bc772,0xb9f57f58,0xba38e4f4,0xba7f3725,0xba870cf8,0xba8da8cd,0xba9c72ca,0xba8a85ef,0xba753770,0xba53f2c2,0xba44c685,0xba39fa48,0xba2763c1,0xba175776,0xb9838889,0x387f3624,0x385f1d97, +0x38015e9f,0x37a53fbf,0x37c7067a,0x37f00277,0x380b0a18,0x38050017,0x3800f0a4,0x37f1881d,0x387247d9,0x38de87ae,0x38c15819,0x398792b8,0xba4a27a4,0xba27fb28,0xba25b683,0xba27861f,0xba21eecd,0xba17e5b2,0xba171e61,0xba1181fd,0xba00871c,0xb9dec6ed,0xb9c48f6b,0xb9b893c0,0xb9b5d53f, +0xb9b325e3,0xb9879e02,0xb9499e36,0xb8d5213e,0xb7ead95e,0x385e12ac,0x393b9fc3,0x39488317,0xb92c035f,0xb97aba26,0xb91e72ad,0xb87a0e1c,0xb79f588a,0xb797eb66,0xb7ac25cd,0xb7a98bf7,0xb7b674c9,0xb7b7efe4,0xb80604b4,0xb8ba6173,0xb9a27428,0xb9f3c6cb,0xba0b9f47,0xb9d6f291,0xb9cccc18, +0xb9d7e497,0xb9cf1448,0xb9cc17ee,0xb9cf0da8,0xb9ccc086,0xb9cdbfa6,0xb9d61d98,0xb9ddf7cf,0xb9dfcb6e,0xb9e04b85,0xb9da0d1a,0xb9d7c49c,0xb9c218ae,0xb9b23db0,0xb9a54be5,0xb9927422,0xb9819f6c,0xb9770021,0xb9305059,0xb8fa1bdd,0xb8c3ee47,0xb9a4a9cd,0xb9a56aff,0xb9b25a37,0xb9c8168d, +0xb9d8028c,0xb9e8f66a,0xb9f7ed09,0xba049dfa,0xba0830c7,0xba086ac0,0xba034247,0xb9fc1f99,0xb9ef32be,0xb9cba19d,0xb9ea8e52,0xb9d8b3ba,0xb9e4e2d8,0xb9b7a3e4,0xb9acf4e1,0xb9bdfb14,0xb9b9fe77,0xb9ad6eea,0xb92447bf,0xb9bb0529,0xb9e1526c,0xba1d163b,0xb9ced687,0xb9bda834,0xb9d79167, +0xb9dddf9f,0xb9ee4422,0xba0ed465,0xb9f03356,0xb9dfb057,0xb9c57470,0xb9b87377,0xb9c7f30c,0xba1e7463,0xb9d156f0,0xb9cb006e,0xb9a57b84,0xb9b83004,0xb9ab91c4,0xb9853ab2,0xb987d746,0xb96c107d,0xb8f10c72,0xb9adf5f3,0xb9d1e6ae,0xba0abafd,0xb9e2ec86,0xb9db1971,0xba03e40b,0xb9ab0886, +0xb9a6714e,0xb9ce0423,0xb9c60ef4,0xb98d6ff1,0x38f9146b,0xb9c5786d,0xba2095f8,0xba82e08c,0xb9e64212,0xb9b5c2b3,0xba1d412b,0xba368629,0xba6126fc,0xba8bed89,0xba5f348a,0xba2b62fb,0xb9f65b23,0xb99abdcc,0xb9723771,0xb94a1b31,0x37b0459f,0x38a7c23c,0x38dc5049,0x38ad3535,0x38b704b0, +0x38a41888,0x38a1dc83,0x3868d4d4,0x38978c55,0x387ce87c,0xb7234bd8,0xb952c03a,0xb9a39c8b,0xb99b2035,0xba378e38,0xb93c44d3,0xb918d0fa,0xb93a720b,0xb94b3e26,0xb928a66b,0x3a513449,0xb97e6ce9,0xba1aa12b,0xbac22731,0xb9f97887,0xb968eb44,0xba054fc5,0xba1b4e30,0xba59629a,0xba9f9d63, +0xba60d236,0xba1db7fb,0xb9dc9e50,0xb910d4cb,0x38052271,0x38a0e0af,0x38042ef7,0xb7a60760,0xb7e685f0,0xb7dfcb51,0xb7d33e23,0xb7eb4101,0xb7b15564,0xb7922274,0xb7c0eb90,0xb6eaaee5,0x37f21020,0x38d7bfbe,0xb75d3a88,0xb893cb4f,0xba6b5d5b,0xb98a9cef,0xb981c21c,0xb9d7ae6b,0xba089447, +0xb7fd7aa7,0x3aa5ab9b,0xb98d0b31,0xbaaaabf8,0xbb20a8d9,0xba43a7f4,0xb96a9e60,0xba82f69b,0xbabdea16,0xbb06f6b2,0xbb2f2e4c,0xbafc719c,0xbaa516f0,0xba324df4,0xb8f3fe06,0x383d436d,0xb82b7d8e,0xb73ac102,0x36874cbc,0x375092e9,0x373d05e7,0x3733e583,0x373e9da1,0x3716f330,0x3701ff9b, +0x372bf751,0x355e470c,0xb78ff7d8,0xb8246a43,0x38865b2b,0x3895a348,0x39a65af2,0xb9703210,0x38d6f298,0x3add9407,0x3aafa570,0x3a6e38d9,0xb9f9c7d2,0x3abb6ad0,0x3aef6765,0x3a620127,0x39a3cac1,0x394a82c6,0x3a6a8145,0x3b1e8ca8,0x3b4228fa,0x3b2434c5,0x3af41183,0x3a92a2d7,0x3a1e236f, +0x38bd8a82,0xb7afaf6b,0x379cc1d1,0x36acacf0,0xb5da536f,0xb6bbf73d,0xb6b7be20,0xb6aaf624,0xb6b55643,0xb688bab6,0xb6984cf3,0xb64a0ade,0xb676b593,0x376038a3,0xb64179e1,0x36599d93,0xb9012f48,0x3a1fff8e,0x3a78f1e0,0x3adea8d9,0x3ae7a5c8,0x3a7aac2c,0x38b86405,0xba8fcc71,0xb9a92440, +0x398e0bb1,0x3a546642,0x3ae84907,0x3aa23d16,0xba0a0be5,0xbb09a107,0xbb446b66,0xbb3ae82e,0xbb13e25f,0xbabed2db,0xba109a82,0xb7abe764,0x3713bb1c,0xb6b5db82,0xb6c62430,0x35f08975,0x362c4e54,0x36503fc1,0x3638a3fb,0x364ca6cb,0x3608b6d9,0x36565428,0x3502f20d,0x366b0f23,0xb7186067, +0xb706bb86,0x3810bc31,0x390eecb7,0x3aadf915,0x3a34fe06,0xb9e831bb,0xbb04572a,0xbacf23ba,0xb9345def,0x3aa09629,0x3ae94c84,0x3aa06fef,0xba057b11,0xbaf58585,0xbaca2750,0x39447198,0x3b0e4f9c,0x3b4e303f,0x3b3cde83,0x3b11688f,0x3ab9d138,0x39db00d2,0x378b73df,0xb5c0c827,0xb69d07f2, +0x3714c652,0xb67ef106,0xb5193cf6,0xb63f0613,0xb5f9dcf1,0xb6173f09,0xb60c857b,0xb5a4bdfa,0xb681c347,0x36ce41b3,0xb7727e51,0x386552cc,0xb8f8e8ed,0x3913523c,0xbb5d92b4,0xbb0faa59,0xba6ac689,0x3b2264ce,0x3a80db44,0xb9dea0eb,0xbae3cb58,0xbb0f5dd9,0xba28c051,0x3b3239b8,0x3b0d5c26, +0x3aa46829,0xb9c30b4d,0xba3e315c,0xba8a553d,0xbaa9d521,0xba95ad22,0xba7e86a5,0xba739891,0xb8d867aa,0x389d777d,0xb8029f56,0x36b020e6,0xb5f421a7,0x36676407,0x361077eb,0x364a60bc,0x3611ecd9,0x367e940a,0xb4b06610,0x37121d25,0xb76c866a,0x37eeeaf4,0xb88fec7b,0x38cc72f8,0xba150599, +0xbb450013,0x3b1f3dd4,0x3b707632,0x3b583060,0x3b2f4c45,0x3b051d73,0x3a8dfd9a,0x39350bd5,0xba22b7fe,0xba3f0d49,0xba95405f,0xba795175,0xba6489b6,0xb9c6bace,0xb8550c41,0x3957fe44,0x3a1b58fa,0x3a44f745,0x3a89d704,0x38b81b82,0xb8d2b2e7,0x3852fce5,0xb74938c3,0x36a6f290,0xb6f51fb7, +0xb65cce0b,0xb6a68aff,0xb6b415c2,0xb6609c85,0xb6f6beb5,0x36139caf,0xb789a4d8,0x3838252f,0xb8b7b51a,0x398494db,0x3a1efb0a,0x3a4a55d8,0xb95433e6,0xba32cd9e,0xba488ca4,0xba67fbe9,0xba76f883,0xba2f2378,0xba396855,0xba31a672,0xba3f2d8f,0xba373502,0xba23d415,0xb9dc7457,0xb6fd1b65, +0x399a4f4e,0x39e5a7ed,0x3a3a6a9e,0x3a419f55,0x3a7c6984,0x39e3ac6a,0xb8949aac,0x3722774b,0xb7d9152a,0x37504460,0x36c264b8,0x37367ae0,0x3714dd6e,0x373a486b,0x371b2d8b,0x3722eca9,0x37085fe2,0x371eb474,0xb811d17c,0x3804be71,0xb95a343d,0x39b7adfc,0x3a47644b,0x3a2375ce,0x3a184a4c, +0x39c4c0a8,0x394f68f7,0x384e26df,0xb90392eb,0xb9b60677,0xba125851,0xba4e10a4,0xba52f21b,0xba57d847,0xba68528c,0xba4f03c5,0xba392190,0xba21e40f,0xba1a8c81,0xba100ff6,0xba0f977d,0xb9c7f629,0x379f31d4,0x3888b4b2,0x3713570b,0xb76c6be0,0xb7d00eae,0xb7b087f2,0xb7c93aaf,0xb7d70b9b, +0xb7cae0ac,0xb7a48a9b,0xb7e5e86f,0xb73d8f11,0x37c4628f,0x38aa0b46,0x387b7f2b,0xb9e85634,0xb9db9516,0xb9e0a21e,0xb9f8d7af,0xb9fe4c2f,0xb9f5d818,0xb9fd6c6f,0xba00152b,0xb9ee9aa0,0xb9de2f6f,0xb9d7a454,0xb9da115e,0xb9e71640,0xb9f68b5b,0xb9d9da9e,0xb9c3c39b,0xb9a2997e,0xb98a2a43, +0xb9530fe9,0xb8f8e32b,0xb91244ba,0xb983cc88,0xb8e20510,0x35b4fa41,0x3897d520,0x38a42100,0x3890ab84,0x389ceea2,0x3896eb7b,0x38a2a5d3,0x3892f532,0x38c5126b,0x389e96ae,0xb78ef521,0xb92db978,0xb9452894,0xb9ca2092,0xb9a615a1,0xb9b6ddd6,0xb9b39a3d,0xb9b4dbc1,0xb9bd9287,0xb9c09d6e, +0xb9c4e81c,0xb9d07776,0xb9dbd9af,0xb9e20fb1,0xb9e99be7,0xb9eab213,0xb9efa8a1,0xb9dea8aa,0xb9d3ee1d,0xb9cb3fb7,0xb9bd7f0b,0xb9b433a9,0xb9aaf760,0xb990ff47,0xb9936fe6,0xb9ab11b3,0xb9b36630,0xb9a3944e,0xb99b0aca,0xb9a2d4a2,0xb9a65953,0xb9ab37bb,0xb9aef3e7,0xb9b5557f,0xb9b6618f, +0xb9c23ff8,0xb9c9c0e2,0xb9f9e1eb,0xb9e67ffd,0xb9e4b271,0xb9a25898,0xb99b8946,0xb99caccf,0xb987e433,0xb978bed9,0xb978e698,0xb9870605,0xb983a4d4,0xb9231c59,0xb98b83f2,0xb9a0318b,0xb9cc8d1c,0xb998d3e0,0xb98ea930,0xb996d1f3,0xb995483f,0xb99d643f,0xb9bcaa13,0xb9a26c6c,0xb9987be8, +0xb982f6fc,0xb9776406,0xb98ac500,0xb9c9b760,0xb8316401,0xb886669f,0xb86ee8eb,0xb88edad7,0xb8789122,0xb82a3378,0xb82cd5b6,0xb809deeb,0x3543d7dd,0xb87db798,0xb8751b26,0xb9b5d477,0xb9a741bd,0xb9a6c014,0xb9bccacb,0xb972312a,0xb96971c4,0xb960a40c,0xb98b8c5a,0xb96ef399,0xb7e98653, +0xb99ed918,0xb9e3b2b9,0xba23ca49,0xb9b920c8,0xb99919b6,0xb9cdcb3a,0xb9db2033,0xba053adf,0xba2c0888,0xba101ee4,0xb9e0cc42,0xb9983c24,0xb9334737,0x381067dd,0x3852e7f7,0x38873be1,0xb58bfc88,0x37e96c96,0x37b25fb5,0x37adb80f,0x372d5a78,0x37376029,0x35b2d83b,0x3674dc0f,0x368b9960, +0x3882883d,0x3876a9ae,0x35d125e4,0x3639f085,0xba175f85,0xb9173a08,0xb91995ff,0xb852260c,0xb93d4688,0xb957f636,0x39a003c1,0xb9884b34,0xb9e9f844,0xba67b643,0xb9dcd4cb,0xb98be17f,0xb9b90949,0xb9b165ff,0xb9f225ed,0xba421dd6,0xba0bd3a0,0xb9c872b9,0xb973f45b,0x3839ecc9,0x37b59e87, +0xb7c89402,0xb7d1d47d,0xb7026a16,0xb7179ee8,0xb7103007,0xb6badaa3,0xb647c49d,0xb6740869,0xb5c93bbf,0xb5c456b0,0xb71ce071,0xb7ca567c,0xb8256ca5,0x38911650,0x39069427,0xba2242bc,0xb9552408,0xb8fd3ea0,0xb89fcc82,0xb9a14a69,0xb9082e9c,0x3a0b7243,0xb9a72f5e,0xba699a7d,0xbabd2c8c, +0xba23e469,0xb9a26077,0xba1bbaa1,0xba4155c2,0xba9022c9,0xbace8677,0xba9d7ae2,0xba571e3d,0xb9ac197d,0x37f0357d,0xb76d4e08,0x3611ce7d,0x3751ee53,0x36b58867,0x368bae70,0x3684e499,0x36345562,0x3604216d,0x35d36a04,0x35a85c0c,0x357e65d2,0x36d07ee2,0x371c0316,0x3782a4b1,0xb8820d17, +0x37ac9759,0x39180bee,0xb97dd964,0xb8daa5ba,0x3a220495,0x3a116db8,0x39ba7856,0xba1bd7f8,0x3a47196c,0x3a8a43d9,0x39e2d52a,0x38cfabba,0xb8145a29,0x39bb18b6,0x3a904e0d,0x3ac8a0a0,0x3ad2aea6,0x3aa65b80,0x3a62a50d,0x3a04119c,0xb8374936,0xb5cc4b99,0x364432f4,0xb6e3a621,0xb6325bb3, +0xb616f7ab,0xb5f69bc3,0xb5c90a20,0xb588cc88,0xb5862456,0xb4e6e2ea,0xb5d03c74,0xb56dc49f,0xb736e1c8,0x3777c986,0xb809234f,0xb90fd6c2,0x39bbc6f0,0x3a19573a,0x3a81cc36,0x3a920d1b,0x3a503c11,0x399947d8,0xba1eb0c8,0xb961be86,0x38c5737e,0x39efae33,0x3a955c3a,0x3a717c84,0xb8beea6e, +0xba88e08e,0xbaded2f5,0xbaef29a1,0xbac81890,0xba8ebf26,0xb9eed083,0x387dbbb3,0xb7774012,0x36be990a,0xb3db60a0,0x366216e9,0x35020089,0x35c7b07f,0x354d5f0b,0x3557c5db,0x353a8d12,0x34dab654,0x35c0249b,0xb4fced89,0x371a930f,0xb79597e3,0x383b8b5c,0xb7dd20ed,0x39e105df,0x398b8b08, +0xb99ba82d,0xba93f3f1,0xbaa555a2,0xba0e67ad,0x3a159066,0x3a576862,0x3a2732e3,0xb916519f,0xba9b205b,0xba97b0d8,0xb96e4c68,0x3a706368,0x3ad427a6,0x3ae05d16,0x3ab11b49,0x3a688068,0x39921ddb,0x361d847e,0xb7960fb6,0x3722196d,0xb6bc2dde,0xb3863ab0,0xb5de6615,0xb547a1a6,0xb59077c7, +0xb52a2f9d,0xb5930379,0xb4aadb93,0xb60d9415,0x358f24a7,0xb700d008,0x3758ddd3,0xb7772980,0x39ac5b75,0xbab1bbdb,0xbab5cdf2,0xba25fc3d,0x3ac05b2d,0x3a262171,0xb902c886,0xba43c98e,0xbab45ea3,0xba2de5cb,0x3aab2cee,0x3abcab92,0x3a91b519,0x3830566d,0xb98f775b,0xba0e1aa3,0xba2f217c, +0xba2215c8,0xba0806c1,0xb9c902e8,0x37dd4d39,0x3671a308,0xb693af85,0x36859251,0x35c13524,0x35ce1433,0x35d3c1aa,0x35a55fe3,0x35d8a054,0x355adfd9,0x3644257c,0xb59e51c3,0x370d01cd,0xb74cebc1,0x38211af0,0xb8ccce77,0x38543487,0xba5352c7,0x3ae636f5,0x3b231205,0x3b267aca,0x3b074ace, +0x3ad24a83,0x3a7ef10f,0x39a09abb,0xb9846259,0xb9dd3e82,0xba3c0938,0xba2ce75e,0xba1de53f,0xb9a82716,0xb9118e17,0xb59325a1,0x3981ff28,0x39ba6548,0x3a06b52c,0xb8aa5a98,0x370367e2,0x360acdd2,0xb6cd1af7,0xb61bd5ab,0xb652a1f1,0xb63213f7,0xb63d1624,0xb618f66d,0xb663802c,0xb6103fc4, +0xb6bdd8ce,0x354c99f3,0xb74c00d8,0x375eab00,0xb7a136a0,0x388d3049,0x39867642,0xb9f1c64b,0xba48ffe0,0xba54b412,0xba627872,0xba5676d4,0xba18e29d,0xb9f938b2,0xb9c39522,0xb9b60965,0xb9ab7e82,0xb9935541,0xb9184357,0x38791d24,0x397271ef,0x39ad90b5,0x39f25a77,0x39ead4b6,0x3a1575c9, +0x38322623,0xb82bbb4b,0x3720db94,0x36f51e8a,0x36d7369b,0x36bdaf90,0x36ca1921,0x36b1c473,0x36bc48f2,0x36b445fc,0x3706555c,0x36a900f7,0x3741cf2e,0xb588d62a,0x37fb7973,0xb8a0bb0d,0x38e47428,0x3a29b13d,0x39fb225a,0x39f94445,0x39a9e958,0x39477d44,0x3877d207,0xb8b58fbe,0xb974a19c, +0xb9c211d6,0xba056456,0xba03d30f,0xba0258eb,0xba06fb10,0xb9f0ac10,0xb9d87a7d,0xb9bc33d9,0xb9b84654,0xb9a6c430,0xb9bc3eaa,0xb85fe17a,0x3889bbe3,0xb7fb0d31,0xb78824c1,0xb74b5d30,0xb75a8350,0xb75c7f37,0xb74a4d70,0xb7457d8c,0xb75e2705,0xb77c1441,0xb790f0e5,0xb70a4e29,0xb7e084d6, +0xb6c03ede,0xb7899886,0xb91f51a7,0xb9629fc0,0xb9884fa7,0xb99a5997,0xb9a87e93,0xb9a93ca3,0xb9b481f6,0xb9be01bd,0xb9b4dc3d,0xb9ad8abb,0xb9ad9e5a,0xb9b1befe,0xb9be604d,0xb9cdc134,0xb9c169b4,0xb9b8c507,0xb9a8678e,0xb9a0e56b,0xb988ba8f,0xb988469b,0xb96f008b,0xb7201734,0x3866f1e8, +0x385b2f5d,0x37838aaf,0x381abb09,0x38051da7,0x3815beec,0x381916a3,0x3821626a,0x382164de,0x3834eb1b,0x379a4ac0,0x385b6fd1,0x381e83b8,0x381d802d,0xb99ce003,0xb96b3074,0xb97a8759,0xb9806c66,0xb983e321,0xb98c4608,0xb990d9cc,0xb9965153,0xb99eaff2,0xb9a7b5d9,0xb9ad7bb6,0xb9b54b16, +0xb9b88a0e,0xb9bd9d8a,0xb9b4bff2,0xb9affcb4,0xb9abef84,0xb9a536b7,0xb9a310c4,0xb9943593,0xb99fb7c2,0xb9a40266,0xb9a69fef,0xb885dc7d,0xb8a5f063,0xb89d98b7,0xb8a8e9e0,0xb8a8ffe0,0xb8adb3b7,0xb8ae9aaf,0xb8b3f29c,0xb8ac7891,0xb8afe09f,0xb867ae5f,0xb9aa94e3,0xb9a096be,0xb9b9c503, +0xb85c74c1,0xb8afb100,0xb82467c7,0xb8473650,0xb8284c89,0xb8267a63,0xb8368c24,0xb82e2af9,0xb7b5311c,0xb8354480,0xb855f350,0xb88bee89,0xb853abb6,0xb843f029,0xb8484f3b,0xb83c2bac,0xb846ce27,0xb87d3a17,0xb85572ac,0xb8529232,0xb7f9c9ea,0xb87f4e20,0xb8aa4695,0xb8edb9ea,0x3708d8b9, +0x355c44d2,0x380f7d97,0x38091424,0x37fdb600,0x37ee67d7,0x37e72514,0x37e7bcbf,0x37e18f99,0xb4347a32,0x3700b1bc,0xb8e2bd83,0xb8c5f5dc,0xb8b358f7,0xb89641f7,0xb8169b47,0xb82f95c6,0xb8195d05,0xb84bfa08,0xb825a0ef,0x360109d6,0xb84fa8a0,0xb89c9e15,0xb8e60491,0xb886a0e6,0xb854f2fa, +0xb883e49f,0xb8805081,0xb8a3dc95,0xb8eadcc5,0xb8cbc86d,0xb8989bc6,0xb834716c,0xb884b318,0x37f0cbd9,0x37f6e43e,0x372874b4,0x368c7721,0xb677d91d,0xb6ebc24d,0xb67f1ce9,0xb5f7dbde,0xb60244f3,0xb66b8de6,0x35d818e9,0xb50540cb,0x370a4056,0x380c10c8,0x37f6bbfd,0x37c6ea6d,0xb8f69cad, +0xb7bb610e,0xb7eede90,0xb5898277,0xb809a10b,0xb8144efb,0x3895f77b,0xb80cce3e,0xb891418a,0xb91cc33b,0xb8a3d5d8,0xb8469078,0xb858460f,0xb80cf426,0xb8679f4b,0xb8fa8723,0xb8af6346,0xb8661000,0xb7ef1c77,0xb60907e5,0x35d6365c,0xb70df879,0x361659ad,0x363b60f8,0x364d8cab,0x36591103, +0x35eee2f8,0x35620ba6,0x35ca762e,0x35dbcccf,0x35a5225a,0x367a9741,0x357ba20c,0xb60e93e2,0xb7197ddc,0x37d4ad8f,0xb8ea4968,0xb8372f66,0xb7e30edb,0xb734fa81,0xb895315e,0xb81a1550,0x38d8f656,0xb85af501,0xb926af00,0xb986f670,0xb90171db,0xb873a94e,0xb8b3cef3,0xb8b6d5aa,0xb9290f83, +0xb98fe7bb,0xb96cb318,0xb9190276,0xb83e50b3,0xb6b97f1e,0x37172512,0x361ebc43,0x36504040,0xb61a83c3,0xb578d512,0xb5b4dbbd,0xb54fc239,0xb50d754b,0xb53ec231,0xb5177d42,0xb573b6b4,0xb58ebcb4,0xb5e69988,0x3724c752,0xb5d870f2,0xb717562e,0x375cc4d1,0xb78cec70,0xb764978d,0x38fedd36, +0x39190ab7,0x3904ae98,0xb8afd3b9,0x396464d6,0x399206ed,0x391127d7,0x3880d83b,0x37485f7b,0x38943390,0x394a04f4,0x399e523a,0x39d5fe54,0x39ad8f90,0x3991e0c0,0x38f5fa29,0xb812eb2e,0x378f7906,0xb70b4d40,0x35a52c59,0xb489ef8b,0x35999d50,0x34a946b4,0x3518e2a8,0x344b441f,0x350bd2cf, +0x32c425bb,0x3590e6ae,0xb51d89c0,0x362f9354,0xb73ec3e4,0x37ab3f92,0xb832fed9,0x389d7321,0x3928ac87,0x395841e3,0x3981435e,0x395d6681,0x38df0b1f,0xb9057faa,0xb847bd82,0x3722d4d2,0x38b0ef0e,0x397ba013,0x395df6b2,0x3754b9ff,0xb932ec64,0xb9a41585,0xb9bb98e2,0xb9ab0c38,0xb97f9808, +0xb8e50052,0x37c2cfb9,0xb53bb68b,0x32589d1c,0x35c2ec4e,0xb56f3f39,0xb43d9bcb,0xb4fbd261,0xb44ab733,0xb4b403dc,0xb388a430,0xb530289d,0x3510644e,0xb623f7a8,0x36a2d998,0xb71fb629,0x37d1b243,0x35442598,0x37a87cb8,0x37f9c566,0xb8701520,0xb9452dfc,0xb98b2816,0xb8f73850,0x392c8f60, +0x395943b4,0x393662a1,0x38181007,0xb95803c0,0xb96abcbc,0xb84144fb,0x39353a8a,0x39a651c3,0x39bb5ca7,0x39971171,0x395e5b8e,0x38866788,0xb79e9216,0x36b03e34,0xb62e1ba0,0x34318339,0x33df2e8d,0x350e57e0,0x348569a1,0x34b363d3,0x347d972a,0x34ab47c5,0x34a8d173,0x34e3b247,0x34fec6a9, +0xb524f743,0x34ca20b8,0xb62ce7d5,0x3855cd5b,0xb935632c,0xb99478f7,0xb8e50104,0x39c3bc68,0x3953207e,0x38267357,0xb8c1d864,0xb99aa79f,0xb93d2d15,0x396f17dd,0x39b1182a,0x39a1ee27,0x38a548c4,0xb6eb5db8,0xb899bde4,0xb8bb346c,0xb8ca794e,0xb8a3adf0,0xb85038b2,0x36b9ace6,0x3680b3ff, +0xb5893a65,0x35f2d1d2,0xb5b02950,0xb4590b55,0xb53417db,0xb4d621ad,0xb4eae9ea,0xb51ec58c,0xb4cdf6ff,0xb5a4ce28,0x35159c29,0xb62c4146,0x37318c0a,0xb78311d5,0x36c416f5,0x37232f55,0x39f30ce1,0x3a1c1031,0x3a2e2926,0x3a0fe9a1,0x39ec0e7e,0x39a504ba,0x39110b67,0xb6a3d977,0xb893542a, +0xb911bcbe,0xb90fe56c,0xb9070385,0xb8a31c12,0xb83b6c9d,0xb71d8e18,0x38003af8,0x388f48c9,0x389a57a4,0xb8038488,0x376ccc25,0xb724e9a4,0x3625a30c,0xb41406c8,0x35d97b71,0x353b5b8e,0x358bfa2b,0x35503dff,0x35906fae,0x359c616c,0x35c3cd29,0x35a0e39f,0xb446dc35,0xb6c4be31,0xb2827af2, +0xb7df05b1,0x368757d8,0xb8f8ffcc,0xb959384e,0xb95acf04,0xb95f402d,0xb940fe83,0xb8f8160c,0xb8cd6491,0xb897169b,0xb877e86d,0xb8479b20,0xb811cb54,0xb6d4dd76,0x380b7c98,0x3890aada,0x38c7267c,0x38ed162e,0x38e6eec2,0x38e441e7,0xb8163da9,0x3775a1d2,0x3608b551,0x35ea5cdf,0xb64fdf74, +0xb5e9636e,0xb6166a8b,0xb5f484e9,0xb5f691fd,0xb607cbc0,0xb646d98d,0xb60fcd13,0xb693a140,0x365d0e4e,0xb696522d,0x37f06d37,0xb83bee32,0x39318f3e,0x390c7bb8,0x39073c72,0x38cdf8c7,0x388a93a9,0x380e14d1,0x34f44fbd,0xb817a504,0xb891ef8d,0xb8da53f4,0xb8d50701,0xb8cfa23b,0xb8d3f6bd, +0xb8b9e2d5,0xb8a74caa,0xb88df3ec,0xb88c45b2,0xb86969d5,0xb88fcdd4,0x37ca1aac,0xb7116cbb,0xb743271f,0x35b975ea,0x3681b261,0x36a8f879,0x369bf030,0x36985123,0x36806ec1,0x36ab8fc2,0x36cebbd8,0x36e86dc2,0x36a5441c,0x36b2dc41,0xb708d548,0x372b405e,0xb7d96d63,0xb7ade6ac,0xb855d8c9, +0xb85523e9,0xb876e698,0xb8734368,0xb8826e1d,0xb88a32d6,0xb88a6243,0xb88af50b,0xb892df5e,0xb89f1bc4,0xb8b4950d,0xb8cd47d0,0xb8c67b92,0xb8c3104b,0xb8b78ec8,0xb8b84853,0xb89dc932,0xb8bff899,0xb879db5d,0x383ce6ce,0x37caf7c0,0xb533793a,0xb71d62e8,0xb73ac5a6,0xb773dd52,0xb75ea16b, +0xb76fd338,0xb76d3ba5,0xb78a4c0c,0xb74af8d4,0xb729a903,0xb549edd4,0x37f08637,0x37e81b31,0xb89715a9,0xb8356279,0xb83bf248,0xb8419375,0xb84b03bd,0xb858ae64,0xb8619d70,0xb8675a21,0xb87e51ad,0xb88a5378,0xb892c0a7,0xb89d5235,0xb8a32dd6,0xb8ab6d84,0xb8a3fe25,0xb8a17554,0xb89ec5a2, +0xb89acaff,0xb89bac5f,0xb87d5e2e,0xb8d2a09e,0xb8bc01f4,0xb8cf307e,0x380947a0,0x37992239,0x381b73ae,0x381b062d,0x3817a3c7,0x381869b8,0x38172838,0x38191877,0x3813ea20,0x37ad8b28,0x38049fc9,0xb8b6c6f0,0xb896fb40,0xb89d04be, +}; + +const uint32_t defaultHRIR_rom_AlphaR32[470 * 86] = { +0x3e8065c3,0x3e6ef862,0x3e9c117d,0x3d6fefdf,0xbd6f840b,0xbe245973,0x3e022d81,0xbd2167b3,0xbe211338,0xbe2839d2,0xbe21fc71,0xbe049f6d,0xbe2067a7,0xbe25efd4,0xbe202ffd,0xbd25123e,0x3dc1efdc,0xbe2ea55d,0xbd3924e1,0x3d415830,0x3e8d91aa,0x3e5e148b,0x3e6db67d,0x3e70d2c7,0x3e71faf2, +0x3e742a24,0x3e767460,0x3e789e68,0x3e7d14ea,0x3e814fd9,0x3e84afa1,0x3e879b3b,0x3e8bffa0,0x3e89dc0c,0x3e871fb7,0x3e7fe418,0x3e80d105,0x3e955dbf,0x3e8602f6,0xbdb41e6d,0x3e47b547,0x3d78dbd8,0x3d8d8a54,0x3dff4f7f,0x3dd6cbd4,0x3e2a712f,0x3df98017,0x3d723363,0x3de2e600,0x3dfba89d, +0x3dde6511,0x3d5457e0,0x3db00e5f,0x3dbb73b5,0x3de8956c,0xbd66c649,0x3e54f09e,0x3e791bbc,0x3e743d87,0x3e832dbc,0x3e83a2b0,0x3e876621,0x3e8a3e52,0x3e8c5e71,0x3e91cf6b,0x3e9aa2ef,0x3ea5faa1,0x3eb09ae8,0x3ebae53b,0x3eb97981,0x3eb0a1fa,0x3e9c5594,0x3e95e166,0x3eaf0a9e,0x3e78672c, +0x3d80d7ea,0x3de6e42f,0x3cad7122,0x3d404dda,0x3d26ff97,0x3d25eab0,0xb625670d,0x3d9fd366,0xbcb16f0f,0x3dc9c00e,0xbb91fc43,0x3d7324db,0x3b3b7491,0x3d56ebcd,0x3d523589,0x3d4e1a21,0x3d099ec6,0x3e0c9517,0x3e75e3a0,0x3e658021,0x3e868d80,0x3e873369,0x3e8e8957,0x3e94e2d6,0x3e9a53d0, +0x3ea61b0d,0x3eb6c836,0x3ec86fee,0x3edcb7a7,0x3ef012e9,0x3eeb9c0c,0x3eda6e87,0x3eb4e46f,0x3ea4f89d,0x3ec19ceb,0x3e428976,0x3cb52432,0x3dd72e5d,0x3d62d37c,0x3d10529b,0x3d3b2b85,0x3ce8fd33,0x3cda17ef,0x3c39df54,0x3d11d620,0x3b524a66,0x3b99f01b,0x3cb74290,0x3c6923bd,0x3d08b12d, +0xbc8a2c94,0x3d4babe8,0xbba0814f,0x3ddb5618,0x3e57c156,0x3e5c92ea,0x3e84515a,0x3e8492bc,0x3e8e7cc0,0x3e978bed,0x3e9c3c72,0x3eac8282,0x3ec7a9f6,0x3ee7d52d,0x3f056a80,0x3f16c700,0x3f155eec,0x3f065e7e,0x3ed26069,0x3eafaa5a,0x3f03775a,0x3e91af84,0x3d82af5a,0x3da48683,0x3cc5b7d7, +0x3ba51a89,0x3d439b45,0x3c9a2fe1,0x3cb4f27c,0x3c91083b,0x3ca0a0f7,0x3c9c923d,0x3c0b429c,0xbb72ea9e,0x3c021995,0x3cf42974,0x3c1f567d,0x3d6d2275,0x3c5c183e,0x3df3715d,0x3e801376,0x3e7db7fe,0x3eaaae92,0x3ebb0ac0,0x3ecebdae,0x3ed567a3,0x3ef804e9,0x3f0674e8,0x3f07bd54,0x3f1da07e, +0x3f23ca8f,0x3f210ab6,0x3f1ab5e3,0x3f0f1808,0x3f023a4c,0x3eea48d6,0x3f067392,0x3e4e2930,0xbbb8773b,0x3dd7ee78,0x3de8c36e,0x3d61cbe1,0x3d9f79ce,0x3cb7a6b2,0x3cdf3c0a,0xba82da31,0x3c78d616,0x3c58c047,0x3c32c54c,0x3ccfc36c,0x3d0066ed,0x3d1a6393,0x3c2c99d6,0x3d65dacc,0xbb18e9ce, +0x3e09983a,0x3e91809c,0x3e960fb6,0x3eca264c,0x3ed32d12,0x3ee65a30,0x3ef4e2f2,0x3eeb83ac,0x3eecde62,0x3ef7acab,0x3f0bcaa8,0x3f17c181,0x3f1ff78a,0x3f27da67,0x3f22c01c,0x3f17ba6c,0x3ef908f5,0x3f44bdc2,0x3e8b2396,0xbdbf5a5f,0x3de8db1a,0xbd3fdf54,0x3dae7ab7,0xbd193fbc,0x3d201d5b, +0x3b8d4cc5,0x3d29df7a,0x3c9a659e,0x3c36c917,0x3cacfd9d,0x3cb6763f,0x3ce3a84a,0x3d82a966,0x3c8c5ab7,0x3d998c76,0x3d028b7b,0x3e01a9f2,0x3e9d5820,0x3e97882c,0x3ec9a904,0x3ef8fb8a,0x3f17dc21,0x3f308451,0x3f36dffe,0x3f309f9f,0x3f1db901,0x3f084ae1,0x3f0e463b,0x3f27993e,0x3f3e4b18, +0x3f5136f6,0x3f75ec5d,0x3f4a81a3,0x3f72211d,0x3ecaf79c,0xbb9dbe5a,0x3e6ab743,0xbc372e54,0x3dec7f5e,0x3d29a709,0x3cffc775,0x3b12f0ae,0x3d0513b3,0x3d22109a,0x3cd96964,0x3c6f8c56,0x3b1d1031,0x3d0aebd5,0x3cbd5b25,0x3cd88ed3,0x3dbbe74c,0xbce09e5c,0x3e186f0c,0x3e915f60,0x3e8ebaf2, +0x3eb710a1,0x3ed5d35b,0x3ef7f89c,0x3f0908ff,0x3f169b43,0x3f1e2992,0x3f210e31,0x3f253b7d,0x3f242a29,0x3f1ff7d3,0x3f2e6efe,0x3f393f7d,0x3f5891db,0x3f5195c5,0x3f48fc36,0x3f057524,0x3c88b5e7,0x3db92868,0x3e0426a2,0x3c40b3a9,0x3dbb1f8c,0x3db2f15a,0x3c151bf8,0x3cf56bdc,0x3a56ebbf, +0x3cccd88e,0x3d11d826,0x3ced451a,0x3ce5ced1,0x3c8499e0,0x3d5a9ad8,0x3d8962c3,0xbcf9fe12,0x3e2fb123,0x3e8b8d2b,0x3e6e13d4,0x3e87e361,0x3e9c2adb,0x3ec36f02,0x3ef2657a,0x3f08130e,0x3f14bf9f,0x3f1f2a41,0x3f0d5840,0x3f06170c,0x3f0ee615,0x3f0ca974,0x3f168d99,0x3f32b9d5,0x3f32b272, +0x3f00e3ee,0x3ebe6232,0xbc9ecba2,0x3d95b9c5,0x3c7b6152,0x3bf2199e,0x3d71eeff,0x3cee9a7a,0x3d70baf6,0x3d30b49d,0x3da6249d,0x3c3b9000,0x3c9bf39d,0x3d106ddf,0x3d604d19,0x3d693f42,0x3daf8c34,0x3d9b4dfa,0x3cf6a0bd,0x3e19a4e4,0x3e8c58c8,0x3e80356d,0x3e8f4964,0x3ea35fd2,0x3eb4564d, +0x3eb965ab,0x3eba17d3,0x3eb0f3c8,0x3ea81da3,0x3eb12bc9,0x3ec75f9f,0x3edd3de7,0x3eda6d6c,0x3ed7d39e,0x3edac08c,0x3ed92cbd,0x3eb54624,0x3e5b3505,0x3d9c85dd,0x3e254f25,0x3d699fb5,0x3d9490c6,0x3d3dfd9b,0x3d244a9e,0xbc86fd01,0x3d95a250,0xbd367345,0x3de0684e,0xbcacc494,0x3d4e59d4, +0xbc8468ff,0x3d39a0f9,0x3c984c6a,0x3d47de30,0x3c9d7424,0x3e19ea16,0x3e79b070,0x3e3e130f,0x3e532614,0x3e5ca9c1,0x3e7421ac,0x3e806864,0x3e9aba0b,0x3eb0c53f,0x3ec5fc9d,0x3eca9d2f,0x3ecbe9e8,0x3ecf4354,0x3ec977d2,0x3ec0673b,0x3ebded84,0x3ea23e32,0x3e8bd959,0x3e8200b3,0xbdecaf4f, +0x3e2f9d11,0x3d225a67,0x3d677c45,0x3e042a7c,0x3de288de,0x3e41c8a1,0x3e129920,0x3d82280a,0x3e018140,0x3e1d5709,0x3e0a8510,0x3d8441cb,0x3dd6ebc3,0x3dead08b,0x3dff1049,0xbd869b75,0x3e463dac,0x3e56ee89,0x3e4a4368,0x3e53b006,0x3e4e5d2a,0x3e503eca,0x3e4bfcc2,0x3e6c40d1,0x3e7f74a6, +0x3e8ac8c4,0x3e935227,0x3e9d568c,0x3ea796ec,0x3e9fc971,0x3e97e5ff,0x3e947c7f,0x3e898b74,0x3e83d5be,0x3ea9adfc,0x3d54c4c3,0xbd8eb9c9,0xbe3384d8,0x3e0abcc9,0xbd72cf50,0xbe3b2b81,0xbe47d2e4,0xbe44847d,0xbe1f3b94,0xbe428b35,0xbe4da6fd,0xbe4576de,0xbd7bfe81,0x3dc350d9,0xbe51b871, +0xbd8d818b,0x3d152a05,0x3e9f67a5,0x3e77c8a0,0x3e81bf8f,0x3e8199b1,0x3e81759a,0x3e81cfc6,0x3e7fdba1,0x3e83fc0c,0x3e86b35c,0x3e899be9,0x3e8de1cd,0x3e917c1b,0x3e976359,0x3e933f79,0x3e9164ce,0x3e8edf6d,0x3e8dbe3b,0x3e9b4c11,0x3eee9e61,0x3ee16fd2,0x3ed73bfd,0x3f031958,0x3efcd5c9, +0x3eb939e6,0x3ef5a55a,0x3ef279dc,0x3ebffd41,0x3ebdf966,0x3eb9725b,0x3eb1960e,0x3eb0c909,0x3eb0d1b6,0x3eac5428,0x3eec360f,0x3ef02caf,0x3ea9f619,0x3eed5478,0x3ef65df3,0x3ecb29cd,0x3ed0ee4d,0x3ed5f1c7,0x3ed87975,0x3edb0693,0x3eddba94,0x3ee081ce,0x3ee4a6c4,0x3ee818c1,0x3eeb6112, +0x3eeedbb5,0x3ef2c527,0x3ef98bd9,0x3ef6e4c4,0x3ef48d06,0x3eef1732,0x3ee8c183,0x3f01a7b9,0x3f060eda,0x3f011c34,0x3ee97bf3,0x3ee3cd81,0x3ed515c3,0x3ecee8ac,0x3ec2d045,0x3ebb72df,0x3ec4f2af,0x3ec6388a,0x3ec58408,0x3eb90f06,0x3ebc91ee,0x3eb57a5f,0x3ebafc6e,0x3eccf7ed,0x3ec3a84b, +0x3ecb1dc4,0x3ed7f656,0x3ecf6d98,0x3ede49af,0x3ee54c83,0x3eec8436,0x3ef4422e,0x3efd7741,0x3f04847b,0x3f09d504,0x3f0e85a0,0x3f132e72,0x3f19d54c,0x3f238988,0x3f2346f1,0x3f1fad6a,0x3f15d1df,0x3f0e073b,0x3f064ffa,0x3f06a50a,0x3f025dff,0x3ede5978,0x3ebd48d6,0x3eab068e,0x3e9c0293, +0x3e910dad,0x3e82f145,0x3e6db753,0x3e76c61f,0x3e6fbd14,0x3e59678a,0x3e75be18,0x3e6c6cc7,0x3e834651,0x3e931fa3,0x3e9251d5,0x3eacc574,0x3eb45e99,0x3eb9fdc9,0x3ed32464,0x3ee52293,0x3ef30333,0x3f017534,0x3f099a1a,0x3f14a2d6,0x3f1d4c2c,0x3f26d89e,0x3f30611e,0x3f3da198,0x3f4e9155, +0x3f4c09e5,0x3f45df03,0x3f30a100,0x3f1e6942,0x3f0e3e38,0x3f0e47f6,0x3eee0c29,0x3eb928f3,0x3e908df9,0x3e7640aa,0x3e489172,0x3e0c2cfc,0x3dcfdcc4,0x3d9bfb3a,0x3d8fb18b,0x3d3a3036,0x3d4da7e6,0x3d704cb4,0x3d8d07c3,0x3ddd7b8f,0x3de50f7f,0x3e2287eb,0x3e4c35d2,0x3e836a1e,0x3e97ac07, +0x3eb2caba,0x3ecebd89,0x3ee227b7,0x3ef90735,0x3f087a48,0x3f1879a1,0x3f284205,0x3f34f5bf,0x3f431055,0x3f5ac8d6,0x3f7b7a5e,0x3f7df07b,0x3f725367,0x3f4dba7a,0x3f2eb8c6,0x3f302d7f,0x3f201388,0x3f25e853,0x3eeca8a4,0x3eafd375,0x3e916868,0x3e73135e,0x3e379a5b,0x3e123e5c,0x3dd89349, +0x3dd5c6c7,0x3d9951f7,0x3d857ec9,0x3d6d709e,0x3dc353a3,0x3e069f23,0x3e1f594c,0x3e5b9072,0x3e933157,0x3ebc5be8,0x3efb6964,0x3f1a17f4,0x3f335985,0x3f41f93b,0x3f547ff3,0x3f6ca8a7,0x3f724a5b,0x3f7d67f0,0x3f82715f,0x3f97d6cb,0x3f9bf202,0x3f94f875,0x3f8c8e29,0x3f85e5c6,0x3f82a7f3, +0x3f61a3fb,0x3f6f42c4,0x3f495fe1,0x3f3424d3,0x3f0ee426,0x3ef9a4b0,0x3eb31f2e,0x3e880b49,0x3e46b6de,0x3e11ca66,0x3dd3fd91,0x3dcc84ba,0x3dbe8bdf,0x3db5b019,0x3ddfe279,0x3e029bb3,0x3e289aba,0x3e77072d,0x3e9adb96,0x3eb85dc0,0x3ee1ea00,0x3f063f84,0x3f181e75,0x3f2c6f00,0x3f45ea85, +0x3f653770,0x3f840a84,0x3f935a3f,0x3f9e3a6c,0x3fa13332,0x3faeb7d7,0x3fb251fc,0x3fa9689e,0x3fa398e2,0x3f9c4937,0x3f9798d5,0x3f8c8154,0x3f6ddfcb,0x3f8138fa,0x3f51a631,0x3f152d81,0x3f09f0a7,0x3edb4369,0x3e8f7079,0x3e625c79,0x3e182586,0x3e2c10a6,0x3e433eb8,0x3e03d9a8,0x3e0bd75c, +0x3e27191b,0x3e3b30b4,0x3e815ae5,0x3e98b875,0x3ea2133e,0x3ec5d713,0x3ed313f7,0x3ee422d1,0x3f0b7e5e,0x3f24f353,0x3f2a38b2,0x3f39a2d7,0x3f50b0a0,0x3f73f2c6,0x3f8eebc5,0x3fa47402,0x3fa8eaf4,0x3fa0383b,0x3f92df72,0x3f833234,0x3f76643d,0x3f566ad5,0x3f75d065,0x3f1b40de,0x3f696d80, +0x3f6a937c,0x3f11d07e,0x3ee5e72d,0x3ebf3b22,0x3e89555d,0x3e5c1426,0x3e26839f,0x3e43726b,0x3ea7c5f4,0x3e37b1a3,0x3e024c82,0x3e2c86fe,0x3e6a5ece,0x3e7e9fdd,0x3ea835b9,0x3ec6ad44,0x3ecffadc,0x3edf628c,0x3ed9ac32,0x3ef8d1b9,0x3f0f6390,0x3f339a37,0x3f4c4298,0x3f5d3dc5,0x3f769a49, +0x3f840bd3,0x3f892cbf,0x3f98e0eb,0x3fa0ae5b,0x3fa56e4f,0x3f895033,0x3f62cd2f,0x3f22751f,0x3f42f211,0x3f41449e,0x3f4fddb2,0x3f6376dc,0x3f24d7de,0x3efce90e,0x3eca1298,0x3eb0ad83,0x3eb0c3eb,0x3e8431c2,0x3e8025b1,0x3e6884c0,0x3e468439,0x3e484def,0x3e6174fe,0x3e882abb,0x3e9522c4, +0x3eb74a39,0x3ecae442,0x3ee0d203,0x3f139a98,0x3f14835e,0x3f18ca09,0x3f0b7ee4,0x3f1c6cd7,0x3f2e33d1,0x3f4b442d,0x3f5e66b7,0x3f75835b,0x3f85ec4a,0x3f90edfe,0x3f97051f,0x3f9e1766,0x3f93df42,0x3f8be446,0x3f707ec8,0x3f74eb35,0x3f5d98cf,0x3f54b3df,0x3f50bdb1,0x3f2b6cdf,0x3eff2c67, +0x3eee110b,0x3ec9be78,0x3ea59c72,0x3e9dd3c1,0x3e91e884,0x3ea494dc,0x3e5f475c,0x3e601e5d,0x3e7efabe,0x3e9bd793,0x3ec2d750,0x3eedd6a0,0x3ef95ff2,0x3f05f43f,0x3f1c9e56,0x3f2851cc,0x3f266502,0x3f157109,0x3f1c912c,0x3f2a40cd,0x3f40de1a,0x3f5b0333,0x3f785930,0x3f8a3d52,0x3f9089f0, +0x3f929013,0x3f907b6a,0x3f8fe7c7,0x3f8b712b,0x3f7c08aa,0x3f78008b,0x3f5bb2d9,0x3f5142d6,0x3f31353e,0x3f23efd6,0x3f08753f,0x3ef0cda4,0x3ed248aa,0x3eada14e,0x3ea33805,0x3eb8911e,0x3ea52d7e,0x3ed5336f,0x3e955bfa,0x3ec5e652,0x3ea5a0d9,0x3ed68990,0x3ee0c41e,0x3ef8c60b,0x3f075f15, +0x3f19792f,0x3f23854a,0x3f25bcab,0x3f2d5ce2,0x3f37a807,0x3f3eacdd,0x3f43e116,0x3f51419f,0x3f5b3b25,0x3f659b9e,0x3f6fc361,0x3f7a6f46,0x3f82b178,0x3f7f9175,0x3f7b3e6b,0x3f7501d3,0x3f693a34,0x3f436a68,0x3f4acd2d,0x3f0b5a99,0x3f340951,0x3f1e7566,0x3f17ada2,0x3f1e045e,0x3f12f94d, +0x3f1e2c21,0x3f22045a,0x3f1606d8,0x3f21b54c,0x3f19660f,0x3f19014a,0x3f0bfa20,0x3f143629,0x3f1e45bc,0x3f1662dd,0x3eec110a,0x3f302c2e,0x3f2dbf8f,0x3f33a04b,0x3f36ee01,0x3f3b88e5,0x3f4157e8,0x3f46eccb,0x3f4bdd27,0x3f50006e,0x3f53ee64,0x3f569614,0x3f587263,0x3f5cd842,0x3f560902, +0x3f51a31c,0x3f4d158b,0x3f49daad,0x3f363039,0x3f3de28c,0x3f3a97c4,0x3f22dd68,0x3ec4e885,0x3f3fc5ed,0x3f2294b3,0x3ed0dcb0,0x3ecdc593,0x3ec9bd45,0x3ecbf552,0x3ec26e57,0x3ec42580,0x3ec1146f,0x3f209279,0x3f37b6a2,0x3eafeb27,0x3f1f9d96,0x3f332e53,0x3f35bdfa,0x3f2e4082,0x3f337475, +0x3f342409,0x3f357a0e,0x3f35fcfd,0x3f36c017,0x3f37ca50,0x3f391184,0x3f3a640e,0x3f3c2fc2,0x3f3dc7a4,0x3f4029bb,0x3f3e3651,0x3f3d37f4,0x3f3b4528,0x3f3b5958,0x3f4af98c,0xbd4a668d,0xbd3883af,0xbdd47c37,0x3d162b28,0x3e2bee51,0x3ecfdd11,0xbcead0e2,0x3e154543,0x3eba89f2,0x3ebe36e4, +0x3ebd6fc3,0x3eb90ac4,0x3ec49349,0x3ec86c09,0x3eca8deb,0x3e1a59ac,0x3bb5d9a7,0x3edb4aba,0x3e2d23dd,0x3d73ad41,0xbd9e28f4,0xbce67316,0xbd45bccf,0xbd588046,0xbd5a9ac4,0xbd58af5b,0xbd4bff77,0xbd4c3bc8,0xbd558c92,0xbd62dd56,0xbd85a936,0xbd99ec19,0xbdc3795a,0xbdaa9d74,0xbda0b9cc, +0xbd883335,0xbd8abe60,0xbd9f7ba7,0xbda21ff9,0x3e82d352,0xbce27b21,0x3dabe3c0,0x3dc3ac51,0x3cf491a0,0x3d495a43,0xbca2b2ca,0xb9f73a5a,0x3d8079ad,0x3c435ef2,0x3cbf54c7,0x3cdef2a5,0x3de3c656,0x3dadc79e,0x3d555243,0x3d922739,0x3e761a59,0xbca50f3c,0xbcc4dedf,0xbd1f7c65,0xbd6c73c4, +0xbd75aa1a,0xbd710faf,0xbd451859,0xbd338d97,0xbd4829e4,0xbd7d7944,0xbdbafdd0,0xbe03541d,0xbe404271,0xbe2ec299,0xbe1f22b6,0xbdeace05,0xbdcece1b,0xbdb1a1b2,0xbcbb6e55,0x3d7f5030,0x3ce2da40,0x3de8951d,0x3dd4ad43,0x3dc864d7,0x3d8fa736,0x3dd2c6c4,0x3d4b55fe,0x3e0b77e9,0x3d29950f, +0x3e13dcd8,0x3d8c3765,0x3e0c6e07,0x3dc4551f,0x3dd58800,0x3e0b57ce,0x3e02b9d6,0x3d83c0cd,0xbc1bc672,0xbcc7ea9c,0xbd8c9b83,0xbd91f0e3,0xbd889958,0xbd33a873,0xbd12ec75,0xbd1b48a4,0xbd7d7e5f,0xbde62c66,0xbe487615,0xbea2e75e,0xbe8a765c,0xbe75b61e,0xbe0fe42e,0xbdc94e16,0xbd8b5dd0, +0x3d759da1,0x3e17f51d,0x3d543bb2,0x3d9e3b4c,0x3dd4bc29,0x3dac1769,0x3d911644,0x3d457d3f,0x3d5ec393,0x3d4f05c9,0x3d96faba,0x3d8ba4b8,0x3d850ce9,0x3dacfb86,0x3db31a21,0x3e199fe9,0x3dfe0360,0x3e2c83a5,0x3ddcb3fb,0x3d122268,0x3b065f9d,0xbd587e1d,0xbd5bc9fe,0xbd36cc12,0xbb0e9f1e, +0x3ce1bd0e,0x3c75f519,0xbc86a865,0xbdd3a1ea,0xbe836793,0xbef6cee3,0xbee05493,0xbebe19bd,0xbe4b8d06,0xbdc371de,0xbe953255,0xbe39afac,0xbd05b0d0,0x3d843699,0x3dbc3f5a,0x3daf7aae,0x3cced851,0x3d56ca1b,0x3cfacf0a,0x3d179e89,0x3d6edff3,0x3d92ff4d,0x3daf2bc2,0x3db6a41f,0x3dbaf370, +0x3dc14993,0x3e0c46d1,0x3e181d14,0x3e4ab001,0x3dd04195,0xbd2fd8ea,0xbda6d399,0xbe503b78,0xbe6289eb,0xbe6eb673,0xbe5b1c24,0xbe64aed4,0xbe52bb9e,0xbdde7987,0xbed46ec2,0xbef30baf,0xbee51254,0xbec439dd,0xbeb73f40,0xbeb8050d,0xbe94e994,0xbf205c18,0xbd739770,0x3e5f118f,0x3e07e27f, +0x3daae663,0x3e203359,0x3dfd98dd,0x3e367c01,0x3dfd6cd4,0x3df41fe8,0x3dfcae41,0x3d8438cb,0x3d39d775,0x3cfd8874,0x3d3c17b9,0x3d8ae7be,0x3dee5346,0x3def82cc,0x3e5c115c,0x3dc193ea,0xbd468e63,0xbdcab370,0xbe93bad7,0xbec03dec,0xbef90238,0xbf11ef0a,0xbf08d23c,0xbef8758e,0xbec978dd, +0xbf029d07,0xbf09d509,0xbf07cab4,0xbee7e684,0xbee68044,0xbf0a52ee,0xbf1d5f25,0xbf1a26d9,0xbeacc3ac,0x3e309dd7,0x3d8f3126,0x3e2a4055,0x3d466352,0x3e5aa579,0x3e012c88,0x3e105f57,0x3deaeb91,0x3e684849,0x3e385041,0x3e309b25,0x3e1bd72b,0x3df809f4,0x3d99a021,0x3e349fc5,0x3e0dba73, +0x3e0d673b,0x3dae7fd6,0xbdbaeeac,0xbe378268,0xbebd5e54,0xbee45f77,0xbf0f3e1f,0xbf2d0f70,0xbf435a15,0xbf465daf,0xbf30893c,0xbee0ea84,0xbe8d6556,0xbe8273a4,0xbd7f5ef2,0xbdb2b3f9,0xbe33d232,0xbed4adfc,0xbe100876,0xbe66aacf,0xbbc9d2fe,0x3d3b3043,0x3e6783b3,0x3db4b577,0x3e25c225, +0x3e102047,0x3e19d63b,0x3e25a7f3,0x3e9d79dd,0x3e05d2cf,0x3dc55056,0x3e249c95,0x3e07a54f,0x3e428609,0x3e4a83f9,0x3e093832,0x3e6acd41,0x3d5c9db0,0xbd77518e,0xbdd1d012,0xbe625c40,0xbebebe5d,0xbefb1c69,0xbf0b6fb8,0xbf1bb878,0xbf13b99c,0xbeef851b,0xbedb5c55,0xbea5f0ae,0xbe89f2f3, +0x3ca104b2,0x3e875088,0x3f128703,0x3d4f0ea4,0xbde36ca5,0xbe8319bf,0x3b34f3ab,0x3d68aa89,0x3db8b479,0x3e398bac,0x3df31d8e,0x3d95272e,0x3e479ad3,0x3e3a7720,0x3e9633de,0x3e4123a0,0x3e2a3c18,0x3e45d95c,0x3e4b4d9d,0x3e7ce703,0x3e4928d0,0x3e6ba109,0x3eb3029b,0x3d4f6543,0xbdbb01ad, +0xbdb923a1,0xbdc29f33,0xbe1a44b6,0xbe7f9794,0xbec71d74,0xbee45ece,0xbefbd3a8,0xbefe3147,0xbecdea66,0xbe858733,0xbe4f1ac6,0x3d08ec12,0x3d912707,0x3da4b4d5,0xbd9257b5,0xbe00baa7,0xbdaac742,0x3e5b9f03,0x3e180aa8,0x3e7a1c23,0x3e4f1bc0,0x3e1cdb2b,0x3e30fafa,0x3e44fb50,0x3e6ef246, +0x3e1104df,0x3e86cc2a,0x3e6f9b5d,0x3e59758a,0x3e3d47f8,0x3e359861,0x3e144bc7,0x3e426bb5,0x3e8c99c6,0x3d952df1,0xbd8d2403,0xbcb8fd81,0xbd297d80,0xbda30f9b,0xbe0ce258,0xbe43c655,0xbe7ee1f0,0xbe8b558c,0xbe7dd17a,0xbe71dd2d,0xbe4ea09d,0xbdfbe8f4,0xbc5d412d,0x3d19fb0c,0x3dae38ed, +0xbcb5fa32,0xbc7ee9ea,0x3dcabf21,0x3ea0a6e5,0x3e4184a5,0x3ea35c61,0x3e8c158b,0x3e94c386,0x3e8a4a5a,0x3eae64a0,0x3e46bcd3,0x3eacfa4c,0x3de8aec9,0x3eb36156,0x3e5078d7,0x3eb23dab,0x3e6e18e0,0x3e8bf11e,0x3e747239,0x3e8d933a,0x3dd7c0fd,0x3b2805c1,0x3dd654c3,0x3dcb75aa,0x3d8a09f5, +0x3cdab8c3,0x3bc57ab1,0xbd4281a7,0xbdb47b41,0xbe0c9e6a,0xbe07cf22,0xbdfebc9e,0xbdf2662a,0xbd9c6a36,0xbc67234b,0x3d830d7c,0x3d8e4ac1,0x3d1930b5,0x3c8c2913,0x3f2706a3,0x3de782c3,0x3e9ffe0e,0x3e95732f,0x3e1607c0,0x3e28a824,0x3d02d2ef,0x3d99c231,0x3e47fa22,0x3d9cff78,0x3d83f432, +0x3d93d722,0x3e710bb2,0x3e45cab7,0x3e28c3ab,0x3e507650,0x3f12844c,0x3dbbfc4a,0x3de3feca,0x3e0c57d9,0x3e17e5fb,0x3e2ceb36,0x3e3a8ad2,0x3e4c27df,0x3e1d2d97,0x3e0147db,0x3dc77ae4,0x3da6a4d1,0x3d788d6b,0x3d16bd73,0x3d33050a,0x3d27a23c,0x3d04b733,0x3d296792,0xbb5409c7,0xbe05a9fe, +0x3e6e9243,0x3eedbe82,0x3f505ee6,0x3d8839b4,0x3ed11b00,0x3f40b707,0x3f461df9,0x3f44ed39,0x3f396754,0x3f46537b,0x3f4906e9,0x3f46b46e,0x3ecd102c,0x3df77361,0x3f595517,0x3ee133eb,0x3e77beb6,0xbddabe54,0x3c83d81a,0xbb5c75bf,0x3ba9b5c2,0x3c70b698,0x3cc7880d,0x3d309ff9,0x3cefd43c, +0x3cb20ee7,0x3c55641b,0xbb1a5ba2,0xbc800b5e,0xbcff5878,0xbcfc8b42,0xbd03c02b,0xbd049203,0xbd107863,0xbd7c1ec8,0x3dea6175,0x3deae939,0x3e24ee00,0x3d3e73ff,0xbd0b1360,0xbe00671e,0x3da255d0,0xbcb51c4b,0xbddfa3d7,0xbde88ddd,0xbddf0809,0xbdbd22d3,0xbdd73ff0,0xbddd7d80,0xbde049e7, +0xbca0a671,0x3d767047,0xbdf32649,0xbcd17dcf,0x3d0b1b5d,0x3e08cece,0x3dd816e0,0x3de3c275,0x3ddbfcde,0x3dd22544,0x3dc7f139,0x3dc01c2f,0x3db0b46b,0x3dabdf0d,0x3dab48ac,0x3db6a2a5,0x3dc7fedc,0x3de48584,0x3debce1c,0x3dee3990,0x3de094be,0x3df81c2e,0x3e231177,0x3e1f1462,0xbd78abb0, +0x3e0106aa,0x3d2bbf5d,0x3d18aa73,0x3d8e7474,0x3d859a96,0x3dcdfcca,0x3db115ed,0x3d78575c,0x3dac3ae5,0x3dac013c,0x3d91f12e,0x3d2fc2ff,0x3d6305e0,0x3d844d9d,0x3d8edc99,0xbc4e2ddb,0x3dfe2786,0x3e0b8174,0x3e0882b8,0x3e02a4db,0x3df29702,0x3ddc1cab,0x3dc5d10c,0x3d96f9d9,0x3d8342f0, +0x3d83d623,0x3d93280c,0x3db3bd51,0x3df0a6c8,0x3e04bbdd,0x3e12f117,0x3e097751,0x3e1c399d,0x3e714785,0x3e4a8927,0x3dee0776,0x3e04656a,0x3d4c0481,0x3d5ea357,0x3d3b5823,0x3d824e51,0x3d14b7b0,0x3da06918,0x3d4d588a,0x3dcc016e,0x3d3ff547,0x3d749407,0x3d45039b,0x3d8bc11e,0x3d61f583, +0x3d79499f,0x3d86afda,0x3de3e337,0x3e17d9a7,0x3e0aa9cd,0x3df6e2a0,0x3dc74f8f,0x3d894510,0x3d30b3fa,0x3ace92c9,0xbc822bdc,0xbc6607e8,0xba5cae55,0x3d5cd1fb,0x3e06c6e0,0x3e1dc794,0x3e2d28e2,0x3e11f38f,0x3e3f8f5f,0x3e8b0371,0x3e34f1f4,0x3dedb25b,0x3e3efda9,0x3de172ce,0x3d80b9a1, +0x3d7d674d,0x3d97f29b,0x3d9061b5,0x3d904732,0x3dc2b752,0x3d88a35d,0x3d907a39,0x3d87508d,0x3da5159c,0x3da0d27f,0x3d87060f,0x3db488dc,0x3dc89e8e,0x3e133a7f,0x3e37bdb8,0x3e399a53,0x3e2c48a9,0x3e15d37c,0x3df42478,0x3db5e72b,0x3ca414c2,0xbbd5ac29,0xbca6b1b3,0xbc87e1c6,0x3cd3acf2, +0x3ddfd70a,0x3e0a0274,0x3e2a3d1c,0x3e254d0d,0x3e5c61af,0x3f35b976,0x3f19a97a,0x3e98323a,0x3e86928e,0x3e4fbdb0,0x3e4305c3,0x3e5a48bf,0x3dfbe07d,0x3db79a0a,0x3d8c0047,0x3d8ae49a,0x3d99363e,0x3d81afa6,0x3d3ad85e,0x3d47aa5a,0x3d7a6d54,0x3da9cce7,0x3d82bcef,0x3cdd7f1c,0x3d57cb34, +0x3d8f1fab,0x3c220534,0xbd4636ad,0xbe22fc06,0xbe8b623c,0xbebf133c,0xbec9153f,0xbed9c2f5,0xbef941b0,0xbe74c6ee,0xbca883dc,0x3e8745c0,0x3ebf880e,0x3eed7cdb,0x3ef928d8,0x3f0541db,0x3f7b5ce5,0x3eae2f9f,0xbb9ebfb1,0x3e0f043f,0x3e21d98d,0x3dcdf99c,0x3de35eff,0x3dafe5c1,0x3de333a1, +0x3dcc4a72,0x3dea37bc,0x3d931e2f,0x3d791666,0x3d353b72,0x3d9f7384,0x3d97f9c6,0x3cf89400,0x3cffa670,0x3ba8408a,0x3df71a80,0x3e3756f6,0x3e37561e,0x3e73bef9,0x3e701c6a,0x3e53dd6d,0x3dfdfc49,0xbd2402ce,0xbe1ed696,0xbe6dac6e,0xbe0f8e76,0xbcd6ab0e,0x3e809452,0x3e80cd48,0x3edb0a4b, +0x3f34595a,0x3f5e84e2,0x3f6453f2,0x3f159922,0x3dd657a1,0x3e6ba00b,0x3d19ac9f,0x3e16c3d7,0x3cf8e32c,0x3dbb232a,0x3db31701,0x3dd3e1d8,0x3e2be80e,0x3dcbca7e,0x3d98f3fd,0x3d057dec,0x3d768736,0x3db862f6,0x3d20fc41,0x3e110d16,0x3e18f4e8,0x3e6534a6,0x3ec09e02,0x3ec50001,0x3ed94c13, +0x3eddf937,0x3edb13e7,0x3ed0e80c,0x3ec27bc5,0x3e9aee01,0x3e1e0aa9,0x3dae89bb,0x3e19b485,0x3eac2753,0x3e7fd248,0x3e5f8b37,0x3e6c5732,0x3f14e5c8,0x3e404463,0x3eee93d1,0x3e9ef4cb,0x3e72345c,0x3de4fbc5,0x3e32cd9e,0x3e049c09,0x3e210611,0x3df6bc3b,0x3e05bcc2,0x3e1f3733,0x3dbd953b, +0x3dba635e,0x3db4bf9b,0x3db5185b,0x3da6a04b,0x3d9d9112,0x3deb049b,0x3da9f5ec,0x3e69e977,0x3ec09dfa,0x3ebc8f7a,0x3ec52d03,0x3eb2bc8e,0x3ebc6efe,0x3ec96013,0x3ec7c90b,0x3ea7f4f6,0x3e4f6dc4,0x3dbcc0d5,0xbc5e687d,0xbd4ea109,0xbda871b9,0xbe0f9569,0xbeaed778,0xbc9f7221,0xbe1386ef, +0x3e2c21c9,0x3e5337f2,0x3e482d41,0x3e280524,0x3e1fa4c8,0x3de52c3a,0x3d5016f6,0x3d826420,0x3d859e76,0x3d9734fe,0x3de6d183,0x3dd5a6dc,0x3d36bd55,0x3c9146de,0x3ba23ce9,0x3cbd279d,0xbb4be57a,0xbd814037,0x3d124869,0x3e316e26,0x3e816be8,0x3ed0f0b2,0x3eca123d,0x3eceb001,0x3ec18823, +0x3eb03c70,0x3e893d08,0x3e203c37,0xbd151da6,0xbe4b6bb5,0xbe9009f0,0xbeba441d,0xbeac9ccd,0xbe9986e9,0xbe682eb3,0xbe4e3f60,0xbdc9bb13,0xbd942204,0xbd4dc3e4,0xbca1e228,0xbceae619,0x3bca7802,0x3d915707,0x3cb0f1e8,0x3b18407e,0xbc0c9ed2,0x3d715fac,0x3da6d8bd,0x3d770754,0x3d3ac178, +0x37926774,0xbd5f9a0e,0xbd25fea0,0xbda9b18c,0xbd53c439,0x3d4c3a2f,0x3de46f60,0x3e933870,0x3ea97494,0x3eafc871,0x3e988557,0x3e822c90,0x3e2f71db,0x3d7d50cb,0xbc7e1f73,0xbdd01152,0xbe721e1f,0xbe9e6f19,0xbea5ee63,0xbea8ae63,0xbe8849d2,0xbe78e483,0xbe58cff0,0xbe222829,0xbdd8eb85, +0xbd14b3df,0xbba68282,0x381dec55,0x3ce15e94,0x3c7ecb1b,0x3c946901,0xbb07a274,0xbbe2f6a3,0x3b8bbbd0,0xbc0214ca,0xbbc5c1f8,0xbc741fda,0xbcec9219,0xbcd6094d,0xbd662193,0xbbc3b63e,0x3d8706e9,0x3d95ad3c,0x3dd60eeb,0x3e079dd9,0x3e3a469f,0x3e7104c9,0x3e4e0bd4,0x3e37b449,0x3e2a2b51, +0x3d91f397,0xbc9d1bc6,0xbde41a52,0xbe33fe54,0xbe833b60,0xbeb0d293,0xbe93ddf9,0xbe723060,0xbe818e4c,0xbe4e4371,0xbe56d43e,0xbe474855,0xbe41a307,0xbe297365,0xbe17acbe,0xbe0b82b9,0xbe160d20,0xbe1251d7,0xbe09be49,0xbdec27e7,0xbdeb0d89,0xbde8ebaf,0xbe005412,0xbe091977,0xbe02af3b, +0xbdffc345,0xbe2ee835,0xbe394e7d,0xbe4a195e,0xbe546735,0xbe664a6d,0xbe7efb42,0xbe87f14f,0xbe8d1813,0xbe926899,0xbe9672e1,0xbe9a9cdf,0xbe9af132,0xbe9dc6c9,0xbe93e60b,0xbe882d3e,0xbe806df1,0xbe7aafaf,0xbe5a6a62,0xbe5a2728,0xbe833fde,0xbe84236f,0xbe4016d3,0xbe6e0a5a,0xbe78d44b, +0xbe49f901,0xbe4ae8ac,0xbe455f42,0xbe3dcfc8,0xbe3ef026,0xbe4087ce,0xbe3aee6f,0xbe6cc9cc,0xbe5ca5a0,0xbe2a2506,0xbe6ef217,0xbe64217c,0xbe39bc8e,0xbe3f0736,0xbe46b9ae,0xbe4bc3dc,0xbe4fc1a6,0xbe51778d,0xbe56d827,0xbe59e619,0xbe5e41bb,0xbe638f9a,0xbe63ac4f,0xbe658d88,0xbe6a52b3, +0xbe64a60d,0xbe633315,0xbe5d2508,0xbe5fed31,0xbe667e10,0x3e02a6c5,0x3df9d3b8,0x3dc84fc8,0x3e17e9d0,0x3e310c48,0x3e2f76bf,0x3e0500e2,0x3e1b0b5a,0x3e2285f5,0x3e21ed26,0x3e1f5c28,0x3e1b6f05,0x3e1bb88f,0x3e1a50fe,0x3e152b66,0x3e16775c,0x3e05e60f,0x3e17a852,0x3e18c325,0x3e0c3bde, +0x3dd2b71e,0x3deacee2,0x3df067d3,0x3dfd5f00,0x3e0208e0,0x3e0488bf,0x3e052de7,0x3e05521a,0x3e032592,0x3dffbb05,0x3dfa39e6,0x3deec9fa,0x3ddc929e,0x3dd18e19,0x3dd9d399,0x3dfb10b4,0x3df27bff,0x3df6d478,0x3e0118af,0x3e64b50c,0x3e032391,0x3e269cf8,0x3e11af0c,0x3dfb4f0f,0x3df0f151, +0x3dd4f037,0x3decb49f,0x3e0907ba,0x3dffbd76,0x3df7a171,0x3def4e63,0x3e00e7f0,0x3e011e74,0x3e052b34,0x3e013ac2,0x3e18d453,0x3de4ebae,0x3de58768,0x3dfe62fa,0x3e0e3bcb,0x3e188883,0x3e1e2e98,0x3e1cb053,0x3e1ecf67,0x3e1c7dac,0x3e12ebe3,0x3e0eee64,0x3e019b69,0x3de29f79,0x3db2541a, +0x3db1df5d,0x3df933c7,0x3df8b01d,0x3d9f0ab1,0x3de8e5b3,0x3e423d91,0x3e2488f0,0x3e3ff7a0,0x3e104f5d,0x3dfc80f3,0x3dd55cec,0x3dcd2f28,0x3db972cb,0x3e001e16,0x3dd760dc,0x3ddf857d,0x3dbd722a,0x3ddb222f,0x3ddeb7d5,0x3df5d1e6,0x3de78898,0x3e03dd3c,0x3dd52a6d,0x3dda3e65,0x3e0ae13d, +0x3e28d027,0x3e3da081,0x3e478132,0x3e406024,0x3e39e84a,0x3e287fa2,0x3e16322d,0x3e1aebd5,0x3e027155,0x3dbc7cfb,0x3d21eac0,0x3d5f1acc,0x3df46fa1,0x3dd3577d,0x3bab9b38,0x3df4fe14,0x3e401413,0x3dbdf72c,0x3e15ed68,0x3dfefe38,0x3daf9efb,0x3d7c8691,0x3d3938be,0x3d4ebc3f,0x3daff85f, +0x3d9deef7,0x3d9ff01f,0x3d847835,0x3da86969,0x3dbe4f9e,0x3db8376c,0x3dd9b77b,0x3def4e67,0x3da2122c,0x3dae780e,0x3de88b3a,0x3e182c2a,0x3e3238f7,0x3e385041,0x3e23af6b,0x3e1bcdc2,0x3e0eab6b,0x3e002fc1,0x3e0b488e,0x3e08e9df,0x3defedfa,0x3d2cf8eb,0x3d1e0177,0x3daab392,0x3d6a7f1e, +0xbe54f036,0x3dc2b3a3,0x3ec77742,0x3e89423b,0x3e8977e7,0x3e5e1ff8,0x3e1069dd,0x3e2f7b2f,0x3e0845a4,0x3dd7987d,0x3ddc6ad0,0x3db1a43d,0x3d9a2508,0x3d38b23c,0x3da8c571,0x3dc8083f,0x3dc68d53,0x3de87989,0x3e09991a,0x3e21c3cb,0x3e4d8af0,0x3e876d8e,0x3ebc38eb,0x3ed59ad2,0x3ee6e147, +0x3ee2ad04,0x3ec2483a,0x3ea93726,0x3e9438a2,0x3e7f9cf9,0x3d30bd59,0xbe6e6c18,0xbebcddfe,0xbeb38b2e,0xbe4acab4,0xbd83f1d5,0xbf36a901,0x3d49533f,0x3ed9c37d,0x3e157de9,0x3dc4a5ad,0x3e0aafbc,0x3dac29ac,0x3db06732,0x3db5e9d0,0x3dd0f627,0x3dd6bc4c,0x3dd44ab7,0x3ddaeaa6,0x3da97940, +0x3db4803d,0x3dcc3511,0x3e0c6a5c,0x3e1e18bd,0x3e351cad,0x3e21e0b8,0x3e063ce7,0x3e275e08,0x3e61dd00,0x3e837e17,0x3e9b5bcd,0x3eb662d7,0x3ecb140b,0x3ecf507c,0x3ec27e84,0x3e8e0e65,0x3e03784b,0xbe0e7a0f,0xbea8ab53,0xbf0c767d,0xbf5429f1,0xbf29f852,0xbf9b5cf3,0xbedc837f,0x3e54a29b, +0xbdb35bc2,0x3e64d250,0x3ccf3806,0x3e4bae9b,0x3dad6f0c,0x3de9520c,0x3dd021b2,0x3e29efcc,0x3d81720d,0x3cf1f792,0x3d3b7a33,0x3dcc6303,0x3e01488b,0x3e1e7f94,0x3e288318,0x3e5dc0f5,0x3e33a601,0x3de8e0b1,0x3e1903a2,0x3e185af0,0x3e184d58,0x3e0cdc50,0x3df4534b,0x3d4e8f3f,0xbbbfd10b, +0xbcc3c9bc,0xbe3910c7,0xbec55dc4,0xbf2a90e6,0xbf3ef4e1,0xbf43452a,0xbf64bb3d,0xbf7d74a6,0xbf5986db,0xbf4f2dc5,0xbe9f2782,0xbe939a62,0x3d046f39,0xbd8b8340,0x3d16b725,0x3aa5ca12,0x3db6b9a4,0x3d5abcd4,0xb98aaa25,0x3dd7f554,0x3e14b421,0x3dabdc84,0x3de03a61,0x3dd4596b,0x3dd46836, +0x3dc5ce7b,0x3e362dac,0x3e316dc7,0x3e016aab,0x3e0e6044,0x3dbb6bfe,0x3dea2f8b,0x3d0538eb,0xbde49fd0,0xbe80c40c,0xbeb1c2c8,0xbebcdb52,0xbed69785,0xbeec342e,0xbf070104,0xbf213166,0xbf28f000,0xbf1cfd6f,0xbf325cbe,0xbef362c7,0xbf0ada35,0xbec9e119,0xbe8de1d2,0xbe6429f3,0xbdc72914, +0xbd955741,0xbc106e53,0x3d1934d8,0x3d3b8283,0x3c328eed,0x3d8778a5,0x3d998ced,0x3d71bc83,0x3d9f8a96,0x3da9b0fc,0x3dee6226,0x3de0ab8a,0x3e03bbe3,0x3e19131f,0x3e358b2e,0x3e1ff02d,0x3cdeb330,0xbd70251d,0xbe09f0b7,0xbe1dc8da,0xbe6183b8,0xbe6b70b5,0xbe54b2e9,0xbda16c6f,0xbd08f3b2, +0xbdaa693f,0xbe4e9c94,0xbeae2f5a,0xbee9730e,0xbef77c38,0xbe808225,0xbe86fda3,0xbe2229da,0xbdc111ce,0xbd25800c,0xbbb2dd7a,0x3b90a5cd,0x3cf631a2,0x3ccfbb82,0x3cbe1ad2,0x3d08eb32,0x3c9f5bfb,0x3cd4d431,0x3cffde31,0x3ca1deec,0x3cd192f9,0x3d944393,0x3d4abf90,0x3d9d25c5,0x3de9ddf6, +0x3da4304c,0x3d6d3ec3,0xbcd40e17,0xbd4a4a7a,0xbd54362a,0xbc87a1ae,0xbcdf894b,0x3b3be9bd,0x3d270ae9,0x3c61a2a8,0xbc8f7005,0xbbb7dc60,0xbdaa8af0,0xbe359c3a,0xbe8753a4,0xbe8b8f96,0xbdf077d9,0xbe0a7628,0xbe2f56e9,0xbe1b1aa2,0xbe286e6a,0xbdea3297,0xbd9db193,0xbd1b0285,0xbd124e39, +0xbc83202f,0xbc4e7abe,0x3ac411b6,0xbb851713,0x3a46d4f4,0x3b871295,0xbbf81185,0xbcc18e64,0xbce9406a,0x3b97b518,0xbda83160,0xbe265502,0xbe2e7abb,0xbe4db31a,0xbe556326,0xbe720336,0xbe86d3dd,0xbe890737,0xbe8ca7dc,0xbe8f2373,0xbe784c26,0xbe57245b,0xbe3ba6b0,0xbe27032a,0xbe0fe12c, +0xbe0b556f,0xbe094be3,0xbcad3306,0xbc1dad56,0xbe1385c9,0xb9cdd4af,0xbd142c00,0xbce577c9,0x3b42ee95,0x3c2499b5,0x3ce7c566,0x3c4418c4,0xbbda74ad,0x3b3e8784,0x3b74d21a,0xb9f22cc1,0xbd2807f8,0xbd531358,0xbd333a1c,0xbd78de6e,0xbdf4306a,0xbd93a785,0xbd8835b8,0xbd912a0c,0xbda57c1d, +0xbd9efc79,0xbd8eb237,0xbd874e81,0xbd7fca31,0xbd637c9d,0xbd505561,0xbd4c048c,0xbd5243c8,0xbd4b7606,0xbd41cd21,0xbd3e0240,0xbd2029e6,0xbd049ead,0xbad0cbbb,0x3d064854,0xbd8a4fa2,0xbde93f96,0xbe49f8f8,0xbc5cd2af,0xbdab01c0,0xbe1ef02e,0xbe24d939,0xbe20313c,0xbe1b6663,0xbe1fa97c, +0xbe23f7bf,0xbe224e76,0xbdaff166,0xbd06249c,0xbe3b54d6,0xbddc5b60,0xbda16f38,0xbc2fb3e0,0xbcf0431d,0xbd03980b,0xbd0a4e89,0xbd2cdb0e,0xbd578c42,0xbd8108db,0xbd59dce6,0xbd3cdf5b,0xbd1dc2b8,0xbd03454e,0xbcc750cc,0xbc89f425,0xbc427afc,0xbbdbe5a0,0xbb2604d0,0x3ac572b0,0x3c6eb69e, +0x3d0b0b0b,0xbbcf0f57,0xbc8abd97,0x3d211b76,0x3d928063,0x3df4d008,0x3d136d16,0x3da539ed,0x3ddcae7d,0x3de2c84b,0x3de5ed54,0x3dea011e,0x3df55d82,0x3df82c8a,0x3df3ea43,0x3daa6f5e,0x3d5fc201,0x3e03010d,0x3db41c2d,0x3d8b3e2f,0x3cb580de,0x3d08929d,0x3cfe7c6f,0x3d0d3a89,0x3d1722da, +0x3d2582be,0x3d348f00,0x3d49c1e4,0x3d6214c4,0x3d80c438,0x3d788504,0x3d5e37de,0x3d36a415,0x3ce97b82,0x3c4946ad,0xbc275a90,0xbc3c515a,0xbd8fde97,0xbd62af55,0x3d69a6d6,0x3b05cc96,0x3d300b7f,0x3d24230b,0x3d0ceb8d,0x3d491277,0x3d327536,0x3d5db8e8,0x3d94be8c,0x3d7ea231,0x3d736fe3, +0x3d6730db,0x3d9264f8,0x3d81801d,0x3d8882ef,0x3d8667d0,0x3dc80d4d,0x3d2c716a,0x3d0edd27,0x3d1d6791,0x3d3f0e81,0x3d4bf452,0x3d656357,0x3d863ced,0x3d9a95c4,0x3db88099,0x3de6a887,0x3df8bf84,0x3de85a6e,0x3da988ca,0x3d3b456b,0xb9dbb591,0xbd6534b7,0xbd8a99b0,0xbe387895,0xbe0507b8, +0xbd80d424,0xbd4288ab,0x3c55942f,0x3cb39f65,0x3d04cf04,0x3d3870a9,0x3d7fa0cf,0x3d730c13,0x3dc0b4ed,0x3d8a0491,0x3db46dec,0x3d713d6d,0x3d99f873,0x3d88c71d,0x3d9d7ee4,0x3db3b547,0x3da05782,0x3d7aae83,0x3d212f10,0x3d305974,0x3d761eea,0x3d94e320,0x3dc2c682,0x3e01148b,0x3e1fcd67, +0x3e4a2dd0,0x3e6caac8,0x3e63fb9a,0x3e3867f2,0x3de21bc5,0x3d1d3a46,0xbd709096,0xbe2b97bb,0xbe3529de,0xbe5fc216,0xbe2f013f,0xbdb207b4,0xbd4d16fc,0xbcce4b6b,0xbb92ff28,0x3ab8d1ab,0x3cf60455,0x3d1f52b4,0x3d5dc0d1,0x3da0d108,0x3da553cf,0x3d9eeb83,0x3d78323a,0x3d8ff982,0x3d92cedf, +0x3dd43656,0x3dadf79b,0x3da8b7d7,0x3d994d00,0x3d5b3aaa,0x3d5cbe7a,0x3da42fe5,0x3db51215,0x3de6f7e7,0x3e1a2383,0x3e3e409c,0x3e6c8d3b,0x3e97a73f,0x3ea8eb18,0x3e976d77,0x3e49671f,0x3db3fdff,0xbd4de42d,0xbe50dea3,0xbe5c0415,0xbeea4969,0xbef3914f,0xbecb9530,0xbe526429,0xbe099546, +0xbd9336b6,0xbd2f7f6c,0x3afd816b,0x3ca7a317,0x3d55a27a,0x3d9724fe,0x3db0c1ba,0x3db6560e,0x3d881a5b,0x3db03263,0x3dba2859,0x3de01fd6,0x3e013730,0x3e0e2c7a,0x3dcd49bc,0x3d20b915,0x3d3ed20f,0x3d81ddbd,0x3ddf19fe,0x3e3da5b3,0x3e934e42,0x3ec401ff,0x3edbbfc8,0x3ee40a30,0x3e44922e, +0x3da3d8eb,0xbc7d411f,0xbdd80b2b,0xbe848c3e,0xbef4605a,0xbf09b76c,0xbdbeb739,0xbef32538,0xbf043680,0xbe7e4085,0xbe2fc87e,0xbda16a51,0xbbf8a049,0x3d2ece17,0x3d665a1f,0x3d9f3f33,0x3dddaf48,0x3dab26b0,0x3d9766fe,0x3d50eaf1,0x3d9d372a,0x3dac896f,0x3db46605,0x3dd398b5,0x3df2fa4f, +0x3dc70903,0x3dedaa8b,0x3e0ad79b,0x3e00f1d1,0x3e01871b,0x3dceae84,0x3d8608c9,0x3bf09de7,0xbd91c1e1,0xbe0c8f26,0xbe924010,0xbec5a76d,0xbeee1808,0xbe4fc249,0xbd2be595,0x3df36b42,0xbd955299,0x3f28bd87,0xbe1664e1,0xbf0dda47,0xbe313c40,0xbea27d10,0xbdd7c3d8,0xbdfe1e58,0x3a3589c8, +0xbab67eb4,0x3d05cca6,0x3dc5b229,0x3daf58be,0x3db13f42,0x3dae288a,0x3dc07440,0x3daf40af,0x3de05542,0x3da228ed,0x3db250be,0x3db3f3dc,0x3d7905d3,0x3d08df53,0xbc0a0df8,0xbde82a5a,0xbe2bab0d,0xbe37ae1e,0xbe4a1cc3,0xbe75aeae,0xbe9af05e,0xbec031f7,0xbed08ece,0xbe9e079b,0xbde6d265, +0x3dd8abb8,0x3f0418c0,0x3f044bd7,0x3f23efc9,0x3ee1a3c7,0xbdb18cfa,0x3dca88dd,0xbe0bd783,0x3d0a3fed,0xbc5aea89,0x3c71f6b0,0x3d4d6aa7,0x3daadc22,0x3ccbcb78,0x3dd6ca71,0x3db0e022,0x3d1e13af,0x3d10810c,0x3d489985,0x3d69388a,0x3d28d1f0,0x3da65b68,0x3c038bcc,0xbd5c89f8,0xbd060c79, +0xbbb71193,0xbcd0b1ce,0xbc6a0c29,0x3c24c7db,0x3db2235d,0x3dc96bae,0x3cfb3c94,0x3da7c2e7,0x3de4c577,0x3e32784e,0x3e481d1a,0x3e258592,0x3e0d1342,0x3eb2ad9e,0x3eade68d,0x3ec6d31e,0x3df5826e,0x3df3248b,0x3dece391,0x3bc82fb1,0x3d487c20,0x3da40871,0x3ba31960,0x3c9d7855,0x3d26e1dd, +0x3d692b37,0x3d73e51b,0x3d77699c,0x3d948402,0x3d87ed60,0x3c769125,0x3d422a74,0x3de8f4c8,0x3ca3bc35,0xbd865561,0xbd973289,0xbdbf985a,0x3c9dcc31,0x3de29065,0x3e3ba347,0x3e81d4d1,0x3e91700d,0x3e8ca8d2,0x3e0e88fc,0x3d7e21f6,0x3d9f8c0f,0x3da8d8ab,0x3e120b90,0x3e58d7c8,0x3e830a76, +0x3e6032ab,0x3e6b6b8d,0xbbc5df84,0x3c8f10cb,0xbcaa7b1c,0x3c265107,0x3d257907,0x3b9ce0d7,0x3d1dd7cf,0x3d2343e2,0x3d3717c7,0x3c6a5fe4,0x3cb3735b,0x3d63ea31,0x3d0feb3b,0x3d244c1a,0x3d26c780,0x3d332519,0x3cca677b,0xbc8655cb,0xbca8834a,0xbd413259,0xbdaa644a,0xbd8af9d5,0xbd3afb28, +0xba920aab,0x3cc9e7ea,0x3c8abc15,0xbbc04603,0xba2f9a82,0x3c085928,0xbca36c2e,0x3b9dcd6d,0x3d873a03,0x3e333efa,0x3e37f15e,0x3e10a15a,0x3dcd15d3,0x3da58384,0x3df8a47e,0x3dbd2c84,0x3d89ea7c,0x3d1dadf2,0x3cb63c44,0x3c5852e7,0x3d2006dc,0x3ca4ae93,0x3d7ec6ef,0x3c041e3f,0x3d1db950, +0xbc595c5e,0x3b6448d0,0xbc16e15c,0xbcea3561,0xbda1cca4,0xbb19533f,0x3d70ca45,0x3c98dee8,0x3cd03b1b,0x3c5826cd,0x3c044047,0xbc12602d,0x3ce16555,0x3d751ca1,0x3db7e60a,0x3da8c99f,0x3da6c618,0x3db35dc3,0x3de3e736,0x3dfe5ea7,0x3e1b10ba,0x3e08d333,0x3e0db9a2,0x3e15d7ff,0x3d3d3c40, +0x3dcf2aba,0x3d9e436a,0x3dabd67c,0x3dcbf484,0x3dc56ffa,0x3ddc5df8,0x3de6768c,0x3dc68f63,0x3de75fd2,0x3de39b6a,0x3dee9f35,0x3dadf520,0x3dd05e02,0x3dbe2b92,0x3dbb0b8c,0xbb2ebc1a,0x3e0ea3f0,0x3e08acc7,0x3df498f5,0x3df4cc81,0x3ddb6ad5,0x3dcbabe1,0x3db2a5c9,0x3de83382,0x3dfaeab2, +0x3e09907e,0x3e14de25,0x3e21ffd1,0x3e29c1d6,0x3e2263e2,0x3e1ca075,0x3e18c57b,0x3e12cc1b,0x3e03bc87,0x3e11a57b,0x3e0884ca,0x3dd42a3f,0x3d27963e,0x3e0aa8f7,0x3dc2d23c,0x3d3781c5,0x3d2ea0d8,0x3d1c447a,0x3d26f16e,0x3d05d958,0x3cfa1635,0x3cf3fdad,0x3dba4ef3,0x3e02bafe,0x388e8c64, +0x3dab3adf,0x3deb1536,0x3e2c5620,0x3e0efdc6,0x3e19f95f,0x3e19733c,0x3e1d3e59,0x3e222a18,0x3e23d988,0x3e20bb94,0x3e1dd134,0x3e1b9a14,0x3e1a7899,0x3e17feb2,0x3e17f00b,0x3e1333ce,0x3e100d22,0x3e0b74d4,0x3e0bb0ca,0x3e1974cc,0xbd2448f7,0xbc59e8ff,0xbc34014a,0xbcd3cc3e,0xbce0c04c, +0xbb7c919e,0xbcf658cb,0xbccaa027,0x3c6dba74,0x3c7ecc72,0x3c941ba9,0x3c8b4986,0x3ca43c30,0x3c9db89e,0x3c91cd1e,0xbca83e20,0xbd15a556,0x3cafcca4,0xbcaa4047,0xbd016e35,0xbd253da3,0xbd07ea33,0xbd1bb3d2,0xbd2d7b7a,0xbd32432d,0xbd3fe254,0xbd53b494,0xbd694cbd,0xbd84da92,0xbd99c025, +0xbda56b6b,0xbda3069d,0xbd9976e1,0xbd5899cb,0xbd0edb6d,0xbc1b7449,0xbc215a26,0x3d3e448f,0x3c14b7d5,0xbd68bc64,0xbc00d877,0xbce95dc6,0xbc870fd9,0xbc819334,0xbb3b756b,0xbba61020,0xbb8888be,0xba7edbf6,0xbbffabc7,0xbc0469cb,0xbc74d1e1,0xbbdbd0f7,0xbc79ad82,0xbc9abd72,0xbc98e288, +0x3bdcf442,0xbd07c4c2,0xbd0fbff4,0xbd28744c,0xbd5f0dc0,0xbd667af3,0xbd83041c,0xbd9b1564,0xbdaad673,0xbdd67b9e,0xbe0d7738,0xbe2e3177,0xbe31301e,0xbe165692,0xbdb68909,0xbd021a7a,0x3d0e7b10,0x3d26ed9d,0x3e25ba5e,0x3d540491,0x3ba889a2,0x3d148b1e,0xbc06b764,0xbaad3c42,0x3c0619aa, +0x3d2ea7a3,0x3d34ca70,0x3d192e8a,0x3d2dbf55,0x3cc8fbbf,0x3d081328,0x3a0531d0,0x3c50a3cb,0xbb1d92c1,0xbc320b87,0xbba2fc00,0x3ac76230,0xbc728da4,0xbd0fc76e,0xbd261ff7,0xbd8fd26d,0xbd994920,0xbdb7d5bb,0xbdf286b2,0xbe09252c,0xbe39b854,0xbe7142e4,0xbe91459a,0xbe947481,0xbe78c529, +0xbe037d1e,0xbc57a4ee,0x3dfd6c81,0x3e0a03c3,0x3e906ab0,0x3dbcf157,0x3ce003dc,0x3da96944,0x3d2223f0,0xbb2da2d8,0x3c8d82d1,0x3d88f266,0x3d8284b2,0x3d8b5c9c,0x3d9968bb,0x3d981d8f,0x3d76ae55,0x3d027d74,0x3d2ec525,0x3ce210f7,0x3d71adc7,0x3cf9c1c6,0x3d67f1ec,0x3c2b2af9,0xbd13d870, +0xbd2346aa,0xbd9c0bfa,0xbd9cd554,0xbdc5c60e,0xbdf05f14,0xbdfd7951,0xbe34d7c3,0xbe8e5e96,0xbed04851,0xbee6f5b3,0xbec1a48a,0xbe49cec4,0xbc815853,0x3e55b8d8,0x3e6bd135,0x3ebed04a,0x3e7844bc,0x3d634175,0x3c5558a4,0x3d82288b,0x3dbeddfc,0x3df73223,0x3d98da11,0x3d9498f7,0x3d8271b9, +0x3d66afac,0x3d80876e,0x3d83fdff,0x3d64d347,0x3d36bb97,0x3ca35fb5,0x3cf560f7,0xbcc0e262,0xbbf08588,0xbca7cfd7,0xbd4165be,0xbd715806,0xbe1a5c74,0xbe339834,0xbe6e5656,0xbe96f2d0,0xbed634e5,0xbefe349d,0xbf13ff72,0xbeda7f6d,0xbe8eef54,0xbe18930b,0x3c757b31,0x3e2bef1d,0x3ebb2948, +0x3eb7bad3,0x3de2459a,0x3e46554b,0x3dbef849,0xbb679f4d,0x3b2a4073,0xbd442fd8,0xbd37d77d,0xbd2c00a2,0x3a52e3b4,0x3d0f6d93,0x3d9c09b5,0x3da478ff,0x3da1bbcd,0x3d563c24,0x3d77bb41,0x3d48cff6,0x3d673fff,0x3c9a5b9c,0x3d271824,0xbd735021,0xbe0b0e20,0xbe15245f,0xbe5a6576,0xbe990754, +0xbeca7146,0xbef9c9e9,0xbef9932d,0xbef3db66,0xbf0304e7,0xbe81b156,0xbd8c7967,0x3dfdd452,0xbdac24cb,0xbe1c8943,0xbe0f3688,0x3d19053d,0xbf1e7421,0x3da009fd,0x3eafdbc5,0x3da1307c,0x3e439e3d,0x3daf19cc,0x3dc969a9,0x3ca96bd5,0x3d985adb,0x3d6e65b8,0x3cd4572a,0x3dcbfaae,0x3dcc8f10, +0x3ccdefbf,0x3d2bdef8,0xbc8e0104,0xbcd7665c,0xbdbb57cf,0xbdb0d4e0,0xbe02b3bb,0xbe38ee18,0xbdf50ace,0xbd85522c,0xbb853c2b,0x3cdbf4a7,0x3cc5aa00,0x3de818f8,0x3e4ce312,0x3e84b378,0x3ecfaba8,0x3efb4a94,0x3ef94142,0x3e25db3c,0xbe1889e7,0xbf2f3adb,0xbf18bae9,0xbf184a3d,0xbec1282a, +0x3d93bece,0xbe0e9775,0x3d8088fd,0xbd119bc3,0x3ca2bdb2,0xba87b04b,0x3d98bf07,0x3d9ce9c5,0x3d243cd9,0x3d97dd82,0x3d628daa,0xbceae2cb,0xbd208210,0xbd3b33f8,0xbda0b85b,0xbd9dc9dd,0xbd932c30,0xbdd3a5cb,0xbc7e9afa,0x3d1b34f3,0x3d8667bc,0x3e187a5a,0x3e77eaf0,0x3ea7c6fb,0x3ec7b5fe, +0x3ef4cf09,0x3f16da30,0x3efd8191,0x3ec5e5c5,0x3e87f7b0,0x3d880788,0xbd064590,0xbe288100,0xbe9031a1,0xbdd75b88,0xbe2cef2c,0x3c714bcd,0xbcb0365b,0xbd1d0a76,0x3d436483,0x3d1a8baa,0x3d27a12d,0x3db6e02e,0x3db666c9,0x3db426c1,0x3d926640,0x3d8314ee,0x3d3f8798,0x3c2c5277,0xbca4402b, +0xbccd4981,0xbd906ad4,0xbde4e24c,0xbdff09d9,0xbd6e99ee,0x3cdf5479,0x3e467df9,0x3e70f976,0x3e8bc922,0x3e8e0a8c,0x3e95ad9d,0x3e8c3772,0x3e7a12ae,0x3e8a17d9,0x3e6461b7,0x3dd85601,0x3abcea5c,0xbda94ddc,0xbe21ccf6,0xbd885f25,0xbd8d88bb,0xbdba383a,0x3de287a4,0x3da6e6f1,0x3dda7cc6, +0x3db9a2e4,0x3d31f1a9,0x3d1b6a55,0x3c935697,0x3d0973c0,0x3d7458f4,0x3d9df3ae,0x3da441a1,0x3d8e0144,0x3dbea3f0,0x3dabbe91,0x3d3b9585,0x3d19defe,0x3ca96fbc,0x3d37b8d2,0x3d827243,0x3dbec010,0x3e2f99a1,0x3e2901e9,0x3e1fc34b,0x3dfc15df,0x3dbfcfb5,0x3daa044d,0x3da16073,0x3d24d7bb, +0x3b1bd545,0x3badf64a,0xb9ce941d,0xbc8449ef,0xbda66610,0xbd25a3be,0xbd01d262,0x3bcc1bbe,0x3cfb6f73,0xbc621890,0x3c7f1553,0x3c9211ef,0x3d21a346,0x3d2f758c,0x3d897e9c,0x3d2f1749,0x3d8f1477,0x3d3fd5fc,0x3dc80388,0x3dc3ada9,0x3e065cb5,0x3e1b7218,0x3e3ed689,0x3e4e5082,0x3e56eaf1, +0x3e60074d,0x3e4bf865,0x3e4bb2d0,0x3e374586,0x3e36c06d,0x3e3b54db,0x3e491ff9,0x3e1ced08,0x3de594da,0x3d92e5c3,0x3d8535c1,0x3d73ee02,0x3d4ee612,0x3cbe38d3,0x3beb45f2,0xbc0e47f2,0xbbf7a850,0xbbeada24,0xbc2f7383,0x3e00ed78,0x3ce96cdd,0x3d8aae93,0x3d6b38f8,0x3cd94320,0x3cf4cfe1, +0x3bebc83b,0x3ca16eab,0x3d2b9230,0x3cde6e16,0x3cc21382,0x3ce522c7,0x3d887304,0x3d8de90e,0x3d9f1fe9,0x3db07126,0x3e295592,0x3dc22232,0x3da8b6ae,0x3dbefd7b,0x3dc28180,0x3dc40478,0x3db3b037,0x3dad1846,0x3d6c2ba9,0x3d365a30,0x3ce55ee6,0x3c734e02,0xbb13da5c,0xbc85b5a9,0xbc2e286f, +0xbbf901cf,0xbc10eed2,0xbbb8d277,0x3c454e91,0xbc75f63b,0x3d3c2486,0x3db3b751,0x3e170551,0x3ca94ba6,0x3dad770b,0x3e1051f8,0x3e169d45,0x3e172ab9,0x3e10c6ef,0x3e19937a,0x3e1dd548,0x3e1acf91,0x3dc80346,0x3d56e980,0x3e344178,0x3df8abe6,0x3dbe4bce,0x3ca586bc,0x3d2043c3,0x3d09e84c, +0x3cffb4da,0x3cfcf542,0x3d02e139,0x3d1260ee,0x3d00e682,0x3ce16b9a,0x3cbf17b3,0x3c8af414,0x3c476c1c,0x3b96b44c,0x3bc91878,0x3bbfb65e,0x3be047ff,0x3bb9a7c1,0x3c660a72,0xbcd8b2f0,0xbc824e46,0xbcdf9f77,0xba02258b,0x3b914f86,0xbc0a8434,0xbbf30d09,0xbbbd96d7,0xbc76d548,0xbc626f65, +0xbc7d798d,0xbc9b9ef8,0xbc947169,0xbca278a6,0xbcc2486a,0xbc6acc9e,0xbc855e29,0xbcf3e3aa,0xbca7dbde,0xbcb4722d,0xbd057816,0xbd02bee2,0xbd05a587,0xbd01d4d7,0xbd056652,0xbd05882f,0xbcf8756b,0xbd02bb6e,0xbd026016,0xbd010063,0xbcf9454e,0xbcfc3f9f,0xbd064520,0xbd181ad4,0xbd11decb, +0xbcd73b31,0xbcbba45d,0xbc9aac0c,0xbada57a5,0x3d92426d,0x3c742e09,0x3cfb2886,0x3c8043e6,0x3be22d97,0xbb231d10,0xbb03f3f9,0x3b21ad56,0x3ab3fb77,0x3aff43f9,0xbb46051b,0xbc08684e,0xbc55a018,0xbc9f70e7,0xbcbda665,0xbcefd2d8,0xbcfbb035,0xbd30c4cf,0xbd41fd84,0xbd3cef70,0xbd2dbc02, +0xbd283bd0,0xbd1c2346,0xbd0ca581,0xbd2ab887,0xbd33f5e0,0xbd2ee685,0xbd243261,0xbd3441dc,0xbd437e3d,0xbd88bd3d,0xbd7c312a,0xbd0c16ef,0xbcb03ad6,0xbd50005a,0x3c345e2d,0x3da80308,0x3d3e5c1c,0x3d976813,0x3d3300b0,0x3d0a7101,0x3c8375c1,0x3ce5d63f,0x3cb52645,0x3cc28632,0x3c8ff931, +0x3c8a77aa,0x3b117f6b,0xbb2d63e1,0xbc7210d2,0xbd030624,0xbd0d8949,0xbd323216,0xbd80beec,0xbd93846d,0xbd94c588,0xbd88aecb,0xbd973429,0xbda331ad,0xbd9e5906,0xbdc97234,0xbdd230a7,0xbdcc979e,0xbdabfd85,0xbd899079,0xbd7b5cc0,0xbdcb1ee5,0xbdd2b734,0xbd5f606e,0xbd254e28,0xbdafa093, +0x3d6c906d,0x3e2a5213,0x3db9d065,0x3decdd53,0x3de36281,0x3d9f979b,0x3d4985ca,0x3d46c1c9,0x3d468d13,0x3d6f30fd,0x3d7948ee,0x3d2f9b16,0x3c270e33,0x3c8ce7cb,0xbb2a776d,0xbc91c7c3,0xbd0ed84c,0xbd2a15e4,0xbda02b6e,0xbdab3886,0xbd9bf5a6,0xbd890ad2,0xbd8d4365,0xbd8998dc,0xbd8faac2, +0xbde68459,0xbe07afa6,0xbe05c448,0xbddfe531,0xbdbb97a4,0xbda2bd4b,0xbe17e2f9,0xbdf8a57b,0xbd3d3268,0xbcc1b16b,0xbefb201e,0xbea40701,0xbd885212,0xbd9db79b,0xbd8d247b,0xbd46e861,0xbd5d5496,0x3ca3f9b4,0x3d49f540,0x3d661d3f,0x3d6877e2,0x3d6ef07b,0x3d67f0cf,0x3d31f78b,0x3cc715dd, +0xb9b7b230,0xbbdfb41a,0xbd305392,0xbd86796c,0xbdf1fb33,0xbe176c93,0xbe2b38f0,0xbe446b96,0xbe55ec2c,0xbe82cfe9,0xbea7ecb2,0xbe97d950,0xbe85ebeb,0xbe324ce1,0xbdcfc71e,0xbd83b34c,0x3c32a090,0xbe0f24c1,0xbe90a9a9,0xbeed83ee,0xbedef99d,0xbee3300f,0xbeaa3a89,0xbe0d1ab9,0xbdb307d4, +0xbd89a582,0xba8272ca,0x3c3f8c81,0x3ac15898,0x3c14a01d,0x3d0a8d22,0x3d3007df,0x3da11e14,0x3d9a9f9f,0x3d146d53,0x3ca64a14,0xbbea2f91,0xbd46d659,0xbd96d764,0xbe00545a,0xbdaebe82,0xbd7ec10e,0xbd33bc11,0x3d36ff07,0x3e26b507,0x3e98168e,0x3ed86e8b,0x3efa1867,0x3f0dee81,0x3f2c975c, +0x3ef28b91,0x3e9df536,0x3df82114,0x3da2c3cd,0x3ce9f01c,0xbd8b7c70,0xbea6016a,0x3e9c04ec,0xbeb59e12,0xbee82250,0xbe498acd,0xbe476c52,0xbdce02ea,0xbd7f8d1f,0xbce00374,0x3d46fcc9,0x3d883eb1,0xbc363fc0,0x3d8cfb87,0x3d20702f,0xbd6a1dfa,0xbd8534e4,0xbda25dfc,0xbe07509e,0xbd9a0019, +0xbdbde3b7,0x3bab57fd,0x3e22c58e,0x3e5a680a,0x3eb80992,0x3f027ad6,0x3f1984ae,0x3f1e9ab5,0x3f151c58,0x3f06a47e,0x3ef5c99f,0x3eafe59f,0x3e6b7a21,0x3dcfc552,0x3e6366e0,0x3ead9a29,0x3f307bc9,0x3eddde2a,0x3efcf674,0x3e122708,0xbe4df7b6,0x3d0e7071,0xbd9ca4aa,0xbb57d1d0,0xbc1a287d, +0x3aac3954,0x3ca75447,0x3d00a65f,0xbd2e646a,0x3d5ca1f8,0x3d95cfde,0x3d0169ec,0x3d285275,0x3c352ff4,0x3bd1a839,0x3c2cd2f3,0xbd0f8a24,0x3d9e51d9,0x3df0aad9,0x3dec1e4d,0x3e23bcfb,0x3df43cb1,0x3ddfc83a,0x3dfcc618,0x3d6bab90,0xbcf55bcf,0xbe12f41c,0xbdf50e03,0xbe00d34c,0xbe0f1fd4, +0xbd1058d4,0x3d85d8cc,0x3e9db44a,0x3e8af619,0x3daf587b,0x3db132bc,0xbce1f6f4,0xbd07d026,0x3b2d481c,0xbc8c06a6,0x3b235e35,0xbc4d2ca6,0x3cec60e6,0x3d434d6f,0x3d2ce08c,0x3d10b756,0x3cc1904b,0x3c99f5d0,0x3cb0fabc,0x3d0f84b7,0x3d8879d4,0x3d817a26,0x3cf01bb9,0x3ddd62ca,0x3dc76225, +0x3d7b9d13,0x3c49687b,0xbd557b00,0xbdffe7ad,0xbe4ee5dd,0xbe894c86,0xbe9c3c82,0xbeafb8da,0xbeb2ef7f,0xbe9f8ada,0xbe73cfa7,0xbded3802,0x3b2801fa,0x3e3f1cb1,0x3dd01bd3,0x3d1b5b67,0x3d7bf647,0xbd3c9bfb,0xbcc56fbb,0xbcd78f9e,0xbd25417e,0xbc59c785,0x3c105249,0x3d1c0c1b,0x3d2af897, +0x3ce35294,0x3d5c3c4d,0x3d5a0ffc,0x3cca707d,0x3c9c1b98,0x3c8371f2,0x3c3bf158,0x3d0c1b3c,0x3d86e19d,0x3cb49f6b,0xbc93fcff,0xbcfb59ab,0xbdbfa88b,0xbe018da3,0xbe1b4171,0xbe34651c,0xbe2ad75b,0xbe298688,0xbe254e3d,0xbdfe0d1f,0xbda2d397,0xbd5a4c23,0xbd30695e,0xbd1d4cb0,0x3ba17fc5, +0x3c45ca76,0xbcdabc20,0xbcd314d2,0xbcaf99f5,0x3c3e3c85,0x3c6fe1b0,0x3c59bb47,0x3ba8a65f,0x3b3dd663,0x3a90b92b,0x3c222e76,0x3c5af77d,0xbb08d912,0x3c4cb196,0xbc6e67d8,0x3c97e170,0xbc6f3472,0xbc917aa5,0xbcd1bd56,0x3aa28467,0xbd9a4cfe,0xbde38b72,0xbd9c99d1,0xbd900f0a,0xbda2f9a1, +0xbdcb67bd,0xbdf4b889,0xbdd9820b,0xbdc1a0cb,0xbdaafc14,0xbdb85fd5,0xbdced370,0xbde72a1a,0xbdbd36fe,0xbd9f62f3,0xbd9ba2e9,0xbd6e4b18,0xbcf1eda8,0xbd036120,0xbd5b34e7,0xbd430402,0xbd4f202c,0xbd246aaa,0xbd087ff2,0xbd03995f,0xbcc5d551,0xbcc62a59,0xbc6fb2e1,0xbc7d05db,0xbbf78a70, +0xbbc96e74,0xba98b496,0xbc8b6c64,0xbc82e800,0xbc6e2d7e,0x3cb953c9,0xbd4b9f26,0xbd36a9b5,0xbd48e7e8,0xbd66532a,0xbd5cbc94,0xbd3f8896,0xbd2b83e4,0xbd257004,0xbd28efe3,0xbd1dc2ef,0xbd17f516,0xbd03b618,0xbcfac32d,0xbd061b0b,0xbd108e11,0xbd04561e,0xbcff467c,0xbd1d19ee,0xbd0b9a20, +0xbcf245c2,0xbce66922,0xbc4bbb3a,0xbd0aa8c0,0xbd039914,0xbc972089,0xbc8954f4,0xbc6f4837,0xbc52730c,0xbc04b3b9,0xbbce952f,0xba8b1ff7,0xbcb2fca7,0xbd0b2f31,0x3c234c9a,0xbceff636,0xbd32b431,0xbd7b9e82,0xbd456354,0xbd591f17,0xbd5372d9,0xbd5c0fa3,0xbd6d1d92,0xbd7e40d4,0xbd74aa29, +0xbd69cede,0xbd61bb69,0xbd53f818,0xbd47a5d0,0xbd356d13,0xbd2c2dff,0xbd21d884,0xbd1c6516,0xbd1c635c,0xbd3459fa,0x3ab9d7d8,0xbcaf4268,0xbc3ae665,0xbd4ba1da,0xbd580a68,0xbd299761,0xbcef03c7,0xbd3027c4,0xbd47b6f0,0xbd3db155,0xbd355ffd,0xbd27c4ce,0xbd304f37,0xbd3740ec,0xbd310ac6, +0xbd2fb899,0xbccd56aa,0xbd519d74,0xbd3503d6,0xbd006cc4,0x3c993031,0x3b985ec2,0x3c1d8d94,0x3c635dac,0x3c86d8c4,0x3c9af57c,0x3cb0c4e6,0x3caafa23,0x3ca9d4fa,0x3c984176,0x3c8b87bc,0x3c629a40,0x3c585056,0x3b20e7a6,0xbc023838,0xbcef9d7d,0xbcb23e5a,0xbd94beca,0xbd973fad,0xbd9b42c3, +0xbd0d7107,0xbd172462,0xbd0f45c7,0xbca7faf3,0xbc61077e,0x3c0c0701,0x3b45becf,0xbc5944d2,0xbb3d1b73,0xb98c7cb7,0xb9b20437,0xbc9d755c,0xbc895404,0xbc9c94ae,0xbc430539,0xbd48756e,0x3c53ca8a,0x3cb9a461,0x3cc1a576,0x3d16d19d,0x3d2ad4f1,0x3d409004,0x3d4c5b12,0x3d388fb0,0x3d1f45a0, +0x3cf28983,0x3cf762ee,0x3cd05148,0x3c9595b9,0xbc02e1f9,0xbd293ca5,0xbdcb59f6,0xbdb4c37f,0xbe01b050,0xbe05fd01,0xbdeef8fe,0xbdb02ff3,0xbd5c02d5,0xbd0b3ebf,0xbcd53d53,0xbca39318,0x3aeb41b2,0x3c9d744b,0xbb9433a4,0x3c78381a,0x3b527917,0x3c8a8087,0xbc907129,0xbc85f581,0xbc029bb2, +0xbc5d38fd,0xbcdaefbb,0x3c7cfe24,0x3d27ebcd,0x3d325142,0x3d93e1ff,0x3db1f765,0x3dd2ef9c,0x3dee8133,0x3de711d4,0x3ddf9144,0x3db9274f,0x3daef25f,0x3d9184cb,0x3d8da153,0x3c51ec9f,0xbd3bc0db,0xbe31dbe2,0xbe141adb,0xbe5f7623,0xbe65abab,0xbe3d80f8,0xbdc3a1e7,0xbd950931,0xbd320971, +0xbcbfead4,0x3c23176c,0x3d4a1c1e,0x3d5cd972,0x3d32a4e4,0x3d4e0185,0x3d121055,0x3cdf5830,0x3b66e7b4,0xbb0955e7,0xbce0adcd,0xbbc5c93d,0xbd1ba2b8,0x3cfdc0ff,0x3d8eee48,0x3d8a9d87,0x3dd25a2d,0x3ded87bc,0x3e058250,0x3e086cf1,0x3ddec660,0x3da14c6b,0x3d2730f9,0x3d6d55c0,0x3d86d1f2, +0x3d57bd51,0xbd020c15,0xbe224b96,0xbeb4c59d,0xbe9a5a8a,0x3e58637f,0xbb2031ad,0xbe501615,0xbdd9e512,0xbdcd2293,0xbd945788,0xbd12a08d,0xbd7e81f9,0xbc8858ac,0x3cc1b5ad,0x3d0e8a9c,0x3d6f9452,0x3d822f27,0x3d3c40f1,0x3cef2019,0x3c9d2c70,0xbbd1e514,0x3c25e885,0xbd16c4d4,0x3c33c12a, +0x3db6ce0b,0x3dd9ff34,0x3e4bbd47,0x3e7ede92,0x3ea9fe61,0x3ee1ada8,0x3efbe0e8,0x3f067fc8,0x3f0604f1,0x3ed8f458,0x3eb1aeaa,0x3e866a54,0x3eac2ab9,0x3ebc2f4a,0x3eb7b07a,0x3e48107e,0x3f09778e,0x3e2055bb,0xbdbbcfbc,0xbc7993db,0x3c0438f5,0xbcd70a2c,0x3a949a3d,0x3bf869b0,0x3ca78040, +0x3ce0bf11,0x3d1f2d36,0x3d821575,0x3d655c00,0x3d091202,0x3d16c12e,0x3ca6a528,0x3b577c91,0x3c422fd3,0x3c8edc97,0x3dbde67a,0x3e0f619b,0x3e247c15,0x3e42b580,0x3e8e74ad,0x3eae04e9,0x3ec8e3c3,0x3eb76416,0x3e8de0f3,0x3ddd2251,0x3d946889,0x3ced96e6,0x3d21ecb7,0x3df6ae7c,0x3e30c9fe, +0x3ea22d3e,0x3ee31275,0xbc2682ac,0x3ec65ee2,0x3e9afb3b,0x3e302fad,0x3dc2bcbf,0x3d9cac8a,0x3c463704,0x3ab3bdeb,0x3d4614b8,0x3d6db04b,0xbca720cd,0x3d486593,0x3cf6e24e,0xbc559192,0x3b4249e1,0x3cc97a73,0x3d38baf5,0x3d4b1bd6,0x3dae6eea,0x3d379e7d,0xbd8a7f0e,0xbdc3b70a,0xbe48e1e7, +0xbe9b66a0,0xbec56afe,0xbed2a4d1,0xbefc6085,0xbf011a41,0xbefa1c63,0xbec4ecbf,0xbe9d0647,0xbe2808d0,0xbe802e20,0xbe9f140e,0xbed3eb50,0xbe5a043f,0xbea3d952,0xbcad178f,0x3e55a962,0x3c916840,0x3d585477,0x3cf2f243,0x3d307407,0x3d2bbfc9,0x3d517cff,0x3d4b7e50,0xbc4b8e27,0x3d2ae728, +0x3d2269f9,0x3d199e25,0x3cca6294,0x3ca67e47,0x3d27e71c,0xbc1fd422,0x3d25d667,0xbd7fe705,0xbe50a2ad,0xbe70efa6,0xbe95d76b,0xbea6d258,0xbec3d821,0xbeda8ed8,0xbed8305e,0xbec3bae7,0xbea698fa,0xbe91501a,0xbe658abd,0xbe15d0b1,0xbe26daa4,0xbe35e2fe,0xbea0a64c,0xbe50d5f9,0xbe0f81eb, +0xbe08f64c,0xbd0ceb58,0xbc586c3e,0xbba4174e,0x3c284448,0x3c2f57e1,0x3cd9f0e7,0x3cc580f7,0x3cceee5b,0x3c668793,0x3c104fb2,0xbc0039e2,0xbc37176e,0xbc1b096b,0xbbdac2c4,0xbd1b86c4,0xbc35dfb0,0x3d5a3d54,0xbd9b314b,0xbe0ef684,0xbe2c8504,0xbe6e1471,0xbe74d24a,0xbe74aab0,0xbe498e16, +0xbe266410,0xbdcfc1c7,0xba8627ca,0x3cc67af7,0x3cce9c3e,0x3c5d987e,0xbbacd4cf,0xbd326f7c,0xbe2cf9e8,0xbe0fdceb,0xbd817a18,0xbda033ad,0x3b057245,0xbc9663e8,0xbc8d9be9,0xbab4c731,0x3a7cd3bd,0x3c8bf83c,0x3c8ebb17,0x3c67987b,0x391b5b01,0xbbf08d63,0xbc2e1b46,0xbc4a74be,0xbd260709, +0xbd8272ee,0xbd8c0b19,0xbdbefdb5,0xbddcf6ce,0xbdebb35c,0xbdf1dc3b,0xbde6cbff,0xbdabe0cc,0xbd219e23,0xbca96dd8,0xbc1a8a71,0xbc1636b6,0xba83dc42,0x3c46be27,0x3bc67c5a,0xbca9114e,0xbd79025b,0xbd6c3c06,0xbd0fc9ff,0xbce6304e,0xbd464288,0xbc12dcd3,0x3c261dbe,0x3b66acea,0xbc63a24e, +0xbc18d3d8,0xba02b157,0x3c1bcbb8,0x3c73ed93,0x3c8ce98d,0x3c5ba48e,0x3cc81d2a,0xb9fc9cb9,0xbc7d0b60,0xbcf82cfd,0xbd3da139,0xbd63b066,0xbd912859,0xbda07c9d,0xbdc11d57,0xbda88877,0xbd6ffc2e,0xbd673ec5,0xbd3dfddf,0xbd3443e5,0xbd038284,0xbc8c13d1,0xbcf48a3e,0xbd162648,0xbd314751, +0xbd152527,0xbcc118dc,0xbbb4eee8,0xbc83b743,0xbccf6e7c,0xbcb68eae,0xbc392625,0xbcd3b610,0xbcdc773a,0xbc54193a,0xbc22a396,0xbc1217b1,0xbc563ffd,0xbc65de02,0xbc646c13,0xbc8cfbf4,0xbcc7fb72,0xbcd43f8a,0xbcfb326a,0xbcf2b529,0xbcfa9267,0xbd13a1b2,0xbd259ba3,0xbd3cc43e,0xbd45306b, +0xbd743eb3,0xbd7cf485,0xbd6ec0c6,0xbd6bf136,0xbd59e75e,0xbd46aaa2,0xbd3faa00,0xbd356d1a,0xbd2286e8,0xbd0bfa52,0xbcfd84e9,0xbcd3ad62,0xbcbd43c1,0xbc8d6827,0xbc8ae5ba,0xbc60ed96,0xbc90358f,0xbcaaf8a9,0xbcc0855c,0xbcd86759,0xbd0b1b49,0xbd12692a,0xbd1e8a12,0xbcddb598,0xbcf0187e, +0xbd06acc0,0xbd0a1b0e,0xbd037861,0xbd08e302,0xbd034d78,0xbd052c0d,0xbd074828,0xbd25beb2,0xbd16a156,0xbd30ef5e,0xbd3982f6,0xbd2db78a,0xbd0ae663,0xbd06d92d,0xbcf5ebf7,0xbce8557e,0xbcdba40f,0xbcc8c86d,0xbcb7b4e9,0xbcaa60c8,0xbc9f551b,0xbc90d413,0xbc8cc1fe,0xbc8ba22a,0xbc8ab86f, +0xbca32761,0xbcb5df3f,0xbcbb8943,0xbcc0e114,0xbcf58f99,0x3dda5394,0x3dda319e,0x3deeee4b,0x3dbf8e18,0x3d7ff1d5,0x3bde146c,0x3dce670b,0x3d8d14a1,0x3cc4c4a7,0x3ce1441e,0x3ce65efa,0x3cc5e198,0x3cb758b9,0x3cb1cb2b,0x3cbb12ee,0x3d93d847,0x3dbff05c,0x3c760f3c,0x3d92042d,0x3db86dae, +0x3db9bc5f,0x3db90d6a,0x3dbe17ab,0x3db8994e,0x3dbecf3c,0x3dc0c91c,0x3dbe9fec,0x3dc3e7d5,0x3dc87422,0x3dd0531b,0x3dddb422,0x3ded1530,0x3e04d6ad,0x3dffe864,0x3e0008fb,0x3e01185e,0x3df308c4,0x3e1c8608,0x3e0d0bbe,0x3c60b4b6,0x3dadb65e,0x3d78f48d,0x3d87afe0,0x3d9ffae1,0x3d8bf9fa, +0x3db7b0c5,0x3dba6168,0x3d9849cb,0x3daf43d4,0x3da5425b,0x3dafc520,0x3d79daa5,0x3d8097e9,0x3da26b45,0x3d936d96,0x3d7ff1f0,0x3da79925,0x3d9d9c0c,0x3da3b65e,0x3d926d77,0x3d9e4ee2,0x3d9e796a,0x3d9cd4b4,0x3db17367,0x3dd0d840,0x3df9dec7,0x3e133d27,0x3e291f18,0x3e46c19c,0x3e3e767f, +0x3e3e70c4,0x3e442dbc,0x3e320074,0x3e6691b9,0x3e17b80a,0x3d8684dc,0x3d9d0a31,0x3cf78aa8,0x3d07722c,0x3d1a559b,0x3d0d910c,0x3d581918,0x3d799bdd,0x3d118168,0x3d5cc2ea,0x3d1ea1f3,0x3d807cd4,0x3d0472d7,0x3d102805,0x3d3a8324,0x3d369343,0x3d8dd342,0x3d6696ac,0x3d7365d1,0x3d8e62b1, +0x3d616672,0x3d9861fe,0x3da70691,0x3dafdfb7,0x3dda5319,0x3e01b62c,0x3e26c087,0x3e4a9a4b,0x3e69b2aa,0x3e8da219,0x3e849564,0x3e887037,0x3e92327a,0x3e7a7ba2,0x3ea26f58,0x3e2a6ffd,0x3d30c570,0x3d508ac7,0x3d24ff79,0x3c862a59,0x3ccbb8fd,0x3c350185,0x3d3947e8,0x3d54119f,0x3cec5f32, +0x3d0f00b8,0x3cfed9ec,0x3d0ce8fd,0x3c01bc9a,0x3ab62673,0x3cc970e8,0x3cca0a0b,0x3d506f17,0x3cbdc1f6,0x3c112c19,0x3c70a775,0xbc13856f,0x3c6f4247,0x3cbf8381,0x3d04ef34,0x3d9ac210,0x3e0d2811,0x3e63570b,0x3e8ef765,0x3ea624ef,0x3ec74324,0x3ebbee36,0x3ebb7fe7,0x3ecff923,0x3eaed997, +0x3e7eba48,0x3e998ea8,0x3e8e9ac0,0x3e2e41c4,0x3e0e51b4,0x3dc0f5bd,0x3dacaab6,0x3d90b9b9,0x3d30c998,0x3cd64ca8,0x3ca911a9,0x3d329d3e,0x3d446117,0x3d3981a6,0x3d0217fa,0x3cbe5583,0x3d09aea5,0x3d0b5df8,0x3da10f40,0x3daf1858,0x3d8bf837,0x3de6ec48,0x3e07c023,0x3e208f4e,0x3e3c5ad3, +0x3e610b7c,0x3e7179b2,0x3e5d2def,0x3e0383e0,0x3e14875f,0x3e0e5429,0x3dd3c32b,0x3e09e14c,0x3e2789fa,0x3e6eb6c9,0x3e9586c2,0xbed556b4,0x3c5a7725,0x3e448bf6,0x3da9be85,0x3dac4c36,0x3d8d9906,0x3d3471e0,0x3d01ce8d,0x3d1d57a6,0x3d252d89,0x3d1739c7,0x3d654e47,0x3d414ff8,0x3d2a40ca, +0x3cee1a76,0x3d03077b,0x3d86a671,0x3d8b0000,0x3dac15ca,0xbce11ec8,0xbe12583e,0xbe57f55c,0xbea27ef2,0xbec3696e,0xbee43def,0xbef6403b,0xbef9fc05,0xbeda68a1,0xbe966634,0xbe492b49,0xbd996815,0xbca699b4,0xbdc014a2,0xbe4d7400,0xbecdcbc9,0xbed633fb,0xbe32c811,0xbe85002a,0xbda775c1, +0xbd1638d2,0x3d079d4d,0x3c9a540b,0x3d814568,0x3cbbe84b,0x3d9be67e,0x3d9f0505,0xbbe4eff5,0x3d88e3ea,0x3d84dcf6,0x3d680874,0x3d3bc607,0x3cbedc9b,0x3d0ad379,0xbc94b9e5,0xbd7b8071,0xbddf5fb6,0xbe0d61e9,0xbe1d5672,0xbe31e6c4,0xbe235194,0xbdf62147,0xbd3d67e6,0x3c9626cc,0x3d3799a8, +0x3d8183b8,0xbc37fab7,0xbd5ca9a9,0xbe20f307,0xbd7b4cef,0x3d6832ab,0x3e6265ee,0x3c7387f0,0x3deb522c,0xbd7e6d5a,0xbe26f446,0xbca1370a,0xbc04dbd5,0x3b5ad7fd,0x3c84b30b,0x3ca17eec,0x3d0dfe30,0x3cf4ce41,0xbc54b8d3,0x3c5ac14c,0x3bca2fda,0xbaecae4f,0xbd0dc7df,0xbd6588cc,0xbdb303c1, +0xbd77f558,0xbdbbb252,0xbdaa8d66,0xbd13070a,0xbccd6817,0xbbbfd99d,0x3cde90d4,0x3d682d1a,0x3d6fa905,0x3dee197d,0x3e105314,0x3e1c513e,0x3dddb0ca,0x3d8178d0,0xbc75ce20,0x3d430bff,0x3da9cfe0,0x3e8ad5e5,0x3dadc8f1,0x3deaecf5,0x3d190ffb,0xbca21cd7,0xbc870c70,0x3c2438a5,0xbb7aad56, +0x3caa2734,0x3d440683,0x3d25e59b,0x3cc13c37,0xbbc7c8da,0xbc39f8f5,0xbbb343b8,0x3c8f7c8a,0xbad80992,0xbce167f2,0xbd30383a,0xbd95221e,0xbdfcc598,0xbd883c4e,0xbcf5c42f,0xbce078f9,0x3cabe8b5,0x3d36b382,0x3d8808ce,0x3d8847c5,0x3dad52cc,0x3d482e57,0xbcfb03fd,0xbd1f7e9c,0xbd24881b, +0xbd3127d2,0xbd1a50ed,0xbaeb48e8,0x3dfcda0b,0x3dfc08e5,0x3d9f8aa6,0x3d4780a6,0xbd1c44ba,0xbcf07352,0xbcb13c7c,0xbcb8fa9b,0xbb7c3431,0x3c127a3f,0x3be44067,0x3be3b7ef,0x3c41923f,0x3c958993,0x3c22e358,0x39a74957,0xbb960158,0x3b2a172d,0x3c8dff8c,0xbbaa45b1,0xbd070943,0xbb899bc2, +0x3ba7c7ae,0xbca26d85,0xbd222b07,0xbd5863a2,0xbd2f8714,0xbbbc4c3e,0xbb3743bd,0xbc06d6d9,0xbce04681,0xbd41039a,0xbd09fa23,0x3c690bd7,0x3b54c81b,0xbbc25942,0x3c1fb574,0x3d794e76,0x3ca182da,0x3ba3c3c3,0x3b110f67,0x3ca008c5,0x3c2a0279,0x3c4b41e4,0x3c161d49,0x3c37f54c,0x3a8d0d64, +0x3b619c87,0xbc4e748c,0x3bf843c7,0xba89357c,0x3cb511e8,0xba4f3ab4,0x3be9ed07,0x3a29ae52,0xbb44805f,0xbc8aa934,0xb93b10da,0xbc2747e1,0xbd2ce439,0xbd7fb6e3,0xbd4e436a,0xbd42371b,0xbd523045,0xbd35beda,0xbd15d647,0xbccfa89b,0xbc90e601,0xbc6da87c,0xbc743daf,0x3b8c32a6,0x3caf3cf5, +0x3ce16188,0x3c8ba606,0xbccaec87,0xbcb78be3,0xbd1d2b77,0xbce1ca52,0xbceab7b2,0xbcb86905,0xbc7ca320,0xbc3edba6,0xbc09636f,0xbc09476a,0xbc6a290e,0xbbd9608a,0xbc164439,0xbc21eb1b,0xbc9a4aaf,0xbc54f822,0xbc9a47a5,0xbcc2e00b,0xbd471023,0xbc45bc15,0xbc697597,0xbc8554ad,0xbc9ae311, +0xbced8c1d,0xbd15b83a,0xbd2db41f,0xbd1562bc,0xbd099638,0xbd03a371,0xbd0711b9,0xbd07afaf,0xbd1219c7,0xbd0e1d39,0xbd150712,0xbd0090cc,0xbcf02007,0xbc8e3cc0,0xbc5cd2e0,0xbc5b15ed,0xbc6fa35c,0xbc94b36b,0xbc262f1f,0xbc6348ba,0xbc932069,0xbca8d996,0xbcb7dd2b,0xbcb18c5f,0xbcddf81c, +0xbcebbd45,0xbcf3676c,0xbc8036b6,0xbc330d7c,0xbd09b306,0xbc7eb12a,0xbc2dc2d3,0x3a5a8a7b,0xbc251184,0xbc39d9f5,0xbc5e2942,0xbc71eca6,0xbc7f35fa,0xbc965c52,0xbca3a2a3,0xbcb6a432,0xbcc17433,0xbcc4cc4a,0xbcc34ce6,0xbcc0c1c1,0xbcb037f2,0xbca27588,0xbc9f5240,0xbc901878,0xbc7ecc04, +0xbd0a60f9,0xbc80b5a7,0xbd23d188,0x3cd53012,0x3d84a736,0x3df359e5,0xbbdd32a6,0x3d496359,0x3dd5d085,0x3de47acc,0x3de233a3,0x3dce32e4,0x3de1e2cf,0x3de7e699,0x3dec1023,0x3d414ce3,0xbb68c1f1,0x3df17259,0x3d44955d,0x3c2af2d5,0xbd54f170,0xbd0525a5,0xbd214775,0xbd2c4499,0xbd35ea82, +0xbd3ba93f,0xbd3ba71c,0xbd3e6a97,0xbd3f7fa5,0xbd3cc136,0xbd4af089,0xbd4f7f22,0xbd538669,0xbd460865,0xbd2676c4,0xbc9f7dfe,0xbcc0e769,0xbc1cdd39,0xbb786d0a,0x3defa05d,0x3bbb3167,0x3d0f54c3,0x3d0b3e14,0x3c0dcbe3,0x3b2393cb,0xbc47fb55,0xbb02ba87,0x3c581ee1,0xb9a8228e,0xb9b7e541, +0x3ba74bed,0x3ca8eade,0x3bf58092,0xbb76c480,0xbba03096,0x3d48fabb,0xbd33643a,0xbd2a5975,0xbd31707a,0xbd51668f,0xbd61c653,0xbd68b418,0xbd5c068a,0xbd5ccd15,0xbd6a558c,0xbd79d7a4,0xbd9bc72a,0xbda7bfa2,0xbda35e4d,0xbd9affa4,0xbd69e2f6,0xbc042c86,0xbc4bdb9f,0xbc0a02f8,0x3d2736c8, +0x3dbbac0d,0x3d5c208e,0x3d8757c5,0x3d41eb41,0x3d0f4744,0x3c012b27,0x3d2226c0,0x3c9265d2,0x3cfbf7b7,0x3bbe3a62,0x3d1ff0e4,0x3cb3bc4c,0x3cd12112,0x3b533573,0xbb74f3b4,0x3b07b3d2,0xbc051ae3,0xbd375942,0xbd6ee35b,0xbd89a2cc,0xbdb40f7b,0xbdd3bd72,0xbde8327f,0xbdefbb35,0xbdfda510, +0xbe011b36,0xbe04f6e2,0xbe192af9,0xbe1c0d3e,0xbe111544,0xbdfaf3eb,0xbdb2d163,0x3c350d37,0xbaebae9b,0xbd112664,0x3d9d6263,0x3e091389,0x3d82219f,0x3d6f6ea5,0x3d8eac02,0x3d273289,0xb8c0d62f,0x3ce48287,0x3d1311dd,0x3c17e978,0x3d08b171,0x3ccd5a6a,0x3ca5113c,0xbb06f18f,0xbc905fdf, +0x3b3badc0,0xbc76a0b0,0xbbe2ac24,0xbd40171e,0xbd3e2b34,0xbd4668ad,0xbd94b88e,0xbdb346ce,0xbdc5eeea,0xbdbb0fcc,0xbdbc7af2,0xbddf38e0,0xbe0e2fcf,0xbe4376d2,0xbe4f252f,0xbe456ede,0xbe2ca0fc,0xbdd41113,0x3cd56b83,0x3bfb34d9,0xbe6b07bc,0xbe1d08e4,0x3cb94086,0x3d877edb,0x3c865b48, +0x3c5a6be1,0xbc3b3400,0x3c3f270c,0x3d16ada0,0x3d39eb2b,0x3d067e89,0x3cede482,0x3cd2ced9,0x3d333aab,0x3c4d828a,0xbc03b7fc,0xb9f61dcf,0xbcbf51ab,0xbce095ac,0xbdb653a0,0xbe301370,0xbe6b9471,0xbea13773,0xbeaf5678,0xbec63999,0xbee35c38,0xbee501be,0xbecafae9,0xbe862fa9,0xbe5ff46a, +0xbe2c9f34,0xbdb9252c,0xbd99931e,0xbdbf094e,0xbe0a3afc,0xbe6a372d,0x3dde009e,0xbdff5d4e,0xbe3170bb,0xbd91076e,0xbd83b324,0xbbc9b383,0x3d02bb8c,0x3d955cdb,0x3d8fca8a,0x3d8ae226,0x3d11b8f6,0x3d50fb00,0x3d0efc4c,0x3cd3008c,0xbbd1c9b4,0xbcbc8c63,0xbd29cddc,0xbd861e14,0xbdb52da7, +0xbdcdef42,0xbdd851b5,0xbdca0ffa,0xbd7b807d,0xbe0854bd,0xbe053e80,0xbdad70ee,0x3cb20373,0x3d9784ae,0x3daac1aa,0x3e0f2826,0x3dfa0c3c,0x3d436b01,0x3e2221a8,0x3e594a25,0x3e912dad,0x3e3ca2a9,0x3e07d3ba,0x3dd73d79,0xbd1b1ceb,0xbc6fc465,0xbd209b0c,0xbcb5558c,0xbca39753,0x3ae45589, +0x3cb1d95f,0x3d236612,0xba4074ed,0x3d361af3,0x3d4c8e01,0x3d6f7cec,0x3c2e2063,0xbc4ed99a,0xbce38572,0xbca207a5,0xbcf616e7,0xbc03b54e,0x3d0173f0,0x3d16c052,0x3db8d611,0x3ddbe10c,0x3df3131b,0x3db3aaa2,0x3de985f7,0x3de6129d,0x3d86a29f,0x3daac29d,0x3d70ca66,0x3cabe8ce,0x3e02824e, +0x3db2e850,0xbd86b54e,0x3d034f58,0xbded694a,0x3d75068e,0x3dbbea3c,0x3cfb0a80,0x3c6be8af,0x3c30751c,0x3cc9d751,0x3d676602,0x3d099adb,0x3c90b919,0xbc531c71,0x3c20ef9b,0x3cb313b2,0x3d0cc5a4,0x3cb9d329,0x3c0ddd95,0x3c23f470,0x3b128597,0xbcddabbb,0x3b09ed4e,0x3c8855e7,0x3c4a0076, +0x3c9b4ba3,0xbb741522,0xbc60bd20,0xbc20a11a,0xbd71d621,0xbdc907a9,0xbe004a54,0xbe09fca9,0xbdba4fcc,0xbd193307,0x3cd90b6e,0x3cbb4eeb,0xbdef8e50,0xbdd98ab0,0xbdd6418f,0xbc981120,0x3cdc1e46,0x3d23bbd5,0x3c4677e8,0x3ce766bd,0x3c82a862,0x3bcf4f71,0x3c160ddc,0x3c056ebe,0xbc543ae7, +0x3c722e1c,0x3cd704b9,0x3cf2c7df,0x3cac8f7f,0x3c6fbbc7,0x3c697db9,0x3d02c140,0x3cdb389a,0x3d53ac5f,0x3d0f7f08,0x3c7bc7ab,0xbc888e04,0xbd4bf7c0,0xbd7ff6cf,0xbd857b93,0xbdc4fb71,0xbd8ff840,0x3c232cd5,0xbc8e2dfe,0xbc8c55c8,0xbba2e8e1,0x3d881150,0x3d9e6233,0x3cfc294b,0xbd975e54, +0xbd0e4466,0xbd485ad6,0x3c522048,0x3b8db1f4,0x3be77bb0,0x3cc59d91,0x3cca125f,0x3ca20239,0x3cad2091,0x3c944d47,0x3c991b5f,0x3bea60d0,0x3bc7f925,0x3c767c41,0x3c8c49ad,0x3cb45a8c,0x3c8e7d97,0x3d055865,0x3d265ffe,0x3d0d4ea0,0x3d4312db,0x3d3cf6fd,0x3c97390d,0xbd065153,0xbd924835, +0xbddb75c1,0xbdbf549c,0xbdadaf1f,0xbd95491f,0xbd5cf877,0xbd1a240d,0xbd119c99,0x3c9afbf7,0x3d5c01f9,0x3d85b488,0x3c4056fb,0x3cbfc584,0x3d307ff1,0x3d1f60d9,0x3c98454e,0x3c4d3c9c,0x3c89fbd2,0x3c92bc01,0x3cbf1c8d,0x3ca7a3a0,0x3cdf970e,0x3cbe856a,0x3d071525,0x3cf5710a,0x3ceb9dcc, +0x3cf90540,0x3cd522b7,0x3ca8a083,0x3ceef6a8,0x3d074698,0x3d3c8e83,0x3d3489a9,0x3d1ae408,0x3d260e65,0x3cc9f947,0x3c2de6b9,0xbbf1af0d,0xbbd86bbd,0xbc74d8ba,0xbce1c5a1,0xbccb62f8,0xbcdadbeb,0xbd06c2b9,0xbcbc61b6,0xbc455a9a,0x3c054190,0x3c926005,0x3cd0cfa2,0x3d035284,0xba55b4a7, +0x3d01b8bc,0x3ca63884,0x3cad1a9c,0x3ce06c98,0x3ccfeb78,0x3ced0ff1,0x3cca706f,0x3c8ac6ab,0x3c84679b,0x3c5e0a52,0x3c188c6c,0x3c00957a,0x3c414f53,0x3c928a17,0x3ca94e5c,0x3c2588a7,0x3cd25681,0x3c8f3f79,0x3c43d285,0x3badda2d,0x3a5a8cd9,0xbb032e07,0xbbe15640,0xbc12a0dc,0xbc3326e6, +0xbc405ca7,0xbc55a0f1,0xbc4c7197,0xbc41284c,0xbb0fd6a3,0x3b9efb38,0x3c2bb41c,0x3c8f54f1,0x3ca237d3,0x3cfdd6d2,0x3b60a828,0xbbf1831b,0xbcb65be2,0x3c81a7d0,0xbaae5cd6,0xbc80fe05,0xbc924d18,0xbc92814e,0xbc853c3b,0xbc8ff451,0xbc93bac1,0xbc966aaa,0xbbbf18e7,0x3be3d538,0xbc9c44ed, +0xbbf5ccc4,0x3aae44d0,0x3c876a2d,0x3c31c133,0x3c26ad2c,0x3c04931c,0x3bc9bc6a,0x3b686cdc,0x3a43df5f,0x3b75d00a,0x3bc4d25f,0x3c03447a,0x3c1122ad,0x3c18b8c3,0x3c0773ed,0x3c346996,0x3c580e5d,0x3c81af3d,0x3c976e2f,0x3ca3282a,0xbd43336f,0xbd5b2206,0xbd5544fd,0xbd83f828,0xbd822f7d, +0xbd5d7499,0xbd64fa5f,0xbd71c6cb,0xbd73cc00,0xbd6f4c92,0xbd6bedc8,0xbd605ce1,0xbd605280,0xbd5ea6dd,0xbd570a65,0xbd6bc07a,0xbd4b6746,0xbd705830,0xbd821976,0xbd6c71cc,0xbd0c27f1,0xbd2a4b32,0xbd2719e4,0xbd1af3da,0xbd2584b8,0xbd271381,0xbd28289d,0xbd2226a6,0xbd1f562d,0xbd2203be, +0xbd1b407d,0xbd2363e0,0xbd42f8ac,0xbd3be72d,0xbd4a1c0b,0xbd6f5f4c,0xbd668ee1,0xbdd52a59,0xbdc96e93,0xbd7d2d9f,0xbd7e76fd,0xbd787128,0xbd6ee4ae,0xbd48d94f,0xbd2b49a8,0xbcf4f1ee,0xbcf8927f,0xbd115ee7,0xbd016a13,0xbcea9c94,0xbcdff3e4,0xbd0e4273,0xbd180821,0xbd3d83bf,0xbd39bfcd, +0xbd7ce516,0xbd209e12,0xbd227d62,0xbd29efeb,0xbd0955e2,0xbd244bd9,0xbd30908c,0xbd43afdd,0xbd44c033,0xbd43d314,0xbd4ae310,0xbd272933,0xbd36ff8c,0xbd8b886c,0xbd7b1b7d,0xbd947dfa,0xbdd572d5,0xbddc8166,0xbe032a53,0xbdd8edc0,0xbda3cc65,0xbda1723a,0xbd73bd13,0xbd29ed32,0xbcff4c65, +0xbcde5476,0xbc82239d,0xbb2392a8,0xbc65955c,0xbb2cecd9,0xbbbe2704,0x3ba84b13,0xbc25adcf,0xbc8deff1,0xbd019a0c,0xbd292503,0xbd526049,0xbd080c66,0xbd0adda3,0xbd14688a,0xbc991680,0xbd02a4f9,0xbd13c6a9,0xbd251472,0xbd1ba2fe,0xbd13f96a,0xbd1bc109,0xbcd3c593,0xbd0a3cc5,0xbdb1dcd3, +0xbd918407,0xbdb500fa,0xbe126a39,0xbe07505d,0xbe7455d4,0xbe502a4c,0xbe083fc3,0xbdc76980,0xbdccd0ac,0xbd82e141,0xbd40036e,0xbcbc4823,0x3c87b2bc,0x3cfae156,0x3c8f4f97,0x3ccb6caa,0x3cb49789,0x3cb50d14,0x3ace4a3b,0xbc3cb826,0xbd0ac7e4,0xbd1a5236,0xbd4c4566,0xbd089655,0xbd053207, +0xbd043a6e,0xbbf2c6a3,0xbcd1f64f,0xbd2786a9,0xbd802e85,0xbd9403e7,0xbd8f39aa,0xbd87c5b7,0xbcef6254,0xbd38bc40,0xbe0528da,0xbde876af,0xbe174d1e,0xbe800181,0xbe80db69,0x3ea5c011,0x3e3750b1,0xbbfce8b7,0x3aa1efbe,0x3cf36025,0x3d03221f,0x3d4fde66,0x3ce5bd13,0x3c1498a0,0x3c5cbe1e, +0x3d05e8b8,0x3c8ff446,0x3c73430c,0x3d10db42,0x3b7f9e09,0xbbfccde9,0xbcd2c7ae,0xbd266892,0xbd92ed1c,0xbd85cea4,0xbc667c77,0xbc998eb3,0xbc4077b6,0xbcb41d7e,0xbc8a7d41,0xbc9c09ee,0xbc753fe0,0xbd377f85,0xbdc72bf4,0xbdc774e0,0xbd926c2d,0xbd4daaec,0x3cd656f6,0x3dbeaf83,0x3df7e818, +0x3e87fc84,0x3d9ff84b,0x3e21e2d6,0x3db1e88f,0x3d6c5be7,0x3d81c088,0x3c93fc69,0x3cba324e,0x3ca88a5c,0x3d707206,0x3d6f432d,0x3cc35481,0x3ce0d8fd,0x3cd66672,0x3d4eaf86,0x3c0d1a48,0xbc6aa129,0xbd331c7f,0xbd68d414,0xbd92a70d,0xbd08d3cc,0x3c26d073,0x3d0dd601,0x3d9a113f,0x3dd937a2, +0x3de8750f,0x3dca95e4,0x3d87a3e0,0x3d4da4e5,0x3d5f16be,0xbd89b03a,0xbd7ef62c,0x3d205b97,0xbb0b0cf8,0xbc102765,0xbc15be2e,0x3be0497b,0xbca092a5,0x3ccc41cc,0x3d92b9db,0x3d86d024,0x3d5c9742,0x3d244300,0x3cd943c9,0x3d7153ce,0x3d1756b9,0x3d11407f,0x3a7974c1,0x3aca8395,0x3c196c44, +0x3d907148,0x3c42996f,0x3c2dc3b6,0x3c7e88f0,0x3ce7b004,0x3d18fc43,0x3d00385c,0x3d468df4,0x3cff6bb7,0xbce43ba0,0xbc8b1f06,0xbc527c15,0x3b6192fb,0xbd26c3a1,0xbd7a91e2,0xbd1d46d7,0xbdc62d82,0xbd8d5d0a,0xb79a92c7,0xbd3cdcf4,0xbd328de8,0xbd2d6431,0xbc9a9e2e,0x3df8796d,0x3cd5f543, +0xbc7b100c,0x3c9f5faf,0x3c5176bf,0x3c87d079,0x3c9a7094,0x3d523115,0x3c7a6b55,0x3b6b112e,0xbbcafd81,0xb83daf4c,0x3c63bab2,0x3da044ce,0x3d1f2dcc,0x3d0c1089,0x3d71c72f,0x3d1f0b60,0x3d00f272,0x3ce1afe7,0x3c0681d0,0xbbd56293,0xbbb692bb,0x3a43f3aa,0xbb8f8e2c,0xbc3f5e79,0xbd2adfd9, +0xbd120e20,0x3ca3cd00,0x3d0e180f,0x3d89ef6c,0x3dfb70fe,0x3daabfda,0x3d72df7a,0x3cf0f7fa,0x3d9e75a6,0x3ca486af,0x3d54a205,0x3b81d2e0,0xba5a10b1,0x3c8f09b6,0x3c7a4a13,0x3ccdb83d,0x3cd7687f,0x3c88efa9,0x3ca89e99,0x3cc11760,0x3d2e1e3a,0x3d2a2595,0x3d16aacf,0x3cc5cd1f,0x3cbfad39, +0x3ce35d98,0x3cadcd1f,0x3d08ad28,0x3d060e7d,0x3d05ebc0,0x3d099d78,0x3cb251dd,0x3b178e93,0xbc8c1b86,0xbd50ce28,0xbcf77efe,0xbd4c263a,0xbdc557ab,0xbda05256,0xbd24dbdf,0x3cd87a08,0x3cbf0335,0x3c0985f4,0xbd33758b,0xbcd86e4e,0xbd156855,0xbcfd0396,0xbd21b0f5,0xbc12295a,0x3bb8ddc3, +0x3cb0f771,0x3cea7bcc,0x3c6c61cb,0x3cbcd93e,0x3ccca0fa,0x3cc0fb2b,0x3c479396,0x3c3c2473,0x3c5e7bbe,0x3cce35e1,0x3cf3b9d1,0x3cfee039,0x3ce86b14,0x3ce03b3e,0x3c59edfd,0xbadea83d,0x3bb6535c,0x3cf4780f,0x3d345581,0x3d3c8f69,0x3c56e83f,0xbc5e410f,0xbd199099,0xbd4e0267,0xbcbb06a8, +0x3b8d5f03,0x3d0da916,0x3be8f055,0xbc4cd9bf,0xbc84af05,0xbd10282e,0xbc7da45c,0xbd096ae4,0xbc858a81,0xbc7a59cd,0xbc61a7a7,0xbc53733f,0xbc0578db,0xbb38dbb1,0x3c4001f6,0x3c8f7e43,0x3d14428d,0x3cd50e80,0x3cab2e71,0x3c9612cd,0x3c23b025,0x3bf3afc4,0x3bbc1787,0x3c2ca118,0x3cc164cb, +0x3c774ecf,0x3c86734d,0x3cd7d8fd,0x3ce4b1a5,0x3c4b0b05,0x3b6e96b5,0x39bfee24,0x3c2cec11,0x3cc28372,0x3d118377,0x3cff304b,0x3ce4ddd5,0x3cf950fd,0x3cb05252,0x3c6f3392,0x3be57755,0xbb687b7a,0x3cd8d47a,0x3cdccbd3,0x3d516c62,0x3ce430fa,0x3d1df914,0x3d15b240,0x3d038010,0x3d0632c9, +0x3cf0af2d,0x3d04fb4e,0x3d0f1487,0x3d19902f,0x3d242913,0x3d3354bb,0x3d216367,0x3d1e7faf,0x3d101e6b,0x3cf1067d,0x3cf3fbb5,0x3cd7878f,0x3cebcedb,0x3cffefc0,0x3d0f647f,0x3d282ff6,0x3d3af3a2,0x3d422a63,0x3d3a5f1f,0x3d2e2bcf,0x3d2c923c,0x3d2ff276,0x3d32c4e1,0x3d2eb9f1,0x3d21d96c, +0x3d1686ad,0x3d080918,0x3cfd51ee,0x3ca4d79f,0x3c55b63c,0x3d0cb68b,0x3d2adc70,0x3d2cd82a,0x3ce11533,0x3d1b341d,0x3d23f0a8,0x3d25163d,0x3d201dcd,0x3d16445e,0x3d156c72,0x3d1067c8,0x3d109958,0x3d2a5b0d,0x3d0df850,0x3d08f925,0x3d1d4984,0x3d06e354,0x3cb2710d,0x3cd4560a,0x3ce2fd73, +0x3cefa76b,0x3cfe0896,0x3d06f080,0x3d155afe,0x3d0c1e3e,0x3d059c6d,0x3cf632a1,0x3ce57371,0x3cd54e24,0x3ccab5c7,0x3cbee245,0x3cb58d52,0x3cacde63,0x3ca4f55e,0x3c99d913,0x3b9d86eb,0xbabf6ba7,0x3c53bb5a,0xbbd0d945,0xbcafcfab,0xbd3a514d,0x3b9314a8,0xbc709001,0xbd00662e,0xbcf2a1bd, +0xbce2dd23,0xbce019d4,0xbcf68670,0xbcf967ac,0xbce79ab5,0xbbf039c6,0x3b89f1fa,0xbd173df1,0xbc41acfd,0xbb0fa936,0x3c46a0cc,0x3ba7f821,0x3bf70cfa,0x3c21cf9e,0x3bfe9b76,0x3bc49685,0x3af4490e,0x3b164f97,0x3adf04d6,0x3b2f59b1,0xb8f8f6cf,0xba686941,0xbb23482c,0x399bb126,0x3a0779b2, +0xb8e444ba,0x3a302094,0x3c949338,0x3c7d7d7b,0xbd8048b8,0xbc0606f6,0xbc8b72c4,0xbc0baadc,0xba62c2de,0xbb268f58,0x3c02334e,0x3c010032,0x3bdc1b44,0x3c006e9e,0x3c0682d0,0x3c70de00,0x3ac18617,0x3b15f94f,0x3a2f8079,0xbaeb5286,0xbca688e3,0x3c426a78,0x3bfd902c,0x3c04412b,0x3c602108, +0x3bd85c60,0x3a25dcf4,0xbc11ffb7,0xbc0ada80,0xbbd7ef8a,0x3af6c3d2,0xbb38a9ff,0xbb729730,0xbbd91d2b,0x3b5eae35,0x3c2f4def,0x3c973245,0x3cabfc20,0x3cee0096,0x3c4f3a40,0xbcef0331,0xbb85c77c,0xbccff200,0xbca49f79,0xbc091707,0xbb1f212c,0x3bbdf61c,0x3c566dd1,0x3c226125,0x3c509de6, +0x3beb5946,0x3d03b009,0x3c3b6903,0x3c24e207,0x3bcdaed6,0xbb29438b,0xbb35df78,0x3c568151,0x3c75d63b,0x3c911434,0x3d030502,0x3cc41b16,0x3c896d65,0xba66219e,0x3b635076,0x3b2160a8,0x3bceba89,0xbc4895f3,0xbcac109e,0xbd0538cd,0xbca24100,0xbc72f049,0x3c08cf62,0x3c3ced81,0x3dea267b, +0x3d221f0a,0xbd4cd223,0xbce4bb32,0xbc28ffcd,0xbcc3369c,0xbc02f132,0xbc2a37dc,0x3c3e68ad,0x3ce45966,0x3cbf3144,0x3c9e1486,0x3cbade93,0x3d292303,0x3c558762,0x3c1f7a3b,0xbc367fbc,0xbc0c036c,0xbcbfae04,0x3c019bea,0x3c45f5c2,0x3c01870b,0x3cee3d28,0x3c1b9884,0xbbab1207,0xbced96d0, +0xbcc44dd5,0xbc8be9bb,0x3b83ecad,0xbc6ab45e,0xbc8d4db5,0xbcd40cbd,0x3bb85407,0x3cf82a15,0x3dae393e,0x3dc57f12,0xbc785a36,0x3e038e8a,0x3e689bbe,0x3e207dd4,0x3dbe4e9d,0x3d646c06,0x3d48f81f,0x3d969414,0x3d5ad601,0x3d0417cc,0x3cef657c,0x3c69239c,0x3c23ea89,0x3cf233cf,0x3c833ae4, +0x3c80f45f,0xbbf05d14,0x3c672a1d,0x3c0ffc01,0x3cdb482c,0x3d59798d,0x3d936ce2,0x3dfcac9a,0x3defa221,0x3e0afffb,0x3e2c35eb,0x3e2ed97e,0x3e257db1,0x3e0fdf2b,0x3d3ef752,0xbd3226ac,0xbe090e65,0xbe35899f,0xbe3b1c26,0xbe20f267,0xbd478171,0xbc1ee7bb,0x3c5887c6,0x3d90abbc,0x3d5d9478, +0x3d976ce7,0x3daf7661,0x3d7bd65c,0x3d346d8b,0x3d42a914,0x3d446f94,0x3c5daf17,0x3cf3fc7b,0x3d0ce299,0x3d58e4cf,0x3cc711a9,0x3cd147eb,0x3cde1c98,0x3d2e2198,0x3d1600ed,0x3cbd87fe,0x3c91d006,0xbcdde04b,0xbdc2528b,0xbd8fc249,0xbd8ed4b1,0xbde1a8b3,0xbdcd627f,0xbdd0b89b,0xbdaec247, +0xbb36683a,0x3d64214c,0x3dc87dc0,0x3e098eff,0x3e02998f,0xbc567a86,0x3d1a663d,0xbcb7ec9b,0x3cbff786,0x3d2d29ab,0x3d01a192,0x3d5a43c3,0x3c2b6891,0x3d38ffe3,0x3dc8fe04,0x3d3f3106,0x3cdac60b,0x3c105d6d,0xbc9b53f8,0x38284021,0x3dd8483d,0x3cee2971,0x3c551990,0x3ca71ab4,0x3c17c43d, +0x3c021919,0xbaf58baa,0xbd0f55f0,0xbd2a43eb,0xbd4801db,0xbdbb61f9,0xbdf0f8c8,0xbe0d516e,0xbdb6cd76,0xbd4f1392,0xbc803b63,0x3d24069e,0x3d965423,0x3e015be6,0x3d8ece42,0x3cd6fd4f,0xbc7c0e0e,0xbbc6cb31,0xbd50e188,0x3b7546df,0x3d4af4df,0x3c04f873,0x3cc8dd41,0x3c98d3d3,0x3cedd057, +0x3d5ed5d9,0x3c6fa7c5,0x3a676636,0x3cf5a249,0x3c7fa7eb,0x3cce9b88,0x3d939a90,0x3cd640b7,0x3c823009,0x3ac7b7f9,0x3c36cb57,0x3ce12394,0x3bfe8d91,0xbbe44c7c,0xbb067129,0xb974f381,0x3c5dc578,0x3c66cc8d,0xbc128585,0xbc3c7379,0xbd4d9460,0xbdfc3c04,0xbdbbdd53,0xbda45b54,0xbda7e477, +0xbd896d3c,0xbd82ab95,0xbdf02657,0xbd00cd6c,0x3b6ab823,0xbca2c48f,0x3c8e5ef0,0x3cc61e56,0x3c42fb52,0x3ca63c16,0x3c4c71e3,0x3cb99037,0x3c9fa258,0x3c926f30,0x3cbbe1e8,0x3c51fd78,0x3c370330,0x3c63cb43,0x3c702688,0x3caaefc0,0x3c69f8cd,0x3c804aec,0x3c714668,0xbb9d154a,0xbc605531, +0xbcb13fac,0xbc7684be,0x3c173125,0x3c719528,0x3cd4d623,0xbcd18ffd,0xbd3dd840,0xbd49d56c,0xbd1b4e71,0xbd0c3fa9,0xbd40bff5,0xbcde1c92,0xbd0324db,0xbdac4c51,0xbb145005,0xbcd2b349,0x3c9535e3,0x3ce8f343,0x3d108748,0x3d05d204,0x3cf50e72,0x3cdf882c,0x3d13feeb,0x3d1045ba,0x3d01a18a, +0x3c899cff,0x3ced1837,0x3ce1e43f,0x3cc1440f,0x3c72c6a8,0x3bfc1da9,0x3b23deb4,0x3b931d4d,0x38b76109,0xbb3d83af,0xbc5bfdbf,0xbc5d8fef,0xbbe89067,0x3cc2ab7b,0x3cef74b1,0x3d0bf34b,0x3cc9ed45,0x3d02c797,0x3d45c0ce,0x3d044b15,0x3be87e75,0xbd0b8928,0xbcc54b58,0xbce93386,0xbd3bacdd, +0xbd4c8d9f,0x3b58288d,0xbbee6785,0xbc3a234b,0xbb05ca13,0x3a230c11,0x3b291818,0x3b983cdc,0x3b6dafc2,0x3bc26b8e,0x3bfb62cc,0x3c4520b3,0x3c4e0fe2,0x3cbafd1e,0x3cd6fff2,0x3ce5ce16,0x3ce1b312,0x3cf35454,0x3c8f3be0,0x3c02306b,0xbb703148,0xb9e67272,0x3ba16417,0x3b8a9ee9,0x3c533b01, +0x3cb0d426,0x3d02493c,0x3cc77ce5,0x3c6ae84a,0x3bae9350,0xbafe1113,0xbbb467f9,0xbc4ab870,0xb9b597f4,0x3baf8b14,0x3c7f7224,0x3c2a53ea,0x3b50de43,0x3be732bb,0x3bc8b7fc,0x3c7ebb29,0x3c75b957,0x3ca17e9e,0x3ccff742,0x3cdc2468,0x3ce4be09,0x3cbcce14,0x3cc043c8,0x3ca3ce0f,0x3c9cc8a9, +0x3c95d7da,0x3cabfeeb,0x3c65eec1,0x3c43aab2,0x3c1c2069,0x3c9a9ab3,0xbc0e456e,0xbc0fa4ac,0xbc1404eb,0xbc0b6203,0xbc1bff05,0xbc3d6b51,0xbc3d6043,0xbc60472e,0xbc5e64a2,0xbc76387b,0xbc8e31dc,0xbc9ea99c,0xbcb1f979,0xbc8f6b37,0xbc615349,0xbc1b49b8,0xbbb8d2f1,0x3b50476c,0x3bd94c4e, +0xbba47f40,0xbbc5ae94,0x3b05ab8c,0xba1a2308,0xbb2c37b1,0x3b494672,0x3b7f345b,0x3bdb9285,0x3c0a3c53,0x3c329749,0x3c540101,0x3c671756,0xbab8e66e,0xbb45ad5c,0x3c69294c,0xba64b8fd,0xbb125efe,0xbb2c7306,0x396ada36,0xbac5cc3b,0xbb0542e7,0xbb1f30a5,0xbb25a806,0xbb45358a,0xbb83573c, +0xbb9cb8a3,0xbb9dbf1a,0xbb937ae6,0xbb8a0b62,0xbb9f6e90,0xbb239962,0xba984800,0x39b50245,0x3b0c746e,0x3b956574,0xb99ea73d,0xbb864d59,0xbc4e53ee,0x3ae8b83d,0x3c286751,0x3c831455,0x3b36c9e0,0x3c24d95f,0x3c2fd0de,0x3c2a3368,0x3c2ff871,0x3c30cd3a,0x3c338a7a,0x3c41f341,0x3c7743d9, +0x3c1d4a27,0x3b9eaa54,0x3c40e0f7,0x3c0b85cb,0x3bbba02a,0xbb0c3338,0x3a92ff0b,0x38df06e8,0xba8c8b5a,0xbacbacb0,0xbb0e4c1d,0xbb8761ae,0xbb0e3535,0xba7b7656,0x3a07db27,0x3b12f1cb,0x3b24fe6c,0x396cd79e,0x3af3a933,0x3a95f22e,0xbb1e3a10,0xbb7b561f,0xbcfbc27c,0xbc978cbf,0x3d00d036, +0x3bb5ee0b,0x3c890a59,0x3c2bb3ca,0x3c18fa52,0x3c0bc3cf,0x3b8ba2f4,0x3b3eae71,0x3bca4a35,0x3bbee8cf,0x3c0f0a69,0x3c6e740d,0x3c4e5aba,0x3c230683,0x3bbdc8b9,0x3bf56663,0x3c70d106,0x3adae50e,0x3b162c16,0x3b3f3b94,0xba13aafa,0xbb02169d,0xbb7e3d01,0xbbe1bd64,0x3556dd28,0x3b4418a5, +0x3b304a80,0x3b94df7d,0x3b493430,0xbb962965,0xbba590f2,0xbc81eea9,0xbcfc0121,0xbd05de13,0xbd833531,0xbd14e231,0x3c4b6ee9,0x3ba5fe16,0x3ce709bf,0x3ca6166c,0x3c8ce970,0x3c774f5b,0x3c3cb0bc,0x3c12753d,0x3c4070e1,0x3c32ec4c,0x3c96201b,0x3ce314ee,0x3cbac2b1,0x3c82c2f7,0x3bd52e43, +0x3c558d07,0x3c8cb040,0x3bdbd2de,0x3ba33440,0x3b9096bf,0xbbb3bdd0,0xbc1416bb,0xbc69128e,0xbcd39afa,0xbc7aa235,0xbbe411fb,0xba13651d,0x3c579e9a,0x3c85d6d8,0xbb26b09f,0x3b959473,0xbc053d39,0xbd32c554,0xbd37cd7a,0xbe32a70b,0xbd8117ce,0x3d2c7a06,0x3cdeb322,0x3d10a8c0,0x3d20b90f, +0x3ce4c72c,0x3c8389ca,0x3c555990,0x3c5b5a7e,0x3bf613b4,0x3c67d9b2,0x3cc69bf4,0x3d378d42,0x3cbd302b,0x3c85fae3,0x3c7824f9,0x3c8689b4,0x3cb63bbc,0x3c4e89ca,0x3be7619f,0x3c5b6844,0x3a3215fe,0xbb9ec29c,0xbc52695b,0xbcd5d9ca,0xba80e44d,0x3c3bed4a,0x3c213ac7,0x3ca8cb32,0x3bc02cd6, +0xbcee7fec,0xbcd86c9f,0xbd838eb8,0xbe14f680,0xbe193dd6,0xbd8f9394,0xbd945b41,0xbd9f2376,0xbd19cb3b,0xbc111b9f,0xbbdb43bc,0xbc7d2518,0x3a603b16,0x3d276361,0x3d4e9067,0x3d342d21,0x3c99d1f1,0x3c5713fa,0x3d0da32d,0x3cae6a07,0x3c985866,0x3c03757b,0x3cbfc8d6,0x3d0e1ee2,0x3d37fddf, +0x3b8424e9,0xbcbc182b,0xbd633936,0xbd6f7329,0xbd8a2a5e,0xbdb2b78f,0xbd9704e7,0xbd6d20d0,0xbcfb5517,0x3bc4ce37,0x3d5a4647,0x3e0fcfce,0x3d9ab0be,0x3d879033,0x3dd18c48,0xbcc111c1,0x3ddd46e6,0x3ca9dd89,0x3c632d56,0x3d1fe0ba,0x3c38552b,0x3d3cd109,0x3d6568fb,0x3d3717d1,0x3d3d22f7, +0x3d420165,0x3c492f09,0x3cadfb98,0x3cdd0b50,0x3d587e45,0x3cc6ae9d,0x3cc27297,0x3cad8f5c,0x3cdeec37,0x3ce57649,0x3c57c6f8,0xbbd85aff,0xbbc7c143,0x3bc7118b,0xbd37e8fb,0xbd9777f8,0xbda4093e,0xbdbf81df,0xbdb4e0be,0xbd9bc92d,0xbcccde56,0x3c26f529,0x3d7df2ff,0x3d97c01a,0x3d958dbb, +0x3da32b74,0x3dd86fd3,0x3d3923d2,0xbc626bdd,0xbd02deb6,0xbcd4563a,0xbcff73fd,0xbcba8bfe,0xbac555e8,0x3d9bfbee,0x3cbd0806,0x3b81bdac,0x3ac5f474,0xbc138656,0x3c7f26d3,0x3dc01dd3,0x3ce57016,0x3c37bb45,0x3bee0e6b,0xbc2c41ce,0xbc9106ec,0xbcc3595a,0xbc6018ef,0xbcf8ea8b,0xbd5a5b98, +0xbc7ff9f8,0x3cac49bc,0x3d70b716,0x3d9e6653,0x3d9b6d30,0x3d3c5233,0x3ce99f15,0xbbcbb942,0xbd32fee2,0xbdd10f91,0xbdf02e31,0xbdf2db6e,0xbcbc0e81,0x3cb57d7a,0x3a54fca7,0xbcbd30db,0x3b055b2b,0xbb263b94,0x3c0e3cb7,0x3c293850,0x3d0e2d6b,0x3c23777a,0x3c2dc6e5,0x3d0be079,0x3b9fc327, +0x3c901dc1,0x3d706ecc,0x3c8a2694,0x3bf02c18,0x3b42de68,0x3c057f79,0x3baa34c0,0x3cc1aa73,0x3d88c7d3,0x3d8e42de,0x3d393d9f,0x3d993af2,0x3db9a7d2,0x3dcc2808,0x3da2f215,0x3d57b3d1,0x3cb79722,0xbd2a09e4,0xbd98e81b,0xbd706587,0xbd9fd4c8,0xbd7c64cb,0xbc26707f,0xbbc84b5d,0xbbee706b, +0x3ba135de,0x39805bb8,0x3b686c9a,0x3c3d3595,0x3bd142d2,0x3c56bbe5,0x3cbe0dde,0x3c5e6808,0x3bee3583,0x3b50735b,0x3c682e4e,0x3ca4f6ed,0x3c95c74f,0x3c8b63a2,0x3c6402a7,0x3c69b8eb,0x3ba6fbd7,0xbbd8d3ee,0x3c345c72,0x3c978456,0x3d05eab9,0x3d20b2be,0x3cf92780,0x3c8f1721,0xbb2a726c, +0x3b40e710,0x3b9a35fe,0x3c0e098b,0x3cc3bce4,0x3cdae07c,0x3c9832ad,0xbd3124fa,0xbd8797be,0xbd67851f,0xbcb1c929,0x3c219cb7,0x3c9ed3cd,0x3c233c39,0x3bf6be0a,0x3ca06f97,0x3c1f3a11,0x3c2f5c3a,0x3c53f7f3,0x3c8c3913,0x3c9c1fb1,0x3c57de09,0x3c53a915,0x3c42ffea,0x3c4f5d6f,0x3c91b3a1, +0x3c9a0bb1,0x3c7eda01,0x3c243bd7,0x3c300d14,0x3cdb4844,0x3cbec39c,0x3c5013a2,0x3a448e6c,0xbc1c4ff6,0xbc8d1eb4,0xbc923f4a,0x3bd6c559,0x3c39b967,0xba15d851,0xbcc253e3,0xbcc7b982,0x3b0c6335,0x3c69e5a2,0x3c300fa2,0xbcee3b79,0xbb6d8e75,0xbcb3b5ab,0xbcb9da81,0xbbffa798,0x3b0f507b, +0x3c61cec7,0x3c45da8b,0x3c738ec2,0x3c6dde80,0x3c53e15c,0x3c2605df,0x3c194d18,0x3c417d8d,0x3c8765cc,0x3c922220,0x3c81b6fd,0x3c3533fa,0x3bc65a70,0x3a98aa5d,0xbbc8401f,0xbc6a1b3b,0xbc98e651,0xbca786fc,0xbca2fc4f,0xbbff5e03,0xba086de1,0x3b5050e8,0xbc206f5c,0xbca532eb,0xbcda5003, +0xbbdde96d,0x3c09e5a1,0x3c99385d,0x3b4ef457,0xbba60837,0xbc6ebc14,0xbc8ab901,0x3ca8451b,0x3cb6ecc1,0x3cd05350,0x3c99b37e,0x3cb1865e,0x3c9a53a4,0x3c6ed2c8,0x3ca399e8,0x3c5b3c0e,0x3c93e5af,0x3c9d6729,0x3c940710,0x3c881eac,0x3c9745d9,0x3c474174,0x3c252d35,0x3c1a9373,0x3bf8ff90, +0xbba3a3b5,0x3c25eada,0x3c3cdc16,0x3c1a92a0,0x3bd00bd4,0x3b875179,0x3b4e74ee,0x3bb01ac7,0x3c0b4193,0x3c594fbc,0x3c622ca0,0x3c62cd24,0x3c3c82af,0x3c7028c1,0x3c719f8e,0x3c8344a7,0x3c8d7079,0x3ca2a61c,0x3cbb1eeb,0x3cbb2f05,0x3cddd88d,0x3ccda007,0x3c783d72,0x3ccc419d,0x3cbc377e, +0x3ca0c665,0x3ca8c3bd,0x3c99ad37,0x3c889b6a,0x3c8554ea,0x3c730623,0x3c59b65a,0x3cb64a2f,0x3cd6b17c,0x3bab0a16,0x3c8bff79,0x3ca30322,0x3cbaeed7,0x3c9a459b,0x3c994f66,0x3c9794c0,0x3c8db06c,0x3c7a7617,0x3c413a7c,0x3c6987b1,0x3c81aa28,0x3c964b22,0x3ca4385f,0x3cb6b3fe,0x3cc34ac8, +0x3cc31e7d,0x3cc48f78,0x3cc18dbd,0x3cbcd78e,0x3d05a5fc,0xbc04c111,0xbc2c5ec2,0xbc15175b,0xbc4b587b,0xbc37d8da,0xbb928409,0xbbdbafae,0xbb7e1070,0x3ac132ae,0xb92c98b5,0xba5ae989,0xba8807cb,0x39a00f73,0x3ab39e9e,0x3b1b98e4,0xbaa9669e,0xbb5acca5,0xbaeaade7,0xbb8acffa,0xbbca1f33, +0xbc0670ae,0xbbdedcf6,0xbbf42cc0,0xbc0f7566,0xbc0d4fd0,0xbc140bd5,0xbc0aa2db,0xbc27e834,0xbc3347d1,0xbc4c27f4,0xbc3fafe0,0xbc3c3ff8,0xbc2ff4d7,0xbc47e9e6,0xbc4fe0bb,0xbc425e94,0xbc384b21,0xbc3e1d59,0xbcd738f9,0xbd1568b5,0xbcae3fbd,0xbc8110f4,0xbbfa86ac,0xbb657ea6,0x3ae488ee, +0xbababe5f,0xba48a9d3,0x3991a7b1,0x3a3b3d0e,0x3b15c6fa,0x3b6d0472,0x3bb9dfb3,0x3b3ed66b,0xbbc7b9f2,0xbba98251,0xbb83ab82,0xbc07a1c9,0xbb927838,0xbb8bd4d9,0xbc036197,0xbbb687a8,0xbba260cb,0xbb71118d,0xbc0b5277,0xbc56a0a4,0xbc93cbe7,0xbc853cc9,0xbc823674,0xbc46be17,0xbc4db750, +0xbbcc5f56,0xbb8a998c,0xbbe3dbe1,0xbcd47ed1,0xbd41e003,0xbd83a317,0xbd36adac,0xbcdec703,0xbc1978d8,0x3b6b76a5,0x3c28651a,0x3c013e7b,0x3c0acdc7,0x3c0aab97,0x3c3d4d23,0x3c7cabc2,0x3c65297e,0x3c9a0318,0x3c5fe856,0xbbbad980,0xbabd7b34,0xbbb9395a,0xbc0cce09,0xbb8d1952,0xbc0b75f2, +0xbc79e804,0xbc884b99,0xbc9905b0,0xbc894dc8,0xbce5425c,0xbd10c02b,0xbd300e17,0xbd31ad7d,0xbd1ed774,0xbceb6c7e,0xbd05787e,0xbce3b221,0xbd0dc349,0xbd16dee7,0xbcdd66c3,0xbdde2ac0,0xbe0c828d,0xbda9a7aa,0xbd4e055e,0xbcccab13,0xbb1a278e,0x3c1a9df9,0x3c7a9432,0x3ca747db,0x3c82c59f, +0x3c853e35,0x3cca34cb,0x3d0bca51,0x3cf1b48b,0x3c8ccccf,0xbbce8c15,0xbaefb0d3,0xba24c93d,0xbc1ad9e2,0x3a0ced64,0x3b6eef77,0xbc21599b,0xbc041137,0xbc1744ea,0xbb65381b,0xbca0d3f3,0xbd0c579c,0xbd4bd86f,0xbd3518fe,0xbd1ebc8d,0xbc8f97f0,0xbc410e4e,0x3c750dbc,0x3b0ee81a,0xbcd3076f, +0x3dcea108,0x3d2a6987,0xbc9ce86b,0xbd47867b,0xbd0c690a,0xbcf16e00,0xbb569def,0x3c2d6570,0x3c3e5cc4,0x3c88d9af,0x3cc90fa3,0x3cad4ce5,0x3cbe9845,0x3d0b5c95,0x3c7fba73,0x3c38aa0a,0x3c45e73e,0xbb86fb0f,0xbb1156f1,0xbbea03b9,0xbd05a771,0xbd37e9b8,0xbdacb0e3,0xbd470178,0xbd6764e5, +0xbdce9ccb,0xbe0699dc,0xbe264466,0xbe3d7fb9,0xbe284fd2,0xbe12fb5e,0xbdf7b481,0xbe3d68c4,0xbe3230c6,0xbdf94ce8,0x3c8c8dd8,0x3e212077,0x3e045a7c,0x3ddf10a8,0x3db7a289,0x3dc36d68,0x3d49d36a,0x3d1db695,0x3d311aa3,0x3cf8ef7f,0x3d02791e,0x3c8df406,0x3c17adb8,0x3c82209c,0x3d25c99d, +0x3c78c014,0x3bee03c2,0xbc0d9043,0xbc82f0d0,0xbc25549b,0xbc458d66,0xbca0b8f5,0x3c0bbdbd,0x3d034d1e,0x3d5ce61f,0x3d711dd0,0x3d72445d,0x3d7bfa87,0x3d82f6f4,0x3d763edf,0x3c2ec7ab,0xbd041fdf,0xbcb36fbf,0xbdcac50e,0xbd652a37,0x3d99c71d,0x3df7926b,0x3d320257,0x3d1531fa,0x3d3639ee, +0x3cabd24f,0x3c05005c,0x3d1612b4,0x3d143b37,0x3d971815,0x3cb98e69,0x3b617570,0x3c33c60f,0x3b7c6781,0x3ccb8334,0x3d879805,0x3cc08458,0x3c514916,0x3c967440,0x3c80d7f6,0x3bf22534,0xbb83f663,0xbb12b23b,0xbc654f21,0xbcdfcb6b,0xbbfc940e,0xbc52c90d,0xbd34db70,0xbd7f1475,0xbd8735b3, +0xbd5154f4,0x3bc39421,0x3d07439d,0x3d879c44,0x3cc8e576,0x3d137143,0x3d35e811,0x3d579b41,0x3c840a97,0x3c1442c4,0x3cf41a8c,0x3ca60e63,0x3c9e2cc6,0x3cf9f625,0x3cc6a17d,0x3d07621e,0x3c7c77b8,0x3c015fbb,0x3cb2e540,0xbb71173d,0x3be702d5,0x3d348167,0x3d16331c,0x3d2ba4c7,0x3d10943a, +0x3cc90e1b,0x3cf85d16,0x3cb33131,0x3c4c37eb,0x3c53dc41,0x3bcfd9f2,0xbbabffa8,0xbc7aae46,0xbc8e7cea,0x3bb1111a,0x3cbe5675,0x3cfd6778,0x3d1e6277,0x3cee054d,0x3cbfcb88,0xbc6c4c50,0xbb4eb579,0x3d48c0a7,0x3d20ee09,0xb952fc4d,0x3c1ad312,0x3b5dd361,0x3bb37ddf,0x3bec897b,0x3c620b3e, +0x3ca2d6dc,0x3cf00c15,0x3c9d9234,0x3c5177f4,0x3c03a6c6,0x3c948071,0x3cc5d07a,0x3cac6bf4,0x3c8d51b6,0x3c4bf4d4,0xba066661,0x3bade328,0x3c88bbe9,0x3a548e01,0x3c1a7948,0x3c1fa0c0,0xbcf480bc,0xbc4c82cb,0xbbffe267,0xbc85f539,0xbbb09c6d,0x3c0d8d00,0x3cb6f816,0x3be0562d,0x3887f504, +0x3c0dc795,0xbb31b578,0x3b624ead,0x3d156ac2,0xbb6d071e,0x3cba5515,0x3be94c95,0x3cb1723b,0x3cc3eb4e,0x3c8d7d0a,0x3c68cd0b,0x3c203671,0x3c9a1710,0x3b511200,0x3b6265d8,0x3c37ffe2,0x3c1ce480,0x3bec40f0,0x3c1b90df,0x3c857819,0x3c77253c,0x3c05ebe2,0x3be94900,0x3c3743ba,0x3bbbb0ad, +0x3bd5c690,0x3bde12d1,0xba1ada31,0xbc71e8bd,0xbbcfbfe8,0x3cad62d4,0x3c8789d5,0x3c19877a,0xbb72879c,0x3b63aedb,0x3bd5e8f6,0x3c859553,0xbcb88792,0xbcf0fc4f,0xbc5b7b87,0x3c80a1c1,0x3c5f793c,0x3cd21785,0x3c7d7ee9,0x3cc1337f,0x3cf04fe0,0x3d01c6b9,0x3d0a7a99,0x3d1124c8,0x3ce94215, +0x3c9aab18,0x3c2cce9d,0x3bd15033,0x3c542dc4,0x3c1c1d37,0x3c0657d9,0x3b36a6b7,0x3b3dfb66,0x3b254f1f,0xbb1c023a,0x3b65bb4b,0x3b7b494e,0xbab78e35,0xbb33e76e,0xbc085e4e,0xbc4b2063,0xbc83495b,0xbbeaeb43,0x3bb4e3b0,0x3c801149,0x3c57d0e8,0x3c091bfa,0x3c3954fc,0xb87010dd,0xbc0dd548, +0xbcbc1db0,0xbbf4835c,0xbbb89ec0,0xbc5b65d4,0xbc06c818,0xbc5eb5a9,0xbc696f70,0xbc737c6b,0xbc950542,0xbca02c78,0xbc90b161,0xbc6bcf89,0xbc14e92b,0xbc18a1d7,0xbc05d103,0xbbcb29bc,0xb994fbd9,0x3a63e6bc,0x398de79d,0x3b6ddd73,0x3c659304,0x3b8ed651,0x3afe6403,0x3b1f144b,0x3b04fd03, +0x3a946d5e,0xba25e09c,0xbbad375e,0xbb058432,0xbae0673b,0x3ac1f7af,0x3becd1e1,0x3c73b6f8,0x3caf5401,0x3c8fe730,0x3c711164,0x3c2cdc99,0x3b5ca89c,0x3ba50a1a,0x39a50d7b,0x3b8f31b8,0x3be216d5,0x3c93d2bf,0xba7ff96a,0x3b9b3f2f,0x3c5a984a,0x3c7b8345,0x3c85f894,0x3c8e208d,0x3c9f52bd, +0x3cadaa1c,0x3cb8f485,0x3c144b7a,0x3b5fe724,0x3cc67bac,0x3c3a512a,0x3bed134f,0x3b2b4500,0x3ba5a1f7,0x3b9cc47d,0x3b9c6d9b,0x3ba94c24,0x3bd4521c,0x3c010e6b,0x3c21d326,0x3c3f9878,0x3c53732d,0x3c5ee57d,0x3c5b7291,0x3c7674f2,0x3c40023a,0x3c20e1e9,0x3c09d409,0x3bcfc4c4,0x3c037c66, +0xbc500408,0xbc2e3d37,0xbc031a67,0xbbd3dd2d,0xbbfd77cf,0xbbfa4819,0xbbc245b3,0xbbc27e15,0xbb7814ee,0xbb98de89,0xbb8a56f1,0xbb7d43ef,0xbb6fac40,0xbb695459,0xbb828e63,0xbba3e801,0xbbc996bb,0xbbab2ba0,0xbbea5ff1,0xbc0b775c,0xbc228207,0xbc2d387d,0xbc30f006,0xbc27f58a,0xbc3f690e, +0xbc479275,0xbc3cb8f6,0xbc514873,0xbc6742d5,0xbc93b477,0xbc6e3be0,0xbc8334d3,0xbcc28a06,0xbca122c2,0xbc918673,0xbc7ba8b0,0xbc4066e0,0xba82a263,0x3bb838ec,0xbc0aaa57,0xbb1994ad,0x3b6a7549,0x3ba7e303,0x3b6a4423,0x3ab77576,0xbb8eafad,0xbbb7f11e,0xba8bd238,0xbb209955,0xbaaf4be7, +0xbb11b9b0,0x3ae3f4c1,0xb831bdc6,0xbb9da15f,0xbbfffb9e,0xbc0117ea,0xbbdf702c,0xbc26e86e,0xbc40b625,0xbc3d9ed2,0xbc8596c0,0xbc972aa8,0xbc92bf85,0xbcc29327,0xbcd651c2,0xbd0b14e1,0xbcc26f62,0xbcf3637b,0xbd57b549,0xbd3f069c,0xbd2a523b,0xbcd4b76f,0xbc1261a8,0x3ca775be,0x3ca174ce, +0x3bbdf8ea,0x3c14fc3f,0x3c1d1004,0x3c0dfbee,0x3c3a4ef3,0x3c583be7,0x3bb0e05b,0x3b45b748,0x3c3cc044,0x3c02fd04,0x3c3bee80,0x3bed7e54,0x3c6c1c6e,0x3c479352,0x3b9d33c5,0xbb1338cf,0xbbb28310,0x3887c3db,0xbbd13425,0xbbdc5e68,0xbae2c34c,0xbc2d78d6,0xbc556769,0xbc032079,0xbc804ccc, +0xbca935ee,0xbd29af34,0xbcad2ac9,0xbd135259,0xbdaf5c83,0xbd891f6f,0xbd6d3919,0xbc5289bc,0x3c1b61be,0x3da9e698,0x3d90e684,0x3d0fbb08,0x3d030c13,0x3d489dca,0x3cfc7773,0x3d13e751,0x3cd8068d,0x3c4146c1,0x3c4ffc65,0x3cb1e3b4,0x3c904f10,0x3cc16744,0x3ce911c4,0x3ced6044,0x3cc9d99b, +0x3b210046,0xba7109a7,0xbbcfcc46,0x3b88c590,0xbb603b1f,0xbc1ae3b5,0xbabde02e,0xbc922c96,0xbcbbfcb5,0xbc813257,0xbd0ba998,0xbd29ed7c,0xbd80d18f,0xbd0ca5d1,0xbd82de3f,0xbe153ebe,0xbe046b99,0xbdd64d78,0xbc8ae2a9,0x3d65f9f0,0xbda1896e,0xbc6ec11f,0x3cbeeafa,0x3c39d30e,0x3a9a8aa0, +0x3b279e61,0x3b38aac7,0x3c260100,0x3d187e6b,0x3d15d5c4,0x3c880337,0x3cdc79f8,0x3cee3d43,0x3cc9530d,0x3ca853f7,0x3c9cfe22,0x3bafdbe5,0xbb70480c,0xbc743120,0xbc0803d8,0x3cba5f5f,0x3cf13404,0x3cfa1049,0x3ca401df,0x3c46bf67,0x3caf90cb,0xb9a3460a,0xbc0beb25,0xbd09add1,0xbc9ab510, +0xbcd20e51,0xbca6ac4d,0xbcae302e,0xbd4d3089,0xbd710299,0xbd9e6fb3,0x3cc60e7f,0x3d88ce1c,0x3dc86b7f,0x3da7e1b5,0x3d8417da,0x3d267a27,0x3ced5d07,0x3d839f3d,0x3cc950e7,0x3c759abb,0x3b826751,0x3c251948,0x3ca24bf0,0x3ccd65eb,0x3c6c89f1,0x3be0e463,0xbc5c28e7,0xbca23f4f,0xbcf2c7f1, +0xbd1256f1,0xbc8a4a0c,0xbc94bbfd,0xbd300641,0xbcd8c839,0xbcdc978d,0xbd36e874,0xbd95fbfa,0xbdd22e15,0xbe075ce0,0xbd994c34,0xbd8818f8,0xbdb7c07f,0xbdc32864,0xbca67d37,0x3dfdf839,0x3d5ec3c1,0xbd10945f,0xbd32417d,0xbd2b4309,0xbd13a18a,0xbbdcfe1c,0x3d125edc,0x3d75c0bc,0x3d839966, +0x3c810d1d,0xbb84bbe9,0x3c82e45b,0x3ae91e44,0x3c7c0661,0x3cd7c7b3,0x3d180da3,0x3cf75e28,0xbbe52310,0x3b499916,0x3b118901,0xbc4770d1,0xbd5994f6,0xbd86f137,0xbd897fbc,0xbdd904c4,0xbdf328da,0xbdcd6ed8,0xbd9e2a52,0xbd15da09,0xb9395d3e,0x3d452de6,0x3db2353e,0x3dace937,0x3d99e95b, +0x3cb534e8,0x3d07a44a,0xbbfe43c2,0xb9f4a0a4,0x3aaacca3,0xbbd46483,0x3c165388,0x3ca0a96f,0x3c983c79,0x3c4cf5fd,0x3c3aba92,0x3c9a0ff0,0x3c8a78ab,0x3ccd07c0,0x3c7d5551,0x3c9619b3,0x3c8b751a,0x3cd1ad97,0x3cf6b34b,0x3b31de6f,0xbb662948,0xbbbf275e,0xbc6d9d07,0xbca89e64,0xbc5171bc, +0x3af04733,0x3ca3716e,0x3d15913e,0x3d823048,0x3da4c380,0x3de84a25,0x3e13c4d0,0x3e0b0f16,0x3dc62e0d,0x3d4507f5,0x3c7ff811,0xbc134c09,0xbcacef23,0xbc774eae,0x3bbf90ed,0x3bdbc318,0x3beb3e1e,0x3b21c3f5,0x3bb8a8f0,0x3c6e4c0f,0x3cc11873,0x3cfe3cb4,0x3c91dc36,0x3c087bf4,0x3c2d13ad, +0x3c1b863b,0x3c3653a7,0x3c90f104,0x3b88e3d9,0xbb436610,0xbbdd21b4,0xbc6501ce,0xbc77be1f,0xbcabc416,0xbbd5ce5d,0xba413d90,0x3c71864c,0x3cce3281,0x3d1cddd5,0x3d86fff0,0x3d9a1f0c,0x3d847a97,0x3d29137b,0x3cc429a9,0x3c3b4601,0x3c8ae6e2,0xbcd018fd,0xbd13be9c,0xbca8d6f3,0x39963f4c, +0xbc86f4d3,0xbba93ffd,0x3aa2867c,0x3a667694,0xbb1fd1c4,0x3b2307ee,0x3b37525b,0x3bb39a57,0x3bb06266,0x3bdea346,0x3c122296,0x3c458b1b,0x3c8e0fcc,0x3cebd6ec,0x3c58b33c,0x3bc3f50a,0x3c114857,0x3c09c773,0x3b273145,0xbb911c4c,0x3b6f4bf9,0x3c64da41,0x3cce417f,0x3d302041,0x3d3d7cb2, +0x3ce1b5c6,0x3ca63238,0x3cbe1562,0x3d02469d,0x3d5f863f,0x3d4db92d,0x3ce66132,0x3bbe90d5,0xbb3773d3,0xbabcf0c0,0xbc4b58fd,0x3c12344a,0x3c6bbea6,0x3ca5a12d,0x3c4a1a3a,0x3c43ad50,0x3c678674,0x3c563af3,0x3c88afa7,0x3c7dcde1,0x3c8e18ee,0x3c5d7d49,0x3c7469ae,0x3ad9547f,0xbaa2eb50, +0x3b3b66c1,0x3c3e3bf2,0x3c80f51f,0x3c90e861,0x3c9c677f,0x3cdc76f9,0x3cb86bc3,0x3c3c2ba5,0x3a568b11,0x3adf0856,0x3bbf7fb3,0x3c4a81d3,0x3c482504,0x3c227325,0x3bde8493,0x3c155d7c,0x3c78aa05,0x3ccae3b8,0x3cb60839,0x3c8377ec,0x3bc67d5f,0x3c29b25a,0x3c2618b4,0x3bad30e0,0xbb215a11, +0xba5277da,0xbb77e66d,0xbbf38200,0xbc062d14,0xbc311c37,0xbbce65fa,0xbb290bbc,0xbb03b27d,0x3b8926c9,0x3c161b67,0x3c423e91,0x3bc7a172,0x3be6e753,0x3bc85005,0x3ba08257,0xbbd0dde0,0x3c407283,0x3c53d5d6,0x3c5df282,0x3c80e03f,0x3c893aef,0x3c7e0326,0x3c699572,0x3ca79f56,0x3ce01fb4, +0x3d0a3816,0x3d159f1e,0x3d13da50,0x3d1263e8,0x3ce780d0,0x3cc9eea2,0x3ca11df2,0x3c811a62,0x3c5a395a,0x3c531e95,0x3c455f7f,0x3c1fb857,0x3b25d96c,0x3c5bf6d9,0x3c2190a8,0x3b287cc3,0x3b3041c8,0x3b1b221a,0x3b4b81d8,0x3af9fdb0,0x3aaddb53,0x3b2d6080,0x3c50f238,0x3c8c7807,0x3b0d1853, +0x3c5302be,0x3c88a4e8,0x3cb2443c,0x3c9caf9f,0x3ca54026,0x3ca4f8d9,0x3ca1fab6,0x3ca61925,0x3ca4a573,0x3ca44b08,0x3c97e00a,0x3c8c65bf,0x3c8ac20c,0x3c90229e,0x3c9cda30,0x3c9343b9,0x3c8b1728,0x3c846fe9,0x3c6de693,0x3c89cf45,0xbc6ae23b,0xbc7c4e7d,0xbc921942,0xbc89279b,0xbc4f32e8, +0xbbe7ef15,0xbc5219b2,0xbc323b1e,0xbc0993f9,0xbc30e3d8,0xbc352723,0xbc22797d,0xbc21287a,0xbc24a795,0xbc2a8324,0xbc3b6298,0xbc3eda55,0xbc24ef3b,0xbc56b667,0xbc5f0ca2,0xbc37e9a7,0xbc417a31,0xbc43ca5c,0xbc4e2816,0xbc48c921,0xbc4aa6bc,0xbc3fe0f3,0xbc6b84fd,0xbc75087d,0xbc76feb1, +0xbc566e77,0xbc68f751,0xbcac75ea,0xbc8afc60,0xbc8fd89e,0xbcaa82ea,0xbc8e7658,0xbcc8683f,0xbcb976a9,0xbb2bbb8f,0xbc2ae5db,0xbacd9cc2,0xbb92f72e,0xbb7aa3ba,0xbaf546b3,0xbc038102,0xbc1b5fcc,0xbc073761,0xbbbbf73f,0xbb69ba75,0xbbabdaf7,0xbb32b830,0xbb91332b,0xbbeea710,0xbc1575d5, +0xbc33c5a8,0xbc1bedb4,0xbc402544,0xbc5a2fbd,0xbc703138,0xbc607639,0xbc56f3c4,0xbc31bd10,0xbc846acf,0xbc92ab14,0xbc9ad01d,0xbc730232,0xbc93b125,0xbd05eb43,0xbcb032e7,0xbcbe62a9,0xbd057adc,0xbcdd6334,0xbd1fb716,0xbce9f1ed,0xbc063afa,0xbc3e367c,0x3c330578,0x3bfc6aa1,0x3ba9bf10, +0x3bead00d,0xbacc04f5,0xbaf20ec2,0x3b45f163,0x3bc33400,0x3c04643a,0x3b414bad,0x3bd01773,0x3b9f40a1,0xba223c75,0xbb90b526,0xbbde9ef3,0xbb3f6f07,0xbbb15230,0xbbc1664c,0xbc2fe3fd,0xbbf88fd7,0xbc1fbed4,0xbc14761c,0xbcaefa18,0xbcc958e4,0xbcc72482,0xbc862be7,0xbcaa8b2f,0xbd43c831, +0xbceb8640,0xbd105d5f,0xbd79dc49,0xbd22a0d1,0xbd8cfcf8,0xbce5f39a,0x3ca98875,0x3ca209dd,0x3d0a3954,0x3d13afbf,0x3cfc6106,0x3cd1ae91,0x3c26dd6b,0x3bdf055b,0x3c690b87,0x3c92b89a,0x3cd3baf8,0x3ce59125,0x3cd91aa7,0x3ca3509b,0x3c407981,0x3bc961c5,0x3ade77ae,0x3c101a58,0xbae54236, +0xbc07eb6b,0xbc80693c,0xbc31f07c,0xbbf8b00d,0xbbd4297c,0xbc971b06,0xbcdd2639,0xbcec6065,0xbca2496d,0xbce72d54,0xbd6db357,0xbcccb9b6,0xbd1c8293,0xbdad2250,0xbd877197,0xbdba1707,0xbd913288,0xbdd8db51,0xbdad3248,0xbcf97e3d,0xbc19d83e,0xbc1d7c15,0xbcb92530,0x3c935cf7,0x3d0e8032, +0x3c9c3a89,0x3cf957b2,0x3ce752ea,0x3c0465b5,0x3caa54d3,0x3cc43fb5,0x3c0df93a,0x3bd14aa7,0x3bff5196,0x3c8e40a3,0x3c2cfc1d,0x3c8bcf03,0x3d0fb2be,0x3c91982a,0x3b78034c,0x3b34694b,0x3bbffff3,0x3bcd98b6,0x3ba3583f,0xbc08a41e,0xbcc9812c,0xbd91d93a,0xbd8c4f02,0xbd79b35f,0xbcb36bdc, +0xbd77e9d3,0x3d73c301,0x3d859c5e,0x3d2e915e,0x3d321b2e,0x3cbcae9d,0x3c82127a,0x3cad1af8,0x3d50c892,0x3cb341d1,0x3c33207c,0x3b9facc4,0x3a42bad6,0x3c505285,0x3ce0bccb,0x3d02f62d,0x3ce5de82,0x3bda5a75,0x3bb96737,0xbc0fe54e,0xbc28e017,0xbbde5add,0xbcf44e7e,0xbd78d1fa,0xbd76e9c1, +0xbd4d917a,0xbc834d1b,0xbc66f886,0x3c3346e6,0x3d12cd94,0x3c7de81d,0xbd1cf564,0xbe0ea8b9,0xbda8ede4,0xbdb2f1f5,0xbd9a2841,0xbc03d061,0x3c9a7095,0x3c54a3bd,0xbc7e5307,0xbb6310d6,0xb99484a0,0x3d539a66,0x3d3de83b,0x3d174197,0x3bc2fa2b,0xbc6ba367,0x39b0b527,0xbb6a59dc,0x3b6b42f4, +0xbca460ce,0x3cf26e83,0x3d069088,0xbca5f324,0xbcb22fc7,0xbd00bf91,0xbd035953,0xbd15f202,0xbcd73eb3,0xbc21cc22,0xbb9f798f,0xbbbab4b6,0x3a5b9bf6,0x3c4cc532,0x3cc7134e,0x3d08eee4,0x3d2ed7bc,0x3d3d968c,0x3d640ac6,0x3dc0b566,0x3e03c333,0x3e372310,0x3d780f74,0x3a8e0a5e,0x3c52590c, +0x3caf8d36,0x3c9dab98,0x3b4fee5e,0x3c0efcc2,0x3c060915,0x3c26a96c,0x3d091659,0x3d0b33cf,0x3ccf701a,0x3c973afb,0x3cb363eb,0xba6c3790,0x3cefb2a8,0x3cce98ec,0xbc881f85,0xbc3ff62c,0xbca4a0b4,0xbc3d0a82,0xbbb2bb61,0xbbd3d42a,0xbc21e6d1,0xbcaefcf8,0xbc23cf70,0x3cc88bb7,0x3d1ce8b5, +0x3d3a9ee8,0x3d228d7f,0x3db0ed64,0x3db11c0e,0x3d5f9f4d,0x3be4ea6a,0xbbf3d669,0x3d1a50b3,0x3a784b50,0x3d0554c9,0x3c01a314,0x3b1fe334,0x3be83931,0x3c80972b,0x3cf55e62,0x3cf70e55,0x3c866ee5,0x3c3e9f02,0x3bc5a334,0x3c216727,0x3abe9b4c,0x3a626d89,0x3c17d8a3,0x3b88955d,0x3b902149, +0x3c01abe8,0x3bea4c59,0xbb25eaa7,0xbb4701a9,0xbc855f4d,0xbc45429f,0x3c8c825a,0x3cb5b4e5,0x3cd31985,0x3d2ac3cb,0x3c848294,0x3c6c4c18,0x3b6a6989,0x3d085f66,0x3d126541,0x3cbf6cd4,0x3bb76096,0x3a99d8d7,0x3ceaae44,0x3d14ee8f,0x3cdc389e,0x3cc954b8,0x3c42e59b,0x3c2e634d,0xba5f78a1, +0x3a75ac7c,0x3b4a3d72,0x3ba8be7a,0x3bd5517c,0x3b8f306f,0xbb3d3cd4,0x3c284b92,0x3c86df3e,0x3c74ad8b,0x3bccdc4f,0x3b825cfe,0x3b0067ab,0x3b1a9cdb,0x3b96b274,0x3b81785c,0x3ba28a8c,0xba3af6c6,0xbc745cef,0xbbf3633c,0xbbd2b3fe,0xbc04662a,0xbc30d216,0xbc448300,0xbc4dbe3a,0xba244653, +0xbb692b57,0xbc9122b3,0xbce400fb,0xbcc05461,0x3b8f2b4c,0x3c553121,0xba903499,0x3b418636,0x39f6c35c,0x3c0b77ed,0x3c3e87bc,0x3c1c5cdb,0x3c007593,0x3bb59e9b,0x3c39cad6,0x3c7d44b9,0x3cc9d238,0x3c663cfc,0x3c54cbbb,0x3ba45bc8,0x3c1074c5,0x3c02d6f0,0x3c28e427,0x3c5ba760,0x3c9a955a, +0x3c689d21,0x3bcd511f,0x3c3a9f0b,0x3c427aa5,0x3b14788e,0xbc3b988f,0xbcd194e6,0xbc31d87d,0x3ab523ad,0x3c5b57f6,0x3a4b67d5,0xbc238ad3,0xbcafd81b,0xbc616d66,0xbc25395a,0xbbd05ab5,0xbbe1ad6c,0xbb833fe2,0xbb9f60dc,0x3b722db5,0xbb7d332c,0xbb3a9065,0x3a948680,0x3b48b28f,0xb9df5088, +0x3b1fba9d,0xba8cc3a2,0x3b0808eb,0xb9657bc0,0x399abec9,0x3ad0cf1b,0x3c3bba40,0x3c58a82c,0x3c60d213,0x3c85b9b2,0x3cfada39,0x3cb14468,0x3cc1a628,0x3cce4fd4,0x3cd8af1c,0x3cf0973a,0x3d122871,0x3d24fd7e,0x3cf9df19,0x3c9a1031,0x3c282b2f,0x3b2bbec6,0xbae8e8cd,0xbc129d07,0xbbee6154, +0xbbee4796,0xbbca909d,0xbb8b55b9,0xbc553b3c,0xbc72a054,0xbb4d727e,0x3b9c0a99,0x3c89d0ef,0xbbb9bf8c,0x3bb09eec,0x3c583ee6,0x3c565cbb,0x3c71d1db,0x3c74a7d4,0x3c8f88df,0x3ca01d97,0x3ca77693,0x3baa5995,0xbbc55212,0x3cc2e6ce,0x3c204af9,0x3b11ed52,0xbc3e52ca,0xbc01ec39,0xbc0191b0, +0xbbf213c1,0xbbdf0a96,0xbbf94fc7,0xbbd015e6,0xbc186a9f,0xbc215a4b,0xbc396bcf,0xbc44d2b7,0xbc5d0ad6,0xbc811f33,0xbc6d7189,0xbc664a0c,0xbc60f647,0xbc61aa8e,0xbcac16c9,0x3aae0ce6,0xbb2ae03b,0xba1d8450,0xbc098a5a,0xbc3b312b,0xbc5cb71c,0xbab336c0,0xbbc6b591,0xbc3996a9,0xbc572315, +0xbc57a302,0xbc4d21d0,0xbc4243c8,0xbc438714,0xbc52f1e8,0xbbb0f50b,0x39436799,0xbc66ba15,0xbbe099dc,0xbb5b6cf6,0x3afb7106,0x3b07eb6b,0x3b187d7e,0xb95f28bf,0x3adbb0b1,0x3b13c052,0x3b701c98,0x3ac6c7db,0x3abe5740,0x3b87b5c3,0x3a651853,0xb8720fb4,0x3a55abc3,0xb9c4f6e1,0xb9caab38, +0xbab82242,0xba96a30d,0x39c0935a,0xbbac108d,0xbcc47d8c,0xbc34c514,0xbb902346,0xbb784b1c,0x39c1313e,0x3b29e33f,0x3b1a8cf1,0x3a4e26f1,0xbadc263f,0x3b72b420,0x3ba40194,0x3b1b2d73,0x3b5d2717,0x3b7a4482,0x3b0fdbcb,0xba01d38b,0xbbbaf38c,0x3a9392e4,0x3bd02892,0x3be69a70,0x398da71b, +0x3b96b46b,0x3b9b541b,0x3be55185,0x3a8250c9,0x3a9cb71b,0x3c1aee23,0x3b2420e4,0x3ab96c90,0x3b95764d,0xbaa50c2e,0xbb008768,0xbb522224,0x390e029a,0xbcc4edcc,0xbd05e327,0xbd2a9d80,0xbcf8d77e,0xbc22b9b9,0xbbc11ffc,0x39b70a5c,0x3bcde5de,0xbab15988,0x3a1a55ce,0x36f889be,0x3c1170e9, +0x3c088833,0x3aab60c1,0x3c07af88,0x3c160009,0x3b47d791,0xba5c9acc,0xb9c00289,0xbae72f33,0x3c0227c4,0x3befb99d,0xbc106405,0x3a5ef5b9,0x3ac7be9f,0x3bfda8f3,0xbb6fd763,0xbb2f9226,0x3c3c4def,0xbbae6f1b,0xbc30d2f0,0x3ac2996f,0xbc068dee,0xbb686f1d,0xbc9bcd9a,0xbcadb07a,0xbc744491, +0xbd347130,0xbd9738cf,0xbd4a7455,0xbc604afe,0xbbc0a8cc,0x3bd450dd,0x3c6b11b7,0x3bfba541,0x3c16494f,0x3c412e47,0x3ca27655,0x3ce01fd0,0x3c9853b5,0x3cd94cec,0x3ca7407f,0x3c2c4809,0x3be257bb,0x3c1c9084,0x3b8afc45,0x3c8eec18,0x3c985d05,0xbc04287a,0x3bac5fd2,0x3bb792ea,0x3c1387a3, +0xbc01485e,0xbc013e0e,0x3c8b24bf,0xbb70b7b9,0xbb731d6c,0x3c85c36e,0xbb4949a0,0xbbf39a30,0xbcc5c429,0xbcc8bdde,0xbd010b52,0xbce425cf,0xbd880ff7,0xbd869b1e,0xbd27ec67,0xbc8bb6fc,0xbbac43bc,0xbc435274,0x3bcf17ed,0x3ca1544d,0x3bde084f,0x3cd2be3f,0x3cb21f97,0xba4bfc63,0x3c6e27f4, +0x3c446ae6,0xbb677d25,0xbbc1cda7,0xbb7f0205,0xbc7803ac,0xbd00403c,0xbcf4ff22,0xbd0e66fd,0xbd14fd72,0xbd24bcde,0xbd205d9b,0xbd147651,0xbca5a1c4,0x3ba7277f,0xbc920181,0xbce99ef5,0xbd4bda68,0xbc968697,0xbaf59c20,0x3bf9f344,0xbd0dc842,0xbb27b037,0x3d2e9b39,0x3d801a51,0x3d12f253, +0x3a955c1c,0x3bb6c0e6,0x3c75e3bd,0x3d10983a,0x3c267a7a,0xbb08b1bb,0x3bc30a94,0xbbb5fa7c,0x3c2f6cbb,0x3cf25ec7,0x3ce98681,0x3cd2ea40,0x3c65ffc7,0x3c3497cd,0x3b0bdfd1,0x3bf236af,0xbb7cba49,0xbb519ec3,0x3c9964a9,0x3be81a47,0xbb8579f9,0xbb4e666d,0xbc1d59a1,0xbcab8345,0xbd2c9f53, +0xbc955a23,0xbcabd75e,0xbd9b389f,0xbd244640,0xbd10bb09,0xbd52e9e4,0xbcafea2f,0x3d89a454,0x3ca181c8,0xbc829832,0x3a42fe84,0x3d210f9d,0x3d8feb45,0x3d5fda13,0x3bf76cd0,0x3b83a255,0xbc163d2d,0x3993e0ff,0xb929c663,0x3b7a1329,0xbd057b7a,0x3cf6c79f,0x3d1a33db,0xbc7cf784,0xbbc395c5, +0xbc81a56b,0xbc8cba82,0xbc13db35,0xbb460e50,0x3a600cf5,0xb984bb7b,0xbb870880,0xbbbd892d,0xbd358226,0xbd5b5614,0xbd226b89,0xbcf17dd4,0xbc9893ea,0xbca92d22,0x3d67428c,0x3de1f1e2,0x3e03020e,0x3dd8110d,0x3c9b9172,0x3c395d3e,0xb8e3c44a,0x3b1d6734,0xb9b2d617,0x3c88f4aa,0x3cbf20e5, +0x3c66e4aa,0x3d0e1588,0x3ce8d3de,0x3c576f4c,0x3c5d2298,0x3c9d1511,0x3b6ae7e7,0x3d09e51b,0x3d055e19,0x3babdf55,0x3baa46e4,0xbba6a10a,0xbc54ee3c,0xbd079bda,0xbd360dbe,0xbd469338,0xbd8c92eb,0xbd9d85df,0xbd9b1b37,0xbd5b6799,0xbcbe8187,0xbbe382af,0x3cf59451,0x3d2ed77f,0x3c4fea53, +0x3bab1e3c,0xbc9a11d3,0xbd0febf5,0xbb55bbee,0xb99706d6,0x3c09c8b7,0x3c921aa1,0x3c9cfeb8,0x3c3eba41,0x3cb1266a,0x3c92d006,0x3b1c61ef,0x3b9da109,0x3abedc8e,0xba5fc4ab,0xbb46b6f2,0x39a28c05,0x3c316c8a,0x3c6717dd,0x3c6111de,0x3c27ebe1,0x3c7324a0,0x3c0a61ef,0x3bd99032,0x3bba45fa, +0x3c019020,0x3c644283,0x3c5b7855,0x3c8ecb00,0x3c701b76,0x3c75b730,0x3c1f19c9,0xbb08ad56,0x3be08314,0xbbed52ad,0xbd3f6596,0x3bc3f5ca,0x3cf7d282,0x3d08e5b4,0x3c112860,0x3cd044f7,0x3c5fcf2b,0x3c0c73b1,0x3ae8efe8,0x3bc7059a,0x3c361f31,0x3c85b3c4,0x3c822c0b,0x3c6f2b92,0x3c4b96db, +0x3c44dc80,0x3bc76a59,0x3ba8713c,0x3a73458a,0x3bb87ac1,0x3bc22ad8,0xb7ec3551,0xbba42491,0xbb5ed0d8,0xbb134c98,0xbb4f3267,0xbc198315,0xbc9cb71f,0xbc8ee0dc,0xbc8ad67c,0xbbf8fb00,0xbc411690,0xbc188d2d,0xbb3b3086,0xbc4dbbce,0xbc971b88,0xbd097c70,0xbc10cb98,0x3afe9bd7,0x3c346d1f, +0x3cde9e71,0x3c84e098,0x3ca2ab6b,0x3c8d286c,0x3c702ac1,0x3c5527cb,0x3c342ff0,0x3c00039d,0x3bbf7920,0x3bcde256,0x3bcc024d,0x3bdfb41e,0x3bc8e3a0,0x3bbb7264,0x3bbbea21,0x3ba5712d,0x3b9fdbfa,0x3bcbbe1f,0xbafc28de,0xbbe2d07f,0xbc9a5ef3,0xbc65011a,0xbbe24873,0xbac5c52f,0xba5659a4, +0xba718a1b,0xba25cb2d,0xbb23bc5f,0xbb89a21c,0xbba3c53e,0xbc54a0e0,0xbc95dc1f,0xbcda43c0,0xbc4f80a2,0xb9ec629a,0x3c383712,0x3c6613ba,0x38c55ad9,0x3bab0662,0xbafbeb17,0x3bed206d,0x3bcfa0c0,0x3bf06980,0x3c18bb31,0x3c496094,0x3bf31765,0x3b848acf,0xb9a2c0cd,0xbb4827fd,0xbb9a5a18, +0xbc0e06c2,0xbc0038e7,0xbbec243c,0xbb8103fe,0xb9ce219e,0x3b358bde,0x3b136545,0x3ae547f6,0xba2db664,0xbae84440,0xbb985975,0xbbd64ef2,0xbc092a65,0xbc219a58,0xbc4264fb,0xbc61cc40,0xbc7fb638,0xbc8bb144,0xbca7f3ef,0xbc8195b4,0xbc5b5f27,0xbc0f7613,0xbbb3634d,0xbbd6c0d0,0xbb528da1, +0xbc4a32aa,0xbc8566cf,0xbc9c0d8b,0xbc02e57c,0xbc667d9d,0xbc672bb2,0xbc81e366,0xbc8a5126,0xbc934015,0xbca11aae,0xbcafee51,0xbcc31555,0xbc9ef9d4,0xbc504ee6,0xbca4d475,0xbc97c037,0xbc768db0,0xbbac191e,0xbbd3a745,0xbbe733ab,0xbbf00f69,0xbbe22e09,0xbbd7a062,0xbbd0f9e6,0xbc00aaef, +0xbc1360c6,0xbc246122,0xbc31da09,0xbc3bfd10,0xbc5074c2,0xbc2f5aa9,0xbc1c923d,0xbc0e3523,0xbbe6b4d5,0xbc2cb6df,0xb9d592d3,0x3b433f07,0x3a2007c3,0x3ade13a4,0x3ac11073,0x3b6ddf09,0x3a2d03fb,0x3b7a2cb9,0x3be107aa,0x3bb1f7b6,0x3baab4b7,0x3b8e5953,0x3bc51d5c,0x3bcbfc49,0x3b971dec, +0x3bac6266,0x3b6b28a9,0x3bd458c2,0x3b8f7309,0x3ae2f7d5,0xbb69ec07,0xbab1b4b9,0xbac5fc47,0xbb090282,0xbaca912e,0xbabb21b3,0xbb0b6868,0xb9f721c0,0xba136e58,0x39edf753,0xbb49d8e6,0xbb531520,0xba1ec9ff,0xba1d3337,0x3a6a134e,0x3b3342d2,0x3b8498ea,0x3c1ffdeb,0x3bf04815,0xbb4307a5, +0xbaf9424b,0x3b1ac9e7,0x3b291039,0x3b4ab1f1,0x3bd9dc3b,0x3af13972,0x3ab11b8d,0x3b2196ff,0x3b776cfa,0x3b7f209e,0x3a97729f,0x3be3df96,0x3be67fd8,0x3bc3bf30,0x3ae2a867,0x3b362af5,0xbba96f0b,0xbb34865e,0xbb384bc0,0xbbb9607d,0xbb980d4f,0xbb9163e8,0xbbad69ad,0x3a599baf,0x3b21a3ea, +0x3b710cfa,0xbc12a646,0xbc3a8989,0xbb778cc3,0xbb96b256,0xbaafa4e2,0x3b50729e,0x3c192edb,0x3cefd5a6,0x3c475d82,0xbbc7747f,0xbbb01861,0xbaeefcd6,0xbb33699d,0x3ad403c8,0x3c584605,0x3b75f90e,0x3abb9e1e,0x3b619b3f,0x3ba51d49,0x3c106be8,0xba82572a,0x3c303f7a,0x3c35e671,0x3c229882, +0x3a0bc790,0xbb4978ca,0xbc3b5016,0xbbf06c45,0xbbd25bb6,0xbc0f5f27,0xbbc71c00,0xbb7ae494,0xbb890bd2,0x3ba83c29,0x3b35d8bf,0x3bf65608,0xbc6b73ac,0xbc81a9d6,0x3b9c7c79,0x3b19c2db,0x3c395b22,0x3ca8c73f,0x3ce74771,0x3d6a335d,0x3d24c2ad,0x3bc68108,0x3a8fc384,0x3c6fc447,0x3b3f0897, +0x3c24bcf1,0x3cc2d4bc,0x3bf07452,0x3bd4d3af,0x3c16a02e,0x3c9f555a,0x3cac2b87,0x3b3e8a9c,0x3ca02afa,0x3caa3c4a,0x3c3e712d,0x3af39a6d,0xbb15b442,0xbc88cb07,0xbc107a46,0xbbe46c8e,0xbc5bfbb0,0xbc13effe,0xbc113902,0xbbb8917d,0x3c282372,0x3c8006f1,0x3cb817f3,0xbcb5551f,0xbcd3bb15, +0x3b858c0d,0xbb0d2828,0x3b664af6,0x3ce1734c,0x3d47a86c,0xbd836363,0xbd10f8d1,0xbc44507a,0xbc4e5843,0xbc83af92,0xbb733f4e,0xbb8cfeda,0xbb885274,0x3c579298,0x3cae0a93,0x3c066dc7,0x3c9f20d1,0x3c9549b0,0x3c3105b2,0x3c4887da,0x3b57e2e2,0xbbee4c90,0xbc8f0f3f,0xbccaa513,0xbce39932, +0xbc8069cf,0xbc841b2a,0xbcc3e18b,0xbc406471,0xba451ce7,0x3bfc81f4,0xbbe05cb1,0xbcbc8da6,0xbd080edc,0xbd336dc1,0xbd35104d,0xbd603ab2,0x3b91c555,0x3cab399e,0xbc9df437,0xbd34f00a,0xbd30b5da,0xbb8f2402,0xbbaf371d,0xbc09d321,0xbcbf84ea,0x3b5c4da3,0x3ca14d1d,0x3d0a916a,0x3c56e4ec, +0xbb836dbb,0x3b83f3e1,0x3ae96189,0x3c42c33a,0x3c378320,0x3ca2c232,0x3c8e3ce6,0x3b645569,0xbabd001b,0xbb1c7364,0x3aa65027,0xbb9cd3fd,0xb905c5c9,0x3c2cd821,0xbd04c419,0xbd3dfadc,0xbd08401b,0xbd053739,0xbcff4f2f,0xbcc3c85f,0xbdc0bf31,0xbdc9640a,0xbda0901d,0xbd8683f7,0xbd9e9498, +0xbdcbe3f9,0xbd77c720,0x3db36ce5,0x3d9b70c4,0x3d35e92d,0x3d4ee2dc,0x3d7ea76c,0x3d928166,0x3d3b1539,0xbc390ce4,0x3bcca501,0x3b1ca020,0x3bfe64eb,0x3b8dc673,0x3c0b8e46,0xbc80bf52,0x3d007361,0x3d1d3bf8,0x3bcf52ff,0xb971b5d2,0xbc39d4dd,0xbc3aa7b4,0xbc8eac45,0xbc8b91b5,0xbbe426f1, +0xbc379167,0xbc4b62ee,0xbc5ab15b,0xbca08fe4,0xbccd91fb,0xbd034af2,0xbd1ccb32,0xbd23aeef,0xbd87e8c8,0x3d14c8c9,0x3da5a8a0,0x3d86ddd9,0x3db77f24,0x3bad7a4e,0x3b8e6a86,0x3c4c5466,0x3c2926c2,0x3bc4335f,0x3ca231c4,0x3ced8e1a,0x3cccf5e9,0x3ce4cb77,0x3c8ad081,0xb93e2fe7,0x3c7a2ec7, +0x3c8972b9,0xbbfc8da6,0x3cb55cbb,0x3cd2863e,0x3bcf2dab,0x3bf9a2fe,0xbb84fbac,0xbc8adbb8,0xbcedafaf,0xbd11eaf9,0xbd275ee1,0xbd5c3cb5,0xbd8991a1,0xbda59906,0xbda6d08c,0xbd61ca50,0xbb4ea3de,0x3cb06fea,0x3d103675,0x3c3f5074,0x3d6b769d,0x3d735966,0x3d0cb4f8,0x3c88ec51,0x3cb1dfa6, +0x3ca893ae,0x3c23ff70,0x3c5500fc,0x3ca25edf,0x3cc30f97,0x3c9a3347,0x3bf3a59a,0x3be358ae,0x3bf53d8d,0x3a3e5dd0,0x3b6b337d,0x3c18bb86,0x3c894811,0x3cc9f1b1,0x3cba5b83,0x3c2829b4,0x3c6d000f,0x3c818352,0x3ca38548,0x3cb8f304,0x3c8f6360,0x3c557538,0x3bbf8284,0x3c9ff247,0x3d11b380, +0x3d72ec1e,0x3d89a8f1,0x3d974b48,0x3cddf89f,0x3a19c7d6,0xbce81428,0x3b5b5f4d,0x3ca3acc6,0x3cefeb31,0x3cd4d50a,0x3c6048e3,0x3bf0903f,0x3c0fce97,0x3c4c8791,0x3c35d63f,0x3c8ea3bc,0x3cb0f423,0x3cbd565a,0x3cafaa27,0x3c8f19e3,0x3c8d579c,0x3c5a9175,0x3c3c79ee,0x3c56db10,0x3c5a3a26, +0x3c2ae299,0x3b573335,0xba8eb5f2,0xbbe4fb37,0xbbc195ff,0xbbe487b3,0xbb9372bc,0x3bdfd75a,0xbc3bd739,0xbcbb1399,0xbce934f2,0xbc39da61,0x3b253a52,0x3c8b3431,0x3c0adee0,0x3c00b01d,0x3a01bb8f,0x3c98d973,0x3cd40253,0x3ce99b94,0x3cbd8204,0x3c8a02ef,0x3c9cb162,0x3c73b2a0,0x3c243b6f, +0x3bd60caa,0x3bf54c64,0x3bdf731e,0x3bdcfba4,0x3bc1f125,0x3c29f990,0x3c0f3c80,0x3c75b3af,0x3c326a69,0x3c72e5ff,0x3c44b670,0x3c70f261,0x3c6bd220,0x3c61f12a,0x3bed59ff,0x3c8ebd69,0x3ca3436b,0x3c28ded3,0x3bdac438,0x3c81b90d,0x3cdcd969,0x3d111676,0x3d08a576,0x3cf5db0e,0x3ce3fa41, +0x3cb031fe,0x3c8c9967,0x3c5f0490,0x3c39efaf,0x3c20a45d,0x3c2b6647,0x3c592a21,0xbabcabfd,0x395a7294,0x3b8a4f7a,0x3b944d2f,0x3bc5abe0,0x3baf1431,0x3bf8779d,0x3c172f87,0x3c3380b8,0x3c287e0d,0x3bf271e1,0x3c1eb540,0x3c1fe54e,0x3c1b3a23,0x3bd79bbe,0x3bff142a,0x3c09a740,0x3bf5512f, +0x3b6a263f,0x3c098ee9,0x3bd42685,0x3c0b4157,0x3c0ca37e,0x3bf81364,0x3b90caac,0x3b5fd602,0x390f7bf8,0xba8f8f5b,0xbb0cabb4,0xbae90915,0xbabcd757,0xbac2378a,0xba6d437b,0xb9ef5681,0xba010c66,0xb9ea0036,0x3b98f657,0x3b80c019,0x3b97d53a,0x3b787a37,0xb9d8b54c,0x3be2ce37,0x3b98be22, +0xba79c212,0xbae0fe49,0xbb14bd81,0xbae93a70,0xbb5d2a22,0xbb8a4617,0xbb9bcdb3,0x3b9c523a,0x3bfbdedc,0xbb7dd67b,0x3b97dce8,0x3bf1f94c,0x3bf5f8fa,0x3bcade38,0x3bcf6be6,0x3bc76b02,0x3bc1a0db,0x3bce2b7a,0x3bd9e663,0x3bdaa7c9,0x3bd3f0da,0x3bc1576c,0x3ba6dfbd,0x3b8a0adc,0x3b5d64bc, +0x3b77c34d,0x3b837db4,0x3b895fd8,0x3b90a7a1,0x3bf1a0d7,0xbb8a18e1,0xbb92f793,0xbb88dd0b,0xbb8aef38,0xbb707cc1,0xbb1a46fe,0xbb9f5b97,0xbb693715,0xb95c370f,0xbb1b92e7,0xbb376f73,0xbb34595e,0xbb095e1a,0xbb00c747,0xbb2d9656,0xbb337f4a,0xbb254072,0xb92d1fa6,0xbb3ee5b5,0xbb612b12, +0xbb184fd4,0xbb7ff77d,0xbb7e7b91,0xbb387c9b,0xbb966829,0xbba32e64,0xbbb91f15,0xbb5706ea,0xbb42f1bd,0xbb831d58,0xbbc9832b,0xbbeabcb0,0xbc01c746,0xbbadf42a,0xbb9c15e9,0xbb92a4e6,0xbbb1999f,0xbc156765,0xbbe8c744,0xb9d73641,0xbbe8321d,0xbbba7967,0xbb8d2c52,0xbae84225,0x3b4127de, +0xbae9a0d7,0xbb490565,0xbb38e001,0xbaf1e1f4,0xbaa14812,0xbadc3f36,0x3a5ca91b,0x3affe723,0x3b1686d1,0x3a0cc7f5,0xbb8984b8,0xbb4cf5f3,0xbbb75516,0xbbe58662,0xbb214b2c,0xbbd7a215,0xbbd32907,0xbbf23923,0xba8fcdb5,0xbad44e2d,0xbbd515ec,0xbc46bc52,0xbc6114e7,0xbc4e63dd,0xbb86fd15, +0xba7ba736,0xbaa9c85a,0xbbcd486a,0xbc6cce96,0xbb2394fb,0x3b5710b5,0xbb7a85a5,0xbb1d1c17,0xbb1f234c,0x3a25d3c8,0x3c3b9594,0x39b56ed3,0xba84f60e,0x38dbe282,0x3acfea11,0x3b82a90d,0x3b5d6e97,0x3bb7a973,0x3bf51f53,0x3c306706,0x3b9c2425,0xbb36f250,0xbb25cced,0xbb8a5c81,0xbbd38c03, +0x3ae3d835,0xbc054903,0xbc0fe05f,0xbc4a2b89,0x3ab72c56,0x3b19bdac,0xbbd8c5e6,0xbc9a2bd7,0xbccbe400,0xbcc986d4,0xbc27f335,0xbbf4a3c7,0xbb699a03,0xbc291cdd,0xbccc99e5,0xbbecfeb1,0x3bc59d32,0xbbab7bcb,0xbae0c589,0x3b907e1f,0x3c09d9bd,0x3cb91c3c,0x3bbe6267,0x3b839c55,0x3bd0625e, +0x3c84d7f7,0x3c60b5c8,0x3b077c9b,0x3c3874d3,0x3c8f783c,0x3c6c3692,0x3b923ca8,0xbc22f2ca,0xbbbd6a15,0xbc141ed5,0xbc783632,0x3b23d4b6,0xbc0dbb9c,0xbc02a9bf,0xbc3c6629,0x3c0a32a8,0x3c196ce4,0xbc165f12,0xbcddebae,0xbd103ffb,0xbcf651d5,0xbba789aa,0x3c04a048,0x3c7ea9bf,0xbb2d10d7, +0xbd6b1d20,0xbd5b7216,0xbd1b7f2a,0xbcafecd8,0xbc9613c0,0xbc9c3662,0xbc894b76,0xbbbc4b89,0x3a76b427,0x3c7b0978,0x3c3a54df,0x3c7151a0,0x3c988df1,0x3cc5d5d2,0x3c616538,0x3bfd9019,0x3be8bc78,0x3b22505a,0xbbb557df,0xbc112c58,0x3bca5563,0x3c0b9470,0x3c80d2f3,0xbc4c02d9,0xbc716d82, +0xbb11410e,0x3b05974c,0xbc310f46,0xbc804a3a,0xbd00b1e7,0xbcee5cb0,0xbc910fc3,0xbc83931c,0xbd1e335a,0xbdb2f856,0xbd7d462b,0xbd950105,0xbcc281df,0xbc8c5f9e,0xbc947f1d,0xbca4b2dd,0x3c3cc58c,0x3c9debb0,0x3b56acc9,0x3bd0efe7,0xba8f3dff,0x3b76f303,0x3a465152,0x3aff2112,0xbbac9c79, +0x3ca0286d,0x3cbbd94b,0x3c01185c,0xbb35f8a6,0xbc164dc9,0xbbfb8484,0xbc24ada4,0xbc918f40,0xbce24072,0xbc8dc847,0xbc9c6bde,0xbd0633b6,0xbd057351,0xbcd29801,0xbb03d38e,0xbd2f6387,0xbd2f14bb,0xbc1ea84d,0xbb5c65d0,0xbbf95650,0xbd0d37c7,0xbd8ebd3e,0x3dc6a143,0x3d9e9e36,0x3d833219, +0x3d8937ad,0x3d9556bd,0x3d627a57,0x3d126fbc,0xbbaa3ead,0x3c697102,0x3bf29244,0x3b6e862c,0x3b8f8a0d,0x3c287c55,0xba8a4bf8,0x3cd7693d,0x3cea9828,0x3c230cba,0xbb5d24f9,0xbc50b246,0xbc1fb905,0xbc663395,0xbc7cf06f,0xbc8f61e5,0xbd242dc3,0xbd355b19,0xbcfc295a,0xbcb28dd5,0xbc8516b1, +0x3b8143ba,0xbd26b8db,0xbd2ef05e,0xbd2a5034,0x3c51ee82,0x3d404598,0x3d41f1e9,0x3db9c7d3,0xbc1e5011,0xbc1742f3,0xbb8cca00,0x3aaf6425,0x3c18fd86,0x3cbb06d7,0x3d04fba2,0x3d00625e,0x3ca26244,0x3c0bcbfe,0x3b6c0e94,0x3c1f7fc9,0x3bb18d65,0xbc43060f,0x3baa1113,0x3c0310ff,0x3ba79d50, +0x380708fa,0xbc0a6ba3,0xbc8ef015,0xbcc97aaa,0xbd117395,0xbd3fa1cd,0xbd67abc4,0xbd6311b5,0xbd457ae2,0xbd3aef7e,0xbd0aec75,0x3ae28da9,0xbbc2bc61,0x3c97bd13,0x3d01dee5,0x3da340e2,0x3da3eb5f,0x3cd36ad7,0x3c2b1f8b,0x3ba3a7e2,0x3c2fb23c,0x3c7cf137,0x3c93f741,0x3cb6a1d8,0x3cc10a2d, +0x3c99821a,0x3c2c8ac7,0x3c2cb024,0x3c6e778e,0x3c6d378b,0x3c5a8a18,0x3c7aa85c,0x3c6c0779,0x3cf27224,0x3ce44c2a,0x3c7107e0,0x3bb77396,0x3be7871d,0x3c3bbbc5,0x3c32d375,0x3c5b4f1d,0x3c890408,0x3cb4a4b6,0x3ca76e7c,0x3c78bd89,0x3cdc0323,0x3d17a455,0x3d74626b,0x3ce8e053,0x3c6cf475, +0x3bda23b8,0x3b8d18dc,0x3bff1daa,0x3c4e0748,0x3b702a47,0x3a80178c,0x3bb2f332,0x3bebf9d0,0x3be7d4cb,0x3c162409,0x3c82c649,0x3ca9fb48,0x3c945d17,0x3cddc8c7,0x3cc76224,0x3c650087,0x3c965cdb,0x3c95a8c0,0x3c630dde,0x3bfa36cf,0x3bcbe6b3,0x3c6b9bbd,0x3c2e2683,0x3bc68c85,0x3c22aea8, +0x3c7b3c54,0x3c75ce33,0x3c4314c8,0xbc417fa6,0xbc3b082b,0xba271f1d,0x3beb4f30,0x3b9e1f95,0x3ad0ee7d,0xbcd398af,0xbcd54b3b,0x3b511580,0x3b6142c2,0x3c50f777,0x3ce6fe9f,0x3bd5842d,0x3c3d73a0,0x3c3eec49,0x3c5110a0,0x3c09a154,0x3b75c856,0x3bb0aa4e,0x3bcc1450,0x3c037253,0x3c11ca45, +0x3c36c13b,0x3c725c3d,0x3c76c210,0x3c722451,0x3c8891c1,0x3c8c934e,0x3c8b7c01,0x3c6e7e80,0x3c986e62,0x3ccb3712,0x3cd91efc,0x3ccfb84f,0x3cdcb4c1,0x3cfe7968,0x3ce5383f,0x3cbdc817,0x3c861946,0x3c08b7a2,0xba2520c5,0xbc23cfe8,0xbb874212,0xbb0c1794,0xbb3fb512,0x3b481483,0x3c0ab70d, +0x3c6bfb1f,0x3c6493cb,0x3bbf9342,0x3bf1cad4,0x3b23abec,0x3c3347d3,0x3c3b7ff9,0x3c7631a4,0x3c9fbb97,0x3caee24b,0x3cb6544e,0x3ca54e26,0x3c9b1b5b,0x3c98dc96,0x3c983670,0x3c9262eb,0x3c694453,0x3c268fe0,0x3c035940,0x3b8661e8,0x3b08e200,0xbc0e6af4,0xbc383a05,0xbc5af3ff,0xbc8ca21e, +0xbc929c7e,0xbc9385b9,0xbc933763,0xbc7fc6b4,0xbc490011,0xbc250f93,0xbc056b06,0xbbdb2877,0xbbaca54d,0xbb1fee82,0xba869098,0x395e6e33,0x3b21f1d9,0x3c036e1e,0x3c2859d6,0x3bcca9c8,0x3bc025f1,0x3ba23361,0x3c2997c3,0x3c0c46cf,0x3bea2806,0x3bd87ee3,0x3bf1a640,0x3bfd046d,0x3c02358e, +0x3c0413a7,0x3c0fcb26,0x3c12f18c,0x3c0a79eb,0x3be7c04e,0x3bb12623,0x3b9ca7af,0x3b6cf15c,0x3b90bdb6,0x3b75035d,0x3b6b5558,0x3b2ac80a,0x3ab20aaf,0xb98cb1af,0x3a899379,0x3ae55fe6,0x3b3ae458,0x3b4d673b,0x3b8174ca,0x3ba43c07,0x3bab142a,0x3bc245c6,0x3be3700b,0x3bf91b6b,0x3c29b095, +0xb9ac9b5c,0xbb3aa396,0xbb514c24,0xbb509cfb,0xbb61a838,0xbba1115a,0xba746a68,0xbaab8189,0xba85b996,0xbb3cc884,0xbb5ab3a6,0xbb5c3322,0xbb500996,0xbb3e85d7,0xbb0c38bb,0xb925eb6f,0x3a83d91f,0xbaac278f,0x397effd4,0x3a6d35bd,0x3b1e64a1,0x397ce66f,0xb792557a,0x3a06fde6,0xba45c16a, +0xba759cbc,0xb9b083db,0xba17ecd6,0xba5d4f57,0xba0bde1d,0xbb17de81,0xbae300be,0x3ac74662,0x3a6d6151,0x3a6d792b,0x3a97255c,0xbae19d28,0xbbed3176,0xbc29e7a2,0xbc32cb09,0xbc1b32fb,0xbc03e4f1,0xbb3b06c3,0x3a52f0c8,0x3b76c901,0x3a8b1d2d,0xb975cb01,0xba567499,0xb9029a80,0x3a6414fe, +0x3b899947,0x3b354b89,0x3b87b14e,0x3bbaa825,0x3bb2270b,0x3b1a3bc6,0x3bc67f68,0x3b5324d8,0x3afaa276,0x3b7d57ee,0xba0df72a,0xbad2544a,0xba687a25,0xbb294c46,0xbb80b6f1,0xbb8f1604,0xbc29ba84,0xbc1b2e4d,0xb934854c,0xba1aaa5d,0xba4e3411,0xba19d5e3,0xbba50d21,0xbca2a85a,0xbca83f96, +0xbc94e91e,0xbc7a4499,0xbc566826,0xbb8a606d,0x3b149318,0x3c26e0a1,0x3b062b9f,0xb9cc255d,0x389a1e20,0x3a8bc3a5,0x3b7984d8,0x3c4674a3,0x3beb474b,0x3c1954a3,0x3c567e48,0x3c439a7c,0x3c0f7aa5,0x3c1d7be2,0x3ba525e0,0x3afdbd0e,0x3b78e500,0xbb6fa9bc,0xbbb46b2e,0xbb8cae0e,0xbbbf1146, +0xbc137a99,0xbbf03e54,0xbc7f68cb,0xbc27dc61,0x3c26cd49,0x3be53381,0x3b9099e9,0x39a355fb,0xbc7617ee,0xbcc931fb,0xbd0fde89,0xbd33d5e9,0xbd271aa8,0xbce148e8,0xbc14f885,0x3b6ac12b,0x3c8b1066,0x3b9eef72,0x3b8c2dca,0x3b753f60,0x3c4fb18a,0x3c409ef8,0x3c4b9883,0x3c31c822,0x3c76a3e9, +0x3c9fe2f9,0x3c8088f5,0x3c5055fa,0x3c98ce31,0x3c582909,0x3bf7d75e,0x3c37e344,0xbadedc59,0xbbb52d23,0xbbb94760,0xbc58ebd2,0xbc844ce3,0xbc8cf17a,0xbd051066,0xbcdd1169,0x3bdbf053,0x3b9f15b0,0x3a0f0736,0xbbfd3eb8,0xbcbc621a,0xbd09d636,0xbcb1b405,0xbbe120c7,0xbb75547e,0xbc53f23f, +0xbc9c25d8,0xbc552248,0x3ba6d2a2,0xba1b5768,0x3bb6b56d,0x3bd93169,0x3c22c5b9,0x3c85ebbe,0x3cd36470,0x3c55d245,0x3c49cab3,0x3ca40ba8,0x3c6446d8,0x3b95ab00,0xbbaa185c,0xbb993eeb,0xbbac34a9,0x398dacfe,0xbca77202,0xbce3c414,0xbcfb53c9,0xbcc2ea08,0xbca53ec6,0xbd29996a,0xbc3cc14b, +0xbadedd36,0xbb7cd3f3,0xbc32b299,0xbc8ae3d8,0xbcd42e96,0xbd0a6bb5,0xbd423615,0xbd367be3,0xbd49c2db,0xbd081314,0xbc0b7e3b,0x3c85e770,0x3c9e459c,0xbc2c4b39,0xbb9b7229,0xbbf362d8,0x3b6f3a08,0xbb7376a5,0xbb4e4e10,0xbbb328d8,0x3cc0882f,0x3cdca4ae,0x3c5a17dc,0x3be5328c,0x3a547e32, +0xbad5f791,0xbb3a35f1,0xbbbe0806,0xbb809f1c,0xba5ca63c,0x3b9421fb,0xbbed00e3,0x3be82d38,0xbc1345ec,0xbd168746,0xbd6ea580,0xbd36206a,0x3c2b7a6f,0x3c6e1b2f,0x3c65745e,0xbcb1f071,0xbd25ca2f,0x3dab43a1,0x3dea40c5,0x3daa9997,0x3d98e0e3,0x3d90ceec,0x3d2b48a9,0x3cae0a79,0xbb973314, +0x3c0f3d34,0x3b149003,0xba928456,0x3ad3a502,0x3b2f65a2,0xbb5fab51,0x3be2c697,0x3c47dedd,0x3cbb3d26,0x3a5e57ac,0xbc0e1c4e,0xbc2cd310,0x3a7f883d,0xbb818bfe,0xbcb41c4a,0xbd0926b3,0xbd0454c8,0xbd053593,0xbb87a519,0xbb97f3f5,0xbc3e6a5f,0xbd5ff901,0xbd84248c,0xbc9c4bc2,0xbd81715e, +0xbd4f25f6,0x3c85f7f0,0x3d5427a9,0xbc140016,0xba2a979d,0xba20f454,0x3c77a351,0x3cb096bb,0x3d073686,0x3d0a1397,0x3cf4d63a,0x3c24d2cd,0x3abaae92,0x3c061660,0x3b3d5720,0x3ad53f59,0x3bfda2c4,0x3c16ecd7,0x3c232b03,0x3cc2c1e2,0x3bb42c4b,0xbbdf3694,0xbc167728,0xbc90ea31,0xbce6ff61, +0xbceb0cca,0xbcbfaff9,0xbc9ff3ea,0xbced7f19,0xbcd2da72,0xbd2d7c48,0xbd2fcd9d,0xbd806c14,0xbd062905,0x3d2ada6e,0x3d8dfc5e,0x3da2b961,0x3d668073,0x3c64dc42,0x3c4522d2,0x3c8dc7f2,0x3c918534,0x3cb2b31e,0x3cb067a8,0x3c9bb02b,0x3c704027,0x3c3624b3,0x3c4b1ca1,0x3c9313bb,0x3cf5361b, +0x3c95783e,0x3c7c8a18,0x3c3491bc,0x3cc70978,0x3cc442f0,0x3c7d0d3e,0x3c26e3fe,0x3bd7a6ef,0x3c10c6a0,0x3b9cd72b,0x3b9df403,0x3b735d6b,0xbbb58279,0xbc01d623,0xba98a9ea,0x3c710ef7,0x3cdaa492,0x3d232fdf,0x3c9a5beb,0x3c73030c,0x3d04ef61,0x3c1389c8,0x3aa8e140,0xbc724cb1,0xb9c53f7d, +0xbb802898,0xbbc7ca1c,0x3a27c966,0x3be71e13,0x3c876d2b,0x3cad0b89,0x3cbbe125,0x3c910335,0x3ca6b14b,0x3ca105a9,0x3c96e181,0x3c705002,0x3c44df2f,0x3ba2e7c4,0x3bb85c55,0x3c40670e,0x3cac92bf,0x3ca43634,0x3c9dbae6,0x3c80b388,0x3c6805a7,0x3c66b7b0,0x3c701322,0x3d0e4e85,0x3d35a027, +0x3d29d3fe,0x3d02e188,0x3c66fe88,0xbbbd06db,0xbc676fb3,0xbc420f56,0x3bb545ac,0x3c5bf744,0x3c3d08fc,0xbb277464,0xbaa56e28,0x3be1c1ef,0xba6db383,0x3b5ca982,0x3baff3c4,0x3bd820ea,0x3bd9a6f2,0x3c0e847a,0x3c25f529,0x3c1a149e,0x3c017bd6,0x3bfb1c81,0x3c41ab6f,0x3c92e9e6,0x3ccc8c75, +0x3c94c6ae,0x3c2e51bc,0x3b09265e,0x3bec750e,0x3c528789,0x3c7adcf1,0x3c6dbedc,0x3c7d4ec3,0x3c563e0d,0x3c32f81e,0x3c16dfa6,0x3c29e40b,0x3b551439,0xb928ff6d,0xbb789038,0x3b9aedcf,0x3c249c88,0x3c5eebbe,0x3c4cf0f0,0x3c7557f3,0x3ca32498,0x3c5ea970,0x3c9484eb,0x3cab037d,0x3c95eb93, +0x3ca59594,0x3ca72fcb,0x3cb3930c,0x3cb342bd,0x3cc22d2d,0x3cae1184,0x3cab0a0d,0x3ca3cc4f,0x3c966fe1,0x3c8118a3,0x3c744687,0x3c3b0768,0x3c27f5b3,0x3bf2a2b4,0x3ba4f342,0xbb07a868,0xba8bf927,0xba680e72,0xbadfe135,0xbaa9da03,0xbade7dfa,0xbb11ea12,0xbb2b8334,0xb8b4e1f3,0x3b01a653, +0x3b1c6f9e,0x3b6eba83,0x3b9bc15f,0x3bf0ec7a,0x3c243184,0x3c3eb2a1,0x3c5bffb6,0x3c748c15,0x3c6b2a89,0x3c8252ff,0x3c6ff4e4,0x3c6bbe8c,0x3c503f47,0x3c725334,0x3c67eb87,0x3c6ea96d,0x3c6cf975,0x3c6b3672,0x3c659928,0x3c648b01,0x3c638da9,0x3c60ca2f,0x3c4ce6f4,0x3c445e96,0x3c17abda, +0x3c13ca3f,0x3c09f3d4,0x3c0b401a,0x3c0a1e8d,0x3c0d546f,0x3c0c6af3,0x3c101f95,0x3c1322f3,0x3c0b6a49,0x3c1db870,0x3c2a67c0,0x3c3dac0e,0x3c403f8a,0x3c40c06a,0x3c398009,0x3c3fa51f,0x3c47aed6,0x3c4eae39,0x3c62c579,0x3c5fdd4d,0x3a79d7a2,0xbb28584f,0xb89684af,0xba094d26,0xba4da83b, +0xbb095d3e,0x3aaba4d7,0x3ae8c139,0x3b085748,0x3a48a1fb,0x39a35902,0xb9ac76c6,0x38bec49d,0x3a2dcffd,0x3b227609,0x3b2889ad,0x3b3f1c2f,0x3b1f71e3,0x3b4bf882,0x3b4d44bf,0x3b221bc9,0x3ae9bc97,0x3ac996b9,0x3b01915c,0x3ac4da7f,0x3a88a237,0x39838c59,0xb905c966,0xb9c0c42d,0x3a9cc25d, +0xbae8abf4,0xbac7c397,0x3b09fb55,0x39a642bd,0xba2cf3ea,0xbb310274,0xbb33049c,0xbc0b440d,0xbb67d23b,0xbc0c344f,0xbb80370f,0xbbc22a3d,0x3abc4800,0x3b8beda1,0x3bb454a6,0x3b349037,0x3a5b5719,0xb7b2e28b,0x389c8bc2,0x3ad8a790,0x3be0a87b,0x3bb6a2f8,0x3bd5d7fe,0x3bf915ba,0x3c028e8e, +0x3c05b8f0,0x3bdbfcc0,0x3b860f35,0x3b4da8d3,0x3b30d0cb,0x3aa6352c,0x3841822d,0xbacd3886,0xbab98959,0xba895d6e,0x3b757256,0xbb6eebfb,0xbadc9233,0x3c069e1c,0x3bbf8ee6,0x3b809c8e,0xbb5dbe2e,0xbbf9ca67,0xbc8362f0,0xbbc0173c,0xbc303e8b,0xbbc1cdb4,0xbc408f3d,0x3a8dd759,0x3bd1fee7, +0x3c2fc2eb,0x3b95d777,0x39af63c8,0xba75c522,0xba935a4e,0x3b6c5b7f,0x3c615562,0x3c2cee65,0x3c42d2c8,0x3c582267,0x3c65ada0,0x3c5f930f,0x3c1ec627,0x3ba73129,0x3b6f4250,0x3ba2f6f3,0x3b7df93b,0x3b05e330,0xb97b5bce,0xbb8f8b6f,0xbbd8e132,0x3b94557a,0xbc4b7137,0xbc18f32b,0x3c0ba8f4, +0xba6b4c30,0xbbb09b65,0xbc91fd68,0xbca17551,0xbca4c75b,0xbbf5657d,0xbc8f6ebb,0xbc6c4927,0xbc8fbc17,0x39fe313b,0x3c30f6e5,0x3c9bcbb1,0x3bbfb78a,0x3b29fdeb,0x3a86f647,0x3c0b9f57,0x3c378fba,0x3ca5106c,0x3c72356e,0x3c8cc04a,0x3cadfe64,0x3cb0559b,0x3cc14e18,0x3c755e17,0x3c153177, +0x3c08ca77,0x3b9de2ec,0x3b126816,0xb9260b36,0xb963cef7,0xbb9d3bb6,0xbb607f0e,0x3c5f4549,0xbc59b9e9,0xbbe2c213,0x3cc18ef9,0x3c7560e0,0x3c01ae67,0xbc23f6e2,0xbcc6feee,0xbd131d52,0xbcae8ed2,0x3c6c9c41,0x3c748282,0xbc1c3a79,0xbc088907,0xbbc2577e,0x3b9c0585,0x3b7503a5,0x3bc9207f, +0x3b8bdb7e,0x3b92d21b,0x3c35b7f6,0x3cbf4aa2,0x3c251803,0x3c0cef29,0x3c85c587,0x3bf512bb,0x38cb31aa,0xbbb26e30,0xbc70e9c3,0xbc90e70c,0xbc9bc2e1,0x3ab10f65,0x3a8ca8d5,0xbccadf4c,0xbcf419dc,0xbd0bbc3e,0xbd230a53,0x3b71757c,0x3c50a6ed,0xbb5f4a54,0xbc70501d,0xbcdaa751,0xbd433600, +0xbd3bd23a,0xbd33a623,0xbd45d055,0xbd3b89b0,0xbd053421,0x3b624a6b,0x3c6d5c2b,0x3c75b248,0xbc25bb6e,0x393c6fcd,0xbb0f42df,0x3b5c02cc,0x3a773a4a,0xba68d7d2,0x3b0f93ec,0x3cb7b2b1,0x3cb918b3,0x3c702d3c,0x3c2d32fd,0x3c0692e4,0x3b2cc73d,0x3b6ea4ed,0x3bc3a551,0x3bffc9b5,0xbb7fe60e, +0xba26582a,0x3af8f755,0x3b020a73,0xbc62b847,0xbd80105d,0xbd330ca0,0xbd077daa,0x3c6f9636,0x3bd2dd8f,0xb917c98a,0xbc844841,0xbcb10e3f,0x3d4ffe09,0x3d9eac74,0x3dbaad5e,0x3d98f395,0x3da21f4c,0x3ce2789d,0x3c2686d0,0xbb52c286,0x3aaae465,0xbad5bfb8,0xb93e0e0c,0x3a800ce2,0xbba32f7e, +0xbabefc02,0xbc354660,0xbaf5b50b,0x3d22aa99,0x3c36a227,0xba8e360f,0xbbf46465,0xbb75f74f,0xbc281304,0xbc70ce6b,0xbc12bb03,0xbc3fd88c,0xbd0fbf94,0xbc95d05e,0xbcf79fb5,0xbd8a591d,0xbd90ff83,0xbd8953e8,0xbc01be69,0xbda1dad3,0xbd9a0769,0xbd10fe4e,0x3c585113,0x3cf3511f,0x3ca347a8, +0x3c5918af,0x3cb5c374,0x3d0c0899,0x3d1453a5,0x3d076538,0x3cb6ea9e,0x3a841c55,0xbb8440d1,0x3b3c8403,0x3afed2c9,0x3b3a7612,0x3c52b657,0x3bcd8b7c,0x3c22b814,0x3d0db88c,0x3b77e250,0xbb868718,0xbbe847b2,0xbc915246,0xbc9ccf15,0xbc68806a,0xbc9f9189,0xbc69fecf,0xbc6e280a,0x3b199f5b, +0xbc46a9df,0xbd3d2fe9,0xbd8d024f,0xbd624389,0x3d0a7898,0x3d1f4e92,0x3d7ba0b3,0x3da0e61f,0x3d40e2a0,0x3c8f400f,0x3cbf1cbb,0x3c9e6de8,0x3ca4e4e4,0x3cbc90f8,0x3c8e0246,0x3c6a23c9,0x3c728769,0x3ca99a5b,0x3cc320f1,0x3ceba8ff,0x3c8cdce3,0x3c58fd98,0x3c34d8a6,0x3c7c373b,0x3c7ae60f, +0x3c81c417,0x3c0824e6,0x3bd42639,0xbb344d5b,0xbc3417e5,0xbc85a50f,0xbcb9408d,0xbd0a80fb,0xbcfa6adb,0xbcb78a8e,0xbba9f10e,0x3b978b94,0x3c14c804,0x3cfd2959,0x3d338b20,0x3d8acade,0x3d126208,0x3c4c08ec,0xbb096956,0x3c22b59f,0xbc0cacae,0xbb4c7b5d,0xba35b0c6,0x3bedd14c,0x3c8eaa7c, +0x3ca3d60b,0x3cacd688,0x3c9df469,0x3c52b8b7,0x3c3a2cd8,0x3c9ac2a9,0x3c32c159,0x3bf7eaff,0x3c0cee5c,0x3c7c59fd,0x3c9c3bf8,0x3c76a443,0x3c8e3bf6,0x3c83227c,0x3c5b4cea,0x3c53574f,0x3c94fdfe,0x3ced4d22,0x3d3f4d4f,0x3d57b632,0x3d57277b,0x3d233c6b,0x3cc7d296,0x3afa5dc8,0x3c62a3ca, +0x3c74f61d,0x3c1190da,0x3c676418,0x3c4aa3ca,0xbad9c3d3,0xbbde3d16,0x3c3a603e,0x3c0f44ec,0x3c108e1d,0x3c2a8ae9,0x3c2b3fc2,0x3c35c518,0x3c49b90c,0x3c79f6c9,0x3c55353d,0x3c335fe1,0x3c043552,0x3c3fb9b7,0x3c8bce7a,0x3ca353cb,0x3c4b69e6,0x3b6ee658,0xbb43141e,0xbadd3eda,0x3b37efac, +0xbb5ec442,0xbb907f18,0xb8a96ae3,0x39f22694,0xbb306815,0xbbaf55ca,0xbbb4c199,0xbadd9461,0x3ba5a683,0x3c2a5a11,0x3c67f3c0,0x3c8cd8f3,0x3ca87a69,0x3c88a8cc,0x3c518773,0x3c46c6dc,0x3c40c33a,0x3c62e8e6,0x3c795f71,0x3c90a82c,0x3c79e460,0x3c855118,0x3c83268f,0x3c6d1347,0x3c6f5cc9, +0x3c576030,0x3c6d196c,0x3c6bc108,0x3c669a6d,0x3c4f35ea,0x3c520816,0x3c3fa5ce,0x3c474cd2,0x3c396943,0x3c139447,0x3bed335b,0x3bc1cfbd,0x3be6fa28,0x3bf279d7,0x3c0c2b50,0x3c1f84ae,0x3c3804b3,0x3c3bb472,0x3c333621,0x3c1c914a,0x3c18ebcc,0x3c096c49,0x3c060c43,0x3c15c55c,0x3c23c5b2, +0x3c423452,0x3c4e41c1,0x3c55005f,0x3c429c34,0x3c44f5e8,0x3c4e1a2a,0x3c4e6229,0x3c611856,0x3c282b75,0x3c32bb1a,0x3c4dc34c,0x3c538b9f,0x3c4d6415,0x3c4cdd1c,0x3c4949ec,0x3c46b114,0x3c4602b8,0x3c327658,0x3c267fe4,0x3c282e5f,0x3c1d001b,0x3c11d38a,0x3c19f045,0x3c1e5154,0x3c1bb1a6, +0x3c1a5a85,0x3c1ca53b,0x3c1dcc2e,0x3c252f98,0x3c26b1cb,0x3c2a1d01,0x3c2892d5,0x3c2e889d,0x3c2ece5d,0x3c24f73e,0x3c2b98c9,0x3c2cfa55,0x3c31e0ba,0x3c3aeaac,0x3c3e6a6d,0xb9a40b86,0xbb32fbc3,0x3a350215,0xba5cbadd,0xb9f57c5b,0xbaa33301,0x38a7dc83,0x3a7f53e8,0x3b224c8d,0x3ab36c62, +0x3a2a7ed7,0xb9a64fa6,0x3881e201,0x3a3624b6,0x3b2a6f77,0x3ad1822e,0x3ad603e5,0x3b3353f1,0x3b104dd5,0x3ae26afa,0x3a85aeb2,0x392e32ff,0xb98aa28d,0xb9122ff3,0xb8f92152,0xba272928,0xbb0ea11c,0xbb01986d,0xbad239d9,0xb935fb5b,0xba2658e0,0xb98b9014,0x3ae8752b,0xba2eaf9e,0xbabd6eca, +0xba83cdd3,0xbb4d4a21,0xbc02ef72,0x3702c8a7,0xbb5ffc82,0xbb79cdb6,0xbbd3aba5,0x3aba05a2,0x3b741c61,0x3b97395f,0x3affb2fa,0x38eb87c9,0xbac41b55,0xbac1d527,0x3969d640,0x3b925974,0x3b9ebbc6,0x3bc01427,0x3bbe7aa0,0x3be022b1,0x3bcece55,0x3b61c89d,0x3a03e6bd,0xba5fa370,0xba5e4915, +0xb9d0885c,0xba9e1929,0xbb8e8fd9,0xbb55f8ae,0xbb38e03d,0xbaa75e0c,0xbb3b309e,0xba93b97f,0x3b6cdb56,0xba5e1db1,0xbb2bd8b2,0xbacee699,0xbc0d8e46,0xbc825197,0x3b2a2dc5,0xbac934f9,0xb5ca806b,0xbc0793c2,0x3b2a644b,0x3bd9b150,0x3c16036a,0x3b974a62,0x39e4b5e6,0xbb2e3ba3,0xbb2a502f, +0x3aab51b8,0x3c1ce618,0x3c28e0ee,0x3c3a17d1,0x3c3c1586,0x3c5829ce,0x3c3c15fe,0x3c02a567,0x3b23219e,0xb96845ed,0x3ac42ba5,0x3aa215f8,0xba39d2dc,0xbc0e3ad4,0xbc095eae,0xbbdf9277,0x3a6a89ac,0xbab5d92b,0x3ae8a549,0x3c2c4c23,0xbb49697c,0xbbe37824,0xbb347e6c,0xbc95b8c9,0xbcde842a, +0x3aea3bb8,0xbb8c1422,0xbc01080e,0xbc6a6c49,0x3c0f92ed,0x3c623e12,0x3c8a1532,0x3bfda0c5,0x3ad72f63,0xba16131b,0x3b9884fa,0x3c0eecfc,0x3ca682b4,0x3c6e32ae,0x3c949262,0x3ca840ba,0x3cba8956,0x3c94c6b2,0x3c4bb48b,0x3b95ebf6,0x3922737c,0x3abbdcfb,0x3a9f98cb,0xbaf72f80,0xbc19166e, +0xbbd067b8,0xbb33ecc3,0xb7cb24d6,0xbc0b9850,0xb8c701cf,0x3c739027,0xb9d48a63,0xbbafa135,0x3b6b5c66,0xbcc685b9,0xbd0fa5f1,0xbd423910,0x3c32e03d,0x3c9527df,0xbc51ccb0,0xbc047114,0xbbb279e6,0x3b40e90b,0xbbb05adf,0x39836d52,0x3bdd41a8,0x398831ab,0x3bbca5e0,0x3ca6ed61,0x3c38da4a, +0x3c0d3f73,0x3c28313e,0x3b9f41ed,0x3a30ff18,0x3afe9cda,0x3afbb20b,0xbb2a7ceb,0xbbfd0507,0x3c0e3940,0x3c1cad46,0xbb700db5,0xbcdad1e7,0xbce51edd,0xbc3b0dba,0x3cec20ed,0x3cc76b37,0xbca6cb33,0xbcb34014,0xbd1a8974,0xbd79858a,0xbd3a6d29,0xbc50aa91,0xbd3e6c27,0xbd39473a,0xbcf5933b, +0x3b6e04f0,0x3bd552fd,0x3bc743bc,0xbbd8e510,0x3a9b7652,0x3a30ac74,0x3b1479bf,0x3af29ec2,0x399e937e,0x3baad891,0x3c2e0c4c,0x3c5a89d6,0x3cbe776f,0x3c4d2e60,0x3c07d5f3,0xbb1ff0b6,0xbb388fb4,0xbaaa871f,0xbae0ea0e,0xbc58ea4e,0xbc9f62fa,0xbc69d89a,0xbcfe87a1,0xbd1a2193,0xbd3833d5, +0xbce77a8b,0xbb722dd7,0x3cb8a960,0x3b40925d,0x3c01f3bf,0x3d07a549,0x3c77f832,0xbc76bc56,0x3ccfc142,0x3d88885f,0x3d720d9a,0x3d5545f1,0x3c0ba2cc,0xbb272b02,0xbaebb29e,0xba2a4a42,0xb9a7de28,0x3b4a5df4,0x3b8aa9eb,0xbb9ab050,0x3bd0e62a,0xbc21e612,0xbabdcc81,0x3d267b15,0x3c611561, +0x3abb8a8d,0xbb1969d6,0xbbe02217,0xbc1e63ee,0xbbe182ce,0x39611b77,0x3b57f107,0xbbbed71d,0xbca328c5,0xbced1f17,0xbd2e1d40,0xbce1c830,0xbd0ffd2a,0xbd33d7ed,0xbd9e7faf,0xbdcd6035,0xbdfdd928,0xbd8690ef,0x3da1874a,0x3d358dc7,0x3d03705b,0x3d04b118,0x3d3b38d4,0x3d128ded,0x3ce83c1c, +0x3c9cab34,0x3b1f8811,0xba34e80c,0xb90e8974,0x3a81493d,0x39aa900b,0x3c0ce624,0x3a793487,0x3b4c165f,0x3cd0b12b,0xbbbca4db,0xbc67197b,0xbc5aba5c,0xbc8a27c0,0xbc6f9755,0xbc50f31e,0xbc8a558e,0xbc61647f,0xbb1bee06,0x3c3ba0c5,0x3bce8c76,0xbd0cc6a2,0xbd1e064a,0xbd2455e5,0xbc1df1ff, +0x3c8bff7e,0x3d56e3e7,0x3da67b0c,0x3db8c77b,0x3c03c486,0x3c28f7ec,0x3c768ac0,0x3c8403c1,0x3cb46f46,0x3c8f03f0,0x3c9c28f7,0x3cd35136,0x3cc27289,0x3cbf0e91,0x3cadafcf,0x3ca68221,0x3c87667c,0x3be042b9,0x3c11ed4c,0x3c3961c6,0x3c95a400,0x3bf5bb4d,0xba75da22,0xbc0d07f0,0xbc751bbc, +0xbcb9af7e,0xbcf2e3b0,0xbca31108,0xbc801a95,0xbc63ef39,0xbccfcfe4,0xbcd51060,0xbcbea561,0x3ccd99e3,0x3d6535cc,0x3d9c2b79,0x3d6736d1,0x3cf7c1d8,0x3b9dd9aa,0x3be57acc,0x3c1ef491,0x3c2bbabf,0x3c372d2b,0x3c8420a4,0x3cb12c3d,0x3ca29ae2,0x3c8b5186,0x3c49d560,0x3bfc39b4,0x3bd3f151, +0x3c09db42,0x3c1f8547,0x3c27b565,0x3c848f77,0x3c9bdb83,0x3c85be7b,0x3c1f40d3,0x3c41d11c,0x3c5332f2,0x3c78bc27,0x3ca52faa,0x3cdf82f5,0x3d103ddf,0x3d1110a7,0x3d0dc310,0x3d23c994,0x3cff7ee2,0x3d0bb3f0,0x3d1eca4d,0x3d0cfb0e,0x3cf16f78,0x3cd87907,0x3c1cddf6,0x3c1842bf,0x3c5d687d, +0x3c0adc44,0xb890f293,0x3acf7f31,0x3bd0f074,0x3bf6d803,0x3c0a5079,0x3c1aadce,0x3c4036fa,0x3c69e3b3,0x3c6705a4,0x3c651779,0x3c5cfbee,0x3c3d354b,0x3c3e1954,0x3c182027,0x3bfcb5b8,0x3be0d34d,0x3be8b06d,0x3a69b758,0xbbcc893c,0xbc1637f4,0xbc02f128,0xbc3d87b1,0xbc4f8b2a,0xbc3ab9a3, +0xbc1d2b95,0xbc052b0d,0xbb94fe02,0xbb02b57c,0x3ada50fd,0x3ba0232e,0x3beca2dc,0x3c005e4a,0x3bd291e9,0x3b3759b5,0xbacef0ac,0xbab43781,0x3c5bc5eb,0x3c60eaf5,0x3c5a9acd,0x3c45076b,0x3c47b1b7,0x3c31c49f,0x3c20b39e,0x3c17f9a1,0x3c20084e,0x3c304187,0x3c42b618,0x3c4c380a,0x3c54e74e, +0x3c6755c9,0x3c545508,0x3c3b4977,0x3c335617,0x3c1f1bc0,0x3c09d613,0x3c014359,0x3c15974f,0x3c2648cb,0x3c32cb40,0x3c3d6553,0x3c411d98,0x3c3d639f,0x3c450cd9,0x3c4494ef,0x3c3a15da,0x3c1c3ad4,0x3c04803e,0x3bf78ad8,0x3c118bbc,0x3c2f8e33,0x3c429542,0x3c5f6d8c,0x3c5e7bb5,0x3c6d203d, +0x3c4cb4c9,0x3c3d701f,0x3c2158b6,0x3c4bf459,0x3c325f0c,0x3c1bb31b,0x3c255a2f,0x3c25f270,0x3c271288,0x3c2d9e0c,0x3c30f179,0x3c371cd0,0x3c3941c2,0x3c486235,0x3c0f5775,0x3c24203c,0x3c3176bb,0x3c3dcd7d,0x3c374ac0,0x3c3626bf,0x3c35bc22,0x3c321794,0x3c3271d1,0x3c361dfa,0x3c2e9ee8, +0x3c2b2e9d,0x3c2e954d,0x3c3a5140,0x3c46016b,0x3c4933ea,0x3c4c38e8,0x3c4de1da,0x3c5409ed,0x3c533913,0x3c8df35d,0xb994b1e4,0xbafcf145,0x39e185d7,0x38846519,0xb8d64440,0xbac3bdb6,0x3aad80b3,0x3aab3b59,0x3aaf76a3,0x3a309da4,0x38857747,0xba7b2386,0xba2c46ef,0xb97adc1f,0x3a856d1b, +0x3abe675a,0x3af0e07f,0x3af2e01d,0x3b01f339,0x3adf3c8f,0x3a958210,0x38627b7e,0xba13a52b,0xba8b13bb,0xba80e8ea,0xba9f7551,0xbaf6da93,0xbacc7bf7,0xbaa40a8f,0xba3b9e76,0xba10acf6,0xb9fdd356,0x397efcf9,0xbb1686d0,0xbb32f769,0xba292dd0,0xbb1dff87,0xbb9d7848,0xba9d6da9,0xbb1f93bb, +0xbb3a2e6e,0xbbb61578,0x3b1b7f32,0x3b9a1690,0x3b79b217,0x3b0ffdc6,0x39c89bba,0xbaa0ad22,0xbab8268e,0xb8ecf6bf,0x3b2f9878,0x3b80b4c2,0x3bb20b92,0x3bc3ba15,0x3bcdf0df,0x3bafce52,0x3b81b404,0x39c0715b,0xbaa6acdb,0xbadee162,0xba95218c,0xbaed60a2,0xbb8d27b4,0xbb8a87ea,0xbb6fef3b, +0xbb352c4d,0xba40a36d,0xba0abfb9,0xb9bf4624,0xbbbce80d,0xbbe4f521,0xbad39e59,0xbba626db,0xbc3c4f60,0xba7786e5,0xbba7839b,0xbb6afb8c,0xbbda9556,0x3b9cf7ee,0x3c0c9c33,0x3bf8a5a1,0x3ba01187,0x391ddf3b,0xbb36ea0c,0xbb489af2,0xb979a005,0x3bdc4bd1,0x3c1ac2ff,0x3c3447ba,0x3c43656e, +0x3c4c4a83,0x3c35a732,0x3c17eb69,0x3a941dbe,0xbb1cf58f,0xbb80283c,0xbba2a80d,0xbbd8ef5d,0xbc406eba,0xbc175101,0xbbe0f8ed,0xbba848b6,0xbae14414,0xbb125e7a,0xbaecc74d,0xbc6c8ec3,0xbc955606,0xbb9d90f5,0xbc54875b,0xbc58c343,0xbc0d2f87,0xbc9764ef,0xbcb406d3,0xbcbc9d15,0x3ba9ec42, +0x3c4a233c,0x3c5df4c6,0x3c060b3e,0x3afb28c3,0xba912754,0x3b115b4c,0x3be68d06,0x3c90e511,0x3c4925dd,0x3c864061,0x3cbc5466,0x3cc27093,0x3c9d8b3e,0x3c78440b,0x39b30a59,0xbbaa8810,0xbb9c3b91,0xbb9f69d0,0xbbeb8a3c,0xbc8cd452,0xbc5c9d37,0xbc283e79,0xbc3da0bd,0xbb98e47d,0xbb805008, +0xbb97283e,0xbca02026,0xbcb68a2d,0xbbb38398,0xbc7311ba,0xbce8d0f0,0xbd3bf163,0x3c50ed9d,0x3ce088d8,0xbbbf493e,0xbb3e22e8,0x3a07a25e,0x3c4e7581,0xbc03ade4,0xbc0d28d3,0x3bcb6360,0xbabb7c99,0x3b56ec7a,0x3c7fa1c4,0x3c840e10,0x3c75622f,0x3c242121,0x3c135672,0x3c2624f4,0x3c43cff9, +0x3c142b68,0x3b767d8d,0xbaabab71,0xbc21edfb,0xbc9fadb6,0xbcec9e08,0xbcdc118b,0xbc6dec5b,0xbba30319,0x3cc60c38,0x3cac0f99,0xbc83d5f0,0xbcaeec48,0xbd1791ed,0xbd57cffb,0xbd11fec1,0xbb95316e,0xbd0fed01,0xbd07eab0,0xbcb27c62,0x3c6b060a,0xbb5fbaac,0xbc347e35,0xbc1f379d,0xbbeba90e, +0xbbb72070,0xbb263487,0xba1fb90f,0xba585c92,0x3ac901a1,0xb8440eae,0x3bcc81ca,0x3ce1c1f0,0x3c4a71a1,0x3b48a204,0xbb9af3d8,0xbb415036,0xbb127301,0x3ad2fed4,0x3be28106,0x3b547d44,0xbbfd7530,0xbce69b67,0xbd00396a,0xbcb683c8,0xbb42ea0b,0xbbdce873,0xbccc4c64,0xbca5c099,0xbb79db31, +0x3c8a63a5,0x3c23e953,0xbda093ee,0xbcf12e52,0x3cf6bc98,0x3cdf8400,0x3c951d73,0xbb8aead7,0xbb8bedca,0x3b576685,0x3ac4b8d8,0x3a49eee0,0x3a762e82,0x3b93d8d6,0xbb7567ff,0x3ba3a4af,0xbbe519ba,0x3a3706e8,0x3cf0301b,0x3c789e24,0x3c122cb5,0x3b9ea1bb,0x3bff20ae,0x3bd2e395,0x3b2158df, +0x3bcdc716,0x3bf6dc1f,0x3c888349,0xbc8df3fb,0xbcfc40cd,0xbd1fc147,0xbbc1b28b,0xbb0a6337,0xbd08122a,0xbd153553,0xbd96d809,0xbdf39020,0xbdc6386b,0x3de60b9c,0x3d8d3e08,0x3d4a9b23,0x3d353383,0x3d4cbd46,0x3d13f176,0x3ccb20d0,0x3c85a792,0x3c05d9c3,0x3b97720b,0xb8165573,0xbab7205d, +0xbaec7288,0x3c31e3e1,0x3b98ff34,0x3ba52cd2,0x3c9b0913,0x3a4a64e3,0xbc083f3e,0xbc3de96a,0xbc5c4566,0xbc554c37,0xbc54b100,0xba5eff22,0xb9b99d55,0x3bb8178f,0xbcba3337,0xbcfa5f98,0xbd0e1a20,0xbc8140c7,0xbc8d4c6e,0xbd304596,0xbb90c8ae,0x3d086e88,0x3d8f9945,0x3de59fb0,0xbae9ff52, +0x3b74c173,0x3c1139e1,0x3c48aab7,0x3cb701fe,0x3c931c11,0x3cb23562,0x3cfac9fd,0x3cc54e05,0x3ca74bb3,0x3c85ecef,0x3cbe9a50,0x3c94b654,0x3b4fb20e,0x3ba070d9,0x3c135915,0x3c9f700a,0x3c193020,0x3adb3b86,0xbb47422c,0xbaeb2911,0xbbe28171,0xbc9ef1b5,0xbc799fc3,0xbcd9aab4,0xbd074d2f, +0xbd599cd3,0xbd3d2e05,0xbcc5cbf0,0x3c2a64c1,0x3d2d5ba1,0x3d77e3e2,0x3d89b75a,0x3d5de15e,0x3cf0bae9,0x3bd22e05,0x3cd44b30,0x3cc365ea,0x3cd0661c,0x3cdadbf3,0x3ccba3d0,0x3c96fd7c,0x3c562391,0x3c338edb,0x3b90edc3,0x3b0e6f1f,0xba008260,0x3c04be4b,0x3c6e076c,0x3c99e31a,0x3c91483b, +0x3c56432d,0x3c355116,0x3c21b64b,0x3c5046d3,0x3c6f19f9,0x3c829c90,0x3c87ec45,0x3c81c28a,0x3c877592,0x3c969ae3,0x3c90990a,0x3cd505eb,0x3d16279b,0x3d4cddd1,0x3d38f9f0,0x3d1822ef,0x3d035922,0x3c577f67,0x3b92d67b,0x3c0f337d,0x3cadf2a7,0xbad51c73,0x37f30111,0x3b922be0,0x3c263404, +0x3c70703c,0x3c79603d,0x3c886f2e,0x3c91463b,0x3c8da032,0x3c852b17,0x3c77edd0,0x3c32b339,0x3bffa0d9,0x3b927000,0x3c064462,0x3c5297bd,0x3c8faa0b,0x3c735b67,0x3c15669c,0x3c340a3f,0x3c378bdf,0x3c049e11,0x3be7a48f,0x3bc241dc,0x3bb241e3,0x3b5a4b07,0x3b8c7891,0x3b767752,0x3ba6c593, +0x3b8f2460,0x3b9981c1,0x3ba45ea8,0x3b697801,0x3aaf363c,0xbb73092b,0xbb8488d4,0x3c69912a,0x3c59ed7e,0x3c4dc410,0x3c3418d2,0x3c2d850c,0x3c22e706,0x3c18019c,0x3c03da78,0x3c086c94,0x3c0376b5,0x3c14ec0b,0x3c1825f7,0x3c279be2,0x3c2f2359,0x3c230001,0x3c0789ff,0x3be1d3d1,0x3bda0dc0, +0x3bd55082,0x3c0347c7,0x3c07cf03,0x3c094d62,0x3c0ed959,0x3c140e29,0x3c1aba71,0x3c284b53,0x3c3903b4,0x3c49757a,0x3c506299,0x3c5d4e9c,0x3c66e4c8,0x3c70f029,0x3c69adad,0x3c6d55c6,0x3c7792d4,0x3c7ab3c1,0x3c5202c8,0x3c4eaaa9,0x3c740aa3,0x3c790070,0x3c75acaf,0x3c5f8234,0x3c70ec7d, +0x3c6e1b3d,0x3c74f347,0x3c7aa636,0x3c7a1bf8,0x3c7fc6e3,0x3c80cb10,0x3c8387fa,0x3c6b5921,0x3c59c059,0x3c67521d,0x3c60b667,0x3c552bff,0x3c3e3c11,0x3c3a9211,0x3c3c9e9c,0x3c3bb35c,0x3c3a5c0c,0x3c38df04,0x3c33bed2,0x3c374fd6,0x3c3cec70,0x3c468e55,0x3c50478c,0x3c5a02e9,0x3c689469, +0x3c62cc33,0x3c5df4a6,0x3c586241,0x3c52a9f8,0x3c812357,0xba4979ab,0xbb3b95a0,0xba83322f,0xba707c8a,0xba3916ad,0xbad30d0a,0x3a46ecbd,0x3a713cbf,0x3a23d71a,0x398ef91d,0xb9c2445d,0xbab89b91,0xba971306,0xba657b49,0x3890db9c,0x3a302c94,0x3a895e46,0x3adda8ff,0x3a3502ef,0x39324b07, +0xb9165a01,0xba3a13c2,0xbaa0d245,0xbad1b98b,0xbaa1657e,0xba989bdb,0xbadd6ef7,0xba386d59,0xb9e08e7b,0xba5bbfd7,0xba069ef1,0xba41ca7d,0xbaa6b4f8,0xbae534f0,0xbb0b2431,0xbafdebd8,0xbb4cbdfe,0xbba5855d,0xba99ffc7,0xbad370cd,0x389267f6,0xbb6e7244,0x3b7b31b5,0x3bb016e5,0x3b4c77c4, +0x3b0f9c36,0x390d39ce,0xbb0e311a,0xbb1acc28,0xba8b55a9,0x3a9ea1e1,0x3b697daf,0x3ba49529,0x3ba3cb55,0x3b8a9d67,0x3b7d2bf2,0x3afdb084,0xba0f209f,0xbadf093c,0xbb2ee46f,0xbb183fb8,0xbb23a55a,0xbb83ddc2,0xbae02c93,0xbad42472,0xbb603006,0xbb1fa404,0xbb198a79,0xbb587bad,0xbb801142, +0xbb8053e6,0xbb411079,0xbbbd316f,0xbc3191e6,0xb91ffd67,0xbae36519,0x3a6472fd,0xbbb98218,0x3c022e10,0x3c2c2588,0x3bd851bc,0x3bc3b8d4,0x3a786f08,0xbb843ffa,0xbb9968bd,0xbaf451d0,0x3b98a118,0x3c1e6abb,0x3c3e130a,0x3c2f3d58,0x3c1bb43d,0x3c00bff7,0x3bb3a0a3,0xba73d310,0xbb427dc6, +0xbba8f423,0xbb7f3d68,0xbb839776,0xbbc8182d,0xbad687b1,0x39ca4e11,0xbb60144a,0xba0a303d,0xba809bfa,0xbbc4e0bc,0xbbc76067,0xbbfccf57,0xbc119527,0xbc600794,0xbb9d4885,0x3c09cf24,0x3adafaf8,0x39cc9b77,0xbc2d2c7b,0x3c33dc36,0x3c83dd94,0x3c6df9ef,0x3c1b87db,0x3add4467,0xbb1464f2, +0xba6c4800,0x3bac2aff,0x3c815c9e,0x3c657f4b,0x3c86f239,0x3ca7e363,0x3ca390e9,0x3c8c58b5,0x3c47db59,0x3abf1340,0xbb2843e2,0xbbc68aa9,0xbbba706f,0xbbb580ac,0xbc2241ab,0xbb87a80b,0xbb990eef,0xbc47e2e1,0xbbe28261,0xbbb9bbd4,0xbc1c1f08,0xbc02efa5,0xbbb51f05,0xbbbf0519,0xbc4e4ae0, +0xbd2670e2,0xbd1d870d,0xbaa7c083,0x3c792fc1,0xba035a3b,0x3bd7627c,0x3c0caa02,0x3c415bc3,0xbb91dd7a,0xbc071c99,0x3a2069ea,0xbb2fffe3,0x3b11c132,0x3c352f8e,0x3c9c2701,0x3ca3f2e1,0x3c2f0787,0x3c47650e,0x3c49ef9e,0x3b9e2fc1,0xbb85e419,0xbbbfe569,0xbb5b6011,0xbc1783bd,0xbc7dbb9a, +0xbccc2115,0xbb9b49ed,0x3b4b536c,0x3c341b5d,0x3c71a303,0x3bc237c0,0xbbd9a9c0,0xbce51786,0xbd26121a,0xbd3008b9,0xbd34f771,0x3b8919ab,0xbd07612a,0xbcdf9d1c,0xbc4fc37b,0x3c7e8330,0xbba4f43b,0xbc971a5d,0xbc97be80,0xbc28cae0,0xbbea924c,0xbbdb50ff,0x395f40e9,0xba6e90a3,0xba4ecfa6, +0xbb81cfc4,0x3b1654d0,0x3cc9b39b,0x3c3fc955,0x3bb92f65,0x3b89b706,0x3bde97fa,0x3bcbd78f,0x3bccddec,0x3c52ff23,0x3b2e7f5e,0xbcc818ef,0xbcccaa98,0xbcbd95cb,0xbcac3398,0x3b83f1df,0x3bfa5d47,0xbc5496eb,0xbb5120a0,0x3a82d9f0,0x3c0d6343,0x3c4a33e7,0xbdd38a77,0xbd877197,0xbc933287, +0xbc07da5c,0xbc4865d6,0xbc72ddde,0xbbe752b2,0x3b79eefa,0x3ae2e869,0x39dd1168,0xbb83503c,0xba6943ce,0xbbc843e3,0xb96d38ee,0xbba43730,0x3a00745f,0x3c9c52b8,0x3c818337,0x3c6af7f4,0x3b9440c2,0x3bbd0c25,0x3bc813e1,0x3ae8de1b,0x3bd98e83,0x3b44aac5,0xbb0688da,0xbc426d4a,0xbc87b9d8, +0xbcc11746,0xbc0a2bc1,0xbb1f5097,0xbcadfbdb,0xbcc4be76,0xbd50532a,0xbd96208e,0xbddc3808,0x3dd2bb58,0x3dc29e88,0x3d99c438,0x3d850aa6,0x3d62a5a7,0x3d2c6791,0x3cd021f9,0x3c1e91a6,0x3c1f03e6,0x3bb22ccd,0x37606280,0x3916346c,0x395bf670,0x3be2dbe0,0x3ba4979e,0x3be6ca96,0x3c723a97, +0x3c3f6593,0x3bba0d4f,0xbb9606aa,0x3aa81dfc,0x3b238396,0xbad80879,0x3c5154e7,0x3b5a05ae,0xbc74e9d8,0xbd478e45,0xbd5d03c2,0xbd188a7b,0xbbfbe804,0xbbbb91fb,0xbd18fb79,0xbd2c1492,0xbc964455,0x3d2690d2,0x3da4b2ed,0x3bff3449,0x3c0dfda6,0x3c405eee,0x3c8de43f,0x3ccf22cf,0x3ca436b4, +0x3caa1826,0x3cc2d0cc,0x3cab078a,0x3c8df1f3,0x3c52b604,0x3c906b8e,0x3c5bb00f,0x3b9e8d02,0x3b2ba17c,0x3b9ab729,0x3c845a9a,0x3bf3f732,0x3b73eec8,0xbb28a2eb,0xbbd06239,0xbc1e9644,0xbc84655e,0xbcf82818,0xbd2f46b7,0xbd3f5c35,0xbd77d248,0xbd572ddd,0xbcc33cd3,0xbc2c7171,0x3c73abb1, +0x3d2c71cd,0x3d798ef9,0x3d7e86a5,0x3d597358,0x3cbdc7c2,0x3c9ba44a,0x3ca87096,0x3ccea769,0x3cc8c22c,0x3cafc7f2,0x3c7e3648,0x3c45b04d,0x3c534c1a,0x3bd1e867,0x3b8e0013,0x3b72e858,0x3ba7aa07,0x3c2af252,0x3c52eaef,0x3c7a3ad2,0x3c65a883,0x3c6d2a31,0x3bf86a7d,0x3c04a3d2,0x3b960dbf, +0xb9162b03,0xbb85694c,0xbc16f662,0x3b009cb8,0x3c0717e5,0x3baa0219,0x3cd499e9,0x3d17d4a1,0x3d2cea02,0x3d3d6c80,0x3d2ead51,0x3ce83b48,0x3c7c604b,0x3c0ef71b,0x3bd79ecc,0x3c6d1ee9,0x3bf81b41,0x3c1cd92e,0x3c25c5f8,0x3c6845a7,0x3c98803d,0x3c995b87,0x3c9a1680,0x3c9da318,0x3c947706, +0x3c8e1081,0x3c6b6b5b,0x3c6b9629,0x3c2be74a,0x3c165cab,0x3c306099,0x3c7388fd,0x3c988cce,0x3c93cf38,0x3c8b0ee2,0x3c7a6203,0x3c979fec,0x3cb7ae65,0x3cc6254d,0x3ca642d3,0x3c8c2be2,0x3c57cab4,0x3c62ec83,0x3c661563,0x3c84eb43,0x3c1b7188,0x3b84fc62,0x39873c71,0x3b32b218,0x3b637293, +0x3aecfcb9,0x3b9013dc,0x3c22c9ac,0x3c155968,0x3c2f6db7,0x3c0ba460,0x3c0bbce1,0x3c078e38,0x3bf25a7e,0x3beb5823,0x3bbfbcdd,0x3bc8479b,0x3bbc6ca2,0x3bc6cb63,0x3bd6ab73,0x3bdcb276,0x3bfa5c19,0x3c069fe1,0x3bf14f60,0x3c0c1805,0x3c0bb387,0x3c609fa2,0x3c411d62,0x3c0ba1b6,0x3bfbb6be, +0x3bc57746,0x3bacca42,0x3b8f8d7d,0x3bce7710,0x3bf81cae,0x3c1aec7a,0x3c32300b,0x3c520d92,0x3c59aaa8,0x3c4608bf,0x3c373278,0x3c368d0c,0x3c2ed53a,0x3be1ecd4,0x3bc6b3ea,0x3c0e5293,0x3c211265,0x3c4ac7b3,0x3c00903b,0x3c24f6bd,0x3c4d96ed,0x3c4c872b,0x3c480405,0x3c47ca86,0x3c3fe441, +0x3c3cb852,0x3c383dff,0x3c16bad4,0x3c0c451d,0x3c45c4ee,0x3c32d4ec,0x3c28f85b,0x3c415f7c,0x3c263bbd,0x3c1ea043,0x3c0c1f97,0x3c025276,0x3bec4f87,0x3bc021d6,0x3bd596a4,0x3bda9c27,0x3bd82daf,0x3be8a7f2,0x3bf44d09,0x3c08d5a0,0x3c04ac0c,0x3c029d49,0x3bf9d62a,0x3beafbab,0x3c006a41, +0x3a86b66e,0x393d29c3,0x3ad5dbf6,0x399b3c2f,0xb8e7dfc8,0xbb048786,0x3af31c51,0x3ad107e2,0x39142bf0,0x398cf663,0xb9c0eeb2,0xbadcaf3e,0xbad23512,0xbab4a59c,0xba1288b0,0x3aad014b,0x3b189355,0x3a71900b,0x3a5f26c4,0x3a311743,0x3a4ca694,0x3a43aa6a,0x3a0d0139,0x3827e264,0x3a066930, +0x3a1f7928,0x381173d7,0x3ad76d8e,0x3af21ffc,0x3a9709f8,0x39cbcc2a,0x37c002fa,0x39d0deba,0xb9680f6a,0xb9ae51cd,0x393f6731,0x38359424,0xb96f0de6,0x3b5e8360,0x3aa8678f,0x3b3987fc,0xbaebb897,0x3ba20bdc,0x3bcd7475,0x3b5d0172,0x3b8565f1,0x3b02689e,0xbaf3deef,0xbacb64c6,0xb9cd7e58, +0x3aad4c72,0x3ba0d51a,0x3bd1e203,0x3bb22a7e,0x3b7e3ef5,0x3b11eee7,0x3a2b0cda,0x392b710c,0xba06f68b,0xbaf3e516,0xba41a128,0xb837217f,0xbaa1a602,0x3b5ca93e,0x3b5f47a0,0x3a7ed07a,0xba85c21e,0xbb06a38e,0xb9ffe7b3,0xbb00358d,0xbad6c1fc,0x3909cadf,0xbad9f32c,0xbaa1af13,0x3b5ab1e4, +0x3b4c117f,0x3b7bcb1c,0xbbb2bb2c,0x3c132af8,0x3c31fb30,0x3bad46be,0x3be8ec73,0x3b3f1e98,0xbba3b302,0xbb94d16f,0xbb1b1902,0x3b11f3e2,0x3c2e5a8f,0x3c4ec4fe,0x3c216eec,0x3bdae0b1,0x3b9e6608,0x3acf5f64,0xb88bd00a,0xba7c9866,0xbb759dd0,0xba786d53,0xb9847746,0xbb58f0a2,0x3bdb7791, +0x3bf1abbe,0x3b2a3d2d,0xbb143657,0xbbaffb39,0xbb16f0f7,0xbbc996e3,0xbbc9c105,0x39f9ec9b,0xbaf17824,0x3a422519,0x3c4c02b6,0x3c759971,0x3c304c3a,0xbbb1dd01,0x3c7674ad,0x3c9acc1d,0x3c651ad5,0x3c53c318,0x3b50b818,0xbb929fc5,0xbb887c09,0x3b2c0b59,0x3c429c9c,0x3c9315ad,0x3ca7b494, +0x3c897684,0x3c71a0e4,0x3c373bbe,0x3b7b3f2e,0xb9c4514a,0xbb1eaf17,0xbbf6a875,0xbb54d6fe,0xbab7d89b,0xbb906708,0x3c2ed430,0x3c1cdb33,0x3a1c9675,0xbbbc1046,0xbc157117,0xbb69ee3a,0xbbe510f8,0xbbabbd03,0x3bcb14e3,0x393946fa,0xbccf7472,0xbd13f557,0xbcd67aea,0xbc0fae0e,0x3a9a22fc, +0x3c2f9711,0x3c24b9bf,0x3b0daa68,0xbbdd64ba,0xbc1b271a,0xbb23b63a,0xbb91d2b4,0x3a849b94,0x3c13f109,0x3c9b60f7,0x3ca0d661,0x3be52754,0x3c2c24f0,0x3c05be1c,0x3b8d60d7,0x394a7b5e,0xbad6ad36,0x3a6592ca,0x3b791a2f,0x3b203174,0xbb7176ba,0x3bb44dd3,0x3c581e67,0x3cbfc131,0x3bc9d40a, +0xbb996391,0xbbba3759,0xbca78b6c,0xbcc45f02,0xbca7e306,0xbcd2d625,0x3b3e1b29,0xbc3be27a,0xbc3b6502,0xbb9a4f34,0xba1a6d84,0xbbd7d338,0xbc34a1f5,0xbc4f2d64,0xbc1075eb,0xbbdeebc1,0xbc02fcaa,0x3ae359a5,0x3ad7f6a5,0x39a4bb34,0xbb7fdf74,0x3a7caac0,0x3c9dfeed,0x3c620f06,0x3c405093, +0x3ba35478,0x3a1224f5,0xbb3ea4ce,0xbc0bee1a,0xbc58ad92,0xbc9fd2fa,0xbcc5289e,0xbca916b6,0xbc74415e,0x3c0258ba,0x3bdf2d34,0x3bf597cb,0xbb8cd12c,0x3b7cda94,0x3b6019b7,0x3afa49a8,0xbac2adbb,0xbdbd6b34,0xbd9789d5,0xbd30fa0f,0xbcd38a78,0xbc9f073a,0xbc7146dd,0xbc1289f0,0xbb086215, +0xba902b29,0x3a893687,0xbb6042db,0xbb1433ee,0xbbab8922,0xbb1952f8,0xbb2edcbf,0xbb75516d,0x3b486753,0x3c1a95dc,0x3c2da861,0x3ae2ebf9,0xbb24f721,0xbb50f0de,0xba51907f,0x3a283438,0xbc148a5c,0xbcc7268b,0xbcdcdefc,0xbca94bde,0xba6f9d71,0xbbab8964,0xbc2d0241,0xbcbbf8ec,0xbcf1bf0e, +0xbd047ca3,0xbcf1262f,0xbda84b08,0x3d877473,0x3db786d5,0x3db3c96f,0x3d912b49,0x3d6e5898,0x3d23aae1,0x3cbe3bd1,0x3b997117,0x3bee56e0,0x3b3fd25f,0xbabe0ec5,0x3b025afb,0x3ab4f1b5,0xba28f518,0x3a33903e,0x3b931654,0x3bee711b,0x3c62f5e1,0x3c5888ca,0xbafde56f,0x3bec49bf,0x3bd0c53e, +0xb9fc2f40,0xbbfac6a6,0xbc889815,0xbcdd35db,0xbd031eb1,0xbcf6a1da,0xbc9a52cc,0xbcb2300c,0xbcc178c6,0xbcb3a394,0xbd74cb35,0xbd50410e,0x3c3a8132,0x3d08f6d2,0x3d2d7525,0x3cddb88a,0x3cb5642c,0x3ccd34e2,0x3cd87ddd,0x3cbb633c,0x3cb0bec3,0x3cac6645,0x3c9cec61,0x3c802f17,0x3c2259b4, +0x3c1ebfc9,0x3c090546,0x3c3003f3,0x3afc8052,0x3985103f,0x3bda5b09,0x3b927eca,0x3b101e8a,0xbc5695aa,0xbcc55cdb,0xbcd02e93,0xbcaf7b05,0xbcd493d1,0xbce0af37,0xbd1fd42a,0xbd051c76,0xbd18eff0,0xbd499dff,0xbd1be9cd,0xbca8b18a,0x3bf88e3c,0x3d185ed5,0x3d727ba9,0x3d970f1b,0x3d62188f, +0x3c374327,0x3c82e4ca,0x3c9dce65,0x3c9c0946,0x3c74efa6,0x3c5afb85,0x3c3e0c37,0x3c2e8df0,0x3c3975e1,0x3c36d5cf,0x3c345ed9,0x3bda0e1f,0x3bd31f86,0x3c136444,0x3c70e435,0x3c90e3c8,0x3c9b6d06,0x3c17d025,0x3b63b583,0xbabfacc2,0xbbd6b1d0,0xbc3a8dfa,0xbc86610d,0xbc44958a,0xbc09c6b6, +0xbaf06524,0x3c562cf4,0x3cc86630,0x3d0319ef,0x3d2d4be8,0x3d323da5,0x3d1358dc,0x3cd26275,0x3c7c010a,0x3c1786ae,0x3c078ba0,0x3c789315,0x3c953891,0x3c8bf373,0x3c9817d2,0x3ca9d67b,0x3ca0d9ff,0x3c96930d,0x3c8ff99b,0x3c922f01,0x3c953b32,0x3c97d0fb,0x3c9b41f1,0x3c865a36,0x3c7a2712, +0x3c6ebd34,0x3c75c1d3,0x3c7e740f,0x3c7e3c28,0x3c78bdfd,0x3c74b35d,0x3c92e145,0x3ca6c52c,0x3cb30dd9,0x3cbf5369,0x3cc60f0e,0x3ccd2333,0x3ccc11b3,0x3cc5e61c,0x3cc333f7,0x3c81ae03,0x3c204312,0x3bb45c58,0x3c002d0d,0x3c17b38f,0x3c04dc9f,0x3c43f887,0x3bba8875,0x3b9ce23b,0x3bbe3728, +0x3ba4915a,0x3ba67fdb,0x3ba07da7,0x3b97f599,0x3b95c4bc,0x3b9c4c7e,0x3bbb680f,0x3bbe78ef,0x3bdb358f,0x3bf9d091,0x3c0c5aa8,0x3c2f2893,0x3c653ca5,0x3c7ebe8a,0x3c91d152,0x3c9196c6,0x3cd05acc,0x3cbe08e0,0x3ca72ca6,0x3c989384,0x3c84e25a,0x3c6bfc14,0x3c4c0df5,0x3c4e5662,0x3c4c7816, +0x3c571a08,0x3c599751,0x3c5bc309,0x3c40ab51,0x3c2563ff,0x3c0a63ae,0x3bf75c67,0x3bdbfb2a,0x3b9d1867,0x3b83e53e,0x3ba8f113,0x3bb85954,0x3bdffa3e,0x3ba06c09,0x3bc3dde4,0x3becd83c,0x3bed653c,0x3be5dc2f,0x3be6ee85,0x3bdeee6d,0x3bd9bc7d,0x3bce9ca3,0x3bf7e146,0x3c064156,0x3c0c0cc3, +0x3c2779e0,0x3c3503d5,0x3c58c522,0x3c342e57,0x3c2d4eaf,0x3c1e4ca4,0x3c12ff70,0x3c05fe55,0x3be85bcf,0x3be5ce23,0x3bd4f403,0x3bba2a32,0x3bb05430,0x3ba91c8f,0x3baf34d7,0x3bb61639,0x3bb981cf,0x3bb6e92e,0x3ba7bc60,0x3b94ef35,0x3b3a9819,0x3b27fcd9,0x3b2de41e,0x3b2d8927,0x3b0c5499, +0xb955c2d3,0x3b63666e,0x3b548761,0x3acb1a28,0x3b0d4993,0x3acba5c2,0xb8cad552,0x391930f5,0x39b566a6,0x3a23c461,0x3b39fc5b,0x3b808b04,0x3b301531,0x3b2e6314,0x3b1d9d36,0x3b06228e,0x3b141d27,0x3b09c192,0x3ab43f7a,0x3af8f820,0x3b12b133,0x3b0a9a64,0x3b7acf1f,0x3b76c008,0x3b0d3531, +0x3aa6bafe,0x3a717195,0x3b10510d,0x3a8e6cf6,0x3a9c5e82,0x3b19ffec,0x3b1b6da2,0x3b4e1769,0x3b7de1bd,0x3ba58429,0x3b8d1fb1,0xba821600,0x3ba4f287,0x3bd74ee6,0x3b7daca8,0x3bb496de,0x3b813d4c,0xb9cdc769,0x396763a1,0x3a7072a3,0x3ad433fd,0x3bc1e698,0x3bf04327,0x3be27014,0x3b94213c, +0x3b0c711e,0x3a31903c,0x3a9c8514,0x3a696f33,0xb98452ba,0x3a8f95e6,0x3b0581f4,0x3aba922f,0x3bcf3f54,0x3bc0d22c,0x3ae251f6,0x391376fe,0x392fd664,0x3ba2d0cf,0x3b47e493,0x3b5b09d7,0x3b96b1a6,0x3b54b9c2,0x3af5fe5b,0x3a8d828a,0x3b8a9197,0x3b68903a,0xbbb8681e,0x3c179455,0x3c2b7795, +0x3b7f4fd7,0x3c026c8d,0x3b91f551,0xbba13f96,0xbb3b9647,0xbac84325,0x389fd216,0x3c24265a,0x3c4dbcbc,0x3c3ee087,0x3bdf0f31,0x3b7d5ffb,0xb9333594,0x3a2275ac,0xba0f6428,0xbb77f540,0xbacd4504,0x39bb8308,0xbac38dc7,0x3c2622c4,0x3c1ecac6,0xba69bf41,0xbb9ca61b,0xbbf52fcf,0x3ac7519e, +0xbb212ce8,0xbb09ffa0,0x3ac28b89,0x3b1d3358,0x3a584396,0x3b4933f4,0x3c351ab9,0x3ba8743d,0xbc42418b,0x3c2df887,0x3c8e8a4e,0x3c2711ae,0x3c731642,0x3bb0ec97,0xbbd37998,0xbbabeb38,0x3a585d61,0x3bd7e0b6,0x3c962c77,0x3cae5db3,0x3c82d2a6,0x3c321099,0x3b783d21,0xbb5784c0,0xbb51f7cb, +0xbb7ce2aa,0xbbe9d84b,0xbb1a1fdc,0xb9ab7808,0xbba347c9,0x3c6779c4,0x3c399189,0xbba00ed0,0xbbe86096,0xbb9c7c32,0x3c3602d7,0x3c16911e,0x3c167ed0,0x3c0f36ad,0x3b64003f,0xbbbcc04f,0xbcefadde,0xbd1b7f20,0xbc9a7884,0x3c17b387,0x3c293bb6,0x3bffd00a,0x39b1dcd1,0xbc01fbe7,0xbc34b5c3, +0xbb85353f,0xbb8a6906,0x3a6ce2c9,0x3becaa26,0x3c848586,0x3c93f69b,0x3c36b26b,0x3c3d9d21,0x3c227955,0x3c56bc34,0x3bb91d93,0xba2b8b6a,0xbb7ec040,0xbc0ef8bb,0xbc091ff1,0xba329265,0x3bec674d,0x3c70e387,0x3cde8ced,0xbbaf47bc,0xbccd3192,0xbccaa9d3,0xbd15c411,0xbd08772c,0xbc9e4167, +0xbb81639e,0xbc76d1e4,0x3a3ccdee,0x3c1f20bf,0x3b64affe,0xbc4c57d6,0xbc8caf1c,0xbc73686f,0xbbbc3fa5,0xbc030fec,0xbbe7b3b2,0xbc07ad52,0x3ad106fb,0x3b30d7b2,0xba67b1d1,0xbb39897a,0xba474487,0x3bec7d43,0x3c3acae1,0x3c28b768,0x3aba1f91,0xbbae565e,0xbc2481ca,0xbc5b4efb,0xbc4cd1f2, +0xbc5b72f3,0xbc395ffa,0xbc8490c5,0xbc4ae783,0x3bc3d71e,0x3b8ed162,0x3c302d83,0x3c4a6113,0x3c9f288f,0x3c7fea96,0x3b3f089d,0xbc916eeb,0xbd317e7c,0xbd93d2eb,0xbd6a8519,0xbd1c3a5a,0xbcb0c345,0xbc28cd09,0xbb61fcf1,0xbbadb39e,0xbaa12a09,0x3b4231af,0xbadfb430,0x3a2e7775,0xba15274b, +0xbacd530e,0x3a9483ee,0xbb8d38d1,0xbc1896bd,0x3c03f08e,0x3c458462,0x3a44d5b4,0xbba8964c,0xbc29c58f,0xbc4326b5,0xbc993a5f,0xbcc74e2d,0xbcd95743,0xbcb7d7e9,0xbc59939a,0x3b593e08,0xbc4331f6,0xbccf93c6,0xbd10ba9c,0xbd0240f1,0xbc8b7418,0xbbd4bbfd,0xbcb298bc,0x3cc2acdf,0x3d5426f6, +0x3d9a0856,0x3d7fc98d,0x3d551d12,0x3ceef174,0x3c73feaf,0x3adf781b,0x3b9cd0a1,0x3a4210b4,0xbb137c5c,0x3a7a277c,0xb94a65e3,0xbb809de8,0xbaca81cc,0xb8d5fe5d,0xbb984ccf,0x3c4da13c,0x3c622662,0xbbc762e6,0xba871210,0xbb587d37,0xbb85cc16,0xbc587739,0xbc9046c5,0xbcdbcc44,0xbc827704, +0xbc8985d6,0xbccfc9b2,0xbcfa6bab,0xbcdbba56,0xbca206f0,0xbd25c700,0xbd48f392,0xbd1fb687,0xbc0b70ca,0x3d8dd031,0x3d4bb828,0x3d1c440a,0x3d0a98f9,0x3ce77b90,0x3cd9799f,0x3cc860de,0x3cb63ccc,0x3c9b2d28,0x3c565558,0x3b99b6af,0x3b529b38,0x3ba68704,0x3c5dbf9f,0x3b9c85ba,0x3b0f0ae6, +0x3a74370f,0x3adb360d,0xbb6cad84,0xbc8e4dd8,0xbcbd7111,0xbcf19136,0xbd028528,0xbccd6316,0xbcb43eee,0xbcff6ff9,0xbc3b72b2,0xbc5676bc,0xbd1b7438,0xbd1dd706,0xbd20da7b,0xbd03c196,0x3c236cfd,0x3d392a34,0x3d8dffc9,0x3d954938,0x3c7bb5ac,0x3c7d5a6b,0x3c7cd5c7,0x3c7c5569,0x3c41ae57, +0x3c518fec,0x3c5c7572,0x3c4b9038,0x3c87d8be,0x3c8ebf6c,0x3c714250,0x3c52ed24,0x3c2b3813,0x3c20969c,0x3c42f557,0x3c624398,0x3c5b4ceb,0x3c3419c6,0x3ba1757e,0xbb36f1fa,0xbbc1e4a5,0xbc009e21,0xbc13f151,0xbcb902db,0xbcd30503,0xbc9128c5,0xbc14d551,0x34d5f676,0x3c18850a,0x3ccfaa64, +0x3d16c52c,0x3d2d3f10,0x3d2c1287,0x3d0a2191,0x3cbaabc8,0x3c93bf65,0x3c8ffd02,0x3c99d6fd,0x3c98f2bd,0x3c9d0cdd,0x3ca9f488,0x3c91ee0a,0x3c6e21b4,0x3c3d4de5,0x3c5e6a4d,0x3c663ca1,0x3c8ec20d,0x3c808de9,0x3c86feda,0x3c69464d,0x3c7a3a9b,0x3c690790,0x3c6dec06,0x3c7ad5c5,0x3c859329, +0x3ca7110a,0x3cb147b0,0x3caecd7b,0x3cbfe192,0x3cded599,0x3cfcc947,0x3d09e717,0x3d07e0ee,0x3d083070,0x3d07c64f,0x3cd8c89a,0x3cadac12,0x3c964254,0x3c81834d,0x3c777fef,0x3c609d9f,0x3c887cc3,0x3c04319f,0x3c0780a5,0x3bb8c6fa,0x3bf81aed,0x3bd3dba6,0x3bceb215,0x3bf34371,0x3be26789, +0x3c0ad897,0x3c0ad1e5,0x3c16cde0,0x3c1e7e0c,0x3c3261df,0x3c45d45d,0x3c709b46,0x3c8afc41,0x3ca0a55b,0x3cb4d400,0x3ccdbcf5,0x3cc90924,0x3cbb8abe,0x3cb92a74,0x3ca9b5eb,0x3ca2a581,0x3c95eac6,0x3c8bb6a0,0x3c7cf110,0x3c61bfd9,0x3c4ffe3c,0x3c4197b0,0x3c34b1d8,0x3c1283eb,0x3c12763d, +0x3c09c0a3,0x3c025889,0x3bfd4dae,0x3bdc2c51,0x3be784ab,0x3b99ea0a,0x3b82dbea,0x3b543b69,0x3bc09ef5,0x3b9809d3,0x3b7be219,0x3b821702,0x3b91755f,0x3b9859c7,0x3bab26f6,0x3bb19349,0x3bb2e0b1,0x3be42ec5,0x3c028b75,0x3c06e8a9,0x3c0f4b8c,0x3c1e3cba,0x3c212788,0x3c24032c,0x3c27d3f7, +0x3c2e5ecf,0x3c2e5537,0x3c30e6e4,0x3c37eae2,0x3c272094,0x3c18c1ca,0x3c07626b,0x3bf58f89,0x3bde29c3,0x3bc781a8,0x3bd9578b,0x3be2421d,0x3beb9547,0x3be763ea,0x3bd4e40b,0x3b33e083,0x3b04dec5,0x3a8e56b5,0x3b223536,0x3b2e5f57,0x3a7a0520,0x3b5d1932,0x3b6a36b9,0x3b2b8ba4,0x3b621157, +0x3b456b6a,0x3acfe8cd,0x3af3975d,0x3b007547,0x3af345ad,0x3b49ee65,0x3b724254,0x3b972b51,0x3b64a58a,0x3b3b9456,0x3b0cfd2a,0x3b145428,0x3b0c2875,0x3adfadac,0x3b03bd45,0x3b1bf93f,0x3b48746a,0x3b66b8af,0x3b3f6b38,0x396e01a4,0x3a577e86,0x3a872776,0x3b275093,0x3b02594b,0x3b1caba3, +0x3b55cc21,0x3b1a3d25,0x3b3e1c69,0x3af3a9ab,0x3bb7f9a4,0x3b97a996,0xb9a305fd,0x3b98c0bd,0x3bb946e5,0x3b638873,0x3ba6abb9,0x3b852cc5,0x3a46b39c,0x3a2c3fc6,0x3a7b4da3,0x3acb6e97,0x3ba5bc6a,0x3bd4727c,0x3bfeda4e,0x3ba76f62,0x3b428306,0x3aca2290,0x3ae44737,0x3a9c94b0,0x39fe4234, +0x3a2063ff,0x3b006d70,0x3b8be4dc,0x3bc03afd,0x3b820d8c,0xbb163b15,0xbab28b88,0xb98a6a6b,0x3b9b937b,0x3b45223e,0x3b6a849e,0x3b9bf2f8,0x3b642c36,0x3a2cad95,0xbb2a397e,0x3b1dc658,0x3b621c87,0xbbc6f35e,0x3c0aeff8,0x3c170482,0x3b2969fb,0x3beb9b80,0x3ba3c43f,0xbb45330f,0xbaea1976, +0xbaaa25ff,0xb89451de,0x3bf382cc,0x3c334a27,0x3c5cb202,0x3c039569,0x3b840632,0x39f75e4c,0x3ab80dc1,0x38df93fa,0xbb01cf84,0xbaa0731d,0x3ab5956e,0x3bacc2f9,0x3c09cec7,0x3b9d03c7,0xbc15f8ce,0xbbdd914b,0xbbc67c05,0x3b6e1b4f,0x3ac42260,0x3b7dceb6,0x3bb9939d,0x3affe965,0x3ba84034, +0x3b519440,0x3c670ebb,0x3c2a88eb,0xbc2b72a6,0x3bfb1d3b,0x3c7c8806,0x3c0ace24,0x3c6c58a0,0x3bdf0090,0xbbd5949c,0xbbb793ec,0xb9e64388,0x3b81ff49,0x3c7e86ba,0x3c94f2cd,0x3c8f3ab4,0x3c31d67e,0x3b761bf0,0xbade8839,0xba93a02f,0xbb32bf69,0xbbac055c,0xbb84585a,0x399b1163,0x3be6f7a2, +0x3c390c75,0x3b696896,0xbc72a11d,0xbc250184,0xbb8de344,0x3c41fbad,0x3bf54bbc,0x3c2ace5f,0x3c071360,0x3ba2f8f6,0xbbc179c0,0xbca3bae1,0xbd2f4705,0xbccf79c8,0x3c9bb853,0x3c3adccf,0x3bd6d4de,0x3a90c1e9,0xbbe2dc27,0xbc264bc0,0xbbb9ca8e,0xbb11687e,0x3b0e0aeb,0x3b812199,0x3c3a7918, +0x3c81ad78,0x3ca35664,0x3c547ef6,0x3c26e639,0x3c49406d,0x3ba7959f,0x3a95b374,0xbac4854a,0xbc43b881,0xbc29f466,0x3b59ce83,0x3bf6c26f,0x3bee516e,0x3c3d6000,0xbcacb639,0xbd04d788,0xbc96b339,0xbcc7b80b,0xbca2fe96,0xbc3267d3,0x38e7aa60,0xbc66e442,0xbb9c801b,0x3c54e097,0x3ba993eb, +0xbcafa169,0xbcd93deb,0xbcc2f934,0xbc39a160,0xbc102ab2,0xbbb7e404,0xbbfaff26,0x39598b61,0x3a26ac68,0xbb3008c8,0xbb0d6cd1,0xbb2b4740,0xbb4b4512,0x3c108992,0x3c2f6350,0x3a943a98,0xbb88612b,0xbc189023,0xbc4c5df9,0xbbed9c29,0xbc0e88a5,0xbc6a22d5,0xbb673b18,0x3b229186,0x3c469f81, +0x3ba6127f,0x3b0aaacf,0xba76a3fe,0x3c076114,0x3be78d09,0xbabe14b9,0xbc4ce851,0x3bd84f3d,0xbd2257ef,0xbd43b8ac,0xbd118619,0xbcd05551,0xbc0f801e,0x3a9cbfed,0xbb46ee61,0xbaf83fbe,0x3b0af8a5,0xba99d052,0x3a907d2b,0x3ac3561f,0xb9a8a02a,0x3babfbdb,0xbadf9fc9,0xbc4f3c7a,0x3c1b4e11, +0x3c49d5e9,0xbb40c0de,0xbbd5ff2a,0xbc52aa85,0xbc93d49b,0xbcaf43fa,0xbca724f5,0xbc9eac7d,0xbc150707,0xbc5744ca,0xbcc761c1,0xbcc6d24b,0xbce2a7fe,0xbd1b9ec4,0xbcd14c0d,0xbc3d5b3b,0xbb8328f5,0x3c72a458,0xbcd4f72a,0x3c48d4f7,0x3d4960d0,0x3d3d4c9b,0x3d1b6767,0x3c82303e,0x3b686d18, +0xbb50ca10,0x3ac77491,0xbac13026,0xbb7b1f48,0xbaba3e3d,0xbb0e1f3d,0xbbebfea0,0xbb99532e,0xbb71d21f,0xbc13d041,0x3c40e045,0x3c47c324,0xbba5b702,0xbbfe0ba7,0xbc4482f4,0xbbef5fe5,0xbc3f31f9,0xbc79da6f,0xbccd223b,0xbc8b2de0,0xbc63649c,0xbc703cb9,0xbc4582c9,0xbc7735f9,0xbd0bfeba, +0xbc9a2732,0xbd02d1f8,0xbd94b9a9,0xbd453462,0x3d98bc38,0x3d8c1abf,0x3d5562df,0x3d2e19c0,0x3d08cc3d,0x3d037a24,0x3cf1e26c,0x3cbdd324,0x3c890e19,0x3c2135bd,0x3a3d5d04,0xb5d5f40f,0x3b6b20be,0x3c3ba986,0x3bd5280a,0x3b617d2a,0xbb6cd60a,0xbb438cbd,0xbbe6b598,0xbc5b9ab3,0xbc6900f5, +0xbcaaaf00,0xbcc12165,0xbcba699b,0xbc872f1a,0xbbb0769e,0xbaab6cc1,0xbb8efb54,0xbc5a66e9,0xbce4accc,0xbd22d3f7,0xbd59bd8f,0xbcaa257e,0x3c611e3a,0x3d2d0158,0x3d886642,0x3ce5339c,0x3ca36fe7,0x3c95c16c,0x3c9beceb,0x3c7f7054,0x3c87b76b,0x3c927145,0x3c91af33,0x3ca07149,0x3c9daab0, +0x3c8c9fd4,0x3c8b39ca,0x3c5a4a34,0x3bd722fa,0x3b926d2d,0x3b93cca4,0x3bbee29b,0x3c079cf7,0x3b90776a,0xbb6f6225,0xbbed3110,0xbc2ed40a,0xbc4966ce,0xbcc024f2,0xbcf2d6e7,0xbd0dc118,0xbd16e59a,0xbcfc537a,0xbc795a78,0x3b3aa416,0x3ccc021e,0x3d356595,0x3d6c71f1,0x3d6cf65f,0x3d417682, +0x3d15131d,0x3cb74ccf,0x3ca5d2fb,0x3c979ce5,0x3c94ded5,0x3c983804,0x3c7bfb3a,0x3c3b22d6,0x3c010a84,0x3c0dca24,0x3c16cf72,0x3c2f686b,0x3c25aa89,0x3c3ac124,0x3c28d24a,0x3c53014e,0x3c513cbf,0x3c5d4848,0x3c80b113,0x3ca257e1,0x3cb57dec,0x3caebea3,0x3cae6f02,0x3cae6c66,0x3cc4afea, +0x3ce00047,0x3cf71709,0x3d0c110f,0x3d1abf08,0x3d269556,0x3d13b168,0x3d03f8e2,0x3cfb9243,0x3cd2b9c2,0x3cbf37b8,0x3cb06ae4,0x3cb6e604,0x3c5b7ce8,0x3c57f26c,0x3c1f5363,0x3c50d5ce,0x3c39d087,0x3c32036d,0x3c4e79f7,0x3c4c1815,0x3c68be2e,0x3c5cfea5,0x3c5fb1a3,0x3c617b9a,0x3c695a1d, +0x3c6d10ff,0x3c6ba611,0x3c62f400,0x3c7a6e43,0x3c7d9539,0x3c8884e0,0x3c4143eb,0x3c4b86bd,0x3c6e995a,0x3c7baf32,0x3c89081a,0x3c8c4435,0x3c91317a,0x3c843db6,0x3c7609e2,0x3c752f56,0x3c80823a,0x3c8a4a5e,0x3c917d40,0x3c8ea0d4,0x3c887ec7,0x3c7e70d4,0x3c688118,0x3c67df3a,0x3c6c5309, +0x3c34d951,0x3c1601ac,0x3bc75601,0x3c4e7739,0x3c1d8e6a,0x3bd8b6a6,0x3bd75a11,0x3be37995,0x3bea608b,0x3bf46d2a,0x3bf6aeb6,0x3bf7a6b1,0x3c268981,0x3c47f39d,0x3c09b54d,0x3c1ffef9,0x3c328601,0x3c414388,0x3c5d2a43,0x3c65279e,0x3c7479cb,0x3c7f32e5,0x3c86f25f,0x3c91f805,0x3c8de84b, +0x3c8bf2d4,0x3c870642,0x3c83719d,0x3c7c8917,0x3c75029c,0x3c720193,0x3c714f68,0x3c713b27,0x3c6fc71b,0x3c83a4a6,0x3b1c8705,0x3adb1df9,0x391c7152,0x3ad1e6b7,0x3b059861,0x3a96b8f0,0x3b3fc49f,0x3b4af43a,0x3b147684,0x3b48bf4a,0x3b3c6e60,0x3b0be7aa,0x3af83e86,0x3af37a6d,0x3af48a5e, +0x3b306cd8,0x3b53d7d9,0x3b9bfc5c,0x3b6cf022,0x3b4ecc1c,0x3b24b680,0x3b1ca681,0x3b10cc72,0x3afc5c7c,0x3ae865bc,0x3b0530a4,0x3b6df6eb,0x3b25a58e,0x3ae6950b,0xba3bd56d,0x3a239f20,0x3a89c66b,0x3b0cbced,0x3b0bfd8b,0x3b21aeea,0x3b4b368b,0x3b0eb513,0x3a562d54,0xb9f7545c,0x3b87eb46, +0x3b86f88e,0x3ab21fdd,0x3b81e859,0x3b8bf6d3,0x3b37e5cf,0x3b8bbe69,0x3b767299,0x3af4e26a,0x3a40f917,0x3a501483,0x3aeb9e0b,0x3b872c9b,0x3bb7fea2,0x3c045156,0x3bc24b4b,0x3b8c10fa,0x3b4f77ca,0x3b43715a,0x3b0d927d,0x3acaf1af,0x3a46d3d3,0x3b00d350,0x3bcadeeb,0x3b3e1fb2,0xb986cfd5, +0xbbb6d9f2,0xbb35360f,0xb9b55f8b,0x3b73c4bf,0x3b79d9ab,0x3b864cbe,0x3b9049d4,0x3b05367b,0x398289a2,0xbb87c73c,0x3a2a7f72,0x3ade4b75,0xbb57fa76,0x3beabbb4,0x3beb844a,0x3ac8402e,0x3bbc2988,0x3b9f50dc,0x38ae3c53,0xba59af73,0xbaab73f5,0x3a600bb4,0x3bb5552b,0x3c1f4dcc,0x3c67783f, +0x3c1fe432,0x3bc61360,0x3b4fa908,0x3b7dd5d2,0x3b0c1799,0x3a6363e5,0xb9330db3,0x3af7b2a7,0x3c29e277,0x3b9246e0,0xb9542313,0xbc51d684,0xbbee8e4b,0xbb876216,0x3b2a0c8a,0x3b911107,0x3baa2640,0x3c0384b9,0x3b525275,0xb692a199,0xba480def,0x3c700d18,0x3c432e6d,0xbb8ccf72,0x3be152b7, +0x3c4dc82e,0x3bcbfd7a,0x3c4f8e6f,0x3bf7cb53,0xbb9d1749,0xbbc8d16c,0xbaf1cf0d,0x3b79c355,0x3c57fd2f,0x3c845de6,0x3c9c3b6c,0x3c4576d3,0x3be4f8f0,0x3b3b51fa,0x3b7c9073,0x3aa3f21b,0xba953b6d,0xbb1d8e84,0x3b21d082,0x3c86f180,0x3ba61320,0xbc060069,0xbcc06667,0xbc54fa31,0xbb28b39c, +0x3c18681f,0x3c23d906,0x3c3cb867,0x3c3a3111,0x3bb2c39b,0xbb8508d3,0xbc4ba4ad,0xbd36efee,0xbd00f73d,0x3caabfa6,0x3c316bfd,0x3bafc07f,0x3a35ac50,0xbbb20d02,0xbc0983d3,0xbbd71b15,0xb9fbdf0e,0x3b3ff939,0x3a80485c,0x3be934a2,0x3c58e9ef,0x3cc2c3d5,0x3c4eb233,0x3c03bdb8,0x3bc5f798, +0x3bc2a230,0x3bbea1a3,0x3b577bd8,0xba226b02,0x39f27bd0,0x3bf1beb2,0x3c25e4d7,0x3c436bf3,0x3c6adb7a,0xbce2454b,0xbd11a1db,0xbc508e18,0xbc65971a,0xbc209b48,0xbc08b491,0xb95ca9c1,0xbb8fb111,0xbb55d9b0,0x3c78ddd8,0x3c0843e7,0xbcaf54a7,0xbcc68f24,0xbcaa5273,0xbc5a2350,0xbc1e14fd, +0xbba35f42,0xbbcf6fdf,0xbab5deee,0x390640e8,0xba9581db,0x36519cd0,0xbb2a791c,0xbbe6d4dc,0x3c014555,0x3c35e75a,0x3b4802d0,0xb9b8b6ee,0xbbbf480a,0xbc029953,0xbc041906,0xbbfca926,0xbc389a91,0x3aec5c65,0xb75f2f43,0xbbc4a239,0x396296c7,0xbb0361d1,0xbc656ff3,0x39b7e972,0xbb7ad15f, +0xbcbe1d90,0xbc3075d3,0x3c93b353,0xbbe63dfc,0xbcca2490,0xbcbe618c,0xbc944c39,0xbc057a6a,0x39e455a9,0xbb626583,0xbb8eab1f,0xb7828a66,0x3a1fca10,0xb97e4376,0x391995ea,0x3968afcb,0x3bb3043d,0xbab54e20,0xbc2b2e56,0x3bd8423c,0x3bee00b4,0xbb9d443c,0xbbed10f4,0xbc47c6d5,0xbc655c8a, +0xbc82be5d,0xbc758c80,0xbc7e91f8,0xbb74c42b,0xbbc7371a,0xbcb94d2e,0xbcc405cb,0xbcc76a78,0xbd00212b,0xbc24c955,0x3aa42ca3,0x3befa72e,0x3cbdc1b2,0xbd9e7360,0xbcbb0044,0x3c6427e9,0x3ca012d0,0x3c934b8a,0xb905094a,0xbc0ba860,0xbc46df3c,0xbb861dcf,0xbba95a56,0xbbdf2d4f,0xbb158777, +0xbaa3ef00,0xbbfda43f,0xbbc67a7c,0xbbb93df3,0xbbed7ea2,0x3bd4d82d,0x3bfa2621,0x3ac6f6b6,0xbbb6962d,0xbc3359d9,0xbc10549f,0xbc0f87e6,0xbc0a7264,0xbc3e6d06,0xbc163cec,0xbc0f031d,0xbc0b0bdb,0xbc0eb9d3,0xbc5aa08e,0xbceccceb,0xbc6bfd0f,0xbcfb19ff,0xbd945f6f,0xbdad2376,0x3d8e7938, +0x3da2fa6b,0x3d83534e,0x3d582051,0x3d267bb8,0x3d2b0a6f,0x3d19b314,0x3cc9b822,0x3c819d5f,0x3c0cbf97,0x3b027b48,0x38f4af1a,0x3adcc22f,0x3bb72757,0x3b872da7,0x3aad083d,0xbbb9b2a9,0xbb9a59b1,0xbbe74650,0xbc0fd016,0xbc0f46a9,0xbc1348a7,0xbbddbccc,0xbc151acd,0xbb83abfd,0x3b8a667d, +0xbc094ff0,0xbc83294b,0xbc670179,0xbcaf837a,0xbcfd1f4d,0xbd40c061,0xbd2e84db,0xbc99b298,0x3cb45cfe,0x3d4be403,0x3d0e0abe,0x3cd52274,0x3cc629d5,0x3ccb0f3f,0x3cac33c3,0x3cb7cf1f,0x3cb3697c,0x3c94a9c0,0x3ca3b42a,0x3ca24a78,0x3ca16771,0x3c943a1b,0x3c51ed44,0x3b5860fe,0xba8fcf84, +0xbac2ee66,0x3ad212e3,0x3bd50635,0x3ba34c59,0xbb17abb5,0xbc12f576,0xbc7f0296,0xbca830f7,0xbcbdfc72,0xbceca6b7,0xbd170a91,0xbd379da1,0xbd2e95ba,0xbceda350,0xbc91535f,0x3b4b3555,0x3cee3e37,0x3d5200ee,0x3d717c77,0x3d5defdb,0x3d30c71d,0x3d01c089,0x3cdb7dae,0x3cb4d116,0x3c9f7cee, +0x3c855124,0x3c66a3a1,0x3c3807fe,0x3c0f145a,0x3c09dfbf,0x3c170ba5,0x3c0cc2a0,0x3c26834f,0x3c28a816,0x3c4c07dd,0x3c4cdeca,0x3c49e978,0x3c3ca628,0x3c33a28d,0x3c648c93,0x3c31866d,0x3c124acb,0x3c24db75,0x3c0e003f,0x3c4c55aa,0x3c80e4bd,0x3c9e0e75,0x3ce4ab1d,0x3d0eabe9,0x3d2744ed, +0x3d2d942b,0x3d33d022,0x3d3bde47,0x3d2090a7,0x3d141501,0x3d1113dd,0x3d0a18f9,0x3cb5afb7,0x3cae7e58,0x3c758f2d,0x3ca5ed7c,0x3c936bab,0x3c96572f,0x3ca27901,0x3c9ef075,0x3ca55b31,0x3c9a9380,0x3c91110b,0x3c90a71e,0x3c899b16,0x3c81a9ff,0x3c697072,0x3c5a8247,0x3c59bf44,0x3c455096, +0x3c29a6c3,0x3c0ddc58,0x3c3b71fd,0x3c6794f8,0x3c87a64f,0x3c9c45cc,0x3caf9e73,0x3cc1c755,0x3cbf8c87,0x3cc035e0,0x3cc71d17,0x3cd2dd80,0x3ce03604,0x3cf67504,0x3ced07af,0x3ce23822,0x3cd11786,0x3cbe94cd,0x3cb25e41,0x3cb6185a,0x3c99b8b0,0x3c8b2a10,0x3c648f69,0x3ca429c6,0x3c8d222b, +0x3c68a337,0x3c63313f,0x3c6518c8,0x3c68eec7,0x3c653d89,0x3c670946,0x3c69060f,0x3c8489ff,0x3c8f55b0,0x3c5c1b9c,0x3c7a0524,0x3c82907b,0x3c8c6d1e,0x3c982986,0x3c9e858f,0x3ca7a303,0x3cae2e8e,0x3cb4d8f3,0x3cbecbae,0x3cbedc4c,0x3cc19150,0x3cc27676,0x3cc3ec09,0x3cc3bc89,0x3cc56968, +0x3cbe32e6,0x3cbb6d20,0x3cb95689,0x3cb867aa,0x3cc04c92,0x3b21cba1,0x3ab99dff,0x39f8bec6,0x3ab02b38,0x3ae37b04,0x3ac32a9b,0x3b251212,0x3b13e90c,0x3ada8a50,0x3b131b8f,0x3b145801,0x3b12e62d,0x3ac47a28,0x3ab99709,0x3ac693fc,0x3b1340e5,0x3b3efda3,0x3b86054a,0x3b61afbb,0x3b5c6998, +0x3b4c689e,0x3b3c53c8,0x3b307790,0x3b1fd039,0x3b09188d,0x3b137614,0x3b79d0e2,0x3b062a7d,0x3ab20301,0x39b2d203,0x3a8e2543,0x3acd710e,0x3b1a843a,0x3b3c3603,0x3b357211,0x3af713ce,0x3ae9961c,0xb9f84914,0xbaa2f2fd,0x3af81288,0x3b4c1999,0x3b1ebba3,0x3b2d9a74,0x3b2ffa96,0x3b1f7ab7, +0x3b6811e4,0x3b66d815,0x3b413329,0x3aacabc4,0x3a9613dd,0x3af9caa5,0x3b7569c2,0x3ba94a49,0x3bf216e8,0x3bd1aac5,0x3baa0377,0x3b939c30,0x3b93d932,0x3b6cc439,0x3b42ac11,0x3af6ed34,0x3b07121e,0x3bacc366,0x3987cb47,0xbb0c4c5b,0xbb6c3d7b,0xbb2449f4,0xba09bc38,0x3aff7dd0,0x3b74ef5d, +0x3b612376,0x3a5d7d61,0x39494622,0xbb5e285c,0xbbfd4ed6,0xba774b6f,0x3ab23ea0,0x3a1b15b8,0x3ba02219,0x3b84e38c,0x3aa84c6d,0x3b84b9c5,0x3b93cb83,0x3b2f97bf,0x3a553b28,0xba14b647,0x3aa609e1,0x3b9c5b51,0x3c0d4dd1,0x3c57b84a,0x3c323d32,0x3c0a775f,0x3bbb367f,0x3bd08362,0x3b978491, +0x3b5de002,0x3aad3ff3,0x3b0930e8,0x3c1c47eb,0x38f0b095,0xbb6ca48f,0xbc0bcfbf,0xbbab0fd5,0xbaeb7a54,0x3b1fc543,0x3bf4faa0,0x3bc42ed8,0x39c2a212,0xb9f86382,0xbc1d3bd6,0xbc3f9c3e,0x3b71fb06,0x3bcc5e76,0xba90d1bd,0x3b7c7ddb,0x3bf9f937,0x3b60bdf0,0x3c1f8361,0x3bef04f9,0xbafbb5d7, +0xbbac6205,0xbb146d5f,0x3b5d42c7,0x3c383ef0,0x3c76aadf,0x3c9f1ef8,0x3c54454b,0x3c1b9d31,0x3bdbc7db,0x3c0774e2,0x3baf89d4,0x3b54ba6b,0x39b1ea6d,0x3b051c62,0x3c333d23,0xbb763762,0xbc710f38,0xbc9b94ac,0xbc4f13d1,0xbb621f0c,0x3b1d8b46,0x3c0cb5eb,0x3bd3de24,0xbae82248,0xbb7d7032, +0xbafac756,0xbb8bc43a,0xbd0f2b3d,0xbce6cf0a,0x3c8cce99,0x3c2e8e7e,0x3bda7332,0x39cc8480,0xbb200dd6,0xbba0b9f8,0xbbc5e8b6,0x3a7588b0,0x3b2268e5,0xba0fdca3,0x3bb49ca8,0x3c3db7bd,0x3cb12e20,0x3c64a8d6,0x3c17956c,0x3b94a78e,0x3c04c706,0x3bf33b9f,0x3ba1a36f,0x3b70e58c,0x3b74ee29, +0x3c0a40ed,0x3c16c9a4,0x3c5ddc9b,0x3ccb7b47,0xbc7ce224,0xbcb86dfc,0xbb52f497,0x3b857f8c,0x3bed13e1,0x39f1517e,0xba1148a8,0xb920923c,0x3ad13cad,0x3c78e898,0x3c1d6c44,0xbc642b53,0xbc9a12d9,0xbc8229fc,0xbc0572a2,0xbbfefd08,0xbb916b83,0xbb89c799,0xbac93896,0x3a9dd49d,0x3b05ccaa, +0x3b5c48d9,0xb9380248,0xbba8d426,0x3ba93ec7,0x3bfe300b,0x3bd20e86,0x3b7039c8,0xbae96427,0xbb7e5f93,0xbbe2b9e1,0xbb91d7ab,0xb99f95ab,0xbbc64ecd,0xbc2f0a6d,0xbc6bc114,0xbc803188,0xbc64e405,0xbc9767ea,0xbc0b150d,0xbc50c896,0xbcfca23e,0xbc1a4a4e,0x3c8965e4,0x3bc9a6db,0xbc492316, +0xbc867769,0xbc6a3914,0xbc20ae7b,0xbb502013,0xbc0fe9e6,0xbbccf50d,0xba2375f9,0x3ad48de0,0xb9b53674,0xba021fc3,0x3a837f93,0x3b45e547,0xbadbee39,0xbbbe9759,0x3b86d52e,0x3b82c63a,0xba152f73,0xbba6d04a,0xbc0bf5ae,0xbb8f6c64,0xbc0d25ae,0xbc05942e,0xbb78814e,0xbbcbf7e7,0xbbd28398, +0xbc39b204,0xbca16be8,0xbca90aa9,0xbc91419a,0x3a15e9a6,0x3c0e4afa,0x3c402fe6,0x3c95e7b6,0xbdca1b09,0xbd52dfe9,0xbcac91e4,0xbc27e57d,0xbba08f49,0xbc846643,0xbc93271a,0xbc98fc45,0xbc1b48cf,0xbc012b41,0xbbe516ab,0xba8626cb,0x3a3187f1,0xbb6dbe68,0xbb63f2a9,0xbb94a3cf,0xbbb59e30, +0xba7ca0c2,0x3af84763,0x3c0f1a33,0x3a021beb,0xbb97d0de,0xbbc04a74,0xbc00fe19,0xbba94909,0xb8078402,0xbb6e39a6,0xbbdb6b3b,0xbbdca12d,0xbc55eee4,0xbc6e7d39,0xbc1f343b,0xbcab9146,0xbd11fea4,0xbd4a0d99,0xbdbe2425,0x3d62068e,0x3d9209a6,0x3d8b3dbf,0x3d6ebe30,0x3d3adc83,0x3d4c37ec, +0x3d2bf4b4,0x3cb6c8c9,0x3c71282f,0x3bf2969c,0x3bac4433,0x3a0ab8f2,0xba8af00f,0xba1695a9,0x3a57df5b,0x38a6c08c,0xbbbb5495,0x3b069486,0x3988112d,0xbb4c1e98,0xbbc1d4e8,0xbbaf79ac,0xbb144f4f,0xba097643,0xbb825335,0xbc5796b4,0xbca56cfb,0xbcb81822,0xbc9f2bdd,0xbc9e406f,0xbcbaa0a3, +0xbce71533,0xbd441595,0xbd20321b,0xbb41a4ad,0x3cecab9d,0x3d12c2e8,0x3cf86ffc,0x3cf2b3dc,0x3cea0e02,0x3cc6cdac,0x3ccb8c94,0x3cbf6dc8,0x3c9e6664,0x3cb0c7ad,0x3cae6a02,0x3cae0a14,0x3c9193ce,0x3c522302,0x3be11ad2,0x3a4ff75a,0xba0f28cf,0xb92e8227,0x3b2fa50a,0x3b1229e2,0xbb766723, +0xbc33a8e1,0xbc86d7ac,0xbcb3c3a8,0xbccc4d1b,0xbce9421a,0xbcd9d574,0xbd028b0d,0xbd087912,0xbcef461d,0xbcf0d912,0xbcb432f0,0xbbc4f0df,0x3cc690a9,0x3d26aee5,0x3d2af534,0x3d209cd2,0x3d1f63fc,0x3d0331e8,0x3cdcbb89,0x3cc51ac4,0x3c9fab7c,0x3c8f6fa6,0x3c81deb4,0x3c57ffe2,0x3c43e755, +0x3c492ab6,0x3c2aaba9,0x3c51046f,0x3c538738,0x3c81ab6d,0x3c66078c,0x3c4e1063,0x3c2cd253,0x3bc93051,0x3b8bbaa0,0xba96150b,0xbaf94dfb,0xba870d66,0xbab3c18b,0x3b681c3b,0x3be5cd6e,0x3c294f7f,0x3c7865d1,0x3ca3cd69,0x3cc724fc,0x3d0b0daf,0x3d34bf6b,0x3d57cbd1,0x3d494248,0x3d43101c, +0x3d4c3435,0x3d341a15,0x3d00b061,0x3d02a021,0x3cd22dde,0x3cef949d,0x3cd92912,0x3cd88f3d,0x3cd7df49,0x3cd02638,0x3ccf7c4a,0x3cc40ca9,0x3cb5e6b9,0x3cb09e5f,0x3ca2a518,0x3c92a2dc,0x3c854f23,0x3c813689,0x3c7e3ed3,0x3c711e3e,0x3c50fa5b,0x3c598c72,0x3c81a3d4,0x3c8ed9a0,0x3c9a3bfb, +0x3ca5f0a7,0x3cb3e3ed,0x3cc30888,0x3cd01a3c,0x3cda950f,0x3cdef572,0x3ce9474f,0x3ceb4eb7,0x3d0021ae,0x3d00391c,0x3d023a93,0x3d0141d0,0x3cfdc8dc,0x3ce094d1,0x3ce9fd90,0x3cd1c13f,0x3cc4c62f,0x3cb047d6,0x3cd0fd89,0x3cbe2f66,0x3caba265,0x3ca697db,0x3ca35d3e,0x3ca24e3e,0x3c9ccab5, +0x3c9ae81e,0x3c9977f6,0x3ca7582a,0x3cadd7f2,0x3c91094e,0x3c9dd6dc,0x3ca1eb77,0x3caa2728,0x3caf9ce8,0x3cb628e4,0x3cbecc1b,0x3cc48913,0x3cc98421,0x3cce888b,0x3cd0e44b,0x3cd618b7,0x3cdd9e87,0x3ce1141b,0x3ce4dbd1,0x3ce705bc,0x3ce37af2,0x3ce15877,0x3cdf10b5,0x3ce27130,0x3ce2b0db, +0x3b3fabac,0x3aba93bc,0x3a9b3e21,0x3afabf9a,0x3b1d9de2,0x3b2e1979,0x3b3ab023,0x3b13b276,0x3b066437,0x3b153e8d,0x3b220ed2,0x3b49c470,0x3b094112,0x3b001839,0x3af2d864,0x3b2b02aa,0x3b50c200,0x3b81597f,0x3b8065b0,0x3b81addb,0x3b70f4ad,0x3b65b802,0x3b5a1af5,0x3b497f23,0x3b3167c8, +0x3b2d6b1f,0x3b7005f9,0x3ade36a9,0x3a8aacb5,0x3a4a6f12,0x3ab2d35a,0x3af5cc16,0x3b17f18f,0x3b4c61bf,0x3b4b19d5,0x3af5dae4,0x3ae638a8,0x3a090694,0x3a05d69e,0x3ac0109f,0x3b624148,0x3b9d7975,0x3b264b26,0x3b012003,0x3b3f0b90,0x3b54f357,0x3b6c458e,0x3b96463c,0x3b1e5a73,0x3afadf1e, +0x3b0516de,0x3b732af1,0x3ba6fbf7,0x3be105be,0x3be5f38f,0x3bd1abb6,0x3bb44d0b,0x3bb42904,0x3b976fc3,0x3b7b7719,0x3b312fc0,0x3b0ebd73,0x3b8d47cd,0xbaa017fa,0xbb3aaa15,0xbb0c4bab,0xba94147c,0x3a29d1d2,0x3ad11596,0x3b81dfbc,0x3b7557c3,0x398230dc,0x3a345732,0xbb8ddc9c,0xbbc445d6, +0xbad44c15,0x3b491c39,0x3bbd8746,0x3b653add,0x3b061529,0x3b28ffde,0x3b3f210a,0x3b91250b,0x3bc3f60e,0x3b2fc175,0x3a29cdce,0x3abc94e7,0x3b983100,0x3c0189c1,0x3c42b6fd,0x3c415976,0x3c2d8f31,0x3bf684b5,0x3c00c53c,0x3bccdaed,0x3b96456f,0x3b253fe4,0x3b0c8ed2,0x3bee3096,0xbb87b93a, +0xbbeff29c,0xbbfd7317,0xbb97e908,0xba821797,0x3a3c67ab,0x3bc9e07f,0x3bc1c636,0xbb48376b,0xbb7913bb,0xbbbd2e85,0xbbdf6fea,0xba40a064,0x3ba4ef0a,0x3bba88a7,0x3a854316,0x3b3e1a63,0x3b426aac,0x3be2af9b,0x3bd7087d,0x3b0d2cb8,0xbb393eb9,0xbacfd40b,0x3b0d38b4,0x3c114dd5,0x3c57040b, +0x3c960e45,0x3c6cb455,0x3c496cea,0x3c17a67d,0x3c2a91cd,0x3bf6137c,0x3b9ad9a1,0x3ac6a339,0x3a871790,0x3bdc8b6f,0xbc28b2f0,0xbc907059,0xbc74a668,0xbc1397ab,0xba7c1be9,0xba52999a,0x3bd22bc7,0x3bb238e7,0xbc0b912c,0xbbe66107,0xbbd94531,0xbbed40df,0xbcbcc53e,0xbc97b385,0x3c6725f8, +0x3c576c04,0x3c3219fc,0x3b15db96,0x3a072303,0xbac0b377,0xbb781f3d,0x3b192b67,0x3b1d4bf6,0xba458f73,0x3bb601a2,0x3c349fbf,0x3c978001,0x3c891f3c,0x3c674c4d,0x3c018c07,0x3bffe4ca,0x3bb5149a,0x3b660cab,0x3aafa4e6,0x3b058113,0x3c1a881e,0x39a39cdd,0x3b150ffd,0x3c8c35aa,0xbc5868f7, +0xbc81193b,0x3ac4d143,0x3c325e88,0x3c56d83c,0x3b354c7b,0x3a83d95c,0x3c15a4d3,0x3c4a142e,0x3bd9fa2f,0x3b330268,0xbc3561af,0xbc8066e3,0xbc636325,0xbbea82de,0xbbbb75a6,0xbb2e2dbb,0xbb0c4858,0xbaed4d22,0x3a1412a2,0x3b29ef90,0x3ba704c8,0x3b0c556b,0xba5fdf7e,0x3b53342d,0x3ba6ff12, +0x3c25dd79,0x3bbc148b,0x3a286848,0xbb5fafb9,0xbb842412,0xbb5a5d2f,0xbac6a279,0xbc2d5df5,0xbc543376,0xbbcb26b5,0xbc371260,0xbc46b5de,0xbc19fc95,0xbcaf53a5,0xbce19ffe,0xbcf32177,0xbbb171f5,0x3c2f7ad0,0x3c54f02f,0x38962fe8,0xbc012619,0xbc97310d,0xbc272147,0xbbb6fbd9,0xbc3ae760, +0xbbf32c87,0xbae4362e,0x3a806ac0,0x39c33ec1,0x3a95ff17,0x3b170c65,0x3b155ede,0x3a36383d,0xb92d68d9,0x3b8f867a,0x3b97522c,0x3c0e5c00,0x3a740119,0xbab555c8,0x3b4ce3e0,0xb8c0f367,0xb93836b9,0x3a989f7f,0xbb0efa48,0xbbc72606,0xbc248560,0xbc83c95c,0xbc6d557e,0xbb0ed523,0x3c2aa362, +0x3c7b8c70,0x3c4cf632,0x3bf51db5,0xbd948b7e,0xbd859bde,0xbd3c52f5,0xbd05bf30,0xbcc61dd5,0xbcbb97de,0xbc973b57,0xbc8a27dc,0xbc32d282,0xbbfaaa8d,0xbb7d9a8b,0xb8f2ce27,0x3a84ecc9,0xba5496ab,0xb975e71d,0xbb07e4a7,0xbb8f26bd,0xbb87f009,0xb9458308,0x3c431f8b,0x3b48bc0d,0xbaca056a, +0xbbce5c5f,0xbbcc643e,0xbbb3c253,0xbbb626a0,0xbb952f31,0xbb5f9476,0x37b0f23d,0xbc071cfa,0xbc585b1a,0xbbeef310,0xbcc1952e,0xbcf2fc5c,0xbcea9489,0xbd77206d,0x3cd059bf,0x3d399801,0x3d6c2e5c,0x3d5a4218,0x3d36c5b2,0x3d438f2c,0x3d144d91,0x3c69af1a,0x3c27f157,0x3b90b684,0x3ba6cb84, +0x3a01887f,0xbaec0d40,0xbb68a2f5,0x39db79b9,0x3a98ada1,0xbb66a792,0x3ba2c6e3,0x3b93f490,0x3b83ca23,0xba8a8501,0xbb81cc9d,0xbad2a6b0,0xbb80f63d,0xbc4726d0,0xbca5e3b6,0xbc7697aa,0xbc7c8aa3,0xbca75daf,0xbc9d3283,0xbca0012b,0xbc9d9b26,0xbd130fa7,0xbd296669,0xbd04c572,0x3a883b28, +0x3d1cdf5d,0x3d1637e9,0x3d11c131,0x3d0473dd,0x3cde06f4,0x3cc43e77,0x3cc55144,0x3cd98fe1,0x3ccd316e,0x3cba2e07,0x3caa6873,0x3c8a3235,0x3c697cb5,0x3c6012c6,0x3be89b77,0x3b540192,0xbacf453d,0xbb329e6c,0xbb9f95d8,0xbc09bf85,0xbc67fedb,0xbc8dbfa4,0xbca03eba,0xbcc7e51d,0xbcc07d61, +0xbc8172d9,0xbca43fe6,0xbcb794bb,0xbcd4b6b6,0xbcf63aad,0xbd0714a7,0xbd025df8,0xbc0dd11c,0x3c53bf44,0x3ce2b839,0x3d0de7cf,0x3d1b6694,0x3d08d638,0x3cfcadfb,0x3cec35a1,0x3cd2d617,0x3cc76e06,0x3cbc813e,0x3ca72c46,0x3c909a62,0x3c89874b,0x3c642131,0x3c6a14b9,0x3c6080c5,0x3c604320, +0x3c4c25e0,0x3c2d89b9,0x3c150a0c,0x3bac4405,0x3a9a7dac,0xbb05c0e4,0xbb1510a6,0xbb51e013,0xbb784c72,0xbb13fa63,0xbb146198,0xbb278469,0xbb165766,0xba86218b,0xba3846c7,0x3c707f85,0x3cf884ee,0x3d36aa55,0x3d3ab1c7,0x3d3c05b5,0x3d4ade22,0x3d2e6657,0x3d04bf8a,0x3d0a209c,0x3d07049a, +0x3d02c3d2,0x3cfc03fe,0x3cf531b0,0x3cef192e,0x3ce70885,0x3ce400ba,0x3cd9fb02,0x3ccfc5b9,0x3cc6a4c9,0x3cb9a89c,0x3caaf6a1,0x3ca0b751,0x3c95b0c0,0x3c8e8471,0x3c879f89,0x3c84b6b9,0x3c68eeec,0x3c824961,0x3c8e9dc8,0x3c97f398,0x3ca27147,0x3caefbad,0x3cbb86d4,0x3ccbcca0,0x3cda0264, +0x3cdd900b,0x3ce1e0c3,0x3cd6461d,0x3cde4fba,0x3ce0112e,0x3cec9e43,0x3cf4bf26,0x3cffa305,0x3ce56744,0x3cea360d,0x3ce73a44,0x3ce36edc,0x3cdbde74,0x3cde4f98,0x3cd83e86,0x3ccd4091,0x3cc90505,0x3cc50655,0x3cc2a2f3,0x3cbe9371,0x3cbc3d9b,0x3cbac87c,0x3cbdef8b,0x3cbb8bf9,0x3cb3cea1, +0x3cb38517,0x3cb16f07,0x3ca6415f,0x3caeebd5,0x3cb46818,0x3cbb13ef,0x3cc00dbb,0x3cc4cfb7,0x3cc9c868,0x3ccc41f6,0x3cd06f8d,0x3cd82d1d,0x3cd9c4bc,0x3cde9c18,0x3ce01aa1,0x3ce186b0,0x3ce11aab,0x3cdfa9ae,0x3ce3383d,0x3cec84f5,0x3b7475cb,0x3b17ac57,0x3aedcf85,0x3b293d19,0x3b4c96a7, +0x3b8aad43,0x3b67b754,0x3b33d94b,0x3b35a8e4,0x3b24f0bf,0x3b378dfe,0x3b82be50,0x3b34275a,0x3b223e7e,0x3b0d971d,0x3b4e8518,0x3b77e311,0x3b8160a4,0x3b922014,0x3b98ff38,0x3b940f56,0x3b8b2dd5,0x3b842370,0x3b75e814,0x3b68995f,0x3b5a79b7,0x3b7af7d7,0x3af74cca,0x3aad69cf,0x3a8a0397, +0x3b1caaff,0x3b482f25,0x3b52e22b,0x3b83d460,0x3b8338e0,0x3b375395,0x3b351608,0x3b0690a4,0x3aabff61,0x3b1ad562,0x3b9b619b,0x3c0b54c2,0x3b55b099,0x3b088d84,0x3b861d96,0x3b6954b1,0x3b873f22,0x3bd0668f,0x3b65e58e,0x3b34d0f1,0x3b22fcc9,0x3b81e38f,0x3badbcca,0x3bdc9bbf,0x3bfe7484, +0x3bf11d9e,0x3bd3ffab,0x3bd1edc3,0x3bb8bf9b,0x3b9a6535,0x3b87403e,0x3b57de42,0x3b85413b,0xbad12a43,0xbb4f697b,0xbb35821a,0x39f76ee9,0x3b303fbb,0x3b2dc0d1,0x3b9e9f42,0x3b8df862,0x3a7a95bc,0x3b0bca44,0xba90dec2,0xbb3e7e03,0x3a195765,0x3b9f96c6,0x3c552341,0x3b636c45,0x3ae0af71, +0x3ba93871,0x3b3cf4f2,0x3b95ad8e,0x3c190223,0x3b851257,0x3aca30a7,0x3b048aef,0x3b9b0440,0x3bfe4570,0x3c334e22,0x3c4de151,0x3c451636,0x3c185d46,0x3c12c3e0,0x3bee98de,0x3bb8f4fc,0x3b92afa1,0x3b59c3da,0x3bc17664,0xbbbd1322,0xbc113cb7,0xbc172e50,0xbadf7517,0x3b503096,0x3b218742, +0x3bf4c58a,0x3bdf32ce,0xb9a7ba20,0x395dcaaa,0x3a99751f,0xb892a508,0x3b8b8b52,0x3c169455,0x3c961d2e,0x3b14397c,0xb86cfeeb,0x3b923070,0x3ba7d742,0x3bd68c20,0x3bf04922,0xb99141e3,0xba9e1d14,0x3b03ce2f,0x3bf30b84,0x3c43c483,0x3c89a9d5,0x3c864f73,0x3c7a95ff,0x3c4452e1,0x3c510504, +0x3c21e7fc,0x3be753cc,0x3ba8f6e6,0x3b72abde,0x3bc61f05,0xbc4b97fa,0xbc9af046,0xbc8c261b,0xbb927376,0x3b7c66c4,0x3a0b12e4,0x3bdbfe04,0x3ba75246,0xbbd7c801,0xba76fe81,0xbbe3393d,0xbc4997df,0xbc8f5534,0xbc556c69,0x3bcfb287,0x3c448de2,0x3c5bd63b,0x3be83844,0x3b34dc30,0xb9a0b35d, +0xbb203640,0x3b4b1e0a,0x3b54bf59,0x39806d7c,0x3bc54734,0x3c2d9ae2,0x3c82b0ff,0x3c9f054b,0x3c94f4ef,0x3c0b70f3,0x3c038f7d,0x3bb700f1,0x3b39463a,0x3a6713ec,0x3ae9c7af,0x3bd4b7b4,0xba50b1f0,0xba972b1e,0x3b67e920,0xbc2abaa7,0xbbf8603d,0x3c363486,0x3c589d83,0x3c79fb91,0x3c1f5a88, +0x3b80d5c3,0x3c7fe2a1,0x3cfa7e33,0x3b4ba612,0xbb8d788a,0xbbee1394,0xbc2f98d7,0xbc3444c6,0xbc0c4374,0xbba61462,0xbad24e58,0xba90ab91,0xbb32704a,0xba509b9e,0x3afea78d,0x3bb284bd,0x3b704a2b,0x3b3fff28,0x3b2d89f4,0x3b8828a1,0x3c450039,0x3bee5c49,0x3b88a703,0x3af7cdf9,0xbb1cfa45, +0xbb978803,0xbbdc438c,0xbc167f0d,0xbbf68d35,0xba8b0b02,0xbb198bbc,0xbba5119c,0xba853da8,0xbcf8e059,0xbd17ae01,0xbcc49789,0xbbb33079,0xbaa1d660,0x3c1a5f12,0x3c1db368,0x3a20f05b,0xbc9e376c,0xbc178e84,0xbb9716f2,0xbc28b8bb,0xbc00283b,0xbb557774,0x3a110ac2,0x39c79f43,0x3b1084fc, +0x3b1a2952,0x3b3cf0ee,0x3b634ca0,0x3b8ded46,0x3b7e9548,0x3ba790d7,0x3c8e2a93,0x3bdd01f6,0x3b84e18e,0x3bcdf511,0x3be5df63,0x3ba6efc5,0xbb1dc69f,0xbb4e01be,0xbbca758d,0xbbe18995,0xbbec185a,0xbb890b26,0x3bb0b18f,0x3c90ff97,0x3c8dd06b,0x3b9bc3ec,0xba9c219c,0xbce7bded,0xbd662eb5, +0xbd613204,0xbd32ea25,0xbd0b59a2,0xbcac7b0b,0xbc4ec137,0xbc4ba2d0,0xbc1bd66f,0xbbcbadd1,0xba84320a,0xb7b0e197,0x3a842f99,0x39a5062e,0x3aa9e663,0xba351788,0xbb065894,0xbb820799,0xba5abd3a,0x3c58e3d6,0x3bbf3704,0x3aeed77e,0xbb889ac4,0xbbed932c,0xbc473b13,0xbc623713,0xbc292fbf, +0xbbd45072,0xba3d1167,0xbaf36a65,0xbc0a320b,0xbc7b221b,0xbca7f7cb,0xbcb818af,0xbcd04bb9,0xbc9c3eab,0xbc8c1e96,0x3c0b2cc8,0x3d052bef,0x3d121951,0x3d0a5cd0,0x3d09a4de,0x3cadee13,0x3b6165e8,0x3b56761b,0x39839cba,0x3aeb480c,0x3a8007fd,0xb9f16afd,0xbb7e6287,0x3acfbe25,0x3b457b1c, +0x3a8b0329,0x3a98eaf4,0x3ae4dae1,0x3bf3996a,0x3980e51c,0xbb9906a5,0xbbb9a9be,0xbc3b865b,0xbc528eda,0xbbecb2a1,0xbbea186c,0xbc18b626,0xbc324a28,0xbc7c3626,0xbc85eb1e,0xbc7f8c99,0xbc93440f,0xbcf2bd86,0xbd3a5041,0xbcf6268e,0x3d2c7a67,0x3d3b4a1b,0x3d34ca05,0x3d22e685,0x3d0e7c21, +0x3cdc68e7,0x3ce04d69,0x3d0c4d35,0x3ce77161,0x3cc1f383,0x3c9d2761,0x3c81b2bd,0x3c790a3d,0x3c89399a,0x3c2861c4,0x3b78fee4,0xbb81c584,0xbbd4f5f3,0xbc1f192d,0xbc152ee3,0xbc5cda3c,0xbc76b102,0xbc47e35a,0xbc8d91e8,0xbc827e75,0xbc5c3ba8,0xbc87d368,0xbc949fe2,0xbcbbbdfa,0xbcdd761e, +0xbd05e40d,0xbd1c3c47,0xbd01ed0e,0xbc555fd5,0x3c83d29d,0x3cfbf177,0x3cf6dcf4,0x3cf52e91,0x3cefcff3,0x3ce896fc,0x3cdbc8ed,0x3cdfc712,0x3cdcfa87,0x3cd54a36,0x3cb9d319,0x3cab81b6,0x3c912e81,0x3c75f9aa,0x3c45b828,0x3c0d6517,0x3c0a64c9,0x3bef2ce1,0x3bcde879,0x3bb12946,0x3b61849a, +0x3b0e334a,0xb96e51e7,0xbb57324a,0xbbccc891,0xbc0bebe2,0xbc375caf,0xbc66b166,0xbc6a6da9,0xbc729150,0xbc871c4c,0xbb51fb09,0x3c14e736,0x3cab1017,0x3cdf467e,0x3cff08b4,0x3d132ed3,0x3d0128c9,0x3ce3e6a7,0x3cf048ef,0x3d031fec,0x3cf0d5da,0x3cf56453,0x3cef473f,0x3cea423b,0x3ce95f15, +0x3cde3424,0x3cd44dd5,0x3ccd1a79,0x3cc0813c,0x3cb6364f,0x3ca91717,0x3c9c010f,0x3c80b0fb,0x3c631df6,0x3c3d0ac8,0x3c455763,0x3ba46c69,0x3bd9f7aa,0x3c15b9e2,0x3c3473ce,0x3c51ff29,0x3c6bb0d3,0x3c8095ce,0x3c8a901e,0x3c99aab5,0x3ca3d29a,0x3ca91437,0x3ca423c9,0x3ca83f8e,0x3cab6cc2, +0x3cb7a8a9,0x3cc54f40,0x3cd8ec34,0x3cd44b4c,0x3cd5b32b,0x3cdeb789,0x3ce16c10,0x3ce287f9,0x3cda86c2,0x3cdccdbc,0x3cdae3fa,0x3cd6e1b4,0x3cd281c1,0x3cce0e39,0x3ccaff8d,0x3cc82dda,0x3cc5ce1c,0x3cbbc739,0x3cb2ef4e,0x3cba6ca4,0x3cabd655,0x3ca3fe57,0x3c89ba2c,0x3c987d55,0x3c98d00d, +0x3c9be89a,0x3c9f2590,0x3ca37b23,0x3ca8ae0c,0x3caf20cc,0x3cb48559,0x3cbb9ce9,0x3cbea2ee,0x3cc52750,0x3ccae5d7,0x3ccd45b7,0x3cce5364,0x3ccdc21a,0x3ccfde0d,0x3cee5d3f,0x3b92885e,0x3b53e759,0x3b42b81a,0x3b53f3e1,0x3b796571,0x3bc098e4,0x3b8409bd,0x3b570cdf,0x3b7960bf,0x3b5086f4, +0x3b62dfda,0x3ba174c5,0x3b679dbd,0x3b4fb0ed,0x3b399912,0x3b716aac,0x3b8a471a,0x3b8d5eaf,0x3ba0d638,0x3ba9b5d6,0x3badd0ef,0x3b9f4533,0x3b97015b,0x3b8e1dc6,0x3b8bd636,0x3b80d10d,0x3b6ea8df,0x3b1838a7,0x3afbc1ef,0x3add2827,0x3b630aca,0x3b861e47,0x3b6a00ce,0x3b9eb4eb,0x3b9cb53c, +0x3b5db84e,0x3b6b9d9a,0x3b4dc5e7,0x3b27ac20,0x3b5168a2,0x3bc44579,0x3c352fc0,0x3b83d407,0x3b2725a7,0x3bacf65a,0x3b83f4d1,0x3b986363,0x3bf2f67d,0x3b8c3fb8,0x3b66a67a,0x3b50a3ff,0x3b92fc1e,0x3bb87662,0x3bd7ab31,0x3c063870,0x3c025038,0x3befb0a7,0x3be37de9,0x3bcafed3,0x3bb0cf7f, +0x3babcd74,0x3b7bdf9e,0x3b1ae85e,0xbadff15b,0xbb2d16b6,0xbb0f8372,0x3b204e7d,0x3b901c08,0x3b20c7e0,0x3bb1a568,0x3b9cecc7,0x3acd5698,0x3b34c916,0x3a89edb9,0xbac78b9e,0x3af9d93d,0x3bc46abd,0x3c8dd052,0x3b797d24,0x3afb9f1f,0x3bef5d28,0x3b62b94c,0x3b9ad970,0x3c361dc2,0x3b9b2bb6, +0x3b1588a1,0x3b35d21c,0x3ba61233,0x3bfbb7ed,0x3c20cded,0x3c4f2486,0x3c4fde2e,0x3c2d6dce,0x3c18fb61,0x3bf8638d,0x3bccbaf7,0x3bba9bd6,0x3b646d4a,0x3acf66e1,0xbbd3fb43,0xbc0f2785,0xbc123828,0x3abb8f5a,0x3bc17d72,0x3a82bd48,0x3c0e3881,0x3bf969e3,0x3a6124a3,0x3b179ad3,0x3b0a8822, +0xb99f9401,0x3b9d7ac2,0x3c353eca,0x3cd06ca4,0x3b6e50ef,0xbacff235,0x3bddee0b,0x3b8dcef8,0x3bdb10ac,0x3c42a6cd,0x3adea5a7,0xba8d9251,0x3b4c754d,0x3bf3c498,0x3c407d79,0x3c7c8c93,0x3c8d3b1d,0x3c8a9474,0x3c5da274,0x3c5341ac,0x3c27b6fb,0x3c0c4142,0x3bf28994,0x3b514ad8,0xbae6475c, +0xbc76c7d1,0xbc9d259e,0xbc8acc08,0x391b4eb7,0x3bc7fba8,0xbb20d39d,0x3bd277a6,0x3b8ecb39,0xbba48ada,0xb8d2dd9d,0xba691cae,0xbc02cc92,0xbc670bdc,0xbc3ae7ab,0xbb3d8250,0x3c12abd4,0x3c6fe553,0x3c3e5891,0x3b978048,0xb74a31f0,0xbb0a80dc,0x3b5c2653,0x3b8d207b,0x3b004032,0x3bea0346, +0x3c2cb4bd,0x3c6287ad,0x3caa9715,0x3c9f35cf,0x3c218ea7,0x3c2722b8,0x3bcb8189,0x3b11f20f,0x3ac50131,0x3b23b6e5,0x3b90e593,0x3b775047,0x3b2c9d92,0xbb43e948,0xbb8ea4cb,0x3a9182c8,0x3c87366b,0x3c76eefe,0x3c921bfe,0x3ca3ef45,0x3c0c01bc,0x3c26d03d,0x3d22e55b,0x3b71a78b,0xbbed67c8, +0xbb47218b,0xbb8f3bd0,0xbbbdd933,0xbbdd3d9a,0xbb21e9fd,0xb96bc909,0xba754656,0xbb28ea93,0xba58146d,0x3b30df7d,0x3bb34b65,0x3b9cac1e,0x3bb7282b,0x3b0a3eaf,0x3b454441,0x3c3178c7,0x3bd001ae,0x3b867d49,0x3b2e9a2e,0xbb8d628e,0xbbd20ebf,0xbb9b408c,0xbba71350,0xba98edf2,0x3b9124e4, +0x3b831bd5,0x37f0a995,0x3b2fcab6,0xbcf94d96,0xbd17300e,0xbc8c698e,0xbc2cf2ba,0xbbc01a52,0xba872d81,0x3bb198c5,0x39748c8d,0xbc993b6a,0xbc506aa0,0xbbeaf9e8,0xbc029190,0xbbf71d4d,0xbb8bdf72,0x39c22a92,0xb7a7569d,0x3b159cf8,0x3b09fc0d,0x3b413e48,0x3bae2b53,0x3c0a483f,0x3b4af3d0, +0x3bb63542,0x3cac650e,0x3c1fb5c1,0x3bb7ea6f,0x3b9d0fda,0x3979894f,0xba3161d7,0x3b1b02a3,0xbbf26ed0,0xbc2cbe68,0xbbe32b95,0xbb17814b,0x3b3680f8,0x3bcaf1cf,0x3c99e2fb,0x3c800ea2,0xba5ece23,0xbaf3fe76,0xb96bed9e,0xbce40deb,0xbd4852a1,0xbd36af6a,0xbd0e76a8,0xbc94c475,0xbc00bd0f, +0xbc092e17,0xbbecd5bf,0xbb7f1d94,0xb8b722ea,0xb96c0068,0x3a1d11d7,0x3b0a9e82,0x3b075909,0xb9a67111,0xb9a5781a,0xbb26d0d8,0x3a8faf74,0x3c4e0d8b,0x3bd6c298,0x3b376696,0xbb6026f0,0xbc113b39,0xbc55d570,0xbbf64cf7,0xbc1d7d63,0xbbdecc90,0xba422925,0xba0e9e52,0xbbb4e653,0xbc95f352, +0xbc99b2b6,0xbca46c44,0xbcb7958c,0x3a378192,0xbd628626,0xbcfb3923,0x3abe50ad,0x3c54d369,0x3c8bc153,0x3c58cb40,0x3b503856,0xbbc9d33e,0xbb82a01a,0xbb840161,0xba18d9e0,0x3b258bed,0x3ad5f314,0xbb25b2a4,0x3aaa86f0,0x3b519720,0x3bb5a182,0xbaafc99f,0xbafcb730,0x3bb297d9,0x3a6b637b, +0xbb0aa74b,0xbc025b15,0xbc0a7350,0xbbe7697c,0xbb9baf70,0xbc390aa5,0xbc30ccd7,0xbb6d4b9b,0xbc06d516,0xbc0f2d69,0xbc1656fb,0xbbeb0c81,0xbc941732,0xbd28679b,0xbd57fa58,0x3d224c7f,0x3d48ca44,0x3d4c789a,0x3d379c27,0x3d29b708,0x3d05b092,0x3cfd5988,0x3d11de36,0x3cf84f2f,0x3ccc4a99, +0x3c8b9828,0x3c70779c,0x3c63a2ef,0x3c5bf35d,0x3c1179ef,0x3b1c10a0,0xbb90082a,0xbbeeea55,0xbc078b80,0xbb930688,0xbc0e1764,0xbc25db28,0xbc053ef2,0xbc25867e,0xbc1cf85b,0xbc1c7dcb,0xbc19fb50,0xbc3ec33a,0xbc9714fb,0xbca4ef2f,0xbcd5ebd4,0xbd0cbefa,0xbd16bf72,0xbcda200b,0xba50b3e3, +0x3cb2ecc3,0x3cb78a66,0x3cdce984,0x3cdd5602,0x3ce411d9,0x3ce2ebf9,0x3ce8a6fc,0x3ceae902,0x3ceb72cd,0x3cd1fb99,0x3cbe6abb,0x3cab614f,0x3c88243b,0x3c4ae4c7,0x3c0460a5,0x3be95c5e,0x3bcdf62d,0x3ba43a1f,0x3b782682,0x3b0a2409,0xbb197077,0xbbd9a625,0xbc171681,0xbc519c02,0xbc7e495a, +0xbc939867,0xbcaa1860,0xbcb0d90b,0xbcbbec34,0xbccece34,0xbc951336,0xbc4b6444,0xbbde028b,0x3b9251f6,0x3c585b3c,0x3ca6ebe3,0x3ca7cecc,0x3cb177da,0x3cba289e,0x3cde3fe6,0x3cc33054,0x3cd0e8e6,0x3cd3686c,0x3cce9f82,0x3cd26946,0x3cbc0acb,0x3cae3744,0x3ca51282,0x3c91f716,0x3c84df99, +0x3c6ec7a8,0x3c5594f8,0x3c1b8036,0x3bd7d129,0x3b74b8dc,0x3b79c4cf,0xbac0d38c,0xb822b867,0x3a816aa2,0x3aed16bc,0x3b3897c4,0x3b6711b4,0x3b83c942,0x3bc7da70,0x3c0d43ba,0x3c34373e,0x3c50f62a,0x3c6a170d,0x3c7e5912,0x3c82a46e,0x3c879dbf,0x3c95da00,0x3ca692cb,0x3ca52070,0x3ca18350, +0x3cc0d74e,0x3ccecfd4,0x3ce0e988,0x3cb9cce2,0x3ccedcb7,0x3ce0a3c2,0x3cdb4c96,0x3cd6ef87,0x3cd095ae,0x3cce1ced,0x3ccb305e,0x3cc734c9,0x3ca8a5ae,0x3c925d65,0x3cb46b46,0x3c994e35,0x3c876c33,0x3c4f4530,0x3c632ec9,0x3c5f1192,0x3c60e5d1,0x3c6095f5,0x3c624147,0x3c605925,0x3c745ab7, +0x3c80c100,0x3c882fde,0x3c8d6d75,0x3c94284f,0x3c9d7ab2,0x3c9e54a1,0x3ca028ac,0x3c9f66ef,0x3ca0f00e,0x3cbd7843,0x3babdc6a,0x3b8737cc,0x3b8eea81,0x3b92228d,0x3b9fe01f,0x3be5da5c,0x3b9c952d,0x3b88ac37,0x3b9d759c,0x3b859f05,0x3b8c9959,0x3bb87f03,0x3b8f7711,0x3b83d38c,0x3b75cd5b, +0x3b939b12,0x3b9f4cfd,0x3b9de0aa,0x3bb77921,0x3bc20279,0x3bc83738,0x3bb5d806,0x3bacbe8f,0x3ba360f5,0x3ba0dea9,0x3b913e56,0x3b60674c,0x3b3d6706,0x3b30f2ad,0x3b2057ab,0x3b933888,0x3ba5b506,0x3b84b4f8,0x3bb3a3db,0x3bb2ba93,0x3b86ec1b,0x3b905d51,0x3b9045b8,0x3bb12ec1,0x3baa8b15, +0x3bfe45c6,0x3c4b838b,0x3ba461e4,0x3b5b9ae7,0x3bc89622,0x3b9ba398,0x3bb0b52f,0x3c001cf6,0x3baa095b,0x3b938e02,0x3b867c33,0x3ba7ab49,0x3bc319ce,0x3bd9daf5,0x3c0ca242,0x3c0d91e0,0x3c0c1ee6,0x3bf650b2,0x3bdc222b,0x3bc36580,0x3bbb356f,0x3b7ae45a,0x3a3212bb,0xbab4c753,0xbac6176a, +0xba97a4d6,0x3b8f341e,0x3bc79648,0x3b3dc381,0x3bcf3207,0x3bb6ead4,0x3b22904b,0x3b66a3f1,0x3b2bffb2,0x3b16c7e6,0x3b855bd1,0x3bffa8dd,0x3c99cb97,0x3b989c96,0x3b2cda8a,0x3c062402,0x3b8a933d,0x3ba2f4bf,0x3c35970a,0x3ba967d2,0x3b557070,0x3b664a07,0x3bb67b2b,0x3bf6a52d,0x3c0afe51, +0x3c4b291f,0x3c557794,0x3c42fa3d,0x3c226d71,0x3c0350cd,0x3bd57af7,0x3bc235c1,0x3b3089d6,0xbb3468b7,0xbbdc7cb9,0xbbf3a926,0xbbe3b71a,0x3b8bffc3,0x3c020d6c,0x3a7307d4,0x3c10068c,0x3c0780d6,0x3b020731,0x3b6f58cf,0x3b906603,0x3ba66d41,0x3bf730a4,0x3c6c77b2,0x3cebe78a,0x3ba0d048, +0xbac58ce3,0x3c096647,0x3b91ee2f,0x3bd970de,0x3c68ee32,0x3b4eece6,0xb9dc7100,0x3b85ee58,0x3c018e9c,0x3c35e0ac,0x3c5e07f3,0x3c8ef3d9,0x3c8fc5f8,0x3c766171,0x3c528f2c,0x3c289494,0x3c0eb82b,0x3be4ac52,0x39ff315c,0xbc1e6a7c,0xbc8a95a4,0xbc8bbf34,0xbc697b70,0x3b81f547,0x3c0f8152, +0xbb19cef7,0x3c02162e,0x3ba1fa41,0xbb8c9854,0xb853e429,0x3ae945cd,0xbb1d6539,0xbc3d80c9,0xbc460ddf,0xbc00de3d,0x3c018f6c,0x3c85c45e,0x3c6dcb46,0x3bd0e46e,0x398c35e5,0xbb05f953,0x3b5bc742,0x3ba64ffc,0x3b69c3dc,0x3c125f32,0x3c37609d,0x3c4e5b4f,0x3c9e4b86,0x3c9a6740,0x3c6a8b25, +0x3c27d5dc,0x3b9cff72,0x3ad24c03,0x3a919233,0x3b150c2c,0x3b72208b,0x3bb64d25,0x3ba3f873,0xbb37d606,0x3b8e4ace,0x3bf84684,0x3c3913d1,0x3c39ec22,0x3c93cd47,0x3cfcda8c,0x3c51ee0f,0x3b91f7d3,0x3d2a5bc3,0x3b61d123,0xbc0cd90e,0xb9f89135,0xbb1fed2b,0xbb2bc2fc,0xbb728175,0x3a7b137e, +0x3b3ccfe2,0x39537280,0xbac77f71,0xb8f99e6c,0x3b83bbb5,0x3ba44955,0x3bbd3bfa,0x3bf25e7d,0x3b583a0b,0x3b465ac8,0x3c12b44b,0x3b8ebb67,0x3b021883,0xbad3e803,0xbb8337b7,0xbb90e3b5,0xba9d5736,0x3ab71878,0x3bc04d2e,0x3c1f84a0,0x3bb1eddd,0x3ba20cf7,0x3c3a03e8,0xbca4cc12,0xbcf298f3, +0xbc80a825,0xbc725d03,0xbb899528,0xbba181b1,0xbb05b9ac,0xbb64beb7,0xbc86e4b1,0xbc7bc4e0,0xbc3d90e7,0xbbb17cfb,0xbbdbc6c3,0xbb9ff980,0xb981afd5,0x3a0f9d00,0x3b45575a,0x3ae58734,0x3b65d6b1,0x3bdc9a91,0x3c189800,0x3b1a8d18,0x3bbdd640,0x3c9c0b53,0x3c1ace04,0x3bc9714c,0x3ae04fdd, +0xb84d9289,0xb912bf68,0x3b3e9d4d,0xbbb34e50,0xbbd6fabb,0xb7ec27f7,0x3aec4d05,0x3bb166a0,0x3bea8c73,0x3c71a6c7,0x3c692af1,0x3a225aaa,0x3a02e3d8,0x3c200f0a,0xb9b8d531,0xbd04a224,0xbd1865df,0xbcf01d7f,0xbc7ca69f,0xbbabdaef,0xbb81f549,0xbb90f482,0xba3a0025,0x3a89088f,0xba0aa2e4, +0x388f45bd,0x3b8778fb,0x3b55eded,0x3ab67dec,0x3ab76089,0x3ae2c1f4,0x3b81aa30,0x3bf159b1,0x3b9418fc,0x3b2fa07c,0xbb27b6da,0xba85d8f3,0xbb3ca330,0xbb56e2eb,0xbc1ab542,0xbc09076a,0xbb1dcb2b,0xbbaf2127,0xbbf03809,0xbc5f01af,0xbc9eb441,0xbcaef7d9,0xbc85b414,0x3b1920b4,0xbd8cd0ef, +0xbd6d8f4f,0xbcce8a0a,0xbbed4139,0x3aba8cfc,0xbba21ca1,0xbc37f568,0xbc398dea,0xbc1cfaf4,0xbbff990a,0xbb0c12b1,0x3b6aa325,0x3b6536b4,0xb984c69f,0x3a4d1e97,0x3b19ff53,0x3be157fc,0xba65af63,0xbaec6945,0x3bb58d32,0x3bbfd8e6,0x3b635ec1,0xbbaf9ab3,0xbbdb7bc4,0xbc030897,0xbc0198e4, +0xbc31e739,0xbc027332,0xbb8ba7fc,0xbb7267c8,0xbb5e98c8,0xbba9295e,0xbbc43d20,0xbc66481e,0xbce857bd,0xbd630214,0x3cbca1ea,0x3d1e6f0d,0x3d372ab4,0x3d231a5f,0x3d2189be,0x3d0616e8,0x3cf42abc,0x3d055e53,0x3cefc4c8,0x3cca89d9,0x3c7ef3b3,0x3c57b314,0x3c3029eb,0x3c02dc14,0x3be2d26a, +0x3b3ad605,0xba7faa8f,0xbb90584e,0xbb90df43,0xbb20981e,0xbbb664c7,0xbbd25126,0xbbea8d73,0xbb9d104e,0xbbaa0abb,0xbb948632,0xbb9b2aaa,0xbbf5aab3,0xbc6be938,0xbc63900b,0xbc9b3023,0xbce9552d,0xbd043339,0xbcfb4082,0xbc9f8ff8,0x3b776453,0x3c8bba68,0x3ccee2b7,0x3cd8d4a1,0x3ceb9e29, +0x3cfed310,0x3cf3e559,0x3cedee3f,0x3ce5935c,0x3cd04dd2,0x3cb795fb,0x3cad4947,0x3c8ea852,0x3c75f183,0x3c41121f,0x3c1379cc,0x3bdd13b7,0x3b887559,0x397aefdc,0xbb8d4bd2,0xbc2dfd71,0xbc6d0ecb,0xbc8afa52,0xbca7d633,0xbcb1ac2c,0xbcbb228d,0xbcc5569b,0xbcd9b000,0xbcec3ee3,0xbd011ceb, +0xbceab40c,0xbcd975db,0xbccbbe72,0xbc4c5b5b,0xbaa2bbed,0x3bfef54a,0x3c548a02,0x3c62476b,0x3c7819b0,0x3cab6cb7,0x3c8917bf,0x3c9c1aa1,0x3ca57c3d,0x3ca05045,0x3ca8d941,0x3c894135,0x3c73863d,0x3c59541e,0x3c2323fc,0x3bf60e3e,0x3bb0438c,0x3bb0a2d5,0x3b7b3e17,0x3acddef1,0x3a0c6782, +0x3adc965c,0x3886dbb2,0x38ee81ce,0xba447af8,0xbabe1e27,0xbb0b3c97,0xbb47f5f1,0xbb85eaa9,0xbadf7054,0x3a22db77,0x3b2d3e0a,0x3b8ebfe0,0x3bc99cad,0x3be92f67,0x3c03e626,0x3c08cd2f,0x3c24a441,0x3c41202d,0x3c262e3d,0x3c1b320d,0x3c6db66d,0x3c8ded3f,0x3cb29cae,0x3c5a0d67,0x3c910248, +0x3cb8dae4,0x3cb057fa,0x3caa5ad5,0x3ca1ce16,0x3c9edc93,0x3c9ad4d4,0x3c936e9f,0x3c54fad0,0x3c19cc16,0x3c894f0f,0x3c48eeb6,0x3c1d3e24,0x3bc489c1,0x3bc5dc38,0x3bb486fd,0x3ba8d856,0x3b971a0f,0x3b8a2bd1,0x3b5ae391,0x3b915aa7,0x3ba48a12,0x3bbe05cb,0x3bcf79e1,0x3be34b1d,0x3bff3b62, +0x3c0764ee,0x3c1129e8,0x3c15cf7e,0x3c1ca67c,0x3c25098b,0x3bb83e1a,0x3b9f4641,0x3ba427b5,0x3baaa266,0x3bb43f74,0x3bf2a01d,0x3ba2eb44,0x3b96ba27,0x3bacd63c,0x3b99bef6,0x3b9d2c08,0x3bbd3323,0x3ba10e7c,0x3b988172,0x3b90729c,0x3b9d877a,0x3ba5c07a,0x3ba70316,0x3bbf4021,0x3bca7bb3, +0x3bd6bcce,0x3bc0fcd0,0x3bb6ed63,0x3bac80d7,0x3ba88a80,0x3b968a97,0x3b5ba845,0x3b54c971,0x3b536089,0x3b4a78a7,0x3b9fe8cd,0x3bb07c23,0x3b936214,0x3bbbadb2,0x3bbceebf,0x3b98a04a,0x3ba54c29,0x3bb592c1,0x3bde8e56,0x3bf0e6fa,0x3c12b3db,0x3c4c6482,0x3bb2020a,0x3b711508,0x3bc74034, +0x3bae85bd,0x3bc723a5,0x3bf4f5a0,0x3bc2e1de,0x3badadb0,0x3b964556,0x3bac0e38,0x3bbe0cb5,0x3bd54492,0x3c0b9d29,0x3c13e7f6,0x3c1d9a46,0x3c03b515,0x3be91443,0x3bcb2566,0x3bbe8d23,0x3b7f04da,0x39690027,0xba447a44,0xba13365c,0xb987742a,0x3ba19d71,0x3bcfcc3f,0x3b568957,0x3bceff17, +0x3bbc56bd,0x3b48cfad,0x3b8f326f,0x3bb0e6d9,0x3badcceb,0x3bee5f4e,0x3c189c26,0x3c953a1d,0x3b9f1eab,0x3b4431f4,0x3c028578,0x3ba372ef,0x3bb5c647,0x3c1f66b3,0x3bbc0826,0x3b8ddaf1,0x3b75ad8d,0x3bb51de8,0x3be2aad4,0x3beeab62,0x3c3f5911,0x3c50eb82,0x3c57cdb1,0x3c290b6f,0x3c0865c7, +0x3bd54af1,0x3bc08297,0x3b0ed689,0xbb88cfc3,0xbbc1ed06,0xbbbbdfa8,0xbb8bd142,0x3b9687f0,0x3bfd42c8,0x3b0fbf9d,0x3c052419,0x3c0ee3c7,0x3b5a5752,0x3bc25fb4,0x3c0991b1,0x3c2d2e1e,0x3c5c8c3b,0x3c9cbcd6,0x3cf5f4c4,0x3bc63816,0xbacbea80,0x3c0717a6,0x3ba23084,0x3be5827e,0x3c714f2c, +0x3b9132d8,0x3a599c61,0x3b900354,0x3c035d02,0x3c1ee09f,0x3c34e3a3,0x3c8a67fa,0x3c938b81,0x3c935407,0x3c667d58,0x3c35a466,0x3c0d1cb0,0x3bdb19d2,0x391fce02,0xbc39e8b1,0xbc81dc91,0xbc608e1d,0xbc2ab5f6,0x3b94b08e,0x3c0328ce,0xbaa844a5,0x3bf96aa9,0x3b971f34,0xbb6f2080,0x3b0a8b87, +0x3b1bc6b5,0xbae3f5cb,0xbc2f2b9c,0xbc690a7f,0xbc3f7654,0x3bead961,0x3c90f5ad,0x3c8b434c,0x3c0e865b,0x3a603e46,0xbb2b016f,0x3b4460ae,0x3bae797e,0x3b939eca,0x3c2a01dd,0x3c3f0fe7,0x3c4566fb,0x3c78e97f,0x3c808563,0x3c7eba9a,0x3be2e20a,0x3b38bffd,0x3b21093e,0x3a6e6c09,0x3a9355c8, +0x3a9ad42e,0x3c0032a1,0x3bdb0143,0xbc01ad72,0x3c057a41,0x3c379121,0x3ba9907c,0x3c159723,0x3ca30a13,0x3d1f7f63,0x3c9011c7,0x3a332caf,0x3d15939a,0x3bbf8bea,0xbbc0562d,0x3b665220,0xbba5b690,0xbba6d449,0xbb2061bd,0x3b05a2e9,0x3b9d6ab3,0x3b2bf22f,0xb860fabc,0x3a54465d,0x3b926b4e, +0x3b884286,0x3bd4e71e,0x3c0cd217,0x3bd32cbe,0x3bc14dc3,0x3c0f04fd,0x3bb08744,0x3b6e0ea1,0xba195010,0xba42c049,0x3a06a80e,0x3b927616,0x3ba35e91,0x3c16aff0,0x3c5d6334,0x3baae4c0,0x3bca749f,0x3c772b96,0xbc35fe87,0xbcb30a8f,0xbc904f8c,0xbc85bf4b,0xbbd4de9a,0xbb971e6f,0xbb8a9bb7, +0xbba556ac,0xbc45ff6a,0xbc61ec56,0xbc515c9b,0xbb4b883a,0xbbba6990,0xbb9c7800,0xba5921fe,0x3ae782d5,0x3b88eb8f,0x3ab5a3e3,0x3b8b7f12,0x3c00076d,0x3c01a4b7,0x3b37d582,0x3bc18124,0x3c58ba13,0x3c1d98b7,0x3c0f5574,0x3b7430dc,0x3b823a73,0x3b0f53e1,0x3abd7812,0xbbcad9a7,0xbbd890e5, +0x3b73db92,0x3b89482b,0x3bf769a1,0x3c371b30,0x3c15718c,0x3c0fe54e,0x393c12b3,0xbb15bfe2,0x3bf82163,0x3bd10277,0xbc83e233,0xbcd079c2,0xbcaa7c44,0xbc4c6b27,0xbb74e55e,0x3a8a59ea,0xbada723a,0x3b074578,0x3b3bf743,0xb9236393,0x39e8f280,0x3b9f4d6b,0x3b985ef6,0x3b96a26d,0x3ba12380, +0x3bde8071,0x3bccf1bd,0x3b911ab4,0x3bd7bbf8,0x3bd14635,0x3b3168dd,0x3b96f865,0x3b7ed959,0x3af0a622,0xbbdf0e1e,0xbbd63f0f,0x3a27fbc0,0xbbdd7833,0xbc135539,0xbc28092f,0xbc801b9c,0xbc75062f,0xbc025e66,0x3a4ef1aa,0xbd5d4474,0xbd80bf4b,0xbd20d9be,0xbca998de,0xbc264419,0xbc918b3e, +0xbca84e79,0xbc5580b1,0xbc522b39,0xbc2ba1ef,0xbb87a6f3,0x3b3999c9,0x3b8f7514,0x3b17fed7,0x3acee533,0x3b07f314,0x3bc58a7c,0x3a892c53,0x3aa5618d,0x3bd32a9d,0x3bef6fdd,0x3b8f9ee3,0xbb1091d4,0xbb930eee,0xbbd530ec,0xbbd719be,0xbb44804a,0xbaeaaf0b,0xbbe40264,0xbae57582,0xbb23d451, +0xbbe30bb0,0xbc4e9079,0xbc92b002,0xbcbde8d1,0xbd2b51ee,0xbb023d4d,0x3c80a99b,0x3cddad57,0x3ccb9308,0x3cdb9457,0x3ccc405c,0x3cc18b8e,0x3cda4bd2,0x3cc0354a,0x3ca605b3,0x3c5b3f88,0x3c37a86c,0x3bfdb8ed,0x3baedee5,0x3bd7df86,0x3ba7002c,0x3b799943,0xb9e870b6,0xbb022430,0xbb021286, +0xbb15d974,0xbb1214e5,0xbb518fb4,0xbb4cfc1f,0xbb9c475d,0xbbb2812c,0xbbd7e0c8,0xbc0d0099,0xbc510787,0xbc1788c8,0xbc30d896,0xbc85ea5f,0xbcaed3eb,0xbcd10aeb,0xbcd71647,0xbc6ea3ad,0x3c3d0cb1,0x3cb39474,0x3ccae303,0x3cdf230b,0x3d030dcc,0x3cef7008,0x3cde71f4,0x3ccdf33a,0x3cbc9955, +0x3ca51054,0x3c9b6923,0x3c881b50,0x3c8370ff,0x3c614691,0x3c2179ec,0x3bc0bdd3,0x3b075806,0xbb1077ff,0xbbfe1f8b,0xbc3f73b2,0xbc6f848a,0xbc954772,0xbcb02335,0xbcb8de72,0xbcc01f1f,0xbcc89027,0xbcd6c7db,0xbce30476,0xbcf11ba3,0xbcf85b1d,0xbd01855a,0xbd0999dd,0xbcbaf76e,0xbc4dfb6e, +0xbb85b117,0x3bac4202,0x3baab50b,0x3be2dd3e,0x3c53b8a4,0x3c0dea3b,0x3c35be4e,0x3c44282d,0x3c3f7151,0x3c5adf2b,0x3c205549,0x3c0afe9e,0x3be5562b,0x3b83fdc1,0x3ae3ba0a,0xb9437924,0x3a3fc426,0x3a64a6f0,0x3824ae72,0x399c9c1a,0x3b062a26,0x3a97303f,0xb9de8d27,0xbb0714af,0xbb76f25a, +0xbbb880ac,0xbbfe9c05,0xbc26f4e6,0xbc0d6dd0,0xbbf39d57,0xbbc960ce,0xbba12081,0xbb5505d1,0xbb331b71,0xba6be412,0xb8d99cb8,0x3ac87a6a,0x3b4d0008,0x3a932a2b,0x3a459be7,0x3b909e0d,0x3bdf528b,0x3c340d34,0x3b635cae,0x3bea1061,0x3c441942,0x3c33b381,0x3c26c8a1,0x3c16e75e,0x3c102aec, +0x3c063629,0x3bea9b2b,0x3b7c8445,0x3a958657,0x3bec69ad,0x3b6e07f8,0x3af20ecb,0xba533aac,0xbab1ffac,0xbb0b9176,0xbb3ccbf7,0xbb744384,0xbb8fd88b,0xbbb584eb,0xbb970053,0xbb8a4c9d,0xbb77c315,0xbb63db6d,0xbb520fae,0xbb3cdd6c,0xbb04f3fd,0xba9743ec,0xb9bfb5f6,0x399b9123,0xbab5908d, +0x3bb28a6c,0x3ba7d83a,0x3ba09639,0x3baf733e,0x3bb9ee84,0x3bef9aca,0x3b990835,0x3b99a00b,0x3bb1fc08,0x3baafe72,0x3bac9fc1,0x3bbcc7b1,0x3bb0baea,0x3baac04e,0x3b9e80ec,0x3b9d3087,0x3b9fa860,0x3bb0b89a,0x3bbefc3f,0x3bc4e5e2,0x3bcdc855,0x3bbaa31f,0x3bafe4d9,0x3ba5af4a,0x3ba17edd, +0x3b909b34,0x3b575714,0x3b57de10,0x3b596ba1,0x3b512ef9,0x3b95ff17,0x3ba2f89f,0x3b8f2a71,0x3babd343,0x3bb0cf32,0x3b9e6b7b,0x3baa68fd,0x3bc25030,0x3bcf7732,0x3c063559,0x3c0da588,0x3c364ed5,0x3baa2102,0x3b6c2f0b,0x3bb1816c,0x3bb5e92c,0x3bd450c4,0x3be1c4a5,0x3bd13c0e,0x3bb9e092, +0x3b93aed6,0x3ba2f947,0x3baf3f08,0x3bd2b146,0x3c02685a,0x3c150149,0x3c1e7ee9,0x3c00622d,0x3be0b1a6,0x3bbe4c0f,0x3baef5a0,0x3b6fb259,0x39cd54bd,0xb9441b5b,0xb7b41d7c,0x38bced51,0x3b91702b,0x3bba7666,0x3b72f6a5,0x3bbb1018,0x3bb06d56,0x3b83ffd3,0x3ba367ed,0x3be47c22,0x3bca61ee, +0x3c0c713d,0x3c1076f4,0x3c7c83e6,0x3b89c785,0x3b3a8f52,0x3be241d5,0x3bbf4e22,0x3bd2ec6f,0x3c08eb07,0x3bcfb008,0x3bae08d4,0x3b5bf05c,0x3ba359f8,0x3bc3da4e,0x3be664ba,0x3c2bb23c,0x3c43e78c,0x3c5d19c1,0x3c1faf12,0x3c0259da,0x3bc49ffa,0x3bb10333,0x3af6efcb,0xbb800d19,0xbb9713e0, +0xbb87f9a3,0xbb605605,0x3b5ed632,0x3bc6ae99,0x3b24a73a,0x3bc8bae1,0x3bf1773e,0x3bb1f5e1,0x3bfa853d,0x3c1182f5,0x3c2a13d0,0x3c74c2c6,0x3c9c507a,0x3cd66ef1,0x3bc1b1c7,0xbae2b1fa,0x3bdc5ff9,0x3bb4253d,0x3c01caf1,0x3c668514,0x3bb4d9bb,0x3b07588c,0x3b7d8ef5,0x3bf95868,0x3c08773f, +0x3c1dbb47,0x3c7c814e,0x3c946d95,0x3ca43044,0x3c657065,0x3c2c68b6,0x3bf63017,0x3bb42d79,0xb97fe4da,0xbc2f557c,0xbc62e462,0xbc3e5042,0xbc18f729,0x3b531da0,0x3bcebf0e,0x3a78f567,0x3bcc0b52,0x3b76f4a0,0x39c23cf4,0x3b8ce2a7,0x3beda346,0xb7e25e0a,0xbc045516,0xbc6c37e6,0xbc80dc3b, +0x3b97ff87,0x3c893879,0x3c993174,0x3c3cb97c,0x3b14fb0a,0xbb4d9614,0x3b236148,0x3ba5e4e6,0x3baa00be,0x3c346571,0x3c372085,0x3c342be5,0x3c2af207,0x3c33339a,0x3c458aa2,0x3b8655f2,0x3b3e7570,0x3b8b8532,0x3aea41e6,0x3b057f7f,0x3b0611ba,0x3c65b2d4,0x3c421351,0xbc27c791,0x3bcab39f, +0x3c06fc0d,0x3a6ad2c6,0x3b9e2d9b,0x3c9034a3,0x3d26269c,0x3caf2592,0xbc10c4b3,0x3cab6d79,0x3c172092,0x3ab6bbf8,0x3be4f8aa,0xbb736827,0xbbd8d851,0xbb63b559,0x3adb91c9,0x3ba7ca7f,0x3b9e5196,0x3ad6c0c6,0x3ae6c66d,0x3b927e10,0x3b6efd16,0x3be26c9d,0x3c1d9718,0x3c17e0ac,0x3c17dcc2, +0x3c074198,0x3be888e4,0x3bc3d011,0x3a2648db,0x3b0018dc,0x3b2fc919,0x3b87163a,0x3bfa960a,0x3c196fe8,0x3bc138d2,0x3ba3d735,0x3bc525fc,0x3c29fcca,0xbbbbcb3c,0xbc835126,0xbca574f7,0xbca00429,0xbbf96954,0xbb6b1bb1,0xbb6178b0,0xbb9db20a,0xbbeda7bc,0xbc304e58,0xbc3adfe7,0x390afe30, +0xbb878f8e,0xbb812d6b,0xb9e90c99,0x3b209a18,0x3b90d62f,0x3ac4855d,0x3b8d310c,0x3c05463f,0x3bd339a3,0x3b5946bd,0x3ba570d8,0x3bf0f745,0x3c2f0ed6,0x3c3a2d6e,0x3b9fc31a,0x3bb51113,0x3b3de89a,0x3a0f1934,0xbb83e275,0xbb8199b1,0x3b8a23c2,0x3bfb9133,0x3c3f534e,0x3c73e0a1,0x3be95e90, +0x3b8ed7ad,0xbb2a3e2e,0xbb8b78b3,0x3b2e4d80,0xbae8edfb,0xbbf0d814,0xbc5f5d60,0xbc53bd25,0xbc2d4a76,0xbb853be0,0x3bace82d,0x3a4bea65,0x3b75286f,0x3b84cb69,0x3a728e39,0x3aabd442,0x3ba21677,0x3bb9e5d6,0x3beb3f30,0x3c007b84,0x3c1d268d,0x3c0a5f18,0x3b9dc2a9,0x3c0e7a89,0x3c112aef, +0x3bb3058e,0x3c031315,0x3bfdbcdc,0x3b228d25,0x39aab6d1,0xb926757c,0xb9bdc02e,0xbbf44e37,0xbc2b2c35,0xbc4c00f9,0xbc0af3ec,0xbb9757da,0xbb5d42bd,0x3b1774e8,0xbcf0d554,0xbd3af82b,0xbd1f8530,0xbcddc4c1,0xbc8f90bd,0xbcbe323e,0xbcba67e5,0xbc56ae1b,0xbc601fd9,0xbc388565,0xbbc3d4d5, +0x3a24b5e9,0x3b72247a,0x3b8a480c,0x3b46412b,0x3b463106,0x3bc2630c,0x3b6171f1,0x3b851a00,0x3bbbf126,0x3bf6f24c,0x3bc66988,0x3b249784,0xba72b087,0xbb4e3be1,0xbbad237d,0xba9756aa,0xba487f1d,0xbbd28473,0x3ac0553f,0xbae4c182,0xbc4cc874,0xbc94c61a,0xbcb0a307,0xbcc0fd13,0xbcd06307, +0xbcb0064e,0xbbf4f952,0x3baf1689,0x3bfa6bf1,0x3c2dd5e8,0x3c71c9e8,0x3c811e84,0x3c8dc78b,0x3c63df16,0x3c44c160,0x3c116d31,0x3c1b077f,0x3bee373c,0x3bd0401c,0x3bd87b5c,0x3bc3814d,0x3bce1578,0x3a82ae18,0xbaaf77b0,0xba731726,0x3aac9737,0x3b062b3b,0x3b033688,0xbb3d87af,0xbba24c86, +0xbbfaf371,0xbbe85c9a,0xbc079f4c,0xbc3aebaf,0xbc03d1a7,0xbb9da39e,0xba1a6319,0xbc0222d5,0xbc7484a1,0xbcab81a2,0xbcc3ee33,0x3b4ebcb5,0x3c5a1788,0x3c947928,0x3ca45dda,0x3cd538fa,0x3cc3a0b6,0x3cb22712,0x3ca8dc71,0x3ca107bc,0x3c921ee0,0x3c8f1e21,0x3c742151,0x3c6be7c3,0x3c419f1a, +0x3c0b3129,0x3b8e93cc,0x3a7e58e2,0xbaec978a,0xbbb67c5e,0xbbdb9f9b,0xbc1f65ec,0xbc65b246,0xbc8df6f0,0xbc9a0807,0xbca40cf3,0xbcb27e84,0xbcaf9146,0xbcaf80ed,0xbcad5d58,0xbcc9b585,0xbcee7ce1,0xbd0bdc0c,0xbce24401,0xbca980c7,0xbc7158db,0xbb84edaa,0xba78978a,0x3a7a8a16,0x3bb7a998, +0x3b196cad,0x3b8fb8e6,0x3b9a1da4,0x3ba4e1d3,0x3bd8100b,0x3b8ea099,0x3b6f15ae,0x3b3dced3,0x3a87b472,0xb95d537c,0xbaa7c08e,0xba360394,0xba3fe53b,0xbaad1cad,0xbab8df21,0x38ae3b4d,0xbb3b129f,0xbb9cc5d2,0xbbc3bb14,0xbbfa330a,0xbc1a5772,0xbc3c12f4,0xbc623107,0xbc5a1002,0xbc582319, +0xbc4e5276,0xbc428dec,0xbc2579bd,0xbc1e13bb,0xbbe2ea25,0xbbb62500,0xbb88ad88,0xbb2d73e5,0xbb964197,0xbb940c37,0xbb2c88d7,0xba79f2ec,0x3ad9e1f7,0xbb376261,0xba0c737f,0x3b25c8eb,0x3af60b5c,0x3ab9199b,0x3a4b008f,0x3a2624c0,0x396e1060,0xb9b61077,0xbb14ebb0,0xbb8ab56f,0xb9b4faf8, +0xbb44aea7,0xbb8aff44,0xbbdbd544,0xbbe2b66d,0xbbfc9f7d,0xbc0a1176,0xbc168467,0xbc204e7d,0xbc2fdab2,0xbc2448ee,0xbc1f7509,0xbc1c3520,0xbc18880b,0xbc178d27,0xbc1726e3,0xbc08e744,0xbbf333fb,0xbbcdd2fa,0xbbb5b788,0xbc04b62a,0x3ba75194,0x3ba66673,0x3b977f39,0x3ba5e6f9,0x3baca2a6, +0x3bd39b2e,0x3b8e03b2,0x3b91bf59,0x3ba341df,0x3ba9f717,0x3bac4f73,0x3baf5c15,0x3baebc11,0x3ba9792e,0x3b96ccbd,0x3b927139,0x3b945061,0x3bad4857,0x3bb29a95,0x3bb596ef,0x3bb8945c,0x3bac9897,0x3ba34b26,0x3b99700d,0x3b985e7e,0x3b8b109f,0x3b5dde29,0x3b5bc482,0x3b5ad133,0x3b4dae8c, +0x3b88f140,0x3b933996,0x3b8812c7,0x3b9d996d,0x3ba34882,0x3b98108d,0x3ba71a7d,0x3bc4cf6e,0x3bb9222d,0x3bf7be7c,0x3bf4b54c,0x3c1292d9,0x3b9671b9,0x3b61697a,0x3b92ab4c,0x3bb49a33,0x3bd75a79,0x3bce4bea,0x3bd992fa,0x3bbf0f16,0x3b878b9e,0x3b92226d,0x3b9cd455,0x3bd2ef4a,0x3bea9f97, +0x3c0ad26d,0x3c0d40df,0x3be6fc20,0x3bcb6239,0x3ba623b5,0x3b9fc804,0x3b72a09c,0x3aa60c78,0x3a53f09d,0x3a539182,0x3a40ce39,0x3b82065e,0x3ba00047,0x3b79e5ab,0x3ba40e6c,0x3ba03a0e,0x3b8d36a1,0x3bb0ef22,0x3bf6a5e4,0x3bbd06a2,0x3c00bed1,0x3bee3947,0x3c4293c1,0x3b6b5312,0x3b31738f, +0x3bac6fa6,0x3bce44d8,0x3be98188,0x3bed92ad,0x3be4f555,0x3bc63ec0,0x3b2fc65e,0x3b8aef6c,0x3ba2d912,0x3befd922,0x3c146824,0x3c2e61a7,0x3c4627d4,0x3c0c5459,0x3bed5d4b,0x3ba5d4c6,0x3ba62d1a,0x3b1413de,0xbb1628ab,0xbb28947d,0xbb0ade4c,0xbb0b304f,0x3b30b7f7,0x3b997cf7,0x3b30dd3b, +0x3bb36130,0x3bd6e231,0x3bb849d1,0x3c097287,0x3c09b06c,0x3c03086a,0x3c51020d,0x3c82c670,0x3ca6cd5c,0x3ba98b84,0xba9efc74,0x3b9b975c,0x3bc20ffa,0x3c10ccc8,0x3c4eddc1,0x3bd84086,0x3b4f9e69,0x3b2694cf,0x3bdbb13b,0x3bea2f46,0x3c1d4a5b,0x3c5f3a1f,0x3c8b8332,0x3c9a88c7,0x3c4cd0f3, +0x3c14e7bf,0x3badec71,0x3b8caacf,0x395566cc,0xbc032542,0xbc25caab,0xbc0998d7,0xbbd61c5d,0x3b42de21,0x3b99b690,0x3b0600af,0x3ba0f382,0x3b52120a,0x3affd229,0x3bc19317,0x3c452b81,0x3b8aaa82,0xbb5c1204,0xbc3da94b,0xbc8c1af7,0x3ad4f60f,0x3c5d1af1,0x3c935574,0x3c6b639e,0x3b98b880, +0xbb49f5bf,0x3af6a657,0x3b92ad67,0x3bcfe786,0x3c379fa9,0x3c281abc,0x3c1955d8,0x3be92810,0x3be6f670,0x3be50f3c,0x3b2fefdf,0x3b70eeb7,0x3bb692d0,0x3b831f92,0x3b98492c,0x3b981e63,0x3c9c0664,0x3c863906,0xbbed36be,0x3b100062,0x3b610421,0x3b3c515e,0x3bae45b8,0x3c82c6f4,0x3d177e24, +0x3cb3ad3a,0xbc7b96c8,0x37becb49,0x3c4f0907,0x3c304cba,0x3bb8b994,0x3aa59c22,0xbb6cf596,0xbba2e1ef,0x3a9097cf,0x3bafc579,0x3bdd895a,0x3b444461,0x3b115b10,0x3b9972e4,0x3b88d410,0x3bfb5513,0x3c2103cb,0x3c226983,0x3c235dd7,0x3bd61c2b,0x3c1166d6,0x3c03533b,0x3aa6a4a5,0x3ad5f761, +0x3b0c8cc9,0x3b70a633,0x3c2c495c,0x3c2268ae,0xbb33561d,0x3b96630e,0x3b621960,0xbb93d833,0xbbeaeeab,0xbc56c0fe,0xbc9ea207,0xbc957a79,0xbbccb678,0xbb6da341,0xbb4b5d47,0xbb839606,0xbabe8bf9,0xbbf92395,0xbc2fc441,0x3b0e2a0f,0xbb0a36a2,0xbb379314,0x39d2753f,0x3b206dd0,0x3b785dd2, +0x3b0cefbd,0x3b73d5e4,0x3bf2dcb3,0x3b970ba6,0x3b30e0e9,0x3b60366a,0x3b850635,0x3c36e067,0x3c43660c,0x3b98bd68,0x3bf5ecad,0x3ba04834,0xba8f869b,0x38a65259,0x3b27ea8d,0x3ba39ef8,0x3c3f0c92,0x3c81c792,0x3c81d1ca,0x3bf0a6af,0x3af2621b,0xbb8479b5,0xbb9d983d,0x3a569b7a,0xbbfc6e7f, +0xbb3d953c,0xbb88d019,0xbbf169e7,0xbc00e62c,0xbb834e1d,0x3bc91478,0x3aea347f,0x3b87d9d6,0x3b8dbffd,0x3ad7d097,0x3afa497d,0x3ba8f932,0x3bc151fc,0x3c066dbe,0x3c103d99,0x3c21b9f5,0x3c1a20de,0x3bad1fd0,0x3c0ac768,0x3c180b7e,0x3bf67497,0x3c1440d8,0x3bfbb14f,0xb8830010,0x3b47931e, +0x3a8189db,0xbbdb2945,0xbc1a8639,0xbc3033f8,0xbc5417ee,0xbaecd998,0x3b445d1c,0xb9745924,0x3b79b757,0xbc3fe692,0xbcb71745,0xbcf01e3e,0xbcdce957,0xbcb552ac,0xbcb5cb83,0xbc9d34d9,0xbc49b2b2,0xbc49d70f,0xbc2a3d4d,0xbbe84e97,0xbaff4441,0x3afadf26,0x3bad8156,0x3b7d75db,0x3b85de1c, +0x3bcc8e5a,0x3bae5925,0x3bbe08e6,0x3b7a4ceb,0x3c020f0c,0x3c0525da,0x3b98b6d0,0x39236b5e,0xbaca1aa3,0xbaba02e7,0xbaab4c26,0xba87cc8d,0xbb26fd65,0x3b697537,0xba10efb6,0xbc64dac9,0xbc951cc0,0xbca3be21,0xbca69fe0,0xbc5edae1,0xbcf1075e,0xbcbbbe8c,0xbc5b6aff,0xbbeb2167,0xbaeec40b, +0x3bd9cef9,0x3c076bae,0x3bc2c53b,0x3b7ed457,0x3b61e681,0x3b63b8b9,0x3c034736,0x3c087669,0x3bf51d0f,0x3bbf66f2,0x3ba0264a,0x3bb29a86,0x3a4c9adf,0xba36e601,0x3a2bfcb5,0x3b99082f,0x3bb3baab,0x3b95596b,0x39894ffd,0xbb1136ba,0xbbadb55c,0xbbbe61de,0xbbe810b3,0xbc05b666,0xbc331a4e, +0xbbbd07e3,0x3be077e9,0x3b089068,0xbb8a4d76,0xbc5915de,0xbcc6e43a,0xbba926b8,0x3afdf46f,0x3bfee166,0x3c1c5aee,0x3c79fce2,0x3c6b3fa4,0x3c5bff0a,0x3c65b8b8,0x3c73b252,0x3c6c1c5d,0x3c81bfe6,0x3c458d2b,0x3c36f9d5,0x3c071849,0x3bd15c66,0x3b5ebe26,0x3abeeb4a,0xb90a34f3,0xbafdda61, +0xbb2ecea2,0xbbba2c00,0xbc14d9c9,0xbc42a474,0xbc5d9dc8,0xbc74e9f6,0xbc8b4734,0xbc81f8da,0xbc7d025e,0xbc6798c5,0xbc8c097b,0xbcaf5cc3,0xbcd89d51,0xbccbad09,0xbcb3e16a,0xbc9e0d28,0xbc31b994,0xbb77c03b,0xbade62f4,0x3aa7656f,0xba23c849,0x3a848e80,0x3a97b116,0x3aeed781,0x3b3e2aea, +0x3ad3955e,0x3a81fad7,0x3a5759dd,0xb99ab590,0xba4407ba,0xbaa08cf0,0xbae2dd84,0xbb3b6e02,0xbb87b3cf,0xbbac7667,0xbba8ac7a,0xbc130f40,0xbc2b7a24,0xbc39d2ce,0xbc4f5322,0xbc6813e7,0xbc812ef8,0xbc906b29,0xbc8c7457,0xbc8b8845,0xbc897797,0xbc849edc,0xbc6f913a,0xbc63f6f6,0xbc2ceead, +0xbc0b5dad,0xbbe3bcce,0xbbafbd22,0xbbf2f6d5,0xbbe28e27,0xbbca0189,0xbba6d925,0xbb7b7f81,0xbbbaec5a,0xbb921edf,0xbb3b0608,0xbb591f91,0xbb649b56,0xbb82bbc1,0xbb7e1b17,0xbb86f0eb,0xbb8c2f0a,0xbbbdd975,0xbbead735,0xbbac5210,0xbbebac20,0xbc05fde8,0xbc23532c,0xbc24ab55,0xbc3181b5, +0xbc3bc5e7,0xbc45a084,0xbc4ddd80,0xbc5b10a3,0xbc52bab4,0xbc4edc6e,0xbc4ab140,0xbc46b506,0xbc44f7cf,0xbc45a23c,0xbc38c87c,0xbc2aee33,0xbc1741f1,0xbc09da4a,0xbc38065e,0x3b9b09fa,0x3b9e1fdd,0x3b8b31ae,0x3b931dc4,0x3b961a1e,0x3bb08142,0x3b80b156,0x3b84efea,0x3b8cf95c,0x3b9e6392, +0x3ba2eb5b,0x3b9ec8c3,0x3ba61e5e,0x3ba146be,0x3b87ffd4,0x3b83b3bb,0x3b85a2da,0x3ba3e52d,0x3b9ef8b8,0x3b9ef723,0x3b9cf7cb,0x3b996973,0x3b936973,0x3b8c10e0,0x3b8ed8f9,0x3b86fb09,0x3b6a058b,0x3b656870,0x3b63ccb2,0x3b634f91,0x3b7c8d65,0x3b849025,0x3b828c6a,0x3b8f9a7b,0x3b939194, +0x3b876056,0x3b9d29c1,0x3bb769ae,0x3ba5dd93,0x3bda6232,0x3bcbcc8e,0x3bde3b6d,0x3b7ef102,0x3b4de590,0x3b601cd9,0x3ba8d00c,0x3bcd7d63,0x3bba9da2,0x3bde6c4d,0x3bc25ff6,0x3b729439,0x3b8010e3,0x3b89cf69,0x3bcc33c1,0x3bcc86f6,0x3bf034c2,0x3be079d7,0x3bc04680,0x3baecd15,0x3b9304f2, +0x3b9d430b,0x3b89727a,0x3b239fb3,0x3b0edb8c,0x3b0b9317,0x3b2617b1,0x3b80f179,0x3b89d009,0x3b7a2126,0x3b88d498,0x3b8773a1,0x3b675678,0x3ba62808,0x3bf9e6ef,0x3ba2cedf,0x3bd26c53,0x3bb60534,0x3c093bc5,0x3b457382,0x3b26c478,0x3b6db6e4,0x3bc6f266,0x3bed6ac1,0x3bce09d8,0x3bfd1bd2, +0x3bdf057f,0x3b0b95c5,0x3b6bb67b,0x3b865f27,0x3bf33dc4,0x3bf6d6a1,0x3c0f0ed0,0x3c15a96a,0x3bdbffaa,0x3bc89249,0x3b8b3704,0x3ba4e393,0x3b576ed7,0x3997e50e,0x3970802d,0x3a07ed5e,0x3aace2b3,0x3b2d54ed,0x3b736dda,0x3b522c2a,0x3b96c370,0x3bafbe8c,0x3b83fe73,0x3c013f16,0x3bfaf5aa, +0x3bd714bd,0x3c2fdc6a,0x3c527036,0x3c713544,0x3b7e2b86,0xba450967,0x3b2780ba,0x3bb8bc08,0x3c13cb46,0x3c318a62,0x3c006f2e,0x3b8c7871,0x3a4aa754,0x3bb29e71,0x3bc22ef5,0x3c1dacb6,0x3c3d970e,0x3c6d8d93,0x3c6ffe7d,0x3c1e0a4b,0x3beadeab,0x3b7563e6,0x3b94f213,0x3b2cf553,0xbb5ffba4, +0xbb8d4c84,0xbb486ec6,0x398f6d6a,0x3b94a70f,0x3b756231,0x3b302647,0x3b376395,0x3ae8f3fb,0x386b9cf4,0x3bb87570,0x3c6a87da,0x3bbed256,0xbb0407e0,0xbc272f46,0xbc765e9e,0xb9349241,0x3c2075e8,0x3c7b961e,0x3c88dd8b,0x3bfce04a,0xbb1db9c3,0x3a90b846,0x3b75b330,0x3c044e1b,0x3c3398ae, +0x3c1985a8,0x3c05c159,0x3ba432ab,0x3b828800,0x3b36a3c8,0x3b11bced,0x3b9cc68f,0x3be59f5b,0x3bc49573,0x3bc1098e,0x3bafc0d9,0x3c98074e,0x3c7c3fff,0xbbb68c08,0xbb425089,0xba85a2e9,0x3bc94207,0x3bee89af,0x3c7029bf,0x3cfa7ec8,0x3cad2b16,0xbc79d72f,0xbc8b41e3,0x3c8470d1,0x3ca0058d, +0x3adec7a2,0x3b94e65d,0x399ef79a,0xbbb1ef9f,0x3a189cb0,0x3bae5cab,0x3c0fcc77,0x3b7c5b2e,0x3b14c079,0x3b9eac2b,0x3bb5d088,0x3c165384,0x3c137911,0x3c10374a,0x3c0c0ea2,0x3b9301d9,0x3c1dbdd1,0x3c0bbe9b,0x3aa93eb2,0x3b05b776,0x3b8579ed,0x3bed026b,0x3c1af6f5,0x3bf34ca3,0xbbadea6e, +0x3bde5e13,0x3aedae96,0xbca946bb,0xbc4e2617,0xbc45ed83,0xbc88ab2b,0xbc65d2d2,0xbbb3d2e8,0xbb8958f0,0xbb723d94,0xbb486017,0x3b67dc95,0xbb0af829,0xbc003682,0x3b516fde,0xb8a413f8,0xbae76d77,0x3a9cf6d6,0x3b0a2fe5,0x3b5c97cb,0x3b4d8276,0x3b28c0dd,0x3bb37bcc,0x3b19f3b1,0x3a8add91, +0x3af88996,0x3b0521f0,0x3c1aa372,0x3c25435b,0x3b7b2596,0x3bc41a5d,0x3b4cebb2,0xba940cda,0x3b030b63,0x3bc07075,0x3b9ec213,0x3c3e1216,0x3c7c0a35,0x3c6c5c8e,0x3bd7ccf6,0x39a68429,0xba05751f,0xbb87e7d3,0x3a02fe77,0xbbc6383e,0x39a6656f,0x3aef1b05,0xbb7fc163,0xbb850877,0xbb2b5785, +0x3b863193,0x3aad2488,0x3b5ace46,0x3b7b7bf8,0x3aca7488,0x3b035b24,0x3b989434,0x3bb8334f,0x3c06b1d7,0x3bfa494e,0x3c037f13,0x3c091967,0x3b959293,0x3be32368,0x3c04b5b7,0x3bfb2756,0x3bd528e5,0x3baa3e57,0x3ae8dd21,0x3b3a39ac,0xbac2b267,0xbc397644,0xbc20d149,0xbc1a5bc5,0xbc170a43, +0x3ade0043,0x3bc661a8,0x3b89c496,0x3b4976be,0xbb951be1,0xbc093d60,0xbc9ff912,0xbcc5aa51,0xbccd038a,0xbca01772,0xbc778f95,0xbc38cc44,0xbc21f11c,0xbc0bdc19,0xbbe860ad,0xbb79a16a,0x3937ee5e,0x3bc1560c,0x3b7e81e4,0x3b8992aa,0x3bae7223,0x3bc88ebf,0x3bcbb744,0x3af8731f,0x3bd951eb, +0x3c026dac,0x3bc479ea,0x3b85be9e,0x3b184e07,0x3aae6b75,0x3ab400bc,0xb8836a69,0xbb4a1d7f,0xb91979fd,0xbb100386,0xbc23c3e7,0xbc65135a,0xbc76bfd8,0xbc61339d,0xbbeed9f6,0xbcec666a,0xbceb4658,0xbcc904f1,0xbc8aa1a8,0xbc1072a0,0x38dac5b6,0x3aa04368,0xbb6c5d7d,0xbb833ec3,0xbb460865, +0xba55a7a3,0x3bb83a63,0x3bf9c365,0x3bdb0fb0,0x3b8e8eed,0x3b549527,0x3b538ec0,0x3abbd7a1,0x3ab96036,0x3b1a081b,0x3be05634,0x3bed1b5b,0x3b8b0e52,0x3b35f9d6,0xb8a017e1,0xbaee92ff,0xbb89e394,0xbbb54837,0xbb8cfaf3,0xbc231fe7,0xbc048c0b,0x3a073a94,0x3b652a16,0x399a3b31,0xbc26d8e2, +0xbcae29b1,0xbc25e313,0xbbe7fa4b,0xbaf82a79,0xb937c825,0x3b8c00c1,0x3b899c43,0x3b96b7a5,0x3bccfe9e,0x3c112322,0x3c1f8df4,0x3c4fd777,0x3c0d03b1,0x3c00aadf,0x3bb34eed,0x3b8f8914,0x3b192c6d,0x3a8a62d5,0xb9109d37,0xba9aa579,0xbb2ead67,0xbb8f4f58,0xbbb7bcb2,0xbbd652ac,0xbc02bec2, +0xbc1b37cd,0xbc39a8e3,0xbc2ec4f9,0xbc2d3f7c,0xbc1f75e3,0xbc2f641e,0xbc44d969,0xbc6e885b,0xbc858958,0xbc89dffd,0xbc887dc3,0xbc4fcab1,0xbba8d550,0xbb544687,0xba619911,0xbae7ff11,0xb970567f,0x394cffeb,0x3a7c6726,0x3aeacfad,0x3a3a57f1,0xb91c442a,0xb98f9685,0xba8bb4cc,0xbaa73e1f, +0xbad19ef8,0xbb3e8cd1,0xbb8dfc22,0xbbc3b2fe,0xbbf318f3,0xbc13663d,0xbc2ee255,0xbc4103a0,0xbc56a397,0xbc6bf52a,0xbc820fc9,0xbc8bfc8b,0xbc99111f,0xbc910d39,0xbc8d9a9b,0xbc8c81ec,0xbc88d9d1,0xbc83a944,0xbc7bbdc1,0xbc4c2737,0xbc26146d,0xbc0a2d0f,0xbbdeda43,0xbc0fa303,0xbc05a6d1, +0xbc00b8a7,0xbbe99867,0xbbd2bd2f,0xbbea43ac,0xbbd168ef,0xbbaf918d,0xbbbdbe06,0xbbbffe8f,0xbbd02b0e,0xbbcc359f,0xbbd47ac8,0xbbd6274a,0xbbfd86ca,0xbc0a3364,0xbc050cb5,0xbc15f625,0xbc1fd917,0xbc266e36,0xbc2f1647,0xbc392a0c,0xbc424bd7,0xbc4a8a8a,0xbc52a3ac,0xbc5f2e11,0xbc5a190a, +0xbc57edc5,0xbc5303d6,0xbc4fa410,0xbc4c9681,0xbc4f0978,0xbc42d663,0xbc387d09,0xbc298cee,0xbc1d81e5,0xbc4d2ad6,0x3b8b94aa,0x3b906b2e,0x3b6efc40,0x3b832c5a,0x3b86d7bf,0x3b963e8a,0x3b6876fb,0x3b7ad7c3,0x3b804351,0x3b965609,0x3b9d42b5,0x3b964435,0x3ba5709a,0x3ba14d31,0x3b81b01d, +0x3b7a6f88,0x3b73fa8b,0x3b9eb72e,0x3b912da4,0x3b8b8116,0x3b7a8d71,0x3b81f5ce,0x3b7eed10,0x3b7d40cc,0x3b82d4e7,0x3b8097af,0x3b6fabb4,0x3b68a5f3,0x3b66bd5a,0x3b75816c,0x3b659519,0x3b696858,0x3b74a24f,0x3b7ad5d2,0x3b7c5f2c,0x3b63bf64,0x3b8cc5d8,0x3b955248,0x3b7b3382,0x3bb75eb8, +0x3b9da2b5,0x3ba650d5,0x3b5e50ca,0x3b3eda16,0x3b2ff6b0,0x3b96a42d,0x3bbaa72f,0x3bab79bb,0x3be0772b,0x3bc4c307,0x3b617ae9,0x3b67be15,0x3b761f61,0x3bc1fdb1,0x3baf996b,0x3bc988e1,0x3ba0bef0,0x3b90c5ef,0x3b8cbad2,0x3b8826db,0x3b9790e7,0x3b910f9a,0x3b61f8f8,0x3b5585ba,0x3b55f004, +0x3b8b5ca9,0x3b810ba1,0x3b6e03db,0x3b759a33,0x3b56785f,0x3b4df1a5,0x3b21e8ce,0x3b8a0d1d,0x3be6c225,0x3b81ec6d,0x3b9e342e,0x3b75dea3,0x3bae7489,0x3b17bebc,0x3b1ab910,0x3b2fed43,0x3bb58c3e,0x3be22c11,0x3bbc04e1,0x3c09a90d,0x3bfc4a8f,0x3b08e908,0x3b57ce1b,0x3b6702ab,0x3bf1a27a, +0x3bc88cf4,0x3bd9d486,0x3bbbbfed,0x3b9109a5,0x3b960f01,0x3b8157d3,0x3ba2ea81,0x3b8eaca9,0x3b33eb74,0x3b30e28f,0x3b2db83b,0x3b950eca,0x3b2cc7a5,0x3b3c28f1,0x3b7369ad,0x3b63ac85,0x3b66caa5,0x3b084073,0x3bdaef37,0x3ba7d476,0x3b88aab4,0x3bf811e2,0x3c13b00c,0x3c20bc07,0x3b338ed7, +0xb981c2f5,0x3a49c3b7,0x3b9d1de6,0x3c08553e,0x3c117b34,0x3c147080,0x3bb5b4ab,0xba1b0f82,0x3b8870ba,0x3ba6f018,0x3c22f897,0x3c1ae7e7,0x3c3533d8,0x3c12f560,0x3bb7cba7,0x3b99cee7,0x3b6b9ee7,0x3ba7bcae,0x3b997c08,0x3a5ca80c,0x3a59107b,0x3afa2ea7,0x3bde6a80,0x3bc0ebb6,0x3b50731f, +0x3b5c5965,0x3a5342c1,0xb9c66952,0xbb147826,0x3b7e7e49,0x3c827001,0x3bca33ea,0xbb552a90,0xbc3c604b,0xbc6b2a5a,0xbb006019,0x3bd8d6ce,0x3c41b751,0x3c91cfc0,0x3c2eb0ca,0xba5a8979,0x39d12582,0x3b4b83d3,0x3c21f985,0x3c25d835,0x3c06cd6c,0x3bf0bf6e,0x3b55810d,0x3adc4835,0x3a18e991, +0x3b2b6c8b,0x3bb46f93,0x3bf31262,0x3bcbe819,0x3bc9ec33,0x3bd968c0,0x3c6e188f,0x3c188900,0xbbf99c91,0xbbf0918f,0xbb78aec8,0x3c07f29a,0x3c06c257,0x3c50de95,0x3cc00aee,0x3ca0645e,0xbc74e23f,0xbce1a12f,0x3c9a6e25,0x3cd489e6,0x3865d1bb,0x3bd8412b,0x3b2b68f3,0xbb9afe8b,0x3a29a6b3, +0x3baafec0,0x3c26ddd1,0x3ba0e483,0x3b39727f,0x3b9fc7df,0x3be63a82,0x3c2e9a94,0x3bf6d095,0x3bf0fe77,0x3be2bece,0x3b77ccd6,0x3c1c6f24,0x3c0dcb7b,0x3b5d8f6f,0x3ba0e0bc,0x3bd67307,0x3c110463,0x3c021b54,0x3ba9a36a,0xbbbe8b8f,0x3c1ede81,0x3b24543a,0xbcd67083,0xbc685029,0xbc24db6b, +0xbc4f32a2,0xbc365295,0xbb48837d,0xbbcb387d,0xbbc482fe,0xbb942c7a,0x3b8e13e9,0x3b4ffd20,0xbad9c5eb,0x3b8b630c,0x3afb8e01,0xb9fdac0c,0x3b0143bd,0x3af81bcf,0x3b5b8f60,0x3b6d88c3,0x3abc1fb6,0x3b460127,0xb9c11859,0xba8142a5,0x39677024,0xb8cbf7d0,0x3bb75499,0x3bd7b5f5,0x3b4581f9, +0x3b211bf2,0xb930588d,0xba0123b4,0x3b5e7fce,0x3bf25fe1,0x3b8bb032,0x3c32e0b8,0x3c56aede,0x3c4446c4,0x3ba0a7d6,0x39071980,0x3bb7e11f,0xb960741f,0x3ac22572,0x3a1bb015,0x3b77d038,0x3babee8b,0xba9ad88f,0xba7a00f3,0xbad42d1b,0x39e7fcce,0x3929c203,0x3af165fe,0x3b4afa9b,0x3aa2d3db, +0x3af1b947,0x3b701c2d,0x3ba8cd7b,0x3bf30c97,0x3ba56806,0x3ba872e1,0x3bbd06ae,0x3b5b8944,0x3ba73b0a,0x3bc67719,0x3bc1a62f,0x3b9a900c,0x3b7fe006,0x3b3dcb0f,0x3b30a376,0xbb3994fe,0xbc6ae20b,0xbc1c8c62,0xbc0ab618,0xbbba19cd,0x3ae19b89,0x3bcb1729,0x3c0f856f,0x3b17d4fe,0xbb36bd9f, +0xbbb56cb1,0xbc6a828e,0xbcaf9933,0xbcd82b02,0xbc976c35,0xbc5b9db3,0xbc26a5bf,0xbbec5883,0xbbc61d22,0xbbbc5c87,0xbb956214,0xba71fefb,0x3bba4376,0x3b66227c,0x3b6ef7c8,0x3b47479f,0x3bc4522a,0x3bc39f28,0x3ae57543,0x3b9a547f,0x3bdafe59,0x3c0daf3f,0x3bee869c,0x3ba0c70f,0x3ad0100a, +0x3ae9b71c,0xba838277,0xbbc06a89,0xbb9cb662,0xbb92a568,0xbba224bd,0xbc0f4a83,0xbc23f0b8,0xbbebc1b0,0xbb66cb27,0xbcc30650,0xbcdce778,0xbcd93f4b,0xbca14960,0xbc2c3fe6,0xbba4383b,0xbb98d371,0xbc154f70,0xbc133870,0xbbecf7c9,0xbb6aff48,0x3af39857,0x3b917c57,0x3baa524b,0x3b393522, +0x3b0c9ccd,0x3b00f50c,0x3b40bc76,0x3b6e5288,0x3b676ba7,0x3bdace89,0x3bd8b777,0x3b90cbaf,0x3b4d13be,0x3a5f5de3,0xba26a272,0xbb4aa008,0xbb6adebe,0xbad6ce01,0xbba9a62b,0xbc0800a6,0xbc32dfb9,0xbb8aab69,0xbb722256,0xbc2e01aa,0xbc92fd1e,0xbc5cc532,0xbc5c15c3,0xbc13740a,0xbc000cfe, +0xbb96d5f0,0xbb7aee19,0xbb17e410,0xb984aa29,0x3b588d7a,0x3ba67bcd,0x3c0d678e,0x3bb76667,0x3bae1585,0x3b88d3ea,0x3b36d399,0x3a961d16,0xb9d44770,0xbad3ced0,0xbb2a060b,0xbb81bc12,0xbb3ac81c,0xbae64355,0xb9d6fcce,0xbae7a1a9,0xbb5ae773,0xbba8ad10,0xbbaa4619,0xbbbb8ba5,0xbbc59f91, +0xbbb0db3d,0xbb7b2f51,0xbb5cd500,0xbbe850cf,0xbc2eadea,0xbc5254c6,0xbc53d1ef,0xbbc63548,0xbb9107a0,0xbb1404ad,0xbb1b5a8c,0xba5bcfe6,0xb9981680,0x39e977e7,0x3abd2c8c,0x39bab0d5,0xb9d0b4ed,0xba1b1532,0xba76dd80,0xba784806,0xba894d67,0xbb2d69e6,0xbb6fbdcf,0xbb9ccde9,0xbbbe6a85, +0xbc043fd6,0xbbf7490a,0xbc0d1b56,0xbc27e4c1,0xbc3b164f,0xbc51e1ea,0xbc5fc77c,0xbc725f01,0xbc689b6b,0xbc670a62,0xbc6bba79,0xbc704b99,0xbc7e19a3,0xbc80270b,0xbc5fa7f1,0xbc380422,0xbc1b7852,0xbbfd4ed5,0xbc0a1db6,0xbc0045f9,0xbc06bbc1,0xbc0223cc,0xbc00c2f7,0xbbec3396,0xbbe9f2e6, +0xbbd87498,0xbbe36554,0xbbe52147,0xbbf40d4c,0xbbf4eff7,0xbc00440c,0xbc026d75,0xbc03c759,0xbbfe1eef,0xbc1a0726,0xbc161dd0,0xbc156904,0xbc06ec51,0xbc14b69e,0xbc1a04bc,0xbc216049,0xbc25e34b,0xbc2bca80,0xbc34b3f4,0xbc3521af,0xbc3682b4,0xbc351bd4,0xbc34c7fc,0xbc32d391,0xbc39aaca, +0xbc2c7188,0xbc25ffc0,0xbc1ca409,0xbc144f07,0xbc35334a,0x3b707b00,0x3b749022,0x3b486656,0x3b5f4e78,0x3b640eb1,0x3b77b35b,0x3b4eb02c,0x3b60e47e,0x3b6188e8,0x3b851339,0x3b8d6ad8,0x3b87f2bf,0x3b9c4317,0x3b98acaf,0x3b6ce29b,0x3b620c22,0x3b530214,0x3b8f5d80,0x3b77282d,0x3b695912, +0x3b46a42d,0x3b544f46,0x3b55c634,0x3b61ec96,0x3b6796d5,0x3b688422,0x3b61dbce,0x3b54afff,0x3b518559,0x3b6c47a7,0x3b4a2396,0x3b4946b3,0x3b5c5e4c,0x3b4eaec5,0x3b498628,0x3b2f307b,0x3b68bbb9,0x3b5f0ae5,0x3b211dd5,0x3b7928ab,0x3b5f353b,0x3b7c00b9,0x3b48ade4,0x3b37c064,0x3b183241, +0x3b8462a3,0x3ba319fe,0x3b9ac474,0x3bd85157,0x3bc0b1af,0x3b5777b0,0x3b519227,0x3b57a51f,0x3bab8cb9,0x3b9130af,0x3b9a7982,0x3b5882a7,0x3b4cc6af,0x3b563c36,0x3b77eb0f,0x3b86f50f,0x3b852df4,0x3b6b379e,0x3b554fec,0x3b5daa08,0x3b9fee4f,0x3b70bd54,0x3b4de30c,0x3b64c976,0x3b133286, +0x3af99f42,0x3aa1e49d,0x3b4ece2f,0x3bb80bad,0x3b403811,0x3b57b0d1,0x3b1dab21,0x3b5ea3e7,0x3b0a24db,0x3b268dfb,0x3b1f73df,0x3ba450e2,0x3bd32cce,0x3bb397d9,0x3c106dac,0x3c07a54a,0x3b26e53e,0x3b52e558,0x3b4a206f,0x3bdadd19,0x3b9e2916,0x3b9825a2,0x3b4b9956,0x3b2d1685,0x3b538aae, +0x3b82425b,0x3b9b2d16,0x3b9ba32c,0x3b7ee4e9,0x3b5dbc73,0x3b467b10,0x3bc6fbc6,0x3b300eaf,0x3b255ca9,0x3b81d99d,0x3b0ae2c2,0x3aca2246,0xb8c89d56,0x3b963bf0,0x3b202739,0x3aa38bf7,0x3b56e9a4,0x3bac044f,0x3bdb28d3,0x3b1e93c0,0x3a4872ae,0x38f29d61,0x3b86f5d5,0x3bebf0ce,0x3be2716f, +0x3c23246b,0x3bdcaa10,0xba61c357,0x3b543333,0x3b9d5856,0x3c2a4f07,0x3bf580a1,0x3bebcdbc,0x3b80a643,0x3b078c24,0x3b1d2055,0x3b6ed764,0x3ba2fcd2,0x3b9d2dcc,0x3b2379d0,0x3b1b86b8,0x3b80baf6,0x3c29fc65,0x3bce5614,0x3b4a6d64,0x3b70e30c,0xbabdb95f,0xbb5249de,0xbba07966,0x3ac63fec, +0x3c819690,0x3c091ff4,0xbb0b45ed,0xbc361fa9,0xbc79b55f,0xbb4765ee,0x3b97df76,0x3c01a449,0x3c90e44b,0x3c5668e7,0x3acc49c8,0x3901c848,0x3b35f9c3,0x3c363fa3,0x3c0f86f1,0x3bdae565,0x3bcedc75,0x3b0e93a3,0x3a164ed4,0x3a13f05b,0x3b8173cb,0x3bc302da,0x3bf9bb4c,0x3bd90ee5,0x3bfbdd34, +0x3c2f00e9,0x3c285d46,0x3b2348db,0xbc254cb7,0xbc1a7025,0xbb8978e7,0x3c1b9d31,0x3c2ad325,0x3c52495b,0x3c8e106f,0x3c81e13b,0xbc5346d4,0xbd082d68,0x3c8e1098,0x3ce18962,0xba439cf5,0x3c04b8e8,0x3b8ecb41,0xbb11b766,0x3a7c5c40,0x3b99273a,0x3c2ecfd1,0x3bcf5e0a,0x3b87040c,0x3ba30f48, +0x3c06c2b1,0x3c3753f4,0x3bb7e43e,0x3bc0acbe,0x3bc17e9c,0x3b87e77d,0x3c0bd902,0x3c0aead5,0x3bd9ae25,0x3bd7121a,0x3bf1f73d,0x3c09ad8e,0x3be85caa,0x3ba085ed,0xbb84d9e4,0x3c40d627,0x3ba99348,0xbc9efb9b,0xbc43e564,0xbc0fd1f8,0xbc08f6a7,0xbbe2fc35,0x3ae6716a,0xbc09c7c8,0xbc0d080d, +0xbbe34280,0x3b11ab31,0x3bb522f8,0x3b305ef7,0x3b6679c8,0x3b57cac6,0x3aa7abbe,0x3b28f345,0x3b024196,0x3b5e39bb,0x3b810b84,0x3a1dcea1,0x39e01c36,0xbb3e279c,0xbb253e4a,0xba9bbb3d,0xbae223fe,0x3b0baf1f,0x3b67eb06,0x3b5df2f9,0xb95334b0,0xbb27b5f8,0xbb309d99,0x3b840eef,0x3c118ad9, +0x3b8cd522,0x3c458fa2,0x3c3e3ecd,0x3bfc15d4,0x3b70aae7,0x3ad86a66,0x3c2b3bd0,0x3ba8387a,0x3b6dfdd9,0x3be4b657,0x3beb8bb2,0x3bd8fd17,0x39949eb6,0x3a372e1e,0xba8f4700,0xbb1eef44,0xba4095f9,0x3a30bcb5,0x3b19c39f,0x3ab2c4b2,0x3af22b36,0x3b37bcd4,0x3b950f87,0x3bc82932,0x3b35b31f, +0x3b35dc74,0x3b4df189,0x3b33c0dc,0x3b90cc6e,0x3baacd9f,0x3bc2a3be,0x3b77f75c,0x3b11e67f,0x3b1a48fd,0x3aa3d395,0xbb8c049d,0xbc6c152d,0xbc023d0f,0xbbd24c05,0xbb6e920a,0x3a553a8e,0x3bb3243b,0x3c2e7269,0x3b5b203f,0xbb5440f2,0xbc02122e,0xbc5007ef,0xbc9e5763,0xbcdd4b72,0xbca22fc2, +0xbc6a59b8,0xbc1e4c1d,0xbbb13563,0xbb77578c,0xbb73e885,0xbb8be9d6,0xbab4007a,0x3b8c9281,0x3b3eaee0,0x3b3d6f74,0x3a40bf6c,0x3b92160f,0x3ba193cf,0x3b1d20e5,0x3b0b0753,0x3b710a36,0x3c047236,0x3bcccde6,0x3b91087d,0x3a6ce525,0xba5a105d,0xbb3547b9,0xbbaabb4a,0xbbf0e67d,0xbbd04581, +0xbaabc4eb,0xbb9ed513,0xbbc80b97,0xbb8fc088,0xbafeeb34,0xbc9010c3,0xbcad737d,0xbcb83dcd,0xbc8d3f3d,0xbc08882d,0xbbefd610,0xbc06765f,0xbc3eed6e,0xbc3c55c0,0xbc1e9ba4,0xbbbd922a,0xbb2683d2,0x39a2e155,0x3b74dc4c,0x3ae901df,0x3afe560a,0x3ae6dfe7,0x3b8e3790,0x3ba18fb2,0x3b9059dc, +0x3bb010ea,0x3bb31d43,0x3bd305d4,0x3b64d9f6,0x3b042dc5,0xba22e390,0xbb170055,0xbb4c4e63,0xbb4c0bcc,0xbb56f56a,0xbc02c3ac,0xbc84c2a3,0xbc63e247,0xbc424715,0xbc3b6d57,0xbc7523b6,0xbc8898c1,0xbc9a3234,0xbc75a607,0xbc67c815,0xbc4121ec,0xbc205414,0xbbe43e82,0xbb89fd99,0xba385dae, +0x3ab5e21a,0x3b9d311c,0x3b648ce5,0x3b80a3b8,0x3b87e846,0x3b0d2df2,0x3a375fb2,0xba9722af,0xbaece960,0xbb2b759c,0xbb1b8c83,0x3a3f35dd,0x3b2f006e,0x3bb0928b,0x3b68f201,0x3b01acfd,0x39634e2c,0xb9fda6e5,0xbab4c636,0xbb259f60,0xbacf61a0,0x39dafe68,0x3b124e06,0xbaf97787,0xbbe4df49, +0xbc34890b,0xbc6613a0,0xbbd85d65,0xbbb889fe,0xbb6b6847,0xbb4d7f7c,0xbae0eecb,0xbaa9b590,0xba3ab31f,0x39d3109d,0xb98cb6a6,0xba073ebb,0xba048f38,0xb90ff4d3,0x399fdb50,0x3a52de72,0xba6ed6f3,0xbadb0b61,0xbb136447,0xbb472f70,0xbbaa57f5,0xbb9348a9,0xbbb0514c,0xbbd79066,0xbbeea7fc, +0xbc0503d9,0xbc0b1c0e,0xbc127130,0xbc14582d,0xbc1b5654,0xbc26370a,0xbc34ac27,0xbc4e316f,0xbc5d6be4,0xbc4ec901,0xbc2fa443,0xbc191db7,0xbc004c4f,0xbbce1048,0xbbc153f1,0xbbdd45ce,0xbbe3f69a,0xbbf8c10a,0xbbb606d0,0xbbc958c1,0xbbd019e5,0xbbd0e913,0xbbce5d0b,0xbbd5ee1f,0xbbd7e884, +0xbbe27fe4,0xbbe4cf60,0xbbc3001f,0xbba2bf67,0xbc069941,0xbbe4ef61,0xbbd374f0,0xbbab205b,0xbbbeca73,0xbbbfe3b5,0xbbc7f359,0xbbc74f3a,0xbbca9923,0xbbcfdab4,0xbbda9a70,0xbbe2a592,0xbbe77dcf,0xbbec6584,0xbbed3e90,0xbbfda85f,0xbbe8e85f,0xbbe53994,0xbbde4726,0xbbd8ddff,0xbbd8019e, +0x3b44301b,0x3b420d06,0x3b2e21d1,0x3b397141,0x3b3c5088,0x3b50a036,0x3b33910a,0x3b46aabc,0x3b466672,0x3b67d66d,0x3b783ea6,0x3b72b176,0x3b8eab1b,0x3b8bb81d,0x3b58627b,0x3b44b860,0x3b295efa,0x3b71f062,0x3b462881,0x3b3bd727,0x3b1f540f,0x3b2aa09a,0x3b2e854e,0x3b3ff040,0x3b3e81c2, +0x3b3c88e1,0x3b324fb0,0x3b2285b9,0x3b234e23,0x3b565918,0x3b2778fa,0x3b227701,0x3b341107,0x3b1b7341,0x3b12e185,0x3aefa1ef,0x3b30d550,0x3b253234,0x3afa3336,0x3b1b6b75,0x3b228680,0x3b47da10,0x3b3d1447,0x3b32fa75,0x3b0c738d,0x3b689209,0x3b8cb5c1,0x3b8a7192,0x3bc87932,0x3bb72a78, +0x3b5456f1,0x3b3dbbd7,0x3b335f9e,0x3b840231,0x3b610816,0x3b61ca1f,0x3b178fa6,0x3b187a4a,0x3b27234b,0x3b54a1e6,0x3b5513c2,0x3b3f54ce,0x3b1dad61,0x3aecff62,0x3b162df3,0x3b9e51f7,0x3b4d9301,0x3b2b5817,0x3b3d91b9,0x3a9c643a,0x3a36c182,0x3922ec86,0x3b0d84cc,0x3b8e3182,0x3b3bd64f, +0x3b26cac8,0x3b02ddea,0x3b24c530,0x3b206cdf,0x3b4bc5a0,0x3b29a553,0x3b9c224a,0x3bca7774,0x3bb3a6fe,0x3c14494f,0x3c0bdd64,0x3b5c33b7,0x3b5846d0,0x3b2954f7,0x3ba1886f,0x3b6c8daf,0x3b51dcc2,0x3af0751e,0x3aec0d79,0x3b22fb31,0x3b776700,0x3b7fc1bd,0x3b755d8c,0x3b2e75c1,0x3ad53691, +0x3acaab61,0x3bd661eb,0x3b1d9682,0x3b05e0bf,0x3b5a7d57,0x3a05f201,0xb9880adb,0xbb0b2ac7,0x3b27823a,0x3ad3160e,0x3a0f5cdf,0x3a2f59bf,0x3b441011,0x3ba0f778,0x3b294991,0x3af09890,0x39d70391,0x3b807c29,0x3bc9ed6a,0x3bb508af,0x3c2c8af9,0x3bfdaade,0x389a69fb,0x3b41512a,0x3b95d4a1, +0x3c1c55bb,0x3bb58c20,0x3b8247d0,0x3a71c2b8,0x39b3281c,0x3aaa0227,0x3b595806,0x3b746701,0x3b183371,0x38e746af,0xba1a0707,0x3b1aea4a,0x3c3d1a10,0x3bbb2fc5,0x3b3f8b88,0x3b513c23,0xbb6da150,0xbbbe338c,0xbbe276ce,0x387a3c28,0x3c44dab3,0x3c2997ac,0x3af4bb3d,0xbbe247bd,0xbc68050c, +0xbb1b657b,0x3b84bcda,0x3ba095d3,0x3c889bb1,0x3c749c5f,0x3b9631ec,0x3a0a7f87,0x3b32b122,0x3c3a84cf,0x3beb5cfd,0x3ba52e9f,0x3ba6a6c2,0x3b09997b,0x3aa93416,0x3b14a23d,0x3bb479d7,0x3bd6b374,0x3c026ccf,0x3bfcce89,0x3c20da5e,0x3c7af373,0x3bb58500,0xbb6d55a3,0xbc2f1ac6,0xbc1bb94c, +0xbb52f8ec,0x3c09cb4b,0x3c503c23,0x3c606ae7,0x3c4c1490,0x3c25e778,0xbbe6f512,0xbd0931d4,0x3c1b081c,0x3cb23fd1,0xba85dc83,0x3c01b86d,0x3bbda7a8,0x3ac8766d,0x3aa1ac87,0x3b5604e8,0x3c2bbc18,0x3bfbd869,0x3bb7b56f,0x3ba2c596,0x3c10febb,0x3c2e6056,0x3b85a054,0x3b8e9988,0x3b9a03b5, +0x3b86a6fc,0x3bd177cc,0x3bea287c,0x3c0ab1e8,0x3c041572,0x3c0a5d1e,0x3c0845ff,0x3bc16f17,0x3b855985,0xba80cfa9,0x3c4de922,0x3be9a731,0xbc486181,0xbc14b0b8,0xbbfdb6f6,0xbbcc7abf,0xba6e65e0,0x3bca8190,0xbbfdeca3,0xbc019c44,0xbbc73f71,0x3ad06ea2,0x3bee6295,0x3ba6bc7e,0x3ad48088, +0x3b732ac1,0x3b2c132f,0x3b3cafc7,0x3b10a0ab,0x3b610509,0x3b96e346,0x3997cc79,0xbae524af,0xbb8055cb,0xbb4e978d,0xbb11b9d7,0xbb378128,0xb9eec0c3,0x3ae1ba52,0x3bb569a5,0xbb0874f3,0xbb91e824,0xbb1491c0,0x3b71d0cc,0x3c07d2a4,0x3bb6a87a,0x3c392433,0x3c0cd273,0x3afd3975,0x3abfa5c5, +0x3b228cf9,0x3c3bc0aa,0x3c176bee,0x3bc3773b,0x3c1be173,0x3c0734f1,0x3bba4fad,0xba1f6ae5,0x39dea2b5,0xba95dede,0xbb58d167,0xb9f70564,0x3a1aa80b,0x3ae646e8,0x3af8c9b6,0x3b1411b8,0x3b1435d1,0x3b693fe3,0x3b8f1b4b,0x3aca10ef,0x3a85f9a3,0x3ac80bf5,0x3b49eb25,0x3b97a6f5,0x3b9fd249, +0x3bc44827,0x3ad994ee,0xb8fc73f4,0x3abf2fea,0xba828627,0xbb9c4d3d,0xbc2917ad,0xbb9fb0fb,0xbb4b7576,0xba659507,0x3b0f72ef,0x3b9f00de,0x3c029a59,0x3bad7b6b,0xbbbd4623,0xbc1733e3,0xbc54eaea,0xbc9625a4,0xbcd4067b,0xbcaf5225,0xbc835354,0xbc24104e,0xbba4ceb9,0xbb25312b,0xbb079ab9, +0xbb5245e3,0xbabf86eb,0x3b00e508,0x3b01e1af,0x3b16b4c8,0x38b6c752,0x3b156a68,0x3b34066c,0x3b0e12c8,0xb9028266,0x3a5a02a6,0x3ba7fefb,0x3b9eb37b,0x3b6f4982,0xb9539e5d,0xbb02a118,0xbb71a94e,0xbb8df572,0xbc1de37c,0xbc17d89f,0xbab2b322,0xbb2cc066,0xbb38c0cc,0xbb03ac80,0xbb55b9dc, +0xbc5370cb,0xbc79ceff,0xbc86de56,0xbc50fe2f,0xbbb613ce,0xbc01eea1,0xbc271d9c,0xbc521c68,0xbc4d0697,0xbc349cc6,0xbc02cc35,0xbbd7a359,0xbb5fd4fe,0x3afcbd73,0x3aa153d6,0x3b0e2eed,0x3b015814,0x3b96c778,0x3ba560dc,0x3b9bc8a6,0x3b73c9b2,0x3b868b89,0x3be6fc72,0x3b6fef06,0x3b0f45d6, +0xba69f9f8,0xbaedc8d9,0xbb600880,0xbbac0506,0xbbb748f2,0xbc148960,0xbc6d2e17,0xbc9811a1,0xbc92e590,0xbc5aba05,0xbc580d66,0xbc93dfd4,0xbcac6bbc,0xbc988cc3,0xbc914031,0xbc844a1a,0xbc569368,0xbc162118,0xbbba56bf,0xbb3be9eb,0xba99bd3c,0x3ae6c7f2,0x3adb3233,0x3b4b3eeb,0x3b8332d4, +0x3b069ede,0x3a545bb0,0xba3992bd,0xb929147e,0x3716d1c8,0x3ae6f4f6,0x3b91ce28,0x3bc07734,0x3c0870bc,0x3bd3d110,0x3ba6a7d6,0x3b6497a1,0x3b11f9b6,0x3a7915ff,0xba5c8f63,0xb983f4e5,0x3a1591ef,0x3af5b98d,0xbafe190c,0xbbdb1254,0xbc3bad12,0xbc798487,0xbbdfe78d,0xbbdbcfb9,0xbba7260c, +0xbb841c59,0xbb3e2729,0xbb1d8676,0xbb021a10,0xba82640c,0xba927de3,0xba689df2,0xb9eb4833,0x39acc631,0x3a8fb5f0,0x3b10dbd7,0x3a2b43ea,0xb8c7083e,0xba2bb81c,0xbac521bb,0xbb66c812,0xbb578cd8,0xbb6b6c0c,0xbb83e984,0xbb893ea4,0xbb8c5735,0xbb859c5c,0xbb76a264,0xbb8e3f92,0xbba30931, +0xbbbadc9a,0xbbdb7599,0xbc04b59c,0xbc165b56,0xbc191c79,0xbc0c787a,0xbc024412,0xbbecae0d,0xbb74c2e6,0xbb7343b8,0xbb8cc6a1,0xbb9865f6,0xbbb052fe,0xbb537d01,0xbb7a7875,0xbb8bd17c,0xbb813b42,0xbb6d5a07,0xbb69f5bf,0xbb609a19,0xbb67d111,0xbb5d4ff1,0xbb284b1e,0xbae10e5c,0xbb9b7286, +0xbb6a942e,0xbb4a9bf8,0xbb0d788f,0xbb1bc8b0,0xbb13ad38,0xbb15360c,0xbb0a1af9,0xbb07bff3,0xbb015d14,0xbb1c9bee,0xbb2d7931,0xbb3cc7ca,0xbb4bb041,0xbb54a56b,0xbb6d0c3c,0xbb5c8540,0xbb6407b3,0xbb6a9afb,0xbb74c28f,0xbaf47d85,0x3b141a77,0x3b102547,0x3b1bb7df,0x3b215516,0x3b22c118, +0x3b307637,0x3b194df6,0x3b304ee8,0x3b303e91,0x3b4caddf,0x3b5adfd6,0x3b58c770,0x3b80cf40,0x3b7d1fdc,0x3b492d89,0x3b28c926,0x3b003e85,0x3b3c1253,0x3b1c9d8c,0x3b17799c,0x3af553b7,0x3b06729b,0x3b089bbd,0x3b169536,0x3b0977ae,0x3afbf4c6,0x3ac7e538,0x3ab5dd80,0x3ac83304,0x3b2ff17c, +0x3afd82f1,0x3af52dbf,0x3b0ac4af,0x3ad4222c,0x3abd9a02,0x3a8f423b,0x3aefe8ad,0x3adad775,0x3afe88c6,0x3aebd2db,0x3b0632e3,0x3b26e73a,0x3b3e92be,0x3b335f8f,0x3b0343ce,0x3b4cd8e3,0x3b773544,0x3b7ea5ab,0x3bb7e06b,0x3bab4a1e,0x3b5850c5,0x3b27255b,0x3b050231,0x3b24d4e0,0x3b1f8d75, +0x3b291b56,0x3ae56b7d,0x3b031041,0x3b0f60af,0x3b2b0a2e,0x3b034fa5,0x3a927f51,0x3954e828,0xb9bd961f,0x3a21bfaa,0x3b88317d,0x3b206ff5,0x3b0b8ec9,0x3b111631,0x39876487,0xb9dfc705,0xba3108b6,0x3a8cd54d,0x3b5aef87,0x3b8068f0,0x3b39fa0e,0x3b176d4b,0x3b0c4bef,0x3b3a48ca,0x3b7474ae, +0x3b3bcb9e,0x3b9d6f25,0x3bc71e99,0x3bbd01f0,0x3c164a57,0x3c0e49a3,0x3b8d62b3,0x3b582018,0x3af70e50,0x3b2ba1be,0x3b295dfc,0x3b24ad89,0x3ac3e4ef,0x3aeb41da,0x3b176ea2,0x3b58c746,0x3b1ce4b2,0x3ab819d6,0xba2fa609,0xbad62074,0xba818b95,0x3bbde631,0x3af9a25d,0x3aed847c,0x3b371a7a, +0xba2a91ec,0xbae11f65,0xbb3bb112,0x3a651935,0x3ab2c28f,0x3acda082,0xb8fefbb2,0x3b096ff4,0x3b805c20,0x3b6200ed,0x3b46f384,0x3a996677,0x3b88ac05,0x3bb94ab1,0x3bad0bbb,0x3c36101f,0x3c10d4a0,0x3af2670b,0x3b4cfbec,0x3b81f3da,0x3be2a978,0x3b6d3380,0x3b0a990f,0xb7dfd1fb,0x3a1272a6, +0x3ace5a3b,0x3b47b6a3,0x3abe4a9b,0xbb032170,0xbba50d92,0xbbbbf2c7,0xba846426,0x3c2cb5b5,0x3b967d63,0x3b4466e3,0x3b305378,0xbbaab8b8,0xbc027745,0xbbedef4b,0xba7a2143,0x3bf520f8,0x3c3afa82,0x3bda7f1c,0xba89c145,0xbc40197e,0xbb10ce24,0x3b60e081,0x3b76b6c3,0x3c7163b7,0x3c802359, +0x3c01835a,0x3ac6ed93,0x3b300e8f,0x3c2e7cf5,0x3bb8bb5f,0x3b7d976c,0x3b922ee4,0x3b575d91,0x3b642286,0x3b8ee6fa,0x3bd3275f,0x3be12bf3,0x3c04f091,0x3c0a9e94,0x3c3397ee,0x3c8f2fb4,0x3a90b3fe,0xbc0b3816,0xbc319476,0xbbfe34b9,0xba60e895,0x3bc1b856,0x3c76d625,0x3c787377,0x3c02badb, +0x3b9caed6,0xbac0a2f5,0xbcf160d6,0xbb58f98c,0x3c202cd7,0x3b2dbebe,0x3bdb3083,0x3bc1f802,0x3ba65f3c,0x3af84cef,0x3b17a015,0x3c21c13d,0x3c146b63,0x3bebc067,0x3b9b8df2,0x3c0db5f4,0x3c173efa,0x3b57fb3f,0x3b3e40c7,0x3b479669,0x3b77a961,0x3b924c5e,0x3bc8b56d,0x3c2728ca,0x3c249f01, +0x3c1b8953,0x3c0dee69,0x3b8a6e47,0x3b3507f9,0x3b1538e9,0x3c3ed787,0x3be66d4f,0xbc047c8e,0xbbbcbb2d,0xbbb5e4a2,0xbbb659cc,0x3b8d03cb,0x3c1bceaa,0xbb475a3d,0xbb572b0f,0xbaffb27b,0x3b396320,0x3c09aa94,0x3bd6e56f,0x39c0d03e,0x3b615be3,0x3b52bc29,0x3b41d7fa,0x3b1cbfcd,0x3b60f6df, +0x3bace4df,0x39e5bb01,0xbb3c369d,0xbb501230,0xbb3e0d53,0xbb3a8b42,0xbb44d765,0xbb0c3980,0x3971c80b,0x3bbd9a2c,0xbb3caabd,0xbb833730,0x3795d491,0x3b7c16a3,0x3bdf8fd4,0x3bea5fae,0x3bd2b0f1,0x3b074ecc,0xbb5340d8,0xbb1dc40c,0x3acca4a5,0x3c2d058c,0x3c39a7b5,0x3bdf4460,0x3c0cc4aa, +0x3bc92d20,0x3b38dfef,0xbb359088,0xba9e85af,0xbb0a4280,0xbb6013b2,0x3a296ef3,0x3ac1660f,0x3ac2e321,0x3b3c44f8,0x3b4aca29,0x3b06476c,0x3b15cf46,0x3b20820e,0x3a844cbf,0xb995ec4a,0x3a2db76b,0x3b5f58a5,0x3b9dda76,0x3b9a1a9e,0x3bac7e89,0x3a4a499c,0xba968502,0xba8b9ad6,0xbb3e1e8b, +0xbb963f40,0xbb9df663,0xbaff2eaf,0x39e93b17,0x3b954e21,0x3bc9dca2,0x3bcd1d38,0x3bcf3b62,0x3bd9443b,0xbbec96d2,0xbc043f4f,0xbc5a78c0,0xbc8f94f9,0xbcb0c093,0xbcaba09f,0xbc87db32,0xbc2cab9d,0xbbb7d9d8,0xbb1a79ef,0xbab42ff7,0xbb08b3fd,0xbac638aa,0xba376868,0x3a65744f,0x3ae134c9, +0x398bf173,0x3a4a279c,0x3a815e1b,0x3b01532e,0xba08ee8c,0xb8e3d55b,0x3b1bfd38,0x3b5ead2a,0x3b443fbf,0x3944dc75,0xbaadc9b0,0xbb83f1c7,0xbb8ee07c,0xbc2bd8fb,0xbc356ece,0xbb8dbe6c,0xbb10d73d,0xb94c05e0,0x3a89dbed,0xbb88048f,0xbc2c9f42,0xbc3b6591,0xbc3fe68a,0xbc1a51e3,0xbba2c4f9, +0xbc1748b6,0xbc47d764,0xbc5cd01d,0xbc5135ea,0xbc3d232b,0xbc1bbfbd,0xbc19813f,0xbbcf0f72,0xba0d578e,0x3a709024,0x3b22a586,0x3b1733d9,0x3b837546,0x3b8ce125,0x3b8b06b9,0x3b110e4c,0x3b16d78f,0x3b8fc3c6,0x3b681cd0,0x3af7833f,0xba8922c6,0xbb053f52,0xbb5d470c,0xbb97765e,0xbbdcc8a6, +0xbc15fce4,0xbc3bdae4,0xbc827e25,0xbc8d3293,0xbc794403,0xbc4c6291,0xbc87fa95,0xbc9a69fd,0xbc92d54f,0xbc8a4cde,0xbc81e84a,0xbc504023,0xbc0ea5cd,0xbbae094a,0xbb73f803,0xbb55ddeb,0xbaa362f3,0xba31d859,0x3af51564,0x3b42ad32,0x3ae7186d,0x3a857433,0x3a10d017,0x3adaa627,0x3b30683e, +0x3b8f6eff,0x3bb33dce,0x3bcade27,0x3bef6f5c,0x3bd15ecd,0x3bc0658f,0x3bb478b6,0x3b6f0356,0x3ac7891b,0xba96b5fc,0xbad7f305,0xbb152656,0xbb2251f4,0xbbb89f15,0xbc130675,0xbc522cd2,0xbc7708c6,0xbbf6e47d,0xbc05119a,0xbbd72eea,0xbbb4c3f5,0xbb92ae7a,0xbb797f9c,0xbb697b01,0xbb2face0, +0xbb28c36f,0xbb03b556,0xbaa1b0ca,0xba0dc6b5,0x393f638b,0x3ac80ebc,0x3a343f04,0x39c0340c,0xb8e00b24,0xba368f45,0xbb15d2fc,0xbab741f5,0xba9ef263,0xbaa7b087,0xba95ffa0,0xba4c4fbc,0xb9b95e5b,0x398db597,0xba3cfd42,0xbaaf0212,0xbb0347e8,0xbb3ccc5c,0xbb83814c,0xbba349ac,0xbbc25277, +0xbbcf17eb,0xbbd81238,0xbbe5142f,0xbb213641,0xbb4099ab,0xbb24f4f2,0xbb2be4b9,0xbb365604,0xbafdce93,0xbaf811a6,0xbaf08b80,0xbaadf3d8,0xba613b71,0xba2bd0e9,0xb9a26967,0xb973ca3d,0x3803f313,0xb8d26a5f,0x395d60a3,0xbaa8fcdb,0xba2aa00b,0xb9e56fae,0x39509a3e,0x38befd94,0x3995f17e, +0x39cb1f19,0x3a0412df,0x3a08a1c5,0x3a38f4f1,0x399ac836,0x361d4b0e,0xb9aa538a,0xba2b7859,0xba6f47e2,0xba9f93b1,0xbaac42c7,0xbacf75b5,0xbaf92994,0xbb1198fd,0x39f7e3b7,0x3ac083e6,0x3ac235df,0x3b09eb95,0x3b0518a3,0x3b023dfa,0x3b06b755,0x3aef806c,0x3b0b2739,0x3b099e52,0x3b2582c8, +0x3b3125bc,0x3b31fc14,0x3b56828e,0x3b52e2d6,0x3b2d2109,0x3af55b32,0x3a9bae8e,0x3aeca875,0x3ad18932,0x3ad5507f,0x3aac93de,0x3ac934f2,0x3ac722ec,0x3ad257d2,0x3a975158,0x3a52fced,0x394863d4,0x395bdae0,0x39f661ac,0x3aef68ef,0x3a94620e,0x3a92fe66,0x3ab778ce,0x3a54cfaf,0x3a213a50, +0x39ad03e8,0x3a83e544,0x3a8633dd,0x3b0800b8,0x3ab9367f,0x3aea8a35,0x3b094b4d,0x3b414fc7,0x3b31a37f,0x3ad9ccd8,0x3b3181e6,0x3b5996e5,0x3b66fbd7,0x3ba3997c,0x3b9a0a3d,0x3b562021,0x3b0121f4,0x3a913c84,0x3a68f51f,0x3ab8e9db,0x3aee27ed,0x3aaec780,0x3af81a2c,0x3afb7a9c,0x3af214f4, +0x39ebafe6,0xba753ce5,0xbb09a9be,0xbb195553,0xba7b8986,0x3b41aaf2,0x3ac1df91,0x3aac7d9f,0x3aa9424f,0xba35707c,0xbab6f918,0xbabd55fc,0x39154ada,0x3b2fee5d,0x3bacca5d,0x3b6e93c8,0x3b449871,0x3b0ab11e,0x3b5ad7a7,0x3b8b9aef,0x3b3776f0,0x3ba00388,0x3bc42add,0x3bc4efec,0x3c13ed32, +0x3c0bdfe7,0x3ba55e37,0x3b40339d,0x3a73616a,0x3996febf,0x3ad5ca39,0x3b08f222,0x3ac2f83f,0x3b18eaee,0x3b20dff9,0x3b3049b9,0x39ae54cc,0xbad96e6e,0xbb93d497,0xbba1180c,0xbb646f8a,0x3b844db3,0x3a3b5d7c,0x3a67386d,0x3af9e73b,0xbafb82d5,0xbb4501e2,0xbb65a6eb,0xb9bca3ed,0x3aba8ed0, +0x3b5fc395,0xb8562dbb,0x3b059e67,0x3b71c1ae,0x3badfef1,0x3b99b2f4,0x3aed1970,0x3b9a19d5,0x3bbca8e6,0x3bc45eba,0x3c421eca,0x3c253c04,0x3b807e76,0x3b5efd82,0x3b3d3769,0x3b59bc2d,0x3afcbded,0x3ab84c9a,0x39860d5a,0x3af473ad,0x3b1bf1f7,0x3b22890d,0xbaebc084,0xbbe58439,0xbc292cae, +0xbc256a45,0xbb77efb4,0x3c07a937,0x3b3bef65,0x3b026ee8,0x3ac05ce5,0xbbd6106a,0xbc18e247,0xbbed2475,0xbaeecfd1,0x3b9deca6,0x3c5c6b38,0x3c43ed74,0x3b9a08a9,0xbc11d22d,0xbb65db48,0x3af3bd13,0x3b78299a,0x3c47425b,0x3c785179,0x3c3843c6,0x3b3730cf,0x3b219336,0x3c186714,0x3b8b82b3, +0x3b5e813e,0x3ba17f6d,0x3ba90f28,0x3bbe24a6,0x3bc0aca4,0x3bd4d103,0x3bdb6038,0x3c063302,0x3c135514,0x3c36db6a,0x3c8629e2,0xbb5b9014,0xbc54d373,0xbc5501d6,0xbbdc2481,0x3a3890da,0x3b18bb89,0x3c7bf634,0x3c7c224b,0x3b84e0e0,0x3aa38cfd,0x3acc250a,0xbcca3d1d,0xbc8ea14f,0xbb86f5d4, +0x3c16869e,0x3bc84072,0x3bab0d3a,0x3bf47c88,0x3b3ebd93,0x3b1cce16,0x3c1427cb,0x3c29ea01,0x3c0dc7af,0x3b8de5dd,0x3bf49aef,0x3be72444,0x3b3a4a61,0x3ae53b7a,0x3ada9d55,0x3b658e70,0x3b43a832,0x3bac22c0,0x3c2ffc0c,0x3c31379e,0x3c1a6fe9,0x3be79e1a,0x3b2e6e73,0x3b221b7b,0x3bbc8979, +0x3c0d75f3,0x3b962d4c,0xbbb4b58a,0xbb284e70,0xbb18c8a7,0xbba0f888,0x3bf085e5,0x3c611af1,0x3b92ce5f,0x3b8352c3,0x3b838771,0x3b99836e,0x3c07e715,0x3bd48ded,0xb9d49a15,0x3b4af101,0x3b713184,0x3b34b9b2,0x3b2729d9,0x3b5f670c,0x3bb74f16,0x3a61f344,0xbb3dbfa8,0xbacda1e1,0xbb0b5a12, +0xbb3aa2ed,0xbb1dbc8c,0xbb4cc8f0,0xba987b40,0x3b8c39ea,0xbabc2cce,0xbac31445,0x39f9dbfa,0x3b6e38d8,0x3b8bdda9,0x3bdc1fad,0xba1f6666,0xbbaf37d0,0xbbbb8c9a,0xbbbcf8e0,0x3a39421a,0x3c215dee,0x3c54c4f9,0x3bad60a3,0x3bac88c4,0x3b0a1789,0xba5c7918,0xbb927dfd,0xbb2424b4,0xbb401cc6, +0xbb6369b7,0x3ad44559,0x3b2dd8a1,0x3ae0687c,0x3b847775,0x3b78c254,0x3ad40497,0x3a671e7b,0x3a4074f8,0x3a75a8e4,0xba5fbdfe,0x39567e5d,0x3b7578f0,0x3bb1aea8,0x3bb3bec8,0x3bb2e9a8,0x3aa2b128,0xba6fa1ea,0xbb36e99f,0xbb8703c1,0xbb8691c0,0x3a844e4e,0x3965474a,0x3b7f04da,0x3c41a580, +0x3c2a89d1,0x3c0c6803,0x3bcf587c,0x3bcbda4c,0xbbc6476a,0xbbd2f029,0xbc4d9bf4,0xbc80d779,0xbc8272b3,0xbc968d0c,0xbc7b064b,0xbc2adb40,0xbbce5ae2,0xbb3d584c,0xbae68985,0xbadf3369,0xbae0ad14,0xbb3dc802,0x388c9eb1,0x3a8ee7df,0x3948bc02,0x38a40a43,0x399b5a34,0x3ae6a5c7,0xba23f2e2, +0xba5054ae,0x397ad572,0x3acac256,0x3aff09c1,0x3a5cb10d,0xba964b0a,0xbb6aa7e1,0xbb83d19f,0xbc1cc85c,0xbc37e3ae,0xbc105622,0xbb701a3a,0x39e77af1,0x3b2d941c,0xbb432df2,0xbc10b944,0xbc141e0b,0xbc134283,0xbc0a97a6,0xbbf571f4,0xbc41d8ac,0xbc6ac616,0xbc698d8d,0xbc539e66,0xbc3c3bcd, +0xbc232681,0xbc2be19c,0xbc04dc4a,0xbb4b7f81,0x39cb968e,0x3b232727,0x3b295ce9,0x3b64401e,0x3b6b4960,0x3b5c118c,0x3aa9326d,0x3a64d19e,0x3a9cde9d,0x3b425026,0x3b059ae5,0xb9667942,0xbb0c1b39,0xbb5e89e1,0xbb8e9f6d,0xbba454fa,0xbbcac351,0xbc12fda9,0xbc2da015,0xbc52252b,0xbc6d7a1f, +0xbc3568e4,0xbc5ce126,0xbc6e2260,0xbc699ba9,0xbc552a18,0xbc45695c,0xbc1f3de2,0xbbe000a8,0xbb8d1d71,0xbb8ea40b,0xbbb32477,0xbb9e7922,0xbb6fe893,0xb981beba,0x3a787e96,0x3a943eab,0x3ab2d09a,0x3b23bbc9,0x3b3f9ee6,0x3b6adc1d,0x3b887bc0,0x3b8609f5,0x3b8cb9ef,0x3b88c271,0x3b94659f, +0x3ba8a799,0x3bd4f9ff,0x3b75bbe4,0x3a681194,0xbb217129,0xbb88a4ac,0xbbc0b24d,0xbbea31d7,0xbc1426cf,0xbc2ed780,0xbc53112e,0xbc5a2f02,0xbc0f957d,0xbc250b11,0xbc0c19c1,0xbc0198a3,0xbbe1758e,0xbbc93be6,0xbbc2633e,0xbba3cddb,0xbb9bd279,0xbb78f370,0xbb3ab895,0xbb196096,0xbae99b75, +0xba11842d,0xb9956959,0x39436784,0x39a746de,0x3a08c78e,0x39127dc9,0x3b0648f2,0x3b16fcec,0x3b165323,0x3b226c26,0x3b3b0ad8,0x3b44b9c9,0x3b62938d,0x3b0ddf3f,0x3acb6a5c,0x3a650d14,0x389e1fd1,0xba6d4443,0xbaf515fa,0xbb650e8d,0xbba00088,0xbbc57ce5,0xbbf3fd10,0xbb3a44a5,0xbb73f6b9, +0xbb2ec528,0xbb209f0b,0xbaf9d1d1,0xbb1d431d,0xbaebc9eb,0xba8c1c2e,0xba12100e,0xb8f7064d,0x3910b8ff,0x3a0e2892,0x3a38f5c7,0x3a72afd8,0x39912f8a,0x3995776b,0x39acb589,0x3a1726bc,0x3a32a0a8,0x3a9fda18,0x3a891a58,0x3aa327d6,0x3ab1ba06,0x3ab62605,0x3ab8d62d,0x3ad3e326,0x3a998f3f, +0x3a4be9c5,0x39aa59a5,0xb8fd9a49,0xba093425,0xba5e29e0,0xba9bae89,0xbacc1522,0xbb03e918,0xbb201e90,0x3942cab4,0x3a2d135a,0x3a4e7fdd,0x3ae675ac,0x3ace6bb4,0x3ac8ab0a,0x3ac5afd1,0x3aa5582b,0x3acd44a7,0x3abd8089,0x3b00d053,0x3b0b0807,0x3b0afc00,0x3b2b2062,0x3b272991,0x3b0ec369, +0x3a94b758,0x39dcea63,0x3a5d064b,0x3a5c8600,0x3a6d50e2,0x3a3a8837,0x3a839391,0x3a72f05a,0x3a5ecafb,0x392c9ec2,0xb9a4be3f,0xba85398f,0xba52ca30,0xb9f1f452,0x3a5cba18,0x3995b754,0x39b042b8,0x3a412373,0xb79c67dd,0xb96be8c8,0xb9b9ae96,0x3965a116,0x39f6cc1f,0x3b141231,0x3ab3df4a, +0x3acc352c,0x3ad0bb97,0x3b3ab745,0x3b26bb10,0x3a8d5a54,0x3b154426,0x3b3c784e,0x3b4b5520,0x3b8b64c1,0x3b83576f,0x3b47e624,0x3aa53ffc,0x3922eec0,0xb9f8f617,0x39c36b07,0x3a95bb6e,0x3a722acb,0x3ae1dec5,0x3acd72c3,0x3a75709c,0xba932e02,0xbb351eb3,0xbb803fc9,0xbb6e69b8,0xbb0855f6, +0x3aba0a9e,0x39b63156,0x399b0b30,0x3a06e47c,0xbadae6ba,0xbb15a125,0xbb00947f,0xba2a78eb,0x3b08af54,0x3bdaad7b,0x3b96368a,0x3b72c25f,0x3b0de870,0x3b7adebe,0x3b962b38,0x3b1439ce,0x3ba12b76,0x3bbfd454,0x3bc44e9b,0x3c0acf86,0x3c030316,0x3bab9c23,0x3b15cf2a,0xb905c6c2,0xbaca7ed9, +0x3a10028d,0x3ac7c4ea,0x3ac4acad,0x3b3af5c4,0x3b28f72c,0x3ae3d593,0xbafa7557,0xbb9810fe,0xbbf912dc,0xbbe74040,0xbba62d9c,0x3adf3ffa,0xba236fbc,0xb9964761,0x3ab69a39,0xbb55a93d,0xbb897e4c,0xbb7a3e75,0xbab47861,0x3abdb3e0,0x3bc48f5d,0x3ab56780,0x3b2924db,0x3b66f4be,0x3be80874, +0x3bc98e22,0x3b097ce7,0x3baa899d,0x3bc66e1a,0x3bdea7ab,0x3c4dec6e,0x3c36c833,0x3bb7e308,0x3b61a082,0x3abd7034,0xb928c242,0x396a43c8,0x3a86c0f0,0x3a5d0da6,0x3b57e5b7,0x3b4cbb82,0x3aab78a2,0xbba9d682,0xbc36ad67,0xbc631912,0xbc46a41b,0xbbaa528e,0x3ba46e46,0x3a60a937,0x39c365d3, +0x3a5e062e,0xbbfcc80f,0xbc253864,0xbbd89b10,0xbb2601b6,0x3b601336,0x3c75e9e3,0x3c8b07a9,0x3c2341cc,0xbba46282,0xbba0db0c,0xb9c4cdfb,0x3b7de4ec,0x3c199af2,0x3c646bbb,0x3c6ff7f5,0x3b81ef18,0x3afd097e,0x3c006fa6,0x3b4d9901,0x3b5bc3ab,0x3bbe4fe2,0x3bdba2db,0x3bf092e3,0x3bcd1dfa, +0x3bbd052d,0x3bc9e8f9,0x3bfd58ff,0x3c11c870,0x3c22b6ce,0x3c3d0246,0xbbee4a60,0xbc83c153,0xbc830e74,0xbbcf2219,0x3abedeac,0xbaab165e,0x3c5f5d1a,0x3c5b7071,0xb9178767,0xba60cfa3,0x3ae67cd2,0xbca4968d,0xbcf0865f,0xbc845cef,0x3c7bbd82,0x3be558f3,0x3ba1ca85,0x3c03587c,0x3b71a54d, +0x3b32ba17,0x3c018c28,0x3c3522c1,0x3c1b946d,0x3b76396a,0x3bb9e795,0x3b972e52,0x3b22531b,0x3a9624dd,0x3a8cd636,0x3b51b97f,0x3acc4338,0x3b823146,0x3c21e41c,0x3c2db61c,0x3c0add51,0x3b94160e,0x3ac6cade,0x3b271926,0x3c0a1b6b,0x3b83f767,0xba17c107,0xbbebd071,0xb9a74aef,0x3ac35e8b, +0xbb40f748,0x3c027526,0x3c9014de,0x3c5d58be,0x3c499b92,0x3c2b84c2,0x3be559f8,0x3c052614,0x3bccfbef,0xb9e1da03,0x3b58eb60,0x3b8b3db3,0x3b1ce22b,0x3b2ed967,0x3b5d0863,0x3bb578e8,0x3ab2ecae,0xbb17dc47,0xb9340cba,0xbaa33b3c,0xbb0dacb6,0xbada9489,0xbb5452db,0xbae19cd6,0x3b2664ea, +0xba37a8e2,0x39d87cf8,0x3b097b49,0x3b65764d,0x3b0654ca,0x3bc2d066,0xbbbe6adb,0xbc208085,0xbbc19c39,0xbbb568ea,0x3af18fc3,0x3c1c9573,0x3c68f9f8,0x3b2bf60b,0x37d0e5e5,0xbb184e8c,0xbb74c985,0xbba330e8,0xbb186945,0xbb2f2171,0xbb42251e,0x3b015852,0x3b5e67ec,0x3b1114bd,0x3b9ccd0c, +0x3b80b0b8,0x3a393480,0xb954f222,0xb9b47f49,0x3a6e947a,0xba4d04bc,0x39a39319,0x3b831286,0x3bb788b8,0x3bc155ad,0x3bb14ef9,0x3b0a6a25,0x3940ed7c,0xbb40f453,0xbbb4f0ca,0xbb7fe91b,0x3bbf3f88,0x3ab34405,0x3bcd8f76,0x3c8df094,0x3c652188,0x3c32d282,0x3bc9bf3b,0x3bac3f6d,0xbb801cbe, +0xbbaadcb7,0xbc26f73f,0xbc4f33bb,0xbc3d58ab,0xbc6d5e44,0xbc4a4ec4,0xbc15692b,0xbbcdbf0e,0xbb66b790,0xbb3e5d59,0xbb1901da,0xbb17bcbf,0xbb8afeb7,0xb985e973,0x3a2ad351,0xb6abe4b4,0xb84df059,0x393ada64,0x3aa44f09,0xb9efb292,0xba897570,0xba820341,0x38152df5,0x3a2b4e7c,0x3a8cc67d, +0xb9e629cb,0xbaea1ce2,0xbb387e30,0xbbfa0b48,0xbc29c74d,0xbc4d60e0,0xbbb66e2c,0xb9f26e9f,0x3b025e37,0xbab2104e,0xbbe60cac,0xbbe2fd1a,0xbbe7608b,0xbc08ad32,0xbc331c83,0xbc6598b3,0xbc81364c,0xbc7dae61,0xbc5bccd6,0xbc3b94c4,0xbc235b90,0xbc29f211,0xbc0e6a4f,0xbba8c64d,0xba4afc89, +0x3aeaec72,0x3b4563c1,0x3b418ff6,0x3b399b35,0x3b24448d,0x3a523196,0x39328aa4,0xb9fd9657,0x3ad9a292,0x3b04177a,0x3aa2bcc9,0xbaaee944,0xbb3e9078,0xbb8e46e9,0xbb5d6507,0xbb538e19,0xbbbd56e4,0xbbd24425,0xbc098b5c,0xbc2222cd,0xbc0998f0,0xbc26fcf4,0xbc2e73e4,0xbc2dc2a7,0xbc172345, +0xbc062fa7,0xbbe64304,0xbbbc8109,0xbb8edb74,0xbbb7e064,0xbbfea237,0xbc093584,0xbbe0c630,0xbb5340e6,0xbb0d5958,0xb895a5f8,0x3ab17aff,0x3b8836ad,0x3b6d6515,0x3b61bcf6,0x3b54d49a,0x3b2a58da,0x3b1764f6,0x3ac8c99a,0x3b2bdb21,0x3b6f2e16,0x3bb48f97,0x3b194778,0xb9dc2022,0xbb6317da, +0xbbb54820,0xbbfc2f24,0xbc187f95,0xbc241fcd,0xbc29d21b,0xbc35fd07,0xbc2f82fd,0xbc17cade,0xbc339fc1,0xbc296b87,0xbc214461,0xbc1689c7,0xbc0d04ab,0xbc0968c3,0xbbf687dc,0xbbe434c2,0xbbb8ae4a,0xbb93a9c4,0xbb849769,0xbb669d54,0xbb25619a,0xbab57ebb,0xb9fef271,0x39cfcdf2,0x3aaf1366, +0x3b25096e,0x3b85aa63,0x3b85d084,0x3b87e3ae,0x3b89e979,0x3b8d42e7,0x3b8634e6,0x3b8c346e,0x3b445c37,0x3b1c5e67,0x3ae0b6fa,0x3a8939d2,0x39ba01db,0xb9f307d8,0xbb166937,0xbb886ad8,0xbbbf2970,0xbbfa8ffa,0xbb6b717c,0xbb91d584,0xbb6ee559,0xbb5e79da,0xbb356d94,0xbb5d9675,0xbb386c2f, +0xbb01c240,0xbac5bc92,0xba979abb,0xba670720,0xb9f7e1aa,0xb9822d33,0xb87e7cf1,0xba14c845,0xba147f19,0x399405f5,0x39ba1fbb,0x3a05cd25,0x3a588db2,0x3a32be73,0x3a4657ca,0x3a523b77,0x3a4d300a,0x3a52a9a6,0x3a779432,0x3a106019,0x3936570e,0xb984731f,0xba316c4f,0xba8fbfa3,0xbab05130, +0xbaf00fed,0xbb108afc,0xbb2d6ddc,0xbb4c6169,0xba6a21ff,0xb8612a6c,0x3916ce44,0x3aa924ea,0x3a8d97d6,0x3a861e83,0x3a5b1008,0x3a35f0cd,0x3a84871e,0x3a36b012,0x3ab3b724,0x3ac70a07,0x3abcb8b7,0x3af3d887,0x3ae908ec,0x3acd7789,0x39d47d0d,0xb9809d72,0xb68dd077,0x3904a9b0,0x396f74b5, +0x3921747f,0x3a00ce73,0x39bf161d,0x38d0dd77,0xba301b33,0xba9afeb7,0xbaf10546,0xbabbde74,0xba8d1063,0xb840dc35,0xb9d7ef4f,0xb9a898b9,0x3951f1a3,0xba41704e,0xba78caa0,0xba6ed0e4,0xb9fa94f6,0xb943974a,0x3b0aa4f0,0x3abbfb5f,0x3a9d7e15,0x3a581c40,0x3b25787a,0x3b15e6ff,0x39d51bd3, +0x3af68604,0x3b1fcd72,0x3b2bbe64,0x3b606cb9,0x3b50aa56,0x3b3029e9,0x39f8136e,0xba451cdd,0xbab8425d,0xba1fb552,0x39d3f498,0x3a0274fd,0x3abdd9b4,0x3a95bcb5,0xb8a0eaeb,0xbb19df8f,0xbb800517,0xbb9dc7b4,0xbb80adbd,0xbb1c69c5,0x392ab81b,0xba052bd1,0xba0bea82,0x384f09ae,0xbb1f0a1e, +0xbb4624ce,0xbb1cd941,0xbab71706,0x3a9d6198,0x3beb8697,0x3ba5bd91,0x3b78555a,0x3adae537,0x3b7e036a,0x3b95af2e,0x3ac3fd33,0x3b9fff56,0x3bbab2cd,0x3bb79f07,0x3bf534d3,0x3be4ceab,0x3ba1e927,0x3ab168c6,0xba9badeb,0xbb29dc79,0xba20723f,0x3a4115be,0x3ab65744,0x3b4ade64,0x3b23c626, +0x39f1b55a,0xbb6f68a2,0xbbd6eeef,0xbc1431bf,0xbbf2e5e8,0xbbacfc5f,0xb9991408,0xbac2966d,0xba9c17e2,0x3a9df655,0xbb8bdda3,0xbba9c91b,0xbb801c75,0xbb157b91,0x3a325621,0x3bea1fe9,0x3b3e816f,0x3b332355,0x3b2e05f4,0x3c056142,0x3bed69f9,0x3b143451,0x3bb7fad8,0x3bcdeb2f,0x3beb50ea, +0x3c538af0,0x3c3f9c47,0x3bd91923,0x3b448846,0xb955f550,0xbb343a69,0xbacdaece,0x39ab1eef,0x3a9b2f9f,0x3b8be585,0x3b63e896,0xb9ead596,0xbbfac580,0xbc573479,0xbc702549,0xbc387538,0xbb985218,0x3b213fd2,0xba048139,0xba6bf3d5,0x3a87c9c0,0xbc080fde,0xbc29d8c8,0xbbc49ffe,0xbb4d1213, +0x3b3cf134,0x3c772c3c,0x3ca513e7,0x3c66a8f5,0xbac50cf5,0xbbd0c1b3,0xbb539e8a,0x3b583ef5,0x3bd3f320,0x3c4648d6,0x3c905e0c,0x3b9c4515,0x3a90b33e,0x3bcdaf3a,0x3b13496b,0x3b5dfb07,0x3bc9dde0,0x3bf2a9d9,0x3c002a76,0x3bc2818a,0x3baf51d0,0x3bbbd7f0,0x3bd6ba9c,0x3c06b47c,0x3bfe964a, +0x3baaf8fa,0xbc1de708,0xbc8b8420,0xbc9227d8,0xbbb7f061,0x3adaa82e,0xbb9206ed,0x3c31fa07,0x3c2522f1,0xbba79cba,0xbb1e6aff,0xbabdad23,0xbc85633d,0xbd11d9d7,0xbcbf72f2,0x3c962917,0x3c0c44e2,0x3baf5380,0x3bdff187,0x3b81601d,0x3b4b670e,0x3bd31fca,0x3c334914,0x3c20a025,0x3b624ca5, +0x3b8749fb,0x3b340483,0x3b1bfe3a,0x3a9bf231,0x3a91b512,0x3b297791,0x39d966e3,0x3b36deae,0x3c062080,0x3c19ac73,0x3be7b545,0x3b5d2773,0x3a479e66,0x3b332448,0x3c2b3a67,0xba679a5c,0xbbc7893e,0xbc104fce,0x3ac6b48c,0x3b972367,0x39eed1c6,0x3bc3ac5c,0x3c9dae7a,0x3caad876,0x3c9f2454, +0x3c817721,0x3c10f189,0x3bfc8861,0x3bd5e9cd,0x3a8e2543,0x3b87cca6,0x3b993a45,0x3b0d11fc,0x3b2a547e,0x3b4a989c,0x3ba80632,0x3af40616,0xbabdd115,0x3a2dce71,0xba08e1be,0xbab77bba,0xbad935e5,0xbb44fb0e,0xbb01ad6f,0xb977ec6f,0x39e3b893,0x3b4b7efa,0x3ba47ffb,0x3b633dd3,0x39a3ad25, +0x3b85f2a2,0xbc1015bf,0xbc3aa98d,0xbbc52658,0xbac1b8fe,0x3bbb3173,0x3c25a7c8,0x3c71f6a4,0xb9c9bbe6,0xbba50c74,0xbbdc8929,0xbbb94962,0xbb7d6f8f,0xba97de99,0xbaf3922d,0xbae901d1,0x3ae4b736,0x3b58ae20,0x3b26726a,0x3b987b7e,0x3b5e7ec2,0xb97873c4,0xba55e792,0xba87bd38,0x3929487f, +0xba12dc3c,0x3a2331d9,0x3b62beb5,0x3b8a75df,0x3ba0b665,0x3b995995,0x3b594727,0x3ac9b30a,0xbb2ed0ee,0xbba93ec9,0xbb1176e7,0x3c0b9b51,0x3b8366eb,0x3c13052a,0x3c997ee9,0x3c857bfc,0x3c4e8d83,0x3bc6d9a5,0x3b85a30a,0xbb0afcf8,0xbb5621c1,0xbbeecdbf,0xbc186216,0xbc183923,0xbc2a6459, +0xbc0c346d,0xbbdfabfc,0xbbb2b711,0xbb76ec4e,0xbb862f02,0xbb6a3341,0xbb596c0b,0xbb991fcf,0xba35ba9e,0x395a483e,0x3997b81a,0x38dd4ffa,0x3981e980,0x3a825559,0x3a2e373a,0x36e74625,0xba560c33,0x37995793,0x39ec03bc,0x3ac7f38c,0x3a850d52,0xb82f6fa0,0xbafbee6e,0xbba69cea,0xbc04415f, +0xbc551a3e,0xbbcb7607,0xbac7371b,0x39a17a0b,0xba824f96,0xbb9eb27b,0xbbab0e10,0xbbafc1e1,0xbbfadecf,0xbc5969c4,0xbc796f7d,0xbc87f3b9,0xbc85ee12,0xbc62b4d1,0xbc3dcced,0xbc24a5d3,0xbc2076fa,0xbc0bfe84,0xbbd76522,0xbb1da545,0x39ed4940,0x3b57ca80,0x3b1c21c0,0x3b07e156,0x3aeb84ef, +0x3a1baf0c,0xb926465b,0xbab2c6d3,0x394c13e5,0x3aab4af0,0x3b1aa345,0x389573f4,0xbad16be2,0xbb51fd27,0xbb382dd1,0xbafcd80e,0xbaf2b99c,0xbb3c1689,0xbb8e85b5,0xbb88e86e,0xbba36cb3,0xbbe41f43,0xbbea2115,0xbbfab469,0xbbd2f397,0xbbb4164c,0xbbb7a3b2,0xbbc18a43,0xbbc0b76b,0xbbf3a69a, +0xbc1d34c8,0xbc31360b,0xbc1b6747,0xbbd7339b,0xbbc221a3,0xbb060013,0x39ffa08b,0x3b93e16d,0x3b6eaab5,0x3b5564cd,0x3b45a59f,0x3b0716e4,0x3ac501e9,0x3a23a82c,0x3aaa4c0d,0x3adf5e2e,0x3b2bdce4,0x399610a5,0xbab809f8,0xbb4bf7ea,0xbbad47c3,0xbbfe5582,0xbc206dd8,0xbc1ba701,0xbc10ac1f, +0xbc0addfc,0xbc010c28,0xbc066711,0xbc1ecc6a,0xbc2dc4c8,0xbc21db0e,0xbc23af5f,0xbc1e56ee,0xbc19e52a,0xbc12ec89,0xbc029a2a,0xbbdaf0ef,0xbbb5792b,0xbba51c9c,0xbb91da54,0xbb7635b3,0xbb208048,0xbae5c507,0xba21670e,0x39e4b317,0x3b222af0,0x3b31760e,0x3b213c4e,0x3b27071c,0x3b1f716a, +0x3b19f1c5,0x3b071589,0x3b0470cf,0x3a9fe65b,0x3a49212c,0x39b5abef,0x3888c6aa,0xb7b40d30,0xb9e53fec,0xbaf42ea8,0xbb6e6136,0xbbabdad3,0xbbdec727,0xbb7a3ec0,0xbb8d9391,0xbb843c44,0xbb81dcd3,0xbb73f625,0xbb7723b6,0xbb6845e0,0xbb4f0156,0xbb35c632,0xbb229920,0xbb0ecfa9,0xbaebe347, +0xbac7845d,0xbaa6dbe7,0xbac31546,0xbac5e53b,0xb9d43a02,0xb9ef1aa2,0xb99d9b68,0xb9ca2bd9,0xb9c4649e,0xb9e96d1a,0xb9f6edf0,0xba0e7f1d,0xba17a6cf,0xba134393,0xba4b99c3,0xba81e571,0xbaa3bc3b,0xbac64d33,0xbaed4a20,0xbaf33754,0xbb1c179a,0xbb2e82b6,0xbb42f1fe,0xbb5d11fd,0xbaecd268, +0xba2c333e,0xb9e8033b,0x3a39df37,0x39f41e2e,0x39cd1d49,0x37b64097,0x38be0798,0x39c6d73b,0xb89ec5b1,0x3a4294bb,0x3a668da0,0x3a3df57f,0x3a86b57d,0x3a71c964,0x3a66f54d,0xb9b4a8b6,0xba6692be,0xba3aa136,0xba191783,0xb9e81fd4,0xb9b018f7,0xb7be991e,0xb943773d,0xba27c84a,0xbaad62ad, +0xbae700e0,0xbb1545e8,0xbae16397,0xbab77c32,0xba3d9fae,0xba7ad194,0xba6531b1,0xb99bb884,0xbab0d4ae,0xbaca5143,0xbaadac27,0xba891dd0,0xba5b04e5,0x3ac4728a,0x3a8fa090,0x3a181ce6,0xb99431c3,0x3b01a2a6,0x3afceeae,0xb97ba3ad,0x3ac25881,0x3b00e1a5,0x3b0959b3,0x3b2202d4,0x3b11e964, +0x3b130466,0xb9b6aa90,0xbacddbee,0xbb059b14,0xbabdeba2,0xb9cd516c,0xb7095fbe,0x3a7d11a0,0x3a0405f8,0xba9d82f2,0xbb51fc11,0xbb904bba,0xbba16da8,0xbb5f9243,0xbb02f80f,0xba138215,0xba898418,0xba984034,0xb9b4244c,0xbb4398aa,0xbb67e895,0xbb2cf85b,0xbb02a97b,0x397e56dc,0x3bd096a4, +0x3b980d93,0x3b5563ff,0x3a109642,0x3b641d9e,0x3b89fe8b,0x3a278745,0x3b9ab545,0x3bb3b3df,0x3ba30d77,0x3bc7750b,0x3bb47b1b,0x3b921ea4,0x396e37c8,0xbb0e95cc,0xbb48f54c,0xbad9aca3,0xb913e304,0x3a88dcb7,0x3b3a3543,0x3afda1a2,0xba91fd3d,0xbb9ef35f,0xbbf0ba8c,0xbc13e434,0xbbd07dbb, +0xbb8e6e2a,0xbaada585,0xbaf956c4,0xbafae0e5,0x3a5375e9,0xbba766fe,0xbbc27d88,0xbb74d2b3,0xbb43d742,0xb9e8f5a1,0x3bc9c9af,0x3b405b5c,0x3aff3050,0x3a7973ac,0x3c0c8e94,0x3c04eac0,0x3b157a9d,0x3bc2bd1a,0x3bd2f5bf,0x3beaf2eb,0x3c4e1ddc,0x3c3cba72,0x3be612c9,0x3b06f3aa,0xbaee1347, +0xbb8a2091,0xbb4a717c,0xba3c8164,0x3a898805,0x3b8bfa43,0x3b3af7c8,0xbb33cc0e,0xbc1704cf,0xbc5a47da,0xbc5cc20b,0xbc074744,0xbb18a82d,0x3abf11e4,0xba8930df,0xbadf418b,0x3a8981df,0xbc0adcd2,0xbc2521e1,0xbba85b5f,0xbb6698ef,0x3b25d942,0x3c702825,0x3cb043f6,0x3c887b0e,0x3a7cc626, +0xbc07ca7e,0xbbdb0eee,0x3af62e18,0x3b75dc95,0x3c2270e9,0x3c9d3b25,0x3ba6fa84,0x398a039c,0x3b95cd19,0x3acd961d,0x3b54c2f4,0x3bb55b3c,0x3be574db,0x3bf19c3b,0x3bb72485,0x3ba7a9ea,0x3baac6b4,0x3ba4b972,0x3beb7be5,0x3bb1c374,0xb9db7055,0xbc3583aa,0xbc88552b,0xbc8eb4c2,0xbb97d57b, +0x3aa4b82c,0xbbe0e501,0x3be5fd49,0x3bb545b8,0xbc20b761,0xbb89fc4c,0xbbdee364,0xbc7a3e04,0xbd1634dd,0xbcd3f5c0,0x3c89d006,0x3c24a017,0x3bd75022,0x3bb1132b,0x3b790808,0x3b603699,0x3ba286bc,0x3c29596c,0x3c218074,0x3b73ad30,0x3b4f1eee,0x3ada2dc5,0x3b2f9c5c,0x3affef72,0x3ad3dcf6, +0x3ada31fd,0xb9efffc5,0x3abe617f,0x3bad9502,0x3bfaf360,0x3bc22cad,0x3b1e2a46,0x39cde925,0x3b3bfbd7,0x3c3ad294,0xbb8b9f46,0xbc13c0bc,0xbbfddc75,0x3b334102,0x3bd1adad,0x3b8a070c,0x3b30c119,0x3ca1df69,0x3cccdb4f,0x3cc4e846,0x3c9c1514,0x3c12b976,0x3bc9d985,0x3bd1a756,0x3b80d6cc, +0x3baad1a3,0x3b9fe531,0x3b09ffa5,0x3b14cd9d,0x3b252617,0x3b904436,0x3b1ab890,0xb9ca646c,0x3a5e1550,0xb99c6583,0xbac6ab71,0xbb1cbfc8,0xbb2e2a13,0xbafbe1a8,0xbae20a35,0x3b3f6c0b,0x3bcb0426,0x3be58acf,0x3b8d5ee6,0xb8e91bb2,0x39a0b7dd,0xbc238621,0xbc3a1f13,0xbc08eb9c,0x3b93b3ff, +0x3c39fde9,0x3c1b2112,0x3c700011,0xbb7670aa,0xbc079d61,0xbc2bebde,0xbbec8988,0xbb147b42,0xb9d93134,0xbab5fa3f,0xba1cf7a7,0x3a800280,0x3b1bdee9,0x3b17af38,0x3b68b534,0x3b116c4f,0xba62ecc8,0xbaa3dc7a,0xbae5c479,0xba91e84d,0xb9df8bb9,0x3a3f6c66,0x3b1cb836,0x3b1d282f,0x3b679916, +0x3b85bae7,0x3b8f72d7,0x3b2c8b9a,0xbaf4e021,0xbb33ea8a,0x3a5abd7a,0x3c11a423,0x3c03cf6e,0x3c43e827,0x3c815f9b,0x3c7ee73e,0x3c415184,0x3bb86e8c,0x3aeb141b,0xba72fd3f,0x3a00eab8,0xbb7cc5e5,0xbbbb09de,0xbbd18a95,0xbbd36b43,0xbb9f2e69,0xbb89c508,0xbb8316b6,0xbb561362,0xbb9436b5, +0xbb984537,0xbb8d1047,0xbb8dfee3,0xbad6dddf,0xba056436,0x3a88ac5c,0x395989d2,0x39688c3e,0x3a6dd3c2,0x3af72c6f,0x3ad51c9f,0x39e1dcf7,0x3a217630,0x3a4db289,0x3ae603fa,0x3ad37d91,0x39ce889d,0xbb1235ff,0xbb4346c0,0xbb99c1da,0xbc1b2bf2,0xbba590b1,0xbb17214e,0xba17faf6,0xbadca2e6, +0xbb48ebfb,0xbb9079fe,0xbba8d922,0xbbff0136,0xbc6dafcf,0xbc84c308,0xbc8b8035,0xbc85266d,0xbc623309,0xbc3e781d,0xbc248430,0xbc142fc9,0xbc03ec4f,0xbbee01df,0xbb7ffb3b,0xba93bdfb,0x3b2d49df,0x3b06c071,0x3b03a2d6,0x3acd573a,0x3a7ced53,0x388ba669,0xbaa74603,0xba093ce7,0x39f6be50, +0x3b458d1d,0x3ac23b6a,0x38f51335,0xbaa31a96,0xbb0f1bd4,0xbace323f,0x3a0b68e4,0xba04b39e,0xbab314a3,0xba2a640a,0xbb0d63aa,0xbb8a7e4d,0xbb856d83,0xbba2f8e6,0xbb8c89d8,0xbb67706f,0xbb9e6e86,0xbbd4899c,0xbc00c9cb,0xbc158dba,0xbc2ed9c2,0xbc43e2a1,0xbc3436ba,0xbc184739,0xbc12b72d, +0xbb8bf29b,0xba755c99,0x3b67c132,0x3b35008e,0x3b2db0b8,0x3b2e4055,0x3ad68e66,0x3a902124,0x39bc6f11,0x396eff9c,0xb9100166,0xb98d3c02,0xbab9f51c,0xbb04a657,0xbb23a53d,0xbb8eaa0e,0xbbd38841,0xbc091b51,0xbbfb052b,0xbbd88f29,0xbbc1ab1b,0xbbac1a03,0xbbcc3122,0xbbe6c474,0xbc111ab3, +0xbc061c17,0xbc122bb3,0xbc0fbacb,0xbc0a1bad,0xbc0badc2,0xbbf0cc79,0xbbd50f1e,0xbbb93d85,0xbbaa961c,0xbb99a0c6,0xbb8fcb32,0xbb6074d8,0xbb521cea,0xbb1e45d5,0xbad7f3da,0x39898357,0xb98f66c9,0xb9ecd25d,0xb9ad0a94,0xb9d4d480,0xb9d7272d,0xb9fa442c,0xba080bb9,0xba5abed1,0xba97753f, +0xbab823b1,0xbabf83f3,0xbaab7b8e,0xbad03bfb,0xbb16a2e0,0xbb64d1ef,0xbb93e6d4,0xbbb13fcf,0xbb80aa9e,0xbb84ec3c,0xbb835d3d,0xbb826444,0xbb80316a,0xbb7d63a6,0xbb7805f5,0xbb7497ed,0xbb67b74b,0xbb59e016,0xbb480cc0,0xbb378fe2,0xbb26e5e1,0xbb14e9ea,0xbb22f7d9,0xbb2e199f,0xbaad176b, +0xbad25ca8,0xbacfe9a2,0xbafef9c6,0xbae9722f,0xbaf52b70,0xbaf799ff,0xbafebb2f,0xbb01f5bf,0xbb010b64,0xbb0c82e4,0xbb156988,0xbb204bce,0xbb2c4c3b,0xbb3940af,0xbb37e4ea,0xbb4e589a,0xbb5627d7,0xbb5e9d56,0xbb6d5882,0xbb4dccaa,0xba8dcfd5,0xba6e3d87,0x390b46b2,0xb7c9961c,0xb8b690ac, +0xba2ecb5a,0xb9c2bd13,0xb8ca3abc,0xba2ba000,0x39897e0a,0x39cfea69,0x395c23f6,0x39a8bd75,0x39524667,0x39c14a85,0xba601274,0xbaac83e4,0xba9a6c74,0xba8abe64,0xba6e8529,0xba38860f,0xba01de75,0xba32ed3b,0xba9fdc92,0xbae5f2dd,0xbb072cb7,0xbb1ce6fb,0xbae14ae9,0xbabee388,0xba94448b, +0xbaa9be77,0xbaa1b6bd,0xba2949a3,0xbae00fd7,0xbaf83254,0xbacf24e4,0xbabc8b08,0xbab399e3,0x3a4b1c88,0x3a24c1ff,0xb89cb7bf,0xbab6eac4,0x3ab1b80e,0x3acb354e,0xba2ed40b,0x3a9b428b,0x3acf83d9,0x3ae3df13,0x3ac9da65,0x3aa8517d,0x3af78187,0xba80742b,0xbb0b657d,0xbb1f1266,0xbb027f1a, +0xba81a821,0xb9dcb27e,0x399c2f96,0xb9963734,0xbb0a7a47,0xbb72eb22,0xbb9187d4,0xbb94fb97,0xbb2141df,0xbaa048d0,0xba61e4d0,0xbab12904,0xbad4dd28,0xba3a7bda,0xbb533e4d,0xbb723eb3,0xbb3316aa,0xbb1d4109,0xba4e8bcb,0x3ba4569a,0x3b7eb275,0x3b2dabc7,0xba4b3810,0x3b3dd52b,0x3b6ea9b1, +0xb8ffdd13,0x3b93b826,0x3babe68e,0x3b9265ae,0x3b932e46,0x3b7b1a8e,0x3b873033,0xba4314ae,0xbb3bea88,0xbb55519e,0xbb195d55,0xba562855,0x3a2f9f29,0x3b051653,0x3a6462ea,0xbb224866,0xbbb766a9,0xbbf019f4,0xbc0495b4,0xbb93f667,0xbb326df6,0xbac8c976,0xbb010ced,0xbb16abc9,0x39fce196, +0xbbac2103,0xbbc64215,0xbb64737a,0xbb6b06aa,0xbae1aa89,0x3b9a6bb5,0x3b17f786,0x3a2cb5c8,0xbab57027,0x3c0637e3,0x3c0cba8a,0x3b1280b6,0x3bcf7628,0x3bdc27c1,0x3be4811e,0x3c3b63af,0x3c2c7916,0x3be7ca63,0x3a65c4ae,0xbb498f67,0xbb9a76cf,0xbb7ff190,0xbad5263d,0x3a51a559,0x3b5847a8, +0x3ab066af,0xbb9a6bc3,0xbc249957,0xbc4c6b02,0xbc3a559c,0xbb8e74f6,0x3a5b2edb,0x3abf33c4,0xba9b3122,0xbb1af648,0x3a101b39,0xbc027e47,0xbc144a48,0xbb8f4671,0xbb833fae,0x3ae134fc,0x3c59332b,0x3cb39498,0x3c96e039,0x3b571a9c,0xbc1f5cfb,0xbc24662c,0xb983c511,0x3ac6147c,0x3bfd3732, +0x3c99df45,0x3ba3fec1,0xb976215c,0x3b40bab9,0x3aa24cb1,0x3b4a1d7d,0x3b8916ea,0x3bbe904b,0x3bd3e816,0x3bb31a42,0x3b964e78,0x3b8e236d,0x3b6b8edf,0x3bc01f35,0x3b505679,0xbb946003,0xbc3e7d2b,0xbc7eef2e,0xbc7e0cc4,0xbb50e521,0x3acc1628,0xbbe03854,0x3b7d145e,0x3a9c4866,0xbc528ed3, +0xbbc53a9f,0xbc381f66,0xbc86ba0a,0xbd0f1d2e,0xbcd4347b,0x3c3790a1,0x3c3361cb,0x3c0bc004,0x3ba945ca,0x3b61ef87,0x3b5823b3,0x3b705f90,0x3c184827,0x3c1bd137,0x3b8e4dc5,0x3b2d9348,0x3a8ce5ab,0x3b440776,0x3b3dcbe5,0x3b0a098c,0x3a32d5a7,0xba480472,0x3a166c8a,0x3b2dbfba,0x3bc53b33, +0x3b9ea3a0,0x3ad616ee,0xb962efaf,0x3b298f86,0x3c425245,0xbbbe21a5,0xbc23db13,0xbbc5e534,0x3b2645b4,0x3be40c43,0x3c05dee1,0x39678519,0x3c9af500,0x3cd36f2d,0x3cd40d56,0x3ca442cd,0x3bf04454,0x3b506e50,0x3ba86eae,0x3be302b0,0x3bccb72e,0x3ba744be,0x3b031249,0x3af0f3cb,0x3af3433f, +0x3b57162b,0x3b39c6e2,0x3a56578c,0x3a2e51ba,0xb9fdce38,0xbb06e2f1,0xbb3323d2,0xbaf7402b,0xbac0e75c,0xbaec2ebf,0x3b94f1e8,0x3c003ec8,0x3c09ac08,0x3bbeec24,0x39e690f0,0xbb81ea9b,0xbc16beb0,0xbc15ac62,0xbc2035fd,0x3c34b203,0x3c82a9d8,0x3bbf92f1,0x3c543dde,0xbbde70fb,0xbc217905, +0xbc54c6a9,0xbc0d3ccd,0xba7a00ab,0xb9c488a5,0xbaae8bee,0xb689a897,0xb91a818f,0x3a79fc0a,0x3ac856e0,0x3ae61676,0x3a20063e,0xba9ac0b1,0xbae3315a,0xbb280ee0,0xbb160004,0xb9c7e78d,0x3a4155c6,0x3a92d202,0x3a80a177,0x3b26a1fc,0x3b68fa74,0x3b93802e,0x3b44931f,0x39dd032f,0x38fc4868, +0x3b785df3,0x3c10c60e,0x3c3b09cc,0x3c5cc5b3,0x3c21efad,0x3c38cc6b,0x3c0a4398,0x3b98c2e3,0xba60a9cc,0x3a789279,0x3b97db3f,0x3938ce2d,0xbac854f5,0xbb06f451,0xbb1b2676,0xbac36782,0xbae2ec98,0xbb18947c,0xbb1306bc,0xbb7677e8,0xbba300dc,0xbb9ef2e6,0xbb70f6a8,0xbb2ac07a,0xba9e058a, +0x3ac94ac6,0x39374776,0x3922b886,0x3a4f0b07,0x3b1fb42a,0x3b2e3e40,0x3ad38ebe,0x3aa39a54,0x3a896160,0x3a9b23f4,0x3ab3d4e6,0x3910c083,0xbb435c0b,0xbb0234e7,0xbadced32,0xbb5d2d74,0xbb225b4a,0xbb122b89,0xba2fee66,0xbab315c5,0xbb184614,0xbb8a0162,0xbbd0d02c,0xbc17f6b0,0xbc78c7e6, +0xbc8a1f08,0xbc8a2021,0xbc7672c8,0xbc582ee1,0xbc3976c3,0xbc1feaac,0xbc05e22a,0xbbeeb1c8,0xbbe8ddfb,0xbb9e4373,0xbb28d325,0x3a7d3af1,0x3afaa843,0x3b239d05,0x3ae25382,0x3ac863d5,0x3a399f09,0xb954da4b,0xba1f78e7,0x391b6df9,0x3b4f2eee,0x3b0ca441,0x3aa06991,0x39361e21,0xba888aa9, +0xba9936aa,0x3a43ca8d,0x39f7643c,0x3925e1d7,0xb83631c3,0xba69692e,0xbb1044c9,0xbb00d281,0xbb3e39d5,0xbb366a59,0xbb12524a,0xbb8ffa0a,0xbbe4749a,0xbc1abffe,0xbc28b7e6,0xbc35f344,0xbc48a5d4,0xbc3aebb3,0xbc2e4e64,0xbc27498e,0xbbbd4e8f,0xbb0ce19b,0x3b011c0b,0x3abec79c,0x3ad1df58, +0x3b05415e,0x3aa451f9,0x3a49ee20,0x3980e7f1,0xb979d3d0,0xba80b833,0xbad9424c,0xbb019451,0xbafc9916,0xbaec8259,0xbb47db12,0xbb8ba2bf,0xbbb628e4,0xbb9c1bed,0xbb7a6f5d,0xbb4cb5e0,0xbb3858ac,0xbb9ba277,0xbba3b7af,0xbbd24679,0xbbc9d8ea,0xbbe3a098,0xbbe1151c,0xbbd0d4cc,0xbbd8a5fc, +0xbbb7d4e1,0xbbac9e80,0xbb9ede68,0xbb95a504,0xbb8cc7b1,0xbb8f4f4a,0xbb807b76,0xbb854dea,0xbb736d80,0xbb50a825,0xbb02468b,0xbb0f9b50,0xbb0f64f4,0xbb03ba1e,0xbafdbdc0,0xbaeece27,0xbad9299c,0xbacecbe4,0xbae5787c,0xbb09b8fd,0xbb19d582,0xbb1f7b6a,0xbb20ab2c,0xbb38a77d,0xbb482526, +0xbb70fe10,0xbb874496,0xbb91e5ba,0xbb864853,0xbb853981,0xbb860259,0xbb8444b1,0xbb8264b7,0xbb834180,0xbb82eba6,0xbb860fa1,0xbb86f5a8,0xbb846a2d,0xbb7e2213,0xbb7a7394,0xbb710cc6,0xbb656373,0xbb6d031b,0xbb7305d6,0xbb2ec522,0xbb3f2997,0xbb3fe0af,0xbb4bc5d3,0xbb4286b8,0xbb4440bf, +0xbb42e285,0xbb42852e,0xbb423dd5,0xbb3bfd32,0xbb4b4c8e,0xbb53fd72,0xbb5e9424,0xbb6a4dde,0xbb7403be,0xbb76244a,0xbb7d05dc,0xbb7ce6fa,0xbb7e0826,0xbb816ffb,0xbb935055,0xbaa3c28c,0xba95de9e,0xb998d2f8,0xb9b0e116,0xb9e228e1,0xbaa6906c,0xba27a2f6,0xb9ebea06,0xba8dd8a2,0xb9251994, +0xb7830619,0xb91d3c15,0xb9a45958,0xb9e6452a,0xb7e9a6e1,0xba98c69c,0xbac77fd8,0xbaccb525,0xbab29d00,0xba996564,0xba5c3f11,0xba560bda,0xba8329e3,0xbac28cf5,0xbaf9c8e7,0xbb07da7b,0xbb117d6e,0xbabe747f,0xbaa29e24,0xba9fa881,0xbab1dd87,0xbaae6eb1,0xba510dad,0xbae9e231,0xbb01074f, +0xbadb11fe,0xbacf2c65,0xbad6663f,0x3896003d,0x3950d70f,0xba03dd25,0xbb1545b0,0x3a479fff,0x3aa17711,0xba4118d8,0x3a8bbdb7,0x3ab31cb8,0x3ad3325d,0x3a500645,0x3a089c31,0x3ada1437,0xbab2baa3,0xbb1de1ba,0xbb2f967f,0xbb122d4c,0xbab5e5d7,0xba192cd5,0xb9ab73c1,0xba814335,0xbb27198b, +0xbb7c4cb5,0xbb878cc1,0xbb7b540c,0xbaa81562,0xb9626afa,0xba49fd29,0xbab17341,0xbaf01a2c,0xba7e4e6e,0xbb4ed371,0xbb65d782,0xbb306c04,0xbb2392fe,0xbac2ddbc,0x3b5d8722,0x3b4fa981,0x3b0d9100,0xbb08d40e,0x3b0e31bb,0x3b4114f5,0xba045682,0x3b8bbb66,0x3ba57ad8,0x3b8b9833,0x3b4b1c9e, +0x3b14d720,0x3b832102,0xbabae322,0xbb522e8c,0xbb5ff3ed,0xbb2f530b,0xbaa43d6a,0x39e380b8,0x3a8110eb,0xb9a56c28,0xbb50ec84,0xbbbf8b27,0xbbdc29e5,0xbbd9e3b2,0xbb195f3b,0xba40bd2c,0xba994e7e,0xbad61afe,0xbb15ac60,0x392d3506,0xbba21953,0xbbbb0008,0xbb61dde7,0xbb7878b8,0xbb24a41b, +0x3b3ab549,0x3ae56d1b,0xba0b591d,0xbb7c9796,0x3be4f821,0x3c0dc605,0x3b207324,0x3bdff541,0x3bebea42,0x3be27737,0x3c1ecca7,0x3c11b1c3,0x3be6a532,0xb995e346,0xbb7f25f6,0xbb9b3e33,0xbb84832f,0xbb07282d,0x3a5e4ea2,0x3af962d4,0xb9dd4f99,0xbbbd0de3,0xbc26fcea,0xbc35116e,0xbc1220fe, +0xb9b3a957,0x3b887b8b,0x3afe6f95,0xba6cba0d,0xbb379b61,0xb9bed239,0xbbeb33ee,0xbbf9e211,0xbb841103,0xbb86b8f3,0x3a67ace7,0x3c30562a,0x3cad1dab,0x3c9d84b0,0x3bae89ce,0xbc23b274,0xbc4c67ee,0xbb39084c,0xb8756b65,0x3bbdea08,0x3c87179f,0x3b9c6ac2,0xb95f3f64,0x3ab7b150,0x3aa60158, +0x3b4bd8f3,0x3b2b03b1,0x3b8da57b,0x3baac919,0x3ba79036,0x3b6c57cb,0x3b5551ff,0x3b2dde45,0x3b9978fa,0x3ac4bd7e,0xbbdbd7c6,0xbc3d0896,0xbc68621d,0xbc4fc71a,0xbacaad28,0x3b181e4a,0xbb917ca3,0x3ac424c8,0xbb23a848,0xbc5eed3e,0xbbe66a48,0xbc5b065f,0xbc8ea5ff,0xbd0344e8,0xbccdb783, +0x3b4b2e3e,0x3c365a77,0x3c32f309,0x3bc30e40,0x3b38cd27,0x3b21ed86,0x3b23e4db,0x3bfe6007,0x3c0c9c6e,0x3ba1d4d2,0x3b1fdcca,0x3a46319f,0x3b40d636,0x3b5ae524,0x3b0ddadb,0x39460abc,0xb9f1be4c,0x392089ea,0x3a0d28d4,0x3b7ae214,0x3b551e92,0x3ad5e24f,0xb9ed0bc9,0x3b284e5d,0x3c43739e, +0xbbd02039,0xbc27314d,0xbb7f9702,0x3ae0f12a,0x3be7935f,0x3c4bed7b,0xba64bac5,0x3c856927,0x3ccada56,0x3cc90ffa,0x3c994624,0x3ba0421a,0xba603a0c,0x3b248be6,0x3c10f2a2,0x3be66d3d,0x3baf9b0f,0x3ad25986,0x3ab6a540,0x3a9d41bc,0x3b021d26,0x3b5424f3,0x3b01893b,0x39e87925,0xba340efe, +0xbb126c96,0xbb199872,0xbaab2786,0xbaa146af,0xbace2b73,0x3baa6bc1,0x3c0af476,0x3c1dc38a,0x3beb1d45,0x3aa35cb6,0xbbd64a61,0xbbd76b83,0xbb952e4c,0xbbddeb5b,0x3c6b4e05,0x3c80174f,0x39d84c17,0x3c0dcbe6,0xbc0e97ea,0xbc339773,0xbc5db853,0xbc160280,0xba05d586,0xb98abf20,0xba6999d8, +0x396ef015,0xba842a02,0xb9b16175,0x3a114186,0xb903d5fa,0xba807661,0xba9e7133,0xbb1776f4,0xbb5eccc1,0xbb50c3ed,0xba30ce61,0x396a282e,0xba27399f,0xb9a63a57,0x3ac30be6,0x3b291c20,0x3b80b949,0x3b3f8366,0x3b3c8239,0x3b3a4f38,0x3bce8edd,0x3c11bdff,0x3c5d45a8,0x3c57c079,0x3b713fa9, +0x3bb2b048,0x3b8aaa50,0x3b3f8791,0xbb388e33,0x3b8cd4ef,0x3bf88734,0x3b682810,0x3b04f58c,0x3aee3c80,0x3a933997,0x3a8dd845,0x39a473b2,0xba6f4c87,0xba9858de,0xbb08220c,0xbb92acfd,0xbb9feabb,0xbb587cda,0xbb4dda28,0xbac928ae,0x3ab273a8,0x397728ce,0x39adfdd8,0x3a474b20,0x3b2ac1db, +0x3b49ebfb,0x3b22005c,0x3ae004bd,0x3a8363c0,0x39e4e4b5,0x3a1ac938,0xba4676b6,0xbb61d2e6,0xba98c32f,0x3a79d8ae,0x3b56f2e8,0x3aace63c,0xb9646d6b,0x3a7f03af,0x3ac8ea91,0xbb4907d5,0xbb9882bd,0xbc01c1d5,0xbc3529dd,0xbc7f5fc2,0xbc8ae5c4,0xbc842437,0xbc58155f,0xbc46de0c,0xbc2f4765, +0xbc16969c,0xbbee9787,0xbbcdc638,0xbbcc75e6,0xbbac183d,0xbb79bf08,0xba89b795,0x3adb6626,0x3b3e2ace,0x3b018026,0x3afb7f5f,0x3ab9fafd,0x3aa6666f,0xb9a91e28,0x39b10db5,0x3b2ecdfb,0x3b1e5cbc,0x3b095b8a,0x3a7658e4,0x38e9a753,0xba1707dc,0x39af794d,0x39d28829,0x392fa8e1,0xba9c57c0, +0xbabefe2f,0xba21b8b4,0xba0a22da,0xbadf81d4,0xbb11b7f8,0xbb11cd80,0xbb93e9d8,0xbbf0d124,0xbc277cc7,0xbc2f89a2,0xbc32b35f,0xbc4329f5,0xbc337b71,0xbc2fb121,0xbc233f7e,0xbbcf14e8,0xbb3e6374,0x399f9329,0x39ba3c03,0x3a5a6a82,0x3b02cf16,0x3ad1ed62,0x3a97a3ec,0x3a75430d,0x39b7d0ff, +0xba0a14f3,0xbacb85b6,0xbaaeb061,0xba77b79a,0xba083e99,0xba9bc24a,0xbada5e5b,0xbb1b80ea,0xbade6387,0xba8b2280,0xb9f5d078,0xba3462a4,0xbb7e8132,0xbb81155b,0xbb9fef8e,0xbb9612dc,0xbba7dd46,0xbba5178f,0xbb908275,0xbb90f34f,0xbb7873de,0xbb75d982,0xbb70d70c,0xbb68db40,0xbb676aa8, +0xbb7da740,0xbb7a4571,0xbb860a03,0xbb7dc304,0xbb5e1424,0xbb3fae9f,0xbb1e5495,0xbb1f6546,0xbb143b15,0xbb0e1d06,0xbb05adfa,0xbae96478,0xbad26d4c,0xbaeb394a,0xbb0facf9,0xbb1f6c43,0xbb2a5ac9,0xbb35c95b,0xbb4e34fd,0xbb54f7c5,0xbb6a3c37,0xbb7635ed,0xbb7b4707,0xbb7228bc,0xbb6990b2, +0xbb7f8f58,0xbb82dc48,0xbb886bd7,0xbb73b345,0xbb8263d3,0xbb8b7261,0xbb9117af,0xbb92ed29,0xbb919b22,0xbb9552bc,0xbb9499bc,0xbb93ad6d,0xbb89f4af,0xbb803d27,0xbb7982c9,0xbb6f0c6c,0xbb63d604,0xbb517a1d,0xbb51bea5,0xbb4ffa4a,0xbb4df7cd,0xbb4bdd1e,0xbb4b0765,0xbb43e2ff,0xbb51a2fd, +0xbb57c063,0xbb613136,0xbb6a62fd,0xbb70f51d,0xbb75224f,0xbb73af76,0xbb70a2db,0xbb6f61df,0xbb6ebf81,0xbb972b7f,0xbaa2e73d,0xba9d86fd,0xba0f59d8,0xba03e45e,0xba1c1857,0xbacfe123,0xba467e88,0xba2c5f02,0xba9d783b,0xb9c4949d,0xb969f921,0xb9748f44,0xba344a37,0xba550172,0xb951537e, +0xbaa765c4,0xbacd4636,0xbae5a590,0xbac3b670,0xbaa8dfdd,0xba6296b4,0xba82ff9a,0xba9a0139,0xbacc88be,0xbaf7c1e8,0xbafdc1db,0xbafc7465,0xba8f6c76,0xba6da7b9,0xba8c7d94,0xbaa33307,0xbaa88cec,0xba6dc6ef,0xbadef17c,0xbaf3c000,0xbacf09e0,0xbaca7c42,0xbaddeb54,0xb9fd03f3,0xb9042be6, +0xba315d31,0xbb30e378,0x39a7b652,0x3a814c9d,0xb9fb2cdb,0x3a883efc,0x3aa54963,0x3add6a28,0x39a1927a,0x37251bb6,0x3ac2eaa0,0xbac5274c,0xbb216771,0xbb3c24af,0xbb154c22,0xbac9f3a5,0xba2c4bf8,0xba627ae1,0xbaccf189,0xbb33d5f7,0xbb799764,0xbb72d4a2,0xbb473ea3,0xb950ea3d,0x3a3c2c99, +0xb9d52d84,0xba9e586c,0xbafa60d0,0xbaa7ced9,0xbb40ce35,0xbb4b860f,0xbb1c5385,0xbb1a87d1,0xbae08bb6,0x3aefdb42,0x3b2499a6,0x3af7ff1c,0xbb3d4f85,0x3ac57d58,0x3b14fc86,0xb9c62641,0x3b84553f,0x3ba064a5,0x3b916c43,0x3b0bed1c,0x3a91e4e9,0x3b81306d,0xbaea1565,0xbb54a06d,0xbb6ea78d, +0xbb392aba,0xbac71ef6,0x394c1e75,0xb8fae97b,0xbabca0b8,0xbb6d5706,0xbbbf6c9d,0xbbc27618,0xbbac49b7,0xb9b90177,0x3a939692,0xb9be0033,0xba8a9385,0xbb0cba0d,0xba04f930,0xbb92d0f0,0xbba6abf9,0xbb4ba208,0xbb6acaf8,0xbb2bb2c3,0x3a757506,0x3a9dcef6,0xba9680fb,0xbbb2cd12,0x3bb4d157, +0x3c08fedf,0x3b437265,0x3bf00780,0x3c005e25,0x3bed7af8,0x3c00dd3b,0x3be93f59,0x3be4be4e,0xba9c7210,0xbb8c2641,0xbb99e198,0xbb7ab356,0xbb02fb93,0x3a73a024,0x399b50d0,0xbb132955,0xbbd45877,0xbc23951b,0xbc1c2852,0xbbd9d6cf,0x3b48b679,0x3be260b9,0x3b35664f,0xb9f8ebc4,0xbb502371, +0xbaeb80c4,0xbbd38c75,0xbbc5b847,0xbb57ef1a,0xbb71b1b0,0x37f9b02c,0x3c00a001,0x3c9ba7cb,0x3c9a1e98,0x3be47c3f,0xbc170066,0xbc5f9b4d,0xbba97e48,0xba73aa37,0x3b8b6374,0x3c524c9f,0x3b99d88c,0x39b0e2f4,0xb91a295c,0x3acbe66a,0x3b58d1d1,0x3a924762,0x3b335f7f,0x3b68421d,0x3b82e296, +0x3b0e5cb9,0x3b09c5d4,0x3b0879de,0x3b5d7ceb,0x38910a12,0xbbf30af5,0xbc3b0bfc,0xbc5158f3,0xbc0d9f48,0x393fdc32,0x3b48ba22,0xba826d72,0xb8e89681,0xbbae80cc,0xbc5443a2,0xbbef3580,0xbc60572a,0xbc88653c,0xbceb18c0,0xbcc4f792,0xbbb0a081,0x3c2f8695,0x3c5c2013,0x3bef5982,0x3b07e2e4, +0x3a8e6759,0x3aa18d27,0x3bc395e0,0x3bf20f6f,0x3bb106ad,0x3b27029e,0x3a3f13c7,0x3b2af2c3,0x3b48bbe0,0x3af01c22,0x39ade3f4,0xb8f94487,0xb9a67184,0xbaafbe91,0x3a9eb853,0x3aaea8d6,0x3a8b5711,0xb8696c31,0x3b3a0d93,0x3c2dec1f,0xbbc96ece,0xbc1655fa,0xba3dae02,0x3aa1bbcd,0x3befa370, +0x3c8ab3c2,0xba88b4ee,0x3c4dca14,0x3cc3edaa,0x3cab2657,0x3c790211,0x3b07ac0d,0xbba270b3,0xba5dee8f,0x3c14dc4f,0x3bf0a8a9,0x3bb46c7b,0x3a8f16db,0x3a68161a,0x3a04be12,0x3a6f2081,0x3b62633c,0x3b3bc15a,0x395c6593,0xba2f761a,0xbaf5e58d,0xbad8e022,0xbaad79ca,0xbaa3dff7,0xba45d490, +0x3bb515cb,0x3c0c0752,0x3c1b63b0,0x3bf4e300,0x3af8525a,0xbbe2b36f,0xbb6581f4,0x39815519,0xba2743ae,0x3c433d7e,0x3c10057d,0xbbbddd47,0x3b1877b5,0xbc1baa16,0xbc44a8df,0xbc4cd087,0xbc08ab16,0xba567561,0x39668b4b,0x38ffa8fb,0x3a228fcb,0xba948825,0xba950dbd,0xb987a049,0xbad0689c, +0xbb0f8047,0xba919b8d,0xbb40c19f,0xbb8664bc,0xbb73c6da,0xbab6f198,0xba7a7b06,0xbb1ecb0a,0xbabd8806,0x39904f4a,0x3ace8de8,0x3b361e50,0x3b21e048,0x3b959ce3,0x3bbc5596,0x3c099bc3,0x3c0a34f3,0x3c6a08a2,0x3c407a2a,0xb928b212,0x39a0f51a,0x398f6ef9,0x3a41970f,0xbb82442e,0x3c0712d4, +0x3c191552,0x3bc1ba5d,0x3b8c6308,0x3b7aa5a2,0x3b521398,0x3b2098b4,0x3ac4f261,0x38aca2ab,0xb95a2caa,0xb94f0d9e,0xbb5a39c1,0xbb900b24,0xbb5925d3,0xbb58662e,0xbadc085c,0x3a0503e2,0x39c322f5,0x3a466544,0x3a57a206,0x3b2f1808,0x3b490646,0x3b25e1ce,0x3ae2f0aa,0x3a531e3d,0xb9534d8d, +0xba7bce22,0xbb0d4723,0xbb5e3d60,0x386026c1,0x3b6a9bc3,0x3c10503e,0x3bab839d,0x3b5705cc,0x3b9bffcc,0x3bcbe798,0xbba3fada,0xbbbf8caa,0xbc1b32d9,0xbc4a5ac0,0xbc7bc25d,0xbc8485f9,0xbc724ab6,0xbc378cd6,0xbc31a6f4,0xbc207c2c,0xbc079cc6,0xbbd4617f,0xbbae829d,0xbba8e318,0xbbb2256a, +0xbb9a5b1a,0xbb2f020a,0x3a8f876d,0x3b33c8c6,0x3b0eba4b,0x3b117f25,0x3b0828ee,0x3b2279f1,0x39b36cd1,0x3a242c1e,0x3b02fcd4,0x3b30b433,0x3b4aed5b,0x3b0b52de,0x3aaae04f,0x394005b9,0x397c98eb,0xb96ea15d,0xba4e6252,0xbb370efb,0xbb5bc229,0x396decdd,0x3944f330,0xbaad202b,0xbb29095b, +0xbb60bc94,0xbbad30b5,0xbbfedc4e,0xbc29de3e,0xbc2bf67a,0xbc283c71,0xbc357094,0xbc2143ad,0xbc20829a,0xbc0c8ba1,0xbbc7e258,0xbb5d11b6,0xbab6abd9,0xb9f8a3f1,0x3a27e471,0x3b2fac5d,0x3b2206ae,0x3b0a0b76,0x3b0b38d3,0x3abf3f58,0x3a2f675e,0xb9d77e18,0x37d865ab,0x39f31e6f,0x3a890b3b, +0x3a4df1df,0x3a4d17ed,0x3a175c2a,0x3a47c301,0x3a5ce17f,0x3a90bed6,0x3a19cac7,0xbb47aa3f,0xbb449255,0xbb7b4f4d,0xbb59eda4,0xbb716fee,0xbb6f0701,0xbb4d3bf0,0xbb4389e4,0xbb317bcf,0xbb34e3db,0xbb3bfdc3,0xbb37a366,0xbb3e672b,0xbb5a75af,0xbb621229,0xbb6c60ff,0xbb5a02bc,0xbb377816, +0xbb36e9b9,0xbaf4745d,0xbb03e1ff,0xbaf864e5,0xbaf660a2,0xbae883b7,0xbacb97a0,0xbab52075,0xbace9d40,0xbb003e89,0xbb11a5c5,0xbb20f867,0xbb32d24f,0xbb499efa,0xbb49152a,0xbb4cfbf5,0xbb4ef2d9,0xbb4bf45c,0xbb2580db,0xbb1493ea,0xbb42fb3f,0xbb56c64c,0xbb75f4d5,0xbb39f068,0xbb5e3110, +0xbb79e633,0xbb831150,0xbb8740f2,0xbb88270f,0xbb8f1b05,0xbb90ab48,0xbb933631,0xbb79c68e,0xbb50fb0a,0xbb7d8167,0xbb5b3e90,0xbb4445c1,0xbb19f58d,0xbb21f683,0xbb1f7e5a,0xbb1e9670,0xbb1d690c,0xbb1dd512,0xbb190a6d,0xbb233e4d,0xbb26d7f1,0xbb2d9a0f,0xbb338c79,0xbb37c6c1,0xbb3dd44d, +0xbb366e0f,0xbb31831a,0xbb2d102b,0xbb278d58,0xbb5b9b02,0xba942b16,0xba940c35,0xba2dbcfb,0xba0445dd,0xba11e877,0xbacc7e79,0xba36a205,0xba2c63aa,0xba876f6a,0xb9cc735d,0xb9759197,0xb8aeee58,0xba4d2e99,0xba6f6ccb,0xb94f6ca7,0xba9ab99f,0xbabe53f2,0xbae7efd4,0xbabe9f5c,0xbaa6496a, +0xba5f4b31,0xba8b83aa,0xbaa174e6,0xbaca6fd3,0xbae81e7a,0xbae220fa,0xbad1298f,0xba472f72,0xba170111,0xba527d88,0xba868f97,0xba9594d9,0xba8243ec,0xbac8ccc2,0xbad7da00,0xbab46e6a,0xbab57b71,0xbac9024b,0xba3aee19,0xb967e797,0xba1f951a,0xbb2755cb,0x38f5b048,0x3a60d31d,0xb7d6d2be, +0x3a875162,0x3aa05351,0x3afcd3af,0x38c478d5,0xb98007ff,0x3aad5539,0xbabbec4c,0xbb19179b,0xbb431fd4,0xbb13b328,0xbacdcffa,0xba49de06,0xbaaaed63,0xbb01da4f,0xbb3a502e,0xbb6d5b81,0xbb521147,0xbb130fd4,0x3a1b5d40,0x3ab474ac,0x38c1079a,0xba734376,0xbaefc3a8,0xbad3b9df,0xbb2ee793, +0xbb2c7c10,0xbafeaff2,0xbb0602ad,0xbad13ab5,0x3a484a7a,0x3b052e7e,0x3af10ce4,0xbb4089d7,0x3a9b1642,0x3aef01ee,0x3907b80d,0x3b7a8cca,0x3b99931f,0x3ba277e5,0x3acf27ba,0x39e2d69c,0x3b7bfea7,0xbaf1f3d3,0xbb48bb72,0xbb80144b,0xbb429dea,0xbae8730a,0xb91c0e25,0xba92e031,0xbb19e50e, +0xbb82ad30,0xbbb8a644,0xbba73f4d,0xbb838d2c,0x3a9268f1,0x3b239ce2,0x3a1a548a,0xb9aa7f4b,0xbaef55cc,0xbab5ffc8,0xbb828593,0xbb8fede1,0xbb26325b,0xbb4abd7d,0xbb0f6cc7,0xb8e54486,0x3a899299,0xba8fb004,0xbbc14f0c,0x3b8a3afa,0x3bff1cbc,0x3b70f526,0x3bfa096e,0x3c0ad18f,0x3c03049d, +0x3bcda5be,0x3bb5b026,0x3be209ba,0xbae94ab9,0xbb8d9044,0xbb9929e9,0xbb6c7ed3,0xbaf953eb,0x3a1579d9,0xbab6c1e2,0xbb808434,0xbbe87d84,0xbc1ad547,0xbc0271ef,0xbb933f32,0x3bb409c2,0x3c0cff4c,0x3b740870,0x38fbd206,0xbb5628f7,0xbb61ee3b,0xbbc1011d,0xbb96982b,0xbb1970e6,0xbb439ffa, +0xba50452c,0x3ba07989,0x3c824fa1,0x3c8f662f,0x3c0a36f6,0xbbf56008,0xbc5bd55a,0xbbdb5eee,0xbaad46a6,0x3b4c0407,0x3c0d2469,0x3ba0fafc,0x3ab051dc,0xbac7a5b1,0x3b01b833,0x3b649e7b,0xb9399921,0x3a9aa996,0x3ada0801,0x3b1d5e9d,0x3a65588c,0x3a9e1587,0x3ad8b0fe,0x3afc678f,0xbaa26571, +0xbbedef8a,0xbc3aa4cb,0xbc3c81d2,0xbb8666a4,0x3afa2a74,0x3b80983a,0x3b2502b1,0xba8daaff,0xbbebb74b,0xbc3b8275,0xbbe4873b,0xbc4f97bc,0xbc621450,0xbcc8c8fe,0xbcb6aa31,0xbc4e6e9b,0x3c160fa9,0x3c793e54,0x3c1317e4,0x3ae0e68f,0xb9a02b2d,0xb95c873f,0x3b8716f6,0x3bc977c6,0x3bb76f71, +0x3b3c8118,0x3a79a7c7,0x3b13eecb,0x3b0fb0a8,0x3a97d11c,0x3a0cfb25,0xb8cfd0c5,0xba2c66c5,0xbb10c65f,0xba4446a3,0xb99483bf,0x38a214a9,0x3a202e66,0x3b4578c4,0x3c045b70,0xbbbf4b08,0xbbfe50e3,0x3b37c64f,0x3acaf6ea,0x3c055c7e,0x3caa318a,0xba1fb3bf,0x3c0fa574,0x3cc13090,0x3c8098fd, +0x3c20fabb,0xba0b41a1,0xbc0125b1,0xbb788089,0x3bf80cbc,0x3be6abdd,0x3bb479d4,0x3a33314e,0x399b133e,0xb95dba57,0x399c16bb,0x3b5c20a9,0x3b5e1656,0x38fcb777,0xb9768382,0xba80d245,0xba481952,0xbac039bf,0xba9a93b2,0x3a113df3,0x3bb06b23,0x3bfdf995,0x3c066582,0x3bdcad4b,0x3b0dfdfb, +0xbbb29ca2,0xba9faa0e,0x3b7f5da8,0x3c02592f,0x3bb60445,0xbb15dde5,0xbc42ff55,0xbb81ea6c,0xbc1ab585,0xbc4c95fb,0xbc29ef3d,0xbbd18efa,0xba97aed2,0x3a6ec8e3,0x3aa913a2,0x3a70428a,0xba2c2346,0xbabf20ec,0xba4c715a,0xbb205d03,0xbb3b8432,0xba940ccf,0xbb5e962c,0xbb9230ab,0xbb80c37e, +0xbb19b2f3,0xbb16fec5,0xbb6c100d,0xbb1c2589,0xba83de08,0x3a02c650,0x3a9e3fee,0x3b09581e,0x3bc16cc3,0x3c0a36ec,0x3c261e40,0x3c05b370,0x3c5d488d,0x3c1de619,0xba307ddc,0xbb494f97,0xbb314844,0xba983967,0xbb949650,0x3c3e497c,0x3c265a2d,0x3bedf1f4,0x3bae1d27,0x3b9c5c5b,0x3b80142b, +0x3b319d40,0x3ae082a1,0x3a1e7781,0x3a02fe69,0x3aadc122,0xbae3a611,0xbb5d27a6,0xbb60fa0e,0xbb586802,0xbafcf89b,0xba328b1c,0x39a61224,0x3a8e5116,0x3a7e29ef,0x3b2352e1,0x3b314327,0x3b08e4fa,0x3ac8b2e3,0x3a1b898e,0xba8b6493,0xbb2452d3,0xbb38251f,0xbb1b2d46,0x3b0e6905,0x3bcb3099, +0x3c41e9a1,0x3c06c582,0x3be97f50,0x3c1c5613,0x3c34c411,0xbbddc78d,0xbbdc87db,0xbc310000,0xbc587c87,0xbc712c2f,0xbc6cdd9c,0xbc4de0f5,0xbc163d8c,0xbc18e28d,0xbc0ce6b7,0xbbe8a5e5,0xbbbdb12b,0xbb983eb2,0xbb8d91a4,0xbbae7cbb,0xbba4fa1c,0xbb779893,0x390cca59,0x3b04726e,0x3b1c30a3, +0x3b250a24,0x3b2a5b59,0x3b4ae979,0x3ab9e1e1,0x3a9a2c94,0x3af29b7a,0x3b494ffa,0x3b76a62d,0x3b57949f,0x3b1e3273,0x3a983a11,0x3a128609,0xba16716e,0xbae7133b,0xbb8866dd,0xbbad72ee,0x39896174,0x38b7f1e5,0xbacdbc80,0xbb55814c,0xbb9f5f4e,0xbbccb805,0xbc07abac,0xbc295846,0xbc252a78, +0xbc1bd9c9,0xbc2381fe,0xbc090c1a,0xbc057955,0xbbd3ef72,0xbbaded3d,0xbb69195e,0xbb347138,0xba8b08fa,0x3a4791ce,0x3b536dd8,0x3b40d8e0,0x3b372a9e,0x3b3e416c,0x3b193b19,0x3af1df8e,0x3a9057df,0x3ac5768c,0x3af72dde,0x3b265486,0x3b1f117e,0x3b28aefe,0x3b27bfad,0x3b0c4aca,0x3adbf9f0, +0x3ac6123b,0x3a72a972,0xbb123a25,0xbb081391,0xbb3918ab,0xbb1d5b8f,0xbb2e1901,0xbb3319f8,0xbb207a18,0xbb1b2bd3,0xbb13d61a,0xbb152025,0xbb204467,0xbb18f22e,0xbb21f8ac,0xbb38d88a,0xbb3fcac0,0xbb38c343,0xbb220444,0xbaff71fd,0xbb0b9213,0xba87c50f,0xbaa5df43,0xbaa1dfd8,0xbaaaaa51, +0xbaa579b4,0xba99a14c,0xba910e6b,0xbaa7f2e7,0xbad59794,0xbb0176de,0xbb153253,0xbb298f14,0xbb3b7304,0xbb31b364,0xbb26afbc,0xbb20ddb1,0xbb1a6e6e,0xba934126,0xba50c6f4,0xbacf1479,0xbb012b04,0xbb2a68ec,0xbadb482a,0xbb1741a9,0xbb3959bc,0xbb40c056,0xbb48f987,0xbb4a0f30,0xbb58d92d, +0xbb5be4fe,0xbb61efe8,0xbb2a174f,0xbafca8c9,0xbb3c66b0,0xbb104283,0xbaef34db,0xba913f17,0xbaa99ea5,0xbaa7630b,0xbaa97064,0xbaaa7b79,0xbaadb881,0xbaa9ad2c,0xbabb3a54,0xbac1681b,0xbac91505,0xbacf40f6,0xbad6ba64,0xbae9ff65,0xbad32643,0xbac6683e,0xbab68987,0xbaa1e360,0xbace618a, +0xba75036d,0xba78f4d6,0xba231305,0xb9ec5788,0xba020244,0xbab79a47,0xba0b6e27,0xba1a0f84,0xba58e379,0xb9d22248,0xb97b71e2,0x38b24933,0xba4d3477,0xba731f64,0xb96055de,0xba8747de,0xbaa4c445,0xbae9d983,0xbab8a717,0xba9ef9fe,0xba4c84be,0xba86f541,0xba9a1678,0xbabad5e5,0xbacaa6bf, +0xbabbdc2c,0xba9c19f1,0xb9f0f30a,0xb992c518,0xba00c97d,0xba40b5b7,0xba6febfb,0xba8561e1,0xbaacd856,0xbab69d11,0xba9684c2,0xba956417,0xba931f2c,0xba205fa9,0xb914b651,0xb99d5625,0xbb04f8e1,0x3909ba69,0x3a601edb,0x39eae8ff,0x3a882bd9,0x3a9d5877,0x3b0bd911,0x388d26c6,0xb99834d4, +0x3a91a983,0xba9ffe4a,0xbb0804ea,0xbb480b68,0xbb13c9a6,0xbadeaf22,0xba7ad785,0xbad6aed6,0xbb11c8b0,0xbb386044,0xbb569da6,0xbb2ad0be,0xbab0a417,0x3a9556d3,0x3ae55356,0x3a0ed853,0xba0e2ae5,0xbacd06f8,0xbaf0578e,0xbb1c9eb2,0xbb0f3c76,0xbac42b9c,0xbacca56e,0xba99deaf,0x3962ae6b, +0x3adb0679,0x3af151d6,0xbb23ef76,0x3a9b9085,0x3ad68b22,0x3a41193d,0x3b687ae2,0x3b8f26ed,0x3bb423f2,0x3ab5f41f,0x393317d2,0x3b6a4e38,0xbad6d0a3,0xbb30652d,0xbb8b82a9,0xbb511753,0xbb0c0d75,0xba215a66,0xbafe5636,0xbb435c41,0xbb86f66e,0xbba8b89c,0xbb87f2eb,0xbb2954f2,0x3b05cb0a, +0x3b5598cd,0x3ab1615d,0x39e301d5,0xbab277a1,0xbb0dd39b,0xbb6cce2b,0xbb7bc984,0xbb073f27,0xbb1d4541,0xba905d30,0xb8ec4106,0x3abc5dc3,0xb9f471e9,0xbbb0dde7,0x3b5999ab,0x3beaea33,0x3b8f9204,0x3bfe6b7b,0x3c140ebb,0x3c123c5e,0x3ba5d74e,0x3b8de378,0x3bdbdf11,0xbafcd5b5,0xbb8479f2, +0xbb9f84f9,0xbb70c54e,0xbb12f033,0xb9c9ae0f,0xbb498b07,0xbbae2d60,0xbbf31538,0xbc0cf7d9,0xbbcc401b,0xbafed10e,0x3be74506,0x3c15a37b,0x3b8c610b,0x3a487afd,0xbb42572b,0xbb9a5187,0xbbb4022a,0xbb67f0ab,0xbabab959,0xbaf6e57e,0xbad538ee,0x3ae72780,0x3c428f22,0x3c7712cb,0x3c190be3, +0xbbaedec6,0xbc46234b,0xbbef6fcd,0xbad8aab0,0x3b10946f,0x3b9ced74,0x3bb304dd,0x3b32278f,0xbb21fb0f,0x3b199c61,0x3b6488d7,0xba84eacd,0xb8e7a6af,0x36c45964,0x3a826320,0x398342cd,0x3a7f60dd,0x3acfd166,0x3a882ca1,0xbb04baee,0xbbe8b9cc,0xbc3a7465,0xbc2722d0,0x398f1604,0x3b6a9770, +0x3b9ac56f,0x3ba4a754,0xbb0796d1,0xbc0e0d81,0xbc21f092,0xbbd4ff6a,0xbc321096,0xbc1b8fa2,0xbca0c3d4,0xbca1bf03,0xbc87f0b6,0x3bd1c4b2,0x3c77963a,0x3c2948fc,0x3afa5610,0xbaa12e63,0xbae08381,0x3b16e06b,0x3b9e3f12,0x3baf6b7d,0x3b4e937a,0x3a996321,0x3b028f10,0x3a723dee,0x38036686, +0xb704b835,0xba311a25,0xba9299c1,0xbb1b3ba5,0xbb19ca8e,0xbadca71f,0xba593dd4,0x3b06182b,0x3b7d8ffa,0x3bab8f42,0xbbbb64a5,0xbbda2251,0x3bacb890,0x3b30a0cb,0x3c1ef7ff,0x3cbeab18,0x39611477,0x3bb5e930,0x3cc04cf2,0x3c238fee,0x3b7bf876,0xbb11a981,0xbc10323b,0xbbaee185,0x3b9af203, +0x3bc3ab62,0x3bab2fa6,0x39f995e8,0xb995a8ab,0xba633de7,0x38b7c685,0x3b3cb94f,0x3b65cda4,0x39c0a83d,0x3a0b53e6,0x3947732e,0x39bfd478,0xba99f068,0xba41d50f,0x3b030ed2,0x3b9def72,0x3bd5d84a,0x3bdeaa7b,0x3bb21077,0x3b0aa880,0xbb2d87ff,0x3736a42a,0x3bca3119,0x3c88d288,0xbac4f797, +0xbc586df1,0xbc8d9628,0xbc12d47b,0xbc1418ba,0xbc4d1a02,0xbbfae654,0xbb7cec07,0xba9eaabf,0x3ab1c29c,0x3b02abb5,0x3a60e86a,0xb87a775d,0xbacc5a18,0xba906e11,0xbb33c7b6,0xbb422406,0xbaa0b430,0xbb62f72c,0xbb8f62c8,0xbb823faa,0xbb5594b6,0xbb6314ed,0xbb87fb8f,0xbb5b0dde,0xbb204363, +0xba74a970,0xb9802f83,0x3b116940,0x3bde9717,0x3c24f9f3,0x3c378eaa,0x3c0d0f77,0x3c3e60cd,0x3beda361,0x3a980825,0xbb8333b1,0xbb791bcd,0xbb2c3732,0xbb9c64ba,0x3c592d29,0x3c137c72,0x3bf38a8b,0x3bb2b1df,0x3bad0b00,0x3b8563f1,0x3b296eef,0x3aabef6c,0x3a335cb1,0x3a6ae6e3,0x3b13dd18, +0x386b0f41,0xbafe484e,0xbb61f44f,0xbb597c43,0xbb1dfd6a,0xbae8066e,0xb6db29d4,0x3a8efee8,0x3a9e8954,0x3b0da5f2,0x3b1857a1,0x3b006423,0x3aa88c35,0x3905205e,0xbb074912,0xbb3e3b5b,0xbb0770a6,0xb994da87,0x3b8e9e9d,0x3c00b72a,0x3c49b02f,0x3c223dd8,0x3c25057a,0x3c55255c,0x3c6af92a, +0xbbed05ca,0xbbe6ec5a,0xbc39b2bf,0xbc5b34ef,0xbc5eadf3,0xbc430896,0xbc1bfe5f,0xbbe624ff,0xbbf41096,0xbbe8015f,0xbbbdc75c,0xbbaa81d2,0xbb8ba1dc,0xbb7f8241,0xbb9cb16c,0xbb9c7445,0xbb94c5fa,0xba8ba89c,0x3a8193f0,0x3b1b1530,0x3b2a46db,0x3b3df234,0x3b56a06e,0x3b1f96be,0x3b02927c, +0x3b0882e5,0x3b545dd1,0x3b73f661,0x3b78dbda,0x3b409e99,0x3af4201d,0x3a80a873,0xb9ed4be6,0xbb052e98,0xbb984835,0xbbc1ed53,0xb9921905,0xba0a6f8c,0xbb14be9e,0xbb8535c9,0xbbcd27b0,0xbbed1580,0xbc101052,0xbc2817ea,0xbc1dcd56,0xbc0f0275,0xbc0f58ff,0xbbe1c0bf,0xbbcfda22,0xbb92b789, +0xbb8d6c6b,0xbb63cfac,0xbb62b2f8,0xbabf3c8a,0x3a1f0ebf,0x3b381a37,0x3b284176,0x3b369e1d,0x3b46396e,0x3b3a7414,0x3b3313ad,0x3b2182ff,0x3b2e1d36,0x3b3d3ad8,0x3b5ed899,0x3b5b2063,0x3b610cee,0x3b5afd40,0x3b1b1acd,0x3ac45299,0x3a81f7e3,0x39fc24d4,0xbac88f22,0xbaabd6ba,0xbaffc2c3, +0xbae9bf61,0xbb0109ca,0xbb0aa8b7,0xbb07f31c,0xbb0eb158,0xbb06d3c0,0xbb02b661,0xbb0c172f,0xbb00a0f0,0xbb084a72,0xbb141f0e,0xbb122cfb,0xbaeeea84,0xbabcff41,0xba7976a6,0xba8e1002,0x38e47aab,0xb913a204,0xb977363f,0xb9c47af3,0xb9f8fd25,0xba0e661e,0xba192a42,0xba55ed1f,0xba99bc2b, +0xbad328a0,0xbb02b337,0xbb182b49,0xbb22ea8d,0xbb0f6813,0xbaf5098e,0xbae1db7f,0xbad8968e,0xb912c5f0,0x393d9de6,0xb9dbd0d5,0xba4720a1,0xbaaa6f2c,0xba51c52e,0xbaaa48a3,0xbae91032,0xbaeadad6,0xbaf5cc9a,0xbaf0b52f,0xbb031b8c,0xbb02e796,0xbb058a3e,0xbaa901eb,0xba51a415,0xbac7342a, +0xba7463db,0xba2d4aa1,0xb8b151ae,0xb9a62bd9,0xb9adc6d7,0xb9c8a910,0xb9d6d4d3,0xb9ede466,0xb9f84215,0xba1ba696,0xba27cfc3,0xba2e1c43,0xba31cfc1,0xba41c449,0xba787fe2,0xba49d17f,0xba30dea9,0xba082d53,0xb9a0b949,0xb9adf3c7,0xba45e8f2,0xba45827d,0xba0ea698,0xb9c6faab,0xb9cb4a3e, +0xba8e9f3c,0xb9be6b3a,0xb9efe928,0xba1142e8,0xb9b28e9d,0xb937e254,0x398ba8f6,0xba2660c4,0xba4f4e74,0xb9460a90,0xba58575d,0xba87407b,0xbadfd9b5,0xbaac162e,0xba9664df,0xba455335,0xba829f57,0xba91b4af,0xbaa81dfe,0xbaacad3a,0xba970325,0xba4eb785,0xb9818ad2,0xb8b707cb,0xb98c3e2d, +0xb9fd6cdd,0xba398b91,0xba838489,0xba98e569,0xba9f10d9,0xba7d3c30,0xba6ef037,0xba2050ef,0xb9b0fbf0,0x390ee756,0x390207dc,0xbaa8ab31,0x399bf4bf,0x3a6fa2ba,0x3a644194,0x3a826a3b,0x3a8f0a69,0x3b0cbddd,0x38d1c61b,0xb972caa7,0x3a53b415,0xba69edee,0xbadf44af,0xbb4ae47e,0xbb158c98, +0xbaf3b92f,0xbaa4b5e1,0xbb0081ec,0xbb1da23c,0xbb31aa9e,0xbb3caf9c,0xbb03d2d8,0xb9ea7be0,0x3ac09676,0x3af34009,0x3a4942ed,0xb9642e33,0xbaa5470f,0xbafc668e,0xbb138f1e,0xbafcb987,0xba92e8cd,0xba88684a,0xba19f022,0x37996ea8,0x3abb519e,0x3af1ed85,0xbadf3f5b,0x3ab78209,0x3ad41bcc, +0x3ab25470,0x3b4fd8bf,0x3b7bcfac,0x3bbb5a26,0x3ab39330,0x3973ba40,0x3b473d19,0xba9b9d31,0xbb0b419e,0xbb960384,0xbb5d581f,0xbb26c815,0xbaa028f6,0xbb312479,0xbb63ae2c,0xbb845c4d,0xbb94e2f4,0xbb50efbb,0xba835a2a,0x3b2640c9,0x3b641eb9,0x3adbb027,0x3a87f493,0xba68cba4,0xbb2cccf2, +0xbb65db6c,0xbb6d14e8,0xbadd0c35,0xbad8fa25,0x39c4ce6a,0x3a1cdabe,0x3b149e44,0x3a2354c9,0xbb839b41,0x3b42279e,0x3bdbfbc2,0x3ba91a58,0x3bff1301,0x3c19dc95,0x3c1f22a3,0x3b8af48b,0x3b63ebb5,0x3bcd5ea4,0xbad25587,0xbb61af18,0xbbaf4c3d,0xbb849206,0xbb442943,0xbae6e15b,0xbb9bf31e, +0xbbd45b07,0xbbf2d107,0xbbf91868,0xbb92c0eb,0x3a685dd7,0x3c02c7ee,0x3c0efe1e,0x3b875a1c,0x3aa168a6,0xbb1cac73,0xbbaf4124,0xbbb1e43a,0xbb480095,0xba07780c,0xb9f5876a,0xbb37b818,0xbab9a242,0x3be6b623,0x3c39fde2,0x3c1c83bf,0xbb4c9fb8,0xbc25ff5c,0xbbf2cdf7,0xbb1468c5,0x3aad567b, +0x3afcff6c,0x3bcc2651,0x3b8be5e8,0xbb3f80d4,0x3b223edb,0x3b546193,0xba90d492,0xba7182f0,0xba8c252d,0x3860d3be,0x398f8719,0x3aaa50dc,0x3ad0ea78,0x3a3e9b36,0xbb15732f,0xbbedcefd,0xbc35571e,0xbc0d3c80,0x3b8044f7,0x3b9ce632,0x3ba5e2d6,0x3bcb4992,0xbb48b872,0xbc21015a,0xbc1b2051, +0xbbd4d34e,0xbc0b481b,0xbba22a6b,0xbc699ac2,0xbc87aa3d,0xbc903165,0x3b53f01e,0x3c57ac81,0x3c2dd09d,0x3b1e5d6e,0xbacb66db,0xbb4b3d14,0x3a160764,0x3b6360a6,0x3b9c06e8,0x3b51f480,0x3aa3760a,0x3aeeaeeb,0xba0c832d,0xbac4a551,0xbaac902a,0xbadac1a5,0xbaedf6be,0xbb2c601b,0xbb724fde, +0xbb3965ff,0xbafe8402,0x3b8be4e0,0x3bb66b30,0x3b2a87c1,0xbbb1ffab,0xbbb14673,0x3bdf319c,0x3b922414,0x3c3ac741,0x3cc3d904,0x3ab257a7,0x3abcd5de,0x3cb32e45,0x3b9abb51,0xbadd8918,0xbb266121,0xbc02c2f5,0xbbb2417f,0x3ab2716c,0x3b873acc,0x3b914d84,0x3a14deb1,0xba4937ab,0xbab531f2, +0x390770a4,0x3b0d79e0,0x3b5183aa,0x3a483837,0x3a9d6523,0x3a9e6ca4,0x3ac09895,0xba00d99c,0x38929dd6,0x3b572435,0x3b936ecb,0x3bb7b316,0x3bafa669,0x3b6c239c,0x3adce755,0x3a1f88c0,0x3a870f24,0x3be7c273,0x3cb01cbd,0xbbf049c9,0xbcac70ac,0xbca71e7c,0xbc51382c,0xbc0026af,0xbc3e9a67, +0xbba9bb8a,0xbac0f6cf,0xba09d944,0x3aa984f8,0x3af6d5ec,0x3a2e6527,0x39af575c,0xbadad517,0xbab9ecaf,0xbb294ff1,0xbb2752d9,0xbab0f475,0xbb4ef276,0xbb816fe3,0xbb81ac13,0xbb84d077,0xbb8fb85c,0xbb8e4510,0xbb8c3ae0,0xbb798b5e,0xbb20f4c3,0xbab175f7,0x3b20451d,0x3beb5f5b,0x3c2ce83a, +0x3c3be84a,0x3c1d9afe,0x3c1b4ad6,0x3ba54004,0x3b5efc26,0xbb3220ce,0xbb3cd11d,0xbb5a6143,0xbb8857d1,0x3c458754,0x3bb464d8,0x3bc78090,0x3b98ca15,0x3ba37bd6,0x3b8eba9d,0x3b386af1,0x3a80bb5d,0x3a25ba1e,0x3a8e234c,0x3b2cfa76,0x3ada4ff6,0xb9eb28e1,0xbb591bd9,0xbb5d04b6,0xbb48afff, +0xbb30b571,0xb9fc20eb,0x3a7aac37,0x3acbe525,0x3af9c825,0x3b0713a2,0x3b07da50,0x3aa65f45,0xb936d7a9,0xbb181b93,0xbb0bee60,0xb9ee3602,0x3b26a5b6,0x3bc377ba,0x3c0c73f4,0x3c3daee9,0x3c2d237e,0x3c3ecb76,0x3c641987,0x3c7260c8,0xbbc67d5b,0xbbe25866,0xbc2736ee,0xbc420793,0xbc3f3317, +0xbc10274f,0xbbcac332,0xbb9c6229,0xbba87eed,0xbbaa1653,0xbb8fe17b,0xbb9ac859,0xbb8749c1,0xbb7a332f,0xbb828262,0xbb88b244,0xbba1b91d,0xbb180e0a,0xb99cfc3c,0x3ae2e196,0x3b10332a,0x3b3734cf,0x3b427f3c,0x3b39c732,0x3b2a8df5,0x3b112479,0x3b3f283d,0x3b4a03c6,0x3b702b10,0x3b3ee368, +0x3b10ff69,0x3ab7fde5,0x38cd49b9,0xbab0247d,0xbb6db082,0xbb97f863,0xba923835,0xbaae294c,0xbb51fa26,0xbba4b912,0xbbf8299c,0xbc04d628,0xbc155e24,0xbc23a42e,0xbc142589,0xbc013d73,0xbbf335ac,0xbbb9e1de,0xbba0e603,0xbb582529,0xbb67e509,0xbb55fe77,0xbb64cdfc,0xbad461ae,0x39399321, +0x3aea12aa,0x3aed07ef,0x3b1cc311,0x3b3b5e18,0x3b45ad17,0x3b4f046b,0x3b542bb9,0x3b572d5e,0x3b5fdcef,0x3b755a79,0x3b66d7a2,0x3b5ab9c5,0x3b405c36,0x3ad6dbd7,0x3a1276ee,0xb905ff0f,0xba05fac4,0xba7a1093,0xba4992d7,0xbaa22a8a,0xbab21f75,0xbac2ee8c,0xbada5282,0xbaf5c8b8,0xbb0e3c61, +0xbb04c678,0xbaf6afed,0xbafc7489,0xbae6d3ff,0xbaee427d,0xbaedcbe9,0xbac70d59,0xba6a3773,0xb9f963f0,0x35cafc23,0x39249251,0x3a9f2799,0x3a7a5826,0x3a44b512,0x3a12c872,0x39b0268b,0x3921d6e7,0x37fd7c39,0xb9903f7d,0xba286c6c,0xba8d578f,0xbabec77a,0xbae0f37a,0xbae5b400,0xbab6b79b, +0xba897a3c,0xba728a6c,0xba7aaee9,0x38b793e8,0x39a03254,0x37a48663,0xb93b2ba4,0xb9ed855d,0xba203f17,0xba5efaeb,0xba950c5e,0xba8902cf,0xba8cb61c,0xba80b904,0xba867419,0xba7842e4,0xba723804,0xba0522fb,0xb997bef5,0xb9e09d78,0xb8eed164,0x368c94f0,0x39b075e5,0x38de92c1,0x387bd1b7, +0xb7cc8c04,0xb88a8320,0xb9052ff2,0xb9471aa7,0xb98e2ecf,0xb99cf71e,0xb99f140b,0xb9987eb6,0xb9b53808,0xba126cb5,0xb9f0c86c,0xb9da4b3f,0xb997f8c0,0xb8af8ecc,0xb8b27bc8,0xba0e23cf,0xba03980a,0xb9d7df07,0xb96abff2,0xb959e374,0xba3ee655,0xb92554ec,0xb992fdd3,0xb98e717e,0xb994d27f, +0xb9106796,0x39b0cf6d,0xb9f11048,0xba20d073,0xb95199ff,0xba127241,0xba3c2e66,0xbad094bd,0xba94019d,0xba831d67,0xba36cabe,0xba6f4e23,0xba81595b,0xba8e1df8,0xba87a469,0xba57fb35,0xb9b28ec7,0xb80b091a,0x38b8b0e9,0xb8a6529f,0xb968ef76,0xb9f78bce,0xba6dfc15,0xba856972,0xba88e403, +0xba4a1c1d,0xba294fcd,0x3842197e,0x3844a297,0x3a0afb04,0x3a1cd9b9,0xb9e7440d,0x3a07626f,0x3a811e53,0x3aa62fc1,0x3a6ec689,0x3a731f8b,0x3b00a03b,0x394c40e9,0xb897a2c3,0x3a05db5f,0xb9fbf7b7,0xbaa16309,0xbb421896,0xbb10b3a1,0xbb0112a6,0xbac59981,0xbb0dafe0,0xbb1fb05e,0xbb22fad0, +0xbb1a211a,0xbaad151d,0x3a06531d,0x3ae63269,0x3af748ff,0x3a625045,0x38ca18d5,0xba6ce85c,0xbaf2352e,0xbb0bd8cd,0xbae197c5,0xba3c0c7e,0xb9cb6fc0,0x3920e807,0xb74a7f4e,0x3abbfc0f,0x3aff4f31,0xba2b350b,0x3adaeff0,0x3ad2828c,0x3b0164a6,0x3b2e38fa,0x3b49e670,0x3bb17917,0x3ab882f8, +0x3a02cd9b,0x3b1b8022,0xba1add6d,0xbab41f55,0xbb9663b8,0xbb5aed23,0xbb38c1ed,0xbaeebdc0,0xbb542d73,0xbb733efc,0xbb785e1e,0xbb75e1a3,0xbb0ae62a,0x3a400a6e,0x3b3d38f7,0x3b6523f0,0x3ae37239,0x3accd94f,0xb9c7fe36,0xbb3878a5,0xbb663837,0xbb66b2b3,0xbab3b49b,0xba5deecf,0x3b0d614f, +0x3ac0c569,0x3b5829ea,0x3b003a5d,0xbb0d4963,0x3b40c3fb,0x3bcd6c23,0x3bc5d619,0x3bfb9cbe,0x3c1a09aa,0x3c25f44d,0x3b76738e,0x3b41923b,0x3bb75672,0xba751b5e,0xbb29f27a,0xbbbe4ead,0xbb9128c6,0xbb7875e2,0xbb4fcccc,0xbbc74f59,0xbbeb0009,0xbbe851e2,0xbbcef206,0xbb243a98,0x3b814538, +0x3c0e3ad7,0x3c032231,0x3b6db290,0x3ad694c8,0xbad743e7,0xbbb1b0b3,0xbbb058ba,0xbb349bbc,0x39d681a0,0x3aa45043,0xbb875be5,0xbb846323,0x3b21e95a,0x3bef38ab,0x3c16156f,0xba724781,0xbc010361,0xbbf039c6,0xbb530f29,0x39b8d64c,0x3908ffd7,0x3be723e3,0x3bbd56bf,0xbb44f901,0x3b1c2f45, +0x3b3cc31e,0xb9c56d7a,0xba88fb29,0xbab90627,0xb9a4004b,0x3a5746c1,0x3af9c440,0x3acfdf0c,0x3a3fbbfe,0xbb180858,0xbbff1907,0xbc2b239c,0xbbdbfffc,0x3bde35ef,0x3bafe841,0x3ba376e1,0x3bcf7749,0xbb87c405,0xbc2f6849,0xbc2376e0,0xbbe18b25,0xbba6f251,0xba7b35be,0xbc150755,0xbc5c47e2, +0xbc8eacd9,0x375b3081,0x3c279f48,0x3c1f5a81,0x3b517af0,0xba9d180f,0xbb89a314,0xba854fac,0x3b0dc6aa,0x3b84c28e,0x3b46c3e7,0x3aa02e1c,0x3ad3e983,0xbae64ce6,0xbb3c568d,0xbb3634b1,0xbb21ceff,0xbb118bb0,0xbb29c6a4,0xbb8c53d6,0xbb56737f,0xbb1ead5b,0x3bd55105,0x3be85f0d,0x3a20f77c, +0xbb9ef03d,0xbb891eb1,0x3beb8f99,0x3bd9a544,0x3c5572b4,0x3cb8d400,0x3b4897ff,0xbba04ea2,0x3c81c0cd,0xb6bf6f47,0xbbb9a18b,0xbafbce87,0xbbc4e588,0xbb94cbd0,0xbaf6751d,0x3aef25c8,0x3b4f6c9e,0x3a7d2b1d,0xba89c39e,0xbae12f71,0x395ba561,0x3ab0fdee,0x3b28d42d,0x3a8fa96e,0x3acaef48, +0x3af245b8,0x3b101081,0x39eff669,0x3aa7412b,0x3b90ee8b,0x3b9bdeb8,0x3ba8bbba,0x3b814377,0x3af7a710,0x3ab6760d,0x3b647c4e,0x3b37561d,0x3bf69eb2,0x3caec3d2,0xbc42d4ab,0xbcd0a5c2,0xbca42ca4,0xbc82b28c,0xbba2631e,0xbc11ba18,0xbb45c822,0x398a8176,0x3a6c4528,0x3a8da859,0x3ab09b10, +0x3a007ba7,0x3a0d2ff1,0xbae3e4df,0xbae4cc36,0xbb07d4fd,0xbaeaafab,0xbac02196,0xbb282a73,0xbb5aa144,0xbb81b2ed,0xbb9750cf,0xbba31dc2,0xbb8e1b04,0xbb9f9b1c,0xbb988617,0xbb65f7a8,0xbaeae7f2,0x3b2bc68b,0x3bea2e68,0x3c28096e,0x3c368c24,0x3c2eb458,0x3bff956c,0x3b5ff5dc,0x3b961c5f, +0xb9ab58a3,0xb9abb0d2,0xbb04785d,0xbb02efd3,0x3c063285,0x3a889596,0x3b5edb91,0x3b4c3cf8,0x3b838463,0x3b9648c5,0x3b5955a0,0x3a8fa1a5,0x3a5b194a,0x3aacda7c,0x3b2c7657,0x3b31f124,0x3a368909,0xbb42abfc,0xbb6090ab,0xbb7522a7,0xbb64d936,0xba8b652f,0x3a41bb88,0x3aef4971,0x3ae4c5f9, +0x3afc3a41,0x3b12325e,0x3ab9adcb,0x38a49fe6,0xbab6ac7e,0xba00925d,0x3ae7174b,0x3bb8dfc3,0x3bf42815,0x3c19f42e,0x3c37262c,0x3c31897f,0x3c3eed97,0x3c49ece4,0x3c4459fd,0xbb68b8ca,0xbbc5696a,0xbc005228,0xbc0f0f4a,0xbc0f558f,0xbbb23256,0xbb42b68c,0xbb2043b5,0xbb2caf48,0xbb49821c, +0xbb3ff09b,0xbb896a90,0xbb84df90,0xbb7bd9bc,0xbb5935df,0xbb69945d,0xbb9c86de,0xbb5e95b5,0xbadfff1c,0x3a11ffe3,0x3abd354c,0x3b19bbb8,0x3b1f326e,0x3b35ccbd,0x3b36572b,0x3b0f1b3a,0x3b15c068,0x3b12f1bf,0x3b4fb608,0x3b31c40c,0x3b1e47dc,0x3aee5839,0x3a7a2cda,0x39275898,0xba889ad4, +0xbaf119a2,0xbb0ea283,0xbb16a4ec,0xbb890453,0xbbc71ae9,0xbc0f4aa6,0xbc0fa839,0xbc15e287,0xbc1a7e32,0xbc07b773,0xbbe65fa0,0xbbc9235b,0xbb9ca8c2,0xbb848c9d,0xbb426d69,0xbb4cf763,0xbb4637e4,0xbb49dd76,0xbace9e88,0xb96bd434,0x3a3bf6e2,0x3a8a3a80,0x3afef431,0x3b2fcda0,0x3b3967dd, +0x3b43c3e6,0x3b51e692,0x3b575e65,0x3b62942a,0x3b743335,0x3b5525a0,0x3b34b481,0x3b049288,0x3a237680,0xba1e4a5f,0xbac57f03,0xbaece5cd,0xb9e95a2f,0xb9cb1b87,0xba4185a3,0xba8d8b8b,0xba9c973a,0xbabcec9a,0xbafa13ee,0xbb1bbc6c,0xbb138045,0xbb0714a6,0xbb030afa,0xbaf74c4a,0xbaf1d52a, +0xbadee385,0xba94605e,0xb9e69233,0x37e06842,0x39ff4183,0x3a82d874,0x3ada8c46,0x3abed684,0x3aa1c5ff,0x3a8d0fa6,0x3a6638e7,0x3a3f8bda,0x3a1bbbd1,0x39acfc97,0x37a5a02b,0xb99dd765,0xba1becea,0xba423018,0xba2e171f,0xb9d06751,0xb900fa12,0xb89133d1,0xb971c3de,0xb99711e2,0xb966c839, +0xb97d33a3,0xb9abbb93,0xb9cc2885,0xba84ff72,0xba8a97d5,0xba9a05a2,0xba8196e3,0xba7d291a,0xba5dfede,0xba4a23c3,0xba25b08b,0xba15d0aa,0xb9e8c299,0xb9dcd730,0xb7f72cea,0x3822c095,0x388652ac,0x392d2b0b,0x36c9cc48,0xb8651700,0xb91d9f25,0xb948efe1,0xb983a055,0xb9a44193,0xb9b86e40, +0xb9ba66cb,0xb9b5a51f,0xb99ba1c4,0xb9a70b57,0xb9f16ff1,0xba02e13c,0xba128a13,0xba0b68fa,0xb9d67a4b,0xba11f170,0xb9aa83b4,0xb9809741,0xb9829e40,0xb8a701c6,0xb864f920,0xb9c9eab9,0xb70b7257,0xb93037aa,0xb83731cd,0xb98eea5d,0xb92fc692,0x398d346d,0xb9a4cd24,0xb9e6bd14,0xb97312fe, +0xb9a51c7c,0xb9d03ffd,0xbab84ba9,0xba735956,0xba5d1cd9,0xba20a460,0xba4dfd67,0xba564e92,0xba65e247,0xba3d560b,0xb9f68945,0x38fae9bb,0x3934db69,0x39795c3f,0x38782b22,0x37b11e5e,0xb978c30f,0xba47512b,0xba65136f,0xba66aa7a,0xba0f8dae,0xb9c6495e,0x3a3e39a1,0x39e5150c,0x3a66ded9, +0x3a80528c,0x3990cf6f,0x3a2c3548,0x3a7ed8cd,0x3ac8b8d3,0x3a4400f1,0x3a31a364,0x3ac9b187,0x39903b69,0x39015553,0x39877afa,0xb84347e6,0xba3ab549,0xbb2cb601,0xbb04ea21,0xbb03fad7,0xbadc0824,0xbb111dfa,0xbb193a69,0xbb12319e,0xbae32f9f,0xba11bd65,0x3ac2bd9c,0x3b03b94a,0x3af4df4f, +0x3a5bad6f,0x39bbef9f,0xba0edc92,0xbad82f43,0xbb0395a5,0xbac8b90b,0xb980b659,0x39982258,0x3a57aebc,0x37978ab5,0x3ac31811,0x3b0401b0,0x39b00ad6,0x3ae809a9,0x3abab1f4,0x3b19e5b2,0x3afd4bd3,0x3b09efdb,0x3b937c60,0x3ab7e5bd,0x3a5cc929,0x3ae23dd3,0x387421ef,0xba0425f7,0xbb890d74, +0xbb48b884,0xbb4010c2,0xbb180cde,0xbb6355a5,0xbb7093f1,0xbb65e730,0xbb38938d,0xba7d4043,0x3b22ed21,0x3b4c3695,0x3b5c03d0,0x3ad0a298,0x3b01efe5,0x38f0e225,0xbb359b1e,0xbb6575a7,0xbb5e9f73,0xba72a8dc,0xb8c5aab5,0x3b7cd8e8,0x3b133999,0x3b851828,0x3b492300,0xb9c56200,0x3b3d5e1b, +0x3bb8248f,0x3bddbcb4,0x3bf0a15e,0x3c12ee64,0x3c233b31,0x3b64ed6f,0x3b31d018,0x3b9f7240,0xb7a7afce,0xbac9a3dd,0xbbc19559,0xbb9650da,0xbb902efa,0xbb8f4105,0xbbe0ca5f,0xbbf227ad,0xbbdc3bd2,0xbb9e446f,0xb9b798e8,0x3be4bf58,0x3c15ed0d,0x3beaf545,0x3b3cc412,0x3afa7231,0xba6940f7, +0xbba7d78e,0xbbab1cda,0xbb232f0f,0x3acc5003,0x3b4425ac,0xbbb77531,0xbbbebe7e,0xba7c50c7,0x3b8115cf,0x3c0646d4,0x3a8105e8,0xbbb88df5,0xbbeeb1c4,0xbb913b04,0xba31a609,0xba4f2a1c,0x3bfdf57c,0x3be4d027,0xbb403ad6,0x3b0b3488,0x3b23bb7b,0x3a6651cb,0xba0b6553,0xba92dca4,0xb97a557a, +0x3ade984d,0x3b2f5b8e,0x3af74b0f,0x3a4b125e,0xbb27f0ad,0xbc086c4d,0xbc220979,0xbba2656c,0x3c10b180,0x3bbc7170,0x3ba260d2,0x3bc6fae5,0xbba10f79,0xbc3480b9,0xbc2ee755,0xbbfcd4ff,0xba3e4fc2,0x3b0cc804,0xbbabeb91,0xbc36e7f8,0xbc87cf65,0xbb541db0,0x3bdcb42c,0x3c06d971,0x3b894c52, +0xb9550bf4,0xbb9d46bd,0xbb1a581d,0x3a800505,0x3b5ec2a3,0x3b2bc650,0x3a8300c0,0x3a98cd04,0xbb20285f,0xbb6b7311,0xbb821c1d,0xbb380fbf,0xbb169327,0xbb1ce344,0xbb958e39,0xbb54bb3f,0xbae5c7e9,0x3c0bac88,0x3c06675f,0xba2d2a91,0xbb8df279,0xbb4ef950,0x3bdb7a3d,0x3c0ff059,0x3c665d48, +0x3ca06428,0x3bac4bfa,0xbc3ef4dc,0x3bcbb1a0,0xbb62cab2,0xbbe334d2,0xbacd1b35,0xbb6f2e87,0xbb4e81a1,0xbb907aae,0xb9f46f39,0x3ad9f4c8,0x3abd7cef,0xba8ccd4d,0xbaf1c7e0,0x390e6d93,0x39fbd750,0x3ae6cc61,0x3aacf55b,0x3acc0265,0x3b03fb33,0x3b0e01e7,0x3abd4162,0x3b2b1f2d,0x3ba7a6b8, +0x3ba5c631,0x3b9a1111,0x3b24a1aa,0x3a49781e,0x3ad99833,0x3baf4cd3,0x3bb93b45,0x3c000b18,0x3c733456,0xbc7812e3,0xbcd485f3,0xbc8f0bbb,0xbc95bb3d,0xba8c3540,0xbb94cfce,0xba5d520f,0x3acf8817,0x3b2e3930,0x3a8c5786,0x3a48f369,0x39b7ea49,0x3a116247,0xbadcb4c6,0xbb026ca7,0xbabbf270, +0xba7a8874,0xbac3d388,0xbaec318d,0xbb2e5716,0xbb82aff0,0xbba022ab,0xbba895bf,0xbb8cd6b3,0xbba6a315,0xbba0dada,0xbb8123db,0xbad9755e,0x3b2d8901,0x3be5871c,0x3c19e506,0x3c25a5ea,0x3c2b1efe,0x3bc2a70d,0x3b0e6433,0x3b950a0a,0x3b0257d2,0x3b1bf2ff,0x3a46839d,0x3a5bbda2,0x3b2b8b08, +0xbb495b47,0x39d2e78d,0x3ab65bfe,0x3b34fae7,0x3b908f3f,0x3b73fcf3,0x3ac71f1d,0x3ab84dda,0x3ae6d20c,0x3b1d7bb7,0x3b4dac5c,0x3ab51d79,0xbb16dc7c,0xbb5fb4d8,0xbb8cd934,0xbb84dc1c,0xbaeeefbb,0x3963570b,0x3adcb357,0x3accb0e7,0x3aeef981,0x3afe7314,0x3ad9ca2a,0x3a6a7bf2,0x3849df6e, +0x3aebef41,0x3b8f58dc,0x3c070b49,0x3c10837b,0x3c274342,0x3c34c485,0x3c2f7ab4,0x3c267272,0x3c0826df,0x3bd436ce,0xb977d3a4,0xbb7f9e05,0xbba3beb9,0xbba3dd1a,0xbb9c8b5e,0xbaf79dd0,0x389d0a51,0xb902dae7,0xb95060f0,0xba7e03a4,0xbac00d1f,0xbb606cbb,0xbb7afa6c,0xbb7a831a,0xbb45f090, +0xbb52163a,0xbb898444,0xbb861ad0,0xbb3e9650,0xba50caec,0x3a15a806,0x3ae20e83,0x3ae8e1c0,0x3b2650e7,0x3b2bf7a3,0x3b024756,0x3ac60a3e,0x3aa64124,0x3b1609fd,0x3b130961,0x3b155ec7,0x3b056985,0x3af0e1cb,0x3b092000,0x3b1a3598,0x3ad651ad,0xbb557c5b,0xbb645f6f,0xbba6c504,0xbbe213ef, +0xbc1b18df,0xbc152b81,0xbc123ef8,0xbc0ee7fe,0xbbf71a50,0xbbcfb0bd,0xbbaa4068,0xbb8a437d,0xbb6be665,0xbb427b7d,0xbb3fa33d,0xbb38c075,0xbb2f363e,0xbad3b8e1,0xba310d03,0xb9b96637,0x398a6e68,0x3ab79835,0x3b1e6d81,0x3b183e1b,0x3b17c44a,0x3b25aba4,0x3b2e13b6,0x3b3bedcb,0x3b48f590, +0x3b2b3a73,0x3b07ff7b,0x3aa9bd0e,0xb7b44985,0xbaaddd76,0xbb1d03fc,0xbb3e1906,0xb926c5b6,0xb991342a,0xba0c0061,0xba8a5a22,0xba9bf27d,0xbac5617b,0xbb0de94c,0xbb36e2da,0xbb2f5ab9,0xbb21c3aa,0xbb1985d6,0xbb144a62,0xbb0bd03b,0xbafa9af1,0xba9c3e67,0xba0a8cc5,0xb819cf1f,0x39d45d58, +0x3a933726,0x3abbd816,0x3ab45397,0x3aa33577,0x3aa043db,0x3a9bd1ac,0x3aa1701d,0x3a9cefef,0x3a84c7a1,0x3a4c6639,0x3a14cbf9,0x39a7e802,0x394eb910,0x398f21df,0x39b10724,0x39ff3a3a,0x39f45de7,0x396d4b5d,0xba80d018,0xba8a942d,0xba7480ca,0xba7d017f,0xba6e28d4,0xbae533db,0xbadf743c, +0xbae3a5a2,0xbac2bc56,0xbabaa9c9,0xbaa943ae,0xba956c64,0xba7dde04,0xba690861,0xba6dfe27,0xba797487,0xb993fb2b,0xb9b4ec62,0xb9aa0e9c,0xb9aab3a6,0xb9cfdbfe,0xb9e9e1cc,0xba09ccf2,0xba0d2474,0xba16eb0a,0xba199df1,0xba21a429,0xba2026c2,0xba1be0cd,0xba0856f2,0xba02608f,0xba0d5a2a, +0xba3b7afe,0xba69e928,0xba838cca,0xba84cb27,0xbaae0886,0xb93c8c9b,0xb869e38b,0xb928071e,0x38255a66,0x38e15c79,0xb7bcc538,0x3887cc27,0xb8ab4dd5,0x39300392,0xb971dd6a,0xb933b351,0x3926bb78,0xb90577e8,0xb94f28ab,0xb9350d83,0xb85f00c1,0xb8e21ad0,0xba8b8495,0xba3233cb,0xba32edfc, +0xba17460b,0xba3278dc,0xba31ddb6,0xba3d8acb,0xb9f0e4c5,0xb9394517,0x3a0060f5,0x399941e6,0x3999bab2,0x38b156ba,0x392d77a0,0xb8a44c24,0xba273ef4,0xba486fbb,0xba444664,0xb9bc0d79,0xb93781ba,0x3aa3a326,0x3a398ff1,0x3a9a8e0d,0x3a9a7634,0x3a51a5a8,0x3a34a265,0x3a5c4f4a,0x3ad18175, +0x39fb4f23,0x39a6e545,0x3a7117d2,0x3998b860,0x399d44cf,0x38a0dff4,0x39cd65fb,0xb944f581,0xbb0ce40c,0xbaeba552,0xbaffbfcb,0xbaedeead,0xbb114b6f,0xbb105b13,0xbb02d147,0xba92213a,0x39298ac5,0x3b16a9b2,0x3b09f90d,0x3ade05aa,0x3a2312e0,0x39fe75fb,0xb9890a1d,0xbaba5a04,0xbaeeadf5, +0xbaacc43e,0x393f6b78,0x3a5d2aae,0x3aa84437,0x386deb67,0x3ac1096c,0x3b007b1e,0x3a9cc0cf,0x3ada263e,0x3a8a97d3,0x3b1a7311,0x3a86c8cc,0x3a7eb12e,0x3b496a77,0x3aa63fd5,0x3a9dc700,0x3a9ba410,0x3a42c47b,0x39d14152,0xbb5f973f,0xbb2bd57b,0xbb3db12a,0xbb2d32d4,0xbb66c2e7,0xbb6254a3, +0xbb525520,0xbaf3449d,0x390242c5,0x3b82da29,0x3b4be80d,0x3b43f657,0x3a9de2fa,0x3b0cde65,0x3a0518d1,0xbb29db94,0xbb58696c,0xbb4b2fa8,0xb9c3bd7a,0x3a0de29c,0x3ba8fdc9,0x3b39df44,0x3b920701,0x3b757907,0x3a9f2791,0x3b3090a5,0x3b9c25ef,0x3be82fbc,0x3bdb95de,0x3c03edb6,0x3c1309cf, +0x3b5add88,0x3b3468f8,0x3b896ee4,0x3a8e1013,0xb9a041f1,0xbbb3fd45,0xbb938390,0xbb9cabb2,0xbbac751b,0xbbee7352,0xbbefda7b,0xbbcd4bd8,0xbb528134,0x3ae9ddc0,0x3c1c29f5,0x3c15772b,0x3bc6e444,0x3ae95d4c,0x3afef65c,0xb974a4a2,0xbb9718e4,0xbb978853,0xbb004148,0x3b328de7,0x3b92eaff, +0xbbe75e8a,0xbbe1316c,0xbb5bdc87,0x3ab2e615,0x3be2dd86,0x3b1cb5a8,0xbb6c769c,0xbbef9504,0xbbb5c9cd,0xbac714eb,0xba83239f,0x3c04c05a,0x3bf949fd,0xbb2f2b04,0x3ade00b2,0x3b05e6c3,0x3b1707b9,0x3a09de8c,0xb96df67e,0x39a8b081,0x3b42abe5,0x3b71d3cd,0x3b1fac37,0x3a1a2a05,0xbb502637, +0xbc0c7eff,0xbc16f846,0xbb5b7783,0x3c26800e,0x3bc547be,0x3ba14702,0x3bc27c2b,0xbbb24e84,0xbc32c59f,0xbc33b93b,0xbc0e751d,0x3b6af1e5,0x3b929b60,0xbb15c3e2,0xbc1a14cd,0xbc7ee370,0xbbcecd8b,0x3b3f7918,0x3bd26239,0x3ba3db4d,0x3a83fcb5,0xbb9ffd52,0xbb60a3a1,0xb90c4d08,0x3b384928, +0x3b01f2e1,0x3a0dce13,0x39eaac63,0xbb28fe73,0xbb68768b,0xbb981073,0xbb38a6ec,0xbb1d4ffb,0xbb2da8f4,0xbb966ef2,0xbb376bc6,0xb9a30f1c,0x3c24458d,0x3c0f9729,0xbab69b24,0xbb825cf3,0xbb0fba45,0x3bc9f44c,0x3c2c9dc7,0x3c67ed68,0x3c785856,0x3be4dfc8,0xbc8f0d3c,0xbba18bbc,0xbbac18e1, +0xbbbd7125,0xbacf098c,0xba9eb6e6,0xbad506bf,0xbbc3cb42,0xbb172885,0x399ddb92,0x3ae21905,0xba41da22,0xbade1d8a,0xb955bb4b,0xb9c8a4a3,0x3a70343a,0x3ac460ca,0x3aa62cd4,0x3ad442e0,0x3aa49e77,0x3b06c73b,0x3b6e2a99,0x3baa209d,0x3ba50806,0x3b827932,0x3a9ed148,0xb8af6fb8,0x3aea69d2, +0x3bb52e1d,0x3c146a90,0x3c06135d,0x3b921ae9,0xbc8232fd,0xbcb744b9,0xbc6b90f3,0xbc9c8a1f,0x3b5791e6,0x3a52cfa4,0x3ac5a0f8,0x3b30face,0x3b8ee158,0x3a90095b,0x394df7b4,0x39c5c93e,0x39e06691,0xbac08a2c,0xbb07e322,0xba6d13cc,0xb9ad7178,0xbab3dbe1,0xba874834,0xbb062851,0xbb82eb0e, +0xbba2304f,0xbba46951,0xbb8fc8b9,0xbba56e14,0xbb9d7762,0xbb8549fb,0xbaa53c8a,0x3b2bd21a,0x3be3a81c,0x3c0a1351,0x3c1007a7,0x3c10ff45,0x3b56f17b,0x3a1e9604,0x3b5beee4,0x3b55a230,0x3b80f1bf,0x3b5b0f6c,0x3b708552,0xbb558f92,0xbbd48450,0xbb0d7c46,0xb79ed87f,0x3adb7ba1,0x3b7a64d4, +0x3b76d7e0,0x3b021004,0x3b0a0233,0x3b15cd2c,0x3b09d838,0x3b461c28,0x3ad74ccc,0xbaaf7556,0xbb5760c3,0xbb985e8a,0xbb8f37c2,0xbb337630,0xba3057a7,0x3a758a8e,0x3a958d7a,0x3adb268f,0x3ac7c911,0x3b04b68e,0x3af8eda9,0x3ae6ac75,0x3b883dc3,0x3bdae8ac,0x3c25d779,0x3c1f7faf,0x3c2b0505, +0x3c2831c5,0x3c298b23,0x3c04771d,0x3b3c5c80,0x37ff60fd,0x3b542a3d,0xba373879,0xbaf05433,0xbaaa766f,0xb9f2ded5,0x3ad7278b,0x3b3daa3e,0x3b0629ab,0x3b02c378,0x3a7675bc,0xb8f7a608,0xbb1f8b18,0xbb607677,0xbb7a02d1,0xbb47f052,0xbb49a1c3,0xbb651cf0,0xbb8d96c6,0xbb6eeba8,0xbb019427, +0xb99deb85,0x3a8101db,0x3a8dc422,0x3b0fb577,0x3b170d22,0x3ac7ac59,0x3a377c01,0x398ca8e3,0x3a8bb832,0x3ab6bbb9,0x3aeeda59,0x3b0bf9bc,0x3b2afc00,0x3b7de9b5,0x3bb416f9,0x3ba2c9e9,0xbb85a6cd,0xbb9843cb,0xbbbd33bf,0xbbee5f2d,0xbc1b771a,0xbc13284c,0xbc09eca6,0xbc020182,0xbbe15b4d, +0xbbbf7582,0xbb98de7c,0xbb829384,0xbb5eebfc,0xbb4acfad,0xbb3b2565,0xbb39e1a2,0xbb2f04cb,0xbb03225a,0xbab3599c,0xbac5a40b,0xba2f24aa,0x3a266566,0x3af48b87,0x3acda1bb,0x3ab812f4,0x3acdff19,0x3adb1627,0x3af0d7ef,0x3afa4c74,0x3adaf7e3,0x3aa4e7ff,0x3a3863c4,0xb964646e,0xbaade734, +0xbb1972cc,0xbb5ffb0f,0xb9695838,0xba11ae6b,0xba34caae,0xbab6e38d,0xbacb0d4e,0xbaf9800f,0xbb301494,0xbb5e343b,0xbb56ac57,0xbb467d79,0xbb392c32,0xbb356c01,0xbb2996c8,0xbb179038,0xbaccbda7,0xba809031,0xb9ff5014,0xb899ee66,0x3a3e7dc4,0x3a3bb6c4,0x3a5e936d,0x3a630bc6,0x3a84fadf, +0x3a99efcf,0x3abd48dd,0x3ad021c6,0x3ac2c294,0x3ab25df4,0x3aa4e22a,0x3a8c3af2,0x3a7b30c4,0x3a7d0462,0x3a3a4b42,0x3a230e0a,0x3a03b21b,0x397ce7c9,0xbae86781,0xbb0130e8,0xbae71c6b,0xbae68c11,0xbad7869f,0xbb279aa9,0xbb21e8e1,0xbb211637,0xbb0d7356,0xbb07f35d,0xbafe7039,0xbae3cc41, +0xbacaf782,0xbabec900,0xbac9ffb7,0xbad1d59e,0xba55afba,0xba778660,0xba6dec0e,0xba7e5eeb,0xba760595,0xba7ad175,0xba825e3b,0xba79cbcf,0xba78a934,0xba691ff4,0xba727e70,0xba709eae,0xba6b77ac,0xba574aa4,0xba488bcd,0xba34b4bd,0xba80aa15,0xbaa4b526,0xbac758c7,0xbadd0d10,0xbb0b0fe0, +0xb8860ff5,0x38d0b5ba,0xb8d59105,0x38eea4e5,0x39511e32,0x396349f2,0x38c0ad29,0xb8927452,0x3980321e,0xb995f0b3,0xb98dfab2,0xb8b69a7c,0xb8501a71,0xb83c8a24,0xb921ff05,0x391832f2,0x3912b8de,0xba44dfca,0xb9f8ebf6,0xba0da623,0xba09fe18,0xba160c66,0xba0cf375,0xba14a5cb,0xb95bcfce, +0x38bd84f7,0x3a500eb0,0x39c637d8,0x39a79b05,0x38918fd4,0x39947ca9,0x388fa687,0xba0a5436,0xba2405ce,0xba1a50d4,0xb93853a3,0x36cf59b5,0x3ad2fd24,0x3a595619,0x3aa9e2e0,0x3aa0d9b8,0x3a97c6f5,0x3a161494,0x3a19e8f7,0x3ac6f308,0x391669d3,0xb8f7a93e,0x393fc08e,0x39807d3f,0x39e6e96f, +0xb78bf399,0x3a47c801,0x399297f5,0xbacb7c4a,0xbacbbce9,0xbaf98662,0xbaf89c9e,0xbb0d2c59,0xbb026d48,0xbadbb5ae,0xb9ec0f31,0x3a637377,0x3b425af8,0x3b0aa727,0x3abedadb,0x39af1d59,0x3a1aa343,0x37db3aed,0xba9e03d2,0xbac55897,0xba816e52,0x3a188976,0x3aa9f1f5,0x3ad2c19a,0x37b03078, +0x3ab1a209,0x3aeb475f,0x3afcb86c,0x3ab3c8c6,0x3a08867c,0x3b0a3a66,0x370e9710,0xb9767e44,0x3aab9a9a,0x3a82a2ed,0x3ac1bb09,0x3a51289d,0x3ab256da,0x3a9ecff2,0xbb1b0a18,0xbb0af306,0xbb35aa19,0xbb362154,0xbb5ec548,0xbb49fbfa,0xbb364822,0xba5b144f,0x3a99a6c7,0x3ba9de24,0x3b441b1e, +0x3b2a177b,0x3a4e2c9e,0x3b14ebcc,0x3a79d8ab,0xbb1c863c,0xbb373fb5,0xbb23bc56,0x3944af65,0x3a91d2b9,0x3bc3c42a,0x3b44996e,0x3b92b57a,0x3b84082e,0x3b28a95d,0x3b152a9e,0x3b727a71,0x3be1effc,0x3bbc70e7,0x3bdb1fa5,0x3be87b45,0x3b517464,0x3b4535cc,0x3b6d6366,0x3b1053c5,0x3a809fc2, +0xbb95a885,0xbb8a5dcf,0xbba656b4,0xbbc227de,0xbbf2d6e7,0xbbe336b6,0xbbb3a05b,0xbab2de19,0x3b807306,0x3c3c9c1c,0x3c0f8656,0x3ba06c53,0x3a220ce6,0x3b02c760,0x39f19e1f,0xbb87064f,0xbb6ac145,0xba83c69f,0x3b74dd0b,0x3bb8be94,0xbc04ab36,0xbbee0f07,0xbba87142,0xba47b3c7,0x3bbcc663, +0x3b54fea1,0xbb003a8f,0xbbeed4ef,0xbbcbda9a,0xbb0203bb,0xba3d57ae,0x3c02a347,0x3bf5dddd,0xbb0dab6c,0x3a8f8d0d,0x3ac42e49,0x3b6c7225,0x3b020645,0x3aa35685,0x3ae75be8,0x3b9bfcef,0x3b9ddef1,0x3b3eab4f,0x3855d1be,0xbb88cdf8,0xbc0faecd,0xbc079d14,0xbacd7985,0x3c377a9f,0x3bce2d46, +0x3ba10317,0x3bc7c0a5,0xbbb3c2aa,0xbc28d20f,0xbc2d9a16,0xbc17c336,0x3be2c6eb,0x3bc695a4,0x3a0f0c17,0xbbf52e06,0xbc721c85,0xbc117771,0xba28bc10,0x3b908e2d,0x3babbe54,0x3af5a3bf,0xbb9700ad,0xbb8bb05e,0xba9abd9c,0x3b1572b5,0x3a9e0a00,0xb8816b81,0xb9cec550,0xbb1250d8,0xbb3e157a, +0xbb98e69d,0xbb248fab,0xbb1f1aa5,0xbb385415,0xbb89f93e,0xbaf8f681,0x3b013414,0x3c2fe9ca,0x3c086d01,0xbb11605f,0xbb778a0d,0xbaa8f7f7,0x3bb8195c,0x3c420493,0x3c5fc1ac,0x3c24cf5f,0x3bf9b005,0xbcb3838b,0xbc867598,0xbbcfbfbe,0xbb6a81fb,0xbb105301,0x3a9ae479,0xb805a675,0xbbda9e32, +0xbb647ac5,0xba460d8a,0x3ade089f,0xb8e91e59,0xbaa81b7a,0xba440d87,0xba8a1c84,0x39967703,0x3ade25e4,0x3a6189f4,0x3a53a8f8,0xb88f9a68,0x3b158d3d,0x3b85fa2d,0x3b99f32a,0x3b96a9e6,0x3b4b420e,0x399d76bd,0xba19d834,0x3ade7d44,0x3b91db77,0x3c4cb874,0x3c18fbd0,0xbb9e4af2,0xbc70c69c, +0xbc8d7b45,0xbc3fd995,0xbc9800a4,0x3c03d535,0x3bdf4791,0x3b8b1012,0x3b748f1a,0x3bb2e999,0x3a8c32d5,0xb960dfa8,0x3a1e54d4,0x39b80fe8,0xba8c8933,0xbb04c196,0xba20fd74,0xb800eeb0,0xba9044c2,0xb9e3b83a,0xbad31588,0xbb80195b,0xbba0a370,0xbb9eb4d6,0xbb94fb80,0xbb9dc83c,0xbb9188cf, +0xbb79d5ad,0xb9e2cf70,0x3b3b6528,0x3be0ab4f,0x3bf2bd17,0x3bed26cb,0x3bd495f0,0x39a69b14,0xbaad3322,0x3aaf1988,0x3b58982d,0x3b8e29e8,0x3ba19f18,0x3bd1183c,0xbc033d5f,0xbc1105e6,0xbb8a3f58,0xba833c2a,0x3a87e16d,0x3b46e631,0x3b5f365e,0x3b1e8d6d,0x3b2d4081,0x3b2f0b53,0x3ae9d63f, +0x3b22adb6,0x3ac7452b,0xb99dc421,0xbb49ff05,0xbb9d0df4,0xbb94af3e,0xbb6f93ec,0xbaee4c1e,0xb996cf3a,0x39ffcc8f,0x3ab73821,0x3aa4fcb0,0x3b100d54,0x3b34c17a,0x3b7e2052,0x3bc60040,0x3c065118,0x3c389f3c,0x3c2606d1,0x3c2806bc,0x3c16b84b,0x3c20f67e,0x3bcce09e,0xbad7d8b8,0xbbae808f, +0x3bcdf0d7,0x3b2c544b,0x3ac9322d,0x3b0c349e,0x3b5127e7,0x3b96729a,0x3ba85d1a,0x3b80dfba,0x3b7bee33,0x3b2965c1,0x3a8ffd4f,0xbaadea3a,0xbb3c5e17,0xbb7bfec3,0xbb54c2b5,0xbb49845e,0xbb3e5699,0xbb87517f,0xbb7c10b3,0xbb376996,0xba85e166,0x399a4aa2,0x3a1567a1,0x3add47fc,0x3ae576af, +0x3a3e5f52,0xb895cd69,0xb9e12816,0x38a58a20,0x3a345336,0x3abf30da,0x3b13895c,0x3b51b21f,0x3ba8111a,0x3bfc9e7b,0x3bf8e07f,0xbb8f2197,0xbbaef518,0xbbc7408e,0xbbebbbe4,0xbc12f8be,0xbc09682e,0xbbf7983e,0xbbe259bb,0xbbc906ee,0xbbaf216f,0xbb8f1cd1,0xbb813c5c,0xbb630889,0xbb64542f, +0xbb4a840d,0xbb51c7c5,0xbb4cad4b,0xbb30edd7,0xbb14e6b3,0xbb2681b7,0xbacba873,0xb987ad92,0x3a896f79,0x3a36084c,0x3a0db658,0x3a403505,0x3a3599f0,0x3a31f850,0x3a13fe9e,0x3a1d4825,0x39dbd2d2,0x39981e4d,0xb8a61255,0xba507191,0xbad218c9,0xbb598848,0xba21ec9f,0xba982a61,0xbaa39988, +0xbb054bcc,0xbb126f87,0xbb2af80f,0xbb610072,0xbb87d105,0xbb82cb42,0xbb724059,0xbb5fc7c2,0xbb5b9683,0xbb4cfb71,0xbb37e5ed,0xbb0ac0e7,0xbad6e8fd,0xba98f024,0xba4e94b1,0xb8019482,0xb97b2696,0x38002764,0x3942fb22,0x39f75733,0x3a546434,0x3aa336eb,0x3ace7b4b,0x3acde135,0x3ad2c592, +0x3ad63912,0x3aca2159,0x3abf3641,0x3ab68f17,0x3a4b5ed7,0x39ca20ca,0x3917cf72,0xb9021155,0xbb212f1a,0xbb33e47a,0xbb24b498,0xbb250526,0xbb1ea1d5,0xbb54b22a,0xbb50b2b7,0xbb522998,0xbb3c4d30,0xbb35e39a,0xbb2cfedb,0xbb1d9a76,0xbb108340,0xbb0936b8,0xbb0e9f66,0xbb106244,0xbac00255, +0xbad112b3,0xbac849c5,0xbad3f2f6,0xbac33f94,0xbabebae9,0xbabc2e5a,0xbab003e1,0xbaa92a6a,0xba99ad5f,0xba9e5df3,0xba9e1fe7,0xba9bc8ec,0xba93899e,0xba89e8c4,0xba64196f,0xbaa1a395,0xbacc7cf0,0xbaffa7b0,0xbb13c050,0xbb33f03c,0x389b9381,0x3985a7a2,0xb74829cb,0x390d57d1,0x396413b3, +0x39c7b11b,0x38b8078b,0xb9059019,0x397da9c3,0xb9d30def,0xb9e310b2,0xb9caf8e3,0xb86dde15,0x3805a4b1,0xb91f8842,0x398c2f7d,0x39b178df,0xb9efbfa0,0xb9a5deb2,0xb9db5401,0xb9da70bd,0xb9dd9837,0xb9ba227f,0xb9bbb40c,0x38868e1c,0x39c0a5ac,0x3a8b5ae8,0x3a038659,0x39ce8b46,0x38ab98e8, +0x39e5b45d,0x39858a80,0xb9d36c47,0xb9de5e69,0xb9bec31b,0x388163bc,0x3953087b,0x3af0f6af,0x3a62a72a,0x3a9e8902,0x3a97665c,0x3abb9742,0x39b64350,0x39786fd7,0x3ab02ee9,0xb9831b38,0xba1d1600,0xba0f8a44,0x391f3523,0x3a0cbc7f,0xb80a73d9,0x3a8794db,0x3a331164,0xba61f2e7,0xbaa79b31, +0xbaf4573f,0xbaf9087f,0xbb0243bf,0xbadad7f0,0xbaa04f65,0x39869682,0x3acd3bce,0x3b6537aa,0x3b0e2f2f,0x3aad35b8,0x38f24ab5,0x3a4aa9e0,0x39c20467,0xba823940,0xba899c91,0xba05a146,0x3a8981a0,0x3adad27f,0x3aec2e93,0xb87a16e8,0x3a8bdb7e,0x3ac5301b,0x3b263aa4,0x3a6d31bf,0xb923a583, +0x3adfeb96,0xba8cb779,0xbabcb7a0,0xba0b0a68,0x3a21d6a6,0x3ad1555c,0x3a091102,0x3af090ab,0x3af3cbc0,0xba921d47,0xbacf2908,0xbb286c22,0xbb36aa48,0xbb4a3834,0xbb283f50,0xbb0ef428,0x39691d7d,0x3b0e6253,0x3bc51b70,0x3b41ba6f,0x3b1c05b2,0x39ed8591,0x3b241621,0x3ac233bd,0xbb101eef, +0xbb05ca6a,0xbad6d413,0x3a6836d8,0x3acf374d,0x3bcdfdfd,0x3b374d6d,0x3b833bf1,0x3b8007fc,0x3b7371d2,0x3acf3ea6,0x3b1bdcec,0x3bca41e1,0x3b9106a7,0x3ba10b05,0x3b95eedb,0x3b456ef6,0x3b5c63d2,0x3b4e17e6,0x3b4e6949,0x3b10bf4c,0xbb4a3191,0xbb73406c,0xbbae3da9,0xbbd36947,0xbbed2528, +0xbbcbbd70,0xbb8f3f70,0x3a226531,0x3bc37768,0x3c51d82e,0x3c091258,0x3b8344f9,0xb9a03157,0x3b11cecb,0x3aa1beee,0xbb70e748,0xbb120b95,0x39a584f2,0x3b9d88ca,0x3bd19da1,0xbc0f2457,0xbbe89ac2,0xbbd349f1,0xbb2a7475,0x3b998160,0x3b671970,0xba451989,0xbbe29f46,0xbbcb4723,0xbb02c6b4, +0xb9a489f9,0x3beea75d,0x3bdb955b,0xbab1ec66,0x39d94ec1,0x3a644ad7,0x3b942e8d,0x3b647040,0x3b503373,0x3b8846ae,0x3bdca192,0x3bbe2401,0x3b550b11,0xba5cf3f3,0xbbb3cacd,0xbc11c909,0xbbed9766,0x397fa746,0x3c435795,0x3bd93aaa,0x3b9fb0fc,0x3bc714d3,0xbba5c011,0xbc16eef1,0xbc1f6b3d, +0xbc1a4545,0x3c10dee8,0x3be50cb0,0x3b588099,0xbba5edbb,0xbc641047,0xbc2d6592,0xbb5ed77f,0x3b234654,0x3b9db1e7,0x3b0d284b,0xbb828979,0xbb9a0ed2,0xbb0440f1,0x3af1ffed,0x39c38f3b,0xba37f98c,0xba9ea6d7,0xbac53aca,0xbaef22a9,0xbb860087,0xbb01a454,0xbb17a22c,0xbb2d72e8,0xbb6ed578, +0xba3d57fb,0x3ba1b688,0x3c2dad04,0x3be04b82,0xbb67dbe4,0xbb755837,0xb9a7aa02,0x3bb24f2b,0x3c5232b7,0x3c52e84f,0x3baf5608,0x3be69b63,0xbcc728d2,0xbcdb78a3,0xbbfa5c20,0xbadc5c01,0xbb69ae52,0x3b4d8ac5,0x3ac06068,0xbbd7bf6e,0xbb8353d7,0xbac07902,0x3abc049a,0x3a225d34,0xba47be4c, +0xbab443ee,0xbac1b8bb,0xb8a86af7,0x3af63e20,0x3a15d230,0x38107330,0xba8d73ae,0x3b0fa557,0x3b7ec089,0x3b7da814,0x3b7bcc37,0x3b081638,0xba00fb96,0xba876eee,0x3ab47f44,0x3b3b6041,0x3c759962,0x3c28ad5e,0xbc40ada4,0xbc57d71b,0xbc56ec62,0xbc20d313,0xbc89992e,0x3c47e79e,0x3c50ce67, +0x3bf68947,0x3ba1f1d0,0x3bb99b16,0x3a902e2f,0xb98cb7ee,0x3a656e39,0x39dc14ce,0xba050c71,0xbaee9fe6,0xba10f2a2,0xb7306555,0xba2c0c0f,0xb80c93f8,0xbaa8af60,0xbb6c0eab,0xbb99c9c0,0xbb99c89c,0xbb977dd0,0xbb90fadf,0xbb7c6d35,0xbb4a7f85,0x39edee4e,0x3b4fe5e0,0x3bdc502f,0x3bd1ea02, +0x3bb4a65a,0x3b6b51bd,0xbb092600,0xbb346459,0xb9c447b4,0x3b1f45d0,0x3b6a0be1,0x3bab8b8e,0x3c04d5ff,0xbc355b2a,0xbc21bfdd,0xbbb89d08,0xbada01ce,0x3a3b26ee,0x3b0a4143,0x3b2e1e2e,0x3b315218,0x3b3bc936,0x3b34994f,0x3ac0c906,0x3ade009d,0x3a8ffb21,0x39fa90ea,0xbb3ce07a,0xbb9c1939, +0xbb9b481c,0xbb90a459,0xbb429b7e,0xbae175b7,0xb9d6de77,0x3a5f5bf2,0x3a80f4bf,0x3b18a644,0x3b6b64e8,0x3bba3bd6,0x3bec1f32,0x3c11b93f,0x3c392128,0x3c264dfc,0x3c217316,0x3c03689d,0x3c0bc622,0x3b8e96af,0xbb8dea0c,0xbc10e828,0x3c0780fb,0x3bab0890,0x3b9627bf,0x3ba36b98,0x3bb8f977, +0x3bd46532,0x3bd3c45a,0x3bad465d,0x3ba90a9f,0x3b7f30af,0x3b114334,0xb93e4773,0xbb0f0ea5,0xbb778b8f,0xbb612c77,0xbb4c2364,0xbb24cb13,0xbb6dca86,0xbb6b4230,0xbb4f688d,0xbac163ed,0xb99b834a,0x39033161,0x3a8590ba,0x3a7d80e1,0xb91b8fa7,0xba3b90ff,0xba4dc7a2,0xb9d2dd70,0x39f51811, +0x3abfa115,0x3b20e0a0,0x3b72aa9a,0x3bbe2e04,0x3c0f0510,0x3c13ffac,0xbb8958bd,0xbbb28773,0xbbc2e8f6,0xbbdd4405,0xbc0546f2,0xbbf2bd7e,0xbbd0a422,0xbbb6dd2a,0xbbaa184d,0xbb99c946,0xbb863252,0xbb809cf2,0xbb73be02,0xbb84a114,0xbb6a4260,0xbb7428d0,0xbb73db73,0xbb5fa1b2,0xbb49c0c6, +0xbb508c0d,0xbb0fcfab,0xba8e3f27,0x39091ffa,0xb931295e,0xb95f5207,0x383cc34c,0xb938e3e6,0xb9d01dd8,0xba35709d,0xb9e01b83,0xb9aee4fe,0xb71f0345,0x390589d1,0xb910c871,0xba317440,0xbb394ed8,0xbaacd5e1,0xbb033383,0xbb0776c2,0xbb395254,0xbb49ada9,0xbb62e21c,0xbb8b83ff,0xbba14402, +0xbb9ab9b6,0xbb8fd07d,0xbb8506a6,0xbb81828e,0xbb7160d8,0xbb5b32fa,0xbb353432,0xbb1c352a,0xbb000304,0xbad24393,0xba7a005f,0xbaa18c29,0xba6c9df0,0xba289e9e,0xb993785a,0x394f028f,0x3a3f6b2c,0x3a9eafdb,0x3aa806cb,0x3abec04f,0x3ace55c0,0x3acde04f,0x3ac48508,0x3ab47c1f,0x39f4726c, +0xb95261c8,0xba12b930,0xba5b7259,0xbb43e768,0xbb5a12f4,0xbb4c5260,0xbb4e6203,0xbb4a5ba0,0xbb75cbef,0xbb75be90,0xbb7c0f5e,0xbb65332c,0xbb5e46da,0xbb54d7f3,0xbb454b3a,0xbb380844,0xbb2f3735,0xbb32e34f,0xbb3189b2,0xbb099396,0xbb10ce0b,0xbb0aca8d,0xbb0fcf48,0xbb025e0e,0xbaf84b6c, +0xbaedbb29,0xbadd521c,0xbad1bb82,0xbabcbf1a,0xbac245c6,0xbac37f13,0xbac26ee4,0xbabe5538,0xbab5e441,0xba97a230,0xbac8bd56,0xbaf30bf2,0xbb173d1e,0xbb30bbc2,0xbb4d9f2b,0x3987b5fa,0x39ded482,0x38dbe26e,0x395c088b,0x399f8bbb,0x3a2134e5,0x39123325,0xb8d26c2e,0x39a035f6,0xb9e2e06c, +0xba03c35c,0xba12cff5,0xb60fa8f8,0x392a4746,0xb86a0d87,0x39e97b9b,0x3a143916,0xb89005c4,0xb8957b83,0xb95e541b,0xb9858c59,0xb95cb42c,0xb8e62210,0xb8927a9b,0x39c8484e,0x3a3028b3,0x3aaa516c,0x3a35fd9f,0x3a11c19b,0x39339a21,0x3a2cb214,0x3a02a649,0xb976d5f1,0xb926d6b1,0xb89c42df, +0x39c2ba98,0x39dd50ac,0x3affcf6e,0x3a6620be,0x3a8addd5,0x3a84740e,0x3ae5394a,0x39158bbc,0xb8dfa8cd,0x3a97a1f3,0xba2c9dcf,0xba8b426b,0xba8e53ad,0x3865fed0,0x3a1c5f60,0x381ce5aa,0x3aa5e269,0x3a8c5374,0xb88d6523,0xba6eca10,0xbadc9608,0xbae70eed,0xbadd065f,0xba9e3a2c,0xba1e758e, +0x3a84f648,0x3b13337f,0x3b7c8642,0x3b167581,0x3aafa2bb,0x382eb3da,0x3a8dd0e9,0x3a56b6e6,0xba378fcb,0xb9f4a460,0x38b0edb8,0x3ad2f04e,0x3b01a2b6,0x3af438b2,0xb8f62144,0x3a2fd22a,0x3a92e538,0x3b4ba500,0x39c48eaf,0xba5bb7a5,0x3aa6e479,0xbb0ab822,0xbb29322d,0xbb0a60b3,0x38fcc9f4, +0x3ac9dbed,0x39a9d03e,0x3b0e9b83,0x3b19e161,0x396faaba,0xba7f7467,0xbb1289a5,0xbb2d6225,0xbb292a2f,0xbaf63ec1,0xbaafb8dd,0x3ab0035a,0x3b4e5ae8,0x3bd405cc,0x3b4b3ef0,0x3b20b639,0x39b7bcda,0x3b3fcdc3,0x3b0a8c02,0xbafd629d,0xba96830c,0xba27021b,0x3ae5cda6,0x3b02258f,0x3bcaa1a8, +0x3b215503,0x3b4c5842,0x3b5e3971,0x3b9ddff0,0x3a3c10c3,0x3a635b2a,0x3ba560e5,0x3b303b6d,0x3b36fdc6,0x3aece76d,0x3b3133bc,0x3b6cf36c,0x3b330adb,0x3b7b0249,0x3b58c669,0xba8d9ea7,0xbb40c5af,0xbbaf84f9,0xbbdb8bcd,0xbbda54ae,0xbba76abb,0xbb3a2ac5,0x3b33e0d5,0x3c00e513,0x3c5a8d4b, +0x3c0396de,0x3b65081c,0xba5a0f95,0x3b32529c,0x3b1095e7,0xbb45b73a,0xba2a35c6,0x3af0738f,0x3bc5567f,0x3be0c521,0xbc151c69,0xbbd8023f,0xbbefe365,0xbb85f066,0x3b671fed,0x3b5b5008,0x38f3d2bd,0xbbc20554,0xbbb38775,0xbad68f73,0xb776ec0c,0x3bc64c18,0x3bb08c05,0xb98906c9,0xb987f2a5, +0x391a001e,0x3b9e69a0,0x3b9a5d40,0x3bad8444,0x3be0fdca,0x3c093ab7,0x3bd5af5f,0x3b63f355,0xbafd13d1,0xbbde9b16,0xbc0f9d1b,0xbbc4ee6f,0x3b08d653,0x3c4d5755,0x3beca437,0x3b9f31de,0x3bb4197e,0xbb944b73,0xbc01c6c3,0xbc08f555,0xbc171aec,0x3c16503c,0x3bfb466d,0x3bcb3723,0xbafff241, +0xbc4fee57,0xbc3b3db1,0xbbb0a5f6,0x3a657955,0x3b80e092,0x3b00477c,0xbb4ffc54,0xbb99da2e,0xbb29e73d,0x3abe9f93,0xb9d95ccd,0xba9cfb28,0xbaf0296e,0xba12ab2b,0xba084a85,0xbb3f8382,0xbab3c796,0xbb0b73ea,0xbb0e5256,0xbb385eef,0x3a2c48ab,0x3c003fc0,0x3c1d257b,0x3b9330d6,0xbbaf7971, +0xbb7cfcfc,0x3a4156c1,0x3bbdbf25,0x3c615975,0x3c45ce90,0x3aa0b853,0x3bac1b93,0xbcc0a0fd,0xbd0cfe59,0xbc27abbf,0xbacebffa,0xbbaafd28,0x3b89d223,0x3b2a45a6,0xbbb70050,0xbb831076,0xbaf9bd9b,0x3a96fe52,0x3aa6201d,0xb980113d,0xbaffdb5a,0xbae023aa,0xb99f8bdd,0x3b01cd79,0x3a0bfa3e, +0xb99999f9,0xbaaf6136,0x3afd0d0c,0x3b584a4c,0x3b472721,0x3b39d658,0x3a6685ba,0xbaa4f337,0xbacdf74e,0x3a723167,0x3abf2e86,0x3c818955,0x3c258559,0xbc83246d,0xbc44fad1,0xbc2807a8,0xbc04d353,0xbc58d7ae,0x3c73ad87,0x3c92d772,0x3c369547,0x3bd5beb2,0x3ba533fd,0x3aa9e3b0,0x38f1cc4e, +0x3a88b32c,0x3a0c7253,0x38993ab2,0xbabf6c9d,0xba2e3984,0xb916b24b,0xb8c888d4,0x396e3925,0xba77291d,0xbb4232b5,0xbb89b8ca,0xbb9122c6,0xbb9160c2,0xbb7d83e6,0xbb497a07,0xbb016c49,0x3a9bde8a,0x3b67ae1f,0x3bd58d1b,0x3bb81489,0x3b7a542c,0x39489f7e,0xbb7356b5,0xbb5c2690,0xbaafdd76, +0x3a8a7fea,0x3af3a257,0x3b8e8235,0x3c06a4ad,0xbc485323,0xbc1d8ff6,0xbbd05454,0xbb097e46,0x39f969f9,0x3a92a6b8,0x3add310c,0x3b36a7c0,0x3b34c3d8,0x3b234143,0x3a960d97,0x3a698c05,0x3a117774,0x3a59f419,0xbb2fd83f,0xbb950ff8,0xbba3de68,0xbba15635,0xbb813067,0xbb4d4c89,0xbabf240c, +0x38e0a04c,0x3a336fba,0x3b1ace41,0x3b87bef4,0x3bdc9013,0x3bfc3f11,0x3c13ac4b,0x3c2ed2b7,0x3c1fefa6,0x3c12a8ed,0x3bd87e76,0x3bd328ef,0x3b154e6c,0xbbb3d025,0xbc29b67f,0x3c13c2bd,0x3be0cb9a,0x3bdbc6d4,0x3bdf8a6a,0x3be44068,0x3bee38e3,0x3bdfe06a,0x3bc1ced0,0x3bbed028,0x3b9d4886, +0x3b5097f2,0x3a7f2fca,0xbaac7a90,0xbb619e77,0xbb62b3b3,0xbb4af891,0xbb1353df,0xbb417875,0xbb45bd00,0xbb44b24a,0xbad8359e,0xba521ca2,0xb9ba41d1,0x39cee719,0x39845c06,0xba475287,0xba87f584,0xba5471d6,0xb9cd03c5,0x3a2357b9,0x3af2a0c4,0x3b4536a9,0x3b8a8ebb,0x3bc53818,0x3c0dd3d9, +0x3c16ce8b,0xbb78bf41,0xbba901b2,0xbbb2d2f7,0xbbc415f5,0xbbe5c20a,0xbbc7adbd,0xbb9f7be5,0xbb811aba,0xbb82790d,0xbb7a94f4,0xbb72eda9,0xbb75cf6e,0xbb804a3a,0xbb902555,0xbb82d8dc,0xbb86dd14,0xbb89388a,0xbb7f9ad7,0xbb698b03,0xbb607460,0xbb290eb6,0xbae1b94d,0xba430b80,0xba65fce9, +0xba4ab112,0xb9e799cb,0xba3ff729,0xba875fdd,0xbab6a0eb,0xba8beebb,0xba5ae316,0xb967d050,0x394bf203,0x3992f66b,0xb7f67e92,0xbb14da8b,0xbb139710,0xbb42d84e,0xbb435a5b,0xbb70477c,0xbb8125fb,0xbb8da384,0xbba589e7,0xbbb83bc6,0xbbafe8da,0xbba30aa5,0xbb970fa2,0xbb904af3,0xbb85d9ba, +0xbb7577cb,0xbb59c423,0xbb4681a1,0xbb2f3eec,0xbb1baeff,0xbaf57baf,0xbb0c70bc,0xbaecdeb3,0xbac3e04b,0xba91f370,0xba1ab03d,0xb840db16,0x3a041df4,0x3a15baf0,0x3a4b44cb,0x3a7024cd,0x3a80a5c9,0x3a76089f,0x3a52a9e6,0xb977be4a,0xba8d71bc,0xbac9de15,0xbaeeb170,0xbb5bc22e,0xbb73832b, +0xbb671083,0xbb69fadb,0xbb682e24,0xbb83d8ff,0xbb852427,0xbb8ad7fe,0xbb7ed2d5,0xbb77ed46,0xbb6e14cb,0xbb6061e5,0xbb53821d,0xbb49015b,0xbb492eb6,0xbb46d298,0xbb2a9e3a,0xbb2f7524,0xbb29eef9,0xbb2eaa09,0xbb1e1752,0xbb1507a4,0xbb0c97ee,0xbb031e33,0xbaf7a4bc,0xbadf6bc8,0xbae5fca3, +0xbae83580,0xbae9a49e,0xbaebc3e5,0xbae91fee,0xbace282b,0xbafa6793,0xbb0ed18c,0xbb2b3ecd,0xbb45fa9f,0xbb57985c,0x39f45bd9,0x3a1f5bf6,0x398660ec,0x399aa8b8,0x39c6c314,0x3a5cbe4a,0x39680312,0xb831084a,0x39c55f20,0xb9eae259,0xba1022ee,0xba27d9c1,0x3821d734,0x39877b88,0x384e096b, +0x3a1cd7ac,0x3a489fb9,0x39a30f01,0x3928cd12,0x372089e9,0xb841ac02,0x381e4297,0x39352041,0x3991da2f,0x3a3b37ec,0x3a7ec605,0x3ac19cae,0x3a6fca81,0x3a49eb2c,0x39b55f5f,0x3a6d2b92,0x3a4604b4,0xb7fe08b3,0x390b5a73,0x397a8ec5,0x3a3700a7,0x3a2d0db2,0x3b031940,0x3a67feab,0x3a54a972, +0x3a56eaee,0x3b05de25,0xb81f38bc,0xb9d3f6ed,0x3a801ef7,0xba884b53,0xbac1a7b9,0xbabab031,0xb8a6aa7b,0x3a185ca9,0x39141922,0x3abb2651,0x3ab6bc22,0x3a3451a8,0xba06d5a6,0xbababe3e,0xbac20d08,0xbaa55ea1,0xba251ea7,0x3926b8d7,0x3ae7abc5,0x3b39f288,0x3b826799,0x3b1cd19f,0x3ab985dc, +0x3906d3f2,0x3abada86,0x3aa7aa6e,0xb9aa4033,0x3918d956,0x3a327941,0x3b0bf750,0x3b114ae8,0x3aff1e20,0xb906ae70,0x395c4713,0x3a2eb295,0x3b6a056a,0xb90a3c7a,0xbaba2f64,0x3a6c91f9,0xbb47dba1,0xbb6b5fd4,0xbb576908,0xb9fe8210,0x3aa3d71f,0x392ed77e,0x3b18e852,0x3b2bcdf0,0x3ab95feb, +0xb9dfdacb,0xbaf5ca25,0xbb19a594,0xbafe86da,0xba8c4b7e,0xb988387c,0x3b201d12,0x3b837f26,0x3bd5db3b,0x3b58d660,0x3b3034bb,0x3a1aff0e,0x3b5df977,0x3b3030fc,0xbac96a01,0xb9879158,0x39b87798,0x3b2b146d,0x3b1df845,0x3bc1780f,0x3b0b373f,0x3b024b98,0x3b28514b,0x3bbcbbbe,0xb96934f4, +0xba385703,0x3b747392,0x3a37eb7e,0x39f61caa,0xba59aa27,0x3b0dd048,0x3b6abb0c,0x3b1e0bc4,0x3b8ae0ab,0x3b898d82,0x3a8e31c6,0xbb085df2,0xbba9291e,0xbbd4d941,0xbbba7a0f,0xbb6ef238,0xba59e3d1,0x3b9f3f76,0x3c1a1047,0x3c559458,0x3bf4fdd5,0x3b4ac186,0xba617a39,0x3b54c759,0x3b4c5197, +0xbb072049,0x3a70d43e,0x3b52ecf2,0x3be8d854,0x3be8b08c,0xbc13aa13,0xbbc394a0,0xbc0130b7,0xbba9e4c6,0x3b1aa94a,0x3b48f700,0x3a72772c,0xbb8df4d9,0xbb8ad038,0xba8ca405,0x38f21dd7,0x3b915cac,0x3b7b2252,0x3a774317,0xba7d52cb,0xba44b648,0x3b912a4d,0x3bb34b2d,0x3be763e4,0x3c120e36, +0x3c17c7fc,0x3bdc3c3e,0x3b57f582,0xbb478fbc,0xbbf94961,0xbc02f9e2,0xbb7bc081,0x3b94728f,0x3c5675d8,0x3c0517df,0x3ba16fbb,0x3b8b2e60,0xbb8797e2,0xbbd93a45,0xbbd8f21b,0xbc0c5741,0x3c055d69,0x3c070d0a,0x3c124968,0x3ab51e9f,0xbc343729,0xbc4078ba,0xbbe46d59,0xba042941,0x3b38b0d4, +0x3ac41ff3,0xbb1c5fb1,0xbb8bbb83,0xbb3f8441,0x3a782145,0xba89de96,0xbab35be3,0xbb08a485,0x39da046a,0x3a521a18,0xbaa97d2f,0xba53fdc0,0xbaf4a3e6,0xbab1187a,0xbadab93f,0x3b0c0fb5,0x3c23ff8c,0x3bfe0b58,0x3ac57f6f,0xbbf60cf9,0xbb85f3d4,0x3adc1712,0x3bd1c1b4,0x3c69dab4,0x3c34baeb, +0xbb282886,0x3b2df375,0xbca0e9bd,0xbd1be383,0xbc6d760f,0xbb8abafe,0xbbcd4c3c,0x3b870346,0x3b4579eb,0xbb7433fe,0xbb6ca143,0xbb09982a,0x3a6867e5,0x3adf0ef0,0x395b29a8,0xbb1a0811,0xbaea05d1,0xba04e4be,0x3af448e5,0x3a44c5da,0xb89c69a9,0xba6067a9,0x3ae61a4f,0x3b2aa9b4,0x3b0d8a93, +0x3ad17792,0xb9c77800,0xbaf0dee4,0xbb05f412,0x3a1bf4a2,0x3a997409,0x3c6dcca0,0x3c08d20d,0xbc8911be,0xbc351ceb,0xbc070c9a,0xbbcf4b04,0xbc019ab1,0x3c7e1296,0x3caf9c62,0x3c6f8e09,0x3c092307,0x3b89377c,0x3ae40111,0x3a7511fe,0x3a96c1c8,0x3a14414a,0x39f64231,0xba879d07,0xba5913a2, +0xb9ab40b0,0x39d9d33b,0x39cd04bf,0xba09fd7e,0xbb06b0c1,0xbb5f9889,0xbb81b025,0xbb818565,0xbb4fd15a,0xbb0e9d69,0xba2bfd12,0x3aed51e9,0x3b7da6e8,0x3bc52fed,0x3b9d39f8,0x3b0bf084,0xbb4045b6,0xbb9ce0d5,0xbb70893d,0xbb044178,0xb9de0dd5,0xb8b50ec7,0x3b2ccb70,0x3be5148b,0xbc3d89dc, +0xbc0b8432,0xbbd81cbe,0xbb222beb,0x38e5c5c9,0x390bbb26,0x3a315f07,0x3b2faa7d,0x3b19e4ed,0x3af44e49,0x3a331050,0x39399e87,0x37e5c83d,0x3a4a820c,0xbb1f940a,0xbb88070a,0xbbabe22f,0xbbab091f,0xbb9a0d74,0xbb8ca9e4,0xbb23cf99,0xba445333,0x39a83427,0x3b0b6bc4,0x3b8ac682,0x3bec92af, +0x3bfd3e98,0x3c0fa509,0x3c20e2d0,0x3c155ff6,0x3bfd20f9,0x3ba49577,0x3b8c82e0,0x3a1d27df,0xbbbac390,0xbc23cca2,0x3c0e1b82,0x3bf8259b,0x3bfa0053,0x3bf37a50,0x3bee329a,0x3be9f0d9,0x3bd21515,0x3bbb8d39,0x3bbd54dc,0x3ba9cbcb,0x3b7c0f38,0x3b07449f,0xb99febae,0xbb383cef,0xbb5531c8, +0xbb445992,0xbb094d9b,0xbb161a30,0xbb17cee0,0xbb1f8d6e,0xbacde527,0xba928c17,0xba5690cd,0xb72a5032,0xb9189ab8,0xba834f9c,0xba516c39,0xb9972332,0x398165cf,0x3a9d2d36,0x3b2ea410,0x3b85a1f8,0x3ba33057,0x3bc7e449,0x3c006f30,0x3c09a676,0xbb4c920a,0xbb91fba7,0xbb962838,0xbb9ad43b, +0xbbb0eefd,0xbb8f5705,0xbb48460f,0xbb06bdc9,0xbb262ebe,0xbb322a5b,0xbb4dff54,0xbb5a68bb,0xbb7c163c,0xbb8df242,0xbb86f474,0xbb8b3c36,0xbb91c24f,0xbb876e27,0xbb76fc4a,0xbb6156d2,0xbb37e9b6,0xbb105a8a,0xbac967cc,0xbab4fcac,0xba888173,0xba119fc7,0xba4e04f8,0xba876fd1,0xbaaa149b, +0xba960b24,0xba841a85,0xb9cca0a5,0x3853c2d4,0x39b0f89c,0x397de14c,0xbade049e,0xbb571cef,0xbb813eb9,0xbb819e80,0xbb91c6bb,0xbb9bb505,0xbba6befb,0xbbba51f9,0xbbc95e92,0xbbbdfd98,0xbbaf061c,0xbba1fea3,0xbb969aad,0xbb8ac001,0xbb7f204c,0xbb6ed17c,0xbb5f47b0,0xbb4dfa0b,0xbb3e6b96, +0xbb2a6892,0xbb34b58d,0xbb21fd25,0xbb0ee20f,0xbaf2612a,0xbab74270,0xba7c60f1,0xb9f2bc11,0xba000ba7,0xb9b87ecf,0xb986e6cd,0xb91d31e3,0xb90c71b4,0xb97bc742,0xba9dbb92,0xbb088635,0xbb2bc953,0xbb3fb7b7,0xbb67cb6a,0xbb7e2447,0xbb759df1,0xbb7a5148,0xbb7b33b2,0xbb854444,0xbb880ebe, +0xbb908b57,0xbb859962,0xbb822bea,0xbb79c6ba,0xbb6f0850,0xbb62c68b,0xbb566db1,0xbb52fce4,0xbb4fad5a,0xbb431f86,0xbb443dcb,0xbb3f6e4a,0xbb421f05,0xbb320149,0xbb278fd3,0xbb1d9b2c,0xbb140f93,0xbb0c3547,0xbb000db5,0xbb035e50,0xbb04d1ca,0xbb075045,0xbb0ba428,0xbb0ea6f5,0xbb066c08, +0xbb1860bf,0xbb24b0d8,0xbb3afa62,0xbb526115,0xbb54a852,0x3a26f898,0x3a481ba9,0x39d0ac59,0x39bd6cca,0x39e3b301,0x3a8a7ba6,0x399435f7,0x37f0411d,0x39f78fc7,0xb9db02a9,0xba0f2f3a,0xba1fd7c1,0x38ae9d8f,0x39af5c0e,0x39363720,0x3a388f94,0x3a689b43,0x3a2c0d27,0x39b7bd80,0x394af9a7, +0x3911617f,0x3985d475,0x39dc0f93,0x3a20be2c,0x3a81864d,0x3a9db566,0x3acea697,0x3a8eb8d9,0x3a78a9f0,0x3a0997d6,0x3a8da23d,0x3a7614dc,0x39297297,0x39c8f0a8,0x3a051d0b,0x3a7e0acb,0x3a61979b,0x3b029c1f,0x3a676215,0x3a14cd8a,0x3a240f19,0x3b127707,0xb93f65f1,0xba29c4bb,0x3a507826, +0xbab346b7,0xbaee0be1,0xbad18cad,0xb98d9e67,0x39f7b572,0x39662dd9,0x3ac636b5,0x3ad46d01,0x3aa67595,0xb91de72b,0xba90c0bf,0xba96227a,0xba56f6b5,0xb86d7fa3,0x3a76a460,0x3b1cda00,0x3b54bbd1,0x3b7f379c,0x3b1b7dd2,0x3abb3f65,0x398b810d,0x3ad84b8a,0x3ad17734,0x384cb3af,0x3a2f11c6, +0x3a9952f6,0x3b254dc5,0x3b1a7960,0x3b05b633,0xb8b9b664,0xb95a0ed5,0x395de229,0x3b799ca8,0xba14b0ec,0xbaf1f7df,0x3a1fc539,0xbb77d29f,0xbb8fd9a5,0xbb83680a,0xba955c6d,0x3a485c28,0x35c99aa7,0x3b17c8ba,0x3b2f1ba6,0x3b13b2be,0xb70fa5ec,0xbac670c9,0xbb012aab,0xbaaee933,0xb9a3bf61, +0x3a6a8bfd,0x3b5b8c41,0x3b97df92,0x3bce0edf,0x3b6096fc,0x3b3b9c44,0x3a7ac8ef,0x3b6c3b73,0x3b428a35,0xba8ecbc8,0x3a01d6ee,0x3a9c9276,0x3b57fd9e,0x3b3558be,0x3bb45747,0x3aee5b41,0x3a69c62a,0x3ad75854,0x3bce9cf4,0xba974aa2,0xbb0f2848,0x3b1b9273,0xbaa5f3c3,0xbaea0a4a,0xbb4675fe, +0x3ab39e0b,0x3b518432,0x3b1092aa,0x3b9056fb,0x3b9d6e40,0x3b428b82,0xbaa58d57,0xbb999f8e,0xbbc164b3,0xbb9547ac,0xbb06fa4b,0x3ab8005f,0x3bda4dfa,0x3c29c596,0x3c459dda,0x3bd6a09d,0x3b2512c7,0xba282991,0x3b6469ad,0x3b6fe8b5,0xba7eeb15,0x3b1530fa,0x3b8d29df,0x3c006ce8,0x3be885ba, +0xbc0a1e44,0xbbaea259,0xbc04f29c,0xbbc19569,0x3a9bdc7e,0x3b3d33f2,0x3af13b40,0xbb18a930,0xbb384599,0xba1af6a1,0xb7c79d52,0x3b2c7ed8,0x3b163482,0x3b035696,0xbae5aadf,0xbaf28dba,0x3b5cbc00,0x3bb69d8c,0x3c028a9d,0x3c20c196,0x3c14bc79,0x3bc75e26,0x3b1d10b7,0xbb844c8f,0xbbfb0086, +0xbbda0a18,0xb9ecc1d9,0x3bfe769b,0x3c59ddf0,0x3c10ede2,0x3b978a46,0x3b106141,0xbb890409,0xbbb9c396,0xbba48938,0xbbf61a0f,0x3bc8762a,0x3c095186,0x3c3ab2db,0x3b98eaef,0xbc119e13,0xbc407b35,0xbc0878a1,0xbaed0007,0x3acd5518,0x3a71cc93,0xbae493da,0xbb67499a,0xbb458641,0x399510b8, +0xbabc4f57,0xba97e2de,0xbafd3556,0x3aa89e59,0x3aff5f1a,0x39d9c09c,0xb9d99dbb,0xbac8d84f,0xb9a42dab,0xb9b661b9,0x3b659d7a,0x3c328119,0x3bb3202f,0xbac57a19,0xbc1f1540,0xbb8bebdc,0x3b20751c,0x3be21208,0x3c627507,0x3c1a9923,0xbbc2128b,0xb9374f97,0xbc6a5b9b,0xbd1e096b,0xbca24c82, +0xbc14eb5a,0xbbc89789,0x3b3bc784,0x3b1e4e92,0xbacee8da,0xbb3fbdaa,0xbb06e516,0x3a24bdad,0x3aed397e,0x3a04f5af,0xbb2abfcd,0xbae5d649,0xba445f09,0x3ac2484a,0x3a8e1dfe,0x3a0a6ab3,0x38f25832,0x3ae427d2,0x3af9b7ba,0x3a9fa252,0x39757e45,0xbade4d66,0xbb239936,0xbb2e4e01,0x398ba271, +0x3b0b8a4a,0x3c3a73ad,0x3ba8e703,0xbc73a502,0xbc1a887f,0xbbcefe92,0xbba2fd14,0xbb08fbed,0x3c64570d,0x3cb62470,0x3c8e20ad,0x3c284f96,0x3b71d606,0x3b20ed57,0x3b0c0581,0x3aac468b,0x39f40854,0x3a099a3c,0xba3399c7,0xba7f027c,0xb9ee1577,0x3a43d619,0x39fbb20c,0xb8732493,0xba7fd488, +0xbb1cfa47,0xbb579ca2,0xbb538adf,0xbb1eb1fc,0xbaa9736d,0x3a3013ec,0x3b0f3977,0x3b8070e3,0x3ba8abbd,0x3b7c603c,0x3a309f1c,0xbb9bd4ee,0xbbad16b2,0xbb7a7242,0xbb21f3a1,0xbae77ef0,0xbadefbd1,0x3a4a9862,0x3ba4cfe3,0xbc1d1b63,0xbbe6c77f,0xbbd45a98,0xbb3c9d93,0xb9da4f30,0xba33925f, +0xb952fe90,0x3b1f744b,0x3ae2fde1,0x3a7e79c2,0x38106c8c,0xb9d57da4,0xb9dad508,0x39cd0c0c,0xbb0a0a98,0xbb6d91d4,0xbbb1df7a,0xbbb09181,0xbbabece4,0xbba6858d,0xbb65e370,0xbade6877,0xb8364312,0x3ae23c1f,0x3b82fe69,0x3be7cc90,0x3bf28c27,0x3c07d6ff,0x3c0facd5,0x3c07df91,0x3bd2a349, +0x3b619a2b,0x3b1ead23,0xba03ce43,0xbbaba234,0xbc081b70,0x3bf18186,0x3bee33a1,0x3bf4d7c3,0x3be3ea7f,0x3bdadacf,0x3bcddb4a,0x3bb1a8aa,0x3ba11f3f,0x3ba6d717,0x3ba323ac,0x3b867ade,0x3b40894b,0x3a3bb0ef,0xbb00b9e7,0xbb3ab537,0xbb3a1aab,0xbb096cc9,0xbaeeaa47,0xbae013d8,0xbae5f616, +0xbab4b952,0xbaa54451,0xba9c73b9,0xb94da530,0xb93542b2,0xba4ec78d,0xb7c6c333,0x3a38d3cf,0x3ab2efb3,0x3b143d45,0x3b7f4c81,0x3bb3e2a0,0x3bbf0b26,0x3bc7dbd1,0x3bde03a3,0x3be520a0,0xbb080410,0xbb55fd9b,0xbb544b24,0xbb401f65,0xbb529889,0xbb1052bd,0xba6d8311,0x38aaa242,0xba51c8f7, +0xbaaaf73e,0xbb14c47e,0xbb2cc9c8,0xbb646855,0xbb82f420,0xbb81c617,0xbb874eae,0xbb91ef50,0xbb87018f,0xbb767fd8,0xbb5aa64b,0xbb3fd894,0xbb26d8f7,0xbb0fb133,0xbae10af2,0xba91e7dc,0xb9dad327,0xba081865,0xba2050c8,0xba2c38a2,0xba57e692,0xba7742fb,0xba12d1d8,0xb97b33f1,0x39115ff1, +0x3988accf,0xba85bc8c,0xbb876289,0xbb984415,0xbb9c31d2,0xbba2aeea,0xbbae1f1b,0xbbb6356e,0xbbc42439,0xbbcfb1ab,0xbbc19b80,0xbbb21efe,0xbba49478,0xbb959bca,0xbb890fb2,0xbb7ccf26,0xbb746228,0xbb679c70,0xbb5bdfd6,0xbb4fe839,0xbb45ec8f,0xbb4a785e,0xbb3c331e,0xbb2ca962,0xbb1c3ed1, +0xbb063cda,0xbae8d7df,0xbab716bd,0xbacc71c3,0xbacbff62,0xbacc7918,0xbabf7619,0xbab63120,0xbabfac4e,0xbb0ec3da,0xbb41c1dc,0xbb66a9c6,0xbb7cfc77,0xbb6751e3,0xbb78db4d,0xbb76daa6,0xbb7cdc3d,0xbb7fc76c,0xbb7e8c0b,0xbb82e00e,0xbb8d210a,0xbb837ca4,0xbb80422b,0xbb75d399,0xbb6e538f, +0xbb63160f,0xbb55ed2f,0xbb525b4b,0xbb4f38ee,0xbb4d50d6,0xbb4cdf78,0xbb49a10f,0xbb4afcd0,0xbb3c35b4,0xbb314dc2,0xbb26d12a,0xbb1e2892,0xbb16598c,0xbb0ac965,0xbb0ec4f3,0xbb1110dc,0xbb15e13e,0xbb1d0a21,0xbb24ad2e,0xbb23e497,0xbb30df01,0xbb379aa3,0xbb44c4dd,0xbb552168,0xbb4aef20, +0x3a4fd573,0x3a6def6d,0x3a0ce1e0,0x39f9e310,0x3a0aec2f,0x3a9ff2ce,0x39c2713e,0x39196f3a,0x3a182dc2,0xb9b0e614,0xb9fec3d4,0xba0111d3,0x390b31b1,0x39cbdbe4,0x3996b9bd,0x3a527445,0x3a81cfaf,0x3a7093f0,0x3a0e418c,0x39cd920f,0x399c9a85,0x39ebbd71,0x3a282c36,0x3a74abee,0x3aa0e21d, +0x3ab6dcf6,0x3ad65196,0x3aa14c04,0x3a906287,0x3a3e9c6f,0x3a9d7d60,0x3a8bf47b,0x39c107f7,0x3a22e83b,0x3a478f52,0x3a9f8307,0x3a8892f4,0x3b00a613,0x3a6b10d5,0x39e70d26,0x3a05df59,0x3b177179,0xb9897efe,0xba52c23f,0x3a226fa3,0xbad1afb4,0xbb044945,0xbacfed6e,0xb9ea0042,0x39aafa80, +0x398cdeb5,0x3aca86ac,0x3ae899d7,0x3adc9af1,0x396b5005,0xba36fec9,0xba4c62fe,0xb9c95bf4,0x3a0185f6,0x3adee334,0x3b406e66,0x3b691153,0x3b73a1b4,0x3b189076,0x3abd4365,0x3a0203e8,0x3ae77de5,0x3ae91d5d,0x39e206de,0x3a951baa,0x3ad3572b,0x3b39cc2b,0x3b20b581,0x3b0c4814,0xb61c2659, +0xb9d96b5f,0xb8d93250,0x3b78ded0,0xba6869b0,0xbb0959ff,0x39c0b490,0xbb8c5dd4,0xbba2700a,0xbb8ba45a,0xbae6dafd,0x3935a0ec,0xb9719bdd,0x3b0e2398,0x3b27e405,0x3b31bf7a,0x39b8db15,0xba8f2d9b,0xbad0cd89,0xba528bc5,0x39bdc60c,0x3b057441,0x3b86e1d2,0x3ba7055e,0x3bc1c3a4,0x3b667d74, +0x3b445b9c,0x3ac02e34,0x3b6a5a14,0x3b42994b,0xba0b5309,0x3a9bcd64,0x3b01edcc,0x3b7f1b9a,0x3b4a3c72,0x3ba4bf95,0x3ac51aae,0x3836b199,0x3a57fabd,0x3bd1169a,0xbb01b7c0,0xbb62fc04,0x3a90bb45,0xbb49852b,0xbb78201b,0xbb95048f,0x39cce143,0x3b24d147,0x3b052e7b,0x3b8e25c1,0x3ba74f04, +0x3b8ec00e,0xb9d03bfb,0xbb7bc33f,0xbba4cc9e,0xbb5bb9c5,0xb9e85fcb,0x3b70f6ee,0x3c06b7b7,0x3c33eab2,0x3c31fd0c,0x3bb97d47,0x3b050bc9,0xb8dbe687,0x3b6252b2,0x3b7ab2f6,0x39506bce,0x3b6492a3,0x3bace430,0x3c090047,0x3be49c3d,0xbbeb81ff,0xbb933a02,0xbbfd44a1,0xbbc688b6,0x39506c0d, +0x3b3a72f0,0x3b3aca47,0xb81b7b70,0xbabc7e5e,0xb9dbabc5,0xb9e964e6,0x3a5ad3a0,0x3a7ab594,0x3b395fda,0xbb267be9,0xbb4863b5,0x3aef093f,0x3b9d587a,0x3bfc9d33,0x3c1b4a76,0x3bfec16e,0x3b9827d0,0x3a606246,0xbb9dd859,0xbbeb1571,0xbbb2839e,0x3b58dd69,0x3c3533a2,0x3c54353f,0x3c15cafa, +0x3b80e304,0xb980f1b4,0xbb8f5dff,0xbba10a5e,0xbb7cf51d,0xbbc5614d,0x3b73f410,0x3bfd99ea,0x3c56f989,0x3bf24e18,0xbbd64c9e,0xbc3cd660,0xbc1bbde7,0xbb504d92,0x3988edbb,0x39ca5dc6,0xbaa341ee,0xbb2f8032,0xbb3fe5e9,0xb9e2593e,0xbac5cd22,0xba229dc5,0xbabb9667,0x3b03f291,0x3b3795d0, +0x3afda3a8,0xb8cefcb4,0xba87ac40,0x3a59d7cc,0x3aa33d05,0x3b9c8d2e,0x3c29cd65,0x3b44e412,0xbb8ac48a,0xbc3e8716,0xbb8e8230,0x3b4bfce2,0x3be80eb1,0x3c48d111,0x3be9cd81,0xbc0f45f2,0xbb2ecb8c,0xbc161bdc,0xbd16fea2,0xbccc6643,0xbc6c62d8,0xbb964227,0x3a619db0,0x3a6397cd,0x39a029b5, +0xbb08ba74,0xbae8355a,0x39ce0f2d,0x3ad464d5,0x3a1c84bc,0xbb3402bb,0xbadbfa36,0xba8c00e9,0x3a5f6fa7,0x3ab1a035,0x3aa4ee23,0x3aa25f95,0x3aed0e7e,0x3a9fc940,0x3935184f,0xba9e9e0c,0xbb41733c,0xbb4c8905,0xbb5351b4,0x3987ebbb,0x3b8933b6,0x3bf70b1f,0x3a93ba53,0xbc4c3f1c,0xbbda02b9, +0xbb66a3d1,0xbb79dcca,0x3b2b1630,0x3c2cb8a7,0x3ca3e822,0x3c9aaf24,0x3c470065,0x3b801ca9,0x3b5a4c35,0x3b618f79,0x3adcb0fb,0x398d87db,0x39a90dd7,0xb9f48c50,0xba874e94,0xba04c155,0x3a52618f,0x3a06397d,0x39e21359,0x392b6981,0xbaa5f319,0xbb1ef9ba,0xbb18425f,0xbad758bc,0xb9dd8e76, +0x3afd32f5,0x3b1f98e4,0x3b750a84,0x3b87adc5,0x3b403777,0xb9e10bbd,0xbbb26c99,0xbba441be,0xbb5db873,0xbb1c1692,0xbb3a3a04,0xbb354a79,0x3808ab89,0x3b3e2114,0xbbda1600,0xbbad0fde,0xbbc761af,0xbb5917ad,0xba8dffc7,0xba9d9aae,0xba49864e,0x3b0d959a,0x3a892022,0xb79be78a,0xba3bff2d, +0xba62ca58,0xba4723c6,0xb90c7752,0xbae0f139,0xbb480f70,0xbbb3b034,0xbbb2af1a,0xbbb70f10,0xbbb35d99,0xbb8e0eca,0xbb2aa2cc,0xb9f9bbc3,0x3aac9c5a,0x3b6ee852,0x3bcfc96e,0x3be07aa4,0x3bff15fa,0x3c00cf97,0x3bf36c53,0x3baa23d3,0x3b149ba3,0x3a876056,0xba882744,0xbb88d9f6,0xbbbf2af4, +0x3bae853d,0x3bc3d059,0x3bd280b1,0x3bbca819,0x3bb29ad5,0x3ba0b88c,0x3b857413,0x3b7636e2,0x3b82bd5d,0x3b8db22d,0x3b818b14,0x3b630890,0x3acfadc2,0xba883179,0xbb17d7a5,0xbb2cb737,0xbb118cdd,0xbad6b3b7,0xbab4cdeb,0xbaa2597d,0xba9b89ab,0xbaa2af1c,0xbab3a450,0xb91aa378,0x393ef1a5, +0xb7223fd0,0x3a9ffb20,0x3b04314b,0x3b3166b2,0x3b703b83,0x3bb0479b,0x3be5ed17,0x3bd71357,0x3bc3efc1,0x3bbc4a5d,0x3bac0791,0xba1ed104,0xbad11184,0xbac418d4,0xba53f96e,0xba39e15e,0x3973c576,0x3ab9078d,0x3b1b7c27,0x3a96dd96,0x39bc6b2f,0xba890d36,0xbada46f5,0xbb3caf6f,0xbb65e71b, +0xbb6beba4,0xbb78d5ba,0xbb8a9079,0xbb7f8968,0xbb6a8467,0xbb4de063,0xbb3f98d6,0xbb322832,0xbb2c2e3c,0xbafa9650,0xba94441e,0xb999f73e,0xb9486d21,0x362adbf3,0x39928345,0xb925687e,0xba0b9acc,0xb9e0e075,0xb9a0cfeb,0x3853c716,0x39b8226f,0xb8e32d6c,0xbb9527ce,0xbb9ea54a,0xbba77657, +0xbba38543,0xbbb09c3e,0xbbb51f06,0xbbbd64e2,0xbbc69f00,0xbbb82ab3,0xbbaaf456,0xbb9f0817,0xbb8f3e54,0xbb83c312,0xbb7745f9,0xbb721a2e,0xbb684185,0xbb616403,0xbb58ac32,0xbb541fc8,0xbb57e624,0xbb4c4e8b,0xbb3f1f24,0xbb32702a,0xbb22e554,0xbb19e896,0xbb08d0b8,0xbb1c65d3,0xbb277c55, +0xbb2fd32e,0xbb2ce24d,0xbb2617b5,0xbb297290,0xbb4178c9,0xbb65815f,0xbb836a7e,0xbb8f0c0b,0xbb5dd866,0xbb6885ff,0xbb6b68eb,0xbb713a9a,0xbb74fd34,0xbb67a71a,0xbb6d7102,0xbb812f1f,0xbb749c94,0xbb6fd3e0,0xbb66dd22,0xbb636fd5,0xbb5a55c3,0xbb4eab37,0xbb4cd892,0xbb4c0c98,0xbb4ba07f, +0xbb4c5a38,0xbb4be0e9,0xbb4f467c,0xbb414117,0xbb36cdfe,0xbb2c87bb,0xbb24fdd4,0xbb1d79c1,0xbb1259a9,0xbb17c05a,0xbb1ad4b9,0xbb21af3e,0xbb2a9943,0xbb35e0ca,0xbb3c9d4b,0xbb444a99,0xbb464c6d,0xbb49c58b,0xbb512421,0xbb451e27,0x3a7016b6,0x3a85e9c6,0x3a306eac,0x3a1b9901,0x3a206e7d, +0x3aa9811f,0x39e9ad27,0x397f3a70,0x3a28a17d,0xb988312a,0xb9da0362,0xb9b0a0f9,0x39286193,0x39d0ef1a,0x39b5c2ad,0x3a5e13cd,0x3a88a6b7,0x3a8c4fc2,0x3a341844,0x3a11a1d0,0x39de00b0,0x3a1de594,0x3a563b7f,0x3a9d18a5,0x3ab95c75,0x3ac895e0,0x3ad45f4b,0x3aac8d8f,0x3a9e78be,0x3a73feb2, +0x3aa504da,0x3a94ac11,0x3a12d780,0x3a58fc87,0x3a809823,0x3abc5824,0x3a9b9c01,0x3afa92c5,0x3a72910e,0x39ca34c7,0x39ef732b,0x3b0fe89d,0xb9a63b84,0xba6ca672,0x39d040aa,0xbae6c9e9,0xbb0adbde,0xbabf7d19,0xba200903,0x391769a0,0x3977d1d7,0x3ac60954,0x3af1cd5d,0x3af94cba,0x3a1c3d0c, +0xb988e5d0,0xb9dc8346,0x37e4dbdc,0x3a809769,0x3b1ac9b5,0x3b5d6df3,0x3b76df2a,0x3b614f7f,0x3b14f265,0x3ac20b93,0x3a56b151,0x3aea1bb7,0x3aef10c4,0x3a4a43a2,0x3ac96605,0x3b036341,0x3b4b6adc,0x3b2378a7,0x3b130615,0x39182f92,0xb9df4d85,0xb984dc48,0x3b659be9,0xba901c87,0xbb1109a1, +0x38946aea,0xbb978629,0xbbae9bc6,0xbb87f47b,0xbb174c98,0xb9ef4480,0xba169532,0x3afb22cc,0x3b190920,0x3b365999,0x3a300ad5,0xba2dec85,0xbaa69d95,0xb9bdf0d0,0x3a6e7e99,0x3b463806,0x3b9a3d05,0x3baff8b0,0x3bae40b9,0x3b68a3a7,0x3b49e041,0x3b082db7,0x3b5a64c2,0x3b33dbe5,0x3852dbb3, +0x3aec17d4,0x3b307fdf,0x3b928ac8,0x3b5b9361,0x3b9442ba,0x3aa5d232,0xba06f442,0x393271e3,0x3bc1bfb4,0xbb2ec8a6,0xbb93b32f,0xb8b4a64f,0xbb99f839,0xbbb4838c,0xbbad9744,0xba3ce499,0x3ace0ce0,0x3ae6b540,0x3b84d2e9,0x3ba7ae09,0x3ba9a0d7,0x3a1089e3,0xbb2eb09d,0xbb80cb71,0xbb09345b, +0x3a8e9390,0x3bbc9f7d,0x3c1b86ea,0x3c38e35f,0x3c1bdaf1,0x3ba48794,0x3af31d79,0x3a51d81f,0x3b54e1a0,0x3b701cf7,0x3aa76b0d,0x3b938538,0x3bc9b071,0x3c10d730,0x3bdda59f,0xbba978d9,0xbb5fc1e5,0xbbd9a157,0xbbb49453,0xb9d3fa53,0x3b451fdd,0x3b80afcb,0x3b1ace91,0xb95b2f13,0xba0ebcbb, +0xba858625,0xba3718ea,0xb88193d3,0x3b606988,0xbb53381a,0xbb8ac9fa,0xb6ba9be2,0x3b4b2510,0x3bc9af68,0x3bfd5853,0x3bb30445,0x3b2bf127,0xba8ac32e,0xbbb38ba7,0xbbd71e9d,0xbb9bdf11,0x3bcd1bee,0x3c59c7a0,0x3c40c2bc,0x3c1082b2,0x3b46f8a3,0xbb2a04c1,0xbb931ed9,0xbb8b7e79,0xbb4eda35, +0xbb869749,0x3ac32506,0x3bd3ed10,0x3c611365,0x3c154238,0xbb8ab770,0xbc37da4a,0xbc2ceed3,0xbb9665e4,0xba5c70d1,0x38b200c0,0xba6c3861,0xbaf3e52b,0xbb328d7f,0xba9ab64a,0xbaabf552,0x38f09090,0xba3d0148,0x3b293693,0x3b5c1555,0x3b523d4f,0x39ab6916,0xb9a4f55d,0x3b00b59b,0x3b5077db, +0x3bc4f6d7,0x3c0f75dd,0x3a035fc3,0xbbd78071,0xbc52f4d4,0xbb88fa52,0x3b6e179f,0x3bdd1dbf,0x3c2086df,0x3b8a94c4,0xbc3183a6,0xbb95ad50,0xbbbee090,0xbd0ab9d8,0xbcea75b3,0xbc98e22c,0xbafd293a,0xba9d1bba,0xba9654bd,0x3ac821a2,0xbaaf2baa,0xbab27ef5,0x397a82ba,0x3aa13ec4,0x3a0506f8, +0xbb32060f,0xbad83ee1,0xbac0f7c9,0x382bfb45,0x3ab4b3a3,0x3aecd0d9,0x3b0646a3,0x3ae262d8,0x39ff4369,0xba8b47f3,0xbb2f3355,0xbb84b340,0xbb6bc404,0xbb68d943,0x3a375a6e,0x3be3c1b5,0x3b7304fe,0xbb4c68ea,0xbc286b06,0xbb7f10e0,0xb9e4362c,0xbafe5a9a,0x3ba67318,0x3bcc3780,0x3c78f92f, +0x3c9a607f,0x3c5f1358,0x3ba34b77,0x3b83f43e,0x3b8fda24,0x3b193c52,0x39227690,0x38a40581,0xb99f294c,0xba8043e4,0xba028629,0x3a10b6f2,0x3a006270,0x3a6c4049,0x3a9efb20,0xb9101e44,0xbab8e3dd,0xbab7acb4,0xba6406af,0x39db3c49,0x3b432ce5,0x3b315f04,0x3b60b4f9,0x3b4c4291,0x3b0bc406, +0xba956719,0xbbb14671,0xbb893844,0xbb257608,0xbaf8c005,0xbb6852f0,0xbb4dd659,0x3a68a678,0x3a87fb26,0xbb618b20,0xbb5e67bd,0xbbb1c866,0xbb728d4f,0xbaf2af88,0xbaba1a08,0xba7b7b21,0x3af124a6,0x39e6be7d,0xba5d0d2f,0xbab9bf8b,0xba9d7019,0xba80baff,0xba22be04,0xbaa9d803,0xbb231372, +0xbbae51e3,0xbbb10855,0xbbbc02c6,0xbbb41a18,0xbb9e6da9,0xbb5b07eb,0xba85583f,0x3a7efe4f,0x3b57bc3a,0x3bb248a3,0x3bccf47c,0x3beec3b8,0x3becf828,0x3bd68506,0x3b84e188,0x3ad0d5ea,0x3944c98a,0xbaa3a838,0xbb460486,0xbb57f9ed,0x3b38abea,0x3b81f1d7,0x3b997f1f,0x3b889580,0x3b81e558, +0x3b5d7cb6,0x3b30ccb3,0x3b23d749,0x3b350520,0x3b5f1304,0x3b62957e,0x3b6bd487,0x3b0f8227,0xb9209f7c,0xbadf07b5,0xbb1a2d3d,0xbb1b8a26,0xbae1a4cf,0xbab4ffbc,0xba862e3c,0xba875bbd,0xba88c884,0xbaa687e0,0x3923195c,0x3a640b36,0x3aa11d30,0x3b36f0c9,0x3b6b29a2,0x3b8b67df,0x3ba9e6a9, +0x3bdfc21b,0x3c090e61,0x3bebc255,0x3bbedde7,0x3b96b3cf,0x3b569f26,0x3aa3db6f,0x39eb27bb,0x39f803d2,0x3aaebd1f,0x3add98b7,0x3b24d6fa,0x3b6419a8,0x3b8fdc72,0x3b44531f,0x3b063111,0x39e6f2a6,0xb9f05c6d,0xbb047db4,0xbb378922,0xbb479716,0xbb576612,0xbb7ce79d,0xbb67ff45,0xbb569d8e, +0xbb3c6692,0xbb36de4f,0xbb32a390,0xbb37f97a,0xbb026fca,0xba9aa816,0xb9b87427,0x3883e89c,0x3a2a68bd,0x3aaf3ae5,0x3a503f50,0x3994ab23,0x393f1399,0x3905875b,0x39e62b28,0x3a728cc7,0x3a9dbeb5,0xbb926106,0xbb93b76e,0xbba08bb5,0xbb923b5e,0xbba020d1,0xbba129da,0xbba40cdc,0xbbabaa39, +0xbba0b4f9,0xbb996e6b,0xbb92938a,0xbb858f94,0xbb7b7592,0xbb75a532,0xbb6fd370,0xbb671fe0,0xbb633c72,0xbb5c36da,0xbb5cb168,0xbb5d14eb,0xbb51ce7c,0xbb459cb8,0xbb3aa06a,0xbb30384f,0xbb2c3799,0xbb211fb5,0xbb3ab74f,0xbb506eb3,0xbb5fcff4,0xbb623c07,0xbb5b0797,0xbb5dc3d7,0xbb5e46e3, +0xbb6fbbe7,0xbb8474e9,0xbb8f560a,0xbb4efdce,0xbb51e8d9,0xbb5ad2b6,0xbb60ae21,0xbb640464,0xbb4d7468,0xbb51c11c,0xbb63bc59,0xbb5e93d6,0xbb5d1069,0xbb5812c8,0xbb59efc7,0xbb5493a5,0xbb4d7d73,0xbb4cf54f,0xbb4cecc3,0xbb4af342,0xbb4cf6a6,0xbb4d6bc7,0xbb4f897f,0xbb43f64c,0xbb3b02b2, +0xbb31f598,0xbb2b9a72,0xbb24e410,0xbb1a9624,0xbb2129bd,0xbb244b83,0xbb2bf456,0xbb347ccf,0xbb40c737,0xbb4c57f6,0xbb4f5510,0xbb4e34ac,0xbb49ee7f,0xbb488c91,0xbb46a730,0x3a783936,0x3a8af3a6,0x3a438d4c,0x3a322a6c,0x3a330b51,0x3aab0ae3,0x39f6e435,0x39a5c573,0x3a2e2f7b,0xb92cc2c6, +0xb9a6799c,0xb9261760,0x39503966,0x39d6032f,0x39ca2c21,0x3a5dc85e,0x3a84fc4a,0x3a97c51a,0x3a4cdab1,0x3a2ad875,0x39f1fc6d,0x3a2ec639,0x3a697445,0x3aae9a8a,0x3ac279f3,0x3acb3deb,0x3ac30195,0x3aaa8529,0x3aa005b3,0x3a8a7bf6,0x3a9d6150,0x3a8e0258,0x3a2badbb,0x3a765b6c,0x3a90e6b3, +0x3acbd11c,0x3aa28afc,0x3aea1300,0x3a73159e,0x39da88a7,0x39d2384d,0x3af3063f,0xb9bb21ba,0xba7c3371,0x388b84da,0xbaf62935,0xbb0cd92e,0xbaacc20d,0xba49a00d,0xb8a5ed59,0x38ad04f0,0x3ab85f53,0x3aee004d,0x3af93302,0x3a6b7255,0x393dde19,0xb8e2b5be,0x39c09207,0x3aaf283d,0x3b37a53c, +0x3b6cec68,0x3b784632,0x3b45958d,0x3b0d5da4,0x3ac27398,0x3a93625b,0x3ad9faa4,0x3addaf0c,0x3a7d1027,0x3aeb2bd7,0x3b151ec0,0x3b543ddb,0x3b1ef408,0x3b148e5b,0x39c3f4ee,0xb98a4d14,0xb98a6177,0x3b3fb2c4,0xba9a9744,0xbb0fb003,0xb9d09bdf,0xbb9d6f9a,0xbbb5ae67,0xbb7ff669,0xbb372d32, +0xba880c5f,0xba8aa875,0x3ad397ab,0x3b046caa,0x3b22a25c,0x3a6c643a,0xb9933848,0xba83e0d9,0xb84e86ca,0x3aa642e9,0x3b710ce4,0x3ba3a24e,0x3bafa1cb,0x3b92c825,0x3b63662a,0x3b48c95f,0x3b2b2feb,0x3b39e9cc,0x3b13ab61,0x39ed566d,0x3b13d041,0x3b53817b,0x3b9fcd3d,0x3b63b755,0x3b7dad7c, +0x3a9468a7,0xba4766d0,0xb9b4ce84,0x3b9ebb95,0xbb4e6a3f,0xbbac3e39,0xbaaad4a8,0xbbc76501,0xbbe277a3,0xbbb06b5b,0xbaf24b67,0x39e8d097,0x3aa5f3b8,0x3b6c8fe8,0x3b9f4d16,0x3bb01e6d,0x3abd2350,0xbaa87ce6,0xbb2d2691,0xba58c02c,0x3b1d787e,0x3bf0d3f2,0x3c281aa6,0x3c364e30,0x3c02b9f5, +0x3b957804,0x3afe1ebb,0x3af27bdd,0x3b3a18ee,0x3b4f36f9,0x3b0467f6,0x3baad9c8,0x3bdf6074,0x3c154ae0,0x3bcff997,0xbb230b71,0xbb0a0b8d,0xbb9b194c,0xbb86cd8b,0xba0bc0f4,0x3b60291d,0x3ba52a4e,0x3b99aead,0x3a649397,0xba53789d,0xbac91c67,0xbae862be,0xba435d7e,0x3b79a51c,0xbb729d61, +0xbbaadf3b,0xbafa8190,0x3a43eea1,0x3b672b0a,0x3b97c697,0x3b1da833,0x39579306,0xbb53d3f8,0xbbc9cd8b,0xbbc82e6b,0xbb946bb6,0x3c016135,0x3c6489bf,0x3c20e109,0x3bfec8a0,0x3afc557c,0xbb964797,0xbb92003b,0xbb6d78ba,0xbb38060a,0xbaf369df,0xb9e24f72,0x3b9d413b,0x3c58b54e,0x3c20ae54, +0xbb0a77f8,0xbc331ce4,0xbc3e1b28,0xbbc059d0,0xbacd3b2b,0x38d4b7c3,0xba278a5e,0xba9510a0,0xbb20e59e,0xbafa13b4,0xba7669f8,0x3a688ad6,0x38c63aa1,0x3b403519,0x3b716b2e,0x3b8c3910,0x3a81ee0e,0x3a32713c,0x3b48972e,0x3ba9701c,0x3be2b3c7,0x3bd0a90f,0xbaf2a0a1,0xbc08d5f9,0xbc58a6eb, +0xbb6b6cf7,0x3b854782,0x3bc69b67,0x3be02af0,0x3a89332d,0xbc426e98,0xbbbfb578,0xbb988c1e,0xbcf56b45,0xbcf6858a,0xbcab705e,0x3a24e4a9,0xbb39ad3b,0xbb46404f,0x3af09835,0xba5b13c8,0xba71743c,0x38e59c68,0x3a4d4f23,0x39ac1b09,0xbb24290e,0xbadf74b2,0xbafd88ff,0xba5a89bf,0x3a8a526c, +0x3afb58ad,0x3b08b4b5,0x3aa53834,0xb9a918f4,0xbb1c8a8f,0xbb8336ae,0xbba13476,0xbb849f41,0xbb6cfd50,0x3aae0742,0x3c1c533a,0x383213cc,0xbbe99d49,0xbc0e1fe6,0xbb12013f,0x3b088df5,0x3a88bad6,0x3ba6ba7b,0x3b1db7a9,0x3c125dde,0x3c8c4ddd,0x3c6a13ae,0x3bd7c0e6,0x3b8d239e,0x3b9a1c2d, +0x3b4cf6b7,0x3978728f,0xb7a049ba,0xb8dbf446,0xba50d67b,0xb9fe2270,0x38a1a4b6,0x39e1060f,0x3aaa6521,0x3b06ce9e,0x3a6789ca,0xb9b56808,0xba134a75,0xb8965cdc,0x3a9f4029,0x3b74e24b,0x3b47ed90,0x3b45ebb1,0x3b02bbf4,0x3ab76aad,0xbac13632,0xbb97b41e,0xbb4e03df,0xbada8d26,0xbac0e9fa, +0xbb552fdf,0xbb18341b,0x3b378f00,0x38f154ff,0xba0a187f,0xbacab0c2,0xbb915c5a,0xbb8066ba,0xbb2554bb,0xbab51b4d,0xba596028,0x3abaf715,0xb81a6633,0xbaae67a5,0xbaf4f2cd,0xbabae728,0xba8e7fd4,0xba6fb037,0xba64b264,0xbaff5139,0xbb9ebcc8,0xbbaa8cea,0xbbba2cc2,0xbbad4c61,0xbba3c331, +0xbb78a529,0xbac80e52,0x3a2a1107,0x3b3f4786,0x3b99c1e8,0x3bbc0688,0x3bdc61d9,0x3bd86cef,0x3bb62072,0x3b44474f,0x3a885f23,0xb9d4dfde,0xbabdc9bf,0xbb1192c0,0xba93eab6,0x39235d4d,0x3acfd3ba,0x3b278dac,0x3b1fb0c7,0x3b24c811,0x3b03233c,0x3ac85381,0x3ab4446c,0x3adacce7,0x3b1d168b, +0x3b2f3137,0x3b5ca575,0x3b22d560,0x3a1e7c2d,0xba89931f,0xbb00b158,0xbb205a4f,0xbb007bd4,0xbad662b4,0xba92fc12,0xba76c78c,0xba3a18d3,0xba72454d,0x3a40577d,0x3aeee066,0x3b2c0660,0x3b90db11,0x3bacdd96,0x3bc41d51,0x3bda19dc,0x3c02043b,0x3c14f7c9,0x3bf72204,0x3bb6d598,0x3b564d45, +0x3a9cf508,0x3b51920c,0x3b28c701,0x3b21716a,0x3b53acb4,0x3b7169af,0x3b8cfff3,0x3ba2abba,0x3bbb69d6,0x3b8f7de1,0x3b61e12b,0x3afe306c,0x3a53d33b,0xba77e28e,0xbaeedcdf,0xbb15004b,0xbb2c38c5,0xbb5f0090,0xbb4ade48,0xbb3cf365,0xbb2950d1,0xbb29dda2,0xbb2bac52,0xbb361b00,0xbb0246bc, +0xbaa4bbd6,0xba0d0a9c,0x3980b05b,0x3a9e5979,0x3b16b0a4,0x3aecd8c5,0x3aad8412,0x3a93adc2,0x3a80ff6c,0x3aa87294,0x3b01d2d8,0x3b359088,0xbb80d163,0xbb77f35d,0xbb89a890,0xbb6703d9,0xbb7ff6c5,0xbb7d1669,0xbb79bac1,0xbb8206ea,0xbb7d6a0d,0xbb8068b0,0xbb815ccb,0xbb7594c2,0xbb7202c3, +0xbb7a9c49,0xbb70d8f7,0xbb65a486,0xbb6046cc,0xbb587b1d,0xbb5d64c8,0xbb553405,0xbb493618,0xbb3dca91,0xbb33ed37,0xbb2d8956,0xbb2b8e99,0xbb2569cb,0xbb3f88b4,0xbb5a2d59,0xbb6bd8e2,0xbb72173d,0xbb6aa97d,0xbb6b0dae,0xbb5a9d38,0xbb5c3db1,0xbb6c4e7f,0xbb800011,0xbb36d654,0xbb33538e, +0xbb431ea3,0xbb4a043f,0xbb4eb04f,0xbb2eab2c,0xbb336266,0xbb413bd1,0xbb4628ee,0xbb48f262,0xbb49fbd6,0xbb519817,0xbb51b038,0xbb52772c,0xbb4f25c5,0xbb4c4e0a,0xbb4cfe3a,0xbb4c55cf,0xbb4a775f,0xbb4655dc,0xbb3f65a2,0xbb38a4e6,0xbb31ac00,0xbb2cce60,0xbb27a094,0xbb1f3fcf,0xbb2516dc, +0xbb270946,0xbb2d7ff6,0xbb32da08,0xbb3cad55,0xbb485e72,0xbb487e11,0xbb46261c,0xbb3dd7a4,0xbb35f6fb,0xbb449d03,0x3a6f02dc,0x3a87e605,0x3a4ae3aa,0x3a41b928,0x3a3d632d,0x3a9c58bf,0x39fc29fa,0x39bdd031,0x3a181ab6,0xb8e3f363,0xb98700ec,0xb890dd7a,0x393d2f7f,0x39bf6205,0x39b20636, +0x3a517295,0x3a76967b,0x3a92796f,0x3a549dd8,0x3a365a1d,0x39f12627,0x3a311067,0x3a6ae5c7,0x3ab1992f,0x3ac00f43,0x3ac3b6dd,0x3aab33de,0x3aa0edee,0x3a99f64e,0x3a93e662,0x3a8c3dce,0x3a7a9c61,0x3a2e1a7c,0x3a818114,0x3a9852ee,0x3acf3c5a,0x3a9f7a07,0x3acdc322,0x3a68f126,0x39f6a1d0, +0x39af1ef7,0x3aacd6d8,0xb9c505c3,0xba7cfd99,0xb9c14620,0xbafc63e8,0xbb089f5a,0xba9f21f3,0xba648015,0xb99afc78,0xb9333d64,0x3aa36342,0x3adf1820,0x3ae23292,0x3a90e416,0x3a122853,0x39479efd,0x3a303037,0x3ad196c3,0x3b468dee,0x3b71368e,0x3b710561,0x3b28ccda,0x3b04aba9,0x3ac1cde4, +0x3ab959ed,0x3abec928,0x3abcd810,0x3a82ccb1,0x3afe2f49,0x3b203b65,0x3b53708f,0x3b1358ad,0x3b0e1788,0x3a26b86e,0x35a33228,0xb934fc18,0x3b0af3cd,0xba90b3b6,0xbb046399,0xba89d947,0xbb9cfa88,0xbbb78891,0xbb76015f,0xbb509082,0xbac4aae9,0xbad63caa,0x3aab6824,0x3ad9b85a,0x3afae6a6, +0x3a860cb9,0x380e7df7,0xba3face9,0x3965e8ad,0x3ac5c1ad,0x3b82f938,0x3ba4d74f,0x3ba92f67,0x3b70b569,0x3b5c195b,0x3b453411,0x3b4976ce,0x3b1120c4,0x3ad50ad8,0x3a25a5e4,0x3b2b6e43,0x3b6dbf39,0x3ba5569f,0x3b609523,0x3b4342ce,0x3a773575,0xba5d3afe,0xba49d5c5,0x3b56480b,0xbb5c207d, +0xbbb89e89,0xbb29da64,0xbbebdabb,0xbc01fc00,0xbba795db,0xbb3a42a3,0xba3d5582,0x39fb864c,0x3b4b839e,0x3b908f18,0x3ba35c49,0x3b0d6e1e,0x38c72257,0xbaa2fe6c,0x39f53be3,0x3b676a4d,0x3c0978a3,0x3c2d6725,0x3c2ed332,0x3bd8f9ff,0x3b8c6b44,0x3b11ef6c,0x3b411d5f,0x3b1a1e4c,0x3b20cb42, +0x3b165397,0x3bb879eb,0x3bed8860,0x3c1423a9,0x3bba0112,0x3a32d918,0xb9dea8e7,0xbb0ddf60,0xbb026a24,0xb933584f,0x3b853330,0x3bc9c30b,0x3bdbd3cc,0x3af3d66c,0xba6b1856,0xbade2014,0xbb15709e,0xba96174d,0x3b81d52f,0xbb7f513a,0xbbbe954a,0xbb71bf2c,0xbae5e4a6,0x39bcffbd,0x3a531cfe, +0xba5e4c0f,0xbb18a03a,0xbbb562af,0xbbe039fe,0xbbbe9c9c,0xbb90c701,0x3c0aa9f6,0x3c5a4efc,0x3bf5edc7,0x3bcacaf2,0x3a52a606,0xbbbda78b,0xbb7f3a78,0xbb30fee9,0xbb2ba380,0x3a188a87,0xbb054a8a,0x3b403413,0x3c3e08d0,0x3c1c1b8b,0xb951b27e,0xbc2d76a2,0xbc4ee619,0xbbe18b47,0xbb036b65, +0x397617df,0xb9d4f1e1,0xba12ac2d,0xbb0c7ebb,0xbb22ea88,0xba0e3b01,0x3acb9727,0x3a68a93b,0x3b462081,0x3b7957a0,0x3ba948fc,0x3afe8c5f,0x3affcc8e,0x3b86db7f,0x3be26479,0x3bee2240,0x3b686d00,0xbb84833c,0xbc1d2d6e,0xbc4ea13b,0xbb209629,0x3b974cb3,0x3badb242,0x3b7523a2,0xbb0aee79, +0xbc43a599,0xbbd7b2b6,0xbb9f03c5,0xbccc7d52,0xbcec1c33,0xbcab73eb,0x3afe72df,0xbb72bda7,0xbb8a166f,0x3aa60cc0,0xba1af40c,0xba0a2748,0x38171117,0x39df7e33,0x39206c69,0xbb0b3f0a,0xbaf24409,0xbb1e3941,0xbad652b4,0x39e40a6c,0x3ac62014,0x3aa81f36,0x39e209f1,0xba978c3f,0xbb6b2dc2, +0xbba3864f,0xbbb127dd,0xbb8d62fc,0xbb4bc715,0x3b0cf34e,0x3c36d1f8,0xbb4bbc97,0xbc29ed81,0xbc01d932,0xba90aa8a,0x3b8d448a,0x3b997fb0,0x3b691ffd,0xb8ca4504,0x3b359881,0x3c675e5f,0x3c64fbe0,0x3c033d35,0x3b82ed9f,0x3b89573d,0x3b6e1fbb,0x39fd6750,0x3808de05,0x391e658f,0xba0e0f10, +0xba038248,0xb9ea4052,0x39ab8239,0x3acf7891,0x3b2dfc9a,0x3adf2f9e,0x3a292d58,0x3980f0d4,0x3a5d187a,0x3b04ac2c,0x3b8ac9dd,0x3b6359ef,0x3b2b32af,0x3a5cd923,0x3a27fe39,0xbad6de02,0xbb5d0954,0xbb1015b2,0xba8109ee,0xbaa99a24,0xbad69b33,0xb86ae73e,0x3ba814db,0x39b5f30e,0x3af5ad1c, +0x391b9753,0xbb516680,0xbb7c5020,0xbb3c93e6,0xba96a8a0,0xba09e69e,0x3a5e25ec,0xb9b4fc7b,0xbabc44f9,0xbafdad42,0xbac4d6bb,0xba8ca6ea,0xba7e0bd7,0xb9efe91b,0xbab75db8,0xbb8415f6,0xbb9dad3b,0xbbb21bcf,0xbba24651,0xbb9f217c,0xbb80c1e9,0xbaff8d41,0x39c0fe85,0x3b2995b0,0x3b864a0f, +0x3baccd3e,0x3bc6af0b,0x3bbe6b6f,0x3b91a5ef,0x3b024006,0x39a24cc0,0xba80d192,0xbae565ae,0xbaed443f,0x3a18d090,0xbb193712,0xba5f3262,0x39bf88df,0x3a50917d,0x3aa0c5ac,0x3a6a355c,0x3a2ca934,0x3a0abc4d,0x3a58e613,0x3abb9b86,0x3ae344c6,0x3b379fcf,0x3b2152f2,0x3a9e1262,0xb9d116ee, +0xbac17a52,0xbb1be195,0xbb12df5f,0xbb050bf9,0xbac2727d,0xba7942d0,0xb9b0d92e,0xb9c72c54,0x3ac7d755,0x3b3d7fda,0x3b7ec488,0x3bbf31da,0x3bde3a09,0x3bf6fbe6,0x3bff8419,0x3c0a46d3,0x3c1217b7,0x3bee52d5,0x3ba4e4d7,0x3af9cb84,0xba4d07d0,0x3b9fbabe,0x3b912cc4,0x3b8a0c1c,0x3b9a0ad8, +0x3ba7fae5,0x3bb39378,0x3bbdd2c3,0x3bce69eb,0x3ba9de4f,0x3b90b08e,0x3b51f17d,0x3b035ab8,0x39815249,0xba25a449,0xbab05421,0xbaf6daa4,0xbb3dfd8a,0xbb2b1fb2,0xbb210158,0xbb15a7aa,0xbb1a862c,0xbb212c8e,0xbb2dac78,0xbb00b036,0xbab0fa98,0xba496b0b,0x39ae5326,0x3aca9c03,0x3b3f67be, +0x3b2b5129,0x3b1875a9,0x3b0f2fa2,0x3b068456,0x3b1af7cf,0x3b54032d,0x3b8b87c7,0xbb47cb16,0xbb38f16c,0xbb543d74,0xbb20760b,0xbb33e418,0xbb2ec89a,0xbb2675d8,0xbb2a60f9,0xbb3759f5,0xbb4c0323,0xbb5e9da4,0xbb60e7cb,0xbb6a1965,0xbb802718,0xbb71c5da,0xbb620966,0xbb58019b,0xbb4ea08a, +0xbb5440e6,0xbb45867e,0xbb38d73e,0xbb2cf221,0xbb235b87,0xbb1ece43,0xbb1cc48c,0xbb1a2e11,0xbb2f6657,0xbb478abb,0xbb55a082,0xbb5bd7d7,0xbb53407a,0xbb4e9b8d,0xbb368b2d,0xbb2dc98f,0xbb35fbd3,0xbb47d0c1,0xbb13f63d,0xbb0be34e,0xbb206b6d,0xbb2850ae,0xbb2ff717,0xbb09a80b,0xbb0f6567, +0xbb184690,0xbb266a78,0xbb2e2998,0xbb35e006,0xbb430f3a,0xbb49a604,0xbb53c398,0xbb4849a9,0xbb41d56a,0xbb485a21,0xbb41ed6c,0xbb3cc5be,0xbb34d4d5,0xbb31e793,0xbb2d6503,0xbb28ae53,0xbb2566c5,0xbb21e9f4,0xbb1c0a2e,0xbb1eda83,0xbb1e5c00,0xbb21b93b,0xbb21f694,0xbb26a5e0,0xbb2e1d1c, +0xbb2d5c0b,0xbb2b506c,0xbb228be2,0xbb173516,0xbb3895b5,0x3a58e33f,0x3a7c0006,0x3a4ac054,0x3a3eda0b,0x3a33462c,0x3a7d1e37,0x39ee69b5,0x39b3ce11,0x39c672f7,0xb8f9fd6c,0xb98c1061,0xb8e10fe7,0x38b7413e,0x3986608d,0x3957db63,0x3a30f2a7,0x3a52a4f2,0x3a7bc342,0x3a431d8d,0x3a2d429f, +0x39ebabb6,0x3a297b90,0x3a5f66eb,0x3aa8afbd,0x3ab4d36e,0x3ab4fd93,0x3a914602,0x3a925aa1,0x3a8e9d89,0x3a983ee4,0x3a6bf3dd,0x3a4dce54,0x3a1ca80f,0x3a80ce75,0x3a982687,0x3ac81cd2,0x3a9433df,0x3aa8d88f,0x3a52a019,0x39ecc03e,0x39707665,0x3a2b4718,0xb9ce3eae,0xba750c67,0xba66aabb, +0xbaf724bb,0xbafc2fe7,0xba9d2d74,0xba6e291f,0xb9f818d9,0xba00f776,0x3a85f05d,0x3ac4649b,0x3ab9d3cb,0x3a9c3ec2,0x3a54bf5a,0x39f8f1b6,0x3a76e259,0x3ae8afb1,0x3b48bd7f,0x3b6c3430,0x3b6370d9,0x3b0e3f8b,0x3af5b91b,0x3abfbc89,0x3adde77e,0x3a9f2c12,0x3a929360,0x3a6377e5,0x3b01628b, +0x3b24bb5a,0x3b49b28b,0x3b01e91b,0x3b019b5d,0x3a6a5985,0x39715951,0xb875139d,0x3a9c357f,0xba729344,0xbae52cfa,0xbaf15abe,0xbb974e8e,0xbbb4f129,0xbb7a65b8,0xbb630508,0xbaf20336,0xbb127928,0x3a812dcd,0x3aa43310,0x3a9d68de,0x3a84f238,0x39837cbb,0xb9d93021,0x39f6633a,0x3ad899e2, +0x3b8346d2,0x3b9f98f9,0x3b9e7af7,0x3b44bad1,0x3b51efde,0x3b3eee63,0x3b643839,0x3ace1273,0x3a803ef6,0x3a19f110,0x3b3b7346,0x3b7e4613,0x3ba2c8c1,0x3b527b5a,0x3b01e7a4,0x3a3524f4,0xba778b2a,0xba990a2b,0x3ab6884a,0xbb58f844,0xbbb8cc4a,0xbb819534,0xbc01d843,0xbc0b3f3a,0xbb9bafdf, +0xbb6a9cb8,0xbae5fe3b,0xba119e4f,0x3b2935b9,0x3b79a680,0x3b877c84,0x3b2d8864,0x3aaab38d,0x39278e3e,0x3ae09395,0x3b914502,0x3c113426,0x3c2c65ed,0x3c240a91,0x3bb61a96,0x3b860685,0x3b2afe9c,0x3b84eb57,0x3af84f48,0x3ad65ac0,0x3b073c35,0x3bbbc6f9,0x3bf3b50b,0x3c0ca6be,0x3b9cdaae, +0x3b803cce,0x3acf28e1,0x3a2c9f88,0x39f24f68,0x3a2b2dc1,0x3b9dd34e,0x3beab40f,0x3c072dfb,0x3b3a13f8,0xba1f3a40,0xbab61101,0xbb101073,0xbaa298cc,0x3b7ed55e,0xbb75eb1e,0xbbc2f6bc,0xbbaad828,0xbb84690b,0xbb38660f,0xbb43f58a,0xbb7d4cc8,0xbb9af16f,0xbbfc9209,0xbbf42953,0xbbb8a750, +0xbb89ebbc,0x3c05f8e3,0x3c40558b,0x3ba734f3,0x3b8c8a38,0xb90daedb,0xbbc3c2f3,0xbb403f68,0xbad88a3f,0xbb1ad43c,0x3b41a858,0xbb55468b,0x3a8b9a61,0x3c154daa,0x3c09d3eb,0x3abd722a,0xbc24e78c,0xbc58bba8,0xbbf5d774,0xbb1a9c7b,0x3984ed3b,0xb9596e44,0xb92687b2,0xbaf525df,0xbb36dd2e, +0xb93bd624,0x3b01f580,0x3ac599b5,0x3b3b1e61,0x3b753841,0x3bbe9d7a,0x3b49587b,0x3b5cdb03,0x3ba5b594,0x3c05d473,0x3be6c414,0x3a56e91f,0xbbc34a63,0xbc29488c,0xbc36d662,0xba66a6f8,0x3ba85fd5,0x3b9192fc,0x3a492e67,0xbba0b9ab,0xbc38bf31,0xbbe06170,0xbbbd9c28,0xbc9ea0f4,0xbccd9e0d, +0xbc9be34b,0x3ac5f431,0xbb737b40,0xbb8e92bc,0x3893043b,0xba02ceb2,0xb94096a3,0xb89e766e,0x3973bf79,0x38e5264e,0xbad847c3,0xbb0275fc,0xbb39e769,0xbb14bba5,0xb9b1df3c,0x3a33fa80,0xb8aa7a01,0xba1b012c,0xbafec38a,0xbb946421,0xbbb620a8,0xbbb447ae,0xbb8f8155,0xbb040e4a,0x3b4934d7, +0x3c39bbc7,0xbbb4a3a3,0xbc474573,0xbbdbc8b3,0x38ba98c2,0x3bc81e6d,0x3c05b835,0x3ab88fbf,0xba27dd8c,0xbad95554,0x3c268eaf,0x3c489652,0x3c0b29c9,0x3b481948,0x3b3f1af4,0x3b674a98,0x3a3eac49,0x39089a49,0x39bb40da,0xb986d12b,0xba0d909e,0xba637c2b,0x396943d3,0x3ae24dcc,0x3b43e3bd, +0x3b1579f5,0x3ac2db91,0x3a86293c,0x3aec54ac,0x3b34a560,0x3b8f5169,0x3b78ca55,0x3b16ca4a,0xb9040779,0xb86dbb86,0xbae48844,0xbb08f678,0xbac9e626,0xba02e2fd,0xba908d8a,0x3a78a348,0x3b4deef0,0x3be50043,0x3ad9ad24,0x3b649c81,0x3ac5e9dc,0xbaed0729,0xbb5c9287,0xbb33629f,0xba4a8afa, +0xb91c0d7d,0x392f0af8,0xba062e91,0xbaa1a707,0xbad12b61,0xbab8e5b9,0xba831dc4,0xba5d85f5,0xb8a00568,0xba5e5413,0xbb421ab9,0xbb8967b7,0xbba37fd5,0xbb94db80,0xbb91cb5a,0xbb74d679,0xbb0dfa49,0x394aaaa6,0x3b16df9e,0x3b6b11e4,0x3b98cfaa,0x3ba8ba55,0x3b9e02f1,0x3b49bf9e,0x3a589a94, +0xba2fe0dd,0xbae42d80,0xbb123488,0xbad6e0d7,0x3ae2b72c,0xbb8f3f97,0xbb4a3f81,0xbada2aa8,0xba33dca6,0x38cf773e,0x3786952f,0x37d8d9d2,0xb7ee09ff,0x397503ba,0x3a19051f,0x3a4e092a,0x3b01b24d,0x3b0d6b3c,0x3ad56571,0x39366076,0xba7b2aca,0xbb0f1c33,0xbb230d3f,0xbb219d23,0xbb01c63c, +0xba91c87e,0xb8ef04a9,0x396bff41,0x3b158981,0x3b7a6987,0x3b9f8722,0x3be03c74,0x3c0067f3,0x3c0c317d,0x3c086e26,0x3c05f144,0x3bfee712,0x3bc8dc04,0x3b7f495c,0x3a0b811f,0xbb24a121,0x3bc0a312,0x3bb8ad09,0x3bb06ec0,0x3bb4fae0,0x3bbf8335,0x3bc3664b,0x3bc3167d,0x3bca9cdf,0x3bb1649a, +0x3ba1e3e7,0x3b87aa5b,0x3b47cc9d,0x3aba5296,0x3a20de71,0xb9d166f4,0xba97a3e5,0xbb1d92a8,0xbb0b54f9,0xbb052988,0xbafed468,0xbb06c3a3,0xbb12d103,0xbb214f43,0xbafc80ea,0xbabe3f7f,0xba886ae8,0x398548e3,0x3acdd7b0,0x3b48ff45,0x3b4868dd,0x3b4b123e,0x3b4fb5d6,0x3b4a6ef1,0x3b5d83d9, +0x3b8c40be,0x3bac46bf,0xbaeef1d2,0xbad09506,0xbb0b0553,0xbab11693,0xbad57ee0,0xbacf1a40,0xbabfdd95,0xbac24700,0xbafa0d6f,0xbb1ebcee,0xbb3eae33,0xbb4d0a66,0xbb5e752f,0xbb7c9007,0xbb6c64df,0xbb59ae23,0xbb4d2ae7,0xbb442c5d,0xbb48cb12,0xbb3aa45b,0xbb2d7512,0xbb200495,0xbb159f26, +0xbb113f94,0xbb0e0cd2,0xbb0d501a,0xbb184d61,0xbb27363f,0xbb2c6a86,0xbb2e71dc,0xbb2361b7,0xbb17581e,0xbafb89ad,0xbadb628a,0xbadaae21,0xbaf3aaad,0xbada2fe2,0xbabfe2ad,0xbaf1b7d0,0xbb0121af,0xbb0a4855,0xbaca589e,0xbad8f9d3,0xbae13753,0xbb050b45,0xbb1079db,0xbb1ccfe7,0xbb2de195, +0xbb3a03b0,0xbb4b2577,0xbb388573,0xbb3109e7,0xbb3a439a,0xbb3173b8,0xbb2b2caa,0xbb2406f9,0xbb23471b,0xbb21030f,0xbb1e6a95,0xbb1c8b55,0xbb1a6693,0xbb17384c,0xbb15725f,0xbb11c1c0,0xbb10d7a9,0xbb0b4928,0xbb0983d7,0xbb0a7501,0xbb091c54,0xbb075137,0xbaff5b5f,0xbae6889e,0xbb2a6c72, +0x3a37464d,0x3a5d239e,0x3a3ec1be,0x3a31cc44,0x3a2519f9,0x3a3f56ce,0x39d6fb0d,0x39a621a3,0x391fab66,0xb90085c8,0xb98e8f59,0xb958897a,0xb6881468,0x392820ad,0x389852ce,0x3a0d956a,0x3a269318,0x3a4e99cd,0x3a2b2260,0x3a1b0908,0x39d7c8b3,0x3a19037d,0x3a486d88,0x3a96295f,0x3aa2e22c, +0x3aa0f4c7,0x3a6b1b93,0x3a7f74b6,0x3a7cefd7,0x3a9543cf,0x3a39d405,0x3a1ab1bd,0x39f0d3b1,0x3a711e41,0x3a90268f,0x3ab78bc3,0x3a824cf9,0x3a803ba3,0x3a356107,0x39d0682b,0x3899eb6d,0xb72c68e2,0xb9cd982a,0xba659be5,0xbab61e18,0xbae63450,0xbadc34d9,0xbaa27fa1,0xba648d94,0xba1b1412, +0xba58586f,0x3a44cbb8,0x3aa0803a,0x3a8b7fb5,0x3a98ca12,0x3a810fbc,0x3a3d2b98,0x3a964944,0x3af49629,0x3b405ff9,0x3b601476,0x3b50d6d9,0x3ae8127e,0x3adbacb9,0x3ab79c15,0x3af87676,0x3a7da2c4,0x3a4a5e72,0x3a1da4d3,0x3af8be79,0x3b220a85,0x3b387103,0x3ada6ece,0x3ae27676,0x3a9627c7, +0x39cbcf1d,0x37bb134e,0x399ae75a,0xba32ffbd,0xbabadd78,0xbb2fb3aa,0xbb8d6cb9,0xbbae87d3,0xbb8771d0,0xbb6ec595,0xbb07f47b,0xbb361ef5,0x3a2a9f55,0x3a51569f,0x39fe5acf,0x3a6a3b0c,0x39ced1d0,0xb894e501,0x3a319ee5,0x3ae18601,0x3b77638f,0x3b96b024,0x3b91b868,0x3b1e54d8,0x3b428c64, +0x3b3405df,0x3b762d9c,0x3a838c43,0x39d8ccc4,0x39ae32a7,0x3b41fd36,0x3b81ffe1,0x3b991adf,0x3b3d7a7d,0x3a84d388,0x39fb6c0a,0xba8c39bd,0xbacd6cd9,0xba0e783a,0xbb488bab,0xbbade9a9,0xbbae22cb,0xbc056d36,0xbc0bd695,0xbb91fbb2,0xbb823811,0xbb2616d7,0xbae0a8b2,0x3b04b760,0x3b488829, +0x3b46d65f,0x3b3df213,0x3b13b129,0x3abc5778,0x3b369309,0x3ba728c4,0x3c10d959,0x3c271158,0x3c171208,0x3b969b98,0x3b77689e,0x3b3e7af5,0x3ba3e3f8,0x3ac96061,0x3a5e019b,0x3abb5463,0x3bb56069,0x3bf14ffc,0x3bffd062,0x3b79aa4b,0x3bdbd606,0x3b6e1ef2,0x3b598570,0x3b384d28,0x3aed76fc, +0x3bb62366,0x3c0147a3,0x3c1486f1,0x3b76f2c0,0x383d9f5c,0xba39d6ec,0xbad63b71,0xba8723d5,0x3b6b28ed,0xbb5397b1,0xbbb6ec22,0xbbd180f9,0xbbc17265,0xbbb5d274,0xbbc8eb8a,0xbbd0e788,0xbbdf8bc2,0xbc1bec00,0xbc0194ca,0xbbb3d94d,0xbb750f2c,0x3bec79b9,0x3c1b197c,0x3b35cb9c,0x3b188e8c, +0xba5871d7,0xbbacca17,0xbaec6fb4,0xba215437,0xbaf83758,0x3ba3ca22,0xbb85bc0c,0xba1e05dd,0x3bcb5060,0x3bdc2570,0x3b36a0c3,0xbc182b19,0xbc568894,0xbbf8fd80,0xbb2d8db5,0x3886b5e0,0xb8fef490,0x3851a22c,0xbad83c55,0xbb3aa70e,0x386663c7,0x3b0d0dfe,0x3af665aa,0x3b2456d2,0x3b68e665, +0x3bc8e4b0,0x3b8a5dea,0x3b9d5595,0x3bbfaacb,0x3c0d87ca,0x3bc9bbdf,0xbab8639f,0xbbf2bd9b,0xbc2d2b13,0xbc17d3e1,0x3a3da3d9,0x3bb0bc5b,0x3b66207e,0xbaee8e10,0xbbe79af5,0xbc274d99,0xbbddfd22,0xbbeafc15,0xbc64b02d,0xbca31bc0,0xbc8223db,0xb9ea8877,0xbb42f35c,0xbb603391,0xbaa769de, +0xb9d1ef6d,0x38b5ce27,0xb91b527d,0x3940eff6,0x395ed0b0,0xba90a929,0xbb04c888,0xbb4bb9d5,0xbb2f038a,0xba90578a,0xb9ac2e65,0xbad285d1,0xbad4e240,0xbb2da066,0xbbaabf4e,0xbbbc76c8,0xbbae4eb1,0xbb916c9e,0xba17f260,0x3b8102d9,0x3c2668d1,0xbbec8caa,0xbc4b7aa0,0xbb8de032,0x3ab4522f, +0x3bec153b,0x3c33d02b,0xba6645a3,0x3a867573,0xbb4e92ce,0x3bbc579f,0x3c10fac4,0x3bf893b1,0x3ae5d8c6,0x3aaca39e,0x3b3abdb7,0x3a514f46,0x39092f27,0x39c3c06f,0xb700cd84,0xba116bbb,0xba8b5578,0x39068349,0x3ae3b17a,0x3b4cae33,0x3b2c5fd6,0x3b0ceec6,0x3ae34e54,0x3b2d1eff,0x3b575d94, +0x3b883b29,0x3b7d4a18,0x3b0760ad,0xba5200a3,0xba1f3a2e,0xbaf30da5,0xba9d6265,0xbaa855aa,0xb94837fb,0xb9fbe61d,0x3b7b77dd,0x3bcda113,0x3c0105db,0x3b7ca826,0x3b89b961,0x3b1c1a56,0xb9d3812d,0xbb2047dd,0xbb051efe,0xb9b4a9ac,0x38e3547a,0xb9ee267d,0xba0735bd,0xba5baaeb,0xba80a858, +0xba965d56,0xba657601,0xba2561f5,0x3960e28d,0xb9ad05d5,0xbaea377b,0xbb5c4893,0xbb8df6f3,0xbb85f1e5,0xbb7c1d5e,0xbb56cb43,0xbb0bceb1,0x38425ae5,0x3afdc46b,0x3b4b1d42,0x3b77c461,0x3b7eeecb,0x3b67e5ce,0x3ac2b709,0xba056f74,0xbaeff0db,0xbb304456,0xbb3641f9,0xbace1826,0x3b1abc82, +0xbbb7e512,0xbb9ded71,0xbb57c72a,0xbaff965b,0xba6ac9f8,0xba307fb3,0xb9d833f4,0xb9c2a37b,0xb9331798,0xb8c71808,0xb830b06c,0x3a895f4b,0x3ad68d7c,0x3aede692,0x3a2633ad,0xb9ec96c0,0xbaf5fc69,0xbb2bea6f,0xbb39678f,0xbb20757a,0xbaba3363,0xb921c4a4,0x3a2f3c40,0x3b34480a,0x3b8f26d3, +0x3bb280ba,0x3bf0ea2d,0x3c08606f,0x3c11a692,0x3c0553a7,0x3bea8bca,0x3bbe5552,0x3b887082,0x3b0d662e,0xba6b8372,0xbb78079f,0x3bc0d566,0x3bc0da93,0x3bbbc701,0x3bb5b885,0x3bbc9a29,0x3bba928a,0x3bb19396,0x3bb0f223,0x3ba6a384,0x3ba3a240,0x3b9aa73c,0x3b7a2079,0x3b20bc74,0x3ae798ce, +0x39e67de0,0xba0d7b60,0xbb0038a0,0xbadb3a1f,0xbad2a09c,0xbacebdf5,0xbae1be1d,0xbb019b19,0xbb132b55,0xbaf48bbf,0xbac760d6,0xbaa862d8,0x3899a3e4,0x3ab4063a,0x3b3c1aa8,0x3b5048a1,0x3b6a8e33,0x3b80e18a,0x3b7c4f11,0x3b83c5c6,0x3b9ae76b,0x3bb22337,0xb9ad2f06,0xb8c9c4af,0xba4b219f, +0xb939be17,0xba0398f2,0xba0eb997,0xb9fb0e4e,0xba11c0a3,0xba8be334,0xbae244b2,0xbb195819,0xbb2f85b7,0xbb454387,0xbb64ed50,0xbb5841d9,0xbb465c1f,0xbb3cf5d9,0xbb38a036,0xbb3fb048,0xbb36d436,0xbb29a9c6,0xbb1b74c9,0xbb105460,0xbb0c1678,0xbb085440,0xbb08f44e,0xbb05d7f6,0xbb075f17, +0xbb00d272,0xbaf7810a,0xbad9ff90,0xbab04a7a,0xba7ba0cb,0xba1e74e5,0xb9e27ef7,0xb9ec4c10,0xba92e27f,0xba5c01fd,0xbaa35ee4,0xbab1cbab,0xbac5eee9,0xba874c9b,0xba98fbc0,0xbaa035df,0xbacf57b1,0xbae864ea,0xbb02651e,0xbb144322,0xbb236637,0xbb3777c4,0xbb221485,0xbb1d629f,0xbb278df3, +0xbb200741,0xbb1bf939,0xbb18b519,0xbb19272d,0xbb192b52,0xbb1891e6,0xbb180bd3,0xbb16ec38,0xbb16a642,0xbb0fb28b,0xbb08c1a3,0xbb034b49,0xbaf085c5,0xbae053d2,0xbad52618,0xbaced480,0xbac95781,0xbabc17d5,0xbaa3d199,0xbb203483,0x3a1e2b2b,0x3a442c12,0x3a3b84b9,0x3a22800d,0x3a0ee911, +0x39f1aa89,0x39cfa903,0x3991d4b3,0xb906c344,0xb93e7517,0xb9ae6e3d,0xb9d187ad,0xb91d32be,0x37750d16,0xb8e36272,0x39cc17df,0x39fec531,0x3a14cf86,0x3a0c576d,0x3a085c86,0x39dab063,0x3a107846,0x3a39e05c,0x3a8622b9,0x3a94a0ab,0x3a91a230,0x3a43bf83,0x3a6575d4,0x3a66b96c,0x3a9524a1, +0x3a172d5c,0x39ed0c3a,0x39b47538,0x3a648d12,0x3a89374d,0x3aa5b548,0x3a663ca1,0x3a3f2bb6,0x3a26606b,0x3991ba4f,0xb89d50f5,0xba120603,0xb9be6b19,0xba4866cd,0xbae97fdb,0xbac320a3,0xbaad8129,0xbaa7a58f,0xba3d7e8a,0xba1a98f7,0xba8cb0af,0x39eb6f18,0x3a6c9c3b,0x3a44f79e,0x3a8bc57f, +0x3a887dae,0x3a7c3748,0x3aafb46c,0x3aff5183,0x3b35cc7c,0x3b52f629,0x3b3eae28,0x3abd9d20,0x3ac290d6,0x3ab0fde2,0x3b097e31,0x3a555c67,0x3a090f97,0x39c22507,0x3aeebe01,0x3b1d662f,0x3b244f05,0x3ab59390,0x3ac48347,0x3ab784aa,0x39f3cbe4,0x387331c9,0xb9ee0b40,0xb9d6ca33,0xba8e6280, +0xbb63be38,0xbb824639,0xbba521f2,0xbb9894b5,0xbb71ee40,0xbb12c3f0,0xbb522896,0x39950996,0x39a81c3b,0xb8dcef13,0x3a334f46,0x39f1c9de,0x399b817b,0x3a6f74b7,0x3aedb131,0x3b64d385,0x3b8e0c73,0x3b86aad1,0x3b0270b7,0x3b33beee,0x3b2a90f7,0x3b83825e,0x3a26f442,0x386cd3f6,0x38bc5d19, +0x3b459c8e,0x3b81bc2e,0x3b8aec6c,0x3b27ba90,0x3974c3e0,0x39b2fec5,0xbaa2488c,0xbafd60a1,0xbb143b4f,0xbb2ffb1f,0xbb9b79ad,0xbbd424ae,0xbbfe25f6,0xbc02d8eb,0xbb8a5f30,0xbb8162ea,0xbb3ef734,0xbb363a78,0x3ab40e92,0x3b0dbde3,0x3af5560f,0x3b3de7dd,0x3b39ecaa,0x3b250ab2,0x3b722233, +0x3bb839a9,0x3c0c3257,0x3c1f8c1f,0x3c097767,0x3b74141f,0x3b58eb90,0x3b4bf603,0x3bbfe664,0x3ab8042c,0x3996e435,0x3a53a9ea,0x3bacc7be,0x3be9361c,0x3bdf9ea1,0x3b3d620e,0x3c11778c,0x3bb5b0a4,0x3bb2ff70,0x3b9b3ca8,0x3b488038,0x3bca92bc,0x3c06ae4b,0x3c13458a,0x3b92017c,0x3a583bef, +0x39270c53,0xba55c812,0xba1f7cf3,0x3b4923bf,0xbb183254,0xbb9ba218,0xbbeb14db,0xbbec7c11,0xbbf8978e,0xbc075d8a,0xbc058d8b,0xbc09a6ff,0xbc2e9719,0xbc03e96b,0xbba79a18,0xbb2b0368,0x3bc81206,0x3be759c5,0x3a53b129,0x3a20e874,0xba9afee2,0xbb7c10c4,0xba33ec73,0x39cd9eb4,0xba818303, +0x3bd94cb8,0xbb8ef952,0xbaf00e89,0x3b5a4917,0x3b9e0a5f,0x3b720a5e,0xbc05e93e,0xbc46d7a3,0xbbea6632,0xbb3585ee,0xb96220a7,0xb9778db1,0x3931fa42,0xbab4e275,0xbb31b50a,0x39133773,0x3b074232,0x3b01df72,0x3b07b005,0x3b535ddc,0x3bc6f3bc,0x3bac925b,0x3bc6eabd,0x3bd21390,0x3c076779, +0x3b9a92d5,0xbb46fd08,0xbc0a3f8c,0xbc2a3211,0xbbea20cf,0x3b12d9b1,0x3bb52d73,0x3b38343e,0xbb6da3cf,0xbc09e922,0xbc1364ae,0xbbd173ab,0xbc09ac01,0xbc16063e,0xbc6f7361,0xbc4cca6a,0xbb5c9f5d,0xbaeb4fbb,0xbaedfbd8,0xbb1406a5,0xb8e0de6c,0x39a39320,0xb8c5979f,0x38c5b9c6,0x39e00f8f, +0xba117ae4,0xbaf593ef,0xbb4ddcb3,0xbb3d75a2,0xbadcb045,0xbaa6c351,0xbb3c365b,0xbb20f06f,0xbb508a27,0xbbb2c7b7,0xbbb39d80,0xbb9c1af1,0xbb888800,0x3aa8084d,0x3ba094bb,0x3c0606c8,0xbc07b6a1,0xbc3f3f8b,0xbacc0475,0x3b30ac47,0x3c010b0a,0x3c57ab71,0xbb2dbbc7,0x3b8360c6,0xbac933b1, +0x3abf5f65,0x3b87b7ae,0x3baba0a2,0x39bf20ca,0xb84f805f,0x3aed452e,0x3a2e4e4a,0xb855899e,0x392784c9,0x38ff12ed,0xb9ef9094,0xba882b33,0x38a923e1,0x3ad601dd,0x3b4d5f0e,0x3b3a0d34,0x3b2ca24c,0x3b1c72bb,0x3b5a7422,0x3b6d12b0,0x3b73a91c,0x3b6be220,0x3af41d57,0xba8a5bd6,0xba80792e, +0xbaff5f1d,0xba2145d4,0xbaa2f34d,0x3959d7e3,0x3a82628c,0x3bd8a2db,0x3c0d4a97,0x3bf3dc35,0x3bc429e3,0x3b8fedd4,0x3b3c2212,0x3a74512a,0xba8f4aca,0xba551078,0x380ec5d7,0x392651f5,0xba6675ca,0xb9cb4880,0xb9b81612,0xb9a62256,0xba3ba2ee,0xba358a2a,0xb9d4ee7f,0x39d97e9f,0x3908bcc8, +0xba27100f,0xbb1a3c77,0xbb63c2cb,0xbb651a8c,0xbb4b6b96,0xbb2cdea0,0xbaebb458,0xb6ec65f7,0x3acb0261,0x3b2e33b3,0x3b385bee,0x3b262d1a,0x3b084d3b,0xb9002dad,0xbaf062d0,0xbb42d64f,0xbb69aad4,0xbb47ecfe,0xbaa9d7a6,0x3b3ddd1a,0xbbbf1996,0xbbbc519c,0xbb8ef489,0xbb3ec1aa,0xbae61432, +0xbaa17336,0xba407552,0xba1c6528,0xb9db13eb,0xba112153,0xba1fb1c1,0x3943aeb7,0x3a84ab2a,0x3ae27926,0x3a7b095a,0x3683fc55,0xbac2371e,0xbb2aa6f0,0xbb47007b,0xbb345220,0xbae1f0e3,0xb9bf0caf,0x3a5ff8a7,0x3b3f8984,0x3b950fbf,0x3bb8f7a4,0x3bf14783,0x3c068f43,0x3c0c194c,0x3bf05bc8, +0x3bb96ebb,0x3b642330,0x3af32650,0x3935d4e2,0xbb1132a2,0xbb906bd6,0x3ba19091,0x3ba8c1be,0x3ba9d700,0x3b9de6ce,0x3ba23707,0x3b9c4408,0x3b8d4849,0x3b856fd6,0x3b8b4444,0x3b95b914,0x3b9e0793,0x3b891698,0x3b511b94,0x3b314964,0x3a919316,0xb80248ff,0xbac4dd96,0xbaa35521,0xba9e51a9, +0xbaa460da,0xbab88a69,0xbadf2435,0xbb0404ca,0xbae6116a,0xbac4fa95,0xbab4e36a,0xb80d500c,0x3a9d3c3b,0x3b2d360e,0x3b4d66b0,0x3b76a88a,0x3b8d1439,0x3b87a919,0x3b8643f1,0x3b904fe0,0x3b9b80bb,0x3a9dfa20,0x3abf82ca,0x3a3696da,0x3a8b1cdb,0x3a33794f,0x3a0cdb3e,0x3a192e6b,0x39e36da0, +0xb887d3d7,0xba57218b,0xbac5da3a,0xbafb28b1,0xbb1673c6,0xbb348864,0xbb30fb70,0xbb232e51,0xbb20bcf0,0xbb24c468,0xbb345fde,0xbb2fbfaf,0xbb23619c,0xbb15f7e4,0xbb0ab2b5,0xbb06f13f,0xbb0373c9,0xbb05cacb,0xbae87770,0xbad0d7f9,0xbaacd71c,0xba91bfea,0xba536a33,0xb9b72b66,0x374750ba, +0x39ee0855,0x3a4ea7bf,0x3a803fc1,0xba23c7e3,0xb9978955,0xba356c98,0xba4fabec,0xba80d6e5,0xba0a7f00,0xba3c9986,0xba5f63fb,0xbaa062bc,0xbab81d09,0xbad408a5,0xbaf5771c,0xbb0ab9e6,0xbb1ea6fe,0xbb07a53d,0xbb04f8e3,0xbb17cb7f,0xbb0fe288,0xbb0ddae8,0xbb0ca0dc,0xbb0e7be0,0xbb10211f, +0xbb1122eb,0xbb11bc9b,0xbb113c51,0xbb13753c,0xbb07bc07,0xbafbe1de,0xbae8fe0b,0xbaca3b7c,0xbab05e86,0xba9aa78b,0xba8fce42,0xba86bbc5,0xba75048f,0xba49eefd,0xbb12bbdc,0x39ff208e,0x3a25aa5b,0x3a2cc8ba,0x3a0b384b,0x39efdd4f,0x3991eb93,0x39bb616b,0x3978d810,0xb9b80c7b,0xb94f27ea, +0xb9b46fad,0xba12c458,0xb9764e4c,0xb8961f8d,0xb96cc23b,0x397c4055,0x39a8090c,0x39df4882,0x39dd4f34,0x39e119cf,0x39cece82,0x3a02712b,0x3a25b45f,0x3a68705a,0x3a8302fe,0x3a7e4db0,0x3a1ca724,0x3a44b782,0x3a48c085,0x3a907f3e,0x39e5550d,0x39a092c2,0x39565b7e,0x3a4c0906,0x3a77b39f, +0x3a8cd0ae,0x3a411455,0x3a01897c,0x3a103c79,0x39174a61,0xb9818a3d,0xba777255,0xb9a4f258,0xba26093f,0xbb05060d,0xba9a0c02,0xba7c1ef3,0xbaac61e9,0xba116955,0xba0ddfd4,0xbaa1e256,0x3902b959,0x3a0c7bec,0x3a00af1c,0x3a69018b,0x3a862f88,0x3a92d100,0x3abdc630,0x3afff9d2,0x3b27bea9, +0x3b404e48,0x3b27a6e4,0x3a92afa8,0x3a9d45ef,0x3a9e0364,0x3b114e45,0x3a2a8bf6,0x39923b8c,0x39093f80,0x3adafb1e,0x3b11e668,0x3b0a326e,0x3a8f0b60,0x3aa5cc09,0x3acb0f5c,0x39e64f79,0x37ae34ab,0xba8325d6,0xb92bcba5,0xba4e027a,0xbb8883ce,0xbb6c77b8,0xbb98621d,0xbbaba12b,0xbb6cecfc, +0xbb18ad29,0xbb658a71,0xb9074faf,0xb9431421,0xba033e10,0x39d3f1b1,0x39ec4b21,0x3a241413,0x3a8eca07,0x3af49323,0x3b50b65f,0x3b8313b2,0x3b73da24,0x3ad37c92,0x3b1db869,0x3b19b83c,0x3b884853,0x39a536e9,0xb9846a62,0xb944b017,0x3b3ee21d,0x3b77516e,0x3b6e5ba5,0x3b104632,0xb9b92682, +0x39561bb7,0xbabfc39a,0xbb1585b7,0xbb6b7f27,0xbb1405ba,0xbb8468a5,0xbbebd580,0xbbe05558,0xbbe3789a,0xbb7d7df8,0xbb668d36,0xbb3c5fc6,0xbb67d2ac,0x3a21c0b4,0x3a94b3fc,0x3a55353a,0x3b2c9792,0x3b476aff,0x3b5b5771,0x3b8db3af,0x3bc1aff9,0x3c044d9b,0x3c1417cc,0x3bf19f42,0x3b37aa21, +0x3b25675b,0x3b45f921,0x3bd39487,0x3aa4a53b,0xb973c637,0x39584508,0x3b9f8d28,0x3bd84579,0x3bb7826e,0x3b04918e,0x3c27c7cd,0x3be7cbc9,0x3be36558,0x3bc81867,0x3b8ab8a8,0x3bd99bd1,0x3c035d74,0x3c04b745,0x3b9a15d3,0x3ac0082d,0x3a6ec553,0x37beaa18,0xb8d26007,0x3b1c9f58,0xba96255b, +0xbb64db3f,0xbbf675f4,0xbc021265,0xbc1044f9,0xbc1a123b,0xbc17e761,0xbc1ab23e,0xbc357af6,0xbc010b06,0xbb91543a,0xba465f25,0x3ba9219b,0x3b9e5198,0xba4c30df,0xba52eb7a,0xbab46e00,0xbb12de8f,0x381a0158,0x3a941ce7,0x39a1610b,0x3bff6c3c,0xbb8d99ab,0xbb28fd2c,0x3a5576e8,0x3b3f799f, +0x3b8824d9,0xbbdd6516,0xbc2c9d6d,0xbbcd3eb0,0xbb2a3e6b,0xb9f5bc93,0xb9fed013,0x38e47057,0xba7de46a,0xbb1d82a9,0x38666426,0x3ae6155b,0x3af31e33,0x3acd953b,0x3b349a68,0x3bb99ed2,0x3bc26e88,0x3be146e5,0x3bd79080,0x3be92636,0x3b3cf636,0xbb8aaee3,0xbc185164,0xbc2430a0,0xbba270f1, +0x3b650117,0x3bb3e537,0x3b1bc00d,0xbb9cc012,0xbc16c5bc,0xbc02176b,0xbbc32d95,0xbc127bfc,0xbba8c68f,0xbc27bf44,0xbc1dcb62,0xbbcd03c1,0xba292e23,0xb95119f4,0xbb25db38,0x39ed6783,0x39ebce26,0x38de77d6,0x382c70e7,0x3a0257b3,0xb7d639a1,0xbacaed4f,0xbb3f7149,0xbb4054ba,0xbb046ad6, +0xbafda89a,0xbb6e7217,0xbb488d6b,0xbb6a8122,0xbbae6ccf,0xbba2a8f9,0xbb844be2,0xbb6b80b4,0x3b543e86,0x3bbaa59e,0x3bb7eed0,0xbc1238ee,0xbc2dc3e7,0x3a2e62ee,0x3b6da660,0x3c04ec1a,0x3c6ce9ba,0xbb663329,0x3bd6c268,0x3b23377b,0xbb10292a,0xbaad731d,0x3ace358c,0xba62f969,0xba4fae7c, +0x3a433f89,0x39b3dbc4,0xb9a0cfdf,0xb82b6319,0x388c577b,0xb99275e9,0xba5a7a92,0x385d0398,0x3ab91986,0x3b49782e,0x3b41cab2,0x3b444298,0x3b416d3f,0x3b75ec27,0x3b6e4569,0x3b475246,0x3b3bd804,0x3abf934a,0xba915322,0xbab433ed,0xbb0df3ec,0xb9d45740,0xbaac4cbd,0x3a52d413,0x3b5545e7, +0x3c0d1bc5,0x3c165c51,0x3ba15c55,0x3bd4f811,0x3b86c770,0x3b46465a,0x3b16392b,0x3a35d2ab,0x3a37f44b,0x39b638bd,0x363e160a,0xba892566,0xb91eec19,0x384632f7,0x391908d1,0xb9807875,0xb9de6273,0xb962ca92,0x3a0e6f60,0x3a13eac4,0x39e09c23,0xbaa1a577,0xbb1f1f6a,0xbb33d533,0xbb188e5d, +0xbafabf92,0xba9d5cff,0x37c81877,0x3a932011,0x3b08b2a9,0x3ae57257,0x3a95f962,0x39f83478,0xbadecc98,0xbb4f6cb8,0xbb880446,0xbb8da67c,0xbb4286d4,0xba552f66,0x3b59e59a,0xbbac3502,0xbbc022c1,0xbb9d4647,0xbb68a813,0xbb1ee45b,0xbadb6dfc,0xba850951,0xba5b2fb5,0xba1c3d8b,0xba4d9034, +0xba6b9ef9,0xb9f86911,0x39be5dd0,0x3ab6e07d,0x3a931e40,0x39ba90ec,0xba8e13ac,0xbb1fba2f,0xbb473d37,0xbb3a3805,0xbb023ad9,0xba40ca32,0x3a300463,0x3b3429f8,0x3b8ed28d,0x3bb1fb66,0x3bdf3942,0x3bf34c0b,0x3bf5c696,0x3bc65a8d,0x3b817f48,0x3a9dc4cc,0xb9da71cb,0xbaea2ff9,0xbb57a374, +0xbb936c06,0x3b534aad,0x3b6dbeda,0x3b8079b8,0x3b68bab5,0x3b71b012,0x3b626d97,0x3b40c855,0x3b27cd2f,0x3b4f673c,0x3b78e9a7,0x3b9297e3,0x3b877ffc,0x3b6bfdf6,0x3b5d6ce9,0x3ad796d6,0x39e5c9f8,0xba7271ec,0xba502ede,0xba5daa29,0xba8bf80d,0xba99cc55,0xbaba4f50,0xbae33597,0xbacabbbc, +0xbab0dfce,0xbaa47eb1,0x36959a18,0x3a943c14,0x3b20c2d0,0x3b3f5537,0x3b690cef,0x3b86656a,0x3b787f62,0x3b648a81,0x3b579ae8,0x3b58bd2e,0x3b1f4b1f,0x3b313fc9,0x3b07bccd,0x3b0bd6de,0x3aea5a1c,0x3ace3b29,0x3ad39f05,0x3abf1fe5,0x3a822bb6,0x397a5ca8,0xb9e7994d,0xba69602e,0xbaac0885, +0xbae1b8ad,0xbaf22430,0xbae4ec16,0xbaf3e3ac,0xbb0804a3,0xbb20cae8,0xbb220aac,0xbb168074,0xbb0b9b72,0xbb00bb4c,0xbafb4043,0xbaf559f4,0xbafd5c07,0xbac4681e,0xba9991a3,0xba499a9d,0xb9ea5885,0xb873e3a1,0x3a0410ad,0x3a57dca6,0x3aaac79e,0x3ae3b2cc,0x3b0a4a1e,0xb967a6d9,0x38d80812, +0xb96c470b,0xb99340ca,0xb9f18912,0xb8ab5dd6,0xb9957595,0xb9f19088,0xba540d6d,0xba7f7410,0xba9a0292,0xbab5e34d,0xbad387ef,0xbaf6a399,0xbacdbfe7,0xbace54ef,0xbb0332c3,0xbaf7c7c8,0xbaf9c9b1,0xbafaaac2,0xbaffcd86,0xbb025752,0xbb043fdb,0xbb0575a6,0xbb0519fd,0xbb08c6b1,0xbaf3d797, +0xbadcb91f,0xbac5022e,0xbaa1cdac,0xba83694e,0xba4f86e1,0xba331423,0xba196d43,0xba005b8d,0xb9be4c96,0xbafe001f,0x39cce459,0x3a0c3ae6,0x3a2041ea,0x39eac92b,0x39c049c0,0x3900a0a3,0x39ae356a,0x394a0de9,0xba103eae,0xb96aeeb1,0xb9be1463,0xba3a7f4e,0xb9a7554a,0xb926cc08,0xb9ae1ddd, +0x38bd895e,0x3938c500,0x39a072fe,0x39a51df5,0x39b5b4ca,0x39c5e465,0x39ec2e89,0x3a14f796,0x3a4e548d,0x3a668108,0x3a5d165b,0x3a00747a,0x3a2549e1,0x3a2ac54c,0x3a8c108d,0x39aab44d,0x39494a5d,0x38c7e6ae,0x3a35b7f5,0x3a5efafd,0x3a6a6a60,0x3a2245b1,0x39a80783,0x3a013646,0xb5613001, +0xb9c408de,0xba97155d,0xb982fada,0xb9f402fe,0xbb090132,0xba58640e,0xba1b6efa,0xbaa9c57a,0xb9c318ab,0xb9f20f28,0xbaa4f21d,0xb93ad846,0x3927a8d9,0x39a81926,0x3a31d6b1,0x3a744f9e,0x3a9ef952,0x3ac2ca4d,0x3afac4aa,0x3b1b2892,0x3b2b4dcb,0x3b0e7b03,0x3a580433,0x3a5fb30c,0x3a81c831, +0x3b1597fc,0x3a04e2b5,0x38b671d3,0xb80bcc79,0x3ac9380d,0x3b058768,0x3ae06fab,0x3a5d0607,0x3a8f798e,0x3ad79a43,0x39c0cd3f,0xb8342fc4,0xbaae2e9e,0x38796e3f,0xba0c68fa,0xbb98d556,0xbb53c601,0xbb8925f1,0xbbbbf248,0xbb617e84,0xbb1b6b91,0xbb6c819f,0xba1cc812,0xba31e4e6,0xba2b4212, +0x38cbf356,0x39cb0ec9,0x3a6b09d7,0x3a9d20d8,0x3af8ac93,0x3b429d2f,0x3b6f1bae,0x3b59aec2,0x3aaca1e5,0x3b0261f6,0x3b02332f,0x3b8acf31,0x3865e078,0xb9f8a82c,0xb9c44981,0x3b365a68,0x3b692597,0x3b463eaa,0x3af9bc7d,0xba383662,0x3900540d,0xbad8095a,0xbb25c3ee,0xbb922fe5,0xbaefaada, +0xbb5629ef,0xbbef5d84,0xbbb5c3be,0xbbb5057a,0xbb551dc9,0xbb355ac5,0xbb22fe20,0xbb7b0884,0xb950be82,0x3838f4b3,0xb79a11f2,0x3b0d85a9,0x3b3ff660,0x3b7f8649,0x3b98a03f,0x3bc4b004,0x3bf8344e,0x3c05f601,0x3bcb71a7,0x3af09e48,0x3abe5d06,0x3b2c0857,0x3bdf6592,0x3a8e63e7,0xba2ce65f, +0xb93fdd3c,0x3b94943a,0x3bc56b73,0x3b8dbaf3,0x3aa75a12,0x3c344246,0x3c061696,0x3bfccd52,0x3be1ec4e,0x3bacd2e2,0x3be12c25,0x3bf0e08c,0x3bd7d282,0x3b8f7cf8,0x3ae05ee8,0x3aa765f9,0x3a1c4c7b,0x39c8f83b,0x3ad84a94,0x38bc3b27,0xbb008be1,0xbbf2a3da,0xbc03c3af,0xbc1701a8,0xbc1f05d7, +0xbc20a564,0xbc22e8a6,0xbc30a26d,0xbbeeb090,0xbb57d5c5,0x3ae2f888,0x3b9c131b,0x3b511070,0xbaf81bfc,0xbae32f8b,0xbaaf4d12,0xba29d451,0x39c796c9,0x3adb15e3,0x3b097cf9,0x3c0f1a02,0xbb828459,0xbb3a5f01,0xba938ff0,0x3aa572f0,0x3b89e7d7,0xbbad6534,0xbc0c6f0e,0xbba6ba44,0xbb0571aa, +0xba1ea685,0xba2c984d,0xb90f9fe4,0xba08d421,0xbb009e9a,0xb917f76d,0x3aadb98d,0x3ace1b06,0x3a85a02f,0x3b0bc07c,0x3ba4175f,0x3bc9ce75,0x3beb9488,0x3bd461a3,0x3bb5a6df,0x3a81564f,0xbba6396b,0xbc216323,0xbc1910bc,0xbb33938b,0x3b905b25,0x3baccc35,0x3b1725e1,0xbbb07950,0xbc1ad2b9, +0xbbe62ac7,0xbbb452d9,0xbc041231,0xbabf75a3,0xbbe4dd69,0xbbf1660d,0xbc06bfc8,0x3992b83b,0x3a730d0e,0xbb0457c8,0x3a8bab31,0x39a6592f,0x39b29287,0x386b6253,0x39d04dfa,0x39c1d723,0xba8df8e3,0xbb1f653f,0xbb37cdb7,0xbb04c01e,0xbb0c760f,0xbb77215e,0xbb5847fe,0xbb753c54,0xbb9e0cf9, +0xbb8b840d,0xbb4a50ff,0xbb21b90f,0x3baca9da,0x3bd17be8,0x3b3fbeb2,0xbc15f504,0xbc1840c1,0x3b311c16,0x3b978666,0x3c0ab556,0x3c789f18,0xbb47daaa,0x3bffd755,0x3bfe124a,0xbba014c4,0xbbda75e4,0xbb3fce8e,0xbae00a00,0xba68dadd,0xb8d37338,0x3825485a,0xb9df47a4,0xb93bfc57,0xb8d81290, +0xb91401c1,0xba10dfa9,0xb34afa6d,0x3a8e2064,0x3b3f14e8,0x3b46e5db,0x3b5402ca,0x3b6026de,0x3b81910d,0x3b61fe26,0x3b189792,0x3af9f885,0x3a768180,0xba7ed1d8,0xbad2b363,0xbb13cc46,0xb9d108d8,0xba8f9452,0x3af009a9,0x3bcb41bc,0x3c18d26b,0x3bfb1c0d,0x3a9716f7,0x3ba897e1,0x3b808089, +0x3b5cd68c,0x3b7cb92b,0x3b4210cb,0x3b179e04,0x3a1f8ce3,0xb94b3812,0xba74e375,0x38d9927b,0x399cac1f,0x39c4e513,0x3921345d,0xb8dd8da9,0xb89c15b8,0x3a26b6d3,0x3a77bd49,0x3ab2ef9c,0xb83ace8c,0xbaa2e148,0xbae84e77,0xbabf73ac,0xba91266b,0xb9e0363c,0x397b7634,0x3a63022b,0x3acb99a5, +0x3a52bd03,0xb7944331,0xba6256c9,0xbb40b968,0xbb8ae445,0xbba4393b,0xbb96a2d7,0xbb17e3f0,0x38975daa,0x3b7ae65a,0xbb82f5ec,0xbba8a5ca,0xbb9a1ed6,0xbb7efc1c,0xbb3c1d39,0xbb058ad2,0xbaa8993e,0xba8f48c5,0xba3d86fb,0xba60f5a2,0xba80be6f,0xba693b43,0xb95f02b3,0x3a691c44,0x3a8e9936, +0x3a13ab4f,0xba3a1562,0xbb0e1550,0xbb3c73b7,0xbb32b548,0xbb0bf7d1,0xba9524da,0x398af58c,0x3b195ed1,0x3b804016,0x3ba0a04a,0x3bc16774,0x3bcb32b5,0x3bc30060,0x3b969414,0x3b1f0f3e,0xba17909f,0xbb0ce814,0xbb54e8fe,0xbb7ac0ae,0xbb834f41,0x3aa0ba0c,0x3ae319c5,0x3b156b4f,0x3b08e096, +0x3b155f8a,0x3b083995,0x3ad3b1be,0x3a9af74a,0x3b07bf14,0x3b3e4585,0x3b7b0014,0x3b774029,0x3b713604,0x3b756274,0x3b066100,0x3a67d854,0xb989538b,0xb9a8d061,0xba0d6927,0xba8033b2,0xba751689,0xba8b5e15,0xbaaa1e4c,0xba92d767,0xba71376d,0xba49684e,0x39ad8245,0x3aabfd69,0x3b1fee57, +0x3b3217aa,0x3b4f33da,0x3b6955c4,0x3b46cada,0x3b1f0fe8,0x3ade180c,0x3ac4bd52,0x3b553015,0x3b663d92,0x3b465314,0x3b3c4a9d,0x3b295eef,0x3b1a295d,0x3b1e104a,0x3b180fa0,0x3afbbaba,0x3aa67983,0x3a30a4d0,0x398a3141,0xb9258b40,0xb9ff88ac,0xba59afe6,0xba6229e4,0xba93ef7e,0xbac38662, +0xbb05c37b,0xbb090adb,0xbafc3106,0xbaedfb45,0xbada148d,0xbad58837,0xbad132fa,0xbadb438b,0xba956a0f,0xba3f6ae6,0xb9829a89,0x392b8bb3,0x3a24518d,0x3aa37849,0x3ac4e59e,0x3b00abca,0x3b1dd344,0x3b3d2672,0x392b49b8,0x39e763fc,0x39316c34,0x390f004a,0xb8266328,0x39a8c520,0x38b54d7b, +0xb90453dd,0xb9d8869f,0xba10c948,0xba3d79bb,0xba67a179,0xba8c1962,0xbaa5b495,0xba8143b9,0xba8201d6,0xbad5b0b0,0xbac2e554,0xbac72b8c,0xbac3d49e,0xbacb4b7f,0xbacfc0fc,0xbad40cba,0xbad6af1b,0xbad59f81,0xbade515c,0xbabdd5de,0xbaa593bf,0xba8ca6a6,0xba52d8fd,0xba16c0be,0xb9b768d2, +0xb979289f,0xb901e11c,0xb7bf7db3,0x385a960b,0xbabbeeeb,0x396d43ab,0x39c5eac4,0x39f87210,0x39a88fcd,0x398d7802,0x3847b1f7,0x397b8dcd,0x390dd83b,0xba28c4fe,0xb94f6d37,0xb9a9afe1,0xba4b1850,0xb9b306db,0xb944005c,0xb9b5963c,0xb887fd73,0xb774739c,0x398c7981,0x3957b3f1,0x3969a92e, +0x398a1189,0x39ad153c,0x39e29e35,0x3a279846,0x3a337fd3,0x3a28713f,0x39b024f1,0x39e238bb,0x39ece23f,0x3a77eab4,0x391613fb,0x372425e8,0xb8a020b8,0x3a0a5b68,0x3a321ed6,0x3a2a1e84,0x39e6f87f,0x38ea32c9,0x39c2e3ea,0xb8f558af,0xba08e155,0xbaa3583a,0xb95fc46f,0xb9b3a46d,0xbb073a59, +0xba15a4e3,0xb9b7b73d,0xbaaa52b6,0xb99de01b,0xb9f690ec,0xbaa22393,0xb9fb799c,0xb964ed0c,0x39454be1,0x39d6f27e,0x3a4ddd5a,0x3a9479a6,0x3ab323b5,0x3ae3abae,0x3b09fa2b,0x3b0d8451,0x3ad9c14c,0x39f35489,0x39c73e73,0x3a24bcca,0x3b0edda4,0x3985123e,0xb9444b11,0xb9834af0,0x3aaab67e, +0x3ae37eda,0x3aa205a7,0x3a0dcbeb,0x3a63570d,0x3ad2741c,0x39801293,0xb92aa9ed,0xbac3e5ea,0x39521922,0xb9c4c43c,0xbba03a2f,0xbb394186,0xbb70886d,0xbbc3d54f,0xbb554fb8,0xbb1afe79,0xbb63dcb8,0xba931c41,0xba9d71d3,0xba233468,0xb9710cd7,0x39840f18,0x3a820e7b,0x3a96d7ad,0x3aedbfd3, +0x3b343cac,0x3b4f65e6,0x3b36ecd8,0x3a81b7ae,0x3abbc79b,0x3abde96f,0x3b867cf3,0xb9a3cc46,0xba4ea939,0xba239004,0x3b23d9fd,0x3b527d73,0x3b1aee8e,0x3ace4c05,0xba80b4f2,0x37bb6034,0xbae53ab4,0xbb313eab,0xbba12cb1,0xbabca8ef,0xbb2380fb,0xbbdcde89,0xbb864001,0xbb821748,0xbb18d75f, +0xbaea858b,0xbafa0375,0xbb6dced7,0xba75c049,0xba840e59,0xba1a6dd6,0x3ac78a4d,0x3b2728e9,0x3b84bd9b,0x3b974f8c,0x3bbe820c,0x3be4c1c4,0x3be698ef,0x3b9cf42b,0x3a3e730e,0x38f6a0fc,0x3af62793,0x3bdd871a,0x3a3920a7,0xba9bf3a3,0xba0fa95d,0x3b86e4cd,0x3bad54ef,0x3b434c13,0x3a0f84cc, +0x3c3607b0,0x3c0e572f,0x3bffceb5,0x3be76929,0x3bc79236,0x3bdef901,0x3bce61f2,0x3b99ac99,0x3b6d15f2,0x3ac4ac5a,0x3a9fe0b4,0x3a2e7d41,0x3a3f7d19,0x3a7c7f47,0x3a8ed43d,0xb9be7313,0xbbdf53a1,0xbbfb2083,0xbc12dea0,0xbc1a14fd,0xbc21ffaf,0xbc24040c,0xbc22e45b,0xbbd1f624,0xbaf20d7f, +0x3b90aa18,0x3ba2cd67,0x3b10dd47,0xbb34fa61,0xbb211306,0xbabb60b1,0x39d4e08a,0x38e6efe1,0x3aed6a6d,0x3b8529f2,0x3c195f97,0xbb6e71ad,0xbb314ebb,0xbb1b76ca,0xb8e33d51,0x3b7c8504,0xbb828bb0,0xbbd5c680,0xbb6f57b8,0xba9f788a,0xba3e98b7,0xba13dfa3,0xb9c43ed0,0xb988335f,0xbab648c2, +0xb9d79ba4,0x3a590ada,0x3aa5106f,0x39dedcf3,0x3ab72e11,0x3b84e856,0x3bbdd9ec,0x3be1e315,0x3bc3fc87,0x3b7265c6,0xba760023,0xbbc3777c,0xbc293911,0xbc0c505c,0xba35b30e,0x3b9a2873,0x3b95ebda,0x3b0aba79,0xbbc5735c,0xbc1e76f9,0xbbd4e62c,0xbbabe753,0xbbd026d6,0x3b06fc4c,0xbb8c4b96, +0xbbb7b429,0xbc0e298d,0x3a504288,0x3ab458c2,0xba779b21,0x3a9a67a1,0x39311b4b,0x39dc6748,0x392b4463,0x397629f8,0x3a0879cc,0xba0c511e,0xbaea7727,0xbb2125d4,0xbae1d4fe,0xbaf4a147,0xbb5b4ac0,0xbb561f59,0xbb78774e,0xbb8c4026,0xbb71d87e,0xbb10ab75,0xba817dc1,0x3be04d52,0x3bd7a2da, +0x39703b57,0xbc14ff38,0xbc00ff2e,0x3b90af10,0x3bb609af,0x3c0e8dff,0x3c6f3c0d,0xbb054df0,0x3bd85e20,0x3c43449d,0xbbd24ea5,0xbc38219d,0xbbf1bd41,0xbb146738,0xba336ce3,0xba081a6e,0xb8eba75f,0xb9d2e2d3,0xb95d13c6,0xb9633eb9,0xb91b27cf,0xb99d414e,0xb8c18b70,0x3a2dcab0,0x3b294187, +0x3b45de5a,0x3b5d601f,0x3b726289,0x3b7b8b75,0x3b440080,0x3ac4816d,0x3a384dc7,0x386a7cc3,0xba909582,0xbb00c83d,0xbb201deb,0xba5e1c32,0xba349811,0x3b431792,0x3c15061e,0x3c0611a0,0x3b83b0f0,0xbb5cb2aa,0x3aee680f,0x3b6e976e,0x3b820849,0x3bbb3bc1,0x3bb47a89,0x3b75aa80,0x3a61d5c4, +0xb9bca3de,0xba234448,0x399a503c,0x39b8686b,0x39d1fb03,0x39b0987f,0x39328cd8,0x3846b511,0x3a2d5fdd,0x3aa128c0,0x3b08f17d,0x3a948228,0x38768a2f,0xba3268a9,0xba20e152,0xb9c184f2,0x39896f9d,0x3a006283,0x3a2d6a82,0x3a81866a,0xb963e708,0xba9c1c6e,0xbb070d38,0xbb821e01,0xbba8c0e2, +0xbbb89661,0xbb95947a,0xbacc6341,0x3a548fe9,0x3b7e1b02,0xbb2dc732,0xbb85a6ae,0xbb8909b0,0xbb81f197,0xbb4cbae1,0xbb1764ee,0xbac7df6c,0xbaab3491,0xba4cf1cc,0xba516aa2,0xba77d941,0xba8807ff,0xba244b45,0x39a2a2eb,0x3a66d78b,0x3a275368,0xb9cfe1ed,0xbaf30256,0xbb296f29,0xbb24303f, +0xbb11a4a7,0xbac987fc,0xb9aba2b4,0x3ad67d0c,0x3b4ac242,0x3b818fb9,0x3b9734a8,0x3b98d86d,0x3b88af39,0x3b4e4f32,0x3a9f07c3,0xbae8108e,0xbb53e1b0,0xbb875498,0xbb809389,0xbb56ce41,0xba442397,0xb9472370,0x3a1cf353,0x3a2fdef1,0x3a827a04,0x3a60e601,0x3a089a5f,0x39007d78,0x3a98057a, +0x3b03e1da,0x3b483f39,0x3b4d4768,0x3b61fd09,0x3b733c8c,0x3b17025c,0x3aa21e39,0x39cb06dc,0x3906c4a0,0xb98be749,0xba71a865,0xba37213b,0xba2a2d58,0xba4279ae,0xba0898b1,0xb98e17bd,0xb70a1196,0x3a5d4693,0x3ad2358f,0x3b204046,0x3b1e56d5,0x3b253fe4,0x3b2ebcb4,0x3afc2b12,0x3a8aa518, +0xb90abd77,0xb9c855e4,0x3b6b3550,0x3b7978a0,0x3b69f696,0x3b50f468,0x3b44355a,0x3b358778,0x3b38b07c,0x3b37eb04,0x3b23accb,0x3b05d748,0x3ad7932a,0x3aad4c75,0x3a7d7149,0x3a447d73,0x3968f02d,0x38720e71,0xb9aecf13,0xba54d6d3,0xbabeaf87,0xbacdd5db,0xbab93132,0xbab34fb1,0xbaa33a8b, +0xbaa04d08,0xba9dea93,0xbaa7f95f,0xba3e1e33,0xb997cd92,0x39649827,0x3a34968f,0x3a9d6a78,0x3aee0988,0x3b0232e5,0x3b1bb792,0x3b341976,0x3b546955,0x3a005a5d,0x3a30cf0e,0x3a041c4c,0x3a07350b,0x39c91f95,0x3a24db5b,0x39ddf1ac,0x3973eb84,0x3831f914,0xb873ef4e,0xb94eade8,0xb99474eb, +0xb9d5b472,0xba0306eb,0xb9a3b4af,0xb9b47cf3,0xba8a4c26,0xba7102ac,0xba810e31,0xba7c0e4d,0xba855e02,0xba88763d,0xba8c01fc,0xba8e3740,0xba8cc7a8,0xba95ce6b,0xba6be6be,0xba3e0e91,0xba10a8eb,0xb9a5ed30,0xb9002df0,0x38befcec,0x3942eb98,0x399ceddb,0x39d38980,0x39dcc236,0xba588a8e, +0x3990816a,0x39e03a99,0x3a1a6b95,0x398623bb,0x38f53f63,0xb92ef601,0x39825200,0x381a2e15,0xba578f56,0xb9ab6772,0xb9e3a3c6,0xba6b82eb,0xba02b9f0,0xb9c10954,0xb9f92dc9,0xb9859ed0,0xb8f1d888,0x38a8331d,0x387a4565,0x3916c579,0x39ba6b34,0x39c5cd3b,0x39fc39f5,0x3a361506,0x3a3096be, +0x3a249d58,0x39cc6686,0x39e2af77,0x39eeec33,0x3a84f654,0x3944ab0d,0x3889bbae,0x370c19fa,0x3a1b907f,0x3a40c96d,0x3a255dd2,0x3a00f7fb,0x395763b4,0x39fedbb8,0xb99417b1,0xb9ee1c59,0xba9c1e24,0xb9104722,0xb910c42f,0xbaf3c70c,0xb97a2baa,0xb8a97fea,0xbaa6b881,0xb980bdc4,0xb9e33c01, +0xba880bfc,0xba36c439,0xb9fa477a,0x39414aa1,0x397c7af0,0x3a0e7421,0x3a9207b2,0x3ab242ef,0x3adcb9b3,0x3b051844,0x3af1c080,0x3aac11c5,0x39b0639f,0x3920be6c,0x3a04baef,0x3b13bc6f,0x3992d6e5,0xb90bf9a2,0xb8c2c1e4,0x3ab6e325,0x3ae34f25,0x3a8a8245,0x3a0e0458,0x3a82d465,0x3ae10528, +0x394c0f36,0xb9405aa3,0xbac7497a,0x39a704f6,0xb97ff3ba,0xbb9a6f40,0xbb1ec511,0xbb48bad8,0xbbbe3b4e,0xbb3f7afa,0xbb1acc4e,0xbb4908d8,0xbad6b0fb,0xbad92072,0xb9d9456a,0xb9f8f558,0x38eec54d,0x3a86f105,0x3a9dafe7,0x3af09586,0x3b34aba0,0x3b374080,0x3b1d3094,0x3a7063dd,0x3a962aab, +0x3a9b7f2f,0x3b87f3f1,0xb9a09f72,0xba2e9c78,0xb9b58693,0x3b2c133b,0x3b552bbc,0x3b0a51a9,0x3ad3729c,0xba41aff4,0x38e8f644,0xbadf6e44,0xbb2d81bc,0xbba0cdc4,0xba8d337a,0xbae55178,0xbbb7a87c,0xbb309761,0xbb215d2a,0xbaabd9af,0xba72f0c8,0xbaa02c8e,0xbb469659,0xbabfc0e1,0xbaf426fa, +0xba7620ce,0x3a62b015,0x3b0299ac,0x3b7df424,0x3b916215,0x3bb5d3c5,0x3bd502b7,0x3bbfb68f,0x3b5fe1d6,0xb902bf6e,0xba62c335,0x3ab5d0ee,0x3bdcc186,0x3a37be9a,0xba9604e8,0xb92eda46,0x3b8ccccd,0x3ba588db,0x3b0d0e95,0x39a58430,0x3c39084d,0x3c11a9ec,0x3bf5aaae,0x3be28109,0x3bd4d0a5, +0x3bd02730,0x3ba4eed1,0x3b3b7259,0x3b2d21f8,0x3a64b237,0x3a79523c,0x39ed1bf1,0x3a4eb523,0x39f0dbca,0x3adf3b0d,0x3a868338,0xbbbbd947,0xbbe184f1,0xbc06af97,0xbc0c15f0,0xbc18cd57,0xbc1a16c0,0xbc083339,0xbba011f3,0x395027b4,0x3bf06ecc,0x3bc67cba,0x3b168129,0xbb3cb983,0xbb1aace1, +0xba7a0678,0x3acdad95,0x392b52ad,0x3b1892cf,0x3bd397e7,0x3c277d30,0xbb314e06,0xbb07ad29,0xbb47d08a,0xba85e8b3,0x3b543174,0xbb3a48a3,0xbb972913,0xbb053adf,0xba34c934,0xba214811,0xb9c65580,0xb9cbd557,0xb9267134,0xba53c303,0xba228833,0x39adfb0d,0x3a81cf41,0xb8d80a52,0x3a17da22, +0x3b42c17c,0x3baab08b,0x3bd1bbfc,0x3bb741ea,0x3b1aa343,0xbb0cea15,0xbbd079a7,0xbc26b1cb,0xbbeb7811,0x3ae19ef7,0x3ba6796c,0x3b86aca4,0x3b19235f,0xbbc710e7,0xbc16fcf5,0xbbb5b095,0xbb9598d9,0xbb54a75d,0x3baf8f9f,0xbb0159b5,0xbb8313d3,0xbbff11ef,0x3a68828a,0x3aa5e30d,0x378d62c2, +0x3a3dd5b7,0x392a0551,0x39a6ed4d,0x394fba15,0x390aa4a1,0x39e3eafc,0xb876cfd9,0xba87388d,0xbaff8be3,0xba8f4103,0xba9bd49c,0xbb191cec,0xbb2ce955,0xbb5d8494,0xbb58383e,0xbb33a01c,0xba427a44,0x3ad00125,0x3c0d6ec6,0x3be4814b,0xbad12f4b,0xbc0359e1,0xbbb9abb8,0x3bd0c23d,0x3beb0d28, +0x3c1f3d85,0x3c64f2f6,0x38d0b398,0x3b8ad96a,0x3c5f2b2f,0xbbe468c8,0xbc663af1,0xbc3339fd,0xbb221a73,0xb9e9c113,0xba0abc25,0xb8db1a0a,0xb9a6b84c,0xb9512ce7,0xb972d5d1,0xb92d12d1,0xb93a536e,0xb94003f3,0x397a56d6,0x3b05c61e,0x3b43f2fd,0x3b5c5dfc,0x3b80ab6f,0x3b76ebd8,0x3b2db92b, +0x3a880c4e,0xb8beb6c4,0xba1285c7,0xba819ac4,0xbae9a5fd,0xbb008733,0xba6da51f,0x3a5432b2,0x3ba08ce1,0x3c411b9e,0x3bcc6430,0xb91760ea,0xbbe279ae,0xbae1e3e4,0x3b8b9985,0x3bbb2872,0x3c01cc6e,0x3c07117d,0x3ba15950,0x3a9be3c3,0xb9aefa2e,0xb98efa40,0x39c63e0b,0x399461df,0x39c1f6b1, +0x39c2796f,0x399892d1,0x39013152,0x3a288790,0x3ab37882,0x3b28843f,0x3b15c070,0x3aabdbc7,0x3a23e7a3,0x39ffd2f1,0x3a0a62a1,0x3a8c723b,0x3a8bd592,0x3a7bb70f,0x3a8982a5,0xba0f84cb,0xbacfdb1b,0xbb19a831,0xbb87c825,0xbbad526f,0xbbb2756c,0xbb76560b,0xb9b14bcb,0x3aff2d4f,0x3b8756cc, +0xba80323c,0xbb227da1,0xbb5fe3eb,0xbb6eb245,0xbb4e4227,0xbb1e9745,0xbacc84a7,0xbaabb72f,0xba30aa6e,0xba2a3a5d,0xba51fb26,0xba82be93,0xba4e79fc,0xb914c128,0x3a24a9f6,0x3a2c052f,0xb79d7e11,0xbabdad20,0xbb104136,0xbb09218a,0xbb005872,0xbad1a54d,0xba2f4e06,0x3a8ee0cf,0x3b19f153, +0x3b47dbdd,0x3b5fea96,0x3b59c12c,0x3b3500f6,0x3b0ff037,0x3a4027ee,0xbb001e0b,0xbb53835f,0xbb817a60,0xbb4fceda,0xbb05f879,0xbb018aff,0xbad1232e,0xba4a4f13,0xb9be9479,0x37ec290b,0xb7d300cd,0xb98518d7,0xba0e55ca,0x39ea2478,0x3aa92a46,0x3b10db52,0x3b1f79e6,0x3b3bced4,0x3b5757b9, +0x3b1708f6,0x3ac57cac,0x3a78d059,0x3a1319e3,0x3717df3c,0xba2dabbb,0xb939a5a7,0xb69cc334,0x38c164b9,0x39d65e8d,0x3a4ae9d3,0x3a9c8ab3,0x3aea56ad,0x3b16c5b1,0x3b3969ac,0x3b1f1c6d,0x3b0a5dd3,0x3afc4743,0x3a8c2ef7,0x387ff73d,0xbab5acb6,0xbad71842,0x3b719cba,0x3b7b58ec,0x3b67e533, +0x3b55b151,0x3b484538,0x3b3c5996,0x3b44979a,0x3b469d76,0x3b400bbb,0x3b2ecbd8,0x3b1fe9a0,0x3b18b3f9,0x3b0c30c4,0x3b0615f1,0x3aa9c57c,0x3a87cc4e,0x3a1a4bed,0x385b2ad0,0xba56e2bf,0xba3b438b,0xba11e211,0xba17a25c,0xb9ff2a05,0xb9fc3dce,0xb9fcb749,0xba105bad,0xb7a9991d,0x39d1ad58, +0x3a6aa971,0x3ab5b06c,0x3afb04b0,0x3b213aaf,0x3b251246,0x3b35afbd,0x3b45124f,0x3b5fb2b7,0x3a864f3d,0x3a986c11,0x3a630c54,0x3a4e00bd,0x3a161b76,0x3a86682f,0x3a2ff3b8,0x39bf5fb2,0x39902e3f,0x396f9d70,0x392b4216,0x38f9d5c7,0x3846d28a,0x389b59dd,0x39a83f81,0x39e8b4a7,0xba193573, +0xb9a0eb8a,0xb9908ebf,0xb74682aa,0xb906523b,0xb9017fed,0xb91144a4,0xb91bcb54,0xb90bffb7,0xb94fee38,0x379975e5,0x392de838,0x399dbbe1,0x39fc8f4a,0x3a235a6d,0x3a552c29,0x3a641777,0x3a7d01ed,0x3a8ab1db,0x3a85f58f,0x393279b9,0x395958d0,0x39c685d4,0x39f9be26,0x39c2cb16,0x39a30aa1, +0x3889d866,0x399d8684,0x3981efbd,0xba02c63e,0xb739c843,0xb8c690d6,0xba0baf6b,0xb93e56ca,0xb8e7b1bf,0xb9224d42,0xb8ff4631,0xb8d8683d,0x39afaf1f,0x3973242a,0x397f02d5,0x3971099d,0x39a37349,0x39d1ffa9,0x3a239709,0x3a0a95c0,0x39fc507e,0x39a62a87,0x39a84c5a,0x39b622ab,0x3a754535, +0x38ece41f,0x366b493d,0xb7c2d594,0x3a0b0407,0x3a2eab75,0x3a0666bb,0x39e0eb71,0x393afeaf,0x3a00f7f4,0xb6c7bc7e,0xb9c834f7,0xba75350b,0x3826e326,0x38295e8d,0xbacefd45,0xb84ec74b,0x38904cfb,0xbaa18e48,0xb9cae749,0xba01cb4e,0xba481ccf,0xba5261c3,0xba20b463,0x39a03631,0x390fbee3, +0x3a1a10df,0x3a71e8a5,0x3a965f09,0x3abd8a30,0x3ae8b33f,0x3aaf0bf6,0x3a4f99ae,0x38a65ad5,0xb8fcb64a,0x39a6c37b,0x3b0b5ba9,0x392e3c02,0xb960a5bf,0xb890cd2d,0x3aad8bf5,0x3aced674,0x3a4cbf92,0x39e9cb9c,0x3a798c41,0x3adffe51,0x39bcb419,0xb8e85506,0xbaaf5084,0x39edbbf8,0xb8894ee8, +0xbb85ef91,0xbaf96d50,0xbb20a4a4,0xbb9fada6,0xbb21888b,0xbb1383ef,0xbb2063be,0xbb0092e1,0xbb0524ff,0xb8bdb0bc,0xba128d24,0x38e004be,0x3a6872f3,0x3a85dc37,0x3ad9beba,0x3b2920e7,0x3b0fa387,0x3ae9d0fa,0x3a338fb5,0x3a53f5ae,0x3a64126e,0x3b802ea6,0xb9dde9b4,0xba33360e,0xb94d4f4d, +0x3b271735,0x3b4c28f7,0x3aebce0a,0x3ace5f41,0xba272232,0x3981ec8f,0xbaac2f65,0xbb1f784e,0xbb9339a6,0xba2f0a42,0xba8dc8eb,0xbb884adf,0xbacd1815,0xba9883e5,0xba351826,0xba0193ee,0xba1a3c27,0xbb10dfc8,0xbadefc67,0xbb1e9f8a,0xba8168a2,0x398ce409,0x3ac53120,0x3b5a1608,0x3b7d2fe2, +0x3ba160f9,0x3bbb6675,0x3b8c9fe5,0x3ae6bbb5,0xba899362,0xbad5eba0,0x3a7c4f7d,0x3bcf1ec8,0x3a066787,0xba9e629f,0x38cf9057,0x3b8b4c68,0x3b974e2a,0x3aaabaaa,0x38b11336,0x3c32847e,0x3c0b6745,0x3beb3383,0x3bd84379,0x3bd3ddb5,0x3bb7d7a7,0x3b6b1a4c,0x3acb8a30,0x3acca938,0x39a5771f, +0x3a2bbbf8,0x394417e5,0x3a2a8081,0x39218bf1,0x3af8beb0,0x3b00c56e,0xbb893497,0xbbc067cf,0xbbe8bc48,0xbbf3a6ab,0xbc0b9122,0xbc0a17ac,0xbbd4b2f0,0xbb4fe608,0x3b10f211,0x3c1d7010,0x3be09c9c,0x3b160e9a,0xbb406cbb,0xbb18988e,0xba4ad248,0x3b063f3a,0xb8cacabe,0x3b27c957,0x3c0939b5, +0x3c3082e6,0xbb043577,0xba89b6eb,0xbb369fe6,0xbab8cb32,0x3b21b0d0,0xbaf6ae1d,0xbb3c43fa,0xba3f2295,0xba07e62c,0xb9a8cf78,0xb97e63ae,0xb97d34a1,0xb92ff59e,0xb9bb70dc,0xba357524,0xb907fe24,0x3a65abf4,0xb9f33ebc,0xb858b310,0x3aeccd47,0x3b89a57e,0x3bb55827,0x3ba07a3a,0x3a9a370a, +0xbb4e85e5,0xbbe1178c,0xbc1f6fcb,0xbbb6ee17,0x3b807064,0x3ba6d38c,0x3b58d6a8,0x3b058e0a,0xbbd34bdc,0xbc136e99,0xbba3b3a5,0xbb858426,0xba2d6815,0x3c045509,0x3a5fe0e0,0xbb105e46,0xbbbbac63,0x3a222eb0,0x3a8852b7,0x3989ddff,0x39a281b0,0x39343240,0x392f3a43,0x3932552d,0x38d666c7, +0x39860946,0x397f63f8,0xb9af604d,0xbaa216f3,0xb99171e7,0xb9294a9d,0xba8830bb,0xbb063644,0xbb434070,0xbb273931,0xbb1257a4,0x397179e3,0x3b79f3d4,0x3c18534f,0x3bd2f851,0xbb5a164d,0xbbd79afc,0xbb5b6c68,0x3bfaa8cf,0x3c060535,0x3c228e24,0x3c3e58e6,0x3abb20d1,0xba4c4305,0x3c3c40af, +0xbbd2e2ef,0xbc73cbdd,0xbc4dcec8,0xbb256dbd,0xb986dc6b,0xb9b1b77c,0xb8ea76af,0xb94aa0bd,0xb91c626e,0xb941346a,0xb9235d61,0xb91554d9,0xb9806679,0xb8a45308,0x3abcc358,0x3b3be703,0x3b63c47b,0x3b8170d6,0x3b5ab2ed,0x3b09554b,0x39d8497a,0xba7f1d55,0xbac8eb28,0xbac4b4f0,0xbb076c65, +0xbaec6b43,0xbaae010c,0x3b223526,0x3bd67e5e,0x3c4ff061,0x3b3cc4a4,0xbba41e29,0xbc291274,0xbbcafd6a,0x3b8b6159,0x3bfa7076,0x3c2e7882,0x3c31d03e,0x3bb7c9ed,0x3adf60c5,0xb94305b6,0x389b4d26,0x3994ab76,0x39411361,0x3993ce12,0x39a5aa7f,0x39939ea0,0x39200c91,0x3a1845d7,0x3abc936e, +0x3b3b0892,0x3b5c963b,0x3b330a11,0x3aff172b,0x3ac15b2f,0x3aac68f6,0x3ad0ff25,0x3ac0f2ba,0x3a9386a9,0x3a6e0b84,0xba819c87,0xbb07ed71,0xbb3288e5,0xbb8a673f,0xbbab7d7b,0xbba5bd16,0xbb4271a2,0x39a2ee43,0x3b0d8178,0x3b5d1eda,0x38fc9f2c,0xba8a3cd7,0xbb09c957,0xbb35598a,0xbb2c2e5a, +0xbb0542b8,0xbaafc044,0xba8cbd59,0xb9e8ac4a,0xb9e29730,0xba1ba845,0xba4c2625,0xba3c9ce2,0xb9be9b52,0x39e5868c,0x3a3d05ec,0x39efdfa9,0xba5e8b13,0xbac8ff53,0xbacc3f8c,0xbad74d47,0xbac801d9,0xba839124,0x39c3c47c,0x3aaa47a4,0x3aec4fb0,0x3b05081d,0x3b034762,0x3ad5e25b,0x3ac6ffb1, +0x3a0f6f50,0xbae1e94f,0xbb2d44c9,0xbb514537,0xbb0f43ab,0xba750f5a,0xbb2f2453,0xbb1c0f63,0xbac530ac,0xba8964dc,0xba152556,0xba159fcf,0xba25d2c1,0xba4c5dfd,0x38e2c3aa,0x3a44a70d,0x3ad00057,0x3ae1c7fd,0x3b14e9ac,0x3b306842,0x3b1555be,0x3aed06e4,0x3ad17d97,0x3a92dbac,0x3a12c96f, +0xb9515580,0x39c239d4,0x3a3a3b94,0x3a7b653c,0x3ab766ec,0x3af5aff6,0x3b1fb49e,0x3b2f76f6,0x3b3ad0d9,0x3b43ea48,0x3b13c464,0x3ace4aad,0x3a8cd4d7,0x398b8e2c,0xba356fbc,0xbb0bc76c,0xbb182613,0x3b5bde54,0x3b626a22,0x3b6937d4,0x3b4d397a,0x3b4c0111,0x3b41fe33,0x3b48ae69,0x3b4d25d5, +0x3b4ff427,0x3b4f71e2,0x3b529e7c,0x3b5429fe,0x3b5168ee,0x3b554159,0x3b2117a4,0x3b09099f,0x3ad69911,0x3a8db7c3,0x3992c148,0x39b68673,0x39fb46a8,0x39e5e9f7,0x3a00cb93,0x3a01a057,0x39f965bf,0x39e7817b,0x3a5848f7,0x3a971d26,0x3acb3061,0x3b014739,0x3b1e8c61,0x3b3720be,0x3b343665, +0x3b3ab81c,0x3b3f8c80,0x3b52339f,0x3ac7f65b,0x3ac6c5a1,0x3ac4f319,0x3ac11c9d,0x3aa23c36,0x3ad04076,0x3ab2ddbf,0x3a89827a,0x3a8a89ba,0x3a8a8770,0x3a84eff9,0x3a898146,0x3a87e6c0,0x3a966d22,0x3ab25a56,0x3abd74f0,0x3a000e28,0x3a5528e1,0x3a57cc1d,0x3a7321d1,0x3a5db03f,0x3a63fcdd, +0x3a647830,0x3a650934,0x3a6a4ada,0x3a5efbbc,0x3a83be2f,0x3a9035e6,0x3a9969c2,0x3aa63b7d,0x3aaf3632,0x3ac0f49f,0x3ac3fd51,0x3accfed8,0x3ad6785f,0x3accd0c1,0x3a9bf367,0xb94bd8d0,0x37a56fb6,0x38e34199,0xb7a08121,0xb8193430,0xb8b5df24,0xb8e00b04,0xb883d3f3,0xba118589,0xb8e072c2, +0xb91581fe,0xb9fdf643,0xb97e6b35,0xb96d475a,0xb9360e83,0xb9fbf56f,0xba08afc7,0x397e5f1b,0xb8bdf257,0xb90e0536,0xb929a44a,0xb864a888,0x37458634,0x39764b32,0x3874064d,0x37191010,0xb8a62b56,0xb8c9d975,0xb88fead8,0x3a035237,0xb9953b2d,0xb9c89f94,0xb9c7b32b,0x39098fef,0x3987bd40, +0x3885aa30,0x3849f051,0xb92f3818,0x38efc7a3,0xb979468b,0xba25cd95,0xba8e290c,0xb93e707a,0xb92d6a97,0xbacb8aff,0xb96a30c3,0xb97f66ec,0xbac96daa,0xba79c59e,0xba79b45f,0xba46b58f,0xba9ae364,0xba85e2c3,0x38b6adf8,0xb97a39c1,0x3972b0db,0x39be9b37,0x3a246e30,0x3a5db9a8,0x3a957ca1, +0x39e11825,0xb8e13b9b,0xba0a7244,0xba2effb9,0xb9396739,0x3ac8dd48,0xb9b00861,0xba32e55c,0xb9f16f8c,0x3a519c2c,0x3a7f21a7,0x38ccf763,0xb7e478cc,0x3a2177e6,0x3aac91c2,0x38889ba3,0xb9da40f1,0xbabfbad3,0x39752c4c,0xb93b532d,0xbb61aa83,0xbad55be3,0xbafe8f00,0xbb7bfece,0xbb103848, +0xbb12b73f,0xbafe8313,0xbb19da2a,0xbb23b4c9,0xb7678c55,0xba5350aa,0xb9582f28,0x39b91899,0x3a137459,0x3a907810,0x3b03016e,0x3a921bd5,0x3a39b664,0x38560cc2,0x392f2fdd,0x39839bac,0x3b4a2da4,0xba7b1670,0xba97bca1,0xba0bd723,0x3afc4eef,0x3b1ea016,0x3a84d7e2,0x3a931635,0xba45999b, +0x37e45c71,0xbaa5acdf,0xbb1b717a,0xbb8419cd,0xba015ab3,0xba2ebed1,0xbb325861,0xba31abf2,0xb9e1a7da,0xb91874e4,0xb91a35d5,0xb96d31aa,0xbaa5e3b1,0xbadc687c,0xbb2ff095,0xba742dfd,0xb995249b,0x3a61168e,0x3b1c3ff1,0x3b428bdb,0x3b7dedee,0x3b929c5b,0x3b0ea2e7,0xb9bd9407,0xbb12506d, +0xbb1d9375,0x39b1c144,0x3baa692c,0xb91fd083,0xbae0fbd3,0xb9667c16,0x3b634658,0x3b63ecfd,0xb7f2eb54,0xba08c706,0x3c230946,0x3bed43d2,0x3bc712c8,0x3bba0bc8,0x3bb60ea8,0x3b8dd79f,0x3b0b8046,0x3a335a0c,0x3a254414,0x390eac6a,0x399b05fb,0x380fbf55,0x39e16f13,0x369bd1bc,0x3ad9e31e, +0x3b161c90,0xbb2a80a7,0xbb9d9aff,0xbbcac76d,0xbbd69b1c,0xbc00f0a4,0xbbfbad6b,0xbba8fb3f,0xbaee6edb,0x3b6a2ce6,0x3c2aac9b,0x3bd844ae,0x3ac4a95e,0xbb5d6423,0xbb4709ca,0xbac3ea73,0x3ac68b92,0xba734279,0x3b0b77f3,0x3c14c321,0x3c2b6df6,0xbaf90f47,0xba05ca9b,0xbb38a8a7,0xbaef8394, +0x3aacb65e,0xba9e7c4d,0xbab979ec,0xb9520d1b,0xb994693f,0xb9034ab8,0xb9012fc9,0xb8d8a503,0xb90dfdb1,0xb92464a0,0xba20c402,0xba07c98a,0x3a1e66b5,0xba6400c1,0xba64ddc4,0x39c4babb,0x3b357c72,0x3b87c58f,0x3b6f86c8,0xb99a57d5,0xbb980f88,0xbc088c97,0xbc25a5a3,0xbba5e960,0x3b98854f, +0x3b7188c1,0x3aa1ec4c,0x39d554bd,0xbbfdfbae,0xbc1ceb4e,0xbbb04d5d,0xbb8f69ec,0x3aa32b59,0x3c14ff19,0x3b30da3d,0xba5bc9aa,0xbb87950b,0x396e4360,0x3a2f860f,0x38e4702f,0x39213133,0x38bd8159,0x38ab34ee,0x38cb48b0,0x38a49604,0x390f57c9,0x398c1a92,0x390a0e0b,0xba430e57,0x3990c199, +0x3a0950e0,0xb7dc651d,0xbacef818,0xbb38a723,0xbb184497,0xbb0df01f,0x3a462c52,0x3bb4653e,0x3c0d3c09,0x3b9216f3,0xbbc34262,0xbbc7ec41,0xbafedbee,0x3bf7000a,0x3c0c844d,0x3c1dc538,0x3c0e699f,0x3afeb00f,0xbbbc1c57,0x3bb5b486,0xbbd9c4c3,0xbc6480ef,0xbc4f052b,0xbb24f74b,0xb9315329, +0xb91b7465,0xb8c7baab,0xb8d08396,0xb8c58165,0xb8fe76ea,0xb8f12d65,0xb8a68732,0xb994b4b8,0xb9a37da1,0x3a120183,0x3b144b36,0x3b49c459,0x3b5e4ff5,0x3b253fdb,0x3a9bf319,0xba0a3d52,0xbb0e6adb,0xbb47d42b,0xbb3af364,0xbb4ea006,0xbb1a7123,0xbb18ea22,0x3b6b9718,0x3be821da,0x3c318ce1, +0xbaaa1eba,0xbc16fcb0,0xbc438b66,0xbc1d9508,0x3b7e6d28,0x3c167e1c,0x3c483376,0x3c477450,0x3baed35e,0x3b025905,0xb88697a2,0x39388161,0x393da02e,0x38f49b02,0x393cfed1,0x395d7d96,0x396fed00,0x38e7359d,0x39bcbb63,0x3aa06b9e,0x3b28dbf7,0x3b7c501c,0x3b69ac15,0x3b2e1276,0x3b00b17f, +0x3acbc061,0x3ad30985,0x3ab41f8b,0x3a5a4970,0x3962790d,0xbaf7f01b,0xbb49aa84,0xbb732d5c,0xbba55d1f,0xbbc08543,0xbbaeb23f,0xbb473fae,0xb97ffeef,0x3ab53fd0,0x3accc3a4,0x39d4bd14,0xb9c333f6,0xbad14d69,0xbb102ce8,0xbb11a466,0xbae59936,0xba98ca8f,0xba4e1ccd,0xb98618dd,0xb967db4e, +0xb9c4fd38,0xb9eed03a,0xba0b231f,0xb9e7af96,0x39388412,0x3a00f442,0x3a07caf8,0xba19e8e9,0xbaa6dfc8,0xbac8eb11,0xbae86f68,0xbaefadc8,0xbad0c1ed,0xba36943c,0xb969578b,0xb8a909e9,0x384360c6,0x37dae7f6,0xb97c2ebd,0xb81836f0,0xba0b1638,0xbb11ce33,0xbb2b2400,0xbb3bcb3d,0xbadf6d07, +0xba106b78,0xbb65f5ea,0xbb5e8634,0xbb210ef8,0xbb06775a,0xbac219bd,0xbab2a059,0xba9e2d73,0xba93c7ab,0xb9b0965e,0x38831e1d,0x3a57b76c,0x3a47e0ce,0x3abe39e3,0x3adf5305,0x3aefbda8,0x3ad25c5a,0x3adf382c,0x3a996113,0x3a24b53e,0xb912ebec,0x39e582b1,0x3a631590,0x3a9d3f79,0x3adf22cf, +0x3b12fb5b,0x3b3c6cc6,0x3b3171a7,0x3b23c7cd,0x3b11a1a3,0x3aa23a77,0x39971a36,0xb9f48b08,0xba8d079d,0xbaef8be8,0xbb450454,0xbb503f18,0x3b093ada,0x3b07aaae,0x3b387fb5,0x3b0dd9da,0x3b1f7540,0x3b1bce13,0x3b1f800d,0x3b294ce3,0x3b2e2274,0x3b3a8a0a,0x3b4ec248,0x3b5486f7,0x3b5d7969, +0x3b69fd84,0x3b41c942,0x3b24a33d,0x3b05820c,0x3acf83fc,0x3a8cde28,0x3a60875a,0x3a8034e5,0x3a6f361a,0x3a727401,0x3a6d31de,0x3a5d01d0,0x3a59d6b2,0x3a8337e5,0x3a9bd3f8,0x3abbe7dd,0x3ae1990b,0x3b040bf7,0x3b0d7126,0x3b055f8f,0x3b01c0e7,0x3afadc76,0x3b06965c,0x3ab1c80f,0x3a9afc72, +0x3ab8654f,0x3ac8e938,0x3ad69d3b,0x3ab85f07,0x3abe83a5,0x3ac1e0a8,0x3acec8f3,0x3ad4ad55,0x3ad20a5c,0x3ae0b4d6,0x3ae4e7ec,0x3afa5f5d,0x3ae230e0,0x3adb46d6,0x3ab3a30e,0x3ab0500a,0x3aa51900,0x3aa360d4,0x3aa20542,0x3aa451b3,0x3aa69e70,0x3aa85b20,0x3aabdc11,0x3aa9b97d,0x3ab30f5a, +0x3ab65bf4,0x3ab513fe,0x3ab53ad4,0x3ab3a5e6,0x3abb915c,0x3abaefe6,0x3abfa76b,0x3ac5112e,0x3ab7c4b8,0x3ac1b321,0xb9908019,0xb7b7fb7d,0x38c372de,0xb8f1479e,0xb96e194e,0xb9da8ec9,0xb93e275d,0xb95d27c7,0xba3e1c7d,0xb9ba8d56,0xb9b897ec,0xba1c2a99,0xba04ea3d,0xba0d03d3,0xb9c78937, +0xba2fa024,0xba23fde4,0xb8a3d6ba,0xb996b336,0xb9901ddd,0xb989454d,0xb92b2582,0xb8cce1c7,0x38fdd712,0xb90e0af5,0xb93c50ee,0xb9401687,0xb948def8,0xb9270a32,0x39b007c6,0xb9b7b089,0xb9d86352,0xb9b2d1cc,0x38dbdd55,0x3961a252,0xb80bd2cd,0x376e22df,0xb8c24cb6,0x391fcdb6,0xb9c3e191, +0xba100496,0xba87bcdc,0xb9966908,0xb95bf3f5,0xbaa9a506,0xb94e1fdb,0xb9c3bc4c,0xbad0b17c,0xbaad34b0,0xbaa5ffc2,0xba164c19,0xbabbe2ee,0xbaa5759d,0x387eea19,0xb9dfa856,0xb8e0b1db,0x38629fde,0x39b63bf0,0x3a038220,0x3a46ff76,0xb960efb5,0xba3a1539,0xba514f93,0xba4da315,0xb9851a77, +0x3a9cc39e,0xb9e25597,0xba2d9844,0xb98836ec,0x3a57059f,0x3a6d9679,0xb8a4d591,0xb79993a3,0x3a461ac7,0x3aace01c,0x38e61fb4,0xb9e123d1,0xbabaa7cb,0x388be9e2,0xb9584ac7,0xbb26820b,0xbaa94ea9,0xbab1bb4a,0xbb34421a,0xbaf2fe5a,0xbb0c5ac8,0xbab1cb9c,0xbb25a6c7,0xbb3428a5,0x384d41a0, +0xba8141c3,0xb9e29418,0xb8c97c20,0x3994780d,0x3a3f8610,0x3ad5ba9c,0x397bb903,0xb8fa653a,0xb97899ce,0xb6a88872,0x38e8cf7e,0x3b1f990a,0xba83b2bd,0xba80d444,0x363f85d1,0x3b07da3e,0x3b20f748,0x3a5aa9c0,0x3a9e6a6e,0xb9c13db6,0x393919f1,0xba79b09e,0xbb038487,0xbb562ae2,0xb9a548ee, +0xb9ba9e72,0xbabbfffa,0xb8a6cfae,0xb88da14f,0x39eabc5b,0x3952e449,0xb87122c7,0xb9f1bad5,0xbab541c6,0xbb2ba027,0xba5fe1d8,0xba456b71,0x395e73db,0x3ab85257,0x3b0b71fa,0x3b3d1c81,0x3b592adf,0x390b7752,0xbb149943,0xbb43665a,0xbb253e9f,0x39759e10,0x3b862a50,0xb9c85aa4,0xbaba6897, +0x3a1ca389,0x3b700ac8,0x3b574c2e,0xba0a897e,0xb9f3ac5c,0x3c21bb76,0x3bd8ec2a,0x3bb86253,0x3ba03b33,0x3b93ba69,0x3b4874eb,0x3a8bdb3a,0x393d6011,0x39902745,0xb7af64af,0xb86f2b0c,0xb8ed0593,0x396e8676,0xb7f228b4,0x3a9545f8,0x3b0cc6d6,0xba92bf23,0xbb6f5132,0xbbaea318,0xbbb788f8, +0xbbe024a2,0xbbd1dcdd,0xbb565db5,0x39a60799,0x3bb5aeb6,0x3c392e7d,0x3bdd6a1f,0x3aae095c,0xbb48d9f7,0xbb2a7760,0xba8257bb,0x3b0ed591,0xb99bcb9e,0x3b446cf7,0x3c2c8058,0x3c33cb97,0xb8faa67f,0x3a61fde7,0xbb122336,0xbacf8c5f,0x3a320321,0xba1a1fb7,0xba0f29c6,0xb884115f,0xb9099fc3, +0xb784c6b5,0x380880cd,0x36edb6ee,0xb899d6d4,0xb89c2977,0xb9e24319,0xba350ff9,0x39ccecec,0xba790407,0xbaba1ba3,0xba1fc62f,0x3af5f241,0x3b5a1b14,0x3b4e6053,0xba21db20,0xbb9ef27e,0xbc0a9be9,0xbc13f7c3,0xbb5c1123,0x3bc8a7e6,0x3b6b91e4,0x3a2c86a6,0xb534c936,0xbbfc1924,0xbc0ec650, +0xbb89943a,0xbb371c85,0x3b80be52,0x3c2f078f,0x3ba1dff4,0x3a24817f,0xbb3bd656,0x3937a71b,0x39cb0808,0x362e3d14,0x38ae7b65,0x372a76e6,0xb6ddae2f,0x379ebe0c,0x384002e7,0x38908ceb,0x396680f0,0x39c0345f,0xb99ebe3b,0x3a3cb321,0x3aa225cf,0x3a8a8fe7,0xba2806cd,0xbaf82377,0xbaa49999, +0xba85346d,0x3b1e247e,0x3c0529c6,0x3c0f60d5,0x3b6b0bc9,0xbbdeb5a2,0xbb8c2e8e,0x3a04b89c,0x3c01bc12,0x3c1ae550,0x3c1d0d8f,0x3bbb0610,0x3b3c0cac,0xbc1ca219,0xbae2614a,0xbbc6d71f,0xbc3504d1,0xbc344bed,0xbb093446,0xb7237739,0xb8a813f2,0xb84d5ba9,0xb7676415,0xb75ea6b1,0xb81d1224, +0xb8a0d7d6,0xb847d711,0xb9329689,0xb9c5ac8e,0xb92c6cdf,0x3acea605,0x3b297218,0x3b3b33f4,0x3b013b21,0x3a46b202,0xba4bd0bb,0xbb14f39f,0xbb58bde2,0xbb4955e4,0xbb42955a,0xbacee27e,0xbaf39247,0x3bbedd9f,0x3c05071a,0x3c075482,0xbb9ac2a2,0xbc439dc5,0xbc4ff555,0xbc357b52,0x3b5d1c9a, +0x3c3215ee,0x3c6039aa,0x3c4eb5df,0x3b9e8627,0x3b0f98f0,0xb710beca,0x3920a61f,0x3828ed22,0x378c04db,0x381e8dbf,0x38ae5012,0x390bfae6,0x38d91f8e,0x38e3d483,0x3a5cc721,0x3b0a2cef,0x3b8017e3,0x3b841ec1,0x3b607136,0x3b39e9b0,0x3b15626d,0x3b0b236b,0x3aec8990,0x3aa38777,0x3a0cb0c7, +0xbad4b7d8,0xbb3a2d42,0xbb622357,0xbb99d760,0xbbb16af3,0xbb9652bf,0xbb3ab3e0,0xba850bad,0x39292a52,0xb9b1fddb,0x3a8022d5,0x3a1c0da0,0xba500d35,0xbaa2e181,0xbacc64b6,0xba98383a,0xba43f510,0xb9aea3ab,0x36b6117f,0xb7094e26,0xb895287e,0xb9394a4d,0xb98a097c,0xb9b77668,0x379ff5de, +0x39b92684,0x3a27dbf8,0xb9541d56,0xba7a5db7,0xba9d3070,0xbab47bba,0xbacfb30a,0xbac8b0cb,0xba913089,0xba839f40,0xba903c16,0xba5a2ba8,0xba3a8734,0xba653542,0xba094670,0xba43b60d,0xbb05093d,0xbb01e0a3,0xbafecd8d,0xba5f82ad,0x3980ec7a,0xbb6ace3d,0xbb758ee1,0xbb4a5e06,0xbb356d41, +0xbb198d1e,0xbb07da8a,0xbae448d9,0xbac0d989,0xba5cb19f,0xb9fbea4b,0x38b7fa5e,0x384e9006,0x3a10a7ee,0x3a4d832c,0x3a951f4e,0x3aa014fc,0x3acab335,0x3a9801fd,0x3a3a6ce8,0x398629a7,0x3a637f9a,0x3aa04512,0x3ad07657,0x3b0e5e99,0x3b374007,0x3b630eaa,0x3b430ad5,0x3b21314e,0x3af68507, +0x3a544de3,0xb9703abf,0xba8fc567,0xbaca58b7,0xbb0ce6e7,0xbb4c3ee3,0xbb5a0621,0x3a809437,0x3a5dc7bd,0x3ac18a4f,0x3aa59203,0x3acf8451,0x3ad4725d,0x3ae7188c,0x3b001094,0x3b0c3c9c,0x3b1dd281,0x3b3632a4,0x3b45cf13,0x3b57aa38,0x3b6b0c8f,0x3b4c6e8a,0x3b34e704,0x3b1c6747,0x3b0383f0, +0x3abdbb27,0x3ac37349,0x3acd1126,0x3ac2922c,0x3abf11c2,0x3ab8c32c,0x3aab3e31,0x3aad1a9f,0x3aac582a,0x3ab5ee4c,0x3ac3f6ef,0x3ad5015d,0x3ae40fe7,0x3adba1dc,0x3abefd3b,0x3aa5b811,0x3a8ed56c,0x3a8bfda0,0x3ab69b4b,0x3a9e2f6e,0x3aad2507,0x3aaf65de,0x3aaed572,0x3abb9f76,0x3ab66197, +0x3ab02a0f,0x3ac37810,0x3acf9103,0x3ad45fed,0x3ae44bda,0x3aeb56ac,0x3b015365,0x3af61be7,0x3b00ad6d,0x3ac27c53,0x3ad5a610,0x3adbe623,0x3af1e2b4,0x3aea4b83,0x3aeeb26f,0x3af1bf57,0x3af3c2a8,0x3af6a822,0x3af5afed,0x3af55f1a,0x3af0669e,0x3ae66aea,0x3add9b39,0x3ad50a09,0x3ad579e0, +0x3ad1a699,0x3ad17673,0x3ad0eea6,0x3ac16f1d,0x3b04bf23,0xb9f03bbb,0xb92c2200,0xb8ddb08a,0xb9749828,0xb99a7456,0xb9d3c3d0,0xb9bc7ef2,0xb99a624e,0xba1a1a6c,0xb99beb92,0xb99446f0,0xb9f518c6,0xba02c71b,0xba0f03eb,0xb99260ee,0xba4cfdb7,0xba4ee188,0xb89cdaeb,0xb9c80c44,0xb9da1692, +0xba027c5e,0xb9bc34da,0xb9a2fa4c,0xb8e9aae2,0xb9e02ed5,0xb9ed4631,0xb9bcb2ba,0xb9a93e6e,0xb9964bb1,0x3894043c,0xb9fca942,0xba089ffd,0xb9d531f5,0xb849ce79,0x381cadf7,0xb981d171,0xb9160d03,0xb9462895,0x36812710,0xb999df8f,0xba21f068,0xba80ca35,0xb9cf902f,0xb99d6bb5,0xba81063f, +0xb994d68d,0xba0fa3b7,0xbaca2c74,0xbadeb072,0xbad2dda8,0xb9ee2f07,0xbacc5b3d,0xbabb52f7,0xb7c369c9,0xba22c64c,0xb99fbd63,0xb9bb4785,0xb81b9dcf,0x380bdd6a,0x395cd93f,0xba7efa65,0xbab49085,0xba8fdb79,0xba5839b5,0xb990357f,0x3a420ea1,0xba12a5b0,0xba3798ef,0xb9502575,0x3a23b29e, +0x3a1eb1ef,0xb9e12287,0xb9409557,0x3a2495c1,0x3a929778,0x3896f7bb,0xba0bde9a,0xbaa71fe8,0xb8d0a6e6,0xb9727a09,0xbad98ed5,0xba6bbe28,0xba612c5c,0xbae0d796,0xbac2b399,0xbaf6f516,0xba5f13eb,0xbb24145b,0xbb38b991,0x389030c1,0xba92393e,0xba31df9c,0xba20a9ca,0xb8e8a35e,0x39665b8c, +0x3a88ec7a,0xba46dbd9,0xba80af1d,0xb9edd25b,0x38844164,0x396c3f7c,0x3adf8430,0xba78d38d,0xba54c53d,0x39bee136,0x3afa01dc,0x3b0c13fe,0x39d4ca88,0x3a89f30f,0xb9a6feef,0x3942bb58,0xba355b7d,0xbae22434,0xbb23f84c,0xb9657258,0xb93ea383,0xb9e3ffd9,0x39208d09,0x395a9e24,0x39eae362, +0x3a06667b,0x392acfeb,0x3785ac88,0xba571e76,0xbb1698c8,0xba3ff582,0xba8e7dac,0xb9d1da69,0x39be7e3b,0x3a9a0a01,0x3ade8c8b,0x3aef4a2b,0xbb099f4b,0xbb88d31e,0xbb684b26,0xbb0f45f0,0x39e4732f,0x3b398dc2,0xba05dff3,0xba8ae5b7,0x3a9c825d,0x3b5d5d28,0x3b2a91b9,0xbaa923dc,0xba2ba526, +0x3c0cca10,0x3ba93ce5,0x3ba0f019,0x3b7a6c2a,0x3b4fc8f4,0x3af4f2f5,0x399c8210,0x387d3ae8,0x383562fd,0xb8f7b9ed,0xb9220214,0xb9605016,0xb6c1122b,0xb820bcc0,0x3a1260c0,0x3ad8fada,0x387c8453,0xbb1f4323,0xbb8f7949,0xbb9a40d5,0xbbbf0e04,0xbba70b1c,0xbabc0d0a,0x3b30d37f,0x3bfdb15c, +0x3c47e35b,0x3bf08b59,0x3af5a166,0xbaea55f9,0xbaf0a7e6,0xba1f2ccf,0x3b16d236,0xb8f39fb9,0x3b4c3995,0x3c2e5bfc,0x3c294df2,0xb917f608,0x3aceeb6e,0xbaa6de7e,0xba8f43e7,0x39a4c910,0xb91aaa3c,0xb9a488af,0x37ad2bd7,0xb8001787,0x38782672,0x38a94beb,0x38aebbd4,0x37acc746,0xb7bde1a1, +0xb98b5540,0xba20ec23,0x393ff9a9,0xba3c102b,0xbabed3fb,0xbaa927d6,0x3a8e8094,0x3b21abd0,0x3b182b74,0xbaa20b5d,0xbbaff0b3,0xbc0ea215,0xbc004061,0xbadba7d1,0x3bee1d30,0x3b626dcb,0xb8c8c8d8,0xbaaab276,0xbc059563,0xbc0c8a9b,0xbb8d0d55,0xbb2f89bd,0x3b9018de,0x3c2c2f59,0x3bdb0e89, +0x3aae29db,0xbb0b3cc5,0x39dec94a,0x393430b3,0xb7d0e35a,0x3759c10d,0xb832f4ea,0xb8432ce2,0xb82586df,0xb74bc2fb,0x37fb1284,0x38e923b1,0x39b69890,0x388d1c8e,0x3a64f879,0x3ad545fe,0x3adf1f37,0xb911f9b9,0xbaacd1ab,0xba54aea3,0xb98c3009,0x3b616d57,0x3c1a7c0a,0x3bf633f4,0x3ad244ee, +0xbc030668,0xbb488a32,0x3b161fa1,0x3bf1562e,0x3c1e172c,0x3c0f4b54,0x3b09f665,0x3b1218cc,0xbc45bc42,0xbc2ef2b5,0xbbd53648,0xbbfd9c0b,0xbc0a00c4,0xbaa3f043,0x38af2055,0xb82fa960,0x382040ef,0x382a1799,0x38297deb,0x38003780,0xb70d89bb,0xb707630e,0xb8ba2e6f,0xb9727c25,0xba193902, +0x3a4607f4,0x3afd3add,0x3afe06b8,0x3a6f64d4,0xb8da54d7,0xbac740bd,0xbb394dae,0xbb84fe89,0xbb81977e,0xbb6ed05f,0xbacda417,0xbac36ead,0x3beb9e24,0x3c035c9e,0x3b84e149,0xbbef3017,0xbc4e6a26,0xbc3ef829,0xbc2dd8da,0x3b224257,0x3c348188,0x3c5ad685,0x3c37f0d6,0x3b803567,0x3b031431, +0xb939201c,0x3861b601,0xb8b230aa,0xb8a2505f,0xb873d88f,0xb8038384,0x36b47202,0x388f625e,0xb8237673,0x39fa36a3,0x3acf4b04,0x3b721c15,0x3b914ce1,0x3b8076f6,0x3b5b195a,0x3b2b048a,0x3b07b23f,0x3ac8720f,0x3a67b805,0x39168d66,0xbaffcb4e,0xbb4fb7dd,0xbb74e0e8,0xbb9622c0,0xbb9db28b, +0xbb6e0f19,0xbb26fd8d,0xbaf32ed4,0xba96b658,0xbb11e903,0x3ac931a5,0x3ab098c0,0xb6f37814,0xb97c1071,0xba4c9fac,0xb9d9e9e7,0xb96ab509,0x38b8cf39,0x395bc6e4,0x395eff5c,0x38ed17c9,0x38bf183c,0xb7c29da7,0xb903340a,0xb7d7fdb3,0x399ddfed,0x3a56c64e,0x39a053a8,0xb9c5cc38,0xba470706, +0xba89e385,0xbabb6a3b,0xbae1caa5,0xbaed891a,0xbb085917,0xbb19d160,0xbafc4763,0xbad3b07b,0xbacfe3f2,0xba9d1ce3,0xba9a184a,0xbaebad27,0xbaa0a285,0xba4fc66c,0x399b4b02,0x3a9ada3e,0xbb52899a,0xbb6a8852,0xbb533e47,0xbb47d7f1,0xbb3578cb,0xbb1f558f,0xbb0057cb,0xbacb014b,0xba85bb2e, +0xba4a53f1,0xb9b717e4,0xb9e52085,0xb7f03857,0x38d471d6,0x3a19c288,0x3a550fd7,0x3aa73f76,0x3a9134cf,0x3a68a9ed,0x3a280333,0x3a85f9bc,0x3aa62310,0x3ac8b23c,0x3b07276a,0x3b2ad572,0x3b4e2cca,0x3b1fabb2,0x3adf993b,0x3a735866,0x38690168,0xba4dbf63,0xbac75fa7,0xbae14d48,0xbb07fb05, +0xbb31093f,0xbb44be81,0x38e6b257,0xb91d6e6e,0x3a031cac,0x39fcdeca,0x3a66b8ab,0x3a8376be,0x3a927d0f,0x3aacfcc9,0x3ac0dfc7,0x3aea980e,0x3b11bea8,0x3b238130,0x3b3a11e0,0x3b52304b,0x3b46507a,0x3b388103,0x3b2b51ee,0x3b1bb2da,0x3b01e030,0x3b073c87,0x3b0afe1b,0x3b088778,0x3b069963, +0x3b04cf9f,0x3afe1baf,0x3b03df3b,0x3af36b5c,0x3af10596,0x3aee7847,0x3aeb2a48,0x3ae14d00,0x3ac2c353,0x3a96ab81,0x3a55ae48,0x3a0d60c3,0x39b85149,0x3ac65ae5,0x3aa7dee1,0x3abdc6e0,0x3ac049af,0x3abf75a0,0x3ace2eea,0x3ad1a5bd,0x3ad6b023,0x3af09be0,0x3b003214,0x3b03e23b,0x3b0d2b42, +0x3b11bad8,0x3b1b921a,0x3b12106a,0x3b16f2a9,0x3b00b858,0x3b0a0333,0x3b0f013e,0x3b18bb02,0x3b16ee17,0x3b19ad23,0x3b1c313d,0x3b1dd297,0x3b1f6170,0x3b2070d2,0x3b1bec8d,0x3b161dd8,0x3b0e194c,0x3b064318,0x3aff4393,0x3afa02cd,0x3af24671,0x3aec9128,0x3ae44c3e,0x3ad36fa3,0x3b276ce1, +0xba2f697c,0xb9b5c826,0xb9a2fe3d,0xb9de2081,0xba006693,0xba164cd9,0xba156cce,0xb9f785d6,0xba1c4daf,0xb9d99b72,0xb9d7c086,0xba0650e2,0xba2fa20f,0xba3d971a,0xb9b74941,0xba7b7942,0xba80556e,0xb97fa770,0xba1648b9,0xba21ee1b,0xba418795,0xba1750a8,0xba0f7e08,0xb9d01658,0xba43d1ed, +0xba450df8,0xba170a5c,0xb9f85ee1,0xb9e44221,0xb987cdad,0xba26e67a,0xba273240,0xb9ee8303,0xb95532b0,0xb927474b,0xba050047,0xb9af61ec,0xb9ac20fd,0xb956ae41,0xb9eb6d0e,0xba406841,0xba87dde0,0xba24b35a,0xb9fbeaf1,0xba43cd14,0xb9d016c0,0xba34ce36,0xbac93800,0xbb05cf76,0xbafc1e16, +0xba00ba40,0xbae118d2,0xbad15e60,0xb93b338c,0xba5d5c5c,0xba199450,0xba46c33f,0xb9d65425,0xb9e57fd2,0xb9d65126,0xbae15d39,0xbb040c9d,0xbab8acb6,0xba5d949f,0xb9a31ade,0x392e2648,0xba3aee0b,0xba3dcbb9,0xb8a82f4a,0x39ec8423,0x39a642e5,0xba545e2d,0xb9c6fea3,0x3a0618e3,0x3a5eec3d, +0xb8b9ec3c,0xba37aea7,0xbaa4f040,0xb9c29a05,0xb9a113fa,0xba5a89cf,0xba0c60ba,0xb9e032b0,0xba52f923,0xba6b22b9,0xbac41dea,0xb9e1bd99,0xbb1765c9,0xbb34a27a,0xb883a939,0xbaa55d71,0xba7fb3dc,0xba93172e,0xb9fcaf9f,0xb9a57cec,0x399c4d71,0xbae92003,0xbaf23f22,0xba4048bc,0x39218145, +0x39bd5093,0x3a51aad3,0xba6e4afa,0xba1b5a8f,0x3a66c9b7,0x3aeff984,0x3af1ccbd,0xb9008102,0x3a5e4e48,0xb953f861,0x38c1ee88,0xba289c9d,0xbabf1acb,0xbaf57c47,0xb950f85d,0xb855f349,0x37a19a3d,0x392e8a8f,0x3924c91d,0x3998211b,0x39dd7cdf,0x399a6533,0x39628bd2,0xb973e0b0,0xbae41986, +0xba2b63db,0xbaabe86b,0xba79e6f1,0xba158cfc,0x39ad4295,0x3a0dfd25,0x3947119e,0xbb8a2e93,0xbbbfb340,0xbb81af3e,0xbad661b8,0x3a36e4d8,0x3ab0b064,0xba2e1cae,0xba1fb8f3,0x3afe7ebf,0x3b4cdb29,0x3afda2b5,0xbb06ee0d,0xba518d71,0x3bfcc46e,0x3b824b9d,0x3b7ba4c7,0x3b2c0397,0x3af47748, +0x3a5712c5,0xb8647e13,0x37fcb1b9,0xb892bc0f,0xb89206bf,0xb911e19d,0xb9407640,0xb8ec00d4,0xb8a81801,0x393b2dad,0x3a78a47e,0x3a59e57d,0xbab9ae12,0xbb670a39,0xbb842f64,0xbba319b6,0xbb839e97,0xb9025432,0x3b960d9b,0x3c164587,0x3c45094d,0x3beda46a,0x3b08272b,0xba436de1,0xba9d84ea, +0xb8626875,0x3b431480,0x3a86279c,0x3b847de6,0x3c325d97,0x3c1e44b1,0x3aa8856e,0x3b0b44b8,0xba58e6a6,0xba0d8ea7,0x397b24e6,0xb8c5094e,0xb926c3d8,0x38b9b89c,0xb68a6322,0x3881c93a,0x388d3000,0x38c0e57e,0x3877bd81,0x3806d514,0xb8ac5032,0xb9f8a173,0xb8001907,0xb9e48148,0xbaa31f96, +0xbad23bae,0x3a23a683,0x3ae73ed7,0x3abf8923,0xbb00ffc4,0xbbc339ac,0xbc10d7ea,0xbbdb68f2,0xba086460,0x3befaf53,0x3b42c6d2,0xba5fe37d,0xbb1f30b9,0xbc006ded,0xbbee40a5,0xbb3278bc,0xba80687d,0x3bcf8373,0x3c32725e,0x3bfca7bb,0x3ade51cf,0xbaf2df4d,0x3a441359,0xb8dc4396,0x37505023, +0xb84f1fef,0xb80edbe9,0xb86d9a78,0xb8605428,0xb81effd7,0xb7a46e91,0x38646cde,0x3957dcf4,0x394cbbcf,0x3a3dfe0c,0x3acca266,0x3b02a6ff,0x39c76467,0xba108f1e,0xb92f9278,0x3a6696b9,0x3b95d873,0x3c249603,0x3bc3d76e,0xb9b1a6dc,0xbc0fb225,0xbae22247,0x3b8cfa0c,0x3bf96520,0x3c2b8279, +0x3c0a0988,0xb997dd02,0x3b2e97df,0xbc441e9f,0xbc8d82ef,0xbbdab781,0xbb8f9553,0xbbb55d60,0xb97e24b8,0xb7d67c3d,0x38abd1a5,0x38149801,0x389be003,0x385ef7a7,0x3880361b,0x38083a54,0x37bad230,0xb7fa5a97,0xb828d21d,0xba37472d,0xb7ecd341,0x3a81d4be,0x3a5e53e5,0xb9250442,0xba6e86ca, +0xbb0ad41d,0xbb53ec83,0xbb901709,0xbb8855b7,0xbb6e3b46,0xba515b16,0x38af7be5,0x3c0e2681,0x3bfef1e0,0x34b6b3cb,0xbc0583d0,0xbc3776a8,0xbc1fd537,0xbc05347c,0x3ad303bf,0x3c2d0db6,0x3c441f5d,0x3c13b2ac,0x3b52a754,0x3ab6cd57,0xb9c31a12,0x378c7a6b,0xb936a5c9,0xb8c97d59,0xb8ef45ad, +0xb8ab7cba,0xb89f3192,0x370721c7,0xb888c104,0x38e6ad63,0x3a7e8627,0x3b4788a8,0x3b8ce1aa,0x3b843325,0x3b68383f,0x3b399822,0x3b10a8b9,0x3ac6c447,0x3a6a6973,0x3952df29,0xbad0c4d8,0xbb38afd6,0xbb65c2dd,0xbb8b99c2,0xbb872b22,0xbb2d34c2,0xbb1bf141,0xbb2dee5c,0xbb1b0b7d,0xbb62bba7, +0x3b14b17a,0x3b191dcf,0x3a76b75f,0x3a33e5b1,0xb79aad58,0x398079df,0x3901c3b2,0x39a0f0bc,0x399878e1,0x398df532,0x3956b576,0x3957b3a1,0x3909536a,0x388ad341,0xb77bf076,0x39860498,0x3a5a8d6e,0x3a33d259,0x38f26353,0xb9d969a4,0xba3fdad1,0xba9ec3be,0xbad471c0,0xbb05ca4d,0xbb27f843, +0xbb466ee5,0xbb21cc67,0xbb0a3ae5,0xbb07bb25,0xbae843ef,0xbad7b846,0xbae1454c,0xba3cac98,0x3971368c,0x3abd100c,0x3b1376b1,0xbb2c2ebd,0xbb481e5e,0xbb3edef9,0xbb36ea73,0xbb2e0046,0xbb178654,0xbae7587d,0xbaab3754,0xba7909a0,0xba44c8b3,0xba013e8d,0xba1e25be,0xb9cb5019,0xb9aa05f2, +0x38b8ec85,0x39c22508,0x3a61222f,0x3a71d886,0x3a740540,0x3a8ab55d,0x3aaaad77,0x3ab77a8b,0x3acc03ad,0x3b0288c4,0x3b208e84,0x3b3b95d7,0x3b06db61,0x3aa3c776,0x39dec31a,0xb981fc3b,0xba6578c6,0xbac28711,0xbacb77a8,0xbaec54e4,0xbb123f5b,0xbb25fc81,0xba2fad44,0xba8a1bde,0xb9d22ce6, +0xb9c245f5,0x38a28055,0x397cb685,0x3997a5eb,0x39fa9357,0x3a1e3a82,0x3a7256bd,0x3aae8658,0x3ad7ef3b,0x3b057be2,0x3b1f5c41,0x3b269a4e,0x3b26b008,0x3b26bbb7,0x3b24c7f2,0x3b18ddb0,0x3b207906,0x3b22357b,0x3b2287bc,0x3b21b749,0x3b20eaf7,0x3b1bad40,0x3b22af9f,0x3b111b21,0x3b0a3ca6, +0x3b018afe,0x3aed158d,0x3ace1c13,0x3aa0821b,0x3a523ebf,0x39cca331,0x386e7573,0xb98fe99d,0x3abe7ed2,0x3a9a065f,0x3ac1114c,0x3ac83b10,0x3ad074cc,0x3acb605e,0x3adcf8d7,0x3af02142,0x3b06dbeb,0x3b0ff059,0x3b15e875,0x3b1eb0cb,0x3b23fd51,0x3b2bda04,0x3b1f0a6a,0x3b20566c,0x3b1aca8f, +0x3b1e9efd,0x3b22ebc4,0x3b277d2f,0x3b280de2,0x3b2b468b,0x3b2e496b,0x3b30c637,0x3b33065c,0x3b35fec4,0x3b2d3025,0x3b244f46,0x3b19b3d0,0x3b0f83bc,0x3b07148e,0x3b01ba68,0x3af88aa8,0x3aed575c,0x3addf957,0x3acc2778,0x3b35423d,0xba5d6927,0xb9ec0198,0xb9e9dd5c,0xba1b06c9,0xba318cd8, +0xba454c8e,0xba4756a9,0xba2c55de,0xba192e98,0xba09dc72,0xba10c195,0xba219f6c,0xba5fac4f,0xba6544c7,0xb9e40eb1,0xba9101cd,0xba95ba08,0xb9eff0a9,0xba4eba32,0xba597963,0xba74e25a,0xba48bcb2,0xba456f40,0xba2fe91c,0xba84fe53,0xba83063e,0xba4986fe,0xba1dc1d2,0xba174f45,0xba224c58, +0xba52712c,0xba4728a9,0xba02c128,0xb9b99c2d,0xb9ac7137,0xba313906,0xb9e84002,0xb9a3f833,0xb99df45b,0xba1840e0,0xba525072,0xba8657b1,0xba4fc95b,0xba1f4aad,0xb9facd83,0xb9ea1b98,0xba3e332b,0xbaae7f31,0xbb0c89cc,0xbb0b32b4,0xba1d0c74,0xbaed37d9,0xbada674b,0xb9b4031f,0xba85fabd, +0xba618642,0xba91ae54,0xba42e208,0xba665523,0xba879f29,0xbb193a37,0xbb242cf7,0xbadada0d,0xba5cc0f2,0xb9cbb2aa,0xba0c3396,0xba7e1237,0xba5ccd6a,0xb7c39047,0x395d3108,0x381b68b9,0xba8503ed,0xb9da192f,0x3a31c3c9,0x3a432e79,0xb8e85501,0xba315782,0xba935b5a,0xba11526b,0xb9a77588, +0xb95d5a45,0xb9809a79,0xb8f218f6,0xb99a61be,0xb9ba638f,0xba673a69,0xb915673a,0xbafa3c56,0xbb262899,0xb986b6e4,0xbab33292,0xbaa41ac8,0xbad09f3a,0xba5800ce,0xba5a12f9,0xba08c81c,0xbb2d3f3d,0xbb279c68,0xba8966cd,0x39360655,0x39a71197,0xb9dcf305,0xba9186ae,0xba1c1fbe,0x3aa35a3e, +0x3acf9d0e,0x3ac9984b,0xb9b4ad54,0x3a6f011f,0x3968b73d,0x395b378c,0xb9f63d94,0xba91e709,0xbaa81bd8,0xb91fca2e,0x386c3e40,0x388d7091,0x389a0f4d,0x38ce40ea,0x391577e0,0x39933abb,0x3989e470,0x394cd13b,0x397784ee,0xba8b5c58,0xba20e1a2,0xbab77427,0xbab351cf,0xbab8d64b,0xb9f734b8, +0xba224e4a,0xbaccff33,0xbbc57232,0xbbe98ae8,0xbb8c7c34,0xba95fe8b,0x3a2e90f1,0xba1b0067,0xbaa6d16d,0xba1412a1,0x3b1ca77d,0x3b28aaca,0x3aa072b7,0xbb1adf1b,0xba15520f,0x3be3861b,0x3b61916f,0x3b5d356e,0x3af61d6a,0x3a847fa3,0x398398b9,0xb8762e40,0xb7d4d02d,0xb82c3f9c,0xb857d05c, +0xb89d82f1,0xb9185a5c,0xb8d79d44,0xb9140506,0x385490a7,0x39ca85a6,0x3a8981fd,0xba2a6c4d,0xbb37b4ac,0xbb67d35a,0xbb8712a8,0xbb3c0e9e,0x3a8c3ef4,0x3bcf3b70,0x3c26cb40,0x3c35fa58,0x3bd47081,0x3aec01cd,0xb8f37d89,0xba2c60c0,0x39cdebf9,0x3b5a8465,0x3b020018,0x3b9ff4fd,0x3c365d3b, +0x3c14fb9c,0x3affd1c0,0x3b37cca3,0x39ac7106,0x39683904,0x397ecc88,0xb9019ef4,0xb7e61331,0x3881e905,0x371b8fb2,0x383597b7,0x383a4032,0x389909e8,0x388aed12,0x3863944c,0xb6ea91c6,0xb9878e11,0xb93d48ef,0xb92b1196,0xba4c75bf,0xbacf251b,0x396962a4,0x3a71e868,0x39905154,0xbb45c970, +0xbbd8e1e1,0xbc0ea02b,0xbbb096c7,0x3a11f2b2,0x3be4daad,0x3b3a3b1c,0xba7bca05,0xbb4444ee,0xbbede27c,0xbbcb1552,0xbaf5eb30,0x3926d6b0,0x3bbfc01f,0x3c2ce793,0x3c0d73fc,0x3ace9524,0xba9b48b5,0x3a2a20d4,0xb97a204a,0x384f6eb9,0xb890aaa8,0xb7a1cf8e,0xb84fb974,0xb83e8599,0xb856812e, +0xb8076fbd,0xb695bc3d,0x38c6528e,0x39608ddf,0x39cfc1ad,0x3a96aad0,0x3af45e42,0x3a4618ac,0x39989330,0x3a36ae4a,0x3b254af1,0x3bc26b38,0x3c25d2b6,0x3b944f85,0xbae49de0,0xbc0cdf82,0xb8ac9879,0x3bcbb000,0x3bf963f0,0x3c2ca633,0x3beb0212,0xbb59f74e,0x3ab6e65f,0xbc40cb87,0xbcb92fdd, +0xbbe9166a,0xbb12e02b,0xbb313e86,0x39743d83,0xb885afe3,0x39065f06,0x37c33f14,0x389ee03e,0x3841ad4c,0x3889da1d,0x38468fc6,0x38673317,0xb7b8111e,0x38a34e28,0xba073cbd,0xba2591b8,0xb7a93bae,0xb98bfd8a,0xba8d5f64,0xbacecd9f,0xbb2a76eb,0xbb6420b1,0xbb91db56,0xbb83f075,0xbb6cb4bd, +0xb919a5b1,0x3b07e3f8,0x3c172a00,0x3bd66221,0xbb87b1ee,0xbc0af1cb,0xbc15f3bf,0xbbf6001b,0xbbbb44dd,0x3858f197,0x3bfbc562,0x3c0bde1e,0x3bbe08ab,0x3b1a4169,0x39e3a819,0xb9b865a8,0xb80a84b3,0xb925b055,0xb8c3f22f,0xb8e5eb8e,0xb8cd3fe3,0xb8cc3eea,0xb884e408,0xb83a9500,0xb8939941, +0x39e758a4,0x3b1586de,0x3b746791,0x3b80b7eb,0x3b71d283,0x3b4a9d74,0x3b21df62,0x3abfda87,0x3a380de9,0xb86166a7,0xbace782b,0xbb39af28,0xbb6d1b84,0xbb8525d7,0xbb620458,0xbaec8d93,0xbb1f4f3b,0xbb6e25b1,0xbb7eaffb,0xbb95ab7b,0x3b2cfcba,0x3b3b3139,0x3add4de0,0x3aaa3f17,0x3a1f37bc, +0x3a2683df,0x39899ed5,0x39a76d9a,0x397eab5c,0x397dd62b,0x394d9721,0x3969ab7e,0x393ab68b,0x39353699,0x38728fc5,0x39469af9,0x3a42822d,0x3a7ef8a1,0x3a210339,0x38e0cb0e,0xb9a045e5,0xba619902,0xbab24493,0xbb015462,0xbb2f8af1,0xbb5fadaa,0xbb39803b,0xbb23cf32,0xbb24157a,0xbb16facd, +0xbb0ba550,0xbad492d1,0xb9e528b3,0x3a5b247b,0x3b025c1d,0x3b3a17ef,0xbb10f81d,0xbb28c831,0xbb263c29,0xbb208664,0xbb1e66d6,0xbb02eb0c,0xbab64a37,0xba6a3632,0xba2630a2,0xba05978f,0xb9dba426,0xba088160,0xb9e58497,0xba00c0fc,0xb9838339,0x377b6099,0x39f60e2b,0x3a342234,0x3a7a1ea5, +0x3aa61e5f,0x3aa0cefe,0x3aa0fdaf,0x3aa01b49,0x3ac4e093,0x3aeb8993,0x3b05bf9b,0x3aa49b3a,0x39fb1389,0xb99217a1,0xba343270,0xba8a7732,0xbac553e9,0xbac3cb30,0xbadb7596,0xbb01c6fe,0xbb125e3b,0xbab04251,0xbaee2fd3,0xba9e7c63,0xba97f6af,0xba39d51a,0xba0cbec4,0xba105a59,0xb9cc5c54, +0xb99eeb45,0x35e63960,0x39cd92ee,0x3a3226b7,0x3a8abae1,0x3abe9d5b,0x3aef71af,0x3b017aca,0x3b0c2072,0x3b169284,0x3b21a25a,0x3b22b047,0x3b22043e,0x3b248b09,0x3b23fc73,0x3b245ea0,0x3b204bef,0x3b282016,0x3b0ff806,0x3b03e751,0x3ae9e4dc,0x3ac3fab9,0x3a94819b,0x3a3c7b7f,0x399095b2, +0xb9159bba,0xb9f5ff26,0xba649bf9,0x3a922bd4,0x3a5aa41e,0x3a9b938f,0x3aa95762,0x3ac24d4f,0x3a9c6d48,0x3abe02ba,0x3ae19234,0x3b0011fa,0x3b0961ba,0x3b104ebb,0x3b197695,0x3b2039cc,0x3b267400,0x3b134b4d,0x3b0dcb50,0x3b23c2e0,0x3b1bd42c,0x3b1c30d4,0x3b18bbc0,0x3b1c9e2b,0x3b1ea129, +0x3b21475a,0x3b235cf7,0x3b2502f8,0x3b288eb0,0x3b1d7138,0x3b131e87,0x3b0791a5,0x3af99e7f,0x3ae839eb,0x3ada69b9,0x3acf5429,0x3ac16ebe,0x3aae7f08,0x3a9dad66,0x3b242c1e,0xba72db93,0xba0c00f8,0xba17f5de,0xba2e64e7,0xba43caf1,0xba5aaee6,0xba5b3c34,0xba3f226a,0xba0f46d5,0xba2022a6, +0xba2fab8f,0xba38e0c8,0xba85f3b0,0xba84ce9e,0xba08e424,0xba9001b0,0xba95c18f,0xba24768a,0xba6843ce,0xba6f6e4e,0xba86c13e,0xba64605e,0xba645c26,0xba610336,0xba96bbcb,0xba91a555,0xba5e6f47,0xba242326,0xba20088b,0xba5dbdb1,0xba59ac36,0xba4430a0,0xb9de08c2,0xb9e189bd,0xb9eda1e4, +0xba5632ab,0xba0d7a8d,0xb9d4cd43,0xb9ec89b6,0xba195219,0xba5a61ed,0xba73c6e9,0xba6b2998,0xba319f77,0xb945747e,0xb9cad4e9,0xba1f865a,0xba8790eb,0xbafa0e4e,0xbb024d13,0xba332da8,0xbaf1f8c5,0xbad99cea,0xb9eb4460,0xba8d3000,0xba86854b,0xbaac2c6e,0xba7fb0c8,0xba9caa9b,0xbac64892, +0xbb2e5e2c,0xbb2fa01c,0xbae0969b,0xba37a183,0xb9b3104c,0xba8552bf,0xba7dc90e,0xba3913a6,0x396ebfb4,0x388e4a0f,0xb968377b,0xbaa25ade,0xba0c01fa,0x39fb6c9f,0x39e2a43d,0xb919f789,0xba337418,0xba802424,0xba263c21,0xb97930f3,0x38f8908e,0xb8c1eff3,0x384b8e88,0x37f6bf4d,0x38f9c9c7, +0xb9c1e224,0x38f9d075,0xbaa6e455,0xbb07d02a,0xb9eee6f2,0xbab3782e,0xbab7ebe0,0xbaf58baa,0xba8b0778,0xbaa04bd8,0xba9e8333,0xbb4bdf05,0xbb3ae961,0xba9217fe,0x39b6aabb,0x39eb69a3,0xbaa701f0,0xba720584,0xb97ad7f1,0x3af2fdb3,0x3ab4e355,0x3a90f37e,0xba4ec928,0x3a28ee54,0x38af8aa8, +0x37a1c845,0xb9c8d522,0xba6add8d,0xba58a199,0xb7974d10,0x38b10969,0xb7b92cd6,0x37d950a0,0x379d8eb7,0xb7a1143c,0x38412d11,0x391cb812,0x384548d8,0x39e6bf5f,0xb9d7c4ea,0xba06fde8,0xbab3c98e,0xbad88a93,0xbb035eda,0xba8e857b,0xbad01680,0xbb4729bb,0xbbe7c3b9,0xbbf7a2fa,0xbb87b587, +0xba03f322,0x3a3b11a4,0xbb089642,0xbaaf7d80,0x37fffa14,0x3b52ce74,0x3b0c73ad,0x39e29d45,0xbb3c1963,0xba3f9272,0x3ba7cbad,0x3b1efd53,0x3b293cc9,0x3a9c1f90,0x39c1e427,0x35c2f5a6,0xb7cc6bae,0xb722ee6c,0xb6ca311e,0xb78472a2,0x37129b71,0xb83c2ecb,0xb82dd121,0xb8cf4093,0xb872e668, +0x37eec41d,0x3a6c2e49,0xb787b22f,0xbb09d4e4,0xbb46f645,0xbb52b21a,0xbae0f673,0x3b0abc18,0x3bfb7a53,0x3c2f4eb5,0x3c2250cb,0x3bc0613b,0x3b07f982,0x3a9adbda,0x3a0159b7,0x3a9ec95c,0x3b6dc075,0x3b326ed0,0x3ba7d262,0x3c263f6b,0x3bed9dfc,0x3b169636,0x3b265e8f,0x3a43316d,0x3a2db38f, +0x38ad203c,0xb8bcd9be,0x384528a7,0x37868a15,0x36df172b,0x37552205,0x367fdafd,0x37b9a65b,0x381542c8,0x3826d428,0x3889dcb3,0xb8ce02d0,0xb98efd07,0x38088807,0xb99d7a92,0xba98927c,0x38f4865c,0x399cab6a,0xba2cce16,0xbb6c482d,0xbbd17d05,0xbbf02e69,0xbb52d281,0x3b082eb0,0x3bdf071b, +0x3b3f7393,0xba60288d,0xbb624ed7,0xbbc9dc8a,0xbb961b1c,0xb9d7d4ca,0x3aabdcaf,0x3bc7b8a9,0x3c1f0da5,0x3c0285d5,0x3a964ce9,0xba4519b8,0x39cb1788,0xb94ecf58,0x383ca00e,0xb8417dc3,0xb65283fd,0xb78fa5d0,0xb79b5efd,0xb80059df,0xb812fa5d,0xb7f7bab8,0x379b5896,0x3935d778,0x391ea3b9, +0x3a315c06,0x3ae14ea4,0x3ab25bc1,0x3ab90edb,0x3af834ae,0x3b8ed063,0x3be86d60,0x3c1a58a3,0x3b451504,0xbb3a405e,0xbc0210ed,0x3a73ff05,0x3be1e62f,0x3bde2811,0x3c211f9a,0x3bc2715c,0xbb8b570e,0x3a9b04b1,0xbc195f41,0xbcc27b5d,0xbbf5d673,0xba60e886,0xba646ab7,0x3947f724,0x37ab2505, +0x388ad054,0x37df4df0,0x380ffeae,0x37ac8704,0x380dea1d,0x38255ef1,0x385a3c56,0x37ae352f,0x38980b9b,0xb943538b,0xba5e3214,0xba5097f1,0xba960321,0xbaeff803,0xbb0c85e6,0xbb424566,0xbb7412ca,0xbb92e589,0xbb7e08e0,0xbb6b6a67,0x392df30a,0x3b69ada5,0x3c08279f,0x3b8dfdb5,0xbbeca200, +0xbbfa072d,0xbbcbbf2a,0xbb955093,0xbb2bcef5,0xba7dfce8,0x3b82e912,0x3b8f921a,0x3b376717,0x3ac4f5bb,0xb9c2f1f9,0xb8c13ce1,0xb8c3a52a,0xb8ae6836,0xb864ddeb,0xb849440e,0xb87f76b6,0xb89e8906,0xb8be5a3c,0xb8397edd,0xb9070e17,0x3892e92d,0x3ad31e40,0x3b508107,0x3b77cb6e,0x3b6e0d0e, +0x3b4b83bc,0x3b1c7128,0x3a96c978,0x398968c1,0xba06d2c0,0xbadfb950,0xbb3f679e,0xbb7273e1,0xbb8156ed,0xbb41c775,0xbaa050a1,0xbb13804c,0xbb7a3089,0xbb9159e0,0xbb912e3f,0x3b4e9f0f,0x3b6583df,0x3b114747,0x3acd5ce8,0x3a78ed7d,0x3a16e864,0x3974d69a,0x3966ed2f,0x392be593,0x38f10df8, +0x38bc02d4,0x3905e182,0x39227cd8,0x3948c64b,0x3907e1d5,0x3929bfd9,0x3a1ac538,0x3a943487,0x3a8ac1d2,0x3a1fd523,0x388a557e,0xba18a201,0xbaa4aa8d,0xbaf64330,0xbb2d6efc,0xbb6a60c6,0xbb451184,0xbb351482,0xbb3b8c6a,0xbb2d8ee9,0xbb1b86c9,0xbabb762a,0xb98d8bc0,0x3aa0a907,0x3b1edbf6, +0x3b5cb72b,0xbaddf19b,0xbb023443,0xbb04e988,0xbafa2fbb,0xbb01195c,0xbabffca1,0xba75719e,0xb9e96f3d,0xb9ade297,0xb9474951,0xb9262341,0xb97e7698,0xb9b7e02a,0xb9e260bd,0xb9faf40e,0xb9b19e13,0xb7b98a2a,0x394ab091,0x3a130dd2,0x3a7f8b04,0x3a4779c0,0x3a3828d2,0x3a1cf562,0x3a3663b3, +0x3a51fcc8,0x3a5deae6,0x399bc8c6,0xb9851a21,0xba45c4be,0xba756f6d,0xba8fad61,0xbab77391,0xbaab38c7,0xbaba8b65,0xbad5302e,0xbaee5842,0xbad0d330,0xbb08287f,0xbae894c8,0xbacfb8e6,0xbaa4c00a,0xba925f10,0xba921499,0xba80cb8b,0xba600950,0xba1b43f3,0xb9a25bef,0xb82e523d,0x39904fa2, +0x3a1fd11a,0x3a8d5c75,0x3ab0bea4,0x3ad4a055,0x3afaf8cc,0x3b14ace0,0x3b191d10,0x3b150734,0x3b15b812,0x3b138732,0x3b12866f,0x3b0eaabd,0x3b13e6de,0x3af8a28d,0x3add1a71,0x3abca140,0x3a91b112,0x3a405a6f,0x39b4be0b,0xb890c746,0xb9e73dc1,0xba3b5394,0xba92e99d,0x3a3eaf6b,0x3a06ff20, +0x3a55a4d2,0x3a693a7b,0x3a8c59e4,0x3a4fbaf3,0x3a864ca6,0x3aa469f5,0x3abe3676,0x3acf1d79,0x3ae00acb,0x3af1652a,0x3b011360,0x3b0759e8,0x3aeee078,0x3ae116ba,0x3b0ea85d,0x3b044938,0x3b03afe7,0x3afe6fcb,0x3b02b971,0x3b03ad4c,0x3b0534aa,0x3b06540b,0x3b06c66c,0x3b093df6,0x3afc27c7, +0x3ae806dc,0x3ad27a71,0x3abffd9b,0x3ab0fa46,0x3aa3fec2,0x3a99b080,0x3a8b4798,0x3a6f03a8,0x3a52813b,0x3b041b99,0xba7707eb,0xba1753cb,0xba2989ca,0xba46e961,0xba5dbc57,0xba6d6730,0xba68baa8,0xba52c54a,0xba02ceca,0xba2ea9ac,0xba411a7d,0xba46b697,0xba92544b,0xba91be24,0xba21c8db, +0xba8c6f6c,0xba8f1cb1,0xba45c7cd,0xba7ccb69,0xba7ce18e,0xba851d22,0xba6bd960,0xba6eb16d,0xba7d1608,0xba9934ab,0xba91a57d,0xba5fc116,0xba1f98fb,0xba20bfc4,0xba83ec0d,0xba592983,0xba3b6f82,0xb9b0dd2b,0xb9f71762,0xba0a2417,0xba64be02,0xba186bae,0xb9ecdeb5,0xba1e2012,0xba3f1992, +0xba5f0f46,0xba652632,0xba7c830d,0xba314cac,0x385073f6,0xb9924b4a,0xb9f8b3d6,0xba410f75,0xbac41555,0xbad711ee,0xba34a979,0xbae6efbb,0xbad18523,0xba0c9c3e,0xba863dbb,0xba907c10,0xbab2ab62,0xba8e2b7e,0xbab4abaa,0xbaef826c,0xbb30efd1,0xbb299124,0xbad52ae4,0xba100c33,0xb9aaa7b0, +0xbabab686,0xba8178c1,0xba21bde5,0x39d4eadf,0xb863a434,0xb9d4dcd4,0xbaac857e,0xba1ba8e4,0x39c61085,0x3856ea81,0xb9a87c79,0xba385733,0xba6f93b0,0xba2844ef,0xb91e7d6e,0x39289ec3,0xb7cf7d3b,0x38fc1633,0x390e6e25,0x39972987,0x389f9fa3,0x3965c0bf,0xba1b7563,0xbabd9d47,0xba1a2959, +0xbaa4c473,0xbab68f8e,0xbaf973f4,0xba949029,0xbabb5ccb,0xbadfae88,0xbb4eca22,0xbb346f36,0xba882e42,0x3a038974,0x39fb92e8,0xbb01ba73,0xba578651,0xb856a51c,0x3b118985,0x3a91a347,0x3a4148d7,0xba8333e2,0x39e8fa8b,0x38b7e169,0xb9b39bf4,0xba115ccb,0xba44e92a,0xba0c971d,0x390a9f3d, +0x38af2388,0xb83ae6eb,0xb6a05954,0xb7ce2d41,0xb8524d7b,0xb88a7fb6,0xb70f1c16,0xb87a3738,0x39c38c6e,0x381090f9,0xb9ba651b,0xba9a14a2,0xbadec164,0xbb121e9b,0xbabe1bf0,0xbb156920,0xbb870c62,0xbbef424c,0xbbec716c,0xbb738737,0x380d056e,0x3a1b59e1,0xbb5ac327,0xbac831c5,0x39a2a0eb, +0x3b6e9129,0x3adad2b4,0xb95975b8,0xbb44c593,0xba4ce8ca,0x3b84224c,0x3b073e51,0x3afd6904,0x3a3fef9d,0x3858bd68,0x381877b8,0xb887c51f,0x377fa55d,0x3676e874,0x36e50fc9,0x37d37c63,0x37645478,0x37a39dcd,0xb7cea64b,0xb8de3246,0xb8b1a318,0x39fd8823,0x39d3ba70,0xbab6d148,0xbb1bb8c1, +0xbb0a981c,0xb9ea61cd,0x3b4b1ed0,0x3c0be37a,0x3c2fc9e1,0x3c0e8db7,0x3baeff3f,0x3b219244,0x3b0f2402,0x3acddf5e,0x3af92b44,0x3b5dc297,0x3b577e0d,0x3bb26983,0x3c1c797b,0x3bc24de2,0x3b3c9e81,0x3b22341a,0x3a906ee1,0x3a3b0a45,0xb8c3227c,0x37a73d91,0x376a5ee0,0x375a4d3e,0xb715a0de, +0x35507a1f,0xb73c9244,0xb6a1dabb,0xb699df6e,0x3795c11b,0x385f9893,0x382582c7,0xb9850aa6,0x38bac68b,0x395b0871,0xba1dba70,0xb8407fb9,0xb9e6bb1d,0xbae836e0,0xbb91d6b1,0xbbd0f853,0xbbcc12ee,0xbaf17413,0x3b233f0c,0x3bae2830,0x3b186c67,0xba6c4372,0xbb6551ea,0xbba0f4fd,0xbb49ccd7, +0x3a66e334,0x3b2426a7,0x3ba463eb,0x3c11cf08,0x3befa875,0x3a521f7c,0xb9c98377,0x39310662,0xb8ed5a66,0x37de1e6d,0xb786a026,0x36dfbc15,0xb48d6f9d,0x3329d134,0xb62a36f1,0xb7c48afc,0xb7dd952c,0xb86d6958,0x392d20a9,0xb6b9af98,0x39995353,0x3ab39782,0x3ace4569,0x3b093c8a,0x3b28f645, +0x3bada9b7,0x3be65723,0x3bf0029a,0x3a724a5b,0xbb83b608,0xbbec2b3e,0x3ab10e64,0x3bdbac78,0x3bbda0ef,0x3c057aa5,0x3b7d1b2c,0xbbb70270,0x38c2043d,0xbbfa30ff,0xbcb716a6,0xbbeaffc8,0xb9213e24,0xb8794e7a,0x388c2d99,0x385992da,0x378abc72,0x37056857,0x34b0aa74,0x36808cb3,0x36ca0eb8, +0x377354a6,0x37e7946b,0x384731dc,0x37a796b8,0x38b0ce0c,0xba4e4a58,0xbaacf81f,0xbb001836,0xbb24fce3,0xbb31a8e3,0xbb5f2d70,0xbb80da97,0xbb9025d5,0xbb6fe8fd,0xbb54262d,0x3a353618,0x3ba8a97e,0x3be0e16d,0x3b0b178b,0xbc0ac4c3,0xbbc8273f,0xbb670eb3,0xbb1e67f1,0xba56a412,0xbacc66fd, +0xb9ed23f3,0x39af33ec,0x39fbb9ff,0x3a29ae8a,0xb9e18728,0x37b96d97,0xb8bec95c,0x37288406,0xb75f46c1,0xb65f3459,0xb7aa5165,0xb7d08b6e,0xb87e46e5,0xb8961f1a,0xb894cf2f,0xb92d66e4,0x3a7e472c,0x3b247c4b,0x3b564f40,0x3b511d53,0x3b379d2c,0x3b0dc758,0x3a6e9ae2,0x379c84fd,0xba3bbd5e, +0xbac2dc0d,0xbb2879eb,0xbb523e83,0xbb537bad,0xbb0753a8,0xba1f7d7d,0xbae23d7c,0xbb5922c4,0xbb8c7ef2,0xbb5cf4b9,0x3b5459eb,0x3b6e7ce3,0x3b29cdf3,0x3ad9a140,0x3a7fa478,0x3994a91f,0x39613786,0x3883efac,0x37a5315b,0xb681ebcd,0x372a7a03,0x380af02e,0x38564b89,0x38e4a05d,0x3933f877, +0x39159261,0x39be8cf1,0x3a9309e3,0x3aa77bbb,0x3a8587b9,0x39e29a1f,0xb9723bde,0xba71fe83,0xbab8c57b,0xbb0c08be,0xbb505744,0xbb362a51,0xbb2e914d,0xbb38d5ea,0xbb2c36da,0xbb185eee,0xba9683b4,0xb93de3f1,0x3aace113,0x3b1c9332,0x3b5cf335,0xba9f8381,0xbaba4fef,0xbac60524,0xbab5147b, +0xbab54f69,0xba6c2f5d,0xb9fb269c,0xb80bb366,0x378f1705,0x38b85dc3,0x381b0d01,0xb797f497,0xb8aa7cfa,0xb93a8095,0xb9e74f9b,0xb9f639b0,0xb990a54a,0xb92292c5,0x392c2ed8,0x3a25d055,0x39b40f7b,0x3977d321,0x38873a2f,0x376ac97a,0xb7ac517a,0xb8d8dfdd,0xb9cd3e8f,0xba37dac4,0xba771699, +0xba7787bb,0xba76d2a0,0xba9155d5,0xba83f2d6,0xba8f7e48,0xba9ff8dc,0xbab141c9,0xbaca1556,0xbb016a85,0xbaf3dba7,0xbad72e6f,0xbac00ad5,0xbab1cb6a,0xbaaef10b,0xba9fedd7,0xba8dd2d5,0xba669e1a,0xba2f2902,0xb9f614bf,0xb9904b05,0xb8151a71,0x39e29ae0,0x3a4c8364,0x3a9184e8,0x3ac381b4, +0x3b022532,0x3b09d730,0x3b0216a8,0x3b008874,0x3af983f4,0x3af2e9f5,0x3ae91406,0x3aea5bfd,0x3ac154d7,0x3aa66c61,0x3a87a03c,0x3a3d54fe,0x39c7997d,0x3869eae0,0xb9937a9d,0xba159805,0xba4c4986,0xba94eed2,0x39b5e5a3,0x394ea9e7,0x39daf5ca,0x39f9e6f5,0x3a2c916f,0x39c53643,0x3a15df84, +0x3a4417c8,0x3a6b81f7,0x3a84955d,0x3a94e212,0x3aa556ea,0x3ab85b7b,0x3ac56f82,0x3aacb393,0x3a9ddcf0,0x3ae3252c,0x3acc190f,0x3ac94788,0x3ac01468,0x3ac45a05,0x3ac3e1c7,0x3ac3dc89,0x3ac3ee41,0x3ac2c168,0x3ac4ff22,0x3ab16da9,0x3a9fcd4e,0x3a8dc32d,0x3a7e89fb,0x3a66dbc7,0x3a50cb64, +0x3a3ee903,0x3a2441f5,0x3a00a99c,0x39d4e3e5,0x3ab743d4,0xba63a6c1,0xba0bc567,0xba2794c2,0xba34284d,0xba4bb47b,0xba5f1d66,0xba4cfc61,0xba3eee7c,0xb9c3f932,0xba20385d,0xba396615,0xba42fc08,0xba93d617,0xba936811,0xba32058f,0xba784fe5,0xba6dbafe,0xba4569e9,0xba667ce1,0xba61619b, +0xba733ba8,0xba5ea578,0xba64fd63,0xba811763,0xba8e464a,0xba85692f,0xba50a7cb,0xba133195,0xba194e70,0xba8b22a3,0xba49860c,0xba252428,0xb9682b9c,0xb9eb2719,0xba07753f,0xba50efed,0xba0b53a0,0xb9c6baf9,0xba1d8113,0xba32a584,0xba4295af,0xba3f53e9,0xba75e031,0xba180f47,0x396f27ea, +0xb920b06a,0xb985f344,0xb9c15527,0xba63dd1d,0xba89e75b,0xba058bd8,0xbac1ca06,0xbac1d35d,0xba17aba9,0xba603068,0xba820c48,0xbaa81337,0xba92d403,0xbabe9057,0xbb021e25,0xbb2517be,0xbb17595a,0xbac00f5b,0xb9e7cfac,0xb9b32076,0xbad85a57,0xba77ae9e,0xba024f22,0x3a146cea,0xb8bcc360, +0xb9e6d78b,0xba95724f,0xba0017c0,0x39c7304a,0xb9210b2f,0xb994d7e7,0xba17f9eb,0xba452413,0xb9cc6e76,0x3728566a,0x38b670ad,0xb721f164,0x38d1dc03,0x38e0165c,0x3994ae0b,0x3924147a,0x395ea5bf,0xb7cba6be,0xba3445ec,0xba206846,0xba8a5c12,0xba9c9794,0xbae5b7ae,0xba98be14,0xbacabf01, +0xbb077783,0xbb412d7d,0xbb220f51,0xba82daa9,0x39e62101,0x3997f0e1,0xbb218d69,0xba487cec,0x3886aa6c,0x3b1d485d,0x3a625f32,0x3a02321b,0xba5cc12a,0x39db8610,0x397a85aa,0xb9e94836,0xb9f06232,0xba112c17,0xb9251172,0x393f765e,0x37428600,0xb833518a,0xb638f1b0,0xb8032bc3,0xb8812492, +0xb8de72ff,0xb85869f1,0xb8c31c50,0x38c744ce,0x396ce49a,0xb9055fd0,0xba64ccec,0xbac6aade,0xbb127efc,0xbae50a9b,0xbb374be3,0xbb9e5e04,0xbbe262b4,0xbbd0fc00,0xbb53e651,0x398458f7,0x3989a738,0xbb86bd59,0xbad5937c,0x39fd3f17,0x3b7b789c,0x3aaf9636,0xb9e4090f,0xbb1f3959,0xb9e77436, +0x3b273391,0x3adfab83,0x3acb3dcb,0x39f08a14,0x36cd6995,0xb85ea761,0xb7f1e4fc,0x37db5fb3,0x3612876b,0x377b944c,0x380918f1,0x3837f707,0x37f66c7b,0x3808643a,0xb8446b0c,0xb8f63a87,0x3912cd5b,0x3a0728e9,0xba37607f,0xbad8bd38,0xba96b0ee,0x3a0b5d6e,0x3b65331a,0x3c07c28b,0x3c1ca5a1, +0x3bdb0f96,0x3b83a2d0,0x3b0700ed,0x3b11e2ee,0x3b07594f,0x3b0b5ddf,0x3b2952c4,0x3b4cfb1b,0x3ba0c7ec,0x3c035ddd,0x3b892522,0x3b1891fe,0x3af19f39,0x3aa226e8,0x39d1f039,0xb91b350b,0x38a9c909,0xb6eade05,0x36407d7a,0xb74a8e6c,0xb6aecc07,0xb7a8d52c,0xb7a2c8c1,0xb793e443,0xb6dc1d1b, +0x378fe2ce,0x38b0adec,0xb92bef6d,0x37dc50d3,0x39dc9345,0xb993c826,0xba0b194e,0xbabb3f50,0xbb425d20,0xbbadf776,0xbbcd8736,0xbba67c64,0xba552102,0x3b29bb8f,0x3b82bc7b,0x3af2eb64,0xba40e002,0xbb52a3aa,0xbb6de959,0xbaedf654,0x3ac9c84a,0x3b2e8430,0x3b87b5b9,0x3bed8022,0x3bb8d969, +0x399661ef,0xb990d4ef,0x38c6d82d,0xb8873ee2,0x3801e652,0xb6373a6a,0x3753842d,0x37446fb3,0x374921f3,0x37323386,0xb6a863bf,0xb6bc811c,0xb888240b,0x38b43a57,0xb7923031,0xb8c27d81,0x3a8195e7,0x3aec03b6,0x3b3533dc,0x3b650cc4,0x3bcd58bc,0x3be75c91,0x3bb9cf19,0xb822c843,0xbb7df4e6, +0xbbb0964e,0x3b0361c6,0x3bcddbb5,0x3ba0f547,0x3bd19f0a,0x3b18a7f8,0xbba9fbd9,0xb90be1ba,0xbbbd48c4,0xbc98d91a,0xbbd39a86,0x39982844,0x3877d88d,0x380caa6a,0x37b273dc,0xb76be452,0xb7295673,0xb770c385,0xb7751894,0xb75b132e,0xb5dee4cc,0xb5812f23,0x382d9e76,0xb65aa7a8,0x3919853f, +0xb9eab522,0xbad001ec,0xbb1838d9,0xbb2b23d1,0xbb331737,0xbb56123e,0xbb65de42,0xbb6f7380,0xbb3c45d9,0xbb0993ff,0x3ad1a653,0x3bce4c7f,0x3ba7a23f,0x394629d1,0xbc05c28b,0xbb8b7c32,0xba9d14b2,0xb9844530,0x3822de4c,0xba8e76e0,0xbb828ce7,0xbb28dfbb,0xba4f79d2,0x394a0481,0xb98a9492, +0x387cf1f3,0xb767020f,0x3826318e,0x379a9ff5,0x3801eaf3,0x378e586d,0x362bbb57,0xb7253503,0xb8681eff,0xb7f79b45,0xb9701bb1,0x39f73842,0x3af4ae99,0x3b3ab1cf,0x3b37e87a,0x3b24c7ff,0x3b021b49,0x3a5ecd76,0xb72f46d8,0xba5100d4,0xbaa7a40b,0xbb145b68,0xbb34273f,0xbb317a4c,0xbac5496c, +0xb99ff941,0xba815235,0xbb05d4ee,0xbb360a8c,0xba9c0506,0x3b4539d6,0x3b68b728,0x3b2fdf76,0x3acc4330,0x3a2d4334,0x382bda93,0x38d18dcb,0xb8b8f9d2,0xb817e02c,0xb88a3bf6,0xb868fd92,0xb82921b0,0xb6982145,0x37ba3d29,0x38b7165a,0x3910f6eb,0x3947c4c2,0x3a89789d,0x3abf4c3a,0x3ab73225, +0x3a580229,0x394f93aa,0xba0aee61,0xba72b2f6,0xbad19bcc,0xbb2e6519,0xbb2203c3,0xbb227ebc,0xbb2e6351,0xbb20875f,0xbb0902b7,0xba5a1643,0xb9265076,0x3a970591,0x3b055142,0x3b40d2d2,0xba3c28b6,0xba5a896c,0xba823941,0xba53d66f,0xba3aa3d0,0xb9c79ed7,0xb8963420,0x397cf5e9,0x390a581f, +0x394011a0,0x39110a4e,0x38f5e16b,0x37fc3504,0xb699a0f2,0xb93cc7f2,0xb9d04889,0xb9bbf030,0xb9c5ecc6,0xb932d58f,0x3966b3d6,0xb8dc3fab,0xb960adfb,0xb9d6f674,0xba0fe5c8,0xba339e13,0xba615c75,0xba6a3d9b,0xba802a5c,0xba8256c2,0xba65caec,0xba4d22b0,0xba5eb9aa,0xba41e95d,0xba4eb5f9, +0xba5e65b1,0xba64975e,0xbaacbdc3,0xbad874dc,0xbadf0222,0xbac3e907,0xbabf8317,0xbaafc2d4,0xbaa5d5ad,0xba90c4b5,0xba754b5a,0xba47aab3,0xba26c953,0xba039ee1,0xb9de54da,0xb9a8cc83,0xb826321f,0x398fa52b,0x3a266b65,0x3a877b85,0x3ad4df09,0x3ae31458,0x3ace5e90,0x3ac6da2e,0x3abbb2a6, +0x3ab044be,0x3aa4b384,0x3a9d86fe,0x3a7d8298,0x3a4fefc6,0x3a1def72,0x39b4c7af,0x38a505a7,0xb92dceea,0xb9d5d712,0xba1eddd3,0xba449bd7,0xba85de4c,0x373b85c3,0xb897dea4,0x389e0aad,0x38ed5b1a,0x39896066,0x36833f44,0x3900f87b,0x39532c6c,0x399b464e,0x39c1a937,0x39fa82da,0x3a1a7701, +0x3a4374f8,0x3a62fbf8,0x3a4ffdba,0x3a3a3d35,0x3aa0f2c7,0x3a8af0e6,0x3a866f3d,0x3a75364f,0x3a792e95,0x3a72dde4,0x3a6d2f24,0x3a68f410,0x3a623c90,0x3a5fc13a,0x3a41f389,0x3a26a844,0x3a0c0db8,0x39f11df8,0x39d1dd59,0x39b40b8d,0x399a95fb,0x39639d9a,0x38f37ed6,0x386d541a,0x3a482228, +0xba5f4d9b,0xba1521df,0xba3817ff,0xba375526,0xba43ba94,0xba45a8ce,0xba44f6a0,0xba344eb9,0xb981ee0a,0xba0a448b,0xba249a91,0xba2960a7,0xba81084e,0xba886a70,0xba3b5675,0xba6b1731,0xba593ae6,0xba3b0f52,0xba55800f,0xba53b304,0xba623ff6,0xba5b01ff,0xba6475eb,0xba845c40,0xba852e54, +0xba7882dc,0xba4d5b63,0xba19cffd,0xba243a2a,0xba91e2f5,0xba4c0fa0,0xba2744fe,0xb97dec3c,0xba083e4b,0xba1a3971,0xba4e4777,0xba151325,0xb9f208a4,0xba3e004f,0xba2652b2,0xba2fdc7b,0xba2f44ac,0xba5c2078,0xb9e2ec61,0x395599c1,0xb8b68118,0xb9184a9d,0xb941272c,0xb9fedaee,0xba119ae1, +0xb996889a,0xba8743d8,0xba9e2a31,0xba330a9e,0xba34ce18,0xba614017,0xba9aff40,0xba96103f,0xbac3b58c,0xbb042289,0xbb11bbb4,0xbb008e83,0xbaac33b9,0xb9e97251,0xb9f22908,0xbaeb83ca,0xba83c69c,0xba115b93,0x39ed8355,0xb994a44a,0xba1de535,0xba8de3f5,0xba1178a6,0x38e920b0,0xba05cb86, +0xb9aead4b,0xba09490e,0xba091261,0xb90b33d5,0x38aa2388,0x36b31ccf,0x367c120c,0x38a04404,0x38bd6dd7,0x39586d44,0x392fd217,0x392fa05b,0x394034ed,0xb8d72d3b,0xb9eeb31f,0xba56eded,0xba784769,0xbac51db9,0xba987677,0xbad12cb7,0xbb11136a,0xbb26f031,0xbb075055,0xba808cbf,0x39538c3b, +0xb89b6fd5,0xbb347bad,0xba6a2529,0xb8f5ae47,0x3b09137e,0x39c13210,0x3870c69f,0xba5f7850,0x39004cb1,0xb850c409,0xba51f9fb,0xb9e9bc53,0xb9beae8d,0x387f3736,0x38e5ee32,0xb7c6bce3,0xb6e5f55f,0xb635cd85,0xb7f7397a,0xb83b2271,0xb8ad0561,0xb89ebed0,0xb89af80e,0xb857bc9a,0x38f0ecb1, +0x38849703,0xba04b5a4,0xba9d3589,0xbb051a1b,0xbaf67d97,0xbb475f29,0xbba2c75b,0xbbc2e8cf,0xbba8d24c,0xbb2fa938,0x3965513c,0xb9763425,0xbb94bb8b,0xbafd7fb4,0x393435db,0x3b595828,0x3a314fb5,0xba66326d,0xbb0c3a12,0xba0f15c8,0x3aa48bef,0x3a959b9a,0x3a88ad07,0x39378bd7,0xb837ac37, +0xb7dfd819,0xb69b3d12,0x3728278b,0x35da3ce1,0x377946fa,0x37c4b218,0x38211659,0x3812bc2b,0x3826fdd7,0x37122102,0xb82d39f9,0xb80af075,0x39c6e2e5,0xb931ca31,0xba824d91,0xb9982d23,0x3aa16e72,0x3b6692a5,0x3bee9587,0x3bfded7d,0x3b9586c2,0x3b221568,0x3ab3b695,0x3b01470d,0x3b196949, +0x3b0dff54,0x3ac99e0a,0x3b2fc67c,0x3b86a0e3,0x3bce39e0,0x3b241a48,0x3b15c34d,0x3aa69614,0x3a7c225f,0xb89a70cb,0x380cf613,0x37a87b34,0xb6896a33,0xb6679d5a,0xb6f63087,0xb70b87c3,0xb782d4a7,0xb79d6118,0xb7b1c569,0xb778357c,0xb75ed1dc,0x384ef1f5,0xb809f304,0xb8d7320b,0x39acc39f, +0xb92a1014,0xba76a887,0xbb092ada,0xbb67a745,0xbbaf2bac,0xbbafdcc2,0xbb5e539b,0x3a06d7ee,0x3b41e021,0x3b47a5b9,0x3ac8cc07,0xba0832d8,0xbb32fcdb,0xbb15be06,0xba061256,0x3b1c6da3,0x3b495241,0x3b54e559,0x3bc0b225,0x3b848bc9,0xb981908b,0xb8a5e6c9,0x38104f25,0xb79535aa,0x379564e3, +0x36db7a3b,0x3749ed39,0x37571d4a,0x37652e4e,0x37760e58,0x36f9f538,0x36f60b16,0xb81287ad,0x377fde97,0x386e525d,0xb93fb727,0x3a4a347a,0x3b01c127,0x3b52ab3f,0x3b88164a,0x3bd4b940,0x3bd0cc60,0x3b78f1d7,0xba81a7da,0xbb728d5c,0xbb7cbaed,0x3b0d7a56,0x3bae3aec,0x3b8387f2,0x3b8f0497, +0x3a304c15,0xbb9f36ba,0xb9d7eb58,0xbb9e16bf,0xbc661e03,0xbba137c3,0x3a314e6a,0x3790a210,0xb6fe819f,0x367050f6,0xb7bf358f,0xb7928551,0xb7a10c9f,0xb79955f6,0xb7919946,0xb75afe0c,0xb759020c,0x374e27d2,0xb6908e71,0x38d0c0e1,0xb8da920e,0xbab73495,0xbb17c8e8,0xbb210cf4,0xbb2b488a, +0xbb49652a,0xbb492144,0xbb450bc3,0xbb18ff4b,0xba926b02,0x3b06fa5c,0x3bcca174,0x3b41fb78,0xbac1d48a,0xbbe00850,0xbb3683b9,0x3934aea7,0x3a93d0d4,0xb990e021,0xb9390f91,0xbbc9aee5,0xbb811791,0xba839aa0,0x3925f59b,0xb8bdaaf5,0x384a4ffe,0x37c56230,0x384510fc,0x380ac8ac,0x3817c483, +0x3800b440,0x379ba177,0x37d83477,0xb80620a0,0x379b1aaf,0xb9479d6d,0x38e56987,0x3abe846e,0x3b20236b,0x3b17cad7,0x3b05fb37,0x3ac73efc,0x3a14f804,0xb9667b9d,0xba86b097,0xbaadcd53,0xbb08fb1f,0xbb0da081,0xbb0be287,0xba8084ea,0x3887905c,0x38560eec,0xb9b9a1d0,0xba4e5cb4,0x3a85992f, +0x3b13ca21,0x3b43b95b,0x3b287010,0x3aa02704,0x391b88b9,0xb745f2eb,0xb76708e8,0xb8d66ee1,0xb8a2f0d1,0xb8a7bdd5,0xb89b154e,0xb87fa848,0xb8469e08,0xb7e5d880,0xb684bff6,0x38fe1513,0x37a287c2,0x3a54201a,0x3abd6cd7,0x3ac7e7ce,0x3a8862cc,0x3a0cce22,0xb8fd1732,0xb9e17762,0xba8884fa, +0xbb075cee,0xbb082c18,0xbb0d94a3,0xbb173181,0xbb07273d,0xbae1cf95,0xba2b7cd1,0xb9a26964,0x3a3686db,0x3aaecb84,0x3b018b72,0xb9642ced,0xb96a7644,0xba01f529,0xb987b979,0xb93934b9,0xb86a037c,0x392b398c,0x396e00de,0x39456e01,0x3942cca8,0x3938213e,0x391b3147,0x38db1231,0x38b5f3fe, +0x379ae694,0xb93e2d51,0xb9a8c7a7,0xb9fb824c,0xb9ed48b2,0xb9539b3b,0xb9f793cc,0xba0df065,0xba368ef3,0xba659aa2,0xba899f9e,0xbaa390d9,0xba96122d,0xba91b2ee,0xba8752ca,0xba5836cd,0xba2cc55e,0xba1eac22,0xba03563d,0xba05a1b2,0xb9fe8f4c,0xb9c64419,0xba8908dd,0xbaa44ea2,0xbab4a011, +0xba9ebe8e,0xbaa00099,0xba8c3b66,0xba6f87ac,0xba40d5a1,0xba114582,0xba0dcfea,0xb9fc7705,0xb9dda5a9,0xb9b84a82,0xb9a65d21,0xb98664b6,0xb8c8c636,0x3959620f,0x3a15086a,0x3a989bd3,0x3a9fda20,0x3a89a880,0x3a7eba3f,0x3a658c56,0x3a4b0e31,0x3a33ef67,0x3a1c6fd8,0x39ea6949,0x39abc925, +0x394edec3,0x378a8d48,0xb92f0c2b,0xb9ae03c4,0xb9fafbfd,0xba1a62ce,0xba34ef82,0xba6257fe,0xb96d9a77,0xb988fd4d,0xb95121a0,0xb94190f1,0xb8d2e59d,0xb9978518,0xb988a8a8,0xb989404f,0xb969cb3a,0xb906abbb,0xb80b5bbd,0x386455c9,0x39224f82,0x398521a9,0x39951101,0x398b26b3,0x3a38b32a, +0x3a11e831,0x3a06fd5f,0x39e235c8,0x39e421bf,0x39d169c6,0x39bf5914,0x39b1bee2,0x399f9c57,0x399073ae,0x39591a57,0x3913918b,0x38aa5237,0x382b665b,0x374f04c0,0xb774b271,0xb83c9668,0xb8c83818,0xb92134a7,0xb94a2a12,0x396dde0a,0xba3ff72d,0xba0934d3,0xba294198,0xba2b70b6,0xba3740f5, +0xba3b1119,0xba2eb11a,0xba298e8b,0xb9734cb2,0xba00e0dc,0xba19ee65,0xba1cc002,0xba63038f,0xba743795,0xba3edd13,0xba5ea09b,0xba40f546,0xba3d0722,0xba3764e6,0xba336642,0xba35396d,0xba3cc84b,0xba46af25,0xba6a6f21,0xba5a040a,0xba4a044e,0xba2fc4e8,0xba08f5bc,0xba14ed3d,0xba826630, +0xba30ef34,0xba0eed90,0xb947cdf2,0xb9f860e2,0xba0cc118,0xba2ec2e3,0xba065a23,0xb9f0443a,0xba3fabb7,0xba2545ce,0xba11dc03,0xba272cf5,0xba2c52f8,0xb97d2fa2,0x39326356,0xb7b810a7,0xb6b88559,0x35e843c5,0xb8de04a6,0xb90f426b,0xb8271522,0xba01ee99,0xba4b755e,0xba3c97e2,0xba070613, +0xba325a24,0xba7a5893,0xba87f352,0xbab2a70d,0xbaecb6cc,0xbae702ae,0xbac468bd,0xba8d1d78,0xb9d6a4a0,0xba006c60,0xbad8e721,0xba6c2eff,0xb9fe1d6a,0x39d14634,0xb99e21a2,0xba15ab64,0xba65c585,0xba069dc7,0xb866826a,0xba41150b,0xb9d31061,0xb9f7b7cd,0xb97c2214,0x38f0a9a1,0x38e048f8, +0xb7e3b195,0x3638def3,0x37c6589f,0x37241036,0x387deaa2,0x3885103d,0x3894154a,0x39251da7,0x394be044,0xb90b3db0,0xba0fe77d,0xba26a700,0xba9226ed,0xba869278,0xbabcfcd5,0xbb04a211,0xbafc5313,0xbac2c471,0xba58773f,0x385e22d1,0xb992199a,0xbb25dccb,0xba4ff8d4,0xb9010242,0x3aeb4d5d, +0x39098bd4,0xb8dddf3d,0xba2d41dc,0xb83818df,0xb954ea80,0xba88f4ff,0xb9f79f6f,0xb8fc7e04,0x3919fe35,0xb7e11c57,0xb850ac74,0x3671912c,0x33fab8c4,0xb7459ec0,0xb7367b99,0xb7efa78f,0xb80475b0,0xb8195a30,0xb8a081b9,0xb84fba15,0x38d4be39,0xb91e6463,0xba504bf7,0xbad4e0ee,0xbaf084c8, +0xbb41687d,0xbb949714,0xbb97b42f,0xbb760f04,0xbb08101e,0x38dd1f90,0xba0f8996,0xbb898da3,0xbaee97f2,0x389bf683,0x3b381000,0x39c90355,0xba65be2f,0xbacddc82,0xba03892e,0x3a1ad0ab,0x3a79a95f,0x3a223afc,0x386e6014,0xb8734edc,0xb74c1542,0x37f7e310,0xb5e6ce70,0x36271194,0x36aef186, +0x36fd8a53,0x3768b012,0x3780eb1c,0x37af14f5,0x380ca366,0x379121ef,0xb889d03b,0x39479b68,0x390d1fc2,0xb98c8ee9,0x3a0b1477,0x3af5ac5b,0x3b680318,0x3bc86f5e,0x3bc5162d,0x3b4910b5,0x3ac33d88,0x3a827b84,0x3adf5fe8,0x3b24aac5,0x3b0d05c0,0x3a1e7210,0x3b0b7743,0x3b53d20f,0x3b991080, +0x3ac29647,0x3aea8d9c,0x3a87a316,0x3a1c3490,0xb979df93,0x390e7f0f,0xb86b6282,0x375d3f0a,0xb7815207,0x3620658c,0xb6d308f3,0xb695af99,0xb7020425,0xb71ba341,0xb72937a2,0xb7a7a49d,0xb53575b7,0x37a6516d,0xb8cf65af,0x390f6109,0xb96a3a83,0xbaacb75d,0xbb2590d8,0xbb77eb53,0xbba24fe7, +0xbb8e0c57,0xbb0a235b,0x3a9a59d5,0x3b37965e,0x3b08fbca,0x3a8090e7,0xba013112,0xbb0fbd8c,0xbaa9a8e4,0x3976045e,0x3b1e44e7,0x3b359066,0x3b107471,0x3b88d74c,0x3b1d18b9,0xba051704,0x389b5c7c,0xb7397744,0x376a3bbe,0x36eb3c89,0x36b7dcda,0x36ac5d86,0x36b44609,0x36d7eb1d,0x36c65283, +0x37279ac5,0x36d56f81,0x373f3d29,0xb84199d1,0x38be6e6c,0xb9040621,0x3a205f15,0x3b00a630,0x3b53e354,0x3b8a0eef,0x3bbf74d8,0x3ba6f017,0x3b0cd61b,0xbad1c4aa,0xbb57a51b,0xbb1ff837,0x3b034c8b,0x3b85d4ce,0x3b4273d7,0x3b1a21ac,0xba2177e5,0xbb82b518,0xba01a983,0xbb78dcae,0xbc1d7a4d, +0xbb4d4997,0x3a7a031a,0xb96a4ab5,0x387819af,0xb82aeb6f,0xb6bd5c11,0xb7777f1d,0xb6f9b6bc,0xb71f9ae2,0xb6f85571,0xb719772f,0xb70724a5,0xb74cf13c,0x36bea020,0x367e1a53,0x39069e47,0xba7de640,0xbb05419b,0xbb06e9ae,0xbb145581,0xbb2cae01,0xbb1ebb89,0xbb10176a,0xbadc9030,0xb774912f, +0x3b218269,0x3bb65527,0x3aa26f4d,0xbb1a2012,0xbba2640a,0xbae01ed1,0x3a64a012,0x3b1973b7,0xba1f8aac,0x3a93c1c1,0xbbd1eddc,0xbb78acf2,0xb97b0ea8,0x38185081,0x37923621,0x37ff7f31,0x380bfd23,0x37ab539e,0x37a3d651,0x37812ff0,0x378710b6,0x374530ff,0x37b01626,0x36ab1102,0x378f2c25, +0xb88db805,0xb913993a,0x3a83a03d,0x3b02e465,0x3ae8e5c6,0x3ac8159a,0x3a87cc69,0x39b93d30,0xb99c49ad,0xba8e3114,0xbaa4bdcd,0xbaf08608,0xbad8361c,0xbad5d50c,0xba1408a9,0x39ee10f2,0x3a87f4ae,0x3aa389a0,0x3aabf617,0x3b410cd9,0x3ab17d16,0x3b1601f8,0x3b0cd2fd,0x3a18cc07,0xb8e81129, +0xb817d971,0xb8a4c1a0,0xb877cf88,0xb849c9db,0xb819115a,0xb811a0d7,0xb7ec5296,0xb8021fee,0xb7d67beb,0xb83f62be,0x37e982d5,0xb6c4c090,0x39ec71bf,0x3aa3f99f,0x3abd4887,0x3a8d0d60,0x3a3e2ba0,0x394f2b63,0xb7c7a9e5,0xba0b21ec,0xbab686f6,0xbacc4f7e,0xbadc00be,0xbaeae7e6,0xbacc0ab8, +0xbaab272a,0xba1763ff,0xba16e620,0x38238695,0x39ebf988,0x3a641e90,0x396bb608,0x3989dfc9,0xb87c574d,0x38f8a21e,0x38a411a7,0x39184b46,0x39348da6,0x390473ad,0x38d32a04,0x38a1546c,0x3894aa15,0x38837150,0x3872436b,0x388f8537,0x388920a1,0x381aa407,0xb91b3e23,0xb9f05d05,0xba1fe95f, +0xba08abb0,0xba3613da,0xba41f11b,0xba5d4060,0xba841c3e,0xba98d4bb,0xbaafba51,0xba9c8123,0xba926157,0xba852210,0xba46184d,0xba0d3a32,0xb9c27e05,0xb9818926,0xb94f53d9,0xb8ceefe4,0x38b487fe,0xba56e866,0xba6f7c4e,0xba88e99b,0xba69f4a5,0xba63cb88,0xba3b0238,0xb9f48feb,0xb9a5ff50, +0xb93d8234,0xb950a4a9,0xb9353940,0xb92d5352,0xb90c17be,0xb9244eeb,0xb9677901,0xb98784b3,0xb90ac2e2,0x3911b448,0x3a29a2d8,0x3a2f73b1,0x3a065a3f,0x39e10518,0x39b20c96,0x3979f2c0,0x392605b5,0x38833741,0xb682ce98,0xb87d43ec,0xb90704e2,0xb975c2fb,0xb9b69605,0xb9edfef6,0xba0b48a1, +0xba1833ff,0xba2acdf6,0xba42070b,0xb9bebb32,0xb9c234ac,0xb9b5bb3a,0xb9bc2dab,0xb9afd2d5,0xb9f31704,0xba00e725,0xba05d50a,0xba0251cf,0xb9e2e690,0xb9c19429,0xb9a2e82b,0xb9820a12,0xb933cf6e,0xb8ee2aba,0xb8b16059,0x398d3146,0x392e8e03,0x390183f5,0x3826a7f3,0x38104e09,0xb6528801, +0xb82eca0d,0xb8911033,0xb8d9e232,0xb915f406,0xb93720a3,0xb95cb13f,0xb97789ba,0xb98376e3,0xb984faea,0xb9852749,0xb98c8ea2,0xb999e099,0xb9a5578f,0xb9b12878,0xb921d782,0xba1dc4e2,0xb9ec0582,0xba13d32e,0xba0f312f,0xba0f34e7,0xba1e1af4,0xba1068f0,0xb9fc83bd,0xb9067660,0xb9ae7d82, +0xb9d2413e,0xb9d25b94,0xba15e259,0xba23e326,0xba0938c9,0xba2090a8,0xba1c57a0,0xba2dec2c,0xba0374e1,0xba06870e,0xba0d9852,0xba19b429,0xba243294,0xba431a93,0xba2a3247,0xba1dc839,0xba11a6c5,0xb9f1b58f,0xba044c17,0xba591fca,0xba16720b,0xb9f57369,0xb93bc53e,0xb9dd0271,0xb9f34858, +0xba077df9,0xb9e2e528,0xb9cc8132,0xba299fbb,0xba06c924,0xb9eac2e8,0xb9f0aa84,0xb99534b9,0xb80d1ca5,0x389fcb27,0x37709b62,0x37f2d8b1,0x381eb1e3,0x37a2869b,0x37007869,0x3874d68f,0xb8d5d537,0xb9830bef,0xba03854a,0xb9c945a7,0xb9e5c3e7,0xba3bc06e,0xba66fce7,0xba977183,0xbac3b743, +0xbaab8468,0xba8dcc3a,0xba5f3a90,0xb9d27899,0xba04dbfc,0xbab641b8,0xba514503,0xb9f00f73,0x3987fa4e,0xb9a0d8ba,0xb9ff9f9e,0xba1e9e57,0xb9d4bd5b,0xb9027be7,0xba4b207f,0xb9c28654,0xb972df7d,0x381b1391,0x38c955c3,0x38012e03,0xb7e6f2aa,0x362e5e3d,0x36782f6a,0x366b9dd4,0x37a733d2, +0x378bce5a,0x369138b8,0x382f6dec,0x38ec716d,0x38bc6e9f,0xb936c073,0xb9b4d75d,0xba3efe70,0xba5f1f47,0xba9d693e,0xbade6a7e,0xbab14533,0xba8350a5,0xba356a11,0xb90c8e38,0xb9f20d1b,0xbb0a322f,0xba456fac,0xb974d340,0x3aaac356,0xb8972824,0xb94141b7,0xb9bfb01a,0xb8ca9632,0xb9441faf, +0xba85a1e2,0xb99a3d2e,0x38361f1f,0x379401f8,0xb84c63b8,0xb738537d,0x3727609d,0x3539265d,0xb6777588,0xb607fd36,0xb7372e66,0xb7244b01,0xb6ba29cd,0xb782acea,0xb86e0321,0xb72b6c32,0x38198dcb,0xb9c1e255,0xba978602,0xbad6fc78,0xbb299f87,0xbb76cfc8,0xbb5955c1,0xbb2496ab,0xbac92831, +0xb8cb9d34,0xba490eea,0xbb64ab04,0xbadd21a4,0xb92bdd21,0x3b06b5f9,0x3919b073,0xba36c42e,0xba5b6b5f,0xb9971397,0xb8832472,0x3a22ea72,0x39c7e6aa,0xb8cf0897,0x3785ad0c,0x376da19a,0x374a87de,0xb6ebb991,0x35e8110e,0x35820761,0x362a92f1,0x36a3155b,0x36c29b1d,0x362d0eb8,0x3726f200, +0x37dd4705,0x35d4c50f,0xb775aecf,0x3981eef5,0x39a438ce,0x3a83da0f,0x3b088544,0x3b50f98d,0x3b96d844,0x3b882b42,0x3aedcd6a,0x3a33f6e5,0x3a1fa003,0x3aac4670,0x3b18b881,0x3af2b004,0xb955a554,0x3ab72c81,0x3b0ccce1,0x3b425858,0x3a0b571a,0x3aae64ae,0x3a4e3e63,0x39176c32,0xb92d62ca, +0x38eb9d1e,0xb88c3030,0x37b63afa,0xb73e7c8d,0x36a3ee0e,0xb688575a,0xb5475040,0xb675139f,0xb632249c,0xb64edf7b,0xb6418082,0xb7af4610,0x37e1fca2,0xb854f4ce,0xb6953a2d,0xb9dbcb7b,0xbacd61c9,0xbb2e3768,0xbb6efb3a,0xbb8a803c,0xbb57a714,0xba9e8141,0x3ab55a0b,0x3b1c40ee,0x3aaf10ee, +0x3a1ad76c,0xb9cbb115,0xbad4c965,0xb9da4368,0x3a57f118,0x3b143ee9,0x3b1af708,0x3aad3729,0x3b2f095e,0x3a8375f3,0xb9c60bbc,0x3902c5a9,0xb7e641e4,0x3785f871,0xb61f6b42,0x3643055c,0x36012b8e,0x3623a5ed,0x36513d89,0x35f3cd67,0x3687c1f2,0xb4fe1197,0x379e226e,0xb7c8ba77,0x3804ab4e, +0x36ac5e0a,0x3a01fa15,0x3ae8c4e0,0x3b3d4c84,0x3b794489,0x3b97fb13,0x3b6a6c1a,0x3a62352e,0xbaf016e2,0xbb307fb8,0xbaac3be3,0x3adeb22f,0x3b3ce684,0x3b046045,0x3a4ffaf9,0xbab9023d,0xbb48f65a,0xba0baafd,0xbb490970,0xbbc8c4da,0xba977548,0x3a2cb510,0xb98bd072,0x38bd77ff,0xb849df7c, +0x3763b3ae,0xb73eec58,0xb56c8a08,0xb6c88a94,0xb6521638,0xb69f8866,0xb59df186,0xb715e028,0x363e5072,0xb8073eef,0x3917284d,0xb9ea4964,0xbaccb183,0xbac99216,0xbae7888b,0xbb053cb0,0xbae50f16,0xbabb3972,0xba854808,0x3a5d6761,0x3b242702,0x3b8a2845,0xb8a35c58,0xbb2cc6cc,0xbb53a787, +0xba850d68,0x3a871c2a,0x3b35fa0e,0xba7f3b8c,0x3b0d6206,0xbba986f7,0xbb17b4d7,0x39bfc596,0xb8d43f9d,0x38b64c3a,0xb7a9317c,0x37ccbceb,0x343812d7,0x37507609,0x36e2d9d3,0x370fbe11,0x36dc710f,0x36aa21ba,0x37278165,0x36571cac,0x38335c6f,0xb96736dd,0x3a154c19,0x3ac8ae9f,0x3aa18809, +0x3a83b397,0x3a0e096e,0x38e5b7c4,0xb9c62711,0xba88af8c,0xba9b19fe,0xbacb54a1,0xba96e302,0xba90de7b,0xb9228cdb,0x3a5a6dad,0x3aed9b9b,0x3b1d5e86,0x3b3bdcb4,0x3b800b94,0x39e30876,0x3ac08cba,0x3ac5c1a4,0xb8498a82,0xb8d4e47f,0xb71088cc,0xb8328273,0xb6fa494e,0xb7ac8885,0xb7816650, +0xb797e560,0xb77e7b6d,0xb75a9b8d,0xb740689b,0xb762cc84,0xb7c39c20,0xb7d0b5b0,0x38fc463c,0x3a687b71,0x3aa0e498,0x3a806664,0x3a4eba2c,0x39cc6a89,0x395de274,0xb951daf3,0xba5c35d5,0xba8c3ad7,0xba994d23,0xbaa07fb0,0xba8c9e97,0xba81216a,0xba34036c,0xba666da4,0xba1a4eb2,0xb9b422ec, +0xb90a9e58,0x3a0f9489,0x3a2371d2,0x399006bb,0x397bb810,0x38c04006,0x38e04c03,0x386f46ab,0x37f4df10,0x38003e03,0x38054e77,0x380ad659,0x37f07829,0x37c6458d,0x37a66efd,0x38004fa1,0x386017d8,0x3882bda9,0xb987cb69,0xba1589b5,0xba24c6e6,0xba3a89ae,0xba44b3c2,0xba53e82d,0xba753968, +0xba8a83f1,0xba9c87fd,0xba8d9b9a,0xba870ab9,0xba7f21fe,0xba38e439,0xb9f5808d,0xb97b3fea,0xb8917d74,0x38501295,0x39693de6,0x39e7983d,0xba26115b,0xba2762b5,0xba47b207,0xba08e5d3,0xb9f2ce07,0xb9a2e915,0xb8b98a70,0xb8069224,0xb7b7c7f6,0xb7b66642,0xb7a98de6,0xb7ac33ed,0xb7979fab, +0xb7a0134c,0xb878ef82,0xb91f1987,0xb97a6112,0xb9288896,0x3944ea78,0x3935bae7,0x385effb9,0xb7e7d91c,0xb8d5aee3,0xb94994e0,0xb98798db,0xb9b301b8,0xb9b5e6e4,0xb9b89ffb,0xb9c4b217,0xb9dec596,0xba0089ae,0xba1193c9,0xba1724e0,0xba17fa33,0xba21e406,0xba2750ff,0xb9d7b0eb,0xb9cd6da4, +0xb9d90788,0xb9f15eba,0xb9fcc5ce,0xba032be5,0xba086f39,0xba08321d,0xba049ca6,0xb9f7ef77,0xb9e8f631,0xb9d80406,0xb9c8162c,0xb9b25bc6,0xb9a572d3,0xb9a484ed,0xb8c4da25,0xb8fbff0f,0xb92f00ff,0xb974c27f,0xb9817892,0xb9929745,0xb9a53ef0,0xb9b23c7d,0xb9c22007,0xb9d7cee1,0xb9da0b38, +0xb9e04361,0xb9dfbda9,0xb9ddf76a,0xb9d61a56,0xb9cdb412,0xb9ccb751,0xb9cefdb7,0xb9cc2c3b,0xb9cf2726,0xb9cb9f44,0xb9ea8fc2,0xb9b782bf,0xb9e463f2,0xb9d81633,0xb9e2b901,0xba0ac772,0xb9d1eec6,0xb9adf22f,0xb8f10cbe,0xb96c10ea,0xb987d6d2,0xb9853a2b,0xb9ab9174,0xb9b82fbe,0xb9a57a1a, +0xb9cb03ae,0xb9d15135,0xba1e7569,0xb9c8264e,0xb9b87261,0xb9c52e62,0xb9df9de9,0xb9f02fed,0xba0ebfe4,0xb9ee35a8,0xb9dddfbd,0xb9d79337,0xb9bddaa0,0xb9cef224,0xba1ced57,0xb9e159f6,0xb9bb0817,0xb923aed9,0xb9ad31f1,0xb9b9efe9,0xb9bdf2fd,0xb9aceee7,0xb9ab39ad,0xba047684,0xb9dca25c, +0xb9a3f8db,0xb9522e2a,0xb72247b0,0x387cb424,0x38979309,0x3868dd66,0x38a1da69,0x38a418ae,0x38b701ed,0x38ad3b03,0x38dc41ba,0x38a7db04,0x37b045e9,0xb94a4bc5,0xb9711e03,0xb99aa293,0xb9f7398b,0xba2b62c1,0xba5f34ae,0xba8c0b98,0xba612dcd,0xba36856d,0xba1d4448,0xb9b556d0,0xb9e5c7ad, +0xba831eb7,0xba20725e,0xb9c56e91,0x38f5eefc,0xb98df020,0xb9c62bc1,0xb9ce1125,0xb9a68756,0xb93c0c51,0xba36a44a,0xb9987705,0xb7521607,0x38d5c0bd,0x37f23936,0xb6e9093e,0xb7c1170e,0xb7924242,0xb7b1405d,0xb7eb4d85,0xb7d32cd7,0xb7dfe3f7,0xb7e6736c,0xb7a5cd4e,0x38033653,0x38a23ced, +0x37fb6574,0xb911dd45,0xb9daab17,0xba1def52,0xba60cb21,0xba9f6445,0xba596a59,0xba1b4b51,0xba054685,0xb96a14a0,0xb9fa8d1f,0xbac1bc96,0xba1af950,0xb97e92bf,0x3a51ede0,0xb9275c0f,0xb94ac28b,0xb93a833b,0xb9184771,0xb98a5d96,0xba6d4aa4,0xb8abd126,0x3886baf0,0xb81d760b,0xb790682c, +0x353896e2,0x372d8a6f,0x3701d4f0,0x3716e18a,0x373e866d,0x373441a8,0x373c13ae,0x37530f85,0x36761202,0xb72ae77a,0xb832c53e,0x3849a8cc,0xb8e9d825,0xba352fe7,0xbaa48147,0xbafc9b20,0xbb2f6a14,0xbb06ef60,0xbabddd9e,0xba832a61,0xb96681e3,0xba433af6,0xbb209ba0,0xbaaabaa4,0xb98c0479, +0x3aa4a9a0,0xb80255bb,0xba092408,0xb9d6f4b9,0xb982e8c2,0xb96f169d,0x39a9c7af,0x38b1d137,0xb6ca6261,0xb5ea1e96,0x374d7cf9,0xb64c7a41,0xb65ded70,0xb69385e0,0xb68ad412,0xb6b4927c,0xb6aac9cd,0xb6b8f4dd,0xb6b8f482,0xb5f89ac4,0x36bd98be,0x37934eaf,0xb79f94c3,0x38a4da4a,0x3a1db328, +0x3a92e1cd,0x3af40bb3,0x3b244de6,0x3b422323,0x3b1e8bda,0x3a6b1f57,0x3947d3d8,0x39a2e474,0x3a62658f,0x3aef7da4,0x3abacb04,0xb9f442ff,0x3a6df650,0x3ab01561,0x3add212d,0x38e17091,0x3a75e00d,0x3a230567,0xb90b4b67,0x38093111,0xb654227a,0xb74033a6,0x3699e0bf,0x307deb50,0x36642d65, +0x3602e7e2,0x364ebce6,0x3638749f,0x364f26a4,0x362e4ceb,0x35eef6c8,0xb6c83d0e,0xb6b36f68,0x371111ef,0xb78df03c,0xba0ff3fb,0xbabf0c13,0xbb13cdeb,0xbb3b1677,0xbb445a6b,0xbb09abba,0xba0a15e1,0x3aa2a42a,0x3ae8c913,0x3a53b31b,0x398ec3a6,0xb9aa5b98,0xba8ef1b7,0x38b2541c,0x3a7b2fad, +0x3ae73b6b,0x3adf6d40,0x3a312532,0x3ab35b64,0x391f112c,0xb9062932,0x3867c149,0xb76a3f7a,0x36bb1845,0xb66c3266,0xb5bd2628,0xb6063e12,0xb61a8a46,0xb5f5628c,0xb641d647,0xb5004a45,0xb687e280,0x371f27f5,0xb6c19dd7,0x34a62939,0x3791ce82,0x39da3c33,0x3aba14ec,0x3b114c7e,0x3b3d0d35, +0x3b4e21c4,0x3b0e4cf0,0x3946c576,0xbacab208,0xbaf6003d,0xba04e0d3,0x3aa0a56e,0x3ae955e1,0x3aa03271,0xb9347e59,0xbacf3b23,0xbb044e88,0xb9e7961b,0xbb0cab8c,0xbb638a86,0x387e9e00,0x391a4760,0xb8b82bf6,0x3818217d,0xb790ee60,0x37294a28,0xb57d9a8f,0x3688a1f2,0x36097dca,0x364dd043, +0x36101786,0x36642aec,0xb5dfc36d,0x36a59637,0xb801ac5e,0x389f12dd,0xb8dfc65f,0xba77d71e,0xba7cf3bd,0xba95ee07,0xbaa9e6d5,0xba8a4d30,0xba3e7cc9,0xb9c10792,0x3aa46335,0x3b0d79a0,0x3b323a91,0xba295405,0xbb0f52b3,0xbae35a96,0xb9de4133,0x3a80730d,0x3b22b8fd,0xba6deb6b,0x3b1f2575, +0xbb4540b5,0xba1f88f4,0x3984abe6,0xb8bdc3f2,0x384418ed,0xb798f2bc,0x365161c0,0xb702c3d7,0xb6522398,0xb6b7ba62,0xb6a47fab,0xb65fd934,0xb6f3b731,0x36a6daab,0xb74e614a,0x385ac615,0xb8e36efc,0x38f69c62,0x3a8b49f9,0x3a440e59,0x3a1b667b,0x3957d6e2,0xb8537a79,0xb9c71aac,0xba6421da, +0xba799600,0xba9536b0,0xba3f5732,0xba228d3d,0x3935249c,0x3a8df8f2,0x3b05389e,0x3b2f244d,0x3b589801,0x3b6fab29,0xb95655f4,0x3a4bab16,0x3a20efc5,0xb95189bb,0x37d6d343,0xb8104a7a,0x371d7aa5,0x370a558d,0x37216389,0x371c2699,0x373972fa,0x3715f247,0x37347019,0x36cbb855,0x3744993f, +0xb7c9f687,0x36ba5269,0xb8730eb7,0x39dabbd9,0x3a76c253,0x3a43d30f,0x3a398a40,0x39e65e31,0x399a0476,0xb6fc5134,0xb9dbfd3c,0xba23f8d0,0xba375d28,0xba3ef0e0,0xba31ccd0,0xba39546e,0xba2f65e3,0xba77063e,0xba68217d,0xba48b6b4,0xba31f91f,0x3a23a372,0x3a46b43e,0x39b5cda4,0x386e956b, +0x38adc680,0x37c8d3a7,0xb741646e,0xb7e577fa,0xb7a4aa31,0xb7cacb5f,0xb7d72871,0xb7c90229,0xb7b0f809,0xb7cf3aeb,0xb76eff44,0x371547cd,0x388908c7,0x377dbf50,0xb9c44658,0xba0d2849,0xba108928,0xba1a82b3,0xba21dc55,0xba3926e9,0xba4efde7,0xba686f62,0xba57c3e4,0xba52eb30,0xba4e0d7b, +0xba12534e,0xb9b5fc83,0xb903314c,0x384ebf6a,0x394fd18d,0x39c4b620,0x3a180af7,0xb9e0aee4,0xb9dac8fc,0xb9e71836,0xb943853e,0xb92e67a7,0xb7936110,0x389ee485,0x38c50bbd,0x3892f39a,0x38a2a69d,0x3896eb4a,0x389cec2c,0x3890b423,0x38a405da,0x38981a68,0x3591657f,0xb8e0ee59,0xb983155e, +0xb9166e81,0xb901da8d,0xb952f898,0xb989f66b,0xb9a2b698,0xb9c3bb74,0xb9d9da45,0xb9f67385,0xb9e72640,0xb9da1c4f,0xb9d7b029,0xb9de33a7,0xb9eea700,0xba0021b1,0xb9fd7e4a,0xb9f5f84a,0xb9fe36b0,0xb9f8abda,0xb9b6e6d3,0xb9a66ac3,0xb9caaa45,0xb9e6cfd6,0xb9f9cd17,0xb9c99f45,0xb9c243bd, +0xb9b66386,0xb9b55445,0xb9aef42a,0xb9ab3757,0xb9a6599a,0xb9a2d3d9,0xb99b0b04,0xb9a396d9,0xb9b358bd,0xb9ab4165,0xb99390db,0xb9902c06,0xb9a9ec13,0xb9b40bd6,0xb9bd9fc3,0xb9cb35c1,0xb9d3ed7f,0xb9deacc9,0xb9efae42,0xb9eaae7d,0xb9e995b2,0xb9e209a2,0xb9dbd72b,0xb9d070f5,0xb9c4deaa, +0xb9c092d6,0xb9bd8742,0xb9b4e62d,0xb9b3a474,0xb9e4b2e6,0xb9a25a18,0xb987c35c,0xb99c09ba,0xb99b0890,0xb9a743e4,0xb9b5dbc9,0xb874b8d1,0xb87dc95a,0x3543cce8,0xb809d84f,0xb82cd3a5,0xb82a2f81,0xb8788e07,0xb88ed88d,0xb86ee9e3,0xb88660c9,0xb831530f,0xb9c9bca4,0xb98ab15a,0xb976bf5f, +0xb982a853,0xb99873d2,0xb9a26e03,0xb9bc90bb,0xb99d5984,0xb995491d,0xb996d288,0xb98ebfff,0xb998df67,0xb9cc64db,0xb9a038a2,0xb98b8702,0xb922c916,0xb983801a,0xb986fb06,0xb978d3fb,0xb978d6b5,0xb9724e54,0xb9be706a,0xb9a7f859,0x3607cff0,0x3876688f,0x388223ba,0x368e657d,0x367356b2, +0x35b399f0,0x3737514d,0x372d5789,0x37adb739,0x37b257aa,0x37e97683,0xb58c5275,0x38871bf6,0x38535740,0x380f8dbb,0xb934d0ba,0xb99904d0,0xb9e0c2cf,0xba101aae,0xba2c2d89,0xba0541ae,0xb9db1c11,0xb9cdcefa,0xb998e8d8,0xb9b8e8a2,0xba2407c8,0xb9e386d8,0xb99ed109,0xb7f02c42,0xb96f96b9, +0xb98b9eb4,0xb960cc3c,0xb9695917,0xb91815f3,0xba15e2ca,0x36dffc64,0x388dcc67,0xb822c0ed,0xb7c9a9a2,0xb71e65fc,0xb5bf64af,0xb5cba8dc,0xb673575d,0xb6481796,0xb6babfd2,0xb7103640,0xb71789e8,0xb702dea2,0xb7d0c2de,0xb7c9c85f,0x37b67750,0x3843f797,0xb971212e,0xb9c8b8a0,0xba0bda58, +0xba41d4f3,0xb9f22793,0xb9b16875,0xb9b8ff5a,0xb98c23bc,0xb9dd5726,0xba674c27,0xb9ea5c62,0xb98857b0,0x39a0c4d8,0xb95717d1,0xb93cf2a7,0xb8523865,0xb919337b,0xb950b80d,0xba25a985,0x38fb194b,0xb86deea0,0x375185f5,0x372ab272,0x36c616cd,0x35947c44,0x359e4422,0x35d7e17e,0x36034362, +0x36345d22,0x36853edf,0x368aaab2,0x36b870c9,0x374ddba2,0x3617b277,0xb766e349,0x37c590c4,0xb9af81ca,0xba568654,0xba9d7cd0,0xbacedc35,0xba90189f,0xba41484e,0xba1bed03,0xb9a169f6,0xba23b5fa,0xbabd1f3b,0xba69a8ba,0xb9a6a564,0x3a0a613f,0xb908e254,0xb9a22b23,0xb89cabba,0xb901834e, +0xb97b8023,0x3918c48c,0x37d6495c,0xb7f0e949,0x377035ff,0xb72b7fd4,0xb5a0684e,0xb5c24a79,0xb4f90a43,0xb584c222,0xb588e899,0xb5c9c8d7,0xb5f47d91,0xb6197ae1,0xb62c2295,0xb6eb9e8f,0x367aeed9,0xb6625261,0xb813798d,0x3a05dc77,0x3a621021,0x3aa67635,0x3ad2ddae,0x3ac89d2e,0x3a904a52, +0x39bbacab,0xb81a2bfa,0x38cd8a2a,0x39e34bb8,0x3a8a5378,0x3a4641f1,0xba19f5af,0x39ba3b9f,0x3a120f99,0x3a2186eb,0xb8d67470,0x3a170913,0x39c20dfc,0xb90a81c2,0x381ec4ef,0xb7807f39,0x3703bc76,0x33f46d37,0x35a1b633,0x35044e7e,0x3532067f,0x355ab937,0x354c90d9,0x35c78868,0x35035efb, +0x36611f73,0xb365566c,0x36ba1282,0xb7696352,0x386658f3,0xb9f12b97,0xba8e9fd4,0xbac80b96,0xbaef6dfa,0xbadec0e3,0xba88e7da,0xb8bfde77,0x3a72071c,0x3a95aacc,0x39eee112,0x38c73fdd,0xb9632130,0xba1dadce,0x39989907,0x3a50b019,0x3a91be56,0x3a825cf2,0x39880706,0x39ea70c0,0xb6f3657e, +0xb7920162,0x375d4108,0xb6f30171,0x355247da,0xb6033200,0xb4d54d2e,0xb58dc141,0xb52f9372,0xb58eb39a,0xb54bc408,0xb5da3095,0xb4107da7,0xb6b6c110,0x371b412d,0xb7951653,0x36648323,0x3993e9a3,0x3a6893fe,0x3ab0f90e,0x3ae0a89f,0x3ad414ee,0x3a70554b,0xb96c81f0,0xba980d9e,0xba9b6882, +0xb91549a0,0x3a2763ab,0x3a5786e0,0x3a14f672,0xba0e81eb,0xbaa5823d,0xba93d63f,0xb99bb40a,0xbab1ef27,0xbab92d3d,0x398fefb4,0xb8a28ee1,0x37fb087f,0xb7167d0f,0x36ecd88e,0xb527c2c2,0x3634735c,0x3575ac6d,0x35d2f18a,0x35a773ed,0x35d40176,0x35cb1d6c,0x35c83787,0x368312ca,0xb6957019, +0x36ae38b6,0x37a3358b,0xb9cdf494,0xba076d73,0xba221f1e,0xba2f5292,0xba0e0627,0xb98fca80,0x3837c71c,0x3a91d0c7,0x3abce299,0x3aab2b88,0xba2e436a,0xbab43dd1,0xba43b84d,0xb901da4d,0x3a259316,0x3ac0c5fe,0xba27f182,0x3ae6c35f,0xba57031d,0x38b0e930,0xb7c3f5e8,0x376928b4,0xb74e6c78, +0x3554cba7,0xb6bc8916,0xb612e1fc,0xb661be34,0xb61a2908,0xb63bf584,0xb6337203,0xb650eb85,0xb61c7c1c,0xb6d15348,0x36427698,0x3684ca96,0xb8930f89,0x3a0b2eb0,0x39b764d7,0x3982be79,0xb5f98274,0xb9111570,0xb9a8636d,0xba1dac31,0xba2d179c,0xba3c080b,0xb9dd9676,0xb9843ee2,0x39a0af37, +0x3a7ee623,0x3ad2715e,0x3b07308d,0x3b26b936,0x3b22941f,0xb9f1063a,0x3985cd0c,0x386bd385,0xb8a62407,0x380fc926,0xb5ec04cb,0x3746a022,0x36a473b5,0x37074f5d,0x36b39c4f,0x36bc25d4,0x36b2b83e,0x36c7a149,0x36c39104,0x36c8f2e7,0x370cfa19,0x36cf7b41,0xb808be37,0x37b1e046,0x3a107c67, +0x39ee8788,0x39f0fbf8,0x39ae2965,0x39720574,0x38793969,0xb917cb4b,0xb9937d76,0xb9abab6f,0xb9b5bd05,0xb9c3ba89,0xb9f928af,0xba19030a,0xba56830b,0xba629a7c,0xba54af36,0xba48d071,0x39fac0f7,0x3a2a02b8,0x38ed7e4d,0xb776fa2f,0xb6fd11a3,0xb7e07615,0xb709ba40,0xb791127a,0xb77bec02, +0xb75e3168,0xb7458f38,0xb74a05fc,0xb75d1c12,0xb75938b3,0xb74dd635,0xb7863d3c,0xb7f973f1,0x3885f3cb,0xb8395f8e,0xb9b7cdf3,0xb9a794c5,0xb9b8408a,0xb9bc2836,0xb9d88779,0xb9f0a08b,0xba070acb,0xba024d65,0xba03cd33,0xba056b38,0xb9c204a8,0xb9748a54,0xb8b53de9,0x38786d3b,0x3947bb4f, +0x39a9df17,0x39f91eaa,0xb9881e50,0xb9639809,0xb921d63b,0x3818f792,0x382210d0,0x385c4ae6,0x37998fca,0x3835062d,0x382158d7,0x3821655c,0x381913a6,0x3815bba0,0x380525ef,0x381a974d,0x37845f4b,0x385a0b22,0x38685f6f,0xb71e104b,0xb9747042,0xb98ade96,0xb988aab3,0xb9a0b4bb,0xb9a87e1b, +0xb9b8bc04,0xb9c16c21,0xb9cdb497,0xb9be6a6a,0xb9b1c5fc,0xb9ad9b38,0xb9ad9191,0xb9b4e79b,0xb9be0caf,0xb9b49134,0xb9a94cd7,0xb9a87afc,0xb99a3c01,0xb97aa3ca,0xb96ab81d,0xb99c615d,0xb9a05823,0xb9aab609,0xb8684afb,0xb8afca36,0xb8ac782b,0xb8b3f11b,0xb8ae9846,0xb8adb151,0xb8a8fee8, +0xb8a8e52d,0xb89d9a1d,0xb8a5f29e,0xb885a989,0xb9a6bd4f,0xb9a3ddb8,0xb99ea475,0xb9932909,0xb9a2f025,0xb9a554bf,0xb9abe7a7,0xb9affca9,0xb9b4c18c,0xb9bd9fb2,0xb9b886f6,0xb9b547ac,0xb9ad7b32,0xb9a7b2a9,0xb99eaa1d,0xb9964c00,0xb990d258,0xb98c3f60,0xb983e3a2,0xb9807b76,0xb9b9c6db, +0xb85c765a,0xb846e7ed,0xb823b443,0xb8af66fa,0xb8c5e684,0xb8e2d3aa,0x37002bde,0xb42b1a03,0x37e191a1,0x37e7bbaa,0x37e726d4,0x37ee68ae,0x37fdb67d,0x380914ff,0x380f7df6,0x355bb068,0x37090d64,0xb8edc93d,0xb8aa6c74,0xb87f2203,0xb7f8cebf,0xb85267d6,0xb8557b64,0xb87d163e,0xb846b846, +0xb83c2f17,0xb8485004,0xb8440b69,0xb853b7ba,0xb88bd308,0xb856003c,0xb83548cd,0xb7b4ae9c,0xb82ded42,0xb8367374,0xb82670e8,0xb8285e65,0xb8171cf8,0xb8973992,0xb8b3e774,0x37f5f2b8,0x380ca25b,0x370b42a1,0xb50d0a2a,0x35d919a4,0xb66bb543,0xb6023b00,0xb5f7e838,0xb67f24c5,0xb6ebb6e3, +0xb6782944,0x368cdcd6,0x3728073c,0x37f7252b,0x37f2a79c,0xb884ea15,0xb835c327,0xb898bdf9,0xb8cbaf3f,0xb8eb1858,0xb8a3eca2,0xb8804a72,0xb883e77d,0xb854b9b1,0xb8867f21,0xb8e658a7,0xb89c7c66,0xb84f9c2e,0x35ed6fac,0xb8262dae,0xb84c23a8,0xb8197ffb,0xb82f616f,0xb7bb5193,0xb8f48699, +0x37c8b07a,0xb7149395,0xb6266cd9,0x3575d349,0x367c9565,0x35a38225,0x35dc89d7,0x35ca215d,0x35623d63,0x35ef0bfe,0x3658d221,0x364e0eff,0x363a938c,0x3616e084,0xb70d3ba1,0x3597ae1b,0xb5faeb1e,0xb7ea1b0b,0xb865e578,0xb8afa1be,0xb8fa024d,0xb8679dfd,0xb80cfc30,0xb8583ace,0xb846d9c3, +0xb8a427db,0xb91c7aa7,0xb8918bbc,0xb80ce30b,0x38968a71,0xb81380f2,0xb8095aa3,0xb585c577,0xb7eefe94,0xb83386da,0xb8f10db9,0x37d8e576,0xb63ba20f,0x373a44ea,0xb6083e1b,0xb57f7b91,0xb5816e89,0xb50fe62d,0xb5426a9a,0xb50be0dd,0xb5500ce1,0xb5b56f85,0xb5749d23,0xb61d9248,0x3658c982, +0x3607a5e3,0x372ad5c1,0xb6c09250,0xb8458431,0xb918bbe6,0xb96c7a58,0xb9903c27,0xb928f7b1,0xb8b6c8fc,0xb8b40c93,0xb8727f17,0xb9015939,0xb986ecc5,0xb926b64c,0xb85a1e20,0x38d756c3,0xb81ae89d,0xb895ee7f,0xb73052ab,0xb7e740c3,0xb78fc033,0x377615dc,0xb728f63a,0x37920aec,0xb73b5ac2, +0x360f6a32,0xb4c74ac7,0x3584bf34,0x3383f38c,0x350734f1,0x3454d2f6,0x3517032a,0x34aefae3,0x359667bc,0xb459e42a,0x359c12a9,0xb708e7c9,0x378c7d46,0xb81a6b33,0x3900c1cc,0x3990db63,0x39ade150,0x39d62d02,0x399e5642,0x3949ee9b,0x3894c76c,0x37439837,0x38807787,0x3911533d,0x39921598, +0x3963a9f9,0xb8aca7ac,0x39049e5f,0x3919c199,0x38fd9744,0xb75762b1,0x39263859,0x38a83147,0xb83b28ef,0x37def7a9,0xb71c87dd,0x36a56d3e,0xb6249050,0x350d9f40,0xb52d276b,0xb3995728,0xb4b12894,0xb44fbc1d,0xb4f8cc43,0xb44676df,0xb56be68b,0x35bddb9d,0x337211a1,0xb531d842,0x37ca0d31, +0xb8eb3708,0xb97ed7f3,0xb9ab0e56,0xb9bbcd84,0xb9a40b5b,0xb932f144,0x3752800f,0x395e6f00,0x397c23cc,0x38b042aa,0x3725f178,0xb848dfc7,0xb9049817,0x38dea771,0x395de5f4,0x3980f9d0,0x39594f41,0x37f6d837,0x37af9f29,0xb5308bb0,0xb681d1fb,0x35329243,0xb5704ad7,0x3521539e,0x34c3e5d6, +0x34b7a24d,0x34a45ca2,0x34822264,0x34b1ac8d,0x34865633,0x350e466d,0x33d7f9e1,0x3444b480,0xb62dd5ef,0x36ab3195,0xb78e2731,0x3887980b,0x395eb17c,0x3996e06b,0x39bba755,0x39a63ec9,0x39353145,0xb83fc098,0xb96b5c09,0xb9587e60,0x3818dec9,0x3936823d,0x395963ab,0x392bf715,0xb8f78910, +0xb98b55df,0xb944fc53,0xb870cc02,0xb992d61d,0xb93ccd18,0x3877cab4,0xb78eb476,0x374257aa,0xb6443c9f,0x353e7a04,0xb5ac38fd,0xb4c3a333,0xb5208d50,0xb4e9cf4c,0xb4d64bf4,0xb533fcec,0xb45d144c,0xb5ae3b5b,0x35ed35aa,0xb57fbfc4,0x36756bd2,0x36ab9e43,0xb858590d,0xb8a34073,0xb8ca4060, +0xb8bb84f0,0xb899a1e1,0xb6ee440f,0x38a5bfb4,0x39a21c3a,0x39b151a6,0x396f0f34,0xb93d814a,0xb99a7f94,0xb8c237cb,0x3827614a,0x3952ea8c,0x39c3c6bc,0xb8e54cb7,0x39f3e176,0x36e975a9,0x35585022,0xb43fb043,0xb6d68b55,0x349aa3be,0x357b4024,0x35d2ad99,0x35962cb8,0x35934620,0x354ced34, +0x358da6c3,0x3535def1,0x35deed54,0xb46b01dd,0x362f048c,0xb727d4c8,0x376ede07,0xb7f870a9,0x38a1f446,0x388d925c,0x38008d9b,0xb71e1b0a,0xb83b4d6b,0xb8a3378c,0xb906df2d,0xb9100ac4,0xb911c117,0xb8939ee3,0xb6a2bb58,0x39112004,0x39a4f07c,0x39ec332a,0x3a0fd778,0x3a2e546f,0x3a1bae4e, +0xb8f78811,0x365a6fab,0xb7e68073,0x380372c3,0xb6df122f,0x3678a531,0xb698be79,0xb60a91cf,0xb64983a3,0xb60663a0,0xb5f87b17,0xb5f25613,0xb618609a,0xb5e10ff8,0xb6596428,0x360b2cbd,0x35aa99df,0x378cd2af,0xb8279428,0x38d6166c,0x38ec4f84,0x38eaf4e7,0x38c81dff,0x38904c6c,0x380babaa, +0xb6d28bfb,0xb811f6a1,0xb847ea51,0xb8774bb6,0xb89740b5,0xb8cd485e,0xb8f87546,0xb940fff1,0xb95f6f11,0xb95aa3a9,0xb9596098,0x390c3bc0,0x3931f890,0xb83aa357,0x371c9f1d,0xb6fcc059,0x36b58e7b,0x36a37a3f,0x36e921db,0x36ce6870,0x36abc2ce,0x3680482c,0x36987efd,0x369bad2f,0x36a967ad, +0x3681208b,0x35baa906,0xb741fd90,0xb71c92e1,0x37db224d,0xb88a06be,0xb86b7acd,0xb88c3c86,0xb88de519,0xb8a76016,0xb8b9d2df,0xb8d41378,0xb8cf8f46,0xb8d50044,0xb8da61fe,0xb891e501,0xb81792de,0x350889bb,0x380e3d07,0x388aac63,0x38cdea0a,0x39073bbe,0xb85577b4,0xb7afda8b,0xb7da4796, +0x37eaf0ff,0x37eecacc,0xb56f12b2,0xb728d325,0xb74b2f0e,0xb78a4582,0xb76d4239,0xb76fd127,0xb75ea834,0xb773d055,0xb73aed53,0xb71d0657,0xb540ccde,0x37cba90a,0x383db4d4,0xb87f00c0,0xb8c32151,0xb89dca7d,0xb8b8043d,0xb8b7adfe,0xb8c301df,0xb8c680e9,0xb8cd3c75,0xb8b49ce9,0xb89f1fcc, +0xb892db74,0xb88af9a7,0xb88a6cbe,0xb88a41a2,0xb8827f14,0xb873571b,0xb876e7d2,0xb854fb48,0xb83c0222,0xb835053a,0xb8970a07,0xb89728c6,0xb8b6afe9,0x3804ec84,0x37ad7180,0x3813e900,0x38191b72,0x3817282a,0x38186b27,0x3817a41a,0x381b07dc,0x381b744b,0x37991c1f,0x38095eed,0xb8cf5366, +0xb8bc0110,0xb8d19251,0xb87aec31,0xb89b795a,0xb89af234,0xb89ebc16,0xb8a175f3,0xb8a3ff76,0xb8ab6f04,0xb8a32bc6,0xb89d5000,0xb892c0d3,0xb88a5152,0xb87e46a7,0xb8674c9c,0xb8618dd6,0xb858a586,0xb84b003f,0xb841aeb8,0xb89d064e, +}; + +const uint32_t defaultHRIR_rom_AlphaL16[470 * 43] = { +0x3f02f1b3,0x3ec3e963,0x3f0343ed,0x3ef2dac6,0x3eff8398,0x3f023dbb,0x3f078879,0x3f09fffd,0x3f0c6e63,0x3f090014,0x3f06f396,0x3f04a772,0x3f021691,0x3eff5d28,0x3efa86c7,0x3ef74421,0x3ef3d11a,0x3ef0de30,0x3eed6bc2,0x3ee3fddf,0x3ef71731,0x3eb8463c,0x3e90d6d9,0x3de91660,0x3ec643bd, +0x3e919f12,0x3e00e9a6,0x3e01de92,0x3e06274f,0x3e1c7ed6,0x3e0fd8b6,0x3e0f8e8d,0x3e16fa82,0x3e95c316,0x3ed5430b,0x3e11d349,0x3e95147a,0x3e8b6668,0x3f0b505d,0x3f0e4dfc,0x3f173148,0x3f2122f9,0x3f31903f,0x3f39e03d,0x3f3c3061,0x3f3306d3,0x3f2ab4d0,0x3f22cbf3,0x3f1b0fb1,0x3f1419bf, +0x3f0da064,0x3f08a941,0x3f03c152,0x3f00959e,0x3ef3d58f,0x3eebf556,0x3ee35f23,0x3e6ca878,0x3eb3e62e,0x3eaf074b,0x3e9fc344,0x3e8fd97e,0x3eaa0eb0,0x3eabfe1d,0x3eae3201,0x3e9a635d,0x3eb20801,0x3ec018e8,0x3ead357a,0x3ebb77de,0x3ea9329c,0x3ead2db0,0x3ee3931d,0x3eb4dbb1,0x3eff8a54, +0x3f176afd,0x3f24be97,0x3f3b6443,0x3f5bc63c,0x3f6a7cca,0x3f70f95b,0x3f624afc,0x3f5492cc,0x3f478f06,0x3f38c77a,0x3f2ba723,0x3f1e738a,0x3f14614d,0x3f099f01,0x3f02d0f0,0x3ee6b887,0x3edc678b,0x3ead07a3,0x3e812a3a,0x3e66fc19,0x3e6de299,0x3e5b5450,0x3e1a818c,0x3e50f8bc,0x3e0b2a3a, +0x3e6964ae,0x3e0f9eb9,0x3e5b122d,0x3e27486d,0x3e56e18a,0x3e6a7e4a,0x3e8130cf,0x3e82f2f3,0x3eb56504,0x3e904be1,0x3f011938,0x3f1fbfae,0x3f341d2b,0x3f5a3682,0x3f888e01,0x3f95995c,0x3f977341,0x3f87be6e,0x3f7379de,0x3f5b9668,0x3f442825,0x3f2f05ad,0x3f1c8ac8,0x3f0e01aa,0x3f0033f2, +0x3eeed46e,0x3ec9aabb,0x3eb24ee1,0x3e833e6d,0x3ded9e37,0x3e23f821,0x3d7f1cf4,0x3d9f9154,0x3d6b7f03,0x3d47119c,0x3d009fd3,0x3c9be5ac,0x3d7a078e,0x3d2c90ac,0x3daaab70,0x3de25ede,0x3e16f41a,0x3e2cb483,0x3e3c5e6c,0x3e91dfa8,0x3ec49ae9,0x3f0b7a24,0x3f397b0b,0x3f5badf8,0x3f80520f, +0x3f8a1e16,0x3f964bc4,0x3fa1965a,0x3fb0d377,0x3fb2f653,0x3fa58f9c,0x3fa1d1ec,0x3f987f64,0x3f8da962,0x3f7ea6f1,0x3f61511b,0x3f4877e7,0x3f225993,0x3f088f8c,0x3ec28018,0x3e41bf74,0x3e4e4eae,0x3e032ec2,0x3dc60ba0,0x3d6e5e69,0x3d34e8c6,0x3d35f340,0x3d6649ce,0x3dac4fc9,0x3d927d54, +0x3dcd5be6,0x3ddb5817,0x3e23efc0,0x3e2cbfa1,0x3e6d49c0,0x3ea2b6c3,0x3ecdf198,0x3f1d0b33,0x3f5f5459,0x3f7a631d,0x3f9399e7,0x3fa0a0ae,0x3fa9cbbb,0x3fa6b653,0x3fafb320,0x3faa5efd,0x3f9c21ea,0x3f974db2,0x3f8e2d9b,0x3f832e17,0x3f68080d,0x3f4d93ad,0x3f3b6dcf,0x3f1e3000,0x3f0fe18d, +0x3ecd6516,0x3e914079,0x3e7796fd,0x3e3c539f,0x3e20b7ae,0x3deaed54,0x3d9b0be5,0x3d8a56aa,0x3d805a8e,0x3d62cd20,0x3d99e108,0x3da685d1,0x3e2650cc,0x3e33264d,0x3e979b5d,0x3ea2f75f,0x3edf0e5f,0x3ee4ea0c,0x3f4ce39b,0x3f9085fa,0x3f9d2c5f,0x3faad883,0x3fa39c58,0x3f9d4148,0x3f9a1ae5, +0x3f9b81c1,0x3fa08ee2,0x3fa5243b,0x3f9ba1da,0x3f8e373e,0x3f7cbf74,0x3f572bc2,0x3f37c950,0x3f25c397,0x3f04e9b7,0x3ef080bd,0x3eae71cd,0x3e90fe7f,0x3e84aaef,0x3e64ca39,0x3e36785a,0x3e1bb482,0x3dfcecc0,0x3db35f26,0x3dbefe63,0x3e069d25,0x3db8d599,0x3dc4fa9e,0x3df96591,0x3e02b2ae, +0x3e9dd194,0x3e8e1df5,0x3ee85484,0x3f08b626,0x3f70146a,0x3f964666,0x3f9d9511,0x3f99194f,0x3f9ecfe5,0x3fa99cd2,0x3fb63ead,0x3fb359c2,0x3fabea6d,0x3f9cd7d0,0x3f955ab7,0x3f89db88,0x3f72f4ec,0x3f5d6e56,0x3f3e9432,0x3f1675c3,0x3ef47116,0x3edb7fcb,0x3ebd44da,0x3e640758,0x3e8a5ee4, +0x3e770ec1,0x3e3bc748,0x3e1d8020,0x3dd1c8b0,0x3de98389,0x3db6002d,0x3e72e277,0x3e148bb6,0x3dd9fffc,0x3e3c0cde,0x3e18ec8c,0x3ea3c517,0x3e8620c4,0x3ee70ac9,0x3f1a4e3b,0x3f7a5b43,0x3f9d8cf5,0x3fa60e1f,0x3fa4cf54,0x3fa6fa32,0x3fa8ceee,0x3fafdc20,0x3fa61752,0x3fa2b16e,0x3f9fec2e, +0x3f9138d7,0x3f81910b,0x3f64d6f5,0x3f3896b3,0x3f181cdf,0x3efe528d,0x3f07d297,0x3f0ff0ad,0x3f0628d6,0x3e9bb5db,0x3ebcaecd,0x3e668264,0x3e59b1ca,0x3e701d98,0x3e390fc7,0x3deabc40,0x3e1e2c9c,0x3dcfa375,0x3e2fdb94,0x3e462bea,0x3e885182,0x3e89c6dc,0x3e874c9b,0x3ea13b10,0x3f1a51c4, +0x3ef2773d,0x3f6411c7,0x3f8a04b9,0x3f896d9f,0x3f8d04c6,0x3f93c7f3,0x3f964f7a,0x3f952f02,0x3f8f086b,0x3f8723f3,0x3f7f3f87,0x3f6b924e,0x3f57b23d,0x3f429bcc,0x3f2cc7af,0x3f1b90ab,0x3f10b436,0x3f1d118e,0x3f2c3755,0x3f02aaf5,0x3eb3fc54,0x3ede750d,0x3ea45125,0x3e98af99,0x3e6b9392, +0x3e29c827,0x3e1bb41d,0x3e0093b7,0x3e9ad3a7,0x3e5bd7e4,0x3e609a29,0x3e87f276,0x3e9132d2,0x3ec5615b,0x3ecfaf25,0x3f182cbe,0x3f149f02,0x3f4a68c9,0x3f6ef967,0x3f7354da,0x3f853b77,0x3f8534c5,0x3f867161,0x3f87ba3b,0x3f80da3e,0x3f752e5c,0x3f678e52,0x3f5644fa,0x3f448693,0x3f2def11, +0x3f2aa476,0x3f2305af,0x3f1b7b3f,0x3f1398aa,0x3f20d27e,0x3f0b00df,0x3ebe246a,0x3eb51a89,0x3eab690f,0x3ea6a01c,0x3e4ac166,0x3e9f19a2,0x3e2dbd83,0x3ec0d2c8,0x3e2a1d74,0x3e9b4bd1,0x3e472eee,0x3e79a839,0x3ea12087,0x3eb45e43,0x3ec0d6a2,0x3f0f4661,0x3e959f2e,0x3f4c56a5,0x3f4da09a, +0x3f50c066,0x3f58059e,0x3f5d586d,0x3f64d859,0x3f6dcbdf,0x3f660ad7,0x3f60421d,0x3f5a31be,0x3f522c16,0x3f4a7365,0x3f3ef3e5,0x3f3bd59c,0x3f36e2f8,0x3f349fdb,0x3f300593,0x3f2e9917,0x3f29e283,0x3e84db4c,0x3f076fbb,0x3f0715fa,0x3eff7902,0x3ee21ab0,0x3f0a0619,0x3f0ef752,0x3f0fc764, +0x3ef4c71f,0x3f13c509,0x3f1bd1a5,0x3f04083e,0x3f1022fe,0x3eff9bb1,0x3f0349db,0x3f2ea9aa,0x3f169c67,0x3f56e463,0x3f3fcc3e,0x3f47e620,0x3f484c5d,0x3f4b084f,0x3f4caa25,0x3f501fa8,0x3f4bd8ac,0x3f493e57,0x3f464745,0x3f43f73d,0x3f41de65,0x3f3f6777,0x3f3f6b8c,0x3f3eae2c,0x3f3d9b87, +0x3f3ce59f,0x3f3667c8,0x3f4c933e,0x3f0c0e63,0x3ece60b1,0x3da63278,0x3f1c8ed9,0x3ed318d6,0x3df32d24,0x3deee4e9,0x3dfbb720,0x3e2a846e,0x3e091330,0x3e0c0351,0x3e1accd1,0x3ed727bb,0x3f298456,0x3e04a2ad,0x3ed21b3a,0x3f590b58,0x3e9c6bc8,0x3ebf4443,0x3e87958d,0x3e9ae968,0x3e95cf54, +0x3e960ce8,0x3e931735,0x3e901ea5,0x3e88d968,0x3e8a249c,0x3e899355,0x3e8a69d3,0x3e8b005b,0x3e8b60e0,0x3e8be859,0x3e89f584,0x3e89fffb,0x3e8aaec1,0x3e8cb6d8,0x3e919727,0x3e807a91,0x3eb894b2,0x3ed43b4e,0x3f05649b,0x3ea4342e,0x3eccf09f,0x3effbb51,0x3f006946,0x3efe526b,0x3ef8686b, +0x3efc0cbf,0x3efe6ccd,0x3efde50e,0x3ece6d22,0x3e9f023b,0x3f0485f7,0x3edd4a26,0x3f05443c,0x3eb4af25,0x3eb2eed0,0x3eb35ce6,0x3ead8285,0x3ea24231,0x3e95bc62,0x3e8621fd,0x3e8d35e0,0x3e9287fb,0x3e9a16a9,0x3e9d882e,0x3e9e928b,0x3e9e63e3,0x3e975071,0x3e95d99f,0x3e960bbe,0x3e9cec14, +0x3e9cb32d,0x3e9ec4ce,0x3ee5601c,0x3eab5cd0,0x3ea5b5f6,0x3ea9953d,0x3eae619f,0x3e938c44,0x3e93f893,0x3e9565df,0x3ea68386,0x3e9079fe,0x3e8680c1,0x3ea1b17b,0x3ea2dce7,0x3ebd0964,0x3ec2a8f6,0x3eadebba,0x3ef25d3f,0x3eec6175,0x3ed46eee,0x3edca405,0x3ecc217c,0x3eb0e4b1,0x3e9b8618, +0x3e716264,0x3e83f43b,0x3e87986d,0x3e8fad60,0x3e93baf1,0x3e946e3e,0x3e94d080,0x3e897f52,0x3e89a966,0x3e8c8817,0x3e9c5b11,0x3e992b90,0x3eacba95,0x3eb56c95,0x3ea9e299,0x3e98dd5b,0x3e911adb,0x3e96efa7,0x3e784db0,0x3e9342e5,0x3e763565,0x3e990c3e,0x3e6fbfcc,0x3e8bed7a,0x3e8f1777, +0x3ea051bc,0x3eb0ec9e,0x3ec134a0,0x3ec7e04b,0x3f0a6d60,0x3f096828,0x3ef70128,0x3efb194a,0x3ed9bff4,0x3e9fbe83,0x3e677463,0x3e11881f,0x3e623999,0x3e904499,0x3eabe90f,0x3eb920bc,0x3ebbe7a9,0x3eb6f35e,0x3ea04b3f,0x3e988a1a,0x3e96ab5e,0x3ea4498b,0x3ea52f11,0x3eab13ff,0x3ea879c9, +0x3e801fec,0x3e7047e9,0x3e43e2cc,0x3e286d33,0x3e07c088,0x3e081579,0x3e06caa0,0x3e15c812,0x3e0df302,0x3e1bab0e,0x3e4cade5,0x3e80fea5,0x3e9bd2c7,0x3eada948,0x3ed5a4bd,0x3f1f66a6,0x3f23b36b,0x3f26e13c,0x3f27da99,0x3f2370d0,0x3f1f54ac,0x3f0f6be0,0x3eee0f5a,0x3e865630,0x3e0b9c53, +0x3df785a0,0x3d122880,0x3c82e31f,0x3d1b0bdb,0x3d5d2083,0x3de50518,0x3e358ca3,0x3e8c9000,0x3e96bde1,0x3ea21ad4,0x3eba362b,0x3e930468,0x3e84a049,0x3e4bf891,0x3e2c02bc,0x3e1231db,0x3e1cd19d,0x3e1cc444,0x3e21cab5,0x3e10b35d,0x3e3470eb,0x3e77f241,0x3e9ec585,0x3ec83d0e,0x3ee23383, +0x3f0aa0c1,0x3f3e330b,0x3f35d992,0x3f19ef09,0x3f24a909,0x3f2a7584,0x3f21ea93,0x3f15d383,0x3f16e7fe,0x3ee7c500,0x3ecaff5e,0x3ec87e9f,0x3ea18754,0x3e894d3e,0x3e79bc93,0x3e8b420e,0x3e97cdf7,0x3e9b4520,0x3ec2f3ca,0x3ec59f69,0x3ed80e1f,0x3ec54118,0x3e9abf6b,0x3e8029ea,0x3e45989f, +0x3e1fdf75,0x3dfe4446,0x3e03c9e4,0x3e22ca2a,0x3e788d94,0x3e6f4197,0x3e8d6f1a,0x3eac6808,0x3ec2b955,0x3ed9d2bd,0x3f0a6e9e,0x3f1b8004,0x3f47ede2,0x3f2c71a8,0x3efcb323,0x3f05f045,0x3eff6c84,0x3f334692,0x3f528118,0x3f4a2d6b,0x3f3bc09e,0x3f120564,0x3eaf8c68,0x3e768e27,0x3e4d3ca8, +0x3e65eceb,0x3e969e3a,0x3eb4033d,0x3ebd66b2,0x3ee43c67,0x3ee890ce,0x3ef71c5b,0x3ee4da01,0x3ece74d5,0x3eb55e00,0x3e8f5de6,0x3e7a8492,0x3e828da9,0x3e952176,0x3e9ccfb0,0x3edc45ff,0x3e92246d,0x3e9495b3,0x3ea9cce8,0x3edd4663,0x3edd14e3,0x3f1407ce,0x3f143095,0x3f4451bc,0x3f0849cf, +0x3eb3c957,0x3efdcf5f,0x3f49e5f4,0x3f3bca87,0x3f210903,0x3efb413d,0x3ee3cb71,0x3ebe1fa0,0x3ea76193,0x3e88c40c,0x3e795709,0x3e8b5771,0x3e8a94de,0x3ea34bd0,0x3ed008c9,0x3eed9446,0x3ef6aad7,0x3efad608,0x3f0739c3,0x3ef1e1d0,0x3ee13976,0x3ec754d5,0x3eacf5bd,0x3ea25180,0x3e5e72ef, +0x3e9898af,0x3f1a7377,0x3eb22b11,0x3ea3d715,0x3eb2f6ee,0x3edb0892,0x3ed9fb12,0x3f1536d1,0x3f201b25,0x3f1ed4bd,0x3e9e586e,0x3e7778c7,0x3eb9be83,0x3ef58878,0x3f09e22d,0x3f061cc0,0x3ec14584,0x3ea6fa61,0x3e731686,0x3e3fecb0,0x3e52c813,0x3e801570,0x3e9a15c6,0x3ecfb2ca,0x3ef63fbf, +0x3f087789,0x3ef396e2,0x3ed85868,0x3ee393ee,0x3f0d0096,0x3ee7628c,0x3ef233d8,0x3ed6e46e,0x3eb4069f,0x3eb0462e,0x3eb6c5fa,0x3ebc2cb1,0x3efc2568,0x3ec46a2a,0x3ec09c9d,0x3ea94656,0x3ed862d8,0x3f0154a5,0x3f11a2e3,0x3ee3ab35,0x3f406a53,0x3ebc552e,0x3e80760c,0x3ecb248b,0x3ef280ad, +0x3f039ed1,0x3f015586,0x3ee6a208,0x3eeae36d,0x3eed4ec2,0x3eecd5e1,0x3eddff4f,0x3ee026a0,0x3eee85c3,0x3f022784,0x3f084bf3,0x3f06bea9,0x3ef3b76d,0x3ec0b877,0x3eea3afd,0x3f151446,0x3edc5c2f,0x3eeda52e,0x3ed43d97,0x3ed03924,0x3ed11fc5,0x3ed78523,0x3ee37ab5,0x3ea7f7d6,0x3ed5d624, +0x3ed72fe5,0x3ec83708,0x3ed7a6e7,0x3ed01d69,0x3efd2aad,0x3ee48d7f,0x3f1b1d9b,0x3ee42415,0x3eb55ea2,0x3ede88ba,0x3ed6ee5e,0x3ed6a58d,0x3ed7c153,0x3ee0958d,0x3eeec698,0x3efb4c2c,0x3f057894,0x3f0e8702,0x3f17032e,0x3f22c49d,0x3f1babbe,0x3f19fed8,0x3f1739dd,0x3f0e5092,0x3ede9639, +0x3eee4e42,0x3f15e246,0x3f0ac3ed,0x3f02045b,0x3ef4cd77,0x3f0d2e8c,0x3edba031,0x3f09457c,0x3eb97330,0x3f0a1b73,0x3ed96408,0x3f0ba1a0,0x3f00933b,0x3f0a5461,0x3f144f61,0x3f25ed2b,0x3f0a1d0f,0x3f5ccb17,0x3eafd0ad,0x3eb10a9a,0x3eb91d47,0x3eb6c80b,0x3ebbac1f,0x3ebb3f32,0x3eb9db12, +0x3ec29c8a,0x3ecb9fb0,0x3ed3ba74,0x3ee0c151,0x3eeda4fc,0x3f022f39,0x3ef84ae0,0x3ef052b2,0x3ee3fd49,0x3edd04b6,0x3ecc906e,0x3ecb5614,0x3f4a6b17,0x3ef4354d,0x3eee5c7d,0x3eef401d,0x3efd5703,0x3eb8213c,0x3eb4867a,0x3ebd4c3a,0x3ee92874,0x3eb9f6e4,0x3ea28d7d,0x3ed336da,0x3ed1e0a4, +0x3f037127,0x3f098f95,0x3ec62dc3,0x3eff80e8,0x3e341eb8,0x3e9414f2,0x3e882d92,0x3e8a4e4b,0x3e8aacff,0x3e8bd678,0x3e8c01a7,0x3e9205a1,0x3e96ed8f,0x3e9c2ced,0x3ea03fe4,0x3ea35130,0x3ea97ab2,0x3ea0de9d,0x3e9c7086,0x3e9781b0,0x3e93da8a,0x3e9a7429,0x3e450b38,0x3f03e45e,0x3f29c2e6, +0x3f73d949,0x3ed11328,0x3f208fcd,0x3f62e8fa,0x3f650e97,0x3f622396,0x3f57ff13,0x3f613d99,0x3f62abf9,0x3f5e585a,0x3f21da80,0x3ebe28e7,0x3f6eea8f,0x3f2ec6ba,0x3e8a97d1,0x3e141a1a,0x3deacee8,0x3df88264,0x3defdd9b,0x3de9b8ee,0x3de402ba,0x3de658c6,0x3defce6e,0x3e044230,0x3e0ac188, +0x3e0fb2a8,0x3e117bbd,0x3e10baf1,0x3e11c618,0x3e1445db,0x3e158953,0x3e14f90e,0x3e137275,0x3e0f11d3,0x3e0c16b6,0x3e0b8a14,0x3dfcad72,0x3dea58af,0x3dd5612a,0x3e004cb1,0x3de4957e,0x3dcd0fbd,0x3dd6727f,0x3ddaa37d,0x3de22fb9,0x3dccc24e,0x3dc5f7ef,0x3dc70ac4,0x3ddde30b,0x3df709dc, +0x3dd86738,0x3de1d3dc,0x3dea78ca,0x3dcd5b42,0x3dc7471e,0x3db5cf26,0x3daabf5c,0x3dae2294,0x3dd3cba4,0x3e0fc7bb,0x3e229ded,0x3e2ce54d,0x3e29757d,0x3e25d7ec,0x3e26fe9c,0x3e2eeee7,0x3e35be3d,0x3e36d5e6,0x3e3240fc,0x3e275ecd,0x3e200af5,0x3e190b3e,0x3e13126c,0x3e1a542b,0x3e17f093, +0x3e1050b7,0x3e0e4272,0x3e0b0e46,0x3e18bd9b,0x3e197e54,0x3e1a4eb8,0x3e0cdecd,0x3e06bb53,0x3dfc8b45,0x3deeb4f6,0x3defccd3,0x3e091909,0x3e00ec1f,0x3df0c72c,0x3d8aa7b7,0x3d26e703,0x3cb65dd1,0x3c1fafd5,0x3ca1cba1,0x3d498197,0x3e01ff82,0x3e262a9f,0x3e40f524,0x3e41ef75,0x3e407cbf, +0x3e464a54,0x3e5665c1,0x3e5fffa0,0x3e5faae7,0x3e526bde,0x3e3ff147,0x3e3065d6,0x3e2619aa,0x3e310166,0x3e2943b5,0x3e235858,0x3e19d4e6,0x3e1475d0,0x3e00ed9b,0x3e1e36d1,0x3e2919ce,0x3e2d0baf,0x3e076fd1,0x3de91dcd,0x3df3638e,0x3de419b6,0x3df12f8b,0x3e12a460,0x3e0242be,0x3dbea3ac, +0x3c9c1149,0xbc895fde,0xbd143b04,0xbd39d95a,0xbc44c70f,0x3d63e6af,0x3e335bce,0x3e5dadc8,0x3e6bb5cd,0x3e563ffc,0x3e44a8d1,0x3e473a3a,0x3e622d40,0x3e798ccc,0x3e7d475c,0x3e6edc86,0x3e55f40d,0x3e4365dc,0x3e3ca109,0x3e58218f,0x3e4753dd,0x3e3c530e,0x3e2cd2a4,0x3e241160,0x3e09c354, +0x3e1ee07f,0x3e1b9ee4,0x3e2f2af1,0x3ddf91bb,0x3db267fe,0x3dbc5405,0x3d9d7921,0x3dcea0ec,0x3e102f9f,0x3dc607b6,0x3e75695c,0x3dc81584,0xbd9da3b7,0xbe26d4e2,0xbe91258c,0xbebc200b,0xbec4139f,0xbe9a404f,0xbe0cdd91,0x3c7e45d1,0x3dd7fe0d,0x3e4f1e4a,0x3e841911,0x3e9117f6,0x3e957877, +0x3e91f683,0x3e9006a6,0x3e6210fe,0x3e51450c,0x3e60a94f,0x3e57f2fb,0x3e529e94,0x3e469c21,0x3e30187b,0x3e182539,0x3dcc1d72,0x3e1b4cd3,0x3e28feca,0x3e2a09f2,0x3e1b96c5,0x3e2c3d03,0x3e5ced7b,0x3e5b0c72,0x3e7687f4,0x3e7d011a,0x3e7a6d4b,0x3ba3f569,0xbe1bb3f0,0xbe96bcf6,0xbebc7e52, +0xbf15081a,0xbf15b191,0xbf15f4a1,0xbf1359be,0xbef801b6,0xbec5667d,0xbe927970,0xbe1f9ce3,0xbca49615,0x3dec9f42,0x3e44f743,0x3e7684ef,0x3e86146e,0x3e63b72b,0x3e514d6d,0x3e64d663,0x3e682c88,0x3e522c22,0x3e3cbd37,0x3e30ce14,0x3e2024ef,0x3dede73f,0x3e26d7bb,0x3e311257,0x3e645c1a, +0x3e39312d,0x3e32ed13,0x3dec9c44,0x3e006954,0x3d70fb44,0x3d2ae870,0xbd2be125,0xbe351e05,0xbea7b4f4,0xbf00652b,0xbf17029e,0xbf395c8d,0xbf54d5ce,0xbf6eba99,0xbf6ebecd,0xbf5b8ee6,0xbf335038,0xbef0fbfe,0xbe96f425,0xbe152cdb,0xbd16b16d,0x3c8ba9af,0x3dbe6335,0x3e3e48a4,0x3e73f6cf, +0x3e7cac9a,0x3e8afb16,0x3e92be79,0x3e825d3b,0x3e5f436e,0x3e588883,0x3e396a35,0x3dd774a3,0x3dd7741c,0x3e13ee40,0x3e941ac3,0x3e270cf6,0x3e036950,0x3dfe80e9,0x3dd40c7d,0xbc3607c3,0xbc9c94bc,0xbe0c5911,0xbea607d4,0xbeef6f17,0xbf0f522c,0xbf35d4d8,0xbf6c6404,0xbf59cf8f,0xbf489a1c, +0xbf3440fe,0xbf23b8e2,0xbf07f1f6,0xbecfb9dd,0xbe8afb5a,0xbe172651,0xbd5f194a,0x3d996cad,0x3e1c429a,0x3e3a7a5c,0x3e67897c,0x3e5e7482,0x3e507876,0x3e4aa7ec,0x3ded7846,0x3dd3798d,0x3df4b297,0x3e0016c9,0x3df267dd,0x3e553cfc,0x3e4cd550,0x3d4047e0,0x3e12bbcc,0x3e1be8e0,0x3d4d89d1, +0x3da0a464,0xbc795320,0xbd601904,0xbe4d3b11,0xbeb2df76,0xbebed268,0xbf0762f0,0xbf2cfbce,0xbf3cb11b,0xbf321d01,0xbf1aa42e,0xbedad717,0xbe9ae2c9,0xbe35c324,0xbdabbd32,0xbc640378,0x3d1d5e6d,0x3dac4ad0,0x3da6bb00,0x3dbc28c3,0x3de68969,0x3e0500c8,0x3dcfabf8,0x3d102dad,0x3d5232ff, +0x3cca36c2,0x3d6cf3f5,0x3d7940ea,0x3d89d72f,0x3d97b122,0x3e0e2385,0x3deaeff2,0x3d238ff9,0x3d258270,0x3ccbd347,0x3c49e75c,0xbd3b405e,0xbd9b4a33,0xbe0ae3e4,0xbe556f9c,0xbec1ffdc,0xbeba5ac5,0xbed4cd95,0xbf05a577,0xbf110ace,0xbf0e9f83,0xbeff61b9,0xbec8b24f,0xbe9a630c,0xbe54e3bf, +0xbde51f0d,0xbd2c2d97,0x3bce5f9d,0x3d424de2,0x3c9498b6,0x3b909b26,0xbbd43ff3,0xbd019fd6,0xbd04032c,0xbd6b1896,0xbdace506,0xbd49edb2,0xbd33e629,0xbd01abf8,0x3bbc470e,0x3d57f3eb,0x3d0be673,0x3c8f8d1b,0xbcaaea01,0xbc6d3ef1,0xbb62a8f1,0x3bb9bc5c,0xbd307705,0xbdc9dd34,0xbe2a337c, +0xbe6ca452,0xbeb2633b,0xbeb9267e,0xbeb481a2,0xbed02c33,0xbee0e380,0xbed2147b,0xbec93d3e,0xbec7c078,0xbeb65cc7,0xbea6b09f,0xbe95f846,0xbe935c11,0xbe8d4999,0xbe846856,0xbe822e42,0xbe81e187,0xbe8172e5,0xbe72a966,0xbe498bf7,0xbe49b22e,0xbe44483b,0xbe227145,0xbe03982d,0xbdc08ff3, +0xbd9ed0c3,0xbd5de9cc,0xbd6a7c79,0xbd4b9d7d,0xbd8e0bf0,0xbd669e24,0xbda7e25d,0xbd92a237,0xbe0a353f,0xbe306231,0xbe72bf58,0xbe8d4746,0xbeb19fd5,0xbe74f728,0xbe73b38a,0xbe83b1de,0xbe88fe3f,0xbe927812,0xbe9ad75f,0xbea36319,0xbea2b256,0xbea447a4,0xbea43a99,0xbea5cca3,0xbea768fd, +0xbeac5914,0xbea1e3e8,0xbe97fee3,0xbe8d0a42,0xbe83b7fd,0xbe6b0f6b,0xbe66ef82,0xbe9a980f,0xbe510f2d,0xbe4ab83e,0xbe3dc3b7,0xbe30f53a,0xbdfb9070,0xbdfb95df,0xbe0df8c3,0xbe1e490f,0xbe0afecc,0xbde8d815,0xbe0afc71,0xbe23e069,0xbe55503e,0xbe69307f,0xbe523099,0xbe936f3e,0xbe238fe1, +0xbe495aaf,0xbe49657e,0xbe4c15bd,0xbe52dd91,0xbe57bc4d,0xbe5f11f9,0xbe60bb0e,0xbe641111,0xbe67c3c0,0xbe695b6b,0xbe6a4470,0xbe6efe23,0xbe61a630,0xbe591dff,0xbe4f6ef2,0xbe490ce7,0xbe448fbb,0xbe1e6f1c,0xbe906f36,0xbea599bf,0xbeb823b8,0xbe6a9668,0xbe98d946,0xbea9e1d0,0xbeac067a, +0xbea809af,0xbea4518b,0xbea9249e,0xbeac3343,0xbea89262,0xbe9966be,0xbe6441e7,0xbebb317c,0xbeabc3d7,0xbe427c55,0xbd037788,0x3ca3df8b,0xbd4f58e4,0xbcdfad17,0xbd0b4bce,0xbd083da6,0xbd4ae40b,0xbd6a2aa6,0xbd87a73f,0xbd6ee7e1,0xbd576503,0xbd37bfa7,0xbd210f3c,0xbd1366ac,0xbd0f404e, +0xbd11ce80,0xbd12d2bc,0xbd1418b0,0xbd179a14,0xbcf56daa,0xbd4b5221,0x3c9b2d89,0x3d647e1a,0x3e066c9a,0x3b1faf91,0x3d616890,0x3dfcfc3c,0x3e046c13,0x3e04aa99,0x3df5a837,0x3e00a636,0x3e00587f,0x3df9905e,0x3d68c8e1,0xbab51069,0x3df598e8,0x3d75dfbf,0x3da0ebdc,0xbd1261a1,0xbcc3133e, +0xbce2641b,0xbcff7377,0xbd97cce3,0xbdce98de,0xbdfced30,0xbdeff27b,0xbdd01695,0xbd990f99,0xbd5bc3b0,0xbd2867f0,0xbd22291d,0xbd254b6b,0xbd2c3d64,0xbd35c568,0xbd35ee33,0xbd3521f7,0xbd046632,0x3d951b81,0x3c250d4b,0x3c926565,0x3cd7ee86,0x3d31b065,0x3ca80bbd,0x3d00f793,0x3d1c75de, +0x3d6c544f,0x3d12fff2,0x3ca83855,0x3d16deeb,0x3ca6f748,0x3d1c0cf9,0x3d23c14f,0x3babbdc2,0x3cec9fe9,0xbd206e27,0xbccada72,0xbcee6496,0xbd161562,0xbe00fe32,0xbe2d0c58,0xbe5b8e37,0xbe488ad6,0xbe2465f0,0xbde8bcf0,0xbd9dbc9b,0xbd652f45,0xbd616560,0xbd629451,0xbd714292,0xbd73c02b, +0xbd6c5ed7,0xbd77f08e,0xbc438ff4,0x3cd4adee,0x3d1fc166,0x3cdab396,0x3d012afa,0x3d89628f,0x3d2681a2,0x3dd4d60d,0x3d94ccfc,0x3dfc86fe,0x3daf19ab,0x3de07842,0x3db84e2f,0x3d7f1cb5,0x3d578c00,0x3d7b480d,0x3d10cc09,0x3dab0f78,0xbb6f2929,0x3cdf4273,0x3cf883a0,0x3c35e36a,0xbe0e3f85, +0xbe73aa1f,0xbe9f2301,0xbe9a5f63,0xbe737f69,0xbe12f92f,0xbd99d344,0xbd18a7d8,0xbd114ec6,0xbd380ed1,0xbd4a8545,0xbd57eba1,0xbd7696a1,0xbd76391e,0xbbd1704f,0x3d8dda57,0x3d20823f,0x3dcca2dc,0x3d9cbe56,0x3da44c60,0x3d85505b,0x3df7b794,0x3e1cb258,0x3e169adb,0x3df95e94,0x3ddc2886, +0x3de1e75e,0x3d8bd038,0x3d8dccce,0x3dbeffa6,0x3db56eb7,0xbe8d077d,0xbeb37e1c,0xbe9a4c3c,0xbe9604ed,0xbe8328ba,0xbe369711,0xbdf43323,0xbdda86f1,0xbe294a5e,0xbe67486e,0xbe684231,0xbe70233f,0xbe5fbba9,0xbe35fd6c,0xbe23ca21,0xbe184d3e,0xbe2619bf,0xbdbd400c,0xbda54834,0xbd2fe16b, +0x3d714375,0x3cc2cd03,0x3d90c43d,0x3da5f162,0x3de9ffdd,0x3de2a876,0x3e12f2d6,0x3e108baa,0x3e05d2c2,0x3e009906,0x3dd2cf89,0x3d98b8a7,0x3cecaffa,0xbc7939f8,0xbdd0eded,0xbe4a6b12,0xbe8ae815,0xbe8fbe4f,0xbe71e928,0xbe3d464c,0xbd093f31,0xbd94ad2d,0xbd643f4a,0x3c10989e,0x3d4f4353, +0x3da2bd7b,0x3dab8287,0x3dbfcdb1,0x3d961356,0x3cca4f22,0x3cc1bfe4,0x3c81ed23,0xbbbec7df,0xbc32dd43,0xbd3ce8c1,0xbce89ef2,0x3cea881f,0x3d6098b6,0x3d9f4174,0x3da70074,0x3dd9c8dc,0x3de7a31c,0x3e22d6a5,0x3e2e88dc,0x3e1f30e0,0x3db202bc,0x3d0befba,0xbc8f24e1,0xbd2572b8,0xbdb52715, +0xbe0845cc,0xbe467ad0,0xbe462162,0xbe3f250f,0xbd5c85db,0xba9ec738,0x3dbf1643,0x3e48bec6,0x3ea3389c,0x3eeb23d5,0x3eff43e1,0x3f029562,0x3eefe288,0x3edb59ce,0x3ec103dd,0x3ea36bf7,0x3ea1c614,0x3e871608,0x3e370827,0x3d60de5c,0xbd04a521,0xbd2dd042,0xbd86210b,0xbd9bbc25,0xbcbb8396, +0x3c452903,0x3d654e26,0x3d4b6293,0x3e2e71e2,0x3e36ffeb,0x3d895bb8,0x3de56677,0x3dbaa1eb,0x3c2eeb88,0xbb873ba2,0xbce2d527,0xbdae88ec,0xbdf01d42,0xbd213be6,0x3ce7d338,0x3e17b7ac,0x3e509b55,0x3e5dc68d,0x3e779e95,0x3ea22f06,0x3eefeb68,0x3f074be6,0x3f14c3fc,0x3f140797,0x3f0b4953, +0x3ef870cf,0x3ed613a6,0x3e9c574f,0x3e57af4d,0x3e18eac0,0x3d91b6c1,0x3b587a4e,0xbcfd8b3e,0x3bc28491,0x3a7b4a79,0x3b638162,0x3c68bfee,0x3d01a290,0x3c96649b,0x3e1842b6,0x3e322603,0x3d0b261f,0x3e0e52d9,0x3dd83fd0,0x3b7a3c24,0x3ace9cee,0xbbd7a553,0xbd29ce1e,0xbd3230e7,0x3e0403ff, +0x3e3fce35,0x3e88e62c,0x3e95d3f1,0x3e74addf,0x3e549f3a,0x3e4af624,0x3e5b4771,0x3e7825e8,0x3e8b7760,0x3e93b5d8,0x3e9c3d9e,0x3e982519,0x3e87fb34,0x3e7c478a,0x3e48491c,0x3df35921,0x3d2ec544,0x3b157ccc,0x3ce38cb4,0x3d803b5a,0x3d5d32d2,0x3d9a0b54,0x3da4df73,0x3dc09cf1,0x3de3d843, +0x3dfd2607,0x3e0bdb91,0x3e1ae3c4,0x3e121015,0x3dfce2a4,0x3dd8a409,0x3db391eb,0x3d649679,0x3d47dfdf,0x3d9ffacb,0x3e3e4706,0x3e46d373,0x3e5aa639,0x3e699941,0x3e5735ef,0x3e41c477,0x3e28b12d,0x3e0cc24c,0x3df12555,0x3dd03095,0x3da9b02a,0x3d7bffff,0x3d49912b,0x3d2ae348,0x3d6283a4, +0x3d826423,0x3da60e41,0x3dcd0f2d,0x3dcdbacc,0x3e051345,0x3e29f561,0x3e1763bc,0x3e1d60f5,0x3e2836f5,0x3e209914,0x3e0c7360,0x3e09c730,0x3e02fcbb,0x3e13d715,0x3dec5430,0x3dc00e09,0x3d8cf9b5,0x3dd58907,0x3e081fc5,0x3e12c10d,0x3e2b1b0a,0x3e327a47,0x3e3cb0cf,0x3e3b6f27,0x3e4bba9d, +0x3e5ac15d,0x3e4aa899,0x3e3ee5f4,0x3e37c0ef,0x3e2c94ca,0x3e244252,0x3e1f0bf0,0x3e26d3eb,0x3e2aa654,0x3e288c6b,0x3e3b222f,0x3e4f964c,0x3e645864,0x3e6f94b6,0x3e6df3a7,0x3e76e88c,0x3e71fa0a,0x3e6af8ab,0x3e608edc,0x3e43ed77,0x3e2ece5a,0x3e1abac9,0x3e127cc6,0x3e09c93f,0x3e075ea6, +0x3de563a8,0x3ddf14af,0x3db2b411,0x3de0495c,0x3df19201,0x3e12b8ea,0x3e202fdd,0x3e6d5bfa,0x3e5528b0,0x3e4fa6be,0x3e59a331,0x3e5d6aec,0x3e6646a3,0x3e6f992f,0x3e77f8c6,0x3e7cd428,0x3e80a2ea,0x3e818c62,0x3e8379c4,0x3e85d3fe,0x3e88eeb5,0x3e8973c7,0x3e88e09b,0x3e877b52,0x3e866ec4, +0x3e8376ba,0x3e89a5b3,0x3e88424d,0x3e6f770a,0x3e6d65ab,0x3e61fc3e,0x3e581e63,0x3e46f910,0x3e3dbdf2,0x3e43897b,0x3e45b3aa,0x3e37f989,0x3e247cc1,0x3e2c6b49,0x3e33d075,0x3e47db64,0x3e4dbad0,0x3e442375,0x3e7eb820,0x3e3cb80a,0x3e4a6621,0x3e4cc223,0x3e4dd147,0x3e513477,0x3e5330de, +0x3e55f2db,0x3e58e1ee,0x3e5c9955,0x3e60fd73,0x3e63e2aa,0x3e66644e,0x3e6a136b,0x3e654c30,0x3e62adf0,0x3e60178d,0x3e60229b,0x3e5d5397,0x3e53b4d6,0x3e87b9ee,0x3e8dcc80,0x3e856a5d,0x3e752b38,0x3e869aa4,0x3e8249a5,0x3e83048a,0x3e808945,0x3e7b8b53,0x3e800296,0x3e8142c9,0x3e7c9652, +0x3e7e689b,0x3e60c7db,0x3e8039a5,0x3e8647cb,0x3e61b738,0x3d0fbcf6,0xbc809864,0x3d385d07,0x3cf0b8aa,0x3d09e14b,0x3cde3d94,0x3d13c30d,0x3d28cad7,0x3d5e539f,0x3d2f9b5a,0x3d2147e8,0x3d13c908,0x3d172e9b,0x3d1972a9,0x3d2465f7,0x3d1d4d90,0x3d173bfe,0x3d09becc,0x3d069fe3,0x3cdad200, +0x3d34dfde,0xbc99540e,0xbd4ca008,0xbddc3dda,0xbafb6c17,0xbd311998,0xbdb66c07,0xbdb7b552,0xbdb02b06,0xbda652e3,0xbda69fb3,0xbdaa4b6c,0xbdb36019,0xbd242c47,0x3c275cc4,0xbdb8e30b,0xbd416774,0xbd6b8942,0x3cad2210,0x3ccd3896,0x3c910538,0x3b799ff8,0x3cc67d95,0x3d2b60ed,0x3da13e06, +0x3d6ac9ef,0x3d469de1,0x3d197670,0x3d1a8f81,0x3d26a899,0x3d48fe40,0x3d44a9e4,0x3d334e31,0x3d10661d,0x3cfc28d5,0x3cf19540,0x3cb013b0,0xbd7ad18f,0xbbae022c,0xbbe12692,0xbc508df7,0xbc69adb0,0x3cdc50a3,0x3ce477c3,0x3cf543c3,0x3c07a0a3,0x3d276452,0x3d40071c,0x3bf98d87,0x3c863bf0, +0xbb858acd,0xba4a40f8,0x3cb6d483,0xbc95f3eb,0xbbd08bee,0x3cced6c1,0x3c86fd62,0xbb54e445,0x3d5ba00e,0x3dae49dc,0x3e27250a,0x3dcd2d6d,0x3d914d76,0x3d3dcee9,0x3d3dbfb7,0x3d545d05,0x3d8d6a71,0x3d80ee33,0x3d63ff9b,0x3d15c48b,0x3cdbf585,0x3cc20e23,0xbbe89f05,0xbcf0a3ba,0xbcfa5d42, +0xbcb6f4cf,0xbcb49a2a,0xbcaaaeae,0x3d1ac1f8,0x3c684020,0x3d2c5a25,0x3bcd8b32,0x3d59be27,0x3d01e80b,0xbb0dce13,0x3b85a43c,0x3b993bd4,0x3bae8532,0x3a20e801,0xbcdc234f,0xbd17b123,0xbc8f6a62,0xbd521ef2,0xbdb95e70,0xbc55cfb2,0x3d7aa25e,0x3e3e1c81,0x3ddf3fa6,0x3d586ec9,0x3bb6636a, +0x3bb1fa96,0x3cc1982c,0x3d7e8041,0x3d88a82e,0x3d5f55f2,0x3ceaa960,0x3cc007a5,0x3c8a6d07,0xbc294ff3,0xbd1d08be,0xbc71c79b,0xbd12f9d2,0xbc608099,0x3c3e943d,0x3d3aa46d,0x3d8cf837,0x3dc4e65b,0x3daec931,0x3dd65df0,0x3dc943a0,0x3d305215,0x3d3cbd89,0x3d21363f,0x3d24dd09,0x3c8f3d64, +0xbc5167e5,0x3d9d50d2,0x3dd10f18,0x3e23a542,0x3e90503e,0x3ea0e62b,0x3ea3fb4a,0x3e9e6294,0x3e9ebddd,0x3ea53728,0x3e97cf04,0x3e9672d2,0x3e83fd4f,0x3e4ae4e2,0x3e1d7f3d,0x3df1bad0,0x3dad3432,0x3ca2a91f,0xb9a9cae5,0xbcc0ebfb,0xbd864617,0xbc7be460,0xbb98d89c,0x3c720419,0x3d379fbd, +0x3dad8990,0x3de36cfe,0x3dda0325,0x3d83ca90,0x3d89d527,0x3d1dd2c8,0xbc2266dd,0xbc3da6c3,0xbce641bf,0xbcc67b6c,0xbc9b717f,0xbcc7f224,0x3bb72570,0x3d3bc90f,0x3c810554,0xbc40ad5b,0x3d2d94ed,0x3dd15c31,0x3e08919f,0x3e2f8208,0x3e5696fa,0x3e7f3102,0x3e82c0fe,0x3e81a752,0x3e844654, +0x3e1eedc5,0x3d78fa23,0xbd234c4e,0xbd66918d,0xbd091603,0xbb8a0d8d,0xbcd95a92,0xbca2abc5,0xba10cd34,0x3cb47558,0x3d6c3300,0x3d80163a,0x3def37f2,0x3e04286c,0x3d91ddf2,0x3d60e9f4,0x3d00b5fd,0x3c9b4ec0,0x3ca91b3c,0x3ce0f6bc,0x3be332b3,0x3c50ca6f,0x3ca26521,0x3cb17f6f,0xbc9d56f0, +0xbd137df8,0x3c8537bc,0xbe077c65,0xbe381852,0xbe45c2a6,0xbe36e2b4,0xbe280226,0xbe16fd2b,0xbdf76666,0xbda4d8f9,0xbc796539,0xbd27a2bd,0xbd4cf680,0xbd92b7ed,0xbd87fa1f,0xbd8653cc,0xbd51671e,0xbd43595c,0xbd1f2153,0xbd691c43,0xbd38404d,0xbd0da5e0,0xbd3f273e,0x3d9f60e5,0x3def35b0, +0xbd4c9a64,0x3e0efbbc,0x3df2890d,0xbc833245,0x3c45c2e2,0x3cb9f733,0x3c4599a4,0x3cc8e750,0xbd04a32d,0xbda3cee1,0xbde6960d,0xbe01887d,0xbd909122,0xbe606a71,0xbe9ea15f,0xbed2cd80,0xbecfa26a,0xbecebcea,0xbec9508d,0xbebaefdb,0xbeb0ed1f,0xbea728c6,0xbe920b5d,0xbe70e9fe,0xbe3f6753, +0xbe21331c,0xbdfe564d,0xbd9b4aa1,0xbd9f9993,0xbd93f623,0xbd4644d0,0xbd039962,0x3bff2939,0x3d262843,0x3d84d9b4,0x3d8d92c2,0xbd5f3ee9,0x3d8b1023,0x3da05516,0x3d43fa79,0x3d35bea1,0x3c3d066d,0x3b963054,0xbb945bd5,0xbdff13c8,0xbe3c2a6e,0xbe251b99,0xbe11c8b9,0xbde7bf4d,0xbe461a80, +0xbe7f2ddc,0xbe9c6887,0xbe9c8a55,0xbea2ce24,0xbeabc49e,0xbeb5b0ad,0xbeb4cf45,0xbea8ea6e,0xbe9996b3,0xbe7d04c5,0xbe40160b,0xbe1909f3,0xbde190a6,0xbdc1acae,0xbd92afe2,0xbd7793bb,0xbd3d2a48,0xbd18e33a,0xbd0cd5a0,0xbca6f771,0xbc347e2c,0xbb86eab2,0x3cc7c9f7,0x3d5e32d8,0x3d408ad1, +0x3c2ee006,0xbb45db51,0xbc85f7b1,0xbd065337,0xbdc98b1d,0xbdd1fc2c,0xbdebb75d,0xbddfeb5b,0xbe035566,0xbe24e30f,0xbe3dd847,0xbe4aa6db,0xbe4a473e,0xbe44f7a0,0xbe3c7a59,0xbe2b0306,0xbe203f95,0xbe1ba8c7,0xbe1ab0ba,0xbe2241bf,0xbe22fbd6,0xbe2e0d7c,0xbe2d9df3,0xbe26125c,0xbe14f601, +0xbe102621,0xbe0592a8,0xbdcbaa33,0xbdb875ec,0xbd6fe907,0xbc8e2d39,0x3c60e1c6,0x3cf16206,0xbc7d07eb,0x3c889685,0x3ca1cfe9,0x3c10e71c,0xbd3bc909,0xbdaefa61,0xbdae33c7,0xbde4e701,0xbdb53167,0xbdcd1423,0xbe0394c3,0xbe259ea0,0xbe4501e2,0xbe40e1a7,0xbe42bdb0,0xbe47bc9f,0xbe433823, +0xbe4013ba,0xbe3e4cde,0xbe387220,0xbe2e64ed,0xbe1b9f05,0xbe244e99,0xbe2c9ce0,0xbe385e19,0xbe3a250e,0xbe459dae,0xbe398f1a,0xbe0da855,0xbe0478e3,0xbdec9fb3,0xbdbdea20,0xbd6369c0,0xbd81f560,0xbcffd298,0xbd3842f1,0xbbe25435,0xbc5950cb,0xbbd04146,0x3a3a6d29,0xbc78f23b,0xbcd1e27a, +0xbd380052,0xbd8c937e,0xbe156315,0xbe3569a7,0xbe2ffb36,0xbe3414df,0xbe36e09b,0xbe3d4957,0xbe43f97c,0xbe4a89ae,0xbe4cb105,0xbe4eb122,0xbe4fb27f,0xbe50a92e,0xbe53b60a,0xbe553e01,0xbe563df3,0xbe53f985,0xbe516853,0xbe4c5099,0xbe477619,0xbe4c8573,0xbe00d851,0xbe1b3c25,0xbe1a5ec0, +0xbe109089,0xbdfc7816,0xbe013811,0xbdfe93ca,0xbe0783cc,0xbe003f8a,0xbe075e28,0xbdf93d60,0xbdf71c8e,0xbe0555ce,0xbe0c05d7,0xbe15204b,0xbe1ef6cb,0xbe2f99ac,0xbe26da0a,0xbe25210f,0xbe290bbc,0xbe2990db,0xbe2c6279,0xbe2e3b69,0xbe309b36,0xbe32c50a,0xbe35577d,0xbe38017a,0xbe3a84fc, +0xbe3c5ecd,0xbe3f172f,0xbe3a8b55,0xbe37ba89,0xbe352f39,0xbe354f0a,0xbe2f5de1,0xbe38c242,0xbe36dc4b,0xbe295e01,0xbdd7ce5d,0xbe2e5a32,0xbe21ca1f,0xbde0b883,0xbde6a042,0xbde5bdde,0xbdedca1f,0xbdee66f4,0xbdf64e2a,0xbdf4fbe1,0xbe1d2e68,0xbe2783c9,0xbdf27352,0xbe24d964,0xbe391d4b, +0x3cca6cc8,0x3d8b0fd9,0x3c7786bf,0x3d058331,0x3d00aab1,0x3d25698c,0x3ce20e99,0x3cc5036b,0x3cc2ab59,0x3cb72935,0x3cac447e,0x3ca04de3,0x3c895804,0x3c6ca288,0x3c35408d,0x3c356644,0x3c35dbef,0x3c4bd56c,0x3c60f584,0x3c96cdd4,0x3ac3c89f,0x3d759e86,0x3db17ef9,0x3e052662,0x3d46bbaa, +0x3db30d5e,0x3e081295,0x3e045a0f,0x3e00f3d1,0x3dee58c0,0x3e02c473,0x3e034c95,0x3df185a5,0x3dae14fe,0x3d2c1d58,0x3dfdc9f4,0x3dbd21a7,0x3dc8faea,0x3d062e03,0x3d129b10,0x3d408b21,0x3d8df3fb,0x3d373f85,0x3d1bfd48,0x3d0cf55f,0x3d080027,0x3ce81e47,0x3cb3e70b,0x3c510ac3,0x3b5f5c69, +0xbbd150c5,0xbc08f8f5,0xbbd5103b,0xbb311cb0,0x3b39855c,0x3b2cd477,0x3bbc68d5,0x3da4174b,0x3d0a9903,0x3d25c241,0x3d39faf8,0x3d6cb048,0x3d6dd712,0x3d457a88,0x3d4e74c4,0x3d6af7ec,0x3d54f165,0x3d1eeecf,0x3d13446d,0x3d287bb5,0x3d5f717c,0x3d42ddb3,0x3ce95b33,0x3d9a5d80,0x3d98a671, +0x3d8b34b0,0x3daea46b,0x3dff9515,0x3d71670b,0x3d1ed9f4,0x3cae3e81,0x3ce261b8,0x3ce4444c,0x3ca6930e,0x3b363594,0xbc74342f,0xbd097098,0xbd1cff5a,0xbd1c249e,0xbcfc6484,0xbc9e7197,0xbc9e021a,0xbb3ba83f,0x3cdab8a9,0x3cedf555,0x3cea22fe,0x3ce74cc4,0x3d54e62d,0x3d950af4,0x3d8d914b, +0x3d336d48,0x3d63fed1,0x3d7718b4,0x3d92d53c,0x3cabd6a2,0x3d34a942,0x3d34888b,0x3d2f9085,0x3d4fbf7f,0x3d3f944f,0x3d6584ba,0x3d7a9bd1,0x3dcc94bb,0x3e2bfbcb,0x3db3f45b,0x3d71f5e7,0x3d0ab965,0x3d603aee,0x3d5d5c95,0x3d2cb903,0x3c34201a,0xbcbeb736,0xbd714f17,0xbd8b1919,0xbd7f622f, +0xbd57c25d,0xbd286cc5,0xbd1fe3ac,0xbd070868,0x3bf147c4,0xbc836b2d,0x3c18c538,0xbc7c9b17,0x3ac40a19,0x3d532119,0x3d556f4a,0x3d84e511,0x3d043822,0x3da84ff1,0x3d704eef,0xbc6ec4ba,0x3c613a06,0x3c93aefb,0xb9b26e55,0x3c5cc1ed,0x3e4668b2,0x3e242a36,0x3e300272,0x3e1d92a2,0x3de6f857, +0x3dbfa966,0x3d53818f,0xbd5a7d9e,0xbd723925,0xbda162f4,0xbd9a22f8,0xbdcdb11e,0xbdeef98e,0xbe035195,0xbe0adfde,0xbe1138ee,0xbe0d81d5,0xbdc38889,0xbd9ec33e,0xbd36d58f,0x3c97f28c,0xbbe696e5,0x3c59d145,0x3c5742a7,0x3d227d27,0x3db095ea,0x3d7d9830,0x3d7e2f0a,0x3d670596,0x3d6abfc0, +0x3d6cbc29,0x3d90ee19,0x3da525b3,0x3dc80f0d,0x3e040677,0x3e3be3d3,0x3c071d1d,0x3c1e88d2,0xbd93e540,0xbd3a8631,0x3d691fe4,0x3da5c951,0x3d9e8f93,0x3c0f9f52,0xbc5b9b58,0xbdaef0c0,0xbe109c8c,0xbe57bcd8,0xbe8e8a10,0xbeb6841e,0xbeb36a92,0xbe9a9145,0xbe50278f,0xbe31ad4c,0xbe1bc712, +0xbddd6bce,0xbd412940,0xbcb89c5b,0xbc041196,0xbbc0f0e7,0x3c847b05,0x3d9a625d,0x3d909750,0x3dbc7a4d,0x3d9179b8,0x3dfc22a1,0x3e03ac4f,0x3ddfe1f0,0x3d886d6c,0x3d2ee412,0x3d1faf49,0x3c9632d8,0x3c9550b6,0x3c631120,0xbc332c1a,0x3b9f5a48,0x3c432158,0x3dbc2a93,0x3d79298b,0xbdafcaae, +0xbd52b9c4,0xbd245ddd,0xbbbf0c2e,0xbc7c1327,0xbd2bd75c,0xbdc3ea70,0xbdf222d1,0xbe033687,0xbddb172a,0xbda8f6ad,0xbd6e6d58,0xbd27f34f,0xbb7cbfae,0x3c81a0d5,0x3d4f23e2,0x3d2d2145,0x3d904275,0x3e196e25,0x3dc6606e,0x3dad7243,0x3c1a048f,0x3dcc5285,0x3da5ee63,0x3d4eda50,0x3d514b2d, +0x3d1b7c92,0x3d389ea6,0x3d278eae,0x3d04ab95,0x3d907a8f,0x3c80e146,0x3cac5286,0x3dad40fc,0x3e3df5e1,0x3e5b30f1,0x3e214132,0x3de80111,0x3d794068,0x3d855c3c,0x3c56a525,0xbaafe5b8,0xb7747c21,0xbb54120a,0xbc6a8993,0xbceda9fc,0xbd4f9b71,0xbd52fce2,0xbd499254,0xbd27fa05,0xbba198d4, +0x3c0c94ec,0x3b4f657f,0x3cbdfb93,0x3d9515ab,0x3cec6062,0x3c921453,0xbc82ad5d,0x3d312dd0,0x3d805310,0x3dc8ae1c,0x3d3e559a,0x3d0690de,0x3d0764ce,0x3d13ae53,0x3d7ba746,0x3db55392,0x3d4cea52,0x3d7463b2,0x3e0f6df9,0x3e36af56,0x3e317a79,0x3df0ec7c,0x3d86add5,0x3d4122fb,0x3d949d92, +0x3d617ed5,0x3d37aab0,0x3cc92e44,0x3c3588c3,0xbc13ab18,0xbc3a0e76,0x3b1f7489,0x3ca2bdc8,0x3d03b45d,0x3b29b748,0x3c627064,0xbbb48934,0x3cbc2a9e,0x3d52ff6f,0x3d994d74,0x3d3600b9,0x3d1d8fe8,0xbbada7f8,0x3d0bcd46,0x3d43ca3b,0x3d9a450f,0x3d690d6e,0x3d40842b,0x3d2769b7,0x3d9b8647, +0x3bef60c2,0x3c73f7ac,0x3d6d6ab3,0x3dd96545,0x3e1d90d7,0x3e01a2fb,0x3dd7c358,0x3d9d2556,0x3cf4b52c,0xbc33a0ae,0xbd2aa00e,0xbd3b2fc2,0xbd3706c2,0xbd415fe2,0xbce957b0,0xbc0d1817,0x3d090a79,0x3d72a01d,0x3d9cf17b,0x3d5cbd1f,0x3d497d0e,0x3d9d5021,0x3d7e20a3,0x3d6747ea,0x3d19fc50, +0x3ceab1e5,0x3c956324,0x3c97feb7,0x3d65a9f3,0x3d2c4d81,0x3d333e96,0x3d2e9fe4,0x3d6fb4e0,0x3d779a66,0x3cdb78e0,0x3ccc45b2,0x3db5423f,0x3dc8c978,0x3ddb0a4c,0x3df1518c,0x3e0778db,0x3dd76bba,0x3dac52b3,0x3d824923,0x3d6c8840,0x3d530822,0x3d2783f5,0x3d0d4abe,0x3cc07e43,0x3b5cb0d2, +0x3cdb6b32,0x3d357f4e,0x3d8422eb,0x3d9c7d8a,0x3ddfcd92,0x3ddec01a,0x3d7b602c,0x3d741938,0x3d5995c4,0x3d6fec58,0x3d2fb2de,0x3d9cf11d,0x3d4a84d1,0x3da486e5,0x3d4f2f0c,0x3d6d333f,0x3d2a8d7a,0x3d2b5bc1,0x3d1d90e1,0x3d1aac62,0x3d172864,0x3d85fc66,0x3d5dd005,0x3dd92cde,0x3dc4319b, +0x3dbabd63,0x3db2dcc6,0x3dad8e2d,0x3daba7f1,0x3da30810,0x3da34fd2,0x3d9e6107,0x3d9bca8d,0x3d960b29,0x3d94674c,0x3d89fe68,0x3d9ac455,0x3da36d7d,0x3dafeb8a,0x3db539f5,0x3dbbd635,0x3dcc50c0,0x3cac8942,0x3d933591,0x3d9b42ce,0x3d9a7455,0x3d7b1751,0x3d9ed672,0x3da4450b,0x3db0c47b, +0x3d9bad34,0x3dbc2733,0x3dbe6ab9,0x3db06605,0x3db9a82d,0x3daac888,0x3dab148b,0x3dc4c117,0x3dabf504,0x3dcba822,0x3db40ee1,0x3db5c92c,0x3daf2589,0x3dadd007,0x3dab66ff,0x3da92062,0x3dacc125,0x3dafa10e,0x3db29147,0x3db4a3e1,0x3db67fa5,0x3db6de0f,0x3db7561f,0x3db72e51,0x3db77d34, +0x3dbc0b98,0x3db5504c,0x3dd7e36a,0x3da80f50,0x3d835bd3,0x3bab5d9d,0x3db3bed9,0x3d88563f,0x3c8482a5,0x3c93bfdb,0x3ca58770,0x3ce38eff,0x3cdc2a5c,0x3cf5a6fe,0x3d0dae17,0x3d945d90,0x3dc1a0b8,0x3cd41f72,0x3d8c1f5c,0x3dc32099,0xbd6c00ee,0xbda1d8cb,0xbd67d6dc,0xbd879527,0xbd8be1c4, +0xbd92dc75,0xbd848b44,0xbd819696,0xbd8d3349,0xbd78c5ea,0xbd6e59db,0xbd631315,0xbd683b19,0xbd66f77f,0xbd6a59f0,0xbd536147,0xbd46efad,0xbd33d10f,0xbd408b8a,0xbd484c13,0xbd1a28c0,0xbd90daf9,0xbda8d2a5,0xbdc4879a,0xbd6acdd7,0xbd93d0fc,0xbda6649c,0xbdb0cc4b,0xbdb12e0e,0xbdab096e, +0xbdb2264b,0xbdb784b4,0xbdba9460,0xbda15007,0xbd7ba470,0xbdc256ab,0xbdb1391d,0xbdc92e94,0xbdbdb2e6,0xbdd173b3,0xbddcd887,0xbde4ab8d,0xbdbdb794,0xbdb74285,0xbdd48732,0xbda8fab3,0xbd9a1156,0xbd8e3a16,0xbd96c7e8,0xbd94f583,0xbd943bb4,0xbd69ac2f,0xbd4209bc,0xbd0eb86f,0xbd3066e0, +0xbd2a08fa,0xbd25ddaf,0xbda83234,0xbd57f4d6,0xbd60ddeb,0xbd2bd08c,0xbd1ee2fa,0xbcb04d0a,0xbcfabe83,0xbd12cca5,0xbd21c248,0xbd16eb44,0xbd0c520b,0xbd479773,0xbd54c770,0xbd82eb83,0xbd8ad4ec,0xbd89b587,0xbdb1be20,0xbde15459,0xbe12091c,0xbe1f7448,0xbe339624,0xbe0f2e04,0xbe0571b8, +0xbe20ff2a,0xbde065f8,0xbdcd6057,0xbdb19cfd,0xbdb84f63,0xbdb2ac80,0xbdb2a828,0xbd609216,0xbd154677,0xbc63e3d8,0xbcfa9c09,0xbcdd4854,0xbd026870,0xbd5b09bd,0xbd3ebfd4,0xbd0d3c92,0xbc0b1f5b,0x3a373e9b,0x3d0074cc,0xbb0eeeb6,0x3aad1266,0xbc15f0e9,0xb9c54a9a,0xbc78b3ba,0xbcd552e1, +0xbd02ecfe,0xbd3dc90a,0xbd63d179,0xbd8e470d,0xbdebfb5f,0xbe31f419,0xbe6712c3,0xbe758b28,0xbe8241a7,0xbe400595,0xbe33491f,0xbe5e5252,0xbe168ebd,0xbe00e63d,0xbdee5b26,0xbdfef198,0xbdf85909,0xbded9fe8,0xbd7de6e6,0xbce1c0cb,0x3c0a7c8a,0xbc76b39f,0xbc8c72ce,0xbcb493b5,0xbd73078e, +0xbcf94e74,0xbd168007,0x3a828869,0x3ccba7a6,0x3d910803,0x3d397cd7,0x3d19d52e,0x3d0793ef,0x3d3ea1fb,0x3cb4d414,0xbc945ce6,0xbcd379d4,0xbd247c59,0xbd6e38e5,0xbda91644,0x3dfa71db,0x3e112fb0,0x3dcd9baa,0x3d3d742e,0xbd915444,0xbe009119,0xbe23c41c,0xbdef7e45,0xbe028ee1,0xbdd8c02c, +0xbd74ffb9,0xbd5add9c,0xbd290391,0xbd525e55,0xbd16d74d,0xbd000e67,0xbbccf2a8,0xbccb45b2,0xbc1f530c,0xbcc702bf,0xbd7bc49b,0xbc8fc170,0xbd00427c,0x3ba9142d,0x3c8a5e12,0x3d79ebb0,0x3c6d2673,0x3cda985c,0x3d932873,0x3d83bfcc,0x3d95e7b1,0x3da05ae2,0x3d5453e7,0x3d4a9abb,0x3d907407, +0x3dc60b04,0x3dab2090,0x3ddcbd7f,0x3e26ebeb,0x3e24e797,0x3d83f774,0x3e4c40cc,0x3e58834e,0x3e49a2f0,0x3d8ffa92,0x3ca31d5d,0x3c94d329,0x3b95667b,0x3c87a214,0x3ce5988a,0x3d77ae33,0x3d4c75e8,0x3ca8d1c1,0x3c81d73b,0x3cf2c343,0x3b3cbc42,0xbcb19379,0xbc69f127,0xbc2c599b,0x3cacb3c4, +0x3d1b9408,0x3dd75e19,0x3d76564c,0x3d4b55db,0x3ce7e498,0x3dd1b03a,0x3dcd9e1a,0x3d85b100,0x3dc31023,0x3ddf0ac5,0x3db60b4d,0x3db6da41,0x3d79498e,0x3d7bb00c,0x3d223e23,0xbc891ac9,0xbe06b5eb,0xbd952710,0xbc3822e4,0x3e04970c,0x3d291084,0x3c86597a,0x3c670646,0x3bed1268,0x3c091b7b, +0x3b9ca3fd,0x3c514bff,0x3bf7f2bb,0xbc2cd223,0x3cd687f9,0x3d2c225f,0x3c999e4c,0x3c405a61,0x3c0bcc68,0x3950f295,0xbbaf0e5e,0x3ccb4177,0x3e305c56,0xbb04fe88,0xbd14dd90,0x3b3b5490,0x3d2d3461,0x3d90b2ad,0x3e25520b,0x3d0b5fcd,0x3bc5149c,0x3d51b7ee,0x3d4c9c47,0x3d03e58b,0x3c475271, +0x3ca17b7b,0xbca75b53,0xbe2d67cd,0xbdfc122a,0xbe07ec25,0xbde64e4c,0xbe327e27,0xbe462a66,0xbe4b43a2,0xbdee7dbc,0xbd23f523,0x3cb0a821,0x3d4f2702,0x3d6b39cb,0x3d2c6cc0,0x3d76527f,0x3d8face5,0x3d8931d8,0x3d5e5808,0x3d3cde88,0x3d49ca9d,0x3d4261d9,0x3d87a23f,0x3e211072,0x3d3054c7, +0x3c4f5862,0x3d1ca7db,0xb96e3663,0x3caf65fd,0x3dcdffe5,0x3d30fb79,0x3cd24325,0x3cbba245,0x3cae8ad6,0xbb4feb91,0xbcc7b103,0xbd61f7b4,0xbdce1b43,0xbe4d2947,0xbdea49de,0xbdc070eb,0xbdc4cd72,0xbdf414e2,0xbe1ba39f,0xbe43c1e6,0xbe2b9ad3,0xbe06d27a,0xbd9b9c11,0xbcf3ed78,0x3bf87abf, +0x3cd64ff1,0x3d00e0d2,0x3d0208e4,0x3d10ee8f,0x3d226a77,0x3d2cfe27,0x3d550589,0x3d27d565,0x3cf3766c,0x3d08d8d5,0x3d4a8cc2,0x3d38fa15,0x3d217db5,0x3cf32e89,0x3cc56df9,0x3cc4a228,0x3cae1a8a,0x3cd2ff28,0x3c98b833,0x3a9280bb,0xbc47a4fd,0xbd0dce80,0xbdc9393b,0xbe0841e3,0xbe0676c4, +0xbda81285,0xbd82af65,0xbd90289e,0xbd61c055,0xbd351c97,0xbcfcfcfc,0xbce13197,0xbc894f95,0x39ad3070,0x3cf57e76,0x3d131fb5,0x3b86d3b7,0xbc815243,0xbcace62a,0x3c2e43df,0x3ca151e1,0x3bf33d25,0x3c88c03d,0x3cd67aad,0x3d0c5418,0x3cfa7a32,0x3d158a27,0x3d2a98b8,0x3cd960ee,0x3d54855b, +0x3d5b98ec,0x3d3a506a,0x3d245364,0x3d01e890,0x3d103f16,0x3c787d02,0xbd82a73a,0xbdb19261,0xbd938ecc,0xbd78d8a4,0xbd65db7c,0xbd565d08,0xbd377cca,0xbd1992a7,0xbcee6408,0xbcc7598c,0xbc94b792,0xbc130e9f,0x3b33702b,0x3c8b45a4,0x3bbcc47b,0xb9b1136a,0xbb8f1686,0xbc4b2cb7,0xbd201d8f, +0xbd2131df,0x3b8df0f0,0x3bd329c9,0x3c844c32,0x3ca5d09a,0x3d1ad3b9,0x3cf098a1,0x3d24a700,0x3c7c9bf5,0x3d03fd71,0x3c26b014,0x3c202f82,0xbb59583e,0xbc09bd71,0xbc8b1d9d,0xbcb4c7ed,0xbd37105b,0x3cfb9c46,0xbb9f47e1,0xbc136e26,0xbc9046af,0xbcbfb614,0xbce8eece,0xbd0bf9f6,0xbd23cbec, +0xbd1b8f85,0xbd0bc5c3,0xbcf7dfdb,0xbcd1992e,0xbcb97a31,0xbc8148ec,0xbca03b9f,0xbcac6142,0xbcc3491b,0xbcc09de2,0xbcba2b67,0xbccfafcd,0x3cff504a,0x3bd55d41,0x3c46c3ca,0x3c7a74b2,0x3cebcba0,0x3cd020e7,0x3cbecca8,0x3cb023ec,0x3cf0d131,0x3cb6f785,0x3cc6875d,0x3d057507,0x3ccb2cc5, +0x3cd0a032,0x3cbb2f2e,0x3c237550,0xbc37ed6b,0xbc7d7135,0xbc4ba31e,0xbc74c35f,0xbc810c15,0xbc8ebad2,0xbc99c05b,0xbcaeb64b,0xbca577be,0xbca8a174,0xbcab574a,0xbcad697e,0xbcad172e,0xbca843fe,0xbca33faf,0xbc9be73e,0xbc988509,0xbc9d3dba,0xbc868393,0xbcd796cd,0xbc5dc402,0xbb5a3316, +0x3ce035bb,0xbc1f4d30,0x3a9f1369,0x3ce07218,0x3cda1d97,0x3cd41cfa,0x3cac51f8,0x3cb7fab0,0x3ca6da1c,0x3c92447a,0xbb4ab22a,0xbc5a698c,0x3c8eeeaa,0xbb58511d,0xbc4c4843,0x3c50849b,0x3c9610d9,0x3ba3964c,0x3c078f49,0x3c1311d7,0x3c172684,0x3c092cf3,0x3c06d7c7,0x3be602a8,0x3c2a917a, +0x3c23da7d,0x3ba6ef0e,0x3c01d397,0x3c0482cd,0x3c03c04e,0x3c0a971c,0x3c15c05c,0x3c1c1cf3,0x3c3859cc,0x3c4f1db6,0x3be7d42c,0x3cd32a97,0x3d03e7bc,0x3d0ee0fe,0x3cd30af3,0x3d0e8c00,0x3d239fca,0x3d18e919,0x3d11a08e,0x3d0a36f1,0x3d0fdc52,0x3d11622a,0x3d1970a4,0x3d00baec,0x3cb0a6a0, +0x3cf60196,0x3cc5099e,0x3bb0c5ed,0x3b8f9612,0x3c0aedcf,0x3c3a20cf,0x3c19c3e5,0x3b74ea6a,0x3aa921de,0xba6ac1ce,0x3c17a51f,0x3c2d6d60,0xbaaa58fc,0x3bf4477f,0x3c0e9a4f,0x3c01d78c,0x3be8162a,0x3bfd4d5d,0x3c013c14,0x3c62bc9b,0x3c587cd9,0x3c5ac28b,0x3d0790c0,0x3ca92f59,0x3cb136e3, +0x3d019d63,0x3d15ab77,0x3d06f07a,0x3cdf25cc,0x3cca3410,0x3cddc241,0x3ca25896,0x3c9fce70,0x3cfcc006,0x3cedffd6,0x3ceb6046,0x3cbbe948,0x3c02bfac,0xbcc0b59f,0xbc8f4418,0xb9c028c3,0xba359ba7,0xba69606f,0xbc14ce45,0xbc2ca4d3,0xbca43bd7,0x3bab5386,0x3bd15d7b,0xbc97dc85,0xbb6437f3, +0xbb5f3302,0xbb94f6e7,0xbb91ac98,0xbaf23608,0x3b63b918,0x3c55e548,0x3c737262,0x3c99bb4e,0x3cf2949c,0x3cf0a4d3,0x3cb4afee,0x3d33e0a7,0x3d571bba,0x3d3dbd26,0x3d318f80,0x3d01fee5,0x3d0f9a17,0x3cd3a741,0x3d023581,0x3d265dc7,0x3d0f1652,0x3cbe73fb,0x3c7013c2,0xbbe3895d,0xbd528996, +0xbd1f9b71,0xbb4cafb9,0x3c0341bf,0x3bb21e7a,0xbb08f8ff,0xbca72b1f,0xbd1dd2f0,0x3a761408,0x3c98ad03,0xbc8402c2,0x3c1cc56d,0x3c178d97,0x3a9505e9,0xbc074139,0xbbb5173e,0x3b272247,0x3c88da70,0x3c68e069,0x3c8bcfb8,0x3ce52cde,0x3ca9379d,0x3c9e0b1e,0x3d38ead2,0x3d725ee5,0x3d9d2e70, +0x3d47dc56,0x3cfa93bb,0x3cfbb03e,0x3d0a7e29,0x3cf41dad,0x3d240a1b,0x3d39a91a,0x3d059475,0x3cbc72c5,0xbc8d1083,0xbcb4a8f0,0xbcd8c345,0xbcace1cc,0xbd711924,0xbdb34439,0xbe1dcfff,0xbdff3e02,0xbb661986,0xbd82bfa4,0xbdbebc77,0xbe04bcbf,0xbdce8b09,0xbd9b8225,0xbd3551d3,0xbc6cc888, +0xbc169aef,0xbd2fea6e,0x3be5936c,0x3cbf8e77,0x3d650785,0x3d5e3053,0x3cf8027e,0x3d138c3a,0x3d2e0364,0x3d3b559c,0x3d8e25aa,0x3d486042,0x3d3f0b79,0x3d6b2cc2,0x3d89912f,0x3d70c914,0x3ca63878,0xbc59f4b1,0xbcedcb27,0xbce9be65,0xbd1a5cb7,0x3e2de668,0x3e1aa4c3,0x3e42dec4,0x3e3f3e2e, +0x3e396d0e,0xbcfabe57,0xbdea79d2,0xbd4c48d8,0xbd9a60af,0xbd9c5fa2,0xbe0291da,0xbe0336e7,0xbe00dc86,0xbddc5ff7,0xbdab3709,0xbd64575f,0xbd269907,0xbccb71da,0xbd1dc9c7,0xbc4307ee,0x3cc0ede9,0x3cc68b6a,0x3c8caa7a,0x3d073b3c,0x3d1c54c5,0x3da33736,0x3d224595,0x3cefa7e1,0x3cd56b23, +0x3d812e1f,0x3d8de2b8,0x3dd89fbf,0x3dc252bf,0x3dd6b2a3,0x3e112f09,0x3e1dd2c8,0xbb9ea143,0xbc8e3663,0x3ce8382d,0x3c9c8775,0xbc6a34b3,0xbcf8f82b,0xbb87694e,0x3d82b377,0x3da2f19e,0x3d715aa4,0xbcc90b70,0xbd4884bf,0xbdb0951a,0xbdf996b1,0xbe0aa8ed,0xbe121a7b,0xbe12dec0,0xbde6ca58, +0xbda193d4,0xbd1b6180,0xbb8d372d,0x3c59706a,0x3d21c7b3,0x3d4d8af2,0x3d93c69e,0x3e1d3552,0x3d5a5a69,0x3ba2cc5d,0x3cd574d2,0x3ba12c50,0x3d3758f9,0x3e209c82,0x3d8c7ae7,0x3d0a09c9,0xbc9f0454,0xbcaef174,0x3c47d1c7,0x3c03f293,0x3c8274aa,0x3d0c317c,0x3d88a059,0xbc86e5d9,0xbcd75f20, +0x3ce776d9,0x3d8e8095,0x3e06b6a4,0x3e35e34b,0x3e2bd344,0x3e0eb42a,0x3dd284c2,0x3da17aa4,0x3d75e822,0x3cf500c2,0x3d2ab722,0x3ce4ba74,0x3c079b67,0x3cc742fb,0x3c9b5acd,0x3ca6f530,0x3d43e3f2,0x3d3bda78,0x3d8ec1db,0x3cbb35ac,0x3c135043,0x3d7f4725,0x3ccfef51,0x3cee3ea6,0x3d596a06, +0x3d0fc7de,0x3d3c4bd5,0x3cf28205,0x3cbfe022,0x3c99c9ce,0x3cf3870d,0x3d0aa179,0x3ce17787,0x3cda8b7e,0xbd068973,0xbc65cc51,0x3d9f1b50,0x3da41cc8,0x3dcdbf19,0x3e01b543,0x3de59c96,0x3dc0d1db,0x3d891ed0,0x3d58529c,0x3d0749b8,0xbb88c602,0x3c8b120e,0x3b94ba71,0xbc8c21c1,0xbbfef420, +0xbc52ae63,0xbb99472c,0x3c8df234,0x3cfcffe9,0x3d2c3098,0x3d18921a,0x3cd55591,0x3c3c45ef,0x3cac96c4,0x3d2ae8a4,0x3d94a7ac,0x3d30216d,0x3cd0514a,0x3cb306e7,0x3cab92d1,0x3d4edfe6,0x3d4b81b7,0x3d73cad6,0x3d4354e6,0x3be5a5c6,0x3c3d553a,0x3cb508fb,0x3d88bd7b,0x3d424aa2,0x3d4eef05, +0x3d581803,0x3d81d9aa,0x3d6a5045,0x3d217050,0x3c0365b9,0xba9b84a0,0x3c73e4f4,0x3d01e024,0x3d19dd5a,0x3cdb7244,0x3c9a943e,0x3cd199e2,0x3ce3fc85,0x3cfbb446,0x3d0a38c3,0x3d15c84e,0x3ccd6ce2,0x3cc0d70c,0x3cd4efbe,0x3c968451,0x3c89fc61,0x3cee7e4b,0x3c9f6c52,0x3cd39524,0x3d0842e2, +0x3d32b468,0x3d399cde,0x3d4dccc1,0x3d18909e,0x3cb5327e,0x3c1d1b5a,0x3d062579,0x3d4259b9,0x3d89e769,0x3d3eea98,0x3d029d71,0x3c55788a,0x3c1e05fd,0x3bc11fcb,0x3b98f522,0x3b451610,0xbb0a377f,0xbc1199b5,0x3b2eeba9,0x3ce16fdc,0x3d0233dd,0x3c25b017,0x3cc07fe7,0x3cd85726,0x3cd6438d, +0x3cb1ef50,0x3ce3b7a1,0x3cc10bcc,0x3ced5364,0x3cb046ba,0x3d215611,0x3d47fab6,0x3d7db6be,0x3d7a128c,0x3d76deae,0x3d76bef7,0x3d5cbc22,0x3c401a50,0x3cca3854,0x3d0ab704,0x3d3e0f09,0x3d60beca,0x3d7e3291,0x3d8a2dbd,0x3d9deb91,0x3d89d553,0x3d78660b,0x3d547ce7,0x3d2e3c43,0x3d02e8f7, +0x3c9f6e2c,0x3cc58135,0x3ce95f1f,0x3d02a35f,0x3d07b684,0x3d08f6fc,0x3d1107bc,0x3b87fa4b,0x3cb3356a,0x3cac781c,0x3cbdb382,0x3ca4cb3f,0x3cce0938,0x3ca7e2be,0x3c9ca7d4,0x3c643bd8,0x3c27932b,0x3a9c3e38,0xbb0d4df2,0xba5f680b,0x3b6f78ca,0x3c025cf5,0x3c61fb07,0x3d50cb5c,0x3d43fdea, +0x3d4e9472,0x3d5b4bdc,0x3d68d6a5,0x3d736ad8,0x3d7e08f6,0x3d888b29,0x3d7f59df,0x3d7696a8,0x3d6e17af,0x3d632cef,0x3d5a6b2c,0x3d498636,0x3d501ea4,0x3d4ef8bc,0x3d521f9b,0x3d54748e,0x3d4f656a,0x3d685073,0x3d544810,0x3d41a1d5,0x3d0448e2,0x3d55ae61,0x3d44e4ad,0x3d24686f,0x3d1fecc7, +0x3d1c8b34,0x3d1cdc80,0x3d193014,0x3d1bc9b9,0x3d123e39,0x3d326036,0x3d3faa0d,0x3d15b9b5,0x3d3f5cd0,0x3d888d7e,0xbd1b71ac,0xbd3666c1,0xbd131e17,0xbd1d906d,0xbd29e136,0xbd496f3c,0xbd40ba98,0xbd43bf7a,0xbd5bf0f0,0xbd2be294,0xbd1f96c2,0xbd267b71,0xbd20a6c7,0xbd17dd8f,0xbcfd5ca8, +0xbd084d15,0xbd074db6,0xbd08867a,0xbd028bd1,0xbd02a11e,0xbcee1ad6,0xbd278fe0,0xbd307542,0xbd2bd243,0xbd08ba71,0xbd1c6aa9,0xbd241d06,0xbd1dc1fd,0xbd1c08dd,0xbd1d8cf5,0xbd27bba5,0xbd27b85b,0xbd17c532,0xbd1c9966,0xbd0e5836,0xbd1fa06e,0xbd368fab,0xbd2cfc36,0xbd20213d,0xbd271129, +0xbd51df66,0xbd95e5b9,0xbd977dd0,0xbd9ddfe1,0xbdb5922f,0xbd75b59e,0xbd51da42,0xbd66e131,0xbd60bf50,0xbd4a1dd6,0xbd036368,0xbd132e9e,0xbd0e87bb,0xbd0f5a7d,0xbcf8c985,0xbce20667,0xbce0ddb4,0xbd242f3a,0xbcfc35fd,0xbcd62efc,0xbc8fe691,0xbc744b09,0xbca6bab9,0xbc7a4e7e,0xbc9c7942, +0xbcc6b002,0xbcd1e96a,0xbcb763a0,0xbc7253bb,0xbc89d854,0xbc9fef24,0xbc9adf0a,0xbd08331e,0xbd3b8e39,0xbd477684,0xbd60b7f3,0xbd8cc602,0xbde36e35,0xbdda392a,0xbde36eef,0xbe0a25dd,0xbdab60f3,0xbd8855c3,0xbd96ec1a,0xbd8aa287,0xbd67ce01,0xbcbbfd62,0xbd00e35b,0xbcd9d8b4,0xbcecb57e, +0xbca0d97a,0xbc8e3424,0xbc93b934,0xbcef3a04,0xbcbc5724,0xbc2b3431,0x3bd113e7,0x3c0f0834,0xbb5f8085,0x3c29444e,0x3c0895f9,0x3a4a69e5,0xbbf32c0d,0xbc0b323e,0x3bfb0871,0x3af83625,0xbb03b49b,0xbb837592,0xbd1cd1b4,0xbcc28237,0xbcdeeb42,0xbd08817a,0xbd88f723,0xbe117a01,0xbe17a83b, +0xbe1df7af,0xbe3c6383,0xbde8cbea,0xbdb4f99e,0xbdcc0ebe,0xbdc8d508,0xbd9962ff,0xbcb83d7f,0xbceeaea4,0xbcdc4a6f,0xbce7deec,0xbc2f519f,0xba7b95b3,0x3b4277b6,0xbc286ac5,0xbacffdea,0x3bd31f3d,0x3d230acb,0x3d637d0d,0x3d4a64c9,0x3d545789,0x3d1a51b7,0x3d0c46cb,0x3c9a385d,0x3c9998af, +0x3d2e1c50,0x3d40820d,0x3d1e9e78,0x3d26599b,0xbba9aab3,0xbdf9d9d7,0xbd93c589,0xbdfabb7c,0xbde8bba2,0xbd91ca49,0xbde00781,0xbdf5e695,0xbe22bb08,0xbdc94e79,0xbd96db06,0xbd84a617,0xbd78ca77,0xbd7d5633,0xbd3f00a3,0xbd217873,0xbc4ddf27,0x3c203a56,0xbbda0ce1,0xbc8cbf62,0xbcf1345d, +0xbd0d4604,0xbc8c6b28,0xbac138cd,0x3d08d068,0x3d05f09c,0x3c51d189,0x3d5b2a5b,0x3d6b9b07,0x3ccc1258,0x3d71fff8,0x3d18a2c4,0xbcc2eeba,0xbb87dbc2,0xbc8ca431,0xbd6988fc,0xbdef69d0,0x3e0ee92b,0x3e1331f3,0x3db8369b,0x3cbfa810,0xbcacd776,0xbe0063db,0xbe315b18,0xbe732395,0xbda6f0cc, +0xbc7f07b1,0xbcab5a09,0x3b00b2b2,0x3c28f6fc,0x3cf16e98,0xbb84c1d1,0xbcc0c9b5,0xbd3970ad,0xbce33d47,0xbc5d6db9,0xbd1dd54b,0xbd51d382,0xbcdbfc39,0xbc45c9dd,0x3d13ff18,0x3d5414fc,0x3d621162,0x3ce0cd71,0xb989e1fb,0x3c11a1f4,0x3c3ffe9c,0x3d1aecd5,0x3dce7cfa,0x3d177fd8,0x3cf9ead6, +0x3d903d7c,0x3ddeab57,0xbd43b945,0x3b625e21,0x3ce038bc,0x3deb3be3,0x3e9459ed,0x3e60bc5f,0x3e470199,0x3e0759e9,0x3dcc9906,0x3d5c2845,0x3b9da764,0xbd056753,0xbd6204a0,0xbd307e97,0xbd2f0672,0xbcd8f577,0xbc5ac6b0,0xbd1df46b,0xbd4aadc0,0xbd14aef9,0xbd099823,0xbca9eabf,0xbd433faf, +0x3d6d3404,0x3d553184,0xbd339050,0x3be5fbac,0xbbcdff34,0x3bf1922c,0xbcba9c19,0x3c3d3595,0x3d96f75a,0x3de10cf9,0x3dec1011,0x3c8de146,0xbcbd2322,0x3cbd1c8a,0x3cc1b6fd,0x3c6740a4,0xbc818fff,0xbc629523,0xbd1cb5aa,0x3c11f77c,0x3dc2c747,0x3e261875,0x3e3033a1,0x3dc46d19,0x3d9c29b2, +0x3d0b2408,0x3b04059d,0xbd39bd06,0xbd60fc5a,0xbd01dce2,0xbd2b9046,0xbd14de64,0xbc97544d,0xbcbc72ea,0xbbd40091,0xba676c75,0x3d8f2f93,0x3d8d1880,0x3c46b0d5,0x3d2ea648,0x3d0b3b2a,0x3d1f9730,0x3d60e412,0x3d752c9c,0x3c90301d,0x3cd28d10,0x3cd8c309,0x3c896168,0x3ce6c531,0x3c1a5a49, +0x3bf99c3e,0x3c90a2b4,0x3ca41469,0x3ca4244b,0xbc2f204b,0xbc91d14d,0xbca274e9,0xb96255d6,0x3bd8ea03,0xbcc37de2,0x3ca131d3,0x3d1a8ad2,0x3d8079b2,0x3d13fb0e,0x3ce523ea,0x3ce5dd81,0xbc21a970,0xbc818a4c,0xbc1e0903,0x398fe12a,0x3c4a328c,0x3c1c7eb3,0x3b972157,0x3bf80611,0x3ca97b81, +0x3c031636,0x3b9010ea,0x3c9e3de5,0x3c354f74,0x3ca8e618,0x3cdbd141,0x3d4c62fb,0x3d456843,0x3c93caf5,0x3c385621,0x3a303a2e,0x3b5033df,0x3ae646d6,0xbbee3f38,0xbc56a088,0xbd4765b9,0xbd4e17d0,0xbd187bdc,0x3c55cc8d,0x3ca1d009,0xbc85a0bd,0xbcba07ac,0xbc9205f7,0x3ba71fe2,0x3cc72c71, +0x3cae7abf,0xbc133487,0xbbad2edb,0xbc171e94,0xbc202d76,0x3b408769,0xbb1d3624,0x3b20641c,0x3beb1a31,0x3c6eacc4,0x3cef56fe,0x3ccdb125,0x3c93c149,0x3b9d8b53,0x3c1b2532,0x3c3a1e5e,0x3c4eede8,0x3c08bb92,0x3b2ddfdb,0xbbfa8e5a,0x398aca24,0x3c235e0d,0x3c0ff58b,0xbb0400bb,0xbc2d377f, +0xbc8f02dd,0xbca48b3c,0xbccdf472,0xbd1f14f3,0xbcc62246,0xbbfb5cc9,0x3c8796f0,0x3b77797a,0xbc28e2d5,0xbce07907,0xbc97eeb5,0xbbaeddef,0x3bff5334,0x3c1b93fc,0x38ebac6e,0x3bfc407a,0x3cbaa807,0x3c79b0ab,0x3c5a2e3f,0x3c0137a9,0x3bfbcc84,0xbb066e1e,0x3c5b7ef2,0x3c9ee867,0x3d100dce, +0x3cca76f8,0x3ca263bf,0x3c47ed67,0x3c3acd9a,0x3c6d9d5e,0x3c74759a,0x3c32fbbc,0xbbf281e6,0xbc85353d,0xbc67a01f,0xbc5c9ca4,0xbc66bd9d,0xbc6bc20e,0xbc5fc32a,0xbc5ac530,0xbb214c34,0x3b501f57,0x3c359533,0x3c93b867,0x3cf2933d,0x3d20a2a3,0x3d15640e,0x3cfd81bf,0x3cdfbe3e,0x3cc447fd, +0x3cba4803,0x3ca07914,0x3cfc7455,0x3c3a72a6,0x3bdfdda2,0x3b8b5c26,0x3af5ec1e,0xbc0b7ee7,0xbc18e629,0xbc5daa31,0xbc503950,0xbc7d3395,0xbc40f078,0xbc6e967a,0xbc2cb815,0xbc4408a8,0xbc692486,0xbc7a8ee0,0xbcace12d,0xbceccf82,0xbcdc7ef4,0xbce2ff59,0xbce0bada,0xbce4e46f,0xbce82c6a, +0xbcf81213,0xbce0ccec,0xbcce9048,0xbcbf734e,0xbc9ec538,0xbc892093,0xbc44e6a4,0xbc6e4d04,0xbc7242cc,0xbc8168e5,0xbc866ca6,0xbc858c1e,0xbcabe799,0xbc4b6dd0,0xbbc15f09,0x3c30ef41,0xbcab63aa,0xbc4d2951,0x3acd014e,0x3a4282e3,0xb7dbbd9f,0xbadf24b9,0xbae33f47,0xbb484511,0xbb10bee0, +0xbc48534a,0xbcb219a1,0x3a3b455a,0xbc62be8d,0xbd2436a0,0x3c2e441d,0x3bdb65c1,0x3bf6326d,0x3c29eb50,0x3c531f6f,0x3c631051,0x3c4f9f3a,0x3c380003,0x3c3b276f,0x3be8a7bd,0x3c007826,0x3c6e2107,0x3c3b5fd8,0x3c2f8401,0x3c056feb,0x3c0c409a,0x3c033fab,0x3bd8d42e,0x3c0ec372,0x3c0f460a, +0x3bc36736,0x3c3762df,0x3c4a6338,0x3c241243,0x3c67b870,0x3c5a2dab,0x3be65c93,0x3c1b7ff0,0x3c15d8b1,0x3bd82386,0x3bf6ebbc,0x3c04907a,0x3c3d5a02,0x3c346349,0x3c10c72c,0x3bd72b41,0x3bbfea8d,0xbb99d68d,0x3c25afe7,0x3c881248,0x3caa20a4,0x3ca51dba,0x3c99b4a8,0x3c858a85,0x3c92ce5f, +0x3b578a34,0x3bb4355d,0x3cd1d1db,0x3ca5ad6d,0x3c89ff7c,0x3bfa619f,0x3bf25a16,0x3bcb8609,0x3b49f2cb,0x3c09ed0e,0x3c03c2c9,0x3b5425cb,0x3c254bb7,0x3c4c66fb,0x3c9df194,0x3c9c8cb8,0x3c9075f0,0x3c2924cf,0x3c727996,0x3c694820,0x3c114ff3,0x3c18884e,0x3c313b8c,0x3c94ef47,0x3c2c285d, +0x3bcc73f3,0x3bd29d34,0xbb51b5e6,0xbcb69b70,0xbbb7b8d8,0x3c5d23c9,0x3cbfdb9e,0x3cfa3e28,0x3d163c33,0x3cd404e2,0x3cf639b1,0xbbe2f276,0xbac2c719,0x3d175a0c,0x3cc324fd,0x3ca86e56,0x3b805050,0x3b5de0a4,0xba27236d,0xbbe93324,0x3b856a70,0x3b7eb02f,0xbbc697f1,0x3bd03ce8,0x3c3c2765, +0x3cc3eda3,0x3cc4d167,0x3cb485e7,0x3bb90a84,0x3ca06d3c,0x3c6f1499,0x3bdab34a,0x3ba4b994,0x3bf08d2d,0x3cd67b82,0x3bb58160,0xbb381b45,0xbaff2ffd,0xbca1e894,0xbd02047d,0x3bb672cd,0x3ce25959,0x3d1d0be2,0x3d3c8639,0x3d3f3da9,0x3d36dd8e,0x3d586c80,0xbbd06c16,0xbb3fa593,0x3d82790d, +0x3d41be58,0x3d0b501c,0x3b72fa76,0x3a960207,0xbb1f7eb6,0xbc64b8d8,0x3b0bc1c4,0x3b03760a,0xbc50f805,0x3bc8ed57,0x3c6656f3,0x3d03371a,0x3d28c7f8,0x3d19df4a,0x3c49b1fb,0x3d2d922a,0x3d1ed288,0x3c84aaef,0x3c56c405,0x3c655c29,0x3d2cd501,0x3c86a724,0x3ae39df2,0x3bcfad40,0xbd039677, +0xbdad11b9,0xbdba06aa,0xbdedaa28,0xbdb49f0c,0xbd0d2580,0x3ca0ae60,0x3b8e9590,0xbd8c0bc9,0xbd4c0a88,0xbd2c224b,0x3b7e4f32,0xbbd8350c,0x3a80bda3,0x3b4d2a6c,0xbcb50fe4,0xbd0b0326,0xbce18567,0xbca159a0,0xbca8ddfa,0xbca5f2ed,0xbc00a300,0xbc13d786,0xbb34feec,0x3c8e51f2,0x3cf9797a, +0x3ca9ebe9,0x3d1df30c,0x3d282d92,0x3c99b848,0x3d2239fe,0x3c56b2c7,0xbc88fffd,0xbca53540,0xbcd584bc,0xbd46cd4f,0xbd8bee96,0x3c5c1b2e,0xbc126e09,0xbdbd6a52,0xbe01f978,0xbe36b02c,0xbdce5b8d,0xbd993f57,0xbdfc1d46,0xbe00232d,0xbe009094,0xbd55ced6,0xbda44e38,0xbdb8f058,0xbdba0483, +0xbdbfdba5,0xbd79f239,0xbb8c60de,0xbc9b6e19,0xbc6df048,0x3c6dc147,0x3c68062b,0x3cbbf3b8,0x3cfb988e,0x3d433630,0x3d3bf4e5,0x3cd5ae43,0x3c8cb57c,0xbab98e2d,0x3c278f20,0xbbe2548c,0x3cb1b1ba,0x3d53aefd,0x3d20eaa1,0x3bf7a9cd,0xbd3c3fcb,0xbc1e63cf,0x3d8610e6,0x3dfeaa49,0x3e3b7c49, +0x3e508703,0x3e212e46,0x3e3058a6,0x3d7d51b7,0xbe11b533,0xbdb7b98f,0xbda3a84b,0xbd4932d6,0xbd73d5bd,0xbd46e3f4,0xbcb5ca75,0xbd1aea70,0xbd1b6904,0xbcc315e1,0xbd004b6a,0xbd10a47b,0xbd048af3,0xbd002ee2,0xbc0ab8c5,0x3bccb24f,0x3da854ce,0x3d9024f1,0xbcf36f07,0x3ca1630d,0x3c093ade, +0x3c0946e9,0x3b369f42,0x3c8a5b8d,0xbc691ea0,0x3dbc1060,0x3e0b01dd,0x3def84e1,0x3daedf72,0x3bce8265,0x3b670b70,0x3c431a86,0x3cd22dc3,0x3cfed851,0x3dbfcb43,0x3dd082ca,0x3c886ba1,0x3d892718,0x3cfa4491,0xbc58ec6d,0xbdc12106,0xbe136ce9,0xbe203894,0xbe1457d4,0xbe024def,0xbdcdf9c5, +0xbda39ac6,0xbd77f645,0xbd1d64cd,0xbc666fa8,0x3be03a0a,0x3a7788bf,0x3d23b262,0x3d197654,0xbc8e46d8,0x3ce40752,0x3ce5a7e3,0x3c1ac869,0x3d278608,0x3d7447b2,0x3d4f24db,0x3d64b933,0x3d19e3f2,0x3b2d3e30,0x3be3944a,0x3cf8aaee,0x3d0354e2,0x3cfbbfec,0x3d354c11,0x3d91973e,0x3d619dc5, +0x3c998b8a,0xbd53d1ac,0x3ca6cf84,0x3d8651c3,0x3dffa7ed,0x3dd175c6,0x3db34276,0x3d757e15,0x3d515aca,0x3d102a51,0x3d074cd7,0x3d042866,0x3d086141,0x3d0707bc,0x3cb9f13e,0x3cdbcb38,0x3cb7d69e,0x3d47c059,0x3d55e569,0x3cf496c2,0x3c59a280,0x3bcdff1e,0x3950c6f8,0x3c48e117,0x3c61aaad, +0x3c69c78f,0x3d1ace9b,0x3d43ceee,0x3d1e39c1,0x3d1c31f4,0x3ceadf01,0x3d18065d,0x3d5ebfa9,0x3d873ed1,0x3d8523af,0x3d3f5301,0x3cc269e4,0xbc821554,0xbcd80464,0xbcaad6f0,0x3cc4c13b,0x3b55396f,0xbc8b1027,0xbd3d1fbb,0xbd7f590d,0xbd4ddc6d,0xbc06af2c,0xbb39011e,0x3bbdbd13,0x3b012bd3, +0xbc137fca,0x3afb9029,0x3bf7110d,0x3c826c44,0x3c945304,0x3c8de9f9,0x3cc21f75,0x3ccc19c7,0x3cf82827,0x3d1ceedd,0x3d38b0fc,0x3d30ff83,0x3d2ec8f2,0x3d108d56,0x3ccff30a,0x3cc62a97,0x3d0f4789,0x3d2c6c41,0x3d1ec8bb,0x3d12d560,0x3d0bd008,0x3ca2f3cc,0x3c001345,0xbb650d94,0x3bbcc703, +0x3c2b6e04,0x3c786721,0x3cc8d4a6,0x3d15c6a2,0x3d3e2854,0x3d31732d,0x3d0b788f,0x3cbf1306,0x3ca5f279,0x3ce0ddf2,0x3cb3822e,0x3c638850,0x3cc31b8d,0x3cfac658,0x3cf7715f,0x3ccdf37f,0x3cf42c43,0x3cb060ce,0x3cd8e1d5,0x3c95ed36,0x3c996cd9,0x3c57ddf4,0x3c64a57e,0x3c893126,0x3c9b4c6e, +0x3ca0d552,0x3ce5efe9,0x3beb2b2b,0x3c711e47,0x3bf34300,0x3ad4f923,0xbb432d7c,0xbc008b07,0xbc36260c,0xbc913ec0,0xbc8afaa1,0xbc8dfbf6,0xbc90b952,0xbc82affa,0xbc80e418,0xbc581944,0xbc389485,0xbbcbfc23,0xbad6bdae,0x3b14b53c,0x3b5ac35c,0x3bf3c6ea,0x3b961900,0x3c35cb65,0x3c385a5b, +0x3c245b6f,0x3c33b62b,0x3c83e598,0x3ca418f5,0x3cb9e389,0x3cbcf01c,0x3cf9a365,0x3d101fd8,0x3d16c09e,0x3d010336,0x3ccbb645,0x3cb7936b,0x3cb3ad4d,0x3bd2c2ca,0x3c743309,0x3c35b8b7,0x3c2a777b,0x3c09cc5b,0x3be94f39,0x3bb5e3f8,0x3b7127f1,0x3b942ebf,0x3ba55c23,0x3bc2858c,0x3bbaaf29, +0x3bbc316f,0x3bb57226,0x3bd76ded,0x3be4cb73,0x3bf71884,0x3c054f3e,0x3c0e1690,0x3c41a608,0x3b9fd076,0xba91149c,0xbc5e0aac,0x3c1d561a,0x3a8ac187,0xbc643f26,0xbc4042ed,0xbc20b85b,0xbbe5fc85,0xbbdf2a77,0xbbc13665,0xbb66af86,0x3bb719c9,0x3c6dc4ac,0xbc13355d,0x3ab2a86c,0x3c738c33, +0xbc287737,0xbc457dbe,0xbc3e7b35,0xbc59376f,0xbc616d11,0xbc3d4ea3,0xbc328e76,0xbc33cff8,0xbc493766,0xbc803245,0xbc7d9a5e,0xbc3772cf,0xbc2c3dae,0xbc22e924,0xbc34c217,0xbc2f31a5,0xbc20052e,0xbbce7bac,0xbc0dcd64,0xbc08ef1f,0xbb86026f,0xbbf0703a,0xbbee911f,0xbba0a466,0xbbcf0eac, +0xbbef04f7,0xbbeb8ba0,0xbc0b0387,0xbc14a081,0xbc1e704e,0xbc1d0a99,0xbc0df0be,0xbba11278,0xbc184eb1,0xbc298f85,0xbc45db6d,0xbc43a73d,0xbc97369b,0xbcb3c8d3,0xbcc9529c,0xbcb20b67,0xbc686443,0xbc343cee,0xbc5bbce3,0xbca75b30,0xbd04e22c,0xbd045620,0xbc9fe638,0xbc7eeac9,0xbc52c752, +0xbc750693,0xbc630876,0xbc42b847,0xbb097d37,0xbc1003f4,0xbbb8407f,0x3a9c2176,0xbb622cee,0x3b59ef84,0x3b821ac3,0x3b1ab490,0x399ba1a0,0x3a2d4dd2,0xbba597b8,0xbbec9506,0xbbf799e0,0xbbeff202,0xbb8f60ac,0x3b351de9,0xbb6790d2,0xbc1adfe6,0xbc9e9e9d,0xbc9f89f4,0xbc8c0be6,0xbcad3430, +0xbd1629e7,0xbd10d7dc,0xbcafcc2d,0xbc9dd829,0xbc8be666,0xbcc8119c,0xbd3f053b,0xbd47cb9c,0xbccfe450,0xbcae3ab1,0xbc6f8096,0xbc993d58,0xbc84c481,0xbc45f635,0x3bc9c344,0xbbefd3e4,0xbafe22d3,0x3beab419,0x3bc61199,0x3c78b13c,0x3cb001de,0x3c84a660,0x3c49a5c6,0x3c951b3f,0x3b92a94c, +0xbb12f952,0xbb102646,0xbb5ebd77,0x3b07f4f5,0x3ca25897,0x3b4d2bf5,0xbbf1029a,0xbcb8ebbc,0xbc96032b,0xbd0f88a8,0xbd08aa91,0xbd39353b,0xbd11d509,0xbc445af3,0xbc364129,0xbc930052,0xbd14cf4b,0xbd9f061a,0xbd9f1433,0xbd1d66d7,0xbcd90358,0xbca53c36,0xbc9cbb94,0xbc8e8626,0xbc39e95a, +0x3c7eab9e,0xbb99df41,0x3ba13502,0x3c930967,0x3c125590,0x3cc80d25,0x3d03e32c,0x3cfd6a0e,0x3cb5c4a0,0x3ca66b85,0x3cb89dcf,0x3cd17ae3,0x3c0ce8ef,0x3bf5f43a,0x3c27703f,0x3d21fb83,0x3c637dea,0xbbac7e84,0xbd08574b,0xbd240ae6,0xbc1e8588,0xbd52c044,0xbda7b1f0,0xbdc347cd,0xbdf8aba8, +0xbd83e796,0xbd0f4588,0xbcad32e1,0xbce27dd2,0xbd3f6476,0xbdc2806b,0xbd6ce678,0xbd307bce,0xbd3920ab,0xbd053535,0xbcba9d71,0x3b3b35a4,0xbc147e44,0xbc2a8ae0,0xbccaae8e,0xbc78e5cc,0x3c68520e,0x3d03cfe1,0x3c8e68b0,0x3cc1b214,0x3d5d83a9,0x3d02f5a4,0x3c97ae05,0x3c5e577f,0x3c8ea820, +0x3b5908f4,0x3bb05271,0xbcc7f12b,0xbd00fc11,0xbcafabf7,0xb9646bdb,0xbdb1ddac,0xbda800a4,0xbde5c275,0xbdb404ad,0xbcf27eaa,0x3c7a2093,0x3c8c9010,0x3cd77564,0xbdb7a2aa,0xbdd876d4,0xbd610f1d,0xbc25cdd8,0x3c5dc073,0xbb3bef57,0x3c564f53,0xbafbbd94,0xbc712ed0,0xbc0de2f6,0xbb99fed3, +0xbc5bcb14,0xbc4284f1,0xbbb02657,0x3c635c36,0x3d3cd19b,0x3d2cf732,0xbc51f7d3,0xbb5210a0,0xbacc2bf9,0x3bde3b73,0xbc0fe212,0xb9652cce,0xbc8eb563,0x3d20dba8,0x3d0e7cf1,0xbc8433f5,0xbd7c3d61,0x3e347827,0x3e56fe62,0x3e2b9a5f,0x3ddfea80,0x3cee68bd,0xbd8aa4ac,0xbdbcd06d,0xbc9fa228, +0xbdecea5b,0xbde39846,0xbd03dd8a,0xbcb091d0,0xbcc7029f,0xbda212d3,0xbd8b3ea2,0xbd7b21fa,0xbd11b453,0xbc85823c,0xbbc80a11,0xbc6ecfeb,0xbc5c64bd,0x3bcaf81e,0x3d411e34,0x3caa03e0,0x3c46aafa,0xbb8f261e,0x3ba55a88,0x3b4837c3,0x3b0109a9,0x3bffd859,0x3c8e1408,0xbc00cfc5,0x3d3e3288, +0x3dae8ee4,0x3e20571b,0x3e225508,0x3b620ec7,0x3a44a4ae,0xbc7f7dd4,0x3cfe56ed,0x3de67120,0x3e2585d6,0x3e118606,0x3dc80803,0xbd56aba0,0xbdd40561,0xbd6a2124,0xbd7d9c0c,0xbd2b3706,0xbd63385a,0xbd4face1,0xbd7179dc,0xbd5dfccb,0xbd57a51b,0xbd1388ce,0xbc8f9c1e,0xbc1f5d27,0x3c0ebdcc, +0x3d4ac344,0x3ca86bd0,0x3c6a70f3,0x3bfbc3ce,0x3ba6bc10,0x3c173e6e,0x3c0d9fcc,0xba64473a,0x3c726177,0x3d6b5c20,0x3d8d9299,0x3d847f5e,0x3d3a89c7,0x3cd7edcc,0x3d0e031d,0x3d10cb10,0x3cba2d46,0x3a7e919c,0xbcacb3c4,0xbb323543,0x3c97f7f3,0x3d996824,0x3d09db28,0x3d1f54cf,0x3d979cb2, +0x3d4dd4b6,0x3ced2224,0xbc06927c,0xbc878550,0xbc6f0d2b,0x3aca9f95,0x3b3e2fea,0x3b9518e3,0x3c54a704,0x3c724aa8,0x3c812d6a,0x3d0076d6,0x3d39ffd0,0x3d3dd154,0x3cd47b0e,0x3d0539cc,0x3d18c266,0x3d69db45,0x3d22ecc2,0x3cf02b93,0x3cb41a83,0x3cfdf1e8,0x3d238c3c,0x3d3588f0,0x3d23160e, +0xbb8c9adb,0xbc9b2da0,0xbcf28d2e,0xbcac15dc,0x3b9ca0a3,0x3c9bbc9e,0x3c9d2ef4,0x3c6f7ad1,0xbc829e1d,0xbcacfd46,0xbc4291ac,0x3cddabb9,0x3d7375cd,0x3d9ad70b,0x3d9fbfc8,0x3d83a0b5,0x3d34358f,0x3d085298,0x3cd7167b,0x3cd39248,0x3d0840be,0x3d1ab743,0x3d1f108f,0x3cd20faa,0x3c955e32, +0x3c99ff99,0x3cd4fb1a,0x3d02cdfd,0x3d1a4b56,0x3d2498db,0x3d2eb875,0x3d123f65,0x3d348305,0x3d1b759d,0x3cd91929,0x3c0eecd7,0x3c4dc65e,0x3bdcd84f,0x3c84a289,0x3cccab26,0x3cfbc20c,0x3ccf6756,0x3ccafae3,0x3cdc7625,0x3ca9c82e,0x3c50fd8c,0xba95bc7c,0x3baa8974,0x3c168fe8,0x3c94b561, +0x3ca7af36,0x3cdfdf18,0x3d0e9923,0x3d1106fa,0x3cf50d15,0x3d088a6b,0x3d09679b,0x3c8d9887,0x3bc3513a,0x3ca8419c,0x3d0d8e80,0x3d379268,0x3d154986,0x3cdea2ab,0x3caea24b,0x3ca2e647,0x3ca9100f,0x3caf90de,0x3c8059f0,0x3c3fa675,0x3c139aea,0x3c368f77,0x3cdf6db4,0x3ce4fb44,0x3cce4681, +0x3cacbca4,0x3c9e419f,0x3c946b39,0x3c7e1a7d,0x3c4a8306,0x3c054430,0x3bc47a94,0x3b728317,0x3a95a0ea,0xbb2400c4,0xbbd11c9b,0xbbca92e4,0xbbe58095,0xbc0169d9,0xbbe72e6a,0xbbb191c9,0xbb9c0862,0x3b8aafc4,0x3c48db5e,0x3c9c21ea,0x3cc6fe46,0x3ce2384d,0x3d0922b3,0x3d092eb3,0x3d12c75c, +0x3d16f991,0x3d18b5bc,0x3d18319c,0x3d1d5f1a,0x3d1461f5,0x3d0f4d3d,0x3d0196e1,0x3cf3469f,0x3cbea57f,0x3cc88ec0,0x3cba3bf3,0x3cb24177,0x3ca64dbf,0x3c9d27f3,0x3c9777a5,0x3c94ceaf,0x3c94c4e3,0x3c90ec8e,0x3c8d0fbf,0x3c80e2a7,0x3c6d57d9,0x3c4ab1dd,0x3c5c50b3,0x3c65cbdf,0x3c6cd9b9, +0x3c6f0ae6,0x3c741c4b,0x3c5a8c7e,0x3c84eb5d,0x3c9c023e,0x3cbdc0f0,0x3cb1b750,0x3ccdab7e,0x3cecb83f,0x3ce49c84,0x3ce21b98,0x3cdee2ef,0x3cdd645a,0x3cda07f6,0x3cd923ca,0x3cc8eaab,0x3cc1bf42,0x3cd16c57,0x3cc8667c,0x3cb7a90f,0x3bac9041,0x3b395121,0x3b975ee6,0xba951202,0xba91a54d, +0x3b26098d,0x3b20acec,0x3b8d6d20,0x3c2bfe92,0x3b9625eb,0x3b6b2fb8,0x3bba5a6a,0x3b069921,0x3ad038bb,0x3b0bed52,0x3b8dc88e,0x3ba621fa,0x3b9534a8,0x3ba7186a,0x3bc6142f,0x3beb5d65,0x3c1d0c4c,0x3c2114fc,0x3c022b96,0x3c10b48d,0x3c0673fa,0x3c02bf08,0x3b85c6ce,0x3b39806c,0x3b04f05c, +0x3b83521e,0x3babd6ee,0x3bede395,0x3be677eb,0x3bcedaf1,0xb9a01418,0x3b38f607,0xbc12a2c6,0x3a76fb1f,0xbc2bbcd7,0xbc2541ca,0x3afe8ddb,0x3b6b35ad,0x3c11eff4,0x3caf97c6,0x3c003542,0x3b62ace7,0x3c049248,0x3920d2fc,0xbaccdc33,0xbaacefc4,0x3b700e8c,0x3bb51827,0x3b806b65,0x3bd28bcc, +0x3c0ea3c8,0x3c68344a,0x3c9f55b0,0x3c9b1755,0x3c8d22db,0x3c7fa1ae,0x3c590819,0x3c668893,0x3ba22526,0x3ae6609d,0x3aa9cb1a,0x3b924fe4,0x3c05a02b,0x3c4d4431,0x3c418145,0x3bd2db6c,0xbc203229,0xbba0a541,0xbc79574f,0xbb97eab6,0xbcf7609c,0xbd0c9ce9,0xbc323af7,0xbc0aa9bd,0x3ab2dc74, +0x3d0c9817,0x3c0724bb,0x3a567176,0x3c2eb720,0xbc3219dc,0xbc5a36bc,0xbc101303,0x3b10ea2b,0x3bb9f5e5,0x3b57c0f5,0x3bcc5a4d,0x3c390a03,0x3cba7d21,0x3d002f82,0x3d00cfb9,0x3cd9b8bb,0x3ccb4ad0,0x3cb707d7,0x3cbf3b56,0x3ba11800,0xbb4e38d4,0xbb6899dc,0x3afabaed,0x3c32e943,0x3c9e6794, +0x3c814f33,0x3bd811e5,0xbc927960,0xbbe3af68,0xbd14eae4,0xbc50d9df,0xbd3ff8ef,0xbd49f5ae,0xbba0daeb,0x39832703,0x3c920621,0x3d6af87c,0x3c74cffd,0xbb2cf209,0x3c8c99f0,0xbba9328a,0xbc62cdb4,0xbc4ade8c,0xb9f8a859,0x3ba026c3,0x3af6d5d8,0x3c281648,0x3c86b2e2,0x3d0c51c6,0x3d4e50e6, +0x3d52b0ad,0x3d40da4b,0x3d0f1f47,0x3ced4741,0x3d33196b,0x3c9dcdbd,0x3c292120,0xbadd32d0,0x3b846c5e,0x3c6b2de6,0x3d02418b,0x3cc81cde,0x3c107291,0xbd27e159,0xbd105855,0x3ce05fda,0xbda290f1,0xbd85669c,0xbda50856,0xbdbe2179,0xbd7977a4,0xbd11e79c,0xbccfa0ca,0x3d67833b,0x3d694359, +0xbcfa0ee9,0xbd59d674,0xbd7a89d6,0xbd1619f8,0xbae75925,0x3ac91f08,0xbce2f5b0,0xbc7a0d61,0xbb938a7c,0x3c5e141e,0x3c7670d8,0x3c853d9c,0x3cd3d435,0x3cad42b4,0x3cc6f233,0x3d17d5f2,0x3c45f178,0x3add68d9,0x3c3ebdf4,0xbad053ba,0xbbfa428d,0x3c4b8ab4,0xbc0915b1,0xbc6245b4,0xbcad977f, +0x3d2c7ff6,0xbdb4aa66,0xbdc34c1f,0xbd0d6d45,0x3c5c43cc,0x3cc37eeb,0x3b4ca212,0xbb70fee4,0x3c78479b,0xbcb9fa80,0xbd5ed677,0xbde13f9c,0xbd90c7f5,0xbd5627aa,0xbcc52647,0xbcd6958d,0xbc80fcbf,0x3c021806,0x3aa2a859,0xbb18fddd,0x3b092fb9,0x3cc25a5c,0x3d0a9e01,0x3d532426,0x3cf1ca74, +0x3cc95a9f,0x3c4625f0,0xbaafeb0b,0x3a97d5ae,0x3b80c016,0xbb825154,0xbb227d75,0xbc908f46,0x3c173ae5,0x3c0e2ff6,0x3c4c4fb8,0xbd7503ae,0x3e056027,0x3d485dd3,0xbcc9b3b9,0xbde417dc,0xbe60b354,0xbe473091,0xbe1fb2c3,0xbd9a9310,0xbda7bd44,0xbd9cd998,0xbdf499e2,0xbd86b9ed,0xbd114c76, +0xbc051c4d,0x3c182822,0x3b42f043,0xbc87b04f,0xbc4adf30,0xbb9ea4a4,0xbbef0e3b,0x3ba82573,0x3ce094a1,0x3da956ed,0xbb3cc85f,0xbcb9168b,0x3bf30266,0xbc2572af,0x3bf61908,0x3b0e25e7,0xbb432942,0xbaba7854,0xbb008802,0xb9e75435,0x3c95df3b,0x3dd741e3,0x3de6d3e5,0x3d742798,0x3db3fc65, +0x3e228f4a,0x3e39b27f,0x3e254bdf,0x3dceb03c,0x3cf25dbb,0xbcdc57d7,0xbdb8fc14,0xbdbdd8d9,0xbdb7dbcc,0xbc5eea1d,0x3bd47ab6,0xbba32afc,0xbc938526,0xbccc9dce,0xbcdab9fc,0xbd08b897,0xbd137f06,0xbccd2c6b,0xbcbfba41,0xbbaea719,0x3d5bcff1,0x3c19d999,0x3bf459d9,0x3cc9e8fb,0x396650aa, +0xb890ed44,0x3b3eae46,0xba49555d,0x3be6acb7,0x3d1afae5,0x3d68a0fe,0x3d9396e1,0x3db0b606,0x3d791759,0x3cef2d9d,0x3cc83b12,0x3c756ecd,0x3c6988f6,0x3c5e79a4,0x3d86dcd4,0x3deaf305,0x3e161615,0x3de53e4f,0x3d68229e,0xbd021901,0xbd46b9c1,0xbd6d207d,0xbd2df728,0xbd4be246,0xbd52d32a, +0xbd6a07e3,0xbd1a53eb,0xbcbae87d,0xbc5a396f,0x3a49a7ea,0x3c87c125,0x3d166581,0x3cb80c35,0x3c896e3d,0x3c44c4f8,0x3cfaa922,0x3d1f10b1,0x3d33c09b,0x3d38ffa8,0x3d40d42d,0x3d45b89b,0x3d11142f,0x3d05f249,0x3d3380cb,0x3d06cfd7,0x3cc1663d,0x3ccc7dc0,0x3ce59ba1,0x3cc320ad,0x3c81fc13, +0x3ca69292,0x3ccdc2c6,0x3d31c324,0x3d6523e2,0x3d84af97,0x3d8370dc,0x3d857026,0x3d85c994,0x3da2b11b,0x3d982fb4,0x3d92492b,0x3d7136a7,0x3d3bf913,0x3d1604e1,0x3d0030d7,0x3cdff75a,0x3cc22dbb,0x3ca526ef,0x3d063fba,0x3d14e7a5,0x3ce143f8,0x3ca3728d,0x3c8cf574,0x3c880b95,0x3c2921b6, +0x3c5f1052,0x3cedb5a5,0x3d0dacf9,0x3d256ebe,0x3d3d292c,0x3d169bf0,0x3c3ee585,0x3b9af7d6,0x3b7517bf,0x3a8c4689,0x3b056239,0x3c15200a,0x3c84cf41,0x3cae3e9b,0x3c979678,0x3c622223,0x3c0ddda3,0xba826367,0xbc11f134,0xbc876963,0xbc8f3343,0xbc97a009,0xbc96ecc8,0xbc88d98b,0xbc54b6d7, +0xbc68f6b7,0xbc077bfe,0x3b1a44b2,0x3c337ad9,0x3c41f7de,0x3c7d1d72,0x3ca6b359,0x3cb54097,0x3ca12b99,0x3caf0ec2,0x3cd05429,0x3ce8c41f,0x3cfd2394,0x3cdd7b9c,0x3cc19a6c,0x3cb7f7ea,0x3c8ece20,0x3cfe9360,0x3cfcfc32,0x3cf29a6f,0x3cf0185e,0x3cda8f5e,0x3cc2eebd,0x3ca46495,0x3c909269, +0x3c8eb822,0x3c9cc8ef,0x3cb31445,0x3cc0d3a2,0x3ccc469e,0x3ccdc154,0x3cc8f3ab,0x3cbdfe29,0x3cb1e6da,0x3c9dd147,0x3c8d29a4,0x3c6cac37,0x3c5c1c2d,0x3c82b87f,0x3c9447e6,0x3c9ec369,0x3cae9be2,0x3cbed83a,0x3cb75269,0x3cbb6734,0x3cbd3b1b,0x3cb386e0,0x3ca7ed3c,0x3cb2bf8e,0x3cb9538e, +0x3cd0a150,0x3ce69952,0x3ce5f3fa,0x3cde086b,0x3ce8c845,0x3cddf904,0x3cd5adf7,0x3cd3015a,0x3cd06bb4,0x3cd01e3a,0x3ccc3f08,0x3ccd1baa,0x3cc5b655,0x3cbb683b,0x3cb7843c,0x3cb6f0d0,0x3cbc08d2,0x3cb57bb9,0x3cb21208,0x3cb074c2,0x3cb04216,0x3cafed4b,0x3cb4826e,0x3ca6bcb3,0x3ca070e0, +0x3c924996,0x3cbce36a,0x3cb3d294,0x3cbb3998,0x3cbb3261,0x3cbbd367,0x3cb9b07f,0x3cbb3043,0x3cbd4117,0x3cb52db8,0x3cbced6d,0x3cca5c6b,0x3cbbc9c7,0x3ccedb7c,0x3d04df7d,0xbb84a1cc,0xbb5d29d7,0xbb1ce31c,0xbbd3cacf,0xbbf7c169,0xbbb67cb9,0xbbffec57,0xbbf04a60,0xbbc3990c,0xbb92460b, +0xbb770c4f,0xbb8d54ff,0xbb5b6172,0xbb82cc03,0xbbd1118e,0xbba83b59,0xbba549cf,0xbbae1e3d,0xbb9a6759,0xbb742b57,0xbb095efd,0xbb0e71b2,0xba954b6b,0x3a94136d,0xb9065ff7,0xba81f91c,0xbb005a3a,0xbb7874e7,0xbb8f4570,0xbb9a8d4f,0xbb2c085e,0xbaac40b1,0xba1ab462,0xba1e7d5b,0xba5d708b, +0xbba3b3fd,0xbb55a150,0xbb183fed,0xbb0b6eab,0xbc2e0605,0xbc5482c9,0xbc032499,0xbc7b9d9b,0xbc821458,0xbc60d6d3,0xbc1b5aaf,0xbc021ea0,0xbc2bfd5e,0xbbc9ab63,0xbbcf4de5,0xbc3c8141,0xbbf58687,0xbbed6697,0xbbfe1fff,0xbbeab60d,0xbb91a6c2,0x3a724b2f,0x3b7b8d60,0x3bc997b7,0x3bf44cc0, +0x3c09ddbe,0x3bb45ec7,0xb93a95fa,0xbb8643ee,0xbbd54582,0xbbc62bcf,0xbaab5f3c,0x3b31552f,0x3b90a4aa,0x3c0c501d,0x3bb1bc2b,0xbc18f0e1,0xbb02a86b,0x39937628,0x3b54ee97,0xbc90755e,0xbcb3c639,0xbc509cc0,0xbcf44c50,0xbcd9e437,0xbcb58e05,0xbc2aa048,0xbbbc61e7,0xbc36f476,0xbaffef13, +0xbbca624d,0xbca178a8,0xbc48129d,0xbc3637a1,0xbc3235ad,0xbc13800f,0xbb895a4a,0x3c0e3e8a,0x3c413d10,0x3c880dc0,0x3ca2f290,0x3cb526a8,0x3c965372,0x3be37bbd,0xbb9c298c,0xbc261317,0xbc0ec77d,0x3a9248a9,0x3c303473,0x3c4a4bcc,0x3c9e6a15,0x3c6a0127,0xbc3154b2,0x3acf4949,0x3b875469, +0x3c5c7459,0xbc3880ae,0xbc914b99,0xbbcec20f,0xbd0bc3c7,0xbd250e27,0xbd1e651e,0xbcc1381d,0xbc9bbcf5,0xbcf5b3fe,0xbc27d4eb,0xbc265ab3,0xbce7e3f0,0xbc6b82f3,0xbc5f57b1,0xbc5b9561,0xbc599069,0xbb64b80d,0x3c9d557d,0x3cdfdc46,0x3d155cf1,0x3d1df6e9,0x3d0c9e83,0x3ce8c1a3,0x3cea3c57, +0x3c13ffbc,0xbaf07025,0xbb8912a4,0x3b7e8c71,0x3ca29a72,0x3ce93b63,0x3d0299e0,0x3cbc47e3,0xbcc289c7,0xbb569afa,0xbb9335b3,0xbdb03218,0xbd8e9d34,0xbda504d7,0xbdc1d510,0xbda0e8b9,0xbd52770b,0xbcb2b86d,0x3c3c5478,0x3cef5134,0x3cc1b887,0x3bba7445,0xbc4f1f09,0xbd226c76,0xbcc619c8, +0xbc25cbf6,0x3baaafc2,0x3b08ef3d,0x3bcace55,0x3c281937,0x3c883483,0x3ca2b799,0x3c88b1c0,0x3d16af78,0x3d1a1736,0x3cc530ee,0x3b6d6f08,0xbbcd2b53,0x3b489f8a,0xbc9921b4,0xbc57f7c2,0x3ca3762a,0x3c74d347,0x3c3e1ed8,0xbb794ff1,0x3ce97a67,0xbd4db202,0xbd58736b,0x3bf64d77,0x3ca17eff, +0x3ce70841,0x39160f39,0xbc96b182,0xbd11c637,0x3c0f43b2,0x3c29b344,0xbc74f1ac,0xbd3d8cff,0xbd505fc0,0xbd1654e6,0x39d6bf83,0x3c6638fc,0x38ecd28f,0x3b42c671,0x3ba2659f,0xba01cdc3,0x3bcf2341,0x3c9eabc7,0x3d439173,0x3b2cedb0,0xbc284120,0xbad276bf,0xb9ffd18d,0x3a8fe5a4,0xbc52ee08, +0xbc6de1f7,0xbc98e383,0xbcf34c11,0xbcfb4eaf,0xbc2b0375,0x3ce4a4d0,0xbcca08fa,0xbcfe2e28,0xbe095935,0xbe5cdbc0,0xbe625902,0xbe212054,0xbdc936ae,0xbd2518d0,0xbd39d9cb,0x3c10307a,0x3ae5a4fc,0xbce1de2f,0xbd27dc83,0xbd1957a9,0xba986c8b,0x3a87781e,0x3c337abf,0x3c02e8f2,0x3c359fa3, +0x3c291a7e,0x3c402b6d,0x3cd63136,0x3ce006bc,0x3d104ab7,0x3a27eba7,0xbc18bd30,0x3b4ffe2d,0xbc298be4,0x3991cfb3,0xbb939305,0x3b5c0fbd,0x3b5b8eca,0x3bd1fb31,0xbc77b55d,0xbce3d89b,0xbc8be548,0xbc15992a,0x3e19b3fc,0x3e3f92ee,0x3e525d7c,0x3e2a2d45,0x3db93de9,0xbcda64b2,0xbd9c2bcc, +0xbd929a45,0xbc5adfdb,0xbc5bf572,0xbd62bacb,0xbdb57b95,0xbda857b7,0xbca44358,0xbb5c85c1,0x3c2fe2b9,0xbc0c5c47,0x3ab25460,0xb7853e61,0xbc2ce6ae,0x3becf84e,0x3c99991d,0x3cdf7f29,0x3c3c8f08,0x3c0147bf,0x3c2a5adb,0xba21b24e,0x3a91ae5b,0xbb0d72d5,0x3c251fd7,0x3c937ea2,0x3c9e702e, +0x3d4baceb,0x3da64e70,0x3de55d17,0x3dfafc51,0x3cc3d1e7,0x3c8618de,0x3ca1a9af,0x3d483c54,0x3de2a56c,0x3e00001b,0x3df5e598,0x3dac3b58,0x3cd5f3fb,0xbcf415ab,0xbd87a342,0xbdd6b5a9,0xbde86c24,0xbdb2b920,0xbd88d344,0xbd31eb9a,0xbd0321f8,0xbcb0eb2e,0xbc88a481,0xbc18577a,0x3bee2b2e, +0x3c76d99b,0x3d037498,0x3c155786,0x3b8f872b,0x3c31a67d,0x3cf5efa7,0x3d183618,0x3cda4ecd,0x3d14a48a,0x3d3062a2,0x3d58e514,0x3d35ddf2,0x3d28546c,0x3d47afa6,0x3d12ea98,0x3d4fc2e7,0x3d2b6d9d,0x3d166813,0x3cdc0dff,0x3c6a706f,0x3c45d1d6,0x3cf610b5,0x3d867bcc,0x3db000fa,0x3dc6441b, +0x3dc3078e,0x3d993ef4,0x3d480481,0x3c347c19,0x3c2f73eb,0x3aa7fcd4,0xbc2cd425,0xba00ec87,0x3bae4657,0x3c471474,0x3c8d4a7a,0x3c8b7c6d,0x3cfbb9a4,0x3ced1f74,0x3d04bf7b,0x3cf732f3,0x3cb5fe68,0x3c4ee87f,0x3bb45a8d,0x3c22ffda,0x3c57e517,0x3ca7b239,0x3cbbca28,0x3cfde1d5,0x3d273419, +0x3d498f2d,0x3caba799,0x3c91b070,0x3c4bd73a,0x3bd5705b,0x3b05f6c0,0x3bf5981c,0x3bd8c2bb,0x3b26489e,0x3c088e8c,0x3c86c5e6,0x3ce2856b,0x3cdbdc25,0x3cf2bc49,0x3cf4d992,0x3d1065f2,0x3d1e41ec,0x3d2e91e5,0x3d26f3b0,0x3d1b54db,0x3d069518,0x3d05ed21,0x3d1ba81a,0x3d24e46f,0x3d033f4f, +0x3cba74fd,0x3c91a4a6,0x3cb7a5ac,0x3d00b32a,0x3d0e7db3,0x3d18cb21,0x3d19ff5c,0x3d1c7034,0x3d175c4a,0x3d145636,0x3d1397c4,0x3ce888f9,0x3c97ab74,0x3c8d1769,0x3ca40c18,0x3cb7b426,0x3cc10d70,0x3cc739de,0x3cda4328,0x3cf34b82,0x3cf30b0b,0x3cdd71db,0x3cc718d8,0x3cac52e7,0x3c934c8e, +0x3c69f4d6,0x3c817371,0x3c8f0933,0x3ca79a08,0x3cb9ca89,0x3ce60c0c,0x3d018b38,0x3ca9dd84,0x3caa4aca,0x3c97f5b1,0x3ca3911c,0x3c9acbae,0x3c8e6912,0x3c84c189,0x3c672674,0x3c4f948e,0x3c46ec56,0x3c3f7870,0x3c450a81,0x3c5cc49b,0x3c6e94d4,0x3c70f872,0x3c7600e4,0x3ca2e827,0x3c6a28e1, +0x3c820808,0x3c86d0b8,0x3c904d5c,0x3c95e3d7,0x3c98c165,0x3c9e0f79,0x3c8d5c98,0x3c869e09,0x3c806b32,0x3c800801,0x3c7d8025,0x3c6cef9a,0x3c8c0b72,0x3c98af86,0x3ca35b5c,0x3cb1e053,0x3cb6f9bf,0x3cd0cb0d,0x3cca3496,0x3cd39943,0x3cdbd0e6,0x3cac4961,0x3cbb5e5e,0x3cd32bdc,0x3cd287f5, +0x3cd2f233,0x3cd5a12f,0x3cd4e523,0x3cd5039f,0x3cd3bbc3,0x3cb92e4d,0x3c960225,0x3cd4f076,0x3cb6292f,0x3c964c8c,0x3be15940,0x3bb0fd47,0x3bb95748,0x3bb174fd,0x3bb96635,0x3bc635ce,0x3b98dc51,0x3b9188b1,0x3bd24d90,0x3b5d0ef2,0x3b74529e,0x3baaced7,0x3c094ef9,0x3c0dd937,0x3bbc4f27, +0x3bc244d5,0x3bacb5c3,0x3b82f38e,0x3bb09b8e,0x3bb8d814,0x3ba2c2a1,0x3bbc5805,0x3bcaafae,0x3bc1637e,0x3c0f709d,0x3bd5daf2,0x3afddfdd,0x3a9fe1f2,0x3a560414,0x39a9c22c,0x3b675fca,0x3b9a6457,0x3b67dae6,0x3bf118d6,0x3c015df4,0xb9b522ab,0x3b94b24d,0x3c12a66e,0x3c0f0a73,0x3be61d6c, +0x3bdd4b40,0x3c1f4a94,0x3c0d5f47,0x3c060434,0x3c4fc18b,0x3b062b92,0x3adb98e4,0x3bb21a29,0x3c5af8f5,0x3c6d50de,0x3bb4e7d2,0x3bb18933,0x3b5146cb,0x3a054dfa,0x3b7034fc,0x3b88a927,0x3b3a9cfa,0x3bc7bf89,0x3c25ab8f,0x3c74a46a,0x3c7b210d,0x3c4b6287,0x3b96ba1e,0x3b279647,0x3a915796, +0xb8ece05f,0x3c0be964,0x3c41e048,0x3c0afc13,0x3c69b6ca,0x3c3c025d,0xba37610b,0x3c22e8c7,0x3bda0c72,0x3ad0cf94,0x3b5e0fd1,0x3b8e036f,0x3bcc0b40,0x3b43a2d8,0x3a566ed0,0x3c21e93d,0xbc3050a1,0xbbf5b753,0x3a8643e2,0x3ca08df6,0x3cb2acfb,0x3b3d7d0f,0x3b8978a8,0x38922b70,0xbbcf5a19, +0x3aa2babb,0x3b366a14,0x3a62151a,0x3c199bda,0x3c6f497d,0x3cc16260,0x3cd18b13,0x3ca6b3f2,0x3af25261,0xbb3a24ba,0xbbbfc2a9,0xbc1a12d5,0x3c18c0ca,0x3c84bad9,0x3c099fae,0x3cb22159,0x3c9cd2e2,0xbc428fa0,0x3c043884,0x3ce65b71,0x3c6eeae1,0x3bddaf61,0x3be48d30,0x3c952fb8,0x3caf14aa, +0x3ca729c8,0x3cf17d9a,0xbbc7aa45,0xbc2fd073,0xbb0717e9,0x3ccca355,0x3d0179ed,0x3a8a5f83,0x3b15ff06,0xbb7a1806,0xbc672dba,0xbb2f18a4,0xbacd97eb,0xbb428c39,0x3c60847c,0x3cc05fb4,0x3d06eef6,0x3d29b692,0x3d168ee1,0x3c79e34a,0x3b070d87,0xbc2b2798,0xbc54e315,0x3c2b99e3,0x3cf10a22, +0x3cb1779b,0x3d145731,0x3cbb8d9b,0xbc957e81,0x3c9e8b4f,0xbd9d9e37,0xbd686a57,0xbcadf070,0xbc5d9f8e,0xbcbe34b1,0xbd52b933,0xbd7379c1,0xbd072b82,0xbd348862,0xbc5c306a,0x3d373ca1,0x3ccca492,0x3c6d9dfa,0xba4d9e21,0xbc2e6ea1,0xbc5b3364,0xbc23772c,0xbbe4bcbb,0x3b389638,0x3cb45cc1, +0x3cb31a3b,0x3cc8be46,0x3cc96a1c,0x3d19f51f,0x3d053dc5,0x3c4798a2,0x3b16d441,0xbc05f830,0xbc1df1ce,0xbca795d5,0xbc664e18,0x39dd159c,0x3c8cf3f2,0x3cc231a1,0x3c9d01f8,0xbd29cd27,0x3c346ae7,0xbb8be9fe,0xbcaec955,0xbcd9aa40,0xbae446e0,0x3cbab571,0x3d082444,0x3c9e2a64,0x3ca6a6ff, +0x3c526782,0x3c83441c,0xbc816863,0xbcdd9eeb,0xbd15ffdb,0xbd0d2126,0xbce20041,0xbcbeba54,0xbc80509e,0xbbd2871c,0x3c0f161e,0x3cda409e,0x3cdd6b13,0x3c7b5472,0xba94cb17,0xbb9c5583,0xba82fab2,0x3b7c5426,0x3b462e9d,0xbc86dc15,0xbc5d905e,0xbc898efb,0xbc9fcbfb,0xbcf75f0b,0xbd121185, +0xbcd4665b,0x3b9753ef,0xbde3a0e7,0xbe089292,0xbdaa5462,0xbd4b6c37,0xbc1f7161,0xbd227eb3,0xbd8e13ef,0xbd8764b0,0xbd5ab527,0xbd080c3d,0xbc47820e,0xbcf78d49,0xbd253ebb,0xbd69c186,0xbd1e63af,0xbce350d9,0xbcc0687d,0xbca5de4f,0xbc36147a,0xbaff997f,0x3cbfab4b,0x3c887fe3,0xbc842014, +0xbbdd2be5,0x3ae27177,0xbba8f5f7,0xbb477496,0xba922430,0xbbc5560b,0x3b83533e,0xbb71f800,0xbc05a559,0xbc013a83,0xbcae6145,0xbd3f5f98,0xbd9ca855,0x3e1af039,0x3dda7c36,0x3d42ba8d,0xbca7781a,0xbd9e112d,0xbdd279d4,0xbdb727f3,0xbd407ca1,0xbd61e1b7,0xbd65ec8d,0xbd3dabcd,0xbd1df52f, +0xbd28b5d0,0xbd82a7b9,0xbd1c4136,0xbccbd8fd,0xbbb4d951,0xbb60c840,0x3ab3ca68,0xbc14f054,0x3cf8b4d1,0x3cf3134d,0xbbd40428,0x371e88f4,0xbb6f43b9,0xbc0c0d3a,0xb9f6a297,0x3b1515ef,0xbb703375,0x3ac56f4a,0x3c166ece,0x3b0e8457,0x3d0851d2,0x3d79e2da,0x3dd60325,0x3e04d04a,0x3d9d4c32, +0x3dcd01b8,0x3e0b239c,0x3e137f8a,0x3e09b3bd,0x3db2e8da,0x3c94cf89,0xbd843dbb,0xbda0b36e,0xbd9e0f7f,0xbd947554,0xbce7ae79,0xbcaaa772,0xbd5d54a2,0xbd47965e,0xbd6e5d9a,0xbd7208a9,0xbd734c1e,0xbd441c9d,0xbd082af0,0xbbefb1d6,0x38b44206,0x3af473a5,0x3b64cbfd,0x3c1a51ab,0x3cdcd93a, +0x3c1857e9,0x3b87adc3,0x3c1c2553,0x3ccf62c3,0x3d139cd4,0x3d260550,0x3d3d1e6e,0x3d55e653,0x3d64009f,0x3d90b71c,0x3cefb465,0x3cf857ee,0x3d02772f,0x3d19adee,0x3d484a9f,0x3d933800,0x3db116c3,0x3dabb057,0x3d9a9454,0x3d4b5a06,0x3c5d0e84,0xbb8d09dc,0xbcae46e8,0xbd12cfea,0xbd3a2d0b, +0xbd2abe26,0xbcd6b052,0xbcbab220,0xbc85579d,0xbc012758,0x3bee06a3,0x3c9ed194,0x3ced7e84,0x3ce15458,0x3cb5093a,0x3c7c046d,0x3c91d8df,0x3cc240c8,0x3cfe418a,0x3d083d5f,0x3d0465e2,0x3cec9e2a,0x3ce02d6c,0x3cdc82b2,0x3ccdcde6,0x3cffc589,0x3d1b4a92,0x3d22a373,0x3d17f6d9,0x3d098a56, +0x3cdcf545,0x3cf00701,0x3cf5e4b4,0x3d0880ef,0x3d265763,0x3d59516d,0x3d8bf163,0x3d88efc1,0x3d847e77,0x3d815e13,0x3d6e2b35,0x3d57329b,0x3d3f84e3,0x3d31ee5e,0x3d29eed2,0x3d1d58b3,0x3d08bddb,0x3cef26a8,0x3cd0efcd,0x3cd78b37,0x3ceff244,0x3ce8e0d3,0x3d0239c8,0x3cf91437,0x3d006b48, +0x3cdfdc0e,0x3cda829f,0x3cc5ecaf,0x3cf52760,0x3d13da94,0x3d2b2732,0x3d1e1e82,0x3c3a8627,0x3c64ff16,0x3c6508e4,0x3c69dc16,0x3c7c2aba,0x3c88b1ac,0x3c966559,0x3c9d1a7d,0x3cb84bb5,0x3cbc39b4,0x3cc5dc6a,0x3cd08db6,0x3cec6ece,0x3d044ad9,0x3d0eb346,0x3d19c21d,0x3d212fb9,0x3d2b39dc, +0x3d2e4233,0x3d3a806f,0x3d374c80,0x3d26278d,0x3d15cd4a,0x3d002a63,0x3cd91f46,0x3cb54d6e,0x3ca50883,0x3c95eb24,0x3c8eb01e,0x3c87ce37,0x3c83da3c,0x3c656b0d,0x3c65bd5d,0x3c4addda,0x3c564bbd,0x3c6808bf,0x3c149064,0x3c565702,0x3c5515a0,0x3c6015b4,0x3c659b97,0x3c5f4f29,0x3c576c5a, +0x3c485691,0x3c5d53ce,0x3c756dd2,0x3c8636a3,0x3c98acb0,0x3ca51dfb,0x3cb1d1a5,0x3cabfaec,0x3caa0e60,0x3caa2dcd,0x3ca87c47,0x3ca7e278,0x3ca9ce9e,0x3c9385ad,0x3c7e9618,0x3c5654a0,0x3c78d66b,0x3c464a8f,0x3c02aaf5,0x3c0990fc,0x3c096c07,0x3c00f5c5,0x3bf8bb41,0x3beb7c19,0x3be671e1, +0x3c08b0ad,0x3c31cd8f,0x3bb978bb,0x3befe12b,0x3c5866e9,0x3b8698c0,0x3b51bd34,0x3939e2f1,0x3b3a42db,0x3b689580,0x3baaaf6b,0x3b86fef8,0x3b662106,0x3b5f0dbf,0x3abc1d8c,0x3a2e9e98,0xbaef0ea1,0x3b4b62c6,0x3b96f002,0x3bcf80ad,0x3b5ffb91,0x3b3bce89,0x3b532a09,0x3b74f304,0x3b85eb20, +0x3b92d6b0,0x3bb958e6,0x3bdaf29c,0x3c1a92fe,0x3bbe9d47,0x3b9f18d2,0x3b665c30,0x3b6fcb20,0x3b72b1c6,0x3b8693c0,0x3bba54db,0x3bc821f5,0x3b92bc8c,0x3bb7527a,0x3bab51ac,0x3b1b18ef,0x3b839948,0x3c0b05ea,0xbab2a2ec,0x3ab36f76,0x3b64a45b,0x3be2d15b,0x3bc7bbd7,0x3baf9e16,0x3b9f1f64, +0xbb1121bc,0xbbca2c8e,0xbc3788b5,0xba27c20f,0x3ba5b34e,0x3c283039,0x3b3d62f1,0x3a57d3bc,0x3b291fbb,0x3b4fbc8d,0x3ba0ecb9,0x3bb28697,0x3bf1f35e,0x3c367f7a,0x3c7c74f3,0x3c3124d1,0x3c00e89c,0x3b2fc3c7,0x3a9bd67d,0x3a93f114,0x3b5290d2,0x3be5ab1a,0x3c012b86,0x3ba7073c,0x3bff5ed3, +0x3bdea606,0x3aa52d56,0x3bf2eaad,0x3b00d67c,0xbc1b967c,0xbaa0b8f4,0x3b87ec07,0x3c428313,0x3c062c57,0x3bddfb49,0x3b06f18e,0xbc21d961,0xbc721328,0xbcd4cca5,0xba0dbe77,0x3c052346,0x3c89a980,0x3b0246c6,0xbb015b66,0x3a997c2a,0x3b4087b6,0x3bd8f268,0x3bb343c0,0x3c340a7c,0x3c99feea, +0x3ce53695,0x3c9a6c4a,0x3c312a2d,0x3a210cf2,0xbb272be6,0xbac5dd33,0xb9cb06a1,0x3c1b8eea,0x3c385bbc,0x3b3d2389,0x3c5d1b99,0x3c62b29f,0xbbe8099d,0x3b685563,0x3cbad73d,0xbc07746c,0xbb100962,0x3bee67b8,0x3c80d319,0x3c906577,0x3c69958c,0x3c37bcef,0xbc168faf,0xbcde4106,0xbd43517f, +0xbc85d586,0x3bef38af,0x3cc56dfe,0x3ae32cd7,0xbbcc0081,0xbb19b069,0xba28ca4c,0x3b9c4f8d,0x3b8414ce,0x3c26b41e,0x3cbe5272,0x3d1ac8ea,0x3d067956,0x3cd2f89b,0x3bce0372,0xbb82a0ff,0xbc43ea20,0xbc20a302,0x3c7535b5,0x3cceb73e,0x3c34f712,0x3cc8747e,0x3c35c822,0xbc60e7c4,0x3c9b8419, +0xbdac458d,0xbcb46624,0xbb93714d,0x3ad4caad,0xbca14c19,0xbca4aed9,0xbcdeada6,0xbcef5967,0xbd8bfcad,0xbd4a51c1,0x3d058081,0x3cc12a57,0x3ca6a6cb,0x3c74379a,0xbbb90c31,0xbbdfc82e,0x3c07bb83,0x3c68e19c,0x3c8953c2,0x3c81fb65,0x3c826ab0,0x3cd34959,0x3d401a71,0x3cda2723,0x3c70ab3f, +0x3b24da56,0x3bb2128b,0xba8125a5,0xbc48aa8b,0xbc8c5dfd,0xbc37ca93,0x3b090c7d,0x3c2695a3,0x3cade819,0x3d2f59f7,0xbd713b0c,0x3d07b66a,0xbbeaba54,0xbc89e249,0xbcbc4cfc,0xbd10a41a,0xbb734818,0xba0354ce,0xbcef9f5f,0xbc32d6c7,0xbbda75bf,0xbbc4589c,0xbb5adf43,0xbaee1d59,0xbc7ce151, +0xbc2a204e,0xbc56d23d,0xbc9c09d9,0xbc668eb1,0xbb39caa6,0x3b3ee54e,0x3c8ff976,0x3c4a69fb,0xbc77fa38,0xbbb4423a,0xba034194,0xbb31553b,0x3a90ae28,0xbb1a2a15,0xbc4eb7b8,0xbc2102d8,0xbc930715,0xbcb75bc2,0xbd33e7fc,0xbd4c82cb,0xbd2a1ea5,0x3c9d7e07,0xbd5f2f8c,0xbca2c8e3,0x3d267f84, +0x3d4fae05,0x3bcf1fa9,0x3a8c3c8f,0xbc9f115a,0xbd8565c2,0xbd41f4e4,0xbd3c8259,0xbd2fa8c8,0xbc80c62b,0xbc29afa6,0xbcc06e9f,0xbd0d6666,0xbd1d9525,0xbcef58f3,0xbcce1c22,0xbc6b79a1,0xbbf5bc16,0x3c808f0b,0x3c6b7243,0xbcb5b909,0xbb185292,0x3c3abb11,0x3b0d89ea,0x3adab254,0x3a9d8c5f, +0x3b069c93,0x3af969e8,0xbc006e0b,0xbbe024be,0x3a922ec8,0xbc8550d3,0xbd1c2eda,0xbd572398,0x3ccb3caf,0xbd564f4d,0xbe1b8f09,0xbe2b5e94,0xbe136508,0xbd67cef6,0xbcbe3f3e,0xbd5e17f4,0xbcb1e735,0xbc7e3973,0xbc895335,0xbc90b524,0xbc90eaae,0xbc952962,0xbc831bb7,0xbc96340d,0xbc95a936, +0xbcc86077,0xbc67859e,0x3a8b5ea0,0x3c5765fe,0x3c357399,0xbc8eaf30,0xbc3f1a8e,0xbc3c52ce,0xbc65a7b1,0xbb5d461f,0xbb87d2ab,0xbc66151c,0xbc1aa809,0xbc1b8bfa,0xbccf322e,0xbc87b07c,0xbb6e74ce,0x3d173638,0x3d25ea58,0x3e03a509,0x3e20a699,0x3e0f7f01,0x3dcd589b,0x3d2c974b,0xbd157f09, +0xbdaccc1d,0xbdbf1a1f,0xbd794a08,0xbd27b65f,0xbcbd65f4,0xbce21870,0xbc9996af,0x39c5f971,0xbc1d557a,0xbc7f2c4e,0xbc9835bd,0xbc983f16,0xbc7f8eb0,0xbc903490,0xbc3b53c1,0xbbd6f0c1,0xbc320c22,0x3b79a9fe,0x3c01b600,0x3c26bdbd,0x3b8c9cf4,0x3a791730,0x3b8183e3,0x3c8d2066,0x3d052bd1, +0x3d50e146,0x3d9b2f89,0x3dace5a7,0x3da1277f,0x3dda731f,0x3d427899,0x3d5287ac,0x3d8e7212,0x3db11e57,0x3dda57b2,0x3df2c3a9,0x3dd1e1b3,0x3d64039a,0x3b8da343,0xbd0df563,0xbd5d7ab6,0xbda7cdac,0xbdb1a455,0xbd964acc,0xbd7b4d4b,0xbd465025,0xbd12bee9,0xbcd7e12a,0xbc7d0855,0xbb8ae9b1, +0x3c2c1321,0x3c507384,0x3b59cb51,0xbb38a6ea,0xba8b4d22,0x3c2b6327,0x3ce2514c,0x3d19cf93,0x3d1c729e,0x3d2646f4,0x3d25e778,0x3d12c740,0x3d2dc46d,0x3d3c9efe,0x3d2ed921,0x3d4f626c,0x3d33c663,0x3d54552f,0x3d7eb1c9,0x3d8a5933,0x3d9437ac,0x3d96d8e8,0x3da2f74c,0x3dbd42cf,0x3db25338, +0x3da8b8e0,0x3da047c7,0x3d8b795e,0x3d67c459,0x3d2f9cc7,0x3d118dac,0x3ce3d6e3,0x3c9ebdfb,0x3cad9c08,0x3ca6422d,0x3cc3786a,0x3ce70c99,0x3cc389e1,0x3cd01827,0x3cd6d5df,0x3cd56363,0x3cc60978,0x3cace318,0x3ca54a25,0x3c944db5,0x3c9588a0,0x3c87ca7f,0x3c861961,0x3cb8c479,0x3ce21a6d, +0x3d05b64c,0x3d1e199b,0x3d02dd89,0x3d389e1b,0x3d3dc1ee,0x3d4416de,0x3d537d86,0x3d6054e4,0x3d671ac0,0x3d6cb400,0x3d56aa2d,0x3d4a6c77,0x3d3e02ad,0x3d38ca96,0x3d367abe,0x3d361074,0x3d25b7ae,0x3d16525c,0x3d03ce5e,0x3ce95d57,0x3cbf9cb2,0x3c9712ce,0x3cbdb887,0x3cd1cb2d,0x3ce32219, +0x3ce119ee,0x3cf2bc3c,0x3d0633eb,0x3d0db48e,0x3d1369d4,0x3d14dd97,0x3d1c6d18,0x3d286810,0x3d1f70cb,0x3d24bab9,0x3d1ab643,0x3d1a0033,0x3d2d5e92,0x3d1e3277,0x3d3b8b54,0x3d35d8d4,0x3d3af3e2,0x3d3adaa3,0x3d3cd253,0x3d3f59b7,0x3d457cef,0x3d4490e7,0x3d44e6b2,0x3d43d1fc,0x3d41d75e, +0x3d3f2f4e,0x3d3f92a6,0x3d35c116,0x3d2e8cb1,0x3d27e24d,0x3d1dae2d,0x3d16cbd7,0x3d0a3598,0x3d02dc23,0x3cfa7287,0x3cdf2bde,0x3d1100e9,0x3d06530e,0x3ceb40a8,0x3ce93f71,0x3ce8088d,0x3ce9fcd3,0x3ce7181f,0x3ce42d38,0x3ce9e075,0x3d0f6946,0x3d270a2f,0x3ce56427,0x3d0e1b3d,0x3d428da5, +0x3bc9f54f,0x3b67deff,0x3b12c49b,0x3b529652,0x3b83fa39,0x3b82ef5e,0x3bdc681b,0x3be392d7,0x3bb49898,0x3b8e92d6,0x3b544b0d,0x3b02d235,0x3b1fe420,0x3b730153,0x3c024348,0x3bba3ff0,0x3bbd2c1e,0x3bd28cb4,0x3be4b8b6,0x3bf0863b,0x3bfb4123,0x3c0440c8,0x3c000160,0x3bf82c79,0x3bd6fb9d, +0x3baab238,0x3b62c150,0x3b686756,0x3b7d61e2,0x3bc32286,0x3b97d629,0x3b8a671e,0x3b7988e8,0x3b96f732,0x3bc11ed3,0x3ba76514,0x3b922340,0x3b25a8e4,0x38023b55,0x3a35aa5a,0x3aa00149,0x39f6a712,0x3c053af7,0x3c139ba1,0x3b96f77c,0x3aecff66,0xbb1093fa,0xbb8b8295,0xbbbb5390,0xbb0525cb, +0x3c220b51,0x3bad0980,0x3bc9dbff,0x3c05430e,0x3c251563,0x3c405789,0x3c3c8748,0x3c589029,0x3c6bb36e,0x3c6639ba,0x3c2b091a,0x3bf8cd53,0x3b933b7b,0x3b801259,0x3b9ded0d,0x3c1735e2,0x3bf192b7,0x3bdd69f3,0x3bc3ca2b,0x3b8793ff,0x3baba971,0x3c293f8d,0x3bec958a,0xbb47246a,0xbc5163fa, +0xbbfb10be,0xbba1021d,0xbb977006,0x3c5a1549,0x3c79f41d,0x3ba44b81,0x38fb2839,0xbc065dfe,0xbc6b893f,0xbc64b5d8,0xbbed5ab8,0x3c8c387e,0x3bbdcbe8,0x3bd22c88,0x3c2038e1,0x3c5b74d9,0x3c8786e6,0x3c7f15a4,0x3cb1b0b5,0x3cc2b3be,0x3cc36e79,0x3c8317d9,0x3c1a4a9b,0x3b64aaec,0x3a9d4596, +0x3baeeecf,0x3c49143d,0x3c1451dd,0x3bc5c87f,0x3bb104c9,0x3b917184,0x3bf31329,0x3c4d05bf,0x3bac6c4d,0x3afce978,0xbc6ce469,0xbc58941f,0xbc44098a,0xbc742f8c,0x3c425ba5,0x3c83f511,0x3b37826d,0xba06bb9b,0xbc943b08,0xbcf594da,0xbd105f20,0xbc97acbb,0x3c9843a7,0x3bae7526,0x3bb2bc38, +0x3c30119c,0x3c9253b5,0x3cbebf04,0x3ca67d2c,0x3cd9e8da,0x3cf4aaae,0x3d165ad6,0x3cdd31d9,0x3c948c7c,0x3bb2daa7,0xbb5f21dd,0xbbcbf69c,0x3b8dff51,0x3c568a7a,0x3c64223b,0x3bc4c8c2,0x3bcc26c0,0x3b6821bc,0x3c7275c3,0x3c5853dd,0xbd4fe188,0xbc6420f8,0xbc55cc3a,0x3a80bcdb,0x3c304a18, +0x3cf0aa66,0x3cc32e67,0x3c1389d7,0xbcf178e2,0xbccf837d,0x3d0c41ac,0x3c136527,0x3b7d5ba7,0x3c8a2857,0x3c05da65,0x3be0ed3a,0x3bd1601b,0x3c2b47d0,0x3c555c68,0x3c460fd0,0x3cda600d,0x3d08a43f,0x3d15c5d6,0x3cb392af,0x3c2e0e42,0xbaf1cc1d,0x3ba3bc3b,0x3b930241,0xbc064c68,0xbb58a1b6, +0x3acdc1f8,0x3b8ff166,0x3cb45c63,0x3ccbe61e,0x3ccda9b7,0xbd2aad46,0x3c805f1c,0x3ce35fa6,0x3cab6038,0xbc326da0,0xbd84e014,0xbd6075a2,0xbd27c096,0xbca2a769,0xbcc08114,0xbcc1a803,0xbca20489,0xbccaa720,0xbc99e8ef,0xbb831f1f,0xbc0bcf3f,0xbc15720e,0xba8de8a5,0x3b983dca,0x3c5f91c0, +0x3cb86761,0x3c533540,0x3c066b87,0xba72958e,0x3ba3b770,0x3c33fc7d,0x3bb68c04,0x3a921678,0xbb86d1a8,0xbb93645b,0xbbb6cafb,0xbc54dddb,0xbc7fd3a9,0xbce0f29a,0xbcedd64d,0xbca2dbff,0x3bd72f82,0x3b45b734,0x3ce430a4,0x3c81b47a,0x3c4da419,0x3cde3425,0x3cf40fe0,0x3ca265ac,0xbb6f304a, +0xbcedd0cf,0xbcfe53ba,0xbc8eace3,0xbc41763d,0xbbebd492,0xbb381c70,0x3b2338ff,0x3b9d990c,0x3c01eab5,0xbb27898f,0x3abd2075,0x3c876127,0x3bf3e874,0x3bffbcf0,0xba10faf9,0xb9a27b28,0x3b7c3b11,0x3b3e6b9b,0x3a2a57b3,0xb9a6c095,0x3affeae6,0xbb95be54,0xbc80c00a,0xbcb56510,0xbc293402, +0xbc9976fa,0xbd0c860a,0xbc7e4193,0xbdb9ca1e,0xbe061fbe,0xbe169970,0xbdff0af0,0xbd72e269,0xbd840ac4,0xbd4f20e8,0xbc62388e,0xbcee637b,0xbca27b69,0xbb87daaa,0xbc176094,0xbc229b67,0xbc4b27c1,0xbc69e832,0xbc6103bd,0xbc1b82d7,0x3a29c1a0,0x3c204f7c,0x3cd9bf00,0xb95537bc,0xbbfc5597, +0xbbc940ff,0xbb62a7a1,0xba4bb8f5,0xbad0cc97,0x3b50f8b4,0xb9a85099,0xbc0483f4,0xbc8147e6,0xbcb73c29,0xbd1236f0,0xbd13b96e,0xbd372503,0xbd41385b,0xbd76e0cf,0x3de6513a,0x3dbda0a9,0x3d50adda,0x3af8eba8,0xbd7bac80,0xbda942b6,0xbd93fd76,0xbd192ee0,0xbd213ff0,0xbd1f5e5f,0xbd2b71b2, +0xbd106408,0xbd00a6ef,0xbd0ee2b7,0xbcae7cad,0xbc1c2420,0xbb40b19b,0xbc1ea1e9,0xbbbc743a,0x3bfd41a7,0x3c039949,0x3c0a57bc,0xbbf057c2,0x3ac7cbc9,0x3a96371a,0xbbf535e6,0xbb841d62,0x3a066796,0x3c26fdcd,0x3c1a2d83,0x3c9d057c,0x3cf0337b,0x3d95b68d,0x3dc06b6f,0x3dbb5da1,0x3dce77e7, +0x3d94ea7f,0x3d97455c,0x3d9bcee1,0x3d8d1f35,0x3d673eee,0x3ccb621a,0xbc9056e1,0xbd801463,0xbd879815,0xbd7cb011,0xbd5df08e,0xbd407b7a,0xbd2c1391,0xbd090eb9,0xbd3a563a,0xbd3f7c97,0xbd22a197,0xbd13e550,0xbced7f03,0xbc824180,0xbc1e1810,0xbbc12a27,0xbb145793,0x3bb51266,0x3c5d46d8, +0x3ccb6050,0x3ce0dbe1,0x3d067cc2,0x3d2e72d7,0x3d3717db,0x3d487403,0x3d5a71e0,0x3d46be42,0x3d483360,0x3d643782,0x3d898daa,0x3d771c07,0x3d895bc5,0x3d9c905f,0x3dae5052,0x3dc9c6fd,0x3dba775f,0x3db8962d,0x3db4183c,0x3d7c5258,0x3d049a97,0x3b55ffbf,0x3a8b1e25,0xbb4a8b24,0xbbc8f014, +0xbbc6c09d,0xbbcba6b9,0xbc186331,0xbbf3c978,0xbbc78f8d,0xbbad6127,0x3b1befb1,0x3c1617f2,0x3c82939c,0x3ca51eb8,0x3cc68bd7,0x3ce4c6db,0x3cdd4d21,0x3ceca27f,0x3ce12950,0x3d0ab4b5,0x3d115ab3,0x3d27da5e,0x3d3a2c97,0x3d42c2e1,0x3d48d9bf,0x3d641649,0x3d848f14,0x3d89a68e,0x3d841de1, +0x3d7f0bbe,0x3d74e293,0x3d6d3cf7,0x3d616d95,0x3d5f7aac,0x3d5646a6,0x3d5f8131,0x3d5b296e,0x3d56b713,0x3d49e480,0x3d3c0a27,0x3d2f0c4a,0x3d2157e0,0x3d161f8b,0x3d0a0924,0x3cf7c66b,0x3cd8e4dc,0x3cf987d1,0x3d027494,0x3d0c230c,0x3d1291a8,0x3d1d4ea6,0x3d28991b,0x3d385f68,0x3d45e645, +0x3d4e194e,0x3d59939a,0x3d6293c1,0x3d67ea16,0x3d6df1a8,0x3d74523c,0x3d7b8d7d,0x3d833fe0,0x3d656b32,0x3d6d1719,0x3d676fe6,0x3d655b6b,0x3d61d9ae,0x3d635064,0x3d63de28,0x3d630c81,0x3d60a186,0x3d5b4cb8,0x3d58c0ff,0x3d510a8c,0x3d4c27c2,0x3d48ae3d,0x3d43d417,0x3d3f4d1b,0x3d3a68e0, +0x3d348548,0x3d300550,0x3d27c781,0x3d2f9693,0x3d30305b,0x3d2e12c3,0x3d3aac96,0x3d3b0c38,0x3d35bf0e,0x3d37b6f9,0x3d3a6bb0,0x3d3faa01,0x3d424896,0x3d470bdc,0x3d4b7ac2,0x3d56bc6f,0x3d5f4a98,0x3d56d2ac,0x3d5fe2be,0x3d7023a7,0x3c129b9e,0x3be1f6ab,0x3bc61187,0x3bd2e9ac,0x3beb0864, +0x3be4b2ec,0x3c1b5267,0x3c1b7216,0x3be6c25a,0x3c052cc9,0x3be07183,0x3b4a6f8c,0x3b76ae77,0x3b95c394,0x3be85331,0x3bfe6c5e,0x3c0acd7b,0x3c0dc834,0x3c16c139,0x3c1ef449,0x3c2d35f3,0x3c2ca0d6,0x3c24e262,0x3c113d87,0x3c0c77c0,0x3bf913c4,0x3bbfdf75,0x3bd95f88,0x3bf14234,0x3c251591, +0x3bec18e0,0x3bd8d3ce,0x3c004534,0x3bdee375,0x3c082606,0x3c431468,0x3c033d56,0x3bf01cff,0x3bced6f2,0x3bdfbe10,0x3bc6fe62,0x3b6827af,0x3c1bd971,0x3c2ea8cf,0x3b9f89fd,0x3c130a7a,0x3ba4cb55,0xbb9d368d,0xbbaaa5e8,0xbb6038cb,0x3b91f59c,0x3bf0fafe,0x3c2637ea,0x3c2e28d4,0x3c463ea2, +0x3c5f34bb,0x3c6ed6e9,0x3c822733,0x3c86ab1f,0x3c589ff5,0x3c38e6b6,0x3c135554,0x3bccfbc4,0x3be93c3d,0x3c0e0add,0x3c741f0a,0x3c183a03,0x3c049358,0x3c2f2832,0x3baa4d4a,0x3c05833b,0x3cb4f8c9,0x3c4ab391,0x3b90c825,0xbaa89ea6,0x3b10349b,0x3b901a45,0x3b0c7112,0x3c71d2d2,0x3c842107, +0x3ae2b9ac,0x3c3f55a5,0x3b3b9115,0xbc9a24ea,0xbc9162e3,0xbc5cc41d,0x3b1643e7,0x3bcd1519,0x3c2f1a87,0x3c47ab59,0x3c73de4c,0x3c97be19,0x3cabbe8d,0x3ccf3164,0x3ccfa69a,0x3ca1619e,0x3c797fd8,0x3c25f847,0x3bacc838,0x3b9a5f61,0x3c1ebc5a,0x3cb659e0,0x3c1b7458,0x3bde57f3,0x3c6c324e, +0x3b836e8f,0x3c02387d,0x3d0e373e,0x3c503418,0x3c2b4f1a,0x3b903046,0x3bed9bdb,0x3a935a49,0xbc288431,0x3c128cfc,0x3c49909c,0xbb9e4ae7,0x3c561870,0x3a3ee6d3,0xbd0e2295,0xbd1abf22,0xbcfb1a21,0xbb97b3b7,0x3ba4c551,0x3c5baf8f,0x3c857fde,0x3c9ec4a2,0x3ccab5b4,0x3cd840ab,0x3d060c70, +0x3d0dc137,0x3cfa671d,0x3cbf352e,0x3c6c617f,0x3bb1d8cc,0xbb05fec4,0x3b5f71b6,0x3cc00a19,0x3c5498ca,0x3c0f855e,0x3c6451e4,0xbb50dde4,0x3bdd1acc,0x3d4e705b,0x3cba8471,0xbcd731d7,0xbc90145d,0xbb9c8957,0x3c8aaeea,0x3d1778fc,0x3d05c05f,0x3cde3535,0x3cee4346,0x3a786ea8,0xbc0a71eb, +0xbbb378f3,0x3ada6553,0x3b8a36f1,0x3c2147bf,0x3b213317,0x39d2bb1e,0x3b9c153c,0x3c4e479b,0x3cadcaef,0x3cbe032b,0x3d22d9ec,0x3d2ac157,0x3ce4637c,0x3cad1674,0x3c6c6aaf,0x3b9764b0,0x3c0dacb2,0x3be0c542,0xbb61f39e,0xb8b516aa,0x3c1767e9,0x3cbc0092,0x3cf5d54d,0x3c9a33ba,0xbb739d93, +0xbca6719b,0x3bbe9991,0x3da40c0e,0x3cb02e2b,0xbca1a747,0xbd03fd86,0xbd97073e,0xbd799178,0x3c0bffdf,0x3a912cf8,0x3c0f8430,0x3c4fd3d0,0xbad5febe,0xbc2c792b,0xbc33f8ba,0xbc39486f,0xbbed9653,0x3ad0a33d,0x3bcc6169,0x3c37d5c3,0x3ca7d71a,0x3b9c77b9,0x3b6d3b8a,0x3c36632f,0x3c1dcbb6, +0x3c2e6658,0x3b977138,0xbaf817b3,0xbbaa1167,0xbad5574d,0x3a551c4a,0xbb9e150b,0xbc51f3c5,0xbc570961,0xbc2d8023,0xbbffa933,0xbc86da87,0x3c2501d1,0xba0f6be1,0xbc125818,0xbb1e2bcb,0xbb240a21,0x3d063185,0x3d1c5646,0x3c40f6bf,0x3bbc4af3,0xbb5ff87d,0xbc3e9f15,0xbc8a4fb7,0xbc2e1bbf, +0x3b685c85,0x3ad03361,0x3b35e338,0x3c06298d,0x3c385024,0x3c9d6310,0x3d301b78,0x3c439152,0x3bd73ac0,0x3c83845f,0x3c31522b,0x3bde7dd4,0x3ba5d674,0x3bb8ab1d,0x3a644464,0x3a2efd28,0xbc0d88d9,0xbc6d4dcc,0xbc877903,0xbc6cdfa2,0xbccb2c82,0xbd1f7547,0xb8d48c87,0xbdc2b834,0xbd63313c, +0x3b697638,0x3baa4c39,0xbd3a93ef,0xbd1b0e4b,0xbd118644,0xbd18d479,0xbc207fe8,0x395286f4,0xbad3223a,0xbc77b7cf,0xbcb40281,0xbc9c0370,0xbcbcc16d,0xbc6a1e87,0xbc08dbf2,0x3b519b63,0x3c24fc2a,0x3cb4e3f4,0x3b0443bd,0xbba63b8d,0xbaf8a064,0xb9b6969e,0x3b88f912,0x3b8bed5f,0x3a18cfad, +0xba50572c,0x3a114ff4,0xbbf15c9a,0xbc59b402,0xbc85a58c,0xbc7e2020,0xbd16b63b,0xbd9015ef,0xbdb2de88,0xb9bb523f,0xbd806e28,0xbde25c02,0xbdd6b821,0xbda9a159,0xbd119520,0xbc585280,0xbca47fab,0xbc9677c3,0xbc8a4c98,0xbbced91a,0xbc848dd0,0xbc904982,0xbc0fd906,0xbc98fee1,0xbca0e8b3, +0xbc829909,0xbb2ff782,0x3bb1a6d0,0x3c4f2896,0xbb727649,0xbb15950c,0x3c2a9f09,0x3bde7be7,0x3b42858c,0xbb994600,0x3b5becfe,0x3babd999,0xbacc6368,0xbbfde5d8,0xbc198210,0xbc1e7003,0x3c09e315,0x3cd033de,0x3d2552ad,0x3c8a1b89,0x3dd15eda,0x3dc968eb,0x3da1a3db,0x3d31d820,0xbb23b276, +0xbd5c33c2,0xbd99189d,0xbd902638,0xbd592b77,0xbd263b7c,0xbd126c29,0xbcc33f0c,0xbca3c7d8,0xbc963aa2,0xbc9f0e21,0xbca717b9,0xbc82fc6d,0xbca49ab5,0xbc937bb5,0xbc3131d2,0xbc8c0c4d,0xbc675b0d,0xbc183a82,0x3bb44cae,0x3c9678c4,0x3ce818f7,0x3ce9c063,0x3cf550a3,0x3d09c735,0x3d4df316, +0x3d7c086c,0x3d914661,0x3d7ade2c,0x3d808b7a,0x3da67f57,0x3db5d74d,0x3d5a8532,0x3d59cfc7,0x3d367433,0x3d2801bc,0x3d282f8f,0x3cdce2ab,0x3c236f41,0xbc40d577,0xbccce89d,0xbd1da8b1,0xbd5ee748,0xbd473599,0xbd3721a9,0xbd2a23b3,0xbd128e07,0xbcfaae2a,0xbcccde65,0xbc907af8,0xbc3c5b56, +0xbb533a5a,0x3b84107c,0x3c0859af,0x3c367167,0x3c55dca1,0x3c70ba89,0x3c80801c,0x3ccc2c4f,0x3d054e20,0x3d2ab81c,0x3d3bf34f,0x3d507556,0x3d6afc11,0x3d6c9b7a,0x3d6e79f8,0x3d6af5a4,0x3d6776e2,0x3d641e25,0x3d3b7cbb,0x3d3032c1,0x3d23f9b6,0x3d11bd23,0x3d02e1c5,0x3cf9a351,0x3cf17cbc, +0x3ce1bb42,0x3ccf92b1,0x3cb5f15c,0x3c92786c,0x3c52d689,0x3c118098,0x3c031102,0x3bdcd402,0x3b9a3bdd,0x3b466fe6,0x3a3a5b6a,0xbaee6b2d,0x3c20c51f,0x3c0d9c2a,0x3c608537,0x3c9e4691,0x3cd8ab40,0x3cee8f19,0x3d052126,0x3d12784f,0x3d26bcad,0x3d2f906f,0x3d3da5d5,0x3d530b75,0x3d4f7dd5, +0x3d5316aa,0x3d510336,0x3d43fbea,0x3d3ca02b,0x3d1d90a7,0x3d21c29e,0x3d1d4c27,0x3d1b8068,0x3d1bbe5e,0x3d19668c,0x3d178f1d,0x3d0ef1bd,0x3d0851cc,0x3d03cbbd,0x3cf8e86f,0x3cecf37a,0x3cda8330,0x3cdb4e5a,0x3cd92180,0x3cd9a3a9,0x3cd81f5e,0x3cdc7f3d,0x3cc722e6,0x3d053d2f,0x3d17404d, +0x3d34dc61,0x3d0f7e3b,0x3d25ed52,0x3d455423,0x3d496ef2,0x3d4c67ae,0x3d4e6439,0x3d54f168,0x3d5958b0,0x3d5f1b70,0x3d4cb38c,0x3d375028,0x3d5ffa40,0x3d4bef8c,0x3d393429,0x3c3763f7,0x3c27b9d9,0x3c22e293,0x3c1e2a66,0x3c241bb8,0x3c16516c,0x3c3b6b87,0x3c3ae02a,0x3c11c37e,0x3c2fb871, +0x3c1fadad,0x3bcb77b0,0x3bd2dfc5,0x3bd4a66c,0x3bdccdda,0x3c16e0a1,0x3c288e15,0x3c2c7d1d,0x3c3679ae,0x3c408c40,0x3c55c5f0,0x3c4a3ea8,0x3c3fc88a,0x3c27392b,0x3c24f265,0x3c1d4323,0x3c10c31a,0x3c185115,0x3c211b96,0x3c3d73ae,0x3c1d4094,0x3c1998e1,0x3c2cbf68,0x3c1651e9,0x3c2100eb, +0x3c724f77,0x3c32693c,0x3c66b5a5,0x3c56de3a,0x3c2e28c6,0x3c090066,0x3bcbbc54,0x3c3d5456,0x3c51bd28,0x3bda0030,0x3c4ff6cd,0x3c207b74,0xb9e9e454,0xbaa20bd6,0xbad5cbba,0x39ad5b80,0x3bfc6390,0x3c3e95c9,0x3c4bc485,0x3c699d51,0x3c83d963,0x3c9d8466,0x3c949ef9,0x3c8aa681,0x3c55c25f, +0x3c3fe58e,0x3c2d1cff,0x3c179c4c,0x3c2c2a36,0x3c40ab5a,0x3c753890,0x3c468fd1,0x3c2ea236,0x3c478af2,0x3bf0b840,0x3c3243d1,0x3ccc894d,0x3c8fd60a,0x3c6014a9,0x3c1c89bd,0x3c2778bd,0x3c3dd58a,0x3bdf0a3c,0x3c8be065,0x3c86220d,0x3b858be0,0x3c7dc8a0,0x3c1788bd,0xbc0da66f,0xbc3b7948, +0xbc40fda6,0xbc07afaf,0x3b953c53,0x3c44232c,0x3c585e81,0x3c88e350,0x3ca8a4be,0x3cd847f3,0x3cd219e5,0x3cc04347,0x3c718b7c,0x3c61ea37,0x3c35ec57,0x3bfa3a93,0x3c0cd51b,0x3c3a7451,0x3ca010dd,0x3c36c39a,0x3c24c4a4,0x3c82c06b,0x3bc210ee,0x3c1b308f,0x3d12db5e,0x3c938073,0x3ccd4b5e, +0x3c9720b2,0x3c609b6c,0x3b4c64b4,0xbbbf76a2,0x3c1697a4,0x3c819a92,0xbb0d87e5,0x3c8429c8,0x3c0e9502,0xbcb0b7ac,0xbce7f81f,0xbd0365a2,0xbcbf938e,0xb884ab1e,0x3c5cd5ce,0x3c8f9f4a,0x3cb647d0,0x3ce6478b,0x3d147740,0x3d15848f,0x3d08ca71,0x3cb6f9e3,0x3ca497da,0x3c852b60,0x3c1893e9, +0x3ac4c454,0x3c0c2831,0x3cf29106,0x3c65fa33,0x3c22d2d8,0x3c877540,0xbb4c993d,0x3c477e88,0x3d74e2c5,0x3d15e51b,0xbcb20cdd,0xb9eea6cb,0x3bf6349c,0x3d103d16,0x3da1dc1b,0x3d21c2f4,0x3c8ffa4e,0x3c346893,0x3cb4e425,0x3c871fd2,0xbc60df03,0x3c857c90,0x3c95f62e,0x3b6a43e4,0x3b91a1cc, +0x3b5aa262,0x3b9c8010,0x3bc01638,0x3c659738,0x3ced7e06,0x3d00ea85,0x3cf38fa8,0x3cc1a242,0x3cbc68d7,0x3ca77202,0x3c155387,0x3c2ee800,0x3bc24052,0xbbb658c0,0x3ad30ab5,0x3c914f13,0x3d0a8d2d,0x3d0fe9c2,0x3c54f720,0xbcd331ae,0xbcf2a118,0x3c44f7b3,0x3d91a451,0xbb108be7,0xbd114f6e, +0xbd176ec9,0xbd3099d1,0xbca7093f,0x3cf84b3c,0x3c4ed94c,0x3c1ef2c7,0x3cb29cae,0x3c954ae9,0x3c352e1c,0x3beca3ca,0xba375010,0xbb2375d6,0xba6548ce,0x3bf23351,0x3c33adbc,0x3c916df1,0x3c4a7a5f,0x3c567382,0x3c909bef,0x3c566cea,0x3c0e7bf7,0x3c17824c,0x3b00f13f,0x38d0c5fd,0x3b9e4348, +0x3c1f31fa,0x3b7c5f17,0xbb9a9f69,0xbc11104f,0xbbe1afcc,0x3bfc00aa,0xbc201edc,0xbc16eeb7,0xbc233ced,0xbc524515,0xbb657b4a,0x3ae61d3f,0x3c94cbf6,0x3c97e41a,0x3cb987a1,0x3c793d6c,0x3c0b6751,0x3be532d4,0xbc54797c,0xbc4e5f6b,0x3b589e29,0x3b2775ec,0x3bbc3727,0x3bdc2ca5,0x3c8b3e83, +0x3c9d54be,0x3cd32053,0x3c3b3501,0x3baee2ed,0x3c865a25,0x3c72f8d0,0x3bfeb8f8,0x3b0f32d6,0x3bf1c0f6,0x3b488733,0xbac11f7a,0xbc2763f5,0xbc390c08,0xbbd7b561,0xbcd10534,0xbcebad77,0xbcc5c743,0xbc30137d,0xbd047138,0x3c6d85d4,0x3c48d3b1,0xba2f6095,0xbc856bb4,0xbd046402,0xbd07b348, +0xbca713a3,0xbca02279,0xbc803f96,0xba218f39,0xbc36149d,0xbc31d2b0,0x3b879990,0x3c075d8e,0x3c139edf,0x3b933379,0x3c53342c,0x3c638bc1,0x3c27045e,0x3c53e537,0x3c4fe9bc,0x3c2bb3a6,0x3c17571f,0x3c18c7cf,0x3c223d8c,0x3abd06a4,0xb99eb0b3,0x3bb4302a,0x3b719e7c,0xbb29b7de,0x3aea2508, +0xbc05fac3,0xbcd1c8d1,0xbd2c2073,0xbd4f039d,0xbda10ac6,0xbdfeabbc,0xbdded8ef,0xbdacc1ec,0xbd39b8c0,0xbd12eadb,0xbcd05bcb,0xbc55b4fd,0xbb6d4226,0xbb1b181d,0xbc6e23dd,0xbc0b24f0,0xbc454b2b,0xbc846d6f,0xbc3e7b01,0xbbf1ab97,0xbb3deb0d,0x3c1e307e,0x3c605eec,0x3c427582,0x3b353648, +0x3b3bd443,0x3c48dbb1,0x3b8148f6,0x3b444096,0x3b982d27,0x3c0b8bfd,0x3bb2da98,0xbbf846c6,0xbca95882,0xbcd9f235,0xbcd4d392,0xbd2702e9,0xbd141bc9,0xbc88ba8b,0xbd3a0cd8,0x3d6be3fc,0x3d0715f1,0xbb7160e6,0xbcea736b,0xbd56c4c3,0xbd511504,0xbd2caa9b,0xbd0138b1,0xbcab3f13,0xbc950880, +0xbcd4f216,0xbc7a49b8,0xbc2f5eaf,0xbc2a5912,0xbc1293fe,0xbbcce616,0xbbe25980,0xbba242fb,0xbb935a9e,0xbb4dd659,0xbb7f2d5f,0xba6ee7b3,0x3bd94c8c,0x3c1fb08a,0x3c4b6615,0x3c251f0f,0x3c7823a0,0x3cb63dc0,0x3cdae611,0x3d255e1a,0x3d446076,0x3d50646b,0x3d4abb5c,0x3d434050,0x3d504654, +0x3d3d8bcd,0x3d45d12d,0x3d307c1d,0x3cbcc718,0x3c286438,0xbc0a5b9a,0xbcd25f1b,0xbd3e577b,0xbd8b5660,0xbd8142f7,0xbd73555f,0xbd68856a,0xbd5d4401,0xbd53502b,0xbd479289,0xbd406510,0xbd3a7460,0xbd33acef,0xbd18d6f5,0xbcfcfbb2,0xbcca48c7,0xbc7ead41,0xbba0edc8,0x3b8ff8bc,0x3c41d660, +0x3ca11096,0x3ce545db,0x3d04155a,0x3d0ac8af,0x3d1e099f,0x3d2667d1,0x3d3d8151,0x3d5093e3,0x3d5cbbe9,0x3d72506e,0x3d850f04,0x3d6411df,0x3cd3fa73,0x3c6d753d,0x3c309d91,0x3bde0231,0x3b7975bb,0x3a41e0c1,0xba17ea77,0xbb887971,0xbbb04b1b,0xbc14c261,0xbc3dcead,0xbc695688,0xbc880bd1, +0xbca1d776,0xbc79a520,0xbc36a5a2,0xbbf613c6,0xbb888180,0xba4de92f,0x3b00b1c3,0x3b516a42,0xb8665ea0,0xba0b0bd4,0x3ac5cb6c,0x3aab820b,0xb9f4165c,0x3b5bf59e,0x3c01ec22,0x3c61729c,0x3c8a8477,0x3c9ef855,0x3cd974c2,0x3cbf3c47,0x3cbef103,0x3caa3d89,0x3c8656a6,0x3c177a11,0x3acf864a, +0x3b266859,0x3a8125e4,0xb9a222ce,0xbaefd096,0xbb6740bf,0xbba6b70f,0xbbbecff2,0xbbd0e90b,0xbbe7f626,0xbc027e75,0xbc0fcde7,0xbc2e618b,0xbc080207,0xbbe4bee2,0xbbaf311a,0xbb80f2a0,0xbb211d6d,0xbaaca980,0x3b85908b,0x3c023579,0x3c7a5a31,0x3b2f4453,0x3c09bcaf,0x3c7c88b6,0x3c8e7d6f, +0x3c97e369,0x3c9e9386,0x3caddff2,0x3cbae057,0x3ccb2438,0x3c772501,0x3bfd2518,0x3cbf78a3,0x3c70cc8e,0xbb25a8c1,0x3c27de4c,0x3c275b4a,0x3c17b5db,0x3c271c3e,0x3c27a255,0x3c199cff,0x3c236f1f,0x3c1d1471,0x3c0919b8,0x3c13077e,0x3c08d8c5,0x3bd1240d,0x3bdbd291,0x3bdbe724,0x3bdcff0c, +0x3c0ac9ce,0x3c181ed8,0x3c192edb,0x3c235e42,0x3c2cbdd2,0x3c3914cd,0x3c35b827,0x3c3341de,0x3c2e5707,0x3c13d1e1,0x3c128f87,0x3c1813e7,0x3c2b2478,0x3c302036,0x3c30122c,0x3c2d42b0,0x3c2b4eff,0x3c24877a,0x3c123cb6,0x3c0d6d89,0x3c54d6e1,0x3c2e6c13,0x3c808b19,0x3c3d9e28,0x3c47f53a, +0x3c3303ac,0x3c0cb700,0x3c1efda3,0x3c2200c4,0x3bfcb22e,0x3c207f0d,0x3c037146,0x3adc4825,0x3ae247f5,0x3aded8fd,0x3b28d471,0x3bf6051e,0x3c2128c0,0x3c2665ec,0x3c4b74fa,0x3c6764a8,0x3c8d5c45,0x3c8a6ba3,0x3c693abe,0x3c516fe1,0x3c1cf59e,0x3c115a4c,0x3c06405b,0x3c3f90ec,0x3c5a4747, +0x3c4e3a07,0x3c5785c2,0x3c33fa89,0x3c10b3d1,0x3bdef1fd,0x3c1754bf,0x3c937c4b,0x3c77a032,0x3c8565cc,0x3c46893c,0x3c7d6e3d,0x3c89ba7b,0x3c3a234b,0x3c547f52,0x3c29aec5,0x3bb9e5dc,0x3c173b29,0x3bac874c,0xbb7dd627,0xbb89b2b2,0xbba8ad1f,0xbb961945,0x3b90bd19,0x3c2410e7,0x3c23af93, +0x3c6cb293,0x3c8beb10,0x3cc64365,0x3cadb760,0x3c95b3dc,0x3c6d1665,0x3c1fe680,0x3c0aeae5,0x3bac12a8,0x3c47e2b1,0x3c677bd8,0x3c6acdf6,0x3c69790b,0x3c4d2497,0x3c2df68a,0x3bb076d5,0x3be936af,0x3cc25c24,0x3c7807c8,0x3ce14320,0x3c9099ad,0x3c97de03,0x3c48b595,0x3b57440d,0x3bca31ad, +0x3c168268,0x3b8e7a6c,0x3c1b974d,0x3bcbe507,0xbc49a9c1,0xbc846f60,0xbca21aa5,0xbc7f45f5,0x3a7f53bc,0x3c105862,0x3c2e3e59,0x3c949629,0x3cce2d26,0x3d1a0ffe,0x3d0a8c96,0x3cdbb3b0,0x3c99884f,0x3c695ccf,0x3c55c93b,0x3b9ccfdd,0x3bcf3ae7,0x3c594301,0x3cced204,0x3c8fc571,0x3c41b493, +0x3c12f7bc,0xbb27a081,0x3c24a582,0x3d2a0dc5,0x3d043d36,0xbbf987dd,0x3bc2eb58,0x3cb592a8,0x3d35bb78,0x3d95fa95,0x3d019bc3,0x3c2541a4,0x3b8963b8,0x3bddb208,0x3b7168d7,0xbc860b72,0x3cfb25ff,0x3d13d3ed,0x3c0093a4,0x3bf46759,0x3be2f5e0,0x3c3dd8b3,0x3beed9b3,0x3bb304df,0x3c6a18ed, +0x3c791d18,0x3c66ac02,0x3c98af2f,0x3caa1d72,0x3cb86da3,0x3c54287f,0x3c1243b8,0x3b73cc9c,0xbbc5c26a,0x3c185a25,0x3cebd9c4,0x3d14d33c,0x3cdd6480,0x3b7b4687,0xbd063ed5,0xbcb8d14c,0x3cc7c6b5,0x3a708524,0xbce4b00c,0xbd11e7d6,0xbd1d6039,0xbcdb7721,0xbc8057a2,0xbc181c9a,0x3bf03560, +0x3c2ca29b,0xbb06c8ae,0x3c9736ae,0x3c9ccd26,0x3c1599e3,0x3bd16d98,0x3b95983c,0x3b0a8905,0x3c7faa6d,0x3c8fc12c,0x3c52b3f1,0x3c9ecc35,0x3ca371b1,0x3ca0537b,0x3c7e2a5f,0x3c049fbc,0x3c113035,0x3b88d00d,0x3bbdc896,0x3c63f2c9,0x3c3260bd,0x3ad26d74,0xbc1cd666,0xbc1871c6,0x3a9bb088, +0x3c1c0631,0x3cb543d3,0xbb9a68ad,0xbbde2b31,0xbc5ca039,0xbc2f5d70,0xbc0ed848,0x3b3fdeba,0x3c655e58,0x3d00e99c,0x3cf9f16f,0x3cb3c79f,0x3c1a9c77,0x3b612d11,0xb9c19620,0xbaa49ac2,0x3c1a1f38,0x3c75e20c,0x3c2223e3,0x3cc76ba0,0x3cb845f5,0x3c0452c9,0x3bf04954,0x3bbc76bc,0x3c121c91, +0x3c778b58,0x3bfddd22,0x3b9c1d1e,0x3c0681ea,0x3baa856c,0x3a23dfa5,0xbbc266c4,0xbb84ea63,0x3b8171e5,0xbcadba8b,0xbc65ccdf,0xbb3fc8af,0xbbda7c72,0xbbcfa32e,0xbc86a7ca,0x3b2f32c2,0x3c19e9ed,0xba072d6e,0x3bfe6a47,0xbb12a925,0xbcd7371b,0xbca6b0a6,0xbc89b619,0xbc38aff5,0x3ad334c4, +0x3bae79a3,0x3a84fc98,0x3c71478e,0x3c8ce4f5,0x3c73f89e,0x3c96784c,0x3c895f94,0x3c2277e8,0x3c96daa4,0x3ca2fba2,0x3c8eac2d,0x3c8823e5,0x3c42518f,0x3c221cb8,0x3b6788d8,0x3b4ed891,0x3c14da22,0x3c0a4e39,0x3b8571b4,0x3c56bffc,0xbc0023ce,0xbc7e6d2f,0xbc786818,0xbc1a1de4,0xbd6ca61c, +0xbd3ac400,0xbcbce782,0xbcdc8e66,0xbd2b96a2,0xbd23b03b,0xbd147917,0xbcec008c,0xbb3896bc,0x3badb82e,0xbbce53df,0x3a75fe7b,0x3ae85249,0xbaf6f9c0,0xbb13cdd7,0x3aa29f4c,0x3c104098,0x3c7bde3b,0x3c829cf7,0x3c029c5d,0x3c3eba90,0x3c2e39c8,0x3c479b5c,0x3c080c38,0x3c05bd6b,0x3c2f8930, +0x3b8e9f87,0xbb8b66ab,0xbc6ac041,0xbcaec042,0xbccc0daf,0xbcc95356,0xbd1f8c8e,0xbd3494b7,0xbd330563,0xbd5b0ba7,0xbcdc996d,0xbd3d4eea,0xbd74bbf6,0xbd48e894,0xbcdaed47,0xbc09b820,0x3b82716b,0x3c5173bb,0xbc3741a8,0xbcab4df0,0xbc83b7e4,0xbc78d0ea,0xbc57977a,0xbc4082e7,0xbbbd8ef2, +0xb9c7118c,0x3c17233a,0x3c38edc5,0x3c1bca87,0x3a2b577e,0xbacab25c,0x3b00ea25,0x3c3885db,0x3c28213c,0x3c45d8d9,0x3c7701aa,0x3c890e8e,0x3c8314bb,0x3be2a4db,0x3bed37e8,0x3c18b742,0x3c31940e,0x3c8cb8ca,0x3c281fb5,0xbbced4ce,0xbc95bee2,0x3c8377a5,0x3b8d6d59,0xbc1fcd8c,0xbcaf276c, +0xbd1cb6bf,0xbd32ee75,0xbd4aa08e,0xbd58794e,0xbd304a0e,0xbd0ee22b,0xbcef3af8,0xbd00cc63,0xbd03c2ef,0xbd0c86ee,0xbcf4fdc1,0xbcdb5726,0xbcbdea4b,0xbc90d54e,0xbc2ac9b3,0xbb8c17fc,0xbb77fd2a,0xb9801d89,0x3b1d948e,0x3bd2a080,0x3c4fa594,0x3c844835,0x3cb56447,0x3cc21123,0x3d0011d9, +0x3ce818b0,0x3cefa91b,0x3ce66abf,0x3cdba523,0x3cf44faf,0x3d04f2fc,0x3caba70a,0x3b23e014,0xbb730f2c,0xbc03a865,0xbc36fd6b,0xbc6beac5,0xbc8f8ee1,0xbcb13700,0xbce72fc5,0xbcf27a57,0xbd056648,0xbd0a19c3,0xbd0c32df,0xbd0cd9b0,0xbd10a088,0xbd00b82c,0xbce6e72b,0xbcce4797,0xbcb7d35b, +0xbca9a095,0xbc90184c,0xbc1f6baf,0xbc239afe,0xbc006e0b,0xbbb39117,0xbb5d3928,0xbb22b427,0xbac00f4f,0xba1aa269,0x3adfc009,0x3b0d269d,0x3b5b47b4,0x3bbb6623,0x3b6a31fb,0x3aeae425,0x3a8ee879,0xbb0fc3a6,0xbc4f646f,0xbc68f8c1,0xbc77e4e9,0xbc8c6385,0xbc99b9fd,0xbcad5608,0xbcbb598d, +0xbcc8b75a,0xbcc77e2a,0xbcc900f5,0xbccc9c79,0xbcd089fe,0xbcd460d5,0xbcdcda05,0xbccff8e5,0xbcc78df8,0xbcbd4c19,0xbcb2ef7d,0xbca61d85,0xbca4d6b6,0xbc876d64,0xbc713027,0xbc325062,0xbc6f76d7,0xbc43f007,0xbc14ac20,0xbc0f7942,0xbc072f38,0xbc0b79c9,0xbbf7ea45,0xbbeb4a58,0xbbcccc53, +0xbc19d1f9,0xbc3f122d,0xbbfd7c71,0xbc290755,0xbcbab2f7,0x3c0b36c3,0x3c014da9,0x3bf0b990,0x3c0f8349,0x3c0be8fc,0x3be0876c,0x3bfc7d2f,0x3bfbe9c0,0x3bf41ef8,0x3bea3e52,0x3be5d63d,0x3bf253ce,0x3be58d0e,0x3be844b9,0x3bf0775c,0x3c00c645,0x3c030fe2,0x3bfdf2fb,0x3bff1389,0x3c01f769, +0x3bfbe653,0x3c0a37a7,0x3c0f0b54,0x3c1c5886,0x3bf15143,0x3bf5c706,0x3bfd96b4,0x3c1dedd6,0x3c2258eb,0x3c13a088,0x3c1a3e96,0x3c13a196,0x3bfba88c,0x3bf667e4,0x3be6d9c5,0x3c1340ec,0x3c03b4af,0x3c2dc524,0x3bf5a9bb,0x3c144865,0x3c08dcac,0x3b9d63d9,0x3bcdeb80,0x3bd73dfe,0x3bf24ecb, +0x3becff28,0x3bffeba0,0x3c07d13e,0x3bd37a9e,0x3bd47f97,0x3be2259c,0x3c10a44d,0x3c16fb2c,0x3c07747a,0x3c0c51bc,0x3c10974e,0x3c1fa666,0x3c46fc79,0x3c2e2070,0x3c41d146,0x3bf6a879,0x3be5bdf6,0x3be16e42,0x3c436ee4,0x3c5e7571,0x3c2afa0b,0x3c3a4a52,0x3c15eb4f,0x3bade8f3,0x3bbfce59, +0x3bdf9d7f,0x3c25f157,0x3c1ad2f8,0x3c188f35,0x3bfcb45d,0x3c60c7cf,0x3c56da90,0x3b7cc985,0x3beb6f94,0x3bee6ddb,0x3bef8a8e,0x3bc2f9fc,0x3bb24252,0x3c112bdf,0x3babefc8,0x3bb09691,0x3bb57349,0x3c0fe4e1,0x3c24a001,0x3c031890,0x3c171915,0x3c120bb3,0x3c3dc9c9,0x3c5902de,0x3c4adaa7, +0x3c725e38,0x3be573a7,0x3bd92901,0x3b89c725,0x3c7a1c0d,0x3c891d35,0x3c3bacba,0x3c622a3c,0x3c37199b,0x3bb295e4,0x3b9d2015,0x3b997245,0x3c2dbec8,0x3bf462d6,0x3c69e1fe,0x3be10e01,0x3c1ef09b,0x3beecd73,0xbb99d940,0xba4b467d,0x3adf7d96,0x3bcfbb36,0x3bcec8e3,0x3c3fe4c4,0x3c57549d, +0x3b679da0,0x3ac3d9bf,0x3abb1c48,0x3c15cbc4,0x3c24f6cd,0x3be7f6a0,0x3c17d0cd,0x3c3aea96,0x3c8fcd0a,0x3cb71bf7,0x3c9811c8,0x3ca6b7bc,0x3c2ca94c,0x3c06e281,0xba6b209f,0x3c335990,0x3c92b784,0x3c91e99f,0x3c890c77,0x3c1df760,0x3aab5643,0xb81196fd,0x3bc10fca,0x3ca44d4d,0x3c8da8e8, +0xbbabff1f,0x3c6ed2be,0x3d06b1a9,0x3d1e3c51,0x3d42515e,0x3cd80dcb,0x3c8fddc9,0x3c933342,0xbbf232fd,0xbc6a92dc,0xbc60ab26,0x3ca47c44,0x3cf8e3fb,0x3c6ab923,0x3c61d3c9,0x3c5dd10c,0x3c74b2b2,0x3c33dc30,0x3bb75200,0x39ba7b83,0x3b6d7a39,0x3bd69439,0x3c6a6cfd,0x3c87b8e0,0x3ca6c8ad, +0x3ca27b33,0x3bcfe73c,0x3a2dbe86,0xbad3926a,0x3cae9191,0x3d11d9b0,0x3cc135b6,0x3c5194d4,0xbb94f20a,0xbcf30d1d,0xbcb94dc5,0x3d17af9a,0xbd68ca6c,0xbcf87e5e,0xbcb55020,0xbcce2db7,0xbca76fe8,0xbce5212c,0xbd54a1f0,0x3ba39520,0x3c97d364,0xbc4ef161,0x3c39873e,0x3c89239f,0x3c8baba2, +0x3c3d0692,0x3c0456ad,0x3bdf74bf,0x3c8f5926,0x3c9dc7bd,0x3bfa6fa0,0x3c5fc73f,0x3c7400f5,0x3c7082e3,0x3cad8d20,0x3c6432f7,0x3c22fa77,0x3bbe19a0,0x3c232d43,0x3ca4f90a,0x3c3050a6,0x3a9c6ef0,0xbc162811,0x3bc6ea94,0x3c78883f,0xb993ac31,0x3d588d05,0xbc5298fb,0xbc572ddc,0xbba9d0ed, +0xb91a75af,0x3c3db9fb,0x3a80bb31,0x3c2dd410,0x3cc3fff9,0x3cdf362f,0x3cbc653c,0x3c123997,0x3c82fde0,0x3bdd8efa,0xbb3bc21a,0xb8d1eb4a,0x3ba87a1d,0x3bbc8211,0x3c558d08,0x3c3bd3f7,0x37650d23,0x380e6077,0xbb0c64e2,0xba26c823,0x3bcfb5ab,0x3b2f47ee,0x3be9474b,0x3bce31e5,0x3b6f51fe, +0x3b82350e,0xba755204,0x3b7c94f5,0x3c0721a5,0xbbb3fb82,0x3b99bc92,0x3c0d5488,0xbc1c0980,0x3c03413d,0x3b411b38,0x3ae304e7,0x3b67bad0,0x3c8f890a,0x3c3755b3,0x3b1d0c32,0xbc344e9f,0xbc8d367b,0xbca5ccd1,0xbcf29148,0xbbd4e6ef,0x3ba81151,0x3bc06c35,0x3bfb76ad,0x3c205c97,0x3c523a53, +0x3c508578,0x3c2e1257,0x3be6f87d,0x3c3fec22,0x3c32230d,0x3c266269,0x3c6c02b2,0x3c297d21,0x3bf22262,0x3b719520,0x3b29c9e4,0x3bc39797,0x3b723b47,0xb9028689,0x39ae893f,0xbb61eec4,0xbb02f871,0xbb0db375,0x3c1f5313,0xbce22ba8,0xbc331e6e,0xbbbef491,0xbbeb4834,0xbc6ac394,0xbca46123, +0xbc90d53d,0xbc12344f,0xbc01d5e2,0xbc0baa37,0xbc258351,0xbb5f88a2,0x3a576ca7,0x3b32b3b2,0x3c156732,0x3c5cb863,0x3c873e78,0x3c5960ca,0x3c13f13f,0x3b4ac5ea,0x3c436c71,0x3c3a86fd,0x3bd5a6c9,0x3bec3ba6,0x3bd95a8b,0x3c351916,0xbae86b8c,0xbc1655c4,0xbc39174f,0xbc48ed8b,0xbc67e96e, +0xbca8dee8,0xbcd7eb85,0xbd16b512,0xbd59d5f8,0xbd29b81d,0xbd5a2f68,0xbd5ad650,0xbd40356c,0xbd112afb,0xbca9d9ac,0xbbf2fed0,0xbc06bbad,0xbcaa2258,0xbc8ac8d4,0xbc3c0a70,0xbb8e258a,0xbbe6cb61,0xbba9d98e,0xb9204548,0x3b40c9e0,0x3bed9931,0x3c144437,0x3c5baac9,0x3c5f1a45,0x3bf32c55, +0x3bf5e4e0,0x3bc4598d,0x3b8028d3,0x3b861d48,0x3bb0db86,0x3c293723,0x3c1162d7,0x3b85d682,0xbbf06dba,0xbc6979d0,0xbc8fbe9b,0xbc9f8f5a,0xbc07b1a8,0xbc235844,0xbca950ef,0xbd20541e,0xbc983c89,0xbce2a490,0xbce075fe,0xbcd4c466,0xbcd0a639,0xbcad0e1a,0xbc685dad,0xbbe28e29,0xbbfa3cbc, +0xbc2a7782,0xbc3ca91c,0xbc37128f,0xbc27f957,0xbc25105b,0xbbdde32e,0xbb7c83b5,0xbaa00cab,0xbb80bb18,0xbbccef06,0xbc08b626,0xbba8c241,0xbb4ae364,0xb9d4185f,0x3b2fe2eb,0x3bbe5a95,0x3c0f097e,0x3c310386,0x3c3aa7b8,0x3c8efa4b,0x3c264980,0x3bd7d795,0xb985203a,0xbba1fe00,0xbc00f190, +0xbc1f9d8d,0xbc853a27,0xbb9786ef,0xbc0fc163,0xbc41e08b,0xbc7852e3,0xbc97fd4d,0xbcb40aab,0xbcdaa1f0,0xbcfadbc8,0xbcf9cdef,0xbcee0947,0xbcea920c,0xbce65bc7,0xbce908da,0xbcf47961,0xbce22762,0xbcd42b1e,0xbcbd891b,0xbcaa9da5,0xbc8fde74,0xbc7f4dbc,0xbc88b35d,0xbc452374,0xbc213360, +0xbbf4a73d,0xbbaf06e7,0xbb057f57,0xbaf53a42,0xbaf2a256,0xbaa1ff5f,0xba4db114,0x3a2b0793,0x3b32fca5,0x3a58ebfd,0xba3876c1,0xbaeb0abf,0xbb9ad722,0xbc83e83f,0xbc7ce5f9,0xbc884092,0xbc922cf3,0xbc9a5f04,0xbca361f3,0xbca97e6b,0xbcb5f533,0xbcafe437,0xbcb20bda,0xbcb2c9eb,0xbcb4ae24, +0xbcb37502,0xbcb30e8f,0xbca9e50c,0xbca4265e,0xbc9fccfa,0xbc98907a,0xbc933e00,0xbc8558dc,0xbc93ac7f,0xbc93d2e3,0xbc97b938,0xbc79f7b7,0xbc80f909,0xbc7db77d,0xbc79d758,0xbc6e9085,0xbc6d8a94,0xbc5ef3f1,0xbc5cef9f,0xbc51bb68,0xbc634951,0xbc668037,0xbc7a8e63,0xbc7e38fc,0xbcb29dbb, +0x3bc5296e,0x3bbde8d3,0x3bad9193,0x3bc340bf,0x3bb1c319,0x3b7681e7,0x3b93f5df,0x3b9c52ff,0x3bb6fac5,0x3ba3e82e,0x3ba895cb,0x3bd79641,0x3ba46443,0x3ba35c58,0x3bb2650b,0x3bbd0b48,0x3bbee41b,0x3bc008d1,0x3baec4ee,0x3bab3439,0x3b9ee6ad,0x3bbf5c7c,0x3bcb0447,0x3bf513d0,0x3bac1fae, +0x3bc8814d,0x3bdb7664,0x3c0dc058,0x3c10dbbc,0x3bf5dd46,0x3bfbf923,0x3bebb39a,0x3bca15c3,0x3bc9e432,0x3bb50d6a,0x3bd2adcb,0x3bc14d94,0x3ba5d69a,0x3b7681ca,0x3ba38bd2,0x3b8d4db5,0x39d2ad7a,0x3ab51d2c,0x3b1f5df9,0x3bc3cc14,0x3baf7113,0x3bd0c32c,0x3c1f5ff7,0x3b99bcd0,0x3b72f18e, +0x3b9e5751,0x3bc04daa,0x3bd62a22,0x3bd627c6,0x3ba8f41c,0x3b99102e,0x3b97bee4,0x3be55953,0x3be09264,0x3c04347c,0x3bb47e54,0x3bbe4b67,0x3bd6626d,0x3c38c818,0x3c49be19,0x3c0b71cf,0x3c0d6b40,0x3be8ce96,0x3b8d4745,0x3bb3d2a7,0x3bbece0c,0x3bc8c11e,0x3ba54690,0x3baec346,0x3bc2ddc9, +0x3c0f7a60,0x3ba91610,0xbb752397,0xba15abb0,0x3a897801,0x3be715b4,0x3b8bfe6c,0x3b9f35f1,0x3c570c7a,0x3b4c6eda,0x3b5980ee,0x3baebe71,0x3bf63ee8,0x3bff7d4e,0x3bf6a990,0x3ba1fffe,0x3b6941ee,0x3b7164e5,0x3bd2d81d,0x3bf129ef,0x3c233156,0x3ba6df10,0x3bda143d,0x3bd9b1fe,0x3c8c8614, +0x3c95646b,0x3c344ee8,0x3c4aa3ed,0x3c1c83cd,0x3bac58c3,0x3bc9332a,0x3b99af81,0x3ba27395,0x3b82b810,0x3ad55d63,0x3a9c6755,0x3b59e0c0,0x39615e8d,0xbc5d6c1b,0xbc3f4a2f,0xbbeb2976,0x3be594c6,0x3bcc3402,0x3c3e438d,0x3cbe39aa,0x3ba2996d,0xba7050ab,0x39e3294f,0x3ba004ca,0x3bf9b44c, +0x3be04353,0x3b2f04e9,0x3a486e42,0x3adf7a8c,0x3c055a70,0x3c3083e9,0x3c99b12b,0x3c16fb3f,0x3bb77784,0x3987a6d3,0x3c802106,0x3cac3f63,0x3c35a6a8,0x3c493634,0x3bfebb9c,0x3a489aec,0x3b6344e0,0x3ba790b2,0x3c1cd209,0x3bca8e78,0x3b3ebaaf,0x3ca0ed19,0x3cc2d702,0x3caa7424,0x3cc880c2, +0x3cdff280,0x3cce6db9,0x3c867d00,0xbbcbfef9,0xbc9a7b22,0xbcb6900d,0xbc01e55d,0x3c2d8701,0x3cf6599c,0x3c98b6a2,0x3c6f1aa0,0x3c80a50d,0x3c54f53c,0x3c3195d3,0x3b9fef59,0x3b28f0df,0x3b8d5724,0x3c22c680,0x3c2b58f4,0x3c6ebbe8,0x3cb7dd92,0x3bb2d350,0x3a766d7c,0x3c1b6633,0x3cf3d309, +0x3d07b8af,0x3c26cebc,0x3c05a997,0xbba03b17,0xbce5d8e0,0xbc6c6fb9,0x3c9c8f78,0xbd8787cb,0xbc69576e,0xbb0fbcbc,0xbc494384,0xbc7930e3,0xbc91f252,0xbcc4f0b9,0x3c6fe4da,0x3cd1b947,0xbac50236,0x3bfe630b,0x3c3afa2f,0x3c8c6efe,0x3c906804,0x3c8d8ccb,0x3c9024e1,0x3c7026c8,0x3c54423a, +0x3c09b1ec,0x3c1856e9,0x3c12dbea,0x3c064ad3,0x3cad0abf,0x3c8f4b45,0x3c232269,0x3c382267,0x3c7d14ce,0x3cab4206,0x3bd963e5,0x3b1fcffb,0x3b3b8c70,0x3c2d6268,0x3c74d0cf,0xba590ff9,0x3d2bcd24,0xbc80fc99,0xbc76a988,0x3c3e55b6,0x3c94ece1,0x3cbc8a20,0x3b913171,0x3b178c19,0x3b7dda4c, +0x3c85fed1,0x3cb2a4da,0x3c33db76,0x3c864049,0x3bff85ae,0xbb7d11fe,0xbc091ac1,0xbb862e27,0x3c2b9c16,0x3b5dcdf7,0xba8377f1,0xbbbdad2d,0xbb94b336,0xbbcb981d,0xbc01ae98,0xbb417767,0x3a521d03,0x3c14f90c,0x3be502d3,0x3b962d0f,0x3bbf093c,0x3ba62c5f,0x3bf4911d,0x3b787b52,0x3c35f415, +0x3c768996,0x3b382311,0xbc3fefee,0x3c86c013,0x3c978556,0x3c49c6ad,0x3c3a3c3b,0x3c8a7e36,0x3c309f4e,0x3ba1e5e9,0xbb025166,0xbbc83a5e,0xbc15c302,0xbca91e7e,0xbc1347bb,0xbacf0c6b,0x3b05f621,0x395ec1f6,0x3b7d7cf1,0x3c3a146b,0x3c1958b9,0x3c1126cb,0x3bbbf8d9,0x3b400658,0x3b124abd, +0x3b32ee3d,0x3c0cb7d6,0x3bed36a0,0x3b913caf,0x3b99fb9d,0x3b6be523,0x3b6d7e4b,0x3aa2ba76,0xba49484f,0xbbd732de,0xbb161ba3,0x3a4d3836,0xba883b1c,0x3c358121,0xbcd8287a,0xbc97891c,0xbc309999,0xbbc31bd3,0xbb874040,0xbbb4ce36,0xbba85252,0xbb4739cd,0xbc98bea1,0xbc9f463c,0xbc1ccd99, +0xbbe1bb8b,0xbb284913,0x39b3a6eb,0x3bf41f33,0x3c219b2c,0x3c31dc51,0x3b03b78d,0x39b303a3,0x3ba26751,0x3bb19bb1,0x3b8f1c9f,0x394679ff,0x3b97b1b8,0x3b7573bf,0x3b6da8c0,0xbb3a7f0e,0xbbd1796d,0xbb8e6e49,0xbba73237,0xbc25deba,0xbca235ee,0xbd035406,0xbd2fcfe0,0xbd53aaf5,0xbd15af20, +0xbd099e8c,0xbcffce1f,0xbcd6edf7,0xbcdbaa00,0xbcdc50e9,0xbd109bd9,0xbd1727c0,0xbcf5d1a4,0xbc908f1f,0xbc22a00b,0xbc18ee5c,0xbbddf74f,0xbb8fd274,0xbb2cdde1,0x3b75dfd1,0x3be045e8,0x3c608439,0x3c02203a,0x3bec99bd,0x3c15e5f9,0x3c22ff25,0x3c18367a,0x3b858e62,0x3b939a31,0x3b340d25, +0x3b89f456,0xbbe9e97f,0xbc550779,0xbc8318d6,0xbcb3949e,0xbccbb450,0xbccf7ba7,0xbcaaea78,0xbc8876dc,0xbc34d79c,0xbcc90c3d,0xbd150429,0xbd28fe38,0xbd12b303,0xbcf8cfdb,0xbcbe3015,0xbc617ca9,0xbb858b6a,0x3b72bf95,0x3a8a80ed,0xba45e6fb,0xbaebda64,0x3b001b64,0x3b97b509,0x3be55432, +0x3c275a2f,0x3c55bbef,0x3c8a51bc,0x3c443c9e,0x3c156a92,0x3b69752a,0xb96d383f,0xba29aa6c,0xbaf06d13,0x3aa8c61a,0x3b790996,0x3bfb838c,0x3bc6d334,0x3b4af2e9,0x3b5d76f5,0xbb207441,0xbbbd1ca1,0xbc39e626,0xbc93c2d1,0xbcd25515,0xbd0291dd,0xbd10b081,0xbc242f56,0xbc5d5a4b,0xbc627f29, +0xbc700745,0xbc84a76a,0xbc8f67b7,0xbc9d739b,0xbc9b9e58,0xbc88ad80,0xbc5ffa87,0xbc3dccd5,0xbc24f827,0xbc0e55c3,0xbbf0224a,0xbc0111d9,0xbc07825d,0xbc049a6d,0xbbfdb282,0xbbdf99b0,0xbbc71f2d,0xbbd7a725,0xbb2d18de,0xba8b858d,0xb8c4d961,0x3aac9dea,0x3b8e8fb0,0x3b0b2e89,0x3a20ecc2, +0xba72010c,0xbae835a7,0xbb1167fc,0xbaff7650,0xbb820b81,0xbb9d35ec,0xbbb5be38,0xbbff9de8,0xbc0e6861,0xbbf62020,0xbbf8a3ed,0xbbfa35f2,0xbbf0fcb5,0xbbeba344,0xbbe4c78a,0xbbf7de34,0xbbdca7eb,0xbbd2c21f,0xbbc20933,0xbbb06c64,0xbb9e5194,0xbb82627d,0xbb8a088e,0xbb8c173f,0xbb969174, +0xbb94abe0,0xbb9d78a2,0xbb8f7b89,0xbbcd83db,0xbbf0045d,0xbc1fa06a,0xbb6a201f,0xbbb01efb,0xbbea1647,0xbbf2db58,0xbbea81e1,0xbbf33adb,0xbbf61b75,0xbc054bca,0xbc0fbc3a,0xbc008db8,0xbbd8e928,0xbc349187,0xbc1bf4bf,0xbb801781,0x3b3f878c,0x3b845fbb,0x3b8a5417,0x3b40b2a4,0x3b02b83e, +0x3a266e69,0x3aa0445d,0x3ad430e1,0x3b366ef6,0x3b13121e,0x3b14c582,0x3b6f0bd5,0x3a7185d7,0x39d07b4c,0x39c0abc2,0x3ad09433,0x3b164022,0x3b51fbf1,0x3b4650f8,0x3b488c1b,0x3b2be1f4,0x3b54ee60,0x3b537fab,0x3b6f4bdc,0x3b1aebfd,0x3b761e26,0x3bad507c,0x3bd29437,0x3bd7265e,0x3bb38ba6, +0x3bb23dae,0x3ba623ef,0x3b89bf98,0x3b8bfb89,0x3b70b294,0x3b8966d2,0x3b829cc8,0x3b3884d0,0x3b8ddc40,0x3b0824d3,0x39951049,0xbb3b79a3,0xbb3747cc,0xbab7bf31,0x3b2701f6,0x3b2974b7,0x3b3db2fb,0x3bbdae36,0xbb0461d8,0xbb9c92f9,0xbb8c14f3,0xbafa424d,0x3a674df9,0x3b707ce6,0x3b7996c4, +0x3b75cf03,0x3b2fcbaf,0x3b6f34dc,0x3b341602,0x3ae1d443,0x3b1576c6,0x3b82247a,0x3bd6f702,0x3c1a36cc,0x3c228882,0x3be5c5a2,0x3bd8eb29,0x3bb1d8dd,0x3b5a095a,0x3bb1d224,0x3bc03dd2,0x3b88904d,0x3b6ab3c7,0x3bee3340,0x3c2cbc7a,0x3baf162e,0xba4da5f8,0xbbe8404b,0xbbc3424f,0xbb7833aa, +0x3b77d60b,0x3af04edc,0x3ac2590d,0x3c038980,0xbbe69d44,0xbc228fca,0xbc14cbc4,0xbb5e1ac2,0x3a228c8f,0x3bb05eb0,0x3ba09340,0x3b98a606,0x3b452ec8,0x3b871416,0x3b590cbb,0x3a2d0ef9,0x3ae86827,0x3bc2b5c2,0x3c23ff68,0x3c8af18e,0x3c940c5c,0x3c46438d,0x3c44de19,0x3c2011fc,0x3bb4afe5, +0x3c0bef80,0x3bdfeedc,0x3b920968,0x3bc5d545,0xb7de5d25,0x3bf34223,0x3b315beb,0xbb690361,0xbc6ccf65,0xbc985e04,0xbc569778,0x3b3c5654,0x3b7da318,0x3bb8230b,0x3c849d42,0xbc01693c,0xbca75a81,0xbcabb8d6,0xbc6851b8,0xbb711c1c,0x3b9de5e8,0x3b9ba231,0x3b711419,0x3a062391,0x3b3cc288, +0x3b721863,0x3bd11787,0x3bcc3d2e,0x3bd9ce7b,0x3c04f975,0x3ca563f8,0x3cc07c6b,0x3c426cce,0x3c3b7435,0x3c1b39ba,0x3b6ffb0d,0x3c1a5eb2,0x3c2d57f7,0x3be71fe8,0x3b8ce1af,0x3cc8eb2d,0x3ce2cff1,0x3c17159e,0x3b0fa74a,0x3c0939e6,0x3cfbcb8d,0x3cfe0270,0x3ba9372b,0x3aca0ecb,0xbc5a16e6, +0xbccee522,0xbccf12fc,0xbbd03800,0x3d071308,0x3cb9ca5b,0x3c96c72c,0x3c86d2c6,0x3c5daa74,0x3c535978,0x3c42303c,0x3c37928c,0x3c2c7543,0x3c1e7de7,0x3be428f7,0x3c0d1bf9,0x3c965e43,0x3ba1b907,0x3bb5c452,0x3cba6ec8,0x3cf9ea87,0x3cc661fa,0x3bf80fb6,0x3b6635b5,0xbbd68075,0xbc87f9bd, +0x3c218c57,0xbd0e399b,0xbd4cc9c1,0x3b7a7e07,0x3c796637,0xbc228081,0xbb99f977,0xbbb72c31,0xbc54a13f,0x3c0d8981,0x3c8b46d4,0x3c36631b,0x3ba14c03,0x3bb40773,0x3c65fe9d,0x3c97b428,0x3cae4f84,0x3cad0f92,0x3c277367,0x3bbcb6b3,0x3bdfde6e,0x3b5b19e0,0x3b6185ff,0x3bb9b5c0,0x3c5e8374, +0x3c731a96,0x3c120254,0x3c8cbbe3,0x3caa1808,0x3c92811d,0x3b965a57,0x3bbcae03,0x3c781979,0x3c368c42,0x3c5483bc,0x3c933b8d,0xbc282180,0x3c03fe14,0x3c1e7492,0x3ce0951d,0x3cd5e532,0x3c9d1e6f,0x3af7bf9d,0xbc2f304e,0xbc3a3184,0xbc1f6e3b,0xb9b75d89,0x3c69321b,0x3c125dce,0x3befc7c8, +0x3ad46545,0xbb80689b,0xbb77672a,0x3c14ff98,0xbb07235c,0xbbc5bc12,0xbb96c271,0xbbb9e739,0xbb902e0f,0xbb49a92b,0xbbba4c03,0x3ae2580c,0x3c3640ee,0x3bdc78b7,0x3ba6fcf5,0x3bb544b4,0x3bf19e56,0x3bcc76f1,0xbaa1e9a9,0x3c4f8ce9,0x3c866a05,0x3c1c1a14,0x3c0f6263,0x3b8a5688,0x3c28c689, +0x3c2c8778,0x3c47bc52,0x3c3f67cd,0x3c8766b5,0x3ca85a02,0x3cc15fb0,0x3bf17328,0xb979a43b,0x3b0afa02,0xbc1139d6,0xbc12d26a,0xbba2aea2,0xbb05351f,0x3b0491f3,0x3c318c1f,0x3c3520dc,0x3c34b60d,0x3bffb330,0x3a3975c4,0xbad53ce5,0x3b001287,0x3aaf7971,0x3ae4187a,0x3b4c600b,0x3bfb9e61, +0x3c027d59,0x3b5cc674,0x3bacedbd,0x3b5454ae,0xbbdcbd7c,0xbbc034eb,0xbb9d6d1a,0xbc15c3c7,0xbadccf05,0xbccaf91b,0xbc520cc2,0xbc5150e0,0xbbd4663f,0x3bb0ccb6,0x3a6f678a,0xbbf170c1,0xbc8fd658,0xbcb9f94a,0xbc9d72e4,0xbbf42908,0xbbebf187,0xbb312b20,0x3aa09632,0x3b7566de,0x3b4b9ae0, +0x39016ee3,0xbad74cbe,0xbac3015b,0x3b46be66,0x39a2a45a,0xb8076981,0x3a2ff509,0x3b1312d8,0xb88de2db,0xbbc74d15,0xbb5b76f9,0xbb5fde4f,0xbb625d7a,0xbbbbbab9,0xbc4fa0b7,0xbcabe92e,0xbcfbb501,0xbd156c84,0xbd06bd21,0xbcf7e1ec,0xbc93ae92,0xbc90d5b1,0xbc8e20ae,0xbcb33f30,0xbcead4d6, +0xbcd5789c,0xbcaf88c6,0xbc8d5346,0xbc57d192,0xbc380af3,0xbc164532,0xbbde91f5,0xbb7d2d68,0xb787cf35,0x3b8ca752,0x3bc75e82,0x3b2c86b4,0x3afa70b8,0x3b2a763a,0x3be6d345,0x3bee9c8e,0x3bdccdfc,0x3ba37291,0x3b9f054e,0x3a258fc7,0xbbc05b5f,0xbc854d55,0xbcaa60ca,0xbca500bf,0xbcbc5447, +0xbcd3f573,0xbceca2cd,0xbce66f4c,0xbcbd116a,0xbc728cf9,0xbc85be27,0xbcee1768,0xbcf2448f,0xbcdf02ab,0xbcdaa98e,0xbcd11f59,0xbcacb730,0xbc927c06,0xbc65d8bc,0xbc3ca403,0xbc048bcd,0xbba1ecb2,0x3ad7b8a5,0x3bef956a,0x3c5336ca,0x3c28b63a,0x3c144ce6,0x3c06214d,0x3c0ace2d,0x3c05810c, +0x3c09f547,0x3bf21154,0x3bc98749,0x3bad8574,0x3b40580c,0x3b1c4dc4,0x3af59d7d,0xb9c28e52,0xbbee3587,0xbc1ca9c8,0xbc330afd,0xbc0f6389,0xbc0eb8a5,0xbc65d4f2,0xbca2f38b,0xbcca306b,0xbcdac589,0xbc8d6edc,0xbca4cb96,0xbc8e4e04,0xbc714f3e,0xbc42550c,0xbc1bdf41,0xbbda222a,0xbb5e12f5, +0xbad312bd,0x395d79fe,0x3ae38397,0x3b4802e9,0x3b899c0f,0x3bdabe42,0x3bba2a30,0x3baf88e8,0x3b97e579,0x3b8b976b,0x3b8a5519,0x3b6faecd,0xb78ff27e,0x3a47633d,0x39e81494,0x399bc5fd,0xb9f73fc7,0xba725dc2,0xbb638f68,0xbb96742d,0xbbb75bfe,0xbbf7c634,0xbc1b84a5,0xbc23da7e,0xbc41faad, +0xbc493554,0xbc61e82d,0xbc80cab4,0xbba95253,0xbbed485f,0xbbb50758,0xbb9a0dec,0xbb7a9deb,0xbb3e4b91,0xbb0d5102,0xbab97220,0xba5cd539,0xb8a6ac66,0x3a470ae6,0x3ad0afa7,0x3b189c20,0x3b502825,0x3b3826ab,0x3b365e67,0x3b31c518,0x3b231ed4,0x3b0b30cf,0x3b2168e7,0x3abbdef0,0x3aa94f6b, +0x3a60b1c5,0x3a3e9362,0x3a4373ab,0x3b0c4d5b,0x3add2c9c,0x3aaf1d6a,0x39ff0cec,0xb7c1d38b,0xba70f1d5,0xbb00b153,0xbb5ecf32,0xbb966021,0xbb72d19a,0xbb9c4e42,0x3a20dab3,0xb8f7be4b,0x3b0b9179,0x3b26da79,0x39984b7b,0xba787559,0xbaed5f56,0xbafc4d02,0xbac70b0d,0x39bcfca1,0xba3260f2, +0xba5ed96b,0xb8bcb007,0xbb0dd5fb,0xbb3c9509,0xbb717039,0xbb1ba2b7,0xbab1d4a2,0x3938d10b,0x3a3c368e,0x3a7f3a8b,0x39953731,0x39dff24d,0x3984ef7d,0x3718916a,0xba0dd072,0x3a486af4,0x3b4dab5f,0x3b69677f,0x3b749fb3,0x3b3d170b,0x3b46fd71,0x3b3419f5,0x3ab7daf2,0x3b00ec23,0x3ab0881a, +0x3ada4ba9,0x3b0546ea,0x3b38a6af,0x3b87993c,0xb9c04654,0xbb35960d,0xbb9b8cae,0xbbc62c8b,0xbb9fcc28,0x38959db3,0xba8f223d,0xba86a9df,0x39bcfa24,0xbb9ad9a5,0xbc000da3,0xbc1da75c,0xbc00402f,0xbb9adae4,0xb9568d29,0x3b14b872,0x3b3dbcc5,0x3a7addf0,0x3a54b9af,0xbaa82ec4,0xbb3c9de8, +0xbac3121a,0x3a71f705,0x3bb0221e,0x3bd1888d,0x3be07459,0x3baaedf0,0x3b9f0915,0x3b73d851,0x3a5473a5,0x3b96786c,0x3ba5fc7c,0x3ad36550,0x3b1a81a1,0x3c24d5b8,0x3c68e073,0x3b26903d,0xbb92f413,0xbbfc8009,0xbc2b6f53,0xbc0f4b71,0x3b141bb7,0xbb24a1c5,0xbb488b31,0xb9fb13d8,0xbc2d0aa9, +0xbc72ad17,0xbc940fe0,0xbc571595,0xbbf0a3b4,0x3a62ac57,0x3ba2810a,0x3bca7e3f,0x3b318f31,0x3abe325d,0xba921730,0xbba761b6,0xbb26389d,0x3b2f27c2,0x3c214617,0x3c649cdc,0x3c75b6fe,0x3c37e90b,0x3c3a94ee,0x3c2000cd,0x3b45c280,0x3c1419c8,0x3bfb8398,0x3b5cfd64,0x3bf861b0,0x3bb5a9fd, +0x3c6764d7,0x3abbfe04,0xbbc91228,0xbc4271b4,0xbca97bd8,0xbc88a4e4,0x3b044f5c,0xbaeff09d,0xba807a19,0x3baa1254,0xbc14a542,0xbcb71491,0xbcefe42b,0xbcd71411,0xbc7b656d,0xba844847,0x3be28ee3,0x3c0bcd2b,0x3b15ffe0,0x3a43be3c,0xbb5a84da,0xbbbef077,0xb8dc6ca3,0x3bbdee05,0x3c5b2864, +0x3cc0a4a7,0x3cd40de1,0x3c6b9b6e,0x3c4dd0fe,0x3c37082a,0x3b9202db,0x3c70f148,0x3c86e087,0x3bae088a,0x3bb1fe74,0x3d22c310,0x3cfa647b,0x3bbc0e9a,0xbb998840,0xbc279c18,0x3ca2541f,0x3cad5707,0xbc1b7751,0x3b47b010,0xbc3bed39,0xbd13b9ea,0xbd0d6fd1,0xbca12f28,0x3c2b9854,0x3c7b168f, +0x3c84f487,0x3c5600ab,0x3c39c38f,0x3c2d7eb8,0x3c4330e5,0x3c7fd182,0x3c71bdf8,0x3c49dbb3,0x3be2c98c,0x3b92b3e2,0x3c46b7fa,0x3b0b77d2,0x3c1c85a0,0x3d106a12,0x3cc74d6b,0x3c4fcde5,0x3be0d4a6,0xbbe6855a,0xbc56fb0d,0xbb3db9ea,0x3ce2e5c8,0xbd90ccaa,0xbd064f02,0xbb512384,0x3c3fbb36, +0x3a4eaffe,0x3c17c8d9,0x3b5c4d71,0xbc85529b,0xbc3c823e,0xbac1a861,0x3cab4742,0x3bb6d969,0x3acdd4ae,0x3bccddf2,0x3c6c082c,0x3c9b75c4,0x3c84da64,0x3bb4fcc3,0x3a60128c,0x3bae10f5,0x3b19f231,0x3b20b188,0x3ba110b7,0x3bac6a40,0x3c086500,0x3be8f492,0x3ca13c9c,0x3cb47392,0x3c5304c5, +0x3bcc3526,0x3c022c14,0x3c5fd404,0x3c2b2c87,0x3c8bb35e,0x3d16750b,0xbd413dbd,0x3d20ae67,0x3d2c5ac7,0x3d1e441a,0x3cf38a13,0x3ca7e75f,0x3c36f29e,0xbb76cffa,0xbc4e279d,0xbcc0d3f5,0xbc93fc02,0x3bf89ad3,0x3a1b5190,0x3be6124c,0x3c159384,0x3bdbe62d,0x3adec1f3,0xb98a040d,0xbb84e6f8, +0xbbcbb6e0,0xbb663d46,0xbb3e494f,0xba8f44b4,0x3aaaa6c4,0xbb336507,0x3b72ded2,0x3c28a55b,0x3bcf31fa,0x3ba790a9,0x3b8e1cea,0x3c1947d9,0x3c085429,0x3af8cb8b,0x3c585feb,0x3c7aa3e5,0x3c8e0985,0x3d0213f6,0xbc641f60,0xbc28372c,0xba6119f3,0x3c0201e9,0x3c4da2ed,0x3ccecf46,0x3d051eac, +0x3d1a9d53,0x3c950492,0x3c09c782,0x3c89b2c7,0xbb8490f5,0xbc20b949,0xbbbb9489,0x3b527bce,0x3be24584,0x3c1d1e08,0x3c2384b8,0x3c0cc372,0x3bdfe49e,0x3a889ccb,0xba92dd10,0x3941f6b7,0xbb0c660a,0xbad9be81,0xba0bfc80,0x3bd78685,0x3c1ba3f7,0x3baa456a,0x3bd3fd12,0x3b6fd128,0xbb49674b, +0xbb8ab22c,0xbb0f88ae,0xbc031a55,0xbc3daaf6,0xbc6bb63f,0xbbd24254,0xbb80d521,0xbaedd380,0x3a482c58,0xbb596eb0,0xbc4d6cce,0xbcd5f9ef,0xbc82778e,0xbc26a044,0xbb8cd998,0xb939a203,0x3b0038e9,0x3b55d8d4,0x3a5c8b74,0xb93526ed,0xbab6a271,0xb886a589,0x3aaf8472,0x3b11170e,0x3a26a074, +0x398e7464,0x39ffad4e,0x3991a1a0,0xbad13cf5,0xbc18aeb0,0xbbd3aadd,0xbbf006f2,0xbc0529f3,0xbbf6c49d,0xbc304ce8,0xbc6786aa,0xbc91153c,0xbca824f5,0xbc9d2cc3,0xbc8ec343,0xbc3d2ca3,0xbc32692c,0xbc22f071,0xbc276c15,0xbc0d970c,0xbc0e6fda,0xbbc28ed1,0xbb91c139,0xbb579816,0xbb9c3091, +0xbbcbb097,0xbb4f9109,0xb885b84b,0x3b956f84,0x3b21e0c9,0x39b7ffd8,0xbb32f7fe,0xb9b928c3,0x3a9ea05f,0x3b677610,0x3b8a918a,0x3b9e76e4,0x3bdb64cd,0x3a9cfab7,0xbb9da20e,0xbc53dcc6,0xbc8e3f98,0xbca050bb,0xbca3a017,0xbcbd1913,0xbce2354e,0xbd047890,0xbd0904b4,0xbcfcbfc0,0xbcdb9371, +0xbc7d06f6,0xbc6faf14,0xbc63c2fa,0xbc633c62,0xbc8116d8,0xbc8ccd7b,0xbc91ab9f,0xbc9b6a6c,0xbc9f8e97,0xbc8007cd,0xbc31a245,0xbbd451fa,0xbb3d8146,0x3a21d071,0x3bb035e4,0x3b5bd844,0x3b21c08d,0x3a983f07,0x3b3f5ff4,0x3b825dac,0x3bbc28c5,0x3bcb8c12,0x3be7633e,0x3c1005ef,0x3a4a9065, +0xbb899a5a,0xbc42c3ff,0xbc571ee6,0xbc9b6c18,0xbcb1e842,0xbc9d4e43,0xbc72d9df,0xbc3f807a,0xbc3df9ba,0xbc324a13,0xbc2ce905,0xbc4dcd4a,0xbcacd54a,0xbc9f176c,0xbc86e43d,0xbc6097a2,0xbc2ea941,0xbbf66057,0xbb859942,0xbaa530fa,0xb96f6c10,0x391ce1a3,0x3a5c9897,0x3ae88d18,0x3b34bfec, +0x3b926831,0x3b95a9cc,0x3ba914c0,0x3bad68d4,0x3bb365bc,0x3bade3be,0x3bbeb837,0x3baaa840,0x3a88ba35,0xba917968,0xbb60e55c,0xbba27eb5,0xbbfa7f59,0xbc13f747,0xbc2723a3,0xbc372bbc,0xbc5bdd04,0xbc82ee62,0xbc92b49f,0xbc99c7e5,0xbc9e157d,0xbca32791,0xbca1be27,0xbc067c6c,0xbc1077b7, +0xbc002635,0xbbe42016,0xbbca77fd,0xbbb6cb99,0xbba4f3aa,0xbb850d2f,0xbb7e1d94,0xbb54028e,0xbb2d3d1c,0xbb068f5a,0xbacbc7df,0xba89363b,0xba953291,0xba90559f,0xba7fd339,0xba746f14,0xba58758e,0xba62b845,0xba396520,0xba864f68,0xba6e5c66,0xbb53d2af,0xbb5077ae,0xbb34a1bc,0xbb52a707, +0xbb74f585,0xbb9258c1,0xbba5e1bb,0xbbb894e0,0xbbd16d42,0xbbedcf31,0xbbfe4cab,0xbbf4b7e1,0xbc03bd6f,0xbb8094b5,0xbb0c8dc3,0xb84e86ea,0x399c9e1d,0xbaebe789,0xbb3be712,0xbb503769,0xbb779738,0xbb5f0316,0xbaa5eb5b,0xbb1f70dc,0xbb2787e3,0xbb139ea2,0xbb3d8e08,0xbb5fc5f2,0xbb9c0425, +0xbb865d81,0xbb642dcd,0xbb1d7aaf,0xbab05058,0xba7fb3fc,0xbab348cd,0xbaeedbef,0xbb0c7041,0xbb1dda83,0xbb2d4b5f,0xbae3f46b,0x3a34ebcc,0x39aee146,0x3a161320,0x39c199c0,0x3a4326da,0x39f9e7be,0xbab2e046,0xb9659426,0xba44355c,0xbab5b146,0xb95bc388,0x3aa42b9c,0x3acb3eab,0xbb3257b2, +0xbb9ce2b1,0xbbb4a5ba,0xbbf21fc2,0xbbd236c8,0xbab18ec4,0xbb519d69,0xbb2efa96,0xbae533b6,0xbb20c43c,0xbba1707b,0xbc14bc35,0xbc11132f,0xbbf1b3fc,0xbb88b6f9,0xba0b16eb,0x3a255ea9,0xba5330e1,0xbb04cc7e,0xbb839f24,0xbb9f1986,0xbb89d7d4,0xbaffa6ef,0x3b76f70b,0x3b29afc9,0x3b4c3375, +0x3b645ade,0x3b50dc7b,0x3b1c0d55,0xbaaee39f,0x3b4cdf92,0x3b324243,0xbb371bf5,0xb90a8000,0x3bff3a52,0x3c24ac60,0xbad12e87,0xbbea74bb,0xbbe9fee6,0xbc46b800,0xbc2bfb43,0x3a83e441,0xbb930a7e,0xbb7c414a,0xbb4dfe3d,0xbbb22858,0xbc13e5c1,0xbc8404b1,0xbc6f444c,0xbc364200,0xbb9ec226, +0x3ae9f2a4,0x3b85d5f7,0x3aba9461,0xbada7711,0xbb98d6bc,0xbbd5b277,0xbbbecbf3,0xbac1b20b,0x3c0742bb,0x3bf9ef38,0x3c123ae1,0x3c123e88,0x3c2bcdeb,0x3c144035,0xb9808a6e,0x3bedb3b9,0x3bbc4590,0xbad73778,0x3bad7482,0x3b9eaf66,0x3c1667b4,0xbb5cdeff,0xbc02c4af,0xbc12e50b,0xbc94aba0, +0xbc82492a,0x3aa62a63,0xbb9829b0,0xbb1784ec,0x3b329d1f,0x3ac79410,0xbc0fefe2,0xbcba63f2,0xbccc057b,0xbca42057,0xbc18c298,0x3b36ff05,0x3bdbd86c,0x3ad41187,0xbb5752be,0xbc01e263,0xbc1b0717,0xbbc0ad59,0x3add5715,0x3c68d8e4,0x3cabd136,0x3cbce668,0x3c635145,0x3c5e089d,0x3c4ea83e, +0x3b9309b0,0x3c8d831e,0x3c8559e8,0xbb343add,0x3a976e6d,0x3d330e38,0x3cd7d093,0x3b66107c,0xbc460d67,0xbcd0fba2,0x3b18c090,0x3bff41e4,0xbc5db6b3,0x3b52d2ce,0xbbcdbb7b,0xbcfc891c,0xbcfc3798,0xbcbc0b59,0xbc12b113,0x3bd8783d,0x3c448592,0x3bef2b8c,0x3c1053dd,0x3c19b7d4,0x3c307ed7, +0x3c58aecf,0x3c3cec45,0x3c0500eb,0x3bcb0404,0x3b1f9da0,0x3bba740b,0xba12b170,0x3c24f74a,0x3d196b51,0x3c802442,0x3b3baeeb,0xb9ebc8c8,0xbca7158c,0xbc9e2269,0x3bdc0078,0x3d179e4d,0xbd8ec1e3,0xbd063134,0xbcb65775,0x3a054a6b,0x3c868d3a,0x3c631c16,0x3ba2dfb7,0xbc50c9db,0xbca864ad, +0xbc42b540,0x3cc2e25a,0x3bb0dae8,0xb94b5c80,0x3b79bcb3,0x3c1ab747,0x3c3fc1df,0x3bacaa0e,0x3a8e22c3,0xbac9d972,0x3aa2a35e,0x3b844dd8,0x3bbb81ad,0x3bc408f0,0x3b0322ad,0x3baed70c,0x3c0e8e20,0x3c9af4e6,0x3c974939,0x3bf217d6,0x3bcafe9e,0x3be39809,0x3c27283a,0x3c8ea9ae,0x3caf557a, +0x3cb947be,0xbd534f08,0x3d5424ec,0x3d532e34,0x3d1af94e,0x3cd38ca9,0x3c402f84,0x3d0306d5,0x3cb78f2a,0xbc9c0ed9,0xbc90973b,0xbc93872a,0xbbf63d1f,0x3a6a4ef3,0x3c3e803d,0x3c8fd0ed,0x3c7fbd80,0x3c0fbbd2,0xbb7f1c41,0xbb431ab1,0xbb71fb84,0xbbb05786,0xbb843318,0xba74c510,0x3ab816a9, +0x3ada3be6,0x3bb7eb19,0x3bd95359,0x3b7b3b79,0x3b69be37,0x3b8045cc,0x3c2b9943,0x3c4e8c5b,0x3c5957b6,0x3c2b2af5,0x3bd2f9c2,0x3c7a9c4c,0x3d2482e2,0xbcd6502b,0xbca2e9d3,0xbc5dc29b,0xbad6ca1b,0x3c11b091,0x3c8b3890,0x3cba9447,0x3ca07a89,0x3cdbf474,0x3cba38c6,0x3c91a167,0x3bf62ddc, +0x37e0327b,0x3a52a74c,0x3bc58f41,0x3c12aa90,0x3bded9b5,0x3b9d58fb,0x3ae4b939,0x3b09052f,0x3ac3d148,0xba364c3b,0xbb9964bf,0xbba91a1a,0xbb66cdd7,0xbb15e64a,0x3a6b716b,0x3b772546,0x3b442217,0x3ae66a20,0xb98c72e2,0x39b1543a,0xbb338a48,0xb9de7b69,0xbb0d693c,0xbc8f72dc,0x3a0b18a3, +0x3c143faa,0x3ad4fe76,0xbb3e56eb,0xbac09634,0xbb8ab591,0xbb9d5c27,0xbbdfceeb,0xbb61328d,0xbb7b5137,0xbbb87378,0x3998cf9a,0x3b3efc77,0x3b1e9cbe,0x3b0aef1f,0x3b2f6752,0x3b570c5d,0x3bb463d6,0x3ba4103a,0x3ac19578,0x3992ea18,0x3989eeb6,0x3b57d23e,0xbb1cdc5e,0xbbae3abc,0xbbf0269b, +0xbc1f51c2,0xbc22863f,0xbbf6a1e0,0xbb986a5d,0xbb8f68fc,0xbb81f379,0xbb5069a4,0xbb93ecb6,0xbbb685da,0xbadedcf2,0xbc4f8485,0xbc073181,0xbb92d55a,0xbad3e55b,0x38c4ea9a,0x399e48a3,0x3a905a8b,0x3b08bdde,0xbb3ab7a5,0xbb39b56b,0x391a37d3,0x3b220ac3,0x3b911282,0x3bd00532,0x39c382f9, +0xba9ded63,0xb9d37707,0x3ab9cb30,0x3b464397,0x3b637be6,0x3ba20e3a,0x3b6e87d2,0x3b182368,0xbba92bb1,0xbc1f2f24,0xbc68b1c5,0xbc6d05d1,0xbc86506b,0xbca0c140,0xbcb9f8ef,0xbcda09ee,0xbcf406d7,0xbd09e6da,0xbd07bd3c,0xbcf4bc44,0xbc9893dd,0xbbc41d5f,0xbb83235a,0xbb8f80e5,0xbbb88a74, +0xbbc9ae93,0xbbfa5a20,0xbc1e7712,0xbc398828,0xbc0b8b0f,0xbbc1c506,0xbb609ca2,0xbb7a6553,0xbb84126f,0xbb6709fb,0xbaff2bd1,0xb9b9691c,0x3a2a36b3,0x3adbcfb6,0x3b2edfe6,0x3b8cf113,0x3b61b752,0x3b4a444e,0x3b7d4ac9,0xbb8da9b4,0xbc3cedc5,0xbca87556,0xbcaec18e,0xbcbae7d4,0xbcc82158, +0xbcb57682,0xbca8c1af,0xbc9c5867,0xbc676e6c,0xbc169edb,0xbba2a3aa,0xbbbb6af1,0xbc5810f9,0xbc23d03c,0xbc1a522a,0xbc101e99,0xbc04a882,0xbbe9f98a,0xbbbe4dac,0xbbae4d6c,0xbb9bc066,0xbba087ee,0xbb9e0bcd,0xbb9101b5,0xbb787ed8,0xbb679848,0xbb737585,0xbb853859,0xbb8bcfa2,0xbb8f1114, +0xbb9a6cdd,0xbb9a13d4,0xbb886f2a,0xbbd47c1e,0xbbf26a63,0xbc04f074,0xbbff11cc,0xbc0d5dec,0xbc0b2c12,0xbc146d92,0xbc1d7b2e,0xbc2c2d8f,0xbc370658,0xbc57b547,0xbc503adf,0xbc60020a,0xbc637689,0xbc4aac74,0xbc032060,0xbc01aa02,0xbc0386c8,0xbbfc7ae6,0xbbf74dd2,0xbbf5c74d,0xbbf58bdd, +0xbbec9de6,0xbbecc23e,0xbbe4334d,0xbbda45ac,0xbbd17674,0xbbcaba7a,0xbbbdde07,0xbbc254c4,0xbbc18fd8,0xbbc1647f,0xbbc28408,0xbbc00f47,0xbbc94cb2,0xbbbc5631,0xbbbc0793,0xbbacd8c2,0xbbee47c4,0xbbe79efa,0xbbdf6c08,0xbbebf8ec,0xbbf614ae,0xbbfaca4a,0xbc02cd15,0xbc05cc65,0xbc05475d, +0xbc00f702,0xbc00a428,0xbc02f112,0xbc028d7b,0xbc0eea5f,0xbb22abf2,0xba7cefdc,0xba8ed250,0xbb1cfecf,0xbb49b27d,0xbb4e0b47,0xbb73575f,0xbb5eaed1,0xbaed6233,0xbb282885,0xbb22f69d,0xbb0bd75c,0xbaed0b55,0xbb0f270a,0xbb7c865e,0xbb7db7e5,0xbb77ce2e,0xbb4d0fd3,0xbb1a0567,0xbb02dbba, +0xbae33976,0xbb26ebf1,0xbb4150a5,0xbb65033e,0xbb4c66be,0xbb25a1c2,0xb9c5a192,0xbad2d190,0xbab387b4,0xb9f1f8ba,0xb9e3001a,0xba3fcec1,0xbb1bc362,0xbaa8a667,0xbac358ec,0xbb4e290f,0xba96d039,0xb989d9f4,0xba7f941c,0xbb5d2401,0xbb9a5719,0xbb9be811,0xbbcad010,0xbbc05005,0xbb2896eb, +0xbb7a7274,0xbb1daed9,0xba4b3117,0x3abd486a,0xb9d1f310,0xbbc76d91,0xbbf29f6f,0xbbf96dc0,0xbbb42bca,0xbb4caaa3,0xbae1e098,0xbaadc41a,0xbb489ff1,0xbb94f242,0xbbbb29fa,0xbba0b67a,0xbb44c619,0x3b431ba6,0x38298d3d,0x3a31ee46,0x3b60688c,0x3b265db6,0x3b07d787,0xba753ffc,0x3b014c7a, +0x3a28bb3a,0xbbaf6423,0xbab290a7,0x3ba71d2b,0x3b767be7,0xbb61791d,0xbbea9d2c,0xbbc9a614,0xbc2662e1,0xbc12a1e0,0xba86210c,0xbb8c1b9e,0xbb0a211f,0xba2e27cb,0x3b15e33f,0xba3237b1,0xbc2c91d0,0xbc429e7b,0xbc3f9e78,0xbbeee705,0xbb3d4992,0xb982a48b,0x39c7f846,0xbb4521a6,0xbbb7cd15, +0xbbee0922,0xbbd608e9,0xbb6b051c,0x3c0222b7,0x3b12929e,0x3b88cf2d,0x3c11ce50,0x3c1f9df7,0x3c046295,0xba474980,0x3b94f3f6,0x3b487688,0xbbbb4871,0x3b7bc0c5,0x3b1a4775,0x3af799a7,0xbbab27cf,0xbbf65b14,0xbbd696cd,0xbc44ef33,0xbc52c474,0xbb6ff500,0xbbd04430,0xba6cbfd4,0x3bbb6d16, +0x3c63a34d,0x3bc9d029,0xbc5a42a2,0xbc9be363,0xbca388de,0xbc549693,0xbb93a9a2,0x3a211d8d,0x3aead02e,0xbb82debc,0xbbfa259d,0xbc19006b,0xbc0b3bbb,0xbb1f11ae,0x3c64252e,0x3c694506,0x3c82fc42,0x3c6db8f7,0x3c813b8a,0x3c6eb061,0x3bc4fa75,0x3c88c88f,0x3c348f5d,0xbc30e81f,0xbb177f79, +0x3d1bb376,0x3c7eb9c7,0x394e13bf,0xbc6ee2dd,0xbcd35423,0xbc2d9a78,0xb9426f71,0xbb0225fe,0x3bccf886,0x39a4d0cc,0xbc8f3a5d,0xbcd2d325,0xbcbbc9cd,0xbc745eaa,0xb688d50c,0x3bd75365,0x3b8684f4,0x3b857fa0,0x3b8fdc8a,0x3c005f9f,0x3bf3eeef,0x3bacf36f,0x3b04ab0d,0x3bd85303,0x3b490417, +0xb9d03563,0x3a1324aa,0x3c1b1f5e,0x3ccf5b66,0x3c0becda,0xbaf5aee0,0xbc283eff,0xbce0244f,0xbc9650eb,0x3c670a62,0x3d19dce2,0xbd6aa958,0xbd08185b,0xbce09786,0xbb0a2e3a,0x3d0a7445,0x3c708858,0x3b254ede,0xba95d9d2,0xbc956755,0xbc4753e8,0x3cad9296,0x3bb13ca4,0xb9b5ebb4,0x3b03c2f4, +0x3b40190d,0x3b3a1b88,0xbb1a6e92,0xb9ed8426,0xb9196fcc,0x3a4c9e48,0x3b69d70e,0x3bcff4db,0x3bac90d9,0x3ac7bc52,0x3ba9008f,0x3c321331,0x3c73881d,0x3c438127,0x3b2b7a29,0x3af1c404,0x3b90b1ce,0x3c6f09f9,0x3cde4f49,0x3ca7917f,0xbc2847f6,0xbd448e98,0x3d2aa723,0x3d41aadf,0x3ccd772b, +0x3b993da5,0xbc3b894f,0x3c8dcc97,0x3cc205e9,0xbaa1a626,0x399b4d11,0xbbea2630,0xbc668b76,0x3b7a1e40,0x3c756f19,0x3c99294c,0x3c8b637d,0x3c372625,0xbaaa4dce,0xbb1ff6ee,0xbb2ca9d4,0xbb56730c,0xbb76b1a3,0xbab49eeb,0x39b2e180,0x3bbf1c25,0x3be2af41,0x3af37d5b,0x3a96173a,0x3adaf2cb, +0x3b10910b,0x3c38fe38,0x3c70ca24,0x3c935715,0xbaa8b5bd,0xbc20dcc7,0x3b8c9d99,0x3cf7e6e5,0xbccdd9a1,0xbcc16fc8,0xbc9b5d8c,0xbc0204b1,0x3b048157,0x39eaf3be,0x39d050df,0xb984391e,0x3cc10c8d,0x3ce9d6ee,0x3c8b0c64,0x3c8a5fad,0x3c3ec27a,0x3c196d12,0x3ba307db,0x3bb71179,0x3b5bd71d, +0x3a48a20b,0xbb2e6d3a,0xbb9e07cc,0xbafdb600,0xbb2ec1f6,0xbbf4e5e3,0xbc07018d,0xbbc301c1,0xbb13e43a,0xbb93de7d,0xbb4a551b,0xba1a9cea,0xbb1a8820,0xbb14be20,0x3ab0f36f,0xb6d3b1f9,0x3a0687f5,0xbad3e117,0xbc8d595f,0x3c44c504,0x3c9aa0b8,0x3c87c524,0x3c4ce62c,0x3c1d4012,0x3bd259b8, +0x3c2a4d3a,0x3c91b0c8,0x3bf20d18,0x39788988,0xbbe2822b,0xbb899ecd,0xbb03ca34,0xba01a87e,0x3adcdeac,0x3b6160ee,0x3ba5736c,0x3bc4f40c,0x3bac35da,0x3ade3508,0x3ad5cb2f,0x3a18e19c,0x3a900319,0xbb5f6c11,0xbbdaa304,0xbbd4fad3,0xbc123eae,0xbbd5015a,0xb9fef3ef,0xb9e1acde,0x39f2f891, +0x3b311d27,0x3b9b03e2,0x3bd1b7c6,0x3bf893ab,0x3c184596,0xbc9dcf1c,0xbc3f0de7,0xbc25463e,0xbbe03fac,0xbbbd594e,0xbad0b0f4,0xba0dfe02,0x3890645d,0x3a418e02,0x3b4c03d0,0x3b8b5ef7,0x3bc8fa52,0x3baef64d,0x3b86b476,0x3aa86b71,0x3a42c3dc,0x3ba266f5,0x3b889531,0x3b934f85,0x3b8f355e, +0x3bb4c1e2,0x3b0acea5,0xbba25c72,0xbc19f6c3,0xbc3146aa,0xbc2a94d9,0xbc2e73f6,0xbc55ffa8,0xbc86510d,0xbca0cee6,0xbcb3d15b,0xbcb414ac,0xbcf48340,0xbd03da4d,0xbcfb8c3d,0xbccf608e,0xbb1ed68b,0x39bcf784,0x39dae0a1,0x3a9b088a,0x3b0fcfc1,0x3ae07369,0x3ad2a805,0x3a9e8d58,0x3aca2b75, +0x3abf0c1e,0x3b02e464,0x3a6c701a,0x38753a38,0xba465c1b,0x3aa4afec,0x3b35b49a,0x3b853404,0x3b84e1dc,0x3b9c626a,0x3ba8f979,0x3a97c717,0xba86f57c,0xbb41a1dd,0xbbde06fd,0xbc47755f,0xbc8b69ff,0xbca024ec,0xbca10c64,0xbcb6384d,0xbca8516c,0xbcabc25e,0xbcaa5119,0xbc7ccad8,0xbc2c1ac0, +0xbbd98fd0,0xbb9e6d84,0xbbf86341,0xbbc7f62b,0xbbcba560,0xbbd03fd1,0xbbd393dc,0xbbd253f5,0xbbcf2443,0xbbceae8b,0xbbb55f1d,0xbba04089,0xbb8ed6e8,0xbb7773a4,0xbb42a9bf,0xbb2623f5,0xbb3b3c18,0xbb574674,0xbb65b6c4,0xbb69b7b7,0xbb79495b,0xbb669bf7,0xbbb5525d,0xbbb581e9,0xbbd71bed, +0xbbeb80f8,0xbbe46f42,0xbbdd582a,0xbbc0d591,0xbbb95d8e,0xbbbda90d,0xbbb64531,0xbbb2594e,0xbbc2d395,0xbbcd438e,0xbbed914b,0xbbf019e5,0xbbddf20e,0xbbc6a2a8,0xbb9ab6c8,0xbbaa65a6,0xbbacbeae,0xbbb23b8a,0xbbb6884e,0xbbbb79dd,0xbbc3d5f2,0xbbbc6c42,0xbbb77e54,0xbbb0b296,0xbba8e75c, +0xbba425f4,0xbb987439,0xbb9e4c7e,0xbb9e7e47,0xbba0001b,0xbba0fe19,0xbba3f0fd,0xbb9b887e,0xbbc67a38,0xbbde3c3e,0xbc012247,0xbbd51b8e,0xbbfdcb3b,0xbc161080,0xbc133ab3,0xbc11715b,0xbc0a183a,0xbc090444,0xbc04c68e,0xbbfd2413,0xbbe23d5c,0xbbbf853d,0xbbf7f6df,0xbbd94063,0xbbe1e8bf, +0xbaf84b17,0xba702d5e,0xbaa6350f,0xbafc28d5,0xbb17192d,0xbb17cb53,0xbb3878ae,0xbb2e9b61,0xbb067d57,0xbaf2f1fa,0xbac3e213,0xba8457bc,0xba17fe27,0xba75d13d,0xbb1daf39,0xbb3d9200,0xbb4c535c,0xbb3c0a90,0xbb1be0fd,0xbb088b40,0xbacfe6b3,0xbb1f6548,0xbb37a65d,0xbb673506,0xbb25b8bb, +0xbb06636a,0xb9cae2dc,0xbaedebfe,0xbac8e876,0x394efc03,0xb9e814ff,0xba4af879,0xbad69a9f,0xba98da2a,0xba8cbd12,0xbb355126,0xba810bfe,0xb9878f36,0xbaa33960,0xbb1570b6,0xbb4f9dfd,0xbb45b571,0xbb908e78,0xbb9dbeb1,0xbb709f43,0xbb4ed796,0xba92c9fa,0x3a892c72,0x3b626b98,0x3b125744, +0xbb338dea,0xbbac089a,0xbbd7a8f5,0xbbb8f550,0xbb92c10c,0xbb58be2b,0xbaff4e23,0xbb5e7a0b,0xbb952ad1,0xbbc90d06,0xbb87ef97,0xbb1fb085,0x3b0f6bf0,0xba1c5b34,0x390b674e,0x3b8ba163,0x3b1c822c,0x3b08a130,0x3a6f73ae,0x3adee32a,0x397bb802,0xbb85e063,0xba1f5440,0x3b58e786,0x39d9015a, +0xbb1bf3f7,0xbb9d3730,0xbb87403c,0xbbfd7b93,0xbbee0604,0xbb8d60bc,0xbb337878,0x3a5d707e,0x3b2d0bf5,0x3bd4ef7c,0x3b856099,0xbbaa74fd,0xbc0899d5,0xbc293ffb,0xbc070cee,0xbbc46b2c,0xbb81377b,0xba9e0f07,0xbb8c8939,0xbbd06c3e,0xbc0beecd,0xbbb024b4,0xbb5559d2,0x3bea3feb,0x39bc69ec, +0x3b339331,0x3c33d611,0x3c0eee83,0x3be8446b,0x3abb467a,0x3b57e12e,0x3b1cc813,0xbba2f117,0x3b6e30d5,0x3b3bde1a,0xb978d7ac,0xbb101e3c,0xbb76ca6b,0xbb399a6a,0xbbea337b,0xbc34d0af,0xbc19bc50,0xbbc2362d,0x3ac22436,0x3c0a91c2,0x3c9482bf,0x3c656ec7,0xbb826b88,0xbc4d25e4,0xbc8d6786, +0xbc72bfd6,0xbc2f5350,0xbbc9ddf4,0xba58e321,0xbb930486,0xbbf63974,0xbc1fd558,0xbc04878c,0xbb798686,0x3c5a9412,0x3c0d484e,0x3c27775d,0x3c91cb26,0x3c94a649,0x3c7e7974,0x3c12672b,0x3c6a3279,0x3bd867b6,0xbc31d88f,0xba614399,0x3cc18d93,0x3b449bab,0xbb4f7c5b,0xbc578426,0xbca31990, +0xbc8e159f,0xbb85a2ad,0x3c25f15d,0x3c1963b3,0x3beb4ded,0x3a1e909b,0xbca5c6da,0xbcb8f095,0xbc683cc1,0xbb81cf19,0x3b0ab867,0x3b4f31bc,0x3b00a97e,0x3a1e1796,0x3add8f1d,0x39b9888a,0xb9a08ae4,0xbb113884,0x3be44b14,0x3b97f56d,0xbba010ef,0x3bb01cb2,0x3c34538a,0x3c1abfd3,0x3b8f645d, +0xbb594456,0xbc71f392,0xbcc5003a,0xbc2b67c3,0x3c993e72,0x3cf64da2,0xbd20d95c,0xbc978f8e,0xbcb4c29d,0x39b9d271,0x3d3eb787,0x3c9e7d06,0x3bb00b47,0x3c2ef73c,0xbc594050,0xbc3a94d3,0x3c2aa0a7,0x3c028cd2,0x3b8c4701,0xbaece084,0xbb661d1f,0xbba217e7,0xbba5c135,0xbb1e3c3f,0xbab9e017, +0xb7d130f2,0xb9863dcf,0x3b01bf00,0x3b81fd96,0x3b19b2a8,0x3bce92f9,0x3c2f55ab,0x3c1d82e1,0x3b946e9c,0xbb5e050f,0xbb37216f,0x3b826621,0x3ca6a394,0x3cfa812d,0x3c4db1e1,0xbd073aca,0xbd207982,0x3ca3a241,0x3d418858,0x3c34118c,0xbc92c4e9,0xbd0dd668,0xbcd63096,0xbb3af142,0x3d080e62, +0x3c4a6322,0x39383130,0xbbaa3a40,0x3b8715d7,0x3c2f0942,0x3c60eff6,0x3c5748f7,0x3c1df2d9,0x3b7fd4d2,0xbac8e090,0xbb206757,0x3a42e638,0x39dfa462,0x3a7c5cb9,0x3a3a82ad,0x3be54315,0x3bbc4059,0x3942d092,0xbadb44e6,0xba270a96,0x3a7fc4e2,0x3c2e460d,0x3c40d629,0x3c200ccf,0xbc2e70dd, +0xbc903a3e,0xbb84ccd8,0x3bf6ebfa,0xbc7b57e2,0xbccdf0fd,0xbc93146b,0xbc1a1695,0xbbb94198,0xbbf6976f,0xbc0019d9,0x3b0daf14,0x3c6c7aae,0x3cbe0f6c,0x3c8c6ee5,0x3cb73d91,0x3ca4a283,0x3c5cd4cd,0x3b8e4b98,0xba10ecb4,0xbb00d461,0xbba4e9fe,0xbbde729b,0xbc0a10e3,0xbbe3fa87,0xbbd3ac39, +0xbc030f2d,0xbc0f84aa,0xbbe1e2b9,0xbb213bf9,0xbbbf7dda,0xbbb501de,0xbb17a71c,0xbb4b0ced,0xb98bd94f,0x3aefc024,0x3b83555f,0x3b3112e4,0xbb1d4ff6,0xbc0161d9,0x3c706035,0x3c90eb1e,0x3cd7bc60,0x3ceaa325,0x3cd454f7,0x3ca72248,0x3ca351e2,0x3cc98780,0x3c7ee752,0x3c0ccf75,0xb9ee71d8, +0xbb8bf647,0xbbbd5053,0xbb82a2ec,0x3989be1d,0x3b2c5c26,0x3b7cc620,0x3b9aff14,0x3b90a1cb,0x3b1c1846,0x3b0ec83a,0xb950fc76,0xbb592974,0xbb9c9983,0xbbdb1320,0xbbde19ad,0xbb87693f,0x39a6ab37,0x3b90d5f0,0x3ae84f8f,0x3ac85832,0x3b29452d,0x3ba85660,0x3c056d67,0x3c24ab2b,0x3c318761, +0xbcb75757,0xbc677dd1,0xbc6d2a29,0xbc411982,0xbc16c056,0xbb86df3e,0xba6bbd3d,0x3b141ab0,0x3b65bc7d,0x3bb70e37,0x3bfaf3d3,0x3bf622d5,0x3bd5703d,0x3b85bf6a,0x3b819777,0x3b9de9d7,0x3bd523b1,0x3bbe08a3,0x3ba7cd67,0x3b9bd0b4,0x3b005e37,0xbb1a5281,0xbc10b917,0xbc1ef962,0xbc1c0acd, +0xbc00bd6a,0xbc0aa1d6,0xbc2c10a3,0xbc3e38e9,0xbc69b649,0xbc797570,0xbc61d973,0xbc9e37d5,0xbcbd2057,0xbcdb9292,0xbcd868af,0xbb9a1192,0xba8fba09,0xba152602,0x3a6f02d9,0x3aff27bb,0x3b3f31e6,0x3b96bc9d,0x3bd5d286,0x3bdebe75,0x3bdc1709,0x3be1b19b,0x3bbe1104,0x3bae0edc,0x3b9f91ba, +0x3bb4535e,0x3bbd4b6c,0x3bcaf1c8,0x3bbae64e,0x3baddbf7,0x3bbd25ce,0x3aac36cb,0xbb388239,0xbbe5f2ed,0xbbe46506,0xbc0de3c2,0xbc146639,0xbc507fd3,0xbc62026e,0xbc8ef946,0xbc8e6cdd,0xbc9d499c,0xbca8cf92,0xbc906b8d,0xbc730815,0xbc5315b6,0xbc086f51,0xbb81f58e,0xbb295a9d,0xbb4622d8, +0xbb55c7ff,0xbb5ed995,0xbb7166a1,0xbb8cfdc7,0xbba0e89b,0xbb97bf6c,0xbb84eda1,0xbb5bad74,0xbb24e75e,0xbaf03495,0xbab75447,0xbaabfe3e,0xba9a0f54,0xba7dee4a,0xba2e8bd9,0xb9f8c40e,0x388913b4,0xbb102cb0,0xbb008c9e,0xbb3c3561,0xbb6f2249,0xbb91587e,0xbb930399,0xbb87f0b3,0xbb809b18, +0xbb8bef28,0xbb849867,0xbb8850dc,0xbb8f6de6,0xbb8840a5,0xbb87021f,0xbb7bf017,0xbb66ea80,0xba4ee00f,0x39dfb298,0xb96d6cc9,0xba10c43e,0xba7fe717,0xbaa89440,0xbac1713f,0xbaedc0bf,0xbabb1d16,0xbaac98a4,0xbaaa88d2,0xbaa69055,0xba9d6365,0xba820e7a,0xba748d14,0xba5a4854,0xba49ce6c, +0xba2db244,0xba239f6f,0xb93ce16d,0xbaa8d20c,0xbaedbc39,0xbb42124a,0xbacc2530,0xbb243a63,0xbb819151,0xbb7e94d9,0xbb800e8d,0xbb6bbab7,0xbb707876,0xbb66b968,0xbb661a25,0xbb28284b,0xbad12980,0xbb2c1b05,0xbac3a141,0xba174c3e,0xba8d036e,0xb9f58d73,0xba551fa5,0xba8342e8,0xbaa846e7, +0xbac8648e,0xbb088ff6,0xbb050585,0xbaed0141,0xba74c667,0xb9e435f4,0xb91b7e16,0x39452ecb,0xb861b3f9,0xba2f71db,0xbad69e3b,0xbb0704d5,0xbb0dffed,0xbb00cab2,0xbaedea50,0xbab5070f,0xbb03e137,0xbb151d35,0xbb50c52b,0xbabc4209,0xba94758d,0xb9d4e912,0xbaa1f734,0xba74f784,0x3a2bba33, +0xb99c6654,0xba1a576b,0xba13bb83,0xba1910d0,0xb9a702c1,0xbabf98fd,0xb9e62297,0x3a89a307,0x38ee63e4,0x38eda414,0xba4a3c58,0xbab8d3cd,0xbb6106fa,0xbb8be66c,0xbb7309f1,0xbaec1b94,0x395fc2e8,0x3ae5eb81,0x3b78a458,0x3b677555,0x3a8a16fc,0xbb2bdfce,0xbb99e368,0xbba330e1,0xbb9f7960, +0xbb8d6e7c,0xbb468cfe,0xbb81b90a,0xbb90cede,0xbbc29da9,0xbb236bc1,0xba807411,0x3a84ce9d,0xb9231251,0x39cb2c2c,0x3b811086,0x3af41b60,0x3aef143c,0x3b26d91f,0x3b005d30,0x3a8463c1,0xba6f8278,0x3a9cca51,0x3b39e99d,0xb7eacf30,0x39920561,0xbadf2dcb,0xbb31762d,0xbbe6e467,0xbbe6ac7f, +0xbbb87062,0xba456332,0x3b4e0a13,0x3b64fb94,0x3be60c8f,0x3bbe3257,0x3ac2b619,0xbb8a4dc2,0xbbf57a8a,0xbbf9481f,0xbbf2f4e3,0xbbd383f7,0xbb6edff5,0xbbb90630,0xbbda6d49,0xbc15f7da,0xbb3107b9,0xba9cc596,0x3b9cdf98,0x3a84cfbb,0x3b396c5c,0x3c30ffd0,0x3bc92c54,0x3bad69b3,0x3b7e010e, +0x3b52bf44,0x3b5a959d,0xbaaba122,0x3b7d7799,0x3bd5913f,0x3b48a666,0x3b8c8004,0x3b216783,0x3a67ed14,0xbbb4a927,0xbc30a467,0xbc330f22,0xbb57884e,0x3b57d160,0x3bf0edbf,0x3c8399ad,0x3c8e8469,0x3c028c19,0xbba322a6,0xbc4f3b1e,0xbc68cd13,0xbc6b5927,0xbc469b4b,0xbbd3fb04,0xbbf7a629, +0xbc11bc3f,0xbc3dac95,0xbbafd114,0xbaf183d6,0x3c364dd5,0x3bc10122,0x3bf67f4c,0x3ca63c2f,0x3c9a9b25,0x3c7b43db,0x3c47853c,0x3c4b4d8f,0x3bc091c6,0xbb93f8d0,0x3b81f61c,0x3ba6c029,0xbc093746,0xbc04dfec,0xbc627b55,0xbca2f3c9,0xbcaed35a,0xbc06b5a3,0x3c4fb9e7,0x3c250860,0x3c31403c, +0x3c5be2d5,0xbc5e21a5,0xbcac14b4,0xbc807cc2,0xbb99aa76,0x3abde91e,0x3b540f6b,0x3b76df7a,0x3ad7ad4c,0xba1feab0,0xbb35eae1,0xbb0877c7,0xba3cc2d4,0x3bbec11a,0x3b9dc1c1,0xbbc321b1,0x3c3dacfc,0x3c6813bd,0x3912fe06,0x3a2ba84d,0xbbd6b4b2,0xbc711936,0xbc7f9a70,0xbaefa868,0x3c956357, +0x3c7069ac,0xbc96f6b8,0xbadf83c2,0xbc289790,0x3bcb4073,0x3d392ccb,0x3cd660eb,0x3c59b77c,0x3c6b6c21,0xbc0aadcc,0xbc1f9d00,0x3aa2da05,0x3c672d10,0x3c548b7f,0xbb9a9c6d,0xbbd5ae0c,0xbc0c5234,0xbba40f19,0xbb8edc74,0xbba01e66,0xbbb86654,0xbbbece5c,0xbb5da114,0x3b52122e,0x3b1bdf44, +0x3bc61751,0x3c063a4c,0x3b8d68c9,0xbb043f80,0xbc08ced2,0xbb1d3815,0x3bdd820d,0x3c9e513f,0x3caafc0b,0xb8ff26a3,0xbd0ed87c,0xbcda921e,0xb9434587,0x3d007104,0xbc1b1fa6,0xbd029eaf,0xbd24ffde,0xbd50b66f,0xbcc47d7b,0x3d2e33d5,0x3c738534,0x3bb6a6d7,0x3be3b49c,0x3b4183ee,0x3b7ff2d6, +0x3bfedb86,0x3c26a9a1,0x3c1a7e8f,0x3c113de7,0x3b279ed0,0x3a7913e6,0x3b91cd99,0x3b73518b,0x3b497a64,0x3b1208e8,0x3baaa687,0x3b2c2e3e,0x39d2a96d,0xbb611542,0xbb0e8955,0x3b026ae9,0x3bd39b62,0x3b5c7499,0xbb541bfe,0xbc16bc77,0xbc45da55,0xbb85fedd,0xbc37e421,0xbbbe7dee,0xbc909ad1, +0xbc24d044,0xbb8a0a57,0xbb7b929f,0xba398062,0xba41b81c,0x3c1a6fcf,0x3be2a90e,0x3c7f3263,0x3caddda7,0x3cb5c066,0x3ca78254,0x3c6c89e9,0x3bacfb01,0xbb69b769,0xbbe30a19,0xbc176bd9,0xbc1eedac,0xbc0d666b,0xbc222a14,0xbc157f81,0xbc027b0e,0xbbda4d22,0xbba44703,0xbb42aa00,0xbb61a971, +0xbb8979f8,0xbb68f2f9,0xbb5e0399,0x3a5c266e,0x3a6604eb,0x3b367e3b,0x3b0e9d13,0x3ae137a0,0x3a2f5dda,0x3bd8ff12,0x3b111ed1,0x3c86d323,0x3cc4451b,0x3cc9dcb9,0x3cbd2608,0x3cb0064a,0x3cb79342,0x3c9a356c,0x3c74fc46,0x3c3679f1,0x3b71247e,0xba72058f,0xbb478df0,0x39512664,0x3b3947c8, +0x3b8fa7a5,0x3b791bc0,0x3b61337e,0x3b6e0a23,0x3ab434ef,0xbb17195f,0xbbe116ef,0xbbf5d3ac,0xbbe348c6,0xbbbc76ee,0x3aa1e661,0x3bb6ee9a,0x3baa9bdc,0x3b2efc37,0x3b01a0fc,0x3b04131c,0x3bd42e97,0x3c165d7c,0x3c054e2b,0x3bc1e4e1,0xbc82908c,0xbc454b11,0xbbe9b45e,0xbb76c2a2,0xbb0fb35b, +0x39bc29ad,0x3af7710a,0x3b60179b,0x3ba19a76,0x3bb770a8,0x3bce093a,0x3b907a4a,0x3b952030,0x3b918400,0x3bb7aa6a,0x3bb7aa61,0x3b9f35ad,0x3b9ba2ce,0x3b3d877c,0x3aa52823,0xbb564ae0,0xbbe16aea,0xbc1c8b5f,0xbbebe229,0xbbd8394d,0xbbfd4bd0,0xbc04ffc8,0xbc098270,0xbbbed4c7,0xbbcbd052, +0xbbbb2fb0,0xbb914388,0xbbcf07b4,0xbc27e115,0xbc8b583c,0xbc8b8b5b,0xbc08ede4,0xbb975553,0xbb901fdf,0xbb6c4fc4,0xbb452acc,0xba9bd7ba,0x3aac71ab,0x3b880d05,0x3bb5dd19,0x3bd2f764,0x3befcfed,0x3be07a8f,0x3bd688e5,0x3bd366ed,0x3bc319cd,0x3bb801c5,0x3bacd305,0x3b7836d1,0x3b02defb, +0x3aa2088c,0xba148516,0xbb4e9ddd,0xbbc925d5,0xbbc495d3,0xbbcc47ad,0xbbbf6653,0xbc041b14,0xbc1ca6a2,0xbc4a2833,0xbc66277a,0xbc87744d,0xbc9b4e3b,0xbc9587e8,0xbc916bc8,0xbc915653,0xbc4a7a27,0xbabbd0cf,0xba630eae,0xba7e89b8,0xba14117d,0xb9823b66,0xb9bf5a7f,0xba7579db,0xbac170ef, +0xbacf02ea,0xba9dd36e,0xba12337d,0x390f20f9,0x3a50eed1,0x3ab353e9,0x3ad615c6,0x3afbc124,0x3b17d53e,0x3b2b49cb,0x3b486a29,0x3b64928d,0x3b02dd3b,0x3a7c6aa3,0x37e22f5d,0xba6cbdd0,0xbb17f007,0xbb622b0d,0xbb7488a1,0xbb789147,0xbb84203c,0xbb885cd2,0xbb93df80,0xbb9b211e,0xbb790546, +0xbb34ce81,0xbb0f87eb,0xbb0663a1,0xba174361,0xba09cd38,0xba2c2573,0xba6d0ee8,0xba972281,0xba9ec8b2,0xba8f5add,0xba8757a5,0xba3ca350,0xba2eb4f2,0xba44e25c,0xba4654f4,0xba3fc5ca,0xba2441d3,0xba072a4d,0xb9d264e9,0xb9aa2f29,0xb90b696c,0xb7b5c41a,0x39a22004,0x389016d2,0x37bc7168, +0xb907bcab,0xba6d1ba1,0xba7c5935,0xbaa1f328,0xbab0d509,0xbad49dd2,0xbae5c1a7,0xbb01d7d4,0xbb052fb8,0xbb1d2b9c,0xbb0fbbbe,0xbb0dfe15,0xba6c06e5,0xba4d9939,0xba9fe2e5,0xb9bd89be,0x38985102,0xb9a88def,0xb8e98215,0xb9b750f6,0xba3e2e10,0xbac4e1d5,0xbac8c17c,0xbaa71c57,0xb923cdfe, +0x39acde17,0x3932a4ba,0x3a1a1659,0x3a18c956,0x3a7f2e80,0xb9bb22eb,0xba713343,0xbabd45ce,0xbab219e7,0xbab2b4b5,0xba96b339,0xbab4647a,0xbab5f96e,0xbb0da0f2,0xb953cd62,0xb8edcdc6,0xb9c49bc7,0xb9dbf00d,0xb9950d2c,0x398f4f31,0xb9c5fb82,0xb9fdc933,0x39a34f88,0xb93371b1,0x390c9c07, +0xb89c45df,0x394f1958,0x3b1a102a,0x3ab7fbd3,0x3b2444c2,0x3ade4171,0x39b57b3b,0xbb2cf655,0xbb6f083b,0xbb3ab99e,0xba08e0f2,0x3a7f8c73,0x3aa3b627,0x3b5d26ad,0x3b899f8d,0x3b96b394,0x39aabb10,0xbb11cece,0xbb822f01,0xbb903880,0xbb9175b7,0xbb6dccff,0xbb808a43,0xbb6adde2,0xbb8d8fc8, +0xb9e281c7,0x3a48a75d,0x391757f9,0x3a19325b,0x3a164797,0x3af44b6e,0x3a2b2341,0x3a77f040,0x3b51e673,0x3adb7c52,0x3ab22579,0x3ad02cf3,0x3b1b0172,0x3b415316,0x38c93e4a,0x3b2a0c8e,0x3a916248,0xba50706d,0xbbcbc6ce,0xbbd8e645,0xbba97f99,0x3a864495,0x3b8d1ef0,0x3b1f04cb,0x3bc483e0, +0x3bcbfe28,0x3c026202,0x3980b809,0xbb72dc33,0xbbd1d8a3,0xbbe257ba,0xbbe6b88e,0xbbacdd0f,0xbbbe898e,0xbbadedd9,0xbbe05178,0x3a68a758,0x3ac1e30e,0x3b1c706e,0x3b1e61c7,0x3b274849,0x3bc6efd2,0x3af9e2e0,0x3b0997d2,0x3b9b3419,0x3b0c2be6,0x3b5b5c85,0x3b1ddda2,0x3b805e46,0x3c13242b, +0x3bb7fd46,0x3c29fd03,0x3c13a78d,0x3bafe42a,0xbb806f26,0xbc17bf51,0xbc17a2d5,0xb9eb9ae9,0x3b7eeda8,0x3b6ab813,0x3c4645b3,0x3c950fb2,0x3c9c8078,0x3b697c78,0xbbd1c821,0xbc4c0aec,0xbc6fb325,0xbc6ea31c,0xbc2c5e3b,0xbc1c9f39,0xbc134b44,0xbc33f01d,0xba6a213d,0x3b134fce,0x3c08094e, +0x3bb3e566,0x3bd94766,0x3c935975,0x3c84d6eb,0x3c5afe85,0x3c68d13c,0x3c1bcc58,0x3bb092e3,0x3b1e0a45,0x3bf7aaf2,0xbbded065,0xbc640e69,0xbc656d64,0xbc8de2df,0xbcb43a50,0xbcb2a1f6,0xbc31e803,0x3c43f8da,0x3c207585,0x3c456db2,0x3ca7047a,0xbbd46fc7,0xbc9557f7,0xbc8d1517,0xbbce35b7, +0x3a9b5fa5,0x3b9c3292,0x3bf356ee,0x3bc2a4bb,0x3a40fab0,0xba3f3c01,0x3aa182f9,0x3b9d8cde,0x3b87297d,0x3b632468,0xbbae692d,0x3c7a305c,0x3c8533d8,0xbb0271a1,0xbb46a821,0xbc375b53,0xbc71a2d7,0xbbe5f449,0x3b9cf9cd,0x3c62095c,0x3b3073d1,0xbb90133c,0x3c151a50,0x3be82c24,0x3c63a27b, +0x3cf81933,0x3ce81fd1,0x3cac8dc6,0x3c492c22,0xbb90f0fa,0xbc01affd,0xbb37d7c1,0x3c8eac78,0x3ca3c275,0xba26a71c,0xbbb5f4e2,0xbc154d2c,0xbbacdf38,0xbb9cdb92,0xbbb81562,0xbc1801c6,0xbbe4e05e,0xbbacdda9,0x3a67b1b7,0x3a7a64a6,0x3b80e757,0x3bba0c0e,0xb9c91cd4,0xbbe233cb,0xbc208ae3, +0x3b04883d,0x3c26740b,0x3c4d0d1b,0x3bce3271,0xbc4ee006,0xbd00aecb,0xbc987a90,0xbc3012aa,0xbc2a6234,0xbd0f6b15,0xbd1d0d01,0xbcea005e,0xbd379a1e,0xbd0203e4,0x3c1d52fa,0x3c87fae8,0x3c94fc0e,0x3c37119c,0x3b6ace07,0xb9023a82,0x3b252424,0x3c041a35,0x3c25c91d,0x3c299cc0,0x3bedfa0d, +0x3b871dd2,0x3b1f7f73,0x3b4b8c78,0x3b26430b,0x3b46cf45,0x3afcbfbe,0xba56de11,0xb9c58bf8,0xbb5bc31b,0xbac37e88,0x3b61c6e4,0x3a214cfb,0xbb9df0d4,0xbc3e1004,0xbb600a7c,0xbb1b5578,0xbb4bf865,0xbc3ce792,0x3b4b2715,0x3af5d956,0x3bdcac5a,0x3bfa667d,0x3bd947a9,0x3c04936c,0x3bd86de2, +0x3bd5389e,0x3a8af283,0x3bd88ec1,0x3c922019,0x3c900d46,0x3c89d5a0,0x3c620801,0x3bad6312,0xbb1ee29f,0xbc04d968,0xbc1e1a01,0xbc25a3af,0xbc101e4f,0xbc23fd08,0xbc217070,0xbc041149,0xbb86e5d2,0xbb00e840,0xbb36879a,0xba19a0bd,0xbaf0b69b,0xbb8805a6,0xbb3cb8e8,0x3a454a92,0x3a64a0d8, +0x39d8e2a3,0x3b0e02e7,0x3c0ec85e,0x3bb129dd,0xbb94f671,0xbc55501a,0xbbd377dc,0x3963f7e5,0x3bc2081d,0x3c863158,0x3caade03,0x3ca92344,0x3cab716a,0x3c9f83d1,0x3ca6ff4b,0x3c59a208,0x3c0835c1,0x3b77eb73,0x3b758107,0x3b820eb2,0x3b4b9610,0x3b5d6610,0x3b19ee82,0x3af07166,0xbac747b1, +0xbbb65c8c,0xbc0e4711,0xbc17eca7,0xbbd76576,0xbb25d97f,0x3b51ee2f,0x3bc6d6de,0x3b87c97a,0x3b951c71,0x3b925075,0x3b7eaa23,0x3bf7ed64,0x3bfbce97,0x3b4ca03f,0xb9a06548,0xbb76232b,0xbace3c9e,0x3bd68fae,0x3c234bcb,0x3c3598f0,0x3bfe761e,0x3baca443,0x3b91e126,0x3b6eeb9d,0x3b35e4ec, +0x3b149b93,0x3a2d3134,0x3abcbfef,0x3b430049,0x3b95e589,0x3b8f3290,0x3b10adb0,0x3b03914a,0xba2b90c2,0xbb7de9f3,0xbbebffb7,0xbc0e408b,0xbbe6cb26,0xbbc9444e,0xbbc8e170,0xbbfb4191,0xbbe136a4,0xbba0c83f,0xb9894bea,0x3aee5a8a,0x3b6dbaf9,0x3b9203a2,0x3bb1cffb,0x3b80e93f,0xb9a70eb6, +0xbadfb8dc,0xbc3d5bcc,0xbc16ca4b,0xbc05b688,0xbbe09782,0xbb9afa24,0xbb301524,0xb9f31342,0x3ab68bdb,0x3b269f74,0x3b604a91,0x3b8192b2,0x3b76618a,0x3b5fdf8b,0x3b50bbf8,0x3b3bc7d0,0x3b50f7c5,0x3b7a0319,0x3ab1188d,0xba9fdb41,0xbb4132be,0xbb33deb1,0xbb822556,0xbbaecf98,0xbbbb490b, +0xbbbc697f,0xbbcd4370,0xbbdfea85,0xbc02c3e9,0xbc18c4b3,0xbc3e79cd,0xbc606470,0xbc82a4b2,0xbc89cdda,0xbc95a66b,0xbc9f67c3,0xbc74c2aa,0xbabd8b4d,0xba937a09,0xb9d21fea,0x3a0d5cd2,0x3a8c48f4,0x3aad51d5,0x3ac55cde,0x3b0401e5,0x3b013235,0x3b0cf968,0x3b2347c5,0x3b2ece80,0x3b3d2bf6, +0x3b4863f1,0x3b36478d,0x3b138752,0x3afcd42f,0x3ad75573,0x3ad3598a,0x3ab678fb,0x3ac12b9b,0xb9265d01,0xba819880,0xbb00e190,0xbb4c12cb,0xbb9751a7,0xbba9bcfd,0xbbb5df0d,0xbbb9c2b9,0xbbc889fc,0xbbd81131,0xbbdf1dd6,0xbbb0f581,0xbb728c87,0xbb3c2935,0xbb2a817d,0xbb65d6a6,0xbb7d9766, +0xbb6571e6,0xbb59dd4e,0xbb43d4c5,0xbb213d6d,0xbafa1f2e,0xbaac3431,0xbac25613,0xbad212bf,0xbae7835e,0xbaeda78c,0xbaf0a049,0xbae95c9f,0xbaf7df1b,0xbaf8a950,0xbb016fc0,0xbaf89c4a,0xbaf3dad3,0xbafe455e,0xbaedad04,0xbaf7224b,0xbad6112a,0xbb501634,0xbb49627d,0xbb3eb6bf,0xbb4b3608, +0xbb64982f,0xbb7f9539,0xbb885c88,0xbb8e6016,0xbba26464,0xbba27845,0xbba89165,0xbb619da5,0xbb6bd02e,0xbb88edd1,0x391e9e0d,0x3999ea78,0xb7d8a9e6,0x3a04a6d6,0x39d10cd0,0x390a86db,0xba3e3b57,0xba5d6878,0xba513c8d,0x3a064cdf,0x3a656298,0x392a76b3,0x3a4f7296,0x3a83d7de,0x3b0b57f3, +0x3a41a6ac,0x390bc55b,0xba3be91a,0xba392255,0xba5c3ecb,0xba5bfbbc,0xba5642d3,0xba221ad2,0xba69bb7d,0x3a3ad434,0x3a1723ab,0xb9913134,0x38cd79cd,0xb8b75a93,0xba49b5e6,0xba5d5714,0xba469d7d,0x3a086d5e,0xb9671fed,0x394d449c,0x3a4e4937,0x39f3d699,0x3b2054d3,0x3ae24396,0x3b70a1fc, +0x3b5af80c,0x3b0a9834,0xba839002,0xbb08c34d,0xbb020e60,0x3a4615ee,0x3acd2d07,0x3980487e,0x3b2e1769,0x3b8ec91f,0x3be5eedf,0x3b4e4f8d,0x3a0929f3,0xbb2046fc,0xbb5aa10b,0xbb826c04,0xbb78e97e,0xbb71d6eb,0xbb230d9c,0xbadd236c,0x3aaece0f,0x3b079e72,0xb87aa0b7,0x3a8cc04d,0x39a96643, +0xba85ab37,0xba98b4bf,0xba1095e1,0x3b2e02ca,0x39f9be91,0x3a385275,0x3b3c6d8f,0x3b17cebe,0x3b0b6b96,0xb89abf00,0x3b685254,0x3b4d8bef,0x3aee4dd4,0xbb568737,0xbb857982,0xbb8eca79,0x3b42af69,0x3ba4360d,0x3a6b3022,0x3b9c68bf,0x3bc24b8a,0x3c451baf,0x3b8f201b,0x39f46bff,0xbb8f3301, +0xbba7f2db,0xbbc9a3ff,0xbbb72e89,0xbba7b2da,0xbb53863f,0xbb139c95,0x3b7b591d,0x3b71734d,0x3a8bae4a,0x3b529e6e,0x3aa14494,0xba930ea3,0xbb4109cd,0xbb070e24,0x3b611dbc,0xb99e7aff,0x3af103b6,0x3ba606a1,0x3b44e68b,0x3c038148,0x3bb5afde,0x3c4e6590,0x3c5164ec,0x3c1e73f2,0x3a31dc8e, +0xbb905173,0xbbf19207,0x3b250c6d,0x3b926ec9,0xba1c3445,0x3c0433cf,0x3c896de0,0x3cd2c910,0x3c440f9f,0x3aa6d8af,0xbc0f4a78,0xbc4b9806,0xbc6d89e2,0xbc53872d,0xbc2db5ee,0xbbec9046,0xbbc4d703,0x3b8719fa,0x3bd0a5f1,0x3bcb8538,0x3bdcd337,0x3bc58f0a,0x3c184485,0x3c23b556,0x3c0e67d3, +0x3c47cb30,0x3b9d00bf,0x3b49b525,0x3bf58236,0x3bfe7459,0xbc516cd5,0xbc689f5d,0xbc8f8416,0xbc9ac3b4,0xbc9f8702,0xbc96ca9e,0xbc2594bc,0x3c481118,0x3c1fa4a5,0x3c59d980,0x3cc29fd1,0x39ba6f27,0xbc6f6c2a,0xbc92b833,0xbc346800,0xbadb1ccc,0x3bd63c89,0x3c3fb3a7,0x3c5a7854,0x3c0da374, +0x3bc25e4d,0x3be7e484,0x3c163361,0x3aed343b,0x3a8174cb,0xbb31f243,0x3c5d1f91,0x3c6ef683,0xba393033,0xbb833b68,0xbc4bba4c,0xbc6229ad,0xbabf10f3,0x3be336dc,0x3c164286,0xbba694f0,0x3bd6ca5f,0x3c65f35c,0x3c90cedf,0x3c666516,0x3c2fddf0,0x3cd2b165,0x3cd225a0,0x3c33256b,0xba24810c, +0xbbf63e33,0xbbe5c0e5,0x3c5feec5,0x3cad42ce,0x3c215753,0xbabb58f7,0xbbedd7ce,0xbbaf070a,0xbb976421,0xbb8294c0,0xbc068b2b,0xbb5bd5a3,0xbb4ffa74,0xbb1f286d,0xbacfab7c,0x3a3a4ea9,0x3b7736f0,0xbb8715b6,0xbc1a14f1,0xbc019742,0x3b8f2a75,0x3c1f7ea1,0x3ba15c17,0xbbd7b1fc,0xbcacf3ba, +0xbce4b27e,0xbc2148d9,0xbc7b8e44,0xbd5cfd76,0xbd453277,0xbd096c5c,0xbca0dccd,0xbcd4b1c1,0xbcd66356,0xbcc5a329,0x3ca7f6d4,0x3cf50f3d,0x3bb7fe59,0x3b357717,0xbb06fb56,0xba89374d,0x3b8593bc,0x3bfaa779,0x3bfeae49,0x3bfec5bf,0x3b9068b0,0xbb0fa2cd,0xb6b479f4,0x3a9a06bc,0x3b7a673e, +0xb8ea9198,0xbb4709c8,0xbb332e8b,0xbac48038,0x3aa417ae,0x3b3b1fde,0xbb401a62,0xbc03eddc,0xbc559c12,0x3b3747df,0x3bce8760,0xbbee1107,0xbb4c2a21,0x3c797b64,0x3cd429c5,0x3cc582f0,0x3c83cb15,0x3c2ca8d1,0x3be5b5e3,0x3b9e4551,0xba11468c,0xbbafae77,0xbb8983a0,0x3be59de6,0x3c3539f5, +0x3c531193,0x3c5e53b9,0x3bd03b8e,0x3a5ecd1d,0xbbc993f6,0xbbfc43f9,0xbc10a9dc,0xbc171d65,0xbc17ddd8,0xbc198b7b,0xbbec8bf9,0xbb2838f0,0xb67ebb85,0xbaaa5c85,0xb83ca35d,0xba939a83,0xbb6aa791,0xba84fdc9,0x3a56917a,0x3ae14293,0xba1e4601,0x3b0cd876,0x3c3b3253,0x3c1f0ee7,0xbc36901e, +0xbca0fb27,0xbcb56a44,0xbc913c74,0xbc0ef183,0x3c0c0227,0x3c8aa047,0x3c82bd0d,0x3ca05b7f,0x3ca60260,0x3cb93bc1,0x3c924cf7,0x3c6c376e,0x3c374690,0x3beb5b86,0x3b99ee23,0x3b00cbf3,0x3adc744b,0xba584bf1,0xbb67930c,0xbbc89939,0xbc116937,0xbc1b2de4,0xbc1bd5c0,0xbbbc55e0,0x3a8492c8, +0x3b136191,0x3b5d6d3e,0x3b40d8cc,0x3bb620e0,0x3bbe7c50,0x3bb0083f,0x3bb0f0b7,0x3b896066,0x3abe40d7,0xbb53c048,0x3c10f17e,0x3c2a75bd,0x3c881936,0x3c93b1ec,0x3c8ecc59,0x3c3df436,0x3bf1ab5e,0x3b9ebd64,0x3b3e94dd,0x3a6ba7f0,0xba72045c,0xbad8fad8,0xbabbd759,0xb962d742,0x3b0272c7, +0x3b07f634,0x3961ef70,0xba20490a,0xbb427be5,0xbbcd21d4,0xbbe80e96,0xbbebeab9,0xbba75b27,0xbbcb9e27,0xbbe21b30,0xbbf7b927,0xbb8fdb69,0xb9c721e2,0x3b921eca,0x3bfd7b24,0x3c25e58a,0x3c306907,0x3c50dc6e,0x3c584c9f,0x3c3d616d,0x3c2af1c2,0xbc423fcd,0xbc327561,0xbc0a94aa,0xbbb95941, +0xbaae36f1,0xb97e1b98,0x399d817d,0x3815c10f,0xba294d03,0xba61fd83,0xbabaffb9,0xba554988,0xb9c81169,0x389777e4,0xb9e9a4e3,0xb9b64bfa,0x396e02d4,0xbb108f13,0xbb91b449,0xbbd36863,0xbbcb8e74,0xbbe07534,0xbbf29d46,0xbbf33a5e,0xbbe929b5,0xbc03b313,0xbbf3121f,0xbc008f79,0xbc06b8a7, +0xbc19a483,0xbc29d81b,0xbc37878e,0xbc504a1d,0xbc740812,0xbc8688b3,0xbc60eae7,0xbb86a872,0xbb851bf2,0xbb2d7c60,0xbadf6fef,0xba988429,0xb9ea37a6,0x3a676dab,0x3b315295,0x3b4231f1,0x3b4cc50c,0x3b4e458d,0x3b3fd5e5,0x3b2a9b2c,0x3b22961f,0x3ac5be5b,0x39e349d0,0xba084bd5,0xbaa5261a, +0xbaea117c,0xbb20c21a,0xbaf9aeb3,0xbb530e11,0xbb80f408,0xbb9cb143,0xbbb5b4c7,0xbbdb7887,0xbbf194df,0xbc0172b8,0xbc04f9c3,0xbc1010c5,0xbc1aee1c,0xbc2125c8,0xbc0b8a53,0xbbe13b83,0xbbc59e22,0xbbb5c7c7,0xbbccca11,0xbbdafe69,0xbbc522ee,0xbbb21481,0xbb9877be,0xbb75a033,0xbb4b64fe, +0xbb1a93fa,0xbb3827dc,0xbb402bb1,0xbb43cb72,0xbb4493fc,0xbb432135,0xbb3cf467,0xbb5267df,0xbb5e48f3,0xbb6f2fcf,0xbb79d0e8,0xbb83273f,0xbb90c509,0xbb8b68af,0xbb90cbfe,0xbb892c27,0xbbb1e06c,0xbbb2adde,0xbbaf0d1c,0xbbb7cb9c,0xbbc50351,0xbbd4571a,0xbbdd7677,0xbbe46267,0xbbfb360e, +0xbbf5a0ec,0xbbf72e15,0xbbcb21d5,0xbbcfb365,0xbbcf4658,0x3a70f12f,0x3a170e5a,0x3a053c92,0x3a9e35cb,0x3aab2a9a,0x3ab4dcd3,0x39f22dd9,0x3983ebf6,0xb8985a5c,0x3ac3da13,0x3aea8358,0x3a2fc99e,0x3ac8119b,0x3aee01ab,0x3b40c761,0x3afc8e40,0x3ab90d1d,0x3a0e54c1,0x39adc60f,0x3883c9ac, +0xb8db36e8,0xb682d404,0x3997b374,0x3a1f95e7,0x3ac7625e,0x3a9c8ca7,0x38dd4de4,0x3a07626f,0x38889f80,0xbaaadde8,0xba911925,0xba64e2d4,0x3a4a5d54,0xb8b84f85,0x39e216e3,0x3adcddd2,0x3a434efb,0x3ad4cebf,0x3ae5262d,0x3b83056c,0x3b911f5e,0x3b8b2059,0x3aafed8c,0x398c0ab8,0xba328e48, +0x3b26831d,0x3b3a16ce,0x397d458b,0x3b38649f,0x3b9c58ac,0x3c0255e7,0x3bb919fa,0x3b65c2af,0x39a16942,0xbaa76b01,0xbb268ab1,0xbb42ae88,0xbb3b1b01,0xba829004,0x3ab59757,0x3b34535d,0x3b39d958,0x398a49af,0x3a970e34,0xb91c6ad9,0xbb38a35e,0xbb4087f5,0xbb0c8ee3,0x3afae7d0,0xba58568f, +0xb8cc8bb2,0x3b859300,0x3ad71828,0x39d5f743,0xb96aadf5,0x3b7e0fa5,0x3b9d098e,0x3ba9d731,0x3a2f61c2,0xba0ec161,0xbb4a74ea,0x3baee0a1,0x3bdcb9f3,0x3a93a2e7,0x3baf7f6c,0x3bd81187,0x3c55518a,0x3c02e0c2,0x3b9ec6e0,0xba0eedcc,0xbb0e0ec4,0xbb7f4aca,0xbb9a78a4,0xbb76b5c1,0xba7ea4cc, +0x3b342145,0x3bad775e,0x3b98db52,0x39b92194,0x3b235ffb,0xba84c261,0xbbda9324,0xbbed63be,0xbbc432e6,0x3af42da3,0xbb3a083e,0xb97019f0,0x3be8e8f8,0x3aad64be,0x3b853c82,0x3b86a9b2,0x3c427652,0x3c681eb7,0x3c680a13,0x3bd1cdbc,0x3aecd726,0xbb8a191d,0x3bcbabb3,0x3bd35048,0xbae75b6b, +0x3bc993fc,0x3c73fc18,0x3cd5aec5,0x3c9964ae,0x3c1e4c0f,0xbadb3878,0xbbef5d85,0xbc3b8535,0xbc5439f2,0xbc29f2c2,0xbb83e481,0x3b15c035,0x3c060efd,0x3c0ba036,0x3b9bc3a2,0x3beacb1a,0x3b903fa3,0xbacc421f,0x3a93dce4,0x3aa3c956,0x3bef4cf1,0xbab0bbe3,0xba182025,0x3c3d9762,0x3ba7a1d7, +0xbc8118eb,0xbc443554,0xbc93dc17,0xbc8c6d8d,0xbc5a96ae,0xbc5981a7,0xbc08099a,0x3c0aca78,0x3c1f9baa,0x3c849514,0x3cd5f95b,0x3c163a2d,0xbbf7ce5a,0xbc82fbca,0xbc78b8b7,0xbbc8035f,0x3bd41d09,0x3c5c4669,0x3c97036c,0x3c93b677,0x3c624e61,0x3c3440a8,0x3c101415,0xbabb30b0,0xbaef68fa, +0x3aed50ef,0x3bfd9c5e,0x3c1171d8,0x392d2bda,0xbb0eeb28,0xbc0a18f7,0xbc0e5c18,0x3af81765,0x3bc91422,0x3b9529d8,0xbc2a1e68,0x3c9195bc,0x3c885686,0x3c84b093,0x3bae7dd3,0xbba47a96,0x3cb45b16,0x3ce94e07,0x3c5220e3,0x3b5cd510,0xbc051799,0xbc75cadf,0x3b46e323,0x3c7df855,0x3ca49d44, +0x3b8a5b75,0xbb5d2b36,0xbb2ff693,0xbb72a7b5,0xbad9711f,0xbb27790f,0x3af088f7,0x3a348f9f,0xbb869666,0xbb3a54f0,0xbb0b4152,0x3af8de42,0xbbc1a4fa,0xbc0b821c,0xbb9c22fd,0x3b434ebc,0x3bb7a61a,0xba8d2769,0xbc631e12,0xbcbf1e74,0xbcb655e8,0x3b555791,0xbcf01f09,0xbd9ca6f9,0xbd214f11, +0xbc82a10a,0xbc4f6526,0xbc892c87,0xbcb5ccf6,0xbd08c893,0x3c894ede,0x3cec98d4,0x3b1be7c0,0x3a8fe064,0xbb880747,0xbb748da4,0xba43c5ef,0x3b5431b2,0x3b8ca7d3,0x3baa13b1,0x3b651e7b,0xbae4b930,0xb8dea928,0x3abf8619,0x3b7629bd,0xba8547fa,0xbb6a3639,0xbb993568,0x39eb9269,0x3b5f6e55, +0x3ae45e65,0xbb8a54ed,0xbbea3b32,0xbbfa7ff6,0x3bc88bec,0x3c06efd5,0xbc4d424a,0xbc0dc58a,0x3cf0da09,0x3d308451,0x3cfdc681,0x3c683f31,0x3ba90d57,0xb80b97e9,0xba41c162,0xbb878dcb,0xbbf1c445,0xbc1bd6b9,0xbbb7e996,0x3b8c73e0,0x3c1c5b8d,0x3c4464b9,0x3bfbf26f,0x3b6d0cd4,0xbaab21bc, +0xbb8f7aae,0xbbd09c60,0xbc01a979,0xbc011997,0xbbe33a23,0xbb85e4f4,0xba883447,0x3a4d88ca,0x3a5a597b,0xba34c397,0xbad80f50,0xbb06866e,0x3a6919d2,0x3aa1bf2f,0x3b17dcbe,0x3ae77ad5,0x3b62df64,0x3c0c7fae,0x3c863dd7,0xbc57a5f4,0xbc8be09b,0xbcbe14d7,0xbca39c08,0xbc3943d5,0x3aa24cde, +0x3c0cdca0,0x3c253777,0x3c7e9be8,0x3c9570d8,0x3ca01a52,0x3c8f58aa,0x3c7d1ec8,0x3c6e423a,0x3c0aec70,0x3b8b0de8,0x3a30fc84,0xbac79b40,0xbba35c89,0xbc0d1e79,0xbc1b42bd,0xbc2a37e7,0xbc2d06f7,0xbc076a79,0xbb9d11be,0x3abf2466,0x3906864a,0x398946d2,0x3ab90e49,0x3b78143b,0x3b946e8d, +0x3bb43d9a,0x3abf1bcf,0x395eb823,0x39a574de,0xbba29e9a,0x3c7abcfc,0x3c76e6f8,0x3c8e6c62,0x3c89d24b,0x3c80d7fe,0x3c47f5ec,0x3c23696b,0x3c061788,0x3baffba9,0x3b226b00,0x3a1a2afa,0xba0832bb,0xbad17378,0xbb065ad2,0xb9a94af1,0xb843d6bf,0xbad55fc5,0xbb127bae,0xbb4dc398,0xbba0871d, +0xbb979cc0,0xbb943208,0xbb8ac681,0xbbc52f3b,0xbbd5aa04,0xbbb9bc44,0xba1bc5d0,0x3b84c5c7,0x3bfcc32f,0x3c28bbdc,0x3c3e4f38,0x3c3a43f6,0x3c525f3d,0x3c67dea6,0x3c6c7307,0x3c75c269,0xbc155cf0,0xbc10c68e,0xbbcbb985,0xbb5caa1d,0x39fde602,0x3a2e67a6,0x38998a7e,0xba592a1a,0xbb058698, +0xbb1696ef,0xbb28fe5e,0xbb06ca07,0xbacb69c3,0xba8eba92,0xbb076782,0xbb341d42,0xbb472d98,0xbb8f5284,0xbbb69bad,0xbbdf9078,0xbbf68e79,0xbc079338,0xbc11628b,0xbc0b4e43,0xbc075374,0xbc0ebe78,0xbbfd23a2,0xbbda6617,0xbbcdf660,0xbbb1b71a,0xbba67b64,0xbb866b6c,0xbbc82e6c,0xbc0e8d4b, +0xbc306e98,0xbc1b1913,0xbc01ec34,0xbc011d8e,0xbbd627a8,0xbbbe8155,0xbbaa48b5,0xbb86cb7c,0xbb199ea3,0xb9d64023,0xb955567b,0xb97e629a,0xb9f3254d,0xba2e66ee,0xba7a384c,0xba711fc1,0xbafb0ab5,0xbb3693f2,0xbb726946,0xbb8ea14a,0xbba1b13a,0xbbb431cf,0xbba8defb,0xbbbd2f9c,0xbbcd8c67, +0xbbdf4f10,0xbbeeb492,0xbbff70cd,0xbc0ad3b7,0xbc16d345,0xbc220016,0xbc2f0d2e,0xbc3ddbdc,0xbc493c99,0xbc3a498b,0xbc271257,0xbc1bdbf6,0xbc115e54,0xbbf4ae61,0xbbfc83dd,0xbbe67018,0xbbd0fc68,0xbbb98573,0xbba32db6,0xbb96d361,0xbb84bef6,0xbb8d28b3,0xbb8a452e,0xbb861773,0xbb83a0f9, +0xbb822b80,0xbb7de631,0xbb8b0af6,0xbb92d5bf,0xbb9c3e07,0xbba64320,0xbbb0c62a,0xbbc10ccf,0xbbbea9df,0xbbc3c3bf,0xbbc2b7cc,0xbbcebfb4,0xbbd27e71,0xbbd60a00,0xbbe2516f,0xbbee9355,0xbbf975bd,0xbc0208f7,0xbc057aea,0xbc1075cd,0xbc07b177,0xbc0488ec,0xbbfb18ff,0xbbf9d312,0xbbd2bc13, +0x3acf1568,0x3a75cfd7,0x3a8cb89b,0x3aecdcc3,0x3b081934,0x3b1f8f72,0x3ac6d8f6,0x3aa24965,0x3a404da7,0x3b0ba000,0x3b1d0937,0x3abe402d,0x3b0fe4b1,0x3b209a1d,0x3b556141,0x3b3679de,0x3b20a930,0x3af402c6,0x3aa7c8fa,0x3a6a6bec,0x3a1bebe0,0x3a4944a9,0x3a8aa0b1,0x3aee3061,0x3b00b44f, +0x3ad0b6ad,0x3a155be7,0x3a4821b5,0x397c6150,0xba841bb6,0xba817caf,0xba3049ea,0x3a981e2e,0x399278bd,0x3a3ff14f,0x3b1f49f5,0x3a88358c,0x3a5f6cd7,0x3ae95839,0x3b806853,0x3ba089e1,0x3bb9fa1c,0x3b531e94,0x3b148f49,0x3a5d7860,0x3b690ef1,0x3b67c4ba,0x3a838465,0x3b3d03bb,0x3b9868ed, +0x3bf3548f,0x3be91fda,0x3bc087a7,0x3b5eb055,0x3a80a87a,0xba4928cd,0xbacc919d,0xbab88e4f,0x39f82bed,0x3b5e4845,0x3b686f76,0x3b496eb1,0x3a0687f4,0x3a29acad,0xba63abeb,0xbb4e043a,0xbb843f20,0xbb557d84,0x3a9d48b6,0xbad54b6f,0xba0fc104,0x3b9730b4,0x3a844413,0xba62ce16,0x368ae4a9, +0x3b8bf3d3,0x3bc9fb0a,0x3c001c00,0x3b81b884,0x3b1b06c0,0xba89845b,0x3bc269cf,0x3bea3a2f,0x3b40edee,0x3bc3efb8,0x3be5b1e6,0x3c4113cd,0x3c26f5cd,0x3c06fdf5,0x3b855580,0x3a3f94a7,0xbad1fb07,0xbb51ec87,0xbb0f0e77,0x3a2ba313,0x3bafccc6,0x3ba7a1f6,0x3b8df70c,0xb9e41717,0x39ab29af, +0xbb6c0c33,0xbc0c4817,0xbc2350f8,0xbc0b4e20,0x3a480be9,0xbb8994d6,0xbae5ef6c,0x3bf7db90,0xb95b6b60,0x38d530f1,0x3b4187d2,0x3c2599db,0x3c64963f,0x3c895d1b,0x3c2ce2b6,0x3be472e8,0x39b18868,0x3bfb05c4,0x3be2137c,0xb939b16f,0x3b85fa62,0x3c39ae2a,0x3cb2260e,0x3cb3f94d,0x3c86eb6b, +0x3bf112f1,0xba68c00b,0xbbdbf6bd,0xbc23b99b,0xbbfe01ff,0xba2b680d,0x3c1121a6,0x3c26f18f,0x3c0def5e,0x3b837f61,0x3ba46501,0x3a754489,0xbc138cca,0xbbf4a68f,0xbbcf4488,0x3b0a04fd,0xbbe271ca,0xbb85ad06,0x3c52d563,0x3acbe929,0xbc7c653f,0xbc11f7d6,0xbc6c75e8,0xbc45bbe0,0xbbfc6f53, +0xbc211ec8,0xbc0f1a71,0xb9f59568,0x3c01f463,0x3c95f9bc,0x3cd3cf95,0x3cb3ffd2,0x3bd40fd7,0xbc340a7a,0xbc6bbdee,0xbc1e3aa9,0x3ae3a383,0x3c18815b,0x3c7ef4ae,0x3c9a559f,0x3c7e7c81,0x3c1b2187,0x3b598b3e,0xbbc4394e,0xbba39d71,0x3bb63a3d,0x3b005877,0x3ad846d1,0xba8391f9,0xba5b8937, +0xbb368932,0xb8c47188,0x3bbc39cb,0x3bba5342,0x39b5269f,0xbc462dc1,0x3cd47ff6,0x3c7ff146,0x3bf2c388,0xbbae9e0f,0xbc8fb380,0x3c68953c,0x3cc85676,0x3c683bb7,0x3bca36eb,0xbc0f415d,0xbcbe6ea9,0xbc0b9f5d,0x3bc26244,0x3caa9da9,0x3c1d000c,0x3b261110,0x3ad578b6,0xbb09c203,0xb978971d, +0x3b80c4e1,0x3bb771de,0x3b840748,0xbb36e3dc,0xbaa6e81e,0xbb466b71,0xba5d14c2,0xbbc1400b,0xbbafcaeb,0xbb20596e,0x3a3d0b80,0x3a0a3d08,0xbbd07ce9,0xbc9bbd8f,0xbcbb8367,0xbc5b13f0,0x3c774d37,0xbd4d32cd,0xbd96d0dc,0xbc948203,0x3baed2af,0xbbf9bd27,0xbbe53c4d,0xbc5a133e,0xbcccd48e, +0x3b13997e,0x3c766788,0x3c09629e,0x3a1422a8,0xbbd1d3f9,0xbbcb849d,0xbbc291c4,0xbb210cf5,0x39a3c389,0x3b20ec86,0x3b6bdebb,0x3b248d48,0x3b2dd801,0x3b2d2fbf,0x3add9b83,0xbb0f0a50,0xbb5c394b,0xbbb278bf,0x3a9fe9c4,0x3b555815,0x3a4cf777,0xbb6927ae,0xbb84f9ba,0x39e9894e,0x3b08219f, +0x3ad9c7e6,0xbc151c4c,0xbced5c72,0x3d1a808d,0x3d238c96,0x3cac2577,0x3bb82115,0x3895177e,0xbbba68f3,0xbbbdca9f,0xbb9ba584,0xbbdd0f24,0xbc2547fe,0xbc353d1a,0xba69652a,0x3bc05dcb,0x3c08c6ef,0x3bf5a8aa,0x3b9f977b,0x3b7a338d,0xba5cbee0,0xbb591062,0xbb972940,0xbb9dbff7,0xbb2d0f0e, +0x39d0b6dd,0x3a6f6214,0x3a82c4ba,0x3acf1f41,0xba8c2dee,0xbb04eb85,0xba72f091,0x3a176e13,0x3a2737f7,0x3b5c61c5,0x3bda81f1,0x3bda227f,0x3bff3b44,0x3cc65875,0xbc465454,0xbc2c0880,0xbc5ad6b1,0xbc407be3,0xbc0a2ca4,0xbb0bb49c,0x3b06b193,0x3b937a74,0x3c28c5c3,0x3c72efd8,0x3c8134a5, +0x3c7f23c3,0x3c60135c,0x3c4f9607,0x3bee1727,0x3b2cf5e1,0xba813bc8,0xbbaabc2e,0xbc0df76c,0xbc3383e5,0xbc37d0ce,0xbc319602,0xbc357a24,0xbbc77679,0xbb59d07d,0xb9c3d8aa,0xbab8f8f9,0xbaef568a,0xbaae513c,0x380da27a,0x3af3fe2c,0x3b922032,0xbac4d623,0xbb1deaa2,0xbb006b89,0xbbdbb255, +0x3c5310bc,0x3c44830e,0x3c2e1d3b,0x3c2b79db,0x3c3b08fb,0x3c43d99e,0x3c572fc1,0x3c662bed,0x3c2fb2bc,0x3bee411f,0x3baffc80,0x3b838e7a,0x3b20c10f,0xb629a5cd,0x39c3db7f,0xb99a92ae,0xbb33c0d5,0xbb23f946,0xbb1bae07,0xbb22f27d,0xbb3621a9,0xbb579273,0xbb913826,0xbbaf007b,0xbb9764a8, +0xbb0d2304,0x3b53b539,0x3be11359,0x3c01e7df,0x3c0d5b7f,0x3c056c3e,0x3bef0735,0x3c07f291,0x3c1bbba5,0x3c2ea1b7,0x3c37400c,0xbb473711,0xbb539baf,0xba9eafcb,0xb960138c,0x3a3e914a,0x39007196,0xba1b77ab,0xba5bfdd5,0xba89fae9,0xb9a1de9f,0x3a0f322b,0xb6b9f3ef,0xb9d22bd6,0xba1f8355, +0xbb1531c3,0xbb7b6caf,0xbbad161f,0xbbb2e5f1,0xbbc07077,0xbbceb110,0xbbeaf2ae,0xbc001d29,0xbc0ad6cd,0xbbf833aa,0xbbeb635e,0xbbe3ead0,0xbbbc9982,0xbb58504b,0xbb091fb2,0x3a37160c,0x3b144032,0x3b9c66ee,0x3b36e8a7,0x3a157aae,0xbaa7063b,0xbac62905,0xbc2780ad,0xbc1ea323,0xbc157e6d, +0xbc0f8e63,0xbc041831,0xbbe72479,0xbbc34b8f,0xbbab84ae,0xbba803a7,0xbbaea61b,0xbbb153af,0xbba8c37d,0xbb9d5a7a,0xbb896ee5,0xbb9a999d,0xbba38397,0xbbb2c1ec,0xbbbf9d5c,0xbbccc926,0xbbd8bd57,0xbbd5a6fb,0xbbd976af,0xbbe23e05,0xbbe8d645,0xbbf2ae4c,0xbbf7a245,0xbc03d14b,0xbc0f78cb, +0xbc1f5e9f,0xbc2b0680,0xbc3872a3,0xbc47485e,0xbc3de0fe,0xbc367f3f,0xbc329dc1,0xbc24daae,0xbbecc330,0xbbe9edde,0xbbdf2747,0xbbd27eda,0xbbcb31a3,0xbbc7c66a,0xbbc5d9e1,0xbbbe4f03,0xbbb771ba,0xbbac194c,0xbba31e35,0xbb9c3672,0xbb9919be,0xbb939df1,0xbb9ec350,0xbba65348,0xbbadf19e, +0xbbb82a70,0xbbc286ed,0xbbd0490a,0xbbcd2d15,0xbbcd88d3,0xbbcc2226,0xbbcd3641,0xbbcdba8e,0xbbcefdf5,0xbbdae281,0xbbe3f788,0xbbe75e35,0xbbf09ab1,0xbbf53e56,0xbc017367,0xbbee61d3,0xbbe837a0,0xbbf3ea10,0xbbf188b8,0xbbc70474,0x3afacbb5,0x3ab50fa2,0x3ac5a6df,0x3b0c259e,0x3b23ad1b, +0x3b4cd9b8,0x3b1241d6,0x3af94a84,0x3aae8ef9,0x3b0f4e80,0x3b1ea86f,0x3b0bc13f,0x3b217056,0x3b2bf767,0x3b44b164,0x3b4c8c45,0x3b43b11e,0x3b2ff2f0,0x3aec2946,0x3ab0cfd2,0x3a76fdf4,0x3aadd116,0x3ace5724,0x3b162e65,0x3b05aa38,0x3adf4b86,0x3a49af96,0x3a52df63,0x39c4fa26,0xb9afecdc, +0xba27ce04,0xb9a87f87,0x3aaf1128,0x3a2ac447,0x3a7d66e8,0x3b2a6395,0x3ab4f7e6,0x3a5e6eed,0x3af59b45,0x3b6ab92f,0x3b9fa980,0x3bd4b26d,0x3b95ef62,0x3b6ce00f,0x3aff8cf9,0x3b5f5d15,0x3b5b9898,0x3b14c2a3,0x3b4483a7,0x3b8e93f5,0x3bc6f18b,0x3bf91af1,0x3bed92c7,0x3bb844a1,0x3b30250f, +0x3a469da4,0xb951a076,0x39b8c45e,0x3aec1f1b,0x3b7b507e,0x3b7071d4,0x3b38d497,0x39239257,0xb912c097,0xbac37b37,0xbb2b50f7,0xbb8c1d05,0xbb770667,0x39004bed,0xbafb2a9a,0xba399347,0x3b742370,0x3a551f1a,0xba052c0c,0x3a43d0c8,0x3b951a6e,0x3be3f7ad,0x3c1ff71c,0x3bd4a09d,0x3b952566, +0x3a779373,0x3b94724e,0x3bbaff30,0x3babf402,0x3bca28c8,0x3be4cddd,0x3c13cba3,0x3c3020c3,0x3c23fdbc,0x3bf1de28,0x3b287ea9,0xb8b7d48d,0xbb038981,0xba0a9c53,0x3aed7eaa,0x3ba1a350,0x3b831039,0x3b545d8f,0xbb08289d,0xbb07e149,0xbbb8d5be,0xbc00370c,0xbc35caa8,0xbc1c4e85,0xba42cfd1, +0xbb8f04f2,0xbb18371f,0x3bbf2f6e,0xb9fdfe1a,0xbabfa44c,0x3b115ab2,0x3bfd1fd4,0x3c506d3d,0x3c9545ea,0x3c5fe8fd,0x3c2b95b0,0x3b849848,0x3bd0da40,0x3bbae160,0x3b73562f,0x3b807080,0x3c168d6d,0x3c8364da,0x3cb69f94,0x3ca847f3,0x3c711b57,0x3b9dbe6e,0xbad78ecb,0xbbab54cf,0xbb2ff5fb, +0x3b3d70d3,0x3c30cfd3,0x3c211a2d,0x3beba5f9,0x3b2267b4,0x3a635b7d,0xbb67ac22,0xbc30d022,0xbc61511a,0xbc48db43,0xbb305dbb,0xbc2bc257,0xbbd0b184,0x3c200042,0xba47848d,0xbc1af9bc,0xbb81e32d,0xbba53499,0xbb6f7ca4,0xbbb900f8,0xbbeae2a2,0xbc108120,0xbc16bba1,0x3b7d790a,0x3c7f0ef9, +0x3ca1d3ed,0x3ce54fbb,0x3c823e33,0xbc14461b,0xbc47229a,0xbc49aaaf,0xbbd37fff,0x39bf87e3,0x3ba3ddc4,0x3c1276f4,0x3bf8dd55,0x3aacf574,0xbb8945ca,0xbc293078,0xbbf1cc16,0x3bf631a6,0xbac78b14,0xbb69add3,0xbb4d1348,0xbad61135,0x3aee33b3,0x3c17df3d,0x3c269af5,0x3be20ce5,0xba7763ff, +0xbc072c32,0x3cd7aebc,0x3c1c8174,0xba68f322,0xbc3f333e,0xbcc21023,0x3b07d12c,0x3c5fe790,0x3c48c3ac,0x3c06a26a,0xbbe9eb24,0xbcd8a523,0xbc887a45,0xbb72274d,0x3c510e83,0x3c620d12,0x3c28f206,0x3bc9ffce,0x3ab2135b,0x3b0299ac,0x3c0d3200,0x3bea71c0,0x3bc3b269,0x399347f2,0x3aee7f26, +0xbaf8e752,0xbb792834,0xbba07675,0xbb143501,0xbaa522a4,0x394df402,0xbb51f81c,0xbc3fd324,0xbcbeca85,0xbcb1974d,0xbb93f032,0x3ca2579f,0xbd766a8a,0xbd74ebab,0xbc172445,0x3c2734fb,0x3b065d5b,0x3b8bc30b,0xbb8e5897,0xbc9003c3,0xbc69b3f2,0x391aa8a1,0x3c9cc5df,0x3b30d216,0xbbeab4d4, +0xbc044a5f,0xbc205286,0xbc0264d3,0xbb9bcf15,0xba244f9e,0x3b249351,0x3b8983f7,0x3b80bf0d,0x3b081b0f,0xbae1e116,0xbb7e62e4,0xbb5e2bbc,0xbba35fc5,0x3a2bf7a7,0x3acb9af7,0x3971763d,0xbaf55a84,0xbad012f7,0x3b6bef19,0xbbbe6583,0xbbbd3015,0x3aa08604,0xbd2bab42,0x3d0b6e99,0x3c8ef7a0, +0x3ba21f66,0x394c3890,0x3bb9ab10,0xbb940028,0xbbd0802d,0xbb404d32,0xbb55c931,0xbbcc0dcb,0xbc15c941,0xbb40e065,0x3b361270,0x3b82c90c,0x3bc5c0aa,0x3bc8d128,0x3bf57ad9,0x3b20f947,0xb9122f39,0xba8be60f,0xba40c36b,0x3ade606a,0x3b8a3bcb,0x3b2dde8e,0x3a562a76,0x38e28c5a,0xba7d5961, +0xbad2c208,0xb953bfa9,0xb8aec959,0x3a0fa495,0x3bcc7fde,0x3c19f6c3,0x3c0e3f2f,0x3c5500d8,0x3cec344b,0xbc102ad0,0xbb44e5ef,0xba7b4eec,0xbb0d1098,0xbb8dca33,0xbb390693,0xba46ca64,0x3b0bb4f7,0x3bc7c26a,0x3c37494f,0x3c5851dd,0x3c5d038b,0x3c3c6eec,0x3c1a4cfa,0x3bbffa55,0x3aab46e0, +0xbb479b05,0xbbf8b968,0xbc240c61,0xbc2c9870,0xbc397c51,0xbc284504,0xbc21b628,0xbb7f2c86,0xbad38ecc,0xbaf8181e,0xbb0aa84a,0xbb3e2a73,0xbb72a6bb,0xbb2d9640,0xb9429003,0x3b41441d,0xbadcf381,0xbb3005c2,0xbba0b2b7,0xbc01d214,0x3bae7f88,0x3b52ba7d,0x399ccb42,0x3b21b651,0x3bd94dad, +0x3c37a78f,0x3c778e12,0x3c956af6,0x3c82762c,0x3c5b282d,0x3c44c1e1,0x3c2d2850,0x3c10ec20,0x3babc8f4,0x3b6f929e,0x3ac1f628,0xbaeeda99,0xbab681cb,0xbaf48956,0xbb12d12f,0xbb570209,0xbb81202e,0xbba03d51,0xbb829723,0xbb07594d,0x3a917c40,0x3ba5434c,0x3bdb8cca,0x3bb00a24,0x3b9dca98, +0x3b6490d7,0x3b298f19,0x3b51f109,0x3b74f965,0x3b9db02d,0x3b95990a,0x3ba1728a,0x3ba920a2,0x3bd3ce12,0x3bb670a0,0x3b8255c2,0x3b295789,0x3b01be11,0x3b1379d6,0x3b2e33a4,0x3b6dea07,0x3b97a44a,0x3b2038ad,0x3a08febf,0xba88dac6,0xbb239ed4,0xbb81fd95,0xbbb5de64,0xbbab40bf,0xbba93b9e, +0xbba8a8e8,0xbbbc2220,0xbbca1634,0xbbdddeaf,0xbbab62ae,0xbb9538c2,0xbb6eacd2,0xbafcd35a,0x3ad35c23,0x3b7d5720,0x3be1698d,0x3c0f7086,0x3c3c7e7c,0x3c22ec82,0x3c0f0c0b,0x3bf6ffa3,0x3bd9a8d5,0xbc093953,0xbbf6a16e,0xbc00a88d,0xbbfeede7,0xbbeac35d,0xbbda7d24,0xbbd88fb7,0xbbe8a159, +0xbbe86cc3,0xbbf002eb,0xbbe9e8f7,0xbbd85201,0xbbbdd07b,0xbba3c859,0xbba9eb37,0xbbabf4b5,0xbbb299d9,0xbbbc880a,0xbbc822d9,0xbbd3f75f,0xbbdbf130,0xbbd78080,0xbbdf9382,0xbbe55bff,0xbbf081ba,0xbbfa916f,0xbbf13cee,0xbbf4d475,0xbc00ea04,0xbbff51b6,0xbbfc6ea1,0xbc019489,0xbbf8ed12, +0xbbfdc4b5,0xbc010f5f,0xbbe8e6a9,0xbbc16ab1,0xbbb248cd,0xbbb53ba5,0xbbb45011,0xbbbc3ab3,0xbbc46d1f,0xbbc6b725,0xbbc67c7a,0xbbbad59e,0xbbb0fd84,0xbbaba8b7,0xbba538d5,0xbba34a62,0xbb9d7c7f,0xbba5ef4e,0xbbab260e,0xbbb0019b,0xbbb70752,0xbbbde32a,0xbbc50be7,0xbbc8a1cd,0xbbcaa874, +0xbbcbf2f2,0xbbca7f1d,0xbbcd90e8,0xbbd1c393,0xbbd0ee97,0xbbd0bcde,0xbbc90a05,0xbbc806f2,0xbbc4ea2b,0xbbbfdb35,0xbbb185ca,0xbbac3237,0xbbcc5a12,0xbbc75e25,0xbbc29e48,0x3ad515b8,0x3abcdf41,0x3ac6dc74,0x3af926c6,0x3b12a4c7,0x3b4696de,0x3b165f7a,0x3afdd67d,0x3a989bf0,0x3aca19c3, +0x3ae84f78,0x3b163309,0x3b0c9dec,0x3b105fb3,0x3b0f36bf,0x3b33403a,0x3b331ec1,0x3b26ffee,0x3adc062f,0x3aa5ddc4,0x3a6382f5,0x3aabea6d,0x3ac3c865,0x3afcacdf,0x3ace825f,0x3aafc1a5,0x39df65c9,0x3a0922b7,0x393aeaa9,0xb95a732a,0xba0a01ab,0xb96f83e5,0x3a4a3211,0x3a332e67,0x3a688e1a, +0x3afdf9dc,0x3ab324ba,0x3a6af8f3,0x3ad01bae,0x3b26db51,0x3b812034,0x3bc8faa8,0x3ba3a3fb,0x3b801d80,0x3addb95c,0x3b102b38,0x3b1c9b43,0x3b5ad1d4,0x3b3d7144,0x3b7387c7,0x3b8cd06e,0x3be27a21,0x3beb5afd,0x3bc7a9da,0x3b665bf3,0x3af3a0f8,0x3a72e452,0x3ad3515c,0x3b19749e,0x3b393a23, +0x3b45c89e,0x3b059583,0xba863806,0xba80ee14,0xbaefbef9,0xbb1e1c1a,0xbb7e1f31,0xbb7960a9,0xbaece400,0xbaf8a93a,0xba5195e8,0x3aa94c62,0x39dd8617,0x39e8dd8a,0x3ae8952f,0x3b8181db,0x3bd1d849,0x3c228dbd,0x3bfd3197,0x3bba0c1f,0x3a932f1e,0x3afb5161,0x3b4b9da2,0x3be2910c,0x3bbd3982, +0x3bd02e86,0x3bc2d6d1,0x3c1dfe65,0x3c1f3c3e,0x3c02d414,0x3b576c3e,0x3a6ad76d,0xba5f8f1a,0x3a05bf60,0x3b072888,0x3b1c9003,0x3b1f1cdd,0x3b006265,0xbb91cb9d,0xbb70d665,0xbbe4d3ce,0xbbfa1a9a,0xbc3505c3,0xbc175434,0xbb6e9830,0xbb65e0af,0xbaf3e190,0x3b1b413c,0xb8e4d8ae,0xbaf43366, +0x3ab6febd,0x3b8088e1,0x3c1caef1,0x3c8c8d0b,0x3c730ed1,0x3c3aedb4,0x3b847e73,0x3b53a7ae,0x3b747a64,0x3c03ee57,0x3ba97ba9,0x3c058f1c,0x3c34b595,0x3ca3d996,0x3cac4757,0x3c90e9bf,0x3c106e3b,0x3b5ea544,0x39bc3d91,0x3b2648d2,0x3bab779e,0x3c07862a,0x3bff26e7,0x3ba84f75,0xba9685f1, +0xbb6c7477,0xbbe7f69d,0xbc1bf059,0xbc8bb290,0xbc81dd49,0xbc041858,0xbc389e12,0xbbda62a1,0x3b3794d7,0xbb1f512c,0x3aaa81ef,0x3b603406,0x3bfbe0bb,0x3bc3175c,0xbb9bf2fe,0xbb5d66ab,0xbbc2a2a7,0xbc457de1,0xb9930d15,0x3c0ba184,0x3c26a272,0x3cbea2e6,0x3c846ae4,0xbc0c755a,0xbc39a520, +0xbc7550e2,0xbc7c6833,0xbc1c6ca3,0xbbf9cc1c,0xbbd2cb4c,0xbba7b08a,0xbc078f59,0xbc2f9952,0xbc42f038,0xbbf70076,0x3bfc8460,0xbb2223f7,0xbb903ec4,0xbb36d3b6,0xbaa1bd8f,0x3bbd577f,0x3c865fa9,0x3c6cab6b,0x3c1f9043,0x3acc7dd9,0x3a6149cc,0x3c94dc41,0x3b033514,0xbbd5a6d8,0xbc60f684, +0xbcb9137f,0xbc21628c,0x3abfd3ae,0x3c114b82,0x3c2665c1,0xbaf63248,0xbcb78b91,0xbca9459e,0xbc42e776,0x3ad6e703,0x3c663ed1,0x3c858167,0x3c25d85b,0x3bdb2add,0x3bc8cb3e,0x3c3f36cd,0x3beccd5b,0x3bbefc65,0x3b47ab16,0x3b845eca,0xb9bfb034,0xbbb7294d,0xbb74b34c,0xb9bd7218,0xb9d5d179, +0x3a0f97af,0xbb9b008a,0xbc751e78,0xbcda4b4d,0xbca47ba9,0x3b3389fe,0x3c895687,0xbd4c968f,0xbd1dbca2,0xbc3fb72a,0x3b34b000,0x3c85b029,0x3c45d675,0x381fffd1,0xbc589686,0xbcc75509,0xbc3533bb,0x3cb96cb9,0x3bc721eb,0xbb85d5fd,0xbc1134c8,0xbc34ec94,0xbc36f385,0xbc151d4c,0xbb7ee68f, +0xba9d01bc,0xb9515bac,0x3ab4a377,0xba33bf25,0xbb971224,0xbbba2798,0xbb8253d9,0xbb57c43c,0x3935bd1f,0x3a0b0254,0xb9243195,0xb9ea2e6c,0xba8228de,0x39c640e6,0xbc0f4d79,0xbbf3d483,0x3b4b3571,0xbd1c2243,0x3ca49a92,0xbb684e03,0xba91e5fb,0x3b562e3a,0x3c656891,0x3bc8ce36,0x3ae718dd, +0xbb154cb2,0xba8d1b19,0xbb4ff025,0xbb8d5a04,0xbb65a423,0xb8dd7747,0xb9954d61,0x3b9674f6,0x3bf84daa,0x3c0e85e4,0x3bb3b538,0x3b69486f,0x3b0665b4,0x3b3ef239,0x3b937fd7,0x3bc66b8d,0x3b650b05,0x39d6ac63,0xbae3a2e0,0xba8c0689,0xba12bce3,0x3a3739c1,0x39b5e4e5,0x3ab6060f,0x3be1b2fe, +0x3bc5f318,0x3bc6bf83,0x3c8a943d,0x3cca85e3,0xbb67f300,0x3b4397a9,0x3be2c7e0,0x3b5ba994,0xbb5dc3b2,0xbb94901f,0xbb66bb48,0xbab6b258,0x3ad02823,0x3bc83a1a,0x3c1dae59,0x3c27a5b6,0x3c17d648,0x3bea9d3f,0x3b9527d8,0x39ba3e58,0xbb8e4c40,0xbbf4cc57,0xbc124cae,0xbc14c27d,0xbc228e0f, +0xbc06abed,0xbbc9a15b,0xbae1e523,0xb8690853,0xbade2b3b,0xbb02b415,0xbb380bba,0xbb5338d9,0xbb23620e,0xba81dd20,0x39ca1a09,0xb98cf098,0xbac93076,0xbbb39972,0xbbda1bb5,0xbb5615fe,0xbbc86daf,0xbc105dd3,0xbba5b889,0x3a7fd96d,0x3bfdca9d,0x3c480287,0x3c7e18f0,0x3c85723a,0x3c87ec32, +0x3c8bed6c,0x3c803d4c,0x3c6009eb,0x3c1f12e9,0x3bf97e92,0x3b947861,0x39e1c36d,0xb98bba16,0xbb142740,0xbb821ace,0xbba35777,0xbba3e54b,0xbb930497,0xbb00fe96,0x39ba608d,0x3b4f09d0,0x3b8f481e,0x3b82353c,0x3acdcb0f,0x3a9d2773,0x3a0bde24,0xb9396b96,0x390c6d71,0xb8ec6979,0x38b7eb8f, +0xbae61dda,0x3c2f5a9c,0x3c371dd2,0x3c3fed4b,0x3c2b85cd,0x3c0bb1cb,0x3bdcb4e0,0x3bc9fb40,0x3bcfa322,0x3bcad2d7,0x3bc7e8d6,0x3bc8313a,0x3b4c0320,0x39fd169f,0xbb0a1723,0xbb3f66aa,0xbb7d8134,0xbba1ff64,0xbb938060,0xbb87c78a,0xbb805f2c,0xbb858681,0xbb8c0337,0xbb9d18cd,0xbb17af16, +0xba51e749,0x3aa6cfbd,0x3b3a3ade,0x3bc76be9,0x3c07e8ec,0x3c215516,0x3c30ef32,0x3c4a5f98,0x3c424eab,0x3c438270,0x3c4046a0,0x3c366c3a,0xbb8ad54a,0xbb4fe8c4,0xbb70ae62,0xbb75dcab,0xbb5d7e69,0xbb5f050b,0xbb7fd7e7,0xbb99ca73,0xbba5d940,0xbbb0dae1,0xbbaecdc1,0xbba98ce1,0xbb9aaccd, +0xbb8faf9e,0xbb9051c0,0xbb93507e,0xbb9756ad,0xbba1a627,0xbbaed83a,0xbbbc224a,0xbbca71a1,0xbbc5a6bb,0xbbcf1ec8,0xbbdac998,0xbbed1c35,0xbbfd9763,0xbbdf087b,0xbbcd862d,0xbbbf469b,0xbb9f3e0a,0xbb7b75f6,0xbb44ca3f,0xbb417d3b,0xbb521041,0xbb5ab6ec,0xbb369dcd,0xbb74b6d2,0xbb437146, +0xbb5d3e96,0xbb69bab0,0xbb81664d,0xbb8914b1,0xbb8af566,0xbb8c75bb,0xbb8b7a01,0xbb8d442d,0xbb92d3bb,0xbb93c204,0xbb977179,0xbb993f0b,0xbb9c4e6a,0xbb9e68d6,0xbba04399,0xbba2c5b1,0xbba4e84a,0xbba576de,0xbbacc9b0,0xbbb2b0c2,0xbbbad38e,0xbbb26c83,0xbbb9aed4,0xbbcb9dcb,0xbbbac8c6, +0xbbaed60d,0xbb9dea60,0xbb91a802,0xbb863b98,0xbb637d73,0xbb5b6e4f,0xbb4cb487,0xbb8a4e6c,0xbb8195d8,0xbbac783f,0x3a9fdf44,0x3aa5535e,0x3abbe236,0x3ac62647,0x3ae7e0b5,0x3b267357,0x3b0a191c,0x3ae67958,0x3a385118,0x3a70ed8f,0x3a995333,0x3b1661d8,0x3ae8998c,0x3ae73eda,0x3ac5e81b, +0x3b126802,0x3b154d8f,0x3b06e8e1,0x3abb6e2f,0x3a91ea5f,0x3a5c51f3,0x3a8bdeba,0x3a9231ef,0x3a9adfe9,0x3a7ff429,0x3a52609a,0xb931646a,0x38a5d990,0xb981482d,0xba43d7d9,0xba225f32,0xb9a79ae6,0xb955d7f4,0x3a1a9ee2,0x3a5258bc,0x3a7dbb1c,0x3a938ea3,0x3a1c2228,0x3aa678d8,0x3abfa9e0, +0x3b368419,0x3ba4be66,0x3b9dd596,0x3b6f8591,0x3a457476,0x3a8abcbf,0x3ad7271c,0x3b8a036b,0x3b32a9c1,0x3b443600,0x3b3f2690,0x3bbf0c9b,0x3bd331ab,0x3bb5f96a,0x3b7f8328,0x3b304c0c,0x3afda28e,0x3b09fa6b,0x3b0a9e50,0x3ac66db4,0x3af3b726,0x3a739c8f,0xbb0c86ff,0xba9a6962,0xbabe9386, +0xbb28c52b,0xbb2d3239,0xbb41d0d2,0xbb6a1509,0xbac70219,0xba3672b1,0xba8f128f,0xb91582df,0x3a771673,0x3b36eebf,0x3b461b5c,0x3ba850d4,0x3c0b1282,0x3c021e43,0x3bc6774f,0x3958304d,0x390f6032,0x3aaa941e,0x3c043339,0x3bab8ebe,0x3bb4c08d,0x3b840a4a,0x3c06d922,0x3c0e1796,0x3be51527, +0x3b6e8bd5,0x3aef84e7,0x3a1d7529,0x3a7821fb,0x3abc34b4,0xb9408ce2,0x3a1807f1,0x3a15b07d,0xbbd1cd35,0xbb91d38c,0xbbf0ce29,0xbc179c0b,0xbc24a788,0xbc028a16,0xbbe1756e,0xbb0decbc,0xba578164,0xba693083,0x3910568f,0xbb21654a,0x3a2a5b57,0x39ef5226,0x3bbe1d49,0x3c5fdba3,0x3c696b70, +0x3c2d11cb,0x3ad42783,0x3a1df6b4,0x3b399332,0x3c4079e0,0x3bcd45b8,0x3bdb27d4,0x3bf58cd1,0x3c899617,0x3c9f72bb,0x3c8c1239,0x3c37dbe1,0x3bf1dd18,0x3ba5f1a1,0x3bb8b8c8,0x3bbacad9,0x3b70c948,0x3b94478e,0x3b340d01,0xbbb66bcc,0xbbbfdeef,0xbc022b97,0xbc0bc037,0xbc83749a,0xbc7d0306, +0xbc562379,0xbc1af283,0xbbaf2c2a,0xbb942eb4,0xbb7e4535,0x3c33a3f9,0x3c38fa13,0x3c90e3b5,0x3c5a5220,0xbb035244,0x3a4f39fb,0xbab16887,0xbbfcc9eb,0xbb182b8e,0x3aa58c76,0x3ae47c3b,0x3c688d9c,0x3c49735a,0xbba8d9cf,0xbc269c07,0xbc83c034,0xbcadfe5c,0xbc89a9ab,0xbc8491ff,0xbc88d556, +0xbc72e0d3,0xbc6dea86,0xbc6c294c,0xbc1d9429,0xbb9b6219,0x3bc82da1,0xbaa3e0e9,0xbad35af1,0x39e5169e,0x3ad36f34,0x3c12d4be,0x3c934d93,0x3c873046,0x3c4cbf23,0x3bce7c1c,0x3c19de95,0x3bdc7cad,0xbb78c6d2,0xbc0ebd53,0xbc513389,0xbc9345f1,0xbc89b39f,0xbbeca546,0x3bba762d,0x3c368dd0, +0x3b954beb,0xbc69420b,0xbca9dcee,0xbc89ff7e,0xbbc72327,0x3c1af6c9,0x3c876b63,0x3c520b36,0x3c4682f6,0x3c2cd35f,0x3c47286e,0x3bce11f9,0x3b8b839a,0x3b81d6c1,0x3b89fdfe,0x39a220dc,0xbbb1cfe1,0xbb31177a,0x39b49009,0xba0e62ea,0xb9c59afb,0xbbbb7f25,0xbc67f4b0,0xbcc9fb9e,0xbc854271, +0x3bf3f81f,0x3c1c4dd4,0xbced7f76,0xbc943380,0xbc8b1e99,0xbbad47f1,0x3cd70218,0x3c811332,0x3bb02858,0xbb53b059,0xbcbf24de,0xbc86a88b,0x3c861d6d,0x3c20258d,0x3b27811c,0xbc091cda,0xbc1c2246,0xbc33b89a,0xbc325d7f,0xbbd0702d,0xbba0d4b2,0xbbbc4e69,0xbb2680c5,0xbb5b7af3,0xbbbe6039, +0xbbcedd4d,0xbb76b093,0xba95959f,0x3a46b978,0x396c9ac6,0xb94df612,0x3a320362,0xb9777148,0xbb8f6243,0xbb7ee563,0xbb676d52,0xbbdbb5f6,0xbcceb151,0x3b4a1fd6,0xbb4ea29f,0x3c01b849,0x3c42f85f,0x3c715ca1,0x3c8d900b,0x3c59eb95,0x3b02c57a,0x39f89518,0xbb1ff8b9,0xba999364,0xbb7ed667, +0xbb00dd0e,0xbb0bd6af,0x3b736e4b,0x3beb4fc2,0x3bf2e357,0x3beccc97,0x3bd9e5d1,0x3b9dcd4d,0x3bab1520,0x3bb87cc6,0x3bd07403,0x3b57dfaa,0x390bc8ca,0xbb051cc2,0xba5ef4ee,0x39660b16,0x39a6543a,0xb87e0447,0x3a9fc707,0x3b622c55,0x38cf54c5,0x3a27dd00,0x3c2eb06c,0x3c0c571f,0x3b01d051, +0x3bba6a51,0x3c10dafe,0x3bbf7362,0xbb261a8a,0xbbc5fd00,0xbbe8101f,0xbbc24ee8,0xbb6c220e,0xb94c0704,0x3b892f56,0x3ba7606d,0x3bb92539,0x3bae92ba,0x3b4bfbb4,0x36443641,0xbb6a28e3,0xbbac60ff,0xbbcc2623,0xbbe31af1,0xbbde8323,0xbb929116,0xbabf0139,0x398c34d0,0x3a6ee102,0xba53c19d, +0xbabc0248,0xbab610e7,0xba2de322,0xba462888,0xba3f3fb0,0xbae6630a,0x39ce44cb,0x3886d6fd,0xbae22274,0xbaf99470,0xbc0d8d59,0xbc3b4152,0xbc3f4449,0xbc0fd60e,0xbb8e8362,0x39c96691,0x3b75a72b,0x3be5ce07,0x3c3a60d8,0x3c712516,0x3c8c696a,0x3c8682ad,0x3c711d84,0x3c3941cf,0x3c15422e, +0x3bbfd0d5,0x3ae1d982,0xba3b7ede,0xbb5f8fc7,0xbbb46c57,0xbbc7f691,0xbba8435d,0xbb4bd30f,0x380f50c7,0x3afc5a19,0x3b61cec0,0x3b05c1f6,0x39d4e191,0xbaa03799,0xba8b51c8,0xba482a1b,0xbaa3ec48,0xbab83d40,0xbb2410d1,0xbb67bf54,0xbbc2affa,0x3c2adb2c,0x3c297559,0x3c22b788,0x3c1c80e1, +0x3c112b02,0x3c06eed7,0x3c081733,0x3c0d3f0b,0x3bf70eaf,0x3bcdd493,0x3badf6bb,0x3b1ee58d,0xb81fe5b4,0xbb331c76,0xbb434042,0xbb6436c3,0xbb8310b5,0xbb5cfea7,0xbb36dc35,0xbb2140eb,0xbb1adfa1,0xbb212758,0xbb3dcbf1,0xb7a3ac91,0x3b12adbf,0x3bb1f9c9,0x3bd137e1,0x3c093635,0x3c1e3d4b, +0x3c15ffde,0x3c0bceba,0x3c06ab82,0x3c0e3242,0x3c1d6c28,0x3c23e64f,0x3c1febee,0x3abc17b4,0x3b41f905,0x3b1f98c5,0x3b025444,0x3ad3f1a7,0x3a7a4637,0x38a2fd4c,0xba27a01a,0xbacb0e92,0xbb0d6c37,0xbb28a873,0xbb4c6717,0xbb63ec6e,0xbb8368cd,0xbb813bdc,0xbb84ea02,0xbb88ea93,0xbb9458ed, +0xbba1f11a,0xbbaec248,0xbbb2d242,0xbba3a672,0xbba08356,0xbba27577,0xbbafd0c5,0xbbb3a9b4,0xbb953f8c,0xbb7865c8,0xbb432c87,0xbad197a1,0xb8d56847,0x3a6a950b,0x3a9c59c0,0x3a909cfb,0x3ab40342,0x3b0a5e24,0xbaacd5f6,0xba0df8a2,0xba9d7d5d,0xbac37078,0xbaee97d4,0xbb037537,0xbb0c73eb, +0xbb172919,0xbb2cd9da,0xbb469bac,0xbb652f09,0xbb780ab0,0xbb85c9c9,0xbb9170cb,0xbb8f5bdf,0xbb8fee37,0xbb8f630d,0xbb8e785c,0xbb8ce0ee,0xbb8b2979,0xbb8bbb25,0xbb8d7e19,0xbb953256,0xbb82d2fb,0xbb856540,0xbb9c790d,0xbb888a91,0xbb712b07,0xbb4f9973,0xbb338089,0xbb1b575b,0xbad50427, +0xbab317d7,0xba8297b6,0xbaf61504,0xbac42c6f,0xbb90d6b2,0x3a396d16,0x3a57dc00,0x3a977c51,0x3a839ad4,0x3a990e71,0x3ae0f30c,0x3ad54000,0x3aabd1af,0x38e9964b,0x39a0aedd,0x3a171174,0x3b074b56,0x3aa0f24f,0x3a9bb79b,0x3a6ebf79,0x3ad42d1d,0x3add9bbc,0x3ac5858b,0x3a8c470c,0x3a5b3ffe, +0x3a33a1c0,0x3a24125c,0x3a18f2a3,0x3a1bdd74,0x398fdaa5,0x38f8e652,0xba348121,0xb9b30a30,0xba2d1876,0xbabcf41b,0xba452bae,0xb9ffea5f,0xba9460ba,0x39ab1172,0x3a1a7447,0x396719cb,0x3a311668,0xb8554ac1,0x3a6ed6c3,0x3a1362d6,0x3ad1b610,0x3b5ab7e2,0x3b822e3d,0x3b42055a,0xb939d1c5, +0x3889fe05,0x3a6dd5ba,0x3b9209bc,0x3af7b7d0,0x3ad45e5c,0x3acc9d12,0x3b8bf889,0x3ba8f8f1,0x3b98c1cc,0x3b761c8c,0x3b3e6b6e,0x3b1a8ced,0x3aee4f6e,0x3aa75cb5,0x3a170b3e,0x399d5a6c,0xb9cd2e7e,0xbb28a5d5,0xba81be34,0xba555855,0xbb2ef033,0xbaa57168,0xbadc859b,0xbb8acff0,0xba814802, +0xba0ed250,0xbb1aeaec,0xba54fbf9,0x3a30fa13,0x3b53cd76,0x3b0a95b9,0x3b741cf4,0x3bc30849,0x3be57448,0x3bb2607d,0xba68f31c,0xba8d4337,0xb793af68,0x3c09085e,0x3b7c682e,0x3b7db8f4,0x3b26d992,0x3bd72ad9,0x3becbb5c,0x3bc05efe,0x3b749334,0x3b1924c7,0x3ae2d395,0x3a3d2087,0x394ebc94, +0xbaacd3f8,0xbabe9910,0xbaa216af,0xbbedc0da,0xbb9b7fb1,0xbbe293eb,0xbc3c21ab,0xbc0930d0,0xbbd6b793,0xbc193eb7,0xba936d62,0x38638ae4,0xbb2fd6b4,0xb9204c93,0xbb5af2d4,0x394493ec,0xbac578c5,0x3b1fe79e,0x3c0c2be4,0x3c42ae9f,0x3c11ac56,0xba124b6d,0xbac237bf,0x3b046c5d,0x3c5d10b7, +0x3ba7af8b,0x3b379c3a,0x3b67926b,0x3c4a46d2,0x3c85776d,0x3c7708a7,0x3c43b462,0x3c17c14f,0x3bfe29a9,0x3bbfa95a,0x3b8a474a,0xb8fa8369,0x39861874,0xb9d70b0b,0xbbf923aa,0xbba4aea3,0xbbb60e07,0xbbd42726,0xbc377777,0xbc33d0e4,0xbc7001a2,0xbbd62012,0xbb6e4ceb,0xbc13727a,0xbba63ffb, +0x3c7c6de0,0x3c85de8e,0x3cb37f50,0x3c8e84ef,0x3b85ae34,0x3b512b72,0x3a15e3ed,0xbac17667,0xbb3c34c1,0xbb70bd02,0xbb81afef,0x3bc9c514,0x3c18817f,0x3b58d6f8,0xbbdccb0b,0xbc70e008,0xbcb13edd,0xbca3b6c3,0xbca13182,0xbc9fdeb9,0xbc96f47c,0xbc841ab7,0xbc718765,0xbb86480d,0x3804baa4, +0x3b5946cd,0x3a4c1576,0x3a986900,0x3b265998,0x3b634986,0x3c0f50ce,0x3c5839b9,0x3c701291,0x3c6261e7,0x3c2de580,0x3c5f72c3,0xbb12c736,0xbbbce320,0xbc036b1d,0xbc35dfb7,0xbc695c58,0xbc9c1802,0xbc334fc9,0x3b91e99a,0x3c296d4e,0x3c0cc7b0,0xbbba6bb3,0xbc9a2a83,0xbca24ab8,0xbc294a65, +0x3af0ae5d,0x3c33b1f3,0x3c5265f6,0x3c6a3512,0x3c48f687,0x3c22bd0c,0x3b8769ce,0x3b074db6,0x3b497b3e,0x3b3272f9,0xb97b9de8,0xbb820a9c,0xba86f505,0xb99b28ed,0xbaa97b25,0xbaa2d7e5,0xbb85a6ca,0xbc254990,0xbc8efca5,0xbc2da9fe,0x3c0b5463,0x3b1a08bb,0xbc6220e1,0xbb32bd56,0xbc87b1f6, +0xbbd0ad2e,0x3cf6ac65,0x3c88e9fa,0x3c13d853,0x3badf042,0xbc99a83f,0xbc971fd1,0x3bbb3c6f,0x3c4e5802,0x3c29b70f,0xbba671a0,0xbbcd88d9,0xbc0d07bc,0xbc1f71b9,0xbbf711eb,0xbbd9e988,0xbbf8e287,0xbb8bfcce,0xbb85fbb6,0xbbb8af1d,0xbba1a451,0xbb0ef462,0x3a3c04d1,0x3a45db61,0x39192351, +0x3a2e665c,0x3a29bc26,0x3b08c53d,0xbb85953a,0x3ae1f28a,0x3a2ec5cc,0xbc878595,0xbc7552c7,0xbc1c9948,0x3c7f081b,0x3c7b53a1,0x3c272850,0x3b0eea8e,0x3c76f61f,0x3c963590,0x3c48b699,0x3b5ea429,0xbb1f1a75,0xba864d97,0xbb998369,0xbb5c38b4,0xbb08d180,0x3ae6a42a,0x3b7364ed,0x3b95b101, +0x3be03acc,0x3c00755e,0x3bded0a6,0x3bd0cdf0,0x3bc2a1d7,0x3bbff02f,0x3b0d4c47,0xb803d43b,0xba871095,0xb99776bc,0xb9479f55,0xb9bc9c00,0xba60276b,0x38b517ac,0xb94a7ad2,0xbae62f73,0xbb6a0dd9,0xbbb3c93d,0xbc5acecd,0x3bfe2fb1,0x3bd2dff1,0x3bfa8c68,0x3bf1f44d,0xb916968a,0xbb9f8e2c, +0xbc19f3e9,0xbc27a29b,0xbc0e1c37,0xbbc6f370,0xbafb7888,0xb9754909,0x3abbad2a,0x3b4460a0,0x3ad428a4,0x39d0f622,0xba72197b,0xbb1533ff,0xbb459895,0xbb69e987,0xbb1a25a8,0x387c43eb,0x3b26a698,0x3af4acc8,0x3aa742aa,0xb9111700,0xb979f013,0x39a4e489,0x3a4180cf,0x3a1981ad,0x39717391, +0xbafa46e2,0xb9b9c0ae,0x3a95c2a9,0x3b8d6701,0x3bd0ced9,0xbc1e14c1,0xbc2af454,0xbc053db0,0xbc060680,0xbc007b5e,0xbbda5945,0xbb91cbb9,0xbaaebfed,0x3b9a5f99,0x3c1432f9,0x3c413fa1,0x3c49817c,0x3c3fbbd5,0x3c1edc15,0x3bfd3a34,0x3b968859,0x39f1d482,0xbb1b67e0,0xbb8e08e3,0xbbb7453f, +0xbbc17051,0xbb8d8c8e,0xbad91bea,0x3a948b6d,0x3b0adc9e,0x3aeb4f6f,0xb9edb526,0xbae3712d,0xbb01e87f,0xbaded3db,0xbab93a0a,0xbb127b3b,0xbb29a543,0xbb873518,0xbbbde0e5,0xbc011595,0x3b93f554,0x3b5a7e01,0x3b157434,0x3b3a75b9,0x3b532d2e,0x3b99f3e3,0x3bc1db15,0x3be4eecb,0x3bcaaf2f, +0x3badbc5a,0x3b9bde8d,0x3b24231b,0x3a11ea1d,0xbad6544b,0xbafd2c1d,0xbb18b885,0xbb2fd9e7,0xbb10d8dc,0xbb01454c,0xbb0354ff,0xba924006,0xba3e761c,0xba0ae556,0x3ae02c4b,0x3b856ab7,0x3bf424ef,0x3bf0fa97,0x3bf55813,0x3bfa9cf1,0x3bbc8470,0x3b862b22,0x3b1721c6,0x3b4f08d6,0x3b85aba1, +0x3b92c589,0x3b859645,0x3bc4089c,0x3be26fa3,0x3bd1fac2,0x3bb986e9,0x3b99f6b2,0x3b793f2d,0x3b3c476d,0x3b1a3327,0x3a923ce9,0x3947c9b5,0xba272d47,0xbad12d8f,0xbb1e4a89,0xbb63d14f,0xbb598f83,0xbb5d7898,0xbb61a599,0xbb750dd0,0xbb816b1e,0xbb8cf75e,0xbb87bd09,0xbb490066,0xbb1b41bc, +0xbaed0298,0xbae2824b,0xba8bcc73,0xb9d6ed4f,0x39e3dd81,0x3aa66a75,0x3b207547,0x3b7604fe,0x3b9562c8,0x3b9b662d,0x3b97ce6e,0x3ba6fa80,0x3bb917d8,0x397b3e79,0x3a47a12f,0x3958fba8,0xb7a353f0,0xb93116af,0xb9c3f246,0xba1de24a,0xba5940d7,0xbaa79cf7,0xbae3b6d8,0xbb14fd6b,0xbb2df621, +0xbb463f2b,0xbb66d36f,0xbb5de367,0xbb5ecb9d,0xbb5c03b8,0xbb57ac0a,0xbb52b9e0,0xbb4b5257,0xbb4db0d8,0xbb48067e,0xbb56cb45,0xbb096131,0xbb070ecb,0xbb27b638,0xbb0e358a,0xbaec33e0,0xbac338f0,0xba961b48,0xba63ec42,0xb99b9d0c,0x38b3082e,0x3a0912d0,0xb8f111d3,0x394a6b6b,0xbb45279e, +0x3a076e77,0x3a263311,0x3a8d5c9c,0x3a5791ce,0x3a76d6bd,0x3aa0b2e0,0x3abb8f40,0x3a964750,0xb7dea1d7,0x38c49465,0x39b3739d,0x3b03178d,0x3a666cfe,0x3a5a49d8,0x3a444014,0x3aa06fa4,0x3aac3544,0x3ab17175,0x3a72e236,0x3a3ee6c8,0x3a25c19a,0x39d8e0f3,0x39a8b348,0x39df60b6,0xb91d6568, +0xb9a7640a,0xba3889f7,0xb9fae6a3,0xba3e18d5,0xbac9fadc,0xba1e1ccb,0xb9d0cfcf,0xbab61b64,0x3989cbdf,0x3a104c8a,0xb88ee23b,0x39ec6b4f,0xb9a96458,0x3a73be50,0x39b3dfaf,0x3a8732af,0x3b079e47,0x3b5f4eef,0x3b3287c8,0xb983934e,0xb9a7fddb,0x3a076948,0x3b927124,0x3a825384,0x399635a7, +0x3a280e7e,0x3b29db26,0x3b6f886a,0x3b83a6b5,0x3b5a72ad,0x3b2ef7a2,0x3b10f353,0x3aa77594,0x3a0725b4,0x39e44ffb,0xba680ffd,0xbaabf6b6,0xbb04b581,0xba5a2a9a,0xba0137e2,0xbb24ca55,0xb91512b6,0xb9ede997,0xbb6f5484,0xb96f93d2,0xb9371389,0xbb15368f,0xba6fcb8b,0x3a01897a,0x3b5e4dc8, +0x3af83cb6,0x3b500f02,0x3b8877bd,0x3bd3176a,0x3ba9d008,0xba4ae1f1,0xbab526c0,0xba28d4b8,0x3c07fcc7,0x3b1a4946,0x3b157f28,0x3aef6b08,0x3b9c971b,0x3bb65e6d,0x3bb37aea,0x3b6eb26a,0x3b1a24bc,0x3b084796,0x39a303b6,0xba61bbee,0xba45ecb7,0xbb57b536,0xbb520ba3,0xbbc90102,0xbb997bfb, +0xbbbd68ff,0xbc3b54c2,0xbbc82758,0xbb9e0dd6,0xbc1a307b,0xb9e525fb,0x3a319568,0xbb406bdc,0xb9a41a3b,0xbb58fa2f,0x39809601,0xbad4f7ef,0x3a1183ec,0x3b8b1a36,0x3c23ba1f,0x3c0adbee,0xb9efa782,0xbb1a9b3f,0x3ab3f96a,0x3c5cb067,0x3b36f495,0xbade9de1,0xb992a39c,0x3bdf36d8,0x3c3f52d9, +0x3c53eb33,0x3c352cf3,0x3c106de8,0x3bfd828d,0x3b864ac2,0x3adf5416,0xbaf6cfef,0xbb6f176f,0xbb3f112e,0xbbc56a2d,0xbb1a9d02,0xbb03a8b0,0xbb380f6a,0xbba297fe,0xbbaed792,0xbc35ac42,0xbb6485d8,0xbb0485c6,0xbc20d29b,0xbbac64de,0x3c77ece8,0x3c90926e,0x3cb78c18,0x3ca6dcc6,0x3c517d3b, +0x3b953f63,0x3956db36,0x3b454e0d,0xbb024578,0xbb9bcfb6,0xbbbada78,0x3b96f451,0x3c4669a4,0x3c72995b,0x39d1260a,0xbc1ff5a0,0xbc8812e6,0xbc99c0ac,0xbc9927ac,0xbc8abdbf,0xbc86cf5d,0xbc6011aa,0xbc37964a,0x3b003890,0x3b5b3a0c,0x3a74e283,0x3aca7f61,0x3a75a1d8,0x3afa9e7d,0x3af0ff5d, +0x3ba7ca47,0x3bc125c9,0x3c229667,0x3c50a022,0x3c551d6b,0x3c63d9bf,0xbbbf5692,0xbb855e8a,0xbbb99a88,0xbc17cf2c,0xbc390d1e,0xbc97d87e,0xbc48ccec,0x3b95f01a,0x3c06262d,0x3c26c961,0x3b61d9ab,0xbc69fc0e,0xbca628cf,0xbc51de9c,0xbb8f7a6d,0x3b97f2dc,0x3c355966,0x3c51528d,0x3c2a2660, +0x3bc27b1a,0x3aa6b914,0xb90be954,0x3b020f28,0x3a365429,0xba9d6e65,0xbad6c919,0xb99ec953,0xba4f8492,0xba4fae3e,0xba9c530d,0xbac094e8,0xbb8168fb,0xbc1ab8bc,0xbbb82e24,0x3bd97370,0xbb08657a,0xbb5f3b43,0x3c32d4bf,0xbbe532a1,0xb8d7dc85,0x3ce12b9e,0x3c9cdb73,0x3c67394b,0x3c4fe0ed, +0xbc3a95ec,0xbc8315f7,0xbb58bc3b,0x3c6025d6,0x3c8a94c9,0x3b38a8a3,0xbaea4169,0xbbbb48ca,0xbbdce500,0xbbe0f988,0xbbb1ec9a,0xbb977581,0xbb100ef0,0xbb0d9bb0,0xbb78a5d4,0xbb0ad123,0xb8dda2c7,0x3a6090e2,0x39897688,0x39d3f22f,0x3a2a8a5b,0x399c742a,0x3acb7f67,0xb9752369,0x3b294a68, +0x3af277fa,0xbc7f164c,0xbc00c217,0xbc605cdb,0x3cdf4665,0x3bfeae0e,0xbb7bfb50,0xbc6956f9,0xb9f4d534,0x3c4a1388,0x3cc14054,0x3c1ec42a,0x3ac7120c,0xbafd18be,0xbb8634fb,0xbb76c6de,0xbb0d2076,0xbaa811a7,0xb9a70f68,0x3afe5dd4,0x3bab1bf0,0x3bf2a182,0x3c012a63,0x3bdec1d9,0x3bc3040c, +0x3b88ba13,0x3a01a283,0xb9ce5cd4,0xb9b17a33,0xb9ab55cf,0xb9f893af,0xb9ca9b76,0xba23e794,0xb97fef1e,0xba818abf,0xba68a7a9,0xbba07160,0xbcb03b76,0xbce7985b,0x3c8625b5,0x3c380817,0x3c07d64b,0x3c05608d,0x3b785af2,0xba2bce28,0xbbf4b2bf,0xbc323232,0xbc2c9dce,0xbc07ee05,0xbb9e1118, +0xbb56aabb,0xba9f6284,0x3b006121,0x3aedd06d,0x3b06e5d6,0x3b06d885,0x3a87c4e4,0x3a6bc613,0x3ab28fd9,0x3b43e7e9,0x3b9dc99a,0x3ba92d5d,0x3b37d40e,0x3aacf813,0x3981034d,0x3a161247,0x3a45de9b,0x3a3cb346,0x3a176d10,0x3a3cb65d,0xba0afc1b,0xba43fae5,0x3b24c8de,0x3c1bce01,0x3c8e1b8b, +0xbbe03762,0xbba3f737,0xbb024ed9,0xbb84f452,0xbbcd1847,0xbbffc3c4,0xbbcff264,0xbb7c5764,0x3acbb20c,0x3b92b2ad,0x3bb7ac29,0x3bd9ee71,0x3bde81b7,0x3bc6227a,0x3b974937,0x3b0a02fe,0xbab3eca5,0xbb51b9eb,0xbb7df029,0xbb8960c4,0xbb8e5c5b,0xbb2fd0ee,0xb8fda0c9,0x3abe51cb,0x3aa4d3c1, +0xb957c091,0xbad1cce4,0xbb010429,0xbad27b77,0xbaa7cd66,0xbab0bbb6,0xbb26dee4,0xbb4a71a0,0xbb95ae11,0xbbc662fd,0xbbe2b5d2,0xbaa00702,0xbb435437,0xbb7f6853,0xbb4f368c,0xbb2fad8f,0x394dd00b,0x3b0f84f5,0x3b7f79d2,0x3b8b1770,0x3b9f0d62,0x3bb8d16e,0x3b96c8a9,0x3b6ba3c3,0x3b1ee952, +0x3ad0cf51,0x3a651d40,0x39778ef5,0x3877ef39,0xb9b0dfa6,0xba9bd08c,0x396fe777,0x3aa3c363,0x3b0a5181,0x3b4d7cf2,0x3b9b8aef,0x3bda1d0d,0x3bbfda1e,0x3ba1371a,0x3b94c44f,0x3b2e3c0a,0x3a87ee8d,0xba7c2945,0xb9bb96be,0x381c3e72,0x393460f2,0xba2f2823,0x3befd425,0x3bfd2689,0x3bf44149, +0x3be29fc7,0x3bc7cad6,0x3bb8c17d,0x3ba821a0,0x3ba439ef,0x3b80e64c,0x3b3d6ce2,0x3afafb68,0x3a7590ff,0x38dcd7f3,0xba750ab3,0xba54c151,0xba56a7d5,0xba5d8138,0xba870997,0xba845b88,0xbab01f19,0xbab99a88,0x397691fa,0x3aaa1dec,0x3b102eb8,0x3b33cbf1,0x3b89e337,0x3b8f8260,0x3b9cf709, +0x3ba59c03,0x3bb2a70a,0x3bc29373,0x3bca8cf3,0x3bc8784a,0x3bc2e071,0x3bcfec47,0x3bda9177,0x3b029522,0x3b1b885e,0x3b0b90db,0x3b0ab5d6,0x3b0f7e45,0x3b0336ff,0x3aed968f,0x3adeb1ef,0x3aad86d2,0x3a88e7d3,0x3a349511,0x39dd09ad,0x39075419,0xb99c9323,0xb9394849,0xb95bcd4e,0xb94a93b1, +0xb92f7ad5,0xb93550d7,0x37ad8cf4,0xb99d8947,0xb99f21b8,0xba5a9a92,0x3a901f92,0x3a784aa6,0x39f9d80c,0x39e33248,0x3a1549da,0x3a26ee90,0x3a5097cf,0x3a6ab947,0x3a8c4100,0x3ad82666,0x3b11e292,0x3abe0618,0x3af63bec,0x39dcd2d0,0xb93e7c49,0x3923a240,0x39e89116,0x397ea32d,0x39a60aa5, +0x39b785e4,0x3a43e6bf,0x3a0128a7,0xba0ad172,0xba108066,0xb9bed6d7,0x3a9d07f9,0x3861b17f,0xb6452986,0x380a2cd0,0x395bc96c,0x39a17674,0x3a2dd1c5,0x395d8d49,0x3888ed66,0xb9066a19,0xb8e76951,0xb8aed838,0x39cde7f8,0xba5dbd3c,0xba5dab33,0xb9e283d7,0xba0b55f3,0xba12a7fe,0xba871248, +0xb9b583c4,0xb9939ef5,0xba99248e,0xb73ac041,0xb4b63c80,0xb981738e,0x3832153f,0xb9d0f40b,0x3a02852b,0xb89aba91,0x3974f5cb,0x3a02a54e,0x3b147692,0x3afb2d1c,0xba1d315c,0xba900370,0xb9e690a3,0x3b5600cd,0xb917d124,0xba94613a,0xba5fbb31,0xb7090f45,0x3a8bbb16,0x3b22e866,0x3af71bc4, +0x3abaeeaf,0x3a6cd443,0x3a033aac,0xb9bae0e0,0x399dde88,0xbaff4416,0xbb15d95d,0xbab4b44a,0xbae6fa17,0xbae4b8f2,0xbb408ec9,0xb9aa6a07,0xb9867215,0xbb416eb7,0xb93a4320,0xb9784bde,0xbb042668,0xba89ede6,0x39bce809,0x3b3de6ca,0x3ac7fcdd,0x3b294655,0x3b1cfaaa,0x3bacfe73,0x3b8caa03, +0xba24ed05,0xbb01e0fd,0xbadaf8b9,0x3bd11221,0x3a31f0f4,0x3a089874,0x399fcca0,0x3ad4c4d2,0x3b1f9da5,0x3b8a3a18,0x3b1bd2bf,0x3aa70d00,0x3a584675,0xb9b1f3b5,0xbacd78cb,0x38408728,0xbba135f1,0xbb9890bd,0xbb7b55f6,0xbb927349,0xbb8e5f8a,0xbbfc66fb,0xbb7ac344,0xbb54f8b7,0xbbe0d5af, +0xb994e0ba,0x3a0bb824,0xbb393be4,0xba270122,0xbb1b7ac2,0x39a0720e,0xba9eb261,0xba344f04,0x39d7bfa5,0x3bf5417f,0x3bf54871,0x38f2e0e2,0xbb490c69,0xb883da2c,0x3c2d1023,0x3a5bb113,0xbb9852e4,0xbb8d2eb8,0xba0a9109,0x3b9538b3,0x3c159565,0x3c017dda,0x3bc66f96,0x3b9ccb80,0x3ae86057, +0xba1aabc5,0xbaf866a3,0xbbb0c070,0xbb5bf397,0xbb23cae4,0xb9e86dbb,0xb99104e3,0xb90594f2,0xba65a4c6,0xbaad3895,0xbbac936b,0xbaae2d49,0xba5fb290,0xbc01eb39,0xbb968c38,0x3c4e04fa,0x3c73f7a4,0x3ca85b69,0x3cb0a831,0x3c9a6597,0x3ba276a8,0xba9c01c0,0x3b737ef5,0xbb1b21eb,0xbbb6459c, +0xbbd6a73d,0x3b5679d0,0x3c5caa11,0x3caddec6,0x3bf3fb2c,0xbb5907de,0xbc2375f8,0xbc77bd54,0xbc7fa0fa,0xbc5391fb,0xbc4d4af8,0xbc1b8b1a,0xbba452c8,0x3b97fc7f,0x3b59a0c3,0xb58a486d,0x3a65a4a6,0x378d5265,0x3a108af5,0x393e0052,0x3ab3aa74,0x3ab3991d,0x3b8b4f4c,0x3c0cf0ea,0x3c35ef9b, +0x3c3f4f20,0xbbaf705a,0xb9fa01ef,0xbb408a2c,0xbbff697e,0xbc2342f6,0xbc96a62f,0xbc718199,0x3adea4a0,0x3b589fe8,0x3c05e9a4,0x3c236a94,0xbc1a17fd,0xbc9f8960,0xbc82c790,0xbc0d3a1e,0xb80eb90b,0x3bfcb3a0,0x3c0d1f01,0x3bbe744d,0x3a5e4193,0xbadfce3a,0xbadfab3a,0x3a9eac0f,0xba8ac6e8, +0xbaa0e820,0xb99da1e1,0xb9994640,0xb940da91,0xb958f7db,0xb97e54b5,0xba20eee1,0xb9b79d42,0xbb3dac0b,0xbb181fb6,0x3b3fb539,0xbb6b02d4,0x3bc4c749,0x3c9b4c23,0x3b48f853,0x3b8fa4e3,0x3c90650b,0x3ca09d94,0x3c8f8ad0,0x3c8088c4,0xbb55250c,0xbc3a980c,0xbc34303d,0x3c20e15f,0x3c93e109, +0x3c4134a0,0x3b0ea20e,0xbb7512cb,0xbb86887d,0xbbabad8f,0xbb3c0a34,0x3919c5d2,0x3a9fcfce,0x3a23f8fe,0xbab9a336,0x399c7811,0x3a171909,0x39856f0d,0x39345365,0x39438bca,0x390959b1,0x395aa26a,0x3974c0cb,0x399bc113,0x3ab3b137,0x39f64aac,0xbc068114,0xbaa62970,0xbc574245,0x3c3a7485, +0xbc38b4c1,0xbc9cc13b,0xbcc54c0e,0xbc96f31e,0xbb1d005e,0x3cb6bb51,0x3c706c6c,0x3bfebcec,0xbb85e8d7,0xbb8479e7,0xbbb7f6d2,0xbba53fb8,0xbbb39885,0xbb79a184,0xba2781ac,0x3b31e334,0x3bae7f26,0x3be4d1ae,0x3bcac3e2,0x3b9834ac,0x3a934fdb,0xba2f90da,0xba02cb52,0xb9411a15,0xb9797d69, +0xb96bcdd8,0xb93d2e16,0xb94e845f,0xb937a9fd,0xb9a5a65a,0xb9987c13,0xbba2fc6e,0xbccea084,0xbce3c3d3,0x3cccc09a,0x3c9968fb,0x3c00b88c,0x3b5548cd,0x3b38a877,0xb9ae80db,0xbbbf5bec,0xbc27dcdc,0xbc38d841,0xbc1c091d,0xbbdfd831,0xbbb6b1b5,0xbb53e84b,0x3a823c63,0x3b09b788,0x3b4d55a0, +0x3b6a9f16,0x3b62ce9e,0x3b8aca4f,0x3bb5ab14,0x3bec8c52,0x3bfcffd7,0x3bacd355,0x3b20cf75,0x3a2cf565,0x3987b984,0x39e8e484,0x39dae6b5,0x39b58f29,0x39608963,0x39b6f4bf,0x39bd975c,0xb8e64a1f,0x3b85bc07,0x3c2e64e6,0x3ccc9799,0xbb4f5c3f,0xba07f689,0x3a8fa017,0xba5f50ca,0xbb545f21, +0xbbb32922,0xbba042f4,0xbb84a3b2,0xba0d8bfb,0x39fa5360,0x38b20078,0x3a1d4aea,0x3a1a9dca,0x39903afa,0xb8883545,0xba8ac96d,0xbb3c2dd5,0xbb5e27f9,0xbb541a12,0xbb4041d0,0xbb269854,0xba8889be,0x3a8c9e48,0x3a8eae8f,0x39c28333,0xba5e5734,0xba89ea7e,0xba7583ed,0xba388c61,0xb9e13fe4, +0xba0130ec,0xbabde9c3,0xbb180207,0xbb598058,0xbb8d0fd6,0xbb858e72,0xbb9d9b42,0xbbd830b6,0xbbdf74e6,0xbbca544c,0xbbbef8bf,0xbb5e5c3c,0xbaf0206e,0xba1226cc,0x3a7aa9c7,0x3b3c1990,0x3b9efa50,0x3bb016d5,0x3bbd1148,0x3bc6ed38,0x3b9c9a9b,0x3b6faa88,0x3b2b3de5,0x3afcb907,0x3a8fddc2, +0xb8ba6e97,0x3aae776d,0x3b1c1716,0x3b60f480,0x3b53dfc6,0x3b6c76c3,0x3b611ca5,0x3b3ad40b,0x3ad4c3e1,0x3ad56b3b,0x39332bb1,0xba3d0d13,0xbb164fae,0xbb1e4818,0xbb33e512,0xbb464f8d,0xbb85ce04,0x3bb22f30,0x3b8d7211,0x3b8f3b2e,0x3b8c933d,0x3b835ea2,0x3b878bc9,0x3b8b0123,0x3b932747, +0x3b895e6d,0x3b6b94ce,0x3b4562c6,0x3b244aaf,0x3b0ab15c,0x3ae61307,0x3ae98f14,0x3afa5439,0x3b003eb8,0x3afe69e2,0x3b0859a9,0x3af159f7,0x3b02eeaa,0x3b53f85c,0x3b88d13e,0x3ba72e75,0x3bc377b8,0x3beeadef,0x3be20c7e,0x3bd90140,0x3bd124f1,0x3bbefe14,0x3bb3ca9d,0x3bac39e9,0x3ba310c3, +0x3b9d1022,0x3ba1cb3a,0x3b93b35f,0x3b3d5236,0x3b2bbe9c,0x3b3d2c94,0x3b446494,0x3b51afd7,0x3b4c35e1,0x3b476a81,0x3b48017e,0x3b3f68fa,0x3b4061ad,0x3b3f8e77,0x3b408057,0x3b3cdeb7,0x3b32f5ba,0x3b35e2dd,0x3b32dbe5,0x3b3182f4,0x3b2f8169,0x3b2c7bfd,0x3b32940a,0x3b296476,0x3b2c9176, +0x3b1d52c2,0x3b633de2,0x3b5faf10,0x3b66b237,0x3b512541,0x3b4d5238,0x3b4047d7,0x3b418330,0x3b3b0b1f,0x3b2f0507,0x3b3bbcaf,0x3b4255f9,0x3b4056c3,0x3b432fbf,0x3b503da8,0xba7e0473,0xba0f3876,0xb97f70a5,0xb9ca86f8,0xb9b223f7,0xba111491,0x380fb03a,0xb90a822f,0xba5f8b9b,0xba8f20af, +0xba8555ba,0x38b6af34,0xba25c426,0xba38d6ad,0xba4ba1b9,0xba7b59b4,0xba6d5376,0xb98e126f,0xba2e87e4,0xba476195,0xba86dc00,0xba6be2d0,0xba5f10bf,0xb9846df4,0xbad50998,0xbad6e2f0,0xba2ecdf5,0xba9de59d,0xba908a71,0xba867331,0xba320747,0xba3beeb5,0xbaa9c4e1,0xba317dd2,0xba4c5c83, +0xba7705d6,0xba37c79d,0xba46939d,0xb86cf88e,0xb9e4e090,0xb9e0c642,0xba713c91,0x3a9ac52b,0x3aa0085c,0xb9e2eb72,0xbabf53c0,0xba9c1ba8,0x3ab8255e,0xba24f38f,0xbae29823,0xbb148f6e,0xbb38980e,0xbb030363,0x39c1018f,0x38059f43,0xb8db22f1,0xba44e74b,0xba31b62a,0xbaa83630,0xb8bce561, +0xbb40e164,0xbb517ed4,0xba7d054b,0xbb55f9b5,0xbb6364b5,0xbb51412c,0xba971580,0xba1f2c98,0xbb0501f1,0xba2ea63c,0xba626ce8,0xbb05c79f,0xbaa8ae1e,0x38133095,0x3b0e2506,0x3aa0b863,0x3b061394,0x3a3e1735,0x3b8c2315,0x3b7b42cd,0x3a38bae5,0xbadd14d5,0xbb0246c5,0x3b5b0ade,0x39b98603, +0x37eb2415,0xba835d62,0xbb05e49c,0xbacf8903,0x3b05a975,0x39d33db9,0xb9791c20,0xbaa2423a,0xbab76353,0xbb14a251,0x38b5cbb5,0xbbb898c6,0xbba4de74,0xbae2c8be,0xbb799ac1,0xbb40ced9,0xbb5f2f20,0xbae1892b,0xbaf0b698,0xbb5c2abe,0xba098891,0xb9a0d827,0xbb30afc2,0xba953d24,0xbac62297, +0x3996e1f9,0xba226d9d,0xbab1e2b9,0xbb2d1c7e,0x3baa0025,0x3bdd4dd0,0x3b1b4eaa,0xbb0f45ba,0xba8df45c,0x3bb7d40d,0x3a51e23a,0xbb91c321,0xbbeac7ae,0xbc09a34f,0xbb8a7be9,0x3b6c03e9,0x3b5f2470,0x3b1bea2d,0x3a37f02c,0xba466303,0xbb0f7e2f,0xbabeb023,0xbb999f00,0xbad90664,0x385fbe86, +0x399e8fdd,0x3a6eb81d,0x3a75fc15,0x399a2fa8,0x3995ebf0,0xba5b6865,0xb9cc8756,0xb9d7fbba,0xbba46311,0xbb65839b,0x3c1cf999,0x3c28d2df,0x3c8fde03,0x3caa6871,0x3cafe3f8,0x3bd728a3,0x386a8ac6,0x3b9ad3a2,0xbaade528,0xbb81769d,0xbb7fd013,0x3b624a22,0x3c6b346b,0x3cc5a13c,0x3c77fcd1, +0x3ba7c4af,0xbb4a892d,0xbc295e50,0xbc414b26,0xbc1933ad,0xbc133237,0xbb9cad92,0x396d6312,0x3b5a177c,0x3a9d855d,0xb8ff27ae,0x37c786b7,0xb9cef8bf,0xb9b218e3,0xb9180b03,0x386f3a6a,0x39011162,0x3a116ac6,0x3b6437a4,0x3bc7902d,0x3bf97165,0xbb3c96a3,0x3b51c6b1,0x39e6b82a,0xbb991512, +0xbc02c102,0xbc898232,0xbc84873d,0xbb2da72b,0xba027100,0x3bd4c89c,0x3c65272b,0xbb78e738,0xbc8323e6,0xbc914852,0xbc32eb17,0xbb296cd1,0x3b952208,0x3ba0b5c3,0x3b0d1681,0xbb2e0bcc,0xbb3c9de7,0xbacef980,0x39a90a8f,0xbaaa99d4,0xba090c3e,0xb842fc3f,0x380e9ed2,0x3917787a,0x392ce94c, +0x38c5f077,0xb85fc4b9,0xb7715ab2,0xba087174,0xb9a73d64,0x3a28d960,0xbb1907c5,0x3c5a4722,0x3cb0204e,0x3c20b9bd,0x3ba8c276,0x3b987691,0x3c91d955,0x3ca06ff4,0x3c76f35b,0x3b970df7,0xbbcb468b,0xbc8485a8,0x3b4bd71c,0x3c7464be,0x3c9a27c5,0x3bde5fd1,0xba1b5eb9,0xbad44b72,0xbb2d5b4c, +0xb98c3094,0x3b5ed8b1,0x3b4d46f0,0x3ae55789,0x38a8a689,0x3a380646,0x39736f1a,0x38645edc,0xb798e2d8,0xb890dacf,0xb8b2e62c,0xb8c42ae7,0x3892f2ed,0xb88e6dec,0x398c3033,0x3a5bd0a6,0xbb92cfd8,0x3b3f3006,0xbc574a1a,0xbcacd600,0xbcc12d0b,0xbcad29fe,0xbcbff7fe,0xbccd55b1,0xbc6b42ea, +0x3c08e5f2,0x3c85242d,0x3c6f8b38,0xbb31bdfc,0xbb398d3a,0xbbe660fb,0xbbfe1abd,0xbc03f8bf,0xbbb90edc,0xbb44e375,0xb957939e,0x3af10edb,0x3b7902b8,0x3b7782da,0x3aca263a,0xbaa26212,0xba02b15a,0xb9254eeb,0xb78e6e2f,0xb7cddea1,0x38594d13,0x38a87f39,0x38be9d2b,0x37ef3913,0xb7f06131, +0x387ceaa2,0xbb1a5470,0xbc8cbce9,0xbc79b120,0x3cdc4591,0x3cb8b017,0x3ba52dff,0xbb8ef54a,0xbb131d7b,0xbb75edee,0xbbab0f8a,0xbbf26f8c,0xbc1f662f,0xbc15bc66,0xbbee8188,0xbbc6140a,0xbb6b8504,0x3a08bef7,0x3b039a47,0x3b531bba,0x3b8a4e6d,0x3ba9131a,0x3bd7424f,0x3bfd5cbe,0x3c0f2f4e, +0x3beac395,0x3b52cd7a,0x3a6fe31e,0xb8ed81cb,0x391b3872,0x37a0f08e,0xb859af73,0xb90c3942,0xb90544e6,0xb9406d97,0x391a60c0,0xb9d09ff1,0x3b83c01f,0x3c03fa2f,0x3cb5f5a9,0xb62ef396,0x3b32291c,0x3b4871f2,0x3b1916d4,0x3a08d297,0xbae01ae3,0xbb2c1ceb,0xbb7870ad,0xbb211793,0xbb220377, +0xbb526ce3,0xbb51b456,0xbb76b347,0xbb96c686,0xbb845d38,0xbb66acf1,0xbb5cc979,0xbb3eaf65,0xbb0d9caf,0xbadeb663,0xba6af318,0x3a1c2b87,0x3ac98087,0x3a18263c,0xb89b42a4,0xb9905cf3,0xb84c9c93,0x392fbac1,0x3975b8fc,0x39cdb3d6,0x39c58514,0x3935e280,0xba0b8dfb,0xba4b5d7e,0xbac504ab, +0xb9957e1c,0xbbd36534,0xbbeaff43,0xbbd45371,0xbbc74748,0xbbb46c68,0xbb8a413a,0xbb62fa3c,0xbb468aa9,0xbac5ce9e,0x396c846a,0x3b051ab9,0x3b6b7d4b,0x3ba5d89e,0x3bd4c6c3,0x3bb03b53,0x3b8b509e,0x3b4ff902,0x3b2bcf8c,0x3b0c3ab3,0x3aaba43a,0x3adf76e1,0x3b0da7da,0x3b24c3db,0x3acf101c, +0x3a95f222,0x393e8c39,0xb8c01c19,0xba6ac623,0xba3afd67,0xbacae835,0xbb06d10f,0xbb49af29,0xbb7e8c23,0xbb9f7c79,0xbbb5c081,0xbbca1332,0x3a7ab9bb,0xb9e879a3,0x38c64b19,0x3a192daa,0x3a7b85a6,0x3ac5bb07,0x3b0dfff4,0x3b39724f,0x3b586d7e,0x3b626a21,0x3b661499,0x3b691907,0x3b6c1d4c, +0x3b806e09,0x3b7809bd,0x3b82602f,0x3b848db2,0x3b866d12,0x3b8914c3,0x3b853c36,0x3b806a9f,0x3b9a7e70,0x3ba980c6,0x3bb6c8cc,0x3bc3fa40,0x3bcf7151,0x3bb785db,0x3ba0c5ae,0x3b8e6060,0x3b6486ff,0x3b3a99e1,0x3b269c78,0x3b0b5b14,0x3afcd48c,0x3adf750c,0x3a69d1d3,0x3b383216,0x3b203150, +0x3b3fa5a1,0x3b4c6181,0x3b5d7182,0x3b65aeea,0x3b6b89f1,0x3b73476c,0x3b791a6c,0x3b83680c,0x3b8b6eb4,0x3b93b8c9,0x3b99c7ac,0x3b9e950f,0x3b9d5bb8,0x3b9b9629,0x3b99d6bc,0x3b975b43,0x3b949e19,0x3b967f9e,0x3b8d0f74,0x3b884e9f,0x3b809ff9,0x3b94a4d4,0x3b9070d7,0x3b9b39e7,0x3b913a7c, +0x3b8ca739,0x3b839d15,0x3b7f62a9,0x3b6f9ead,0x3b55c259,0x3b4dd243,0x3b47946b,0x3b3eaf94,0x3b3b68c0,0x3ba3bdb1,0xbad9340b,0xba94f4ee,0xba6ceb2a,0xba6c0daa,0xba6a16e0,0xbab21f38,0xba27afde,0xba308f3b,0xba784a1c,0xbabf1f8c,0xbac9c60a,0xba9a1199,0xba9009c4,0xba975ab7,0xbac3fbdd, +0xbb009411,0xbb02b04a,0xbaab45c9,0xbac1cd9e,0xbac555b1,0xbaf1bb9d,0xbad24e60,0xbac6baad,0xba608f87,0xbb12249b,0xbb0d3c60,0xba5ac2db,0xbae19530,0xbadb4fdf,0xba9c0db9,0xba8c1bca,0xba84c4ce,0xba93fc80,0xbaa48ad2,0xbac1cef6,0xbabb897f,0xbaa8b4e5,0xba8aefa4,0xba2637d6,0xba349e8b, +0xba69dd73,0xbb08b41c,0x389b945e,0x39f86288,0x38752054,0xbacb49ed,0xbaec28ac,0xba7919fc,0xba34c657,0xbad38992,0xbb565e02,0xbba23ff3,0xbb978c32,0xbb044c5b,0xbae1503e,0xbabf47bf,0xbb0fbf9a,0xbadbb391,0xbb032d51,0xba308a6a,0xbb59e1f9,0xbb6c1be9,0xba9965cc,0xbb894839,0xbb8b6448, +0xbb2dc92d,0xbab93ea1,0xba641f6e,0xba75ab9e,0xba9d2a7b,0xbacd7d46,0xbb042080,0xbacf93d0,0xb9643fec,0x3ab90e03,0x3a972ed2,0x3ad8852e,0xba610ef3,0x3b4745cc,0x3b5494b0,0x3b2d39b3,0xba7d19d5,0xbb01fc3a,0xba26a932,0x3a547a79,0x39fb624c,0xbb023c32,0xbba4fd26,0xbbab1154,0xba7e04d7, +0xbad65c17,0xbad57b4e,0xbb4e5ead,0xbb2320de,0xbb338b23,0xb9fad425,0xbba41032,0xbb78c6c7,0xb9758719,0xbaecee21,0xba2f7e94,0xba0c3d50,0xb97762a5,0xb9ff2f7d,0xb9d7fdb9,0xba1fbd87,0xba8ea15b,0xbb11d204,0xbab99ba9,0xba79df70,0x399d4254,0x391df655,0xbab661e0,0xbba282d8,0x3b1c6bb7, +0x3babb890,0x3ba5b79b,0xba4ed0f7,0xbb104dcc,0xba755ad2,0x3ac37e9f,0xbb0e88a9,0xbc0a481a,0xbc67c944,0xbc43e042,0xbb475414,0xba9a5387,0xba69aa75,0xbb39f477,0xbb32a693,0xbb362146,0xba9be2c4,0xbb11b6fe,0x3a0514ee,0x39ba984a,0x3a1160f0,0x3a0c675a,0x39620357,0x3954c2b7,0x391f808d, +0x39188b88,0x38bc6622,0xb98df5f6,0xbb27491b,0xbb1267bc,0x3bd4b68e,0x3bd0c646,0x3c5c607f,0x3c90d13a,0x3cb2824e,0x3c1d40a1,0x3b824465,0x3bdfd95c,0x3a8484b9,0xba8029ee,0x398f210b,0x3b84375b,0x3c5a1336,0x3cb81ef2,0x3ca7bb84,0x3c505c97,0x3b0f8a01,0xbbbc5baa,0xbc07b474,0xbbe4d925, +0xbbbbc4b8,0xba9acbce,0x3b0d0ecd,0x3a48bd04,0x38924c1f,0xb989f679,0xb9655d07,0xb997266f,0xb8f8e593,0xb8fcdde9,0xb8a68c8e,0xb7600da6,0xb8f0661a,0x39e60a6a,0x3af0496c,0x3b7041cf,0x39e3ad9e,0x3bad867f,0x3b79cae4,0x39be0525,0xbb64c4ae,0xbc479784,0xbc6c231d,0xbbc888ad,0xbaf3dfd6, +0x3bc265be,0x3c6cce99,0x3ad1c333,0xbc27f841,0xbc8ac31e,0xbc514734,0xbbb96215,0x3a51b906,0x3b0771c4,0x3a1e3c3d,0xbb49a210,0xbabe930c,0xb9bc668c,0xb9bb2252,0xba0acc52,0x36c630aa,0x38eb9891,0x3903333e,0x391da9a2,0x38a91d80,0x38b859eb,0x359b40ff,0x391ecafd,0xb8c11ec3,0xb9760ebd, +0x3a00152a,0x39f2ca06,0x3c89bcbf,0x3cac6d50,0x3c4b42a5,0x3b6141b1,0xbbc10357,0x3c6ee1b3,0x3cacad9c,0x3c75f72f,0x3c478142,0xb9b5c476,0xbc8d68e6,0xbb652eff,0x3c144281,0x3ca6aa64,0x3c43012f,0x3ba728b1,0x3ac52fb4,0x3a3501de,0x3ad9c538,0x3b7c169d,0x3b1396f1,0x3a6b6283,0x39dba4d3, +0x3952a8af,0xb600370a,0xb89bd3e5,0xb8c50d17,0xb8bda82c,0xb8ce8dbe,0xb7d533ab,0xb9296654,0x38e1c7b9,0xb9e7a9f2,0x3aad658c,0xbb20f170,0x3b44fecd,0xbc6bc19c,0xbd3830a7,0xbcb8dbbf,0xbc33a525,0xbc708b8e,0xbc93f6f9,0xbc894f2a,0xbc07c548,0x3c54da31,0x3c95379c,0x3b7b5288,0xba0546b8, +0xbbf1b876,0xbc0664b4,0xbc13883d,0xbbe5e2da,0xbbaa01ad,0xbb4fe042,0xbb0b9fcf,0xba03ceeb,0x38c44576,0xba977af0,0xba8495ab,0x39170112,0xb7a82d3d,0x38ccf330,0x38cea57c,0x3907e88b,0x38baab91,0x3912e61a,0x389722bb,0x396ed4c3,0xb88cfd6c,0x39f3f4f0,0xbbbc039e,0xbb80fdb0,0x3c887727, +0x3c815ae1,0x397728b7,0xbc12c12d,0xbbf6fc0c,0xbbe7f486,0xbb9b6f2b,0xbb6a716e,0xbbe3d6e7,0xbc061da3,0xbbedd5d8,0xbbbb495c,0xbb534330,0xb948ad9d,0x3aa75822,0x3b367a5c,0x3b9ce570,0x3bc93e95,0x3bf2e2a0,0x3c0255bd,0x3bf7bcaf,0x3b92d891,0x3a836e4d,0xb90dffcd,0xb8bff196,0xb8f8fc6d, +0xb9593793,0xb948abf2,0xb95a1806,0xb946bed4,0xb9aa6655,0xb8ad24f7,0xba2ec491,0x3a4ce4f2,0x3ba98bde,0x3c2f7595,0x3b710dc7,0x3bc21921,0x3bb389f5,0x3bc14989,0x3b898648,0x3aedbc82,0xba4a1338,0xbb4e392e,0xbb882501,0xbb94be24,0xbba35f24,0xbba3a53d,0xbbba307a,0xbbe1f3e2,0xbbb31059, +0xbb854ea8,0xbb3a7162,0xbae87007,0xba23e65a,0x3951360b,0x3aaaf9a5,0x3b03a4d1,0x3ad01ac7,0x39d10510,0x390c4aa8,0x39bfb438,0x39c2ab75,0x39e33f73,0x39c4732f,0x39f90d76,0x3a083b93,0x3a2c9903,0x3a12eeb2,0x3a9bc8d4,0x3aa15514,0x3b314cae,0xbba751cd,0xbba5fa16,0xbb8c094c,0xbb8e62a2, +0xbb7a2f98,0xbb536281,0xbb3caf16,0xbb3fe1b2,0xbb05e64f,0xbaabee11,0xba03d870,0x3a7f990b,0x3b230fbe,0x3b837d66,0x3b683efa,0x3b422270,0x3b1de3cd,0x3b1d6873,0x3b1d4cf6,0x3b20fbf5,0x3aed7ad7,0x3aa6b932,0x3a5f731f,0x373a20ca,0xba0bcc62,0xba7dcf0d,0xba6a1403,0xba82511a,0xba4e273e, +0xba836d68,0xbaa971ae,0xbaeb1c21,0xbb35dc8b,0xbb800f64,0xbb9d4b2d,0xbb9e64a7,0xbb190f46,0xbb6350d5,0xbb27f30a,0xbad1d61a,0xba500e4a,0xb911465c,0x3a38d314,0x3ad1f71e,0x3b1e1bf9,0x3b4c4ac9,0x3b713e4d,0x3b86e519,0x3b926e5c,0x3ba9978d,0x3ba1d34c,0x3ba5c823,0x3ba583a3,0x3ba630e3, +0x3ba400cf,0x3ba495f1,0x3ba0d793,0x3b98c338,0x3b8e3752,0x3b82fdd6,0x3b720c93,0x3b439aff,0x3b101e0f,0x3abbe6bc,0x3a5be25a,0x38c95aa0,0xba0229a2,0xba37ba59,0xba850e02,0xba872605,0xbaafbbe1,0xbb0f85ac,0x3b20b02b,0x3ae8f7ac,0x3b18f8f0,0x3b24de2e,0x3b35a119,0x3b48de80,0x3b56d9f2, +0x3b623829,0x3b6f9218,0x3b805bf3,0x3b8aed0b,0x3b96619e,0x3ba09e1a,0x3bab9cbe,0x3ba824d3,0x3ba677df,0x3ba452a3,0x3ba19f20,0x3b9f5d11,0x3b9c1985,0x3b9e0478,0x3b9ca4d5,0x3ba1fbf8,0x3b90faed,0x3b94fe4c,0x3ba5b5e1,0x3b9f748f,0x3b98dff2,0x3b8ff6b1,0x3b88aede,0x3b7e9083,0x3b607c5b, +0x3b41ba46,0x3b246364,0x3b40b769,0x3b2c6716,0x3ba7dbaa,0xbaf6bef8,0xbac09a0c,0xbaa7d763,0xba94ac00,0xba95aafd,0xbae17827,0xba88855c,0xba75bc79,0xba30813c,0xbabbee32,0xbada4fcb,0xbb04e31b,0xbaa2555f,0xbaa115ca,0xbae1844f,0xbb127187,0xbb19db83,0xbafe74a9,0xbaef8a32,0xbaec5adb, +0xbb05e76f,0xbaf99ac6,0xbafaa00b,0xbac7acb4,0xbb0d1dad,0xbb0aa873,0xbaa29b57,0xbb12455d,0xbb142b53,0xbac91ae0,0xbac1ee7b,0xbaae2e5d,0xba829fe1,0xbace8ec8,0xbae43bf7,0xbaee37ca,0xbad92084,0xbab7c6fe,0xba95e8df,0xba5d4461,0xba924215,0xbb27d9d4,0xba4c673e,0xb8c33fae,0x3a59bbe5, +0xbaa2b514,0xbb02ac7d,0xbb3bad57,0xba33e69b,0xba9533a7,0xbb577685,0xbbaaa0eb,0xbbb201b3,0xbb71cfe8,0xbb35eda4,0xbb0f7962,0xbb334fea,0xbb0f1c9c,0xbb056ad5,0xba876f43,0xbb52de63,0xbb679ba9,0xbab34d7a,0xbb559860,0xbb406e97,0xbabba55e,0xba718685,0xba11f901,0x38e7abdb,0xbab10455, +0xbafa295b,0xbadeb594,0xbada955b,0xba0c02b9,0x3960c93a,0x3a5cc4d7,0x3a8350d4,0xbaf5ef95,0x3ac7ec7c,0x3b12e9ed,0x3b918615,0xb908728d,0xbadf2c43,0xbb84c605,0x3a6559ee,0x3a7044eb,0xbb0e3bfb,0xbbb70b15,0xbbd0f12a,0xbb640ae6,0xbb3e5cb1,0xbb174418,0xbb7b2b8e,0xbb3625ec,0xbb260f37, +0xbaa0a88d,0xbb3cc3ff,0xba9979a7,0x39df0f77,0x38a7e3c4,0x3a1a9a22,0x397ff092,0x396ba181,0xb8868939,0x39a95f92,0xb993e595,0xbaa39e9d,0xbaebbe3e,0xbaae7635,0xba7a7b09,0xba08b443,0x39ad9813,0xbab06cc6,0xbbbcf4ab,0xb99f3e59,0x3b5d31ce,0x3bf10073,0x3a1b3d25,0xbb4afa86,0xbbdcc2d3, +0x3a8e8151,0xb8723bf9,0xbbf6afc2,0xbc6e08d6,0xbc70c7f4,0xbc08e9a8,0xbb973a1a,0xbb42a5e5,0xbb936101,0xbb5d9046,0xbb16fdd2,0xba375d7f,0x38d0f508,0x3a36b1c7,0xb8f43471,0xb6b9c3ae,0xb9239a28,0xb8d70477,0xb88905c4,0xb6e19ac2,0xb907beee,0x391a7d78,0x39896f36,0xba880f55,0xbabb210c, +0x3b82b4a3,0x3b8464e3,0x3c01204d,0x3c3f261e,0x3c9a54a4,0x3c2f3026,0x3bd2bdfb,0x3bdaed0f,0x3b6e3feb,0x3b3dff12,0x3b82f9f3,0x3b94caba,0x3c28a314,0x3c8ba13a,0x3cad91c3,0x3c8a6c4e,0x3bc65974,0xba80fa04,0xbb8f0f7d,0xbb99a10c,0xbb40e467,0x3a4e8f6c,0x3a7867e8,0xb960863d,0xb93282ef, +0xb86e4ab6,0x38126347,0x38143ddf,0x386074bb,0x37f99d7d,0x37a3d941,0x37cc46e9,0xb89f863e,0xb731d28c,0x3909dc9d,0x3ac4b78a,0x3b16a883,0x3b9b9a64,0x3baebb23,0x3b98c40f,0x3aca4017,0xbbcbeb51,0xbc211d60,0xbbe5b6f6,0xbadf7625,0x3b9c39f6,0x3c3099e5,0x3ba243f8,0xbb77d642,0xbc4eaa1f, +0xbc539ecf,0xbc14efca,0xbb74c1d1,0xba8935fc,0xb9855160,0xbaa87d5b,0x39f101ea,0x3914f524,0xba050536,0x389de1e3,0x38e60803,0x37d090db,0x35f558a7,0xb792c075,0xb7c60c04,0xb6f9632d,0xb6d7e6a1,0xb79ed4f4,0x38a47d69,0x3743f1a4,0xb92010de,0x3abb33ef,0x3c685192,0x3c8f14c2,0x3c27ab07, +0x39f99fe5,0xbc2ecfda,0x3c0285ce,0x3c8704f2,0x3c3f93b5,0x3c5f7ee8,0x3b443ca6,0xbc65f876,0xbbf83a63,0x3b17c912,0x3c77d050,0x3c6d22c3,0x3c335dbc,0x3bb16a2d,0x3b8d190a,0x3b5442b5,0x3b30c67e,0x39d94664,0xb79ed928,0x39976cda,0xb8d57edf,0xb868cb70,0xb824757a,0xb72c7ff9,0x36433278, +0x36e1aec1,0x36f5d6c7,0xb7447c1e,0x3869fefe,0xb9838a72,0x39afd42c,0xba5563c5,0x3ac04519,0xbc69b0da,0xbd372007,0xbc76bc40,0xbad2095e,0xbb971180,0xbbe53a3c,0xbc47eedf,0xbc8c3f26,0x3b8b711c,0x3c6183f4,0x3c2a5c14,0x3ace7502,0xbbcbddbc,0xbbe81c9e,0xbc0c7c5d,0xbbfb7c58,0xbbd89529, +0xbbacc9f8,0xbb9f9971,0xbb7f725a,0xbb2d48cb,0xbaca7ee5,0x3911d1cf,0x38426a75,0x38ba1d90,0x38784471,0x3802a1aa,0x370233f3,0x36ad6d50,0x36015f5c,0x375e597a,0x37c4de95,0x38e0de5a,0x38b8b510,0xb8e47230,0xb954c1a6,0x39b64461,0xba526c1e,0xbb44a4ee,0xbbd84edf,0xbc09c312,0xbbd934c8, +0xbb67eb66,0xbaafb8d4,0xbb8e1c9d,0xbbdb0f7c,0xbbd851f4,0xbbac69ce,0xbb46d694,0xbabe7aaf,0x38d28628,0x3afac17a,0x3b91a417,0x3bbb1001,0x3bd503f3,0x3bd81d71,0x3b9f3a97,0x3af682ba,0xb9a2097b,0xb92eb219,0xb9067b22,0xb9065596,0xb8588e5f,0xb81c7758,0x33514a79,0xb7e217ed,0x3779034c, +0xb93e2fb9,0x38cb728f,0xba8485b9,0x3ad93d9a,0x3914e524,0x3baeb301,0x3bf0eb9e,0x3bd2b930,0x3bdb93a6,0x3b9a1584,0x3b280eac,0xb9e32442,0xbb1a6c85,0xbb9b4a1f,0xbbaf7200,0xbbbc5e1a,0xbbb1690c,0xbbb89de3,0xbbd32bcb,0xbb8e0462,0xbb3b4bde,0xbaf1d239,0xb9de0d53,0x3a6b3ce5,0x3b09ba54, +0x3b2a65a8,0x3b136235,0x3a51792c,0x3989ea38,0x39a8d916,0x39657714,0x390331fe,0x386c4c33,0x36dc5ec2,0xb781fc98,0x3881ebbb,0x38a5b951,0x39d46274,0x3a00ac73,0x3af3c4bf,0x3b598700,0xbb4d38a4,0xbb3de940,0xbb213005,0xbb353c81,0xbb254791,0xbb146b3f,0xbb093c32,0xbb179e8f,0xbb003e02, +0xbaff83ce,0xbafe5b7f,0xbabf50f3,0xba5da6f8,0xb98f148f,0xb8cddc92,0xb7a5c5bf,0x38a65d89,0x39e1a7df,0x3a2779c2,0x3aa267f2,0x39b29254,0xb99c86ae,0xba1a6a95,0xba7bca1f,0xba5ec570,0xb9d2d727,0xb96b89fa,0xb8000db8,0x389f2e3c,0x391ee167,0xb7c5c48d,0xb84b6cc0,0xba7a9278,0xbae97ec6, +0xbb32f1aa,0xbb37c36b,0xbb7539d6,0xbb82d781,0xbb4e761f,0xbb19a129,0xbad63443,0xbaa0a9f8,0xba2aa797,0x379de3d8,0x3a3039c5,0x3ab1f219,0x3b02683b,0x3b21485d,0x3b3c8af8,0x3b65dd8f,0x3b64a970,0x3b6e9145,0x3b756a2d,0x3b7d559c,0x3b804ae9,0x3b8836d4,0x3b818d46,0x3b4094cc,0x3b1106ca, +0x3ac8f691,0x3a5aecd7,0xb8a7d759,0xba0f9456,0xba740925,0xbaaf6925,0xbae57dbe,0xbb0fb6f3,0xbb220b73,0xbb32a383,0xbb36166c,0xbb45cad8,0xbb5a7821,0x3a47ed92,0x39aafd44,0x3a258c06,0x3a440e4e,0x3a6fc87b,0x3a9b1576,0x3ab53b64,0x3ac6625f,0x3adc6b1a,0x3af3ea2a,0x3b0855f9,0x3b1a7400, +0x3b2c1ecd,0x3b3fbcc1,0x3b3db8ac,0x3b3f1d76,0x3b3f36a7,0x3b3f54de,0x3b401e59,0x3b3b5ae5,0x3b4618d2,0x3b4937ab,0x3b615bbd,0x3b19ef06,0x3b2a068d,0x3b42fd77,0x3b35373f,0x3b217a5a,0x3b10f616,0x3b00b2f8,0x3ae5f58c,0x3abe925b,0x3a8fbd02,0x3a3762c6,0x3aa98549,0x3a6b3a99,0x3b328e12, +0xbad72ac8,0xbab29921,0xbaafaf8b,0xba8ef203,0xba8e137f,0xbac72054,0xba916355,0xba7df7a5,0xb9d9a933,0xba9dd51b,0xbac2bd47,0xbb0d73b3,0xba9b4e4a,0xba910dec,0xbac53252,0xbaf0641a,0xbb012558,0xbb004928,0xbadcbb65,0xbad3d3e5,0xbada4eca,0xbaceb3b5,0xbad2314d,0xbaba7298,0xbad4ba78, +0xbaeb4729,0xbabd7763,0xbb0a1c00,0xbb03d50f,0xbaad7162,0xbaa73f1d,0xba8c6b54,0xba085bbc,0xbab3a972,0xbabef992,0xbac64762,0xbac1e97c,0xbaa9e663,0xbab7c6da,0xba633564,0xba895d98,0xbb09956b,0xba91777f,0xb9f0c5ca,0x3a84e8b7,0xba8330d5,0xbafa1579,0xbb64bc75,0xba5f5230,0xba596870, +0xbb282032,0xbb7ce8ca,0xbb8f8cf4,0xbb81adc9,0xbb3f39e8,0xbb120349,0xbb170c20,0xbade66a3,0xbaafe638,0xbab50a9c,0xbb1e20f4,0xbb05b946,0xba0f7385,0xba8b6d49,0xba67adf4,0xb9a55d6d,0xb9817a48,0xb924edd7,0x39eb30b5,0xba61b4dd,0xbae03c87,0xbab31337,0xbaab53b8,0xba2eda5e,0xba7faed3, +0x3992a439,0x39a31825,0xbad6179f,0x397d2003,0x3a672fc9,0x3b8d3e6c,0xb898082f,0xbad43044,0xbbafd1a1,0xb6c77d3a,0x3a09a2aa,0xbaf4833b,0xbb84618b,0xbba40c63,0xbb8e2dc0,0xbb4c82a9,0xbb14839a,0xbb420d0c,0xbaf4a43c,0xbadb615d,0xba617802,0xb93e763f,0x39c9dc22,0x39a8d22b,0x39a1ac46, +0x39c57446,0x3921ee2c,0x3916c91d,0x374d0744,0x373415d6,0x394566f4,0xb960dc38,0xba899beb,0xba90b854,0xba83ad06,0xbacde037,0x37225186,0xba833837,0xbb891253,0xbacf6601,0x3acb8139,0x3be0b9a5,0x3a134309,0xbb6ddfd6,0xbc11786c,0xb9b74a3a,0x3a023373,0xbbad4264,0xbc27c652,0xbc41aa74, +0xbc2123ae,0xbbc48e18,0xbb734c98,0xbb82c1c1,0xbb1e30ff,0xba722a1e,0x38e19740,0x3969b839,0xb8efd27f,0xb9228fce,0xb907766a,0xb91fc3c6,0xb8be82f2,0xb83d645c,0xb6f402ba,0xb7549de5,0xb883434c,0x3959a1b3,0x39019b1f,0xba3429ca,0x3b0aaaac,0x3b1e930a,0x3b342d17,0x3baad822,0x3c505a19, +0x3c07f797,0x3bb1fb97,0x3b4e07fe,0x3b90e02a,0x3b9cbe1b,0x3b865d6b,0x3b477bff,0x3bad8e47,0x3c1a80d5,0x3c80d079,0x3c715240,0x3beaa8c4,0x3b272639,0xba142400,0xbaf62305,0xb9c9fa6d,0x3a491bef,0xb8bdf4bd,0xb89ccc18,0x36d9e8ab,0x38b66889,0x3868f77b,0x38905ad0,0x384d7dd4,0x379fbb81, +0x3648e291,0x381b55d8,0xb735aedf,0xb8645bd1,0xb8c35eb8,0x39deb82c,0x3b025e18,0x3b2a4857,0x3b907185,0x3bc15b86,0x3b942958,0xba9d67b7,0xbb99181e,0xbbb40fa5,0xba9280c2,0x3b3e92e9,0x3bc24e22,0x3bb9bf99,0x3a4e7c43,0xbbe43513,0xbc311552,0xbc2f67e5,0xbbe79c71,0xbb874f0f,0xbaf00f3a, +0xb9881460,0x3a377355,0xb90f4b3d,0xb8a1d1ec,0x38dd7349,0xb7e9282d,0xb7d800e5,0xb828ab26,0xb7f28e76,0xb7f9a5b4,0xb75b9fc3,0xb7b66260,0x370e04ba,0xb7da6f42,0x384f32fd,0x38a1da54,0xb969954f,0x3c02e24a,0x3c3d387b,0x3bd200a5,0xba4f324e,0xbc1cad38,0x3ab7e5e9,0x3c0ea8d3,0x3c0266ce, +0x3c2d09a7,0x3b8a7f9b,0xbbfdaed4,0xbbf2a019,0xbb03408a,0x3bf6c812,0x3c4e4405,0x3c51b800,0x3c052ef6,0x3bcea2b7,0x3b7e29a5,0x3ac42805,0xb9bbd499,0x38bbea39,0x38109944,0xb89625ad,0x37a1f3b9,0x37622d2a,0x37ee93ad,0x37c34250,0x37b0e63a,0x37f103c3,0x35ecf13e,0x382f6479,0xb7b88161, +0x389da41c,0xb93021e8,0xb9ce5b45,0xbc20e666,0xbce36d47,0xbc1b2bf7,0xb99163ac,0x3b1a55ee,0x39d0785f,0xbbb40ddc,0xbc5ed1fc,0xbb3594e6,0x3bc7c07d,0x3c4ea5bb,0x3b89383a,0xbb0fa385,0xbb98e3dc,0xbbc3c44f,0xbbc8346a,0xbbc8f401,0xbbab510e,0xbba150b9,0xbb9855a9,0xbb35dfe6,0xb9324318, +0x3948fec2,0xb6160ea1,0x37d48964,0xb7f57263,0xb7bfe85a,0xb7fd259a,0xb81153c5,0xb818c7c1,0xb8021ff5,0xb8382258,0xb70db2ea,0x381682c9,0xb87ab884,0x3aa486fb,0xbc02af7d,0xbc4a0bd6,0xb98fb7a2,0x3b09e158,0xbad5ac97,0xba461868,0x3850ce52,0x390a6382,0xbafddbe9,0xbb8a7cff,0xbb8c4dd6, +0xbb851bfe,0xbb24090d,0xbaff2b59,0xb9b4d098,0x3a9cf8a3,0x3b48838a,0x3b8570d4,0x3b971efc,0x3b9e0dc2,0x3b3a4c2a,0x3932909a,0xb9b66ce5,0x37e6f847,0xb8551c7f,0x384d4726,0x38094a77,0x386d97c4,0x388f92cf,0x387581f5,0x38b3e8f8,0x385b9958,0x38b8e7f6,0xb9081b52,0x3951a074,0xbadd1347, +0x3bab1822,0x3bc6ff7d,0x3b9745ca,0x3b84c906,0x3b32ffc0,0x3abe7827,0xba108e2c,0xba9ff416,0xbb5d805a,0xbb850450,0xbb952bdf,0xbb8b47da,0xbb85d3a7,0xbb85200d,0xbb06323e,0xba5fe39d,0xb98836ac,0x3a89c7e5,0x3b071338,0x3b480d19,0x3b406362,0x3acfe98c,0x39087ccf,0x395e4190,0x36c2c434, +0xb85d1f7b,0xb8b66927,0xb8f30037,0xb910e676,0xb91cf4ca,0xb9163afd,0xb95bb068,0xb7b7baef,0xb830bf84,0x399dbf74,0x3b15d113,0xba83299f,0xba00530a,0xb9de3d54,0xba3fb717,0xba719c4f,0xba7bd418,0xba75a082,0xba95e977,0xbaa3f2c3,0xbacf72d6,0xbb02f906,0xbb0e439c,0xbb139d86,0xbb21ade1, +0xbb081dca,0xbae359c8,0xbab557ff,0xba8be0e9,0xba6f57ad,0xb9cd0db8,0xba6d8c75,0xba7fb4f9,0xba2217f2,0xb9ac458f,0x3824314a,0x39475237,0x395603a7,0x3992f950,0x39a62605,0x39ba895c,0x39baf3b9,0x39ffcf2c,0x39a7d6f8,0xb8743287,0xb9ac6dd2,0xb9e1e9e1,0xbb321e41,0xbb20891b,0xbb0629a1, +0xbadc289c,0xbaae05c7,0xba9321cf,0xba6aedd7,0xba1bcb25,0xb98bd39e,0x38ce03f3,0x39f0b00f,0x3a3b933f,0x3a798675,0x3aa328b9,0x3abad915,0x3ad2262c,0x3aecdd06,0x3b02cb1a,0x3b0ce4d8,0x3b237c06,0x3b1a9a53,0x3a9963fb,0x39d8b614,0xb940ea1b,0xba01dad4,0xba22a644,0xba2e1432,0xba497e99, +0xba681df6,0xba846c49,0xba8eae0b,0xbabde920,0xbaec11d7,0xbb0c2a76,0xbb1f8d38,0xbb1f0e66,0xb9b0576b,0xba000a17,0xb9d716eb,0xb9b18247,0xb98876b2,0xb91382aa,0xb81f310b,0x37d064b8,0x38a51918,0x390f5787,0x39646215,0x39b1ed2e,0x39f8c434,0x3a20f25a,0x3a2fb8a1,0x3a414e43,0x3a4e8122, +0x3a609473,0x3a72b3f8,0x3a71275c,0x3a8e984d,0x3a9a09fa,0x3abf6b20,0x3a194fad,0x3a1ff821,0x3a0f1122,0x39b17a57,0x38fd1b42,0xb864d42b,0xb97a11c5,0xb9d2a0a5,0xb9fe9042,0xb9fc8f91,0xba0a4abc,0xb911a31a,0xb99c023e,0x3a05fe63,0xbaa25994,0xba9397d8,0xba9866b2,0xba749580,0xba6b705d, +0xba8c0337,0xba7bc7bf,0xba655af2,0xb9ca3e29,0xba7ceaa7,0xba9a51ee,0xbaddb853,0xba88342b,0xba7947e0,0xba95a872,0xbaa1aa20,0xbaae2262,0xbac770f6,0xbaa8279c,0xba9db7cd,0xba90d02c,0xba8b3447,0xba8c317b,0xbab622ff,0xbaa02765,0xbaa8f9f4,0xba9068a0,0xbaaa6509,0xba9c2e20,0xba60aca8, +0xba613b57,0xba3d8793,0xb9a8b2d4,0xba8579fb,0xba95723d,0xbaa649aa,0xba97230d,0xba8d5347,0xbaaee16d,0xba5b0fef,0xba64244c,0xbaa6a9e9,0xba86967b,0xba2c052e,0x3a006343,0xba79d0b7,0xbad69043,0xbb38dfcd,0xba89e011,0xba5b8929,0xbae3ae8b,0xbb0fe026,0xbb2dcbb2,0xbb465021,0xbb1a0777, +0xbaeb5a50,0xbabeb5d2,0xba742636,0xba4aa34b,0xba84a9d3,0xba1084a9,0xb9551dfb,0x391625f1,0x3855d3c9,0x3881e0c8,0x38da5635,0x38b5705c,0x382b1664,0x393ad8cf,0xb8b439d6,0xba1acb16,0xba705812,0xba7135e3,0xba4a44db,0xbad41878,0xb9a67999,0xb989c9cd,0xba522b90,0xb9ddf663,0xb94a4dfc, +0x3b28e9c4,0xba028776,0xbaca263d,0xbb8c7c29,0xba7d0d08,0xb9a0a154,0xbabae23c,0xbb056bf3,0xbb336914,0xbb618f00,0xbb1ff0af,0xbae20b80,0xbac42d3e,0xba37031a,0xb9cb28c4,0x3908bad6,0x398d874b,0x389dfb4f,0x36286e25,0x374b37c5,0x37653bc8,0xb7bc28c0,0xb69d5dd1,0xb7029b28,0xb880eaad, +0x38a1eb6e,0x3960dfca,0x3812f192,0xb9f22ae0,0xba187354,0xbb0be917,0xba05c6a3,0xba3c472b,0xbaeecdc1,0xbac4a944,0x3959b037,0x3b85ff81,0xb9cb4278,0xbb61537b,0xbbe7a433,0xbad1327b,0xb9827da6,0xbb4babea,0xbba5b1d4,0xbbdabcc0,0xbbf8ca1a,0xbbab4c66,0xbb5a9994,0xbb16b09f,0xba4cc3ce, +0x386c0662,0x37605657,0xb9107bbd,0xb84dde63,0xb7055e29,0xb7986c29,0xb74d4d35,0x3774151f,0xb68bc6da,0x37195414,0x3732d5df,0xb812554d,0xb8e0f995,0x389dcbde,0x386d295f,0x3a2d6e31,0x3a9d6934,0xb8532bcd,0x3a91db11,0x3bc5811f,0x3b8fd3f2,0x3b3d0221,0xb9d15bf5,0x3b75c211,0x3b9873f4, +0x3b2693b0,0x3a909339,0x3aa4c3f8,0x3b679407,0x3c075998,0x3c16b7a0,0x3bd1fe22,0x3b89c78b,0x3b047fe1,0x3a2c3ffc,0x39d683ef,0x3594f8bf,0xb747344a,0x385bf16b,0x382bf0f2,0xb64d2c9a,0x374e4f60,0x36e747a7,0xb594cafe,0x36be1c5f,0x366ca829,0xb7b256e7,0x381f3b49,0x37bdbf10,0xb7b2c56a, +0xb89120d3,0x3991f2e4,0x3ad0450a,0x3b358407,0x3b9bc8f5,0x3b967607,0x3ad81a37,0xba5c7308,0xbb584d0c,0xba51788b,0x3a9ce03e,0x3b36a0bf,0x3ba04e81,0x3b3d462c,0xbb1818ec,0xbbd5a70f,0xbc0a2f79,0xbbeee33b,0xbbafb5e5,0xbb4fe1e9,0xba6c49ba,0xb8049207,0xb8ea29a0,0x3841a679,0xb837280a, +0xb7299bce,0xb6f193dd,0x33da4844,0xb6c43719,0x3602a002,0xb70bb1d9,0x3783d240,0xb8070a54,0x38723ca0,0xb905386e,0x3967fb33,0xb9b5da58,0x3b010c5c,0x3bac5348,0x3b321451,0xba8bb13c,0xbbc9d2f3,0xbb3e696f,0x3ac7e465,0x3b85a40b,0x3bbdd3a1,0x3b5fa243,0xbb2b9ea8,0xbbb01427,0xbb6d92c7, +0x3aed5808,0x3bee48ad,0x3c1a1f44,0x3bfcc501,0x3bc09b3d,0x3b6dd865,0x3a865e62,0xb78fcbb3,0x38a397da,0xb893783a,0x38411f10,0xb6257a2a,0x3757e535,0xb3a4b318,0x3674b8ec,0x369695ad,0xb59a34f8,0x377ff2bc,0xb7591e1d,0x381ac952,0xb89a4208,0x39823455,0xba40e233,0xbb14498d,0xbc44cff3, +0xbbce3ffa,0xbb002b19,0x3bb76679,0x3b0a0da2,0xbb040829,0xbbd441e8,0xbbae6b61,0xb94119da,0x3c0ae47a,0x3ba6029f,0x3ae542c9,0xbb04071a,0xbb3a88d4,0xbb653dac,0xbb853b69,0xbb66ddec,0xbb49c2fd,0xbb48a106,0xba6c42a2,0x39a09801,0xb8a78ebb,0x37327ec0,0xb7cfe3dc,0x3585eace,0xb6f5e694, +0xb66d2dfd,0xb6e99a95,0xb50175df,0xb79eace9,0x3774dae7,0xb8a3e68e,0x38d7c901,0xb9cc2728,0x3a8cc37b,0xbb8cc4d9,0xbc29cab6,0x3b90c716,0x3c01ae97,0x3bbf5173,0x3ba0215c,0x3b7156d8,0x3ae199fc,0xb9ae8cfe,0xbb15412d,0xbb1b5fed,0xbb503bde,0xbb1f887d,0xbb0e3e01,0xba4fc635,0x395934f3, +0x3a903890,0x3b067610,0x3b241433,0x3b4b57c0,0x3a8484e2,0xb9d3ceb3,0x389ccffd,0x36085ed5,0x37cedc4e,0x36e1100f,0x3740488d,0x37403f06,0x37003f7f,0x37a57235,0x359adfd6,0x3825e89b,0xb75597c0,0x3903dae2,0xb92aadb8,0x3a3bd168,0x3b3960a2,0x3b408643,0x3a50b90d,0xb9b876de,0xba488964, +0xbaa39bea,0xbaedf629,0xbab779d5,0xbb0449ab,0xbb0fe0d2,0xbb24324c,0xbb1bcf8a,0xbb0dedfa,0xbadf8b1f,0xb9d0096e,0x39e70650,0x3a5264ed,0x3ad34aba,0x3aff1459,0x3b268bea,0x3ae97d9b,0x393f8773,0xb7e04c19,0xb8579cd2,0xb81b23d0,0xb7a74ccc,0xb7a0b8a0,0xb7a2c742,0xb7c93a7c,0xb7bf3f14, +0xb81e0cf4,0xb7a4145d,0xb8dccdda,0xb8430184,0xb948bc75,0xb900011b,0x3a137385,0x3aa7b078,0x3a8dc7c8,0x3a68366f,0x39dea03a,0x38aeb50c,0xb9241a3b,0xba01f920,0xba7b72a0,0xbabc8095,0xbb01d327,0xbb0942fe,0xbb0fe4e4,0xbb1e8f65,0xbb0c76db,0xbaf8758b,0xbad670c9,0xbac782f9,0xbabd7a8d, +0xbaab74b3,0xba989277,0xb9f15740,0x387829dd,0x38ff52e2,0x386b4349,0x37c105dd,0x37d4b14f,0x37d75197,0x381222d5,0x37edc392,0x3840fd79,0x37ea0582,0x39058e1d,0x395802d5,0x395fa5e9,0x39e21549,0xbac82c3a,0xbaaccec7,0xbaa82917,0xbaaa706d,0xbaa4bd07,0xba9a8191,0xba99b19d,0xba940b76, +0xba830e14,0xba63c815,0xba49cd81,0xba3e1498,0xba3ba888,0xba39365c,0xba0e16e0,0xb9d7b42f,0xb9737541,0xb8b2c659,0x389ee060,0x39af6d3a,0x39b07704,0xb9bba9db,0xb9eebb75,0xb9a7a8d8,0xb8f27d16,0xb7486590,0xb58a2da5,0xb7bcde1a,0xb789ff83,0xb7b5bd6c,0x369a5a49,0xb85bba0f,0xb94b4736, +0xba2146b9,0xba7a5f3a,0xba8c7513,0xba60b1c2,0xba52d8b2,0xba5e2027,0xba55bbcd,0xba524f80,0xba5597c1,0xba53561c,0xba544ecb,0xba5d05d8,0xba6528a8,0xba6724e1,0xba67d2ac,0xba61c214,0xba5fb671,0xba49fca2,0xba3a0c21,0xba2d1f62,0xba1a30cf,0xba099da2,0xba04013d,0xb9ba25c1,0xb9952592, +0xb9717fbb,0xba2d8b27,0xba2e1a2e,0xba39fe10,0xba4f8565,0xba5d71a4,0xba6dccb4,0xba7dc6e4,0xba88b4c8,0xba8ab896,0xba8b8a97,0xba879637,0xba811f4e,0xba77c0b2,0xba557260,0xba0a6c6d,0xba07e667,0xba057951,0xb9e4a186,0xb9d0b985,0xb9d3dfb0,0xb9e1ce98,0xb9d9622c,0xb9749587,0xb9e784fd, +0xba075f3d,0xba31cf09,0xba00905e,0xb9ee69ad,0xb9ff8b4a,0xb9fd7dbf,0xba069014,0xba23a95e,0xba0b224e,0xba0242f1,0xb9dc3a94,0xb9d4f61d,0xb9f4c46d,0xba42247f,0xb946f3c5,0xb94a603a,0xb90f9050,0xb9262cc8,0xb91a90fe,0xb8e70531,0xb8ed3f2c,0xb8c82675,0xb7dbdd14,0xb93ff7e9,0xb963793a, +0xba2c7e45,0xba122474,0xba10fd40,0xba21643a,0xb9cc487c,0xb9c3f9f8,0xb9c55b41,0xb9ea16c1,0xb9be2e45,0x37b59739,0xba017dc8,0xba420065,0xba90dec4,0xba1a38ee,0xb9fa8581,0xba31b295,0xba3f4a80,0xba6bc6cf,0xba99c95d,0xba7e51d4,0xba449a1e,0xba0287b2,0xb9a67f05,0xb8152e57,0x385d6880, +0x39196949,0x388e47e1,0x38a71600,0x3881c854,0x38963205,0x385a0ae4,0x386deb43,0x3825039e,0x383260ea,0x387c824c,0x390b944f,0x381f6ed8,0xb8e55058,0xb8eba5d5,0xba7e3d11,0xb978f187,0xb96a170f,0xb8a8efd8,0xb98fadfd,0xb99d6498,0x3a30f0d2,0xb9cb3f57,0xba417438,0xbacebc61,0xba35514c, +0xb9d5e35f,0xba1b402c,0xba16d67d,0xba548f6d,0xbaadd32a,0xba764ab6,0xba2dbe6f,0xb9ce19db,0x37935196,0x38c5ae89,0x36cbd90f,0xb84be8c4,0xb7c24026,0xb7ccdfec,0xb7c762b8,0xb7985c7d,0xb7718d5f,0xb74addcb,0xb70edcd0,0xb748aaee,0xb7b735bf,0xb827a1a5,0x37d43bcd,0x38ee2be5,0x39269a2d, +0xba8f023b,0xb9b229ed,0xb961d0f2,0xb9321532,0xba0d9bdf,0xb9293608,0x3a918f5c,0xb9fba129,0xbaca7b59,0xbb2abb1d,0xba896bb7,0xb9f5ff56,0xba88f04d,0xbaae5088,0xbb03779b,0xbb3c9402,0xbb0e5aa6,0xbabf735c,0xba1de97a,0x37b319b3,0x370419c9,0xb8275453,0x3808f801,0x3716ca6e,0x3741012d, +0x3780f08d,0x375e079b,0x3700a8ae,0x37885343,0x372e6a67,0x37586691,0x378c2a6b,0x37b7dbe7,0xb803fe20,0xb7f66c72,0x37847f43,0x398df138,0xb9d0f66f,0xb90a307e,0x3aac4168,0x3a98cb3f,0x3a5103ac,0xba724c2a,0x3ac9f90c,0x3b078401,0x3a6d9f7e,0x399bdf40,0x384e98f9,0x3a45d437,0x3b0da012, +0x3b40028b,0x3b45578a,0x3b1b84a6,0x3ad49cd2,0x3a77733c,0xb8374ea8,0x359d9718,0x37748945,0xb68fd01a,0xb74ac227,0xb692eca5,0xb701a406,0xb6810a59,0xb5ee5c53,0xb6ce5f38,0xb6ec09b2,0xb5aa380d,0xb7a5a76a,0xb66875a8,0x37a88f22,0xb78f764e,0xb994c357,0x3a326f87,0x3a8c7ede,0x3af13caa, +0x3b068133,0x3abadedd,0x3a006d63,0xba95bab6,0xb9d20192,0x3930eb94,0x3a518406,0x3b04693f,0x3acffb58,0xb9952c05,0xbb0525a6,0xbb518f36,0xbb5b2333,0xbb368617,0xbaff6a9b,0xba584f2d,0x38a1037e,0x371a3d34,0xb6cee89a,0x36ae953a,0x36c28e54,0x36c79c23,0x3672164e,0x368f2860,0x36130c05, +0x3687f8fb,0xb53bffff,0x379b4d3b,0xb6fcef09,0x3821bbe4,0xb88d6041,0x39094999,0xb8bbff2d,0x3a6a2ca0,0x3a0575b2,0xba0d8f0c,0xbb07004a,0xbb11e268,0xba6035c8,0x3a97330a,0x3ad83f24,0x3aa60c48,0xb98486c8,0xbb0a5705,0xbb048a63,0xb99c07e9,0x3aeecac9,0x3b49a154,0x3b5010f7,0x3b235cbb, +0x3ad7b83e,0x3a060efa,0x3715ef7d,0xb7f10083,0x37c10466,0xb6f91a00,0x34a15708,0xb64a6a7f,0xb5f28b58,0xb62b413c,0xb6595d68,0xb40e3fd4,0xb6e0d05d,0xb54e6c2d,0x36827a76,0x3672d90b,0x36b16314,0x37c0a855,0x3a31ae75,0xbb3374f1,0xbb22a209,0xba91d87a,0x3b3c3e08,0x3aa35c97,0xb94a0431, +0xbab641c2,0xbb263ff4,0xba99190e,0x3b2670e9,0x3b2f7ca0,0x3b03fbcb,0x37dc7612,0xba075965,0xba826bb8,0xbaa2b643,0xba9590d8,0xba7aa01d,0xba4a30a8,0x38497aa2,0x3791758f,0xb76e6305,0x36c42b91,0x36a80505,0x36283073,0x367a0ee0,0x367c62ea,0x363da13f,0x3647eb63,0x369a0e11,0x35ae0529, +0x3664b3cd,0x36a24162,0x37604b8e,0xb9437683,0x3917ae41,0xbaf22664,0x3b5a44ca,0x3b985c69,0x3b99f74f,0x3b79a9c5,0x3b4219bf,0x3ae8e26d,0x3a14c5df,0xb9eb9531,0xba401ec3,0xbaa70d75,0xba977b23,0xba8b375f,0xba0f9d28,0xb9635e38,0x3809d641,0x39fe515d,0x3a32f6d6,0x3a82fb20,0xb90b75b0, +0xb463035d,0x37f579b0,0xb74befff,0xb654ef15,0xb6c7ea4a,0xb6b09b0c,0xb6a6eb12,0xb67ec714,0xb6c7c021,0xb6df3e24,0xb6c3c64e,0xb7961564,0x37e4e2a0,0xb85e90bf,0x389e7176,0x39515c8b,0x3a0ad2f0,0xba3f85d0,0xbaabd1f6,0xbab51684,0xbac25aa5,0xbab8fbab,0xba822b5f,0xba5baa00,0xba31b19e, +0xba28d577,0xba201a93,0xba0a97c8,0xb991d03b,0x38dfcf69,0x39e20229,0x3a211571,0x3a652119,0x3a5e0ecd,0x3a8c2297,0x391d4996,0xb8c136d8,0x37efc684,0x35cd55d7,0x37ca4ffd,0x371bda34,0x3745165e,0x370c4b95,0x374adb75,0x3739b9b3,0x379236b7,0x371fc4dd,0x38275750,0xb7b5576b,0x38bcec8c, +0xb943a084,0x398fc33f,0x3a9810eb,0x3a6b213c,0x3a67890d,0x3a226e3c,0x39c433d4,0x39137461,0xb8f7838c,0xb9cfeda5,0xba2bf147,0xba71d72a,0xba703378,0xba6ecee6,0xba7978dd,0xba5de5d5,0xba476244,0xba2dbc51,0xba28ea58,0xba17c7b1,0xba27cf42,0xb93d0149,0x390d4676,0x37689aef,0xb80a70d1, +0xb7be6384,0xb7c50db2,0xb7bd9cfa,0xb7cb6839,0xb7f2b42d,0xb7ddc13b,0xb8010179,0xb7f6c7ca,0xb8120276,0xb8235058,0x376eb8ad,0xb7dc6463,0xb9a9961a,0xb9c90705,0xb9ee5fcc,0xba07ff70,0xba1307af,0xba12496f,0xba1afc74,0xba21ea46,0xba1a798f,0xba145b9a,0xba15364d,0xba1a3ced,0xba272ba8, +0xba36a899,0xba2a042f,0xba20e0e1,0xba109a07,0xba081afe,0xb9e556b8,0xb9d8cc19,0xb9c94c5a,0xb8e07fe2,0x3884ebb2,0x38eb2ca7,0x38b468b6,0x38bd44af,0x3898be26,0x38bbdfc9,0x38aed516,0x38bc22eb,0x3892db4d,0x38df9206,0x38bb94a4,0x38eaae3d,0x383c8c45,0x383afdc9,0xba06e40c,0xb9c69e2d, +0xb9d8ab46,0xb9db5201,0xb9e10bd3,0xb9ef6ec4,0xb9f70499,0xb9ff83fd,0xba0800ec,0xba1082ef,0xba15f846,0xba1d3642,0xba2026ab,0xba2525a3,0xba1c59b1,0xba17a469,0xba13b072,0xba0d0e91,0xba0a91fb,0xb9fbcc9d,0xba04ede4,0xba087b18,0xba175e18,0xb9546163,0xb952b1aa,0xb9328656,0xb93b913a, +0xb93eb78b,0xb941b427,0xb9403fd5,0xb9409deb,0xb9402fcf,0xb9596b41,0xb9444e20,0xba1f51db,0xba114a6a,0xba1f5bf4, +}; + +const uint32_t defaultHRIR_rom_AlphaR16[470 * 43] = { +0x3f02f158,0x3ef2f693,0x3f03a369,0x3ec46d8a,0x3e94ac59,0x3e106c69,0x3ed4ccf7,0x3e95d249,0x3e17dce4,0x3e106b8e,0x3e0f8ab1,0x3e1bc099,0x3e05c345,0x3e01bb92,0x3e0157b1,0x3e91a887,0x3ec5ea15,0x3dea0cd2,0x3e9187c9,0x3eb88fb2,0x3ef73bfd,0x3ee40a66,0x3eed60de,0x3ef0e226,0x3ef3d05a, +0x3ef74404,0x3efa8691,0x3eff5d6a,0x3f0216ea,0x3f04a754,0x3f06f285,0x3f09006f,0x3f0c7088,0x3f09ff62,0x3f0785cd,0x3f02431d,0x3eff646c,0x3f0e5dd7,0x3f0a461e,0x3e8a473c,0x3ee48418,0x3eaee79f,0x3eaa364f,0x3ebb5a4d,0x3eac3241,0x3ebef4cd,0x3eb29698,0x3e9b3322,0x3eae9f33,0x3eac2b9c, +0x3ea99e00,0x3e8f7afa,0x3ea0f40f,0x3eae7384,0x3eb1fd9d,0x3e6c1572,0x3ee2d1e7,0x3eebfaae,0x3ef3e85f,0x3f008f6e,0x3f03c4b5,0x3f08a7d1,0x3f0da213,0x3f1418d9,0x3f1b0f90,0x3f22cbde,0x3f2ab812,0x3f3305f5,0x3f3c2bd0,0x3f39df3b,0x3f319c7b,0x3f211227,0x3f174a30,0x3f16cac8,0x3f01f13d, +0x3eb60a85,0x3eb45d99,0x3e7f50dc,0x3e7fde43,0x3e6a6019,0x3e5a4afd,0x3e2b40c4,0x3e5861f5,0x3e0d9e1c,0x3e67afe5,0x3e0b0c1d,0x3e519148,0x3e1d2405,0x3e5610d7,0x3e6fb5c4,0x3e6e6366,0x3e80bef5,0x3eae9574,0x3edbe0fc,0x3ee6d92e,0x3f02ce3b,0x3f099d87,0x3f146338,0x3f1e6fc4,0x3f2ba9b3, +0x3f38c6f2,0x3f478f5b,0x3f548de2,0x3f624b22,0x3f7103ac,0x3f6a7af5,0x3f5bb96e,0x3f3b67ae,0x3f24d951,0x3f22da2d,0x3ef5d3c7,0x3e911072,0x3e90b162,0x3e509d18,0x3e2d1d26,0x3e1b9998,0x3dcdfa56,0x3d9efd38,0x3d4a9737,0x3d7ffc9a,0x3ccae5f5,0x3ceb4b18,0x3d52d97a,0x3d432932,0x3dbba5b3, +0x3d72d4bb,0x3e12141c,0x3df87909,0x3e7cac26,0x3eb4ec56,0x3ec86433,0x3eef74e8,0x3f000f09,0x3f0e117f,0x3f1c8946,0x3f2f0628,0x3f44221d,0x3f5ba1e9,0x3f7372c2,0x3f87c82a,0x3f975764,0x3f95b6c8,0x3f886c93,0x3f5ad9f4,0x3f32b58a,0x3f3dfa3e,0x3f0391e1,0x3ec81751,0x3e9e01ac,0x3e4d7b3b, +0x3e1a8ae6,0x3e1e8db8,0x3de07740,0x3dc313c6,0x3d96efd4,0x3d9c6940,0x3d6aa789,0x3d35a2d8,0x3cfadc47,0x3d8ba1dc,0x3de1dfe1,0x3ddb92b9,0x3e490127,0x3e5f5f87,0x3eb75172,0x3f0b119a,0x3f2141d1,0x3f48fa38,0x3f6115be,0x3f7ec370,0x3f8d9fe9,0x3f9883c0,0x3fa1d3ab,0x3fa5879f,0x3fb2f607, +0x3fb0d4c8,0x3fa18bce,0x3f9664f3,0x3f89e2c0,0x3f80d036,0x3f598969,0x3f61d9ad,0x3f17be4c,0x3ed4ab3c,0x3ed1e42c,0x3ebe9d12,0x3e7f8e64,0x3e6039d2,0x3e09276a,0x3dcd046e,0x3d5912af,0x3d850757,0x3d818344,0x3d745ca3,0x3db57ff4,0x3dd2cc72,0x3e0c5d3f,0x3e35c554,0x3e85f764,0x3e8528d7, +0x3ecbd22b,0x3f10c139,0x3f1db223,0x3f3baae8,0x3f4d762d,0x3f681748,0x3f8328ee,0x3f8e30b2,0x3f974dfd,0x3f9c21c7,0x3faa6428,0x3fafb467,0x3fa6b492,0x3fa9e2a1,0x3fa07cde,0x3f93e899,0x3f792afb,0x3f9227a0,0x3f48d628,0x3ecf12b9,0x3edb0189,0x3e925017,0x3ea44a1c,0x3e0ce791,0x3e25b96b, +0x3da7c38c,0x3e012d49,0x3df00c56,0x3da4598b,0x3dcf92d7,0x3e0908b7,0x3e178cc3,0x3e5ed6e5,0x3e65a38d,0x3e82e07d,0x3e86287e,0x3ead1021,0x3ef151bc,0x3f04c31e,0x3f25d26b,0x3f37bee8,0x3f5731b6,0x3f7cb915,0x3f8e3934,0x3f9ba0e8,0x3fa52750,0x3fa084a8,0x3f9b8008,0x3f9a18ae,0x3f9d5902, +0x3fa358aa,0x3fab5b7b,0x3f9c3307,0x3f99df51,0x3f61b04c,0x3f095444,0x3f07c2ab,0x3e81491f,0x3e9fb37f,0x3e3d31a2,0x3e0bddda,0x3db68830,0x3e09ec63,0x3e638e4b,0x3e04a312,0x3da795df,0x3dc0c023,0x3e23380e,0x3e2af1b6,0x3e630175,0x3e9ea686,0x3e6d015e,0x3eb8ad0b,0x3ede7a7d,0x3ef312cf, +0x3f16b499,0x3f3e78bd,0x3f5d7823,0x3f72fb3d,0x3f89dca5,0x3f955c13,0x3f9cd636,0x3fabec80,0x3fb35f7e,0x3fb62d48,0x3fa9ba8e,0x3f9e79a5,0x3f99d50a,0x3f9bf342,0x3f9d8036,0x3f7b27b7,0x3f120fec,0x3ef39e5a,0x3ed3a892,0x3e744f51,0x3e938ada,0x3e9a8a32,0x3e27623f,0x3e3325a0,0x3e08d31e, +0x3e02315f,0x3e104d9a,0x3e286484,0x3e4cf10c,0x3e5317c6,0x3e8a664a,0x3ea13a90,0x3e8dbde7,0x3f029ed9,0x3f11387a,0x3f077f97,0x3efe0b88,0x3f182f26,0x3f388c07,0x3f64d786,0x3f818f20,0x3f913a67,0x3f9fead6,0x3fa2b14c,0x3fa61c85,0x3fafd010,0x3fa8d2b4,0x3fa6dfe9,0x3fa4f0fa,0x3fa5e8a6, +0x3f88db94,0x3f686433,0x3f0919de,0x3f03d70b,0x3eaf9d46,0x3ea340c0,0x3e9fb812,0x3e63e9b7,0x3e7ebdb2,0x3e651225,0x3e91e9e2,0x3e0d395a,0x3e10354d,0x3e3ca0b7,0x3e741f13,0x3e9999b4,0x3ec89949,0x3ec9b19e,0x3ec2b8cd,0x3f09edae,0x3f291acb,0x3f1e35de,0x3f1025d7,0x3f1bc9a6,0x3f2cae3f, +0x3f42aba9,0x3f57ad1b,0x3f6b9514,0x3f7f3ef7,0x3f872429,0x3f8f06f0,0x3f952f7c,0x3f964b17,0x3f93df5b,0x3f8cd093,0x3f89ea86,0x3f702237,0x3f4721d2,0x3f0f49e5,0x3f17b81b,0x3ed3bd0f,0x3ec157f2,0x3e9fff21,0x3e814cdd,0x3e43a1eb,0x3e98cff5,0x3e2f23e9,0x3ec02f52,0x3e2ee8fe,0x3e9b9aed, +0x3e47f25e,0x3ea2d73c,0x3e9e5c05,0x3eba495e,0x3eb9cb24,0x3f077407,0x3f21b340,0x3f1383ca,0x3f1b7dd6,0x3f230ce8,0x3f2a9f48,0x3f2df058,0x3f448499,0x3f5645ce,0x3f678d82,0x3f752f22,0x3f80d9c6,0x3f87bc36,0x3f866eea,0x3f853348,0x3f854358,0x3f7308d2,0x3f4d2c56,0x3f4ea2af,0x3e9a2e94, +0x3f2a2912,0x3ef9d048,0x3ef8556c,0x3f0f942c,0x3f03625b,0x3f1bdbdf,0x3f146367,0x3ef3f276,0x3f0f9cd6,0x3f0f2170,0x3f0ae089,0x3ee30b6e,0x3f018335,0x3f0a1df4,0x3f06f231,0x3e86b6f2,0x3f2be77a,0x3f2e736a,0x3f2fdebd,0x3f34b027,0x3f36d94e,0x3f3bd98b,0x3f3ef341,0x3f4a742d,0x3f522be7, +0x3f5a31cc,0x3f6041f3,0x3f660b0b,0x3f6dc950,0x3f64dd6e,0x3f5d51d7,0x3f581315,0x3f50bc23,0x3f3fd5e2,0x3f55e79f,0x3f15f3af,0x3ed5967c,0x3e0fb9dc,0x3f2b167c,0x3ed80bb7,0x3e1b698f,0x3e0c3391,0x3e085da6,0x3e2ad1c4,0x3dfcd47b,0x3dedc007,0x3df0df70,0x3ed28c36,0x3f1bac8d,0x3d9e0ae7, +0x3ece2576,0x3f0bb930,0x3f4bd542,0x3f365100,0x3f3d0202,0x3f3d955d,0x3f3eb02e,0x3f3f6bbf,0x3f3f6722,0x3f41dea4,0x3f43f75c,0x3f464796,0x3f493e71,0x3f4bd93c,0x3f502016,0x3f4ca965,0x3f4b0aea,0x3f484248,0x3f47fbe1,0x3f590a70,0x3e9c6ca6,0x3e9ad2da,0x3e871018,0x3ebefe1d,0x3edd8526, +0x3f049b89,0x3e9f02c8,0x3ece5921,0x3efdc856,0x3efe4ac2,0x3efc0128,0x3ef8635f,0x3efe4547,0x3f006c81,0x3effc3fc,0x3ecce7ef,0x3ea4300c,0x3f055237,0x3ed3fc8f,0x3eb876fb,0x3e806ea3,0x3e91962e,0x3e8cba92,0x3e8aad79,0x3e8a0054,0x3e89f58f,0x3e8be899,0x3e8b6019,0x3e8aff7d,0x3e8a6a05, +0x3e89950a,0x3e8a23e8,0x3e88d533,0x3e901c5a,0x3e931819,0x3e9605eb,0x3e95e4c1,0x3eb2e04d,0x3eb624e9,0x3f05915a,0x3ead4114,0x3ec256d4,0x3ebd0479,0x3ea30d7b,0x3ea1edeb,0x3e86d1c3,0x3e908e56,0x3ea686dd,0x3e9590cf,0x3e93e423,0x3e936cd1,0x3eae8724,0x3ea99052,0x3ea5ff39,0x3eac086a, +0x3ee58772,0x3e9ef081,0x3e9ca8af,0x3e9ce755,0x3e960e19,0x3e95d75d,0x3e975132,0x3e9e6157,0x3e9e9506,0x3e9d8927,0x3e9a1638,0x3e928287,0x3e8d376e,0x3e862a7e,0x3e95c4eb,0x3ea23831,0x3ead97b5,0x3eb339f2,0x3ed53073,0x3ee9718e,0x3ef19cbe,0x3ec90a1c,0x3ec1a0d6,0x3eb0f858,0x3ea0049f, +0x3e8eb873,0x3e8b7649,0x3e6f897a,0x3e9916dc,0x3e757cf1,0x3e936b48,0x3e78db6b,0x3e9695b1,0x3e9131f1,0x3e988cc2,0x3ea88f84,0x3eb57676,0x3eac3f15,0x3e9967ba,0x3e9c49b5,0x3e8c9019,0x3e89a89d,0x3e897e99,0x3e94d665,0x3e946887,0x3e93ba17,0x3e8faeac,0x3e87a14e,0x3e83f322,0x3e7141d9, +0x3e9b7ba0,0x3eb0ed75,0x3ecc1bf3,0x3edc8a25,0x3ef36135,0x3f0d3ea6,0x3f0ab587,0x3ed3b7ee,0x3eac8dc2,0x3e9c0ed1,0x3e8130ff,0x3e4f1509,0x3e1c319e,0x3e0e99b9,0x3e1542d9,0x3e08b693,0x3e074efb,0x3e064b40,0x3e2a42d9,0x3e4391ff,0x3e709b36,0x3e836249,0x3ea7db20,0x3eac87cb,0x3ea43c34, +0x3ea4c62b,0x3e9663c7,0x3e98aa67,0x3ea03e75,0x3eb6ecc5,0x3ebbeec1,0x3eb92dea,0x3eabcfe3,0x3e904807,0x3e620931,0x3e121e76,0x3e67202a,0x3ea01560,0x3ed9082a,0x3efcacc8,0x3f24ee48,0x3f269f3a,0x3f1ee8dc,0x3f0bfb37,0x3ee57180,0x3ec703f2,0x3e9ef47e,0x3e77c957,0x3e344063,0x3e105a22, +0x3e21c107,0x3e1d2a59,0x3e1c4cfd,0x3e13437f,0x3e2963a9,0x3e490193,0x3e85d1d4,0x3e950275,0x3eb3ece2,0x3ea78e67,0x3e944ad0,0x3e8d8775,0x3e34a459,0x3de5f68c,0x3d5c05ff,0x3d1be8e6,0x3c816a86,0x3d117860,0x3df8487d,0x3e0b91dc,0x3e8671da,0x3eede233,0x3f0f667c,0x3f1f8d32,0x3f22fd7a, +0x3f28ce6c,0x3f18e2f6,0x3f387b04,0x3f3c614c,0x3f1cbba5,0x3f04ce43,0x3ee80aa5,0x3eba22de,0x3eb0c18d,0x3e8bdbe4,0x3e6fe976,0x3e760e43,0x3e21a46a,0x3e05faed,0x3df67d4c,0x3e24eaa6,0x3e4b0d7c,0x3e83986d,0x3e951f78,0x3ecab6cb,0x3ed896e5,0x3ec4bebd,0x3ec3684f,0x3e9af55e,0x3e97f6a2, +0x3e8b2131,0x3e7a2636,0x3e8934f3,0x3ea1829c,0x3ec8856b,0x3ecadb1e,0x3ee7d594,0x3f16c925,0x3f15ce6e,0x3f220439,0x3f2a3540,0x3f252969,0x3ef80c10,0x3f2ea352,0x3f5141ae,0x3f1a6af3,0x3f11704d,0x3ed93a1d,0x3ed8455a,0x3ea4598b,0x3e9543eb,0x3e918a29,0x3ede134b,0x3e9f02a7,0x3e940757, +0x3e80155c,0x3e7bddac,0x3e882340,0x3eb36e7f,0x3ed0ef12,0x3ee8e6d4,0x3ef712bd,0x3ee8bc86,0x3ee426d9,0x3ebd518b,0x3eb41846,0x3e96844c,0x3e66501d,0x3e4cf29a,0x3e768da1,0x3eaf79a9,0x3f122060,0x3f3bcfc5,0x3f4a1356,0x3f5276b3,0x3f33c5f8,0x3efdb8e3,0x3f076ec2,0x3ea4f1ca,0x3f16cd82, +0x3f44dd18,0x3f0c3dd2,0x3f19180b,0x3edcb305,0x3ed462ed,0x3ebf64c4,0x3ea340d5,0x3eb33706,0x3f1a7d7e,0x3e92e4f9,0x3e66540a,0x3ea41c27,0x3eab53e0,0x3eca520e,0x3ee72a1f,0x3ee77d1a,0x3f05d2d4,0x3efb3df6,0x3ef5c538,0x3eee2197,0x3ecfb6e6,0x3ea37542,0x3e8a78c1,0x3e8b6ed4,0x3e79287c, +0x3e88b97b,0x3ea76d63,0x3ebe111f,0x3ee3b88d,0x3efb6524,0x3f20d6ae,0x3f3c7cc7,0x3f4855e6,0x3f02628a,0x3e749da3,0x3e9fea62,0x3f2a25c0,0x3f0f93aa,0x3ef8cf0f,0x3f06834b,0x3ecc7fb6,0x3e9c50d4,0x3ecb958d,0x3ec3cad5,0x3ef639c3,0x3ec15db6,0x3eb2b0c2,0x3eb3b429,0x3ebb8d80,0x3eda641d, +0x3ee428ca,0x3ef6e643,0x3f12fbd3,0x3ee8cfbb,0x3ed6918c,0x3ef3f2f4,0x3f089ca3,0x3ef6215d,0x3ecfb9a3,0x3e9a31c5,0x3e800990,0x3e52b1f7,0x3e400056,0x3e7311b2,0x3ea70060,0x3ec13f22,0x3f062e5b,0x3f0a3387,0x3ef4b415,0x3ebae9c9,0x3e860762,0x3eb0eb9b,0x3f2cd7b5,0x3f08ce73,0x3f0c03bc, +0x3ef176e4,0x3ecbd8ed,0x3ed7c11d,0x3ecc074d,0x3ed31547,0x3eab88eb,0x3ee16e9d,0x3ed9b4d0,0x3ecd1fb7,0x3ece60be,0x3ed363e3,0x3ecbe3ca,0x3ef02cf6,0x3f0ea606,0x3edeb92f,0x3ec597d9,0x3ef1e645,0x3f072f02,0x3f081f12,0x3f0239e2,0x3eee795b,0x3ee02178,0x3eddf796,0x3eecd3c0,0x3eed4cf2, +0x3eeaec8f,0x3ee68cb8,0x3f016dd3,0x3f037710,0x3ef357a5,0x3ec8f8d8,0x3eb2b6db,0x3eec3586,0x3f21c9ec,0x3f01479f,0x3f1d4f10,0x3f0e07d9,0x3f0ab10a,0x3efe6a2a,0x3f0c3ca1,0x3edb46c1,0x3f099028,0x3eb98f9a,0x3f091b93,0x3edd5c11,0x3f0d324a,0x3ef85225,0x3f07fc28,0x3f085847,0x3f17a2f8, +0x3ef42aa0,0x3edd23ba,0x3f0e65e5,0x3f17363b,0x3f19fa0c,0x3f1baf9e,0x3f22c1c4,0x3f170699,0x3f0e88ef,0x3f0576a4,0x3efb4e02,0x3eeec8e4,0x3ee0939e,0x3ed7bfa5,0x3ed69ea1,0x3ed6d69f,0x3edf24a3,0x3eb20d84,0x3eaa3757,0x3f59db00,0x3ecf1f9f,0x3f0f9845,0x3f06eba5,0x3ed2f89c,0x3ed3d2c9, +0x3ea285cf,0x3eb8f1b3,0x3ee97699,0x3ebd8ea4,0x3eb46803,0x3eb752cd,0x3efd42de,0x3eec0d38,0x3ee8d0d0,0x3ef52928,0x3f49b9ce,0x3ec7f958,0x3eccd042,0x3edd3ff7,0x3ee3e34b,0x3ef061d4,0x3ef844e8,0x3f0230a3,0x3eeda1ab,0x3ee0bee0,0x3ed3bd46,0x3ecb9ec5,0x3ec29a5c,0x3eb9de44,0x3ebb3b1a, +0x3ebbc1f5,0x3eb6a505,0x3eb93181,0x3e940553,0x3e38eb6f,0x3f00a67b,0x3f2d1fe4,0x3f6c3ffd,0x3ebb2b20,0x3f2173d5,0x3f5e49d8,0x3f62a5f0,0x3f6165a5,0x3f57fd9d,0x3f620d21,0x3f651f00,0x3f630535,0x3f20a80c,0x3ed2a04a,0x3f74c910,0x3f29d9ce,0x3f042130,0x3e47810b,0x3e9a9a8f,0x3e93acab, +0x3e978c22,0x3e9c6d31,0x3ea0de06,0x3ea97aa5,0x3ea3518e,0x3ea04087,0x3e9c2b76,0x3e96ed9e,0x3e92059e,0x3e8c0140,0x3e8bd550,0x3e8aa4e6,0x3e8a65c4,0x3e87f7f3,0x3e8a997d,0x3e1419a2,0x3deff26a,0x3df7d8cc,0x3dea21ec,0x3de279f2,0x3dd9f661,0x3df852d1,0x3dde09a3,0x3dc6cddb,0x3dc5df4e, +0x3dcce799,0x3de25732,0x3ddaa345,0x3dd661ff,0x3dcce548,0x3de47c5d,0x3e005299,0x3dd53721,0x3dea0d47,0x3dfc8f69,0x3e0b812d,0x3e0c114d,0x3e0f145b,0x3e13712b,0x3e14f8d4,0x3e15897f,0x3e144624,0x3e11c859,0x3e10bc52,0x3e1179bc,0x3e0fb38b,0x3e0ac413,0x3e0444f3,0x3defd785,0x3de667a7, +0x3de3f2b4,0x3de9cdf0,0x3dc6a075,0x3dcf2c19,0x3dec0ebe,0x3e0040a7,0x3e072ebf,0x3decbd22,0x3deea26c,0x3dfd061a,0x3e06e5fe,0x3e0ca8a0,0x3e1a25f2,0x3e198083,0x3e18cf8d,0x3e0b3b3f,0x3e0e6e8f,0x3e102d3b,0x3e18248d,0x3e1ab9cf,0x3e1320b4,0x3e192be1,0x3e201302,0x3e275714,0x3e324793, +0x3e36d452,0x3e35bf1d,0x3e2eee87,0x3e26f9f1,0x3e25d338,0x3e297ca9,0x3e2ce2d1,0x3e2299e6,0x3e0fc0a9,0x3dd3bb44,0x3dadfdaf,0x3daad77d,0x3db5dcff,0x3d2b66b7,0x3d86d85a,0x3deedef8,0x3e02d9e3,0x3e1626ce,0x3df5ec7d,0x3de3eba0,0x3df2c7f1,0x3de84b11,0x3e07e361,0x3e2d3321,0x3e29233e, +0x3e1e0cf5,0x3e00bf17,0x3e14063b,0x3e1a3cc1,0x3e22ff66,0x3e2882df,0x3e311cf1,0x3e25bf0d,0x3e306fc1,0x3e3ff7e0,0x3e525fd9,0x3e5fb04c,0x3e5ffc44,0x3e5666c7,0x3e4650dd,0x3e4086ba,0x3e41e242,0x3e40f6af,0x3e263085,0x3e020625,0x3d49e086,0x3ca1f066,0x3c21dd9b,0x3cb2b0cb,0xbca913c8, +0x3cc56107,0x3dbe4f51,0x3dc9d549,0x3e05ea12,0x3dc76e5f,0x3d9c7a94,0x3dbe25f3,0x3db48145,0x3ddd83db,0x3e2f42f9,0x3e1b3c50,0x3e1f8600,0x3e09b2f2,0x3e257f93,0x3e2b7c8d,0x3e3d1045,0x3e492c2d,0x3e575162,0x3e3deb28,0x3e42e98a,0x3e561a62,0x3e6ede1f,0x3e7d4522,0x3e798dcb,0x3e623365, +0x3e472335,0x3e44a070,0x3e5640c8,0x3e6bdf01,0x3e5d9584,0x3e33719d,0x3d61fe60,0xbc3c9cc3,0xbd3e92d9,0xbd0b012a,0xbdbb91a2,0x3e01ff21,0x3e71a525,0x3e783b4d,0x3e8a074b,0x3e81956f,0x3e5df53e,0x3e5d0c6d,0x3e2d1dc6,0x3e1be59e,0x3e2a3570,0x3e29a95d,0x3e1b054c,0x3dcacf07,0x3e16ec3b, +0x3e2eca1e,0x3e471f67,0x3e530ea3,0x3e5788e0,0x3e60300c,0x3e517013,0x3e621c06,0x3e901f8e,0x3e91e841,0x3e95870e,0x3e91013f,0x3e842a63,0x3e4f4027,0x3dd781ca,0x3c802b21,0xbe0d4878,0xbe99d45c,0xbec499d9,0xbebb8df0,0xbe929583,0xbe20204a,0xbe9b0984,0xbe0d5c29,0xbb0b2b4d,0xbc4ff6e3, +0x3bb6b329,0x3db0274a,0x3dc8816f,0x3e061450,0x3e29985f,0x3e419241,0x3e611beb,0x3e305c1f,0x3e273a1a,0x3def2e0f,0x3e2367b7,0x3e31ca56,0x3e3dd0fa,0x3e537d34,0x3e66cc67,0x3e6544cd,0x3e5146e4,0x3e63a452,0x3e864462,0x3e764b43,0x3e4530a1,0x3debd8bc,0xbca3a776,0xbe1fa2ed,0xbe928113, +0xbec5487f,0xbef82650,0xbf1327fc,0xbf1628b5,0xbf15665f,0xbf159511,0xbeba5b4c,0xbf020ba8,0xbea204dc,0xbe238464,0xbe0da3b8,0xbcaa1f9e,0xbc8506ed,0x3dcfec1f,0x3dd4f4c1,0x3e0a968f,0x3e15cb8b,0x3e9786d7,0x3e16e256,0x3dd27a26,0x3dd31949,0x3e368f12,0x3e509a18,0x3e604d1c,0x3e804b80, +0x3e982808,0x3e8b5047,0x3e7b994f,0x3e7418ab,0x3e3ead5a,0x3dbe0371,0x3c8d1050,0xbd17f58a,0xbe14fc87,0xbe96f7e5,0xbef0f06b,0xbf3357ef,0xbf5ba2fb,0xbf6e8c4c,0xbf6ee8e7,0xbf54b096,0xbf39b762,0xbf163625,0xbf0fe9a6,0xbeec7d41,0xbea783d1,0xbe516f6d,0xbd71a373,0xbc54ea0c,0x3d714b64, +0x3d87de0e,0x3e27c6f4,0x3e16e5b5,0x3d678d9a,0x3e3d293b,0x3e5ea353,0x3df7b40d,0x3e026ba1,0x3e00832a,0x3ddcad53,0x3dd7b9af,0x3e49a16f,0x3e550210,0x3e5c4952,0x3e681108,0x3e3aa1e1,0x3e1c226d,0x3d99af6d,0xbd5f7d64,0xbe170ba1,0xbe8af5fa,0xbecfc5b6,0xbf07ebe6,0xbf23bb34,0xbf343466, +0xbf48a835,0xbf59beee,0xbf6c7b30,0xbf35a2b8,0xbf069513,0xbec278cb,0xbeb8e06f,0xbe4f6cfe,0xbe166dff,0xbd91c4b7,0xbd29436e,0x3c1edbe1,0x3cdd21ae,0x3d2589fe,0x3cde3c93,0x3dfc86d8,0x3e066ef0,0x3d9dd2a0,0x3d9baaa7,0x3d70860b,0x3d4912b0,0x3d1419ce,0x3d56ab9e,0x3d14e062,0x3dce1642, +0x3e053d3f,0x3de68a34,0x3dbc100a,0x3da6ffba,0x3dab90c4,0x3d1e022f,0xbc63ca7e,0xbdabc1ae,0xbe35bd99,0xbe9aef74,0xbedacc64,0xbf1aba00,0xbf32313d,0xbf3c98c9,0xbf2d32e6,0xbed5e1cb,0xbeb70207,0xbeb8c780,0xbe7cd1f9,0xbe259546,0xbdd71a6c,0xbd37732d,0x3c44400e,0xbbe5ff14,0xbc86909b, +0xbc70f8e9,0x3c4f0b19,0x3d172908,0x3d44dfa3,0x3b697e22,0xbcf71d6d,0xbd0643ba,0xbd65d861,0xbdaa6c73,0xbd6d45b2,0xbd02fc6f,0xbd01e4dc,0xbbd3ea8d,0x3b8f8ed7,0x3c95462f,0x3d414187,0x3bd22a8e,0xbd2c08a8,0xbde539be,0xbe54dbfc,0xbe9a68c0,0xbec89d0e,0xbeff7800,0xbf0ea1bb,0xbf111220, +0xbf05801a,0xbeb411a1,0xbebb2503,0xbeb596d1,0xbe8b0dd2,0xbe72644d,0xbe2e43de,0xbe099123,0xbd96ce45,0xbda69f83,0xbd64824e,0xbd9199c8,0xbd4866e1,0xbd6a2d16,0xbd5813d8,0xbd9bb13d,0xbdc3d6e0,0xbe076e0b,0xbe20e1f6,0xbe43e7bb,0xbe49e4fb,0xbe497582,0xbe72b94d,0xbe816de7,0xbe81e36e, +0xbe822efc,0xbe845c35,0xbe8d4e2a,0xbe935dca,0xbe95fb14,0xbea6b086,0xbeb65e01,0xbec7c607,0xbec936d0,0xbed20b4e,0xbee0e904,0xbed03833,0xbe73f5e6,0xbe724e04,0xbeb01da1,0xbe53aacd,0xbe6a4850,0xbe564c26,0xbe2430ee,0xbe0a10af,0xbde90080,0xbe0b2599,0xbe1d961a,0xbe0e0bd6,0xbdfc52f6, +0xbdfd2d0f,0xbe31df1c,0xbe3c98d6,0xbe48de39,0xbe517165,0xbe9ad3ba,0xbe66c8c8,0xbe6b1904,0xbe83b57e,0xbe8d0b9b,0xbe97fe2c,0xbea1e48e,0xbeac5e97,0xbea767de,0xbea5cacc,0xbea4385b,0xbea4477c,0xbea2b0d2,0xbea360e9,0xbe9ada4e,0xbe927f4c,0xbe88f4bd,0xbe83be54,0xbe49671c,0xbe24aed2, +0xbe93f588,0xbeab9df8,0xbebadec1,0xbe63df85,0xbe995c7e,0xbea8b458,0xbeac3ac5,0xbea9231e,0xbea46ab4,0xbea81047,0xbeabec25,0xbea9b32d,0xbe98b23c,0xbe6b1331,0xbeb87858,0xbea597f2,0xbe905317,0xbe1e774f,0xbe449235,0xbe490c05,0xbe4f6f87,0xbe591e55,0xbe61a52e,0xbe6efae2,0xbe6a4491, +0xbe695da1,0xbe67c5e4,0xbe6411cf,0xbe60bca9,0xbe5f13bc,0xbe57b96a,0xbe52d938,0xbe4c1edb,0xbe494c5a,0xbe427b7b,0xbd03754a,0xbcdfef6f,0xbd502fa9,0x3ca226ac,0x3d76112e,0x3df6634b,0xba780d5b,0x3d693d6d,0x3df9466b,0x3e003669,0x3e00ca4a,0x3df61dc0,0x3e04cbae,0x3e047818,0x3dfc6bd0, +0x3d616db7,0x3b44c5d1,0x3e061c9d,0x3d605065,0x3c97aeb2,0xbd4bfbb1,0xbcf5eae4,0xbd17725e,0xbd14304a,0xbd12cf59,0xbd11cc68,0xbd0f3d80,0xbd137194,0xbd211c5b,0xbd37c1fe,0xbd5766fb,0xbd6ef66c,0xbd87b02e,0xbd6a273e,0xbd4ad59a,0xbd084b4f,0xbd0b2303,0xbcc351fe,0xbd1001af,0x3da1be7f, +0x3bac65a7,0x3d1f9a06,0x3d17f193,0x3ca4ef2e,0x3d184c1c,0x3cab245c,0x3d1162e4,0x3d6a49b9,0x3d1b5c68,0x3d006ad0,0x3cac87c0,0x3d335f7a,0x3cc8b0d4,0x3c9873b7,0x3c52f20d,0x3d961b7f,0xbd01d18f,0xbd353651,0xbd362449,0xbd35843c,0xbd2c5bf0,0xbd253dfd,0xbd2242f0,0xbd284482,0xbd5ba8a3, +0xbd990f1f,0xbdd01789,0xbdefe353,0xbdfcd752,0xbdce9a2e,0xbd97ea33,0xbcff0526,0xbce3039b,0xbcc7b181,0xbd25c176,0x3cea7bae,0x3d0ed5e7,0x3d81d3f2,0x3d5d646b,0x3d80930a,0x3db6fa3c,0x3ddf2b7c,0x3db0c44f,0x3dfdc6e5,0x3d9602aa,0x3dd4bfec,0x3d253287,0x3d85da27,0x3d11c272,0x3cd0b941, +0x3d09d7fc,0x3cd798a5,0xbc6143ec,0xbd756266,0xbd6d4a27,0xbd739fba,0xbd713c96,0xbd62aa3d,0xbd6126fe,0xbd657a28,0xbd9dd031,0xbde8b8c0,0xbe246323,0xbe489351,0xbe5ba44f,0xbe2d08df,0xbe00e6ef,0xbd16463f,0xbceea5fb,0x3cce4a6a,0x39b8ad87,0x3da8fb45,0x3dbaff62,0x3db250f1,0x3d89d17a, +0x3d87c7ee,0x3de6325f,0x3dde0700,0x3df4f387,0x3e166394,0x3e1a3733,0x3dfb6f91,0x3d81420e,0x3db26e9d,0x3d86a899,0x3dd161a3,0x3d5425ed,0x3d87b26a,0xba34ddb9,0xbd816a87,0xbd6fbb6e,0xbd5b149d,0xbd490a2c,0xbd3893c2,0xbd118f5b,0xbd18291d,0xbd99920c,0xbe131769,0xbe73841d,0xbe9a681d, +0xbe9ef795,0xbe73df0e,0xbe0e3446,0x3c309707,0x3cffa143,0xbe9b0a85,0xbeb21085,0xbe8da6de,0xbe4a0b93,0xbdbbfa26,0xbbaf2230,0x3d04d1c6,0x3d955b74,0x3dd7c8f6,0x3dfe6dde,0x3e09444e,0x3e0f8c48,0x3e128964,0x3dee26b1,0x3dddfb65,0x3d96667f,0x3daf08bb,0x3ce048fd,0x3d1d0b5f,0xbce9244e, +0xbdb27dc8,0xbdb7a63d,0xbe278e07,0xbe17b599,0xbe23ff7a,0xbe360958,0xbe5fc9f4,0xbe703722,0xbe681766,0xbe67517a,0xbe293815,0xbddae12a,0xbdf40731,0xbe3652f6,0xbe835348,0xbe95bcfa,0xbe707914,0xbe913088,0xbe8ad6f7,0xbe457692,0xbe097f60,0xbdbf238a,0xbd343791,0xbc779785,0x3d0372d8, +0x3dbdaad3,0x3e1e0aec,0x3e2dc8b7,0x3e2725d7,0x3dd63489,0x3de9507b,0x3dbb2cda,0x3da69d5c,0x3d2b283f,0x3d3d77d6,0xbce27516,0xbd43cc90,0xbc20d240,0xbbcf3e7c,0x3c83eeb1,0x3cc0e6dc,0x3ccac06f,0x3d9637c1,0x3dbffc0e,0x3dab6817,0x3da2b6ec,0x3d4f7609,0x3c0ebd9e,0xbd6433d5,0xbd952fb9, +0xbd086910,0xbe3d98ec,0xbd4ef52f,0xbe438824,0xbe4fa76b,0xbdf9ff3b,0xbda91521,0xbcca0bbb,0xbb837513,0x3c160aa3,0x3db9fe69,0x3ddb6a31,0x3d8dff4f,0x3e374bac,0x3e2b4076,0x3d3d9da4,0x3d75233b,0xbbdb3d0f,0xbcb01561,0xbd98935f,0xbd741f73,0xbd260bad,0xbd07f9ed,0x3d629a47,0x3e370f6a, +0x3e871365,0x3ea1ca3a,0x3ea36da1,0x3ec106c7,0x3edb6218,0x3eefdcba,0x3f029386,0x3eff4cf3,0x3eeaee16,0x3ea35a7c,0x3e48374b,0x3dc1172e,0xbb4c84da,0x3e1ce83b,0x3c8c67d9,0xbd2a6296,0xbd003a82,0xbd2ce052,0xbc081838,0x3beed6d2,0x3a88e8d0,0x3ddaeebd,0x3e0d437b,0x3d0b6fff,0x3e316cff, +0x3e1b0653,0x3cb22296,0x3cdd861a,0x3c95fa60,0x3bc3552b,0xbc0ab19a,0x3bbbf1c5,0xbce99e52,0x3af3d86a,0x3d933c4c,0x3e18b3a8,0x3e57be07,0x3e9c62b5,0x3ed5e330,0x3ef88994,0x3f0b4ef9,0x3f14046f,0x3f14c692,0x3f0750f3,0x3eefbde4,0x3ea23bc6,0x3e76e7d5,0x3e5ef8de,0x3e4e29bd,0x3e8820ab, +0x3e43ba0e,0x3e077de0,0x3d890566,0x3d6e1bbf,0x3d5fa24b,0x3dadb376,0x3dd78c65,0x3df4c2f8,0x3e12c561,0x3e1e355e,0x3e0a8622,0x3dfa9a5a,0x3de5b3c3,0x3dc856fb,0x3da82130,0x3d93557f,0x3d74edaa,0x3d89717c,0x3cf24344,0x3ac40a93,0x3d30d0d4,0x3df2fe62,0x3e484c51,0x3e7c5bf1,0x3e87e573, +0x3e983972,0x3e9c4922,0x3e93b217,0x3e8b779b,0x3e7817d7,0x3e5b61db,0x3e4af71e,0x3e547a72,0x3e74d95a,0x3e95d3af,0x3e5a35e8,0x3e466e84,0x3e3b5bb9,0x3e29883c,0x3e0dd2a4,0x3e095314,0x3dd918c1,0x3d886059,0x3dc5d853,0x3deee254,0x3e1211e1,0x3e04bf08,0x3e0a124b,0x3e0cfa90,0x3e1eb34a, +0x3e270423,0x3e1046d8,0x3e1cae49,0x3e2509ed,0x3e029d34,0x3dcfc769,0x3dcc455d,0x3da665eb,0x3d824dc6,0x3d627c47,0x3d2b3acf,0x3d49640f,0x3d7c00d1,0x3da9a19b,0x3dd0406a,0x3df1255e,0x3e0cbbd6,0x3e28ad2b,0x3e41d971,0x3e570c0b,0x3e69e7f2,0x3e3b9daf,0x3e3cdd51,0x3e339b80,0x3e21bfd2, +0x3e148836,0x3df0e537,0x3ddf37b2,0x3db3a313,0x3ddde0f7,0x3de44c8b,0x3e07c4ce,0x3e095514,0x3e12126d,0x3e1ac8d5,0x3e2f3139,0x3e45c28b,0x3e6551ba,0x3e6a2b08,0x3e73479a,0x3e7869a7,0x3e6d90c8,0x3e6fa621,0x3e64553f,0x3e4f940b,0x3e3b240f,0x3e288436,0x3e2aa886,0x3e26d66d,0x3e1f0b26, +0x3e244177,0x3e2c956a,0x3e37c42e,0x3e3ee4dc,0x3e4aa663,0x3e5ac849,0x3e4ba56f,0x3e4f928c,0x3e550017,0x3e6cb542,0x3e42fe57,0x3e4cc4b1,0x3e47f121,0x3e34116b,0x3e2c4f10,0x3e24b2ca,0x3e384140,0x3e459ba7,0x3e43b905,0x3e3e05eb,0x3e46ed8c,0x3e57ea07,0x3e607896,0x3e6b0c02,0x3e6f4629, +0x3e87fe86,0x3e8930d1,0x3e8381bf,0x3e867425,0x3e87781b,0x3e88e252,0x3e89735a,0x3e88f087,0x3e85d3bd,0x3e8378c7,0x3e818cbc,0x3e80a2f6,0x3e7cd339,0x3e77f6e9,0x3e6f9a29,0x3e664589,0x3e5d6bd0,0x3e59a727,0x3e4a6d8c,0x3e3ccddb,0x3e7f0182,0x3e868a15,0x3e8069ed,0x3e60ca02,0x3e7e52df, +0x3e7c9655,0x3e813bad,0x3e7fed00,0x3e7b8a67,0x3e808169,0x3e82f72b,0x3e8248d2,0x3e86ac21,0x3e75e1e5,0x3e85d813,0x3e8def16,0x3e87d2dd,0x3e540cb3,0x3e5d5cac,0x3e60184a,0x3e601b5a,0x3e62adb0,0x3e654c3c,0x3e6a1302,0x3e6664bb,0x3e63e3f0,0x3e60fdbb,0x3e5c99c8,0x3e58e301,0x3e55f3e3, +0x3e53313a,0x3e513578,0x3e4dd0a0,0x3e4cc2ea,0x3e61b51f,0x3d0fbb2f,0x3cf095e5,0x3d397084,0xbc7d6ba8,0xbd420135,0xbdb9af21,0x3c21e012,0xbd24af87,0xbdb3b995,0xbdaa9bb9,0xbda684ab,0xbda60235,0xbdafe4e6,0xbdb7a3d8,0xbdb663ec,0xbd30f664,0xbb00568e,0xbddbc57b,0xbd4ab077,0xbc97352e, +0x3d354821,0x3cdaf0f5,0x3d068d7d,0x3d09d035,0x3d173afc,0x3d1d506d,0x3d24706a,0x3d197d5e,0x3d1733ee,0x3d13d289,0x3d213baf,0x3d2fa2f3,0x3d5e7b4e,0x3d28e458,0x3d13b813,0x3cde74f8,0x3d09ca57,0x3ccf0028,0x3ca74573,0xbd6dbf23,0x3cb9b5e6,0x39049959,0xbb520ead,0x3c872edc,0x3c0485c5, +0x3d41858d,0x3d26b60a,0x3c023e7a,0x3cf28b67,0x3ce3f7d6,0x3cdc726e,0xbc6c7b43,0xbc4d92a3,0xbbef79b6,0xbbd866bd,0xbd7c74ba,0x3cad60f5,0x3cf1f2c8,0x3cfc5116,0x3d1038e8,0x3d335cb9,0x3d449e4a,0x3d48ec56,0x3d268910,0x3d1a8f58,0x3d1958e1,0x3d46c40e,0x3d6abd41,0x3da10b4d,0x3d2b2808, +0x3cc6bd64,0x3b774c42,0x3c90ac73,0x3cc8abbb,0xbba32fb4,0xbc8f8404,0x38c3784d,0x3b7f86a8,0x3b47e9cf,0x3b8c2f6e,0xbb4dc819,0x3cff7915,0x3d5b200b,0x3bdcab5f,0x3d2eb5da,0x3c698e70,0x3d1a4474,0xbca74bf3,0xbcb778d5,0xbcb3ba16,0xbce55952,0xbcefaec0,0xbbcbb2cc,0x3cbf20a8,0x3cdcf76b, +0x3d15c97f,0x3d63fed1,0x3d80f2c0,0x3d8d7883,0x3d5495df,0x3d3db8b1,0x3d3df285,0x3d91340f,0x3dcd29a0,0x3e2759d6,0x3dae5abb,0x3d5bbae3,0xbb5b8f2b,0x3c89f04b,0xbc78564d,0xbd23d455,0xbce63197,0x3c9332ac,0x3d3321b1,0x3d310ee4,0x3d3790e1,0x3d3af4c7,0x3dcaeb37,0x3dd47d7a,0x3dad524a, +0x3dc22df8,0x3d8cce6a,0x3d3c1f57,0x3c2e7aca,0xbc587f2e,0xbd11d4c1,0xbcadce20,0xbd194ae3,0xbc559ce5,0x3c976987,0x3cb918f8,0x3ced7b35,0x3d5e816a,0x3d88e4f2,0x3d7ddfb0,0x3cc177ee,0x3bada19a,0x3bbd835d,0x3d57e82d,0x3ddfa1d0,0x3e3d74c9,0x3d7b92be,0xbc5d1504,0xbdb7baff,0xbd587598, +0x3de2ce9a,0x3d74247b,0xbc2dc91e,0xbc84c974,0xbd1be6a2,0xbd0e917d,0xbc51cdcd,0xbc2b2fab,0x3d1d1cfb,0x3d881dd0,0x3d87d178,0x3dd9628b,0x3de414da,0x3dacf197,0x3d3f350d,0x3c7fb316,0xbbf4f13a,0xbc957f83,0xbd5d4244,0xbd02a1ba,0x3b5dfb23,0x3c96b25a,0x3daea1bb,0x3df1236a,0x3e1da56a, +0x3e4add91,0x3e840ef4,0x3e968016,0x3e97affe,0x3ea53796,0x3e9ed029,0x3e9e38ab,0x3ea43d6b,0x3ea08e3b,0x3e9116c0,0x3e2021da,0x3d4776ff,0x3ab5ceb2,0xbcad45ab,0xbb169237,0x3cb0fd6a,0x3c9904ae,0x3d020784,0x3c6341ea,0x3d090cf1,0x3d617a99,0x3d8f0721,0x3e046b40,0x3dede064,0x3d856450, +0x3d5a6431,0x3cb1dca9,0xbb85ee6d,0xbc5e95f6,0xbd14abe4,0xbb945054,0xbd05535b,0xbd67fc45,0xbd24135e,0x3d78cc37,0x3e1f19a8,0x3e840345,0x3e81bd3d,0x3e82c289,0x3e7f3b60,0x3e568ebd,0x3e2f800a,0x3e087e37,0x3dd1c494,0x3d2be3e8,0xbc31a341,0x3c64101a,0xbc9619fb,0x3c9f4f4d,0x3c89ef08, +0x3cf6409d,0x3c487a8a,0x3cb29925,0x3c6bb4f2,0xbc68cae0,0x3df7c3aa,0x3e0a9cab,0xbd40e1e7,0x3df1e5fe,0x3d9b8daf,0xbd399970,0xbd113f84,0xbd1b4e30,0xbd6b80e8,0xbd1fb1d0,0xbd4c3f0c,0xbd52f84d,0xbd861089,0xbd87955a,0xbd93538d,0xbd4c880a,0xbd277cb6,0xbc7d98c7,0xbda4b948,0xbdf77d8a, +0xbe1706a9,0xbe27db79,0xbe36e9c5,0xbe4587cd,0xbe3849f1,0xbe07aa47,0x3c8604c0,0xbd13f58f,0xbde92d3a,0xbd9d21b2,0xbcf79ff5,0xbc32b48e,0x3ba1e08f,0x3c5283f4,0x3d302e9e,0x3d42cf1d,0x3d9b7973,0x3d95cb16,0xbd5d64dc,0x3d79525e,0x3d945a5c,0x3d17aaf7,0x3c1a06a0,0xbd0668fe,0xbd40378f, +0xbd901d23,0xbda2abab,0xbd9a3b4b,0xbdfec844,0xbe20f8e9,0xbe3f9d16,0xbe70cc6d,0xbe921ada,0xbea70c44,0xbeb0f8d1,0xbebaef84,0xbec95230,0xbecebaad,0xbecfbc8e,0xbed28920,0xbe9ec196,0xbe605307,0xbd912407,0xbe00db8e,0xbe24cbf1,0xbe3cf599,0xbe015ac9,0xbdb8847a,0xbd205821,0xbc879134, +0xba7ed727,0x3c18bf0c,0x3d5b5678,0x3d572f5c,0x3c8576c2,0x3b6aa481,0xbc9002cf,0xbc8abec9,0xbcfd9dd0,0xbd19c7cc,0xbd52e855,0xbd67b76a,0xbd92f395,0xbdc04117,0xbde1d2f2,0xbe1929f7,0xbe3fef39,0xbe7d05c0,0xbe99a0a7,0xbea8d225,0xbeb4e078,0xbeb5b5ad,0xbeabc22f,0xbea2c7c7,0xbe9c963d, +0xbe9c4952,0xbe7f4f73,0xbe4620b4,0xbde7b84b,0xbe11d459,0xbddea797,0xbdedcba5,0xbdd477b4,0xbdd63fd9,0xbd9fb6be,0xbda5fea9,0xbd47fafe,0x3c40370b,0x3c849635,0x3c68aca3,0xbc2d3519,0x3ccd06bd,0x3c870ff1,0xbcb344a0,0xbd6eb46f,0xbdb8a775,0xbdd094b4,0xbe0235ed,0xbe10dde7,0xbe17e284, +0xbe24c868,0xbe2e172f,0xbe2dde90,0xbe231584,0xbe2231bf,0xbe1ac993,0xbe1b9dca,0xbe203e34,0xbe2b029d,0xbe3c7c47,0xbe44fbee,0xbe4a3ab9,0xbe4aad5b,0xbe3deefb,0xbe24b709,0xbe03b41d,0xbe03d673,0xbdcba50f,0xbdb4d23e,0xbd9369cd,0xbd472c4c,0xbce03d0c,0xbc701ae8,0x39a8dae7,0xbbb856f7, +0xbc4cdd5c,0xbc046af0,0xbd355941,0xbcfffdab,0xbd7e908f,0xbd62799a,0xbdbdb34d,0xbdeacde6,0xbe05cd04,0xbe0d6537,0xbe385f68,0xbe45e787,0xbe3a21f6,0xbe38578e,0xbe2ca040,0xbe244c5c,0xbe1b9a1c,0xbe2e65a6,0xbe387491,0xbe3e4ce8,0xbe40141f,0xbe433753,0xbe47c2a1,0xbe42b804,0xbe40de1c, +0xbe45084c,0xbe258576,0xbe2fe818,0xbe35dc0e,0xbe154d32,0xbe1cefe9,0xbe12b4eb,0xbe0af3a8,0xbe05683f,0xbdf71ff3,0xbdf9d118,0xbe07a9e1,0xbdffbd63,0xbe07972c,0xbdff3781,0xbe01d24c,0xbdfcf37b,0xbe10bb23,0xbe1ab3c9,0xbe1aa6d6,0xbe00f07d,0xbe4d24c1,0xbe476e40,0xbe4c40f5,0xbe51716f, +0xbe53f647,0xbe563fe1,0xbe55403f,0xbe53b606,0xbe50a7ad,0xbe4fb208,0xbe4eb0fc,0xbe4cb07b,0xbe4a86f0,0xbe43fcd5,0xbe3d490b,0xbe36e3d8,0xbe34158f,0xbe251f9d,0xbe26ade3,0xbe2fb562,0xbe25b0ef,0xbdf48341,0xbe27fef3,0xbe1d37f0,0xbdf4def1,0xbdf61fdf,0xbdee401c,0xbdedf2cc,0xbde5cd6d, +0xbde63ff6,0xbde04905,0xbe21aa89,0xbe2e3f52,0xbdd7adf2,0xbe29888b,0xbe36d677,0xbe388a48,0xbe2f5515,0xbe3558cc,0xbe352c85,0xbe37baf3,0xbe3a8b3c,0xbe3f1664,0xbe3c5efe,0xbe3a85c1,0xbe380201,0xbe3557bd,0xbe32c5d1,0xbe309c07,0xbe2e3ac8,0xbe2c62a0,0xbe298e8d,0xbe291020,0xbe391c66, +0x3cca7489,0x3d0557c5,0x3c73fe38,0x3d8aa5a5,0x3dbcff7f,0x3dfdc035,0x3d2bf2ae,0x3dadf2d7,0x3df156c8,0x3e032977,0x3e02be96,0x3dee8527,0x3e010aef,0x3e046823,0x3e080156,0x3db313d8,0x3d477316,0x3e04faa2,0x3db088d5,0x3d749307,0x3ab6cc4c,0x3c96a928,0x3c61522b,0x3c4ba39f,0x3c35df02, +0x3c35564c,0x3c351bc9,0x3c6c85d0,0x3c8956aa,0x3ca046c7,0x3cac53de,0x3cb72b00,0x3cc296b5,0x3cc50b48,0x3ce225e6,0x3d255bb2,0x3d00c49f,0x3d1295af,0x3d089622,0x3dc9d5a0,0x3ceaad4b,0x3d42e218,0x3d5fe392,0x3d291b10,0x3d13f060,0x3d205c7c,0x3d54e577,0x3d6a3bb4,0x3d4d9a00,0x3d44ea60, +0x3d6e6e4c,0x3d6cfb20,0x3d37c4b6,0x3d27180b,0x3d0fdee3,0x3da4e1c5,0x3bc72d81,0x3b2a79a5,0x3b374766,0xbb2f0b63,0xbbd57d8f,0xbc08c8d1,0xbbd0d141,0x3b608e47,0x3c50ee00,0x3cb3fb08,0x3ce7f06d,0x3d07fc41,0x3d0d0f05,0x3d1bf582,0x3d37134a,0x3d8e0918,0x3d4063f1,0x3d8bcb6e,0x3d9632a8, +0x3d996bb1,0x3d4e2a6f,0x3d301982,0x3d337d08,0x3d33bd0b,0x3caa302f,0x3d919405,0x3d77f090,0x3d64ae3d,0x3d35207d,0x3d8de4ae,0x3d94c2e7,0x3d5397d9,0x3cefb90b,0x3ce7a379,0x3cd93302,0x3cd9e764,0xbb754712,0xbc9b4190,0xbc9f3099,0xbcfc4cd1,0xbd1c2712,0xbd1d05f4,0xbd098e7b,0xbc74af64, +0x3b37162e,0x3ca68641,0x3ce47dc0,0x3ce27807,0x3cadd28b,0x3d1ef236,0x3d71a30b,0x3dff8b06,0x3dae7ce3,0x3d7469e0,0x3d72b01f,0x3d404084,0x3c74aa8b,0xba9f1e85,0x3c9c2829,0x3c64016c,0xbc64ed0f,0x3d73eee3,0x3da5e6ec,0x3d056639,0x3d8215b9,0x3d561044,0x3d5202b9,0x3b30f3e0,0xbc904643, +0x3c1515de,0xbc1f68c6,0x3bd25a73,0xbcf7cca4,0xbd263377,0xbd254811,0xbd5941a1,0xbd7e8857,0xbd8b5861,0xbd70acf3,0xbcbeea77,0x3c356963,0x3d2c0292,0x3d5dbeaa,0x3d5fe828,0x3d0b79ef,0x3d7144db,0x3db4163c,0x3e2bacf7,0x3dce27fc,0x3e2ee7d7,0x3e25c4e2,0x3e45461a,0x3e3ac366,0x3e027ccf, +0x3dc56dcc,0x3da26614,0x3d92239c,0x3d6bf3db,0x3d6cebde,0x3d6687f2,0x3d7ccd23,0x3d7e50e2,0x3db6aae6,0x3d1bbe4c,0x3c3a3e3f,0x3c969394,0xbb8e5ca3,0x3bffeb56,0xbd18b963,0xbda59ad9,0xbdc085a4,0xbe0e5cc9,0xbe10d9c3,0xbe0b1313,0xbe033bb6,0xbdef2315,0xbdcdbdab,0xbd99ade2,0xbda1726a, +0xbd729beb,0xbd593942,0x3d5367bf,0x3dc02c54,0x3de665b2,0x3e1dfe68,0xbd940f00,0x3c25a75a,0x3c0bc970,0x3cb48d46,0x3d1df548,0x3d342e04,0x3d882c6d,0x3ddf742d,0x3e02c7f0,0x3df9c730,0x3d928a02,0x3dbfaa63,0x3d8f9e3a,0x3d9787e9,0x3c8d2d6b,0xbb873562,0xbbc4db71,0xbcf2f9e1,0xbd16290f, +0xbddb94ad,0xbe1cdf4b,0xbe311001,0xbe5056cf,0xbe9a729e,0xbeb38d21,0xbeb63fcb,0xbe8e9c33,0xbe57a99a,0xbe10b6ad,0xbdaed06f,0xbc5c05e2,0x3c106703,0x3d9ea808,0x3da665af,0x3d679873,0xbd383e96,0xbc31acc5,0x3c6cf7ee,0x3c8f0276,0x3d17b0f3,0x3d374743,0x3d1c341f,0x3d4cbe88,0x3d5c928a, +0x3da6695f,0x3dd0a774,0x3be165aa,0x3dacfc0d,0x3dc98f40,0x3e1ad9dc,0x3d944f18,0x3d20f69a,0x3d51c73e,0x3c90231d,0xbbbd5f1c,0xbd27b2f7,0xbd6e3b75,0xbda90069,0xbddb4790,0xbe032786,0xbdf24ffe,0xbdc3b02a,0xbd2be65a,0xbc7a5b78,0xbbc01dde,0xbd248fa1,0xbd5324ca,0xbdaf1892,0x3d79d3c1, +0x3dbcc352,0x3c41160f,0x3b9f52b3,0x3c95b416,0x3d85fb85,0x3d019925,0x3d35b7ab,0x3d031adc,0x3d03c0d9,0x3d476aee,0x3dc45525,0x3d833231,0x3d220983,0xbc737b5f,0x3ca97c90,0x3cd4ce49,0x3d917796,0x3cb66ee0,0x3b49bd50,0x3ba490a8,0xbb0cca45,0xbd205577,0xbd4d524a,0xbd501ffa,0xbd50df62, +0xbcec8080,0xbc6b1791,0xbb542c77,0x381f6acb,0xbab8425e,0x3c558a3b,0x3d85796b,0x3d79171f,0x3de8317f,0x3e21159b,0x3e5b798e,0x3e3e148b,0x3dad99b4,0x3ca60b7a,0x3d4cf070,0x3db6af2c,0x3d74bd2e,0x3d7f4774,0x3d4fb979,0x3d3ac676,0x3d69b307,0x3d9afcf4,0x3d3caa00,0x3d0e5800,0xb9fb3638, +0x3d087944,0x3d4d5a76,0x3d924d91,0x3d3e7397,0x3cb0ec65,0x3b516853,0x3bc62781,0xba99752a,0x3cf41c19,0x3ca90b6e,0x3b18b967,0xbc3d34cf,0xbc12284a,0x3c345c8b,0x3cc9dfbd,0x3d378e25,0x3d618981,0x3d94a4e7,0x3d40e688,0x3d86eb9a,0x3df09824,0x3e31afa4,0x3e36cfcf,0x3e0f4c53,0x3d752370, +0x3d6b0712,0x3c7eaabd,0x3c2d509d,0x3c988cb3,0x3c97ebd3,0x3d587c70,0x3d7e0817,0x3d23943e,0x3d3c3d5b,0x3d327571,0x3d58e07f,0x3cb0eb09,0x3c7bdaaf,0x3d078213,0x3d1c604e,0x3d68cbd1,0x3d9509a1,0x3d8d018e,0x3d5b10b5,0x3d738f79,0x3d98099a,0x3d761d5f,0x3d07928f,0xbc0a1222,0xbcea5575, +0xbd40acc4,0xbd373e99,0xbd3b3bde,0xbd2a807d,0xbc340e41,0x3cf4cf58,0x3d9d0f7e,0x3dd7c0c4,0x3e01af21,0x3e1d6bc7,0x3dda03b1,0x3ddba8c6,0x3dc76457,0x3db3413d,0x3d8c0ef1,0x3d28f22a,0x3d277cc4,0x3d1af916,0x3d2cd690,0x3d295128,0x3d6b4751,0x3d523a67,0x3da3a45f,0x3d4be653,0x3d99e3fb, +0x3d2e7e3f,0x3d6b7a3d,0x3d49f62e,0x3d7db9ec,0x3d763684,0x3dd971ef,0x3de11ab5,0x3d9c6792,0x3d841572,0x3d3592c9,0x3cdb5cf2,0x3b59e6f3,0x3cc08a62,0x3d0d4aaa,0x3d27a2b5,0x3d53001e,0x3d6c8204,0x3d8254e6,0x3dac4f18,0x3dd76a24,0x3e0780f9,0x3df11c5a,0x3dc3f13e,0x3dda2fe2,0x3d5f3384, +0x3dc12c87,0x3da556ab,0x3da72200,0x3db9ad6c,0x3db0732d,0x3dbe88c8,0x3dbc7ea7,0x3d9b3a09,0x3db0b944,0x3da47f1b,0x3da03ad9,0x3d7c31bc,0x3d9c8bad,0x3d9ebe2b,0x3d91bb99,0x3cb0ba1e,0x3dcf4503,0x3dbba3d4,0x3db4fb72,0x3db00c8d,0x3da36027,0x3d9acac1,0x3d8a081b,0x3d9468e1,0x3d960942, +0x3d9bbfc0,0x3d9e6343,0x3da351a1,0x3da301ae,0x3dabaab4,0x3dad8a10,0x3db2e0e1,0x3dbac1ca,0x3db41674,0x3dcb3881,0x3dabd6d1,0x3d8da06d,0x3cddf1b9,0x3dc328ce,0x3d949240,0x3d0d72f2,0x3cf5911f,0x3cdbe2f9,0x3ce3e9d9,0x3ca60165,0x3c92cf09,0x3c82b3f0,0x3d87fad5,0x3db2b316,0x3b99bdd9, +0x3d838837,0x3da7b534,0x3dd6d094,0x3db52c6d,0x3dbc360b,0x3db77178,0x3db7301d,0x3db75533,0x3db6da08,0x3db67e80,0x3db4a57d,0x3db295a4,0x3dafa0ba,0x3dacc0c1,0x3da92240,0x3dab66eb,0x3dadd1dc,0x3daf20cd,0x3db5d24c,0x3dc3201c,0xbd6c02eb,0xbd87a3ca,0xbd688454,0xbda21346,0xbdb11fea, +0xbdc21d51,0xbd7b38a0,0xbda12b78,0xbdba7e21,0xbdb78010,0xbdb22568,0xbdab03c4,0xbdb1258a,0xbdb0ca2e,0xbda63e81,0xbd93d425,0xbd6ba453,0xbdc447ba,0xbda7e37f,0xbd905d81,0xbd19d319,0xbd484054,0xbd40a5a3,0xbd33d1d3,0xbd46f365,0xbd53626e,0xbd6a6258,0xbd66f5c0,0xbd683829,0xbd631b57, +0xbd6e5335,0xbd78c33e,0xbd8d3e2c,0xbd81a330,0xbd849078,0xbd92e394,0xbd8bd3e0,0xbdd180e0,0xbdbcb936,0xbdc8b6d2,0xbd89f1e6,0xbd8b59cd,0xbd836d54,0xbd5553ff,0xbd481576,0xbd0c48e9,0xbd17027d,0xbd21cc20,0xbd12feb2,0xbcfacba0,0xbcb13cce,0xbd1f78c8,0xbd29288c,0xbd61dc46,0xbd5d14e9, +0xbda8f0b5,0xbd270092,0xbd29dced,0xbd30422a,0xbd0eb257,0xbd41fc86,0xbd69b22d,0xbd942bfc,0xbd94f999,0xbd96cd4c,0xbd8e2bb0,0xbd9a1ab2,0xbda8fea5,0xbdd46c0c,0xbdb72326,0xbdbdaefc,0xbde49a20,0xbddceac1,0xbe11bb55,0xbde36694,0xbdb2363e,0xbd8e0041,0xbd620bc2,0xbd3c0cfc,0xbd024fb6, +0xbcd33437,0xbc7a28b0,0xb9953a75,0xbc1619a5,0x3ab4f494,0xbb093184,0x3d005b53,0x3aa8ff4f,0xbc211eb7,0xbd0c18f9,0xbd34e499,0xbd5a8142,0xbcfeb3f8,0xbcdfd79c,0xbcf9e790,0xbc653492,0xbd153c8d,0xbd6088f5,0xbdb2c7b5,0xbdb2a1a3,0xbdb844a0,0xbdb1b68b,0xbdcd52bf,0xbde05b46,0xbe2118a7, +0xbe058680,0xbe0f3c1f,0xbe3392ec,0xbe1f8a1c,0xbe68930e,0xbe2f0943,0xbdec1934,0xbda90815,0xbd72e932,0xbd286fee,0xbcd50ebf,0xbc99e73c,0x3cb7b15f,0x3d3d3986,0x3d07a690,0x3d1a1ec8,0x3d36e002,0x3d92d478,0x3cb92488,0x3b8e834a,0xbd175fc5,0xbd13e467,0xbd70bcab,0xbcc6ad00,0xbc818f80, +0xbc80f4ad,0x3c126100,0xbce35dad,0xbd7db443,0xbded6155,0xbdf87bf1,0xbdfef699,0xbdee5260,0xbe00da64,0xbe16a77b,0xbe5e0707,0xbe33438d,0xbe3fab60,0xbe8277fa,0xbe74bed8,0x3dca8f65,0x3e145ef3,0x3dfb9a9f,0x3dc3e991,0x3d9a76b2,0x3d54202f,0x3d5d6170,0x3d9dd14b,0x3d97374b,0x3d83b7c8, +0x3d9283c4,0x3cdb4426,0x3c7342fb,0x3d735cb7,0x3c98890c,0x3bffec3d,0xbd124433,0xbca5541f,0xbd520450,0xbd008756,0xbbd3c6c2,0xbcd6e3fd,0xbbb47b30,0xbd014975,0xbd167bdd,0xbd520560,0xbd290fc7,0xbd5ab3b7,0xbd757c52,0xbdd8bde3,0xbe028311,0xbdef8702,0xbe23f6b5,0xbe00a5af,0xbd919729, +0x3d3f7545,0x3e286294,0x3dd59a55,0x3dab4c07,0x3dad13e4,0x3db9133c,0x3dd6c26d,0x3dc7012f,0x3d854a24,0x3dcd0953,0x3dd4249d,0x3ce7dda8,0x3d4ddd2b,0x3d72160a,0x3ddd4823,0x3d133750,0x3c92cc6a,0xbc577f8f,0xbbd45080,0xbd03ff7c,0x3ad23cb5,0x3cfcde8c,0x3c7871ad,0x3caafd7e,0x3d4bc9f5, +0x3d780819,0x3ce56552,0x3c879cfb,0x3b93f6e9,0x3c95a691,0x3ca1e362,0x3d90816a,0x3e4900de,0x3e58fc38,0x3e4c3e55,0x3d84a734,0x3e24053f,0x3d240cec,0x3d782bbf,0x3d75024e,0x3d5be874,0x3d5556ec,0x3bcfb2b2,0x3d120fe3,0x3e25be40,0x3d9134e4,0x3d24ae4f,0x3b2aa9bd,0xbd10df4a,0xbb411a2c, +0x3e3218f0,0x3cb9f142,0x39b0d018,0xb9e06324,0x3be50828,0x3c347005,0x3c97ae0d,0x3d2ccf01,0x3cd4a80d,0xbc2c0486,0x3bf67e19,0x3c51f9c3,0x3b9c70f8,0x3c09a954,0x3becbd91,0x3c66cb26,0x3c85abe7,0x3d2a7a3d,0x3e03be47,0xbc33fa33,0xbd95a353,0xbe066cef,0xbc8cb8f8,0x3c93a642,0x3c7be962, +0x3d060b0f,0x3c82c58a,0x3cb9387c,0x3cd64f11,0x3d2970cc,0x3dd26b19,0x3cb3c090,0x3a7ec320,0x3d1bdd9a,0x3c404bb7,0x3d37c47c,0x3e212b66,0x3d883c80,0x3d3a613b,0x3d4ed71f,0x3d419996,0x3d5c81e1,0x3d862fa5,0x3d90b4e0,0x3d7580ba,0x3d2c8ada,0x3d6af36e,0x3d4f890d,0x3caf05b3,0xbd23943e, +0xbdee9444,0xbe4b2dc6,0xbe4645fa,0xbe325520,0xbde700ef,0xbe07c717,0xbdfc0212,0xbe2d8093,0xbca45770,0xbd61c22a,0xbccc3405,0xbb045163,0x3c1bc766,0x3c5adafc,0x3cdd67cb,0x3caba67d,0x3cbf8eae,0x3cd3b3ad,0x3cecb5f5,0x3d1b2835,0x3d43a53f,0x3d3c5677,0x3d144227,0x3cff308f,0x3d2d02d7, +0x3d480057,0x3d341898,0x3d28eb73,0x3d14c812,0x3d017a47,0x3d006887,0x3cd8971e,0x3bf45516,0xbcf3594b,0xbd9ba7e0,0xbe06dec8,0xbe2bb8c7,0xbe43bbbb,0xbe1baefd,0xbdf3eddc,0xbdc52e45,0xbdc01f0a,0xbde9f5d4,0xbe4d3b2c,0xbdce328a,0xbdc8e00c,0xbd0d1f3d,0xbc50ae16,0x3c79284c,0x3d1b4aa6, +0x3d11073f,0x3d1e1fce,0x3d3ecf1b,0x3d569f46,0x3d514156,0x3ce40940,0x3d23f4dd,0x3d1c3364,0x3ce6abe3,0x3d0b797a,0x3cd68a0c,0x3c1d17a8,0x3c55782f,0x3c90574b,0x3bfdb67c,0xbca2b02b,0xbc84ad5b,0x3b8d44cd,0x3d12a5a7,0x3cf60a32,0x39977538,0xbc8942b1,0xbce16cd4,0xbcfc881f,0xbd35334b, +0xbd61ad2a,0xbd902455,0xbd8295c3,0xbda7f731,0xbe067e05,0xbe083c6e,0xbd93c93f,0xbdb17fec,0xbd823ab7,0xbd380daf,0xbcbf80ea,0xbc97a45a,0xbc05d757,0xbb5d895f,0x3c22f717,0x3c2a9cb0,0x3d03103e,0x3c80625f,0x3d23b9b9,0x3cf739ce,0x3d1b20a2,0x3caae06f,0x3c984446,0x3b9cd77d,0x3b9cae21, +0xbd1b8532,0xbd218a5c,0xbc4af245,0xbb8ef840,0xb9b06f6d,0x3bbcc384,0x3c8b4746,0x3b34224a,0xbc12f976,0xbc94e166,0xbcc75358,0xbcee6e15,0xbd199762,0xbd379964,0xbd5675de,0xbd65d496,0xbd78dc6d,0xbc126b5c,0xbba0ac2e,0x3cfabf1c,0x3c26e5fd,0x3cc1f652,0x3cd783a4,0x3ccb7263,0x3d052a12, +0x3cc63441,0x3cb637be,0x3cf1075a,0x3cb00706,0x3cbe80cf,0x3ccd2f87,0x3ceb0979,0x3c7070ca,0x3c355679,0x3be77ada,0x3cfe7055,0xbcd5f6da,0xbcb9b8f5,0xbcc00b20,0xbcc38587,0xbcac4fed,0xbca042f6,0xbc8147bb,0xbcb98a10,0xbcd19ba4,0xbcf7cc68,0xbd0bc45a,0xbd1b8e73,0xbd23c6fc,0xbd0be8cb, +0xbce8cfe3,0xbcbfbf6a,0xbc903109,0xbc4bf9fb,0xbc7d1404,0xbc375583,0xbb5fc0a6,0x3c8c0dfa,0xbc5fd93b,0xbb4ede71,0x3c92a7cb,0x3ca6f270,0x3cb82dc0,0x3cac66ad,0x3cd3f9cd,0x3cda9192,0x3ce157c7,0x3aa943db,0xbc1a4155,0x3ce2e8f6,0xbb608bee,0xbc5d71d4,0xbcd55f7e,0xbc8633c1,0xbc9d9f42, +0xbc986e49,0xbc9be76c,0xbca3403b,0xbca841a0,0xbcad1150,0xbcad6895,0xbcab5d8c,0xbca8a3ef,0xbca577ca,0xbcaebb52,0xbc99cea1,0xbc8ec6be,0xbc810893,0xbc74e4fe,0xbc4c4b2a,0x3c507f68,0x3c08be63,0x3bab5fbe,0x3c97ad50,0x3cc58333,0x3cf6c10d,0x3cb1cefe,0x3d011586,0x3d19a79f,0x3d1191c6, +0x3d1004cd,0x3d0a4bd5,0x3d118b4e,0x3d18dbcf,0x3d23a8ba,0x3d0e8596,0x3cd2fe76,0x3d0e790e,0x3d03120c,0x3cd228b2,0x3be6c335,0x3c4f2f4b,0x3c38725c,0x3c1c0d2b,0x3c15c171,0x3c0a96db,0x3c03bff3,0x3c0472d8,0x3c01cf9c,0x3ba73ba4,0x3c241f10,0x3c2a9fb4,0x3be5a34b,0x3c06b55e,0x3c093b25, +0x3c1740fa,0x3c1270e2,0x3c097319,0x3b752b29,0x3ba31670,0x3c00e939,0x3cba7a72,0x3ce82969,0x3cece69f,0x3cfb8e0b,0x3c9f1146,0x3ca19af1,0x3cdd49e5,0x3ccab7ff,0x3cdf6981,0x3d06cb7b,0x3d15c54b,0x3d01afde,0x3cb298ff,0x3cadb065,0x3d087ef1,0x3c5c525b,0x3c57f384,0x3c62b5db,0x3c015b83, +0x3bfd464e,0x3be82ba4,0x3c01cf49,0x3c0ecb9a,0x3bf46201,0xbaacc911,0x3c2ce213,0x3c177c5d,0xba6113a1,0x3aaa475b,0x3b757a4f,0x3c1921c5,0x3c3bbc50,0xb9f58778,0xbc84930e,0xbcbcb9e3,0xbbdb5dd2,0x3c723497,0x3cc5445f,0x3d0f2be6,0x3d27c169,0x3d0290d6,0x3cd50799,0x3d1009ba,0x3d0179ed, +0x3d315d13,0x3d3e0354,0x3d5707ce,0x3d33795e,0x3cb3e716,0x3ce7e813,0x3cf0de0b,0x3c97c571,0x3c75a803,0x3c5513bf,0x3b649b70,0xbaf393cf,0xbb91aeed,0xbb94d40a,0xbb6089ff,0xbb64b34e,0xbc97a0bd,0x3bd26a2d,0x3bac140e,0xbca4e2ef,0xbc2c906f,0xbc1542cf,0xba59c7c5,0xba4b7dbe,0xbaedef52, +0xbd2f850d,0xbd534d87,0xbc94e863,0x3cbe55dd,0x3cf750fe,0x3d3bf17a,0x3d1fd8d6,0x3cf3826b,0x3d08b566,0x3cf98d78,0x3cfd40b8,0x3d481ce8,0x3d9cf36b,0x3d71ce45,0x3d3b303b,0x3c9b8855,0x3cbdf34c,0x3ce70167,0x3c90ee4a,0x3c61523d,0x3c8aef06,0x3b1f4aa4,0xbbb27c74,0xbc07cd47,0x3a963628, +0x3c1810dc,0x3c1d32ff,0xbc846001,0x3c99270d,0x3a71b1a6,0xbd1d2b23,0xbca6e868,0xbb0c7480,0x3bb6ea3a,0x3bf8ec5b,0xbcbe5c48,0xbcae8f64,0xbcb75dea,0xbd1eae1d,0xbcc4325c,0xbcdbe014,0xbc50c61c,0x3ca41ffa,0x3d74f54f,0x3d8a0817,0x3d6ca6e6,0x3d3eb425,0x3d47be01,0x3d90e5a7,0x3d3a4eda, +0x3d2c7371,0x3d13463d,0x3d035cb6,0x3d47ff43,0x3d72b206,0x3cb2dc70,0x3bfb3baa,0xbd3200e4,0xbc141199,0xbc6d47fb,0xbd35899d,0xbd9b7a11,0xbdcea03a,0xbe049c5e,0xbdbece77,0xbd829530,0xbb80f045,0xbdffa35f,0xbe1e0c87,0xbdb356a6,0xbd6f0810,0x3e42518c,0x3e1a8ad0,0x3e2d884c,0x3e206b0b, +0x3e0dfd32,0x3ddadefd,0x3db9899b,0x3ddd3953,0x3d89d83b,0x3d83fce6,0x3cd76611,0x3ceb3fc4,0x3d29958d,0x3d9fa67a,0x3d1c3900,0x3d0b9a7c,0x3ca87fee,0x3c98eb87,0x3cf864cb,0xbc3433ed,0xbd212765,0xbcc7d360,0xbd272e1e,0xbd63de71,0xbdab67f2,0xbddc0f41,0xbe00f9d3,0xbe034a77,0xbe028ed2, +0xbd9c625b,0xbd9a6230,0xbd4c2758,0xbdeb17e4,0xbcfd9186,0x3e397958,0x3e3f8451,0x3ce1611b,0xbc7db79d,0xbb302d15,0xbcb93884,0xbca601a8,0x3d0d3e6f,0x3d8ee2cd,0x3e1e89fb,0x3d3b1699,0x3b959c4c,0x3cce8b38,0x3bb781eb,0x3d546a94,0x3e1a569f,0x3d9970a3,0x3d3df7a6,0x3d2228c4,0x3c67ef13, +0xbafb337b,0xbd1a0c94,0xbda24018,0xbde65a02,0xbe13169f,0xbe1202bf,0xbe0abb0c,0xbdf95f64,0xbdb0aad9,0xbd488789,0xbcc8c5ad,0x3d71870e,0x3da2c2c4,0x3d82a675,0xbb8d081d,0xbcfa0a84,0xbc690402,0x3c9ce736,0x3c844e36,0x3bf020c6,0x3c4283e0,0x3cd15fa8,0x3cf71194,0x3d3b2b7d,0x3d0f5520, +0x3d5c028f,0x3cf5895e,0x3cca80a9,0x3d7df4aa,0x3c27a6aa,0x3cb867a4,0x3d9673c3,0x3d3ac473,0x3d4b3f7f,0x3ca820eb,0x3c840cc4,0x3cc2783b,0x3c214291,0x3cdec327,0x3d2bd33f,0x3cf3ac17,0x3d76370d,0x3da17258,0x3dd26eaa,0x3e0ec1dd,0x3e2beadd,0x3e35cedf,0x3e06bfbc,0x3d8e5bba,0x3ce90593, +0xbcd90ce7,0xbc8894df,0x3d88d86b,0x3d0c1bf7,0x3d0b0f41,0x3cf30e9b,0x3c965f71,0x3c900abb,0x3cc1f38a,0x3cca9210,0x3d3110a3,0x3d95ff5b,0x3d25fb4c,0x3caf784f,0x3c4830f1,0x3cceb430,0x3d1ad491,0x3d27a4b4,0x3cfe1319,0x3c88637d,0xbbb15da3,0xbc2fd7e0,0xbbdf648c,0xbc89a5d9,0x3b87f8e4, +0x3c8cbcd0,0xbb935e71,0x3d07afe5,0x3d584017,0x3d891239,0x3dc0e47d,0x3de5b46e,0x3e01b04a,0x3dcdccd4,0x3da42a91,0x3d9ee08f,0xbc685fce,0xbd078730,0x3cdbe276,0x3ce05dfb,0x3d73043f,0x3d4c83a1,0x3d4fdb3e,0x3d32c82e,0x3d0a4021,0x3cd174c8,0x3c9e4332,0x3cf2003b,0x3c87e286,0x3c98a0e8, +0x3ccef85e,0x3cc77061,0x3cc7ac7e,0x3d1af4b7,0x3d09ea3e,0x3cfaa26d,0x3cf8d5e3,0x3cba6e02,0x3c9a7b75,0x3ce29dd5,0x3d183ce7,0x3d027cdc,0x3c720da8,0xba91dffd,0x3c02d547,0x3d215d59,0x3d6a7c5e,0x3d81eeab,0x3d5801aa,0x3d4ed2d1,0x3d426f95,0x3d8872fa,0x3cb52ff8,0x3c3c6c52,0x3be7526c, +0x3d433235,0x3d18e4f2,0x3d4d3509,0x3d3932c1,0x3d5cc40b,0x3d75d001,0x3d77570b,0x3d7a2b02,0x3d7d4235,0x3d47e19e,0x3d214b11,0x3cb199ca,0x3cec26a4,0x3cc1b8eb,0x3ce061f8,0x3cb1d807,0x3cd4ec84,0x3cd1ee59,0x3cc81adc,0x3c28b9c8,0x3d008b40,0x3ce255a6,0x3b2e5916,0xbc114dd0,0xbb0b01a5, +0x3b456963,0x3b995365,0x3bc07646,0x3c1daac5,0x3c55cc9c,0x3d029924,0x3d3ee206,0x3d8a04c5,0x3d4264de,0x3d063840,0x3c1ccb9d,0x3cb562b1,0x3d0a9450,0x3ccae745,0x3c410859,0x3c624f6a,0x3c04146c,0x3b6cd818,0xba638ebf,0xbb09ea05,0x3aa1dd28,0x3c274163,0x3c636e26,0x3c9cd05c,0x3ca8270b, +0x3ccf8015,0x3ca51bb1,0x3cbf354f,0x3caeec7c,0x3caff6c6,0x3b826b11,0x3d11df09,0x3d08e964,0x3d079e34,0x3d02a4dd,0x3ce960c7,0x3cc57f6c,0x3c9f620c,0x3d02f5a9,0x3d2e4850,0x3d547217,0x3d786a73,0x3d89d584,0x3d9ddd18,0x3d8a2642,0x3d7e2bc7,0x3d60c7d8,0x3d3df99b,0x3d4e9b8d,0x3d43ddb5, +0x3d50b1f9,0x3d3f4a2e,0x3d159872,0x3d3fb05b,0x3d3267f9,0x3d1229f5,0x3d1bb3c6,0x3d1939d0,0x3d1cea64,0x3d1c8ea0,0x3d1fcaa6,0x3d242ddb,0x3d44c22a,0x3d554a0b,0x3d03f98a,0x3d421d5b,0x3d549ae1,0x3d680f12,0x3d4f5627,0x3d5484e0,0x3d521e53,0x3d4ef83c,0x3d501f6d,0x3d498769,0x3d5a6624, +0x3d6328af,0x3d6e1a76,0x3d769512,0x3d7f5af3,0x3d88903a,0x3d7e113d,0x3d736c49,0x3d68d45d,0x3d5b56be,0x3d888dca,0xbd1b725e,0xbd1d90c2,0xbd135148,0xbd368052,0xbd367e5d,0xbd1f8cc6,0xbd0e4446,0xbd1cb38d,0xbd180af6,0xbd27e820,0xbd27929d,0xbd1d5aa5,0xbd1c0cc3,0xbd1dd3a9,0xbd240ab0, +0xbd1c44f1,0xbd08ad14,0xbd2b9275,0xbd2ffa63,0xbd274fc3,0xbcedfe58,0xbd029cdf,0xbd028991,0xbd088127,0xbd074cb0,0xbd08499d,0xbcfd4728,0xbd17d060,0xbd20a1b6,0xbd267ccb,0xbd1f8b4a,0xbd2bde43,0xbd5c022b,0xbd43c7cc,0xbd40bb60,0xbd4971fe,0xbd29c96f,0xbd27325b,0xbd1f7c98,0xbd2cdc8a, +0xbd085188,0xbc9b3e5f,0xbca056f4,0xbc895fbd,0xbc6fcf5f,0xbcb65c99,0xbcd2e051,0xbcc79105,0xbc9c5b2e,0xbc798c13,0xbca70bdb,0xbc75ef10,0xbc8ffc6a,0xbcd72b4a,0xbcfebfcb,0xbd24a083,0xbce12e63,0xbce20b58,0xbcf8d54f,0xbd0f6842,0xbd0e8804,0xbd13340e,0xbd037dee,0xbd4a3a1c,0xbd60ce08, +0xbd66d64f,0xbd51f2b0,0xbd75c4d5,0xbdb5784a,0xbd9dd927,0xbd977e73,0xbd95de6b,0xbd5212c0,0xbd60160a,0xbd490113,0xbd3b5788,0xbd1ce7f9,0xbb7f26ca,0xbaff8fce,0x3aee1cf3,0x3bf2e280,0xbc0eebd5,0xbbeb4624,0x3a7138ac,0x3c0842b5,0x3c27cbe6,0xbb5b4c61,0x3c11ffc9,0x3bd11dbe,0xbc28dd90, +0xbcb79e6e,0xbcee750a,0xbc92e8cb,0xbc8e6b36,0xbca0a866,0xbcec9464,0xbcd9d15d,0xbd00e371,0xbcbb9836,0xbd67a8ba,0xbd8a9321,0xbd96f92d,0xbd884a92,0xbdab4ee8,0xbe0a40bc,0xbde36edf,0xbdda3df5,0xbde372ce,0xbd8cb47b,0xbd0b5b8b,0xbcd52665,0xbcc6c7a2,0xbb9b94ef,0x3d23ee10,0x3d1f1595, +0x3d4071bd,0x3d30c63a,0x3c9c8174,0x3c95a4c0,0x3d0b5ea5,0x3d1a58d2,0x3d554dc6,0x3d499b51,0x3d61eedb,0x3d22f576,0x3bcc5afe,0xbb3cc17c,0xbc2986ec,0x3b2f65e1,0xba57276d,0xbc30f86a,0xbce7eb7f,0xbcdc8984,0xbcee68cb,0xbcb94c90,0xbd997c86,0xbdc8f78d,0xbdcbfa0e,0xbdb4ccd3,0xbde8eedf, +0xbe3c2309,0xbe1e09bf,0xbe178def,0xbe11953c,0xbd88a482,0xbdfc7ba1,0xbd90181d,0xbdfb2b21,0xbdeeebae,0xbd675844,0xbc860e10,0xbba6ebad,0xbcc130f4,0x3d1a9066,0x3d72013a,0x3cd11c07,0x3d6a0ff3,0x3d5c9d84,0x3c68c768,0x3d08bb28,0x3d09b555,0xba2bf7aa,0xbc912b26,0xbd06d5eb,0xbcf6a7bd, +0xbc89eee3,0xbbe0e938,0x3c249c1f,0xbc4f2d9b,0xbd215adc,0xbd3eda1a,0xbd7d7239,0xbd78c19a,0xbd84e4bf,0xbd96a528,0xbdc9c39d,0xbe223e8a,0xbdf66c06,0xbddfb1be,0xbd926461,0xbde77527,0x3db71a65,0x3e1447ec,0x3e0e969c,0x3de5cca2,0x3d895532,0x3d0835a5,0x3d122768,0x3dd12396,0x3d1683d7, +0x3c5c61ca,0x3c072587,0x388b1bfb,0x3ce042b1,0x3d627ca6,0x3d4ef3c9,0x3d0e0e99,0xbc64f46e,0xbcc0f4a0,0xbd6096a1,0xbd20285c,0xbc56b429,0xbce52bf7,0xbd3993c1,0xbcc12940,0xbb8263e5,0x3cef906b,0x3c29b1a5,0x3b01b454,0xbcaba0ae,0xbc7c6d67,0xbda796f5,0xbe7253b1,0xbe31aecb,0xbe004fe9, +0xbcadd96d,0x3cc14fde,0x3ce53de8,0x3b21564f,0xbd470863,0xbcc5302a,0x3c97e1ea,0x3deb70c9,0x3de1902c,0x3d90697c,0x3c4535f7,0xbcc90946,0x3c00a0ab,0xbbac0aab,0x3bbe3f8b,0xbd39b2af,0x3d55bcd3,0x3d7622e4,0xbd3ffca1,0xbcb63c4f,0xbd0a8fef,0xbd156e5d,0xbd4a0140,0xbd1e0bca,0xbc594b58, +0xbcd90717,0xbd2f127a,0xbd3046f7,0xbd624a08,0xbd05953b,0x3b9cf394,0x3d5c63d3,0x3dcc706b,0x3e078221,0x3e46f0cf,0x3e60bc25,0x3e94561a,0x3deb4c3d,0x3c6a3d86,0x3cbfb120,0x3cbbe109,0x3ce4a033,0x3c82f439,0x3cdf3565,0x3cd054a0,0x3c9b2332,0x3d7752fa,0x3d651be0,0x3d20a68f,0x3d05ce2e, +0x3d3393d5,0x3c4c635d,0x3d8e8117,0x3d8c528e,0xba5b2de1,0xbbbb1926,0xbcb79ff7,0xbc97dfec,0xbd14e3b6,0xbd2b6762,0xbd01f68a,0xbd60ee42,0xbd39ce15,0x3b037ca4,0x3d0b3413,0x3d9c3a52,0x3dc4602f,0x3e304608,0x3e2608c4,0x3dc2aa63,0x3c103c0e,0xbd1d51d1,0xbc60ee16,0xbc82a814,0x3c8fdf5a, +0x3c003c78,0x3c189759,0x3c416b46,0x3c90bb11,0x3d44e0c6,0x3d4a321d,0x3ccee1d6,0x3cad1bf7,0x3c2c33df,0x3c920f7d,0x3bcce1dd,0x3bba4bf4,0x3cb8dab5,0x3be7b231,0x3baab59f,0x3c2bab64,0x3c348e3d,0xba75a929,0xbc1ede4c,0xbc7fd6df,0xbc228096,0x3ce707e1,0x3ce4b319,0x3d14483c,0x3d800402, +0x3d1ae9ff,0x3ca1576f,0xbcc3f321,0x3bda97ec,0xb9a039cb,0xbca0ddb0,0xbc92cc6e,0xbc30537d,0x3ca49f2e,0x3ca3f0ee,0x3aed1239,0x3b48f094,0x3a64910b,0x3a93eca1,0xbbecd069,0x3b302783,0x3c0c29b4,0x3c58a6ef,0x3c3dae3a,0x3c199d9e,0x3bbc76d3,0x3c8c0e52,0x3cd5ad2f,0x3ce4927e,0x3c7280d8, +0x3bf031c9,0xba320f4e,0x39878c0b,0x3b37d2e2,0xbc30d245,0xbc0fe637,0xbbb3b836,0xbc124f70,0x3cadf88e,0x3cc78e29,0x3ba6bc64,0xbc924d0b,0xbcba5b92,0xbc85a819,0x3ca263a4,0x3c54c138,0xbd17fecd,0xbd4e7491,0xbd4795f4,0xbc5630db,0xbbef3b51,0xbb04e0a2,0x3c111a9d,0x3c21376e,0x3c2c6f64, +0x3c70c561,0x3c6d1d5d,0x3c38e4c9,0x3c43e807,0x3ca187f7,0x3cca0237,0x3d0f02a3,0x3ca00581,0x3c595d67,0xbada369d,0x3bf9bb1d,0x3c042042,0x3c6b1728,0x3c6c5fec,0x3cb9a55c,0x3c05d198,0xb6b18660,0x3c1c0337,0x3bffbbe4,0xbbae9b15,0xbc980499,0xbce07035,0xbc28a09c,0x3b790252,0x3c87829f, +0xbbfaac7c,0xbcc5d2a7,0xbd1f4c5b,0xbccda98c,0xbca4592d,0xbc8f0f76,0xbc2d26a6,0xbc67aaad,0xbc857dc3,0xbbef7894,0xbc76b449,0xbc66b4c5,0xbc43809b,0xbc2b6df0,0xbc6c4f2a,0xbc3fc781,0xbc7c1dba,0xbc4e954a,0xbc5d9bfa,0xbc193523,0xbc0e07e3,0x3af6ad22,0x3b8498ce,0x3bd1919f,0x3c3f839e, +0x3cfd83df,0x3c9e7fab,0x3cba5e7d,0x3cc465ae,0x3cdf95d5,0x3cfd81e1,0x3d156760,0x3d20a0fc,0x3cf27bd0,0x3c939efc,0x3c35a400,0x3b4ea611,0xbb228f63,0xbc5a687d,0xbc5fff92,0xbc6c0613,0xbc66bc22,0xbc5c8e97,0xbcdc74cf,0xbcecbbba,0xbcad3c09,0xbc644f5b,0x3a29dfff,0xbcb245a5,0xbc48e985, +0xbb144e7f,0xbb4a9dc0,0xbae7a284,0xbae3849c,0xb8343636,0x3a49ef13,0x3ad2a2dd,0xbc4ce8d0,0xbcaa7e3f,0x3c330800,0xbbc3e1b9,0xbc4c688c,0xbcab494b,0xbc856681,0xbc868608,0xbc8158b1,0xbc723f2c,0xbc6e5366,0xbc44e2d6,0xbc891640,0xbc9ebce9,0xbcbf7213,0xbcce7a0e,0xbce0beda,0xbcf81d97, +0xbce824ed,0xbce4d59f,0xbce0b948,0xbce3052c,0xbd24365a,0x3c2e4442,0x3c2a0e63,0x3bf8b9f3,0x3bdc5292,0x3bbf8551,0x3bd7bd67,0x3c10cbdd,0x3c346c3f,0x3c3ddbfe,0x3c04b92e,0x3bf74acb,0x3bd97912,0x3c167a6b,0x3c1b1bb6,0x3be37569,0x3c591df8,0x3c67ee12,0x3c245760,0x3c49e354,0x3c36b6c9, +0x3bc27138,0x3c0f4508,0x3c0eef98,0x3bd8e684,0x3c0345dc,0x3c0c36b1,0x3c055a74,0x3c2f6c71,0x3c3b56d8,0x3c6dfe88,0x3c0035a4,0x3be868af,0x3c3b5dd2,0x3c38241f,0x3c4f9867,0x3c633298,0x3c52f692,0x3c8853d0,0x3c21f539,0xbb9bc05f,0xbb4d15de,0x3bcfaa88,0x3bcd572e,0x3c2c1fc2,0x3c9429f4, +0x3c313f6b,0x3c18020d,0x3c0ff1b6,0x3c6776c3,0x3c7386ff,0x3c2c7a2e,0x3c91d156,0x3c9c2a25,0x3c9d835d,0x3c4df099,0x3c2685ab,0x3b59d3ff,0x3c037b17,0x3c099dc5,0x3b49a22e,0x3bcb6070,0x3bf28ec7,0x3bfabacb,0x3c8a1ed7,0x3ca5b2f9,0x3cd1f124,0x3bb52ec9,0x3b58f2f8,0x3c927f3d,0x3c85636b, +0x3c99c557,0x3ca4f6b9,0x3caa2a11,0x3c5a71ff,0xbba8e7b5,0xbcb5cf5e,0xbca3b34d,0xbadbbdce,0xbb40a85f,0x3bb63432,0x3cd7fe55,0x3beec09f,0x3ba76a51,0x3bdd9f48,0x3c7302f2,0x3c9f39ab,0x3baf54d3,0x3cb20e07,0x3cc59f6e,0x3cc4e6e2,0x3c38bc92,0x3bce4619,0xbbcd05f0,0x3b8202d1,0x3b856b2e, +0xbbe881a7,0xba26f85a,0x3b5d6f23,0x3b7f75fe,0x3ca83a5f,0x3cc31dc1,0x3d174dd8,0xbac5c4f5,0xbbe44fbd,0x3cf6dc9d,0x3cd42775,0x3d163c91,0x3cfa3c8c,0x3cc05a1b,0x3ce72f94,0x3b958a3e,0xbd038ffe,0xbd0009b0,0x3baed599,0x3b198dfb,0x3c84df04,0x3d2b45c7,0x3c68f93e,0x3c52e92a,0x3c84401a, +0x3d1bf9f8,0x3d2f9535,0x3c515c71,0x3d1cdc98,0x3d27f3db,0x3d01ca50,0x3c6fc3fd,0x3bc872f4,0xbc480c42,0x3adc7378,0x3b1357f7,0xbc6699ba,0xbb1c5d57,0x3a92e48a,0x3b779083,0x3d0b6275,0x3d41f5af,0x3d824845,0xbb44b1f0,0xbbcf1ba3,0x3d57b76f,0x3d36e3fa,0x3d3ee5dd,0x3d3d1b7b,0x3d1ba79a, +0xbdeca754,0xbdbccb86,0xbdac02fd,0xbd8be47e,0xbd4b84ca,0xbcce8538,0xbca07909,0xbc87b016,0x3c5c8b44,0x3d207395,0x3c9e2b2e,0x3d2835ad,0x3d1ca006,0x3ca6f31e,0x3ceeafb1,0x3c84cb16,0xbb0b7ad0,0xbc14f837,0xbc16db8d,0xbc9ce9a6,0xbcad4b72,0xbc9f942c,0xbce29d64,0xbd0ad135,0xbcb50ce0, +0x3b44a32f,0x3a876a48,0xbbd8662f,0x3b831ae2,0xbd2c42df,0xbd4bfeb5,0xbd8bbcca,0x3b94d6e0,0x3ca2cbb9,0xbd0de143,0xbdb46708,0xbdc03151,0xbbb274c5,0x3c519786,0xbbb97d07,0xbd433af0,0x3c0ddd9e,0x3d1a2391,0x3d56e637,0x3cae08eb,0xbbc432f9,0x3c25f0d2,0xbadcdb71,0x3c94d12b,0x3ccf146f, +0x3d4078a6,0x3d4ae133,0x3cfcb311,0x3cae3ef5,0x3c858b2a,0x3c6dfec0,0xbc6f5b76,0xbc9ab89b,0xbb87e34d,0xbd79f8b2,0xbdbfe9fb,0xbdb9d8dc,0xbdb90482,0xbda45eb7,0xbd55e54b,0xbe00998c,0xbe002634,0xbdfbee32,0xbd9936e1,0xbdcdb558,0xbe370a27,0xbe015ed7,0x3e3c0521,0x3dfb2e96,0x3d825ecf, +0x3daaf9c8,0x3df0d9f9,0x3e0b23e2,0x3db961d7,0xbc7a0cd4,0x3c8750bc,0x3b2505ca,0x3c08f912,0x3c074158,0x3ca154e9,0xbcf40fdf,0x3d8e35c6,0x3da4f229,0x3bdcc637,0xbc017579,0xbd0199f1,0xbd04b918,0xbd1086bb,0xbd003607,0xbcc320a9,0xbd1b5be2,0xbd1b0612,0xbcb600ee,0xbd472bef,0xbd741007, +0xbd48e3e7,0xbda39d4d,0xbdb8098a,0xbe11194f,0x3d7db030,0x3e30abbd,0x3e2116d6,0x3e5056e0,0x3c48507c,0x3b4ea15b,0x3bdcbcde,0x3bf9384a,0x3b532f5b,0x3d168c48,0x3d6b36d4,0x3d4b43b4,0x3d7816bc,0x3d265a89,0x3c27ecee,0x3ce1eb99,0x3ce69b19,0xbc8ce6cc,0x3d1bf9a0,0x3d25b205,0x3a4699df, +0x3bef184a,0xbc66c714,0xbd1ce73f,0xbd77cf6f,0xbda3a6a6,0xbdcdf63a,0xbe0243e2,0xbe146da4,0xbe1ffc5f,0xbe139895,0xbdc14057,0xbc598599,0x3cfae64f,0x3d88d5ac,0x3c8ad58c,0x3dd08413,0x3dc02ffc,0x3cfea91f,0x3cd0cfbe,0x3cfacaec,0x3d03fe6f,0x3cf92b53,0x3d159311,0x3d24efb7,0x3d42a34a, +0x3d1b5b69,0x3c70a0db,0x3c5157a9,0x3c4f57fb,0x3a6552fa,0x3b979644,0x3c7b4712,0x3ce91eec,0x3d50e86d,0x3d44b9b3,0x3cc18a7a,0x3cd5756d,0x3cb8c236,0x3d043334,0x3d093348,0x3d0405cd,0x3d0717bd,0x3d104ff4,0x3d512486,0x3d75e0ce,0x3db33b0c,0x3dd19364,0x3dffbe70,0x3d866b2c,0x3ca5a947, +0xbd51e8c9,0x3c98e6a8,0x3d621b5e,0x3d915d61,0x3d35f1a4,0x3d5ec56c,0x3d178573,0x3cea283f,0x3cc02484,0x3cc16795,0x3d0ab26c,0x3d3161d8,0x3d2d65a5,0x3d3c3f0d,0x3d1e6af0,0x3cf39998,0x3cd2c74c,0x3cbcc600,0x3c9469d0,0x3c9693a3,0x3c81e4e8,0x3c38a1aa,0xba03e2cf,0xbc03c1a3,0x3b511330, +0x3bad530c,0xbb2e1a9b,0xbc0731a1,0xbd4dab0b,0xbd7f8b0b,0xbd3cd921,0xbc8b305a,0x3b5872da,0x3cc40bc9,0xbcaac8fe,0xbcd85808,0xbc8140d9,0x3cc22daf,0x3d3f8860,0x3d8518a6,0x3d873406,0x3d1ed456,0x3d2c829b,0x3d0f9dcd,0x3ce95dc1,0x3ca80523,0x3ca02e64,0x3c88b177,0x3c66fdff,0x3c5588f5, +0x3c983b0f,0x3c96b0d5,0x3cd78bc4,0x3cb121c5,0x3cf1ed5b,0x3ccda781,0x3cf4e850,0x3cf016b7,0x3cc86ae3,0x3c603575,0x3cae9eaa,0x3ce20716,0x3ca5de68,0x3cbee3de,0x3d0b7808,0x3d31777d,0x3d3e17d7,0x3d15b9fc,0x3cc8da2f,0x3c781ea9,0x3c2b3a81,0x3bbc4844,0xbb670675,0x3c0002cc,0x3ca2d4a6, +0x3d0bd74a,0x3d12db7f,0x3bf3015f,0x3c70fab0,0x3be9045e,0x3cb14de1,0x3cb33092,0x3cc8d0dc,0x3d00dbe5,0x3d16a8f7,0x3d10473f,0x3cfa36cc,0x3cbcec09,0x3cba2b9c,0x3ca43973,0x3c84e1d5,0x3c341db2,0x3c297efd,0x3c420a65,0x3c32e99e,0x3b97adf7,0x3bfeaa2c,0x3b596dd8,0x3b130fd1,0xbad3bcca, +0xbbcc0ef9,0xbc389385,0xbc57f808,0xbc80d316,0xbc82b2da,0xbc90954b,0xbc8de158,0xbc8adb15,0xbc911f88,0xbc3607ee,0xbc007204,0xbb4350ee,0x3ad4629e,0x3c35c5d8,0x3c74408f,0x3bd3e517,0x3ac46769,0xbc0f92d8,0x3c70404e,0x3bb84632,0xbb66dc6f,0xbbc17bd1,0xbbdff003,0xbbe65cde,0xbc20c25b, +0xbc40a62b,0xbc64ceca,0x3a877333,0x3c1abc09,0xbc613461,0xba8fac6d,0x3b9f73f4,0x3c3fbc0e,0x3c0dcbd8,0x3c05981a,0x3bf6d175,0x3be4c432,0x3bd76f05,0x3bb554c5,0x3bbc191e,0x3bbaa7d1,0x3bc24560,0x3ba51d9b,0x3b93f11f,0x3b70c3d3,0x3bb5c215,0x3be93e94,0x3c09cde9,0x3c2a8104,0x3c738ccb, +0xbc287831,0xbc599bf0,0xbc3fe495,0xbc46c77c,0xbc443be1,0xbc463a91,0xbc29a1d2,0xbc185824,0xbba2084d,0xbc0e0462,0xbc1c87fc,0xbc1defe6,0xbc13dd5e,0xbc0a2d1e,0xbbea9391,0xbbefc5f6,0xbbd129a9,0xbb9ec63c,0xbbe9b3dd,0xbbeda3c2,0xbb84a672,0xbc08d170,0xbc0e134f,0xbbce9102,0xbc200d36, +0xbc2f2c05,0xbc34bff1,0xbc22f1c6,0xbc2c4d31,0xbc378bc7,0xbc7dddf7,0xbc804739,0xbc492bdb,0xbc33d6dc,0xbc329ee5,0xbc3d5a20,0xbc61470a,0xbcc918b4,0xbcb1f133,0xbc95c027,0xbc9f0a58,0xbc9e0fd3,0xbc1ace46,0xbb681a7f,0x3b3aa439,0xbb8ef739,0xbbf2b1bb,0xbbf963f3,0xbbf034e3,0xbba98eed, +0x3a1e31c5,0x39a949dc,0x3b27045e,0x3b7cb7e2,0x3b3f275a,0xbb6a7535,0x3a8a24b0,0xbbb7dd87,0xbc0f78e1,0xbb09455c,0xbc429967,0xbc632031,0xbc750520,0xbc52b8e3,0xbc7ebeed,0xbc9fd1c3,0xbd04323d,0xbd04c89a,0xbca77836,0xbc5b9114,0xbc342b0f,0xbc68379d,0xbcb23355,0xbd160ad9,0xbcb0aa6e, +0xbc8e4290,0xbc9678d3,0xbcba23f5,0xbbf09d4e,0x3b4f28e4,0x3ca10bc8,0x3b065e81,0xbb54dddb,0xbb0c25fa,0xbb071d0c,0x3b994463,0x3c95a50a,0x3c49b837,0x3c81e7b5,0x3cb0d497,0x3c8314c2,0x3bc65ea0,0x3bf6977e,0xbb0772a5,0xbbefc0a8,0x3bc8d2ac,0xbc45fca9,0xbc84b7be,0xbc993ca3,0xbc6f94a8, +0xbcae5f3c,0xbccfff80,0xbd47f1bd,0xbd3f2f7a,0xbcc7c97c,0xbc8c2097,0xbc9ddc59,0xbcafe47b,0xbd10d3ee,0xbd3aa1c5,0xbd04231c,0xbd0d8494,0xbd241be1,0xbd0655e7,0xbbb05d4f,0x3c62996c,0x3d23680b,0x3c28790a,0x3bec9a8a,0x3c0b0eef,0x3cce83bf,0x3cb51be8,0x3ca5b105,0x3cb54a4d,0x3d012e2d, +0x3d04a3d9,0x3cb650a9,0x3c1a7a70,0x3c895a7e,0x3bb63ec6,0xbba2407a,0x3c80fee2,0xbc3b47e8,0xbc8e387a,0xbc9cfecc,0xbca4fa68,0xbcd8ef0e,0xbd1d2fd6,0xbd9f3500,0xbd9ef01f,0xbd1505eb,0xbc92a76b,0xbc35a26b,0xbc455563,0xbd112ffe,0xbda68322,0xbd58e6fa,0xbc194c74,0xb9294eac,0xbcbd1fc6, +0xbd02de7b,0xbcc757a3,0x3baf1cea,0x3b6c82e6,0x3c8e6ce5,0x3c632ef8,0x3c976242,0x3d035ab7,0x3d5f1a3a,0x3cbda8fa,0x3c906acd,0x3cf9c0ad,0x3c5aeb5a,0xbc4676c4,0xbcda54e2,0xbc1c344f,0xbc1b1f6a,0x3b4f747b,0xbcbb9191,0xbd04fbee,0xbd393f95,0xbd3039d7,0xbd6cb36f,0xbdc2bf17,0xbd3f78bc, +0xbce24c0d,0xbcaea2b7,0xbd0ec3ab,0xbd83c25b,0xbdf8b737,0xbdc38378,0xbde60678,0xbda67d4a,0xbdb2289f,0xbd7be0d0,0xbc67dc2e,0x3d09d972,0x3d2269bd,0xbc8c01d7,0xba557ac8,0xbc0ad468,0x3bd8944a,0xbaa0fb49,0xbb5e918f,0xbc56028e,0x3d317b3c,0x3d3d4d6b,0x3c4daca5,0xbb3f1e97,0xbc71ff43, +0xbc57c410,0xbb9857a9,0xbc0f617b,0xbc716e5f,0xbaff55b5,0x3c56cfe6,0xbb3df327,0x3c5f78f6,0xbc244ab7,0xbd60f876,0xbdd89da1,0xbdb734d7,0x3cd3e8f5,0x3c8e2d28,0x3c7a33ca,0xbcf2bc56,0xbdb3c96b,0x3e2bbac1,0x3e569bc7,0x3e3428d3,0x3e214c00,0x3e20299d,0x3daf2f44,0x3d3793ae,0xbc132561, +0x3c936c0c,0x3bee76a3,0x3aeada38,0x3b5d6f88,0x3b919583,0xbb6d6bb7,0x3c2ea109,0x3cad1345,0x3d4146e2,0x3baab617,0xbc597b17,0xbc6f7246,0xbbc8c82c,0xbc85d6e7,0xbd117a5a,0xbd7b204b,0xbd8b4b1f,0xbda1dbf9,0xbcc660f2,0xbcaf9bbc,0xbd04319f,0xbde3cbe0,0xbdec801b,0xbca2dd5d,0xbdbcd0c8, +0xbd8b23d4,0x3cef754e,0x3ddfa92f,0xbc751c71,0xb970bbd2,0x3b5b328d,0x3ce05347,0x3d3ca0c4,0x3d842970,0x3d8c1cd2,0x3d70790f,0x3c859657,0xbae30ede,0x3c14b66a,0x3c14dfca,0x3bb47c88,0x3bf0adbd,0x3c5f4cee,0x3ca1e87e,0x3d4b571f,0x3c1ad49f,0xbc26caf7,0xbc91709a,0xbd132f28,0xbd57bc88, +0xbd5df271,0xbd7176d7,0xbd4fc845,0xbd62f465,0xbd2b4430,0xbd7da035,0xbd69dcee,0xbdd44dd0,0xbd559b10,0x3dc7022d,0x3e11ea4c,0x3e259f48,0x3de666d8,0x3cfdd291,0x3cba2d21,0x3d1150ae,0x3d0cda1a,0x3d220960,0x3d353a33,0x3d249700,0x3cfc973e,0x3cb62ceb,0x3ceb0785,0x3d24e036,0x3d6ca754, +0x3d17df29,0x3d03e27d,0x3cd5cfe5,0x3d45de28,0x3d3dc495,0x3cfae855,0x3c805955,0x3c7fbc85,0x3c5f4597,0x3b8bc2ec,0x3b446252,0x3ad13395,0xbc6f130b,0xbc879f61,0xbc05a074,0x3ced6694,0x3d4deb05,0x3d97aeba,0x3d1ef344,0x3d0a80e8,0x3d98a03c,0x3c989d04,0xbb37a8f1,0xbcac6411,0x3a6e1319, +0xbcf1ab4d,0xbc9cfff3,0xbb9266a2,0x3c1e8a78,0x3cd6c5e5,0x3d1d1dee,0x3d3330d5,0x3d13ede9,0x3d2cf0c1,0x3d237d4e,0x3d1a3955,0x3d010ac0,0x3cd8cda7,0x3c959449,0x3c90e175,0x3ccdedf4,0x3d1df7a1,0x3d1bc9d9,0x3d064778,0x3cd0e271,0x3cd800c1,0x3d084813,0x3d342e7a,0x3d8397de,0x3d9fd14d, +0x3d9aa575,0x3d73a820,0x3cdd88dd,0xbc41f612,0xbcad558e,0xbc824d8c,0x3c6e91f8,0x3c9da4ac,0x3c9bcf8e,0x3b9c6df7,0xbcabdb3f,0x3c84422f,0x3be10936,0x3c4deb98,0x3c3151f1,0x3c138199,0x3c3e776c,0x3c80936c,0x3caf0ca6,0x3ca9b4a0,0x3ca3be9f,0x3caf4e89,0x3cdf9a8a,0x3d14d72b,0x3d385413, +0x3d0ebee3,0x3caa4f2b,0x3bc6f117,0x3c8d136f,0x3d0a22ab,0x3d092f2b,0x3cf4d3bf,0x3d10fb64,0x3d0ea425,0x3cdfdde0,0x3ca7acd2,0x3c94ec0e,0x3c16862b,0x3ba9d65a,0xba8fd3ab,0x3c50ad83,0x3ca9a5e6,0x3cdca7fd,0x3ccad0dd,0x3ccf591c,0x3cfbc6a7,0x3ccc87a8,0x3cce65b6,0x3ce464a2,0x3cdf9177, +0x3cf483bb,0x3d01ca60,0x3d0f5d61,0x3d146df8,0x3d1d69e5,0x3d181835,0x3d1878d2,0x3d16af2d,0x3d12983b,0x3d0949f4,0x3d08bf9f,0x3ce0ae4e,0x3cc5acbf,0x3c9ba15b,0x3c4905f7,0x3b87aa56,0xbb9f2564,0xbbb172e0,0xbbe6d05c,0xbc0184a1,0xbbe57ba6,0xbbcaa55c,0xbbd18817,0xbb23efc2,0x3a96dc70, +0x3b70a806,0x3bc4db57,0x3c056f6c,0x3c4a56ef,0x3c7e3b9b,0x3c9477c2,0x3c9e3dc9,0x3cacddc6,0x3cba3b93,0x3cc8c288,0x3cbe8d91,0x3cc7f7b8,0x3cd12c9d,0x3cc1b6fe,0x3cc8dabd,0x3cd922f6,0x3cda16d1,0x3cdd96aa,0x3cdf297b,0x3ce238ce,0x3ce49cc1,0x3ced0793,0x3cce5543,0x3cb24ba4,0x3cbdf724, +0x3c9c0d58,0x3c85342c,0x3c5b2e47,0x3c742c77,0x3c6ef478,0x3c6ce1c5,0x3c65cdc4,0x3c5c580d,0x3c4ac577,0x3c6d554f,0x3c80e06d,0x3c8d23ef,0x3c90e64e,0x3c94bbf6,0x3c94d4ac,0x3c9773c9,0x3c9d22e2,0x3ca64e04,0x3cb230f3,0x3cb7a7a3,0x3bac8ce9,0xba945f87,0x3b9a5e23,0x3b3e0ef6,0x3b3970cc, +0xb9a6019e,0x3bce8dea,0x3be6a3a1,0x3bee1bdf,0x3bac44b1,0x3b83d080,0x3b062928,0x3b3bc7f7,0x3b8635c1,0x3c0277f6,0x3c066727,0x3c1107ee,0x3c022de0,0x3c20912e,0x3c1c8ef6,0x3beaebf3,0x3bc5fc38,0x3ba71922,0x3b9533c4,0x3ba629e8,0x3b8dbb74,0x3b0bc70b,0x3ad093d0,0x3b06d916,0x3bba22e5, +0x3b6a3b90,0x3b960c1c,0x3c2c40f7,0x3b8dccc2,0x3b20e67b,0x3b265219,0xba955888,0xbc2b2f14,0x3a32bc6a,0xbc150da5,0xbba12170,0xbc1fb357,0x3bd3aa34,0x3c413855,0x3c4d0d6f,0x3c0534b7,0x3b910e0c,0x3aa5dfc0,0x3ad9fcf2,0x3ba14615,0x3c6744f1,0x3c592984,0x3c7ed3e3,0x3c8d0cbe,0x3c9bca44, +0x3c9fd80f,0x3c68c3de,0x3c0ea9a0,0x3bd2a2c4,0x3b806536,0x3bb50c91,0x3b703644,0xbaabe2c6,0xbacdca15,0x3916385d,0x3c04cd5a,0x3b64adcb,0x3c006512,0x3caf3c7c,0x3c11868e,0x3b6b3213,0x3afbec5f,0xbc24434b,0xbcf8db43,0xbb8628bd,0xbc76b00e,0xbbe1e569,0xbc931e6f,0x3bd70f39,0x3c8186ee, +0x3c9ea2a5,0x3c333e84,0x3b02333d,0xbb67363a,0xbb424765,0x3ba1f99a,0x3cbea421,0x3cb6eff8,0x3ccbe16a,0x3cda19d8,0x3d001fd9,0x3cffc02d,0x3cb9e939,0x3c394f41,0x3bcbc935,0x3b5861de,0x3bb9d22b,0x3b111ba7,0xbc10663a,0xbc59f860,0xbc31d39c,0x3c2e675f,0x3a4deaff,0x3c06ab48,0x3d0cf379, +0x3ab6a52e,0xbc0a9c7f,0xbc31dfeb,0xbd0ccc88,0xbd3cb972,0xbc68e825,0xbd155d5a,0xbd117b31,0xbd267e85,0x3c1033c2,0x3cc82994,0x3d01af8d,0x3c6c3fc7,0x3b7eeab3,0xbae1dca2,0x3c221467,0x3c9dc5e9,0x3d3380ba,0x3ced62a0,0x3d0ecb4c,0x3d3ff72c,0x3d5469d9,0x3d4eba61,0x3d0d1d37,0x3c85eb88, +0x3c2974f5,0x3aefdaa4,0x3ba16edb,0xba057c52,0xbc49cf37,0xbc6392ee,0xbba9c43b,0x3c8c9a3a,0xbb2f00ae,0x3c7611ea,0x3d6a0455,0x3c921396,0x392fac1d,0xbb9e1221,0xbd4aa131,0xbd84bed8,0xbda3bc7a,0x3ceb4d87,0x3d2c809b,0xbcb20706,0xbc6e2287,0xbc0ace7c,0x3c52e8bb,0xbbf9d5e1,0xbae8b1c6, +0x3c43fc6e,0x3ad9db6c,0x3c475828,0x3d1c27c9,0x3cc3fd0d,0x3cac3364,0x3cd9e2f9,0x3c89e179,0x3c68fac5,0x3c6273ff,0xbb979f0b,0xbc78489a,0xbce479ec,0x3ace8b7d,0xbaeb0e46,0xbd15b0d3,0xbd7afc0f,0xbd5a3c15,0xbcf96839,0x3d693400,0x3d66f2d4,0xbccdf160,0xbd11e9e5,0xbd798014,0xbdbdee7b, +0xbda58b63,0xbd0ee0a0,0xbdc2edf9,0xbdb55a22,0xbd788f40,0x3c50e883,0x3c28fdac,0x3bdcfb6c,0xbc8a04b7,0xbb422b03,0xbb595356,0x3b7a671f,0x3a751a1b,0xba766e21,0x3c36de65,0x3ccb2ab6,0x3cfffec4,0x3d514042,0x3d07fdec,0x3cc81389,0x3b0f4277,0xbb1d1c65,0x3aa71bf5,0x3c03ce3c,0xbc811667, +0xbcd6767d,0xbcc5c37b,0xbd5604fe,0xbd90ce9e,0xbde14843,0xbd5eb279,0xbcb97770,0x3c753980,0xbb73a340,0x3b49477b,0x3cc321b4,0x3c5f2ee8,0xbcd4e56e,0x3d53e6d2,0x3e081d18,0x3de5940a,0x3dd36dc7,0x3c96741d,0xbaeacfd5,0xbae0987b,0xbacae574,0xbb573eeb,0x3b1b42ce,0x3bf6e9b8,0xbc277b39, +0x3c01a707,0xbcb5d433,0xbb68c76b,0x3da74e4c,0x3ce93042,0x3b8bee1e,0xbbedfdf7,0xbb9f18ff,0xbc4b17ad,0xbc880b57,0x3b4114c0,0x3c192376,0xbc06e8d9,0xbd110e1c,0xbd86c8ca,0xbdf4877f,0xbd9cf46d,0xbda7c62c,0xbd9adc1b,0xbe1fc419,0xbe4739c9,0xbe60c875,0xbde35375,0x3e233349,0x3db051d5, +0x3d6e1d32,0x3d811d3d,0x3db1dc47,0x3d926ab6,0x3d67b9e7,0x3d1adaef,0x3bcc1afb,0x39524376,0x3b2c469f,0xb9e80c18,0x3984ed96,0x3ccbb5a8,0x3be74695,0x3c21aa1d,0x3d5b9c05,0xbbb519fa,0xbcc173d0,0xbccafcd0,0xbd13d36a,0xbd0852a8,0xbcdadbbe,0xbccc8c86,0xbc9347a5,0xbba68461,0x3bd956c3, +0xbc5d938b,0xbdb7ee30,0xbdbdd523,0xbdb8d34f,0xbcdc6052,0x3cf2b47b,0x3dce785b,0x3e2577f5,0x3e3952df,0x3c7958e5,0x3cc6dd11,0x3cf18de0,0x3d04db22,0x3d347478,0x3d06fc08,0x3d12143a,0x3d495c0b,0x3d4026b9,0x3d38dc2d,0x3d2f6827,0x3d208641,0x3cfc3f34,0x3c44d75f,0x3c8fbe20,0x3cb9b3a6, +0x3d14a51b,0x3c8a2260,0x3a3e487e,0xbc5b4f51,0xbcbae7ee,0xbd1a5122,0xbd6a8518,0xbd52b459,0xbd4be373,0xbd2e157e,0xbd6d5c12,0xbd470bdc,0xbd020df6,0x3d67f650,0x3de54d6f,0x3e15be0a,0x3deb312b,0x3d86d456,0x3c5f946d,0x3c6760d8,0x3ce2fc86,0x3cd10268,0x3cca9a49,0x3d0b4594,0x3d3ad3dc, +0x3d235fc4,0x3d0ddfe7,0x3ceb0ca8,0x3c5d371f,0x3c24cd5c,0x3c89de7c,0x3c906599,0x3c9f1f9b,0x3ce4f722,0x3d12efa2,0x3d069895,0x3ca210f0,0x3cc4abe2,0x3ce03e0c,0x3d000a66,0x3d162720,0x3d3c09a0,0x3d712c0d,0x3d924cae,0x3d9832a1,0x3da29d11,0x3d85cf31,0x3d856a0b,0x3d8382ef,0x3d84b0d3, +0x3d6551af,0x3d31b9aa,0x3ccdb5bf,0x3ca6643a,0x3c81bcdd,0x3cc410b1,0x3b7e0b67,0x3b8f4675,0x3c39cdbc,0x3c97a017,0x3cbbfeeb,0x3cc2e7b5,0x3cddd83a,0x3cfe168d,0x3ce91b70,0x3cd12f54,0x3cae5055,0x3c9fea01,0x3cb660dc,0x3ca60402,0x3c7ee481,0x3c42dd8f,0x3c354a85,0x3b1413c5,0xbc083291, +0xbc689452,0xbc54f77e,0xbc88e925,0xbc96e140,0xbc97a830,0xbc8f324a,0xbc874b11,0xbc11f095,0xba81a36b,0x3c0d7e30,0x3c62468f,0x3c977e89,0x3cae469f,0x3c84d5a8,0x3c155e69,0x3b056b1f,0x3a88a430,0x3cf23537,0x3cfedc36,0x3cff522a,0x3ce17767,0x3ce37842,0x3ccfe5cb,0x3cb8f161,0x3cb2472e, +0x3ca7a226,0x3cb32165,0x3cbda77a,0x3cbbfb4a,0x3cb6ffd4,0x3cbee57c,0x3cae548e,0x3c9e44e2,0x3c93e965,0x3c830b22,0x3c5ca4da,0x3c6c8047,0x3c8d362d,0x3c9ddc5f,0x3cb1e110,0x3cbe020c,0x3cc8f07a,0x3ccdb2f8,0x3ccc3fc5,0x3cc0d303,0x3cb32ad3,0x3c9cc2bf,0x3c8ebd05,0x3c90912c,0x3ca45e25, +0x3cc2d8fa,0x3cda9f2f,0x3cf00b50,0x3cddfdd8,0x3ce80b30,0x3cddf515,0x3cd07d98,0x3cbd40e5,0x3ccabfe4,0x3cbd1a7d,0x3cb55d9b,0x3cbd68f9,0x3cbb4f15,0x3cb98889,0x3cbba1ce,0x3cbb3deb,0x3cbb480b,0x3cb3e8f1,0x3cbd1ff9,0x3c9269c3,0x3ca0571b,0x3ca6a02c,0x3cb4862e,0x3cafebd5,0x3cb03d9c, +0x3cb07684,0x3cb211d2,0x3cb57de9,0x3cbc0e89,0x3cb6f594,0x3cb78315,0x3cbb61af,0x3cc5b74c,0x3ccd1c93,0x3ccc3f04,0x3cd02327,0x3cd07386,0x3cd2f94c,0x3cd5c4c6,0x3d04de72,0xbb849fc7,0xbbd39586,0xbb1d0273,0xbb5d93ee,0xbb5662ea,0xbba48f3c,0xba632867,0xba21d203,0xba1fd355,0xbaab6123, +0xbb2acb8a,0xbb99df58,0xbb8e664e,0xbb78e68d,0xbb0111a5,0xba8072a6,0xb912f00b,0x3a8eb835,0xba980d5e,0xbb0e0906,0xbb08ef6a,0xbb74a548,0xbb9a741b,0xbbae13d0,0xbba540e6,0xbba84434,0xbbd137e1,0xbb82fa06,0xbb5b8f27,0xbb8d39d6,0xbb76bbc8,0xbb924028,0xbbc3aeca,0xbbf03d12,0xbbffba69, +0xbbb687e2,0xbbf8083f,0xbc2e5b4e,0xbb0bb038,0xbb163bfc,0xbb025b7e,0xbc17ad15,0x3bb34012,0x3c0ca1dc,0x3b928eae,0x3b2ffc3d,0xbab17b15,0xbbc74fd8,0xbbd7ed1b,0xbb856f6b,0xb912089a,0x3bb2b364,0x3c0a733a,0x3bf769c9,0x3bcb6331,0x3b79ba35,0x3a6ed191,0xbb90ef24,0xbbeabf17,0xbbfe2ad4, +0xbbed8224,0xbbf57993,0xbc3c5138,0xbbcef035,0xbbc96792,0xbc2c21da,0xbc024304,0xbc1b68a9,0xbc60af44,0xbc822113,0xbc7bd02b,0xbc03327a,0xbc540535,0xbc904763,0x3b5856e2,0x39302f6c,0x3ad7b6c8,0xbc3448eb,0x3c6930d3,0x3c9e3008,0x3c48914d,0x3c30b654,0x3a9d2521,0xbc0e43d8,0xbc236835, +0xbb9ddad9,0x3be057cc,0x3c97782a,0x3cb4673d,0x3ca1e2f4,0x3c871219,0x3c42acc2,0x3c0e4149,0xbb8a72e5,0xbc136b5d,0xbc32322c,0xbc362152,0xbc481266,0xbca1a5c0,0xbbcad055,0xbb0126d6,0xbc36ae84,0xbbbc427a,0xbc2a713e,0xbcb5c1ab,0xbcd9bec6,0xbcf4336c,0xbc505804,0xbcb43f34,0xbc368992, +0x3c55cd62,0x3b99da4d,0xbb73779b,0xbcbd6f7d,0x3cbc1ec2,0x3d03330c,0x3cea796d,0x3ca2d52b,0x3b72830d,0xbb8b0faf,0xbb105682,0x3c1558a0,0x3cecde15,0x3ce4c806,0x3d0deeb6,0x3d1e8a0c,0x3d171469,0x3cdc9b14,0x3c9e84d4,0xbb650401,0xbc5929af,0xbc5bfcb3,0xbc5f4859,0xbc6bb926,0xbce7766c, +0xbc261bcb,0xbc272146,0xbcf5dc5d,0xbc9b776b,0xbcc16b91,0xbd1e23c2,0xbd253d6a,0xbd0bdb66,0xbbcf613c,0xbc90d304,0xbd8f69f9,0xbdadddab,0xbbc2ace6,0x3ceaef56,0xbb7d0449,0x3c296a60,0x3c6991e5,0x3ca66060,0xbc5b86fe,0xbc994361,0x3b63e46b,0xbbd08d94,0x3b7a1d55,0x3cc69749,0x3d1b3556, +0x3d1a3d30,0x3c813569,0x3ca09d2d,0x3c905c80,0x3c1f467a,0x3bd251bb,0x3b03ae08,0x3badb45c,0xbc25d72a,0xbcc68584,0xbd21bdae,0xbc4fe916,0x3bbc1c38,0x3cc1584a,0x3cefb64f,0x3c3b75b8,0xbcb2245a,0xbd52ce62,0xbda0f06e,0xbdc1cdc7,0xbda4efd5,0x3bfb39f2,0xbd5cac26,0xbd4b9ced,0xbcc8ec44, +0x3cde72d1,0xbc14af1a,0xbcfb96e8,0xbcf00047,0xbc9a60c8,0xbc620607,0xbc55e88b,0x3a8d4d36,0xb9c7f241,0xbae6b9dd,0xbc2aaf7d,0x3b196287,0x3d459a92,0x3ca256c7,0x3bb6614e,0xba0c8c15,0x3ba445b0,0x3b40e323,0x38be6382,0x3c66237f,0x39c98e16,0xbd15dbfe,0xbd50d6c6,0xbd3dc667,0xbc74a4be, +0x3c29f952,0x3c0db684,0xbd10eb36,0xbc975f98,0x391fe3e9,0x3ce6ddf2,0x3ca12e52,0xbe5d838e,0xbe07656d,0xbced80ba,0xbc21510e,0xbc96f593,0xbce419de,0xbc7cfad1,0x3bb8e434,0x3b535061,0x3b34147b,0xbb8cdc6d,0x39cafe5e,0xbc2d63a6,0x3b328324,0xbc104d2d,0xb7034fef,0x3d0be219,0x3ce5a51a, +0x3cd0f035,0x3c421f52,0x3c290dee,0x3c35bc88,0x3c02d6bb,0x3c339cfe,0x3a872570,0xba9a9c32,0xbd1995c7,0xbd28242b,0xbce18f74,0x3af0ad68,0x3c0f30d6,0xbd39569e,0xbd253d2d,0xbdc8eb67,0xbe21530c,0xbe61e48e,0x3e529487,0x3e3e8c13,0x3e1988a8,0x3e00792a,0x3de5d2e5,0x3da5fed0,0x3d4ae851, +0x3ca6cb70,0x3c98de85,0x3c23a496,0xbb062811,0x3a64c59f,0xb9818f53,0x3c32f8ee,0x3bfccc0e,0x3c47554a,0x3ce2d6a6,0x3c966395,0x3bf701eb,0xbc35c37d,0x39206fb7,0x3aaa87bf,0xbc0d9986,0x3c2ffbad,0xbb5c21e2,0xbca491fd,0xbda893e5,0xbdb5c874,0xbd6277f3,0xbc5bf037,0xbc5cff6b,0xbd91f209, +0xbd9ca86c,0xbcdbc868,0x3db981a9,0x3e29f1dd,0x3ca322fe,0x3c86addf,0x3cb88b4d,0x3d067568,0x3d4a2537,0x3d285176,0x3d34c96b,0x3d560a7e,0x3d30dcc3,0x3d138058,0x3cd9e0e7,0x3d1a840e,0x3ceeaaa5,0x3c30d2f4,0x3ba03659,0x3c1323e4,0x3cff39d6,0x3c7ae580,0x3bf3c962,0xbc140674,0xbc892aa9, +0xbcb0ded2,0xbd030926,0xbd31dd4c,0xbd88ea26,0xbdb28022,0xbde8aed7,0xbdd6e90a,0xbd877d12,0xbcf43d6c,0x3cd68d0b,0x3dabd9e8,0x3df63594,0x3e0011af,0x3de29c4d,0x3d485156,0x3d160fab,0x3d2ba256,0x3d51df7c,0x3d4ea442,0x3d2b4fdf,0x3d00d970,0x3cbb2ef4,0x3caac52c,0x3c5b3e05,0x3c2709a3, +0x3bb9a9e7,0x3c478059,0x3cb9c433,0x3cf4ec31,0x3d04bf7a,0x3cecd4bf,0x3cffc9e1,0x3c8d3fa1,0x3c8907a4,0x3c40c01d,0x3bb2bc97,0xba104612,0xbc2ce532,0x3aa7d04d,0x3c2f3192,0x3c35bca5,0x3d480bb7,0x3d995d65,0x3dc2ec54,0x3dc6480d,0x3db00576,0x3d866568,0x3cf5d1cb,0x3c450e52,0x3c6a616b, +0x3cdc37d3,0x3c4c70d8,0x3c916131,0x3ca9793d,0x3ce42d0a,0x3d115739,0x3d137731,0x3d17513d,0x3d1bcf21,0x3d19be69,0x3d185cf1,0x3d0e3260,0x3d013a42,0x3cb6c53c,0x3c921ff4,0x3cbacc80,0x3d0320a4,0x3d242002,0x3d1b32da,0x3d06ed6b,0x3d07498b,0x3d1b36c7,0x3d26f9fb,0x3d2e9cf4,0x3d1e4293, +0x3d10673a,0x3cf49e76,0x3cf29656,0x3cdbd864,0x3ce2462f,0x3c86f783,0x3c088b7a,0x3b27a08c,0x3bd943f9,0x3bf635b6,0x3b063458,0x3bd5385d,0x3ca3e4d8,0x3c8d5938,0x3c9917cb,0x3c7b5d98,0x3c76a365,0x3c70e491,0x3c5d40bb,0x3c464f52,0x3c402f73,0x3c47eeb6,0x3c502179,0x3c667263,0x3c84f9bb, +0x3c8e4b97,0x3c9a8537,0x3ca3ce75,0x3c98d7e9,0x3caac06c,0x3ca8c514,0x3d011b29,0x3ce61225,0x3cb9d0f4,0x3ca789d6,0x3c8f066d,0x3c817769,0x3c6a3722,0x3c9364f2,0x3cac59a7,0x3cc74311,0x3cdd59d4,0x3cf2ff4c,0x3cf336b6,0x3cda2b51,0x3cc72404,0x3cc10947,0x3cb7b50d,0x3c821461,0x3c69e049, +0x3ca244b3,0x3cb4ff95,0x3cd3bd08,0x3c957522,0x3cb90296,0x3cd38222,0x3cd4d436,0x3cd4b0ea,0x3cd58844,0x3cd3032b,0x3cd2832c,0x3cd33106,0x3cbb7967,0x3cac2a54,0x3cdb73eb,0x3cd373a0,0x3cca9b69,0x3cd12a74,0x3cb7026c,0x3cb1d9c7,0x3ca36106,0x3c98b16f,0x3c8c071d,0x3c6cd474,0x3c7d6afd, +0x3c8000c8,0x3c805b9f,0x3c86a367,0x3c8d64e1,0x3c9e16cc,0x3c98cbc0,0x3c95ec1f,0x3c904e59,0x3c86d31e,0x3c964f13,0x3be15bcb,0x3bb17c71,0x3bb9b646,0x3bb14504,0x3b9494b2,0xb9b4e5d2,0x3c01871d,0x3bf10123,0x3b66e162,0x3b9a17f1,0x3b672f39,0x39aa7b4a,0x3a5806ad,0x3a9ec096,0x3afb12e9, +0x3bd56205,0x3c0f66af,0x3bc0ecdb,0x3bc9c9f3,0x3bbba0ef,0x3ba23a17,0x3bb8bd89,0x3bb0da34,0x3b830afb,0x3bacc068,0x3bc23bcf,0x3bbc2b29,0x3c0dae77,0x3c0936e1,0x3bab0b3e,0x3b742cab,0x3b5cee29,0x3bd288c7,0x3b919b0f,0x3b98d8ec,0x3bc631bd,0x3bb93b8d,0x3be6269b,0x3c0e893a,0x3c124ea6, +0x3c2325a2,0xba38bbad,0x3c3bb218,0x3c69a82d,0x3c0bbafb,0x3c4221a0,0x3c0bf700,0xb8e6c38d,0x3a8d34f1,0x3b2981ee,0x3b98274c,0x3c4bfcfb,0x3c7b2fae,0x3c750412,0x3c26f4ce,0x3bc8d19c,0x3b3df716,0x3b88987e,0x3b6f2706,0x3a03c56d,0x3b510b97,0x3bb19f75,0x3bb52fec,0x3c6daef7,0x3c5b4890, +0x3bb14e7d,0x3adca701,0x3b0683fa,0x3c4f6789,0x3c05fd99,0x3c0d631f,0x3c1f4478,0x3bddbadb,0x3b5d490d,0x3ad8d651,0x3bdb20fa,0x3c039346,0xbc421661,0x3c9cd990,0x3cb27d58,0x3c07de7c,0x3c84a9a2,0x3c18c47c,0xbc1a5862,0xbbbd1541,0xbb3f0487,0x3aebf3b5,0x3ca629b1,0x3cd16b5a,0x3cc15f6d, +0x3c6c7210,0x3c19a4cc,0x3a406442,0x3b38f815,0x3aa3c69c,0xbbcec5b8,0x3893bf6d,0x3b896d2d,0x3b3c8bf9,0x3cb26a49,0x3ca03abd,0x3a8c400a,0xbbf61eb0,0xbc3073b2,0x3c229a19,0x3a5518f0,0x3b43a4eb,0x3bcc2e00,0x3b8d5784,0x3be078cf,0x3c6b9c12,0x3ce62def,0x3c9f872d,0xbc96cb27,0x3cbccd1d, +0x3d132fad,0x3cb47766,0x3cf09a8a,0x3c2b7ac0,0xbc54ad47,0xbc2efb32,0x3b163eb5,0x3c7a1d80,0x3d172ac5,0x3d2a36dc,0x3d065c6f,0x3cc49f2a,0x3c5dac05,0xbb26c8e7,0xbaea033e,0xbb2a64a9,0xbc689ed5,0xbb782039,0x3b15273b,0x3a8e3d01,0x3d01c386,0x3ccd23f3,0xbb08d217,0xbc309b75,0xbbc760d3, +0x3cf0b905,0x3ca76645,0x3caf02ae,0x3c953035,0x3be51abe,0xbcafda78,0xbd6678ae,0xbd9f5200,0xbd28afa2,0x3c9dbf64,0x3cbfb8bf,0x3c910a33,0x397e4f5b,0xbc6642cc,0xbca8493d,0xbc1c7247,0xbc03a7fa,0x3b118ea0,0x3c531b58,0x3d0341ae,0x3d16c9c1,0x3cc9d264,0x3cc8f71c,0x3cad4f03,0x3cb70a5c, +0x3b2fcc08,0xbbe0e2cb,0xbc24d52b,0xbc5a7420,0xbc2ef406,0xba44ecab,0x3c6d64dd,0x3cccac22,0x3d377194,0xbc5c64a8,0xbd34237d,0xbd079a2f,0xbd739518,0xbd532615,0xbcbdae5b,0xbc5e59b5,0xbca9a2e4,0xbbaf1c7d,0x3c3bfd14,0x3b803bf5,0xbcdbc01c,0xbd0b2274,0xbd01a699,0xbc9ae15c,0xbc8ad740, +0xbc5c4fbd,0xbc87923d,0x3b380c57,0x3b83038c,0xbaa9bf8e,0xbb959df2,0xb987b11e,0x3c855c13,0x3cd8288d,0x3cddf686,0x3c0e37de,0xbbd315ce,0xbc800075,0xbcbf24bd,0xbce1bb74,0xbd0d4622,0xbd15c0af,0xbcddfb9c,0xbc817d16,0x3c83446b,0x3c5227d2,0x3ca67fdc,0x3c9e66b7,0x3d085bf9,0x3cbae156, +0xbaddccaa,0xbcdb004e,0xbda9f560,0xbe093198,0xbde58c72,0xbd9a385d,0xbd4097d9,0xbcb28c6e,0xbbee77d8,0xbc0fc41c,0xbb65fd0b,0x3b772b3e,0xbbbd7ce4,0xba8c502a,0xbb456bfe,0xbbac6fa3,0x3ae871cb,0xbc093c89,0xbc86ea04,0x3c8d24da,0x3cc08cfa,0xbaf16f8e,0xbc369076,0xbca58472,0xbcc0b120, +0xbce3283d,0xbd1e8c38,0xbd694dde,0xbd25638f,0xbcf74416,0xbc4808a9,0xbd080775,0xbd5ac4b7,0xbd874490,0xbd8e2616,0xbd229a32,0xbc1f2971,0xbd4bab57,0x3d3e2702,0x3ddf6e27,0x3e1cf025,0x3e03dbe2,0x3dd52e0e,0x3d7c2229,0x3d010bb1,0x3b404320,0x3c2003c3,0x3ae4782a,0xbb6e3a87,0x3ad0ba50, +0xb77fe252,0xbc096741,0xbb630c1b,0x3a7a34d8,0xbbc2a077,0x3ceafbca,0x3cf96fa0,0xbc1463b7,0x3aac2e80,0xbb61452d,0xbbb322e5,0xbccbdc94,0xbd1c5b13,0xbd8276a3,0xbd28af32,0xbd1da82a,0xbd3dd32b,0xbd65cca6,0xbd620d42,0xbd406ec9,0xbdb78938,0xbdd290a3,0xbd9e4ab7,0xbca42366,0x3e0b0d14, +0x3dcc3658,0x3d99d1a0,0x3d8ae7a3,0x3d69d6ec,0x3d544eee,0x3d3fde3a,0x3d2789da,0x3d133490,0x3ccee026,0x3c10cedc,0x3b9c292b,0x3c13fb89,0x3cdce4fa,0x3c18caba,0x3b5087ca,0x3a60ad62,0x3ac81a7a,0xbbdda6c5,0xbd07b9a9,0xbd4430e4,0xbd7319b1,0xbd722896,0xbd6e53e6,0xbd479efe,0xbd5d31b3, +0xbca9ea83,0xbce69617,0xbd94b0ce,0xbd9df45b,0xbda0cb3a,0xbd83bcc1,0x3c950a74,0x3db31aa3,0x3e09a322,0x3e138a21,0x3d025b26,0x3cfaf4fa,0x3cfb267c,0x3cfe492b,0x3ccb1c74,0x3cd2ed3c,0x3ce3b160,0x3ce69b23,0x3d05fd1c,0x3d08a737,0x3cffb1d3,0x3cc23925,0x3c929999,0x3c7932ef,0x3cb5eba0, +0x3ce189ba,0x3cde9276,0x3ca18a4b,0x3bdf7dd2,0xbc03e34b,0xbc84c9a4,0xbcbabdae,0xbcd6de4a,0xbd2aa7fd,0xbd3a45db,0xbd12a77b,0xbcae8f14,0xbb8d1f00,0x3c5cf7b5,0x3d4b7278,0x3d9a8bf0,0x3dab895d,0x3db11fe6,0x3d934af6,0x3d48337f,0x3d19c221,0x3d1806cf,0x3d21bf96,0x3d191825,0x3d1e21c9, +0x3d2c3172,0x3d15a320,0x3cf4e06c,0x3cc77f55,0x3cda1fd8,0x3cdf0a7d,0x3d002e02,0x3cf8ba6c,0x3d023113,0x3ce96df6,0x3cef531a,0x3cd8a1f2,0x3cd6c594,0x3cef3de5,0x3d09325c,0x3d1dd444,0x3d29cb50,0x3d31efaf,0x3d3f8cfa,0x3d572e77,0x3d6e2eb2,0x3d8158bd,0x3d8482a0,0x3d88f21e,0x3d8bf277, +0x3d5954bf,0x3d266bf0,0x3d0898ca,0x3cf5dc82,0x3cefe2d4,0x3cdd0210,0x3d0985bc,0x3c650476,0x3c679b0f,0x3c3f2315,0x3c689bba,0x3c5333b8,0x3c4739fa,0x3c64f935,0x3c64481c,0x3c83d40d,0x3c885af2,0x3c8f0065,0x3c962ec5,0x3ca4ff76,0x3cb51351,0x3cd9755f,0x3cff38b7,0x3d14522d,0x3d25ce9c, +0x3d372039,0x3d3a3323,0x3d2e4d0b,0x3d2b3e29,0x3d212a6e,0x3d19c2d9,0x3d0eb3ad,0x3d044e75,0x3cec6953,0x3cd085ee,0x3cc5d9a0,0x3cbc2e48,0x3cb82e5c,0x3c9d016e,0x3c966970,0x3c88c368,0x3c7c2b64,0x3c69cf59,0x3c54fd0e,0x3c5524dc,0x3c12d077,0x3bef2f76,0x3bbc2edd,0x3c333854,0x3c094ab2, +0x3be72042,0x3beba4ad,0x3bf7e613,0x3c00a246,0x3c093474,0x3c09a1f4,0x3c02bfec,0x3c462575,0x3c79fc63,0x3c587e3f,0x3c7f8897,0x3c93a8f1,0x3caa070e,0x3ca7e625,0x3ca874fd,0x3caa3248,0x3caa0f4b,0x3cabf9ad,0x3cb1d045,0x3ca51fc3,0x3c98b051,0x3c8638c6,0x3c757bc5,0x3c5d6edd,0x3c486a79, +0x3c576a6e,0x3c5f436d,0x3c6596e2,0x3c6026c8,0x3c586404,0x3b869b97,0x3b397a71,0x38fc67f7,0x3b4fd6e0,0x3b840728,0x3b199e14,0x3baa07b6,0x3bb6de9e,0x3b91fee0,0x3bc6fc48,0x3bb9a339,0x3b85f4fc,0x3b71e05d,0x3b6f9134,0x3b664f18,0x3b9f3d56,0x3bbf075d,0x3c1afc43,0x3bdbb26b,0x3bb9e0dc, +0x3b9349b3,0x3b860d4c,0x3b74c724,0x3b534577,0x3b3bbe81,0x3b6029a6,0x3bcfbbca,0x3b96e6e6,0x3b4b3f9c,0xbaed38a2,0x3a2ffe5f,0x3abc63d0,0x3b5f4695,0x3b661348,0x3b86ed95,0x3baa9c67,0x3b6928ee,0x3ab40a8c,0xba9e948c,0x3c0c384d,0x3bf0f50e,0x3aad6994,0x3be21cc7,0x3bff8a7e,0x3ba9244d, +0x3c026d7b,0x3be6ed34,0x3b559911,0x3a9740c1,0x3a9d10db,0x3b2f9996,0x3c00d737,0x3c309a1e,0x3c7b9d4c,0x3c357ee5,0x3bf12602,0x3bb120b6,0x3ba0d742,0x3b502684,0x3b28a935,0x3a58f6a1,0x3b3d0e43,0x3c27dc50,0x3ba5c75d,0xba2494cd,0xbc38290f,0xbbca5c54,0xbb117e81,0x3b9ec613,0x3bafcc5e, +0x3bc7c48f,0x3be316ca,0x3b637e92,0xba9aadaf,0xbc2048a9,0x3af0cd94,0x3b71e164,0xbbebe001,0x3c5f5ad5,0x3c5e072c,0x3b336499,0x3c36d87a,0x3c1ac555,0xb9f2d3a8,0xbac9bf74,0xbb28f7a2,0x3a27ae39,0x3c30d3af,0x3c9b10f6,0x3ce59a2b,0x3c9b16c0,0x3c33f87b,0x3bb6b8ff,0x3bd82f73,0x3b408b38, +0x3a9ac3f8,0xbb01c43d,0x3b026bc1,0x3c89fe24,0x3c0505f7,0xba14676b,0xbcd4543d,0xbc720e43,0xbc21b249,0x3b0858cc,0x3bdd7f61,0x3c0631d4,0x3c425b71,0x3b8827e2,0xbb2170b4,0xbbf82f22,0x3cbd85ef,0x3c98030f,0xbc5c3e1e,0x3c3e83ec,0x3cc5b7f2,0x3c3d83f3,0x3cce8dfc,0x3c769e82,0xbc1ec5b1, +0xbc4348b5,0xbb7e0574,0x3bc8e515,0x3cd45ae3,0x3d054c13,0x3d1b124a,0x3cbae42d,0x3c295f57,0x3b70d55e,0x3ba19617,0xba3a4752,0xbb188e0f,0xbbcc9b42,0x3ae8277d,0x3cc4542e,0x3bf19f16,0xbc860677,0xbd431f1d,0xbcdea310,0xbc167e3e,0x3c36ca98,0x3c6a342d,0x3c90796e,0x3c80993a,0x3bf1532c, +0xbb8f7431,0xbcb8f8be,0xbdad5b69,0xbd6f3ff9,0x3d2d88e1,0x3caa627c,0x3c26aad3,0x3af9ac91,0xbc38fdcc,0xbc8b6e1c,0xbc4b47a9,0xba868a4d,0x3bb4634d,0x3b3a2122,0x3c7103df,0x3cd809ac,0x3d3ea30c,0x3cd033e5,0x3c86831b,0x3c8046e3,0x3c8a0c50,0x3c67b0c5,0x3c08a06f,0xbbe02b10,0xbbb89f9b, +0x3c735b9c,0x3ca6ce7a,0x3cc12018,0x3d05a638,0xbd4a6af0,0xbd8bafb7,0xbcf0b889,0xbcde2198,0xbca4cadd,0xbca10c0b,0x3ac902e3,0xbc879fb0,0xbbee1ae8,0x3d08d8e7,0x3c9356db,0xbd285b9f,0xbd4db3ed,0xbd30e473,0xbcb5da05,0xbc93314f,0xbc24110a,0xbc4eee82,0xbb0ffed6,0x3a6bbc54,0xbb30430a, +0xba1be491,0xbbbb977c,0xbc77390c,0x3c4ed1ca,0x3c8fd53e,0x3b3b69c4,0xbb366f96,0xbc669c09,0xbc9c5bce,0xbc56bb33,0xbc2a332c,0xbc7c3717,0xbaeb832c,0xbb58d0f5,0xbbc57abd,0xbbdaaab4,0xbc33dbac,0xbcee9472,0xb9e0522b,0xbb7027e8,0xbd10545b,0xbcbde19c,0x3d27ed6c,0xbcae5cc0,0xbd636637, +0xbd4de776,0xbd19d125,0xbc8b9e00,0x3a86d51e,0xbc07172e,0xbbf7cd8c,0x3adf5bb5,0x3b05c92c,0x3a9ae42c,0x3aeca114,0x3b09ac0a,0x3c3c55c2,0xbb124fbd,0xbcb1d89a,0x3c637d92,0x3c8510e2,0xbbfc036d,0xbc6a1442,0xbcce5628,0xbcef41fd,0xbd1d98b2,0xbd0d5c9e,0xbcc0d53a,0xbc28e3ea,0xbc805f8a, +0xbd2fb873,0xbd3c4679,0xbd420e1d,0xbd852011,0xbc9f3f11,0x3a95683c,0x3bce94a4,0x3d4f1b6e,0xbe1cf920,0xbd485588,0x3cd9c25e,0x3d188107,0x3d11610e,0xbb401330,0xbc99b250,0xbcc1e7b5,0xbc05ca76,0xbc25ac89,0xbc5d9f49,0xbb8e31ba,0xbb50891e,0xbc6cf3cd,0xbc3d7b85,0xbc3f3188,0xbc8e34e1, +0x3c34893e,0x3c5d6ff5,0x3a5a1073,0xbc64eebd,0xbcc8b39a,0xbc954431,0xbc9662bf,0xbc82f4ed,0xbc952ddc,0xbc90cc51,0xbc909ff7,0xbc8996c0,0xbc7de9d5,0xbcb27d18,0xbd5d99c9,0xbcbdc77b,0xbd6665bc,0xbe13d073,0xbe2a8d80,0x3e0f3b9f,0x3e2075f5,0x3e035ec9,0x3dd6cc36,0x3da5862d,0x3dac796e, +0x3d9be87e,0x3d507017,0x3d05143e,0x3c8d72ee,0x3b8786fb,0x3a6ab117,0x3b7b2d59,0x3c368359,0x3c0ae627,0x3b7c840f,0xbc36bb4b,0xbbcf80a4,0xbc4bb724,0xbc91e0ad,0xbc7d86e7,0xbc989a7f,0xbc986f04,0xbc7f1b7c,0xbc1d41dc,0x39a74fc6,0xbc99dc00,0xbce28047,0xbcbd186e,0xbd27a379,0xbd79878a, +0xbdbe9789,0xbdad3508,0xbd15ae50,0x3d2c5c31,0x3dcd902a,0x3d8e7c69,0x3d535550,0x3d464387,0x3d49adac,0x3d2925ad,0x3d3603ed,0x3d3080fb,0x3d108e85,0x3d27075f,0x3d264ec0,0x3d1c25da,0x3d199891,0x3ce4e654,0x3c2043af,0xba8a3c76,0xbb42779d,0x3b30e334,0x3c55688b,0x3c317e5d,0xbb866235, +0xbc7de083,0xbcd7cb87,0xbd129654,0xbd4652fc,0xbd7b5aa1,0xbd962b79,0xbdb1bffc,0xbda7eb87,0xbd5d5d5e,0xbd0e14aa,0x3b8e1ab2,0x3d63baa5,0x3dd215af,0x3df2eb14,0x3dda54a8,0x3db113e5,0x3d7eb65c,0x3d53ae01,0x3d32919c,0x3d20636e,0x3d08ee75,0x3ce77df9,0x3cb7b1b2,0x3c8710ad,0x3c879b79, +0x3c9516df,0x3c94d5e7,0x3ca51b87,0x3cac6b32,0x3cc7e15b,0x3cd5bf7c,0x3cd79567,0x3cd22c7f,0x3cc2b231,0x3ce5b76f,0x3cc2f45f,0x3ca65d7d,0x3cad9bbb,0x3c9e97d0,0x3ce3da23,0x3d118e81,0x3d2f8723,0x3d67de03,0x3d8b83bc,0x3da04c9f,0x3da8b213,0x3db25270,0x3dbd4ccb,0x3da2e3f5,0x3d96c520, +0x3d943840,0x3d8a5ca3,0x3d3dc28f,0x3d391ce9,0x3d035794,0x3d2c20b8,0x3d17d96a,0x3d1938a7,0x3d24b92c,0x3d1f5728,0x3d285e2d,0x3d1c8ecc,0x3d14bb58,0x3d137ce7,0x3d0dbab0,0x3d05c68d,0x3cf25819,0x3ce08606,0x3ce21647,0x3cd22091,0x3cbe907f,0x3c9767de,0x3cbf9529,0x3ce95bab,0x3d03d880, +0x3d16522c,0x3d25b99b,0x3d36189f,0x3d366e51,0x3d38bc7b,0x3d3dfb01,0x3d4a771d,0x3d56aa6c,0x3d6cacf0,0x3d672f29,0x3d606c91,0x3d537fa7,0x3d441046,0x3d35d36d,0x3d3b52d3,0x3d1e12a6,0x3d0e9c12,0x3ce74120,0x3d27a73d,0x3d0f8270,0x3ce9e393,0x3ce43866,0x3ce707f7,0x3cea0c6a,0x3ce7fd36, +0x3ce94a50,0x3ceb89e2,0x3d066fa2,0x3d11264b,0x3cdf891c,0x3cfa5cc1,0x3d02afd1,0x3d0a2181,0x3d16cc4d,0x3d1daec3,0x3d27df3c,0x3d2e8c5b,0x3d35c000,0x3d3f910e,0x3d3f33ca,0x3d41de39,0x3d43d547,0x3d44e2ea,0x3d4490eb,0x3d457e7d,0x3d3f524c,0x3d3cc90d,0x3d3ad8a3,0x3d3af8e4,0x3d428c64, +0x3bc9f4c9,0x3b528105,0x3b13c070,0x3b6a83a4,0x3b93b5f1,0x3ba74b7f,0x3bbfce3b,0x3b967c46,0x3b799f08,0x3b8a0afd,0x3b96f36e,0x3bc20ecf,0x3b7b9c79,0x3b676201,0x3b6244cc,0x3baaf3fe,0x3bd7aa3e,0x3bf8c0f1,0x3c003705,0x3c046e9b,0x3bfb8005,0x3bf09afd,0x3be4b7d0,0x3bd293b6,0x3bbd22e8, +0x3bba557a,0x3c02646a,0x3b737ae0,0x3b202b0d,0x3b0338dd,0x3b548396,0x3b8ea70d,0x3bb49915,0x3be360a3,0x3bdc34ca,0x3b82f9bc,0x3b83f164,0x3a3883e3,0xb710387f,0x3b2076b3,0x3be84f85,0x3c29773e,0x3baf27fe,0x3b884e36,0x3bc3bc1d,0x3bde0a79,0x3bf3b3c5,0x3c1863bf,0x3ba001b0,0x3b812b4f, +0x3b93bab2,0x3bf87ca8,0x3c2a0c6d,0x3c65bd6a,0x3c6b1d11,0x3c583edd,0x3c3c2d6a,0x3c404e4b,0x3c2514e4,0x3c05369d,0x3bc9fc37,0x3bace16f,0x3c21b864,0xbb0634a8,0xbbbb9741,0xbb8bf7fc,0xbb10f983,0x3aec4ef2,0x3b96e92c,0x3c13d84d,0x3c057e17,0x39f4147f,0x3a9ff9eb,0xbbfc5db9,0xbc5004ce, +0xbb415fdc,0x3bb4a069,0x3c4c66d8,0x3becdfa2,0x3b910882,0x3bb0b5e4,0x3bc57c57,0x3c1276d6,0x3c4766f1,0x3bab85b0,0x3a964785,0x3b63f985,0x3c1a0b8e,0x3c8432f1,0x3cc3833c,0x3cc365ca,0x3cb1c142,0x3c7fee69,0x3c8770f1,0x3c5b9195,0x3c204280,0x3bd20360,0x3bbde410,0x3c8c85ed,0xbbeca8af, +0xbc64799d,0xbc6b461b,0xbc063846,0x39038eaa,0x3ba4873f,0x3c7987f4,0x3c59ab9a,0xbb973db0,0xbba09b5a,0xbc5678b4,0xbc704549,0x3af1dc28,0x3c4e44be,0x3c748b52,0x3b80fe45,0x3bcc17ce,0x3bc6c72f,0x3c630e8c,0x3c5aa9d0,0x3b937be4,0xbbc4d21e,0xbb56d74b,0x3bb180e2,0x3c95c74b,0x3cd9cb8d, +0x3d16c5ef,0x3cf26c8d,0x3cda5b14,0x3ca5237b,0x3cbf5a06,0x3c91ec92,0x3c30639e,0x3bb264be,0x3baf2ec1,0x3c9763d2,0xbc97b8b9,0xbd10a61f,0xbcf5492f,0xbc948531,0xba03f519,0x3b354258,0x3c847eac,0x3c42fa85,0xbc741c21,0xbc4506df,0xbc4f6e1b,0xbc7165d2,0xbd4c9759,0xbd2962aa,0x3cd0372e, +0x3ccdea68,0x3cae3755,0x3b959ddc,0x3aae3eee,0xbb4e57df,0xbc0bc205,0x3b9303f1,0x3ba158fb,0xbb03451b,0x3c2f32d9,0x3cb310ca,0x3d1851e2,0x3d07d74e,0x3cdfec38,0x3c40bd8e,0x3c57a54d,0x3c2a3a46,0x3bd1acdb,0x3be0a7b3,0x3c060bb8,0x3c89ff4e,0x3b7b4c2f,0x3c121729,0x3d0cb448,0xbcd00cfc, +0xbcf0742c,0x3c116446,0x3cc42f35,0x3cf0b058,0x3c311cce,0x3a5cd73f,0x3cade501,0x3ce03e1d,0x3c747abf,0x3bd0799c,0xbca713ff,0xbcefec0c,0xbcd818ba,0xbc82e596,0xbc505fa8,0xbbc70041,0xbb8ed273,0xbb856380,0x3a897ffe,0x3bbb8541,0x3c30cc23,0x3b9aa6be,0xbaa4d2db,0x3c064aee,0x3c5228d5, +0x3cb6ba4d,0x3c61bde1,0x3b960b6c,0xba8a2080,0xbc15a311,0xbc0bb009,0xbb845155,0xbc99f0ac,0xbccaec31,0xbca1ee36,0xbcc1d86b,0xbcc0387d,0xbca37a4c,0xbd27a322,0xbd60be91,0xbd84974b,0xbc36d88f,0x3c83569a,0x3cdf50b3,0x3b5c92ee,0xbc603cff,0xbd09e84b,0xbc9e3d12,0xbc252637,0xbcb8c432, +0xbc7f3fa0,0xbb8e0b1d,0x3af5bd69,0xb9f72199,0x3a55358c,0x3b47bb83,0x3b799d94,0x39eb6dff,0xb9a35a34,0x3bfa4b7e,0x3bf78014,0x3c846cb3,0x3ad86a11,0xbb2b17ae,0x3c02bd26,0x3b9d137c,0x3b23b498,0xbb37b12d,0xbbebc572,0xbc41b87c,0xbc8e6e3b,0xbcfeb3bf,0xbcedbd88,0xbb6dd164,0x3ca29090, +0x3cf444f8,0x3cddf55d,0x3c4dc250,0xbe176c6d,0xbe042875,0xbdbae0e0,0xbd83e56d,0xbd4358b9,0xbd35db64,0xbd13b62a,0xbd10045b,0xbcb60f68,0xbc82d898,0xbc043d20,0xb8f95e44,0x3b457284,0xbaf5a974,0xba3f64cf,0xbb7e980e,0xbbcf61f2,0xbbfa0ba4,0xb990a84f,0x3cd818c7,0x3c225ef4,0x3a1f8e7e, +0xbc1bd41a,0xbc60f8a7,0xbc6a1355,0xbc4af0cd,0xbc22fcbe,0xbc1794ad,0xbb875edb,0xbca29c21,0xbcede66c,0xbc64feed,0xbd4f2645,0xbd83f8db,0xbd73a705,0xbdfe102f,0x3d5017c3,0x3dbd968f,0x3deb9e5f,0x3dd9ebdc,0x3db5fcad,0x3dc29b2c,0x3d931179,0x3ce26e90,0x3ca5cb48,0x3c13042d,0x3c27799a, +0x3a21fb11,0xbb85967d,0xbbef92ee,0x3a23b21d,0x3ade1e50,0xbbe109ef,0x3c08cf8d,0x3c061fc5,0x3bf71c98,0xbbb820d6,0xbc1f2443,0xbb3ca901,0xbc1c63d7,0xbcae8453,0xbd0ea997,0xbd00a11e,0xbd104d1f,0xbd2b8ef3,0xbd1f53d7,0xbd21560d,0xbd1916ab,0xbd944550,0xbda96e99,0xbd7b9020,0x3af9526c, +0x3d9bff73,0x3d9707ab,0x3d926afc,0x3d865f36,0x3d636611,0x3d48c242,0x3d48eff3,0x3d59fc48,0x3d49c73e,0x3d373b93,0x3d2e5dc7,0x3d06e386,0x3cdd4911,0x3cd14df4,0x3c580939,0x3bc80961,0xbb4bfb2e,0xbba89bf8,0xbc1fb72b,0xbc84c38d,0xbcec3c19,0xbd1413d8,0xbd22b2aa,0xbd3f7ced,0xbd3a4e60, +0xbd094def,0xbd2c0c6c,0xbd408c22,0xbd5dd0e1,0xbd7cb618,0xbd87a67a,0xbd7fa452,0xbc90467a,0x3ccb7c29,0x3d675d25,0x3d8cfd63,0x3d9c7a6f,0x3d899244,0x3d797290,0x3d6684d4,0x3d49d441,0x3d422a93,0x3d397a72,0x3d27cf1c,0x3d110eed,0x3d0aa7b3,0x3ce10192,0x3ceccd61,0x3cde0b1c,0x3ce31edf, +0x3cc67527,0x3ca452a9,0x3c844039,0x3c12bd8f,0x3b1a3877,0xbba87144,0xbbc93401,0xbbf3a3e9,0xbc182788,0xbbcbc2a4,0xbbc6a61b,0xbbc847f3,0xbb4a1a17,0x3a8a7a87,0x3b5694d0,0x3d048f3c,0x3d7c5196,0x3db3ff1e,0x3db89031,0x3dba7529,0x3dc9c259,0x3dae5bd3,0x3d84290c,0x3d897686,0x3d83dcd9, +0x3d828644,0x3d7ae126,0x3d74ab3f,0x3d6e5485,0x3d680514,0x3d62ad88,0x3d59a008,0x3d4e273c,0x3d45c9ab,0x3d384a69,0x3d28ed57,0x3d1d870f,0x3d129911,0x3d0be3f6,0x3d02c4e2,0x3cf9c339,0x3cd8454a,0x3cf7dc33,0x3d0a0fc5,0x3d1614b2,0x3d21597f,0x3d2f08f2,0x3d3bfec6,0x3d49df54,0x3d56b941, +0x3d5b235a,0x3d5f86b1,0x3d564e91,0x3d5f9361,0x3d6178b8,0x3d6d4058,0x3d74e428,0x3d7f04ee,0x3d676a52,0x3d6d4a9a,0x3d65fe6d,0x3d608088,0x3d571df9,0x3d5f2c6c,0x3d5692d8,0x3d4b6a62,0x3d47052e,0x3d4241b5,0x3d3fa61e,0x3d3a789f,0x3d37b8e7,0x3d35a392,0x3d3aed9b,0x3d3ab1ff,0x3d2e1e54, +0x3d301a19,0x3d2f8ab9,0x3d27e044,0x3d3008ab,0x3d3480bc,0x3d3a6cc6,0x3d3f4d9e,0x3d43d5c1,0x3d48b2da,0x3d4c2a22,0x3d510a9c,0x3d58c31c,0x3d5b4b36,0x3d609c42,0x3d6303c2,0x3d63d893,0x3d634ea8,0x3d61daad,0x3d655b06,0x3d702300,0x3c129a73,0x3bd326df,0x3bc6ecb9,0x3be2e62d,0x3c03a5e9, +0x3c433598,0x3c07e649,0x3bdeeed2,0x3c00b143,0x3bd95179,0x3bebb059,0x3c24d097,0x3bf0b7c2,0x3bd91faa,0x3bbff7a6,0x3bf95dba,0x3c0c9b99,0x3c1147a1,0x3c24e0fe,0x3c2cb0f5,0x3c2d4d76,0x3c1ef8ab,0x3c16ba1f,0x3c0dca3d,0x3c0acc7a,0x3bfe6cba,0x3be86821,0x3b95eb55,0x3b76f251,0x3b4ad97a, +0x3be0b62b,0x3c053fcd,0x3be69aa2,0x3c1b555b,0x3c1b41de,0x3be4bd5d,0x3beaeea7,0x3bdf9932,0x3bcc5c6d,0x3bee772d,0x3c49a0d9,0x3cb4d2e8,0x3c062b0a,0x3baa64d1,0x3c2e092e,0x3c03fa4e,0x3c18e2f2,0x3c749b79,0x3c0ec767,0x3be9aecd,0x3bccc926,0x3c130c3f,0x3c387a21,0x3c58a835,0x3c86a317, +0x3c821f01,0x3c6e8b04,0x3c5f3b35,0x3c464d11,0x3c2e2257,0x3c263cc2,0x3bf0fb7e,0x3b91cdcb,0xbb610059,0xbbaaead4,0xbb9d9d29,0x3ba44bfb,0x3c12d7b9,0x3ba0028b,0x3c2ee067,0x3c1c0d06,0x3b67c135,0x3bc73162,0x3b0e045b,0xba92624e,0x3b91c1aa,0x3c52717b,0x3d0e4580,0x3c014fd4,0x3b828b53, +0x3c6e5de0,0x3be03016,0x3c1a0f9f,0x3cb61af0,0x3c1d4b5e,0x3b9a00f4,0x3bad0e36,0x3c263f14,0x3c7a874f,0x3ca124cd,0x3ccfe144,0x3ccf14a2,0x3cac219f,0x3c979b1e,0x3c73e41b,0x3c47aa21,0x3c2f178f,0x3bcd0df4,0x3b16af98,0xbc5c70ca,0xbc9146aa,0xbc9a0c4d,0x3b3c74a0,0x3c3fad65,0x3adf09fb, +0x3c83fea1,0x3c717507,0x3b0cf5b2,0x3b90502e,0x3bf4db24,0x3b7e119a,0x3c2d7340,0x3cb7282f,0x3d4ea8c5,0x3bdd797b,0xbb4485b9,0x3c5de50b,0x3c0eca77,0x3c57b7b8,0x3cc091d2,0x3b6ca029,0xbb059523,0x3bb161e1,0x3c6c9cfb,0x3cbd6536,0x3cfbc385,0x3d0d2135,0x3d0677fc,0x3cd6f187,0x3ccb6d52, +0x3c9e7503,0x3c85afa6,0x3c5b79ea,0x3ba52bcc,0xbb9858a7,0xbcfb51d1,0xbd1afa4b,0xbd0df057,0x3a43542c,0x3c55fa0d,0xbb9cf804,0x3c4a4877,0x3c12fb6b,0xbc281bb6,0x3a861a48,0xbb965f37,0xbc9247e8,0xbcd7d3ae,0xbca5c6db,0xbb469a24,0x3c9c92b9,0x3cf30838,0x3cbdb266,0x3c12b9f7,0x36d27571, +0xbb65bfc2,0x3be0388c,0x3c0c8d5b,0x3b8a05c9,0x3c6f517e,0x3caebe1b,0x3ce38f3c,0x3d2b4020,0x3d240d2a,0x3cbbaad8,0x3caec579,0x3c4d70b7,0x3b9bf938,0x39d27144,0x3b21ae53,0x3c208744,0x3b8ae161,0x3ada9b99,0xbbb3cc4a,0xbc0aa81e,0x3a82b052,0x3ced7712,0x3cde887d,0x3d058867,0x3d17c44c, +0x3c89bdd9,0x3cb1ae2e,0x3da3af6a,0x3bae694a,0xbc8564aa,0xbc06e1b2,0xbc30dcb1,0xbc4d5447,0xbc578bfc,0xbb92c242,0x39d677d7,0xbad372c8,0xbba8f72d,0xbb0023c8,0x3b9dc774,0x3c2bb132,0x3c198f2d,0x3c33cdcc,0x3b6ce084,0x3b99c705,0x3ca874e3,0x3c37bf06,0x3bcc5b2c,0x3ad1d019,0xbbed5c90, +0xbc398ef0,0xbc331d42,0xbc2d0bda,0xbad99291,0x3c50475d,0x3c0f060d,0x3a96caad,0x3c0944e5,0xbd79e968,0xbd975e0b,0xbd03ac72,0xbca20346,0xbc102574,0xba2c54a3,0x3c3374bf,0x3a2de65e,0xbd1e79fc,0xbccc6d12,0xbc706cb6,0xbc82f254,0xbc6feea9,0xbc07baf2,0x3a2c0931,0x3a607623,0x3bbadc90, +0x3ba4aec6,0x3bdeb786,0x3c3a29d4,0x3c844c12,0x3bd65f7d,0x3c42d2cd,0x3d2fc5c6,0x3c9d9c06,0x3c38c8ea,0x3c05b358,0x3b372319,0x3ace4150,0x3b67c8ab,0xbc2e7fd6,0xbc8a8ee7,0xbc3e1cba,0xbb602eec,0x3bbcd143,0x3c40fc3d,0x3d1ca669,0x3d064fe6,0xbb2161f4,0xbb23dece,0x3b7c30a7,0xbd669411, +0xbdc7c806,0xbdb73795,0xbd8f69de,0xbd153d94,0xbc7ff759,0xbc80a1e9,0xbc65da64,0xbbecb6a1,0x39d72947,0xba409e31,0x3a04d4b9,0x3b87dfaf,0x3b8ac2ff,0xba23e4e9,0xbb08aee5,0xbb9d8f01,0x3ae7e0bc,0x3cb63314,0x3c241418,0x3b535d34,0xbc098d60,0xbc69bb77,0xbcbce9e5,0xbc9bbc53,0xbcb43b28, +0xbc780a6c,0xbad2956d,0x3950a4b1,0xbc20ccaf,0xbd18ad55,0xbd117b55,0xbd1b29c7,0xbd3a221a,0x3ba0f2fb,0xbde23bc7,0xbd7fb8ec,0x3b358153,0x3cd43ef9,0x3d0d644d,0x3cde0154,0x3be7034d,0xbc3d33db,0xbc002518,0xbc0718dc,0xbad07887,0x3ba857ff,0x3b6d6e30,0xbba1c87c,0x3b4603b9,0x3be2f73b, +0x3c2fdf78,0xbb201672,0xbb660e99,0x3c4e83ba,0x3bb0d2f5,0xbb2ff775,0xbc82e0ac,0xbca0cd41,0xbc98fff0,0xbc1088ff,0xbc906110,0xbc84bded,0xbbce0b33,0xbc8a4a46,0xbc966a20,0xbca48ff2,0xbc5769df,0xbd1143c3,0xbda9b923,0xbdd68e9f,0x3da1e6c6,0x3dc889c2,0x3dcbabc1,0x3db5eec8,0x3da882b3, +0x3d8333aa,0x3d79e075,0x3d934179,0x3d7a432e,0x3d4e04e3,0x3d0a3b47,0x3cf4ad17,0x3ceb77d9,0x3ce54282,0x3c98736a,0x3ba92d9f,0xbc0fc99f,0xbc6cfd3d,0xbc8ae243,0xbc2ed733,0xbc93daaa,0xbca45f79,0xbc82c8c7,0xbca7206b,0xbc9f015a,0xbc965146,0xbca39b67,0xbcc331d0,0xbd126afe,0xbd26346c, +0xbd594d24,0xbd8fed23,0xbd994d01,0xbd5c873b,0xbb200469,0x3d316ea4,0x3d362840,0x3d5b4149,0x3d5f1330,0x3d675503,0x3d691f4b,0x3d6c28cf,0x3d6c663b,0x3d69ea66,0x3d5097df,0x3d3c22c6,0x3d2a7d46,0x3d0551c8,0x3ccbcfdc,0x3c813bc8,0x3c70607d,0x3c56b34c,0x3c3414d5,0x3c09a83e,0x3b83220a, +0xbb5842b3,0xbc3c2218,0xbc908da0,0xbcccf7f7,0xbcfaaea3,0xbd128e9a,0xbd2a20d4,0xbd37290e,0xbd473c94,0xbd5eddcb,0xbd1da535,0xbcccded5,0xbc416ef6,0x3c240fca,0x3cdd2949,0x3d2824da,0x3d282342,0x3d305402,0x3d3a550a,0x3d61c04f,0x3d43d299,0x3d523eda,0x3d545dda,0x3d4feae5,0x3d53780d, +0x3d3dbb28,0x3d2f707e,0x3d26d6a7,0x3d128699,0x3d05280a,0x3cee4fb4,0x3cd88bf8,0x3c9e4d2b,0x3c615e3e,0x3c0d4e0d,0x3c20e47d,0xbae8b8da,0x3a3a5105,0x3b46945c,0x3b9a7dd4,0x3bdcdcc8,0x3c030f50,0x3c117d29,0x3c52e73b,0x3c927fd6,0x3cb5e561,0x3ccf8808,0x3ce1c078,0x3cf19af2,0x3cf97bf4, +0x3d02ce5a,0x3d11b974,0x3d23f492,0x3d21c1ca,0x3d1e1ed1,0x3d3d7f87,0x3d4c12f5,0x3d5f739f,0x3d36ca2b,0x3d4c71fe,0x3d5ef7b3,0x3d59496d,0x3d54faee,0x3d4e5ddc,0x3d4c5e03,0x3d496fba,0x3d455d89,0x3d25f7f0,0x3d0f7694,0x3d34cdd5,0x3d174143,0x3d053a6b,0x3cc702e2,0x3cdc77fc,0x3cd81f29, +0x3cd99d27,0x3cd91f93,0x3cdb4f2c,0x3cda8345,0x3cecf022,0x3cf8e5e9,0x3d03ce36,0x3d08548c,0x3d0eef50,0x3d178b6a,0x3d196d20,0x3d1bc611,0x3d1b8589,0x3d1d468b,0x3d393432,0x3c376383,0x3c1e3486,0x3c235c2b,0x3c27e723,0x3c325055,0x3c72ad57,0x3c2154e3,0x3c163edb,0x3c2cbf96,0x3c19b951, +0x3c1d5352,0x3c3d85bb,0x3c20ff26,0x3c183bee,0x3c10c30b,0x3c1d6be8,0x3c2543c4,0x3c270e83,0x3c3f2f85,0x3c49fd65,0x3c55cbd4,0x3c409182,0x3c367501,0x3c2c7ce1,0x3c2891f5,0x3c16da08,0x3bdcbe60,0x3bd4bacb,0x3bd2fafe,0x3bcb8508,0x3c1fbf81,0x3c2fc484,0x3c11ae6b,0x3c3ac740,0x3c3b5a93, +0x3c1656be,0x3c240c89,0x3c2e5966,0x3c558518,0x3c6641fc,0x3c902433,0x3ccbf161,0x3c319190,0x3bf1436f,0x3c4789bc,0x3c2e43ad,0x3c468bdc,0x3c74ee9b,0x3c41118f,0x3c2c4c6f,0x3c179613,0x3c2ce7ba,0x3c3ef0de,0x3c562593,0x3c8b6f31,0x3c94da63,0x3c9d7bb6,0x3c83d2e4,0x3c69ad54,0x3c4bc2d4, +0x3c3e8cb9,0x3bfc7b13,0x39b0ef3f,0xbad6c71b,0xbaa30fb8,0xb9ea9e38,0x3c205ebe,0x3c4fd0eb,0x3bda80c9,0x3c51e90e,0x3c3d87f8,0x3bcb97f1,0x3c090c57,0x3c2699a1,0x3c1f1626,0x3c6100b6,0x3c92973d,0x3d138afa,0x3c1bf360,0x3bc136af,0x3c82b718,0x3c2587e7,0x3c367196,0x3ca066f8,0x3c398a3d, +0x3c0cbc22,0x3bfa7d40,0x3c35e2eb,0x3c63e290,0x3c70e14a,0x3cbee23c,0x3cd1d4a6,0x3cd85600,0x3ca8b267,0x3c88cff6,0x3c586c56,0x3c442884,0x3b95394e,0xbc07f8ef,0xbc40b53f,0xbc3b48f0,0xbc0dab8e,0x3c178a80,0x3c7e14cc,0x3b848a43,0x3c860c09,0x3c8bafbb,0x3bdf2d5a,0x3c3e0bfb,0x3c639e26, +0x3c945258,0x3ccbe094,0x3d176755,0x3d72d175,0x3c4724f1,0xbb49ee54,0x3c877b50,0x3c21a3d3,0x3c66e91a,0x3cf24ac2,0x3c0e0ab7,0x3ac6e4c4,0x3c17df82,0x3c85cb61,0x3ca1ef7e,0x3cb7d443,0x3d0a2b7c,0x3d15de70,0x3d144e16,0x3ce641ae,0x3cb66eb0,0x3c8f86e8,0x3c5cedaf,0xb8a1889b,0xbcbf2197, +0xbd039a42,0xbce82f5e,0xbcb07c3c,0x3c0f6a9c,0x3c840cfd,0xbb0a4a67,0x3c81cc50,0x3c174dea,0xbbbf0e7d,0x3b472b16,0x3bfcd15e,0xba594df1,0xbcb18d6f,0xbcf32523,0xbccf8d9c,0x3c5a9fd9,0x3d0f78bb,0x3d0b485c,0x3c8f5ff6,0x3ae0524c,0xbbb5fc9f,0x3bc2bd9c,0x3c2e8b48,0x3c112dbe,0x3ca85b26, +0x3cbd2fe9,0x3cc3a880,0x3cf7a301,0x3cfa4e25,0x3cf085ff,0x3c63a24b,0x3bc2ba53,0x3b9b09a9,0x3b5bf32b,0x3b915a5b,0x3b6af4dd,0x3c967255,0x3c861a03,0xbc625dac,0x3c87540d,0x3cb42dc9,0x3c36bc69,0x3c8f59b6,0x3d21793e,0x3da1efd8,0x3d10158a,0xbb1566d6,0x3d92664c,0x3c46f83a,0xbc2f0434, +0x3c0ab410,0xbbf5b532,0xbc105877,0xbba6b4b1,0x3b889af1,0x3c17058e,0x3b9e5b6d,0x38380713,0x3afc5d2c,0x3c198366,0x3c0c796f,0x3c552591,0x3c8ed2f2,0x3c56d877,0x3c4bf9fe,0x3c91c64a,0x3c329384,0x3bf3647a,0xba71c5ac,0xbb221bc7,0xba3890cf,0x3bebe0ac,0x3c35235e,0x3c954555,0x3cb2d8bc, +0x3c1ed564,0x3c4fec30,0x3cf6da4d,0xbca74f26,0xbd30d1d0,0xbd1785fc,0xbd10dd79,0xbc528be9,0xbc225b9a,0xbc18b633,0xbc31abe3,0xbcc528d7,0xbcea4024,0xbcd1496a,0xbbbc1796,0xbc3d0cd8,0xbc1e0443,0xbabf1615,0x3b3f9a2f,0x3bf61d0b,0x3b1158c8,0x3c007480,0x3c781fc8,0x3c870aee,0x3bac3d06, +0x3c37288f,0x3cd5020a,0x3c9c77d3,0x3c8b9889,0x3bdb125b,0x3bbcb9d5,0x3b27007e,0x3b58e97f,0xbc4ecb7b,0xbc5540ce,0x3be5dc6a,0x3c0aadda,0x3c79b506,0x3cb8e993,0x3c98732f,0x3c94f244,0x3ae60d6f,0xbb65ff34,0x3c4d4e12,0x3c63f323,0xbd060add,0xbd4fe854,0xbd2952c7,0xbcd0b42c,0xbc061134, +0x3abd721b,0xbb652274,0x3b79c2b1,0x3ba9cf44,0xb8490ebc,0x3a9d866d,0x3c222b02,0x3c17e70e,0x3c13b81e,0x3c2896cd,0x3c58906d,0x3c564bef,0x3c28b79e,0x3c624068,0x3c537899,0x3b91ffd2,0x3c13cd2f,0x3c075cba,0x3b86cd31,0xbc323a73,0xbc368ace,0xba17f3b8,0xbc804aec,0xbc9ffca5,0xbca70472, +0xbd07e3bb,0xbd04ba34,0xbc84bc69,0xba5534d1,0xbdde8e25,0xbdfeca1e,0xbda08802,0xbd2a1d29,0xbca7447e,0xbd122b3c,0xbd284571,0xbcd91176,0xbcd2b736,0xbca97f55,0xbbfd3924,0x3bba1fe4,0x3c0aa183,0x3b9192f4,0x3b3612d4,0x3b7c6073,0x3c4c6e0f,0x3b0fc882,0x3b12cdcc,0x3c4278c6,0x3c601eff, +0x3c1e1119,0xbb3f1a5a,0xbbf14b0a,0xbc3ea6a2,0xbc84267e,0xbc452af6,0xbc0add36,0xbc6ea21a,0xbb1b59b5,0xbb6e28d9,0xbc56833a,0xbcd00888,0xbd12f400,0xbd399b63,0xbdacda62,0xbb5a2ef8,0x3d041f5e,0x3d6153f4,0x3d5004bb,0x3d5e30c7,0x3d50a858,0x3d447296,0x3d575d22,0x3d3ed60e,0x3d24ce49, +0x3cdb6943,0x3cb57b09,0x3c777f86,0x3c26cb2c,0x3c4c9718,0x3c1f27e6,0x3bfa2c7f,0xbaa535d6,0xbb7026e9,0xbb432c4e,0xbb95ba69,0xbba129ee,0xbbe38b4d,0xbbcc8946,0xbc12a3f5,0xbc2a7c51,0xbc2f3fde,0xbc7a21ec,0xbcd4e9b9,0xbc94e33f,0xbcab34a8,0xbd012e2b,0xbd2cbc16,0xbd51388a,0xbd568eb9, +0xbceb7bbc,0x3cbb524f,0x3d32b3d7,0x3d492312,0x3d5c85fa,0x3d80f8ee,0x3d6d28eb,0x3d5d97bc,0x3d4f4f80,0x3d3e395e,0x3d272106,0x3d1de557,0x3d0aeddc,0x3d042b91,0x3ce4d786,0x3ca109fd,0x3c4089f7,0x3b83f838,0xbb9f10bf,0xbc7f6110,0xbccb0fc6,0xbcfcc69e,0xbd18dbf5,0xbd33a2f8,0xbd3a74db, +0xbd4064cc,0xbd478f2e,0xbd53537a,0xbd5d4a88,0xbd68807b,0xbd7355d7,0xbd81422a,0xbd8b5988,0xbd3e4c03,0xbcd25077,0xbc0a76b9,0x3c28f9a3,0x3c31c135,0x3c673725,0x3cd17552,0x3c8e8147,0x3cb532ef,0x3cc4c6ad,0x3cbf91b9,0x3cd9f614,0x3c9ed7a2,0x3c8997e1,0x3c617df4,0x3c01b8a2,0x3b5b33ca, +0xb9e5d10f,0x3aabad11,0x3ad07b56,0xb9b8aa3d,0xb8353f99,0x3b52249e,0x3b04460d,0xba4f0f22,0xbb88a040,0xbbf62579,0xbc36aadc,0xbc79a39c,0xbca1da5b,0xbc8806f6,0xbc694834,0xbc3dda33,0xbc14ca95,0xbbb04e61,0xbb886268,0xba19a4ef,0x3a41dda2,0x3b78e506,0x3bde44ad,0x3b261a4b,0x3ae4c632, +0x3c18a4a8,0x3c6a5e8f,0x3cbab85b,0x3bf2ff2b,0x3c76310f,0x3ccb18a1,0x3cbad868,0x3cae2f60,0x3c9ea61e,0x3c97e5c9,0x3c8e8284,0x3c7c672e,0x3c09a629,0x3b2c7efa,0x3c794f29,0x3c01e840,0x3b856a1e,0xbaaf3e81,0xbb215858,0xbb80dcb2,0xbbaf335c,0xbbe4bfd0,0xbc0804c4,0xbc2e6360,0xbc0fd4ee, +0xbc02865e,0xbbe7f37b,0xbbd0e335,0xbbbed697,0xbba6bfa9,0xbb672db4,0xbaefdcaa,0xb99f34fc,0x3a7e1397,0xbb2576df,0x3c27df18,0x3c270925,0x3c17902f,0x3c26fad7,0x3c2e1113,0x3c551fb7,0x3c0df1ab,0x3c123326,0x3c243606,0x3c2b184f,0x3c2d48a9,0x3c302a3b,0x3c3004c1,0x3c2b026c,0x3c17f3eb, +0x3c1290b4,0x3c141f9e,0x3c2e5012,0x3c32ce50,0x3c357919,0x3c3903be,0x3c2cbd11,0x3c236369,0x3c193073,0x3c182381,0x3c0ac4de,0x3bdcf6d9,0x3bdbf69d,0x3bdbe18b,0x3bd12756,0x3c08e0e3,0x3c131048,0x3c091223,0x3c1d0d3d,0x3c236838,0x3c199bad,0x3c27b37c,0x3c481fcb,0x3c3e0912,0x3c80daea, +0x3c78d9bb,0x3c930022,0x3c162906,0x3bdf1471,0x3c118ee3,0x3c34626b,0x3c578280,0x3c4dec64,0x3c5a9d10,0x3c3fdaf1,0x3c0675ff,0x3c118b7e,0x3c1c0b4e,0x3c5171c8,0x3c6a8254,0x3c8a9b01,0x3c8d7ab5,0x3c67545e,0x3c4b708b,0x3c26608e,0x3c211b6e,0x3bf61b6f,0x3b290e58,0x3ade1902,0x3ae1b414, +0x3adc5413,0x3c036424,0x3c2064d6,0x3bfce20b,0x3c220f08,0x3c1f0815,0x3c0cc857,0x3c32c934,0x3c7d7131,0x3c4552cf,0x3c855cb6,0x3c74e36d,0x3cc3a78f,0x3bebe42a,0x3bb11b84,0x3c2c1bba,0x3c4cdc93,0x3c694c6d,0x3c6b6bae,0x3c66d0a0,0x3c476721,0x3babdcdb,0x3c0a2a4d,0x3c21be0f,0x3c6d3710, +0x3c946f4f,0x3cada940,0x3cc5ebce,0x3c8c18dd,0x3c6c8fce,0x3c23cf61,0x3c241a8c,0x3b90afe6,0xbb9669ae,0xbba84104,0xbb8979d2,0xbb7e08cd,0x3bac89bb,0x3c176c0e,0x3bb98456,0x3c299d52,0x3c5470c5,0x3c39ffab,0x3c89e57f,0x3c96e74f,0x3c934acb,0x3cdf71e6,0x3d06e4c5,0x3d27b7ad,0x3c24b39a, +0xbb34453c,0x3c18e1db,0x3c40e4cd,0x3c9022f3,0x3cce79bc,0x3c5a6c55,0x3bd20406,0x3b9bb6a8,0x3c588e3e,0x3c64c17b,0x3c992a6e,0x3cdecdc5,0x3d0a6232,0x3d1a923a,0x3ccd75f2,0x3c950209,0x3c2d90ff,0x3c10903c,0x3a7c249c,0xbc7eb47a,0xbca26ddd,0xbc849378,0xbc494689,0x3bcc9fbf,0x3c1b5ef4, +0x3b8f2afd,0x3c1693fe,0x3bcae8b6,0x3b56aed3,0x3c48efee,0x3cb65f92,0x3bb8216d,0xbbf61de7,0xbcbb8907,0xbd056ee7,0x3b87f52e,0x3ce0783c,0x3d143229,0x3ceb0dc0,0x3c18bb5a,0xbbc5d319,0x3b754342,0x3c11d587,0x3c506fa6,0x3cb83b60,0x3ca95c18,0x3c9b5c67,0x3c6972e4,0x3c6c4d70,0x3c73bd15, +0x3bab3591,0x3bf2c5a7,0x3c3d7b18,0x3be3877e,0x3bf42642,0x3c00dd35,0x3d143889,0x3cfc28c5,0xbc870f33,0x3b7561f1,0x3bdbde7e,0x3b8c5ca4,0x3c23e313,0x3d0162a9,0x3d9600a0,0x3d35c4dd,0xbce77996,0x3ad1bac4,0x3ccc9c43,0x3ca94a75,0x3c2c342a,0x39075247,0xbc0d8ce0,0xbc2277ea,0x3afb4b47, +0x3c2d9b10,0x3c63423f,0x3bbe5c60,0x3b88dbe4,0x3c1323f7,0x3c0638c5,0x3c7c9302,0x3ca0888a,0x3ca22309,0x3ca1c088,0x3c52f51e,0x3c8f14be,0x3c7fedf3,0x3b07074e,0x3b961581,0x3bd176d8,0x3c154250,0x3c9d01f0,0x3c9786a8,0xbb077f31,0x3c2d0db6,0x3bef3812,0xbc176667,0xbc807656,0xbcdb0c94, +0xbd1db471,0xbd113983,0xbc5eeea1,0xbbd3e840,0xbba79e81,0xbbe38d57,0xbb33fe85,0xbc60fb48,0xbca9d584,0x3b899104,0xbb8a80b7,0xbbb97eb2,0x3a2bd7be,0x3babb214,0x3c05e62d,0x3b99b152,0x3bfd54e8,0x3c75d6b0,0x3c1360d9,0x3bbb4f45,0x3bf1bc77,0x3c05a05d,0x3cb7df67,0x3cc737f5,0x3c21dfdd, +0x3c75ebaf,0x3c1a0c17,0xbaa0fb1e,0xb9c58433,0x3b617829,0x3c1a4060,0x3cb3d514,0x3cfa1d69,0x3d008739,0x3c659cf5,0x3b41820a,0xbc0fb3ad,0xbc2db388,0x3b3b2a14,0xbc8ac65a,0xbbbf2ad8,0xbc0c6de3,0xbc75d864,0xbc7c95da,0xbbf4a314,0x3c54c33f,0x3b77156f,0x3c0aca6f,0x3c124e5e,0x3b4ace2a, +0x3b6f0f3d,0x3c23687b,0x3c41fdad,0x3c8813d2,0x3c8e4211,0x3ca2abfd,0x3c979fb5,0x3c21e018,0x3c89594d,0x3c9652a9,0x3c742fd3,0x3c8cd7fd,0x3c7141ea,0x3a88f1e6,0x3baeb96a,0x3ad687a5,0xbc38c8eb,0xbc89a274,0xbca6e0d3,0xbcd66a8f,0xbb118f75,0x3bfee91f,0xb9f64f84,0x3c17c371,0xbcbc6bea, +0xbd3b0619,0xbd71bebd,0xbd5dcb60,0xbd3508ce,0xbd369873,0xbd1eb90c,0xbcc8c6f0,0xbcca9f52,0xbcac2085,0xbc6f4415,0xbb7ff239,0x3b83f219,0x3c309d99,0x3c02fdc6,0x3c089bec,0x3c4909a6,0x3c2cf8d1,0x3c3da27d,0x3c038df5,0x3c823dba,0x3c7b960b,0x3c1071f9,0x3aa24b8e,0xbb1428ca,0xbaf5baa6, +0x3ae8d2bf,0x3a7958c3,0xbbcf01e7,0x3bae211e,0xbb3adb2b,0xbceba969,0xbd148742,0xbd23c931,0xbd2b5f9d,0xbcdd649a,0xbd7427d0,0xbd3e45a6,0xbce04a24,0xbc7739a8,0xbb901bd5,0x3c48a0ce,0x3c823ea2,0x3c4ce1bd,0x3c0204fc,0x3be59302,0x3be31a93,0x3c835d9c,0x3c886745,0x3c78e6c0,0x3c46e8fe, +0x3c25eeb1,0x3c329bfd,0x3af91d85,0xbabfb1f3,0x3a51a610,0x3c1a8765,0x3c38f91e,0x3c17c929,0xb9cafa0b,0xbbbda5ed,0xbc4027d9,0xbc57b08b,0xbc78dd38,0xbc83a156,0xbcab7494,0xbc369b22,0x3c4fa7e7,0x3b83d5ca,0xbc09967c,0xbcdaf85e,0xbd48e6cc,0xbc21250f,0x3b93bd76,0x3c838650,0x3ca10a50, +0x3cffe705,0x3ceec4cd,0x3cdd18f2,0x3ce39668,0x3cf16bf6,0x3ce9e049,0x3d000903,0x3cc1ef49,0x3cb5a396,0x3c83e530,0x3c4f223f,0x3bd52935,0x3b27f330,0xb94a878d,0xbb7b2fd4,0xbb8e0761,0xbc2a6a42,0xbc90caae,0xbcbe11bc,0xbcdb538c,0xbcf4fc57,0xbd0c9068,0xbd03c0cf,0xbd00cd75,0xbcef394a, +0xbd0eee5c,0xbd305666,0xbd584f0b,0xbd4aaa9a,0xbd32f6bc,0xbd1cb4ac,0xbcaf27db,0xbc0320ce,0xbb7b1d31,0x3b292030,0xbabfa91b,0x3afab544,0x3b0dd515,0x3b6b49a2,0x3bbe8c1f,0x3b589d14,0x3b03eeeb,0x3ade8d00,0xba17b52a,0xbac1a24f,0xbb2116d4,0xbb5c11ed,0xbbb53f1d,0xbc01edbc,0xbc243585, +0xbc1eecbc,0xbc8fd4a8,0xbca9aff8,0xbcb7dca8,0xbcce3297,0xbce6e5a5,0xbd00b80c,0xbd109bdc,0xbd0cd977,0xbd0c32b9,0xbd0a19c3,0xbd055af2,0xbcf27308,0xbce75569,0xbcb1359f,0xbc8f7f56,0xbc6bfc45,0xbc36ce9d,0xbc77f275,0xbc683cad,0xbc505ecd,0xbc2dee3f,0xbc049643,0xbc41c407,0xbc1a6480, +0xbbcd715f,0xbbeb2287,0xbbf63a84,0xbc0b4511,0xbc07476c,0xbc0f71a2,0xbc14d35d,0xbc440a5d,0xbc6f1b0d,0xbc31b684,0xbc70ec22,0xbc8786a6,0xbca4f245,0xbca61c74,0xbcb2ec6e,0xbcbd53e4,0xbcc79123,0xbccffa4c,0xbcdcde09,0xbcd462f6,0xbcd08a63,0xbccc9ed6,0xbcc90bf1,0xbcc78066,0xbcc8ac54, +0xbcbb58da,0xbcad5ce5,0xbc99b75e,0xbc8c7741,0xbcbaaee4,0x3c0b381d,0x3c0f76e1,0x3bf0221c,0x3c00fd10,0x3c038cc3,0x3c137615,0x3be7a623,0x3bf64a8d,0x3bfab850,0x3c133615,0x3c1a3cca,0x3c13bb06,0x3c223bc6,0x3c1ddefa,0x3bfd829b,0x3bf5a3ed,0x3bf19369,0x3c1c3be6,0x3c0ea81d,0x3c09f4bb, +0x3bfb793e,0x3c01e3a2,0x3bff2f91,0x3bfdef67,0x3c031249,0x3c00c35c,0x3bf06ef6,0x3be85098,0x3be59400,0x3bf23ccb,0x3be5cdce,0x3bea3ee8,0x3bf41adf,0x3bfbe384,0x3bfc7575,0x3be07eb9,0x3c0c035d,0x3c143fa0,0x3bf77142,0x3c2e4a95,0x3c1b5e62,0x3c255f3e,0x3bdda174,0x3bc00799,0x3bb03f2d, +0x3c16ddad,0x3c3a403a,0x3c2aa64c,0x3c5ed59d,0x3c438bf2,0x3be15ea5,0x3be678d4,0x3bf5b6b7,0x3c41ffa6,0x3c2f43c6,0x3c474b9a,0x3c205999,0x3c10a40f,0x3c0c3213,0x3c077fac,0x3c16edbc,0x3c10acef,0x3be23c0c,0x3bd46010,0x3bd35c5f,0x3c07f1ec,0x3bffec90,0x3bed02d3,0x3bf24f37,0x3bd758b6, +0x3bcde5da,0x3b9d949e,0x3c089bbe,0x3c615caa,0x3bf876cb,0x3c18729e,0x3bf15a05,0x3c2f18b2,0x3b9c4e5c,0x3b9d42fb,0x3bae37a9,0x3c35d377,0x3c623e57,0x3c3c5280,0x3c88bbac,0x3c79e6c1,0x3b8a72b4,0x3bd728b8,0x3be7750d,0x3c725ccc,0x3c485fff,0x3c5956c9,0x3c3bfbe6,0x3c1275d8,0x3c171525, +0x3c031853,0x3c24b1e9,0x3c0fda74,0x3bb54206,0x3bb0d0dd,0x3bac3263,0x3c10f222,0x3bb26659,0x3bc2e1b9,0x3bef9c15,0x3bee2af5,0x3beb8e78,0x3b7c2e9f,0x3c5714df,0x3c1b83e9,0x3bef30d1,0x3c6759f4,0x3c907deb,0x3ca1d796,0x3bbe256a,0xb919ca59,0x3add1ead,0x3c1edcfe,0x3c88fe4c,0x3c915ae2, +0x3c937d5c,0x3c3421b1,0xba81aefe,0x3c09eea2,0x3c2a646f,0x3ca61ac9,0x3c9ba1b1,0x3cb58873,0x3c92cb93,0x3c382de2,0x3c190182,0x3be6a5ca,0x3c253251,0x3c159d36,0x3abe91a6,0x3ac01091,0x3b673096,0x3c5763da,0x3c3fbaec,0x3bcec3c3,0x3bcfde46,0x3ae0c759,0xba492421,0xbb9a5c6e,0x3bf059f1, +0x3d0674bf,0x3c6fd62c,0xbbb299d7,0xbcb9cd05,0xbcf1a284,0xbb8e0959,0x3c543a74,0x3cbf5098,0x3d1204ef,0x3cae8351,0xbae90393,0x3a4babdc,0x3bcc81a3,0x3ca20c54,0x3ca58a78,0x3c863218,0x3c6e5b2b,0x3bd96c55,0x3b4e5997,0x3a2f2f37,0x3bb26a49,0x3c34f6f8,0x3c748d88,0x3c5df03b,0x3c61d263, +0x3c6ad351,0x3cf96d32,0x3ca51ac1,0xbc61bc54,0xbc6a018e,0xbbf16e46,0x3c928835,0x3c8fa843,0x3cd7d3fe,0x3d424c96,0x3d1e60bb,0xbcfa56a4,0xbd67f0c6,0x3d1a1650,0x3d56ad85,0xb8f0098b,0x3c7146ef,0x3bd1d426,0xbc1857a1,0x3ab82c53,0x3c2c7cfe,0x3ca54880,0x3c22e933,0x3bbe3366,0x3c23d35d, +0x3c678409,0x3cad7d2d,0x3c74d787,0x3c6f8208,0x3c64fe2f,0x3bf9d681,0x3c9d823a,0x3c8f2c98,0x3bdeb213,0x3c046543,0x3c3d2ab7,0x3c8b4ff9,0x3c895859,0x3c3a08ef,0xbc4f7440,0x3c9850de,0x3ba011c9,0xbd5393fe,0xbce566c6,0xbca6e3b1,0xbcce9195,0xbcb4c24f,0xbbabe8ed,0xbc535fa9,0xbc5188ab, +0xbc1f09dc,0x3c0befb7,0x3ba0ceb1,0xbb9d92ce,0x3c03d103,0x3b79165a,0xba4c701b,0x3b82cdae,0x3b6bc4b8,0x3bcec227,0x3be95171,0x3b2d86f0,0x3bbf4357,0xba2ff3f0,0xbb0c19e5,0x398aeb61,0x387267fe,0x3c3b05ab,0x3c554828,0x3bbc9192,0x3ba86f3d,0xb8d3e4d5,0xbb3a4555,0x3bddf581,0x3c833541, +0x3c11ad90,0x3cbc99cb,0x3cdef1f6,0x3cc409e3,0x3c2ce0d7,0x3a7ba94f,0x3c3da5a2,0xb8e91adf,0x3b06531d,0x3b13620b,0x3c007467,0x3c2e4442,0xbb116e55,0xbaf9f43e,0xbb5a2a7f,0x39f7e797,0x38a55541,0x3b68e44b,0x3bc3d3ea,0x3b2aa8ed,0x3b758a5b,0x3bf66f86,0x3c2798c3,0x3c7108fa,0x3c29a2d2, +0x3c2a2546,0x3c4104d5,0x3be9bbcc,0x3c2d62bc,0x3c508dd9,0x3c52814e,0x3c203b1d,0x3bfba29c,0x3bbfe783,0x3ba8b866,0xbbd46c41,0xbcf29fca,0xbca5c4a5,0xbc8d3a2e,0xbc34128b,0x3b1f4b60,0x3c3742ed,0x3c8fdbc8,0x3b607abc,0xbbc106be,0xbc2f2a76,0xbce5fc43,0xbd2dc198,0xbd593d6b,0xbd174897, +0xbcd9d2a6,0xbca75db8,0xbc6bd938,0xbc4444ea,0xbc3843f7,0xbc154aaf,0xbaff5370,0x3c3822b0,0x3be0ce0d,0x3be9f2d3,0x3bc8834f,0x3c41d316,0x3c437d43,0x3b4bc1a5,0x3c13a44d,0x3c59753e,0x3c876467,0x3c5ca125,0x3c156de6,0x3b336f33,0x3a586d59,0xbb5f319a,0xbc25a15d,0xbc0b862e,0xbc01d213, +0xbc124708,0xbc91196e,0xbca49faa,0xbc6a7b75,0xbbeb9eb3,0xbd407ce2,0xbd5a981b,0xbd587194,0xbd204eb4,0xbca7a5ff,0xbc14c730,0xbc0f74ec,0xbc9a0abe,0xbc93ea72,0xbc6cd255,0xbbebce07,0x3b77e562,0x3c132180,0x3c2701a7,0x3baf23c7,0x3b85a346,0x3b792dbb,0x3bbe2268,0x3bf4dd01,0x3bf6ae2f, +0x3c5e354e,0x3c5bc431,0x3c140a18,0x3bedb786,0x3b4087ee,0xb91c2503,0xbbaa451e,0xbbe71244,0xbb8deece,0xbc3c29e9,0xbc8acc01,0xbcaa04fa,0xbc061d51,0xbbf16509,0xbcaa2b3c,0xbd10f061,0xbce039cd,0xbce30f1b,0xbc99ac2e,0xbc852f4e,0xbc225d0e,0xbc05f785,0xbba03178,0xb9d55b74,0x3bdaf95d, +0x3c280d2b,0x3c8edf5e,0x3c3c1d93,0x3c3106bc,0x3c0f9f6f,0x3bbf8123,0x3b308740,0xb9b0b852,0xbb45a19c,0xbba84299,0xbc095e4c,0xbbcc7f58,0xbb808bf8,0xba9fc9d8,0xbb7c6f4b,0xbbdde3d6,0xbc251100,0xbc27e590,0xbc36f97d,0xbc3cd0b3,0xbc2a69b3,0xbbfa3fca,0xbbe2c2ba,0xbc68b5f3,0xbcad30ea, +0xbcd097bc,0xbcd4e40d,0xbc421795,0xbc0f12ac,0xbb94a42d,0xbb9a4bcb,0xbadbe5e4,0xba105f1d,0x3a5f302c,0x3b35f97b,0x3a24571a,0xba5e2151,0xbaa3de59,0xbaf7621b,0xbaf75245,0xbb0693d9,0xbbafbc64,0xbbf50a99,0xbc21e57a,0xbc45ec7a,0xbc88c649,0xbc7f0025,0xbc8fe3b3,0xbcaaaa19,0xbcbd8a5c, +0xbcd42d3a,0xbce22702,0xbcf479a3,0xbce90f77,0xbce66145,0xbcea8757,0xbcee0a4c,0xbcf9ce5d,0xbcfad1c9,0xbcda8655,0xbcb3f922,0xbc97fc0b,0xbc784579,0xbc883aed,0xbc7d3ae7,0xbc842834,0xbc7e80db,0xbc7b5f20,0xbc677147,0xbc63af4c,0xbc51e433,0xbc5cd7d2,0xbc5e92b5,0xbc6d53f4,0xbc6e61c3, +0xbc79adf2,0xbc7d9ab6,0xbc80e7b9,0xbc79d745,0xbc979385,0xbc93a9c0,0xbc93a3c8,0xbc856542,0xbc933f1c,0xbc988acb,0xbc9fcc04,0xbca425e0,0xbca9e533,0xbcb30e57,0xbcb37237,0xbcb4acd4,0xbcb2cd90,0xbcb20c9b,0xbcafe404,0xbcb5fa70,0xbca989c1,0xbca3691b,0xbc9a626b,0xbc922b35,0xbcb29d41, +0x3bc52a59,0x3bc34434,0x3bad44ac,0x3bbda9ba,0x3bc14bd6,0x3bd2a2fa,0x3bb51545,0x3bc9f4eb,0x3bca04bc,0x3beb9f8a,0x3bfbf344,0x3bf5a9fd,0x3c10bf35,0x3c0dec53,0x3bdbc99e,0x3bc889ed,0x3bac43f3,0x3bf4b8e2,0x3bca7032,0x3bbf3fac,0x3b9ed2a1,0x3bab14e7,0x3baec79e,0x3bc00090,0x3bbee394, +0x3bbd02dd,0x3bb2554a,0x3ba36ae6,0x3ba4702d,0x3bd76570,0x3ba88034,0x3ba3e994,0x3bb709ae,0x3b9c6691,0x3b93fbdc,0x3b76884f,0x3bb1e21b,0x3ba36b97,0x3b781259,0x3ba67b21,0x3ba513aa,0x3bc91194,0x3bbe97f4,0x3bb3b47d,0x3b8d6e4c,0x3be8fe4e,0x3c0d6fc9,0x3c0b9e5b,0x3c4a2068,0x3c3851b4, +0x3bd56710,0x3bbeb256,0x3bb3b867,0x3c04aa71,0x3be22c33,0x3be535b4,0x3b98224a,0x3b994b33,0x3ba8df4b,0x3bd64bfc,0x3bd61d96,0x3bc06131,0x3b9e8389,0x3b72b499,0x3b9982a4,0x3c1fa4c2,0x3bd0d0c7,0x3baf7c97,0x3bc39fb1,0x3b1f1058,0x3ab4bc86,0x39d35ede,0x3b8cfd2b,0x3c0fa825,0x3bc17ce7, +0x3bad870f,0x3b838d00,0x3ba15684,0x3b9a7d5b,0x3bc92674,0x3bac31b4,0x3c1c5d77,0x3c4a9787,0x3c3428dd,0x3c94fd4d,0x3c8ce682,0x3bdbf7c1,0x3bd84256,0x3ba91836,0x3c2258af,0x3bee0b6f,0x3bd40438,0x3b6ecba0,0x3b693387,0x3ba21378,0x3bf661bb,0x3bffa328,0x3bf61f7a,0x3bae6bb1,0x3b59cfc2, +0x3b4d8172,0x3c569790,0x3b9f6f7f,0x3b8bc2d2,0x3be77cc7,0x3a89f591,0xba1361da,0xbb759bbf,0x3ba9a5f6,0x3b56f9c6,0x3aaae89c,0x3ae07d54,0x3bc7bc4d,0x3c1eeb58,0x3ba451d5,0x3b6577b2,0x3a4801b2,0x3bff29c1,0x3c4974ac,0x3c35a8ad,0x3cad2d08,0x3c7f16fb,0x380e473f,0x3bbec766,0x3c138921, +0x3c9a953d,0x3c349ccd,0x3c02967b,0x3af4e6fd,0x3a3abfa7,0x3b306b4b,0x3be07547,0x3bf99e27,0x3b9fe933,0x39f70e16,0xba771e4b,0x3ba239ee,0x3cbe32ad,0x3c3dee48,0x3bcc75ea,0x3be4d952,0xbbeb4889,0xbc3fb88e,0xbc5d0a54,0x393f9538,0x3cc402a5,0x3c9e56fe,0x3b392472,0xbc6a86af,0xbce807d9, +0xbb9ee8f7,0x3c058a31,0x3c24f44a,0x3d0830d8,0x3cf3d731,0x3c170089,0x3a89a947,0x3bb0e4f1,0x3cb9ff0b,0x3c6b7bb4,0x3c264483,0x3c288a2e,0x3b8906bd,0x3b324526,0x3b9c3869,0x3c323689,0x3c54a850,0x3c80ca5d,0x3c6eee44,0x3c98ea22,0x3cf58707,0x3c2dc4f1,0xbc024e71,0xbcb68053,0xbc9a7730, +0xbbcaa289,0x3c85c7dd,0x3ccecb83,0x3ce003ee,0x3cc89753,0x3caa29d2,0xbc6c0259,0xbd8712a6,0x3c9cd56f,0x3d314744,0xbaa947c6,0x3c756b1c,0x3c2e7beb,0x3b39ab79,0x3b216a9e,0x3bda21a4,0x3cac5a4a,0x3c7bd539,0x3c37db48,0x3c20ef2d,0x3c90dedb,0x3caf5c4a,0x3c074555,0x3c104cca,0x3c195a92, +0x3c091da0,0x3c549c9c,0x3c6fb6bb,0x3c905aa5,0x3c8d6b7a,0x3c908346,0x3c8c5f5b,0x3c3b2e34,0x3bfe9d4f,0xbac72f67,0x3cd1fc16,0x3c6eae43,0xbcc3b3a0,0xbc92411e,0xbc7947ae,0xbc48d416,0xbb126b34,0x3c3f01fc,0xbc7a45e8,0xbc7ef688,0xbc474939,0x3b3d2663,0x3c76f113,0x3c37af16,0x3b77945a, +0x3bf3a4dd,0x3ba71bae,0x3bbd3d20,0x3b93d388,0x3be748ce,0x3c17138a,0x3a31a9d6,0xbb5ce8fa,0xbc0176a3,0xbbca3746,0xbb8edc3e,0xbbbc7280,0xba864c30,0x3b5d07bb,0x3c2c9a39,0xbb869699,0xbc092b04,0xbb7c37b2,0x3bffc0eb,0x3c867ff6,0x3c3352cb,0x3cb2fb33,0x3c85bb94,0x3b80c053,0x3b14338d, +0x3b8fe372,0x3cbcdd01,0x3c9480b4,0x3c4add01,0x3c9765e5,0x3c853bcb,0x3c393e0a,0xba98ee71,0x3a47cd3f,0xbb2078bd,0xbbd66134,0xba57bbe0,0x3aa04748,0x3b6df54d,0x3b765731,0x3b948916,0x3b935a1e,0x3bec0b34,0x3c103639,0x3b395e85,0x3aff229c,0x3b398634,0x3bbbf681,0x3c11345d,0x3c192291, +0x3c3a692e,0x3b7ced87,0x3962cc1b,0x3b05563f,0xbacdb7f7,0xbc133825,0xbca92800,0xbc15ce32,0xbbc88303,0xbb031c5b,0x3ba28495,0x3c3097b0,0x3c8a8dda,0x3c39ef0a,0xbc30d200,0xbc980828,0xbcd77521,0xbd172232,0xbd528831,0xbd2f1c80,0xbd03bcc7,0xbca34b33,0xbc24957c,0xbba66b94,0xbb8bb9df, +0xbbd35ad7,0xbb3e4581,0x3b8211a0,0x3b8312a3,0x3b974009,0xb2cdc66b,0x3b9c1086,0x3bbbf909,0x3ba1b346,0x39bf0c4c,0x3b03fef8,0x3c328668,0x3c214fbb,0x3bf46ab1,0x39b313fb,0xbb283957,0xbbe1b6f0,0xbc1cbeda,0xbc9f40db,0xbc9878ed,0xbb49b5c6,0xbba867fa,0xbbb55f72,0xbb86ef9c,0xbbc35873, +0xbcd7a45c,0xbcfe3197,0xbd07c10c,0xbcd2155b,0xbc3ae992,0xbc87ed85,0xbcab28bd,0xbcce683d,0xbccc5a61,0xbcb4b9c2,0xbc81feb8,0xbc58eef9,0xbbe530f3,0x3b815ee4,0x3b2eafe7,0x3b944b1f,0x3b86709a,0x3c17b22b,0x3c219b97,0x3c153a29,0x3bed7769,0x3c01f397,0x3c613104,0x3bdfdfd8,0x3b75fd3e, +0xbb2c185c,0xbb8fd85c,0xbbddeb63,0xbc18f1f3,0xbc229d98,0xbc90b189,0xbcf591ac,0xbd173d1d,0xbd10a864,0xbcdc5638,0xbcdb721f,0xbd128bd3,0xbd298435,0xbd1588b4,0xbd0edda8,0xbd01a254,0xbcd286fa,0xbc93cb7d,0xbc3a88e1,0xbbbc65d0,0xbb1da3b3,0x3b5d085f,0x3b4edd1b,0x3bc66b36,0x3bfe47cc, +0x3b7cc7af,0x3aa7145b,0xbaf15242,0xba27412a,0xb9484d68,0x3b6ac2a0,0x3c154a68,0x3c443551,0x3c8a3348,0x3c55c2ba,0x3c275bcb,0x3be52703,0x3b97afdc,0x3b001e02,0xbaebef5f,0xba43a41a,0x3a8b732f,0x3b720912,0xbb855397,0xbc615834,0xbcbe356f,0xbcf8db0c,0xbc62b42b,0xbc5bf541,0xbc239c43, +0xbc039bb9,0xbbbaf83b,0xbb9d20a3,0xbb81a3ea,0xbafd786f,0xbb11ff3e,0xbaeadf7f,0xba7510cc,0x3a1b4cf2,0x3b0a8688,0x3b8d2fd1,0x3aa7b643,0xb8bbdf17,0xba8ae042,0xbb2d8682,0xbbd84d21,0xbbc786e4,0xbbdf8664,0xbbfd9318,0xbc047e67,0xbc077faa,0xbc011387,0xbbf00a47,0xbc0e52bf,0xbc24f82e, +0xbc3dcdd1,0xbc601665,0xbc88b552,0xbc9b94fc,0xbc9d7962,0xbc8f7446,0xbc84a0d5,0xbc70136e,0xbbf8a874,0xbbf74213,0xbc0e6f68,0xbc1a8eb9,0xbc33656e,0xbbd8b6a2,0xbc00b143,0xbc0fcd32,0xbc054053,0xbbf5dacb,0xbbf2f615,0xbbea4aea,0xbbf29560,0xbbe98d3a,0xbbaf9db8,0xbb6a18f9,0xbc1faa45, +0xbbefe8d6,0xbbcd418f,0xbb8f4e1e,0xbb9d79a3,0xbb94bdd1,0xbb96a401,0xbb8c1bd5,0xbb8a0761,0xbb8269a2,0xbb9e5473,0xbbb06c51,0xbbc203ff,0xbbd2a935,0xbbdc9b12,0xbbf7e74e,0xbbe4be7b,0xbbeb8fd7,0xbbf1069c,0xbbfa1758,0xbb801b6d,0x3b3f882f,0x3b40f432,0x3b8acfec,0x3b84b6fc,0x3b8277a8, +0x3b88d613,0x3b701d93,0x3b8c3e82,0x3b8a06f5,0x3ba63c79,0x3bb20c24,0x3bb30078,0x3bd6d6b1,0x3bd2ffd1,0x3badba2a,0x3b76bef4,0x3b1b6a8d,0x3b6e0648,0x3b51f07b,0x3b55070a,0x3b2c3c0e,0x3b487e55,0x3b4643c5,0x3b51e2a2,0x3b163736,0x3ad063d1,0x39beee2f,0x39d13877,0x3a72018e,0x3b6e8b4b, +0x3b148ddd,0x3b131792,0x3b369c30,0x3ad4b8f5,0x3aa081ea,0x3a26f5c4,0x3b0297d6,0x3b081dcb,0x3b8c684e,0x3b377756,0x3b6acdba,0x3b8a3404,0x3bc0d63b,0x3bb11801,0x3b58e4d2,0x3bb19511,0x3bd96271,0x3be6f826,0x3c23016b,0x3c19a05e,0x3bd5e305,0x3b81e29d,0x3b130766,0x3ae94d96,0x3b37e92d, +0x3b6e61f7,0x3b2f1b8c,0x3b76118c,0x3b798849,0x3b70de11,0x3a674613,0xbaf9f17e,0xbb8bc44a,0xbb9caae3,0xbb04f8ac,0x3bbe6274,0x3b3de5d6,0x3b298957,0x3b2691f8,0xbab919fc,0xbb377807,0xbb3bcde1,0x39964390,0x3bae2c48,0x3c2e6aa8,0x3bee119c,0x3bc6b75e,0x3b8e6c8b,0x3bdf6a37,0x3c0c8caf, +0x3bb5796f,0x3c2057eb,0x3c446840,0x3c457070,0x3c93936b,0x3c8b729b,0x3c252cae,0x3bc1be6f,0x3af6ca95,0x3a0c36cd,0x3b532c46,0x3b8826c3,0x3b4602e1,0x3b98543a,0x3ba0d000,0x3bafe1f6,0x3a237c57,0xbb5e489a,0xbc1519bb,0xbc227f9d,0xbbe5f1b8,0x3c02f4a5,0x3ac2e50c,0x3aef5292,0x3b78bf23, +0xbb773a25,0xbbc3050b,0xbbe83baf,0xba4a8cb2,0x3b3b83c0,0x3be95454,0x389d46a9,0x3b881329,0x3bf238c5,0x3c2cf319,0x3c1932e6,0x3b6d335e,0x3c1a837e,0x3c3ce07d,0x3c438d3b,0x3cc19da0,0x3ca4806c,0x3c010661,0x3be0a0ce,0x3bbfd701,0x3bdd2030,0x3b7c2b3c,0x3b36785a,0x3a046f62,0x3b7273ac, +0x3b9acaa0,0x3b9f439b,0xbb71d8d5,0xbc68687e,0xbcab373b,0xbca79879,0xbc019181,0x3c848c13,0x3bb809dd,0x3b7ea626,0x3b3a085a,0xbc56e58a,0xbc98b553,0xbc6c1083,0xbb6f53c6,0x3c1aa1e6,0x3cdfe640,0x3cc8e7e2,0x3c2252e4,0xbc8dd9aa,0xbbd97c83,0x3b79a81b,0x3bf353ec,0x3cc7f88e,0x3cf94ccc, +0x3cb87662,0x3bb72b85,0x3ba2a46f,0x3c98f241,0x3c0bc92a,0x3bdd22a6,0x3c1fc503,0x3c28fe0c,0x3c3e0335,0x3c3e1ca0,0x3c54ff7e,0x3c5cf51c,0x3c86ff4e,0x3c96a033,0x3cba106c,0x3d0683c7,0xbbd10d71,0xbccfbdb5,0xbcce940b,0xbc5a773e,0x3ac94174,0x3ba9a6d8,0x3cfe9183,0x3cfc559d,0x3c08df7c, +0x3b0f1b6c,0x3b6f402e,0xbd4b87c7,0xbd102396,0xbc086a15,0x3c92a0e9,0x3c509d6f,0x3c3573cd,0x3c776c64,0x3bbd8b7a,0x3b958a82,0x3c93a317,0x3ca9521a,0x3c8d1010,0x3c0e2f46,0x3c73f2c9,0x3c651ac5,0x3bb7c376,0x3b5fda47,0x3b59716c,0x3be0ae08,0x3bbd5a60,0x3c276ee0,0x3cad5d9f,0x3cae2862, +0x3c97cfa3,0x3c661f56,0x3bb3fefa,0x3ba0d115,0x3c368129,0x3c8b734b,0x3c0d18fc,0xbc534f07,0xbbb7dc25,0xbb9a56d5,0xbc21b056,0x3c77cf88,0x3ce24892,0x3c150631,0x3c023540,0x3c04ff98,0x3c1efb29,0x3c875c6f,0x3c4df722,0xba93ed4a,0x3bcb6a65,0x3bf40d88,0x3bb40412,0x3ba5b676,0x3bdcf893, +0x3c37b32c,0x3adbbded,0xbbc0d417,0xbb4d3e18,0xbb8e367c,0xbbb9fb1c,0xbb976dba,0xbbc50df4,0xbb073717,0x3c15f32f,0xbb78366c,0xbb80a472,0x3ad649f4,0x3bef4024,0x3c126434,0x3c69145b,0xb9bc6b7a,0xbc1fa275,0xbc398aab,0xbc2f6d9f,0x3af20464,0x3c9dad51,0x3cd4e9a9,0x3c2b891d,0x3c2ccdf2, +0x3b8d984a,0xbad6145d,0xbc165abd,0xbba37f41,0xbbbcc06a,0xbbe40910,0x3b4f8785,0x3bacd86f,0x3b5a3628,0x3c0424cf,0x3bf81cf4,0x3b528aaa,0x3ae3685c,0x3abfdc4a,0x3b057f98,0xbada431b,0x3a2d4f93,0x3bffca31,0x3c34a2c5,0x3c34ccca,0x3c321996,0x3b03f8ba,0xbb0537cd,0xbba25a4e,0xbc12eb43, +0xbc114fc2,0x3b0bb757,0xb9815729,0x3bf24533,0x3cc0ca7b,0x3ca87a9f,0x3c875bb6,0x3c3f6de7,0x3c47d297,0xbc51a12c,0xbc52d433,0xbcca9482,0xbcff7475,0xbd032458,0xbd161843,0xbcf9a101,0xbcab1297,0xbc4e3db7,0xbbbd7def,0xbb63972c,0xbb5d9c91,0xbb625b24,0xbbbfd891,0x39230864,0x3b125506, +0x3a0aacbe,0x38101cf9,0x39b7bf5b,0x3b48ddf9,0xbac32a27,0xbad5d61c,0x38fdbc51,0x3b4b57c9,0x3b75cf12,0x3a9f1705,0xbb312ba9,0xbbec19f2,0xbbf432be,0xbc9d865f,0xbcb9e2b9,0xbc8fb42e,0xbbf0e548,0x3a73d909,0x3baffdf3,0xbbd302be,0xbc8e5547,0xbc902771,0xbc90f895,0xbc892870,0xbc703c5b, +0xbcbc593c,0xbce73ae0,0xbcec7cb6,0xbcd47dc0,0xbcbc8dcd,0xbca4629e,0xbcab6f74,0xbc8378e9,0xbbcc79f9,0x3a23cd45,0x3b9d7df6,0x3ba64057,0x3bdef79d,0x3bec73bb,0x3be3d143,0x3b2d2d34,0x3af9a6b3,0x3b2c2124,0x3bc7552e,0x3b8cc8c6,0xb7be22f9,0xbb7d1d4c,0xbbdeba3d,0xbc16277b,0xbc380597, +0xbc57f194,0xbc8d3b61,0xbcafafc4,0xbcd57ef7,0xbcead215,0xbcb34536,0xbcdee2b8,0xbcf2c867,0xbceef94a,0xbcd988ad,0xbcca8ade,0xbca352b8,0xbc655055,0xbc0ea109,0xbc0f2254,0xbc3309ea,0xbc1cb0e9,0xbbedc45f,0xb9d91655,0x3b029a7c,0x3b1f1781,0x3b407b90,0x3bac8add,0x3bc86259,0x3bf31f29, +0x3c0a9502,0x3c055472,0x3c0ac35a,0x3c06360a,0x3c144b6e,0x3c28b2c8,0x3c533edf,0x3bef9f89,0x3ad7b738,0xbba1e44e,0xbc048e57,0xbc3c993e,0xbc65e788,0xbc926dcd,0xbcacb222,0xbcd11fc0,0xbcdaa7d3,0xbc8e5b54,0xbca46b1e,0xbc8d1730,0xbc814d99,0xbc61c14c,0xbc48bbc0,0xbc423187,0xbc23ffe4, +0xbc1b9a3b,0xbbf7c082,0xbbb7869d,0xbb965402,0xbb632faf,0xba805e9e,0xba055571,0x399c9208,0x39f18fb4,0x3a4c47a7,0xb811252c,0x3b6e4429,0x3b8a6b6b,0x3b8bb042,0x3b97cd53,0x3baf8849,0x3bba2d5e,0x3bdab5ad,0x3b8994f2,0x3b480341,0x3ae36438,0x395d35d8,0xbad327f9,0xbb5e0560,0xbbda3b6d, +0xbc1be86b,0xbc42528c,0xbc715939,0xbbb507c4,0xbbeded8b,0xbba9afa3,0xbb9bc020,0xbb72c65d,0xbb96bc81,0xbb5ea107,0xbb005719,0xba70a767,0xb7bf4ca7,0x3a001f7d,0x3aaeb1ad,0x3add7e24,0x3b0d9009,0x3a47fde4,0x3a3e9242,0x3a5e888c,0x3aa87a30,0x3abcb070,0x3b21f856,0x3b0b34d8,0x3b2306c5, +0x3b31d47c,0x3b3662cf,0x3b3824a7,0x3b502ee8,0x3b18a250,0x3ad0b2a2,0x3a47273d,0xb8a60ffe,0xba5cd156,0xbab970e4,0xbb0d3f98,0xbb3e3a9d,0xbb7aa308,0xbb99fc4d,0x3a20d630,0xb8f7bb9f,0x3997f5bc,0x3b272a61,0x3b0bb904,0x3b04dccd,0x3ad94000,0x3ab1104b,0x3b01a5a9,0x3ab82ccb,0x3b33c52e, +0x3b46ba3e,0x3b3cb823,0x3b7491e5,0x3b6a0beb,0x3b4e0234,0x3a4ae6bc,0xba0a0545,0xb63aa3ee,0x39718859,0x39de7491,0x3996cea1,0x3a7f9d69,0x3a3c9156,0x393749fb,0xbab1eb23,0xbb1bb1c9,0xbb719f29,0xbb3c9ad2,0xbb0dd0ff,0xb8c8162b,0xba5fd337,0xba3264f4,0x39bf4fe6,0xbac63c4a,0xbafbe28a, +0xbaed334c,0xba78e3ec,0xb9bd9207,0x3b87223a,0x3b384d0b,0x3b1b6532,0x3ad660c9,0x3ba5a5d1,0x3b957e79,0x3a5397f8,0x3b74b749,0x3b9f3fed,0x3bab62f8,0x3be09c04,0x3bd0ab9e,0x3bafb13a,0x3a6f3e31,0xbac9ae9f,0xbb3a48d6,0xbaa05607,0x3a53ed62,0x3a79e8c2,0x3b3d82a6,0x3b146646,0xb9509a6b, +0xbb9ad757,0xbc003b05,0xbc1d863a,0xbc000a11,0xbb9af540,0x39c4678a,0xba85df2e,0xba8ee410,0x387c5ea2,0xbba04637,0xbbc66571,0xbb9ba29b,0xbb356e8c,0x3b255ba7,0x3c69614c,0x3c24eeb5,0x3bf7d141,0x3b5a01d5,0x3bfc1b98,0x3c150634,0x3b45b01a,0x3c1fa409,0x3c3a7bf3,0x3c3780c0,0x3c75937a, +0x3c654694,0x3c21dff6,0x3b2e047c,0xbb1e451f,0xbba9fb7d,0xba9f4e6d,0x3ac0fb8f,0x3b31629c,0x3bcabd12,0x3ba2d7ad,0x3a5f33a3,0xbbf0967f,0xbc5717c1,0xbc94301f,0xbc72b10f,0xbc2ce8a0,0xba03549b,0xbb48ce33,0xbb251e92,0x3b158160,0xbc0ef191,0xbc2b39b1,0xbbfc8181,0xbb92d9f2,0x3ac4d423, +0x3c662452,0x3bb528ff,0x3bb2db5b,0x3bb20587,0x3c869525,0x3c6e6274,0x3b932fe8,0x3c378737,0x3c4df5ad,0x3c6c993c,0x3cd41070,0x3cc0420c,0x3c588290,0x3bc31755,0xb9f99652,0xbbb723ca,0xbb4da6b8,0x3a30a6c4,0x3b17b3c7,0x3c0b6f60,0x3be1c08c,0xba7f8835,0xbc7b7b28,0xbcd72509,0xbcef7ed6, +0xbcb73190,0xbc149041,0x3ba9e844,0xba7f6591,0xbaed6d08,0x3b00d367,0xbc88ed3f,0xbca9d550,0xbc420cc5,0xbbca3fba,0x3bc1156c,0x3cf82a94,0x3d23a82a,0x3ce2d629,0xbb5b5dce,0xbc5670ad,0xbbd6fa28,0x3bdaf49d,0x3c53bb09,0x3cc5e31e,0x3d101469,0x3c1c7d14,0x3b0ff649,0x3c4c37ec,0x3b92890a, +0x3bde5975,0x3c4b00b4,0x3c71f327,0x3c7fb8ee,0x3c43bab2,0x3c2d4acd,0x3c39d46b,0x3c561489,0x3c84dcf2,0x3c7b618b,0x3c2a731b,0xbca164e1,0xbd0da4c8,0xbd13b45d,0xbc3c215c,0x3b44aada,0xbc1a328b,0x3cadd9ae,0x3ca32174,0xbc2852c8,0xbb993307,0xbb572bfc,0xbd0595db,0xbd919dd4,0xbd3f3c9b, +0x3d172ef7,0x3c8a78f9,0x3c2a8741,0x3c5f1744,0x3c01f82e,0x3bd0ad60,0x3c5406f9,0x3cb413c8,0x3ca18d97,0x3be34330,0x3c079013,0x3bb639ee,0x3b9df6bd,0x3b229ea0,0x3b17b8c2,0x3bae6b94,0x3a625724,0x3bb5c7fb,0x3c84faa8,0x3c9b665b,0x3c6c1a06,0x3bcd9345,0x3acb6098,0x3bb62af1,0x3cab75a5, +0xbac108a2,0xbc3c6aef,0xbc84e9fd,0x3b5cb264,0x3c182701,0x3a5214ef,0x3c3ed3e7,0x3d1ec5e8,0x3d2b0b6e,0x3d1f2b2d,0x3d00ffad,0x3c8dd820,0x3c7c1637,0x3c57df7a,0x3b181bfc,0x3c070c31,0x3c182516,0x3b8e00d0,0x3baa5ec3,0x3bcbe611,0x3c281c94,0x3b772575,0xbb39d039,0x3aa3040d,0xba8a2de5, +0xbb40fbe9,0xbb65761b,0xbbcba778,0xbb84a728,0xb986e1aa,0x3ade8338,0x3bdbc52a,0x3c15914a,0x3be59edc,0x3a17595e,0x3bf90fdc,0xbc9450f1,0xbcc0c296,0xbc4e0938,0xbb759c7b,0x3c36d0d0,0x3ca821b5,0x3cf30531,0xba76d12b,0xbc24d807,0xbc5dfadf,0xbc3b7f04,0xbbff618a,0xbb20e08c,0xbb7ac7f0, +0xbb6b3b78,0x3b665bde,0x3bd90586,0x3ba83fe1,0x3c18d9c0,0x3bdeb97c,0xb9fbb039,0xbad8093c,0xbb08cd30,0x3981816b,0xba95fedd,0x3a88b9b3,0x3be069ac,0x3c0c8f30,0x3c237070,0x3c1d7b5e,0x3be222ed,0x3b5224ec,0xbbba7a29,0xbc213b30,0xbb855e4c,0x3c89e44c,0x3c099178,0x3c955fd5,0x3d1a3ab1, +0x3d0539fb,0x3ccedb58,0x3c4d78e0,0x3c02589b,0xbb81be12,0xbbd266e6,0xbc7169a5,0xbc997a27,0xbc954b1e,0xbcab7723,0xbc8dc8e9,0xbc606610,0xbc32b0b7,0xbbf5f7ed,0xbc06dd45,0xbbeb4c4c,0xbbd91ef7,0xbc184677,0xbabe4d89,0x39a53db2,0x39eca379,0x398ae772,0x3a2ac9c3,0x3b11cedd,0x3aaf0fb7, +0xb884a8fd,0xbab867d9,0xb9332b75,0x3a5d7049,0x3b548b0a,0x3b00e953,0xb9379ece,0xbb8d00bc,0xbc26c36f,0xbc82a643,0xbcd56804,0xbc4d55db,0xbb57a02a,0x3a416007,0xbae92fc7,0xbc2356e2,0xbc312e4e,0xbc35ebb9,0xbc801dce,0xbcdb9f1f,0xbcfde0f5,0xbd0926a5,0xbd052464,0xbce23e58,0xbcbd4ebe, +0xbca34c0a,0xbca0943b,0xbc8d1d8a,0xbc574ffc,0xbb9b34b6,0x3a84984a,0x3bd89f7d,0x3ba0d821,0x3b89d457,0x3b64a8d7,0x3aa1046b,0xb9bb0c78,0xbb3365bb,0x39b7a99e,0x3b225fee,0x3b94ba54,0xb8791823,0xbb4fe028,0xbbcb986e,0xbb9bdc8d,0xbb57eb6f,0xbb91898a,0xbbc31ef7,0xbc0e707f,0xbc0da326, +0xbc27578b,0xbc62f419,0xbc64d1df,0xbc726139,0xbc4cb112,0xbc2c9176,0xbc316dc1,0xbc3d69e3,0xbc3e9d37,0xbc72a383,0xbc9d57a5,0xbcb1e64b,0xbc9b8c20,0xbc5787f4,0xbc41c7ab,0xbb898e40,0x3a5c8500,0x3c10ce11,0x3be67247,0x3bcbc7b7,0x3bbcc642,0x3b823595,0x3b3f57a2,0x3a98d278,0x3b21b18b, +0x3b5bc475,0x3bb07689,0x3a220a38,0xbb3d922f,0xbbd42a0e,0xbc31bb6a,0xbc80051a,0xbc9f93a2,0xbc9b5cda,0xbc91a93d,0xbc8ccafc,0xbc811cd9,0xbc86f4e5,0xbc9eaeea,0xbcac2f03,0xbca1e9ff,0xbca35d32,0xbc9e4cd4,0xbc9a030f,0xbc92ef08,0xbc83043e,0xbc5bcde1,0xbc373170,0xbc26e905,0xbc13e2cb, +0xbbfb4a11,0xbba2f54a,0xbb634a78,0xba9537bc,0x3a8a3912,0x3baa9a8b,0x3bbe5ef0,0x3badec6b,0x3bb36c92,0x3bad53c8,0x3ba918a1,0x3b95a987,0x3b9247c1,0x3b34ae6b,0x3ae89680,0x3a5be85c,0x391f7178,0xb96ecbca,0xbaa528ac,0xbb85b083,0xbbf66ee8,0xbc2ea78a,0xbc609a86,0xbc00231e,0xbc10d71e, +0xbc06efc1,0xbc03b1b0,0xbbf446cc,0xbbfdef8d,0xbbed6137,0xbbd10f45,0xbbb86e26,0xbba5e741,0xbb925d97,0xbb7554b9,0xbb52aa93,0xbb34240d,0xbb4fda25,0xbb52ddc7,0xba6b713a,0xba86961e,0xba396de8,0xba61af93,0xba585d0b,0xba7488d6,0xba7f99c2,0xba905604,0xba952a15,0xba8907cc,0xbacbb3d4, +0xbb068cbb,0xbb2d2f2d,0xbb540c0d,0xbb7e2715,0xbb850b9f,0xbba4eb76,0xbbb6c3eb,0xbbca7bb5,0xbbe41240,0xbb8095b3,0xbb0c8f28,0xbaec461f,0x39985b5a,0xb8774fd1,0xb9605a33,0xbab502b1,0xba411ebd,0xb95e52cc,0xbab31bed,0x39f769d8,0x3a4386bd,0x39c6094d,0x3a19d6db,0x39b34083,0x3a33f001, +0xbae33c40,0xbb2c47ee,0xbb1dbf5b,0xbb0d064a,0xbaef447f,0xbab36f9a,0xba7f341e,0xbaafede8,0xbb1d7e31,0xbb6431d8,0xbb866116,0xbb9c1658,0xbb5feeac,0xbb3da756,0xbb13c129,0xbb27b5ef,0xbb1f7747,0xbaa5549e,0xbb5ea0c4,0xbb775f33,0xbb5035c5,0xbb3be8cc,0xbb3221d4,0x3ace317b,0x3aa695ee, +0xb8f6efd3,0xbb381256,0x3b308995,0x3b4bba50,0xbaae4a15,0x3b1d041f,0x3b5054be,0x3b6371b0,0x3b49b53a,0x3b287dcd,0x3b77a951,0xbb005729,0xbb8b4e95,0xbb9f1aad,0xbb82d0f9,0xbb04aa77,0xba518123,0x3a23bac3,0xba0cf8b0,0xbb88a7b0,0xbbf1b202,0xbc1111c3,0xbc14a44d,0xbba1435f,0xbb208b0c, +0xbae4a9f9,0xbb2e9965,0xbb517aac,0xbab31366,0xbbd2a31c,0xbbf264b3,0xbbb49ff0,0xbb9cdb7d,0xbad05a61,0x3c23db4b,0x3bfecf79,0x3bac3089,0xbad2924f,0x3bbd605e,0x3beed6b7,0xb984e8ca,0x3c13b7f6,0x3c2c436d,0x3c12526d,0x3c137f74,0x3bfa86c5,0x3c071aa3,0xbac2427c,0xbbbbc4f3,0xbbd602a2, +0xbb9a4431,0xbad9a34d,0x3ab818ba,0x3b865876,0x3aeb4ca4,0xbb9ee383,0xbc364407,0xbc6f3ec4,0xbc841bc1,0xbc1403c0,0xbbb25c9c,0xbb4e49c3,0xbb7cb5ae,0xbb9339b1,0x3a86abb8,0xbc2bab8d,0xbc467df8,0xbbea050e,0xbbeaa89f,0xbb60942e,0x3c18fe30,0x3b9d0b4a,0x3aaab52e,0xbb3ca960,0x3c85333d, +0x3c8c86a6,0x3b943ef0,0x3c4ff7d3,0x3c5c50f1,0x3c640dd0,0x3cbb1775,0x3cabfb61,0x3c682e7d,0x3ae77e45,0xbbc90aaf,0xbc1a2cd4,0xbc008e58,0xbb58b13e,0x3adb11ce,0x3bda630c,0x3b35fa93,0xbc18a323,0xbca4177b,0xbccc1ad3,0xbcba23de,0xbc0fd52f,0x3aca6d97,0x3b323f06,0xbb1753be,0xbb97bdaf, +0x3a9fdd2e,0xbc829718,0xbc94e779,0xbc12fcb2,0xbc0230ad,0x3b64889f,0x3cd85aef,0x3d33df8c,0x3d17a031,0x3bd898ab,0xbc9dc0fb,0xbca3d59f,0xba1b9c08,0x3b46826d,0x3c7dbb26,0x3d1a2908,0x3c243c47,0xb9ef1694,0x3bc221d8,0x3b220048,0x3bc9b87b,0x3c08ac3f,0x3c3f75b8,0x3c5455e3,0x3c32a229, +0x3c18cf1f,0x3c10b1a7,0x3beeb16a,0x3c4486c3,0x3bd86567,0xbc128739,0xbcbc3f84,0xbcfc5a06,0xbcfca7ef,0xbbcd976c,0x3b50007e,0xbc5c8407,0x3c004f90,0x3b1ed34d,0xbcd1758c,0xbc453051,0xbcb6b794,0xbd0601f2,0xbd8f115b,0xbd5426f0,0x3cb6a1a0,0x3cb416ba,0x3c8c9611,0x3c285406,0x3be07e43, +0x3bd55b09,0x3bef84a9,0x3c978371,0x3c9adf87,0x3c0d8cf6,0x3bad1ba7,0x3b09a236,0x3bc1b839,0x3bba8726,0x3b86940e,0x3aa4d5c6,0xbacadaad,0x3a91dc86,0x3bac4644,0x3c3fcd1f,0x3c1ab763,0x3b7a9574,0xb969ae2f,0x3bb00aa7,0x3cc310f5,0xbc42f707,0xbca83f56,0xbc5087b4,0x3ba3073b,0x3c63b6d3, +0x3c863c53,0x3a0f891e,0x3d1ab3e9,0x3d53d956,0x3d539f0d,0x3d24983a,0x3c75b8e1,0x3bd177c4,0x3c271cb6,0x3c6181ed,0x3c4d0aeb,0x3c278f3f,0x3b81c0d1,0x3b718404,0x3b726f5c,0x3bd75202,0x3bb92855,0x3ad28330,0x3ab9c8aa,0xba76719b,0xbb8354fd,0xbbaffc61,0xbb72edd0,0xbb429870,0xbb80a6bc, +0x3c0fcca0,0x3c7fe461,0x3c8f8211,0x3c3ec650,0x3a681b57,0xbbf5a832,0xbc939e6d,0xbc90b7e6,0xbc9b6bf9,0x3cb7ebe6,0x3d036910,0x3c3f3fda,0x3cd3ec8b,0xbc5da93e,0xbca34b0e,0xbcd468a1,0xbc8cc7fd,0xbb028a3c,0xba2e518f,0xbb285323,0x37d2e973,0xb99dbfac,0x3afb711d,0x3b472b64,0x3b6580ce, +0x3aa10370,0xbb186dfd,0xbb616986,0xbba813d2,0xbb96bb68,0xba4f6383,0x3ac82753,0x3b0cec81,0x3ae16531,0x3b9df199,0x3bdee949,0x3c12aa63,0x3bc57aef,0x3a57bd34,0x35f680a0,0x3bf598e8,0x3c91a8c5,0x3cba4b95,0x3cdbe279,0x3ca0a44f,0x3cba9cac,0x3c8b797a,0x3c114613,0xbad401ac,0x3ad9e6ab, +0x3c13bdf4,0x395c3f6d,0xbb5068b5,0xbb937149,0xbb9b71c3,0xbb3f6bbc,0xbb61aea2,0xbb9ad229,0xbb956d11,0xbbf64bba,0xbc22eef7,0xbc1f5ea5,0xbbf322d7,0xbba954c4,0xbb17e6a0,0x3b514ebd,0x39afd71e,0x396482b8,0x3ac392ca,0x3ba3766a,0x3bb44748,0x3b56a894,0x3b2f94b6,0x3b0ad838,0x3b1e8403, +0x3b3fc87a,0x399e4077,0xbbb893e2,0xbb7b49f0,0xbb61de6b,0xbbdf4bcb,0xbb9da8ec,0xbb8ac29a,0xbac0f5df,0xbb3df7bb,0xbb935423,0xbc06dee3,0xbc4b30ab,0xbc958775,0xbcf7a6b4,0xbd08d643,0xbd097746,0xbcf7632d,0xbcd84cfc,0xbcb9e78e,0xbca107de,0xbc85e106,0xbc6cf6ef,0xbc68d736,0xbc1f20fb, +0xbbac2cbb,0x3af8627d,0x3b73a691,0x3ba1f1b4,0x3b653690,0x3b4585db,0x3abaa0de,0xb9d9d314,0xba9d68bc,0x39c50b27,0x3bcf4c64,0x3b913c21,0x3b21fa1d,0x3918a1d6,0xbb39d7ee,0xbb3a559e,0x3b07b16e,0x3a9126c0,0x399e790f,0x38c98bb1,0xbad4adb4,0xbb8f3bb0,0xbb839fb1,0xbbc8c47f,0xbbbf4db3, +0xbb9e9785,0xbc148c4c,0xbc675aa6,0xbc9b64d3,0xbca8f63a,0xbcb5aa79,0xbcc80885,0xbcbb10f6,0xbcaecb95,0xbca8650f,0xbc3d115c,0xbb8b5abb,0x3b844962,0x3b4a39da,0x3b60a4a5,0x3b8cd210,0x3b2edc36,0x3adbed0c,0x3a2b2774,0xb9b9f451,0xbaff2fb4,0xbb667bda,0xbb841461,0xbb7a7e23,0xbb60698e, +0xbbc1f7d8,0xbc0b99a3,0xbc396d31,0xbc1e7c8c,0xbbfa6498,0xbbc9b063,0xbbb87612,0xbc1a6c35,0xbc238a8b,0xbc56a32e,0xbc49b794,0xbc647d53,0xbc613a84,0xbc50a5a5,0xbc587d5d,0xbc371592,0xbc2be519,0xbc1d85d0,0xbc144978,0xbc0b1d03,0xbc0d6a79,0xbbfefd6a,0xbc05cb27,0xbbf56a83,0xbbd4f828, +0xbb87f940,0xbb9a065b,0xbb9a674b,0xbb8f1a37,0xbb8bde3b,0xbb853501,0xbb738031,0xbb67df72,0xbb7887b4,0xbb90fbb3,0xbb9e1677,0xbba063d6,0xbb9bae3a,0xbbae66fa,0xbbbe4dae,0xbbe9f07e,0xbc04a8e9,0xbc1024ac,0xbc037b83,0xbc01d5b5,0xbc03b589,0xbc02e40e,0xbc029454,0xbc002236,0xbc00aea7, +0xbc050839,0xbc05b72d,0xbc02e678,0xbbfad528,0xbbf62841,0xbbec055c,0xbbdf6bea,0xbbe79233,0xbbed7e85,0xbbabb4f5,0xbbbbaf6e,0xbbbc8582,0xbbc958e6,0xbbc00ee9,0xbbc28000,0xbbc15ecb,0xbbc18ffd,0xbbc2503f,0xbbbdd148,0xbbcab6aa,0xbbd17702,0xbbda4454,0xbbe44171,0xbbecc9a6,0xbbec9591, +0xbbf589b2,0xbbf5ca94,0xbbf74de8,0xbbfc72d1,0xbc0eeb32,0xbb22ac7a,0xbb1d110d,0xba8fff3c,0xba7f540a,0xba96e82c,0xbb4e1bf7,0xbac3ad04,0xbaa8ac66,0xbb1b83ab,0xba3ef522,0xb9e164c4,0xb9ed01ad,0xbab18067,0xbad228dc,0xb9c8b4f8,0xbb258d84,0xbb4be2a0,0xbb64ce6c,0xbb418306,0xbb272053, +0xbae3792b,0xbb02c15f,0xbb19e712,0xbb4d0c16,0xbb77cac3,0xbb7dbcd8,0xbb7caceb,0xbb0f714e,0xbaed74f1,0xbb0bdd98,0xbb2311af,0xbb283b45,0xbaed1559,0xbb5e78de,0xbb733084,0xbb4e1279,0xbb49b3e1,0xbb5d4ad8,0xba794988,0xb97e1e0a,0xbab26d94,0xbbaf85a1,0x3a2afc30,0x3b015717,0xba78358b, +0x3b079093,0x3b25b7fc,0x3b5f582e,0x3a26c379,0x3803dc81,0x3b443109,0xbb44ff82,0xbba15e07,0xbbbb68b6,0xbb94a929,0xbb483e6e,0xbaacf21b,0xbae29bb5,0xbb4ce355,0xbbb4308d,0xbbf96f20,0xbbf29eff,0xbbc740ab,0xb9ccaec5,0x3abe5f20,0xba4b6ca8,0xbb1d6de9,0xbb7a3e84,0xbb28fe53,0xbbc088d8, +0xbbcb0186,0xbb9bdf7d,0xbb9a4360,0xbb607275,0x3b7360e4,0x3ba63836,0x3b7b7433,0xbbbade97,0x3b4722bd,0x3b94e5a0,0xba409e49,0x3c044e5c,0x3c20179f,0x3c11f398,0x3b8ba2df,0x3b12d549,0x3c01b37f,0xbb6ab889,0xbbd4e215,0xbbed9f4b,0xbbb85812,0xbb4594b3,0x39c0b6ac,0xb9771562,0xbb3d225a, +0xbbeed0c1,0xbc3fa538,0xbc42958d,0xbc2cba55,0xba36037f,0x3b14da22,0xba2cfc72,0xbb0a7fbe,0xbb8c4575,0xba84b921,0xbc1276b6,0xbc263cf9,0xbbc99e32,0xbbeaf9c6,0xbbad37b7,0x3b03927b,0x3b1c29d5,0xbb15a78f,0xbc31b26c,0x3c35b29f,0x3c88c943,0x3bc28ffd,0x3c6f838f,0x3c804e82,0x3c6e3c4d, +0x3c8113bf,0x3c69cbc9,0x3c64b82a,0xbb1ef6e1,0xbc0c9d12,0xbc196f93,0xbbf94c6e,0xbb81f7c4,0x3aedf2b9,0x3a189a6e,0xbb939b91,0xbc54c687,0xbca3739e,0xbc9bfb4d,0xbc59e121,0x3bcaa3b4,0x3c643e50,0x3bbb1771,0xba6cf2b1,0xbbd01c8d,0xbb712cb2,0xbc532b9a,0xbc4526f9,0xbbd70be2,0xbbf4dc27, +0x38b15259,0x3c818dae,0x3d1c0004,0x3d1a2f58,0x3c651458,0xbc976d84,0xbcdfc30a,0xbc284e7c,0xbaf18b15,0x3c0b647a,0x3cd1bb16,0x3c19b3bf,0x3a3073f8,0xb9a06203,0x3b4cc4e9,0x3bd91568,0x3b12d5cd,0x3bb26673,0x3be82730,0x3c03f910,0x3b8d0659,0x3b86d650,0x3b8615bc,0x3bd78cfa,0xb7916ba7, +0xbc73b1c6,0xbcbc16b1,0xbcd2f30f,0xbc8f4edd,0x39a7b8d2,0x3bcc57a0,0xbb0111f5,0xb9306223,0xbc2cd10e,0xbcd3a655,0xbc6dfabf,0xbcdff56b,0xbd08dab8,0xbd6aca35,0xbd44cf86,0xbc3264c2,0x3caeb39a,0x3cdc56fd,0x3c714659,0x3b8ade1c,0x3b13c873,0x3b23ef11,0x3c44844c,0x3c734b07,0x3c31cd6a, +0x3ba7c52a,0x3ac6061e,0x3bacbb0d,0x3bcb26b4,0x3b74c79d,0x3a423638,0xb9163bf4,0xb9e83cd7,0xbb1bf6ec,0x3b3a8af9,0x3b3ff4a7,0x3b040cdd,0xb9c20697,0x3bb08fff,0x3cadbb37,0xbc47d7c1,0xbc952b2b,0xba986261,0x3b248d97,0x3c7050e5,0x3d0a5e02,0xbb078519,0x3ccd15ad,0x3d428834,0x3d2b1642, +0x3cf84876,0x3b81d849,0xbc22b249,0xbada6d81,0x3c952a5a,0x3c70a135,0x3c347ba8,0x3b115c8f,0x3ae74916,0x3a85f48c,0x3aee8557,0x3be2dada,0x3bbd1727,0x39cb8022,0xbab02317,0xbb789b6e,0xbb58fff8,0xbb2b7dc6,0xbb1fdaf4,0xbaae4da4,0x3c37337b,0x3c8b8060,0x3c98cb79,0x3c76055c,0x3b7a637a, +0xbc66504d,0xbbe9cf42,0x39964eeb,0xba9deacd,0x3cc257d3,0x3c8e7252,0xbc3c4cb1,0x3b9a770d,0xbc9b3cfd,0xbcc24ed2,0xbccd1715,0xbc8994c1,0xbacd2947,0x39cf7ef7,0x394a9bc9,0x3a96c566,0xbb14a71d,0xbb14cc38,0xba040bbd,0xbb4fd666,0xbb8fa1f3,0xbb142683,0xbbc0d746,0xbc063718,0xbbf2b972, +0xbb35e02b,0xbafa4ec4,0xbb9b798d,0xbb30d623,0x3a4cf023,0x3b5b62a7,0x3bb71665,0x3ba31e96,0x3c194f29,0x3c3eaf5d,0x3c8a58c8,0x3c8af44e,0x3ce9f6bc,0x3cc0c4a5,0xb932a194,0x39c76fb8,0x39f04d7f,0x3b03d6d4,0xbc01de89,0x3c87f109,0x3c9aadfd,0x3c41a61e,0x3c0cb0c2,0x3c02d868,0x3bd051a7, +0x3b9d746b,0x3b42c062,0x39493c7a,0xb9ca8bd0,0xb9cc66f9,0xbbda63c7,0xbc0fcd40,0xbbd7bd2c,0xbbd944e5,0xbb60310a,0x3a719c2c,0x3a41a1f3,0x3acd8cb3,0x3ae0c161,0x3babb206,0x3bc4cfac,0x3ba5ccee,0x3b612e60,0x3adcaf6a,0xb9feae49,0xbb03c9f4,0xbb898895,0xbbe27e26,0x397d99a5,0x3bf27ba7, +0x3c91364e,0x3c2a228d,0x3bd174f8,0x3c1d95b4,0x3c4c872c,0xbc253e7f,0xbc3f5a23,0xbc9d64c4,0xbccca16b,0xbcfd422a,0xbd056bfd,0xbcf2fad9,0xbcb6f0a8,0xbcb1c0c2,0xbca0476b,0xbc86fad5,0xbc54521d,0xbc2faee3,0xbc29129d,0xbc31aed0,0xbc193e02,0xbbaeca4a,0x3b13aae6,0x3bb501b1,0x3b8f2e91, +0x3b936e2b,0x3b887ceb,0x3ba2c6f3,0x3a422527,0x3aa8a804,0x3b8666ce,0x3baf2752,0x3bc91ec2,0x3b8b40fb,0x3b4bad79,0x3a42d718,0x3885a88b,0xba09425b,0xbad019d1,0xbbbd535b,0xbbe05c4e,0x39db093d,0x39c26a01,0xbb21c408,0xbba258f9,0xbbd6b93f,0xbc29a042,0xbc7d08dd,0xbca9a58c,0xbcac1778, +0xbca8a45f,0xbcb61a24,0xbca1328f,0xbca019ab,0xbc8b8f22,0xbc47ba2d,0xbbdd5048,0xbb38973c,0xba8a5312,0x3a94c94e,0x3ba92c8c,0x3b9c497e,0x3b84e926,0x3b850f0c,0x3b35b031,0x3aa4c26b,0xba458edd,0x386c8268,0x3a6bed6d,0x3b02ec91,0x3abf33ff,0x3ac9f034,0x3a9ec8e3,0x3ad1b7dc,0x3ae00dbb, +0x3b0fcf14,0x3a9b2b37,0xbbcbb387,0xbbc81d28,0xbbf73c1d,0xbbdc1433,0xbbf1a4aa,0xbbf0390c,0xbbcdd512,0xbbc3b2a3,0xbbb21ed5,0xbbb57d25,0xbbbdadb1,0xbbb94039,0xbbc0ba63,0xbbdd1e49,0xbbe3f8b4,0xbbec5e80,0xbbd94eb0,0xbbb57dcc,0xbbb4ba75,0xbb66c87d,0xbb794021,0xbb69aea5,0xbb659724, +0xbb573993,0xbb3b4a57,0xbb2639ff,0xbb429ae5,0xbb775eff,0xbb8ed7ed,0xbba0427a,0xbbb55b41,0xbbceafe1,0xbbcf06c3,0xbbd24028,0xbbd39512,0xbbd040d6,0xbbaa58ed,0xbb9ab392,0xbbc72ec2,0xbbd9da5c,0xbbf765e4,0xbbbe7e78,0xbbe1c530,0xbbfcecc0,0xbc04c6e4,0xbc09284d,0xbc0a221e,0xbc1171a0, +0xbc134375,0xbc161eae,0xbbfdf4a3,0xbbd4a947,0xbc00beb5,0xbbde1cf7,0xbbc6b851,0xbb9b8a63,0xbba3ece2,0xbba102a7,0xbba0052f,0xbb9e8169,0xbb9e48da,0xbb987063,0xbba42828,0xbba8eb3d,0xbbb0b2bb,0xbbb77e13,0xbbbc6c6b,0xbbc3d795,0xbbbb8445,0xbbb69106,0xbbb23b6a,0xbbacbf13,0xbbe1e9aa, +0xbaf8492f,0xbafbed59,0xbaa629da,0xba6fd262,0xba810c37,0xbb35c044,0xba8dfc3c,0xba98faea,0xbad586ae,0xba491d4b,0xb9e6b3c9,0x39547b06,0xbac8241e,0xbaee0c8c,0xb9cddfd9,0xbb0688ef,0xbb25b35e,0xbb6782b3,0xbb38250b,0xbb1fbc43,0xbad0605f,0xbb08938f,0xbb1bcb8f,0xbb3c033e,0xbb4c4cae, +0xbb3d9335,0xbb1dce68,0xba7704b6,0xba18e4c9,0xba845156,0xbac3e11d,0xbaf3222f,0xbb06872b,0xbb2e8f0d,0xbb385d3e,0xbb17d38d,0xbb172c54,0xbb15e183,0xbaa32ed3,0xb988f314,0xba201b79,0xbb855017,0x39895b65,0x3adf7d2a,0x3a6967ab,0x3b07b054,0x3b1c1895,0x3b8b4ae0,0x38f48b9d,0xba1b83c2, +0x3b10672b,0xbb1f7339,0xbb87f8ce,0xbbc8c306,0xbb947ed3,0xbb5dee92,0xbafdd526,0xbb58d3b2,0xbb92d260,0xbbb90143,0xbbd7ae4e,0xbbac096f,0xbb335109,0x3b130e7f,0x3b62fea6,0x3a88ebf4,0xba92cda3,0xbb4e9fc4,0xbb7086a2,0xbb9dccff,0xbb90b034,0xbb45b0cc,0xbb4f47a1,0xbb1b0382,0x39d91a98, +0x3b58eb3d,0x3b6f16bb,0xbba41add,0x3b1ad4cc,0x3b56c627,0x3ac1abfe,0x3be8b8b6,0x3c0f34a4,0x3c33f999,0x3b35c815,0x39b82a67,0x3be95ac0,0xbb5568f5,0xbbb033b7,0xbc0c07a6,0xbbd1cfb8,0xbb8ca166,0xbaa19d18,0xbb80e190,0xbbc47ad3,0xbc06f559,0xbc294562,0xbc089336,0xbbaaa272,0x3b84cfe3, +0x3bd46809,0x3b2d7150,0x3a5d5ad7,0xbb33b9a6,0xbb8d81b1,0xbbede552,0xbbfd4ecd,0xbb872c87,0xbb9da5aa,0xbb1152c6,0xb98cad36,0x3b3dbe0a,0xba7325d5,0xbc3005b5,0x3bd9904b,0x3c6b6e31,0x3c100dd6,0x3c7ea152,0x3c94048a,0x3c91f55c,0x3c25e072,0x3c0dbe57,0x3c5ba680,0xbb7ab9a3,0xbc041e1b, +0xbc203760,0xbbf27c99,0xbb93877a,0xba448a0e,0xbbcb5b68,0xbc2ef052,0xbc733051,0xbc8d4aef,0xbc4d4f04,0xbb820898,0x3c65fc7c,0x3c94d587,0x3c0a448a,0x3ac21d12,0xbbc24dc1,0xbc196cde,0xbc350f5c,0xbbea6655,0xbb3a3aee,0xbb74d990,0xbb5b1b0b,0x3b610d81,0x3cc1a5cc,0x3cf6564e,0x3c98baf8, +0xbc2e90f8,0xbcc60d85,0xbc7082e0,0xbb586173,0x3b914e4c,0x3c1dd11a,0x3c3306c2,0x3bb1ea3d,0xbba1570c,0x3b98dbb6,0x3be38549,0xbb05a647,0xb95e8119,0x379a6c34,0x3afa3d48,0x3a0588da,0x3b035a26,0x3b4ef5e8,0x3b0b45a8,0xbb8260a3,0xbc6780f5,0xbcb96ca3,0xbca615d3,0x3a246b1f,0x3beb1786, +0x3c197c40,0x3c2544b5,0xbb85b6f4,0xbc8e09c4,0xbca34108,0xbc56af86,0xbcb2f166,0xbc9b36d8,0xbd208aec,0xbd21899b,0xbd07b6f2,0x3c545da2,0x3cf78beb,0x3ca85c2c,0x3b7451e7,0xbb2586e4,0xbb618cb4,0x3b9608b2,0x3c1d97cb,0x3c2f0a16,0x3bce3f79,0x3b18120d,0x3b823d57,0x3ae9127a,0xb6e6dbad, +0xb82d403b,0xbabb5f65,0xbb1de8ed,0xbba629f1,0xbba1e52a,0xbb667e07,0xbaeb4a73,0x3b8c85f8,0x3c02a330,0x3c2aba1b,0xbc3b1d12,0xbc588c6f,0x3c2e1531,0x3bafe150,0x3c9e005a,0x3d3ec50e,0x39bdb846,0x3c3553c3,0x3d41c467,0x3ca472c8,0x3bfb692b,0xbb8b4497,0xbc905215,0xbc2f83f2,0x3c1b48f6, +0x3c439e86,0x3c2aed8a,0x3a74f711,0xba13ba0b,0xbae2b6be,0x3944f72d,0x3bbca418,0x3be4aa42,0x3a4113bc,0x3a8717ee,0x39c4bf24,0x3a3631d4,0xbb1e3aad,0xbac7f4a7,0x3b7ef950,0x3c1df5bd,0x3c577394,0x3c606a41,0x3c2f5ea5,0x3b870e61,0xbba9be6f,0x392a9b78,0x3c4b0b5c,0x3d077693,0xbb3a8df4, +0xbcd69138,0xbd0db432,0xbc930ce8,0xbc932e72,0xbcce6ce8,0xbc7b833c,0xbbf9c79e,0xbb1cb3c1,0x3b31c9ba,0x3b82c063,0x3af25fe4,0xb8f47ff1,0xbb4d0085,0xbb10ed40,0xbbb3f4d2,0xbbc21260,0xbb1f185b,0xbbe2ff9d,0xbc0f6ae3,0xbc024ab7,0xbbd6bc30,0xbbe42211,0xbc096abd,0xbbdf039f,0xbba4a348, +0xbb00f01b,0xba10fad0,0x3b8e75a2,0x3c5c89dd,0x3ca4ceb7,0x3cb75b9d,0x3c8c5475,0x3cbe18f3,0x3c6c7868,0x3b0e9908,0xbc0027dd,0xbbf7657d,0xbbb8bd6c,0xbc1a2858,0x3cd7977a,0x3c9135f6,0x3c71ba05,0x3c30747b,0x3c26a0d2,0x3c053a28,0x3baad755,0x3b2c4a9e,0x3aaebb40,0x3ae64971,0x3b937a8e, +0x38e57dbc,0xbb7ed6b8,0xbbe2e669,0xbbd8a609,0xbb9ca9ed,0xbb6547d9,0xb5e13e3c,0x3b0f000e,0x3b1ccd50,0x3b906ef8,0x3b9abe62,0x3b7d3c6a,0x3b2c3f82,0x39877dab,0xbb82051a,0xbbbdcf55,0xbb8c2daa,0xb9ec1294,0x3c0ccd51,0x3c7efe59,0x3cc9275b,0x3ca34af5,0x3ca6ecdb,0x3cd484fe,0x3cea6779, +0xbc6cf5bd,0xbc680aae,0xbcb7a4c4,0xbcd909a7,0xbcddd06c,0xbcc204e9,0xbc9be954,0xbc676c9d,0xbc7436c3,0xbc6880a1,0xbc3ee3d1,0xbc2b10e3,0xbc0b57b7,0xbbffad1f,0xbc1cf383,0xbc1d017b,0xbc14c89a,0xbb0ece9f,0x3afc6798,0x3b99d29b,0x3ba8c1c7,0x3bbda0e0,0x3bd57786,0x3b9dd7c3,0x3b818eba, +0x3b85d6b5,0x3bd58cc1,0x3bf65887,0x3bfad007,0x3bb6fe6a,0x3b662e82,0x3b13c671,0xba697adf,0xbb86dcf3,0xbc16c008,0xbc410eae,0xba15766e,0xba8e31bb,0xbb995e5e,0xbc07d888,0xbc504f28,0xbc6f6b3d,0xbc90b012,0xbca84f4f,0xbc9dbe93,0xbc8ed570,0xbc8ef295,0xbc621ee2,0xbc509102,0xbc146eae, +0xbc0df3a8,0xbbe4efb7,0xbbe37645,0xbb3bbc46,0x3aabd9bd,0x3bbe2a94,0x3bad9152,0x3bbaf3e1,0x3bcadfae,0x3bbd48a5,0x3bb45b16,0x3b9f8504,0x3badfbd8,0x3bbe08c9,0x3be197e6,0x3bdc26de,0x3bdea7d9,0x3bd5e362,0x3b96a2e7,0x3b3f2761,0x3aff34a3,0x3a6e3a24,0xbb4623ea,0xbb29d616,0xbb825b9f, +0xbb68d60f,0xbb81a4dd,0xbb8ad00e,0xbb88b367,0xbb8fc98b,0xbb87d988,0xbb8390fd,0xbb8bcf2e,0xbb8098d6,0xbb87c22e,0xbb93100e,0xbb9113d8,0xbb6f4eb9,0xbb3e26d8,0xbafefa45,0xbb0fc26c,0x384ccaf8,0xb9f80c0f,0xba2e35f9,0xba7dda1f,0xba99fdba,0xbaac1064,0xbab7345b,0xbaf00a45,0xbb24d9ca, +0xbb5b8b7e,0xbb84f16d,0xbb97b944,0xbba0ec79,0xbb8cf35c,0xbb715d2d,0xbb5eda65,0xbb55a974,0xb96d0ab7,0x39e169e7,0xba4da264,0xbac16d14,0xbb28f6f3,0xbacb2fc6,0xbb273b68,0xbb6617f4,0xbb66f46b,0xbb713bdb,0xbb6bf9ff,0xbb800bb3,0xbb7eb588,0xbb819201,0xbb247321,0xbacbaa8c,0xbb418833, +0xbaee26be,0xbaa93468,0xb9374bc1,0xba2357af,0xba2df680,0xba49cda0,0xba5a4e48,0xba74822e,0xba82182d,0xba9d7227,0xbaa69e55,0xbaaaa0a8,0xbaac9922,0xbabb1ca0,0xbaedbf80,0xbac17b6b,0xbaa89aa1,0xba7feaa3,0xba10ef2c,0xba175f18,0xba8d01c0,0xba82e59a,0xba540d15,0xb9f262c1,0xb9e5501f, +0xbac047ed,0xb9aac8f5,0xba19138d,0xba11c3be,0xba190e99,0xb99a648f,0x3a2d74c3,0xba7524d8,0xbaa2bb34,0xb9d738b1,0xba953120,0xbabd84a4,0xbb514a42,0xbb1542bf,0xbb04052c,0xbab57564,0xbaee270b,0xbb00c2ec,0xbb0df7f3,0xbb07022c,0xbad68685,0xba2f5e8c,0xb86c3feb,0x3942b03a,0xb91a9cb4, +0xb9e37a1c,0xba7511c0,0xbaed4364,0xbb04ff8b,0xbb087203,0xbac87192,0xbaa865ea,0x38ddd2ba,0x38db8575,0x3a87d706,0x3a9bfbd4,0xba6b90a8,0x3a864ef7,0x3b00a00d,0x3b2563b6,0x3aede24b,0x3af30732,0x3b8082b6,0x39ccc702,0xb9152f10,0x3a864a30,0xba7ea6a8,0xbb21b839,0xbbc21577,0xbb90a233, +0xbb819da6,0xbb45ee92,0xbb8d5663,0xbb9f7f20,0xbba33e88,0xbb99e338,0xbb2bf681,0x3a89d30f,0x3b67e5bb,0x3b790aac,0x3ae58b64,0x395c9eb7,0xbaebd08a,0xbb72a9f9,0xbb8bf2d5,0xbb615161,0xbab8bfbe,0xba493ee4,0x3997f481,0xb7278977,0x3b3af426,0x3b7ece9a,0xbab05820,0x3b59c326,0x3b517059, +0x3b8097cc,0x3badaaef,0x3bc9b789,0x3c316a25,0x3b38f49c,0x3a8274e4,0x3b9c0d47,0xba9ccfeb,0xbb3497fc,0xbc163ac4,0xbbdae7f4,0xbbb8f40d,0xbb7052fd,0xbbd37b8e,0xbbf30842,0xbbf91cce,0xbbf586fa,0xbb8a4049,0x3ac379d2,0x3bbdc9c2,0x3be5b0dd,0x3b656ab7,0x3b4e3714,0xba45cc5c,0xbbb8d876, +0xbbe686cd,0xbbe6ad61,0xbb3178dd,0xbae03730,0x3b8c9d5c,0x3b4357b2,0x3bd5f680,0x3b7d9d07,0xbb8fd448,0x3bbfe199,0x3c4cd439,0x3c454234,0x3c7b43f2,0x3c9a0602,0x3ca62a41,0x3bf6a653,0x3bc1f4ac,0x3c37a3c0,0xbaf7e90a,0xbbaa7a1c,0xbc3ddb0a,0xbc10adf7,0xbbf8d183,0xbbd18f3a,0xbc4709cc, +0xbc6afb4b,0xbc692ec9,0xbc4f120a,0xbba33709,0x3c023a96,0x3c8ec605,0x3c83d047,0x3bf04d2d,0x3b583b4b,0xbb57de38,0xbc3275e1,0xbc30e3c4,0xbbb50fc3,0x3a68e636,0x3b21dc68,0xbc076639,0xbc03358d,0x3ba60872,0x3c70b7f2,0x3c95c4e0,0xbafabd57,0xbc814734,0xbc6f7fac,0xbbd35f35,0x3a351759, +0x3965919c,0x3c671fe9,0x3c3d751e,0xbbc57b66,0x3b9cb451,0x3bbd215e,0xba4a231d,0xbb0ba12a,0xbb3a183c,0xba134a72,0x3ad33b65,0x3b773a0f,0x3b549dc6,0x3abe5358,0xbb9a382c,0xbc80023f,0xbcac9f2b,0xbc5ed882,0x3c5c9f58,0x3c30ec40,0x3c2535a4,0x3c4ed659,0xbc06f70b,0xbcaef3e8,0xbca2f875, +0xbc620a96,0xbc25dd65,0xbb054ad3,0xbc9696a6,0xbcdcfb16,0xbd0e13a0,0xb8929b4a,0x3ca78f1a,0x3ca06958,0x3bd424ec,0xbb18c408,0xbc08e5a5,0xbb0294c4,0x3b8f113f,0x3c053942,0x3bc6b637,0x3b1fe188,0x3b533d31,0xbb63144c,0xbbbadcd0,0xbbb72a27,0xbba0d2ca,0xbb8ed85a,0xbba3da6f,0xbc0c48be, +0xbbd5fc53,0xbb99d52e,0x3c552727,0x3c67d413,0x3aa0beb6,0xbc1fe13f,0xbc09f720,0x3c6a685c,0x3c5a00f0,0x3cd612c1,0x3d3929d4,0x3bcc5c80,0xbc1ba6d7,0x3d01715c,0xb7f11daf,0xbc37bd82,0xbb85a601,0xbc4544a3,0xbc144294,0xbb75bfee,0x3b6fa4b9,0x3bcf95db,0x3afe50e1,0xbb0ad6ca,0xbb620a0c, +0x39d6f551,0x3b2ffb2a,0x3ba91000,0x3b0fedb7,0x3b4c718b,0x3b732287,0x3b90ca34,0x3a7edde6,0x3b285204,0x3c114d00,0x3c1a7a29,0x3c26b5e1,0x3bfeb890,0x3b7f822c,0x3b40c2ef,0x3be4371b,0x3bb5a319,0x3c7466a7,0x3d2d6542,0xbcc4c540,0xbd512509,0xbd24d3d5,0xbd0298cf,0xbc25346b,0xbc90e538, +0xbbc150a1,0x3a1b800b,0x3aea99f3,0x3b111353,0x3b31e646,0x3a65f2b6,0x3a8ca4d8,0xbb631012,0xbb644f42,0xbb87ddf0,0xbb6ac697,0xbb404963,0xbba7eb88,0xbbda4bac,0xbc01915e,0xbc16c77d,0xbc22870a,0xbc0d6d36,0xbc1ee23e,0xbc174ee7,0xbbe3630b,0xbb6981a6,0x3bad1795,0x3c6c3018,0x3ca7aec9, +0x3cb5d83e,0x3cadd996,0x3c7f0ec8,0x3be39c62,0x3c19c464,0xba3dff8d,0xba4034b4,0xbb7a8966,0xbb8a1340,0x3c86a5ba,0x3b12650a,0x3be1280f,0x3bcd52ac,0x3c066f27,0x3c1558f8,0x3bd74042,0x3b0d596f,0x3adcf44d,0x3b2e6770,0x3bac835b,0x3bb256cd,0x3ab88555,0xbbc1d5e2,0xbbe15009,0xbbf62ba4, +0xbbe56cac,0xbb0d20d5,0x3abd39d4,0x3b6ed073,0x3b6148ec,0x3b78c622,0x3b8ffcaa,0x3b392b4b,0x394bb76b,0xbb45f794,0xba75b539,0x3b70ddf9,0x3c3685a7,0x3c74e62d,0x3c9a3541,0x3cb76559,0x3cb019db,0x3cbd176c,0x3cc9f58b,0x3cc419ca,0xbbea44f8,0xbc452e6c,0xbc82575d,0xbc9113cb,0xbc8fbab0, +0xbc33ba16,0xbbc3cac5,0xbba00971,0xbbadcaff,0xbbc9e37d,0xbbbf20b3,0xbc09354a,0xbc0529f2,0xbbfc00a5,0xbbd95a93,0xbbe98ae2,0xbc1cdfd7,0xbbdd5be2,0xbb5c09bb,0x3a96f935,0x3b4099cb,0x3b9ad860,0x3b9fa611,0x3bb77f93,0x3bb7a962,0x3b91a9a5,0x3b94ff20,0x3b907938,0x3bcdfe53,0x3bb780db, +0x3ba1bd90,0x3b604975,0x3af74f9e,0x39bacfd9,0xbb0fae42,0xbb766b3a,0xbb8faf11,0xbb980156,0xbc086ac5,0xbc45ef1d,0xbc8e9284,0xbc8f4098,0xbc95d322,0xbc9a9e41,0xbc880194,0xbc671846,0xbc4a2370,0xbc1ca6b5,0xbc043bce,0xbbbf931b,0xbbcc3eeb,0xbbc53402,0xbbc96444,0xbb518744,0xba0bf7f4, +0x3aa86d77,0x3b021ff0,0x3b786d11,0x3bacc649,0x3bb80160,0x3bc321a2,0x3bd35389,0x3bd6941d,0x3be088fa,0x3befb3b8,0x3bd3045a,0x3bb5ce35,0x3b880430,0x3aac7dee,0xba9bac7a,0xbb452d15,0xbb6c80c2,0xba80014e,0xba5fb213,0xbac055e3,0xbb111475,0xbb1e5862,0xbb3e5612,0xbb7a2856,0xbb9bbbe4, +0xbb935dfa,0xbb871ef2,0xbb8402a3,0xbb78afab,0xbb7420ed,0xbb621270,0xbb17c0e8,0xba6ac91c,0x3820178d,0x3a80d340,0x3b01c8a9,0x3b62c709,0x3b487e85,0x3b2b5d44,0x3b17cd25,0x3afbce58,0x3ad6062c,0x3ab377f1,0x3a50bc26,0x390e3525,0xba11b2bc,0xba9de9d3,0xbaceef61,0xbac15a4b,0xba7589d3, +0xb9bfe1db,0xb981d287,0xba14250a,0xba2beec0,0xba0aca79,0xba124028,0xba3b42bd,0xba525cac,0xbb09fc2c,0xbb0ea4ed,0xbb1d04ea,0xbb0564e9,0xbb02c3d2,0xbae6401f,0xbad477cb,0xbab11eca,0xbaa20b07,0xba7cb956,0xba6dc8a1,0xb90e3391,0x378930f6,0x389ceb35,0x39a7ab9e,0xb7a863c4,0xb90c7ade, +0xb9a9f788,0xb9d25a3d,0xba072025,0xba244a9e,0xba3faa99,0xba463cac,0xba450225,0xba2ea705,0xba3ca064,0xba875d22,0xba8f51b8,0xba9eb7d4,0xba972cb3,0xba6cc73d,0xba9ff677,0xb9bd8878,0xb8e52ab6,0xb9a7f9cc,0x389ec7b4,0x395127ac,0xb8a00a5a,0x3908ac67,0xb935b0d6,0x39a1c5d1,0xba008c04, +0xb9c25f06,0x3996db3f,0xb99536ab,0xb9df224c,0xb9c582ff,0xb8fea97d,0xb964eb99,0xbb0de09e,0xbab4c0e2,0xbab3fb90,0xba96d5df,0xbab2ead0,0xbab21ce2,0xbabd261e,0xba71337f,0xb9ba64cf,0x3a7fe15c,0x3a18cb2d,0x3a19d9f5,0x3934d832,0x39ae5f3e,0xb924053e,0xbaa76b78,0xbac8ada8,0xbac4a243, +0xba3e439a,0xb9b6ec5e,0x3b23dd99,0x3ab7e44c,0x3b19885f,0x3b1aab7f,0x3ad0d129,0x3ab3317b,0x3adc58ab,0x3b52109b,0x3a7d023f,0x3a264ce1,0x3aef7e78,0x3a17b98f,0x3a1cb425,0x391c4891,0x3a4bb8d2,0xb9ca09c3,0xbb8d5de5,0xbb6c87e8,0xbb80acdd,0xbb6db389,0xbb9150ca,0xbb9036f3,0xbb82483b, +0xbb11c32e,0x39a96f25,0x3b967043,0x3b89a8e7,0x3b5d55a1,0x3aa3036e,0x3a7e0a58,0xba08ed50,0xbb3a3e15,0xbb6f2e2d,0xbb2d4dbd,0x39b67e7b,0x3ade0f99,0x3b2ad70e,0x38c6510f,0x3b4238e8,0x3b80b522,0x3b1d2cf8,0x3b5ac2a6,0x3b0b2111,0x3b9b58be,0x3b072424,0x3afec13f,0x3bc8dfd3,0x3b261fa7, +0x3b1d687e,0x3b1b5266,0x3ac22468,0x3a4f145b,0xbbe043de,0xbbac8ec6,0xbbbe694b,0xbbaceb6e,0xbbe6f9ef,0xbbe25bb0,0xbbd1a5f6,0xbb72f719,0x398175d0,0x3c02aaa2,0x3bcbd401,0x3bc45a3b,0x3b1f9ce6,0x3b8d4c65,0x3a869554,0xbbaa0483,0xbbd8b56d,0xbbcb7bb1,0xba51a3e7,0x3a9199d4,0x3c299ee8, +0x3bb7db2f,0x3c12cf9d,0x3bf6923f,0x3b1fe9d5,0x3bb0e26b,0x3c1c7f49,0x3c68a364,0x3c5bec26,0x3c83e1b3,0x3c92bf01,0x3bda977c,0x3bb445b0,0x3c094c0b,0x3b0e62ab,0xba213c30,0xbc34c12b,0xbc1441bb,0xbc1d133f,0xbc2c109f,0xbc6e833a,0xbc6f94aa,0xbc4c531e,0xbbd1af82,0x3b69f436,0x3c9c1367, +0x3c9542f5,0x3c466204,0x3b69d41f,0x3b7f7ca1,0xb9ef5efa,0xbc16f7b4,0xbc18028f,0xbb810737,0x3bb04c78,0x3c139604,0xbc665e62,0xbc61aab8,0xbbdeb246,0x3b2f3144,0x3c63e6bc,0x3b9e9af1,0xbbebe1bd,0xbc704e95,0xbc35be2d,0xbb46293d,0xbafefbf8,0x3c84d175,0x3c7928eb,0xbbaee374,0x3b5c4d5a, +0x3b854748,0x3b9730e4,0x3a8dd9da,0xb9f31d90,0x3a1cffbe,0x3bc40691,0x3bf22b6b,0x3b9cfbe7,0x3a9adeef,0xbbcea380,0xbc8c8ed7,0xbc95ce11,0xbbd5b90b,0x3ca77c67,0x3c450b95,0x3c20bea3,0x3c42ff0d,0xbc32411a,0xbcb2e4a8,0xbcb41a99,0xbc8dedf4,0x3be9cd65,0x3c12dfbc,0xbb9189a9,0xbc999637, +0xbd0011a3,0xbc4e3e51,0x3bbf968a,0x3c50c5aa,0x3c231c24,0x3b00ef6b,0xbc20d841,0xbbe19e4a,0xb99a91ce,0x3bb74500,0x3b822954,0x3a901f22,0x3a6dae8c,0xbba9d38d,0xbbe95f9e,0xbc1766c9,0xbbb859ac,0xbb9d3cd2,0xbbac5d69,0xbc155569,0xbbb62fca,0xba22dbad,0x3ca42821,0x3c8f205e,0xbb3a1058, +0xbc01c810,0xbb90382c,0x3c488a30,0x3cacd8d8,0x3ce840fe,0x3cf7e477,0x3c644f54,0xbd101f39,0xbc22f1a6,0xbc2e676e,0xbc40183e,0xbb45f5c6,0xbb1b6d58,0xbb541433,0xbc43e44a,0xbb972ffb,0x3a1be544,0x3b61f476,0xbac0bf1f,0xbb5cf5b4,0xb9cc731d,0xba42af01,0x3af048b2,0x3b433fc6,0x3b24f9e2, +0x3b5254b8,0x3b21d2b8,0x3b8660e1,0x3bee467c,0x3c29bf3b,0x3c25c145,0x3c04199f,0x3b260327,0xb915b09a,0x3b6a4951,0x3c3718fe,0x3c9513d2,0x3c880991,0x3c1c87e7,0xbd023f5d,0xbd37db3a,0xbcea068a,0xbd1cba8a,0x3bdf5aa8,0x3ad6e8d7,0x3b43cf00,0x3bb083cb,0x3c0f935d,0x3b0fcb38,0x39d45f20, +0x3a5b2dc0,0x3a671e93,0xbb40cd9f,0xbb88665d,0xbaec2ee5,0xba2ba4e0,0xbb34eea6,0xbb08695d,0xbb86bdb9,0xbc031bdc,0xbc22998d,0xbc250a70,0xbc103096,0xbc25a647,0xbc1de0f1,0xbc05378a,0xbb1e66f5,0x3bad61c1,0x3c61ba41,0x3c89e852,0x3c90124a,0x3c9226d2,0x3bd81bc1,0x3a8d1adc,0x3bd45bdc, +0x3bd8e0d8,0x3c047a7c,0x3bd9aae8,0x3bf9740c,0xbbd324ec,0xbc555c7b,0xbb917c33,0xb8d81895,0x3b533ec7,0x3bfb3d9d,0x3bf81c73,0x3b839fa8,0x3b89b96e,0x3b956124,0x3b89599c,0x3bc54f69,0x3b55ee5e,0xbb305155,0xbbd6d98f,0xbc181461,0xbc0f2013,0xbbb306cf,0xbaaf4679,0x3af60b1e,0x3b18be3f, +0x3b5d971d,0x3b4b8acc,0x3b821f75,0x3b75403f,0x3b790513,0x3c081a07,0x3c599be4,0x3ca70266,0x3c9f7acf,0x3cab7f0d,0x3ca90190,0x3cab18a7,0x3c8656d1,0x3bc1e554,0x395bd5bb,0x3bd49200,0xbac2a9e0,0xbb696ff3,0xbb222967,0xba7d3d3d,0x3b571035,0x3bbc849f,0x3b84c9b5,0x3b826164,0x3af36a2d, +0xb98f9384,0xbba0760f,0xbbe0ae97,0xbbfa6cbd,0xbbc83deb,0xbbc9bd33,0xbbe43f84,0xbc0de0d7,0xbbefe1bc,0xbb824f6e,0xba211cd2,0x3b023073,0x3b111ea9,0x3b8f1706,0x3b95e0fb,0x3b43417c,0x3abbfcd1,0x3a2c4963,0x3b14bd44,0x3b35dd18,0x3b6f1187,0x3b91d277,0x3bac77f5,0x3bfe4b7c,0x3c3586dc, +0x3c239762,0xbc0540b5,0xbc17d275,0xbc3dfa8f,0xbc6f898e,0xbc9c414f,0xbc93a4b8,0xbc8a242a,0xbc8206e2,0xbc614dfb,0xbc3f41b7,0xbc18a64b,0xbc02d24b,0xbbe04175,0xbbcd9cb2,0xbbbca585,0xbbbb488e,0xbbafdfef,0xbb828150,0xbb306188,0xbb3e37ce,0xbaa0fe50,0x3ab17a6a,0x3b7a0fcc,0x3b50f501, +0x3b3bd4e9,0x3b509d10,0x3b600a48,0x3b768501,0x3b81818f,0x3b6066e8,0x3b269e73,0x3ab6a5ac,0xb9f1ef68,0xbb2fe287,0xbb9af940,0xbbe0bcd6,0xb9d7b091,0xba8e339f,0xbabd5f73,0xbb368de9,0xbb4cbae4,0xbb7ba900,0xbbb14a07,0xbbdfa76c,0xbbd7af9b,0xbbc782a4,0xbbb9c5dc,0xbbb5db8e,0xbba98165, +0xbb971a53,0xbb4bd92e,0xbb00aad9,0xba7e8118,0xb9211bd4,0x3abd26ea,0x3ab2f7fa,0x3ad36c60,0x3ad76923,0x3afca561,0x3b1389d4,0x3b3642fd,0x3b486f4f,0x3b3d1471,0x3b2eba53,0x3b23569f,0x3b0cea02,0x3b012abe,0x3b03f995,0x3ac5305a,0x3aad0671,0x3a8c7730,0x3a0ce66a,0xbb655dc6,0xbb7e9cc9, +0xbb656932,0xbb66c9f1,0xbb5a81d8,0xbba69793,0xbba20cc3,0xbba2555f,0xbb8e70d3,0xbb88bbad,0xbb7fb96e,0xbb648f85,0xbb4b677c,0xbb3ee4a3,0xbb497601,0xbb503e1e,0xbad6f329,0xbaf744be,0xbaec17bb,0xbafcce7c,0xbaf3a8f3,0xbaf8affa,0xbb016396,0xbaf8a1cb,0xbaf7dbbe,0xbae95b2b,0xbaf08a66, +0xbaed9437,0xbae784eb,0xbad20493,0xbac246a6,0xbaac28aa,0xbafa0434,0xbb212d84,0xbb43de88,0xbb59b49c,0xbb88f2d7,0x391e96fb,0x3a04e930,0xb7f4ec8e,0x3999a231,0x39f54884,0x3a4e1725,0x39494ef4,0xb96c1a91,0x3a04dd1c,0xba4b503e,0xba5afec9,0xba441521,0xb8adbb4d,0x38c585a7,0xb991fd37, +0x3a14b105,0x3a36d084,0xba6845b4,0xba1cdded,0xba548e6d,0xba5c0ccb,0xba5c9ed7,0xba392aa8,0xba3b8ab8,0x390bc0a1,0x3a4219a3,0x3b0b9a9b,0x3a8413fd,0x3a4f8418,0x392dd10d,0x3a66786c,0x3a0676fc,0xba520e48,0xba5d8379,0xba3de777,0x390a11ea,0x39d235f0,0x3b704cef,0x3ae3cddc,0x3b2048c8, +0x3b176721,0x3b3c6ef5,0x3a3b4977,0x39fdf846,0x3b2fe04d,0xba03a58f,0xba9c5ff1,0xba8c7f62,0x39a65edd,0x3a8ddc4e,0xb86811a7,0x3b088d3a,0x3ab4f412,0xbadf4b64,0xbb267d13,0xbb726002,0xbb790ae0,0xbb8240e2,0xbb5aa217,0xbb208c54,0x3a0962a4,0x3b4e1f42,0x3be5919a,0x3b8eafae,0x3b2e1c5f, +0x3978beb2,0x3acc1ccc,0x3a457052,0xbb016cfd,0xbb08c3bb,0xba8416a9,0x3b0ac883,0x3b5a9ec8,0x3b6963af,0xb8d7ec56,0x3b0bfdd1,0x3b453a0f,0x3ba6444c,0x3aed954f,0xb9a13cc4,0x3b5e4b6e,0xbb0cc593,0xbb3d12fd,0xba885205,0x3aa1615b,0x3b521975,0x3a8973d3,0x3b71669c,0x3b74a63c,0xbb112269, +0xbb4d9c39,0xbba7a0f8,0xbbb6e156,0xbbca11ae,0xbba7e037,0xbb8efa95,0x39f3d362,0x3b8f288e,0x3c457bc4,0x3bc255d9,0x3b9c6338,0x3a6e1651,0x3ba47714,0x3b431b63,0xbb8f73d9,0xbb856301,0xbb5612c5,0x3aed87f6,0x3b4df23b,0x3c4d6198,0x3bb8ad56,0x3c02c453,0x3bfef633,0x3bf3b5e4,0x3b4fe5e5, +0x3b9bdc00,0x3c49dcb6,0x3c108af2,0x3c20e802,0x3c1623be,0x3bc5cac2,0x3bdcb97e,0x3bce1a68,0x3bce3e69,0x3b90dd39,0xbbc8f302,0xbbf20f59,0xbc2ddfd0,0xbc53c291,0xbc6d102d,0xbc4bb223,0xbc0f80ca,0x3aa67b61,0x3c444757,0x3cd23a5e,0x3c898f94,0x3c041157,0xba1dbadf,0x3b92ba69,0x3b2451b6, +0xbbeff9ff,0xbb90af03,0x3a2f40c1,0x3c1e919c,0x3c517140,0xbc8f905f,0xbc67eab5,0xbc51c817,0xbba7d625,0x3c18e38b,0x3be50d96,0xbac9aaa3,0xbc620348,0xbc4b5886,0xbb82ee52,0xba291396,0x3c6e7e7c,0x3c5b966a,0xbb313302,0x3a5d00d1,0x3ae4a39e,0x3c13e437,0x3be35d9c,0x3bd0a6c0,0x3c08c670, +0x3c5c5367,0x3c3e99dc,0x3bd781da,0xbadc4556,0xbc348c7b,0xbc923cd2,0xbc700c07,0x39aa8cf1,0x3cc314e9,0x3c59888e,0x3c200d3f,0x3c46fd89,0xbc25fb3f,0xbc972054,0xbc9f5f72,0xbc9ad4a8,0x3c90db06,0x3c647de3,0x3bd74533,0xbc25d9b3,0xbce34c54,0xbcad7829,0xbbdf3a3b,0x3ba5613b,0x3c1e4219, +0x3b8e09a3,0xbc021f4b,0xbc19ed16,0xbb83ca95,0x3b73a27c,0x3a437c45,0xbab97fc5,0xbb1fb600,0xbb449082,0xbb6eb6cd,0xbc065462,0xbb820ccd,0xbb982ea6,0xbbae99af,0xbbee0574,0xbabaf687,0x3c20ed3c,0x3cada189,0x3c609ea5,0xbbe6dd75,0xbbf67604,0xba24250b,0x3c32e43b,0x3cd28178,0x3cd320c9, +0x3c2f5826,0x3c66b7d9,0xbd460761,0xbd5b404d,0xbc795970,0xbb5436f1,0xbbeb8ac0,0x3bcd3234,0x3b40beb6,0xbc575e70,0xbc031a88,0xbb3fe856,0x3b3d59ae,0x3aa28232,0xbac929ef,0xbb353c60,0xbb435b75,0xb9399965,0x3b76fe2e,0x3a964668,0x38a920ee,0xbb0c630c,0x3b8f2f54,0x3bfed0c2,0x3bfef3dd, +0x3bfa8b2c,0x3b85af9f,0xba87e51f,0xbb07a884,0x3b3586d6,0x3bb799cd,0x3cf594be,0x3ca79eaf,0xbcc4b44c,0xbcd6bdf4,0xbcd499e7,0xbca12298,0xbd09128f,0x3cc6e59b,0x3cd109a7,0x3c76d899,0x3c22be18,0x3c390211,0x3b103a0d,0xba1163fa,0x3add7614,0x3a55ccca,0xba852e59,0xbb6e0739,0xba923caf, +0xb7c711e3,0xbaaafc91,0xb87db562,0xbb28194a,0xbbeb968e,0xbc198eba,0xbc1946b1,0xbc1705fb,0xbc10c0ac,0xbbfbd077,0xbbca6963,0x3a606b9b,0x3bd04af6,0x3c5df5bc,0x3c53288d,0x3c353a06,0x3be58c0e,0xbb89f5ab,0xbbaffb6a,0xba0f65b2,0x3b9df3fb,0x3be59e1b,0x3c2cf4d3,0x3c834b79,0xbcb527c4, +0xbca1007c,0xbc36d1cc,0xbb556c6c,0x3ac780eb,0x3b8aaef3,0x3bae66a0,0x3bb0b58c,0x3bbc6684,0x3bb5447d,0x3b420d62,0x3b5f6200,0x3b10cd57,0x3a7c066f,0xbbbd4280,0xbc1c4344,0xbc1b50dd,0xbc10da98,0xbbc33a3b,0xbb6361b7,0xba61636d,0x3addb2cf,0x3b0042a6,0x3b9a0adc,0x3beb6379,0x3c373878, +0x3c6c3ec6,0x3c924753,0x3cb948b7,0x3ca60541,0x3ca06d93,0x3c82b887,0x3c8ae888,0x3c0c83bb,0xbc0f2789,0xbc9139b3,0x3c87924b,0x3c2c02c0,0x3c1471a3,0x3c218608,0x3c393e4d,0x3c53f83c,0x3c53a59c,0x3c2d2e20,0x3c28c927,0x3bff11f2,0x3b9163d3,0xb9bdb4e7,0xbb8f428d,0xbbf787d6,0xbbe128af, +0xbbcc1e40,0xbba53b3e,0xbbed8030,0xbbeab468,0xbbcea0fd,0xbb418e8c,0xba22b927,0x39681daa,0x3b07c33c,0x3b027563,0xb95e4327,0xbabc4b08,0xbad96ea2,0xba719b6b,0x3a6aae47,0x3b3e87d3,0x3b9e8748,0x3bf174ac,0x3c3de468,0x3c8ebcea,0x3c93df0a,0xbc0a1e79,0xbc338620,0xbc431f51,0xbc5d2f20, +0xbc8519c1,0xbc729ecf,0xbc50ace2,0xbc36f141,0xbc2a5394,0xbc1a357e,0xbc069bc4,0xbc00ae2f,0xbbf353ba,0xbc03cc4d,0xbbe96c41,0xbbf348d1,0xbbf35573,0xbbdfdd35,0xbbca4a72,0xbbd2bd74,0xbb91c53e,0xbb107b89,0x396d4aec,0xb9b61d8f,0xb9e98d69,0x38938a16,0xb9c7328d,0xba5501cd,0xbabad116, +0xba617e61,0xba28d4a3,0x3820755a,0x399eed22,0xb97b81c4,0xbaae1215,0xbbb9864c,0xbb2e2989,0xbb83bf3e,0xbb8638eb,0xbbb9c919,0xbbc9a1df,0xbbe2c4d1,0xbc0b8ebd,0xbc214741,0xbc1acc81,0xbc0fbadb,0xbc04f996,0xbc01677f,0xbbf168be,0xbbdb5327,0xbbb59811,0xbb9c8c78,0xbb80a384,0xbb53b0ce, +0xbafcc132,0xbb2198f7,0xbaea2273,0xbaa51f2b,0xba08518c,0x39e33ffb,0x3ac5bf5b,0x3b22a2e8,0x3b2a8ead,0x3b3fc86b,0x3b4e3193,0x3b4caece,0x3b421a8e,0x3b3137bd,0x3a670485,0xb9eb4e27,0xba986082,0xbadfa03a,0xbbc51b1e,0xbbdb86d6,0xbbccc898,0xbbce258b,0xbbc95b55,0xbbf67b3c,0xbbf58329, +0xbbfb2dd0,0xbbe474a8,0xbbddb380,0xbbd46608,0xbbc507eb,0xbbb7dead,0xbbaf1dab,0xbbb2b870,0xbbb1f64a,0xbb894431,0xbb90aa72,0xbb8b1849,0xbb909429,0xbb832056,0xbb79d441,0xbb6f2d46,0xbb5e4739,0xbb526836,0xbb3cf670,0xbb431c87,0xbb448c1d,0xbb43c0cc,0xbb40203f,0xbb381b72,0xbb1a87d6, +0xbb4b56e9,0xbb759204,0xbb987cc3,0xbbb2017a,0xbbcf48ac,0x3a70ecb8,0x3a9e397d,0x3a0427c2,0x3a16e3f6,0x3a446855,0x3adce75c,0x39dfd4ab,0xb8c46031,0x3a45ea6a,0xba6aa32f,0xba903170,0xbaa7fad0,0x389febdc,0x3a077831,0x38d67759,0x3a9b8e6b,0x3ac67346,0x3a22cd1d,0x39a28f5a,0x3618e608, +0xb8d9fb48,0x3882fd55,0x39ad96bb,0x3a0ea200,0x3ab90f7e,0x3afcbde6,0x3b410260,0x3aee475f,0x3ac82b97,0x3a30b93e,0x3aeb2145,0x3ac40140,0xb89fc339,0x39833faf,0x39f284ba,0x3ab4cd2f,0x3aab781d,0x3b82eb83,0x3ae6fbaf,0x3ad4b095,0x3ad5f022,0x3b8573d6,0xb8ae6c26,0xba560d1a,0x3affad6a, +0xbb08a11e,0xbb423538,0xbb3bf460,0xb935e446,0x3a970c01,0x398f2855,0x3b3aa2ba,0x3b360569,0x3ab16b8d,0xba8988b4,0xbb3b8bce,0xbb42fb58,0xbb265d17,0xbaa74fea,0x399f8af8,0x3b65cc6b,0x3bb905eb,0x3c022e09,0x3b9c35fa,0x3b385753,0x3974cde1,0x3b397e73,0x3b264028,0xba2fb851,0x398d0af0, +0x3aaf9ad3,0x3b8b3833,0x3b90efa5,0x3b7f08a5,0xb987fe9d,0x39dc4196,0x3aae224e,0x3be980bc,0xb98addb9,0xbb3a332e,0x3aece355,0xbbc7b870,0xbbeb5938,0xbbd82407,0xba7f6ee5,0x3b236c7c,0x39ad6081,0x3b98c0f5,0x3bab67a5,0x3b3813e2,0xba66753e,0xbb76edee,0xbb99f11d,0xbb7ffa35,0xbb0dfd90, +0xba0d71cb,0x3b9ec10e,0x3c02e48c,0x3c55a157,0x3bd8349a,0x3baf85ba,0x3a95276a,0x3bdcffcd,0x3baf2f83,0xbb4bf107,0xba0eb356,0x3a305c98,0x3ba9add7,0x3b9d3adc,0x3c41498d,0x3b8aa62b,0x3b830018,0x3ba8a0fd,0x3c3c0dd2,0xb9ec7cfa,0xbab77a99,0x3bf44a98,0x3abb0c23,0x3a787add,0xbadc96e5, +0x3b8d8835,0x3bea9dc0,0x3b9e3158,0x3c0add81,0x3c094e27,0x3b0b1519,0xbb89fca1,0xbc299597,0xbc54fcea,0xbc3af277,0xbbefaee5,0xbadc38da,0x3c1e3770,0x3c997e35,0x3cd53723,0x3c7419b1,0x3bc92ed0,0xbae7999a,0x3bd3acfb,0x3bcb2684,0xbb885abe,0x3aebc617,0x3bd1ce77,0x3c68084f,0x3c684c67, +0xbc93b768,0xbc441de9,0xbc81674f,0xbc2a5e5e,0x3b9b232c,0x3bca0068,0x3af35512,0xbc0ea8cf,0xbc0b2242,0xbb0cff2a,0x3982f1cb,0x3c1186ab,0x3bfaea15,0x3af4a559,0xbb002053,0xbac66f62,0x3c113a8d,0x3c338c08,0x3c673940,0x3c91f28e,0x3c97b896,0x3c5b5d50,0x3bd55966,0xbbc840fe,0xbc78d5e7, +0xbc82923b,0xbbf8548d,0x3c160055,0x3cd64dc2,0x3c848232,0x3c1ff47b,0x3c0a2025,0xbc0873d7,0xbc5a115e,0xbc5a67b7,0xbc8c6d1a,0x3c852022,0x3c870c07,0x3c92c9e1,0x3b3748dd,0xbcb48a74,0xbcc04cf7,0xbc64351e,0xba86988c,0x3bb7fa6a,0x3b43012f,0xbb9d2cb1,0xbc0b98cd,0xbbbf4408,0x3af56dfe, +0xbb0a1b52,0xbb337996,0xbb888143,0x3a56fbb9,0x3ad19ed1,0xbb299bc4,0xbad4b433,0xbb7405cd,0xbb2f7ea1,0xbb5d91ab,0x3b8ad064,0x3ca4041a,0x3c7e86c6,0x3b47a341,0xbc761546,0xbc0541a4,0x3b5c7bd7,0x3c51da24,0x3ce9bd97,0x3cb4df2f,0xbba52b36,0x3bae0252,0xbd21e1e7,0xbd9c461f,0xbcedbddc, +0xbc0bd070,0xbc4d7fb3,0x3c06de6d,0x3bc5773c,0xbbf5c876,0xbbec8404,0xbb898bf5,0x3ae6fb6b,0x3b5dfc60,0x39dbbbbd,0xbb9a2431,0xbb691b61,0xba83ca3b,0x3b73f24e,0x3ac3999b,0xb92c0c57,0xbae3639b,0x3b6491dd,0x3ba9c0db,0x3b8cfcb2,0x3b53c6e4,0xba41cc62,0xbb744b0f,0xbb882056,0x3a905e01, +0x3b1ab3bc,0x3ced3372,0x3c88e860,0xbd08297d,0xbcb60d81,0xbc890472,0xbc4f883f,0xbc828321,0x3cfeddcc,0x3d2f762b,0x3cef531f,0x3c88aa1b,0x3c09a636,0x3b64de6e,0x3af92c62,0x3b18c14f,0x3a96f53a,0x3a7254cd,0xbb087821,0xbad93625,0xba291812,0x3a58431c,0x3a49e4f0,0xba8c1fa9,0xbb8713cc, +0xbbe001c7,0xbc023555,0xbc01e3b6,0xbbd05ad4,0xbb8f674f,0xbaac0dcf,0x3b6cf976,0x3bfc2675,0x3c43fb2a,0x3c1c9342,0x3b8cafe0,0xbbb83f91,0xbc1bf402,0xbbf28847,0xbb86df2b,0xba47c610,0xb8283455,0x3ba9b0b9,0x3c67666b,0xbcbdc7e9,0xbc8bef5b,0xbc586d1d,0xbba2717e,0x39540649,0x3996be2a, +0x3ab21008,0x3bb026ae,0x3b99e629,0x3b7474ef,0x3ab278c7,0x39b3c3b3,0x38284fc8,0x3ac80e68,0xbb9f7f3d,0xbc08027f,0xbc2c0cc1,0xbc2b064f,0xbc19d64f,0xbc0c7bca,0xbba41f62,0xbac6903b,0x3a2f3f55,0x3b8b1420,0x3c0b0771,0x3c6ded98,0x3c7d358e,0x3c8f4b33,0x3ca0339c,0x3c957b3c,0x3c7ebaba, +0x3c25455c,0x3c0d2ba5,0x3aa4d4c2,0xbc397823,0xbca387bc,0x3c8e29e2,0x3c77a49d,0x3c7b94f2,0x3c74c801,0x3c6dc85a,0x3c69e216,0x3c51e837,0x3c3baea6,0x3c3d5228,0x3c299101,0x3bfbb109,0x3b86bba0,0xba22c390,0xbbb894f9,0xbbd56ee7,0xbbc487b7,0xbb8931c5,0xbb962e4c,0xbb980c70,0xbba0247f, +0xbb4e5c54,0xbb124a63,0xbad59264,0xb8441ea8,0xb9a9bcfe,0xbb05f4a7,0xbad18d6d,0xba087414,0x3a1998a6,0x3b2210ca,0x3baff024,0x3c05f01f,0x3c2360db,0x3c47f3a2,0x3c80cf2f,0x3c89e65e,0xbbcb62a3,0xbc11248c,0xbc15aa80,0xbc1ac574,0xbc310ae7,0xbc0f6868,0xbbc849d9,0xbb871d4f,0xbba63d9f, +0xbbb20a72,0xbbcde4f4,0xbbdaff1c,0xbbfd01f7,0xbc0ef16c,0xbc0769c6,0xbc0b8070,0xbc11af25,0xbc073138,0xbbf64936,0xbbdfbbe2,0xbbb681c3,0xbb8f54c5,0xbb472bf5,0xbb34145d,0xbb076cad,0xba8eff3e,0xbacb6b8a,0xbb06c3d0,0xbb28d3ca,0xbb167e79,0xbb056f32,0xba582a72,0x389bc3e9,0x3a2e8d07, +0x39fe2ac3,0xbb5cbdd5,0xbbd643d6,0xbc00e763,0xbc01c7da,0xbc117999,0xbc1b8299,0xbc26964d,0xbc3a253b,0xbc491e28,0xbc3dd60d,0xbc2f045b,0xbc21f333,0xbc16b4a3,0xbc0acdf5,0xbbff446c,0xbbee8e43,0xbbdf073e,0xbbcd4873,0xbbbd8b25,0xbba91322,0xbbb41e5b,0xbba1b933,0xbb8ea464,0xbb726761, +0xbb369a3e,0xbafafe1a,0xba70dd4f,0xba7a25b3,0xba2e832b,0xb9f3ff11,0xb97f4a42,0xb9567e7b,0xb9d75460,0xbb19ac7a,0xbb86cf67,0xbbaa4612,0xbbbe8a2b,0xbbe66ddf,0xbbfcad3d,0xbbf4c6b4,0xbbf9cf08,0xbbfb5f39,0xbc04bad7,0xbc07c880,0xbc107ed8,0xbc058167,0xbc020b30,0xbbf9867e,0xbbeea78e, +0xbbe25dfb,0xbbd6193f,0xbbd29278,0xbbcee105,0xbbc2cc2b,0xbbc3a6b2,0xbbbe9213,0xbbc11105,0xbbb0c607,0xbba640f3,0xbb9c3e78,0xbb92d506,0xbb8b0c9f,0xbb7decb7,0xbb822d27,0xbb839f11,0xbb86122d,0xbb8a41e6,0xbb8d2459,0xbb84b8a8,0xbb96cfc5,0xbba32c9d,0xbbb98717,0xbbd0f4f3,0xbbd2bb30, +0x3acf1324,0x3aecd89c,0x3a8c84e7,0x3a7586be,0x3a8860fb,0x3b1f56ff,0x3a3f147d,0x398facba,0x3a966084,0xba34a6d6,0xba8109c6,0xba81f96d,0x3985dcaf,0x3a491d3f,0x3a13e39a,0x3ad03420,0x3b00f029,0x3aefdad2,0x3a8c1286,0x3a49bbf3,0x3a1bfc88,0x3a6aa383,0x3aa7a677,0x3af3fe29,0x3b20a9df, +0x3b36887b,0x3b558921,0x3b20bd57,0x3b0ff7e0,0x3abe9078,0x3b1d40c0,0x3b0bb0fe,0x3a3f9452,0x3aa2209d,0x3ac6dfe8,0x3b1f8bc7,0x3b0830fd,0x3b806525,0x3aea1002,0x3a5f9748,0x3a843a05,0x3b96fac9,0xba0c9e14,0xbad41ca0,0x3aa0f85d,0xbb527d60,0xbb84c438,0xbb504768,0xba6d3eef,0x3a27c005, +0x3a0a8a36,0x3b49e8ef,0x3b681b7a,0x3b5c385b,0x39e9af13,0xbab86eac,0xbaccef90,0xba499e29,0x3a811c2b,0x3b5ea64a,0x3bc08a80,0x3be91316,0x3bf32228,0x3b9840fb,0x3b3ce28b,0x3a82d5dc,0x3b675d13,0x3b68d23a,0x3a5fbb64,0x3b14ad0a,0x3b530e85,0x3bba0920,0x3ba06739,0x3b8c204d,0xb7520a9c, +0xba60b869,0xb9665f70,0x3bf8aa2a,0xbaea103b,0xbb89c921,0x3a3d4e02,0xbc0cb139,0xbc229777,0xbc0b8e0f,0xbb67a8fe,0x39aed318,0xb9f259b9,0x3b8db87a,0x3ba7a939,0x3bb192c9,0x3a389b06,0xbb0fef47,0xbb511e8f,0xbad208b8,0x3a3e1ba8,0x3b8564d9,0x3c06faf6,0x3c26fa77,0x3c41426d,0x3be5eca6, +0x3bc40515,0x3b41693b,0x3bea6286,0x3bc2b321,0xba8beb75,0x3b1b08ac,0x3b81c1d5,0x3c000d53,0x3bca2ba7,0x3c24f8d2,0x3b4634d7,0x3846f9b6,0x3ad46629,0x3c511cac,0xbb8201db,0xbbe3402a,0x3b10ae19,0xbbca39cd,0xbbf8e8d5,0xbc14b92c,0x3a4b7ab8,0x3ba479b9,0x3b8550f3,0x3c0e0635,0x3c274c26, +0x3c0f0ff3,0xba4acbe2,0xbbfbc29e,0xbc24b285,0xbbdb4124,0xba6812c9,0x3bf115ee,0x3c86e443,0x3cb4061e,0x3cb1e14f,0x3c399102,0x3b859359,0xb938fcd9,0x3be279fa,0x3bfa7eab,0x39c7afb3,0x3be43c59,0x3c2cf16a,0x3c895e51,0x3c649ea2,0xbc6bb0ea,0xbc131a0b,0xbc7d4af6,0xbc462445,0x39e002db, +0x3bba2883,0x3bba6fda,0xb88d23d2,0xbb3c69e1,0xba58ce8a,0xba69df85,0x3adbd522,0x3afc1abd,0x3bb96f79,0xbba65b0e,0xbbc8699a,0x3b6d9642,0x3c1cda7a,0x3c7c4fb7,0x3c9b0826,0x3c7e6532,0x3c186e06,0x3ae4b83a,0xbc1e2f32,0xbc6be42c,0xbc3344ef,0x3bd4970b,0x3cb42ee9,0x3cd3d887,0x3c9602d0, +0x3c020076,0xb9efb38d,0xbc0f82dc,0xbc2173e6,0xbbfc474b,0xbc45c0df,0x3bf4a485,0x3c7e4827,0x3cd62e8b,0x3c709441,0xbc564e55,0xbcbd106a,0xbc9baab6,0xbbcffa4c,0x3a10b66c,0x3a4af4f1,0xbb23886c,0xbbb01026,0xbbc00dc9,0xba62002a,0xbb4629ed,0xbaa4053d,0xbb3cb07e,0x3b83ff38,0x3bb772f0, +0x3b7dbd98,0xb959c4bf,0xbb097234,0x3ad5063a,0x3b260120,0x3c1d4026,0x3ca9ec2f,0x3bc2f52b,0xbc0bcf91,0xbcbe6af9,0xbc0f536d,0x3bca3e8b,0x3c6794c5,0x3cc8ccbc,0x3c697da0,0xbc8fcbe7,0xbbaf5e10,0xbc9575f0,0xbd96cc26,0xbd4c2416,0xbcec08ae,0xbc154896,0x3ae3c2ab,0x3ae4c533,0x3a2b7f9a, +0xbb88ce7a,0xbb6942f3,0x3a51914b,0x3b552f84,0x3a9c04a2,0xbbb3b1b0,0xbb5cc14e,0xbb0c84cb,0x3adf654a,0x3b31ab78,0x3b2529f7,0x3b2304c9,0x3b6d410a,0x3b1fc56a,0x39a88df6,0xbb217b58,0xbbc2621b,0xbbcb3df9,0xbbd21069,0x3a1410ed,0x3c0911fa,0x3c76f664,0x3b11f9e5,0xbccc08f5,0xbc5a4120, +0xbbe4ee70,0xbbf94022,0x3bad8052,0x3cabe2cb,0x3d240bf9,0x3d1a9aed,0x3cc6c922,0x3bffaa4c,0x3bd90abf,0x3be03791,0x3b5b88e1,0x3a0c082a,0x3a2b4b11,0xba72384b,0xbb07b8fa,0xba85ffe4,0x3ad2179b,0x3a85c184,0x3a61aadc,0x39a7ea28,0xbb25e4e2,0xbb9e6a6b,0xbb984a79,0xbb57d177,0xba5e4377, +0x3b7b3706,0x3b9f5edf,0x3bf5e307,0x3c086eba,0x3bc0e3cf,0xba66a190,0xbc355fef,0xbc253b66,0xbbddbf15,0xbb9b0220,0xbbbebc22,0xbbba8b05,0x388a2282,0x3bb8feb9,0xbc5a7d3b,0xbc2ca7c0,0xbc46e0df,0xbbd7e444,0xbb0c4c82,0xbb1d8f92,0xbac7ab99,0x3b8d2ed3,0x3b09fdd1,0xb7e74ec6,0xbabb88ac, +0xbae16d50,0xbac5e5ec,0xb98d083d,0xbb616f2c,0xbbc83061,0xbc339d62,0xbc32d690,0xbc3770c3,0xbc337dd2,0xbc0df130,0xbbaaa0ba,0xba819fdb,0x3b2ccf5f,0x3bee6176,0x3c4f32f4,0x3c603924,0x3c7f1875,0x3c8144d2,0x3c7302f9,0x3c28d2d4,0x3b93ae03,0x3b06d826,0xbb0b16f7,0xbc0a5c7a,0xbc404b27, +0x3c2e5a57,0x3c444a15,0x3c516076,0x3c3ba53a,0x3c32d6c4,0x3c20c78c,0x3c059b91,0x3bf5d9e0,0x3c02a34e,0x3c0db5f8,0x3c01a180,0x3be31e95,0x3b4f9857,0xbb083826,0xbb97f697,0xbbacf969,0xbb920da1,0xbb578386,0xbb3574b7,0xbb2225c1,0xbb1c27a9,0xbb23b26c,0xbb3436d5,0xb999af06,0x39c330df, +0x368a6fa8,0x3b20cbd5,0x3b839c41,0x3bafd961,0x3bee23a1,0x3c2fb5c1,0x3c65f025,0x3c573f31,0x3c43d7c3,0x3c3b13ef,0x3c2b5ed1,0xbaa00262,0xbb526073,0xbb457bd3,0xbad4b624,0xbabade90,0x39ee381a,0x3b37d6b7,0x3b9afcc7,0x3b15ed8c,0x3a3a5a4f,0xbb096dc4,0xbb597236,0xbbbc1f33,0xbbe4a239, +0xbbeb8a63,0xbbf8cd23,0xbc0ad054,0xbc000810,0xbbeb2f26,0xbbced5bf,0xbbc0645a,0xbbb2e812,0xbbad0555,0xbb7b6638,0xbb153ada,0xba200dc8,0xb9d2c662,0xb6c2a5e2,0x3a0fb431,0xb9a1c23e,0xba89f441,0xba5a9062,0xba1b9374,0x38ff20e0,0x3a3e7270,0xb95d299c,0xbc156ad1,0xbc1edd85,0xbc279d66, +0xbc23d00e,0xbc30f9e5,0xbc3571c4,0xbc3dbc82,0xbc47174b,0xbc3881a6,0xbc2b3591,0xbc1f4a33,0xbc0f5cc0,0xbc03dd85,0xbbf75cd6,0xbbf2705b,0xbbe891d7,0xbbe23359,0xbbd99094,0xbbd585f8,0xbbd8a61b,0xbbcccbf8,0xbbbfa00e,0xbbb2c92a,0xbba3876b,0xbb9a94e1,0xbb8965b7,0xbb9d52d1,0xbba8c389, +0xbbb15c0d,0xbbaea555,0xbba807f5,0xbbab9aa0,0xbbc34e89,0xbbe71c72,0xbc0419ee,0xbc0f8f26,0xbbdf2ee1,0xbbe9bcf6,0xbbecc35e,0xbbf26890,0xbbf55288,0xbbe91bde,0xbbeea3a6,0xbc017dc3,0xbbf53f3d,0xbbf0784c,0xbbe76b78,0xbbe40b22,0xbbdae49e,0xbbcf135b,0xbbcddc5c,0xbbcd5019,0xbbcc2963, +0xbbcd81f9,0xbbcd3834,0xbbd05437,0xbbc28798,0xbbb828e0,0xbbadef8f,0xbba6521c,0xbb9ec5f5,0xbb93a24b,0xbb991db5,0xbb9c369a,0xbba31bff,0xbbac1a05,0xbbb76f8d,0xbbbe47db,0xbbc5d83a,0xbbc7ca3d,0xbbcb2fa1,0xbbd28422,0xbbc70228,0x3afacc1a,0x3b0c14da,0x3ac5cd44,0x3ab4f059,0x3ab4a46d, +0x3b2a5f99,0x3a7cfc1e,0x3a29756b,0x3aad9d2e,0xb9aea753,0xba27fc2d,0xb9abd1e1,0x39cb0dfb,0x3a5363cc,0x3a478967,0x3adf3fa0,0x3b06627e,0x3b16c509,0x3ace2d53,0x3aad57a3,0x3a76e2a2,0x3ab10645,0x3aebedd5,0x3b2fdb09,0x3b43b0f8,0x3b4c90d5,0x3b44c1b7,0x3b2c135d,0x3b2181ff,0x3b0bc6ec, +0x3b1eb588,0x3b0f51f2,0x3aae5a2c,0x3af93059,0x3b123f5d,0x3b4cdb86,0x3b23b05b,0x3b6b008e,0x3af524d4,0x3a5e9c52,0x3a579d2b,0x3b73e09e,0xba37ca22,0xbafa06f5,0x391ad925,0xbb750aac,0xbb8c3744,0xbb2c379e,0xbac7aceb,0xb915eeaf,0x3939ff27,0x3b38ef7d,0x3b6ea60f,0x3b79e242,0x3aeca838, +0x39be1b3c,0xb951d7bb,0x3a453c45,0x3b308b4e,0x3bb8584f,0x3bed93a9,0x3bf915de,0x3bc6e083,0x3b8e7063,0x3b445c9e,0x3b14ba07,0x3b5b8430,0x3b5f4396,0x3b001981,0x3b6cf184,0x3b95f0e1,0x3bd4b7c2,0x3b9f974f,0x3b94d128,0x3a44e4ea,0xba03c767,0xba05e390,0x3bbfd0f1,0xbb199a0c,0xbb8f3935, +0xba4d7d97,0xbc1d2e67,0xbc358715,0xbc000c38,0xbbb6b943,0xbb080973,0xbb0a5e90,0x3b53f3e8,0x3b84a443,0x3ba2c897,0x3aecd7fb,0xba10c5f0,0xbb03279d,0xb8a5723b,0x3b27ad55,0x3bf1ced7,0x3c23fa43,0x3c302635,0x3c13d6aa,0x3be50ed8,0x3bca43de,0x3babfade,0x3bbafc32,0x3b949b04,0x3a74c98b, +0x3b952600,0x3bd49f67,0x3c1febc0,0x3be42bcb,0x3bfd60bb,0x3b12595f,0xbac4db46,0xba2f98bd,0x3c1eaf07,0xbbce06ed,0xbc2c01ad,0xbb2a08e5,0xbc474477,0xbc621817,0xbc30d9a4,0xbb7286e6,0x3a6bbca8,0x3b25c750,0x3becb021,0x3c1f4122,0x3c2fb63b,0x3b3c1d6f,0xbb292f39,0xbbad4381,0xbad6e72b, +0x3b9e56ac,0x3c7135ff,0x3ca846cd,0x3cb69dff,0x3c835637,0x3c164465,0x3b802e84,0x3b7361c1,0x3bbb3487,0x3bd06e2b,0x3b856b9b,0x3c2b850a,0x3c5ff1ac,0x3c9550f5,0x3c50402d,0xbba1fa07,0xbb896f5d,0xbc1b0393,0xbc06b66f,0xba8b43fc,0x3be08a7f,0x3c25276d,0x3c193d2d,0x3ae16f30,0xbad5ea5a, +0xbb47d471,0xbb687a5c,0xbac5e8b3,0x3bf8fba4,0xbbf2a63f,0xbc2ac4bf,0xbb79a44e,0x3ac722e1,0x3be7b804,0x3c1883a7,0x3b9eebc9,0x39d7dc66,0xbbd46b1d,0xbc496cf0,0xbc476029,0xbc1365a6,0x3c828d5a,0x3ce5c555,0x3ca19266,0x3c7f4df2,0x3b7c7f1b,0xbc15dd83,0xbc10c366,0xbbeb1bd7,0xbbb894e6, +0xbb71d126,0xba64d45a,0x3c1d3b60,0x3cd8da50,0x3ca0de2b,0xbb8aab27,0xbcb2e5c4,0xbcbe4bbd,0xbc404478,0xbb4f7b30,0x394a8151,0xbaaa1af3,0xbb145448,0xbba08097,0xbb79f437,0xbaf829f1,0x3ae8af3a,0x39536514,0x3bc04941,0x3bf14d8a,0x3c0c255a,0x3b033e1f,0x3ab611f2,0x3bc970c1,0x3c290c38, +0x3c622b8c,0x3c502a09,0xbb7243bb,0xbc88a2ea,0xbcd886a0,0xbbe9b79c,0x3c06b6f7,0x3c47e84f,0x3c60998b,0x3b0a14a3,0xbcc2198b,0xbc3f6bf8,0xbc187340,0xbd75423f,0xbd766b15,0xbd2b737b,0x3a9ed42d,0xbbba1da7,0xbbc6e140,0x3b6f1efa,0xbadb11c1,0xbaef1703,0x39787966,0x3acade2e,0x3a2a8e1c, +0xbba46401,0xbb5f2ff9,0xbb7cefab,0xbad9b5ba,0x3b0afc7b,0x3b7bb1fe,0x3b891720,0x3b25f3f0,0xba28a19b,0xbb9bbbca,0xbc026cc3,0xbc205a1d,0xbc03f4af,0xbbeb4f50,0x3b3097cf,0x3c9c9a42,0x390f0837,0xbc69ab9a,0xbc8fc10d,0xbb8dec75,0x3b8c264c,0x3b06e1a6,0x3c269e35,0x3b9d2dcc,0x3c91f963, +0x3d0c817d,0x3cea85eb,0x3c57e091,0x3c0d8dba,0x3c1a707e,0x3bcd32a2,0x39faba2a,0xb875e40f,0xb9640012,0xbad20324,0xba7c1d75,0x3920f06c,0x3a5ed75e,0x3b2a2284,0x3b871eec,0x3ae7ddd0,0xba387ae4,0xba90e79f,0xb8ff6d29,0x3b20a926,0x3bf63b12,0x3bc89a72,0x3bc5d80e,0x3b828490,0x3b36aff1, +0xbb406b09,0xbc15c0bd,0xbbcbb427,0xbb569259,0xbb3f8dca,0xbbd16a9b,0xbb942656,0x3bb8d2f1,0x3992dcba,0xba7b5a56,0xbb485055,0xbc1147e9,0xbc004fab,0xbba49b4c,0xbb333c52,0xbad9aa81,0x3b3b9c0a,0xb890f2d5,0xbb2e6ccc,0xbb74ec9f,0xbb3a7cf8,0xbb0e739d,0xbaf01839,0xbae42bc7,0xbb7f00d0, +0xbc1eb646,0xbc2a5527,0xbc39eee9,0xbc2d02a9,0xbc23b4d2,0xbbf8bf3e,0xbb47bc45,0x3aaadb27,0x3bc03b3f,0x3c1a06aa,0x3c3c9374,0x3c5d0bc9,0x3c584b29,0x3c3748b1,0x3bc7cbd0,0x3b0bd985,0xba47d682,0xbb38b816,0xbb8e0e43,0xbb0c9a56,0x39b346c8,0x3b4fa167,0x3ba98fca,0x3ba1bdb0,0x3ba439d0, +0x3b832cf8,0x3b48e254,0x3b35a5c7,0x3b5bb7d9,0x3b9d6419,0x3baf8a0c,0x3bdca0a4,0x3ba2e356,0x3a9e6c31,0xbb0913da,0xbb806a8c,0xbb9fed7f,0xbb8030ce,0xbb55d571,0xbb1339db,0xbaf468de,0xbab66693,0xbaf0349d,0x3ac25b2c,0x3b6f7849,0x3babf227,0x3c10f16d,0x3c2d3736,0x3c44b3e4,0x3c5b297a, +0x3c827c2b,0x3c954a13,0x3c77aaf7,0x3c37a238,0x3bd97dd1,0x3b20dcf2,0x3bd31de1,0x3baa5b9f,0x3ba2c95d,0x3bd4dc34,0x3bf29d32,0x3c0d8912,0x3c232c76,0x3c3bdb78,0x3c0fbde4,0x3be21eac,0x3b7d602b,0x3ad2c813,0xbafa7727,0xbb709f85,0xbb954ca2,0xbbac12e1,0xbbde65f3,0xbbca5b30,0xbbbc6fcc, +0xbba894db,0xbba93f10,0xbbab3e31,0xbbb5be0c,0xbb81fe7f,0xbb23a5b1,0xba89080e,0x3a08940e,0x3b202cd5,0x3b97a317,0x3b6de04f,0x3b2e29a0,0x3b13d8d3,0x3b01a93f,0x3b294209,0x3b825080,0x3bb68d6e,0xbc008343,0xbbf77338,0xbc096be5,0xbbe65216,0xbbff1045,0xbbfc2516,0xbbf8bb49,0xbc0164ef, +0xbbfc802a,0xbbffcce2,0xbc00eb8c,0xbbf4d88b,0xbbf1655d,0xbbfa2ee4,0xbbf04795,0xbbe50456,0xbbdf30c8,0xbbd7531c,0xbbdbc847,0xbbd3fa63,0xbbc82438,0xbbbc8afe,0xbbb2aa08,0xbbabf788,0xbba9e702,0xbba3c1f3,0xbbbdc78c,0xbbd84e7f,0xbbe9e609,0xbbeffdad,0xbbe86e6b,0xbbe8b6a2,0xbbd89017, +0xbbda70bf,0xbbeacab0,0xbbfee574,0xbbb54949,0xbbb1f52e,0xbbc160b4,0xbbc861f2,0xbbcdb319,0xbbace48d,0xbbb1b728,0xbbbff26d,0xbbc4eb71,0xbbc7db1b,0xbbc90116,0xbbd0b84f,0xbbd0ea63,0xbbd1e13e,0xbbcdb3fa,0xbbcaa3aa,0xbbcc1df0,0xbbcac059,0xbbc8b0a6,0xbbc50e67,0xbbbde224,0xbbb705ce, +0xbbaffc7d,0xbbab2479,0xbba5f1ce,0xbb9d7fef,0xbba34e89,0xbba53b11,0xbbabab08,0xbbb1007b,0xbbbad443,0xbbc675d6,0xbbc6b6a4,0xbbc4726e,0xbbbc36dd,0xbbb45d6f,0xbbc29c1a,0x3ad51937,0x3af8d678,0x3ac6ec2b,0x3abcb597,0x3ab2a18e,0x3afde28f,0x3a68d425,0x3a31ce36,0x3a4755ae,0xb975082a, +0xba0a5f9f,0xb95b9064,0x393d59a9,0x3a084603,0x39db3cea,0x3ab03ae2,0x3ad032ff,0x3afcf346,0x3ac2749f,0x3aab3795,0x3a6395c0,0x3aa60b20,0x3adbc39d,0x3b26e2d2,0x3b331df3,0x3b333cad,0x3b0f3327,0x3b107084,0x3b0ca951,0x3b1617b7,0x3ae81f1a,0x3ac9fe74,0x3a98784a,0x3afdb7eb,0x3b165636, +0x3b469986,0x3b129970,0x3b275f93,0x3acfc6b2,0x3a6b691c,0x39e3b1cb,0x3aa9404f,0xba520e05,0xbaf77cb8,0xbae8fe45,0xbb78c657,0xbb7df09f,0xbb1db7b1,0xbaf113fd,0xba7f8d70,0xba839928,0x3b0524a9,0x3b437e69,0x3b38f03a,0x3b1b33d8,0x3ad4c166,0x3a729cc4,0x3af30386,0x3b66c5d3,0x3bc7c597, +0x3beb5a7c,0x3be27bc3,0x3b8cd954,0x3b735858,0x3b3d4d98,0x3b5b150f,0x3b1ccad3,0x3b103ec6,0x3ade17b8,0x3b802c30,0x3ba3adf1,0x3bc8fad8,0x3b811e67,0x3b80fae0,0x3ae92d9a,0x39e99999,0xb90df2af,0x3b1bb936,0xbaf44979,0xbb66316c,0xbb7266cd,0xbc17748a,0xbc351e54,0xbbfaa721,0xbbe3f182, +0xbb72263d,0xbb92c57c,0x3b00a3d1,0x3b237ee5,0x3b1ccf96,0x3b043e0a,0x3a00ebd5,0xba5e6eb0,0x3a6d357b,0x3b569103,0x3c02c55e,0x3c1f3a04,0x3c1e01e1,0x3bc2baf5,0x3bd060f5,0x3bbd5650,0x3be262bb,0x3b4b5d83,0x3afb4e74,0x3a92742d,0x3bb9fa75,0x3bfd24a0,0x3c2287cc,0x3bd1f700,0x3b8174d5, +0x3ab813d9,0xbaf713b5,0xbb1a3c77,0x3b357eac,0xbbd95f05,0xbc38e07b,0xbc01c072,0xbc81dfbc,0xbc8b6b5d,0xbc1b2c98,0xbbeaad9d,0xbb683db4,0xba918c6f,0x3ba906be,0x3bf978e4,0x3c07b15a,0x3bad9e33,0x3b2b6c74,0x39a3ba3f,0x3b5e97aa,0x3c10ca48,0x3c90fbf0,0x3cac4905,0x3ca3d0ab,0x3c34e411, +0x3c053b46,0x3ba96a45,0x3c03e592,0x3b74dd7c,0x3b531294,0x3b850654,0x3c3aee64,0x3c732205,0x3c8c9262,0x3c1c8ee5,0x3bff5a95,0x3b4c516a,0x3aab177a,0x3a713570,0x3aaddda7,0x3c1de207,0x3c6a9a4b,0x3c871b84,0x3bba2428,0xba9e9a57,0xbb38d4c3,0xbb8fffb3,0xbb20f2f8,0x3bfed4f7,0xbbf5f551, +0xbc42f12e,0xbc2b1680,0xbc04d5e5,0xbbb94513,0xbbc5d678,0xbbff2f06,0xbc1b8b8a,0xbc7d269d,0xbc7501a2,0xbc39e82c,0xbc0bacd6,0x3c84beba,0x3cbf27d5,0x3c25e9ee,0x3c0be445,0xb99e897a,0xbc4477ea,0xbbc2b848,0xbb5d1d81,0xbb9b43bf,0x3bc101c2,0xbbd62d67,0x3b0c90b1,0x3c954dba,0x3c899f25, +0x3b3c8e1f,0xbca5441f,0xbcd8a8ac,0xbc7613c7,0xbb98e2b6,0x3a026a0f,0xb9d37b90,0xb9bcd9c4,0xbb768803,0xbbb75369,0xb9bf71f3,0x3b820b90,0x3b450ae2,0x3bbabfaa,0x3bf5155f,0x3c3e6f7f,0x3bc89dbb,0x3bdc53f4,0x3c257f3d,0x3c85934d,0x3c6636d8,0x3ad5c016,0xbc433ff1,0xbca9731f,0xbcb764bd, +0xbaf4338a,0x3c267882,0x3c108a6f,0x3ac1e57d,0xbc2150c8,0xbcb90686,0xbc61178f,0xbc3eb64e,0xbd1ebf02,0xbd4db1fd,0xbd1bccec,0x3b47f68f,0xbbf37215,0xbc0e81b2,0x392c710e,0xba83050c,0xb9d5fa59,0xb91b4f1d,0x3a01968d,0x39572095,0xbb578814,0xbb82a6d3,0xbbb9f2ce,0xbb94a259,0xba346d76, +0x3ab3f131,0xb93d4293,0xba9cf257,0xbb7f8db5,0xbc1533f6,0xbc36e4e4,0xbc351083,0xbc10c1e6,0xbb866dea,0x3bc737b6,0x3cb94250,0xbc35d4e6,0xbcc73971,0xbc58a93c,0x387d4c98,0x3c45ffcd,0x3c85acb5,0x3b332bda,0xbaa0c864,0xbb55f6c8,0x3ca62c73,0x3cc81e63,0x3c8b10f6,0x3bc82f70,0x3bbf3805, +0x3be79f2f,0x3abe2997,0x39916c12,0x3a3b6a8f,0xba0687cf,0xba90716a,0xbae24be5,0x39e68471,0x3b621386,0x3bc37f22,0x3b94f726,0x3b42bde8,0x3b04440c,0x3b69fe9c,0x3bb39de1,0x3c0ecaef,0x3bf830a7,0x3b965f20,0xb98f5736,0xb8e414cb,0xbb659f8a,0xbb8d0aba,0xbb4ef7b9,0xba8dc6eb,0xbb142cf1, +0x3ae5d67a,0x3bc8f790,0x3c6508ec,0x3b5a37df,0x3be1c1d0,0x3b4386f2,0xbb6cdf19,0xbbdc470f,0xbbb392cc,0xbacb6bd4,0xb9988285,0x39b2fdd0,0xba84033c,0xbb21628e,0xbb50e360,0xbb392310,0xbb025110,0xbadcd6b8,0xb92f47e8,0xbadfbc12,0xbbc27115,0xbc09a760,0xbc23bcdd,0xbc154cfe,0xbc11e38f, +0xbbf4e6f2,0xbb8e776d,0x39b973a6,0x3b955170,0x3bea3922,0x3c17f2e3,0x3c27baac,0x3c1d8a6b,0x3bc81878,0x3acf81e5,0xbab57ebd,0xbb674d33,0xbb947e65,0xbb5defb2,0x3b5bba91,0xbc0f95e4,0xbbca8b5b,0xbb5d6b45,0xbabaf56b,0x3956f32f,0x38266919,0x38810972,0xb87e7366,0x39f2dbe4,0x3a98e2ed, +0x3acd13b9,0x3b81f9cf,0x3b8d5cc8,0x3b551110,0x39b138ed,0xbafd233e,0xbb8fd6b3,0xbba3bc4b,0xbba251f9,0xbb824c5d,0xbb141da7,0xb98b8abe,0x39dd2921,0x3b948c13,0x3bf97ad8,0x3c1f1f36,0x3c6011ef,0x3c804872,0x3c8be663,0x3c87f6bc,0x3c8576d4,0x3c7df457,0x3c481bb0,0x3bfdd21c,0x3a8048bd, +0xbba5fb46,0x3c3f986b,0x3c37c377,0x3c2fd5bc,0x3c344edb,0x3c3ecfde,0x3c42b461,0x3c425be3,0x3c49f631,0x3c310f81,0x3c21a9c2,0x3c07f599,0x3bc7bf54,0x3b3b4655,0x3aa2ca06,0xba51e8bf,0xbb18defb,0xbb9ea018,0xbb8c38a8,0xbb85d62d,0xbb80610f,0xbb87c202,0xbb937fa8,0xbba1e1cf,0xbb7d83ef, +0xbb3f711f,0xbb0a20ca,0x39fbf9f8,0x3b4bf780,0x3bc818e3,0x3bc7e51f,0x3bcacde4,0x3bcfbaf3,0x3bc9eeae,0x3bdca6bc,0x3c0bb338,0x3c2b87df,0xbb702819,0xbb518118,0xbb8b157b,0xbb322226,0xbb567d13,0xbb505275,0xbb411537,0xbb4437da,0xbb7b7b5d,0xbb9f9f1f,0xbbbf65ae,0xbbcdc568,0xbbdf340d, +0xbbfd2947,0xbbecf9f9,0xbbda60e7,0xbbce4504,0xbbc56475,0xbbca521a,0xbbbc1744,0xbbaedd0f,0xbba1a917,0xbb976536,0xbb935268,0xbb904daf,0xbb8fab90,0xbb9aa2f4,0xbba98741,0xbbaebc4b,0xbbb0d72e,0xbba5da3e,0xbb99d3a4,0xbb7fd02d,0xbb5eed91,0xbb5d8f4c,0xbb75b307,0xbb5d54ab,0xbb42d570, +0xbb74b574,0xbb8271c4,0xbb8b41b7,0xbb4d7ed2,0xbb5bb44b,0xbb63ab09,0xbb863dc9,0xbb9186d1,0xbb9dd4a0,0xbbaebb1f,0xbbbac0a8,0xbbcbbeca,0xbbb9c880,0xbbb29f06,0xbbbb2717,0xbbb2d88b,0xbbacd4a3,0xbba57d1e,0xbba4e770,0xbba2c372,0xbba03f29,0xbb9e67a2,0xbb9c5088,0xbb9941cb,0xbb977562, +0xbb93c621,0xbb92db47,0xbb8d46fb,0xbb8b7901,0xbb8c7363,0xbb8af745,0xbb891921,0xbb816347,0xbb69dc0e,0xbbac7679,0x3a9fe276,0x3ac5c9c0,0x3abbcc34,0x3aa558a0,0x3a936475,0x3a7dc11e,0x3a532b7d,0x3a19d978,0xb95cde03,0xb9a6007c,0xba226a00,0xba45fc16,0xb9841431,0x389cceca,0xb93484fc, +0x3a543ba2,0x3a81963b,0x3a9ab02f,0x3a909ab5,0x3a8b50e9,0x3a5c92e2,0x3a91fbd7,0x3abb3c57,0x3b06d58d,0x3b154d19,0x3b125ec5,0x3ac5c94e,0x3ae7556d,0x3ae8ab2b,0x3b16309f,0x3a98fedc,0x3a708cfc,0x3a37f7f8,0x3ae64054,0x3b0a079e,0x3b267344,0x3ae7bdf5,0x3ac0aac6,0x3aa69780,0x3a1be65f, +0xb912138b,0xba8eefe8,0xba38a618,0xbac68657,0xbb6890b6,0xbb42b8ee,0xbb2cfa7c,0xbb276a4d,0xbabd49dc,0xba990f47,0xbb0c0e7a,0x3a700827,0x3aef283b,0x3ac71d15,0x3b0cb0d6,0x3b0a6db8,0x3afd5704,0x3b302c52,0x3b7fca3d,0x3bb60d6e,0x3bd33021,0x3bbf1404,0x3b3f55e8,0x3b44166b,0x3b328100, +0x3b8a4124,0x3ad7ba6a,0x3a8b2150,0x3a463315,0x3b6fc78a,0x3b9de9e1,0x3ba4bc2f,0x3b369d61,0x3b452e50,0x3b36daad,0x3a77bf72,0x39096c70,0xba69e5ea,0xba5465e9,0xbb0db113,0xbbe338be,0xbc01f25b,0xbc24ef13,0xbc18248b,0xbbf13309,0xbb927228,0xbbd21086,0x3a18f3e5,0x3a2a7395,0xb95076c7, +0x3ab53f34,0x3a7603d2,0x3a1e88d2,0x3af007fc,0x3b6e006c,0x3be4fbd5,0x3c0e17b0,0x3c06d857,0x3b83d540,0x3bb4e37d,0x3babb764,0x3c040613,0x3aaa0c21,0x390b6901,0x39535ac0,0x3bc6447c,0x3c020d8f,0x3c0b1545,0x3ba8488a,0x39fcbe91,0x3a2da2d8,0xbb2218eb,0xbb7d0cca,0xbb93ce27,0xbbafb472, +0xbc1b6041,0xbc53e637,0xbc7e65b5,0xbc82bd3d,0xbc0ae4be,0xbc01d0eb,0xbbbe55b5,0xbbb68abb,0x3b34abff,0x3b8de718,0x3b74e8ad,0x3bbdb97f,0x3bb9e595,0x3ba50641,0x3bf1eba8,0x3c38171a,0x3c8c21f4,0x3c9f7440,0x3c898c80,0x3bf63c70,0x3bda8651,0x3bcd44bf,0x3c4067d6,0x3b39b3f2,0x3a1c9eb2, +0x3ad64e23,0x3c2d2d2d,0x3c699dab,0x3c5fc3f0,0x3bbe443d,0x3c915593,0x3c3599c7,0x3c333133,0x3c1b6472,0x3bc88981,0x3c4ae20b,0x3c86954d,0x3c936fb6,0x3c11da66,0x3ad620a2,0x39b03083,0xbad34f83,0xbaa20104,0x3bc907ed,0xbb982aab,0xbc1b8af0,0xbc6ad395,0xbc6c56a4,0xbc782440,0xbc870bc8, +0xbc85548f,0xbc896a68,0xbcae5ada,0xbc83a163,0xbc26c385,0xbba82e38,0x3c49fad6,0x3c695211,0x3adfce3c,0x3aa6bca7,0xbb194ad3,0xbbfb77a0,0xbab0ea82,0x3a50c231,0xbb01e9ba,0x3c595269,0xbc0f31dc,0xbb6f7c06,0x3bdbd74f,0x3c1e5c61,0x3bf208f8,0xbc85ae5c,0xbcc70b10,0xbc69da51,0xbbb7d6bf, +0xb9db8c63,0xba03eab8,0x39b18e52,0xbb33fe92,0xbbb1360c,0x398ffbe1,0x3b8711cd,0x3b82473b,0x3b8807f1,0x3bd406ef,0x3c4707d9,0x3c2c8d5d,0x3c46d88c,0x3c51e4ca,0x3c877562,0x3c1addc8,0xbbc67f80,0xbc8a463b,0xbcaa109b,0xbc68fbc3,0x3b95df0b,0x3c369970,0x3bb97d2e,0xbbece36e,0xbc89d9df, +0xbc932bf1,0xbc51431c,0xbc89d435,0xbc968ffb,0xbcef7831,0xbccd1a92,0xbbdc9997,0xbb6d15ea,0xbb6f23f1,0xbb957ed3,0xb967fe47,0x3a2f54c2,0xb946a273,0x394906a1,0x3a597cd9,0xba91bc16,0xbb75eb24,0xbbce026a,0xbbbce729,0xbb5c4a0a,0xbb26288f,0xbbbb99b2,0xbba11d87,0xbbd09c03,0xbc3283b0, +0xbc33a3d3,0xbc1c4c71,0xbc08a77f,0x3b276309,0x3c2067ba,0x3c85fe63,0xbc8706d3,0xbcbf049e,0xbb55438f,0x3bb0b308,0x3c811119,0x3cd6f304,0xbbad5245,0x3c01baa5,0xbb4cd63e,0x3b42b229,0x3c081e3a,0x3c2b9bdc,0x3a423854,0xb8d43dbb,0x3b6dc368,0x3aab8624,0xb8fb1d9a,0x39b6483c,0x3971e9f1, +0xba6b8b9d,0xbb08666a,0x392a6715,0x3b56623b,0x3bcddd86,0x3bba6c8d,0x3bad2efc,0x3b9cf78a,0x3bda279b,0x3bec9670,0x3bf32730,0x3beb423b,0x3b73319b,0xbb0aaabb,0xbb01724b,0xbb7f0f33,0xba986799,0xbb1f4474,0x39fb27ec,0x3b03667e,0x3c5a403b,0x3c8db582,0x3c714e80,0x3c42c94a,0x3c100bfa, +0x3bbc91a8,0x3afb31a2,0xbb0e0007,0xbad234e7,0x38deb8dc,0x39a2efea,0xbae63eaa,0xba4ae77c,0xba3b755c,0xba284a2f,0xbabb75ad,0xbab5ee3a,0xba54beb4,0x3a5c3948,0x3990f02a,0xbaa4e5ad,0xbb99947b,0xbbe2b0e8,0xbbe459a2,0xbbcb66bc,0xbbac8a9e,0xbb6a738b,0x3615b71e,0x3b4c31ad,0x3bae3a4c, +0x3bb9407e,0x3ba770ef,0x3b88fb42,0xb951edc5,0xbb6cab69,0xbbc1cd27,0xbbe87a94,0xbbc62bf2,0xbb25bcc7,0x3bbf5626,0xbc3ee17a,0xbc3c05b0,0xbc0da638,0xbbbc74ad,0xbb63f35d,0xbb1ee82f,0xbabc6d02,0xba99d13a,0xba56e4d3,0xba8e794e,0xba9e07d2,0x39c5000b,0x3b04e120,0x3b63886c,0x3afd5b85, +0x37edd23d,0xbb40ea7c,0xbba9c6b2,0xbbc5eaa8,0xbbb37e94,0xbb605fec,0xba39ca84,0x3ae0fb97,0x3bbfde0c,0x3c1545c7,0x3c393f76,0x3c712bcd,0x3c869072,0x3c8c5eb9,0x3c7145f9,0x3c3a5a1b,0x3be5f116,0x3b759aa7,0x39ca3720,0xbb8e8b27,0xbc0fd318,0x3c229607,0x3c29d02e,0x3c2ac29d,0x3c1eaba3, +0x3c23161b,0x3c1d08bf,0x3c0e2688,0x3c0664a2,0x3c0bf743,0x3c163179,0x3c1e2e28,0x3c096bdd,0x3bd16999,0x3bb18f9b,0x3b12c63f,0xb80533e1,0xbb420560,0xbb20c91f,0xbb1c0428,0xbb2261ce,0xbb3693d5,0xbb5d1257,0xbb830148,0xbb643526,0xbb434ecb,0xbb330fd6,0xb82b9dc5,0x3b1edc60,0x3badd21c, +0x3bcdd89d,0x3bf70f44,0x3c0d37f9,0x3c08177d,0x3c06ecf6,0x3c112d95,0x3c1c7880,0x3b1fbfc7,0x3b413af5,0x3abd03a9,0x3b0d282e,0x3ab8b3c8,0x3a9257f7,0x3a9d1c8e,0x3a6c2c9d,0xb8db02d1,0xbad269e4,0xbb4332a9,0xbb78d55e,0xbb9558f4,0xbbb37560,0xbbafd675,0xbba20835,0xbb9f777c,0xbba37e15, +0xbbb295b6,0xbbae6887,0xbba1f89c,0xbb945c74,0xbb88ef26,0xbb84ebdf,0xbb8138b5,0xbb836918,0xbb63d6a0,0xbb4c59e5,0xbb2875ae,0xbb0d71a6,0xbacb12d6,0xba2760ff,0x38a34ccb,0x3a7a5155,0x3ad3e2e4,0x3b027b31,0xba9d7e2b,0xba0cffb7,0xbaad5f08,0xbac66640,0xbaf832c1,0xba836af2,0xbab38115, +0xbad542fb,0xbb1b4dc5,0xbb335d79,0xbb4f8779,0xbb710337,0xbb88831e,0xbb9c87ac,0xbb856a06,0xbb830c13,0xbb959246,0xbb8da368,0xbb8bd18d,0xbb8b4be9,0xbb8ce4fd,0xbb8e7444,0xbb8f625b,0xbb8fedc2,0xbb8f5ce4,0xbb91724b,0xbb85cd5f,0xbb781546,0xbb654338,0xbb469c93,0xbb2cd902,0xbb172f69, +0xbb0c7739,0xbb037572,0xbaee96b7,0xbac39aff,0xbb90d53a,0x3a396f82,0x3a835834,0x3a974f9e,0x3a5805dc,0x3a31304c,0x39674e20,0x3a1b63cc,0x39ac2f88,0xba93f7e1,0xb9fa7b29,0xba454650,0xbabe8c01,0xba2f16c5,0xb9b3be9b,0xba33d1a4,0x3904d3ad,0x3994bd20,0x3a1b1f88,0x3a16547e,0x3a2395ba, +0x3a33fcd1,0x3a5b2bea,0x3a8c2b14,0x3ac5709f,0x3add994b,0x3ad412c7,0x3a6e6a27,0x3a9bd183,0x3aa10909,0x3b070b6a,0x3a164bef,0x399fd66d,0x38e62e78,0x3aab7f8f,0x3ad50d67,0x3ae0ebda,0x3a98efd1,0x3a149820,0x3a6faf84,0xb85ac58b,0xba559596,0xbb1ac051,0xba117c92,0xba820f4e,0xbb8adbb2, +0xbae07b80,0xbaa4bf80,0xbb2d12b3,0xba50f3c2,0xba8157e3,0xbb291d14,0xb9d4f13f,0x398ed8d5,0x3a19744e,0x3aaacee3,0x3aee669d,0x3b1a6175,0x3b3e7924,0x3b76398f,0x3b98d095,0x3ba8f702,0x3b8c04f9,0x3acd1a4e,0x3ad42067,0x3af74525,0x3b925d3b,0x3a6f0d3c,0x3891f021,0xb9367e7b,0x3b426921, +0x3b824cb8,0x3b5ab240,0x3ad20325,0x3b0a19dc,0x3b537b95,0x3a311877,0xb9186d21,0xbb3088e8,0x389a68fa,0xba91c552,0xbc19661e,0xbbd4c4b4,0xbc0990d0,0xbc3cc74b,0xbbe37ee9,0xbb9bac19,0xbbed390b,0xbaa06e30,0xbab6d487,0xbaafd560,0x391f95e7,0x3a3e568d,0x3ae321f9,0x3b1914e6,0x3b746766, +0x3bc042a7,0x3becc243,0x3bd71e62,0x3b2658be,0x3b7df289,0x3b7ce7bb,0x3c08c777,0xb7aa281f,0xba8e0bc4,0xba6a18c2,0x3bb20fd2,0x3be53dd9,0x3bc31bc3,0x3b73d306,0xbac391a7,0x394e2437,0xbb5a7a0e,0xbba72ed6,0xbc12b4b6,0xbb71b5aa,0xbbd6ea21,0xbc6f8f20,0xbc35af91,0xbc35bada,0xbbd2fbed, +0xbbb3858c,0xbba479ba,0xbbfabcc4,0xb9d21cd9,0x38ac2692,0xb81a19fc,0x3b8d0c07,0x3bbf344d,0x3bfe0d3f,0x3c17ca3f,0x3c43c6ab,0x3c772c87,0x3c85759b,0x3c4a39f3,0x3b69500a,0x3b365d3e,0x3ba797ee,0x3c5d0227,0x3b04419f,0xbac26cfd,0xba0dde05,0x3c11e3e5,0x3c42ffbf,0x3c0bf8bd,0x3b20ca70, +0x3cb374a3,0x3c8571f6,0x3c7b7f15,0x3c6098cd,0x3c2ca287,0x3c6113de,0x3c70febb,0x3c56f83e,0x3c0fdbf3,0x3b61ed79,0x3b245607,0x3a967456,0x3a5160da,0x3b57e2e9,0x3929ec96,0xbb809182,0xbc731494,0xbc840f8c,0xbc977353,0xbc9fa51a,0xbca14dd3,0xbca3a7f7,0xbcb1824b,0xbc70c4ba,0xbbdcb16b, +0x3b571783,0x3c18ee3f,0x3bca75ec,0xbb8265e9,0xbb70ab99,0xbb3ca6c6,0xbac07864,0x3a159845,0x3b50b2a2,0x3b8656ef,0x3c8e313c,0xbc0393ce,0xbbbaf50e,0xbb14a3f0,0x3b22af6c,0x3c08f2ea,0xbc2e3388,0xbc8c5845,0xbc276eb8,0xbb822517,0xbaa80857,0xbaa672e5,0xb996cb05,0xba8daf6c,0xbb80c92f, +0xb99cf33c,0x3b2d10e8,0x3b4cb91f,0x3b0315b0,0x3b8a848f,0x3c232fa6,0x3c489bf2,0x3c6a34cc,0x3c529a02,0x3c33a9ce,0x3af0074c,0xbc28d5b0,0xbca29bd9,0xbc9a6842,0xbbb9e2fa,0x3c0cfab5,0x3c297c6d,0x3b913add,0xbc33961e,0xbc9c569d,0xbc690f3e,0xbc3609dc,0xbc861da5,0xbb43c00a,0xbc650811, +0xbc724c66,0xbc86dab6,0x3a0fe2d6,0x3af31c98,0xbb82494d,0x3b089614,0x3a271da3,0x3a30261a,0x390917f5,0x3a52d0b6,0x3a41727d,0xbb0dd14b,0xbba00fc2,0xbbb85ebc,0xbb85eaaf,0xbb8d6f7d,0xbbf8de7a,0xbbd9fbde,0xbbf7287e,0xbc1f9013,0xbc0cfc4e,0xbbcdc1a4,0xbba5ca08,0x3c2a0b18,0x3c4ecdc0, +0x3bbaf170,0xbc977160,0xbc998504,0x3baccc5d,0x3c13fb58,0x3c88c4bf,0x3cf6ab8d,0xbbd09ed4,0x3c7d12b1,0x3c7c5ddc,0xbc20d9d0,0xbc5bcac4,0xbbbf6cb3,0xbb64dd0f,0xbaea56ed,0xb94ed0e1,0x38c240d1,0xba600265,0xb9bd4fe0,0xb9448a9e,0xb9a3ea42,0xba8f1c33,0x34c0fcb9,0x3b0d0f6b,0x3bbe2995, +0x3bc52ebe,0x3bd302f3,0x3bde336f,0x3c009a1b,0x3bdfdd30,0x3b95cc78,0x3b735113,0x3ae69c8e,0xbb0866f1,0xbb5c96d1,0xbb99a9d1,0xba8599c1,0xbb1f0ab7,0x3b6001ad,0x3c482af6,0x3c96890b,0x3c7741eb,0x3b0fba8b,0x3c2633c5,0x3bf8c522,0x3bd6492e,0x3bf908ea,0x3bbf816d,0x3b95ad2a,0x3a9908aa, +0xb9d30a83,0xbaf5eca7,0x3964c5b9,0x3a1c0c16,0x3a42a77e,0x3997b1aa,0xb94eadf1,0xb911ffd3,0x3aa317b5,0x3af4db59,0x3b2ffc52,0xb913d4bf,0xbb258ec0,0xbb6d2b8d,0xbb43f859,0xbb1599f8,0xba719734,0x39cffeae,0x3ad495c4,0x3b43ad56,0x3abbfb8d,0xb977aa94,0xbafb5afa,0xbbc72c3d,0xbc0e3330, +0xbc27637e,0xbc1a1c8b,0xbb9fe63c,0xb90d09ff,0x3bf1df6e,0xbc056bcd,0xbc2af6a8,0xbc1b6e04,0xbc00e610,0xbbbd6614,0xbb86914d,0xbb2a91da,0xbb101751,0xbabe9c9d,0xbadfe45b,0xbb00b028,0xbae7136f,0xb9e0f636,0x3ae5e2b8,0x3b0d16e5,0x3a8ee6f2,0xbac26422,0xbb90092b,0xbbbe70f7,0xbbb524d3, +0xbb8edfba,0xbb1a9227,0x39ed7b9f,0x3b96943b,0x3bfd494e,0x3c1ecb67,0x3c3fcd05,0x3c499aa2,0x3c412411,0x3c14570d,0x3b9a2f7e,0xbaacdcef,0xbb92134d,0xbbda50ab,0xbc00882f,0xbc05e6a9,0x3b1601ea,0x3b59b5cd,0x3b91e2ef,0x3b8546eb,0x3b925983,0x3b8581ab,0x3b4f0916,0x3b169dfc,0x3b867a7c, +0x3bbca02e,0x3bfa7c99,0x3bf58df9,0x3bf0e4a1,0x3bf4681b,0x3b856a3e,0x3adfc3a9,0xba1a52a7,0xba3afce0,0xba95e9b4,0xbb0589a1,0xbb00cc70,0xbb10f879,0xbb2fc202,0xbb18b00a,0xbafd514f,0xbad610fe,0x3a112e33,0x3b241dd5,0x3b9bbfb4,0x3badc5ad,0x3bcab7fc,0x3be4c440,0x3bc1ee3c,0x3b99fd54, +0x3b533293,0x3b3a3fb6,0x3bd1d269,0x3be2d2a5,0x3bc5188c,0x3bb9764a,0x3ba7369b,0x3b97e9a3,0x3b9b7239,0x3b9576ae,0x3b75cd67,0x3b205567,0x3aa68402,0x39e2dd10,0xb9d757b5,0xba8c1b30,0xbae2f79f,0xbaebc2cc,0xbb198561,0xbb48e2b3,0xbb874e82,0xbb8c520d,0xbb81721a,0xbb751bbb,0xbb61a65a, +0xbb5d7fcc,0xbb598a02,0xbb63db5c,0xbb1e374d,0xbad117bd,0xba267db4,0x3946bc9f,0x3a92343a,0x3b1a599f,0x3b3c3d19,0x3b792ab3,0x3b99fa76,0x3bb98e9a,0x395a5803,0x3a4609df,0x396eb5cd,0x39438c23,0xb8f73429,0x3a08abf5,0x38b0fef9,0xb99bda74,0xba63b7cd,0xba960275,0xbac337cd,0xbaec258d, +0xbb0e2b74,0xbb27a6b3,0xbb06f6da,0xbb09bcd6,0xbb5760c8,0xbb4840b5,0xbb4e06c2,0xbb4bd019,0xbb52cc63,0xbb579e5a,0xbb5c0528,0xbb5eca3d,0xbb5de3a6,0xbb66d352,0xbb46445a,0xbb2dff94,0xbb150e39,0xbae3ad98,0xbaa79c6c,0xba5973b4,0xba1ddeed,0xb9c3aad3,0xb9317c1f,0xb7a21b46,0xbb45255c, +0x3a076c64,0x3a5761e1,0x3a8d5d41,0x3a263c93,0x39ebeccb,0xb88e4843,0x3a1138b2,0x398d13a7,0xbab47e7d,0xb9c9a87f,0xba1e646d,0xbacb3711,0xba3ed69a,0xb9f8f07d,0xba36f32e,0xb9a50b6a,0xb91b73dc,0x39dde571,0x39a6c8b4,0x39d912a4,0x3a25ea8b,0x3a3eb480,0x3a72c656,0x3ab15bd9,0x3aac2c1d, +0x3aa0555f,0x3a43f164,0x3a5a9263,0x3a66a6fc,0x3b02cfa5,0x39b1d726,0x38c19822,0xb7eb2161,0x3a95ea47,0x3abb5029,0x3aa0a9d0,0x3a769f17,0x39b4cc5c,0x3a739d50,0xb9a96d86,0xba6f614c,0xbb151fdb,0xb941f086,0xb97bf4a3,0xbb7124d3,0xba0015dc,0xb90d876c,0xbb23668b,0xb9ff1251,0xba5c6b0e, +0xbb05b703,0xbaad0303,0xba69d8cd,0x39e89987,0x3a09b542,0x3aa70b40,0x3b10e9e0,0x3b2f1a91,0x3b5a74be,0x3b83bac3,0x3b6f8879,0x3b29f6b1,0x3a28f7ed,0x3995001a,0x3a81c512,0x3b92d165,0x3a089929,0xb9a61546,0xb9823183,0x3b32fb06,0x3b5f9e32,0x3b0794e6,0x3a878974,0x3af7c295,0x3b5e7ed5, +0x3a00f0f3,0xb9a38dc8,0xbb40f8eb,0x3a37bba3,0xb9decc96,0xbc197625,0xbb9c1dae,0xbbc8ec1b,0xbc3bc482,0xbbbdd827,0xbb990428,0xbbc818a1,0xbb519dd3,0xbb568a5a,0xba4a91f0,0xba664f69,0x39a84125,0x3b082759,0x3b19f0cf,0x3b6ec7c7,0x3bb34aa9,0x3bb66a3a,0x3b9c8311,0x3aee84a0,0x3b15b8dd, +0x3b1aee97,0x3c07af39,0xba292ee9,0xbab601e9,0xba4ba1c9,0x3ba96fda,0x3bd2cfd5,0x3b8892f6,0x3b4fb6d1,0xbad31514,0x396e1ad0,0xbb57d036,0xbbacfcb9,0xbc202837,0xbb0999f2,0xbb6441f3,0xbc377b5c,0xbbb210b1,0xbb9f8dbd,0xbb37dcf9,0xbb000ff3,0xbb1d4871,0xbbc7681d,0xbb3ed997,0xbb7317cb, +0xbaef62a2,0x3ae4934c,0x3b8507c3,0x3bfe21b3,0x3c106c47,0x3c352067,0x3c542959,0x3c3f43ba,0x3bdf3262,0xb9851fc6,0xbae1124b,0x3b368479,0x3c5caa63,0x3ab31174,0xbb1a9392,0xb9e8e577,0x3c0b28e8,0x3c241da7,0x3b8aa7de,0x3a14bfba,0x3cb737c9,0x3c9102bb,0x3c7756aa,0x3c63347f,0x3c55c2d7, +0x3c513655,0x3c247f11,0x3bbe449c,0x3baaeaa1,0x3ae7d266,0x3afeab6a,0x3a7097b9,0x3acdfd2d,0x3a70b42d,0x3b6052ca,0x3b063daa,0xbc3aeb4a,0xbc611485,0xbc85c3cf,0xbc8b965c,0xbc98cd1e,0xbc99cc9b,0xbc88387b,0xbc1ffa96,0x39d8d309,0x3c717747,0x3c46de98,0x3b972c3b,0xbbbb65f9,0xbb9bcf10, +0xbb02481e,0x3b44b05c,0x3949599a,0x3b9465fc,0x3c51d5d4,0x3ca6b15d,0xbbb8f513,0xbb86348a,0xbbbf8e04,0xbaff7e97,0x3bd63ab4,0xbbba0b7c,0xbc177bbc,0xbb84c11a,0xbabd1151,0xba9bd16c,0xba505cb3,0xba4e4395,0xb9a9c484,0xbad2d7b9,0xbaa2d5b6,0x3a2f2400,0x3b05a54c,0xb91c747b,0x3aa90391, +0x3bc41410,0x3c29ce11,0x3c5118f4,0x3c35d7d1,0x3b97b74f,0xbb8f95e5,0xbc51577b,0xbca678bb,0xbc6a7c57,0x3b62ecb8,0x3c26d19d,0x3c0644f4,0x3b952b12,0xbc4917db,0xbc982384,0xbc38ab19,0xbc181e76,0xbbdfcec4,0x3c2f92d2,0xbb705788,0xbc01a0f5,0xbc7c4d45,0x3aeaa3dc,0x3b29ca1c,0xb8a29aa9, +0x3ac837e5,0x399c0ed1,0x3a2a2a26,0x39d5b800,0x39873f74,0x3a634878,0xb8e882a3,0xbb07a8dc,0xbb7a6b28,0xbb0c84bb,0xbb15cc0d,0xbb984b8f,0xbbb19ae1,0xbbe0fef4,0xbbdd0a80,0xbbbb456a,0xbaea6fad,0x3b389ead,0x3c8adccc,0x3c609e78,0xbb58bbe8,0xbc835617,0xbc3a364c,0x3c4f08ea,0x3c6777de, +0x3c9caf2c,0x3ce135cc,0xb8de9bc1,0x3c00e6b3,0x3cde6fe0,0xbc603036,0xbce63688,0xbcb22c51,0xbba0a618,0xba6820b3,0xba8a94b0,0xb98157ed,0xba21a1f6,0xb9cb6893,0xb9f89bbe,0xb9a8dade,0xb9bc3e49,0xb9c17b64,0x3a05bcfc,0x3b886364,0x3bc59202,0x3be1214e,0x3c00def6,0x3bf31248,0x3baaaf13, +0x3afe716a,0xb9a77a59,0xbaa7986b,0xbb0da00f,0xbb768f4c,0xbb864be8,0xbafd1994,0x3ac648fa,0x3c1f52be,0x3cc083f7,0x3c4a978c,0xb9f54fad,0xbc692896,0xbb7e499b,0x3c074d2e,0x3c3901c8,0x3c83d0db,0x3c87c99b,0x3c2211d0,0x3b21c30e,0xba35785a,0xba0270e2,0x3a3c876e,0x3a14ddbb,0x3a3e3f9e, +0x3a4499f8,0x3a180a68,0x39832598,0x3aad37b2,0x3b37538c,0x3bab20b9,0x3b988079,0x3b37a35c,0x3aaae2fa,0x3a729d21,0x3a871f33,0x3b0733f1,0x3b06bcc9,0x3aee333e,0x3aff8d03,0xba9f6c49,0xbb5726e7,0xbb9dbc23,0xbc08115c,0xbc2ca162,0xbc31f367,0xbbf4c47e,0xba2d65ec,0x3b7889df,0x3c057af1, +0xbb046b2d,0xbba24706,0xbbd62ebe,0xbbe8af3c,0xbbc897bd,0xbb99471f,0xbb482a6e,0xbb29fa4a,0xbaae6ddf,0xbaa7c982,0xbad1f7c8,0xbb01a7d2,0xbacddb1a,0xb986df6a,0x3aa9aab5,0x3ab671c8,0x387458db,0xbb36570d,0xbb8aef25,0xbb8645e7,0xbb803185,0xbb509aef,0xbab57af4,0x3b0a2aee,0x3b9755d7, +0x3bc5faa7,0x3bdea3ce,0x3bda1387,0x3bb76fbd,0x3b92f646,0x3acaaca6,0xbb7b4ba0,0xbbd05fbe,0xbbffc3ed,0xbbcd33b4,0xbb84a558,0xbb7e3528,0xbb466157,0xbaae59e8,0xba1d9537,0x3967617e,0x38a2169d,0xb9bc6151,0xba7940e8,0x3a87bdea,0x3b2dea65,0x3b94d734,0x3ba12b4d,0x3bbfb318,0x3bda7a27, +0x3b9b90a3,0x3b4da099,0x3b06a522,0x3aa664ee,0x394d4782,0xbaa1da54,0xb9abd3d8,0x38705706,0x39798454,0x3a654c35,0x3ad0a8c1,0x3b1f0f57,0x3b6b7b6d,0x3b96c731,0x3bb8c58f,0x3b9f160b,0x3b8b2785,0x3b7f1de2,0x3b0fc6f9,0x394fd251,0xbb2fab96,0xbb4f6b2c,0x3bf3fba2,0x3bfe4c09,0x3bf1842a, +0x3bd9a861,0x3bceaf5a,0x3bc23253,0x3bc85335,0x3bca6e62,0x3bc28f56,0x3bb2c11d,0x3ba5923c,0x3b9d03e7,0x3b8f88f3,0x3b89c335,0x3b337d4f,0x3b10a46f,0x3aad2f66,0x39754131,0xbab7799e,0xbaacb05e,0xba847776,0xba873f18,0xba5d84c6,0xba56d3ec,0xba54a990,0xba753f1b,0x38ded5d4,0x3a75aa26, +0x3afb241d,0x3b3d57ce,0x3b80e1dc,0x3ba44c9c,0x3ba8161e,0x3bb8b154,0x3bc7d303,0x3be29abd,0x3b0ba6d4,0x3b1a80fd,0x3b017163,0x3af7470e,0x3ac04a5e,0x3b1276e4,0x3ad887c5,0x3a8c66cd,0x3a6ac6d8,0x3a5056af,0x3a26f1ff,0x3a15279a,0x39e31f86,0x39fa96cf,0x3a78da08,0x3a8f8a03,0xba5c8590, +0xb9a06cda,0xb9a0e539,0x373613f0,0xb936eaac,0xb92e2820,0xb94a9dc9,0xb95ba033,0xb93940b4,0xb99c8684,0x390719ad,0x39dcdc19,0x3a34778d,0x3a88f8f6,0x3aad89f2,0x3ade9c5e,0x3aeda2ee,0x3b0344c6,0x3b0f7450,0x3b0accc5,0x39dcd94d,0xb93e8a89,0x397e8e18,0x39e86223,0x3921f3c7,0x382ef107, +0xb97f6d18,0x3697c16a,0xb683126b,0xba976d61,0xb98daeab,0xb9b4d394,0xba874895,0xba12641a,0xba0a3a89,0xb9dff8f2,0xba5d9eeb,0xba5eb6a3,0x39cc50c9,0xb8af0503,0xb8e6a264,0xb9073acc,0x38876061,0x395d73cc,0x3a2d8e01,0x39a13132,0x395b3102,0x38063de5,0xb61317b4,0x3863e75a,0x3a9c85fe, +0xb9c041a0,0xba10c488,0xba0b111c,0x3a007c44,0x3a4361a3,0x39b75a8e,0x39a5d3ad,0xb89aca5c,0x3a029fee,0xb9cefbf5,0xba899269,0xbb04ae2d,0xb982c1de,0xb94746b7,0xbb439ad6,0xb993c677,0xb9aa7730,0xbb406256,0xbae4e998,0xbae84075,0xbab64eb0,0xbb15d749,0xbafe10cd,0x39a1966e,0xb9baa36e, +0x3a02a474,0x3a6da2a9,0x3abb2318,0x3af702df,0x3b23247b,0x3a8bc83e,0xb6e68196,0xba5f0788,0xba948eae,0xb91b3bc7,0x3b56ae32,0xb9e48ab3,0xba8fa3b1,0xba1ce199,0x3afc0965,0x3b14ca26,0x3a0289fb,0x3976d656,0x3ac80939,0x3b3deebb,0x39b99933,0xba2853b7,0xbb3871e1,0x3a129384,0xb99080b3, +0xbbdecaa5,0xbb52b83b,0xbb7b0828,0xbbfc6b51,0xbb8e63e2,0xbb91eb61,0xbb79fa68,0xbb989753,0xbba1bb3f,0x38147fd2,0xbacde822,0xb9ad8912,0x3a55e197,0x3aa6ec9e,0x3b1bfee4,0x3b89f543,0x3b1fb3e1,0x3ad474cf,0x399d3976,0x3a08f782,0x3a3417dd,0x3bd085bd,0xbadb0775,0xbb0240d4,0xba24f039, +0x3b8c4ab7,0x3bacb306,0x3b1d308c,0x3b28f7c9,0xba9e57f4,0x399b880c,0xbb1a7079,0xbb963f12,0xbc0241e4,0xba757a5b,0xbaaae4a9,0xbbb23200,0xbab042d0,0xba61db59,0xb91711f1,0xb989bd26,0xb9fca248,0xbb2689ca,0xbb5be853,0xbbaf7f30,0xbaf6115c,0xba140808,0x3ae2a13d,0x3b9e2bff,0x3bc612a9, +0x3c016e4e,0x3c15e8f2,0x3b95124f,0xba0a49e8,0xbb8c8757,0xbb98b9d1,0x3a5a5d78,0x3c2d0af1,0xb89804bb,0xbb48f9ea,0x38fde3fa,0x3bf5ece9,0x3bf612f7,0x39d0110c,0xba30c320,0x3ca7cdce,0x3c75deeb,0x3c4e006f,0x3c3d9e78,0x3c38d0fb,0x3c0f8fba,0x3b8ecef0,0x3aae3044,0x3ab8cb20,0x392b0779, +0x3a11a7d6,0x379aca7d,0x3a655841,0x37d1770f,0x3b591207,0x3b972e6d,0xbbaa41ca,0xbc1d6fbe,0xbc4ab0f1,0xbc55601c,0xbc7ed65a,0xbc77c01d,0xbc23a45b,0xbb594e04,0x3bf4964c,0x3cad2ecf,0x3c5d118e,0x3b56724a,0xbbd71f3e,0xbbb6296c,0xbb1af0a8,0x3b72be58,0xba9ebbc6,0x3ba14d69,0x3c9a8e1c, +0x3cb09f9e,0xbb3e7d97,0xba09ec75,0xbbb0077b,0xbb6149e0,0x3b38cf89,0xbb1acff0,0xbb3bd80d,0xb9bfe8c1,0xba206a2b,0xb9807a93,0xb9564e9e,0xb9440ce2,0xb9987a01,0xb99fe130,0xbaa0ab91,0xba863053,0x3aa4b2b3,0xbadc3068,0xbae1bc84,0x3a6bc552,0x3bbdcd3e,0x3c0cddf6,0x3bfdd5da,0xb82fe3c1, +0xbc0d4a1d,0xbc826ff2,0xbc9fcf00,0xbc1a8165,0x3c23a59c,0x3c05ca1d,0x3b593ccf,0x3adb9f2d,0xbc71d41f,0xbc96f2f9,0xbc22e3d8,0xbc0005df,0x3b4d9be5,0x3c9aa72f,0x3bbc95a5,0xbac303fc,0xbc04ad4c,0x39faf2de,0x3ab4fc02,0x399a48f1,0x39725a70,0x395d8034,0x390772a3,0x39462cc9,0x3932beff, +0x39898448,0x3a14ba1c,0x39982f3f,0xbabe74a6,0x3a248c1d,0x3a9a9f7d,0x38f3921e,0xbb3b3de2,0xbbab925d,0xbb86b415,0xbb750c9e,0x3b0ee193,0x3c40b563,0x3c942bf2,0x3c2129c3,0xbc3403b2,0xbc3aeda7,0xbb53a339,0x3c801080,0x3c8fc0a2,0x3ca09990,0x3c9055b0,0x3b901950,0xbc39c708,0x3c3daaf8, +0xbc512744,0xbce2abce,0xbcce0a46,0xbba4e49f,0xb990c6a1,0xb9a7d046,0xb937921d,0xb94eadce,0xb93d864a,0xb96c213f,0xb97c24ab,0xb93d9ee0,0xba0787b6,0xba24e8cd,0x3a98d588,0x3b978d7e,0x3bcc81a0,0x3be4d96c,0x3baea15f,0x3b318186,0xba283154,0xbb799a1c,0xbbb37258,0xbba58864,0xbbb7ae4d, +0xbb847cb9,0xbb8620da,0x3bfeaa69,0x3c70db32,0x3cb5f3bd,0xbb1d0cfe,0xbc97181b,0xbcc5605b,0xbc9c6b42,0x3c00e913,0x3c992c4d,0x3ccb0d02,0x3cc96ce6,0x3c316d58,0x3b836688,0xb88c65bc,0x39bccfbf,0x39ba4e50,0x395c5b5b,0x39b6a83e,0x39d8e31d,0x39ebaedd,0x39827efd,0x3a3c4f3b,0x3b205022, +0x3baa6390,0x3bfd3961,0x3be949e2,0x3bb496bf,0x3b8b3a69,0x3b62c977,0x3b6acfdc,0x3b4d4168,0x3b09c766,0x3a817744,0xbb5430cd,0xbbb70021,0xbbdf5a7e,0xbc1c2747,0xbc38d20d,0xbc279f36,0xbbbf4f39,0xb9ac2617,0x3b37fa4f,0x3b56b01d,0x3a8d5564,0xb9f7299b,0xbb42dc72,0xbb8affae,0xbb8f4a62, +0xbb607c8e,0xbb149571,0xbac6632a,0xb9f104d1,0xb9e42c2d,0xba382c14,0xba7511b7,0xba888673,0xba6551f2,0x39c8362a,0x3a89084d,0x3a93ba88,0xba8fca91,0xbb239d61,0xbb3c6798,0xbb559433,0xbb5d7956,0xbb3cbc1f,0xba8a8dad,0xb8863d49,0x398f375f,0x3a1b70a5,0x3a1df992,0x38a44da1,0x39fd48a7, +0xba0f4a9d,0xbb844513,0xbba09b96,0xbbb32ef9,0xbb545f85,0xba5f7b51,0xbbdf286b,0xbbd958a1,0xbb9fb44a,0xbb83be9f,0xbb42ed95,0xbb317e28,0xbb1eb48b,0xbb154d40,0xba3e22a5,0x392fa9b1,0x3ad5b554,0x3ad4539c,0x3b3ac0c5,0x3b619668,0x3b6c9caa,0x3b548177,0x3b603d31,0x3b1cf922,0x3aac8663, +0xb8f200da,0x3a9084d1,0x3afc9f21,0x3b2b576d,0x3b6fb20f,0x3b9c937c,0x3bc6f5c8,0x3bbd0268,0x3bb016d8,0x3b9efe0f,0x3b3c23c2,0x3a7b2671,0xba132cd8,0xbaefadeb,0xbb5e47b7,0xbbbefa16,0xbbca4f64,0x3b8f1da5,0x3b8e449c,0x3bb31fe7,0x3b92b934,0x3ba08abe,0x3b9c70be,0x3ba2fed5,0x3bac1032, +0x3bb3c88e,0x3bbf14ac,0x3bd11ca9,0x3bd91115,0x3be20c95,0x3bee938f,0x3bc359ff,0x3ba71828,0x3b88e1c9,0x3b53b6ec,0x3b037173,0x3af33f91,0x3b0859bb,0x3afe445c,0x3b003a0b,0x3afa456d,0x3ae99a07,0x3ae609a8,0x3b0abe8b,0x3b244b96,0x3b456319,0x3b6b841a,0x3b8959d3,0x3b9333aa,0x3b8af662, +0x3b8781b7,0x3b83624c,0x3b8c860b,0x3b3d2d90,0x3b2b07de,0x3b3cb828,0x3b43dd49,0x3b41761b,0x3b42deea,0x3b3be175,0x3b2f1b7d,0x3b3b12b3,0x3b417411,0x3b4047ce,0x3b4d4987,0x3b5125da,0x3b66c684,0x3b5fcd10,0x3b634802,0x3b1d56b5,0x3b2c9a71,0x3b292f7b,0x3b323a52,0x3b2c6b21,0x3b2f8e87, +0x3b3184d1,0x3b32de3b,0x3b35e29c,0x3b32f584,0x3b3cdb60,0x3b407ed6,0x3b3f8ed7,0x3b4069e2,0x3b3f6b05,0x3b47fb7a,0x3b4770b1,0x3b4c3ee6,0x3b51ace0,0x3b447905,0x3b503cff,0xba7e0424,0xb9ca62b5,0xb97f3445,0xba0f5c6d,0xba378b1e,0xba75daf2,0xba4b2f1c,0xba308f1f,0xbaa92613,0xba3b1d58, +0xba321e87,0xba867c62,0xba909212,0xba9de882,0xba2e90cb,0xbad73bf5,0xbad5f4c3,0xb9860dd3,0xba5e4e7a,0xba6b9884,0xba86fc80,0xba477ea2,0xba2e82e0,0xb98eb83f,0xba6d8638,0xba7b670c,0xba4bcad6,0xba38ed73,0xba25da35,0x38b1ff4a,0xba859472,0xba8f340a,0xba5f8ef9,0xb90c8774,0x3807dde0, +0xba112616,0xb9b232e9,0xb9e547fe,0xb87049e1,0xba4643ad,0xbaa8c9ac,0xbb068775,0xba654ea9,0xba30276e,0xbb05dc07,0xba20c49d,0xba96db0d,0xbb5140f0,0xbb635a7a,0xbb55ef60,0xba7dabda,0xbb513879,0xbb3f9fc9,0xb8afa583,0xbaa93432,0xba327879,0xba440693,0xb8d98cc8,0x38008d70,0x39c32ad5, +0xbb02f2ac,0xbb388ff5,0xbb1476e0,0xbae2713c,0xba2507b7,0x3ab8e0db,0xba9bbb3f,0xbabf1636,0xb9e37fa7,0x3aa0b648,0x3a9b6149,0xba71571a,0xb9e04bf0,0x3aa0ec94,0x3b0e406d,0x380db863,0xba9561e1,0xbb2f5d91,0xb9963dfe,0xba08debd,0xbb5a6211,0xbaf01d50,0xbae1ef94,0xbb5f21fc,0xbb40e85a, +0xbb79a544,0xbae270cb,0xbba4e63e,0xbbb9db95,0x38aa3b13,0xbb13fc1d,0xbab65086,0xbaa378ce,0xb978d345,0x39d51ec1,0x3b050de2,0xbacf7a36,0xbb05fc85,0xba83a463,0x37d42fa1,0x39baac68,0x3b5a77c2,0xbb025070,0xbadd9fae,0x3a39c8df,0x3b7aa1eb,0x3b8bde84,0x3a3ecdb3,0x3b05e1cd,0xba228667, +0x399293fe,0xbac60c70,0xbb64f1ee,0xbba6016d,0xb9f54e93,0xb9c2a0f5,0xba7157be,0x39a0ae38,0x399ab9fd,0x3a75939a,0x3a700d95,0x399d1f0c,0x386eb32f,0xbadb7ad1,0xbb960e02,0xbac03674,0xbb0f2221,0xba5259ea,0x3a435405,0x3b1afdee,0x3b5ebc7e,0x3b6d86f3,0xbb8a9f8b,0xbc099abc,0xbbea7ac3, +0xbb91b663,0x3a523f1e,0x3bb7c885,0xba8f587b,0xbb0f1a4c,0x3b1adb29,0x3bddeda4,0x3baab19b,0xbb2de160,0xbab0aed3,0x3c8f48e4,0x3c2ad011,0x3c1d4ff6,0x3bf6fece,0x3bcdf56f,0x3b6f45cd,0x3a1bcd52,0x38ed427f,0x3880c43b,0xb91ddf0a,0xb9b12e96,0xb9cc0ccd,0x36dd46b4,0xb8ac5a6c,0x3a94cff5, +0x3b5554da,0x3904fff6,0xbba0c480,0xbc102c3c,0xbc1af1ab,0xbc407ace,0xbc29558a,0xbb4b070a,0x3ba791c0,0x3c7845ee,0x3cc50768,0x3c6b7065,0x3b61ea5e,0xbb8034a1,0xbb8148c0,0xbaad2f81,0x3b9a75db,0x3817be0f,0x3bd5ff4f,0x3cb008cd,0x3caa6c49,0x39f84809,0x3b4e7936,0xbb3f149d,0xbb15de57, +0x3a1f4882,0xb9c75455,0xba0f186a,0xb696c205,0xb862049c,0x38cb80d7,0x392af187,0x39191d37,0x380baa80,0xb85b9094,0xba04cbb5,0xbaa5ec6c,0x39b15908,0xbac43917,0xbb430078,0xbb2c02db,0x3b0c9492,0x3ba02c01,0x3b962c02,0xbb29def0,0xbc33008b,0xbc90e079,0xbc835844,0xbb79e768,0x3c65484e, +0x3bd46d65,0xba00c636,0xbb2e5467,0xbc84b68d,0xbc89c983,0xbc026767,0xbb99c625,0x3c21115f,0x3cafd818,0x3c581a39,0x3b34d3e0,0xbb91503d,0x3a692884,0x398f1255,0xb8903f15,0x3895661c,0xb8c937a4,0xb8b114fa,0xb8920b50,0xb79daa65,0x38677340,0x39728c90,0x3a31ca55,0x389db8d4,0x3adf94ed, +0x3b50d830,0x3b5d8846,0xb989d2fd,0xbb2cdc8d,0xbad5963b,0xba1af700,0x3bdea06c,0x3c99b4bd,0x3c74db16,0x3b4be511,0xbc8459db,0xbbcb992b,0x3b976d6f,0x3c76530f,0x3ca0ad6e,0x3c920603,0x3b97f9bc,0x3ba94813,0xbcc2b25a,0xbca9e46e,0xbc50f1c8,0xbc7b747e,0xbc8a8961,0xbb1f659c,0x38bca0ff, +0xb81f6f96,0x38091293,0x38bdcc94,0x38aa5602,0x3859cf8a,0xb7d22b1c,0xb749e741,0xb938f855,0xb9f6afa2,0xba9e20ce,0x3ac27a3a,0x3b77f3aa,0x3b7b0d94,0x3aefb371,0xb9547615,0xbb45373e,0xbbb90174,0xbc03ec4f,0xbbfe153f,0xbbe62f77,0xbb398cf5,0xbb328c6b,0x3c6fad5b,0x3c8525a8,0x3c0852c7, +0xbc6baf99,0xbccd818f,0xbcc014ec,0xbcaca799,0x3ba74a9b,0x3cb7a215,0x3cdd4344,0x3cb952c6,0x3c01bab0,0x3b8474b8,0xb9cd7780,0x390feddc,0xb93c0ba1,0xb90b259d,0xb908b4a0,0xb8649c04,0x37d1bca6,0x390b4ded,0xb8a02d22,0x3a6f2d7a,0x3b4b6071,0x3beec051,0x3c0efdd0,0x3bfcea95,0x3bd745ec, +0x3ba92b46,0x3b8a4afd,0x3b532a4e,0x3b0376ae,0x3a085a9a,0xbb6c0147,0xbbc64eb9,0xbbee1461,0xbc15c53c,0xbc1f5b5d,0xbbf23f6d,0xbbab1b5c,0xbb757852,0xbb140c47,0xbb8e2b88,0x3b480e97,0x3b35381b,0xb726bbae,0xba027566,0xbacf20f1,0xba6397af,0xba0274b6,0x390ed0d6,0x39cf5fd2,0x39cb91cc, +0x397785c2,0x392e65a8,0xb853b348,0xb98ec48d,0xb8a0c169,0x3a145c9f,0x3acb3d37,0x3a0a5bc1,0xba662b0c,0xbad8c631,0xbb0ec33b,0xbb3e350a,0xbb5d1ad7,0xbb669365,0xbb845d14,0xbb96b702,0xbb768554,0xbb519644,0xbb52ba07,0xbb21ec66,0xbb2152f0,0xbb78022b,0xbb2c58eb,0xbae01aa2,0x3a095ace, +0x3b1889fa,0xbbd45d17,0xbbeb9f60,0xbbd2f8f1,0xbbc76041,0xbbb3c28b,0xbb9e7e12,0xbb7ea868,0xbb493e50,0xbb06cfb2,0xbacb1106,0xba3adaaa,0xba6aba07,0xb8be89d5,0x393d2ee4,0x3a963935,0x3acf7864,0x3b24fc4c,0x3b0f27bf,0x3adec735,0x3aa91b9d,0x3b0c78bc,0x3b2bca9c,0x3b50016b,0x3b8b52cc, +0x3bb036b6,0x3bd4c20c,0x3ba5cbfa,0x3b6b76ca,0x3b053784,0x396cc1a2,0xbac5b6d2,0xbb46b006,0xbb62eb63,0xbb8a4075,0xbbb47138,0xbbc721ad,0x38caf0e8,0xb9e3460c,0x3a77b82b,0x3a5db800,0x3ad9dd4d,0x3afa901c,0x3b0b30ab,0x3b267b69,0x3b3a8023,0x3b649598,0x3b8e5e89,0x3ba0c32c,0x3bb78448, +0x3bcf74d2,0x3bc3ef93,0x3bb6be62,0x3ba95800,0x3b9a225b,0x3b807d6a,0x3b8591e2,0x3b891503,0x3b866532,0x3b848e6f,0x3b825dd9,0x3b780f3b,0x3b807173,0x3b6c2c03,0x3b691af9,0x3b660650,0x3b626217,0x3b586cb1,0x3b3981ac,0x3b0dfc58,0x3ac5b97a,0x3a7b82a9,0x3a187c11,0x3b3f8d53,0x3b1ffaf1, +0x3b389507,0x3b3ca2c1,0x3b3fee0c,0x3b4819a8,0x3b4df043,0x3b55ccfa,0x3b6fab9a,0x3b7f5fe1,0x3b839d2c,0x3b8ca912,0x3b913aab,0x3b9b3a14,0x3b907483,0x3b94a9f0,0x3b80b705,0x3b886e7f,0x3b8d09bb,0x3b966119,0x3b94980d,0x3b976065,0x3b99d6e8,0x3b9b96ec,0x3b9d5b34,0x3b9e9368,0x3b99c525, +0x3b93b8bf,0x3b8b7198,0x3b836a8a,0x3b7919df,0x3b734370,0x3b6b8a75,0x3b65af3b,0x3b5d75cf,0x3b4c721e,0x3ba3bc9c,0xbad933b4,0xba6bee85,0xba6d0d15,0xba94df41,0xbaa86491,0xbabb3ae6,0xbac19524,0xbaa48267,0xba941783,0xba84d1b4,0xba8c1c09,0xba9c0af3,0xbadb4d02,0xbae18fab,0xba5a9648, +0xbb0d6574,0xbb128454,0xba60e647,0xbac638d9,0xbad22344,0xbaf1d4c6,0xbac551e0,0xbac1bf40,0xbaab65a6,0xbb02bcf7,0xbb009173,0xbac405a7,0xba9793d7,0xba90349a,0xba9a0874,0xbac9e0fa,0xbabf2625,0xba7802a0,0xba30ca93,0xba28121c,0xbab22556,0xba69f6da,0xba3519b6,0xba25bdca,0xba8b1a83, +0xbad06221,0xbb047194,0xbace1649,0xba9d329e,0xba751f73,0xba63f455,0xbab93ff8,0xbb2dca81,0xbb8b67df,0xbb894803,0xba99a269,0xbb6bd8b1,0xbb58d946,0xba2fefa9,0xbb03d8b3,0xbadc0cf2,0xbb0f9434,0xbabf5acd,0xbae18aad,0xbb041836,0xbb9780de,0xbba242c6,0xbb565932,0xbad2fdb6,0xba33e071, +0xba7982b9,0xbaebe8e5,0xbacb2be5,0x3865022e,0x39f9e9c3,0x38a31c70,0xbb08b7ce,0xba69ff85,0x3a97c0ad,0x3ab88f0d,0xb962b5e2,0xbab8253c,0xbb1166eb,0xba8d7711,0xba1fed65,0xb9d9c631,0xb9ff82ec,0xb9773a1c,0xba0c3cda,0xba2f4a8c,0xbaecec5f,0xb973afac,0xbb78e21d,0xbba51877,0xb9faffbe, +0xbb327f2a,0xbb22c1b0,0xbb4ed029,0xbad537ee,0xbad5d418,0xba7fd883,0xbbab185c,0xbba4fda7,0xbb0235a0,0x39f79b6b,0x3a52ef8f,0xba25d402,0xbb021944,0xba7dbd35,0x3b2dcb5c,0x3b5428fc,0x3b46e0f0,0xba609a80,0x3ad86e9c,0x3914f0ee,0x399fd7c9,0xba79fbdb,0xbb141dc3,0xbb281962,0xb99a78a5, +0x38c81a29,0x391f21e5,0x391f180d,0x3954822a,0x39614f4c,0x3a0c6ed1,0x3a105fbb,0x39bd0124,0x3a01664a,0xbb0c10d0,0xba9e1b24,0xbb373f17,0xbb34a05a,0xbb37f276,0xba6d2ad6,0xba9b6df8,0xbb461f76,0xbc43e7eb,0xbc67c104,0xbc0a513b,0xbb0d669f,0x3ac4b2dd,0xba75827d,0xbb10f7cf,0xba4d699b, +0x3ba505c2,0x3bac4210,0x3b1d4f46,0xbba2bd79,0xbab5da84,0x3c5b707a,0x3bd3f889,0x3bd5f1d7,0x3b6fa803,0x3afe56ce,0x3a03d930,0xb9102b54,0xb644e408,0xb8b0cb7d,0xb8f637c4,0xb9000433,0xb9959af1,0xb96a9734,0xb982fc52,0x38289afa,0x3a49f3a7,0x3b0b546f,0xbaa48cd1,0xbbb6af4e,0xbbe790ce, +0xbc07020a,0xbbbc32b4,0x3b0ef1e1,0x3c5043fb,0x3ca7d68f,0x3cb7bfb8,0x3c5a1857,0x3b83e666,0x398ea505,0xba7f12ef,0x3a856e4f,0x3bdf7899,0x3b81d295,0x3c1cccf4,0x3cb29ade,0x3c90e112,0x3b7ab9e6,0x3bacb6bf,0x39c540cd,0x39d591b1,0x3a00b127,0xb96cf437,0xb8d8dbf3,0x3924aa6a,0xb63e4eb9, +0x38bb457a,0x38a84878,0x391dbb29,0x3903c5c2,0x38e752b1,0x376830ed,0xba0aa3ab,0xb9bc3117,0xb997e460,0xbace53f3,0xbb499c14,0x3a1f72ca,0x3b06699c,0x3a57f338,0xbbb981b2,0xbc516257,0xbc8a61c4,0xbc283362,0x3ad1554a,0x3c6ccafb,0x3bc2202e,0xbaf3f426,0xbbc82dc4,0xbc6c8630,0xbc480380, +0xbb63bd6f,0x39b58f7d,0x3c4b4d29,0x3cac5a31,0x3c8a3725,0x3b49d96b,0xbb218873,0x3aaed5c9,0xb9e7fe04,0x38e2b6ef,0xb92b86c1,0xb7c5869a,0xb8d024f0,0xb8bd7bb0,0xb8c2a365,0xb89e2129,0xb51bb1b7,0x3945c24b,0x39e4fc20,0x3a5dca3b,0x3b1aebae,0x3b7c1f5f,0x3ad8f768,0x3a37ac37,0x3ac32f58, +0x3ba73cb7,0x3c4325b7,0x3ca6332d,0x3c148544,0xbb6600ad,0xbc8d306a,0xb9b57eef,0x3c4774da,0x3c75bf86,0x3cacde0e,0x3c6f7412,0xbbc18b1e,0x3b61f176,0xbcba7d6e,0xbd36f8f6,0xbc6a8d74,0xbb8dba62,0xbbb412d7,0x39eae21b,0xb8b50c00,0x39775085,0x3891a917,0x3913654c,0x38b9b277,0x3907f71d, +0x38ccd891,0x38cf96a6,0xb7ba1f79,0x39234b17,0xba8385ce,0xba9e77f3,0x383d4879,0xb9ea8be8,0xbb0d31d0,0xbb4f273e,0xbbaa3ac0,0xbbe5c75e,0xbc1388b2,0xbc064285,0xbbf1d9b8,0xba06478c,0x3b7a86e4,0x3c9553ca,0x3c5477e0,0xbc0709a6,0xbc898b3c,0xbc94070c,0xbc70a76a,0xbc331664,0x399eed47, +0x3c805ca4,0x3c8c73d4,0x3c4024b3,0x3b9ba3e1,0x3a5a8a7c,0xba2b9b7e,0xb8b5ac47,0xb9a997d6,0xb9461e7e,0xb95a8c3e,0xb948f236,0xb9588b92,0xb8fd15e1,0xb8b6e857,0xb9157955,0x3a70522f,0x3b9782c1,0x3bfa1008,0x3c027e2f,0x3bf27ce4,0x3bc960db,0x3b9ce951,0x3b369744,0x3aa6c959,0xb9459b5c, +0xbb53b60d,0xbbbb5a65,0xbbeda124,0xbc060f15,0xbbe3b370,0xbb6b3e1a,0xbb9b91fb,0xbbe7e1d7,0xbbf73828,0xbc128aa8,0x3bb400f1,0x3bc1fb1b,0x3b5fdb87,0x3b2a2328,0x3a9dfa34,0x3aa480da,0x3a0ae2bf,0x3a2fff1d,0x3a06b2e1,0x39fa299a,0x39c3e14e,0x39e3d579,0x39c2445d,0x39c16b65,0x39044d41, +0x39d8d837,0x3ac8f5ef,0x3b01c4f4,0x3aa95eeb,0x39604959,0xba25360b,0xbae826f3,0xbb3a872c,0xbb85493f,0xbbb314bb,0xbbe1c9de,0xbbba21ec,0xbba39c1a,0xbba36e77,0xbb94d905,0xbb88206b,0xbb4e1085,0xba491992,0x3aed967b,0x3b89affc,0x3bc0c83d,0xbb8c70f2,0xbba54309,0xbba3eac4,0xbb9cd225, +0xbb9cb882,0xbb80e76d,0xbb357633,0xbaeb2c32,0xbaa98351,0xba835ba2,0xba4e4065,0xba824a6b,0xba6a405f,0xba7dbaf2,0xba0bbd46,0x3721431a,0x3a6597db,0x3aa8b894,0x3aedceb6,0x3b20b680,0x3b1d5268,0x3b1d6b4c,0x3b1de275,0x3b42252d,0x3b683a65,0x3b836ce0,0x3b22ff71,0x3a7f5cfb,0xba032cea, +0xbaabf009,0xbb05f4a0,0xbb3fedbc,0xbb3cc9b1,0xbb536846,0xbb7a40b9,0xbb8e290c,0xbb2783fd,0xbb649f1d,0xbb1cbbd1,0xbb11be0d,0xbab0ebe9,0xba85b5ff,0xba8501ae,0xba3822a4,0xba01ec7f,0x38c883a0,0x3a5bed27,0x3abbe521,0x3b102471,0x3b4393c5,0x3b72196c,0x3b82f175,0x3b8dcb75,0x3b986dac, +0x3ba0cd1f,0x3ba4a558,0x3ba403a2,0x3ba62e4c,0x3ba58461,0x3ba5c6ea,0x3ba1d5fb,0x3ba99ffd,0x3b927547,0x3b86e770,0x3b712554,0x3b4c4be4,0x3b1e26fb,0x3ad2076a,0x3a390517,0xb91076e9,0xba5037f7,0xbad220fe,0x3b18dde6,0x3aea499b,0x3b221d6b,0x3b2d6ea4,0x3b40f629,0x3b242d33,0x3b41a7b6, +0x3b608a57,0x3b7e8cdd,0x3b88af4c,0x3b8ff735,0x3b98dfad,0x3b9f7445,0x3ba5b6f4,0x3b94fb2b,0x3b910632,0x3ba2266d,0x3b9cca42,0x3b9e0aa1,0x3b9c1448,0x3b9f5b4a,0x3ba1a061,0x3ba452ec,0x3ba67865,0x3ba823bd,0x3bab99b7,0x3ba09af4,0x3b9661c0,0x3b8af1ba,0x3b805c53,0x3b6f8d60,0x3b6234f9, +0x3b56d545,0x3b48d852,0x3b35ac2c,0x3b24de7f,0x3ba7da91,0xbaf6c019,0xba948e2e,0xbaa80106,0xbac090c8,0xbad8d316,0xbaee3b48,0xbae45f39,0xbace8453,0xba82938e,0xbaae284a,0xbac1edbf,0xbac91c82,0xbb142c8c,0xbb124756,0xbaa2997b,0xbb0aaa23,0xbb0d208c,0xbac74610,0xbaf9eaf5,0xbaf952d8, +0xbb05e6e1,0xbaec478a,0xbaef7377,0xbafe78ab,0xbb19e2f7,0xbb126c6a,0xbae185e3,0xbaa16644,0xbaa28c79,0xbb04bad8,0xbada50f8,0xbabbec0f,0xba2ff5df,0xba75a22b,0xba889f71,0xbae17ab7,0xba958bf8,0xba5e1e88,0xba956910,0xbab7bf7e,0xbadb8f30,0xbade792a,0xbaf9db56,0xbab12876,0x38e65dda, +0xba12187f,0xba718258,0xbabba232,0xbb406b7c,0xbb559389,0xbab34d76,0xbb679e31,0xbb52ccbd,0xba883e2a,0xbb065da6,0xbb0f5644,0xbb335048,0xbb0f8e56,0xbb360d80,0xbb71c678,0xbbb1f7fd,0xbbaaa6d7,0xbb577dc2,0xba947a5b,0xba327108,0xbb3c2af5,0xbb0293dd,0xbaa2ae92,0x3a581feb,0xb8c3484b, +0xba4be5e2,0xbb27db58,0xba927536,0x3a5ea0fa,0x3959aa54,0xba0cc893,0xbaac43f8,0xbaeca538,0xbaa3e930,0xb99311c3,0x39a9e0d1,0xb8850ac3,0x396b5a2b,0x397fe288,0x3a1a8270,0x38a7111b,0x39def415,0xba9962e8,0xbb3ce4ab,0xba9fb503,0xbb2441e9,0xbb36044d,0xbb7b1c33,0xbb1730aa,0xbb3e1600, +0xbb642a6f,0xbbd0fe77,0xbbb703db,0xbb0e20f1,0x3a6dfc0d,0x3a626e75,0xbb84599c,0xbadfa150,0xb9097ccb,0x3b91ed61,0x3b12c9e4,0x3ac78935,0xbaf5d6fc,0x3a837774,0x39a5cdbf,0xba065082,0xba763e66,0xbac173c0,0xba84abd3,0x39882ecd,0x391a6b2d,0xb90bc30f,0xb6db0223,0xb88829fe,0xb8d6b709, +0xb922d734,0xb6a1c5e3,0xb8f2e33f,0x3a364529,0x38d6bc88,0xba398d4a,0xbb1b40f1,0xbb5d8a64,0xbb9370bf,0xbb42b5f0,0xbb97a297,0xbc08c78c,0xbc70c719,0xbc6e0164,0xbbf6fd19,0xb807eacb,0x3a901ec6,0xbbdcb435,0xbb4b7d8b,0x3a1d5711,0x3befecc1,0x3b5de198,0xb99d1cca,0xbbbd0141,0xbab09b01, +0x3c008956,0x3b86f979,0x3b8349ae,0x3ac70e7c,0x392831a9,0xb7c35b31,0xb89a6f10,0x37c82101,0x37a5773e,0x37f5a3f8,0x38645a82,0x38138f21,0x38110625,0xb86e8658,0xb931734a,0xb95a5b06,0x3a805e73,0x3a4834c4,0xbb38692a,0xbb9c9711,0xbb8d88ba,0xba81278d,0x3bc62058,0x3c8a60bd,0x3cada201, +0x3c8b8295,0x3c2882b5,0x3b9474a5,0x3b832613,0x3b3e2f85,0x3b6e6c5b,0x3bdadde4,0x3bd27515,0x3c2ef447,0x3c9a56ab,0x3c3f7085,0x3badec34,0x3b9c4a82,0x3b133615,0x3abcbbf5,0xb95104d9,0x38051592,0x38990987,0xb792559d,0xb6cef8e0,0xb6f14fd3,0xb7c91296,0xb7901083,0x35c4243f,0x37cfd7c7, +0x38e6458a,0x389620c0,0xba076cfe,0x39291657,0x39c3ee0a,0xbaaa5b1a,0xb97ff850,0xba8ad8f5,0xbb73ea2d,0xbc14f18b,0xbc53b896,0xbc4e2b24,0xbb7803f7,0x3ba27d49,0x3c30788a,0x3b9c2510,0xbae06e5f,0xbbe4dd51,0xbc2179a4,0xbbcc5509,0x3acabccf,0x3b98cef9,0x3c27722c,0x3c8f8ca4,0x3c6abb74, +0x3acb7dd9,0xba593d94,0x39ab6563,0xb9833309,0x3870e374,0xb746cc40,0x36ead915,0x36e4d897,0x364184f7,0xb7337424,0xb823e8e4,0xb869d5e3,0xb8cf7633,0x3997d295,0xb7d6e435,0x39fcb73b,0x3b31af7e,0x3b539185,0x3b8d5bf0,0x3bb0f6a3,0x3c336384,0x3c6d3da8,0x3c773cfc,0x3b17f56a,0xbbf8cd10, +0xbc659109,0x3b44c255,0x3c5f56c9,0x3c3f9c9e,0x3c871e52,0x3c03058f,0xbc2eff96,0x39fc8745,0xbc77d2da,0xbd372495,0xbc6cf70b,0xb9d39916,0xb8a2e165,0x38ff0103,0x38cae8b6,0x37ed64f2,0x3732c6ff,0x366b87c9,0x3698cda9,0x370962a3,0x38035a12,0x387817d9,0x38b90444,0x383a253d,0x39178838, +0xbacbfc75,0xbb30f1a3,0xbb7cc7cd,0xbba03c3a,0xbbac780e,0xbbd8c44d,0xbbfb5d53,0xbc0c8961,0xbbe7bbb3,0xbbcc4b3f,0x3acd8193,0x3c2a427a,0x3c61a590,0x3b8a892f,0xbc8b9719,0xbc482d35,0xbbe522ba,0xbb96ce5d,0xbad48058,0xbb43ac21,0xba541b27,0x3a424c19,0x3a62e15a,0x3aaf2d18,0xba7b79c7, +0x388d0e9a,0xb92fa133,0x37039cce,0xb7cb0257,0xb5a59229,0xb8185d6c,0xb85ba9f6,0xb905738c,0xb9076cc8,0xb9296a77,0xb9acf55c,0x3aff78b9,0x3ba1e054,0x3bd8c5af,0x3bd48ab1,0x3bbb219a,0x3b91c03b,0x3afaeeb7,0x38c8da14,0xbabda961,0xbb471b2c,0xbbac57cf,0xbbd85892,0xbbdadd6e,0xbb8dfd9a, +0xbab26958,0xbb6818c3,0xbbd9594e,0xbc09a646,0xbbd89b99,0x3bd3511e,0x3bef6ab1,0x3ba6ca71,0x3b582b0e,0x3afe13f9,0x3a145dd4,0x39c55018,0x38bcaac7,0x387171d0,0xb75f2e8a,0x36b5ca05,0x386f21dc,0x3901924f,0x39682b85,0x39a566b2,0x3993e277,0x3a3ea19a,0x3b14013b,0x3b293d4e,0x3b0920c3, +0x3a6c5594,0xb9deb010,0xbaf1ec71,0xbb3b4ae4,0xbb8e0a85,0xbbd2f769,0xbbb89dff,0xbbb1684f,0xbbbc5894,0xbbaf9b7c,0xbb9b311f,0xbb1a793d,0xb9e02992,0x3b27e1e2,0x3b9a3b98,0x3bdb3b1e,0xbb21c2c6,0xbb3ba212,0xbb46f2b7,0xbb373f9f,0xbb353337,0xbaedf3f9,0xba78b34a,0xb84e7ee4,0xb7c7dbdf, +0x391f32b8,0x389ea203,0xb7fc9842,0xb96be4a1,0xb9d262e9,0xba5f1366,0xba7c0cd9,0xba139a84,0xb99b1f0e,0x39b43f62,0x3aa326bc,0x3a270d0c,0x39e1d302,0x38a717ae,0xb7a42fb8,0xb8ce23c9,0xb9906bb1,0xba5dad6c,0xbabf726b,0xbafdfd7d,0xbaff8ffe,0xbb00579d,0xbb179776,0xbb095d1c,0xbb146a47, +0xbb255044,0xbb3507c3,0xbb4e3cf1,0xbb83b20f,0xbb789022,0xbb5b07ec,0xbb445f9e,0xbb34d71a,0xbb32af7a,0xbb2221c4,0xbb0fab00,0xbae5887c,0xbaaf652c,0xba741502,0xba0f8c3a,0xb8a92ec2,0x3a5b56ee,0x3ac8a98d,0x3b1032c2,0x3b404bad,0x3b818323,0x3b881bf7,0x3b804da2,0x3b7d5782,0x3b756542, +0x3b6e8e41,0x3b64af1c,0x3b65f1bf,0x3b3c92ec,0x3b214cc4,0x3b024b07,0x3ab1ff61,0x3a3077c8,0x379dd27d,0xba2a71ff,0xbaa09974,0xbad6475d,0xbb19a5a3,0x3a25834f,0x39b1629b,0x3a4cf6ac,0x3a6c7d2d,0x3aa85dde,0x3a355bdd,0x3a8fa2cc,0x3abeaf86,0x3ae5ee32,0x3b00b3ca,0x3b10f6e9,0x3b217a86, +0x3b3538ba,0x3b42ff57,0x3b29fc60,0x3b1a0b2f,0x3b61a747,0x3b4961db,0x3b462343,0x3b3b6d33,0x3b402126,0x3b3f52d3,0x3b3f3925,0x3b3f1f1d,0x3b3db583,0x3b3fb5f8,0x3b2c19a6,0x3b1a74fc,0x3b086096,0x3af3e66a,0x3adc5e91,0x3ac6601f,0x3ab532ec,0x3a9b0d19,0x3a6fe619,0x3a43e990,0x3b328cf8, +0xbad72ba8,0xba8ec8f5,0xbaafdbd0,0xbab2ddc8,0xbac1e3a4,0xbac6388c,0xbabf00e9,0xbab3ac1f,0xba0865e0,0xba8c6f2b,0xbaa73ec9,0xbaad7062,0xbb03d3e9,0xbb0a1b1d,0xbabd751b,0xbaeb4907,0xbad4c791,0xbaba35ce,0xbad1c383,0xbace8084,0xbada3b53,0xbad3bff2,0xbadca7ec,0xbb003f16,0xbb0125f3, +0xbaf05d5f,0xbac53214,0xba915529,0xba9b7b11,0xbb0d431c,0xbac2b8aa,0xba9dd240,0xb9d87813,0xba7da834,0xba91674b,0xbac72085,0xba8df717,0xba64340c,0xbab75cbb,0xbaa9202d,0xbaab8d64,0xbab3252c,0xbae029e1,0xba61b174,0x39eb7018,0xb924b22b,0xb9817dbd,0xb9a563d1,0xba67b5d5,0xba8b739f, +0xba0f70a0,0xbb05bd11,0xbb1e0adf,0xbab57a38,0xbab121ff,0xbadea164,0xbb172ecd,0xbb121293,0xbb3f505e,0xbb81bbaf,0xbb8f88bd,0xbb7cf0d8,0xbb282840,0xba582cbe,0xba5dfbf8,0xbb654f3c,0xbaf9e4e9,0xba833117,0x3a841558,0xb9f1dc53,0xba916b3f,0xbb09966e,0xba898d63,0x39967e45,0xba806adc, +0xba320cd6,0xba8ff3a2,0xba89b8e8,0xb9612e65,0x39453e01,0x37260bfd,0x3748ee6c,0x3916d830,0x39220331,0x39c58580,0x39a1e28a,0x39a8b61b,0x39ca145c,0xb9401071,0xba60f0b0,0xbad8b7ce,0xbaf4f175,0xbb41a29d,0xbb148d54,0xbb4c5178,0xbb8e16f9,0xbba41798,0xbb845aab,0xbaf4551e,0x3a07ce98, +0xb78cd524,0xbbaf549f,0xbad4c395,0xb898b01f,0x3b8da340,0x3a67a5f1,0x397cc591,0xbad6120b,0x39a3d6c8,0xb6ac593b,0xbacd8c2a,0xba7e8a7a,0xba3976be,0x3909668b,0x3957387f,0xb88039d9,0xb73bc11a,0xb6ee7a15,0xb83edc8f,0xb8be5fa1,0xb9205a74,0xb907ba89,0xb92366aa,0xb8ebf2c9,0x3966d160, +0x38f5076f,0xba80eb2d,0xbb1cda24,0xbb8382b1,0xbb72b96b,0xbbc4e834,0xbc213015,0xbc41a4cf,0xbc27c03c,0xbbad8fd2,0x3a080d4f,0xb9b1f87d,0xbc116c17,0xbb6e27ce,0x3a15662c,0x3bdfa443,0x3acbf07b,0xbacfbd9f,0xbb8904e4,0xba83a7bb,0x3b32eaf9,0x3b22e910,0x3b0a3780,0x39cf85a9,0xb8ab8eca, +0xb8697254,0xb72ec590,0x381b7543,0x36456639,0x37a20318,0x384b0712,0x389054d3,0x386b2ebf,0x38b51d35,0x36f89082,0xb8ac7def,0xb8b36559,0x3a4e3cd4,0xb9a8488f,0xbaffa9a3,0xba0a8fce,0x3b26dfce,0x3bea8dc6,0x3c71439d,0x3c80d776,0x3c1a8d3e,0x3bad3eb5,0x3b46f793,0x3b8695e9,0x3b9ccc7e, +0x3b90aeb9,0x3b4f0881,0x3bb1ca95,0x3c07f563,0x3c5037bd,0x3bab9bb0,0x3b8f2146,0x3b2c594b,0x3b01c0c5,0xb8df9951,0x38392337,0x387ceb51,0xb800a19f,0x373220f1,0xb7c3065c,0xb7539252,0xb7f9c385,0xb7f3a8a4,0xb8277f9d,0xb7d9de0a,0xb7e405d9,0x38df16ef,0xb89c6502,0xb9280d16,0x3a358ae7, +0xb987e7f5,0xbaefe8da,0xbb876e60,0xbbe78d7b,0xbc2f5e3d,0xbc31286f,0xbbe3d043,0x3a4fd321,0x3bba1e23,0x3bc1fa25,0x3b3eb664,0xba93b038,0xbbb33320,0xbb99a3b9,0xba9db680,0x3b940134,0x3bc1cb93,0x3bd13c7c,0x3c3ede93,0x3c04c026,0xb9f3efdd,0xb939b1d3,0x38bd04f1,0xb7f93393,0x383c331a, +0xb4a126ac,0x37fb4cd7,0x37ac0083,0x37c579d8,0x37efe291,0x376369fb,0x379da6b3,0xb894cca5,0x37f8072c,0x38efd37f,0xb9bb1e2d,0x3ac5f7f2,0x3b7dae5c,0x3bcec053,0x3c05192b,0x3c51b64b,0x3c4e4ea8,0x3bf67b02,0xbb03b2ca,0xbbf31fa1,0xbbfd2253,0x3b8ac5fc,0x3c2cf1dc,0x3c026279,0x3c0ebfb0, +0x3ab9ba88,0xbc1cb628,0xba4f9e1a,0xbc19cda3,0xbce599ca,0xbc2376af,0x3abf9b82,0xb8f9bb74,0x3859a321,0xb79f1ff3,0xb824087d,0xb80a1697,0xb815a9a1,0xb813233f,0xb7fc2938,0xb7c1db79,0xb7f74fd1,0x37e2cbd1,0xb6b1b36f,0x394f5b00,0xb9413882,0xbb37b8eb,0xbb9857ee,0xbba15f70,0xbbab400b, +0xbbc91458,0xbbc81d9a,0xbbc3ea59,0xbb987107,0xbb10772b,0x3b891389,0x3c4ea26c,0x3bc7b730,0xbb36831f,0xbc5de665,0xbbb41bde,0x39d0cebe,0x3b1b6de1,0xb9a9acc9,0xb9a442d0,0xbc48949f,0xbc0305ae,0xbaea7087,0x39599932,0xb8f9393f,0x38b7d54a,0x385da32b,0x38b3af6f,0x38778083,0x388eadf2, +0x386f2d14,0x38059174,0x3855901e,0xb867e13e,0x381223f1,0xb9bace30,0x3954807e,0x3b3e7fb6,0x3b9e8d35,0x3b96de60,0x3b856bbd,0x3b48bbaf,0x3a9d1883,0xb9b6b2fa,0xbafe51c2,0xbb242f93,0xbb850211,0xbb8c6ce9,0xbb8a5516,0xbafdb671,0x38fce319,0x3853dc5d,0xba47d1f9,0xbad3ad82,0x3b084af2, +0x3b9761c2,0x3bc5e240,0x3ba9aff6,0x3b1db451,0x39b1dc44,0xb881d2b2,0xb79810b9,0xb95c47d6,0xb9165aa4,0xb91ce944,0xb91116b9,0xb8f1cbc4,0xb8b83393,0xb8534be5,0x34f79bdb,0x396c605d,0x38ba33b1,0x3ad4d57f,0x3b3ead2c,0x3b46814a,0x3b07b6b4,0x3a894a3f,0xb9883d36,0xba6002d2,0xbb063b23, +0xbb84f55c,0xbb85e030,0xbb8b51a2,0xbb951b1b,0xbb8523f0,0xbb5d5241,0xbaa05b5b,0xba0fc559,0x3abe3597,0x3b32fd22,0x3b84e8f1,0xb9dda3a0,0xb9f832a8,0xba81a91f,0xb9f9e0d0,0xb9b97ffd,0xb851c527,0x39a7b30e,0x39ff9ca8,0x39bb0c29,0x39ba8468,0x39a61e9e,0x3993021c,0x3955ac57,0x3947bbd8, +0x3821fd25,0xb9ac9b3d,0xba1ef3c5,0xba81398f,0xba6ba466,0xb9c6e81e,0xba70118c,0xba8bcf1c,0xbab5457c,0xbae354b8,0xbb081e4c,0xbb21d189,0xbb1391f3,0xbb0e4ad7,0xbb02d6e3,0xbacf81c2,0xbaa413e6,0xba95bee0,0xba75dcf7,0xba7bacfc,0xba718e80,0xba40583f,0xbb064455,0xbb2132fc,0xbb3250f2, +0xbb1d7f9e,0xbb1e7439,0xbb0c5cea,0xbaec3556,0xbabdd56f,0xba8eb3a3,0xba846ad9,0xba681ce6,0xba497eef,0xba2e0817,0xba22bd2b,0xba019e05,0xb94270af,0x39d66e97,0x3a99d2e3,0x3b1a66cd,0x3b230bf4,0x3b0cebc0,0x3b02cfeb,0x3aeccc12,0x3ad221a4,0x3abae1c7,0x3aa34862,0x3a79846f,0x3a3b9290, +0x39effc3c,0x38cedbbc,0xb98b8d2a,0xba1bef16,0xba6adc08,0xba932972,0xbaae0642,0xbadbf817,0xb9d68351,0xb9fded40,0xb9b04fb0,0xb9a09f97,0xb9193d73,0xba0a39e1,0xb9fc1c96,0xb9feb3f6,0xb9d29ed2,0xb97a1055,0xb864dfb0,0x38fd0ac4,0x39b17913,0x3a0f12de,0x3a1fe2af,0x3a198e1d,0x3abf8f9c, +0x3a99f7ec,0x3a8ebc11,0x3a71ccf8,0x3a72c9e3,0x3a60824a,0x3a4e8f06,0x3a4153cc,0x3a2fac9d,0x3a20de22,0x39f8b528,0x39b1fea7,0x3964e40e,0x390f347a,0x38a4ac46,0x37d178dc,0xb81f4634,0xb913719b,0xb988807c,0xb9b1ced2,0x3a05ff4d,0xbaa25a11,0xba745943,0xba984418,0xba939b51,0xba9742cb, +0xbaa65618,0xba956d06,0xba85776a,0xb9a8a575,0xba3d8146,0xba613b36,0xba60ae12,0xba9c2f51,0xbaaa6692,0xba906861,0xbaa8f933,0xbaa02687,0xbab6222a,0xba8c4b07,0xba8b3bb3,0xba90acc0,0xba9da9b2,0xbaa821ea,0xbac7572c,0xbaae1b53,0xbaa1a8dc,0xba95a989,0xba799b9c,0xba884c3e,0xbadd77a4, +0xba9a5401,0xba7cebf7,0xb9c95e5a,0xba650a73,0xba7bb9db,0xba8bffc2,0xba6b5bcc,0xba5b91ac,0xbaaf3c9b,0xba8d4af0,0xba708813,0xba702f81,0xba1ae72a,0xb8b45989,0x393a8ce3,0x382a4c3f,0x38b58053,0x38da6b61,0x38821591,0x385642d2,0x39162df9,0xb955435c,0xba107d21,0xba84b386,0xba4a3407, +0xba73c526,0xbabf31dc,0xbaeb6035,0xbb1a0c50,0xbb4675bc,0xbb2dcd20,0xbb0fe1ae,0xbae3b4b2,0xba5ad4fa,0xba897af0,0xbb3941c0,0xbad66222,0xba79c8b1,0x39fe6ffe,0xba2ca920,0xba86a3a3,0xbaa6b02c,0xba6450c1,0xb9a51763,0xbad36f62,0xba4a5b00,0xb9f4bd48,0x381192b6,0x396184bf,0x38a1d459, +0xb87f6e7c,0xb6fe0f36,0xb6a01b39,0xb7bc6a42,0x37621563,0x3749047f,0x3620e3c5,0x389ea142,0x398d6b59,0x3909054a,0xb9cbee43,0xba3857d4,0xbac2f98a,0xbae24fd5,0xbb1fe0f8,0xbb6149cf,0xbb337261,0xbb0566e8,0xbabad031,0xb9a29c10,0xba7ecd83,0xbb8c2887,0xbacaa18d,0xba029b18,0x3b2974dd, +0xb9473009,0xb9dd7c1b,0xba523291,0xb9891b0f,0xba06b506,0xbb0cc3d4,0xba186a9b,0x389060e0,0x389a839d,0xb8e1f92a,0xb811dafd,0x371a0782,0x371a2df4,0xb6861b5c,0x37756b52,0xb747c914,0xb7950d1a,0xb7065d8f,0xb84dd01f,0xb911a8b2,0x37848902,0x385ecdf8,0xba476cc2,0xbb1893e5,0xbb59ce84, +0xbbab79e4,0xbbf90b8f,0xbbdab330,0xbba5a8df,0xbb4c02bb,0xb97762db,0xbad0788a,0xbbe78ff9,0xbb617020,0xb9c8383e,0x3b853e44,0x39587b48,0xbac5519f,0xbaee64da,0xba3d92cd,0xb85d3e4f,0x3aa16ba0,0x3a31117c,0xb8cbc6c5,0xb7756dc0,0x37a2c386,0x3824c195,0xb7b88c12,0x36838fde,0x36b2c251, +0xb540c60c,0x36e4299a,0x374b711b,0xb64da25d,0x382c956d,0x386a851f,0xb7721f28,0x361cc678,0x39d3fb07,0x3a24f1bd,0x3b057ec0,0x3b89b1b4,0x3bd20e76,0x3c16b153,0x3c075beb,0x3b67ffb2,0x3aa3c66a,0x3a8fe338,0x3b26e104,0x3b988104,0x3b750a76,0xb9c46485,0x3b3cc99d,0x3b900d03,0x3bc53482, +0x3a93f469,0x3b3354e6,0x3ad40a4f,0x398d7f25,0xb9a80f0c,0x39689626,0xb9087af5,0x3879d474,0xb80a38e4,0x3788ba86,0xb70d9810,0x35f94b5b,0xb6be6a4b,0xb460cc26,0xb6e4c19e,0xb737aafa,0xb836573b,0x383c7aa1,0xb8e907ed,0xb7abb3bb,0xba69f275,0xbb503076,0xbbafa363,0xbbef1141,0xbc0a23d3, +0xbbd5ba7c,0xbb17fe97,0x3b3dc5cc,0x3ba0a56d,0x3b362009,0x3a9d50eb,0xba533b0f,0xbb571751,0xba5ef69f,0x3ad883e1,0x3b963865,0x3b9c46c5,0x3b3019b4,0x3baf9eb4,0x3b041045,0xba4ae1c0,0x397fe512,0xb88cf947,0x38080ffa,0xb72a1439,0x37702272,0xb5657fbb,0x3692a8f6,0x36758404,0xb421f2c8, +0x3755d118,0xb607109a,0x3841188d,0xb893ec8a,0x38ab7282,0xb80c4de8,0x3a86ef7e,0x3b6ddedc,0x3bc08e5e,0x3bfce6e1,0x3c1a183a,0x3bee48a6,0x3aedd34c,0xbb6e3b24,0xbbb06bd4,0xbb2b17c9,0x3b5ffa57,0x3bbdcfc6,0x3b856f8b,0x3ac8156c,0xbb3e573c,0xbbc9c2d7,0xba8bd2ba,0xbbca5009,0xbc493d80, +0xbb1abeef,0x3aa55571,0xb9ef205b,0x3906dd98,0xb8b2ae56,0x37900db6,0xb7a8ac2f,0x33f19116,0xb6f0df17,0xb6642b80,0xb6f16203,0x353ab47f,0xb7cdbf00,0x37130eee,0xb89c4b68,0x399a3f4b,0xba6df118,0xbb4abf40,0xbb48fdfd,0xbb671b1f,0xbb854cec,0xbb652a5e,0xbb3ac417,0xbb034641,0x3ae4bb5e, +0x3ba613f0,0x3c0ae621,0xb9467d1a,0xbbae7718,0xbbd3a76c,0xbb03f653,0x3b09a3b5,0x3bb7dc02,0xbb027de3,0x3b8faa25,0xbc28b98d,0xbb945430,0x3a14adee,0xb8f18bed,0x38de595a,0xb71986ab,0x3821bc02,0x35a354a9,0x37a3fa1b,0x3701da56,0x3741d36e,0x373d6294,0x36ed30a6,0x37c9afba,0x36974117, +0x388f2d50,0xb9d2bd7a,0x3a8df6c5,0x3b4c9881,0x3b23b0d7,0x3b066a97,0x3a905673,0x395a1137,0xba505973,0xbb0defdd,0xbb1fb201,0xbb5025d8,0xbb1b9268,0xbb151a74,0xb9ae80c8,0x3ae16275,0x3b718aa7,0x3b9ff62a,0x3bbfc67d,0x3c014668,0x3a4f04b2,0x3b4086a4,0x3b3cf68c,0xb7c52523,0xb96173b0, +0xb826ca93,0xb8db10f8,0xb7ae5f80,0xb81a9efc,0xb7c13e68,0xb7c8fd13,0xb7a20c86,0xb7a5c4ea,0xb79d8166,0xb826fdf5,0xb83c5c5c,0xb82a96a9,0x3971abaf,0x3ae42f45,0x3b23aca4,0x3b00afe3,0x3ad2604d,0x3a530850,0x39e66617,0xb9d00e37,0xbadf2ca8,0xbb0e0726,0xbb1be91e,0xbb240d45,0xbb0fffb4, +0xbb043708,0xbab7d589,0xbaedfb82,0xbaa3bda0,0xba493bf0,0xb9b328b0,0x3a8e5898,0x3aa729de,0x3a0ca378,0x39ce48b6,0x39607555,0x395a3cf5,0x39030237,0x37f38cc0,0x383f21d7,0x37ef0b3c,0x3811c77a,0x37d87e5b,0x37d3bbb9,0x37c371ed,0x3869bf17,0x38ffbeea,0x387ae062,0xb9f99db4,0xba96a583, +0xbaa8d796,0xbabe084f,0xbac77182,0xbad6667b,0xbaf877bb,0xbb0c74ae,0xbb1ea503,0xbb0fd774,0xbb0940f4,0xbb01c862,0xbabc8026,0xba7b74a8,0xba01b12f,0xb923ea07,0x38b0717f,0x39dec800,0x3a6736fa,0xbaa86f18,0xbaac5c7f,0xbac5f8ae,0xba89ccff,0xba79926b,0xba21d7fe,0xb949eabb,0xb85d11cb, +0x369ac197,0xb7b562f3,0xb78a2d91,0xb7bd1fe8,0xb58611b0,0xb74b5fb6,0xb8f1a52a,0xb9a81b79,0xb9edcb74,0xb9b8354d,0x39ac8d9e,0x39a980b2,0x389fc913,0xb8b14033,0xb973ffcd,0xb9d7aae3,0xba0e11d2,0xba391195,0xba3bba6a,0xba3e2085,0xba49f0ef,0xba63c60b,0xba8310c2,0xba941dd9,0xba99b8ac, +0xba9a95f9,0xbaa4b18a,0xbaaa4073,0xba5df681,0xba535832,0xba6298cc,0xba79d127,0xba816ac4,0xba877a6d,0xba8b938d,0xba8abb06,0xba88b263,0xba7dca1a,0xba6dcc10,0xba5d7240,0xba4f8451,0xba39fe6c,0xba2e1f2b,0xba2d74a7,0xb972d47d,0xb9961bb3,0xb9b8b709,0xba02de50,0xba097737,0xba1a53fc, +0xba2d12bf,0xba3a0ade,0xba4a03f4,0xba5fc0cf,0xba61c02c,0xba67ca7a,0xba6716d0,0xba652869,0xba5d0272,0xba5442bb,0xba534c1f,0xba5588af,0xba5261b5,0xba55d02b,0xba557042,0xba0a6db1,0xb9e46d28,0xba04f393,0xba07613f,0xba120926,0xba2c8772,0xb963739c,0xb9400263,0xb7dc5f1a,0xb8c83c20, +0xb8ed3c75,0xb8e6fb7d,0xb91a8a62,0xb926237b,0xb90f8b3d,0xb94a699c,0xb946eb07,0xba422549,0xb9f4c830,0xb9d49d97,0xb9dbc077,0xba023900,0xba0b2348,0xba239201,0xba068638,0xb9fd7f6e,0xb9ff8cba,0xb9ee95c1,0xba009b95,0xba31a8bd,0xba076580,0xb9e78a28,0xb973f88e,0xb9d91e0b,0xb9e1baac, +0xb9d3d09b,0xb9d0c8b9,0xb9cc685d,0xba22b304,0xba12407c,0xb8e62215,0x38206717,0x390b82e1,0x387d05e6,0x3832f9d1,0x3825778d,0x386dd2d5,0x3859f711,0x389615c6,0x3881a809,0x38a6f995,0x388e7ffa,0x391965f5,0x385ce02f,0xb813c1db,0xb9a7451e,0xba032def,0xba44980f,0xba7e49d2,0xba99ebe6, +0xba6bd2e4,0xba3f46de,0xba31b5bf,0xb9fa2726,0xba1a031a,0xba91193c,0xba41d7f8,0xba017692,0x37a8f769,0xb9bec3eb,0xb9ea396b,0xb9c57b13,0xb9c3ecf2,0xb97a0e60,0xba7bee6e,0xb8dad387,0x38ed4cbb,0x37d48f11,0xb827cf5d,0xb7b83ff7,0xb74d5283,0xb71131e0,0xb749d7a8,0xb7716eae,0xb7979d25, +0xb7c69c1d,0xb7cc451f,0xb7c32374,0xb84cb7d7,0x36df4615,0x38c3a5fd,0x37a5454c,0xb9cb9574,0xba2df837,0xba765724,0xbaad8f27,0xba549239,0xba16d80a,0xba1b378f,0xb9d6634f,0xba35cdeb,0xbace5789,0xba41d186,0xb9cb571c,0x3a31a8be,0xb99c99cd,0xb98f6220,0xb8a8fb35,0xb969755d,0xb9aef9b1, +0xba91aa5f,0x3914a1c5,0xb7d88cce,0xb80b3299,0x37c0ac45,0x3788c8cd,0x376a3679,0x372ba13d,0x3787efeb,0x36fed551,0x375c4898,0x377cbe75,0x3742223b,0x3713788d,0x380e0e52,0xb83097a1,0x3731805f,0x3797ecbd,0xba213c41,0xbabede7e,0xbb0e6027,0xbb3ce1e7,0xbb036e7f,0xbaae43cd,0xba891f6b, +0xb9f4289b,0xba893e45,0xbb2aaef6,0xbaca880d,0xb9fa9950,0x3a908c96,0xb92a7fa5,0xba0e5fd7,0xb92f8a9e,0xb9666a4c,0xb9cf7e75,0x398fc47b,0x37f7a132,0xb782049b,0x37a3ea7a,0xb629831d,0xb7a7c8b6,0xb59ecd98,0xb6ec622d,0xb6ca9b66,0xb605d609,0xb67f7c03,0xb70032be,0xb69387eb,0xb74d4fec, +0xb6d1e84b,0x378338a4,0x3502cda4,0xb83901fa,0x3a7a7d19,0x3ad427c4,0x3b1b9ab0,0x3b45813c,0x3b3fff3a,0x3b0d9c87,0x3a466474,0x3843dd66,0x399aeacf,0x3a6e0d96,0x3b079221,0x3ac93333,0xba6edfcc,0x3a50c775,0x3a996145,0x3aabc2d7,0xb90573b7,0x3a8a6572,0x3a3845b2,0xb9970e02,0x38f790d0, +0xb87fddbc,0x3815a4bb,0xb6d50ff9,0x3797303e,0xb5414f58,0x3685d3d9,0x361a04b1,0x368bfb54,0x367bf01c,0x36c38510,0x36cea65e,0x36ae7440,0xb6b8ae3f,0x37158c75,0x389922e4,0xba59b66c,0xbaff5808,0xbb367510,0xbb5b60aa,0xbb517df4,0xbb052d93,0xb99587dd,0x3ad077bc,0x3b04b130,0x3a50c349, +0x3932987a,0xb9d34c79,0xba94c939,0x39ff86c8,0x3abb4929,0x3b063831,0x3af24698,0x3a01b433,0x3a73f53c,0xb887b5d0,0x378c1f82,0x3703f97c,0x3685f94f,0x367e318e,0xb5632f01,0xb6e589c9,0x32afd697,0xb65f0a69,0xb627b005,0xb5f02ec8,0xb642c65c,0xb3cc996f,0xb6e7a7c9,0x37b78557,0xb7ed95f4, +0x376def15,0x3a06baea,0x3ad7f123,0x3b23383c,0x3b505586,0x3b498f9b,0x3aeebef0,0xb99a6ba4,0xbb04deb7,0xbb0a99b4,0xb9837d9c,0x3aa63bb4,0x3ad8580e,0x3a96a9e1,0xba606818,0xbb1204eb,0xbb06ee9d,0xba0d5212,0xbb1f4c5f,0xbb39d1af,0x3a18cfb4,0xb923c8e2,0xb4e4f6e4,0x3712bfc8,0x347dd838, +0x3633a5b4,0x36870302,0x3655ab36,0x363649f1,0x367d788c,0x3675d4fc,0x3625e570,0x36b5362f,0x36beecb5,0xb77a7bbf,0x37ba6eb6,0x38216d1c,0xba4f0183,0xba793d21,0xba95b217,0xbaa2d89d,0xba825de7,0xba07a469,0x37f9b120,0x3b041239,0x3b2fae0b,0x3b266f10,0xba997021,0xbb262347,0xbab625d4, +0xb9488a9c,0x3aa2dfc2,0x3b3c9707,0xba9376d0,0x3b5ac2bf,0xbaf568a7,0x3930e42a,0x38cbed81,0xb87d465d,0x3811dbc3,0xb7a2d540,0xb6a5b29f,0xb6eb24ab,0xb6be8c9d,0xb6847acc,0xb6a55b67,0xb6b337a4,0xb6c278c3,0xb66fa0fe,0xb751b168,0x3809d1eb,0xb73d4d39,0xb8defc77,0x3a864794,0x3a30d525, +0x39ff3855,0x38059bad,0xb962ac94,0xba0fd068,0xba8b049d,0xba97a597,0xbaa70a8f,0xba407055,0xb9eb4ec0,0x3a14d5c1,0x3ae8dc3e,0x3b423d4a,0x3b79796a,0x3b9a3239,0x3b97e439,0xba3f3c22,0x3a0b483a,0x3945f186,0xb94f715c,0x38c4dfe9,0xb7d44600,0x38276652,0x3724e098,0x378fe3d7,0x373c17b5, +0x37495976,0x370e91b7,0x37442867,0x3720dc51,0x37c48da8,0x366ae7b1,0x37b737e7,0xb8a54f55,0x38f8b2e7,0x3a87b351,0x3a616610,0x3a63da04,0x3a21a2f4,0x39e19a08,0x38dff560,0xb9916005,0xba0abd50,0xba204614,0xba288de8,0xba31d67d,0xba5b9958,0xba824c6c,0xbab9060b,0xbac2792b,0xbab51603, +0xbaab9647,0x3a6af123,0x3a9807f6,0x39924eca,0xb7b5b0fc,0x3766093d,0xb81fcfd0,0xb8101eed,0xb7f8f181,0xb8008fee,0xb7de18c4,0xb7f2b90e,0xb7cb64c4,0xb7be7351,0xb7c3ff4c,0xb7c0a5cd,0xb808f166,0x3776c3b7,0x390a2c76,0xb92e9601,0xba23f831,0xba187c0b,0xba28e363,0xba2db186,0xba476d9f, +0xba5ddbab,0xba799664,0xba6eb912,0xba7028df,0xba71e16c,0xba2be664,0xb9cfd9a3,0xb8f6d6cb,0x3913b75a,0x39c46f3e,0x3a226336,0x3a67617f,0xb9ee1919,0xb9c91c8b,0xb9ab10b7,0x382ff4b1,0x383bbc64,0x38ea23d8,0x38bad8d4,0x38dfcf74,0x3892d193,0x38bc2350,0x38aed874,0x38bbe393,0x3898d1de, +0x38bd2851,0x38b4ce6e,0x38ea2bc8,0x38857400,0xb8dfde91,0xb9cd73ba,0xb9dd2991,0xb9e54603,0xba07f033,0xba10aeac,0xba20d8e8,0xba2a0625,0xba369cbe,0xba273521,0xba1a4377,0xba1534e8,0xba14610d,0xba1a83a6,0xba21f5ab,0xba1b0a0b,0xba12598c,0xba13009e,0xba07e992,0xb9d8ca18,0xb9c683d8, +0xba0697fc,0xba1102aa,0xba1f4119,0xb9443bb0,0xb9594495,0xb9403233,0xb9409feb,0xb9403ca5,0xb941b375,0xb93eb877,0xb93b8f84,0xb9328856,0xb952b729,0xb9542e9d,0xba176ef7,0xba08614e,0xba041846,0xb9fa1149,0xba0a7366,0xba0d2864,0xba13a976,0xba17a447,0xba1c5b4b,0xba2527bc,0xba2023da, +0xba1d32f8,0xba15f751,0xba108050,0xba07fbb1,0xb9ff7999,0xb9f6f6a1,0xb9ef625e,0xb9e11009,0xb9db64bd,0xba1f5d84, +}; + +const uint32_t defaultHRIR_rom_EL48[HRTF_MODEL_N_SECTIONS * 470] = { +0x3e8fdcf1,0x3e8e2708,0x3ea53482,0x3e7c2de6,0x3e8fe783,0x3e906f77,0x3e9cddeb,0x3ea14109,0x3ea4da3b,0x3e9bbc9a,0x3e96062e,0x3e8f4bf3,0x3e8aaf7d,0x3e86b5df,0x3e8433e5,0x3e813d26,0x3e7d4d8a,0x3e78207d,0x3e742259,0x3e5a5203,0x3e8c3f1f,0x3e7d5e54,0x3e9285e3,0x3ef28ede,0x3e7742e2, +0x3e8ce88c,0x3ed9c917,0x3edf1bd9,0x3eda040b,0x3ebdd7d4,0x3eda97bf,0x3ee14156,0x3ed85779,0x3e90d3f7,0x3e8790ef,0x3eec0412,0x3ea8cd79,0x3ece6925,0x3ec47da1,0x3ebd9a80,0x3ed966e3,0x3ee7df3f,0x3f0a6b43,0x3f150db1,0x3f167f00,0x3f073082,0x3ef21552,0x3ed4e4bc,0x3ec08701,0x3eb2e282, +0x3eabf3c8,0x3ea35e5b,0x3e9b604e,0x3e951978,0x3e88e34a,0x3e799760,0x3e7556b2,0x3e7c70c3,0x3e18ad46,0x3e2aa56b,0x3e03b4c9,0x3e010068,0x3e14601a,0x3e1318de,0x3e2b1b01,0x3e22f5da,0x3e291c0d,0x3e27ed4b,0x3e0ebece,0x3e26bb84,0x3e2ae4c7,0x3e45e480,0x3e731040,0x3e96dc2e,0x3ebbe576, +0x3f0df63b,0x3f185058,0x3f2f4f39,0x3f5f633e,0x3f770181,0x3f80938f,0x3f5f3a68,0x3f419c66,0x3f23635f,0x3f0bb291,0x3ef3b0d2,0x3edf117f,0x3ec653ea,0x3eb1554c,0x3ea3754f,0x3e819f11,0x3e7536cf,0x3e15b0af,0x3e0be51a,0x3dc6f788,0x3dba046c,0x3d9e30bd,0x3d97db1f,0x3d88cc62,0x3d8ff480, +0x3da08fc8,0x3db705ed,0x3d81e369,0x3da1e8fb,0x3da2c5dc,0x3dc265af,0x3de656e6,0x3e256d3a,0x3e598bb7,0x3eaef2c2,0x3efee21b,0x3f444555,0x3f6438ad,0x3f8c4747,0x3fb8e107,0x3fd6d06a,0x3fdb249e,0x3fb0c966,0x3f8b3bda,0x3f4cb436,0x3f1ca18e,0x3f030e80,0x3ef1874c,0x3ed4119f,0x3eb9a223, +0x3ea9d5bf,0x3e8296f9,0x3e4eb3e6,0x3df4d90d,0x3db0650b,0x3d6f6077,0x3d44b0ec,0x3d05342e,0x3cd8c1a9,0x3cbf119a,0x3cd12ebf,0x3ce83eac,0x3d049cbf,0x3cc6af7a,0x3ccb3b17,0x3d06da74,0x3d4e2e2c,0x3dc31338,0x3de90336,0x3e3e4014,0x3f47f649,0x3fa1245a,0x3fd3acac,0x3fde77f6,0x3fec2853, +0x3fe593de,0x3fe96050,0x3ffa4582,0x3ffd2d34,0x40041b8b,0x400541c7,0x4001e8bd,0x3fed6164,0x3fcee5df,0x3fa4929d,0x3f7b4813,0x3f3f3f70,0x3eeb8e5d,0x3ea84661,0x3e54eea5,0x3e126301,0x3da32fb1,0x3d661c88,0x3d17185e,0x3cf9cc3a,0x3ccfa3dd,0x3d03dfbc,0x3d080ea1,0x3d0bfb8e,0x3d0e3e9b, +0x3d3a2b8b,0x3d97d3d2,0x3ddf9f5f,0x3e2cbfe3,0x3e6b3c91,0x3ee1cf1c,0x3f4a2014,0x3f7890ed,0x4024d50d,0x402f3e01,0x402ce8fa,0x40102e20,0x4011227a,0x401651ff,0x400d2f17,0x400900d8,0x4008f280,0x40068f8f,0x400126da,0x3ff0457b,0x3fb996c6,0x3f8b9e2b,0x3f6068b5,0x3f0be8a0,0x3ed5acad, +0x3e68eec9,0x3e45b6ba,0x3de819c5,0x3da1edf5,0x3d4288a4,0x3d151188,0x3cf527fa,0x3d104a92,0x3d26fca8,0x3d4f20b7,0x3d409322,0x3d59f3cc,0x3d96abf0,0x3dc8860a,0x3e1553b6,0x3e6dc06e,0x3ec4a74c,0x3f8aa8eb,0x3ff8b3b7,0x40808960,0x40768ef2,0x409c2f8a,0x40479ce8,0x402a7e54,0x401d47c0, +0x4002cb90,0x4004c608,0x4014c7d7,0x4019a72a,0x40194d70,0x400d24a1,0x3fdbc40b,0x3f9d47d1,0x3f5db62b,0x3f0b1d4b,0x3edaced4,0x3e6bca5e,0x3e48d1e9,0x3e0bff65,0x3e08773c,0x3da209bc,0x3d773fcb,0x3d8e5bdf,0x3d6759bc,0x3d7f6a8d,0x3dd2459a,0x3d67597f,0x3d670b0f,0x3d9e4691,0x3e2b93b2, +0x3e3c39bc,0x3ef6ec2c,0x3ebeb9b8,0x3f9c6287,0x4022ef5e,0x408c4efa,0x407affd6,0x409ec200,0x4039eecc,0x4011e38c,0x400348e9,0x40104faf,0x401ad488,0x4018d5ac,0x400ba5a3,0x3ff9e422,0x3fd0076d,0x3f9f0267,0x3f67bd92,0x3f22bc44,0x3ee99177,0x3ec15245,0x3e814c70,0x3e60c204,0x3e13ed43, +0x3e0522d9,0x3db7be71,0x3d8f5bf4,0x3d7b9b42,0x3d509e3a,0x3d813dc6,0x3e26950d,0x3d9266e3,0x3d7c2af0,0x3da3d63c,0x3dc0eabb,0x3e1be4ed,0x3e63f33b,0x3ebcfd2c,0x3f8167b3,0x3fd3d3d7,0x40306659,0x401bf675,0x401a8567,0x3ff122f5,0x3fdd583c,0x3fdb1405,0x3fcc073d,0x3fd2c5ff,0x3ff30b8a, +0x3fda4516,0x3fbd082e,0x3f95da01,0x3f5828c3,0x3f1eb26d,0x3efe3c4c,0x3ed82cb1,0x3ec62e2e,0x3ea595ff,0x3e7e3104,0x3e3abf3c,0x3e083f7b,0x3ddf0610,0x3dbb6549,0x3d916c99,0x3d857484,0x3d92353e,0x3de1cf37,0x3da3bc9b,0x3db1894f,0x3de51728,0x3e159f1a,0x3e3b3975,0x3e8cd940,0x3f43a2e9, +0x3f728996,0x3f63e8c9,0x3f8fe834,0x3f847337,0x3f88c014,0x3f8e14e8,0x3f901ddb,0x3f9041ac,0x3f896366,0x3f8651af,0x3f7d258b,0x3f5d5741,0x3f43b171,0x3f31f896,0x3f22f711,0x3f0866af,0x3ed8aaea,0x3ebeedb5,0x3eccb109,0x3e907436,0x3e914693,0x3e5a36c3,0x3e4fc7c9,0x3e10dfe3,0x3dcc7c4c, +0x3da9d110,0x3da9eedd,0x3db6a647,0x3dcf2d21,0x3dca4324,0x3dcb20f8,0x3dd76acd,0x3e06e7b1,0x3e3bb953,0x3e6b5484,0x3ec62bb2,0x3ee86498,0x3f0fc5a6,0x3f2f9c4f,0x3f424b8a,0x3f6698b4,0x3f6373a8,0x3f6840c3,0x3f72a08d,0x3f630906,0x3f5a68af,0x3f55591c,0x3f3b8780,0x3f27ffaf,0x3f17a470, +0x3f07f863,0x3ef183ff,0x3ed8fb7a,0x3ec40efc,0x3ec703f3,0x3ea8e717,0x3e9619a0,0x3e752095,0x3e56078a,0x3e3433dd,0x3e309aaf,0x3e1405ea,0x3e1f31a3,0x3e13bc36,0x3e2bd85e,0x3dfc021a,0x3e21b187,0x3e0a6b1d,0x3e3e168b,0x3e6fb306,0x3ea4d703,0x3ebbdecc,0x3f270a8c,0x3f0d26d4,0x3f06397f, +0x3f0e37d9,0x3f15e375,0x3f1ebe39,0x3f2a105e,0x3f388839,0x3f2c28de,0x3f240c2e,0x3f1c30e8,0x3f13f64f,0x3f0d419a,0x3f069127,0x3efe9e31,0x3eeef2d6,0x3ee32051,0x3ed8b094,0x3ecb5a16,0x3ecc8c97,0x3eddab26,0x3e9b86fe,0x3ea60bd0,0x3e9561d3,0x3e8b4715,0x3e989beb,0x3e9aa292,0x3eabb617, +0x3e9c3485,0x3eab1f31,0x3ea563f2,0x3e9045ef,0x3ea3a972,0x3eab5e10,0x3ebc5116,0x3ed778da,0x3eff9a16,0x3f0eb71f,0x3ee81f7d,0x3efbab4a,0x3efbde31,0x3f01c977,0x3f03f32b,0x3f08e4a8,0x3f02f0f5,0x3eff85a1,0x3ef8b9d7,0x3ef3688d,0x3eeea72a,0x3eea1308,0x3ee7d149,0x3ee53e6b,0x3ee1a0fd, +0x3ee018a4,0x3ed18af7,0x3efb74c2,0x3eeb1c8a,0x3f049b81,0x3f478aed,0x3ee67f59,0x3efe4636,0x3f3a7d68,0x3f3fe284,0x3f38520c,0x3f23fc6b,0x3f373f8c,0x3f3a3581,0x3f30c2ac,0x3f020321,0x3ef9539a,0x3f467e18,0x3f0feb90,0x3f144908,0x3adf8add,0x3b0df1fd,0x3b242786,0x3a996c3e,0x3ac23067, +0x3a9f1176,0x3af4e431,0x3b079d6b,0x3b04462f,0x3b026b94,0x3af8da75,0x3ae44ab9,0x3ade9a37,0x3addaed7,0x3ae703d0,0x3aebd63c,0x3aed1c62,0x3ae9c5ff,0x3ae7c60b,0x3ab3c12b,0x3b21ac9d,0x3b0f8df5,0x3b2d6e65,0x3bbf978f,0x3b10cf84,0x3b2344be,0x3ba58e0b,0x3ba90e55,0x3ba64f4e,0x3b89e7dd, +0x3b9f9cf5,0x3ba08754,0x3b93581e,0x3b1dca11,0x3b1aee86,0x3bac3280,0x3b447be1,0x3b3ed8b0,0x3b1c6428,0x3aaadfc6,0x3ab0e467,0x3a81afdb,0x3b362557,0x3b6e5511,0x3b5d5484,0x3b63bb6b,0x3b4f42d5,0x3b355d5a,0x3b25727a,0x3b2575b6,0x3b367edd,0x3b459896,0x3b4bd8a6,0x3b4707cc,0x3b2de5e0, +0x3b160e6a,0x3b17a54d,0x3b1b2369,0x3a758974,0x3aad5fd5,0x3a0f563b,0x3a01c2c5,0x3a6d646f,0x3a74d4fd,0x3abcf1bf,0x3aab9fb4,0x3aaec751,0x3a8cb4ec,0x3a139f23,0x3a38fa3b,0x3a103208,0x3aa0da30,0x3ac86e2b,0x3acb17cd,0x3aceceee,0x3adb66c3,0x3abcf759,0x3a4dd7c9,0x3b9425be,0x3be026a1, +0x3bc6d563,0x3bccb327,0x3bafcd62,0x3b990632,0x3b8577a0,0x3b7f7f61,0x3b91ad64,0x3b93fe92,0x3b94f072,0x3b8fa547,0x3b578dd4,0x3b611530,0x3ac8d399,0x3adba22d,0x3aa82c6c,0x3a919c39,0x3a3cf3e6,0x3a106132,0x39f10c75,0x3a2540a0,0x3a7caf8e,0x3a8d8cf0,0x3a21aa85,0x3a19732f,0x39ce2b41, +0x39b9ca20,0x39e47471,0x3ac44a56,0x3a850aa0,0x3adc8952,0x3ad8c679,0x3a9bdeff,0x3a42023b,0x3a1faf79,0x3bc64b41,0x3c312e95,0x3c1ca5a7,0x3c2150a4,0x3c0ed834,0x3c01b2ba,0x3be50893,0x3be7eaab,0x3c0367e0,0x3c0e4bc3,0x3c109d50,0x3c04c954,0x3bbb500d,0x3b8d8578,0x3b2216bb,0x3b0e65a4, +0x3b040988,0x3b025518,0x3a956c1b,0x3a1e774f,0x39efd82b,0x3a44cdb6,0x3a93a437,0x3ac795ba,0x3a87d769,0x3a4e9efb,0x39d02788,0x3a238e82,0x3a14ad59,0x3b44521b,0x3afa0569,0x3be5f2ca,0x3b9ad9d1,0x3bdd7bc7,0x3bf88636,0x3c2c8b6e,0x3c2370a0,0x3c249cee,0x3c32cceb,0x3c11b00e,0x3be41df7, +0x3bf380ab,0x3bca6f6f,0x3b93a3cb,0x3b1830f5,0x3a9c6add,0x3a9b2d49,0x3b51b41a,0x3b2f2bac,0x3b8e1284,0x3b2dd734,0x3b1f44d4,0x3b054659,0x3af7633a,0x3a8c1489,0x3a474430,0x3a1b5e68,0x3990307f,0x39b3fd94,0x3ab98879,0x3a987feb,0x3ac9a139,0x3acca43b,0x3b017a5e,0x3a92385a,0x3b296a69, +0x3ba4ebd2,0x3bf63ab1,0x3c22552b,0x3b5a90c2,0x3af05a26,0x3bb6ff4e,0x3bbf844d,0x3b8b34c6,0x3b3844b8,0x3aa4b11e,0x3aa5853f,0x3a996349,0x3a55f0ae,0x3a5bb963,0x3a78edce,0x3b0fd64b,0x3b993283,0x3c0ffc2f,0x3b97fad8,0x3b3b1856,0x3a806153,0x3a28ab98,0x39e9389c,0x3a0f5531,0x3a2cd692, +0x3a0aba11,0x39a8fec2,0x3a08c606,0x3a257007,0x3a25a420,0x39585c2d,0x398697bd,0x3a6c78fc,0x3adaa965,0x3ad7d81f,0x3b25c570,0x3bc24f21,0x3b3be107,0x3b7fb4b8,0x3b3b4290,0x3b9caac9,0x3ca133be,0x3cd8f2bd,0x3cf0a1a3,0x3cd4bcef,0x3c713c1d,0x3c0ba29e,0x3ba4f416,0x3c2080f5,0x3c53f18b, +0x3c42bf30,0x3bfd78b8,0x3b3def18,0x3a00c6f0,0x3a2411ff,0x3a974352,0x3ac8bb64,0x3a39fdbf,0x39a58d10,0x39c7fb39,0x39b2934f,0x39280ab9,0x39276ce3,0x390d43da,0x388cb423,0x3866c37a,0x398de43d,0x39f3b8ae,0x3a18b780,0x3a541994,0x3a9aef00,0x3ae15440,0x3b028573,0x3be18185,0x3c109bc0, +0x3c97d1a5,0x3cd29664,0x3d260355,0x3cd3037a,0x3c5c7f29,0x3b7e69dc,0x3b2cd4aa,0x3b2dc174,0x3b37434e,0x3b0c2985,0x3ae8943a,0x3a8fb5e5,0x3af902bd,0x3b35a6a0,0x3b44fd52,0x3b20c312,0x3ab9787e,0x3a41ebfd,0x3a105574,0x39d1485a,0x39b73f2e,0x39afe277,0x395f0f68,0x391e3c36,0x38aa089e, +0x38c97a79,0x39243a6f,0x3950ef5b,0x39946f04,0x3a6495f6,0x3a37f9ac,0x3acff89b,0x3b5759a8,0x3ba8f9eb,0x3c69049c,0x3cb29a4f,0x3d07c3ae,0x3cd9f349,0x3cada2a1,0x3c99043c,0x3c87d23b,0x3c37c0e6,0x3be53cfb,0x3bb73678,0x3be936ef,0x3b8f7ae5,0x3b4f26f3,0x3b290603,0x3a5e8877,0x39cc0e47, +0x39aa8749,0x399b8ca5,0x39ad7219,0x39e2ddb5,0x39b2aa6a,0x399368ae,0x3983753c,0x390dc29e,0x390f4f58,0x39853774,0x390f9ef8,0x3936fd34,0x3996cd39,0x3a153968,0x3a92f1cd,0x3b018bb5,0x3bb236b0,0x3c016b86,0x3c0683e0,0x3c3178d4,0x3c337207,0x3c23f63f,0x3c2b3e18,0x3c0123ec,0x3bfa085c, +0x3c01334f,0x3c002cc5,0x3c0bb60c,0x3b757b86,0x3b3795de,0x3b31258d,0x3b369a5c,0x3b337918,0x3b0f18c8,0x3b1c4d77,0x3b108d32,0x3ad94757,0x3ab1f016,0x3a4ce0bd,0x3976c291,0x3991178f,0x397edc51,0x39ca9593,0x399fb628,0x39ecd2cd,0x3a69644b,0x3aa6eaa5,0x3aea0d7e,0x3b14ce05,0x3b618fd6, +0x3b94fe84,0x3bb0b521,0x3ba59f21,0x3baa10f4,0x3bcab647,0x3c008117,0x3ba7a249,0x3bb2da45,0x3bb807e8,0x3bc50cb4,0x3bf3fe09,0x3be53dde,0x3bfbf659,0x3c1b7cb9,0x3be8ee40,0x3bbb81e5,0x3ba314af,0x3b782bfd,0x3b3a7e95,0x3b1349a5,0x3aef2f51,0x3ac83d4b,0x3aad255b,0x3a7ae801,0x3a604e5a, +0x3a2d2b8e,0x3a061bc1,0x398774bb,0x39bf6946,0x3a003caa,0x3a4fe8f8,0x3aa25c21,0x3aceadd6,0x3affb99e,0x3b2ece7c,0x3b31d30e,0x3b4a9e02,0x3b6cd85a,0x3b7f8997,0x3b931030,0x3baa00a9,0x3ba0b636,0x3b81d247,0x3b658f62,0x3b581b6d,0x3b5a4727,0x3b604eef,0x3b707689,0x3b8230ff,0x3b931031, +0x3b6ef734,0x3b538d10,0x3b39f568,0x3b25783c,0x3b138934,0x3b0a6f5f,0x3ae67710,0x3abfce0b,0x3a9d3925,0x3a8036c8,0x3a499525,0x3a2607be,0x3a42a83c,0x3a473519,0x3a88bfd9,0x3a7310d7,0x3aa1e757,0x3ad6e7ab,0x3aef8e86,0x3b0ea2f1,0x3b16b669,0x3b27f990,0x3b3544cb,0x3b426da1,0x3b43ea59, +0x3b432986,0x3b4943d1,0x3b535e9e,0x3b4a0cf7,0x3b43e080,0x3b31bd34,0x3b3ada6d,0x3b3bfd95,0x3b4494a5,0x3b4ae122,0x3b5a71df,0x3b480aa8,0x3b3d2e02,0x3b33531e,0x3b2703e6,0x3b1cf428,0x3b13aed1,0x3b0c20ee,0x3b051fd4,0x3afce0ce,0x3aef8aa5,0x3adfcaf0,0x3adb0b48,0x3b040bc5,0x3b1999ed, +0x3b62ae49,0x3b1a19f9,0x3b2ecd28,0x3b82ea06,0x3b84075b,0x3b7decc5,0x3b69ba7d,0x3b7a5085,0x3b7ad997,0x3b771abc,0x3b4ce05d,0x3b480ef9,0x3b857ecb,0x3b57becc,0x3b5c1fa0,0x38937617,0x38d11696,0x38ebd0f0,0x3850d925,0x38851f46,0x3872f703,0x389c6893,0x38a90179,0x38a4af1a,0x38aef351, +0x38af4dd8,0x38ac23e9,0x38a05f56,0x38a11b3b,0x38b0f2a4,0x38b555e3,0x38b25fa7,0x38a5acdc,0x389811a1,0x3860d2d9,0x38d76364,0x38cbed44,0x39137c0e,0x3988acff,0x38c8dde1,0x390f871e,0x396c079c,0x3976a1bf,0x397226e0,0x394792cf,0x396d9f51,0x397089cc,0x395c9f37,0x3904d53f,0x38c42611, +0x3977b66b,0x392ae240,0x391e0c5b,0x38d878de,0x389e1992,0x38b27ed0,0x38cabc57,0x390be006,0x391d494b,0x39086227,0x391a093b,0x39165b79,0x391b7efa,0x38fc5a9d,0x3914969d,0x3951c1ee,0x3975846e,0x396d585a,0x393de218,0x39041039,0x38cd83ee,0x38bd3a58,0x38fba505,0x37ed92bb,0x385314f0, +0x382ef89d,0x382df2bf,0x381db46e,0x38368261,0x3880329d,0x388f6829,0x38849db4,0x385bd20a,0x3826c263,0x37ecf15b,0x37ba6b5b,0x387c9e9b,0x3867462c,0x388a0556,0x38972e27,0x38dcd0a5,0x38fac2c6,0x3928e615,0x3985a97f,0x39a0d159,0x3986d7a4,0x399375ce,0x39918a68,0x39a356f5,0x396989ea, +0x39781a7c,0x39bcf000,0x39cb2cc0,0x39bf17af,0x398f8f78,0x391e5fcb,0x391241df,0x38830d8e,0x386ff454,0x37e9a318,0x38082609,0x389c19b1,0x387fe20a,0x388cc972,0x385ca90a,0x38d675a1,0x3975d207,0x395ffab3,0x39214fac,0x38e16931,0x37e9a00d,0x3778aa5d,0x38b5d45e,0x380ca163,0x38a024de, +0x38a4cc41,0x3950fed7,0x3997f04b,0x3a073f96,0x3a11cf44,0x3a1f0c50,0x39dcc157,0x39e16ed8,0x39d3b88b,0x3a11040f,0x399bf1d3,0x3a05e3cf,0x3a8cb71f,0x3aafe033,0x3a9feeb3,0x3a606a51,0x39efa427,0x39aa4bda,0x397c047b,0x391e151f,0x38823d30,0x38e8d1c0,0x391cb2f5,0x38d148b0,0x38948f1b, +0x3886b39e,0x388f2e6e,0x39243d12,0x39aeac30,0x399a384c,0x39853461,0x391d5932,0x3867a3ae,0x3981b18c,0x38b4fb80,0x3a33cfca,0x3a1fbd59,0x3aa357e5,0x3a9b3961,0x3a82c651,0x3a13e4ec,0x39f9d2dc,0x3a359362,0x39fb3820,0x3a375bc5,0x3a8e76cb,0x3a79367f,0x3a3f38a4,0x3a8680a5,0x3a5ba666, +0x3a2dc196,0x3a49b2f0,0x3a459777,0x3a7902e9,0x3a4e9a81,0x3a1ce41c,0x39c8d9ff,0x39990740,0x3919aea1,0x3883cb29,0x388de655,0x388668a4,0x38b1abcf,0x3725564b,0x3758d74d,0x390b9743,0x39bec48b,0x39a7239c,0x3996f9df,0x394ef357,0x39db92ff,0x3a48ec4d,0x39be55d1,0x39d0d72d,0x39c1a218, +0x3a4b8ac2,0x3a890a71,0x3a920fcb,0x39a53b53,0x3948bc77,0x395bdd9b,0x3a7f2a78,0x3a35009b,0x3a616c25,0x3a5c2bb8,0x3a015c54,0x3a0ca2b8,0x3a1ee76e,0x39d909d3,0x39828a49,0x39570aa1,0x38a914b7,0x382c549d,0x37e88f1b,0x37c5dab6,0x37303e41,0x3816a114,0x3833f74d,0x386922f6,0x37c4b1f4, +0x371a6492,0x3875ee13,0x39808dc3,0x3a7943ee,0x3a689a1f,0x39f5480d,0x39c6facf,0x3b7a8010,0x3be25576,0x3acca749,0x39efa2fd,0x3af2b9d2,0x3aeae770,0x3b0494e6,0x3b0f6390,0x3ad0e7d1,0x3ab0a999,0x3a764a5a,0x3a2f0e5d,0x3a728ff8,0x3a7e99aa,0x3a2a868f,0x39d5def9,0x395c1f3a,0x3904d0f0, +0x38d0039c,0x38a8e5b4,0x38314856,0x37cec308,0x384b0566,0x38361022,0x37dbe86a,0x3805ab8b,0x35cf492f,0x371c3af2,0x3663de85,0x3769f9d8,0x382a3610,0x3899c7c2,0x388794a8,0x389454ec,0x39aa4bff,0x3add6079,0x3ae241d8,0x3b6c3eab,0x3abfc499,0x3a95d971,0x3b11d438,0x3ad46890,0x3a794529, +0x3a3c7553,0x39bcecf6,0x39dd805e,0x39958b30,0x390c973e,0x394b80ad,0x396d7f89,0x39748c62,0x39730945,0x3974f672,0x3939b277,0x3923b2fb,0x390a1b34,0x3901fec7,0x38bab5ee,0x388c3d4a,0x376d4c45,0x35b0e11a,0x368d86f7,0x35e2f3e2,0x367dd653,0x3698e696,0x357472b9,0x361eac89,0x3830958b, +0x3876c8aa,0x38b00358,0x3a43f3db,0x3ac22e8f,0x3a77434e,0x3a7274ae,0x3a936dc0,0x3a85ee76,0x3a44ce73,0x3a31b921,0x3a3c5509,0x3a2062b7,0x3a1ff9c0,0x3a2c0811,0x3a46adc8,0x3a145bdf,0x39d05eac,0x399ca51a,0x38d39ab4,0x37f725f0,0x38430725,0x38d79fb6,0x39364ee5,0x397a9d98,0x39895375, +0x39607653,0x39301508,0x388c3cb2,0x37ad8736,0x368a5365,0x36b69e60,0x372c9107,0x37559c63,0x379676d2,0x3796109a,0x380574d2,0x372daca0,0x37d2f509,0x390d941b,0x3a2558b1,0x39b76f89,0x39bf6fd6,0x39ec7ccf,0x39c763b0,0x39bd17b9,0x39b04d35,0x39c8666e,0x3a0267a5,0x39ae1624,0x39a2ec1c, +0x39b56c6c,0x39a57ea7,0x39900da1,0x394ed374,0x390cc00e,0x3899cbcf,0x38243f3e,0x381ed510,0x3829cb3e,0x3886304b,0x38966963,0x386ca2c1,0x38466f7c,0x382cb33f,0x381adc45,0x380ca3d2,0x37d06046,0x3839f05c,0x3881e193,0x38b71391,0x38d1a54c,0x38d043a8,0x390796d6,0x3932241c,0x3947161f, +0x397d2445,0x3958bd2b,0x3954f857,0x394604e7,0x391cb254,0x39007fdb,0x38d7b4fa,0x38e49ccf,0x391275b5,0x38f2b5cf,0x38e4d920,0x38d55e2e,0x38724b02,0x382795a8,0x3841f740,0x382c7ff6,0x3832cd8f,0x3858dba9,0x384f5856,0x387f981e,0x388d6bb3,0x38a1d874,0x38aca2f4,0x38cbae60,0x389f110d, +0x38a76c60,0x38e3bdb1,0x38c8b00f,0x38cb2fe8,0x38fd87bc,0x38f790ad,0x390ab117,0x392ba8d0,0x393132ce,0x3958ad2f,0x39815e0b,0x395521b8,0x393373f6,0x39159da4,0x39047a70,0x38f73380,0x38dd4e0f,0x38d39bd7,0x38d68fdc,0x38fad4c9,0x38cb68c6,0x38b05016,0x389ba7ca,0x3886568c,0x3867229c, +0x385e50ac,0x3862e429,0x3875b922,0x38885ec7,0x38996117,0x38ad7d98,0x38c667ca,0x38c75949,0x38c12945,0x38db9eef,0x38e3d4f8,0x3906f7c2,0x392035d7,0x39175bb6,0x391e9a3c,0x3925e0c4,0x39279e50,0x39323a34,0x393fbc13,0x392bfe8c,0x39191bf6,0x3917d594,0x390cacf3,0x38cac022,0x38b62dbd, +0x389d7267,0x389de131,0x389e2cb4,0x389f6dd1,0x38a21bb4,0x38ac00d2,0x389e085b,0x3897e902,0x3894b69f,0x3892f89a,0x38946ee5,0x3893c439,0x389ab7a2,0x389ec733,0x38a2f3f8,0x38aa446e,0x38ad0f46,0x38c4c4fb,0x38d02c92,0x38fd88a7,0x392bd6c4,0x38e0d499,0x390b604f,0x394a1f13,0x3945e3d7, +0x393ba035,0x39265531,0x39300c40,0x392affa7,0x3924e62e,0x38fb1c52,0x38cecb3d,0x391e3e35,0x38fc97bb,0x38e06fa8, +}; +const uint32_t defaultHRIR_rom_ER48[HRTF_MODEL_N_SECTIONS * 470] = { +0x3e8fdc9b,0x3e7ca02e,0x3ea70d73,0x3e8e5fb4,0x3ea8dd68,0x3eededaf,0x3e8704a5,0x3e911540,0x3ed7aa69,0x3ee09a85,0x3edac0ad,0x3ebe2af7,0x3eda1252,0x3edf2449,0x3ed991d3,0x3e8cd8c0,0x3e76d9f1,0x3ef24872,0x3e91d7e9,0x3e7d0776,0x3e8caed0,0x3e5a8728,0x3e73f78b,0x3e782e9a,0x3e7d49d8, +0x3e813d42,0x3e8434cc,0x3e86b742,0x3e8ab0d0,0x3e8f4bf5,0x3e9603b8,0x3e9bbd29,0x3ea4df8c,0x3ea13dfd,0x3e9cd544,0x3e908184,0x3e8fac91,0x3ebda893,0x3ebff1ca,0x3ed08eb6,0x3e75dd83,0x3e48076c,0x3e298b90,0x3e265455,0x3e0dd3f4,0x3e2649fe,0x3e29dffc,0x3e22f191,0x3e2b4f56,0x3e132cb8, +0x3e141183,0x3e011f6c,0x3e047caf,0x3e2b312c,0x3e18a7c1,0x3e7d6b64,0x3e72cc02,0x3e799f9d,0x3e890a3c,0x3e94ff71,0x3e9b6fa8,0x3ea356e4,0x3eabf5ee,0x3eb2dc43,0x3ec08559,0x3ed4e36e,0x3ef21e5c,0x3f072dea,0x3f167786,0x3f150aa8,0x3f0a8a57,0x3ee78bfa,0x3ed9f2a1,0x3f0c0392,0x3ec3ec96, +0x3e97a643,0x3e584ee5,0x3e233944,0x3decf373,0x3dc1d6df,0x3da46f61,0x3da03234,0x3d801071,0x3db85e01,0x3d9f8cec,0x3d9025c9,0x3d89119a,0x3d969e3b,0x3d9bd814,0x3db8f494,0x3dc41817,0x3e0ae675,0x3e19a385,0x3e731ee0,0x3e81da6b,0x3ea36954,0x3eb14c98,0x3ec65e06,0x3edf0a9d,0x3ef3bee1, +0x3f0bb3ec,0x3f2364c0,0x3f419438,0x3f5f3e01,0x3f80a0ee,0x3f76fd7b,0x3f5f37fb,0x3f2f6e3c,0x3f1873b3,0x3f51b86e,0x3ee75e89,0x3ead2b54,0x3e39d346,0x3df6dfcf,0x3dab5c4b,0x3d54a4b0,0x3d030473,0x3cc6d7ec,0x3cc6604e,0x3d049c4b,0x3ce6236d,0x3cd11bb5,0x3cbfb7fc,0x3cd7a13c,0x3d0ca67b, +0x3d497bcf,0x3d65b1df,0x3db025a4,0x3ddf14f3,0x3e58c138,0x3e7fcb8c,0x3eab70d2,0x3eb8e4fc,0x3ed46c53,0x3ef153a9,0x3f031084,0x3f1c91de,0x3f4cc12f,0x3f8b3923,0x3fb0eb50,0x3fdab500,0x3fd75cb2,0x3fb83ee0,0x3f8d533f,0x3f5f8790,0x3fe8eb11,0x3f8b33f6,0x3f4e2871,0x3ebdf86e,0x3e6a77e4, +0x3e20c17d,0x3de7fd4a,0x3d93dc32,0x3d3ce37f,0x3d0d3a24,0x3d0bafb0,0x3d082a4d,0x3d0337ce,0x3cd82a6a,0x3cecf468,0x3d1889b4,0x3d5bb356,0x3da8621b,0x3e0a5d7a,0x3e3d3901,0x3eb28e81,0x3ee74840,0x3f40ae07,0x3f7a8f2b,0x3fa4c7e1,0x3fcead90,0x3fed8346,0x4001efcc,0x40053cd3,0x40041b5c, +0x3ffd3d13,0x3ff9ca11,0x3fea2e3c,0x3fe3e80b,0x3fefe08e,0x3fd67831,0x402e0c8b,0x3f5c91d0,0x3f4adfcb,0x3eadb767,0x3e85b027,0x3e15b595,0x3db63148,0x3d98df04,0x3d54401d,0x3d4230d7,0x3d4c882f,0x3d265086,0x3d114869,0x3cf8fc2b,0x3d11032f,0x3d3abdd2,0x3daba352,0x3de975d6,0x3e461edb, +0x3e607964,0x3eda9a95,0x3f0a4d2e,0x3f61a1c0,0x3f8b505e,0x3fb9cdc1,0x3fefeee9,0x40013855,0x4006970a,0x4008f829,0x4009086c,0x400d3534,0x40161a61,0x40117a76,0x400f6a21,0x402f2616,0x402a4989,0x40888df1,0x3fdb870c,0x3f9d6fd4,0x3ecb7292,0x3ee60c52,0x3e437028,0x3e1de373,0x3d9d3e0a, +0x3d6854e6,0x3d6edb3c,0x3dd40ec2,0x3d812f7e,0x3d648a50,0x3d8d2b66,0x3d712947,0x3dab40bb,0x3e03d116,0x3e0b1212,0x3e4b1120,0x3e638df6,0x3edf6726,0x3f09c583,0x3f5e9cf3,0x3f9cf95b,0x3fdc0b64,0x400ced44,0x40196fd0,0x4019a822,0x4014c6dc,0x4004bc5c,0x4002d52e,0x401d0848,0x402aeae6, +0x4046714f,0x409dec17,0x406f0012,0x409c8644,0x400535d2,0x3f9fffd2,0x3ee0a481,0x3e7dff42,0x3e20636b,0x3db79ce1,0x3d9c95a3,0x3d7ca113,0x3d8f69dc,0x3e238006,0x3d7f39be,0x3d4fbdfb,0x3d820744,0x3d928c8d,0x3db74338,0x3e084369,0x3e1a7c3c,0x3e61f848,0x3e6f28b0,0x3ec8e36c,0x3ee55368, +0x3f23ffc3,0x3f6707f2,0x3f9f3d4b,0x3fcfc8e8,0x3ffa0a61,0x400babe5,0x4018cf0a,0x401ae020,0x40105111,0x40033e17,0x40124cc5,0x403878b0,0x40a104ac,0x406f81c0,0x40313467,0x3fe0c5bf,0x3f9ba913,0x3f044192,0x3e9b366c,0x3e477d38,0x3dff22ab,0x3def3942,0x3db634c5,0x3da56350,0x3ddb55e8, +0x3d9157f8,0x3d85d798,0x3d8f661c,0x3db086dd,0x3de3e7d0,0x3e07676e,0x3e2aea92,0x3e8e3af0,0x3e9f053c,0x3ecac326,0x3ed6ca51,0x3efec778,0x3f1e961a,0x3f584336,0x3f95bc40,0x3fbd1d61,0x3fda57ff,0x3ff30463,0x3fd2caa7,0x3fcc08fa,0x3fdafede,0x3fdd798e,0x3ff0972a,0x401b4405,0x401b0df8, +0x3f8b0183,0x3f6d1014,0x3f3193f1,0x3ec0cbb9,0x3e7a5b8c,0x3e4e8287,0x3e07d544,0x3dd60954,0x3dcb4366,0x3dcad917,0x3dc52138,0x3db68a3e,0x3da9b1d2,0x3dacaa72,0x3dceb074,0x3e0df1ed,0x3e449247,0x3e56db84,0x3e89a3d0,0x3e99d0cb,0x3ec42372,0x3ec1cbe9,0x3ed75acf,0x3f08afa4,0x3f22da5c, +0x3f31fdda,0x3f43aeb3,0x3f5d6499,0x3f7d1a65,0x3f865902,0x3f895cfc,0x3f903a28,0x3f901701,0x3f8e4ba8,0x3f8821da,0x3f860fed,0x3f31853d,0x3f0ea396,0x3eeea3ca,0x3ec3e6e3,0x3ea02bbf,0x3e6a9317,0x3e3cd015,0x3e0a0fe8,0x3e228436,0x3dfb3608,0x3e2b2ed6,0x3e131e54,0x3e1ec661,0x3e12331b, +0x3e3038c3,0x3e362ae3,0x3e5e262b,0x3e745687,0x3e96e633,0x3ea4751f,0x3ec8b008,0x3ec3f612,0x3ed8f3f7,0x3ef19440,0x3f07f20a,0x3f17a5df,0x3f27fb09,0x3f3b86eb,0x3f555bb9,0x3f5a6917,0x3f63088f,0x3f72a3ce,0x3f683a4d,0x3f636ae4,0x3f66bcdc,0x3f41cc90,0x3f05afeb,0x3f0f3c7c,0x3f1f0b3f, +0x3ed1f7d4,0x3ebfddc6,0x3ead81d2,0x3ea3e0c3,0x3e8fbb42,0x3ea56a13,0x3eabd6e7,0x3e9bce38,0x3eab80d3,0x3e9ade8d,0x3e9a0902,0x3e8be32b,0x3e950624,0x3ea63a6a,0x3e9af2b1,0x3edb6d6c,0x3eceb570,0x3ecb3beb,0x3ed8816c,0x3ee32ea2,0x3eeee883,0x3efea2d1,0x3f06925b,0x3f0d41c2,0x3f13f536, +0x3f1c3197,0x3f240c6a,0x3f2c29b3,0x3f3881f3,0x3f2a187c,0x3f1eb4c7,0x3f15f462,0x3f0e38b1,0x3ee835d3,0x3f0d0130,0x3f009d1a,0x3f0ea2c2,0x3f4014ed,0x3efac86d,0x3f0187ec,0x3f30834f,0x3f3a07ea,0x3f378632,0x3f23fb37,0x3f3821d3,0x3f3ff4b4,0x3f3aaff2,0x3efe2f9a,0x3ee65736,0x3f49eee7, +0x3f04f1da,0x3eeb3269,0x3ef99036,0x3ed15f27,0x3ee050b1,0x3ee19682,0x3ee54292,0x3ee7d1e9,0x3eea1293,0x3eeea811,0x3ef36958,0x3ef8bb3a,0x3eff85be,0x3f02f19f,0x3f08e5aa,0x3f03f230,0x3f01cd6f,0x3efbc38f,0x3efbe1ab,0x3f14475d,0x3adf8b9a,0x3a99be79,0x3b26bab8,0x3b0df725,0x3b441723, +0x3bad7446,0x3b198e66,0x3b1ded00,0x3b930486,0x3ba05f87,0x3b9fb7f9,0x3b89edff,0x3ba62e13,0x3ba8ebbc,0x3ba535c8,0x3b235c47,0x3b10fb92,0x3bbfe50e,0x3b2a8b67,0x3b0eb5d9,0x3b233d68,0x3ab45d2c,0x3ae730de,0x3ae9f357,0x3aed0d65,0x3aebd75a,0x3ae70a57,0x3addb643,0x3adea313,0x3ae44e24, +0x3af8e178,0x3b026f92,0x3b04487b,0x3b079362,0x3af4b8df,0x3a9f4492,0x3ac1a6fa,0x3aac02ee,0x3b16a5de,0x3b420b7a,0x3acc506f,0x3aa68190,0x3a10d7da,0x3a38df88,0x3a13e2de,0x3a8cdf32,0x3aaec4da,0x3aaa14cc,0x3abbe453,0x3a74809d,0x3a6ef45f,0x3a029431,0x3a0ce49b,0x3ab0cf35,0x3a7f8733, +0x3b1c8366,0x3b12b207,0x3b163b31,0x3b2e7499,0x3b46ad77,0x3b4c120a,0x3b457d43,0x3b3680aa,0x3b2567ad,0x3b256df5,0x3b355bae,0x3b4f4028,0x3b63aaad,0x3b5d5497,0x3b6e6a0f,0x3b367ecc,0x3a814a93,0x3ab16750,0x3ad25d6f,0x3ae2a12f,0x3acca974,0x3a81a619,0x3abec594,0x39e2ca55,0x39b89d03, +0x39ce1368,0x3a167e65,0x3a208796,0x3a8eb215,0x3a7cf0d1,0x3a245b0d,0x39f01327,0x3a0ba79d,0x3a3fbd69,0x3a8e81f2,0x3a9eb51b,0x3ad84006,0x3ad7c4b6,0x3b5cf1d6,0x3b5878d7,0x3b8f8903,0x3b94de4e,0x3b941289,0x3b91af40,0x3b7f9d5a,0x3b85740c,0x3b990681,0x3bafca24,0x3bccbf5e,0x3bc6e4ce, +0x3bdff38b,0x3b93edbe,0x3a4d7d2c,0x3abe9fd9,0x3ac0862f,0x3aa57e95,0x3ad7f39b,0x3af835e7,0x3b46f081,0x3a154dfb,0x3a22738d,0x39cf705e,0x3a4d6787,0x3a87c619,0x3ac72151,0x3a940a3a,0x3a42ddc5,0x39f11fe8,0x3a1d6a21,0x3a98b544,0x3b059756,0x3b001dc8,0x3b0ea00b,0x3b0c2ab6,0x3b987fa8, +0x3bb521e3,0x3c06c242,0x3c0fb370,0x3c0eb8ad,0x3c031606,0x3be81aed,0x3be50272,0x3c01b23b,0x3c0ec9fd,0x3c218b73,0x3c1c21ee,0x3c31f551,0x3bc607e8,0x3a1f3eff,0x3a3772bb,0x3c057b16,0x3b6a3ca4,0x3bdfc2e9,0x3b90c8e7,0x3b2b8482,0x3a8f6640,0x3b01d491,0x3acb6d14,0x3aca4b63,0x3a978e60, +0x3aba1dca,0x39b2f4d4,0x398f0ae0,0x3a1f1cd3,0x3a41b751,0x3a8b337f,0x3af44c58,0x3b0cf164,0x3b0e1ab0,0x3b03ed5a,0x3ba277c3,0x3b21f3db,0x3b57e1f8,0x3a980f5d,0x3a9d9839,0x3b17a028,0x3b940998,0x3bcabb99,0x3bf3e253,0x3be3ed58,0x3c11da50,0x3c31e4d6,0x3c25c4bd,0x3c21640f,0x3c306d12, +0x3be70b04,0x3b6a5907,0x3c1aedb6,0x3c010992,0x3bb90e6e,0x3b3ebc86,0x3ad2982c,0x3ad5aa6f,0x3a6acd3e,0x39862e6a,0x394fcac5,0x3a26b702,0x3a24f0d8,0x3a08bd73,0x39ad4c3a,0x3a040f7e,0x3a2ad0f9,0x3a16b81c,0x39e0989f,0x3a46000a,0x3a6577e6,0x3b44cb7e,0x3b93e9bc,0x3c1203c8,0x3b97f6ba, +0x3b1096df,0x3a77e9d3,0x3a5c700a,0x3a566b41,0x3a99b435,0x3aa5c682,0x3aa4e30c,0x3b36cca7,0x3b8bc9e3,0x3bbfa422,0x3bb6ec1c,0x3ae70d23,0x3b3ee641,0x3b7d96c5,0x3b4252c3,0x3b013a2f,0x3ad961ea,0x3a9d60e6,0x3a4ba4cb,0x3a19a6b6,0x39f66055,0x398b8df3,0x38661a2e,0x388bb7ce,0x390e6331, +0x3927e145,0x3927ada2,0x39bd2fff,0x39ba4e36,0x39b3587a,0x3a3bb6b8,0x3ab693e0,0x3a9c520f,0x3a224228,0x3a01870e,0x3b3d1f65,0x3bfe0ddf,0x3c423803,0x3c544ddc,0x3c2082e2,0x3ba53453,0x3c0b90ee,0x3c71671a,0x3cd428b5,0x3cf12de9,0x3cd8ad6c,0x3ca1e001,0x3b9a9ae5,0x3c9d1877,0x3c0be08a, +0x3be6c6a5,0x3bbb06b7,0x3b549f2e,0x3ace11f2,0x3a3f3bbc,0x3a4ecc0b,0x39913dda,0x39557f4f,0x391cdabf,0x38c3fd62,0x38a418cc,0x392576b4,0x3962b676,0x39b4b585,0x39bb710b,0x39d62900,0x3a0dbf7c,0x3a3234fa,0x3ac4e97d,0x3b1c7537,0x3b479898,0x3b34a13f,0x3af9bfde,0x3a8f8d35,0x3ae9040f, +0x3b0c411c,0x3b37205d,0x3b2dfb5e,0x3b2cc830,0x3b7e2ab6,0x3c5d0c96,0x3cd2601a,0x3d270f35,0x3ccf0c62,0x3d080f67,0x3cb398b4,0x3c7c0756,0x3c28d089,0x3c03fdcf,0x3c036242,0x3badfd7c,0x3afe0b91,0x3a93a695,0x3a15f4c3,0x3994ad57,0x39308a5c,0x390df0d9,0x3987c902,0x390a3356,0x390cc452, +0x3989f6e2,0x39678d04,0x39ee47b1,0x39cfcac0,0x39b1a0a6,0x399bfdd1,0x39abab56,0x39cba4be,0x3a5edbdc,0x3b288e90,0x3b4f2a68,0x3b8f6980,0x3be979bb,0x3bb71a43,0x3be56dec,0x3c376ad8,0x3c8815dd,0x3c98ee4b,0x3cae013c,0x3cd958aa,0x3c27def3,0x3c27d401,0x3c1e0b82,0x3bf921f1,0x3bd237e0, +0x3bafb731,0x3ba54192,0x3bb370b0,0x3b93bcfc,0x3b61072c,0x3b148f0a,0x3ae976e8,0x3aa5e6f2,0x3a6c4e57,0x39f11b68,0x3992bc53,0x39ae30c5,0x3981b2fa,0x398f5f96,0x3970427c,0x3a478654,0x3ab32a81,0x3ad8e584,0x3b10a690,0x3b1c4d93,0x3b0f0de7,0x3b339b6f,0x3b36be57,0x3b310412,0x3b379588, +0x3b75cde9,0x3c0b327f,0x3c005588,0x3c017465,0x3bf9268d,0x3c0237c7,0x3bb97879,0x3bb00933,0x3ba8ac5d,0x3ba24887,0x3ba3adaf,0x3b8f389f,0x3b7f4539,0x3b6b2b6a,0x3b4b9b42,0x3b32ab50,0x3b2e53e3,0x3b000dc5,0x3acec534,0x3aa1e9b2,0x3a5057f9,0x3a00b355,0x39c4ce51,0x398697dc,0x3a08e763, +0x3a286bd8,0x3a62090f,0x3a7ae3bf,0x3aad1e54,0x3ac84246,0x3aef2bb7,0x3b134687,0x3b3a87cc,0x3b7832a2,0x3ba326e9,0x3bbb758e,0x3be8e45b,0x3c1b8677,0x3bfbe247,0x3be53e3d,0x3bf4007b,0x3bc4cb92,0x3b5789be,0x3b693d71,0x3b79253a,0x3b4e4c0b,0x3b4a10db,0x3b4571a1,0x3b44a34d,0x3b429034, +0x3b351910,0x3b27ef94,0x3b16c8e7,0x3b0e8924,0x3aef5b33,0x3ad7800f,0x3aa1b431,0x3a71a190,0x3a897bc0,0x3a481a51,0x3a41a417,0x3a283619,0x3a49828d,0x3a803161,0x3a9d35f4,0x3abfcc8d,0x3ae675f3,0x3b0a69cf,0x3b13842a,0x3b25776a,0x3b39df8b,0x3b53972d,0x3b6f00d9,0x3b93050f,0x3b8235d4, +0x3b705d7d,0x3b607fd9,0x3b5a1ab9,0x3b31b7a9,0x3b412822,0x3b4a1827,0x3b57248d,0x3b8157ab,0x3b4882e0,0x3b4c0571,0x3b769328,0x3b7a8079,0x3b7a8d72,0x3b69a47b,0x3b7db56f,0x3b8419d0,0x3b831f72,0x3b2f0e02,0x3b1a5bed,0x3b64c8b6,0x3b1a16cf,0x3b0404f7,0x3ada2ee2,0x3adfb5a9,0x3aefa2ab, +0x3afcdd46,0x3b0520ef,0x3b0c2234,0x3b13b1bb,0x3b1cf5e3,0x3b27061f,0x3b335c72,0x3b3d2c24,0x3b48074a,0x3b5a73a5,0x3b4ae2bd,0x3b449b8d,0x3b3be592,0x3b3b1887,0x3b5c1ced,0x38937569,0x38515f3a,0x38effc4a,0x38d0a365,0x392a9779,0x397908db,0x38c2a9d1,0x3904f8db,0x395c1fd1,0x39706056, +0x396dba2e,0x39479cf1,0x39720f86,0x39767a78,0x396b79ca,0x390fa37f,0x38c969f1,0x3988c792,0x39110d85,0x38ca877c,0x38d95f9c,0x38618d0c,0x3897ae73,0x38a5c6b0,0x38b256d1,0x38b5589b,0x38b0ff9a,0x38a12a14,0x38a06a81,0x38ac194b,0x38af5911,0x38aef835,0x38a4afca,0x38a8f3fe,0x389c4e95, +0x3873433c,0x3884b2b5,0x389efea9,0x38cfb9b1,0x3920e783,0x386bfc6f,0x3882254c,0x37b9d39b,0x37ec8492,0x3827b726,0x385b1a49,0x3884ba23,0x388eb1cb,0x387f7b1e,0x383671ed,0x381eeaac,0x382e9da6,0x382c51e9,0x3856d8cd,0x37fb563e,0x38fe489e,0x38b73676,0x38cdcc75,0x390474d3,0x393db620, +0x396d7bd1,0x39756ee0,0x3951a6cd,0x391477d3,0x38fc3f12,0x391ba411,0x39164df2,0x3919fa37,0x39086290,0x391d5f3c,0x390c1daa,0x38ca785a,0x38b2dffc,0x38d5250b,0x38a63c00,0x388a9928,0x380870de,0x38b184da,0x377b783d,0x37e8b8a6,0x38e0bbf2,0x39219644,0x395f7023,0x397637f5,0x38d5f936, +0x385bfa20,0x388c7643,0x387c84c5,0x389c945f,0x38067b44,0x37ccfe24,0x386bf2dc,0x388b71ee,0x390f99eb,0x391ee1fe,0x398f6b51,0x39bf0dd2,0x39cb3b18,0x39bd18c9,0x39785a32,0x3969a5e3,0x39a321de,0x399194f5,0x39938c33,0x3986f62a,0x39a09f03,0x39857609,0x3928cd2b,0x38fc00c5,0x3961a654, +0x3877899f,0x389c2924,0x38b3335a,0x39821342,0x3866da62,0x391d90cb,0x398589a4,0x399aa791,0x39adafe3,0x392342dc,0x388f629e,0x38854d13,0x3897cb21,0x38ce26c0,0x391f8264,0x38e9631c,0x387cf929,0x391c9a56,0x3971ae74,0x39b0b5b8,0x39ec1cad,0x3a61d981,0x3a9f9c7c,0x3ab009bb,0x3a8c5ccb, +0x3a05ddba,0x399bba0d,0x3a110474,0x39d3be42,0x39e19a28,0x39dbdad5,0x3a1f926a,0x3a11f6da,0x3a0751d6,0x39969f42,0x3aaa7c0e,0x3a171eeb,0x3a30e4a8,0x39c8fa13,0x395352c9,0x3995f17f,0x39a6f697,0x39bee4fe,0x390c34b6,0x3754544f,0x3721dba3,0x38b16b75,0x388439d3,0x389143ea,0x3882fb79, +0x391a3128,0x39979b1b,0x39ca436a,0x3a195517,0x3a478092,0x3a8069c2,0x3a429ae6,0x3a4b9176,0x3a2d4e40,0x3a5c036b,0x3a85ba74,0x3a3fd040,0x3a79ecc7,0x3a8e9f8e,0x3a3746c7,0x39fbd4f4,0x3a347191,0x39fb5c3a,0x3a12ab9a,0x3a8400fd,0x3a985e91,0x39d859c0,0x39b14bfd,0x3a4e4995,0x39c092aa, +0x39f1d8a4,0x3a6bf26e,0x3a756d42,0x398176fd,0x3873326a,0x3713f69e,0x37c686e6,0x386906d2,0x383241f9,0x3817ed32,0x371d3d2e,0x37b8f6f9,0x37f52280,0x3822be85,0x38bc9594,0x39521d37,0x39851ced,0x39d690e6,0x3a20486b,0x3a0c4c80,0x3a01909b,0x3a5ac89c,0x3a624592,0x3a358d87,0x3a7f0f11, +0x395be744,0x39490e4c,0x39a43404,0x3a92a89d,0x3a898b2c,0x3a4b717b,0x39c01136,0x3acd4150,0x3be21f59,0x3b7ae6e9,0x3adbdcea,0x39a74675,0x38945c05,0x38851770,0x389727ef,0x382d653e,0x3767dd5e,0x36675cb6,0x371a29a7,0x35d691e7,0x38071a03,0x37dbd1d3,0x383602d3,0x384378b7,0x37d9adc3, +0x3836fc89,0x389d1dfd,0x38d39ca6,0x39047163,0x395c63ec,0x39d58f55,0x3a2acd59,0x3a7d99fc,0x3a7330f4,0x3a2f4e75,0x3a75e371,0x3ab1414e,0x3ad0aeb9,0x3b0eb6a8,0x3b04e133,0x3aeab5cd,0x3af31c34,0x39ee144d,0x3ac3c179,0x3b6b0714,0x3ae26a3d,0x3ac257b3,0x3a4381ff,0x38b09aac,0x38792dff, +0x382fa16f,0x36148bf7,0x357d54c7,0x36a1b134,0x3679d2bc,0x35d76dfc,0x3696cc47,0x35c068c1,0x37707d9b,0x388b233a,0x38ba3585,0x3902add0,0x3908430d,0x39274307,0x3936ccc3,0x39770c8b,0x39724357,0x3974dac0,0x396cd685,0x394bd501,0x390ca48e,0x39957ee2,0x39ddb67c,0x39bd32aa,0x3a3b18ea, +0x3a7a14f7,0x3ad431b3,0x3b126abf,0x3a93d587,0x3a939df8,0x3a7472e8,0x3a822be3,0x3a1d9f93,0x390e96b2,0x37d92312,0x371224eb,0x37fefa43,0x379f3922,0x3796f140,0x375384a3,0x3725ba71,0x36bc8082,0x3685dc55,0x37b4abc3,0x388d2fd5,0x392c2801,0x3963e493,0x398d6094,0x39799f84,0x393642f1, +0x38d7ccab,0x38439256,0x37f6f008,0x38d3fca7,0x399c32e0,0x39d087d7,0x3a1453f5,0x3a46c512,0x3a2c0b23,0x3a2013b2,0x3a202bd7,0x3a3cada3,0x3a31a19e,0x3a4550e1,0x3a859525,0x39e77d9e,0x39c58650,0x399f95f5,0x39727958,0x394c505e,0x3933a305,0x39093e7d,0x38ce5236,0x38d283cb,0x38b80725, +0x38806d10,0x383c3baa,0x37cb199c,0x380c88bb,0x381b6553,0x38271215,0x382f9a49,0x387305ac,0x389352ac,0x38833fe1,0x38285711,0x381fce26,0x3823e1fa,0x3899f42e,0x390cc533,0x394eaf34,0x399021ec,0x39a59b86,0x39b55139,0x39a30556,0x39ae2624,0x3a020e5d,0x39c88cae,0x39b05f65,0x39bca508, +0x39c8ce75,0x39475954,0x39527dc3,0x395a0834,0x3952b180,0x39788102,0x39542b0e,0x393165d2,0x392a8e58,0x390b49fa,0x38f8a746,0x38fd1398,0x38cbc01a,0x38c8712f,0x38e46de7,0x38a7bbff,0x389ffca5,0x38ce70d6,0x38ac47c5,0x38a34736,0x388c6f3a,0x38805a05,0x384f53d4,0x3858aaa5,0x3832d2dd, +0x382c7c86,0x3841ff2a,0x382776df,0x3872315e,0x38d56bf0,0x38e4cb4f,0x38f2a3da,0x3912a7a7,0x38e4990e,0x38d7c39e,0x39008a37,0x391c50a0,0x3903eb7c,0x3918ab35,0x392ea8c6,0x3909afcf,0x39170954,0x3918f8b8,0x392be2e9,0x393f7101,0x39321aef,0x3927c75f,0x3925db2a,0x391e902d,0x3917623a, +0x39200381,0x3906bcad,0x38e2a7e8,0x38dae10d,0x38c11ee9,0x38c69c3a,0x38c71530,0x38ad75ae,0x38995a4f,0x38886d62,0x3875b932,0x3862e11c,0x385e5412,0x3867192b,0x3886552b,0x389b8ded,0x38b05133,0x38cb6c13,0x38fab3e2,0x38d68e43,0x38d36ce6,0x38dd8f61,0x38f70342,0x389d7493,0x38b2a26a, +0x38ca9b7d,0x38fb0f7e,0x3919204c,0x38cf72e8,0x38fa541e,0x3924b472,0x392ad504,0x39303291,0x39265637,0x393b832d,0x3945fe56,0x394a75e5,0x390ba1fc,0x38e199de,0x392d9ff5,0x38fe9a6e,0x38d04d5c,0x38c42f0a,0x38ad01e4,0x38aa5505,0x38a2ed46,0x389ec71c,0x389ab991,0x3893c5df,0x38947021, +0x3892faf6,0x3894c0cf,0x3897e86f,0x389e06e0,0x38ac05a5,0x38a21fa7,0x389f77cb,0x389e0f16,0x389e2dea,0x38e06be1, +}; +const uint32_t defaultHRIR_rom_EL32[HRTF_MODEL_N_SECTIONS * 470] = { +0x3ea949d7,0x3e9e9e1b,0x3eaad36e,0x3e968ec6,0x3ea57d26,0x3eab1dcf,0x3eb44268,0x3eb925e2,0x3ec125cc,0x3eb46cfb,0x3eaddeaf,0x3ea72cfe,0x3ea16e08,0x3e9c9033,0x3e98340f,0x3e95698b,0x3e924505,0x3e8f2d4d,0x3e8bb504,0x3e81927f,0x3e916ed6,0x3e8d691a,0x3e952461,0x3ecc76c5,0x3e88ca6b, +0x3e8f4874,0x3eb998a6,0x3ebc79c9,0x3eb7e9c5,0x3ea883fd,0x3eb92f39,0x3ebfaee3,0x3ebbeebc,0x3e949d90,0x3e9323ca,0x3ecc82e4,0x3ea7e5e5,0x3ed6e55e,0x3ede2341,0x3edfd603,0x3f00029f,0x3f0c5c00,0x3f1cc904,0x3f2736fb,0x3f2fda5f,0x3f1a82a9,0x3f0b5757,0x3ef97e3f,0x3ee19c7b,0x3ecf3dd5, +0x3ec1cbb8,0x3eb7d5a0,0x3eaddcb3,0x3ea565ec,0x3e97b659,0x3e8a2c09,0x3e884bb5,0x3e87446c,0x3e4c2da2,0x3e541451,0x3e348361,0x3e2de453,0x3e37f8b2,0x3e3745ed,0x3e4880c2,0x3e43aa36,0x3e47e138,0x3e488bce,0x3e3ef5ad,0x3e581338,0x3e64b2ea,0x3e8074ba,0x3e950746,0x3ebb764d,0x3ee9a40e, +0x3f1ef55e,0x3f3304cf,0x3f5769b9,0x3f7a6d70,0x3f88afa7,0x3f98ca8a,0x3f7fed69,0x3f5fc85f,0x3f411510,0x3f244f51,0x3f0e9f1b,0x3ef90951,0x3edf5c20,0x3ec5c55d,0x3eb195d5,0x3e8f0457,0x3e782c46,0x3e3bd2f3,0x3e2e50ce,0x3e084f2d,0x3e002303,0x3dd5bccb,0x3dc4fb4e,0x3db5233e,0x3dbeaae2, +0x3dc73daa,0x3ddf8b77,0x3db408d0,0x3dcbf93d,0x3ddebb04,0x3e042790,0x3e1cd871,0x3e558dc8,0x3e8d329d,0x3edc55ee,0x3f1f91ae,0x3f646bf6,0x3f89309d,0x3fadfa07,0x3fc8ed30,0x3fe628f0,0x3fffd1cf,0x3fc60734,0x3f9d08ce,0x3f6f0bdf,0x3f36e826,0x3f11c33a,0x3ef5f55e,0x3ed646e6,0x3eb7bc22, +0x3ea1aa6a,0x3e71f591,0x3e4154d0,0x3e0ea292,0x3de6b8f5,0x3d9d7d15,0x3d8a95ba,0x3d3beaa6,0x3d1b0ff8,0x3d0732a8,0x3d1a9b9d,0x3d2d4ff1,0x3d39e2bc,0x3d12e9a6,0x3d12b4e1,0x3d46d7ac,0x3d964747,0x3e0829b0,0x3e27443c,0x3e81049e,0x3f7d4c5e,0x3fd0c51c,0x4006822e,0x4012dcdf,0x40227e01, +0x4014db00,0x400f1b9e,0x401058a5,0x401a9143,0x40265aa7,0x40296650,0x40283a34,0x401c3707,0x400b8f28,0x3fd472d2,0x3fa2ce4b,0x3f832cc2,0x3f214ea0,0x3ed1c5db,0x3e809b4c,0x3e3cb9a3,0x3de0ce40,0x3da06a01,0x3d5b46af,0x3d361b10,0x3d1b1c49,0x3d44ecec,0x3d4b25c2,0x3d50f054,0x3d4e4c6b, +0x3d85ffac,0x3dd6bd4e,0x3e1d6b3e,0x3e66df58,0x3ea102fa,0x3f0f5aed,0x3f91f2c1,0x3fb40b5b,0x40646f0a,0x406b6f6c,0x40672898,0x4031f271,0x402604e6,0x4034385c,0x40398cd0,0x403eaf95,0x4043f6aa,0x40409b5d,0x40371f04,0x40275acc,0x3fff1879,0x3fb754c4,0x3f82bbec,0x3f2349a1,0x3ef9b368, +0x3e9f2346,0x3e892203,0x3e2898a2,0x3de47af7,0x3d89c034,0x3d5239db,0x3d3551bc,0x3d5746cb,0x3d7960c6,0x3d9abc0e,0x3d8e70ad,0x3da2004c,0x3ddcacb4,0x3e123f7c,0x3e4fd66c,0x3ead1b84,0x3f0dad32,0x3fb0fc41,0x401aebec,0x409a1704,0x408302a2,0x407ffff7,0x4025a20b,0x401cb702,0x4033d5f0, +0x402df25c,0x40376abc,0x404be08d,0x4045547d,0x4034bcd0,0x401a93a0,0x3ffea26d,0x3fc1f714,0x3f9073d1,0x3f3270b0,0x3f0aa60e,0x3ea59cb8,0x3e8d782b,0x3e4ced45,0x3e44e9ab,0x3dea46c6,0x3db65f72,0x3dd4cc8c,0x3dad44af,0x3dbeda43,0x3e1d73c8,0x3dad1f32,0x3dac30ee,0x3de91bae,0x3e6fd667, +0x3e87c367,0x3f216d28,0x3f065daa,0x3f94dce2,0x40304987,0x403a6f75,0x400d291a,0x40124812,0x3ffa42b0,0x40085520,0x40265cd9,0x4025bf7c,0x4028e41a,0x402029d2,0x401d1e11,0x400ff35d,0x3feb809b,0x3fbef783,0x3f8d9515,0x3f44a251,0x3f122074,0x3ef40a2a,0x3eb24039,0x3e911f85,0x3e523550, +0x3e40fc56,0x3e06df0d,0x3dd22833,0x3db95d5b,0x3d9b735b,0x3dbf0be1,0x3e76a1a0,0x3dd8714d,0x3db897d0,0x3de74109,0x3e093df2,0x3e535ddd,0x3e956a4d,0x3ef7a465,0x3f6f4708,0x3fb9717b,0x3fd358a4,0x3fe93e16,0x3fed3332,0x3fea705b,0x3fed71a0,0x40043ac1,0x3ff8a755,0x3ffe9b92,0x40051e7d, +0x3ff4d6ce,0x3fd80510,0x3fb1ed3a,0x3f83ad3c,0x3f469a6a,0x3f26cb49,0x3f0e1467,0x3f03b4b8,0x3ee38399,0x3eb44ba0,0x3e87aec0,0x3e4804e6,0x3e24c82c,0x3e0a4c24,0x3dd6c9d8,0x3dc674f0,0x3dd92d96,0x3e26bb9d,0x3df1a7e0,0x3dfe6a19,0x3e162a57,0x3e3f12a2,0x3e6b8a0b,0x3ea31714,0x3f47cb50, +0x3f6030c7,0x3f7b63d5,0x3f9afb36,0x3fa70a58,0x3fb1bc0a,0x3fc22372,0x3fc7b6e4,0x3fc68875,0x3fc48fc6,0x3fbe5d2a,0x3fb2517a,0x3f9b6e1a,0x3f85b6a5,0x3f646e2c,0x3f46d593,0x3f28364a,0x3f1105b1,0x3f063f28,0x3f10ae9c,0x3ed36154,0x3ecc7964,0x3e9bc7af,0x3e8d477f,0x3e4b4da5,0x3e16a635, +0x3dfd081d,0x3dfc87a6,0x3e0843b5,0x3e174652,0x3e1615be,0x3e16208b,0x3e19f4e4,0x3e42b577,0x3e84dfbe,0x3ea59da7,0x3f03c265,0x3f216eba,0x3f4de3fe,0x3f74c17c,0x3f87e1f0,0x3f9d2063,0x3f9b7831,0x3f9ea498,0x3fa5cc27,0x3f99a529,0x3f91e490,0x3f8dc4ac,0x3f800406,0x3f6aa891,0x3f55b3ef, +0x3f40979b,0x3f2c61c9,0x3f1cac17,0x3f0e3177,0x3f0f195d,0x3ef46e30,0x3ed82e3d,0x3eb27154,0x3e9c78f3,0x3e84e650,0x3e8048c3,0x3e59f560,0x3e64601e,0x3e56c4ae,0x3e6d39b2,0x3e39ec71,0x3e68b45d,0x3e4c4839,0x3e89b44d,0x3ea8a2ad,0x3ee0156f,0x3f04383b,0x3f57de18,0x3f4817c8,0x3f3d8a6e, +0x3f484be1,0x3f51b3bb,0x3f5cf774,0x3f6a830e,0x3f7c74e3,0x3f70aecf,0x3f6a4c6d,0x3f6257b9,0x3f594409,0x3f510224,0x3f48ad3e,0x3f3d782f,0x3f318cb9,0x3f2881dc,0x3f208b2c,0x3f16a0bb,0x3f165428,0x3f1e0145,0x3ee3e1d6,0x3eeca79e,0x3ed863d6,0x3ec6d3a2,0x3ed1eac1,0x3ed5a321,0x3eea8fbf, +0x3ed8c5c7,0x3eee18ad,0x3ee8c70f,0x3ed160b3,0x3eecff85,0x3efa86bd,0x3f088bc4,0x3f1bb6ce,0x3f2e2455,0x3f408a4e,0x3f23cf8b,0x3f2f482b,0x3f2f3548,0x3f33c546,0x3f363d85,0x3f3b7bc3,0x3f35a8ea,0x3f326b69,0x3f2f0360,0x3f2c425e,0x3f29e130,0x3f27fac2,0x3f25d20a,0x3f23f612,0x3f21349e, +0x3f1fbc33,0x3f15cbbd,0x3f2fa0fa,0x3f224010,0x3f2e20b6,0x3f78668a,0x3f1cb390,0x3f249834,0x3f5eafd1,0x3f653827,0x3f5ea74f,0x3f4ab775,0x3f5f939e,0x3f64bad6,0x3f5b7d64,0x3f299928,0x3f28bd1b,0x3f774df7,0x3f3c07e0,0x3f4e1208,0x3981d91f,0x394eea09,0x3930056d,0x394cbf08,0x395a29b7, +0x3938ab32,0x39854dfd,0x3981ea72,0x3936a35a,0x39480faa,0x392789ab,0x38e0dc4c,0x38d83cb3,0x38faf815,0x39481e83,0x3954a164,0x396c3ff6,0x397085e7,0x397eff50,0x398a10f7,0x3999aa24,0x39a1755c,0x399f428a,0x39a323b3,0x39666283,0x395117f5,0x393e677a,0x3980910d,0x398acdb3,0x3996e2b4, +0x397f7c8a,0x396cfa3c,0x39607e98,0x3944d1cb,0x394fc9df,0x39bd72c7,0x396b4714,0x39b90f06,0x3972b76a,0x396b9bbf,0x394be8cd,0x39142134,0x39a73ba6,0x39b518b9,0x39253585,0x39766e4b,0x39336d08,0x392ec619,0x38d2ae74,0x38f4df18,0x398f360e,0x3990920e,0x39b90bbe,0x39b38935,0x39d27b4d, +0x39ff87d9,0x3a1c0fdf,0x3a31644a,0x3a2d97ff,0x3a2404b2,0x39bb0a95,0x3981cfdc,0x3957505a,0x39bce4d9,0x39edc5fb,0x3a056709,0x39d0c26c,0x399a548b,0x397797ce,0x392b6ce7,0x397e7e97,0x3a66ab6c,0x39f2bd88,0x39e1bd0b,0x3a042d10,0x39c145a9,0x39dac6e7,0x3998594c,0x3a46514d,0x3a384a10, +0x3914fcbc,0x39a2bc4f,0x3968e759,0x3a3c6d73,0x3a050a1a,0x39fbc953,0x3a4e6e95,0x39e62b07,0x3a091eab,0x39ed49d3,0x3a1c5cea,0x3a56c771,0x3a8ff64a,0x3aad9a95,0x3ab4cb54,0x3aaaaf29,0x3a21c6fe,0x39a50b01,0x399c2d49,0x3a2e2f6a,0x3a6349f7,0x3a8f2c65,0x3a458f27,0x3a0ba3b6,0x39c2a4a4, +0x398dc0ea,0x39a093a1,0x3ae313e2,0x3a02c621,0x3a99831b,0x3a43f6fc,0x3a0d254a,0x39a94928,0x3a2debf9,0x3a8afff1,0x3a908b75,0x39a33ebc,0x39ca504a,0x3a2c41aa,0x3b343e5f,0x3b273a16,0x3b14b786,0x3b0706aa,0x3a92c416,0x3a8f30fa,0x3a615687,0x3a8dfbe4,0x3ad1d135,0x3b0ce35a,0x3b273a48, +0x3b28f3c7,0x3b36b9cd,0x3acb10c9,0x3a59bbd0,0x3a1e19ff,0x3a8e4b85,0x3add4b28,0x3b0d831b,0x3ac87948,0x3a977915,0x3a15283c,0x3a6d3f79,0x3a30b647,0x3b92e1bb,0x3afd13ea,0x3bfbf38e,0x3b0e5c95,0x3ab5a938,0x3b514f67,0x3c1954cc,0x3b8c5113,0x3b16de45,0x3ab30305,0x3b27c65f,0x3b044fce, +0x3b69464e,0x3b52935d,0x3b3d27d9,0x3b00c622,0x3a487988,0x3a28cc87,0x3a2a02a2,0x3a242879,0x3a4e4f04,0x3a99c9dc,0x3b0dba8a,0x3b2356fe,0x3b2e3e2a,0x3ac80ff1,0x3a8e9653,0x3a68393a,0x39c574e8,0x39f8fed0,0x3b0b8895,0x3ae4e609,0x3b15de8a,0x3b12b86e,0x3b3c946e,0x3aaa5dfd,0x3b5c9aca, +0x3bc2f373,0x3c225987,0x3c55d372,0x3b1bc057,0x3b115b72,0x3c098e24,0x3be33234,0x3b7f074e,0x3b5ae9db,0x3a9f7a67,0x3abc817b,0x3aca6dd5,0x3a8c65d2,0x3a7b8a5e,0x3a38a694,0x3a4c96b2,0x3a71f526,0x3a3543da,0x3a15f49e,0x3a305644,0x3a5e0da5,0x3a362cf8,0x3a1fb89c,0x3a377fa2,0x3a5a97d6, +0x3a2af5af,0x39f768b1,0x3a4c7972,0x3a761847,0x3a7811da,0x399b3d29,0x39ca2c9a,0x3aaf859f,0x3b2b7302,0x3b1a019f,0x3b6ba0f9,0x3bff8aa9,0x3b8e4277,0x3bb880e2,0x3b70c6f0,0x3b66149c,0x3b446adb,0x3b8e421c,0x3b2c3d78,0x3b8c3ed7,0x3b4c9b45,0x3b261d0a,0x3ab0c73b,0x3a383925,0x3a117dfb, +0x3a5031be,0x3a61f118,0x3a49f2d7,0x3a157baa,0x3a60c720,0x3a5904c7,0x3ac7b4ef,0x39a26a2e,0x394315a6,0x3a02d95a,0x39cc1712,0x39527f5a,0x39793c37,0x3941eafb,0x389aa36f,0x3897aad6,0x39d00f4a,0x3a342dfb,0x3a584855,0x3a924077,0x3ae9c146,0x3b2422ac,0x3b4cbdb3,0x3c289d12,0x3c56a865, +0x3cb67aee,0x3ca5fa21,0x3c2b7d6b,0x3bb4e6ab,0x3b74d661,0x3b6856b1,0x3b0fdf91,0x3afcc6b9,0x3aea86ec,0x3aa16cc3,0x3a97a74f,0x3a5015e9,0x3a3941d6,0x3a2a5c8f,0x3a28a0bf,0x3a42cb64,0x3a2eda97,0x3a6c76a4,0x3a0390e2,0x3a0a6a4e,0x3a01a091,0x3a01d53e,0x39a575ab,0x3975264c,0x38f1522f, +0x390e4bc1,0x3979b0d4,0x399c04bc,0x39d9b601,0x3aa04462,0x3a8a0957,0x3b10323e,0x3ba3cbee,0x3c004420,0x3c9b3b0b,0x3ccec1a6,0x3caf4452,0x3c5db7a4,0x3c0ce6b4,0x3bea9c76,0x3bfb5430,0x3bb9e008,0x3b587371,0x3b165df8,0x3ad54c8a,0x3ab88cb1,0x3a8c6e39,0x3a5d5732,0x3a1c813c,0x3a0c6a2c, +0x39f02544,0x39f387ba,0x39e72622,0x39b6eb7e,0x397745fc,0x3956ff08,0x39bf8561,0x3943794e,0x39451aa8,0x39b73271,0x3949b35b,0x3974f61f,0x39be2d3b,0x3a4c47c3,0x3ad02c9b,0x3b38b4bc,0x3c05ca00,0x3c426eac,0x3c47c442,0x3c6d5392,0x3c600404,0x3c4f06d5,0x3c3c3463,0x3c1519e3,0x3c0c5f1a, +0x3c1459fe,0x3c064779,0x3bd6162f,0x3b8d0eb8,0x3b828365,0x3b82e3d0,0x3b8ccf65,0x3b846906,0x3b370ea2,0x3b2f7e89,0x3b16bfc9,0x3aea1977,0x3ab8d38a,0x3a6aafe5,0x39af6b7e,0x39d59d75,0x39acedbc,0x399f2e58,0x39a390a0,0x3a263ed5,0x3aac59f6,0x3af7fe6b,0x3b3098b9,0x3b5f4e3d,0x3ba93fc2, +0x3bdef662,0x3c038266,0x3bf84924,0x3bf701ea,0x3c14aff4,0x3c306430,0x3bdec784,0x3bf757ba,0x3bf2503a,0x3c036e81,0x3c2165e7,0x3c10c79d,0x3c1ceb3b,0x3c3db0d4,0x3c0ab8af,0x3bd35687,0x3bc1c364,0x3b9f60b7,0x3b83969e,0x3b5d64f1,0x3b309acc,0x3b127b2e,0x3af67965,0x3aa8209b,0x3a5790ea, +0x3a143a1c,0x39dac4ac,0x39a25e33,0x3a0bd002,0x3a3e4214,0x3a9aa49b,0x3af3758c,0x3b186f23,0x3b3b7056,0x3b7bf7a0,0x3b8478da,0x3b94e9e0,0x3baf481e,0x3bbaf049,0x3bd2781b,0x3beca121,0x3be2e10d,0x3ba35c28,0x3ba00dd2,0x3b94a348,0x3b8c7260,0x3b87f07d,0x3b87495e,0x3b88d3bc,0x3b91da47, +0x3b834caa,0x3b8227f4,0x3b753ee4,0x3b69602d,0x3b5a3e43,0x3b54a725,0x3b2f99b9,0x3b11258f,0x3aea9cde,0x3abd7cd6,0x3a92710d,0x3a58d503,0x3a7a6872,0x3a78c541,0x3a8fc9cf,0x3aa1289c,0x3ac6e716,0x3aec26a3,0x3b0c171c,0x3b23c16a,0x3b3d2853,0x3b57a615,0x3b7707a1,0x3b8cb56a,0x3b8d4236, +0x3b906460,0x3b91e22f,0x3b95ab23,0x3b6f66e2,0x3b6eae15,0x3b69e8ae,0x3b6ab44a,0x3b68a86f,0x3b6f87ea,0x3b739746,0x3b7abc1b,0x3b70e9d2,0x3b68ae3f,0x3b6396d8,0x3b58e56e,0x3b50e28a,0x3b4c4992,0x3b3e2880,0x3b337a29,0x3b296287,0x3b1c8612,0x3b13cf2e,0x3b02e502,0x3b129c94,0x3b1b9135, +0x3b2cd589,0x3b20afff,0x3b2bd018,0x3b3d45d3,0x3b439764,0x3b484b0e,0x3b4fc9f2,0x3b584ca0,0x3b61f60b,0x3b6e853a,0x3b679204,0x3b650736,0x3b7a30bf,0x3b719024,0x3b8a967a,0x37478792,0x36fed3eb,0x370c8bbc,0x37367266,0x37656ba7,0x37c3a48d,0x375faf10,0x37200468,0x36796731,0x37450488, +0x3780b49c,0x37ab8ff5,0x37793cde,0x3789c61a,0x37d1fa89,0x37dfa813,0x37d4381b,0x37a25090,0x37410619,0x3713c88a,0x370e1c41,0x370f7e39,0x371bad78,0x37404e70,0x378453ff,0x3764b25d,0x368e1899,0x3717c2b6,0x3708d730,0x370dd7ef,0x36bbdfa7,0x367c5c59,0x36e42e54,0x3698de59,0x36dcc3f8, +0x37844a23,0x3708fd32,0x370c5e47,0x374960ca,0x380c16c3,0x3861c57e,0x38ca380f,0x387934f1,0x38173631,0x36e9a106,0x37c52485,0x37f83430,0x3877e619,0x37e42875,0x386d271e,0x3908eaaa,0x392fe310,0x3925b2be,0x38d51552,0x3850d429,0x38044fcd,0x37f54dfb,0x37bab5d2,0x378a34d9,0x37bd25cd, +0x383a289e,0x3829e169,0x37421f6f,0x37d0ec5e,0x37da2e40,0x38270e61,0x3817ed84,0x37f14c77,0x3815ee57,0x371b50ad,0x36d66634,0x383cf40c,0x372d67a0,0x367ef215,0x37dfa438,0x3857a96f,0x38eaa0ea,0x395e1c85,0x393025c8,0x38dead0f,0x382b20dc,0x38605dff,0x38bc91fa,0x3956117f,0x38d5dac7, +0x3908a8ed,0x3997d82f,0x39a00e1a,0x39915cec,0x392c5645,0x3870efe9,0x38242a95,0x385eac56,0x37fb6f3e,0x37b55ed6,0x381a9279,0x38c86801,0x3893dcbc,0x38b6cd3c,0x388c78f2,0x3907b40f,0x39ac9065,0x39a563dd,0x3962a26f,0x392189f2,0x380691d5,0x371a4d3c,0x38dbca08,0x37016452,0x3860d533, +0x3805d7be,0x3969c184,0x39d7ba1d,0x3a4ac4a9,0x3a0fd11a,0x39b9ac58,0x38ff66ad,0x38bb9574,0x38dae1c3,0x39ee6b45,0x38eb2cf4,0x39d47578,0x3a99afb8,0x3ac0f562,0x3aaa405b,0x3a59fd07,0x39d742b4,0x39a87c1b,0x39a848a1,0x39466759,0x38a92648,0x39254ddc,0x396371c7,0x39181eed,0x38d70069, +0x38c86f00,0x38daa8b0,0x39744f0a,0x3a046c6a,0x39e74760,0x39ca8ae0,0x3969fa5a,0x38a21637,0x39c2f7ee,0x38c5e45a,0x3a52ea76,0x3a445989,0x3acd17ee,0x3ac624fa,0x3aa9f06f,0x39fed80f,0x3961ef41,0x39a3542e,0x39278124,0x3a1c0311,0x3a9f0369,0x3a91b0c0,0x3a72417a,0x3ac1e6d8,0x3a9f75ba, +0x3a7594a7,0x3a6c8108,0x3a7919c7,0x3a95f3b4,0x3a8ca76b,0x3a595fac,0x3a0fd900,0x39e3b1d1,0x3963bb0a,0x38c32225,0x38d5ba68,0x38d89754,0x390e09d7,0x3778268d,0x37a50bf2,0x3958e215,0x3a10a129,0x39f9da64,0x39dd1ab3,0x3994dc0e,0x3a06a240,0x3a8f58c1,0x39ed344f,0x39e17f33,0x3a0adab7, +0x3a99c873,0x3ac97dc8,0x3ad3beaf,0x39eabd59,0x398d2b10,0x39a11f77,0x3abf76c0,0x3a891348,0x3aab6780,0x3aa1e1d6,0x3a2a3a1d,0x3a182764,0x39da2cb6,0x39c52c08,0x397c0f78,0x3998796e,0x38e3814b,0x387d050a,0x3813cf28,0x37fda665,0x372ed78e,0x38622626,0x3888b9c4,0x38b77080,0x38217086, +0x3763ae74,0x38c02b3e,0x39c07582,0x3abb34e2,0x3ab0ff77,0x3a3ee17c,0x3a0f45dd,0x3bbc1d71,0x3c2bcaf6,0x3b207bf1,0x3a2e1eae,0x3af474b8,0x3abaa6bc,0x3ac354bf,0x3afc333d,0x3ac1514c,0x3ac2210b,0x3a9249fe,0x39c69260,0x3a1bd13e,0x3a447380,0x3a050bb6,0x39eaa96b,0x39a0604d,0x394281fd, +0x38cf44f0,0x38bda8f3,0x38145197,0x37d90894,0x388d470e,0x3880791f,0x3823a6a6,0x3849d7e6,0x361d75bb,0x37618d3e,0x36acf63a,0x37b2d32e,0x3885c9cf,0x38f39c8f,0x38c3bf01,0x38dff582,0x39f95652,0x3b264077,0x3b2a60e7,0x3bb1e2b3,0x3afa805e,0x3a58314a,0x3a8e6125,0x3a82fcd6,0x3a3c09fa, +0x3a7c4686,0x39f99dee,0x3a114635,0x39b093ab,0x39052509,0x3974ea84,0x399f7927,0x3987749f,0x3953b8c9,0x394c25d3,0x3923066f,0x39453539,0x394f27f6,0x39327374,0x390f1dc5,0x38d6b5bf,0x37b0f9e8,0x35c5aedd,0x36d18bdf,0x361c4a46,0x36b97c65,0x36fd7cd6,0x35c33bf9,0x365475a1,0x3878a575, +0x38b917fc,0x38fb697a,0x3a93f343,0x3b11e344,0x3aa74282,0x3a95eedf,0x3a43978c,0x3a1ea414,0x3986f63c,0x39178ab8,0x399e5793,0x39c4391f,0x3a185289,0x3a3c3a99,0x3a49fb2b,0x3a267925,0x39eb542a,0x39af9264,0x39022459,0x382a9088,0x388cc16c,0x3921cd09,0x39874a15,0x39b5d044,0x39c553cf, +0x39a74d8d,0x39866069,0x38db0d2e,0x3809264f,0x36b3c9e1,0x37093776,0x37789cb8,0x379561d5,0x37d9154c,0x37d84530,0x38394589,0x376c948c,0x38106fb3,0x394728cd,0x3a67b2c8,0x39d54121,0x39f0d8a0,0x3a0608eb,0x39f67ef1,0x39dae3f4,0x39c091f1,0x39d282ec,0x39fedef7,0x39e8229f,0x39ee825c, +0x3a06850d,0x39f3c714,0x39cb7bb1,0x3986fc79,0x392118ef,0x38829b34,0x37d5e3f0,0x37f2c744,0x38555121,0x38ca3338,0x38e5f4c0,0x38b605f8,0x387a56eb,0x3878bec0,0x386fc69d,0x385e9056,0x381fc05c,0x388ad231,0x38bca311,0x3908cc87,0x391e1f24,0x391bfa16,0x39500643,0x39839a54,0x39943554, +0x39abc85f,0x3994d7ba,0x399a142b,0x39848a28,0x394b4f2f,0x390f295c,0x38c5b290,0x38bcfdc6,0x38dc4467,0x38bb0db1,0x38af2593,0x38c8e072,0x38655ae1,0x38442442,0x3889e43c,0x386ef822,0x3879fba1,0x389682f6,0x38907dc0,0x389fb45c,0x38c076ff,0x38d7d68b,0x39004d94,0x391adb3e,0x38f3bbe8, +0x38fc349d,0x392e20f8,0x391552ad,0x391ad829,0x3938e525,0x393ea547,0x394fb01d,0x39839f3e,0x398655b2,0x39a0373e,0x39b6e344,0x399c4950,0x395d2456,0x39560cd9,0x3938a4ac,0x391f613e,0x38fe53aa,0x38cbf61e,0x38a94caa,0x38b1971c,0x38ac21a1,0x38b13b92,0x38aedf5b,0x38a78f99,0x389d16c9, +0x38a349fc,0x38a53854,0x38b2d699,0x38c5a968,0x38e00a4a,0x38fc80d7,0x390ee5ce,0x390d955d,0x390b1e30,0x39163d03,0x3926b467,0x393f0e87,0x395dd5a7,0x395418d5,0x39598456,0x3966741b,0x396fb66a,0x3982fc2c,0x399012a2,0x3980a2e1,0x39647081,0x395f6873,0x394bf9d4,0x38e43c83,0x38d9f2b9, +0x38cde27d,0x38be700a,0x38b81225,0x38b0ce50,0x38ac59c0,0x38a4cc5c,0x38a565f1,0x38a5f118,0x38ac6bbb,0x38b2b675,0x38bc47c6,0x38c4d8d9,0x38cd60a1,0x38d45c3b,0x38db9bd1,0x38e43244,0x38ed722d,0x38fcf893,0x38fc59d5,0x3900b7c9,0x39043ca1,0x3903508c,0x3906c8ca,0x391561bc,0x39103a9f, +0x390f5efc,0x390abf30,0x390b73d6,0x39096d39,0x390d880e,0x38fbee8d,0x38f109a0,0x38f7ba96,0x38f04951,0x390e1d14, +}; +const uint32_t defaultHRIR_rom_ER32[HRTF_MODEL_N_SECTIONS * 470] = { +0x3ea94952,0x3e96b3de,0x3eac0098,0x3e9ec499,0x3ea82449,0x3ece0959,0x3e92fb80,0x3e94d96e,0x3ebb6806,0x3ebf2c5a,0x3eb94743,0x3ea8ba76,0x3eb7f274,0x3ebc8a4a,0x3eb985ae,0x3e8f3492,0x3e887542,0x3ecc104d,0x3e94f3ad,0x3e8d6ef0,0x3e919f3e,0x3e81a12c,0x3e8ba934,0x3e8f3162,0x3e92443b, +0x3e956946,0x3e9833cc,0x3e9c90fc,0x3ea16eac,0x3ea72c23,0x3eadda5d,0x3eb46de7,0x3ec12deb,0x3eb9255c,0x3eb43e2b,0x3eab26c8,0x3ea559b8,0x3edfbfe1,0x3edb5589,0x3ed8a3c0,0x3e95cf33,0x3e80cd54,0x3e62c244,0x3e577b07,0x3e3e0c11,0x3e4710c1,0x3e48be20,0x3e44185a,0x3e490da3,0x3e376856, +0x3e376849,0x3e2dea5f,0x3e35e973,0x3e540232,0x3e4af4c1,0x3e879a69,0x3e87aff5,0x3e8a2d54,0x3e97cb79,0x3ea557d0,0x3eade49b,0x3eb7d211,0x3ec1cfef,0x3ecf39a9,0x3ee19c3f,0x3ef97f9f,0x3f0b5d8f,0x3f1a80d7,0x3f2fcb9c,0x3f2733f1,0x3f1cdcf0,0x3f0c3d91,0x3f003aa6,0x3f1db3c8,0x3eeec08f, +0x3ebc39c9,0x3e8d7016,0x3e55103a,0x3e212045,0x3e041073,0x3de06a68,0x3dcaee14,0x3db21b35,0x3de025f2,0x3dc5b1d3,0x3dbf13a0,0x3db5a917,0x3dc48155,0x3dd212b5,0x3e000fef,0x3e0845c3,0x3e2d8de1,0x3e3dff7b,0x3e771d7b,0x3e8f28dc,0x3eb18a83,0x3ec5c3b9,0x3edf6074,0x3ef8fe68,0x3f0ea3c8, +0x3f24508d,0x3f4113cc,0x3f5fbffa,0x3f7fedc5,0x3f98e082,0x3f88af16,0x3f7a4b75,0x3f579368,0x3f32fd61,0x3f6ee325,0x3f16b6e8,0x3edb45ae,0x3e7b6fc1,0x3e2c28b1,0x3df2985a,0x3d99338c,0x3d410c60,0x3d1101d6,0x3d13217b,0x3d39c9bb,0x3d2bc320,0x3d1b0c6e,0x3d06a87e,0x3d1d1fa1,0x3d3f43c2, +0x3d8c5283,0x3d9d3131,0x3de71ae8,0x3e09a006,0x3e45cbd3,0x3e6f6616,0x3ea2888e,0x3eb75081,0x3ed6788c,0x3ef5eb98,0x3f11c219,0x3f36df6c,0x3f6f13d7,0x3f9d08c4,0x3fc621d4,0x3fff5b3d,0x3fe687d9,0x3fc87e03,0x3faebae2,0x3f87681d,0x40111ab0,0x3fb99833,0x3f83ae3b,0x3f0030e2,0x3e9f539f, +0x3e55721e,0x3e226067,0x3dd144c5,0x3d8753ba,0x3d4c95ee,0x3d509c62,0x3d4b16e2,0x3d44135e,0x3d1f6925,0x3d2ecedb,0x3d5b63db,0x3d9b2164,0x3de57bae,0x3e38e02a,0x3e71eafd,0x3ed98e76,0x3f1f30d1,0x3f83f206,0x3fa27000,0x3fd4af4a,0x400b63fa,0x401c4dc6,0x402843ac,0x40295bbd,0x402662f0, +0x401a91a2,0x4010244d,0x400f9138,0x4013dfb8,0x4024a4f4,0x400eaabc,0x4070f4c2,0x3fa0eb2b,0x3f92314b,0x3efc170f,0x3eb96b6b,0x3e548e04,0x3e044991,0x3de32f8d,0x3d9dd8bc,0x3d8fe1c4,0x3d98a21c,0x3d785e8f,0x3d586f0e,0x3d376712,0x3d508001,0x3d85da29,0x3df0440c,0x3e2a1c76,0x3e86773b, +0x3e9be714,0x3efdd2cc,0x3f220612,0x3f83331d,0x3fb70894,0x3fff58cf,0x40272268,0x4037365b,0x4040a7d2,0x4043fd16,0x403ebb9d,0x40398690,0x40340a76,0x40265f59,0x4030dc56,0x406a2bf7,0x4064d3b9,0x40a37d56,0x400ac9ff,0x3fc4d80f,0x3f0e722e,0x3f1757a1,0x3e8c749b,0x3e5d8653,0x3de8d03b, +0x3dacae87,0x3db0f0d2,0x3e1ec313,0x3dc14d08,0x3daadb0a,0x3dd34d53,0x3db22a32,0x3df43908,0x3e3f6e32,0x3e4b14e0,0x3e8e68fa,0x3ea199fe,0x3f0cf9b6,0x3f311aaf,0x3f90eee9,0x3fc1a8ba,0x3ffee1f8,0x401a6e0d,0x4034d8c9,0x40455a4c,0x404bd922,0x40376165,0x402dfd56,0x40339d70,0x401d0d70, +0x40247f69,0x4081affb,0x407dd802,0x404ebf41,0x401378ae,0x3f988ed0,0x3f1184de,0x3ea141ae,0x3e58b307,0x3e062161,0x3ddfec30,0x3db8240d,0x3dd4d9d7,0x3e720891,0x3dbd5abc,0x3d9b1014,0x3dbdc353,0x3dd6b6d2,0x3e061032,0x3e440faf,0x3e5b3220,0x3e91b85b,0x3ea84532,0x3efb9aae,0x3f1008f7, +0x3f45dab1,0x3f8d3b93,0x3fbf316d,0x3feb48ba,0x401009c7,0x401d29ec,0x4020228b,0x4028ec93,0x4025c7cb,0x402635bf,0x400889ee,0x3ff8f714,0x4013efc7,0x4007409c,0x3fd0e908,0x3fc45007,0x3f813935,0x3f104b59,0x3ebbaaf3,0x3e6e18ce,0x3e2eabae,0x3e1d3709,0x3e0117b9,0x3df34882,0x3e22e52a, +0x3dd86c83,0x3dc72027,0x3dd41b7e,0x3e02d26b,0x3e27dd72,0x3e486285,0x3e7bf17f,0x3ec497eb,0x3edcde42,0x3f060b23,0x3f0d4e99,0x3f27189c,0x3f468167,0x3f83b8f5,0x3fb1cc02,0x3fd81858,0x3ff4ea13,0x4005176b,0x3ffea363,0x3ff8a889,0x40042bf8,0x3fed6e4e,0x3fea6a40,0x3fed65d2,0x3fe9b038, +0x3f98c734,0x3f7ead0b,0x3f434b58,0x3f002103,0x3ea802a5,0x3e8c1097,0x3e440883,0x3e17bddd,0x3e14ca6c,0x3e16c2c1,0x3e105658,0x3e084b9c,0x3dfc6b42,0x3e00527a,0x3e17818d,0x3e49bd0a,0x3e878869,0x3e997e8a,0x3ec503c5,0x3edfc4dc,0x3f0b5b15,0x3f08001a,0x3f104318,0x3f28879c,0x3f46b041, +0x3f6481b6,0x3f85b333,0x3f9b7624,0x3fb24b60,0x3fbe64ca,0x3fc488dd,0x3fc68498,0x3fc7b7f6,0x3fc24730,0x3fb1653c,0x3fa7d227,0x3f75c923,0x3f4dd03e,0x3f266662,0x3f064de3,0x3edc4ef3,0x3ea5812e,0x3e89474e,0x3e4b5b92,0x3e699005,0x3e3960aa,0x3e6cda0a,0x3e55d9a7,0x3e63f68d,0x3e572ff0, +0x3e7fe216,0x3e860046,0x3ea01815,0x3eb274be,0x3ed8c43d,0x3eeec9ab,0x3f1028c9,0x3f0e2013,0x3f1ca75c,0x3f2c6cf0,0x3f408ee7,0x3f55b64e,0x3f6aa2f5,0x3f800495,0x3f8dc2cd,0x3f91e6bf,0x3f99a696,0x3fa5cbee,0x3f9ea220,0x3f9b71e3,0x3f9d2c75,0x3f87c29c,0x3f3d50ab,0x3f48b831,0x3f52e198, +0x3f194a00,0x3f0a2718,0x3efc51bf,0x3eed3028,0x3ed0b5f6,0x3ee906fa,0x3eef02fb,0x3ed83025,0x3eea4bb2,0x3ed604ee,0x3ed3c857,0x3ec7b905,0x3ed8510e,0x3eed0ac2,0x3ee33cfe,0x3f1ca039,0x3f17b3c1,0x3f168da9,0x3f206c5d,0x3f2889ed,0x3f31863b,0x3f3d7b3f,0x3f48af5b,0x3f51025a,0x3f594208, +0x3f625c84,0x3f6a4abc,0x3f70ad48,0x3f7c7153,0x3f6a88f3,0x3f5cf60b,0x3f51b8bc,0x3f484f7b,0x3f23d3cf,0x3f3fc3ea,0x3f2f0ec0,0x3f3ab4a3,0x3f71ee8e,0x3f296937,0x3f294405,0x3f5b5c34,0x3f649c54,0x3f5fdb34,0x3f4abe09,0x3f5e78ff,0x3f6544d9,0x3f5ed998,0x3f247814,0x3f1c793a,0x3f7adfa2, +0x3f2e67ef,0x3f225526,0x3f2e8d0a,0x3f15b342,0x3f1fdc38,0x3f212f5a,0x3f23f893,0x3f25d228,0x3f27fa0c,0x3f29e19c,0x3f2c42c1,0x3f2f0299,0x3f326c20,0x3f35aa75,0x3f3b7c95,0x3f363c76,0x3f33c6c4,0x3f2f2f84,0x3f2f545a,0x3f4e103a,0x3981d983,0x394cb64d,0x39305111,0x394eed56,0x396b5a84, +0x39bdc9ae,0x394ff124,0x3944acc5,0x39602b8e,0x396c84b7,0x397f2b72,0x3996ad53,0x398a7bda,0x398087d5,0x393e7438,0x395155b7,0x39671586,0x39a32141,0x399ec789,0x39a14c76,0x3999b19e,0x398a10c8,0x397efcb4,0x397085a7,0x396c42fc,0x39549e75,0x39483ed7,0x38fb38ce,0x38d86761,0x38e0c350, +0x3927a8e4,0x39482d3d,0x39369036,0x3981cbec,0x3985347a,0x3938ac93,0x395a4256,0x396bcebd,0x39714884,0x39b93a3a,0x39f2b45a,0x3a65db16,0x397e314e,0x392b7613,0x3977f351,0x399ad1c2,0x39d1502e,0x3a059538,0x39eeda0b,0x39bcc267,0x39570f8b,0x3981c7da,0x39b9b658,0x3a23ef16,0x3a2e5494, +0x3a318aa2,0x3a1c0487,0x39ff7ddc,0x39d280a4,0x39b38b3f,0x39b9046c,0x399094e0,0x398ee61c,0x38f50049,0x38d2f0fe,0x392f8a4b,0x393344e8,0x39761aed,0x3925501b,0x39b5792b,0x39a78bf5,0x3914396f,0x394b89ce,0x39c149f3,0x3a04ab01,0x39e1d8f0,0x3a024208,0x3ae46bc5,0x399faa6b,0x398e61d8, +0x39c29123,0x3a0b427c,0x3a4506ce,0x3a8f1fce,0x3a62257c,0x3a2eab94,0x399cbbbe,0x39a4370d,0x3a23985a,0x3aaab07d,0x3ab423fc,0x3aad873f,0x3a8ffe15,0x3a56d208,0x3a1c5afe,0x39ed397b,0x3a092715,0x39e61ec8,0x3a4f06c0,0x39fb63b8,0x3a04ccef,0x3a3be531,0x39690103,0x39a30de0,0x3915398e, +0x3a37d817,0x3a45e380,0x39983d28,0x39db449b,0x3a0d5983,0x3a425ce1,0x3a9856c9,0x3aff268f,0x3b91273b,0x3a318d59,0x3a6b32e1,0x3a154c58,0x3a977867,0x3ac8c67e,0x3b0d850d,0x3add282b,0x3a8ded7e,0x3a1d3810,0x3a5d9da6,0x3ac62dce,0x3b37997c,0x3b29bd95,0x3b2766f5,0x3b0ce320,0x3ad1f13b, +0x3a8de1b9,0x3a6194d4,0x3a8f2288,0x3a92e7d3,0x3b064730,0x3b151b91,0x3b27bb9a,0x3b33d518,0x3a2cc123,0x39ca126b,0x39a222bc,0x3a912b8e,0x3a8b93af,0x3a2d53f4,0x39aa33b7,0x3ab65196,0x3b0e87a1,0x3bfc207e,0x3bc1ff30,0x3b5c59f0,0x3aac8796,0x3b3b14b2,0x3b1249f4,0x3b1608e7,0x3ae3892f, +0x3b0c2f90,0x39f75d68,0x39c42bea,0x3a6af381,0x3a8e523a,0x3ac689b1,0x3b30f1f9,0x3b240d4b,0x3b0d1e07,0x3a9aec3c,0x3a4ed0be,0x3a241c08,0x3a2a13f6,0x3a28b09c,0x3a48ec00,0x3affee5f,0x3b3df8d4,0x3b5360d3,0x3b69ec4b,0x3b047eb7,0x3b26d9e4,0x3ab25465,0x3b173aaa,0x3b8c41bb,0x3c197d2d, +0x3b50fc1f,0x3b1cf7b0,0x3c554ec1,0x3c23b4fe,0x3bfed11e,0x3b6c8713,0x3b1dedab,0x3b241596,0x3ab38d3f,0x39c4deed,0x3999b725,0x3a7952a8,0x3a752ece,0x3a4cb7b4,0x39f67669,0x3a2b686a,0x3a5c990b,0x3a374828,0x3a1d91d6,0x3a3a140f,0x3a5d5e21,0x3a302c36,0x3a15e46c,0x3a35a7c2,0x3a71c1f7, +0x3a4cd8ba,0x3a380135,0x3a7c4451,0x3a8cc7ff,0x3acadce4,0x3abd0714,0x3a9f05fe,0x3b58ff9f,0x3b7f8258,0x3be3a92d,0x3c095e28,0x3b110d68,0x3b726fc1,0x3bb864e6,0x3b8eeccf,0x3b45b9f0,0x3b204c57,0x3aec7ef4,0x3a903db5,0x3a5cb450,0x3a34878e,0x39c5ac2b,0x38965f94,0x389a76a3,0x3942b2ae, +0x397abc43,0x3953a8e4,0x39d01e63,0x3a01bd05,0x393b54ce,0x39a42f3f,0x3ac77c9e,0x3a57e486,0x3a6112b6,0x3a15a9fe,0x3a4a1a32,0x3a61fe0f,0x3a4fad96,0x3a11ca30,0x3a38b44b,0x3ab09985,0x3b263a9d,0x3b4cbcb8,0x3b8b6764,0x3b2cce4e,0x3b8ec447,0x3b445b90,0x3b656f56,0x3cb8ec5b,0x3c50d20f, +0x3c2d73a0,0x3c064382,0x3ba1aff4,0x3b0e0087,0x3a8df092,0x3a98125f,0x39d7d649,0x39a1323b,0x396f6c1b,0x390cd81b,0x38f27bd7,0x397cf70b,0x39a5441f,0x3a035ee0,0x3a0151aa,0x3a0a4139,0x3a05a988,0x3a6c0284,0x3a2e48cb,0x3a42dc3d,0x3a28f965,0x3a2a4c82,0x3a395faa,0x3a4f61cb,0x3a97f7f5, +0x3aa192f0,0x3aea9da2,0x3afcd3db,0x3b0fe219,0x3b67c038,0x3b74ed68,0x3bb471c7,0x3c2c4a00,0x3ca4886b,0x3caed00b,0x3cce83a0,0x3c9e2463,0x3c777686,0x3c42b913,0x3c44e72e,0x3c044f60,0x3b36c217,0x3acda9b2,0x3a49c521,0x39c225c8,0x397310f6,0x394836af,0x39bc9f4f,0x394547ae,0x39443a5a, +0x39c1a0f9,0x3959f090,0x39802342,0x39b6e31d,0x39e573d2,0x39f3b368,0x39f0b76a,0x3a0c54e9,0x3a1c92b8,0x3a5c8ae2,0x3a8ca06d,0x3ab8c447,0x3ad560a0,0x3b16521e,0x3b58a91c,0x3bb930ec,0x3bfc21ae,0x3beadf4b,0x3c0cded3,0x3c5dc7c1,0x3c3c7418,0x3c4de89b,0x3c57653e,0x3c314bc5,0x3c187099, +0x3bff673e,0x3bf5f0a0,0x3c0657d8,0x3bdc4000,0x3ba947b6,0x3b5f3e7c,0x3b309608,0x3af6c78b,0x3aada3ab,0x3a26f946,0x39a1d239,0x39a079c1,0x39ae29c9,0x39d54338,0x39b06663,0x3a69cf5d,0x3ab8de2a,0x3aea3fc0,0x3b16be3e,0x3b2f8078,0x3b370298,0x3b847c21,0x3b8cf18d,0x3b82c712,0x3b828cfa, +0x3b8d2a8d,0x3bd56b85,0x3c068d0c,0x3c1490f6,0x3c0c5d3b,0x3c14f158,0x3bf1e4d0,0x3bf920cb,0x3be35dd9,0x3bdf64e0,0x3be6ab5d,0x3bce2eea,0x3bbb1298,0x3badba82,0x3b957ddb,0x3b8515f3,0x3b7ba9fa,0x3b3baff9,0x3b18977f,0x3af33933,0x3a9ac960,0x3a3de3cc,0x3a0ccbaf,0x39a0713e,0x39d9da67, +0x3a152029,0x3a573854,0x3aa826d8,0x3af67512,0x3b127bee,0x3b309a7b,0x3b5d5c52,0x3b83a0d9,0x3b9f6cf4,0x3bc1c278,0x3bd34f0b,0x3c0ab893,0x3c3d9e5c,0x3c1cddef,0x3c10c180,0x3c215ff0,0x3c0381f6,0x3b94c4c8,0x3b9f4368,0x3ba14431,0x3b95295e,0x3b92b242,0x3b916f03,0x3b8db043,0x3b8d0b88, +0x3b7723d8,0x3b577aac,0x3b3d3797,0x3b23b06d,0x3b0c0901,0x3aec3346,0x3ac6fbfc,0x3aa13b58,0x3a8fa927,0x3a79ddc7,0x3a7b07d2,0x3a583fbc,0x3a927f5d,0x3abd8ab2,0x3aea8d17,0x3b112675,0x3b2f9865,0x3b54a014,0x3b5a34a8,0x3b695bb1,0x3b7530d2,0x3b822b00,0x3b8350d0,0x3b91e93c,0x3b88d94f, +0x3b874ce9,0x3b87f07e,0x3b8c6b1d,0x3b69df89,0x3b6f2635,0x3b70b068,0x3b72358c,0x3b79891e,0x3b64ccd6,0x3b6739cd,0x3b6e5686,0x3b61e0ea,0x3b585090,0x3b4fc2cc,0x3b484b27,0x3b439937,0x3b3d4189,0x3b2bc80d,0x3b20abc2,0x3b2cb917,0x3b1b6d77,0x3b128402,0x3b02ecb5,0x3b13d053,0x3b1c81eb, +0x3b2964b6,0x3b337aea,0x3b3e29ae,0x3b4c4d62,0x3b50e649,0x3b58e8ae,0x3b639cd9,0x3b68adec,0x3b70e3b2,0x3b7ab15a,0x3b7392eb,0x3b6f8773,0x3b68abb2,0x3b6ab427,0x3b8a9578,0x374788b9,0x3736296e,0x370c82fb,0x36feb9d9,0x3708cb0d,0x378439de,0x36dcab14,0x36988db6,0x36e0ead7,0x367e65a8, +0x36bb60eb,0x370d7ff0,0x370921ba,0x3717be87,0x368d5d47,0x3764b17b,0x3784f10b,0x3740fb00,0x371ad03b,0x370eff93,0x370e25c3,0x3713d477,0x3740c80e,0x37a23231,0x37d43d06,0x37dfabc8,0x37d22fca,0x378a040f,0x377983fe,0x37ab3a92,0x3780d965,0x3745107f,0x3678dede,0x371fba0f,0x375f894d, +0x37c3a2af,0x376568c1,0x380c38cb,0x374a0bd7,0x370c4421,0x372d86c4,0x383cd943,0x36d720d2,0x371a9a39,0x381707b3,0x37ee8862,0x3818916c,0x38279fb4,0x37dac821,0x37d0ec29,0x3742f39c,0x382a1410,0x3838e794,0x37bb7f9a,0x378d771b,0x37bb7585,0x37f57256,0x380437df,0x385125b0,0x38d542f7, +0x3925af23,0x392fdf89,0x3908bb9d,0x386cb03f,0x37e3b9eb,0x3878ecb7,0x37f7b725,0x37c4de39,0x36e93381,0x38179574,0x387975f5,0x38ca47b4,0x386188fc,0x38578979,0x37dfa580,0x3680114a,0x37015d1f,0x38dcbaae,0x371be863,0x3806c609,0x39210a4c,0x3963ba92,0x39a50f93,0x39aca292,0x3907398c, +0x388c8d2a,0x38b68a2a,0x3893b313,0x38c898af,0x381d2cc9,0x37b06026,0x37fb883d,0x385dea79,0x38249a88,0x3870515c,0x392c20cf,0x39915f0e,0x39a00fb3,0x39981f4b,0x3908e0a2,0x38d62351,0x39555b13,0x38bcd69f,0x38611b43,0x382c63a9,0x38de18db,0x392fe078,0x395e0b9c,0x38ead151,0x3967f6c3, +0x380ae6e6,0x385e47cb,0x38c69e13,0x39c0d138,0x38a1141b,0x396ad094,0x39cb2c3d,0x39e86036,0x3a0388db,0x39732d1a,0x38daa5ac,0x38c781e2,0x38dafa48,0x3917c512,0x3962496a,0x3923cff0,0x38affced,0x394587f5,0x39a94ed2,0x39a7f395,0x39d7a10c,0x3a5a425f,0x3aaa3b34,0x3ac0fb59,0x3a9941ec, +0x39d455e9,0x38eaab38,0x39ee5033,0x38db96dc,0x38bad133,0x38fd549d,0x39ba070e,0x3a101b26,0x3a4ac561,0x39d7c154,0x3acc8401,0x3a44e3b5,0x3a5308f2,0x3a0687b1,0x3996d101,0x39dca29d,0x39f8ed64,0x3a10ea4c,0x395921af,0x37a27ef8,0x377289ed,0x390db105,0x38d52118,0x38d9b32e,0x38c3a975, +0x39637fae,0x39e3900a,0x3a0fcfde,0x3a5a012c,0x3a8c5894,0x3a9633ad,0x3a787235,0x3a6d613e,0x3a755151,0x3a9faca2,0x3ac0b9f8,0x3a731bac,0x3a9239af,0x3a9f327a,0x3a1c0a12,0x3927df33,0x39a1eabd,0x39629840,0x39ff01d6,0x3aaa0269,0x3ac5eec5,0x39e22b1e,0x39ea73e9,0x3a9108a3,0x3a0d377b, +0x3a3abe83,0x3ab31873,0x3ab87198,0x39c2f851,0x38bc3373,0x3762cfec,0x38235a48,0x38b77efc,0x388752f5,0x38608544,0x372ec65e,0x37f05574,0x3816ff26,0x3872f1ec,0x38ef6e1e,0x39980523,0x397b1b74,0x39c55053,0x39da630e,0x3a183961,0x3a2a5e6d,0x3aa0dc78,0x3aac0d1e,0x3a89800e,0x3abf62fe, +0x39a12dfb,0x398d4dd0,0x39e9485e,0x3ad48c09,0x3aca5615,0x3a99a0a2,0x3a0b2c06,0x3b2106e8,0x3c2b901f,0x3bbc2bf8,0x3b25172d,0x39f69d6a,0x38decd57,0x38c2f26d,0x38f45ab6,0x388796e0,0x37b0e79c,0x36b10422,0x375f4c18,0x3622f097,0x384c1ed2,0x38230584,0x387de3f7,0x388b7eb7,0x37da909f, +0x3814b414,0x38bd2a12,0x38cf0621,0x3942891a,0x39a0850b,0x39ea983a,0x3a052e32,0x3a4369cc,0x3a1c6e9a,0x39c753f5,0x3a91eb56,0x3ac309c3,0x3ac0e95a,0x3afa855e,0x3ac3d1bf,0x3abaa3a6,0x3af4835c,0x3a2d640e,0x3afccf5a,0x3bb12d20,0x3b2a8220,0x3b1129f9,0x3a93b3df,0x38fbc0e0,0x38ba287b, +0x38809e38,0x365481e4,0x35ca5f78,0x37028846,0x36bb855a,0x361c4724,0x36d842f9,0x35cd5e59,0x37ad5587,0x38d2f30a,0x390f9a1a,0x3935d795,0x394f045a,0x394584e6,0x39229b9e,0x394cdfb7,0x395383b4,0x398783e0,0x399ef687,0x39754dde,0x39052ff5,0x39b09493,0x3a116044,0x39fa0da3,0x3a7a3b46, +0x3a3cc203,0x3a833239,0x3a8e6d4a,0x3a571ea6,0x3a42dc5e,0x3a95556b,0x3aa7c661,0x3a664d31,0x394b45af,0x381081e2,0x37639ca2,0x38325652,0x37e1688c,0x37d5bd6d,0x379651c9,0x377611de,0x370b0abd,0x36b097bc,0x380d8246,0x38dc3983,0x39838ede,0x39aa687d,0x39c58155,0x39b60f3c,0x3986f03b, +0x3921e5e2,0x388ceb8f,0x382a96aa,0x39025ced,0x39af08a4,0x39eb978e,0x3a267881,0x3a4a006d,0x3a3c4c6c,0x3a18648b,0x39c3f623,0x399ecaae,0x3917c160,0x39873365,0x3a1e7172,0x3a05a013,0x39f19028,0x39d2316b,0x39ab9fc4,0x399620f4,0x3985da9c,0x394f4dc4,0x391db1c9,0x391ccd90,0x3909cede, +0x38bb5338,0x388cc02b,0x381bc686,0x385ee11d,0x387015ed,0x38750218,0x38735844,0x38b8c72e,0x38e2cccc,0x38c79549,0x385763d7,0x37f14468,0x37d69d66,0x3882a6c4,0x39211ffe,0x3986e93a,0x39cb9156,0x39f3f4f8,0x3a066f64,0x39eeaf6b,0x39e82374,0x39fe6dfe,0x39d2b0cc,0x39c08986,0x39dae432, +0x39f68e25,0x39842c03,0x399affda,0x3994f834,0x3998f361,0x39b4a156,0x399f1f9f,0x39868e61,0x3982eb2f,0x39504de3,0x393f6f17,0x3938d2d9,0x391b4932,0x39153ea7,0x392e9a60,0x38fc8373,0x38f4ab99,0x391b9413,0x3900282d,0x38d7aeab,0x38c09a0d,0x389fa5d9,0x38907fa7,0x389664c3,0x3879fbf6, +0x386ef742,0x3889e9e9,0x3843fda0,0x386551a0,0x38c8b4e6,0x38af296d,0x38bb1444,0x38dc2eae,0x38bd0456,0x38c5a9b7,0x390f2d58,0x394b440d,0x3938690c,0x3956dfd9,0x395e51b1,0x394aeb6f,0x395d14e4,0x3962d06e,0x39807c1b,0x398fe63d,0x3982f72f,0x396fe621,0x396662a9,0x39597710,0x39542c20, +0x395d6e3f,0x393ed611,0x39264c81,0x3915950f,0x390afc7e,0x390d7452,0x390ebff6,0x38fc8de6,0x38e00ddd,0x38c5b632,0x38b2d973,0x38a5351e,0x38a34c32,0x389d0efc,0x38a78b3f,0x38aecf8a,0x38b13208,0x38ac2155,0x38b1b81f,0x38a945bd,0x38cbe182,0x38fe5e89,0x391f5e7b,0x38cde6be,0x38d9d030, +0x38e456f6,0x38f13cb6,0x38f93093,0x38f1df73,0x38fc3f64,0x390d9bf8,0x390974c0,0x390b6654,0x390ac2b6,0x390f607c,0x39103cc6,0x39157b31,0x3906e262,0x39037cce,0x390482cb,0x3900cd5b,0x38fc5ad3,0x38fcfc22,0x38ed700b,0x38e4304d,0x38db986f,0x38d45b1c,0x38cd62e3,0x38c4db2a,0x38bc4a79, +0x38b2b94a,0x38ac71da,0x38a5f2eb,0x38a56181,0x38a4c2c7,0x38ac57c3,0x38b0d245,0x38b811a9,0x38be7912,0x390e1b4a, +}; +const uint32_t defaultHRIR_rom_EL16[HRTF_MODEL_N_SECTIONS * 470] = { +0x3ec4945b,0x3ea05421,0x3eb6f2e5,0x3eada84f,0x3eb73773,0x3ebcb8b4,0x3ec60c24,0x3eca9fef,0x3ecf62e5,0x3ec74384,0x3ec27f09,0x3ebdc130,0x3eb867d1,0x3eb3a7c3,0x3eaf61f2,0x3eab0f53,0x3ea77972,0x3ea47e0d,0x3ea1ee89,0x3e9b6e8f,0x3ea47e2c,0x3e92c354,0x3e937bb6,0x3eb4f08f,0x3e8d70bc, +0x3e8c6f85,0x3ea70010,0x3ea94bb2,0x3ea6c605,0x3ea165bc,0x3ea492f1,0x3ea6fabb,0x3ea64cbd,0x3e8fc7b7,0x3e95863e,0x3eb2a9ea,0x3e9de05b,0x3ec74c44,0x3ee37536,0x3ee9aa20,0x3eff1aa6,0x3f0ad8a4,0x3f1c936d,0x3f26c9e4,0x3f2be03a,0x3f1ec2c9,0x3f13fda6,0x3f09fee2,0x3f005d11,0x3ef00d14, +0x3ee227c6,0x3ed351fc,0x3ec7a49a,0x3ebfa224,0x3eb509ec,0x3eac1e37,0x3ea3db64,0x3e99af8b,0x3e8742f1,0x3e8046e4,0x3e6f3686,0x3e64993a,0x3e5fd649,0x3e664ea7,0x3e6c5c17,0x3e6aa54d,0x3e692716,0x3e6f15cc,0x3e71d22d,0x3e82bfdd,0x3e89d0bb,0x3e92da01,0x3eac28d1,0x3ec2ef15,0x3efa8037, +0x3f0e3d41,0x3f242323,0x3f41ae36,0x3f69a364,0x3f804455,0x3f89e4dc,0x3f71d94d,0x3f57fb68,0x3f40d7f9,0x3f2957c0,0x3f16bf46,0x3f0781eb,0x3ef00d94,0x3ed6b619,0x3ec583b2,0x3eacd550,0x3e9ef948,0x3e838948,0x3e68913d,0x3e4982b6,0x3e32b0c6,0x3e1ebfb7,0x3e120ec7,0x3e03dc69,0x3e12b9ed, +0x3e16f1f5,0x3e212727,0x3e07cd37,0x3e095183,0x3e185eea,0x3e2fc2cc,0x3e5197af,0x3e73f036,0x3e9c2e16,0x3ed22368,0x3f14cc25,0x3f2f33e5,0x3f516128,0x3f8442f9,0x3fa96495,0x3fc58523,0x3fd653f7,0x3faf0a6e,0x3f9096c0,0x3f71f4ef,0x3f49ef5c,0x3f2a2a6b,0x3f130452,0x3ef682de,0x3ed2e3fd, +0x3ebba23b,0x3e9dfa53,0x3e8938f1,0x3e5c80fd,0x3e38bfa1,0x3e098303,0x3de4a9d7,0x3db05a2c,0x3d963c68,0x3d8259a8,0x3d98f0fe,0x3dab64de,0x3db409e4,0x3d8e10a5,0x3d84f816,0x3dab8c70,0x3dd73d86,0x3e1227b4,0x3e407e17,0x3e9168e9,0x3f3e9798,0x3f6b9f95,0x3f921891,0x3fb029ea,0x3fd9dcaf, +0x3ff22a1c,0x40013d92,0x400390e3,0x400a3886,0x400ac5e1,0x3ff07e4a,0x3fe84c2e,0x3fd0c77f,0x3fb3eb8d,0x3f93445d,0x3f6d76a6,0x3f47a60b,0x3f0bb6c1,0x3edaa722,0x3e9b1f7c,0x3e6ade6e,0x3e2cb4e4,0x3e05bac2,0x3dba2ea2,0x3d9e383b,0x3d95cbd0,0x3dbf1e35,0x3dc71603,0x3dc00f63,0x3db06066, +0x3dc37332,0x3e0a8816,0x3e378052,0x3e82d33a,0x3eb321a8,0x3f0f1009,0x3f5c8572,0x3f874436,0x3faecec5,0x3fd0669f,0x400c0747,0x40196bbf,0x4023c59b,0x402083fe,0x40196f04,0x400af946,0x3fec718d,0x3fd5b50e,0x3fbdd2d1,0x3faba53f,0x3f8cd43b,0x3f65695f,0x3f3e73ad,0x3f1c9ad3,0x3f092ce6, +0x3ece9576,0x3e93cafd,0x3e4c386e,0x3e12a0fb,0x3ddb1058,0x3db24f95,0x3da0b7f0,0x3dc85e64,0x3deecfb6,0x3e17710b,0x3e08d42b,0x3e18db87,0x3e483489,0x3e6254e0,0x3e9d9422,0x3ee6eaf4,0x3f2673ea,0x3f704499,0x3fa91a67,0x3ff14ef7,0x401098c5,0x4030e1a2,0x40410530,0x40513675,0x4050f949, +0x40450a80,0x402d65f4,0x4010e8e5,0x3feae650,0x3fbb2ea8,0x3f94a6c5,0x3f6f6c04,0x3f433c29,0x3f298678,0x3f0e3fa2,0x3f0229e9,0x3edde1a2,0x3ebe64ec,0x3e9bda6e,0x3e7945e1,0x3e300d32,0x3e0e9f66,0x3e32bde5,0x3e1b3139,0x3e35e813,0x3e968330,0x3e248103,0x3e1613e4,0x3e4c60b9,0x3e7b349b, +0x3ea6b0e0,0x3ef2b6cf,0x3f1fdeb8,0x3f8145a2,0x3fb7f921,0x3ff593bb,0x4018d173,0x4042e9ab,0x404051c3,0x40440ed3,0x404dcff7,0x4046a75a,0x4035501e,0x40171824,0x4000470d,0x3fd2dc5f,0x3fa62a3c,0x3f84a7f2,0x3f4f38b1,0x3f1e890f,0x3f0b4e8e,0x3efd2994,0x3ede8c5e,0x3ec2d470,0x3ea2c997, +0x3e8c259e,0x3e597b4d,0x3e2c03e0,0x3e270715,0x3e0af510,0x3e328e1f,0x3ede2639,0x3e468ee1,0x3e2b2a40,0x3e43d377,0x3e6e8b3a,0x3e9ca0cb,0x3ee03986,0x3f28cf27,0x3f6903b4,0x3fa2db49,0x3ffad701,0x40196068,0x40251bb1,0x4028095e,0x40230cce,0x401ac5b9,0x4004b480,0x3ff64886,0x3ff120cb, +0x3fcf4260,0x3fad9375,0x3f8d4ec5,0x3f5b51b3,0x3f333bb5,0x3f1991cf,0x3f0d9d61,0x3f054d4d,0x3ef98662,0x3ed1e7b4,0x3eb3b440,0x3e95a893,0x3e764228,0x3e4fc436,0x3e3889c5,0x3e3c9a38,0x3e4c165b,0x3e925c5e,0x3e564e44,0x3e542cfa,0x3e56bdfe,0x3e8c85c1,0x3eb17e65,0x3ee913fb,0x3f21d012, +0x3f7c0a7b,0x3f8f6a6a,0x3fbd3d7b,0x3fd8239c,0x3ff00159,0x40006621,0x3ffc2816,0x3fe5ea32,0x3fcf3340,0x3fb7dc39,0x3fa333de,0x3f8a9879,0x3f71885f,0x3f56fe51,0x3f42ae5d,0x3f321a6b,0x3f239a85,0x3f269bb6,0x3f243e19,0x3f044c79,0x3f05c8a7,0x3ed932ca,0x3eb93044,0x3e9bef7d,0x3e81b70b, +0x3e63d161,0x3e663786,0x3e716a60,0x3e693e1b,0x3e7852f5,0x3e793387,0x3e7343d5,0x3e91376f,0x3eb7e0be,0x3ef20658,0x3f2753ef,0x3f6139e2,0x3f829a4c,0x3f9877d5,0x3fabfa13,0x3fc77964,0x3fc254d6,0x3fc27310,0x3fc6a5f7,0x3fb7136f,0x3faa41a1,0x3f9e7520,0x3f93d950,0x3f89622f,0x3f7cd823, +0x3f715d43,0x3f682fa5,0x3f5f43f0,0x3f4b8ad6,0x3f3b2a1d,0x3f289759,0x3f196b11,0x3f052ad8,0x3ee8c797,0x3eca938d,0x3ec6a3d1,0x3ea49b5c,0x3eb27d3f,0x3e9cd9c1,0x3eb28c3b,0x3e97d83f,0x3eb907b3,0x3eaa9f7e,0x3edbe5a4,0x3f030b9d,0x3f260f2b,0x3f388f82,0x3f83f138,0x3f66c042,0x3f6794df, +0x3f735fe2,0x3f805b06,0x3f87f36e,0x3f90a701,0x3f9adee9,0x3f957843,0x3f928399,0x3f8ee6d0,0x3f8b5260,0x3f88a98d,0x3f868563,0x3f7f9567,0x3f71516a,0x3f64fd8d,0x3f585513,0x3f4b04c1,0x3f464f80,0x3f5f9691,0x3f222e4c,0x3f1e4eea,0x3f1407da,0x3f0940b4,0x3eff2bbd,0x3f02c6ab,0x3f094bb0, +0x3f05ba73,0x3f0ba72d,0x3f099078,0x3f027902,0x3f1204a2,0x3f1f9e44,0x3f2ceb06,0x3f3af9b2,0x3f4802c4,0x3f5630f7,0x3f42f06e,0x3f4cb6be,0x3f4e416a,0x3f53fc00,0x3f57ce63,0x3f5edbf9,0x3f5a3264,0x3f58706e,0x3f567961,0x3f54cece,0x3f53152d,0x3f526f6f,0x3f4d4b0c,0x3f495853,0x3f44ccae, +0x3f42360d,0x3f39495a,0x3f4ab1b7,0x3f41ef33,0x3f519612,0x3f901f38,0x3f31295f,0x3f414e48,0x3f7dd138,0x3f814463,0x3f7bbbb3,0x3f6bcdd9,0x3f7b5a5e,0x3f7fad13,0x3f77264e,0x3f42a650,0x3f36ec96,0x3f8d1c06,0x3f59bd9c,0x3f6d4476,0x3a027555,0x39d0c1bf,0x39b02e15,0x39cd5d27,0x39dab665, +0x39bad508,0x3a05197f,0x3a016d50,0x39b6451f,0x39c7c806,0x39a7657e,0x3964b203,0x395a0e0a,0x397fb326,0x39ca12d9,0x39d55726,0x39ec54c7,0x39f01fcb,0x39ff0206,0x3a0a2c72,0x3a19f93d,0x3a225b82,0x3a213ed8,0x3a28a2a8,0x39e9d8b8,0x39d3c61f,0x39c01195,0x3a01b437,0x3a0bf8c5,0x3a17f713, +0x3a025ace,0x39f34a60,0x39e4138e,0x39c8a08a,0x39d29b8e,0x3a3e1029,0x39ee1012,0x3a403f3a,0x39f087ac,0x39e9ef40,0x39cd5f21,0x3998a87a,0x3a2585eb,0x3a31780b,0x399fcf1d,0x39f7d320,0x39b97a16,0x39c453b9,0x39466c1d,0x396faa48,0x3a0d7a9f,0x3a106fca,0x3a380c2c,0x3a304b5e,0x3a4ecba2, +0x3a7bf441,0x3a9aec6c,0x3ab09d17,0x3aaf2ec1,0x3aa8eb26,0x3a4274e7,0x3a05b0fb,0x39d713b7,0x3a3ce21f,0x3a6dc9bd,0x3a8510f4,0x3a537588,0x3a1dffb4,0x39f6d0b9,0x39b27baa,0x3a014753,0x3ae669de,0x3a74c0d5,0x3a615f57,0x3a854124,0x3a3f0fe6,0x3a5858be,0x3a1bb79c,0x3ac1cb2c,0x3ab128df, +0x39864575,0x3a2f5ab5,0x3a03803a,0x3adaeb91,0x3a80e423,0x3a7a7456,0x3ac9a2f5,0x3a65a698,0x3a889d0a,0x3a64be58,0x3a97ca19,0x3ad1fed7,0x3b0e95f7,0x3b2cc7e4,0x3b37b822,0x3b351afb,0x3aadcd4b,0x3a2d50d7,0x3a1ac5fa,0x3aadea04,0x3ae2d5c2,0x3b0d2e73,0x3ac80008,0x3a90193f,0x3a3eafa7, +0x3a1b244b,0x3a2cb1f6,0x3b64c496,0x3a81f57f,0x3b18fa21,0x3ab0d4e8,0x3a76754b,0x3a1d920f,0x3aab444d,0x3b0af2e2,0x3b0a3e15,0x3a04489a,0x3a548d61,0x3ac4e6b5,0x3bc9dbdf,0x3ba2a617,0x3b8c938d,0x3b79c280,0x3b117244,0x3b0e7748,0x3ad25c77,0x3b0522d6,0x3b47c470,0x3b8a447c,0x3ba511b9, +0x3baa98aa,0x3bbe464b,0x3b5e6fd5,0x3af0f1ff,0x3a96f601,0x3b0cf1df,0x3b5d3d65,0x3b8647ee,0x3b3e76c5,0x3b1ac587,0x3a867edc,0x3afb3629,0x3aaf7d8a,0x3c14c3e3,0x3b7bdb76,0x3c8b7f7d,0x3b8e2459,0x3b2b541e,0x3bca4d14,0x3c987a46,0x3c0c0fcf,0x3ba23780,0x3b49c91a,0x3bd255ad,0x3b93fad7, +0x3bde30fd,0x3bcff236,0x3bb5df51,0x3b74b911,0x3acaea15,0x3ab04e09,0x3aa93535,0x3aa68b64,0x3ada2e0a,0x3b21b671,0x3b8ffa25,0x3ba8de1a,0x3bbf812d,0x3b5465a9,0x3b12f7ec,0x3ae60373,0x3a19754b,0x3a45789a,0x3b8c57c2,0x3b6b7e9b,0x3b94a304,0x3b8d88fe,0x3bbbd20a,0x3b30485b,0x3be87027, +0x3c4c9d7b,0x3ca47fc8,0x3cd503e2,0x3ba25f96,0x3b927cb9,0x3c81ce65,0x3c592d65,0x3bf3774d,0x3bd5954d,0x3b1900fb,0x3b303c0d,0x3b3f0ece,0x3af43f31,0x3acfd637,0x3ab44107,0x3ac43040,0x3ae5f0fe,0x3ac760c5,0x3aa261d4,0x3ab0dba3,0x3ad8b241,0x3ab4c156,0x3a9eb407,0x3ac19766,0x3adccc29, +0x3aa9e47e,0x3a731544,0x3acc6c20,0x3af1d7f7,0x3af51784,0x3a2192d3,0x3a486a62,0x3b2cb424,0x3bbe7b0d,0x3bb25ead,0x3be2fe11,0x3c7bbef4,0x3c242edd,0x3c3f8412,0x3be5949e,0x3bde4a13,0x3bb10db2,0x3be717fd,0x3b98aed7,0x3c24a722,0x3bd90ffd,0x3bb0748b,0x3b5219ff,0x3ac43945,0x3a93ff75, +0x3ad1cacc,0x3b127c75,0x3b110cd4,0x3abfbed8,0x3af58c2e,0x3add3129,0x3b46dc71,0x3a4071be,0x39eb6b1d,0x3a9ab814,0x3a4a7b3d,0x39ee920f,0x39fa052d,0x39bd509a,0x3918f04c,0x390de729,0x3a5182f6,0x3ab302f4,0x3accc9f9,0x3b112782,0x3b6bf877,0x3bb421c4,0x3beb6a28,0x3cacde3b,0x3cd43fce, +0x3d3cdda5,0x3d34dd2b,0x3ce208db,0x3c3ab59b,0x3bf76bb4,0x3c0691f7,0x3b923b76,0x3b7b8bb6,0x3b5ca3c4,0x3b170551,0x3b1065f7,0x3abcd47c,0x3abefff3,0x3ab69178,0x3ab0ada7,0x3ae13848,0x3ab88eb0,0x3ae6c9be,0x3a80da1c,0x3a863f84,0x3a8d3968,0x3a84c461,0x3a2deeb1,0x3a09038e,0x397d4667, +0x398f398d,0x3a007b3e,0x3a1b294c,0x3a5729bf,0x3b212b4e,0x3b05fc82,0x3b8d2c55,0x3c2f5bb4,0x3c87b4f0,0x3d297d16,0x3d65b8ad,0x3d46361b,0x3cfa8570,0x3c92349a,0x3c617dbb,0x3c8334ec,0x3c665681,0x3bf445d0,0x3b9b7a81,0x3b47cb45,0x3b23d242,0x3af400af,0x3ad305cb,0x3a9cbb72,0x3a8fd9eb, +0x3a979b07,0x3a8b3020,0x3a706d08,0x3a534d34,0x3a0be25d,0x39cf476a,0x3a3589ec,0x39a90d88,0x39c462e6,0x3a451e3b,0x39cecc79,0x39e617cc,0x3a3ad2f4,0x3ad5194e,0x3b61cb99,0x3bcf3691,0x3c8eaf54,0x3ccce5d6,0x3cd196bf,0x3d000c36,0x3ce34aa1,0x3cd35f83,0x3cc5846a,0x3ca4a5de,0x3ca5719b, +0x3cb6c2c4,0x3ca4da51,0x3c725ed9,0x3c0cf553,0x3c012252,0x3c09e700,0x3c2786c8,0x3c26453c,0x3bec37f5,0x3bd261a7,0x3ba9ad89,0x3b6d7343,0x3b3c7c04,0x3aef029c,0x3a2b8372,0x3a540832,0x3a2da028,0x3a16851c,0x3a1b30fe,0x3aa0cc98,0x3b2b6099,0x3b82f363,0x3bbca790,0x3be8c2df,0x3c30097f, +0x3c65b445,0x3c85eb50,0x3c7dfa76,0x3c7d4ed2,0x3c977a93,0x3cb4a030,0x3c63238e,0x3c7d5735,0x3c7b1e32,0x3c8875fa,0x3ca6c1f8,0x3c975ddd,0x3ca54c59,0x3cca0541,0x3c96f2d5,0x3c6d368c,0x3c5d0b57,0x3c36a273,0x3c164fc7,0x3bf841a6,0x3bc53b52,0x3ba004dd,0x3b82a6ec,0x3b393101,0x3afa5a3a, +0x3ac4dae5,0x3a9e602a,0x3a64eb21,0x3aa62e40,0x3ad3695e,0x3b238c5f,0x3b769cf3,0x3b9a8f2d,0x3bbc71df,0x3bfcc7a2,0x3c03dd0c,0x3c13732b,0x3c2cc33d,0x3c391790,0x3c512c54,0x3c6c32ec,0x3c652126,0x3c258276,0x3c24b98a,0x3c19b0ae,0x3c122639,0x3c0eab86,0x3c0ef4a3,0x3c10eae4,0x3c1a1821, +0x3c0a3609,0x3c080582,0x3bff49dc,0x3bf3357b,0x3be490eb,0x3bdfd4d8,0x3bb92967,0x3b99aaad,0x3b77a11f,0x3b486b37,0x3b194a5f,0x3ae2ece0,0x3b07ba2f,0x3b080695,0x3b1ce894,0x3b2d0994,0x3b55502a,0x3b7cc064,0x3b94848c,0x3babd921,0x3bc54cc0,0x3bdf9b60,0x3c0033eb,0x3c101a89,0x3c111ec6, +0x3c136ba2,0x3c153e04,0x3c19f7d1,0x3bf69c12,0x3bfa6719,0x3bf4fda1,0x3bf68994,0x3bf4a323,0x3bfbb322,0x3c00084e,0x3c03f4d7,0x3bfe74b4,0x3bf6df93,0x3bf226e4,0x3be7b165,0x3bdfa566,0x3bdb932b,0x3bcb3689,0x3bbf0857,0x3bb3db86,0x3ba56380,0x3b9bcf81,0x3b887d1d,0x3b983233,0x3ba051e9, +0x3bb08f1c,0x3ba83513,0x3bb19b5a,0x3bc0d65c,0x3bc6e945,0x3bcb6c7b,0x3bd275b7,0x3bdab4f3,0x3be3e244,0x3bf04c43,0x3beccf6f,0x3bede248,0x3bfbd02d,0x3bf67969,0x3c11be46,0x37c468e8,0x37792a2d,0x378997c3,0x37b45bc4,0x37e354ac,0x38428da1,0x37df600e,0x37a036ed,0x36fb89fb,0x37c29d46, +0x37ff4b28,0x382950a4,0x37f78500,0x380952ba,0x3854364c,0x385e70af,0x3852b17e,0x38214934,0x37bfbb4e,0x37934f23,0x378e0817,0x378f3dec,0x379a3721,0x37bd87d0,0x3803f9f0,0x37e3db8c,0x370c29e4,0x37967e13,0x3787a948,0x378d4fdd,0x373bcc72,0x36fb9ee9,0x37630264,0x3716b68f,0x375a85d4, +0x38024ed4,0x3785ecda,0x3796f9dc,0x37cb72f1,0x3891d63e,0x38e5c659,0x394a9307,0x38f9bbfb,0x389a21f9,0x377acce6,0x38433f07,0x3877079a,0x38f51dc3,0x386a279d,0x38f61e26,0x398e4014,0x39b04800,0x39a524b2,0x3955d081,0x38d5d9a7,0x388c41a0,0x3881ca6f,0x3848d2d0,0x3812143d,0x38425198, +0x38ba4249,0x38ab6b4e,0x37c1f916,0x3851ceb4,0x385a5790,0x38a6f5f2,0x389821ac,0x38713b73,0x3899fe2e,0x379c6473,0x375902b2,0x38c00ae6,0x37b8e615,0x3716cd9d,0x385b0132,0x38dd0ec2,0x396c3f35,0x39de275a,0x39b25f98,0x3964b177,0x38b47149,0x38e203ab,0x3941725f,0x39d4cfd0,0x395b870c, +0x398d26ab,0x3a2037a1,0x3a20a524,0x3a1119ce,0x39aeb2c6,0x38ffd01f,0x38b9a415,0x38ef1065,0x388cd065,0x3843a6dd,0x389ffe32,0x394ae3e2,0x391677c0,0x39375d3d,0x390f335d,0x39883550,0x3a2c8233,0x3a25a36b,0x39e2cb1e,0x39a36ad3,0x38867b10,0x37a5680e,0x39609fdd,0x3797fe9c,0x3903f588, +0x389587ac,0x39fdd585,0x3a61502a,0x3acd2dba,0x3a8fce77,0x3a3bd5cc,0x3986d0f8,0x393b2315,0x395c68ea,0x3a6c6357,0x397e3444,0x3a67d8d9,0x3b23bcad,0x3b427050,0x3b29ed8e,0x3adc2881,0x3a618bf8,0x3a36476f,0x3a3258d2,0x39d49efa,0x39394e43,0x39acab0f,0x39e415f0,0x399bdeae,0x3962bfdf, +0x395333d6,0x39651723,0x3a033293,0x3a88ff04,0x3a6e0446,0x3a55cb34,0x39eee4ed,0x39261bd7,0x3a4535ea,0x3956ace1,0x3ad6e9fd,0x3acb2517,0x3b51d56d,0x3b4c2738,0x3b30e5f2,0x3a8c09c9,0x39f0abd7,0x3a2cd23a,0x39b29201,0x3aa0d3bf,0x3b279cfd,0x3b11aaeb,0x3afa86ff,0x3b47282f,0x3b20b1c9, +0x3af47798,0x3aec8b9c,0x3afc17f5,0x3b17cb2e,0x3b0d032e,0x3ad9add7,0x3a90c563,0x3a684f96,0x39e4725d,0x3943c43f,0x3958baf5,0x39882890,0x39adc2a9,0x37fa4a95,0x38379217,0x39ee93d5,0x3a97693f,0x3a7a4419,0x3a606910,0x3a1b9d0d,0x3a868d00,0x3b0f4166,0x3a7875b4,0x3a7247d6,0x3a91e8d4, +0x3b1cca67,0x3b54f50e,0x3b5dc9a9,0x3a725981,0x3a0d0c7d,0x3a24bb6f,0x3b3fc2e4,0x3b0cb8d7,0x3b32e1a6,0x3b2256f0,0x3aa9a98a,0x3a98a3ec,0x3a5930ca,0x3a449118,0x39fcba7e,0x3a1da065,0x39686628,0x39027462,0x3894d598,0x387e2380,0x37b2cf44,0x38eb5d70,0x390ba593,0x394d6608,0x38c8a731, +0x3806454d,0x395d42d6,0x3a433b48,0x3b3b6c25,0x3b379432,0x3ad9e974,0x3a9434a9,0x3c3cd8ef,0x3caf8910,0x3bb2627a,0x3ad80898,0x3b7b6188,0x3b47da2d,0x3b4f97ff,0x3b807dff,0x3b472cd4,0x3b4e7f3d,0x3b12f084,0x3a45b0fd,0x3a9b16ed,0x3ac43607,0x3a8545d0,0x3a6ca2d4,0x3a2271eb,0x39c7d81c, +0x39519d0d,0x393d9cf9,0x38940a98,0x385ac61b,0x3910af85,0x39006a01,0x38a79e7f,0x38cc1a75,0x36bd9e2c,0x37e087e3,0x375705a0,0x3837b320,0x3915c15c,0x3991921b,0x3943e9f8,0x3964c01d,0x3a7b6328,0x3ba667aa,0x3bab4a47,0x3c33532e,0x3b804aae,0x3adf1cb0,0x3b0fbd8c,0x3b03edd3,0x3abd0b75, +0x3afbb5dc,0x3a78a769,0x3a90e611,0x3a34a71c,0x399642e3,0x3a05d321,0x3a2bf2df,0x3a09a4ab,0x39d2caff,0x39d18b18,0x39ab3af0,0x39cfd1f1,0x39d9dc11,0x39bdfac8,0x399b4e84,0x39662a26,0x383977c9,0x3642c435,0x375e6f6d,0x369cfde8,0x373ee454,0x379e1f37,0x36693371,0x36d768df,0x38f9c59d, +0x393953fa,0x397c7054,0x3b1623d4,0x3b925827,0x3b28a8fa,0x3b1b998f,0x3aceb9d1,0x3aa2dc0c,0x3a03f15d,0x399dcae2,0x3a32af44,0x3a56944d,0x3aa57f12,0x3ac9ea5a,0x3adb5213,0x3ab06423,0x3a7708b8,0x3a34eeb1,0x398723e0,0x38b51891,0x390dba2a,0x39a23096,0x3a070b42,0x3a35a7b0,0x3a46e331, +0x3a2bc0b8,0x3a0bf19a,0x3973938d,0x389be7d6,0x3731d2ce,0x3798b8a5,0x380e5c67,0x38203ffb,0x387ad670,0x387c59ea,0x38c75aaa,0x381f10d2,0x389d88b7,0x39c73267,0x3ae7a904,0x3a56c272,0x3a74ca60,0x3a8d737a,0x3a84aaf5,0x3a6d22e5,0x3a4834b8,0x3a55207d,0x3a7ff941,0x3a687b31,0x3a6e676e, +0x3a866c3f,0x3a73ad7d,0x3a4b4422,0x3a06c92b,0x39a1f21e,0x39043187,0x38543682,0x386f138e,0x38d76782,0x3952d23e,0x3974b64d,0x394623be,0x3904fcbc,0x390686e8,0x39040713,0x38fe468b,0x38adb0e0,0x390b068b,0x393f258d,0x398e31a8,0x39a872f8,0x39a82d90,0x39e1e770,0x3a0c992c,0x3a19f3f5, +0x3a2f3723,0x3a1e6ae5,0x3a21a121,0x3a09526d,0x39cfc268,0x398f52e8,0x39456b46,0x393cd3a1,0x395c19bb,0x393a7f28,0x392e17a8,0x39472ca8,0x38e2303d,0x38c14a3f,0x3908938d,0x38ec8e59,0x38f7f760,0x3915ef43,0x3910531c,0x39236514,0x3949c983,0x395fadfb,0x3985438c,0x39a0e55b,0x39800b7a, +0x3983bfd6,0x39b5708f,0x399c1f6b,0x39a347cd,0x39c2c935,0x39cc4f62,0x39e0da4f,0x3a0e15d9,0x3a13277d,0x3a30fe3c,0x3a4a8627,0x3a29a179,0x39de04bc,0x39d6db6c,0x39b89dc5,0x399efbb4,0x397d5a6a,0x394b0c90,0x3928e9cf,0x39330a57,0x392e0b87,0x39338e4f,0x39317295,0x3929e382,0x391f03b1, +0x392511a5,0x3925cb33,0x393279e8,0x3944f356,0x395f4d9a,0x397beb0b,0x398ec85d,0x398d5bb8,0x398ba3f5,0x39975021,0x39a8a67a,0x39c21080,0x39e2b982,0x39da1f33,0x39e05f7e,0x39ed9616,0x39f820f4,0x3a07e01e,0x3a155809,0x3a045cb9,0x39e8ccbd,0x39e28512,0x39ce8963,0x396c3367,0x39638ce5, +0x39558b4e,0x3944a988,0x393c7ffd,0x393366f5,0x392dd089,0x392546ba,0x39265be5,0x392711f3,0x392daacc,0x3933f75c,0x393d8144,0x3945ebde,0x394eec50,0x39562af0,0x395dd50a,0x39669ecd,0x39702011,0x398027ce,0x397f528c,0x398253cd,0x39858602,0x398666c7,0x3989d561,0x39983866,0x39935e72, +0x3993133f,0x398f2d4d,0x39904987,0x398e9653,0x3993e986,0x39843e89,0x397e1f4e,0x397f1c63,0x39785be3,0x39929ef1, +}; +const uint32_t defaultHRIR_rom_ER16[HRTF_MODEL_N_SECTIONS * 470] = { +0x3ec4941c,0x3eadb6c0,0x3eb76ef4,0x3ea07963,0x3e9de02c,0x3eb2cba1,0x3e9535bb,0x3e8fc3a6,0x3ea64bbc,0x3ea6f21d,0x3ea480fb,0x3ea14bd4,0x3ea6af82,0x3ea94f46,0x3ea70707,0x3e8c6c06,0x3e8d2f39,0x3eb4baca,0x3e937adb,0x3e92d356,0x3ea49ca2,0x3e9b78bd,0x3ea1e6c5,0x3ea4812f,0x3ea778e4, +0x3eab0f3d,0x3eaf6201,0x3eb3a7ed,0x3eb86856,0x3ebdc0f8,0x3ec27da0,0x3ec7447a,0x3ecf6724,0x3eca9e9e,0x3ec607d0,0x3ebcbf2e,0x3eb724e5,0x3ee9bd75,0x3ee24026,0x3ec77c94,0x3eac7b3f,0x3e937f48,0x3e8a4425,0x3e82c96d,0x3e70da98,0x3e6dd277,0x3e69ebbf,0x3e6b837e,0x3e6d14ff,0x3e6673dd, +0x3e5f35db,0x3e648104,0x3e706ed3,0x3e802611,0x3e869d75,0x3e99d663,0x3ea37b33,0x3eac1de6,0x3eb517ee,0x3ebf972f,0x3ec7aa4b,0x3ed34f65,0x3ee2297f,0x3ef00bac,0x3f005cd2,0x3f09fed9,0x3f140096,0x3f1ec13d,0x3f2bd837,0x3f26c94a,0x3f1ca0b1,0x3f0aca8e,0x3eff3f59,0x3f0dcef9,0x3efc1f18, +0x3ec2e60e,0x3e9c6586,0x3e727ed6,0x3e511376,0x3e2f58bc,0x3e1937c9,0x3e09c6b3,0x3e06e3c6,0x3e20e289,0x3e16016f,0x3e12d4e0,0x3e044521,0x3e12072d,0x3e1d1c2e,0x3e32ef69,0x3e49e6da,0x3e683536,0x3e84339d,0x3e9ea0ad,0x3eaced18,0x3ec57fa7,0x3ed6b377,0x3ef01142,0x3f077f9d,0x3f16c213, +0x3f295787,0x3f40d859,0x3f57f4e8,0x3f71da1c,0x3f89f27b,0x3f804225,0x3f6990be,0x3f41b0f3,0x3f243b1c,0x3f317f6f,0x3f12e453,0x3ed32777,0x3e8f9a76,0x3e433523,0x3e11e567,0x3dd99f43,0x3daae522,0x3d84cb0b,0x3d8d4f7f,0x3db3c317,0x3daa32c0,0x3d998368,0x3d81e179,0x3d984b93,0x3db12a61, +0x3de5a3b2,0x3e09dc9a,0x3e385298,0x3e59ed9c,0x3e8a9cbc,0x3e9d2f5c,0x3ebc2334,0x3ed2a3a1,0x3ef6a2d2,0x3f12fd09,0x3f2a2c81,0x3f49ea28,0x3f720008,0x3f909284,0x3faf1ec3,0x3fd6014e,0x3fc5c76a,0x3fa92567,0x3f84ab14,0x3f5021a5,0x3f94b90d,0x3f67e8bc,0x3f3f0301,0x3f0e9606,0x3eb4a496, +0x3e821972,0x3e3781dd,0x3e0ab67b,0x3dc368d3,0x3db034ee,0x3dc00e1a,0x3dc724f7,0x3dbe9c52,0x3d97f3d5,0x3d9bb613,0x3dba5b90,0x3e04e441,0x3e2d8fd2,0x3e681c6b,0x3e961f34,0x3edf6c95,0x3f0a6934,0x3f489e21,0x3f6cfbc9,0x3f9366f3,0x3fb3d280,0x3fd0d7f8,0x3fe85575,0x3ff0634b,0x400ac5a4, +0x400a3f45,0x4003703f,0x40016e46,0x3ff1a539,0x3fdae681,0x3fae8380,0x3fb10bad,0x3f858fd3,0x3f5c795b,0x3f2212c9,0x3eed0ebc,0x3e9f3a4a,0x3e613e46,0x3e49d73f,0x3e16c87b,0x3e0a893c,0x3e157f63,0x3dee0413,0x3dca2313,0x3da0864a,0x3db4ae41,0x3dd7c358,0x3e14ee68,0x3e4e7fcc,0x3e92785c, +0x3ecdc2ba,0x3f09f63a,0x3f1c1b35,0x3f3ec989,0x3f653459,0x3f8ce8ee,0x3fab874e,0x3fbddd72,0x3fd5b5e8,0x3fec7518,0x400af96e,0x401977ef,0x40205eb3,0x4023f8cf,0x401930b8,0x400c77a5,0x3fcf1a1a,0x3ff4bcaa,0x3fa68944,0x3f7559b1,0x3f21ac54,0x3eeee3bb,0x3ea77ac9,0x3e74d732,0x3e4b7c93, +0x3e16e8ea,0x3e2477d6,0x3e983b9d,0x3e3779de,0x3e1ad52b,0x3e3259e3,0x3e0df3cb,0x3e337f3b,0x3e7725e6,0x3e9be2a2,0x3ebf04d0,0x3edd04aa,0x3f028366,0x3f0e0fca,0x3f29a396,0x3f432e41,0x3f6f7303,0x3f94a531,0x3fbb2e69,0x3feae701,0x4010e928,0x402d62e7,0x404517b8,0x4050c701,0x4051692c, +0x4040cd0f,0x40317e37,0x400f8a6d,0x3ffc3af0,0x3fb2095e,0x3f823c96,0x3f260092,0x3ee73e3c,0x3e9c4960,0x3e6cb781,0x3e488069,0x3e2b1be5,0x3e4677a2,0x3edb2f1e,0x3e2d97a1,0x3e0dfeb1,0x3e287960,0x3e2c0a41,0x3e59cb26,0x3e8d4856,0x3ea3a1d1,0x3ec1b896,0x3edc5f6e,0x3efe6747,0x3f0afce0, +0x3f1eb551,0x3f4f180b,0x3f84b251,0x3fa621e7,0x3fd2e58e,0x40004a5e,0x40171686,0x4035521f,0x4046b005,0x404da90b,0x4044335a,0x40401cec,0x404343a0,0x401788e9,0x3ffa01d1,0x3fa4cfd3,0x3f7048b3,0x3f1aa1a2,0x3ee3e6a6,0x3eb51980,0x3e87b8e6,0x3e5ad607,0x3e59bcd3,0x3e56887e,0x3e9045b9, +0x3e4d8e17,0x3e3bbd02,0x3e37b12d,0x3e4cc196,0x3e797bdc,0x3e938f54,0x3eafd6e9,0x3ed7ae37,0x3ef6e093,0x3f05f93e,0x3f0d7a46,0x3f19925c,0x3f334291,0x3f5b4be8,0x3f8d49aa,0x3fad9676,0x3fcf4a71,0x3ff11d56,0x3ff646fc,0x4004bd76,0x401aad6f,0x40231fec,0x40280423,0x4025259f,0x40195e6c, +0x3fbba031,0x3f90aec6,0x3f6c902f,0x3f282dcd,0x3ef3d5b7,0x3ebd38ff,0x3e90c488,0x3e76c721,0x3e759b49,0x3e782407,0x3e624f3e,0x3e713179,0x3e66f307,0x3e63f565,0x3e81e454,0x3e9b8cee,0x3eb491b2,0x3ed9f6af,0x3f038553,0x3f07037c,0x3f21c7d8,0x3f2734ea,0x3f236c4f,0x3f32304d,0x3f429f31, +0x3f570e9e,0x3f717daf,0x3f8a99be,0x3fa3326c,0x3fb7dc54,0x3fcf335a,0x3fe5dff9,0x3ffc2fd2,0x400078bf,0x3fefc045,0x3fd8b899,0x3f990976,0x3f8231e1,0x3f6490ba,0x3f38cf51,0x3f22ebb5,0x3f0090ae,0x3edbcabf,0x3eaa4e32,0x3eb98847,0x3e97d428,0x3eb26f3d,0x3e9c48eb,0x3eb247f4,0x3ea3b1c8, +0x3ec60de8,0x3ecbf7e3,0x3eee0494,0x3f04602e,0x3f19f41a,0x3f27770d,0x3f3ba9c6,0x3f4b8daf,0x3f5f4062,0x3f6833b9,0x3f715b43,0x3f7cd1dc,0x3f89635d,0x3f93db84,0x3f9e73c7,0x3faa42c0,0x3fb71319,0x3fc6abd1,0x3fc26bf2,0x3fc24e2f,0x3fc786f5,0x3fabd365,0x3f673659,0x3f6848c9,0x3f81ce4b, +0x3f383eeb,0x3f2ce52c,0x3f1fa07a,0x3f11e47c,0x3f01fc1c,0x3f09a4f8,0x3f0c0f6b,0x3f055fe9,0x3f093b6c,0x3f02fdd7,0x3f0053c3,0x3f09b4eb,0x3f141aae,0x3f1ea0ee,0x3f221058,0x3f5efd9c,0x3f47b0be,0x3f4aecbd,0x3f5836d7,0x3f650a25,0x3f714a58,0x3f7f98b8,0x3f8686fd,0x3f88a935,0x3f8b5131, +0x3f8ee6f9,0x3f92833c,0x3f9577b3,0x3f9adc39,0x3f90ab60,0x3f87f296,0x3f805f26,0x3f7363e7,0x3f42fc73,0x3f55092d,0x3f48545a,0x3f590cb3,0x3f8b0291,0x3f37f31a,0x3f4280b7,0x3f77230e,0x3f7fa4f2,0x3f7b9029,0x3f6bdb46,0x3f7b9d90,0x3f81473a,0x3f7ddf02,0x3f4127d9,0x3f30d2e5,0x3f910d06, +0x3f51aa97,0x3f41cdeb,0x3f49bb80,0x3f3933ee,0x3f425396,0x3f44c691,0x3f495a64,0x3f4d4b08,0x3f526e57,0x3f5315aa,0x3f54cfa0,0x3f5679dd,0x3f5870b7,0x3f5a339c,0x3f5edd18,0x3f57cca1,0x3f53fda7,0x3f4e3880,0x3f4cc8c4,0x3f6d42f8,0x3a0275b6,0x39cd5682,0x39b07af0,0x39d0bcdc,0x39ee21a9, +0x3a3e6342,0x39d2abb8,0x39c876c9,0x39e3c197,0x39f2c880,0x3a022e1a,0x3a17bee3,0x3a0ba504,0x3a01aa8b,0x39c01f9a,0x39d406f4,0x39ea90b1,0x3a28ad8d,0x3a20d0a7,0x3a2238d4,0x3a1a028d,0x3a0a2c54,0x39fefec6,0x39f0201c,0x39ec57c3,0x39d55491,0x39ca335f,0x397ff08a,0x395a37a8,0x396490a5, +0x39a7840e,0x39c7e576,0x39b63213,0x3a014f31,0x3a050069,0x39bad6c7,0x39dacd98,0x39ea25fb,0x39ef478a,0x3a40966c,0x3a74b5ce,0x3ae59896,0x3a014ee4,0x39b281ec,0x39f72643,0x3a1e8a35,0x3a540d5e,0x3a8543fb,0x3a6ede32,0x3a3cbf4f,0x39d6d15e,0x3a05a400,0x3a41158d,0x3aa8c1bc,0x3aafcf2d, +0x3ab0bdb7,0x3a9adf6b,0x3a7bec35,0x3a4ed099,0x3a304c14,0x3a3804c4,0x3a10728b,0x3a0d2ccb,0x396fd2a2,0x3946abb4,0x39c5426e,0x39b956d4,0x39f781d4,0x399fed63,0x3a31d636,0x3a25d54a,0x3998bfcc,0x39ccfd90,0x3a3f07a6,0x3a85b384,0x3a6151d4,0x3a8175cf,0x3b662e67,0x3a2b1c49,0x3a1befb6, +0x3a3e96a0,0x3a8faa81,0x3ac76c96,0x3b0d1aba,0x3ae1b6fe,0x3aae6804,0x3a1b56ce,0x3a2c796b,0x3aafc186,0x3b352b8b,0x3b37403d,0x3b2cb5d0,0x3b0e9e34,0x3ad20629,0x3a97c7fe,0x3a64b1fd,0x3a88a5b2,0x3a659a58,0x3aca3622,0x3a7a0ad3,0x3a80a761,0x3ada3b2a,0x3a038a55,0x3a2fa5a3,0x39866b84, +0x3ab0bc16,0x3ac15ff3,0x3a1b9b2a,0x3a58d718,0x3a76646b,0x3aafdd1a,0x3b187a78,0x3b7dbba7,0x3c12f382,0x3ab11671,0x3af85534,0x3a86e95a,0x3b1aafee,0x3b3efb05,0x3b865621,0x3b5d0aed,0x3b0c90f5,0x3a95df32,0x3af531dd,0x3b592301,0x3bbf3c8b,0x3bab0f06,0x3ba53d0f,0x3b8a5164,0x3b47d9f9, +0x3b051551,0x3ad286d4,0x3b0e6c82,0x3b11943f,0x3b7858aa,0x3b8cf5fe,0x3ba324f4,0x3bc96ef3,0x3ac576a2,0x3a544ddb,0x3a034fc4,0x3b0ada38,0x3b0b7dbc,0x3aaac6be,0x3a1e4bca,0x3b2bc7a6,0x3b8ead8a,0x3c8be9fb,0x3c4b9f32,0x3be743e0,0x3b31c1fd,0x3bba4920,0x3b8d2737,0x3b94e10e,0x3b6a0b50, +0x3b8d04ee,0x3a443038,0x3a18a3db,0x3ae8df7e,0x3b12d45d,0x3b52b6f2,0x3bc13588,0x3ba95353,0x3b8fa912,0x3b2287ae,0x3adae0eb,0x3aa66609,0x3aa952c0,0x3ab03a2e,0x3acb531c,0x3b732d8a,0x3bb6a636,0x3bd0bb03,0x3bdec92a,0x3b9430f2,0x3bd13f3b,0x3b496b51,0x3ba2846d,0x3c0bfb1c,0x3c98a2be, +0x3bc9f7e7,0x3ba37850,0x3cd4835f,0x3ca5ebd3,0x3c7ae80c,0x3be3f1ba,0x3bb5ca2a,0x3bb7ab20,0x3b2fbd27,0x3a44d45d,0x3a20029e,0x3af67167,0x3af0ee78,0x3acca8e1,0x3a724373,0x3aaa6f5f,0x3adef476,0x3ac10a83,0x3a9d12cc,0x3ab7cf5e,0x3ad7fecc,0x3ab0aedd,0x3aa248a4,0x3ac7e7f3,0x3ae5bcaa, +0x3ac46c16,0x3ab3b33c,0x3ad05693,0x3af4c4ae,0x3b3f7171,0x3b30bf18,0x3b18956f,0x3bd3a9dd,0x3bf3e8fd,0x3c59a2a8,0x3c81a153,0x3b922b9b,0x3be75c41,0x3c402fee,0x3c25d88b,0x3be20cfc,0x3bb03b00,0x3b6f1969,0x3b0f2814,0x3ad0d728,0x3ab38b94,0x3a46de13,0x390cab2b,0x3918d614,0x39be5c89, +0x39fb4944,0x39f089ed,0x3a4e9736,0x3a98ea2e,0x39e19d04,0x3a438ff8,0x3b46a5f2,0x3adc15be,0x3af5cf3e,0x3abff3de,0x3b1119cc,0x3b1282cb,0x3ad1891b,0x3a943cba,0x3ac49b07,0x3b51efe1,0x3bb080e2,0x3bd933a3,0x3c23ba35,0x3b992965,0x3be7ee57,0x3bb10098,0x3bdd810e,0x3d3f9cfa,0x3cce2716, +0x3cb23084,0x3c8ce20c,0x3c2ca9f4,0x3b8b016f,0x3b0a8cae,0x3b184891,0x3a5534c7,0x3a2080ff,0x39f53c0d,0x398e69ee,0x397caa09,0x3a0d785a,0x3a2d5d95,0x3a862dc2,0x3a8cd31c,0x3a86265a,0x3a832a2e,0x3ae67cf8,0x3ab7be04,0x3ae15cac,0x3ab0e24c,0x3ab68832,0x3abf169f,0x3abc5c2b,0x3b10ad4b, +0x3b172690,0x3b5cc036,0x3b7b98da,0x3b924109,0x3c061fe4,0x3bf784e2,0x3c3a25c8,0x3ce3161b,0x3d3342fc,0x3d45aab5,0x3d6567ea,0x3d2c3551,0x3d049afd,0x3ccd44f2,0x3ccf4580,0x3c8d6a61,0x3bcd246d,0x3b5fa0c3,0x3ad28efa,0x3a3e5f72,0x39e46a97,0x39cbfa33,0x3a4cfa55,0x39c72bef,0x39a9c0f1, +0x3a385b94,0x39d1c025,0x3a124d12,0x3a5487dd,0x3a6e46a4,0x3a8b611e,0x3a981a2f,0x3a8fb5b7,0x3a9ccdf5,0x3ad26a2a,0x3af430bb,0x3b23eeea,0x3b47e792,0x3b9b697c,0x3bf48b20,0x3c6561bf,0x3c83a223,0x3c61b72e,0x3c9227a1,0x3cfaa3a4,0x3cc5c34a,0x3cd25256,0x3cdaf0b0,0x3cb529cb,0x3c9aef2e, +0x3c828270,0x3c7be01d,0x3c88a6ce,0x3c630f36,0x3c300839,0x3be8b02c,0x3bbca24b,0x3b82b1c4,0x3b2c144f,0x3aa153bb,0x3a1a4d5b,0x3a1787da,0x3a2f8a7d,0x3a53dd2b,0x3a2c689d,0x3aee1f09,0x3b3c8a5b,0x3b6d7746,0x3ba9ae76,0x3bd26860,0x3bec0c2e,0x3c2666b5,0x3c27b384,0x3c09c897,0x3c012c46, +0x3c0d12ad,0x3c71a146,0x3ca52b4c,0x3cb702f4,0x3ca56e20,0x3ca47d37,0x3c7ab705,0x3c7f06c3,0x3c679276,0x3c61f2ef,0x3c66adc5,0x3c4d2bc3,0x3c392f8e,0x3c2b4384,0x3c14012e,0x3c04755a,0x3bfc810e,0x3bbcaa77,0x3b9aaeec,0x3b769272,0x3b23ac5a,0x3ad38cd2,0x3aa80843,0x3a62abb4,0x3a9d60cb, +0x3ac54a35,0x3afa1aa7,0x3b3936af,0x3b82a03b,0x3ba005c5,0x3bc53b53,0x3bf83105,0x3c165e50,0x3c36b311,0x3c5d0b3b,0x3c6d2df0,0x3c96f32b,0x3cc9f5b8,0x3ca53d41,0x3c9755c6,0x3ca6bc40,0x3c888922,0x3c19d172,0x3c240050,0x3c237704,0x3c195609,0x3c15dc89,0x3c1453b0,0x3c118b25,0x3c106b79, +0x3c004117,0x3bdf7660,0x3bc55683,0x3babd123,0x3b947988,0x3b7c9f56,0x3b5556c8,0x3b2cfcc8,0x3b1c9244,0x3b089a0e,0x3b08236c,0x3ae25616,0x3b1958bf,0x3b487999,0x3b7795e4,0x3b99abe7,0x3bb9283d,0x3bdfcf9d,0x3be48551,0x3bf32e5f,0x3bff3adf,0x3c0808f9,0x3c0a399d,0x3c1a258f,0x3c10f1a7, +0x3c0ef9f0,0x3c0eabbd,0x3c121e72,0x3bf4f394,0x3bfacfbd,0x3bf7dcc4,0x3bf73533,0x3bfb4908,0x3bedc9b3,0x3bec7cfb,0x3bf01ee4,0x3be3ce1d,0x3bdab7fe,0x3bd26f09,0x3bcb69cb,0x3bc6eb5e,0x3bc0d76f,0x3bb19828,0x3ba83b6a,0x3bb07dfa,0x3ba02f9b,0x3b981473,0x3b8882e3,0x3b9bd09d,0x3ba55f30, +0x3bb3dc79,0x3bbf08b8,0x3bcb3780,0x3bdb9666,0x3bdfaa15,0x3be7b62c,0x3bf22d75,0x3bf6def3,0x3bfe6f32,0x3c03efe6,0x3c0005c9,0x3bfbb17c,0x3bf4a5fc,0x3bf68aaa,0x3c11bd12,0x37c46a06,0x37b413e2,0x37899257,0x377918f2,0x3785bc48,0x38023cbb,0x375a6b6d,0x3716669c,0x375fb641,0x36fdd6c0, +0x373b3e50,0x378cec31,0x3787f1e7,0x3796786e,0x370b6fb2,0x37e3d614,0x38049241,0x37be30ac,0x37994c1e,0x378ebaad,0x378e1323,0x37935cef,0x37bf7d77,0x38212a8f,0x3852b690,0x385e74c8,0x38546f5b,0x38099105,0x37f7cbc7,0x3828fc4e,0x37ff973c,0x37c2a930,0x36fb0ff0,0x379fed9a,0x37df3905, +0x38428bdf,0x37e35200,0x3891f2d3,0x37cc25d1,0x3796cd9e,0x37b8f747,0x38bff1c6,0x3759d808,0x379bb5f8,0x389b2949,0x386e75a7,0x3898ca18,0x38a78be3,0x385af2bd,0x3851d42d,0x37c2cbce,0x38aba4ef,0x38b90eae,0x3840ba5d,0x38159c77,0x3849a028,0x3881dd72,0x388c23cb,0x38d62b47,0x3955ff23, +0x39a52109,0x39b04403,0x398e0c3b,0x38f5a4ef,0x3869bb16,0x38f62158,0x38768647,0x3842f8b8,0x377a346e,0x389a8158,0x38f9febe,0x394aa33f,0x38e58626,0x38dcfe50,0x385b115a,0x37179890,0x37980323,0x396190d3,0x37a6c535,0x3886af0f,0x39a2e271,0x39e3e7a2,0x3a254bf9,0x3a2c965d,0x3987b9ca, +0x390f4396,0x393717a8,0x39164dec,0x394ae6af,0x38a27a71,0x383e08fe,0x388cd848,0x38ee443e,0x38ba29e9,0x38ff2e94,0x39ae7bc1,0x3a111bf5,0x3a20a6dc,0x3a208764,0x398d5e4e,0x395bce1b,0x39d41b9e,0x3941baf3,0x38e2c3f0,0x38b5c9a0,0x39641b01,0x39b21823,0x39de1606,0x396c7176,0x39fbdba4, +0x389af8a7,0x3902870d,0x39577246,0x3a430991,0x392544ac,0x39efb1bf,0x3a5699c3,0x3a6f44bf,0x3a87fae1,0x3a026fd6,0x39652654,0x39524698,0x3966ff9d,0x399b693b,0x39e32cfe,0x39ab656d,0x3940b8f1,0x39d3cc7b,0x3a336101,0x3a35b310,0x3a61ebe6,0x3adc6f4b,0x3b29e87b,0x3b427757,0x3b2340d4, +0x3a67c3e2,0x397dabdf,0x3a6c4892,0x395d2292,0x393a5d52,0x3985b1dc,0x3a3c32fb,0x3a9018a4,0x3acd2fa7,0x3a61580b,0x3b51439f,0x3acb9fb8,0x3ad70cd3,0x3a8675f9,0x3a1dc301,0x3a5ffc49,0x3a795e4a,0x3a97abf3,0x39eea77f,0x3834fdf0,0x37f47c3c,0x39ad45f1,0x39861361,0x395cab69,0x39442b47, +0x39e42af5,0x3a67fbeb,0x3a90ad6f,0x3ada6ae8,0x3b0ca817,0x3b1814a4,0x3afb650e,0x3aed6f07,0x3af43469,0x3b20e982,0x3b45f21f,0x3afb6cbf,0x3b123457,0x3b27d741,0x3aa0d5f7,0x39b301e8,0x3a2b4f5c,0x39f16672,0x3a8c2bdf,0x3b30f4ba,0x3b4bf248,0x3a72f26e,0x3a7591b6,0x3b10f00a,0x3a92589f, +0x3ad578db,0x3b39afc9,0x3b38b60c,0x3a45e036,0x3958ab27,0x380588b0,0x38cadbd8,0x394d64b2,0x390a0e43,0x38e96d94,0x37b300c8,0x38707599,0x3898022c,0x38fa24bd,0x39750110,0x3a1d25e9,0x39fbc2f6,0x3a44b968,0x3a5962dc,0x3a98b6c6,0x3aa9cdb5,0x3b21515e,0x3b338f8c,0x3b0d2b95,0x3b3fb0da, +0x3a24cb5d,0x3a0d2f1c,0x3a70dde6,0x3b5e9fc2,0x3b55d7e5,0x3b1c9e55,0x3a924196,0x3bb313dc,0x3caf395f,0x3c3ce497,0x3ba540bd,0x3a789959,0x39638081,0x3943417c,0x399291c0,0x39172aa8,0x3835d7ce,0x375c01dc,0x37de4f9d,0x36c46d0e,0x38ce73b5,0x38a6cb88,0x38fdc3e5,0x390ecdaf,0x385c33fd, +0x38947963,0x393d1292,0x3951430e,0x39c7e31c,0x3a229736,0x3a6c915c,0x3a856877,0x3ac32c73,0x3a9bb3d2,0x3a467148,0x3b12915d,0x3b4f73fe,0x3b46bf35,0x3b7f4275,0x3b501f9f,0x3b47d64a,0x3b7b7587,0x3ad7199f,0x3b818067,0x3c328d3d,0x3bab6607,0x3b91a438,0x3b15db9e,0x397cd815,0x393a622f, +0x390126e1,0x36d7c6d6,0x3670bac7,0x37a2a80f,0x3740da9e,0x369d0559,0x37651b47,0x364afcb5,0x3835c839,0x39623923,0x399bdfcc,0x39c193dd,0x39d9b23e,0x39d02630,0x39aac7ba,0x39d2512b,0x39d2964d,0x3a09b3f6,0x3a2b663a,0x3a060688,0x39964ae7,0x3a34a799,0x3a91007c,0x3a7917aa,0x3af9ab36, +0x3abdc2ad,0x3b04233b,0x3b0fca5d,0x3addfd61,0x3acdf600,0x3b1afd16,0x3b2929ae,0x3ae646a6,0x39cb5a7a,0x389dafd2,0x3819d063,0x38c0b8e3,0x38820748,0x38774511,0x38215cca,0x380d423e,0x379a4a94,0x372e0c23,0x38a06ab4,0x3974da47,0x3a092688,0x3a2ecad8,0x3a46f04c,0x3a35df3b,0x3a06b1be, +0x39a24ad2,0x390de179,0x38b523bc,0x39875c0b,0x3a346613,0x3a774c78,0x3ab06358,0x3adb58f9,0x3ac9fc35,0x3aa593ed,0x3a564f24,0x3a333833,0x399e1b6a,0x3a042d18,0x3aa2adc3,0x3a8cf949,0x3a759eaa,0x3a53ea4e,0x3a2e54bb,0x3a1b6246,0x3a0e3672,0x39e1eac5,0x39a92d09,0x39a7b804,0x398f4686, +0x393dced8,0x390cf1e3,0x38a995e6,0x38fe8764,0x390411e0,0x3904b83e,0x390155bf,0x394909ae,0x3971f7a2,0x39507a2f,0x38d96306,0x386d97ab,0x3854f1ca,0x39043bad,0x39a1f947,0x3a06b61c,0x3a4b59dc,0x3a73db89,0x3a865696,0x3a6e9451,0x3a687c0f,0x3a7f8744,0x3a554cbf,0x3a482a8c,0x3a6d1ed6, +0x3a84b967,0x3a08eb1e,0x3a22a7b6,0x3a1ea291,0x3a25c88e,0x3a47bd6f,0x3a2fa15a,0x3a136da9,0x3a0d4cd4,0x39e194c8,0x39cd33b0,0x39c2b2d2,0x39a3bbe8,0x399c100d,0x39b5ed9b,0x3983eb6b,0x398082c7,0x39a1a69c,0x39851918,0x395f63d1,0x3949d9fa,0x392357b0,0x391054b4,0x3915d0f8,0x38f7f796, +0x38ec8da5,0x390898d7,0x38c1241a,0x38e2270f,0x3947013d,0x392e1b9a,0x393a85d2,0x395c0437,0x393cda41,0x3945621d,0x398f56bd,0x39cfba07,0x39b863b2,0x39d7a464,0x39df303a,0x39cdad6e,0x39e06d96,0x39e74c36,0x3a043732,0x3a152f6f,0x3a07d87e,0x39f84319,0x39ed84b8,0x39e05140,0x39da2f9b, +0x39e24fcc,0x39c1d6a6,0x39a83e07,0x3996a679,0x398b8371,0x398d3c2a,0x398ea37f,0x397bf81b,0x395f515c,0x39450013,0x39327ccd,0x3925c7f7,0x3925142f,0x391efb66,0x3929deb3,0x39316244,0x39338420,0x392e0a97,0x39332ab1,0x3928e28c,0x394af7d1,0x397d6541,0x399ef918,0x39558eb7,0x396379fe, +0x396c4c3c,0x397920b2,0x39802e0c,0x397ed4aa,0x398463b9,0x3993fc95,0x398e9ec8,0x39903fbf,0x398f3192,0x399314d8,0x39936179,0x3998529c,0x3989ef72,0x398693a3,0x3985cc4a,0x39826868,0x397f4ea8,0x39802805,0x39701d8b,0x39669ce2,0x395dd18c,0x395629c0,0x394eee88,0x3945ee30,0x393d83cf, +0x3933fa02,0x392db0b4,0x39271386,0x39265737,0x39253cfa,0x392dce3c,0x39336a79,0x393c7fe4,0x3944b0c9,0x39929d53, +}; +const uint32_t defaultHRIR_rom_ITD_W[658] = { +0xb58b2818,0x3bdea435,0xbef12e52,0xbdeb5ab7,0x3dab4e66,0x3f042e6d,0xbf409841,0xbe91c05f,0xbd4540cb,0x3ee4982c,0xbe4f34d7,0xbf3c944d,0xbf5f4288,0xbe93aac2,0xbe41b919,0xbf30a7bb,0xbf8323e1,0x3ebe1f75,0xbebaee5e,0xbe7b161f,0xbf02cc15,0x3b313b38,0x3f0434ee,0x3e8240b5,0x3ec41384, +0xbebd76c6,0x3f817fba,0x3f2f49e6,0x3e3d1acf,0x3e95178f,0x3f5ba8c7,0x3f366b13,0x3e4c380a,0xbed1f70f,0x3da000be,0x3e8ed0a6,0x3f3c34bd,0xbf08b389,0xbd9e0cca,0x3e05095b,0x3ef1ac80,0x3da7646f,0xbcd0576f,0x3e83e76e,0x3f870465,0xbf1894ad,0xbf475073,0xbff88503,0xc0368ecb,0xc03cf196, +0xc072281a,0xc0177033,0xbfe11f51,0xbfa3dc3f,0xc01c4557,0xc036030a,0xc0057814,0xbfb60610,0xbef03ace,0x3e105793,0x3fa28542,0x3e9390c2,0xbba00d1b,0xbe99f207,0xbfa3a0da,0xbe329ba0,0x3eef141d,0x3fb9604c,0x40058f0e,0x4036eac0,0x401b7835,0x3fa743f6,0x3fe5dc68,0x401807dc,0x406e3515, +0x40399f8f,0x4037b7c7,0x3ffabd23,0x3f51dc1c,0x3f11a8f6,0xbf868061,0xbea0be67,0x3e09ea72,0x3cb8fdf8,0x3d41b101,0xbfb65ff8,0xc03bf299,0xc073eb6a,0xc09e3e70,0xc0c35434,0xc10268f5,0xc0f009f8,0xc118ddc8,0xc11dbb79,0xc12f3e4a,0xc10f9075,0xc10e9eca,0xc0d71c87,0xc0c2d2c4,0xc09c2687, +0xc0576d3e,0xc0055163,0x3e82debc,0x3badfac7,0xbe6eaf52,0x40053d26,0x405a59a1,0x409c4343,0x40c19a0e,0x40d7610f,0x410e34f6,0x410ff7f9,0x412ea206,0x411d1d19,0x4118a0f1,0x40f2541a,0x41037e4c,0x40c22d26,0x409e4443,0x406f3393,0x40402602,0x3faf849f,0x3d8b554d,0xbe2c2ebf,0x3d948941, +0x3d2231a9,0xbf6e5daa,0xc0336e2e,0xc0a8eb01,0xc0fc02f9,0xc123b49c,0xc1402f1e,0xc1584796,0xc15dae2a,0xc158ed3f,0xc149806f,0xc13ee4d9,0xc14acf5b,0xc1201682,0xc0f44e3f,0xc0b1b00b,0xc0115e20,0xbf4ec420,0x3e806a7f,0xbba98019,0xbea22a89,0x3f5828ad,0x400b10a9,0x40b15dfc,0x40f70caf, +0x411f85c0,0x414bc624,0x413ddd2b,0x414ad6e9,0x4159d274,0x415e32eb,0x41565a70,0x413e20ab,0x4125001d,0x40fb332d,0x40ad4c24,0x402d2626,0x3f6e2f39,0x3d22a1eb,0xbf0868cd,0x3e484687,0xbebe35a1,0xc06a13bd,0xc0d1fb34,0xc116a96b,0xc13b9278,0xc16a85d2,0xc18a84f9,0xc194d83a,0xc1a6d552, +0xc1c7a9f8,0xc1bec1da,0xc1affb6c,0xc18bd4cb,0xc17b5d4b,0xc1594c14,0xc11b7ad0,0xc0ead5ac,0xc051caf1,0xbefed7d9,0xbc244ad5,0x3f3f4031,0x4043f176,0x40f41469,0x411c273a,0x415524f7,0x417d97f6,0x418a8f88,0x41b18d8e,0x41bccb0a,0x41c6e201,0x41a66b18,0x419649f6,0x418d6aba,0x4165f40e, +0x413f593f,0x410e8ffc,0x40e376c9,0x40423d2f,0x3f93fd14,0xbefadb88,0x3dcb74bb,0xbec4bafe,0xc0491930,0xc0bc64c1,0xc106cd5e,0xc13c55d7,0xc16ec205,0xc187c9a9,0xc199add6,0xc1aa80fe,0xc1c2e324,0xc1c28229,0xc1b6c418,0xc18fbdd3,0xc182cf78,0xc150c967,0xc11cbea1,0xc0c60d2f,0xc058d77d, +0xbdc696c7,0xbd4c91cf,0x3eedfc3c,0x4031efb9,0x40cd1379,0x4120a93a,0x414cc239,0x4182992c,0x4192e331,0x41b58a74,0x41c31486,0x41c4d3b1,0x41a850fe,0x419ac62d,0x4184c65a,0x4174490f,0x413cbea7,0x410dcc8e,0x40b67855,0x403c05d2,0x3f7658b4,0xbf12b170,0x3e4d00d6,0xbec4afc0,0xc06b2ece, +0xc0db7ea0,0xc1366ced,0xc16883c8,0xc19132b1,0xc1a9c0c3,0xc1bcd9d1,0xc1cda911,0xc1ead274,0xc1ddb75c,0xc1cb6e86,0xc19d6762,0xc19531ac,0xc16f7c4a,0xc13eab02,0xc0f1f9e0,0xc06610ae,0xbede93fc,0x3c7f6440,0x3ee43583,0x407af194,0x40e9b99a,0x413e780f,0x4176828b,0x41930777,0x419c4ac4, +0x41cd0134,0x41dd1356,0x41ea55b3,0x41d18157,0x41bb5d6b,0x41ada31f,0x418cbf5a,0x416f064f,0x412d45a3,0x40f0a04b,0x404c67aa,0x3f408590,0xbec391cb,0x3e8888bc,0xbf1a79c5,0xc05ebdb7,0xc0f607be,0xc1376ab7,0xc17a861c,0xc19a2949,0xc1ac49c4,0xc1ca1345,0xc1e389da,0xc202fc1c,0xc1f2d133, +0xc1da81c3,0xc1a937de,0xc19a64bc,0xc181e5bd,0xc13f25b2,0xc0f058b5,0xc060eabd,0xbf2b5a81,0xba97a4f2,0x3f44d227,0x4055392b,0x40f773bc,0x413f88c9,0x417eb54b,0x419eae8b,0x41a6cda5,0x41da352c,0x41f44fef,0x42021d12,0x41e2bc75,0x41c772b8,0x41ac3195,0x4198b8e9,0x417e4a9c,0x41361918, +0x40efad91,0x405dd351,0x3f4fa137,0xbefadd76,0x3e303dab,0xbeff1d70,0xc03e6e76,0xc0e27315,0xc1311d28,0xc17deb9b,0xc192720f,0xc1b2f6f4,0xc1ceaf1d,0xc1f0fd0c,0xc207f214,0xc1f6eec5,0xc1e1a91c,0xc1abfec2,0xc1a44555,0xc1823b56,0xc14a7926,0xc0e25e7e,0xc05ac922,0xbd53612f,0x3c2063f0, +0x3e114bae,0x406ce829,0x40da5dbe,0x414b1b36,0x41815591,0x41a0fd1c,0x41add2b7,0x41dff175,0x41f72558,0x42095887,0x41ed60fe,0x41d4ce6e,0x41adef88,0x4193a66a,0x41796b04,0x412fda46,0x40f0593d,0x40326178,0x3f7ca8fa,0xbf0506d6,0x3e5225ca,0xbefe77da,0xc04bdfe8,0xc0e0684d,0xc12401df, +0xc16567c4,0xc194598d,0xc1a6f4b2,0xc1c6b039,0xc1da7a34,0xc1fee55c,0xc1dda00b,0xc1c98614,0xc1ac4d3e,0xc19b50f8,0xc17b2795,0xc13946e7,0xc0ec60db,0xc02fd19e,0xbf4c5a0b,0x3c86e034,0x3f4506d7,0x4021303e,0x40ea933b,0x413ae8c1,0x417beacd,0x419e0996,0x41aacc01,0x41ce87c1,0x41da0f56, +0x41fe759f,0x41dd0d97,0x41c3e8b2,0x41ae3f9f,0x418fa3ac,0x416c6c0e,0x41234cb3,0x40d84ed7,0x402e6c9a,0x3f99953b,0xbf2db5c2,0x3e17f13b,0xbf103fd9,0xc032008a,0xc0b468e4,0xc124c695,0xc14c9e19,0xc18465dd,0xc1a47806,0xc1b65293,0xc1cc1f4f,0xc1d2578c,0xc1cc171a,0xc1bd3051,0xc1a4d02f, +0xc18cd9aa,0xc15e907c,0xc127a8e9,0xc0ba5e7f,0xc00619d9,0xbe95b48e,0xbd76d1d9,0x3f4c2ee9,0x40097cd0,0x40c30eef,0x4123bd6c,0x41608b2f,0x418cb178,0x41a84a69,0x41b7e3c8,0x41d0292d,0x41d0a163,0x41ca86d6,0x41ba7cb3,0x419e40f7,0x4185c880,0x414b4303,0x411b404e,0x40c8c7b8,0x403be377, +0x3f1e4cc8,0xbe656d64,0x3e72b440,0xbf498fe9,0xbfc563a2,0xc0a0aea5,0xc0f19ec6,0xc1328cb9,0xc1662568,0xc1814e66,0xc1936ff3,0xc19dd5da,0xc1a9041a,0xc19db580,0xc19591c4,0xc182adae,0xc1690c64,0xc136b991,0xc109ab08,0xc08bbbb9,0xbfdeeee1,0xbeb0938a,0x3db07eb9,0xbe9599ba,0x3fe00334, +0x4092181a,0x4102c698,0x41362901,0x4169e62a,0x417fdcdf,0x4198b33f,0x419b4fbe,0x41aa4978,0x419e1480,0x41908af3,0x418646ff,0x4160a358,0x413a7e76,0x40fd5ee2,0x40a726de,0x3fa54a05,0x3f080a3f,0xbe884f05,0x3db5c83b,0x3ddc1bda,0xbffb2bd5,0xc06a1ed8,0xc0c79899,0xc102accb,0xc1260d18, +0xc148b4a3,0xc15994e2,0xc1655362,0xc178e08b,0xc16ab2d9,0xc1575d67,0xc154f16e,0xc1285272,0xc10ab3de,0xc0c76b66,0xc07386d5,0xbfcc78a1,0x3e2350e6,0xbc2c411e,0x3d8c9b9a,0x3fd193a9,0x406e8c02,0x40cce933,0x410af747,0x412834e2,0x41571b62,0x4154b953,0x416caa7a,0x4177b6da,0x416547bc, +0x415ae1f3,0x4145145d,0x41277121,0x40ffc8b4,0x40c02b58,0x406ab1ee,0x3ff80d26,0x3e8e90b7,0xbf1672ce,0x3b560fa6,0x3da4d277,0xbf600a9c,0xc017f206,0xc050626a,0xc09815f0,0xc0c02960,0xc0fb401c,0xc0ee243d,0xc1140ffc,0xc10acac2,0xc11b2f18,0xc1012a32,0xc1084e02,0xc0cce087,0xc0b04131, +0xc08d10aa,0xc01e66a0,0xbfcca653,0x3ea47efb,0xbb2a6bf3,0xbedb3309,0x3fc88c0b,0x4020946f,0x408a5261,0x40afdbce,0x40ccb7fb,0x410753ad,0x41026313,0x411a5387,0x410b521e,0x411416a5,0x40ed5519,0x40fec8fb,0x40bf36e4,0x409b36b0,0x40581198,0x4019e4b3,0x3f4945b6,0xbdb16dfe,0xbe18f38a, +0xbc3f4b47,0x3e31e305,0x3f223f24,0xbf908181,0xbf9f9ba9,0xc0082545,0xc03d210a,0xc04c4486,0xc0767961,0xc02a5b92,0xc0318818,0xc0195e4b,0xc04ea657,0xc04d4c8b,0xc018c8be,0xbff32a7c,0xbf70b388,0xbf1b7a6a,0x3f569f48,0x3e586f06,0x3be4cbbc,0xbe0b9c3b,0xbf4f4eee,0x3f171168,0x3f803a93, +0x3ff51d26,0x40197f17,0x404fa9f2,0x404bb200,0x401b31bf,0x40304f4d,0x402a4aff,0x4076deb1,0x40477666,0x403d5b3e,0x40036b64,0x3f91a31f,0x3f8e43da,0xbf12aa6e,0xbe243012,0x3e1f1af8,0x3b474372,0xbeb76881,0x3dd787d4,0x3ee10b6c,0x3f4dd46f,0xbf1fb182,0xbe50f566,0x3da88563,0x3f0178e5, +0x3c678a1c,0xbdeb0ba5,0xbe2218a5,0x3e58dcde,0x3d71aaa0,0xbef80fb9,0xbf3d07e1,0x3f3485be,0x3db783c0,0x3c142933,0xbed36b04,0xbb9f1f49,0x3ebfdc23,0xbcc7652e,0xbdb4e6cd,0xbf3be092,0x3f399c4e,0x3ef2eb6a,0xbd93a618,0xbe480d88,0x3e1bd187,0x3df79a5d,0xbc53f8d6,0xbf002186,0xbd41bc42, +0x3e5c0f28,0x3f2ad402,0xbf3cc2c3,0xbedc59d1,0xbe021816,0x3ea43429,0x3d349309,0xbab986b3, + }; +const uint32_t defaultHRIR_rom_ITD_azimBsShape[84] = { +0x3f800000,0x3f3a9fbe,0x3f03126f,0x3eaf9db2,0x3e5d2f1b,0x3e000000,0x3d83126f,0x3cdd2f1b,0x3c03126f,0x3a83126f,0xa5800000,0x00000000,0x3e8374bc,0x3ede353f,0x3f0ad0e5,0x3f178d50,0x3f180000,0x3f0ed917,0x3efd9168,0x3ed4fdf4,0x3ea95810,0x3e800000,0x3e3a9fbe,0x3e03126f,0x3daf9db2, +0x3d5d2f1b,0x3d000000,0x3c83126f,0x3bdd2f1b,0x3b03126f,0x3983126f,0xa6000000,0x00000000,0x3c66bdc8,0x3d57b901,0x3de1cac1,0x3e39af72,0x3e855555,0x3eaf1aa0,0x3ed756b3,0x3efb38a9,0x3f0bf7cf,0x3f155555,0x3f18aec3,0x3f16872b,0x3f0fc3ed,0x3f054a69,0x3ef00000,0x3ed19423,0x3eb11bfd, +0x3e90624e,0x3e6263ab,0x3e2aaaab,0x3df8d4fe,0x3daec33e,0x3d6a2798,0x3d1374bc,0x3caaaaab,0x3c2ec33e,0x3b9374bc,0x3aaec33e,0x392ec33e,0xa6800000,0x00000000,0x392ec33e,0x3aaec33e,0x3b9374bc,0x3c2ec33e,0x3caaaaab,0x3d1374bc,0x3d6a2798,0x3daec33e,0x3df8d4fe,0x3e2aaaab,0x3e627984, +0x3e90b9af,0x3eb242e7,0x3ed44f30,0x3ef55555,0x3f09e60f,0x3f17152a,0x3f21735f,0x3f283c13,0x3f2aaaab, +}; +const float defaultHRIR_rom_ITD_azimKSeq[19] = { + 0.000000f, 10.000000f, 20.000000f, 30.000000f, 40.000000f, 50.000000f, 60.000000f, 70.000000f, 80.000000f, 90.000000f, 100.000000f, 110.000000f, 120.000000f, 130.000000f, 140.000000f, 150.000000f, 160.000000f, 170.000000f, 180.000000f, +}; +const uint32_t defaultHRIR_rom_ITD_elevBsShape[28] = { +0x3f800000,0x3e97b426,0x3d17b426,0x00000000,0x00000000,0x3f1097b4,0x3f04bda1,0x3e800000,0x3d97b426,0x3c17b426,0x00000000,0x00000000,0x3e07e6b7,0x3eca4588,0x3f155555,0x3f0ca458,0x3ebc0ca4,0x3e2aaaab,0x3d4a4588,0x3bca4588,0x00000000,0x00000000,0x3bca4588,0x3d4a4588,0x3e2aaaab, +0x3ebda12f,0x3f12f685,0x3f2aaaab, +}; +const float defaultHRIR_rom_ITD_elevKSeq[16] = { +-90.000000f, -78.000000f, -66.000000f, -54.000000f, -42.000000f, -30.000000f, -18.000000f, -6.000000f, 6.000000f, 18.000000f, 30.000000f, 42.000000f, 54.000000f, 66.000000f, 78.000000f, 90.000000f, +}; + +#undef WMC_TOOL_SKIP + +/* clang-format on */ diff --git a/lib_rend/ivas_rom_TdBinauralRenderer.h b/lib_rend/ivas_rom_TdBinauralRenderer.h new file mode 100644 index 0000000000000000000000000000000000000000..8e113b040626d057e0cb5902fa40c61bb3963e73 --- /dev/null +++ b/lib_rend/ivas_rom_TdBinauralRenderer.h @@ -0,0 +1,68 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "cnst.h" +#include "ivas_cnst.h" + +/*------------------------------------------------------------------------- + * TD Binaural rendering related ROM tables + *------------------------------------------------------------------------*/ +/* TD renderer default HRIR model */ +extern const float defaultHRIR_rom_latency_s; +extern const int16_t defaultHRIR_rom_azimDim2[15]; +extern const int16_t defaultHRIR_rom_azimDim3[15]; +extern const int16_t defaultHRIR_rom_azim_start_idx[15]; +extern const int16_t defaultHRIR_rom_azimSegSamples[1]; +extern const int16_t defaultHRIR_rom_azimShapeIdx[15]; +extern const int16_t defaultHRIR_rom_azimShapeSampFactor[15]; +extern const float defaultHRIR_rom_elevKSeq[13]; +extern const uint32_t defaultHRIR_rom_AlphaL48[470 * 128]; +extern const uint32_t defaultHRIR_rom_AlphaR48[470 * 128]; +extern const uint32_t defaultHRIR_rom_AlphaL32[470 * 86]; +extern const uint32_t defaultHRIR_rom_AlphaR32[470 * 86]; +extern const uint32_t defaultHRIR_rom_AlphaL16[470 * 43]; +extern const uint32_t defaultHRIR_rom_AlphaR16[470 * 43]; +extern const uint32_t defaultHRIR_rom_EL48[HRTF_MODEL_N_SECTIONS * 470]; +extern const uint32_t defaultHRIR_rom_ER48[HRTF_MODEL_N_SECTIONS * 470]; +extern const uint32_t defaultHRIR_rom_EL32[HRTF_MODEL_N_SECTIONS * 470]; +extern const uint32_t defaultHRIR_rom_ER32[HRTF_MODEL_N_SECTIONS * 470]; +extern const uint32_t defaultHRIR_rom_EL16[HRTF_MODEL_N_SECTIONS * 470]; +extern const uint32_t defaultHRIR_rom_ER16[HRTF_MODEL_N_SECTIONS * 470]; +extern const uint32_t defaultHRIR_rom_elevBsShape[36]; +extern const uint32_t defaultHRIR_rom_azimBsShape[21]; +extern const uint32_t defaultHRIR_rom_ITD_W[658]; +extern const uint32_t defaultHRIR_rom_ITD_azimBsShape[84]; +extern const float defaultHRIR_rom_ITD_azimKSeq[19]; +extern const uint32_t defaultHRIR_rom_ITD_elevBsShape[28]; +extern const float defaultHRIR_rom_ITD_elevKSeq[16]; diff --git a/lib_rend/ivas_rom_binauralRenderer.c b/lib_rend/ivas_rom_binauralRenderer.c new file mode 100644 index 0000000000000000000000000000000000000000..cc77cc46c4c8199883d3284272a8c698c2011c4d --- /dev/null +++ b/lib_rend/ivas_rom_binauralRenderer.c @@ -0,0 +1,47523 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "cnst.h" +#include "ivas_cnst.h" +#include "wmc_auto.h" + +/* clang-format off */ + +#define WMC_TOOL_SKIP + +/*------------------------------------------------------------------------- + * Binaural rendering related ROM tables + *------------------------------------------------------------------------*/ + +/* Binaural rendering data set based on HRIRs */ +/* Tables generated by the script at "scripts/binauralRenderer_interface/run_generate_IVAS_tables.m */ +/* Can be replaced by your own generated HRIR tables */ +/* + * Generated with Matlab version 9.3.0.713579 (R2017b) by MUXE6256 +*/ + + + +const float FASTCONV_HOA3_latency_s = 0.000020833f; +const float leftHRIRReal_HOA3[BINAURAL_CONVBANDS][HOA3_CHANNELS][BINAURAL_NTAPS_SBA]= +{ + { + {+0.353305f, +0.566845f, +0.200116f}, + {+0.451504f, -0.563006f, +0.083565f}, + {+0.022092f, +0.111945f, -0.003135f}, + {+0.047133f, +0.000194f, -0.000386f}, + {+0.039375f, -0.036049f, -0.015307f}, + {+0.013502f, -0.004406f, +0.016833f}, + {-0.050267f, +0.058356f, +0.017434f}, + {-0.013681f, +0.080836f, -0.019699f}, + {-0.037136f, +0.024371f, +0.052200f}, + {+0.050122f, -0.078803f, -0.019790f}, + {-0.004565f, +0.007656f, -0.001338f}, + {+0.009821f, -0.051585f, -0.003219f}, + {-0.003833f, -0.023411f, -0.003160f}, + {+0.007736f, -0.042621f, +0.010291f}, + {+0.014210f, -0.003392f, -0.001270f}, + {-0.005609f, +0.001063f, +0.001854f} + }, + { + {+0.011160f, -0.509237f, -0.132176f}, + {+0.142996f, -0.819544f, +0.093135f}, + {+0.003358f, +0.077333f, -0.008548f}, + {+0.004495f, +0.024167f, +0.025614f}, + {+0.020911f, +0.057490f, +0.024558f}, + {+0.020938f, +0.024631f, +0.022840f}, + {-0.049990f, -0.113634f, -0.053590f}, + {+0.010020f, +0.210234f, +0.026992f}, + {-0.094579f, -0.407023f, -0.103353f}, + {+0.038956f, +0.088489f, +0.058039f}, + {+0.002875f, +0.015645f, -0.000778f}, + {+0.020714f, +0.104784f, +0.070444f}, + {-0.008794f, +0.002924f, +0.009615f}, + {+0.004361f, -0.056762f, +0.007070f}, + {+0.010128f, +0.073116f, +0.035032f}, + {-0.005641f, -0.006012f, -0.000245f} + }, + { + {-0.192410f, -0.206164f, -0.191132f}, + {-0.278956f, +0.236216f, -0.253095f}, + {-0.002616f, +0.068222f, +0.000710f}, + {-0.043976f, +0.107663f, +0.006000f}, + {-0.022830f, +0.121862f, +0.008267f}, + {+0.007646f, +0.104913f, -0.016048f}, + {+0.008805f, -0.278895f, +0.005919f}, + {+0.015200f, +0.180293f, +0.037960f}, + {-0.037987f, -0.531186f, -0.053722f}, + {-0.053411f, +0.405963f, -0.066106f}, + {+0.004225f, +0.049392f, -0.020098f}, + {-0.032849f, +0.404382f, -0.057080f}, + {-0.020343f, +0.025697f, +0.003018f}, + {+0.000399f, -0.049237f, +0.005564f}, + {-0.018895f, +0.170897f, -0.004768f}, + {-0.014229f, +0.049740f, -0.026663f} + }, + { + {-0.062917f, +0.511673f, +0.062418f}, + {-0.164174f, +1.090974f, +0.108397f}, + {+0.009127f, +0.065188f, -0.003083f}, + {-0.018593f, +0.081738f, -0.000771f}, + {-0.020686f, +0.093603f, +0.012011f}, + {+0.000826f, +0.118498f, -0.001498f}, + {+0.025996f, -0.307659f, -0.023797f}, + {-0.008194f, +0.054598f, -0.009722f}, + {+0.040351f, -0.445888f, -0.056326f}, + {-0.030847f, +0.708631f, +0.081623f}, + {+0.002063f, +0.033938f, -0.025075f}, + {-0.027403f, +0.458795f, -0.033429f}, + {-0.021373f, -0.007009f, -0.010388f}, + {-0.002090f, -0.031407f, +0.008158f}, + {-0.028475f, +0.071069f, -0.046847f}, + {-0.007602f, +0.116385f, +0.002531f} + }, + { + {+0.114739f, +0.069536f, +0.170911f}, + {+0.106068f, +0.653946f, +0.186091f}, + {+0.032435f, +0.023922f, +0.003440f}, + {+0.048701f, +0.139999f, -0.053329f}, + {+0.008680f, +0.251941f, -0.071200f}, + {-0.004397f, +0.120323f, +0.000310f}, + {+0.025654f, -0.324361f, -0.006461f}, + {-0.004810f, +0.061858f, -0.007597f}, + {+0.097919f, -0.641143f, +0.015289f}, + {+0.011357f, +0.557580f, +0.143138f}, + {+0.004726f, -0.016709f, +0.000434f}, + {+0.013229f, +0.166606f, +0.093126f}, + {-0.007411f, +0.011792f, -0.021547f}, + {-0.005396f, -0.034575f, +0.011453f}, + {+0.010644f, +0.011719f, -0.021909f}, + {+0.005419f, +0.030988f, +0.043631f} + }, + { + {+0.066623f, -0.089947f, +0.096291f}, + {+0.228582f, +0.462839f, +0.023355f}, + {+0.030597f, +0.055459f, +0.010541f}, + {+0.104887f, +0.337465f, -0.003674f}, + {+0.072691f, +0.405228f, -0.038864f}, + {+0.004864f, +0.081470f, -0.022241f}, + {+0.026067f, -0.215427f, +0.055659f}, + {+0.015556f, +0.034465f, -0.026853f}, + {+0.081559f, -0.329728f, +0.167841f}, + {+0.004434f, +0.224966f, -0.027520f}, + {+0.000854f, -0.017986f, +0.001169f}, + {-0.017103f, +0.022207f, +0.026879f}, + {+0.016949f, +0.070641f, -0.004353f}, + {-0.006585f, -0.086138f, -0.004695f}, + {+0.059412f, +0.107209f, +0.004895f}, + {+0.005676f, -0.059162f, +0.003180f} + }, + { + {-0.248577f, +0.462186f, -0.044825f}, + {+0.092220f, +0.576619f, +0.031483f}, + {-0.018552f, +0.118241f, -0.000190f}, + {+0.024038f, +0.192235f, +0.076006f}, + {+0.073463f, +0.111697f, +0.085309f}, + {+0.045418f, +0.052428f, -0.014128f}, + {+0.004341f, -0.088144f, -0.002830f}, + {+0.058183f, -0.067481f, +0.003537f}, + {-0.112838f, +0.181474f, -0.013812f}, + {+0.051144f, +0.057123f, +0.036471f}, + {-0.002310f, -0.009489f, -0.002928f}, + {-0.036815f, +0.070367f, +0.013190f}, + {+0.025238f, +0.001933f, +0.022381f}, + {+0.011799f, -0.070089f, -0.017261f}, + {+0.079383f, -0.005050f, +0.042259f}, + {+0.027513f, -0.031781f, -0.014727f} + }, + { + {-0.588729f, +0.069942f, -0.118192f}, + {-0.336864f, -0.087523f, -0.133178f}, + {-0.091818f, +0.000222f, -0.031435f}, + {-0.240072f, -0.209090f, -0.026656f}, + {-0.106536f, -0.210008f, -0.006949f}, + {+0.086566f, +0.077574f, -0.013942f}, + {+0.036640f, -0.012230f, +0.021355f}, + {+0.059977f, -0.024737f, +0.017673f}, + {-0.214469f, +0.026100f, -0.046140f}, + {+0.016107f, -0.082852f, -0.011968f}, + {-0.003608f, +0.021470f, +0.008749f}, + {-0.046323f, -0.010871f, -0.015628f}, + {-0.008214f, -0.079699f, -0.002987f}, + {+0.052373f, +0.029312f, +0.014086f}, + {+0.018742f, -0.113603f, +0.010455f}, + {+0.059520f, +0.032936f, +0.004294f} + }, + { + {-0.672439f, -0.199370f, +0.003424f}, + {-0.631922f, -0.138094f, -0.043549f}, + {-0.130748f, -0.058055f, -0.001266f}, + {-0.452933f, -0.003480f, -0.056408f}, + {-0.285057f, +0.030036f, -0.056968f}, + {+0.110275f, -0.011467f, +0.016793f}, + {+0.065972f, +0.005614f, +0.004420f}, + {-0.003151f, +0.047883f, +0.002061f}, + {-0.163084f, -0.130815f, +0.001810f}, + {-0.019555f, -0.025290f, -0.023258f}, + {-0.018781f, +0.034389f, +0.006142f}, + {-0.002509f, -0.046479f, -0.009162f}, + {-0.041047f, -0.024011f, -0.016940f}, + {+0.065623f, +0.027310f, +0.010505f}, + {-0.073560f, +0.039971f, -0.029159f}, + {+0.062876f, +0.006797f, +0.012019f} + }, + { + {-0.543455f, +0.059523f, +0.064094f}, + {-0.700107f, +0.080270f, +0.041520f}, + {-0.154990f, -0.009275f, +0.018360f}, + {-0.474326f, +0.126377f, -0.003035f}, + {-0.327360f, +0.114048f, -0.014833f}, + {+0.071241f, -0.058994f, +0.004572f}, + {+0.087784f, +0.000125f, -0.001107f}, + {-0.094160f, -0.038960f, -0.011917f}, + {-0.019089f, +0.055284f, +0.038765f}, + {-0.023647f, +0.039958f, +0.003588f}, + {-0.043021f, -0.013443f, -0.008032f}, + {+0.077825f, +0.044990f, +0.010103f}, + {-0.040861f, +0.021619f, +0.002193f}, + {+0.044745f, -0.030859f, -0.007951f}, + {-0.123807f, +0.055927f, -0.012492f}, + {+0.025663f, -0.034745f, +0.003611f} + }, + { + {-0.336060f, +0.028886f, +0.031505f}, + {-0.587287f, -0.009083f, +0.042775f}, + {-0.182505f, +0.025753f, +0.007772f}, + {-0.327915f, -0.064183f, +0.035026f}, + {-0.233666f, -0.067260f, +0.031214f}, + {-0.007323f, +0.030500f, -0.014877f}, + {+0.086165f, +0.005866f, -0.002682f}, + {-0.157983f, -0.017671f, -0.007972f}, + {+0.103610f, +0.038997f, +0.019660f}, + {-0.007681f, -0.004657f, +0.015128f}, + {-0.055812f, -0.017923f, -0.003300f}, + {+0.143968f, +0.013845f, +0.008347f}, + {-0.017716f, -0.004963f, +0.006287f}, + {+0.008786f, -0.012160f, -0.007210f}, + {-0.121102f, -0.034578f, +0.019391f}, + {-0.032193f, +0.031317f, -0.010154f} + }, + { + {-0.153248f, -0.008370f, -0.009310f}, + {-0.402033f, +0.000118f, +0.012937f}, + {-0.199763f, -0.006595f, +0.001228f}, + {-0.128842f, +0.004526f, +0.020419f}, + {-0.092842f, -0.010605f, +0.021993f}, + {-0.077909f, +0.025349f, -0.002895f}, + {+0.057392f, -0.008479f, -0.003710f}, + {-0.165419f, +0.022789f, +0.007822f}, + {+0.148908f, -0.037324f, -0.013709f}, + {+0.011296f, -0.018097f, +0.005621f}, + {-0.055136f, +0.008613f, +0.006635f}, + {+0.160576f, -0.015557f, -0.006131f}, + {+0.014844f, -0.003364f, +0.000064f}, + {-0.027453f, -0.001660f, +0.003786f}, + {-0.097934f, -0.032125f, +0.013700f}, + {-0.074549f, +0.020854f, -0.006292f} + }, + { + {-0.021458f, -0.031294f, -0.015786f}, + {-0.225566f, -0.016671f, -0.005476f}, + {-0.179128f, -0.006436f, +0.000989f}, + {+0.030888f, -0.004116f, -0.001010f}, + {+0.023526f, +0.004404f, -0.002301f}, + {-0.113727f, -0.001584f, +0.014207f}, + {+0.006187f, +0.003628f, -0.000322f}, + {-0.130415f, +0.000132f, +0.008388f}, + {+0.133114f, -0.001415f, -0.020106f}, + {+0.026233f, +0.006894f, -0.005590f}, + {-0.046982f, +0.011852f, +0.003518f}, + {+0.124161f, +0.003790f, -0.005992f}, + {+0.039303f, -0.005121f, -0.003574f}, + {-0.061746f, +0.020157f, -0.000385f}, + {-0.073801f, +0.016410f, -0.009153f}, + {-0.089034f, -0.008662f, +0.006612f} + }, + { + {+0.079072f, +0.039673f, -0.003004f}, + {-0.077618f, +0.033045f, -0.007328f}, + {-0.090967f, +0.027848f, +0.000971f}, + {+0.121511f, -0.002007f, -0.010039f}, + {+0.095609f, +0.005944f, -0.008880f}, + {-0.100415f, -0.015820f, +0.006869f}, + {-0.060544f, -0.012856f, +0.004470f}, + {-0.077695f, +0.001667f, -0.001003f}, + {+0.092912f, +0.018201f, -0.005273f}, + {+0.040823f, +0.014455f, -0.004325f}, + {-0.030102f, +0.002197f, -0.002719f}, + {+0.043620f, -0.016980f, -0.000122f}, + {+0.041014f, +0.001499f, -0.001303f}, + {-0.088431f, +0.009078f, -0.001327f}, + {-0.051030f, +0.024992f, -0.008833f}, + {-0.091055f, -0.011437f, +0.003728f} + }, + { + {+0.165755f, -0.020564f, +0.004876f}, + {+0.050384f, -0.037239f, -0.000994f}, + {+0.070084f, -0.036144f, -0.001750f}, + {+0.168503f, -0.016906f, -0.008961f}, + {+0.141507f, -0.014408f, -0.005947f}, + {-0.022796f, -0.010807f, -0.007047f}, + {-0.126569f, +0.016739f, +0.005274f}, + {-0.026827f, -0.017151f, -0.002196f}, + {+0.045512f, +0.004295f, +0.005991f}, + {+0.054896f, -0.008311f, +0.001754f}, + {-0.003645f, -0.010307f, -0.002009f}, + {-0.057176f, +0.014805f, +0.004774f}, + {+0.011072f, +0.010642f, -0.000248f}, + {-0.108885f, -0.004650f, +0.007771f}, + {-0.039664f, -0.018793f, +0.005550f}, + {-0.092338f, -0.000767f, -0.000795f} + }, + { + {+0.239774f, +0.007034f, +0.002631f}, + {+0.158490f, +0.023748f, +0.003698f}, + {+0.270403f, +0.044381f, -0.006888f}, + {+0.208319f, +0.016522f, -0.001863f}, + {+0.188853f, +0.017009f, -0.001321f}, + {+0.109689f, +0.039932f, -0.010880f}, + {-0.162224f, -0.011965f, +0.002284f}, + {+0.008275f, +0.010941f, +0.003208f}, + {-0.008632f, -0.022468f, +0.003767f}, + {+0.062087f, -0.004201f, +0.001503f}, + {+0.024938f, +0.010189f, +0.000489f}, + {-0.144572f, -0.021004f, +0.007356f}, + {-0.046268f, -0.010126f, +0.001327f}, + {-0.126844f, -0.020412f, +0.005586f}, + {-0.049688f, -0.012221f, +0.009513f}, + {-0.100800f, -0.001133f, +0.001097f} + }, + { + {+0.298828f, -0.005793f, -0.001373f}, + {+0.237768f, -0.008765f, +0.003046f}, + {+0.449357f, -0.047352f, -0.004642f}, + {+0.250753f, -0.004865f, -0.001957f}, + {+0.245484f, -0.010819f, -0.000881f}, + {+0.249706f, -0.049408f, -0.003961f}, + {-0.136738f, -0.008753f, -0.001855f}, + {+0.025853f, +0.003385f, +0.004139f}, + {-0.065934f, +0.022501f, -0.003288f}, + {+0.057527f, +0.008394f, -0.002717f}, + {+0.046206f, -0.004855f, +0.002123f}, + {-0.183725f, +0.015903f, +0.001405f}, + {-0.114051f, +0.012348f, +0.005264f}, + {-0.129436f, +0.010088f, -0.004805f}, + {-0.071460f, +0.022939f, +0.001488f}, + {-0.119149f, +0.009223f, +0.000555f} + }, + { + {+0.346011f, +0.008343f, -0.002521f}, + {+0.286535f, -0.000576f, -0.000480f}, + {+0.541635f, +0.014116f, +0.002290f}, + {+0.286228f, +0.009795f, -0.003869f}, + {+0.299965f, +0.009735f, -0.003167f}, + {+0.328736f, +0.018968f, +0.006082f}, + {-0.037520f, +0.034439f, -0.002184f}, + {+0.042204f, -0.003541f, +0.000630f}, + {-0.115659f, -0.004656f, -0.004969f}, + {+0.039051f, -0.003041f, -0.004257f}, + {+0.056424f, +0.001120f, +0.003167f}, + {-0.144869f, +0.019123f, -0.003415f}, + {-0.166286f, -0.018086f, +0.003983f}, + {-0.101679f, +0.021538f, -0.005021f}, + {-0.078280f, -0.006671f, -0.006794f}, + {-0.140047f, -0.004747f, -0.001252f} + }, + { + {+0.388388f, -0.009881f, -0.001847f}, + {+0.316128f, -0.000090f, -0.004009f}, + {+0.513290f, +0.035603f, +0.000300f}, + {+0.296513f, -0.005786f, -0.000267f}, + {+0.333378f, -0.007221f, -0.002877f}, + {+0.295424f, +0.041070f, +0.003600f}, + {+0.114311f, -0.042170f, +0.000214f}, + {+0.081378f, -0.006284f, -0.003240f}, + {-0.150267f, -0.005614f, +0.000485f}, + {+0.005390f, +0.000214f, -0.000390f}, + {+0.064645f, +0.002835f, +0.002892f}, + {-0.026756f, -0.044985f, +0.000392f}, + {-0.170480f, -0.001979f, -0.000156f}, + {-0.050780f, -0.025790f, +0.003317f}, + {-0.047515f, -0.026029f, -0.004739f}, + {-0.153995f, -0.004894f, +0.001183f} + }, + { + {+0.430636f, +0.009808f, -0.001195f}, + {+0.343293f, +0.010478f, -0.003913f}, + {+0.388765f, -0.049553f, -0.008265f}, + {+0.266407f, -0.016789f, +0.000864f}, + {+0.328141f, -0.007654f, -0.002512f}, + {+0.155445f, -0.060858f, -0.009380f}, + {+0.269010f, +0.026881f, -0.000978f}, + {+0.158656f, +0.025362f, -0.003743f}, + {-0.171832f, +0.002756f, +0.006554f}, + {-0.043647f, -0.009482f, +0.003918f}, + {+0.090667f, -0.001476f, -0.001048f}, + {+0.132548f, +0.036105f, +0.003022f}, + {-0.106351f, +0.024154f, -0.000421f}, + {-0.000521f, +0.009705f, +0.007542f}, + {+0.019829f, +0.036619f, +0.006700f}, + {-0.155900f, +0.002824f, +0.004883f} + }, + { + {+0.471455f, -0.008296f, -0.001200f}, + {+0.377731f, -0.016768f, +0.000590f}, + {+0.234888f, +0.026343f, -0.008776f}, + {+0.198215f, +0.029257f, -0.004797f}, + {+0.279113f, +0.015431f, -0.003236f}, + {-0.033581f, +0.032760f, -0.011351f}, + {+0.370767f, -0.006318f, -0.006828f}, + {+0.266209f, -0.029783f, -0.001410f}, + {-0.185419f, +0.012636f, +0.005498f}, + {-0.100533f, +0.019010f, +0.003209f}, + {+0.151097f, -0.010446f, -0.007094f}, + {+0.274631f, -0.012724f, -0.003901f}, + {+0.013966f, -0.029859f, -0.001195f}, + {+0.031705f, +0.010192f, +0.002683f}, + {+0.102880f, -0.011055f, +0.011106f}, + {-0.143777f, +0.006427f, +0.002026f} + }, + { + {+0.505485f, +0.006321f, -0.001405f}, + {+0.419164f, +0.009705f, +0.004024f}, + {+0.115231f, -0.006245f, -0.000430f}, + {+0.110599f, -0.013787f, -0.006578f}, + {+0.197526f, -0.015552f, -0.000736f}, + {-0.208411f, -0.008219f, +0.002566f}, + {+0.381442f, -0.001142f, -0.007728f}, + {+0.371664f, +0.016115f, -0.002975f}, + {-0.191819f, -0.017185f, -0.004447f}, + {-0.147317f, -0.015855f, -0.001243f}, + {+0.239821f, +0.029217f, -0.008681f}, + {+0.348287f, +0.007454f, -0.010181f}, + {+0.149521f, +0.030650f, -0.003365f}, + {+0.048588f, -0.006717f, -0.005355f}, + {+0.186826f, -0.010831f, -0.001024f}, + {-0.115953f, +0.001790f, -0.004618f} + }, + { + {+0.527959f, -0.004605f, -0.000793f}, + {+0.465933f, +0.000734f, +0.000648f}, + {+0.058769f, +0.003399f, +0.003980f}, + {+0.020939f, +0.002500f, +0.001602f}, + {+0.102989f, +0.023640f, +0.000907f}, + {-0.330754f, +0.015227f, +0.013490f}, + {+0.293504f, +0.012966f, +0.002367f}, + {+0.435673f, -0.007769f, -0.006056f}, + {-0.189456f, -0.010551f, -0.008519f}, + {-0.165864f, -0.001568f, -0.003516f}, + {+0.320806f, -0.034715f, -0.000873f}, + {+0.324855f, -0.004016f, -0.002288f}, + {+0.248230f, -0.023651f, -0.001117f}, + {+0.067435f, -0.016300f, -0.003833f}, + {+0.272913f, -0.007587f, -0.015541f}, + {-0.076620f, -0.021772f, -0.003143f} + }, + { + {+0.537963f, +0.000122f, -0.000129f}, + {+0.521439f, +0.006120f, -0.005687f}, + {+0.059349f, +0.002731f, +0.001179f}, + {-0.063524f, -0.015179f, +0.008462f}, + {+0.018295f, -0.018831f, -0.001086f}, + {-0.382316f, -0.020820f, +0.008228f}, + {+0.133723f, -0.051158f, +0.007642f}, + {+0.427333f, -0.004801f, -0.004396f}, + {-0.189172f, +0.025571f, +0.003440f}, + {-0.153064f, +0.017940f, +0.000618f}, + {+0.344855f, +0.000841f, +0.007255f}, + {+0.204120f, -0.035702f, +0.007554f}, + {+0.269414f, -0.005639f, +0.002449f}, + {+0.098719f, +0.013856f, +0.002962f}, + {+0.355359f, +0.040342f, -0.012703f}, + {-0.043435f, +0.014923f, +0.004398f} + }, + { + {+0.539918f, +0.002520f, -0.000803f}, + {+0.586780f, -0.022878f, -0.005664f}, + {+0.088465f, -0.012487f, -0.000009f}, + {-0.133857f, +0.024436f, +0.005429f}, + {-0.038815f, +0.004600f, -0.001199f}, + {-0.354019f, -0.005760f, -0.002225f}, + {-0.035479f, +0.061479f, -0.003852f}, + {+0.333448f, +0.030542f, -0.002292f}, + {-0.214917f, +0.009773f, +0.013046f}, + {-0.126578f, -0.010093f, +0.005470f}, + {+0.286447f, +0.044878f, +0.001444f}, + {+0.026257f, +0.067149f, +0.001093f}, + {+0.208042f, +0.035382f, -0.000884f}, + {+0.140716f, -0.000405f, +0.001329f}, + {+0.398750f, -0.026334f, +0.002502f}, + {-0.035058f, +0.007558f, +0.005919f} + }, + { + {+0.542223f, +0.000691f, -0.001439f}, + {+0.649673f, +0.023205f, +0.000535f}, + {+0.109219f, +0.005980f, +0.002282f}, + {-0.171779f, -0.010220f, -0.000656f}, + {-0.066150f, +0.005365f, +0.002547f}, + {-0.254746f, +0.041005f, -0.002026f}, + {-0.138924f, -0.008674f, -0.012149f}, + {+0.169249f, -0.044112f, -0.002599f}, + {-0.272638f, -0.040677f, +0.004640f}, + {-0.110153f, -0.006462f, +0.003434f}, + {+0.169903f, -0.042984f, -0.010056f}, + {-0.132794f, -0.036153f, -0.009130f}, + {+0.102112f, -0.031703f, -0.006139f}, + {+0.188913f, +0.004870f, -0.004839f}, + {+0.357390f, -0.030371f, +0.006291f}, + {-0.051114f, -0.020551f, -0.000894f} + }, + { + {+0.551847f, -0.004875f, -0.000679f}, + {+0.690272f, -0.004312f, +0.004016f}, + {+0.095639f, +0.010071f, +0.002809f}, + {-0.161818f, -0.013824f, -0.000790f}, + {-0.076081f, +0.002390f, +0.004308f}, + {-0.122361f, -0.040035f, +0.004601f}, + {-0.144006f, -0.036671f, -0.003198f}, + {-0.024466f, +0.039610f, -0.000882f}, + {-0.331827f, +0.020929f, -0.006635f}, + {-0.113319f, +0.007876f, -0.000927f}, + {+0.048322f, +0.009251f, -0.008004f}, + {-0.207982f, -0.015726f, -0.004350f}, + {+0.006949f, +0.009330f, -0.004246f}, + {+0.233905f, -0.014811f, -0.005355f}, + {+0.223143f, +0.054998f, -0.002434f}, + {-0.070208f, +0.002186f, -0.004895f} + }, + { + {+0.570043f, +0.005432f, +0.000103f}, + {+0.699360f, -0.014398f, -0.000427f}, + {+0.048501f, -0.018143f, +0.001306f}, + {-0.107295f, +0.023902f, +0.003671f}, + {-0.082584f, -0.006076f, +0.001731f}, + {-0.005834f, +0.019340f, +0.006865f}, + {-0.085415f, +0.035831f, +0.009933f}, + {-0.202459f, -0.035934f, +0.000303f}, + {-0.353113f, +0.015051f, -0.004263f}, + {-0.130123f, -0.004257f, -0.001776f}, + {-0.043254f, -0.003167f, +0.001496f}, + {-0.189334f, +0.031601f, +0.007634f}, + {-0.040215f, +0.005301f, +0.001534f}, + {+0.256999f, +0.008098f, -0.001598f}, + {+0.036347f, -0.049036f, -0.008301f}, + {-0.070389f, +0.011544f, -0.000794f} + }, + { + {+0.593416f, -0.005649f, +0.000278f}, + {+0.688298f, +0.007364f, -0.005463f}, + {-0.008044f, +0.018190f, -0.001207f}, + {-0.030689f, -0.015365f, +0.004543f}, + {-0.091891f, +0.004696f, -0.000919f}, + {+0.064670f, +0.007573f, +0.000965f}, + {-0.030187f, +0.002153f, +0.010834f}, + {-0.331404f, +0.015975f, +0.000858f}, + {-0.323976f, -0.025164f, +0.004961f}, + {-0.148829f, -0.000188f, +0.000078f}, + {-0.101305f, +0.006103f, +0.005181f}, + {-0.115300f, -0.016832f, +0.010749f}, + {-0.032766f, -0.011589f, +0.005290f}, + {+0.239406f, +0.007974f, +0.000705f}, + {-0.145255f, +0.023713f, -0.004941f}, + {-0.046369f, -0.012177f, +0.003695f} + }, + { + {+0.616579f, +0.002929f, -0.000295f}, + {+0.676588f, +0.004629f, -0.003842f}, + {-0.043537f, -0.004766f, -0.003324f}, + {+0.044220f, +0.013845f, +0.003072f}, + {-0.101856f, +0.006437f, +0.001748f}, + {+0.092523f, -0.007377f, -0.006975f}, + {-0.023470f, -0.026713f, -0.000479f}, + {-0.400554f, +0.001062f, +0.004867f}, + {-0.261565f, +0.014128f, +0.007944f}, + {-0.159121f, +0.002751f, +0.002980f}, + {-0.138765f, -0.008950f, +0.004189f}, + {-0.034625f, -0.000481f, +0.002727f}, + {+0.012613f, +0.005909f, +0.003331f}, + {+0.175748f, -0.024801f, -0.000902f}, + {-0.281594f, -0.008334f, +0.003990f}, + {-0.007054f, +0.002604f, +0.002155f} + }, + { + {+0.635179f, -0.002823f, -0.001148f}, + {+0.674199f, -0.007986f, +0.000991f}, + {-0.041014f, -0.013849f, -0.001185f}, + {+0.104750f, -0.003964f, +0.000987f}, + {-0.107619f, +0.003736f, +0.004502f}, + {+0.101204f, -0.003739f, -0.008397f}, + {-0.064575f, +0.021388f, -0.009658f}, + {-0.422196f, -0.004265f, +0.008954f}, + {-0.190975f, -0.003688f, +0.002622f}, + {-0.155793f, +0.001509f, +0.003088f}, + {-0.169274f, +0.008874f, +0.002289f}, + {+0.023162f, -0.001981f, -0.005597f}, + {+0.073018f, -0.010252f, -0.000970f}, + {+0.080452f, +0.024265f, -0.002891f}, + {-0.363635f, +0.004698f, +0.010523f}, + {+0.035663f, -0.006812f, -0.001722f} + }, + { + {+0.647447f, +0.003124f, -0.000778f}, + {+0.678396f, -0.001222f, +0.002175f}, + {-0.008003f, +0.018788f, +0.004232f}, + {+0.153771f, +0.006824f, -0.001505f}, + {-0.102284f, -0.006283f, +0.000369f}, + {+0.107854f, +0.015766f, -0.002536f}, + {-0.127703f, -0.002824f, -0.007472f}, + {-0.415367f, -0.005027f, +0.007128f}, + {-0.124975f, +0.011994f, -0.001327f}, + {-0.135698f, +0.002841f, +0.000522f}, + {-0.197083f, -0.008952f, +0.000525f}, + {+0.049410f, +0.008433f, -0.005306f}, + {+0.128034f, +0.008755f, -0.002993f}, + {-0.020098f, -0.017083f, -0.001266f}, + {-0.399229f, -0.010519f, +0.009961f}, + {+0.073610f, +0.013100f, -0.000219f} + }, + { + {+0.653287f, -0.000651f, -0.000132f}, + {+0.682914f, +0.002014f, -0.000124f}, + {+0.032972f, -0.005837f, +0.006215f}, + {+0.202805f, -0.008225f, -0.002812f}, + {-0.078083f, -0.005921f, -0.003749f}, + {+0.111320f, -0.004540f, +0.003693f}, + {-0.194460f, +0.001719f, +0.000738f}, + {-0.388630f, -0.001712f, +0.002133f}, + {-0.064250f, -0.011691f, -0.000978f}, + {-0.097911f, -0.010340f, -0.000589f}, + {-0.217935f, +0.002537f, -0.000189f}, + {+0.043003f, -0.001190f, -0.000648f}, + {+0.160424f, -0.006445f, -0.003025f}, + {-0.102796f, +0.011222f, +0.001449f}, + {-0.392994f, +0.003832f, +0.004205f}, + {+0.101814f, -0.004741f, +0.002529f} + }, + { + {+0.655085f, -0.000496f, -0.000073f}, + {+0.685269f, +0.000562f, -0.000824f}, + {+0.064749f, -0.008716f, +0.000371f}, + {+0.258268f, +0.016126f, -0.002727f}, + {-0.038467f, +0.019915f, -0.001374f}, + {+0.101519f, -0.013031f, +0.001724f}, + {-0.262717f, -0.010913f, +0.005785f}, + {-0.340935f, +0.010917f, -0.000109f}, + {-0.005117f, +0.011670f, -0.001141f}, + {-0.047975f, +0.015016f, +0.000510f}, + {-0.227673f, +0.001545f, +0.000844f}, + {+0.006815f, -0.010613f, +0.001679f}, + {+0.158152f, -0.002971f, -0.001763f}, + {-0.154604f, -0.004393f, +0.003495f}, + {-0.341946f, +0.012918f, +0.000060f}, + {+0.123129f, -0.003187f, +0.000554f} + }, + { + {+0.657162f, +0.001154f, -0.000704f}, + {+0.686405f, -0.001174f, +0.000024f}, + {+0.087607f, -0.002335f, -0.004967f}, + {+0.314889f, -0.015378f, -0.000770f}, + {-0.001549f, -0.013009f, +0.003904f}, + {+0.077871f, +0.011151f, -0.003120f}, + {-0.333383f, +0.022033f, +0.004891f}, + {-0.273704f, -0.019370f, +0.000308f}, + {+0.054701f, -0.011371f, -0.002150f}, + {+0.003312f, -0.012026f, +0.002061f}, + {-0.228798f, -0.001402f, +0.001592f}, + {-0.048684f, +0.018229f, +0.000520f}, + {+0.117088f, +0.012634f, -0.000896f}, + {-0.173410f, +0.001735f, +0.003820f}, + {-0.247906f, -0.029903f, +0.000682f}, + {+0.148293f, -0.000926f, -0.003582f} + }, + { + {+0.663635f, +0.002010f, -0.001316f}, + {+0.689882f, -0.000220f, +0.000110f}, + {+0.108949f, +0.013447f, -0.002013f}, + {+0.358661f, +0.009695f, +0.001033f}, + {+0.013352f, -0.004281f, +0.004550f}, + {+0.049096f, -0.001505f, -0.002637f}, + {-0.398463f, -0.021957f, -0.000327f}, + {-0.196600f, +0.019778f, +0.001903f}, + {+0.110988f, +0.014423f, -0.001867f}, + {+0.045870f, +0.004558f, +0.001576f}, + {-0.228188f, +0.000097f, +0.001476f}, + {-0.105835f, -0.015244f, -0.001995f}, + {+0.044580f, -0.021539f, -0.001382f}, + {-0.164082f, +0.001655f, +0.001885f}, + {-0.126620f, +0.032568f, +0.003705f}, + {+0.185481f, +0.013419f, -0.004184f} + }, + { + {+0.675624f, -0.004827f, -0.000839f}, + {+0.700179f, -0.002102f, -0.000678f}, + {+0.128613f, -0.006572f, +0.002141f}, + {+0.378743f, +0.002887f, +0.000648f}, + {+0.004220f, +0.012669f, +0.000801f}, + {+0.022440f, +0.000653f, +0.000869f}, + {-0.441665f, +0.002210f, -0.002042f}, + {-0.124814f, -0.014411f, +0.002833f}, + {+0.153596f, -0.007894f, -0.000675f}, + {+0.077085f, -0.001217f, -0.000703f}, + {-0.231308f, -0.000725f, +0.002147f}, + {-0.147273f, +0.003213f, -0.002198f}, + {-0.042268f, +0.020842f, -0.002800f}, + {-0.133721f, -0.009739f, +0.001057f}, + {-0.003152f, -0.021386f, +0.003714f}, + {+0.229253f, -0.015325f, -0.001319f} + }, + { + {+0.689875f, +0.004735f, +0.000183f}, + {+0.720017f, +0.006167f, -0.000699f}, + {+0.141755f, -0.003516f, +0.000834f}, + {+0.376706f, -0.006807f, -0.001713f}, + {-0.011000f, -0.005016f, -0.001618f}, + {+0.000647f, -0.004137f, +0.002283f}, + {-0.454292f, +0.009561f, +0.002281f}, + {-0.069428f, +0.004651f, +0.001574f}, + {+0.172906f, +0.000456f, -0.000712f}, + {+0.102160f, +0.005230f, -0.001608f}, + {-0.237600f, -0.001176f, +0.003651f}, + {-0.166513f, +0.006046f, +0.001258f}, + {-0.123162f, -0.009523f, -0.000972f}, + {-0.093037f, +0.007808f, +0.000738f}, + {+0.101706f, +0.008107f, -0.001772f}, + {+0.261899f, +0.005910f, +0.000263f} + }, + { + {+0.701449f, -0.001309f, +0.000513f}, + {+0.747852f, -0.007083f, -0.000295f}, + {+0.146674f, +0.002063f, -0.002067f}, + {+0.365508f, +0.004005f, -0.003093f}, + {-0.009820f, -0.003073f, -0.001694f}, + {-0.014954f, +0.005079f, +0.001243f}, + {-0.444057f, -0.005273f, +0.005170f}, + {-0.030220f, -0.001713f, -0.001402f}, + {+0.167308f, +0.005594f, -0.001307f}, + {+0.126894f, -0.005843f, -0.001163f}, + {-0.239461f, +0.006087f, +0.002206f}, + {-0.171030f, -0.001130f, +0.003837f}, + {-0.185728f, +0.008176f, +0.002303f}, + {-0.053859f, -0.008398f, -0.000003f}, + {+0.180213f, -0.012225f, -0.006311f}, + {+0.267399f, +0.003688f, -0.000070f} + }, + { + {+0.707682f, -0.001614f, -0.000417f}, + {+0.778938f, +0.006537f, -0.000334f}, + {+0.145291f, +0.002890f, -0.001284f}, + {+0.359528f, +0.005062f, -0.001469f}, + {+0.019378f, +0.015221f, -0.000076f}, + {-0.021977f, -0.000916f, +0.000266f}, + {-0.425305f, -0.000822f, +0.003160f}, + {+0.002113f, +0.007052f, -0.002427f}, + {+0.143996f, -0.006679f, -0.001487f}, + {+0.153276f, +0.008199f, -0.000318f}, + {-0.224106f, +0.002607f, -0.000957f}, + {-0.172702f, -0.005631f, +0.001975f}, + {-0.227595f, -0.009189f, +0.001906f}, + {-0.024550f, +0.006878f, +0.000998f}, + {+0.231993f, +0.016149f, -0.003555f}, + {+0.242520f, -0.012045f, -0.001170f} + }, + { + {+0.709804f, +0.000997f, -0.001515f}, + {+0.808027f, -0.005290f, -0.000583f}, + {+0.139809f, +0.000435f, +0.000818f}, + {+0.365924f, -0.006226f, +0.001737f}, + {+0.071369f, -0.017742f, +0.003060f}, + {-0.017802f, -0.003027f, +0.000621f}, + {-0.407651f, -0.000451f, +0.000175f}, + {+0.034591f, -0.007791f, -0.002030f}, + {+0.114950f, +0.006228f, -0.001120f}, + {+0.179490f, -0.006128f, +0.000795f}, + {-0.183246f, -0.015768f, -0.000773f}, + {-0.177035f, +0.003531f, -0.000696f}, + {-0.250400f, +0.001355f, +0.001108f}, + {-0.008187f, +0.000159f, +0.001456f}, + {+0.254611f, -0.001384f, -0.000532f}, + {+0.198496f, +0.013948f, -0.002759f} + }, + { + {+0.710823f, +0.002381f, -0.001069f}, + {+0.831214f, +0.003447f, -0.000878f}, + {+0.132056f, -0.007797f, -0.000969f}, + {+0.382880f, -0.001094f, +0.000711f}, + {+0.129160f, +0.007502f, +0.002763f}, + {-0.003161f, +0.000767f, -0.000443f}, + {-0.392711f, +0.006305f, +0.000815f}, + {+0.067053f, +0.011901f, -0.000327f}, + {+0.090742f, -0.003835f, -0.000996f}, + {+0.202084f, +0.000560f, -0.000195f}, + {-0.122322f, +0.020924f, +0.002535f}, + {-0.182462f, +0.002778f, +0.000258f}, + {-0.259161f, +0.001293f, +0.002195f}, + {+0.000645f, -0.003627f, -0.000469f}, + {+0.248733f, -0.007401f, -0.001654f}, + {+0.153178f, -0.008546f, -0.003483f} + }, + { + {+0.712186f, -0.002003f, +0.000341f}, + {+0.846788f, -0.001521f, -0.001394f}, + {+0.124294f, +0.003415f, -0.004317f}, + {+0.406372f, -0.002613f, -0.002804f}, + {+0.179207f, -0.002493f, -0.001438f}, + {+0.017437f, -0.004122f, -0.002593f}, + {-0.378082f, -0.002349f, +0.002279f}, + {+0.093160f, -0.004321f, +0.001305f}, + {+0.077016f, -0.001502f, +0.000076f}, + {+0.220676f, -0.001245f, -0.002361f}, + {-0.057208f, -0.011096f, +0.003599f}, + {-0.185276f, -0.001151f, +0.002614f}, + {-0.259729f, -0.001827f, +0.003455f}, + {+0.012127f, +0.000504f, -0.003413f}, + {+0.221948f, +0.010321f, -0.003531f}, + {+0.118717f, -0.000242f, -0.001468f} + }, + { + {+0.713662f, -0.000828f, +0.000545f}, + {+0.855438f, +0.002950f, -0.000977f}, + {+0.115830f, +0.005727f, -0.002674f}, + {+0.431080f, +0.008386f, -0.003025f}, + {+0.218522f, +0.008054f, -0.003300f}, + {+0.036091f, +0.008702f, -0.001428f}, + {-0.359216f, +0.001218f, +0.000904f}, + {+0.107642f, -0.001544f, +0.000220f}, + {+0.072571f, -0.000752f, +0.000715f}, + {+0.237634f, +0.007061f, -0.001792f}, + {-0.001551f, +0.003678f, +0.000322f}, + {-0.181633f, -0.003122f, +0.001514f}, + {-0.255564f, -0.003731f, +0.002293f}, + {+0.032826f, +0.012636f, -0.002484f}, + {+0.185211f, -0.004024f, -0.002705f}, + {+0.094101f, -0.001623f, +0.001061f} + }, + { + {+0.715808f, +0.001447f, -0.000564f}, + {+0.858599f, -0.000128f, -0.000166f}, + {+0.099314f, +0.001041f, +0.001297f}, + {+0.448457f, -0.007760f, -0.000064f}, + {+0.248826f, -0.008996f, -0.001277f}, + {+0.041985f, -0.000319f, +0.000791f}, + {-0.330901f, -0.006650f, -0.000552f}, + {+0.113746f, +0.002963f, -0.001774f}, + {+0.073588f, -0.000327f, +0.000159f}, + {+0.253601f, -0.004683f, +0.000245f}, + {+0.041369f, -0.004973f, -0.002735f}, + {-0.166731f, -0.003863f, -0.000533f}, + {-0.246518f, -0.001268f, -0.000049f}, + {+0.057814f, -0.010629f, +0.001615f}, + {+0.147641f, +0.004485f, +0.000244f}, + {+0.070521f, +0.005007f, +0.001670f} + }, + { + {+0.720382f, +0.001583f, -0.001168f}, + {+0.858507f, -0.001602f, -0.000561f}, + {+0.067329f, -0.015190f, +0.000273f}, + {+0.450274f, -0.005070f, +0.000753f}, + {+0.271109f, +0.002256f, -0.000399f}, + {+0.028488f, -0.011815f, -0.001154f}, + {-0.292330f, +0.012166f, +0.000199f}, + {+0.120202f, +0.001560f, -0.002785f}, + {+0.077618f, +0.000385f, -0.000057f}, + {+0.267478f, -0.001019f, -0.000455f}, + {+0.074822f, +0.008817f, -0.002528f}, + {-0.138952f, +0.011104f, +0.000590f}, + {-0.231196f, +0.009528f, +0.001492f}, + {+0.074656f, -0.000989f, +0.002061f}, + {+0.113858f, -0.008628f, +0.000648f}, + {+0.041189f, -0.009773f, +0.000867f} + }, + { + {+0.728412f, -0.003781f, -0.000442f}, + {+0.858915f, +0.000641f, -0.001243f}, + {+0.021588f, +0.015568f, -0.003718f}, + {+0.435021f, +0.011190f, -0.002580f}, + {+0.286107f, +0.000454f, -0.002042f}, + {-0.001012f, +0.010763f, -0.004584f}, + {-0.248323f, -0.011164f, +0.001788f}, + {+0.134196f, -0.006281f, -0.001978f}, + {+0.082702f, +0.001367f, -0.001190f}, + {+0.278772f, +0.000302f, -0.002741f}, + {+0.102933f, -0.009391f, +0.000025f}, + {-0.103537f, -0.008673f, +0.002139f}, + {-0.211947f, -0.006496f, +0.004418f}, + {+0.077185f, +0.005220f, -0.000312f}, + {+0.087037f, +0.006765f, -0.000943f}, + {+0.005530f, +0.010882f, -0.000993f} + }, + { + {+0.738976f, +0.002329f, +0.000136f}, + {+0.861896f, -0.000932f, -0.002377f}, + {-0.029402f, -0.003271f, -0.002468f}, + {+0.408989f, -0.003243f, -0.003584f}, + {+0.293612f, +0.002313f, -0.002730f}, + {-0.038002f, -0.000412f, -0.002803f}, + {-0.206194f, +0.003320f, +0.000488f}, + {+0.155421f, +0.006078f, -0.001116f}, + {+0.087818f, +0.003223f, -0.001518f}, + {+0.285833f, +0.006231f, -0.001960f}, + {+0.128249f, +0.001074f, +0.000243f}, + {-0.068575f, +0.002940f, +0.000700f}, + {-0.191804f, -0.003014f, +0.002724f}, + {+0.067942f, -0.005643f, -0.002245f}, + {+0.068213f, -0.000980f, -0.001053f}, + {-0.030778f, -0.002407f, -0.000036f} + }, + { + {+0.750300f, +0.000058f, -0.000825f}, + {+0.866279f, -0.001749f, -0.003432f}, + {-0.078123f, -0.003921f, +0.005991f}, + {+0.379010f, -0.005518f, +0.002243f}, + {+0.292486f, -0.009941f, +0.001947f}, + {-0.075433f, -0.005336f, +0.005378f}, + {-0.170771f, -0.002341f, -0.003169f}, + {+0.177886f, -0.005886f, -0.000679f}, + {+0.091281f, -0.005785f, +0.001198f}, + {+0.285767f, -0.012433f, +0.005156f}, + {+0.152796f, +0.004962f, -0.005079f}, + {-0.040112f, -0.002644f, -0.001940f}, + {-0.171647f, +0.007661f, -0.004705f}, + {+0.053028f, -0.000873f, -0.001571f}, + {+0.054373f, -0.002064f, +0.001211f}, + {-0.062123f, +0.000837f, +0.004082f} + }, + { + {+0.760695f, +0.000187f, -0.002580f}, + {+0.869383f, +0.005374f, -0.001979f}, + {-0.118984f, -0.003432f, +0.014567f}, + {+0.349914f, +0.003949f, +0.011712f}, + {+0.283867f, +0.008607f, +0.011966f}, + {-0.106829f, -0.003798f, +0.012953f}, + {-0.143863f, +0.007735f, -0.004012f}, + {+0.195900f, +0.004792f, +0.000560f}, + {+0.091845f, +0.002959f, +0.004936f}, + {+0.279043f, +0.006225f, +0.015628f}, + {+0.177000f, -0.001330f, -0.012704f}, + {-0.021476f, +0.006516f, -0.001630f}, + {-0.154239f, +0.000969f, -0.011998f}, + {+0.037152f, +0.007671f, +0.004251f}, + {+0.041126f, +0.001005f, +0.004482f}, + {-0.085797f, -0.005363f, +0.006097f} + } +}; + +const float leftHRIRImag_HOA3[BINAURAL_CONVBANDS][HOA3_CHANNELS][BINAURAL_NTAPS_SBA]= +{ + { + {-0.191323f, +0.550462f, -0.164703f}, + {-0.179339f, +0.105827f, +0.022109f}, + {-0.016317f, +0.069138f, -0.026386f}, + {-0.031302f, +0.044550f, -0.011983f}, + {-0.011873f, -0.049933f, +0.022817f}, + {+0.002100f, -0.025417f, +0.008917f}, + {+0.008673f, +0.072165f, -0.030658f}, + {+0.009984f, -0.046099f, +0.014260f}, + {-0.017932f, +0.200113f, -0.071972f}, + {-0.009948f, -0.076380f, +0.035799f}, + {+0.000500f, +0.013211f, -0.007415f}, + {-0.005467f, -0.017109f, +0.007909f}, + {-0.001381f, -0.024397f, +0.011565f}, + {+0.001735f, -0.017167f, +0.009148f}, + {-0.006994f, -0.015041f, +0.007364f}, + {-0.000274f, +0.004190f, -0.001467f} + }, + { + {-0.330036f, +0.333647f, -0.215680f}, + {-0.446962f, -0.557076f, -0.195252f}, + {-0.017152f, +0.086610f, -0.016060f}, + {-0.053984f, +0.030859f, -0.007361f}, + {-0.031663f, -0.050397f, +0.030580f}, + {+0.013130f, +0.075028f, +0.055072f}, + {+0.035680f, +0.080722f, -0.037346f}, + {+0.011258f, -0.044042f, +0.013548f}, + {+0.004710f, +0.152351f, -0.099878f}, + {-0.054304f, -0.216938f, -0.014289f}, + {+0.014461f, +0.090558f, +0.026436f}, + {-0.019523f, -0.056800f, -0.001967f}, + {-0.012667f, -0.065948f, -0.004877f}, + {-0.011111f, -0.088384f, -0.022179f}, + {-0.018869f, -0.025704f, +0.006997f}, + {+0.000817f, +0.008300f, +0.000651f} + }, + { + {-0.096856f, -0.591788f, +0.084769f}, + {-0.247542f, -1.016515f, -0.073842f}, + {-0.000574f, +0.046908f, -0.004371f}, + {-0.019540f, +0.031177f, -0.013825f}, + {-0.037796f, +0.124420f, -0.041797f}, + {-0.007360f, +0.192733f, +0.007619f}, + {+0.072377f, -0.160383f, +0.061576f}, + {-0.003711f, +0.021943f, -0.004227f}, + {+0.112964f, -0.363004f, +0.093285f}, + {-0.056746f, -0.090813f, -0.072980f}, + {+0.006103f, +0.134417f, +0.008866f}, + {-0.005326f, -0.101653f, +0.016759f}, + {-0.002749f, -0.090650f, +0.006843f}, + {-0.000089f, -0.179843f, +0.016051f}, + {+0.001814f, -0.087437f, +0.037078f}, + {+0.005267f, -0.010738f, +0.007098f} + }, + { + {+0.063555f, -0.411417f, +0.075756f}, + {+0.093014f, -0.372322f, +0.077805f}, + {+0.007107f, +0.054992f, -0.008311f}, + {+0.033886f, +0.080359f, -0.013428f}, + {+0.014436f, +0.207733f, -0.015885f}, + {-0.013408f, +0.128849f, -0.020860f}, + {+0.024255f, -0.374328f, -0.023256f}, + {-0.002134f, +0.023939f, +0.000696f}, + {+0.058983f, -0.666227f, -0.050398f}, + {-0.014357f, -0.059836f, -0.078919f}, + {-0.009066f, +0.055606f, -0.025373f}, + {-0.008234f, -0.193844f, -0.040018f}, + {+0.010778f, -0.088365f, +0.004018f}, + {+0.007190f, -0.141067f, +0.033486f}, + {+0.015950f, -0.182801f, -0.014037f}, + {-0.004549f, -0.103305f, -0.035896f} + }, + { + {+0.019484f, -0.338410f, +0.083536f}, + {+0.202040f, -0.634536f, +0.185332f}, + {+0.007949f, -0.067812f, +0.047529f}, + {+0.048582f, -0.153833f, +0.075433f}, + {+0.054773f, -0.008273f, +0.058696f}, + {+0.024929f, -0.021715f, +0.041866f}, + {-0.026392f, -0.170362f, -0.104628f}, + {+0.014816f, -0.001719f, +0.003760f}, + {-0.050384f, -0.474129f, -0.111890f}, + {+0.050928f, -0.326828f, +0.037272f}, + {-0.005968f, +0.019903f, -0.009428f}, + {-0.002366f, -0.233633f, -0.019586f}, + {+0.014235f, -0.074982f, -0.008001f}, + {-0.003852f, +0.000864f, -0.026540f}, + {+0.024596f, -0.140123f, -0.045292f}, + {+0.007335f, -0.140212f, -0.016737f} + }, + { + {-0.203259f, -0.677311f, +0.036974f}, + {-0.017307f, -0.878070f, +0.170118f}, + {-0.043215f, -0.181813f, +0.012035f}, + {-0.067120f, -0.199982f, +0.078357f}, + {-0.003334f, -0.005382f, +0.060963f}, + {+0.037369f, -0.095076f, +0.002797f}, + {-0.007145f, +0.024172f, -0.016239f}, + {+0.025809f, +0.035193f, +0.010462f}, + {-0.123278f, -0.317455f, +0.005941f}, + {+0.071780f, -0.152842f, +0.115403f}, + {-0.009047f, +0.007435f, -0.015219f}, + {+0.009240f, -0.131025f, +0.037457f}, + {+0.010330f, -0.013791f, +0.019556f}, + {+0.018073f, +0.051639f, -0.007415f}, + {+0.023065f, +0.024816f, +0.028060f}, + {+0.023145f, -0.072535f, +0.012653f} + }, + { + {-0.363585f, -0.196908f, -0.132849f}, + {-0.400794f, +0.061111f, -0.146774f}, + {-0.088996f, -0.035461f, -0.039728f}, + {-0.248102f, +0.210034f, -0.044008f}, + {-0.136603f, +0.269455f, -0.014678f}, + {+0.039867f, -0.056544f, -0.018785f}, + {+0.012335f, -0.061064f, +0.014746f}, + {+0.001640f, +0.021263f, +0.019567f}, + {-0.164395f, -0.120409f, -0.065761f}, + {+0.005008f, +0.124444f, +0.002355f}, + {-0.006089f, -0.036166f, +0.003168f}, + {+0.008972f, -0.027316f, -0.008811f}, + {-0.026456f, +0.074066f, -0.007831f}, + {+0.036264f, -0.025445f, +0.017552f}, + {-0.046783f, +0.110385f, +0.011511f}, + {+0.016634f, -0.063190f, +0.003470f} + }, + { + {-0.140043f, +0.331564f, +0.031879f}, + {-0.418213f, +0.323867f, -0.026950f}, + {-0.066524f, +0.078043f, +0.003209f}, + {-0.275295f, +0.106284f, -0.069212f}, + {-0.205855f, +0.059809f, -0.074823f}, + {+0.024267f, +0.018141f, +0.016347f}, + {+0.021686f, -0.056152f, +0.012278f}, + {-0.065157f, -0.071098f, -0.001681f}, + {-0.025332f, +0.159594f, +0.013561f}, + {-0.029475f, +0.035218f, -0.023811f}, + {-0.011328f, -0.030605f, +0.007685f}, + {+0.054740f, +0.020295f, +0.000302f}, + {-0.047455f, +0.027854f, -0.019731f}, + {+0.022053f, -0.039858f, +0.012679f}, + {-0.116347f, -0.040132f, -0.032026f}, + {-0.007321f, -0.043491f, +0.015668f} + }, + { + {+0.232420f, -0.042183f, +0.090352f}, + {-0.143907f, -0.128870f, +0.081606f}, + {-0.019255f, -0.008481f, +0.025359f}, + {-0.079364f, -0.195197f, +0.009060f}, + {-0.092435f, -0.165349f, -0.007306f}, + {-0.037358f, +0.066958f, +0.009347f}, + {+0.002010f, -0.000201f, -0.007048f}, + {-0.118479f, -0.000141f, -0.016298f}, + {+0.131479f, -0.025371f, +0.046423f}, + {-0.013254f, -0.056073f, +0.007964f}, + {-0.020421f, +0.014051f, -0.008057f}, + {+0.102505f, -0.044999f, +0.012472f}, + {-0.028717f, -0.037569f, +0.002612f}, + {-0.021286f, +0.036718f, -0.008001f}, + {-0.110557f, -0.093273f, -0.012580f}, + {-0.060924f, +0.023756f, -0.000190f} + }, + { + {+0.533983f, -0.079000f, +0.018330f}, + {+0.217748f, -0.012931f, +0.048151f}, + {+0.025802f, -0.036354f, +0.006267f}, + {+0.205140f, +0.060899f, +0.046660f}, + {+0.113290f, +0.081234f, +0.041909f}, + {-0.105415f, -0.030348f, -0.015181f}, + {-0.034112f, -0.007984f, -0.002032f}, + {-0.109019f, +0.032142f, -0.005021f}, + {+0.186112f, -0.090334f, +0.010289f}, + {+0.018376f, -0.004638f, +0.018235f}, + {-0.011521f, +0.024596f, -0.005093f}, + {+0.106685f, -0.043319f, +0.011207f}, + {+0.003719f, +0.002813f, +0.009833f}, + {-0.061529f, +0.014049f, -0.008239f}, + {-0.045872f, +0.041391f, +0.025100f}, + {-0.106073f, -0.025839f, -0.009219f} + }, + { + {+0.689088f, +0.021676f, -0.035498f}, + {+0.512497f, +0.013050f, -0.008139f}, + {+0.080900f, -0.013233f, -0.008488f}, + {+0.415840f, +0.041814f, +0.013996f}, + {+0.278767f, +0.050484f, +0.020716f}, + {-0.124237f, -0.048494f, -0.003541f}, + {-0.083860f, +0.012095f, -0.001839f}, + {-0.040470f, -0.043256f, +0.009440f}, + {+0.127554f, +0.052174f, -0.027560f}, + {+0.038197f, +0.025553f, +0.002386f}, + {+0.013296f, -0.017618f, +0.006802f}, + {+0.049000f, +0.034411f, -0.008434f}, + {+0.023951f, +0.015385f, +0.000397f}, + {-0.079741f, -0.014689f, +0.006056f}, + {+0.015937f, +0.036771f, +0.013501f}, + {-0.116284f, -0.032742f, -0.005608f} + }, + { + {+0.733240f, +0.033897f, -0.028463f}, + {+0.683283f, +0.019108f, -0.024422f}, + {+0.165878f, +0.024612f, -0.005353f}, + {+0.489377f, -0.026929f, -0.018187f}, + {+0.343135f, -0.029846f, -0.016631f}, + {-0.086256f, +0.016816f, +0.014815f}, + {-0.129107f, +0.000075f, +0.000830f}, + {+0.047145f, -0.000801f, +0.008881f}, + {+0.023844f, +0.003992f, -0.023086f}, + {+0.042301f, -0.008336f, -0.009579f}, + {+0.039371f, -0.014019f, +0.003266f}, + {-0.037930f, -0.005491f, -0.006528f}, + {+0.020403f, -0.000483f, -0.004551f}, + {-0.081119f, -0.016241f, +0.003920f}, + {+0.051945f, -0.020771f, -0.013605f}, + {-0.091078f, +0.021518f, +0.009604f} + }, + { + {+0.733114f, -0.029809f, -0.003150f}, + {+0.758988f, -0.025935f, -0.015102f}, + {+0.280906f, -0.031811f, -0.003778f}, + {+0.459117f, +0.008405f, -0.019040f}, + {+0.333055f, -0.004022f, -0.017856f}, + {-0.012149f, +0.009636f, +0.003754f}, + {-0.156853f, +0.003236f, +0.004887f}, + {+0.114968f, +0.002815f, -0.004184f}, + {-0.064559f, -0.023528f, +0.001333f}, + {+0.039134f, -0.015161f, -0.005522f}, + {+0.063282f, -0.001881f, -0.005278f}, + {-0.121057f, +0.006821f, +0.003568f}, + {-0.006828f, +0.002343f, -0.000194f}, + {-0.069156f, -0.009861f, -0.001545f}, + {+0.070362f, -0.029774f, -0.011253f}, + {-0.061366f, +0.013312f, +0.005905f} + }, + { + {+0.724625f, -0.001203f, +0.006316f}, + {+0.787100f, +0.019364f, -0.003117f}, + {+0.401617f, +0.025467f, -0.004330f}, + {+0.392760f, +0.000769f, -0.009132f}, + {+0.296783f, +0.006051f, -0.006244f}, + {+0.080677f, +0.011855f, -0.011409f}, + {-0.155686f, -0.003923f, +0.003032f}, + {+0.152027f, +0.011289f, -0.005772f}, + {-0.122199f, -0.008679f, +0.013528f}, + {+0.032224f, +0.005650f, +0.003051f}, + {+0.086101f, +0.012645f, -0.003029f}, + {-0.171824f, -0.008018f, +0.006233f}, + {-0.049811f, -0.010853f, +0.002128f}, + {-0.046385f, +0.014661f, +0.005149f}, + {+0.075593f, +0.018900f, +0.006819f}, + {-0.042682f, -0.001204f, -0.002701f} + }, + { + {+0.710313f, +0.016351f, +0.000594f}, + {+0.788202f, +0.001698f, +0.001880f}, + {+0.478276f, -0.009988f, -0.006465f}, + {+0.338553f, -0.006580f, +0.000873f}, + {+0.267876f, -0.004181f, +0.000561f}, + {+0.161632f, -0.031504f, -0.010015f}, + {-0.112024f, -0.007981f, -0.001560f}, + {+0.161078f, -0.006395f, +0.000785f}, + {-0.159938f, +0.023767f, +0.006167f}, + {+0.016977f, +0.011649f, +0.002458f}, + {+0.101033f, -0.005466f, +0.000979f}, + {-0.168147f, -0.002987f, +0.004477f}, + {-0.090853f, +0.008103f, +0.002155f}, + {-0.019160f, +0.010061f, +0.003516f}, + {+0.068113f, +0.017356f, +0.008667f}, + {-0.034415f, -0.006094f, -0.000653f} + }, + { + {+0.687296f, -0.010309f, -0.005056f}, + {+0.764260f, -0.015559f, -0.000832f}, + {+0.464886f, -0.002946f, -0.003297f}, + {+0.298384f, -0.012876f, +0.002489f}, + {+0.246598f, -0.005940f, +0.001267f}, + {+0.184060f, +0.014332f, +0.000763f}, + {-0.024137f, +0.022250f, -0.004819f}, + {+0.154151f, -0.010440f, +0.001340f}, + {-0.181725f, -0.011644f, -0.002738f}, + {-0.007528f, -0.010988f, -0.002133f}, + {+0.103221f, -0.002109f, +0.001628f}, + {-0.103776f, +0.007568f, -0.001735f}, + {-0.108578f, +0.000395f, +0.003349f}, + {+0.017935f, -0.001653f, -0.006823f}, + {+0.063247f, -0.018078f, -0.002599f}, + {-0.031929f, -0.003751f, +0.000579f} + }, + { + {+0.659915f, +0.003181f, -0.004789f}, + {+0.723641f, +0.015598f, -0.004701f}, + {+0.344320f, +0.034439f, +0.003396f}, + {+0.252485f, +0.010951f, -0.000869f}, + {+0.213766f, +0.011294f, -0.001229f}, + {+0.112272f, +0.023126f, +0.008479f}, + {+0.086512f, -0.032942f, -0.003959f}, + {+0.151070f, +0.005416f, -0.003241f}, + {-0.183618f, -0.008669f, -0.002985f}, + {-0.037360f, +0.003147f, -0.002379f}, + {+0.095879f, +0.005536f, +0.000670f}, + {+0.009973f, -0.033041f, -0.006312f}, + {-0.086652f, -0.000941f, +0.001227f}, + {+0.070708f, -0.028404f, -0.005854f}, + {+0.082798f, -0.007130f, -0.008870f}, + {-0.024953f, -0.002080f, -0.001188f} + }, + { + {+0.634763f, -0.001208f, -0.002397f}, + {+0.683670f, -0.007693f, -0.006039f}, + {+0.143818f, -0.065248f, +0.001626f}, + {+0.187585f, -0.010607f, +0.001657f}, + {+0.155102f, -0.012347f, -0.000836f}, + {-0.047669f, -0.064360f, +0.004465f}, + {+0.176375f, +0.020282f, -0.000832f}, + {+0.166599f, +0.005868f, -0.005383f}, + {-0.165581f, +0.017111f, +0.003241f}, + {-0.067470f, +0.001639f, +0.002026f}, + {+0.090399f, -0.004464f, -0.000923f}, + {+0.138735f, +0.040116f, -0.001857f}, + {-0.018624f, +0.015969f, -0.003767f}, + {+0.124121f, +0.022397f, +0.003509f}, + {+0.132318f, +0.030070f, -0.004033f}, + {-0.005451f, +0.010583f, +0.000461f} + }, + { + {+0.613639f, +0.002441f, -0.000996f}, + {+0.658994f, -0.004033f, -0.003708f}, + {-0.066781f, +0.052613f, -0.005380f}, + {+0.103141f, +0.024662f, +0.003094f}, + {+0.069224f, +0.020885f, +0.001016f}, + {-0.237901f, +0.057325f, -0.006669f}, + {+0.198251f, +0.008139f, -0.001238f}, + {+0.196297f, -0.014019f, -0.004087f}, + {-0.137085f, -0.006189f, +0.006787f}, + {-0.092626f, +0.005231f, +0.005081f}, + {+0.098805f, +0.001528f, -0.003973f}, + {+0.227978f, -0.011869f, +0.001188f}, + {+0.083502f, -0.031761f, -0.003653f}, + {+0.154304f, +0.003532f, +0.005157f}, + {+0.192731f, -0.026618f, +0.005738f}, + {+0.025619f, -0.008251f, +0.002697f} + }, + { + {+0.592443f, -0.004265f, -0.000675f}, + {+0.651475f, +0.007639f, +0.001077f}, + {-0.211884f, -0.008375f, -0.003618f}, + {+0.015847f, -0.026610f, -0.001288f}, + {-0.030980f, -0.024402f, +0.000682f}, + {-0.377865f, -0.004628f, -0.005328f}, + {+0.127740f, -0.031243f, -0.004692f}, + {+0.216064f, +0.008428f, -0.000840f}, + {-0.107665f, -0.004148f, +0.003207f}, + {-0.104222f, -0.007982f, +0.002781f}, + {+0.121055f, +0.007151f, -0.006643f}, + {+0.232842f, -0.021111f, -0.004010f}, + {+0.181984f, +0.020598f, -0.002112f}, + {+0.154857f, -0.016563f, -0.001311f}, + {+0.234230f, -0.006972f, +0.006138f}, + {+0.062816f, -0.000374f, -0.000261f} + }, + { + {+0.565815f, +0.006621f, -0.000731f}, + {+0.652157f, +0.001839f, +0.002786f}, + {-0.256941f, -0.016709f, +0.005201f}, + {-0.049457f, +0.004802f, -0.002568f}, + {-0.121870f, +0.014390f, +0.001453f}, + {-0.418806f, -0.025565f, +0.008436f}, + {-0.023252f, +0.033441f, -0.003455f}, + {+0.192750f, +0.014454f, -0.000969f}, + {-0.080190f, +0.006138f, -0.004702f}, + {-0.090978f, -0.000288f, -0.001642f}, + {+0.136520f, -0.012063f, -0.004637f}, + {+0.143202f, +0.027531f, -0.007344f}, + {+0.230859f, -0.004544f, -0.002668f}, + {+0.140224f, +0.009293f, -0.007214f}, + {+0.242282f, +0.025199f, -0.006229f}, + {+0.100859f, -0.005416f, -0.004924f} + }, + { + {+0.532337f, -0.007417f, -0.000543f}, + {+0.652955f, -0.010368f, -0.001740f}, + {-0.220699f, +0.013404f, +0.007323f}, + {-0.077945f, +0.013141f, +0.004826f}, + {-0.182039f, -0.009934f, +0.002503f}, + {-0.362601f, +0.019757f, +0.014603f}, + {-0.211924f, -0.030990f, +0.005294f}, + {+0.105625f, -0.028087f, -0.003678f}, + {-0.054535f, +0.015575f, -0.006139f}, + {-0.049202f, +0.015528f, -0.003083f}, + {+0.111395f, +0.002877f, +0.002743f}, + {-0.015299f, -0.023373f, +0.001099f}, + {+0.201870f, -0.009975f, -0.000096f}, + {+0.130715f, +0.012877f, -0.003882f}, + {+0.221564f, -0.009858f, -0.016146f}, + {+0.132494f, +0.017520f, -0.002095f} + }, + { + {+0.495834f, +0.008532f, -0.000369f}, + {+0.652356f, +0.003292f, -0.006811f}, + {-0.149624f, -0.011936f, +0.002662f}, + {-0.071256f, -0.002030f, +0.009341f}, + {-0.200363f, +0.000872f, +0.001071f}, + {-0.238216f, -0.009887f, +0.004541f}, + {-0.381151f, +0.041781f, +0.008291f}, + {-0.039667f, +0.026941f, +0.000063f}, + {-0.036683f, -0.023635f, +0.004916f}, + {+0.009186f, -0.024708f, +0.001260f}, + {+0.023299f, +0.026996f, +0.008496f}, + {-0.194696f, +0.039072f, +0.009744f}, + {+0.098003f, +0.033287f, +0.002536f}, + {+0.131758f, -0.006621f, +0.002658f}, + {+0.173806f, -0.018597f, -0.006932f}, + {+0.145380f, -0.006223f, +0.004430f} + }, + { + {+0.463299f, -0.007155f, -0.000770f}, + {+0.648076f, +0.009295f, -0.004610f}, + {-0.089513f, +0.010398f, +0.000359f}, + {-0.033244f, -0.002975f, +0.003236f}, + {-0.178153f, +0.013477f, +0.001343f}, + {-0.077802f, +0.029144f, -0.007460f}, + {-0.474851f, -0.029171f, -0.001803f}, + {-0.217055f, -0.041281f, +0.004828f}, + {-0.037249f, -0.008239f, +0.011497f}, + {+0.059921f, +0.009759f, +0.005233f}, + {-0.114758f, -0.056676f, +0.002229f}, + {-0.334964f, -0.046076f, +0.002995f}, + {-0.042473f, -0.043913f, -0.000922f}, + {+0.133390f, -0.007415f, +0.001167f}, + {+0.081735f, -0.007332f, +0.010523f}, + {+0.133499f, -0.015420f, +0.003583f} + }, + { + {+0.441203f, +0.002482f, -0.000824f}, + {+0.629545f, -0.003537f, +0.002292f}, + {-0.068500f, -0.000883f, +0.001586f}, + {+0.038519f, -0.014498f, -0.003426f}, + {-0.131180f, -0.015847f, +0.003732f}, + {+0.083693f, -0.047317f, -0.005981f}, + {-0.461803f, -0.022290f, -0.008344f}, + {-0.384732f, +0.037693f, +0.003505f}, + {-0.048144f, +0.029049f, +0.001374f}, + {+0.084768f, +0.008739f, +0.001947f}, + {-0.251499f, +0.035994f, -0.008053f}, + {-0.379916f, +0.000042f, -0.006724f}, + {-0.160178f, +0.020677f, -0.004025f}, + {+0.124411f, +0.010697f, -0.004992f}, + {-0.067302f, +0.056203f, +0.010926f}, + {+0.110573f, +0.015976f, -0.002867f} + }, + { + {+0.430897f, +0.000433f, -0.000350f}, + {+0.586004f, -0.017187f, +0.004129f}, + {-0.087700f, -0.011728f, +0.002208f}, + {+0.139979f, +0.032148f, -0.002572f}, + {-0.080931f, +0.008008f, +0.004145f}, + {+0.204274f, +0.031020f, +0.002988f}, + {-0.365555f, +0.057171f, +0.001535f}, + {-0.496090f, -0.014326f, +0.002762f}, + {-0.036347f, -0.000076f, -0.009610f}, + {+0.087371f, -0.006753f, -0.002953f}, + {-0.332582f, +0.010055f, -0.004412f}, + {-0.314151f, +0.048523f, -0.001669f}, + {-0.210677f, +0.006259f, -0.001554f}, + {+0.097223f, +0.002730f, -0.004153f}, + {-0.243214f, -0.058784f, -0.001131f}, + {+0.100970f, +0.001509f, -0.005827f} + }, + { + {+0.427847f, -0.001191f, +0.000192f}, + {+0.522040f, +0.027328f, -0.001322f}, + {-0.123746f, +0.015960f, -0.000425f}, + {+0.250557f, -0.029225f, +0.001401f}, + {-0.041411f, +0.001671f, +0.000435f}, + {+0.251666f, +0.011713f, +0.002737f}, + {-0.259410f, -0.030558f, +0.013501f}, + {-0.523363f, -0.008886f, +0.005097f}, + {+0.023565f, -0.037779f, -0.005281f}, + {+0.085570f, -0.002595f, -0.003055f}, + {-0.343956f, -0.022947f, +0.008052f}, + {-0.182050f, -0.049717f, +0.010139f}, + {-0.188646f, -0.025113f, +0.004590f}, + {+0.043971f, +0.008025f, +0.002158f}, + {-0.383316f, +0.019159f, -0.004800f}, + {+0.118679f, -0.020135f, -0.001036f} + }, + { + {+0.424775f, -0.001427f, +0.000274f}, + {+0.458547f, -0.013186f, -0.005324f}, + {-0.143005f, -0.001551f, -0.002520f}, + {+0.342091f, +0.013355f, +0.001866f}, + {-0.012473f, +0.005183f, -0.002228f}, + {+0.229007f, -0.024031f, -0.004922f}, + {-0.213143f, -0.021386f, +0.008846f}, + {-0.469349f, +0.018839f, +0.005224f}, + {+0.120107f, +0.037044f, +0.005367f}, + {+0.094940f, +0.009229f, +0.000146f}, + {-0.312164f, +0.002650f, +0.009985f}, + {-0.056636f, +0.008288f, +0.009234f}, + {-0.124730f, +0.013388f, +0.006509f}, + {-0.037461f, -0.023127f, +0.003625f}, + {-0.438903f, +0.013352f, +0.002069f}, + {+0.155431f, +0.012048f, +0.004072f} + }, + { + {+0.415850f, +0.004534f, -0.000668f}, + {+0.414572f, -0.002652f, -0.002367f}, + {-0.124613f, -0.010725f, -0.002281f}, + {+0.397126f, -0.000677f, -0.001120f}, + {+0.014003f, -0.010619f, +0.000267f}, + {+0.170253f, +0.018842f, -0.008960f}, + {-0.241128f, +0.034417f, -0.004698f}, + {-0.359282f, -0.033550f, +0.005250f}, + {+0.216676f, -0.010427f, +0.006057f}, + {+0.120954f, -0.008613f, +0.002469f}, + {-0.268504f, -0.001802f, +0.003587f}, + {+0.013045f, +0.010217f, -0.002327f}, + {-0.059871f, -0.003931f, +0.001188f}, + {-0.132164f, +0.026563f, +0.001240f}, + {-0.403193f, -0.027848f, +0.009266f}, + {+0.190953f, +0.002021f, +0.001187f} + }, + { + {+0.399726f, -0.003989f, -0.001238f}, + {+0.392346f, +0.005321f, +0.003177f}, + {-0.072827f, +0.023138f, +0.000364f}, + {+0.417980f, -0.003176f, -0.003953f}, + {+0.044470f, +0.006065f, +0.002234f}, + {+0.111558f, -0.001243f, -0.006696f}, + {-0.306891f, -0.017879f, -0.010556f}, + {-0.227947f, +0.027747f, +0.006660f}, + {+0.285131f, -0.003545f, -0.002248f}, + {+0.160581f, +0.005372f, +0.001188f}, + {-0.228536f, +0.004194f, +0.000473f}, + {+0.021041f, -0.010096f, -0.009272f}, + {-0.021484f, +0.000358f, -0.003354f}, + {-0.213365f, -0.015260f, -0.000168f}, + {-0.303399f, +0.026027f, +0.011571f}, + {+0.212111f, -0.000447f, -0.003261f} + }, + { + {+0.378407f, +0.003850f, -0.000653f}, + {+0.380175f, +0.007586f, +0.003255f}, + {-0.012127f, -0.017400f, +0.004348f}, + {+0.420589f, +0.000881f, -0.004600f}, + {+0.082045f, -0.000538f, -0.001160f}, + {+0.069379f, -0.007873f, +0.001279f}, + {-0.364957f, -0.009593f, -0.003601f}, + {-0.103978f, -0.012644f, +0.002536f}, + {+0.322327f, -0.004962f, -0.006100f}, + {+0.208381f, -0.007687f, -0.001556f}, + {-0.193755f, -0.004206f, -0.000887f}, + {-0.012722f, -0.002660f, -0.005208f}, + {-0.021028f, +0.002645f, -0.003959f}, + {-0.256559f, +0.000206f, +0.001247f}, + {-0.175255f, -0.013434f, +0.005713f}, + {+0.216424f, -0.004406f, -0.001903f} + }, + { + {+0.355186f, -0.004417f, +0.000047f}, + {+0.367959f, -0.007051f, -0.000589f}, + {+0.030278f, -0.000745f, +0.003677f}, + {+0.419972f, +0.001580f, -0.004098f}, + {+0.126164f, +0.010538f, -0.004622f}, + {+0.036142f, -0.005050f, +0.006483f}, + {-0.395580f, +0.008424f, +0.006868f}, + {+0.004418f, +0.013200f, -0.004102f}, + {+0.338438f, +0.004391f, -0.003969f}, + {+0.257936f, +0.011270f, -0.002562f}, + {-0.157184f, +0.010190f, -0.001022f}, + {-0.066694f, -0.007499f, +0.001955f}, + {-0.058038f, -0.007898f, -0.001836f}, + {-0.252063f, +0.011457f, +0.004218f}, + {-0.038996f, +0.019229f, -0.002930f}, + {+0.207135f, -0.002683f, +0.000920f} + }, + { + {+0.333833f, +0.005141f, -0.000033f}, + {+0.354343f, +0.002376f, -0.001512f}, + {+0.044789f, +0.011943f, -0.002345f}, + {+0.420054f, -0.005203f, -0.002411f}, + {+0.168493f, -0.019086f, -0.001101f}, + {-0.000312f, +0.019974f, +0.002740f}, + {-0.404430f, +0.003854f, +0.008761f}, + {+0.101609f, -0.024344f, -0.004621f}, + {+0.343021f, -0.002003f, -0.002287f}, + {+0.300798f, -0.012232f, -0.000926f}, + {-0.115201f, -0.012523f, +0.000667f}, + {-0.124884f, +0.013322f, +0.003505f}, + {-0.124657f, +0.015080f, +0.000444f}, + {-0.208063f, -0.009838f, +0.004149f}, + {+0.098778f, -0.030234f, -0.005691f}, + {+0.191672f, +0.010274f, -0.000986f} + }, + { + {+0.317651f, -0.003399f, -0.000638f}, + {+0.342009f, -0.000734f, -0.000383f}, + {+0.041234f, -0.003266f, -0.006626f}, + {+0.412818f, +0.000564f, -0.000053f}, + {+0.193269f, +0.005756f, +0.003803f}, + {-0.038455f, -0.012921f, -0.002898f}, + {-0.397973f, -0.006421f, +0.004371f}, + {+0.186407f, +0.018164f, -0.002443f}, + {+0.339213f, -0.001972f, -0.002251f}, + {+0.327935f, +0.003077f, +0.000361f}, + {-0.072360f, +0.008411f, +0.001308f}, + {-0.171731f, -0.013927f, +0.001434f}, + {-0.206591f, -0.018817f, +0.001471f}, + {-0.140714f, +0.015540f, +0.002302f}, + {+0.227639f, +0.031497f, -0.003750f}, + {+0.179263f, -0.004105f, -0.004389f} + }, + { + {+0.307693f, +0.001076f, -0.000945f}, + {+0.334320f, +0.001717f, -0.000049f}, + {+0.033552f, -0.011447f, -0.002121f}, + {+0.387841f, +0.007421f, +0.001088f}, + {+0.192595f, +0.010377f, +0.002843f}, + {-0.067483f, -0.002402f, -0.001682f}, + {-0.373557f, +0.001444f, -0.001449f}, + {+0.251051f, -0.016030f, -0.000496f}, + {+0.323516f, +0.001530f, -0.001658f}, + {+0.335944f, +0.003218f, -0.000567f}, + {-0.034654f, -0.006672f, +0.000906f}, + {-0.193976f, +0.003406f, -0.001146f}, + {-0.284432f, +0.017472f, +0.001142f}, + {-0.067179f, -0.009754f, -0.000138f}, + {+0.329347f, -0.022749f, -0.000471f}, + {+0.172128f, -0.005358f, -0.003493f} + }, + { + {+0.301577f, +0.001184f, -0.000322f}, + {+0.332736f, -0.000666f, -0.000894f}, + {+0.023585f, -0.000609f, +0.003132f}, + {+0.344006f, -0.015803f, +0.000034f}, + {+0.177998f, -0.013137f, -0.002069f}, + {-0.082056f, +0.003433f, +0.002633f}, + {-0.324370f, +0.018955f, -0.002626f}, + {+0.287377f, +0.000225f, -0.000071f}, + {+0.290720f, -0.007672f, -0.000038f}, + {+0.329996f, -0.006498f, -0.002605f}, + {-0.003682f, +0.004563f, +0.000624f}, + {-0.185737f, +0.009876f, -0.000494f}, + {-0.338831f, -0.008465f, +0.000490f}, + {-0.000651f, +0.014424f, -0.001842f}, + {+0.385445f, -0.000494f, -0.001075f}, + {+0.160154f, +0.003230f, +0.000530f} + }, + { + {+0.294359f, +0.001008f, +0.000587f}, + {+0.335716f, -0.002537f, -0.000929f}, + {+0.006697f, +0.010781f, +0.001057f}, + {+0.292769f, +0.014442f, -0.002216f}, + {+0.173218f, -0.002305f, -0.004071f}, + {-0.084637f, +0.001890f, +0.003059f}, + {-0.253587f, -0.025906f, +0.002221f}, + {+0.295508f, +0.003624f, -0.001780f}, + {+0.240102f, +0.014422f, -0.000050f}, + {+0.320004f, -0.000226f, -0.002968f}, + {+0.025595f, -0.006552f, +0.001052f}, + {-0.154653f, -0.014381f, +0.002635f}, + {-0.357893f, -0.004680f, +0.001836f}, + {+0.050259f, -0.009177f, -0.001013f}, + {+0.390921f, +0.011091f, -0.005488f}, + {+0.128396f, +0.010797f, +0.002030f} + }, + { + {+0.281980f, -0.004479f, +0.000473f}, + {+0.338235f, +0.000938f, -0.000317f}, + {-0.016443f, -0.008216f, -0.002310f}, + {+0.250822f, -0.005381f, -0.002547f}, + {+0.194113f, +0.011993f, -0.002133f}, + {-0.078814f, -0.001480f, +0.000683f}, + {-0.178794f, +0.013791f, +0.004329f}, + {+0.286440f, -0.008258f, -0.003815f}, + {+0.180165f, -0.014312f, -0.000718f}, + {+0.312559f, +0.001222f, -0.001335f}, + {+0.061211f, +0.002642f, -0.000385f}, + {-0.117426f, +0.006897f, +0.004033f}, + {-0.342706f, +0.010139f, +0.004471f}, + {+0.079430f, +0.002660f, -0.001268f}, + {+0.356398f, -0.011250f, -0.007640f}, + {+0.072072f, -0.018003f, +0.000575f} + }, + { + {+0.264584f, +0.006225f, -0.000553f}, + {+0.334355f, +0.002104f, -0.000390f}, + {-0.041411f, +0.000660f, -0.001379f}, + {+0.227742f, -0.002231f, -0.000499f}, + {+0.236723f, -0.015277f, -0.000143f}, + {-0.066692f, -0.002089f, -0.000940f}, + {-0.116641f, -0.003621f, +0.000856f}, + {+0.274189f, -0.002260f, -0.003775f}, + {+0.124476f, +0.010538f, -0.000672f}, + {+0.307116f, -0.000375f, -0.000391f}, + {+0.109323f, -0.010339f, -0.003218f}, + {-0.087624f, +0.002282f, +0.001095f}, + {-0.305220f, -0.004246f, +0.003226f}, + {+0.088209f, -0.001890f, -0.000514f}, + {+0.297714f, +0.002109f, -0.002943f}, + {+0.002305f, +0.018254f, -0.000698f} + }, + { + {+0.245860f, -0.004071f, -0.001278f}, + {+0.320735f, -0.004451f, -0.000718f}, + {-0.064973f, -0.003268f, +0.001022f}, + {+0.221237f, +0.003408f, +0.001969f}, + {+0.282979f, +0.012181f, +0.001619f}, + {-0.050139f, +0.005534f, -0.000714f}, + {-0.071497f, +0.004571f, -0.002571f}, + {+0.265456f, +0.000937f, -0.001591f}, + {+0.084560f, -0.004757f, +0.000011f}, + {+0.300229f, -0.001315f, +0.000134f}, + {+0.168137f, +0.018612f, -0.002406f}, + {-0.066781f, +0.001637f, -0.001882f}, + {-0.257378f, +0.011005f, +0.000980f}, + {+0.083095f, -0.005045f, -0.000085f}, + {+0.224972f, -0.016565f, +0.001685f}, + {-0.061472f, -0.012660f, -0.001272f} + }, + { + {+0.229589f, +0.000720f, -0.000554f}, + {+0.297388f, +0.006061f, -0.000830f}, + {-0.086308f, +0.008311f, -0.000100f}, + {+0.220891f, +0.005343f, +0.000760f}, + {+0.312804f, +0.002048f, +0.000535f}, + {-0.033600f, -0.001954f, -0.000821f}, + {-0.037726f, -0.009547f, -0.001800f}, + {+0.256770f, -0.001354f, -0.000172f}, + {+0.064615f, +0.001499f, +0.000378f}, + {+0.288880f, +0.006082f, -0.000716f}, + {+0.223988f, -0.015499f, +0.000654f}, + {-0.048524f, -0.007439f, -0.000777f}, + {-0.208116f, -0.011040f, +0.001557f}, + {+0.074335f, +0.004704f, -0.001723f}, + {+0.146222f, +0.020815f, +0.000166f}, + {-0.103517f, +0.003200f, -0.000724f} + }, + { + {+0.216659f, -0.000775f, +0.000774f}, + {+0.266859f, -0.007292f, -0.000934f}, + {-0.105304f, -0.004788f, -0.002437f}, + {+0.217403f, -0.003973f, -0.002583f}, + {+0.318044f, -0.007929f, -0.003539f}, + {-0.023696f, +0.000702f, -0.001989f}, + {-0.008068f, +0.006711f, +0.000114f}, + {+0.242367f, -0.004361f, +0.000832f}, + {+0.061343f, +0.003214f, +0.000949f}, + {+0.273736f, -0.004941f, -0.002356f}, + {+0.260361f, +0.001261f, +0.000909f}, + {-0.027365f, +0.006696f, +0.001482f}, + {-0.163814f, +0.008052f, +0.001931f}, + {+0.071141f, -0.000562f, -0.003221f}, + {+0.073591f, -0.015255f, -0.001489f}, + {-0.121162f, +0.004631f, +0.001675f} + }, + { + {+0.205784f, +0.003757f, +0.000700f}, + {+0.232994f, +0.005953f, -0.000561f}, + {-0.123682f, -0.003377f, -0.000485f}, + {+0.205753f, -0.000981f, -0.002067f}, + {+0.304943f, +0.001966f, -0.004525f}, + {-0.026104f, -0.002420f, -0.000748f}, + {+0.021981f, -0.003022f, -0.000957f}, + {+0.220204f, +0.009944f, -0.000624f}, + {+0.066717f, -0.001208f, +0.001408f}, + {+0.258003f, -0.000477f, -0.001518f}, + {+0.270472f, +0.007879f, -0.002698f}, + {-0.001424f, -0.001591f, +0.000485f}, + {-0.125885f, -0.003310f, +0.000529f}, + {+0.074527f, -0.008121f, -0.001699f}, + {+0.017069f, +0.005535f, -0.000272f}, + {-0.124829f, -0.001926f, +0.003798f} + }, + { + {+0.196417f, -0.003644f, -0.000603f}, + {+0.199207f, -0.006086f, +0.000295f}, + {-0.146052f, -0.001687f, +0.003740f}, + {+0.182052f, -0.002076f, +0.001266f}, + {+0.282909f, +0.000690f, -0.001105f}, + {-0.044152f, -0.004210f, +0.001817f}, + {+0.054138f, +0.007409f, -0.002335f}, + {+0.196668f, -0.006189f, -0.002331f}, + {+0.072925f, -0.001260f, +0.000239f}, + {+0.242629f, -0.000541f, +0.000943f}, + {+0.260897f, -0.003994f, -0.004883f}, + {+0.029070f, +0.005485f, -0.001962f}, + {-0.092855f, +0.004046f, -0.001954f}, + {+0.076259f, +0.005415f, +0.002510f}, + {-0.019261f, -0.001366f, +0.002709f}, + {-0.127606f, -0.004435f, +0.002949f} + }, + { + {+0.189173f, +0.000560f, -0.001059f}, + {+0.167547f, +0.008258f, -0.000141f}, + {-0.174715f, +0.013815f, +0.002907f}, + {+0.145627f, +0.012083f, +0.002087f}, + {+0.256566f, +0.006772f, +0.000776f}, + {-0.075271f, +0.013763f, +0.000701f}, + {+0.085309f, -0.009140f, -0.001366f}, + {+0.180099f, +0.000959f, -0.002178f}, + {+0.077061f, -0.000891f, -0.000372f}, + {+0.225986f, +0.007128f, +0.000680f}, + {+0.242442f, +0.000129f, -0.003190f}, + {+0.061120f, -0.011120f, -0.001079f}, + {-0.062759f, -0.011288f, -0.001129f}, + {+0.065406f, +0.009942f, +0.002436f}, + {-0.038027f, +0.005472f, +0.002780f}, + {-0.134062f, +0.004375f, +0.001136f} + }, + { + {+0.183656f, +0.000923f, -0.000164f}, + {+0.139835f, -0.005429f, -0.001020f}, + {-0.202643f, -0.008873f, -0.000639f}, + {+0.102603f, -0.014782f, -0.000700f}, + {+0.227902f, -0.008291f, -0.000524f}, + {-0.108562f, -0.007847f, -0.001593f}, + {+0.108523f, +0.004720f, -0.000054f}, + {+0.172882f, +0.003322f, -0.000542f}, + {+0.078483f, -0.001260f, -0.000596f}, + {+0.207608f, -0.004999f, -0.001085f}, + {+0.221842f, -0.000718f, -0.000351f}, + {+0.087045f, +0.004787f, +0.000547f}, + {-0.037398f, +0.005336f, +0.001064f}, + {+0.041563f, -0.010757f, -0.000998f}, + {-0.043387f, -0.001956f, +0.000527f}, + {-0.140276f, -0.003188f, -0.000142f} + }, + { + {+0.177711f, +0.001442f, +0.000461f}, + {+0.115859f, +0.004532f, -0.001235f}, + {-0.218668f, -0.005427f, +0.000911f}, + {+0.063962f, +0.003468f, -0.001219f}, + {+0.198372f, +0.004393f, -0.000814f}, + {-0.132046f, -0.004112f, +0.000882f}, + {+0.118012f, +0.003780f, -0.001160f}, + {+0.169530f, -0.000759f, +0.000923f}, + {+0.077288f, -0.001422f, -0.000499f}, + {+0.187625f, -0.000022f, -0.000030f}, + {+0.200958f, +0.007075f, +0.000014f}, + {+0.099701f, +0.002974f, -0.000910f}, + {-0.019722f, +0.003866f, -0.001104f}, + {+0.014166f, +0.005774f, -0.002177f}, + {-0.039277f, -0.003862f, +0.000381f}, + {-0.138918f, -0.005302f, +0.000608f} + }, + { + {+0.169075f, -0.003877f, -0.000219f}, + {+0.092373f, -0.003200f, -0.000934f}, + {-0.217383f, +0.010383f, +0.006743f}, + {+0.037373f, +0.004176f, +0.003172f}, + {+0.168763f, -0.000238f, +0.001996f}, + {-0.140535f, +0.007256f, +0.006564f}, + {+0.113037f, -0.005040f, -0.003602f}, + {+0.161555f, -0.002184f, +0.001327f}, + {+0.073875f, +0.002628f, +0.001536f}, + {+0.165667f, +0.001239f, +0.003853f}, + {+0.179435f, -0.009646f, -0.002896f}, + {+0.097770f, -0.003616f, -0.003027f}, + {-0.009431f, -0.004981f, -0.006157f}, + {-0.008081f, +0.000345f, -0.000806f}, + {-0.031139f, +0.005138f, +0.002262f}, + {-0.125572f, +0.007103f, +0.003194f} + }, + { + {+0.156703f, +0.003123f, -0.000930f}, + {+0.066141f, +0.001589f, +0.001238f}, + {-0.199134f, -0.002236f, +0.009123f}, + {+0.024449f, +0.000091f, +0.006919f}, + {+0.141646f, +0.003103f, +0.005668f}, + {-0.133486f, +0.000744f, +0.008630f}, + {+0.097019f, -0.000327f, -0.002792f}, + {+0.144791f, +0.002980f, +0.002476f}, + {+0.068698f, +0.001637f, +0.003084f}, + {+0.144321f, +0.006179f, +0.006251f}, + {+0.155892f, +0.002625f, -0.004264f}, + {+0.084319f, +0.000388f, -0.002288f}, + {-0.006549f, -0.002981f, -0.008326f}, + {-0.021606f, -0.003867f, +0.002491f}, + {-0.023191f, -0.001810f, +0.003729f}, + {-0.101442f, -0.001244f, +0.002402f} + }, + { + {+0.140100f, -0.000742f, +0.000187f}, + {+0.036425f, -0.005652f, +0.004036f}, + {-0.165186f, -0.002894f, +0.004265f}, + {+0.025616f, -0.008625f, +0.004162f}, + {+0.121725f, -0.015558f, +0.002974f}, + {-0.111098f, -0.006811f, +0.003090f}, + {+0.072921f, -0.001667f, +0.000669f}, + {+0.120893f, -0.005073f, +0.004382f}, + {+0.065161f, -0.005346f, +0.001749f}, + {+0.129726f, -0.017304f, +0.000877f}, + {+0.126372f, +0.005082f, +0.000663f}, + {+0.063630f, -0.002788f, +0.000025f}, + {-0.013562f, +0.008476f, -0.004178f}, + {-0.027532f, -0.002871f, +0.003910f}, + {-0.014651f, +0.000004f, +0.003901f}, + {-0.068381f, +0.002931f, -0.001605f} + } +}; + +const float rightHRIRReal_HOA3[BINAURAL_CONVBANDS][HOA3_CHANNELS][BINAURAL_NTAPS_SBA]= +{ + { + {+0.353305f, +0.566845f, +0.200116f}, + {-0.451504f, +0.563006f, -0.083565f}, + {+0.022092f, +0.111945f, -0.003135f}, + {+0.047133f, +0.000194f, -0.000386f}, + {-0.039375f, +0.036049f, +0.015307f}, + {-0.013502f, +0.004406f, -0.016833f}, + {-0.050267f, +0.058356f, +0.017434f}, + {-0.013681f, +0.080836f, -0.019699f}, + {-0.037136f, +0.024371f, +0.052200f}, + {-0.050122f, +0.078803f, +0.019790f}, + {+0.004565f, -0.007656f, +0.001338f}, + {-0.009821f, +0.051585f, +0.003219f}, + {-0.003833f, -0.023411f, -0.003160f}, + {+0.007736f, -0.042621f, +0.010291f}, + {+0.014210f, -0.003392f, -0.001270f}, + {-0.005609f, +0.001063f, +0.001854f} + }, + { + {+0.011160f, -0.509237f, -0.132176f}, + {-0.142996f, +0.819544f, -0.093135f}, + {+0.003358f, +0.077333f, -0.008548f}, + {+0.004495f, +0.024167f, +0.025614f}, + {-0.020911f, -0.057490f, -0.024558f}, + {-0.020938f, -0.024631f, -0.022840f}, + {-0.049990f, -0.113634f, -0.053590f}, + {+0.010020f, +0.210234f, +0.026992f}, + {-0.094579f, -0.407023f, -0.103353f}, + {-0.038956f, -0.088489f, -0.058039f}, + {-0.002875f, -0.015645f, +0.000778f}, + {-0.020714f, -0.104784f, -0.070444f}, + {-0.008794f, +0.002924f, +0.009615f}, + {+0.004361f, -0.056762f, +0.007070f}, + {+0.010128f, +0.073116f, +0.035032f}, + {-0.005641f, -0.006012f, -0.000245f} + }, + { + {-0.192410f, -0.206164f, -0.191132f}, + {+0.278956f, -0.236216f, +0.253095f}, + {-0.002616f, +0.068222f, +0.000710f}, + {-0.043976f, +0.107663f, +0.006000f}, + {+0.022830f, -0.121862f, -0.008267f}, + {-0.007646f, -0.104913f, +0.016048f}, + {+0.008805f, -0.278895f, +0.005919f}, + {+0.015200f, +0.180293f, +0.037960f}, + {-0.037987f, -0.531186f, -0.053722f}, + {+0.053411f, -0.405963f, +0.066106f}, + {-0.004225f, -0.049392f, +0.020098f}, + {+0.032849f, -0.404382f, +0.057080f}, + {-0.020343f, +0.025697f, +0.003018f}, + {+0.000399f, -0.049237f, +0.005564f}, + {-0.018895f, +0.170897f, -0.004768f}, + {-0.014229f, +0.049740f, -0.026663f} + }, + { + {-0.062917f, +0.511673f, +0.062418f}, + {+0.164174f, -1.090974f, -0.108397f}, + {+0.009127f, +0.065188f, -0.003083f}, + {-0.018593f, +0.081738f, -0.000771f}, + {+0.020686f, -0.093603f, -0.012011f}, + {-0.000826f, -0.118498f, +0.001498f}, + {+0.025996f, -0.307659f, -0.023797f}, + {-0.008194f, +0.054598f, -0.009722f}, + {+0.040351f, -0.445888f, -0.056326f}, + {+0.030847f, -0.708631f, -0.081623f}, + {-0.002063f, -0.033938f, +0.025075f}, + {+0.027403f, -0.458795f, +0.033429f}, + {-0.021373f, -0.007009f, -0.010388f}, + {-0.002090f, -0.031407f, +0.008158f}, + {-0.028475f, +0.071069f, -0.046847f}, + {-0.007602f, +0.116385f, +0.002531f} + }, + { + {+0.114739f, +0.069536f, +0.170911f}, + {-0.106068f, -0.653946f, -0.186091f}, + {+0.032435f, +0.023922f, +0.003440f}, + {+0.048701f, +0.139999f, -0.053329f}, + {-0.008680f, -0.251941f, +0.071200f}, + {+0.004397f, -0.120323f, -0.000310f}, + {+0.025654f, -0.324361f, -0.006461f}, + {-0.004810f, +0.061858f, -0.007597f}, + {+0.097919f, -0.641143f, +0.015289f}, + {-0.011357f, -0.557580f, -0.143138f}, + {-0.004726f, +0.016709f, -0.000434f}, + {-0.013229f, -0.166606f, -0.093126f}, + {-0.007411f, +0.011792f, -0.021547f}, + {-0.005396f, -0.034575f, +0.011453f}, + {+0.010644f, +0.011719f, -0.021909f}, + {+0.005419f, +0.030988f, +0.043631f} + }, + { + {+0.066623f, -0.089947f, +0.096291f}, + {-0.228582f, -0.462839f, -0.023355f}, + {+0.030597f, +0.055459f, +0.010541f}, + {+0.104887f, +0.337465f, -0.003674f}, + {-0.072691f, -0.405228f, +0.038864f}, + {-0.004864f, -0.081470f, +0.022241f}, + {+0.026067f, -0.215427f, +0.055659f}, + {+0.015556f, +0.034465f, -0.026853f}, + {+0.081559f, -0.329728f, +0.167841f}, + {-0.004434f, -0.224966f, +0.027520f}, + {-0.000854f, +0.017986f, -0.001169f}, + {+0.017103f, -0.022207f, -0.026879f}, + {+0.016949f, +0.070641f, -0.004353f}, + {-0.006585f, -0.086138f, -0.004695f}, + {+0.059412f, +0.107209f, +0.004895f}, + {+0.005676f, -0.059162f, +0.003180f} + }, + { + {-0.248577f, +0.462186f, -0.044825f}, + {-0.092220f, -0.576619f, -0.031483f}, + {-0.018552f, +0.118241f, -0.000190f}, + {+0.024038f, +0.192235f, +0.076006f}, + {-0.073463f, -0.111697f, -0.085309f}, + {-0.045418f, -0.052428f, +0.014128f}, + {+0.004341f, -0.088144f, -0.002830f}, + {+0.058183f, -0.067481f, +0.003537f}, + {-0.112838f, +0.181474f, -0.013812f}, + {-0.051144f, -0.057123f, -0.036471f}, + {+0.002310f, +0.009489f, +0.002928f}, + {+0.036815f, -0.070367f, -0.013190f}, + {+0.025238f, +0.001933f, +0.022381f}, + {+0.011799f, -0.070089f, -0.017261f}, + {+0.079383f, -0.005050f, +0.042259f}, + {+0.027513f, -0.031781f, -0.014727f} + }, + { + {-0.588729f, +0.069942f, -0.118192f}, + {+0.336864f, +0.087523f, +0.133178f}, + {-0.091818f, +0.000222f, -0.031435f}, + {-0.240072f, -0.209090f, -0.026656f}, + {+0.106536f, +0.210008f, +0.006949f}, + {-0.086566f, -0.077574f, +0.013942f}, + {+0.036640f, -0.012230f, +0.021355f}, + {+0.059977f, -0.024737f, +0.017673f}, + {-0.214469f, +0.026100f, -0.046140f}, + {-0.016107f, +0.082852f, +0.011968f}, + {+0.003608f, -0.021470f, -0.008749f}, + {+0.046323f, +0.010871f, +0.015628f}, + {-0.008214f, -0.079699f, -0.002987f}, + {+0.052373f, +0.029312f, +0.014086f}, + {+0.018742f, -0.113603f, +0.010455f}, + {+0.059520f, +0.032936f, +0.004294f} + }, + { + {-0.672439f, -0.199370f, +0.003424f}, + {+0.631922f, +0.138094f, +0.043549f}, + {-0.130748f, -0.058055f, -0.001266f}, + {-0.452933f, -0.003480f, -0.056408f}, + {+0.285057f, -0.030036f, +0.056968f}, + {-0.110275f, +0.011467f, -0.016793f}, + {+0.065972f, +0.005614f, +0.004420f}, + {-0.003151f, +0.047883f, +0.002061f}, + {-0.163084f, -0.130815f, +0.001810f}, + {+0.019555f, +0.025290f, +0.023258f}, + {+0.018781f, -0.034389f, -0.006142f}, + {+0.002509f, +0.046479f, +0.009162f}, + {-0.041047f, -0.024011f, -0.016940f}, + {+0.065623f, +0.027310f, +0.010505f}, + {-0.073560f, +0.039971f, -0.029159f}, + {+0.062876f, +0.006797f, +0.012019f} + }, + { + {-0.543455f, +0.059523f, +0.064094f}, + {+0.700107f, -0.080270f, -0.041520f}, + {-0.154990f, -0.009275f, +0.018360f}, + {-0.474326f, +0.126377f, -0.003035f}, + {+0.327360f, -0.114048f, +0.014833f}, + {-0.071241f, +0.058994f, -0.004572f}, + {+0.087784f, +0.000125f, -0.001107f}, + {-0.094160f, -0.038960f, -0.011917f}, + {-0.019089f, +0.055284f, +0.038765f}, + {+0.023647f, -0.039958f, -0.003588f}, + {+0.043021f, +0.013443f, +0.008032f}, + {-0.077825f, -0.044990f, -0.010103f}, + {-0.040861f, +0.021619f, +0.002193f}, + {+0.044745f, -0.030859f, -0.007951f}, + {-0.123807f, +0.055927f, -0.012492f}, + {+0.025663f, -0.034745f, +0.003611f} + }, + { + {-0.336060f, +0.028886f, +0.031505f}, + {+0.587287f, +0.009083f, -0.042775f}, + {-0.182505f, +0.025753f, +0.007772f}, + {-0.327915f, -0.064183f, +0.035026f}, + {+0.233666f, +0.067260f, -0.031214f}, + {+0.007323f, -0.030500f, +0.014877f}, + {+0.086165f, +0.005866f, -0.002682f}, + {-0.157983f, -0.017671f, -0.007972f}, + {+0.103610f, +0.038997f, +0.019660f}, + {+0.007681f, +0.004657f, -0.015128f}, + {+0.055812f, +0.017923f, +0.003300f}, + {-0.143968f, -0.013845f, -0.008347f}, + {-0.017716f, -0.004963f, +0.006287f}, + {+0.008786f, -0.012160f, -0.007210f}, + {-0.121102f, -0.034578f, +0.019391f}, + {-0.032193f, +0.031317f, -0.010154f} + }, + { + {-0.153248f, -0.008370f, -0.009310f}, + {+0.402033f, -0.000118f, -0.012937f}, + {-0.199763f, -0.006595f, +0.001228f}, + {-0.128842f, +0.004526f, +0.020419f}, + {+0.092842f, +0.010605f, -0.021993f}, + {+0.077909f, -0.025349f, +0.002895f}, + {+0.057392f, -0.008479f, -0.003710f}, + {-0.165419f, +0.022789f, +0.007822f}, + {+0.148908f, -0.037324f, -0.013709f}, + {-0.011296f, +0.018097f, -0.005621f}, + {+0.055136f, -0.008613f, -0.006635f}, + {-0.160576f, +0.015557f, +0.006131f}, + {+0.014844f, -0.003364f, +0.000064f}, + {-0.027453f, -0.001660f, +0.003786f}, + {-0.097934f, -0.032125f, +0.013700f}, + {-0.074549f, +0.020854f, -0.006292f} + }, + { + {-0.021458f, -0.031294f, -0.015786f}, + {+0.225566f, +0.016671f, +0.005476f}, + {-0.179128f, -0.006436f, +0.000989f}, + {+0.030888f, -0.004116f, -0.001010f}, + {-0.023526f, -0.004404f, +0.002301f}, + {+0.113727f, +0.001584f, -0.014207f}, + {+0.006187f, +0.003628f, -0.000322f}, + {-0.130415f, +0.000132f, +0.008388f}, + {+0.133114f, -0.001415f, -0.020106f}, + {-0.026233f, -0.006894f, +0.005590f}, + {+0.046982f, -0.011852f, -0.003518f}, + {-0.124161f, -0.003790f, +0.005992f}, + {+0.039303f, -0.005121f, -0.003574f}, + {-0.061746f, +0.020157f, -0.000385f}, + {-0.073801f, +0.016410f, -0.009153f}, + {-0.089034f, -0.008662f, +0.006612f} + }, + { + {+0.079072f, +0.039673f, -0.003004f}, + {+0.077618f, -0.033045f, +0.007328f}, + {-0.090967f, +0.027848f, +0.000971f}, + {+0.121511f, -0.002007f, -0.010039f}, + {-0.095609f, -0.005944f, +0.008880f}, + {+0.100415f, +0.015820f, -0.006869f}, + {-0.060544f, -0.012856f, +0.004470f}, + {-0.077695f, +0.001667f, -0.001003f}, + {+0.092912f, +0.018201f, -0.005273f}, + {-0.040823f, -0.014455f, +0.004325f}, + {+0.030102f, -0.002197f, +0.002719f}, + {-0.043620f, +0.016980f, +0.000122f}, + {+0.041014f, +0.001499f, -0.001303f}, + {-0.088431f, +0.009078f, -0.001327f}, + {-0.051030f, +0.024992f, -0.008833f}, + {-0.091055f, -0.011437f, +0.003728f} + }, + { + {+0.165755f, -0.020564f, +0.004876f}, + {-0.050384f, +0.037239f, +0.000994f}, + {+0.070084f, -0.036144f, -0.001750f}, + {+0.168503f, -0.016906f, -0.008961f}, + {-0.141507f, +0.014408f, +0.005947f}, + {+0.022796f, +0.010807f, +0.007047f}, + {-0.126569f, +0.016739f, +0.005274f}, + {-0.026827f, -0.017151f, -0.002196f}, + {+0.045512f, +0.004295f, +0.005991f}, + {-0.054896f, +0.008311f, -0.001754f}, + {+0.003645f, +0.010307f, +0.002009f}, + {+0.057176f, -0.014805f, -0.004774f}, + {+0.011072f, +0.010642f, -0.000248f}, + {-0.108885f, -0.004650f, +0.007771f}, + {-0.039664f, -0.018793f, +0.005550f}, + {-0.092338f, -0.000767f, -0.000795f} + }, + { + {+0.239774f, +0.007034f, +0.002631f}, + {-0.158490f, -0.023748f, -0.003698f}, + {+0.270403f, +0.044381f, -0.006888f}, + {+0.208319f, +0.016522f, -0.001863f}, + {-0.188853f, -0.017009f, +0.001321f}, + {-0.109689f, -0.039932f, +0.010880f}, + {-0.162224f, -0.011965f, +0.002284f}, + {+0.008275f, +0.010941f, +0.003208f}, + {-0.008632f, -0.022468f, +0.003767f}, + {-0.062087f, +0.004201f, -0.001503f}, + {-0.024938f, -0.010189f, -0.000489f}, + {+0.144572f, +0.021004f, -0.007356f}, + {-0.046268f, -0.010126f, +0.001327f}, + {-0.126844f, -0.020412f, +0.005586f}, + {-0.049688f, -0.012221f, +0.009513f}, + {-0.100800f, -0.001133f, +0.001097f} + }, + { + {+0.298828f, -0.005793f, -0.001373f}, + {-0.237768f, +0.008765f, -0.003046f}, + {+0.449357f, -0.047352f, -0.004642f}, + {+0.250753f, -0.004865f, -0.001957f}, + {-0.245484f, +0.010819f, +0.000881f}, + {-0.249706f, +0.049408f, +0.003961f}, + {-0.136738f, -0.008753f, -0.001855f}, + {+0.025853f, +0.003385f, +0.004139f}, + {-0.065934f, +0.022501f, -0.003288f}, + {-0.057527f, -0.008394f, +0.002717f}, + {-0.046206f, +0.004855f, -0.002123f}, + {+0.183725f, -0.015903f, -0.001405f}, + {-0.114051f, +0.012348f, +0.005264f}, + {-0.129436f, +0.010088f, -0.004805f}, + {-0.071460f, +0.022939f, +0.001488f}, + {-0.119149f, +0.009223f, +0.000555f} + }, + { + {+0.346011f, +0.008343f, -0.002521f}, + {-0.286535f, +0.000576f, +0.000480f}, + {+0.541635f, +0.014116f, +0.002290f}, + {+0.286228f, +0.009795f, -0.003869f}, + {-0.299965f, -0.009735f, +0.003167f}, + {-0.328736f, -0.018968f, -0.006082f}, + {-0.037520f, +0.034439f, -0.002184f}, + {+0.042204f, -0.003541f, +0.000630f}, + {-0.115659f, -0.004656f, -0.004969f}, + {-0.039051f, +0.003041f, +0.004257f}, + {-0.056424f, -0.001120f, -0.003167f}, + {+0.144869f, -0.019123f, +0.003415f}, + {-0.166286f, -0.018086f, +0.003983f}, + {-0.101679f, +0.021538f, -0.005021f}, + {-0.078280f, -0.006671f, -0.006794f}, + {-0.140047f, -0.004747f, -0.001252f} + }, + { + {+0.388388f, -0.009881f, -0.001847f}, + {-0.316128f, +0.000090f, +0.004009f}, + {+0.513290f, +0.035603f, +0.000300f}, + {+0.296513f, -0.005786f, -0.000267f}, + {-0.333378f, +0.007221f, +0.002877f}, + {-0.295424f, -0.041070f, -0.003600f}, + {+0.114311f, -0.042170f, +0.000214f}, + {+0.081378f, -0.006284f, -0.003240f}, + {-0.150267f, -0.005614f, +0.000485f}, + {-0.005390f, -0.000214f, +0.000390f}, + {-0.064645f, -0.002835f, -0.002892f}, + {+0.026756f, +0.044985f, -0.000392f}, + {-0.170480f, -0.001979f, -0.000156f}, + {-0.050780f, -0.025790f, +0.003317f}, + {-0.047515f, -0.026029f, -0.004739f}, + {-0.153995f, -0.004894f, +0.001183f} + }, + { + {+0.430636f, +0.009808f, -0.001195f}, + {-0.343293f, -0.010478f, +0.003913f}, + {+0.388765f, -0.049553f, -0.008265f}, + {+0.266407f, -0.016789f, +0.000864f}, + {-0.328141f, +0.007654f, +0.002512f}, + {-0.155445f, +0.060858f, +0.009380f}, + {+0.269010f, +0.026881f, -0.000978f}, + {+0.158656f, +0.025362f, -0.003743f}, + {-0.171832f, +0.002756f, +0.006554f}, + {+0.043647f, +0.009482f, -0.003918f}, + {-0.090667f, +0.001476f, +0.001048f}, + {-0.132548f, -0.036105f, -0.003022f}, + {-0.106351f, +0.024154f, -0.000421f}, + {-0.000521f, +0.009705f, +0.007542f}, + {+0.019829f, +0.036619f, +0.006700f}, + {-0.155900f, +0.002824f, +0.004883f} + }, + { + {+0.471455f, -0.008296f, -0.001200f}, + {-0.377731f, +0.016768f, -0.000590f}, + {+0.234888f, +0.026343f, -0.008776f}, + {+0.198215f, +0.029257f, -0.004797f}, + {-0.279113f, -0.015431f, +0.003236f}, + {+0.033581f, -0.032760f, +0.011351f}, + {+0.370767f, -0.006318f, -0.006828f}, + {+0.266209f, -0.029783f, -0.001410f}, + {-0.185419f, +0.012636f, +0.005498f}, + {+0.100533f, -0.019010f, -0.003209f}, + {-0.151097f, +0.010446f, +0.007094f}, + {-0.274631f, +0.012724f, +0.003901f}, + {+0.013966f, -0.029859f, -0.001195f}, + {+0.031705f, +0.010192f, +0.002683f}, + {+0.102880f, -0.011055f, +0.011106f}, + {-0.143777f, +0.006427f, +0.002026f} + }, + { + {+0.505485f, +0.006321f, -0.001405f}, + {-0.419164f, -0.009705f, -0.004024f}, + {+0.115231f, -0.006245f, -0.000430f}, + {+0.110599f, -0.013787f, -0.006578f}, + {-0.197526f, +0.015552f, +0.000736f}, + {+0.208411f, +0.008219f, -0.002566f}, + {+0.381442f, -0.001142f, -0.007728f}, + {+0.371664f, +0.016115f, -0.002975f}, + {-0.191819f, -0.017185f, -0.004447f}, + {+0.147317f, +0.015855f, +0.001243f}, + {-0.239821f, -0.029217f, +0.008681f}, + {-0.348287f, -0.007454f, +0.010181f}, + {+0.149521f, +0.030650f, -0.003365f}, + {+0.048588f, -0.006717f, -0.005355f}, + {+0.186826f, -0.010831f, -0.001024f}, + {-0.115953f, +0.001790f, -0.004618f} + }, + { + {+0.527959f, -0.004605f, -0.000793f}, + {-0.465933f, -0.000734f, -0.000648f}, + {+0.058769f, +0.003399f, +0.003980f}, + {+0.020939f, +0.002500f, +0.001602f}, + {-0.102989f, -0.023640f, -0.000907f}, + {+0.330754f, -0.015227f, -0.013490f}, + {+0.293504f, +0.012966f, +0.002367f}, + {+0.435673f, -0.007769f, -0.006056f}, + {-0.189456f, -0.010551f, -0.008519f}, + {+0.165864f, +0.001568f, +0.003516f}, + {-0.320806f, +0.034715f, +0.000873f}, + {-0.324855f, +0.004016f, +0.002288f}, + {+0.248230f, -0.023651f, -0.001117f}, + {+0.067435f, -0.016300f, -0.003833f}, + {+0.272913f, -0.007587f, -0.015541f}, + {-0.076620f, -0.021772f, -0.003143f} + }, + { + {+0.537963f, +0.000122f, -0.000129f}, + {-0.521439f, -0.006120f, +0.005687f}, + {+0.059349f, +0.002731f, +0.001179f}, + {-0.063524f, -0.015179f, +0.008462f}, + {-0.018295f, +0.018831f, +0.001086f}, + {+0.382316f, +0.020820f, -0.008228f}, + {+0.133723f, -0.051158f, +0.007642f}, + {+0.427333f, -0.004801f, -0.004396f}, + {-0.189172f, +0.025571f, +0.003440f}, + {+0.153064f, -0.017940f, -0.000618f}, + {-0.344855f, -0.000841f, -0.007255f}, + {-0.204120f, +0.035702f, -0.007554f}, + {+0.269414f, -0.005639f, +0.002449f}, + {+0.098719f, +0.013856f, +0.002962f}, + {+0.355359f, +0.040342f, -0.012703f}, + {-0.043435f, +0.014923f, +0.004398f} + }, + { + {+0.539918f, +0.002520f, -0.000803f}, + {-0.586780f, +0.022878f, +0.005664f}, + {+0.088465f, -0.012487f, -0.000009f}, + {-0.133857f, +0.024436f, +0.005429f}, + {+0.038815f, -0.004600f, +0.001199f}, + {+0.354019f, +0.005760f, +0.002225f}, + {-0.035479f, +0.061479f, -0.003852f}, + {+0.333448f, +0.030542f, -0.002292f}, + {-0.214917f, +0.009773f, +0.013046f}, + {+0.126578f, +0.010093f, -0.005470f}, + {-0.286447f, -0.044878f, -0.001444f}, + {-0.026257f, -0.067149f, -0.001093f}, + {+0.208042f, +0.035382f, -0.000884f}, + {+0.140716f, -0.000405f, +0.001329f}, + {+0.398750f, -0.026334f, +0.002502f}, + {-0.035058f, +0.007558f, +0.005919f} + }, + { + {+0.542223f, +0.000691f, -0.001439f}, + {-0.649673f, -0.023205f, -0.000535f}, + {+0.109219f, +0.005980f, +0.002282f}, + {-0.171779f, -0.010220f, -0.000656f}, + {+0.066150f, -0.005365f, -0.002547f}, + {+0.254746f, -0.041005f, +0.002026f}, + {-0.138924f, -0.008674f, -0.012149f}, + {+0.169249f, -0.044112f, -0.002599f}, + {-0.272638f, -0.040677f, +0.004640f}, + {+0.110153f, +0.006462f, -0.003434f}, + {-0.169903f, +0.042984f, +0.010056f}, + {+0.132794f, +0.036153f, +0.009130f}, + {+0.102112f, -0.031703f, -0.006139f}, + {+0.188913f, +0.004870f, -0.004839f}, + {+0.357390f, -0.030371f, +0.006291f}, + {-0.051114f, -0.020551f, -0.000894f} + }, + { + {+0.551847f, -0.004875f, -0.000679f}, + {-0.690272f, +0.004312f, -0.004016f}, + {+0.095639f, +0.010071f, +0.002809f}, + {-0.161818f, -0.013824f, -0.000790f}, + {+0.076081f, -0.002390f, -0.004308f}, + {+0.122361f, +0.040035f, -0.004601f}, + {-0.144006f, -0.036671f, -0.003198f}, + {-0.024466f, +0.039610f, -0.000882f}, + {-0.331827f, +0.020929f, -0.006635f}, + {+0.113319f, -0.007876f, +0.000927f}, + {-0.048322f, -0.009251f, +0.008004f}, + {+0.207982f, +0.015726f, +0.004350f}, + {+0.006949f, +0.009330f, -0.004246f}, + {+0.233905f, -0.014811f, -0.005355f}, + {+0.223143f, +0.054998f, -0.002434f}, + {-0.070208f, +0.002186f, -0.004895f} + }, + { + {+0.570043f, +0.005432f, +0.000103f}, + {-0.699360f, +0.014398f, +0.000427f}, + {+0.048501f, -0.018143f, +0.001306f}, + {-0.107295f, +0.023902f, +0.003671f}, + {+0.082584f, +0.006076f, -0.001731f}, + {+0.005834f, -0.019340f, -0.006865f}, + {-0.085415f, +0.035831f, +0.009933f}, + {-0.202459f, -0.035934f, +0.000303f}, + {-0.353113f, +0.015051f, -0.004263f}, + {+0.130123f, +0.004257f, +0.001776f}, + {+0.043254f, +0.003167f, -0.001496f}, + {+0.189334f, -0.031601f, -0.007634f}, + {-0.040215f, +0.005301f, +0.001534f}, + {+0.256999f, +0.008098f, -0.001598f}, + {+0.036347f, -0.049036f, -0.008301f}, + {-0.070389f, +0.011544f, -0.000794f} + }, + { + {+0.593416f, -0.005649f, +0.000278f}, + {-0.688298f, -0.007364f, +0.005463f}, + {-0.008044f, +0.018190f, -0.001207f}, + {-0.030689f, -0.015365f, +0.004543f}, + {+0.091891f, -0.004696f, +0.000919f}, + {-0.064670f, -0.007573f, -0.000965f}, + {-0.030187f, +0.002153f, +0.010834f}, + {-0.331404f, +0.015975f, +0.000858f}, + {-0.323976f, -0.025164f, +0.004961f}, + {+0.148829f, +0.000188f, -0.000078f}, + {+0.101305f, -0.006103f, -0.005181f}, + {+0.115300f, +0.016832f, -0.010749f}, + {-0.032766f, -0.011589f, +0.005290f}, + {+0.239406f, +0.007974f, +0.000705f}, + {-0.145255f, +0.023713f, -0.004941f}, + {-0.046369f, -0.012177f, +0.003695f} + }, + { + {+0.616579f, +0.002929f, -0.000295f}, + {-0.676588f, -0.004629f, +0.003842f}, + {-0.043537f, -0.004766f, -0.003324f}, + {+0.044220f, +0.013845f, +0.003072f}, + {+0.101856f, -0.006437f, -0.001748f}, + {-0.092523f, +0.007377f, +0.006975f}, + {-0.023470f, -0.026713f, -0.000479f}, + {-0.400554f, +0.001062f, +0.004867f}, + {-0.261565f, +0.014128f, +0.007944f}, + {+0.159121f, -0.002751f, -0.002980f}, + {+0.138765f, +0.008950f, -0.004189f}, + {+0.034625f, +0.000481f, -0.002727f}, + {+0.012613f, +0.005909f, +0.003331f}, + {+0.175748f, -0.024801f, -0.000902f}, + {-0.281594f, -0.008334f, +0.003990f}, + {-0.007054f, +0.002604f, +0.002155f} + }, + { + {+0.635179f, -0.002823f, -0.001148f}, + {-0.674199f, +0.007986f, -0.000991f}, + {-0.041014f, -0.013849f, -0.001185f}, + {+0.104750f, -0.003964f, +0.000987f}, + {+0.107619f, -0.003736f, -0.004502f}, + {-0.101204f, +0.003739f, +0.008397f}, + {-0.064575f, +0.021388f, -0.009658f}, + {-0.422196f, -0.004265f, +0.008954f}, + {-0.190975f, -0.003688f, +0.002622f}, + {+0.155793f, -0.001509f, -0.003088f}, + {+0.169274f, -0.008874f, -0.002289f}, + {-0.023162f, +0.001981f, +0.005597f}, + {+0.073018f, -0.010252f, -0.000970f}, + {+0.080452f, +0.024265f, -0.002891f}, + {-0.363635f, +0.004698f, +0.010523f}, + {+0.035663f, -0.006812f, -0.001722f} + }, + { + {+0.647447f, +0.003124f, -0.000778f}, + {-0.678396f, +0.001222f, -0.002175f}, + {-0.008003f, +0.018788f, +0.004232f}, + {+0.153771f, +0.006824f, -0.001505f}, + {+0.102284f, +0.006283f, -0.000369f}, + {-0.107854f, -0.015766f, +0.002536f}, + {-0.127703f, -0.002824f, -0.007472f}, + {-0.415367f, -0.005027f, +0.007128f}, + {-0.124975f, +0.011994f, -0.001327f}, + {+0.135698f, -0.002841f, -0.000522f}, + {+0.197083f, +0.008952f, -0.000525f}, + {-0.049410f, -0.008433f, +0.005306f}, + {+0.128034f, +0.008755f, -0.002993f}, + {-0.020098f, -0.017083f, -0.001266f}, + {-0.399229f, -0.010519f, +0.009961f}, + {+0.073610f, +0.013100f, -0.000219f} + }, + { + {+0.653287f, -0.000651f, -0.000132f}, + {-0.682914f, -0.002014f, +0.000124f}, + {+0.032972f, -0.005837f, +0.006215f}, + {+0.202805f, -0.008225f, -0.002812f}, + {+0.078083f, +0.005921f, +0.003749f}, + {-0.111320f, +0.004540f, -0.003693f}, + {-0.194460f, +0.001719f, +0.000738f}, + {-0.388630f, -0.001712f, +0.002133f}, + {-0.064250f, -0.011691f, -0.000978f}, + {+0.097911f, +0.010340f, +0.000589f}, + {+0.217935f, -0.002537f, +0.000189f}, + {-0.043003f, +0.001190f, +0.000648f}, + {+0.160424f, -0.006445f, -0.003025f}, + {-0.102796f, +0.011222f, +0.001449f}, + {-0.392994f, +0.003832f, +0.004205f}, + {+0.101814f, -0.004741f, +0.002529f} + }, + { + {+0.655085f, -0.000496f, -0.000073f}, + {-0.685269f, -0.000562f, +0.000824f}, + {+0.064749f, -0.008716f, +0.000371f}, + {+0.258268f, +0.016126f, -0.002727f}, + {+0.038467f, -0.019915f, +0.001374f}, + {-0.101519f, +0.013031f, -0.001724f}, + {-0.262717f, -0.010913f, +0.005785f}, + {-0.340935f, +0.010917f, -0.000109f}, + {-0.005117f, +0.011670f, -0.001141f}, + {+0.047975f, -0.015016f, -0.000510f}, + {+0.227673f, -0.001545f, -0.000844f}, + {-0.006815f, +0.010613f, -0.001679f}, + {+0.158152f, -0.002971f, -0.001763f}, + {-0.154604f, -0.004393f, +0.003495f}, + {-0.341946f, +0.012918f, +0.000060f}, + {+0.123129f, -0.003187f, +0.000554f} + }, + { + {+0.657162f, +0.001154f, -0.000704f}, + {-0.686405f, +0.001174f, -0.000024f}, + {+0.087607f, -0.002335f, -0.004967f}, + {+0.314889f, -0.015378f, -0.000770f}, + {+0.001549f, +0.013009f, -0.003904f}, + {-0.077871f, -0.011151f, +0.003120f}, + {-0.333383f, +0.022033f, +0.004891f}, + {-0.273704f, -0.019370f, +0.000308f}, + {+0.054701f, -0.011371f, -0.002150f}, + {-0.003312f, +0.012026f, -0.002061f}, + {+0.228798f, +0.001402f, -0.001592f}, + {+0.048684f, -0.018229f, -0.000520f}, + {+0.117088f, +0.012634f, -0.000896f}, + {-0.173410f, +0.001735f, +0.003820f}, + {-0.247906f, -0.029903f, +0.000682f}, + {+0.148293f, -0.000926f, -0.003582f} + }, + { + {+0.663635f, +0.002010f, -0.001316f}, + {-0.689882f, +0.000220f, -0.000110f}, + {+0.108949f, +0.013447f, -0.002013f}, + {+0.358661f, +0.009695f, +0.001033f}, + {-0.013352f, +0.004281f, -0.004550f}, + {-0.049096f, +0.001505f, +0.002637f}, + {-0.398463f, -0.021957f, -0.000327f}, + {-0.196600f, +0.019778f, +0.001903f}, + {+0.110988f, +0.014423f, -0.001867f}, + {-0.045870f, -0.004558f, -0.001576f}, + {+0.228188f, -0.000097f, -0.001476f}, + {+0.105835f, +0.015244f, +0.001995f}, + {+0.044580f, -0.021539f, -0.001382f}, + {-0.164082f, +0.001655f, +0.001885f}, + {-0.126620f, +0.032568f, +0.003705f}, + {+0.185481f, +0.013419f, -0.004184f} + }, + { + {+0.675624f, -0.004827f, -0.000839f}, + {-0.700179f, +0.002102f, +0.000678f}, + {+0.128613f, -0.006572f, +0.002141f}, + {+0.378743f, +0.002887f, +0.000648f}, + {-0.004220f, -0.012669f, -0.000801f}, + {-0.022440f, -0.000653f, -0.000869f}, + {-0.441665f, +0.002210f, -0.002042f}, + {-0.124814f, -0.014411f, +0.002833f}, + {+0.153596f, -0.007894f, -0.000675f}, + {-0.077085f, +0.001217f, +0.000703f}, + {+0.231308f, +0.000725f, -0.002147f}, + {+0.147273f, -0.003213f, +0.002198f}, + {-0.042268f, +0.020842f, -0.002800f}, + {-0.133721f, -0.009739f, +0.001057f}, + {-0.003152f, -0.021386f, +0.003714f}, + {+0.229253f, -0.015325f, -0.001319f} + }, + { + {+0.689875f, +0.004735f, +0.000183f}, + {-0.720017f, -0.006167f, +0.000699f}, + {+0.141755f, -0.003516f, +0.000834f}, + {+0.376706f, -0.006807f, -0.001713f}, + {+0.011000f, +0.005016f, +0.001618f}, + {-0.000647f, +0.004137f, -0.002283f}, + {-0.454292f, +0.009561f, +0.002281f}, + {-0.069428f, +0.004651f, +0.001574f}, + {+0.172906f, +0.000456f, -0.000712f}, + {-0.102160f, -0.005230f, +0.001608f}, + {+0.237600f, +0.001176f, -0.003651f}, + {+0.166513f, -0.006046f, -0.001258f}, + {-0.123162f, -0.009523f, -0.000972f}, + {-0.093037f, +0.007808f, +0.000738f}, + {+0.101706f, +0.008107f, -0.001772f}, + {+0.261899f, +0.005910f, +0.000263f} + }, + { + {+0.701449f, -0.001309f, +0.000513f}, + {-0.747852f, +0.007083f, +0.000295f}, + {+0.146674f, +0.002063f, -0.002067f}, + {+0.365508f, +0.004005f, -0.003093f}, + {+0.009820f, +0.003073f, +0.001694f}, + {+0.014954f, -0.005079f, -0.001243f}, + {-0.444057f, -0.005273f, +0.005170f}, + {-0.030220f, -0.001713f, -0.001402f}, + {+0.167308f, +0.005594f, -0.001307f}, + {-0.126894f, +0.005843f, +0.001163f}, + {+0.239461f, -0.006087f, -0.002206f}, + {+0.171030f, +0.001130f, -0.003837f}, + {-0.185728f, +0.008176f, +0.002303f}, + {-0.053859f, -0.008398f, -0.000003f}, + {+0.180213f, -0.012225f, -0.006311f}, + {+0.267399f, +0.003688f, -0.000070f} + }, + { + {+0.707682f, -0.001614f, -0.000417f}, + {-0.778938f, -0.006537f, +0.000334f}, + {+0.145291f, +0.002890f, -0.001284f}, + {+0.359528f, +0.005062f, -0.001469f}, + {-0.019378f, -0.015221f, +0.000076f}, + {+0.021977f, +0.000916f, -0.000266f}, + {-0.425305f, -0.000822f, +0.003160f}, + {+0.002113f, +0.007052f, -0.002427f}, + {+0.143996f, -0.006679f, -0.001487f}, + {-0.153276f, -0.008199f, +0.000318f}, + {+0.224106f, -0.002607f, +0.000957f}, + {+0.172702f, +0.005631f, -0.001975f}, + {-0.227595f, -0.009189f, +0.001906f}, + {-0.024550f, +0.006878f, +0.000998f}, + {+0.231993f, +0.016149f, -0.003555f}, + {+0.242520f, -0.012045f, -0.001170f} + }, + { + {+0.709804f, +0.000997f, -0.001515f}, + {-0.808027f, +0.005290f, +0.000583f}, + {+0.139809f, +0.000435f, +0.000818f}, + {+0.365924f, -0.006226f, +0.001737f}, + {-0.071369f, +0.017742f, -0.003060f}, + {+0.017802f, +0.003027f, -0.000621f}, + {-0.407651f, -0.000451f, +0.000175f}, + {+0.034591f, -0.007791f, -0.002030f}, + {+0.114950f, +0.006228f, -0.001120f}, + {-0.179490f, +0.006128f, -0.000795f}, + {+0.183246f, +0.015768f, +0.000773f}, + {+0.177035f, -0.003531f, +0.000696f}, + {-0.250400f, +0.001355f, +0.001108f}, + {-0.008187f, +0.000159f, +0.001456f}, + {+0.254611f, -0.001384f, -0.000532f}, + {+0.198496f, +0.013948f, -0.002759f} + }, + { + {+0.710823f, +0.002381f, -0.001069f}, + {-0.831214f, -0.003447f, +0.000878f}, + {+0.132056f, -0.007797f, -0.000969f}, + {+0.382880f, -0.001094f, +0.000711f}, + {-0.129160f, -0.007502f, -0.002763f}, + {+0.003161f, -0.000767f, +0.000443f}, + {-0.392711f, +0.006305f, +0.000815f}, + {+0.067053f, +0.011901f, -0.000327f}, + {+0.090742f, -0.003835f, -0.000996f}, + {-0.202084f, -0.000560f, +0.000195f}, + {+0.122322f, -0.020924f, -0.002535f}, + {+0.182462f, -0.002778f, -0.000258f}, + {-0.259161f, +0.001293f, +0.002195f}, + {+0.000645f, -0.003627f, -0.000469f}, + {+0.248733f, -0.007401f, -0.001654f}, + {+0.153178f, -0.008546f, -0.003483f} + }, + { + {+0.712186f, -0.002003f, +0.000341f}, + {-0.846788f, +0.001521f, +0.001394f}, + {+0.124294f, +0.003415f, -0.004317f}, + {+0.406372f, -0.002613f, -0.002804f}, + {-0.179207f, +0.002493f, +0.001438f}, + {-0.017437f, +0.004122f, +0.002593f}, + {-0.378082f, -0.002349f, +0.002279f}, + {+0.093160f, -0.004321f, +0.001305f}, + {+0.077016f, -0.001502f, +0.000076f}, + {-0.220676f, +0.001245f, +0.002361f}, + {+0.057208f, +0.011096f, -0.003599f}, + {+0.185276f, +0.001151f, -0.002614f}, + {-0.259729f, -0.001827f, +0.003455f}, + {+0.012127f, +0.000504f, -0.003413f}, + {+0.221948f, +0.010321f, -0.003531f}, + {+0.118717f, -0.000242f, -0.001468f} + }, + { + {+0.713662f, -0.000828f, +0.000545f}, + {-0.855438f, -0.002950f, +0.000977f}, + {+0.115830f, +0.005727f, -0.002674f}, + {+0.431080f, +0.008386f, -0.003025f}, + {-0.218522f, -0.008054f, +0.003300f}, + {-0.036091f, -0.008702f, +0.001428f}, + {-0.359216f, +0.001218f, +0.000904f}, + {+0.107642f, -0.001544f, +0.000220f}, + {+0.072571f, -0.000752f, +0.000715f}, + {-0.237634f, -0.007061f, +0.001792f}, + {+0.001551f, -0.003678f, -0.000322f}, + {+0.181633f, +0.003122f, -0.001514f}, + {-0.255564f, -0.003731f, +0.002293f}, + {+0.032826f, +0.012636f, -0.002484f}, + {+0.185211f, -0.004024f, -0.002705f}, + {+0.094101f, -0.001623f, +0.001061f} + }, + { + {+0.715808f, +0.001447f, -0.000564f}, + {-0.858599f, +0.000128f, +0.000166f}, + {+0.099314f, +0.001041f, +0.001297f}, + {+0.448457f, -0.007760f, -0.000064f}, + {-0.248826f, +0.008996f, +0.001277f}, + {-0.041985f, +0.000319f, -0.000791f}, + {-0.330901f, -0.006650f, -0.000552f}, + {+0.113746f, +0.002963f, -0.001774f}, + {+0.073588f, -0.000327f, +0.000159f}, + {-0.253601f, +0.004683f, -0.000245f}, + {-0.041369f, +0.004973f, +0.002735f}, + {+0.166731f, +0.003863f, +0.000533f}, + {-0.246518f, -0.001268f, -0.000049f}, + {+0.057814f, -0.010629f, +0.001615f}, + {+0.147641f, +0.004485f, +0.000244f}, + {+0.070521f, +0.005007f, +0.001670f} + }, + { + {+0.720382f, +0.001583f, -0.001168f}, + {-0.858507f, +0.001602f, +0.000561f}, + {+0.067329f, -0.015190f, +0.000273f}, + {+0.450274f, -0.005070f, +0.000753f}, + {-0.271109f, -0.002256f, +0.000399f}, + {-0.028488f, +0.011815f, +0.001154f}, + {-0.292330f, +0.012166f, +0.000199f}, + {+0.120202f, +0.001560f, -0.002785f}, + {+0.077618f, +0.000385f, -0.000057f}, + {-0.267478f, +0.001019f, +0.000455f}, + {-0.074822f, -0.008817f, +0.002528f}, + {+0.138952f, -0.011104f, -0.000590f}, + {-0.231196f, +0.009528f, +0.001492f}, + {+0.074656f, -0.000989f, +0.002061f}, + {+0.113858f, -0.008628f, +0.000648f}, + {+0.041189f, -0.009773f, +0.000867f} + }, + { + {+0.728412f, -0.003781f, -0.000442f}, + {-0.858915f, -0.000641f, +0.001243f}, + {+0.021588f, +0.015568f, -0.003718f}, + {+0.435021f, +0.011190f, -0.002580f}, + {-0.286107f, -0.000454f, +0.002042f}, + {+0.001012f, -0.010763f, +0.004584f}, + {-0.248323f, -0.011164f, +0.001788f}, + {+0.134196f, -0.006281f, -0.001978f}, + {+0.082702f, +0.001367f, -0.001190f}, + {-0.278772f, -0.000302f, +0.002741f}, + {-0.102933f, +0.009391f, -0.000025f}, + {+0.103537f, +0.008673f, -0.002139f}, + {-0.211947f, -0.006496f, +0.004418f}, + {+0.077185f, +0.005220f, -0.000312f}, + {+0.087037f, +0.006765f, -0.000943f}, + {+0.005530f, +0.010882f, -0.000993f} + }, + { + {+0.738976f, +0.002329f, +0.000136f}, + {-0.861896f, +0.000932f, +0.002377f}, + {-0.029402f, -0.003271f, -0.002468f}, + {+0.408989f, -0.003243f, -0.003584f}, + {-0.293612f, -0.002313f, +0.002730f}, + {+0.038002f, +0.000412f, +0.002803f}, + {-0.206194f, +0.003320f, +0.000488f}, + {+0.155421f, +0.006078f, -0.001116f}, + {+0.087818f, +0.003223f, -0.001518f}, + {-0.285833f, -0.006231f, +0.001960f}, + {-0.128249f, -0.001074f, -0.000243f}, + {+0.068575f, -0.002940f, -0.000700f}, + {-0.191804f, -0.003014f, +0.002724f}, + {+0.067942f, -0.005643f, -0.002245f}, + {+0.068213f, -0.000980f, -0.001053f}, + {-0.030778f, -0.002407f, -0.000036f} + }, + { + {+0.750300f, +0.000058f, -0.000825f}, + {-0.866279f, +0.001749f, +0.003432f}, + {-0.078123f, -0.003921f, +0.005991f}, + {+0.379010f, -0.005518f, +0.002243f}, + {-0.292486f, +0.009941f, -0.001947f}, + {+0.075433f, +0.005336f, -0.005378f}, + {-0.170771f, -0.002341f, -0.003169f}, + {+0.177886f, -0.005886f, -0.000679f}, + {+0.091281f, -0.005785f, +0.001198f}, + {-0.285767f, +0.012433f, -0.005156f}, + {-0.152796f, -0.004962f, +0.005079f}, + {+0.040112f, +0.002644f, +0.001940f}, + {-0.171647f, +0.007661f, -0.004705f}, + {+0.053028f, -0.000873f, -0.001571f}, + {+0.054373f, -0.002064f, +0.001211f}, + {-0.062123f, +0.000837f, +0.004082f} + }, + { + {+0.760695f, +0.000187f, -0.002580f}, + {-0.869383f, -0.005374f, +0.001979f}, + {-0.118984f, -0.003432f, +0.014567f}, + {+0.349914f, +0.003949f, +0.011712f}, + {-0.283867f, -0.008607f, -0.011966f}, + {+0.106829f, +0.003798f, -0.012953f}, + {-0.143863f, +0.007735f, -0.004012f}, + {+0.195900f, +0.004792f, +0.000560f}, + {+0.091845f, +0.002959f, +0.004936f}, + {-0.279043f, -0.006225f, -0.015628f}, + {-0.177000f, +0.001330f, +0.012704f}, + {+0.021476f, -0.006516f, +0.001630f}, + {-0.154239f, +0.000969f, -0.011998f}, + {+0.037152f, +0.007671f, +0.004251f}, + {+0.041126f, +0.001005f, +0.004482f}, + {-0.085797f, -0.005363f, +0.006097f} + } +}; + +const float rightHRIRImag_HOA3[BINAURAL_CONVBANDS][HOA3_CHANNELS][BINAURAL_NTAPS_SBA]= +{ + { + {-0.191323f, +0.550462f, -0.164703f}, + {+0.179339f, -0.105827f, -0.022109f}, + {-0.016317f, +0.069138f, -0.026386f}, + {-0.031302f, +0.044550f, -0.011983f}, + {+0.011873f, +0.049933f, -0.022817f}, + {-0.002100f, +0.025417f, -0.008917f}, + {+0.008673f, +0.072165f, -0.030658f}, + {+0.009984f, -0.046099f, +0.014260f}, + {-0.017932f, +0.200113f, -0.071972f}, + {+0.009948f, +0.076380f, -0.035799f}, + {-0.000500f, -0.013211f, +0.007415f}, + {+0.005467f, +0.017109f, -0.007909f}, + {-0.001381f, -0.024397f, +0.011565f}, + {+0.001735f, -0.017167f, +0.009148f}, + {-0.006994f, -0.015041f, +0.007364f}, + {-0.000274f, +0.004190f, -0.001467f} + }, + { + {-0.330036f, +0.333647f, -0.215680f}, + {+0.446962f, +0.557076f, +0.195252f}, + {-0.017152f, +0.086610f, -0.016060f}, + {-0.053984f, +0.030859f, -0.007361f}, + {+0.031663f, +0.050397f, -0.030580f}, + {-0.013130f, -0.075028f, -0.055072f}, + {+0.035680f, +0.080722f, -0.037346f}, + {+0.011258f, -0.044042f, +0.013548f}, + {+0.004710f, +0.152351f, -0.099878f}, + {+0.054304f, +0.216938f, +0.014289f}, + {-0.014461f, -0.090558f, -0.026436f}, + {+0.019523f, +0.056800f, +0.001967f}, + {-0.012667f, -0.065948f, -0.004877f}, + {-0.011111f, -0.088384f, -0.022179f}, + {-0.018869f, -0.025704f, +0.006997f}, + {+0.000817f, +0.008300f, +0.000651f} + }, + { + {-0.096856f, -0.591788f, +0.084769f}, + {+0.247542f, +1.016515f, +0.073842f}, + {-0.000574f, +0.046908f, -0.004371f}, + {-0.019540f, +0.031177f, -0.013825f}, + {+0.037796f, -0.124420f, +0.041797f}, + {+0.007360f, -0.192733f, -0.007619f}, + {+0.072377f, -0.160383f, +0.061576f}, + {-0.003711f, +0.021943f, -0.004227f}, + {+0.112964f, -0.363004f, +0.093285f}, + {+0.056746f, +0.090813f, +0.072980f}, + {-0.006103f, -0.134417f, -0.008866f}, + {+0.005326f, +0.101653f, -0.016759f}, + {-0.002749f, -0.090650f, +0.006843f}, + {-0.000089f, -0.179843f, +0.016051f}, + {+0.001814f, -0.087437f, +0.037078f}, + {+0.005267f, -0.010738f, +0.007098f} + }, + { + {+0.063555f, -0.411417f, +0.075756f}, + {-0.093014f, +0.372322f, -0.077805f}, + {+0.007107f, +0.054992f, -0.008311f}, + {+0.033886f, +0.080359f, -0.013428f}, + {-0.014436f, -0.207733f, +0.015885f}, + {+0.013408f, -0.128849f, +0.020860f}, + {+0.024255f, -0.374328f, -0.023256f}, + {-0.002134f, +0.023939f, +0.000696f}, + {+0.058983f, -0.666227f, -0.050398f}, + {+0.014357f, +0.059836f, +0.078919f}, + {+0.009066f, -0.055606f, +0.025373f}, + {+0.008234f, +0.193844f, +0.040018f}, + {+0.010778f, -0.088365f, +0.004018f}, + {+0.007190f, -0.141067f, +0.033486f}, + {+0.015950f, -0.182801f, -0.014037f}, + {-0.004549f, -0.103305f, -0.035896f} + }, + { + {+0.019484f, -0.338410f, +0.083536f}, + {-0.202040f, +0.634536f, -0.185332f}, + {+0.007949f, -0.067812f, +0.047529f}, + {+0.048582f, -0.153833f, +0.075433f}, + {-0.054773f, +0.008273f, -0.058696f}, + {-0.024929f, +0.021715f, -0.041866f}, + {-0.026392f, -0.170362f, -0.104628f}, + {+0.014816f, -0.001719f, +0.003760f}, + {-0.050384f, -0.474129f, -0.111890f}, + {-0.050928f, +0.326828f, -0.037272f}, + {+0.005968f, -0.019903f, +0.009428f}, + {+0.002366f, +0.233633f, +0.019586f}, + {+0.014235f, -0.074982f, -0.008001f}, + {-0.003852f, +0.000864f, -0.026540f}, + {+0.024596f, -0.140123f, -0.045292f}, + {+0.007335f, -0.140212f, -0.016737f} + }, + { + {-0.203259f, -0.677311f, +0.036974f}, + {+0.017307f, +0.878070f, -0.170118f}, + {-0.043215f, -0.181813f, +0.012035f}, + {-0.067120f, -0.199982f, +0.078357f}, + {+0.003334f, +0.005382f, -0.060963f}, + {-0.037369f, +0.095076f, -0.002797f}, + {-0.007145f, +0.024172f, -0.016239f}, + {+0.025809f, +0.035193f, +0.010462f}, + {-0.123278f, -0.317455f, +0.005941f}, + {-0.071780f, +0.152842f, -0.115403f}, + {+0.009047f, -0.007435f, +0.015219f}, + {-0.009240f, +0.131025f, -0.037457f}, + {+0.010330f, -0.013791f, +0.019556f}, + {+0.018073f, +0.051639f, -0.007415f}, + {+0.023065f, +0.024816f, +0.028060f}, + {+0.023145f, -0.072535f, +0.012653f} + }, + { + {-0.363585f, -0.196908f, -0.132849f}, + {+0.400794f, -0.061111f, +0.146774f}, + {-0.088996f, -0.035461f, -0.039728f}, + {-0.248102f, +0.210034f, -0.044008f}, + {+0.136603f, -0.269455f, +0.014678f}, + {-0.039867f, +0.056544f, +0.018785f}, + {+0.012335f, -0.061064f, +0.014746f}, + {+0.001640f, +0.021263f, +0.019567f}, + {-0.164395f, -0.120409f, -0.065761f}, + {-0.005008f, -0.124444f, -0.002355f}, + {+0.006089f, +0.036166f, -0.003168f}, + {-0.008972f, +0.027316f, +0.008811f}, + {-0.026456f, +0.074066f, -0.007831f}, + {+0.036264f, -0.025445f, +0.017552f}, + {-0.046783f, +0.110385f, +0.011511f}, + {+0.016634f, -0.063190f, +0.003470f} + }, + { + {-0.140043f, +0.331564f, +0.031879f}, + {+0.418213f, -0.323867f, +0.026950f}, + {-0.066524f, +0.078043f, +0.003209f}, + {-0.275295f, +0.106284f, -0.069212f}, + {+0.205855f, -0.059809f, +0.074823f}, + {-0.024267f, -0.018141f, -0.016347f}, + {+0.021686f, -0.056152f, +0.012278f}, + {-0.065157f, -0.071098f, -0.001681f}, + {-0.025332f, +0.159594f, +0.013561f}, + {+0.029475f, -0.035218f, +0.023811f}, + {+0.011328f, +0.030605f, -0.007685f}, + {-0.054740f, -0.020295f, -0.000302f}, + {-0.047455f, +0.027854f, -0.019731f}, + {+0.022053f, -0.039858f, +0.012679f}, + {-0.116347f, -0.040132f, -0.032026f}, + {-0.007321f, -0.043491f, +0.015668f} + }, + { + {+0.232420f, -0.042183f, +0.090352f}, + {+0.143907f, +0.128870f, -0.081606f}, + {-0.019255f, -0.008481f, +0.025359f}, + {-0.079364f, -0.195197f, +0.009060f}, + {+0.092435f, +0.165349f, +0.007306f}, + {+0.037358f, -0.066958f, -0.009347f}, + {+0.002010f, -0.000201f, -0.007048f}, + {-0.118479f, -0.000141f, -0.016298f}, + {+0.131479f, -0.025371f, +0.046423f}, + {+0.013254f, +0.056073f, -0.007964f}, + {+0.020421f, -0.014051f, +0.008057f}, + {-0.102505f, +0.044999f, -0.012472f}, + {-0.028717f, -0.037569f, +0.002612f}, + {-0.021286f, +0.036718f, -0.008001f}, + {-0.110557f, -0.093273f, -0.012580f}, + {-0.060924f, +0.023756f, -0.000190f} + }, + { + {+0.533983f, -0.079000f, +0.018330f}, + {-0.217748f, +0.012931f, -0.048151f}, + {+0.025802f, -0.036354f, +0.006267f}, + {+0.205140f, +0.060899f, +0.046660f}, + {-0.113290f, -0.081234f, -0.041909f}, + {+0.105415f, +0.030348f, +0.015181f}, + {-0.034112f, -0.007984f, -0.002032f}, + {-0.109019f, +0.032142f, -0.005021f}, + {+0.186112f, -0.090334f, +0.010289f}, + {-0.018376f, +0.004638f, -0.018235f}, + {+0.011521f, -0.024596f, +0.005093f}, + {-0.106685f, +0.043319f, -0.011207f}, + {+0.003719f, +0.002813f, +0.009833f}, + {-0.061529f, +0.014049f, -0.008239f}, + {-0.045872f, +0.041391f, +0.025100f}, + {-0.106073f, -0.025839f, -0.009219f} + }, + { + {+0.689088f, +0.021676f, -0.035498f}, + {-0.512497f, -0.013050f, +0.008139f}, + {+0.080900f, -0.013233f, -0.008488f}, + {+0.415840f, +0.041814f, +0.013996f}, + {-0.278767f, -0.050484f, -0.020716f}, + {+0.124237f, +0.048494f, +0.003541f}, + {-0.083860f, +0.012095f, -0.001839f}, + {-0.040470f, -0.043256f, +0.009440f}, + {+0.127554f, +0.052174f, -0.027560f}, + {-0.038197f, -0.025553f, -0.002386f}, + {-0.013296f, +0.017618f, -0.006802f}, + {-0.049000f, -0.034411f, +0.008434f}, + {+0.023951f, +0.015385f, +0.000397f}, + {-0.079741f, -0.014689f, +0.006056f}, + {+0.015937f, +0.036771f, +0.013501f}, + {-0.116284f, -0.032742f, -0.005608f} + }, + { + {+0.733240f, +0.033897f, -0.028463f}, + {-0.683283f, -0.019108f, +0.024422f}, + {+0.165878f, +0.024612f, -0.005353f}, + {+0.489377f, -0.026929f, -0.018187f}, + {-0.343135f, +0.029846f, +0.016631f}, + {+0.086256f, -0.016816f, -0.014815f}, + {-0.129107f, +0.000075f, +0.000830f}, + {+0.047145f, -0.000801f, +0.008881f}, + {+0.023844f, +0.003992f, -0.023086f}, + {-0.042301f, +0.008336f, +0.009579f}, + {-0.039371f, +0.014019f, -0.003266f}, + {+0.037930f, +0.005491f, +0.006528f}, + {+0.020403f, -0.000483f, -0.004551f}, + {-0.081119f, -0.016241f, +0.003920f}, + {+0.051945f, -0.020771f, -0.013605f}, + {-0.091078f, +0.021518f, +0.009604f} + }, + { + {+0.733114f, -0.029809f, -0.003150f}, + {-0.758988f, +0.025935f, +0.015102f}, + {+0.280906f, -0.031811f, -0.003778f}, + {+0.459117f, +0.008405f, -0.019040f}, + {-0.333055f, +0.004022f, +0.017856f}, + {+0.012149f, -0.009636f, -0.003754f}, + {-0.156853f, +0.003236f, +0.004887f}, + {+0.114968f, +0.002815f, -0.004184f}, + {-0.064559f, -0.023528f, +0.001333f}, + {-0.039134f, +0.015161f, +0.005522f}, + {-0.063282f, +0.001881f, +0.005278f}, + {+0.121057f, -0.006821f, -0.003568f}, + {-0.006828f, +0.002343f, -0.000194f}, + {-0.069156f, -0.009861f, -0.001545f}, + {+0.070362f, -0.029774f, -0.011253f}, + {-0.061366f, +0.013312f, +0.005905f} + }, + { + {+0.724625f, -0.001203f, +0.006316f}, + {-0.787100f, -0.019364f, +0.003117f}, + {+0.401617f, +0.025467f, -0.004330f}, + {+0.392760f, +0.000769f, -0.009132f}, + {-0.296783f, -0.006051f, +0.006244f}, + {-0.080677f, -0.011855f, +0.011409f}, + {-0.155686f, -0.003923f, +0.003032f}, + {+0.152027f, +0.011289f, -0.005772f}, + {-0.122199f, -0.008679f, +0.013528f}, + {-0.032224f, -0.005650f, -0.003051f}, + {-0.086101f, -0.012645f, +0.003029f}, + {+0.171824f, +0.008018f, -0.006233f}, + {-0.049811f, -0.010853f, +0.002128f}, + {-0.046385f, +0.014661f, +0.005149f}, + {+0.075593f, +0.018900f, +0.006819f}, + {-0.042682f, -0.001204f, -0.002701f} + }, + { + {+0.710313f, +0.016351f, +0.000594f}, + {-0.788202f, -0.001698f, -0.001880f}, + {+0.478276f, -0.009988f, -0.006465f}, + {+0.338553f, -0.006580f, +0.000873f}, + {-0.267876f, +0.004181f, -0.000561f}, + {-0.161632f, +0.031504f, +0.010015f}, + {-0.112024f, -0.007981f, -0.001560f}, + {+0.161078f, -0.006395f, +0.000785f}, + {-0.159938f, +0.023767f, +0.006167f}, + {-0.016977f, -0.011649f, -0.002458f}, + {-0.101033f, +0.005466f, -0.000979f}, + {+0.168147f, +0.002987f, -0.004477f}, + {-0.090853f, +0.008103f, +0.002155f}, + {-0.019160f, +0.010061f, +0.003516f}, + {+0.068113f, +0.017356f, +0.008667f}, + {-0.034415f, -0.006094f, -0.000653f} + }, + { + {+0.687296f, -0.010309f, -0.005056f}, + {-0.764260f, +0.015559f, +0.000832f}, + {+0.464886f, -0.002946f, -0.003297f}, + {+0.298384f, -0.012876f, +0.002489f}, + {-0.246598f, +0.005940f, -0.001267f}, + {-0.184060f, -0.014332f, -0.000763f}, + {-0.024137f, +0.022250f, -0.004819f}, + {+0.154151f, -0.010440f, +0.001340f}, + {-0.181725f, -0.011644f, -0.002738f}, + {+0.007528f, +0.010988f, +0.002133f}, + {-0.103221f, +0.002109f, -0.001628f}, + {+0.103776f, -0.007568f, +0.001735f}, + {-0.108578f, +0.000395f, +0.003349f}, + {+0.017935f, -0.001653f, -0.006823f}, + {+0.063247f, -0.018078f, -0.002599f}, + {-0.031929f, -0.003751f, +0.000579f} + }, + { + {+0.659915f, +0.003181f, -0.004789f}, + {-0.723641f, -0.015598f, +0.004701f}, + {+0.344320f, +0.034439f, +0.003396f}, + {+0.252485f, +0.010951f, -0.000869f}, + {-0.213766f, -0.011294f, +0.001229f}, + {-0.112272f, -0.023126f, -0.008479f}, + {+0.086512f, -0.032942f, -0.003959f}, + {+0.151070f, +0.005416f, -0.003241f}, + {-0.183618f, -0.008669f, -0.002985f}, + {+0.037360f, -0.003147f, +0.002379f}, + {-0.095879f, -0.005536f, -0.000670f}, + {-0.009973f, +0.033041f, +0.006312f}, + {-0.086652f, -0.000941f, +0.001227f}, + {+0.070708f, -0.028404f, -0.005854f}, + {+0.082798f, -0.007130f, -0.008870f}, + {-0.024953f, -0.002080f, -0.001188f} + }, + { + {+0.634763f, -0.001208f, -0.002397f}, + {-0.683670f, +0.007693f, +0.006039f}, + {+0.143818f, -0.065248f, +0.001626f}, + {+0.187585f, -0.010607f, +0.001657f}, + {-0.155102f, +0.012347f, +0.000836f}, + {+0.047669f, +0.064360f, -0.004465f}, + {+0.176375f, +0.020282f, -0.000832f}, + {+0.166599f, +0.005868f, -0.005383f}, + {-0.165581f, +0.017111f, +0.003241f}, + {+0.067470f, -0.001639f, -0.002026f}, + {-0.090399f, +0.004464f, +0.000923f}, + {-0.138735f, -0.040116f, +0.001857f}, + {-0.018624f, +0.015969f, -0.003767f}, + {+0.124121f, +0.022397f, +0.003509f}, + {+0.132318f, +0.030070f, -0.004033f}, + {-0.005451f, +0.010583f, +0.000461f} + }, + { + {+0.613639f, +0.002441f, -0.000996f}, + {-0.658994f, +0.004033f, +0.003708f}, + {-0.066781f, +0.052613f, -0.005380f}, + {+0.103141f, +0.024662f, +0.003094f}, + {-0.069224f, -0.020885f, -0.001016f}, + {+0.237901f, -0.057325f, +0.006669f}, + {+0.198251f, +0.008139f, -0.001238f}, + {+0.196297f, -0.014019f, -0.004087f}, + {-0.137085f, -0.006189f, +0.006787f}, + {+0.092626f, -0.005231f, -0.005081f}, + {-0.098805f, -0.001528f, +0.003973f}, + {-0.227978f, +0.011869f, -0.001188f}, + {+0.083502f, -0.031761f, -0.003653f}, + {+0.154304f, +0.003532f, +0.005157f}, + {+0.192731f, -0.026618f, +0.005738f}, + {+0.025619f, -0.008251f, +0.002697f} + }, + { + {+0.592443f, -0.004265f, -0.000675f}, + {-0.651475f, -0.007639f, -0.001077f}, + {-0.211884f, -0.008375f, -0.003618f}, + {+0.015847f, -0.026610f, -0.001288f}, + {+0.030980f, +0.024402f, -0.000682f}, + {+0.377865f, +0.004628f, +0.005328f}, + {+0.127740f, -0.031243f, -0.004692f}, + {+0.216064f, +0.008428f, -0.000840f}, + {-0.107665f, -0.004148f, +0.003207f}, + {+0.104222f, +0.007982f, -0.002781f}, + {-0.121055f, -0.007151f, +0.006643f}, + {-0.232842f, +0.021111f, +0.004010f}, + {+0.181984f, +0.020598f, -0.002112f}, + {+0.154857f, -0.016563f, -0.001311f}, + {+0.234230f, -0.006972f, +0.006138f}, + {+0.062816f, -0.000374f, -0.000261f} + }, + { + {+0.565815f, +0.006621f, -0.000731f}, + {-0.652157f, -0.001839f, -0.002786f}, + {-0.256941f, -0.016709f, +0.005201f}, + {-0.049457f, +0.004802f, -0.002568f}, + {+0.121870f, -0.014390f, -0.001453f}, + {+0.418806f, +0.025565f, -0.008436f}, + {-0.023252f, +0.033441f, -0.003455f}, + {+0.192750f, +0.014454f, -0.000969f}, + {-0.080190f, +0.006138f, -0.004702f}, + {+0.090978f, +0.000288f, +0.001642f}, + {-0.136520f, +0.012063f, +0.004637f}, + {-0.143202f, -0.027531f, +0.007344f}, + {+0.230859f, -0.004544f, -0.002668f}, + {+0.140224f, +0.009293f, -0.007214f}, + {+0.242282f, +0.025199f, -0.006229f}, + {+0.100859f, -0.005416f, -0.004924f} + }, + { + {+0.532337f, -0.007417f, -0.000543f}, + {-0.652955f, +0.010368f, +0.001740f}, + {-0.220699f, +0.013404f, +0.007323f}, + {-0.077945f, +0.013141f, +0.004826f}, + {+0.182039f, +0.009934f, -0.002503f}, + {+0.362601f, -0.019757f, -0.014603f}, + {-0.211924f, -0.030990f, +0.005294f}, + {+0.105625f, -0.028087f, -0.003678f}, + {-0.054535f, +0.015575f, -0.006139f}, + {+0.049202f, -0.015528f, +0.003083f}, + {-0.111395f, -0.002877f, -0.002743f}, + {+0.015299f, +0.023373f, -0.001099f}, + {+0.201870f, -0.009975f, -0.000096f}, + {+0.130715f, +0.012877f, -0.003882f}, + {+0.221564f, -0.009858f, -0.016146f}, + {+0.132494f, +0.017520f, -0.002095f} + }, + { + {+0.495834f, +0.008532f, -0.000369f}, + {-0.652356f, -0.003292f, +0.006811f}, + {-0.149624f, -0.011936f, +0.002662f}, + {-0.071256f, -0.002030f, +0.009341f}, + {+0.200363f, -0.000872f, -0.001071f}, + {+0.238216f, +0.009887f, -0.004541f}, + {-0.381151f, +0.041781f, +0.008291f}, + {-0.039667f, +0.026941f, +0.000063f}, + {-0.036683f, -0.023635f, +0.004916f}, + {-0.009186f, +0.024708f, -0.001260f}, + {-0.023299f, -0.026996f, -0.008496f}, + {+0.194696f, -0.039072f, -0.009744f}, + {+0.098003f, +0.033287f, +0.002536f}, + {+0.131758f, -0.006621f, +0.002658f}, + {+0.173806f, -0.018597f, -0.006932f}, + {+0.145380f, -0.006223f, +0.004430f} + }, + { + {+0.463299f, -0.007155f, -0.000770f}, + {-0.648076f, -0.009295f, +0.004610f}, + {-0.089513f, +0.010398f, +0.000359f}, + {-0.033244f, -0.002975f, +0.003236f}, + {+0.178153f, -0.013477f, -0.001343f}, + {+0.077802f, -0.029144f, +0.007460f}, + {-0.474851f, -0.029171f, -0.001803f}, + {-0.217055f, -0.041281f, +0.004828f}, + {-0.037249f, -0.008239f, +0.011497f}, + {-0.059921f, -0.009759f, -0.005233f}, + {+0.114758f, +0.056676f, -0.002229f}, + {+0.334964f, +0.046076f, -0.002995f}, + {-0.042473f, -0.043913f, -0.000922f}, + {+0.133390f, -0.007415f, +0.001167f}, + {+0.081735f, -0.007332f, +0.010523f}, + {+0.133499f, -0.015420f, +0.003583f} + }, + { + {+0.441203f, +0.002482f, -0.000824f}, + {-0.629545f, +0.003537f, -0.002292f}, + {-0.068500f, -0.000883f, +0.001586f}, + {+0.038519f, -0.014498f, -0.003426f}, + {+0.131180f, +0.015847f, -0.003732f}, + {-0.083693f, +0.047317f, +0.005981f}, + {-0.461803f, -0.022290f, -0.008344f}, + {-0.384732f, +0.037693f, +0.003505f}, + {-0.048144f, +0.029049f, +0.001374f}, + {-0.084768f, -0.008739f, -0.001947f}, + {+0.251499f, -0.035994f, +0.008053f}, + {+0.379916f, -0.000042f, +0.006724f}, + {-0.160178f, +0.020677f, -0.004025f}, + {+0.124411f, +0.010697f, -0.004992f}, + {-0.067302f, +0.056203f, +0.010926f}, + {+0.110573f, +0.015976f, -0.002867f} + }, + { + {+0.430897f, +0.000433f, -0.000350f}, + {-0.586004f, +0.017187f, -0.004129f}, + {-0.087700f, -0.011728f, +0.002208f}, + {+0.139979f, +0.032148f, -0.002572f}, + {+0.080931f, -0.008008f, -0.004145f}, + {-0.204274f, -0.031020f, -0.002988f}, + {-0.365555f, +0.057171f, +0.001535f}, + {-0.496090f, -0.014326f, +0.002762f}, + {-0.036347f, -0.000076f, -0.009610f}, + {-0.087371f, +0.006753f, +0.002953f}, + {+0.332582f, -0.010055f, +0.004412f}, + {+0.314151f, -0.048523f, +0.001669f}, + {-0.210677f, +0.006259f, -0.001554f}, + {+0.097223f, +0.002730f, -0.004153f}, + {-0.243214f, -0.058784f, -0.001131f}, + {+0.100970f, +0.001509f, -0.005827f} + }, + { + {+0.427847f, -0.001191f, +0.000192f}, + {-0.522040f, -0.027328f, +0.001322f}, + {-0.123746f, +0.015960f, -0.000425f}, + {+0.250557f, -0.029225f, +0.001401f}, + {+0.041411f, -0.001671f, -0.000435f}, + {-0.251666f, -0.011713f, -0.002737f}, + {-0.259410f, -0.030558f, +0.013501f}, + {-0.523363f, -0.008886f, +0.005097f}, + {+0.023565f, -0.037779f, -0.005281f}, + {-0.085570f, +0.002595f, +0.003055f}, + {+0.343956f, +0.022947f, -0.008052f}, + {+0.182050f, +0.049717f, -0.010139f}, + {-0.188646f, -0.025113f, +0.004590f}, + {+0.043971f, +0.008025f, +0.002158f}, + {-0.383316f, +0.019159f, -0.004800f}, + {+0.118679f, -0.020135f, -0.001036f} + }, + { + {+0.424775f, -0.001427f, +0.000274f}, + {-0.458547f, +0.013186f, +0.005324f}, + {-0.143005f, -0.001551f, -0.002520f}, + {+0.342091f, +0.013355f, +0.001866f}, + {+0.012473f, -0.005183f, +0.002228f}, + {-0.229007f, +0.024031f, +0.004922f}, + {-0.213143f, -0.021386f, +0.008846f}, + {-0.469349f, +0.018839f, +0.005224f}, + {+0.120107f, +0.037044f, +0.005367f}, + {-0.094940f, -0.009229f, -0.000146f}, + {+0.312164f, -0.002650f, -0.009985f}, + {+0.056636f, -0.008288f, -0.009234f}, + {-0.124730f, +0.013388f, +0.006509f}, + {-0.037461f, -0.023127f, +0.003625f}, + {-0.438903f, +0.013352f, +0.002069f}, + {+0.155431f, +0.012048f, +0.004072f} + }, + { + {+0.415850f, +0.004534f, -0.000668f}, + {-0.414572f, +0.002652f, +0.002367f}, + {-0.124613f, -0.010725f, -0.002281f}, + {+0.397126f, -0.000677f, -0.001120f}, + {-0.014003f, +0.010619f, -0.000267f}, + {-0.170253f, -0.018842f, +0.008960f}, + {-0.241128f, +0.034417f, -0.004698f}, + {-0.359282f, -0.033550f, +0.005250f}, + {+0.216676f, -0.010427f, +0.006057f}, + {-0.120954f, +0.008613f, -0.002469f}, + {+0.268504f, +0.001802f, -0.003587f}, + {-0.013045f, -0.010217f, +0.002327f}, + {-0.059871f, -0.003931f, +0.001188f}, + {-0.132164f, +0.026563f, +0.001240f}, + {-0.403193f, -0.027848f, +0.009266f}, + {+0.190953f, +0.002021f, +0.001187f} + }, + { + {+0.399726f, -0.003989f, -0.001238f}, + {-0.392346f, -0.005321f, -0.003177f}, + {-0.072827f, +0.023138f, +0.000364f}, + {+0.417980f, -0.003176f, -0.003953f}, + {-0.044470f, -0.006065f, -0.002234f}, + {-0.111558f, +0.001243f, +0.006696f}, + {-0.306891f, -0.017879f, -0.010556f}, + {-0.227947f, +0.027747f, +0.006660f}, + {+0.285131f, -0.003545f, -0.002248f}, + {-0.160581f, -0.005372f, -0.001188f}, + {+0.228536f, -0.004194f, -0.000473f}, + {-0.021041f, +0.010096f, +0.009272f}, + {-0.021484f, +0.000358f, -0.003354f}, + {-0.213365f, -0.015260f, -0.000168f}, + {-0.303399f, +0.026027f, +0.011571f}, + {+0.212111f, -0.000447f, -0.003261f} + }, + { + {+0.378407f, +0.003850f, -0.000653f}, + {-0.380175f, -0.007586f, -0.003255f}, + {-0.012127f, -0.017400f, +0.004348f}, + {+0.420589f, +0.000881f, -0.004600f}, + {-0.082045f, +0.000538f, +0.001160f}, + {-0.069379f, +0.007873f, -0.001279f}, + {-0.364957f, -0.009593f, -0.003601f}, + {-0.103978f, -0.012644f, +0.002536f}, + {+0.322327f, -0.004962f, -0.006100f}, + {-0.208381f, +0.007687f, +0.001556f}, + {+0.193755f, +0.004206f, +0.000887f}, + {+0.012722f, +0.002660f, +0.005208f}, + {-0.021028f, +0.002645f, -0.003959f}, + {-0.256559f, +0.000206f, +0.001247f}, + {-0.175255f, -0.013434f, +0.005713f}, + {+0.216424f, -0.004406f, -0.001903f} + }, + { + {+0.355186f, -0.004417f, +0.000047f}, + {-0.367959f, +0.007051f, +0.000589f}, + {+0.030278f, -0.000745f, +0.003677f}, + {+0.419972f, +0.001580f, -0.004098f}, + {-0.126164f, -0.010538f, +0.004622f}, + {-0.036142f, +0.005050f, -0.006483f}, + {-0.395580f, +0.008424f, +0.006868f}, + {+0.004418f, +0.013200f, -0.004102f}, + {+0.338438f, +0.004391f, -0.003969f}, + {-0.257936f, -0.011270f, +0.002562f}, + {+0.157184f, -0.010190f, +0.001022f}, + {+0.066694f, +0.007499f, -0.001955f}, + {-0.058038f, -0.007898f, -0.001836f}, + {-0.252063f, +0.011457f, +0.004218f}, + {-0.038996f, +0.019229f, -0.002930f}, + {+0.207135f, -0.002683f, +0.000920f} + }, + { + {+0.333833f, +0.005141f, -0.000033f}, + {-0.354343f, -0.002376f, +0.001512f}, + {+0.044789f, +0.011943f, -0.002345f}, + {+0.420054f, -0.005203f, -0.002411f}, + {-0.168493f, +0.019086f, +0.001101f}, + {+0.000312f, -0.019974f, -0.002740f}, + {-0.404430f, +0.003854f, +0.008761f}, + {+0.101609f, -0.024344f, -0.004621f}, + {+0.343021f, -0.002003f, -0.002287f}, + {-0.300798f, +0.012232f, +0.000926f}, + {+0.115201f, +0.012523f, -0.000667f}, + {+0.124884f, -0.013322f, -0.003505f}, + {-0.124657f, +0.015080f, +0.000444f}, + {-0.208063f, -0.009838f, +0.004149f}, + {+0.098778f, -0.030234f, -0.005691f}, + {+0.191672f, +0.010274f, -0.000986f} + }, + { + {+0.317651f, -0.003399f, -0.000638f}, + {-0.342009f, +0.000734f, +0.000383f}, + {+0.041234f, -0.003266f, -0.006626f}, + {+0.412818f, +0.000564f, -0.000053f}, + {-0.193269f, -0.005756f, -0.003803f}, + {+0.038455f, +0.012921f, +0.002898f}, + {-0.397973f, -0.006421f, +0.004371f}, + {+0.186407f, +0.018164f, -0.002443f}, + {+0.339213f, -0.001972f, -0.002251f}, + {-0.327935f, -0.003077f, -0.000361f}, + {+0.072360f, -0.008411f, -0.001308f}, + {+0.171731f, +0.013927f, -0.001434f}, + {-0.206591f, -0.018817f, +0.001471f}, + {-0.140714f, +0.015540f, +0.002302f}, + {+0.227639f, +0.031497f, -0.003750f}, + {+0.179263f, -0.004105f, -0.004389f} + }, + { + {+0.307693f, +0.001076f, -0.000945f}, + {-0.334320f, -0.001717f, +0.000049f}, + {+0.033552f, -0.011447f, -0.002121f}, + {+0.387841f, +0.007421f, +0.001088f}, + {-0.192595f, -0.010377f, -0.002843f}, + {+0.067483f, +0.002402f, +0.001682f}, + {-0.373557f, +0.001444f, -0.001449f}, + {+0.251051f, -0.016030f, -0.000496f}, + {+0.323516f, +0.001530f, -0.001658f}, + {-0.335944f, -0.003218f, +0.000567f}, + {+0.034654f, +0.006672f, -0.000906f}, + {+0.193976f, -0.003406f, +0.001146f}, + {-0.284432f, +0.017472f, +0.001142f}, + {-0.067179f, -0.009754f, -0.000138f}, + {+0.329347f, -0.022749f, -0.000471f}, + {+0.172128f, -0.005358f, -0.003493f} + }, + { + {+0.301577f, +0.001184f, -0.000322f}, + {-0.332736f, +0.000666f, +0.000894f}, + {+0.023585f, -0.000609f, +0.003132f}, + {+0.344006f, -0.015803f, +0.000034f}, + {-0.177998f, +0.013137f, +0.002069f}, + {+0.082056f, -0.003433f, -0.002633f}, + {-0.324370f, +0.018955f, -0.002626f}, + {+0.287377f, +0.000225f, -0.000071f}, + {+0.290720f, -0.007672f, -0.000038f}, + {-0.329996f, +0.006498f, +0.002605f}, + {+0.003682f, -0.004563f, -0.000624f}, + {+0.185737f, -0.009876f, +0.000494f}, + {-0.338831f, -0.008465f, +0.000490f}, + {-0.000651f, +0.014424f, -0.001842f}, + {+0.385445f, -0.000494f, -0.001075f}, + {+0.160154f, +0.003230f, +0.000530f} + }, + { + {+0.294359f, +0.001008f, +0.000587f}, + {-0.335716f, +0.002537f, +0.000929f}, + {+0.006697f, +0.010781f, +0.001057f}, + {+0.292769f, +0.014442f, -0.002216f}, + {-0.173218f, +0.002305f, +0.004071f}, + {+0.084637f, -0.001890f, -0.003059f}, + {-0.253587f, -0.025906f, +0.002221f}, + {+0.295508f, +0.003624f, -0.001780f}, + {+0.240102f, +0.014422f, -0.000050f}, + {-0.320004f, +0.000226f, +0.002968f}, + {-0.025595f, +0.006552f, -0.001052f}, + {+0.154653f, +0.014381f, -0.002635f}, + {-0.357893f, -0.004680f, +0.001836f}, + {+0.050259f, -0.009177f, -0.001013f}, + {+0.390921f, +0.011091f, -0.005488f}, + {+0.128396f, +0.010797f, +0.002030f} + }, + { + {+0.281980f, -0.004479f, +0.000473f}, + {-0.338235f, -0.000938f, +0.000317f}, + {-0.016443f, -0.008216f, -0.002310f}, + {+0.250822f, -0.005381f, -0.002547f}, + {-0.194113f, -0.011993f, +0.002133f}, + {+0.078814f, +0.001480f, -0.000683f}, + {-0.178794f, +0.013791f, +0.004329f}, + {+0.286440f, -0.008258f, -0.003815f}, + {+0.180165f, -0.014312f, -0.000718f}, + {-0.312559f, -0.001222f, +0.001335f}, + {-0.061211f, -0.002642f, +0.000385f}, + {+0.117426f, -0.006897f, -0.004033f}, + {-0.342706f, +0.010139f, +0.004471f}, + {+0.079430f, +0.002660f, -0.001268f}, + {+0.356398f, -0.011250f, -0.007640f}, + {+0.072072f, -0.018003f, +0.000575f} + }, + { + {+0.264584f, +0.006225f, -0.000553f}, + {-0.334355f, -0.002104f, +0.000390f}, + {-0.041411f, +0.000660f, -0.001379f}, + {+0.227742f, -0.002231f, -0.000499f}, + {-0.236723f, +0.015277f, +0.000143f}, + {+0.066692f, +0.002089f, +0.000940f}, + {-0.116641f, -0.003621f, +0.000856f}, + {+0.274189f, -0.002260f, -0.003775f}, + {+0.124476f, +0.010538f, -0.000672f}, + {-0.307116f, +0.000375f, +0.000391f}, + {-0.109323f, +0.010339f, +0.003218f}, + {+0.087624f, -0.002282f, -0.001095f}, + {-0.305220f, -0.004246f, +0.003226f}, + {+0.088209f, -0.001890f, -0.000514f}, + {+0.297714f, +0.002109f, -0.002943f}, + {+0.002305f, +0.018254f, -0.000698f} + }, + { + {+0.245860f, -0.004071f, -0.001278f}, + {-0.320735f, +0.004451f, +0.000718f}, + {-0.064973f, -0.003268f, +0.001022f}, + {+0.221237f, +0.003408f, +0.001969f}, + {-0.282979f, -0.012181f, -0.001619f}, + {+0.050139f, -0.005534f, +0.000714f}, + {-0.071497f, +0.004571f, -0.002571f}, + {+0.265456f, +0.000937f, -0.001591f}, + {+0.084560f, -0.004757f, +0.000011f}, + {-0.300229f, +0.001315f, -0.000134f}, + {-0.168137f, -0.018612f, +0.002406f}, + {+0.066781f, -0.001637f, +0.001882f}, + {-0.257378f, +0.011005f, +0.000980f}, + {+0.083095f, -0.005045f, -0.000085f}, + {+0.224972f, -0.016565f, +0.001685f}, + {-0.061472f, -0.012660f, -0.001272f} + }, + { + {+0.229589f, +0.000720f, -0.000554f}, + {-0.297388f, -0.006061f, +0.000830f}, + {-0.086308f, +0.008311f, -0.000100f}, + {+0.220891f, +0.005343f, +0.000760f}, + {-0.312804f, -0.002048f, -0.000535f}, + {+0.033600f, +0.001954f, +0.000821f}, + {-0.037726f, -0.009547f, -0.001800f}, + {+0.256770f, -0.001354f, -0.000172f}, + {+0.064615f, +0.001499f, +0.000378f}, + {-0.288880f, -0.006082f, +0.000716f}, + {-0.223988f, +0.015499f, -0.000654f}, + {+0.048524f, +0.007439f, +0.000777f}, + {-0.208116f, -0.011040f, +0.001557f}, + {+0.074335f, +0.004704f, -0.001723f}, + {+0.146222f, +0.020815f, +0.000166f}, + {-0.103517f, +0.003200f, -0.000724f} + }, + { + {+0.216659f, -0.000775f, +0.000774f}, + {-0.266859f, +0.007292f, +0.000934f}, + {-0.105304f, -0.004788f, -0.002437f}, + {+0.217403f, -0.003973f, -0.002583f}, + {-0.318044f, +0.007929f, +0.003539f}, + {+0.023696f, -0.000702f, +0.001989f}, + {-0.008068f, +0.006711f, +0.000114f}, + {+0.242367f, -0.004361f, +0.000832f}, + {+0.061343f, +0.003214f, +0.000949f}, + {-0.273736f, +0.004941f, +0.002356f}, + {-0.260361f, -0.001261f, -0.000909f}, + {+0.027365f, -0.006696f, -0.001482f}, + {-0.163814f, +0.008052f, +0.001931f}, + {+0.071141f, -0.000562f, -0.003221f}, + {+0.073591f, -0.015255f, -0.001489f}, + {-0.121162f, +0.004631f, +0.001675f} + }, + { + {+0.205784f, +0.003757f, +0.000700f}, + {-0.232994f, -0.005953f, +0.000561f}, + {-0.123682f, -0.003377f, -0.000485f}, + {+0.205753f, -0.000981f, -0.002067f}, + {-0.304943f, -0.001966f, +0.004525f}, + {+0.026104f, +0.002420f, +0.000748f}, + {+0.021981f, -0.003022f, -0.000957f}, + {+0.220204f, +0.009944f, -0.000624f}, + {+0.066717f, -0.001208f, +0.001408f}, + {-0.258003f, +0.000477f, +0.001518f}, + {-0.270472f, -0.007879f, +0.002698f}, + {+0.001424f, +0.001591f, -0.000485f}, + {-0.125885f, -0.003310f, +0.000529f}, + {+0.074527f, -0.008121f, -0.001699f}, + {+0.017069f, +0.005535f, -0.000272f}, + {-0.124829f, -0.001926f, +0.003798f} + }, + { + {+0.196417f, -0.003644f, -0.000603f}, + {-0.199207f, +0.006086f, -0.000295f}, + {-0.146052f, -0.001687f, +0.003740f}, + {+0.182052f, -0.002076f, +0.001266f}, + {-0.282909f, -0.000690f, +0.001105f}, + {+0.044152f, +0.004210f, -0.001817f}, + {+0.054138f, +0.007409f, -0.002335f}, + {+0.196668f, -0.006189f, -0.002331f}, + {+0.072925f, -0.001260f, +0.000239f}, + {-0.242629f, +0.000541f, -0.000943f}, + {-0.260897f, +0.003994f, +0.004883f}, + {-0.029070f, -0.005485f, +0.001962f}, + {-0.092855f, +0.004046f, -0.001954f}, + {+0.076259f, +0.005415f, +0.002510f}, + {-0.019261f, -0.001366f, +0.002709f}, + {-0.127606f, -0.004435f, +0.002949f} + }, + { + {+0.189173f, +0.000560f, -0.001059f}, + {-0.167547f, -0.008258f, +0.000141f}, + {-0.174715f, +0.013815f, +0.002907f}, + {+0.145627f, +0.012083f, +0.002087f}, + {-0.256566f, -0.006772f, -0.000776f}, + {+0.075271f, -0.013763f, -0.000701f}, + {+0.085309f, -0.009140f, -0.001366f}, + {+0.180099f, +0.000959f, -0.002178f}, + {+0.077061f, -0.000891f, -0.000372f}, + {-0.225986f, -0.007128f, -0.000680f}, + {-0.242442f, -0.000129f, +0.003190f}, + {-0.061120f, +0.011120f, +0.001079f}, + {-0.062759f, -0.011288f, -0.001129f}, + {+0.065406f, +0.009942f, +0.002436f}, + {-0.038027f, +0.005472f, +0.002780f}, + {-0.134062f, +0.004375f, +0.001136f} + }, + { + {+0.183656f, +0.000923f, -0.000164f}, + {-0.139835f, +0.005429f, +0.001020f}, + {-0.202643f, -0.008873f, -0.000639f}, + {+0.102603f, -0.014782f, -0.000700f}, + {-0.227902f, +0.008291f, +0.000524f}, + {+0.108562f, +0.007847f, +0.001593f}, + {+0.108523f, +0.004720f, -0.000054f}, + {+0.172882f, +0.003322f, -0.000542f}, + {+0.078483f, -0.001260f, -0.000596f}, + {-0.207608f, +0.004999f, +0.001085f}, + {-0.221842f, +0.000718f, +0.000351f}, + {-0.087045f, -0.004787f, -0.000547f}, + {-0.037398f, +0.005336f, +0.001064f}, + {+0.041563f, -0.010757f, -0.000998f}, + {-0.043387f, -0.001956f, +0.000527f}, + {-0.140276f, -0.003188f, -0.000142f} + }, + { + {+0.177711f, +0.001442f, +0.000461f}, + {-0.115859f, -0.004532f, +0.001235f}, + {-0.218668f, -0.005427f, +0.000911f}, + {+0.063962f, +0.003468f, -0.001219f}, + {-0.198372f, -0.004393f, +0.000814f}, + {+0.132046f, +0.004112f, -0.000882f}, + {+0.118012f, +0.003780f, -0.001160f}, + {+0.169530f, -0.000759f, +0.000923f}, + {+0.077288f, -0.001422f, -0.000499f}, + {-0.187625f, +0.000022f, +0.000030f}, + {-0.200958f, -0.007075f, -0.000014f}, + {-0.099701f, -0.002974f, +0.000910f}, + {-0.019722f, +0.003866f, -0.001104f}, + {+0.014166f, +0.005774f, -0.002177f}, + {-0.039277f, -0.003862f, +0.000381f}, + {-0.138918f, -0.005302f, +0.000608f} + }, + { + {+0.169075f, -0.003877f, -0.000219f}, + {-0.092373f, +0.003200f, +0.000934f}, + {-0.217383f, +0.010383f, +0.006743f}, + {+0.037373f, +0.004176f, +0.003172f}, + {-0.168763f, +0.000238f, -0.001996f}, + {+0.140535f, -0.007256f, -0.006564f}, + {+0.113037f, -0.005040f, -0.003602f}, + {+0.161555f, -0.002184f, +0.001327f}, + {+0.073875f, +0.002628f, +0.001536f}, + {-0.165667f, -0.001239f, -0.003853f}, + {-0.179435f, +0.009646f, +0.002896f}, + {-0.097770f, +0.003616f, +0.003027f}, + {-0.009431f, -0.004981f, -0.006157f}, + {-0.008081f, +0.000345f, -0.000806f}, + {-0.031139f, +0.005138f, +0.002262f}, + {-0.125572f, +0.007103f, +0.003194f} + }, + { + {+0.156703f, +0.003123f, -0.000930f}, + {-0.066141f, -0.001589f, -0.001238f}, + {-0.199134f, -0.002236f, +0.009123f}, + {+0.024449f, +0.000091f, +0.006919f}, + {-0.141646f, -0.003103f, -0.005668f}, + {+0.133486f, -0.000744f, -0.008630f}, + {+0.097019f, -0.000327f, -0.002792f}, + {+0.144791f, +0.002980f, +0.002476f}, + {+0.068698f, +0.001637f, +0.003084f}, + {-0.144321f, -0.006179f, -0.006251f}, + {-0.155892f, -0.002625f, +0.004264f}, + {-0.084319f, -0.000388f, +0.002288f}, + {-0.006549f, -0.002981f, -0.008326f}, + {-0.021606f, -0.003867f, +0.002491f}, + {-0.023191f, -0.001810f, +0.003729f}, + {-0.101442f, -0.001244f, +0.002402f} + }, + { + {+0.140100f, -0.000742f, +0.000187f}, + {-0.036425f, +0.005652f, -0.004036f}, + {-0.165186f, -0.002894f, +0.004265f}, + {+0.025616f, -0.008625f, +0.004162f}, + {-0.121725f, +0.015558f, -0.002974f}, + {+0.111098f, +0.006811f, -0.003090f}, + {+0.072921f, -0.001667f, +0.000669f}, + {+0.120893f, -0.005073f, +0.004382f}, + {+0.065161f, -0.005346f, +0.001749f}, + {-0.129726f, +0.017304f, -0.000877f}, + {-0.126372f, -0.005082f, -0.000663f}, + {-0.063630f, +0.002788f, -0.000025f}, + {-0.013562f, +0.008476f, -0.004178f}, + {-0.027532f, -0.002871f, +0.003910f}, + {-0.014651f, +0.000004f, +0.003901f}, + {-0.068381f, +0.002931f, -0.001605f} + } +}; + + + +const float FASTCONV_HOA2_latency_s = 0.000020833f; +const float leftHRIRReal_HOA2[BINAURAL_CONVBANDS][HOA2_CHANNELS][BINAURAL_NTAPS_SBA]= +{ + { + {+0.018159f, +0.985146f, +0.240506f}, + {+0.077046f, -0.024713f, +0.260411f}, + {+0.000593f, +0.132269f, +0.000009f}, + {+0.009213f, +0.054471f, +0.004257f}, + {+0.039823f, -0.044599f, -0.001606f}, + {+0.011090f, -0.028094f, +0.011739f}, + {-0.057613f, +0.083209f, +0.004522f}, + {+0.010244f, +0.028373f, -0.010969f}, + {-0.107601f, +0.182275f, +0.052385f} + }, + { + {-0.152534f, -0.329898f, -0.242342f}, + {-0.209786f, -1.273585f, -0.112026f}, + {-0.011413f, +0.080591f, -0.013524f}, + {-0.034221f, +0.013783f, +0.008826f}, + {-0.012372f, +0.014808f, +0.038195f}, + {+0.003235f, +0.083338f, +0.068446f}, + {+0.003314f, -0.032912f, -0.065265f}, + {+0.003322f, +0.076317f, +0.007937f}, + {-0.015189f, -0.220191f, -0.130843f} + }, + { + {-0.023093f, -0.558938f, -0.150964f}, + {-0.270176f, -0.589966f, -0.359432f}, + {-0.003260f, +0.097037f, -0.014970f}, + {-0.058519f, +0.107799f, -0.014627f}, + {-0.084143f, +0.174088f, -0.006734f}, + {-0.035814f, +0.281769f, -0.006166f}, + {+0.116511f, -0.307921f, +0.020292f}, + {-0.013401f, +0.086307f, +0.012981f}, + {+0.209526f, -0.554513f, -0.048661f} + }, + { + {+0.261551f, +0.304347f, +0.114032f}, + {+0.250896f, +0.779633f, +0.070356f}, + {+0.023786f, +0.088663f, -0.030815f}, + {+0.003407f, +0.082081f, -0.041209f}, + {-0.062118f, +0.047824f, -0.057239f}, + {-0.026013f, +0.155692f, -0.065882f}, + {+0.127095f, -0.164040f, +0.077176f}, + {-0.022006f, +0.035999f, -0.005698f}, + {+0.327951f, -0.045215f, +0.125831f} + }, + { + {+0.359497f, +0.205525f, +0.109865f}, + {+0.745384f, +0.051437f, +0.216054f}, + {+0.066207f, -0.076438f, +0.024748f}, + {+0.143496f, -0.123266f, +0.007838f}, + {+0.098368f, -0.139294f, -0.014972f}, + {+0.065224f, -0.122143f, +0.029816f}, + {-0.019520f, +0.163808f, -0.024174f}, + {+0.008568f, -0.024216f, +0.013284f}, + {+0.111141f, +0.311803f, +0.021197f} + }, + { + {+0.165159f, -0.254129f, -0.025534f}, + {+0.780421f, -0.408205f, +0.025264f}, + {+0.043262f, -0.082839f, +0.025956f}, + {+0.214774f, -0.021619f, +0.026192f}, + {+0.266921f, +0.073753f, +0.026414f}, + {+0.110056f, -0.068805f, +0.038706f}, + {-0.162323f, +0.018037f, -0.046919f}, + {+0.046582f, -0.024241f, +0.003856f}, + {-0.254154f, -0.105995f, -0.060073f} + }, + { + {-0.177496f, +0.069944f, -0.070544f}, + {+0.384878f, +0.205067f, -0.111476f}, + {-0.035734f, +0.067378f, -0.014549f}, + {+0.125583f, +0.062055f, +0.008649f}, + {+0.294346f, +0.048254f, +0.026299f}, + {+0.090207f, +0.084523f, -0.015326f}, + {-0.211714f, -0.100002f, +0.007755f}, + {+0.078344f, -0.022510f, -0.004774f}, + {-0.527842f, -0.045905f, -0.024578f} + }, + { + {-0.463362f, +0.056885f, -0.021761f}, + {-0.150954f, +0.026543f, -0.068293f}, + {-0.101521f, +0.000813f, -0.025478f}, + {-0.095046f, -0.089523f, -0.003261f}, + {+0.134616f, -0.104561f, +0.001013f}, + {+0.059105f, +0.025388f, -0.028020f}, + {-0.181070f, -0.006996f, +0.032275f}, + {+0.082036f, -0.002388f, +0.001840f}, + {-0.586330f, +0.048806f, +0.016554f} + }, + { + {-0.592381f, -0.044571f, +0.029549f}, + {-0.576892f, -0.036976f, +0.022220f}, + {-0.119596f, -0.060394f, -0.001555f}, + {-0.338453f, +0.063985f, -0.014668f}, + {-0.125238f, +0.093159f, -0.021501f}, + {+0.045169f, -0.044028f, +0.000433f}, + {-0.115198f, +0.025252f, +0.004920f}, + {+0.041077f, +0.008697f, +0.004995f}, + {-0.438497f, -0.055561f, +0.020980f} + }, + { + {-0.599054f, -0.014356f, +0.032985f}, + {-0.822874f, -0.044354f, +0.046136f}, + {-0.117506f, +0.008009f, +0.019868f}, + {-0.479925f, +0.018761f, -0.007799f}, + {-0.339581f, -0.001799f, -0.018360f}, + {+0.028531f, -0.004096f, +0.014580f}, + {-0.035532f, +0.016131f, -0.009871f}, + {-0.031577f, -0.038412f, +0.000988f}, + {-0.188266f, +0.051427f, +0.014971f} + }, + { + {-0.558565f, +0.027629f, +0.008677f}, + {-0.934558f, +0.055883f, +0.019701f}, + {-0.143536f, +0.040687f, +0.009496f}, + {-0.475498f, -0.046650f, +0.012347f}, + {-0.418986f, -0.046808f, +0.009187f}, + {-0.019973f, +0.045258f, +0.001389f}, + {+0.040837f, -0.027615f, -0.004137f}, + {-0.104086f, +0.015540f, -0.006688f}, + {+0.045132f, -0.020688f, +0.004131f} + }, + { + {-0.508817f, +0.002572f, -0.006006f}, + {-0.966334f, -0.010598f, +0.000935f}, + {-0.200114f, -0.021501f, -0.002245f}, + {-0.374199f, +0.021235f, +0.015875f}, + {-0.383236f, +0.011504f, +0.019281f}, + {-0.101681f, -0.007702f, -0.004459f}, + {+0.098607f, +0.009824f, -0.000170f}, + {-0.142186f, +0.015367f, -0.000073f}, + {+0.202499f, +0.007942f, -0.007850f} + }, + { + {-0.449816f, -0.025700f, -0.002766f}, + {-0.942805f, -0.019015f, +0.002630f}, + {-0.251515f, +0.005009f, -0.000037f}, + {-0.247529f, -0.018163f, +0.007953f}, + {-0.297646f, -0.008359f, +0.008978f}, + {-0.194833f, +0.010293f, +0.006773f}, + {+0.127610f, -0.005400f, -0.000110f}, + {-0.141062f, -0.005988f, +0.007030f}, + {+0.285592f, -0.008291f, -0.012555f} + }, + { + {-0.376168f, +0.026055f, +0.004627f}, + {-0.871841f, +0.021874f, +0.006470f}, + {-0.251474f, +0.012379f, +0.004839f}, + {-0.143351f, +0.003085f, +0.000557f}, + {-0.213031f, +0.008846f, +0.002525f}, + {-0.266224f, -0.023397f, +0.007678f}, + {+0.122414f, -0.005951f, +0.000933f}, + {-0.115352f, -0.004480f, +0.001947f}, + {+0.318209f, +0.018171f, -0.006837f} + }, + { + {-0.293873f, -0.014103f, +0.005564f}, + {-0.763509f, -0.026484f, +0.005957f}, + {-0.167339f, -0.021635f, +0.004681f}, + {-0.071079f, -0.008355f, -0.004673f}, + {-0.149092f, -0.004738f, -0.000445f}, + {-0.269948f, +0.002632f, +0.000196f}, + {+0.088484f, +0.013962f, +0.000022f}, + {-0.080315f, -0.009623f, -0.002700f}, + {+0.315546f, +0.000498f, +0.000137f} + }, + { + {-0.214030f, +0.010451f, +0.001827f}, + {-0.638609f, +0.024424f, +0.004195f}, + {-0.000480f, +0.033426f, -0.002795f}, + {-0.011678f, +0.017775f, -0.002438f}, + {-0.092630f, +0.011217f, -0.001499f}, + {-0.179494f, +0.027872f, -0.004886f}, + {+0.049375f, -0.006195f, +0.000322f}, + {-0.050886f, +0.014806f, +0.001580f}, + {+0.284102f, -0.013452f, -0.000223f} + }, + { + {-0.142407f, -0.012908f, -0.000129f}, + {-0.521031f, -0.021513f, +0.002424f}, + {+0.212730f, -0.053828f, -0.007313f}, + {+0.050092f, -0.009707f, -0.001567f}, + {-0.022713f, -0.014891f, -0.001899f}, + {-0.013352f, -0.051652f, -0.004824f}, + {+0.034982f, -0.000584f, +0.002038f}, + {-0.037735f, -0.000643f, +0.005700f}, + {+0.234664f, +0.015884f, -0.002619f} + }, + { + {-0.078162f, +0.013149f, +0.000240f}, + {-0.425304f, +0.016123f, +0.001883f}, + {+0.408229f, +0.052323f, -0.001957f}, + {+0.116415f, +0.013525f, -0.004497f}, + {+0.067314f, +0.020251f, -0.003762f}, + {+0.167553f, +0.051767f, +0.000869f}, + {+0.068137f, +0.009479f, +0.001235f}, + {-0.034203f, -0.008399f, +0.003763f}, + {+0.180796f, -0.011205f, -0.003598f} + }, + { + {-0.016750f, -0.012127f, +0.000498f}, + {-0.353965f, -0.008335f, +0.000653f}, + {+0.518342f, -0.011173f, +0.002964f}, + {+0.177026f, -0.019969f, -0.002705f}, + {+0.164814f, -0.026646f, -0.003238f}, + {+0.286213f, -0.012718f, +0.003816f}, + {+0.155640f, -0.020546f, -0.001850f}, + {-0.016416f, +0.003918f, -0.001774f}, + {+0.133919f, +0.003314f, -0.001822f} + }, + { + {+0.046182f, +0.012351f, -0.000034f}, + {-0.298885f, +0.009039f, -0.000810f}, + {+0.511610f, -0.032188f, -0.002291f}, + {+0.211380f, +0.005455f, +0.000933f}, + {+0.241218f, +0.015123f, -0.001103f}, + {+0.293508f, -0.029470f, -0.003051f}, + {+0.280548f, +0.030234f, -0.004368f}, + {+0.041260f, +0.018979f, -0.004541f}, + {+0.098998f, +0.002094f, +0.002904f} + }, + { + {+0.111605f, -0.013530f, -0.000652f}, + {-0.246690f, -0.016108f, +0.001020f}, + {+0.413977f, +0.038179f, -0.009520f}, + {+0.203190f, +0.017508f, -0.002191f}, + {+0.268601f, +0.003682f, -0.001755f}, + {+0.196136f, +0.036857f, -0.009761f}, + {+0.402137f, -0.026686f, -0.005055f}, + {+0.145035f, -0.035432f, -0.001365f}, + {+0.074946f, +0.007868f, +0.004954f} + }, + { + {+0.176108f, +0.013431f, -0.000958f}, + {-0.185298f, +0.016846f, +0.004677f}, + {+0.286889f, -0.019450f, -0.007487f}, + {+0.153787f, -0.015814f, -0.006505f}, + {+0.239195f, -0.011851f, -0.001930f}, + {+0.042102f, -0.023553f, -0.004947f}, + {+0.470133f, +0.012898f, -0.003624f}, + {+0.270107f, +0.025928f, -0.000154f}, + {+0.059116f, -0.020434f, -0.003101f} + }, + { + {+0.234033f, -0.013522f, -0.000160f}, + {-0.105917f, -0.008837f, +0.002769f}, + {+0.184987f, +0.008247f, -0.000624f}, + {+0.076510f, +0.005900f, -0.001804f}, + {+0.166708f, +0.022644f, -0.001485f}, + {-0.112604f, +0.020438f, +0.005184f}, + {+0.450824f, +0.006092f, +0.002002f}, + {+0.374333f, -0.013645f, -0.004183f}, + {+0.050668f, -0.002470f, -0.009849f} + }, + { + {+0.280701f, +0.008633f, +0.001045f}, + {-0.002220f, +0.016553f, -0.003998f}, + {+0.131643f, -0.003842f, +0.001872f}, + {-0.015690f, -0.016479f, +0.005047f}, + {+0.077685f, -0.023492f, -0.003551f}, + {-0.223388f, -0.024340f, +0.007042f}, + {+0.346787f, -0.042038f, +0.003586f}, + {+0.418985f, +0.005219f, -0.005591f}, + {+0.040023f, +0.024273f, +0.000362f} + }, + { + {+0.315972f, -0.002222f, +0.000114f}, + {+0.123110f, -0.036764f, -0.004764f}, + {+0.119199f, -0.002064f, +0.000988f}, + {-0.106689f, +0.025325f, +0.004605f}, + {-0.000310f, +0.007517f, -0.002748f}, + {-0.262374f, +0.010338f, +0.000067f}, + {+0.204029f, +0.052292f, -0.005305f}, + {+0.380172f, +0.016758f, -0.003741f}, + {+0.003388f, +0.008217f, +0.011667f} + }, + { + {+0.346296f, +0.003536f, -0.001898f}, + {+0.248976f, +0.036524f, +0.001389f}, + {+0.120849f, +0.002931f, +0.000722f}, + {-0.173186f, -0.016622f, +0.000289f}, + {-0.054827f, -0.000181f, +0.002418f}, + {-0.225358f, +0.023135f, -0.002820f}, + {+0.091375f, -0.014867f, -0.010230f}, + {+0.260139f, -0.034357f, -0.002468f}, + {-0.068405f, -0.042485f, +0.005111f} + }, + { + {+0.379862f, -0.009494f, -0.001961f}, + {+0.345947f, -0.013885f, +0.004347f}, + {+0.108945f, +0.001609f, +0.002277f}, + {-0.194971f, -0.005237f, -0.000216f}, + {-0.090631f, +0.007307f, +0.004497f}, + {-0.139916f, -0.036851f, +0.003429f}, + {+0.049457f, -0.016676f, -0.004125f}, + {+0.089658f, +0.040648f, -0.001276f}, + {-0.147747f, +0.028109f, -0.006357f} + }, + { + {+0.419521f, +0.011992f, -0.000293f}, + {+0.399888f, -0.006995f, -0.000613f}, + {+0.071268f, -0.013451f, +0.003383f}, + {-0.169244f, +0.016170f, +0.002968f}, + {-0.116230f, -0.009802f, +0.001756f}, + {-0.053621f, +0.017175f, +0.008163f}, + {+0.065166f, +0.025359f, +0.005381f}, + {-0.086447f, -0.037823f, -0.001051f}, + {-0.194782f, +0.007204f, -0.005393f} + }, + { + {+0.461674f, -0.009238f, +0.000744f}, + {+0.422873f, +0.002942f, -0.006024f}, + {+0.017965f, +0.019932f, +0.001068f}, + {-0.112940f, -0.014296f, +0.003691f}, + {-0.135675f, +0.004946f, -0.000913f}, + {-0.001359f, +0.007810f, +0.003619f}, + {+0.090834f, -0.000688f, +0.008234f}, + {-0.227027f, +0.020653f, -0.000262f}, + {-0.193552f, -0.020886f, +0.003761f} + }, + { + {+0.500543f, +0.004460f, -0.000339f}, + {+0.438946f, +0.008173f, -0.005382f}, + {-0.025063f, -0.012096f, -0.002727f}, + {-0.048264f, +0.016297f, +0.004137f}, + {-0.148356f, +0.006714f, +0.001928f}, + {+0.016069f, -0.011271f, -0.004203f}, + {+0.085225f, -0.019738f, +0.001763f}, + {-0.310418f, -0.002136f, +0.003576f}, + {-0.158213f, +0.011793f, +0.008536f} + }, + { + {+0.533110f, -0.005084f, -0.001776f}, + {+0.463561f, -0.015347f, -0.000549f}, + {-0.035070f, -0.007804f, -0.002842f}, + {+0.008595f, -0.003050f, +0.002916f}, + {-0.153491f, +0.002287f, +0.004867f}, + {+0.021318f, +0.000337f, -0.007722f}, + {+0.040490f, +0.023364f, -0.005685f}, + {-0.339640f, -0.004014f, +0.007635f}, + {-0.113068f, +0.002471f, +0.003970f} + }, + { + {+0.559507f, +0.006521f, -0.001337f}, + {+0.495821f, +0.006508f, +0.001808f}, + {-0.009393f, +0.020033f, +0.002230f}, + {+0.057093f, +0.005006f, -0.000599f}, + {-0.147824f, -0.005127f, +0.001599f}, + {+0.035200f, +0.017556f, -0.003623f}, + {-0.026148f, -0.010270f, -0.006517f}, + {-0.331865f, -0.002383f, +0.006123f}, + {-0.069791f, +0.006016f, -0.000948f} + }, + { + {+0.580524f, -0.004095f, -0.000494f}, + {+0.527187f, -0.003574f, +0.000131f}, + {+0.034392f, -0.012275f, +0.006324f}, + {+0.108521f, -0.008134f, -0.002780f}, + {-0.124651f, -0.003736f, -0.002434f}, + {+0.058607f, -0.013665f, +0.003392f}, + {-0.096848f, +0.005058f, -0.001324f}, + {-0.301438f, -0.004261f, +0.001796f}, + {-0.026983f, -0.008052f, -0.001333f} + }, + { + {+0.597812f, +0.002656f, -0.000522f}, + {+0.552363f, +0.003313f, -0.001014f}, + {+0.075214f, -0.005271f, +0.002238f}, + {+0.170571f, +0.018162f, -0.002847f}, + {-0.083934f, +0.017743f, -0.001407f}, + {+0.076846f, -0.004888f, +0.003003f}, + {-0.166265f, -0.007573f, +0.004024f}, + {-0.256165f, +0.011081f, +0.000547f}, + {+0.019750f, +0.010957f, -0.001327f} + }, + { + {+0.613921f, -0.002403f, -0.000945f}, + {+0.571681f, -0.004061f, -0.000722f}, + {+0.106010f, -0.000496f, -0.004030f}, + {+0.238299f, -0.018447f, -0.000821f}, + {-0.038282f, -0.014684f, +0.002501f}, + {+0.080622f, +0.007409f, -0.002126f}, + {-0.235224f, +0.017619f, +0.005449f}, + {-0.203255f, -0.012695f, +0.000929f}, + {+0.070865f, -0.011018f, -0.001639f} + }, + { + {+0.630982f, +0.003698f, -0.001234f}, + {+0.590355f, +0.003219f, -0.000406f}, + {+0.130676f, +0.011921f, -0.002723f}, + {+0.295756f, +0.013516f, +0.001143f}, + {-0.005092f, +0.003596f, +0.003545f}, + {+0.072459f, +0.000272f, -0.002800f}, + {-0.299780f, -0.022696f, +0.001211f}, + {-0.150313f, +0.011501f, +0.001280f}, + {+0.118367f, +0.011753f, -0.001359f} + }, + { + {+0.649444f, -0.004884f, -0.000984f}, + {+0.615054f, -0.005408f, -0.000735f}, + {+0.149940f, -0.006453f, +0.001164f}, + {+0.328584f, -0.000395f, +0.001275f}, + {+0.008438f, +0.005199f, +0.001454f}, + {+0.058218f, -0.000064f, +0.000029f}, + {-0.346981f, +0.007071f, -0.001972f}, + {-0.104327f, -0.007957f, +0.001209f}, + {+0.149121f, -0.004220f, -0.000790f} + }, + { + {+0.667442f, +0.004369f, -0.000509f}, + {+0.649912f, +0.008091f, -0.001108f}, + {+0.160941f, -0.003110f, +0.000358f}, + {+0.335024f, -0.007340f, -0.001370f}, + {+0.010516f, -0.004138f, -0.001016f}, + {+0.042559f, -0.003980f, +0.001022f}, + {-0.366888f, +0.007198f, +0.001062f}, + {-0.068558f, +0.004871f, +0.000722f}, + {+0.153026f, -0.002598f, -0.000878f} + }, + { + {+0.682283f, -0.002839f, -0.000182f}, + {+0.693711f, -0.010677f, -0.001270f}, + {+0.163061f, +0.001749f, -0.001941f}, + {+0.327679f, +0.004372f, -0.003551f}, + {+0.017128f, -0.001449f, -0.002254f}, + {+0.029387f, +0.003404f, +0.000254f}, + {-0.363800f, -0.005157f, +0.004344f}, + {-0.041106f, -0.002019f, -0.000551f}, + {+0.130106f, +0.008236f, -0.000670f} + }, + { + {+0.692437f, +0.000095f, -0.000537f}, + {+0.740634f, +0.011604f, -0.000655f}, + {+0.157996f, +0.002060f, -0.000837f}, + {+0.323158f, +0.005481f, -0.001955f}, + {+0.039932f, +0.012585f, -0.000817f}, + {+0.021634f, -0.000010f, +0.000230f}, + {-0.350228f, -0.000420f, +0.003173f}, + {-0.016658f, +0.005630f, -0.001178f}, + {+0.089943f, -0.012079f, -0.001069f} + }, + { + {+0.698662f, +0.000230f, -0.001425f}, + {+0.782838f, -0.007193f, -0.000387f}, + {+0.147754f, +0.002321f, +0.001054f}, + {+0.330876f, -0.007440f, +0.001734f}, + {+0.078436f, -0.014161f, +0.002562f}, + {+0.020690f, -0.001093f, +0.000930f}, + {-0.336354f, +0.000244f, +0.000495f}, + {+0.007725f, -0.004802f, -0.001236f}, + {+0.047620f, +0.008277f, -0.001417f} + }, + { + {+0.703246f, +0.002409f, -0.001250f}, + {+0.814977f, +0.003204f, -0.001382f}, + {+0.135217f, -0.009385f, -0.001169f}, + {+0.350177f, -0.000838f, +0.000877f}, + {+0.122288f, +0.004476f, +0.002216f}, + {+0.025713f, -0.002869f, -0.000621f}, + {-0.325782f, +0.004520f, +0.000748f}, + {+0.030650f, +0.008462f, -0.000266f}, + {+0.015647f, -0.003005f, -0.000601f} + }, + { + {+0.707436f, -0.002159f, -0.000184f}, + {+0.836328f, -0.001420f, -0.002805f}, + {+0.124343f, +0.003534f, -0.004617f}, + {+0.377173f, -0.003128f, -0.002966f}, + {+0.162938f, -0.001908f, -0.001890f}, + {+0.034346f, -0.001148f, -0.003196f}, + {-0.317600f, -0.001145f, +0.002065f}, + {+0.047783f, -0.002726f, +0.001091f}, + {-0.001518f, -0.002014f, +0.001386f} + }, + { + {+0.711316f, +0.000190f, +0.000116f}, + {+0.849400f, +0.005461f, -0.002132f}, + {+0.115220f, +0.006522f, -0.002677f}, + {+0.406205f, +0.009733f, -0.003200f}, + {+0.198229f, +0.008830f, -0.003296f}, + {+0.041723f, +0.007295f, -0.001797f}, + {-0.307751f, -0.000513f, +0.001061f}, + {+0.056384f, -0.001852f, +0.000252f}, + {-0.007409f, -0.002688f, +0.001636f} + }, + { + {+0.715564f, +0.000878f, -0.000712f}, + {+0.856145f, -0.001865f, -0.000304f}, + {+0.099717f, +0.000516f, +0.001510f}, + {+0.427792f, -0.008621f, -0.000103f}, + {+0.227122f, -0.009743f, -0.000742f}, + {+0.038969f, +0.000573f, +0.000890f}, + {-0.290500f, -0.003837f, -0.000282f}, + {+0.060351f, +0.002258f, -0.001388f}, + {-0.007102f, +0.000681f, +0.000051f} + }, + { + {+0.721724f, +0.001440f, -0.001419f}, + {+0.857928f, -0.002494f, -0.000723f}, + {+0.068940f, -0.015230f, +0.000407f}, + {+0.432906f, -0.004606f, +0.000685f}, + {+0.246924f, +0.000678f, +0.000115f}, + {+0.019686f, -0.012823f, -0.000958f}, + {-0.263371f, +0.009394f, +0.000248f}, + {+0.066836f, +0.001658f, -0.002275f}, + {-0.003255f, +0.001689f, -0.000037f} + }, + { + {+0.730712f, -0.003910f, -0.000870f}, + {+0.858450f, +0.001220f, -0.001946f}, + {+0.023475f, +0.016216f, -0.003883f}, + {+0.419872f, +0.011121f, -0.002752f}, + {+0.256682f, +0.002820f, -0.002128f}, + {-0.013513f, +0.011639f, -0.004607f}, + {-0.229180f, -0.009683f, +0.001814f}, + {+0.080511f, -0.005798f, -0.001723f}, + {+0.001435f, +0.000756f, -0.000451f} + }, + { + {+0.741590f, +0.003101f, -0.000011f}, + {+0.860726f, -0.000300f, -0.002853f}, + {-0.028493f, -0.003694f, -0.002869f}, + {+0.395211f, -0.003270f, -0.003914f}, + {+0.257602f, +0.001422f, -0.002810f}, + {-0.053057f, -0.000570f, -0.002860f}, + {-0.193999f, +0.002947f, +0.000888f}, + {+0.099824f, +0.006425f, -0.000616f}, + {+0.005522f, +0.002697f, -0.000570f} + }, + { + {+0.752785f, -0.000581f, -0.000328f}, + {+0.864679f, -0.002652f, -0.003144f}, + {-0.079249f, -0.003995f, +0.005777f}, + {+0.366044f, -0.005911f, +0.001913f}, + {+0.251095f, -0.009072f, +0.002248f}, + {-0.092600f, -0.005125f, +0.005522f}, + {-0.162554f, -0.001717f, -0.002557f}, + {+0.119626f, -0.005564f, +0.000516f}, + {+0.008439f, -0.004393f, +0.001712f} + }, + { + {+0.763163f, -0.000862f, -0.002020f}, + {+0.868650f, +0.005188f, -0.001363f}, + {-0.122932f, -0.003612f, +0.014766f}, + {+0.337176f, +0.004705f, +0.011739f}, + {+0.240301f, +0.007676f, +0.011938f}, + {-0.125784f, -0.004581f, +0.013027f}, + {-0.137073f, +0.006965f, -0.003725f}, + {+0.136715f, +0.001962f, +0.001072f}, + {+0.010881f, +0.001506f, +0.004158f} + } +}; + +const float leftHRIRImag_HOA2[BINAURAL_CONVBANDS][HOA2_CHANNELS][BINAURAL_NTAPS_SBA]= +{ + { + {-0.067351f, +0.619497f, -0.224314f}, + {-0.139294f, +0.771571f, -0.258097f}, + {-0.003713f, +0.028657f, -0.008450f}, + {-0.024048f, +0.069155f, -0.020553f}, + {-0.025678f, -0.026025f, +0.019233f}, + {-0.009936f, -0.011063f, +0.007565f}, + {+0.034483f, +0.043638f, -0.029489f}, + {+0.006138f, -0.086263f, +0.038216f}, + {+0.046480f, +0.249243f, -0.117268f} + }, + { + {+0.012648f, +0.734658f, -0.184512f}, + {-0.111037f, +0.538674f, -0.336987f}, + {-0.002627f, -0.020803f, -0.029183f}, + {-0.030921f, +0.004858f, -0.041299f}, + {-0.051115f, -0.078198f, +0.009636f}, + {-0.016252f, -0.028855f, +0.008268f}, + {+0.084591f, +0.153968f, -0.000650f}, + {-0.017068f, -0.206982f, -0.012636f}, + {+0.164507f, +0.469681f, -0.054789f} + }, + { + {+0.223221f, -0.320495f, +0.172323f}, + {+0.327663f, -0.928806f, +0.128055f}, + {+0.019358f, -0.074304f, -0.015400f}, + {+0.035210f, -0.082508f, -0.021387f}, + {-0.001915f, +0.019754f, -0.041779f}, + {+0.009482f, -0.004447f, -0.006672f}, + {+0.039341f, +0.054366f, +0.052326f}, + {-0.015501f, -0.146235f, -0.037803f}, + {+0.140215f, +0.011558f, +0.133087f} + }, + { + {+0.158118f, -0.393316f, +0.132368f}, + {+0.546868f, -0.311888f, +0.284518f}, + {+0.031012f, +0.036496f, +0.023744f}, + {+0.107357f, +0.078785f, +0.019930f}, + {+0.117669f, +0.168393f, -0.014741f}, + {+0.063269f, +0.132935f, +0.029018f}, + {-0.110215f, -0.232883f, -0.026283f}, + {+0.026325f, -0.007643f, +0.015801f}, + {-0.156350f, -0.444539f, +0.006974f} + }, + { + {-0.158057f, +0.298412f, -0.065118f}, + {+0.180062f, +0.634611f, -0.013767f}, + {-0.011461f, +0.071086f, +0.018569f}, + {+0.074813f, +0.048439f, +0.032538f}, + {+0.176343f, -0.017086f, +0.039934f}, + {+0.070878f, +0.087909f, +0.042882f}, + {-0.196698f, -0.095181f, -0.059079f}, + {+0.043237f, +0.006669f, +0.001955f}, + {-0.440379f, +0.000452f, -0.098398f} + }, + { + {-0.449468f, +0.042993f, -0.088093f}, + {-0.450454f, -0.142745f, -0.162071f}, + {-0.082857f, -0.081326f, -0.023342f}, + {-0.091693f, -0.115333f, +0.002878f}, + {+0.059625f, -0.113643f, +0.022660f}, + {+0.002551f, -0.114733f, -0.021413f}, + {-0.134830f, +0.127944f, +0.015214f}, + {+0.039406f, -0.002734f, -0.000806f}, + {-0.456803f, +0.175205f, -0.017055f} + }, + { + {-0.521027f, -0.156261f, +0.000350f}, + {-0.908889f, -0.180570f, -0.051670f}, + {-0.108770f, -0.053291f, -0.027241f}, + {-0.287995f, +0.046150f, -0.015860f}, + {-0.175042f, +0.108856f, -0.012453f}, + {-0.059786f, -0.044325f, -0.033874f}, + {-0.008998f, -0.011671f, +0.039397f}, + {+0.004422f, -0.001021f, +0.005255f}, + {-0.225556f, -0.103116f, +0.036951f} + }, + { + {-0.371766f, +0.087065f, +0.052523f}, + {-1.010425f, +0.130810f, +0.067243f}, + {-0.070822f, +0.064314f, +0.008682f}, + {-0.381257f, -0.000635f, -0.013290f}, + {-0.375703f, -0.033440f, -0.023774f}, + {-0.081888f, +0.060050f, +0.009146f}, + {+0.099530f, -0.054172f, +0.002402f}, + {-0.055187f, -0.030383f, +0.004615f}, + {+0.113698f, +0.047344f, +0.023699f} + }, + { + {-0.133153f, +0.006407f, +0.034476f}, + {-0.837054f, +0.001398f, +0.067755f}, + {-0.019596f, -0.013995f, +0.025797f}, + {-0.306127f, -0.073720f, -0.002010f}, + {-0.417535f, -0.051347f, -0.011222f}, + {-0.096752f, +0.015410f, +0.024298f}, + {+0.165604f, -0.014311f, -0.020675f}, + {-0.110129f, +0.012754f, -0.001173f}, + {+0.396896f, -0.022479f, +0.001703f} + }, + { + {+0.076154f, -0.015041f, -0.005731f}, + {-0.558795f, -0.016178f, +0.011329f}, + {+0.001783f, -0.050805f, +0.008376f}, + {-0.100163f, +0.081596f, +0.016700f}, + {-0.287003f, +0.097687f, +0.016950f}, + {-0.130328f, -0.051441f, +0.002818f}, + {+0.194137f, +0.028286f, -0.006100f}, + {-0.128998f, -0.007273f, -0.004964f}, + {+0.525370f, -0.013001f, -0.010543f} + }, + { + {+0.227729f, -0.027128f, -0.019508f}, + {-0.280803f, -0.046474f, -0.016340f}, + {+0.006184f, +0.007629f, -0.010663f}, + {+0.124161f, -0.022132f, +0.014831f}, + {-0.082170f, -0.023992f, +0.023358f}, + {-0.168199f, +0.000379f, -0.008102f}, + {+0.185287f, +0.007140f, +0.002454f}, + {-0.098830f, -0.034738f, -0.000610f}, + {+0.505599f, +0.024919f, -0.016122f} + }, + { + {+0.345183f, +0.044417f, -0.008489f}, + {-0.029206f, +0.069971f, -0.008062f}, + {+0.040780f, +0.025656f, -0.005557f}, + {+0.280661f, +0.000086f, -0.001939f}, + {+0.091189f, -0.001516f, +0.001765f}, + {-0.178051f, +0.018186f, +0.003683f}, + {+0.147526f, -0.011735f, +0.000472f}, + {-0.034700f, +0.017373f, +0.007552f}, + {+0.404231f, -0.018810f, -0.013580f} + }, + { + {+0.447376f, -0.029945f, +0.002359f}, + {+0.196485f, -0.048776f, +0.000528f}, + {+0.131413f, -0.031345f, +0.001264f}, + {+0.352086f, -0.000092f, -0.009252f}, + {+0.196164f, -0.010102f, -0.008244f}, + {-0.137927f, -0.001411f, +0.005445f}, + {+0.094224f, +0.013361f, +0.000776f}, + {+0.030220f, +0.002376f, +0.001349f}, + {+0.282599f, +0.004869f, -0.002937f} + }, + { + {+0.532898f, +0.008836f, +0.002166f}, + {+0.392609f, +0.034792f, -0.000679f}, + {+0.270895f, +0.030297f, -0.000156f}, + {+0.364913f, -0.004283f, -0.009820f}, + {+0.243967f, +0.002627f, -0.007384f}, + {-0.037047f, +0.017787f, -0.004491f}, + {+0.041930f, -0.015182f, -0.000239f}, + {+0.078287f, +0.007042f, -0.004821f}, + {+0.167608f, -0.019027f, +0.005545f} + }, + { + {+0.594888f, -0.002438f, -0.003208f}, + {+0.547092f, -0.023930f, -0.003204f}, + {+0.418638f, -0.023295f, -0.006545f}, + {+0.358947f, -0.011193f, -0.005371f}, + {+0.268043f, -0.007992f, -0.005934f}, + {+0.108159f, -0.040803f, -0.007847f}, + {+0.014237f, +0.000657f, -0.000908f}, + {+0.104780f, -0.013359f, -0.000511f}, + {+0.064568f, +0.028680f, +0.003338f} + }, + { + {+0.635005f, +0.006702f, -0.005006f}, + {+0.650934f, +0.013984f, -0.004474f}, + {+0.519015f, +0.020899f, -0.008786f}, + {+0.354058f, +0.000065f, -0.000944f}, + {+0.293166f, +0.009243f, -0.003786f}, + {+0.244478f, +0.036317f, -0.004273f}, + {+0.027137f, +0.008991f, +0.000305f}, + {+0.112434f, -0.002933f, +0.003310f}, + {-0.019782f, -0.018420f, -0.000608f} + }, + { + {+0.661388f, -0.006850f, -0.003249f}, + {+0.709859f, -0.007935f, -0.004126f}, + {+0.524557f, -0.002414f, -0.002080f}, + {+0.344994f, +0.003888f, -0.002639f}, + {+0.316812f, -0.006036f, -0.003412f}, + {+0.307717f, -0.012550f, +0.001272f}, + {+0.076841f, -0.011681f, -0.000880f}, + {+0.115864f, +0.008381f, -0.000189f}, + {-0.078312f, +0.007256f, -0.000761f} + }, + { + {+0.681780f, +0.004317f, -0.002114f}, + {+0.740600f, +0.002506f, -0.003738f}, + {+0.416864f, -0.038264f, +0.003168f}, + {+0.319577f, -0.000792f, -0.001313f}, + {+0.319873f, +0.002666f, -0.002245f}, + {+0.258538f, -0.029824f, +0.003409f}, + {+0.141548f, +0.012818f, -0.003839f}, + {+0.135337f, +0.001218f, -0.005061f}, + {-0.109830f, +0.001645f, +0.001441f} + }, + { + {+0.699871f, -0.003221f, -0.002308f}, + {+0.762514f, -0.004609f, -0.003814f}, + {+0.225434f, +0.064939f, -0.001450f}, + {+0.266431f, +0.012897f, +0.002255f}, + {+0.282175f, +0.010311f, +0.000422f}, + {+0.108713f, +0.058556f, -0.002399f}, + {+0.186968f, -0.009396f, -0.004807f}, + {+0.178376f, -0.016506f, -0.006062f}, + {-0.120383f, -0.003023f, +0.004088f} + }, + { + {+0.714529f, +0.003253f, -0.002414f}, + {+0.790696f, +0.011388f, -0.001985f}, + {+0.020833f, -0.046458f, -0.007156f}, + {+0.185944f, -0.029249f, +0.000016f}, + {+0.197551f, -0.028731f, -0.000138f}, + {-0.079181f, -0.043101f, -0.006863f}, + {+0.176963f, -0.004258f, -0.002861f}, + {+0.228839f, +0.021085f, -0.002090f}, + {-0.119574f, -0.002646f, +0.004158f} + }, + { + {+0.721602f, -0.001258f, -0.002069f}, + {+0.831027f, -0.010846f, +0.000173f}, + {-0.126177f, +0.009153f, -0.003439f}, + {+0.096173f, +0.020892f, -0.003906f}, + {+0.084227f, +0.027335f, -0.001653f}, + {-0.229925f, +0.010207f, -0.000875f}, + {+0.090658f, +0.023511f, +0.000256f}, + {+0.250703f, +0.000323f, +0.000133f}, + {-0.115659f, +0.011998f, -0.001947f} + }, + { + {+0.717593f, -0.001188f, -0.001513f}, + {+0.881199f, +0.003795f, -0.002266f}, + {-0.186085f, +0.008805f, +0.004207f}, + {+0.021886f, +0.000682f, +0.000980f}, + {-0.024639f, -0.019808f, -0.000274f}, + {-0.296639f, +0.006775f, +0.008463f}, + {-0.060930f, -0.036828f, +0.003817f}, + {+0.210581f, -0.022700f, -0.003357f}, + {-0.112881f, +0.004715f, -0.006188f} + }, + { + {+0.702872f, +0.004202f, -0.000899f}, + {+0.934393f, -0.006557f, -0.007476f}, + {-0.176147f, -0.010014f, +0.006716f}, + {-0.022135f, +0.003624f, +0.007346f}, + {-0.100594f, +0.012448f, +0.000135f}, + {-0.271960f, -0.005598f, +0.007977f}, + {-0.233701f, +0.046766f, +0.003616f}, + {+0.101020f, +0.023227f, -0.002321f}, + {-0.116785f, -0.020405f, +0.002997f} + }, + { + {+0.682250f, -0.007566f, -0.001501f}, + {+0.978417f, +0.017585f, -0.006636f}, + {-0.137592f, +0.005047f, +0.003880f}, + {-0.028458f, -0.006826f, +0.004609f}, + {-0.129898f, +0.005880f, +0.001391f}, + {-0.175874f, +0.016526f, -0.001013f}, + {-0.367276f, -0.033929f, -0.002775f}, + {-0.060514f, -0.037887f, +0.002465f}, + {-0.137333f, -0.006964f, +0.011955f} + }, + { + {+0.663415f, +0.004606f, -0.002781f}, + {+0.993852f, -0.009178f, +0.000038f}, + {-0.108250f, -0.003270f, +0.001437f}, + {+0.009848f, -0.008477f, -0.000681f}, + {-0.118923f, -0.012268f, +0.005212f}, + {-0.044501f, -0.037572f, -0.003962f}, + {-0.416290f, -0.006378f, -0.006076f}, + {-0.236610f, +0.040350f, +0.002858f}, + {-0.168887f, +0.032800f, +0.004036f} + }, + { + {+0.651781f, +0.001152f, -0.002457f}, + {+0.965546f, -0.016499f, +0.002125f}, + {-0.105651f, -0.001646f, +0.002481f}, + {+0.090167f, +0.025763f, -0.001130f}, + {-0.087686f, +0.003999f, +0.005549f}, + {+0.075223f, +0.035790f, +0.002847f}, + {-0.383115f, +0.037796f, +0.001566f}, + {-0.378556f, -0.025237f, +0.002287f}, + {-0.179845f, -0.008941f, -0.008124f} + }, + { + {+0.645685f, -0.002682f, -0.000593f}, + {+0.900401f, +0.029783f, -0.003285f}, + {-0.124380f, +0.012275f, +0.001822f}, + {+0.193225f, -0.027406f, +0.000945f}, + {-0.052400f, +0.001580f, +0.000684f}, + {+0.141411f, +0.002262f, +0.004491f}, + {-0.319576f, -0.023501f, +0.010635f}, + {-0.448327f, +0.001574f, +0.004044f}, + {-0.141908f, -0.032139f, -0.005596f} + }, + { + {+0.638137f, -0.002412f, +0.000310f}, + {+0.826423f, -0.017144f, -0.007574f}, + {-0.140725f, -0.006104f, -0.000815f}, + {+0.290930f, +0.019453f, +0.001904f}, + {-0.016875f, +0.009182f, -0.001656f}, + {+0.145675f, -0.017736f, -0.001807f}, + {-0.285941f, -0.010851f, +0.008570f}, + {-0.435070f, +0.011023f, +0.004307f}, + {-0.062178f, +0.036767f, +0.005654f} + }, + { + {+0.623287f, +0.007299f, -0.001056f}, + {+0.770521f, -0.001075f, -0.004559f}, + {-0.130645f, -0.003274f, -0.002902f}, + {+0.361351f, -0.005902f, +0.000348f}, + {+0.020477f, -0.011841f, +0.000752f}, + {+0.114514f, +0.018145f, -0.007488f}, + {-0.305625f, +0.026256f, -0.000446f}, + {-0.353862f, -0.030431f, +0.004835f}, + {+0.024417f, -0.010793f, +0.007820f} + }, + { + {+0.600902f, -0.006021f, -0.002348f}, + {+0.739248f, +0.005015f, +0.001571f}, + {-0.087167f, +0.021027f, -0.001847f}, + {+0.400187f, +0.000286f, -0.002317f}, + {+0.060945f, +0.009244f, +0.002589f}, + {+0.083328f, +0.001928f, -0.007725f}, + {-0.359405f, -0.019595f, -0.006438f}, + {-0.237042f, +0.027090f, +0.006659f}, + {+0.089013f, -0.004244f, -0.000128f} + }, + { + {+0.574438f, +0.003368f, -0.001494f}, + {+0.720431f, +0.005878f, +0.002928f}, + {-0.025553f, -0.022088f, +0.002875f}, + {+0.419048f, +0.001480f, -0.004334f}, + {+0.105303f, -0.000852f, -0.000385f}, + {+0.070507f, -0.013892f, -0.000793f}, + {-0.411663f, -0.001662f, -0.003755f}, + {-0.118815f, -0.013893f, +0.002937f}, + {+0.127181f, -0.002212f, -0.005490f} + }, + { + {+0.546941f, -0.004959f, -0.000239f}, + {+0.700235f, -0.009986f, -0.000285f}, + {+0.026874f, +0.006811f, +0.004565f}, + {+0.432826f, +0.004148f, -0.005149f}, + {+0.153860f, +0.009932f, -0.004309f}, + {+0.067445f, +0.005555f, +0.005512f}, + {-0.441084f, +0.007824f, +0.003852f}, + {-0.016912f, +0.012081f, -0.003174f}, + {+0.148914f, +0.007013f, -0.004323f} + }, + { + {+0.520436f, +0.006384f, -0.000382f}, + {+0.674657f, +0.006620f, -0.001998f}, + {+0.052406f, +0.010142f, -0.000198f}, + {+0.447102f, -0.009070f, -0.003159f}, + {+0.202135f, -0.018081f, -0.002032f}, + {+0.055887f, +0.014144f, +0.003615f}, + {-0.448314f, -0.001324f, +0.007309f}, + {+0.065957f, -0.020607f, -0.003258f}, + {+0.162472f, -0.004875f, -0.002127f} + }, + { + {+0.496665f, -0.004859f, -0.000887f}, + {+0.647428f, -0.004741f, -0.001434f}, + {+0.053060f, -0.007546f, -0.006118f}, + {+0.453309f, +0.004051f, -0.000324f}, + {+0.237178f, +0.009221f, +0.002058f}, + {+0.029969f, -0.014850f, -0.002643f}, + {-0.439805f, -0.002523f, +0.005619f}, + {+0.128558f, +0.010056f, -0.001511f}, + {+0.167737f, +0.001236f, -0.001456f} + }, + { + {+0.475983f, +0.003710f, -0.000970f}, + {+0.624608f, +0.003603f, -0.000812f}, + {+0.042149f, -0.008534f, -0.003432f}, + {+0.438672f, +0.005526f, +0.000965f}, + {+0.249063f, +0.004782f, +0.002016f}, + {-0.000807f, +0.001028f, -0.002841f}, + {-0.416440f, +0.003745f, +0.000359f}, + {+0.170217f, -0.009457f, -0.000867f}, + {+0.158107f, +0.002167f, -0.000901f} + }, + { + {+0.456962f, -0.002559f, -0.000574f}, + {+0.609653f, -0.002905f, -0.001117f}, + {+0.025784f, -0.000666f, +0.002060f}, + {+0.399694f, -0.014955f, +0.000161f}, + {+0.242149f, -0.009905f, -0.001262f}, + {-0.026686f, +0.000156f, +0.001218f}, + {-0.373014f, +0.013273f, -0.002730f}, + {+0.191984f, -0.000973f, -0.000838f}, + {+0.127455f, -0.008313f, +0.000023f} + }, + { + {+0.437008f, +0.003925f, -0.000081f}, + {+0.601093f, +0.000232f, -0.001372f}, + {+0.002960f, +0.010345f, +0.001054f}, + {+0.347170f, +0.016956f, -0.002319f}, + {+0.233004f, +0.002825f, -0.003373f}, + {-0.044339f, +0.004384f, +0.002020f}, + {-0.309506f, -0.024368f, +0.000882f}, + {+0.198003f, -0.000405f, -0.001486f}, + {+0.077236f, +0.014350f, -0.000034f} + }, + { + {+0.414109f, -0.005431f, -0.000037f}, + {+0.592705f, -0.001470f, -0.001222f}, + {-0.024584f, -0.008451f, -0.001721f}, + {+0.300043f, -0.007510f, -0.003376f}, + {+0.236922f, +0.005189f, -0.002904f}, + {-0.053435f, -0.002953f, +0.000365f}, + {-0.239443f, +0.015553f, +0.003945f}, + {+0.195817f, -0.003961f, -0.001987f}, + {+0.019225f, -0.012398f, -0.000024f} + }, + { + {+0.388577f, +0.006627f, -0.000411f}, + {+0.576851f, +0.002898f, -0.000753f}, + {-0.052952f, +0.001666f, -0.000781f}, + {+0.271771f, -0.002315f, -0.001136f}, + {+0.256751f, -0.010892f, -0.000933f}, + {-0.055321f, -0.000623f, -0.000321f}, + {-0.178829f, -0.004699f, +0.001577f}, + {+0.192108f, -0.001841f, -0.002156f}, + {-0.030601f, +0.010281f, +0.000029f} + }, + { + {+0.362659f, -0.006023f, -0.001007f}, + {+0.548393f, -0.008477f, -0.000553f}, + {-0.079254f, -0.004768f, +0.001192f}, + {+0.262246f, +0.003901f, +0.002002f}, + {+0.282691f, +0.009035f, +0.001549f}, + {-0.052737f, +0.001616f, +0.000062f}, + {-0.134033f, +0.004191f, -0.001751f}, + {+0.189322f, +0.000295f, -0.001194f}, + {-0.059659f, -0.002213f, -0.000053f} + }, + { + {+0.339002f, +0.002927f, -0.000712f}, + {+0.507223f, +0.011672f, -0.001408f}, + {-0.101892f, +0.008754f, -0.000366f}, + {+0.261016f, +0.005455f, +0.000964f}, + {+0.300336f, +0.003329f, +0.000659f}, + {-0.049601f, +0.001946f, -0.000746f}, + {-0.101681f, -0.008021f, -0.001522f}, + {+0.184646f, -0.000891f, -0.000474f}, + {-0.064232f, -0.004100f, +0.000831f} + }, + { + {+0.318447f, -0.002583f, +0.000342f}, + {+0.458166f, -0.011334f, -0.002134f}, + {-0.119857f, -0.003793f, -0.002673f}, + {+0.257649f, -0.004527f, -0.002750f}, + {+0.302642f, -0.006786f, -0.003304f}, + {-0.050079f, -0.001140f, -0.002294f}, + {-0.075154f, +0.006079f, +0.000154f}, + {+0.175259f, -0.002462f, +0.000450f}, + {-0.050689f, +0.006815f, +0.002112f} + }, + { + {+0.300124f, +0.004647f, +0.000429f}, + {+0.407177f, +0.007551f, -0.001229f}, + {-0.135280f, -0.004904f, -0.000353f}, + {+0.246029f, -0.001362f, -0.002342f}, + {+0.292460f, +0.000038f, -0.003938f}, + {-0.057770f, -0.002994f, -0.000700f}, + {-0.048950f, -0.002677f, -0.000542f}, + {+0.161196f, +0.006930f, -0.000490f}, + {-0.030107f, -0.002304f, +0.001927f} + }, + { + {+0.283695f, -0.004672f, -0.000499f}, + {+0.357931f, -0.007644f, +0.000792f}, + {-0.154465f, -0.001114f, +0.004046f}, + {+0.221394f, -0.002251f, +0.001225f}, + {+0.274104f, +0.001365f, -0.000312f}, + {-0.076006f, -0.003175f, +0.002372f}, + {-0.019797f, +0.006502f, -0.001827f}, + {+0.147944f, -0.003560f, -0.001898f}, + {-0.011081f, -0.000127f, -0.000375f} + }, + { + {+0.269518f, +0.002457f, -0.001001f}, + {+0.311326f, +0.012837f, +0.000327f}, + {-0.181319f, +0.014112f, +0.003014f}, + {+0.182651f, +0.012951f, +0.002036f}, + {+0.248875f, +0.007948f, +0.001266f}, + {-0.104063f, +0.013233f, +0.001219f}, + {+0.010928f, -0.008987f, -0.001152f}, + {+0.141371f, -0.000838f, -0.001781f}, + {+0.004297f, -0.004808f, -0.000787f} + }, + { + {+0.257138f, -0.000471f, -0.000295f}, + {+0.269065f, -0.008971f, -0.001327f}, + {-0.209242f, -0.009445f, -0.000789f}, + {+0.136359f, -0.015642f, -0.000837f}, + {+0.218917f, -0.009939f, -0.000695f}, + {-0.133100f, -0.007332f, -0.001415f}, + {+0.037336f, +0.006071f, +0.000081f}, + {+0.141848f, +0.003924f, -0.000450f}, + {+0.015759f, +0.001304f, -0.000104f} + }, + { + {+0.244594f, +0.002255f, +0.000537f}, + {+0.232039f, +0.006188f, -0.001385f}, + {-0.226456f, -0.005183f, +0.000708f}, + {+0.094177f, +0.004239f, -0.001379f}, + {+0.188550f, +0.003755f, -0.001033f}, + {-0.152408f, -0.005083f, +0.000982f}, + {+0.053373f, +0.001503f, -0.000759f}, + {+0.144008f, -0.001965f, +0.000959f}, + {+0.023577f, -0.002308f, -0.000076f} + }, + { + {+0.229867f, -0.004876f, +0.000170f}, + {+0.197603f, -0.004728f, -0.000560f}, + {-0.226600f, +0.010780f, +0.006854f}, + {+0.064221f, +0.003891f, +0.003122f}, + {+0.161189f, +0.001104f, +0.002261f}, + {-0.157190f, +0.008241f, +0.006888f}, + {+0.056895f, -0.003410f, -0.003127f}, + {+0.141412f, -0.001071f, +0.001644f}, + {+0.029485f, +0.003593f, +0.001358f} + }, + { + {+0.212288f, +0.005142f, -0.000800f}, + {+0.162483f, +0.004117f, +0.001433f}, + {-0.209328f, -0.002547f, +0.009702f}, + {+0.048193f, +0.000129f, +0.007210f}, + {+0.139874f, +0.002121f, +0.005784f}, + {-0.146647f, +0.000237f, +0.009054f}, + {+0.049793f, -0.001403f, -0.002729f}, + {+0.132126f, +0.003164f, +0.002133f}, + {+0.035201f, -0.000152f, +0.002301f} + }, + { + {+0.191599f, -0.002871f, -0.000708f}, + {+0.125250f, -0.008746f, +0.003116f}, + {-0.175384f, -0.002970f, +0.005044f}, + {+0.046507f, -0.009000f, +0.004794f}, + {+0.128202f, -0.013178f, +0.002850f}, + {-0.120273f, -0.005762f, +0.003583f}, + {+0.034030f, -0.000067f, +0.000427f}, + {+0.118790f, -0.004116f, +0.002419f}, + {+0.044052f, -0.001094f, +0.001102f} + } +}; + +const float rightHRIRReal_HOA2[BINAURAL_CONVBANDS][HOA2_CHANNELS][BINAURAL_NTAPS_SBA]= +{ + { + {+0.018159f, +0.985146f, +0.240506f}, + {-0.077046f, +0.024713f, -0.260411f}, + {+0.000593f, +0.132269f, +0.000009f}, + {+0.009213f, +0.054471f, +0.004257f}, + {-0.039823f, +0.044599f, +0.001606f}, + {-0.011090f, +0.028094f, -0.011739f}, + {-0.057613f, +0.083209f, +0.004522f}, + {+0.010244f, +0.028373f, -0.010969f}, + {-0.107601f, +0.182275f, +0.052385f} + }, + { + {-0.152534f, -0.329898f, -0.242342f}, + {+0.209786f, +1.273585f, +0.112026f}, + {-0.011413f, +0.080591f, -0.013524f}, + {-0.034221f, +0.013783f, +0.008826f}, + {+0.012372f, -0.014808f, -0.038195f}, + {-0.003235f, -0.083338f, -0.068446f}, + {+0.003314f, -0.032912f, -0.065265f}, + {+0.003322f, +0.076317f, +0.007937f}, + {-0.015189f, -0.220191f, -0.130843f} + }, + { + {-0.023093f, -0.558938f, -0.150964f}, + {+0.270176f, +0.589966f, +0.359432f}, + {-0.003260f, +0.097037f, -0.014970f}, + {-0.058519f, +0.107799f, -0.014627f}, + {+0.084143f, -0.174088f, +0.006734f}, + {+0.035814f, -0.281769f, +0.006166f}, + {+0.116511f, -0.307921f, +0.020292f}, + {-0.013401f, +0.086307f, +0.012981f}, + {+0.209526f, -0.554513f, -0.048661f} + }, + { + {+0.261551f, +0.304347f, +0.114032f}, + {-0.250896f, -0.779633f, -0.070356f}, + {+0.023786f, +0.088663f, -0.030815f}, + {+0.003407f, +0.082081f, -0.041209f}, + {+0.062118f, -0.047824f, +0.057239f}, + {+0.026013f, -0.155692f, +0.065882f}, + {+0.127095f, -0.164040f, +0.077176f}, + {-0.022006f, +0.035999f, -0.005698f}, + {+0.327951f, -0.045215f, +0.125831f} + }, + { + {+0.359497f, +0.205525f, +0.109865f}, + {-0.745384f, -0.051437f, -0.216054f}, + {+0.066207f, -0.076438f, +0.024748f}, + {+0.143496f, -0.123266f, +0.007838f}, + {-0.098368f, +0.139294f, +0.014972f}, + {-0.065224f, +0.122143f, -0.029816f}, + {-0.019520f, +0.163808f, -0.024174f}, + {+0.008568f, -0.024216f, +0.013284f}, + {+0.111141f, +0.311803f, +0.021197f} + }, + { + {+0.165159f, -0.254129f, -0.025534f}, + {-0.780421f, +0.408205f, -0.025264f}, + {+0.043262f, -0.082839f, +0.025956f}, + {+0.214774f, -0.021619f, +0.026192f}, + {-0.266921f, -0.073753f, -0.026414f}, + {-0.110056f, +0.068805f, -0.038706f}, + {-0.162323f, +0.018037f, -0.046919f}, + {+0.046582f, -0.024241f, +0.003856f}, + {-0.254154f, -0.105995f, -0.060073f} + }, + { + {-0.177496f, +0.069944f, -0.070544f}, + {-0.384878f, -0.205067f, +0.111476f}, + {-0.035734f, +0.067378f, -0.014549f}, + {+0.125583f, +0.062055f, +0.008649f}, + {-0.294346f, -0.048254f, -0.026299f}, + {-0.090207f, -0.084523f, +0.015326f}, + {-0.211714f, -0.100002f, +0.007755f}, + {+0.078344f, -0.022510f, -0.004774f}, + {-0.527842f, -0.045905f, -0.024578f} + }, + { + {-0.463362f, +0.056885f, -0.021761f}, + {+0.150954f, -0.026543f, +0.068293f}, + {-0.101521f, +0.000813f, -0.025478f}, + {-0.095046f, -0.089523f, -0.003261f}, + {-0.134616f, +0.104561f, -0.001013f}, + {-0.059105f, -0.025388f, +0.028020f}, + {-0.181070f, -0.006996f, +0.032275f}, + {+0.082036f, -0.002388f, +0.001840f}, + {-0.586330f, +0.048806f, +0.016554f} + }, + { + {-0.592381f, -0.044571f, +0.029549f}, + {+0.576892f, +0.036976f, -0.022220f}, + {-0.119596f, -0.060394f, -0.001555f}, + {-0.338453f, +0.063985f, -0.014668f}, + {+0.125238f, -0.093159f, +0.021501f}, + {-0.045169f, +0.044028f, -0.000433f}, + {-0.115198f, +0.025252f, +0.004920f}, + {+0.041077f, +0.008697f, +0.004995f}, + {-0.438497f, -0.055561f, +0.020980f} + }, + { + {-0.599054f, -0.014356f, +0.032985f}, + {+0.822874f, +0.044354f, -0.046136f}, + {-0.117506f, +0.008009f, +0.019868f}, + {-0.479925f, +0.018761f, -0.007799f}, + {+0.339581f, +0.001799f, +0.018360f}, + {-0.028531f, +0.004096f, -0.014580f}, + {-0.035532f, +0.016131f, -0.009871f}, + {-0.031577f, -0.038412f, +0.000988f}, + {-0.188266f, +0.051427f, +0.014971f} + }, + { + {-0.558565f, +0.027629f, +0.008677f}, + {+0.934558f, -0.055883f, -0.019701f}, + {-0.143536f, +0.040687f, +0.009496f}, + {-0.475498f, -0.046650f, +0.012347f}, + {+0.418986f, +0.046808f, -0.009187f}, + {+0.019973f, -0.045258f, -0.001389f}, + {+0.040837f, -0.027615f, -0.004137f}, + {-0.104086f, +0.015540f, -0.006688f}, + {+0.045132f, -0.020688f, +0.004131f} + }, + { + {-0.508817f, +0.002572f, -0.006006f}, + {+0.966334f, +0.010598f, -0.000935f}, + {-0.200114f, -0.021501f, -0.002245f}, + {-0.374199f, +0.021235f, +0.015875f}, + {+0.383236f, -0.011504f, -0.019281f}, + {+0.101681f, +0.007702f, +0.004459f}, + {+0.098607f, +0.009824f, -0.000170f}, + {-0.142186f, +0.015367f, -0.000073f}, + {+0.202499f, +0.007942f, -0.007850f} + }, + { + {-0.449816f, -0.025700f, -0.002766f}, + {+0.942805f, +0.019015f, -0.002630f}, + {-0.251515f, +0.005009f, -0.000037f}, + {-0.247529f, -0.018163f, +0.007953f}, + {+0.297646f, +0.008359f, -0.008978f}, + {+0.194833f, -0.010293f, -0.006773f}, + {+0.127610f, -0.005400f, -0.000110f}, + {-0.141062f, -0.005988f, +0.007030f}, + {+0.285592f, -0.008291f, -0.012555f} + }, + { + {-0.376168f, +0.026055f, +0.004627f}, + {+0.871841f, -0.021874f, -0.006470f}, + {-0.251474f, +0.012379f, +0.004839f}, + {-0.143351f, +0.003085f, +0.000557f}, + {+0.213031f, -0.008846f, -0.002525f}, + {+0.266224f, +0.023397f, -0.007678f}, + {+0.122414f, -0.005951f, +0.000933f}, + {-0.115352f, -0.004480f, +0.001947f}, + {+0.318209f, +0.018171f, -0.006837f} + }, + { + {-0.293873f, -0.014103f, +0.005564f}, + {+0.763509f, +0.026484f, -0.005957f}, + {-0.167339f, -0.021635f, +0.004681f}, + {-0.071079f, -0.008355f, -0.004673f}, + {+0.149092f, +0.004738f, +0.000445f}, + {+0.269948f, -0.002632f, -0.000196f}, + {+0.088484f, +0.013962f, +0.000022f}, + {-0.080315f, -0.009623f, -0.002700f}, + {+0.315546f, +0.000498f, +0.000137f} + }, + { + {-0.214030f, +0.010451f, +0.001827f}, + {+0.638609f, -0.024424f, -0.004195f}, + {-0.000480f, +0.033426f, -0.002795f}, + {-0.011678f, +0.017775f, -0.002438f}, + {+0.092630f, -0.011217f, +0.001499f}, + {+0.179494f, -0.027872f, +0.004886f}, + {+0.049375f, -0.006195f, +0.000322f}, + {-0.050886f, +0.014806f, +0.001580f}, + {+0.284102f, -0.013452f, -0.000223f} + }, + { + {-0.142407f, -0.012908f, -0.000129f}, + {+0.521031f, +0.021513f, -0.002424f}, + {+0.212730f, -0.053828f, -0.007313f}, + {+0.050092f, -0.009707f, -0.001567f}, + {+0.022713f, +0.014891f, +0.001899f}, + {+0.013352f, +0.051652f, +0.004824f}, + {+0.034982f, -0.000584f, +0.002038f}, + {-0.037735f, -0.000643f, +0.005700f}, + {+0.234664f, +0.015884f, -0.002619f} + }, + { + {-0.078162f, +0.013149f, +0.000240f}, + {+0.425304f, -0.016123f, -0.001883f}, + {+0.408229f, +0.052323f, -0.001957f}, + {+0.116415f, +0.013525f, -0.004497f}, + {-0.067314f, -0.020251f, +0.003762f}, + {-0.167553f, -0.051767f, -0.000869f}, + {+0.068137f, +0.009479f, +0.001235f}, + {-0.034203f, -0.008399f, +0.003763f}, + {+0.180796f, -0.011205f, -0.003598f} + }, + { + {-0.016750f, -0.012127f, +0.000498f}, + {+0.353965f, +0.008335f, -0.000653f}, + {+0.518342f, -0.011173f, +0.002964f}, + {+0.177026f, -0.019969f, -0.002705f}, + {-0.164814f, +0.026646f, +0.003238f}, + {-0.286213f, +0.012718f, -0.003816f}, + {+0.155640f, -0.020546f, -0.001850f}, + {-0.016416f, +0.003918f, -0.001774f}, + {+0.133919f, +0.003314f, -0.001822f} + }, + { + {+0.046182f, +0.012351f, -0.000034f}, + {+0.298885f, -0.009039f, +0.000810f}, + {+0.511610f, -0.032188f, -0.002291f}, + {+0.211380f, +0.005455f, +0.000933f}, + {-0.241218f, -0.015123f, +0.001103f}, + {-0.293508f, +0.029470f, +0.003051f}, + {+0.280548f, +0.030234f, -0.004368f}, + {+0.041260f, +0.018979f, -0.004541f}, + {+0.098998f, +0.002094f, +0.002904f} + }, + { + {+0.111605f, -0.013530f, -0.000652f}, + {+0.246690f, +0.016108f, -0.001020f}, + {+0.413977f, +0.038179f, -0.009520f}, + {+0.203190f, +0.017508f, -0.002191f}, + {-0.268601f, -0.003682f, +0.001755f}, + {-0.196136f, -0.036857f, +0.009761f}, + {+0.402137f, -0.026686f, -0.005055f}, + {+0.145035f, -0.035432f, -0.001365f}, + {+0.074946f, +0.007868f, +0.004954f} + }, + { + {+0.176108f, +0.013431f, -0.000958f}, + {+0.185298f, -0.016846f, -0.004677f}, + {+0.286889f, -0.019450f, -0.007487f}, + {+0.153787f, -0.015814f, -0.006505f}, + {-0.239195f, +0.011851f, +0.001930f}, + {-0.042102f, +0.023553f, +0.004947f}, + {+0.470133f, +0.012898f, -0.003624f}, + {+0.270107f, +0.025928f, -0.000154f}, + {+0.059116f, -0.020434f, -0.003101f} + }, + { + {+0.234033f, -0.013522f, -0.000160f}, + {+0.105917f, +0.008837f, -0.002769f}, + {+0.184987f, +0.008247f, -0.000624f}, + {+0.076510f, +0.005900f, -0.001804f}, + {-0.166708f, -0.022644f, +0.001485f}, + {+0.112604f, -0.020438f, -0.005184f}, + {+0.450824f, +0.006092f, +0.002002f}, + {+0.374333f, -0.013645f, -0.004183f}, + {+0.050668f, -0.002470f, -0.009849f} + }, + { + {+0.280701f, +0.008633f, +0.001045f}, + {+0.002220f, -0.016553f, +0.003998f}, + {+0.131643f, -0.003842f, +0.001872f}, + {-0.015690f, -0.016479f, +0.005047f}, + {-0.077685f, +0.023492f, +0.003551f}, + {+0.223388f, +0.024340f, -0.007042f}, + {+0.346787f, -0.042038f, +0.003586f}, + {+0.418985f, +0.005219f, -0.005591f}, + {+0.040023f, +0.024273f, +0.000362f} + }, + { + {+0.315972f, -0.002222f, +0.000114f}, + {-0.123110f, +0.036764f, +0.004764f}, + {+0.119199f, -0.002064f, +0.000988f}, + {-0.106689f, +0.025325f, +0.004605f}, + {+0.000310f, -0.007517f, +0.002748f}, + {+0.262374f, -0.010338f, -0.000067f}, + {+0.204029f, +0.052292f, -0.005305f}, + {+0.380172f, +0.016758f, -0.003741f}, + {+0.003388f, +0.008217f, +0.011667f} + }, + { + {+0.346296f, +0.003536f, -0.001898f}, + {-0.248976f, -0.036524f, -0.001389f}, + {+0.120849f, +0.002931f, +0.000722f}, + {-0.173186f, -0.016622f, +0.000289f}, + {+0.054827f, +0.000181f, -0.002418f}, + {+0.225358f, -0.023135f, +0.002820f}, + {+0.091375f, -0.014867f, -0.010230f}, + {+0.260139f, -0.034357f, -0.002468f}, + {-0.068405f, -0.042485f, +0.005111f} + }, + { + {+0.379862f, -0.009494f, -0.001961f}, + {-0.345947f, +0.013885f, -0.004347f}, + {+0.108945f, +0.001609f, +0.002277f}, + {-0.194971f, -0.005237f, -0.000216f}, + {+0.090631f, -0.007307f, -0.004497f}, + {+0.139916f, +0.036851f, -0.003429f}, + {+0.049457f, -0.016676f, -0.004125f}, + {+0.089658f, +0.040648f, -0.001276f}, + {-0.147747f, +0.028109f, -0.006357f} + }, + { + {+0.419521f, +0.011992f, -0.000293f}, + {-0.399888f, +0.006995f, +0.000613f}, + {+0.071268f, -0.013451f, +0.003383f}, + {-0.169244f, +0.016170f, +0.002968f}, + {+0.116230f, +0.009802f, -0.001756f}, + {+0.053621f, -0.017175f, -0.008163f}, + {+0.065166f, +0.025359f, +0.005381f}, + {-0.086447f, -0.037823f, -0.001051f}, + {-0.194782f, +0.007204f, -0.005393f} + }, + { + {+0.461674f, -0.009238f, +0.000744f}, + {-0.422873f, -0.002942f, +0.006024f}, + {+0.017965f, +0.019932f, +0.001068f}, + {-0.112940f, -0.014296f, +0.003691f}, + {+0.135675f, -0.004946f, +0.000913f}, + {+0.001359f, -0.007810f, -0.003619f}, + {+0.090834f, -0.000688f, +0.008234f}, + {-0.227027f, +0.020653f, -0.000262f}, + {-0.193552f, -0.020886f, +0.003761f} + }, + { + {+0.500543f, +0.004460f, -0.000339f}, + {-0.438946f, -0.008173f, +0.005382f}, + {-0.025063f, -0.012096f, -0.002727f}, + {-0.048264f, +0.016297f, +0.004137f}, + {+0.148356f, -0.006714f, -0.001928f}, + {-0.016069f, +0.011271f, +0.004203f}, + {+0.085225f, -0.019738f, +0.001763f}, + {-0.310418f, -0.002136f, +0.003576f}, + {-0.158213f, +0.011793f, +0.008536f} + }, + { + {+0.533110f, -0.005084f, -0.001776f}, + {-0.463561f, +0.015347f, +0.000549f}, + {-0.035070f, -0.007804f, -0.002842f}, + {+0.008595f, -0.003050f, +0.002916f}, + {+0.153491f, -0.002287f, -0.004867f}, + {-0.021318f, -0.000337f, +0.007722f}, + {+0.040490f, +0.023364f, -0.005685f}, + {-0.339640f, -0.004014f, +0.007635f}, + {-0.113068f, +0.002471f, +0.003970f} + }, + { + {+0.559507f, +0.006521f, -0.001337f}, + {-0.495821f, -0.006508f, -0.001808f}, + {-0.009393f, +0.020033f, +0.002230f}, + {+0.057093f, +0.005006f, -0.000599f}, + {+0.147824f, +0.005127f, -0.001599f}, + {-0.035200f, -0.017556f, +0.003623f}, + {-0.026148f, -0.010270f, -0.006517f}, + {-0.331865f, -0.002383f, +0.006123f}, + {-0.069791f, +0.006016f, -0.000948f} + }, + { + {+0.580524f, -0.004095f, -0.000494f}, + {-0.527187f, +0.003574f, -0.000131f}, + {+0.034392f, -0.012275f, +0.006324f}, + {+0.108521f, -0.008134f, -0.002780f}, + {+0.124651f, +0.003736f, +0.002434f}, + {-0.058607f, +0.013665f, -0.003392f}, + {-0.096848f, +0.005058f, -0.001324f}, + {-0.301438f, -0.004261f, +0.001796f}, + {-0.026983f, -0.008052f, -0.001333f} + }, + { + {+0.597812f, +0.002656f, -0.000522f}, + {-0.552363f, -0.003313f, +0.001014f}, + {+0.075214f, -0.005271f, +0.002238f}, + {+0.170571f, +0.018162f, -0.002847f}, + {+0.083934f, -0.017743f, +0.001407f}, + {-0.076846f, +0.004888f, -0.003003f}, + {-0.166265f, -0.007573f, +0.004024f}, + {-0.256165f, +0.011081f, +0.000547f}, + {+0.019750f, +0.010957f, -0.001327f} + }, + { + {+0.613921f, -0.002403f, -0.000945f}, + {-0.571681f, +0.004061f, +0.000722f}, + {+0.106010f, -0.000496f, -0.004030f}, + {+0.238299f, -0.018447f, -0.000821f}, + {+0.038282f, +0.014684f, -0.002501f}, + {-0.080622f, -0.007409f, +0.002126f}, + {-0.235224f, +0.017619f, +0.005449f}, + {-0.203255f, -0.012695f, +0.000929f}, + {+0.070865f, -0.011018f, -0.001639f} + }, + { + {+0.630982f, +0.003698f, -0.001234f}, + {-0.590355f, -0.003219f, +0.000406f}, + {+0.130676f, +0.011921f, -0.002723f}, + {+0.295756f, +0.013516f, +0.001143f}, + {+0.005092f, -0.003596f, -0.003545f}, + {-0.072459f, -0.000272f, +0.002800f}, + {-0.299780f, -0.022696f, +0.001211f}, + {-0.150313f, +0.011501f, +0.001280f}, + {+0.118367f, +0.011753f, -0.001359f} + }, + { + {+0.649444f, -0.004884f, -0.000984f}, + {-0.615054f, +0.005408f, +0.000735f}, + {+0.149940f, -0.006453f, +0.001164f}, + {+0.328584f, -0.000395f, +0.001275f}, + {-0.008438f, -0.005199f, -0.001454f}, + {-0.058218f, +0.000064f, -0.000029f}, + {-0.346981f, +0.007071f, -0.001972f}, + {-0.104327f, -0.007957f, +0.001209f}, + {+0.149121f, -0.004220f, -0.000790f} + }, + { + {+0.667442f, +0.004369f, -0.000509f}, + {-0.649912f, -0.008091f, +0.001108f}, + {+0.160941f, -0.003110f, +0.000358f}, + {+0.335024f, -0.007340f, -0.001370f}, + {-0.010516f, +0.004138f, +0.001016f}, + {-0.042559f, +0.003980f, -0.001022f}, + {-0.366888f, +0.007198f, +0.001062f}, + {-0.068558f, +0.004871f, +0.000722f}, + {+0.153026f, -0.002598f, -0.000878f} + }, + { + {+0.682283f, -0.002839f, -0.000182f}, + {-0.693711f, +0.010677f, +0.001270f}, + {+0.163061f, +0.001749f, -0.001941f}, + {+0.327679f, +0.004372f, -0.003551f}, + {-0.017128f, +0.001449f, +0.002254f}, + {-0.029387f, -0.003404f, -0.000254f}, + {-0.363800f, -0.005157f, +0.004344f}, + {-0.041106f, -0.002019f, -0.000551f}, + {+0.130106f, +0.008236f, -0.000670f} + }, + { + {+0.692437f, +0.000095f, -0.000537f}, + {-0.740634f, -0.011604f, +0.000655f}, + {+0.157996f, +0.002060f, -0.000837f}, + {+0.323158f, +0.005481f, -0.001955f}, + {-0.039932f, -0.012585f, +0.000817f}, + {-0.021634f, +0.000010f, -0.000230f}, + {-0.350228f, -0.000420f, +0.003173f}, + {-0.016658f, +0.005630f, -0.001178f}, + {+0.089943f, -0.012079f, -0.001069f} + }, + { + {+0.698662f, +0.000230f, -0.001425f}, + {-0.782838f, +0.007193f, +0.000387f}, + {+0.147754f, +0.002321f, +0.001054f}, + {+0.330876f, -0.007440f, +0.001734f}, + {-0.078436f, +0.014161f, -0.002562f}, + {-0.020690f, +0.001093f, -0.000930f}, + {-0.336354f, +0.000244f, +0.000495f}, + {+0.007725f, -0.004802f, -0.001236f}, + {+0.047620f, +0.008277f, -0.001417f} + }, + { + {+0.703246f, +0.002409f, -0.001250f}, + {-0.814977f, -0.003204f, +0.001382f}, + {+0.135217f, -0.009385f, -0.001169f}, + {+0.350177f, -0.000838f, +0.000877f}, + {-0.122288f, -0.004476f, -0.002216f}, + {-0.025713f, +0.002869f, +0.000621f}, + {-0.325782f, +0.004520f, +0.000748f}, + {+0.030650f, +0.008462f, -0.000266f}, + {+0.015647f, -0.003005f, -0.000601f} + }, + { + {+0.707436f, -0.002159f, -0.000184f}, + {-0.836328f, +0.001420f, +0.002805f}, + {+0.124343f, +0.003534f, -0.004617f}, + {+0.377173f, -0.003128f, -0.002966f}, + {-0.162938f, +0.001908f, +0.001890f}, + {-0.034346f, +0.001148f, +0.003196f}, + {-0.317600f, -0.001145f, +0.002065f}, + {+0.047783f, -0.002726f, +0.001091f}, + {-0.001518f, -0.002014f, +0.001386f} + }, + { + {+0.711316f, +0.000190f, +0.000116f}, + {-0.849400f, -0.005461f, +0.002132f}, + {+0.115220f, +0.006522f, -0.002677f}, + {+0.406205f, +0.009733f, -0.003200f}, + {-0.198229f, -0.008830f, +0.003296f}, + {-0.041723f, -0.007295f, +0.001797f}, + {-0.307751f, -0.000513f, +0.001061f}, + {+0.056384f, -0.001852f, +0.000252f}, + {-0.007409f, -0.002688f, +0.001636f} + }, + { + {+0.715564f, +0.000878f, -0.000712f}, + {-0.856145f, +0.001865f, +0.000304f}, + {+0.099717f, +0.000516f, +0.001510f}, + {+0.427792f, -0.008621f, -0.000103f}, + {-0.227122f, +0.009743f, +0.000742f}, + {-0.038969f, -0.000573f, -0.000890f}, + {-0.290500f, -0.003837f, -0.000282f}, + {+0.060351f, +0.002258f, -0.001388f}, + {-0.007102f, +0.000681f, +0.000051f} + }, + { + {+0.721724f, +0.001440f, -0.001419f}, + {-0.857928f, +0.002494f, +0.000723f}, + {+0.068940f, -0.015230f, +0.000407f}, + {+0.432906f, -0.004606f, +0.000685f}, + {-0.246924f, -0.000678f, -0.000115f}, + {-0.019686f, +0.012823f, +0.000958f}, + {-0.263371f, +0.009394f, +0.000248f}, + {+0.066836f, +0.001658f, -0.002275f}, + {-0.003255f, +0.001689f, -0.000037f} + }, + { + {+0.730712f, -0.003910f, -0.000870f}, + {-0.858450f, -0.001220f, +0.001946f}, + {+0.023475f, +0.016216f, -0.003883f}, + {+0.419872f, +0.011121f, -0.002752f}, + {-0.256682f, -0.002820f, +0.002128f}, + {+0.013513f, -0.011639f, +0.004607f}, + {-0.229180f, -0.009683f, +0.001814f}, + {+0.080511f, -0.005798f, -0.001723f}, + {+0.001435f, +0.000756f, -0.000451f} + }, + { + {+0.741590f, +0.003101f, -0.000011f}, + {-0.860726f, +0.000300f, +0.002853f}, + {-0.028493f, -0.003694f, -0.002869f}, + {+0.395211f, -0.003270f, -0.003914f}, + {-0.257602f, -0.001422f, +0.002810f}, + {+0.053057f, +0.000570f, +0.002860f}, + {-0.193999f, +0.002947f, +0.000888f}, + {+0.099824f, +0.006425f, -0.000616f}, + {+0.005522f, +0.002697f, -0.000570f} + }, + { + {+0.752785f, -0.000581f, -0.000328f}, + {-0.864679f, +0.002652f, +0.003144f}, + {-0.079249f, -0.003995f, +0.005777f}, + {+0.366044f, -0.005911f, +0.001913f}, + {-0.251095f, +0.009072f, -0.002248f}, + {+0.092600f, +0.005125f, -0.005522f}, + {-0.162554f, -0.001717f, -0.002557f}, + {+0.119626f, -0.005564f, +0.000516f}, + {+0.008439f, -0.004393f, +0.001712f} + }, + { + {+0.763163f, -0.000862f, -0.002020f}, + {-0.868650f, -0.005188f, +0.001363f}, + {-0.122932f, -0.003612f, +0.014766f}, + {+0.337176f, +0.004705f, +0.011739f}, + {-0.240301f, -0.007676f, -0.011938f}, + {+0.125784f, +0.004581f, -0.013027f}, + {-0.137073f, +0.006965f, -0.003725f}, + {+0.136715f, +0.001962f, +0.001072f}, + {+0.010881f, +0.001506f, +0.004158f} + } +}; + +const float rightHRIRImag_HOA2[BINAURAL_CONVBANDS][HOA2_CHANNELS][BINAURAL_NTAPS_SBA]= +{ + { + {-0.067351f, +0.619497f, -0.224314f}, + {+0.139294f, -0.771571f, +0.258097f}, + {-0.003713f, +0.028657f, -0.008450f}, + {-0.024048f, +0.069155f, -0.020553f}, + {+0.025678f, +0.026025f, -0.019233f}, + {+0.009936f, +0.011063f, -0.007565f}, + {+0.034483f, +0.043638f, -0.029489f}, + {+0.006138f, -0.086263f, +0.038216f}, + {+0.046480f, +0.249243f, -0.117268f} + }, + { + {+0.012648f, +0.734658f, -0.184512f}, + {+0.111037f, -0.538674f, +0.336987f}, + {-0.002627f, -0.020803f, -0.029183f}, + {-0.030921f, +0.004858f, -0.041299f}, + {+0.051115f, +0.078198f, -0.009636f}, + {+0.016252f, +0.028855f, -0.008268f}, + {+0.084591f, +0.153968f, -0.000650f}, + {-0.017068f, -0.206982f, -0.012636f}, + {+0.164507f, +0.469681f, -0.054789f} + }, + { + {+0.223221f, -0.320495f, +0.172323f}, + {-0.327663f, +0.928806f, -0.128055f}, + {+0.019358f, -0.074304f, -0.015400f}, + {+0.035210f, -0.082508f, -0.021387f}, + {+0.001915f, -0.019754f, +0.041779f}, + {-0.009482f, +0.004447f, +0.006672f}, + {+0.039341f, +0.054366f, +0.052326f}, + {-0.015501f, -0.146235f, -0.037803f}, + {+0.140215f, +0.011558f, +0.133087f} + }, + { + {+0.158118f, -0.393316f, +0.132368f}, + {-0.546868f, +0.311888f, -0.284518f}, + {+0.031012f, +0.036496f, +0.023744f}, + {+0.107357f, +0.078785f, +0.019930f}, + {-0.117669f, -0.168393f, +0.014741f}, + {-0.063269f, -0.132935f, -0.029018f}, + {-0.110215f, -0.232883f, -0.026283f}, + {+0.026325f, -0.007643f, +0.015801f}, + {-0.156350f, -0.444539f, +0.006974f} + }, + { + {-0.158057f, +0.298412f, -0.065118f}, + {-0.180062f, -0.634611f, +0.013767f}, + {-0.011461f, +0.071086f, +0.018569f}, + {+0.074813f, +0.048439f, +0.032538f}, + {-0.176343f, +0.017086f, -0.039934f}, + {-0.070878f, -0.087909f, -0.042882f}, + {-0.196698f, -0.095181f, -0.059079f}, + {+0.043237f, +0.006669f, +0.001955f}, + {-0.440379f, +0.000452f, -0.098398f} + }, + { + {-0.449468f, +0.042993f, -0.088093f}, + {+0.450454f, +0.142745f, +0.162071f}, + {-0.082857f, -0.081326f, -0.023342f}, + {-0.091693f, -0.115333f, +0.002878f}, + {-0.059625f, +0.113643f, -0.022660f}, + {-0.002551f, +0.114733f, +0.021413f}, + {-0.134830f, +0.127944f, +0.015214f}, + {+0.039406f, -0.002734f, -0.000806f}, + {-0.456803f, +0.175205f, -0.017055f} + }, + { + {-0.521027f, -0.156261f, +0.000350f}, + {+0.908889f, +0.180570f, +0.051670f}, + {-0.108770f, -0.053291f, -0.027241f}, + {-0.287995f, +0.046150f, -0.015860f}, + {+0.175042f, -0.108856f, +0.012453f}, + {+0.059786f, +0.044325f, +0.033874f}, + {-0.008998f, -0.011671f, +0.039397f}, + {+0.004422f, -0.001021f, +0.005255f}, + {-0.225556f, -0.103116f, +0.036951f} + }, + { + {-0.371766f, +0.087065f, +0.052523f}, + {+1.010425f, -0.130810f, -0.067243f}, + {-0.070822f, +0.064314f, +0.008682f}, + {-0.381257f, -0.000635f, -0.013290f}, + {+0.375703f, +0.033440f, +0.023774f}, + {+0.081888f, -0.060050f, -0.009146f}, + {+0.099530f, -0.054172f, +0.002402f}, + {-0.055187f, -0.030383f, +0.004615f}, + {+0.113698f, +0.047344f, +0.023699f} + }, + { + {-0.133153f, +0.006407f, +0.034476f}, + {+0.837054f, -0.001398f, -0.067755f}, + {-0.019596f, -0.013995f, +0.025797f}, + {-0.306127f, -0.073720f, -0.002010f}, + {+0.417535f, +0.051347f, +0.011222f}, + {+0.096752f, -0.015410f, -0.024298f}, + {+0.165604f, -0.014311f, -0.020675f}, + {-0.110129f, +0.012754f, -0.001173f}, + {+0.396896f, -0.022479f, +0.001703f} + }, + { + {+0.076154f, -0.015041f, -0.005731f}, + {+0.558795f, +0.016178f, -0.011329f}, + {+0.001783f, -0.050805f, +0.008376f}, + {-0.100163f, +0.081596f, +0.016700f}, + {+0.287003f, -0.097687f, -0.016950f}, + {+0.130328f, +0.051441f, -0.002818f}, + {+0.194137f, +0.028286f, -0.006100f}, + {-0.128998f, -0.007273f, -0.004964f}, + {+0.525370f, -0.013001f, -0.010543f} + }, + { + {+0.227729f, -0.027128f, -0.019508f}, + {+0.280803f, +0.046474f, +0.016340f}, + {+0.006184f, +0.007629f, -0.010663f}, + {+0.124161f, -0.022132f, +0.014831f}, + {+0.082170f, +0.023992f, -0.023358f}, + {+0.168199f, -0.000379f, +0.008102f}, + {+0.185287f, +0.007140f, +0.002454f}, + {-0.098830f, -0.034738f, -0.000610f}, + {+0.505599f, +0.024919f, -0.016122f} + }, + { + {+0.345183f, +0.044417f, -0.008489f}, + {+0.029206f, -0.069971f, +0.008062f}, + {+0.040780f, +0.025656f, -0.005557f}, + {+0.280661f, +0.000086f, -0.001939f}, + {-0.091189f, +0.001516f, -0.001765f}, + {+0.178051f, -0.018186f, -0.003683f}, + {+0.147526f, -0.011735f, +0.000472f}, + {-0.034700f, +0.017373f, +0.007552f}, + {+0.404231f, -0.018810f, -0.013580f} + }, + { + {+0.447376f, -0.029945f, +0.002359f}, + {-0.196485f, +0.048776f, -0.000528f}, + {+0.131413f, -0.031345f, +0.001264f}, + {+0.352086f, -0.000092f, -0.009252f}, + {-0.196164f, +0.010102f, +0.008244f}, + {+0.137927f, +0.001411f, -0.005445f}, + {+0.094224f, +0.013361f, +0.000776f}, + {+0.030220f, +0.002376f, +0.001349f}, + {+0.282599f, +0.004869f, -0.002937f} + }, + { + {+0.532898f, +0.008836f, +0.002166f}, + {-0.392609f, -0.034792f, +0.000679f}, + {+0.270895f, +0.030297f, -0.000156f}, + {+0.364913f, -0.004283f, -0.009820f}, + {-0.243967f, -0.002627f, +0.007384f}, + {+0.037047f, -0.017787f, +0.004491f}, + {+0.041930f, -0.015182f, -0.000239f}, + {+0.078287f, +0.007042f, -0.004821f}, + {+0.167608f, -0.019027f, +0.005545f} + }, + { + {+0.594888f, -0.002438f, -0.003208f}, + {-0.547092f, +0.023930f, +0.003204f}, + {+0.418638f, -0.023295f, -0.006545f}, + {+0.358947f, -0.011193f, -0.005371f}, + {-0.268043f, +0.007992f, +0.005934f}, + {-0.108159f, +0.040803f, +0.007847f}, + {+0.014237f, +0.000657f, -0.000908f}, + {+0.104780f, -0.013359f, -0.000511f}, + {+0.064568f, +0.028680f, +0.003338f} + }, + { + {+0.635005f, +0.006702f, -0.005006f}, + {-0.650934f, -0.013984f, +0.004474f}, + {+0.519015f, +0.020899f, -0.008786f}, + {+0.354058f, +0.000065f, -0.000944f}, + {-0.293166f, -0.009243f, +0.003786f}, + {-0.244478f, -0.036317f, +0.004273f}, + {+0.027137f, +0.008991f, +0.000305f}, + {+0.112434f, -0.002933f, +0.003310f}, + {-0.019782f, -0.018420f, -0.000608f} + }, + { + {+0.661388f, -0.006850f, -0.003249f}, + {-0.709859f, +0.007935f, +0.004126f}, + {+0.524557f, -0.002414f, -0.002080f}, + {+0.344994f, +0.003888f, -0.002639f}, + {-0.316812f, +0.006036f, +0.003412f}, + {-0.307717f, +0.012550f, -0.001272f}, + {+0.076841f, -0.011681f, -0.000880f}, + {+0.115864f, +0.008381f, -0.000189f}, + {-0.078312f, +0.007256f, -0.000761f} + }, + { + {+0.681780f, +0.004317f, -0.002114f}, + {-0.740600f, -0.002506f, +0.003738f}, + {+0.416864f, -0.038264f, +0.003168f}, + {+0.319577f, -0.000792f, -0.001313f}, + {-0.319873f, -0.002666f, +0.002245f}, + {-0.258538f, +0.029824f, -0.003409f}, + {+0.141548f, +0.012818f, -0.003839f}, + {+0.135337f, +0.001218f, -0.005061f}, + {-0.109830f, +0.001645f, +0.001441f} + }, + { + {+0.699871f, -0.003221f, -0.002308f}, + {-0.762514f, +0.004609f, +0.003814f}, + {+0.225434f, +0.064939f, -0.001450f}, + {+0.266431f, +0.012897f, +0.002255f}, + {-0.282175f, -0.010311f, -0.000422f}, + {-0.108713f, -0.058556f, +0.002399f}, + {+0.186968f, -0.009396f, -0.004807f}, + {+0.178376f, -0.016506f, -0.006062f}, + {-0.120383f, -0.003023f, +0.004088f} + }, + { + {+0.714529f, +0.003253f, -0.002414f}, + {-0.790696f, -0.011388f, +0.001985f}, + {+0.020833f, -0.046458f, -0.007156f}, + {+0.185944f, -0.029249f, +0.000016f}, + {-0.197551f, +0.028731f, +0.000138f}, + {+0.079181f, +0.043101f, +0.006863f}, + {+0.176963f, -0.004258f, -0.002861f}, + {+0.228839f, +0.021085f, -0.002090f}, + {-0.119574f, -0.002646f, +0.004158f} + }, + { + {+0.721602f, -0.001258f, -0.002069f}, + {-0.831027f, +0.010846f, -0.000173f}, + {-0.126177f, +0.009153f, -0.003439f}, + {+0.096173f, +0.020892f, -0.003906f}, + {-0.084227f, -0.027335f, +0.001653f}, + {+0.229925f, -0.010207f, +0.000875f}, + {+0.090658f, +0.023511f, +0.000256f}, + {+0.250703f, +0.000323f, +0.000133f}, + {-0.115659f, +0.011998f, -0.001947f} + }, + { + {+0.717593f, -0.001188f, -0.001513f}, + {-0.881199f, -0.003795f, +0.002266f}, + {-0.186085f, +0.008805f, +0.004207f}, + {+0.021886f, +0.000682f, +0.000980f}, + {+0.024639f, +0.019808f, +0.000274f}, + {+0.296639f, -0.006775f, -0.008463f}, + {-0.060930f, -0.036828f, +0.003817f}, + {+0.210581f, -0.022700f, -0.003357f}, + {-0.112881f, +0.004715f, -0.006188f} + }, + { + {+0.702872f, +0.004202f, -0.000899f}, + {-0.934393f, +0.006557f, +0.007476f}, + {-0.176147f, -0.010014f, +0.006716f}, + {-0.022135f, +0.003624f, +0.007346f}, + {+0.100594f, -0.012448f, -0.000135f}, + {+0.271960f, +0.005598f, -0.007977f}, + {-0.233701f, +0.046766f, +0.003616f}, + {+0.101020f, +0.023227f, -0.002321f}, + {-0.116785f, -0.020405f, +0.002997f} + }, + { + {+0.682250f, -0.007566f, -0.001501f}, + {-0.978417f, -0.017585f, +0.006636f}, + {-0.137592f, +0.005047f, +0.003880f}, + {-0.028458f, -0.006826f, +0.004609f}, + {+0.129898f, -0.005880f, -0.001391f}, + {+0.175874f, -0.016526f, +0.001013f}, + {-0.367276f, -0.033929f, -0.002775f}, + {-0.060514f, -0.037887f, +0.002465f}, + {-0.137333f, -0.006964f, +0.011955f} + }, + { + {+0.663415f, +0.004606f, -0.002781f}, + {-0.993852f, +0.009178f, -0.000038f}, + {-0.108250f, -0.003270f, +0.001437f}, + {+0.009848f, -0.008477f, -0.000681f}, + {+0.118923f, +0.012268f, -0.005212f}, + {+0.044501f, +0.037572f, +0.003962f}, + {-0.416290f, -0.006378f, -0.006076f}, + {-0.236610f, +0.040350f, +0.002858f}, + {-0.168887f, +0.032800f, +0.004036f} + }, + { + {+0.651781f, +0.001152f, -0.002457f}, + {-0.965546f, +0.016499f, -0.002125f}, + {-0.105651f, -0.001646f, +0.002481f}, + {+0.090167f, +0.025763f, -0.001130f}, + {+0.087686f, -0.003999f, -0.005549f}, + {-0.075223f, -0.035790f, -0.002847f}, + {-0.383115f, +0.037796f, +0.001566f}, + {-0.378556f, -0.025237f, +0.002287f}, + {-0.179845f, -0.008941f, -0.008124f} + }, + { + {+0.645685f, -0.002682f, -0.000593f}, + {-0.900401f, -0.029783f, +0.003285f}, + {-0.124380f, +0.012275f, +0.001822f}, + {+0.193225f, -0.027406f, +0.000945f}, + {+0.052400f, -0.001580f, -0.000684f}, + {-0.141411f, -0.002262f, -0.004491f}, + {-0.319576f, -0.023501f, +0.010635f}, + {-0.448327f, +0.001574f, +0.004044f}, + {-0.141908f, -0.032139f, -0.005596f} + }, + { + {+0.638137f, -0.002412f, +0.000310f}, + {-0.826423f, +0.017144f, +0.007574f}, + {-0.140725f, -0.006104f, -0.000815f}, + {+0.290930f, +0.019453f, +0.001904f}, + {+0.016875f, -0.009182f, +0.001656f}, + {-0.145675f, +0.017736f, +0.001807f}, + {-0.285941f, -0.010851f, +0.008570f}, + {-0.435070f, +0.011023f, +0.004307f}, + {-0.062178f, +0.036767f, +0.005654f} + }, + { + {+0.623287f, +0.007299f, -0.001056f}, + {-0.770521f, +0.001075f, +0.004559f}, + {-0.130645f, -0.003274f, -0.002902f}, + {+0.361351f, -0.005902f, +0.000348f}, + {-0.020477f, +0.011841f, -0.000752f}, + {-0.114514f, -0.018145f, +0.007488f}, + {-0.305625f, +0.026256f, -0.000446f}, + {-0.353862f, -0.030431f, +0.004835f}, + {+0.024417f, -0.010793f, +0.007820f} + }, + { + {+0.600902f, -0.006021f, -0.002348f}, + {-0.739248f, -0.005015f, -0.001571f}, + {-0.087167f, +0.021027f, -0.001847f}, + {+0.400187f, +0.000286f, -0.002317f}, + {-0.060945f, -0.009244f, -0.002589f}, + {-0.083328f, -0.001928f, +0.007725f}, + {-0.359405f, -0.019595f, -0.006438f}, + {-0.237042f, +0.027090f, +0.006659f}, + {+0.089013f, -0.004244f, -0.000128f} + }, + { + {+0.574438f, +0.003368f, -0.001494f}, + {-0.720431f, -0.005878f, -0.002928f}, + {-0.025553f, -0.022088f, +0.002875f}, + {+0.419048f, +0.001480f, -0.004334f}, + {-0.105303f, +0.000852f, +0.000385f}, + {-0.070507f, +0.013892f, +0.000793f}, + {-0.411663f, -0.001662f, -0.003755f}, + {-0.118815f, -0.013893f, +0.002937f}, + {+0.127181f, -0.002212f, -0.005490f} + }, + { + {+0.546941f, -0.004959f, -0.000239f}, + {-0.700235f, +0.009986f, +0.000285f}, + {+0.026874f, +0.006811f, +0.004565f}, + {+0.432826f, +0.004148f, -0.005149f}, + {-0.153860f, -0.009932f, +0.004309f}, + {-0.067445f, -0.005555f, -0.005512f}, + {-0.441084f, +0.007824f, +0.003852f}, + {-0.016912f, +0.012081f, -0.003174f}, + {+0.148914f, +0.007013f, -0.004323f} + }, + { + {+0.520436f, +0.006384f, -0.000382f}, + {-0.674657f, -0.006620f, +0.001998f}, + {+0.052406f, +0.010142f, -0.000198f}, + {+0.447102f, -0.009070f, -0.003159f}, + {-0.202135f, +0.018081f, +0.002032f}, + {-0.055887f, -0.014144f, -0.003615f}, + {-0.448314f, -0.001324f, +0.007309f}, + {+0.065957f, -0.020607f, -0.003258f}, + {+0.162472f, -0.004875f, -0.002127f} + }, + { + {+0.496665f, -0.004859f, -0.000887f}, + {-0.647428f, +0.004741f, +0.001434f}, + {+0.053060f, -0.007546f, -0.006118f}, + {+0.453309f, +0.004051f, -0.000324f}, + {-0.237178f, -0.009221f, -0.002058f}, + {-0.029969f, +0.014850f, +0.002643f}, + {-0.439805f, -0.002523f, +0.005619f}, + {+0.128558f, +0.010056f, -0.001511f}, + {+0.167737f, +0.001236f, -0.001456f} + }, + { + {+0.475983f, +0.003710f, -0.000970f}, + {-0.624608f, -0.003603f, +0.000812f}, + {+0.042149f, -0.008534f, -0.003432f}, + {+0.438672f, +0.005526f, +0.000965f}, + {-0.249063f, -0.004782f, -0.002016f}, + {+0.000807f, -0.001028f, +0.002841f}, + {-0.416440f, +0.003745f, +0.000359f}, + {+0.170217f, -0.009457f, -0.000867f}, + {+0.158107f, +0.002167f, -0.000901f} + }, + { + {+0.456962f, -0.002559f, -0.000574f}, + {-0.609653f, +0.002905f, +0.001117f}, + {+0.025784f, -0.000666f, +0.002060f}, + {+0.399694f, -0.014955f, +0.000161f}, + {-0.242149f, +0.009905f, +0.001262f}, + {+0.026686f, -0.000156f, -0.001218f}, + {-0.373014f, +0.013273f, -0.002730f}, + {+0.191984f, -0.000973f, -0.000838f}, + {+0.127455f, -0.008313f, +0.000023f} + }, + { + {+0.437008f, +0.003925f, -0.000081f}, + {-0.601093f, -0.000232f, +0.001372f}, + {+0.002960f, +0.010345f, +0.001054f}, + {+0.347170f, +0.016956f, -0.002319f}, + {-0.233004f, -0.002825f, +0.003373f}, + {+0.044339f, -0.004384f, -0.002020f}, + {-0.309506f, -0.024368f, +0.000882f}, + {+0.198003f, -0.000405f, -0.001486f}, + {+0.077236f, +0.014350f, -0.000034f} + }, + { + {+0.414109f, -0.005431f, -0.000037f}, + {-0.592705f, +0.001470f, +0.001222f}, + {-0.024584f, -0.008451f, -0.001721f}, + {+0.300043f, -0.007510f, -0.003376f}, + {-0.236922f, -0.005189f, +0.002904f}, + {+0.053435f, +0.002953f, -0.000365f}, + {-0.239443f, +0.015553f, +0.003945f}, + {+0.195817f, -0.003961f, -0.001987f}, + {+0.019225f, -0.012398f, -0.000024f} + }, + { + {+0.388577f, +0.006627f, -0.000411f}, + {-0.576851f, -0.002898f, +0.000753f}, + {-0.052952f, +0.001666f, -0.000781f}, + {+0.271771f, -0.002315f, -0.001136f}, + {-0.256751f, +0.010892f, +0.000933f}, + {+0.055321f, +0.000623f, +0.000321f}, + {-0.178829f, -0.004699f, +0.001577f}, + {+0.192108f, -0.001841f, -0.002156f}, + {-0.030601f, +0.010281f, +0.000029f} + }, + { + {+0.362659f, -0.006023f, -0.001007f}, + {-0.548393f, +0.008477f, +0.000553f}, + {-0.079254f, -0.004768f, +0.001192f}, + {+0.262246f, +0.003901f, +0.002002f}, + {-0.282691f, -0.009035f, -0.001549f}, + {+0.052737f, -0.001616f, -0.000062f}, + {-0.134033f, +0.004191f, -0.001751f}, + {+0.189322f, +0.000295f, -0.001194f}, + {-0.059659f, -0.002213f, -0.000053f} + }, + { + {+0.339002f, +0.002927f, -0.000712f}, + {-0.507223f, -0.011672f, +0.001408f}, + {-0.101892f, +0.008754f, -0.000366f}, + {+0.261016f, +0.005455f, +0.000964f}, + {-0.300336f, -0.003329f, -0.000659f}, + {+0.049601f, -0.001946f, +0.000746f}, + {-0.101681f, -0.008021f, -0.001522f}, + {+0.184646f, -0.000891f, -0.000474f}, + {-0.064232f, -0.004100f, +0.000831f} + }, + { + {+0.318447f, -0.002583f, +0.000342f}, + {-0.458166f, +0.011334f, +0.002134f}, + {-0.119857f, -0.003793f, -0.002673f}, + {+0.257649f, -0.004527f, -0.002750f}, + {-0.302642f, +0.006786f, +0.003304f}, + {+0.050079f, +0.001140f, +0.002294f}, + {-0.075154f, +0.006079f, +0.000154f}, + {+0.175259f, -0.002462f, +0.000450f}, + {-0.050689f, +0.006815f, +0.002112f} + }, + { + {+0.300124f, +0.004647f, +0.000429f}, + {-0.407177f, -0.007551f, +0.001229f}, + {-0.135280f, -0.004904f, -0.000353f}, + {+0.246029f, -0.001362f, -0.002342f}, + {-0.292460f, -0.000038f, +0.003938f}, + {+0.057770f, +0.002994f, +0.000700f}, + {-0.048950f, -0.002677f, -0.000542f}, + {+0.161196f, +0.006930f, -0.000490f}, + {-0.030107f, -0.002304f, +0.001927f} + }, + { + {+0.283695f, -0.004672f, -0.000499f}, + {-0.357931f, +0.007644f, -0.000792f}, + {-0.154465f, -0.001114f, +0.004046f}, + {+0.221394f, -0.002251f, +0.001225f}, + {-0.274104f, -0.001365f, +0.000312f}, + {+0.076006f, +0.003175f, -0.002372f}, + {-0.019797f, +0.006502f, -0.001827f}, + {+0.147944f, -0.003560f, -0.001898f}, + {-0.011081f, -0.000127f, -0.000375f} + }, + { + {+0.269518f, +0.002457f, -0.001001f}, + {-0.311326f, -0.012837f, -0.000327f}, + {-0.181319f, +0.014112f, +0.003014f}, + {+0.182651f, +0.012951f, +0.002036f}, + {-0.248875f, -0.007948f, -0.001266f}, + {+0.104063f, -0.013233f, -0.001219f}, + {+0.010928f, -0.008987f, -0.001152f}, + {+0.141371f, -0.000838f, -0.001781f}, + {+0.004297f, -0.004808f, -0.000787f} + }, + { + {+0.257138f, -0.000471f, -0.000295f}, + {-0.269065f, +0.008971f, +0.001327f}, + {-0.209242f, -0.009445f, -0.000789f}, + {+0.136359f, -0.015642f, -0.000837f}, + {-0.218917f, +0.009939f, +0.000695f}, + {+0.133100f, +0.007332f, +0.001415f}, + {+0.037336f, +0.006071f, +0.000081f}, + {+0.141848f, +0.003924f, -0.000450f}, + {+0.015759f, +0.001304f, -0.000104f} + }, + { + {+0.244594f, +0.002255f, +0.000537f}, + {-0.232039f, -0.006188f, +0.001385f}, + {-0.226456f, -0.005183f, +0.000708f}, + {+0.094177f, +0.004239f, -0.001379f}, + {-0.188550f, -0.003755f, +0.001033f}, + {+0.152408f, +0.005083f, -0.000982f}, + {+0.053373f, +0.001503f, -0.000759f}, + {+0.144008f, -0.001965f, +0.000959f}, + {+0.023577f, -0.002308f, -0.000076f} + }, + { + {+0.229867f, -0.004876f, +0.000170f}, + {-0.197603f, +0.004728f, +0.000560f}, + {-0.226600f, +0.010780f, +0.006854f}, + {+0.064221f, +0.003891f, +0.003122f}, + {-0.161189f, -0.001104f, -0.002261f}, + {+0.157190f, -0.008241f, -0.006888f}, + {+0.056895f, -0.003410f, -0.003127f}, + {+0.141412f, -0.001071f, +0.001644f}, + {+0.029485f, +0.003593f, +0.001358f} + }, + { + {+0.212288f, +0.005142f, -0.000800f}, + {-0.162483f, -0.004117f, -0.001433f}, + {-0.209328f, -0.002547f, +0.009702f}, + {+0.048193f, +0.000129f, +0.007210f}, + {-0.139874f, -0.002121f, -0.005784f}, + {+0.146647f, -0.000237f, -0.009054f}, + {+0.049793f, -0.001403f, -0.002729f}, + {+0.132126f, +0.003164f, +0.002133f}, + {+0.035201f, -0.000152f, +0.002301f} + }, + { + {+0.191599f, -0.002871f, -0.000708f}, + {-0.125250f, +0.008746f, -0.003116f}, + {-0.175384f, -0.002970f, +0.005044f}, + {+0.046507f, -0.009000f, +0.004794f}, + {-0.128202f, +0.013178f, -0.002850f}, + {+0.120273f, +0.005762f, -0.003583f}, + {+0.034030f, -0.000067f, +0.000427f}, + {+0.118790f, -0.004116f, +0.002419f}, + {+0.044052f, -0.001094f, +0.001102f} + } +}; + + + +const float FASTCONV_FOA_latency_s = 0.000020833f; +const float leftHRIRReal_FOA[BINAURAL_CONVBANDS][FOA_CHANNELS][BINAURAL_NTAPS_SBA]= +{ + { + {+0.181652f, +0.754551f, +0.218658f}, + {+0.313875f, -0.422228f, +0.135528f}, + {+0.014440f, +0.116710f, -0.013575f}, + {+0.042997f, +0.018886f, -0.015597f} + }, + { + {-0.171103f, -0.431000f, -0.158827f}, + {-0.162330f, -1.016290f, +0.055279f}, + {-0.009076f, +0.107488f, -0.010075f}, + {-0.002269f, +0.060685f, +0.014338f} + }, + { + {-0.320265f, -0.250765f, -0.167171f}, + {-0.685853f, +0.069215f, -0.258616f}, + {-0.021745f, +0.080557f, +0.010049f}, + {-0.070084f, +0.090970f, +0.018109f} + }, + { + {-0.090062f, +0.396798f, +0.031329f}, + {-0.547868f, +0.612159f, -0.064837f}, + {-0.014055f, +0.010916f, -0.020054f}, + {-0.104609f, -0.009719f, -0.014645f} + }, + { + {+0.310752f, -0.054756f, +0.106519f}, + {+0.077791f, -0.305320f, +0.144875f}, + {+0.048626f, -0.050345f, -0.007511f}, + {-0.035749f, -0.049561f, -0.008157f} + }, + { + {+0.590278f, -0.119063f, +0.024674f}, + {+0.708076f, -0.088569f, +0.094265f}, + {+0.119880f, +0.048720f, +0.014661f}, + {+0.120422f, +0.058573f, +0.004643f} + }, + { + {+0.638355f, +0.074625f, -0.043889f}, + {+1.048572f, +0.131298f, -0.037692f}, + {+0.143385f, +0.033975f, +0.014623f}, + {+0.293747f, -0.017822f, -0.000451f} + }, + { + {+0.521197f, -0.005266f, -0.041412f}, + {+1.094584f, +0.000210f, -0.073803f}, + {+0.109004f, -0.035628f, -0.003452f}, + {+0.407579f, +0.034241f, -0.002887f} + }, + { + {+0.361479f, -0.014806f, -0.009497f}, + {+0.986770f, -0.046512f, -0.029288f}, + {+0.057809f, +0.027844f, -0.015215f}, + {+0.409283f, +0.014805f, +0.005752f} + }, + { + {+0.229108f, -0.009840f, +0.009477f}, + {+0.839323f, +0.000705f, +0.009034f}, + {+0.036287f, +0.030074f, -0.010227f}, + {+0.293083f, -0.069929f, -0.004421f} + }, + { + {+0.125590f, +0.030181f, +0.007318f}, + {+0.687756f, +0.052219f, +0.009126f}, + {+0.052382f, -0.019274f, +0.003613f}, + {+0.122951f, +0.036356f, -0.013394f} + }, + { + {+0.030890f, -0.030176f, -0.000832f}, + {+0.531513f, -0.048483f, -0.004668f}, + {+0.067811f, -0.004747f, +0.002746f}, + {-0.026040f, -0.009502f, -0.004388f} + }, + { + {-0.062962f, +0.019124f, -0.003537f}, + {+0.376029f, +0.026217f, -0.006323f}, + {+0.042499f, +0.013437f, -0.001738f}, + {-0.120763f, +0.008891f, +0.001968f} + }, + { + {-0.150437f, -0.012367f, -0.001050f}, + {+0.234297f, -0.021072f, -0.000774f}, + {-0.046092f, -0.025628f, -0.001827f}, + {-0.163500f, +0.007913f, +0.005640f} + }, + { + {-0.224579f, +0.011037f, +0.001567f}, + {+0.118032f, +0.020982f, +0.001167f}, + {-0.190587f, +0.031698f, +0.001189f}, + {-0.181600f, +0.008625f, +0.006827f} + }, + { + {-0.283765f, -0.012148f, +0.001665f}, + {+0.031141f, -0.014212f, +0.000704f}, + {-0.354999f, -0.033990f, +0.005051f}, + {-0.201565f, -0.012572f, +0.001547f} + }, + { + {-0.330851f, +0.010110f, +0.000281f}, + {-0.032740f, +0.010680f, +0.000608f}, + {-0.489897f, +0.028555f, +0.005370f}, + {-0.226930f, +0.003469f, +0.000412f} + }, + { + {-0.370651f, -0.006974f, -0.000273f}, + {-0.085140f, -0.009699f, +0.000484f}, + {-0.550417f, -0.008550f, +0.002078f}, + {-0.248676f, -0.002190f, +0.002941f} + }, + { + {-0.408944f, +0.005900f, +0.000497f}, + {-0.135902f, +0.010386f, +0.000573f}, + {-0.516823f, -0.021637f, +0.000484f}, + {-0.254059f, +0.003659f, +0.002185f} + }, + { + {-0.450752f, -0.008484f, +0.001446f}, + {-0.191283f, -0.014617f, -0.000163f}, + {-0.408035f, +0.040263f, +0.003661f}, + {-0.231639f, +0.007741f, +0.000045f} + }, + { + {-0.497579f, +0.012039f, +0.001191f}, + {-0.253854f, +0.015815f, -0.001949f}, + {-0.274552f, -0.030994f, +0.006408f}, + {-0.178594f, -0.020739f, +0.002028f} + }, + { + {-0.545362f, -0.010634f, +0.000559f}, + {-0.324146f, -0.011460f, -0.001641f}, + {-0.169370f, +0.009075f, +0.003395f}, + {-0.105323f, +0.013694f, +0.002900f} + }, + { + {-0.587196f, +0.008279f, +0.000328f}, + {-0.403134f, +0.010566f, +0.002217f}, + {-0.118490f, +0.003381f, -0.001814f}, + {-0.027446f, -0.008251f, -0.001827f} + }, + { + {-0.618017f, -0.004259f, +0.000361f}, + {-0.490358f, -0.020714f, +0.004529f}, + {-0.113358f, -0.003251f, -0.002770f}, + {+0.041459f, +0.013481f, -0.005194f} + }, + { + {-0.637687f, +0.001567f, +0.000820f}, + {-0.576790f, +0.023931f, +0.002213f}, + {-0.125198f, +0.004103f, -0.001443f}, + {+0.086209f, -0.010781f, -0.003979f} + }, + { + {-0.651150f, -0.001076f, +0.001428f}, + {-0.645409f, -0.014669f, -0.000718f}, + {-0.123622f, +0.001940f, -0.001608f}, + {+0.092869f, +0.002431f, -0.000324f} + }, + { + {-0.664780f, +0.003292f, +0.001710f}, + {-0.683586f, +0.000299f, -0.000557f}, + {-0.092026f, -0.012393f, -0.001589f}, + {+0.056395f, +0.017649f, +0.000374f} + }, + { + {-0.682371f, -0.006662f, +0.000792f}, + {-0.693411f, +0.007664f, +0.002560f}, + {-0.036899f, +0.016426f, -0.000987f}, + {-0.012285f, -0.023342f, -0.003158f} + }, + { + {-0.702854f, +0.004929f, -0.000169f}, + {-0.690742f, -0.001912f, +0.004494f}, + {+0.017981f, -0.013806f, -0.000030f}, + {-0.088921f, +0.012514f, -0.003181f} + }, + { + {-0.722549f, -0.002146f, +0.000430f}, + {-0.692300f, -0.005917f, +0.002876f}, + {+0.046872f, +0.003463f, +0.001220f}, + {-0.154235f, -0.010645f, -0.001356f} + }, + { + {-0.739092f, +0.002594f, +0.001242f}, + {-0.704186f, +0.008734f, -0.000319f}, + {+0.036822f, +0.011640f, +0.000478f}, + {-0.201705f, +0.002195f, +0.000385f} + }, + { + {-0.751826f, -0.003070f, +0.000998f}, + {-0.721419f, -0.002290f, -0.001142f}, + {-0.005059f, -0.018609f, -0.002901f}, + {-0.237750f, -0.005780f, +0.002036f} + }, + { + {-0.760887f, +0.001608f, +0.000546f}, + {-0.736911f, +0.001064f, +0.000228f}, + {-0.057870f, +0.010116f, -0.004534f}, + {-0.273933f, +0.006641f, +0.002467f} + }, + { + {-0.767195f, -0.000265f, +0.000748f}, + {-0.748024f, -0.000586f, +0.001053f}, + {-0.102334f, +0.003212f, +0.000059f}, + {-0.315083f, -0.011342f, +0.002600f} + }, + { + {-0.772327f, +0.001114f, +0.000964f}, + {-0.756683f, +0.002199f, +0.000983f}, + {-0.133057f, +0.004906f, +0.003973f}, + {-0.355964f, +0.012189f, +0.001107f} + }, + { + {-0.777379f, -0.001664f, +0.000676f}, + {-0.767213f, -0.002558f, +0.000597f}, + {-0.152753f, -0.009690f, +0.001092f}, + {-0.384303f, -0.006913f, -0.001047f} + }, + { + {-0.782304f, +0.001186f, +0.000401f}, + {-0.783173f, +0.004116f, +0.000499f}, + {-0.161920f, -0.000439f, -0.001076f}, + {-0.390874f, -0.005592f, -0.000791f} + }, + { + {-0.786466f, -0.000413f, +0.000504f}, + {-0.805468f, -0.004296f, +0.000905f}, + {-0.161504f, +0.005798f, +0.001317f}, + {-0.378159f, +0.009420f, +0.002017f} + }, + { + {-0.789480f, +0.000911f, +0.000469f}, + {-0.831991f, +0.006156f, +0.001415f}, + {-0.154727f, +0.000127f, +0.002457f}, + {-0.358994f, -0.003224f, +0.003001f} + }, + { + {-0.791179f, +0.000118f, +0.000378f}, + {-0.858608f, -0.007156f, +0.000826f}, + {-0.143224f, -0.002141f, -0.000223f}, + {-0.346009f, -0.003832f, +0.000505f} + }, + { + {-0.791713f, -0.000506f, +0.000690f}, + {-0.880258f, +0.003409f, +0.000310f}, + {-0.126671f, -0.005516f, -0.001744f}, + {-0.344447f, +0.002552f, -0.002098f} + }, + { + {-0.791760f, -0.000637f, +0.000646f}, + {-0.894068f, +0.000147f, +0.001099f}, + {-0.106700f, +0.011976f, +0.001536f}, + {-0.352724f, +0.003880f, -0.000028f} + }, + { + {-0.791607f, +0.000326f, +0.000259f}, + {-0.900705f, -0.000766f, +0.002346f}, + {-0.087833f, -0.003369f, +0.004535f}, + {-0.367814f, +0.002794f, +0.003185f} + }, + { + {-0.791360f, +0.000216f, +0.000145f}, + {-0.902761f, -0.003469f, +0.001579f}, + {-0.071216f, -0.005336f, +0.001636f}, + {-0.384313f, -0.008317f, +0.002102f} + }, + { + {-0.791514f, -0.000959f, +0.000554f}, + {-0.901431f, +0.000403f, -0.000135f}, + {-0.050334f, -0.003160f, -0.002061f}, + {-0.392811f, +0.004068f, -0.000843f} + }, + { + {-0.792816f, -0.000333f, +0.001006f}, + {-0.897192f, +0.003319f, +0.000240f}, + {-0.018937f, +0.014843f, -0.000267f}, + {-0.385889f, +0.008000f, -0.000602f} + }, + { + {-0.795515f, +0.001892f, +0.000664f}, + {-0.892619f, -0.002628f, +0.001553f}, + {+0.020997f, -0.013093f, +0.003597f}, + {-0.364329f, -0.010852f, +0.002618f} + }, + { + {-0.798742f, -0.001369f, -0.000006f}, + {-0.889854f, +0.001159f, +0.002594f}, + {+0.062746f, +0.000823f, +0.002081f}, + {-0.335764f, +0.002095f, +0.002620f} + }, + { + {-0.801561f, -0.000332f, -0.000055f}, + {-0.888481f, +0.002442f, +0.002445f}, + {+0.101614f, +0.005650f, -0.006242f}, + {-0.306982f, +0.005040f, -0.003292f} + }, + { + {-0.803505f, +0.001996f, +0.000969f}, + {-0.886774f, -0.004132f, +0.000094f}, + {+0.134585f, +0.001923f, -0.014731f}, + {-0.282127f, -0.002996f, -0.011457f} + } +}; + +const float leftHRIRImag_FOA[BINAURAL_CONVBANDS][FOA_CHANNELS][BINAURAL_NTAPS_SBA]= +{ + { + {-0.171042f, +0.590899f, -0.184148f}, + {-0.244016f, +0.359802f, -0.065072f}, + {-0.014995f, +0.035748f, -0.012250f}, + {-0.031507f, +0.034780f, -0.009895f} + }, + { + {-0.228601f, +0.478433f, -0.200802f}, + {-0.468416f, -0.184796f, -0.220307f}, + {-0.021499f, +0.027785f, -0.012584f}, + {-0.060325f, +0.030602f, -0.002599f} + }, + { + {+0.101029f, -0.456163f, +0.083058f}, + {-0.043611f, -0.870939f, -0.055288f}, + {+0.001858f, +0.027597f, -0.016310f}, + {-0.029059f, +0.033806f, -0.005356f} + }, + { + {+0.410000f, -0.084502f, +0.139239f}, + {+0.675225f, +0.218111f, +0.204844f}, + {+0.040662f, +0.051315f, -0.018039f}, + {+0.063503f, +0.056458f, -0.016519f} + }, + { + {+0.415696f, +0.265055f, +0.002626f}, + {+1.013647f, +0.334903f, +0.081079f}, + {+0.065042f, -0.040883f, +0.012352f}, + {+0.181037f, -0.059880f, +0.005085f} + }, + { + {+0.148368f, -0.111388f, -0.073685f}, + {+0.845933f, -0.250930f, -0.091257f}, + {+0.025616f, -0.060138f, +0.012766f}, + {+0.228995f, -0.032819f, +0.003215f} + }, + { + {-0.193830f, -0.014212f, -0.040266f}, + {+0.402943f, +0.020025f, -0.092885f}, + {-0.058690f, +0.041101f, -0.008172f}, + {+0.161828f, +0.015394f, -0.004824f} + }, + { + {-0.448848f, +0.024310f, +0.012126f}, + {-0.042491f, +0.043522f, -0.007450f}, + {-0.129054f, -0.013924f, -0.014446f}, + {-0.004772f, -0.042423f, +0.005623f} + }, + { + {-0.581348f, +0.015560f, +0.027528f}, + {-0.364335f, +0.028974f, +0.038991f}, + {-0.152614f, -0.032355f, -0.005641f}, + {-0.218401f, +0.075676f, -0.000317f} + }, + { + {-0.641251f, -0.033204f, +0.014171f}, + {-0.576730f, -0.078039f, +0.024279f}, + {-0.144066f, +0.021824f, +0.009938f}, + {-0.391879f, -0.026769f, -0.009335f} + }, + { + {-0.678995f, +0.021986f, +0.000075f}, + {-0.725441f, +0.048920f, -0.000285f}, + {-0.153455f, +0.022432f, +0.008363f}, + {-0.464657f, -0.026611f, +0.001799f} + }, + { + {-0.709246f, -0.001743f, -0.002228f}, + {-0.829481f, -0.007880f, -0.002786f}, + {-0.208073f, -0.023291f, +0.000232f}, + {-0.446725f, +0.013756f, +0.010505f} + }, + { + {-0.725841f, -0.005310f, +0.002197f}, + {-0.889756f, -0.003342f, +0.005446f}, + {-0.296494f, +0.020861f, +0.000461f}, + {-0.383826f, -0.016046f, +0.008157f} + }, + { + {-0.724803f, +0.003851f, +0.004749f}, + {-0.910037f, -0.002807f, +0.007312f}, + {-0.382641f, -0.013902f, +0.003575f}, + {-0.319137f, +0.005237f, +0.005556f} + }, + { + {-0.710495f, -0.001176f, +0.003666f}, + {-0.902293f, -0.002075f, +0.004352f}, + {-0.421514f, +0.001837f, +0.005564f}, + {-0.276374f, +0.006416f, -0.000678f} + }, + { + {-0.690926f, +0.001911f, +0.001428f}, + {-0.883286f, +0.004067f, +0.003096f}, + {-0.382030f, +0.012331f, +0.003744f}, + {-0.247702f, +0.008689f, -0.002881f} + }, + { + {-0.672402f, -0.004418f, +0.000819f}, + {-0.868037f, -0.001291f, +0.002503f}, + {-0.260382f, -0.031252f, -0.000392f}, + {-0.215212f, -0.010735f, +0.000421f} + }, + { + {-0.658558f, +0.003708f, +0.001700f}, + {-0.863001f, -0.000603f, +0.002111f}, + {-0.084457f, +0.046037f, -0.001989f}, + {-0.169471f, +0.007931f, +0.000103f} + }, + { + {-0.650017f, -0.001079f, +0.002333f}, + {-0.867523f, +0.003563f, +0.001620f}, + {+0.093137f, -0.042759f, +0.000290f}, + {-0.110082f, -0.012804f, -0.002290f} + }, + { + {-0.643665f, -0.001088f, +0.001723f}, + {-0.877421f, -0.003410f, +0.000713f}, + {+0.217492f, +0.016953f, +0.001740f}, + {-0.046668f, +0.018761f, -0.001213f} + }, + { + {-0.633405f, -0.001560f, +0.000669f}, + {-0.887575f, -0.001389f, +0.001467f}, + {+0.260289f, +0.010429f, -0.001427f}, + {+0.003491f, -0.008000f, +0.000581f} + }, + { + {-0.613764f, +0.006196f, +0.000648f}, + {-0.893912f, +0.004015f, +0.004684f}, + {+0.234569f, -0.016937f, -0.004729f}, + {+0.024290f, -0.008269f, -0.003225f} + }, + { + {-0.584438f, -0.007700f, +0.000979f}, + {-0.892617f, +0.003169f, +0.005373f}, + {+0.180710f, +0.012490f, -0.004688f}, + {+0.010563f, +0.002672f, -0.005332f} + }, + { + {-0.550310f, +0.008552f, +0.001243f}, + {-0.875679f, -0.001053f, +0.001808f}, + {+0.139761f, -0.001299f, -0.002407f}, + {-0.037114f, -0.006797f, -0.001129f} + }, + { + {-0.518417f, -0.006133f, +0.001495f}, + {-0.833856f, -0.011056f, -0.000737f}, + {+0.132343f, -0.004055f, -0.000776f}, + {-0.115163f, +0.018375f, +0.002028f} + }, + { + {-0.493716f, +0.003010f, +0.001174f}, + {-0.768131f, +0.020508f, -0.000066f}, + {+0.152693f, +0.008282f, -0.001169f}, + {-0.209710f, -0.025096f, +0.001590f} + }, + { + {-0.475954f, -0.001122f, +0.000352f}, + {-0.692851f, -0.022031f, +0.002804f}, + {+0.177765f, -0.009921f, +0.000059f}, + {-0.298030f, +0.020217f, -0.000155f} + }, + { + {-0.460792f, +0.002405f, -0.000376f}, + {-0.628175f, +0.009296f, +0.003825f}, + {+0.180171f, -0.003908f, +0.001064f}, + {-0.358358f, -0.006713f, -0.000347f} + }, + { + {-0.443319f, -0.006234f, +0.000246f}, + {-0.585810f, +0.000344f, +0.001004f}, + {+0.146499f, +0.011689f, +0.000951f}, + {-0.382061f, -0.004531f, +0.001751f} + }, + { + {-0.421955f, +0.005364f, +0.001214f}, + {-0.561763f, -0.000808f, -0.002176f}, + {+0.084775f, -0.020993f, +0.000045f}, + {-0.377713f, +0.006390f, +0.003942f} + }, + { + {-0.398163f, -0.003724f, +0.000751f}, + {-0.543402f, -0.007140f, -0.001937f}, + {+0.018165f, +0.017000f, -0.002291f}, + {-0.362688f, -0.001927f, +0.003741f} + }, + { + {-0.373625f, +0.004821f, +0.000045f}, + {-0.521728f, +0.008459f, +0.000565f}, + {-0.028207f, -0.002987f, -0.002148f}, + {-0.349401f, +0.000605f, +0.002646f} + }, + { + {-0.349815f, -0.005517f, +0.000230f}, + {-0.496496f, -0.005695f, +0.001454f}, + {-0.043081f, -0.009641f, +0.002012f}, + {-0.338864f, +0.001346f, +0.001602f} + }, + { + {-0.328050f, +0.004001f, +0.000439f}, + {-0.471819f, +0.004175f, +0.001005f}, + {-0.032608f, +0.005428f, +0.005314f}, + {-0.322952f, +0.001273f, -0.000092f} + }, + { + {-0.308595f, -0.003134f, +0.000145f}, + {-0.451672f, -0.002574f, +0.000427f}, + {-0.010290f, +0.004974f, +0.001398f}, + {-0.292677f, -0.007601f, -0.001415f} + }, + { + {-0.290597f, +0.003355f, -0.000136f}, + {-0.436743f, +0.002865f, +0.000374f}, + {+0.017338f, +0.007331f, -0.002166f}, + {-0.247618f, +0.015355f, -0.000635f} + }, + { + {-0.272998f, -0.004175f, +0.000021f}, + {-0.424310f, -0.002403f, +0.000711f}, + {+0.047898f, -0.011482f, +0.000426f}, + {-0.198447f, -0.014503f, +0.001973f} + }, + { + {-0.255459f, +0.003452f, +0.000162f}, + {-0.409862f, +0.003440f, +0.000963f}, + {+0.077199f, +0.004028f, +0.001741f}, + {-0.160349f, +0.003060f, +0.002227f} + }, + { + {-0.238237f, -0.003448f, +0.000017f}, + {-0.389274f, -0.003315f, +0.000451f}, + {+0.103396f, -0.000155f, -0.000865f}, + {-0.141016f, +0.003270f, -0.000528f} + }, + { + {-0.221659f, +0.003880f, +0.000200f}, + {-0.360274f, +0.007600f, -0.000068f}, + {+0.127118f, +0.006707f, -0.002120f}, + {-0.136776f, -0.001506f, -0.002388f} + }, + { + {-0.206321f, -0.002421f, +0.000222f}, + {-0.323761f, -0.010008f, +0.000633f}, + {+0.147702f, -0.009697f, +0.000777f}, + {-0.138196f, -0.005501f, -0.000185f} + }, + { + {-0.192402f, +0.002339f, -0.000141f}, + {-0.283782f, +0.009026f, +0.001400f}, + {+0.162715f, +0.001250f, +0.002766f}, + {-0.137599f, +0.001369f, +0.002680f} + }, + { + {-0.179623f, -0.002933f, -0.000145f}, + {-0.244500f, -0.005039f, +0.000589f}, + {+0.172860f, +0.006728f, -0.000517f}, + {-0.130069f, +0.003207f, +0.001003f} + }, + { + {-0.168039f, +0.002857f, +0.000210f}, + {-0.207651f, +0.005569f, -0.001162f}, + {+0.183789f, +0.001069f, -0.004319f}, + {-0.111107f, +0.002870f, -0.002170f} + }, + { + {-0.157725f, -0.001947f, +0.000454f}, + {-0.172892f, -0.010252f, -0.000596f}, + {+0.198825f, -0.011358f, -0.002404f}, + {-0.080708f, -0.012176f, -0.001780f} + }, + { + {-0.148241f, +0.000618f, +0.000026f}, + {-0.141203f, +0.007243f, +0.001063f}, + {+0.212313f, +0.004737f, +0.000973f}, + {-0.046659f, +0.011069f, +0.000996f} + }, + { + {-0.138402f, -0.001765f, -0.000579f}, + {-0.113224f, -0.004585f, +0.001287f}, + {+0.215767f, +0.007978f, -0.001019f}, + {-0.020004f, +0.000374f, +0.000573f} + }, + { + {-0.127236f, +0.003443f, -0.000426f}, + {-0.086775f, +0.002732f, +0.000319f}, + {+0.206200f, -0.011017f, -0.006667f}, + {-0.006720f, -0.005737f, -0.003684f} + }, + { + {-0.114738f, -0.003852f, +0.000286f}, + {-0.059179f, -0.002958f, -0.001772f}, + {+0.184707f, +0.002148f, -0.008785f}, + {-0.006688f, +0.000728f, -0.006182f} + }, + { + {-0.100815f, +0.002358f, +0.000595f}, + {-0.029594f, +0.008594f, -0.002770f}, + {+0.151524f, +0.003310f, -0.003987f}, + {-0.019197f, +0.005615f, -0.002853f} + } +}; + +const float rightHRIRReal_FOA[BINAURAL_CONVBANDS][FOA_CHANNELS][BINAURAL_NTAPS_SBA]= +{ + { + {+0.181652f, +0.754551f, +0.218658f}, + {-0.313875f, +0.422228f, -0.135528f}, + {+0.014440f, +0.116710f, -0.013575f}, + {+0.042997f, +0.018886f, -0.015597f} + }, + { + {-0.171103f, -0.431000f, -0.158827f}, + {+0.162330f, +1.016290f, -0.055279f}, + {-0.009076f, +0.107488f, -0.010075f}, + {-0.002269f, +0.060685f, +0.014338f} + }, + { + {-0.320265f, -0.250765f, -0.167171f}, + {+0.685853f, -0.069215f, +0.258616f}, + {-0.021745f, +0.080557f, +0.010049f}, + {-0.070084f, +0.090970f, +0.018109f} + }, + { + {-0.090062f, +0.396798f, +0.031329f}, + {+0.547868f, -0.612159f, +0.064837f}, + {-0.014055f, +0.010916f, -0.020054f}, + {-0.104609f, -0.009719f, -0.014645f} + }, + { + {+0.310752f, -0.054756f, +0.106519f}, + {-0.077791f, +0.305320f, -0.144875f}, + {+0.048626f, -0.050345f, -0.007511f}, + {-0.035749f, -0.049561f, -0.008157f} + }, + { + {+0.590278f, -0.119063f, +0.024674f}, + {-0.708076f, +0.088569f, -0.094265f}, + {+0.119880f, +0.048720f, +0.014661f}, + {+0.120422f, +0.058573f, +0.004643f} + }, + { + {+0.638355f, +0.074625f, -0.043889f}, + {-1.048572f, -0.131298f, +0.037692f}, + {+0.143385f, +0.033975f, +0.014623f}, + {+0.293747f, -0.017822f, -0.000451f} + }, + { + {+0.521197f, -0.005266f, -0.041412f}, + {-1.094584f, -0.000210f, +0.073803f}, + {+0.109004f, -0.035628f, -0.003452f}, + {+0.407579f, +0.034241f, -0.002887f} + }, + { + {+0.361479f, -0.014806f, -0.009497f}, + {-0.986770f, +0.046512f, +0.029288f}, + {+0.057809f, +0.027844f, -0.015215f}, + {+0.409283f, +0.014805f, +0.005752f} + }, + { + {+0.229108f, -0.009840f, +0.009477f}, + {-0.839323f, -0.000705f, -0.009034f}, + {+0.036287f, +0.030074f, -0.010227f}, + {+0.293083f, -0.069929f, -0.004421f} + }, + { + {+0.125590f, +0.030181f, +0.007318f}, + {-0.687756f, -0.052219f, -0.009126f}, + {+0.052382f, -0.019274f, +0.003613f}, + {+0.122951f, +0.036356f, -0.013394f} + }, + { + {+0.030890f, -0.030176f, -0.000832f}, + {-0.531513f, +0.048483f, +0.004668f}, + {+0.067811f, -0.004747f, +0.002746f}, + {-0.026040f, -0.009502f, -0.004388f} + }, + { + {-0.062962f, +0.019124f, -0.003537f}, + {-0.376029f, -0.026217f, +0.006323f}, + {+0.042499f, +0.013437f, -0.001738f}, + {-0.120763f, +0.008891f, +0.001968f} + }, + { + {-0.150437f, -0.012367f, -0.001050f}, + {-0.234297f, +0.021072f, +0.000774f}, + {-0.046092f, -0.025628f, -0.001827f}, + {-0.163500f, +0.007913f, +0.005640f} + }, + { + {-0.224579f, +0.011037f, +0.001567f}, + {-0.118032f, -0.020982f, -0.001167f}, + {-0.190587f, +0.031698f, +0.001189f}, + {-0.181600f, +0.008625f, +0.006827f} + }, + { + {-0.283765f, -0.012148f, +0.001665f}, + {-0.031141f, +0.014212f, -0.000704f}, + {-0.354999f, -0.033990f, +0.005051f}, + {-0.201565f, -0.012572f, +0.001547f} + }, + { + {-0.330851f, +0.010110f, +0.000281f}, + {+0.032740f, -0.010680f, -0.000608f}, + {-0.489897f, +0.028555f, +0.005370f}, + {-0.226930f, +0.003469f, +0.000412f} + }, + { + {-0.370651f, -0.006974f, -0.000273f}, + {+0.085140f, +0.009699f, -0.000484f}, + {-0.550417f, -0.008550f, +0.002078f}, + {-0.248676f, -0.002190f, +0.002941f} + }, + { + {-0.408944f, +0.005900f, +0.000497f}, + {+0.135902f, -0.010386f, -0.000573f}, + {-0.516823f, -0.021637f, +0.000484f}, + {-0.254059f, +0.003659f, +0.002185f} + }, + { + {-0.450752f, -0.008484f, +0.001446f}, + {+0.191283f, +0.014617f, +0.000163f}, + {-0.408035f, +0.040263f, +0.003661f}, + {-0.231639f, +0.007741f, +0.000045f} + }, + { + {-0.497579f, +0.012039f, +0.001191f}, + {+0.253854f, -0.015815f, +0.001949f}, + {-0.274552f, -0.030994f, +0.006408f}, + {-0.178594f, -0.020739f, +0.002028f} + }, + { + {-0.545362f, -0.010634f, +0.000559f}, + {+0.324146f, +0.011460f, +0.001641f}, + {-0.169370f, +0.009075f, +0.003395f}, + {-0.105323f, +0.013694f, +0.002900f} + }, + { + {-0.587196f, +0.008279f, +0.000328f}, + {+0.403134f, -0.010566f, -0.002217f}, + {-0.118490f, +0.003381f, -0.001814f}, + {-0.027446f, -0.008251f, -0.001827f} + }, + { + {-0.618017f, -0.004259f, +0.000361f}, + {+0.490358f, +0.020714f, -0.004529f}, + {-0.113358f, -0.003251f, -0.002770f}, + {+0.041459f, +0.013481f, -0.005194f} + }, + { + {-0.637687f, +0.001567f, +0.000820f}, + {+0.576790f, -0.023931f, -0.002213f}, + {-0.125198f, +0.004103f, -0.001443f}, + {+0.086209f, -0.010781f, -0.003979f} + }, + { + {-0.651150f, -0.001076f, +0.001428f}, + {+0.645409f, +0.014669f, +0.000718f}, + {-0.123622f, +0.001940f, -0.001608f}, + {+0.092869f, +0.002431f, -0.000324f} + }, + { + {-0.664780f, +0.003292f, +0.001710f}, + {+0.683586f, -0.000299f, +0.000557f}, + {-0.092026f, -0.012393f, -0.001589f}, + {+0.056395f, +0.017649f, +0.000374f} + }, + { + {-0.682371f, -0.006662f, +0.000792f}, + {+0.693411f, -0.007664f, -0.002560f}, + {-0.036899f, +0.016426f, -0.000987f}, + {-0.012285f, -0.023342f, -0.003158f} + }, + { + {-0.702854f, +0.004929f, -0.000169f}, + {+0.690742f, +0.001912f, -0.004494f}, + {+0.017981f, -0.013806f, -0.000030f}, + {-0.088921f, +0.012514f, -0.003181f} + }, + { + {-0.722549f, -0.002146f, +0.000430f}, + {+0.692300f, +0.005917f, -0.002876f}, + {+0.046872f, +0.003463f, +0.001220f}, + {-0.154235f, -0.010645f, -0.001356f} + }, + { + {-0.739092f, +0.002594f, +0.001242f}, + {+0.704186f, -0.008734f, +0.000319f}, + {+0.036822f, +0.011640f, +0.000478f}, + {-0.201705f, +0.002195f, +0.000385f} + }, + { + {-0.751826f, -0.003070f, +0.000998f}, + {+0.721419f, +0.002290f, +0.001142f}, + {-0.005059f, -0.018609f, -0.002901f}, + {-0.237750f, -0.005780f, +0.002036f} + }, + { + {-0.760887f, +0.001608f, +0.000546f}, + {+0.736911f, -0.001064f, -0.000228f}, + {-0.057870f, +0.010116f, -0.004534f}, + {-0.273933f, +0.006641f, +0.002467f} + }, + { + {-0.767195f, -0.000265f, +0.000748f}, + {+0.748024f, +0.000586f, -0.001053f}, + {-0.102334f, +0.003212f, +0.000059f}, + {-0.315083f, -0.011342f, +0.002600f} + }, + { + {-0.772327f, +0.001114f, +0.000964f}, + {+0.756683f, -0.002199f, -0.000983f}, + {-0.133057f, +0.004906f, +0.003973f}, + {-0.355964f, +0.012189f, +0.001107f} + }, + { + {-0.777379f, -0.001664f, +0.000676f}, + {+0.767213f, +0.002558f, -0.000597f}, + {-0.152753f, -0.009690f, +0.001092f}, + {-0.384303f, -0.006913f, -0.001047f} + }, + { + {-0.782304f, +0.001186f, +0.000401f}, + {+0.783173f, -0.004116f, -0.000499f}, + {-0.161920f, -0.000439f, -0.001076f}, + {-0.390874f, -0.005592f, -0.000791f} + }, + { + {-0.786466f, -0.000413f, +0.000504f}, + {+0.805468f, +0.004296f, -0.000905f}, + {-0.161504f, +0.005798f, +0.001317f}, + {-0.378159f, +0.009420f, +0.002017f} + }, + { + {-0.789480f, +0.000911f, +0.000469f}, + {+0.831991f, -0.006156f, -0.001415f}, + {-0.154727f, +0.000127f, +0.002457f}, + {-0.358994f, -0.003224f, +0.003001f} + }, + { + {-0.791179f, +0.000118f, +0.000378f}, + {+0.858608f, +0.007156f, -0.000826f}, + {-0.143224f, -0.002141f, -0.000223f}, + {-0.346009f, -0.003832f, +0.000505f} + }, + { + {-0.791713f, -0.000506f, +0.000690f}, + {+0.880258f, -0.003409f, -0.000310f}, + {-0.126671f, -0.005516f, -0.001744f}, + {-0.344447f, +0.002552f, -0.002098f} + }, + { + {-0.791760f, -0.000637f, +0.000646f}, + {+0.894068f, -0.000147f, -0.001099f}, + {-0.106700f, +0.011976f, +0.001536f}, + {-0.352724f, +0.003880f, -0.000028f} + }, + { + {-0.791607f, +0.000326f, +0.000259f}, + {+0.900705f, +0.000766f, -0.002346f}, + {-0.087833f, -0.003369f, +0.004535f}, + {-0.367814f, +0.002794f, +0.003185f} + }, + { + {-0.791360f, +0.000216f, +0.000145f}, + {+0.902761f, +0.003469f, -0.001579f}, + {-0.071216f, -0.005336f, +0.001636f}, + {-0.384313f, -0.008317f, +0.002102f} + }, + { + {-0.791514f, -0.000959f, +0.000554f}, + {+0.901431f, -0.000403f, +0.000135f}, + {-0.050334f, -0.003160f, -0.002061f}, + {-0.392811f, +0.004068f, -0.000843f} + }, + { + {-0.792816f, -0.000333f, +0.001006f}, + {+0.897192f, -0.003319f, -0.000240f}, + {-0.018937f, +0.014843f, -0.000267f}, + {-0.385889f, +0.008000f, -0.000602f} + }, + { + {-0.795515f, +0.001892f, +0.000664f}, + {+0.892619f, +0.002628f, -0.001553f}, + {+0.020997f, -0.013093f, +0.003597f}, + {-0.364329f, -0.010852f, +0.002618f} + }, + { + {-0.798742f, -0.001369f, -0.000006f}, + {+0.889854f, -0.001159f, -0.002594f}, + {+0.062746f, +0.000823f, +0.002081f}, + {-0.335764f, +0.002095f, +0.002620f} + }, + { + {-0.801561f, -0.000332f, -0.000055f}, + {+0.888481f, -0.002442f, -0.002445f}, + {+0.101614f, +0.005650f, -0.006242f}, + {-0.306982f, +0.005040f, -0.003292f} + }, + { + {-0.803505f, +0.001996f, +0.000969f}, + {+0.886774f, +0.004132f, -0.000094f}, + {+0.134585f, +0.001923f, -0.014731f}, + {-0.282127f, -0.002996f, -0.011457f} + } +}; + +const float rightHRIRImag_FOA[BINAURAL_CONVBANDS][FOA_CHANNELS][BINAURAL_NTAPS_SBA]= +{ + { + {-0.171042f, +0.590899f, -0.184148f}, + {+0.244016f, -0.359802f, +0.065072f}, + {-0.014995f, +0.035748f, -0.012250f}, + {-0.031507f, +0.034780f, -0.009895f} + }, + { + {-0.228601f, +0.478433f, -0.200802f}, + {+0.468416f, +0.184796f, +0.220307f}, + {-0.021499f, +0.027785f, -0.012584f}, + {-0.060325f, +0.030602f, -0.002599f} + }, + { + {+0.101029f, -0.456163f, +0.083058f}, + {+0.043611f, +0.870939f, +0.055288f}, + {+0.001858f, +0.027597f, -0.016310f}, + {-0.029059f, +0.033806f, -0.005356f} + }, + { + {+0.410000f, -0.084502f, +0.139239f}, + {-0.675225f, -0.218111f, -0.204844f}, + {+0.040662f, +0.051315f, -0.018039f}, + {+0.063503f, +0.056458f, -0.016519f} + }, + { + {+0.415696f, +0.265055f, +0.002626f}, + {-1.013647f, -0.334903f, -0.081079f}, + {+0.065042f, -0.040883f, +0.012352f}, + {+0.181037f, -0.059880f, +0.005085f} + }, + { + {+0.148368f, -0.111388f, -0.073685f}, + {-0.845933f, +0.250930f, +0.091257f}, + {+0.025616f, -0.060138f, +0.012766f}, + {+0.228995f, -0.032819f, +0.003215f} + }, + { + {-0.193830f, -0.014212f, -0.040266f}, + {-0.402943f, -0.020025f, +0.092885f}, + {-0.058690f, +0.041101f, -0.008172f}, + {+0.161828f, +0.015394f, -0.004824f} + }, + { + {-0.448848f, +0.024310f, +0.012126f}, + {+0.042491f, -0.043522f, +0.007450f}, + {-0.129054f, -0.013924f, -0.014446f}, + {-0.004772f, -0.042423f, +0.005623f} + }, + { + {-0.581348f, +0.015560f, +0.027528f}, + {+0.364335f, -0.028974f, -0.038991f}, + {-0.152614f, -0.032355f, -0.005641f}, + {-0.218401f, +0.075676f, -0.000317f} + }, + { + {-0.641251f, -0.033204f, +0.014171f}, + {+0.576730f, +0.078039f, -0.024279f}, + {-0.144066f, +0.021824f, +0.009938f}, + {-0.391879f, -0.026769f, -0.009335f} + }, + { + {-0.678995f, +0.021986f, +0.000075f}, + {+0.725441f, -0.048920f, +0.000285f}, + {-0.153455f, +0.022432f, +0.008363f}, + {-0.464657f, -0.026611f, +0.001799f} + }, + { + {-0.709246f, -0.001743f, -0.002228f}, + {+0.829481f, +0.007880f, +0.002786f}, + {-0.208073f, -0.023291f, +0.000232f}, + {-0.446725f, +0.013756f, +0.010505f} + }, + { + {-0.725841f, -0.005310f, +0.002197f}, + {+0.889756f, +0.003342f, -0.005446f}, + {-0.296494f, +0.020861f, +0.000461f}, + {-0.383826f, -0.016046f, +0.008157f} + }, + { + {-0.724803f, +0.003851f, +0.004749f}, + {+0.910037f, +0.002807f, -0.007312f}, + {-0.382641f, -0.013902f, +0.003575f}, + {-0.319137f, +0.005237f, +0.005556f} + }, + { + {-0.710495f, -0.001176f, +0.003666f}, + {+0.902293f, +0.002075f, -0.004352f}, + {-0.421514f, +0.001837f, +0.005564f}, + {-0.276374f, +0.006416f, -0.000678f} + }, + { + {-0.690926f, +0.001911f, +0.001428f}, + {+0.883286f, -0.004067f, -0.003096f}, + {-0.382030f, +0.012331f, +0.003744f}, + {-0.247702f, +0.008689f, -0.002881f} + }, + { + {-0.672402f, -0.004418f, +0.000819f}, + {+0.868037f, +0.001291f, -0.002503f}, + {-0.260382f, -0.031252f, -0.000392f}, + {-0.215212f, -0.010735f, +0.000421f} + }, + { + {-0.658558f, +0.003708f, +0.001700f}, + {+0.863001f, +0.000603f, -0.002111f}, + {-0.084457f, +0.046037f, -0.001989f}, + {-0.169471f, +0.007931f, +0.000103f} + }, + { + {-0.650017f, -0.001079f, +0.002333f}, + {+0.867523f, -0.003563f, -0.001620f}, + {+0.093137f, -0.042759f, +0.000290f}, + {-0.110082f, -0.012804f, -0.002290f} + }, + { + {-0.643665f, -0.001088f, +0.001723f}, + {+0.877421f, +0.003410f, -0.000713f}, + {+0.217492f, +0.016953f, +0.001740f}, + {-0.046668f, +0.018761f, -0.001213f} + }, + { + {-0.633405f, -0.001560f, +0.000669f}, + {+0.887575f, +0.001389f, -0.001467f}, + {+0.260289f, +0.010429f, -0.001427f}, + {+0.003491f, -0.008000f, +0.000581f} + }, + { + {-0.613764f, +0.006196f, +0.000648f}, + {+0.893912f, -0.004015f, -0.004684f}, + {+0.234569f, -0.016937f, -0.004729f}, + {+0.024290f, -0.008269f, -0.003225f} + }, + { + {-0.584438f, -0.007700f, +0.000979f}, + {+0.892617f, -0.003169f, -0.005373f}, + {+0.180710f, +0.012490f, -0.004688f}, + {+0.010563f, +0.002672f, -0.005332f} + }, + { + {-0.550310f, +0.008552f, +0.001243f}, + {+0.875679f, +0.001053f, -0.001808f}, + {+0.139761f, -0.001299f, -0.002407f}, + {-0.037114f, -0.006797f, -0.001129f} + }, + { + {-0.518417f, -0.006133f, +0.001495f}, + {+0.833856f, +0.011056f, +0.000737f}, + {+0.132343f, -0.004055f, -0.000776f}, + {-0.115163f, +0.018375f, +0.002028f} + }, + { + {-0.493716f, +0.003010f, +0.001174f}, + {+0.768131f, -0.020508f, +0.000066f}, + {+0.152693f, +0.008282f, -0.001169f}, + {-0.209710f, -0.025096f, +0.001590f} + }, + { + {-0.475954f, -0.001122f, +0.000352f}, + {+0.692851f, +0.022031f, -0.002804f}, + {+0.177765f, -0.009921f, +0.000059f}, + {-0.298030f, +0.020217f, -0.000155f} + }, + { + {-0.460792f, +0.002405f, -0.000376f}, + {+0.628175f, -0.009296f, -0.003825f}, + {+0.180171f, -0.003908f, +0.001064f}, + {-0.358358f, -0.006713f, -0.000347f} + }, + { + {-0.443319f, -0.006234f, +0.000246f}, + {+0.585810f, -0.000344f, -0.001004f}, + {+0.146499f, +0.011689f, +0.000951f}, + {-0.382061f, -0.004531f, +0.001751f} + }, + { + {-0.421955f, +0.005364f, +0.001214f}, + {+0.561763f, +0.000808f, +0.002176f}, + {+0.084775f, -0.020993f, +0.000045f}, + {-0.377713f, +0.006390f, +0.003942f} + }, + { + {-0.398163f, -0.003724f, +0.000751f}, + {+0.543402f, +0.007140f, +0.001937f}, + {+0.018165f, +0.017000f, -0.002291f}, + {-0.362688f, -0.001927f, +0.003741f} + }, + { + {-0.373625f, +0.004821f, +0.000045f}, + {+0.521728f, -0.008459f, -0.000565f}, + {-0.028207f, -0.002987f, -0.002148f}, + {-0.349401f, +0.000605f, +0.002646f} + }, + { + {-0.349815f, -0.005517f, +0.000230f}, + {+0.496496f, +0.005695f, -0.001454f}, + {-0.043081f, -0.009641f, +0.002012f}, + {-0.338864f, +0.001346f, +0.001602f} + }, + { + {-0.328050f, +0.004001f, +0.000439f}, + {+0.471819f, -0.004175f, -0.001005f}, + {-0.032608f, +0.005428f, +0.005314f}, + {-0.322952f, +0.001273f, -0.000092f} + }, + { + {-0.308595f, -0.003134f, +0.000145f}, + {+0.451672f, +0.002574f, -0.000427f}, + {-0.010290f, +0.004974f, +0.001398f}, + {-0.292677f, -0.007601f, -0.001415f} + }, + { + {-0.290597f, +0.003355f, -0.000136f}, + {+0.436743f, -0.002865f, -0.000374f}, + {+0.017338f, +0.007331f, -0.002166f}, + {-0.247618f, +0.015355f, -0.000635f} + }, + { + {-0.272998f, -0.004175f, +0.000021f}, + {+0.424310f, +0.002403f, -0.000711f}, + {+0.047898f, -0.011482f, +0.000426f}, + {-0.198447f, -0.014503f, +0.001973f} + }, + { + {-0.255459f, +0.003452f, +0.000162f}, + {+0.409862f, -0.003440f, -0.000963f}, + {+0.077199f, +0.004028f, +0.001741f}, + {-0.160349f, +0.003060f, +0.002227f} + }, + { + {-0.238237f, -0.003448f, +0.000017f}, + {+0.389274f, +0.003315f, -0.000451f}, + {+0.103396f, -0.000155f, -0.000865f}, + {-0.141016f, +0.003270f, -0.000528f} + }, + { + {-0.221659f, +0.003880f, +0.000200f}, + {+0.360274f, -0.007600f, +0.000068f}, + {+0.127118f, +0.006707f, -0.002120f}, + {-0.136776f, -0.001506f, -0.002388f} + }, + { + {-0.206321f, -0.002421f, +0.000222f}, + {+0.323761f, +0.010008f, -0.000633f}, + {+0.147702f, -0.009697f, +0.000777f}, + {-0.138196f, -0.005501f, -0.000185f} + }, + { + {-0.192402f, +0.002339f, -0.000141f}, + {+0.283782f, -0.009026f, -0.001400f}, + {+0.162715f, +0.001250f, +0.002766f}, + {-0.137599f, +0.001369f, +0.002680f} + }, + { + {-0.179623f, -0.002933f, -0.000145f}, + {+0.244500f, +0.005039f, -0.000589f}, + {+0.172860f, +0.006728f, -0.000517f}, + {-0.130069f, +0.003207f, +0.001003f} + }, + { + {-0.168039f, +0.002857f, +0.000210f}, + {+0.207651f, -0.005569f, +0.001162f}, + {+0.183789f, +0.001069f, -0.004319f}, + {-0.111107f, +0.002870f, -0.002170f} + }, + { + {-0.157725f, -0.001947f, +0.000454f}, + {+0.172892f, +0.010252f, +0.000596f}, + {+0.198825f, -0.011358f, -0.002404f}, + {-0.080708f, -0.012176f, -0.001780f} + }, + { + {-0.148241f, +0.000618f, +0.000026f}, + {+0.141203f, -0.007243f, -0.001063f}, + {+0.212313f, +0.004737f, +0.000973f}, + {-0.046659f, +0.011069f, +0.000996f} + }, + { + {-0.138402f, -0.001765f, -0.000579f}, + {+0.113224f, +0.004585f, -0.001287f}, + {+0.215767f, +0.007978f, -0.001019f}, + {-0.020004f, +0.000374f, +0.000573f} + }, + { + {-0.127236f, +0.003443f, -0.000426f}, + {+0.086775f, -0.002732f, -0.000319f}, + {+0.206200f, -0.011017f, -0.006667f}, + {-0.006720f, -0.005737f, -0.003684f} + }, + { + {-0.114738f, -0.003852f, +0.000286f}, + {+0.059179f, +0.002958f, +0.001772f}, + {+0.184707f, +0.002148f, -0.008785f}, + {-0.006688f, +0.000728f, -0.006182f} + }, + { + {-0.100815f, +0.002358f, +0.000595f}, + {+0.029594f, -0.008594f, +0.002770f}, + {+0.151524f, +0.003310f, -0.003987f}, + {-0.019197f, +0.005615f, -0.002853f} + } +}; + + +const float FASTCONV_HRIR_latency_s = 0.000666667f; +const float leftHRIRReal[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS]= +{ + { + {+1.164232f, -0.071388f, +0.046399f}, + {+0.625622f, +0.318887f, +0.014720f}, + {+1.000960f, +0.045336f, +0.068038f}, + {+1.137988f, -0.154415f, -0.061425f}, + {+0.303190f, +0.543160f, +0.149069f}, + {+1.253214f, -0.205377f, -0.065229f}, + {+0.085322f, +0.882648f, +0.205135f}, + {+1.312265f, -0.220630f, -0.090644f}, + {+0.058226f, +0.942911f, +0.171217f}, + {+1.034378f, +0.117953f, +0.052257f}, + {+0.680445f, +0.361766f, +0.049600f}, + {+1.147757f, -0.086335f, +0.012687f}, + {+0.250187f, +0.697472f, +0.213227f}, + {+1.088959f, -0.092061f, -0.000586f}, + {+0.501443f, +0.364037f, +0.074228f} + }, + { + {+1.146595f, -0.154651f, +0.043142f}, + {+0.286735f, -0.252034f, -0.153374f}, + {+0.948810f, -0.114394f, +0.051619f}, + {+1.263032f, +0.249467f, +0.062149f}, + {-0.060685f, -0.361794f, -0.117760f}, + {+1.350448f, +0.215668f, +0.073258f}, + {-0.105135f, -0.389796f, -0.271911f}, + {+1.374733f, +0.173637f, +0.049028f}, + {-0.094305f, -0.164320f, -0.266068f}, + {+1.040815f, -0.208066f, -0.083035f}, + {+0.438624f, -0.019990f, -0.059450f}, + {+1.166646f, -0.148967f, -0.011838f}, + {-0.102492f, -0.454586f, -0.136217f}, + {+1.097313f, -0.054163f, +0.016726f}, + {+0.098987f, -0.171388f, -0.043273f} + }, + { + {+1.143116f, +0.354198f, -0.162550f}, + {-0.088480f, -0.420403f, +0.001880f}, + {+0.931498f, +0.123662f, -0.033888f}, + {+1.318265f, +0.100233f, +0.102754f}, + {-0.299298f, -0.139613f, -0.122914f}, + {+1.356998f, +0.217141f, +0.061024f}, + {-0.046525f, -0.814319f, -0.099822f}, + {+1.353473f, +0.285762f, +0.004248f}, + {+0.011288f, -0.915723f, +0.029668f}, + {+1.153537f, -0.424294f, -0.013858f}, + {+0.127607f, -0.015631f, -0.000953f}, + {+1.196081f, +0.029242f, -0.092440f}, + {-0.278085f, -0.128122f, -0.198812f}, + {+1.086036f, +0.107882f, -0.049328f}, + {-0.325202f, +0.033240f, -0.015961f} + }, + { + {+1.325816f, +0.511650f, -0.152840f}, + {-0.459273f, -0.470824f, +0.048067f}, + {+1.060173f, +0.310816f, -0.017459f}, + {+1.191764f, -0.170770f, +0.020474f}, + {-0.224619f, +0.084318f, -0.062623f}, + {+1.231375f, -0.115063f, -0.048061f}, + {+0.084800f, +0.048581f, +0.210193f}, + {+1.284471f, +0.011386f, -0.085145f}, + {+0.074098f, -0.455054f, +0.206816f}, + {+1.276588f, -0.117807f, +0.087644f}, + {-0.221606f, -0.084179f, +0.030307f}, + {+1.280931f, +0.249488f, -0.020802f}, + {-0.094546f, +0.498021f, -0.017920f}, + {+1.108975f, +0.181116f, -0.024618f}, + {-0.500760f, -0.035203f, -0.013172f} + }, + { + {+1.605708f, -0.366586f, +0.142118f}, + {-0.676760f, -0.089781f, -0.072018f}, + {+1.268416f, -0.122990f, +0.116068f}, + {+0.963365f, +0.072984f, -0.025802f}, + {+0.078497f, -0.418906f, +0.044519f}, + {+1.077459f, -0.019951f, -0.049500f}, + {+0.031477f, +0.447773f, +0.053312f}, + {+1.259077f, -0.142552f, -0.013514f}, + {-0.059280f, +0.507158f, -0.168109f}, + {+1.292946f, +0.146018f, -0.029776f}, + {-0.512977f, +0.036303f, +0.035411f}, + {+1.302893f, +0.041776f, +0.054097f}, + {+0.194009f, -0.198069f, +0.165160f}, + {+1.107011f, +0.048657f, +0.025557f}, + {-0.311251f, -0.179016f, -0.007145f} + }, + { + {+1.664749f, -0.424953f, +0.117548f}, + {-0.518829f, +0.144843f, +0.012635f}, + {+1.341921f, -0.475334f, -0.025454f}, + {+0.745020f, +0.011176f, -0.013117f}, + {+0.290955f, -0.043105f, +0.145092f}, + {+0.953967f, +0.019869f, -0.011129f}, + {-0.059334f, -0.119714f, -0.140789f}, + {+1.242504f, +0.051036f, +0.063409f}, + {-0.027620f, +0.732031f, -0.075265f}, + {+1.345654f, +0.206823f, +0.000993f}, + {-0.664021f, -0.071212f, +0.022023f}, + {+1.166038f, -0.153803f, -0.001166f}, + {+0.215666f, -0.319906f, +0.114867f}, + {+0.999816f, -0.066205f, -0.006296f}, + {+0.083957f, +0.134151f, +0.028232f} + }, + { + {+1.581283f, +0.343441f, -0.147384f}, + {-0.137274f, +0.076831f, -0.038250f}, + {+1.367477f, -0.195495f, -0.142118f}, + {+0.611192f, -0.097324f, +0.048461f}, + {+0.155099f, +0.411591f, +0.002255f}, + {+0.891869f, -0.009049f, +0.006965f}, + {-0.032052f, -0.346312f, -0.054872f}, + {+1.206124f, +0.162210f, +0.026195f}, + {+0.069189f, +0.025911f, +0.196858f}, + {+1.428022f, +0.163648f, +0.009798f}, + {-0.622568f, -0.029470f, -0.001764f}, + {+0.954217f, +0.027854f, -0.027765f}, + {-0.029956f, +0.351502f, -0.072001f}, + {+0.821491f, +0.019645f, -0.005837f}, + {+0.377920f, -0.040829f, +0.033773f} + }, + { + {+1.677009f, +0.377370f, -0.142884f}, + {+0.340806f, +0.310825f, -0.047722f}, + {+1.442173f, +0.342472f, +0.058973f}, + {+0.535134f, -0.138655f, +0.042466f}, + {-0.109214f, -0.056024f, -0.105562f}, + {+0.897169f, +0.015446f, +0.016293f}, + {+0.046512f, +0.128065f, +0.107566f}, + {+1.199956f, -0.036702f, -0.050091f}, + {-0.017560f, -0.600552f, -0.051411f}, + {+1.542399f, +0.075318f, -0.055439f}, + {-0.383881f, +0.085336f, -0.002185f}, + {+0.767844f, -0.002300f, -0.002498f}, + {-0.213556f, +0.042618f, -0.139727f}, + {+0.614646f, -0.038818f, +0.011343f}, + {+0.389565f, -0.093296f, +0.018341f} + }, + { + {+1.950355f, -0.362582f, +0.081454f}, + {+0.682687f, -0.162615f, +0.076325f}, + {+1.383305f, +0.259100f, +0.098340f}, + {+0.507785f, +0.030154f, -0.021916f}, + {-0.213659f, -0.101401f, -0.062195f}, + {+0.951588f, +0.040882f, -0.000970f}, + {+0.031901f, +0.266437f, +0.053656f}, + {+1.302827f, -0.171084f, -0.011255f}, + {-0.046125f, -0.384263f, -0.129408f}, + {+1.712243f, -0.194390f, +0.019399f}, + {-0.027625f, -0.133154f, +0.018328f}, + {+0.668291f, +0.010139f, +0.008195f}, + {-0.118934f, -0.338445f, -0.019973f}, + {+0.438220f, +0.079868f, -0.003191f}, + {+0.144432f, +0.164330f, -0.025701f} + }, + { + {+2.093580f, -0.196850f, +0.103630f}, + {+0.610952f, -0.295887f, +0.035489f}, + {+1.183258f, -0.254467f, -0.069704f}, + {+0.575110f, +0.116089f, +0.003537f}, + {-0.101158f, +0.222864f, +0.024346f}, + {+1.057859f, +0.043401f, -0.017762f}, + {-0.035693f, -0.134351f, -0.082748f}, + {+1.471333f, +0.025140f, +0.035257f}, + {+0.038543f, +0.232670f, +0.109875f}, + {+1.786701f, -0.093608f, +0.042083f}, + {+0.315108f, +0.002642f, +0.011084f}, + {+0.675572f, -0.006144f, -0.003303f}, + {+0.101827f, +0.111911f, +0.089442f}, + {+0.361145f, +0.021912f, -0.014375f}, + {-0.156559f, -0.020362f, -0.037847f} + }, + { + {+1.976571f, +0.241275f, -0.043490f}, + {+0.215943f, +0.100902f, -0.038402f}, + {+1.025479f, -0.189152f, -0.060485f}, + {+0.699954f, -0.000496f, +0.029249f}, + {+0.084280f, -0.041736f, +0.082895f}, + {+1.214688f, -0.076791f, +0.003066f}, + {-0.033219f, -0.189116f, -0.059524f}, + {+1.625112f, +0.050451f, -0.006609f}, + {+0.015390f, +0.395024f, +0.041010f}, + {+1.716470f, +0.098967f, -0.019398f}, + {+0.546520f, -0.014474f, -0.021685f}, + {+0.764906f, -0.062888f, -0.000632f}, + {+0.176131f, +0.115006f, +0.065018f}, + {+0.401503f, -0.073214f, +0.013531f}, + {-0.315978f, -0.085685f, +0.017030f} + }, + { + {+1.738061f, +0.041153f, -0.060947f}, + {-0.226724f, -0.081469f, -0.015083f}, + {+0.922005f, +0.036805f, +0.043095f}, + {+0.827335f, -0.067324f, -0.023100f}, + {+0.140772f, -0.212427f, +0.006831f}, + {+1.366857f, -0.002014f, +0.004214f}, + {+0.026336f, +0.163123f, +0.060613f}, + {+1.749249f, +0.060972f, -0.022997f}, + {-0.036122f, +0.013268f, -0.102505f}, + {+1.587780f, -0.017325f, -0.034831f}, + {+0.628526f, +0.009623f, -0.025420f}, + {+0.880943f, +0.044219f, +0.021208f}, + {+0.047589f, -0.158181f, +0.000915f}, + {+0.499398f, -0.006432f, +0.020261f}, + {-0.284768f, -0.026108f, +0.032717f} + }, + { + {+1.505132f, +0.022539f, -0.007951f}, + {-0.502341f, +0.014784f, -0.004442f}, + {+0.788099f, +0.109664f, +0.026293f}, + {+0.945261f, -0.116770f, -0.027695f}, + {+0.070952f, +0.012587f, -0.060046f}, + {+1.465040f, -0.001749f, -0.014809f}, + {+0.034434f, +0.143653f, +0.064672f}, + {+1.815683f, -0.023428f, +0.002040f}, + {+0.003390f, -0.275112f, +0.011303f}, + {+1.470938f, -0.021798f, -0.012446f}, + {+0.538936f, -0.002058f, -0.007385f}, + {+0.968457f, +0.052353f, +0.005680f}, + {-0.126264f, +0.126663f, -0.057452f}, + {+0.596708f, +0.023788f, -0.009367f}, + {-0.103836f, +0.018725f, -0.021490f} + }, + { + {+1.323053f, -0.031245f, -0.010960f}, + {-0.492814f, +0.061978f, +0.004857f}, + {+0.629433f, -0.057790f, -0.011522f}, + {+0.990987f, +0.041590f, +0.024383f}, + {-0.020040f, +0.083340f, -0.010638f}, + {+1.480865f, +0.017125f, -0.010601f}, + {-0.019240f, -0.174901f, -0.044679f}, + {+1.775213f, -0.086261f, -0.017961f}, + {+0.025429f, -0.108477f, +0.070866f}, + {+1.389486f, +0.000140f, +0.005964f}, + {+0.286716f, -0.064952f, +0.010826f}, + {+1.029093f, -0.016099f, -0.029749f}, + {-0.147616f, +0.078463f, -0.074691f}, + {+0.669798f, +0.034059f, -0.017672f}, + {+0.148950f, +0.124951f, -0.030334f} + }, + { + {+1.182510f, -0.045886f, +0.007051f}, + {-0.263474f, -0.085276f, +0.011348f}, + {+0.473865f, +0.014568f, -0.008515f}, + {+0.889927f, +0.101012f, +0.018019f}, + {-0.083849f, -0.019482f, +0.039696f}, + {+1.386823f, +0.026725f, +0.000771f}, + {-0.034351f, -0.105731f, -0.065818f}, + {+1.624911f, +0.001774f, -0.032570f}, + {-0.010460f, +0.157988f, -0.030666f}, + {+1.316722f, +0.043440f, -0.002660f}, + {-0.070456f, +0.112056f, +0.005895f}, + {+1.088370f, -0.079959f, -0.015118f}, + {+0.010696f, -0.252890f, +0.005868f}, + {+0.688001f, -0.021562f, -0.000700f}, + {+0.321581f, -0.091411f, +0.016059f} + }, + { + {+1.003882f, -0.024290f, +0.045086f}, + {+0.028075f, +0.094891f, +0.025537f}, + {+0.348737f, -0.009666f, +0.003782f}, + {+0.684266f, -0.092642f, -0.016858f}, + {-0.094687f, -0.092807f, +0.015332f}, + {+1.189337f, -0.053543f, +0.003361f}, + {+0.010648f, +0.163291f, +0.024850f}, + {+1.372511f, +0.028160f, +0.019011f}, + {-0.017554f, +0.105607f, -0.047949f}, + {+1.209792f, -0.033195f, -0.018513f}, + {-0.409194f, -0.068489f, -0.000898f}, + {+1.114407f, +0.011788f, +0.013270f}, + {+0.152611f, +0.084562f, +0.098898f}, + {+0.622917f, -0.018666f, +0.009922f}, + {+0.278306f, -0.044425f, +0.040442f} + }, + { + {+0.740177f, +0.195497f, +0.009467f}, + {+0.234086f, +0.033069f, +0.017363f}, + {+0.278404f, +0.005428f, +0.007940f}, + {+0.479823f, +0.016574f, -0.020585f}, + {-0.038592f, +0.051080f, -0.052176f}, + {+0.942736f, +0.059732f, +0.004267f}, + {+0.037747f, +0.010959f, +0.078277f}, + {+1.014378f, +0.145862f, +0.036898f}, + {+0.013463f, -0.125599f, +0.038289f}, + {+1.037014f, -0.004829f, -0.003051f}, + {-0.599240f, +0.017158f, +0.001993f}, + {+1.057897f, +0.055995f, +0.002659f}, + {+0.097746f, +0.241425f, +0.056951f}, + {+0.484638f, +0.055982f, +0.007230f}, + {+0.034409f, +0.166502f, +0.011758f} + }, + { + {+0.480829f, -0.064216f, -0.043606f}, + {+0.302159f, -0.065615f, -0.027649f}, + {+0.267594f, +0.001584f, +0.006546f}, + {+0.366217f, +0.055646f, +0.013124f}, + {+0.073328f, +0.179121f, -0.030479f}, + {+0.728428f, -0.048337f, +0.001439f}, + {-0.006609f, -0.265125f, -0.016510f}, + {+0.640014f, -0.153518f, -0.009948f}, + {+0.013220f, -0.131492f, +0.036082f}, + {+0.775649f, -0.065990f, +0.016867f}, + {-0.570949f, +0.037845f, +0.003919f}, + {+0.921821f, -0.037053f, -0.008881f}, + {-0.078407f, -0.230573f, -0.077915f}, + {+0.319853f, -0.071600f, -0.011181f}, + {-0.233852f, -0.106785f, -0.034385f} + }, + { + {+0.346889f, -0.104821f, -0.004742f}, + {+0.278839f, -0.028952f, -0.035646f}, + {+0.308015f, -0.016382f, +0.006865f}, + {+0.387256f, -0.021873f, +0.040727f}, + {+0.139350f, -0.105650f, +0.062450f}, + {+0.637226f, -0.018242f, +0.007115f}, + {-0.042429f, -0.053630f, -0.094110f}, + {+0.417755f, -0.008672f, -0.023314f}, + {-0.018943f, +0.103114f, -0.053053f}, + {+0.448779f, +0.108427f, +0.006588f}, + {-0.345464f, -0.074501f, +0.004085f}, + {+0.735939f, +0.043054f, -0.006246f}, + {-0.138142f, -0.161327f, -0.088998f}, + {+0.195889f, -0.012365f, -0.013162f}, + {-0.323001f, -0.053426f, -0.037017f} + }, + { + {+0.335149f, +0.024150f, +0.042650f}, + {+0.196181f, +0.041302f, +0.002444f}, + {+0.386375f, +0.004899f, +0.003361f}, + {+0.564612f, -0.025480f, +0.015096f}, + {+0.057054f, -0.159605f, +0.062037f}, + {+0.730907f, +0.044800f, +0.018459f}, + {+0.011492f, +0.297922f, +0.033799f}, + {+0.441286f, +0.097411f, +0.011722f}, + {-0.004564f, +0.210619f, -0.011762f}, + {+0.139688f, -0.077873f, -0.010083f}, + {-0.027659f, +0.078990f, +0.003505f}, + {+0.536993f, -0.035240f, -0.004368f}, + {-0.020118f, +0.231273f, +0.031141f}, + {+0.144861f, +0.035632f, +0.011759f}, + {-0.175851f, +0.155370f, +0.009858f} + }, + { + {+0.386157f, +0.060262f, +0.016757f}, + {+0.052839f, +0.021145f, +0.032934f}, + {+0.484472f, -0.002920f, -0.010570f}, + {+0.918642f, -0.034827f, -0.037149f}, + {-0.104209f, +0.229183f, -0.047655f}, + {+1.015020f, -0.033699f, +0.002853f}, + {+0.037426f, +0.156073f, +0.082853f}, + {+0.683874f, -0.079502f, +0.034799f}, + {+0.020608f, +0.028827f, +0.057521f}, + {-0.071180f, +0.006964f, -0.008015f}, + {+0.249215f, -0.054366f, +0.004926f}, + {+0.367933f, -0.002046f, +0.010161f}, + {+0.098532f, +0.027366f, +0.074117f}, + {+0.147810f, +0.003457f, +0.021465f}, + {+0.074185f, -0.043989f, +0.032862f} + }, + { + {+0.475703f, -0.006148f, -0.023405f}, + {-0.130356f, -0.121062f, +0.014557f}, + {+0.576084f, +0.037334f, -0.013945f}, + {+1.404901f, +0.165414f, -0.048723f}, + {-0.152471f, +0.096982f, -0.087407f}, + {+1.440940f, +0.071259f, -0.031007f}, + {-0.014512f, -0.190422f, -0.045041f}, + {+1.050275f, +0.008260f, +0.006195f}, + {-0.005777f, -0.163997f, -0.016934f}, + {-0.163442f, +0.028862f, +0.011254f}, + {+0.386758f, -0.005894f, +0.001482f}, + {+0.257252f, -0.028247f, +0.020221f}, + {+0.085717f, -0.129404f, +0.017522f}, + {+0.193627f, -0.014561f, +0.008640f}, + {+0.242915f, -0.031396f, +0.002633f} + }, + { + {+0.585900f, -0.077367f, -0.015045f}, + {-0.286286f, +0.097252f, -0.041512f}, + {+0.619979f, -0.049713f, +0.009170f}, + {+1.849971f, -0.189063f, -0.000469f}, + {-0.024241f, -0.256635f, +0.018398f}, + {+1.888056f, -0.137439f, -0.034575f}, + {-0.026389f, -0.146816f, -0.054608f}, + {+1.430514f, -0.025065f, -0.047865f}, + {-0.015954f, -0.090459f, -0.044119f}, + {-0.184491f, +0.004971f, +0.018816f}, + {+0.367403f, +0.037464f, -0.007579f}, + {+0.235707f, +0.030441f, +0.004150f}, + {-0.017983f, +0.089824f, -0.035056f}, + {+0.295835f, -0.004981f, -0.008543f}, + {+0.243126f, +0.012530f, -0.011942f} + }, + { + {+0.665250f, +0.043970f, +0.015531f}, + {-0.322996f, +0.149054f, -0.019252f}, + {+0.580264f, -0.030849f, +0.024350f}, + {+2.005200f, -0.021439f, +0.029304f}, + {+0.113598f, -0.012581f, +0.077394f}, + {+2.158987f, +0.088276f, -0.003861f}, + {+0.010436f, +0.101090f, +0.035256f}, + {+1.711090f, +0.135561f, -0.041164f}, + {+0.012628f, +0.118154f, +0.035793f}, + {-0.193848f, -0.021279f, +0.007900f}, + {+0.249509f, -0.036318f, -0.011041f}, + {+0.339148f, +0.023808f, -0.014106f}, + {-0.086761f, +0.034113f, -0.037672f}, + {+0.464823f, +0.051589f, -0.014718f}, + {+0.093926f, -0.023588f, +0.006999f} + }, + { + {+0.660761f, +0.042611f, +0.015736f}, + {-0.232991f, -0.119769f, +0.069682f}, + {+0.490072f, +0.069493f, +0.007458f}, + {+1.741681f, +0.183508f, -0.002008f}, + {+0.111516f, +0.167908f, +0.006525f}, + {+2.068520f, +0.072175f, +0.012737f}, + {+0.017775f, +0.088998f, +0.033186f}, + {+1.743717f, -0.055334f, +0.020118f}, + {+0.008321f, +0.149997f, +0.022551f}, + {-0.215009f, +0.005025f, +0.002907f}, + {+0.113469f, +0.022908f, -0.008746f}, + {+0.555173f, -0.080542f, -0.013610f}, + {-0.050942f, -0.083131f, -0.004389f}, + {+0.671639f, -0.073125f, -0.004515f}, + {-0.109620f, +0.081521f, +0.008758f} + }, + { + {+0.580314f, -0.054424f, -0.004509f}, + {-0.081293f, -0.137373f, +0.044029f}, + {+0.463983f, -0.014407f, -0.011338f}, + {+1.169198f, -0.169394f, -0.027703f}, + {+0.010292f, -0.029514f, -0.042304f}, + {+1.586881f, -0.186952f, +0.000592f}, + {-0.003477f, -0.054254f, -0.016928f}, + {+1.413673f, -0.186454f, +0.025413f}, + {-0.014733f, -0.018568f, -0.041380f}, + {-0.240996f, -0.010303f, +0.004071f}, + {+0.012903f, -0.004127f, -0.003906f}, + {+0.797681f, +0.082346f, +0.001667f}, + {+0.035386f, +0.053069f, +0.022651f}, + {+0.837236f, +0.024942f, +0.000978f}, + {-0.233902f, -0.047392f, -0.015538f} + }, + { + {+0.487007f, +0.016249f, -0.011560f}, + {+0.131946f, +0.108933f, -0.083894f}, + {+0.605422f, -0.050044f, -0.018024f}, + {+0.528861f, +0.124876f, -0.022752f}, + {-0.076271f, -0.058690f, -0.007472f}, + {+0.878847f, +0.205138f, -0.018250f}, + {-0.013401f, -0.021368f, -0.024064f}, + {+0.787884f, +0.241841f, -0.026493f}, + {-0.001043f, -0.119442f, -0.002181f}, + {-0.248907f, +0.006659f, -0.000113f}, + {-0.047227f, -0.004224f, +0.002439f}, + {+0.944135f, -0.011491f, +0.008745f}, + {+0.073996f, +0.013124f, +0.028741f}, + {+0.883681f, +0.012426f, -0.004374f}, + {-0.190006f, -0.056489f, -0.021766f} + }, + { + {+0.447938f, +0.026156f, -0.000247f}, + {+0.405969f, +0.226903f, -0.097206f}, + {+0.921105f, +0.112177f, -0.013995f}, + {+0.037993f, -0.046160f, -0.007721f}, + {-0.090253f, -0.009755f, +0.013084f}, + {+0.202227f, -0.127508f, -0.025725f}, + {-0.002415f, +0.053658f, +0.001011f}, + {+0.093735f, -0.101919f, -0.033415f}, + {+0.013671f, -0.012260f, +0.038128f}, + {-0.215815f, +0.021644f, -0.000381f}, + {-0.097438f, -0.004101f, +0.007694f}, + {+0.915214f, -0.057119f, -0.002700f}, + {+0.026266f, -0.083884f, +0.006535f}, + {+0.783545f, -0.039342f, -0.005531f}, + {-0.014409f, +0.106024f, +0.002229f} + }, + { + {+0.502937f, -0.043296f, +0.016942f}, + {+0.562721f, -0.271269f, +0.047991f}, + {+1.294879f, -0.099867f, -0.004459f}, + {-0.208511f, -0.020811f, +0.014857f}, + {-0.031898f, +0.012336f, -0.012314f}, + {-0.243172f, +0.002723f, -0.005736f}, + {+0.012118f, -0.016031f, +0.023545f}, + {-0.466228f, +0.038982f, +0.006490f}, + {-0.005049f, +0.125222f, -0.014706f}, + {-0.140043f, -0.033646f, +0.007426f}, + {-0.166118f, +0.020933f, +0.009093f}, + {+0.720723f, +0.081983f, -0.019142f}, + {-0.048205f, +0.058271f, -0.028029f}, + {+0.563027f, +0.072436f, -0.008261f}, + {+0.155323f, -0.047908f, +0.024506f} + }, + { + {+0.665302f, +0.025328f, +0.018664f}, + {+0.346717f, -0.146678f, +0.128633f}, + {+1.538661f, +0.020131f, -0.007519f}, + {-0.254940f, +0.020497f, +0.029909f}, + {+0.057374f, +0.076254f, -0.009097f}, + {-0.419513f, +0.042371f, +0.027848f}, + {+0.004959f, -0.067560f, +0.005746f}, + {-0.808913f, -0.036603f, +0.026731f}, + {-0.010252f, +0.088264f, -0.028280f}, + {-0.037018f, +0.017759f, +0.010413f}, + {-0.247264f, -0.028052f, +0.006187f}, + {+0.433078f, -0.054258f, -0.021327f}, + {-0.060240f, +0.049926f, -0.029266f}, + {+0.287834f, -0.063180f, -0.013153f}, + {+0.195525f, -0.046783f, +0.017995f} + }, + { + {+0.939196f, -0.019336f, -0.005463f}, + {-0.212769f, +0.425049f, +0.027769f}, + {+1.506310f, +0.042304f, -0.013085f}, + {-0.199749f, +0.009650f, +0.022317f}, + {+0.097198f, -0.040503f, +0.027506f}, + {-0.419039f, -0.009501f, +0.039624f}, + {-0.010773f, +0.015875f, -0.022610f}, + {-0.938023f, +0.007493f, +0.025082f}, + {+0.009683f, -0.056906f, +0.027608f}, + {+0.082675f, -0.002912f, +0.000293f}, + {-0.294888f, +0.009081f, +0.003714f}, + {+0.126495f, +0.024788f, -0.002184f}, + {-0.000563f, -0.091941f, +0.008199f}, + {+0.025925f, +0.024934f, -0.004698f}, + {+0.095176f, +0.081798f, -0.006897f} + }, + { + {+1.307210f, +0.059238f, -0.036759f}, + {-0.701719f, -0.197323f, -0.097152f}, + {+1.158895f, -0.116341f, -0.011892f}, + {-0.111036f, -0.024935f, -0.003673f}, + {+0.038869f, -0.081096f, +0.026731f}, + {-0.346534f, -0.036837f, +0.017249f}, + {-0.005417f, +0.058202f, -0.006901f}, + {-0.904817f, +0.000980f, +0.015822f}, + {+0.003885f, -0.099089f, +0.010285f}, + {+0.218266f, +0.018411f, -0.013033f}, + {-0.250498f, +0.017459f, +0.003023f}, + {-0.162010f, -0.044649f, +0.016738f}, + {+0.053818f, +0.015747f, +0.035387f}, + {-0.189698f, -0.017096f, +0.012923f}, + {-0.051528f, -0.041975f, -0.022436f} + }, + { + {+1.684359f, -0.120864f, -0.039343f}, + {-0.694634f, -0.219873f, -0.083472f}, + {+0.561143f, +0.176993f, -0.020577f}, + {-0.012692f, -0.018982f, -0.021456f}, + {-0.062577f, +0.108567f, -0.021231f}, + {-0.247732f, +0.019366f, -0.017116f}, + {+0.008198f, -0.015667f, +0.017857f}, + {-0.771969f, -0.012422f, -0.001228f}, + {-0.009519f, -0.000576f, -0.026702f}, + {+0.359359f, -0.049355f, -0.011943f}, + {-0.085011f, -0.036208f, -0.003034f}, + {-0.415529f, +0.073749f, +0.012774f}, + {+0.038205f, +0.086506f, +0.013225f}, + {-0.355882f, +0.046916f, +0.014863f}, + {-0.135129f, -0.031402f, -0.011451f} + }, + { + {+1.900568f, +0.091345f, -0.005709f}, + {-0.182498f, +0.322121f, +0.010241f}, + {-0.155864f, -0.137867f, -0.022653f}, + {+0.068478f, +0.049489f, -0.012186f}, + {-0.096194f, +0.031052f, -0.043575f}, + {-0.135982f, +0.042247f, -0.027610f}, + {+0.005906f, -0.039669f, +0.008576f}, + {-0.604694f, +0.032060f, -0.015018f}, + {+0.000506f, +0.073299f, +0.001993f}, + {+0.466765f, +0.037005f, +0.000603f}, + {+0.170610f, +0.053310f, -0.014928f}, + {-0.607218f, -0.049464f, -0.002105f}, + {-0.020209f, -0.054297f, -0.025128f}, + {-0.466284f, -0.037251f, +0.001009f}, + {-0.116376f, +0.048662f, +0.012616f} + }, + { + {+1.770925f, +0.083983f, +0.013377f}, + {+0.429851f, -0.176382f, +0.062340f}, + {-0.869796f, +0.077488f, +0.009019f}, + {+0.071054f, -0.018359f, +0.008061f}, + {-0.023705f, -0.132726f, +0.001520f}, + {-0.064177f, -0.056856f, -0.008916f}, + {-0.005806f, +0.025219f, -0.013189f}, + {-0.490397f, -0.047115f, -0.010762f}, + {+0.007860f, +0.019424f, +0.021845f}, + {+0.489851f, +0.015745f, +0.003572f}, + {+0.419019f, -0.069347f, -0.017210f}, + {-0.713268f, -0.002485f, -0.003409f}, + {-0.045070f, -0.044848f, -0.021676f}, + {-0.509375f, -0.004583f, -0.004560f}, + {-0.035895f, -0.001305f, +0.014503f} + }, + { + {+1.234486f, -0.230526f, -0.013903f}, + {+0.693452f, -0.037094f, +0.062983f}, + {-1.509974f, -0.095909f, +0.045554f}, + {-0.063361f, -0.057443f, +0.014041f}, + {+0.065406f, +0.021175f, +0.038088f}, + {-0.130515f, -0.002472f, +0.015272f}, + {-0.006221f, +0.032188f, -0.009996f}, + {-0.526438f, +0.016690f, +0.014095f}, + {-0.003344f, -0.063567f, -0.009796f}, + {+0.408227f, -0.051840f, -0.007626f}, + {+0.526046f, +0.043848f, +0.000937f}, + {-0.746530f, +0.019915f, +0.007159f}, + {-0.015404f, +0.050106f, +0.006338f}, + {-0.498282f, +0.022806f, +0.001661f}, + {+0.046692f, -0.012083f, -0.005406f} + }, + { + {+0.413311f, +0.217489f, -0.041553f}, + {+0.452282f, +0.255112f, +0.014429f}, + {-2.012329f, +0.132335f, +0.043582f}, + {-0.332659f, +0.110420f, -0.002506f}, + {+0.074513f, +0.072299f, +0.015550f}, + {-0.402227f, +0.102426f, +0.020003f}, + {+0.003936f, -0.025615f, +0.009662f}, + {-0.764317f, +0.087727f, +0.028390f}, + {-0.005906f, -0.045668f, -0.016305f}, + {+0.244099f, +0.046208f, -0.016359f}, + {+0.392194f, +0.052051f, +0.019617f}, + {-0.755240f, -0.000320f, +0.012387f}, + {+0.024888f, -0.005926f, +0.015739f}, + {-0.475719f, -0.010639f, +0.007195f}, + {+0.094368f, -0.019071f, -0.011155f} + }, + { + {-0.488601f, -0.132632f, -0.024105f}, + {-0.057870f, -0.243239f, -0.062681f}, + {-2.274488f, -0.075449f, +0.013122f}, + {-0.656336f, -0.066528f, -0.012634f}, + {+0.011058f, -0.050520f, -0.013955f}, + {-0.835078f, -0.150132f, +0.002332f}, + {+0.005934f, -0.022059f, +0.010016f}, + {-1.137939f, -0.147396f, +0.009474f}, + {+0.005755f, +0.039696f, +0.016335f}, + {+0.033530f, -0.028665f, -0.010546f}, + {+0.040220f, -0.141448f, +0.012427f}, + {-0.787271f, -0.022176f, +0.007828f}, + {+0.032441f, -0.020084f, +0.008702f}, + {-0.488631f, -0.013600f, +0.006335f}, + {+0.087182f, +0.017541f, +0.004303f} + }, + { + {-1.317702f, +0.095500f, +0.020761f}, + {-0.422081f, -0.034137f, -0.071137f}, + {-2.203521f, -0.058245f, -0.003414f}, + {-0.931858f, +0.015280f, +0.003861f}, + {-0.052621f, +0.004576f, -0.018473f}, + {-1.272381f, +0.091261f, -0.008863f}, + {-0.002030f, +0.024082f, -0.005542f}, + {-1.464630f, +0.073632f, -0.010550f}, + {+0.002712f, +0.062669f, +0.007167f}, + {-0.207114f, +0.038969f, +0.000934f}, + {-0.358809f, +0.117636f, -0.007999f}, + {-0.860245f, +0.028784f, +0.001523f}, + {+0.004125f, +0.030753f, -0.001828f}, + {-0.559354f, +0.029835f, +0.002076f}, + {+0.024576f, +0.027986f, +0.012469f} + }, + { + {-2.008348f, -0.127817f, +0.044194f}, + {-0.418471f, +0.201485f, +0.007778f}, + {-1.812974f, +0.155663f, +0.007154f}, + {-1.102120f, -0.021886f, +0.016993f}, + {-0.057302f, +0.036339f, -0.006424f}, + {-1.547365f, -0.012691f, +0.000618f}, + {-0.005724f, +0.008422f, -0.010341f}, + {-1.565942f, +0.034074f, -0.005038f}, + {-0.006455f, -0.004146f, -0.018260f}, + {-0.486122f, -0.068751f, +0.002643f}, + {-0.579626f, -0.009666f, -0.011630f}, + {-0.959883f, -0.022711f, -0.000128f}, + {-0.026165f, -0.017444f, -0.012012f}, + {-0.674369f, -0.030241f, +0.000001f}, + {-0.056604f, -0.047916f, +0.000561f} + }, + { + {-2.538435f, +0.144706f, +0.024837f}, + {-0.159097f, -0.096628f, +0.059657f}, + {-1.250993f, -0.158194f, +0.023835f}, + {-1.162308f, +0.024647f, +0.006024f}, + {-0.006764f, -0.032281f, +0.006504f}, + {-1.594186f, -0.024116f, +0.007975f}, + {+0.000404f, -0.028253f, +0.001927f}, + {-1.392818f, -0.090743f, +0.008086f}, + {+0.000657f, -0.056720f, +0.002178f}, + {-0.817812f, +0.078885f, -0.002734f}, + {-0.494314f, -0.073869f, -0.002863f}, + {-1.057861f, +0.010753f, +0.003473f}, + {-0.023969f, -0.022152f, -0.011768f}, + {-0.796320f, +0.019685f, +0.002381f}, + {-0.095452f, +0.011842f, -0.013010f} + }, + { + {-2.880650f, -0.045850f, +0.004655f}, + {+0.106795f, -0.039907f, +0.027045f}, + {-0.721393f, +0.083054f, +0.023238f}, + {-1.144586f, +0.016922f, -0.005027f}, + {+0.042055f, +0.002949f, +0.007039f}, + {-1.472334f, +0.053024f, +0.006261f}, + {+0.005806f, +0.000220f, +0.011669f}, + {-1.046507f, +0.096909f, +0.011310f}, + {+0.005526f, -0.021552f, +0.015425f}, + {-1.200656f, -0.053185f, +0.005988f}, + {-0.155057f, +0.102897f, -0.003142f}, + {-1.124901f, +0.007015f, +0.012676f}, + {+0.006479f, +0.042956f, +0.004210f}, + {-0.881942f, -0.000382f, +0.009400f}, + {-0.059027f, +0.036093f, -0.011452f} + }, + { + {-2.993706f, -0.110593f, +0.045578f}, + {+0.224391f, +0.041990f, -0.020747f}, + {-0.361837f, -0.012427f, +0.003973f}, + {-1.101737f, -0.064487f, +0.013918f}, + {+0.045047f, -0.001977f, +0.008463f}, + {-1.308903f, -0.082749f, +0.021321f}, + {+0.000463f, +0.034652f, -0.000132f}, + {-0.703438f, -0.078332f, +0.012588f}, + {-0.003389f, +0.043762f, -0.009812f}, + {-1.588540f, +0.021143f, +0.042305f}, + {+0.239986f, -0.105459f, -0.004102f}, + {-1.125952f, -0.020862f, +0.025801f}, + {+0.026945f, -0.008249f, +0.018680f}, + {-0.890391f, -0.016459f, +0.018642f}, + {+0.022025f, -0.049645f, +0.002105f} + }, + { + {-2.824141f, +0.108294f, +0.112373f}, + {+0.184642f, +0.006802f, -0.019893f}, + {-0.177062f, -0.000542f, -0.012326f}, + {-1.063372f, +0.044524f, +0.052246f}, + {+0.005984f, -0.027278f, +0.011800f}, + {-1.193252f, +0.058807f, +0.059389f}, + {-0.005976f, -0.002554f, -0.013353f}, + {-0.495849f, +0.044280f, +0.026054f}, + {-0.003278f, +0.045530f, -0.008896f}, + {-1.855139f, -0.040262f, +0.076546f}, + {+0.460259f, +0.060818f, +0.014226f}, + {-1.010339f, +0.013540f, +0.027012f}, + {+0.012571f, -0.046709f, +0.009176f}, + {-0.784673f, +0.018290f, +0.018712f}, + {+0.077774f, +0.022052f, +0.016078f} + }, + { + {-2.286989f, +0.059395f, +0.067545f}, + {+0.059196f, +0.003929f, +0.008106f}, + {-0.077852f, -0.011911f, -0.015109f}, + {-0.981039f, +0.057579f, +0.049746f}, + {-0.039545f, +0.079788f, -0.017441f}, + {-1.084454f, +0.063736f, +0.061257f}, + {-0.000552f, -0.040433f, -0.000008f}, + {-0.422723f, +0.031129f, +0.033909f}, + {+0.005181f, -0.015769f, +0.014975f}, + {-1.799579f, +0.095052f, +0.039004f}, + {+0.383208f, +0.054815f, +0.035686f}, + {-0.724847f, -0.012085f, -0.002971f}, + {-0.017405f, +0.047597f, -0.018931f}, + {-0.541913f, -0.020736f, -0.002764f}, + {+0.062036f, +0.032573f, +0.017405f} + }, + { + {-1.308363f, -0.023329f, -0.117920f}, + {-0.064424f, -0.057972f, +0.008713f}, + {+0.024978f, +0.018940f, -0.017833f}, + {-0.737327f, -0.102713f, -0.037075f}, + {-0.041409f, +0.034359f, -0.040056f}, + {-0.825854f, -0.147637f, -0.040942f}, + {+0.006532f, +0.001549f, +0.015583f}, + {-0.359121f, -0.115224f, -0.014199f}, + {-0.000538f, -0.057178f, -0.001505f}, + {-1.260099f, -0.008685f, -0.083395f}, + {+0.084870f, -0.184426f, +0.013420f}, + {-0.269401f, +0.076797f, -0.047683f}, + {-0.022016f, +0.040907f, -0.022277f}, + {-0.184013f, +0.067855f, -0.031593f}, + {-0.006094f, -0.075725f, -0.005918f} + }, + { + {-0.005286f, -0.490452f, -0.194448f}, + {-0.117167f, +0.041377f, -0.021705f}, + {+0.155198f, -0.050711f, -0.018485f}, + {-0.261721f, -0.126923f, -0.117957f}, + {+0.015691f, -0.177032f, +0.028815f}, + {-0.297654f, -0.116815f, -0.152479f}, + {-0.001443f, +0.059448f, -0.006308f}, + {-0.164335f, +0.005438f, -0.094020f}, + {-0.004210f, -0.031336f, -0.011520f}, + {-0.306030f, -0.376503f, -0.134389f}, + {-0.203847f, +0.164839f, -0.058303f}, + {+0.241259f, -0.209968f, -0.039860f}, + {+0.006748f, -0.086010f, +0.020030f}, + {+0.191475f, -0.147918f, -0.022810f}, + {-0.057865f, +0.023108f, -0.033416f} + }, + { + {+1.157381f, +0.858247f, +0.080234f}, + {-0.073701f, +0.086750f, -0.017560f}, + {+0.264439f, +0.078190f, +0.005441f}, + {+0.322579f, +0.471662f, -0.015999f}, + {+0.042456f, -0.106574f, +0.053490f}, + {+0.387873f, +0.592479f, -0.033125f}, + {-0.005002f, +0.040697f, -0.013144f}, + {+0.175212f, +0.327771f, -0.050066f}, + {+0.003996f, +0.027493f, +0.012375f}, + {+0.660959f, +0.665150f, +0.060775f}, + {-0.266658f, +0.119865f, -0.073006f}, + {+0.590790f, +0.209203f, +0.049770f}, + {+0.019457f, -0.064679f, +0.026033f}, + {+0.430095f, +0.124670f, +0.034507f}, + {-0.039846f, +0.104179f, -0.009259f} + }, + { + {+1.530494f, +0.036774f, +0.350316f}, + {+0.015367f, -0.099705f, +0.036338f}, + {+0.277896f, -0.003918f, +0.035655f}, + {+0.682415f, -0.226467f, +0.187620f}, + {-0.003804f, +0.159634f, -0.044149f}, + {+0.834371f, -0.332024f, +0.240896f}, + {+0.004102f, -0.024392f, +0.012576f}, + {+0.464117f, -0.301330f, +0.133821f}, + {-0.000994f, +0.060943f, -0.002091f}, + {+1.074692f, -0.033490f, +0.268560f}, + {-0.094158f, -0.316746f, +0.050929f}, + {+0.591353f, +0.126955f, +0.093164f}, + {-0.002143f, +0.070225f, -0.023541f}, + {+0.415721f, +0.099070f, +0.055525f}, + {+0.014835f, -0.051686f, +0.039038f} + }, + { + {+0.871819f, -1.450842f, -0.069675f}, + {+0.047807f, -0.115000f, +0.024628f}, + {+0.169285f, -0.151101f, +0.004566f}, + {+0.527658f, -0.674417f, +0.060727f}, + {-0.014797f, +0.200909f, -0.018973f}, + {+0.652333f, -0.864218f, +0.089751f}, + {+0.000099f, -0.058315f, -0.002464f}, + {+0.421733f, -0.443065f, +0.098482f}, + {-0.001060f, +0.060127f, -0.001254f}, + {+0.675379f, -1.072888f, -0.031008f}, + {+0.075732f, -0.083156f, +0.106738f}, + {+0.270175f, -0.451499f, -0.058713f}, + {-0.006396f, +0.098834f, -0.007631f}, + {+0.187943f, -0.284727f, -0.042036f}, + {+0.025847f, -0.121016f, +0.008121f} + } +}; + +const float leftHRIRImag[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS]= +{ + { + {+0.009746f, +0.032135f, -0.001005f}, + {-0.252426f, +0.362976f, -0.101272f}, + {-0.041389f, +0.219559f, -0.075244f}, + {+0.021832f, -0.202850f, +0.068670f}, + {-0.199783f, +0.476644f, -0.136155f}, + {+0.021343f, -0.250501f, +0.092969f}, + {-0.094399f, +0.626886f, -0.231894f}, + {+0.016573f, -0.239649f, +0.093367f}, + {-0.080197f, +0.572932f, -0.224147f}, + {+0.019084f, +0.136843f, -0.058073f}, + {-0.223408f, +0.321501f, -0.094987f}, + {-0.001692f, -0.041298f, +0.024983f}, + {-0.193077f, +0.654617f, -0.206180f}, + {-0.024623f, -0.055420f, +0.031858f}, + {-0.259689f, +0.369748f, -0.091616f} + }, + { + {+0.057589f, -0.094837f, -0.050323f}, + {-0.568159f, +0.333352f, -0.050823f}, + {-0.058363f, +0.033201f, -0.148437f}, + {-0.050666f, -0.220071f, +0.062671f}, + {-0.336362f, +0.338097f, -0.146507f}, + {-0.047671f, -0.288102f, +0.082913f}, + {-0.060818f, +0.867063f, -0.135030f}, + {-0.040486f, -0.341719f, +0.058177f}, + {-0.016662f, +1.031577f, -0.040322f}, + {+0.086011f, +0.193655f, -0.051669f}, + {-0.504799f, +0.424764f, +0.012327f}, + {-0.040577f, -0.173098f, -0.025333f}, + {-0.288338f, +0.471356f, -0.244582f}, + {-0.107401f, -0.185766f, -0.009351f}, + {-0.537558f, +0.205535f, -0.090137f} + }, + { + {+0.185461f, -0.259517f, -0.028611f}, + {-0.603783f, +0.016898f, +0.088263f}, + {+0.085783f, -0.585360f, +0.077994f}, + {-0.275727f, +0.151657f, -0.034942f}, + {-0.098432f, -0.240320f, +0.014376f}, + {-0.224813f, +0.096682f, -0.029791f}, + {+0.091867f, -0.134897f, +0.226004f}, + {-0.160867f, +0.120802f, -0.107958f}, + {+0.091102f, +0.252623f, +0.260884f}, + {+0.148482f, -0.127157f, +0.066761f}, + {-0.648021f, +0.366402f, +0.053859f}, + {-0.086806f, -0.182923f, -0.027078f}, + {+0.006657f, -0.551679f, +0.076549f}, + {-0.187386f, -0.124531f, -0.027416f}, + {-0.394359f, -0.137418f, +0.015442f} + }, + { + {+0.295099f, +0.204033f, +0.112117f}, + {-0.445141f, -0.203431f, -0.037600f}, + {+0.185293f, -0.198122f, +0.212327f}, + {-0.499831f, -0.001755f, -0.037616f}, + {+0.201802f, +0.127793f, +0.061482f}, + {-0.355382f, +0.059109f, -0.008126f}, + {+0.032573f, -0.572286f, +0.052378f}, + {-0.197342f, +0.235689f, -0.052018f}, + {-0.044020f, -0.726248f, -0.126557f}, + {+0.088356f, -0.356045f, -0.015711f}, + {-0.637301f, +0.225391f, -0.013606f}, + {-0.172744f, -0.022208f, +0.050545f}, + {+0.255444f, -0.000553f, +0.210836f}, + {-0.269532f, +0.005153f, +0.038296f}, + {-0.000691f, +0.123680f, +0.022293f} + }, + { + {+0.201556f, +0.345365f, +0.086457f}, + {-0.034797f, -0.385321f, -0.036494f}, + {+0.060960f, +0.460193f, -0.040799f}, + {-0.614672f, -0.046146f, -0.003786f}, + {+0.291890f, -0.017826f, +0.107892f}, + {-0.394941f, -0.025263f, +0.024793f}, + {-0.069383f, +0.071169f, -0.167274f}, + {-0.193963f, -0.007123f, +0.041127f}, + {-0.053934f, -0.644582f, -0.152850f}, + {+0.018473f, -0.189563f, -0.064795f}, + {-0.422552f, +0.101268f, +0.008593f}, + {-0.373705f, +0.214293f, -0.005754f}, + {+0.164459f, +0.445370f, +0.061512f}, + {-0.430525f, +0.157644f, +0.002400f}, + {+0.371780f, -0.112349f, +0.034345f} + }, + { + {-0.033928f, -0.466322f, -0.173216f}, + {+0.416182f, -0.095722f, -0.007744f}, + {-0.106258f, +0.101293f, -0.149492f}, + {-0.586638f, +0.109680f, +0.043164f}, + {+0.055241f, -0.502163f, -0.010316f}, + {-0.347625f, +0.011068f, +0.020946f}, + {-0.029521f, +0.389459f, -0.043642f}, + {-0.208450f, -0.113945f, +0.001564f}, + {+0.069354f, +0.253582f, +0.197218f}, + {+0.011284f, -0.023345f, +0.010578f}, + {-0.100593f, +0.188326f, -0.015623f}, + {-0.565508f, +0.009708f, -0.043984f}, + {-0.116804f, -0.258300f, -0.124299f}, + {-0.599852f, +0.019181f, -0.018817f}, + {+0.455115f, -0.088408f, +0.031182f} + }, + { + {-0.101926f, -0.468060f, -0.163914f}, + {+0.654728f, -0.125950f, -0.057210f}, + {-0.210669f, -0.374096f, +0.059232f}, + {-0.486236f, +0.078621f, +0.035746f}, + {-0.221043f, +0.001447f, -0.140044f}, + {-0.251634f, +0.002394f, +0.006412f}, + {+0.053275f, -0.117460f, +0.128891f}, + {-0.195937f, +0.017044f, -0.045101f}, + {+0.004540f, +0.716656f, +0.012490f}, + {-0.023876f, +0.086943f, -0.041043f}, + {+0.269818f, -0.023344f, +0.001404f}, + {-0.632528f, -0.064904f, +0.001583f}, + {-0.229349f, -0.155556f, -0.131557f}, + {-0.701220f, +0.002936f, +0.011380f}, + {+0.218817f, +0.137571f, -0.000827f} + }, + { + {-0.019803f, +0.350390f, +0.128080f}, + {+0.607297f, +0.091323f, +0.041776f}, + {-0.391531f, -0.296612f, +0.114777f}, + {-0.374457f, -0.035043f, -0.027502f}, + {-0.213069f, +0.267362f, -0.038309f}, + {-0.149953f, +0.004022f, -0.006847f}, + {+0.031530f, -0.308567f, +0.054617f}, + {-0.130768f, +0.112539f, -0.020612f}, + {-0.060647f, +0.237990f, -0.169946f}, + {-0.070530f, +0.176350f, -0.003859f}, + {+0.554477f, +0.122937f, +0.003398f}, + {-0.576269f, +0.024040f, +0.021559f}, + {-0.052411f, +0.382981f, +0.023069f}, + {-0.712362f, -0.021407f, +0.002869f}, + {-0.136160f, -0.144065f, -0.033829f} + }, + { + {-0.144775f, +0.366539f, +0.125312f}, + {+0.202885f, +0.354603f, +0.019837f}, + {-0.656706f, +0.285160f, -0.069621f}, + {-0.236700f, -0.120155f, -0.015090f}, + {-0.009022f, -0.142351f, +0.058751f}, + {-0.065125f, -0.004127f, -0.017607f}, + {-0.041823f, +0.131862f, -0.096368f}, + {-0.062407f, -0.054740f, +0.027981f}, + {+0.031817f, -0.431640f, +0.092903f}, + {-0.213850f, +0.126299f, +0.042829f}, + {+0.663648f, +0.083368f, +0.001657f}, + {-0.446160f, +0.001760f, +0.001401f}, + {+0.168107f, -0.041019f, +0.123804f}, + {-0.618696f, -0.035619f, -0.011711f}, + {-0.359231f, -0.037169f, -0.034599f} + }, + { + {-0.517408f, -0.311914f, -0.066345f}, + {-0.315897f, -0.116498f, -0.057578f}, + {-0.808547f, +0.208921f, -0.065451f}, + {-0.108486f, +0.036464f, +0.025206f}, + {+0.164991f, +0.012492f, +0.077849f}, + {-0.006924f, +0.066595f, -0.001710f}, + {-0.032037f, +0.236625f, -0.053914f}, + {-0.081416f, -0.127101f, -0.000295f}, + {+0.030739f, -0.432245f, +0.086307f}, + {-0.483248f, -0.169301f, -0.023816f}, + {+0.563338f, -0.042869f, -0.028584f}, + {-0.307294f, +0.056650f, -0.003561f}, + {+0.161044f, -0.238438f, +0.047974f}, + {-0.457444f, +0.096629f, +0.009126f}, + {-0.321523f, +0.137994f, +0.021609f} + }, + { + {-0.892316f, -0.064427f, -0.076962f}, + {-0.605373f, -0.061921f, -0.015945f}, + {-0.844181f, -0.108187f, +0.060583f}, + {-0.056134f, +0.102552f, -0.013769f}, + {+0.147378f, +0.251909f, -0.002167f}, + {-0.012891f, +0.033628f, +0.010795f}, + {+0.030720f, -0.133909f, +0.071835f}, + {-0.195165f, -0.000390f, -0.029825f}, + {-0.039999f, +0.087749f, -0.113515f}, + {-0.741169f, -0.000583f, -0.039531f}, + {+0.318943f, +0.044776f, -0.017514f}, + {-0.221333f, -0.019419f, +0.013435f}, + {-0.025961f, +0.151539f, -0.045602f}, + {-0.317124f, +0.007329f, +0.019107f}, + {-0.103050f, -0.017712f, +0.036895f} + }, + { + {-1.120903f, +0.080144f, +0.018175f}, + {-0.557984f, +0.065875f, +0.016445f}, + {-0.884231f, -0.135269f, +0.046808f}, + {-0.077929f, +0.058728f, -0.030673f}, + {+0.003216f, -0.028481f, -0.075145f}, + {-0.115087f, -0.059276f, -0.010281f}, + {+0.033662f, -0.151371f, +0.062117f}, + {-0.374813f, +0.000125f, +0.004524f}, + {-0.004131f, +0.344596f, -0.009515f}, + {-0.912750f, +0.037851f, +0.003038f}, + {-0.004833f, -0.037361f, +0.004495f}, + {-0.220544f, -0.058016f, +0.001506f}, + {-0.163112f, -0.012573f, -0.067595f}, + {-0.259778f, -0.046839f, -0.011680f}, + {+0.140668f, -0.036371f, -0.019325f} + }, + { + {-1.221626f, +0.047632f, +0.030008f}, + {-0.246497f, -0.109675f, +0.016140f}, + {-0.933392f, +0.056681f, -0.017499f}, + {-0.171095f, -0.041605f, +0.026621f}, + {-0.091651f, -0.139042f, -0.010254f}, + {-0.290514f, +0.010188f, -0.006824f}, + {-0.022645f, +0.182086f, -0.051792f}, + {-0.627425f, +0.108951f, +0.002544f}, + {+0.030810f, +0.083175f, +0.086532f}, + {-1.020831f, +0.019057f, +0.020782f}, + {-0.328857f, +0.063032f, +0.021845f}, + {-0.280032f, +0.046473f, -0.028272f}, + {-0.108081f, -0.130444f, -0.042983f}, + {-0.277472f, -0.015706f, -0.019343f}, + {+0.300294f, -0.091279f, -0.028877f} + }, + { + {-1.261601f, +0.026191f, +0.017613f}, + {+0.131072f, +0.074700f, +0.013352f}, + {-0.941829f, +0.046886f, -0.012836f}, + {-0.353481f, -0.137929f, +0.022451f}, + {-0.099901f, +0.012862f, +0.045621f}, + {-0.510801f, -0.045980f, +0.009742f}, + {-0.034480f, +0.136115f, -0.065105f}, + {-0.917422f, -0.048406f, -0.014328f}, + {-0.008255f, -0.204740f, -0.025135f}, + {-1.116831f, -0.043151f, +0.008325f}, + {-0.570501f, -0.078591f, +0.011175f}, + {-0.356994f, +0.057193f, -0.012919f}, + {+0.072193f, +0.210025f, +0.034944f}, + {-0.354704f, +0.011735f, +0.004829f}, + {+0.288756f, +0.034341f, +0.021124f} + }, + { + {-1.310698f, +0.011707f, +0.036488f}, + {+0.375845f, -0.029667f, +0.011368f}, + {-0.895246f, -0.026384f, +0.007846f}, + {-0.539669f, +0.067904f, -0.021122f}, + {-0.049179f, +0.069581f, +0.012119f}, + {-0.731214f, +0.055761f, +0.008363f}, + {+0.015114f, -0.158721f, +0.035543f}, + {-1.186932f, -0.029288f, +0.024750f}, + {-0.020681f, -0.110429f, -0.057197f}, + {-1.242362f, +0.046396f, -0.006496f}, + {-0.638496f, -0.003542f, -0.003329f}, + {-0.460859f, +0.005487f, +0.022316f}, + {+0.162585f, +0.000949f, +0.094194f}, + {-0.480357f, +0.043083f, +0.013686f}, + {+0.084492f, +0.100943f, +0.035245f} + }, + { + {-1.388116f, -0.121591f, +0.007121f}, + {+0.406719f, -0.063903f, +0.000895f}, + {-0.797164f, +0.024786f, +0.007914f}, + {-0.611124f, +0.038377f, -0.017126f}, + {+0.031219f, -0.031898f, -0.043192f}, + {-0.880465f, -0.025975f, +0.004620f}, + {+0.035199f, -0.054815f, +0.069678f}, + {-1.404186f, -0.094670f, +0.041334f}, + {+0.011721f, +0.131907f, +0.033689f}, + {-1.400823f, +0.006498f, +0.005128f}, + {-0.488232f, +0.072899f, +0.000864f}, + {-0.620764f, -0.091278f, +0.009966f}, + {+0.048912f, -0.264371f, +0.026588f}, + {-0.612140f, -0.044609f, +0.004905f}, + {-0.190119f, -0.153548f, -0.003990f} + }, + { + {-1.405102f, +0.019830f, -0.041741f}, + {+0.269059f, +0.096072f, -0.030661f}, + {-0.666786f, -0.023527f, +0.003952f}, + {-0.530962f, -0.087680f, +0.015089f}, + {+0.103468f, -0.138650f, -0.020612f}, + {-0.902420f, -0.004413f, +0.001425f}, + {-0.007181f, +0.202330f, -0.016542f}, + {-1.502401f, +0.093998f, -0.011299f}, + {+0.015712f, +0.105410f, +0.042774f}, + {-1.569118f, +0.036845f, +0.024497f}, + {-0.172241f, -0.083614f, +0.002581f}, + {-0.803267f, +0.042103f, -0.008593f}, + {-0.122389f, +0.164027f, -0.092715f}, + {-0.693482f, +0.032583f, -0.008445f}, + {-0.336065f, +0.028532f, -0.040891f} + }, + { + {-1.274381f, +0.177341f, -0.005087f}, + {+0.082021f, +0.015295f, -0.029273f}, + {-0.535412f, +0.022470f, +0.000520f}, + {-0.334115f, +0.039818f, +0.029288f}, + {+0.102058f, +0.071973f, +0.060127f}, + {-0.777172f, +0.053097f, +0.001406f}, + {-0.041062f, +0.003639f, -0.089029f}, + {-1.386620f, +0.100585f, -0.027634f}, + {-0.016470f, -0.131625f, -0.046620f}, + {-1.702053f, -0.064478f, +0.010836f}, + {+0.188348f, +0.085604f, +0.000778f}, + {-0.951614f, -0.008596f, -0.000227f}, + {-0.128587f, +0.202289f, -0.078786f}, + {-0.684947f, +0.039724f, -0.008766f}, + {-0.238200f, +0.121028f, -0.027134f} + }, + { + {-1.051815f, -0.065291f, +0.046901f}, + {-0.078962f, -0.040667f, +0.016621f}, + {-0.425406f, -0.012300f, -0.003324f}, + {-0.085264f, +0.021495f, -0.004172f}, + {-0.013857f, +0.185133f, +0.044846f}, + {-0.536045f, -0.067146f, +0.005754f}, + {+0.008706f, -0.314572f, +0.024262f}, + {-1.076846f, -0.153133f, +0.012899f}, + {-0.009257f, -0.187894f, -0.025034f}, + {-1.728620f, -0.002351f, -0.006254f}, + {+0.453290f, -0.035443f, -0.000604f}, + {-1.033293f, +0.006471f, +0.006369f}, + {+0.028237f, -0.256334f, +0.056283f}, + {-0.592133f, -0.068085f, +0.014448f}, + {+0.028364f, -0.161171f, +0.022674f} + }, + { + {-0.850866f, -0.060081f, +0.012367f}, + {-0.209567f, -0.044476f, +0.035293f}, + {-0.352597f, +0.002936f, -0.009918f}, + {+0.156716f, +0.020900f, -0.046467f}, + {-0.139788f, -0.163686f, -0.057909f}, + {-0.265746f, +0.022469f, -0.007668f}, + {+0.041202f, -0.126721f, +0.092016f}, + {-0.719398f, +0.058103f, +0.026893f}, + {+0.020433f, +0.027610f, +0.057030f}, + {-1.617744f, +0.065441f, -0.000589f}, + {+0.529109f, -0.009487f, -0.002510f}, + {-1.030739f, +0.027576f, +0.012449f}, + {+0.126800f, -0.104142f, +0.086642f}, + {-0.469348f, +0.001329f, +0.019123f}, + {+0.254306f, +0.004748f, +0.039010f} + }, + { + {-0.704994f, -0.001857f, -0.032356f}, + {-0.291614f, +0.072045f, +0.008669f}, + {-0.330377f, -0.015398f, -0.008902f}, + {+0.305490f, -0.088217f, -0.038597f}, + {-0.118408f, -0.127022f, -0.077956f}, + {-0.076791f, -0.013279f, -0.031489f}, + {-0.013990f, +0.238166f, -0.042427f}, + {-0.466729f, +0.029245f, -0.006311f}, + {-0.000655f, +0.182834f, -0.002752f}, + {-1.412340f, -0.081834f, +0.017017f}, + {+0.413278f, +0.058930f, -0.004232f}, + {-0.948672f, -0.013302f, +0.015703f}, + {+0.059815f, +0.180823f, -0.005402f}, + {-0.353125f, +0.011691f, -0.002686f}, + {+0.280636f, +0.098387f, -0.001029f} + }, + { + {-0.612204f, +0.074957f, -0.016719f}, + {-0.282982f, -0.038705f, -0.033749f}, + {-0.367094f, +0.018672f, +0.009545f}, + {+0.225838f, +0.044458f, +0.015442f}, + {+0.043674f, +0.265484f, +0.033672f}, + {-0.080339f, +0.026791f, -0.023361f}, + {-0.031796f, +0.152994f, -0.068402f}, + {-0.414119f, -0.046068f, -0.045478f}, + {-0.018979f, +0.050781f, -0.052748f}, + {-1.197874f, +0.025145f, +0.019789f}, + {+0.184054f, -0.070437f, -0.009958f}, + {-0.806769f, -0.004366f, -0.003547f}, + {-0.059848f, -0.044696f, -0.055601f}, + {-0.243914f, +0.012959f, -0.017814f}, + {+0.123667f, -0.047399f, -0.021850f} + }, + { + {-0.590457f, -0.027426f, +0.018181f}, + {-0.153592f, -0.151600f, -0.017359f}, + {-0.453375f, +0.040800f, +0.019251f}, + {-0.185914f, +0.157884f, +0.040381f}, + {+0.150267f, +0.058092f, +0.087405f}, + {-0.370093f, +0.045367f, +0.013384f}, + {+0.012941f, -0.147200f, +0.041441f}, + {-0.596085f, -0.026446f, -0.026980f}, + {+0.009851f, -0.159545f, +0.028260f}, + {-1.036040f, +0.005581f, +0.001597f}, + {-0.043489f, +0.034739f, -0.009117f}, + {-0.624380f, -0.045262f, -0.019488f}, + {-0.094605f, -0.081505f, -0.032452f}, + {-0.149839f, -0.036428f, -0.016043f}, + {-0.090928f, +0.014499f, +0.000113f} + }, + { + {-0.648165f, -0.063534f, +0.014939f}, + {+0.052738f, +0.128373f, +0.055065f}, + {-0.535241f, -0.069858f, -0.003891f}, + {-0.862572f, -0.266262f, +0.001282f}, + {+0.080904f, -0.219110f, -0.004018f}, + {-0.953088f, -0.182441f, +0.026892f}, + {+0.021715f, -0.125505f, +0.042828f}, + {-1.016573f, -0.044623f, +0.035676f}, + {+0.012421f, -0.141361f, +0.034156f}, + {-0.924930f, +0.018852f, -0.007346f}, + {-0.187252f, -0.004255f, -0.001005f}, + {-0.455082f, +0.062356f, -0.011024f}, + {-0.020719f, +0.099660f, +0.014347f}, + {-0.108207f, +0.031087f, -0.001307f}, + {-0.233378f, -0.040900f, +0.007062f} + }, + { + {-0.738046f, +0.053142f, -0.010563f}, + {+0.226352f, +0.134898f, +0.027173f}, + {-0.525795f, -0.013450f, -0.023475f}, + {-1.543326f, +0.137991f, -0.026188f}, + {-0.054340f, +0.020378f, -0.061004f}, + {-1.676436f, +0.213947f, +0.006985f}, + {-0.007143f, +0.068869f, -0.026710f}, + {-1.624133f, +0.228046f, +0.038888f}, + {-0.014554f, +0.055501f, -0.041156f}, + {-0.831934f, -0.022901f, -0.002870f}, + {-0.232392f, -0.012564f, +0.005502f}, + {-0.389275f, -0.026324f, +0.006822f}, + {+0.065274f, -0.013643f, +0.033485f}, + {-0.174428f, +0.030208f, +0.007158f}, + {-0.220736f, +0.001711f, -0.013541f} + }, + { + {-0.781969f, +0.015664f, -0.013942f}, + {+0.331098f, -0.099058f, -0.081219f}, + {-0.399112f, +0.065288f, -0.017726f}, + {-1.960453f, -0.000653f, -0.004832f}, + {-0.109110f, +0.110856f, -0.010673f}, + {-2.276175f, -0.117004f, -0.008654f}, + {-0.015007f, +0.052007f, -0.026966f}, + {-2.233906f, -0.204725f, -0.015921f}, + {-0.004171f, +0.131564f, -0.010820f}, + {-0.729841f, +0.018581f, -0.003238f}, + {-0.215465f, +0.015363f, +0.009391f}, + {-0.496172f, -0.058743f, +0.011723f}, + {+0.069211f, -0.051734f, +0.019397f}, + {-0.371337f, -0.073601f, +0.000564f}, + {-0.059531f, +0.087080f, -0.014858f} + }, + { + {-0.738388f, -0.046375f, +0.001540f}, + {+0.371202f, -0.175497f, -0.069389f}, + {-0.243317f, -0.061346f, -0.005711f}, + {-2.013822f, -0.062939f, +0.018690f}, + {-0.062802f, -0.017672f, +0.025304f}, + {-2.537886f, -0.015602f, -0.003764f}, + {+0.000148f, -0.050504f, +0.007953f}, + {-2.599729f, -0.021614f, -0.019729f}, + {+0.014190f, -0.003088f, +0.039676f}, + {-0.608148f, -0.036370f, -0.003399f}, + {-0.186255f, -0.001947f, +0.009920f}, + {-0.764126f, +0.104237f, -0.001366f}, + {-0.003043f, +0.077274f, -0.008375f}, + {-0.653928f, +0.065157f, -0.001655f}, + {+0.136964f, -0.089478f, +0.011296f} + }, + { + {-0.620704f, +0.040857f, +0.012465f}, + {+0.253340f, +0.170035f, +0.072899f}, + {-0.210596f, +0.006273f, +0.005387f}, + {-1.779665f, +0.104163f, +0.030959f}, + {+0.024043f, -0.024581f, -0.001278f}, + {-2.419311f, +0.123795f, +0.018778f}, + {+0.012593f, +0.002121f, +0.023380f}, + {-2.610043f, +0.113399f, +0.029507f}, + {-0.001873f, -0.121782f, -0.005835f}, + {-0.480872f, +0.036381f, +0.002730f}, + {-0.167639f, -0.008441f, +0.006329f}, + {-1.096432f, -0.082483f, -0.012006f}, + {-0.066072f, -0.025598f, -0.031514f}, + {-0.939740f, -0.061596f, +0.000882f}, + {+0.224041f, -0.003983f, +0.025833f} + }, + { + {-0.474089f, -0.005093f, +0.005082f}, + {-0.114798f, +0.231748f, +0.119242f}, + {-0.429108f, +0.096054f, +0.004364f}, + {-1.434480f, -0.060092f, +0.030100f}, + {+0.087354f, -0.045661f, -0.007546f}, + {-2.057338f, -0.122529f, +0.040767f}, + {+0.004089f, +0.061414f, +0.003486f}, + {-2.339244f, -0.067656f, +0.043250f}, + {-0.012502f, -0.045235f, -0.034722f}, + {-0.374704f, -0.009361f, +0.003183f}, + {-0.141971f, +0.005629f, +0.000253f}, + {-1.378250f, +0.025851f, -0.005617f}, + {-0.048209f, -0.073759f, -0.019619f}, + {-1.150667f, +0.030632f, +0.000355f}, + {+0.144419f, +0.089299f, +0.008712f} + }, + { + {-0.348716f, -0.013477f, -0.018911f}, + {-0.562947f, -0.375237f, -0.012263f}, + {-0.909858f, -0.140937f, -0.002793f}, + {-1.133854f, +0.011460f, +0.009135f}, + {+0.076015f, +0.018412f, +0.022057f}, + {-1.657263f, +0.041045f, +0.032704f}, + {-0.011616f, -0.019120f, -0.023590f}, + {-1.929738f, +0.064243f, +0.020197f}, + {+0.007833f, +0.103215f, +0.022494f}, + {-0.304411f, -0.008931f, -0.007043f}, + {-0.070913f, +0.018250f, -0.003996f}, + {-1.543561f, +0.014986f, +0.014525f}, + {+0.024458f, +0.080595f, +0.019551f}, + {-1.243643f, +0.016723f, +0.007671f}, + {-0.026833f, -0.079269f, -0.017534f} + }, + { + {-0.298745f, -0.002258f, -0.035550f}, + {-0.694549f, +0.017049f, -0.121802f}, + {-1.533048f, +0.138236f, +0.001729f}, + {-0.936621f, +0.006483f, -0.016463f}, + {-0.010659f, +0.088690f, +0.016338f}, + {-1.351069f, +0.010889f, -0.001760f}, + {-0.005273f, -0.066631f, -0.006502f}, + {-1.507596f, -0.062294f, +0.000600f}, + {+0.007200f, +0.108283f, +0.019668f}, + {-0.271104f, -0.000976f, -0.015561f}, + {+0.066412f, -0.038573f, -0.004741f}, + {-1.591535f, -0.003139f, +0.026563f}, + {+0.061730f, +0.017448f, +0.034569f}, + {-1.228280f, -0.026953f, +0.019401f}, + {-0.154019f, +0.003402f, -0.022846f} + }, + { + {-0.403804f, +0.013608f, -0.021139f}, + {-0.303960f, +0.374644f, -0.062934f}, + {-2.124203f, -0.124967f, +0.003990f}, + {-0.833001f, +0.025492f, -0.024241f}, + {-0.091464f, -0.074091f, -0.027034f}, + {-1.159470f, +0.003590f, -0.030274f}, + {+0.009573f, +0.013314f, +0.020543f}, + {-1.158548f, +0.046445f, -0.013083f}, + {-0.010154f, -0.018411f, -0.028732f}, + {-0.281374f, +0.016568f, -0.009188f}, + {+0.243504f, +0.038902f, -0.007197f}, + {-1.548756f, -0.015848f, +0.014389f}, + {+0.022548f, -0.093695f, +0.003504f}, + {-1.143217f, +0.000379f, +0.015268f}, + {-0.155501f, +0.061060f, -0.003811f} + }, + { + {-0.754172f, +0.047356f, +0.017128f}, + {+0.345133f, -0.316244f, +0.057317f}, + {-2.527297f, +0.036708f, +0.007460f}, + {-0.809344f, -0.040779f, -0.004786f}, + {-0.077697f, -0.059210f, -0.036987f}, + {-1.058183f, -0.053650f, -0.024975f}, + {+0.005609f, +0.047560f, +0.007549f}, + {-0.927106f, -0.045705f, -0.016523f}, + {-0.001284f, -0.083106f, -0.002993f}, + {-0.356838f, +0.005268f, +0.005530f}, + {+0.387520f, -0.025713f, -0.011614f}, + {-1.430253f, -0.015935f, -0.004184f}, + {-0.038913f, +0.041146f, -0.031965f}, + {-1.016503f, -0.006305f, -0.002495f}, + {-0.055606f, -0.056822f, +0.018159f} + }, + { + {-1.377624f, -0.186837f, +0.033433f}, + {+0.741400f, -0.009809f, +0.083165f}, + {-2.661220f, +0.055216f, +0.033016f}, + {-0.877243f, -0.007797f, +0.016913f}, + {+0.020144f, +0.131421f, +0.012022f}, + {-1.053072f, +0.040270f, +0.005590f}, + {-0.006896f, -0.020841f, -0.015267f}, + {-0.840621f, +0.031127f, -0.003468f}, + {+0.008643f, -0.009871f, +0.024095f}, + {-0.513242f, -0.056059f, +0.008039f}, + {+0.409452f, +0.009674f, -0.007146f}, + {-1.249764f, +0.063596f, -0.003911f}, + {-0.045767f, +0.069574f, -0.019470f}, + {-0.861503f, +0.047121f, -0.007384f}, + {+0.055746f, -0.007574f, +0.014735f} + }, + { + {-2.158506f, +0.248088f, +0.006335f}, + {+0.596605f, +0.213550f, +0.033039f}, + {-2.533200f, -0.054742f, +0.053044f}, + {-1.031360f, +0.063967f, +0.017460f}, + {+0.090988f, +0.003376f, +0.044057f}, + {-1.171621f, +0.030730f, +0.026937f}, + {-0.006156f, -0.035131f, -0.009519f}, + {-0.903039f, +0.004797f, +0.018222f}, + {-0.001937f, +0.068607f, -0.005942f}, + {-0.728222f, +0.070497f, -0.002636f}, + {+0.251493f, +0.029150f, +0.010360f}, + {-1.046985f, -0.062004f, +0.008675f}, + {+0.001084f, -0.056417f, +0.016060f}, + {-0.705411f, -0.049357f, +0.002544f}, + {+0.108840f, +0.028879f, -0.008008f} + }, + { + {-2.857675f, -0.128580f, -0.013488f}, + {+0.055090f, -0.271277f, -0.026731f}, + {-2.176794f, +0.034141f, +0.031881f}, + {-1.209063f, -0.074028f, +0.000038f}, + {+0.057748f, -0.110260f, +0.008245f}, + {-1.387072f, -0.091682f, +0.021904f}, + {+0.004858f, +0.026786f, +0.011441f}, + {-1.058712f, -0.067944f, +0.024260f}, + {-0.007031f, +0.031892f, -0.019502f}, + {-0.946341f, -0.039683f, -0.007015f}, + {-0.062852f, -0.093720f, +0.021531f}, + {-0.874955f, +0.023509f, +0.011931f}, + {+0.037379f, -0.017809f, +0.020177f}, + {-0.588414f, +0.019414f, +0.008224f}, + {+0.093743f, +0.005046f, -0.012655f} + }, + { + {-3.261738f, -0.024600f, +0.013505f}, + {-0.459530f, +0.136066f, -0.073104f}, + {-1.606635f, -0.095137f, -0.008278f}, + {-1.308314f, +0.002009f, -0.008574f}, + {-0.027839f, +0.040584f, -0.027111f}, + {-1.582156f, +0.076989f, -0.000076f}, + {+0.006117f, +0.028262f, +0.010087f}, + {-1.176358f, +0.072778f, +0.000525f}, + {+0.004701f, -0.054472f, +0.013482f}, + {-1.119820f, +0.006109f, +0.003297f}, + {-0.404515f, +0.119170f, +0.007549f}, + {-0.760010f, +0.000475f, +0.003831f}, + {+0.026968f, +0.037327f, +0.002351f}, + {-0.531835f, +0.006711f, +0.004916f}, + {+0.032179f, -0.007958f, +0.004584f} + }, + { + {-3.304399f, +0.077327f, +0.052783f}, + {-0.579324f, +0.156987f, -0.050289f}, + {-0.863150f, +0.193423f, -0.021526f}, + {-1.255216f, +0.067889f, +0.008066f}, + {-0.071817f, +0.030805f, -0.019184f}, + {-1.602102f, +0.025362f, -0.010273f}, + {-0.002992f, -0.024081f, -0.007690f}, + {-1.097993f, +0.039942f, -0.019089f}, + {+0.004416f, -0.057385f, +0.012021f}, + {-1.235605f, -0.005922f, +0.015507f}, + {-0.584562f, -0.037493f, -0.014374f}, + {-0.684984f, +0.004473f, -0.003007f}, + {-0.010203f, -0.022657f, -0.009280f}, + {-0.519957f, -0.010997f, -0.000436f}, + {-0.044953f, -0.029593f, +0.011150f} + }, + { + {-3.042752f, -0.055240f, +0.055762f}, + {-0.286410f, -0.259148f, +0.037277f}, + {-0.076425f, -0.208846f, -0.004764f}, + {-1.057524f, -0.054711f, +0.019597f}, + {-0.041537f, -0.048621f, +0.001905f}, + {-1.366191f, -0.115170f, +0.002752f}, + {-0.005778f, -0.014973f, -0.010026f}, + {-0.757989f, -0.145344f, -0.007538f}, + {-0.006355f, +0.021219f, -0.017995f}, + {-1.303781f, +0.019691f, +0.015466f}, + {-0.474765f, -0.088378f, -0.013868f}, + {-0.608126f, -0.022180f, -0.002375f}, + {-0.031836f, -0.000935f, -0.011965f}, + {-0.508460f, -0.004149f, -0.001651f}, + {-0.094679f, +0.034251f, -0.002925f} + }, + { + {-2.561481f, +0.058009f, +0.020761f}, + {+0.114954f, +0.059631f, +0.072965f}, + {+0.560215f, +0.119741f, +0.009368f}, + {-0.778586f, +0.037376f, +0.005470f}, + {+0.023665f, +0.026771f, +0.013776f}, + {-0.934860f, +0.119001f, +0.012968f}, + {+0.001141f, +0.025569f, +0.003541f}, + {-0.253423f, +0.143668f, +0.009368f}, + {-0.000961f, +0.061304f, -0.002271f}, + {-1.326987f, -0.007873f, +0.008890f}, + {-0.115710f, +0.134180f, +0.001573f}, + {-0.492615f, +0.037518f, +0.002448f}, + {-0.015982f, +0.030143f, -0.005520f}, + {-0.451060f, +0.024473f, +0.001447f}, + {-0.079087f, +0.012412f, -0.013697f} + }, + { + {-1.914278f, -0.144244f, -0.006317f}, + {+0.323947f, +0.113578f, +0.015549f}, + {+0.901146f, -0.000633f, +0.001221f}, + {-0.486031f, -0.062487f, -0.006628f}, + {+0.056621f, +0.017415f, +0.009508f}, + {-0.460561f, -0.095684f, +0.008436f}, + {+0.005750f, +0.003176f, +0.010924f}, + {+0.221745f, -0.084421f, +0.008896f}, + {+0.006138f, +0.009642f, +0.017284f}, + {-1.282596f, -0.033227f, +0.013009f}, + {+0.295524f, -0.090225f, +0.005470f}, + {-0.320490f, -0.048169f, +0.007190f}, + {+0.017081f, -0.032708f, +0.009204f}, + {-0.321645f, -0.040805f, +0.005349f}, + {-0.004452f, -0.049687f, -0.005870f} + }, + { + {-1.131086f, +0.240364f, +0.014659f}, + {+0.276466f, -0.082126f, -0.039402f}, + {+0.939436f, -0.066256f, -0.020157f}, + {-0.227874f, +0.081668f, +0.006464f}, + {+0.031245f, -0.021677f, +0.001488f}, + {-0.079943f, +0.077867f, +0.010680f}, + {+0.000131f, -0.031577f, -0.000810f}, + {+0.505579f, +0.022937f, +0.002111f}, + {-0.002114f, -0.051097f, -0.006205f}, + {-1.119787f, +0.067689f, +0.030053f}, + {+0.529896f, +0.026599f, +0.002639f}, + {-0.086495f, +0.052017f, +0.009012f}, + {+0.027535f, -0.008758f, +0.016240f}, + {-0.118065f, +0.048702f, +0.006679f}, + {+0.071205f, +0.035559f, +0.009161f} + }, + { + {-0.245787f, -0.191436f, +0.043587f}, + {+0.093440f, -0.004557f, -0.027073f}, + {+0.799589f, +0.049636f, -0.030640f}, + {-0.010885f, -0.044328f, +0.025258f}, + {-0.019046f, +0.019093f, +0.000438f}, + {+0.170216f, -0.034687f, +0.022513f}, + {-0.005866f, +0.001799f, -0.012476f}, + {+0.562981f, +0.020613f, +0.002338f}, + {-0.004590f, -0.033773f, -0.012630f}, + {-0.766124f, -0.063087f, +0.032731f}, + {+0.462468f, +0.040558f, +0.011199f}, + {+0.208773f, -0.041720f, +0.000150f}, + {+0.003866f, +0.047343f, +0.002184f}, + {+0.142942f, -0.041830f, -0.000134f}, + {+0.085394f, +0.009847f, +0.015388f} + }, + { + {+0.696618f, +0.032741f, -0.013106f}, + {-0.079123f, +0.007129f, +0.009727f}, + {+0.637741f, -0.009242f, -0.021655f}, + {+0.212381f, -0.027509f, +0.006723f}, + {-0.047028f, -0.036117f, -0.013542f}, + {+0.370842f, -0.041578f, +0.004859f}, + {-0.000617f, +0.037075f, -0.000220f}, + {+0.496527f, -0.056499f, -0.001248f}, + {+0.004430f, +0.032051f, +0.012864f}, + {-0.166525f, +0.044856f, -0.014703f}, + {+0.146069f, -0.116744f, +0.017775f}, + {+0.546556f, +0.035367f, -0.024737f}, + {-0.023099f, -0.027347f, -0.019267f}, + {+0.425139f, +0.034119f, -0.017706f}, + {+0.028754f, -0.048770f, +0.007240f} + }, + { + {+1.611496f, -0.047493f, -0.138771f}, + {-0.157237f, +0.030807f, +0.012105f}, + {+0.536727f, -0.004269f, -0.010405f}, + {+0.501885f, +0.028440f, -0.057516f}, + {-0.027394f, -0.029213f, -0.025646f}, + {+0.639827f, +0.055019f, -0.067764f}, + {+0.006221f, -0.003275f, +0.014398f}, + {+0.461536f, +0.068831f, -0.033617f}, + {+0.001591f, +0.053416f, +0.004360f}, + {+0.626469f, -0.114092f, -0.092853f}, + {-0.211469f, +0.148135f, -0.006826f}, + {+0.860019f, -0.064519f, -0.045475f}, + {-0.018761f, -0.043099f, -0.016105f}, + {+0.663833f, -0.048154f, -0.030845f}, + {-0.045626f, +0.052106f, -0.012787f} + }, + { + {+2.288775f, +0.330052f, -0.141825f}, + {-0.126579f, -0.010919f, -0.013520f}, + {+0.480184f, +0.010975f, -0.003821f}, + {+0.833876f, +0.128981f, -0.089877f}, + {+0.027378f, +0.130514f, +0.022104f}, + {+0.987530f, +0.132515f, -0.115028f}, + {+0.000006f, -0.048007f, -0.001802f}, + {+0.539461f, +0.030205f, -0.070546f}, + {-0.005361f, +0.003754f, -0.015136f}, + {+1.370192f, +0.300821f, -0.090103f}, + {-0.376693f, -0.051952f, -0.051245f}, + {+1.023463f, +0.103548f, -0.021626f}, + {+0.011481f, +0.068383f, +0.018910f}, + {+0.767991f, +0.065493f, -0.012744f}, + {-0.070294f, +0.005867f, -0.026624f} + }, + { + {+2.386202f, -0.393766f, +0.091076f}, + {-0.026353f, -0.076812f, -0.011309f}, + {+0.401155f, -0.012573f, +0.012460f}, + {+1.044143f, -0.283147f, +0.008993f}, + {+0.046392f, +0.057411f, +0.051335f}, + {+1.233210f, -0.363550f, +0.002070f}, + {-0.006407f, -0.010478f, -0.016041f}, + {+0.661388f, -0.218208f, -0.018346f}, + {+0.002791f, -0.054442f, +0.008337f}, + {+1.687434f, -0.323548f, +0.070274f}, + {-0.258425f, -0.166860f, -0.042541f}, + {+0.910899f, -0.034460f, +0.045920f}, + {+0.022238f, +0.046619f, +0.026404f}, + {+0.661856f, -0.004487f, +0.030559f}, + {-0.025130f, -0.092267f, -0.002499f} + }, + { + {+1.666633f, -0.360456f, +0.255929f}, + {+0.066021f, +0.074661f, +0.029510f}, + {+0.252047f, -0.048065f, +0.026719f}, + {+0.913916f, +0.010655f, +0.146689f}, + {-0.007792f, -0.195641f, -0.037030f}, + {+1.098128f, +0.060089f, +0.189069f}, + {+0.003378f, +0.059921f, +0.011523f}, + {+0.642839f, +0.126181f, +0.111015f}, + {+0.001509f, -0.062831f, +0.004239f}, + {+1.312690f, -0.234325f, +0.190640f}, + {+0.012758f, +0.255764f, +0.056444f}, + {+0.511605f, -0.213878f, +0.060443f}, + {-0.003813f, -0.090866f, -0.022023f}, + {+0.358843f, -0.156710f, +0.034608f}, + {+0.035742f, +0.045103f, +0.037370f} + }, + { + {+0.381358f, +1.206285f, -0.072122f}, + {+0.074139f, +0.095357f, +0.023821f}, + {+0.056394f, +0.128099f, -0.000093f}, + {+0.398811f, +0.586347f, +0.042243f}, + {-0.030944f, -0.168571f, -0.041583f}, + {+0.488122f, +0.738625f, +0.068185f}, + {+0.002280f, +0.072478f, +0.005368f}, + {+0.349465f, +0.388613f, +0.079712f}, + {-0.003028f, -0.029422f, -0.008868f}, + {+0.401381f, +0.902131f, -0.044484f}, + {+0.176056f, +0.077874f, +0.097877f}, + {+0.009642f, +0.355418f, -0.055057f}, + {-0.013871f, -0.089264f, -0.019111f}, + {+0.003022f, +0.223981f, -0.039576f}, + {+0.038242f, +0.114116f, +0.011546f} + }, + { + {-0.612178f, -0.198966f, -0.447896f}, + {+0.011203f, -0.103152f, -0.040501f}, + {-0.092947f, -0.064045f, -0.048583f}, + {-0.172174f, -0.393944f, -0.233061f}, + {+0.000469f, +0.055639f, +0.042364f}, + {-0.216767f, -0.541072f, -0.299361f}, + {-0.001945f, +0.039334f, -0.006788f}, + {-0.073951f, -0.446110f, -0.164206f}, + {+0.000571f, -0.002951f, +0.001970f}, + {-0.385812f, -0.226337f, -0.343728f}, + {+0.104268f, -0.348234f, -0.048377f}, + {-0.283739f, +0.046315f, -0.129419f}, + {+0.000090f, +0.017828f, +0.020908f}, + {-0.195200f, +0.041315f, -0.080091f}, + {-0.000956f, -0.033592f, -0.036908f} + } +}; + +const float rightHRIRReal[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS]= +{ + { + {+0.625622f, +0.318887f, +0.014720f}, + {+1.164232f, -0.071388f, +0.046399f}, + {+1.000960f, +0.045336f, +0.068038f}, + {+0.303190f, +0.543160f, +0.149069f}, + {+1.137988f, -0.154415f, -0.061425f}, + {+0.085322f, +0.882648f, +0.205135f}, + {+1.253214f, -0.205377f, -0.065229f}, + {+0.058226f, +0.942911f, +0.171217f}, + {+1.312265f, -0.220630f, -0.090644f}, + {+0.680445f, +0.361766f, +0.049600f}, + {+1.034378f, +0.117953f, +0.052257f}, + {+0.250187f, +0.697472f, +0.213227f}, + {+1.147757f, -0.086335f, +0.012687f}, + {+0.501443f, +0.364037f, +0.074228f}, + {+1.088959f, -0.092061f, -0.000586f} + }, + { + {+0.286735f, -0.252034f, -0.153374f}, + {+1.146595f, -0.154651f, +0.043142f}, + {+0.948810f, -0.114394f, +0.051619f}, + {-0.060685f, -0.361794f, -0.117760f}, + {+1.263032f, +0.249467f, +0.062149f}, + {-0.105135f, -0.389796f, -0.271911f}, + {+1.350448f, +0.215668f, +0.073258f}, + {-0.094305f, -0.164320f, -0.266068f}, + {+1.374733f, +0.173637f, +0.049028f}, + {+0.438624f, -0.019990f, -0.059450f}, + {+1.040815f, -0.208066f, -0.083035f}, + {-0.102492f, -0.454586f, -0.136217f}, + {+1.166646f, -0.148967f, -0.011838f}, + {+0.098987f, -0.171388f, -0.043273f}, + {+1.097313f, -0.054163f, +0.016726f} + }, + { + {-0.088480f, -0.420403f, +0.001880f}, + {+1.143116f, +0.354198f, -0.162550f}, + {+0.931498f, +0.123662f, -0.033888f}, + {-0.299298f, -0.139613f, -0.122914f}, + {+1.318265f, +0.100233f, +0.102754f}, + {-0.046525f, -0.814319f, -0.099822f}, + {+1.356998f, +0.217141f, +0.061024f}, + {+0.011288f, -0.915723f, +0.029668f}, + {+1.353473f, +0.285762f, +0.004248f}, + {+0.127607f, -0.015631f, -0.000953f}, + {+1.153537f, -0.424294f, -0.013858f}, + {-0.278085f, -0.128122f, -0.198812f}, + {+1.196081f, +0.029242f, -0.092440f}, + {-0.325202f, +0.033240f, -0.015961f}, + {+1.086036f, +0.107882f, -0.049328f} + }, + { + {-0.459273f, -0.470824f, +0.048067f}, + {+1.325816f, +0.511650f, -0.152840f}, + {+1.060173f, +0.310816f, -0.017459f}, + {-0.224619f, +0.084318f, -0.062623f}, + {+1.191764f, -0.170770f, +0.020474f}, + {+0.084800f, +0.048581f, +0.210193f}, + {+1.231375f, -0.115063f, -0.048061f}, + {+0.074098f, -0.455054f, +0.206816f}, + {+1.284471f, +0.011386f, -0.085145f}, + {-0.221606f, -0.084179f, +0.030307f}, + {+1.276588f, -0.117807f, +0.087644f}, + {-0.094546f, +0.498021f, -0.017920f}, + {+1.280931f, +0.249488f, -0.020802f}, + {-0.500760f, -0.035203f, -0.013172f}, + {+1.108975f, +0.181116f, -0.024618f} + }, + { + {-0.676760f, -0.089781f, -0.072018f}, + {+1.605708f, -0.366586f, +0.142118f}, + {+1.268416f, -0.122990f, +0.116068f}, + {+0.078497f, -0.418906f, +0.044519f}, + {+0.963365f, +0.072984f, -0.025802f}, + {+0.031477f, +0.447773f, +0.053312f}, + {+1.077459f, -0.019951f, -0.049500f}, + {-0.059280f, +0.507158f, -0.168109f}, + {+1.259077f, -0.142552f, -0.013514f}, + {-0.512977f, +0.036303f, +0.035411f}, + {+1.292946f, +0.146018f, -0.029776f}, + {+0.194009f, -0.198069f, +0.165160f}, + {+1.302893f, +0.041776f, +0.054097f}, + {-0.311251f, -0.179016f, -0.007145f}, + {+1.107011f, +0.048657f, +0.025557f} + }, + { + {-0.518829f, +0.144843f, +0.012635f}, + {+1.664749f, -0.424953f, +0.117548f}, + {+1.341921f, -0.475334f, -0.025454f}, + {+0.290955f, -0.043105f, +0.145092f}, + {+0.745020f, +0.011176f, -0.013117f}, + {-0.059334f, -0.119714f, -0.140789f}, + {+0.953967f, +0.019869f, -0.011129f}, + {-0.027620f, +0.732031f, -0.075265f}, + {+1.242504f, +0.051036f, +0.063409f}, + {-0.664021f, -0.071212f, +0.022023f}, + {+1.345654f, +0.206823f, +0.000993f}, + {+0.215666f, -0.319906f, +0.114867f}, + {+1.166038f, -0.153803f, -0.001166f}, + {+0.083957f, +0.134151f, +0.028232f}, + {+0.999816f, -0.066205f, -0.006296f} + }, + { + {-0.137274f, +0.076831f, -0.038250f}, + {+1.581283f, +0.343441f, -0.147384f}, + {+1.367477f, -0.195495f, -0.142118f}, + {+0.155099f, +0.411591f, +0.002255f}, + {+0.611192f, -0.097324f, +0.048461f}, + {-0.032052f, -0.346312f, -0.054872f}, + {+0.891869f, -0.009049f, +0.006965f}, + {+0.069189f, +0.025911f, +0.196858f}, + {+1.206124f, +0.162210f, +0.026195f}, + {-0.622568f, -0.029470f, -0.001764f}, + {+1.428022f, +0.163648f, +0.009798f}, + {-0.029956f, +0.351502f, -0.072001f}, + {+0.954217f, +0.027854f, -0.027765f}, + {+0.377920f, -0.040829f, +0.033773f}, + {+0.821491f, +0.019645f, -0.005837f} + }, + { + {+0.340806f, +0.310825f, -0.047722f}, + {+1.677009f, +0.377370f, -0.142884f}, + {+1.442173f, +0.342472f, +0.058973f}, + {-0.109214f, -0.056024f, -0.105562f}, + {+0.535134f, -0.138655f, +0.042466f}, + {+0.046512f, +0.128065f, +0.107566f}, + {+0.897169f, +0.015446f, +0.016293f}, + {-0.017560f, -0.600552f, -0.051411f}, + {+1.199956f, -0.036702f, -0.050091f}, + {-0.383881f, +0.085336f, -0.002185f}, + {+1.542399f, +0.075318f, -0.055439f}, + {-0.213556f, +0.042618f, -0.139727f}, + {+0.767844f, -0.002300f, -0.002498f}, + {+0.389565f, -0.093296f, +0.018341f}, + {+0.614646f, -0.038818f, +0.011343f} + }, + { + {+0.682687f, -0.162615f, +0.076325f}, + {+1.950355f, -0.362582f, +0.081454f}, + {+1.383305f, +0.259100f, +0.098340f}, + {-0.213659f, -0.101401f, -0.062195f}, + {+0.507785f, +0.030154f, -0.021916f}, + {+0.031901f, +0.266437f, +0.053656f}, + {+0.951588f, +0.040882f, -0.000970f}, + {-0.046125f, -0.384263f, -0.129408f}, + {+1.302827f, -0.171084f, -0.011255f}, + {-0.027625f, -0.133154f, +0.018328f}, + {+1.712243f, -0.194390f, +0.019399f}, + {-0.118934f, -0.338445f, -0.019973f}, + {+0.668291f, +0.010139f, +0.008195f}, + {+0.144432f, +0.164330f, -0.025701f}, + {+0.438220f, +0.079868f, -0.003191f} + }, + { + {+0.610952f, -0.295887f, +0.035489f}, + {+2.093580f, -0.196850f, +0.103630f}, + {+1.183258f, -0.254467f, -0.069704f}, + {-0.101158f, +0.222864f, +0.024346f}, + {+0.575110f, +0.116089f, +0.003537f}, + {-0.035693f, -0.134351f, -0.082748f}, + {+1.057859f, +0.043401f, -0.017762f}, + {+0.038543f, +0.232670f, +0.109875f}, + {+1.471333f, +0.025140f, +0.035257f}, + {+0.315108f, +0.002642f, +0.011084f}, + {+1.786701f, -0.093608f, +0.042083f}, + {+0.101827f, +0.111911f, +0.089442f}, + {+0.675572f, -0.006144f, -0.003303f}, + {-0.156559f, -0.020362f, -0.037847f}, + {+0.361145f, +0.021912f, -0.014375f} + }, + { + {+0.215943f, +0.100902f, -0.038402f}, + {+1.976571f, +0.241275f, -0.043490f}, + {+1.025479f, -0.189152f, -0.060485f}, + {+0.084280f, -0.041736f, +0.082895f}, + {+0.699954f, -0.000496f, +0.029249f}, + {-0.033219f, -0.189116f, -0.059524f}, + {+1.214688f, -0.076791f, +0.003066f}, + {+0.015390f, +0.395024f, +0.041010f}, + {+1.625112f, +0.050451f, -0.006609f}, + {+0.546520f, -0.014474f, -0.021685f}, + {+1.716470f, +0.098967f, -0.019398f}, + {+0.176131f, +0.115006f, +0.065018f}, + {+0.764906f, -0.062888f, -0.000632f}, + {-0.315978f, -0.085685f, +0.017030f}, + {+0.401503f, -0.073214f, +0.013531f} + }, + { + {-0.226724f, -0.081469f, -0.015083f}, + {+1.738061f, +0.041153f, -0.060947f}, + {+0.922005f, +0.036805f, +0.043095f}, + {+0.140772f, -0.212427f, +0.006831f}, + {+0.827335f, -0.067324f, -0.023100f}, + {+0.026336f, +0.163123f, +0.060613f}, + {+1.366857f, -0.002014f, +0.004214f}, + {-0.036122f, +0.013268f, -0.102505f}, + {+1.749249f, +0.060972f, -0.022997f}, + {+0.628526f, +0.009623f, -0.025420f}, + {+1.587780f, -0.017325f, -0.034831f}, + {+0.047589f, -0.158181f, +0.000915f}, + {+0.880943f, +0.044219f, +0.021208f}, + {-0.284768f, -0.026108f, +0.032717f}, + {+0.499398f, -0.006432f, +0.020261f} + }, + { + {-0.502341f, +0.014784f, -0.004442f}, + {+1.505132f, +0.022539f, -0.007951f}, + {+0.788099f, +0.109664f, +0.026293f}, + {+0.070952f, +0.012587f, -0.060046f}, + {+0.945261f, -0.116770f, -0.027695f}, + {+0.034434f, +0.143653f, +0.064672f}, + {+1.465040f, -0.001749f, -0.014809f}, + {+0.003390f, -0.275112f, +0.011303f}, + {+1.815683f, -0.023428f, +0.002040f}, + {+0.538936f, -0.002058f, -0.007385f}, + {+1.470938f, -0.021798f, -0.012446f}, + {-0.126264f, +0.126663f, -0.057452f}, + {+0.968457f, +0.052353f, +0.005680f}, + {-0.103836f, +0.018725f, -0.021490f}, + {+0.596708f, +0.023788f, -0.009367f} + }, + { + {-0.492814f, +0.061978f, +0.004857f}, + {+1.323053f, -0.031245f, -0.010960f}, + {+0.629433f, -0.057790f, -0.011522f}, + {-0.020040f, +0.083340f, -0.010638f}, + {+0.990987f, +0.041590f, +0.024383f}, + {-0.019240f, -0.174901f, -0.044679f}, + {+1.480865f, +0.017125f, -0.010601f}, + {+0.025429f, -0.108477f, +0.070866f}, + {+1.775213f, -0.086261f, -0.017961f}, + {+0.286716f, -0.064952f, +0.010826f}, + {+1.389486f, +0.000140f, +0.005964f}, + {-0.147616f, +0.078463f, -0.074691f}, + {+1.029093f, -0.016099f, -0.029749f}, + {+0.148950f, +0.124951f, -0.030334f}, + {+0.669798f, +0.034059f, -0.017672f} + }, + { + {-0.263474f, -0.085276f, +0.011348f}, + {+1.182510f, -0.045886f, +0.007051f}, + {+0.473865f, +0.014568f, -0.008515f}, + {-0.083849f, -0.019482f, +0.039696f}, + {+0.889927f, +0.101012f, +0.018019f}, + {-0.034351f, -0.105731f, -0.065818f}, + {+1.386823f, +0.026725f, +0.000771f}, + {-0.010460f, +0.157988f, -0.030666f}, + {+1.624911f, +0.001774f, -0.032570f}, + {-0.070456f, +0.112056f, +0.005895f}, + {+1.316722f, +0.043440f, -0.002660f}, + {+0.010696f, -0.252890f, +0.005868f}, + {+1.088370f, -0.079959f, -0.015118f}, + {+0.321581f, -0.091411f, +0.016059f}, + {+0.688001f, -0.021562f, -0.000700f} + }, + { + {+0.028075f, +0.094891f, +0.025537f}, + {+1.003882f, -0.024290f, +0.045086f}, + {+0.348737f, -0.009666f, +0.003782f}, + {-0.094687f, -0.092807f, +0.015332f}, + {+0.684266f, -0.092642f, -0.016858f}, + {+0.010648f, +0.163291f, +0.024850f}, + {+1.189337f, -0.053543f, +0.003361f}, + {-0.017554f, +0.105607f, -0.047949f}, + {+1.372511f, +0.028160f, +0.019011f}, + {-0.409194f, -0.068489f, -0.000898f}, + {+1.209792f, -0.033195f, -0.018513f}, + {+0.152611f, +0.084562f, +0.098898f}, + {+1.114407f, +0.011788f, +0.013270f}, + {+0.278306f, -0.044425f, +0.040442f}, + {+0.622917f, -0.018666f, +0.009922f} + }, + { + {+0.234086f, +0.033069f, +0.017363f}, + {+0.740177f, +0.195497f, +0.009467f}, + {+0.278404f, +0.005428f, +0.007940f}, + {-0.038592f, +0.051080f, -0.052176f}, + {+0.479823f, +0.016574f, -0.020585f}, + {+0.037747f, +0.010959f, +0.078277f}, + {+0.942736f, +0.059732f, +0.004267f}, + {+0.013463f, -0.125599f, +0.038289f}, + {+1.014378f, +0.145862f, +0.036898f}, + {-0.599240f, +0.017158f, +0.001993f}, + {+1.037014f, -0.004829f, -0.003051f}, + {+0.097746f, +0.241425f, +0.056951f}, + {+1.057897f, +0.055995f, +0.002659f}, + {+0.034409f, +0.166502f, +0.011758f}, + {+0.484638f, +0.055982f, +0.007230f} + }, + { + {+0.302159f, -0.065615f, -0.027649f}, + {+0.480829f, -0.064216f, -0.043606f}, + {+0.267594f, +0.001584f, +0.006546f}, + {+0.073328f, +0.179121f, -0.030479f}, + {+0.366217f, +0.055646f, +0.013124f}, + {-0.006609f, -0.265125f, -0.016510f}, + {+0.728428f, -0.048337f, +0.001439f}, + {+0.013220f, -0.131492f, +0.036082f}, + {+0.640014f, -0.153518f, -0.009948f}, + {-0.570949f, +0.037845f, +0.003919f}, + {+0.775649f, -0.065990f, +0.016867f}, + {-0.078407f, -0.230573f, -0.077915f}, + {+0.921821f, -0.037053f, -0.008881f}, + {-0.233852f, -0.106785f, -0.034385f}, + {+0.319853f, -0.071600f, -0.011181f} + }, + { + {+0.278839f, -0.028952f, -0.035646f}, + {+0.346889f, -0.104821f, -0.004742f}, + {+0.308015f, -0.016382f, +0.006865f}, + {+0.139350f, -0.105650f, +0.062450f}, + {+0.387256f, -0.021873f, +0.040727f}, + {-0.042429f, -0.053630f, -0.094110f}, + {+0.637226f, -0.018242f, +0.007115f}, + {-0.018943f, +0.103114f, -0.053053f}, + {+0.417755f, -0.008672f, -0.023314f}, + {-0.345464f, -0.074501f, +0.004085f}, + {+0.448779f, +0.108427f, +0.006588f}, + {-0.138142f, -0.161327f, -0.088998f}, + {+0.735939f, +0.043054f, -0.006246f}, + {-0.323001f, -0.053426f, -0.037017f}, + {+0.195889f, -0.012365f, -0.013162f} + }, + { + {+0.196181f, +0.041302f, +0.002444f}, + {+0.335149f, +0.024150f, +0.042650f}, + {+0.386375f, +0.004899f, +0.003361f}, + {+0.057054f, -0.159605f, +0.062037f}, + {+0.564612f, -0.025480f, +0.015096f}, + {+0.011492f, +0.297922f, +0.033799f}, + {+0.730907f, +0.044800f, +0.018459f}, + {-0.004564f, +0.210619f, -0.011762f}, + {+0.441286f, +0.097411f, +0.011722f}, + {-0.027659f, +0.078990f, +0.003505f}, + {+0.139688f, -0.077873f, -0.010083f}, + {-0.020118f, +0.231273f, +0.031141f}, + {+0.536993f, -0.035240f, -0.004368f}, + {-0.175851f, +0.155370f, +0.009858f}, + {+0.144861f, +0.035632f, +0.011759f} + }, + { + {+0.052839f, +0.021145f, +0.032934f}, + {+0.386157f, +0.060262f, +0.016757f}, + {+0.484472f, -0.002920f, -0.010570f}, + {-0.104209f, +0.229183f, -0.047655f}, + {+0.918642f, -0.034827f, -0.037149f}, + {+0.037426f, +0.156073f, +0.082853f}, + {+1.015020f, -0.033699f, +0.002853f}, + {+0.020608f, +0.028827f, +0.057521f}, + {+0.683874f, -0.079502f, +0.034799f}, + {+0.249215f, -0.054366f, +0.004926f}, + {-0.071180f, +0.006964f, -0.008015f}, + {+0.098532f, +0.027366f, +0.074117f}, + {+0.367933f, -0.002046f, +0.010161f}, + {+0.074185f, -0.043989f, +0.032862f}, + {+0.147810f, +0.003457f, +0.021465f} + }, + { + {-0.130356f, -0.121062f, +0.014557f}, + {+0.475703f, -0.006148f, -0.023405f}, + {+0.576084f, +0.037334f, -0.013945f}, + {-0.152471f, +0.096982f, -0.087407f}, + {+1.404901f, +0.165414f, -0.048723f}, + {-0.014512f, -0.190422f, -0.045041f}, + {+1.440940f, +0.071259f, -0.031007f}, + {-0.005777f, -0.163997f, -0.016934f}, + {+1.050275f, +0.008260f, +0.006195f}, + {+0.386758f, -0.005894f, +0.001482f}, + {-0.163442f, +0.028862f, +0.011254f}, + {+0.085717f, -0.129404f, +0.017522f}, + {+0.257252f, -0.028247f, +0.020221f}, + {+0.242915f, -0.031396f, +0.002633f}, + {+0.193627f, -0.014561f, +0.008640f} + }, + { + {-0.286286f, +0.097252f, -0.041512f}, + {+0.585900f, -0.077367f, -0.015045f}, + {+0.619979f, -0.049713f, +0.009170f}, + {-0.024241f, -0.256635f, +0.018398f}, + {+1.849971f, -0.189063f, -0.000469f}, + {-0.026389f, -0.146816f, -0.054608f}, + {+1.888056f, -0.137439f, -0.034575f}, + {-0.015954f, -0.090459f, -0.044119f}, + {+1.430514f, -0.025065f, -0.047865f}, + {+0.367403f, +0.037464f, -0.007579f}, + {-0.184491f, +0.004971f, +0.018816f}, + {-0.017983f, +0.089824f, -0.035056f}, + {+0.235707f, +0.030441f, +0.004150f}, + {+0.243126f, +0.012530f, -0.011942f}, + {+0.295835f, -0.004981f, -0.008543f} + }, + { + {-0.322996f, +0.149054f, -0.019252f}, + {+0.665250f, +0.043970f, +0.015531f}, + {+0.580264f, -0.030849f, +0.024350f}, + {+0.113598f, -0.012581f, +0.077394f}, + {+2.005200f, -0.021439f, +0.029304f}, + {+0.010436f, +0.101090f, +0.035256f}, + {+2.158987f, +0.088276f, -0.003861f}, + {+0.012628f, +0.118154f, +0.035793f}, + {+1.711090f, +0.135561f, -0.041164f}, + {+0.249509f, -0.036318f, -0.011041f}, + {-0.193848f, -0.021279f, +0.007900f}, + {-0.086761f, +0.034113f, -0.037672f}, + {+0.339148f, +0.023808f, -0.014106f}, + {+0.093926f, -0.023588f, +0.006999f}, + {+0.464823f, +0.051589f, -0.014718f} + }, + { + {-0.232991f, -0.119769f, +0.069682f}, + {+0.660761f, +0.042611f, +0.015736f}, + {+0.490072f, +0.069493f, +0.007458f}, + {+0.111516f, +0.167908f, +0.006525f}, + {+1.741681f, +0.183508f, -0.002008f}, + {+0.017775f, +0.088998f, +0.033186f}, + {+2.068520f, +0.072175f, +0.012737f}, + {+0.008321f, +0.149997f, +0.022551f}, + {+1.743717f, -0.055334f, +0.020118f}, + {+0.113469f, +0.022908f, -0.008746f}, + {-0.215009f, +0.005025f, +0.002907f}, + {-0.050942f, -0.083131f, -0.004389f}, + {+0.555173f, -0.080542f, -0.013610f}, + {-0.109620f, +0.081521f, +0.008758f}, + {+0.671639f, -0.073125f, -0.004515f} + }, + { + {-0.081293f, -0.137373f, +0.044029f}, + {+0.580314f, -0.054424f, -0.004509f}, + {+0.463983f, -0.014407f, -0.011338f}, + {+0.010292f, -0.029514f, -0.042304f}, + {+1.169198f, -0.169394f, -0.027703f}, + {-0.003477f, -0.054254f, -0.016928f}, + {+1.586881f, -0.186952f, +0.000592f}, + {-0.014733f, -0.018568f, -0.041380f}, + {+1.413673f, -0.186454f, +0.025413f}, + {+0.012903f, -0.004127f, -0.003906f}, + {-0.240996f, -0.010303f, +0.004071f}, + {+0.035386f, +0.053069f, +0.022651f}, + {+0.797681f, +0.082346f, +0.001667f}, + {-0.233902f, -0.047392f, -0.015538f}, + {+0.837236f, +0.024942f, +0.000978f} + }, + { + {+0.131946f, +0.108933f, -0.083894f}, + {+0.487007f, +0.016249f, -0.011560f}, + {+0.605422f, -0.050044f, -0.018024f}, + {-0.076271f, -0.058690f, -0.007472f}, + {+0.528861f, +0.124876f, -0.022752f}, + {-0.013401f, -0.021368f, -0.024064f}, + {+0.878847f, +0.205138f, -0.018250f}, + {-0.001043f, -0.119442f, -0.002181f}, + {+0.787884f, +0.241841f, -0.026493f}, + {-0.047227f, -0.004224f, +0.002439f}, + {-0.248907f, +0.006659f, -0.000113f}, + {+0.073996f, +0.013124f, +0.028741f}, + {+0.944135f, -0.011491f, +0.008745f}, + {-0.190006f, -0.056489f, -0.021766f}, + {+0.883681f, +0.012426f, -0.004374f} + }, + { + {+0.405969f, +0.226903f, -0.097206f}, + {+0.447938f, +0.026156f, -0.000247f}, + {+0.921105f, +0.112177f, -0.013995f}, + {-0.090253f, -0.009755f, +0.013084f}, + {+0.037993f, -0.046160f, -0.007721f}, + {-0.002415f, +0.053658f, +0.001011f}, + {+0.202227f, -0.127508f, -0.025725f}, + {+0.013671f, -0.012260f, +0.038128f}, + {+0.093735f, -0.101919f, -0.033415f}, + {-0.097438f, -0.004101f, +0.007694f}, + {-0.215815f, +0.021644f, -0.000381f}, + {+0.026266f, -0.083884f, +0.006535f}, + {+0.915214f, -0.057119f, -0.002700f}, + {-0.014409f, +0.106024f, +0.002229f}, + {+0.783545f, -0.039342f, -0.005531f} + }, + { + {+0.562721f, -0.271269f, +0.047991f}, + {+0.502937f, -0.043296f, +0.016942f}, + {+1.294879f, -0.099867f, -0.004459f}, + {-0.031898f, +0.012336f, -0.012314f}, + {-0.208511f, -0.020811f, +0.014857f}, + {+0.012118f, -0.016031f, +0.023545f}, + {-0.243172f, +0.002723f, -0.005736f}, + {-0.005049f, +0.125222f, -0.014706f}, + {-0.466228f, +0.038982f, +0.006490f}, + {-0.166118f, +0.020933f, +0.009093f}, + {-0.140043f, -0.033646f, +0.007426f}, + {-0.048205f, +0.058271f, -0.028029f}, + {+0.720723f, +0.081983f, -0.019142f}, + {+0.155323f, -0.047908f, +0.024506f}, + {+0.563027f, +0.072436f, -0.008261f} + }, + { + {+0.346717f, -0.146678f, +0.128633f}, + {+0.665302f, +0.025328f, +0.018664f}, + {+1.538661f, +0.020131f, -0.007519f}, + {+0.057374f, +0.076254f, -0.009097f}, + {-0.254940f, +0.020497f, +0.029909f}, + {+0.004959f, -0.067560f, +0.005746f}, + {-0.419513f, +0.042371f, +0.027848f}, + {-0.010252f, +0.088264f, -0.028280f}, + {-0.808913f, -0.036603f, +0.026731f}, + {-0.247264f, -0.028052f, +0.006187f}, + {-0.037018f, +0.017759f, +0.010413f}, + {-0.060240f, +0.049926f, -0.029266f}, + {+0.433078f, -0.054258f, -0.021327f}, + {+0.195525f, -0.046783f, +0.017995f}, + {+0.287834f, -0.063180f, -0.013153f} + }, + { + {-0.212769f, +0.425049f, +0.027769f}, + {+0.939196f, -0.019336f, -0.005463f}, + {+1.506310f, +0.042304f, -0.013085f}, + {+0.097198f, -0.040503f, +0.027506f}, + {-0.199749f, +0.009650f, +0.022317f}, + {-0.010773f, +0.015875f, -0.022610f}, + {-0.419039f, -0.009501f, +0.039624f}, + {+0.009683f, -0.056906f, +0.027608f}, + {-0.938023f, +0.007493f, +0.025082f}, + {-0.294888f, +0.009081f, +0.003714f}, + {+0.082675f, -0.002912f, +0.000293f}, + {-0.000563f, -0.091941f, +0.008199f}, + {+0.126495f, +0.024788f, -0.002184f}, + {+0.095176f, +0.081798f, -0.006897f}, + {+0.025925f, +0.024934f, -0.004698f} + }, + { + {-0.701719f, -0.197323f, -0.097152f}, + {+1.307210f, +0.059238f, -0.036759f}, + {+1.158895f, -0.116341f, -0.011892f}, + {+0.038869f, -0.081096f, +0.026731f}, + {-0.111036f, -0.024935f, -0.003673f}, + {-0.005417f, +0.058202f, -0.006901f}, + {-0.346534f, -0.036837f, +0.017249f}, + {+0.003885f, -0.099089f, +0.010285f}, + {-0.904817f, +0.000980f, +0.015822f}, + {-0.250498f, +0.017459f, +0.003023f}, + {+0.218266f, +0.018411f, -0.013033f}, + {+0.053818f, +0.015747f, +0.035387f}, + {-0.162010f, -0.044649f, +0.016738f}, + {-0.051528f, -0.041975f, -0.022436f}, + {-0.189698f, -0.017096f, +0.012923f} + }, + { + {-0.694634f, -0.219873f, -0.083472f}, + {+1.684359f, -0.120864f, -0.039343f}, + {+0.561143f, +0.176993f, -0.020577f}, + {-0.062577f, +0.108567f, -0.021231f}, + {-0.012692f, -0.018982f, -0.021456f}, + {+0.008198f, -0.015667f, +0.017857f}, + {-0.247732f, +0.019366f, -0.017116f}, + {-0.009519f, -0.000576f, -0.026702f}, + {-0.771969f, -0.012422f, -0.001228f}, + {-0.085011f, -0.036208f, -0.003034f}, + {+0.359359f, -0.049355f, -0.011943f}, + {+0.038205f, +0.086506f, +0.013225f}, + {-0.415529f, +0.073749f, +0.012774f}, + {-0.135129f, -0.031402f, -0.011451f}, + {-0.355882f, +0.046916f, +0.014863f} + }, + { + {-0.182498f, +0.322121f, +0.010241f}, + {+1.900568f, +0.091345f, -0.005709f}, + {-0.155864f, -0.137867f, -0.022653f}, + {-0.096194f, +0.031052f, -0.043575f}, + {+0.068478f, +0.049489f, -0.012186f}, + {+0.005906f, -0.039669f, +0.008576f}, + {-0.135982f, +0.042247f, -0.027610f}, + {+0.000506f, +0.073299f, +0.001993f}, + {-0.604694f, +0.032060f, -0.015018f}, + {+0.170610f, +0.053310f, -0.014928f}, + {+0.466765f, +0.037005f, +0.000603f}, + {-0.020209f, -0.054297f, -0.025128f}, + {-0.607218f, -0.049464f, -0.002105f}, + {-0.116376f, +0.048662f, +0.012616f}, + {-0.466284f, -0.037251f, +0.001009f} + }, + { + {+0.429851f, -0.176382f, +0.062340f}, + {+1.770925f, +0.083983f, +0.013377f}, + {-0.869796f, +0.077488f, +0.009019f}, + {-0.023705f, -0.132726f, +0.001520f}, + {+0.071054f, -0.018359f, +0.008061f}, + {-0.005806f, +0.025219f, -0.013189f}, + {-0.064177f, -0.056856f, -0.008916f}, + {+0.007860f, +0.019424f, +0.021845f}, + {-0.490397f, -0.047115f, -0.010762f}, + {+0.419019f, -0.069347f, -0.017210f}, + {+0.489851f, +0.015745f, +0.003572f}, + {-0.045070f, -0.044848f, -0.021676f}, + {-0.713268f, -0.002485f, -0.003409f}, + {-0.035895f, -0.001305f, +0.014503f}, + {-0.509375f, -0.004583f, -0.004560f} + }, + { + {+0.693452f, -0.037094f, +0.062983f}, + {+1.234486f, -0.230526f, -0.013903f}, + {-1.509974f, -0.095909f, +0.045554f}, + {+0.065406f, +0.021175f, +0.038088f}, + {-0.063361f, -0.057443f, +0.014041f}, + {-0.006221f, +0.032188f, -0.009996f}, + {-0.130515f, -0.002472f, +0.015272f}, + {-0.003344f, -0.063567f, -0.009796f}, + {-0.526438f, +0.016690f, +0.014095f}, + {+0.526046f, +0.043848f, +0.000937f}, + {+0.408227f, -0.051840f, -0.007626f}, + {-0.015404f, +0.050106f, +0.006338f}, + {-0.746530f, +0.019915f, +0.007159f}, + {+0.046692f, -0.012083f, -0.005406f}, + {-0.498282f, +0.022806f, +0.001661f} + }, + { + {+0.452282f, +0.255112f, +0.014429f}, + {+0.413311f, +0.217489f, -0.041553f}, + {-2.012329f, +0.132335f, +0.043582f}, + {+0.074513f, +0.072299f, +0.015550f}, + {-0.332659f, +0.110420f, -0.002506f}, + {+0.003936f, -0.025615f, +0.009662f}, + {-0.402227f, +0.102426f, +0.020003f}, + {-0.005906f, -0.045668f, -0.016305f}, + {-0.764317f, +0.087727f, +0.028390f}, + {+0.392194f, +0.052051f, +0.019617f}, + {+0.244099f, +0.046208f, -0.016359f}, + {+0.024888f, -0.005926f, +0.015739f}, + {-0.755240f, -0.000320f, +0.012387f}, + {+0.094368f, -0.019071f, -0.011155f}, + {-0.475719f, -0.010639f, +0.007195f} + }, + { + {-0.057870f, -0.243239f, -0.062681f}, + {-0.488601f, -0.132632f, -0.024105f}, + {-2.274488f, -0.075449f, +0.013122f}, + {+0.011058f, -0.050520f, -0.013955f}, + {-0.656336f, -0.066528f, -0.012634f}, + {+0.005934f, -0.022059f, +0.010016f}, + {-0.835078f, -0.150132f, +0.002332f}, + {+0.005755f, +0.039696f, +0.016335f}, + {-1.137939f, -0.147396f, +0.009474f}, + {+0.040220f, -0.141448f, +0.012427f}, + {+0.033530f, -0.028665f, -0.010546f}, + {+0.032441f, -0.020084f, +0.008702f}, + {-0.787271f, -0.022176f, +0.007828f}, + {+0.087182f, +0.017541f, +0.004303f}, + {-0.488631f, -0.013600f, +0.006335f} + }, + { + {-0.422081f, -0.034137f, -0.071137f}, + {-1.317702f, +0.095500f, +0.020761f}, + {-2.203521f, -0.058245f, -0.003414f}, + {-0.052621f, +0.004576f, -0.018473f}, + {-0.931858f, +0.015280f, +0.003861f}, + {-0.002030f, +0.024082f, -0.005542f}, + {-1.272381f, +0.091261f, -0.008863f}, + {+0.002712f, +0.062669f, +0.007167f}, + {-1.464630f, +0.073632f, -0.010550f}, + {-0.358809f, +0.117636f, -0.007999f}, + {-0.207114f, +0.038969f, +0.000934f}, + {+0.004125f, +0.030753f, -0.001828f}, + {-0.860245f, +0.028784f, +0.001523f}, + {+0.024576f, +0.027986f, +0.012469f}, + {-0.559354f, +0.029835f, +0.002076f} + }, + { + {-0.418471f, +0.201485f, +0.007778f}, + {-2.008348f, -0.127817f, +0.044194f}, + {-1.812974f, +0.155663f, +0.007154f}, + {-0.057302f, +0.036339f, -0.006424f}, + {-1.102120f, -0.021886f, +0.016993f}, + {-0.005724f, +0.008422f, -0.010341f}, + {-1.547365f, -0.012691f, +0.000618f}, + {-0.006455f, -0.004146f, -0.018260f}, + {-1.565942f, +0.034074f, -0.005038f}, + {-0.579626f, -0.009666f, -0.011630f}, + {-0.486122f, -0.068751f, +0.002643f}, + {-0.026165f, -0.017444f, -0.012012f}, + {-0.959883f, -0.022711f, -0.000128f}, + {-0.056604f, -0.047916f, +0.000561f}, + {-0.674369f, -0.030241f, +0.000001f} + }, + { + {-0.159097f, -0.096628f, +0.059657f}, + {-2.538435f, +0.144706f, +0.024837f}, + {-1.250993f, -0.158194f, +0.023835f}, + {-0.006764f, -0.032281f, +0.006504f}, + {-1.162308f, +0.024647f, +0.006024f}, + {+0.000404f, -0.028253f, +0.001927f}, + {-1.594186f, -0.024116f, +0.007975f}, + {+0.000657f, -0.056720f, +0.002178f}, + {-1.392818f, -0.090743f, +0.008086f}, + {-0.494314f, -0.073869f, -0.002863f}, + {-0.817812f, +0.078885f, -0.002734f}, + {-0.023969f, -0.022152f, -0.011768f}, + {-1.057861f, +0.010753f, +0.003473f}, + {-0.095452f, +0.011842f, -0.013010f}, + {-0.796320f, +0.019685f, +0.002381f} + }, + { + {+0.106795f, -0.039907f, +0.027045f}, + {-2.880650f, -0.045850f, +0.004655f}, + {-0.721393f, +0.083054f, +0.023238f}, + {+0.042055f, +0.002949f, +0.007039f}, + {-1.144586f, +0.016922f, -0.005027f}, + {+0.005806f, +0.000220f, +0.011669f}, + {-1.472334f, +0.053024f, +0.006261f}, + {+0.005526f, -0.021552f, +0.015425f}, + {-1.046507f, +0.096909f, +0.011310f}, + {-0.155057f, +0.102897f, -0.003142f}, + {-1.200656f, -0.053185f, +0.005988f}, + {+0.006479f, +0.042956f, +0.004210f}, + {-1.124901f, +0.007015f, +0.012676f}, + {-0.059027f, +0.036093f, -0.011452f}, + {-0.881942f, -0.000382f, +0.009400f} + }, + { + {+0.224391f, +0.041990f, -0.020747f}, + {-2.993706f, -0.110593f, +0.045578f}, + {-0.361837f, -0.012427f, +0.003973f}, + {+0.045047f, -0.001977f, +0.008463f}, + {-1.101737f, -0.064487f, +0.013918f}, + {+0.000463f, +0.034652f, -0.000132f}, + {-1.308903f, -0.082749f, +0.021321f}, + {-0.003389f, +0.043762f, -0.009812f}, + {-0.703438f, -0.078332f, +0.012588f}, + {+0.239986f, -0.105459f, -0.004102f}, + {-1.588540f, +0.021143f, +0.042305f}, + {+0.026945f, -0.008249f, +0.018680f}, + {-1.125952f, -0.020862f, +0.025801f}, + {+0.022025f, -0.049645f, +0.002105f}, + {-0.890391f, -0.016459f, +0.018642f} + }, + { + {+0.184642f, +0.006802f, -0.019893f}, + {-2.824141f, +0.108294f, +0.112373f}, + {-0.177062f, -0.000542f, -0.012326f}, + {+0.005984f, -0.027278f, +0.011800f}, + {-1.063372f, +0.044524f, +0.052246f}, + {-0.005976f, -0.002554f, -0.013353f}, + {-1.193252f, +0.058807f, +0.059389f}, + {-0.003278f, +0.045530f, -0.008896f}, + {-0.495849f, +0.044280f, +0.026054f}, + {+0.460259f, +0.060818f, +0.014226f}, + {-1.855139f, -0.040262f, +0.076546f}, + {+0.012571f, -0.046709f, +0.009176f}, + {-1.010339f, +0.013540f, +0.027012f}, + {+0.077774f, +0.022052f, +0.016078f}, + {-0.784673f, +0.018290f, +0.018712f} + }, + { + {+0.059196f, +0.003929f, +0.008106f}, + {-2.286989f, +0.059395f, +0.067545f}, + {-0.077852f, -0.011911f, -0.015109f}, + {-0.039545f, +0.079788f, -0.017441f}, + {-0.981039f, +0.057579f, +0.049746f}, + {-0.000552f, -0.040433f, -0.000008f}, + {-1.084454f, +0.063736f, +0.061257f}, + {+0.005181f, -0.015769f, +0.014975f}, + {-0.422723f, +0.031129f, +0.033909f}, + {+0.383208f, +0.054815f, +0.035686f}, + {-1.799579f, +0.095052f, +0.039004f}, + {-0.017405f, +0.047597f, -0.018931f}, + {-0.724847f, -0.012085f, -0.002971f}, + {+0.062036f, +0.032573f, +0.017405f}, + {-0.541913f, -0.020736f, -0.002764f} + }, + { + {-0.064424f, -0.057972f, +0.008713f}, + {-1.308363f, -0.023329f, -0.117920f}, + {+0.024978f, +0.018940f, -0.017833f}, + {-0.041409f, +0.034359f, -0.040056f}, + {-0.737327f, -0.102713f, -0.037075f}, + {+0.006532f, +0.001549f, +0.015583f}, + {-0.825854f, -0.147637f, -0.040942f}, + {-0.000538f, -0.057178f, -0.001505f}, + {-0.359121f, -0.115224f, -0.014199f}, + {+0.084870f, -0.184426f, +0.013420f}, + {-1.260099f, -0.008685f, -0.083395f}, + {-0.022016f, +0.040907f, -0.022277f}, + {-0.269401f, +0.076797f, -0.047683f}, + {-0.006094f, -0.075725f, -0.005918f}, + {-0.184013f, +0.067855f, -0.031593f} + }, + { + {-0.117167f, +0.041377f, -0.021705f}, + {-0.005286f, -0.490452f, -0.194448f}, + {+0.155198f, -0.050711f, -0.018485f}, + {+0.015691f, -0.177032f, +0.028815f}, + {-0.261721f, -0.126923f, -0.117957f}, + {-0.001443f, +0.059448f, -0.006308f}, + {-0.297654f, -0.116815f, -0.152479f}, + {-0.004210f, -0.031336f, -0.011520f}, + {-0.164335f, +0.005438f, -0.094020f}, + {-0.203847f, +0.164839f, -0.058303f}, + {-0.306030f, -0.376503f, -0.134389f}, + {+0.006748f, -0.086010f, +0.020030f}, + {+0.241259f, -0.209968f, -0.039860f}, + {-0.057865f, +0.023108f, -0.033416f}, + {+0.191475f, -0.147918f, -0.022810f} + }, + { + {-0.073701f, +0.086750f, -0.017560f}, + {+1.157381f, +0.858247f, +0.080234f}, + {+0.264439f, +0.078190f, +0.005441f}, + {+0.042456f, -0.106574f, +0.053490f}, + {+0.322579f, +0.471662f, -0.015999f}, + {-0.005002f, +0.040697f, -0.013144f}, + {+0.387873f, +0.592479f, -0.033125f}, + {+0.003996f, +0.027493f, +0.012375f}, + {+0.175212f, +0.327771f, -0.050066f}, + {-0.266658f, +0.119865f, -0.073006f}, + {+0.660959f, +0.665150f, +0.060775f}, + {+0.019457f, -0.064679f, +0.026033f}, + {+0.590790f, +0.209203f, +0.049770f}, + {-0.039846f, +0.104179f, -0.009259f}, + {+0.430095f, +0.124670f, +0.034507f} + }, + { + {+0.015367f, -0.099705f, +0.036338f}, + {+1.530494f, +0.036774f, +0.350316f}, + {+0.277896f, -0.003918f, +0.035655f}, + {-0.003804f, +0.159634f, -0.044149f}, + {+0.682415f, -0.226467f, +0.187620f}, + {+0.004102f, -0.024392f, +0.012576f}, + {+0.834371f, -0.332024f, +0.240896f}, + {-0.000994f, +0.060943f, -0.002091f}, + {+0.464117f, -0.301330f, +0.133821f}, + {-0.094158f, -0.316746f, +0.050929f}, + {+1.074692f, -0.033490f, +0.268560f}, + {-0.002143f, +0.070225f, -0.023541f}, + {+0.591353f, +0.126955f, +0.093164f}, + {+0.014835f, -0.051686f, +0.039038f}, + {+0.415721f, +0.099070f, +0.055525f} + }, + { + {+0.047807f, -0.115000f, +0.024628f}, + {+0.871819f, -1.450842f, -0.069675f}, + {+0.169285f, -0.151101f, +0.004566f}, + {-0.014797f, +0.200909f, -0.018973f}, + {+0.527658f, -0.674417f, +0.060727f}, + {+0.000099f, -0.058315f, -0.002464f}, + {+0.652333f, -0.864218f, +0.089751f}, + {-0.001060f, +0.060127f, -0.001254f}, + {+0.421733f, -0.443065f, +0.098482f}, + {+0.075732f, -0.083156f, +0.106738f}, + {+0.675379f, -1.072888f, -0.031008f}, + {-0.006396f, +0.098834f, -0.007631f}, + {+0.270175f, -0.451499f, -0.058713f}, + {+0.025847f, -0.121016f, +0.008121f}, + {+0.187943f, -0.284727f, -0.042036f} + } +}; + +const float rightHRIRImag[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS]= +{ + { + {-0.252426f, +0.362976f, -0.101272f}, + {+0.009746f, +0.032135f, -0.001005f}, + {-0.041389f, +0.219559f, -0.075244f}, + {-0.199783f, +0.476644f, -0.136155f}, + {+0.021832f, -0.202850f, +0.068670f}, + {-0.094399f, +0.626886f, -0.231894f}, + {+0.021343f, -0.250501f, +0.092969f}, + {-0.080197f, +0.572932f, -0.224147f}, + {+0.016573f, -0.239649f, +0.093367f}, + {-0.223408f, +0.321501f, -0.094987f}, + {+0.019084f, +0.136843f, -0.058073f}, + {-0.193077f, +0.654617f, -0.206180f}, + {-0.001692f, -0.041298f, +0.024983f}, + {-0.259689f, +0.369748f, -0.091616f}, + {-0.024623f, -0.055420f, +0.031858f} + }, + { + {-0.568159f, +0.333352f, -0.050823f}, + {+0.057589f, -0.094837f, -0.050323f}, + {-0.058363f, +0.033201f, -0.148437f}, + {-0.336362f, +0.338097f, -0.146507f}, + {-0.050666f, -0.220071f, +0.062671f}, + {-0.060818f, +0.867063f, -0.135030f}, + {-0.047671f, -0.288102f, +0.082913f}, + {-0.016662f, +1.031577f, -0.040322f}, + {-0.040486f, -0.341719f, +0.058177f}, + {-0.504799f, +0.424764f, +0.012327f}, + {+0.086011f, +0.193655f, -0.051669f}, + {-0.288338f, +0.471356f, -0.244582f}, + {-0.040577f, -0.173098f, -0.025333f}, + {-0.537558f, +0.205535f, -0.090137f}, + {-0.107401f, -0.185766f, -0.009351f} + }, + { + {-0.603783f, +0.016898f, +0.088263f}, + {+0.185461f, -0.259517f, -0.028611f}, + {+0.085783f, -0.585360f, +0.077994f}, + {-0.098432f, -0.240320f, +0.014376f}, + {-0.275727f, +0.151657f, -0.034942f}, + {+0.091867f, -0.134897f, +0.226004f}, + {-0.224813f, +0.096682f, -0.029791f}, + {+0.091102f, +0.252623f, +0.260884f}, + {-0.160867f, +0.120802f, -0.107958f}, + {-0.648021f, +0.366402f, +0.053859f}, + {+0.148482f, -0.127157f, +0.066761f}, + {+0.006657f, -0.551679f, +0.076549f}, + {-0.086806f, -0.182923f, -0.027078f}, + {-0.394359f, -0.137418f, +0.015442f}, + {-0.187386f, -0.124531f, -0.027416f} + }, + { + {-0.445141f, -0.203431f, -0.037600f}, + {+0.295099f, +0.204033f, +0.112117f}, + {+0.185293f, -0.198122f, +0.212327f}, + {+0.201802f, +0.127793f, +0.061482f}, + {-0.499831f, -0.001755f, -0.037616f}, + {+0.032573f, -0.572286f, +0.052378f}, + {-0.355382f, +0.059109f, -0.008126f}, + {-0.044020f, -0.726248f, -0.126557f}, + {-0.197342f, +0.235689f, -0.052018f}, + {-0.637301f, +0.225391f, -0.013606f}, + {+0.088356f, -0.356045f, -0.015711f}, + {+0.255444f, -0.000553f, +0.210836f}, + {-0.172744f, -0.022208f, +0.050545f}, + {-0.000691f, +0.123680f, +0.022293f}, + {-0.269532f, +0.005153f, +0.038296f} + }, + { + {-0.034797f, -0.385321f, -0.036494f}, + {+0.201556f, +0.345365f, +0.086457f}, + {+0.060960f, +0.460193f, -0.040799f}, + {+0.291890f, -0.017826f, +0.107892f}, + {-0.614672f, -0.046146f, -0.003786f}, + {-0.069383f, +0.071169f, -0.167274f}, + {-0.394941f, -0.025263f, +0.024793f}, + {-0.053934f, -0.644582f, -0.152850f}, + {-0.193963f, -0.007123f, +0.041127f}, + {-0.422552f, +0.101268f, +0.008593f}, + {+0.018473f, -0.189563f, -0.064795f}, + {+0.164459f, +0.445370f, +0.061512f}, + {-0.373705f, +0.214293f, -0.005754f}, + {+0.371780f, -0.112349f, +0.034345f}, + {-0.430525f, +0.157644f, +0.002400f} + }, + { + {+0.416182f, -0.095722f, -0.007744f}, + {-0.033928f, -0.466322f, -0.173216f}, + {-0.106258f, +0.101293f, -0.149492f}, + {+0.055241f, -0.502163f, -0.010316f}, + {-0.586638f, +0.109680f, +0.043164f}, + {-0.029521f, +0.389459f, -0.043642f}, + {-0.347625f, +0.011068f, +0.020946f}, + {+0.069354f, +0.253582f, +0.197218f}, + {-0.208450f, -0.113945f, +0.001564f}, + {-0.100593f, +0.188326f, -0.015623f}, + {+0.011284f, -0.023345f, +0.010578f}, + {-0.116804f, -0.258300f, -0.124299f}, + {-0.565508f, +0.009708f, -0.043984f}, + {+0.455115f, -0.088408f, +0.031182f}, + {-0.599852f, +0.019181f, -0.018817f} + }, + { + {+0.654728f, -0.125950f, -0.057210f}, + {-0.101926f, -0.468060f, -0.163914f}, + {-0.210669f, -0.374096f, +0.059232f}, + {-0.221043f, +0.001447f, -0.140044f}, + {-0.486236f, +0.078621f, +0.035746f}, + {+0.053275f, -0.117460f, +0.128891f}, + {-0.251634f, +0.002394f, +0.006412f}, + {+0.004540f, +0.716656f, +0.012490f}, + {-0.195937f, +0.017044f, -0.045101f}, + {+0.269818f, -0.023344f, +0.001404f}, + {-0.023876f, +0.086943f, -0.041043f}, + {-0.229349f, -0.155556f, -0.131557f}, + {-0.632528f, -0.064904f, +0.001583f}, + {+0.218817f, +0.137571f, -0.000827f}, + {-0.701220f, +0.002936f, +0.011380f} + }, + { + {+0.607297f, +0.091323f, +0.041776f}, + {-0.019803f, +0.350390f, +0.128080f}, + {-0.391531f, -0.296612f, +0.114777f}, + {-0.213069f, +0.267362f, -0.038309f}, + {-0.374457f, -0.035043f, -0.027502f}, + {+0.031530f, -0.308567f, +0.054617f}, + {-0.149953f, +0.004022f, -0.006847f}, + {-0.060647f, +0.237990f, -0.169946f}, + {-0.130768f, +0.112539f, -0.020612f}, + {+0.554477f, +0.122937f, +0.003398f}, + {-0.070530f, +0.176350f, -0.003859f}, + {-0.052411f, +0.382981f, +0.023069f}, + {-0.576269f, +0.024040f, +0.021559f}, + {-0.136160f, -0.144065f, -0.033829f}, + {-0.712362f, -0.021407f, +0.002869f} + }, + { + {+0.202885f, +0.354603f, +0.019837f}, + {-0.144775f, +0.366539f, +0.125312f}, + {-0.656706f, +0.285160f, -0.069621f}, + {-0.009022f, -0.142351f, +0.058751f}, + {-0.236700f, -0.120155f, -0.015090f}, + {-0.041823f, +0.131862f, -0.096368f}, + {-0.065125f, -0.004127f, -0.017607f}, + {+0.031817f, -0.431640f, +0.092903f}, + {-0.062407f, -0.054740f, +0.027981f}, + {+0.663648f, +0.083368f, +0.001657f}, + {-0.213850f, +0.126299f, +0.042829f}, + {+0.168107f, -0.041019f, +0.123804f}, + {-0.446160f, +0.001760f, +0.001401f}, + {-0.359231f, -0.037169f, -0.034599f}, + {-0.618696f, -0.035619f, -0.011711f} + }, + { + {-0.315897f, -0.116498f, -0.057578f}, + {-0.517408f, -0.311914f, -0.066345f}, + {-0.808547f, +0.208921f, -0.065451f}, + {+0.164991f, +0.012492f, +0.077849f}, + {-0.108486f, +0.036464f, +0.025206f}, + {-0.032037f, +0.236625f, -0.053914f}, + {-0.006924f, +0.066595f, -0.001710f}, + {+0.030739f, -0.432245f, +0.086307f}, + {-0.081416f, -0.127101f, -0.000295f}, + {+0.563338f, -0.042869f, -0.028584f}, + {-0.483248f, -0.169301f, -0.023816f}, + {+0.161044f, -0.238438f, +0.047974f}, + {-0.307294f, +0.056650f, -0.003561f}, + {-0.321523f, +0.137994f, +0.021609f}, + {-0.457444f, +0.096629f, +0.009126f} + }, + { + {-0.605373f, -0.061921f, -0.015945f}, + {-0.892316f, -0.064427f, -0.076962f}, + {-0.844181f, -0.108187f, +0.060583f}, + {+0.147378f, +0.251909f, -0.002167f}, + {-0.056134f, +0.102552f, -0.013769f}, + {+0.030720f, -0.133909f, +0.071835f}, + {-0.012891f, +0.033628f, +0.010795f}, + {-0.039999f, +0.087749f, -0.113515f}, + {-0.195165f, -0.000390f, -0.029825f}, + {+0.318943f, +0.044776f, -0.017514f}, + {-0.741169f, -0.000583f, -0.039531f}, + {-0.025961f, +0.151539f, -0.045602f}, + {-0.221333f, -0.019419f, +0.013435f}, + {-0.103050f, -0.017712f, +0.036895f}, + {-0.317124f, +0.007329f, +0.019107f} + }, + { + {-0.557984f, +0.065875f, +0.016445f}, + {-1.120903f, +0.080144f, +0.018175f}, + {-0.884231f, -0.135269f, +0.046808f}, + {+0.003216f, -0.028481f, -0.075145f}, + {-0.077929f, +0.058728f, -0.030673f}, + {+0.033662f, -0.151371f, +0.062117f}, + {-0.115087f, -0.059276f, -0.010281f}, + {-0.004131f, +0.344596f, -0.009515f}, + {-0.374813f, +0.000125f, +0.004524f}, + {-0.004833f, -0.037361f, +0.004495f}, + {-0.912750f, +0.037851f, +0.003038f}, + {-0.163112f, -0.012573f, -0.067595f}, + {-0.220544f, -0.058016f, +0.001506f}, + {+0.140668f, -0.036371f, -0.019325f}, + {-0.259778f, -0.046839f, -0.011680f} + }, + { + {-0.246497f, -0.109675f, +0.016140f}, + {-1.221626f, +0.047632f, +0.030008f}, + {-0.933392f, +0.056681f, -0.017499f}, + {-0.091651f, -0.139042f, -0.010254f}, + {-0.171095f, -0.041605f, +0.026621f}, + {-0.022645f, +0.182086f, -0.051792f}, + {-0.290514f, +0.010188f, -0.006824f}, + {+0.030810f, +0.083175f, +0.086532f}, + {-0.627425f, +0.108951f, +0.002544f}, + {-0.328857f, +0.063032f, +0.021845f}, + {-1.020831f, +0.019057f, +0.020782f}, + {-0.108081f, -0.130444f, -0.042983f}, + {-0.280032f, +0.046473f, -0.028272f}, + {+0.300294f, -0.091279f, -0.028877f}, + {-0.277472f, -0.015706f, -0.019343f} + }, + { + {+0.131072f, +0.074700f, +0.013352f}, + {-1.261601f, +0.026191f, +0.017613f}, + {-0.941829f, +0.046886f, -0.012836f}, + {-0.099901f, +0.012862f, +0.045621f}, + {-0.353481f, -0.137929f, +0.022451f}, + {-0.034480f, +0.136115f, -0.065105f}, + {-0.510801f, -0.045980f, +0.009742f}, + {-0.008255f, -0.204740f, -0.025135f}, + {-0.917422f, -0.048406f, -0.014328f}, + {-0.570501f, -0.078591f, +0.011175f}, + {-1.116831f, -0.043151f, +0.008325f}, + {+0.072193f, +0.210025f, +0.034944f}, + {-0.356994f, +0.057193f, -0.012919f}, + {+0.288756f, +0.034341f, +0.021124f}, + {-0.354704f, +0.011735f, +0.004829f} + }, + { + {+0.375845f, -0.029667f, +0.011368f}, + {-1.310698f, +0.011707f, +0.036488f}, + {-0.895246f, -0.026384f, +0.007846f}, + {-0.049179f, +0.069581f, +0.012119f}, + {-0.539669f, +0.067904f, -0.021122f}, + {+0.015114f, -0.158721f, +0.035543f}, + {-0.731214f, +0.055761f, +0.008363f}, + {-0.020681f, -0.110429f, -0.057197f}, + {-1.186932f, -0.029288f, +0.024750f}, + {-0.638496f, -0.003542f, -0.003329f}, + {-1.242362f, +0.046396f, -0.006496f}, + {+0.162585f, +0.000949f, +0.094194f}, + {-0.460859f, +0.005487f, +0.022316f}, + {+0.084492f, +0.100943f, +0.035245f}, + {-0.480357f, +0.043083f, +0.013686f} + }, + { + {+0.406719f, -0.063903f, +0.000895f}, + {-1.388116f, -0.121591f, +0.007121f}, + {-0.797164f, +0.024786f, +0.007914f}, + {+0.031219f, -0.031898f, -0.043192f}, + {-0.611124f, +0.038377f, -0.017126f}, + {+0.035199f, -0.054815f, +0.069678f}, + {-0.880465f, -0.025975f, +0.004620f}, + {+0.011721f, +0.131907f, +0.033689f}, + {-1.404186f, -0.094670f, +0.041334f}, + {-0.488232f, +0.072899f, +0.000864f}, + {-1.400823f, +0.006498f, +0.005128f}, + {+0.048912f, -0.264371f, +0.026588f}, + {-0.620764f, -0.091278f, +0.009966f}, + {-0.190119f, -0.153548f, -0.003990f}, + {-0.612140f, -0.044609f, +0.004905f} + }, + { + {+0.269059f, +0.096072f, -0.030661f}, + {-1.405102f, +0.019830f, -0.041741f}, + {-0.666786f, -0.023527f, +0.003952f}, + {+0.103468f, -0.138650f, -0.020612f}, + {-0.530962f, -0.087680f, +0.015089f}, + {-0.007181f, +0.202330f, -0.016542f}, + {-0.902420f, -0.004413f, +0.001425f}, + {+0.015712f, +0.105410f, +0.042774f}, + {-1.502401f, +0.093998f, -0.011299f}, + {-0.172241f, -0.083614f, +0.002581f}, + {-1.569118f, +0.036845f, +0.024497f}, + {-0.122389f, +0.164027f, -0.092715f}, + {-0.803267f, +0.042103f, -0.008593f}, + {-0.336065f, +0.028532f, -0.040891f}, + {-0.693482f, +0.032583f, -0.008445f} + }, + { + {+0.082021f, +0.015295f, -0.029273f}, + {-1.274381f, +0.177341f, -0.005087f}, + {-0.535412f, +0.022470f, +0.000520f}, + {+0.102058f, +0.071973f, +0.060127f}, + {-0.334115f, +0.039818f, +0.029288f}, + {-0.041062f, +0.003639f, -0.089029f}, + {-0.777172f, +0.053097f, +0.001406f}, + {-0.016470f, -0.131625f, -0.046620f}, + {-1.386620f, +0.100585f, -0.027634f}, + {+0.188348f, +0.085604f, +0.000778f}, + {-1.702053f, -0.064478f, +0.010836f}, + {-0.128587f, +0.202289f, -0.078786f}, + {-0.951614f, -0.008596f, -0.000227f}, + {-0.238200f, +0.121028f, -0.027134f}, + {-0.684947f, +0.039724f, -0.008766f} + }, + { + {-0.078962f, -0.040667f, +0.016621f}, + {-1.051815f, -0.065291f, +0.046901f}, + {-0.425406f, -0.012300f, -0.003324f}, + {-0.013857f, +0.185133f, +0.044846f}, + {-0.085264f, +0.021495f, -0.004172f}, + {+0.008706f, -0.314572f, +0.024262f}, + {-0.536045f, -0.067146f, +0.005754f}, + {-0.009257f, -0.187894f, -0.025034f}, + {-1.076846f, -0.153133f, +0.012899f}, + {+0.453290f, -0.035443f, -0.000604f}, + {-1.728620f, -0.002351f, -0.006254f}, + {+0.028237f, -0.256334f, +0.056283f}, + {-1.033293f, +0.006471f, +0.006369f}, + {+0.028364f, -0.161171f, +0.022674f}, + {-0.592133f, -0.068085f, +0.014448f} + }, + { + {-0.209567f, -0.044476f, +0.035293f}, + {-0.850866f, -0.060081f, +0.012367f}, + {-0.352597f, +0.002936f, -0.009918f}, + {-0.139788f, -0.163686f, -0.057909f}, + {+0.156716f, +0.020900f, -0.046467f}, + {+0.041202f, -0.126721f, +0.092016f}, + {-0.265746f, +0.022469f, -0.007668f}, + {+0.020433f, +0.027610f, +0.057030f}, + {-0.719398f, +0.058103f, +0.026893f}, + {+0.529109f, -0.009487f, -0.002510f}, + {-1.617744f, +0.065441f, -0.000589f}, + {+0.126800f, -0.104142f, +0.086642f}, + {-1.030739f, +0.027576f, +0.012449f}, + {+0.254306f, +0.004748f, +0.039010f}, + {-0.469348f, +0.001329f, +0.019123f} + }, + { + {-0.291614f, +0.072045f, +0.008669f}, + {-0.704994f, -0.001857f, -0.032356f}, + {-0.330377f, -0.015398f, -0.008902f}, + {-0.118408f, -0.127022f, -0.077956f}, + {+0.305490f, -0.088217f, -0.038597f}, + {-0.013990f, +0.238166f, -0.042427f}, + {-0.076791f, -0.013279f, -0.031489f}, + {-0.000655f, +0.182834f, -0.002752f}, + {-0.466729f, +0.029245f, -0.006311f}, + {+0.413278f, +0.058930f, -0.004232f}, + {-1.412340f, -0.081834f, +0.017017f}, + {+0.059815f, +0.180823f, -0.005402f}, + {-0.948672f, -0.013302f, +0.015703f}, + {+0.280636f, +0.098387f, -0.001029f}, + {-0.353125f, +0.011691f, -0.002686f} + }, + { + {-0.282982f, -0.038705f, -0.033749f}, + {-0.612204f, +0.074957f, -0.016719f}, + {-0.367094f, +0.018672f, +0.009545f}, + {+0.043674f, +0.265484f, +0.033672f}, + {+0.225838f, +0.044458f, +0.015442f}, + {-0.031796f, +0.152994f, -0.068402f}, + {-0.080339f, +0.026791f, -0.023361f}, + {-0.018979f, +0.050781f, -0.052748f}, + {-0.414119f, -0.046068f, -0.045478f}, + {+0.184054f, -0.070437f, -0.009958f}, + {-1.197874f, +0.025145f, +0.019789f}, + {-0.059848f, -0.044696f, -0.055601f}, + {-0.806769f, -0.004366f, -0.003547f}, + {+0.123667f, -0.047399f, -0.021850f}, + {-0.243914f, +0.012959f, -0.017814f} + }, + { + {-0.153592f, -0.151600f, -0.017359f}, + {-0.590457f, -0.027426f, +0.018181f}, + {-0.453375f, +0.040800f, +0.019251f}, + {+0.150267f, +0.058092f, +0.087405f}, + {-0.185914f, +0.157884f, +0.040381f}, + {+0.012941f, -0.147200f, +0.041441f}, + {-0.370093f, +0.045367f, +0.013384f}, + {+0.009851f, -0.159545f, +0.028260f}, + {-0.596085f, -0.026446f, -0.026980f}, + {-0.043489f, +0.034739f, -0.009117f}, + {-1.036040f, +0.005581f, +0.001597f}, + {-0.094605f, -0.081505f, -0.032452f}, + {-0.624380f, -0.045262f, -0.019488f}, + {-0.090928f, +0.014499f, +0.000113f}, + {-0.149839f, -0.036428f, -0.016043f} + }, + { + {+0.052738f, +0.128373f, +0.055065f}, + {-0.648165f, -0.063534f, +0.014939f}, + {-0.535241f, -0.069858f, -0.003891f}, + {+0.080904f, -0.219110f, -0.004018f}, + {-0.862572f, -0.266262f, +0.001282f}, + {+0.021715f, -0.125505f, +0.042828f}, + {-0.953088f, -0.182441f, +0.026892f}, + {+0.012421f, -0.141361f, +0.034156f}, + {-1.016573f, -0.044623f, +0.035676f}, + {-0.187252f, -0.004255f, -0.001005f}, + {-0.924930f, +0.018852f, -0.007346f}, + {-0.020719f, +0.099660f, +0.014347f}, + {-0.455082f, +0.062356f, -0.011024f}, + {-0.233378f, -0.040900f, +0.007062f}, + {-0.108207f, +0.031087f, -0.001307f} + }, + { + {+0.226352f, +0.134898f, +0.027173f}, + {-0.738046f, +0.053142f, -0.010563f}, + {-0.525795f, -0.013450f, -0.023475f}, + {-0.054340f, +0.020378f, -0.061004f}, + {-1.543326f, +0.137991f, -0.026188f}, + {-0.007143f, +0.068869f, -0.026710f}, + {-1.676436f, +0.213947f, +0.006985f}, + {-0.014554f, +0.055501f, -0.041156f}, + {-1.624133f, +0.228046f, +0.038888f}, + {-0.232392f, -0.012564f, +0.005502f}, + {-0.831934f, -0.022901f, -0.002870f}, + {+0.065274f, -0.013643f, +0.033485f}, + {-0.389275f, -0.026324f, +0.006822f}, + {-0.220736f, +0.001711f, -0.013541f}, + {-0.174428f, +0.030208f, +0.007158f} + }, + { + {+0.331098f, -0.099058f, -0.081219f}, + {-0.781969f, +0.015664f, -0.013942f}, + {-0.399112f, +0.065288f, -0.017726f}, + {-0.109110f, +0.110856f, -0.010673f}, + {-1.960453f, -0.000653f, -0.004832f}, + {-0.015007f, +0.052007f, -0.026966f}, + {-2.276175f, -0.117004f, -0.008654f}, + {-0.004171f, +0.131564f, -0.010820f}, + {-2.233906f, -0.204725f, -0.015921f}, + {-0.215465f, +0.015363f, +0.009391f}, + {-0.729841f, +0.018581f, -0.003238f}, + {+0.069211f, -0.051734f, +0.019397f}, + {-0.496172f, -0.058743f, +0.011723f}, + {-0.059531f, +0.087080f, -0.014858f}, + {-0.371337f, -0.073601f, +0.000564f} + }, + { + {+0.371202f, -0.175497f, -0.069389f}, + {-0.738388f, -0.046375f, +0.001540f}, + {-0.243317f, -0.061346f, -0.005711f}, + {-0.062802f, -0.017672f, +0.025304f}, + {-2.013822f, -0.062939f, +0.018690f}, + {+0.000148f, -0.050504f, +0.007953f}, + {-2.537886f, -0.015602f, -0.003764f}, + {+0.014190f, -0.003088f, +0.039676f}, + {-2.599729f, -0.021614f, -0.019729f}, + {-0.186255f, -0.001947f, +0.009920f}, + {-0.608148f, -0.036370f, -0.003399f}, + {-0.003043f, +0.077274f, -0.008375f}, + {-0.764126f, +0.104237f, -0.001366f}, + {+0.136964f, -0.089478f, +0.011296f}, + {-0.653928f, +0.065157f, -0.001655f} + }, + { + {+0.253340f, +0.170035f, +0.072899f}, + {-0.620704f, +0.040857f, +0.012465f}, + {-0.210596f, +0.006273f, +0.005387f}, + {+0.024043f, -0.024581f, -0.001278f}, + {-1.779665f, +0.104163f, +0.030959f}, + {+0.012593f, +0.002121f, +0.023380f}, + {-2.419311f, +0.123795f, +0.018778f}, + {-0.001873f, -0.121782f, -0.005835f}, + {-2.610043f, +0.113399f, +0.029507f}, + {-0.167639f, -0.008441f, +0.006329f}, + {-0.480872f, +0.036381f, +0.002730f}, + {-0.066072f, -0.025598f, -0.031514f}, + {-1.096432f, -0.082483f, -0.012006f}, + {+0.224041f, -0.003983f, +0.025833f}, + {-0.939740f, -0.061596f, +0.000882f} + }, + { + {-0.114798f, +0.231748f, +0.119242f}, + {-0.474089f, -0.005093f, +0.005082f}, + {-0.429108f, +0.096054f, +0.004364f}, + {+0.087354f, -0.045661f, -0.007546f}, + {-1.434480f, -0.060092f, +0.030100f}, + {+0.004089f, +0.061414f, +0.003486f}, + {-2.057338f, -0.122529f, +0.040767f}, + {-0.012502f, -0.045235f, -0.034722f}, + {-2.339244f, -0.067656f, +0.043250f}, + {-0.141971f, +0.005629f, +0.000253f}, + {-0.374704f, -0.009361f, +0.003183f}, + {-0.048209f, -0.073759f, -0.019619f}, + {-1.378250f, +0.025851f, -0.005617f}, + {+0.144419f, +0.089299f, +0.008712f}, + {-1.150667f, +0.030632f, +0.000355f} + }, + { + {-0.562947f, -0.375237f, -0.012263f}, + {-0.348716f, -0.013477f, -0.018911f}, + {-0.909858f, -0.140937f, -0.002793f}, + {+0.076015f, +0.018412f, +0.022057f}, + {-1.133854f, +0.011460f, +0.009135f}, + {-0.011616f, -0.019120f, -0.023590f}, + {-1.657263f, +0.041045f, +0.032704f}, + {+0.007833f, +0.103215f, +0.022494f}, + {-1.929738f, +0.064243f, +0.020197f}, + {-0.070913f, +0.018250f, -0.003996f}, + {-0.304411f, -0.008931f, -0.007043f}, + {+0.024458f, +0.080595f, +0.019551f}, + {-1.543561f, +0.014986f, +0.014525f}, + {-0.026833f, -0.079269f, -0.017534f}, + {-1.243643f, +0.016723f, +0.007671f} + }, + { + {-0.694549f, +0.017049f, -0.121802f}, + {-0.298745f, -0.002258f, -0.035550f}, + {-1.533048f, +0.138236f, +0.001729f}, + {-0.010659f, +0.088690f, +0.016338f}, + {-0.936621f, +0.006483f, -0.016463f}, + {-0.005273f, -0.066631f, -0.006502f}, + {-1.351069f, +0.010889f, -0.001760f}, + {+0.007200f, +0.108283f, +0.019668f}, + {-1.507596f, -0.062294f, +0.000600f}, + {+0.066412f, -0.038573f, -0.004741f}, + {-0.271104f, -0.000976f, -0.015561f}, + {+0.061730f, +0.017448f, +0.034569f}, + {-1.591535f, -0.003139f, +0.026563f}, + {-0.154019f, +0.003402f, -0.022846f}, + {-1.228280f, -0.026953f, +0.019401f} + }, + { + {-0.303960f, +0.374644f, -0.062934f}, + {-0.403804f, +0.013608f, -0.021139f}, + {-2.124203f, -0.124967f, +0.003990f}, + {-0.091464f, -0.074091f, -0.027034f}, + {-0.833001f, +0.025492f, -0.024241f}, + {+0.009573f, +0.013314f, +0.020543f}, + {-1.159470f, +0.003590f, -0.030274f}, + {-0.010154f, -0.018411f, -0.028732f}, + {-1.158548f, +0.046445f, -0.013083f}, + {+0.243504f, +0.038902f, -0.007197f}, + {-0.281374f, +0.016568f, -0.009188f}, + {+0.022548f, -0.093695f, +0.003504f}, + {-1.548756f, -0.015848f, +0.014389f}, + {-0.155501f, +0.061060f, -0.003811f}, + {-1.143217f, +0.000379f, +0.015268f} + }, + { + {+0.345133f, -0.316244f, +0.057317f}, + {-0.754172f, +0.047356f, +0.017128f}, + {-2.527297f, +0.036708f, +0.007460f}, + {-0.077697f, -0.059210f, -0.036987f}, + {-0.809344f, -0.040779f, -0.004786f}, + {+0.005609f, +0.047560f, +0.007549f}, + {-1.058183f, -0.053650f, -0.024975f}, + {-0.001284f, -0.083106f, -0.002993f}, + {-0.927106f, -0.045705f, -0.016523f}, + {+0.387520f, -0.025713f, -0.011614f}, + {-0.356838f, +0.005268f, +0.005530f}, + {-0.038913f, +0.041146f, -0.031965f}, + {-1.430253f, -0.015935f, -0.004184f}, + {-0.055606f, -0.056822f, +0.018159f}, + {-1.016503f, -0.006305f, -0.002495f} + }, + { + {+0.741400f, -0.009809f, +0.083165f}, + {-1.377624f, -0.186837f, +0.033433f}, + {-2.661220f, +0.055216f, +0.033016f}, + {+0.020144f, +0.131421f, +0.012022f}, + {-0.877243f, -0.007797f, +0.016913f}, + {-0.006896f, -0.020841f, -0.015267f}, + {-1.053072f, +0.040270f, +0.005590f}, + {+0.008643f, -0.009871f, +0.024095f}, + {-0.840621f, +0.031127f, -0.003468f}, + {+0.409452f, +0.009674f, -0.007146f}, + {-0.513242f, -0.056059f, +0.008039f}, + {-0.045767f, +0.069574f, -0.019470f}, + {-1.249764f, +0.063596f, -0.003911f}, + {+0.055746f, -0.007574f, +0.014735f}, + {-0.861503f, +0.047121f, -0.007384f} + }, + { + {+0.596605f, +0.213550f, +0.033039f}, + {-2.158506f, +0.248088f, +0.006335f}, + {-2.533200f, -0.054742f, +0.053044f}, + {+0.090988f, +0.003376f, +0.044057f}, + {-1.031360f, +0.063967f, +0.017460f}, + {-0.006156f, -0.035131f, -0.009519f}, + {-1.171621f, +0.030730f, +0.026937f}, + {-0.001937f, +0.068607f, -0.005942f}, + {-0.903039f, +0.004797f, +0.018222f}, + {+0.251493f, +0.029150f, +0.010360f}, + {-0.728222f, +0.070497f, -0.002636f}, + {+0.001084f, -0.056417f, +0.016060f}, + {-1.046985f, -0.062004f, +0.008675f}, + {+0.108840f, +0.028879f, -0.008008f}, + {-0.705411f, -0.049357f, +0.002544f} + }, + { + {+0.055090f, -0.271277f, -0.026731f}, + {-2.857675f, -0.128580f, -0.013488f}, + {-2.176794f, +0.034141f, +0.031881f}, + {+0.057748f, -0.110260f, +0.008245f}, + {-1.209063f, -0.074028f, +0.000038f}, + {+0.004858f, +0.026786f, +0.011441f}, + {-1.387072f, -0.091682f, +0.021904f}, + {-0.007031f, +0.031892f, -0.019502f}, + {-1.058712f, -0.067944f, +0.024260f}, + {-0.062852f, -0.093720f, +0.021531f}, + {-0.946341f, -0.039683f, -0.007015f}, + {+0.037379f, -0.017809f, +0.020177f}, + {-0.874955f, +0.023509f, +0.011931f}, + {+0.093743f, +0.005046f, -0.012655f}, + {-0.588414f, +0.019414f, +0.008224f} + }, + { + {-0.459530f, +0.136066f, -0.073104f}, + {-3.261738f, -0.024600f, +0.013505f}, + {-1.606635f, -0.095137f, -0.008278f}, + {-0.027839f, +0.040584f, -0.027111f}, + {-1.308314f, +0.002009f, -0.008574f}, + {+0.006117f, +0.028262f, +0.010087f}, + {-1.582156f, +0.076989f, -0.000076f}, + {+0.004701f, -0.054472f, +0.013482f}, + {-1.176358f, +0.072778f, +0.000525f}, + {-0.404515f, +0.119170f, +0.007549f}, + {-1.119820f, +0.006109f, +0.003297f}, + {+0.026968f, +0.037327f, +0.002351f}, + {-0.760010f, +0.000475f, +0.003831f}, + {+0.032179f, -0.007958f, +0.004584f}, + {-0.531835f, +0.006711f, +0.004916f} + }, + { + {-0.579324f, +0.156987f, -0.050289f}, + {-3.304399f, +0.077327f, +0.052783f}, + {-0.863150f, +0.193423f, -0.021526f}, + {-0.071817f, +0.030805f, -0.019184f}, + {-1.255216f, +0.067889f, +0.008066f}, + {-0.002992f, -0.024081f, -0.007690f}, + {-1.602102f, +0.025362f, -0.010273f}, + {+0.004416f, -0.057385f, +0.012021f}, + {-1.097993f, +0.039942f, -0.019089f}, + {-0.584562f, -0.037493f, -0.014374f}, + {-1.235605f, -0.005922f, +0.015507f}, + {-0.010203f, -0.022657f, -0.009280f}, + {-0.684984f, +0.004473f, -0.003007f}, + {-0.044953f, -0.029593f, +0.011150f}, + {-0.519957f, -0.010997f, -0.000436f} + }, + { + {-0.286410f, -0.259148f, +0.037277f}, + {-3.042752f, -0.055240f, +0.055762f}, + {-0.076425f, -0.208846f, -0.004764f}, + {-0.041537f, -0.048621f, +0.001905f}, + {-1.057524f, -0.054711f, +0.019597f}, + {-0.005778f, -0.014973f, -0.010026f}, + {-1.366191f, -0.115170f, +0.002752f}, + {-0.006355f, +0.021219f, -0.017995f}, + {-0.757989f, -0.145344f, -0.007538f}, + {-0.474765f, -0.088378f, -0.013868f}, + {-1.303781f, +0.019691f, +0.015466f}, + {-0.031836f, -0.000935f, -0.011965f}, + {-0.608126f, -0.022180f, -0.002375f}, + {-0.094679f, +0.034251f, -0.002925f}, + {-0.508460f, -0.004149f, -0.001651f} + }, + { + {+0.114954f, +0.059631f, +0.072965f}, + {-2.561481f, +0.058009f, +0.020761f}, + {+0.560215f, +0.119741f, +0.009368f}, + {+0.023665f, +0.026771f, +0.013776f}, + {-0.778586f, +0.037376f, +0.005470f}, + {+0.001141f, +0.025569f, +0.003541f}, + {-0.934860f, +0.119001f, +0.012968f}, + {-0.000961f, +0.061304f, -0.002271f}, + {-0.253423f, +0.143668f, +0.009368f}, + {-0.115710f, +0.134180f, +0.001573f}, + {-1.326987f, -0.007873f, +0.008890f}, + {-0.015982f, +0.030143f, -0.005520f}, + {-0.492615f, +0.037518f, +0.002448f}, + {-0.079087f, +0.012412f, -0.013697f}, + {-0.451060f, +0.024473f, +0.001447f} + }, + { + {+0.323947f, +0.113578f, +0.015549f}, + {-1.914278f, -0.144244f, -0.006317f}, + {+0.901146f, -0.000633f, +0.001221f}, + {+0.056621f, +0.017415f, +0.009508f}, + {-0.486031f, -0.062487f, -0.006628f}, + {+0.005750f, +0.003176f, +0.010924f}, + {-0.460561f, -0.095684f, +0.008436f}, + {+0.006138f, +0.009642f, +0.017284f}, + {+0.221745f, -0.084421f, +0.008896f}, + {+0.295524f, -0.090225f, +0.005470f}, + {-1.282596f, -0.033227f, +0.013009f}, + {+0.017081f, -0.032708f, +0.009204f}, + {-0.320490f, -0.048169f, +0.007190f}, + {-0.004452f, -0.049687f, -0.005870f}, + {-0.321645f, -0.040805f, +0.005349f} + }, + { + {+0.276466f, -0.082126f, -0.039402f}, + {-1.131086f, +0.240364f, +0.014659f}, + {+0.939436f, -0.066256f, -0.020157f}, + {+0.031245f, -0.021677f, +0.001488f}, + {-0.227874f, +0.081668f, +0.006464f}, + {+0.000131f, -0.031577f, -0.000810f}, + {-0.079943f, +0.077867f, +0.010680f}, + {-0.002114f, -0.051097f, -0.006205f}, + {+0.505579f, +0.022937f, +0.002111f}, + {+0.529896f, +0.026599f, +0.002639f}, + {-1.119787f, +0.067689f, +0.030053f}, + {+0.027535f, -0.008758f, +0.016240f}, + {-0.086495f, +0.052017f, +0.009012f}, + {+0.071205f, +0.035559f, +0.009161f}, + {-0.118065f, +0.048702f, +0.006679f} + }, + { + {+0.093440f, -0.004557f, -0.027073f}, + {-0.245787f, -0.191436f, +0.043587f}, + {+0.799589f, +0.049636f, -0.030640f}, + {-0.019046f, +0.019093f, +0.000438f}, + {-0.010885f, -0.044328f, +0.025258f}, + {-0.005866f, +0.001799f, -0.012476f}, + {+0.170216f, -0.034687f, +0.022513f}, + {-0.004590f, -0.033773f, -0.012630f}, + {+0.562981f, +0.020613f, +0.002338f}, + {+0.462468f, +0.040558f, +0.011199f}, + {-0.766124f, -0.063087f, +0.032731f}, + {+0.003866f, +0.047343f, +0.002184f}, + {+0.208773f, -0.041720f, +0.000150f}, + {+0.085394f, +0.009847f, +0.015388f}, + {+0.142942f, -0.041830f, -0.000134f} + }, + { + {-0.079123f, +0.007129f, +0.009727f}, + {+0.696618f, +0.032741f, -0.013106f}, + {+0.637741f, -0.009242f, -0.021655f}, + {-0.047028f, -0.036117f, -0.013542f}, + {+0.212381f, -0.027509f, +0.006723f}, + {-0.000617f, +0.037075f, -0.000220f}, + {+0.370842f, -0.041578f, +0.004859f}, + {+0.004430f, +0.032051f, +0.012864f}, + {+0.496527f, -0.056499f, -0.001248f}, + {+0.146069f, -0.116744f, +0.017775f}, + {-0.166525f, +0.044856f, -0.014703f}, + {-0.023099f, -0.027347f, -0.019267f}, + {+0.546556f, +0.035367f, -0.024737f}, + {+0.028754f, -0.048770f, +0.007240f}, + {+0.425139f, +0.034119f, -0.017706f} + }, + { + {-0.157237f, +0.030807f, +0.012105f}, + {+1.611496f, -0.047493f, -0.138771f}, + {+0.536727f, -0.004269f, -0.010405f}, + {-0.027394f, -0.029213f, -0.025646f}, + {+0.501885f, +0.028440f, -0.057516f}, + {+0.006221f, -0.003275f, +0.014398f}, + {+0.639827f, +0.055019f, -0.067764f}, + {+0.001591f, +0.053416f, +0.004360f}, + {+0.461536f, +0.068831f, -0.033617f}, + {-0.211469f, +0.148135f, -0.006826f}, + {+0.626469f, -0.114092f, -0.092853f}, + {-0.018761f, -0.043099f, -0.016105f}, + {+0.860019f, -0.064519f, -0.045475f}, + {-0.045626f, +0.052106f, -0.012787f}, + {+0.663833f, -0.048154f, -0.030845f} + }, + { + {-0.126579f, -0.010919f, -0.013520f}, + {+2.288775f, +0.330052f, -0.141825f}, + {+0.480184f, +0.010975f, -0.003821f}, + {+0.027378f, +0.130514f, +0.022104f}, + {+0.833876f, +0.128981f, -0.089877f}, + {+0.000006f, -0.048007f, -0.001802f}, + {+0.987530f, +0.132515f, -0.115028f}, + {-0.005361f, +0.003754f, -0.015136f}, + {+0.539461f, +0.030205f, -0.070546f}, + {-0.376693f, -0.051952f, -0.051245f}, + {+1.370192f, +0.300821f, -0.090103f}, + {+0.011481f, +0.068383f, +0.018910f}, + {+1.023463f, +0.103548f, -0.021626f}, + {-0.070294f, +0.005867f, -0.026624f}, + {+0.767991f, +0.065493f, -0.012744f} + }, + { + {-0.026353f, -0.076812f, -0.011309f}, + {+2.386202f, -0.393766f, +0.091076f}, + {+0.401155f, -0.012573f, +0.012460f}, + {+0.046392f, +0.057411f, +0.051335f}, + {+1.044143f, -0.283147f, +0.008993f}, + {-0.006407f, -0.010478f, -0.016041f}, + {+1.233210f, -0.363550f, +0.002070f}, + {+0.002791f, -0.054442f, +0.008337f}, + {+0.661388f, -0.218208f, -0.018346f}, + {-0.258425f, -0.166860f, -0.042541f}, + {+1.687434f, -0.323548f, +0.070274f}, + {+0.022238f, +0.046619f, +0.026404f}, + {+0.910899f, -0.034460f, +0.045920f}, + {-0.025130f, -0.092267f, -0.002499f}, + {+0.661856f, -0.004487f, +0.030559f} + }, + { + {+0.066021f, +0.074661f, +0.029510f}, + {+1.666633f, -0.360456f, +0.255929f}, + {+0.252047f, -0.048065f, +0.026719f}, + {-0.007792f, -0.195641f, -0.037030f}, + {+0.913916f, +0.010655f, +0.146689f}, + {+0.003378f, +0.059921f, +0.011523f}, + {+1.098128f, +0.060089f, +0.189069f}, + {+0.001509f, -0.062831f, +0.004239f}, + {+0.642839f, +0.126181f, +0.111015f}, + {+0.012758f, +0.255764f, +0.056444f}, + {+1.312690f, -0.234325f, +0.190640f}, + {-0.003813f, -0.090866f, -0.022023f}, + {+0.511605f, -0.213878f, +0.060443f}, + {+0.035742f, +0.045103f, +0.037370f}, + {+0.358843f, -0.156710f, +0.034608f} + }, + { + {+0.074139f, +0.095357f, +0.023821f}, + {+0.381358f, +1.206285f, -0.072122f}, + {+0.056394f, +0.128099f, -0.000093f}, + {-0.030944f, -0.168571f, -0.041583f}, + {+0.398811f, +0.586347f, +0.042243f}, + {+0.002280f, +0.072478f, +0.005368f}, + {+0.488122f, +0.738625f, +0.068185f}, + {-0.003028f, -0.029422f, -0.008868f}, + {+0.349465f, +0.388613f, +0.079712f}, + {+0.176056f, +0.077874f, +0.097877f}, + {+0.401381f, +0.902131f, -0.044484f}, + {-0.013871f, -0.089264f, -0.019111f}, + {+0.009642f, +0.355418f, -0.055057f}, + {+0.038242f, +0.114116f, +0.011546f}, + {+0.003022f, +0.223981f, -0.039576f} + }, + { + {+0.011203f, -0.103152f, -0.040501f}, + {-0.612178f, -0.198966f, -0.447896f}, + {-0.092947f, -0.064045f, -0.048583f}, + {+0.000469f, +0.055639f, +0.042364f}, + {-0.172174f, -0.393944f, -0.233061f}, + {-0.001945f, +0.039334f, -0.006788f}, + {-0.216767f, -0.541072f, -0.299361f}, + {+0.000571f, -0.002951f, +0.001970f}, + {-0.073951f, -0.446110f, -0.164206f}, + {+0.104268f, -0.348234f, -0.048377f}, + {-0.385812f, -0.226337f, -0.343728f}, + {+0.000090f, +0.017828f, +0.020908f}, + {-0.283739f, +0.046315f, -0.129419f}, + {-0.000956f, -0.033592f, -0.036908f}, + {-0.195200f, +0.041315f, -0.080091f} + } +}; + +const float hrtfShCoeffsRe[BINAURAL_CHANNELS][HRTF_SH_CHANNELS][HRTF_NUM_BINS]= +{ + { + { + +0.931560f, +0.589490f, +0.238115f, -0.086594f, -0.378914f, +0.918065f, +0.908308f, +0.894808f, +0.866987f, +0.836386f, + +0.819051f, +0.808457f, +0.799283f, +0.784996f, +0.763671f, +0.758873f, +0.777150f, +0.798487f, +0.807411f, +0.799756f, + +0.784730f, +0.773583f, +0.765115f, +0.756028f, +0.747349f, +0.741855f, +0.746047f, +0.758681f, +0.767696f, +0.767210f, + +0.759324f, +0.746787f, +0.732363f, +0.718682f, +0.707117f, +0.697608f, +0.691290f, +0.690306f, +0.693724f, +0.697313f, + +0.698110f, +0.697117f, +0.698173f, +0.704038f, +0.714303f, +0.727029f, +0.740252f, +0.751165f, +0.758564f, +0.763392f, + +0.766644f, +0.476275f, +0.021569f, +0.014234f, +0.011348f, +0.009708f, +0.008627f, +0.007880f, +0.007331f, +0.006984f + }, + { + +0.153364f, +0.431722f, +0.223627f, -0.301076f, -0.722224f, +0.556999f, +0.565103f, +0.549432f, +0.582858f, +0.652605f, + +0.725752f, +0.768989f, +0.787009f, +0.795460f, +0.799903f, +0.802273f, +0.810592f, +0.819734f, +0.819713f, +0.811440f, + +0.810218f, +0.823687f, +0.847812f, +0.882959f, +0.916331f, +0.923092f, +0.897135f, +0.852425f, +0.807571f, +0.778572f, + +0.764796f, +0.754260f, +0.742158f, +0.732054f, +0.724750f, +0.718657f, +0.717707f, +0.728664f, +0.752080f, +0.779872f, + +0.802697f, +0.816824f, +0.824778f, +0.830921f, +0.836340f, +0.839993f, +0.842458f, +0.844537f, +0.846022f, +0.846444f, + +0.845634f, +0.519355f, +0.013685f, +0.004231f, +0.000639f, -0.001743f, -0.003484f, -0.004764f, -0.005716f, -0.006342f + }, + { + +0.116550f, +0.029982f, -0.090957f, -0.110646f, -0.118380f, +0.164545f, +0.157003f, +0.141182f, +0.129273f, +0.111996f, + +0.147830f, +0.204091f, +0.287029f, +0.400304f, +0.498327f, +0.520367f, +0.451929f, +0.319838f, +0.163989f, +0.032354f, + -0.042553f, -0.060144f, -0.040752f, -0.013808f, +0.000138f, -0.005386f, -0.028033f, -0.056626f, -0.076148f, -0.071775f, + -0.036161f, +0.022235f, +0.079923f, +0.117243f, +0.132960f, +0.137374f, +0.136857f, +0.131489f, +0.122150f, +0.112795f, + +0.106854f, +0.101987f, +0.090861f, +0.069094f, +0.037690f, -0.001570f, -0.046208f, -0.089113f, -0.124780f, -0.152938f, + -0.172930f, -0.116660f, -0.004115f, -0.001599f, -0.000541f, +0.000076f, +0.000490f, +0.000781f, +0.000995f, +0.001134f + }, + { + +0.082564f, +0.045748f, -0.100405f, -0.164616f, -0.222135f, +0.214978f, +0.289164f, +0.366751f, +0.467015f, +0.536298f, + +0.539710f, +0.520805f, +0.484049f, +0.427086f, +0.396728f, +0.377012f, +0.337930f, +0.285243f, +0.217171f, +0.132009f, + +0.046348f, -0.022295f, -0.070187f, -0.092267f, -0.077417f, -0.017841f, +0.082276f, +0.200597f, +0.305996f, +0.384055f, + +0.437163f, +0.477207f, +0.515520f, +0.552589f, +0.576862f, +0.576107f, +0.552740f, +0.521313f, +0.495097f, +0.480391f, + +0.476238f, +0.478234f, +0.481677f, +0.482298f, +0.476112f, +0.459832f, +0.433225f, +0.402349f, +0.373577f, +0.349500f, + +0.331993f, +0.196598f, +0.008828f, +0.006124f, +0.005015f, +0.004377f, +0.003953f, +0.003666f, +0.003455f, +0.003322f + }, + { + +0.003514f, -0.046208f, -0.169189f, -0.246290f, -0.258608f, +0.123594f, +0.193752f, +0.277639f, +0.358490f, +0.412970f, + +0.375502f, +0.335121f, +0.313658f, +0.292262f, +0.289663f, +0.299499f, +0.304389f, +0.287189f, +0.236107f, +0.144024f, + +0.032821f, -0.070365f, -0.149507f, -0.187444f, -0.180044f, -0.144272f, -0.102205f, -0.062405f, -0.023790f, +0.014970f, + +0.051711f, +0.089890f, +0.137092f, +0.185775f, +0.210322f, +0.196357f, +0.159984f, +0.132056f, +0.131975f, +0.158785f, + +0.198654f, +0.237349f, +0.267138f, +0.288631f, +0.306064f, +0.320945f, +0.330270f, +0.332422f, +0.328795f, +0.320830f, + +0.310872f, +0.187382f, +0.005468f, +0.001915f, +0.000434f, -0.000505f, -0.001165f, -0.001641f, -0.001991f, -0.002211f + }, + { + -0.013914f, +0.020481f, -0.177151f, -0.153853f, -0.123281f, +0.036226f, +0.012165f, -0.059498f, -0.118703f, -0.132408f, + -0.083769f, -0.028816f, +0.010439f, +0.073641f, +0.151111f, +0.179257f, +0.122167f, -0.005411f, -0.171409f, -0.319887f, + -0.406332f, -0.430666f, -0.412015f, -0.355554f, -0.251589f, -0.114356f, +0.007079f, +0.075058f, +0.090668f, +0.081196f, + +0.074468f, +0.080971f, +0.090434f, +0.084438f, +0.060093f, +0.030473f, +0.006048f, -0.011097f, -0.020590f, -0.019141f, + -0.003724f, +0.020621f, +0.041568f, +0.049068f, +0.040365f, +0.016570f, -0.017826f, -0.053778f, -0.084772f, -0.109921f, + -0.128269f, -0.087720f, -0.005379f, -0.003683f, -0.002987f, -0.002556f, -0.002255f, -0.002029f, -0.001849f, -0.001721f + }, + { + -0.011077f, +0.068268f, +0.172045f, +0.224907f, +0.203958f, -0.141636f, -0.177909f, -0.173456f, -0.154997f, -0.177581f, + -0.193129f, -0.200675f, -0.206181f, -0.214819f, -0.189032f, -0.095163f, +0.041087f, +0.161032f, +0.223656f, +0.217536f, + +0.144366f, +0.019748f, -0.128357f, -0.264169f, -0.342543f, -0.342225f, -0.294756f, -0.250400f, -0.244775f, -0.284375f, + -0.346925f, -0.405676f, -0.451837f, -0.491950f, -0.524795f, -0.539708f, -0.531569f, -0.507105f, -0.477798f, -0.451524f, + -0.430027f, -0.409991f, -0.385628f, -0.353400f, -0.313904f, -0.270406f, -0.228673f, -0.195310f, -0.172245f, -0.157165f, + -0.147622f, -0.088637f, -0.002701f, -0.000757f, -0.000102f, +0.000326f, +0.000623f, +0.000845f, +0.001012f, +0.001117f + }, + { + +0.012737f, -0.122413f, -0.162191f, -0.048954f, -0.011887f, -0.006284f, -0.059137f, -0.075306f, -0.039450f, -0.013641f, + +0.045456f, +0.080111f, +0.103447f, +0.126400f, +0.143692f, +0.144628f, +0.151274f, +0.185913f, +0.238389f, +0.293656f, + +0.325256f, +0.310455f, +0.248320f, +0.125814f, -0.065585f, -0.279482f, -0.445586f, -0.528904f, -0.532954f, -0.480876f, + -0.402256f, -0.318153f, -0.233483f, -0.146163f, -0.062900f, +0.003457f, +0.047237f, +0.075491f, +0.099694f, +0.124312f, + +0.146112f, +0.160783f, +0.167687f, +0.170589f, +0.175305f, +0.185793f, +0.200659f, +0.215074f, +0.226218f, +0.233509f, + +0.236369f, +0.146507f, +0.006425f, +0.003570f, +0.002320f, +0.001557f, +0.001038f, +0.000666f, +0.000389f, +0.000202f + }, + { + +0.029441f, +0.255135f, +0.388005f, +0.324509f, +0.179661f, +0.170310f, +0.199090f, +0.247152f, +0.215232f, +0.107372f, + +0.008342f, -0.045561f, -0.073414f, -0.101929f, -0.145853f, -0.188184f, -0.218566f, -0.229908f, -0.227139f, -0.213922f, + -0.197983f, -0.187165f, -0.178153f, -0.183267f, -0.213808f, -0.243068f, -0.221134f, -0.135714f, -0.022342f, +0.076608f, + +0.151824f, +0.214097f, +0.269402f, +0.314773f, +0.344233f, +0.355048f, +0.346502f, +0.321399f, +0.286050f, +0.247674f, + +0.212622f, +0.185179f, +0.166697f, +0.155655f, +0.148981f, +0.143401f, +0.135815f, +0.125610f, +0.114535f, +0.104436f, + +0.097691f, +0.053982f, +0.004390f, +0.004991f, +0.005112f, +0.005266f, +0.005387f, +0.005507f, +0.005600f, +0.005657f + }, + { + -0.041114f, -0.246567f, -0.453640f, -0.578453f, -0.486412f, +0.085090f, +0.077743f, +0.105123f, +0.097004f, +0.045376f, + +0.020819f, +0.016253f, +0.032947f, +0.042605f, +0.033758f, +0.016413f, -0.007617f, -0.029954f, -0.049569f, -0.072006f, + -0.091910f, -0.092490f, -0.068505f, -0.047173f, -0.058854f, -0.098422f, -0.131962f, -0.131305f, -0.096674f, -0.045232f, + +0.016136f, +0.088833f, +0.169184f, +0.242523f, +0.287880f, +0.297628f, +0.284744f, +0.271800f, +0.274450f, +0.292315f, + +0.315219f, +0.333992f, +0.345833f, +0.354700f, +0.364920f, +0.377015f, +0.386323f, +0.388549f, +0.384259f, +0.374493f, + +0.360625f, +0.216189f, +0.003741f, -0.001455f, -0.003488f, -0.004851f, -0.005842f, -0.006588f, -0.007154f, -0.007521f + }, + { + -0.001575f, +0.034404f, -0.099063f, -0.057191f, +0.005967f, +0.008737f, +0.002839f, -0.023739f, +0.002327f, +0.047119f, + +0.071338f, +0.062023f, +0.056518f, +0.075939f, +0.095829f, +0.111755f, +0.130192f, +0.158682f, +0.192417f, +0.228710f, + +0.262770f, +0.285090f, +0.275706f, +0.204512f, +0.075591f, -0.061762f, -0.166412f, -0.231582f, -0.264188f, -0.274397f, + -0.272990f, -0.267274f, -0.254902f, -0.232321f, -0.205252f, -0.184838f, -0.177638f, -0.176928f, -0.167497f, -0.139224f, + -0.092627f, -0.036902f, +0.016017f, +0.057208f, +0.085094f, +0.105460f, +0.126261f, +0.149970f, +0.174030f, +0.196813f, + +0.215950f, +0.143890f, +0.006512f, +0.003675f, +0.002495f, +0.001778f, +0.001286f, +0.000926f, +0.000653f, +0.000468f + }, + { + -0.028351f, -0.158366f, -0.387375f, -0.209323f, -0.138479f, +0.024944f, +0.076050f, +0.068784f, +0.086894f, +0.022640f, + -0.046924f, -0.098681f, -0.157850f, -0.216715f, -0.230469f, -0.177937f, -0.056736f, +0.099412f, +0.230053f, +0.293062f, + +0.274665f, +0.188848f, +0.054201f, -0.120177f, -0.294891f, -0.394157f, -0.378101f, -0.280693f, -0.170935f, -0.092689f, + -0.049777f, -0.036466f, -0.052499f, -0.093934f, -0.142595f, -0.175682f, -0.184503f, -0.177658f, -0.170605f, -0.173641f, + -0.186618f, -0.200281f, -0.202941f, -0.188511f, -0.159081f, -0.120865f, -0.081855f, -0.050347f, -0.028940f, -0.016023f, + -0.010660f, -0.004676f, -0.001512f, -0.002489f, -0.002909f, -0.003234f, -0.003490f, -0.003708f, -0.003879f, -0.003976f + }, + { + -0.012536f, -0.024508f, +0.026715f, +0.100256f, +0.030165f, -0.019036f, -0.001980f, +0.053411f, +0.062729f, +0.042787f, + +0.037541f, +0.042995f, +0.032630f, -0.006363f, -0.069971f, -0.130620f, -0.144750f, -0.095861f, +0.019571f, +0.165595f, + +0.287776f, +0.359211f, +0.370344f, +0.312965f, +0.207299f, +0.103383f, +0.034254f, +0.002634f, +0.000632f, +0.017232f, + +0.044292f, +0.070055f, +0.076868f, +0.050271f, -0.014441f, -0.103260f, -0.190056f, -0.255807f, -0.297413f, -0.321963f, + -0.337614f, -0.347902f, -0.352331f, -0.349280f, -0.338882f, -0.321988f, -0.297068f, -0.266207f, -0.234929f, -0.205756f, + -0.181333f, -0.099905f, -0.004409f, -0.003069f, -0.002383f, -0.001976f, -0.001706f, -0.001520f, -0.001384f, -0.001294f + }, + { + -0.035759f, -0.028302f, +0.056431f, +0.144293f, +0.088149f, -0.053194f, -0.088872f, -0.078778f, -0.083787f, -0.070879f, + -0.044081f, -0.064468f, -0.084007f, -0.069723f, -0.065974f, -0.065725f, -0.028666f, +0.041152f, +0.101149f, +0.149485f, + +0.178233f, +0.189381f, +0.210408f, +0.258912f, +0.327924f, +0.370146f, +0.333626f, +0.220608f, +0.075539f, -0.065890f, + -0.187899f, -0.284687f, -0.349780f, -0.377256f, -0.364619f, -0.319560f, -0.262043f, -0.211477f, -0.176684f, -0.155472f, + -0.138294f, -0.114703f, -0.080295f, -0.040726f, -0.007428f, +0.011160f, +0.014827f, +0.010699f, +0.005174f, +0.001704f, + +0.001420f, +0.001014f, -0.000876f, -0.000438f, -0.000227f, -0.000068f, +0.000051f, +0.000148f, +0.000219f, +0.000266f + }, + { + +0.006625f, -0.028791f, -0.110750f, +0.054204f, +0.049674f, -0.081883f, -0.031641f, +0.002710f, +0.078824f, +0.101542f, + +0.075137f, +0.045466f, +0.054841f, +0.071727f, +0.069146f, +0.060555f, +0.070378f, +0.108883f, +0.172304f, +0.238963f, + +0.284300f, +0.307237f, +0.320185f, +0.308402f, +0.229243f, +0.069136f, -0.124082f, -0.287351f, -0.389327f, -0.427896f, + -0.417142f, -0.373698f, -0.302766f, -0.196446f, -0.061231f, +0.073312f, +0.179141f, +0.248754f, +0.289902f, +0.309552f, + +0.307579f, +0.283972f, +0.243621f, +0.194795f, +0.147699f, +0.110790f, +0.086424f, +0.072421f, +0.065314f, +0.061874f, + +0.059680f, +0.034356f, +0.001808f, +0.001292f, +0.001117f, +0.000966f, +0.000841f, +0.000731f, +0.000643f, +0.000577f + }, + { + +0.000088f, +0.014221f, -0.031471f, -0.012506f, +0.016816f, -0.022850f, -0.080939f, -0.132222f, -0.131943f, -0.137399f, + -0.094433f, -0.042539f, -0.032957f, -0.046202f, -0.048525f, -0.059770f, -0.084778f, -0.088776f, -0.061042f, -0.014146f, + +0.040389f, +0.099574f, +0.156222f, +0.193208f, +0.193160f, +0.165499f, +0.148012f, +0.164330f, +0.198656f, +0.229866f, + +0.254546f, +0.275046f, +0.287016f, +0.293580f, +0.312690f, +0.352380f, +0.396514f, +0.417891f, +0.401549f, +0.353465f, + +0.291737f, +0.233593f, +0.189322f, +0.157681f, +0.127979f, +0.091171f, +0.047074f, +0.003648f, -0.032270f, -0.058776f, + -0.074801f, -0.053275f, -0.002235f, -0.000782f, -0.000024f, +0.000460f, +0.000788f, +0.001026f, +0.001200f, +0.001310f + } + }, + { + { + +0.931560f, +0.589490f, +0.238115f, -0.086594f, -0.378914f, +0.918065f, +0.908308f, +0.894808f, +0.866987f, +0.836386f, + +0.819051f, +0.808457f, +0.799283f, +0.784996f, +0.763671f, +0.758873f, +0.777150f, +0.798487f, +0.807411f, +0.799756f, + +0.784730f, +0.773583f, +0.765115f, +0.756028f, +0.747349f, +0.741855f, +0.746047f, +0.758681f, +0.767696f, +0.767210f, + +0.759324f, +0.746787f, +0.732363f, +0.718682f, +0.707117f, +0.697608f, +0.691290f, +0.690306f, +0.693724f, +0.697313f, + +0.698110f, +0.697117f, +0.698173f, +0.704038f, +0.714303f, +0.727029f, +0.740252f, +0.751165f, +0.758564f, +0.763392f, + +0.766644f, +0.476275f, +0.021569f, +0.014234f, +0.011348f, +0.009708f, +0.008627f, +0.007880f, +0.007331f, +0.006984f + }, + { + -0.153364f, -0.431722f, -0.223627f, +0.301076f, +0.722224f, -0.556999f, -0.565103f, -0.549432f, -0.582858f, -0.652605f, + -0.725752f, -0.768989f, -0.787009f, -0.795460f, -0.799903f, -0.802273f, -0.810592f, -0.819734f, -0.819713f, -0.811440f, + -0.810218f, -0.823687f, -0.847812f, -0.882959f, -0.916331f, -0.923092f, -0.897135f, -0.852425f, -0.807571f, -0.778572f, + -0.764796f, -0.754260f, -0.742158f, -0.732054f, -0.724750f, -0.718657f, -0.717707f, -0.728664f, -0.752080f, -0.779872f, + -0.802697f, -0.816824f, -0.824778f, -0.830921f, -0.836340f, -0.839993f, -0.842458f, -0.844537f, -0.846022f, -0.846444f, + -0.845634f, -0.519355f, -0.013685f, -0.004231f, -0.000639f, +0.001743f, +0.003484f, +0.004764f, +0.005716f, +0.006342f + }, + { + +0.116550f, +0.029982f, -0.090957f, -0.110646f, -0.118380f, +0.164545f, +0.157003f, +0.141182f, +0.129273f, +0.111996f, + +0.147830f, +0.204091f, +0.287029f, +0.400304f, +0.498327f, +0.520367f, +0.451929f, +0.319838f, +0.163989f, +0.032354f, + -0.042553f, -0.060144f, -0.040752f, -0.013808f, +0.000138f, -0.005386f, -0.028033f, -0.056626f, -0.076148f, -0.071775f, + -0.036161f, +0.022235f, +0.079923f, +0.117243f, +0.132960f, +0.137374f, +0.136857f, +0.131489f, +0.122150f, +0.112795f, + +0.106854f, +0.101987f, +0.090861f, +0.069094f, +0.037690f, -0.001570f, -0.046208f, -0.089113f, -0.124780f, -0.152938f, + -0.172930f, -0.116660f, -0.004115f, -0.001599f, -0.000541f, +0.000076f, +0.000490f, +0.000781f, +0.000995f, +0.001134f + }, + { + +0.082564f, +0.045748f, -0.100405f, -0.164616f, -0.222135f, +0.214978f, +0.289164f, +0.366751f, +0.467015f, +0.536298f, + +0.539710f, +0.520805f, +0.484049f, +0.427086f, +0.396728f, +0.377012f, +0.337930f, +0.285243f, +0.217171f, +0.132009f, + +0.046348f, -0.022295f, -0.070187f, -0.092267f, -0.077417f, -0.017841f, +0.082276f, +0.200597f, +0.305996f, +0.384055f, + +0.437163f, +0.477207f, +0.515520f, +0.552589f, +0.576862f, +0.576107f, +0.552740f, +0.521313f, +0.495097f, +0.480391f, + +0.476238f, +0.478234f, +0.481677f, +0.482298f, +0.476112f, +0.459832f, +0.433225f, +0.402349f, +0.373577f, +0.349500f, + +0.331993f, +0.196598f, +0.008828f, +0.006124f, +0.005015f, +0.004377f, +0.003953f, +0.003666f, +0.003455f, +0.003322f + }, + { + -0.003514f, +0.046208f, +0.169189f, +0.246290f, +0.258608f, -0.123594f, -0.193752f, -0.277639f, -0.358490f, -0.412970f, + -0.375502f, -0.335121f, -0.313658f, -0.292262f, -0.289663f, -0.299499f, -0.304389f, -0.287189f, -0.236107f, -0.144024f, + -0.032821f, +0.070365f, +0.149507f, +0.187444f, +0.180044f, +0.144272f, +0.102205f, +0.062405f, +0.023790f, -0.014970f, + -0.051711f, -0.089890f, -0.137092f, -0.185775f, -0.210322f, -0.196357f, -0.159984f, -0.132056f, -0.131975f, -0.158785f, + -0.198654f, -0.237349f, -0.267138f, -0.288631f, -0.306064f, -0.320945f, -0.330270f, -0.332422f, -0.328795f, -0.320830f, + -0.310872f, -0.187382f, -0.005468f, -0.001915f, -0.000434f, +0.000505f, +0.001165f, +0.001641f, +0.001991f, +0.002211f + }, + { + +0.013914f, -0.020481f, +0.177151f, +0.153853f, +0.123281f, -0.036226f, -0.012165f, +0.059498f, +0.118703f, +0.132408f, + +0.083769f, +0.028816f, -0.010439f, -0.073641f, -0.151111f, -0.179257f, -0.122167f, +0.005411f, +0.171409f, +0.319887f, + +0.406332f, +0.430666f, +0.412015f, +0.355554f, +0.251589f, +0.114356f, -0.007079f, -0.075058f, -0.090668f, -0.081196f, + -0.074468f, -0.080971f, -0.090434f, -0.084438f, -0.060093f, -0.030473f, -0.006048f, +0.011097f, +0.020590f, +0.019141f, + +0.003724f, -0.020621f, -0.041568f, -0.049068f, -0.040365f, -0.016570f, +0.017826f, +0.053778f, +0.084772f, +0.109921f, + +0.128269f, +0.087720f, +0.005379f, +0.003683f, +0.002987f, +0.002556f, +0.002255f, +0.002029f, +0.001849f, +0.001721f + }, + { + -0.011077f, +0.068268f, +0.172045f, +0.224907f, +0.203958f, -0.141636f, -0.177909f, -0.173456f, -0.154997f, -0.177581f, + -0.193129f, -0.200675f, -0.206181f, -0.214819f, -0.189032f, -0.095163f, +0.041087f, +0.161032f, +0.223656f, +0.217536f, + +0.144366f, +0.019748f, -0.128357f, -0.264169f, -0.342543f, -0.342225f, -0.294756f, -0.250400f, -0.244775f, -0.284375f, + -0.346925f, -0.405676f, -0.451837f, -0.491950f, -0.524795f, -0.539708f, -0.531569f, -0.507105f, -0.477798f, -0.451524f, + -0.430027f, -0.409991f, -0.385628f, -0.353400f, -0.313904f, -0.270406f, -0.228673f, -0.195310f, -0.172245f, -0.157165f, + -0.147622f, -0.088637f, -0.002701f, -0.000757f, -0.000102f, +0.000326f, +0.000623f, +0.000845f, +0.001012f, +0.001117f + }, + { + +0.012737f, -0.122413f, -0.162191f, -0.048954f, -0.011887f, -0.006284f, -0.059137f, -0.075306f, -0.039450f, -0.013641f, + +0.045456f, +0.080111f, +0.103447f, +0.126400f, +0.143692f, +0.144628f, +0.151274f, +0.185913f, +0.238389f, +0.293656f, + +0.325256f, +0.310455f, +0.248320f, +0.125814f, -0.065585f, -0.279482f, -0.445586f, -0.528904f, -0.532954f, -0.480876f, + -0.402256f, -0.318153f, -0.233483f, -0.146163f, -0.062900f, +0.003457f, +0.047237f, +0.075491f, +0.099694f, +0.124312f, + +0.146112f, +0.160783f, +0.167687f, +0.170589f, +0.175305f, +0.185793f, +0.200659f, +0.215074f, +0.226218f, +0.233509f, + +0.236369f, +0.146507f, +0.006425f, +0.003570f, +0.002320f, +0.001557f, +0.001038f, +0.000666f, +0.000389f, +0.000202f + }, + { + +0.029441f, +0.255135f, +0.388005f, +0.324509f, +0.179661f, +0.170310f, +0.199090f, +0.247152f, +0.215232f, +0.107372f, + +0.008342f, -0.045561f, -0.073414f, -0.101929f, -0.145853f, -0.188184f, -0.218566f, -0.229908f, -0.227139f, -0.213922f, + -0.197983f, -0.187165f, -0.178153f, -0.183267f, -0.213809f, -0.243068f, -0.221134f, -0.135714f, -0.022342f, +0.076608f, + +0.151824f, +0.214097f, +0.269402f, +0.314773f, +0.344233f, +0.355048f, +0.346502f, +0.321399f, +0.286050f, +0.247674f, + +0.212622f, +0.185179f, +0.166697f, +0.155655f, +0.148981f, +0.143401f, +0.135815f, +0.125610f, +0.114535f, +0.104436f, + +0.097691f, +0.053982f, +0.004390f, +0.004991f, +0.005112f, +0.005266f, +0.005387f, +0.005507f, +0.005600f, +0.005657f + }, + { + +0.041114f, +0.246567f, +0.453640f, +0.578453f, +0.486412f, -0.085090f, -0.077743f, -0.105123f, -0.097004f, -0.045376f, + -0.020819f, -0.016253f, -0.032947f, -0.042605f, -0.033758f, -0.016413f, +0.007617f, +0.029954f, +0.049569f, +0.072006f, + +0.091910f, +0.092490f, +0.068505f, +0.047173f, +0.058854f, +0.098422f, +0.131962f, +0.131305f, +0.096674f, +0.045232f, + -0.016136f, -0.088833f, -0.169184f, -0.242523f, -0.287880f, -0.297628f, -0.284744f, -0.271800f, -0.274450f, -0.292315f, + -0.315219f, -0.333992f, -0.345833f, -0.354700f, -0.364920f, -0.377015f, -0.386323f, -0.388549f, -0.384259f, -0.374493f, + -0.360625f, -0.216189f, -0.003741f, +0.001455f, +0.003488f, +0.004851f, +0.005842f, +0.006588f, +0.007154f, +0.007521f + }, + { + +0.001575f, -0.034404f, +0.099063f, +0.057191f, -0.005967f, -0.008737f, -0.002839f, +0.023739f, -0.002327f, -0.047119f, + -0.071338f, -0.062023f, -0.056518f, -0.075939f, -0.095829f, -0.111755f, -0.130192f, -0.158682f, -0.192417f, -0.228710f, + -0.262770f, -0.285090f, -0.275706f, -0.204512f, -0.075591f, +0.061762f, +0.166412f, +0.231582f, +0.264188f, +0.274397f, + +0.272990f, +0.267274f, +0.254902f, +0.232321f, +0.205252f, +0.184838f, +0.177638f, +0.176928f, +0.167497f, +0.139224f, + +0.092627f, +0.036902f, -0.016017f, -0.057208f, -0.085094f, -0.105460f, -0.126261f, -0.149970f, -0.174030f, -0.196813f, + -0.215950f, -0.143890f, -0.006512f, -0.003675f, -0.002495f, -0.001778f, -0.001286f, -0.000926f, -0.000653f, -0.000468f + }, + { + +0.028351f, +0.158366f, +0.387375f, +0.209323f, +0.138479f, -0.024944f, -0.076050f, -0.068784f, -0.086894f, -0.022640f, + +0.046924f, +0.098681f, +0.157850f, +0.216715f, +0.230469f, +0.177937f, +0.056736f, -0.099412f, -0.230053f, -0.293062f, + -0.274665f, -0.188848f, -0.054201f, +0.120177f, +0.294891f, +0.394157f, +0.378101f, +0.280693f, +0.170935f, +0.092689f, + +0.049777f, +0.036466f, +0.052499f, +0.093934f, +0.142595f, +0.175682f, +0.184503f, +0.177658f, +0.170605f, +0.173641f, + +0.186618f, +0.200281f, +0.202941f, +0.188511f, +0.159081f, +0.120865f, +0.081855f, +0.050347f, +0.028940f, +0.016023f, + +0.010660f, +0.004676f, +0.001512f, +0.002489f, +0.002909f, +0.003234f, +0.003490f, +0.003708f, +0.003879f, +0.003976f + }, + { + -0.012536f, -0.024508f, +0.026715f, +0.100256f, +0.030165f, -0.019036f, -0.001980f, +0.053411f, +0.062729f, +0.042787f, + +0.037541f, +0.042995f, +0.032630f, -0.006363f, -0.069971f, -0.130620f, -0.144750f, -0.095861f, +0.019571f, +0.165595f, + +0.287776f, +0.359211f, +0.370344f, +0.312965f, +0.207299f, +0.103383f, +0.034254f, +0.002634f, +0.000632f, +0.017232f, + +0.044292f, +0.070055f, +0.076868f, +0.050271f, -0.014441f, -0.103260f, -0.190056f, -0.255807f, -0.297413f, -0.321963f, + -0.337614f, -0.347902f, -0.352331f, -0.349280f, -0.338882f, -0.321988f, -0.297068f, -0.266207f, -0.234929f, -0.205756f, + -0.181333f, -0.099905f, -0.004409f, -0.003069f, -0.002383f, -0.001976f, -0.001706f, -0.001520f, -0.001384f, -0.001294f + }, + { + -0.035759f, -0.028302f, +0.056431f, +0.144293f, +0.088149f, -0.053194f, -0.088872f, -0.078778f, -0.083787f, -0.070879f, + -0.044081f, -0.064468f, -0.084007f, -0.069723f, -0.065974f, -0.065725f, -0.028666f, +0.041152f, +0.101149f, +0.149485f, + +0.178233f, +0.189381f, +0.210408f, +0.258912f, +0.327924f, +0.370146f, +0.333626f, +0.220608f, +0.075539f, -0.065890f, + -0.187899f, -0.284687f, -0.349780f, -0.377256f, -0.364619f, -0.319560f, -0.262043f, -0.211477f, -0.176684f, -0.155472f, + -0.138294f, -0.114703f, -0.080295f, -0.040726f, -0.007428f, +0.011160f, +0.014827f, +0.010699f, +0.005174f, +0.001704f, + +0.001420f, +0.001014f, -0.000876f, -0.000438f, -0.000227f, -0.000068f, +0.000051f, +0.000148f, +0.000219f, +0.000266f + }, + { + +0.006625f, -0.028791f, -0.110750f, +0.054204f, +0.049674f, -0.081883f, -0.031641f, +0.002710f, +0.078824f, +0.101542f, + +0.075137f, +0.045466f, +0.054841f, +0.071727f, +0.069146f, +0.060555f, +0.070378f, +0.108883f, +0.172304f, +0.238963f, + +0.284300f, +0.307237f, +0.320185f, +0.308402f, +0.229243f, +0.069136f, -0.124082f, -0.287351f, -0.389327f, -0.427896f, + -0.417142f, -0.373698f, -0.302766f, -0.196446f, -0.061231f, +0.073312f, +0.179141f, +0.248754f, +0.289902f, +0.309552f, + +0.307579f, +0.283972f, +0.243621f, +0.194795f, +0.147699f, +0.110790f, +0.086424f, +0.072421f, +0.065314f, +0.061874f, + +0.059680f, +0.034356f, +0.001808f, +0.001292f, +0.001117f, +0.000966f, +0.000841f, +0.000731f, +0.000643f, +0.000577f + }, + { + +0.000088f, +0.014221f, -0.031471f, -0.012506f, +0.016816f, -0.022850f, -0.080939f, -0.132222f, -0.131943f, -0.137399f, + -0.094433f, -0.042539f, -0.032957f, -0.046202f, -0.048525f, -0.059770f, -0.084778f, -0.088776f, -0.061042f, -0.014146f, + +0.040389f, +0.099574f, +0.156222f, +0.193208f, +0.193160f, +0.165499f, +0.148012f, +0.164330f, +0.198656f, +0.229866f, + +0.254546f, +0.275046f, +0.287016f, +0.293580f, +0.312690f, +0.352380f, +0.396514f, +0.417891f, +0.401549f, +0.353465f, + +0.291737f, +0.233593f, +0.189322f, +0.157681f, +0.127979f, +0.091171f, +0.047074f, +0.003648f, -0.032270f, -0.058776f, + -0.074801f, -0.053275f, -0.002235f, -0.000782f, -0.000024f, +0.000460f, +0.000788f, +0.001026f, +0.001200f, +0.001310f + } + } +}; + +const float hrtfShCoeffsIm[BINAURAL_CHANNELS][HRTF_SH_CHANNELS][HRTF_NUM_BINS]= +{ + { + { + +0.059427f, +0.323489f, +0.582074f, +0.628019f, +0.485149f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f + }, + { + +0.558569f, +1.123301f, +1.071392f, +0.922801f, +0.655805f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f + }, + { + -0.026222f, -0.091698f, -0.022334f, +0.030939f, +0.002089f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f + }, + { + +0.038487f, +0.008114f, +0.051584f, +0.033837f, -0.057739f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f + }, + { + +0.008714f, +0.037748f, +0.010900f, +0.009237f, -0.119056f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f + }, + { + -0.008836f, -0.057513f, -0.080701f, +0.035007f, +0.008665f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f + }, + { + +0.024377f, +0.057800f, +0.058232f, +0.019393f, +0.043727f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f + }, + { + -0.084907f, -0.120786f, +0.030218f, +0.022916f, -0.018816f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f + }, + { + +0.158353f, +0.267853f, +0.188581f, +0.098698f, +0.081781f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f + }, + { + +0.007347f, +0.125090f, +0.290579f, +0.433270f, +0.391769f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f + }, + { + +0.004972f, -0.058443f, -0.096170f, +0.015200f, -0.015504f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f + }, + { + +0.010548f, -0.009294f, +0.259682f, +0.401123f, +0.254463f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f + }, + { + +0.006518f, +0.054591f, +0.083263f, +0.019926f, -0.072338f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f + }, + { + +0.016992f, +0.103452f, +0.153728f, +0.074125f, +0.031700f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f + }, + { + +0.000799f, -0.008968f, +0.119989f, +0.127988f, +0.010981f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f + }, + { + +0.002551f, +0.001879f, +0.006379f, +0.079606f, +0.073878f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f + } + }, + { + { + +0.059427f, +0.323489f, +0.582074f, +0.628019f, +0.485149f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f + }, + { + -0.558569f, -1.123301f, -1.071392f, -0.922801f, -0.655805f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f + }, + { + -0.026222f, -0.091698f, -0.022334f, +0.030939f, +0.002089f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f + }, + { + +0.038487f, +0.008114f, +0.051584f, +0.033837f, -0.057739f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f + }, + { + -0.008714f, -0.037748f, -0.010900f, -0.009237f, +0.119056f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f + }, + { + +0.008836f, +0.057513f, +0.080701f, -0.035007f, -0.008665f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f + }, + { + +0.024377f, +0.057800f, +0.058232f, +0.019393f, +0.043727f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f + }, + { + -0.084907f, -0.120786f, +0.030218f, +0.022916f, -0.018816f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f + }, + { + +0.158353f, +0.267853f, +0.188581f, +0.098698f, +0.081781f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f + }, + { + -0.007347f, -0.125090f, -0.290579f, -0.433270f, -0.391769f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f + }, + { + -0.004972f, +0.058443f, +0.096170f, -0.015200f, +0.015504f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f + }, + { + -0.010548f, +0.009294f, -0.259682f, -0.401123f, -0.254463f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f + }, + { + +0.006518f, +0.054591f, +0.083263f, +0.019926f, -0.072338f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f + }, + { + +0.016992f, +0.103452f, +0.153728f, +0.074125f, +0.031700f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f + }, + { + +0.000799f, -0.008968f, +0.119989f, +0.127988f, +0.010981f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f + }, + { + +0.002551f, +0.001879f, +0.006379f, +0.079606f, +0.073878f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, + +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f, +0.000000f + } + } +}; + + +/* Binaural rendering data set based on BRIRs */ +/* Tables derived from Mozart IIS BRIRs.*/ +const float FASTCONV_BRIR_latency_s = 0.000937500f; +const float leftBRIRReal[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS_MAX]= +{ + { + { + +0.001780f, -0.105056f, +0.133278f, -0.013415f, +0.027669f, -0.000540f, -0.047934f, -0.044980f, -0.017889f, +0.014321f, + +0.007348f, +0.030484f, +0.044975f, +0.005666f, -0.034603f, +0.018843f, +0.002080f, +0.033565f, -0.016623f, -0.033123f, + +0.004545f, -0.007249f, -0.020493f, -0.012461f, -0.003474f, -0.006890f, +0.003323f, +0.027582f, -0.003920f, +0.017221f, + +0.007285f, -0.008685f, -0.016040f, +0.012562f, +0.015499f, +0.001625f, -0.025322f, -0.007796f, +0.026150f, +0.021802f, + +0.017631f, -0.035176f, -0.023797f, -0.005155f, +0.007249f, +0.007251f, +0.002385f, -0.006721f, -0.001230f, -0.014337f, + -0.009093f, -0.002049f, +0.011497f, +0.006946f, -0.004541f, +0.008374f, +0.021898f, +0.011743f, +0.001865f, +0.006238f, + -0.002008f, -0.005675f, -0.003277f, -0.006934f, -0.007010f, -0.008036f, -0.018176f, -0.020279f, -0.007475f, +0.009061f, + +0.006923f, +0.007912f, +0.013080f, +0.001609f, +0.013686f, +0.009018f, +0.006450f, +0.002098f, +0.000388f, -0.005499f, + -0.000841f, -0.002854f, -0.004612f, -0.008123f, -0.007147f, -0.001362f, -0.002523f, -0.004943f, -0.002941f, +0.003854f, + +0.005553f, +0.002213f, -0.001155f, -0.001829f, -0.001203f, +0.005271f + }, + { + -0.002443f, -0.083508f, +0.098365f, +0.037484f, -0.013594f, +0.013837f, -0.037463f, -0.048465f, -0.029325f, +0.013451f, + +0.007052f, +0.018278f, +0.042952f, +0.015453f, -0.008889f, -0.017385f, -0.006510f, +0.042423f, +0.012017f, -0.029035f, + -0.007193f, -0.006032f, -0.027138f, +0.008138f, -0.035149f, +0.002167f, -0.008454f, +0.009206f, +0.013636f, +0.030767f, + +0.013182f, -0.018053f, -0.004793f, +0.012041f, +0.029395f, -0.014100f, -0.017378f, -0.003281f, +0.002494f, +0.015977f, + +0.007597f, -0.024681f, -0.009020f, +0.002628f, -0.008376f, -0.011389f, +0.020276f, +0.005431f, -0.006750f, -0.016869f, + -0.002214f, +0.001715f, -0.001174f, +0.001433f, +0.006966f, +0.005911f, +0.014916f, +0.007008f, +0.011727f, +0.003817f, + +0.005292f, -0.007060f, -0.007694f, +0.000872f, -0.006877f, -0.017034f, -0.013400f, -0.017798f, -0.003941f, -0.003404f, + +0.002214f, +0.010770f, +0.007439f, +0.008531f, +0.012195f, +0.013261f, +0.008042f, +0.011889f, -0.000017f, -0.007584f, + -0.002593f, -0.007918f, -0.006925f, -0.009156f, -0.008523f, -0.000877f, -0.003705f, -0.005308f, -0.000536f, +0.004641f, + +0.005402f, +0.003731f, -0.001368f, +0.006712f, -0.001331f, -0.000001f + }, + { + +0.001577f, -0.096038f, +0.122150f, -0.006459f, +0.022325f, -0.000027f, -0.063687f, -0.019774f, +0.012474f, -0.031234f, + +0.007405f, +0.023691f, +0.032421f, +0.000786f, +0.013763f, +0.015733f, -0.022351f, +0.009390f, +0.010844f, -0.008986f, + +0.008484f, +0.013513f, -0.031290f, -0.022773f, -0.032612f, -0.023880f, -0.034376f, +0.023566f, +0.032996f, +0.059130f, + -0.002185f, +0.005337f, +0.015561f, -0.011976f, -0.009297f, -0.004752f, +0.007349f, -0.012610f, -0.006750f, -0.004614f, + +0.032358f, -0.001975f, -0.018009f, -0.012045f, +0.000424f, +0.009609f, +0.000663f, -0.018039f, -0.026347f, -0.005883f, + +0.004527f, +0.008915f, +0.009293f, +0.007857f, +0.013424f, -0.000926f, -0.008812f, +0.015440f, +0.030651f, +0.016814f, + -0.000177f, -0.008382f, -0.014175f, -0.002190f, -0.004912f, -0.023064f, -0.010710f, -0.019619f, -0.012580f, -0.015451f, + -0.002372f, +0.011022f, +0.013997f, +0.015155f, +0.015427f, +0.013021f, +0.020266f, +0.007943f, +0.006371f, -0.001363f, + -0.006379f, -0.010479f, -0.010549f, -0.004959f, -0.006581f, -0.012106f, -0.007281f, +0.001245f, +0.008303f, +0.004275f, + -0.003274f, +0.001709f, -0.003329f, -0.002696f, -0.005984f, -0.001909f + }, + { + -0.000006f, -0.027733f, +0.077114f, -0.045558f, +0.032248f, -0.008910f, -0.028200f, -0.023058f, -0.027634f, -0.027966f, + +0.041227f, +0.023834f, +0.055456f, +0.001453f, -0.003409f, -0.014351f, -0.029300f, +0.013819f, +0.000893f, +0.004000f, + +0.011259f, -0.029018f, -0.038584f, +0.040377f, +0.019731f, -0.035978f, -0.033986f, +0.033845f, +0.026782f, -0.001195f, + -0.014325f, +0.009074f, +0.007425f, -0.012637f, -0.001940f, +0.012452f, +0.003636f, -0.003399f, +0.005103f, -0.007745f, + +0.007052f, +0.004339f, -0.020016f, +0.005955f, -0.004311f, -0.011313f, -0.000423f, +0.011277f, +0.005730f, -0.012033f, + +0.003900f, +0.008340f, -0.013208f, +0.000785f, +0.006125f, -0.002905f, +0.011174f, +0.003535f, +0.001676f, +0.002337f, + -0.004942f, -0.003383f, +0.001012f, -0.002100f, -0.002251f, -0.006365f, -0.002787f, -0.005174f, -0.002163f, -0.004373f, + +0.007444f, +0.005800f, +0.009259f, +0.006157f, +0.000809f, +0.001778f, -0.004892f, +0.001752f, -0.004150f, -0.000093f, + -0.003724f, -0.001166f, +0.001070f, -0.002430f, +0.002087f, -0.003672f, -0.003190f, -0.000369f, +0.000661f, +0.002168f, + -0.001203f, -0.002130f, +0.003159f, +0.003661f, +0.002821f, +0.002384f + }, + { + -0.000155f, -0.070297f, +0.090942f, +0.032775f, -0.030590f, +0.020839f, -0.028817f, -0.031540f, -0.037455f, -0.026895f, + +0.037476f, +0.023355f, +0.051293f, +0.002998f, -0.003591f, -0.003463f, -0.027614f, +0.014649f, +0.026560f, -0.031369f, + +0.004580f, -0.026953f, -0.017939f, +0.021436f, +0.019104f, -0.050621f, +0.008635f, +0.028462f, +0.021525f, +0.007132f, + -0.028329f, +0.000568f, +0.004626f, -0.006606f, +0.004686f, -0.003323f, -0.008343f, +0.032718f, -0.001701f, -0.002728f, + +0.000858f, -0.009525f, -0.014432f, +0.008645f, +0.001756f, -0.003465f, -0.026906f, +0.004475f, +0.017767f, +0.008392f, + -0.001726f, -0.004896f, -0.002156f, +0.007339f, -0.005441f, +0.002248f, -0.000207f, +0.008442f, +0.006580f, -0.005199f, + -0.006372f, -0.003816f, +0.007245f, +0.005972f, -0.007165f, -0.005749f, -0.012003f, -0.000457f, -0.002340f, -0.002471f, + +0.000461f, +0.008416f, +0.008916f, +0.005921f, +0.006911f, -0.000370f, +0.004467f, -0.002533f, +0.001052f, -0.011242f, + -0.002003f, -0.001220f, +0.001437f, -0.003593f, -0.001228f, -0.000730f, -0.000770f, -0.005429f, +0.000421f, +0.002452f, + +0.000428f, -0.000531f, -0.000274f, +0.003451f, +0.005594f, +0.004053f + }, + { + +0.000800f, -0.033956f, +0.096219f, -0.067463f, +0.046275f, -0.012351f, -0.046768f, -0.021553f, -0.021902f, +0.012533f, + -0.019886f, +0.029501f, +0.070154f, +0.037900f, +0.008096f, +0.004763f, -0.075825f, -0.023722f, +0.016504f, +0.024437f, + -0.041516f, -0.036483f, +0.008372f, +0.040486f, -0.003436f, +0.032667f, -0.014789f, -0.025890f, -0.002803f, +0.002064f, + -0.002002f, +0.038451f, +0.017317f, -0.004823f, -0.043550f, +0.005577f, +0.006684f, +0.010622f, -0.000703f, -0.011381f, + -0.035794f, +0.022476f, +0.009651f, -0.000938f, -0.014561f, +0.007324f, +0.006178f, +0.002615f, +0.005966f, +0.013155f, + +0.001282f, +0.003489f, +0.005929f, +0.002159f, -0.007136f, -0.015265f, -0.023167f, -0.005425f, +0.001409f, +0.001941f, + -0.006284f, +0.000605f, -0.001727f, +0.012362f, +0.006507f, +0.008265f, -0.006072f, +0.003099f, +0.004819f, +0.009585f, + +0.004864f, +0.010256f, -0.005566f, -0.003569f, -0.003788f, -0.005704f, -0.007576f, -0.008894f, -0.008872f, -0.004225f, + -0.003661f, +0.005713f, +0.009059f, +0.008078f, +0.006576f, -0.001274f, -0.009685f, -0.004260f, +0.002181f, +0.003188f, + +0.004020f, +0.005583f, +0.004355f, -0.000489f, -0.000835f, -0.001246f + }, + { + -0.002844f, -0.061783f, +0.080736f, +0.040823f, -0.034502f, +0.022417f, -0.024560f, -0.037465f, -0.031654f, -0.018206f, + +0.010177f, +0.001407f, +0.053067f, +0.067818f, +0.011425f, -0.011778f, -0.045344f, -0.030490f, +0.009070f, +0.028980f, + -0.018736f, -0.048804f, -0.020026f, +0.036874f, +0.033017f, +0.001971f, -0.021184f, +0.009031f, +0.006532f, -0.021663f, + +0.001286f, +0.045564f, +0.008266f, -0.023886f, -0.027272f, +0.004240f, +0.005342f, +0.009160f, -0.001125f, -0.023213f, + -0.009656f, +0.021053f, +0.008688f, -0.018673f, -0.001519f, +0.011276f, +0.002100f, +0.000683f, -0.003039f, +0.007212f, + +0.020184f, -0.002268f, +0.013630f, -0.004957f, -0.012582f, -0.015763f, -0.006411f, -0.011298f, +0.001018f, -0.013212f, + -0.001371f, -0.001140f, +0.016689f, +0.008741f, +0.009361f, +0.001340f, -0.000071f, -0.007274f, +0.004598f, +0.004748f, + +0.006591f, +0.007692f, +0.001270f, +0.000981f, -0.010502f, -0.007709f, -0.000831f, -0.007484f, -0.005798f, -0.004753f, + -0.000837f, +0.003626f, +0.006201f, +0.002420f, +0.003722f, -0.000848f, -0.004391f, -0.002901f, +0.000815f, +0.006234f, + +0.002688f, +0.004208f, +0.001469f, -0.003937f, -0.000713f, -0.000590f + }, + { + +0.001397f, -0.044931f, +0.106881f, -0.065295f, +0.037582f, -0.009714f, -0.029617f, -0.022868f, -0.036764f, -0.003042f, + -0.007543f, +0.067886f, +0.054171f, +0.007553f, -0.012587f, -0.003955f, -0.030537f, +0.049202f, -0.020496f, -0.044438f, + -0.025477f, -0.008835f, -0.014131f, -0.011211f, +0.070560f, +0.030047f, -0.022921f, -0.030642f, +0.010266f, +0.001875f, + +0.010865f, +0.011582f, +0.004137f, +0.022171f, -0.012454f, -0.025236f, +0.004164f, +0.002137f, -0.013264f, -0.013226f, + -0.010521f, -0.013069f, +0.008617f, +0.028980f, -0.010261f, -0.001009f, +0.000247f, +0.026507f, -0.001257f, +0.004824f, + +0.002996f, +0.014687f, +0.009434f, +0.000540f, -0.016357f, -0.017992f, -0.019507f, -0.026850f, -0.004739f, +0.001919f, + -0.002560f, +0.010097f, +0.005306f, +0.003550f, +0.008613f, +0.019336f, +0.012898f, -0.008761f, +0.000247f, +0.007737f, + +0.009944f, +0.007053f, -0.001037f, -0.013757f, -0.008129f, -0.005901f, -0.014511f, -0.013583f, -0.003636f, -0.002940f, + +0.002245f, +0.006942f, +0.010401f, +0.007518f, +0.002463f, -0.000690f, -0.003441f, -0.004050f, +0.001999f, +0.008040f, + +0.006590f, +0.006623f, +0.001194f, -0.004732f, -0.005128f, -0.003193f + }, + { + -0.003491f, -0.055068f, +0.075403f, +0.036387f, -0.031969f, +0.032935f, -0.035550f, -0.040031f, -0.031977f, -0.008594f, + -0.004489f, +0.021357f, +0.055537f, +0.044003f, -0.013832f, +0.018439f, -0.027798f, -0.004389f, +0.007048f, -0.025695f, + -0.033714f, -0.007068f, -0.018817f, -0.024474f, +0.066384f, +0.050050f, -0.018485f, -0.059738f, +0.016542f, +0.007444f, + +0.035855f, +0.006314f, -0.000150f, +0.008931f, -0.034498f, -0.004228f, +0.014899f, -0.011896f, -0.010966f, -0.017035f, + -0.002763f, +0.008600f, -0.001116f, +0.012527f, +0.000041f, +0.000889f, +0.002927f, +0.004041f, +0.017895f, +0.003405f, + -0.014609f, +0.025790f, +0.017162f, -0.003732f, -0.013785f, -0.019631f, -0.015073f, -0.033264f, -0.005627f, +0.004109f, + -0.005004f, +0.009220f, +0.008039f, +0.012799f, +0.012341f, +0.008463f, +0.007764f, -0.006365f, -0.003097f, +0.006646f, + +0.012937f, +0.002987f, +0.003139f, -0.009051f, -0.013210f, -0.006648f, -0.007433f, -0.013067f, -0.005048f, +0.002249f, + +0.004435f, +0.006359f, -0.000017f, +0.009265f, +0.000656f, -0.004174f, -0.005051f, -0.000609f, +0.006460f, +0.013274f, + +0.003051f, +0.002515f, +0.001932f, -0.007212f, -0.008371f, +0.000020f + }, + { + +0.002968f, -0.064432f, +0.099653f, +0.007174f, -0.008869f, -0.076264f, +0.038628f, -0.007275f, -0.000647f, -0.013151f, + -0.028723f, +0.044166f, +0.008430f, -0.021996f, +0.017017f, -0.008895f, +0.029199f, -0.000200f, +0.011688f, -0.006480f, + +0.034465f, -0.027810f, -0.009181f, -0.005764f, -0.063289f, +0.003656f, -0.003588f, +0.018596f, +0.000062f, +0.029992f, + -0.030123f, +0.011396f, +0.004694f, -0.003103f, +0.026063f, +0.010371f, -0.007765f, +0.001378f, +0.021547f, +0.018262f, + -0.011875f, -0.035277f, -0.022400f, -0.021618f, +0.020884f, -0.004577f, +0.029384f, +0.008225f, -0.004140f, -0.022432f, + -0.010595f, -0.005064f, +0.005326f, +0.008508f, +0.005198f, +0.010207f, +0.002794f, -0.003341f, -0.003764f, -0.008384f, + +0.007389f, +0.009792f, +0.009073f, +0.004916f, +0.002041f, -0.006698f, -0.013975f, -0.003656f, -0.011627f, -0.004623f, + -0.005693f, -0.002611f, -0.002039f, +0.005283f, +0.007884f, +0.007073f, +0.009721f, +0.006131f, +0.005824f, +0.000309f, + +0.003633f, -0.004059f, -0.007429f, +0.002557f, -0.000355f, -0.006351f, -0.002259f, -0.006191f, -0.008852f, -0.001260f, + +0.002260f, -0.003137f, +0.004009f, +0.002753f, +0.001728f, -0.001795f + }, + { + +0.001582f, -0.076087f, +0.114790f, +0.008157f, -0.022689f, -0.065271f, +0.012270f, +0.016733f, +0.017345f, -0.038816f, + -0.008836f, +0.047811f, +0.004162f, -0.009451f, -0.002982f, +0.019482f, +0.000345f, -0.013854f, +0.026023f, -0.019584f, + +0.028659f, -0.017255f, -0.047984f, +0.000668f, -0.044521f, +0.011902f, +0.020798f, +0.018136f, +0.022706f, +0.026560f, + -0.002643f, -0.000444f, -0.010503f, -0.015590f, +0.012635f, -0.006915f, -0.005263f, +0.001753f, -0.004134f, -0.017390f, + +0.000296f, -0.015714f, -0.003627f, +0.015783f, +0.023735f, +0.010417f, +0.027313f, -0.007957f, -0.024025f, -0.009751f, + -0.036618f, -0.004836f, +0.014820f, +0.025369f, +0.016613f, +0.012563f, -0.010054f, +0.004303f, -0.022828f, -0.001583f, + -0.012202f, +0.016692f, +0.006990f, +0.003749f, -0.008324f, -0.015467f, -0.001351f, +0.001100f, +0.001390f, +0.003415f, + +0.000207f, +0.001701f, -0.007172f, +0.001835f, +0.009987f, +0.010152f, +0.002697f, -0.003803f, +0.005576f, -0.001027f, + +0.001078f, -0.008071f, -0.010642f, -0.005218f, -0.001116f, -0.004592f, -0.003723f, +0.005121f, +0.000223f, +0.007137f, + +0.006263f, +0.004037f, +0.004948f, -0.001406f, -0.004720f, -0.001700f + }, + { + -0.006330f, -0.020580f, +0.077779f, -0.013719f, -0.030242f, -0.057276f, +0.057816f, -0.009160f, -0.009857f, -0.006091f, + -0.052385f, +0.044101f, +0.003721f, +0.055403f, +0.030899f, -0.018711f, -0.035138f, +0.004102f, -0.023760f, -0.019338f, + +0.012140f, +0.010926f, -0.007476f, +0.018223f, -0.031708f, +0.039575f, -0.005727f, +0.022962f, -0.051828f, -0.001783f, + +0.014227f, +0.016613f, -0.000557f, +0.007682f, -0.013406f, -0.023205f, -0.011369f, -0.003889f, +0.026163f, -0.012449f, + -0.003863f, +0.029878f, +0.018495f, -0.007492f, +0.018962f, +0.005624f, +0.002246f, -0.007185f, -0.006773f, +0.000162f, + -0.021570f, -0.015306f, -0.011349f, -0.010894f, -0.007432f, -0.015819f, +0.004930f, +0.014517f, +0.014621f, +0.030143f, + +0.008687f, -0.003543f, -0.007137f, -0.003100f, -0.001076f, -0.003635f, +0.000873f, +0.013783f, +0.005992f, -0.000720f, + +0.001065f, -0.004785f, +0.002953f, -0.006228f, -0.012510f, -0.009145f, -0.011929f, -0.007362f, -0.003181f, +0.004152f, + +0.000675f, +0.005080f, +0.005384f, +0.011913f, +0.004869f, +0.008934f, +0.010560f, +0.006496f, -0.003904f, +0.001073f, + -0.004060f, -0.009736f, -0.010637f, -0.008732f, -0.008133f, -0.002577f + }, + { + +0.000055f, -0.083722f, +0.115327f, +0.022567f, -0.023523f, -0.038584f, -0.012388f, +0.035963f, -0.024768f, -0.002975f, + -0.083703f, +0.060947f, +0.022094f, +0.012220f, +0.059660f, +0.008166f, -0.032339f, -0.040698f, +0.017533f, -0.035490f, + +0.016990f, -0.002864f, +0.009671f, +0.001761f, -0.023183f, +0.011312f, +0.015084f, +0.000563f, -0.008235f, -0.021829f, + +0.020006f, +0.016385f, +0.022850f, -0.001098f, -0.032036f, -0.028675f, -0.013756f, +0.006712f, -0.001884f, -0.003222f, + +0.025192f, +0.028876f, +0.010962f, -0.017270f, +0.013588f, +0.005872f, +0.009215f, +0.003730f, -0.003056f, -0.000282f, + -0.019167f, -0.022626f, -0.027344f, -0.007572f, -0.006715f, -0.007519f, +0.018272f, +0.004604f, +0.011848f, +0.016471f, + +0.007891f, +0.004882f, -0.006395f, +0.001647f, +0.005036f, -0.006339f, +0.001662f, +0.009612f, +0.012456f, -0.008887f, + -0.002886f, +0.001354f, -0.002310f, -0.005746f, -0.016835f, -0.008759f, -0.007850f, -0.008829f, -0.000705f, +0.002081f, + +0.005950f, +0.006146f, +0.009087f, +0.005151f, +0.010791f, +0.007485f, +0.006196f, +0.002594f, +0.000848f, -0.001423f, + -0.004635f, -0.002230f, -0.010068f, -0.009447f, -0.007686f, -0.006129f + }, + { + -0.005141f, -0.027090f, +0.081784f, -0.010992f, -0.014484f, -0.071481f, +0.060187f, -0.025369f, -0.002494f, +0.002610f, + -0.042832f, +0.031224f, +0.042003f, +0.014291f, -0.026074f, +0.022631f, -0.014552f, -0.024727f, +0.003073f, +0.022431f, + -0.006480f, +0.024913f, -0.020662f, -0.009964f, -0.003311f, +0.002616f, -0.013979f, -0.013731f, +0.006906f, -0.000841f, + -0.013843f, +0.003501f, +0.005987f, +0.006258f, -0.005205f, +0.037526f, -0.005378f, +0.009547f, +0.019302f, +0.007878f, + -0.007848f, -0.032401f, -0.026833f, +0.015068f, -0.018119f, +0.006020f, +0.021361f, +0.009108f, -0.000740f, +0.005879f, + -0.022386f, -0.003800f, -0.019203f, -0.016539f, +0.013023f, +0.016421f, +0.009349f, +0.005914f, +0.000621f, +0.003786f, + -0.007694f, +0.003491f, +0.008512f, +0.011237f, -0.002476f, -0.006068f, -0.007649f, -0.011950f, -0.005357f, +0.003088f, + -0.000198f, +0.008268f, -0.003557f, -0.001498f, -0.003475f, -0.000534f, -0.001887f, -0.002040f, +0.007740f, +0.007491f, + +0.002533f, +0.003789f, +0.002547f, -0.000993f, -0.003490f, +0.000973f, -0.003978f, -0.003297f, -0.003486f, -0.004802f, + +0.000830f, -0.003049f, -0.000051f, +0.001319f, +0.000063f, +0.000529f + }, + { + +0.002559f, -0.070860f, +0.104918f, +0.002991f, -0.000881f, -0.051974f, +0.004078f, +0.013027f, -0.035230f, +0.020739f, + -0.033293f, +0.016090f, +0.019119f, +0.035098f, -0.029638f, +0.029909f, -0.006914f, -0.014717f, -0.010149f, +0.001565f, + +0.025526f, +0.011769f, -0.023744f, -0.018370f, -0.025818f, +0.007069f, +0.004997f, +0.006663f, +0.007200f, +0.002825f, + -0.017857f, +0.025081f, -0.004610f, -0.018816f, -0.003151f, +0.025261f, -0.000283f, +0.010441f, +0.008027f, +0.009178f, + -0.015449f, -0.016491f, -0.013771f, -0.000520f, +0.005799f, +0.001762f, +0.018543f, +0.005938f, +0.008607f, -0.015120f, + -0.030235f, -0.004867f, +0.007859f, -0.007462f, +0.007461f, +0.007478f, +0.005775f, +0.007349f, +0.002580f, -0.008623f, + -0.001683f, +0.004874f, +0.002547f, +0.001348f, +0.006263f, -0.006872f, +0.005685f, +0.002123f, -0.015232f, +0.000366f, + -0.000634f, -0.001449f, -0.004601f, +0.000150f, +0.001846f, -0.001502f, -0.003900f, +0.000969f, +0.007545f, +0.005025f, + +0.004521f, +0.000302f, -0.000475f, +0.004420f, +0.003055f, -0.002795f, -0.005130f, -0.009211f, -0.005913f, +0.002978f, + -0.000296f, +0.001544f, +0.002092f, -0.000932f, -0.001400f, +0.000548f + } + }, + { + { + -0.006722f, -0.192285f, -0.014559f, +0.041823f, +0.056535f, -0.009441f, -0.010336f, +0.002807f, -0.009719f, -0.000669f, + +0.008311f, +0.005610f, +0.001904f, +0.005739f, +0.001244f, +0.028209f, -0.010093f, +0.013937f, -0.013863f, -0.009242f, + +0.010987f, +0.001599f, -0.012937f, +0.003370f, +0.025681f, +0.020593f, +0.000615f, +0.021987f, +0.002660f, +0.015343f, + +0.007454f, +0.001189f, -0.016601f, +0.007666f, +0.007385f, +0.010431f, +0.001165f, -0.004408f, +0.012048f, +0.008069f, + +0.021684f, +0.005584f, +0.005149f, -0.008217f, +0.000637f, +0.010560f, +0.006164f, -0.003905f, +0.000554f, -0.004473f, + +0.001412f, +0.000232f, +0.003896f, +0.001451f, -0.004756f, -0.007102f, +0.000613f, -0.002473f, -0.005883f, +0.001152f, + -0.004355f, -0.001912f, +0.001708f, -0.003451f, +0.003028f, +0.001218f, -0.001789f, -0.002809f, -0.001906f, +0.006695f, + -0.001800f, -0.002564f, +0.005990f, -0.003080f, +0.000770f, +0.000519f, +0.006414f, +0.000623f, +0.003496f, +0.000962f, + +0.000851f, +0.001219f, +0.001296f, +0.000056f, -0.001216f, +0.002481f, +0.000127f, -0.001033f, +0.000048f, +0.002701f, + +0.005123f, +0.003037f, -0.001806f, -0.002656f, -0.002447f, +0.003956f + }, + { + +0.004493f, -0.010715f, +0.100012f, +0.044007f, +0.011364f, +0.006108f, -0.016848f, -0.002367f, +0.000875f, +0.015558f, + +0.006696f, -0.007534f, +0.007588f, +0.005533f, +0.000580f, -0.030901f, -0.029105f, +0.011884f, -0.006451f, -0.014879f, + +0.006009f, -0.011482f, -0.023734f, +0.032884f, -0.014268f, -0.009702f, -0.013558f, +0.012886f, +0.008905f, +0.004105f, + +0.004276f, -0.002715f, +0.013650f, -0.008545f, +0.013323f, -0.011598f, -0.008895f, +0.006223f, -0.007751f, -0.008138f, + -0.001803f, -0.002690f, +0.007510f, +0.006470f, -0.005122f, -0.005691f, +0.013806f, -0.001171f, -0.005329f, -0.001409f, + +0.012952f, +0.000748f, -0.006603f, -0.002782f, -0.006848f, -0.005634f, +0.009205f, -0.002702f, +0.003581f, +0.000958f, + +0.009731f, +0.000702f, -0.004320f, -0.001962f, -0.000270f, -0.006943f, -0.004278f, -0.006499f, +0.000389f, -0.005745f, + -0.002657f, +0.004151f, -0.001940f, -0.002051f, +0.002526f, +0.001200f, -0.005633f, +0.002857f, +0.002031f, +0.000296f, + +0.001476f, -0.005017f, +0.001545f, +0.002940f, -0.001080f, -0.000098f, -0.001801f, +0.001399f, +0.001863f, -0.002076f, + -0.000783f, +0.003671f, -0.001507f, +0.003840f, -0.002063f, +0.000542f + }, + { + -0.002386f, -0.104233f, +0.066480f, +0.037099f, +0.053332f, +0.000176f, -0.023939f, -0.006680f, +0.004383f, +0.000029f, + +0.024982f, -0.002763f, +0.001892f, -0.006009f, +0.006317f, -0.005905f, -0.014384f, +0.023963f, +0.024021f, +0.003734f, + -0.001461f, +0.006433f, -0.014595f, -0.001537f, -0.004014f, +0.010714f, -0.010464f, +0.005989f, -0.014396f, +0.011322f, + -0.017456f, +0.001720f, +0.004778f, -0.004472f, -0.006527f, -0.011270f, -0.002549f, -0.007073f, +0.005916f, -0.010866f, + +0.016291f, -0.004606f, -0.008346f, -0.003022f, +0.002823f, +0.003146f, -0.009924f, -0.003248f, +0.004771f, +0.004770f, + +0.004676f, +0.005127f, +0.001819f, -0.001813f, +0.013598f, +0.002212f, -0.011235f, +0.002094f, +0.007245f, +0.002555f, + -0.000326f, +0.000781f, -0.001186f, +0.009557f, +0.008073f, -0.008815f, -0.000323f, -0.002472f, +0.005376f, -0.006897f, + -0.007056f, -0.001879f, +0.002348f, +0.005965f, +0.004742f, -0.002788f, +0.004148f, -0.000056f, +0.004876f, -0.000828f, + -0.002601f, -0.001894f, -0.001284f, -0.000480f, +0.000531f, +0.000704f, +0.000126f, -0.000813f, +0.002096f, +0.001395f, + -0.003620f, +0.000290f, -0.002635f, +0.000219f, +0.001152f, +0.003183f + }, + { + +0.001774f, -0.149780f, -0.039555f, -0.032353f, +0.053505f, +0.007878f, -0.001180f, +0.008355f, -0.008668f, -0.055517f, + -0.000227f, -0.000997f, +0.018903f, -0.010254f, -0.020653f, -0.016191f, +0.004122f, +0.021347f, -0.003520f, -0.006321f, + +0.004585f, -0.019486f, -0.018908f, +0.021234f, +0.008103f, -0.012402f, -0.016875f, +0.001335f, -0.004577f, +0.003219f, + -0.006463f, -0.003177f, +0.006303f, -0.007674f, -0.006143f, +0.011743f, +0.009920f, +0.005388f, +0.008020f, -0.008821f, + -0.000903f, -0.006542f, -0.016475f, +0.009992f, +0.005146f, +0.006883f, +0.004559f, +0.004162f, +0.006470f, -0.000289f, + +0.012722f, +0.016965f, -0.001615f, +0.007086f, +0.008019f, -0.003837f, +0.001810f, +0.000400f, +0.000640f, +0.000073f, + -0.006301f, +0.000641f, +0.009285f, +0.001082f, +0.001051f, -0.005895f, -0.003156f, -0.001159f, +0.006313f, +0.000608f, + +0.007281f, +0.001070f, +0.002108f, +0.001208f, -0.001958f, +0.003354f, -0.000033f, +0.004525f, -0.002993f, +0.002011f, + +0.001575f, +0.002281f, +0.000837f, -0.002108f, +0.001518f, -0.002069f, +0.002280f, +0.001916f, -0.003212f, -0.003524f, + -0.003166f, -0.003150f, -0.000366f, -0.000666f, +0.000295f, +0.002914f + }, + { + +0.000742f, -0.032548f, +0.072297f, +0.025196f, -0.023127f, -0.003851f, -0.006854f, -0.001607f, -0.014142f, -0.004070f, + +0.039117f, -0.000271f, +0.024719f, +0.009512f, -0.016309f, -0.027219f, -0.016901f, +0.002767f, +0.005464f, -0.022698f, + -0.005774f, -0.017459f, +0.018885f, +0.008785f, -0.005720f, -0.026932f, +0.020819f, +0.009823f, +0.013148f, +0.008061f, + -0.017607f, +0.001369f, +0.006354f, -0.011455f, -0.008969f, -0.001620f, +0.007523f, +0.019569f, -0.012483f, -0.004084f, + +0.009727f, +0.008803f, +0.002034f, -0.000984f, -0.010809f, +0.006116f, -0.018293f, -0.005184f, +0.002659f, +0.005479f, + +0.007241f, +0.001013f, +0.007707f, +0.013660f, -0.000212f, -0.001741f, -0.007703f, +0.002934f, +0.001202f, +0.001513f, + +0.005900f, -0.002588f, +0.002097f, +0.004906f, -0.000756f, +0.004936f, -0.003604f, +0.002731f, -0.002406f, -0.005884f, + -0.005161f, -0.001648f, -0.002680f, -0.003584f, +0.003347f, -0.000716f, +0.005217f, -0.000896f, +0.003743f, -0.004178f, + -0.000912f, -0.001183f, +0.002659f, -0.000004f, +0.000735f, -0.001681f, +0.001917f, -0.002915f, -0.000927f, +0.002278f, + +0.000862f, +0.001197f, -0.000988f, -0.000731f, +0.000933f, +0.000127f + }, + { + +0.001780f, -0.205879f, -0.061367f, -0.040650f, +0.075695f, +0.009293f, -0.010527f, +0.009515f, -0.014313f, +0.007836f, + +0.008562f, +0.011243f, -0.024033f, -0.012612f, -0.004494f, +0.004105f, -0.020738f, +0.014841f, +0.017579f, +0.005342f, + -0.024707f, -0.007543f, -0.022849f, -0.001791f, -0.013118f, +0.020088f, -0.012651f, -0.028223f, -0.003853f, +0.013017f, + -0.006841f, +0.013471f, -0.006426f, +0.006645f, -0.012528f, +0.018572f, +0.017589f, +0.001112f, -0.006238f, -0.006945f, + -0.023687f, +0.017990f, +0.003406f, +0.002838f, -0.002502f, +0.005343f, -0.007252f, -0.007670f, +0.000791f, +0.008331f, + -0.007603f, -0.000686f, +0.013930f, +0.011134f, +0.002706f, +0.003334f, +0.004258f, +0.007500f, +0.002726f, -0.002358f, + -0.008720f, +0.005739f, -0.002550f, +0.008016f, +0.002237f, -0.002495f, -0.007150f, +0.005065f, +0.002091f, +0.002505f, + +0.000299f, +0.000054f, -0.008364f, +0.001455f, -0.000604f, -0.001088f, +0.001565f, -0.002383f, -0.004898f, +0.000487f, + -0.000213f, +0.000035f, -0.000197f, -0.000594f, +0.000931f, -0.000013f, -0.005294f, +0.001548f, +0.001514f, -0.000980f, + +0.001413f, +0.003626f, +0.003651f, -0.000292f, +0.000885f, +0.003319f + }, + { + +0.003967f, +0.029498f, +0.112054f, +0.018636f, -0.027647f, -0.002307f, -0.010366f, -0.002137f, -0.001637f, -0.005855f, + +0.012259f, +0.007423f, +0.016308f, +0.007104f, -0.027394f, -0.016286f, -0.024480f, -0.028838f, -0.009201f, +0.012039f, + -0.002266f, -0.009521f, -0.012419f, +0.009438f, -0.011272f, -0.025389f, +0.003662f, +0.027221f, -0.012023f, -0.016386f, + -0.004027f, +0.015863f, -0.009527f, -0.007009f, +0.004869f, +0.008356f, -0.009167f, -0.001074f, +0.001888f, -0.005381f, + -0.000419f, +0.006708f, -0.006662f, -0.018084f, +0.002947f, +0.012606f, +0.008781f, +0.002627f, -0.011802f, -0.002689f, + +0.011612f, -0.004519f, +0.013554f, +0.002773f, +0.000678f, -0.000215f, +0.002178f, -0.012103f, +0.004145f, -0.005860f, + -0.000819f, -0.004017f, +0.001910f, -0.002704f, +0.007657f, +0.003152f, +0.004524f, -0.005162f, -0.000003f, +0.003825f, + +0.001444f, +0.003352f, +0.003699f, +0.006602f, -0.001080f, +0.004200f, +0.005015f, -0.000677f, +0.001009f, -0.004334f, + -0.000208f, +0.004568f, +0.003020f, -0.000403f, +0.001497f, -0.002704f, -0.003113f, -0.003017f, -0.002280f, +0.000510f, + -0.002035f, +0.000245f, +0.000484f, -0.001712f, -0.000836f, +0.001112f + }, + { + -0.000904f, -0.210882f, -0.057473f, -0.036729f, +0.056501f, -0.004830f, -0.004785f, -0.003620f, -0.016106f, +0.011030f, + +0.000245f, +0.021177f, -0.004642f, +0.013365f, -0.021943f, -0.017225f, -0.018861f, +0.024010f, -0.016405f, -0.012948f, + -0.009815f, -0.015049f, +0.007741f, +0.007291f, +0.017727f, -0.005447f, -0.013238f, -0.018650f, +0.000536f, -0.005907f, + +0.006988f, -0.001644f, -0.002679f, +0.008868f, -0.008891f, -0.004969f, +0.002970f, +0.003955f, -0.010952f, -0.014842f, + -0.011746f, -0.014590f, -0.009947f, +0.005549f, -0.015983f, +0.002228f, +0.001276f, +0.012201f, -0.017381f, +0.000000f, + +0.005998f, -0.004132f, -0.009883f, -0.001493f, -0.009533f, -0.004573f, +0.003337f, +0.002549f, +0.007635f, -0.003021f, + -0.002080f, +0.005188f, -0.005772f, -0.001736f, -0.000917f, +0.000940f, +0.005014f, -0.003448f, -0.000899f, -0.003284f, + +0.001474f, +0.006767f, +0.001604f, -0.002899f, +0.002582f, -0.001233f, +0.000430f, +0.001286f, +0.001397f, +0.002346f, + +0.001769f, -0.001604f, -0.001182f, -0.001522f, -0.001010f, +0.001172f, +0.000590f, +0.000579f, +0.001253f, +0.001895f, + +0.000610f, +0.003424f, +0.003705f, +0.001453f, +0.000113f, -0.000901f + }, + { + +0.003902f, +0.046761f, +0.122644f, +0.017834f, -0.025174f, +0.003626f, -0.026314f, -0.005741f, -0.003219f, -0.002456f, + +0.000294f, +0.006059f, +0.007058f, +0.010950f, -0.012527f, -0.003525f, -0.026084f, -0.016009f, +0.012407f, +0.014459f, + -0.005317f, +0.015030f, +0.005833f, -0.049372f, -0.002207f, +0.011724f, +0.006192f, -0.023131f, +0.020416f, +0.006706f, + +0.006686f, +0.002295f, -0.004056f, -0.003493f, -0.010729f, +0.000619f, +0.015152f, -0.001229f, -0.005575f, -0.006576f, + -0.002423f, +0.002401f, -0.000551f, +0.003646f, -0.007264f, +0.006623f, +0.010048f, +0.000521f, +0.003674f, -0.001973f, + -0.010306f, +0.014396f, +0.000448f, -0.000939f, +0.000882f, -0.006294f, +0.004952f, -0.002308f, +0.002110f, +0.001780f, + -0.003814f, +0.002397f, -0.005723f, +0.000389f, +0.001699f, -0.003006f, +0.003153f, +0.000288f, +0.002103f, +0.000641f, + +0.003617f, -0.005893f, -0.000343f, +0.003413f, +0.003107f, +0.004410f, -0.000006f, -0.003644f, +0.001594f, +0.000464f, + +0.000811f, +0.000892f, -0.005128f, +0.005065f, -0.001994f, +0.001023f, +0.003798f, +0.002329f, +0.001438f, +0.003904f, + -0.001980f, +0.001503f, +0.002469f, -0.003480f, -0.001095f, +0.005247f + }, + { + -0.006079f, -0.175471f, -0.007039f, +0.008165f, +0.046542f, +0.008599f, +0.085164f, -0.029872f, -0.002635f, +0.005348f, + -0.014300f, +0.028414f, +0.005925f, -0.022888f, -0.027533f, -0.021342f, +0.016512f, +0.006376f, +0.005254f, -0.025568f, + +0.023222f, -0.018403f, +0.007805f, +0.031757f, -0.006773f, +0.012585f, -0.008137f, +0.017523f, +0.002884f, +0.033209f, + -0.015813f, +0.007737f, +0.016751f, +0.015011f, +0.007533f, -0.006605f, -0.009006f, +0.000129f, +0.000690f, -0.002270f, + -0.020139f, -0.031061f, -0.007994f, -0.015891f, +0.005293f, +0.000618f, +0.019329f, -0.004834f, -0.001119f, -0.005527f, + +0.010980f, +0.000279f, +0.016238f, +0.005488f, -0.014989f, -0.001866f, -0.001803f, -0.002238f, +0.004670f, +0.000338f, + +0.010698f, +0.010205f, +0.006184f, +0.000839f, -0.001122f, +0.001829f, -0.006878f, -0.004134f, -0.003845f, +0.001536f, + -0.000762f, +0.003875f, +0.005232f, +0.000876f, +0.001291f, -0.001376f, +0.000895f, +0.000800f, +0.002635f, -0.001916f, + +0.000817f, +0.003451f, +0.001169f, +0.006396f, +0.005634f, +0.002885f, +0.003322f, +0.003714f, -0.001295f, +0.001808f, + +0.002666f, -0.003609f, -0.001232f, -0.001944f, +0.002819f, +0.003047f + }, + { + -0.002430f, -0.081806f, +0.082631f, +0.009014f, +0.001395f, -0.013157f, +0.024183f, -0.033288f, +0.012203f, +0.000523f, + -0.004553f, +0.021865f, +0.000039f, +0.013264f, +0.005511f, +0.004983f, -0.003670f, -0.021038f, +0.022545f, +0.001669f, + +0.040136f, -0.005799f, -0.009676f, +0.034707f, -0.012981f, +0.011085f, +0.007441f, +0.003867f, -0.016463f, -0.010512f, + -0.017154f, -0.005276f, -0.012215f, -0.005935f, +0.025018f, +0.006300f, -0.013496f, -0.009077f, -0.007092f, -0.001107f, + +0.018939f, -0.012406f, -0.007535f, +0.008133f, +0.022775f, +0.001451f, +0.005830f, -0.010496f, -0.011313f, +0.002760f, + -0.010707f, +0.000334f, -0.002416f, +0.008874f, +0.005740f, +0.001420f, -0.018911f, +0.004924f, -0.008418f, +0.005859f, + -0.008551f, +0.006184f, -0.002957f, +0.000577f, -0.004876f, -0.007604f, +0.002266f, +0.007489f, +0.003735f, +0.001648f, + -0.003822f, -0.004266f, -0.005173f, +0.002958f, -0.002342f, -0.001292f, -0.001633f, -0.008499f, +0.003110f, +0.001454f, + +0.001803f, -0.002661f, +0.001310f, +0.002865f, +0.000774f, -0.005278f, -0.007071f, +0.002205f, -0.002833f, +0.000603f, + +0.002696f, +0.001476f, +0.005372f, +0.001720f, -0.000597f, +0.001583f + }, + { + +0.019502f, -0.096784f, -0.044033f, -0.026250f, +0.023217f, +0.015460f, +0.044228f, -0.013565f, +0.014535f, +0.028458f, + -0.067458f, -0.015785f, +0.003736f, +0.014394f, -0.035519f, -0.001848f, +0.018384f, +0.044104f, +0.008961f, -0.000926f, + +0.021140f, +0.017556f, -0.010790f, +0.017548f, -0.024512f, +0.026039f, -0.016549f, +0.021179f, -0.015716f, +0.020600f, + -0.007089f, -0.012355f, -0.011794f, +0.024775f, +0.010511f, -0.006373f, +0.013288f, -0.000692f, +0.005762f, -0.015294f, + -0.009313f, +0.009189f, +0.008484f, -0.015567f, +0.001306f, +0.003578f, +0.008332f, -0.006863f, -0.005333f, +0.009259f, + +0.002469f, +0.000138f, -0.002845f, +0.000826f, +0.006299f, +0.000064f, +0.003366f, -0.001167f, +0.002418f, +0.013274f, + -0.000298f, -0.010989f, -0.008283f, +0.002602f, +0.005275f, +0.001291f, -0.004774f, +0.003674f, +0.000758f, +0.000306f, + +0.002186f, -0.005256f, +0.001251f, -0.002832f, -0.003162f, -0.001887f, -0.002822f, -0.000396f, -0.001881f, +0.002610f, + -0.000450f, +0.004576f, +0.001805f, +0.002918f, -0.004220f, -0.000271f, +0.001194f, +0.001554f, -0.001421f, +0.002964f, + -0.002633f, -0.002994f, -0.000058f, +0.001104f, -0.001486f, +0.001435f + }, + { + +0.000144f, -0.061118f, +0.086971f, +0.022437f, +0.009630f, -0.020679f, -0.040856f, -0.018022f, -0.027750f, +0.017671f, + -0.030817f, +0.034328f, -0.013020f, +0.022485f, +0.028300f, -0.005637f, -0.012430f, -0.015330f, +0.011967f, -0.012787f, + +0.018168f, -0.006574f, +0.023495f, -0.006018f, -0.007449f, +0.021450f, +0.020347f, +0.029918f, +0.012228f, -0.016987f, + +0.000863f, -0.018754f, -0.000427f, -0.018954f, -0.016583f, -0.006485f, -0.001137f, +0.009774f, -0.009715f, -0.016801f, + -0.002999f, +0.015466f, +0.014708f, -0.001544f, +0.008328f, +0.006714f, +0.010577f, +0.005669f, +0.000726f, +0.001351f, + +0.002297f, +0.002786f, -0.018892f, -0.007564f, -0.004752f, -0.002879f, +0.001116f, -0.010716f, -0.000568f, +0.003847f, + -0.002088f, +0.000575f, -0.003423f, +0.004086f, +0.007794f, -0.001086f, +0.005101f, -0.001805f, -0.000029f, -0.006550f, + +0.000975f, -0.001247f, -0.000019f, +0.005249f, -0.008070f, -0.007742f, -0.002680f, -0.003696f, -0.000737f, -0.001729f, + +0.003347f, +0.002864f, +0.001326f, -0.007065f, -0.002997f, -0.004053f, -0.001983f, -0.001615f, -0.000561f, -0.001178f, + -0.002940f, +0.005082f, -0.001143f, -0.001745f, +0.001711f, +0.000815f + }, + { + +0.015595f, -0.110844f, -0.039129f, -0.018750f, +0.039811f, +0.008046f, +0.052601f, -0.019808f, +0.057009f, +0.047780f, + -0.025631f, +0.028917f, +0.002360f, +0.008812f, +0.015699f, +0.044197f, +0.001354f, -0.006284f, +0.006791f, +0.008041f, + -0.015066f, +0.011521f, -0.016060f, +0.010927f, +0.004451f, -0.013968f, -0.010335f, +0.007074f, +0.011600f, +0.002523f, + -0.008483f, -0.002947f, -0.012827f, -0.003075f, -0.017088f, +0.016842f, -0.012728f, +0.006654f, +0.013154f, -0.013711f, + -0.011676f, -0.008771f, -0.007478f, +0.015728f, -0.002209f, +0.006262f, -0.000028f, +0.000632f, +0.002360f, +0.005822f, + -0.004648f, +0.016876f, -0.005791f, -0.015160f, -0.005376f, +0.006422f, +0.008275f, +0.003102f, -0.000532f, -0.001227f, + -0.005869f, +0.002389f, +0.000236f, +0.000899f, -0.009400f, -0.004505f, +0.000855f, +0.004075f, +0.007946f, +0.002363f, + -0.001173f, +0.011799f, -0.002403f, +0.001716f, -0.002689f, -0.003380f, -0.000938f, -0.003601f, +0.001160f, -0.001654f, + -0.004772f, -0.002410f, -0.002892f, -0.007791f, -0.004767f, +0.003488f, -0.001878f, +0.001361f, +0.000716f, -0.003000f, + +0.000398f, -0.002889f, -0.001178f, +0.002236f, +0.001728f, -0.000535f + }, + { + -0.004485f, -0.110626f, +0.051685f, -0.000519f, +0.018532f, -0.018108f, -0.008138f, -0.017398f, -0.027189f, +0.028689f, + -0.009625f, +0.006497f, -0.016224f, +0.035144f, +0.035134f, +0.025000f, -0.031089f, -0.008967f, -0.009535f, -0.011082f, + +0.023758f, +0.029200f, -0.013708f, +0.010316f, -0.003517f, +0.005325f, +0.005909f, +0.002856f, +0.005127f, +0.001701f, + -0.044658f, +0.009569f, +0.001139f, +0.005852f, +0.007024f, +0.011168f, +0.008814f, +0.005422f, -0.013078f, +0.000616f, + -0.003820f, +0.000548f, +0.001736f, -0.003107f, +0.002131f, +0.000620f, +0.006188f, -0.009038f, +0.005841f, +0.005212f, + -0.007008f, +0.004593f, +0.012587f, -0.000419f, +0.011015f, +0.008134f, +0.005048f, +0.011587f, +0.010883f, +0.000339f, + -0.001766f, -0.005563f, -0.000588f, +0.004625f, +0.011818f, -0.004228f, +0.001445f, +0.002646f, -0.005631f, +0.001946f, + -0.000818f, +0.000879f, +0.002840f, +0.001375f, +0.000365f, -0.007071f, -0.010011f, +0.001711f, +0.004790f, -0.000088f, + +0.004108f, +0.002364f, -0.002821f, +0.004637f, +0.005849f, +0.004919f, +0.005963f, -0.000529f, -0.004197f, +0.002619f, + -0.000325f, -0.000132f, +0.001050f, +0.000208f, -0.001035f, +0.003352f + } + }, + { + { + +0.011256f, -0.119408f, -0.131867f, +0.130006f, -0.009043f, -0.016121f, +0.000091f, +0.013302f, -0.017335f, -0.008362f, + +0.007097f, +0.005467f, -0.012605f, +0.013616f, +0.020155f, +0.005289f, +0.003202f, -0.001442f, +0.005709f, -0.000083f, + -0.004633f, +0.003544f, -0.011470f, +0.014637f, +0.033504f, +0.014848f, -0.009005f, +0.023116f, +0.014411f, -0.001353f, + +0.006169f, +0.018472f, -0.010222f, -0.005830f, +0.013464f, +0.003936f, +0.003404f, -0.002654f, +0.004585f, +0.010755f, + +0.011257f, +0.018859f, +0.003736f, -0.002233f, +0.000309f, +0.007579f, +0.001546f, -0.000753f, -0.004137f, +0.004729f, + +0.007619f, -0.001231f, -0.001224f, -0.004935f, +0.001262f, -0.008449f, -0.008042f, -0.001506f, -0.002780f, -0.003959f, + -0.004569f, +0.003226f, +0.001931f, -0.007053f, +0.006675f, -0.002104f, +0.001969f, +0.004079f, -0.001709f, +0.005807f, + -0.001657f, -0.006991f, +0.003931f, +0.000994f, -0.005524f, +0.005168f, +0.002721f, -0.000692f, +0.001917f, -0.000126f, + -0.000083f, +0.004290f, +0.003506f, +0.002913f, -0.000680f, +0.002678f, +0.000681f, -0.003028f, +0.001870f, +0.003836f, + +0.002399f, +0.003078f, -0.002536f, -0.002695f, -0.000147f, +0.001374f + }, + { + -0.001538f, +0.107274f, -0.006290f, +0.033191f, +0.021130f, -0.003273f, -0.009323f, +0.016652f, -0.000216f, +0.011925f, + +0.009236f, -0.014825f, -0.008742f, +0.010421f, +0.001339f, -0.033013f, -0.001413f, -0.012598f, -0.016333f, +0.001359f, + +0.012229f, -0.001012f, -0.022017f, +0.008272f, +0.013957f, -0.024288f, +0.001413f, +0.006378f, +0.019249f, -0.025945f, + +0.011652f, -0.017305f, +0.035746f, -0.019615f, -0.000204f, +0.001485f, -0.011556f, +0.002244f, -0.004920f, -0.005130f, + -0.004162f, +0.006753f, -0.005929f, +0.022730f, -0.007100f, -0.000879f, +0.004603f, -0.003407f, -0.001236f, +0.007212f, + +0.005860f, -0.001233f, -0.000944f, +0.000366f, -0.008312f, -0.011228f, +0.009050f, -0.006364f, -0.001002f, +0.007026f, + +0.004558f, +0.002386f, -0.004280f, -0.000896f, -0.003347f, +0.002541f, -0.001247f, -0.002141f, -0.002689f, -0.006253f, + -0.000261f, -0.002351f, -0.000873f, -0.004343f, -0.000289f, -0.001724f, -0.002896f, -0.001215f, +0.000657f, +0.004067f, + -0.000107f, -0.004589f, +0.005379f, +0.003289f, -0.000407f, +0.000410f, +0.000613f, +0.002964f, +0.000827f, -0.004463f, + -0.001820f, +0.003078f, +0.000943f, +0.000201f, +0.001736f, -0.000449f + }, + { + -0.000086f, +0.037094f, -0.078838f, +0.083464f, +0.025409f, -0.013685f, -0.003556f, -0.006975f, -0.019722f, +0.033910f, + -0.000841f, -0.000730f, +0.001079f, -0.001438f, -0.011671f, -0.010254f, +0.018978f, +0.008105f, +0.022537f, +0.012673f, + -0.000685f, -0.016581f, +0.000541f, -0.001037f, +0.013610f, -0.002171f, -0.017002f, +0.007803f, -0.016285f, -0.000107f, + +0.000643f, -0.010791f, +0.003851f, +0.009130f, -0.024950f, -0.006778f, +0.005614f, -0.013719f, +0.005323f, -0.004708f, + +0.000442f, +0.008177f, +0.000583f, -0.000501f, -0.014176f, +0.001564f, -0.002928f, -0.005278f, +0.014342f, +0.005319f, + +0.007293f, -0.010462f, +0.007124f, +0.004425f, +0.005214f, +0.000475f, -0.004083f, +0.001397f, -0.000267f, -0.000262f, + -0.000208f, +0.004631f, +0.002694f, +0.009887f, +0.005077f, +0.001874f, -0.004261f, +0.003832f, +0.002374f, -0.004128f, + -0.003131f, -0.004574f, -0.003320f, +0.006453f, +0.001872f, -0.006756f, +0.003738f, -0.000976f, +0.003721f, +0.001287f, + -0.002154f, -0.002062f, +0.003425f, -0.003507f, +0.002359f, +0.005401f, -0.001757f, -0.000345f, -0.000132f, +0.002799f, + -0.004923f, -0.002273f, +0.001995f, -0.001528f, +0.003407f, +0.002591f + }, + { + -0.006036f, -0.257411f, +0.040305f, +0.028187f, +0.000174f, +0.000480f, +0.004011f, +0.012467f, -0.000983f, -0.024493f, + -0.034526f, +0.010056f, -0.016794f, +0.005358f, -0.009205f, -0.032645f, +0.024734f, -0.004850f, +0.016507f, -0.019654f, + -0.001478f, -0.005780f, -0.003919f, +0.010306f, +0.001912f, -0.005182f, +0.001204f, -0.011287f, -0.006117f, -0.003118f, + -0.001071f, -0.010687f, -0.003646f, +0.000891f, +0.001166f, +0.001859f, +0.005186f, +0.011561f, +0.010123f, -0.006278f, + +0.002972f, -0.018664f, +0.001488f, +0.000162f, +0.012061f, +0.007451f, +0.004534f, +0.000525f, -0.002092f, +0.007431f, + +0.018326f, +0.009689f, -0.000867f, +0.005858f, +0.006065f, +0.001550f, -0.002692f, -0.004949f, +0.007264f, +0.002268f, + -0.008559f, +0.000649f, +0.009100f, -0.002169f, +0.006146f, -0.005439f, -0.002458f, -0.005507f, +0.008237f, +0.003569f, + +0.004695f, +0.003110f, +0.000517f, -0.001198f, +0.000705f, +0.003225f, +0.002499f, +0.001725f, -0.001584f, +0.000063f, + +0.003409f, +0.001983f, -0.000872f, +0.001084f, -0.001679f, +0.000541f, +0.002625f, +0.000259f, -0.001476f, -0.004165f, + -0.002270f, -0.003844f, +0.000874f, -0.001272f, -0.003136f, +0.003870f + }, + { + -0.001184f, +0.052210f, -0.008917f, +0.000514f, +0.005233f, -0.007317f, +0.004062f, +0.001787f, -0.007623f, +0.014043f, + +0.008413f, +0.005346f, +0.012245f, +0.011171f, -0.010208f, -0.009425f, -0.015807f, -0.017698f, -0.010252f, -0.006024f, + -0.010802f, -0.007354f, +0.027520f, +0.002327f, -0.022819f, -0.008191f, +0.005061f, +0.004008f, +0.019523f, -0.002494f, + +0.012891f, -0.018477f, +0.018078f, -0.026403f, +0.002573f, -0.006739f, +0.020399f, +0.003709f, -0.006126f, -0.003779f, + +0.005788f, +0.012415f, +0.010435f, -0.011141f, -0.010110f, +0.004542f, -0.011777f, -0.004882f, +0.005179f, +0.000269f, + -0.000222f, +0.001117f, +0.020436f, +0.007643f, +0.001753f, -0.001564f, -0.010540f, +0.000135f, +0.001182f, +0.005642f, + +0.004918f, -0.002327f, +0.000841f, +0.002562f, +0.006079f, -0.004435f, +0.000271f, +0.001614f, +0.000470f, -0.001716f, + -0.007035f, -0.006006f, -0.003620f, -0.002638f, -0.000456f, +0.002968f, +0.001854f, +0.003211f, +0.001300f, +0.000339f, + -0.003915f, -0.000019f, +0.000237f, +0.000572f, +0.000672f, +0.001718f, -0.001244f, +0.000093f, -0.001324f, +0.002579f, + -0.000431f, +0.001792f, -0.001835f, -0.000495f, -0.000009f, -0.001074f + }, + { + -0.009969f, -0.332186f, +0.034558f, +0.067463f, -0.018244f, +0.005600f, +0.002221f, +0.012806f, -0.003443f, -0.005553f, + +0.017047f, +0.002938f, -0.039281f, -0.027373f, +0.004336f, -0.017648f, -0.002701f, +0.032161f, +0.010920f, +0.001691f, + -0.015852f, +0.001135f, -0.025476f, -0.005860f, -0.003628f, +0.001777f, -0.010154f, -0.014160f, -0.005462f, -0.000727f, + +0.005097f, +0.009039f, -0.003561f, -0.006670f, +0.006804f, +0.000605f, +0.025144f, -0.006707f, +0.000414f, -0.011802f, + -0.001202f, -0.008502f, +0.013918f, -0.003708f, +0.002028f, +0.004600f, -0.005467f, -0.000898f, +0.002142f, +0.002676f, + -0.012110f, +0.001963f, +0.015497f, +0.005252f, +0.004045f, +0.002329f, +0.013321f, +0.005660f, +0.003619f, -0.003340f, + -0.004399f, +0.001774f, -0.000881f, +0.007768f, +0.000397f, -0.006398f, +0.000866f, -0.003254f, +0.005037f, -0.003359f, + +0.003992f, -0.007528f, -0.001999f, +0.001397f, -0.003262f, -0.000157f, +0.003153f, -0.001909f, -0.002075f, -0.002082f, + +0.003710f, +0.000048f, -0.000904f, -0.003756f, -0.001139f, +0.001301f, -0.005104f, +0.006370f, -0.001487f, -0.000303f, + +0.000527f, +0.001878f, +0.003707f, -0.000356f, +0.001395f, +0.004720f + }, + { + +0.000942f, +0.081085f, +0.058507f, -0.026453f, +0.017471f, -0.004764f, -0.010986f, +0.004882f, +0.010200f, -0.004698f, + -0.003443f, +0.012355f, +0.013460f, -0.012935f, -0.014330f, -0.016493f, -0.033509f, -0.013576f, -0.015337f, +0.009716f, + +0.010082f, -0.001748f, -0.017295f, +0.027909f, -0.033941f, -0.021110f, +0.014138f, +0.005427f, -0.009722f, -0.012158f, + -0.010327f, +0.023424f, -0.011587f, -0.008186f, +0.016081f, +0.005385f, -0.006343f, -0.006549f, -0.003037f, +0.011115f, + -0.003252f, -0.004585f, -0.005445f, -0.005123f, +0.002343f, +0.002302f, +0.013814f, +0.002106f, -0.015085f, +0.003008f, + +0.001985f, +0.008261f, +0.001257f, +0.006186f, +0.001501f, +0.001998f, +0.002102f, -0.010763f, +0.000232f, -0.002245f, + +0.002558f, -0.003164f, -0.008187f, +0.001818f, +0.002720f, +0.004137f, +0.004643f, +0.001990f, -0.002641f, +0.007437f, + -0.001260f, -0.002689f, +0.005829f, +0.005801f, -0.000911f, +0.009778f, -0.001855f, +0.000475f, +0.004709f, -0.002641f, + -0.000028f, +0.003066f, +0.003949f, -0.001643f, +0.001320f, -0.004129f, -0.002056f, -0.002409f, +0.000319f, -0.001031f, + -0.002951f, -0.001298f, -0.001724f, +0.000966f, -0.001031f, +0.002904f + }, + { + -0.004492f, -0.311824f, +0.002026f, +0.071285f, -0.020585f, -0.024073f, -0.006780f, +0.003146f, +0.005189f, +0.009069f, + -0.003959f, -0.007957f, +0.012327f, +0.012780f, -0.030786f, -0.017054f, +0.013177f, -0.005520f, +0.008556f, -0.008506f, + -0.016771f, -0.009864f, +0.012803f, +0.004427f, -0.006240f, -0.007126f, +0.000442f, -0.014505f, -0.010115f, -0.001137f, + +0.000477f, -0.009285f, +0.009569f, +0.005218f, -0.009542f, -0.003063f, -0.006109f, +0.012235f, -0.009130f, -0.011140f, + -0.022868f, -0.003313f, -0.004051f, -0.012342f, -0.008467f, +0.000119f, +0.008432f, +0.001598f, -0.014724f, -0.006674f, + +0.005770f, -0.010953f, +0.005268f, -0.012787f, -0.003371f, +0.000789f, -0.000956f, +0.014395f, +0.007813f, -0.003242f, + -0.005006f, -0.001570f, -0.002871f, -0.008459f, +0.004325f, -0.002342f, -0.002268f, +0.003070f, -0.001185f, -0.005693f, + -0.002861f, +0.004094f, +0.002557f, +0.002791f, +0.002078f, +0.003300f, +0.001241f, +0.001568f, +0.001836f, +0.003994f, + -0.000609f, -0.002479f, -0.002282f, -0.000954f, -0.000399f, -0.000460f, +0.001921f, +0.001662f, -0.000117f, +0.000248f, + +0.000745f, +0.002081f, +0.004675f, +0.000466f, +0.001613f, +0.001024f + }, + { + +0.003032f, +0.066925f, +0.088698f, -0.017650f, +0.013385f, -0.005210f, -0.011496f, -0.002450f, -0.000886f, -0.005505f, + +0.008612f, -0.007729f, +0.006560f, -0.005249f, +0.008691f, -0.028775f, -0.003077f, -0.019148f, +0.015061f, +0.014309f, + +0.004415f, +0.015461f, +0.014200f, -0.041011f, -0.022540f, -0.002923f, +0.002437f, +0.002763f, +0.012197f, +0.002362f, + -0.003092f, -0.008867f, +0.008761f, -0.023703f, +0.014315f, +0.010272f, +0.006933f, -0.001034f, -0.007039f, +0.000036f, + -0.007987f, +0.000461f, -0.002233f, -0.001279f, +0.001582f, +0.006605f, +0.004300f, +0.000749f, +0.003887f, -0.007305f, + -0.003037f, +0.006567f, +0.000025f, +0.001512f, +0.000690f, -0.004150f, +0.003073f, +0.010693f, -0.001667f, -0.000724f, + +0.002913f, -0.002875f, -0.008462f, +0.000660f, +0.000486f, -0.002558f, +0.003298f, +0.002379f, +0.000227f, +0.001112f, + +0.000921f, -0.005383f, -0.003558f, +0.005701f, +0.002831f, +0.008089f, +0.001556f, -0.001196f, +0.002376f, -0.004166f, + +0.002291f, +0.000046f, -0.003918f, +0.002457f, -0.000637f, +0.000892f, +0.003740f, +0.003978f, -0.000710f, +0.000782f, + -0.000906f, +0.001071f, +0.000906f, -0.002825f, +0.001259f, +0.005937f + }, + { + +0.004935f, -0.217971f, +0.010566f, +0.001346f, +0.030966f, +0.050239f, +0.065677f, -0.042929f, +0.000075f, -0.008113f, + +0.009489f, +0.008986f, +0.000679f, +0.002404f, -0.036648f, -0.000837f, -0.011228f, +0.019854f, -0.007713f, -0.012234f, + +0.004664f, -0.009930f, -0.002486f, +0.017741f, +0.034027f, +0.006965f, -0.012723f, +0.023629f, +0.024837f, -0.005170f, + +0.003445f, -0.005437f, +0.012859f, +0.032217f, -0.016782f, -0.009763f, -0.000714f, +0.008696f, -0.015625f, +0.000389f, + -0.030820f, -0.021196f, -0.011039f, +0.003003f, -0.008636f, +0.006415f, +0.005351f, +0.000328f, -0.000205f, -0.004125f, + +0.021251f, -0.004126f, +0.017806f, +0.001647f, -0.018692f, -0.004140f, -0.005076f, -0.002947f, +0.016714f, +0.001658f, + +0.003236f, +0.013209f, +0.002160f, +0.002855f, -0.005508f, +0.005552f, -0.001964f, -0.005087f, +0.001464f, -0.004929f, + +0.003031f, -0.000963f, +0.010453f, -0.003709f, +0.003708f, -0.002402f, -0.003527f, +0.003791f, -0.000259f, +0.001729f, + -0.003669f, +0.008374f, -0.003546f, +0.010266f, +0.006050f, +0.003956f, +0.001633f, +0.006472f, -0.001342f, +0.003021f, + +0.002106f, -0.002976f, -0.002360f, -0.002015f, +0.003524f, +0.002737f + }, + { + +0.000340f, +0.002579f, +0.000999f, +0.007242f, -0.016747f, +0.007236f, +0.040910f, -0.027985f, -0.022425f, +0.032085f, + -0.001253f, -0.022861f, +0.014105f, +0.015351f, +0.012464f, -0.025763f, +0.001878f, +0.027877f, -0.014704f, +0.011964f, + +0.034418f, -0.008374f, +0.013735f, +0.016669f, +0.004010f, +0.001346f, +0.008931f, -0.006664f, -0.002206f, -0.005722f, + -0.033084f, +0.000963f, -0.028400f, +0.005827f, +0.019246f, +0.018127f, -0.014861f, -0.017253f, -0.006760f, +0.008133f, + +0.013705f, -0.011386f, -0.010227f, +0.009870f, +0.016582f, +0.004106f, +0.001065f, -0.015420f, -0.002362f, -0.007218f, + +0.007305f, +0.000222f, -0.010192f, +0.008397f, +0.001293f, -0.000052f, -0.011457f, -0.009294f, +0.002534f, +0.001525f, + +0.005404f, -0.008360f, -0.001660f, +0.000922f, -0.011764f, +0.007476f, +0.001092f, +0.004268f, +0.003179f, +0.001323f, + -0.004194f, -0.007695f, -0.000954f, +0.007367f, -0.008712f, -0.004682f, -0.000393f, -0.002101f, -0.002243f, +0.001256f, + +0.000770f, -0.000871f, +0.007248f, +0.003688f, -0.004796f, -0.001672f, -0.003409f, -0.000540f, +0.000962f, -0.001623f, + -0.001285f, +0.002622f, +0.004746f, +0.000920f, +0.000324f, +0.000582f + }, + { + -0.030672f, -0.103326f, +0.010640f, -0.023231f, +0.018641f, +0.072611f, -0.026982f, -0.008605f, +0.012208f, -0.001738f, + -0.017784f, -0.023660f, +0.017313f, -0.008932f, -0.060202f, +0.019687f, +0.044032f, +0.028726f, +0.014628f, +0.010571f, + +0.016295f, +0.005062f, -0.011090f, +0.008120f, +0.012379f, -0.008216f, -0.002725f, +0.009090f, -0.004862f, +0.015156f, + -0.002330f, -0.016207f, -0.003305f, +0.021964f, +0.004520f, +0.012016f, +0.013241f, -0.002677f, -0.000497f, -0.014794f, + -0.006616f, +0.003197f, +0.001521f, -0.004593f, -0.008571f, +0.004373f, +0.010069f, -0.005577f, +0.000010f, -0.000164f, + +0.003991f, +0.004927f, +0.000367f, +0.003201f, +0.003953f, +0.002115f, +0.013600f, -0.005750f, +0.002082f, +0.004066f, + -0.002283f, -0.014808f, -0.002113f, +0.005140f, +0.001946f, +0.004829f, -0.007151f, +0.002035f, -0.002325f, +0.001926f, + +0.000387f, -0.001198f, -0.004384f, -0.001096f, +0.004639f, -0.005358f, -0.000607f, +0.000501f, -0.001096f, +0.000932f, + +0.005794f, +0.002575f, -0.003372f, +0.001924f, -0.003836f, -0.002705f, +0.000426f, +0.000188f, +0.001860f, +0.000795f, + -0.003122f, +0.000264f, +0.002722f, +0.000355f, +0.001407f, -0.000081f + }, + { + -0.000292f, +0.045813f, -0.027426f, +0.023937f, +0.013236f, -0.023654f, -0.019026f, -0.030879f, -0.013647f, -0.001243f, + +0.006026f, +0.009518f, -0.024462f, +0.041974f, -0.009884f, -0.009945f, -0.005696f, +0.039739f, -0.028907f, -0.006701f, + +0.014526f, -0.012072f, +0.049539f, -0.019781f, +0.007762f, +0.009956f, +0.004250f, +0.042154f, +0.017895f, -0.009360f, + -0.009704f, -0.035757f, +0.000379f, -0.012567f, -0.013538f, +0.001904f, -0.008791f, +0.006200f, -0.006549f, -0.001555f, + -0.016914f, +0.010976f, +0.001691f, +0.019805f, -0.000880f, +0.012322f, +0.004197f, +0.009170f, +0.001661f, -0.002652f, + -0.002766f, +0.007139f, -0.006645f, -0.008150f, -0.010691f, +0.002825f, -0.008978f, -0.007460f, -0.001194f, -0.001047f, + -0.004465f, +0.002731f, -0.001346f, +0.005964f, +0.006599f, +0.000813f, +0.003638f, -0.001720f, -0.008341f, -0.001109f, + +0.001207f, -0.000299f, -0.004838f, +0.008108f, -0.003626f, -0.009282f, -0.000209f, -0.006926f, +0.002427f, -0.000334f, + +0.001477f, +0.001444f, +0.001045f, -0.004720f, -0.006507f, -0.007144f, -0.004142f, -0.001276f, -0.000952f, +0.002558f, + -0.002568f, +0.005110f, -0.001201f, -0.000612f, +0.002498f, +0.000578f + }, + { + -0.024105f, -0.137203f, +0.010973f, -0.015308f, +0.025466f, +0.065357f, -0.009399f, +0.002382f, +0.044540f, +0.031244f, + -0.002562f, +0.024364f, -0.018343f, +0.018353f, +0.043637f, +0.040549f, -0.003950f, -0.013274f, +0.029446f, -0.002059f, + +0.001127f, -0.026097f, -0.004026f, +0.018116f, +0.001859f, -0.001413f, -0.000533f, +0.010501f, -0.007652f, -0.004281f, + +0.004047f, +0.003513f, -0.018948f, +0.001010f, -0.016655f, -0.003030f, +0.005809f, +0.006194f, +0.003043f, -0.015047f, + -0.015145f, -0.008123f, +0.005350f, +0.003629f, +0.009596f, +0.004762f, -0.003486f, +0.004742f, +0.010106f, -0.011423f, + +0.012553f, +0.004019f, +0.001857f, -0.001756f, -0.011325f, -0.000648f, +0.012020f, -0.004381f, +0.008129f, -0.002506f, + -0.004640f, +0.001033f, -0.008228f, +0.000857f, -0.006266f, -0.006133f, +0.007153f, +0.007356f, +0.010736f, -0.003607f, + -0.003680f, +0.011121f, -0.001529f, +0.000938f, -0.000049f, -0.003812f, -0.001038f, -0.002385f, -0.000238f, -0.002834f, + -0.005174f, -0.001030f, -0.002665f, -0.009526f, -0.003778f, +0.001003f, +0.001947f, +0.001383f, -0.001828f, -0.001620f, + -0.000650f, +0.004030f, -0.003916f, +0.001296f, +0.001439f, +0.000349f + }, + { + +0.002057f, -0.051094f, -0.032740f, +0.013500f, -0.007149f, -0.011159f, +0.017025f, -0.014348f, -0.010655f, -0.002051f, + +0.008366f, -0.003646f, -0.001821f, -0.019191f, +0.116969f, -0.020863f, -0.007412f, -0.010879f, -0.007494f, +0.001913f, + -0.008340f, +0.055903f, -0.012694f, +0.014017f, -0.007378f, +0.010871f, -0.008975f, +0.010167f, +0.013185f, -0.001991f, + -0.045194f, +0.009569f, -0.008252f, +0.011966f, +0.022143f, -0.008358f, +0.026214f, -0.015732f, -0.016553f, +0.002636f, + +0.002587f, +0.000924f, +0.013845f, -0.000574f, +0.000200f, -0.003037f, +0.001734f, -0.002112f, -0.006658f, +0.012864f, + -0.002736f, -0.003053f, +0.007196f, +0.009895f, +0.006202f, +0.008100f, +0.008789f, +0.004108f, +0.008828f, +0.011035f, + -0.002792f, -0.015813f, +0.002575f, +0.005290f, +0.007307f, +0.003501f, -0.000436f, -0.006752f, +0.007349f, -0.001456f, + -0.005962f, +0.003149f, +0.007881f, -0.003885f, +0.003054f, -0.003801f, -0.016169f, -0.001679f, +0.003918f, +0.006598f, + -0.002929f, +0.008456f, -0.003514f, +0.001390f, +0.005887f, +0.006557f, +0.003320f, +0.005374f, -0.003734f, +0.001770f, + +0.000701f, +0.000168f, -0.002744f, +0.003159f, -0.001246f, +0.001894f + } + }, + { + { + -0.010394f, -0.002092f, +0.014685f, +0.090592f, -0.039118f, -0.001616f, +0.011465f, +0.000433f, -0.017349f, +0.004366f, + +0.008254f, +0.007351f, -0.010307f, -0.005193f, +0.008519f, -0.000123f, -0.015778f, +0.004291f, +0.035991f, -0.011386f, + -0.007520f, +0.008577f, -0.002885f, +0.019850f, +0.013065f, -0.000239f, -0.013133f, +0.007685f, -0.001405f, +0.000803f, + +0.003089f, +0.008168f, -0.005827f, -0.007352f, +0.012115f, -0.004539f, -0.010407f, -0.004286f, +0.004002f, +0.007088f, + +0.004006f, +0.006467f, -0.004205f, -0.001847f, -0.007637f, +0.000070f, +0.002755f, +0.000563f, -0.000715f, +0.006763f, + +0.008490f, -0.005025f, -0.003870f, +0.000826f, +0.002344f, -0.006625f, -0.003159f, +0.003365f, +0.000175f, -0.001452f, + -0.000786f, +0.003728f, +0.001179f, -0.002474f, +0.006638f, -0.000303f, -0.002095f, -0.000686f, -0.002793f, +0.002316f, + +0.000741f, -0.004538f, +0.003523f, +0.001277f, -0.003541f, +0.003901f, -0.006159f, -0.004939f, +0.003142f, -0.000845f, + -0.002250f, -0.001011f, +0.001303f, +0.003084f, +0.002414f, +0.001727f, -0.000857f, -0.002804f, +0.000733f, +0.000454f, + -0.002921f, -0.001224f, -0.002510f, +0.000564f, +0.001000f, -0.001499f + }, + { + -0.002622f, +0.083941f, -0.030991f, -0.025403f, -0.026578f, +0.003222f, -0.004264f, +0.006492f, -0.002626f, +0.017516f, + +0.001196f, -0.014660f, -0.011133f, -0.001331f, +0.007999f, -0.000065f, +0.027228f, +0.002748f, -0.000775f, +0.016712f, + +0.027244f, +0.020213f, -0.003080f, +0.003978f, +0.021441f, -0.006141f, -0.011422f, -0.019401f, +0.015707f, -0.024964f, + +0.001756f, -0.029023f, +0.016485f, -0.031129f, -0.010555f, +0.004211f, +0.000868f, +0.006347f, -0.004147f, -0.000612f, + -0.006009f, +0.012384f, -0.002550f, +0.018426f, +0.003834f, +0.003813f, -0.004953f, -0.001824f, -0.003554f, +0.003054f, + +0.004288f, -0.001257f, +0.002736f, +0.001608f, +0.001237f, -0.004476f, +0.003763f, -0.003839f, +0.005222f, +0.004572f, + -0.003353f, -0.000888f, -0.004924f, +0.004433f, -0.000135f, +0.003887f, +0.001571f, -0.000010f, +0.000692f, -0.001885f, + +0.001959f, +0.000888f, -0.001117f, -0.004549f, -0.001709f, -0.002799f, +0.001014f, +0.002634f, -0.002090f, -0.003552f, + +0.001062f, +0.002498f, +0.003731f, +0.001088f, +0.001462f, +0.000635f, +0.001886f, +0.002727f, +0.000703f, -0.001868f, + -0.000506f, -0.000408f, -0.002007f, -0.002085f, +0.001534f, +0.000912f + }, + { + +0.001908f, +0.140841f, -0.022395f, -0.004273f, -0.034367f, -0.004109f, +0.009622f, +0.010332f, -0.015403f, +0.019920f, + -0.008883f, -0.009154f, -0.013823f, -0.000297f, -0.006113f, +0.004708f, +0.021541f, -0.004115f, +0.000722f, +0.002608f, + +0.009418f, -0.003327f, -0.003526f, -0.014008f, +0.010916f, -0.014374f, -0.021637f, +0.004375f, -0.018312f, -0.007387f, + +0.001861f, -0.007201f, -0.009239f, -0.000429f, -0.019515f, -0.001532f, +0.013964f, -0.002833f, +0.005818f, +0.000600f, + +0.000087f, +0.006759f, +0.004729f, -0.004728f, -0.018892f, -0.000509f, +0.007499f, +0.001442f, +0.007681f, +0.001789f, + +0.004532f, -0.010509f, +0.007051f, +0.003543f, +0.000319f, -0.002517f, -0.000776f, +0.002393f, +0.003043f, +0.004951f, + -0.000592f, +0.005844f, +0.003745f, +0.006152f, +0.001695f, +0.000742f, -0.002101f, +0.007115f, +0.001934f, -0.002534f, + +0.002287f, -0.001225f, -0.004654f, +0.004689f, +0.001484f, -0.002609f, +0.004612f, -0.003018f, +0.002528f, +0.004485f, + -0.003644f, -0.001966f, +0.003252f, -0.004249f, -0.001106f, +0.001877f, -0.002513f, -0.000717f, -0.000381f, +0.003352f, + -0.001076f, +0.000530f, +0.002636f, -0.001203f, +0.001927f, -0.000078f + }, + { + +0.009850f, -0.287640f, -0.003614f, +0.057733f, +0.009184f, -0.009172f, +0.006855f, +0.006160f, +0.004050f, +0.009036f, + -0.018228f, +0.003672f, -0.016374f, +0.008261f, -0.000378f, -0.024162f, +0.012506f, -0.002961f, +0.021562f, -0.022658f, + +0.002035f, +0.002655f, +0.008969f, +0.018899f, -0.000846f, +0.006687f, +0.018162f, +0.010302f, +0.009814f, +0.002079f, + +0.001935f, -0.008387f, +0.001077f, +0.006733f, -0.002973f, -0.011041f, -0.004697f, +0.007187f, +0.012390f, -0.002386f, + +0.014593f, -0.007290f, +0.009331f, -0.004059f, +0.004967f, -0.003280f, -0.006452f, -0.005122f, -0.002851f, -0.000206f, + +0.003477f, +0.000976f, -0.005863f, -0.002783f, -0.004715f, -0.001286f, +0.002311f, -0.004062f, +0.004548f, +0.004312f, + +0.001190f, -0.007906f, -0.003241f, -0.005365f, +0.005754f, +0.000216f, +0.003742f, -0.002399f, +0.001988f, -0.001334f, + +0.002914f, +0.003672f, +0.005308f, +0.000866f, -0.000137f, +0.001611f, +0.000036f, -0.003553f, -0.002757f, -0.000442f, + +0.000586f, +0.000087f, -0.001110f, +0.001010f, -0.001857f, +0.001091f, +0.002982f, +0.000619f, +0.002111f, +0.000846f, + +0.000648f, -0.002507f, +0.001347f, -0.000341f, -0.004285f, +0.001711f + }, + { + +0.000483f, +0.089116f, +0.015895f, -0.008326f, +0.003051f, -0.004753f, +0.002128f, +0.009260f, -0.003095f, +0.007477f, + -0.009551f, -0.008648f, +0.001091f, +0.005974f, -0.008371f, -0.001008f, -0.008247f, -0.015783f, +0.008327f, +0.008204f, + +0.006628f, -0.008102f, +0.007549f, +0.003880f, -0.011619f, +0.006536f, +0.004445f, -0.007495f, +0.005797f, -0.021939f, + +0.006753f, -0.008064f, +0.026650f, -0.011503f, +0.006571f, -0.019652f, -0.000310f, -0.007395f, -0.000196f, +0.000852f, + -0.004659f, +0.011020f, +0.008352f, -0.013166f, -0.013977f, +0.006065f, +0.000359f, -0.000782f, -0.000937f, -0.006431f, + -0.000418f, -0.007252f, +0.000692f, -0.003222f, +0.002000f, +0.005743f, -0.001507f, +0.005614f, +0.000738f, -0.000166f, + -0.000750f, -0.007291f, -0.005119f, -0.003306f, +0.003468f, -0.007836f, -0.000578f, +0.002914f, +0.006902f, +0.005162f, + -0.003592f, +0.002795f, +0.003158f, -0.000627f, +0.001251f, +0.000423f, -0.004414f, +0.000494f, -0.001984f, -0.001636f, + -0.003977f, +0.003387f, +0.000882f, -0.001456f, -0.001770f, +0.001797f, -0.001470f, +0.001088f, +0.000612f, +0.000190f, + -0.002622f, +0.002562f, -0.000606f, -0.000203f, -0.001770f, -0.002585f + }, + { + +0.016465f, -0.314510f, +0.026380f, +0.118595f, +0.002758f, -0.013442f, +0.005082f, +0.029235f, +0.001966f, -0.010841f, + -0.003216f, +0.008232f, +0.000429f, -0.013569f, -0.006457f, -0.018458f, -0.020368f, -0.005779f, +0.007171f, +0.027700f, + +0.008406f, +0.013971f, -0.007347f, +0.011506f, -0.005363f, -0.004083f, +0.005544f, +0.003282f, +0.001155f, +0.006487f, + -0.000185f, -0.008857f, -0.011658f, -0.009793f, +0.002007f, -0.005710f, +0.014659f, -0.007242f, +0.001192f, -0.009745f, + +0.009279f, -0.003625f, +0.012476f, +0.001411f, +0.002898f, -0.004812f, +0.001355f, +0.014623f, +0.010641f, +0.011098f, + -0.006106f, -0.002996f, -0.001157f, -0.011079f, +0.002389f, -0.000094f, -0.005499f, -0.010088f, -0.000375f, +0.003146f, + +0.002022f, -0.000315f, -0.002870f, +0.008147f, +0.000668f, -0.008260f, +0.002584f, -0.004048f, +0.004509f, +0.000406f, + -0.000399f, -0.010502f, -0.002150f, -0.001106f, -0.003138f, -0.004001f, -0.000187f, -0.001549f, +0.000086f, +0.001153f, + +0.003557f, +0.003764f, +0.005630f, -0.002596f, -0.000269f, +0.001169f, -0.005668f, +0.002306f, -0.004458f, +0.000773f, + +0.000017f, +0.000402f, +0.001759f, -0.001568f, -0.000119f, +0.002320f + }, + { + -0.003729f, -0.017406f, -0.032684f, -0.019163f, +0.014209f, -0.004825f, -0.005193f, -0.003139f, +0.000903f, +0.004428f, + +0.003786f, +0.006563f, +0.012654f, -0.019306f, -0.009839f, +0.001464f, -0.008066f, +0.018878f, +0.014081f, +0.028687f, + +0.020318f, +0.009801f, +0.000874f, +0.041014f, -0.019278f, -0.008199f, +0.012416f, -0.001357f, -0.004432f, +0.005776f, + +0.007555f, +0.013171f, -0.011762f, +0.001127f, +0.003203f, -0.000816f, -0.001113f, -0.006167f, -0.001700f, +0.005492f, + -0.011352f, +0.001107f, +0.000471f, +0.009733f, +0.009014f, -0.006159f, +0.003315f, +0.001485f, -0.005724f, +0.013029f, + +0.004030f, +0.002056f, -0.010716f, -0.005107f, -0.004969f, -0.000647f, +0.005060f, -0.003860f, +0.003124f, +0.001450f, + +0.004597f, -0.004897f, -0.011643f, +0.000753f, +0.001556f, +0.001591f, +0.003632f, +0.003983f, -0.000871f, +0.008171f, + -0.002394f, -0.008819f, -0.000846f, +0.000956f, -0.000601f, +0.007310f, -0.005795f, -0.001321f, +0.002444f, +0.000361f, + +0.003980f, +0.002019f, -0.000487f, -0.002908f, -0.000683f, -0.004223f, +0.003911f, +0.002129f, +0.001132f, +0.000979f, + +0.000824f, -0.001184f, -0.000546f, +0.002872f, +0.000406f, +0.002538f + }, + { + +0.009512f, -0.289348f, +0.026840f, +0.108329f, -0.003061f, -0.018179f, -0.001701f, +0.008726f, +0.015717f, +0.009857f, + -0.018530f, -0.007057f, +0.019208f, +0.006444f, +0.005569f, +0.023656f, +0.007180f, -0.010221f, +0.026895f, +0.009673f, + +0.000909f, -0.004342f, +0.006610f, -0.009092f, -0.006244f, -0.001535f, +0.007540f, -0.006324f, -0.006521f, +0.004955f, + -0.005561f, -0.010774f, +0.011320f, -0.000952f, -0.012084f, -0.001813f, -0.012052f, +0.002320f, -0.006841f, +0.001832f, + -0.006349f, +0.003503f, +0.000241f, -0.001582f, +0.003392f, +0.000711f, +0.004257f, -0.000848f, -0.006371f, -0.003774f, + +0.005992f, -0.008920f, +0.014833f, -0.003635f, -0.004748f, +0.000455f, +0.000302f, +0.011121f, +0.000884f, -0.004848f, + -0.001627f, -0.000147f, +0.000611f, -0.008156f, -0.003282f, -0.006087f, -0.004077f, -0.001318f, +0.000377f, -0.004705f, + -0.003918f, +0.000388f, -0.000753f, +0.000694f, +0.000565f, +0.000379f, -0.000796f, +0.001974f, +0.001021f, +0.004674f, + -0.000579f, +0.001092f, +0.000334f, +0.000165f, +0.001575f, +0.001099f, +0.003207f, -0.000482f, -0.000825f, +0.000403f, + +0.000814f, +0.000398f, +0.000777f, -0.002511f, -0.001929f, +0.000879f + }, + { + -0.004280f, -0.066159f, -0.035272f, -0.015068f, +0.016132f, +0.001191f, -0.004233f, +0.003818f, +0.004500f, -0.001989f, + +0.007467f, -0.017603f, +0.005693f, +0.001497f, +0.011480f, -0.011923f, +0.009080f, -0.012733f, +0.002648f, +0.017919f, + +0.007838f, +0.005412f, +0.010712f, -0.032708f, +0.007221f, -0.005990f, -0.003863f, -0.001249f, +0.000948f, -0.016743f, + -0.007014f, +0.007896f, +0.007928f, -0.020899f, +0.006536f, -0.006933f, -0.000464f, +0.004923f, -0.001198f, -0.004709f, + -0.012254f, -0.007958f, -0.001000f, +0.001971f, +0.003025f, +0.006628f, -0.002202f, -0.002509f, +0.004248f, -0.003733f, + +0.000722f, +0.002325f, -0.001128f, -0.000927f, +0.000562f, -0.007313f, -0.004633f, +0.007934f, -0.000247f, -0.000708f, + +0.004858f, -0.000923f, -0.004577f, +0.002195f, +0.001714f, +0.000370f, +0.004488f, +0.000558f, -0.005031f, +0.000278f, + +0.001941f, -0.000730f, +0.000426f, +0.000449f, -0.002950f, +0.004327f, -0.000030f, +0.000985f, +0.004656f, -0.003452f, + +0.003056f, +0.005105f, +0.001477f, +0.000943f, -0.002290f, -0.000879f, -0.001266f, +0.002084f, +0.000664f, -0.000614f, + -0.002067f, +0.000869f, -0.001423f, -0.001711f, +0.000722f, +0.001384f + }, + { + -0.004340f, -0.202335f, +0.021244f, -0.003717f, +0.013086f, -0.012061f, +0.010610f, -0.027748f, -0.001784f, -0.023157f, + -0.015462f, -0.004040f, +0.002747f, +0.031552f, +0.005121f, +0.005393f, -0.006106f, +0.003601f, -0.023878f, -0.011857f, + +0.000523f, -0.005182f, -0.010823f, +0.004274f, +0.012613f, +0.000699f, -0.011983f, +0.008306f, +0.006668f, -0.030498f, + -0.000829f, +0.001951f, -0.009957f, -0.001532f, -0.021101f, -0.004053f, +0.006376f, -0.003131f, -0.027582f, +0.009213f, + -0.007375f, -0.003570f, +0.000405f, +0.022312f, -0.011575f, -0.007237f, -0.001272f, -0.005501f, -0.009616f, -0.010181f, + +0.008269f, -0.010273f, +0.007113f, -0.003144f, -0.006133f, -0.004000f, -0.003211f, -0.000226f, +0.011819f, +0.001636f, + +0.003682f, +0.009624f, -0.001048f, +0.003820f, -0.001445f, -0.000070f, -0.003368f, +0.001881f, +0.005104f, -0.000707f, + +0.002649f, -0.002805f, +0.004144f, -0.007948f, +0.003799f, -0.002015f, -0.002431f, +0.009498f, +0.004301f, +0.002758f, + -0.001909f, +0.006090f, -0.010853f, +0.006928f, +0.004946f, +0.001170f, -0.001652f, +0.000451f, -0.004545f, -0.001054f, + -0.001203f, +0.000774f, +0.002615f, -0.001578f, -0.000844f, -0.002698f + }, + { + +0.000563f, +0.088630f, +0.043369f, -0.022853f, -0.026759f, -0.009043f, +0.032181f, -0.008189f, -0.023970f, -0.001919f, + -0.012884f, -0.008643f, +0.024476f, +0.011137f, -0.031494f, -0.040832f, +0.013469f, +0.032270f, -0.015995f, -0.002003f, + +0.021488f, -0.007803f, -0.005755f, -0.013125f, -0.006499f, -0.008001f, -0.013702f, -0.005932f, +0.015447f, +0.003086f, + -0.020658f, +0.002352f, -0.035327f, +0.010515f, -0.003657f, -0.002651f, -0.000829f, -0.005698f, -0.000843f, -0.002866f, + +0.004559f, -0.001490f, -0.003209f, +0.007779f, +0.006698f, -0.002968f, +0.004920f, -0.011597f, -0.004716f, -0.006573f, + +0.009926f, +0.001981f, -0.007883f, +0.006002f, -0.002604f, +0.005244f, -0.005863f, -0.012828f, -0.002475f, -0.004123f, + +0.003564f, -0.005100f, +0.003486f, +0.005631f, -0.003657f, +0.008758f, +0.001549f, -0.002103f, -0.005688f, -0.000977f, + +0.001539f, +0.000974f, +0.001015f, +0.005107f, -0.007817f, +0.000633f, +0.005195f, +0.009164f, +0.001562f, -0.000662f, + +0.001010f, -0.002373f, +0.002362f, +0.006257f, +0.004305f, +0.004514f, -0.002589f, +0.000471f, +0.004316f, +0.003265f, + +0.000308f, +0.000772f, -0.000885f, -0.002443f, +0.000472f, +0.000375f + }, + { + +0.034737f, -0.067106f, -0.021198f, -0.018581f, +0.002964f, +0.010530f, -0.061587f, -0.006990f, +0.008396f, +0.007216f, + +0.019212f, -0.001079f, +0.026311f, +0.013598f, -0.020592f, +0.028956f, +0.012907f, -0.004386f, +0.010121f, +0.003616f, + -0.004462f, -0.005177f, +0.000981f, +0.022133f, +0.020369f, +0.000401f, -0.001407f, -0.005237f, -0.002854f, +0.010207f, + +0.007825f, +0.006263f, +0.006584f, +0.006699f, -0.010288f, +0.010622f, +0.005245f, +0.003453f, +0.008221f, -0.003584f, + -0.006184f, +0.001683f, -0.003585f, -0.011724f, -0.007556f, +0.005130f, +0.004566f, -0.002681f, +0.008538f, +0.002430f, + -0.007868f, -0.008310f, -0.001076f, +0.002830f, +0.011648f, +0.007316f, +0.007028f, -0.007806f, +0.006437f, +0.006147f, + -0.000504f, -0.006803f, +0.003196f, +0.006640f, +0.000523f, +0.007618f, -0.004345f, +0.005194f, +0.004824f, -0.000229f, + -0.001514f, +0.003107f, -0.005085f, -0.001825f, +0.004982f, -0.002469f, +0.001657f, +0.003029f, +0.001427f, -0.000292f, + +0.003998f, -0.000360f, -0.007776f, -0.001723f, -0.002390f, +0.001195f, +0.001126f, -0.002559f, +0.002202f, +0.000283f, + -0.002239f, +0.001916f, +0.000330f, +0.000603f, +0.004911f, -0.002515f + }, + { + -0.000577f, +0.095942f, -0.005818f, +0.011106f, +0.006199f, -0.007066f, +0.002047f, -0.012396f, +0.001069f, -0.005302f, + +0.005044f, -0.002350f, -0.009193f, +0.059418f, -0.037327f, -0.034915f, -0.009528f, +0.036894f, -0.021158f, +0.004640f, + +0.017351f, -0.019146f, +0.029160f, -0.032707f, +0.004557f, +0.002085f, -0.022078f, +0.000143f, +0.000953f, -0.001188f, + -0.000447f, -0.015471f, +0.016892f, +0.022451f, +0.012329f, +0.013719f, -0.012077f, -0.014568f, -0.024514f, -0.000737f, + -0.003911f, +0.001270f, -0.008997f, +0.018689f, -0.008214f, +0.001261f, -0.006860f, +0.001039f, +0.001121f, +0.001052f, + -0.005593f, +0.003598f, -0.002413f, -0.001769f, -0.002144f, +0.005721f, -0.003523f, -0.005240f, -0.006194f, +0.000596f, + -0.006740f, -0.000333f, -0.002942f, -0.002943f, +0.001294f, +0.004331f, +0.002470f, -0.001923f, -0.006080f, -0.001790f, + -0.000068f, +0.002135f, -0.007361f, +0.007055f, -0.000038f, -0.008493f, +0.002427f, -0.002379f, +0.003097f, +0.000157f, + +0.004587f, +0.004762f, +0.002076f, +0.000353f, -0.000411f, -0.001041f, -0.002813f, +0.002264f, +0.001429f, +0.002835f, + -0.001797f, -0.000980f, -0.007218f, -0.003082f, +0.001779f, -0.000505f + }, + { + +0.026988f, -0.117020f, -0.022642f, -0.023239f, +0.003526f, -0.000468f, -0.050612f, -0.001201f, +0.002173f, +0.002815f, + -0.010410f, +0.027774f, -0.023714f, -0.000501f, +0.020315f, +0.010904f, +0.016418f, +0.010466f, +0.018043f, -0.015843f, + +0.003686f, -0.020582f, +0.001316f, +0.020144f, +0.009191f, +0.003441f, -0.004515f, +0.016919f, +0.003412f, -0.000556f, + -0.002027f, +0.008306f, +0.003515f, +0.021313f, -0.009977f, -0.014258f, +0.001180f, +0.001577f, -0.001933f, -0.009941f, + -0.011428f, +0.004717f, +0.002886f, -0.001236f, +0.012548f, +0.009406f, +0.012212f, +0.006545f, +0.001760f, -0.010315f, + +0.021959f, +0.005656f, +0.007761f, +0.010022f, +0.004777f, +0.004927f, +0.011260f, -0.009950f, +0.007775f, +0.001491f, + -0.008213f, -0.003491f, -0.004302f, +0.001068f, -0.002259f, -0.001183f, +0.003034f, -0.001053f, +0.003182f, -0.003184f, + -0.004563f, +0.010797f, -0.003612f, -0.001761f, +0.000720f, +0.000094f, +0.001775f, -0.001854f, +0.002004f, +0.001511f, + -0.003501f, -0.001796f, +0.001610f, -0.001656f, -0.000555f, +0.001020f, -0.000150f, -0.002016f, +0.000151f, +0.001391f, + -0.000510f, +0.005267f, -0.001357f, +0.002574f, +0.000617f, -0.001532f + }, + { + -0.000639f, +0.031559f, +0.018303f, +0.013030f, -0.006577f, +0.004265f, +0.025033f, -0.007664f, +0.007632f, +0.005967f, + +0.011457f, -0.009046f, -0.001470f, -0.035848f, +0.089214f, +0.000780f, +0.048302f, +0.023972f, +0.014944f, +0.016927f, + -0.033924f, +0.026486f, -0.013123f, +0.006530f, -0.013155f, +0.019441f, +0.002268f, +0.020217f, -0.004292f, -0.006306f, + -0.033795f, +0.002787f, -0.000010f, +0.015484f, +0.013586f, -0.003115f, +0.019821f, -0.020716f, -0.006211f, +0.001524f, + -0.009405f, -0.004171f, +0.020641f, +0.011655f, +0.006567f, +0.001051f, +0.001540f, -0.002108f, -0.005869f, -0.000392f, + -0.008487f, -0.002448f, -0.006623f, +0.001616f, -0.000641f, -0.001235f, +0.000251f, -0.007495f, +0.001607f, +0.002808f, + -0.002214f, -0.011874f, -0.006247f, -0.002857f, +0.003579f, +0.004388f, +0.004301f, -0.002807f, +0.007201f, -0.003037f, + -0.008435f, +0.003420f, +0.004835f, -0.007025f, -0.004156f, -0.002036f, -0.009507f, -0.004467f, -0.003161f, +0.004861f, + -0.003003f, +0.009002f, +0.000512f, -0.000567f, -0.000182f, +0.002360f, -0.001945f, +0.003342f, -0.001005f, +0.001071f, + -0.000475f, +0.000344f, -0.002446f, +0.005321f, +0.001059f, +0.004118f + } + }, + { + { + +0.006256f, +0.077198f, +0.001388f, -0.027580f, +0.039752f, +0.012062f, +0.002395f, -0.008980f, -0.016078f, +0.004213f, + +0.009863f, +0.003410f, -0.002793f, -0.004258f, -0.007459f, +0.016436f, -0.020977f, +0.010021f, +0.008523f, -0.025822f, + +0.018856f, +0.002421f, +0.012078f, +0.018060f, +0.006704f, -0.011193f, -0.006291f, -0.004367f, -0.005784f, +0.005453f, + +0.019756f, -0.003239f, -0.010137f, +0.000101f, +0.008380f, +0.004413f, -0.020878f, +0.004801f, +0.001284f, +0.000581f, + +0.001382f, +0.001289f, -0.002226f, +0.002436f, -0.006825f, -0.008336f, +0.005489f, -0.004473f, +0.011358f, -0.001712f, + +0.003862f, +0.003626f, -0.005089f, +0.001128f, +0.001885f, -0.002276f, -0.003488f, +0.006294f, -0.001379f, +0.003081f, + -0.000569f, +0.004487f, -0.000358f, +0.000748f, -0.000479f, +0.003874f, -0.009772f, -0.003596f, -0.000189f, +0.001366f, + +0.003714f, -0.003415f, +0.000380f, +0.002646f, +0.001900f, +0.001167f, -0.005924f, -0.002763f, +0.001245f, -0.003767f, + +0.000320f, -0.004341f, +0.004913f, +0.000208f, +0.002397f, -0.000749f, -0.000413f, -0.001791f, +0.000666f, -0.001379f, + -0.001900f, -0.002815f, -0.001677f, +0.000923f, +0.000806f, -0.003007f + }, + { + +0.003319f, -0.023953f, +0.054181f, -0.048387f, -0.021781f, +0.000625f, +0.003753f, -0.000379f, -0.005010f, +0.013887f, + -0.001945f, -0.008002f, +0.007843f, -0.024206f, +0.008734f, +0.010268f, +0.007864f, +0.004711f, +0.028108f, +0.013015f, + +0.008487f, +0.025687f, +0.008998f, +0.001248f, -0.000608f, +0.009781f, -0.011568f, -0.015617f, +0.004374f, -0.007223f, + -0.014856f, -0.017814f, -0.006654f, -0.011902f, -0.004126f, +0.006134f, -0.004859f, +0.003281f, -0.000988f, +0.001858f, + -0.011206f, +0.009168f, +0.012178f, +0.000316f, +0.010913f, +0.005834f, -0.003165f, -0.006158f, -0.002301f, +0.000421f, + -0.003917f, +0.007037f, +0.002543f, +0.006195f, +0.000471f, -0.001775f, -0.003157f, +0.003069f, +0.005181f, -0.000427f, + -0.001612f, +0.004088f, -0.007450f, +0.002326f, +0.002260f, -0.001891f, +0.003618f, +0.002444f, -0.002218f, +0.000907f, + +0.004417f, -0.000701f, -0.003393f, -0.000718f, -0.001552f, -0.002725f, +0.000054f, +0.005006f, +0.000317f, -0.007311f, + +0.003087f, +0.005381f, -0.000363f, -0.000052f, +0.000623f, -0.000641f, +0.002895f, +0.002104f, +0.001490f, -0.001494f, + -0.000839f, -0.001244f, -0.001058f, -0.000316f, -0.002058f, +0.000224f + }, + { + -0.001233f, +0.155753f, -0.021313f, -0.073044f, +0.023049f, -0.004183f, +0.010129f, +0.008187f, -0.010413f, +0.004393f, + -0.006906f, -0.018171f, -0.004208f, -0.003558f, -0.004083f, +0.014572f, +0.010771f, +0.014574f, -0.010836f, -0.003027f, + +0.004673f, +0.013422f, -0.022481f, -0.009892f, +0.005250f, -0.018355f, -0.009583f, -0.007639f, -0.000430f, -0.003731f, + -0.012849f, +0.002969f, -0.008224f, -0.017143f, -0.005552f, +0.001470f, +0.016467f, -0.000596f, -0.000728f, +0.002496f, + +0.004478f, +0.000888f, +0.003327f, -0.005923f, -0.004696f, -0.005218f, +0.006783f, -0.003650f, -0.000810f, +0.006125f, + +0.001686f, +0.000002f, -0.003481f, +0.006913f, -0.000907f, -0.002469f, +0.006445f, -0.003072f, +0.004591f, +0.006148f, + +0.001764f, +0.007632f, +0.000832f, -0.001764f, +0.008451f, -0.003243f, +0.001595f, +0.005665f, -0.003271f, -0.001402f, + +0.002791f, +0.004684f, -0.009527f, +0.004008f, -0.002305f, +0.005343f, +0.001235f, +0.002784f, -0.001930f, +0.006880f, + -0.004939f, +0.001257f, -0.000978f, -0.002759f, -0.002490f, -0.000447f, -0.001041f, -0.001919f, +0.001431f, +0.000919f, + +0.002012f, +0.001320f, -0.000775f, +0.002187f, -0.001379f, +0.001085f + }, + { + -0.011693f, -0.246293f, -0.006749f, +0.081454f, -0.006698f, -0.009087f, -0.000984f, -0.002373f, -0.001392f, +0.025583f, + -0.011449f, -0.011998f, +0.001604f, -0.005464f, -0.003081f, +0.002763f, -0.002619f, +0.005244f, +0.010076f, -0.002694f, + -0.008182f, -0.000838f, +0.011232f, +0.023329f, -0.011203f, +0.011474f, +0.014733f, +0.019992f, +0.013727f, +0.003469f, + -0.005336f, +0.009799f, -0.008411f, -0.004421f, -0.002037f, -0.016436f, +0.013578f, -0.001642f, +0.009279f, +0.003302f, + +0.006662f, +0.009248f, +0.001024f, +0.002301f, -0.002257f, -0.019510f, +0.006770f, -0.006607f, +0.002622f, +0.000370f, + -0.003875f, -0.000374f, -0.004006f, -0.006301f, -0.008001f, +0.001824f, -0.001793f, -0.000140f, +0.002729f, -0.001784f, + +0.012655f, -0.008214f, -0.012505f, +0.000306f, -0.000829f, +0.004884f, +0.007115f, -0.003261f, -0.002293f, -0.000258f, + -0.001995f, +0.006280f, +0.007258f, -0.000946f, +0.001826f, +0.000582f, -0.001588f, -0.003189f, -0.003123f, +0.001492f, + -0.001540f, +0.001176f, +0.000694f, -0.002831f, -0.000800f, +0.001803f, -0.000994f, +0.001022f, +0.002761f, +0.005372f, + -0.001684f, -0.001128f, +0.002156f, -0.001992f, -0.001860f, +0.000401f + }, + { + +0.000524f, +0.069668f, +0.033309f, -0.010034f, -0.003989f, -0.000344f, -0.000743f, +0.007839f, -0.001635f, +0.005128f, + -0.005524f, -0.010351f, -0.007716f, -0.004903f, -0.012004f, +0.000381f, +0.014555f, -0.023261f, +0.009530f, +0.016451f, + +0.004000f, +0.001192f, -0.009181f, -0.010539f, +0.017264f, +0.001508f, -0.005299f, -0.003625f, +0.001134f, -0.029670f, + +0.004689f, +0.013371f, +0.006445f, +0.008371f, +0.008029f, -0.025362f, -0.005985f, -0.010914f, -0.003663f, +0.018908f, + -0.017906f, +0.013303f, -0.001186f, -0.006881f, -0.011270f, +0.005772f, +0.003567f, -0.006104f, +0.001151f, -0.002192f, + -0.005651f, -0.009359f, -0.001489f, -0.003276f, -0.000422f, +0.010227f, -0.001117f, +0.002751f, +0.004892f, -0.002784f, + -0.002832f, -0.007162f, -0.004506f, -0.000182f, -0.000552f, -0.007607f, -0.005286f, +0.007437f, +0.003928f, +0.003271f, + -0.000892f, +0.004582f, +0.004841f, -0.000457f, +0.001851f, -0.000636f, -0.003581f, -0.000011f, -0.003216f, -0.002381f, + -0.001138f, +0.003049f, -0.002714f, +0.002143f, -0.002847f, +0.000600f, -0.000634f, +0.000576f, +0.000522f, +0.000630f, + -0.000940f, +0.000638f, +0.000693f, -0.000802f, +0.000629f, -0.003299f + }, + { + -0.018102f, -0.230323f, +0.005182f, +0.116812f, +0.003739f, -0.006685f, -0.005607f, +0.020757f, +0.003378f, +0.002655f, + -0.013295f, +0.006317f, +0.017552f, -0.005982f, -0.019105f, -0.003539f, -0.025128f, -0.020072f, +0.005204f, +0.044402f, + +0.004548f, +0.001140f, +0.007079f, +0.014694f, +0.010494f, -0.012544f, +0.001709f, +0.009877f, +0.006763f, -0.004783f, + +0.007112f, -0.009547f, -0.018616f, -0.003794f, -0.008219f, +0.003862f, +0.000355f, +0.002082f, +0.000789f, -0.006130f, + +0.008091f, -0.000435f, +0.001006f, +0.005855f, -0.001185f, +0.005303f, +0.003629f, +0.014546f, +0.009876f, +0.007587f, + +0.004388f, -0.006651f, -0.010535f, -0.006317f, +0.003139f, -0.001719f, -0.011143f, -0.011368f, -0.004962f, +0.007935f, + +0.003379f, +0.002005f, -0.000979f, +0.001527f, +0.002222f, -0.005916f, +0.000935f, +0.000256f, +0.001346f, +0.004083f, + -0.002708f, -0.007583f, -0.005084f, -0.000259f, +0.000275f, -0.005810f, -0.004076f, -0.001391f, +0.000578f, +0.001983f, + +0.002351f, +0.003000f, +0.004593f, +0.001516f, +0.000499f, +0.000877f, -0.002515f, -0.004721f, -0.000500f, -0.000190f, + +0.001255f, +0.000845f, -0.002231f, +0.000576f, -0.001667f, +0.001334f + }, + { + +0.000758f, -0.047897f, -0.033227f, +0.004389f, -0.008007f, +0.003714f, -0.003760f, -0.002252f, -0.007646f, -0.001042f, + +0.015035f, -0.006727f, +0.010297f, -0.008086f, -0.010951f, -0.016053f, +0.003467f, +0.030158f, +0.020960f, +0.024064f, + +0.010772f, +0.017014f, +0.023651f, +0.005861f, +0.012876f, -0.009736f, -0.000858f, -0.007481f, +0.019489f, +0.009463f, + -0.002988f, +0.003297f, -0.000182f, +0.013706f, -0.017850f, +0.006180f, -0.005721f, -0.002386f, +0.011136f, -0.011889f, + -0.011318f, -0.001010f, +0.010679f, +0.010593f, -0.004355f, +0.002910f, +0.000344f, -0.004375f, +0.005416f, +0.012480f, + +0.000266f, -0.006424f, -0.004107f, -0.000778f, -0.010428f, -0.002618f, +0.005840f, +0.003042f, -0.003302f, +0.002549f, + +0.003359f, -0.007155f, -0.003515f, -0.002541f, +0.003695f, -0.000212f, +0.005604f, +0.001275f, +0.003023f, +0.001426f, + +0.002650f, -0.006779f, -0.004873f, -0.002176f, +0.003828f, +0.000962f, -0.002324f, +0.000077f, -0.001547f, +0.000734f, + +0.003537f, +0.005244f, -0.005172f, -0.000527f, -0.004622f, +0.000283f, +0.002925f, +0.001758f, +0.001809f, +0.001102f, + +0.001468f, -0.001212f, +0.001050f, -0.000262f, +0.001948f, +0.000740f + }, + { + -0.010889f, -0.232735f, +0.025470f, +0.085821f, +0.010601f, +0.002384f, -0.019284f, +0.009221f, +0.018817f, +0.007756f, + -0.020120f, -0.007707f, +0.022610f, -0.000349f, +0.027438f, +0.018402f, -0.025359f, +0.022027f, +0.013484f, +0.017592f, + -0.007433f, +0.001618f, -0.006568f, -0.005805f, -0.004449f, +0.004829f, +0.006059f, -0.000610f, -0.001088f, -0.005893f, + -0.006474f, -0.000087f, +0.009353f, -0.004314f, -0.011801f, +0.002021f, -0.001146f, -0.016631f, +0.001929f, -0.001760f, + +0.001521f, -0.008154f, +0.000565f, +0.008119f, +0.009193f, -0.001790f, -0.006471f, -0.002514f, +0.004975f, -0.005426f, + +0.000461f, +0.002414f, +0.003085f, +0.003028f, -0.000646f, +0.001020f, +0.000781f, +0.000949f, -0.001417f, -0.001218f, + +0.002754f, -0.006164f, +0.000460f, +0.002212f, -0.008747f, -0.001600f, -0.003727f, -0.006853f, +0.002628f, -0.004366f, + -0.001457f, -0.003698f, +0.002262f, +0.000334f, -0.001464f, -0.000514f, +0.000243f, +0.002636f, -0.000464f, +0.001996f, + +0.000585f, +0.002870f, +0.001653f, +0.001643f, +0.000504f, -0.001730f, +0.005667f, -0.001140f, -0.000687f, -0.001170f, + +0.002111f, +0.001202f, +0.000681f, -0.003435f, -0.004192f, +0.001123f + }, + { + -0.002533f, -0.046958f, -0.079200f, +0.009216f, +0.000660f, +0.004587f, -0.005340f, +0.005046f, +0.001238f, +0.001329f, + +0.005690f, -0.013838f, -0.010930f, +0.013434f, +0.008342f, +0.029951f, -0.025906f, -0.007554f, +0.005155f, +0.012395f, + +0.009711f, -0.008833f, -0.001230f, -0.018139f, +0.028475f, -0.018606f, -0.004345f, +0.004725f, -0.004404f, -0.022673f, + -0.001347f, +0.007134f, -0.005185f, +0.002015f, -0.012003f, +0.003863f, -0.005385f, -0.007855f, +0.007259f, -0.008420f, + -0.002786f, -0.015194f, +0.003075f, +0.003983f, +0.004614f, +0.001565f, +0.003356f, +0.000830f, -0.001810f, +0.002563f, + +0.000778f, -0.004723f, +0.005427f, -0.002389f, +0.001552f, -0.009787f, -0.000616f, -0.001389f, -0.001525f, +0.002557f, + +0.003571f, -0.001229f, +0.004235f, -0.004949f, +0.003217f, +0.006277f, +0.000085f, +0.000998f, -0.008010f, +0.001201f, + +0.001815f, +0.000994f, +0.002109f, -0.001051f, -0.004367f, +0.001139f, -0.001195f, +0.001901f, +0.002766f, +0.001127f, + +0.003348f, +0.003032f, +0.002186f, +0.001447f, +0.001071f, -0.003920f, -0.001094f, +0.002402f, +0.002059f, -0.000584f, + -0.003159f, +0.001974f, -0.003183f, -0.000544f, +0.001619f, +0.000290f + }, + { + +0.008149f, -0.099342f, -0.072183f, -0.005268f, +0.000521f, +0.005071f, -0.034893f, -0.015360f, -0.010323f, -0.008215f, + -0.022564f, +0.007874f, +0.006373f, +0.017630f, +0.019901f, -0.027824f, +0.014133f, -0.008965f, -0.002671f, +0.001110f, + -0.020366f, +0.011844f, -0.005757f, +0.005209f, +0.003928f, -0.017211f, -0.000433f, +0.003638f, -0.007582f, -0.022035f, + -0.005370f, +0.010909f, -0.015731f, -0.007613f, -0.015281f, -0.005466f, +0.009921f, -0.015915f, -0.004925f, +0.001486f, + -0.006423f, -0.003488f, +0.003958f, +0.014715f, -0.002622f, -0.004167f, -0.005048f, -0.007272f, -0.014874f, -0.001641f, + -0.001947f, +0.003521f, -0.003958f, -0.019421f, +0.014109f, -0.006806f, +0.002313f, -0.004159f, +0.010945f, +0.003060f, + +0.000060f, +0.012444f, -0.005990f, +0.005488f, +0.000292f, -0.006962f, +0.003961f, +0.007621f, -0.005075f, +0.005089f, + +0.002916f, -0.005667f, +0.001013f, -0.001404f, +0.000246f, +0.001507f, -0.002002f, +0.003512f, +0.005291f, +0.005835f, + +0.003371f, -0.003185f, -0.007025f, +0.006692f, +0.004128f, -0.000740f, +0.003744f, -0.008759f, -0.001676f, -0.001504f, + -0.002302f, +0.000367f, +0.005297f, -0.000467f, -0.003222f, -0.002916f + }, + { + +0.000829f, +0.117247f, +0.013096f, -0.027607f, -0.004058f, -0.011310f, +0.008457f, +0.004602f, -0.013964f, -0.010123f, + -0.007767f, +0.003242f, +0.013747f, +0.000931f, -0.047082f, +0.003526f, +0.003914f, +0.008979f, -0.005181f, -0.000738f, + +0.000062f, +0.018877f, -0.026604f, -0.018265f, +0.003145f, -0.019526f, -0.010432f, +0.003119f, +0.011958f, -0.008365f, + -0.008904f, -0.008558f, -0.016886f, +0.000902f, -0.012382f, -0.008651f, +0.007076f, -0.003107f, +0.003089f, -0.000663f, + -0.011818f, +0.004994f, +0.010019f, +0.003176f, -0.005960f, +0.007772f, +0.003403f, -0.012916f, -0.002692f, -0.004957f, + +0.010179f, -0.004043f, -0.005407f, +0.000584f, +0.005711f, -0.001325f, -0.003141f, -0.006845f, -0.002058f, -0.007566f, + -0.001652f, +0.003173f, +0.007889f, -0.003466f, +0.004285f, +0.000677f, +0.001277f, -0.002051f, -0.001068f, -0.005247f, + +0.001065f, +0.003616f, -0.001238f, +0.000839f, -0.002879f, +0.007666f, +0.003159f, +0.005150f, +0.003474f, +0.001336f, + -0.001931f, -0.000648f, -0.001853f, +0.005082f, +0.006427f, +0.008207f, -0.002875f, +0.000103f, +0.001763f, +0.003304f, + +0.002295f, -0.000940f, -0.001907f, -0.001635f, +0.001682f, -0.002622f + }, + { + -0.032777f, -0.059406f, +0.038046f, +0.007193f, -0.004344f, -0.035221f, -0.022813f, -0.004795f, -0.007569f, +0.010934f, + +0.041941f, -0.010611f, +0.014075f, +0.006969f, +0.032393f, +0.017189f, -0.002883f, -0.009531f, +0.015817f, +0.006336f, + -0.021049f, -0.004214f, +0.022216f, +0.006765f, +0.013145f, +0.016558f, -0.006503f, -0.013468f, +0.003944f, +0.002345f, + +0.003677f, +0.022932f, +0.006672f, -0.000228f, -0.019687f, +0.023006f, -0.001787f, +0.005445f, +0.004810f, -0.001894f, + -0.007478f, -0.004084f, +0.003439f, -0.011481f, -0.010777f, +0.013968f, -0.009685f, +0.005090f, +0.009152f, +0.000756f, + -0.009105f, -0.005183f, +0.000669f, -0.005093f, +0.015353f, +0.000036f, +0.003187f, -0.005717f, +0.010261f, +0.007746f, + -0.002645f, +0.001256f, +0.007353f, +0.001421f, -0.004521f, +0.010172f, -0.004591f, +0.009071f, +0.005823f, -0.006682f, + +0.002791f, +0.003432f, -0.002980f, +0.000643f, -0.001566f, -0.000649f, +0.004963f, +0.002907f, -0.002752f, +0.001119f, + +0.004839f, -0.005564f, -0.000355f, -0.005275f, -0.000241f, +0.001408f, +0.002458f, -0.000219f, +0.002384f, -0.002471f, + -0.001026f, +0.001077f, +0.000893f, -0.000678f, +0.003775f, -0.002149f + }, + { + +0.001594f, +0.065265f, +0.020441f, +0.011365f, -0.005657f, -0.001152f, +0.003747f, +0.004565f, -0.002368f, -0.010902f, + +0.001862f, -0.001233f, +0.014993f, +0.025837f, -0.017836f, -0.025151f, -0.007599f, +0.019412f, -0.020944f, -0.006106f, + +0.034295f, +0.000828f, -0.008820f, -0.022446f, +0.008306f, +0.005975f, -0.024504f, -0.021234f, +0.000467f, +0.020524f, + -0.023450f, +0.012426f, +0.005038f, +0.033059f, +0.015043f, +0.002142f, -0.011707f, -0.019537f, -0.006072f, +0.002500f, + +0.000023f, -0.012929f, +0.001414f, -0.002961f, +0.005705f, -0.000353f, -0.008245f, +0.001444f, -0.003587f, +0.004598f, + -0.012699f, +0.001990f, +0.001036f, +0.001248f, +0.005831f, -0.008582f, +0.010071f, -0.010235f, -0.002026f, +0.003588f, + -0.006903f, -0.008051f, -0.002886f, +0.003180f, -0.003529f, -0.000031f, +0.008648f, -0.004105f, -0.004040f, +0.000726f, + -0.002904f, +0.001234f, -0.000767f, +0.001515f, -0.001135f, -0.008827f, +0.008338f, -0.001961f, +0.000327f, +0.001842f, + +0.001495f, +0.006855f, -0.000550f, +0.005865f, +0.000523f, -0.001367f, -0.003999f, +0.007388f, -0.002047f, -0.000434f, + +0.003108f, -0.003095f, -0.006506f, -0.007108f, +0.001650f, -0.001108f + }, + { + -0.025492f, -0.110514f, +0.041502f, -0.010461f, -0.019934f, -0.015551f, -0.026283f, -0.012381f, -0.015998f, -0.000057f, + -0.016594f, +0.024067f, -0.011818f, -0.014326f, +0.019844f, +0.000624f, +0.024467f, +0.008948f, +0.008271f, -0.005919f, + +0.002173f, -0.013029f, -0.015232f, +0.030498f, +0.005408f, +0.003363f, +0.006920f, +0.004045f, -0.000463f, +0.002218f, + -0.003453f, +0.010081f, +0.006864f, +0.013824f, +0.009870f, -0.010878f, -0.008912f, +0.001688f, -0.001704f, -0.008176f, + -0.007891f, +0.012318f, +0.003768f, -0.010047f, +0.008782f, +0.009995f, +0.016793f, +0.010736f, -0.012648f, +0.010017f, + +0.010365f, -0.000367f, +0.012600f, -0.001746f, +0.017070f, +0.008049f, +0.005452f, -0.001743f, +0.001255f, +0.000538f, + -0.006185f, -0.009350f, -0.000938f, -0.001359f, +0.004353f, -0.002454f, -0.000093f, -0.001762f, -0.002666f, +0.003853f, + -0.002664f, +0.001902f, -0.002394f, +0.003706f, -0.002803f, +0.003893f, -0.004107f, +0.003963f, +0.000776f, +0.003830f, + -0.002787f, -0.002520f, -0.001462f, +0.004132f, -0.001102f, -0.000886f, +0.001786f, -0.003837f, +0.000939f, +0.001016f, + +0.000081f, +0.000428f, +0.003526f, +0.002487f, -0.000063f, -0.003530f + }, + { + +0.002367f, +0.090599f, -0.032942f, +0.016838f, +0.008861f, -0.004674f, +0.005662f, +0.015055f, +0.004876f, +0.008590f, + +0.007725f, -0.007844f, -0.010983f, +0.045567f, -0.014001f, +0.034742f, +0.028121f, +0.040349f, +0.000857f, -0.002127f, + -0.000837f, -0.003761f, +0.000493f, +0.010559f, -0.020622f, +0.020793f, +0.010749f, +0.007205f, +0.008230f, -0.006070f, + -0.035895f, +0.005777f, -0.000591f, +0.019513f, -0.000953f, +0.009556f, +0.004579f, -0.021008f, +0.002518f, +0.005357f, + -0.013892f, -0.001430f, +0.019081f, +0.006408f, +0.009760f, +0.010491f, -0.010153f, +0.004368f, +0.003371f, -0.006214f, + -0.011471f, +0.001369f, -0.012433f, -0.004027f, +0.000505f, -0.000437f, +0.004447f, -0.009912f, +0.001341f, -0.006444f, + +0.003335f, -0.007383f, -0.010388f, -0.001120f, +0.002558f, +0.007992f, +0.000550f, +0.005634f, -0.004456f, +0.003031f, + -0.008152f, +0.000434f, +0.001369f, +0.001719f, -0.010217f, -0.001152f, -0.001084f, -0.007857f, -0.004160f, +0.002698f, + +0.001577f, +0.002487f, +0.003018f, +0.001626f, -0.000998f, -0.001306f, -0.000662f, +0.000044f, +0.000419f, +0.001159f, + -0.002429f, +0.001773f, +0.001588f, +0.001296f, +0.002147f, +0.002835f + } + }, + { + { + -0.005433f, +0.200795f, +0.095500f, -0.077629f, -0.001608f, +0.000551f, +0.000483f, -0.018733f, -0.018253f, +0.001493f, + +0.007382f, +0.013021f, +0.003522f, -0.002858f, -0.016651f, +0.015391f, -0.030034f, +0.003988f, +0.006196f, -0.024716f, + +0.010764f, -0.005391f, +0.000914f, +0.015435f, +0.007851f, -0.017097f, -0.011794f, -0.006846f, +0.002140f, +0.016529f, + +0.013820f, -0.007209f, +0.002645f, +0.014618f, +0.004268f, +0.008660f, -0.002901f, +0.010762f, -0.008215f, -0.005581f, + -0.000587f, +0.002890f, -0.000305f, -0.000150f, -0.005444f, -0.003208f, +0.008971f, -0.005507f, +0.011522f, -0.004176f, + +0.000450f, +0.008396f, +0.002254f, +0.005612f, +0.002742f, -0.000800f, +0.000790f, +0.004602f, -0.006284f, +0.001796f, + -0.006439f, +0.001692f, -0.003418f, -0.005639f, -0.001145f, +0.006403f, -0.003543f, -0.000722f, +0.001117f, +0.002037f, + +0.002600f, -0.001505f, -0.001911f, -0.000053f, +0.002880f, +0.000798f, -0.003061f, -0.001276f, +0.000219f, -0.001792f, + +0.001601f, -0.004873f, +0.002965f, +0.000139f, +0.000891f, -0.001166f, +0.000578f, -0.001417f, -0.000662f, -0.003678f, + -0.000436f, -0.001687f, -0.001515f, -0.000769f, -0.001041f, +0.000069f + }, + { + -0.000777f, -0.102999f, +0.007945f, -0.003625f, +0.017664f, -0.006555f, -0.007145f, -0.000951f, -0.004118f, -0.003521f, + -0.009608f, -0.011399f, +0.009567f, -0.018221f, +0.011597f, -0.000934f, -0.011215f, -0.016410f, +0.005018f, +0.005492f, + +0.006204f, +0.007885f, -0.011945f, +0.000562f, +0.004180f, +0.011516f, -0.001906f, -0.000204f, +0.003177f, -0.004955f, + -0.004735f, -0.001597f, -0.000046f, -0.007549f, +0.005080f, +0.010250f, -0.005910f, +0.010811f, +0.000750f, -0.003038f, + -0.006705f, +0.004465f, +0.007742f, -0.011890f, +0.005107f, +0.002271f, -0.002352f, -0.003417f, -0.008560f, -0.007253f, + -0.005553f, +0.008140f, +0.005556f, +0.009611f, -0.001995f, -0.006851f, -0.005520f, +0.004490f, +0.005110f, -0.004965f, + -0.004492f, +0.008743f, -0.005230f, -0.001260f, -0.000251f, -0.005682f, +0.000790f, +0.002164f, +0.002908f, +0.004082f, + +0.003067f, -0.001861f, -0.002048f, +0.001826f, +0.002224f, -0.000616f, -0.001681f, +0.001668f, +0.000646f, -0.005334f, + +0.001046f, -0.000006f, -0.004466f, -0.000309f, +0.002200f, +0.001189f, +0.002550f, +0.001357f, -0.000183f, -0.001663f, + -0.001398f, -0.000653f, +0.000735f, -0.000269f, -0.001300f, +0.000993f + }, + { + +0.001207f, +0.101807f, -0.051421f, -0.075883f, +0.035374f, -0.002030f, +0.006768f, +0.009894f, -0.009285f, -0.008806f, + -0.003525f, -0.014984f, -0.003850f, -0.010537f, -0.012795f, +0.008389f, +0.021143f, +0.032226f, -0.017770f, -0.012883f, + -0.012159f, +0.004435f, -0.015288f, -0.010287f, +0.013282f, +0.013644f, +0.012959f, -0.001814f, +0.004456f, +0.004293f, + -0.005837f, +0.011247f, -0.007044f, -0.012471f, -0.001224f, -0.000729f, +0.008418f, -0.002966f, -0.000280f, -0.000840f, + +0.002985f, -0.005028f, +0.008223f, +0.004073f, -0.003262f, -0.011216f, +0.000249f, -0.007512f, -0.001341f, -0.001084f, + -0.003499f, +0.010535f, +0.000920f, +0.002112f, +0.007360f, +0.001687f, +0.004058f, -0.003475f, +0.006528f, +0.009517f, + +0.001812f, +0.003618f, -0.000494f, -0.000100f, +0.008507f, -0.001809f, -0.002263f, -0.001798f, -0.005227f, -0.002587f, + -0.003740f, +0.002073f, -0.006477f, +0.003049f, -0.006044f, -0.000638f, -0.003926f, +0.006552f, -0.001481f, +0.002818f, + -0.004057f, +0.005326f, -0.000050f, -0.001829f, -0.000574f, -0.001803f, -0.002633f, -0.001842f, +0.002347f, +0.000147f, + +0.002524f, +0.002231f, -0.000529f, +0.002858f, -0.000847f, +0.001690f + }, + { + +0.013809f, -0.154491f, +0.031301f, +0.071866f, -0.004310f, -0.003058f, +0.000003f, -0.003727f, -0.010220f, +0.011892f, + -0.012808f, -0.002976f, +0.005142f, -0.008228f, -0.005804f, +0.007510f, +0.009341f, +0.001933f, +0.000279f, +0.009064f, + +0.000236f, +0.000296f, +0.006110f, +0.002700f, -0.014615f, +0.011250f, +0.008429f, +0.015532f, +0.015291f, +0.009882f, + +0.000066f, +0.011536f, -0.007779f, -0.001166f, -0.002781f, -0.013293f, +0.016946f, -0.005084f, -0.004208f, -0.010302f, + -0.002962f, +0.005441f, +0.000273f, +0.006536f, +0.000542f, -0.010830f, +0.014633f, +0.003763f, +0.005148f, +0.003860f, + +0.002201f, +0.000354f, -0.002508f, -0.002844f, -0.006878f, -0.001210f, -0.005020f, +0.002245f, +0.000339f, -0.010673f, + +0.006725f, -0.002549f, -0.006259f, +0.002725f, -0.005833f, -0.000083f, +0.004079f, -0.001866f, +0.000521f, +0.000538f, + -0.003658f, +0.001312f, +0.001482f, -0.001260f, +0.001056f, +0.002755f, +0.000705f, +0.001131f, -0.000231f, +0.001843f, + -0.002613f, -0.000725f, -0.001997f, -0.003359f, +0.000626f, +0.001136f, -0.003737f, -0.003196f, -0.001323f, +0.002602f, + -0.000227f, +0.000727f, +0.001698f, -0.002259f, -0.001416f, +0.001114f + }, + { + +0.000076f, -0.015682f, -0.033795f, +0.001947f, +0.000916f, -0.002549f, -0.001632f, +0.009132f, -0.003025f, -0.003772f, + -0.007642f, -0.005041f, +0.007640f, +0.001706f, -0.019109f, -0.003727f, +0.012687f, -0.025435f, -0.004125f, -0.002909f, + +0.000173f, +0.002288f, -0.023381f, -0.025015f, +0.017272f, -0.006080f, -0.011165f, +0.004428f, +0.010276f, -0.011992f, + +0.013073f, +0.008717f, +0.001832f, +0.000012f, +0.000316f, -0.022190f, +0.000712f, -0.002192f, -0.002908f, +0.006460f, + -0.012897f, +0.013793f, -0.006831f, +0.000395f, -0.001555f, +0.001973f, -0.000781f, -0.003979f, +0.002019f, -0.000561f, + +0.000247f, +0.002605f, +0.000836f, -0.010385f, -0.008989f, +0.005225f, +0.000542f, -0.001172f, +0.003063f, -0.006622f, + -0.005120f, -0.006160f, -0.001696f, +0.003898f, +0.001219f, -0.000901f, -0.002029f, +0.000628f, -0.005687f, -0.000505f, + -0.001835f, +0.001248f, +0.003399f, -0.003424f, -0.002813f, -0.002558f, +0.000464f, +0.005645f, +0.002073f, +0.003252f, + +0.002372f, +0.001802f, -0.004584f, +0.006424f, -0.001297f, -0.002749f, -0.000889f, +0.000479f, +0.001363f, +0.002494f, + +0.002069f, +0.002121f, +0.001440f, -0.001663f, +0.002591f, +0.001156f + }, + { + +0.020349f, -0.150396f, -0.001595f, +0.086438f, -0.000489f, -0.000017f, -0.012116f, +0.004609f, +0.012757f, +0.011244f, + +0.001186f, +0.014814f, +0.014833f, +0.016797f, +0.004756f, +0.003465f, -0.019681f, -0.011083f, -0.003497f, +0.018493f, + -0.007029f, -0.010088f, +0.007314f, +0.008220f, +0.006998f, +0.007632f, +0.007551f, +0.003278f, -0.001261f, -0.012488f, + +0.011687f, +0.007269f, -0.006883f, +0.000087f, +0.003792f, +0.014307f, +0.001833f, -0.000403f, +0.004792f, -0.003892f, + +0.001238f, +0.001397f, -0.000683f, +0.000444f, +0.001151f, +0.006159f, +0.007005f, +0.012058f, +0.002210f, +0.005823f, + -0.001001f, -0.009513f, -0.003207f, +0.004942f, +0.003889f, -0.001580f, -0.002982f, -0.003995f, -0.005775f, +0.001855f, + +0.003643f, +0.005401f, +0.004123f, +0.001033f, +0.000125f, -0.004822f, +0.000593f, +0.000936f, -0.000685f, +0.002190f, + -0.000584f, +0.001421f, +0.003087f, +0.000133f, +0.000818f, -0.002314f, -0.001438f, +0.000241f, -0.000280f, +0.000935f, + -0.002162f, -0.002237f, +0.002048f, +0.000813f, +0.001528f, +0.003875f, -0.000170f, -0.003523f, -0.000808f, -0.003286f, + +0.000845f, +0.002607f, -0.000879f, +0.001791f, -0.001242f, -0.000309f + }, + { + +0.002081f, -0.014863f, +0.004699f, +0.012039f, -0.007761f, +0.005407f, +0.000592f, +0.006112f, -0.003441f, -0.006250f, + +0.003740f, -0.013334f, +0.009751f, +0.004458f, -0.007733f, -0.012700f, +0.003630f, +0.000134f, -0.004808f, +0.008192f, + -0.009721f, -0.009317f, +0.004645f, -0.000311f, +0.021368f, -0.011523f, +0.002428f, -0.001807f, +0.004495f, +0.008555f, + +0.000944f, +0.004891f, +0.004399f, +0.024376f, +0.003952f, +0.001156f, -0.010398f, -0.000036f, +0.006464f, -0.010633f, + -0.002555f, -0.003991f, -0.005873f, -0.003431f, -0.010199f, +0.005861f, +0.000843f, -0.003902f, +0.002235f, +0.001957f, + +0.000269f, -0.006732f, +0.000359f, +0.003998f, -0.003493f, -0.001430f, +0.003808f, +0.004699f, -0.007467f, +0.002136f, + +0.005755f, -0.003674f, +0.002475f, -0.001597f, -0.000619f, -0.006347f, +0.001020f, -0.003078f, -0.000936f, -0.005187f, + +0.001259f, -0.000314f, -0.000207f, -0.000211f, +0.002821f, +0.000400f, +0.001554f, +0.000837f, +0.000341f, +0.000257f, + +0.001191f, +0.005223f, -0.004642f, +0.001452f, -0.004646f, -0.001445f, -0.000357f, +0.001024f, +0.000531f, -0.001277f, + -0.001429f, -0.001860f, +0.001247f, -0.002152f, -0.001492f, -0.000209f + }, + { + +0.012737f, -0.182491f, +0.025002f, +0.058346f, -0.000282f, +0.008621f, -0.019629f, -0.000449f, -0.000546f, -0.007655f, + +0.001526f, +0.005149f, -0.000918f, -0.014143f, +0.004520f, -0.002801f, -0.039779f, +0.008759f, -0.002495f, +0.011636f, + -0.012985f, -0.013978f, -0.002523f, +0.008250f, -0.006118f, +0.000364f, +0.001293f, +0.008983f, +0.010032f, -0.001016f, + -0.002711f, +0.006782f, +0.009652f, +0.001084f, -0.000281f, +0.006571f, +0.006490f, -0.007883f, +0.002554f, -0.012288f, + -0.007956f, -0.013076f, -0.004755f, -0.001085f, +0.000630f, -0.007104f, -0.010751f, -0.008050f, +0.001963f, +0.000280f, + -0.001105f, -0.002252f, -0.004575f, +0.000768f, -0.001215f, -0.001699f, -0.003845f, -0.001411f, +0.001766f, -0.001909f, + +0.009309f, -0.000484f, +0.001884f, +0.006811f, -0.005525f, +0.003814f, -0.000972f, -0.003037f, +0.005122f, -0.005472f, + +0.003820f, -0.000330f, +0.002114f, +0.003360f, -0.000440f, -0.002310f, +0.002573f, +0.005684f, -0.003450f, -0.003693f, + -0.001235f, +0.003110f, +0.002313f, +0.001221f, +0.001025f, -0.002212f, +0.002909f, -0.001026f, +0.001159f, -0.001414f, + +0.001671f, +0.001054f, +0.000768f, -0.001525f, -0.002022f, +0.000223f + }, + { + +0.004803f, +0.056489f, -0.001766f, +0.012516f, +0.002119f, +0.002441f, -0.005361f, +0.006321f, +0.007567f, +0.003169f, + -0.002416f, -0.019105f, -0.008000f, +0.014130f, +0.000841f, +0.014920f, -0.035865f, -0.011253f, -0.002315f, +0.009571f, + +0.013615f, -0.007980f, +0.007278f, -0.010611f, +0.022235f, -0.030296f, -0.007723f, +0.011169f, -0.012471f, -0.017576f, + +0.005292f, +0.009244f, -0.010393f, -0.001565f, -0.011359f, +0.003035f, -0.009380f, -0.003126f, +0.004788f, -0.011105f, + +0.007725f, -0.005856f, +0.011628f, -0.002082f, -0.001800f, +0.010358f, +0.009959f, +0.010571f, +0.002827f, +0.002300f, + +0.000724f, -0.001547f, +0.008841f, -0.002381f, +0.001753f, -0.009446f, -0.002203f, -0.000236f, -0.000363f, +0.004010f, + +0.001437f, -0.002852f, +0.004422f, -0.006676f, +0.002120f, +0.004249f, -0.003020f, -0.000116f, -0.007919f, -0.000528f, + +0.000241f, -0.000778f, +0.000222f, +0.001739f, -0.000056f, +0.001679f, -0.000852f, +0.004148f, +0.003180f, +0.000645f, + +0.001205f, +0.001084f, +0.000218f, +0.000786f, +0.002520f, -0.001521f, +0.000372f, +0.002520f, +0.002629f, +0.001122f, + -0.002698f, +0.002938f, +0.000605f, +0.000285f, +0.002573f, +0.002023f + }, + { + -0.014128f, -0.023560f, +0.005724f, -0.002317f, -0.017320f, -0.019258f, -0.021624f, +0.018525f, +0.016797f, +0.010377f, + -0.012090f, +0.004725f, -0.011271f, -0.027684f, -0.017489f, -0.018645f, +0.023257f, -0.003487f, +0.033657f, +0.020467f, + -0.007652f, +0.020951f, -0.007029f, +0.009201f, -0.004497f, -0.011332f, +0.007956f, -0.009349f, -0.008259f, -0.005921f, + -0.005548f, +0.005953f, -0.011613f, +0.006806f, +0.005236f, -0.007915f, +0.008562f, -0.005799f, +0.001027f, -0.002484f, + -0.009849f, +0.007736f, +0.003859f, -0.007107f, +0.002256f, +0.003870f, -0.008730f, -0.001101f, -0.004059f, +0.005236f, + +0.000734f, +0.001324f, +0.003388f, -0.006690f, +0.017243f, -0.000148f, +0.008654f, -0.007532f, +0.004995f, -0.002495f, + -0.009360f, +0.007955f, -0.005600f, -0.000257f, -0.003238f, +0.000229f, +0.008347f, +0.007170f, -0.003176f, +0.001604f, + -0.000370f, -0.003574f, +0.004450f, +0.003652f, +0.002002f, +0.002433f, -0.001492f, -0.001098f, +0.002124f, +0.005545f, + +0.002083f, -0.002969f, -0.004684f, +0.001846f, -0.000170f, -0.003809f, +0.005627f, -0.005025f, +0.002387f, +0.001156f, + -0.001636f, +0.001233f, +0.004563f, +0.000670f, -0.000452f, -0.002078f + }, + { + -0.000563f, +0.060549f, -0.024337f, -0.004257f, +0.022476f, -0.012107f, -0.005613f, +0.039525f, +0.026969f, +0.011681f, + +0.001215f, +0.001627f, +0.006121f, +0.003978f, -0.027822f, +0.009129f, -0.001496f, -0.014928f, -0.005431f, -0.004408f, + -0.030855f, +0.006289f, -0.000235f, -0.004653f, -0.008818f, -0.006574f, +0.001195f, -0.008047f, +0.007058f, -0.010142f, + -0.009102f, +0.000639f, -0.007255f, +0.009700f, -0.001548f, -0.013103f, -0.002373f, -0.005765f, +0.002744f, +0.010156f, + -0.012074f, -0.007334f, +0.005339f, -0.004515f, -0.011054f, +0.014886f, +0.010886f, -0.009000f, +0.004818f, +0.005777f, + +0.010093f, -0.006982f, -0.002469f, -0.008151f, -0.003157f, -0.005902f, +0.004022f, -0.002597f, -0.001746f, -0.003521f, + +0.002788f, -0.000296f, -0.002183f, -0.009742f, +0.001257f, -0.000831f, +0.001258f, +0.001193f, -0.000899f, -0.002872f, + +0.005182f, -0.001003f, -0.006986f, +0.001022f, -0.001588f, +0.002035f, -0.002368f, -0.001798f, +0.000782f, +0.000332f, + -0.002275f, +0.000221f, -0.004390f, -0.002316f, +0.000616f, +0.003932f, -0.004575f, -0.000180f, -0.001743f, -0.000143f, + +0.003509f, -0.002035f, -0.001926f, -0.000366f, -0.000772f, -0.004899f + }, + { + +0.031150f, -0.058280f, -0.025107f, +0.021556f, +0.009903f, +0.007589f, +0.012574f, -0.008821f, -0.007482f, +0.020207f, + +0.023500f, -0.031996f, -0.000339f, +0.001889f, +0.032941f, -0.002896f, +0.004193f, -0.009522f, +0.011891f, +0.029523f, + -0.009336f, -0.001750f, +0.019441f, -0.003759f, -0.005752f, +0.008800f, +0.003429f, -0.002328f, -0.001991f, +0.000266f, + +0.005943f, +0.014297f, -0.000756f, +0.000568f, -0.010450f, +0.022490f, -0.013445f, -0.002159f, -0.006719f, -0.012485f, + -0.002532f, -0.001502f, +0.000068f, -0.009346f, -0.008347f, +0.012638f, -0.007802f, -0.007435f, -0.003222f, -0.001216f, + -0.000494f, +0.004809f, -0.003194f, -0.004789f, +0.016226f, -0.008134f, -0.002681f, -0.004878f, +0.009136f, +0.003495f, + +0.003437f, +0.008006f, +0.011358f, +0.002616f, -0.010649f, +0.005200f, -0.005724f, +0.000981f, -0.001890f, -0.003200f, + +0.008599f, +0.002024f, -0.002406f, +0.006384f, +0.000314f, -0.000836f, +0.002807f, -0.005677f, -0.004269f, +0.001619f, + +0.003881f, -0.002707f, +0.005525f, +0.000203f, +0.005035f, +0.001886f, +0.003632f, +0.002042f, +0.000210f, -0.002776f, + +0.001491f, +0.001298f, +0.001461f, +0.000347f, +0.000982f, -0.001883f + }, + { + -0.000692f, -0.001159f, -0.033922f, -0.000355f, +0.001734f, +0.013426f, +0.009784f, -0.002731f, -0.002100f, -0.002221f, + +0.001985f, +0.001014f, +0.001429f, +0.005428f, +0.001254f, +0.003677f, -0.009363f, -0.001786f, -0.012418f, -0.003152f, + +0.050224f, +0.002667f, -0.009457f, +0.011526f, +0.016994f, +0.012559f, -0.013537f, -0.023626f, -0.003411f, +0.023627f, + -0.005561f, +0.008294f, -0.016268f, +0.017536f, +0.010544f, +0.007733f, -0.003450f, -0.003694f, +0.009320f, +0.010083f, + -0.003117f, -0.017169f, -0.003698f, -0.013632f, +0.003798f, -0.002100f, +0.001876f, +0.007586f, -0.010240f, +0.006657f, + -0.005703f, +0.001644f, -0.002223f, -0.005348f, +0.003469f, -0.002185f, +0.013010f, -0.005809f, +0.002182f, +0.002616f, + -0.004703f, -0.002871f, +0.002442f, +0.007647f, +0.001487f, -0.000634f, +0.006865f, -0.004787f, -0.000486f, +0.001231f, + -0.001882f, +0.002910f, +0.004185f, -0.002332f, -0.002500f, -0.004835f, +0.009633f, -0.002424f, -0.002591f, -0.000198f, + -0.003494f, -0.003620f, +0.000165f, +0.005288f, -0.004966f, -0.001791f, +0.001618f, +0.011247f, -0.001881f, -0.003664f, + -0.000460f, -0.001820f, -0.000861f, -0.003775f, +0.001589f, +0.001544f + }, + { + +0.025053f, -0.086480f, -0.000352f, -0.002583f, -0.004184f, +0.017957f, +0.002825f, -0.006109f, -0.017901f, -0.010646f, + -0.018085f, +0.035289f, +0.000937f, -0.018432f, +0.007013f, -0.003456f, +0.023096f, -0.021893f, -0.012393f, +0.003506f, + +0.007006f, -0.005468f, -0.022622f, +0.007004f, +0.005559f, +0.012396f, +0.011564f, -0.003587f, -0.006207f, +0.000524f, + -0.020512f, -0.013594f, -0.002641f, +0.006023f, +0.015788f, +0.001222f, -0.000216f, +0.001823f, -0.002380f, +0.004288f, + +0.007544f, +0.010863f, +0.001723f, +0.000034f, +0.006828f, -0.002779f, +0.005336f, +0.004367f, -0.009755f, +0.017607f, + +0.009202f, -0.008681f, -0.004725f, -0.013830f, +0.009637f, +0.004974f, -0.001400f, -0.007217f, +0.000625f, -0.004396f, + -0.005889f, -0.004711f, -0.002666f, -0.005712f, +0.002465f, -0.005140f, -0.000949f, +0.000212f, -0.000400f, +0.008973f, + -0.002335f, -0.002101f, -0.000765f, +0.005692f, -0.003817f, +0.003842f, -0.002394f, +0.005943f, -0.001058f, +0.002314f, + -0.004620f, -0.001918f, -0.000481f, +0.003090f, -0.003423f, -0.004408f, +0.003006f, +0.000377f, -0.000487f, -0.001892f, + -0.003226f, -0.002205f, +0.001733f, +0.000807f, +0.001827f, +0.000040f + }, + { + -0.002835f, +0.082760f, -0.025660f, +0.010817f, +0.011971f, +0.003346f, -0.002826f, +0.003702f, -0.007297f, -0.002898f, + +0.000302f, +0.007442f, +0.002315f, +0.010453f, -0.098324f, +0.009456f, -0.007568f, +0.010535f, -0.007974f, +0.002702f, + +0.016341f, -0.004086f, +0.006259f, +0.014146f, -0.008075f, +0.018301f, -0.001731f, -0.004774f, +0.021153f, +0.016491f, + -0.015600f, +0.006723f, -0.003591f, +0.015741f, -0.015002f, +0.008626f, +0.010508f, -0.008996f, -0.000920f, +0.007694f, + +0.002977f, +0.006105f, +0.003043f, -0.014271f, +0.001014f, +0.011586f, -0.015484f, +0.000213f, +0.007825f, +0.001029f, + -0.003569f, +0.010545f, -0.006258f, +0.000088f, +0.001827f, -0.003988f, +0.010147f, -0.002831f, +0.006664f, -0.003202f, + +0.007386f, +0.002191f, +0.001044f, +0.009451f, +0.002714f, +0.004347f, -0.002650f, +0.007122f, +0.001269f, +0.007257f, + -0.003867f, +0.001374f, +0.002244f, +0.007917f, -0.003349f, +0.003012f, +0.001668f, -0.005200f, -0.002216f, -0.000623f, + -0.000440f, -0.000642f, +0.000751f, +0.003773f, +0.004180f, -0.002019f, -0.000706f, -0.000387f, -0.004923f, -0.004635f, + -0.002362f, +0.002819f, +0.002666f, +0.001889f, +0.000201f, -0.002266f + } + }, + { + { + +0.006939f, +0.282848f, -0.013813f, -0.092022f, +0.023223f, -0.015559f, +0.009910f, -0.013066f, -0.010746f, -0.018928f, + +0.000926f, +0.015813f, +0.014001f, +0.001655f, -0.018616f, +0.008942f, -0.009397f, -0.001516f, -0.015417f, +0.021989f, + -0.012077f, -0.018335f, -0.003291f, +0.009630f, +0.012220f, -0.009964f, -0.013960f, +0.005317f, +0.000950f, +0.022376f, + -0.004565f, +0.006354f, +0.000492f, +0.006723f, +0.004631f, +0.010702f, +0.008960f, -0.002003f, -0.004520f, -0.008953f, + -0.005356f, +0.010607f, +0.003426f, -0.004550f, -0.002924f, +0.001206f, +0.005912f, +0.001740f, +0.000081f, -0.001450f, + +0.000393f, +0.008742f, +0.000759f, +0.001770f, +0.001505f, +0.001300f, +0.002320f, -0.003152f, -0.001198f, -0.001113f, + -0.006484f, -0.000337f, -0.000053f, -0.005480f, -0.001594f, +0.003607f, +0.002188f, +0.000555f, +0.001440f, +0.001453f, + +0.001184f, +0.000523f, -0.001159f, -0.002865f, +0.001041f, -0.000479f, -0.000131f, +0.000316f, -0.000495f, -0.001517f, + -0.001188f, -0.000278f, -0.000651f, +0.003323f, -0.001059f, -0.000264f, +0.000507f, -0.000863f, -0.000233f, -0.003103f, + -0.000701f, -0.001497f, -0.000099f, -0.001158f, -0.003584f, +0.002393f + }, + { + -0.000955f, -0.076843f, -0.021086f, +0.027055f, +0.006681f, -0.005798f, -0.000610f, +0.001842f, -0.004759f, -0.011075f, + -0.014204f, -0.004113f, +0.006321f, -0.013163f, +0.007234f, -0.000410f, -0.003567f, -0.013379f, -0.009189f, +0.015829f, + +0.002645f, -0.015601f, -0.002976f, -0.003580f, +0.015899f, +0.003387f, +0.007064f, -0.000903f, -0.003682f, -0.001953f, + +0.002843f, -0.001835f, -0.002155f, -0.000912f, -0.001486f, +0.013930f, -0.004855f, +0.006257f, +0.002998f, -0.013347f, + +0.007158f, +0.003601f, +0.000207f, -0.004728f, +0.001895f, -0.002100f, -0.007537f, -0.003132f, -0.003461f, -0.004678f, + -0.000083f, +0.002096f, +0.003329f, +0.003654f, -0.000849f, -0.006492f, -0.001004f, +0.002227f, -0.001856f, -0.000685f, + +0.001984f, +0.002611f, -0.002734f, -0.005660f, +0.000839f, -0.000853f, -0.000047f, +0.001091f, +0.004126f, -0.000959f, + +0.004475f, -0.003145f, +0.000649f, +0.000144f, +0.001243f, +0.000355f, -0.001208f, -0.000064f, -0.000220f, -0.001712f, + -0.000138f, -0.002509f, -0.005230f, +0.001322f, +0.002439f, +0.002427f, -0.000111f, +0.003476f, -0.001838f, +0.000314f, + -0.001013f, -0.001811f, +0.001209f, -0.003049f, +0.000125f, +0.000712f + }, + { + -0.004022f, -0.034279f, +0.053997f, -0.037087f, +0.010868f, +0.001919f, +0.008956f, -0.006480f, -0.003247f, +0.005819f, + -0.014706f, -0.013321f, +0.007735f, -0.016122f, +0.005566f, -0.017190f, +0.022096f, +0.025006f, -0.003848f, -0.007072f, + -0.013824f, -0.008653f, -0.002474f, -0.005080f, +0.000556f, +0.019834f, +0.014395f, +0.009781f, -0.005365f, +0.007438f, + +0.000469f, +0.005627f, -0.017498f, +0.004222f, -0.004175f, +0.001096f, -0.004435f, -0.009352f, +0.013734f, +0.000276f, + +0.007035f, -0.012203f, +0.012448f, -0.002520f, +0.002489f, -0.003213f, -0.013210f, -0.004880f, +0.005941f, -0.004736f, + +0.002995f, +0.003574f, +0.007581f, -0.003886f, +0.006641f, +0.008444f, -0.002446f, -0.000515f, +0.001950f, +0.007063f, + +0.000869f, +0.002938f, +0.001684f, +0.002432f, +0.002107f, +0.005451f, -0.005250f, -0.002543f, -0.002798f, -0.003157f, + -0.003734f, -0.001404f, +0.000411f, -0.004146f, -0.005137f, +0.001418f, -0.004866f, +0.003712f, -0.000088f, -0.001273f, + -0.000755f, +0.002942f, +0.003166f, -0.002802f, -0.001462f, +0.000074f, -0.001098f, -0.001917f, +0.001920f, -0.000055f, + -0.000597f, +0.003254f, +0.000598f, +0.000765f, +0.001676f, +0.001719f + }, + { + -0.018066f, -0.080740f, +0.022962f, +0.055695f, -0.004085f, +0.003907f, -0.012589f, +0.002016f, -0.011546f, +0.007042f, + -0.018254f, +0.013370f, +0.002874f, -0.009481f, -0.008842f, +0.001013f, +0.034729f, -0.008855f, +0.003750f, +0.006699f, + +0.000215f, -0.007437f, +0.014883f, -0.006934f, +0.002430f, -0.004388f, +0.006781f, +0.021137f, +0.001293f, +0.014000f, + +0.012196f, -0.001210f, -0.008668f, +0.003216f, -0.003240f, -0.001327f, +0.005544f, +0.002087f, -0.010177f, -0.003603f, + -0.001494f, -0.007644f, +0.006971f, +0.000636f, -0.005472f, +0.005534f, +0.006682f, +0.008181f, +0.000955f, +0.006340f, + +0.003410f, +0.004727f, -0.004049f, -0.001817f, -0.005146f, -0.000200f, -0.004831f, +0.001568f, -0.006137f, -0.001323f, + -0.005054f, +0.003302f, +0.001335f, -0.004191f, -0.004822f, +0.001979f, -0.001485f, +0.001716f, -0.001038f, -0.001458f, + +0.000378f, +0.001116f, -0.000710f, +0.001165f, -0.003238f, +0.005482f, -0.002457f, +0.004518f, -0.000641f, +0.001123f, + -0.001255f, -0.000885f, -0.002809f, -0.001926f, +0.000468f, +0.001060f, -0.003441f, -0.003138f, -0.002076f, +0.000408f, + -0.001250f, +0.002348f, +0.001878f, -0.004379f, -0.000307f, +0.001625f + }, + { + -0.001830f, -0.063330f, +0.002034f, +0.004573f, -0.004606f, -0.002234f, +0.002659f, +0.008317f, -0.003179f, -0.008724f, + +0.001522f, -0.014514f, +0.005097f, -0.002150f, +0.011275f, -0.026785f, +0.007250f, -0.011244f, -0.022888f, +0.001003f, + -0.000729f, -0.001989f, -0.019754f, +0.004207f, -0.007704f, -0.003929f, -0.004640f, +0.007906f, +0.001162f, +0.007964f, + +0.005489f, +0.000925f, +0.007666f, -0.008334f, -0.006769f, -0.008085f, +0.006645f, -0.005105f, -0.006102f, -0.003740f, + +0.004985f, -0.005461f, +0.001259f, -0.002629f, +0.001616f, +0.003475f, -0.004383f, -0.004932f, +0.000637f, +0.001560f, + +0.003144f, +0.006913f, +0.004259f, -0.015139f, -0.005306f, -0.000849f, +0.004504f, -0.006922f, +0.004221f, -0.008005f, + -0.001972f, -0.000223f, -0.005980f, +0.003581f, -0.000286f, -0.000853f, +0.005025f, -0.004337f, -0.005721f, +0.000432f, + -0.001868f, -0.002098f, +0.000494f, -0.001041f, -0.001191f, -0.003119f, +0.000806f, +0.003818f, +0.002732f, +0.004175f, + +0.005882f, -0.001937f, -0.002485f, +0.004826f, +0.000975f, -0.005059f, +0.000739f, -0.000634f, +0.001219f, +0.001642f, + +0.004676f, +0.000689f, +0.002715f, -0.002560f, +0.001250f, +0.001581f + }, + { + -0.026191f, -0.056894f, -0.037481f, +0.084611f, -0.005801f, +0.006477f, -0.000772f, +0.000631f, +0.011080f, -0.003787f, + +0.010367f, +0.021637f, +0.013814f, -0.001706f, +0.017493f, -0.007920f, -0.006346f, -0.000726f, -0.005226f, +0.006187f, + -0.009751f, -0.008798f, +0.003996f, +0.008080f, +0.010333f, +0.011317f, -0.002046f, -0.000432f, +0.000721f, -0.009860f, + +0.009135f, +0.006592f, +0.002547f, -0.008805f, +0.015833f, +0.001958f, +0.006863f, -0.002284f, +0.008052f, -0.004335f, + -0.000171f, -0.000551f, -0.000546f, +0.005828f, +0.001534f, +0.005719f, +0.008031f, +0.002125f, +0.006335f, +0.002375f, + -0.003314f, -0.001768f, +0.000032f, +0.007764f, -0.004739f, +0.002402f, +0.000226f, -0.001591f, -0.007545f, -0.001308f, + +0.006035f, +0.004997f, +0.001168f, +0.004756f, -0.002424f, -0.003796f, -0.000696f, +0.000452f, +0.002310f, -0.003591f, + +0.000700f, +0.002809f, +0.003063f, -0.000518f, +0.002207f, -0.000553f, +0.000779f, -0.001091f, -0.000453f, +0.002959f, + -0.002525f, -0.004266f, +0.000931f, +0.000883f, +0.001442f, +0.003631f, +0.000667f, -0.001906f, -0.001756f, -0.004081f, + +0.002078f, +0.000954f, +0.000660f, +0.001662f, -0.000590f, -0.000823f + }, + { + -0.000709f, +0.003443f, +0.013575f, -0.001741f, +0.001584f, +0.002299f, +0.003529f, +0.002324f, +0.001688f, +0.000324f, + -0.004475f, -0.002977f, -0.003477f, +0.022158f, -0.027720f, +0.004137f, +0.003118f, -0.009128f, -0.001057f, -0.017083f, + -0.004396f, +0.000716f, -0.002952f, +0.007279f, +0.004526f, +0.001128f, -0.000902f, +0.010690f, -0.004629f, +0.001308f, + +0.002913f, -0.000855f, +0.015736f, +0.014869f, +0.015069f, -0.009264f, -0.003853f, -0.005528f, -0.000361f, -0.005530f, + +0.006172f, -0.003533f, -0.012371f, -0.004905f, -0.011717f, +0.005091f, +0.002470f, -0.000497f, +0.000904f, -0.006979f, + -0.002150f, +0.001656f, -0.004137f, +0.001634f, +0.001564f, +0.001410f, +0.004932f, +0.001041f, -0.002927f, -0.001007f, + +0.001916f, -0.000778f, -0.001135f, +0.001709f, -0.001501f, -0.000691f, -0.002890f, -0.005099f, -0.002809f, -0.000350f, + -0.004858f, +0.003385f, +0.000867f, +0.000600f, +0.001485f, -0.000948f, +0.002331f, +0.001702f, +0.003002f, -0.003660f, + +0.002105f, +0.001664f, -0.000059f, -0.002059f, -0.000028f, -0.002806f, -0.002018f, +0.001231f, -0.000419f, -0.000246f, + -0.004920f, +0.001550f, -0.000628f, -0.000998f, -0.003024f, +0.000914f + }, + { + -0.020253f, -0.125650f, -0.009259f, +0.053983f, +0.011909f, +0.007760f, -0.006381f, -0.010792f, -0.005289f, -0.001680f, + +0.018443f, -0.007485f, -0.004733f, -0.004983f, -0.002191f, -0.027091f, -0.021172f, +0.002599f, -0.008531f, +0.003907f, + +0.001041f, -0.017534f, +0.004606f, +0.003720f, -0.008401f, -0.001436f, -0.003092f, +0.011471f, +0.013403f, +0.004000f, + +0.001974f, -0.001750f, -0.004717f, +0.004208f, +0.012176f, +0.007056f, +0.006276f, -0.004888f, -0.003654f, -0.010420f, + -0.008572f, -0.006201f, -0.007163f, -0.002913f, -0.006832f, -0.005020f, -0.002886f, -0.006492f, -0.005881f, -0.002734f, + +0.002386f, -0.008397f, +0.000815f, -0.002169f, -0.003504f, +0.000308f, -0.002510f, -0.004204f, +0.004738f, -0.003603f, + +0.007628f, +0.005225f, -0.000775f, +0.000694f, +0.003364f, +0.002641f, -0.004431f, +0.003790f, +0.002462f, -0.006910f, + +0.000268f, +0.000355f, +0.004708f, +0.003413f, -0.002139f, -0.003377f, +0.007181f, +0.004489f, -0.003817f, -0.004099f, + +0.000573f, +0.002321f, -0.001829f, +0.001941f, +0.001243f, +0.001277f, -0.002104f, +0.000860f, +0.001517f, -0.001396f, + -0.000719f, +0.001267f, +0.001664f, -0.001499f, +0.000957f, -0.001238f + }, + { + +0.001522f, +0.044472f, +0.032726f, +0.007441f, +0.006612f, -0.000704f, -0.004535f, +0.007000f, +0.012651f, -0.004452f, + -0.004519f, -0.009092f, +0.001818f, +0.001809f, -0.007473f, -0.005603f, -0.013101f, -0.002397f, -0.004592f, +0.001529f, + +0.016207f, +0.001843f, +0.004152f, +0.007102f, -0.012204f, -0.021666f, -0.006518f, +0.004857f, -0.006481f, -0.016454f, + +0.000444f, +0.012447f, -0.012536f, -0.005797f, +0.003989f, -0.000458f, -0.012260f, -0.000581f, -0.004874f, +0.006653f, + -0.005881f, -0.004427f, +0.015297f, -0.008182f, -0.004953f, +0.015067f, +0.002973f, +0.017475f, +0.004157f, -0.002934f, + +0.001814f, +0.006085f, +0.001564f, -0.001032f, -0.000990f, -0.003208f, -0.000899f, +0.000120f, -0.002559f, +0.006613f, + +0.000637f, -0.001797f, -0.003137f, -0.001805f, +0.004327f, +0.000127f, -0.001728f, -0.000062f, -0.005413f, -0.003102f, + +0.001286f, -0.001474f, -0.000605f, +0.004926f, +0.000483f, +0.003124f, -0.001088f, +0.004825f, +0.001602f, -0.000517f, + +0.000973f, +0.000324f, -0.000714f, +0.001670f, -0.000032f, -0.000281f, +0.002047f, +0.001732f, +0.002514f, +0.000054f, + -0.002397f, +0.000405f, +0.004145f, +0.000849f, +0.001911f, +0.000419f + }, + { + +0.018008f, -0.034952f, -0.011544f, +0.009084f, -0.022611f, -0.017197f, +0.022598f, -0.005751f, +0.022125f, -0.009450f, + -0.000984f, +0.014985f, -0.019356f, -0.031544f, -0.034530f, +0.014130f, -0.001806f, -0.012538f, +0.037564f, +0.006419f, + +0.025325f, +0.006232f, +0.008973f, +0.003910f, -0.000697f, -0.002863f, -0.003586f, -0.005675f, -0.018137f, +0.013005f, + -0.007933f, -0.006909f, +0.004587f, +0.007492f, +0.004142f, -0.013662f, +0.004777f, -0.001449f, +0.004795f, -0.000125f, + -0.012944f, +0.004806f, +0.009199f, -0.016373f, +0.003238f, +0.001050f, -0.001615f, +0.002320f, -0.004434f, +0.003400f, + +0.001216f, +0.010379f, +0.001143f, -0.001164f, +0.006360f, +0.001443f, +0.006240f, -0.002759f, -0.002102f, -0.001287f, + -0.001063f, +0.003946f, -0.004378f, -0.008376f, +0.000054f, +0.003662f, +0.007204f, +0.001981f, +0.002452f, +0.001047f, + -0.003955f, -0.000389f, +0.004562f, +0.000008f, +0.004367f, +0.001467f, +0.003312f, -0.005066f, -0.000315f, +0.004787f, + +0.001828f, -0.002627f, -0.002052f, +0.000446f, -0.001371f, -0.002426f, +0.003266f, +0.001122f, -0.000176f, +0.001575f, + -0.000820f, +0.001693f, -0.000883f, +0.001723f, +0.002213f, -0.003063f + }, + { + -0.003051f, +0.003982f, +0.009980f, +0.011629f, +0.012990f, +0.000596f, -0.012847f, +0.038018f, +0.019493f, +0.015173f, + +0.010561f, -0.005107f, +0.004964f, -0.002180f, -0.006157f, +0.000972f, -0.003914f, -0.027599f, +0.007501f, -0.021474f, + -0.008318f, -0.007330f, -0.001375f, +0.016765f, -0.014035f, +0.003309f, +0.005559f, -0.010414f, -0.008797f, -0.006269f, + +0.008427f, -0.007906f, -0.003726f, +0.002391f, +0.000881f, -0.009518f, -0.007151f, +0.001132f, +0.003543f, +0.011580f, + -0.008895f, -0.009140f, +0.001392f, -0.005814f, -0.000153f, +0.011655f, -0.003800f, +0.001634f, +0.010273f, +0.001973f, + +0.007169f, -0.005544f, +0.000304f, -0.005542f, -0.001757f, -0.008704f, +0.000894f, -0.003905f, +0.010596f, -0.007369f, + +0.004164f, -0.008562f, -0.006160f, +0.001699f, -0.009993f, +0.001609f, +0.000449f, -0.000019f, +0.003644f, -0.001821f, + +0.003179f, -0.002179f, -0.008686f, +0.000946f, +0.000390f, -0.002793f, +0.002784f, -0.004099f, -0.005871f, +0.002770f, + -0.000750f, -0.002532f, +0.001922f, -0.002489f, -0.001562f, -0.001414f, +0.000094f, -0.002218f, -0.000718f, -0.002931f, + +0.003179f, -0.002327f, -0.000735f, -0.001443f, -0.000841f, -0.002112f + }, + { + -0.029653f, +0.001849f, +0.002883f, +0.003130f, -0.015137f, +0.030470f, +0.006161f, -0.000903f, +0.005897f, -0.002880f, + +0.005504f, +0.000210f, +0.005283f, -0.018635f, -0.000792f, +0.004422f, +0.015747f, +0.008872f, +0.007387f, +0.025505f, + -0.004907f, -0.001784f, +0.002166f, +0.005416f, -0.010105f, -0.000273f, +0.003211f, +0.006701f, +0.002360f, -0.001260f, + +0.005333f, +0.004495f, -0.004093f, -0.001720f, +0.015494f, +0.006895f, -0.007383f, -0.010627f, -0.003269f, -0.007780f, + +0.004981f, -0.011169f, -0.005345f, -0.005542f, +0.001515f, -0.009393f, +0.010454f, -0.015265f, -0.008106f, +0.002564f, + +0.001377f, +0.001512f, -0.004046f, +0.004902f, +0.010566f, -0.006533f, -0.002208f, -0.001579f, +0.002527f, -0.003759f, + +0.007510f, +0.007347f, +0.008794f, +0.004817f, -0.006586f, +0.001342f, +0.001952f, -0.005048f, -0.001947f, -0.003224f, + +0.006344f, +0.002571f, -0.000736f, +0.001513f, +0.001042f, +0.000958f, +0.002582f, -0.007854f, -0.000722f, +0.000415f, + +0.003501f, -0.001357f, +0.005415f, -0.000501f, +0.003555f, +0.001187f, +0.001701f, +0.004113f, +0.000221f, -0.000886f, + -0.000647f, +0.001372f, +0.000577f, +0.002626f, -0.001157f, +0.001161f + }, + { + -0.001764f, -0.041925f, -0.003697f, -0.013104f, +0.018769f, +0.003733f, +0.006347f, -0.006191f, -0.003089f, +0.003616f, + +0.006441f, +0.007689f, +0.007599f, -0.026995f, +0.020382f, -0.003747f, -0.005731f, -0.007091f, -0.003088f, +0.002421f, + +0.024744f, -0.001369f, -0.005386f, +0.025151f, +0.005748f, +0.007653f, -0.009888f, -0.000441f, -0.000876f, +0.010644f, + +0.018116f, -0.020007f, -0.008235f, +0.009323f, +0.005463f, +0.000388f, +0.012192f, +0.000905f, +0.009729f, -0.000120f, + -0.015955f, -0.014779f, +0.002811f, -0.007567f, +0.000283f, -0.007523f, +0.009720f, +0.006445f, -0.008093f, -0.005375f, + +0.007195f, +0.003970f, -0.001466f, -0.005350f, -0.006749f, +0.012171f, +0.000536f, -0.001125f, +0.000879f, +0.002813f, + +0.001369f, -0.007867f, +0.007350f, +0.002822f, +0.005347f, -0.003162f, +0.004141f, +0.002180f, -0.002307f, -0.004018f, + +0.001962f, +0.002771f, +0.004874f, -0.002663f, -0.001131f, -0.004352f, +0.004736f, -0.002735f, +0.000305f, -0.003391f, + -0.000007f, -0.006420f, -0.001780f, +0.005154f, -0.002495f, -0.004967f, +0.004507f, +0.006920f, -0.000920f, -0.001435f, + -0.001893f, -0.000873f, -0.001394f, -0.000776f, -0.000157f, +0.003226f + }, + { + -0.026332f, -0.021706f, -0.019515f, +0.026576f, -0.004285f, +0.011261f, +0.022880f, -0.018186f, +0.000740f, -0.005673f, + -0.003763f, -0.001018f, +0.016410f, +0.009262f, -0.004452f, -0.003106f, +0.016316f, -0.027213f, -0.010690f, +0.001652f, + +0.005236f, -0.001220f, -0.004042f, -0.012961f, +0.012032f, +0.009000f, +0.014401f, -0.016288f, -0.002696f, -0.009538f, + -0.022789f, -0.013056f, +0.013829f, -0.003227f, +0.000365f, -0.003540f, +0.008137f, +0.005162f, -0.001327f, +0.004516f, + +0.004876f, -0.003362f, +0.011241f, +0.008315f, +0.002596f, +0.001208f, +0.001924f, +0.004669f, +0.003855f, +0.003593f, + +0.003524f, +0.000337f, -0.016078f, -0.005726f, +0.003597f, +0.001291f, -0.003376f, -0.002205f, +0.002242f, -0.011969f, + -0.001931f, -0.004248f, -0.001302f, -0.003135f, -0.005845f, +0.000315f, -0.001348f, +0.003217f, +0.001906f, +0.008033f, + -0.000765f, -0.002311f, -0.001712f, +0.004815f, -0.002629f, -0.001962f, +0.003796f, +0.004766f, -0.003171f, +0.002100f, + -0.003194f, +0.000011f, +0.000364f, -0.002055f, -0.003387f, -0.001776f, +0.001323f, +0.002555f, -0.002648f, -0.000900f, + -0.003681f, -0.000985f, -0.000582f, +0.000619f, +0.000728f, +0.005170f + }, + { + -0.000601f, +0.041507f, +0.009234f, -0.005540f, +0.017263f, -0.002623f, +0.011472f, -0.003985f, -0.011697f, +0.008424f, + -0.022511f, +0.020322f, +0.006820f, -0.005083f, -0.054367f, -0.022007f, -0.004315f, +0.000864f, +0.005461f, -0.010040f, + +0.014490f, -0.005775f, +0.013494f, +0.002543f, +0.017372f, -0.001921f, +0.007027f, -0.007348f, +0.025634f, +0.007138f, + -0.006588f, +0.006844f, -0.002205f, +0.001729f, +0.007222f, -0.000467f, -0.002723f, +0.009334f, -0.004206f, +0.003801f, + +0.003782f, +0.009712f, -0.004237f, -0.007310f, -0.000917f, -0.002282f, -0.007524f, +0.002088f, +0.002754f, +0.001750f, + +0.003993f, +0.004781f, -0.004840f, +0.001387f, +0.004535f, -0.001529f, +0.008815f, +0.002433f, +0.002320f, +0.000956f, + +0.000039f, +0.007126f, +0.005034f, +0.006605f, +0.003858f, +0.001590f, +0.000111f, +0.003822f, +0.001745f, +0.005980f, + -0.002929f, +0.003122f, +0.005227f, +0.001911f, -0.000451f, +0.001883f, +0.002065f, -0.003529f, -0.001943f, -0.001557f, + +0.001523f, -0.003169f, +0.001278f, +0.001368f, +0.006512f, -0.003496f, +0.003359f, -0.002315f, -0.006408f, -0.005035f, + +0.001209f, +0.003168f, +0.002158f, +0.001887f, +0.000602f, -0.003746f + } + }, + { + { + -0.004403f, +0.237756f, -0.040309f, -0.109983f, +0.019580f, -0.012615f, +0.007124f, -0.012636f, -0.007877f, -0.007181f, + +0.024723f, +0.023468f, +0.016339f, +0.007688f, -0.014298f, +0.008232f, +0.013020f, +0.013670f, -0.003069f, +0.014881f, + -0.011673f, -0.012050f, -0.014740f, -0.008353f, -0.000133f, -0.001862f, -0.004537f, +0.000775f, -0.012431f, +0.005041f, + -0.013137f, +0.009888f, -0.003482f, -0.005750f, -0.011804f, -0.006409f, +0.007447f, +0.000292f, -0.001931f, -0.004935f, + +0.003380f, +0.013291f, +0.007870f, +0.000982f, -0.001866f, -0.003127f, +0.001376f, +0.007216f, -0.001832f, -0.003936f, + +0.002456f, +0.005146f, -0.008987f, -0.008687f, -0.006128f, -0.002088f, -0.003088f, -0.009879f, -0.004923f, -0.003701f, + -0.006442f, -0.002983f, +0.002013f, -0.000733f, -0.000517f, +0.002972f, +0.005871f, +0.002877f, +0.000277f, -0.000461f, + -0.000998f, -0.001913f, -0.001674f, -0.002304f, -0.000706f, +0.000098f, +0.001134f, +0.000242f, +0.000262f, -0.000429f, + +0.000357f, -0.000999f, -0.003601f, +0.003145f, +0.000316f, -0.000695f, -0.000243f, +0.000077f, +0.001446f, -0.001009f, + +0.001279f, +0.000694f, +0.000180f, -0.000982f, -0.002926f, +0.000767f + }, + { + -0.000173f, -0.017774f, +0.020449f, +0.053781f, +0.018598f, +0.003354f, +0.001169f, -0.000085f, +0.001257f, +0.003538f, + -0.000591f, -0.007957f, -0.002347f, -0.011122f, +0.005671f, +0.006129f, +0.003378f, +0.004398f, +0.011024f, +0.019290f, + +0.002680f, -0.006726f, +0.013328f, -0.003366f, +0.015351f, +0.002594f, -0.001272f, -0.009378f, -0.011013f, -0.004217f, + +0.010882f, +0.019471f, +0.000138f, -0.008340f, -0.015053f, +0.007363f, -0.012406f, -0.007560f, +0.005604f, -0.004155f, + +0.015613f, -0.001769f, -0.007374f, -0.001316f, +0.001958f, -0.004403f, -0.004917f, +0.007654f, -0.001283f, -0.002109f, + +0.002908f, -0.003289f, -0.005121f, -0.003973f, +0.003871f, -0.002137f, +0.003074f, +0.002032f, -0.003753f, +0.001408f, + +0.000546f, +0.000869f, -0.000999f, -0.005800f, -0.000201f, +0.000868f, +0.001805f, -0.000413f, +0.000964f, -0.004265f, + +0.001899f, -0.001329f, +0.000629f, -0.003676f, -0.003352f, -0.002399f, -0.002466f, +0.000376f, -0.000392f, -0.000923f, + +0.002024f, +0.000054f, -0.002080f, +0.001920f, +0.000600f, -0.001151f, -0.002723f, +0.001423f, -0.002174f, +0.000390f, + +0.001331f, +0.000843f, +0.001224f, -0.002159f, +0.001553f, +0.000154f + }, + { + +0.006511f, -0.113038f, -0.016234f, +0.001250f, +0.029597f, -0.008955f, +0.002131f, -0.005096f, +0.002985f, +0.013568f, + +0.001118f, -0.001393f, +0.009672f, +0.000081f, +0.012126f, -0.013428f, +0.025735f, +0.025562f, +0.007285f, -0.001673f, + -0.012679f, -0.013163f, +0.000834f, +0.001424f, +0.000576f, +0.002492f, -0.002616f, +0.008702f, -0.003837f, +0.010682f, + +0.007007f, +0.005249f, -0.017043f, +0.003949f, -0.007233f, +0.001133f, -0.006160f, -0.017788f, +0.011940f, -0.000471f, + +0.004949f, -0.008930f, +0.016877f, -0.000805f, +0.001421f, +0.002565f, -0.008668f, -0.003851f, +0.005756f, +0.003861f, + +0.010681f, -0.004162f, +0.001914f, -0.002860f, -0.000613f, +0.000486f, -0.007521f, -0.000034f, -0.001212f, +0.000947f, + -0.005783f, -0.002602f, +0.001534f, +0.003163f, -0.000288f, +0.003663f, -0.005151f, -0.000177f, +0.001935f, +0.003420f, + -0.000200f, -0.002718f, +0.002128f, -0.001778f, -0.001238f, +0.002381f, -0.006173f, -0.002590f, -0.002211f, -0.001879f, + -0.004040f, -0.000894f, +0.002322f, -0.002258f, -0.000307f, +0.000922f, -0.001932f, -0.002723f, +0.000614f, -0.000854f, + -0.001998f, +0.002284f, -0.000326f, +0.000527f, +0.004140f, +0.002534f + }, + { + +0.022071f, -0.013554f, +0.017790f, +0.041085f, -0.005061f, -0.002675f, -0.010077f, +0.011826f, -0.007804f, +0.002587f, + -0.018734f, +0.021321f, +0.010482f, +0.012824f, +0.001343f, -0.008369f, +0.032899f, +0.006262f, +0.005145f, -0.014670f, + +0.000165f, -0.007286f, +0.006949f, -0.001527f, +0.011020f, -0.000293f, -0.005497f, +0.010759f, -0.001373f, -0.003075f, + +0.007302f, +0.002171f, +0.001544f, +0.003739f, +0.000983f, +0.007169f, +0.006508f, +0.013094f, +0.000857f, -0.002211f, + -0.008302f, -0.012040f, +0.003344f, -0.010547f, -0.006501f, +0.012016f, +0.001109f, +0.001970f, +0.001462f, -0.002322f, + -0.002209f, +0.005296f, -0.003746f, +0.001869f, +0.005792f, +0.008985f, -0.000581f, -0.001125f, -0.001774f, +0.004886f, + -0.008689f, +0.000065f, +0.001946f, -0.003786f, -0.006874f, -0.002328f, -0.001363f, +0.003633f, +0.001014f, -0.000006f, + +0.002865f, +0.002302f, -0.000766f, +0.002141f, -0.002082f, +0.002721f, -0.005519f, +0.003670f, +0.000502f, -0.000903f, + -0.000775f, +0.000595f, -0.002001f, +0.002184f, +0.001332f, +0.000601f, -0.001306f, -0.000475f, -0.001067f, -0.000759f, + -0.001822f, +0.001415f, +0.001466f, -0.003597f, +0.000438f, +0.002676f + }, + { + +0.002012f, -0.066554f, -0.000416f, +0.012997f, +0.004291f, -0.002261f, -0.000773f, -0.007110f, -0.014406f, -0.013393f, + +0.003120f, -0.015660f, -0.001190f, +0.012605f, +0.040200f, -0.027979f, +0.008803f, +0.012705f, -0.019021f, -0.002031f, + -0.000485f, +0.005844f, -0.008208f, +0.016954f, -0.006439f, +0.008826f, +0.007120f, +0.005033f, -0.005475f, -0.003017f, + -0.006594f, -0.001575f, +0.006369f, -0.005916f, -0.000873f, -0.002777f, +0.004487f, +0.006023f, -0.002980f, -0.008766f, + +0.002506f, -0.005556f, -0.004248f, -0.009894f, -0.002962f, +0.003926f, +0.002063f, +0.000524f, -0.001181f, -0.002419f, + +0.002349f, +0.009183f, +0.008482f, -0.009876f, +0.000793f, +0.004352f, +0.007272f, -0.006440f, +0.007000f, -0.001942f, + +0.002947f, +0.003508f, -0.005005f, -0.005004f, -0.005384f, -0.001708f, +0.005582f, -0.001795f, -0.002436f, -0.002689f, + -0.005228f, -0.001585f, +0.003124f, +0.003887f, +0.003605f, -0.001921f, -0.001258f, +0.001509f, +0.002130f, +0.003879f, + +0.003832f, -0.002191f, -0.000901f, +0.002817f, +0.000868f, -0.005609f, -0.000632f, -0.000383f, +0.001262f, +0.000151f, + +0.002109f, -0.002560f, +0.001840f, -0.001150f, -0.000770f, -0.000105f + }, + { + +0.029254f, +0.027754f, -0.019425f, +0.090676f, -0.016893f, +0.004289f, -0.002162f, +0.001295f, +0.001118f, -0.022019f, + -0.005323f, +0.018262f, +0.006971f, -0.009922f, +0.007874f, -0.015579f, +0.009070f, +0.009566f, -0.016742f, -0.008167f, + -0.012317f, -0.004177f, +0.006937f, +0.008326f, +0.009389f, -0.000619f, -0.012250f, +0.005541f, +0.003389f, -0.011298f, + -0.002895f, +0.002140f, +0.005007f, -0.014155f, +0.021114f, -0.001559f, +0.001066f, +0.001708f, +0.000311f, -0.008054f, + -0.000817f, -0.001135f, +0.004125f, +0.004693f, -0.000061f, +0.005646f, +0.010938f, +0.003195f, +0.001872f, -0.001154f, + +0.000069f, +0.001478f, -0.003549f, +0.003361f, -0.008772f, +0.001726f, -0.002147f, -0.002537f, -0.005283f, -0.005209f, + -0.002722f, +0.002964f, -0.001730f, +0.001606f, -0.001821f, -0.000199f, +0.000134f, -0.002877f, +0.002615f, -0.003824f, + -0.001819f, +0.000780f, -0.001901f, -0.002508f, +0.001993f, +0.001275f, +0.005737f, +0.001444f, +0.002990f, +0.004217f, + +0.001429f, +0.000629f, +0.001279f, -0.001468f, -0.000810f, +0.000137f, +0.001027f, +0.000908f, -0.000838f, -0.002485f, + +0.000479f, -0.000608f, +0.001066f, +0.001583f, +0.001239f, +0.001557f + }, + { + -0.001057f, +0.012739f, +0.012847f, -0.009585f, +0.000534f, +0.001536f, +0.001386f, +0.000229f, +0.000438f, -0.001475f, + -0.000573f, -0.006885f, -0.004846f, +0.040264f, -0.013611f, +0.011559f, +0.010240f, +0.002689f, +0.003357f, +0.000378f, + +0.019056f, +0.007945f, -0.014312f, -0.001653f, -0.010858f, -0.004070f, +0.011619f, +0.020308f, -0.001043f, -0.008969f, + -0.012519f, -0.010554f, +0.013465f, +0.000239f, +0.002565f, -0.006217f, +0.002049f, -0.009030f, -0.003176f, -0.000218f, + +0.004769f, +0.003319f, -0.000780f, +0.004142f, -0.008472f, -0.000943f, -0.004149f, -0.007434f, -0.001905f, -0.004891f, + +0.001092f, +0.008297f, -0.006413f, -0.001652f, -0.001455f, -0.003968f, -0.000896f, -0.003368f, -0.002667f, -0.002238f, + +0.000220f, -0.002806f, -0.005646f, +0.000275f, -0.000196f, +0.002407f, -0.002820f, -0.004014f, -0.001238f, +0.005053f, + -0.004090f, +0.002588f, +0.002056f, -0.000137f, -0.000422f, -0.001896f, +0.000387f, -0.004347f, -0.000082f, -0.003075f, + +0.001363f, +0.000786f, +0.001807f, -0.001481f, +0.001642f, -0.001717f, -0.001109f, +0.001897f, +0.000238f, +0.001084f, + -0.002623f, +0.002052f, -0.001405f, +0.001672f, -0.001442f, -0.000209f + }, + { + +0.031517f, -0.066266f, +0.009004f, +0.074749f, -0.004149f, -0.010391f, -0.005662f, +0.000541f, +0.000283f, +0.001396f, + -0.000015f, +0.001442f, +0.024575f, +0.008574f, +0.013527f, -0.024713f, -0.012402f, +0.003264f, -0.002772f, -0.002607f, + +0.006839f, +0.000396f, +0.002930f, -0.011122f, -0.007856f, +0.002920f, +0.003633f, +0.010701f, +0.013052f, +0.006234f, + -0.002552f, -0.012004f, -0.013645f, -0.005459f, +0.013389f, +0.007066f, -0.000166f, -0.003217f, -0.000758f, -0.002296f, + -0.000435f, -0.001152f, +0.000567f, +0.005421f, -0.005520f, -0.003232f, +0.002061f, -0.000833f, -0.000908f, -0.004282f, + +0.003300f, -0.006276f, +0.007871f, -0.002367f, -0.003158f, +0.001754f, -0.000399f, -0.002848f, +0.002251f, -0.005568f, + +0.003249f, +0.002236f, -0.004383f, -0.005316f, +0.002486f, -0.000727f, -0.000661f, +0.005314f, -0.000349f, -0.004118f, + -0.003059f, -0.004398f, -0.000741f, -0.001231f, +0.000498f, +0.001867f, +0.005927f, +0.000773f, -0.002367f, -0.002512f, + -0.000388f, +0.001450f, -0.004728f, -0.002332f, -0.001339f, +0.001907f, -0.001702f, +0.000911f, -0.000112f, -0.002166f, + -0.000688f, -0.000371f, -0.000790f, -0.002302f, +0.001783f, +0.000625f + }, + { + -0.004811f, -0.028878f, -0.013352f, -0.007311f, -0.002477f, -0.003553f, -0.006322f, +0.002931f, +0.001117f, -0.006923f, + +0.006692f, -0.000445f, +0.003873f, +0.018782f, -0.000745f, +0.002482f, +0.017683f, +0.023678f, +0.003196f, +0.000774f, + +0.014807f, +0.007046f, +0.004179f, +0.009513f, -0.008739f, -0.019643f, -0.016304f, -0.004075f, +0.002347f, -0.006494f, + +0.006151f, +0.011320f, -0.017281f, -0.011833f, +0.001583f, +0.001082f, -0.009324f, +0.003694f, -0.002460f, +0.008131f, + -0.004304f, -0.012440f, +0.002548f, -0.010729f, -0.013306f, +0.005648f, +0.001250f, +0.010046f, -0.003116f, -0.002496f, + +0.004564f, +0.003181f, -0.000337f, -0.004276f, -0.003062f, +0.005197f, +0.004536f, -0.001203f, -0.006561f, +0.003940f, + +0.001554f, -0.003994f, -0.003376f, +0.004525f, +0.007231f, +0.000924f, +0.000485f, +0.002585f, -0.002452f, -0.001396f, + -0.000204f, -0.002965f, +0.001843f, +0.004955f, -0.001257f, +0.002185f, -0.002145f, +0.002850f, -0.002286f, -0.004383f, + -0.000836f, -0.000828f, -0.000394f, +0.001007f, -0.004196f, -0.004149f, -0.001489f, -0.000990f, +0.000397f, -0.002266f, + -0.003633f, -0.000565f, +0.002182f, -0.001502f, -0.001229f, -0.001373f + }, + { + -0.019425f, -0.049526f, +0.024869f, +0.016044f, -0.006975f, +0.022894f, +0.054270f, -0.016857f, +0.005388f, -0.019052f, + -0.006461f, +0.001722f, -0.011218f, -0.005266f, -0.021379f, +0.005739f, -0.008059f, -0.017088f, +0.007141f, -0.000470f, + +0.027607f, -0.004919f, +0.008044f, -0.006040f, -0.003929f, -0.013962f, -0.014932f, -0.004262f, -0.003848f, +0.020753f, + -0.011753f, -0.005597f, -0.001292f, -0.000290f, +0.004218f, -0.001673f, +0.011814f, +0.004566f, +0.011011f, +0.013098f, + -0.011973f, -0.011204f, +0.004734f, -0.013739f, -0.007857f, -0.012814f, +0.002381f, +0.009728f, -0.001120f, -0.000643f, + +0.004191f, +0.019372f, -0.001403f, -0.004854f, +0.002146f, +0.000477f, +0.005671f, +0.003456f, +0.001530f, -0.000627f, + +0.000014f, -0.000011f, -0.007059f, -0.004992f, +0.002462f, -0.001421f, +0.000678f, -0.004058f, -0.002133f, -0.002380f, + -0.004527f, +0.001144f, +0.002415f, -0.003125f, +0.001171f, -0.001879f, +0.000915f, -0.004660f, -0.000743f, +0.003399f, + +0.000747f, -0.000940f, -0.001655f, +0.001130f, -0.001344f, -0.007147f, +0.000253f, +0.003369f, -0.002056f, -0.001295f, + -0.000476f, +0.001797f, -0.003101f, -0.001260f, +0.001557f, -0.002545f + }, + { + +0.006025f, -0.016496f, -0.017939f, +0.001678f, -0.005938f, -0.006168f, +0.004737f, +0.012501f, -0.027812f, -0.014675f, + -0.004921f, -0.008746f, +0.012903f, +0.005677f, -0.012658f, -0.001594f, +0.003915f, -0.017736f, +0.004734f, -0.004359f, + +0.031019f, +0.016053f, -0.001124f, +0.016129f, +0.002957f, +0.015494f, +0.008494f, -0.005324f, -0.004135f, -0.006645f, + +0.012361f, -0.003754f, -0.005025f, -0.001115f, +0.005787f, +0.004741f, +0.012811f, +0.009897f, -0.003750f, +0.001644f, + -0.004807f, -0.006442f, -0.002465f, -0.001162f, +0.006001f, +0.006943f, -0.008253f, +0.010436f, -0.000003f, -0.015620f, + +0.003217f, +0.004248f, +0.007600f, +0.003528f, +0.008976f, +0.004825f, +0.007726f, -0.002627f, +0.012034f, -0.005390f, + +0.003664f, -0.008593f, -0.002717f, +0.002631f, -0.010105f, +0.003159f, -0.005899f, -0.008392f, +0.001063f, -0.000855f, + +0.001616f, +0.000686f, -0.005322f, +0.001149f, -0.000194f, -0.003475f, +0.002112f, -0.000821f, -0.005999f, +0.001072f, + -0.000155f, -0.003390f, +0.002691f, -0.000807f, -0.002710f, -0.001841f, +0.001159f, -0.002740f, -0.001185f, -0.003349f, + +0.002826f, -0.001400f, +0.000274f, -0.000338f, +0.000412f, +0.001490f + }, + { + +0.019211f, +0.084069f, -0.006735f, -0.005734f, -0.024671f, -0.032492f, -0.026804f, +0.008141f, +0.009352f, -0.015678f, + -0.006599f, +0.005711f, +0.000970f, -0.051198f, -0.026564f, +0.000554f, +0.001789f, +0.000474f, -0.013598f, +0.002307f, + -0.016039f, -0.002888f, -0.001781f, -0.001142f, -0.015985f, -0.020282f, -0.015811f, -0.000810f, +0.007444f, -0.003814f, + +0.004130f, +0.005655f, +0.006153f, +0.005350f, +0.012289f, +0.008017f, +0.007048f, -0.000722f, -0.005801f, -0.011877f, + +0.010039f, -0.015615f, -0.004120f, +0.001802f, +0.003245f, -0.006868f, +0.019094f, -0.008437f, +0.000015f, +0.001836f, + -0.016565f, -0.006298f, +0.002279f, +0.006945f, +0.003213f, -0.010037f, +0.000635f, -0.001443f, -0.003504f, -0.005638f, + -0.000389f, -0.000494f, +0.002298f, +0.000716f, -0.001694f, +0.006623f, +0.003183f, -0.007431f, -0.000857f, -0.005501f, + +0.001240f, +0.001283f, -0.004440f, -0.004249f, -0.004023f, +0.001390f, +0.004043f, -0.006389f, +0.002538f, +0.002340f, + +0.000657f, -0.006705f, -0.001157f, -0.001432f, +0.000126f, -0.002367f, -0.000225f, +0.001443f, -0.000012f, +0.000356f, + -0.000515f, +0.000545f, -0.000625f, +0.002451f, -0.001742f, +0.001969f + }, + { + +0.002684f, -0.044492f, -0.013073f, -0.013448f, +0.020506f, -0.006198f, -0.001675f, +0.001292f, +0.003137f, -0.002599f, + -0.003819f, +0.012999f, -0.001772f, -0.059264f, +0.009404f, +0.006536f, +0.013927f, +0.003557f, -0.009716f, -0.005443f, + +0.000637f, -0.009607f, -0.018140f, +0.000935f, -0.002439f, -0.016272f, -0.020725f, +0.008314f, +0.004088f, +0.015881f, + +0.027051f, -0.016780f, -0.000362f, +0.000684f, +0.003829f, +0.001947f, +0.002178f, -0.006523f, -0.003722f, -0.019222f, + -0.012120f, -0.003638f, +0.007116f, -0.003385f, -0.000173f, -0.010708f, -0.001351f, -0.005691f, -0.004914f, -0.003345f, + +0.007057f, +0.003217f, +0.001399f, +0.003503f, +0.000350f, +0.008436f, -0.003464f, -0.003822f, -0.003120f, +0.007150f, + +0.006458f, -0.004792f, +0.005209f, -0.000635f, +0.007452f, -0.001117f, -0.001936f, -0.000101f, -0.000599f, -0.004463f, + -0.005566f, -0.000559f, +0.002686f, -0.001151f, +0.001494f, -0.002699f, +0.002970f, -0.002662f, -0.001342f, -0.002924f, + +0.003291f, -0.001037f, +0.000825f, +0.005143f, -0.002940f, -0.004097f, +0.003078f, +0.002360f, -0.000718f, +0.001655f, + +0.002729f, +0.001937f, -0.002363f, +0.000325f, -0.001258f, +0.001168f + }, + { + +0.022649f, +0.060535f, +0.002563f, +0.032887f, +0.001988f, +0.002006f, +0.013454f, +0.005954f, +0.025963f, -0.009951f, + -0.004288f, -0.018354f, +0.010590f, -0.002384f, -0.029033f, +0.011650f, +0.017969f, -0.025966f, +0.000469f, -0.005497f, + -0.011542f, -0.006075f, +0.006162f, -0.004998f, +0.018169f, -0.002113f, +0.005785f, -0.005067f, -0.004936f, -0.019666f, + -0.009704f, -0.004044f, +0.007802f, -0.002093f, -0.001006f, -0.009362f, -0.003963f, -0.008973f, -0.007093f, +0.000052f, + -0.006606f, -0.005851f, +0.012223f, +0.010460f, +0.002965f, -0.000093f, +0.001988f, -0.000141f, -0.008832f, -0.010001f, + +0.002964f, +0.009269f, -0.004976f, -0.002410f, -0.005836f, -0.000386f, +0.001219f, -0.001753f, +0.007480f, -0.004408f, + +0.008107f, +0.000894f, +0.002472f, +0.005032f, -0.002809f, +0.004550f, +0.002265f, +0.003004f, -0.001494f, +0.002452f, + -0.002528f, -0.001662f, -0.002045f, +0.002014f, -0.000635f, +0.001521f, +0.005693f, +0.003147f, -0.000643f, +0.005051f, + -0.003573f, -0.002082f, -0.001486f, -0.001376f, -0.001246f, +0.000414f, -0.000413f, +0.001030f, -0.002069f, +0.000549f, + -0.002246f, -0.001950f, -0.001475f, +0.001395f, -0.001952f, +0.002570f + }, + { + +0.004287f, +0.033056f, +0.000503f, -0.007984f, +0.001062f, -0.012019f, +0.019860f, -0.004835f, -0.015414f, +0.004100f, + -0.015729f, +0.024177f, +0.003092f, +0.044102f, +0.070753f, -0.005545f, -0.001934f, -0.010120f, -0.005591f, -0.003013f, + -0.003202f, -0.014623f, +0.006046f, +0.006905f, +0.027342f, -0.000016f, +0.018143f, -0.004190f, -0.003492f, -0.001131f, + +0.002999f, +0.005040f, +0.005195f, +0.006260f, +0.023593f, -0.009516f, -0.010427f, +0.018135f, -0.005575f, -0.000041f, + -0.001416f, +0.006472f, -0.000227f, -0.001587f, +0.003534f, -0.006867f, -0.003988f, -0.001766f, -0.012790f, -0.004834f, + +0.002702f, -0.008991f, -0.010109f, +0.003948f, +0.002456f, +0.000374f, +0.006136f, +0.003665f, +0.006020f, +0.002265f, + -0.006005f, +0.001093f, +0.000722f, -0.000266f, +0.000006f, -0.000964f, -0.006267f, -0.003256f, -0.002812f, +0.004199f, + -0.001486f, +0.002052f, -0.005312f, -0.006683f, +0.000545f, +0.002611f, +0.004069f, +0.000236f, -0.001169f, -0.003694f, + +0.001558f, +0.002369f, +0.002872f, -0.003230f, +0.000992f, -0.003140f, +0.002719f, -0.004135f, -0.002821f, +0.000208f, + +0.002351f, +0.001835f, +0.000983f, -0.000187f, +0.001164f, -0.001568f + } + }, + { + { + -0.001621f, +0.162450f, +0.028996f, -0.090243f, +0.005191f, +0.004161f, -0.007803f, -0.012649f, -0.007057f, -0.002580f, + +0.014142f, +0.023411f, +0.025799f, -0.009290f, +0.004931f, -0.003875f, +0.013635f, +0.012515f, +0.016922f, -0.009455f, + +0.001493f, -0.011978f, -0.016486f, -0.005781f, -0.009286f, +0.002990f, +0.008105f, -0.014386f, -0.008623f, +0.000575f, + -0.002386f, +0.000481f, -0.008313f, -0.006266f, -0.011420f, -0.006351f, +0.005713f, +0.003270f, +0.000754f, -0.011419f, + +0.008157f, -0.002142f, +0.011422f, +0.002615f, +0.009611f, -0.004270f, -0.003619f, +0.006091f, +0.001137f, -0.000595f, + -0.005620f, +0.008532f, -0.006573f, -0.013592f, -0.004132f, +0.000673f, -0.007700f, -0.007618f, -0.006919f, -0.006641f, + +0.000092f, -0.002107f, -0.002568f, -0.000735f, -0.002367f, +0.003029f, +0.006994f, -0.001706f, +0.000196f, +0.000430f, + +0.000087f, -0.003211f, -0.001689f, +0.000425f, -0.003587f, -0.000132f, +0.001970f, +0.002031f, -0.002262f, +0.000411f, + +0.001190f, -0.001251f, -0.001577f, +0.000649f, +0.000300f, +0.001274f, -0.003039f, -0.001789f, +0.004444f, -0.001721f, + +0.001763f, +0.001306f, -0.000122f, +0.000111f, -0.001626f, -0.002100f + }, + { + +0.001858f, +0.040910f, -0.019556f, +0.046627f, +0.011471f, +0.001195f, +0.006331f, -0.005091f, -0.001287f, +0.003231f, + -0.006750f, +0.000672f, +0.007549f, -0.007788f, +0.002257f, -0.005366f, -0.004943f, +0.010986f, +0.031569f, +0.004845f, + +0.007506f, +0.011965f, +0.008469f, -0.010505f, +0.004505f, +0.010210f, -0.011481f, -0.000887f, -0.006920f, +0.001852f, + -0.003660f, +0.024476f, -0.002130f, -0.010068f, -0.012293f, +0.003149f, +0.003444f, -0.012266f, -0.003592f, +0.008629f, + +0.007118f, -0.002910f, -0.008584f, +0.007658f, -0.007817f, -0.000561f, -0.003691f, +0.010903f, -0.003776f, -0.003763f, + +0.001124f, -0.003391f, +0.002008f, -0.011939f, +0.008661f, -0.001268f, +0.006402f, +0.001335f, -0.007301f, +0.006260f, + +0.000939f, +0.000580f, -0.006612f, -0.002135f, +0.000998f, -0.000274f, +0.001247f, +0.000337f, -0.005004f, +0.000918f, + +0.000346f, -0.000149f, +0.000701f, -0.002183f, -0.005434f, -0.001552f, -0.002093f, -0.001450f, +0.003526f, -0.001900f, + -0.000141f, +0.002061f, +0.000887f, -0.001659f, -0.000988f, -0.000638f, -0.001433f, -0.002584f, +0.001110f, -0.000431f, + +0.002029f, +0.000654f, +0.000956f, +0.000719f, +0.000520f, -0.002948f + }, + { + -0.004606f, -0.127193f, +0.015164f, +0.048330f, -0.024529f, -0.001171f, -0.011758f, -0.002759f, +0.011970f, -0.005986f, + -0.002891f, +0.024913f, -0.000429f, +0.019879f, -0.000583f, -0.008816f, +0.027743f, +0.007488f, +0.023981f, -0.005982f, + -0.014562f, -0.012290f, +0.009059f, -0.004673f, +0.004064f, +0.003247f, -0.008960f, -0.002115f, +0.004136f, +0.013891f, + -0.006258f, +0.015269f, -0.015098f, -0.005101f, -0.004736f, -0.007788f, +0.005705f, -0.012975f, +0.001088f, +0.005137f, + -0.002278f, +0.003791f, +0.006579f, +0.003441f, +0.000300f, -0.000265f, -0.002221f, -0.000819f, -0.001960f, +0.004859f, + +0.001475f, +0.002495f, -0.003986f, +0.002736f, -0.004288f, -0.001012f, -0.002514f, -0.003523f, +0.002629f, -0.005030f, + -0.001054f, -0.003730f, +0.006059f, -0.001043f, +0.000192f, +0.001258f, -0.002805f, +0.000813f, +0.000012f, +0.004834f, + -0.000053f, -0.001112f, +0.002758f, -0.003668f, +0.001156f, +0.001743f, -0.001488f, -0.005227f, -0.002616f, +0.001119f, + -0.005276f, -0.001756f, +0.001395f, +0.000171f, -0.001104f, -0.001182f, -0.002298f, -0.002268f, -0.000720f, +0.001919f, + -0.001409f, +0.000393f, +0.000684f, -0.001746f, +0.004507f, +0.000752f + }, + { + -0.021047f, +0.041384f, +0.022096f, +0.048088f, -0.013144f, -0.007120f, -0.002838f, +0.003044f, +0.006914f, -0.010367f, + -0.016118f, +0.029632f, -0.000598f, +0.007762f, +0.018480f, -0.014557f, +0.027325f, -0.002143f, -0.003382f, -0.012292f, + +0.005358f, +0.006267f, -0.004487f, +0.006951f, +0.002603f, -0.002852f, +0.003391f, +0.002627f, +0.011246f, -0.014410f, + +0.007358f, -0.003799f, +0.020005f, -0.000871f, -0.004145f, +0.011702f, +0.003054f, +0.006337f, +0.005146f, +0.002787f, + -0.012077f, -0.008382f, -0.002999f, -0.009514f, +0.002879f, +0.002991f, +0.004029f, -0.002125f, +0.004015f, -0.007369f, + -0.002704f, +0.000379f, +0.002212f, -0.002605f, +0.006048f, +0.009521f, +0.008423f, -0.009119f, +0.004854f, +0.001635f, + -0.001697f, -0.005699f, +0.000438f, -0.002054f, -0.005838f, -0.003835f, +0.001929f, +0.001724f, +0.005049f, -0.003731f, + +0.004624f, +0.000603f, +0.001304f, +0.002272f, +0.000511f, -0.000487f, -0.005702f, +0.001603f, +0.002111f, -0.002600f, + +0.002011f, -0.000240f, -0.003758f, +0.003419f, +0.001911f, +0.002004f, -0.000479f, -0.001472f, -0.000686f, -0.001369f, + -0.000815f, +0.000732f, +0.001108f, -0.000706f, -0.002293f, +0.004735f + }, + { + +0.000306f, -0.054106f, -0.003868f, +0.011829f, +0.005727f, -0.000920f, -0.002953f, -0.020696f, -0.004865f, -0.008471f, + -0.000788f, -0.017894f, -0.002526f, +0.012968f, +0.040273f, -0.018605f, -0.010956f, +0.033390f, -0.018302f, -0.009278f, + +0.005725f, +0.009359f, -0.009001f, +0.009644f, +0.013024f, -0.002897f, -0.010338f, +0.014901f, -0.004920f, -0.015973f, + +0.001764f, +0.010024f, -0.014464f, +0.009193f, -0.000504f, +0.006608f, -0.010730f, +0.015249f, -0.003892f, -0.000305f, + -0.007774f, +0.005523f, -0.014466f, -0.010981f, -0.000138f, +0.006059f, +0.006382f, -0.002716f, -0.002771f, +0.000909f, + +0.002466f, +0.006469f, +0.000404f, +0.002389f, -0.002131f, +0.007201f, +0.006052f, -0.003516f, +0.001912f, +0.001579f, + +0.002367f, +0.001842f, +0.000464f, -0.011127f, -0.002975f, -0.005407f, +0.009591f, -0.006086f, +0.003118f, -0.004451f, + -0.004950f, -0.000022f, +0.002878f, +0.005304f, +0.001622f, +0.000097f, -0.002369f, +0.002026f, +0.003045f, +0.000540f, + +0.002720f, -0.000595f, -0.001878f, +0.001602f, +0.000702f, -0.002078f, -0.003721f, -0.000037f, +0.003006f, -0.000770f, + +0.000230f, -0.001993f, +0.001116f, +0.001174f, -0.002755f, +0.001009f + }, + { + -0.021906f, +0.094301f, -0.005458f, +0.076830f, -0.001020f, -0.004624f, -0.000701f, +0.008542f, -0.020559f, -0.002195f, + -0.018626f, +0.021726f, +0.002362f, -0.007564f, -0.000195f, -0.006985f, +0.008168f, -0.005179f, -0.011438f, -0.009888f, + -0.007496f, +0.002738f, +0.008796f, +0.007983f, +0.004239f, -0.000172f, -0.007541f, +0.006918f, -0.009197f, +0.002646f, + -0.006816f, -0.002000f, +0.012588f, -0.016677f, +0.012304f, +0.006361f, -0.007053f, +0.007054f, -0.007339f, -0.002175f, + +0.003822f, -0.005010f, +0.006334f, +0.004141f, -0.002504f, +0.007449f, +0.011754f, +0.003098f, -0.003339f, -0.000927f, + +0.003415f, -0.002531f, -0.003913f, -0.001573f, -0.000888f, -0.000283f, -0.004785f, -0.003051f, -0.005807f, -0.001318f, + -0.007198f, +0.004020f, +0.001647f, -0.003364f, -0.000902f, -0.000917f, +0.002951f, -0.000024f, -0.001218f, -0.000384f, + -0.005415f, +0.001427f, -0.003921f, -0.001599f, +0.001153f, -0.000373f, +0.008749f, +0.000506f, +0.003928f, +0.001515f, + +0.002723f, +0.002518f, +0.000796f, -0.001398f, +0.000196f, -0.002326f, +0.001220f, +0.003358f, -0.001724f, -0.001721f, + +0.000911f, -0.001316f, +0.001261f, +0.001461f, +0.001506f, +0.001817f + }, + { + +0.000003f, +0.028762f, -0.017531f, -0.005844f, +0.001511f, +0.002496f, -0.001700f, +0.001469f, -0.001724f, -0.006864f, + +0.011502f, -0.019671f, +0.010710f, +0.006905f, +0.001331f, +0.013907f, -0.010835f, +0.031312f, +0.000115f, +0.012111f, + +0.020738f, +0.003579f, -0.010754f, -0.001759f, -0.016929f, +0.005090f, +0.010106f, +0.004537f, +0.005645f, -0.008013f, + -0.002622f, -0.010221f, +0.005147f, +0.003231f, -0.006105f, -0.006957f, +0.001406f, -0.006669f, +0.001835f, -0.001431f, + -0.008044f, +0.012875f, +0.006271f, -0.001864f, +0.000415f, -0.005046f, -0.009569f, -0.002449f, -0.003182f, +0.000971f, + -0.000501f, +0.006185f, -0.006479f, -0.002544f, -0.005946f, -0.003995f, +0.003199f, -0.004108f, -0.002498f, -0.006864f, + +0.004065f, -0.002749f, -0.004579f, -0.001927f, -0.000125f, +0.004682f, -0.004931f, +0.001272f, -0.005079f, +0.006162f, + -0.000759f, +0.000159f, +0.003710f, -0.003640f, -0.001222f, -0.000678f, -0.001706f, -0.003634f, -0.000072f, -0.001853f, + +0.003958f, -0.003209f, +0.003638f, +0.000118f, -0.001530f, +0.000406f, +0.000634f, +0.000484f, +0.001050f, -0.000241f, + +0.000278f, +0.000418f, -0.000832f, +0.000458f, -0.000721f, +0.000426f + }, + { + -0.038241f, +0.023335f, +0.013957f, +0.078170f, -0.001584f, -0.002832f, -0.023875f, +0.014592f, +0.002867f, -0.002355f, + -0.029893f, +0.014064f, +0.042947f, -0.009201f, +0.021317f, -0.012671f, -0.003244f, -0.003857f, +0.007424f, +0.002280f, + +0.001054f, +0.003227f, -0.001594f, -0.017380f, +0.001175f, -0.007889f, +0.019295f, +0.007923f, -0.002697f, +0.014597f, + -0.002016f, -0.016169f, +0.003056f, -0.011062f, +0.006081f, +0.004990f, -0.006346f, -0.000415f, +0.001743f, +0.001580f, + +0.000185f, -0.004685f, +0.006027f, +0.004305f, -0.002596f, -0.008729f, +0.003174f, -0.002039f, +0.006159f, -0.007321f, + +0.002987f, -0.002579f, +0.008194f, -0.002012f, -0.001447f, +0.003152f, +0.004456f, -0.009710f, +0.002848f, -0.001965f, + +0.001060f, -0.004324f, +0.000771f, -0.008409f, +0.001787f, -0.002841f, +0.007498f, +0.001801f, -0.006441f, +0.002273f, + -0.002232f, -0.004086f, -0.006516f, +0.000127f, +0.002570f, +0.002394f, +0.001524f, +0.000567f, -0.001149f, -0.000839f, + -0.001063f, +0.001157f, -0.004854f, -0.002485f, -0.001583f, +0.000050f, +0.002078f, -0.001387f, -0.001049f, +0.000842f, + -0.001328f, -0.000498f, -0.001315f, -0.003729f, +0.001604f, +0.001349f + }, + { + -0.000483f, -0.049049f, -0.016110f, -0.016029f, +0.002074f, -0.000608f, -0.004523f, +0.004898f, -0.014702f, +0.000755f, + +0.006074f, +0.007967f, +0.003313f, +0.007255f, +0.014061f, +0.041282f, -0.002343f, +0.004550f, +0.010695f, +0.013755f, + +0.005674f, +0.007490f, +0.000421f, +0.004896f, -0.003561f, -0.001867f, -0.016986f, -0.011417f, +0.010606f, -0.003018f, + -0.005705f, +0.011909f, -0.004467f, -0.005269f, -0.010904f, -0.011293f, +0.004105f, +0.004008f, -0.004578f, +0.005166f, + -0.010524f, -0.005475f, +0.000431f, -0.004428f, -0.008531f, -0.009600f, +0.010778f, +0.004900f, -0.003138f, -0.000689f, + +0.007179f, -0.000629f, +0.000159f, -0.007543f, -0.004425f, +0.007375f, +0.002069f, -0.003727f, -0.003288f, +0.008196f, + -0.001489f, -0.004835f, -0.001397f, +0.005099f, +0.006103f, -0.002048f, -0.000073f, +0.008412f, -0.004274f, -0.004309f, + -0.002119f, -0.001783f, +0.006140f, +0.000859f, -0.002273f, +0.000820f, +0.001235f, -0.001723f, -0.001226f, -0.003647f, + -0.001507f, +0.000061f, -0.001365f, +0.000377f, -0.003618f, -0.002339f, -0.002823f, -0.000672f, -0.001136f, -0.002436f, + -0.003792f, +0.002276f, -0.001780f, -0.000328f, -0.003237f, +0.000267f + }, + { + +0.020920f, -0.074749f, -0.007097f, +0.018191f, +0.029417f, +0.013617f, +0.016006f, -0.006613f, -0.002546f, -0.008558f, + -0.010498f, -0.028356f, -0.003329f, +0.010230f, +0.006304f, -0.016102f, -0.012195f, +0.006215f, -0.009212f, -0.004544f, + +0.018141f, -0.005036f, +0.012289f, -0.006236f, -0.016705f, -0.005941f, -0.018894f, +0.000331f, +0.005914f, +0.002424f, + -0.003932f, +0.006067f, -0.010682f, +0.000207f, -0.001171f, +0.014492f, -0.000430f, +0.008312f, +0.013374f, +0.006002f, + +0.002271f, -0.015080f, -0.010329f, +0.003716f, -0.006021f, -0.022352f, +0.001235f, +0.003315f, +0.004042f, +0.009310f, + -0.004549f, +0.019887f, -0.001728f, -0.006238f, -0.001060f, +0.003816f, +0.004354f, +0.003574f, +0.000027f, +0.002502f, + -0.003834f, +0.005972f, -0.004528f, -0.005048f, +0.003187f, -0.002653f, -0.003260f, -0.002294f, -0.003851f, -0.002818f, + -0.005291f, +0.004223f, -0.005453f, -0.000298f, +0.002084f, +0.002921f, -0.005337f, -0.002459f, +0.001789f, +0.002670f, + +0.003873f, -0.004092f, -0.005311f, +0.005447f, -0.001259f, -0.006960f, +0.003392f, -0.001279f, -0.002953f, -0.001321f, + -0.000426f, +0.000082f, -0.000130f, -0.002188f, -0.000356f, +0.001041f + }, + { + -0.005147f, -0.032039f, +0.023787f, -0.008159f, -0.010446f, -0.021481f, +0.026818f, +0.006348f, -0.033649f, -0.020470f, + -0.006680f, -0.003155f, +0.003621f, +0.012403f, -0.019582f, +0.012372f, +0.003384f, -0.002090f, -0.009784f, +0.003972f, + +0.017965f, +0.011870f, +0.012008f, +0.008724f, +0.016495f, +0.007898f, -0.003709f, -0.002140f, +0.003611f, -0.000421f, + -0.004194f, +0.011210f, -0.002611f, -0.022819f, +0.006721f, +0.009721f, +0.014885f, +0.014055f, -0.000017f, -0.006989f, + +0.002630f, -0.009417f, -0.010409f, +0.011187f, -0.004226f, +0.007505f, -0.007362f, +0.012559f, -0.001325f, -0.007369f, + -0.004675f, +0.006821f, +0.004922f, +0.010628f, +0.005518f, +0.012626f, +0.000101f, +0.002933f, +0.005375f, -0.001112f, + +0.003366f, -0.009651f, -0.001808f, +0.001825f, -0.003609f, +0.000408f, -0.003120f, -0.010173f, -0.001503f, +0.003304f, + -0.003187f, +0.003584f, -0.002457f, -0.001527f, -0.000821f, +0.002328f, -0.002038f, +0.001963f, -0.005180f, -0.002266f, + +0.000963f, +0.001713f, -0.004242f, -0.000224f, +0.000082f, +0.000115f, -0.001681f, -0.000542f, -0.003491f, -0.000579f, + +0.000118f, -0.000581f, +0.000155f, -0.001226f, +0.000071f, +0.001191f + }, + { + +0.004090f, +0.117100f, -0.025138f, +0.013266f, -0.009806f, -0.091481f, +0.000407f, +0.001142f, +0.011373f, -0.006010f, + -0.036822f, +0.027909f, +0.006463f, -0.049729f, -0.035198f, +0.007954f, -0.021840f, +0.000480f, +0.006007f, -0.017120f, + -0.017616f, -0.007132f, +0.000465f, +0.002442f, -0.003161f, -0.018012f, -0.011255f, -0.020407f, +0.013172f, +0.000480f, + -0.008811f, +0.008372f, +0.014993f, +0.006106f, +0.005620f, +0.011160f, -0.000371f, -0.004391f, -0.001500f, -0.006555f, + -0.000855f, -0.002426f, -0.000108f, +0.001040f, -0.004850f, +0.007955f, +0.008765f, -0.007036f, +0.007185f, -0.002483f, + -0.015284f, -0.011692f, +0.002566f, +0.008785f, -0.001464f, -0.008572f, -0.000835f, +0.006979f, -0.008589f, +0.000644f, + -0.006582f, -0.000757f, +0.002034f, +0.000890f, -0.001492f, +0.007069f, -0.003392f, -0.005753f, +0.002399f, -0.001209f, + -0.001892f, +0.000411f, -0.003200f, -0.003867f, -0.009269f, +0.004117f, +0.002030f, -0.001394f, -0.001314f, +0.004987f, + -0.003144f, -0.006037f, -0.003099f, +0.000106f, +0.000167f, -0.001754f, -0.000374f, +0.000190f, -0.000691f, +0.001757f, + -0.001178f, +0.000850f, -0.000043f, -0.001517f, +0.000715f, +0.000884f + }, + { + -0.000565f, -0.041689f, +0.000072f, -0.010948f, -0.001879f, +0.008924f, -0.012324f, +0.014806f, -0.004112f, +0.006572f, + -0.013544f, +0.013212f, -0.023682f, -0.047764f, +0.024429f, +0.013046f, +0.008095f, +0.000536f, -0.011824f, +0.012852f, + -0.018943f, -0.021696f, +0.003793f, -0.009530f, -0.015625f, -0.005097f, -0.016416f, -0.011153f, +0.029557f, +0.000602f, + +0.027165f, -0.008488f, +0.004369f, +0.000802f, +0.001768f, +0.003363f, +0.003272f, -0.008148f, -0.014852f, -0.013938f, + -0.006811f, +0.001816f, -0.003223f, +0.001791f, -0.003954f, -0.005184f, -0.003894f, -0.011624f, +0.007516f, -0.003475f, + +0.002294f, -0.005168f, +0.005528f, +0.003656f, +0.009215f, -0.006525f, +0.004552f, -0.001191f, -0.004257f, +0.013439f, + -0.000668f, -0.007171f, +0.004803f, +0.003209f, -0.001226f, +0.002343f, -0.001241f, -0.004652f, -0.000191f, +0.004549f, + -0.010408f, +0.000735f, -0.001158f, +0.002779f, +0.000102f, +0.001583f, -0.002272f, -0.000771f, -0.006067f, +0.004317f, + +0.000533f, +0.002268f, +0.000479f, +0.005197f, -0.004285f, +0.001417f, +0.000463f, +0.002020f, +0.000898f, +0.000356f, + +0.004270f, +0.000641f, -0.003937f, -0.000686f, -0.000466f, +0.001618f + }, + { + -0.008910f, +0.099587f, +0.018486f, +0.019028f, +0.003271f, -0.003537f, -0.004153f, +0.025097f, +0.015079f, -0.011875f, + -0.002078f, -0.033255f, +0.006082f, +0.016722f, -0.037524f, -0.007047f, +0.009570f, -0.000054f, +0.000374f, -0.011537f, + -0.021525f, +0.001345f, +0.006109f, -0.002605f, +0.013987f, +0.009516f, -0.005896f, +0.010131f, -0.000089f, -0.027367f, + -0.010956f, +0.002366f, -0.001656f, +0.009392f, -0.000016f, -0.005706f, -0.018971f, -0.010727f, -0.005845f, -0.001585f, + -0.011143f, +0.010652f, +0.002918f, +0.013719f, -0.004221f, +0.002704f, +0.007184f, -0.004405f, -0.014135f, -0.006688f, + -0.000134f, +0.005717f, +0.008035f, -0.005812f, -0.003383f, -0.007909f, +0.007283f, -0.002647f, +0.007446f, +0.001090f, + +0.004928f, +0.000598f, +0.001124f, +0.006181f, +0.001838f, +0.004773f, -0.002516f, +0.002519f, -0.000277f, +0.001812f, + -0.004982f, +0.000986f, +0.000535f, -0.004310f, +0.000948f, +0.003928f, +0.006035f, -0.001543f, +0.002262f, +0.004172f, + -0.001299f, -0.005299f, -0.005001f, +0.003259f, +0.000103f, +0.002190f, -0.003338f, +0.001477f, -0.000115f, +0.001512f, + -0.001053f, -0.003492f, -0.003001f, +0.002133f, -0.001201f, -0.001087f + }, + { + -0.004929f, +0.040850f, -0.000082f, -0.002953f, -0.006763f, -0.003329f, +0.012839f, -0.006356f, -0.006758f, -0.012913f, + +0.013223f, +0.005991f, +0.008074f, -0.043037f, +0.156555f, +0.014112f, -0.011740f, +0.014746f, -0.032663f, +0.003652f, + -0.016383f, -0.006249f, -0.014139f, +0.026930f, +0.004132f, +0.018202f, +0.007335f, +0.013274f, -0.009118f, +0.000851f, + +0.000270f, -0.006284f, +0.015330f, -0.002666f, +0.026809f, -0.017302f, +0.009097f, +0.011136f, -0.005310f, -0.002656f, + +0.002577f, -0.000586f, +0.008462f, -0.005829f, +0.004369f, -0.002402f, -0.002979f, +0.004326f, -0.017447f, -0.011717f, + +0.008047f, -0.012975f, -0.010795f, +0.006210f, -0.001150f, +0.000578f, +0.000736f, +0.006486f, +0.007169f, +0.003612f, + -0.005671f, +0.001394f, -0.006471f, -0.000717f, -0.001233f, -0.000180f, -0.007601f, -0.000039f, -0.003625f, +0.002820f, + +0.002017f, -0.002177f, -0.003690f, -0.005185f, -0.001395f, +0.003948f, +0.002457f, -0.000667f, -0.000241f, -0.001830f, + +0.001932f, -0.000221f, -0.001871f, +0.000247f, -0.002626f, -0.001033f, +0.001075f, -0.002900f, -0.003567f, +0.005026f, + -0.000253f, -0.000365f, +0.002186f, +0.000119f, +0.000152f, +0.000436f + } + }, + { + { + +0.005653f, +0.153462f, +0.005445f, -0.014559f, +0.054489f, +0.000535f, -0.006816f, -0.007606f, -0.007148f, -0.004984f, + +0.009748f, +0.013807f, +0.003977f, -0.011780f, +0.002605f, -0.009571f, -0.009102f, -0.001408f, +0.012386f, -0.009138f, + +0.010262f, -0.002631f, -0.000408f, +0.015094f, +0.005019f, -0.000909f, +0.006590f, -0.007783f, +0.005414f, +0.002397f, + -0.005091f, -0.007737f, -0.009141f, -0.005206f, -0.014623f, -0.006077f, +0.000122f, +0.006998f, +0.004739f, -0.009774f, + +0.003832f, -0.012913f, +0.010838f, +0.010133f, +0.015557f, +0.001512f, -0.003274f, +0.002818f, +0.005746f, +0.006170f, + -0.000370f, +0.006959f, +0.002380f, -0.001846f, -0.002372f, -0.001676f, -0.006862f, -0.000778f, -0.003389f, -0.002111f, + -0.003418f, -0.005794f, -0.005482f, -0.004965f, -0.007994f, -0.007479f, +0.002073f, -0.004261f, -0.002137f, -0.001897f, + -0.001333f, +0.000539f, -0.000824f, -0.001762f, -0.004200f, -0.001719f, -0.000042f, +0.002773f, +0.000619f, +0.004144f, + +0.003425f, +0.001472f, -0.001188f, +0.001041f, -0.000904f, +0.001538f, -0.000938f, -0.001348f, +0.004747f, -0.000710f, + +0.001388f, +0.000515f, +0.000482f, +0.001274f, -0.000882f, -0.002718f + }, + { + -0.001262f, +0.076704f, +0.016627f, -0.022326f, -0.039105f, +0.004309f, +0.004739f, -0.010929f, -0.005448f, +0.002785f, + +0.006188f, +0.006318f, +0.001228f, -0.010361f, -0.002294f, -0.010491f, -0.009862f, -0.006380f, +0.003659f, -0.018023f, + +0.018515f, +0.014889f, -0.003154f, +0.003010f, +0.018520f, +0.012623f, -0.014698f, +0.005297f, -0.000861f, +0.002597f, + -0.011067f, +0.023101f, +0.004272f, -0.005669f, +0.003270f, +0.009844f, +0.009198f, -0.003005f, -0.002548f, +0.003593f, + +0.002691f, +0.003144f, -0.006536f, -0.000275f, -0.018422f, -0.001825f, +0.003389f, +0.008190f, -0.009154f, -0.004726f, + +0.005436f, -0.000016f, +0.013869f, -0.000816f, +0.006180f, -0.004311f, +0.004769f, -0.000019f, -0.012727f, +0.001644f, + +0.007693f, +0.004945f, -0.004502f, -0.004165f, -0.003991f, +0.000554f, -0.000175f, +0.001422f, -0.006013f, -0.000134f, + +0.000433f, -0.001270f, +0.001114f, +0.001632f, -0.002225f, +0.000543f, -0.001379f, -0.001756f, +0.007380f, +0.000992f, + -0.002341f, -0.000364f, +0.000614f, -0.003385f, -0.001706f, -0.000070f, -0.001236f, -0.001014f, +0.002792f, -0.002709f, + -0.001218f, -0.000165f, +0.001645f, +0.001518f, -0.000162f, -0.003413f + }, + { + -0.000925f, -0.146347f, -0.002557f, +0.100149f, +0.010575f, -0.003899f, -0.015615f, -0.013539f, +0.001051f, -0.012088f, + +0.007966f, +0.035458f, +0.002626f, +0.012530f, -0.012340f, -0.006006f, +0.027348f, +0.007150f, +0.027288f, -0.001965f, + -0.010001f, -0.013271f, -0.000383f, -0.007471f, +0.013038f, +0.002743f, -0.015311f, -0.002737f, +0.007117f, +0.006048f, + -0.018594f, +0.022165f, -0.000631f, -0.004179f, -0.008836f, -0.002253f, +0.010740f, -0.020569f, -0.012192f, +0.004341f, + -0.000084f, -0.000345f, -0.006706f, -0.003658f, -0.005713f, +0.000542f, +0.004447f, -0.008821f, -0.015324f, -0.002988f, + -0.008121f, +0.000432f, +0.000775f, +0.001826f, -0.005396f, +0.000707f, +0.001175f, +0.002814f, +0.012252f, -0.002455f, + +0.005173f, +0.007915f, +0.008784f, -0.002898f, +0.002108f, -0.001726f, -0.002764f, +0.004567f, -0.000783f, +0.001515f, + -0.002739f, +0.000228f, +0.005084f, -0.001297f, +0.000880f, +0.001773f, +0.003341f, +0.002245f, +0.002227f, +0.004112f, + -0.001868f, -0.000261f, -0.002027f, -0.001315f, +0.000517f, +0.001050f, -0.000267f, -0.001456f, +0.000694f, +0.003508f, + +0.000332f, -0.001758f, +0.000328f, -0.001519f, +0.003808f, +0.001333f + }, + { + +0.012154f, +0.078034f, +0.009776f, +0.067721f, +0.000330f, -0.005726f, +0.003920f, +0.000745f, +0.003326f, -0.011435f, + -0.022404f, +0.006688f, -0.006452f, +0.002540f, -0.005674f, -0.034621f, +0.006252f, -0.025562f, -0.013516f, -0.008843f, + +0.014443f, +0.009118f, -0.005041f, +0.000922f, +0.009802f, -0.002692f, -0.004337f, -0.010970f, +0.010564f, +0.001111f, + +0.000722f, -0.009411f, +0.021742f, -0.005186f, -0.000565f, +0.010167f, -0.005663f, -0.005854f, -0.006848f, +0.006403f, + -0.001347f, -0.005046f, -0.005092f, -0.004177f, +0.004041f, -0.004297f, +0.004090f, +0.002400f, -0.000794f, -0.008834f, + -0.001707f, -0.002972f, +0.004279f, -0.001977f, +0.002368f, +0.003728f, +0.006503f, -0.001167f, -0.000230f, -0.003118f, + +0.008179f, +0.002669f, +0.002595f, -0.000083f, +0.003505f, +0.001542f, +0.004027f, -0.002097f, +0.003054f, -0.000769f, + +0.001134f, -0.003128f, -0.000107f, -0.001823f, -0.001492f, +0.002141f, -0.001200f, +0.000406f, -0.000748f, -0.001194f, + +0.005076f, +0.001418f, -0.003637f, +0.000654f, +0.000248f, +0.000054f, +0.000490f, +0.000802f, +0.000356f, +0.001677f, + +0.001723f, +0.001728f, +0.001541f, +0.001910f, -0.000782f, +0.002083f + }, + { + -0.002889f, -0.047213f, +0.000608f, -0.002955f, -0.003729f, +0.000024f, -0.003107f, -0.014540f, +0.003109f, +0.002920f, + +0.009519f, -0.014976f, -0.007608f, -0.002031f, +0.040465f, +0.003131f, -0.021449f, +0.014547f, -0.008148f, -0.022061f, + -0.015848f, +0.009590f, -0.018875f, -0.009090f, +0.002078f, -0.024446f, -0.006843f, +0.029895f, +0.001262f, -0.014871f, + +0.007529f, +0.018150f, -0.015666f, +0.013387f, +0.007148f, +0.004654f, -0.012512f, +0.008808f, +0.008252f, +0.016905f, + -0.012218f, -0.003775f, -0.006243f, +0.000134f, +0.002311f, +0.005078f, +0.009159f, +0.003553f, +0.004751f, +0.005618f, + -0.002844f, -0.002794f, -0.001420f, +0.011197f, -0.000715f, +0.003463f, +0.003807f, -0.001136f, +0.002755f, +0.003912f, + +0.003839f, -0.001832f, +0.003741f, -0.000058f, +0.005672f, -0.003269f, +0.003295f, -0.011519f, +0.001049f, -0.001381f, + -0.002270f, -0.003737f, +0.000492f, +0.002340f, -0.002813f, -0.001214f, -0.003598f, -0.000148f, +0.004631f, +0.000366f, + -0.000472f, -0.002001f, -0.002374f, +0.001737f, +0.000104f, -0.000514f, -0.001740f, -0.000616f, +0.002796f, +0.000018f, + -0.000270f, +0.000743f, +0.003264f, +0.001739f, -0.001727f, +0.001386f + }, + { + +0.003816f, +0.119311f, +0.002632f, +0.079758f, -0.000205f, -0.007099f, -0.001147f, +0.021231f, -0.021363f, -0.001133f, + -0.029143f, +0.005419f, +0.001641f, +0.005372f, +0.008519f, -0.014832f, +0.002788f, +0.000273f, -0.000433f, -0.008177f, + -0.007278f, +0.013145f, +0.015124f, -0.003397f, +0.003061f, +0.003063f, -0.003831f, +0.005433f, -0.010468f, +0.007584f, + +0.002874f, -0.000057f, +0.010140f, -0.006415f, +0.007883f, +0.004868f, -0.011161f, +0.000494f, -0.000723f, +0.006171f, + +0.010121f, +0.000620f, +0.003711f, -0.002697f, -0.007728f, +0.004405f, +0.005799f, +0.002857f, +0.001618f, +0.004191f, + +0.003733f, -0.012164f, -0.007855f, -0.003871f, -0.001183f, +0.000276f, +0.002634f, +0.001505f, -0.003770f, +0.004546f, + -0.001583f, +0.001377f, +0.003648f, +0.001265f, -0.003210f, -0.004101f, +0.006086f, +0.004298f, +0.000038f, +0.002013f, + -0.001267f, +0.004935f, -0.003372f, -0.003808f, +0.000286f, -0.000910f, +0.004687f, +0.000942f, +0.004540f, +0.000541f, + -0.000283f, -0.001326f, -0.002246f, -0.001348f, +0.000521f, -0.002706f, +0.001233f, +0.003575f, -0.000863f, -0.000638f, + +0.003582f, -0.001096f, +0.002026f, +0.002569f, -0.000567f, +0.000109f + }, + { + +0.001030f, +0.031687f, -0.012887f, -0.006480f, -0.002387f, +0.003060f, -0.001722f, +0.003193f, -0.000645f, -0.005701f, + +0.008041f, -0.020583f, -0.001121f, -0.012022f, -0.010891f, -0.004673f, -0.028739f, +0.025360f, +0.008115f, +0.012048f, + +0.006026f, -0.012211f, -0.006737f, -0.006194f, -0.018536f, +0.004651f, +0.012458f, -0.003334f, +0.006641f, +0.003978f, + -0.009327f, -0.008693f, -0.015136f, -0.011259f, +0.001238f, -0.005838f, +0.001711f, -0.006266f, +0.007314f, +0.003743f, + -0.001823f, +0.010774f, +0.000648f, -0.006342f, -0.003752f, +0.000655f, +0.003505f, +0.009829f, -0.000619f, -0.004019f, + -0.006629f, -0.001413f, -0.002661f, +0.002812f, -0.000227f, -0.003800f, +0.007631f, +0.002710f, -0.005680f, -0.006020f, + +0.006939f, +0.000843f, -0.001459f, -0.002817f, -0.003425f, +0.001544f, +0.000636f, +0.004886f, -0.004040f, +0.003843f, + -0.002395f, +0.002086f, +0.003044f, -0.004334f, +0.002495f, +0.001282f, +0.001748f, +0.002155f, +0.004605f, +0.001014f, + +0.005634f, -0.000603f, +0.002256f, -0.001587f, +0.000237f, +0.002887f, +0.001489f, -0.003105f, -0.003020f, -0.001054f, + -0.001031f, -0.000597f, -0.001735f, -0.000411f, -0.000368f, +0.001093f + }, + { + +0.032675f, +0.114242f, +0.020206f, +0.056081f, -0.042079f, +0.004487f, -0.053562f, -0.006712f, +0.003882f, -0.010608f, + -0.013878f, +0.008371f, +0.025684f, -0.010610f, +0.020161f, +0.004364f, +0.000477f, -0.013090f, +0.008576f, +0.015935f, + +0.000457f, -0.002417f, +0.009510f, -0.006636f, -0.009810f, -0.013072f, +0.005933f, +0.004350f, -0.002184f, +0.009994f, + -0.006157f, -0.014190f, +0.015391f, -0.008050f, +0.003314f, +0.006162f, -0.007971f, -0.004632f, +0.004856f, -0.000684f, + -0.006005f, -0.007275f, +0.005912f, +0.005591f, -0.006985f, -0.013245f, -0.002024f, -0.004784f, +0.009853f, -0.009370f, + -0.000895f, +0.002268f, +0.007376f, +0.007852f, +0.005423f, +0.001093f, +0.009038f, -0.006872f, +0.004930f, +0.003121f, + +0.003448f, -0.004114f, +0.005327f, -0.006354f, -0.000077f, -0.004231f, +0.000629f, -0.001019f, -0.006015f, +0.000913f, + +0.003283f, +0.001925f, -0.002598f, +0.002604f, +0.003980f, +0.001426f, -0.003113f, -0.003573f, -0.001477f, +0.002710f, + -0.000399f, +0.000334f, -0.000788f, +0.001370f, -0.000795f, -0.000890f, -0.000456f, -0.003142f, +0.000574f, +0.004479f, + +0.001597f, -0.001559f, -0.001497f, -0.002370f, +0.000681f, -0.002327f + }, + { + +0.004315f, -0.003593f, +0.007086f, -0.004139f, +0.012875f, +0.001260f, -0.000384f, +0.006860f, -0.010194f, +0.003364f, + -0.003895f, -0.003753f, -0.016232f, -0.000209f, +0.029327f, +0.045639f, +0.020035f, +0.017104f, +0.007118f, +0.017873f, + +0.007094f, +0.010789f, +0.004296f, +0.005124f, +0.004778f, +0.023662f, +0.002094f, -0.001531f, +0.017594f, +0.004456f, + +0.003972f, +0.020889f, -0.007905f, -0.016448f, -0.019681f, -0.020432f, +0.004758f, +0.015187f, -0.002332f, +0.006942f, + +0.006983f, +0.003503f, -0.005987f, +0.004188f, +0.004378f, -0.012779f, +0.000154f, +0.000177f, -0.000175f, +0.004118f, + +0.006302f, -0.003440f, -0.002750f, -0.002841f, -0.004144f, -0.001670f, -0.001105f, -0.002227f, +0.003331f, +0.009704f, + -0.003906f, -0.002603f, -0.002223f, -0.004050f, -0.005236f, -0.008242f, -0.005941f, +0.004382f, -0.003673f, -0.003817f, + -0.003528f, -0.000893f, +0.005665f, -0.001945f, -0.000817f, +0.000619f, +0.001282f, -0.002809f, -0.001372f, -0.002300f, + +0.000228f, -0.000038f, -0.000543f, +0.001682f, -0.002020f, +0.000123f, -0.000730f, +0.002271f, +0.002489f, +0.000829f, + -0.002130f, +0.002242f, -0.003362f, +0.000797f, -0.001294f, +0.002319f + }, + { + -0.023060f, -0.122778f, -0.003658f, +0.004043f, +0.021641f, -0.021714f, -0.019827f, +0.003033f, -0.002853f, -0.011243f, + -0.004837f, -0.017218f, +0.005583f, +0.015588f, +0.012849f, -0.008587f, -0.002332f, +0.010585f, -0.021995f, -0.027485f, + +0.007490f, -0.000436f, +0.009306f, +0.010474f, -0.013108f, +0.003756f, -0.008722f, +0.004481f, +0.008492f, -0.001517f, + +0.005542f, +0.005258f, -0.011578f, +0.001564f, -0.003766f, +0.008997f, -0.009797f, +0.001366f, +0.000628f, +0.001215f, + +0.016146f, -0.002440f, -0.004230f, +0.009696f, +0.001427f, -0.010620f, +0.001210f, -0.002314f, +0.011901f, +0.013289f, + -0.011163f, +0.006613f, -0.004424f, -0.002653f, -0.003532f, -0.001195f, +0.003034f, +0.001091f, -0.000704f, +0.003586f, + -0.010644f, +0.004895f, -0.002328f, +0.003200f, +0.007617f, +0.003630f, +0.000569f, -0.003093f, -0.003847f, +0.000506f, + -0.000118f, +0.006462f, -0.003574f, +0.001957f, -0.000100f, +0.002388f, -0.003617f, -0.000125f, +0.000766f, +0.002502f, + +0.005492f, -0.002777f, -0.002179f, +0.007059f, +0.003771f, +0.000533f, +0.007002f, -0.001210f, -0.001277f, -0.001585f, + +0.000185f, +0.000482f, +0.000812f, +0.000760f, +0.000574f, +0.002492f + }, + { + +0.002730f, -0.045426f, +0.027223f, +0.000625f, -0.004263f, +0.000508f, +0.028685f, +0.010857f, -0.013706f, -0.003346f, + +0.013627f, -0.002506f, -0.014609f, +0.002832f, -0.014285f, +0.017416f, +0.009857f, +0.017946f, +0.003487f, +0.012109f, + -0.002910f, -0.003429f, +0.024092f, +0.009379f, +0.007098f, +0.003853f, -0.012713f, -0.004723f, +0.011585f, -0.012166f, + -0.021146f, +0.005960f, -0.002649f, -0.016218f, +0.008693f, +0.010637f, +0.010509f, +0.002188f, -0.011234f, -0.016261f, + +0.003073f, -0.006297f, -0.010503f, +0.013137f, -0.006218f, +0.009727f, -0.007467f, +0.000209f, +0.002858f, +0.006740f, + +0.000533f, +0.001080f, -0.002074f, +0.006010f, -0.000940f, +0.002156f, -0.005897f, +0.001508f, +0.002453f, +0.000030f, + +0.009826f, +0.001668f, +0.001051f, +0.005327f, +0.004656f, -0.000337f, -0.001164f, -0.000823f, +0.001685f, +0.000811f, + -0.002969f, +0.006136f, -0.001094f, -0.002878f, -0.001098f, +0.000569f, -0.002404f, +0.002521f, -0.003519f, +0.002052f, + +0.001786f, +0.000943f, -0.003972f, -0.001608f, -0.001398f, +0.000349f, -0.002756f, -0.000936f, -0.002258f, +0.000808f, + -0.000417f, -0.001639f, -0.002751f, -0.003322f, +0.000064f, -0.000342f + }, + { + -0.028984f, +0.067279f, -0.018550f, +0.011753f, -0.012647f, -0.070863f, +0.026448f, -0.009335f, +0.003459f, +0.023024f, + -0.030539f, +0.020289f, +0.005708f, -0.025197f, -0.014608f, +0.027326f, -0.017609f, -0.012807f, +0.004069f, -0.010551f, + +0.001230f, +0.005984f, +0.013208f, +0.009698f, +0.008716f, -0.001283f, +0.009299f, -0.014048f, +0.010480f, -0.001200f, + -0.010134f, +0.014473f, +0.000957f, -0.004057f, -0.007459f, -0.006380f, -0.015099f, -0.006952f, +0.004939f, -0.003102f, + +0.003155f, +0.008280f, +0.003322f, -0.000443f, -0.007872f, +0.000099f, -0.003257f, -0.006883f, +0.012705f, +0.008112f, + +0.002308f, -0.009768f, -0.004696f, +0.009371f, -0.004035f, -0.006826f, +0.003575f, +0.006441f, -0.008684f, +0.010180f, + -0.002904f, -0.003257f, -0.003290f, +0.000617f, +0.000857f, +0.001668f, -0.011810f, -0.004884f, +0.007974f, +0.005519f, + +0.000077f, -0.001580f, +0.002813f, +0.002054f, -0.009061f, +0.002312f, -0.003514f, -0.001937f, -0.000729f, +0.002301f, + -0.004338f, -0.001202f, +0.001349f, -0.001803f, +0.001711f, +0.002364f, -0.002039f, -0.002263f, -0.000164f, +0.001506f, + -0.000959f, +0.002780f, -0.000220f, -0.005298f, -0.000515f, +0.000422f + }, + { + -0.002348f, -0.038040f, +0.010007f, -0.006831f, -0.008456f, +0.004252f, -0.017809f, +0.001755f, +0.001207f, +0.016872f, + -0.012807f, +0.011479f, +0.015970f, -0.011429f, +0.005246f, +0.003601f, -0.011513f, -0.012206f, -0.011608f, +0.022473f, + -0.012761f, -0.018647f, +0.024576f, +0.008120f, +0.004606f, +0.019392f, -0.004615f, -0.012596f, +0.029425f, -0.007305f, + +0.008583f, -0.003155f, +0.017512f, +0.003335f, -0.000399f, +0.008729f, +0.002932f, -0.000747f, -0.012051f, -0.000798f, + -0.001144f, -0.000147f, +0.003093f, +0.008505f, -0.000923f, -0.003930f, -0.001932f, -0.010408f, -0.003310f, -0.006850f, + +0.002799f, -0.008170f, +0.003644f, +0.002045f, +0.011519f, -0.002112f, +0.010150f, -0.003876f, -0.004903f, +0.003084f, + -0.006756f, -0.001677f, +0.002063f, -0.002886f, -0.007429f, -0.000763f, +0.000195f, -0.001130f, +0.001515f, +0.003789f, + -0.005527f, +0.002104f, -0.003298f, +0.000656f, +0.000112f, +0.004441f, -0.000792f, -0.000121f, -0.002701f, +0.006384f, + -0.000860f, +0.001684f, +0.000664f, +0.004437f, -0.006384f, -0.000649f, -0.002074f, -0.000400f, +0.000095f, -0.001416f, + +0.000417f, -0.001370f, -0.003041f, +0.000686f, +0.000582f, +0.001959f + }, + { + -0.011120f, +0.068627f, -0.030774f, -0.003368f, -0.004594f, -0.008242f, -0.007113f, +0.007600f, -0.015450f, -0.010494f, + +0.013357f, +0.011958f, +0.018773f, +0.017009f, -0.027191f, -0.028492f, -0.001016f, -0.010909f, -0.017545f, -0.010879f, + -0.020150f, -0.002297f, +0.003542f, +0.006065f, +0.019569f, -0.009175f, -0.007221f, +0.032944f, +0.014189f, -0.008399f, + +0.006518f, -0.001154f, -0.014233f, +0.007792f, +0.010755f, +0.000962f, -0.018775f, -0.003900f, +0.001197f, +0.006332f, + -0.002707f, +0.012947f, -0.003634f, +0.014192f, -0.003059f, -0.003220f, -0.002200f, -0.005430f, -0.002115f, +0.005143f, + -0.009987f, -0.008735f, +0.013475f, -0.001586f, +0.003407f, +0.000495f, +0.007326f, -0.004444f, +0.002514f, +0.003257f, + +0.002211f, -0.004678f, +0.000874f, +0.001272f, -0.002588f, +0.000988f, -0.007867f, -0.002242f, -0.001323f, -0.000273f, + -0.005731f, -0.001439f, +0.000952f, -0.001769f, -0.000971f, -0.000617f, +0.002839f, -0.000955f, -0.001680f, -0.000825f, + -0.001094f, -0.004999f, -0.004169f, +0.006547f, +0.002455f, +0.003436f, -0.003374f, +0.002175f, +0.000066f, +0.000696f, + +0.000606f, -0.002774f, -0.003461f, +0.000275f, -0.001258f, -0.000460f + }, + { + +0.004722f, +0.029270f, -0.030274f, -0.011903f, +0.003145f, -0.005419f, +0.003038f, -0.002193f, +0.001786f, -0.004300f, + +0.009378f, -0.010483f, +0.004964f, -0.069765f, +0.058587f, -0.006573f, -0.007965f, +0.030001f, -0.045509f, -0.041033f, + -0.035611f, -0.001246f, -0.018635f, +0.010593f, +0.000435f, +0.007431f, -0.022454f, +0.013552f, +0.010501f, +0.011055f, + +0.000343f, +0.003378f, +0.019417f, -0.002569f, +0.007413f, -0.015618f, +0.031248f, +0.007625f, -0.004496f, -0.000849f, + -0.012340f, -0.008407f, +0.013103f, -0.007545f, +0.001730f, +0.006124f, +0.004827f, +0.016152f, -0.000981f, -0.013672f, + -0.003546f, -0.010616f, -0.006712f, +0.006994f, +0.002103f, -0.002356f, -0.004062f, +0.001408f, +0.006259f, +0.005692f, + -0.005273f, -0.002990f, -0.002638f, +0.007750f, -0.001984f, +0.004830f, -0.006326f, -0.000801f, -0.000590f, +0.003536f, + +0.002237f, -0.002212f, +0.003854f, -0.000090f, -0.002970f, +0.000071f, +0.000469f, +0.000647f, +0.000341f, -0.002387f, + +0.000346f, -0.003777f, -0.004358f, +0.000775f, -0.002356f, -0.001466f, +0.000237f, +0.001251f, -0.001240f, +0.003571f, + -0.002567f, -0.001409f, +0.000444f, +0.001462f, +0.000098f, -0.000106f + } + }, + { + { + -0.008865f, +0.244899f, -0.049692f, +0.063579f, -0.021602f, +0.005206f, -0.005581f, +0.004943f, -0.009407f, +0.013695f, + -0.019494f, +0.019068f, -0.003066f, -0.001770f, -0.008482f, +0.001646f, -0.010412f, -0.000840f, -0.006303f, -0.000474f, + +0.014068f, -0.002836f, +0.011600f, +0.003532f, +0.014892f, -0.006046f, +0.006510f, +0.001781f, +0.008245f, -0.004423f, + -0.008851f, -0.008824f, -0.011789f, +0.005488f, -0.013723f, +0.000496f, -0.006795f, +0.008000f, -0.004666f, -0.004498f, + +0.003652f, -0.004304f, +0.011119f, +0.008931f, +0.001523f, +0.009153f, +0.000446f, -0.000283f, +0.005607f, +0.005499f, + +0.004102f, -0.000115f, +0.005183f, -0.001881f, +0.001227f, -0.000301f, -0.001283f, -0.001591f, -0.004304f, +0.001925f, + -0.010903f, -0.001239f, -0.006346f, -0.005045f, -0.006542f, -0.007484f, -0.000270f, -0.004208f, +0.000406f, -0.001883f, + -0.002823f, +0.000144f, -0.001918f, -0.001493f, -0.004867f, +0.000094f, -0.003253f, +0.003030f, +0.001255f, +0.005033f, + +0.002272f, +0.002050f, -0.001012f, +0.001884f, -0.001992f, +0.001599f, +0.000318f, -0.000604f, +0.002673f, +0.001972f, + +0.000708f, -0.000077f, +0.000746f, +0.000334f, -0.001878f, -0.000704f + }, + { + -0.001106f, +0.087551f, +0.003829f, -0.074947f, +0.011659f, +0.004618f, -0.002588f, +0.000145f, -0.003179f, -0.006758f, + +0.002509f, +0.005781f, +0.004720f, -0.005636f, -0.002458f, -0.016903f, -0.002182f, -0.001731f, -0.013437f, -0.011109f, + +0.031999f, -0.002659f, -0.006964f, +0.026276f, +0.008665f, -0.001056f, -0.015372f, +0.005982f, +0.013728f, -0.012226f, + +0.000852f, +0.010863f, +0.006341f, +0.005264f, +0.012765f, +0.009651f, +0.001230f, +0.000169f, -0.004759f, +0.000929f, + +0.002384f, +0.004459f, -0.011531f, -0.009044f, -0.000931f, -0.005794f, +0.012075f, -0.010092f, -0.003961f, -0.006621f, + +0.004589f, +0.003402f, +0.011721f, +0.000521f, +0.006640f, -0.004517f, +0.000127f, -0.000159f, -0.006880f, -0.005945f, + +0.008743f, +0.004776f, -0.000935f, -0.007182f, -0.005141f, +0.007473f, -0.007041f, +0.002194f, -0.000143f, -0.004845f, + -0.000337f, -0.002156f, +0.003467f, +0.001737f, -0.001743f, -0.001353f, +0.001386f, -0.002201f, +0.003474f, +0.003263f, + -0.000675f, -0.000726f, -0.001392f, -0.003288f, +0.000199f, -0.000801f, -0.000169f, +0.001653f, -0.000004f, -0.001159f, + -0.003600f, +0.000571f, +0.000659f, +0.000083f, -0.000612f, -0.001577f + }, + { + +0.006197f, -0.165415f, +0.002718f, +0.085092f, +0.024886f, -0.004878f, -0.007454f, -0.012407f, -0.001721f, -0.012592f, + -0.008015f, +0.054494f, +0.000671f, -0.002485f, +0.010648f, -0.022391f, +0.025278f, +0.005082f, +0.037713f, +0.000016f, + -0.016064f, -0.015281f, -0.003606f, -0.003958f, +0.008740f, +0.009906f, -0.004453f, -0.000692f, -0.001504f, -0.009441f, + -0.002377f, +0.024917f, +0.000180f, -0.003269f, -0.012833f, +0.009794f, -0.010830f, -0.008409f, -0.017082f, +0.003227f, + +0.000740f, -0.004092f, -0.002443f, -0.002532f, -0.008332f, -0.003007f, +0.006182f, -0.012636f, -0.008044f, -0.005170f, + -0.006134f, -0.005220f, +0.009289f, -0.005176f, -0.000384f, -0.008561f, +0.006623f, +0.003085f, +0.009579f, +0.002205f, + +0.008114f, +0.010874f, +0.004108f, -0.001319f, +0.003684f, -0.000938f, -0.003568f, +0.004956f, +0.000874f, -0.000697f, + -0.003511f, +0.001775f, +0.001331f, +0.000998f, -0.002515f, +0.006535f, +0.000528f, +0.001465f, +0.001744f, +0.002095f, + -0.000615f, +0.002703f, -0.003963f, +0.000602f, +0.003509f, -0.001162f, +0.001057f, -0.001586f, +0.004668f, -0.000515f, + +0.001438f, -0.002254f, +0.000696f, +0.000302f, +0.001971f, +0.001911f + }, + { + +0.003307f, +0.091974f, +0.005310f, +0.084834f, -0.013994f, -0.004085f, +0.003099f, +0.004515f, +0.004707f, -0.020335f, + -0.011926f, -0.005130f, +0.010310f, -0.007455f, -0.026487f, -0.011139f, -0.003482f, -0.028047f, -0.016050f, +0.008699f, + +0.007348f, -0.007920f, +0.003105f, +0.004544f, +0.003503f, -0.002642f, +0.015765f, -0.024041f, +0.003263f, +0.012005f, + -0.006514f, -0.001546f, +0.011662f, +0.002426f, +0.002620f, +0.001153f, -0.001246f, -0.008901f, -0.001026f, -0.001534f, + +0.003480f, -0.005630f, -0.008538f, +0.007345f, -0.003573f, +0.001604f, -0.004722f, +0.005932f, -0.001338f, +0.000325f, + -0.005158f, -0.004355f, +0.000972f, +0.004379f, -0.003047f, +0.005112f, +0.003120f, +0.010335f, -0.012325f, -0.000622f, + +0.007778f, +0.001362f, -0.000802f, +0.002910f, +0.007039f, +0.003039f, -0.001105f, +0.002060f, -0.000936f, +0.000270f, + -0.000558f, -0.000617f, -0.002073f, -0.005086f, -0.000156f, +0.001523f, +0.000331f, +0.003570f, -0.004207f, +0.000575f, + +0.005247f, -0.001240f, +0.000098f, -0.002549f, +0.000932f, -0.001355f, +0.002312f, +0.002913f, -0.001368f, +0.000288f, + +0.001959f, +0.003401f, -0.001795f, +0.002474f, +0.001246f, -0.000440f + }, + { + +0.003789f, -0.035437f, -0.019203f, -0.013534f, +0.005066f, +0.000669f, -0.006915f, -0.002408f, -0.000772f, +0.007220f, + -0.001209f, -0.007082f, -0.001016f, -0.003520f, +0.056862f, -0.012211f, +0.008183f, -0.044019f, +0.008243f, -0.007892f, + -0.025029f, -0.012673f, -0.002626f, -0.005314f, -0.000739f, -0.025014f, +0.010264f, +0.019172f, +0.001059f, -0.002670f, + +0.012408f, +0.005353f, -0.010267f, +0.008886f, +0.004427f, -0.007622f, +0.007833f, -0.013455f, +0.012212f, +0.013549f, + -0.000229f, -0.013135f, -0.000258f, +0.002437f, -0.004123f, +0.006607f, +0.014103f, +0.002103f, +0.005428f, +0.005525f, + -0.008513f, +0.006894f, -0.003209f, +0.008126f, +0.000191f, -0.001196f, +0.003661f, +0.002632f, +0.002375f, +0.003846f, + +0.002206f, +0.000878f, +0.000394f, +0.004622f, +0.001164f, +0.000692f, -0.002202f, -0.007933f, +0.001625f, -0.004341f, + +0.002487f, -0.001490f, -0.004351f, -0.000730f, -0.001262f, -0.001424f, -0.002033f, -0.002331f, +0.001618f, +0.004347f, + -0.001511f, -0.002787f, -0.000372f, -0.001555f, +0.001249f, -0.001753f, +0.001421f, +0.001365f, -0.000665f, +0.000936f, + +0.000149f, +0.001690f, +0.003668f, -0.000193f, -0.000008f, -0.000511f + }, + { + +0.019858f, +0.091926f, -0.005284f, +0.082758f, +0.009552f, -0.002537f, -0.000778f, -0.002917f, +0.012909f, -0.007059f, + -0.003082f, -0.010489f, -0.014375f, +0.019932f, +0.003281f, -0.028909f, +0.002277f, +0.025518f, -0.000370f, -0.015436f, + -0.010048f, +0.010356f, +0.009106f, +0.008862f, +0.005763f, -0.004186f, +0.002444f, -0.015932f, +0.004681f, +0.008729f, + +0.006489f, +0.008900f, +0.000502f, +0.002478f, +0.000183f, +0.004957f, -0.000628f, -0.016111f, +0.004548f, +0.013094f, + +0.003629f, +0.004718f, +0.001801f, -0.006680f, -0.003544f, +0.009603f, +0.002570f, +0.003251f, +0.002338f, +0.000103f, + +0.002317f, -0.010657f, -0.005100f, -0.006316f, +0.002028f, -0.002586f, +0.005801f, -0.000382f, +0.000840f, +0.001100f, + +0.005505f, -0.005072f, +0.002421f, +0.005348f, -0.004847f, -0.001428f, +0.003883f, +0.005009f, -0.000687f, +0.000640f, + -0.002056f, +0.005057f, -0.001337f, -0.000715f, -0.001719f, +0.002132f, +0.000411f, +0.004103f, +0.002668f, +0.000125f, + -0.000600f, -0.000654f, -0.002446f, -0.002167f, -0.000992f, +0.000166f, -0.000468f, +0.001744f, +0.000933f, -0.001562f, + +0.004214f, +0.000302f, +0.001868f, +0.001599f, -0.000842f, -0.000874f + }, + { + +0.000109f, -0.002787f, +0.025230f, -0.003427f, -0.002603f, -0.003585f, +0.000083f, +0.003304f, +0.000460f, +0.005438f, + -0.011956f, -0.007893f, +0.003379f, -0.017615f, -0.009242f, -0.019339f, -0.026486f, +0.026168f, +0.010055f, +0.014283f, + +0.004983f, -0.029664f, -0.004925f, -0.027827f, +0.008058f, -0.002886f, +0.013562f, +0.018320f, -0.013486f, +0.015072f, + -0.016495f, -0.006916f, -0.014437f, -0.007531f, +0.008405f, -0.015034f, -0.004415f, +0.001263f, +0.005408f, +0.005333f, + +0.004801f, -0.004123f, -0.008403f, +0.010167f, -0.007135f, -0.003539f, +0.011190f, +0.002460f, +0.003047f, -0.001752f, + -0.003545f, -0.008665f, +0.005303f, +0.001840f, +0.001868f, -0.004981f, +0.004576f, +0.004096f, -0.007649f, +0.000434f, + +0.001350f, +0.007781f, +0.000941f, -0.003946f, -0.002507f, -0.002038f, +0.003860f, -0.001888f, +0.006016f, -0.002171f, + -0.001456f, +0.003671f, -0.003960f, -0.000406f, +0.004617f, -0.000556f, +0.005394f, +0.001616f, +0.002873f, +0.000282f, + +0.006268f, +0.002382f, -0.002052f, +0.000467f, +0.002628f, +0.001044f, -0.000498f, -0.000942f, -0.002908f, +0.000364f, + -0.004350f, -0.000110f, -0.002289f, +0.001289f, -0.001284f, +0.002269f + }, + { + -0.012075f, +0.192729f, -0.023901f, +0.026001f, -0.004646f, +0.007798f, -0.033365f, -0.021575f, -0.007075f, -0.023370f, + +0.035131f, +0.001586f, -0.012406f, +0.018810f, -0.004223f, -0.006290f, +0.003913f, +0.013464f, +0.003199f, +0.008669f, + +0.000498f, -0.011095f, +0.004614f, +0.009688f, -0.024086f, +0.009082f, -0.001264f, +0.002237f, +0.003846f, -0.001399f, + -0.008761f, -0.006105f, +0.009267f, -0.004811f, +0.004487f, +0.000093f, +0.002675f, -0.010049f, +0.006671f, -0.000924f, + -0.007286f, -0.008058f, -0.001703f, +0.008989f, -0.012628f, -0.000800f, -0.006824f, -0.003042f, -0.002315f, -0.003174f, + +0.000963f, +0.006328f, -0.003256f, +0.009399f, +0.009720f, -0.001889f, +0.008336f, +0.000987f, +0.002650f, +0.003297f, + +0.003253f, +0.000294f, -0.001697f, +0.001679f, -0.001338f, -0.005180f, -0.000451f, -0.002366f, -0.002421f, -0.005635f, + +0.005721f, +0.002655f, -0.000721f, +0.001454f, +0.002343f, +0.001357f, -0.000806f, -0.004363f, -0.000136f, +0.000720f, + +0.002858f, -0.000652f, +0.000542f, -0.000836f, -0.000268f, -0.000411f, -0.003076f, -0.001532f, +0.001641f, +0.003897f, + +0.001984f, -0.004935f, +0.000879f, -0.000486f, +0.001885f, -0.002308f + }, + { + -0.000265f, +0.039532f, -0.011796f, +0.010556f, +0.003545f, -0.003101f, +0.003601f, -0.000330f, +0.000520f, -0.000812f, + +0.001486f, -0.006583f, -0.018269f, -0.004382f, +0.032286f, +0.023785f, +0.029827f, +0.012079f, +0.004676f, +0.027088f, + +0.005794f, +0.000686f, +0.012758f, -0.001932f, +0.011212f, +0.018291f, +0.013470f, +0.000099f, +0.006168f, -0.010356f, + +0.008492f, +0.028967f, -0.008957f, -0.017425f, -0.005007f, -0.030775f, +0.005451f, +0.010819f, -0.003174f, +0.003459f, + +0.014413f, +0.011624f, -0.011293f, +0.004579f, -0.007122f, +0.007124f, -0.009636f, -0.003912f, +0.000820f, +0.010331f, + +0.004382f, -0.001024f, -0.009366f, +0.004989f, -0.004629f, -0.001661f, -0.000370f, -0.001108f, +0.008373f, -0.002829f, + -0.000183f, +0.002740f, -0.004814f, -0.006145f, -0.006070f, -0.009796f, -0.004581f, -0.000752f, -0.003268f, +0.000701f, + -0.002682f, -0.003321f, +0.006676f, -0.002979f, +0.002870f, +0.001967f, -0.000426f, -0.002695f, +0.001046f, -0.002416f, + -0.000191f, +0.001817f, -0.001853f, -0.000013f, +0.000297f, +0.001190f, -0.001356f, +0.003648f, +0.002210f, -0.001912f, + -0.000423f, +0.001554f, -0.002173f, -0.000330f, +0.000575f, +0.001359f + }, + { + +0.023857f, -0.180512f, +0.000256f, -0.007051f, -0.000617f, -0.017720f, -0.019749f, +0.051436f, -0.011394f, -0.039261f, + -0.002179f, +0.000279f, +0.010477f, +0.009571f, -0.003508f, +0.005095f, +0.004465f, -0.011720f, -0.021614f, -0.008442f, + +0.005973f, -0.008118f, +0.001638f, +0.029966f, -0.012736f, +0.001097f, -0.004343f, -0.001022f, +0.015524f, -0.008603f, + +0.010884f, -0.002403f, -0.010258f, -0.003245f, +0.008104f, -0.003299f, -0.002228f, -0.004221f, +0.003214f, -0.001816f, + +0.008003f, -0.001289f, -0.003672f, +0.006911f, +0.002215f, -0.005583f, +0.001850f, +0.001220f, +0.009943f, +0.001541f, + +0.005325f, -0.011947f, +0.002017f, +0.006056f, -0.000741f, -0.012998f, +0.006635f, +0.005812f, -0.008424f, +0.006699f, + -0.013674f, +0.009469f, -0.001270f, +0.004617f, -0.002210f, +0.014024f, +0.000210f, -0.000289f, -0.006225f, +0.000793f, + +0.001411f, +0.004865f, +0.001951f, +0.000602f, -0.004403f, +0.001820f, +0.000433f, -0.000761f, -0.000393f, -0.000268f, + +0.006433f, +0.000297f, -0.000510f, +0.003577f, +0.004039f, +0.004676f, +0.003916f, -0.001480f, +0.001036f, -0.002755f, + +0.000705f, +0.002082f, -0.000226f, +0.000542f, +0.001476f, -0.000402f + }, + { + -0.001917f, -0.068708f, +0.040468f, +0.003785f, -0.000774f, +0.044150f, -0.019992f, +0.000948f, +0.021056f, -0.002084f, + +0.008594f, +0.002914f, -0.037995f, -0.003190f, +0.016850f, +0.006472f, +0.008886f, +0.024521f, +0.011492f, +0.005631f, + -0.013594f, +0.003359f, +0.012222f, +0.014012f, +0.018104f, -0.008760f, -0.011398f, +0.001807f, +0.006258f, -0.009670f, + -0.012935f, -0.000140f, -0.004488f, -0.009087f, +0.020937f, -0.002432f, +0.011314f, -0.000942f, -0.008743f, -0.009447f, + +0.001926f, -0.006111f, -0.007633f, +0.002260f, +0.003407f, -0.002878f, +0.004892f, -0.012475f, +0.004789f, +0.010283f, + +0.002042f, -0.005016f, +0.001511f, +0.002049f, +0.001697f, -0.008166f, +0.005742f, +0.000360f, -0.003351f, +0.001366f, + +0.000687f, +0.009339f, +0.004099f, +0.004330f, +0.004824f, -0.003457f, -0.003627f, +0.006056f, -0.000121f, -0.001152f, + +0.001187f, +0.001362f, -0.000797f, -0.003367f, -0.000719f, -0.000997f, -0.000773f, +0.000313f, -0.004088f, +0.004140f, + +0.001524f, -0.000450f, -0.000040f, -0.003010f, -0.000235f, -0.000549f, -0.003799f, -0.003270f, +0.000732f, +0.001370f, + -0.002255f, +0.001367f, -0.006053f, -0.000135f, -0.000784f, -0.000350f + }, + { + +0.038038f, -0.067275f, +0.051336f, -0.006194f, -0.033705f, +0.017388f, -0.032276f, -0.010037f, +0.000148f, +0.045453f, + -0.022368f, +0.003181f, -0.015614f, +0.013562f, -0.018059f, +0.010653f, +0.018542f, -0.030003f, +0.000670f, -0.013268f, + +0.024996f, -0.006258f, +0.019409f, +0.006954f, +0.001548f, +0.007442f, +0.008393f, -0.006646f, -0.001693f, +0.023356f, + -0.019733f, -0.003479f, +0.008659f, +0.003415f, -0.017589f, -0.003705f, -0.014364f, -0.001107f, +0.001614f, -0.009960f, + +0.006705f, +0.012908f, -0.001562f, -0.002870f, -0.002384f, -0.006597f, -0.013329f, -0.000572f, +0.012533f, +0.001885f, + +0.010778f, +0.001273f, -0.016598f, +0.007118f, -0.002158f, +0.000013f, +0.000833f, +0.006420f, -0.003219f, +0.002590f, + +0.001973f, -0.001210f, -0.009562f, +0.000871f, +0.007102f, +0.000711f, -0.011504f, -0.002109f, +0.003693f, +0.005579f, + +0.002803f, -0.002850f, +0.000587f, +0.001846f, -0.004101f, -0.001678f, -0.000375f, -0.001395f, -0.003619f, +0.002510f, + -0.002687f, -0.000307f, +0.005036f, -0.004068f, +0.000937f, +0.005238f, -0.004839f, -0.003296f, +0.001980f, +0.000379f, + +0.001717f, -0.000740f, +0.000772f, -0.003397f, -0.002599f, +0.000360f + }, + { + +0.003528f, -0.050568f, +0.019947f, -0.012200f, -0.005321f, -0.000349f, -0.017194f, -0.002359f, +0.001321f, +0.014310f, + +0.007980f, -0.002926f, -0.016663f, +0.026225f, -0.020883f, +0.012060f, -0.010325f, -0.016600f, -0.010244f, +0.019686f, + +0.002480f, +0.000860f, -0.012499f, +0.019190f, +0.012112f, +0.017277f, +0.010981f, -0.013304f, +0.018391f, +0.011562f, + -0.013036f, +0.010915f, -0.001502f, +0.005236f, +0.001283f, +0.007319f, +0.007134f, +0.009545f, -0.018123f, -0.000899f, + +0.001102f, +0.001349f, +0.001702f, +0.004662f, +0.002278f, -0.005797f, -0.007353f, +0.003054f, -0.013967f, -0.004637f, + -0.001672f, -0.000086f, +0.002187f, +0.002024f, +0.006128f, +0.001534f, +0.003833f, -0.002967f, -0.001860f, -0.002699f, + -0.000535f, -0.001635f, -0.005545f, +0.001465f, -0.000493f, -0.007513f, +0.002455f, +0.002466f, +0.003332f, -0.005722f, + -0.000424f, +0.000386f, +0.001730f, -0.004167f, +0.001051f, +0.002397f, +0.000243f, -0.000461f, +0.000933f, +0.003881f, + +0.000119f, -0.002221f, +0.003136f, +0.000697f, -0.005555f, -0.002414f, -0.000258f, -0.003060f, -0.000085f, +0.000081f, + -0.004142f, +0.001024f, -0.001024f, +0.001342f, +0.002303f, -0.002600f + }, + { + +0.028306f, +0.013410f, -0.036467f, -0.008319f, +0.003617f, +0.014364f, -0.017728f, +0.002467f, -0.024988f, +0.012224f, + -0.001979f, +0.011134f, +0.022657f, -0.010126f, +0.024401f, -0.010342f, -0.018144f, -0.013122f, -0.004863f, -0.004053f, + -0.013385f, -0.012939f, -0.001323f, +0.014760f, -0.004124f, -0.008877f, +0.012700f, +0.011135f, +0.016208f, +0.014697f, + +0.000529f, -0.012094f, -0.014772f, +0.011717f, +0.023587f, -0.021398f, -0.010980f, +0.009519f, +0.004818f, -0.005373f, + +0.011356f, +0.003029f, +0.004574f, +0.001435f, +0.008686f, +0.001948f, -0.009390f, -0.015808f, +0.008467f, +0.001362f, + -0.000972f, -0.017454f, +0.005226f, +0.003403f, +0.005760f, +0.008533f, -0.006279f, +0.005042f, -0.007032f, +0.005808f, + -0.001360f, -0.000852f, +0.000732f, -0.000751f, +0.001596f, -0.004574f, -0.003915f, -0.003725f, +0.002811f, -0.002870f, + -0.004284f, -0.004885f, +0.001225f, +0.003766f, -0.002185f, -0.002742f, -0.001212f, +0.000128f, -0.001557f, -0.001107f, + +0.000895f, -0.003693f, -0.002333f, -0.000183f, +0.004300f, +0.003026f, -0.001576f, +0.001217f, -0.000473f, +0.002275f, + -0.002210f, -0.000627f, -0.002175f, -0.001232f, +0.000236f, +0.001091f + }, + { + -0.006488f, +0.022740f, -0.011415f, -0.020696f, +0.015480f, -0.002989f, -0.005051f, +0.003084f, -0.005158f, +0.006667f, + -0.011805f, +0.001328f, +0.000553f, +0.023417f, -0.093959f, +0.025472f, -0.011846f, +0.016372f, -0.040513f, -0.042545f, + -0.015631f, -0.019237f, -0.005051f, +0.000013f, +0.006025f, +0.006128f, -0.024206f, +0.013118f, +0.009600f, +0.022241f, + -0.010659f, +0.016112f, +0.009911f, +0.007385f, -0.007568f, -0.014220f, +0.027811f, +0.008324f, -0.007397f, -0.001148f, + -0.010347f, -0.002848f, +0.001598f, -0.003155f, +0.003260f, +0.003706f, +0.000150f, +0.017229f, +0.000183f, -0.003196f, + -0.016902f, -0.006696f, +0.005595f, +0.002864f, -0.000676f, -0.007327f, +0.003432f, +0.001445f, +0.001510f, +0.004755f, + -0.001156f, -0.009162f, +0.001593f, +0.009489f, -0.000205f, +0.003962f, -0.004737f, +0.000656f, -0.004796f, +0.001674f, + +0.003265f, -0.000854f, +0.005685f, +0.001415f, -0.003385f, -0.002631f, -0.000386f, +0.001789f, -0.000629f, -0.001714f, + +0.001629f, -0.004177f, -0.003444f, +0.000228f, -0.000692f, +0.000057f, -0.003676f, +0.004628f, -0.001492f, +0.000228f, + -0.000573f, -0.000791f, -0.000214f, +0.003196f, -0.002381f, -0.001146f + } + }, + { + { + +0.015788f, +0.362477f, +0.033647f, +0.125250f, +0.017881f, +0.016180f, +0.001045f, +0.005997f, -0.014545f, +0.012537f, + -0.012789f, +0.030971f, +0.010732f, +0.010172f, -0.004875f, +0.006045f, +0.011707f, +0.008767f, -0.009154f, -0.007478f, + +0.008401f, +0.002425f, +0.018254f, -0.000391f, +0.017201f, -0.011760f, +0.006390f, +0.016664f, +0.013061f, -0.020738f, + -0.016699f, -0.003474f, -0.010001f, +0.011949f, -0.004507f, +0.004162f, -0.017997f, -0.003002f, -0.002556f, -0.004363f, + +0.013470f, +0.012003f, +0.005157f, -0.009290f, -0.008675f, +0.010960f, +0.001566f, +0.001177f, +0.005210f, +0.000910f, + +0.001217f, +0.000373f, +0.002918f, -0.004318f, +0.006066f, +0.005351f, +0.002930f, +0.004472f, +0.001240f, +0.001172f, + -0.012413f, +0.003706f, -0.000794f, +0.000843f, -0.001280f, -0.002985f, +0.002193f, -0.001528f, -0.001391f, -0.002786f, + -0.005978f, -0.005303f, -0.002510f, -0.002089f, -0.003943f, +0.000805f, -0.006156f, +0.000531f, -0.000805f, +0.000346f, + -0.001525f, +0.000884f, -0.000566f, +0.001214f, -0.000863f, +0.001651f, +0.000266f, +0.000209f, +0.000105f, -0.000123f, + -0.000258f, -0.000229f, +0.001372f, -0.000037f, -0.000789f, +0.001763f + }, + { + +0.002643f, +0.062929f, -0.019797f, -0.041152f, +0.037950f, +0.002824f, -0.006194f, +0.009986f, -0.000916f, -0.007269f, + -0.000531f, +0.003651f, +0.008367f, +0.007140f, +0.000587f, +0.005287f, +0.024009f, -0.007669f, -0.006982f, -0.000447f, + +0.008338f, -0.012895f, +0.011504f, +0.028998f, +0.007893f, +0.001099f, -0.015766f, -0.006728f, +0.003068f, +0.001468f, + +0.014143f, +0.008405f, -0.008205f, +0.004460f, +0.021210f, -0.001656f, -0.010949f, -0.003229f, -0.006679f, +0.006038f, + +0.000391f, -0.003012f, -0.007873f, -0.004454f, -0.003049f, -0.008713f, +0.014735f, -0.003928f, +0.002135f, -0.011164f, + -0.000876f, -0.001071f, -0.001355f, -0.009998f, +0.008347f, -0.006680f, -0.003496f, +0.000222f, -0.002499f, -0.010356f, + -0.001395f, +0.001653f, +0.001388f, -0.002135f, -0.000208f, +0.009092f, -0.005528f, +0.003240f, +0.005784f, -0.002832f, + -0.004297f, -0.004756f, +0.003095f, -0.000513f, -0.004776f, -0.000770f, +0.001795f, -0.005437f, -0.000640f, +0.000849f, + -0.001534f, -0.000786f, +0.000635f, -0.001110f, +0.001493f, -0.001488f, +0.001027f, +0.005935f, -0.001469f, -0.002309f, + -0.001870f, +0.000219f, -0.000227f, -0.002006f, -0.001298f, -0.000812f + }, + { + -0.009370f, -0.149478f, +0.029580f, +0.005053f, -0.031783f, +0.000764f, +0.005599f, -0.003482f, +0.010977f, -0.001488f, + -0.003597f, +0.061107f, -0.023270f, -0.016975f, +0.007054f, -0.029208f, +0.021053f, -0.002311f, +0.024663f, -0.005724f, + +0.000521f, -0.002674f, -0.003166f, -0.013705f, -0.001959f, +0.010725f, +0.003336f, +0.010916f, +0.004822f, -0.002670f, + -0.003198f, +0.006359f, -0.003468f, -0.009318f, -0.004115f, +0.017528f, -0.016077f, -0.001128f, -0.015018f, +0.004417f, + +0.006845f, -0.004447f, -0.001782f, +0.005332f, -0.005617f, -0.002385f, +0.010193f, -0.000847f, +0.006911f, +0.006732f, + +0.003131f, -0.004557f, +0.009294f, -0.008235f, -0.000032f, -0.007574f, +0.005156f, -0.000570f, +0.005652f, +0.001061f, + +0.006178f, +0.002956f, -0.003756f, +0.003936f, +0.009819f, -0.001421f, -0.005742f, +0.004283f, +0.001722f, +0.001292f, + -0.002658f, -0.002176f, -0.001853f, +0.004417f, +0.000305f, +0.003821f, -0.004175f, -0.001381f, -0.000841f, -0.001062f, + -0.002489f, +0.002844f, +0.000627f, +0.002576f, +0.002861f, -0.000472f, +0.000844f, -0.002831f, +0.001553f, -0.004171f, + +0.000881f, -0.000878f, +0.000065f, +0.000354f, +0.001483f, +0.002051f + }, + { + -0.019603f, +0.046388f, -0.016120f, +0.099811f, +0.007511f, -0.005312f, +0.002207f, +0.004687f, +0.013456f, +0.000941f, + -0.027718f, -0.019717f, +0.014011f, -0.003833f, -0.011282f, +0.025359f, +0.022935f, +0.003020f, +0.022965f, +0.015184f, + +0.006282f, +0.009028f, +0.004023f, +0.003474f, +0.017437f, -0.006042f, -0.004570f, -0.024191f, -0.001516f, +0.000607f, + -0.003311f, +0.005048f, +0.001291f, -0.002324f, +0.015572f, +0.009521f, +0.003614f, +0.003296f, +0.015481f, +0.009278f, + +0.009728f, +0.001449f, -0.007151f, +0.002132f, -0.003088f, +0.000640f, -0.013886f, -0.003164f, -0.004725f, +0.001211f, + -0.004394f, -0.000363f, +0.000246f, +0.006634f, -0.000428f, +0.003589f, +0.001632f, +0.006495f, -0.012906f, -0.001892f, + +0.000948f, -0.001994f, -0.006097f, -0.003529f, +0.001270f, +0.004732f, -0.005055f, +0.000062f, +0.000250f, -0.000120f, + -0.002703f, +0.001329f, +0.000994f, -0.004958f, +0.001383f, +0.000487f, -0.002802f, +0.003568f, -0.001857f, +0.001964f, + +0.000337f, -0.004264f, +0.001783f, -0.002558f, -0.000195f, -0.002721f, -0.000679f, +0.000856f, -0.001535f, -0.001766f, + +0.000081f, +0.003185f, -0.002580f, -0.002261f, -0.002599f, -0.001382f + }, + { + -0.003641f, -0.005784f, +0.016461f, -0.016614f, +0.001901f, +0.001870f, -0.003531f, +0.004507f, -0.000669f, +0.004173f, + +0.003935f, +0.009435f, +0.001751f, -0.011363f, +0.085084f, -0.004414f, +0.000636f, -0.059453f, -0.014961f, -0.000999f, + -0.008466f, -0.002509f, +0.002563f, +0.004196f, +0.007894f, -0.012201f, +0.027518f, +0.017545f, +0.013210f, +0.020577f, + +0.013451f, -0.003514f, -0.008650f, +0.002787f, -0.009457f, -0.017786f, +0.007915f, -0.013340f, +0.006278f, -0.001210f, + -0.006138f, -0.012162f, +0.000285f, +0.003664f, -0.009574f, -0.001457f, +0.010472f, -0.002847f, -0.003777f, -0.001124f, + -0.005473f, +0.012584f, -0.001864f, +0.004481f, -0.001290f, -0.000574f, +0.000798f, +0.007218f, +0.009241f, +0.003753f, + +0.000889f, +0.002803f, -0.001397f, -0.002240f, -0.004627f, +0.000722f, -0.002446f, -0.008184f, +0.000886f, -0.003347f, + +0.006489f, +0.005254f, -0.002379f, -0.001564f, +0.000450f, +0.000547f, +0.001303f, -0.002555f, -0.002817f, -0.001013f, + -0.003162f, -0.002667f, +0.000595f, -0.000167f, +0.002915f, -0.002163f, +0.000541f, +0.001779f, -0.000668f, +0.001119f, + +0.001388f, +0.000431f, +0.000865f, -0.000416f, +0.001746f, -0.000832f + }, + { + -0.041554f, +0.018631f, +0.016345f, +0.089053f, -0.002506f, +0.000403f, +0.019938f, +0.016218f, +0.032021f, -0.010967f, + -0.005318f, -0.001056f, -0.017984f, +0.000679f, +0.005731f, -0.007857f, +0.004730f, +0.018059f, -0.004415f, -0.013813f, + -0.007463f, +0.000693f, -0.006153f, -0.002955f, +0.003423f, +0.006060f, +0.003301f, -0.011530f, +0.019281f, +0.013509f, + +0.004713f, +0.008855f, +0.000144f, -0.001560f, -0.007709f, +0.001748f, +0.012463f, -0.007447f, -0.001801f, +0.001763f, + -0.007514f, -0.001526f, +0.004466f, +0.000196f, +0.005250f, +0.016162f, +0.000656f, +0.005379f, +0.008163f, -0.004754f, + +0.000063f, -0.000608f, +0.000527f, -0.008512f, -0.002040f, -0.000531f, +0.007657f, +0.001081f, -0.000919f, +0.000517f, + +0.002901f, -0.007666f, -0.001685f, -0.000422f, -0.003174f, -0.002776f, -0.005826f, -0.000552f, -0.003140f, -0.000362f, + -0.002686f, +0.002863f, -0.000519f, +0.002046f, -0.000334f, +0.002247f, -0.002850f, +0.000683f, +0.002034f, +0.001154f, + +0.001053f, +0.001723f, +0.000124f, -0.000771f, -0.002150f, -0.000490f, -0.001023f, +0.000262f, +0.001964f, -0.000137f, + +0.002064f, -0.001439f, +0.001401f, +0.000660f, -0.000919f, -0.000942f + }, + { + -0.000665f, -0.033220f, +0.004995f, -0.000343f, +0.000824f, -0.005825f, +0.001932f, +0.010091f, +0.007603f, +0.004018f, + -0.012219f, +0.003882f, +0.011526f, -0.001234f, +0.010898f, -0.014338f, -0.030235f, +0.007512f, -0.012059f, -0.002315f, + +0.011281f, -0.027528f, -0.017940f, -0.016482f, +0.037514f, +0.005215f, +0.003308f, +0.015405f, -0.000523f, +0.015246f, + -0.015064f, +0.004602f, +0.002206f, +0.005482f, +0.013720f, -0.001163f, -0.002232f, +0.003672f, +0.008480f, +0.002966f, + -0.004844f, -0.004694f, -0.008751f, +0.008911f, -0.003663f, -0.003301f, +0.001690f, +0.002862f, +0.004721f, +0.001937f, + +0.008226f, -0.008592f, +0.003709f, +0.009044f, +0.007057f, -0.004488f, -0.001290f, +0.004353f, -0.004144f, +0.002130f, + +0.002667f, +0.007407f, +0.002674f, +0.003820f, +0.004512f, +0.000719f, +0.003021f, -0.002314f, +0.008706f, -0.000741f, + -0.000881f, -0.000241f, -0.007904f, -0.003633f, +0.001126f, -0.003022f, +0.001991f, -0.002279f, +0.000899f, +0.000025f, + +0.002132f, -0.000922f, -0.002087f, +0.000720f, -0.000608f, -0.000380f, -0.000123f, +0.001180f, +0.000721f, +0.001017f, + -0.002891f, +0.002776f, -0.002727f, +0.001400f, -0.001051f, +0.000857f + }, + { + -0.021237f, +0.189472f, +0.009839f, -0.001508f, -0.037097f, +0.018405f, -0.021426f, -0.015395f, +0.001836f, -0.013287f, + +0.052592f, +0.015325f, -0.007563f, +0.021238f, -0.002190f, +0.013929f, +0.015741f, +0.013041f, +0.003897f, +0.003595f, + -0.005530f, -0.026733f, -0.003575f, +0.022183f, -0.007370f, +0.013992f, +0.004695f, +0.003070f, +0.002543f, +0.003974f, + -0.006770f, -0.008230f, -0.000629f, -0.006382f, +0.012092f, -0.007338f, +0.004708f, -0.009804f, +0.005314f, +0.005157f, + +0.001915f, +0.001862f, -0.002040f, +0.003641f, -0.010287f, +0.000691f, -0.001495f, +0.000494f, -0.012753f, -0.002441f, + +0.004879f, +0.007503f, -0.007317f, -0.001288f, +0.006067f, -0.003744f, +0.004802f, -0.001646f, +0.000569f, +0.006245f, + +0.010997f, +0.004300f, -0.007015f, +0.002621f, +0.003078f, -0.004301f, -0.003017f, -0.002702f, -0.001545f, -0.005939f, + +0.000881f, -0.000514f, -0.001065f, -0.002669f, +0.000062f, +0.003912f, +0.001183f, -0.006348f, +0.000277f, +0.001457f, + +0.001543f, -0.000986f, +0.002947f, +0.001191f, -0.001431f, -0.003074f, -0.003932f, +0.000681f, +0.003182f, +0.000538f, + -0.000288f, -0.002175f, +0.004203f, +0.002131f, +0.002418f, -0.003067f + }, + { + -0.003498f, +0.015264f, -0.019916f, +0.012872f, +0.000284f, -0.005275f, +0.004532f, +0.007028f, +0.008458f, -0.005796f, + +0.009890f, +0.003841f, -0.014300f, -0.020864f, -0.011557f, -0.011913f, -0.003861f, +0.007796f, +0.013178f, +0.010769f, + -0.000437f, +0.013623f, -0.000399f, -0.015496f, +0.009233f, -0.008492f, -0.008324f, -0.003213f, +0.001300f, -0.032070f, + +0.008609f, +0.004362f, -0.031975f, -0.000599f, +0.019182f, -0.016592f, +0.005920f, +0.005591f, +0.003670f, +0.004128f, + +0.001397f, +0.002906f, -0.018359f, +0.002151f, -0.007344f, +0.003364f, -0.008559f, -0.002398f, +0.001209f, +0.009287f, + +0.005392f, +0.003287f, -0.008119f, +0.006062f, -0.003000f, +0.004786f, +0.005598f, -0.001965f, +0.004891f, -0.004947f, + +0.004173f, +0.001545f, -0.005020f, -0.001823f, +0.001297f, -0.002685f, -0.001607f, +0.001526f, -0.004900f, +0.000558f, + +0.000491f, -0.001829f, +0.006466f, -0.002998f, +0.006458f, +0.005609f, +0.002603f, +0.001529f, +0.003005f, +0.001125f, + +0.000410f, +0.000699f, -0.001184f, -0.001252f, -0.000078f, +0.000427f, -0.004338f, +0.001130f, +0.001160f, -0.001561f, + -0.000439f, +0.000339f, -0.000544f, +0.002320f, +0.002825f, +0.000911f + }, + { + -0.022271f, -0.227167f, +0.022093f, -0.002490f, -0.035133f, +0.006775f, +0.041374f, +0.070814f, -0.013203f, -0.066874f, + +0.004643f, +0.014847f, +0.006007f, +0.019511f, -0.006957f, -0.002036f, -0.004224f, -0.017389f, -0.016500f, -0.001581f, + +0.012662f, +0.005984f, +0.010292f, +0.026930f, -0.014424f, -0.017920f, -0.011844f, -0.016513f, -0.000712f, -0.015405f, + +0.004120f, -0.009363f, -0.008534f, -0.012963f, -0.002917f, -0.012651f, -0.002921f, -0.006134f, -0.000161f, -0.003998f, + -0.005826f, -0.013243f, -0.007333f, +0.006830f, +0.006715f, -0.004539f, +0.003845f, +0.003790f, +0.003006f, -0.014263f, + +0.002049f, -0.008284f, +0.000993f, -0.001161f, +0.002471f, -0.000755f, +0.012687f, +0.000727f, -0.007535f, +0.014558f, + -0.009533f, +0.003299f, -0.003570f, -0.000074f, -0.004309f, +0.015446f, +0.002800f, +0.005412f, -0.002937f, +0.004622f, + +0.003835f, +0.006106f, +0.002906f, -0.004685f, -0.009329f, -0.000706f, -0.000044f, -0.002350f, -0.002735f, -0.002826f, + +0.004024f, +0.003202f, -0.001858f, -0.004144f, -0.000142f, +0.000780f, +0.000257f, +0.000151f, -0.000807f, -0.004811f, + +0.000527f, -0.000122f, -0.000671f, +0.000455f, +0.001426f, -0.001722f + }, + { + +0.001579f, -0.086316f, +0.016375f, +0.003078f, -0.012702f, +0.022367f, -0.035211f, +0.005767f, +0.019461f, -0.011175f, + +0.004602f, +0.022319f, -0.019470f, -0.017268f, +0.007473f, -0.002310f, -0.003830f, +0.020017f, +0.006879f, +0.022534f, + +0.009412f, +0.005607f, -0.001046f, -0.006356f, +0.008032f, -0.005021f, +0.000669f, +0.021516f, +0.011152f, -0.009263f, + +0.008718f, -0.003343f, +0.004207f, +0.003872f, +0.021145f, -0.007482f, +0.003388f, +0.006917f, +0.009119f, +0.002849f, + +0.008262f, +0.005696f, +0.001396f, -0.005510f, -0.007171f, -0.012222f, +0.003498f, -0.004378f, +0.009273f, -0.002962f, + -0.009419f, -0.007897f, +0.002372f, +0.000052f, +0.000561f, -0.000954f, +0.007269f, -0.005746f, -0.003650f, +0.000275f, + -0.004995f, +0.000785f, -0.001508f, -0.000657f, -0.001745f, -0.005000f, -0.006104f, +0.001150f, -0.005568f, -0.002971f, + +0.006101f, +0.002415f, -0.001097f, -0.002827f, -0.004567f, -0.001298f, +0.005660f, +0.004282f, -0.004526f, +0.003444f, + -0.000968f, -0.003514f, +0.000278f, -0.000439f, +0.000512f, +0.000645f, +0.000912f, +0.001604f, +0.004663f, +0.003431f, + -0.001697f, +0.002127f, -0.004592f, +0.001397f, -0.001195f, +0.000490f + }, + { + -0.023096f, -0.146563f, +0.063091f, +0.001790f, -0.026357f, +0.073703f, +0.008709f, -0.003218f, +0.000538f, +0.025387f, + -0.007609f, +0.022346f, +0.006749f, +0.021212f, -0.025727f, +0.015181f, +0.021513f, -0.030564f, +0.024620f, -0.009756f, + +0.016774f, -0.009139f, +0.009533f, -0.007774f, -0.020144f, +0.007128f, +0.016423f, +0.005791f, +0.000463f, +0.017129f, + -0.012257f, -0.008389f, +0.002242f, +0.009580f, -0.010940f, +0.000836f, +0.001079f, +0.008290f, -0.010207f, -0.014556f, + +0.004774f, -0.001216f, -0.009410f, -0.002309f, +0.003459f, -0.002323f, -0.009805f, -0.008846f, +0.001174f, -0.002718f, + +0.009883f, +0.004534f, -0.018236f, +0.005434f, +0.003565f, +0.007540f, +0.000887f, +0.003951f, -0.000819f, +0.001845f, + +0.006976f, +0.008140f, -0.001932f, +0.002125f, +0.003884f, +0.001586f, -0.002254f, +0.004067f, +0.003897f, +0.001441f, + +0.001960f, -0.006183f, -0.003775f, +0.001944f, -0.002520f, -0.001375f, +0.003388f, +0.003776f, -0.002846f, +0.002289f, + -0.000869f, +0.002327f, +0.006236f, -0.002659f, +0.000073f, +0.003823f, -0.001964f, +0.000926f, +0.001115f, -0.001041f, + +0.002268f, -0.002214f, +0.000788f, -0.000940f, -0.002525f, -0.002843f + }, + { + -0.003534f, -0.050458f, +0.023287f, -0.007620f, +0.008842f, +0.007911f, -0.019019f, -0.011786f, -0.008942f, +0.013440f, + +0.007920f, -0.013876f, -0.038290f, +0.000769f, -0.035745f, +0.002042f, -0.007168f, -0.016541f, -0.035389f, +0.019008f, + +0.019125f, +0.005892f, -0.052891f, +0.006157f, +0.019071f, +0.024503f, +0.022360f, -0.017099f, +0.016959f, +0.010693f, + -0.013758f, +0.010477f, -0.017472f, -0.004230f, -0.003990f, +0.011564f, +0.012596f, +0.006080f, -0.008400f, +0.000453f, + +0.000822f, -0.005288f, -0.006471f, -0.004108f, -0.002699f, -0.006992f, -0.009371f, +0.001108f, -0.012385f, +0.000807f, + -0.000629f, -0.004528f, -0.010901f, -0.006428f, +0.004335f, -0.003780f, -0.000635f, +0.005743f, +0.002571f, -0.001102f, + +0.005414f, +0.006815f, -0.001318f, +0.002815f, +0.005811f, -0.006619f, -0.004182f, -0.000518f, -0.004911f, -0.007419f, + +0.005027f, +0.001443f, +0.004786f, -0.002839f, -0.002121f, -0.002224f, -0.004205f, -0.000327f, +0.000215f, -0.002215f, + +0.002143f, +0.000111f, +0.000530f, -0.003980f, -0.007171f, -0.004369f, -0.003252f, -0.004942f, -0.001773f, -0.001133f, + -0.004797f, -0.000644f, -0.000686f, +0.003577f, +0.001638f, -0.002419f + }, + { + -0.034670f, -0.051502f, +0.001925f, +0.025550f, +0.022154f, +0.033281f, +0.004676f, +0.015064f, -0.014768f, +0.016221f, + +0.018187f, +0.003006f, +0.013222f, +0.020668f, +0.083602f, +0.023443f, -0.003919f, +0.008500f, +0.024902f, +0.012746f, + +0.020091f, -0.003076f, -0.023919f, -0.006743f, -0.004203f, -0.002684f, -0.000981f, -0.013039f, -0.002779f, +0.018821f, + -0.009489f, -0.025578f, -0.003158f, +0.016799f, +0.023877f, -0.015447f, -0.005792f, +0.002325f, +0.009619f, +0.002686f, + +0.006782f, -0.011538f, -0.010209f, -0.004340f, +0.011623f, +0.003711f, +0.000514f, -0.007125f, +0.009826f, -0.008048f, + +0.003705f, -0.011133f, -0.003914f, +0.001743f, +0.002362f, +0.008987f, -0.008878f, -0.003840f, -0.007609f, +0.004384f, + -0.002787f, +0.001762f, +0.004565f, +0.005716f, +0.006801f, +0.001843f, +0.003580f, +0.001011f, +0.004601f, -0.002008f, + -0.003792f, -0.009238f, -0.000525f, +0.004149f, -0.002167f, -0.002459f, -0.002643f, -0.000070f, +0.001555f, +0.003127f, + +0.002999f, -0.002371f, -0.000757f, -0.005149f, +0.000473f, +0.001321f, -0.002622f, -0.000918f, -0.000926f, +0.003309f, + -0.003004f, +0.000347f, +0.000334f, +0.000646f, +0.001566f, +0.001635f + }, + { + +0.008771f, +0.044326f, -0.005755f, -0.022582f, +0.017829f, +0.014536f, +0.001556f, -0.005426f, -0.007282f, +0.011685f, + -0.013638f, +0.010240f, +0.010744f, +0.025981f, -0.078981f, +0.002966f, -0.034083f, +0.015655f, -0.000801f, +0.002844f, + +0.018451f, +0.003084f, -0.000927f, +0.001394f, -0.002059f, +0.014711f, +0.003069f, +0.021660f, -0.014215f, -0.012159f, + -0.026347f, +0.006099f, +0.010175f, +0.002838f, -0.003225f, -0.008008f, +0.010099f, -0.005917f, -0.014361f, -0.005720f, + -0.024105f, -0.012706f, +0.000362f, +0.001248f, +0.000871f, -0.004943f, +0.003313f, +0.007548f, -0.009672f, -0.000397f, + -0.014058f, +0.001481f, +0.005163f, +0.001743f, +0.003649f, -0.008261f, -0.000360f, -0.002282f, -0.003871f, -0.004124f, + -0.002753f, -0.003657f, +0.002484f, +0.009657f, -0.003651f, -0.002887f, -0.001413f, +0.001494f, -0.009892f, +0.000219f, + +0.003040f, -0.001460f, +0.000950f, +0.000295f, -0.002264f, -0.004407f, -0.002780f, +0.000755f, -0.001513f, -0.001763f, + +0.003163f, +0.002106f, +0.001733f, -0.000535f, -0.002639f, +0.003276f, -0.000505f, +0.004291f, -0.003926f, -0.002201f, + -0.000084f, -0.000543f, -0.001727f, +0.001736f, -0.001717f, -0.001887f + } + }, + { + { + -0.022886f, +0.452799f, +0.041493f, +0.133435f, -0.004227f, +0.010638f, +0.016374f, -0.005034f, -0.022903f, +0.021684f, + +0.008448f, +0.028219f, +0.006425f, +0.004027f, +0.004384f, +0.000523f, +0.020492f, -0.006947f, +0.016331f, -0.012103f, + +0.000877f, +0.000711f, +0.021154f, -0.006496f, +0.007308f, -0.013135f, +0.009427f, +0.014658f, +0.015375f, -0.024662f, + -0.009075f, -0.001636f, -0.007549f, +0.009080f, +0.002303f, -0.005833f, -0.011447f, -0.009430f, +0.005967f, -0.010283f, + +0.007982f, +0.024313f, -0.004489f, -0.016944f, -0.003382f, +0.007795f, -0.002497f, +0.001995f, +0.012647f, -0.005027f, + +0.002268f, +0.006865f, -0.007917f, -0.006817f, +0.009282f, +0.001725f, +0.004895f, +0.004910f, +0.000088f, +0.000707f, + -0.006240f, -0.002481f, +0.000426f, +0.004192f, -0.001124f, +0.001475f, -0.005372f, +0.002584f, -0.003234f, +0.001265f, + -0.007389f, -0.006831f, -0.002143f, -0.002703f, -0.003782f, -0.000657f, -0.003666f, -0.000658f, +0.001224f, -0.003974f, + +0.002388f, -0.001694f, +0.001479f, -0.000305f, -0.001099f, +0.001176f, -0.000965f, +0.001604f, +0.001584f, -0.000336f, + -0.001724f, -0.000389f, +0.001842f, +0.000539f, +0.001273f, -0.001006f + }, + { + -0.002282f, +0.016295f, +0.020960f, +0.018467f, -0.018094f, +0.008306f, -0.003486f, +0.011859f, -0.004393f, -0.012904f, + -0.025220f, +0.040325f, -0.009870f, +0.009851f, +0.010194f, -0.001844f, +0.022102f, +0.002120f, -0.000778f, -0.014011f, + +0.016910f, -0.026015f, +0.021617f, +0.030922f, +0.001922f, +0.016889f, -0.024879f, -0.014215f, -0.009070f, +0.027928f, + +0.003637f, +0.017110f, -0.018872f, +0.001555f, +0.022044f, -0.007313f, -0.007725f, -0.007781f, -0.003811f, +0.014688f, + -0.002240f, -0.003931f, -0.002721f, -0.009893f, +0.003570f, -0.003351f, -0.001465f, +0.003476f, +0.002643f, -0.008329f, + -0.002327f, -0.006735f, -0.003198f, -0.006036f, +0.006486f, -0.009855f, -0.002653f, -0.001834f, +0.002980f, -0.006343f, + -0.006184f, +0.001499f, +0.001021f, +0.000713f, +0.004378f, -0.000597f, +0.004347f, +0.000702f, +0.005377f, -0.004215f, + -0.003203f, -0.002068f, +0.000415f, -0.001856f, -0.003612f, -0.002720f, +0.001650f, -0.000872f, -0.003250f, +0.000559f, + -0.001389f, -0.000367f, +0.001355f, -0.003242f, +0.001631f, -0.002124f, +0.002568f, +0.003762f, +0.000174f, -0.001878f, + -0.000600f, -0.000256f, -0.001321f, -0.000963f, -0.001865f, -0.001384f + }, + { + +0.011108f, -0.097375f, -0.033262f, -0.059349f, +0.014096f, +0.002394f, -0.000058f, +0.002354f, +0.014168f, -0.010145f, + +0.022348f, +0.035062f, -0.031914f, +0.015285f, -0.024835f, +0.000308f, +0.005812f, -0.009452f, +0.004981f, -0.002131f, + +0.016926f, +0.008269f, -0.011713f, -0.002493f, -0.003654f, +0.003206f, -0.000201f, +0.013831f, -0.002369f, +0.007851f, + +0.002729f, -0.014851f, +0.001193f, -0.014738f, +0.012967f, +0.006833f, -0.016144f, +0.001465f, -0.009202f, -0.000049f, + +0.013462f, -0.010589f, -0.000071f, +0.005736f, -0.001001f, -0.008296f, +0.012065f, +0.011616f, +0.008076f, -0.000970f, + +0.011187f, -0.000133f, -0.005382f, +0.000604f, +0.001392f, -0.002391f, -0.000344f, -0.005553f, +0.003296f, +0.006542f, + +0.000173f, -0.001120f, -0.001289f, +0.002859f, +0.004697f, +0.005734f, -0.004966f, -0.002063f, +0.006591f, -0.000421f, + -0.001203f, -0.002423f, -0.001694f, +0.004541f, +0.004774f, -0.000621f, -0.002777f, -0.002002f, +0.000697f, -0.000598f, + -0.003494f, +0.002749f, +0.001164f, +0.000138f, +0.000516f, +0.002824f, -0.001527f, -0.001296f, -0.002584f, -0.002793f, + -0.000758f, +0.000601f, -0.001043f, +0.000962f, +0.001764f, +0.002420f + }, + { + +0.027634f, -0.044428f, +0.011899f, +0.110258f, -0.005078f, -0.009628f, -0.007045f, +0.010271f, -0.002111f, +0.022397f, + -0.035128f, -0.017057f, +0.010456f, -0.003606f, -0.000601f, +0.025262f, +0.031559f, +0.015158f, +0.015088f, +0.008361f, + +0.005932f, +0.021706f, +0.004779f, +0.007435f, +0.003083f, +0.012975f, -0.019458f, +0.001977f, -0.001167f, -0.021988f, + +0.010918f, +0.006003f, +0.001635f, -0.000132f, +0.013040f, +0.004171f, +0.006305f, +0.006194f, +0.012293f, +0.019610f, + +0.008137f, -0.001198f, -0.003189f, -0.013756f, +0.004404f, -0.006701f, -0.011415f, +0.001845f, -0.003317f, -0.007013f, + -0.002923f, +0.002703f, -0.001977f, +0.002057f, +0.002495f, +0.008211f, +0.003980f, -0.004055f, -0.006694f, +0.004064f, + -0.005948f, -0.001248f, -0.003681f, -0.006177f, -0.000030f, +0.006928f, -0.002163f, -0.003067f, -0.002183f, +0.001835f, + -0.002492f, +0.003830f, +0.001092f, -0.003308f, -0.000468f, -0.000486f, -0.002612f, +0.000536f, +0.000880f, +0.002658f, + -0.001675f, -0.003896f, -0.002225f, +0.001477f, -0.001166f, -0.001601f, -0.000939f, -0.000281f, +0.000411f, -0.002104f, + +0.000450f, +0.002458f, -0.000043f, -0.004829f, -0.003506f, -0.001839f + }, + { + +0.003644f, +0.017208f, +0.000328f, -0.010306f, -0.003528f, -0.000676f, -0.001292f, +0.008010f, -0.000985f, -0.001939f, + -0.003643f, +0.020964f, -0.001871f, +0.010188f, +0.093531f, -0.029244f, -0.031920f, -0.011417f, -0.025520f, -0.010049f, + +0.012567f, -0.015044f, -0.008245f, +0.011734f, +0.015813f, +0.002513f, +0.015166f, +0.011385f, +0.015845f, +0.011911f, + +0.013754f, -0.010135f, +0.011555f, -0.010705f, -0.013047f, +0.004096f, -0.008619f, +0.000505f, -0.003072f, -0.002363f, + -0.002702f, -0.006612f, +0.002729f, +0.000436f, -0.016807f, +0.003952f, +0.008725f, -0.004243f, -0.001752f, -0.004768f, + +0.001297f, +0.002151f, -0.002036f, +0.005255f, -0.001372f, +0.005770f, +0.003652f, +0.004676f, +0.009529f, -0.001626f, + +0.008732f, +0.001673f, -0.005369f, -0.001337f, -0.002618f, -0.002584f, -0.002335f, -0.004930f, +0.001101f, -0.001129f, + +0.001236f, +0.009441f, -0.001666f, -0.003873f, +0.003127f, +0.003166f, -0.001347f, -0.000771f, +0.001359f, -0.006239f, + +0.000096f, -0.003306f, -0.001167f, -0.000180f, +0.001231f, -0.001258f, +0.002693f, -0.000630f, -0.000319f, +0.001611f, + +0.001231f, -0.000121f, -0.000080f, -0.001280f, +0.002099f, +0.001684f + }, + { + +0.049723f, -0.136896f, +0.017458f, +0.104217f, -0.001483f, +0.002584f, +0.021100f, +0.022500f, +0.028943f, +0.003144f, + -0.011588f, -0.019459f, +0.023179f, -0.036649f, +0.005139f, -0.000198f, -0.015976f, +0.017899f, -0.007492f, +0.000218f, + +0.003127f, -0.008912f, -0.009751f, -0.007889f, +0.007761f, +0.002135f, +0.002164f, +0.002236f, +0.015346f, +0.010905f, + -0.005624f, +0.003929f, +0.010325f, -0.006041f, -0.001677f, -0.002374f, +0.004564f, -0.002994f, -0.006231f, +0.001979f, + +0.001936f, -0.005188f, -0.006227f, +0.009987f, +0.005140f, +0.010478f, +0.006460f, +0.005375f, +0.006420f, -0.007526f, + +0.002400f, +0.004645f, -0.001626f, -0.005105f, -0.006603f, +0.003365f, +0.002066f, +0.004096f, -0.001950f, -0.002016f, + +0.002077f, -0.003828f, -0.007657f, +0.000745f, +0.001143f, -0.004407f, -0.009803f, -0.001890f, -0.001247f, +0.002015f, + -0.005033f, +0.004406f, +0.001569f, -0.001826f, -0.000483f, +0.000157f, +0.001649f, -0.001909f, -0.000013f, -0.000030f, + +0.003329f, +0.001523f, +0.003096f, -0.001829f, -0.001968f, -0.001828f, +0.000231f, +0.000110f, +0.000470f, +0.002928f, + -0.000258f, -0.000653f, +0.001206f, -0.000662f, +0.000966f, -0.001116f + }, + { + -0.000803f, -0.028796f, -0.008033f, +0.001799f, -0.000403f, -0.003043f, +0.000290f, +0.008587f, +0.007046f, +0.004638f, + -0.012003f, -0.000719f, +0.015560f, -0.019922f, +0.044486f, -0.025854f, +0.006139f, -0.018802f, -0.012342f, -0.010467f, + +0.000583f, +0.001076f, -0.011029f, -0.006935f, +0.017335f, +0.001008f, +0.004580f, +0.001656f, +0.019916f, +0.009808f, + -0.002874f, +0.003147f, +0.002426f, +0.021469f, -0.007838f, +0.015997f, -0.007708f, +0.018039f, -0.012197f, +0.011217f, + -0.011599f, -0.007278f, +0.004836f, +0.008389f, -0.006845f, +0.000747f, -0.007358f, +0.004997f, +0.007977f, +0.005030f, + +0.004480f, +0.002341f, -0.003730f, +0.005995f, +0.005726f, -0.000738f, +0.000653f, -0.003519f, +0.000370f, +0.006890f, + +0.000714f, +0.004790f, +0.002645f, +0.004033f, +0.000627f, +0.005176f, +0.001897f, -0.000070f, +0.002746f, +0.001698f, + +0.001699f, -0.005293f, -0.003463f, -0.002841f, -0.004552f, -0.000624f, +0.002028f, -0.003732f, -0.000616f, +0.003311f, + -0.000310f, -0.004390f, +0.000031f, +0.003086f, -0.003857f, +0.001039f, +0.001384f, -0.001378f, +0.000474f, +0.000475f, + +0.001191f, +0.000344f, -0.001528f, +0.000389f, -0.001359f, -0.000911f + }, + { + +0.061152f, +0.101351f, -0.028245f, -0.019333f, +0.019817f, +0.007318f, -0.019286f, -0.014544f, +0.006081f, +0.012788f, + +0.014590f, +0.035654f, +0.013061f, -0.003507f, -0.002568f, +0.027378f, +0.009646f, +0.022551f, +0.004746f, +0.000680f, + -0.012543f, -0.027086f, +0.000469f, -0.005686f, +0.030617f, -0.000421f, +0.011891f, -0.000263f, -0.014100f, +0.018822f, + +0.000845f, -0.010135f, +0.004531f, -0.014033f, +0.017084f, -0.021801f, +0.009179f, -0.008172f, -0.001551f, +0.011623f, + +0.004757f, +0.001046f, +0.005310f, -0.007664f, +0.012617f, -0.008614f, -0.003438f, +0.007296f, -0.020084f, -0.001003f, + +0.006000f, -0.000103f, -0.001641f, -0.003598f, +0.002565f, -0.000568f, +0.002487f, -0.001687f, +0.003770f, +0.006608f, + +0.007105f, +0.003396f, -0.006651f, +0.003153f, +0.001502f, -0.004222f, +0.001627f, -0.005804f, -0.004759f, -0.000286f, + -0.000634f, -0.001999f, -0.000992f, -0.002715f, +0.000312f, -0.001726f, +0.004643f, -0.005053f, +0.001027f, +0.002370f, + -0.002742f, +0.002822f, +0.001824f, -0.000912f, +0.000147f, -0.002569f, -0.004229f, +0.002170f, +0.003758f, -0.001719f, + -0.001851f, +0.002045f, +0.002932f, +0.002167f, -0.001340f, +0.001831f + }, + { + +0.000500f, -0.018568f, -0.000134f, -0.000766f, +0.003688f, +0.000665f, +0.003679f, +0.002238f, +0.009794f, +0.007327f, + -0.000102f, -0.000213f, -0.006791f, +0.008719f, -0.043236f, -0.010708f, -0.023095f, +0.026554f, +0.027509f, -0.015116f, + -0.009067f, +0.022045f, +0.003177f, -0.022041f, +0.019984f, -0.014536f, -0.007197f, -0.017633f, +0.020597f, -0.045137f, + +0.000392f, -0.012400f, -0.012989f, +0.010819f, -0.001659f, +0.005185f, +0.003603f, -0.016013f, +0.021361f, -0.004102f, + +0.008594f, -0.006141f, -0.015629f, +0.003701f, +0.004253f, -0.006172f, -0.005962f, -0.008694f, +0.010757f, +0.003644f, + +0.003085f, +0.002651f, -0.003862f, +0.004866f, -0.002291f, +0.008173f, +0.002128f, -0.001916f, +0.004735f, -0.003453f, + +0.002782f, -0.002870f, +0.001659f, -0.002993f, -0.000657f, +0.004409f, -0.003816f, +0.003738f, -0.004479f, +0.000993f, + -0.000574f, -0.002059f, +0.004089f, +0.001186f, +0.001382f, +0.004882f, +0.002382f, +0.003234f, +0.002281f, +0.001377f, + +0.002788f, -0.002849f, +0.001504f, -0.000312f, -0.001747f, -0.002118f, -0.001258f, -0.000113f, -0.001017f, +0.000700f, + -0.001595f, -0.002100f, +0.002289f, +0.000707f, +0.001507f, +0.002436f + }, + { + +0.019370f, -0.223191f, -0.029132f, -0.031682f, -0.006160f, +0.032150f, +0.037316f, +0.022393f, -0.028502f, -0.019779f, + -0.008682f, +0.035067f, -0.000341f, -0.022864f, +0.035223f, -0.006578f, -0.016076f, -0.009738f, -0.016787f, -0.006954f, + +0.007619f, +0.013328f, +0.019191f, +0.002027f, +0.002262f, -0.030336f, -0.004361f, -0.012899f, -0.012350f, -0.012762f, + +0.010617f, -0.017780f, -0.020663f, -0.003109f, -0.007427f, -0.008749f, +0.001651f, -0.008023f, -0.000680f, -0.005877f, + -0.009949f, -0.012036f, +0.001281f, +0.002530f, +0.013271f, -0.010139f, +0.002995f, -0.000264f, +0.002762f, -0.006779f, + -0.000871f, -0.006480f, -0.000048f, -0.012442f, +0.009115f, +0.007543f, +0.008268f, -0.004057f, +0.000157f, +0.003467f, + +0.004753f, -0.004326f, +0.000576f, -0.007213f, +0.008792f, +0.001309f, +0.001567f, +0.008346f, -0.001473f, +0.007740f, + +0.003179f, +0.000546f, +0.005315f, -0.009265f, -0.004369f, -0.003368f, -0.001104f, +0.000263f, -0.002720f, +0.000179f, + +0.001460f, +0.002687f, -0.001478f, -0.006732f, -0.000635f, +0.001486f, -0.002341f, -0.000315f, -0.000230f, -0.004379f, + +0.000940f, -0.001440f, -0.001988f, +0.001397f, +0.001017f, -0.003305f + }, + { + +0.000711f, -0.076692f, +0.001122f, +0.002156f, -0.016862f, +0.001087f, -0.005543f, +0.004971f, +0.007952f, -0.000036f, + -0.017742f, +0.014383f, +0.028065f, -0.026640f, -0.002322f, +0.004169f, -0.023490f, +0.021488f, +0.017243f, +0.020160f, + -0.002892f, +0.006196f, -0.004109f, -0.003598f, +0.015154f, +0.001728f, +0.005977f, +0.002185f, +0.023185f, -0.014355f, + +0.014341f, -0.009961f, +0.000849f, +0.008084f, +0.009491f, -0.008875f, +0.007876f, +0.008216f, +0.012373f, +0.001481f, + +0.002531f, +0.014261f, +0.004496f, -0.007984f, -0.009032f, -0.011906f, +0.003874f, +0.007890f, -0.004533f, -0.007761f, + +0.001597f, -0.012292f, +0.001746f, -0.001612f, +0.001180f, +0.007743f, +0.003110f, -0.004955f, -0.003899f, -0.001303f, + -0.002960f, -0.003252f, -0.000997f, -0.002498f, +0.002447f, -0.002238f, -0.006702f, -0.000794f, -0.008060f, +0.000850f, + +0.002692f, +0.001607f, -0.002841f, +0.002380f, -0.005968f, +0.000212f, +0.004148f, +0.006107f, -0.002594f, -0.000027f, + +0.000386f, -0.002939f, -0.001439f, +0.000317f, -0.000907f, +0.000936f, +0.003845f, +0.003684f, +0.003034f, +0.001186f, + -0.001238f, +0.000651f, +0.000268f, -0.001081f, -0.000688f, +0.001100f + }, + { + -0.010063f, -0.156395f, +0.055297f, +0.019137f, -0.003262f, +0.045697f, -0.017506f, +0.014804f, +0.011148f, -0.027055f, + +0.033128f, +0.004749f, +0.030590f, +0.003488f, +0.010000f, -0.025167f, +0.001320f, -0.003083f, +0.024762f, -0.003406f, + +0.016352f, -0.007505f, -0.006524f, -0.000158f, -0.017453f, +0.003558f, +0.007952f, +0.004604f, +0.002435f, +0.000092f, + +0.004973f, -0.006168f, +0.003064f, +0.003721f, -0.010279f, +0.000862f, -0.003917f, +0.006479f, -0.004779f, -0.009467f, + -0.002137f, -0.003907f, -0.001523f, -0.012298f, +0.005036f, +0.000592f, -0.001989f, -0.007242f, +0.000180f, -0.000469f, + -0.000443f, +0.005928f, -0.008875f, -0.001869f, +0.010286f, -0.000918f, +0.001032f, +0.005765f, +0.001002f, +0.001427f, + +0.007913f, +0.006463f, +0.001326f, -0.000041f, +0.004570f, -0.001749f, +0.009589f, -0.000484f, +0.006140f, +0.000030f, + -0.000758f, -0.003975f, -0.003285f, -0.002391f, -0.001807f, +0.002741f, +0.000727f, +0.007237f, -0.000584f, +0.000433f, + -0.001767f, +0.002561f, +0.000027f, +0.003331f, -0.000088f, -0.000296f, +0.001361f, +0.003361f, -0.001157f, -0.000738f, + +0.000141f, +0.001338f, -0.002603f, -0.000663f, -0.002361f, -0.000846f + }, + { + +0.004200f, -0.018179f, -0.022552f, +0.000100f, +0.015690f, +0.005643f, -0.028426f, +0.003755f, -0.008464f, +0.005526f, + +0.002285f, -0.010035f, +0.003589f, -0.055507f, -0.029253f, +0.024598f, -0.033992f, +0.000399f, -0.049835f, +0.033640f, + -0.004288f, +0.020019f, -0.059373f, +0.009611f, +0.010886f, +0.024005f, +0.011711f, +0.002516f, +0.016768f, -0.010468f, + +0.005018f, -0.014687f, +0.012868f, -0.017691f, +0.013143f, +0.003718f, +0.010959f, -0.004238f, +0.007634f, -0.013177f, + +0.008613f, -0.013025f, +0.006671f, -0.011808f, -0.008553f, -0.006556f, -0.003993f, -0.005186f, -0.001209f, +0.003606f, + -0.002967f, -0.003462f, -0.016957f, -0.002936f, +0.003156f, -0.000966f, -0.002966f, +0.004963f, -0.001586f, +0.009991f, + -0.000318f, +0.008547f, +0.001706f, -0.000777f, +0.005698f, +0.000117f, -0.009996f, -0.004981f, -0.004977f, -0.004826f, + +0.004236f, +0.005271f, +0.002224f, +0.000471f, -0.004754f, -0.002209f, -0.006259f, +0.001026f, -0.003136f, -0.000928f, + +0.002876f, +0.002230f, -0.000930f, -0.002174f, -0.004889f, -0.003739f, -0.002717f, -0.003157f, -0.006012f, -0.002198f, + -0.000997f, -0.001969f, -0.000731f, +0.001363f, +0.002496f, -0.001172f + }, + { + +0.025343f, -0.132665f, +0.025115f, +0.039170f, +0.003958f, -0.013782f, +0.048220f, +0.006914f, -0.013240f, +0.029247f, + +0.019751f, -0.008451f, -0.002249f, +0.016497f, +0.089927f, +0.034769f, +0.002694f, +0.007188f, +0.018407f, -0.001400f, + +0.013114f, +0.006065f, -0.009653f, -0.019875f, -0.007549f, +0.013715f, -0.011958f, -0.010275f, -0.002879f, +0.003979f, + -0.000280f, -0.014667f, -0.000245f, +0.011800f, +0.002934f, +0.001010f, +0.001737f, -0.003385f, +0.005031f, +0.009149f, + +0.002782f, -0.015902f, -0.016075f, -0.006275f, +0.003994f, -0.004181f, +0.014067f, +0.008900f, -0.006812f, -0.010724f, + +0.005450f, -0.001925f, -0.007961f, +0.001647f, -0.002118f, +0.006085f, -0.000623f, -0.007977f, -0.006236f, +0.002239f, + +0.004495f, -0.000969f, +0.005575f, +0.009849f, +0.006767f, +0.003484f, +0.000596f, +0.001469f, +0.003021f, -0.001264f, + -0.003560f, -0.004480f, -0.002105f, -0.002431f, +0.001879f, -0.001919f, -0.001312f, -0.004428f, +0.003680f, +0.003565f, + +0.000777f, +0.001842f, -0.002680f, -0.006163f, +0.000668f, -0.000406f, -0.000863f, -0.001644f, +0.001074f, +0.001615f, + -0.001236f, -0.001237f, +0.001782f, +0.001152f, +0.000136f, -0.000265f + }, + { + -0.009343f, +0.049114f, +0.023097f, -0.004810f, -0.020565f, +0.032781f, -0.000499f, -0.004388f, -0.002595f, +0.007070f, + -0.009291f, +0.003565f, +0.017280f, -0.079245f, +0.095134f, -0.030052f, -0.016773f, -0.019180f, +0.020753f, +0.024711f, + -0.010515f, +0.022023f, -0.008434f, +0.005904f, +0.008669f, +0.005518f, +0.021209f, +0.003666f, -0.015389f, -0.038888f, + -0.006124f, -0.002618f, +0.014131f, -0.006892f, +0.020960f, -0.002165f, -0.004367f, -0.006814f, -0.016178f, -0.002542f, + -0.026422f, -0.018176f, +0.012497f, -0.002380f, +0.005616f, -0.017866f, +0.016216f, +0.008479f, -0.023618f, +0.002895f, + -0.004927f, +0.000030f, -0.002638f, +0.002301f, -0.001498f, -0.001808f, -0.000317f, -0.003725f, -0.000963f, -0.003041f, + -0.003750f, +0.001256f, +0.000068f, +0.001155f, -0.006220f, -0.001052f, -0.001222f, +0.001386f, -0.007259f, +0.000334f, + -0.002711f, +0.004207f, -0.001255f, -0.004302f, -0.000801f, -0.004016f, -0.002614f, -0.000807f, -0.003781f, +0.007315f, + +0.000334f, +0.002846f, +0.001371f, -0.000552f, -0.003400f, +0.004041f, +0.001071f, -0.002930f, +0.000554f, -0.002042f, + -0.002137f, -0.000842f, +0.001966f, -0.003118f, +0.000764f, -0.001231f + } + }, + { + { + +0.024388f, +0.461918f, -0.026691f, +0.087771f, -0.023299f, -0.000462f, +0.010723f, +0.013946f, -0.016193f, +0.044639f, + +0.028664f, +0.013891f, -0.012490f, -0.013323f, +0.012673f, +0.001484f, +0.000003f, -0.032234f, +0.006619f, +0.000175f, + +0.006828f, +0.001763f, +0.008184f, -0.010505f, +0.002371f, -0.015743f, -0.007365f, -0.003604f, +0.020722f, -0.013628f, + +0.002931f, +0.015930f, -0.002402f, -0.005884f, -0.004421f, -0.007166f, +0.002393f, +0.001421f, +0.012010f, -0.004895f, + -0.008290f, -0.000021f, -0.011507f, -0.017706f, -0.002362f, +0.001833f, -0.009430f, -0.007970f, +0.010476f, +0.004523f, + +0.004673f, +0.002549f, -0.011483f, -0.009133f, +0.005244f, -0.006544f, +0.004486f, +0.005106f, -0.005011f, +0.003477f, + +0.001605f, -0.005912f, -0.004657f, +0.000379f, -0.001417f, +0.004653f, -0.005297f, +0.003117f, -0.002402f, +0.004493f, + -0.004498f, -0.004946f, -0.000101f, -0.002579f, -0.008384f, -0.001808f, +0.001642f, -0.000287f, +0.000892f, +0.000793f, + +0.005807f, -0.002066f, -0.001176f, -0.003893f, -0.002803f, -0.000134f, +0.000556f, +0.001456f, +0.002246f, +0.002612f, + +0.000368f, -0.000651f, -0.001301f, -0.000032f, +0.001182f, -0.001757f + }, + { + +0.001178f, -0.047768f, -0.028113f, +0.041792f, -0.003743f, +0.002357f, -0.007697f, +0.000412f, -0.015376f, -0.003239f, + -0.007813f, +0.038910f, -0.028072f, +0.002087f, +0.014839f, -0.017308f, +0.000350f, -0.004208f, +0.005375f, -0.028214f, + +0.013452f, -0.002174f, +0.007117f, -0.016280f, -0.017420f, +0.022277f, -0.033255f, -0.010599f, -0.002989f, +0.035645f, + +0.002836f, +0.015125f, -0.015033f, -0.004474f, +0.008485f, -0.009325f, -0.006028f, +0.000043f, -0.000023f, +0.007833f, + +0.004614f, +0.011473f, +0.007454f, -0.005841f, +0.009969f, -0.003474f, -0.015589f, +0.002006f, +0.003275f, -0.001643f, + +0.002364f, -0.006515f, -0.003220f, -0.004710f, -0.000281f, -0.011656f, +0.006046f, +0.000688f, +0.002552f, +0.000565f, + -0.001573f, +0.000144f, -0.000051f, +0.003142f, +0.004470f, -0.003221f, +0.009672f, +0.001723f, +0.001724f, -0.000398f, + +0.002795f, -0.001697f, +0.001506f, +0.001244f, +0.001654f, -0.000822f, -0.000988f, -0.000698f, -0.003510f, +0.001287f, + -0.003399f, -0.001683f, +0.001679f, -0.005456f, +0.000424f, +0.000091f, +0.002015f, -0.000291f, +0.000148f, +0.001283f, + -0.000054f, -0.000926f, -0.000247f, +0.002395f, +0.000834f, -0.001469f + }, + { + -0.011539f, -0.012582f, +0.046984f, -0.072582f, -0.000078f, +0.001885f, +0.000931f, -0.010161f, -0.004120f, -0.005022f, + +0.030920f, +0.030592f, -0.030862f, +0.010601f, -0.021916f, +0.019487f, +0.011159f, -0.008270f, -0.002999f, -0.012923f, + -0.002867f, -0.007427f, -0.010617f, +0.009114f, +0.011311f, +0.000735f, +0.001502f, +0.020947f, +0.002437f, +0.012475f, + +0.004745f, -0.009252f, +0.010695f, -0.012641f, -0.001924f, +0.005113f, -0.011782f, +0.004879f, -0.007771f, -0.010810f, + +0.006136f, -0.023730f, -0.009515f, +0.006502f, +0.010506f, +0.010543f, +0.024577f, +0.016604f, +0.009829f, -0.011626f, + +0.005714f, +0.009027f, -0.009503f, -0.001000f, +0.008508f, +0.000323f, -0.002925f, -0.008837f, -0.002014f, +0.003343f, + +0.000782f, +0.000820f, -0.003382f, -0.007078f, -0.004835f, +0.007319f, -0.000355f, -0.002248f, +0.003537f, -0.000041f, + +0.003196f, +0.001667f, +0.001202f, +0.001399f, +0.001632f, +0.001423f, +0.005253f, +0.001484f, +0.001687f, +0.001308f, + -0.002634f, +0.001952f, -0.000898f, -0.001767f, -0.002207f, +0.000819f, -0.002082f, -0.001112f, -0.002949f, -0.001122f, + -0.001369f, -0.001464f, -0.001293f, +0.000035f, -0.000279f, +0.002306f + }, + { + -0.019032f, -0.157158f, -0.029448f, +0.112409f, +0.005764f, -0.006882f, -0.007671f, -0.006267f, -0.009730f, +0.025069f, + -0.033859f, -0.012649f, +0.007857f, +0.000509f, -0.002399f, +0.000122f, +0.029382f, +0.010464f, -0.005715f, -0.000592f, + -0.001504f, +0.008935f, +0.023458f, +0.031484f, +0.013039f, +0.018212f, -0.020331f, +0.017788f, +0.025776f, -0.012245f, + +0.008094f, +0.020110f, +0.011721f, -0.002490f, +0.005077f, +0.008180f, +0.008820f, +0.000812f, -0.001181f, +0.007079f, + -0.007555f, -0.018006f, -0.006576f, -0.012297f, +0.002348f, -0.005759f, -0.004822f, +0.005705f, -0.000637f, -0.010575f, + -0.001285f, +0.007278f, +0.003055f, +0.004684f, -0.000266f, +0.001749f, +0.005547f, +0.002475f, -0.004439f, +0.006492f, + +0.001995f, -0.000612f, -0.002089f, -0.000109f, +0.005487f, +0.007070f, +0.004134f, +0.003036f, -0.003524f, +0.002818f, + +0.004166f, +0.002176f, -0.001688f, -0.000431f, +0.000135f, -0.001681f, -0.005365f, +0.001488f, +0.002964f, +0.002142f, + +0.000253f, -0.000145f, -0.001288f, +0.000842f, -0.002043f, -0.002376f, -0.001678f, -0.000806f, +0.001966f, +0.001225f, + +0.000220f, +0.000353f, +0.001372f, -0.000578f, -0.000112f, -0.000693f + }, + { + -0.003529f, +0.035507f, +0.016835f, -0.001032f, +0.002741f, -0.000166f, +0.000227f, +0.001333f, -0.001890f, -0.002990f, + -0.003319f, +0.021813f, +0.003110f, -0.011061f, +0.035524f, -0.039987f, -0.019966f, +0.044759f, +0.012716f, -0.020417f, + +0.003760f, -0.024502f, -0.026365f, -0.007168f, +0.012257f, +0.022734f, +0.022509f, +0.007574f, +0.011891f, -0.011727f, + -0.003442f, +0.001951f, +0.034463f, +0.012249f, -0.004428f, +0.007484f, -0.002238f, +0.005386f, +0.005663f, +0.005277f, + +0.000402f, +0.001166f, +0.003575f, -0.001381f, -0.004570f, +0.004163f, +0.003899f, +0.000892f, +0.002619f, -0.001075f, + +0.004340f, -0.004608f, -0.005182f, +0.008960f, +0.000951f, +0.002343f, +0.007843f, +0.006882f, +0.003477f, -0.001093f, + +0.013842f, +0.005844f, -0.003742f, -0.001870f, -0.002758f, +0.000796f, +0.008032f, -0.000745f, +0.002312f, +0.000627f, + -0.003493f, +0.010484f, +0.002440f, -0.003982f, +0.003497f, +0.002565f, -0.002140f, +0.003355f, +0.005185f, -0.005311f, + +0.005013f, -0.000663f, -0.004261f, -0.001314f, +0.000185f, -0.003017f, +0.001147f, -0.001378f, -0.001519f, -0.000668f, + -0.000882f, -0.000435f, +0.000795f, +0.000099f, +0.002543f, +0.001010f + }, + { + -0.032059f, -0.326218f, -0.020159f, +0.101768f, -0.023864f, -0.000338f, +0.015181f, -0.008159f, +0.000881f, +0.003526f, + -0.008312f, -0.026310f, +0.003376f, -0.050267f, -0.001140f, -0.008312f, -0.027425f, +0.003570f, -0.019296f, -0.015322f, + -0.000744f, +0.008863f, -0.008851f, -0.004415f, +0.021982f, -0.005032f, -0.011268f, -0.011029f, +0.004981f, +0.010838f, + -0.002615f, -0.004669f, +0.010219f, -0.000807f, -0.000554f, -0.005990f, -0.001059f, -0.007793f, -0.011082f, +0.004544f, + +0.016905f, +0.006959f, -0.001176f, +0.001562f, -0.008774f, +0.001041f, +0.000542f, -0.002778f, -0.002254f, -0.006937f, + +0.004104f, +0.005537f, +0.002653f, -0.000513f, +0.000087f, +0.003943f, -0.001000f, +0.002403f, +0.000814f, -0.002974f, + -0.001131f, +0.001868f, -0.003709f, +0.000315f, +0.000607f, -0.002715f, -0.003695f, +0.000545f, -0.001071f, +0.001640f, + -0.005476f, +0.003753f, +0.001430f, -0.004005f, -0.001611f, +0.000470f, +0.005728f, +0.000459f, -0.001365f, -0.001700f, + +0.001489f, -0.000937f, +0.001782f, -0.000473f, +0.001070f, -0.001627f, +0.000439f, +0.001448f, +0.000507f, -0.000388f, + -0.001767f, +0.000964f, +0.001226f, -0.001869f, +0.000786f, -0.000726f + }, + { + +0.001139f, -0.006642f, +0.003279f, +0.002394f, -0.002198f, -0.001538f, +0.002437f, +0.006338f, -0.005175f, +0.001004f, + -0.001529f, -0.001072f, +0.012548f, +0.006648f, +0.081343f, -0.026702f, +0.011884f, +0.005279f, +0.017165f, -0.005058f, + -0.008558f, +0.009323f, +0.006224f, -0.021479f, +0.005953f, +0.014378f, -0.012372f, -0.017375f, +0.034126f, +0.041928f, + +0.028931f, +0.003430f, -0.011254f, +0.024238f, -0.003439f, +0.014980f, -0.010372f, +0.019733f, -0.012506f, +0.010511f, + +0.001299f, -0.001751f, -0.004176f, -0.000056f, -0.002379f, +0.005391f, -0.008918f, -0.005325f, +0.004375f, +0.005198f, + -0.002415f, +0.005502f, -0.010111f, -0.006603f, +0.003560f, +0.002446f, +0.002985f, -0.007681f, -0.005417f, +0.007532f, + +0.003066f, +0.001721f, -0.003743f, +0.001590f, +0.000600f, +0.000635f, -0.000407f, +0.002184f, +0.000302f, -0.001289f, + +0.000473f, -0.003601f, +0.000351f, -0.000421f, -0.003401f, -0.001768f, +0.000385f, -0.001396f, -0.000313f, +0.000617f, + -0.000433f, -0.000723f, +0.002467f, +0.003877f, -0.003238f, +0.000010f, -0.000806f, -0.004712f, -0.001047f, -0.001987f, + -0.001779f, -0.001421f, -0.002912f, -0.000300f, -0.000353f, -0.002214f + }, + { + -0.098732f, -0.035705f, +0.053940f, -0.027913f, +0.009098f, +0.010353f, -0.036908f, +0.006867f, +0.034255f, +0.018799f, + -0.001665f, -0.003784f, -0.020817f, -0.018475f, +0.001115f, +0.029316f, -0.009580f, +0.013186f, -0.005465f, +0.011025f, + -0.007390f, -0.025982f, +0.015383f, +0.011414f, +0.037625f, +0.001005f, +0.004790f, -0.009890f, -0.003734f, +0.022283f, + +0.004159f, -0.002421f, +0.005386f, -0.009808f, +0.015102f, -0.034673f, -0.006170f, -0.016986f, -0.004479f, +0.005165f, + +0.002848f, -0.000496f, +0.013291f, -0.002229f, +0.018780f, -0.001049f, -0.004784f, +0.003978f, -0.010035f, +0.004272f, + -0.000856f, -0.000601f, -0.004869f, -0.014519f, -0.000264f, +0.005038f, +0.001096f, -0.000745f, +0.005643f, -0.000189f, + -0.000473f, +0.001799f, +0.001250f, +0.007442f, -0.002380f, -0.007674f, +0.002381f, -0.003885f, +0.000571f, +0.006111f, + +0.002632f, -0.003649f, -0.001256f, +0.002099f, +0.003651f, -0.004749f, +0.005650f, +0.000529f, -0.001390f, +0.003048f, + -0.001248f, -0.001148f, -0.001543f, -0.002130f, -0.001195f, +0.001764f, +0.000558f, +0.000524f, +0.004050f, +0.000327f, + -0.001654f, -0.000089f, +0.000666f, +0.000518f, -0.002199f, +0.002436f + }, + { + +0.002743f, -0.004066f, +0.010247f, -0.006802f, -0.002429f, +0.001665f, -0.001439f, +0.000157f, +0.013141f, +0.003400f, + -0.012782f, +0.004721f, +0.005828f, +0.016615f, -0.020553f, +0.027163f, +0.004796f, +0.020327f, +0.013361f, -0.033662f, + -0.028077f, -0.004778f, -0.007874f, -0.024082f, +0.023715f, -0.022618f, -0.010293f, -0.013923f, +0.029197f, -0.012876f, + +0.002390f, -0.003194f, +0.004983f, +0.009134f, -0.006056f, +0.006724f, -0.000994f, -0.009375f, +0.024075f, -0.015703f, + +0.004454f, -0.004963f, -0.009628f, +0.010016f, +0.012899f, -0.005539f, -0.003642f, -0.001624f, +0.011460f, -0.007720f, + -0.006220f, +0.005134f, +0.006173f, +0.010424f, -0.006262f, +0.002915f, +0.001219f, +0.002751f, +0.004833f, +0.001019f, + +0.000187f, -0.006909f, +0.001635f, -0.003190f, +0.000912f, +0.004298f, -0.004917f, +0.006484f, -0.000089f, +0.001214f, + +0.000195f, -0.001019f, -0.001816f, -0.001844f, +0.001265f, +0.000355f, -0.002297f, +0.001639f, +0.002171f, -0.001784f, + +0.000241f, -0.001533f, +0.002350f, -0.002969f, -0.001473f, +0.001258f, +0.001974f, +0.001148f, -0.002002f, -0.000370f, + -0.001488f, -0.002231f, +0.000630f, +0.000201f, -0.000943f, +0.000111f + }, + { + -0.015904f, -0.289872f, -0.048400f, -0.019899f, -0.004479f, -0.012396f, -0.021709f, +0.004481f, -0.006257f, +0.015638f, + +0.004125f, +0.032632f, +0.000879f, -0.029447f, +0.033257f, -0.026184f, -0.031238f, +0.009136f, +0.005917f, +0.001030f, + -0.002161f, +0.010813f, +0.008391f, -0.013518f, -0.002181f, -0.020856f, -0.003839f, -0.011582f, -0.006733f, -0.014907f, + +0.004685f, -0.005571f, -0.013705f, +0.005793f, +0.002242f, -0.010289f, -0.000321f, -0.001693f, +0.007144f, +0.006485f, + +0.002237f, +0.000619f, +0.008008f, -0.003513f, +0.018194f, +0.001153f, -0.002184f, -0.004794f, +0.009078f, -0.001535f, + -0.000314f, +0.000302f, +0.004752f, -0.013754f, +0.003171f, +0.000201f, +0.002574f, -0.007910f, -0.001243f, +0.004162f, + +0.008218f, -0.005565f, +0.001430f, -0.003686f, +0.006403f, -0.003128f, +0.001752f, +0.001242f, -0.001972f, +0.010634f, + +0.000407f, -0.003552f, +0.004799f, -0.005879f, +0.001205f, +0.001123f, +0.001155f, +0.000645f, -0.000402f, +0.000137f, + -0.003765f, -0.002434f, -0.001167f, -0.003094f, +0.002240f, +0.000891f, -0.001378f, +0.000709f, +0.000890f, -0.001043f, + +0.001095f, -0.001140f, -0.002018f, -0.000150f, +0.001853f, -0.000265f + }, + { + -0.004059f, -0.087096f, +0.002600f, +0.008847f, -0.001268f, +0.017610f, +0.018885f, +0.009742f, -0.008732f, +0.004172f, + +0.000222f, +0.012247f, +0.033020f, -0.022683f, +0.010303f, +0.030044f, -0.008920f, +0.019966f, -0.004143f, -0.017811f, + -0.016254f, +0.001176f, -0.011581f, -0.005623f, -0.003210f, -0.010695f, +0.003425f, -0.010598f, +0.011084f, -0.017245f, + +0.010661f, -0.012940f, -0.013959f, -0.011677f, -0.005813f, -0.010321f, +0.003312f, -0.001622f, -0.001171f, -0.006105f, + -0.003412f, +0.013183f, +0.009973f, -0.006536f, -0.004970f, +0.001618f, +0.008438f, +0.002424f, -0.008530f, -0.003067f, + +0.009266f, -0.007284f, -0.002875f, -0.007085f, +0.003818f, +0.007235f, +0.004630f, +0.000831f, -0.003030f, +0.001080f, + +0.002979f, -0.001395f, -0.002291f, +0.001208f, +0.009367f, +0.004143f, +0.000055f, +0.005603f, -0.003405f, -0.000174f, + -0.000516f, +0.000528f, -0.003876f, +0.002284f, -0.000760f, +0.001867f, +0.001438f, +0.003878f, -0.001638f, -0.000014f, + -0.001659f, -0.001820f, -0.001875f, -0.001436f, -0.002071f, +0.001408f, +0.004912f, +0.001087f, -0.001033f, -0.000873f, + +0.000423f, +0.002109f, -0.000350f, -0.000190f, +0.002223f, -0.000069f + }, + { + +0.045782f, -0.083777f, +0.025583f, -0.012092f, +0.005782f, +0.018898f, -0.032969f, +0.020783f, -0.009304f, -0.033519f, + +0.031924f, -0.025135f, +0.005953f, -0.007057f, +0.011132f, -0.027714f, +0.020235f, +0.010224f, +0.018762f, -0.006845f, + +0.005594f, +0.003541f, +0.018208f, +0.017541f, -0.013772f, -0.005081f, -0.005982f, -0.009680f, -0.008133f, -0.009463f, + -0.007764f, -0.002498f, +0.001381f, -0.005953f, -0.006239f, -0.001660f, -0.023969f, -0.016402f, +0.000805f, +0.005802f, + +0.000754f, -0.003092f, +0.015716f, +0.009579f, +0.008215f, +0.002496f, -0.000652f, -0.000925f, +0.013803f, +0.007148f, + -0.007592f, +0.004381f, +0.000838f, -0.001916f, -0.000493f, -0.008722f, +0.001983f, +0.005266f, -0.001860f, -0.001387f, + +0.008213f, +0.004822f, +0.003287f, +0.001910f, +0.003655f, -0.001880f, +0.010703f, +0.000706f, +0.004334f, -0.001340f, + -0.001901f, +0.000100f, +0.002674f, -0.001637f, -0.000472f, +0.002851f, +0.000680f, +0.004324f, -0.003774f, +0.001496f, + +0.000126f, +0.003279f, -0.002611f, +0.003150f, +0.000759f, -0.002927f, -0.000687f, +0.001811f, -0.001560f, +0.001085f, + +0.002548f, +0.003669f, -0.002700f, +0.000897f, +0.000121f, +0.000164f + }, + { + -0.005271f, +0.010612f, +0.000500f, +0.001638f, +0.017222f, +0.005432f, -0.021582f, +0.005851f, -0.009514f, -0.001757f, + +0.005687f, +0.006570f, -0.006385f, -0.052441f, -0.012063f, +0.028973f, -0.032413f, +0.014437f, -0.029485f, +0.013280f, + -0.045503f, -0.007668f, -0.017518f, +0.023851f, +0.011987f, +0.025760f, +0.001580f, -0.000609f, +0.009890f, +0.000260f, + +0.021564f, -0.011683f, +0.031892f, -0.010746f, +0.015488f, +0.002583f, +0.011986f, -0.006782f, +0.008732f, +0.003741f, + +0.020082f, -0.009385f, +0.005552f, -0.007858f, +0.002390f, +0.004143f, -0.001429f, -0.003510f, +0.003369f, +0.007137f, + -0.001629f, +0.003852f, -0.004091f, -0.004937f, -0.004408f, +0.002275f, +0.002617f, +0.005656f, +0.001988f, +0.007026f, + -0.016353f, +0.000749f, +0.006698f, -0.003234f, -0.001312f, +0.000108f, -0.005789f, -0.002862f, +0.007371f, +0.002212f, + -0.001315f, +0.000044f, -0.002078f, +0.001979f, +0.002055f, +0.004028f, -0.004255f, +0.002443f, -0.002595f, -0.000412f, + +0.002499f, +0.001249f, -0.001382f, -0.000490f, +0.000231f, +0.001654f, +0.000026f, +0.001688f, -0.003067f, +0.000851f, + +0.002085f, -0.002749f, +0.000260f, -0.001688f, +0.000153f, +0.001158f + }, + { + -0.000364f, -0.154633f, +0.032738f, +0.013306f, -0.008519f, -0.052068f, +0.000343f, -0.005461f, -0.015451f, +0.017063f, + +0.005652f, +0.012507f, -0.006724f, -0.017802f, +0.043037f, -0.005717f, -0.036925f, -0.013866f, +0.003111f, -0.009143f, + -0.015755f, -0.001183f, -0.003376f, -0.008928f, +0.015852f, +0.015469f, +0.002363f, +0.018320f, +0.003976f, +0.000017f, + +0.004552f, -0.000770f, -0.010707f, -0.004838f, -0.011711f, +0.002316f, +0.003459f, -0.014055f, -0.008443f, -0.005616f, + +0.002071f, -0.009451f, -0.007603f, -0.012607f, -0.015200f, -0.009025f, +0.005538f, +0.003922f, -0.018644f, -0.006706f, + +0.009858f, -0.004474f, -0.003046f, +0.004401f, -0.003429f, -0.003083f, -0.005597f, +0.000199f, +0.003390f, +0.006267f, + +0.004274f, -0.004867f, +0.005964f, +0.007345f, +0.003223f, -0.000361f, -0.001666f, +0.001669f, -0.000597f, +0.003846f, + +0.002750f, -0.000811f, -0.001674f, -0.004373f, +0.003502f, -0.000110f, +0.002821f, +0.001118f, +0.001435f, -0.001273f, + -0.002739f, +0.001721f, -0.003297f, -0.005674f, +0.001359f, +0.000364f, +0.001611f, +0.000293f, -0.000377f, +0.000369f, + -0.002060f, -0.002184f, +0.000144f, -0.001658f, -0.002024f, -0.001759f + }, + { + +0.009395f, +0.041615f, -0.005477f, +0.006373f, -0.014745f, +0.025850f, +0.000502f, -0.000494f, +0.012825f, +0.014884f, + -0.012775f, -0.005187f, +0.016725f, -0.002720f, +0.189555f, -0.014722f, -0.018908f, -0.038058f, +0.021790f, +0.031759f, + -0.018280f, +0.012086f, -0.006535f, +0.004992f, -0.003207f, -0.013388f, -0.001578f, -0.008446f, -0.009886f, -0.038312f, + -0.001116f, -0.007531f, -0.000914f, -0.016175f, +0.015467f, -0.004468f, +0.000463f, +0.006876f, -0.004907f, -0.003288f, + -0.019530f, -0.004711f, +0.024234f, -0.002242f, +0.011746f, -0.004528f, +0.020105f, +0.010051f, -0.026903f, +0.002075f, + +0.001777f, -0.001730f, -0.006870f, -0.001196f, -0.006246f, +0.002410f, +0.008594f, +0.002773f, +0.009464f, +0.013194f, + +0.001723f, +0.000694f, -0.000095f, -0.008267f, -0.006714f, -0.004928f, -0.009559f, +0.001154f, -0.002086f, +0.002346f, + -0.006295f, +0.002711f, -0.000158f, -0.006450f, -0.001832f, -0.004362f, -0.004065f, -0.000028f, +0.002553f, +0.009603f, + -0.004523f, +0.001354f, +0.002932f, -0.001708f, -0.004621f, +0.002827f, +0.000771f, -0.004993f, -0.000656f, +0.000035f, + +0.000255f, -0.003013f, -0.001865f, -0.001073f, +0.004357f, +0.000497f + } + }, + { + { + -0.025647f, +0.366263f, +0.067842f, +0.018345f, +0.033540f, +0.006520f, -0.002893f, +0.035712f, -0.023831f, +0.033741f, + +0.030535f, -0.007944f, +0.004321f, -0.028394f, +0.003904f, +0.011715f, -0.026351f, -0.004698f, -0.005017f, +0.020818f, + -0.004029f, +0.006565f, +0.000906f, -0.000082f, -0.002631f, -0.013653f, -0.016457f, -0.000462f, +0.006188f, +0.000967f, + +0.004252f, +0.007638f, +0.004967f, -0.007537f, -0.013907f, -0.003245f, +0.008632f, +0.004045f, +0.007104f, -0.000714f, + -0.005114f, -0.014762f, +0.001370f, -0.017522f, -0.000237f, -0.014202f, +0.002951f, -0.004495f, +0.003054f, +0.014026f, + -0.008295f, +0.001745f, -0.002400f, -0.009594f, +0.002246f, -0.003758f, +0.004892f, +0.001646f, -0.000511f, -0.000698f, + -0.001232f, +0.000246f, -0.000870f, -0.008328f, -0.000152f, +0.002515f, -0.001970f, +0.001047f, -0.001295f, +0.003276f, + -0.004751f, -0.002636f, -0.002564f, -0.002624f, -0.002069f, -0.005562f, +0.005729f, -0.002969f, +0.000757f, +0.004506f, + +0.003709f, -0.001525f, -0.001347f, -0.002583f, -0.003223f, -0.000893f, +0.001045f, +0.000175f, +0.003303f, +0.002926f, + +0.000758f, -0.001667f, -0.001715f, +0.001195f, -0.001936f, +0.000780f + }, + { + -0.000543f, -0.101052f, +0.016387f, +0.032669f, +0.004216f, -0.007478f, +0.001648f, -0.017773f, -0.004980f, -0.014426f, + +0.030744f, +0.015200f, -0.019008f, +0.022828f, -0.016707f, +0.008172f, -0.018256f, -0.014951f, +0.002346f, -0.017695f, + +0.008971f, +0.003941f, -0.031902f, -0.002903f, -0.000575f, -0.005841f, -0.035887f, -0.004293f, +0.011420f, +0.040936f, + -0.007276f, +0.015022f, -0.000569f, -0.005889f, -0.004094f, -0.005518f, -0.016306f, +0.014068f, +0.000798f, -0.003058f, + +0.004724f, +0.015791f, +0.003735f, +0.003529f, +0.003398f, +0.001663f, -0.018264f, -0.002465f, -0.005837f, +0.010207f, + +0.007254f, -0.008774f, -0.004980f, +0.000199f, -0.013591f, +0.003538f, +0.004721f, -0.002009f, -0.001400f, -0.001237f, + +0.010640f, -0.006077f, -0.002670f, -0.000518f, +0.008684f, +0.003099f, +0.002956f, +0.000718f, +0.002477f, +0.001197f, + +0.002913f, -0.002485f, +0.004565f, -0.000416f, +0.000449f, +0.001731f, -0.004273f, +0.002789f, -0.001751f, +0.000712f, + -0.002851f, -0.001649f, -0.000168f, -0.001526f, -0.003938f, +0.002275f, +0.000746f, -0.000876f, -0.000956f, +0.000807f, + -0.000603f, +0.000767f, -0.000655f, +0.002718f, +0.000681f, -0.000560f + }, + { + +0.009906f, +0.100229f, -0.064466f, -0.047832f, -0.019256f, +0.014852f, -0.001239f, -0.013597f, -0.021065f, +0.004012f, + +0.055803f, +0.007402f, -0.008859f, -0.012608f, -0.004144f, +0.015054f, -0.014688f, +0.011662f, +0.004577f, -0.006306f, + -0.016538f, -0.012735f, -0.005619f, +0.023006f, +0.007098f, -0.007941f, +0.012483f, +0.009002f, +0.017084f, +0.003922f, + +0.000353f, -0.000366f, +0.003689f, +0.005180f, -0.015234f, +0.006024f, -0.008689f, +0.013658f, -0.011325f, -0.018645f, + -0.002469f, -0.010069f, -0.011037f, -0.005965f, +0.018173f, +0.021376f, +0.020372f, +0.004706f, +0.015567f, -0.007456f, + -0.004939f, +0.009775f, -0.007806f, -0.003639f, +0.009774f, +0.005837f, -0.006858f, -0.009220f, -0.005883f, +0.005757f, + +0.003670f, +0.001388f, -0.003481f, -0.006796f, -0.003728f, +0.004040f, +0.002947f, +0.001210f, -0.001768f, +0.003065f, + +0.000672f, +0.000558f, +0.004123f, +0.001069f, +0.000643f, -0.000293f, +0.006997f, +0.002460f, +0.002124f, +0.000947f, + +0.000795f, +0.001840f, -0.002087f, -0.002123f, -0.002400f, +0.000913f, -0.000636f, -0.001917f, -0.002078f, +0.000134f, + +0.000737f, -0.004514f, +0.000253f, -0.000327f, +0.001491f, +0.000813f + }, + { + -0.008120f, -0.227064f, +0.021198f, +0.112222f, -0.009170f, -0.012254f, +0.007459f, -0.011228f, -0.006581f, -0.005898f, + -0.012115f, -0.002394f, -0.005866f, -0.002674f, +0.019528f, -0.016884f, +0.018703f, +0.011547f, -0.002335f, -0.014016f, + +0.012251f, +0.000701f, +0.018886f, +0.023301f, +0.016637f, +0.014709f, -0.004432f, +0.000890f, +0.024248f, -0.009691f, + +0.010895f, +0.021926f, +0.005861f, +0.009087f, -0.001335f, +0.008556f, -0.003152f, +0.006639f, -0.005550f, -0.003457f, + -0.005431f, -0.010405f, -0.011975f, -0.007254f, -0.005447f, +0.001892f, -0.002477f, +0.006774f, -0.005676f, +0.003231f, + +0.002226f, -0.007278f, +0.008297f, +0.007594f, -0.003142f, -0.000800f, +0.004831f, +0.004034f, +0.004354f, +0.000047f, + +0.002021f, -0.001105f, +0.003935f, -0.002009f, +0.003311f, +0.005097f, +0.006280f, +0.003334f, -0.002389f, +0.001613f, + +0.002153f, +0.003859f, -0.004116f, +0.000163f, +0.002603f, -0.002285f, -0.003892f, +0.001451f, +0.002289f, +0.001566f, + +0.001126f, +0.001811f, -0.001791f, -0.002499f, -0.001470f, +0.000542f, -0.001662f, -0.000119f, +0.000230f, +0.000267f, + +0.000806f, +0.000003f, +0.000907f, +0.001609f, +0.000166f, +0.000247f + }, + { + +0.002693f, +0.054382f, -0.008615f, +0.006393f, -0.003572f, +0.001591f, +0.004992f, -0.007401f, -0.000983f, +0.001613f, + -0.003651f, +0.018568f, +0.003458f, +0.015158f, -0.011986f, -0.016915f, -0.023840f, +0.027819f, +0.043330f, -0.031962f, + -0.012797f, -0.014354f, -0.012446f, -0.007604f, +0.001089f, +0.032814f, -0.003248f, +0.017535f, +0.011570f, -0.000677f, + +0.004050f, +0.010350f, +0.009851f, +0.003504f, +0.005346f, -0.004242f, +0.017058f, -0.004545f, +0.014312f, -0.004028f, + +0.001538f, -0.003477f, +0.001681f, +0.001984f, +0.002159f, -0.000732f, +0.001772f, +0.004445f, +0.004057f, +0.004594f, + -0.006129f, -0.002600f, -0.000842f, +0.012244f, +0.006255f, -0.012907f, +0.014009f, +0.002869f, -0.003336f, +0.012034f, + +0.006458f, +0.005374f, +0.001342f, -0.003271f, +0.001390f, +0.002309f, +0.000048f, -0.000004f, +0.004905f, +0.000052f, + +0.000730f, +0.004160f, +0.002521f, +0.001928f, -0.004171f, +0.000872f, +0.002263f, +0.001950f, +0.003073f, -0.001024f, + +0.002492f, -0.001033f, -0.001315f, -0.002195f, -0.000769f, -0.001165f, +0.000343f, -0.000883f, -0.003035f, +0.000276f, + -0.003377f, +0.002175f, +0.000824f, +0.000895f, +0.001987f, -0.000885f + }, + { + -0.013429f, -0.422868f, +0.010710f, +0.080244f, +0.010914f, +0.001576f, +0.019343f, -0.008527f, -0.018994f, -0.019781f, + -0.000918f, +0.010869f, -0.025070f, -0.030498f, -0.009683f, -0.017911f, -0.011267f, -0.015120f, -0.016208f, -0.012935f, + -0.011027f, +0.014988f, -0.006261f, +0.003879f, +0.014977f, -0.012675f, +0.006454f, -0.020541f, +0.002392f, +0.005549f, + -0.002442f, -0.000360f, +0.016166f, -0.008518f, +0.009052f, -0.001073f, -0.009916f, -0.004416f, -0.009225f, -0.002692f, + +0.014169f, +0.018121f, -0.000295f, -0.001929f, -0.002237f, -0.005487f, +0.005644f, -0.014529f, +0.001591f, -0.000107f, + +0.003264f, -0.002954f, +0.003397f, -0.004348f, +0.007442f, +0.005153f, -0.005554f, +0.001980f, +0.006724f, -0.010061f, + +0.000647f, +0.007181f, -0.006475f, -0.000930f, +0.000906f, -0.003042f, +0.001451f, -0.000099f, -0.001594f, -0.001225f, + +0.002981f, -0.002089f, +0.001651f, -0.003423f, +0.000782f, +0.000890f, +0.002733f, +0.004185f, -0.004431f, +0.000100f, + +0.000731f, +0.000185f, -0.000322f, +0.001371f, -0.001841f, -0.000352f, +0.000884f, +0.000115f, +0.002534f, -0.003411f, + +0.000893f, +0.001488f, -0.000977f, +0.000387f, +0.000389f, -0.000825f + }, + { + +0.000998f, +0.002749f, +0.002208f, +0.001410f, -0.002022f, +0.000768f, +0.001002f, +0.006076f, -0.008424f, +0.000744f, + +0.000536f, +0.010068f, -0.003694f, +0.011839f, +0.078404f, +0.001993f, -0.000279f, +0.007055f, +0.012862f, +0.000192f, + +0.000174f, +0.004667f, +0.029667f, -0.039310f, -0.007205f, +0.010213f, -0.003898f, +0.004904f, +0.006619f, +0.066304f, + +0.029115f, -0.026066f, +0.010105f, +0.001606f, +0.013636f, +0.006013f, -0.005040f, +0.003946f, -0.005725f, +0.004515f, + +0.008531f, -0.004006f, -0.000095f, -0.011667f, +0.000610f, +0.001030f, +0.001511f, -0.008665f, -0.000064f, +0.002372f, + -0.007009f, +0.007578f, -0.003983f, -0.014825f, +0.005084f, +0.003376f, -0.003679f, -0.000023f, -0.008990f, +0.010180f, + +0.000638f, +0.002707f, -0.000913f, -0.000040f, -0.001609f, +0.000760f, +0.002177f, -0.001817f, +0.000305f, +0.000703f, + -0.005926f, +0.001310f, -0.000281f, +0.001498f, -0.000550f, -0.004457f, -0.002276f, +0.004033f, +0.000188f, -0.002342f, + +0.001320f, +0.002160f, +0.002330f, +0.000610f, -0.001355f, -0.000116f, -0.000812f, -0.005183f, -0.002027f, -0.001643f, + -0.001982f, -0.000335f, -0.003389f, -0.000954f, -0.000910f, -0.001610f + }, + { + +0.123324f, -0.210513f, -0.076212f, -0.052175f, +0.042631f, -0.011477f, -0.020639f, +0.016242f, +0.033074f, +0.006729f, + +0.006122f, -0.000108f, -0.030211f, -0.008452f, -0.014403f, +0.028409f, -0.006584f, +0.008410f, +0.003770f, -0.002484f, + -0.012089f, -0.010916f, +0.018916f, +0.019316f, +0.021207f, +0.004597f, -0.002572f, -0.006358f, +0.010527f, +0.001309f, + -0.000512f, +0.015548f, -0.001372f, +0.000259f, -0.004866f, -0.026292f, -0.009118f, -0.027783f, +0.012553f, -0.005310f, + +0.009769f, -0.001807f, +0.005738f, +0.005121f, +0.008051f, +0.013962f, -0.013225f, -0.002811f, +0.001005f, -0.002755f, + -0.004992f, +0.004983f, -0.005643f, -0.007221f, -0.003701f, +0.005658f, +0.001361f, -0.001442f, +0.001194f, +0.003957f, + +0.000527f, -0.006452f, +0.011174f, +0.002760f, -0.000921f, -0.003384f, -0.004459f, -0.001779f, +0.006198f, +0.003760f, + +0.001314f, -0.002667f, -0.000267f, -0.000207f, +0.004028f, +0.001708f, +0.000126f, +0.003616f, -0.002960f, +0.000714f, + +0.002966f, -0.002561f, -0.004155f, -0.001329f, -0.001301f, +0.003748f, +0.000687f, -0.001027f, +0.002666f, +0.000428f, + +0.000017f, -0.001198f, +0.001037f, -0.000502f, +0.000074f, -0.001370f + }, + { + -0.000322f, +0.011957f, +0.003842f, -0.001728f, -0.004438f, +0.001158f, -0.000238f, -0.001481f, +0.010860f, +0.004349f, + -0.016968f, +0.006677f, +0.022088f, -0.031658f, +0.022326f, +0.030822f, +0.014106f, +0.014208f, -0.017331f, -0.031254f, + +0.008199f, -0.036111f, +0.020272f, -0.048952f, -0.000973f, +0.003203f, -0.013508f, +0.002936f, +0.001588f, +0.014909f, + -0.008746f, -0.001711f, +0.005169f, +0.013123f, -0.010099f, +0.006739f, +0.001951f, -0.000034f, +0.015070f, -0.009921f, + -0.002817f, -0.002645f, +0.001713f, +0.003864f, +0.003842f, +0.005209f, -0.008929f, +0.004030f, +0.008044f, -0.003059f, + -0.011568f, +0.009424f, +0.003396f, +0.013125f, -0.008277f, +0.000484f, -0.000648f, +0.006007f, +0.001453f, +0.005623f, + -0.004409f, +0.001813f, -0.003637f, -0.002909f, +0.003562f, -0.005861f, +0.000234f, +0.002627f, +0.004047f, +0.001886f, + -0.004956f, +0.001877f, -0.001820f, -0.001977f, +0.000522f, +0.002058f, -0.000793f, -0.002223f, +0.004495f, -0.003104f, + -0.000395f, -0.000158f, +0.000015f, -0.000782f, -0.002666f, +0.002244f, +0.002510f, -0.000184f, +0.000061f, -0.000130f, + -0.000779f, -0.002544f, -0.000742f, -0.000109f, +0.000380f, -0.001032f + }, + { + +0.011240f, -0.341420f, -0.030824f, -0.034759f, +0.023643f, -0.037394f, -0.037886f, -0.001822f, +0.028006f, +0.020793f, + +0.002947f, +0.006104f, +0.007667f, -0.015367f, -0.008460f, -0.007980f, -0.021425f, +0.014715f, +0.008409f, -0.000886f, + +0.006027f, +0.014074f, -0.016531f, -0.001158f, -0.009306f, -0.000443f, -0.017661f, -0.008964f, +0.000528f, -0.005933f, + -0.018560f, +0.010162f, -0.015330f, +0.010353f, +0.003750f, -0.005953f, -0.011839f, +0.005387f, +0.011858f, +0.007452f, + +0.001492f, +0.003545f, +0.006844f, -0.004077f, +0.004275f, +0.017543f, -0.011478f, +0.000735f, +0.004842f, +0.006343f, + -0.002527f, -0.004275f, +0.000998f, -0.000168f, -0.001651f, -0.004794f, +0.001664f, -0.002238f, -0.002747f, +0.002908f, + +0.004162f, +0.000116f, -0.001231f, +0.001352f, +0.003993f, -0.000445f, -0.000733f, -0.000841f, +0.001041f, +0.001092f, + +0.002765f, +0.001266f, +0.001822f, +0.000680f, +0.002003f, +0.001775f, -0.001838f, -0.001866f, +0.002980f, +0.000608f, + -0.003155f, -0.001671f, -0.000034f, -0.004920f, +0.000539f, +0.003230f, +0.001972f, -0.002547f, +0.000044f, +0.002627f, + -0.002298f, +0.002179f, -0.000664f, -0.001140f, +0.000243f, +0.003176f + }, + { + +0.006043f, -0.095977f, +0.009845f, -0.002797f, +0.003173f, +0.023242f, +0.022813f, -0.006944f, +0.008377f, -0.004302f, + +0.009714f, +0.002245f, +0.022282f, +0.012242f, +0.007597f, +0.005213f, +0.024180f, +0.003662f, -0.007640f, -0.022468f, + +0.002449f, -0.015311f, -0.005121f, -0.003462f, -0.014400f, -0.013775f, +0.006820f, -0.007602f, -0.003759f, +0.007113f, + -0.002329f, -0.009480f, -0.021727f, -0.013964f, -0.006704f, +0.000009f, -0.000149f, -0.006206f, -0.012867f, +0.001264f, + -0.003342f, +0.013347f, +0.004539f, -0.002659f, -0.002153f, +0.002404f, +0.003318f, -0.006026f, +0.002295f, -0.002406f, + +0.003454f, -0.004795f, -0.004030f, -0.007712f, +0.005390f, +0.002636f, +0.007247f, -0.000199f, +0.000478f, -0.002280f, + +0.003911f, +0.002971f, -0.007057f, +0.006773f, +0.005444f, +0.004890f, +0.006040f, +0.003217f, -0.000298f, -0.003207f, + -0.003073f, -0.001316f, -0.000778f, -0.000170f, +0.003680f, +0.000055f, -0.000328f, +0.003341f, +0.002787f, -0.003453f, + -0.001392f, -0.003577f, +0.000627f, +0.000492f, -0.004085f, +0.001720f, +0.003989f, +0.000314f, -0.001355f, -0.001227f, + +0.001968f, +0.000121f, -0.000753f, +0.001708f, +0.001861f, -0.001420f + }, + { + -0.063224f, +0.064837f, +0.023609f, -0.000171f, +0.016411f, -0.047169f, -0.002791f, +0.037731f, -0.015979f, -0.016445f, + -0.002680f, -0.010972f, +0.008192f, -0.002001f, -0.007220f, -0.016947f, +0.030219f, +0.004503f, +0.001987f, +0.004883f, + +0.002452f, -0.001614f, +0.024467f, +0.010316f, +0.008288f, -0.008854f, -0.004478f, -0.012389f, -0.010618f, -0.000898f, + -0.014923f, +0.003913f, -0.004616f, -0.014281f, -0.003939f, -0.013706f, -0.002334f, -0.029333f, +0.003380f, +0.011665f, + -0.005729f, +0.012190f, +0.011836f, +0.007715f, -0.001727f, +0.015876f, -0.006488f, -0.002426f, +0.016958f, +0.012508f, + -0.004674f, -0.004641f, +0.007211f, -0.001023f, -0.011067f, +0.001174f, -0.001937f, +0.000562f, +0.003650f, +0.001428f, + +0.003520f, -0.001934f, +0.006563f, -0.002113f, +0.007984f, +0.002068f, +0.001349f, +0.005313f, +0.002249f, -0.000515f, + -0.005078f, +0.003585f, +0.004568f, -0.001353f, +0.002438f, -0.000941f, +0.001451f, -0.000948f, +0.001353f, -0.000688f, + -0.000723f, +0.003947f, +0.000408f, +0.001941f, -0.002078f, -0.001768f, +0.000599f, -0.002086f, +0.001449f, -0.000557f, + +0.002429f, +0.003463f, -0.002046f, +0.004322f, -0.002713f, +0.001468f + }, + { + +0.004978f, +0.034531f, -0.018087f, -0.001310f, +0.000123f, +0.005080f, -0.002888f, -0.009890f, +0.007968f, -0.005254f, + +0.005946f, +0.006976f, -0.020453f, -0.024136f, -0.025260f, +0.029320f, -0.033664f, -0.005376f, +0.001750f, +0.011479f, + -0.021483f, -0.079590f, +0.066407f, -0.026254f, +0.034477f, +0.037865f, +0.002474f, -0.029726f, +0.021907f, -0.001464f, + +0.013002f, +0.018877f, -0.000964f, +0.008805f, -0.001919f, +0.011404f, +0.008972f, -0.002562f, +0.009804f, +0.008660f, + +0.011744f, +0.005605f, -0.004231f, +0.000641f, -0.000008f, +0.007274f, -0.000755f, -0.001799f, +0.003220f, +0.003122f, + +0.000080f, +0.001350f, +0.000212f, +0.000073f, -0.011167f, +0.009476f, -0.001458f, +0.002135f, +0.004677f, +0.001268f, + -0.010574f, -0.006792f, +0.006871f, -0.001021f, -0.003355f, -0.000263f, -0.000138f, -0.010015f, +0.013223f, -0.001824f, + +0.001734f, -0.002756f, -0.001939f, +0.003547f, +0.000993f, +0.003727f, +0.001098f, -0.001689f, +0.000664f, +0.002336f, + -0.003869f, -0.001200f, +0.001603f, +0.001419f, +0.000659f, +0.001323f, -0.000018f, +0.004606f, -0.004053f, +0.000076f, + +0.001661f, -0.002673f, +0.000093f, -0.001080f, +0.001177f, +0.002269f + }, + { + -0.030834f, -0.099807f, +0.013495f, -0.001258f, -0.000529f, -0.034558f, -0.023609f, -0.012537f, +0.006390f, +0.017900f, + -0.030546f, +0.049529f, -0.026754f, +0.046094f, -0.031629f, -0.010045f, -0.021577f, -0.012201f, -0.016653f, -0.015666f, + -0.016036f, -0.001090f, +0.008552f, -0.001223f, +0.000013f, +0.018654f, +0.009466f, +0.014859f, -0.001340f, -0.002171f, + +0.006597f, +0.006805f, -0.001189f, -0.013280f, -0.010690f, -0.006430f, -0.004836f, -0.002810f, -0.003851f, -0.015068f, + +0.005780f, -0.018019f, +0.006208f, -0.011338f, -0.020808f, +0.006928f, -0.006529f, +0.004219f, -0.016183f, +0.000863f, + -0.002522f, -0.006202f, -0.000021f, +0.002203f, -0.002431f, +0.000500f, -0.006359f, -0.001112f, -0.000739f, +0.012999f, + +0.002467f, -0.000133f, +0.003345f, +0.001129f, +0.004425f, +0.002089f, -0.006151f, +0.003538f, -0.000386f, +0.007600f, + +0.000200f, -0.001669f, -0.000039f, +0.001842f, +0.001172f, -0.003726f, +0.000571f, +0.003921f, +0.001024f, -0.001872f, + -0.001670f, +0.002019f, -0.003073f, -0.002498f, -0.001527f, +0.002294f, +0.000994f, +0.001518f, -0.001858f, +0.000642f, + -0.002728f, +0.000533f, -0.002988f, -0.001133f, -0.000223f, -0.001157f + }, + { + -0.010783f, +0.015512f, +0.027078f, +0.015237f, -0.004103f, +0.000291f, +0.005702f, +0.008483f, +0.008576f, +0.013969f, + +0.000636f, -0.005189f, -0.001510f, +0.079230f, +0.074696f, +0.003793f, -0.014813f, -0.024812f, +0.019045f, +0.014813f, + -0.016534f, +0.010695f, -0.007381f, -0.005237f, +0.005363f, -0.022487f, -0.024811f, -0.010040f, -0.000700f, +0.006187f, + -0.019869f, -0.008013f, -0.012912f, -0.007732f, +0.010125f, -0.017984f, +0.004684f, +0.014727f, -0.003657f, -0.014718f, + -0.003375f, +0.003463f, +0.012643f, -0.006104f, +0.002347f, +0.021497f, +0.007404f, -0.001824f, -0.004573f, -0.004336f, + -0.002028f, +0.001795f, -0.007454f, -0.004588f, +0.000395f, +0.005469f, +0.009232f, +0.003695f, +0.007759f, +0.010109f, + +0.004204f, -0.003080f, +0.004347f, -0.008688f, -0.004101f, -0.011213f, -0.004097f, -0.004230f, +0.004009f, +0.000025f, + -0.005092f, +0.000009f, -0.001628f, -0.003084f, -0.004898f, -0.001307f, -0.002787f, -0.000599f, +0.000690f, +0.003721f, + +0.003452f, -0.006265f, +0.005242f, +0.000190f, -0.000964f, -0.002400f, +0.001859f, -0.001816f, -0.000559f, -0.000114f, + -0.001896f, -0.002300f, -0.002821f, +0.001382f, +0.003279f, +0.000829f + } + }, + { + { + +0.035018f, +0.239980f, -0.052332f, -0.017259f, -0.002825f, +0.004293f, -0.010266f, +0.040083f, -0.023747f, -0.027593f, + -0.037268f, -0.043601f, +0.000181f, -0.032665f, +0.001047f, +0.014380f, -0.010490f, +0.014891f, +0.002250f, +0.030241f, + +0.002972f, -0.008825f, -0.012835f, -0.007138f, -0.004193f, +0.000374f, -0.008281f, -0.011061f, -0.013503f, -0.013633f, + -0.017722f, -0.011060f, +0.005005f, +0.001768f, -0.003834f, +0.008803f, +0.004757f, -0.006199f, -0.001923f, +0.007813f, + +0.004090f, -0.005585f, +0.017244f, -0.010475f, -0.003834f, -0.017579f, +0.004693f, +0.004518f, +0.001574f, +0.007927f, + -0.010073f, +0.006150f, -0.001787f, -0.003885f, +0.005797f, -0.004974f, +0.008216f, +0.012277f, +0.008733f, +0.000552f, + +0.003406f, +0.000005f, -0.004020f, -0.006317f, -0.000016f, +0.002275f, +0.001073f, +0.001951f, +0.000966f, +0.001415f, + -0.001351f, +0.001112f, -0.003103f, -0.001747f, +0.004523f, -0.000015f, +0.005875f, -0.004967f, -0.001199f, +0.001981f, + +0.000336f, -0.001559f, +0.001570f, +0.001262f, +0.000587f, -0.001269f, +0.000777f, +0.000549f, -0.000935f, -0.001220f, + +0.001753f, -0.000169f, -0.000435f, +0.002369f, -0.001959f, +0.000722f + }, + { + +0.000365f, -0.099400f, +0.014483f, +0.015351f, -0.003123f, -0.004192f, +0.007008f, -0.009654f, +0.006366f, -0.002153f, + +0.024672f, -0.000855f, -0.010632f, +0.008443f, -0.047698f, +0.034834f, -0.014817f, -0.025206f, +0.028645f, +0.009071f, + -0.005117f, -0.016398f, -0.039187f, -0.005352f, -0.025319f, -0.013321f, -0.006416f, +0.011524f, +0.015492f, +0.023544f, + -0.003597f, +0.021817f, +0.007375f, -0.001167f, -0.017965f, -0.012008f, -0.018483f, +0.005851f, -0.006743f, -0.000327f, + +0.005841f, +0.001805f, -0.014359f, -0.002385f, -0.000913f, +0.006786f, -0.014632f, -0.003071f, -0.006269f, +0.008195f, + +0.012860f, -0.005622f, -0.003246f, +0.002470f, -0.010087f, +0.003525f, +0.001827f, -0.001383f, -0.004211f, -0.004547f, + +0.010103f, -0.006676f, -0.002433f, +0.001452f, +0.006859f, +0.005875f, +0.002958f, -0.005064f, -0.000656f, -0.000454f, + -0.000689f, -0.003685f, +0.004217f, +0.002504f, +0.003857f, +0.004886f, -0.001463f, +0.002242f, -0.001382f, +0.001723f, + -0.001457f, -0.000090f, +0.000084f, -0.000517f, -0.003766f, +0.000093f, +0.000345f, -0.000340f, -0.004239f, -0.004280f, + -0.001859f, +0.002209f, -0.000643f, +0.000561f, -0.002667f, -0.000719f + }, + { + -0.006696f, +0.194139f, +0.022079f, -0.024609f, -0.004437f, +0.006175f, -0.007977f, -0.011567f, -0.007784f, +0.018027f, + +0.031257f, -0.005999f, +0.020528f, -0.010865f, -0.016475f, +0.011831f, -0.006261f, +0.031288f, +0.008004f, +0.017871f, + +0.005727f, -0.016748f, -0.008405f, +0.019282f, +0.007966f, -0.007739f, +0.002196f, -0.000223f, +0.014674f, +0.001202f, + +0.011388f, +0.002841f, -0.003457f, +0.015418f, -0.004180f, +0.000584f, -0.016162f, +0.016387f, +0.000884f, +0.000519f, + +0.008153f, -0.003427f, -0.010757f, -0.008535f, +0.007246f, +0.008842f, +0.004652f, -0.005335f, +0.017064f, -0.000975f, + -0.005322f, +0.005031f, -0.003625f, -0.007790f, -0.000385f, +0.003647f, -0.005166f, -0.000898f, +0.001686f, +0.006563f, + +0.003834f, +0.004404f, +0.001088f, +0.001418f, +0.000611f, +0.001143f, +0.001350f, +0.001731f, -0.002511f, +0.002557f, + -0.000672f, +0.001190f, +0.001424f, -0.003318f, -0.001894f, -0.000077f, +0.005293f, +0.001683f, +0.006198f, +0.004071f, + +0.001799f, +0.002548f, -0.001564f, +0.000782f, +0.000982f, +0.001065f, +0.000424f, -0.000734f, +0.002686f, +0.002454f, + +0.002495f, -0.000241f, +0.001566f, -0.000797f, +0.001081f, +0.000627f + }, + { + +0.047025f, -0.205989f, -0.030643f, +0.093775f, -0.007141f, -0.008026f, +0.006317f, -0.004423f, -0.011461f, -0.014440f, + +0.008250f, +0.017380f, +0.010228f, +0.008608f, +0.014309f, -0.023587f, -0.009834f, -0.017353f, -0.000983f, -0.007972f, + +0.005621f, -0.020368f, -0.001327f, +0.007010f, -0.003043f, +0.005612f, -0.003355f, -0.023581f, -0.002531f, -0.011954f, + +0.003800f, -0.001789f, -0.012892f, +0.005870f, -0.000867f, +0.008136f, -0.000346f, +0.003362f, -0.008821f, -0.008378f, + +0.011075f, +0.009336f, -0.004330f, +0.006987f, +0.004319f, +0.003239f, -0.005402f, +0.006504f, -0.010290f, +0.001062f, + +0.002412f, -0.006645f, +0.009404f, +0.008892f, -0.003011f, -0.000243f, +0.006967f, +0.006138f, +0.000481f, -0.006925f, + -0.001525f, -0.001872f, +0.001407f, -0.004262f, -0.002599f, -0.002692f, -0.002003f, +0.001550f, -0.002035f, -0.003401f, + -0.003356f, +0.002343f, -0.000955f, +0.002499f, +0.002407f, -0.001074f, -0.000063f, +0.000105f, -0.003476f, -0.001796f, + +0.001063f, +0.001813f, -0.000449f, -0.000746f, +0.000569f, +0.002220f, -0.002320f, -0.000647f, +0.000820f, -0.001348f, + -0.002198f, -0.001130f, +0.001384f, +0.002178f, +0.000295f, +0.001666f + }, + { + -0.001471f, +0.055197f, -0.004441f, +0.011250f, -0.000018f, +0.000919f, +0.002135f, -0.006670f, -0.000126f, -0.001432f, + -0.008694f, +0.010190f, -0.006588f, +0.014465f, +0.001716f, +0.022362f, +0.012385f, -0.042754f, -0.019381f, -0.019512f, + -0.009468f, +0.002851f, +0.005957f, +0.016197f, +0.003984f, +0.039273f, +0.023654f, +0.017415f, -0.012030f, -0.014820f, + -0.012175f, -0.007648f, -0.010673f, -0.014457f, +0.000569f, -0.022079f, +0.007922f, -0.004659f, +0.001329f, -0.017026f, + -0.004962f, -0.007940f, -0.001307f, +0.009916f, -0.002714f, -0.006125f, -0.003270f, -0.002851f, +0.007413f, +0.010667f, + -0.006953f, +0.001891f, +0.001532f, +0.010089f, +0.004842f, -0.018087f, +0.007659f, -0.001868f, -0.006920f, +0.007341f, + -0.000742f, +0.000544f, +0.001979f, -0.001690f, -0.002628f, +0.000314f, +0.002150f, +0.003488f, +0.001346f, -0.004765f, + +0.001016f, +0.001031f, -0.000141f, +0.000361f, -0.006199f, -0.002092f, +0.000140f, +0.000745f, -0.001485f, -0.003892f, + +0.001188f, -0.000078f, +0.003337f, +0.000437f, -0.002066f, -0.000992f, +0.001013f, +0.001687f, -0.000620f, +0.002537f, + -0.002288f, +0.001089f, +0.000037f, +0.001238f, +0.000903f, -0.002175f + }, + { + +0.073306f, -0.373314f, -0.023867f, +0.051845f, -0.020349f, +0.004839f, +0.011388f, -0.020634f, -0.009290f, -0.018196f, + -0.007426f, +0.013830f, -0.020476f, -0.003306f, -0.017745f, -0.013139f, -0.000262f, -0.020590f, -0.000882f, -0.013368f, + -0.030928f, +0.019107f, +0.009684f, +0.007098f, +0.008253f, -0.005313f, +0.005035f, -0.015572f, +0.018321f, +0.018458f, + +0.013154f, +0.007112f, +0.003609f, -0.018790f, +0.007977f, +0.001743f, +0.003671f, +0.004863f, -0.000968f, -0.003480f, + +0.000888f, +0.017325f, +0.010186f, -0.001986f, -0.006519f, -0.004323f, +0.011873f, -0.006416f, +0.004079f, +0.003454f, + -0.001258f, -0.013901f, -0.000065f, -0.004231f, -0.000614f, +0.002261f, -0.006165f, +0.002731f, +0.006909f, -0.008715f, + +0.004624f, +0.005618f, -0.010165f, -0.006614f, +0.000679f, +0.000926f, +0.001595f, +0.000855f, -0.001206f, -0.004518f, + +0.002851f, -0.000257f, +0.004772f, +0.001654f, +0.002692f, +0.001338f, +0.000312f, +0.005259f, -0.002285f, +0.000753f, + +0.000253f, +0.001706f, +0.001090f, +0.002641f, -0.002520f, -0.001458f, -0.000801f, -0.001181f, +0.002508f, -0.002476f, + +0.001660f, +0.000335f, -0.002540f, +0.001907f, +0.001679f, -0.000719f + }, + { + -0.002053f, -0.003406f, +0.003269f, +0.002216f, +0.001699f, +0.001001f, -0.000915f, +0.004086f, -0.006630f, +0.002610f, + +0.000754f, +0.012978f, -0.005312f, -0.002806f, +0.057792f, +0.026635f, -0.001731f, -0.001228f, +0.031739f, +0.019965f, + +0.005247f, -0.000428f, +0.041121f, -0.046964f, -0.029072f, +0.017264f, +0.005996f, +0.005209f, -0.019472f, +0.032127f, + +0.007217f, -0.037032f, +0.008944f, -0.001916f, +0.009761f, -0.004590f, -0.013012f, -0.004067f, -0.016873f, -0.008472f, + +0.005126f, -0.002470f, +0.001699f, -0.012251f, -0.001924f, -0.005666f, +0.004236f, -0.012253f, -0.007232f, -0.001671f, + -0.012427f, +0.006962f, +0.000056f, -0.016807f, +0.001318f, +0.005664f, -0.004188f, +0.001116f, -0.005026f, +0.010483f, + -0.000409f, +0.008547f, +0.006345f, +0.000602f, -0.000312f, +0.000843f, -0.003089f, -0.004161f, +0.001725f, +0.000910f, + -0.005563f, +0.001402f, -0.000881f, +0.001208f, -0.002168f, -0.004621f, -0.002026f, +0.005778f, +0.003658f, +0.000755f, + +0.003364f, +0.000599f, -0.001445f, -0.000655f, +0.000061f, -0.000146f, +0.001530f, +0.000415f, +0.000815f, +0.001365f, + +0.002498f, +0.001675f, -0.002965f, +0.000873f, -0.000025f, -0.000686f + }, + { + -0.124916f, -0.437420f, +0.029593f, -0.081998f, -0.017356f, -0.013766f, -0.007561f, -0.002320f, +0.004512f, -0.007746f, + +0.006776f, +0.011944f, +0.009649f, +0.000513f, -0.020294f, +0.030960f, -0.010475f, +0.008772f, +0.012471f, -0.023974f, + -0.003620f, +0.013402f, +0.032676f, +0.019215f, -0.006231f, -0.011012f, -0.014165f, -0.008966f, +0.015307f, -0.005996f, + -0.011511f, +0.010134f, -0.000676f, -0.003337f, -0.018200f, -0.034314f, -0.001520f, -0.013443f, +0.009047f, -0.007332f, + +0.005054f, -0.007566f, +0.004223f, +0.009292f, -0.000002f, +0.007526f, -0.006278f, -0.000437f, +0.000480f, -0.007247f, + -0.010002f, +0.006558f, +0.009307f, +0.007478f, +0.005606f, +0.006677f, -0.006354f, -0.000936f, +0.002010f, +0.001409f, + +0.001815f, -0.005347f, +0.009461f, -0.001578f, +0.000197f, +0.002238f, -0.000888f, +0.001012f, +0.004071f, +0.000922f, + +0.000760f, -0.003248f, +0.000837f, -0.001768f, -0.000473f, +0.001821f, -0.000952f, +0.003321f, -0.000053f, +0.000258f, + +0.000810f, -0.002578f, -0.002599f, -0.001004f, -0.001730f, +0.003493f, +0.000990f, -0.000358f, +0.000154f, -0.002019f, + +0.000419f, -0.001663f, +0.002024f, +0.000977f, +0.000062f, -0.001800f + }, + { + -0.002348f, -0.008445f, -0.011715f, +0.003498f, +0.001477f, -0.000330f, +0.001405f, -0.005667f, -0.003296f, +0.007592f, + -0.007698f, +0.005468f, +0.013149f, -0.063174f, -0.005255f, +0.006484f, -0.013725f, +0.004175f, -0.020132f, -0.025271f, + +0.019812f, -0.023294f, +0.001798f, -0.075489f, -0.013069f, +0.001401f, -0.001788f, +0.012177f, +0.014503f, +0.012943f, + +0.002081f, +0.015193f, -0.005937f, +0.008876f, -0.005962f, +0.008924f, +0.013734f, +0.002106f, +0.012313f, -0.002932f, + -0.010650f, -0.004425f, +0.002941f, +0.002688f, -0.008402f, -0.000849f, -0.012433f, +0.004471f, +0.005971f, -0.001647f, + -0.003372f, +0.008310f, -0.011425f, +0.004431f, -0.005495f, -0.001074f, -0.003752f, +0.004340f, +0.001136f, +0.002540f, + -0.006948f, +0.006615f, -0.002794f, -0.002279f, +0.003647f, -0.003622f, +0.002729f, -0.001899f, +0.000517f, +0.002233f, + -0.002018f, +0.004242f, +0.000800f, -0.000725f, -0.000351f, +0.004299f, +0.001500f, -0.002920f, +0.003031f, -0.006048f, + -0.000902f, +0.003430f, -0.000665f, -0.001015f, +0.000857f, +0.002415f, -0.000402f, -0.002069f, +0.000088f, -0.000402f, + -0.000228f, -0.000070f, +0.001361f, -0.000979f, -0.000142f, +0.000291f + }, + { + -0.005340f, -0.382441f, +0.000295f, -0.012328f, +0.013760f, +0.001686f, +0.006215f, +0.000576f, +0.020831f, +0.001545f, + -0.021263f, -0.019745f, +0.000707f, +0.004414f, -0.008500f, +0.003360f, +0.006182f, +0.018968f, -0.004263f, -0.010817f, + +0.012975f, +0.012942f, -0.012362f, +0.004067f, -0.001124f, +0.015050f, +0.011745f, +0.008268f, +0.000924f, +0.011268f, + -0.018992f, +0.003533f, -0.012861f, +0.005315f, -0.003576f, +0.001242f, -0.005674f, -0.001675f, +0.001740f, -0.003358f, + -0.014018f, +0.000872f, +0.014414f, +0.002237f, -0.002256f, +0.014120f, -0.014460f, -0.003428f, +0.002022f, +0.007780f, + -0.001585f, -0.009394f, -0.004211f, +0.011527f, +0.004747f, -0.004027f, +0.003935f, -0.002919f, +0.001165f, +0.005529f, + +0.003579f, +0.004794f, -0.000675f, +0.000027f, +0.004468f, +0.007197f, +0.003424f, -0.001946f, -0.002680f, -0.003757f, + +0.002199f, +0.003219f, +0.003468f, +0.003175f, +0.001243f, +0.000253f, -0.006191f, -0.002232f, +0.002888f, +0.001696f, + +0.001742f, +0.002272f, +0.002090f, -0.003577f, -0.002042f, +0.000168f, +0.002625f, -0.000595f, +0.000115f, +0.001041f, + -0.001860f, +0.003056f, -0.000301f, -0.001736f, -0.000566f, +0.002715f + }, + { + -0.006592f, -0.075827f, +0.034423f, +0.010324f, +0.011657f, +0.002482f, +0.003982f, -0.006563f, +0.023342f, -0.010172f, + -0.002260f, -0.021451f, -0.008108f, +0.012030f, +0.015012f, -0.024287f, +0.030345f, +0.003487f, -0.025655f, +0.009306f, + +0.048511f, -0.010520f, +0.001620f, +0.009071f, -0.016210f, -0.013209f, +0.007526f, -0.008702f, -0.009566f, +0.022095f, + +0.009143f, -0.006658f, -0.009474f, -0.004675f, +0.000168f, +0.004862f, +0.003548f, -0.004570f, -0.017273f, -0.008159f, + -0.005379f, +0.015042f, -0.003807f, -0.002752f, -0.002240f, -0.010243f, -0.005797f, -0.013653f, -0.004326f, -0.007992f, + +0.000510f, -0.003015f, -0.003425f, -0.004713f, +0.006956f, -0.000907f, +0.004379f, -0.005592f, -0.004017f, +0.001148f, + +0.003504f, +0.001359f, -0.003654f, +0.005394f, +0.000267f, +0.004761f, +0.004131f, -0.003210f, -0.000994f, -0.006795f, + -0.005229f, -0.000347f, -0.002947f, -0.004001f, +0.000923f, -0.001457f, -0.001466f, +0.003038f, +0.003741f, -0.001224f, + +0.001623f, -0.002103f, +0.002887f, +0.003535f, -0.000853f, +0.002530f, +0.001803f, -0.000742f, -0.000680f, -0.002022f, + +0.000739f, -0.001484f, -0.002400f, +0.002471f, +0.000855f, -0.001636f + }, + { + +0.045068f, +0.219313f, +0.013851f, -0.004823f, -0.003134f, -0.042599f, +0.029310f, +0.025488f, -0.007911f, +0.000171f, + +0.010583f, +0.004260f, +0.015689f, +0.010222f, -0.012646f, -0.005163f, +0.024096f, +0.011210f, +0.001528f, -0.028515f, + -0.008374f, -0.005693f, +0.014204f, +0.003428f, +0.020679f, +0.009232f, -0.004248f, -0.015623f, +0.005926f, +0.007807f, + -0.018930f, +0.007553f, +0.006186f, -0.007572f, -0.004851f, +0.000798f, +0.023461f, -0.002522f, +0.021974f, +0.006615f, + -0.002807f, +0.022250f, -0.002444f, -0.014124f, -0.008855f, +0.010330f, +0.003019f, +0.002512f, +0.005910f, +0.002572f, + -0.005733f, -0.005979f, -0.003948f, -0.002523f, -0.008180f, -0.001448f, -0.003716f, -0.003513f, +0.000241f, -0.001548f, + -0.003867f, -0.005231f, +0.006988f, -0.003154f, +0.002353f, +0.000453f, -0.004745f, -0.000817f, -0.000713f, -0.003414f, + -0.005231f, +0.004248f, +0.004071f, +0.000198f, +0.002888f, -0.001143f, +0.003175f, +0.000231f, +0.003395f, +0.000269f, + -0.000601f, +0.001926f, -0.002234f, -0.001083f, -0.003680f, -0.002878f, -0.001352f, -0.004171f, +0.002454f, -0.000485f, + -0.000378f, +0.002976f, -0.001427f, +0.005088f, -0.000648f, +0.003456f + }, + { + -0.002948f, +0.063847f, +0.016003f, +0.007389f, +0.000463f, +0.003202f, +0.000967f, -0.014590f, +0.002247f, -0.004702f, + +0.002037f, +0.008678f, +0.008856f, +0.030812f, -0.051906f, -0.010807f, +0.008502f, +0.028856f, +0.020909f, +0.020592f, + +0.011353f, -0.047491f, +0.055941f, -0.017581f, +0.038878f, -0.010297f, +0.001253f, -0.010482f, +0.010425f, -0.017226f, + -0.004322f, +0.009515f, -0.019122f, +0.002391f, -0.009043f, +0.010320f, +0.003377f, +0.001042f, +0.017787f, -0.003566f, + -0.002306f, +0.001683f, +0.008552f, +0.010106f, -0.005059f, +0.009778f, +0.001648f, -0.008277f, -0.001759f, +0.007906f, + +0.006653f, +0.002112f, -0.006070f, -0.001265f, -0.012963f, +0.006098f, -0.007071f, +0.000122f, +0.004471f, +0.004944f, + -0.001959f, -0.004499f, +0.003052f, -0.003616f, -0.001945f, +0.002282f, +0.001983f, -0.007175f, +0.007356f, -0.005880f, + +0.004693f, +0.001111f, +0.001280f, +0.004211f, -0.000653f, -0.002213f, -0.000891f, -0.000223f, +0.002191f, +0.001000f, + -0.005245f, -0.001783f, +0.004378f, +0.002328f, -0.002093f, +0.000537f, -0.001441f, +0.003005f, -0.002130f, +0.000088f, + +0.000708f, -0.000845f, -0.001510f, -0.000735f, +0.000542f, +0.000522f + }, + { + +0.050682f, +0.006669f, +0.010230f, +0.005480f, -0.007760f, -0.013160f, +0.002654f, -0.014646f, -0.007164f, +0.013954f, + -0.030797f, +0.023518f, -0.021654f, +0.055475f, -0.051056f, +0.003631f, +0.030652f, +0.013143f, -0.018100f, -0.006077f, + +0.002033f, +0.003070f, -0.007625f, -0.018642f, -0.012370f, +0.013504f, +0.008478f, +0.003409f, -0.013554f, -0.009952f, + +0.006216f, +0.004850f, -0.000220f, -0.011801f, -0.008647f, -0.004792f, +0.005841f, +0.008963f, +0.008442f, -0.010182f, + -0.002063f, -0.012524f, +0.019177f, +0.006523f, -0.005612f, +0.016762f, -0.007546f, +0.002818f, -0.001699f, -0.000793f, + -0.013658f, -0.000699f, +0.004205f, +0.000990f, -0.000454f, +0.005486f, -0.000554f, -0.003152f, -0.003840f, +0.008181f, + -0.000881f, +0.004677f, +0.000357f, -0.007390f, +0.002499f, +0.004266f, -0.002317f, +0.004184f, -0.000513f, +0.005452f, + -0.003813f, -0.002397f, +0.001617f, +0.007040f, +0.004957f, -0.002924f, -0.000345f, +0.003845f, +0.003691f, +0.000185f, + -0.000485f, +0.005194f, +0.002964f, +0.001086f, +0.000571f, +0.005637f, +0.000458f, -0.003351f, -0.001642f, +0.002321f, + -0.001999f, +0.002499f, -0.000038f, -0.001037f, -0.000809f, -0.000305f + }, + { + +0.012427f, -0.001131f, -0.014686f, +0.013572f, +0.002325f, -0.005339f, +0.002757f, +0.013296f, +0.001141f, +0.010699f, + -0.004921f, -0.015143f, -0.004613f, -0.003544f, -0.054753f, +0.004476f, +0.034113f, -0.000322f, +0.004185f, +0.012886f, + -0.021103f, -0.019076f, -0.021063f, -0.002348f, +0.008128f, -0.007062f, -0.003301f, +0.020517f, +0.009895f, +0.019443f, + -0.025989f, -0.021410f, -0.004021f, +0.004959f, +0.007878f, -0.025243f, -0.010717f, +0.000714f, -0.010238f, -0.006563f, + +0.009287f, -0.004131f, -0.009883f, -0.006765f, -0.007782f, +0.004872f, -0.003272f, -0.004622f, -0.000366f, -0.000561f, + +0.002150f, -0.000877f, -0.009043f, +0.002455f, +0.005708f, +0.003132f, +0.005717f, -0.001090f, -0.006183f, -0.006860f, + -0.001922f, -0.002924f, +0.004203f, -0.008181f, +0.000115f, -0.001638f, +0.005293f, -0.004995f, -0.003085f, -0.003100f, + -0.001197f, -0.005558f, -0.005299f, -0.001547f, -0.007043f, +0.002064f, +0.000955f, -0.000751f, -0.003802f, +0.000628f, + +0.005531f, -0.007039f, +0.003971f, +0.000844f, -0.000530f, -0.001723f, +0.003402f, +0.001329f, +0.000808f, -0.000842f, + -0.001351f, +0.000202f, -0.001345f, +0.000905f, +0.001291f, +0.001898f + } + }, + { + { + -0.045963f, +0.163833f, +0.111563f, -0.032052f, +0.002102f, +0.003805f, +0.016171f, +0.001521f, -0.010484f, -0.039157f, + -0.018949f, -0.060641f, +0.009196f, -0.037046f, +0.003152f, +0.015591f, -0.002655f, +0.014579f, +0.015162f, +0.001955f, + +0.013456f, -0.003680f, -0.011640f, -0.007548f, -0.017575f, -0.008351f, +0.013449f, -0.012200f, -0.029508f, -0.005837f, + -0.030484f, -0.006107f, +0.000894f, +0.003227f, +0.002074f, +0.024992f, -0.013166f, -0.002138f, -0.002693f, +0.007367f, + +0.007301f, -0.000473f, +0.008619f, -0.004097f, -0.011429f, -0.003891f, -0.006642f, +0.017553f, -0.004184f, +0.002913f, + -0.011257f, +0.006939f, -0.001983f, -0.002006f, +0.010277f, -0.004923f, +0.003815f, +0.008698f, +0.023590f, -0.009292f, + +0.006388f, -0.001108f, -0.010179f, +0.001125f, +0.000566f, +0.002547f, +0.004008f, -0.003626f, +0.001614f, -0.003030f, + +0.004298f, +0.000031f, -0.000233f, -0.002753f, +0.005005f, +0.001091f, +0.001082f, -0.002335f, +0.001840f, -0.001998f, + +0.000387f, -0.000543f, +0.001875f, +0.002094f, -0.000098f, -0.001560f, +0.000299f, +0.004463f, -0.002923f, -0.001433f, + +0.000028f, -0.002405f, +0.002453f, +0.001532f, -0.000111f, -0.001364f + }, + { + -0.000018f, -0.043804f, -0.018253f, -0.007911f, +0.005997f, +0.002049f, -0.000697f, +0.010571f, -0.008157f, +0.007604f, + +0.018115f, -0.009747f, -0.016065f, +0.019654f, -0.048277f, +0.014491f, -0.002251f, -0.001937f, -0.013652f, +0.051239f, + -0.005932f, -0.050120f, -0.001849f, -0.019261f, -0.032129f, +0.002288f, +0.010234f, -0.018424f, +0.037635f, -0.000863f, + +0.009351f, +0.018293f, -0.000571f, +0.008392f, -0.021181f, -0.015491f, -0.006385f, -0.008746f, -0.007154f, +0.010438f, + +0.003060f, -0.005973f, -0.008408f, -0.005034f, -0.000173f, +0.005938f, -0.007734f, -0.003745f, -0.003261f, -0.000468f, + +0.008928f, +0.004188f, +0.001073f, -0.007889f, +0.001000f, -0.004315f, -0.001584f, +0.005202f, -0.010014f, -0.000268f, + +0.007988f, -0.004119f, -0.001025f, +0.002947f, +0.005665f, +0.000158f, +0.001033f, -0.001418f, +0.001710f, +0.000883f, + -0.002538f, -0.002236f, -0.003151f, +0.004678f, +0.001980f, +0.005595f, +0.001642f, +0.001484f, -0.001445f, -0.002911f, + +0.001378f, +0.000829f, +0.000362f, -0.002298f, -0.000861f, -0.000712f, +0.000135f, -0.000466f, -0.004225f, -0.003304f, + -0.001913f, +0.001069f, +0.002507f, -0.000834f, -0.003093f, -0.001304f + }, + { + +0.003609f, +0.221546f, +0.001904f, -0.021689f, -0.004448f, -0.005890f, -0.007477f, +0.000999f, -0.006279f, +0.013641f, + +0.023906f, -0.010522f, -0.008157f, +0.019922f, -0.001508f, +0.013058f, -0.025473f, +0.057604f, -0.021762f, +0.025913f, + +0.019303f, -0.017510f, +0.000498f, +0.006260f, +0.004658f, +0.000071f, +0.001931f, -0.013514f, +0.007881f, +0.012588f, + +0.011685f, +0.008850f, -0.013156f, -0.001599f, +0.011001f, -0.001556f, -0.008964f, +0.004728f, -0.001101f, +0.025099f, + -0.008289f, -0.003499f, -0.002638f, +0.003383f, +0.000904f, +0.002823f, -0.000731f, +0.002410f, -0.001513f, +0.015442f, + -0.003407f, -0.008171f, +0.005145f, -0.000653f, -0.009953f, +0.001864f, -0.011049f, +0.004772f, +0.001448f, +0.005642f, + +0.005874f, -0.000097f, +0.003040f, +0.000421f, +0.005580f, -0.001499f, -0.003654f, +0.006605f, -0.001139f, +0.006198f, + -0.004022f, -0.000131f, -0.000419f, -0.003547f, +0.001842f, +0.001545f, +0.001399f, +0.001768f, +0.007610f, +0.003508f, + +0.000236f, +0.001224f, -0.000168f, +0.000528f, +0.002811f, -0.002220f, +0.001981f, -0.000046f, +0.003797f, +0.000537f, + +0.000292f, +0.003637f, -0.002021f, +0.002270f, -0.000390f, +0.000912f + }, + { + -0.085083f, -0.082196f, +0.019797f, +0.064092f, +0.010870f, -0.001388f, -0.017058f, +0.009004f, -0.002385f, +0.006260f, + -0.001734f, +0.005537f, +0.008962f, +0.030006f, -0.002865f, -0.014876f, -0.001358f, -0.010242f, -0.023418f, -0.007732f, + +0.018260f, -0.013879f, -0.021274f, +0.003716f, +0.013157f, -0.021764f, +0.004040f, -0.015757f, -0.014266f, -0.004172f, + -0.000037f, -0.006205f, -0.016597f, -0.003515f, +0.015118f, +0.003595f, +0.003781f, -0.009862f, +0.003532f, +0.007068f, + +0.008919f, +0.011279f, -0.009272f, +0.003952f, +0.006096f, +0.013141f, -0.007669f, -0.005518f, +0.001817f, -0.009944f, + +0.004346f, -0.004584f, +0.002529f, +0.011038f, -0.002581f, +0.004740f, +0.006041f, +0.001765f, +0.001058f, -0.002683f, + -0.007008f, +0.002344f, -0.008859f, +0.003881f, -0.004854f, -0.004425f, -0.000221f, -0.000473f, -0.002610f, -0.000949f, + -0.007686f, -0.000078f, +0.003789f, +0.001758f, +0.001536f, -0.002695f, +0.001657f, -0.001575f, -0.000742f, -0.002468f, + -0.001699f, +0.001598f, +0.000863f, -0.000293f, +0.000844f, +0.000672f, -0.001474f, -0.001321f, +0.003208f, -0.002964f, + -0.001025f, -0.000379f, -0.001152f, +0.001261f, -0.001124f, +0.002944f + }, + { + +0.000227f, +0.047349f, +0.003151f, +0.011168f, -0.000679f, +0.000208f, -0.000775f, -0.003328f, +0.000655f, -0.003736f, + -0.003329f, +0.017517f, -0.000519f, -0.010408f, -0.009311f, +0.007005f, +0.025441f, +0.033475f, -0.078973f, -0.049654f, + +0.006841f, +0.021762f, +0.000959f, +0.018808f, +0.012613f, +0.017702f, +0.046538f, -0.014079f, +0.010471f, -0.018128f, + -0.018613f, +0.001535f, -0.024125f, -0.022473f, +0.004138f, -0.020647f, +0.005879f, -0.005565f, -0.008623f, -0.003724f, + -0.017910f, +0.002769f, -0.010829f, +0.009193f, -0.009809f, +0.020316f, -0.019874f, -0.006902f, +0.013499f, +0.002265f, + -0.005334f, +0.003311f, +0.005053f, +0.000611f, -0.000226f, -0.003755f, +0.001054f, +0.003231f, -0.002343f, +0.003996f, + -0.008172f, -0.000038f, +0.000128f, -0.001141f, +0.000418f, -0.001811f, +0.004170f, +0.004544f, -0.003896f, +0.000975f, + +0.001374f, -0.001146f, +0.000374f, -0.000456f, -0.008860f, +0.001402f, +0.002629f, -0.001783f, -0.001780f, -0.002000f, + -0.000064f, -0.001268f, +0.001177f, +0.000223f, -0.001861f, +0.003361f, +0.000446f, -0.000443f, +0.000323f, +0.000443f, + +0.001410f, +0.000100f, -0.001803f, +0.000717f, +0.000732f, -0.000640f + }, + { + -0.126852f, -0.192473f, +0.050064f, +0.009752f, +0.010968f, +0.002194f, -0.001301f, +0.004779f, -0.018250f, +0.000446f, + -0.019317f, +0.004933f, -0.012386f, +0.014275f, -0.020382f, -0.009313f, -0.014012f, -0.017991f, +0.001029f, -0.013576f, + -0.009145f, +0.009236f, +0.003642f, +0.012804f, -0.002835f, +0.014125f, -0.015377f, -0.003380f, +0.020453f, +0.016407f, + +0.002936f, +0.002833f, +0.006808f, -0.015759f, -0.001064f, +0.009563f, +0.016649f, +0.001750f, -0.010714f, +0.000685f, + +0.001275f, +0.002065f, +0.016131f, -0.002477f, -0.008509f, +0.003511f, +0.005414f, +0.003071f, -0.005369f, +0.012922f, + -0.004474f, -0.007222f, -0.005711f, -0.000292f, -0.010204f, +0.005726f, -0.006168f, +0.002978f, +0.000808f, +0.000015f, + +0.004635f, -0.001171f, -0.005216f, -0.009248f, +0.000455f, +0.005905f, -0.003142f, -0.001153f, -0.000116f, -0.001518f, + -0.001239f, +0.004955f, -0.000999f, +0.004998f, +0.001224f, -0.000002f, +0.001611f, +0.002568f, -0.000814f, +0.001475f, + -0.001477f, +0.006181f, -0.002046f, +0.004287f, -0.002895f, -0.000449f, -0.001480f, +0.000738f, -0.000388f, -0.000748f, + +0.000209f, -0.000852f, -0.001986f, +0.001954f, +0.001194f, -0.000917f + }, + { + +0.000171f, +0.000602f, -0.003044f, -0.005589f, +0.004975f, +0.001510f, +0.000684f, -0.002614f, +0.000084f, +0.003070f, + -0.004760f, +0.016277f, -0.004581f, +0.007084f, +0.020902f, +0.024051f, -0.009552f, -0.002096f, +0.018566f, +0.037398f, + +0.013425f, -0.007472f, +0.041476f, -0.051645f, -0.029741f, +0.028875f, -0.021505f, +0.009454f, -0.005665f, +0.006540f, + -0.002105f, -0.008516f, +0.021904f, -0.007685f, -0.018398f, +0.005548f, -0.009325f, -0.009047f, -0.013617f, +0.005106f, + -0.009071f, -0.000050f, +0.005703f, -0.012585f, +0.001729f, -0.003165f, -0.001269f, -0.011703f, -0.000218f, -0.004795f, + -0.003517f, +0.001625f, -0.002859f, -0.006312f, -0.005744f, +0.005731f, +0.000267f, -0.005553f, +0.000491f, +0.004445f, + +0.005854f, +0.003792f, +0.004033f, +0.002690f, +0.004737f, +0.001330f, -0.006942f, -0.001095f, +0.000987f, +0.001349f, + -0.004201f, +0.000400f, -0.002261f, +0.001459f, -0.002671f, -0.003832f, -0.000943f, +0.003986f, +0.002887f, +0.003737f, + +0.000430f, -0.002755f, +0.001126f, -0.001121f, +0.001599f, -0.000407f, -0.000228f, +0.004819f, -0.000078f, -0.000023f, + +0.004132f, -0.000055f, -0.000596f, +0.001928f, -0.000275f, +0.000876f + }, + { + +0.098615f, -0.674445f, -0.035183f, -0.044492f, -0.039930f, -0.016907f, +0.006153f, -0.012127f, +0.014818f, -0.008116f, + -0.005860f, +0.011796f, +0.032417f, -0.027883f, +0.035302f, +0.003680f, +0.002582f, -0.008921f, -0.005676f, -0.010612f, + -0.005658f, +0.027648f, +0.036950f, +0.015018f, -0.023359f, -0.001192f, -0.010617f, -0.011353f, +0.020236f, -0.002998f, + -0.016289f, -0.004301f, +0.005231f, -0.001384f, -0.012398f, -0.027629f, -0.021544f, +0.004012f, +0.000043f, +0.003213f, + -0.000889f, -0.005001f, +0.007436f, +0.013174f, +0.001519f, -0.003212f, -0.000064f, -0.009013f, +0.002014f, -0.001954f, + -0.007525f, +0.007378f, +0.000107f, +0.003928f, +0.019849f, -0.000908f, -0.001545f, -0.000026f, -0.005319f, +0.003769f, + +0.000370f, -0.000646f, +0.004360f, -0.000452f, -0.002494f, +0.003703f, +0.002149f, +0.000685f, +0.002142f, +0.001650f, + -0.002965f, +0.000354f, -0.002770f, +0.001534f, -0.001571f, -0.000662f, +0.003060f, -0.000822f, +0.002799f, -0.001610f, + -0.001228f, -0.000173f, -0.001578f, -0.000705f, -0.002624f, +0.001529f, +0.004385f, +0.000607f, -0.002890f, -0.002550f, + +0.002298f, -0.000645f, +0.000362f, +0.002710f, -0.001341f, -0.001282f + }, + { + +0.000094f, -0.023787f, -0.007783f, +0.005627f, +0.003905f, -0.000250f, -0.002942f, +0.005423f, -0.014911f, +0.002960f, + +0.007738f, -0.000761f, +0.001250f, -0.006325f, -0.093919f, -0.006651f, -0.019299f, +0.020324f, -0.025312f, -0.010148f, + +0.002383f, -0.014464f, -0.001734f, -0.029212f, -0.005131f, -0.028618f, +0.010695f, -0.001907f, +0.028586f, +0.009819f, + -0.015385f, +0.010631f, -0.003688f, +0.018621f, -0.003602f, +0.007534f, +0.006699f, +0.010043f, +0.007596f, -0.007841f, + -0.010215f, +0.002168f, -0.008939f, +0.014530f, -0.017131f, +0.000320f, -0.009491f, +0.010236f, +0.004360f, -0.011584f, + +0.004070f, +0.007770f, -0.012207f, +0.005695f, -0.002401f, -0.003807f, -0.005979f, +0.004533f, +0.000815f, -0.001976f, + -0.003550f, -0.000094f, -0.000968f, +0.005957f, +0.000708f, -0.000147f, +0.000508f, -0.004161f, +0.000140f, +0.002005f, + +0.001900f, -0.003578f, +0.007225f, +0.002255f, -0.003956f, +0.003475f, -0.000556f, +0.000707f, -0.003938f, -0.001416f, + -0.000408f, +0.002217f, +0.000021f, -0.001924f, +0.004517f, -0.000712f, +0.000161f, -0.002772f, -0.000561f, -0.001142f, + +0.000931f, +0.000468f, +0.001217f, +0.000055f, -0.002363f, +0.001824f + }, + { + -0.000237f, -0.441584f, +0.031917f, +0.002057f, +0.009029f, +0.033917f, -0.027739f, +0.017940f, +0.016134f, +0.015696f, + -0.029620f, -0.014945f, +0.012061f, +0.018278f, -0.008437f, -0.002018f, +0.034353f, +0.004695f, -0.008564f, -0.022991f, + +0.021595f, -0.006388f, -0.002349f, -0.005764f, +0.016377f, -0.000013f, +0.015855f, +0.006694f, -0.008803f, +0.017749f, + -0.017592f, +0.006616f, -0.014911f, -0.003699f, +0.007601f, -0.001757f, +0.008258f, +0.001119f, -0.015621f, -0.002831f, + -0.005597f, -0.008019f, +0.014615f, +0.004953f, -0.006446f, +0.007400f, -0.003340f, -0.004836f, -0.002252f, +0.006163f, + -0.003685f, -0.000285f, -0.006213f, +0.008139f, +0.007007f, -0.002785f, +0.000304f, +0.000950f, +0.001011f, +0.008154f, + +0.007382f, +0.003314f, -0.005061f, -0.002803f, +0.007960f, +0.006661f, +0.000859f, +0.004475f, -0.010933f, +0.003064f, + -0.000514f, -0.000342f, +0.006189f, +0.003056f, +0.003775f, -0.003175f, -0.009812f, +0.004903f, -0.001533f, +0.001041f, + +0.003162f, +0.005692f, -0.001815f, -0.003446f, -0.002118f, -0.000814f, +0.001210f, +0.002638f, -0.001032f, -0.003437f, + +0.003442f, -0.001324f, +0.001597f, -0.003293f, +0.000805f, -0.001215f + }, + { + +0.007007f, -0.036455f, -0.021655f, +0.013806f, +0.023305f, -0.019139f, +0.009065f, +0.001101f, +0.016280f, -0.016056f, + -0.000436f, -0.031659f, +0.011232f, +0.003832f, +0.003116f, -0.023188f, +0.033987f, -0.000260f, +0.000492f, +0.010263f, + +0.013486f, +0.013981f, +0.003048f, -0.009710f, +0.005825f, -0.012038f, -0.005872f, +0.004892f, -0.005246f, +0.009320f, + +0.015525f, -0.012734f, +0.008333f, -0.002809f, +0.009150f, -0.007772f, -0.007866f, -0.000244f, -0.010090f, -0.009298f, + -0.001041f, +0.016917f, -0.005489f, -0.004275f, -0.003370f, -0.007230f, -0.009725f, -0.005129f, -0.006862f, -0.011050f, + -0.008157f, -0.003480f, +0.004534f, +0.000466f, +0.002413f, +0.004001f, -0.002914f, -0.004520f, -0.000723f, -0.000476f, + +0.000701f, -0.004604f, +0.006078f, -0.003074f, +0.001177f, +0.005718f, +0.000838f, -0.005493f, +0.002572f, -0.006353f, + -0.004591f, +0.000362f, -0.003942f, -0.002729f, -0.001608f, +0.000777f, -0.000849f, +0.000571f, +0.004948f, -0.003480f, + +0.002796f, +0.000418f, +0.000144f, +0.003731f, +0.002573f, +0.000781f, +0.001608f, -0.001248f, +0.001211f, -0.002815f, + -0.000929f, -0.001532f, -0.000356f, +0.001060f, -0.000959f, +0.001901f + }, + { + +0.007824f, +0.287800f, -0.010922f, +0.012412f, -0.005784f, -0.018990f, +0.011667f, -0.008078f, +0.023714f, +0.022911f, + -0.000978f, +0.015369f, +0.006829f, -0.006075f, -0.021295f, +0.016768f, +0.017599f, +0.008064f, +0.001081f, -0.050076f, + +0.010113f, +0.001785f, +0.002463f, -0.017057f, +0.036886f, +0.018037f, -0.012962f, -0.009697f, +0.004399f, -0.006357f, + +0.009991f, +0.009114f, -0.009769f, +0.002043f, -0.000210f, -0.001967f, +0.015647f, +0.017929f, +0.004705f, +0.005690f, + +0.003422f, +0.015441f, +0.004367f, -0.021256f, +0.001916f, +0.000586f, +0.012147f, -0.000124f, +0.004261f, -0.000643f, + -0.006119f, -0.006256f, -0.010680f, -0.000282f, -0.001216f, -0.005697f, -0.006633f, +0.002179f, -0.005373f, +0.001146f, + -0.010483f, +0.003363f, +0.001720f, +0.004943f, -0.003882f, +0.000653f, -0.003144f, -0.002361f, +0.007058f, -0.009142f, + -0.005960f, +0.006597f, -0.001280f, +0.001988f, -0.000276f, +0.000083f, +0.003071f, +0.000036f, +0.003046f, +0.003731f, + +0.000765f, -0.003872f, -0.001116f, +0.000456f, -0.004275f, -0.002321f, -0.002934f, -0.002266f, +0.001484f, +0.001334f, + -0.000326f, +0.001018f, +0.001066f, +0.001341f, +0.002470f, +0.000509f + }, + { + +0.000546f, +0.095320f, -0.011316f, +0.010856f, -0.000354f, -0.001227f, -0.000081f, -0.006834f, -0.006442f, +0.001094f, + -0.000933f, +0.004384f, +0.000727f, +0.034487f, -0.048314f, -0.004628f, +0.026882f, +0.054809f, -0.010256f, +0.034055f, + +0.013704f, +0.014932f, -0.020825f, +0.006065f, +0.031106f, -0.034004f, +0.012893f, -0.006141f, -0.020049f, +0.032240f, + -0.022224f, +0.000336f, -0.016096f, -0.000609f, -0.006162f, -0.008017f, +0.015415f, +0.003165f, +0.027330f, -0.012525f, + +0.006022f, -0.009605f, +0.007716f, +0.001329f, +0.000460f, +0.010109f, +0.000556f, -0.009110f, +0.001107f, +0.015329f, + +0.004525f, -0.005482f, -0.008527f, +0.000844f, -0.003996f, +0.004540f, -0.009539f, +0.006518f, -0.003031f, +0.004627f, + +0.004931f, +0.005780f, -0.007573f, -0.000653f, -0.002614f, +0.003042f, -0.005337f, +0.004202f, -0.001381f, -0.003623f, + +0.000530f, +0.006084f, -0.000070f, +0.003047f, +0.002841f, -0.003165f, -0.001276f, -0.000593f, +0.004765f, -0.004310f, + -0.003081f, -0.000816f, +0.003403f, +0.001043f, -0.000097f, -0.000404f, +0.001099f, -0.001510f, -0.000129f, +0.000558f, + -0.001083f, +0.000370f, -0.005513f, +0.002068f, -0.000732f, -0.000694f + }, + { + -0.045109f, +0.150568f, +0.003273f, +0.002362f, -0.011242f, -0.008465f, +0.006066f, -0.012633f, -0.005102f, -0.003444f, + +0.006614f, -0.026617f, +0.004190f, +0.034993f, -0.029287f, -0.015106f, +0.054234f, +0.003437f, +0.007366f, -0.012172f, + +0.012603f, +0.002087f, -0.021541f, -0.011636f, -0.011413f, +0.017284f, -0.003841f, -0.009906f, +0.012834f, -0.024249f, + +0.005499f, -0.005724f, +0.002313f, +0.000986f, +0.005057f, -0.012992f, -0.011478f, +0.022025f, +0.003252f, +0.008117f, + -0.006407f, -0.005819f, -0.001958f, +0.010893f, -0.000577f, +0.013332f, +0.007579f, -0.013137f, +0.002587f, -0.003881f, + -0.011586f, +0.005255f, +0.002709f, -0.000671f, +0.003493f, +0.003579f, +0.003644f, -0.000226f, -0.010613f, +0.001694f, + +0.006066f, +0.003249f, -0.000867f, -0.006120f, +0.002816f, -0.000595f, +0.005628f, -0.003056f, +0.004020f, +0.007034f, + -0.006340f, -0.002521f, -0.002680f, +0.003873f, +0.006916f, -0.001223f, +0.004285f, +0.002217f, +0.001667f, +0.002864f, + +0.001723f, +0.001660f, +0.004598f, +0.000529f, +0.002493f, +0.000562f, +0.002592f, -0.004435f, -0.000629f, +0.002123f, + +0.001206f, -0.001127f, +0.002577f, -0.002415f, -0.000649f, +0.000669f + }, + { + -0.012570f, -0.011872f, +0.018445f, +0.001862f, +0.007362f, -0.003769f, +0.000584f, +0.016298f, +0.001847f, +0.006385f, + -0.004315f, -0.004977f, +0.000742f, -0.019816f, -0.030189f, -0.021438f, +0.015981f, +0.024803f, +0.006739f, +0.025689f, + -0.043885f, -0.014500f, -0.031935f, +0.016155f, +0.001947f, -0.006594f, -0.002032f, +0.050689f, -0.018698f, +0.019761f, + -0.008689f, -0.028362f, +0.020425f, -0.015496f, +0.022259f, -0.020096f, -0.023589f, -0.006730f, -0.002007f, +0.014483f, + -0.023518f, +0.015476f, -0.017767f, -0.002791f, -0.012033f, -0.009985f, -0.001146f, -0.000651f, +0.007895f, -0.007480f, + -0.001068f, -0.000637f, -0.004932f, +0.006500f, +0.001610f, +0.002510f, -0.004461f, +0.001515f, -0.006902f, -0.006378f, + +0.002935f, -0.007088f, -0.004911f, -0.001260f, +0.002842f, -0.000370f, +0.004663f, -0.002535f, -0.006788f, -0.000905f, + -0.001123f, -0.008629f, -0.005974f, -0.000054f, -0.002634f, +0.001275f, +0.000116f, -0.000011f, -0.005077f, +0.003819f, + -0.001518f, -0.001696f, +0.001192f, +0.001485f, -0.002539f, +0.000113f, +0.003948f, -0.000912f, +0.001741f, -0.000021f, + -0.000401f, -0.000491f, -0.000892f, -0.000878f, +0.000531f, +0.003208f + } + }, + { + { + +0.044511f, +0.150812f, -0.000863f, -0.017263f, -0.000976f, +0.000479f, +0.012309f, -0.025211f, -0.010262f, -0.000592f, + +0.007180f, -0.055193f, +0.005657f, -0.017072f, +0.013435f, -0.002911f, -0.009941f, +0.011438f, +0.007771f, -0.010100f, + +0.002913f, +0.002606f, -0.012422f, -0.029952f, -0.035092f, -0.012112f, +0.015980f, +0.004196f, -0.008586f, +0.002354f, + -0.021314f, +0.003192f, +0.006711f, +0.009919f, -0.002898f, +0.026099f, -0.007825f, +0.001165f, +0.009657f, +0.001685f, + +0.002244f, +0.000629f, +0.003443f, -0.000628f, -0.003540f, +0.001858f, -0.009166f, +0.015234f, -0.002629f, +0.010471f, + -0.007585f, +0.000706f, -0.001347f, -0.006614f, +0.002642f, -0.004021f, -0.010981f, -0.014123f, +0.015882f, -0.006216f, + +0.004157f, -0.002033f, -0.006656f, +0.006430f, -0.000043f, -0.002712f, +0.005536f, -0.004517f, -0.000327f, -0.004796f, + +0.003681f, +0.002890f, +0.001521f, -0.003879f, +0.001857f, -0.000269f, +0.001118f, -0.002138f, +0.002118f, -0.001748f, + +0.002208f, +0.002760f, +0.002287f, +0.002744f, -0.001333f, -0.002444f, +0.001070f, +0.004224f, -0.002141f, +0.000891f, + -0.002013f, -0.003546f, +0.003807f, -0.000444f, +0.000122f, -0.001180f + }, + { + -0.000934f, +0.029024f, +0.046258f, -0.021433f, -0.010824f, -0.000354f, -0.001483f, +0.018022f, -0.015981f, -0.010767f, + +0.001238f, -0.018674f, -0.010069f, +0.049093f, -0.022272f, -0.010900f, -0.023816f, +0.003587f, -0.010251f, +0.024882f, + -0.006934f, -0.011868f, +0.015718f, -0.034185f, -0.019181f, +0.027538f, +0.022552f, -0.031457f, +0.011669f, -0.011161f, + +0.010560f, +0.019430f, +0.004499f, +0.006163f, -0.014405f, +0.001179f, +0.015328f, +0.003376f, -0.012529f, -0.001709f, + +0.003920f, +0.001685f, +0.008336f, -0.001363f, -0.002852f, +0.003315f, -0.000954f, +0.000676f, -0.000698f, -0.000781f, + -0.000689f, +0.005614f, +0.015195f, +0.000655f, +0.003756f, -0.006915f, -0.007149f, +0.000865f, -0.010891f, +0.000712f, + +0.011078f, +0.002013f, +0.001989f, +0.002728f, +0.004858f, -0.003936f, +0.002897f, +0.005541f, +0.002028f, -0.002585f, + -0.002263f, -0.002814f, -0.009217f, +0.000433f, -0.003104f, +0.001570f, +0.000636f, -0.000386f, -0.002268f, -0.003682f, + +0.002342f, +0.001513f, +0.001358f, -0.001284f, +0.000894f, -0.000328f, +0.000680f, +0.002201f, -0.000395f, +0.000961f, + -0.000097f, +0.002515f, +0.003434f, +0.001239f, -0.001445f, -0.002246f + }, + { + -0.001372f, +0.168042f, -0.036140f, -0.011294f, +0.010460f, +0.003704f, -0.008460f, +0.009757f, -0.007564f, +0.007795f, + +0.020254f, -0.013344f, -0.007686f, +0.019512f, +0.012269f, +0.022694f, -0.026681f, +0.047691f, -0.043378f, +0.009536f, + +0.019535f, -0.020957f, -0.001731f, -0.003543f, +0.007238f, +0.013354f, +0.005515f, -0.003960f, -0.000832f, -0.001459f, + -0.006969f, -0.010009f, -0.020769f, +0.001066f, +0.004860f, -0.005271f, -0.001821f, +0.006856f, -0.006259f, +0.016638f, + -0.018307f, -0.010095f, +0.008093f, +0.015164f, -0.004507f, -0.004841f, -0.001729f, +0.005673f, -0.007396f, +0.018957f, + +0.002386f, -0.008320f, +0.007081f, -0.000341f, -0.013125f, -0.002717f, -0.012703f, +0.006287f, +0.000909f, +0.002594f, + +0.000108f, -0.006297f, -0.001008f, -0.002877f, +0.003965f, -0.000110f, -0.003005f, +0.006154f, -0.000682f, +0.004497f, + -0.006042f, +0.000758f, +0.005074f, +0.000528f, +0.002887f, -0.001974f, -0.003419f, -0.001317f, +0.002799f, +0.000218f, + -0.002813f, -0.000531f, +0.000862f, -0.001564f, -0.000196f, -0.001700f, +0.003342f, -0.001652f, +0.001038f, +0.000206f, + -0.002161f, +0.001341f, -0.001167f, +0.003088f, -0.001767f, +0.000558f + }, + { + +0.108590f, +0.106534f, -0.045156f, +0.041173f, +0.007920f, +0.001055f, -0.019428f, +0.023168f, +0.006765f, +0.022402f, + -0.010076f, -0.008992f, +0.012696f, +0.028842f, +0.003969f, +0.013214f, +0.020229f, +0.012098f, -0.010695f, -0.025365f, + +0.016106f, +0.004167f, -0.012628f, -0.006526f, +0.001420f, -0.030492f, +0.002512f, -0.008696f, -0.005910f, +0.003285f, + -0.000575f, +0.003805f, -0.005897f, -0.007472f, +0.016190f, +0.005026f, +0.012737f, +0.004412f, +0.015458f, +0.017604f, + +0.002569f, +0.004242f, -0.007271f, -0.003462f, -0.006111f, +0.015655f, +0.002142f, -0.002646f, -0.000076f, -0.016610f, + +0.005138f, -0.005759f, -0.000004f, +0.012788f, -0.001923f, -0.001703f, +0.002537f, +0.002730f, +0.001343f, +0.001032f, + -0.001951f, +0.006117f, -0.008220f, +0.005877f, -0.000919f, -0.001939f, +0.001008f, -0.004413f, -0.005091f, +0.002696f, + -0.004504f, -0.001875f, +0.000759f, +0.002093f, +0.001394f, -0.004209f, -0.000026f, -0.003374f, -0.000204f, -0.000057f, + -0.000041f, +0.001614f, +0.001428f, +0.001177f, +0.001546f, +0.000094f, -0.000228f, -0.002765f, +0.000777f, -0.002348f, + +0.000252f, -0.000336f, -0.002819f, -0.001081f, -0.001394f, +0.002774f + }, + { + +0.001274f, +0.046045f, +0.001090f, +0.002252f, -0.006788f, -0.002870f, -0.000017f, +0.006692f, +0.004538f, -0.001802f, + -0.002441f, +0.007211f, -0.016478f, -0.019944f, -0.043071f, -0.068301f, -0.020043f, +0.090120f, +0.003543f, -0.014349f, + +0.003998f, -0.014836f, -0.018318f, +0.022840f, +0.018210f, -0.020179f, +0.012659f, -0.015473f, +0.015467f, -0.023949f, + -0.011433f, -0.002549f, -0.027278f, -0.014508f, +0.018402f, -0.017248f, -0.003842f, +0.005258f, -0.005161f, +0.004953f, + -0.011977f, +0.002560f, -0.005117f, +0.001885f, -0.020043f, +0.023465f, -0.011383f, -0.007450f, +0.006112f, +0.001859f, + -0.003044f, -0.004636f, +0.002466f, +0.001555f, +0.000113f, -0.000774f, +0.004600f, +0.005813f, -0.006766f, +0.004077f, + -0.007339f, -0.003003f, +0.002729f, +0.003771f, +0.001950f, -0.000809f, +0.006769f, +0.004542f, -0.002970f, +0.003013f, + -0.004756f, -0.004638f, +0.003606f, +0.002429f, -0.006951f, +0.001609f, +0.006026f, +0.000723f, +0.000297f, +0.000476f, + +0.001662f, -0.001805f, -0.003488f, +0.000659f, -0.000260f, +0.003616f, +0.001290f, -0.000714f, +0.001052f, +0.000015f, + +0.001622f, -0.000573f, -0.002913f, -0.000176f, +0.000269f, +0.000441f + }, + { + +0.156162f, +0.059148f, -0.061189f, -0.006243f, +0.000012f, -0.007901f, +0.011933f, +0.022525f, -0.037669f, +0.004175f, + -0.003733f, +0.023916f, +0.007283f, -0.007481f, -0.020024f, -0.005354f, -0.016675f, -0.001274f, +0.021797f, +0.007274f, + +0.018271f, +0.009520f, -0.005237f, +0.015848f, -0.011642f, +0.011437f, -0.006256f, -0.006384f, +0.000060f, +0.004331f, + -0.018703f, -0.018879f, +0.004273f, -0.015344f, -0.004874f, +0.007741f, +0.008242f, +0.003189f, -0.005858f, +0.003476f, + +0.004199f, -0.007640f, +0.005908f, -0.005590f, -0.008215f, +0.002723f, +0.002584f, +0.002722f, -0.009466f, +0.006836f, + -0.005306f, +0.002707f, +0.004666f, +0.001791f, -0.010064f, +0.005182f, -0.004609f, +0.004648f, +0.000146f, -0.001513f, + +0.000145f, -0.000791f, +0.004578f, -0.000561f, +0.000991f, +0.002738f, -0.006423f, -0.004864f, +0.000216f, +0.003058f, + -0.000604f, +0.004422f, -0.001941f, +0.004860f, -0.000761f, -0.002798f, -0.001585f, -0.002366f, -0.000417f, +0.003507f, + -0.002348f, +0.004618f, -0.005454f, +0.000979f, +0.000614f, +0.002219f, -0.001812f, +0.001058f, +0.001066f, +0.001457f, + -0.000981f, -0.000972f, -0.001650f, -0.001231f, -0.000480f, -0.000513f + }, + { + +0.001356f, +0.025442f, +0.013954f, -0.010968f, -0.003180f, -0.000183f, -0.000347f, -0.002988f, +0.001303f, -0.008658f, + -0.014773f, +0.005262f, -0.019425f, -0.027250f, -0.010387f, -0.024852f, -0.068497f, -0.027094f, +0.002725f, +0.010588f, + +0.015374f, -0.002346f, +0.034829f, -0.048758f, -0.047243f, -0.000572f, -0.042891f, -0.002378f, -0.004864f, +0.038872f, + +0.035669f, +0.012375f, +0.014885f, +0.006528f, -0.003147f, +0.014657f, +0.002072f, +0.000995f, -0.004977f, +0.016298f, + -0.001755f, +0.000198f, +0.007155f, -0.008328f, +0.006801f, +0.000290f, +0.004713f, -0.002738f, +0.005141f, +0.003557f, + +0.004950f, +0.006998f, +0.006927f, +0.005113f, -0.002043f, +0.003886f, -0.000673f, +0.001982f, +0.005983f, -0.003420f, + -0.002316f, -0.006603f, +0.001292f, +0.005012f, +0.001484f, -0.000144f, -0.003125f, +0.005223f, +0.006081f, +0.000782f, + -0.008500f, -0.000716f, -0.003140f, +0.001518f, +0.003276f, -0.001777f, -0.000691f, +0.001912f, +0.000190f, +0.000934f, + -0.003362f, -0.003454f, +0.003535f, +0.000445f, +0.001218f, +0.000225f, +0.000663f, +0.004768f, +0.001343f, +0.001148f, + +0.001241f, -0.001131f, +0.001642f, +0.003468f, +0.001146f, +0.000353f + }, + { + -0.049063f, -0.828289f, +0.018788f, +0.011699f, -0.013121f, -0.004698f, -0.005874f, -0.017817f, +0.009450f, -0.004303f, + +0.014367f, -0.003837f, +0.011020f, +0.000743f, +0.042964f, -0.012301f, -0.000948f, -0.024925f, -0.016726f, +0.006031f, + -0.002560f, +0.017389f, +0.016280f, +0.001055f, -0.023797f, +0.006065f, +0.005305f, -0.009726f, +0.005983f, +0.001739f, + -0.007614f, -0.008831f, +0.002412f, +0.005962f, +0.002110f, -0.001192f, +0.004889f, +0.020367f, +0.008204f, -0.000720f, + +0.000157f, +0.006063f, +0.008643f, +0.002338f, +0.002548f, +0.002575f, +0.009210f, -0.003809f, +0.001401f, +0.001623f, + -0.009084f, +0.007981f, -0.009519f, -0.009305f, +0.011585f, -0.007855f, +0.000318f, +0.003847f, -0.002526f, +0.002610f, + -0.004432f, -0.006812f, -0.000492f, -0.001413f, -0.002533f, +0.003852f, +0.005372f, +0.000764f, +0.000225f, +0.003013f, + -0.004483f, -0.000644f, -0.003028f, +0.004800f, +0.000887f, -0.001782f, +0.003116f, -0.001201f, +0.002433f, -0.000756f, + -0.002500f, +0.000539f, +0.001049f, +0.002020f, +0.000542f, +0.001772f, +0.005185f, +0.002472f, -0.002202f, -0.002305f, + +0.001811f, +0.000809f, +0.001606f, +0.001226f, -0.003331f, -0.001010f + }, + { + +0.002249f, +0.009040f, +0.010887f, +0.002738f, +0.008278f, -0.000694f, -0.004581f, +0.006794f, -0.014822f, +0.002712f, + +0.000435f, -0.005813f, +0.008614f, -0.017642f, -0.148158f, -0.052470f, -0.041056f, +0.018464f, -0.029714f, +0.022358f, + +0.019226f, -0.024393f, +0.002011f, +0.025039f, +0.041103f, -0.037509f, +0.010502f, +0.009827f, +0.007964f, +0.015274f, + -0.016399f, +0.003385f, -0.006820f, +0.005477f, +0.001513f, +0.004317f, -0.012540f, -0.001370f, -0.002188f, -0.005680f, + +0.000984f, +0.006974f, -0.005292f, +0.016088f, -0.009164f, +0.013161f, -0.002268f, +0.007406f, +0.001973f, -0.004436f, + +0.007651f, +0.004934f, -0.009367f, +0.008864f, +0.002432f, +0.000176f, -0.003463f, +0.005425f, -0.002129f, -0.008368f, + -0.009816f, +0.000116f, +0.001889f, +0.003742f, -0.000591f, +0.003639f, +0.000741f, -0.002529f, -0.001184f, -0.001688f, + -0.000266f, -0.004506f, +0.006632f, +0.001142f, -0.005474f, +0.000069f, -0.001568f, -0.001398f, -0.006659f, +0.001440f, + +0.001254f, -0.000142f, +0.000335f, -0.000619f, +0.003292f, -0.003950f, +0.000657f, +0.000319f, -0.000396f, -0.002052f, + -0.000121f, -0.000866f, -0.000136f, -0.000759f, -0.002762f, +0.002603f + }, + { + +0.004352f, -0.526146f, -0.044168f, +0.018075f, -0.011681f, +0.047678f, +0.024940f, +0.041152f, +0.028246f, +0.034964f, + -0.016392f, +0.007847f, +0.034165f, +0.037688f, +0.009070f, +0.002388f, +0.039529f, +0.003174f, -0.003470f, -0.007725f, + +0.018420f, -0.000417f, +0.011416f, -0.022803f, -0.010933f, -0.004431f, -0.006443f, -0.016947f, -0.022238f, +0.008030f, + -0.003840f, +0.014160f, -0.016557f, -0.002086f, +0.017557f, +0.000339f, +0.009103f, +0.008701f, -0.015310f, -0.000385f, + +0.016349f, +0.000079f, +0.002854f, -0.004636f, -0.007938f, -0.006491f, +0.000507f, -0.000342f, -0.000402f, +0.009395f, + +0.005723f, +0.012090f, -0.004930f, -0.008876f, -0.002731f, +0.002021f, +0.002520f, +0.004794f, +0.002755f, -0.000187f, + +0.000260f, -0.000530f, -0.005293f, +0.003441f, +0.004446f, -0.002633f, -0.000881f, +0.005201f, -0.006353f, +0.004913f, + -0.002010f, -0.000864f, +0.004566f, +0.000415f, -0.000125f, -0.002557f, -0.005421f, +0.003591f, -0.002703f, +0.002577f, + +0.000286f, +0.000749f, -0.005039f, -0.002932f, -0.000017f, +0.000786f, +0.002960f, +0.002202f, -0.004135f, -0.006730f, + +0.001880f, -0.003311f, -0.001812f, -0.003870f, +0.001002f, -0.001864f + }, + { + -0.007100f, +0.027951f, +0.024608f, -0.012841f, +0.006737f, -0.017778f, +0.020422f, +0.000476f, -0.003621f, -0.025326f, + +0.009175f, +0.000681f, +0.040062f, -0.001078f, +0.018079f, -0.011726f, +0.003971f, -0.023336f, +0.019999f, +0.001236f, + -0.023440f, +0.023124f, +0.023671f, -0.001451f, +0.010208f, +0.002252f, -0.003542f, -0.001086f, -0.013122f, -0.003633f, + +0.017437f, +0.002777f, +0.022042f, -0.003632f, -0.006912f, -0.012841f, -0.006977f, -0.002454f, -0.001205f, -0.002289f, + +0.004812f, +0.031627f, +0.005797f, -0.001121f, -0.006589f, -0.015655f, -0.014024f, +0.001352f, +0.007043f, -0.001035f, + -0.002947f, -0.001923f, +0.005044f, -0.000786f, +0.001744f, +0.006485f, -0.002361f, +0.000359f, +0.005430f, -0.002480f, + -0.000939f, -0.008471f, +0.000320f, -0.008186f, -0.000559f, +0.003522f, -0.003522f, -0.006807f, +0.005619f, +0.000824f, + +0.000151f, +0.001706f, +0.001146f, +0.001864f, -0.000668f, +0.001353f, -0.003037f, -0.002043f, +0.002009f, -0.004810f, + +0.004200f, +0.000355f, -0.001717f, +0.000164f, +0.001312f, -0.002581f, -0.002350f, -0.001804f, +0.003251f, -0.000585f, + +0.000949f, +0.000037f, -0.000488f, -0.001520f, -0.000393f, +0.004070f + }, + { + -0.069863f, +0.196467f, -0.013577f, -0.016244f, +0.031974f, +0.042689f, -0.001628f, -0.004264f, +0.020997f, +0.002158f, + +0.003931f, +0.024444f, +0.005465f, -0.003838f, -0.030084f, +0.001668f, +0.002495f, -0.003971f, +0.023968f, -0.044031f, + -0.011601f, +0.002467f, +0.016703f, -0.004074f, +0.034191f, +0.014014f, -0.014298f, -0.009275f, +0.012932f, -0.007116f, + -0.000052f, -0.000655f, -0.014875f, +0.005348f, -0.000245f, +0.002491f, -0.005908f, -0.006560f, -0.006666f, +0.008661f, + +0.009089f, +0.012395f, +0.001077f, -0.003605f, +0.014625f, +0.001684f, +0.013909f, -0.006050f, +0.001968f, -0.001716f, + -0.010659f, -0.004840f, -0.006601f, -0.005573f, +0.001332f, +0.000638f, -0.005431f, +0.006333f, -0.000686f, +0.005645f, + -0.003131f, +0.004762f, -0.002436f, +0.006486f, -0.001833f, -0.000023f, +0.002518f, +0.002329f, +0.005725f, -0.005221f, + -0.000705f, +0.005406f, -0.006431f, -0.003839f, -0.003816f, +0.000427f, +0.003621f, +0.000288f, +0.001248f, +0.001299f, + +0.000236f, -0.002818f, +0.000857f, +0.003468f, -0.002576f, -0.001918f, -0.001580f, -0.000419f, +0.001065f, +0.001282f, + -0.000365f, +0.001421f, +0.001144f, -0.000971f, +0.001277f, -0.001581f + }, + { + +0.001232f, +0.110947f, -0.009346f, +0.006384f, -0.000224f, -0.013003f, -0.006541f, -0.002306f, -0.000154f, +0.005028f, + +0.000825f, +0.001908f, -0.021816f, +0.073584f, +0.025694f, +0.045114f, +0.024520f, +0.022276f, -0.023356f, +0.026956f, + -0.024123f, +0.018906f, +0.020981f, +0.006027f, +0.001292f, -0.021529f, +0.018546f, -0.002730f, -0.008997f, +0.050422f, + -0.019752f, -0.007168f, +0.001519f, +0.011728f, +0.000493f, -0.002304f, +0.022853f, -0.006618f, +0.021231f, -0.004386f, + +0.008139f, -0.012040f, -0.000546f, -0.006932f, -0.003544f, -0.004186f, -0.002704f, -0.008401f, +0.005004f, +0.016799f, + +0.004835f, +0.008363f, +0.004449f, +0.004966f, +0.002525f, +0.010222f, +0.002364f, +0.013131f, -0.003199f, +0.004663f, + +0.001528f, +0.012865f, -0.001294f, -0.003806f, -0.002880f, +0.003368f, -0.003153f, -0.000009f, -0.007182f, -0.004338f, + -0.007568f, +0.006160f, -0.001431f, -0.002063f, +0.005571f, +0.002121f, +0.000571f, -0.000996f, +0.002266f, -0.004447f, + -0.001207f, -0.001416f, +0.000894f, -0.001068f, +0.001512f, +0.001795f, -0.000264f, -0.005509f, -0.001824f, +0.002358f, + -0.001211f, +0.000163f, -0.002758f, +0.001664f, -0.002229f, -0.000291f + }, + { + +0.014867f, +0.246385f, +0.013591f, -0.015118f, -0.026986f, +0.000270f, +0.000978f, -0.016722f, +0.009192f, -0.007138f, + -0.015361f, -0.058546f, -0.027799f, +0.020836f, +0.008049f, -0.018903f, +0.036318f, +0.002749f, -0.008945f, -0.019950f, + +0.022847f, +0.017106f, +0.003039f, +0.014481f, +0.011745f, +0.020228f, -0.005908f, +0.000308f, +0.047877f, -0.017614f, + -0.010950f, -0.019000f, -0.002021f, +0.002128f, +0.000485f, -0.023384f, -0.031076f, +0.013304f, +0.012112f, +0.025097f, + -0.001130f, -0.003133f, -0.009125f, +0.002882f, -0.012014f, +0.001798f, +0.011860f, -0.012488f, -0.004717f, -0.001269f, + -0.005155f, +0.006080f, +0.005845f, +0.002753f, -0.001886f, +0.000639f, +0.004372f, +0.002434f, -0.011090f, -0.002825f, + +0.004057f, -0.000435f, -0.000239f, -0.002773f, +0.005104f, -0.002154f, +0.004228f, -0.003277f, -0.000375f, -0.003384f, + -0.005210f, -0.001868f, -0.006840f, +0.001961f, +0.003346f, -0.002752f, +0.004324f, -0.001578f, -0.003170f, +0.001593f, + +0.003100f, +0.000706f, +0.000107f, -0.003481f, +0.000136f, -0.003670f, +0.001037f, -0.003369f, +0.001068f, +0.005040f, + +0.003231f, -0.002524f, +0.001160f, -0.002013f, -0.000036f, +0.002096f + }, + { + +0.011819f, -0.040065f, -0.028784f, -0.001354f, -0.005622f, -0.013133f, -0.001521f, +0.020817f, +0.005558f, -0.007493f, + +0.000346f, +0.003755f, -0.003736f, +0.057306f, +0.077992f, -0.012902f, -0.027138f, -0.001116f, +0.001785f, -0.039291f, + -0.056951f, +0.046459f, +0.000759f, +0.019062f, +0.001717f, +0.000926f, -0.000349f, +0.033604f, -0.020770f, +0.024268f, + +0.036560f, +0.012854f, +0.024712f, -0.021171f, +0.011521f, -0.007637f, +0.001815f, -0.013943f, -0.011201f, +0.027515f, + -0.013279f, +0.022155f, -0.009651f, -0.007248f, -0.016823f, -0.012579f, -0.004401f, -0.009426f, -0.004783f, -0.009585f, + +0.001123f, +0.007376f, +0.007510f, +0.001256f, -0.014865f, -0.004905f, -0.007340f, +0.003618f, +0.004964f, +0.009415f, + +0.007629f, -0.003488f, -0.005296f, +0.000410f, +0.006815f, -0.000811f, -0.000112f, -0.005322f, -0.001853f, +0.002833f, + +0.000743f, -0.001971f, +0.000630f, +0.002103f, +0.000186f, +0.000596f, +0.000366f, +0.001085f, -0.003642f, +0.003565f, + -0.006413f, -0.002731f, -0.000409f, -0.001496f, -0.002078f, +0.000361f, +0.000627f, -0.003267f, +0.002544f, -0.000281f, + -0.000810f, +0.000294f, +0.000226f, +0.000965f, +0.001206f, +0.000745f + } + }, + { + { + -0.032269f, +0.104405f, +0.022530f, +0.008044f, +0.011306f, -0.000375f, -0.010130f, -0.019267f, -0.011419f, -0.011872f, + +0.014434f, -0.022196f, -0.018729f, +0.007795f, +0.015199f, -0.015232f, -0.019108f, +0.007023f, -0.002046f, +0.014678f, + -0.022604f, +0.011788f, -0.018563f, -0.018934f, -0.023456f, -0.005785f, -0.002669f, +0.000069f, +0.014512f, -0.004330f, + -0.008189f, -0.006147f, +0.004089f, +0.021101f, +0.001369f, +0.009178f, +0.002684f, -0.007097f, +0.012907f, +0.004967f, + -0.005244f, +0.009940f, +0.000239f, -0.009168f, +0.004290f, -0.002958f, -0.007176f, +0.006680f, +0.002708f, +0.011328f, + -0.003061f, -0.005263f, +0.001900f, -0.004358f, -0.001678f, -0.006132f, -0.011482f, -0.012017f, +0.007842f, -0.004518f, + -0.001463f, +0.002413f, +0.000577f, +0.002387f, -0.000584f, -0.005845f, +0.002010f, -0.001048f, +0.002461f, -0.003093f, + -0.000920f, +0.005924f, -0.003100f, -0.001995f, -0.000959f, +0.001025f, +0.000394f, +0.000446f, -0.001821f, +0.000457f, + -0.000709f, +0.006410f, +0.002250f, +0.001222f, -0.001690f, +0.000401f, +0.001589f, +0.000313f, -0.001310f, +0.002052f, + -0.001867f, -0.003268f, +0.003340f, -0.001413f, +0.000982f, -0.001696f + }, + { + +0.002289f, +0.064216f, +0.017226f, -0.031216f, +0.003617f, -0.002556f, +0.001989f, +0.006231f, +0.002235f, -0.025313f, + -0.007080f, -0.013675f, -0.006432f, +0.022182f, +0.012383f, -0.014578f, -0.023900f, -0.015816f, +0.041787f, -0.025229f, + +0.000432f, +0.019717f, -0.008513f, -0.011639f, -0.016640f, +0.003007f, +0.016192f, -0.019141f, +0.002847f, -0.010874f, + +0.017484f, +0.002140f, +0.022426f, -0.004511f, +0.004302f, +0.001159f, +0.011068f, +0.011815f, -0.013902f, -0.005333f, + +0.012098f, -0.002706f, +0.010910f, -0.013514f, -0.003173f, +0.006506f, +0.014444f, -0.002403f, -0.005552f, +0.000450f, + +0.000748f, +0.004205f, +0.014531f, +0.005254f, +0.001508f, -0.001521f, -0.009161f, -0.011067f, -0.002805f, +0.001804f, + +0.009882f, +0.005166f, +0.000707f, +0.002149f, +0.004961f, -0.004844f, +0.003188f, +0.007751f, +0.002173f, -0.003263f, + -0.004243f, -0.002873f, -0.005541f, -0.003768f, -0.001516f, -0.001592f, -0.001302f, -0.000143f, -0.000422f, -0.001991f, + +0.002947f, -0.000562f, +0.000985f, +0.000915f, -0.000457f, +0.000614f, +0.000214f, +0.002558f, -0.001079f, +0.002400f, + -0.000323f, +0.002326f, +0.001576f, +0.002253f, +0.000393f, -0.001854f + }, + { + -0.000653f, +0.070744f, +0.031557f, +0.021325f, -0.018352f, +0.004939f, -0.001763f, +0.008357f, -0.001595f, -0.013438f, + +0.035653f, +0.001891f, -0.021623f, +0.008806f, +0.024870f, +0.008862f, +0.012072f, +0.014947f, -0.028245f, -0.005372f, + +0.008521f, -0.019753f, +0.017280f, -0.006984f, -0.009209f, +0.018965f, +0.003286f, +0.012677f, -0.020496f, +0.001112f, + +0.010750f, -0.029301f, -0.017196f, +0.011661f, -0.016279f, +0.007343f, -0.007060f, +0.008260f, +0.000187f, +0.000435f, + -0.014143f, -0.010175f, +0.004774f, +0.016186f, -0.003297f, -0.004315f, -0.003572f, +0.011955f, -0.009673f, +0.004514f, + +0.004214f, +0.004849f, -0.002975f, -0.002698f, -0.004340f, -0.007714f, -0.008192f, +0.004905f, +0.000678f, +0.006781f, + -0.004894f, -0.005403f, -0.003254f, -0.002229f, +0.004355f, +0.000764f, +0.000988f, -0.001346f, +0.001809f, +0.002247f, + -0.002200f, -0.002740f, +0.005682f, +0.000792f, -0.000310f, +0.000258f, -0.001689f, -0.002312f, +0.001646f, +0.000274f, + -0.002069f, -0.000577f, +0.001542f, -0.001456f, -0.003119f, +0.001996f, +0.002380f, +0.000829f, -0.004404f, +0.001643f, + -0.001052f, -0.000444f, +0.001448f, -0.000033f, +0.000379f, -0.000420f + }, + { + -0.107232f, +0.300186f, +0.046764f, +0.004821f, +0.019408f, +0.007064f, -0.006547f, +0.003352f, +0.008722f, +0.040906f, + -0.009086f, -0.019766f, +0.015787f, +0.005859f, +0.022613f, -0.000442f, +0.030117f, +0.021257f, -0.014369f, -0.008023f, + -0.006072f, -0.009086f, +0.006667f, -0.012886f, -0.000898f, -0.008908f, -0.029388f, +0.002455f, -0.005396f, +0.008092f, + +0.005485f, +0.011255f, -0.001613f, -0.000409f, +0.002796f, +0.011466f, -0.000607f, +0.012520f, +0.002604f, +0.029840f, + +0.006151f, -0.008123f, -0.001867f, -0.014082f, +0.000978f, +0.004741f, +0.017673f, -0.004543f, +0.002791f, -0.011057f, + -0.004620f, +0.000757f, -0.000257f, +0.005384f, +0.000452f, -0.004000f, +0.001717f, +0.008026f, -0.001626f, +0.000261f, + -0.001068f, +0.006009f, -0.001637f, -0.000959f, +0.005130f, -0.004566f, +0.003509f, -0.004599f, -0.004310f, +0.003919f, + -0.000779f, +0.000679f, -0.003171f, -0.000945f, +0.000919f, -0.000714f, -0.001125f, -0.001599f, -0.000878f, +0.000462f, + -0.001167f, +0.000727f, +0.002703f, +0.001363f, +0.000450f, -0.000518f, +0.000958f, -0.003382f, -0.001763f, -0.000180f, + +0.001357f, -0.001376f, -0.001768f, -0.001960f, -0.000518f, +0.002499f + }, + { + -0.002826f, +0.045317f, +0.003255f, -0.008339f, +0.004355f, -0.002694f, -0.000410f, -0.000375f, +0.006863f, -0.005021f, + +0.009752f, -0.006752f, -0.004118f, -0.036032f, -0.051368f, -0.041867f, -0.020114f, +0.011298f, +0.060598f, +0.004450f, + +0.011519f, -0.029563f, -0.030037f, +0.030554f, +0.000764f, -0.025396f, +0.028137f, -0.009130f, +0.024724f, -0.039969f, + +0.005602f, -0.005394f, -0.044581f, +0.014922f, +0.012549f, -0.013661f, -0.004873f, -0.000864f, +0.003665f, -0.001648f, + -0.000933f, +0.001210f, -0.001271f, -0.011148f, -0.005606f, +0.000036f, +0.003227f, -0.008036f, +0.003251f, +0.002527f, + +0.000498f, -0.002912f, -0.002893f, +0.004828f, -0.001933f, +0.005559f, +0.004344f, -0.000687f, -0.009432f, +0.003058f, + -0.000768f, -0.003524f, +0.004842f, +0.006499f, -0.000958f, +0.001664f, +0.004949f, +0.003705f, -0.000470f, +0.002158f, + -0.006306f, -0.003395f, +0.002610f, -0.000217f, -0.002173f, -0.000007f, +0.003887f, +0.001989f, +0.003017f, +0.002073f, + -0.003238f, +0.000055f, -0.003134f, -0.000315f, +0.001653f, +0.003509f, +0.001618f, -0.001023f, +0.000344f, +0.000478f, + +0.001100f, -0.000406f, -0.000891f, -0.001591f, -0.000919f, +0.000176f + }, + { + -0.149720f, +0.344919f, +0.024061f, +0.019526f, -0.004457f, -0.007037f, +0.007817f, +0.012318f, -0.028966f, -0.006953f, + +0.016565f, -0.015264f, +0.038406f, -0.033493f, -0.003854f, +0.003074f, -0.029457f, +0.002750f, +0.014296f, +0.024260f, + +0.019249f, +0.011363f, -0.009225f, +0.008686f, -0.002278f, +0.007155f, -0.001900f, -0.002007f, -0.011441f, -0.008878f, + -0.010353f, -0.024610f, -0.001325f, +0.006471f, -0.010160f, +0.009612f, -0.006107f, +0.002625f, +0.003181f, +0.007706f, + +0.001963f, -0.005901f, -0.000329f, -0.003325f, -0.010763f, +0.001089f, +0.004851f, +0.000722f, -0.012347f, +0.003469f, + +0.004790f, +0.000149f, +0.010229f, -0.003938f, +0.003232f, -0.003687f, +0.002071f, +0.000666f, -0.002780f, -0.001278f, + +0.000541f, -0.002383f, +0.005388f, +0.006128f, +0.001584f, -0.004620f, -0.000800f, -0.001976f, -0.002872f, +0.002040f, + +0.001715f, -0.000303f, +0.005289f, -0.000941f, +0.000205f, -0.001659f, +0.000171f, +0.000243f, -0.002869f, +0.001889f, + -0.001888f, +0.002213f, -0.002461f, -0.003157f, +0.003283f, +0.001198f, +0.000268f, -0.000882f, +0.002375f, -0.001132f, + -0.002154f, +0.002498f, -0.000905f, -0.001716f, -0.001784f, +0.001649f + }, + { + -0.000334f, +0.030699f, +0.012403f, -0.000689f, -0.007177f, +0.000098f, +0.000978f, -0.004760f, +0.005556f, -0.019492f, + -0.006364f, -0.009521f, -0.005955f, -0.029562f, +0.019385f, -0.018792f, -0.087509f, -0.011053f, +0.016657f, -0.019652f, + -0.006524f, +0.030774f, +0.003670f, -0.051190f, -0.024332f, -0.018493f, -0.007756f, -0.026524f, -0.003782f, +0.049144f, + +0.039313f, +0.013067f, -0.000264f, +0.006707f, -0.000374f, +0.014830f, +0.000969f, +0.007421f, +0.001156f, +0.010136f, + +0.001594f, +0.002013f, -0.009171f, +0.001719f, +0.011848f, +0.001043f, +0.001303f, -0.001643f, +0.007180f, +0.006284f, + +0.004779f, +0.003879f, +0.007735f, +0.004129f, +0.000199f, +0.001603f, +0.000595f, +0.001696f, +0.012614f, -0.001832f, + -0.004131f, -0.008174f, -0.005019f, +0.005807f, +0.000052f, +0.000826f, -0.002463f, +0.004776f, +0.006710f, +0.000322f, + -0.009661f, -0.004574f, +0.001768f, +0.000663f, +0.003844f, +0.000002f, +0.001669f, -0.002246f, -0.000143f, -0.000113f, + -0.000723f, -0.001578f, +0.001310f, +0.002951f, -0.002524f, -0.000403f, +0.005596f, -0.001126f, +0.001711f, +0.004477f, + -0.001790f, +0.000420f, +0.001136f, +0.001524f, +0.002482f, -0.000990f + }, + { + -0.010294f, -0.848040f, -0.020418f, +0.009994f, +0.000874f, +0.010033f, -0.028628f, +0.003051f, +0.000271f, -0.004697f, + +0.012756f, +0.000041f, -0.017948f, +0.020925f, +0.017296f, +0.010712f, -0.024774f, +0.009425f, -0.028069f, +0.006006f, + +0.004684f, +0.006867f, +0.012471f, -0.002503f, -0.013283f, -0.007221f, +0.010435f, -0.000613f, -0.009936f, -0.004521f, + +0.006906f, -0.002817f, +0.003158f, +0.006747f, +0.005421f, +0.014597f, -0.001400f, +0.016041f, +0.004277f, +0.000557f, + -0.006236f, +0.010106f, +0.007277f, -0.000261f, +0.003131f, +0.008841f, +0.014270f, -0.009741f, -0.006740f, +0.011133f, + -0.012986f, +0.007922f, -0.008933f, -0.006032f, +0.004367f, -0.008208f, +0.002081f, +0.000912f, +0.004241f, -0.000748f, + -0.003709f, -0.009932f, +0.002393f, -0.002930f, -0.002457f, +0.006826f, +0.004835f, +0.001479f, -0.001606f, +0.005222f, + -0.007206f, -0.000935f, -0.000744f, +0.004561f, +0.001757f, +0.000003f, -0.000399f, +0.001024f, +0.000863f, -0.000173f, + -0.002655f, -0.001359f, +0.001920f, +0.001986f, +0.003654f, +0.003187f, +0.000709f, +0.001863f, +0.000069f, -0.001120f, + +0.001453f, +0.000069f, +0.001363f, -0.000610f, -0.002207f, -0.001230f + }, + { + -0.000084f, +0.026092f, +0.001789f, +0.003279f, +0.010974f, -0.002440f, -0.000990f, -0.004519f, -0.003326f, +0.002210f, + -0.006430f, +0.002374f, +0.003611f, -0.033866f, -0.135139f, -0.039859f, -0.026439f, +0.012672f, -0.035322f, +0.037344f, + +0.018341f, -0.028373f, -0.020759f, +0.050668f, +0.000572f, -0.007225f, +0.007893f, +0.013750f, -0.003466f, +0.034443f, + -0.032117f, +0.007431f, +0.008403f, -0.004885f, -0.004769f, +0.012983f, -0.007317f, -0.009924f, +0.000303f, -0.002104f, + -0.006344f, +0.011098f, -0.000801f, -0.002598f, +0.011946f, +0.005295f, +0.002094f, +0.002058f, +0.003574f, +0.007477f, + -0.000038f, +0.002452f, -0.003311f, +0.003503f, +0.002958f, +0.004634f, -0.008296f, +0.007633f, -0.004217f, -0.000524f, + -0.013909f, +0.002018f, -0.002447f, +0.008221f, -0.000232f, +0.001209f, +0.000511f, -0.002943f, -0.000049f, -0.005618f, + +0.000641f, -0.000251f, +0.000468f, +0.003085f, -0.001384f, -0.005597f, +0.002362f, -0.003651f, -0.003296f, +0.001833f, + +0.001750f, -0.002582f, -0.001140f, +0.000930f, -0.000545f, -0.000056f, +0.001175f, +0.000843f, -0.002307f, +0.000484f, + -0.002092f, -0.000759f, +0.001055f, -0.003180f, -0.000593f, +0.002492f + }, + { + -0.007776f, -0.550591f, -0.026647f, +0.038045f, -0.020741f, +0.004140f, +0.037182f, +0.040720f, +0.044450f, +0.024638f, + -0.001865f, +0.007608f, +0.032013f, +0.015276f, +0.002316f, +0.037026f, +0.029545f, +0.017835f, +0.007225f, +0.002286f, + -0.017079f, +0.001573f, +0.006691f, -0.017421f, -0.019752f, +0.024366f, -0.027371f, -0.027249f, -0.024814f, +0.011515f, + +0.004582f, +0.005758f, -0.009739f, +0.005041f, +0.009573f, +0.006187f, +0.024219f, -0.008967f, -0.013499f, -0.014021f, + +0.033172f, -0.001065f, +0.007801f, -0.018569f, +0.010497f, -0.011797f, -0.001491f, +0.001453f, +0.000209f, +0.002341f, + +0.018771f, +0.004673f, -0.005667f, -0.009837f, -0.003112f, +0.002223f, -0.001078f, +0.009363f, +0.002063f, +0.002210f, + -0.000398f, -0.010838f, -0.001846f, +0.005887f, -0.000875f, -0.003198f, +0.005907f, +0.000513f, -0.004006f, +0.003149f, + +0.003934f, -0.002747f, -0.001155f, +0.003751f, -0.003162f, -0.000426f, -0.002153f, -0.001938f, -0.001011f, +0.004310f, + +0.000343f, -0.002081f, -0.002353f, -0.001218f, -0.001644f, -0.002355f, +0.002424f, +0.001805f, -0.003065f, -0.000320f, + -0.003770f, -0.001466f, -0.003582f, -0.000777f, -0.002802f, +0.001758f + }, + { + +0.006023f, +0.071414f, -0.014593f, -0.008342f, -0.011628f, +0.010673f, +0.005228f, -0.001796f, -0.007171f, +0.002395f, + -0.005064f, +0.015038f, +0.013899f, -0.001575f, +0.038228f, -0.011919f, +0.018808f, -0.042507f, +0.014080f, +0.008009f, + -0.022159f, +0.011546f, +0.035743f, -0.008529f, +0.018416f, +0.001675f, -0.005048f, -0.012402f, -0.006255f, +0.010366f, + -0.001087f, +0.004916f, +0.024147f, -0.001377f, -0.026508f, -0.000140f, -0.001162f, -0.007219f, +0.013216f, +0.001410f, + -0.001932f, +0.017890f, +0.007550f, -0.001328f, -0.002003f, -0.008621f, -0.012947f, -0.006197f, +0.007118f, +0.006263f, + -0.005160f, +0.001000f, +0.007770f, -0.005330f, -0.000880f, -0.000022f, +0.007330f, -0.001163f, +0.010069f, -0.007093f, + -0.002678f, +0.003037f, -0.006167f, -0.006745f, -0.003202f, -0.003675f, +0.000343f, +0.001477f, +0.001138f, +0.001134f, + +0.001265f, -0.000467f, +0.004608f, +0.002328f, -0.000726f, +0.000666f, -0.001306f, -0.001741f, -0.000469f, -0.001804f, + +0.002864f, -0.001915f, +0.000378f, -0.002507f, +0.002209f, -0.004878f, -0.000909f, -0.001857f, +0.004003f, -0.000167f, + -0.000899f, +0.001661f, -0.001351f, -0.002554f, +0.001988f, +0.002865f + }, + { + +0.105081f, -0.007642f, -0.032765f, -0.037362f, +0.037648f, +0.082644f, -0.042364f, +0.011706f, +0.014198f, +0.001124f, + +0.021490f, +0.001855f, -0.007682f, -0.012611f, -0.016416f, +0.003189f, +0.012016f, -0.019772f, +0.019043f, -0.017453f, + -0.021339f, +0.006629f, +0.022633f, +0.009757f, -0.009378f, +0.015523f, -0.003972f, +0.004792f, +0.004642f, -0.005619f, + -0.001343f, -0.002150f, -0.004474f, -0.005002f, -0.007177f, +0.033349f, -0.023057f, -0.014983f, -0.008335f, +0.014492f, + -0.002003f, +0.026813f, -0.015841f, +0.005837f, +0.012461f, +0.005771f, +0.002434f, +0.004384f, -0.002122f, -0.002663f, + -0.002391f, -0.006111f, -0.012517f, -0.002237f, +0.002446f, -0.005146f, +0.007272f, +0.001927f, +0.004586f, +0.000508f, + +0.005119f, +0.000303f, -0.002209f, +0.001409f, +0.001649f, +0.003772f, -0.000645f, +0.004115f, -0.001165f, +0.002790f, + +0.000258f, +0.000998f, -0.000572f, -0.005009f, -0.004388f, +0.001983f, +0.001789f, +0.000841f, +0.001147f, -0.002590f, + +0.000523f, +0.000329f, +0.001328f, +0.002086f, -0.002864f, -0.000629f, -0.002633f, +0.000786f, -0.000707f, -0.000106f, + +0.001519f, -0.000748f, +0.002269f, -0.001507f, +0.000907f, +0.000140f + }, + { + -0.002626f, +0.093380f, +0.002120f, -0.004326f, +0.016049f, -0.024272f, +0.005191f, -0.001939f, -0.001061f, -0.005256f, + +0.002585f, +0.004167f, -0.024444f, +0.044458f, +0.006098f, +0.084248f, +0.006357f, +0.028703f, -0.006642f, +0.008129f, + -0.037116f, +0.011692f, +0.070742f, +0.005385f, -0.038732f, +0.034078f, +0.020753f, -0.028655f, -0.003641f, +0.025939f, + -0.001009f, -0.005129f, +0.023503f, -0.008333f, +0.010349f, +0.006036f, +0.003021f, +0.007573f, +0.007790f, +0.013615f, + -0.005829f, -0.000242f, -0.012789f, +0.003578f, -0.006346f, -0.014761f, +0.008222f, -0.006698f, +0.010594f, +0.000835f, + +0.007069f, +0.013815f, +0.011128f, -0.007257f, +0.010951f, +0.007143f, +0.012140f, +0.004084f, +0.000700f, +0.002626f, + -0.003998f, +0.011526f, -0.001402f, -0.007194f, +0.002442f, -0.000621f, +0.004100f, -0.004550f, -0.005480f, -0.004882f, + -0.008514f, +0.007866f, -0.003965f, +0.000613f, +0.003744f, +0.000024f, +0.002673f, -0.002356f, -0.000442f, -0.001237f, + +0.001873f, -0.001097f, -0.001885f, -0.000529f, +0.000085f, +0.003286f, -0.003026f, -0.002429f, -0.001062f, -0.000704f, + -0.000495f, -0.000738f, -0.000175f, -0.000235f, -0.000103f, -0.000792f + }, + { + +0.025207f, +0.234514f, -0.001956f, -0.020248f, -0.009028f, +0.006522f, -0.000408f, -0.017540f, +0.005520f, -0.008652f, + -0.025992f, -0.058633f, -0.026345f, -0.019107f, +0.056958f, +0.007543f, -0.007314f, +0.002693f, -0.019291f, +0.002099f, + +0.014705f, +0.009852f, +0.016810f, +0.007383f, +0.032208f, -0.015904f, +0.018812f, +0.008732f, +0.035426f, -0.003762f, + -0.021750f, -0.016707f, -0.000199f, +0.000237f, -0.003159f, -0.008980f, -0.022018f, -0.003625f, +0.008386f, +0.014896f, + +0.020902f, -0.007882f, -0.013037f, +0.006872f, -0.019243f, +0.003667f, -0.002431f, -0.013277f, -0.008812f, +0.004048f, + +0.003957f, +0.009129f, -0.000732f, -0.002050f, +0.003641f, +0.000042f, +0.000442f, +0.003256f, -0.009473f, +0.003747f, + +0.002028f, -0.004344f, -0.000308f, +0.000584f, +0.007095f, -0.001180f, -0.001411f, +0.001428f, -0.002416f, -0.011092f, + +0.002248f, -0.004894f, -0.005248f, +0.001811f, -0.000513f, -0.000462f, +0.002435f, -0.000860f, -0.001449f, +0.001474f, + +0.000696f, +0.001159f, -0.001954f, -0.003443f, -0.001387f, -0.002397f, +0.000021f, -0.000819f, +0.001392f, +0.003167f, + +0.001431f, +0.000248f, +0.000045f, -0.002206f, +0.001075f, +0.001073f + }, + { + -0.011323f, -0.053212f, +0.005739f, -0.004834f, -0.004629f, -0.010345f, -0.013685f, +0.006931f, +0.010598f, +0.002902f, + +0.001555f, +0.001974f, -0.023273f, +0.002587f, +0.112378f, +0.051719f, -0.021285f, -0.018419f, +0.006370f, -0.082440f, + -0.013845f, +0.051838f, -0.007677f, -0.008002f, -0.002531f, -0.003879f, -0.002609f, +0.005778f, +0.035190f, -0.012277f, + +0.039671f, +0.032611f, +0.002826f, -0.008166f, +0.012179f, -0.011204f, +0.005038f, -0.001567f, -0.008713f, +0.006224f, + +0.005195f, -0.000772f, +0.011915f, -0.025127f, -0.010147f, +0.000109f, -0.009342f, -0.002570f, -0.018227f, +0.003054f, + +0.003554f, +0.004090f, +0.010688f, -0.001503f, -0.014051f, -0.005272f, -0.012400f, +0.006527f, +0.010152f, +0.006758f, + +0.007191f, +0.001336f, -0.005387f, -0.001318f, +0.002112f, -0.000028f, +0.005267f, -0.014847f, +0.005562f, +0.004033f, + -0.001652f, +0.001298f, +0.003633f, -0.001605f, -0.000355f, +0.003471f, -0.000015f, -0.006111f, +0.001866f, +0.001688f, + -0.004697f, -0.002901f, +0.000194f, -0.003293f, +0.002147f, -0.001010f, -0.000229f, -0.000250f, -0.000453f, -0.000071f, + +0.000323f, -0.000145f, -0.000030f, +0.002498f, +0.000789f, -0.000582f + } + }, + { + { + +0.024004f, -0.135928f, -0.224855f, -0.041956f, -0.008227f, +0.000042f, -0.005493f, -0.007654f, -0.007453f, -0.032411f, + -0.008290f, -0.013212f, -0.019392f, +0.010401f, +0.022960f, -0.008271f, -0.024896f, -0.005002f, -0.016089f, -0.000033f, + -0.029907f, +0.015917f, -0.010181f, +0.001140f, +0.012372f, +0.018126f, +0.004033f, -0.009575f, +0.017461f, +0.003211f, + -0.012420f, -0.007860f, +0.003852f, +0.009736f, -0.004311f, +0.009708f, +0.005727f, -0.004252f, +0.012033f, +0.012728f, + -0.002600f, +0.005440f, -0.001372f, -0.005735f, -0.004084f, -0.011708f, -0.001536f, +0.002432f, -0.001235f, +0.004076f, + -0.013213f, -0.008099f, +0.003472f, -0.000988f, +0.006530f, +0.000964f, -0.007506f, -0.010260f, +0.002028f, -0.011859f, + -0.006957f, +0.005898f, +0.005330f, -0.002000f, -0.007341f, -0.011007f, -0.000837f, -0.001588f, +0.001629f, +0.001020f, + -0.000661f, +0.002574f, -0.003416f, -0.000838f, -0.001418f, -0.000429f, -0.001772f, -0.000187f, -0.002684f, +0.000605f, + -0.002832f, +0.001151f, +0.000294f, +0.003540f, -0.000907f, -0.000807f, +0.000879f, +0.000342f, -0.001205f, +0.001413f, + -0.000139f, -0.001737f, +0.001873f, -0.001533f, +0.000897f, -0.001444f + }, + { + -0.002949f, +0.042710f, -0.006219f, -0.011311f, +0.026281f, -0.004313f, -0.005717f, -0.007546f, +0.002997f, -0.024242f, + -0.002916f, -0.012703f, +0.000662f, +0.030769f, +0.029151f, +0.025035f, +0.003671f, -0.021259f, +0.034848f, -0.020815f, + +0.011864f, +0.033050f, -0.014385f, +0.004583f, -0.016309f, -0.027525f, -0.002302f, -0.018653f, +0.018852f, +0.006548f, + +0.015972f, -0.007676f, +0.030630f, -0.006773f, +0.001301f, -0.009562f, -0.003044f, +0.020754f, +0.004542f, +0.000211f, + +0.007907f, -0.005348f, +0.009220f, -0.008879f, +0.001264f, +0.001259f, +0.010984f, +0.007105f, +0.002104f, -0.001158f, + +0.002187f, +0.001252f, +0.005513f, +0.001370f, +0.009253f, +0.010746f, -0.004277f, -0.011109f, -0.004230f, -0.000355f, + +0.003240f, +0.003413f, +0.002407f, -0.000014f, +0.003077f, -0.005730f, -0.002332f, +0.001609f, -0.000453f, -0.004675f, + -0.002051f, +0.004114f, +0.003007f, -0.003455f, -0.002834f, -0.001340f, -0.000986f, -0.000067f, +0.001089f, -0.000194f, + +0.001549f, -0.000649f, +0.000695f, +0.001085f, -0.000880f, -0.000886f, -0.000845f, +0.002076f, -0.002164f, +0.001240f, + +0.000075f, +0.000697f, -0.001933f, +0.000477f, +0.001534f, -0.000172f + }, + { + +0.002693f, -0.017521f, -0.026084f, +0.047922f, -0.001562f, +0.007194f, +0.005644f, -0.003202f, -0.013146f, -0.002241f, + +0.030086f, +0.012654f, -0.011846f, -0.020343f, +0.016033f, +0.016590f, -0.000241f, +0.004671f, +0.001928f, -0.003193f, + +0.012196f, -0.013796f, +0.021190f, -0.001588f, -0.033019f, +0.010399f, +0.009758f, +0.005908f, -0.024004f, -0.007137f, + +0.008286f, -0.018899f, -0.008439f, +0.013956f, -0.007443f, +0.012944f, -0.004631f, +0.001742f, -0.008320f, -0.002858f, + +0.001724f, +0.000053f, -0.005501f, +0.004961f, -0.003759f, -0.003900f, -0.010037f, +0.006052f, -0.006753f, -0.001642f, + -0.004733f, +0.002083f, -0.005989f, -0.001181f, +0.003337f, -0.000963f, -0.004075f, +0.003822f, +0.002265f, +0.006865f, + -0.003132f, -0.004861f, -0.002501f, -0.001751f, +0.000165f, -0.002398f, +0.001462f, +0.000611f, +0.002035f, +0.001341f, + +0.000773f, -0.004562f, +0.001022f, -0.000451f, -0.000338f, +0.000859f, -0.000280f, -0.002746f, +0.000285f, +0.003415f, + +0.003252f, +0.001609f, -0.000325f, -0.000801f, -0.000965f, +0.002516f, -0.000153f, +0.001005f, -0.002692f, +0.002984f, + -0.000714f, -0.002417f, +0.001362f, +0.000949f, +0.001527f, -0.001083f + }, + { + +0.079098f, +0.434690f, -0.050173f, -0.026413f, +0.000453f, +0.012156f, +0.010185f, +0.000098f, -0.014123f, +0.023288f, + +0.010926f, -0.021071f, -0.008579f, +0.000183f, +0.026530f, -0.015500f, +0.017843f, +0.029573f, -0.014376f, -0.009043f, + -0.009542f, -0.021215f, +0.010716f, -0.007014f, +0.001088f, +0.025557f, -0.005257f, +0.012852f, -0.002399f, +0.004443f, + +0.008440f, +0.009755f, +0.002669f, +0.002477f, -0.007511f, +0.011105f, -0.009511f, -0.000100f, -0.007548f, +0.007775f, + -0.001703f, -0.004200f, -0.000661f, -0.002891f, +0.005854f, -0.007612f, +0.017424f, -0.002114f, +0.007278f, -0.001000f, + -0.005177f, +0.005891f, +0.001355f, +0.000328f, -0.003778f, -0.009263f, -0.000089f, +0.002648f, -0.004323f, +0.001223f, + -0.003468f, +0.007331f, +0.000875f, -0.003413f, +0.005167f, -0.002950f, +0.003231f, -0.001555f, +0.000765f, +0.005734f, + +0.002371f, +0.005616f, -0.000116f, -0.002151f, +0.000619f, +0.001677f, +0.001050f, +0.001078f, -0.000370f, +0.000722f, + -0.000261f, -0.001029f, -0.001007f, +0.000548f, +0.000706f, +0.000769f, +0.001416f, -0.002621f, -0.001460f, -0.000604f, + +0.000258f, -0.001225f, +0.000417f, -0.001024f, -0.000600f, +0.001705f + }, + { + +0.003604f, +0.047317f, +0.000776f, -0.014562f, +0.002359f, +0.001574f, -0.002221f, -0.006064f, +0.005475f, -0.001998f, + +0.009007f, -0.012147f, -0.005171f, -0.029446f, -0.045673f, -0.011553f, +0.031658f, -0.044866f, +0.020684f, +0.028113f, + +0.001911f, -0.012464f, -0.019808f, +0.000528f, +0.007300f, +0.004327f, +0.039562f, -0.007297f, +0.019612f, -0.027003f, + +0.008650f, +0.007861f, -0.010534f, +0.019084f, -0.005764f, -0.012463f, -0.005039f, -0.008434f, +0.005673f, -0.003831f, + +0.006747f, +0.004172f, -0.010027f, -0.014149f, +0.004541f, +0.005266f, +0.003515f, -0.011649f, +0.005449f, +0.003154f, + -0.000505f, +0.000145f, -0.004051f, +0.003071f, -0.000140f, +0.005957f, +0.001401f, -0.000509f, -0.005829f, +0.005695f, + -0.000438f, -0.002540f, +0.004696f, +0.004684f, -0.005838f, -0.001961f, +0.003385f, +0.003363f, +0.000573f, +0.001305f, + -0.004047f, -0.002397f, +0.000847f, +0.000209f, -0.001769f, -0.003238f, -0.000718f, +0.000533f, +0.000524f, +0.001421f, + -0.001494f, +0.002634f, -0.001472f, +0.000810f, +0.001163f, +0.001513f, +0.000985f, -0.000285f, -0.001097f, -0.001305f, + +0.000579f, +0.001378f, +0.001572f, -0.001459f, -0.001649f, -0.000809f + }, + { + +0.105851f, +0.553182f, -0.067249f, +0.076441f, +0.030519f, +0.007088f, -0.014107f, -0.010999f, -0.008591f, -0.018046f, + -0.005664f, -0.018492f, +0.042930f, -0.045356f, -0.015344f, +0.021848f, +0.006516f, +0.013229f, -0.001188f, -0.010437f, + -0.014034f, +0.009201f, -0.003655f, +0.004450f, -0.012727f, +0.006854f, +0.005408f, +0.010820f, +0.003982f, -0.010310f, + -0.004726f, -0.001605f, +0.003631f, +0.002186f, -0.003019f, +0.012012f, -0.015757f, -0.010864f, +0.001443f, +0.006712f, + +0.005660f, +0.011010f, -0.001337f, -0.007436f, -0.004769f, +0.016186f, +0.011500f, -0.002440f, -0.006618f, +0.002171f, + +0.006808f, +0.003225f, +0.011153f, -0.003600f, +0.003904f, +0.001857f, -0.000109f, -0.004955f, -0.006091f, -0.003896f, + -0.001533f, -0.004825f, +0.006558f, +0.003801f, +0.002160f, +0.001860f, +0.004505f, +0.002740f, -0.002837f, +0.000136f, + +0.002203f, -0.001966f, +0.006399f, +0.002301f, +0.003347f, +0.000938f, +0.000292f, -0.000044f, +0.000170f, +0.002975f, + -0.002281f, +0.002028f, -0.002661f, -0.004112f, +0.000938f, -0.000693f, +0.000704f, -0.000873f, +0.003252f, -0.000425f, + -0.001078f, +0.004188f, +0.000291f, -0.000015f, -0.000667f, +0.000739f + }, + { + -0.000596f, +0.009413f, -0.002134f, +0.011363f, +0.003506f, +0.001025f, -0.000396f, -0.005040f, +0.011276f, -0.002185f, + +0.008842f, +0.001498f, +0.004817f, +0.018144f, +0.090057f, +0.078232f, +0.003815f, +0.019145f, +0.013854f, -0.028747f, + -0.008892f, +0.024213f, +0.041314f, -0.022205f, -0.022430f, -0.014612f, -0.004938f, -0.009917f, +0.021837f, +0.018946f, + -0.007361f, -0.008890f, +0.003897f, +0.011342f, -0.011749f, -0.000912f, -0.005019f, -0.000276f, -0.004215f, +0.000159f, + -0.000017f, +0.003073f, -0.011149f, +0.003551f, +0.005894f, -0.008082f, +0.003009f, +0.004280f, +0.002527f, -0.002404f, + -0.003658f, -0.004643f, -0.000129f, +0.004427f, +0.000887f, -0.000477f, +0.001808f, +0.004701f, +0.011884f, -0.001407f, + -0.000160f, -0.001579f, -0.001910f, +0.003879f, -0.002734f, -0.001228f, -0.005643f, -0.001184f, +0.001637f, +0.003070f, + -0.004628f, -0.002757f, +0.001746f, -0.000936f, +0.001620f, -0.000483f, +0.003043f, -0.003209f, -0.000535f, -0.001603f, + +0.000390f, +0.001991f, +0.000535f, +0.001991f, -0.002345f, -0.002456f, +0.003586f, -0.002797f, +0.001425f, +0.005212f, + -0.001565f, +0.001168f, -0.000479f, -0.001421f, +0.001586f, -0.001590f + }, + { + +0.063748f, -0.749600f, -0.014101f, -0.041032f, -0.036701f, +0.010296f, -0.010853f, +0.016003f, -0.000115f, -0.011367f, + -0.017052f, -0.011507f, -0.018627f, +0.035732f, +0.008054f, -0.021848f, -0.012531f, +0.044475f, -0.011433f, -0.003910f, + -0.003367f, -0.009729f, -0.006135f, -0.005427f, +0.004058f, -0.003365f, +0.000549f, +0.000153f, +0.003895f, +0.008307f, + +0.010781f, -0.006352f, +0.006165f, +0.010866f, +0.006353f, +0.018930f, -0.011046f, +0.006756f, +0.001490f, -0.001563f, + -0.001602f, +0.007695f, -0.000176f, -0.004762f, +0.003968f, +0.012210f, +0.009811f, -0.004328f, -0.001597f, +0.001781f, + -0.017392f, +0.012706f, -0.000382f, -0.006170f, -0.005332f, -0.014701f, +0.001535f, +0.002820f, +0.009193f, +0.009976f, + +0.007206f, -0.005997f, +0.000242f, -0.005506f, -0.002737f, +0.001792f, -0.003378f, +0.001350f, +0.002549f, +0.004346f, + -0.005854f, +0.003184f, -0.002413f, +0.000938f, +0.002223f, +0.000088f, -0.000878f, -0.000905f, -0.000226f, +0.002328f, + -0.001639f, -0.001878f, +0.001623f, +0.000535f, +0.002439f, +0.001743f, -0.002534f, +0.000696f, +0.001696f, -0.000677f, + -0.000204f, -0.002594f, -0.001563f, -0.001602f, -0.000815f, +0.000623f + }, + { + -0.002118f, +0.000862f, -0.015436f, -0.004164f, +0.002023f, -0.001379f, +0.000855f, -0.003584f, +0.000224f, +0.002354f, + -0.006676f, +0.002241f, +0.010408f, +0.028213f, -0.069155f, -0.000738f, +0.020385f, +0.035196f, -0.045898f, +0.000522f, + +0.002739f, -0.022814f, -0.005043f, +0.014078f, -0.061012f, -0.011321f, -0.015479f, -0.008756f, -0.006965f, +0.031887f, + -0.010220f, +0.022457f, +0.013050f, -0.009452f, -0.012729f, +0.019545f, +0.008345f, -0.009344f, +0.004047f, +0.011303f, + -0.010722f, +0.000308f, +0.005017f, -0.006301f, +0.006056f, -0.000105f, -0.000187f, +0.006040f, +0.009258f, +0.007874f, + -0.002304f, +0.006757f, -0.003328f, +0.004295f, +0.006541f, +0.006723f, -0.008934f, +0.001572f, -0.005021f, +0.008540f, + -0.004369f, +0.007836f, -0.005169f, +0.003762f, +0.001024f, -0.000660f, +0.001921f, +0.001511f, +0.002864f, -0.005022f, + +0.002142f, +0.003147f, -0.002140f, +0.002196f, +0.000754f, -0.003264f, +0.004091f, -0.003609f, -0.001164f, +0.001040f, + -0.000818f, +0.001828f, +0.002462f, -0.001454f, -0.002846f, +0.001169f, +0.001285f, -0.000062f, -0.000682f, +0.002542f, + -0.003319f, -0.000881f, +0.002475f, -0.001386f, +0.000966f, +0.000347f + }, + { + +0.011510f, -0.484437f, +0.031484f, +0.005459f, -0.047075f, -0.036062f, -0.001781f, +0.009953f, +0.011225f, -0.009761f, + -0.014435f, -0.009941f, -0.009558f, -0.011529f, +0.011200f, +0.056589f, +0.031496f, +0.003872f, +0.013105f, +0.014010f, + -0.028568f, -0.009578f, +0.009169f, -0.003746f, -0.019662f, +0.018601f, -0.020173f, -0.012781f, -0.029396f, -0.000580f, + +0.011957f, +0.008264f, -0.006875f, +0.021871f, -0.004917f, -0.009831f, +0.019138f, -0.009982f, -0.005202f, -0.005379f, + +0.026754f, -0.010008f, +0.015853f, -0.006957f, +0.013081f, -0.018794f, -0.002796f, +0.005492f, +0.003089f, +0.000484f, + +0.004862f, -0.004497f, -0.004026f, -0.009271f, -0.001776f, +0.002022f, -0.007732f, +0.005444f, +0.003681f, +0.003017f, + +0.000176f, -0.010365f, -0.000283f, +0.004283f, -0.000127f, +0.000180f, +0.000361f, -0.001718f, -0.003033f, +0.000030f, + +0.002497f, -0.003217f, -0.000667f, +0.004733f, -0.003566f, +0.000254f, -0.002852f, -0.003377f, -0.001747f, +0.002717f, + -0.001083f, -0.000827f, -0.001085f, -0.002838f, -0.003769f, -0.003940f, +0.001049f, +0.002376f, -0.000184f, +0.002759f, + -0.002428f, +0.001388f, -0.001150f, +0.000416f, -0.001308f, +0.003120f + }, + { + -0.004353f, +0.100194f, +0.021190f, +0.002946f, -0.005322f, -0.001476f, -0.015824f, -0.002815f, +0.013421f, +0.019323f, + -0.020208f, -0.001750f, +0.020035f, +0.017609f, +0.051765f, +0.005724f, +0.041853f, -0.009157f, -0.012162f, -0.016413f, + +0.009455f, -0.002282f, +0.017464f, -0.002584f, +0.024941f, -0.003175f, -0.009353f, -0.020654f, +0.003416f, +0.018365f, + -0.002503f, -0.007639f, +0.001530f, +0.001241f, -0.024832f, +0.002222f, +0.009733f, -0.008910f, +0.005502f, -0.001619f, + -0.001269f, +0.004244f, -0.009490f, -0.011526f, -0.002044f, +0.006491f, -0.009778f, -0.010815f, +0.013508f, +0.017828f, + +0.001355f, -0.003702f, +0.008865f, +0.002327f, +0.000147f, -0.006285f, +0.003660f, -0.003219f, +0.006145f, -0.001997f, + +0.005207f, +0.001234f, -0.009832f, -0.002446f, -0.002225f, -0.000729f, +0.003682f, +0.001125f, +0.000946f, +0.003153f, + +0.002315f, -0.000326f, +0.006427f, +0.002803f, -0.001521f, +0.002110f, +0.002521f, -0.000125f, +0.001286f, -0.002308f, + -0.000667f, +0.001219f, +0.001460f, -0.004042f, +0.001555f, -0.004397f, +0.001359f, -0.000072f, +0.003548f, -0.000835f, + -0.002027f, +0.000931f, +0.000280f, -0.000368f, +0.000622f, -0.000274f + }, + { + -0.091905f, -0.244867f, -0.006086f, -0.033465f, -0.000923f, +0.030995f, -0.036135f, +0.030985f, +0.006538f, -0.000197f, + +0.022982f, -0.014894f, -0.010960f, +0.021304f, +0.005301f, -0.003175f, +0.012491f, -0.017396f, +0.017198f, -0.003028f, + -0.015605f, +0.005599f, +0.023430f, +0.002065f, -0.032369f, -0.003559f, -0.000604f, +0.004077f, +0.005058f, +0.007703f, + -0.001800f, -0.005751f, +0.011234f, +0.001077f, +0.001683f, +0.053737f, -0.010320f, -0.011697f, -0.005152f, +0.003653f, + -0.011937f, +0.013527f, -0.023203f, +0.005111f, -0.001705f, -0.001284f, -0.003171f, -0.010736f, -0.001413f, +0.011287f, + +0.004028f, +0.000340f, -0.009093f, +0.005039f, +0.010481f, -0.005375f, +0.007535f, +0.004199f, +0.009182f, -0.002734f, + -0.003928f, -0.002190f, -0.000491f, -0.000590f, +0.001753f, +0.004258f, -0.005401f, +0.002048f, +0.001193f, +0.005873f, + +0.002176f, -0.000486f, +0.001087f, -0.001205f, -0.001530f, +0.001787f, +0.001202f, +0.000633f, +0.000463f, -0.002638f, + +0.001537f, +0.000204f, +0.000405f, +0.001394f, -0.004083f, -0.000718f, -0.003862f, -0.001315f, -0.002284f, -0.002288f, + +0.000910f, -0.002548f, +0.001121f, -0.000082f, +0.001044f, +0.000560f + }, + { + +0.004017f, +0.058171f, -0.024441f, -0.008710f, +0.023144f, -0.020185f, -0.003318f, +0.000386f, +0.007360f, -0.009727f, + -0.002117f, +0.004970f, -0.031794f, +0.004172f, -0.103648f, -0.034967f, -0.024074f, +0.013395f, +0.015527f, +0.027088f, + +0.001930f, +0.046485f, +0.050386f, -0.004864f, -0.041870f, +0.022748f, +0.022595f, -0.006698f, +0.011857f, +0.010396f, + -0.003261f, +0.006278f, +0.046399f, -0.005989f, -0.006728f, +0.009006f, +0.003979f, +0.006678f, -0.011226f, +0.001770f, + -0.010958f, +0.008624f, -0.000305f, +0.012044f, -0.004967f, -0.013623f, +0.010656f, -0.006494f, +0.000503f, -0.011654f, + +0.002614f, +0.005604f, +0.002298f, -0.014053f, -0.001719f, -0.003757f, +0.008508f, +0.000184f, -0.001858f, +0.003303f, + -0.005746f, -0.001792f, -0.005633f, -0.002572f, +0.002957f, +0.000189f, +0.010573f, -0.001351f, -0.004215f, -0.003924f, + -0.008900f, +0.004278f, -0.002610f, -0.000186f, -0.002275f, -0.003226f, +0.002647f, -0.003682f, -0.000109f, +0.000747f, + +0.002054f, -0.001259f, +0.001044f, +0.001102f, -0.002851f, +0.001444f, -0.003995f, -0.000738f, +0.000303f, +0.000293f, + +0.000653f, +0.000075f, +0.000967f, +0.000041f, +0.001567f, +0.000178f + }, + { + -0.055998f, +0.130502f, +0.016540f, -0.027216f, -0.003366f, +0.020977f, +0.005846f, -0.013839f, -0.005005f, -0.009163f, + +0.012917f, -0.017841f, -0.013470f, -0.025309f, +0.027575f, -0.003974f, +0.011133f, +0.034599f, -0.014180f, -0.000432f, + +0.003535f, -0.007751f, +0.014503f, +0.011731f, +0.024455f, -0.027956f, +0.014631f, -0.000566f, +0.011392f, -0.001317f, + +0.005557f, +0.002042f, +0.009342f, +0.004206f, -0.002626f, +0.005343f, -0.010794f, -0.005244f, -0.003456f, -0.016485f, + +0.021294f, -0.007694f, -0.021765f, +0.006528f, -0.005842f, +0.012261f, -0.010250f, -0.019057f, -0.011464f, +0.004060f, + +0.011413f, +0.007275f, -0.015413f, -0.014766f, +0.004312f, +0.005016f, +0.004269f, +0.007210f, -0.004358f, +0.003658f, + -0.003490f, -0.005235f, +0.001557f, +0.003445f, +0.006599f, -0.002478f, -0.003612f, +0.003299f, +0.000975f, -0.002323f, + +0.006381f, -0.003322f, -0.001822f, +0.000116f, -0.002687f, -0.001002f, +0.003570f, +0.001057f, -0.000641f, +0.000424f, + -0.002321f, -0.001699f, -0.001534f, -0.001000f, +0.000313f, +0.001540f, +0.003719f, -0.000123f, +0.000117f, +0.001353f, + +0.000703f, +0.001911f, +0.000351f, -0.001793f, +0.001233f, -0.000492f + }, + { + +0.010494f, -0.073975f, -0.024258f, -0.003216f, -0.006154f, -0.012662f, -0.030791f, -0.010134f, -0.002563f, +0.010902f, + +0.012916f, -0.013192f, -0.023051f, -0.015806f, +0.061459f, +0.016027f, -0.031530f, -0.009715f, +0.010228f, -0.064391f, + -0.020744f, +0.031326f, -0.029117f, -0.031400f, -0.023129f, -0.023928f, -0.022871f, -0.023634f, +0.054863f, -0.004109f, + +0.003801f, +0.011533f, -0.007155f, -0.005778f, +0.016663f, -0.010877f, +0.006562f, +0.018735f, -0.004082f, -0.009768f, + -0.000098f, -0.021578f, +0.001767f, -0.013568f, +0.004167f, +0.002569f, -0.002660f, +0.011405f, -0.005967f, +0.009777f, + +0.007883f, +0.004440f, +0.006779f, -0.004447f, -0.007635f, +0.002822f, -0.011192f, -0.000499f, +0.003047f, -0.001437f, + -0.003871f, -0.001968f, -0.001252f, -0.002192f, -0.001715f, -0.002366f, +0.006753f, -0.008829f, +0.010789f, +0.002805f, + -0.004873f, +0.001698f, +0.004218f, -0.001121f, -0.003647f, +0.000825f, -0.000937f, -0.007800f, +0.002122f, +0.003257f, + +0.000378f, +0.000619f, +0.001854f, -0.002103f, +0.003952f, -0.000707f, +0.000771f, +0.002210f, +0.001275f, +0.001144f, + +0.000734f, -0.000077f, -0.000099f, +0.001974f, +0.000166f, +0.000744f + } + }, + { + { + -0.023382f, -0.388903f, +0.069809f, -0.065486f, -0.004781f, +0.008430f, +0.001897f, -0.022310f, +0.002128f, -0.023692f, + -0.044787f, -0.006163f, +0.010006f, +0.017110f, +0.009771f, -0.029339f, +0.007916f, -0.015758f, -0.009957f, -0.018754f, + +0.004222f, -0.005160f, -0.005879f, +0.004042f, +0.021718f, +0.012055f, +0.019552f, -0.017701f, -0.011367f, +0.014568f, + -0.014434f, +0.006592f, +0.008908f, -0.004396f, +0.000704f, +0.003411f, +0.004393f, +0.008005f, +0.003479f, +0.007708f, + -0.000809f, -0.000704f, +0.001112f, +0.000353f, -0.015208f, -0.004970f, -0.001769f, -0.000657f, +0.000614f, -0.003081f, + -0.008408f, -0.003603f, -0.000252f, +0.003452f, +0.003181f, +0.002526f, -0.005101f, -0.002747f, -0.003882f, -0.007356f, + -0.004259f, +0.000298f, +0.003483f, +0.000099f, -0.008652f, -0.004806f, -0.004932f, -0.003213f, +0.002330f, +0.000623f, + -0.000061f, +0.000679f, -0.000612f, -0.001934f, -0.000350f, +0.001773f, -0.002603f, -0.001416f, -0.000021f, -0.001505f, + -0.001226f, -0.001670f, -0.000496f, +0.002204f, +0.001518f, -0.001040f, +0.000585f, +0.001087f, -0.001070f, +0.000413f, + -0.000376f, -0.000067f, +0.000356f, -0.000084f, -0.000009f, +0.000375f + }, + { + +0.001849f, +0.000112f, +0.007959f, +0.022002f, +0.001802f, +0.000032f, -0.006453f, -0.013999f, +0.002138f, -0.023793f, + -0.000016f, +0.005491f, +0.003980f, +0.014595f, +0.031620f, +0.043740f, -0.005849f, -0.017410f, -0.004182f, +0.029604f, + -0.014154f, +0.030841f, +0.006976f, -0.022751f, -0.000042f, -0.018977f, +0.001096f, -0.018209f, +0.012559f, +0.006272f, + +0.008962f, +0.003816f, +0.019385f, +0.001911f, -0.006196f, -0.009087f, +0.000051f, +0.011409f, +0.006674f, +0.006834f, + +0.002276f, +0.003506f, -0.005446f, +0.001594f, -0.003670f, +0.002920f, +0.005071f, +0.008271f, +0.002927f, -0.005538f, + +0.006838f, +0.005292f, +0.003308f, -0.004206f, +0.010930f, +0.008970f, -0.000961f, -0.003947f, -0.005067f, -0.002868f, + -0.001888f, +0.002697f, +0.005641f, +0.000174f, -0.002235f, -0.000374f, -0.000488f, -0.002691f, -0.000691f, -0.006984f, + +0.003285f, -0.000075f, +0.000644f, +0.000123f, -0.000150f, -0.002862f, +0.000530f, -0.000019f, +0.000082f, +0.000862f, + -0.000350f, +0.000195f, +0.002050f, +0.001541f, -0.001390f, -0.002484f, -0.000548f, +0.000929f, -0.000387f, -0.001428f, + +0.000741f, +0.000577f, -0.001088f, -0.001061f, +0.001006f, +0.000765f + }, + { + -0.003850f, -0.067071f, +0.016525f, +0.024295f, +0.020902f, +0.004580f, +0.002951f, -0.001458f, -0.007822f, +0.004924f, + +0.014612f, +0.012995f, -0.015670f, -0.000743f, +0.016692f, +0.021761f, +0.001403f, -0.021157f, +0.011981f, +0.005427f, + +0.008754f, -0.004968f, +0.001130f, +0.005159f, -0.008409f, -0.025327f, +0.014619f, -0.002084f, -0.006410f, -0.011600f, + -0.002405f, -0.011699f, +0.001516f, -0.003023f, +0.012109f, +0.009319f, +0.004606f, -0.011062f, -0.003595f, -0.002362f, + +0.006898f, +0.003908f, -0.005214f, -0.004219f, -0.001846f, +0.000751f, -0.004389f, -0.005451f, -0.004066f, +0.000615f, + -0.002080f, -0.004845f, -0.003089f, +0.000961f, +0.003107f, -0.001222f, +0.003529f, -0.003108f, +0.003256f, +0.005525f, + -0.000981f, -0.003548f, -0.003884f, -0.002723f, +0.002380f, -0.001372f, -0.001266f, +0.000019f, +0.002265f, +0.000750f, + -0.000212f, +0.000406f, -0.002677f, +0.000852f, +0.000225f, -0.001891f, -0.002372f, +0.002408f, +0.000867f, +0.003633f, + +0.001237f, +0.000548f, -0.000791f, +0.000235f, +0.001683f, -0.000405f, +0.000178f, +0.000346f, +0.001099f, -0.000489f, + -0.000337f, -0.002036f, +0.000037f, +0.002432f, +0.001234f, +0.000209f + }, + { + -0.033783f, +0.444164f, +0.070661f, -0.019759f, -0.028179f, +0.006106f, +0.014202f, +0.005077f, -0.005969f, -0.006371f, + +0.031035f, -0.024179f, -0.005848f, -0.013143f, +0.016469f, -0.006185f, -0.000489f, +0.049940f, -0.017660f, +0.000094f, + -0.009416f, -0.006655f, -0.015350f, +0.001031f, +0.004242f, +0.018368f, +0.002803f, +0.014910f, -0.001867f, +0.003572f, + +0.005376f, +0.002985f, +0.005655f, +0.000700f, -0.000215f, +0.001180f, -0.004690f, -0.010590f, +0.007086f, -0.003585f, + -0.000956f, +0.005180f, -0.005257f, -0.004923f, +0.005771f, -0.007346f, +0.004453f, +0.006637f, +0.005993f, +0.008294f, + -0.003548f, -0.001125f, -0.003511f, +0.005098f, -0.000591f, -0.007796f, -0.001244f, -0.006880f, +0.001872f, -0.000721f, + +0.002637f, +0.000841f, -0.006017f, +0.002012f, +0.003006f, +0.002826f, +0.000579f, -0.004028f, +0.002254f, +0.005058f, + -0.000282f, +0.005689f, +0.002051f, -0.003077f, +0.000855f, +0.001825f, +0.002418f, -0.000149f, -0.000714f, +0.000228f, + -0.000287f, -0.001079f, -0.001839f, +0.000915f, +0.001080f, +0.001055f, -0.000141f, -0.000679f, -0.001221f, +0.000651f, + -0.000332f, -0.001710f, +0.000934f, -0.000023f, -0.000372f, +0.000250f + }, + { + -0.003613f, +0.026269f, +0.027684f, -0.009503f, -0.003305f, +0.002266f, +0.000879f, -0.003571f, -0.000025f, -0.004284f, + +0.009137f, -0.019283f, -0.009028f, -0.030316f, -0.042506f, -0.019040f, +0.065071f, +0.012699f, -0.051751f, +0.026039f, + +0.011922f, -0.016378f, -0.011889f, -0.006028f, +0.004764f, +0.018461f, +0.033577f, -0.005839f, +0.003657f, +0.005417f, + -0.009324f, +0.003263f, +0.002662f, +0.004238f, -0.012140f, -0.004504f, -0.006424f, +0.000454f, +0.002599f, -0.009018f, + -0.000591f, +0.008558f, -0.007526f, -0.009776f, +0.004125f, -0.002519f, +0.000487f, +0.000273f, +0.000299f, +0.004430f, + -0.004038f, -0.002434f, -0.001986f, -0.001207f, +0.002351f, +0.005476f, -0.000518f, +0.000871f, -0.003817f, +0.008360f, + -0.006546f, +0.001421f, +0.004510f, -0.001437f, -0.003192f, -0.003124f, +0.004196f, +0.003048f, -0.001931f, +0.001498f, + -0.001678f, -0.001640f, +0.000999f, -0.000413f, -0.003429f, +0.001525f, -0.004401f, +0.000720f, -0.002726f, +0.002222f, + -0.000200f, +0.001236f, -0.000294f, -0.000035f, +0.001430f, +0.001701f, -0.000100f, +0.000975f, -0.000649f, -0.001251f, + +0.000475f, +0.000505f, +0.000957f, -0.000077f, -0.001616f, -0.001041f + }, + { + -0.038443f, +0.584663f, +0.063228f, +0.118620f, -0.004533f, +0.011621f, +0.010116f, -0.051419f, +0.006198f, -0.000288f, + -0.029814f, -0.003843f, +0.023641f, -0.026226f, -0.017062f, +0.017224f, +0.006153f, +0.014328f, +0.002419f, -0.006213f, + -0.024287f, +0.011435f, -0.008339f, +0.002107f, -0.009881f, +0.012484f, +0.007906f, +0.004775f, +0.016801f, -0.015397f, + -0.015726f, +0.002132f, +0.001561f, +0.000174f, +0.003844f, +0.004193f, -0.003014f, -0.009844f, -0.005325f, +0.011124f, + +0.007890f, +0.015558f, -0.007311f, -0.000296f, -0.000387f, +0.005474f, +0.012698f, -0.002503f, +0.001951f, +0.000644f, + +0.004102f, +0.002891f, +0.006655f, +0.005247f, -0.008020f, +0.007060f, -0.006163f, -0.002608f, -0.007280f, -0.001045f, + -0.003113f, -0.001424f, +0.004314f, -0.001679f, +0.002239f, +0.005754f, +0.002774f, +0.002466f, -0.000506f, -0.001293f, + +0.000401f, +0.001048f, -0.000363f, +0.007127f, +0.001545f, +0.001596f, +0.000796f, +0.000175f, +0.001858f, +0.001008f, + +0.000019f, -0.000557f, -0.002473f, -0.000876f, -0.000765f, +0.000325f, -0.000680f, -0.000322f, +0.002690f, +0.000819f, + -0.001164f, +0.002728f, +0.000905f, -0.000049f, +0.000412f, +0.000221f + }, + { + -0.000498f, -0.005473f, +0.004532f, +0.010430f, +0.001887f, +0.000617f, -0.000464f, -0.000129f, +0.004533f, +0.005175f, + +0.010319f, -0.001994f, +0.010949f, +0.034729f, +0.082938f, +0.056425f, +0.030729f, +0.023256f, +0.006592f, -0.001676f, + -0.014976f, +0.018894f, +0.056879f, -0.066372f, +0.000591f, -0.022097f, +0.013268f, +0.004323f, +0.017663f, -0.010945f, + +0.000530f, -0.016081f, +0.016201f, +0.014453f, -0.020823f, -0.002293f, +0.002910f, -0.008715f, -0.001069f, -0.002392f, + +0.000753f, +0.001407f, -0.006492f, +0.004354f, +0.002758f, -0.002518f, +0.000843f, +0.007464f, -0.005307f, -0.005002f, + -0.000940f, -0.002889f, -0.007487f, +0.004460f, +0.001029f, +0.001852f, -0.000695f, +0.005029f, +0.006794f, +0.001046f, + -0.001640f, +0.002008f, -0.001003f, +0.002684f, -0.000692f, +0.000817f, -0.005439f, -0.000031f, -0.001165f, -0.000536f, + -0.001380f, -0.001573f, +0.001495f, -0.003479f, +0.002015f, +0.000357f, +0.003097f, -0.003253f, -0.001840f, -0.000472f, + +0.000417f, +0.003032f, +0.000888f, -0.000673f, -0.001112f, -0.001021f, +0.000530f, -0.000938f, +0.002923f, +0.001635f, + +0.000302f, +0.000980f, -0.000068f, -0.001299f, -0.000056f, -0.000527f + }, + { + -0.099209f, -0.593855f, +0.049621f, -0.093972f, +0.012958f, +0.000636f, +0.008745f, +0.000844f, +0.001112f, -0.004928f, + -0.037389f, -0.015626f, +0.025983f, +0.016260f, +0.006850f, -0.030554f, +0.022360f, -0.001515f, +0.008205f, +0.002302f, + -0.004768f, -0.007505f, -0.008332f, -0.012769f, +0.007907f, +0.000467f, +0.000001f, -0.011718f, +0.007803f, +0.007981f, + +0.009326f, +0.000065f, +0.005213f, +0.008219f, +0.004218f, +0.008159f, -0.001272f, -0.000943f, +0.000902f, +0.001959f, + +0.000222f, +0.000190f, +0.000909f, +0.005497f, +0.000933f, +0.003781f, +0.010516f, +0.003638f, +0.000114f, -0.003565f, + -0.006669f, -0.000731f, +0.002171f, -0.003458f, -0.004886f, -0.007658f, -0.007735f, +0.002442f, +0.006314f, +0.012836f, + +0.006775f, -0.002418f, +0.000464f, -0.005677f, +0.001180f, +0.000594f, -0.005863f, +0.002869f, +0.001576f, +0.000043f, + -0.000764f, -0.000762f, +0.000190f, -0.001798f, +0.002217f, -0.000506f, +0.000792f, -0.003183f, +0.001047f, +0.003163f, + -0.000721f, +0.000094f, -0.000111f, +0.000029f, +0.002233f, +0.000271f, -0.001563f, +0.001285f, -0.000836f, -0.000374f, + -0.001139f, -0.000929f, -0.001749f, -0.001739f, +0.000737f, +0.000894f + }, + { + +0.000146f, -0.017303f, -0.006033f, +0.001638f, -0.009599f, +0.001985f, +0.000105f, -0.001175f, -0.002970f, -0.000194f, + +0.002433f, -0.001443f, -0.001449f, -0.006356f, -0.029494f, +0.017070f, +0.012203f, +0.043242f, -0.035341f, +0.030520f, + -0.058382f, +0.002855f, +0.015400f, -0.053940f, -0.032761f, -0.006918f, -0.009182f, -0.006026f, +0.001939f, -0.006738f, + +0.015948f, +0.018992f, +0.000831f, -0.002204f, +0.004792f, -0.001346f, +0.016289f, -0.005257f, +0.012825f, +0.000737f, + -0.010305f, -0.002340f, +0.008882f, -0.008023f, -0.003833f, +0.003470f, +0.000688f, +0.009558f, +0.007607f, +0.006634f, + -0.004778f, +0.005132f, +0.003076f, +0.004638f, +0.002897f, +0.006956f, -0.003448f, -0.006907f, +0.000343f, +0.003042f, + +0.000801f, +0.003089f, -0.002263f, +0.002535f, +0.003530f, -0.003122f, +0.004713f, +0.001813f, +0.000350f, -0.001402f, + -0.000394f, +0.004284f, -0.000202f, +0.000548f, +0.000580f, +0.000991f, +0.000488f, -0.002657f, +0.000126f, -0.000525f, + -0.002557f, +0.003193f, +0.002495f, -0.000171f, -0.003749f, +0.001227f, -0.001033f, +0.001566f, -0.000424f, +0.000438f, + -0.000308f, -0.001111f, +0.000927f, +0.000893f, +0.000238f, -0.000476f + }, + { + -0.014865f, -0.464291f, +0.098358f, -0.027968f, -0.031837f, -0.003379f, -0.024784f, -0.022533f, +0.021491f, -0.013896f, + -0.011607f, -0.023347f, -0.034336f, -0.004428f, +0.041071f, +0.028088f, +0.044293f, -0.005260f, +0.005307f, +0.013954f, + -0.007546f, -0.020523f, +0.006933f, +0.001555f, -0.004171f, -0.004519f, -0.015106f, -0.002258f, -0.025075f, -0.010413f, + +0.008656f, +0.013067f, +0.000228f, +0.014632f, -0.019551f, -0.001252f, +0.004834f, +0.004136f, -0.001573f, +0.006459f, + +0.002278f, -0.004862f, +0.015822f, +0.003950f, -0.004361f, -0.013121f, +0.004543f, +0.001389f, -0.000788f, +0.009406f, + -0.008344f, -0.000817f, -0.002816f, -0.005939f, +0.000582f, -0.004958f, +0.000273f, +0.001681f, +0.003459f, +0.002291f, + +0.000225f, -0.008933f, +0.002952f, +0.000202f, -0.000575f, +0.003373f, -0.002158f, +0.002193f, -0.004422f, -0.001178f, + +0.000931f, -0.002057f, -0.001698f, +0.004414f, -0.000956f, -0.002251f, -0.000190f, -0.003231f, -0.001499f, +0.001517f, + -0.000761f, +0.000011f, -0.002730f, -0.000602f, -0.005614f, -0.001671f, -0.001927f, +0.001537f, +0.001049f, -0.000231f, + +0.000096f, +0.000090f, +0.000565f, +0.001660f, +0.000289f, +0.000325f + }, + { + +0.003018f, +0.093084f, +0.020589f, +0.000810f, -0.003815f, -0.010398f, -0.019892f, +0.000970f, +0.026532f, -0.002408f, + -0.005564f, -0.012420f, +0.012840f, +0.031136f, +0.033587f, +0.010858f, +0.027415f, +0.014357f, -0.024172f, -0.017909f, + +0.028160f, +0.001182f, +0.006960f, +0.001563f, +0.015466f, -0.021311f, +0.003914f, -0.009117f, +0.013881f, -0.001908f, + +0.008462f, -0.012977f, -0.001695f, +0.004670f, -0.016473f, -0.011810f, +0.012190f, +0.002328f, +0.001229f, -0.007310f, + +0.006246f, -0.006987f, -0.007398f, -0.010806f, +0.000733f, +0.006106f, -0.010050f, -0.005521f, +0.005040f, +0.011608f, + +0.006346f, +0.002576f, +0.002079f, +0.008120f, -0.007460f, -0.003772f, +0.007335f, -0.001613f, +0.001977f, +0.003181f, + +0.002429f, -0.002828f, -0.005082f, +0.000476f, -0.003448f, +0.000299f, +0.000810f, -0.000362f, +0.001558f, +0.002356f, + +0.003079f, +0.001911f, +0.000874f, +0.003203f, -0.001431f, +0.003787f, +0.001117f, +0.001248f, +0.001285f, -0.000784f, + -0.003139f, +0.003562f, -0.000491f, -0.001615f, -0.000627f, -0.000142f, -0.000791f, +0.002195f, -0.000007f, +0.000136f, + -0.001015f, +0.002355f, -0.001343f, +0.000048f, +0.000484f, -0.001771f + }, + { + +0.036203f, -0.355163f, -0.060964f, -0.023301f, -0.003036f, -0.031981f, +0.018397f, +0.010991f, -0.006352f, +0.024735f, + +0.014245f, -0.012759f, -0.012090f, +0.013120f, +0.007781f, +0.001868f, +0.014529f, -0.018185f, +0.004526f, +0.002173f, + +0.002947f, -0.004220f, +0.007147f, +0.004536f, -0.011978f, -0.013745f, +0.005723f, -0.008443f, +0.002611f, +0.012609f, + +0.001898f, -0.003027f, +0.011079f, -0.001855f, +0.020757f, +0.018977f, +0.005263f, -0.011913f, +0.008053f, -0.010442f, + +0.002939f, -0.000024f, -0.011302f, -0.005915f, -0.002983f, -0.013665f, +0.005630f, +0.000836f, -0.004263f, +0.002288f, + -0.002795f, +0.004711f, -0.002487f, +0.004266f, +0.008945f, -0.005204f, +0.005172f, +0.007489f, +0.001437f, +0.005955f, + -0.002856f, -0.003112f, -0.001734f, -0.001216f, +0.000945f, +0.001221f, -0.001330f, +0.000262f, +0.002457f, +0.001494f, + +0.002681f, +0.000638f, +0.003067f, +0.000165f, +0.000447f, -0.000081f, +0.001238f, +0.001577f, -0.001880f, -0.002016f, + +0.000293f, +0.001938f, +0.000771f, -0.001780f, -0.002091f, -0.002016f, -0.001713f, -0.003815f, -0.002138f, +0.000787f, + -0.002321f, -0.001770f, +0.000884f, +0.000688f, -0.000211f, -0.000335f + }, + { + -0.005166f, -0.000222f, +0.042524f, -0.005311f, +0.006565f, -0.003471f, -0.013003f, +0.004526f, -0.004546f, -0.008895f, + +0.002291f, +0.003928f, +0.004864f, -0.030537f, -0.101101f, -0.079732f, +0.025647f, -0.017500f, +0.008485f, +0.028496f, + +0.033734f, +0.049000f, -0.020971f, -0.007018f, +0.001047f, -0.000257f, +0.014806f, +0.011347f, +0.021071f, +0.011082f, + -0.024890f, +0.032885f, +0.018974f, +0.000530f, -0.006207f, -0.003538f, +0.017391f, +0.003764f, -0.018481f, -0.004309f, + +0.002427f, +0.009885f, +0.007702f, +0.004489f, -0.007950f, +0.000492f, -0.001203f, -0.004868f, -0.006416f, -0.000651f, + +0.000556f, -0.004731f, -0.003760f, -0.005291f, -0.004218f, -0.003389f, -0.000431f, +0.002088f, +0.001760f, -0.002211f, + +0.000817f, -0.002530f, -0.003467f, -0.004130f, +0.000261f, +0.002920f, +0.002630f, +0.002975f, -0.000006f, -0.009983f, + -0.000086f, -0.001658f, +0.000771f, -0.002455f, -0.001943f, -0.001193f, -0.001979f, -0.001889f, -0.000039f, +0.000913f, + +0.000466f, -0.000244f, +0.002520f, +0.001058f, -0.002407f, -0.000941f, -0.001435f, -0.000192f, -0.001592f, +0.001874f, + +0.000591f, +0.001475f, -0.000092f, +0.000314f, +0.001232f, -0.000675f + }, + { + +0.063219f, -0.001901f, -0.007729f, -0.034237f, +0.000061f, -0.014527f, +0.039422f, -0.007132f, +0.001154f, -0.008622f, + +0.011712f, -0.016450f, -0.006433f, +0.007499f, +0.004080f, -0.003436f, +0.023320f, +0.014580f, -0.004538f, +0.015831f, + -0.005685f, -0.007368f, -0.000313f, +0.024129f, -0.004486f, -0.008000f, +0.003657f, +0.006628f, +0.001290f, -0.009811f, + +0.014708f, +0.007620f, +0.002810f, +0.003340f, +0.006980f, +0.000340f, -0.009139f, -0.005941f, +0.002205f, -0.010134f, + +0.016561f, -0.023330f, -0.010877f, +0.004584f, -0.001968f, +0.008401f, -0.003115f, -0.016857f, -0.002441f, +0.001798f, + +0.011227f, -0.004705f, -0.010276f, -0.009701f, +0.000607f, +0.002764f, +0.003860f, +0.003105f, +0.003099f, +0.002289f, + -0.008494f, -0.000981f, -0.000810f, +0.004648f, +0.002650f, +0.000645f, -0.002466f, +0.003736f, -0.002340f, +0.003147f, + +0.003587f, -0.003404f, +0.001770f, -0.002648f, -0.002845f, -0.001466f, +0.005436f, +0.000551f, +0.002801f, -0.001630f, + -0.003437f, -0.002330f, +0.002087f, -0.000355f, -0.000295f, +0.001776f, +0.002088f, +0.000388f, -0.000335f, +0.000303f, + +0.002148f, +0.001753f, +0.000078f, -0.000378f, +0.000276f, -0.000118f + }, + { + -0.008790f, -0.088375f, +0.015489f, -0.000457f, -0.021883f, -0.004794f, -0.023166f, -0.016045f, -0.006373f, +0.012426f, + +0.013038f, -0.021530f, -0.017265f, +0.037828f, +0.005531f, -0.021329f, +0.006993f, -0.012134f, -0.008661f, -0.012897f, + -0.055319f, +0.008371f, -0.018027f, -0.012374f, -0.024761f, -0.035843f, -0.023600f, -0.018080f, +0.038847f, +0.030860f, + -0.012656f, -0.003488f, -0.003345f, -0.001457f, +0.012168f, +0.004039f, +0.000395f, +0.008209f, +0.003425f, -0.012857f, + -0.008815f, -0.015774f, -0.001448f, -0.013006f, +0.006917f, -0.006282f, +0.011879f, +0.006433f, +0.002169f, +0.001588f, + +0.011651f, +0.006666f, +0.001575f, +0.001640f, -0.006226f, -0.001011f, -0.008329f, -0.005591f, +0.002339f, -0.005574f, + -0.004308f, +0.001313f, -0.000679f, -0.004133f, -0.003320f, -0.000096f, +0.000208f, +0.001935f, +0.001646f, +0.005247f, + -0.002297f, +0.001703f, +0.000005f, +0.002010f, -0.003491f, +0.000582f, -0.002711f, -0.004724f, +0.000476f, +0.002013f, + +0.000945f, +0.000709f, +0.004003f, +0.000295f, +0.001199f, -0.002609f, +0.002025f, +0.000193f, +0.001660f, +0.001700f, + +0.001102f, +0.000042f, +0.001082f, -0.000033f, +0.000957f, +0.001992f + } + }, + { + { + +0.019642f, -0.290539f, +0.140655f, -0.023024f, +0.013282f, -0.001146f, -0.002039f, -0.019729f, +0.019627f, -0.000541f, + -0.022822f, +0.016873f, +0.012618f, -0.020062f, -0.000272f, -0.009437f, +0.025126f, +0.003342f, +0.014482f, -0.009313f, + +0.001024f, -0.009357f, -0.003023f, -0.002496f, -0.002255f, -0.002506f, +0.020054f, -0.015781f, -0.015072f, +0.020028f, + -0.009420f, -0.002722f, +0.005429f, -0.000241f, +0.002905f, +0.000063f, -0.001363f, +0.006463f, +0.003313f, -0.002904f, + -0.005329f, +0.003069f, -0.003458f, -0.003673f, -0.009181f, -0.001832f, -0.002515f, +0.001663f, +0.000267f, -0.002877f, + +0.000028f, +0.002294f, -0.000944f, +0.001748f, -0.001085f, +0.004617f, +0.002314f, +0.004558f, -0.001352f, -0.001817f, + +0.003539f, +0.000025f, -0.000904f, +0.002618f, -0.003160f, -0.000264f, -0.000029f, -0.002296f, -0.000703f, -0.002082f, + -0.000729f, +0.000315f, +0.003483f, +0.002607f, +0.001103f, +0.001527f, -0.003056f, -0.001830f, +0.000429f, +0.000056f, + +0.001782f, -0.001804f, -0.002026f, +0.000215f, +0.000650f, +0.000473f, +0.001198f, +0.002422f, +0.000306f, +0.000025f, + -0.000071f, +0.000914f, +0.000716f, -0.000221f, +0.000051f, +0.000342f + }, + { + +0.000220f, -0.015363f, -0.002268f, +0.004434f, -0.011945f, +0.004197f, -0.002367f, -0.005499f, +0.011044f, -0.000466f, + +0.014224f, -0.000695f, -0.001650f, +0.008755f, +0.011251f, +0.017060f, -0.008982f, -0.007484f, -0.032741f, +0.012909f, + -0.020009f, +0.006564f, +0.007558f, +0.007537f, +0.020700f, -0.019747f, +0.015849f, -0.006889f, +0.007794f, -0.008673f, + +0.006564f, +0.005348f, +0.001373f, -0.005788f, -0.005988f, +0.003428f, +0.005120f, +0.007305f, +0.003826f, +0.005505f, + -0.004591f, +0.001250f, +0.000206f, +0.003211f, -0.006793f, +0.003439f, +0.000433f, +0.001823f, -0.000619f, -0.003281f, + +0.005607f, +0.002475f, +0.003803f, -0.004128f, +0.005410f, -0.001290f, -0.000615f, +0.000160f, -0.003608f, +0.001702f, + -0.001107f, -0.000106f, +0.000117f, -0.001243f, -0.001524f, +0.002308f, +0.003204f, -0.004273f, -0.000066f, -0.004448f, + +0.003347f, -0.000972f, -0.001115f, -0.001228f, +0.000171f, -0.001648f, +0.000829f, +0.000644f, -0.000284f, -0.001278f, + +0.000311f, +0.001612f, +0.001708f, +0.000685f, -0.000713f, -0.000973f, -0.000601f, -0.000610f, -0.000587f, -0.001082f, + +0.001500f, +0.000280f, -0.000292f, -0.000184f, -0.000170f, +0.000096f + }, + { + +0.003314f, -0.048819f, +0.008333f, -0.020274f, +0.004216f, +0.003591f, -0.001831f, +0.002061f, -0.005922f, -0.006180f, + +0.008188f, +0.008825f, -0.016750f, +0.002317f, +0.010995f, +0.026257f, -0.005629f, -0.015485f, +0.008888f, -0.013519f, + +0.007276f, +0.002363f, +0.004126f, +0.006033f, +0.001503f, -0.021391f, +0.016649f, -0.001717f, +0.004358f, +0.000795f, + -0.000884f, -0.004851f, +0.012143f, -0.007823f, +0.001765f, +0.004038f, +0.011291f, -0.005672f, +0.005314f, +0.006157f, + +0.003875f, -0.000940f, -0.000969f, -0.000943f, +0.003146f, +0.007499f, -0.000274f, +0.001694f, +0.001288f, +0.001358f, + +0.002563f, -0.001226f, +0.000655f, +0.001800f, +0.001409f, -0.000873f, +0.002960f, -0.005312f, -0.001459f, +0.000900f, + +0.000961f, +0.000042f, -0.001478f, -0.001181f, +0.001195f, -0.001079f, -0.000422f, -0.001631f, -0.000551f, +0.001324f, + +0.001071f, +0.000938f, -0.002812f, +0.000505f, +0.000054f, +0.000581f, -0.000049f, +0.002897f, -0.000457f, -0.000507f, + -0.002146f, +0.000554f, -0.000876f, -0.000852f, +0.001493f, -0.001083f, -0.000095f, -0.000328f, +0.001151f, -0.001035f, + +0.000008f, -0.001564f, -0.000766f, +0.000657f, -0.000770f, +0.001145f + }, + { + -0.011273f, +0.316421f, -0.072520f, +0.010586f, +0.008515f, -0.005530f, +0.011268f, +0.006049f, -0.004449f, -0.021245f, + +0.015315f, -0.011667f, +0.008463f, -0.009718f, -0.004600f, -0.013697f, -0.007942f, +0.025246f, -0.028919f, +0.000950f, + -0.002837f, +0.002864f, -0.007801f, +0.005251f, -0.011052f, +0.001351f, +0.000312f, +0.013357f, +0.000172f, -0.005451f, + +0.000568f, -0.000216f, -0.001315f, +0.001633f, +0.003369f, +0.000655f, +0.000087f, -0.005032f, +0.009573f, -0.007776f, + -0.001807f, +0.007005f, -0.001645f, -0.007210f, +0.001576f, -0.001796f, +0.001813f, +0.001207f, -0.003613f, +0.004532f, + -0.004493f, -0.006121f, -0.001207f, +0.005486f, +0.001194f, -0.003069f, +0.000140f, -0.005167f, +0.002922f, -0.003794f, + +0.002253f, -0.000789f, -0.005915f, +0.004677f, +0.001096f, +0.001133f, -0.000106f, -0.006894f, -0.001891f, +0.000745f, + -0.004357f, +0.001096f, +0.001348f, -0.002423f, +0.000150f, -0.000249f, +0.000502f, -0.000311f, +0.000440f, +0.001449f, + +0.000917f, +0.000664f, -0.000995f, -0.000194f, -0.000379f, +0.000370f, +0.001030f, +0.000466f, -0.000565f, +0.001464f, + +0.000398f, -0.001327f, +0.001098f, +0.000875f, +0.000161f, +0.000650f + }, + { + +0.003841f, -0.005101f, -0.005522f, -0.001097f, +0.001492f, +0.000785f, +0.002195f, +0.000512f, +0.002702f, +0.000452f, + +0.008061f, -0.014956f, +0.010938f, -0.003139f, -0.028570f, -0.039719f, +0.024913f, +0.042989f, -0.042031f, -0.004449f, + +0.007846f, +0.001260f, +0.014891f, -0.001875f, -0.007052f, -0.035648f, +0.002061f, +0.002071f, -0.001987f, +0.000607f, + -0.020252f, -0.008147f, -0.004826f, -0.004282f, -0.009415f, +0.000442f, -0.003861f, +0.009277f, +0.006427f, -0.010631f, + -0.002034f, +0.009155f, -0.003350f, +0.000093f, +0.002849f, -0.007146f, +0.000129f, +0.001256f, -0.005733f, +0.003485f, + +0.000953f, -0.000484f, -0.002885f, -0.003070f, +0.003536f, +0.004876f, -0.000279f, +0.003281f, -0.006455f, +0.001398f, + -0.008091f, -0.000166f, +0.000826f, -0.003802f, -0.001526f, -0.002712f, -0.000730f, +0.000340f, -0.000779f, +0.005513f, + +0.000086f, -0.001730f, +0.001122f, +0.000703f, -0.000512f, +0.003389f, -0.003853f, +0.001383f, -0.002040f, +0.000859f, + -0.001173f, +0.000734f, -0.000623f, -0.000211f, +0.000585f, +0.001005f, -0.000534f, +0.000686f, +0.000406f, -0.000860f, + +0.000241f, +0.000458f, +0.000096f, -0.000546f, -0.000449f, +0.000381f + }, + { + -0.026128f, +0.449611f, -0.041292f, +0.119838f, -0.014160f, +0.000931f, +0.018046f, -0.035401f, +0.005026f, +0.012460f, + -0.010153f, -0.012853f, +0.012208f, -0.001157f, -0.007265f, +0.015789f, +0.000643f, +0.003641f, -0.002709f, +0.004620f, + -0.003269f, +0.012550f, -0.005316f, +0.011101f, -0.007922f, +0.000757f, -0.004810f, -0.008155f, +0.014102f, -0.000841f, + -0.004973f, +0.005087f, -0.000703f, -0.008172f, -0.004876f, -0.001429f, +0.004589f, +0.002819f, -0.000105f, +0.008964f, + +0.002115f, +0.006599f, -0.005242f, +0.000163f, -0.004288f, +0.006012f, +0.008753f, -0.010706f, -0.001635f, +0.002336f, + -0.000505f, -0.001174f, +0.003433f, +0.004382f, -0.008150f, +0.007511f, -0.001544f, +0.002641f, -0.005743f, -0.004132f, + -0.004443f, -0.001926f, -0.001933f, -0.004660f, +0.001707f, +0.001915f, -0.000296f, +0.001660f, +0.000469f, -0.001181f, + -0.001950f, +0.001166f, -0.003991f, +0.003308f, -0.001026f, +0.001111f, +0.001201f, -0.000875f, +0.000648f, -0.000866f, + -0.001002f, +0.000378f, +0.000563f, +0.001272f, +0.000324f, +0.001548f, -0.000156f, -0.000416f, +0.000525f, +0.000717f, + -0.001284f, +0.000921f, +0.000352f, -0.001021f, +0.000150f, +0.000558f + }, + { + +0.001255f, -0.018119f, -0.012260f, -0.000965f, -0.005624f, +0.001042f, -0.001810f, -0.000166f, +0.002680f, -0.000284f, + +0.000566f, -0.004833f, +0.006194f, +0.017032f, +0.047899f, -0.022439f, -0.023704f, +0.008044f, +0.012889f, +0.011077f, + -0.023961f, +0.001684f, +0.051960f, -0.055444f, +0.006368f, +0.001301f, +0.023993f, -0.004956f, +0.000940f, -0.019195f, + +0.011702f, -0.011803f, +0.016432f, +0.027473f, -0.003303f, +0.006612f, +0.004497f, -0.000896f, +0.009333f, +0.002276f, + +0.001733f, +0.003063f, -0.001003f, +0.004991f, +0.000077f, +0.002877f, +0.001840f, +0.005533f, -0.004208f, -0.004840f, + -0.001443f, -0.003392f, -0.007648f, +0.002155f, -0.002133f, -0.001082f, -0.001716f, -0.002643f, +0.001200f, +0.002166f, + -0.004961f, -0.000359f, -0.000706f, +0.003041f, +0.002180f, +0.003251f, -0.002666f, +0.001166f, -0.000424f, -0.000639f, + -0.000245f, +0.001560f, +0.002221f, -0.003514f, +0.002930f, +0.001201f, +0.003102f, -0.000961f, -0.000296f, +0.000859f, + -0.000025f, +0.000689f, -0.000341f, -0.000153f, +0.000036f, -0.000996f, -0.000473f, +0.000009f, +0.000852f, -0.001606f, + +0.000384f, +0.000579f, +0.000166f, +0.000226f, +0.000332f, -0.000174f + }, + { + +0.109343f, -0.336816f, +0.050701f, -0.084834f, -0.001035f, +0.004339f, +0.003369f, -0.013205f, -0.004162f, +0.006455f, + -0.015824f, -0.004587f, +0.028132f, -0.003126f, +0.015671f, -0.019091f, +0.000991f, -0.026354f, +0.004183f, +0.010356f, + +0.003213f, -0.000156f, -0.003162f, -0.013471f, +0.004411f, +0.000989f, +0.001930f, -0.009241f, +0.005522f, +0.002014f, + +0.001520f, -0.005756f, -0.004216f, +0.000211f, -0.003494f, +0.000749f, -0.006329f, -0.005310f, +0.001337f, +0.004626f, + -0.002874f, -0.007489f, +0.002636f, +0.003115f, +0.001155f, +0.001446f, -0.000052f, +0.001423f, +0.005773f, +0.002279f, + +0.006150f, -0.001383f, -0.002908f, +0.001134f, +0.004738f, +0.002780f, -0.000606f, +0.000500f, -0.000766f, +0.008273f, + +0.000670f, -0.002439f, +0.004590f, -0.002321f, +0.001505f, +0.001908f, -0.001828f, +0.000422f, -0.002217f, +0.000326f, + -0.000730f, -0.001482f, +0.002558f, -0.000005f, +0.001571f, -0.001210f, +0.001533f, -0.002127f, +0.001478f, +0.001916f, + -0.000358f, +0.001796f, -0.000087f, -0.001188f, -0.001176f, -0.001580f, +0.000755f, +0.001253f, -0.001109f, +0.000868f, + -0.000934f, +0.000427f, +0.000012f, +0.000273f, +0.000824f, -0.000284f + }, + { + +0.001901f, +0.000480f, +0.003304f, +0.003876f, -0.003919f, +0.001773f, -0.001117f, -0.000761f, -0.004190f, +0.001527f, + -0.000459f, -0.008739f, -0.003854f, +0.033734f, +0.013444f, -0.015897f, -0.038886f, +0.025175f, -0.030883f, +0.043130f, + -0.023436f, +0.021610f, +0.014042f, -0.037423f, +0.000226f, +0.003221f, +0.013376f, -0.000541f, -0.005375f, -0.012578f, + -0.002939f, +0.005055f, -0.003411f, -0.009552f, +0.004276f, -0.006445f, -0.000964f, -0.010564f, +0.007338f, -0.004422f, + -0.002392f, -0.001889f, +0.010975f, +0.004727f, +0.002681f, +0.005807f, +0.000051f, +0.004454f, +0.001843f, +0.001969f, + -0.003732f, +0.003927f, +0.001139f, +0.001519f, -0.001021f, +0.003081f, -0.001160f, -0.003774f, -0.000235f, -0.004046f, + -0.002196f, +0.001491f, -0.001696f, +0.001458f, +0.002061f, -0.001924f, +0.003862f, -0.001017f, +0.000195f, +0.000293f, + -0.003185f, +0.000311f, -0.002993f, -0.000343f, +0.002321f, +0.002340f, +0.000073f, -0.001647f, -0.000028f, +0.000797f, + -0.002006f, -0.000012f, +0.000318f, +0.001257f, -0.002772f, +0.001251f, -0.001363f, +0.000446f, -0.001044f, -0.000304f, + +0.001133f, +0.000072f, -0.000001f, +0.000323f, +0.000005f, -0.000211f + }, + { + +0.016687f, -0.364645f, +0.125245f, -0.013326f, +0.016549f, +0.017728f, -0.024699f, -0.010478f, +0.026406f, -0.004850f, + -0.005825f, -0.008472f, -0.011623f, +0.003571f, +0.020181f, -0.012455f, +0.022138f, -0.005223f, -0.005076f, -0.001715f, + +0.004138f, -0.011500f, +0.012718f, -0.008253f, -0.013459f, +0.003632f, +0.003336f, +0.007501f, -0.013769f, -0.000061f, + +0.001990f, +0.003552f, -0.003474f, +0.012218f, -0.013694f, -0.004755f, -0.001708f, +0.003723f, -0.004258f, +0.008336f, + -0.005069f, -0.011358f, +0.007849f, -0.004044f, -0.001407f, +0.003367f, +0.007770f, -0.002575f, -0.001032f, +0.006770f, + -0.005572f, +0.007530f, +0.000262f, -0.003003f, +0.003275f, +0.000971f, +0.003227f, -0.001253f, +0.003110f, +0.001458f, + +0.005161f, -0.001917f, +0.001688f, -0.002788f, -0.001102f, +0.000579f, -0.002528f, +0.003219f, -0.004412f, -0.001304f, + -0.000783f, -0.001348f, -0.000555f, +0.002651f, +0.000697f, -0.000368f, +0.001940f, -0.000664f, -0.001923f, -0.000317f, + -0.001324f, +0.001246f, -0.002077f, +0.000848f, -0.002259f, +0.000737f, -0.001887f, +0.001071f, +0.000077f, -0.001604f, + +0.000498f, -0.000433f, +0.001336f, +0.001606f, -0.000108f, -0.000380f + }, + { + -0.001538f, +0.055199f, -0.004105f, -0.003316f, -0.005083f, -0.005113f, -0.013680f, -0.007624f, +0.010458f, -0.007905f, + +0.013187f, -0.006449f, +0.005273f, +0.007367f, -0.012540f, -0.021509f, -0.006881f, +0.016947f, +0.002815f, -0.012713f, + +0.015317f, +0.004673f, -0.002238f, -0.013290f, +0.007968f, -0.013234f, +0.016283f, +0.000625f, +0.002935f, -0.020387f, + +0.015020f, -0.003262f, +0.002589f, +0.005135f, -0.005517f, -0.011481f, +0.005390f, +0.005284f, -0.000748f, -0.004363f, + -0.001909f, -0.007666f, +0.003227f, -0.009857f, +0.004038f, +0.005730f, -0.005753f, +0.001496f, -0.002401f, +0.000685f, + +0.000425f, +0.000359f, -0.004628f, +0.003571f, -0.003170f, -0.001340f, +0.003616f, -0.001912f, -0.002124f, +0.000755f, + +0.005212f, +0.000283f, -0.002325f, +0.001268f, +0.002201f, +0.003356f, -0.003545f, -0.004240f, -0.000570f, -0.000982f, + -0.001132f, -0.001250f, -0.001916f, +0.001961f, -0.002389f, +0.002159f, +0.000224f, +0.001849f, +0.002133f, +0.001423f, + -0.001940f, +0.003333f, -0.000500f, -0.001414f, -0.000686f, +0.000753f, -0.000674f, +0.001152f, -0.001506f, +0.000682f, + -0.000298f, +0.002039f, -0.000666f, +0.000470f, +0.000421f, -0.001282f + }, + { + +0.034501f, -0.321543f, -0.041242f, -0.025437f, -0.004926f, -0.052668f, +0.002376f, -0.001995f, -0.013743f, +0.010341f, + +0.006893f, -0.004001f, -0.008840f, +0.000801f, +0.004251f, +0.005863f, +0.019031f, -0.008572f, -0.007408f, -0.012971f, + +0.009651f, -0.000740f, -0.002438f, -0.004137f, +0.005574f, +0.000319f, +0.010187f, -0.003136f, -0.000294f, +0.005897f, + +0.002788f, +0.007160f, +0.010554f, -0.011504f, +0.003121f, +0.000158f, +0.002819f, -0.005497f, +0.010730f, -0.008464f, + +0.003714f, -0.002276f, -0.005201f, -0.008184f, +0.006061f, -0.006323f, +0.002984f, +0.002072f, -0.002492f, -0.005234f, + -0.005192f, +0.004143f, -0.000713f, +0.001553f, +0.005504f, -0.005027f, +0.001813f, +0.004197f, -0.003694f, +0.002568f, + -0.000455f, +0.001554f, +0.000525f, +0.000937f, -0.000248f, +0.000721f, -0.001527f, -0.003985f, +0.001772f, -0.001165f, + -0.000855f, -0.000428f, +0.003755f, +0.001393f, +0.000920f, -0.001510f, -0.000269f, +0.000560f, -0.001073f, -0.000529f, + -0.000140f, +0.001950f, +0.000125f, +0.000548f, +0.000719f, -0.001898f, +0.000677f, -0.001360f, -0.001683f, +0.002119f, + +0.000482f, -0.000196f, -0.000060f, +0.000204f, -0.000172f, -0.000681f + }, + { + +0.005595f, -0.033071f, +0.013400f, +0.001567f, +0.005009f, -0.000683f, -0.012091f, +0.002453f, -0.006269f, -0.008618f, + +0.003048f, +0.007605f, +0.004594f, -0.006511f, -0.027387f, -0.042674f, +0.032046f, -0.019480f, -0.020119f, +0.015247f, + -0.011647f, -0.004913f, -0.036276f, -0.002242f, +0.003076f, -0.023655f, -0.002396f, -0.001667f, +0.009832f, +0.019474f, + -0.008525f, +0.032374f, -0.000297f, -0.002894f, -0.008182f, -0.022096f, +0.003509f, -0.006369f, -0.015215f, -0.000664f, + +0.007339f, +0.005578f, +0.002940f, +0.005961f, -0.000238f, +0.006880f, -0.001939f, -0.005791f, -0.003999f, +0.003243f, + +0.000585f, -0.007274f, -0.007654f, -0.000868f, +0.002730f, -0.000099f, -0.002758f, +0.000737f, +0.001106f, -0.002824f, + +0.003705f, +0.002621f, +0.003197f, -0.000152f, -0.002374f, -0.000854f, +0.000412f, +0.003414f, +0.002693f, -0.004446f, + +0.003888f, -0.000602f, +0.002699f, -0.001458f, -0.000181f, +0.000565f, +0.000360f, +0.000062f, -0.002023f, -0.000447f, + +0.000579f, -0.001326f, -0.000610f, -0.001124f, -0.000851f, +0.000638f, -0.000238f, +0.000029f, -0.001661f, +0.001143f, + -0.000185f, +0.001585f, -0.000060f, -0.000971f, -0.000175f, +0.000275f + }, + { + -0.042995f, -0.124065f, -0.006361f, -0.038923f, +0.013092f, -0.011955f, +0.045331f, +0.007223f, +0.014257f, -0.010879f, + +0.026554f, +0.006773f, -0.004439f, +0.008961f, -0.001249f, -0.012291f, +0.005736f, +0.012104f, +0.003079f, +0.016419f, + -0.006599f, -0.000623f, -0.000425f, +0.016041f, -0.008381f, +0.006377f, +0.006039f, +0.004377f, +0.004004f, -0.016131f, + -0.001717f, -0.000419f, +0.001001f, +0.002011f, +0.005846f, -0.000576f, -0.007470f, -0.003853f, +0.008248f, -0.001821f, + +0.005088f, -0.021183f, -0.001113f, +0.005608f, -0.001945f, +0.005982f, +0.004069f, -0.001802f, +0.003344f, -0.001263f, + +0.003696f, -0.002911f, +0.001050f, -0.005720f, +0.000849f, +0.000027f, -0.002290f, +0.000093f, -0.000120f, +0.002478f, + -0.004744f, +0.000454f, -0.002314f, -0.001274f, -0.002346f, +0.000160f, -0.002128f, +0.001242f, -0.000843f, +0.000945f, + -0.000142f, +0.000888f, +0.003491f, -0.003514f, -0.000673f, -0.000708f, +0.003000f, -0.002498f, +0.001778f, +0.000142f, + +0.000189f, -0.000636f, +0.001913f, +0.000777f, +0.000976f, -0.000972f, -0.001301f, -0.000508f, +0.000304f, -0.000199f, + +0.000088f, +0.000048f, +0.000479f, +0.000481f, -0.000331f, -0.000268f + }, + { + +0.007311f, -0.098957f, -0.004154f, +0.012070f, -0.011108f, +0.016210f, -0.000544f, -0.007658f, -0.004493f, +0.000962f, + +0.006507f, -0.012135f, +0.006048f, +0.021925f, -0.015442f, -0.015248f, -0.004697f, -0.010357f, +0.003777f, +0.032567f, + -0.029876f, +0.003101f, -0.008857f, +0.003368f, +0.010819f, +0.002860f, +0.007645f, -0.015896f, +0.003777f, +0.020328f, + -0.011762f, -0.006698f, +0.002717f, -0.003305f, +0.004276f, +0.007157f, -0.002328f, +0.001451f, +0.010035f, -0.004708f, + +0.001133f, +0.002828f, +0.012057f, -0.003404f, +0.000578f, -0.009403f, +0.011953f, +0.001324f, +0.002533f, -0.001899f, + +0.007066f, +0.005462f, -0.003965f, +0.001102f, -0.003090f, +0.002374f, -0.002333f, -0.003509f, +0.000978f, -0.004184f, + +0.000058f, +0.000440f, -0.000322f, +0.002069f, +0.001350f, -0.001483f, -0.003323f, +0.003140f, -0.002627f, +0.002292f, + -0.001672f, +0.002277f, -0.000389f, +0.002457f, -0.002061f, +0.000390f, -0.000068f, -0.000817f, -0.000678f, +0.000344f, + +0.000020f, -0.001977f, -0.000518f, -0.001557f, +0.000146f, -0.001866f, +0.001987f, -0.000861f, +0.000517f, +0.000464f, + -0.000384f, -0.001308f, +0.000855f, -0.001429f, -0.000169f, +0.001901f + } + }, + { + { + -0.008791f, -0.101522f, -0.013470f, +0.020763f, -0.006601f, -0.001551f, -0.007570f, -0.006268f, +0.006654f, -0.005470f, + +0.006005f, +0.013988f, -0.008146f, -0.010330f, -0.010854f, +0.002675f, +0.015615f, +0.014788f, +0.007957f, +0.001972f, + -0.003177f, +0.002350f, -0.008514f, -0.002273f, -0.009780f, -0.001303f, +0.009043f, -0.005547f, -0.005948f, +0.005152f, + +0.005436f, -0.006365f, +0.001967f, +0.002965f, +0.002031f, +0.001473f, -0.000570f, -0.000337f, +0.007290f, -0.001498f, + -0.009557f, +0.002861f, -0.005403f, -0.006533f, -0.002356f, +0.001325f, -0.005560f, -0.000031f, -0.000068f, -0.002734f, + +0.002716f, +0.002076f, +0.000681f, -0.000376f, +0.001326f, +0.001051f, +0.003546f, +0.002363f, +0.000453f, -0.000654f, + +0.003447f, +0.000643f, -0.000043f, -0.000374f, +0.000967f, -0.000088f, +0.001382f, -0.001551f, -0.002424f, -0.001819f, + +0.000469f, +0.000448f, +0.002859f, +0.002408f, -0.000131f, +0.001014f, -0.001024f, -0.000971f, +0.000018f, +0.000437f, + +0.001278f, -0.001599f, -0.001727f, +0.000042f, +0.000606f, +0.000285f, +0.001601f, +0.001390f, +0.001352f, +0.000533f, + +0.000094f, +0.000249f, +0.000715f, -0.000049f, +0.000000f, -0.000126f + }, + { + -0.001008f, -0.003383f, -0.007528f, -0.015679f, +0.003801f, -0.001329f, -0.000786f, +0.007087f, -0.001502f, +0.003240f, + +0.011821f, +0.002412f, -0.002327f, +0.005398f, +0.013395f, -0.010217f, +0.014955f, +0.001458f, -0.026277f, -0.024351f, + +0.004068f, -0.006941f, +0.012861f, +0.008023f, +0.012299f, -0.002306f, +0.006145f, +0.004134f, -0.001063f, +0.000699f, + -0.005273f, +0.009305f, -0.004853f, -0.010558f, -0.001451f, +0.006801f, +0.004660f, +0.011581f, +0.000683f, -0.000959f, + +0.000425f, +0.000032f, +0.004094f, -0.002387f, -0.005927f, +0.007009f, -0.003180f, +0.000139f, +0.000013f, -0.000571f, + +0.001289f, +0.002204f, +0.003717f, -0.000211f, +0.002333f, -0.003937f, +0.000466f, +0.000279f, -0.001309f, -0.001460f, + +0.001164f, +0.001050f, -0.002265f, +0.000150f, -0.000941f, +0.000825f, +0.003043f, -0.001783f, -0.001836f, +0.000223f, + +0.000359f, -0.000736f, -0.001184f, -0.001542f, -0.000551f, +0.000088f, +0.000244f, +0.000662f, -0.001216f, -0.002400f, + +0.002152f, +0.001217f, +0.000768f, -0.000156f, +0.000769f, -0.000820f, -0.000502f, -0.000104f, -0.000667f, +0.000055f, + +0.000152f, -0.000427f, +0.001078f, +0.000078f, -0.000261f, -0.000452f + }, + { + -0.001343f, +0.005425f, -0.026875f, -0.026897f, +0.002643f, +0.005220f, +0.000323f, -0.005051f, -0.000717f, -0.003206f, + -0.003292f, +0.001258f, +0.003109f, +0.000551f, +0.012219f, +0.004045f, +0.005984f, -0.011439f, +0.000364f, -0.004359f, + -0.001160f, -0.006428f, +0.017748f, -0.002875f, +0.009762f, -0.009202f, +0.005083f, +0.006011f, +0.001923f, -0.005615f, + +0.004982f, +0.000543f, +0.001241f, -0.005000f, -0.004354f, +0.007427f, +0.010766f, -0.003100f, +0.007749f, +0.006203f, + -0.000959f, -0.002864f, -0.000789f, +0.001976f, +0.002709f, +0.003824f, +0.002367f, +0.002970f, -0.000627f, +0.001761f, + +0.004117f, +0.000434f, -0.000810f, +0.003038f, -0.000307f, +0.002709f, -0.001721f, -0.004319f, +0.000486f, -0.001785f, + -0.000329f, +0.002054f, -0.001478f, -0.000150f, -0.000456f, +0.001126f, -0.001142f, -0.000176f, -0.000974f, +0.000419f, + +0.000565f, -0.001464f, -0.000537f, -0.000079f, +0.000505f, +0.000835f, +0.000649f, +0.001579f, -0.000180f, -0.002519f, + +0.000399f, -0.000173f, -0.000211f, -0.000969f, -0.000272f, -0.000814f, +0.000457f, -0.000484f, +0.000094f, -0.000004f, + -0.000674f, -0.000988f, -0.000522f, +0.000040f, -0.000763f, +0.000562f + }, + { + +0.039857f, +0.166991f, -0.001179f, +0.011514f, -0.008020f, -0.002206f, +0.003745f, +0.002227f, +0.002116f, -0.015015f, + -0.003354f, +0.002814f, +0.000027f, -0.002356f, -0.005136f, -0.011327f, -0.008591f, +0.001698f, -0.014948f, +0.005766f, + -0.005234f, -0.002652f, +0.003888f, +0.004900f, -0.010660f, -0.000964f, +0.000875f, +0.004245f, +0.004601f, +0.001149f, + -0.007391f, -0.001554f, -0.003334f, +0.003372f, +0.003260f, +0.001763f, +0.002121f, -0.002499f, +0.005576f, -0.009904f, + +0.000786f, +0.005913f, -0.002233f, -0.002377f, +0.000073f, +0.004405f, -0.004712f, -0.000341f, -0.005589f, +0.000653f, + +0.003892f, -0.005995f, -0.002277f, +0.001602f, +0.001686f, -0.002992f, -0.000496f, -0.001856f, +0.002329f, -0.002484f, + +0.002049f, -0.003016f, +0.000809f, +0.001164f, +0.000784f, +0.000292f, -0.000496f, -0.004917f, -0.001382f, -0.001253f, + -0.001170f, -0.002077f, -0.000720f, -0.000062f, -0.000842f, -0.000246f, +0.000287f, -0.000244f, +0.000493f, +0.001034f, + +0.001633f, +0.000107f, -0.000193f, -0.000659f, +0.000837f, -0.000180f, +0.000346f, +0.000740f, -0.000562f, +0.000568f, + +0.000649f, +0.000075f, +0.000191f, +0.000428f, +0.000738f, +0.000555f + }, + { + -0.004454f, -0.017519f, +0.004875f, +0.004076f, -0.000718f, -0.000654f, +0.000137f, +0.004410f, +0.003224f, -0.001552f, + +0.003450f, -0.008033f, +0.003112f, +0.003273f, -0.018726f, -0.015409f, -0.015583f, +0.006359f, +0.024946f, -0.020502f, + +0.005220f, +0.003952f, +0.012369f, -0.007106f, +0.010503f, -0.046984f, -0.015475f, +0.005706f, +0.016339f, -0.023539f, + -0.003123f, -0.012337f, -0.007553f, -0.001248f, -0.006132f, +0.000836f, +0.001549f, +0.005022f, +0.001201f, +0.000077f, + -0.001244f, +0.001353f, +0.002504f, +0.003067f, +0.001078f, -0.004905f, -0.001851f, +0.001245f, -0.004778f, +0.002770f, + +0.002212f, -0.002058f, -0.002400f, -0.000964f, +0.002258f, +0.002337f, +0.002282f, +0.001275f, -0.000518f, -0.004880f, + -0.006088f, -0.000730f, +0.000266f, -0.002480f, -0.000331f, -0.002873f, -0.000648f, -0.001343f, +0.002011f, +0.004173f, + -0.001812f, -0.000866f, +0.002258f, -0.000661f, +0.001095f, +0.001140f, +0.000029f, -0.001584f, -0.000007f, -0.000066f, + +0.000058f, +0.000356f, -0.000572f, +0.000029f, -0.000421f, -0.000042f, +0.000914f, -0.000574f, +0.001083f, -0.000137f, + +0.000290f, +0.000442f, -0.000760f, -0.000659f, +0.000140f, +0.000060f + }, + { + +0.064138f, +0.240501f, +0.004092f, +0.086189f, +0.018258f, -0.002978f, +0.003141f, -0.001661f, -0.008317f, +0.007684f, + +0.003439f, -0.011429f, -0.004913f, +0.019231f, +0.003930f, -0.000498f, +0.001783f, -0.004973f, +0.006232f, -0.003747f, + +0.007054f, -0.000528f, +0.005788f, +0.004139f, -0.000662f, -0.002298f, -0.006160f, -0.006609f, +0.003888f, +0.004342f, + +0.002465f, -0.000745f, -0.004386f, -0.005726f, -0.005591f, -0.003199f, +0.004465f, +0.009705f, -0.003454f, +0.000682f, + +0.004894f, -0.000454f, +0.001329f, -0.001936f, +0.002641f, +0.002195f, -0.000734f, -0.002882f, -0.007275f, +0.000049f, + +0.003417f, -0.001531f, +0.006056f, +0.000765f, -0.000681f, +0.000899f, +0.004659f, +0.000167f, -0.004053f, -0.006256f, + -0.003586f, -0.001017f, -0.004504f, -0.000309f, -0.001262f, +0.001261f, -0.000062f, +0.000362f, +0.002474f, -0.000755f, + -0.001736f, -0.000007f, -0.001610f, +0.000315f, -0.000717f, +0.000559f, +0.001948f, -0.001552f, -0.000930f, -0.000349f, + +0.000527f, -0.000699f, +0.001002f, +0.000559f, +0.001641f, +0.000743f, -0.000534f, +0.001021f, -0.000458f, -0.000506f, + -0.000182f, +0.000384f, +0.000451f, -0.000465f, -0.000739f, +0.000176f + }, + { + -0.000004f, -0.021810f, -0.004890f, -0.005699f, -0.003080f, -0.001151f, +0.000150f, +0.003072f, -0.001270f, +0.000194f, + -0.002536f, -0.000178f, -0.000109f, +0.013389f, +0.036625f, -0.039126f, -0.013789f, -0.007552f, +0.008784f, +0.002836f, + -0.009129f, +0.005033f, +0.014630f, -0.010262f, -0.003984f, +0.007881f, -0.007429f, +0.001835f, +0.001336f, +0.005274f, + -0.005605f, -0.002772f, +0.016058f, +0.026297f, +0.004995f, +0.005707f, +0.001852f, +0.003391f, +0.008506f, -0.000042f, + +0.003054f, -0.000064f, +0.003812f, +0.006688f, -0.001078f, +0.003626f, +0.001751f, +0.003996f, -0.003891f, -0.004963f, + -0.004001f, +0.000514f, -0.002893f, -0.004100f, +0.002747f, -0.003654f, -0.001551f, -0.003634f, +0.000290f, +0.000735f, + -0.001872f, -0.001263f, -0.001114f, +0.000374f, +0.003144f, +0.001253f, -0.000488f, -0.000765f, +0.000283f, +0.000565f, + -0.000318f, +0.002310f, -0.000007f, -0.000017f, +0.001614f, +0.001822f, +0.000997f, +0.001980f, -0.000681f, +0.000047f, + +0.000397f, +0.000575f, -0.000706f, -0.000773f, +0.000514f, +0.000166f, -0.001839f, +0.000534f, -0.000133f, -0.000940f, + -0.000502f, +0.000540f, +0.000785f, +0.000347f, +0.000286f, -0.000307f + }, + { + -0.092194f, -0.032422f, -0.014542f, -0.050885f, +0.008756f, +0.002892f, -0.006658f, +0.003179f, -0.004368f, -0.005859f, + -0.000435f, +0.001135f, +0.009873f, +0.002493f, +0.004004f, -0.006647f, -0.005890f, -0.013395f, -0.006810f, +0.013643f, + -0.005318f, -0.005216f, +0.003240f, -0.002363f, -0.005618f, +0.004944f, -0.006180f, -0.000902f, +0.005527f, -0.001162f, + +0.000150f, -0.000646f, -0.003594f, -0.000637f, -0.006885f, -0.003012f, -0.004295f, -0.001377f, +0.003154f, -0.001098f, + -0.000894f, -0.005376f, +0.001465f, -0.001262f, +0.003967f, +0.000425f, +0.002198f, +0.001495f, +0.002677f, +0.001782f, + +0.006459f, -0.001059f, -0.001131f, +0.000332f, +0.005634f, +0.003603f, +0.002094f, +0.000222f, +0.000469f, +0.001596f, + +0.001730f, -0.000128f, +0.000943f, +0.002886f, +0.000319f, +0.000375f, -0.000219f, -0.001540f, -0.001652f, -0.000421f, + +0.000021f, -0.000301f, +0.000540f, +0.001355f, -0.000125f, -0.000247f, +0.002022f, -0.000106f, +0.000634f, +0.000570f, + +0.001004f, +0.000992f, -0.000451f, -0.000513f, -0.001009f, -0.001479f, +0.000987f, +0.000498f, +0.000180f, +0.000083f, + -0.000386f, +0.000087f, +0.000456f, +0.001165f, +0.000078f, -0.000202f + }, + { + -0.000187f, +0.006861f, +0.007626f, +0.000832f, +0.001193f, -0.000362f, -0.000762f, -0.000480f, -0.002255f, +0.001445f, + -0.004025f, -0.007200f, +0.002658f, +0.012488f, +0.022770f, -0.035443f, -0.006078f, -0.004115f, -0.002855f, +0.024256f, + +0.017085f, +0.000502f, -0.002093f, -0.005484f, -0.002461f, +0.014301f, +0.017839f, -0.006847f, -0.016035f, +0.012108f, + -0.009582f, -0.009270f, -0.007163f, -0.000177f, -0.002064f, -0.008062f, -0.007790f, -0.004256f, +0.002166f, -0.003871f, + +0.003961f, -0.002701f, +0.002556f, +0.006929f, +0.006941f, +0.007552f, +0.001466f, +0.000703f, +0.000400f, -0.000040f, + +0.003798f, -0.002722f, +0.002171f, +0.001027f, +0.000503f, -0.000260f, -0.001386f, +0.001109f, -0.000322f, -0.004110f, + -0.002927f, +0.000152f, -0.000841f, +0.000445f, +0.000392f, +0.000674f, -0.000100f, -0.000368f, -0.000194f, +0.000570f, + -0.002553f, -0.000297f, -0.002858f, -0.000629f, +0.003066f, +0.001368f, -0.000200f, -0.000529f, -0.000301f, +0.001069f, + -0.000625f, -0.000838f, -0.000629f, +0.001889f, -0.001825f, +0.000116f, +0.000123f, -0.000372f, -0.001105f, -0.000630f, + +0.000561f, +0.000328f, -0.000180f, +0.000312f, +0.000099f, -0.000108f + }, + { + -0.017611f, -0.230938f, +0.005654f, +0.016319f, +0.028726f, -0.005549f, +0.003760f, +0.000454f, +0.005544f, +0.004358f, + -0.004165f, +0.005483f, -0.005723f, +0.007716f, -0.003247f, -0.005262f, +0.006043f, +0.006802f, -0.004232f, +0.002769f, + -0.000988f, -0.006790f, +0.006442f, -0.004370f, -0.017967f, +0.004370f, +0.006296f, +0.000899f, +0.002567f, -0.004301f, + +0.000369f, +0.002737f, +0.000076f, -0.001927f, -0.001414f, -0.003101f, -0.004045f, +0.007698f, -0.004903f, +0.000608f, + -0.005160f, +0.000500f, -0.003904f, -0.009109f, +0.007557f, +0.005902f, +0.001723f, +0.000695f, +0.002013f, +0.000024f, + +0.003008f, +0.002915f, +0.000627f, -0.002223f, +0.001698f, +0.003136f, +0.001829f, +0.000819f, -0.000134f, +0.001352f, + +0.002773f, +0.002048f, +0.000070f, -0.001361f, +0.000049f, -0.002785f, +0.000633f, +0.001734f, -0.003007f, -0.002027f, + -0.000834f, -0.000695f, -0.000085f, +0.000740f, +0.002224f, -0.000704f, +0.000792f, +0.000631f, -0.001375f, +0.000461f, + -0.000916f, -0.001366f, -0.001286f, +0.000404f, +0.000493f, +0.000168f, +0.000050f, -0.000498f, -0.000426f, -0.001704f, + +0.001127f, -0.000849f, +0.001261f, +0.001157f, -0.000355f, +0.000216f + }, + { + -0.000693f, +0.029076f, +0.010744f, -0.006686f, -0.003356f, -0.004498f, -0.003147f, -0.007202f, -0.000504f, +0.002721f, + +0.004315f, +0.008197f, +0.002950f, +0.002392f, -0.031196f, -0.011031f, -0.011220f, +0.014814f, +0.004728f, +0.007115f, + -0.017866f, +0.012457f, -0.003356f, -0.002161f, -0.003083f, -0.006965f, +0.004551f, +0.011892f, -0.001751f, +0.000650f, + -0.008158f, +0.000929f, +0.004476f, -0.002974f, -0.003940f, -0.001840f, +0.001973f, +0.006723f, -0.004632f, -0.000667f, + -0.008084f, -0.002559f, +0.004146f, -0.003329f, +0.004220f, -0.001643f, -0.000125f, +0.003717f, -0.002861f, -0.000481f, + -0.003779f, +0.000929f, -0.002153f, -0.000137f, -0.000661f, -0.003772f, -0.000093f, +0.001950f, -0.000779f, +0.000440f, + +0.002677f, -0.000023f, +0.002154f, -0.001601f, +0.002952f, +0.001075f, -0.003260f, -0.002071f, -0.000654f, -0.002189f, + -0.000693f, -0.001396f, -0.000135f, -0.000421f, -0.001382f, +0.000772f, +0.000663f, +0.001418f, +0.000906f, +0.001813f, + +0.000379f, +0.000483f, +0.000224f, -0.001188f, -0.000508f, -0.000246f, +0.000627f, -0.000154f, -0.000632f, -0.000546f, + +0.001039f, +0.000809f, +0.000357f, -0.000036f, +0.000297f, -0.000204f + }, + { + -0.086144f, -0.178491f, -0.017368f, -0.022656f, -0.009700f, +0.003794f, -0.036096f, -0.017871f, +0.010795f, -0.002451f, + +0.010987f, -0.005824f, -0.009634f, -0.005493f, +0.007577f, +0.004016f, +0.010258f, -0.007240f, -0.004732f, +0.005339f, + -0.003761f, +0.006455f, -0.002885f, +0.000692f, +0.004614f, +0.005448f, +0.003695f, -0.002964f, -0.003144f, -0.000972f, + +0.005849f, +0.007049f, +0.003638f, -0.003604f, -0.001904f, -0.006664f, +0.001418f, +0.006525f, -0.001819f, +0.003089f, + -0.004142f, -0.004146f, -0.004368f, +0.001614f, +0.003026f, -0.003236f, +0.001538f, +0.004031f, -0.000709f, -0.006871f, + -0.000064f, -0.001983f, +0.004625f, -0.002667f, +0.000949f, +0.002521f, +0.000609f, +0.002797f, -0.002104f, -0.001696f, + +0.003166f, +0.000790f, +0.000088f, +0.001545f, +0.001386f, +0.000051f, -0.002778f, -0.003115f, +0.001404f, -0.001649f, + +0.001043f, -0.001642f, +0.002266f, +0.000336f, +0.002024f, -0.001065f, -0.000872f, -0.000445f, -0.000547f, +0.000417f, + -0.000034f, +0.001412f, -0.000198f, +0.001500f, +0.000325f, -0.000901f, +0.000368f, -0.001183f, +0.000038f, +0.000870f, + +0.001233f, +0.000230f, +0.000131f, -0.000294f, -0.000107f, -0.000191f + }, + { + -0.004987f, -0.043527f, +0.018082f, +0.013462f, -0.000321f, -0.004551f, -0.004292f, -0.001216f, -0.006290f, -0.003655f, + +0.001693f, +0.002865f, -0.003834f, +0.007651f, -0.025418f, +0.001806f, +0.005395f, -0.011021f, -0.010518f, -0.003974f, + -0.028577f, -0.016595f, -0.005517f, -0.003213f, -0.002325f, -0.020216f, -0.010768f, +0.004372f, +0.011438f, +0.004547f, + +0.013884f, +0.022066f, -0.002635f, -0.011000f, +0.003343f, -0.019710f, -0.003257f, -0.011225f, -0.008270f, -0.001318f, + +0.009725f, +0.004993f, -0.004587f, +0.004787f, +0.003546f, -0.002033f, +0.001847f, -0.004772f, -0.001129f, +0.003771f, + +0.000515f, -0.004075f, -0.006197f, -0.004006f, +0.005080f, +0.000539f, -0.001483f, +0.003260f, -0.002201f, -0.001481f, + +0.002707f, +0.002681f, +0.004911f, -0.000489f, -0.003077f, -0.002051f, +0.002084f, +0.001105f, +0.003525f, -0.000406f, + +0.001948f, +0.000466f, +0.002498f, -0.002233f, +0.001703f, -0.000120f, +0.000396f, +0.000214f, -0.000829f, -0.000434f, + +0.000924f, -0.001801f, -0.002182f, -0.000876f, -0.000626f, -0.000278f, +0.000687f, -0.000803f, -0.000395f, +0.000764f, + -0.000339f, +0.000122f, +0.000749f, -0.000320f, -0.000697f, +0.000596f + }, + { + +0.004731f, -0.188167f, -0.010994f, -0.016123f, +0.001062f, +0.020229f, +0.000099f, +0.024148f, -0.000383f, -0.000583f, + +0.007165f, +0.020591f, -0.005720f, +0.008734f, -0.003224f, -0.005606f, -0.007703f, +0.001556f, +0.012257f, +0.010612f, + -0.003457f, +0.001768f, +0.004934f, +0.006600f, -0.003682f, +0.004523f, +0.003782f, +0.011088f, +0.002356f, -0.005793f, + -0.008832f, -0.005411f, +0.002278f, +0.000074f, +0.000734f, +0.003770f, -0.006838f, -0.000942f, -0.000936f, +0.002929f, + -0.002915f, -0.006686f, -0.002472f, +0.004958f, +0.004476f, -0.000271f, -0.001531f, +0.007457f, -0.001668f, +0.001277f, + +0.003570f, -0.000251f, -0.000993f, -0.001275f, +0.000142f, -0.001125f, -0.005323f, +0.000564f, -0.002407f, +0.003135f, + +0.000391f, -0.001811f, -0.000866f, -0.003323f, -0.003339f, -0.000546f, -0.001462f, -0.000495f, +0.001373f, -0.000757f, + +0.000582f, +0.002337f, +0.000105f, -0.002302f, +0.000207f, -0.001459f, +0.001839f, +0.000101f, -0.000285f, +0.000991f, + -0.000300f, +0.000214f, +0.000385f, +0.000961f, +0.000796f, -0.002255f, -0.001004f, +0.000401f, -0.000330f, +0.000260f, + +0.000070f, -0.000501f, +0.000205f, +0.000304f, +0.000369f, -0.000401f + }, + { + -0.006611f, -0.084802f, -0.003836f, +0.006043f, +0.001988f, +0.006150f, +0.007658f, -0.002611f, -0.001365f, -0.003607f, + -0.002824f, +0.000011f, +0.015325f, +0.028620f, -0.018201f, -0.019304f, -0.018892f, -0.011108f, +0.007525f, +0.022069f, + -0.001170f, -0.014695f, +0.009460f, -0.007401f, +0.022316f, +0.004667f, +0.016178f, -0.013732f, +0.002770f, -0.000162f, + +0.001497f, +0.001680f, -0.005143f, -0.001154f, +0.008868f, +0.003132f, -0.003652f, +0.006387f, +0.001241f, +0.002162f, + +0.003895f, +0.010003f, +0.010467f, -0.002928f, -0.007986f, +0.001902f, +0.003344f, +0.002050f, +0.000564f, -0.001533f, + +0.003266f, +0.007788f, -0.003807f, +0.000102f, -0.002000f, +0.000599f, -0.001262f, +0.000007f, +0.001501f, -0.002577f, + +0.001062f, +0.001854f, -0.000946f, +0.000493f, +0.001825f, -0.000139f, -0.003241f, +0.002112f, -0.000927f, -0.000805f, + +0.001701f, -0.000143f, +0.001763f, +0.000898f, -0.000366f, -0.000568f, -0.000821f, +0.000745f, -0.001366f, -0.001431f, + +0.000755f, -0.000974f, -0.002027f, -0.001306f, -0.000499f, -0.000372f, +0.001133f, +0.000120f, -0.000721f, -0.000078f, + -0.000196f, -0.000532f, -0.000670f, -0.000711f, -0.000171f, +0.000716f + } + }, + { + { + -0.000553f, -0.052841f, -0.035509f, +0.011825f, -0.006581f, -0.002084f, -0.000401f, +0.004720f, -0.000400f, -0.008684f, + +0.009966f, +0.006269f, -0.008389f, -0.000381f, +0.001452f, +0.006400f, -0.004493f, +0.003660f, -0.003405f, -0.002824f, + -0.005682f, +0.004023f, -0.000449f, +0.010234f, +0.001044f, -0.002229f, -0.002987f, -0.003646f, +0.001787f, +0.002331f, + +0.006855f, -0.002522f, +0.002213f, +0.001582f, +0.002504f, +0.000810f, +0.004726f, +0.004565f, +0.006449f, -0.000863f, + -0.008213f, +0.001171f, -0.006331f, -0.003867f, -0.000692f, +0.001315f, -0.004468f, -0.000046f, -0.000366f, -0.001987f, + +0.003033f, +0.000104f, +0.000024f, -0.000360f, +0.002143f, -0.000926f, +0.002587f, +0.001796f, +0.001477f, +0.001673f, + +0.001998f, +0.001199f, +0.001808f, -0.001407f, +0.001288f, -0.000698f, +0.002210f, +0.000966f, -0.000310f, +0.001172f, + +0.001605f, -0.000141f, +0.000262f, +0.000106f, -0.001634f, -0.000583f, -0.000220f, +0.000049f, -0.000277f, +0.000075f, + +0.000144f, -0.000290f, +0.000479f, +0.000233f, +0.000103f, +0.000010f, +0.000418f, -0.000168f, +0.000881f, +0.000533f, + +0.000552f, -0.000027f, -0.000022f, -0.000533f, -0.000029f, +0.000017f + }, + { + +0.000044f, +0.012566f, -0.002401f, -0.009640f, +0.009614f, -0.000876f, +0.002355f, +0.005454f, -0.003942f, -0.001189f, + +0.005273f, -0.005222f, -0.005931f, -0.000451f, +0.010755f, -0.003150f, +0.019153f, +0.006746f, -0.001091f, -0.012520f, + +0.010914f, -0.001280f, +0.004352f, -0.008504f, +0.000886f, +0.002696f, +0.003548f, -0.004716f, -0.004955f, +0.005795f, + -0.003293f, +0.005051f, -0.009250f, -0.006448f, +0.004821f, +0.005778f, +0.003499f, +0.005179f, -0.003009f, -0.000479f, + +0.000629f, -0.004138f, -0.000145f, -0.001383f, -0.003235f, +0.003268f, -0.005663f, -0.001795f, -0.003352f, -0.001316f, + +0.001259f, -0.001648f, +0.000364f, -0.001070f, -0.000003f, -0.003659f, +0.000868f, -0.000408f, +0.000041f, -0.001224f, + +0.001327f, +0.000814f, -0.002055f, +0.001781f, +0.001157f, -0.000017f, +0.000594f, +0.000058f, -0.000187f, +0.000173f, + -0.000495f, -0.000404f, +0.000398f, -0.000017f, +0.000133f, +0.001525f, -0.000106f, +0.000689f, +0.000003f, -0.001640f, + +0.000999f, +0.000172f, +0.000865f, +0.000177f, +0.000813f, -0.000443f, -0.000575f, +0.000092f, -0.000778f, +0.000254f, + +0.000164f, -0.000438f, +0.000900f, -0.000235f, -0.000253f, -0.000098f + }, + { + -0.000982f, +0.037216f, +0.008107f, +0.011727f, +0.013488f, +0.001214f, -0.001246f, -0.003946f, +0.004309f, +0.000632f, + -0.001157f, +0.003393f, +0.003700f, +0.000334f, +0.001802f, -0.015151f, +0.004378f, -0.011618f, +0.006864f, -0.000964f, + -0.001703f, -0.016229f, +0.015442f, +0.002675f, +0.015166f, -0.000974f, +0.001792f, +0.004875f, +0.001991f, -0.001149f, + +0.008964f, +0.000975f, -0.004113f, -0.008287f, -0.007628f, +0.003662f, +0.005836f, -0.003078f, +0.003121f, -0.000179f, + -0.002498f, -0.001103f, +0.000525f, +0.001174f, -0.001327f, -0.001806f, +0.002548f, +0.002737f, -0.002785f, -0.001450f, + -0.000787f, -0.000658f, -0.000981f, +0.000369f, -0.000136f, +0.004328f, -0.003056f, -0.000971f, +0.004526f, +0.000777f, + -0.001930f, -0.000589f, -0.002287f, +0.000829f, -0.001236f, +0.000947f, +0.000303f, +0.001007f, -0.001418f, -0.002408f, + -0.000971f, -0.001125f, +0.000782f, +0.000347f, +0.000038f, -0.000099f, +0.000211f, +0.000831f, -0.000465f, -0.001922f, + +0.000949f, -0.000373f, +0.000292f, -0.000294f, -0.000089f, +0.000001f, +0.000923f, -0.000588f, -0.000198f, +0.000492f, + -0.000292f, -0.000118f, -0.000157f, -0.000080f, -0.000791f, -0.000068f + }, + { + -0.043897f, +0.034553f, -0.032708f, -0.001468f, +0.010242f, -0.002455f, -0.003725f, -0.001981f, +0.009214f, +0.001034f, + +0.002712f, -0.001449f, -0.002433f, +0.004346f, +0.014077f, +0.002997f, -0.006294f, -0.004513f, -0.014725f, +0.006555f, + -0.000591f, +0.000337f, +0.007671f, +0.005275f, -0.010313f, +0.004424f, -0.003446f, -0.004331f, +0.002310f, -0.001008f, + -0.006259f, +0.002106f, -0.004013f, +0.002663f, +0.002934f, +0.004989f, +0.003238f, -0.002677f, +0.000851f, -0.006615f, + +0.001609f, +0.002131f, +0.001394f, -0.004063f, -0.000455f, +0.008638f, -0.004273f, -0.000459f, -0.004083f, -0.001241f, + +0.002259f, -0.002362f, -0.000310f, -0.001316f, -0.000742f, -0.002225f, +0.002292f, -0.000875f, +0.000753f, -0.001339f, + +0.003139f, -0.001715f, +0.001707f, +0.000427f, +0.001814f, -0.000275f, +0.000677f, -0.001806f, +0.000474f, +0.001690f, + +0.002567f, -0.000907f, -0.001316f, -0.000174f, -0.001014f, -0.000835f, -0.000003f, -0.000016f, -0.000812f, -0.000825f, + +0.000701f, +0.000297f, +0.000491f, -0.000957f, +0.000328f, +0.000136f, +0.000013f, +0.000514f, -0.000704f, -0.000056f, + +0.000153f, +0.000546f, -0.000263f, -0.000775f, +0.000196f, -0.000179f + }, + { + +0.004355f, -0.024782f, -0.008472f, +0.004204f, -0.000300f, -0.000910f, -0.000539f, +0.002401f, +0.000759f, +0.000054f, + +0.007086f, -0.001578f, -0.000215f, +0.002843f, -0.005498f, +0.017947f, +0.009500f, -0.020958f, +0.015432f, -0.018796f, + +0.010161f, +0.010604f, +0.017669f, +0.000055f, +0.016069f, -0.017380f, +0.003302f, +0.004075f, +0.015419f, -0.024340f, + +0.009880f, +0.001387f, -0.001950f, +0.005046f, +0.003661f, +0.005749f, -0.000973f, -0.002331f, +0.000420f, +0.006153f, + +0.005136f, +0.000593f, +0.001823f, +0.003178f, +0.003032f, -0.001668f, +0.000283f, +0.001568f, -0.002800f, +0.002883f, + +0.003537f, -0.000041f, -0.001456f, -0.000014f, +0.001062f, -0.000496f, +0.002435f, -0.001730f, -0.002198f, -0.001373f, + -0.000985f, +0.000159f, +0.000865f, -0.000931f, -0.000322f, -0.001390f, -0.000208f, -0.002430f, +0.000574f, +0.000910f, + -0.002137f, -0.001049f, +0.001581f, -0.001079f, +0.001038f, +0.000401f, +0.000976f, -0.001157f, +0.000145f, +0.000460f, + +0.000507f, +0.000828f, +0.000586f, +0.000475f, -0.000255f, -0.000777f, +0.000529f, -0.001213f, +0.000508f, +0.000253f, + +0.000693f, +0.000657f, -0.000051f, +0.000394f, +0.000173f, -0.000545f + }, + { + -0.066807f, +0.032821f, -0.014649f, +0.068059f, +0.006690f, -0.003688f, +0.003180f, +0.014159f, +0.005140f, +0.004991f, + +0.001648f, -0.005313f, -0.006169f, +0.010129f, -0.003501f, -0.007500f, +0.001615f, -0.008839f, +0.005040f, -0.004089f, + -0.002565f, -0.010484f, +0.007824f, +0.000857f, -0.002493f, -0.000021f, -0.000534f, -0.001593f, +0.002360f, +0.002649f, + -0.001024f, -0.001788f, -0.004136f, -0.004487f, -0.006676f, -0.005149f, +0.000029f, +0.003842f, -0.006034f, -0.001210f, + +0.003323f, -0.002391f, +0.001310f, +0.002635f, +0.005127f, -0.001087f, -0.004847f, +0.000049f, -0.004824f, -0.000962f, + +0.005991f, -0.001521f, +0.001224f, -0.000594f, +0.003267f, -0.001389f, +0.000726f, -0.000279f, -0.000729f, -0.001544f, + +0.003446f, +0.001909f, -0.004689f, +0.001006f, -0.001398f, +0.001015f, +0.000291f, +0.000626f, +0.002742f, +0.000705f, + +0.000051f, +0.000343f, +0.000172f, -0.000528f, -0.000752f, +0.000150f, +0.000103f, -0.001756f, -0.000368f, +0.000391f, + +0.000864f, -0.000817f, +0.001057f, -0.000731f, -0.000038f, -0.000183f, -0.000300f, +0.000709f, +0.000314f, -0.001073f, + -0.001273f, +0.000008f, +0.000157f, +0.000307f, -0.000438f, -0.000460f + }, + { + -0.001003f, -0.024307f, -0.002687f, -0.002025f, -0.000068f, +0.000235f, +0.000720f, +0.002587f, -0.002756f, -0.000358f, + -0.002196f, -0.001815f, -0.007652f, -0.001300f, +0.012743f, -0.025236f, +0.008221f, -0.004125f, +0.001919f, -0.004883f, + -0.008087f, -0.009523f, +0.010706f, +0.021597f, +0.014223f, +0.011643f, -0.024163f, -0.005147f, +0.004002f, +0.016022f, + +0.007117f, +0.004736f, +0.013469f, +0.010437f, +0.001465f, +0.000984f, -0.001985f, +0.000816f, +0.004602f, -0.005989f, + -0.003123f, -0.003198f, +0.000230f, +0.004657f, -0.003375f, +0.001731f, -0.000042f, +0.003276f, +0.000109f, -0.000561f, + -0.002415f, -0.001087f, -0.000039f, -0.000676f, +0.005226f, -0.003705f, -0.004476f, -0.002707f, +0.001842f, -0.000615f, + -0.002044f, -0.000327f, -0.002566f, -0.002868f, +0.000033f, -0.000106f, +0.000305f, -0.001025f, -0.000940f, +0.000689f, + -0.000155f, +0.001251f, -0.000189f, +0.001329f, +0.001286f, +0.000301f, -0.000935f, +0.001384f, -0.000825f, -0.000802f, + +0.000302f, -0.000062f, -0.000703f, -0.000313f, +0.000349f, +0.000056f, -0.000978f, +0.000726f, +0.000082f, +0.000608f, + -0.000651f, +0.000159f, +0.000462f, +0.000229f, +0.000544f, -0.000326f + }, + { + +0.054226f, +0.178389f, -0.006729f, -0.047015f, -0.001143f, +0.006636f, -0.001382f, +0.003014f, -0.007256f, -0.007923f, + +0.007328f, +0.002852f, -0.002081f, -0.002179f, +0.001929f, +0.004082f, +0.002541f, +0.006640f, -0.004772f, +0.005901f, + -0.005111f, -0.005983f, +0.005699f, +0.000033f, -0.007099f, +0.005848f, +0.001542f, +0.008146f, +0.003909f, -0.007263f, + +0.003186f, +0.005763f, +0.001123f, -0.000190f, -0.000866f, +0.001023f, -0.001823f, +0.002350f, -0.002057f, -0.007471f, + +0.001237f, -0.004738f, -0.002483f, -0.002070f, +0.002078f, +0.000652f, +0.003444f, +0.001340f, +0.001079f, +0.000544f, + +0.002527f, +0.002379f, +0.003165f, -0.000678f, +0.002198f, +0.001764f, +0.003541f, +0.000585f, -0.000951f, -0.002506f, + +0.002163f, -0.002057f, -0.002541f, +0.001899f, -0.001578f, -0.000590f, +0.000703f, -0.000981f, -0.000829f, -0.001020f, + -0.000002f, +0.000051f, -0.000411f, +0.001784f, +0.000685f, +0.000921f, +0.001680f, +0.000214f, +0.000082f, +0.000102f, + +0.000787f, +0.000499f, -0.000280f, -0.000422f, +0.000181f, -0.000188f, +0.000186f, -0.000092f, +0.000581f, -0.000412f, + -0.000614f, -0.000323f, +0.000211f, +0.000332f, -0.000716f, +0.000166f + }, + { + -0.001563f, -0.005918f, +0.000792f, -0.001245f, -0.000374f, -0.000641f, +0.001242f, +0.000914f, -0.001005f, +0.000384f, + -0.002514f, -0.000501f, +0.001723f, -0.002569f, +0.019563f, -0.027109f, +0.018416f, +0.013429f, +0.004060f, +0.016906f, + +0.016291f, -0.010910f, +0.003426f, +0.007053f, -0.013065f, +0.016034f, +0.023285f, -0.000116f, -0.009269f, +0.017136f, + -0.004450f, -0.008324f, -0.001907f, +0.004774f, -0.007219f, -0.008691f, -0.008030f, -0.005580f, +0.002038f, -0.005667f, + -0.000204f, -0.000153f, +0.000008f, -0.002668f, -0.000504f, +0.003251f, +0.002108f, +0.003028f, +0.000842f, -0.000672f, + +0.001358f, -0.001590f, +0.001494f, -0.000404f, +0.002008f, +0.000232f, -0.000235f, +0.002650f, -0.001766f, -0.003219f, + -0.000554f, +0.002020f, +0.000429f, +0.001167f, +0.000768f, +0.000947f, -0.000153f, +0.000736f, +0.000702f, +0.001394f, + -0.000939f, +0.000594f, -0.002234f, -0.000105f, +0.002854f, -0.000206f, +0.000287f, -0.000168f, -0.000729f, +0.000930f, + -0.000017f, +0.000170f, -0.000936f, +0.001931f, -0.001483f, +0.000035f, +0.000109f, -0.000471f, -0.000244f, -0.000757f, + -0.000506f, +0.000122f, -0.000171f, -0.000099f, -0.000242f, -0.000071f + }, + { + +0.019262f, -0.211948f, -0.043446f, +0.011927f, +0.023590f, -0.009662f, +0.015457f, +0.004202f, -0.001327f, +0.000287f, + -0.001735f, +0.006010f, +0.005147f, +0.015923f, -0.002456f, +0.000901f, -0.002839f, +0.009670f, -0.006836f, -0.000846f, + -0.001357f, -0.007446f, +0.001839f, +0.002217f, -0.008652f, +0.011941f, -0.001412f, -0.008751f, +0.008185f, +0.008065f, + +0.001603f, -0.007140f, -0.006134f, -0.004218f, +0.008227f, +0.001522f, -0.004109f, +0.008016f, -0.000614f, +0.002575f, + -0.005082f, -0.000465f, -0.002280f, -0.006734f, +0.005187f, -0.000141f, -0.004953f, -0.001096f, +0.001513f, -0.005708f, + -0.000641f, -0.001280f, -0.000397f, -0.001502f, +0.000146f, +0.000071f, -0.001405f, -0.001462f, -0.001442f, +0.000324f, + -0.000765f, +0.000540f, -0.000754f, -0.001300f, +0.000767f, -0.001014f, +0.000869f, -0.000554f, -0.001566f, +0.000842f, + +0.001283f, -0.000372f, -0.000557f, +0.000713f, +0.001213f, -0.000758f, -0.000483f, +0.000661f, -0.000268f, +0.001622f, + +0.000330f, -0.000448f, -0.000687f, -0.000674f, +0.000005f, -0.000629f, +0.000198f, -0.000112f, -0.000538f, -0.001373f, + +0.000763f, -0.000788f, +0.000328f, -0.000116f, -0.000402f, +0.000744f + }, + { + +0.002673f, +0.016180f, -0.000869f, +0.006897f, +0.003500f, +0.003882f, +0.007581f, -0.005702f, -0.005042f, -0.000160f, + -0.000642f, +0.017443f, +0.002238f, -0.002298f, -0.024010f, +0.003143f, +0.000882f, +0.003585f, +0.002688f, +0.023440f, + -0.013754f, +0.005478f, -0.001006f, -0.002976f, +0.002895f, +0.006144f, -0.000247f, +0.004870f, -0.007599f, +0.004605f, + -0.006049f, +0.002065f, -0.000304f, -0.000587f, -0.001701f, +0.000733f, -0.000390f, +0.002963f, +0.001382f, +0.007075f, + -0.002374f, +0.004928f, +0.005542f, -0.001066f, +0.004138f, -0.001353f, -0.001311f, +0.001651f, -0.002175f, -0.001279f, + -0.003454f, +0.001629f, +0.000478f, -0.000082f, -0.000032f, -0.003659f, -0.002333f, +0.000924f, -0.000813f, -0.002235f, + +0.000665f, -0.000952f, +0.000138f, -0.002616f, +0.000961f, +0.000016f, -0.001814f, -0.001068f, +0.000415f, -0.000001f, + +0.001889f, +0.000647f, +0.001249f, -0.000372f, -0.000360f, +0.000469f, -0.000487f, -0.000463f, -0.001752f, +0.000820f, + +0.000375f, -0.000234f, +0.000710f, -0.000376f, -0.000039f, -0.001008f, +0.000288f, +0.000070f, +0.000793f, +0.000004f, + +0.000594f, +0.000545f, +0.000522f, -0.000134f, -0.000051f, -0.000181f + }, + { + +0.093902f, +0.065675f, +0.001308f, -0.013505f, -0.011884f, +0.054746f, +0.009778f, -0.009262f, +0.005108f, -0.013781f, + +0.013334f, +0.000558f, -0.002315f, -0.004097f, -0.008359f, -0.006740f, +0.013720f, +0.005324f, -0.002291f, +0.008455f, + -0.001243f, +0.005654f, +0.000622f, +0.003148f, -0.000645f, -0.002680f, +0.002699f, -0.001949f, -0.003494f, -0.004007f, + -0.000032f, +0.000861f, +0.001178f, +0.003883f, +0.004992f, -0.002759f, -0.000582f, +0.008881f, -0.002512f, +0.004725f, + -0.005034f, -0.002569f, +0.002289f, +0.007802f, +0.001365f, -0.001545f, +0.002041f, +0.005973f, +0.001658f, -0.001036f, + +0.003630f, -0.000536f, +0.001720f, -0.005835f, -0.000112f, +0.003251f, -0.001471f, +0.001379f, +0.001821f, -0.001000f, + +0.001379f, +0.001202f, +0.001081f, -0.000767f, +0.000511f, -0.000384f, -0.000951f, -0.000582f, +0.000230f, -0.002404f, + +0.002399f, -0.001237f, +0.001070f, -0.000463f, +0.001396f, -0.001256f, -0.001558f, -0.000878f, -0.000412f, +0.000534f, + -0.000120f, +0.000482f, -0.000037f, +0.001102f, +0.000626f, +0.000301f, +0.000116f, -0.000586f, +0.000122f, -0.001061f, + +0.000502f, -0.000070f, +0.000284f, +0.000121f, -0.000004f, +0.000085f + }, + { + +0.003341f, -0.053369f, -0.002505f, +0.010849f, -0.002406f, -0.008834f, +0.001308f, +0.005737f, +0.000299f, +0.001122f, + -0.000717f, -0.001571f, -0.005548f, +0.016522f, -0.025905f, +0.005249f, +0.012255f, +0.003391f, +0.003171f, -0.005495f, + -0.002447f, +0.003621f, +0.008412f, -0.005660f, -0.016176f, -0.006868f, -0.006057f, -0.012494f, -0.010504f, -0.011030f, + +0.005915f, +0.010013f, -0.008142f, -0.010310f, +0.009806f, -0.007774f, +0.000223f, -0.005700f, +0.000564f, +0.002786f, + +0.004291f, -0.002903f, -0.012557f, -0.001422f, -0.002446f, -0.002717f, +0.002217f, -0.005029f, +0.000441f, -0.000332f, + -0.000491f, +0.001216f, -0.000280f, +0.000413f, +0.004301f, -0.001034f, -0.000516f, +0.002569f, -0.002156f, +0.001006f, + -0.000153f, -0.001870f, +0.001618f, -0.000362f, +0.000064f, -0.001450f, +0.002273f, +0.001822f, +0.004228f, +0.000065f, + +0.001214f, +0.000729f, +0.001758f, -0.002314f, +0.000538f, -0.001403f, +0.000779f, +0.000664f, +0.000369f, +0.000142f, + +0.001025f, -0.000542f, -0.001399f, -0.000592f, -0.000893f, -0.001114f, +0.000156f, -0.000161f, +0.000472f, +0.000066f, + -0.000985f, +0.000004f, +0.001030f, +0.000769f, +0.000124f, +0.000166f + }, + { + +0.032128f, -0.156395f, -0.006017f, -0.001335f, +0.000672f, +0.030482f, -0.013382f, +0.007049f, -0.008638f, -0.004255f, + -0.007495f, +0.008042f, -0.003254f, -0.001644f, -0.018961f, +0.005024f, -0.001836f, -0.001172f, +0.004484f, +0.001009f, + -0.010124f, -0.008746f, -0.000651f, -0.003812f, -0.006710f, +0.002766f, -0.000633f, +0.002321f, +0.005573f, +0.006307f, + -0.000635f, -0.005752f, -0.001053f, -0.001083f, -0.001002f, -0.001964f, -0.003521f, +0.005652f, -0.001845f, -0.001801f, + +0.002970f, +0.002129f, -0.005452f, +0.000809f, -0.000416f, -0.000838f, +0.003012f, +0.008792f, -0.000410f, +0.002311f, + +0.002272f, +0.001270f, +0.001180f, +0.001835f, +0.003005f, +0.001011f, -0.004854f, +0.003073f, -0.001756f, +0.001877f, + +0.002356f, -0.000481f, -0.000584f, -0.001202f, -0.000841f, +0.000762f, -0.000633f, -0.000415f, +0.000688f, -0.001805f, + +0.000845f, +0.001332f, -0.000197f, +0.000965f, +0.001898f, -0.001038f, +0.000942f, -0.000117f, +0.000012f, +0.001224f, + -0.000116f, +0.000442f, -0.000215f, -0.000486f, +0.000415f, -0.001157f, -0.000902f, +0.000366f, -0.000476f, +0.000491f, + +0.000501f, -0.000237f, -0.000027f, +0.000752f, +0.000837f, -0.000057f + }, + { + +0.005358f, -0.069323f, -0.007970f, +0.002211f, -0.000514f, -0.000022f, +0.006260f, +0.002076f, +0.003971f, +0.000611f, + +0.002262f, +0.008952f, +0.009022f, +0.015505f, +0.001028f, +0.003483f, -0.009834f, -0.007061f, +0.003137f, +0.000064f, + +0.006811f, +0.001314f, +0.009748f, -0.021387f, +0.009588f, +0.002409f, +0.014205f, -0.013284f, +0.011869f, +0.002754f, + +0.010308f, +0.009321f, -0.002022f, +0.001963f, +0.007517f, -0.000161f, -0.000616f, +0.003954f, -0.005396f, +0.002236f, + +0.003684f, +0.001801f, +0.002954f, -0.002953f, -0.005282f, +0.002816f, -0.001399f, -0.000978f, -0.001258f, -0.001459f, + -0.000488f, +0.005061f, -0.002808f, +0.002085f, +0.001886f, +0.001369f, -0.002519f, +0.001565f, +0.004198f, -0.000373f, + -0.000107f, -0.000478f, -0.002315f, -0.000896f, +0.000418f, -0.000450f, -0.001704f, +0.001939f, -0.000149f, -0.001301f, + +0.001422f, -0.000727f, +0.001142f, -0.000989f, -0.001958f, -0.001381f, -0.001372f, -0.000200f, -0.001260f, -0.000819f, + +0.001064f, -0.000566f, -0.000640f, +0.000130f, +0.001055f, -0.000001f, +0.000452f, +0.000526f, -0.000770f, -0.000216f, + +0.000142f, -0.000084f, -0.001012f, -0.000437f, -0.000027f, -0.000146f + } + }, + { + { + +0.004532f, -0.024388f, -0.034052f, -0.025947f, +0.012969f, -0.003678f, +0.002419f, +0.003564f, +0.003506f, -0.000776f, + +0.002931f, -0.009335f, -0.002382f, +0.005692f, -0.000285f, +0.006613f, -0.005152f, +0.000511f, -0.003536f, -0.011528f, + +0.002928f, -0.001939f, +0.005146f, +0.001796f, +0.007851f, -0.000462f, -0.006621f, +0.001577f, +0.003772f, -0.000206f, + +0.004582f, +0.003631f, -0.003100f, -0.001222f, +0.003827f, +0.001729f, +0.008268f, +0.004012f, +0.000918f, +0.002132f, + -0.003807f, -0.000653f, -0.004462f, -0.004840f, +0.000492f, -0.000374f, -0.004708f, +0.001537f, -0.000678f, -0.001906f, + +0.000733f, -0.000548f, +0.001066f, +0.001670f, -0.001337f, -0.000588f, +0.001986f, +0.000934f, +0.004628f, +0.001366f, + +0.000403f, +0.002072f, +0.000655f, -0.000394f, +0.000065f, -0.001009f, +0.001052f, +0.001869f, -0.000431f, +0.002427f, + +0.000709f, -0.000347f, +0.001301f, -0.001429f, -0.001393f, -0.000658f, +0.000221f, -0.000553f, +0.000146f, +0.000065f, + -0.000699f, -0.000210f, +0.001133f, -0.000029f, +0.000464f, +0.000325f, -0.000589f, +0.000175f, +0.000510f, +0.000248f, + +0.000596f, -0.000139f, -0.000365f, +0.000050f, -0.000504f, +0.000321f + }, + { + +0.000187f, +0.019495f, -0.011470f, +0.023340f, -0.018435f, +0.001857f, +0.003971f, -0.002540f, +0.005086f, -0.004176f, + +0.004582f, -0.004698f, -0.005169f, +0.005548f, -0.007129f, +0.017327f, +0.010324f, -0.004170f, +0.001268f, +0.009082f, + +0.002396f, +0.008488f, -0.005593f, -0.011616f, -0.009035f, +0.008787f, +0.003193f, -0.001527f, -0.003147f, +0.004405f, + +0.002396f, -0.008597f, +0.005289f, -0.011204f, +0.001397f, +0.008905f, -0.000038f, -0.000903f, +0.002051f, +0.000359f, + +0.001157f, -0.004763f, -0.001727f, +0.002920f, -0.004286f, -0.004390f, -0.000077f, -0.000222f, -0.004293f, -0.002790f, + +0.000061f, -0.000857f, +0.000246f, -0.000496f, -0.002333f, -0.000196f, +0.001416f, -0.000776f, +0.000695f, -0.002311f, + +0.001193f, -0.001172f, -0.000717f, +0.003187f, +0.000916f, -0.000176f, +0.000067f, +0.000296f, -0.000550f, -0.000064f, + -0.000868f, +0.000591f, +0.001126f, +0.000240f, -0.000333f, +0.001289f, -0.000171f, +0.000041f, +0.000329f, +0.000493f, + -0.001268f, +0.001394f, +0.000172f, +0.000654f, +0.000168f, -0.000073f, -0.000194f, -0.001000f, -0.000277f, -0.000233f, + +0.000641f, +0.000132f, +0.000230f, -0.000636f, -0.000412f, -0.000029f + }, + { + +0.002222f, +0.025827f, +0.012668f, +0.061723f, -0.020337f, +0.001981f, -0.000258f, -0.001368f, -0.000412f, +0.002478f, + +0.002593f, +0.004350f, +0.000498f, +0.007439f, -0.001849f, -0.014517f, -0.001622f, -0.003900f, +0.004391f, -0.005886f, + +0.004258f, -0.017117f, +0.010644f, +0.005900f, +0.006418f, +0.010167f, -0.003325f, -0.001559f, +0.002897f, +0.009135f, + +0.000780f, +0.005763f, -0.003377f, -0.011016f, -0.002106f, +0.003794f, -0.000739f, +0.000229f, -0.001564f, -0.000298f, + +0.000509f, +0.004207f, +0.000882f, -0.002458f, -0.000647f, -0.004141f, +0.002144f, +0.000786f, -0.000512f, -0.000137f, + -0.002827f, +0.001040f, -0.000669f, +0.000373f, -0.000674f, +0.002646f, -0.002328f, +0.001842f, +0.001912f, +0.002166f, + -0.001941f, -0.001363f, -0.002964f, +0.001989f, -0.001543f, +0.000199f, +0.000489f, +0.001189f, -0.000301f, -0.002973f, + -0.000651f, +0.000068f, -0.000250f, +0.000539f, -0.000026f, -0.000374f, +0.000651f, -0.000246f, -0.000533f, +0.000190f, + -0.000217f, -0.000526f, +0.000021f, +0.000622f, +0.000081f, -0.000051f, -0.000242f, -0.000396f, +0.000500f, +0.000136f, + -0.000280f, +0.000935f, -0.000278f, -0.000467f, +0.000012f, -0.000855f + }, + { + +0.024619f, -0.058431f, -0.003858f, -0.007664f, -0.008863f, -0.000240f, -0.001740f, +0.000721f, +0.002766f, +0.001686f, + +0.012835f, -0.006807f, +0.003842f, +0.002168f, +0.013678f, +0.001551f, -0.003339f, -0.006345f, -0.002060f, -0.000966f, + +0.003122f, -0.005077f, +0.008100f, +0.001104f, -0.004936f, +0.003815f, -0.004791f, -0.003450f, -0.002462f, -0.001452f, + +0.000607f, -0.000631f, -0.000522f, -0.000023f, +0.004062f, +0.002603f, +0.002864f, -0.000628f, -0.003158f, +0.000236f, + +0.002224f, -0.000634f, +0.001807f, -0.006057f, +0.002537f, +0.006518f, -0.002934f, -0.003379f, +0.000190f, -0.003597f, + -0.000555f, +0.001316f, +0.001163f, -0.003025f, -0.002539f, +0.001222f, +0.000317f, -0.001770f, +0.000285f, +0.000190f, + +0.000088f, +0.000886f, -0.000648f, +0.002245f, +0.000309f, -0.000935f, +0.000792f, +0.000243f, +0.000685f, +0.002036f, + +0.001884f, -0.000023f, -0.000519f, -0.000705f, -0.000660f, -0.000869f, -0.000715f, +0.000206f, -0.000202f, -0.000325f, + -0.000305f, -0.000138f, +0.000430f, -0.000328f, -0.000300f, +0.000747f, -0.000184f, +0.000035f, -0.000322f, +0.000260f, + -0.000504f, +0.000484f, -0.000173f, -0.000739f, -0.000183f, +0.000004f + }, + { + -0.003012f, -0.037874f, +0.013204f, +0.004246f, -0.000871f, +0.000009f, +0.000215f, -0.002260f, +0.001564f, +0.002004f, + -0.001514f, +0.010176f, -0.007255f, -0.001129f, +0.004918f, +0.009185f, +0.015281f, +0.008751f, -0.014205f, -0.008334f, + +0.001460f, +0.008650f, +0.018403f, +0.006750f, -0.002951f, +0.017835f, +0.003979f, -0.004264f, +0.007300f, -0.008418f, + -0.000139f, +0.004093f, -0.002318f, +0.001530f, +0.010714f, +0.000847f, -0.002133f, -0.004340f, +0.000677f, +0.007034f, + +0.001341f, +0.003880f, +0.002411f, +0.000827f, +0.001778f, -0.002189f, +0.001703f, +0.001345f, +0.000505f, +0.001113f, + +0.002981f, -0.000462f, -0.000503f, -0.001485f, +0.000579f, +0.000553f, +0.001705f, -0.001618f, -0.002497f, -0.001179f, + +0.001867f, -0.002355f, +0.000181f, +0.000668f, -0.000836f, -0.001831f, -0.001025f, -0.000477f, -0.001272f, -0.000068f, + -0.000091f, -0.001371f, +0.000824f, +0.000351f, +0.000698f, +0.000198f, -0.000104f, -0.000739f, -0.000073f, -0.000420f, + +0.000919f, +0.000367f, +0.001753f, +0.000387f, +0.000319f, -0.000604f, -0.000916f, -0.000231f, +0.000353f, -0.000277f, + +0.000785f, +0.000962f, +0.000409f, +0.000015f, +0.000129f, -0.000473f + }, + { + +0.039289f, -0.124408f, -0.005885f, +0.076218f, +0.003203f, -0.002752f, +0.008655f, -0.000206f, +0.010722f, +0.008622f, + -0.004959f, -0.001218f, +0.001206f, -0.000017f, -0.006845f, -0.003874f, +0.001379f, -0.005596f, +0.004367f, -0.008536f, + -0.005610f, -0.002430f, +0.003856f, -0.001593f, -0.001648f, -0.003079f, +0.005016f, +0.002550f, +0.004254f, -0.003040f, + -0.002115f, -0.000404f, -0.006735f, +0.000516f, -0.004498f, -0.003105f, -0.004550f, +0.001177f, -0.003687f, -0.001559f, + +0.000975f, +0.000277f, -0.000395f, +0.007220f, +0.001280f, +0.000682f, -0.001355f, -0.002985f, -0.003144f, +0.001403f, + -0.000116f, +0.005977f, -0.003202f, +0.004465f, -0.001315f, -0.000945f, -0.002782f, -0.001009f, +0.000010f, +0.000652f, + +0.002630f, +0.001546f, -0.001489f, -0.001161f, -0.000160f, +0.001146f, -0.000354f, +0.000912f, +0.000730f, +0.002521f, + +0.000019f, -0.001399f, +0.000477f, +0.000490f, -0.000184f, +0.000185f, -0.000433f, -0.000799f, +0.000073f, -0.000371f, + +0.001053f, -0.000128f, +0.000678f, -0.000122f, -0.000870f, -0.000260f, -0.000276f, -0.000007f, +0.000690f, -0.000585f, + -0.001112f, -0.000023f, -0.000172f, +0.000431f, +0.000040f, -0.000585f + }, + { + +0.000220f, -0.009689f, -0.019100f, -0.000425f, +0.002152f, -0.000485f, -0.000207f, +0.002287f, -0.002570f, -0.003753f, + +0.004998f, -0.004263f, -0.010376f, +0.010728f, -0.002201f, +0.013085f, -0.018670f, +0.014974f, +0.009734f, -0.027433f, + +0.002185f, -0.012060f, +0.011562f, +0.023090f, +0.017063f, -0.010763f, -0.017709f, +0.008834f, +0.007932f, +0.005548f, + +0.017093f, -0.002763f, +0.011719f, +0.007083f, +0.006036f, -0.008416f, +0.002160f, +0.003194f, -0.001263f, -0.008253f, + -0.004229f, +0.000337f, +0.000100f, +0.000313f, +0.000874f, +0.000119f, -0.000530f, +0.001139f, +0.002453f, -0.001711f, + -0.000964f, -0.001956f, +0.001536f, -0.000423f, +0.000599f, -0.000207f, -0.005217f, +0.000447f, -0.000319f, -0.000806f, + -0.000384f, -0.000332f, -0.002372f, -0.001141f, -0.001770f, -0.000566f, -0.000816f, +0.000789f, -0.001901f, +0.000771f, + +0.000778f, -0.000341f, +0.000528f, +0.001288f, -0.000163f, +0.000260f, -0.000213f, -0.000681f, -0.000251f, -0.001236f, + +0.001073f, -0.000377f, -0.000133f, -0.000719f, +0.000342f, -0.000241f, -0.000268f, +0.000536f, +0.000552f, +0.000502f, + +0.000044f, +0.000256f, +0.000098f, +0.000496f, +0.000031f, -0.000149f + }, + { + -0.010046f, +0.245658f, +0.015848f, -0.065593f, +0.012863f, +0.003768f, +0.007119f, -0.006490f, -0.003440f, -0.004759f, + -0.000593f, +0.009227f, -0.001087f, -0.001073f, -0.004427f, +0.006491f, +0.003118f, +0.005318f, +0.011004f, -0.003394f, + -0.001698f, -0.006673f, +0.000020f, -0.002885f, +0.001044f, +0.002901f, +0.004333f, +0.009137f, +0.004962f, -0.005832f, + +0.000211f, +0.001529f, +0.007188f, -0.004679f, +0.003596f, +0.002570f, -0.000126f, -0.000945f, -0.004402f, -0.005342f, + +0.000216f, -0.002659f, -0.002809f, -0.001483f, -0.000485f, +0.000470f, +0.001634f, +0.003047f, +0.002319f, -0.000391f, + +0.001423f, +0.001311f, +0.006344f, -0.000850f, +0.001036f, +0.001277f, +0.001614f, -0.000340f, -0.000385f, -0.003709f, + +0.002958f, -0.000712f, -0.001356f, -0.001524f, -0.000563f, -0.000847f, -0.000576f, +0.000123f, -0.001228f, -0.000908f, + +0.000660f, +0.000042f, -0.000001f, +0.000624f, -0.000010f, +0.001691f, +0.000483f, +0.000490f, +0.000768f, +0.000382f, + -0.000492f, +0.000388f, +0.000032f, -0.000864f, +0.000760f, +0.000351f, -0.000344f, -0.000203f, +0.000619f, -0.000155f, + -0.000854f, -0.000647f, +0.000540f, -0.000674f, -0.000724f, +0.000836f + }, + { + +0.000003f, -0.005310f, -0.009469f, -0.001228f, +0.000185f, -0.000721f, +0.001029f, +0.002385f, -0.000714f, -0.001650f, + +0.000724f, -0.001552f, +0.002887f, +0.002124f, +0.011266f, -0.005131f, -0.002224f, +0.018440f, +0.009977f, +0.003225f, + +0.006560f, -0.005380f, +0.004281f, -0.001252f, -0.006675f, +0.007197f, +0.019581f, -0.003185f, -0.001186f, +0.003377f, + -0.002625f, +0.003656f, -0.000970f, +0.000459f, -0.007065f, -0.004836f, -0.008100f, +0.000023f, +0.000572f, -0.002270f, + -0.004552f, +0.000473f, +0.001379f, -0.004975f, -0.001510f, -0.001218f, +0.003698f, +0.005160f, +0.000306f, -0.000935f, + -0.001598f, +0.002917f, -0.001666f, +0.001616f, +0.000719f, -0.000219f, +0.001659f, +0.001345f, -0.003049f, -0.000760f, + -0.000102f, +0.000250f, +0.001927f, +0.001341f, +0.000432f, +0.000226f, +0.001460f, +0.000494f, +0.000843f, -0.000176f, + +0.001478f, -0.000033f, -0.001212f, +0.000997f, +0.001136f, -0.000468f, +0.000172f, +0.000159f, -0.000446f, +0.000636f, + -0.000685f, +0.001683f, -0.000620f, +0.000046f, -0.000390f, +0.000053f, -0.000204f, -0.000798f, +0.000316f, -0.000708f, + -0.000472f, -0.000292f, +0.000225f, -0.000361f, -0.000048f, -0.000228f + }, + { + -0.021440f, -0.187661f, -0.003975f, +0.005253f, +0.007036f, -0.009081f, +0.009510f, +0.002919f, -0.006896f, -0.000792f, + +0.005804f, -0.003168f, +0.004736f, +0.007620f, +0.004249f, +0.007741f, +0.001038f, -0.005755f, -0.003390f, +0.003052f, + -0.008442f, -0.001851f, -0.005407f, +0.003438f, +0.002907f, +0.001638f, +0.002681f, -0.002322f, +0.002675f, +0.001777f, + +0.005416f, -0.005694f, -0.005754f, -0.000966f, +0.002207f, -0.001104f, +0.000929f, +0.004681f, +0.004139f, +0.000224f, + -0.004264f, -0.001996f, -0.000893f, -0.003292f, +0.002459f, +0.000671f, -0.004660f, -0.000499f, -0.001075f, -0.004264f, + -0.004057f, +0.000271f, -0.002477f, +0.001105f, -0.001214f, -0.000558f, -0.001287f, -0.003612f, +0.002463f, -0.000015f, + -0.002827f, -0.000112f, -0.001536f, -0.000733f, +0.001608f, -0.000143f, -0.000204f, -0.001518f, +0.000299f, +0.002102f, + -0.000983f, +0.000498f, -0.000988f, +0.001094f, -0.000364f, -0.000500f, +0.000151f, -0.000301f, +0.000629f, +0.000205f, + +0.000917f, +0.000829f, -0.001257f, -0.001055f, -0.000493f, -0.000403f, -0.000841f, +0.000176f, -0.000889f, -0.000311f, + -0.000100f, +0.000261f, -0.000577f, -0.000062f, +0.000277f, +0.000321f + }, + { + -0.003127f, +0.016299f, +0.001266f, +0.020219f, -0.001658f, +0.001006f, +0.008952f, -0.004361f, -0.002967f, -0.003562f, + +0.000006f, +0.013999f, +0.003365f, -0.001932f, -0.015596f, -0.004755f, +0.011581f, -0.002636f, +0.012098f, +0.005894f, + +0.016015f, -0.006008f, -0.000148f, -0.004494f, -0.005984f, +0.013398f, -0.002740f, +0.003557f, -0.003721f, +0.004769f, + +0.000209f, -0.003843f, -0.008000f, +0.002730f, +0.002401f, -0.000579f, +0.001266f, +0.002287f, +0.002701f, +0.004213f, + +0.001356f, +0.006972f, -0.002031f, +0.004122f, -0.001959f, +0.002877f, -0.000439f, -0.001654f, +0.000080f, -0.005038f, + +0.001158f, +0.001222f, +0.001886f, -0.002332f, +0.001342f, -0.001206f, -0.002379f, -0.000430f, +0.000455f, -0.001703f, + -0.001289f, -0.001494f, -0.000259f, -0.001311f, -0.000039f, -0.001276f, -0.000627f, -0.000542f, -0.000972f, +0.000066f, + +0.001788f, +0.001927f, +0.001171f, -0.000209f, -0.000870f, +0.001014f, -0.000854f, -0.000526f, -0.000982f, +0.000053f, + +0.000119f, -0.000222f, +0.000633f, +0.000057f, +0.000279f, -0.001173f, -0.000251f, +0.000968f, +0.000502f, +0.001028f, + +0.000143f, +0.000520f, +0.000243f, +0.000238f, -0.000711f, -0.000144f + }, + { + -0.054846f, +0.261844f, +0.010285f, -0.005467f, -0.023799f, +0.042705f, +0.032403f, -0.006098f, +0.003855f, -0.007207f, + +0.002346f, +0.003350f, +0.003652f, +0.002562f, -0.010125f, +0.000305f, -0.003081f, +0.005609f, +0.001004f, +0.000329f, + +0.016856f, -0.002799f, +0.002297f, -0.002685f, -0.004049f, -0.005610f, +0.010176f, -0.003495f, -0.002537f, -0.005735f, + +0.000234f, +0.000923f, +0.000159f, +0.007096f, +0.000729f, +0.006854f, -0.003741f, +0.004862f, +0.006286f, -0.001961f, + -0.002768f, +0.001620f, +0.000512f, +0.004532f, +0.001301f, +0.003007f, -0.001712f, +0.005235f, +0.002010f, +0.002168f, + -0.001107f, +0.000770f, +0.000065f, -0.004932f, +0.000702f, +0.000920f, -0.001636f, +0.000912f, +0.001987f, +0.002502f, + -0.002443f, +0.002656f, +0.000734f, -0.001795f, -0.000024f, -0.000155f, -0.000707f, +0.000306f, -0.000369f, -0.001003f, + +0.000790f, -0.000561f, +0.000778f, +0.000337f, -0.000074f, -0.000401f, -0.001199f, -0.000383f, -0.000165f, +0.000131f, + +0.000518f, -0.000846f, +0.000725f, +0.000016f, +0.000579f, +0.000012f, -0.000300f, -0.000187f, -0.000342f, -0.000713f, + +0.000434f, -0.000306f, +0.000160f, +0.000291f, +0.000056f, +0.000120f + }, + { + -0.001218f, -0.061391f, +0.013208f, +0.007741f, -0.000758f, -0.006311f, -0.003028f, +0.002970f, +0.005752f, -0.001516f, + +0.006256f, -0.004353f, -0.002468f, -0.009740f, -0.012181f, +0.000539f, +0.007690f, +0.005542f, +0.002289f, -0.004760f, + +0.024822f, +0.002316f, -0.008916f, -0.008895f, -0.026823f, +0.017551f, -0.014829f, -0.012417f, -0.009577f, -0.004894f, + -0.002109f, +0.006063f, -0.004302f, -0.005549f, +0.000205f, +0.004847f, -0.007415f, -0.001906f, +0.003362f, +0.001086f, + -0.002882f, -0.005069f, -0.004736f, -0.004069f, -0.000147f, -0.001028f, -0.003847f, +0.000259f, -0.001409f, -0.001991f, + +0.000095f, +0.002009f, -0.000901f, +0.002818f, +0.000524f, -0.000847f, -0.000685f, -0.000476f, -0.001368f, +0.004671f, + -0.002855f, +0.000211f, -0.001946f, +0.001258f, +0.000314f, -0.000128f, +0.000091f, +0.004565f, +0.000732f, +0.001793f, + +0.000448f, +0.001219f, +0.000233f, -0.000655f, -0.000924f, -0.001187f, +0.000708f, -0.000268f, +0.000686f, +0.000481f, + -0.000193f, +0.000991f, -0.000396f, -0.000577f, -0.000712f, -0.001694f, -0.000167f, +0.000797f, +0.000038f, -0.000176f, + -0.000555f, +0.000491f, +0.000055f, +0.000533f, +0.000894f, -0.000440f + }, + { + -0.049074f, -0.047338f, -0.000247f, -0.003890f, -0.007763f, +0.016108f, +0.001659f, +0.002867f, -0.008073f, -0.004452f, + -0.005465f, -0.001020f, +0.006763f, +0.007007f, -0.029564f, +0.004271f, +0.003139f, -0.000373f, -0.003756f, -0.005714f, + -0.001628f, -0.005605f, -0.003806f, -0.006891f, -0.001295f, -0.005962f, +0.007455f, -0.004969f, +0.004540f, +0.006837f, + +0.005111f, -0.007012f, +0.000796f, -0.002387f, +0.001274f, -0.008341f, -0.000339f, +0.004690f, -0.001340f, +0.000303f, + +0.001337f, +0.001739f, -0.005018f, -0.000957f, -0.003362f, +0.004487f, +0.004242f, +0.002724f, +0.004823f, -0.000842f, + +0.002889f, -0.000025f, +0.001990f, +0.001944f, +0.001169f, +0.003237f, -0.002904f, +0.000561f, -0.000439f, +0.002647f, + +0.000326f, -0.000044f, +0.000373f, -0.001766f, +0.000481f, +0.001394f, +0.000227f, -0.001250f, +0.001022f, -0.001548f, + +0.001774f, -0.000195f, +0.000559f, +0.000868f, +0.001704f, +0.000476f, -0.000126f, -0.000049f, +0.000710f, +0.001039f, + +0.000016f, +0.000314f, -0.000373f, -0.000475f, +0.000640f, -0.000144f, -0.000221f, -0.001060f, +0.000206f, +0.000644f, + +0.000380f, +0.000261f, -0.000174f, +0.000822f, +0.000337f, +0.000227f + }, + { + -0.002996f, -0.063796f, +0.002684f, -0.003696f, -0.001543f, -0.000072f, +0.001169f, +0.005259f, -0.002247f, +0.007628f, + +0.002119f, +0.006310f, +0.009528f, -0.006885f, +0.037661f, -0.009698f, -0.002049f, -0.007829f, -0.002594f, -0.003695f, + +0.005857f, +0.000829f, +0.006073f, -0.010680f, -0.007677f, +0.007739f, +0.005677f, -0.007629f, +0.009370f, +0.011932f, + +0.007086f, +0.004156f, +0.005622f, -0.002691f, +0.007488f, +0.002019f, +0.001401f, -0.003344f, -0.001126f, -0.000647f, + +0.008371f, -0.006043f, -0.001695f, -0.000721f, +0.001381f, -0.001203f, -0.000300f, -0.002077f, -0.002346f, +0.001379f, + +0.001376f, -0.000268f, -0.001371f, +0.001718f, +0.003182f, +0.001845f, -0.002664f, +0.000033f, +0.001517f, -0.000572f, + +0.000692f, -0.001235f, -0.001403f, -0.001178f, -0.000860f, +0.000418f, -0.000275f, +0.001264f, -0.001400f, +0.000019f, + -0.000596f, +0.001047f, -0.001049f, -0.001722f, -0.002133f, -0.000825f, -0.000337f, -0.000868f, -0.001234f, -0.000887f, + +0.000872f, -0.000309f, +0.000176f, +0.001150f, +0.000183f, +0.000123f, +0.000032f, +0.000499f, +0.000048f, -0.000076f, + -0.000106f, -0.000275f, -0.000586f, -0.000593f, +0.000198f, -0.000447f + } + }, + { + { + -0.009573f, +0.028138f, +0.051364f, -0.046470f, -0.000473f, +0.000654f, -0.000862f, +0.001582f, +0.013750f, -0.000407f, + -0.009431f, -0.010719f, +0.000294f, -0.005653f, -0.009834f, +0.003757f, -0.004463f, +0.000358f, -0.000313f, -0.012984f, + +0.005238f, +0.001221f, +0.006144f, -0.002993f, +0.003566f, +0.002176f, -0.003935f, +0.003621f, +0.007648f, +0.000570f, + -0.001606f, +0.003687f, -0.001250f, -0.001617f, +0.005090f, -0.001822f, +0.002507f, +0.000651f, -0.003067f, +0.001444f, + -0.000288f, +0.001601f, -0.001711f, -0.000720f, +0.001032f, -0.001836f, -0.001329f, +0.003805f, +0.000228f, +0.001465f, + +0.000942f, -0.003347f, -0.001523f, +0.000398f, -0.003059f, -0.002672f, -0.000602f, -0.000554f, +0.003078f, +0.000135f, + -0.000472f, -0.000236f, -0.000136f, +0.000827f, -0.000018f, -0.001026f, -0.000654f, +0.000497f, -0.001591f, +0.001389f, + +0.000305f, -0.000410f, +0.001922f, -0.000540f, -0.000519f, +0.000275f, +0.001038f, -0.000737f, +0.000104f, -0.000211f, + -0.000117f, -0.000308f, +0.000728f, +0.000155f, +0.000129f, +0.000274f, -0.000147f, +0.000377f, +0.000021f, -0.000137f, + +0.000343f, +0.000345f, -0.000298f, -0.000029f, -0.000560f, +0.000049f + }, + { + +0.001919f, +0.030601f, +0.000142f, +0.032251f, -0.017484f, -0.001358f, +0.001246f, -0.002405f, +0.006843f, -0.002874f, + +0.003367f, -0.004479f, -0.006901f, +0.001394f, -0.013899f, +0.007489f, -0.003637f, -0.009211f, -0.007560f, +0.011231f, + -0.001909f, +0.002579f, -0.000672f, -0.001070f, -0.009313f, +0.006225f, +0.001231f, -0.000914f, -0.000589f, +0.003070f, + +0.001493f, -0.004799f, +0.011842f, -0.010142f, -0.003406f, +0.005111f, -0.000815f, -0.001772f, +0.004383f, +0.001658f, + +0.001776f, -0.000281f, +0.000704f, +0.004875f, -0.004778f, -0.005998f, +0.000820f, -0.001219f, -0.002908f, -0.000724f, + +0.002286f, +0.002212f, +0.002503f, -0.000532f, -0.001692f, +0.000028f, +0.000887f, -0.000004f, +0.000664f, -0.001002f, + +0.000358f, -0.001445f, +0.000572f, +0.002104f, +0.000153f, +0.000307f, +0.000322f, -0.000503f, -0.000716f, -0.000022f, + -0.001836f, -0.001097f, +0.000667f, +0.000187f, -0.000861f, -0.000059f, -0.001190f, -0.000168f, +0.000280f, +0.000555f, + -0.001726f, +0.000909f, -0.000082f, +0.000224f, +0.000116f, +0.000130f, +0.000093f, -0.001145f, -0.000001f, -0.000538f, + +0.000529f, -0.000010f, +0.000057f, +0.000090f, -0.000074f, +0.000251f + }, + { + -0.001016f, +0.024859f, +0.003012f, +0.040370f, -0.021431f, +0.008603f, +0.005065f, +0.002775f, -0.003053f, -0.002578f, + +0.001498f, +0.005082f, +0.002727f, +0.000946f, -0.002464f, +0.000587f, +0.008113f, +0.004196f, -0.004540f, -0.012774f, + +0.011390f, -0.005528f, +0.003596f, -0.003021f, -0.002336f, +0.005191f, -0.005472f, -0.002333f, -0.000101f, +0.007335f, + -0.005830f, -0.001367f, +0.000993f, -0.003726f, +0.000842f, +0.002579f, -0.000862f, -0.002002f, -0.001913f, +0.002156f, + +0.003561f, +0.007085f, +0.001549f, -0.001457f, +0.003580f, +0.001224f, +0.003639f, +0.001377f, +0.000659f, -0.000847f, + -0.001369f, +0.001384f, -0.001242f, +0.002463f, -0.000071f, +0.000027f, -0.003432f, +0.000969f, -0.000031f, +0.002718f, + -0.000448f, +0.000492f, -0.000785f, +0.003313f, -0.001249f, -0.001157f, -0.000603f, +0.000462f, -0.000602f, -0.001861f, + +0.001069f, +0.001333f, +0.000325f, +0.000897f, -0.000057f, -0.000342f, +0.000677f, +0.000481f, -0.000018f, +0.000569f, + -0.000645f, -0.000346f, -0.000389f, -0.000222f, +0.000031f, +0.000147f, -0.000468f, -0.000181f, +0.000581f, -0.000317f, + -0.000218f, +0.000986f, -0.000082f, -0.000180f, +0.000186f, -0.000775f + }, + { + +0.008734f, -0.045785f, +0.008836f, +0.004006f, +0.017489f, -0.000662f, -0.002292f, +0.004882f, +0.004536f, +0.000817f, + +0.005437f, -0.014735f, +0.013181f, +0.008251f, +0.010148f, -0.002869f, -0.006767f, -0.009407f, +0.000991f, +0.002349f, + +0.003112f, -0.006030f, +0.003623f, +0.002116f, -0.004338f, -0.000713f, -0.000128f, -0.001531f, -0.002056f, -0.000171f, + +0.005246f, +0.003393f, +0.001694f, -0.002345f, +0.004034f, +0.004711f, +0.005267f, +0.000149f, +0.000798f, -0.000226f, + +0.000637f, -0.000034f, -0.002356f, -0.005769f, +0.003812f, +0.002737f, -0.004610f, -0.002490f, +0.004238f, -0.000862f, + -0.000595f, +0.000357f, +0.001022f, -0.001725f, +0.000256f, +0.001995f, -0.000497f, -0.002165f, -0.000332f, +0.000104f, + -0.001515f, -0.000727f, -0.001526f, +0.003190f, +0.000272f, -0.000340f, +0.000576f, +0.000729f, +0.000872f, +0.001421f, + +0.000243f, -0.000378f, +0.001073f, +0.000677f, -0.000492f, -0.000364f, -0.000273f, -0.000604f, +0.000109f, +0.000875f, + +0.000193f, -0.000162f, +0.000078f, -0.000347f, -0.000368f, +0.000241f, -0.000430f, -0.000304f, -0.000440f, +0.000731f, + -0.000656f, -0.000233f, -0.000424f, -0.000315f, -0.000285f, -0.000336f + }, + { + +0.001257f, -0.051896f, +0.000252f, +0.003433f, -0.002364f, +0.000524f, -0.002126f, -0.005228f, +0.001205f, -0.000344f, + -0.002301f, +0.007207f, -0.015070f, -0.001446f, +0.007645f, -0.003301f, -0.011744f, +0.019360f, -0.012049f, -0.014045f, + -0.006932f, -0.005385f, -0.000330f, +0.001841f, -0.001890f, +0.018520f, -0.001808f, -0.007999f, -0.002060f, -0.006315f, + -0.004521f, -0.005804f, -0.006016f, +0.000659f, +0.002733f, -0.010308f, -0.008308f, -0.000799f, -0.001772f, +0.001757f, + -0.000683f, +0.001678f, +0.000170f, -0.001766f, -0.002018f, -0.003492f, -0.001255f, -0.000772f, +0.000254f, +0.000483f, + +0.002651f, -0.001075f, -0.000102f, -0.002602f, -0.000562f, -0.000156f, +0.001605f, -0.000002f, -0.001961f, -0.000309f, + +0.001280f, -0.002871f, +0.000228f, -0.000170f, +0.001168f, -0.001040f, -0.001191f, -0.000823f, -0.001938f, +0.000375f, + +0.000530f, +0.000510f, +0.001038f, +0.000412f, +0.000361f, +0.000095f, -0.000767f, -0.000399f, +0.000147f, -0.000474f, + +0.000583f, -0.000696f, +0.000586f, +0.000112f, +0.000358f, +0.000041f, -0.000733f, -0.000050f, +0.000177f, -0.000401f, + +0.001036f, +0.000746f, +0.000230f, +0.000314f, +0.000327f, +0.000363f + }, + { + +0.004928f, -0.161832f, +0.012771f, +0.072672f, -0.011893f, -0.005378f, -0.000189f, -0.016882f, +0.001418f, +0.008276f, + -0.004747f, -0.003194f, +0.000634f, -0.006601f, -0.009260f, +0.001385f, +0.007707f, -0.001985f, +0.003083f, -0.003182f, + +0.004108f, +0.005462f, +0.004200f, -0.005070f, -0.004490f, -0.003042f, +0.005045f, -0.002232f, +0.000968f, +0.002503f, + +0.004153f, +0.001982f, -0.006522f, +0.002433f, +0.000762f, +0.000461f, -0.004069f, -0.001753f, +0.000554f, +0.002713f, + -0.003728f, -0.002238f, -0.000805f, +0.003801f, -0.000285f, +0.001167f, +0.002303f, +0.001619f, +0.001350f, +0.003871f, + -0.005928f, +0.000816f, -0.003675f, +0.004354f, -0.003610f, +0.001297f, -0.001837f, -0.000411f, +0.000666f, +0.000413f, + +0.000513f, +0.000261f, -0.000498f, -0.000091f, +0.000826f, +0.001811f, -0.000414f, +0.000123f, +0.000025f, +0.001059f, + -0.000256f, -0.000565f, -0.000780f, +0.000875f, -0.000108f, +0.000541f, -0.000045f, -0.000547f, +0.000607f, -0.000513f, + +0.000190f, -0.000737f, +0.000440f, +0.000558f, -0.000188f, +0.000207f, -0.000213f, +0.000094f, +0.000432f, +0.000149f, + -0.000480f, +0.000085f, -0.000104f, +0.000266f, +0.000298f, -0.000054f + }, + { + +0.000310f, +0.013849f, -0.002207f, -0.001768f, -0.000169f, +0.000081f, -0.000324f, +0.000644f, -0.004359f, -0.003742f, + +0.003998f, -0.003316f, -0.005953f, +0.006460f, -0.001141f, +0.022848f, -0.020011f, +0.003581f, -0.001817f, -0.025509f, + +0.014513f, +0.001588f, +0.027027f, +0.009754f, -0.012046f, -0.022966f, -0.009184f, +0.008424f, -0.000963f, -0.002606f, + +0.009857f, -0.008111f, +0.003979f, -0.001261f, +0.006138f, -0.001678f, +0.000262f, -0.002906f, -0.003390f, -0.003076f, + -0.000954f, -0.002824f, -0.002239f, +0.001858f, +0.002292f, +0.002523f, +0.000540f, -0.001839f, -0.000769f, -0.001680f, + +0.001877f, -0.000974f, +0.001166f, -0.000442f, -0.000058f, +0.002618f, -0.001220f, +0.001933f, +0.001365f, +0.000711f, + +0.000183f, -0.000263f, -0.000063f, +0.001666f, -0.001902f, -0.001649f, +0.000254f, +0.003750f, -0.001517f, -0.001179f, + -0.000905f, -0.000604f, +0.000777f, +0.000012f, -0.000184f, +0.000644f, +0.000274f, +0.000006f, +0.000087f, -0.000992f, + +0.000719f, -0.000864f, -0.000035f, -0.000389f, +0.000586f, +0.000114f, -0.000038f, +0.000545f, +0.000153f, -0.000242f, + +0.000336f, +0.000403f, +0.000023f, +0.000210f, -0.000400f, -0.000147f + }, + { + -0.024867f, +0.183848f, +0.000171f, -0.076135f, -0.007211f, -0.003480f, +0.000953f, -0.005109f, -0.000948f, -0.003842f, + -0.006056f, +0.009641f, +0.007566f, -0.006801f, -0.003274f, +0.002643f, -0.001605f, -0.004400f, +0.007852f, +0.001588f, + +0.001157f, -0.003222f, -0.001146f, -0.006017f, -0.005547f, -0.000112f, +0.001167f, +0.003442f, +0.003413f, -0.004382f, + -0.004539f, -0.003672f, +0.005261f, -0.004727f, +0.005165f, -0.002091f, -0.002644f, -0.001325f, -0.005373f, -0.004618f, + -0.000876f, +0.000396f, -0.001658f, -0.003202f, +0.000156f, -0.001198f, -0.002024f, -0.003215f, +0.000611f, -0.000135f, + +0.000874f, -0.003143f, +0.001414f, -0.001483f, +0.001341f, +0.001356f, -0.000618f, -0.002891f, -0.000167f, -0.002649f, + +0.002264f, +0.000113f, +0.000540f, -0.000385f, +0.000139f, -0.000632f, -0.000684f, -0.000207f, -0.000258f, +0.000861f, + +0.001033f, -0.000163f, -0.000039f, +0.000371f, -0.000744f, +0.000364f, -0.000003f, +0.000099f, +0.000569f, +0.000153f, + -0.000889f, -0.000004f, -0.000154f, -0.000442f, +0.000658f, +0.000010f, +0.000771f, +0.000385f, -0.000307f, -0.000398f, + -0.000668f, -0.000248f, +0.000601f, -0.000262f, -0.000196f, +0.000497f + }, + { + +0.001366f, +0.005065f, -0.002965f, +0.004115f, +0.001690f, +0.000112f, -0.001091f, +0.002391f, +0.002190f, -0.002005f, + -0.001930f, +0.000727f, +0.001682f, +0.001792f, -0.004813f, +0.005795f, -0.009607f, -0.009328f, -0.000282f, -0.007274f, + -0.005470f, -0.003472f, -0.006496f, -0.016983f, -0.004468f, -0.009141f, -0.004092f, -0.006930f, +0.002602f, -0.002906f, + -0.010094f, +0.000584f, +0.000155f, +0.001820f, -0.001866f, +0.005457f, +0.002708f, +0.005819f, +0.000633f, -0.000286f, + -0.002120f, +0.004005f, +0.004372f, -0.002791f, -0.000239f, -0.001629f, +0.002917f, +0.000358f, -0.000564f, +0.000530f, + -0.002468f, +0.002228f, -0.001075f, +0.000941f, +0.001050f, +0.002018f, +0.000620f, +0.000445f, -0.000153f, +0.002012f, + +0.000878f, -0.000910f, +0.000923f, -0.000983f, -0.000776f, -0.000573f, +0.000058f, -0.001015f, -0.000469f, -0.000904f, + +0.000879f, -0.000496f, +0.000421f, +0.002537f, +0.000626f, -0.000700f, -0.000536f, -0.000431f, -0.000004f, +0.001240f, + -0.000732f, +0.001066f, -0.000969f, -0.000018f, -0.000267f, +0.000093f, +0.000270f, -0.000632f, +0.000253f, -0.000030f, + +0.000103f, -0.000502f, +0.000082f, -0.000267f, +0.000172f, -0.000142f + }, + { + +0.022031f, -0.179811f, -0.039095f, +0.001843f, +0.000474f, -0.020823f, -0.014768f, -0.004390f, -0.011037f, -0.000646f, + +0.005243f, -0.001362f, -0.002356f, -0.006143f, +0.002789f, +0.005941f, -0.004916f, -0.006518f, +0.001626f, -0.010205f, + -0.014408f, +0.001764f, -0.000756f, -0.002606f, -0.000502f, -0.001759f, +0.004525f, +0.002057f, +0.003954f, -0.000706f, + +0.007217f, -0.000014f, -0.001314f, +0.004278f, +0.002338f, -0.005075f, +0.002680f, +0.001805f, +0.000973f, +0.005818f, + -0.002296f, +0.000205f, +0.005795f, -0.002446f, +0.002181f, +0.004507f, -0.003043f, -0.000144f, -0.001185f, -0.001808f, + -0.005905f, +0.000547f, +0.001898f, +0.004381f, -0.002466f, +0.000341f, +0.002413f, -0.001133f, +0.004638f, -0.000460f, + -0.003330f, +0.000777f, -0.000677f, -0.001739f, +0.000257f, -0.001162f, +0.000286f, +0.000181f, +0.000660f, +0.002234f, + -0.001144f, +0.000865f, -0.000058f, +0.000253f, -0.000913f, -0.001037f, +0.000556f, -0.000122f, +0.000273f, -0.001346f, + -0.000761f, +0.000416f, -0.001147f, -0.000940f, -0.000833f, +0.000090f, -0.001087f, -0.000300f, -0.000153f, +0.000648f, + +0.000375f, +0.000261f, -0.000223f, +0.000504f, +0.000443f, +0.000035f + }, + { + +0.002413f, +0.018045f, +0.001427f, +0.015938f, -0.005440f, -0.002082f, +0.005203f, -0.004871f, +0.003859f, -0.002329f, + +0.002083f, +0.003483f, +0.000946f, +0.002815f, -0.011543f, -0.011734f, -0.001806f, -0.004532f, +0.022089f, +0.008097f, + +0.016899f, -0.008197f, -0.000795f, +0.004731f, +0.000228f, +0.008897f, -0.007639f, -0.003345f, -0.007769f, -0.001571f, + -0.000780f, -0.005269f, -0.006158f, +0.005104f, +0.002133f, -0.003522f, +0.001551f, +0.000641f, -0.003858f, +0.000459f, + -0.002764f, +0.001949f, -0.004838f, +0.004745f, -0.002714f, +0.000584f, +0.001135f, +0.002465f, +0.002170f, -0.003273f, + +0.004792f, +0.000733f, +0.000346f, -0.001448f, +0.003237f, +0.000926f, +0.000687f, +0.001093f, -0.000579f, -0.002880f, + -0.001348f, -0.001218f, +0.001684f, -0.000478f, -0.000064f, -0.001889f, -0.000527f, +0.000117f, -0.001185f, -0.000699f, + +0.000040f, +0.000182f, -0.000457f, -0.000012f, -0.000457f, +0.001008f, -0.000679f, +0.000014f, -0.000067f, -0.000336f, + -0.000672f, -0.000675f, -0.000483f, -0.000561f, +0.000591f, +0.000400f, -0.000005f, +0.000400f, -0.000358f, +0.001001f, + -0.000087f, +0.000086f, +0.000070f, +0.000385f, -0.000366f, -0.000135f + }, + { + -0.009116f, +0.326240f, +0.005703f, +0.006837f, -0.022479f, -0.000990f, +0.002488f, -0.000464f, +0.013064f, +0.005807f, + +0.004117f, +0.004726f, +0.000368f, +0.004259f, +0.005548f, +0.007740f, -0.007036f, +0.001550f, -0.000167f, -0.010780f, + +0.009040f, -0.002682f, +0.004038f, -0.000200f, +0.004596f, -0.003061f, +0.005467f, -0.009329f, +0.000794f, +0.000956f, + +0.006891f, +0.002089f, -0.003945f, +0.009113f, +0.002120f, +0.005660f, -0.006168f, +0.001519f, +0.005201f, -0.006124f, + +0.001940f, +0.002149f, -0.002108f, +0.004153f, +0.003524f, +0.002417f, -0.004641f, +0.001510f, +0.001296f, +0.000347f, + -0.004363f, -0.000689f, +0.000055f, -0.006175f, -0.001169f, -0.002582f, -0.002139f, +0.000304f, +0.000195f, +0.003142f, + -0.001333f, +0.002295f, +0.000442f, -0.000759f, -0.001384f, -0.000683f, +0.000036f, +0.000264f, +0.000988f, -0.000130f, + +0.000158f, -0.000221f, +0.000307f, -0.000201f, +0.000376f, +0.000428f, -0.000587f, +0.000315f, -0.000449f, -0.000663f, + +0.000302f, -0.000488f, +0.000046f, -0.000772f, +0.000376f, -0.000720f, -0.000109f, -0.000018f, -0.000399f, +0.000024f, + +0.000753f, -0.000071f, -0.000048f, +0.000012f, -0.000056f, +0.000270f + }, + { + -0.000452f, -0.060967f, +0.013349f, -0.001775f, -0.002517f, -0.002187f, -0.002424f, -0.000244f, +0.002783f, -0.001303f, + +0.005036f, -0.004672f, -0.002606f, -0.016425f, -0.019856f, -0.018637f, -0.001934f, -0.004732f, -0.004991f, +0.000440f, + +0.007926f, -0.013845f, -0.008431f, +0.018263f, +0.004869f, +0.020316f, -0.013141f, +0.008266f, +0.002116f, +0.007102f, + +0.003847f, +0.006206f, -0.001463f, -0.005263f, -0.002439f, +0.004648f, -0.002897f, +0.002013f, +0.002496f, -0.004283f, + -0.002831f, -0.003225f, +0.002359f, +0.002888f, +0.002339f, +0.000191f, -0.002392f, +0.002773f, +0.000166f, -0.000165f, + +0.000928f, +0.002521f, -0.001714f, -0.000776f, -0.000519f, +0.001221f, -0.000513f, -0.001305f, -0.000662f, +0.005649f, + -0.001321f, +0.002748f, -0.000345f, +0.000878f, -0.000705f, -0.000380f, -0.002700f, +0.002553f, -0.000298f, +0.001100f, + -0.000969f, -0.000095f, +0.000271f, +0.000631f, +0.000254f, -0.000596f, +0.000339f, -0.000301f, +0.000530f, -0.000170f, + -0.001004f, +0.001159f, -0.000126f, +0.000171f, +0.000318f, -0.000826f, +0.000381f, +0.000338f, -0.000021f, +0.000433f, + -0.000150f, +0.000333f, -0.000669f, -0.000251f, +0.000634f, -0.000502f + }, + { + +0.039654f, +0.070903f, -0.008036f, -0.032754f, -0.028159f, +0.001114f, -0.004841f, +0.010379f, +0.002703f, +0.000558f, + -0.000183f, -0.001069f, +0.001827f, +0.021602f, -0.012199f, -0.003102f, -0.008348f, +0.000930f, -0.000906f, -0.008215f, + +0.007977f, +0.002923f, -0.003384f, -0.005150f, -0.001677f, -0.010652f, +0.003331f, -0.007575f, +0.002122f, +0.006100f, + +0.007032f, -0.002217f, +0.007577f, +0.002167f, +0.002932f, -0.008049f, -0.004290f, -0.002102f, -0.003524f, +0.004155f, + -0.000382f, +0.006135f, +0.000776f, -0.005217f, -0.006096f, +0.003771f, -0.000482f, -0.002925f, +0.002720f, -0.003277f, + -0.003085f, -0.002126f, +0.002994f, -0.000658f, -0.001082f, +0.000296f, -0.003059f, +0.001127f, -0.000585f, +0.001872f, + -0.001102f, -0.000177f, +0.000985f, -0.000870f, +0.002262f, +0.001779f, +0.000686f, -0.001427f, +0.000241f, -0.001097f, + +0.002216f, -0.000977f, +0.001222f, +0.000683f, +0.000806f, +0.000213f, +0.000174f, -0.000920f, +0.000259f, +0.001482f, + +0.000526f, +0.000214f, -0.000004f, -0.000374f, +0.000079f, -0.000019f, +0.000233f, -0.000911f, +0.000825f, +0.000687f, + -0.000023f, -0.000063f, -0.000030f, +0.000133f, -0.000500f, +0.000020f + }, + { + +0.001253f, -0.070687f, -0.006014f, +0.000428f, +0.000040f, -0.003613f, -0.000065f, +0.005369f, -0.003070f, +0.002699f, + -0.005098f, -0.005807f, -0.004179f, -0.007920f, +0.041137f, -0.017611f, -0.002911f, -0.004910f, -0.010480f, -0.016346f, + -0.014580f, -0.016043f, -0.000744f, -0.000978f, -0.007835f, +0.002143f, +0.001994f, +0.006197f, +0.011552f, +0.003741f, + +0.001683f, -0.000555f, +0.009304f, -0.001611f, +0.002321f, -0.000962f, -0.001676f, -0.005454f, +0.001926f, -0.003388f, + +0.002611f, -0.003050f, +0.001191f, +0.001397f, +0.001331f, -0.003511f, +0.002267f, +0.000031f, -0.000657f, +0.000753f, + -0.000692f, -0.001158f, -0.000325f, +0.000715f, -0.000967f, -0.001246f, -0.001350f, -0.002261f, -0.000960f, +0.001702f, + +0.001845f, -0.000721f, +0.000419f, +0.000752f, +0.000494f, +0.002880f, +0.000482f, +0.000476f, -0.003017f, -0.001094f, + -0.001167f, +0.001187f, -0.000619f, -0.000340f, -0.000249f, -0.000210f, +0.000396f, +0.000382f, -0.001055f, -0.000802f, + +0.000470f, -0.000409f, -0.000525f, +0.000231f, -0.000821f, -0.000009f, -0.000125f, -0.000197f, +0.000089f, +0.000016f, + -0.000472f, -0.000185f, +0.000266f, -0.000098f, +0.000525f, -0.000282f + } + }, + { + { + +0.017463f, -0.014348f, +0.031398f, -0.027708f, -0.010654f, -0.001278f, +0.000475f, +0.002164f, +0.004872f, +0.008846f, + -0.012291f, -0.003305f, -0.008646f, -0.000298f, -0.015591f, -0.004771f, +0.005796f, +0.000521f, -0.003363f, -0.004529f, + +0.001807f, +0.010275f, -0.002403f, -0.000143f, +0.002478f, -0.001261f, +0.001030f, +0.000421f, +0.009173f, -0.000352f, + -0.000092f, -0.005292f, +0.003582f, -0.000418f, +0.000962f, +0.005065f, -0.004301f, +0.005664f, -0.002135f, -0.005344f, + +0.000491f, -0.000304f, -0.001978f, +0.001615f, +0.001271f, -0.002321f, +0.000999f, -0.000754f, +0.000405f, +0.003900f, + +0.001030f, -0.002895f, -0.001178f, +0.000125f, -0.002637f, -0.002584f, -0.002723f, -0.001011f, +0.002339f, +0.000517f, + +0.000765f, -0.001328f, -0.000685f, +0.001117f, +0.001925f, -0.000818f, -0.001103f, +0.000561f, -0.001852f, +0.000118f, + -0.000086f, +0.000177f, +0.000609f, +0.001132f, -0.000404f, +0.000225f, +0.000507f, -0.000161f, -0.000557f, +0.000400f, + +0.001018f, -0.000494f, +0.000109f, +0.000187f, -0.000026f, +0.000023f, +0.000292f, +0.000191f, +0.000394f, +0.000151f, + +0.000194f, +0.000270f, -0.000150f, -0.000258f, -0.000355f, +0.000040f + }, + { + -0.003853f, +0.048255f, -0.002837f, -0.004921f, +0.012314f, -0.000273f, +0.001806f, +0.003209f, -0.000497f, -0.011847f, + +0.008428f, -0.000946f, -0.004467f, -0.003110f, -0.005643f, -0.003510f, -0.014269f, +0.005561f, -0.011643f, +0.011656f, + -0.006749f, -0.001784f, -0.000513f, +0.004253f, -0.010845f, +0.001098f, -0.001487f, +0.011574f, +0.000334f, -0.000082f, + -0.000998f, +0.003582f, -0.000774f, +0.003742f, -0.005732f, +0.001612f, +0.006570f, -0.002181f, -0.001911f, +0.003444f, + -0.000256f, +0.001784f, +0.001329f, +0.002349f, -0.004260f, -0.005394f, +0.002556f, -0.003488f, +0.001154f, -0.001244f, + +0.001277f, +0.002340f, +0.004679f, -0.001060f, -0.001288f, -0.001017f, -0.000485f, +0.000604f, +0.000578f, -0.000531f, + +0.000198f, -0.001701f, +0.002516f, -0.000759f, -0.000009f, +0.000450f, +0.000492f, -0.000350f, -0.000856f, +0.000752f, + -0.002351f, -0.001525f, +0.000077f, +0.000096f, -0.001007f, +0.000371f, -0.001215f, -0.000051f, +0.000287f, -0.000542f, + -0.000654f, +0.000057f, +0.000439f, -0.000651f, +0.000447f, +0.000293f, -0.000337f, -0.000863f, +0.000026f, +0.000031f, + +0.000161f, -0.000011f, -0.000224f, +0.000863f, -0.000077f, -0.000129f + }, + { + -0.002840f, +0.059850f, -0.035887f, -0.025705f, +0.041715f, +0.005360f, +0.004650f, +0.003043f, +0.000578f, -0.004123f, + +0.005923f, -0.005221f, +0.007274f, -0.010547f, -0.006204f, +0.015987f, -0.004570f, +0.008025f, -0.009222f, -0.001023f, + +0.004403f, +0.000027f, -0.003263f, -0.000097f, -0.002667f, +0.001261f, +0.000558f, -0.006090f, -0.002444f, +0.002178f, + +0.000122f, -0.005417f, +0.004575f, -0.004353f, -0.000888f, -0.002710f, +0.003216f, -0.002291f, +0.000330f, +0.003467f, + +0.004010f, +0.002210f, -0.000923f, +0.003000f, +0.002532f, +0.003381f, +0.003052f, +0.001648f, +0.000232f, -0.001145f, + +0.000929f, -0.000752f, -0.000265f, +0.002641f, -0.000757f, -0.000728f, -0.002305f, -0.000057f, -0.001473f, +0.000249f, + +0.000554f, +0.002978f, -0.000031f, +0.002884f, -0.000449f, -0.003180f, +0.000309f, +0.000920f, -0.002415f, +0.001037f, + -0.000022f, +0.001402f, +0.000226f, +0.000144f, +0.000095f, +0.000814f, -0.000697f, +0.000870f, +0.000494f, -0.000046f, + -0.000300f, -0.000185f, -0.000312f, -0.000439f, -0.000567f, +0.000489f, -0.000229f, +0.000208f, -0.000237f, -0.000277f, + +0.000451f, -0.000237f, +0.000381f, +0.000069f, -0.000203f, -0.000455f + }, + { + -0.040958f, +0.033836f, +0.021062f, +0.021487f, -0.012166f, -0.001387f, +0.000993f, +0.001211f, +0.005902f, +0.001488f, + -0.000796f, -0.011555f, +0.008031f, +0.010951f, +0.000678f, +0.001642f, -0.001627f, -0.011619f, +0.002748f, -0.000233f, + +0.000219f, -0.002395f, +0.005517f, +0.000194f, -0.004701f, +0.001755f, -0.000298f, -0.006736f, +0.002349f, -0.004042f, + +0.010350f, -0.000368f, +0.000022f, +0.001981f, +0.001612f, +0.006391f, +0.005816f, -0.002091f, +0.002666f, +0.001737f, + -0.002634f, -0.001954f, -0.004095f, -0.001489f, +0.001281f, +0.002835f, -0.002716f, -0.000933f, +0.003003f, -0.000359f, + +0.000583f, -0.003482f, -0.000056f, +0.001821f, +0.000790f, +0.000929f, -0.000468f, +0.000138f, -0.001737f, +0.000504f, + -0.001589f, +0.000645f, -0.001173f, +0.001717f, +0.000260f, +0.001410f, -0.000236f, +0.000378f, +0.000297f, +0.000617f, + +0.000163f, +0.000459f, +0.000038f, +0.000966f, -0.000404f, +0.000512f, -0.000664f, -0.000887f, +0.000526f, +0.000451f, + +0.000206f, +0.000371f, +0.000114f, -0.000400f, -0.000279f, -0.000013f, -0.000310f, -0.000551f, -0.000415f, +0.000450f, + -0.000247f, -0.000128f, -0.000774f, +0.000094f, -0.000169f, -0.000290f + }, + { + +0.000167f, -0.061168f, +0.001673f, +0.000618f, +0.001071f, -0.001166f, +0.000272f, -0.002756f, +0.000378f, -0.005015f, + +0.003521f, +0.005345f, -0.010744f, +0.007784f, +0.000008f, +0.002272f, -0.020650f, -0.001761f, -0.019407f, +0.001713f, + -0.017919f, -0.010097f, -0.002323f, +0.009181f, -0.008687f, +0.015213f, -0.007991f, +0.006158f, -0.008486f, +0.000656f, + -0.007546f, -0.015606f, -0.003640f, -0.003512f, -0.004783f, +0.000000f, -0.007608f, -0.002138f, +0.001006f, -0.000707f, + -0.001213f, +0.002359f, -0.000681f, -0.000310f, -0.003892f, -0.002645f, +0.001075f, -0.001537f, -0.000871f, -0.000156f, + +0.001901f, +0.000022f, -0.001123f, -0.002141f, +0.000857f, -0.001808f, +0.001640f, +0.001178f, -0.001610f, -0.001081f, + +0.000605f, -0.001315f, -0.000248f, -0.000752f, +0.002382f, -0.000925f, +0.000108f, -0.001646f, -0.001692f, +0.000605f, + -0.000168f, +0.001752f, -0.000626f, +0.000580f, -0.000289f, +0.000022f, -0.000437f, -0.000240f, +0.000536f, +0.000686f, + -0.000465f, -0.000112f, -0.000610f, +0.000542f, +0.000252f, -0.000399f, +0.000463f, -0.000138f, -0.000518f, +0.000336f, + +0.000532f, +0.001137f, -0.000187f, +0.000402f, +0.000315f, +0.000783f + }, + { + -0.045799f, -0.057158f, -0.028560f, +0.061583f, +0.007686f, -0.004667f, -0.004534f, -0.013909f, -0.002267f, -0.002862f, + +0.005960f, -0.003282f, -0.007512f, -0.006755f, -0.005077f, +0.006513f, +0.004843f, +0.002888f, -0.001513f, -0.000629f, + +0.010203f, -0.001509f, +0.002210f, -0.003048f, -0.004943f, -0.001925f, +0.001874f, -0.003374f, -0.001457f, +0.003542f, + +0.006378f, +0.000260f, -0.001011f, -0.004127f, +0.002230f, +0.002920f, -0.003300f, -0.001122f, +0.002647f, -0.001549f, + -0.004224f, -0.000193f, +0.001902f, +0.000154f, +0.001120f, -0.002215f, +0.001561f, +0.003583f, +0.002879f, +0.000513f, + -0.003081f, -0.001010f, -0.003101f, +0.001058f, +0.001703f, -0.000735f, -0.000380f, +0.000310f, -0.000450f, +0.000991f, + -0.000679f, -0.001245f, +0.000504f, +0.001423f, +0.000858f, -0.000551f, +0.000011f, +0.000541f, +0.001034f, +0.000225f, + +0.000679f, -0.000649f, -0.001046f, +0.000841f, -0.000726f, +0.000418f, +0.000609f, +0.000465f, -0.000146f, -0.000508f, + +0.000164f, -0.000895f, -0.000200f, +0.000711f, +0.000180f, -0.000021f, +0.000249f, +0.000013f, -0.000092f, +0.000586f, + -0.000357f, -0.000088f, -0.000179f, +0.000155f, +0.000400f, +0.000057f + }, + { + +0.000621f, +0.020566f, -0.000072f, -0.002823f, -0.001742f, -0.000881f, +0.000409f, +0.000379f, -0.003191f, +0.000395f, + -0.004092f, -0.002343f, +0.000806f, -0.006528f, +0.004890f, -0.004801f, -0.002503f, +0.003098f, -0.003233f, -0.014415f, + +0.005379f, +0.001917f, +0.017043f, +0.010686f, -0.017909f, -0.009064f, -0.012691f, +0.002391f, +0.003020f, +0.000034f, + +0.006396f, -0.005203f, +0.001575f, -0.003028f, -0.001765f, +0.009370f, -0.004695f, -0.002623f, -0.005675f, +0.000472f, + +0.001644f, -0.005086f, -0.001851f, +0.003337f, +0.000998f, +0.003572f, +0.000275f, -0.002039f, -0.000807f, -0.000804f, + +0.000325f, +0.000032f, +0.000633f, +0.001233f, +0.001049f, +0.000085f, +0.002270f, +0.000085f, +0.000924f, +0.001858f, + -0.000755f, +0.000154f, -0.000391f, +0.000910f, -0.001412f, -0.000232f, +0.000907f, +0.001661f, +0.000520f, -0.001106f, + -0.002110f, -0.000482f, +0.001037f, +0.000173f, +0.000346f, +0.000476f, +0.000080f, +0.000561f, -0.000604f, +0.001131f, + -0.000754f, -0.000670f, +0.000003f, +0.000247f, +0.000162f, +0.000242f, +0.000273f, +0.000125f, +0.000070f, -0.000558f, + -0.000010f, +0.000179f, +0.000375f, +0.000127f, -0.000466f, -0.000146f + }, + { + +0.041240f, +0.027615f, +0.024358f, -0.062134f, -0.002298f, -0.004761f, -0.000396f, -0.001417f, -0.000907f, -0.000763f, + -0.003676f, -0.002750f, +0.009527f, -0.002112f, -0.007952f, +0.004323f, -0.006016f, -0.001395f, -0.003573f, +0.001943f, + -0.001245f, +0.004272f, -0.009385f, +0.001297f, -0.012401f, +0.003869f, +0.001785f, -0.004104f, +0.003683f, +0.000403f, + -0.002752f, -0.004027f, -0.000430f, -0.002056f, -0.000899f, -0.003290f, -0.004927f, +0.000428f, -0.005118f, -0.005710f, + -0.001816f, +0.002143f, +0.001187f, -0.004180f, +0.001098f, -0.003334f, +0.000813f, -0.008821f, +0.001550f, +0.001855f, + +0.000944f, -0.003084f, -0.002357f, -0.000029f, +0.001781f, +0.001791f, +0.000505f, -0.003229f, -0.000525f, -0.000706f, + -0.001064f, +0.001147f, +0.001876f, +0.000449f, -0.000468f, -0.000570f, +0.000312f, -0.000185f, -0.000990f, +0.002499f, + +0.000498f, +0.000072f, +0.000599f, +0.000172f, -0.000317f, -0.001074f, +0.000630f, +0.001037f, -0.000306f, -0.000194f, + -0.000343f, -0.000080f, -0.000239f, +0.000045f, +0.000160f, -0.000043f, +0.001184f, +0.000243f, -0.000864f, +0.000019f, + -0.000369f, -0.000115f, +0.000220f, +0.000196f, -0.000005f, +0.000020f + }, + { + +0.000257f, +0.009417f, +0.004673f, +0.002240f, -0.001245f, +0.001061f, -0.002319f, +0.002360f, +0.001760f, -0.001871f, + -0.006082f, +0.008301f, -0.004013f, +0.010051f, -0.007468f, +0.005619f, -0.007909f, -0.014311f, -0.005265f, -0.007938f, + -0.003061f, +0.004854f, -0.018927f, -0.009827f, -0.002315f, +0.000098f, -0.008229f, -0.001224f, +0.000070f, -0.008544f, + -0.005309f, -0.000774f, -0.002382f, +0.002241f, -0.001999f, +0.000707f, +0.004077f, +0.005844f, -0.002291f, -0.002280f, + -0.000059f, +0.008412f, +0.002577f, -0.002639f, -0.000394f, +0.002643f, +0.002316f, -0.003309f, +0.000800f, +0.000373f, + +0.000763f, +0.000261f, +0.000076f, +0.001236f, +0.000476f, +0.001401f, -0.000669f, +0.001435f, +0.001443f, +0.001038f, + -0.000536f, -0.000258f, +0.000965f, -0.000350f, -0.001654f, -0.000635f, +0.000031f, -0.001009f, -0.001218f, -0.001248f, + +0.000661f, -0.001454f, +0.002177f, +0.001425f, +0.000744f, +0.000381f, -0.001346f, -0.000507f, +0.001028f, +0.000682f, + +0.000302f, -0.000138f, -0.000853f, -0.000037f, -0.000143f, -0.000082f, +0.000244f, +0.000180f, -0.000632f, +0.000706f, + +0.000065f, -0.000616f, -0.000349f, -0.000401f, +0.000688f, +0.000436f + }, + { + -0.020120f, -0.208618f, +0.031411f, -0.008990f, +0.005472f, +0.004261f, -0.048804f, +0.003627f, -0.007078f, +0.007890f, + -0.008028f, +0.003382f, -0.000302f, +0.001352f, -0.001126f, -0.003579f, -0.001472f, -0.006529f, +0.004267f, -0.010981f, + -0.007806f, -0.003103f, +0.000820f, -0.004259f, -0.001781f, +0.000327f, +0.008068f, -0.003908f, +0.005974f, -0.003728f, + +0.007804f, -0.003203f, +0.004746f, +0.004626f, +0.002816f, -0.000463f, +0.001817f, +0.000104f, +0.003062f, -0.000509f, + +0.000690f, +0.003534f, +0.004665f, -0.002234f, -0.000925f, +0.005850f, -0.002567f, +0.002016f, -0.002694f, -0.000378f, + -0.001602f, -0.002816f, +0.004316f, +0.004403f, -0.003950f, +0.000916f, +0.002690f, +0.002473f, +0.001150f, +0.000532f, + -0.002601f, -0.001529f, +0.002556f, -0.003535f, -0.000685f, -0.000301f, +0.000151f, -0.000757f, +0.000489f, +0.002036f, + +0.000472f, +0.000031f, +0.000347f, +0.000101f, +0.000154f, -0.001238f, +0.000459f, -0.000018f, +0.000004f, -0.000880f, + -0.001010f, -0.000548f, -0.000855f, -0.000147f, -0.000426f, -0.000392f, -0.000174f, -0.000339f, -0.000012f, +0.000743f, + +0.000332f, -0.000102f, +0.000012f, +0.000518f, +0.000324f, +0.000270f + }, + { + -0.001612f, -0.003285f, +0.027556f, -0.003266f, +0.005144f, +0.002600f, -0.001952f, -0.007837f, +0.006806f, -0.003918f, + +0.006674f, -0.004873f, +0.005878f, -0.003846f, -0.002953f, -0.010825f, -0.017646f, +0.002518f, +0.012358f, +0.019002f, + +0.008451f, -0.008766f, +0.004889f, +0.001095f, +0.009123f, -0.010388f, +0.007311f, -0.005484f, -0.007209f, -0.007835f, + +0.000852f, -0.005246f, -0.003112f, +0.004604f, -0.001209f, +0.001807f, -0.002926f, +0.000557f, -0.003913f, +0.000178f, + -0.005606f, -0.000995f, +0.001761f, +0.000636f, -0.000375f, -0.000295f, -0.000034f, +0.001312f, +0.002568f, -0.001547f, + +0.004044f, +0.000657f, +0.000533f, -0.000238f, +0.001463f, -0.000843f, +0.002278f, +0.002034f, -0.001422f, -0.001780f, + -0.000027f, -0.001777f, +0.001592f, -0.002170f, +0.000284f, -0.001074f, -0.000833f, +0.000623f, -0.000762f, -0.000013f, + -0.000337f, -0.000790f, -0.000216f, +0.000236f, -0.000707f, -0.000124f, -0.000025f, -0.000274f, +0.000095f, +0.000191f, + -0.001514f, -0.000460f, -0.000248f, -0.000527f, +0.000362f, +0.000291f, -0.000034f, -0.000238f, -0.000211f, +0.000315f, + +0.000317f, +0.000612f, -0.000192f, -0.000047f, +0.000366f, -0.000197f + }, + { + +0.063720f, +0.238149f, -0.018788f, +0.005597f, -0.018019f, +0.001959f, -0.004484f, +0.001809f, +0.010440f, +0.014861f, + +0.002516f, +0.000768f, -0.001775f, -0.005302f, +0.019007f, +0.001041f, +0.003950f, -0.001188f, -0.004517f, +0.008349f, + -0.007328f, +0.001123f, +0.002283f, +0.005848f, +0.002017f, +0.001669f, -0.001630f, -0.006280f, +0.000222f, +0.001657f, + +0.007003f, +0.001169f, -0.001546f, +0.001423f, +0.009426f, +0.005418f, -0.007560f, -0.000438f, -0.000944f, -0.000817f, + -0.000169f, +0.003871f, +0.001817f, +0.004534f, +0.005548f, -0.002372f, +0.000234f, -0.001646f, +0.002300f, -0.003097f, + -0.002397f, -0.004088f, +0.003402f, -0.005603f, -0.001228f, -0.003193f, +0.000635f, -0.001382f, -0.000594f, +0.001431f, + +0.002492f, +0.001330f, +0.001063f, -0.000337f, -0.000402f, -0.002409f, +0.000354f, -0.000122f, +0.001089f, +0.000696f, + -0.000505f, +0.000241f, +0.000501f, -0.000903f, +0.000151f, +0.001225f, -0.000332f, -0.000342f, -0.000140f, -0.001049f, + -0.000008f, +0.000217f, -0.000703f, -0.000012f, +0.000330f, -0.000738f, +0.000200f, -0.000039f, -0.000010f, +0.000020f, + +0.000205f, +0.000762f, -0.000003f, -0.000222f, -0.000207f, +0.000663f + }, + { + +0.001268f, -0.047203f, +0.003464f, -0.016132f, +0.002308f, -0.000611f, -0.000060f, -0.009053f, +0.004349f, +0.003778f, + -0.002622f, -0.002204f, +0.002764f, -0.021384f, -0.018032f, -0.002161f, -0.017672f, -0.004951f, +0.000422f, -0.002185f, + -0.005795f, -0.005708f, -0.001374f, +0.017889f, +0.012423f, +0.003497f, -0.001034f, +0.008586f, +0.004050f, +0.005790f, + +0.011557f, -0.000320f, +0.003427f, -0.004478f, -0.001720f, -0.001622f, +0.000832f, +0.001525f, +0.002903f, -0.004458f, + +0.000451f, -0.004445f, +0.001780f, +0.006355f, +0.001016f, +0.001577f, -0.002523f, -0.000945f, +0.004310f, -0.000135f, + +0.002608f, +0.000557f, +0.000935f, -0.003422f, +0.000113f, +0.001100f, +0.001553f, -0.001325f, +0.000283f, +0.002913f, + -0.000027f, +0.002072f, +0.002389f, -0.002057f, -0.000511f, -0.000271f, -0.001541f, +0.001171f, +0.000482f, -0.000851f, + +0.000819f, -0.000962f, +0.000871f, +0.000772f, +0.000950f, -0.000065f, -0.000455f, +0.001047f, -0.000442f, -0.000253f, + -0.000395f, +0.000456f, -0.000464f, -0.000691f, +0.000975f, -0.000448f, +0.000375f, -0.000081f, +0.000034f, +0.000314f, + +0.000046f, +0.000046f, -0.000058f, -0.000221f, -0.000425f, +0.000059f + }, + { + -0.011664f, +0.129830f, +0.007215f, -0.040555f, -0.009190f, -0.002613f, -0.012946f, +0.008649f, +0.003096f, +0.009472f, + -0.010302f, -0.000086f, +0.005451f, -0.008212f, +0.033517f, -0.005592f, -0.010998f, -0.004304f, -0.006168f, +0.003109f, + +0.004992f, -0.001134f, +0.003070f, -0.003771f, -0.006775f, -0.001425f, -0.005381f, -0.002753f, +0.000258f, +0.005606f, + -0.000306f, +0.003506f, +0.007470f, +0.003612f, +0.001003f, -0.001202f, -0.004928f, -0.006875f, -0.003972f, +0.005690f, + -0.004248f, +0.006816f, +0.003139f, -0.003475f, -0.004341f, +0.000737f, -0.003226f, -0.000256f, +0.000214f, -0.001453f, + -0.004239f, -0.000973f, +0.002278f, -0.001931f, -0.001134f, +0.000156f, -0.001259f, -0.000677f, -0.000355f, +0.000104f, + +0.000811f, -0.001697f, +0.001023f, -0.000084f, +0.001604f, +0.000462f, +0.000655f, -0.000445f, +0.000322f, -0.000737f, + +0.000649f, +0.000210f, +0.001797f, -0.000415f, +0.000694f, -0.000261f, +0.000401f, -0.001260f, +0.000487f, +0.000889f, + +0.000946f, -0.000226f, -0.000441f, +0.000083f, -0.000530f, -0.000254f, -0.000185f, +0.000462f, +0.000677f, +0.000385f, + -0.000160f, -0.000741f, +0.000380f, -0.000270f, -0.000487f, +0.000071f + }, + { + -0.001245f, -0.072908f, -0.000174f, +0.005583f, -0.005574f, -0.002496f, +0.004181f, -0.002415f, +0.004693f, -0.001959f, + -0.008459f, -0.003697f, -0.006386f, +0.025992f, -0.023277f, -0.006657f, +0.001192f, -0.003997f, -0.013250f, -0.007266f, + -0.012969f, -0.021900f, +0.001687f, +0.002234f, -0.008404f, +0.000454f, +0.000624f, +0.010887f, +0.008460f, -0.004169f, + +0.004324f, +0.001242f, +0.005741f, +0.001038f, +0.002984f, -0.001087f, -0.006339f, -0.001078f, +0.001712f, -0.001387f, + -0.004876f, +0.004291f, +0.001293f, +0.001076f, -0.003074f, -0.002475f, +0.004013f, -0.001672f, +0.001180f, +0.000249f, + -0.000071f, +0.000278f, -0.001683f, +0.001798f, -0.002012f, -0.002051f, -0.000229f, -0.002528f, -0.000675f, +0.001333f, + +0.003147f, +0.000659f, +0.001023f, -0.000317f, +0.000659f, +0.002698f, +0.000407f, -0.000630f, -0.001239f, -0.000613f, + -0.000895f, -0.000549f, +0.000553f, -0.000021f, +0.000778f, -0.000483f, +0.000299f, +0.000293f, -0.000322f, -0.000843f, + +0.000120f, -0.000358f, -0.001123f, -0.000031f, -0.000241f, -0.000330f, +0.000025f, -0.000037f, -0.000221f, -0.000491f, + -0.000496f, +0.000052f, +0.000559f, +0.000017f, +0.000254f, +0.000294f + } + }, + { + { + -0.021341f, -0.167605f, -0.093733f, -0.006160f, +0.010182f, -0.000377f, -0.001228f, +0.001212f, -0.000514f, +0.010322f, + -0.005346f, +0.005615f, -0.010013f, -0.005850f, -0.017554f, -0.001990f, +0.015548f, +0.006509f, +0.008591f, +0.013261f, + +0.003940f, +0.006227f, -0.001555f, -0.001290f, +0.002256f, +0.003233f, -0.000828f, -0.005371f, +0.000918f, -0.005402f, + -0.000150f, -0.000760f, +0.010795f, +0.001257f, -0.002630f, +0.001479f, -0.008370f, +0.005163f, -0.004678f, -0.009677f, + -0.005498f, +0.001305f, -0.001688f, -0.003427f, -0.000094f, -0.003071f, -0.001856f, -0.004669f, -0.001686f, +0.000776f, + -0.001474f, -0.003366f, +0.002689f, +0.003590f, -0.000901f, +0.000491f, -0.000221f, +0.000362f, +0.001387f, -0.000293f, + +0.002543f, +0.000197f, -0.000197f, +0.000821f, +0.002689f, +0.000590f, -0.000735f, -0.000168f, -0.000771f, +0.001296f, + -0.000216f, -0.001275f, -0.001189f, +0.001404f, +0.000749f, -0.000101f, +0.000236f, +0.000381f, -0.000274f, +0.000656f, + +0.000746f, -0.000587f, -0.000436f, -0.000048f, -0.000423f, -0.000430f, +0.000362f, -0.000020f, +0.000695f, +0.000470f, + +0.000097f, +0.000059f, +0.000093f, -0.000078f, -0.000093f, +0.000505f + }, + { + +0.002374f, +0.032533f, -0.022488f, -0.022874f, +0.003515f, +0.000047f, +0.002560f, +0.000441f, -0.006523f, -0.011660f, + +0.010051f, -0.001266f, -0.005430f, -0.001195f, +0.001493f, +0.012001f, -0.002702f, +0.005405f, -0.008326f, +0.005181f, + -0.004809f, -0.009423f, -0.004894f, +0.002678f, -0.015420f, +0.001457f, -0.004600f, +0.012311f, +0.002596f, -0.002228f, + +0.002477f, +0.009478f, +0.000923f, +0.007382f, -0.002379f, +0.005005f, +0.006305f, -0.005225f, -0.006450f, +0.002698f, + +0.000956f, +0.001932f, +0.001443f, +0.000171f, -0.002736f, -0.000037f, +0.004345f, -0.003017f, +0.001043f, -0.002022f, + -0.000025f, -0.001264f, +0.002834f, -0.000945f, +0.000043f, -0.001337f, -0.001928f, +0.000039f, +0.001038f, +0.001004f, + +0.001619f, -0.001626f, +0.001170f, -0.002105f, -0.000339f, -0.002132f, -0.003412f, -0.001243f, -0.000013f, +0.001027f, + -0.001309f, -0.000370f, +0.000177f, +0.000179f, -0.001283f, +0.000827f, +0.000421f, +0.000612f, -0.000728f, -0.000835f, + -0.000090f, -0.000257f, -0.000021f, -0.000911f, -0.000413f, -0.000260f, -0.000716f, -0.000628f, -0.000091f, +0.000125f, + +0.000161f, +0.000032f, -0.000289f, +0.000732f, +0.000085f, +0.000072f + }, + { + +0.007516f, +0.127961f, -0.005230f, -0.085433f, +0.004760f, +0.005807f, +0.001625f, +0.003764f, +0.009448f, -0.006803f, + -0.022857f, -0.022184f, +0.005022f, -0.019874f, -0.007699f, +0.011032f, -0.015377f, +0.001528f, -0.005629f, +0.001250f, + -0.005651f, -0.008087f, -0.004522f, -0.000529f, +0.009832f, -0.002260f, -0.005267f, -0.006001f, -0.005864f, -0.002332f, + +0.001086f, -0.009327f, +0.003078f, +0.001535f, +0.001928f, -0.004089f, +0.001994f, -0.000878f, +0.000506f, +0.004390f, + +0.001938f, -0.005856f, -0.000103f, +0.005356f, -0.000027f, -0.001907f, -0.000132f, +0.000924f, +0.000323f, +0.000151f, + +0.003663f, +0.001105f, -0.001771f, -0.001757f, -0.002819f, +0.001375f, -0.001521f, -0.001990f, -0.003815f, -0.001253f, + -0.000077f, +0.002923f, +0.000954f, +0.002244f, -0.000526f, -0.002324f, +0.000369f, +0.001832f, -0.001613f, +0.000815f, + -0.000275f, -0.000619f, -0.001509f, -0.000526f, +0.000218f, +0.000725f, -0.001713f, -0.000249f, +0.000617f, +0.000260f, + +0.000245f, +0.000421f, +0.000147f, -0.000037f, -0.000656f, +0.000295f, -0.000157f, +0.000412f, -0.000180f, -0.000431f, + +0.000231f, -0.000771f, -0.000056f, -0.000244f, -0.000220f, -0.000249f + }, + { + +0.056569f, +0.163443f, -0.004858f, +0.028302f, +0.014477f, -0.003763f, +0.001683f, -0.004161f, -0.001116f, +0.000072f, + +0.004004f, -0.011082f, -0.008823f, +0.001013f, +0.004319f, +0.004678f, +0.006051f, -0.008476f, -0.001149f, -0.002309f, + -0.001996f, +0.001355f, +0.008639f, +0.002309f, -0.004043f, +0.003959f, -0.003878f, -0.007483f, +0.005036f, -0.003786f, + +0.003808f, -0.006051f, -0.005333f, +0.000804f, -0.000186f, +0.001886f, +0.002846f, -0.002426f, +0.000780f, -0.001066f, + -0.001255f, -0.001029f, -0.002919f, +0.000708f, -0.000316f, +0.000658f, -0.000154f, +0.002937f, +0.001471f, -0.002207f, + +0.000787f, -0.000679f, +0.000822f, +0.002758f, +0.000022f, -0.000791f, -0.000341f, +0.001438f, +0.000134f, +0.001697f, + -0.001204f, +0.001166f, -0.000003f, +0.000062f, -0.000776f, +0.001937f, +0.000195f, -0.000436f, -0.001191f, -0.000288f, + -0.000079f, +0.000263f, -0.000746f, +0.000770f, +0.000044f, +0.000202f, -0.000760f, +0.000077f, +0.000952f, -0.000149f, + -0.000790f, -0.000144f, +0.000183f, -0.000311f, +0.000004f, +0.000069f, -0.000155f, -0.000150f, -0.000411f, +0.000137f, + -0.000262f, +0.000050f, -0.000624f, +0.000446f, +0.000344f, -0.000054f + }, + { + -0.001410f, -0.071574f, -0.007657f, -0.003193f, -0.000929f, -0.002285f, +0.000146f, -0.002944f, +0.002249f, +0.001242f, + +0.007492f, +0.009537f, -0.000242f, +0.005519f, -0.004898f, +0.019431f, -0.016537f, -0.041271f, -0.025418f, +0.012488f, + -0.019673f, -0.002578f, +0.000141f, +0.008768f, -0.000480f, +0.011791f, -0.006930f, +0.010823f, -0.003842f, +0.005103f, + -0.002395f, -0.016393f, -0.007533f, -0.005814f, -0.006183f, +0.003680f, -0.002061f, +0.000024f, +0.005641f, +0.003583f, + +0.000194f, -0.000999f, -0.002053f, +0.002022f, -0.000243f, +0.000438f, +0.000983f, -0.005029f, -0.003126f, +0.000836f, + +0.003064f, +0.000910f, -0.001022f, +0.000186f, +0.001839f, -0.001862f, +0.000747f, -0.000784f, -0.001812f, -0.001108f, + +0.001721f, +0.000441f, +0.000334f, +0.000055f, +0.001545f, -0.000743f, +0.001131f, -0.000304f, -0.000738f, -0.000018f, + -0.000726f, +0.000382f, -0.001098f, -0.000171f, -0.001035f, -0.000337f, -0.000167f, -0.000168f, +0.000864f, +0.000343f, + -0.000938f, +0.000587f, -0.000455f, +0.000142f, +0.000282f, -0.000701f, +0.000968f, +0.000425f, -0.000160f, +0.000371f, + -0.000243f, +0.000803f, -0.000333f, +0.000156f, -0.000132f, -0.000091f + }, + { + +0.061643f, +0.147112f, +0.015885f, +0.036251f, -0.017875f, -0.001309f, +0.000446f, -0.007270f, -0.009377f, -0.022079f, + -0.006866f, -0.006477f, -0.005565f, +0.000247f, -0.001129f, +0.010759f, +0.006221f, +0.000749f, -0.001789f, -0.005672f, + +0.001859f, -0.000591f, +0.001713f, -0.006776f, -0.005271f, -0.004637f, -0.001104f, +0.000079f, -0.001152f, -0.002215f, + +0.000709f, +0.001716f, +0.006871f, +0.000487f, +0.000575f, +0.001461f, -0.001753f, -0.000252f, +0.005613f, +0.002619f, + -0.001549f, +0.001492f, +0.001809f, -0.001797f, -0.000254f, -0.000768f, +0.001739f, +0.001877f, +0.002757f, +0.000109f, + -0.001543f, -0.001693f, -0.003927f, -0.002824f, +0.002881f, -0.000191f, -0.000091f, -0.001206f, -0.001934f, +0.000904f, + +0.000531f, -0.000891f, +0.002076f, +0.003415f, +0.000172f, -0.001451f, +0.000070f, +0.000431f, +0.002351f, +0.000849f, + +0.000867f, +0.001292f, +0.000503f, -0.000175f, -0.000032f, +0.000372f, -0.000561f, -0.000026f, +0.000260f, +0.000623f, + +0.000825f, -0.000554f, -0.000472f, -0.000112f, +0.000081f, -0.000226f, -0.000373f, -0.000532f, -0.000497f, -0.000129f, + -0.000202f, -0.000077f, +0.000042f, +0.000421f, +0.000167f, -0.000090f + }, + { + -0.000908f, +0.016560f, +0.004510f, +0.002369f, -0.000033f, -0.002290f, -0.000289f, +0.002754f, +0.000907f, +0.000289f, + -0.006526f, -0.001224f, +0.003548f, -0.009642f, -0.002522f, -0.004577f, +0.013625f, +0.006259f, +0.005015f, -0.011289f, + -0.002876f, -0.010219f, -0.012563f, +0.006048f, -0.005254f, +0.007514f, -0.010723f, -0.003443f, +0.002440f, +0.003462f, + +0.002690f, -0.012775f, +0.001525f, -0.003556f, -0.001657f, +0.006586f, -0.009452f, -0.002538f, -0.004375f, -0.000494f, + +0.000285f, -0.001092f, +0.001619f, +0.002609f, -0.003300f, +0.000512f, -0.000214f, -0.001267f, -0.001603f, +0.000498f, + +0.002789f, +0.001389f, -0.000275f, +0.001063f, +0.003071f, +0.000171f, +0.003296f, +0.000282f, -0.001767f, -0.000447f, + -0.000478f, +0.001430f, -0.000911f, +0.000035f, -0.001487f, +0.000544f, +0.000297f, +0.000177f, +0.000779f, +0.000354f, + -0.000906f, -0.000547f, +0.000994f, +0.001305f, +0.000396f, +0.000065f, -0.000533f, +0.000362f, -0.000057f, +0.001748f, + -0.001348f, -0.001023f, +0.000709f, +0.000854f, +0.000323f, +0.000384f, +0.000567f, +0.000035f, +0.000179f, +0.000255f, + -0.000151f, -0.000415f, -0.000117f, +0.000163f, -0.000385f, -0.000232f + }, + { + -0.036264f, -0.185852f, -0.058484f, -0.040240f, +0.013811f, -0.001399f, +0.011861f, +0.011682f, +0.010153f, +0.004602f, + -0.001890f, -0.006307f, +0.005150f, -0.008545f, -0.017932f, -0.000040f, -0.010784f, +0.002316f, -0.012405f, -0.002578f, + -0.006737f, -0.005025f, -0.013135f, -0.001865f, -0.014548f, +0.002116f, -0.000257f, -0.007202f, +0.000266f, +0.000981f, + +0.005700f, -0.000797f, -0.004887f, -0.009047f, -0.005846f, -0.008627f, -0.011799f, -0.000574f, -0.004766f, -0.005330f, + -0.000539f, -0.000293f, +0.001750f, -0.000059f, +0.002959f, +0.000003f, +0.003448f, -0.005911f, +0.003664f, +0.001440f, + -0.000951f, -0.001759f, -0.002723f, -0.001622f, +0.000083f, +0.001918f, +0.001721f, -0.000751f, +0.002760f, +0.001309f, + +0.000129f, +0.001022f, +0.000999f, +0.001025f, +0.000694f, +0.001037f, +0.000627f, +0.000845f, +0.000722f, +0.002085f, + -0.000393f, +0.000449f, -0.000047f, -0.000344f, +0.000983f, +0.000012f, +0.000075f, +0.000417f, -0.000019f, +0.000136f, + -0.000146f, -0.000378f, -0.000854f, -0.000142f, +0.000701f, -0.000117f, -0.000054f, +0.000139f, -0.000249f, +0.000385f, + +0.000163f, -0.000080f, -0.000063f, +0.000317f, -0.000035f, -0.000358f + }, + { + -0.001348f, -0.005745f, -0.002407f, +0.000162f, -0.003119f, +0.002406f, -0.001081f, -0.002166f, -0.003395f, +0.003118f, + +0.002175f, +0.014127f, -0.005765f, -0.002779f, -0.013165f, +0.006426f, +0.022208f, +0.007585f, +0.004912f, +0.004754f, + -0.000177f, +0.007099f, -0.009230f, +0.001403f, +0.003741f, +0.023916f, +0.009174f, -0.002936f, -0.006770f, -0.005155f, + -0.007093f, -0.004034f, -0.000830f, -0.006643f, -0.004263f, -0.001182f, -0.003633f, -0.000921f, -0.002099f, -0.001604f, + -0.002151f, +0.006450f, -0.001478f, -0.002362f, -0.000005f, +0.002022f, +0.002714f, -0.000273f, +0.002074f, +0.002436f, + +0.003179f, +0.000003f, +0.000707f, +0.002431f, -0.001119f, +0.000306f, -0.000976f, -0.000833f, -0.001183f, +0.000894f, + +0.000414f, -0.000179f, +0.001013f, +0.001575f, -0.000158f, -0.000471f, -0.000144f, +0.000303f, +0.000164f, -0.000941f, + +0.001729f, +0.000055f, +0.002082f, +0.000863f, +0.000066f, +0.000262f, -0.000421f, -0.000052f, +0.001008f, +0.000329f, + +0.000484f, -0.000357f, -0.000637f, +0.000167f, -0.000319f, -0.000176f, +0.000352f, +0.000481f, -0.000898f, +0.000243f, + -0.000207f, -0.000521f, -0.000646f, -0.000409f, +0.000520f, +0.000221f + }, + { + +0.017350f, -0.249873f, -0.024989f, +0.018001f, +0.021131f, -0.016266f, -0.048101f, +0.009305f, +0.010654f, +0.012515f, + -0.010847f, +0.012492f, +0.013222f, +0.003287f, -0.002853f, -0.001242f, -0.006953f, -0.003905f, +0.007367f, -0.003372f, + -0.006372f, -0.003362f, +0.003453f, -0.007613f, -0.012476f, -0.000605f, +0.007863f, -0.004163f, +0.006357f, -0.005117f, + +0.009186f, -0.002696f, +0.000917f, +0.002786f, +0.006340f, +0.007898f, +0.009303f, +0.003289f, +0.001506f, -0.006191f, + -0.000181f, +0.006053f, +0.002827f, -0.001185f, +0.003149f, +0.005314f, -0.003817f, -0.000645f, -0.004057f, +0.003164f, + +0.004023f, -0.004302f, +0.001006f, +0.002247f, -0.004700f, -0.000327f, +0.000582f, +0.001545f, +0.000100f, +0.001452f, + -0.002285f, -0.002879f, +0.002353f, -0.002625f, -0.002511f, -0.001917f, +0.001142f, -0.001353f, -0.000280f, +0.001697f, + +0.000226f, +0.000256f, +0.000627f, +0.000252f, +0.000788f, +0.000243f, +0.000357f, +0.000027f, +0.001043f, +0.000396f, + +0.000271f, -0.000382f, -0.000555f, +0.000662f, +0.000490f, +0.000235f, +0.000219f, -0.000460f, +0.000013f, +0.000327f, + -0.000154f, +0.000298f, +0.000185f, +0.000126f, +0.000282f, +0.000656f + }, + { + +0.000870f, -0.036645f, -0.019564f, -0.015485f, +0.011152f, -0.003920f, -0.010144f, -0.007884f, +0.005477f, -0.005584f, + +0.005551f, -0.002638f, -0.000961f, -0.003876f, +0.000539f, -0.009435f, -0.007234f, -0.000550f, -0.005680f, +0.010668f, + +0.004241f, -0.011471f, +0.008627f, -0.008224f, -0.000428f, -0.016339f, +0.002669f, -0.001969f, +0.002162f, -0.001589f, + +0.000310f, -0.001194f, -0.002937f, -0.002439f, -0.003082f, +0.004705f, -0.003372f, -0.000875f, -0.005539f, +0.001493f, + -0.000989f, +0.000571f, +0.002413f, -0.001447f, -0.000871f, -0.000664f, -0.001615f, -0.001935f, +0.000180f, -0.002409f, + +0.001245f, -0.000320f, +0.000043f, -0.000021f, -0.000157f, -0.002751f, +0.000505f, +0.000774f, -0.001393f, -0.000604f, + +0.001562f, -0.001864f, -0.000576f, -0.003573f, -0.001401f, -0.000250f, +0.000354f, +0.000976f, -0.000153f, +0.001059f, + +0.000819f, -0.000124f, +0.000114f, +0.000076f, -0.000788f, -0.000333f, +0.000489f, -0.000424f, -0.000840f, +0.000356f, + -0.000612f, +0.000116f, +0.000538f, -0.000043f, +0.000226f, -0.000103f, +0.000289f, -0.000162f, -0.000107f, +0.000072f, + -0.000011f, +0.000416f, -0.000039f, -0.000031f, +0.000149f, -0.000336f + }, + { + -0.083362f, +0.043637f, -0.018467f, -0.009161f, -0.022148f, +0.007931f, +0.003342f, +0.000910f, +0.000084f, +0.018042f, + +0.013733f, +0.001401f, +0.006145f, +0.003783f, +0.023774f, +0.002593f, +0.016299f, +0.006408f, -0.009364f, +0.005815f, + -0.008191f, +0.002199f, +0.001256f, +0.005603f, +0.003222f, +0.011233f, -0.003325f, -0.002041f, +0.000868f, -0.000578f, + +0.004259f, -0.005329f, +0.000187f, -0.000712f, +0.005353f, +0.005347f, -0.001930f, +0.002463f, -0.001720f, +0.003194f, + -0.001689f, +0.004198f, +0.008630f, +0.008300f, +0.002033f, -0.000943f, +0.004661f, -0.001181f, +0.002222f, -0.001587f, + -0.001485f, -0.002265f, +0.004487f, -0.003135f, +0.002036f, +0.000578f, -0.000121f, -0.001779f, +0.000894f, -0.000244f, + +0.003159f, +0.000578f, +0.000630f, +0.000035f, +0.001397f, -0.001053f, +0.001063f, -0.000029f, +0.000620f, +0.001584f, + +0.000220f, +0.000138f, +0.000544f, -0.000717f, -0.000390f, +0.000927f, +0.000119f, -0.000072f, +0.000229f, -0.000619f, + +0.000317f, +0.000197f, -0.000268f, +0.000498f, +0.000716f, -0.000326f, +0.000052f, -0.000226f, +0.000263f, +0.000286f, + +0.000036f, +0.000571f, +0.000116f, -0.000319f, -0.000510f, +0.000697f + }, + { + -0.001696f, -0.032545f, +0.006216f, -0.027445f, -0.003979f, -0.003500f, +0.005731f, -0.007024f, -0.004910f, -0.000346f, + -0.012483f, -0.006013f, +0.004401f, -0.008692f, -0.002306f, +0.009717f, -0.012764f, +0.003017f, +0.009414f, -0.008279f, + -0.006860f, +0.008722f, +0.011090f, +0.008388f, +0.008029f, +0.007261f, +0.008308f, +0.005507f, +0.004430f, -0.001995f, + +0.009520f, +0.001124f, +0.004129f, -0.003503f, -0.002170f, +0.000075f, -0.000125f, -0.002919f, +0.003396f, +0.002500f, + +0.001299f, -0.005651f, +0.000650f, +0.007256f, -0.001723f, -0.003547f, -0.003578f, -0.002854f, +0.003174f, +0.002214f, + +0.006691f, +0.000402f, +0.000147f, -0.004452f, -0.002115f, +0.000108f, +0.002189f, -0.000840f, +0.000131f, +0.001020f, + -0.001143f, +0.000321f, +0.000524f, -0.002224f, +0.000874f, +0.000410f, -0.000026f, +0.000922f, +0.000379f, -0.000917f, + +0.000916f, -0.000603f, +0.001979f, +0.000733f, +0.001407f, +0.000051f, -0.001150f, +0.000313f, -0.000567f, -0.000246f, + -0.000504f, -0.000176f, -0.000949f, -0.000990f, +0.000674f, -0.000236f, +0.000365f, -0.000428f, -0.000473f, -0.000357f, + -0.000302f, -0.000109f, +0.000094f, +0.000098f, -0.000391f, -0.000130f + }, + { + -0.019260f, +0.124040f, +0.014691f, -0.011150f, +0.025640f, +0.008017f, -0.011971f, +0.009548f, +0.007372f, +0.010337f, + -0.011874f, +0.002994f, +0.007555f, +0.002198f, +0.063780f, -0.002487f, -0.010435f, +0.000972f, +0.000908f, +0.007726f, + +0.006275f, -0.008526f, +0.003294f, +0.000004f, -0.010583f, -0.002319f, -0.001845f, -0.003425f, -0.004228f, +0.000967f, + -0.007593f, +0.001966f, +0.006715f, +0.005528f, +0.003664f, +0.002383f, -0.000030f, -0.003943f, -0.002365f, +0.004131f, + -0.004697f, -0.000322f, -0.000333f, +0.002361f, -0.000355f, -0.000882f, -0.001631f, +0.004050f, +0.000926f, +0.000500f, + -0.000846f, -0.000560f, -0.002496f, -0.004846f, -0.000517f, +0.000001f, -0.001380f, +0.000842f, +0.001967f, -0.000007f, + +0.000982f, -0.001004f, +0.000625f, +0.000540f, +0.002094f, +0.000129f, -0.000146f, -0.000374f, +0.000370f, -0.001021f, + +0.000655f, +0.001279f, +0.000744f, -0.001548f, -0.000318f, -0.000473f, +0.000155f, -0.000678f, +0.000189f, -0.000110f, + -0.000122f, -0.000353f, +0.000437f, +0.000110f, -0.000272f, +0.000057f, -0.000561f, +0.000414f, +0.000148f, +0.000219f, + -0.000023f, -0.000570f, +0.000054f, -0.000439f, -0.000421f, -0.000124f + }, + { + +0.001498f, -0.051369f, +0.010920f, +0.004971f, +0.001146f, -0.001532f, +0.003597f, -0.002138f, +0.003470f, -0.001692f, + -0.004278f, +0.007423f, -0.005753f, +0.003450f, -0.047275f, +0.008094f, +0.009856f, -0.002939f, -0.004537f, +0.003171f, + +0.001630f, -0.015466f, +0.004127f, +0.003184f, -0.005796f, +0.005011f, -0.003395f, +0.002938f, -0.000976f, -0.018399f, + +0.000675f, +0.005843f, +0.002746f, -0.004984f, -0.000806f, -0.002439f, -0.004557f, +0.000480f, +0.001108f, +0.000956f, + -0.003510f, +0.001098f, -0.003112f, -0.000364f, -0.004055f, -0.001894f, +0.003450f, -0.003717f, +0.001666f, +0.002342f, + +0.000087f, +0.000513f, -0.002927f, +0.000371f, -0.002598f, -0.001124f, +0.001083f, -0.000431f, +0.001384f, -0.000238f, + +0.001008f, +0.000120f, +0.000442f, -0.001208f, +0.000700f, +0.001017f, -0.001609f, -0.001996f, -0.000297f, +0.000972f, + +0.001089f, -0.000867f, -0.000651f, -0.000834f, +0.000439f, -0.000230f, +0.000234f, +0.000802f, +0.000685f, -0.000403f, + +0.000564f, -0.000151f, -0.000608f, +0.000424f, +0.000612f, +0.000176f, +0.000943f, +0.000623f, -0.000379f, -0.000349f, + -0.000253f, +0.000027f, +0.000077f, -0.000206f, -0.000187f, +0.000269f + } + }, + { + { + +0.019890f, -0.153495f, -0.131572f, +0.024692f, -0.020244f, -0.000132f, +0.006078f, +0.002384f, -0.008589f, +0.009114f, + -0.002302f, -0.007606f, +0.007449f, -0.009059f, -0.013949f, +0.009652f, +0.001304f, +0.003339f, +0.015640f, +0.009980f, + +0.002868f, +0.006939f, +0.001672f, -0.003170f, +0.001625f, +0.002673f, +0.001602f, -0.003560f, -0.006435f, +0.000814f, + -0.005064f, +0.006339f, +0.008803f, +0.000624f, -0.005418f, +0.005700f, -0.007519f, +0.007420f, -0.011065f, -0.002919f, + -0.005377f, +0.000774f, -0.002012f, -0.003395f, +0.002014f, -0.003498f, -0.005015f, -0.003993f, -0.000914f, -0.002628f, + -0.001634f, -0.002747f, +0.002915f, +0.002211f, +0.002623f, +0.000010f, -0.000436f, +0.002275f, +0.001037f, -0.000161f, + +0.001452f, +0.001423f, -0.000335f, +0.000231f, +0.000484f, +0.001649f, +0.001112f, -0.001804f, +0.000340f, +0.000702f, + +0.000268f, -0.001300f, -0.001416f, +0.000281f, +0.001550f, +0.000289f, +0.000175f, -0.000545f, +0.000439f, +0.000600f, + -0.000154f, -0.000546f, -0.000167f, +0.000499f, -0.000212f, -0.000404f, -0.000200f, +0.000137f, +0.000425f, +0.000558f, + +0.000448f, -0.000233f, -0.000077f, +0.000568f, -0.000405f, +0.000577f + }, + { + +0.001131f, -0.027832f, +0.024018f, -0.013475f, -0.007772f, -0.000843f, +0.000504f, -0.001446f, -0.008625f, -0.002099f, + +0.005687f, -0.001650f, -0.003105f, -0.006790f, -0.003363f, +0.013017f, +0.006387f, -0.002581f, +0.013116f, -0.009223f, + +0.003491f, -0.023358f, -0.000693f, +0.001102f, -0.007673f, -0.003325f, +0.001255f, -0.000487f, +0.010497f, +0.002159f, + -0.004376f, +0.009453f, +0.003089f, +0.004659f, +0.004758f, +0.001943f, +0.002233f, -0.002679f, -0.006241f, +0.005130f, + +0.002422f, -0.002942f, +0.001399f, -0.000764f, +0.001306f, +0.002761f, -0.000603f, +0.000840f, -0.000403f, -0.004560f, + +0.000421f, -0.000555f, -0.000109f, -0.000720f, +0.000870f, -0.000619f, +0.000187f, -0.002179f, +0.002446f, -0.000321f, + +0.000894f, +0.000129f, -0.001267f, -0.001370f, -0.000681f, -0.000962f, -0.003135f, -0.002032f, +0.000878f, -0.000296f, + -0.000706f, +0.000429f, +0.000364f, +0.000252f, -0.001022f, +0.000296f, +0.001088f, -0.000012f, -0.001248f, +0.000567f, + -0.000411f, +0.000057f, -0.000614f, +0.000018f, -0.001201f, -0.000422f, -0.000496f, -0.000447f, +0.000148f, +0.000089f, + +0.000119f, -0.000028f, -0.000128f, +0.000151f, +0.000045f, +0.000202f + }, + { + -0.010215f, +0.169952f, -0.006547f, -0.059360f, -0.025826f, +0.005054f, +0.008308f, -0.001673f, +0.003610f, +0.001171f, + -0.030687f, -0.008186f, -0.004930f, -0.018484f, -0.005481f, -0.005088f, +0.004059f, -0.016958f, -0.000510f, -0.000790f, + +0.002789f, -0.014209f, +0.003169f, -0.004936f, +0.011201f, -0.000260f, -0.003797f, -0.011643f, -0.000714f, -0.004112f, + -0.000423f, -0.004217f, +0.002501f, -0.004287f, +0.003193f, +0.002821f, -0.005051f, +0.002069f, -0.002460f, +0.003161f, + +0.006656f, -0.008870f, +0.005588f, -0.000055f, +0.002119f, -0.005105f, +0.001324f, +0.000873f, +0.001703f, -0.000328f, + +0.002501f, +0.001345f, -0.000791f, -0.002498f, -0.003154f, +0.001017f, -0.000203f, -0.002531f, -0.002189f, -0.001221f, + +0.000178f, -0.000946f, +0.003030f, +0.000489f, +0.000108f, -0.000629f, -0.000300f, +0.000871f, +0.001148f, -0.000938f, + +0.000051f, -0.001114f, -0.001650f, +0.000043f, +0.000381f, -0.000587f, -0.000966f, -0.000791f, +0.000211f, +0.000557f, + +0.000998f, -0.000273f, +0.000829f, +0.000059f, -0.000179f, -0.000534f, -0.000113f, +0.000145f, +0.000555f, -0.000455f, + -0.000353f, -0.000010f, -0.000373f, -0.000255f, -0.000248f, -0.000145f + }, + { + -0.048207f, +0.279719f, +0.033050f, +0.019059f, +0.002595f, -0.004238f, +0.004165f, -0.007889f, +0.000398f, -0.002946f, + +0.007524f, -0.004989f, -0.020033f, +0.005432f, +0.018393f, -0.006187f, +0.002407f, -0.008283f, -0.006199f, +0.006134f, + -0.006289f, +0.004034f, +0.002673f, +0.007221f, -0.009622f, +0.003963f, +0.001141f, -0.005985f, +0.002524f, +0.001150f, + -0.001674f, +0.002801f, -0.009607f, -0.000535f, +0.002392f, -0.006465f, +0.001343f, -0.000429f, +0.002282f, -0.003277f, + +0.001178f, -0.001349f, +0.002571f, -0.004495f, +0.001527f, +0.001198f, +0.000837f, +0.001676f, -0.002982f, +0.001607f, + -0.001564f, +0.001628f, -0.001739f, +0.004474f, -0.001281f, +0.001671f, -0.000722f, -0.001410f, +0.002646f, +0.000040f, + -0.000550f, -0.000772f, +0.001674f, -0.001039f, -0.000094f, +0.000779f, +0.001056f, -0.000414f, -0.001239f, -0.000542f, + +0.000317f, -0.000345f, +0.000227f, -0.000870f, +0.001021f, +0.000191f, -0.000688f, +0.001143f, -0.000361f, +0.000302f, + -0.000810f, -0.000602f, +0.000090f, +0.000117f, -0.000190f, -0.000025f, +0.000080f, -0.000517f, +0.000530f, -0.000534f, + -0.000202f, -0.000012f, -0.000309f, +0.000329f, +0.000161f, +0.000051f + }, + { + +0.002497f, -0.064104f, -0.013645f, -0.003427f, -0.001180f, +0.000173f, -0.002521f, -0.005470f, +0.004389f, +0.000417f, + +0.005581f, +0.017056f, +0.001470f, -0.004699f, -0.022171f, +0.023864f, -0.010528f, -0.036282f, -0.005032f, +0.019366f, + -0.012232f, -0.007472f, +0.012392f, -0.002247f, +0.005325f, +0.006425f, +0.013093f, -0.006133f, +0.002015f, -0.003205f, + +0.005426f, -0.008275f, -0.011415f, -0.002235f, -0.005610f, -0.001759f, +0.008616f, -0.006583f, -0.000791f, +0.007553f, + +0.001406f, -0.000635f, -0.000818f, -0.000762f, +0.002335f, +0.002387f, -0.002705f, -0.001124f, -0.003518f, +0.000287f, + -0.000604f, +0.003793f, -0.000947f, +0.000906f, -0.000886f, -0.000228f, +0.000180f, -0.001686f, +0.000059f, -0.002995f, + +0.000527f, +0.002869f, -0.000872f, +0.001150f, +0.000882f, -0.000541f, -0.000537f, -0.000120f, +0.001041f, -0.001682f, + +0.000844f, -0.000709f, -0.000442f, -0.000520f, -0.000896f, +0.000080f, -0.000166f, -0.000557f, +0.001082f, -0.000237f, + +0.000081f, -0.000672f, +0.000335f, -0.000174f, +0.000409f, -0.000890f, +0.000902f, +0.000588f, -0.000190f, +0.000588f, + -0.000405f, +0.000336f, +0.000075f, -0.000312f, +0.000035f, -0.000523f + }, + { + -0.042007f, +0.349854f, -0.025528f, +0.008216f, +0.002721f, +0.001695f, -0.000794f, -0.002855f, -0.007302f, -0.008924f, + -0.024583f, -0.000421f, -0.014237f, +0.003244f, +0.003044f, +0.005155f, +0.010314f, +0.002952f, -0.005781f, -0.000718f, + +0.001350f, -0.006988f, -0.001704f, -0.008534f, +0.001333f, -0.006347f, -0.001723f, +0.004406f, -0.001491f, -0.002020f, + +0.000900f, -0.000655f, +0.011600f, +0.004309f, -0.005825f, +0.000385f, -0.004291f, +0.001602f, +0.008634f, +0.000901f, + +0.001712f, +0.000705f, +0.000300f, -0.000869f, -0.002703f, +0.004167f, +0.000535f, +0.000918f, +0.004712f, -0.000660f, + -0.000053f, -0.004227f, +0.000775f, -0.004998f, +0.002930f, -0.000650f, -0.001990f, -0.002586f, -0.002476f, +0.001421f, + +0.003149f, -0.001350f, +0.002220f, +0.002160f, +0.000939f, -0.001479f, -0.000002f, +0.000712f, +0.001891f, +0.001049f, + +0.001408f, +0.000201f, +0.001211f, +0.000540f, -0.000139f, -0.000500f, -0.000997f, -0.000245f, +0.000942f, +0.000624f, + +0.000804f, +0.000369f, -0.000504f, +0.000222f, -0.000405f, -0.000224f, -0.000536f, -0.000739f, -0.000395f, -0.000557f, + +0.000176f, -0.000376f, +0.000193f, +0.000646f, +0.000130f, -0.000296f + }, + { + -0.000465f, +0.010023f, +0.005075f, +0.003550f, +0.000852f, -0.001345f, -0.001364f, +0.002342f, -0.000246f, -0.000452f, + -0.001518f, -0.004659f, -0.002353f, +0.003874f, -0.016011f, +0.006221f, +0.018391f, +0.006300f, +0.014450f, -0.014233f, + -0.001231f, -0.010807f, -0.014693f, +0.002709f, -0.001792f, +0.005864f, -0.005703f, -0.003509f, +0.004682f, +0.001936f, + -0.003229f, -0.008845f, +0.006368f, -0.011039f, +0.002346f, +0.001616f, -0.007933f, -0.003356f, -0.004071f, -0.001094f, + -0.001532f, +0.002918f, +0.001100f, +0.000827f, -0.001712f, -0.001848f, -0.002527f, +0.000468f, -0.002019f, +0.000556f, + +0.002262f, +0.001705f, +0.002737f, -0.000606f, +0.001662f, +0.001369f, +0.002298f, -0.001499f, -0.001230f, +0.000495f, + -0.001632f, +0.001817f, -0.000457f, -0.000152f, -0.001111f, +0.002370f, -0.001881f, -0.000202f, +0.000359f, +0.001041f, + +0.001033f, -0.000696f, -0.000294f, +0.000828f, +0.000841f, +0.000184f, -0.001092f, +0.000333f, +0.000321f, +0.000608f, + -0.000253f, -0.000968f, +0.000369f, +0.000475f, +0.000603f, +0.000516f, +0.000398f, +0.000223f, -0.000004f, +0.000664f, + -0.000056f, -0.000579f, -0.000125f, +0.000382f, -0.000512f, -0.000292f + }, + { + +0.011989f, -0.361140f, +0.028996f, -0.027567f, +0.000099f, +0.000548f, +0.012707f, +0.004088f, +0.018234f, +0.007843f, + -0.003417f, +0.001990f, -0.002703f, -0.005127f, -0.015473f, -0.002378f, -0.007082f, +0.004310f, -0.014292f, -0.008572f, + -0.002711f, -0.003655f, -0.011003f, -0.007084f, -0.005928f, -0.003338f, +0.003719f, -0.006085f, +0.001017f, -0.003128f, + +0.008222f, -0.003040f, -0.003061f, -0.007725f, -0.006134f, -0.010153f, -0.011427f, +0.000879f, -0.003081f, -0.006313f, + +0.003202f, -0.002522f, +0.003231f, -0.000522f, +0.001575f, +0.002447f, -0.000709f, -0.000960f, +0.003002f, -0.002460f, + -0.000704f, -0.000681f, -0.003443f, +0.002232f, -0.001863f, +0.002829f, -0.000033f, +0.000937f, +0.002996f, -0.000572f, + +0.001592f, +0.001883f, -0.000037f, +0.000048f, +0.000255f, +0.002830f, -0.000444f, +0.001070f, +0.001223f, +0.001455f, + -0.000995f, +0.000047f, +0.000306f, -0.000725f, +0.000335f, +0.000915f, -0.000010f, +0.000020f, -0.000052f, +0.000267f, + -0.000030f, -0.000250f, -0.001425f, +0.000140f, +0.001169f, -0.000250f, -0.000184f, +0.000179f, -0.000105f, -0.000153f, + +0.000404f, -0.000020f, -0.000030f, -0.000014f, -0.000009f, -0.000039f + }, + { + -0.000472f, -0.006253f, -0.007169f, -0.002107f, -0.002462f, +0.003239f, +0.000852f, -0.000620f, -0.007788f, -0.000917f, + +0.007929f, +0.007531f, +0.010089f, -0.014739f, -0.012205f, +0.015578f, +0.023368f, +0.002731f, +0.005027f, +0.001022f, + -0.005337f, +0.011002f, -0.008717f, +0.007872f, +0.003893f, +0.017224f, +0.018911f, -0.010942f, -0.012575f, -0.001808f, + -0.002158f, -0.009187f, +0.002603f, -0.007209f, -0.000220f, -0.001890f, -0.005600f, -0.004379f, +0.000599f, +0.002615f, + -0.005019f, +0.000436f, +0.000886f, +0.000797f, -0.002084f, +0.004263f, +0.000577f, +0.003574f, -0.002803f, +0.004217f, + +0.001572f, +0.001429f, +0.001371f, +0.002367f, -0.004170f, +0.000832f, +0.002084f, -0.004017f, +0.000024f, +0.001031f, + +0.000993f, -0.000178f, +0.000319f, +0.000806f, -0.000479f, +0.000696f, +0.000390f, +0.000496f, +0.000182f, -0.000592f, + +0.001069f, +0.001100f, +0.001572f, +0.000196f, -0.000139f, +0.000369f, -0.000224f, +0.000313f, +0.000209f, +0.000528f, + +0.000515f, -0.000707f, -0.000030f, +0.000580f, -0.000517f, -0.000417f, +0.000092f, +0.000391f, -0.000665f, -0.000170f, + -0.000117f, -0.000481f, -0.000501f, -0.000026f, -0.000091f, +0.000155f + }, + { + -0.015271f, -0.326931f, +0.079821f, +0.030574f, +0.019425f, -0.063354f, -0.008609f, +0.005508f, +0.017993f, -0.003790f, + -0.001358f, +0.018913f, +0.013488f, -0.001080f, +0.001778f, -0.014184f, -0.002603f, +0.004115f, -0.010347f, +0.006643f, + +0.000627f, -0.005546f, -0.005746f, -0.003556f, -0.015233f, +0.001477f, +0.004922f, +0.003690f, -0.003119f, +0.000588f, + +0.010735f, -0.002994f, +0.001049f, +0.003548f, +0.001587f, +0.011258f, +0.004948f, +0.007414f, -0.003284f, -0.000913f, + -0.002209f, +0.004420f, +0.002227f, -0.000810f, +0.006806f, -0.002360f, +0.001010f, -0.003319f, -0.002116f, +0.001625f, + +0.003006f, -0.000978f, -0.002755f, +0.000282f, +0.000656f, -0.001061f, -0.001561f, +0.000553f, +0.001258f, -0.001983f, + +0.000090f, -0.001413f, -0.001827f, +0.000260f, -0.002095f, -0.002676f, +0.000591f, -0.000438f, -0.001451f, +0.001629f, + +0.000519f, +0.000730f, +0.000463f, +0.000395f, -0.000985f, +0.000702f, +0.000360f, +0.000120f, +0.001348f, -0.000116f, + +0.001373f, -0.000181f, +0.000112f, -0.000530f, +0.000139f, -0.000021f, +0.000602f, -0.000126f, +0.000023f, -0.000039f, + -0.000032f, +0.000411f, +0.000174f, -0.000356f, +0.000261f, +0.000472f + }, + { + +0.000047f, -0.059247f, -0.015463f, +0.003578f, +0.000723f, -0.005664f, -0.010852f, -0.001554f, +0.003944f, -0.002401f, + -0.004526f, +0.000942f, +0.003007f, -0.007197f, +0.006890f, -0.013324f, +0.015213f, -0.012114f, -0.004905f, -0.017188f, + +0.019146f, +0.000195f, -0.002907f, -0.010116f, +0.001859f, -0.008537f, -0.006965f, +0.002688f, -0.002929f, +0.009636f, + -0.003462f, -0.005807f, +0.000886f, -0.007120f, +0.000167f, +0.001496f, +0.001025f, -0.000147f, -0.005108f, +0.000652f, + +0.004207f, +0.001129f, +0.001288f, -0.001462f, -0.001865f, +0.000295f, -0.001882f, -0.002263f, -0.002698f, +0.000293f, + -0.002239f, +0.002542f, -0.000500f, -0.001120f, -0.001656f, +0.001533f, -0.002593f, -0.000234f, -0.001099f, +0.000229f, + +0.000551f, -0.000745f, -0.001324f, -0.001209f, -0.002553f, -0.000332f, +0.000405f, +0.000859f, -0.001016f, +0.000722f, + +0.001867f, +0.000156f, +0.000602f, -0.000427f, -0.000404f, -0.000464f, +0.000009f, +0.000635f, -0.001213f, +0.000250f, + +0.000087f, -0.000017f, +0.000306f, +0.000211f, +0.000153f, -0.000027f, +0.000354f, +0.000339f, +0.000026f, +0.000059f, + -0.000321f, +0.000066f, +0.000067f, +0.000036f, -0.000008f, -0.000409f + }, + { + +0.064690f, -0.147166f, -0.010311f, -0.021747f, -0.012138f, -0.001647f, +0.011045f, -0.002640f, -0.005698f, +0.015832f, + +0.010916f, +0.000548f, +0.008575f, +0.007484f, +0.031562f, +0.000656f, +0.014495f, +0.000198f, +0.001918f, -0.006098f, + -0.007082f, +0.007987f, +0.002533f, -0.000668f, +0.000480f, +0.012445f, -0.005314f, +0.003244f, +0.002604f, -0.003249f, + -0.000305f, -0.003997f, +0.000173f, +0.000852f, +0.001840f, +0.005272f, +0.005711f, +0.002378f, -0.002842f, +0.004596f, + -0.002346f, +0.004315f, +0.005022f, +0.006650f, +0.002761f, +0.001076f, +0.003658f, -0.000740f, +0.001104f, -0.001979f, + -0.000723f, +0.001107f, +0.000034f, -0.001171f, +0.001747f, +0.003397f, -0.002693f, -0.000291f, +0.000435f, -0.000750f, + +0.000918f, +0.000905f, +0.000191f, -0.000150f, +0.002400f, +0.000386f, +0.000629f, -0.000344f, +0.000987f, +0.001301f, + +0.000486f, +0.000673f, -0.000925f, -0.000804f, +0.001269f, +0.000809f, -0.000360f, -0.000513f, +0.000087f, -0.000379f, + +0.000485f, +0.000582f, +0.000231f, -0.000123f, +0.000061f, +0.000331f, -0.000070f, +0.000066f, -0.000282f, +0.000547f, + +0.000220f, +0.000002f, -0.000132f, +0.000139f, -0.000088f, +0.000215f + }, + { + +0.002160f, +0.001244f, -0.030686f, -0.013435f, -0.012040f, +0.002206f, +0.000173f, -0.004756f, -0.008096f, +0.002150f, + -0.010318f, -0.008344f, -0.022092f, +0.006419f, +0.018433f, -0.002037f, -0.004103f, +0.003713f, +0.010009f, -0.001730f, + -0.007558f, +0.026362f, +0.027689f, -0.029541f, +0.011342f, +0.001996f, +0.014570f, -0.000824f, +0.008369f, -0.002941f, + -0.001152f, +0.005523f, -0.003525f, +0.001297f, +0.001621f, -0.004933f, +0.002233f, -0.000255f, -0.000268f, +0.001132f, + +0.002350f, -0.001116f, -0.002031f, +0.002344f, +0.000049f, -0.001142f, -0.003429f, -0.004697f, +0.002226f, +0.004034f, + +0.005358f, +0.001303f, -0.002302f, -0.001624f, -0.003655f, -0.002247f, -0.000626f, +0.001285f, +0.000870f, -0.000946f, + +0.001928f, -0.001137f, -0.001204f, -0.000575f, +0.000886f, +0.000002f, -0.000137f, +0.000735f, +0.000604f, -0.001097f, + +0.001757f, -0.000374f, +0.001116f, +0.000328f, +0.000831f, -0.000244f, -0.000329f, +0.000084f, +0.000307f, -0.001038f, + -0.000137f, -0.001019f, -0.000648f, -0.000005f, +0.000344f, +0.000062f, +0.000028f, -0.000168f, -0.000686f, -0.000712f, + -0.000104f, +0.000243f, -0.000135f, +0.000174f, -0.000055f, -0.000458f + }, + { + +0.038098f, +0.063004f, -0.002468f, -0.004044f, +0.022866f, +0.002589f, -0.002429f, -0.002001f, +0.024931f, -0.001785f, + -0.000557f, -0.004866f, +0.014629f, +0.000667f, +0.065596f, -0.011837f, -0.001580f, +0.002695f, +0.009147f, -0.001914f, + +0.004595f, -0.007541f, -0.000754f, +0.004635f, -0.009518f, -0.005937f, +0.000773f, -0.010773f, +0.001532f, -0.001009f, + -0.005404f, +0.000760f, +0.004486f, +0.003673f, +0.004832f, +0.000651f, +0.000190f, -0.001189f, -0.000461f, +0.000603f, + -0.000808f, -0.007540f, +0.002229f, +0.003832f, -0.000396f, -0.001750f, -0.002036f, +0.005939f, +0.000394f, -0.000641f, + +0.002309f, -0.000803f, -0.005884f, -0.002773f, -0.000722f, -0.000258f, +0.000068f, +0.000820f, +0.001540f, -0.000570f, + +0.001124f, +0.001186f, -0.000127f, +0.000548f, +0.001380f, +0.000273f, +0.000248f, -0.000248f, -0.000345f, -0.000198f, + -0.000595f, +0.002431f, -0.000886f, +0.000511f, -0.001202f, -0.000028f, -0.000400f, +0.000633f, -0.000100f, +0.000291f, + -0.000118f, -0.000399f, +0.000601f, -0.000127f, +0.000090f, -0.000143f, -0.000316f, +0.000303f, -0.000034f, +0.000262f, + -0.000160f, -0.000311f, -0.000223f, +0.000109f, -0.000268f, -0.000437f + }, + { + -0.000640f, -0.024295f, -0.005966f, +0.001442f, +0.005415f, +0.001017f, +0.001651f, -0.004018f, -0.004853f, +0.004069f, + -0.003498f, +0.008558f, -0.002070f, -0.035399f, +0.017298f, +0.009488f, +0.013035f, -0.004802f, +0.003512f, +0.004093f, + +0.002884f, -0.008647f, -0.012158f, +0.007339f, -0.009989f, +0.013208f, -0.005406f, -0.010082f, +0.000123f, -0.006214f, + -0.004545f, +0.007000f, +0.003407f, -0.007538f, +0.000999f, -0.005057f, +0.000390f, -0.003246f, -0.003446f, +0.000519f, + +0.001138f, -0.004819f, -0.003008f, -0.000159f, -0.000182f, -0.003409f, +0.002962f, -0.000009f, -0.001140f, +0.002178f, + +0.001049f, +0.000697f, -0.002385f, -0.000911f, -0.002822f, -0.000319f, -0.000014f, -0.001383f, +0.002488f, +0.000372f, + -0.000630f, -0.002285f, +0.000751f, -0.000375f, +0.000717f, -0.000347f, -0.001423f, -0.001211f, -0.000480f, -0.000662f, + +0.001892f, -0.000057f, -0.002305f, -0.000480f, -0.000284f, +0.000149f, -0.000011f, +0.000861f, +0.000537f, +0.000131f, + +0.000828f, -0.000085f, -0.000076f, +0.000019f, +0.000324f, +0.000778f, +0.000881f, +0.000720f, -0.000149f, -0.000335f, + -0.000007f, +0.000044f, -0.000211f, +0.000242f, -0.000581f, +0.000051f + } + }, + { + { + -0.020210f, +0.080710f, +0.134047f, +0.042944f, -0.005861f, +0.005076f, +0.008487f, +0.009746f, -0.008073f, +0.000270f, + -0.005781f, -0.012800f, +0.010368f, -0.008105f, -0.003132f, +0.018077f, -0.005972f, +0.008415f, +0.012013f, -0.001455f, + -0.008855f, -0.001253f, -0.002143f, -0.006189f, +0.007174f, +0.002003f, +0.002937f, +0.003062f, -0.003528f, +0.006475f, + -0.006107f, +0.005001f, +0.010767f, +0.005428f, +0.003348f, +0.007694f, -0.004558f, +0.016461f, -0.003450f, +0.003863f, + +0.000225f, -0.000875f, -0.002660f, +0.000332f, +0.004881f, -0.000158f, -0.001825f, +0.000694f, -0.000466f, -0.002390f, + +0.000163f, -0.002260f, -0.000384f, -0.000243f, +0.003968f, +0.001047f, +0.000421f, +0.002172f, +0.001218f, -0.000191f, + -0.000015f, +0.000067f, -0.000690f, -0.001301f, -0.002244f, +0.000866f, +0.000935f, -0.000963f, -0.000018f, -0.000893f, + +0.000625f, +0.000159f, -0.000374f, +0.000179f, +0.001454f, +0.000052f, +0.000194f, -0.000482f, +0.000344f, +0.000327f, + -0.000199f, -0.000134f, +0.000491f, +0.000929f, +0.000035f, +0.000484f, +0.000426f, -0.000006f, -0.000130f, +0.000201f, + +0.000111f, +0.000145f, +0.000194f, +0.000354f, -0.000346f, +0.000377f + }, + { + -0.002230f, -0.108491f, -0.023372f, +0.008367f, +0.000269f, +0.000926f, +0.001220f, +0.001483f, +0.003157f, +0.004469f, + +0.000983f, -0.000637f, -0.003169f, -0.010789f, -0.009507f, -0.006429f, -0.000773f, +0.000899f, +0.006105f, -0.009446f, + +0.009185f, -0.030058f, +0.000860f, +0.008413f, +0.010776f, +0.008838f, -0.010527f, -0.020148f, -0.001504f, -0.001544f, + -0.005903f, +0.005534f, +0.002258f, -0.000510f, +0.003219f, +0.006235f, +0.008568f, +0.003558f, -0.000403f, +0.004200f, + -0.001441f, -0.001111f, +0.005856f, -0.001213f, -0.001590f, +0.002859f, +0.000605f, -0.000337f, -0.001686f, -0.002315f, + +0.000845f, -0.000522f, +0.000091f, -0.001173f, +0.001287f, -0.000980f, +0.001736f, -0.001441f, -0.000280f, -0.002167f, + -0.000328f, -0.000358f, -0.000733f, +0.000165f, +0.000121f, +0.001132f, +0.000515f, +0.000172f, +0.000619f, -0.000095f, + +0.000127f, +0.000010f, +0.000235f, +0.000682f, -0.000061f, +0.000430f, -0.000065f, -0.000249f, -0.000175f, +0.001054f, + +0.000030f, +0.000404f, -0.000347f, +0.000591f, -0.000378f, -0.000103f, +0.000024f, +0.000438f, +0.000806f, -0.000021f, + +0.000366f, +0.000141f, -0.000297f, -0.000227f, -0.000125f, +0.000116f + }, + { + +0.009798f, +0.143870f, -0.032784f, -0.003824f, +0.003458f, -0.000192f, +0.008552f, -0.002575f, -0.001332f, +0.009559f, + -0.024206f, -0.003519f, +0.009327f, -0.000108f, -0.007036f, -0.017881f, +0.004922f, -0.013729f, -0.001329f, -0.005379f, + +0.001410f, -0.013391f, +0.011156f, +0.003402f, +0.000986f, +0.001814f, +0.014238f, -0.001861f, +0.002145f, -0.003692f, + +0.004246f, -0.001590f, +0.006202f, +0.000426f, +0.002091f, +0.002308f, -0.003907f, -0.001956f, -0.008051f, +0.001643f, + +0.008494f, -0.003960f, +0.007187f, -0.002767f, +0.003854f, -0.000413f, +0.003108f, +0.001045f, +0.003438f, -0.000435f, + -0.000565f, +0.002276f, +0.001499f, -0.000500f, -0.001570f, -0.000240f, -0.000745f, -0.000548f, +0.001508f, -0.000034f, + -0.000679f, -0.001579f, +0.002479f, -0.001017f, +0.000804f, -0.000331f, -0.001096f, +0.000125f, +0.000471f, -0.001404f, + +0.000405f, +0.000724f, -0.000142f, -0.000580f, -0.000500f, -0.001048f, -0.000120f, +0.000116f, +0.000092f, -0.000044f, + +0.000511f, -0.000229f, +0.000358f, -0.000135f, +0.000239f, -0.000909f, -0.000370f, +0.000251f, +0.001139f, +0.000111f, + -0.000199f, +0.000286f, -0.000117f, -0.000336f, -0.000383f, +0.000176f + }, + { + +0.020528f, +0.320851f, -0.024521f, +0.008314f, +0.005406f, -0.000887f, +0.006708f, -0.007301f, -0.003299f, -0.007550f, + +0.005926f, +0.000075f, -0.004312f, +0.005164f, +0.008420f, -0.005087f, +0.001820f, -0.012940f, -0.011335f, +0.003429f, + -0.006818f, +0.002538f, -0.007026f, -0.000249f, -0.007633f, +0.002752f, +0.002066f, -0.004456f, +0.004071f, +0.004070f, + +0.002348f, +0.008173f, -0.003134f, +0.000360f, -0.000433f, -0.008746f, +0.003215f, -0.000912f, +0.002685f, -0.001933f, + +0.001696f, -0.000668f, +0.004449f, -0.001954f, +0.003534f, +0.001444f, -0.000272f, +0.000254f, -0.002777f, +0.002728f, + -0.001328f, -0.000616f, -0.004096f, +0.002980f, -0.002329f, +0.001313f, +0.000520f, -0.003812f, +0.000957f, -0.000460f, + -0.001778f, -0.000762f, +0.001567f, -0.000280f, +0.000394f, +0.000004f, +0.000688f, -0.000400f, -0.000967f, -0.000820f, + -0.000501f, -0.001520f, +0.000401f, -0.000896f, +0.000428f, +0.000007f, -0.000056f, +0.001018f, -0.000161f, +0.001194f, + -0.000049f, -0.000003f, +0.000316f, +0.000441f, -0.000011f, +0.000228f, +0.000166f, -0.000483f, +0.000823f, -0.000303f, + -0.000222f, -0.000092f, +0.000093f, +0.000165f, -0.000171f, -0.000014f + }, + { + -0.002977f, -0.028497f, +0.020841f, -0.002274f, -0.000703f, +0.000346f, -0.000691f, -0.004266f, +0.001973f, -0.003060f, + -0.001907f, +0.007021f, -0.000514f, +0.001910f, -0.050393f, +0.006162f, +0.031389f, +0.055329f, +0.031721f, +0.009338f, + -0.008808f, -0.010934f, +0.013663f, -0.002039f, +0.000657f, -0.004009f, +0.010910f, -0.009194f, +0.006852f, -0.004977f, + +0.004623f, +0.003861f, +0.003003f, +0.009095f, +0.002517f, +0.002195f, +0.007429f, -0.010791f, -0.004793f, +0.006143f, + -0.000303f, +0.000690f, +0.001449f, +0.000727f, +0.003714f, +0.000458f, -0.002610f, +0.003168f, -0.001498f, +0.003801f, + -0.001491f, -0.002360f, -0.003704f, +0.000035f, -0.002032f, -0.000414f, -0.001091f, -0.002052f, +0.002502f, +0.000312f, + -0.001709f, +0.000133f, -0.002009f, -0.001236f, +0.000305f, -0.000063f, -0.001156f, +0.000042f, +0.001862f, -0.000995f, + +0.000605f, -0.000724f, -0.000226f, +0.000499f, -0.000015f, +0.000164f, -0.000403f, -0.000220f, +0.001190f, -0.000278f, + +0.000121f, -0.001052f, +0.000916f, +0.000229f, +0.000137f, -0.000858f, +0.000352f, -0.000131f, -0.000168f, +0.000433f, + -0.000203f, +0.000173f, -0.000007f, -0.000377f, -0.000166f, -0.000202f + }, + { + -0.003806f, +0.432293f, +0.004027f, -0.002722f, -0.009735f, +0.001964f, +0.007868f, +0.005030f, +0.000705f, +0.007285f, + -0.021715f, -0.000640f, -0.007498f, +0.005838f, -0.000474f, +0.002938f, +0.000901f, -0.001982f, +0.000069f, +0.002631f, + +0.010278f, +0.000644f, -0.001084f, -0.009843f, +0.000210f, -0.002200f, +0.002333f, +0.006316f, +0.002373f, +0.001364f, + +0.001384f, -0.004770f, +0.006443f, +0.003430f, -0.005812f, +0.001527f, +0.000043f, +0.003016f, +0.003983f, -0.000728f, + +0.004421f, -0.000538f, -0.005307f, -0.000110f, -0.001889f, +0.000244f, +0.000890f, +0.001910f, +0.005226f, +0.003224f, + +0.002817f, -0.003939f, +0.001955f, -0.002162f, -0.000278f, -0.002222f, -0.000795f, -0.000907f, -0.000432f, +0.000839f, + +0.002132f, -0.001403f, +0.000774f, -0.001014f, -0.000512f, +0.000020f, +0.001111f, -0.000712f, -0.000248f, -0.000174f, + +0.000284f, -0.001154f, +0.000250f, +0.000903f, -0.000074f, -0.000031f, -0.000886f, +0.000070f, +0.001509f, -0.000651f, + -0.000829f, +0.000434f, +0.000034f, +0.000975f, +0.000072f, +0.000318f, -0.000306f, -0.000027f, +0.000406f, -0.000210f, + +0.000368f, -0.000218f, -0.000295f, -0.000079f, +0.000073f, -0.000018f + }, + { + +0.001179f, +0.005066f, -0.004542f, +0.001185f, +0.000441f, -0.000504f, -0.000466f, +0.001405f, -0.003142f, +0.001430f, + +0.006045f, +0.000395f, -0.003869f, +0.003626f, -0.010518f, +0.008071f, +0.005706f, -0.003236f, +0.007381f, -0.008783f, + +0.015617f, -0.003777f, -0.029420f, -0.006750f, +0.002920f, +0.000867f, +0.009832f, +0.005392f, +0.003743f, +0.004026f, + +0.003477f, +0.003986f, +0.003664f, -0.009189f, +0.008957f, +0.001076f, -0.006584f, -0.003750f, -0.003713f, +0.001422f, + -0.002656f, +0.001676f, +0.000173f, -0.001137f, -0.000122f, -0.001459f, -0.004929f, -0.001460f, -0.003282f, -0.000284f, + +0.000249f, -0.000797f, +0.003123f, -0.001830f, -0.000687f, -0.000224f, +0.001274f, -0.002542f, -0.000094f, +0.001922f, + -0.001663f, +0.002205f, -0.000206f, +0.000193f, -0.000822f, +0.001977f, -0.000539f, +0.001650f, -0.000135f, -0.000362f, + +0.001386f, +0.000400f, -0.000711f, -0.000263f, +0.000598f, +0.000767f, -0.000519f, +0.000504f, +0.000120f, -0.000267f, + +0.000286f, +0.000011f, -0.000062f, -0.000514f, -0.000139f, +0.000108f, +0.000108f, +0.000250f, -0.000078f, +0.000106f, + -0.000079f, -0.000196f, -0.000005f, +0.000052f, -0.000599f, -0.000278f + }, + { + +0.022905f, -0.411784f, -0.009458f, -0.015829f, +0.003434f, -0.001995f, +0.002427f, -0.006243f, +0.007922f, +0.003004f, + +0.004650f, +0.005162f, -0.003032f, +0.029972f, +0.021684f, +0.000900f, -0.003488f, +0.002642f, -0.003662f, +0.005165f, + +0.007588f, +0.001101f, -0.008567f, -0.004417f, -0.000589f, -0.002652f, +0.004509f, -0.002139f, +0.006858f, +0.001714f, + +0.000900f, -0.003861f, +0.003970f, +0.000835f, +0.000201f, -0.006022f, -0.007035f, +0.004738f, +0.003047f, -0.002396f, + +0.001920f, -0.003822f, +0.006876f, +0.002227f, +0.000129f, -0.004447f, -0.002779f, -0.002884f, -0.000336f, +0.000545f, + +0.002079f, -0.001567f, -0.003830f, +0.003687f, -0.000888f, +0.002897f, +0.000823f, +0.000094f, +0.000106f, -0.002268f, + +0.000460f, +0.000529f, -0.000380f, -0.001299f, -0.001978f, +0.001531f, -0.000322f, +0.000683f, +0.000052f, +0.000649f, + -0.001025f, -0.000779f, +0.000039f, -0.000127f, +0.000308f, +0.000440f, +0.000038f, -0.000067f, -0.000215f, +0.000578f, + +0.000364f, +0.000214f, -0.000856f, +0.000026f, +0.000577f, +0.000077f, -0.000052f, +0.000148f, +0.000165f, -0.000239f, + +0.000444f, +0.000164f, -0.000540f, -0.000272f, +0.000139f, -0.000097f + }, + { + +0.001471f, +0.008540f, +0.001637f, +0.000145f, -0.001429f, +0.002493f, +0.001617f, +0.000589f, -0.006637f, +0.000347f, + +0.004825f, -0.002816f, +0.005657f, +0.002139f, -0.010831f, -0.004407f, -0.011000f, -0.019888f, +0.007505f, -0.007143f, + -0.016991f, +0.009874f, -0.006498f, +0.009180f, -0.005848f, -0.012969f, +0.006596f, -0.006208f, -0.008722f, -0.007658f, + +0.005772f, -0.003021f, -0.001254f, +0.003683f, +0.008040f, -0.000430f, -0.001257f, +0.002485f, +0.003949f, +0.007250f, + -0.002182f, -0.004972f, -0.003298f, +0.002563f, +0.000081f, +0.004184f, +0.002295f, +0.001736f, -0.006055f, +0.003480f, + +0.000258f, +0.000026f, +0.000806f, +0.002915f, -0.003490f, +0.001021f, +0.001968f, -0.003621f, +0.000107f, +0.000659f, + -0.000406f, -0.002289f, -0.000336f, -0.000577f, -0.002179f, +0.000103f, +0.000185f, +0.000182f, -0.000518f, -0.001510f, + +0.000399f, -0.000782f, -0.000187f, -0.000454f, -0.000825f, -0.000211f, -0.000495f, -0.000027f, -0.001049f, +0.000148f, + +0.000405f, -0.000220f, +0.000301f, +0.000409f, -0.000517f, -0.000048f, -0.000035f, +0.000201f, -0.000621f, -0.000125f, + +0.000346f, +0.000004f, +0.000072f, +0.000386f, -0.000221f, -0.000006f + }, + { + +0.013075f, -0.318201f, +0.038165f, -0.013414f, +0.004767f, -0.029025f, +0.015791f, -0.003999f, +0.006311f, -0.011282f, + -0.006004f, +0.010671f, +0.006676f, -0.004888f, +0.004275f, -0.014106f, -0.007590f, -0.005524f, -0.017842f, +0.002592f, + +0.003785f, -0.005465f, -0.010547f, -0.002593f, -0.004543f, -0.001907f, -0.000273f, +0.003802f, -0.003599f, +0.002721f, + +0.011757f, +0.006107f, -0.001004f, -0.000320f, -0.000873f, +0.000871f, -0.003056f, +0.004132f, -0.004163f, +0.009367f, + -0.001193f, -0.002059f, +0.001634f, -0.000416f, +0.006692f, -0.003102f, -0.000055f, -0.002298f, +0.000146f, +0.000632f, + +0.000111f, -0.000456f, -0.000886f, +0.000963f, +0.001796f, -0.000869f, -0.002921f, -0.000903f, +0.001641f, -0.003675f, + +0.000743f, -0.001268f, -0.003086f, +0.002101f, +0.000082f, -0.001943f, -0.000114f, +0.000564f, -0.001535f, +0.000344f, + -0.001138f, +0.000698f, +0.000681f, -0.000760f, -0.001602f, +0.000124f, -0.000039f, -0.000194f, +0.000954f, -0.000319f, + +0.001244f, -0.000093f, +0.000174f, -0.000581f, +0.000065f, -0.000195f, +0.000500f, +0.000240f, +0.000007f, -0.000220f, + +0.000036f, -0.000073f, +0.000459f, -0.000213f, -0.000071f, +0.000131f + }, + { + -0.000761f, -0.055112f, -0.008907f, +0.006234f, -0.001005f, -0.003364f, -0.003220f, +0.003969f, +0.005714f, -0.001000f, + -0.003231f, +0.003752f, +0.012067f, +0.005108f, +0.013890f, -0.011480f, +0.012319f, -0.015337f, +0.001120f, -0.021046f, + +0.016491f, -0.001544f, -0.000276f, -0.002602f, +0.003855f, +0.009148f, -0.001953f, +0.000691f, -0.001725f, +0.001463f, + -0.006847f, -0.007109f, +0.004080f, -0.003979f, -0.001092f, -0.002151f, +0.002577f, +0.005598f, +0.001330f, +0.003101f, + +0.003520f, +0.002087f, +0.002588f, +0.000438f, -0.000037f, +0.000886f, -0.001378f, -0.000401f, -0.001780f, +0.001656f, + -0.003352f, +0.001569f, -0.000623f, -0.001104f, -0.001446f, +0.003286f, -0.002153f, -0.002092f, -0.001442f, -0.000699f, + +0.001095f, +0.000474f, -0.001171f, +0.001101f, +0.000245f, +0.000048f, +0.000296f, +0.000578f, -0.001354f, -0.000205f, + +0.000881f, -0.000261f, -0.000312f, -0.000471f, -0.000002f, -0.000162f, -0.000321f, +0.000663f, -0.000509f, +0.000205f, + +0.000137f, +0.000419f, -0.000033f, -0.000146f, +0.000002f, +0.000199f, +0.000333f, +0.000309f, -0.000249f, +0.000030f, + -0.000559f, -0.000326f, -0.000264f, -0.000192f, +0.000006f, -0.000547f + }, + { + -0.024163f, -0.216371f, +0.044814f, -0.008236f, -0.007880f, -0.008576f, +0.002167f, -0.010117f, -0.007201f, +0.005088f, + -0.007423f, -0.009104f, +0.013586f, +0.012252f, +0.022825f, -0.009884f, +0.006878f, -0.000006f, +0.008192f, -0.007756f, + -0.006218f, +0.007658f, -0.005867f, -0.005288f, -0.002782f, +0.004625f, -0.002919f, +0.000383f, -0.001691f, -0.001967f, + +0.004405f, +0.001680f, -0.001651f, +0.002129f, -0.000329f, -0.005498f, +0.000022f, +0.002384f, -0.000427f, +0.003729f, + -0.000915f, +0.002156f, -0.006886f, -0.002761f, +0.001349f, -0.000263f, +0.001141f, -0.004112f, +0.000880f, -0.000383f, + +0.000838f, +0.000594f, +0.000046f, +0.000481f, +0.000003f, +0.000749f, -0.003839f, +0.000245f, +0.000856f, -0.001172f, + -0.003182f, -0.001467f, +0.000049f, -0.000932f, +0.001404f, +0.000501f, +0.000897f, +0.000262f, +0.001408f, +0.001315f, + +0.000308f, +0.000049f, -0.000915f, -0.000426f, +0.000813f, +0.000633f, +0.000236f, -0.000147f, -0.000477f, +0.000239f, + +0.001053f, +0.000983f, +0.000407f, -0.000428f, -0.000480f, -0.000044f, -0.000276f, -0.000029f, +0.000095f, +0.001024f, + +0.000389f, +0.000015f, -0.000020f, +0.000322f, -0.000151f, +0.000030f + }, + { + -0.002341f, +0.022747f, -0.000169f, +0.003809f, -0.011431f, -0.000359f, -0.001136f, +0.001091f, +0.001140f, +0.006697f, + -0.001938f, -0.004524f, +0.020791f, +0.051624f, +0.003124f, -0.009457f, +0.002729f, +0.012685f, +0.014904f, +0.005657f, + -0.010721f, +0.024581f, +0.041126f, -0.031822f, -0.005018f, -0.004889f, +0.013663f, -0.007902f, -0.008398f, -0.006439f, + -0.001424f, +0.003525f, -0.006221f, -0.001703f, +0.004404f, -0.007110f, +0.002832f, +0.001078f, -0.005485f, -0.001050f, + +0.001438f, +0.001483f, +0.003222f, +0.000815f, -0.001731f, -0.001204f, -0.003184f, -0.000779f, +0.002018f, +0.000190f, + +0.001859f, +0.001936f, -0.001480f, -0.001270f, -0.002493f, -0.002154f, -0.002190f, +0.001238f, +0.001389f, -0.001199f, + +0.001605f, -0.000177f, +0.000289f, -0.000959f, +0.000090f, +0.000334f, -0.000340f, +0.000043f, -0.000310f, -0.000500f, + +0.001373f, -0.000968f, +0.000145f, +0.000312f, +0.000688f, -0.000185f, +0.000155f, -0.000367f, +0.000317f, -0.000746f, + -0.000161f, -0.000065f, +0.000178f, +0.000255f, +0.000331f, -0.000011f, +0.000387f, +0.000044f, -0.000617f, -0.000608f, + +0.000158f, +0.000565f, -0.000033f, +0.000244f, +0.000287f, +0.000092f + }, + { + -0.037066f, -0.039013f, -0.003781f, -0.009670f, -0.000597f, -0.001216f, +0.003402f, -0.008995f, +0.025002f, -0.001416f, + +0.009693f, -0.000527f, +0.009757f, -0.043675f, +0.013758f, +0.000815f, +0.012772f, +0.002921f, +0.003496f, -0.004792f, + +0.005641f, -0.004531f, -0.002073f, +0.000615f, -0.007136f, -0.000301f, +0.002112f, -0.012820f, +0.002209f, +0.000940f, + +0.001376f, +0.001123f, +0.004419f, +0.004377f, -0.000232f, -0.002119f, +0.001744f, +0.000321f, -0.000804f, -0.001566f, + -0.001142f, -0.006323f, -0.003596f, -0.004211f, -0.002556f, +0.000264f, -0.000434f, +0.002500f, -0.003645f, -0.000008f, + +0.001748f, -0.001717f, -0.003143f, +0.001353f, +0.001876f, -0.001510f, -0.001119f, -0.000059f, -0.000864f, -0.001800f, + +0.000056f, +0.001352f, +0.000247f, -0.001216f, +0.000173f, +0.000537f, +0.000498f, -0.000202f, +0.000565f, +0.000257f, + -0.000546f, +0.002088f, -0.000781f, +0.001319f, -0.000888f, +0.000480f, -0.000244f, +0.000385f, +0.000196f, +0.001020f, + +0.000429f, -0.000342f, -0.000164f, -0.000499f, +0.000094f, -0.000374f, +0.000034f, +0.000350f, +0.000051f, +0.000455f, + +0.000060f, +0.000001f, +0.000128f, +0.000364f, -0.000194f, -0.000605f + }, + { + -0.000288f, -0.007050f, +0.005584f, -0.002820f, +0.001621f, -0.001506f, -0.000837f, -0.002630f, -0.004291f, +0.004076f, + -0.005596f, +0.006482f, +0.007268f, +0.035590f, +0.125959f, +0.026976f, +0.007435f, -0.002172f, +0.011383f, +0.015124f, + +0.003199f, -0.010258f, -0.015519f, +0.000723f, -0.010724f, +0.012935f, -0.006019f, -0.007918f, +0.002140f, -0.000119f, + -0.005045f, +0.003406f, +0.006192f, +0.000012f, +0.003911f, -0.003270f, +0.002041f, -0.007839f, -0.005556f, -0.000581f, + +0.001407f, -0.002243f, +0.001391f, +0.003149f, +0.002004f, -0.003722f, +0.002955f, +0.000202f, -0.000944f, +0.001524f, + -0.001213f, -0.001605f, -0.001509f, +0.001908f, +0.000529f, +0.001327f, +0.000932f, -0.002728f, +0.000914f, +0.000559f, + -0.000756f, -0.002711f, +0.001060f, -0.000414f, -0.001070f, -0.002391f, -0.001809f, +0.000356f, -0.000080f, -0.001200f, + +0.000273f, +0.000683f, -0.001680f, -0.000844f, -0.000260f, +0.000267f, -0.000038f, +0.000760f, +0.000235f, -0.000073f, + +0.000612f, -0.000165f, -0.000368f, -0.000130f, -0.000395f, +0.000323f, +0.000287f, +0.000214f, +0.000236f, +0.000262f, + +0.000459f, +0.000033f, -0.000279f, +0.000508f, -0.000295f, +0.000018f + } + }, + { + { + +0.023591f, +0.228810f, -0.004306f, +0.028723f, +0.007933f, +0.005487f, +0.005442f, +0.003351f, +0.004493f, -0.003746f, + -0.007234f, -0.003040f, -0.002289f, +0.002202f, -0.003271f, +0.017921f, -0.007510f, +0.008438f, -0.007806f, +0.011571f, + -0.007174f, -0.002774f, -0.009632f, +0.000021f, +0.003274f, +0.005498f, -0.001006f, +0.001924f, -0.000252f, +0.010370f, + -0.005089f, -0.001034f, +0.009967f, +0.003679f, +0.013264f, -0.000711f, +0.002874f, +0.007269f, +0.003514f, +0.002116f, + +0.001885f, -0.004226f, -0.003281f, +0.003373f, +0.003837f, +0.002274f, -0.000174f, -0.000784f, -0.001186f, +0.000158f, + -0.000263f, -0.000274f, +0.000715f, -0.000940f, +0.001716f, +0.000963f, +0.002585f, +0.000286f, +0.001432f, -0.000419f, + -0.000302f, +0.000644f, -0.001626f, -0.001545f, -0.001198f, -0.000160f, +0.000423f, -0.000033f, -0.000926f, +0.000035f, + -0.000911f, +0.001384f, -0.000368f, +0.000092f, +0.001252f, +0.001048f, +0.000451f, -0.000796f, -0.000674f, +0.000659f, + +0.000180f, +0.000661f, +0.000127f, +0.000183f, +0.000586f, +0.000271f, +0.000722f, +0.000209f, -0.000081f, -0.000002f, + -0.000560f, +0.000313f, +0.000456f, -0.000284f, +0.000386f, -0.000015f + }, + { + +0.000154f, -0.125189f, -0.007962f, +0.011190f, -0.000076f, -0.001134f, +0.006797f, -0.000920f, +0.005174f, +0.006322f, + -0.000387f, -0.004106f, -0.003096f, -0.011969f, +0.004687f, -0.023264f, -0.003014f, +0.010552f, -0.009918f, +0.003531f, + +0.011842f, -0.024620f, -0.006863f, +0.003586f, +0.013809f, -0.000194f, -0.003199f, -0.016796f, -0.009194f, +0.001511f, + +0.002251f, -0.001186f, -0.001411f, +0.001722f, +0.000661f, +0.009524f, +0.007208f, +0.002094f, +0.004516f, -0.002066f, + -0.000093f, +0.006293f, +0.002230f, +0.000057f, -0.007388f, +0.006013f, +0.000327f, -0.000805f, -0.003494f, -0.000781f, + +0.002171f, -0.001375f, +0.001757f, -0.002995f, +0.002869f, -0.002129f, +0.001775f, +0.000916f, -0.003438f, -0.001397f, + -0.000175f, +0.000062f, -0.000014f, -0.000362f, -0.000050f, +0.001866f, +0.001128f, +0.000304f, -0.000849f, +0.000770f, + -0.000571f, +0.000560f, +0.000053f, -0.000061f, +0.000752f, +0.000745f, -0.000497f, -0.000586f, +0.000791f, -0.000037f, + +0.000767f, -0.000197f, +0.000190f, +0.000353f, +0.000171f, -0.000528f, -0.000044f, +0.000966f, +0.000500f, +0.000361f, + -0.000112f, -0.000053f, +0.000027f, +0.000111f, -0.000155f, -0.000063f + }, + { + -0.008018f, +0.013408f, +0.068933f, +0.023311f, +0.000546f, -0.004715f, +0.004234f, +0.002848f, -0.002970f, -0.003451f, + -0.005758f, -0.004451f, +0.006001f, +0.004367f, -0.004990f, -0.024828f, +0.012956f, -0.017090f, -0.004392f, +0.007960f, + -0.009693f, -0.008064f, +0.007167f, +0.008849f, -0.000595f, +0.000445f, +0.011778f, +0.002274f, +0.002324f, +0.002417f, + +0.000158f, +0.002051f, -0.003215f, +0.004151f, +0.005697f, -0.003503f, -0.000857f, -0.005231f, -0.002516f, -0.000808f, + +0.002886f, +0.002093f, -0.000474f, +0.001628f, -0.001735f, +0.007459f, +0.000834f, +0.001329f, +0.001862f, +0.000887f, + -0.000170f, +0.000622f, +0.001965f, -0.000527f, +0.000590f, -0.001961f, -0.001130f, +0.001847f, +0.001113f, -0.001314f, + -0.000132f, +0.001043f, -0.000571f, -0.001299f, +0.001293f, -0.000082f, -0.000988f, -0.000279f, +0.000263f, -0.000628f, + -0.000215f, +0.001554f, +0.000672f, -0.000923f, -0.000910f, -0.001269f, +0.000518f, -0.000008f, -0.000224f, +0.000363f, + +0.000658f, -0.000542f, +0.000027f, +0.000115f, +0.000133f, -0.000873f, -0.000024f, +0.000353f, +0.000574f, +0.000482f, + -0.000065f, +0.000266f, -0.000398f, -0.000507f, -0.000153f, +0.000056f + }, + { + +0.014129f, +0.310063f, -0.006973f, +0.009096f, -0.007591f, +0.003474f, +0.001705f, -0.000891f, -0.008516f, -0.006094f, + -0.000865f, +0.004147f, +0.005121f, +0.008266f, -0.003646f, -0.001832f, +0.003625f, -0.025872f, -0.000000f, -0.004497f, + -0.000293f, +0.002285f, -0.006226f, -0.005441f, +0.000488f, -0.004931f, +0.001645f, -0.004057f, +0.003802f, +0.001495f, + +0.005813f, +0.008101f, -0.001385f, -0.002033f, -0.003167f, -0.005259f, +0.003092f, +0.000064f, +0.001870f, +0.000817f, + +0.002221f, -0.001620f, +0.000314f, +0.000898f, +0.003325f, -0.000789f, +0.004079f, -0.001281f, -0.001222f, +0.001581f, + -0.000581f, -0.002073f, -0.002896f, +0.001704f, +0.000330f, -0.000756f, -0.000563f, -0.002138f, +0.000331f, -0.000876f, + -0.000934f, -0.000171f, +0.001935f, -0.000248f, -0.000127f, +0.000701f, -0.000555f, +0.000648f, -0.000397f, -0.001055f, + -0.000692f, -0.001282f, +0.000185f, -0.001368f, -0.000013f, +0.000502f, +0.000431f, +0.000339f, +0.000280f, +0.000585f, + +0.000677f, +0.000047f, +0.000479f, -0.000126f, +0.000167f, +0.000441f, -0.000105f, +0.000089f, -0.000017f, +0.000132f, + +0.000160f, -0.000418f, +0.000022f, +0.000033f, +0.000103f, +0.000053f + }, + { + +0.002949f, +0.009898f, -0.015371f, +0.000958f, -0.000633f, +0.000156f, -0.001974f, -0.002007f, +0.000313f, -0.000809f, + +0.001802f, +0.002746f, -0.007868f, -0.003190f, -0.037331f, +0.004021f, +0.021735f, +0.078819f, +0.019358f, -0.004299f, + +0.004825f, -0.033705f, +0.020718f, -0.001348f, -0.003002f, -0.008132f, -0.000761f, -0.000088f, +0.004458f, -0.001785f, + +0.003276f, +0.005657f, +0.003525f, +0.008084f, +0.004187f, +0.003147f, +0.000580f, -0.007191f, -0.002737f, +0.002645f, + -0.001234f, +0.000895f, +0.002551f, -0.000077f, +0.003871f, -0.001245f, +0.001692f, +0.001198f, -0.002873f, +0.004967f, + -0.001462f, -0.003450f, -0.003574f, -0.000707f, -0.000568f, -0.001076f, -0.002797f, +0.000257f, +0.002316f, +0.001183f, + -0.002758f, -0.000869f, -0.000669f, -0.001574f, +0.000392f, +0.001266f, -0.001214f, +0.000456f, -0.000348f, +0.000659f, + -0.000495f, +0.000736f, -0.000681f, +0.000045f, -0.000616f, +0.000486f, +0.000181f, +0.000108f, +0.000632f, -0.000050f, + +0.000361f, -0.000918f, +0.000416f, +0.000428f, +0.000064f, -0.000136f, -0.000018f, -0.000294f, +0.000133f, +0.000007f, + -0.000026f, +0.000094f, +0.000263f, -0.000416f, -0.000454f, +0.000359f + }, + { + +0.054074f, +0.369927f, -0.016836f, +0.000244f, -0.005532f, +0.002072f, +0.000894f, +0.010284f, +0.002457f, +0.000363f, + -0.006014f, -0.009492f, +0.002190f, +0.005916f, -0.000356f, +0.000389f, +0.000253f, -0.000896f, -0.000670f, +0.001279f, + +0.012847f, +0.005104f, -0.005051f, -0.004987f, -0.002688f, -0.000295f, +0.003280f, -0.002694f, +0.000480f, +0.003711f, + +0.008929f, -0.003014f, +0.001384f, +0.000004f, -0.002196f, +0.001814f, -0.000921f, +0.001721f, +0.003425f, +0.003104f, + -0.000066f, -0.000537f, -0.006230f, -0.002777f, +0.001975f, -0.001480f, +0.003550f, -0.000939f, +0.003250f, +0.004097f, + +0.000250f, -0.001575f, +0.000547f, +0.001204f, -0.002966f, -0.001302f, +0.001519f, -0.000360f, +0.001677f, -0.001052f, + -0.000262f, -0.000183f, +0.001125f, -0.001574f, -0.000490f, +0.000630f, +0.000303f, +0.000072f, -0.001304f, -0.000458f, + +0.000343f, -0.000581f, +0.000044f, +0.000580f, -0.000899f, +0.000186f, -0.000109f, +0.000558f, +0.000468f, -0.000776f, + -0.001115f, +0.000077f, +0.000577f, +0.000663f, +0.000355f, +0.000168f, -0.000110f, +0.000114f, +0.000402f, +0.000322f, + -0.000014f, -0.000184f, -0.000238f, -0.000204f, +0.000012f, -0.000101f + }, + { + -0.000085f, -0.004074f, +0.006675f, -0.002459f, +0.000607f, +0.000567f, -0.001972f, +0.001596f, -0.001821f, +0.000181f, + +0.003990f, -0.002064f, +0.014129f, -0.014129f, +0.001359f, +0.008383f, -0.012206f, +0.000396f, +0.003694f, +0.000613f, + +0.010120f, +0.000027f, -0.029260f, -0.008603f, -0.005362f, +0.002676f, +0.004352f, +0.014492f, +0.001844f, +0.002267f, + +0.003073f, +0.012625f, -0.009008f, -0.000898f, +0.004031f, +0.005775f, -0.004863f, -0.001536f, -0.001768f, -0.001846f, + +0.001406f, -0.001469f, -0.000420f, -0.001087f, -0.000640f, -0.001184f, -0.003339f, -0.001892f, -0.002689f, -0.001466f, + -0.000057f, -0.000938f, +0.003455f, -0.001373f, -0.000158f, +0.000591f, -0.000958f, -0.000737f, +0.001884f, +0.000776f, + -0.000924f, +0.000560f, -0.000584f, -0.000648f, +0.000957f, -0.000659f, +0.000586f, +0.001188f, +0.000429f, +0.000072f, + +0.000415f, +0.000381f, +0.000457f, -0.000013f, -0.000213f, +0.000729f, -0.000440f, +0.000608f, +0.000170f, +0.000127f, + -0.000206f, +0.000604f, -0.000293f, -0.000260f, -0.000461f, -0.000170f, +0.000372f, +0.000029f, -0.000269f, -0.000152f, + -0.000141f, -0.000071f, -0.000249f, -0.000003f, -0.000320f, -0.000243f + }, + { + -0.054152f, -0.350359f, +0.018922f, -0.005012f, -0.003744f, -0.001240f, -0.004088f, +0.002172f, -0.007133f, +0.008238f, + +0.007132f, +0.001682f, +0.003391f, +0.011946f, +0.038365f, -0.001582f, +0.000658f, +0.003481f, -0.004140f, +0.012574f, + +0.003489f, -0.003385f, -0.003481f, +0.003005f, -0.005345f, -0.003096f, +0.000839f, +0.007637f, +0.001726f, +0.004613f, + -0.004602f, +0.006788f, -0.006792f, +0.001441f, +0.006420f, -0.014723f, +0.005108f, -0.002942f, +0.001635f, +0.005839f, + -0.002221f, -0.001863f, +0.005197f, +0.002513f, +0.003330f, -0.007510f, -0.004190f, +0.001190f, -0.002118f, +0.001281f, + +0.000404f, -0.002575f, -0.002988f, +0.002144f, +0.003399f, +0.000993f, +0.000580f, -0.000613f, -0.000176f, -0.002204f, + -0.000590f, -0.000142f, +0.000446f, -0.000630f, -0.001701f, +0.000717f, +0.000506f, +0.000482f, +0.000103f, -0.000385f, + -0.000323f, -0.000469f, +0.000045f, +0.000341f, +0.000401f, -0.000336f, +0.000303f, +0.000359f, +0.000026f, +0.000250f, + +0.000538f, -0.000220f, -0.000521f, -0.000330f, -0.000018f, +0.000826f, -0.000312f, +0.000389f, +0.000012f, +0.000075f, + -0.000181f, +0.000475f, -0.000371f, -0.000279f, +0.000183f, -0.000239f + }, + { + +0.000548f, +0.006137f, +0.009450f, -0.001450f, +0.001754f, +0.000813f, +0.000212f, -0.002358f, +0.000511f, +0.000780f, + -0.000462f, +0.000970f, +0.002235f, -0.001525f, -0.007862f, -0.002333f, -0.024877f, -0.005406f, -0.005569f, -0.008434f, + -0.007468f, +0.004537f, +0.008427f, -0.013682f, +0.010037f, -0.017569f, -0.012176f, +0.011566f, -0.011741f, -0.010629f, + +0.008508f, -0.001730f, -0.002325f, +0.004269f, +0.005283f, +0.005019f, -0.003092f, +0.003917f, +0.002030f, +0.005165f, + +0.000185f, -0.005279f, -0.001862f, +0.001910f, +0.003035f, +0.001577f, +0.003029f, -0.001382f, -0.001019f, +0.000542f, + -0.000509f, +0.000075f, +0.000572f, +0.001377f, -0.000695f, +0.000702f, +0.000358f, -0.000305f, -0.002648f, -0.000301f, + +0.000149f, -0.000705f, -0.000750f, -0.001133f, -0.002502f, +0.000179f, -0.000155f, +0.000360f, +0.000342f, -0.002756f, + +0.000296f, -0.001830f, -0.000192f, +0.000064f, -0.001142f, -0.000217f, -0.000799f, +0.000277f, -0.000953f, +0.000259f, + +0.000139f, -0.000090f, +0.000166f, +0.000177f, -0.000697f, +0.000165f, +0.000123f, +0.000263f, -0.000492f, +0.000003f, + +0.000249f, +0.000276f, +0.000074f, +0.000503f, -0.000184f, -0.000055f + }, + { + -0.009560f, -0.267454f, -0.006743f, -0.003973f, -0.007910f, +0.000202f, -0.001483f, +0.006833f, -0.011083f, -0.000192f, + -0.002682f, +0.002472f, +0.007210f, +0.000144f, -0.010385f, +0.000614f, -0.013306f, -0.013515f, +0.008423f, -0.020252f, + +0.003756f, +0.000316f, -0.007767f, -0.005668f, +0.005810f, -0.007014f, -0.002647f, +0.002047f, -0.005650f, +0.006244f, + +0.009683f, +0.010647f, -0.004215f, -0.003460f, +0.004441f, -0.008740f, +0.001031f, +0.004321f, -0.000081f, +0.008903f, + -0.002221f, -0.001227f, +0.001179f, -0.001459f, +0.001545f, +0.001057f, +0.001982f, -0.002309f, -0.001668f, +0.001776f, + -0.000431f, -0.000130f, +0.001702f, +0.003069f, -0.001344f, -0.001371f, -0.001527f, -0.000010f, -0.000061f, -0.002389f, + -0.000077f, -0.001295f, -0.001574f, -0.000086f, +0.000780f, +0.000244f, -0.001188f, +0.000191f, -0.000473f, -0.000600f, + -0.000797f, +0.001267f, -0.000156f, -0.001293f, -0.000652f, +0.000359f, -0.000169f, -0.000436f, +0.000165f, +0.000389f, + +0.000360f, +0.000527f, -0.000380f, +0.000142f, -0.000262f, -0.000137f, +0.000845f, +0.000376f, +0.000082f, +0.000195f, + -0.000368f, -0.000335f, +0.000156f, +0.000434f, -0.000216f, +0.000055f + }, + { + +0.001055f, -0.036664f, -0.018671f, +0.006772f, -0.003874f, -0.001674f, +0.000248f, +0.003109f, +0.003606f, +0.000129f, + -0.000668f, +0.002924f, +0.011966f, +0.003228f, +0.013059f, -0.006079f, -0.002845f, -0.001926f, -0.001254f, -0.007463f, + +0.007140f, -0.000289f, +0.002906f, +0.001764f, -0.004861f, +0.011093f, +0.005931f, -0.002740f, -0.001383f, -0.007998f, + -0.005015f, -0.002294f, +0.001869f, -0.000500f, -0.005150f, +0.001371f, +0.000892f, +0.004843f, +0.001458f, +0.005110f, + -0.003335f, +0.003690f, +0.003828f, -0.000465f, +0.002979f, -0.000722f, +0.000026f, -0.001370f, -0.000470f, +0.000286f, + -0.001810f, +0.000536f, +0.000835f, -0.001234f, -0.000475f, -0.000011f, -0.000635f, -0.001361f, -0.000247f, -0.001665f, + +0.000747f, +0.000124f, +0.000050f, +0.000144f, +0.001568f, -0.000538f, +0.000542f, +0.000524f, -0.000958f, -0.000027f, + -0.000452f, -0.000127f, -0.001071f, +0.000225f, +0.000106f, -0.000050f, -0.000615f, +0.000520f, +0.000090f, -0.000080f, + -0.000074f, +0.000335f, +0.000361f, -0.000284f, -0.000230f, +0.000351f, -0.000052f, +0.000220f, -0.000324f, -0.000293f, + -0.000171f, -0.000378f, -0.000249f, -0.000273f, +0.000153f, -0.000428f + }, + { + -0.015037f, -0.191090f, +0.011149f, -0.000383f, -0.003729f, -0.002769f, -0.009076f, -0.004991f, +0.000151f, -0.000696f, + -0.011122f, -0.010903f, +0.023013f, +0.005789f, +0.005696f, +0.004750f, -0.002593f, +0.003982f, +0.003935f, -0.000520f, + -0.005870f, -0.000751f, +0.000433f, -0.004078f, -0.005632f, -0.002034f, +0.000103f, +0.000525f, -0.003238f, +0.002608f, + -0.000811f, +0.009519f, -0.006967f, +0.004658f, -0.001622f, -0.008747f, -0.000008f, -0.001361f, +0.001478f, +0.000698f, + +0.003631f, +0.002668f, -0.006353f, -0.007944f, +0.002914f, -0.000784f, -0.000551f, -0.003256f, +0.002201f, -0.002601f, + +0.000319f, +0.001331f, +0.000162f, +0.002491f, -0.000101f, -0.001589f, -0.001846f, -0.000664f, -0.000591f, -0.000507f, + -0.001276f, -0.002598f, -0.000488f, +0.000678f, +0.000092f, +0.000703f, +0.000874f, +0.000448f, +0.001058f, +0.000931f, + +0.000212f, +0.000597f, -0.001123f, -0.000065f, -0.000169f, +0.001383f, +0.000179f, -0.000292f, -0.000257f, +0.000545f, + +0.000615f, +0.000709f, +0.000591f, +0.000037f, -0.000966f, -0.000239f, -0.000077f, +0.000264f, +0.000390f, +0.000417f, + +0.000598f, +0.000186f, +0.000331f, +0.000131f, -0.000208f, -0.000070f + }, + { + +0.001844f, +0.027565f, -0.000837f, +0.002817f, -0.008504f, -0.004556f, -0.002210f, +0.002755f, +0.004349f, +0.005507f, + +0.001397f, -0.006419f, +0.002531f, +0.088887f, -0.011654f, +0.005313f, -0.005529f, +0.013557f, +0.004988f, +0.001208f, + +0.016278f, +0.002943f, +0.032431f, -0.019741f, -0.006200f, -0.002814f, +0.010030f, -0.000971f, -0.018793f, +0.000432f, + +0.000688f, +0.002247f, -0.004711f, -0.004649f, +0.006043f, -0.009039f, +0.001976f, +0.004489f, -0.010796f, +0.004611f, + -0.000676f, +0.003538f, +0.004141f, -0.001026f, -0.000724f, +0.000980f, -0.004176f, +0.001978f, -0.003049f, +0.003062f, + +0.002450f, +0.000468f, +0.002659f, -0.003929f, -0.001350f, -0.001675f, +0.000026f, -0.001271f, +0.002919f, -0.002224f, + +0.001249f, +0.000468f, +0.000979f, -0.001350f, -0.000581f, +0.000824f, +0.000202f, +0.000424f, -0.000421f, -0.000386f, + +0.000239f, -0.000315f, -0.000061f, +0.000497f, +0.000318f, +0.000313f, +0.001038f, -0.000287f, -0.000476f, +0.000020f, + -0.000510f, -0.000045f, -0.000014f, +0.000007f, +0.000221f, +0.000108f, +0.000068f, -0.000062f, -0.000038f, -0.000643f, + +0.000378f, +0.000278f, +0.000323f, +0.000084f, +0.000291f, +0.000392f + }, + { + +0.019001f, -0.116802f, -0.005707f, -0.006226f, -0.005539f, +0.005922f, -0.007607f, +0.002610f, +0.013067f, +0.001258f, + +0.009853f, +0.003850f, -0.008674f, +0.012058f, -0.046026f, -0.003739f, +0.014562f, +0.005259f, -0.003400f, +0.003663f, + +0.001983f, -0.003325f, +0.005740f, -0.007331f, +0.000005f, -0.002399f, +0.000854f, -0.004496f, -0.005976f, +0.005659f, + +0.002200f, +0.001389f, +0.002429f, +0.006241f, -0.005314f, -0.000996f, -0.000751f, +0.003847f, -0.001617f, -0.002794f, + -0.001083f, -0.002183f, -0.008816f, -0.002689f, -0.000385f, -0.001716f, +0.000286f, -0.001829f, -0.000944f, +0.000972f, + +0.000723f, -0.001908f, +0.000326f, +0.001961f, -0.001313f, -0.001546f, -0.000703f, -0.000662f, -0.001173f, -0.002270f, + -0.000272f, +0.001031f, +0.000149f, -0.000839f, -0.000207f, +0.000045f, +0.000354f, +0.000333f, +0.000317f, +0.000175f, + +0.000082f, +0.000459f, -0.000056f, +0.001443f, -0.000447f, +0.000989f, -0.000513f, -0.000009f, -0.000064f, +0.000600f, + +0.000489f, +0.000221f, -0.000907f, +0.000024f, -0.000245f, -0.000560f, +0.000197f, +0.000196f, +0.000222f, +0.000276f, + -0.000045f, +0.000179f, -0.000118f, +0.000404f, -0.000025f, -0.000146f + }, + { + -0.000004f, -0.003026f, -0.001512f, -0.002758f, +0.003724f, -0.000095f, -0.002707f, +0.000086f, -0.002512f, -0.003134f, + +0.002498f, -0.001710f, +0.012133f, +0.037835f, +0.108205f, +0.028430f, +0.001943f, +0.000568f, +0.013595f, +0.014229f, + -0.000244f, -0.012215f, -0.006854f, -0.002020f, -0.005505f, +0.003766f, -0.004566f, -0.001338f, +0.004391f, +0.000271f, + -0.004949f, +0.000102f, +0.002793f, +0.005331f, +0.002008f, -0.003908f, +0.002714f, -0.007341f, -0.001878f, +0.000932f, + -0.003933f, +0.004900f, +0.001237f, +0.001868f, +0.003055f, -0.002232f, +0.001411f, -0.001147f, -0.000216f, +0.000832f, + +0.000534f, -0.003620f, +0.000144f, +0.001463f, +0.000603f, +0.000423f, +0.002986f, -0.002647f, -0.000159f, +0.001253f, + +0.000898f, -0.001902f, -0.001004f, +0.000654f, -0.001675f, -0.001258f, -0.001179f, +0.000102f, -0.000492f, -0.000250f, + -0.000288f, -0.000319f, +0.000079f, -0.000561f, -0.000049f, -0.000316f, -0.000289f, +0.000561f, +0.000424f, +0.000123f, + -0.000101f, -0.000125f, -0.000559f, -0.000159f, -0.000291f, -0.000253f, +0.000422f, +0.000144f, +0.000185f, +0.000370f, + +0.000376f, -0.000013f, -0.000132f, +0.000043f, +0.000262f, -0.000152f + } + }, + { + { + -0.023114f, +0.254956f, -0.003339f, +0.000399f, +0.001715f, +0.000726f, -0.004521f, -0.006301f, -0.002792f, -0.003237f, + +0.005278f, +0.006484f, -0.004502f, +0.006152f, -0.015556f, +0.012724f, -0.004615f, -0.008058f, -0.009170f, +0.017400f, + -0.008021f, -0.001999f, -0.003682f, +0.000806f, -0.007064f, +0.002707f, -0.003624f, -0.000881f, +0.001356f, +0.008714f, + -0.003833f, +0.000759f, +0.004117f, -0.006274f, +0.007871f, -0.005175f, +0.000319f, +0.003769f, +0.001343f, -0.005269f, + -0.004330f, -0.003219f, -0.005141f, +0.000607f, +0.005060f, +0.003169f, +0.001681f, +0.000868f, +0.001525f, +0.002762f, + +0.001316f, +0.000175f, +0.001615f, -0.001060f, +0.001641f, +0.001193f, +0.000464f, -0.002239f, +0.002394f, +0.000506f, + -0.000196f, +0.002430f, +0.000114f, -0.001493f, -0.000043f, +0.000107f, +0.000267f, +0.000697f, -0.000194f, +0.000260f, + -0.001566f, +0.001358f, -0.000816f, +0.000334f, +0.001318f, +0.001026f, +0.000987f, -0.000010f, -0.000795f, +0.000368f, + -0.000288f, -0.000168f, -0.000444f, +0.000099f, +0.000562f, -0.000318f, +0.000269f, -0.000189f, -0.000245f, -0.000131f, + -0.000558f, +0.000019f, +0.000236f, -0.000370f, +0.000379f, -0.000165f + }, + { + +0.001021f, -0.045658f, +0.044494f, +0.008986f, +0.004163f, +0.000017f, +0.006121f, -0.003014f, +0.000885f, -0.001218f, + -0.000429f, +0.001191f, +0.001356f, +0.002174f, +0.024906f, -0.017541f, -0.001483f, -0.002327f, -0.020328f, +0.011349f, + +0.012430f, -0.013638f, -0.001779f, -0.003994f, +0.000881f, -0.004114f, +0.001548f, -0.006227f, -0.001732f, +0.000393f, + -0.001479f, +0.001030f, +0.002990f, +0.004933f, -0.003021f, +0.001672f, +0.001438f, +0.000700f, +0.000759f, -0.006768f, + -0.001365f, +0.006344f, +0.001369f, +0.001757f, -0.004557f, +0.004031f, -0.002992f, -0.001410f, -0.002483f, +0.000426f, + +0.002200f, -0.002934f, +0.001196f, -0.002233f, +0.002564f, -0.002418f, +0.000449f, -0.000046f, -0.001648f, +0.000562f, + -0.000842f, -0.001083f, +0.000236f, -0.000469f, -0.000041f, +0.001047f, -0.000398f, -0.000338f, -0.000320f, +0.001525f, + -0.000718f, +0.000340f, -0.000451f, -0.000350f, +0.000510f, +0.000395f, -0.000310f, -0.000665f, +0.000207f, -0.000268f, + +0.001013f, -0.000439f, +0.000329f, +0.000539f, -0.000121f, -0.000670f, -0.001021f, -0.000337f, -0.000413f, +0.000123f, + -0.000042f, +0.000221f, +0.000075f, +0.000259f, -0.000039f, -0.000097f + }, + { + +0.007386f, -0.152201f, -0.072098f, +0.018256f, +0.004925f, -0.002088f, +0.003246f, +0.004226f, -0.001142f, -0.001741f, + +0.001817f, -0.008494f, +0.002002f, +0.005027f, +0.002412f, -0.014106f, +0.010262f, -0.018408f, -0.002275f, +0.009736f, + -0.003519f, +0.001407f, +0.010120f, +0.006601f, -0.010424f, -0.005971f, +0.007951f, -0.004226f, -0.003031f, -0.000053f, + -0.004580f, -0.002276f, -0.006436f, -0.003415f, -0.000041f, -0.000484f, +0.002878f, -0.001941f, -0.002114f, -0.003220f, + +0.001057f, -0.002296f, -0.008920f, +0.001252f, -0.000133f, +0.007652f, -0.001925f, -0.001098f, -0.000339f, +0.000343f, + +0.000978f, -0.000034f, +0.000526f, -0.000809f, +0.001239f, -0.000009f, +0.000482f, +0.001152f, -0.000716f, -0.001892f, + +0.000178f, +0.001996f, -0.000706f, -0.001407f, +0.000635f, -0.001143f, -0.000460f, +0.000272f, -0.000340f, +0.000246f, + +0.000121f, +0.000877f, -0.000058f, -0.000950f, -0.000028f, +0.000182f, +0.000274f, -0.000363f, +0.000415f, -0.000046f, + +0.000582f, -0.000089f, +0.000394f, +0.000252f, +0.000337f, -0.000176f, +0.000102f, +0.000083f, -0.000229f, +0.000273f, + +0.000007f, +0.000123f, -0.000230f, -0.000195f, +0.000250f, +0.000130f + }, + { + -0.043024f, +0.254803f, +0.001396f, +0.006462f, -0.001530f, -0.001117f, -0.005166f, +0.000403f, -0.001305f, -0.000790f, + -0.002059f, +0.002719f, +0.006224f, -0.000434f, -0.015642f, +0.004857f, +0.004740f, -0.030007f, +0.004178f, -0.004250f, + +0.001842f, +0.003098f, -0.002881f, -0.005361f, +0.003207f, -0.002197f, -0.002598f, -0.008420f, -0.001366f, -0.006881f, + -0.001116f, +0.007195f, +0.001398f, +0.001890f, -0.001542f, -0.002825f, +0.003414f, +0.002078f, +0.000140f, -0.000514f, + +0.002046f, -0.003085f, -0.000419f, +0.001923f, -0.000877f, -0.005526f, +0.004312f, +0.001256f, +0.000198f, +0.000978f, + -0.000505f, +0.000619f, -0.000434f, +0.002738f, +0.002367f, -0.001098f, -0.001018f, -0.000125f, +0.000450f, +0.000511f, + +0.000565f, -0.000534f, +0.001081f, -0.000322f, +0.000691f, +0.000757f, -0.000919f, +0.001110f, +0.000089f, -0.000048f, + +0.000933f, -0.000124f, -0.000005f, -0.000736f, +0.000324f, +0.000352f, -0.000210f, -0.000656f, -0.000262f, -0.000096f, + +0.000547f, -0.000409f, +0.000001f, -0.000442f, +0.000006f, +0.000167f, -0.000219f, +0.000193f, -0.000440f, +0.000084f, + +0.000393f, -0.000275f, -0.000286f, -0.000136f, +0.000171f, +0.000073f + }, + { + -0.003034f, +0.037223f, +0.006753f, +0.000976f, +0.000507f, -0.000345f, -0.000570f, -0.000363f, +0.000324f, +0.001805f, + +0.001188f, -0.004062f, -0.012680f, +0.009918f, -0.016130f, -0.004221f, -0.024544f, -0.021729f, -0.019646f, +0.003134f, + +0.009065f, -0.036331f, +0.003375f, -0.005813f, +0.004737f, -0.003816f, +0.000055f, +0.005352f, +0.002352f, -0.005683f, + -0.004023f, +0.000158f, -0.005690f, +0.004019f, +0.007984f, +0.000899f, -0.002783f, -0.007276f, -0.005306f, -0.002923f, + -0.005799f, -0.003568f, +0.000419f, +0.000319f, +0.004107f, -0.000145f, +0.003050f, -0.001334f, -0.004971f, +0.003133f, + -0.001850f, -0.000548f, -0.001074f, +0.001207f, +0.001518f, +0.000736f, -0.001325f, -0.000897f, +0.001448f, +0.001693f, + -0.001547f, +0.000021f, +0.001074f, -0.000534f, +0.001097f, +0.001923f, -0.001813f, -0.000395f, -0.001195f, -0.000072f, + -0.000407f, +0.001465f, -0.000955f, -0.000484f, -0.000414f, -0.000187f, -0.000451f, +0.000222f, +0.000659f, -0.000452f, + -0.000096f, -0.000381f, +0.000556f, +0.000249f, +0.000362f, +0.000519f, +0.000529f, -0.000059f, -0.000069f, -0.000020f, + +0.000135f, -0.000062f, +0.000271f, +0.000119f, -0.000402f, +0.000162f + }, + { + -0.089444f, +0.234866f, +0.026615f, +0.012122f, +0.003324f, +0.000150f, -0.004568f, +0.008075f, +0.003767f, +0.002121f, + +0.006899f, +0.001137f, +0.009904f, +0.002863f, +0.000899f, -0.001587f, -0.004676f, -0.002180f, -0.001209f, -0.000483f, + +0.006068f, +0.005278f, -0.001020f, -0.002165f, -0.001780f, +0.000498f, -0.000018f, -0.004877f, +0.000922f, +0.003881f, + +0.009563f, -0.003236f, +0.001845f, -0.001436f, -0.000430f, +0.004030f, +0.000551f, -0.000034f, -0.002332f, -0.001846f, + -0.008480f, -0.002541f, -0.004445f, -0.005490f, +0.000690f, -0.001200f, +0.003356f, -0.003086f, -0.002775f, -0.000870f, + +0.001009f, -0.000408f, -0.001600f, +0.001891f, +0.001619f, +0.001981f, +0.003508f, +0.000747f, +0.002103f, -0.001589f, + -0.000751f, +0.000060f, +0.001238f, -0.000914f, +0.000835f, +0.000781f, +0.000190f, +0.000721f, -0.001061f, -0.000332f, + +0.000144f, -0.000344f, +0.000423f, -0.000778f, -0.001078f, +0.000198f, -0.000460f, +0.000457f, +0.000333f, -0.000495f, + -0.000964f, -0.000125f, +0.000182f, +0.000055f, -0.000088f, -0.000330f, +0.000019f, +0.000118f, +0.000180f, +0.000182f, + +0.000028f, -0.000037f, -0.000240f, -0.000077f, +0.000040f, -0.000216f + }, + { + -0.000586f, -0.018670f, +0.000209f, -0.000768f, -0.000041f, +0.000122f, -0.001653f, +0.002729f, +0.000134f, +0.000137f, + +0.002262f, +0.001992f, +0.013507f, -0.010982f, +0.017313f, +0.004963f, -0.021601f, -0.002864f, +0.016498f, +0.010889f, + +0.001935f, -0.006547f, -0.043242f, -0.007376f, -0.000773f, -0.001623f, -0.008202f, +0.008833f, -0.000230f, +0.000606f, + +0.000355f, +0.011508f, -0.007703f, -0.002584f, +0.003315f, +0.008029f, -0.001175f, +0.001846f, +0.001731f, +0.000515f, + +0.003153f, -0.000675f, -0.001264f, -0.002356f, -0.002492f, +0.000851f, +0.000265f, -0.001874f, -0.001827f, +0.000667f, + +0.000599f, -0.001724f, +0.002546f, +0.000576f, +0.002709f, +0.001459f, -0.000392f, +0.000190f, +0.001410f, -0.000873f, + -0.001693f, +0.000002f, -0.001203f, -0.001333f, -0.000143f, -0.001785f, +0.000208f, +0.000834f, +0.000432f, -0.000329f, + -0.000781f, -0.000329f, +0.001129f, +0.000247f, -0.000856f, +0.000702f, -0.000196f, +0.000565f, -0.000304f, +0.000232f, + -0.000420f, +0.000431f, +0.000192f, +0.000437f, -0.000093f, +0.000067f, +0.000386f, -0.000411f, -0.000138f, +0.000115f, + -0.000019f, +0.000341f, -0.000238f, +0.000023f, +0.000068f, +0.000033f + }, + { + +0.070691f, -0.255507f, -0.047525f, -0.001498f, +0.009793f, +0.000665f, -0.001643f, +0.001350f, -0.014363f, +0.003437f, + +0.001162f, -0.000275f, +0.000684f, +0.003499f, +0.027044f, -0.005523f, +0.002612f, +0.008015f, -0.002509f, +0.010793f, + +0.003281f, -0.001220f, -0.002429f, +0.004959f, -0.000236f, -0.003670f, -0.000324f, +0.009820f, +0.000042f, +0.001483f, + -0.005176f, +0.009302f, -0.009182f, -0.000353f, +0.003275f, -0.017043f, +0.007762f, -0.002042f, +0.001099f, +0.004714f, + -0.001840f, -0.000452f, +0.002953f, +0.001909f, +0.004585f, -0.000680f, -0.000754f, +0.002811f, -0.000170f, +0.000893f, + -0.000552f, -0.000509f, -0.002960f, +0.000885f, +0.002282f, -0.000572f, +0.000079f, -0.001312f, +0.002376f, -0.000353f, + -0.001379f, -0.001018f, +0.000519f, +0.001699f, -0.000131f, +0.001125f, +0.001663f, +0.000951f, +0.000119f, -0.000108f, + +0.000413f, +0.000562f, +0.000072f, -0.000023f, +0.000609f, -0.000057f, +0.000068f, +0.000008f, -0.000007f, -0.000266f, + -0.000314f, -0.000300f, +0.000283f, -0.000189f, -0.000350f, +0.000426f, -0.000734f, +0.000058f, -0.000063f, +0.000008f, + -0.000386f, +0.000363f, -0.000019f, -0.000052f, +0.000443f, +0.000126f + }, + { + -0.001625f, -0.013311f, -0.003499f, -0.003166f, +0.002674f, +0.000165f, +0.000826f, +0.001249f, +0.004114f, +0.001879f, + +0.001665f, +0.003246f, -0.001611f, -0.000706f, -0.014628f, +0.001444f, +0.006742f, +0.005744f, -0.007705f, +0.004335f, + +0.006778f, +0.003050f, +0.010031f, -0.023180f, -0.004170f, -0.004197f, -0.009683f, +0.007369f, -0.001083f, +0.000255f, + +0.008191f, -0.000957f, +0.002417f, -0.001670f, -0.005339f, +0.002174f, -0.005086f, -0.000406f, -0.002717f, +0.003552f, + -0.000654f, -0.002124f, +0.000645f, -0.001490f, -0.000228f, -0.002520f, -0.000666f, -0.000419f, +0.001501f, +0.000500f, + -0.002041f, -0.001706f, +0.000352f, +0.000608f, +0.000411f, +0.000064f, -0.001410f, -0.000502f, -0.000943f, +0.001197f, + -0.000483f, +0.000513f, +0.000748f, +0.000448f, -0.001401f, -0.000041f, -0.000232f, +0.001181f, +0.002279f, -0.001690f, + +0.000469f, -0.000969f, -0.000100f, +0.000018f, -0.000729f, +0.000446f, +0.000131f, +0.000250f, -0.000594f, +0.000371f, + -0.000116f, -0.000157f, -0.000078f, +0.000140f, +0.000157f, +0.000194f, -0.000355f, +0.000489f, +0.000025f, +0.000113f, + -0.000159f, +0.000156f, -0.000100f, +0.000370f, +0.000032f, +0.000220f + }, + { + +0.005961f, -0.249561f, -0.021787f, -0.000175f, -0.000566f, -0.003038f, -0.010397f, +0.011957f, -0.007040f, +0.007122f, + -0.002408f, -0.003003f, +0.006314f, +0.004454f, -0.009268f, +0.005771f, -0.004503f, -0.005932f, +0.016346f, -0.014970f, + +0.003907f, -0.000690f, -0.002228f, +0.000396f, +0.004242f, -0.007341f, -0.003364f, +0.000527f, -0.005767f, +0.005042f, + -0.001295f, -0.001899f, -0.003617f, -0.000354f, +0.009265f, -0.002575f, +0.003375f, +0.000338f, -0.002739f, +0.006173f, + -0.001354f, +0.000130f, +0.003401f, +0.000650f, +0.000353f, +0.000916f, +0.001218f, -0.001931f, +0.000235f, +0.001757f, + -0.000405f, -0.000733f, +0.000417f, +0.000628f, -0.002134f, +0.000066f, -0.001289f, +0.000854f, +0.000791f, -0.000513f, + +0.000489f, -0.000852f, -0.001340f, -0.000077f, +0.000742f, +0.000270f, +0.000284f, +0.000393f, -0.000036f, +0.000424f, + -0.000425f, +0.000659f, -0.000454f, -0.000530f, +0.000091f, +0.000344f, -0.000476f, -0.000126f, +0.000003f, +0.000309f, + -0.000080f, -0.000080f, -0.000263f, +0.000986f, +0.000127f, -0.000160f, +0.000266f, -0.000013f, +0.000045f, +0.000329f, + -0.000463f, -0.000091f, -0.000160f, +0.000060f, -0.000247f, +0.000195f + }, + { + -0.001496f, +0.001060f, +0.015560f, +0.004495f, -0.005865f, -0.001124f, -0.000647f, +0.000949f, +0.001695f, -0.000544f, + -0.000161f, -0.002323f, +0.002502f, -0.003873f, +0.001800f, -0.011846f, -0.009829f, +0.003191f, +0.000062f, +0.006715f, + +0.013993f, +0.000488f, +0.013163f, +0.005185f, -0.007679f, +0.003293f, +0.002209f, +0.000871f, +0.001011f, -0.004260f, + -0.000293f, +0.001982f, +0.005211f, -0.000263f, -0.003638f, +0.005459f, -0.001252f, -0.001066f, -0.003423f, +0.001470f, + -0.005183f, +0.002785f, +0.000946f, -0.001594f, +0.004438f, -0.001530f, -0.000533f, -0.001719f, -0.001549f, -0.000630f, + +0.000557f, +0.002422f, +0.001243f, -0.000539f, -0.000432f, -0.001874f, +0.000330f, +0.000137f, +0.001409f, -0.001243f, + -0.000433f, -0.000139f, +0.000727f, +0.000111f, +0.001403f, +0.000095f, +0.000268f, +0.000194f, +0.000370f, +0.000499f, + -0.001493f, -0.000954f, -0.001058f, +0.000678f, +0.000114f, -0.000010f, -0.000186f, +0.000683f, +0.000028f, -0.000006f, + -0.000078f, +0.000152f, +0.000013f, -0.000441f, -0.000045f, +0.000194f, -0.000140f, +0.000269f, -0.000229f, -0.000093f, + +0.000442f, +0.000194f, +0.000179f, -0.000131f, +0.000089f, -0.000118f + }, + { + +0.036224f, -0.120342f, +0.010869f, +0.003758f, -0.001028f, +0.012736f, +0.001018f, +0.003429f, +0.002253f, +0.000829f, + -0.000822f, -0.006035f, +0.009505f, -0.022264f, -0.005411f, +0.012607f, -0.001375f, +0.000425f, +0.002523f, +0.004430f, + -0.006497f, -0.000958f, +0.001136f, -0.002491f, -0.002244f, -0.001322f, -0.004081f, +0.001711f, -0.001767f, +0.000131f, + -0.005771f, +0.006042f, -0.005817f, +0.000919f, -0.001352f, -0.003484f, +0.000450f, +0.001397f, +0.001010f, -0.002751f, + +0.003115f, +0.001171f, -0.003892f, -0.004310f, +0.000855f, -0.001486f, +0.000755f, -0.000543f, +0.002300f, -0.003008f, + -0.000712f, +0.002150f, +0.000888f, +0.002441f, +0.000524f, +0.000437f, +0.001093f, -0.000629f, -0.000143f, +0.001860f, + +0.001102f, -0.001548f, +0.000171f, +0.000459f, -0.000670f, -0.000032f, +0.000863f, +0.000157f, +0.000378f, +0.000674f, + -0.000485f, +0.000381f, -0.000928f, -0.000249f, -0.000306f, +0.001186f, -0.000134f, -0.000038f, +0.000182f, +0.000320f, + -0.000141f, -0.000118f, +0.000342f, +0.000208f, -0.000626f, +0.000081f, +0.000132f, +0.000528f, +0.000162f, -0.000380f, + +0.000426f, +0.000188f, +0.000315f, +0.000042f, -0.000293f, -0.000238f + }, + { + -0.000988f, +0.023882f, +0.001789f, +0.005196f, -0.000761f, +0.002730f, -0.001750f, +0.002446f, +0.001592f, -0.001933f, + -0.006972f, -0.005972f, -0.008305f, +0.065234f, -0.015363f, +0.014410f, -0.005206f, +0.001612f, -0.002997f, -0.004195f, + +0.011984f, -0.016339f, -0.001864f, -0.021895f, +0.012830f, +0.006145f, +0.003046f, -0.002593f, -0.011464f, +0.005698f, + +0.007814f, +0.006110f, +0.002785f, +0.000200f, +0.009796f, -0.002484f, -0.001016f, +0.006261f, -0.006539f, +0.004877f, + -0.002794f, -0.000726f, +0.001603f, +0.002474f, +0.002777f, +0.002598f, -0.002190f, +0.005471f, -0.001787f, +0.001799f, + +0.001986f, +0.000401f, +0.004478f, -0.003812f, -0.001480f, +0.000016f, +0.003169f, -0.001336f, +0.003019f, -0.000633f, + +0.001101f, +0.000796f, +0.001604f, -0.001278f, +0.000336f, +0.000997f, +0.000660f, +0.000279f, -0.000046f, +0.000363f, + +0.000940f, +0.000982f, +0.000432f, -0.000297f, -0.000054f, +0.000485f, +0.001383f, +0.000045f, +0.000287f, +0.000861f, + -0.000032f, -0.000479f, -0.000708f, -0.000376f, -0.000072f, +0.000617f, -0.000074f, -0.000111f, +0.000153f, -0.000517f, + +0.000113f, -0.000706f, +0.000240f, +0.000177f, -0.000184f, +0.000273f + }, + { + +0.004804f, -0.137653f, +0.007321f, +0.010404f, +0.004517f, +0.009360f, -0.009766f, -0.003234f, +0.000198f, -0.001428f, + -0.003744f, -0.010706f, -0.014385f, +0.014989f, -0.057875f, -0.000925f, +0.014999f, +0.003370f, -0.004061f, +0.004900f, + +0.004206f, -0.001201f, +0.006192f, -0.004905f, +0.007033f, -0.000456f, +0.001200f, +0.002181f, -0.007657f, +0.000745f, + +0.000583f, +0.001270f, +0.001944f, +0.001631f, -0.004175f, +0.004255f, -0.004643f, -0.001407f, -0.000349f, -0.000255f, + +0.003167f, +0.003568f, -0.005933f, -0.001521f, -0.000500f, -0.000274f, -0.000862f, -0.003577f, +0.001861f, +0.002967f, + +0.000906f, -0.002687f, +0.000683f, +0.002995f, +0.000028f, +0.000505f, +0.001151f, -0.001608f, -0.001124f, -0.000986f, + +0.000614f, +0.000355f, -0.000934f, -0.000733f, -0.000486f, -0.000316f, +0.000183f, +0.000742f, +0.000308f, +0.000121f, + -0.000256f, +0.000517f, -0.000163f, +0.000821f, -0.000241f, +0.001150f, -0.000887f, -0.000176f, -0.000333f, -0.000121f, + +0.000515f, +0.000644f, -0.000360f, +0.000499f, +0.000072f, -0.000077f, -0.000117f, -0.000171f, -0.000163f, -0.000041f, + -0.000586f, -0.000063f, -0.000201f, +0.000269f, -0.000142f, -0.000081f + }, + { + +0.000759f, -0.004422f, -0.002732f, -0.003040f, +0.001307f, +0.002165f, +0.001700f, -0.000763f, -0.002300f, -0.000862f, + +0.006441f, -0.008096f, -0.008093f, -0.069575f, -0.049775f, +0.005937f, -0.004676f, -0.012122f, +0.009347f, +0.014872f, + +0.006527f, -0.008715f, -0.002214f, -0.005335f, -0.002479f, +0.011804f, +0.006000f, +0.001445f, -0.001671f, -0.006482f, + -0.003109f, +0.003166f, -0.003010f, -0.001602f, +0.001893f, -0.004630f, +0.004620f, +0.005358f, +0.006233f, +0.001621f, + -0.004741f, +0.003798f, +0.001555f, +0.001009f, +0.001566f, -0.000046f, +0.000651f, -0.003146f, -0.002898f, -0.000176f, + +0.003334f, -0.001105f, +0.000318f, +0.000716f, +0.000250f, +0.000049f, +0.003843f, -0.001483f, -0.000919f, +0.000630f, + +0.001154f, -0.002683f, -0.001544f, +0.000892f, -0.000996f, +0.001797f, +0.000790f, -0.001546f, -0.000101f, +0.000521f, + +0.000150f, -0.000156f, +0.001004f, -0.000184f, -0.000544f, +0.000053f, -0.000800f, -0.000391f, +0.000347f, -0.000355f, + -0.000282f, +0.000106f, -0.000579f, -0.000566f, -0.000112f, -0.000298f, +0.000280f, +0.000159f, -0.000048f, +0.000048f, + +0.000305f, +0.000046f, -0.000117f, +0.000038f, +0.000402f, -0.000163f + } + }, + { + { + +0.017886f, +0.327081f, -0.142623f, +0.003856f, +0.008472f, -0.001280f, -0.003536f, -0.005976f, -0.009513f, -0.002177f, + +0.002531f, +0.012629f, -0.002629f, +0.002679f, -0.007276f, +0.000653f, +0.001628f, -0.010677f, +0.003116f, +0.003435f, + -0.005088f, -0.005395f, +0.000799f, +0.003730f, -0.004338f, -0.004833f, -0.002222f, -0.006367f, +0.009774f, +0.001468f, + +0.000206f, +0.004597f, -0.003646f, -0.000281f, -0.000213f, -0.001981f, +0.000813f, +0.001693f, +0.001399f, -0.005981f, + -0.003322f, -0.002572f, -0.004510f, -0.001138f, +0.003559f, +0.001403f, +0.001764f, -0.000395f, +0.002091f, +0.004203f, + +0.002112f, -0.002876f, +0.001472f, +0.001209f, +0.002211f, -0.000623f, +0.000173f, -0.000542f, +0.001049f, +0.001086f, + +0.001272f, -0.000012f, +0.001783f, -0.001317f, -0.000049f, +0.000288f, +0.000198f, +0.000370f, +0.000119f, +0.000447f, + -0.000160f, -0.000129f, -0.000584f, +0.000857f, +0.001037f, +0.000767f, +0.000575f, +0.000224f, -0.000178f, -0.000127f, + -0.000911f, -0.000290f, -0.000055f, +0.000011f, +0.000444f, -0.000439f, -0.000151f, -0.000152f, -0.000285f, +0.000041f, + -0.000341f, -0.000197f, +0.000148f, +0.000019f, +0.000119f, -0.000003f + }, + { + +0.001169f, +0.065454f, -0.042661f, +0.002397f, +0.003923f, +0.003916f, +0.001236f, +0.003896f, -0.001984f, -0.006250f, + +0.000128f, +0.003283f, -0.000109f, -0.004490f, +0.027486f, +0.007099f, -0.009540f, -0.002818f, -0.020240f, +0.003903f, + -0.000445f, +0.007214f, -0.004498f, -0.005324f, -0.001591f, -0.005221f, +0.002982f, -0.003645f, -0.001973f, +0.001216f, + -0.000552f, +0.006081f, -0.001347f, +0.002227f, +0.000024f, -0.002342f, +0.000538f, +0.002641f, -0.002541f, -0.003236f, + +0.000843f, +0.001525f, -0.002721f, +0.001722f, +0.002507f, -0.001010f, -0.000019f, -0.001626f, -0.001575f, +0.000965f, + +0.000666f, -0.002343f, -0.001744f, -0.000148f, -0.000647f, +0.000636f, -0.000154f, -0.000516f, +0.000773f, -0.000208f, + -0.001194f, -0.001656f, +0.000502f, -0.000563f, +0.000671f, -0.000323f, -0.000143f, -0.000643f, -0.000186f, +0.001112f, + -0.000704f, +0.000302f, -0.000209f, +0.000089f, +0.000123f, +0.000356f, -0.000192f, +0.000002f, -0.000202f, -0.000394f, + +0.000455f, +0.000191f, -0.000128f, +0.000523f, -0.000199f, -0.000302f, -0.001090f, -0.000574f, -0.000474f, -0.000441f, + +0.000527f, +0.000084f, +0.000344f, -0.000021f, -0.000281f, +0.000185f + }, + { + -0.007822f, -0.246335f, +0.026943f, +0.017421f, -0.004247f, -0.001263f, -0.002958f, +0.002852f, +0.001671f, +0.001214f, + +0.000539f, -0.003369f, -0.005235f, +0.009342f, -0.005666f, -0.005410f, -0.008718f, -0.008374f, +0.001697f, +0.004339f, + -0.000765f, -0.000559f, +0.014192f, +0.002232f, -0.008883f, -0.007141f, +0.001126f, -0.001252f, +0.004258f, -0.002172f, + -0.004477f, -0.002534f, -0.007487f, -0.000618f, -0.009068f, +0.008408f, -0.001978f, -0.000246f, -0.001297f, -0.003209f, + -0.002659f, +0.000529f, -0.006118f, -0.000371f, +0.002490f, +0.000705f, -0.001273f, +0.001284f, -0.001986f, +0.000532f, + +0.002096f, -0.000370f, -0.001266f, +0.000172f, +0.001043f, +0.000357f, -0.000087f, +0.000922f, -0.000256f, -0.001582f, + +0.000512f, +0.001659f, -0.000612f, -0.001694f, +0.000695f, -0.001562f, -0.000106f, +0.000894f, -0.000039f, +0.000114f, + -0.000099f, -0.000074f, -0.000532f, +0.000314f, -0.000210f, +0.000098f, -0.000016f, -0.000425f, +0.000723f, -0.000326f, + +0.000607f, +0.000441f, -0.000094f, +0.000567f, +0.000411f, -0.000104f, -0.000047f, -0.000070f, -0.000313f, +0.000318f, + +0.000151f, -0.000215f, -0.000057f, +0.000050f, +0.000277f, +0.000202f + }, + { + +0.057238f, +0.165187f, -0.020874f, +0.006651f, -0.009546f, -0.001512f, -0.005374f, -0.000645f, -0.000371f, +0.000637f, + -0.002012f, +0.004073f, -0.000011f, +0.000327f, -0.018790f, +0.008759f, +0.006156f, -0.025713f, +0.001595f, -0.006858f, + +0.001315f, -0.003263f, +0.005162f, -0.002628f, -0.000832f, +0.000592f, -0.003831f, -0.003192f, -0.004456f, -0.003691f, + -0.005685f, +0.003865f, +0.002947f, +0.003575f, -0.002794f, -0.001028f, -0.000413f, +0.004691f, -0.000365f, -0.002056f, + +0.001106f, -0.000938f, +0.000407f, +0.000672f, -0.001910f, -0.003279f, +0.000420f, +0.003263f, -0.000537f, +0.001075f, + +0.000318f, +0.000197f, +0.000411f, +0.003136f, +0.001426f, +0.000259f, -0.001757f, +0.000162f, +0.000376f, +0.002070f, + -0.001258f, +0.000660f, -0.000328f, +0.000191f, +0.000119f, +0.000287f, +0.000027f, +0.000689f, +0.000043f, -0.000175f, + +0.001065f, +0.000006f, -0.000112f, +0.000516f, +0.000387f, -0.000420f, -0.000370f, -0.000786f, -0.000012f, -0.000264f, + -0.000204f, -0.000311f, +0.000167f, +0.000035f, -0.000387f, -0.000095f, +0.000075f, -0.000075f, -0.000240f, +0.000280f, + +0.000071f, -0.000114f, -0.000311f, -0.000029f, -0.000116f, +0.000149f + }, + { + +0.003066f, +0.040804f, -0.001400f, +0.002254f, -0.000679f, -0.000072f, +0.000314f, -0.000487f, +0.000705f, -0.001304f, + +0.002850f, -0.001933f, -0.008080f, -0.001694f, +0.004132f, -0.013381f, -0.000297f, -0.069027f, -0.010299f, +0.020068f, + -0.012311f, -0.011895f, -0.011820f, -0.007368f, +0.007474f, +0.001615f, +0.002844f, +0.003634f, +0.002907f, -0.003692f, + -0.005831f, -0.001320f, -0.001552f, +0.001587f, +0.002907f, -0.000998f, -0.000472f, -0.004781f, -0.004923f, -0.005486f, + -0.003859f, -0.002794f, -0.002407f, +0.003746f, +0.002665f, +0.000283f, +0.001588f, -0.002414f, -0.001184f, -0.001171f, + -0.000901f, +0.001538f, -0.001776f, -0.000080f, +0.003796f, +0.000024f, +0.000146f, -0.003025f, +0.001464f, +0.000569f, + +0.000645f, +0.000427f, +0.000690f, +0.000980f, +0.000166f, +0.000560f, -0.001363f, -0.000279f, -0.000439f, -0.001535f, + +0.000576f, +0.000867f, -0.000558f, -0.000464f, +0.000227f, -0.001153f, -0.000187f, +0.000235f, -0.000097f, -0.000229f, + -0.000203f, +0.000060f, +0.000690f, +0.000073f, -0.000015f, +0.000728f, +0.000405f, +0.000191f, -0.000084f, +0.000217f, + -0.000008f, +0.000123f, -0.000258f, +0.000397f, -0.000241f, -0.000007f + }, + { + +0.100237f, +0.095145f, -0.062109f, +0.016462f, +0.005952f, -0.001185f, +0.001749f, +0.000260f, +0.004780f, +0.004648f, + +0.001223f, +0.001187f, +0.014683f, -0.005107f, +0.006022f, -0.004348f, -0.006877f, +0.003146f, -0.002839f, +0.002309f, + -0.001635f, +0.006647f, +0.000926f, -0.002411f, +0.000728f, +0.001056f, -0.000702f, -0.001419f, -0.001562f, +0.000267f, + +0.011196f, -0.000422f, -0.003167f, +0.000477f, +0.003117f, +0.002182f, +0.002704f, -0.002696f, -0.001716f, -0.001877f, + -0.009072f, -0.000543f, -0.003476f, -0.006116f, -0.002548f, +0.001005f, -0.000245f, +0.000546f, -0.002549f, -0.003460f, + +0.002267f, +0.000195f, -0.001162f, -0.000768f, +0.002516f, +0.002623f, +0.001678f, +0.002438f, +0.000644f, -0.000509f, + -0.000580f, -0.000134f, +0.001258f, -0.000529f, +0.001316f, +0.000066f, +0.000523f, +0.000171f, +0.000063f, -0.000141f, + -0.000085f, -0.000144f, +0.000156f, -0.001120f, -0.000534f, +0.000353f, -0.000661f, +0.000185f, +0.000241f, +0.000299f, + -0.000604f, -0.000344f, -0.000352f, +0.000355f, -0.000137f, -0.000446f, -0.000247f, +0.000204f, +0.000064f, +0.000113f, + -0.000042f, +0.000052f, -0.000003f, -0.000238f, +0.000235f, -0.000434f + }, + { + -0.000338f, -0.017583f, -0.005933f, +0.003987f, -0.001357f, -0.000293f, -0.001422f, +0.002419f, +0.001480f, +0.001026f, + +0.000773f, +0.004206f, +0.009144f, -0.013337f, +0.024726f, +0.005128f, -0.010786f, -0.004433f, +0.003685f, +0.020305f, + +0.000572f, -0.005643f, -0.036296f, -0.012432f, -0.000450f, +0.003077f, -0.005264f, +0.001836f, -0.001568f, -0.000681f, + +0.000196f, +0.003128f, +0.000589f, -0.003874f, +0.000543f, +0.005897f, +0.002217f, -0.000269f, +0.004222f, +0.000987f, + -0.001675f, +0.001451f, +0.002244f, -0.004791f, -0.001106f, +0.000122f, -0.000294f, -0.001750f, -0.000520f, +0.000188f, + -0.000016f, -0.000356f, +0.002202f, +0.000780f, +0.001952f, +0.000327f, +0.000478f, +0.001591f, -0.000921f, -0.001020f, + +0.000077f, -0.000728f, -0.001120f, +0.000011f, -0.001152f, -0.002070f, +0.000304f, +0.000604f, +0.000439f, -0.000108f, + -0.000616f, -0.000642f, +0.000581f, +0.000842f, -0.000444f, -0.000069f, -0.000119f, -0.000073f, -0.000099f, +0.000394f, + -0.000060f, -0.000187f, +0.000380f, +0.000192f, +0.000031f, +0.000196f, +0.000171f, -0.000125f, +0.000161f, +0.000555f, + -0.000106f, +0.000149f, -0.000161f, -0.000014f, +0.000170f, -0.000117f + }, + { + -0.071605f, -0.197385f, +0.060421f, -0.000386f, +0.006761f, +0.000737f, +0.004802f, -0.004142f, -0.008373f, -0.000190f, + -0.000891f, +0.005430f, -0.003432f, +0.009157f, +0.011726f, +0.002554f, -0.000042f, +0.008369f, +0.000091f, +0.002175f, + +0.004527f, -0.001302f, +0.002129f, -0.000684f, -0.000511f, -0.001704f, +0.002855f, +0.006674f, +0.000730f, -0.001326f, + -0.001277f, +0.003447f, -0.003557f, -0.002728f, +0.003830f, -0.007641f, -0.002364f, -0.001837f, +0.000688f, +0.002312f, + -0.001115f, -0.000201f, +0.002357f, +0.004010f, +0.001526f, +0.003646f, -0.002932f, +0.004429f, +0.001767f, +0.000778f, + -0.002485f, -0.000426f, -0.001829f, +0.000938f, +0.001245f, -0.000687f, +0.000887f, -0.001497f, +0.001114f, +0.000650f, + -0.000743f, -0.000445f, -0.000686f, +0.001469f, +0.001970f, +0.000621f, +0.000031f, +0.001870f, -0.000273f, +0.000583f, + -0.000414f, +0.000824f, +0.000479f, -0.000647f, +0.000594f, +0.000576f, -0.000014f, -0.000624f, +0.000307f, -0.000229f, + +0.000015f, -0.000616f, +0.000217f, -0.000117f, +0.000428f, -0.000330f, -0.000155f, -0.000400f, +0.000008f, -0.000080f, + -0.000200f, -0.000054f, +0.000146f, -0.000014f, +0.000101f, +0.000495f + }, + { + -0.000514f, -0.012916f, -0.013889f, +0.003050f, -0.000969f, +0.000884f, -0.000546f, +0.003121f, +0.002267f, +0.001004f, + +0.004679f, +0.001476f, -0.001769f, -0.008640f, -0.009674f, +0.010575f, +0.017602f, -0.000023f, -0.010384f, +0.000560f, + +0.009646f, +0.010081f, -0.007907f, +0.005007f, -0.018546f, +0.005010f, -0.003932f, -0.008823f, +0.008395f, +0.001921f, + +0.004712f, -0.001053f, +0.000791f, -0.000829f, -0.001742f, -0.001612f, -0.004981f, +0.001253f, -0.001245f, +0.000421f, + -0.002988f, -0.000991f, +0.001285f, +0.000310f, -0.004348f, -0.001755f, -0.000503f, -0.001900f, +0.003255f, -0.002109f, + +0.001352f, -0.001239f, -0.001620f, +0.001273f, +0.001165f, -0.001359f, +0.000108f, -0.001601f, -0.000592f, -0.000236f, + +0.000107f, +0.001572f, -0.000226f, +0.001601f, -0.001104f, -0.000189f, +0.000622f, +0.000777f, +0.001367f, +0.000338f, + +0.000079f, -0.000633f, -0.000091f, -0.000165f, +0.000291f, -0.000158f, +0.000340f, +0.000111f, +0.000088f, -0.000053f, + -0.000330f, +0.000227f, +0.000051f, -0.000262f, +0.000557f, -0.000231f, +0.000089f, -0.000176f, +0.000559f, -0.000033f, + -0.000497f, +0.000162f, -0.000039f, +0.000433f, +0.000013f, +0.000024f + }, + { + -0.004625f, -0.226470f, -0.021225f, +0.000694f, +0.007278f, -0.010416f, -0.001951f, +0.001725f, +0.002376f, +0.000942f, + +0.000655f, -0.002375f, +0.001123f, +0.007508f, +0.001487f, -0.002989f, +0.005917f, -0.005909f, -0.003469f, +0.004362f, + +0.000022f, -0.004877f, +0.004197f, +0.004336f, -0.003200f, -0.003944f, -0.003493f, -0.000408f, -0.003270f, +0.001768f, + -0.004890f, -0.003207f, -0.000617f, +0.002462f, +0.004588f, +0.003094f, +0.002306f, -0.004720f, +0.002669f, +0.002187f, + +0.002302f, -0.002425f, +0.004629f, +0.000783f, +0.001791f, +0.000383f, -0.001805f, -0.001063f, +0.000745f, +0.000433f, + -0.001788f, -0.000809f, +0.000032f, -0.000762f, +0.000371f, -0.000546f, -0.000669f, +0.000549f, +0.000713f, +0.000235f, + -0.000456f, -0.001207f, +0.000162f, -0.000011f, -0.000361f, +0.000151f, +0.001091f, +0.000112f, +0.000268f, +0.000301f, + +0.000345f, -0.000806f, -0.000268f, +0.000447f, -0.000187f, +0.000427f, -0.000717f, +0.000267f, -0.000229f, -0.000084f, + +0.000100f, +0.000075f, +0.000080f, +0.000381f, +0.000054f, +0.000112f, -0.000151f, +0.000143f, +0.000048f, -0.000118f, + -0.000156f, -0.000039f, -0.000014f, -0.000261f, +0.000003f, +0.000003f + }, + { + +0.002243f, +0.027955f, +0.002785f, -0.010311f, +0.000395f, -0.004818f, -0.001538f, +0.006241f, -0.003533f, -0.002108f, + +0.000732f, -0.004062f, +0.000005f, -0.006274f, -0.000907f, -0.003479f, -0.015286f, +0.015894f, -0.005806f, +0.001016f, + +0.025532f, -0.009178f, +0.007886f, +0.003150f, +0.003814f, +0.003062f, -0.004113f, +0.009717f, -0.008078f, +0.002030f, + -0.006058f, +0.005779f, +0.009417f, -0.005847f, +0.000021f, +0.001414f, +0.001177f, -0.002861f, -0.004214f, -0.000855f, + -0.000744f, +0.002221f, -0.000127f, -0.000626f, +0.001692f, -0.001335f, +0.001216f, -0.002595f, -0.002110f, -0.001010f, + +0.001968f, +0.000997f, +0.001393f, -0.000023f, +0.000841f, -0.002659f, +0.000151f, +0.000625f, +0.001036f, -0.000165f, + -0.000960f, -0.000396f, +0.000504f, +0.000748f, +0.000238f, +0.000767f, +0.000095f, -0.000646f, +0.000438f, -0.000280f, + -0.000473f, -0.000546f, -0.000866f, +0.000645f, -0.000441f, +0.000201f, +0.000024f, +0.000688f, +0.000081f, +0.000079f, + -0.000235f, +0.000180f, -0.000407f, -0.000037f, +0.000177f, +0.000201f, +0.000129f, +0.000165f, -0.000183f, +0.000107f, + +0.000204f, +0.000391f, +0.000113f, +0.000290f, -0.000391f, +0.000014f + }, + { + -0.035780f, -0.031402f, +0.020568f, -0.008190f, +0.002696f, +0.012815f, +0.007951f, +0.001908f, -0.002451f, +0.001621f, + +0.005765f, -0.003536f, -0.000076f, -0.009994f, -0.011479f, +0.006268f, +0.001465f, -0.001203f, +0.003514f, +0.004583f, + -0.003860f, -0.000425f, -0.001143f, -0.002683f, +0.000064f, -0.002060f, -0.002160f, -0.004313f, +0.000562f, -0.003923f, + +0.000838f, -0.001842f, +0.001832f, -0.004549f, -0.004477f, +0.001168f, +0.003051f, +0.001919f, +0.000988f, -0.002974f, + +0.003539f, +0.002983f, -0.006162f, -0.002970f, +0.000344f, -0.000647f, +0.000524f, +0.003448f, -0.004223f, +0.000037f, + -0.000877f, +0.002458f, +0.000595f, +0.002401f, +0.000555f, +0.000934f, +0.001625f, -0.000246f, -0.000675f, +0.001117f, + +0.000850f, +0.000031f, +0.000210f, +0.000143f, -0.000799f, +0.000416f, +0.000007f, +0.000533f, +0.000366f, +0.000318f, + -0.000401f, +0.000460f, -0.000977f, -0.000358f, -0.000065f, +0.000335f, +0.000277f, +0.000233f, +0.000192f, +0.000015f, + +0.000195f, -0.000385f, +0.000486f, +0.000024f, -0.000197f, -0.000142f, +0.000049f, +0.000356f, +0.000372f, -0.000516f, + +0.000152f, -0.000105f, +0.000328f, -0.000031f, +0.000060f, -0.000176f + }, + { + +0.000341f, +0.021034f, -0.002155f, +0.007638f, +0.001184f, +0.003780f, -0.004366f, +0.004316f, +0.000650f, -0.004145f, + -0.005854f, -0.003851f, +0.027681f, +0.006819f, +0.004108f, -0.005950f, -0.004810f, -0.000293f, -0.006363f, +0.000333f, + -0.013834f, +0.005172f, -0.014050f, -0.001765f, +0.005443f, +0.006864f, +0.001521f, -0.008928f, -0.003681f, -0.005175f, + +0.011718f, +0.008480f, +0.001963f, +0.002486f, +0.003486f, +0.003596f, -0.002625f, +0.004260f, +0.000555f, +0.000876f, + -0.001779f, -0.000620f, -0.001008f, +0.002002f, +0.002298f, +0.004106f, -0.000728f, +0.000308f, +0.000595f, -0.000754f, + +0.002760f, +0.001796f, +0.003481f, -0.002848f, -0.000991f, -0.000569f, +0.002250f, +0.000031f, +0.000385f, +0.001675f, + +0.000100f, +0.001477f, +0.000601f, -0.000858f, +0.000598f, +0.000981f, +0.001052f, -0.000928f, +0.000547f, +0.000046f, + +0.001592f, +0.001240f, +0.000662f, -0.001031f, -0.000061f, +0.000752f, +0.000931f, -0.000520f, +0.000784f, +0.000361f, + +0.000465f, -0.000509f, -0.000665f, +0.000110f, -0.000289f, +0.000836f, -0.000001f, -0.000182f, -0.000257f, -0.000269f, + +0.000330f, -0.000835f, -0.000331f, +0.000317f, +0.000081f, -0.000234f + }, + { + -0.022024f, -0.113415f, +0.016381f, +0.017916f, +0.003064f, +0.005969f, -0.001349f, -0.003438f, -0.004045f, -0.000279f, + -0.007469f, -0.007921f, -0.009380f, -0.011950f, -0.030396f, +0.005643f, +0.006340f, +0.001981f, +0.000730f, +0.004442f, + +0.002785f, +0.004087f, +0.001100f, +0.002042f, +0.001408f, +0.000440f, +0.000151f, +0.001885f, -0.005574f, -0.002382f, + +0.003027f, -0.002667f, +0.003782f, -0.001736f, +0.002161f, +0.001065f, -0.004478f, -0.000483f, -0.003188f, +0.001614f, + +0.005987f, -0.000921f, -0.003986f, -0.000204f, -0.000347f, +0.000614f, -0.003419f, -0.000322f, +0.002156f, +0.000560f, + +0.001858f, -0.000827f, -0.001116f, +0.001592f, +0.001654f, +0.000375f, +0.001836f, -0.001593f, +0.000193f, -0.000860f, + -0.000280f, +0.000554f, -0.001327f, +0.000260f, -0.000744f, -0.000542f, +0.000930f, +0.001348f, +0.000039f, -0.000622f, + -0.000129f, +0.000001f, +0.000328f, +0.000753f, +0.000397f, +0.000390f, -0.000634f, -0.000058f, -0.000036f, -0.000443f, + +0.000321f, +0.000596f, -0.000057f, +0.000253f, +0.000613f, +0.000270f, -0.000524f, -0.000073f, -0.000445f, -0.000157f, + -0.000056f, -0.000163f, -0.000096f, +0.000105f, +0.000041f, -0.000397f + }, + { + -0.000836f, -0.002935f, -0.001301f, -0.002446f, -0.000003f, -0.000227f, +0.001095f, -0.000367f, +0.001945f, +0.002927f, + -0.001005f, -0.005534f, -0.016803f, -0.005478f, -0.153628f, +0.022279f, -0.001070f, -0.006066f, +0.003771f, -0.003875f, + +0.022895f, -0.006942f, -0.012971f, -0.009001f, +0.012119f, +0.005419f, +0.005375f, +0.002278f, -0.001086f, -0.007950f, + -0.001183f, -0.003064f, +0.002448f, +0.000415f, +0.001191f, -0.007387f, +0.002394f, +0.010150f, +0.002139f, +0.002031f, + -0.000212f, -0.001349f, +0.002405f, -0.000123f, -0.000149f, +0.000994f, -0.001360f, -0.001108f, -0.001295f, -0.000411f, + +0.002227f, -0.000746f, -0.000990f, +0.000550f, +0.000179f, +0.001054f, +0.002923f, -0.001310f, -0.000628f, -0.000752f, + -0.000184f, -0.001863f, -0.000714f, -0.000514f, -0.000257f, +0.000941f, +0.001011f, -0.001577f, -0.000033f, +0.000577f, + +0.000246f, +0.000311f, +0.000154f, +0.000039f, -0.000489f, -0.000078f, -0.000534f, -0.000752f, +0.000272f, -0.000335f, + -0.000230f, +0.000419f, -0.000402f, -0.000768f, +0.000085f, -0.000152f, -0.000029f, +0.000518f, -0.000110f, +0.000020f, + +0.000195f, +0.000132f, -0.000001f, -0.000068f, +0.000269f, -0.000229f + } + }, + { + { + -0.014986f, +0.317761f, -0.071860f, +0.016828f, -0.002995f, -0.001141f, -0.000458f, -0.003720f, -0.004255f, +0.004767f, + +0.002878f, +0.005523f, -0.003210f, -0.002013f, -0.004112f, +0.003965f, +0.003587f, -0.000246f, +0.006658f, -0.003789f, + -0.001667f, -0.003656f, -0.000194f, +0.003720f, -0.000927f, -0.001925f, +0.003126f, -0.005430f, +0.006855f, +0.002151f, + +0.004385f, +0.005984f, -0.003483f, -0.000618f, -0.000726f, +0.001379f, +0.000735f, +0.001098f, +0.000792f, -0.006230f, + -0.002189f, +0.000700f, -0.002070f, -0.001191f, +0.000461f, -0.002109f, -0.000165f, -0.001079f, +0.000306f, +0.000567f, + +0.000264f, -0.001927f, +0.000321f, -0.000483f, +0.001038f, -0.001053f, +0.000968f, +0.000331f, +0.000353f, +0.000347f, + +0.001066f, -0.000881f, +0.000873f, -0.000516f, +0.000400f, +0.000495f, +0.000108f, -0.000240f, +0.000033f, +0.000529f, + +0.000446f, +0.000035f, -0.000311f, +0.000063f, +0.000204f, +0.000042f, -0.000034f, -0.000058f, +0.000455f, +0.000391f, + -0.000449f, -0.000298f, +0.000266f, +0.000332f, +0.000302f, -0.000109f, -0.000261f, +0.000048f, -0.000225f, +0.000006f, + -0.000098f, +0.000064f, +0.000196f, +0.000147f, +0.000179f, +0.000101f + }, + { + -0.003691f, +0.094266f, -0.020326f, -0.007418f, -0.008323f, +0.000235f, -0.002594f, +0.002193f, -0.002482f, -0.001568f, + +0.001898f, +0.001031f, -0.003317f, -0.007965f, +0.013886f, +0.008979f, -0.003298f, -0.001673f, -0.017640f, -0.000781f, + -0.006916f, +0.005031f, -0.002046f, -0.002849f, +0.006345f, +0.001782f, -0.001106f, -0.006090f, -0.002819f, -0.000417f, + -0.003615f, +0.006808f, +0.005343f, +0.002094f, +0.003113f, -0.004571f, -0.004357f, +0.001754f, -0.001451f, +0.000387f, + +0.001575f, +0.000978f, -0.002796f, +0.001070f, +0.004087f, -0.001987f, +0.000464f, -0.000217f, -0.000301f, -0.000261f, + -0.000437f, -0.000560f, +0.000039f, +0.000901f, -0.000993f, +0.000949f, -0.000980f, -0.000925f, +0.000837f, -0.000028f, + +0.000337f, -0.000180f, +0.000656f, -0.000740f, +0.000489f, +0.000071f, +0.000422f, -0.000493f, -0.000340f, +0.000187f, + -0.000435f, +0.000585f, -0.000302f, +0.000249f, +0.000276f, +0.000090f, -0.000263f, +0.000432f, +0.000169f, -0.000349f, + -0.000087f, +0.000212f, -0.000103f, +0.000283f, -0.000086f, +0.000230f, -0.000237f, -0.000048f, -0.000119f, -0.000504f, + +0.000505f, -0.000071f, +0.000175f, -0.000229f, -0.000352f, +0.000235f + }, + { + +0.006448f, -0.206543f, +0.047020f, +0.021010f, -0.007880f, -0.000256f, +0.000131f, -0.000704f, +0.000349f, -0.000337f, + -0.000331f, +0.002412f, -0.007389f, +0.005955f, -0.004928f, +0.002328f, +0.001726f, -0.001363f, -0.008505f, -0.002123f, + -0.002204f, -0.003271f, +0.005161f, -0.003269f, -0.002633f, -0.004878f, -0.001231f, -0.000907f, +0.004953f, -0.004523f, + -0.003571f, +0.004884f, +0.000337f, +0.002630f, -0.010185f, +0.007788f, +0.001775f, +0.002501f, -0.001706f, -0.000488f, + -0.001017f, +0.004877f, -0.000583f, -0.001034f, +0.000838f, -0.000907f, +0.000086f, +0.000865f, -0.002370f, -0.000014f, + +0.001440f, +0.000125f, -0.000837f, +0.001891f, +0.001515f, +0.000169f, +0.000130f, -0.000000f, -0.000458f, -0.001051f, + -0.000719f, +0.000541f, +0.000777f, -0.000561f, +0.001281f, -0.000450f, +0.000037f, +0.000467f, +0.000422f, -0.000067f, + -0.000483f, -0.000385f, -0.000200f, +0.000924f, -0.000321f, -0.000501f, +0.000074f, +0.000063f, +0.000586f, -0.000481f, + +0.000036f, -0.000047f, -0.000316f, +0.000234f, +0.000313f, -0.000373f, -0.000157f, -0.000139f, -0.000201f, +0.000291f, + -0.000110f, -0.000072f, +0.000209f, -0.000081f, +0.000042f, +0.000318f + }, + { + -0.053352f, +0.075052f, +0.022592f, +0.007095f, -0.000440f, +0.000168f, -0.003358f, +0.000326f, -0.001844f, +0.000265f, + -0.003133f, +0.002648f, -0.000396f, +0.001140f, -0.019899f, +0.001624f, +0.002809f, -0.020512f, +0.004727f, -0.004447f, + +0.001598f, -0.001913f, +0.006869f, -0.000120f, -0.000914f, +0.002667f, +0.000990f, +0.001662f, -0.000560f, +0.000000f, + -0.003340f, +0.000339f, -0.002061f, +0.000882f, -0.001569f, -0.002358f, -0.002728f, +0.003274f, -0.002253f, -0.001191f, + +0.002492f, +0.000274f, +0.000064f, -0.002106f, +0.000194f, +0.000521f, -0.000616f, +0.001196f, -0.001551f, +0.000402f, + +0.000138f, +0.000563f, -0.000453f, +0.000955f, +0.000940f, +0.001931f, -0.000796f, +0.000370f, -0.000305f, +0.001038f, + -0.001067f, +0.000863f, -0.001079f, +0.000207f, -0.000355f, +0.000160f, +0.000191f, -0.000093f, +0.000119f, -0.000044f, + +0.000795f, -0.000403f, -0.000216f, -0.000053f, -0.000086f, -0.000440f, -0.000318f, -0.000199f, +0.000400f, -0.000049f, + -0.000355f, -0.000307f, +0.000210f, +0.000330f, -0.000224f, -0.000151f, +0.000077f, -0.000136f, -0.000089f, +0.000195f, + -0.000028f, -0.000036f, +0.000043f, +0.000050f, -0.000218f, +0.000177f + }, + { + -0.002262f, +0.028607f, -0.002843f, +0.002682f, -0.001946f, -0.000274f, +0.000330f, -0.000751f, +0.001001f, -0.000961f, + +0.002141f, -0.001000f, -0.003468f, -0.001246f, +0.017519f, -0.000369f, +0.004656f, -0.011216f, +0.028724f, +0.011711f, + -0.006990f, +0.006823f, -0.000626f, -0.002716f, +0.004933f, -0.001930f, +0.000314f, -0.000614f, +0.002865f, +0.002702f, + +0.001550f, +0.000112f, -0.002783f, -0.002651f, +0.003863f, +0.000582f, +0.000892f, -0.002195f, -0.000990f, +0.001537f, + +0.001483f, +0.001323f, -0.001369f, -0.000004f, -0.000718f, +0.000563f, +0.000276f, -0.001039f, +0.001181f, +0.000181f, + -0.000050f, -0.000036f, -0.001479f, -0.001269f, +0.001127f, -0.001075f, +0.000530f, -0.002161f, +0.001270f, +0.000507f, + +0.001760f, +0.000391f, -0.001071f, +0.000124f, +0.000119f, +0.000357f, -0.000765f, +0.000211f, +0.000482f, -0.001063f, + +0.000184f, +0.000626f, -0.000233f, -0.000179f, +0.000982f, -0.000015f, +0.000193f, +0.000213f, +0.000397f, +0.000096f, + +0.000038f, -0.000055f, +0.000334f, -0.000037f, -0.000280f, +0.000183f, -0.000137f, +0.000127f, -0.000112f, +0.000373f, + +0.000044f, +0.000002f, -0.000354f, +0.000484f, +0.000052f, -0.000075f + }, + { + -0.085559f, -0.004003f, +0.060858f, +0.006198f, -0.002017f, +0.001047f, +0.001407f, -0.006750f, +0.002652f, +0.003932f, + -0.004535f, -0.003304f, +0.006577f, -0.009109f, +0.004970f, +0.001308f, -0.004280f, +0.000361f, -0.001476f, +0.004062f, + -0.002555f, +0.003516f, -0.000126f, -0.001718f, +0.002219f, +0.002335f, +0.001046f, +0.002069f, +0.001246f, -0.001794f, + +0.007760f, +0.000515f, -0.001215f, +0.001696f, +0.001783f, -0.000824f, +0.001206f, -0.003419f, -0.000629f, +0.000271f, + -0.003192f, +0.003017f, +0.000256f, +0.001398f, -0.001290f, -0.000014f, -0.002543f, +0.000490f, +0.001782f, -0.002495f, + +0.001598f, +0.000609f, -0.000193f, -0.000633f, +0.000544f, +0.001335f, -0.000048f, +0.000841f, -0.000328f, +0.000543f, + -0.000519f, -0.000599f, +0.001406f, -0.000532f, +0.000839f, -0.000087f, +0.000822f, +0.000099f, +0.000436f, -0.000165f, + -0.000229f, -0.000181f, -0.000011f, +0.000251f, +0.000280f, +0.000585f, -0.000385f, +0.000022f, -0.000020f, +0.000712f, + +0.000046f, +0.000027f, -0.000254f, +0.000566f, +0.000024f, -0.000034f, +0.000047f, +0.000020f, -0.000401f, +0.000170f, + +0.000107f, -0.000010f, +0.000037f, -0.000250f, +0.000304f, -0.000163f + }, + { + +0.000742f, -0.004361f, -0.000911f, +0.003732f, -0.000841f, +0.000536f, -0.000721f, +0.001967f, -0.000040f, -0.000304f, + -0.000391f, -0.001262f, +0.003792f, -0.011989f, +0.017713f, +0.011113f, +0.008238f, +0.001477f, -0.001758f, +0.013498f, + -0.000541f, -0.001755f, -0.024932f, -0.007213f, +0.001473f, +0.003063f, -0.002247f, +0.001264f, -0.002820f, -0.003844f, + -0.004243f, -0.002118f, +0.005446f, +0.001945f, -0.000804f, -0.001181f, -0.000689f, -0.000613f, +0.002575f, +0.002010f, + -0.001206f, -0.000621f, +0.002290f, -0.000539f, +0.002666f, -0.000041f, -0.000250f, -0.000873f, +0.000557f, -0.000491f, + -0.000591f, +0.000088f, +0.001002f, -0.000123f, +0.000352f, +0.000375f, +0.001111f, -0.000156f, -0.000826f, -0.000017f, + +0.000619f, +0.000037f, -0.000576f, +0.000412f, +0.000227f, -0.000842f, -0.000278f, +0.000170f, -0.000326f, -0.000179f, + +0.000248f, -0.000687f, -0.000409f, +0.000592f, +0.000298f, +0.000339f, +0.000228f, -0.000199f, -0.000570f, +0.000249f, + +0.000259f, -0.000487f, +0.000238f, +0.000015f, -0.000130f, +0.000077f, +0.000044f, +0.000163f, +0.000144f, +0.000388f, + -0.000151f, -0.000039f, -0.000072f, -0.000116f, +0.000070f, -0.000039f + }, + { + +0.061689f, -0.131908f, -0.025487f, -0.006480f, +0.000639f, +0.000162f, +0.004245f, -0.001574f, -0.000040f, +0.001695f, + -0.000698f, +0.005499f, -0.002615f, +0.000735f, -0.003350f, +0.000515f, -0.004088f, +0.000077f, +0.000644f, +0.001990f, + +0.000239f, -0.004474f, +0.000979f, -0.002219f, +0.001806f, +0.000484f, +0.002064f, +0.003093f, -0.001112f, +0.001052f, + +0.000751f, -0.001443f, -0.001838f, -0.003630f, +0.000630f, +0.000767f, +0.001121f, -0.000583f, -0.002316f, -0.000332f, + +0.002208f, +0.001511f, +0.001478f, -0.000271f, -0.001252f, +0.002703f, -0.001813f, +0.003538f, -0.000132f, +0.000777f, + -0.001471f, -0.000980f, -0.000177f, +0.001544f, -0.000281f, +0.001132f, +0.002185f, -0.000975f, -0.000202f, +0.000413f, + +0.000568f, +0.000008f, -0.000770f, -0.000315f, +0.000557f, +0.000429f, -0.000795f, +0.000979f, -0.000243f, +0.000786f, + -0.001107f, -0.000792f, +0.000178f, +0.000139f, +0.000592f, +0.000466f, +0.000468f, -0.000272f, +0.000922f, +0.000102f, + +0.000235f, -0.000117f, +0.000365f, +0.000078f, +0.000366f, -0.000391f, +0.000119f, -0.000243f, +0.000075f, -0.000003f, + +0.000165f, +0.000209f, +0.000004f, -0.000174f, -0.000087f, +0.000231f + }, + { + +0.001810f, +0.012293f, +0.001838f, +0.003888f, -0.003284f, +0.000262f, -0.000950f, +0.002541f, -0.000628f, -0.000716f, + +0.004427f, +0.000261f, +0.004517f, +0.004598f, -0.004562f, +0.008003f, +0.004434f, -0.000305f, +0.003133f, -0.005101f, + -0.003005f, +0.005772f, -0.005512f, +0.014090f, -0.017553f, +0.003682f, +0.003664f, -0.008504f, +0.003785f, -0.003254f, + +0.002560f, +0.001116f, +0.002954f, +0.002594f, +0.000036f, +0.000198f, -0.001632f, +0.001113f, -0.001895f, +0.001629f, + -0.000628f, -0.000911f, +0.000575f, +0.002686f, -0.000780f, -0.000010f, +0.000380f, -0.002884f, +0.002635f, -0.001738f, + +0.001143f, -0.000272f, -0.001500f, +0.000057f, -0.000324f, -0.001399f, +0.000364f, -0.001521f, +0.001184f, +0.000159f, + +0.000299f, +0.001171f, -0.001174f, +0.000710f, -0.000451f, -0.000041f, +0.000148f, -0.000128f, -0.000356f, +0.000487f, + +0.000656f, -0.000164f, +0.000564f, -0.000066f, +0.000181f, -0.000283f, +0.000004f, +0.000283f, +0.000218f, +0.000137f, + -0.000078f, +0.000052f, -0.000078f, -0.000442f, +0.000318f, -0.000354f, +0.000158f, -0.000228f, +0.000403f, +0.000017f, + -0.000083f, +0.000040f, -0.000263f, +0.000185f, -0.000149f, +0.000151f + }, + { + +0.005499f, -0.149517f, +0.039529f, -0.001598f, +0.006454f, -0.007507f, -0.002259f, -0.003668f, -0.000728f, -0.002314f, + +0.003432f, -0.000421f, -0.005646f, +0.000038f, +0.006535f, -0.005455f, +0.011117f, +0.003957f, -0.003423f, +0.010497f, + +0.005274f, -0.005698f, +0.002061f, +0.003975f, -0.003710f, +0.000167f, +0.002816f, +0.001219f, -0.003920f, +0.001774f, + -0.004376f, -0.003815f, +0.000438f, +0.000055f, -0.003403f, +0.002308f, +0.002929f, -0.004792f, +0.002766f, +0.001548f, + +0.002425f, -0.002311f, +0.003051f, +0.001271f, +0.001825f, -0.001267f, -0.001807f, +0.000618f, -0.000166f, +0.000032f, + -0.001085f, -0.000448f, +0.000208f, -0.001212f, +0.000990f, +0.000691f, -0.000127f, -0.000548f, -0.000203f, -0.000782f, + +0.000312f, -0.000520f, -0.000104f, +0.000328f, -0.000588f, +0.000142f, +0.000932f, -0.000348f, +0.000003f, -0.000100f, + +0.000253f, -0.000529f, +0.000096f, +0.000351f, -0.000180f, +0.000176f, -0.000514f, +0.000155f, -0.000114f, -0.000063f, + -0.000074f, -0.000010f, +0.000032f, -0.000072f, -0.000028f, +0.000129f, -0.000140f, +0.000226f, +0.000028f, -0.000100f, + +0.000222f, -0.000095f, +0.000158f, -0.000100f, +0.000222f, +0.000016f + }, + { + -0.002400f, +0.027601f, +0.008795f, -0.008021f, +0.002298f, -0.003636f, -0.001722f, +0.007454f, -0.000343f, -0.001206f, + +0.001704f, -0.001979f, -0.006783f, -0.005448f, +0.005918f, -0.003738f, -0.008574f, +0.015533f, -0.003608f, -0.010742f, + +0.012014f, -0.012019f, +0.004095f, +0.001932f, +0.004141f, +0.001175f, -0.008331f, +0.008968f, -0.003861f, +0.008261f, + +0.000424f, +0.000920f, +0.002933f, -0.004344f, +0.001465f, -0.001299f, -0.002473f, -0.002856f, -0.000874f, +0.000825f, + -0.000049f, -0.000599f, -0.000514f, +0.000863f, +0.000404f, +0.000469f, +0.001519f, -0.002258f, +0.000637f, +0.001040f, + +0.001829f, -0.000460f, +0.000291f, -0.000602f, +0.001745f, -0.000194f, +0.000597f, -0.000184f, -0.000360f, -0.000509f, + -0.000039f, -0.000151f, -0.000253f, +0.000574f, -0.000082f, -0.000290f, -0.000050f, -0.000222f, -0.000087f, -0.000117f, + +0.000541f, +0.000141f, -0.000393f, +0.000718f, -0.000419f, +0.000242f, -0.000233f, +0.000273f, +0.000016f, +0.000044f, + -0.000016f, +0.000249f, -0.000565f, -0.000050f, +0.000065f, +0.000252f, -0.000001f, +0.000154f, -0.000238f, +0.000042f, + -0.000065f, +0.000216f, +0.000022f, +0.000217f, -0.000256f, +0.000113f + }, + { + +0.021416f, +0.023611f, +0.000564f, -0.007739f, +0.002781f, -0.007020f, -0.003917f, +0.000622f, -0.003679f, +0.003996f, + +0.002645f, -0.002016f, +0.007377f, -0.001978f, -0.011449f, -0.001515f, -0.003989f, -0.003523f, +0.002926f, +0.000322f, + -0.000870f, +0.000308f, -0.003976f, -0.002778f, +0.000249f, -0.001907f, +0.001647f, -0.002831f, +0.001102f, -0.004964f, + -0.000247f, -0.006210f, +0.001561f, -0.001481f, -0.001378f, +0.001027f, +0.001562f, +0.001478f, +0.001235f, -0.003643f, + +0.000874f, +0.001455f, -0.002158f, -0.000272f, +0.001218f, +0.000761f, -0.000331f, +0.001750f, -0.003842f, +0.002869f, + +0.000259f, +0.000855f, -0.001870f, +0.000505f, -0.000659f, +0.000044f, +0.001468f, +0.000335f, -0.000706f, +0.000749f, + -0.000298f, -0.000451f, +0.000190f, +0.000067f, -0.000980f, +0.000607f, +0.000288f, +0.000099f, +0.000002f, +0.000419f, + -0.000566f, +0.000392f, -0.000547f, +0.000218f, +0.000216f, -0.000004f, +0.000127f, +0.000390f, -0.000046f, -0.000046f, + +0.000607f, -0.000122f, +0.000202f, +0.000030f, +0.000129f, -0.000217f, +0.000042f, -0.000247f, +0.000176f, -0.000045f, + +0.000105f, -0.000170f, +0.000163f, -0.000077f, +0.000172f, +0.000010f + }, + { + +0.000063f, +0.011793f, -0.013201f, +0.003806f, -0.001364f, +0.002328f, -0.005024f, +0.002680f, +0.000215f, -0.001369f, + -0.003675f, -0.001214f, -0.011717f, -0.036980f, +0.015594f, -0.017734f, -0.009342f, +0.000354f, -0.007794f, +0.001141f, + -0.010910f, +0.012174f, -0.007017f, +0.005515f, -0.006254f, -0.006233f, +0.001514f, -0.005500f, -0.002425f, -0.004541f, + +0.002415f, +0.001523f, +0.000154f, +0.002120f, -0.000974f, -0.000563f, -0.004428f, +0.000406f, +0.001214f, -0.002529f, + -0.003191f, +0.001791f, -0.001117f, -0.000710f, -0.001344f, -0.000225f, -0.001213f, +0.000286f, +0.001798f, -0.001609f, + +0.000217f, -0.000525f, +0.001154f, -0.001782f, +0.000724f, -0.001037f, -0.000364f, -0.000504f, -0.000355f, +0.001217f, + -0.000066f, +0.001373f, -0.000478f, -0.000447f, +0.000317f, -0.000032f, +0.000305f, -0.000448f, +0.000721f, -0.000677f, + +0.000777f, +0.000164f, +0.000522f, -0.000187f, +0.000448f, +0.000167f, +0.000049f, -0.000686f, +0.000387f, -0.000347f, + +0.000312f, +0.000004f, -0.000232f, +0.000229f, -0.000394f, +0.000475f, +0.000255f, -0.000203f, -0.000235f, -0.000099f, + +0.000329f, -0.000173f, -0.000241f, +0.000039f, +0.000332f, -0.000253f + }, + { + +0.026334f, -0.057030f, -0.001710f, +0.001390f, -0.010380f, +0.007952f, +0.012598f, -0.001161f, -0.000167f, -0.000266f, + -0.000716f, +0.002209f, -0.001465f, +0.012368f, +0.003318f, -0.006999f, -0.006615f, +0.003900f, +0.000930f, -0.000125f, + +0.002213f, +0.003724f, -0.003097f, +0.000501f, -0.000720f, -0.000193f, -0.001316f, +0.000715f, -0.001925f, -0.003588f, + +0.002285f, -0.003011f, +0.002348f, -0.001146f, +0.003727f, +0.000912f, -0.003473f, +0.000887f, -0.002655f, -0.000164f, + +0.000755f, -0.003094f, -0.002884f, -0.000616f, -0.001666f, +0.000012f, -0.001720f, +0.000762f, +0.001173f, -0.000366f, + +0.001290f, -0.000497f, -0.000824f, +0.001375f, +0.000807f, -0.000287f, +0.001147f, -0.001070f, +0.000743f, +0.000076f, + +0.000082f, +0.000669f, -0.000219f, +0.000492f, -0.000609f, -0.000438f, +0.000871f, +0.000338f, -0.000339f, +0.000013f, + +0.000068f, -0.000240f, +0.000380f, -0.000219f, -0.000170f, +0.000303f, -0.000074f, +0.000039f, -0.000055f, -0.000303f, + -0.000131f, +0.000120f, -0.000251f, -0.000105f, +0.000062f, -0.000141f, +0.000168f, +0.000399f, -0.000414f, +0.000052f, + +0.000187f, -0.000365f, +0.000028f, +0.000081f, +0.000179f, -0.000281f + }, + { + +0.000696f, -0.007471f, -0.003985f, -0.000763f, -0.001042f, -0.000923f, +0.000141f, +0.000382f, +0.001945f, +0.001046f, + -0.003430f, -0.004151f, -0.008851f, +0.053530f, -0.095672f, +0.008332f, -0.004444f, -0.005246f, -0.004454f, -0.012815f, + +0.007333f, -0.013923f, -0.005805f, -0.000109f, +0.005236f, -0.000441f, +0.001683f, -0.002736f, -0.001264f, -0.003050f, + +0.000500f, -0.003227f, +0.002848f, +0.000047f, +0.002730f, -0.003426f, +0.001818f, +0.003091f, -0.002118f, -0.000016f, + +0.001134f, -0.001774f, +0.000997f, -0.000781f, -0.000017f, +0.000116f, -0.001018f, -0.000249f, -0.001383f, +0.000406f, + +0.001928f, -0.001137f, +0.000231f, -0.001313f, -0.002696f, -0.000602f, +0.001326f, -0.000765f, +0.000100f, -0.000917f, + -0.000312f, -0.000958f, -0.000211f, -0.000687f, -0.000418f, -0.000573f, +0.000309f, -0.000396f, -0.000014f, +0.000568f, + +0.000207f, +0.000839f, -0.000298f, +0.000020f, -0.000120f, -0.000013f, +0.000217f, -0.000230f, +0.000182f, -0.000234f, + -0.000435f, +0.000053f, -0.000085f, -0.000082f, -0.000121f, -0.000082f, -0.000062f, +0.000113f, -0.000040f, +0.000157f, + -0.000113f, -0.000061f, +0.000078f, -0.000063f, +0.000151f, -0.000259f + } + }, + { + { + +0.015168f, +0.151232f, +0.076229f, -0.008087f, +0.002014f, -0.000174f, -0.000486f, -0.002577f, +0.002093f, +0.000357f, + +0.002247f, +0.003008f, +0.000506f, -0.004324f, -0.000145f, +0.004750f, -0.000125f, +0.006220f, -0.003619f, -0.002279f, + +0.001784f, -0.001179f, -0.001201f, +0.000457f, +0.000528f, +0.000157f, +0.003244f, -0.001887f, +0.001887f, +0.002201f, + +0.006753f, +0.002111f, -0.000339f, +0.000302f, -0.000800f, +0.003530f, -0.001595f, +0.002397f, +0.000009f, -0.003811f, + -0.001345f, -0.000435f, -0.000033f, -0.000151f, -0.000958f, -0.000347f, -0.000324f, -0.002979f, -0.000006f, +0.000017f, + +0.000013f, -0.000049f, -0.000457f, -0.000149f, -0.000086f, -0.000534f, +0.000562f, +0.000722f, -0.000575f, +0.000304f, + +0.000598f, -0.000169f, -0.000155f, -0.000083f, -0.000031f, +0.000448f, +0.000141f, +0.000047f, -0.000057f, +0.000090f, + +0.000642f, -0.000209f, +0.000420f, +0.000031f, -0.000361f, -0.000200f, +0.000135f, +0.000211f, +0.000155f, +0.000192f, + +0.000190f, -0.000009f, +0.000159f, +0.000242f, +0.000200f, +0.000066f, -0.000032f, -0.000061f, -0.000055f, -0.000113f, + +0.000121f, +0.000047f, +0.000128f, +0.000196f, +0.000096f, +0.000117f + }, + { + +0.002752f, +0.048993f, +0.012198f, -0.009312f, -0.005428f, -0.001528f, -0.001577f, -0.000221f, +0.000309f, +0.000413f, + +0.000890f, -0.001720f, -0.002116f, -0.000453f, +0.004191f, +0.006210f, -0.007460f, -0.002457f, -0.010159f, -0.004551f, + -0.003890f, -0.001692f, +0.000696f, -0.000988f, +0.008640f, +0.002059f, -0.002621f, -0.006979f, -0.002343f, -0.002204f, + -0.000206f, +0.003790f, +0.005699f, +0.002024f, +0.003316f, -0.002290f, -0.001037f, -0.001379f, +0.000025f, +0.001152f, + -0.001757f, +0.002202f, +0.000168f, +0.000260f, +0.001960f, -0.001095f, +0.000091f, -0.000541f, +0.000328f, -0.000484f, + -0.000219f, +0.000325f, +0.000772f, +0.000170f, -0.000191f, -0.000165f, -0.000902f, -0.000425f, +0.000141f, +0.000238f, + +0.000097f, +0.000762f, +0.000183f, -0.000300f, +0.000089f, +0.000428f, +0.000539f, +0.000212f, -0.000458f, -0.000237f, + +0.000164f, -0.000191f, -0.000153f, +0.000057f, +0.000345f, +0.000070f, -0.000232f, +0.000095f, +0.000277f, +0.000016f, + -0.000050f, +0.000051f, +0.000021f, -0.000073f, +0.000170f, +0.000217f, +0.000068f, -0.000012f, -0.000064f, -0.000006f, + -0.000020f, +0.000080f, +0.000066f, -0.000141f, -0.000124f, +0.000020f + }, + { + -0.001463f, -0.106686f, -0.031695f, +0.012274f, +0.009037f, +0.000586f, +0.000607f, -0.000171f, +0.000066f, +0.000235f, + -0.003783f, -0.000085f, +0.003424f, -0.000121f, -0.005329f, +0.003374f, +0.000336f, -0.000581f, -0.007086f, -0.004622f, + -0.004658f, +0.006389f, -0.001389f, -0.001728f, -0.001900f, -0.002222f, -0.002271f, +0.000551f, +0.000673f, -0.000788f, + -0.001092f, +0.001618f, +0.005153f, -0.001502f, -0.002435f, +0.001244f, +0.002406f, +0.002501f, -0.002175f, +0.000397f, + +0.000755f, +0.002654f, +0.002454f, -0.001047f, -0.000491f, -0.000050f, +0.000406f, +0.000647f, -0.000649f, -0.000003f, + -0.001244f, +0.000922f, +0.000291f, +0.002128f, +0.001889f, -0.000293f, -0.000202f, -0.000204f, -0.000625f, -0.000540f, + -0.000657f, +0.000359f, +0.000230f, +0.000361f, +0.000324f, +0.000598f, -0.000339f, +0.000318f, +0.000418f, +0.000028f, + -0.000742f, -0.000305f, +0.000403f, +0.000542f, -0.000221f, -0.000298f, +0.000004f, +0.000261f, -0.000047f, +0.000115f, + -0.000310f, -0.000270f, -0.000114f, -0.000015f, +0.000104f, -0.000147f, -0.000106f, -0.000179f, +0.000046f, +0.000112f, + -0.000092f, -0.000030f, +0.000112f, -0.000062f, -0.000007f, +0.000205f + }, + { + +0.034720f, -0.006430f, -0.004111f, +0.004588f, -0.001600f, -0.001547f, -0.001468f, -0.000099f, -0.000434f, -0.001573f, + -0.001425f, -0.000280f, -0.002060f, -0.000949f, -0.009971f, -0.002142f, +0.001519f, -0.010974f, -0.005030f, -0.001807f, + +0.001148f, +0.001529f, +0.001748f, +0.001923f, +0.000593f, -0.000045f, +0.001254f, +0.000792f, +0.000812f, +0.001150f, + -0.000087f, -0.001855f, -0.001898f, -0.000640f, -0.000494f, -0.001752f, -0.001876f, +0.000562f, -0.000461f, -0.000173f, + +0.000621f, -0.000588f, -0.000699f, -0.000272f, -0.000472f, +0.001463f, +0.000003f, +0.000511f, -0.000669f, -0.000645f, + +0.000406f, -0.000348f, +0.000339f, +0.000363f, +0.000895f, +0.001499f, +0.000199f, +0.000160f, -0.000023f, -0.000036f, + -0.000289f, +0.000134f, -0.000231f, +0.000251f, -0.000284f, +0.000210f, +0.000407f, -0.000402f, +0.000171f, +0.000280f, + -0.000140f, -0.000228f, -0.000273f, -0.000085f, -0.000584f, -0.000112f, -0.000158f, +0.000125f, +0.000152f, +0.000204f, + -0.000127f, -0.000040f, -0.000033f, +0.000092f, -0.000021f, -0.000105f, -0.000028f, -0.000157f, +0.000016f, +0.000103f, + -0.000003f, -0.000015f, +0.000085f, +0.000023f, -0.000030f, +0.000036f + }, + { + +0.000838f, +0.016475f, +0.002269f, +0.000706f, -0.000224f, +0.000258f, -0.000325f, -0.000063f, +0.000388f, +0.000037f, + +0.000225f, -0.001227f, -0.000959f, +0.001712f, +0.009257f, +0.000709f, -0.004931f, +0.019921f, +0.024283f, +0.005008f, + -0.001002f, +0.000283f, +0.004166f, +0.003600f, -0.000175f, -0.000925f, -0.002792f, -0.000126f, +0.000836f, +0.002339f, + +0.005459f, -0.001794f, -0.001663f, -0.002560f, +0.002272f, +0.001564f, -0.000462f, +0.001863f, -0.000824f, +0.000344f, + +0.000778f, +0.001764f, +0.000444f, -0.000656f, -0.001595f, +0.000183f, -0.000514f, +0.000974f, +0.000847f, +0.000875f, + -0.000232f, -0.000834f, -0.000955f, -0.000490f, -0.000808f, -0.000366f, +0.000052f, -0.001016f, +0.000385f, +0.001160f, + +0.001135f, -0.000312f, -0.000635f, -0.000215f, +0.000257f, +0.000088f, +0.000353f, -0.000101f, +0.000121f, -0.000301f, + -0.000055f, +0.000322f, -0.000032f, +0.000103f, +0.000428f, +0.000399f, +0.000334f, +0.000238f, +0.000292f, +0.000350f, + +0.000195f, +0.000019f, -0.000293f, +0.000012f, -0.000038f, -0.000081f, -0.000032f, -0.000039f, +0.000154f, +0.000176f, + +0.000057f, -0.000001f, -0.000143f, +0.000095f, +0.000163f, +0.000101f + }, + { + +0.052143f, -0.085666f, -0.018463f, -0.000186f, +0.000814f, +0.000640f, +0.000331f, -0.002669f, -0.001100f, +0.001561f, + -0.001312f, -0.000620f, -0.004909f, +0.000678f, +0.000657f, -0.001264f, -0.001140f, -0.000164f, +0.001599f, +0.001615f, + +0.001726f, +0.000869f, -0.000225f, -0.001604f, +0.001872f, +0.001186f, +0.002778f, +0.000358f, +0.000939f, +0.001096f, + +0.003696f, -0.001435f, +0.002319f, +0.001513f, +0.002056f, -0.001420f, -0.001262f, -0.001410f, +0.000133f, +0.000073f, + +0.000477f, -0.001082f, -0.000097f, +0.001448f, +0.000492f, -0.000815f, -0.001284f, -0.000232f, +0.001532f, +0.000294f, + -0.000878f, +0.000754f, +0.000705f, -0.000063f, -0.000158f, +0.000068f, +0.000737f, +0.000757f, +0.000430f, -0.000485f, + -0.000152f, +0.000133f, +0.000523f, -0.000125f, +0.000111f, +0.000353f, +0.000479f, +0.000346f, +0.000000f, -0.000274f, + -0.000082f, +0.000087f, -0.000355f, +0.000492f, +0.000188f, +0.000228f, +0.000238f, +0.000013f, +0.000036f, +0.000392f, + +0.000083f, -0.000062f, -0.000078f, +0.000052f, +0.000325f, +0.000205f, +0.000062f, -0.000027f, -0.000253f, -0.000033f, + +0.000102f, +0.000119f, -0.000011f, -0.000123f, +0.000002f, +0.000202f + }, + { + +0.000455f, +0.006888f, -0.001990f, -0.002220f, +0.000032f, +0.000499f, +0.000460f, +0.000037f, +0.000218f, -0.000664f, + -0.000143f, -0.000094f, -0.002748f, +0.011194f, -0.000519f, +0.007027f, +0.006389f, +0.000995f, +0.006703f, +0.002668f, + -0.002601f, -0.003417f, -0.007464f, -0.016643f, -0.000619f, +0.003069f, -0.000458f, -0.002243f, -0.001746f, -0.002731f, + -0.000319f, -0.002086f, +0.002694f, +0.002443f, +0.000732f, -0.001901f, -0.001353f, +0.000829f, +0.000683f, +0.001395f, + +0.001067f, -0.000897f, +0.000282f, +0.000544f, +0.002527f, +0.000373f, +0.000298f, -0.000273f, -0.000368f, -0.000874f, + -0.000349f, +0.000689f, +0.000250f, +0.000204f, +0.000214f, +0.000352f, +0.000864f, -0.000507f, -0.000223f, +0.000400f, + -0.000114f, +0.000009f, +0.000013f, +0.000244f, -0.000019f, -0.000274f, -0.000436f, +0.000442f, -0.000245f, -0.000038f, + -0.000460f, -0.000193f, -0.000328f, +0.000156f, +0.000510f, +0.000447f, +0.000494f, -0.000031f, -0.000393f, -0.000224f, + +0.000108f, +0.000143f, -0.000037f, -0.000008f, -0.000135f, +0.000095f, -0.000034f, +0.000102f, +0.000071f, -0.000130f, + -0.000022f, -0.000169f, -0.000006f, -0.000009f, -0.000035f, +0.000024f + }, + { + -0.043950f, -0.021860f, -0.006546f, -0.004499f, -0.003146f, +0.000058f, +0.000649f, +0.000087f, +0.001100f, +0.001178f, + +0.002566f, +0.000361f, -0.000624f, -0.001500f, -0.001530f, +0.000242f, -0.004533f, -0.003282f, +0.002636f, +0.000587f, + -0.000088f, -0.001442f, -0.000187f, +0.000666f, -0.001668f, +0.001551f, +0.002223f, +0.000162f, -0.000434f, +0.002635f, + -0.000476f, -0.002006f, -0.001919f, -0.002546f, +0.000206f, +0.004154f, +0.000493f, +0.000665f, -0.002789f, -0.002099f, + +0.000695f, +0.002336f, +0.001884f, -0.000158f, -0.000789f, -0.000763f, +0.000376f, +0.001857f, -0.000594f, +0.000859f, + +0.000031f, -0.001605f, -0.000034f, +0.000325f, +0.000228f, +0.001586f, +0.000987f, +0.000511f, -0.000424f, -0.000556f, + +0.000914f, -0.000338f, +0.000009f, -0.000420f, +0.000321f, -0.000279f, -0.000119f, +0.000115f, +0.000214f, +0.000154f, + -0.000460f, -0.000799f, +0.000024f, +0.000416f, +0.000269f, +0.000350f, +0.000617f, +0.000270f, +0.000519f, +0.000163f, + +0.000282f, +0.000167f, -0.000052f, +0.000234f, +0.000037f, -0.000088f, +0.000051f, -0.000087f, -0.000074f, +0.000325f, + +0.000140f, +0.000105f, +0.000049f, -0.000141f, -0.000052f, -0.000034f + }, + { + +0.000257f, +0.016239f, +0.008321f, +0.001370f, -0.000412f, -0.000494f, +0.000375f, +0.000543f, -0.000484f, -0.000296f, + +0.002550f, +0.000114f, +0.003728f, -0.000383f, +0.004054f, +0.005484f, +0.002340f, -0.003043f, +0.005462f, -0.007895f, + -0.000925f, +0.002111f, -0.001328f, +0.007236f, -0.006343f, -0.003076f, +0.000345f, -0.000028f, -0.002682f, -0.003150f, + +0.000714f, +0.002846f, +0.002792f, +0.001582f, +0.000759f, +0.000670f, -0.000129f, -0.000448f, +0.001066f, -0.000272f, + +0.000270f, +0.000658f, -0.000459f, +0.001260f, +0.001572f, +0.000825f, -0.000154f, -0.000968f, +0.000064f, +0.000041f, + -0.000142f, +0.000249f, -0.001001f, -0.001072f, -0.000397f, -0.000420f, -0.000020f, -0.000061f, +0.000737f, -0.000009f, + +0.000229f, -0.000185f, +0.000220f, -0.000476f, +0.000069f, -0.000655f, -0.000323f, -0.000130f, -0.000218f, +0.000579f, + +0.000222f, -0.000368f, +0.000296f, -0.000102f, +0.000089f, +0.000049f, -0.000225f, +0.000288f, +0.000143f, +0.000112f, + -0.000062f, -0.000046f, -0.000237f, -0.000198f, -0.000087f, -0.000001f, +0.000099f, +0.000064f, +0.000161f, -0.000004f, + +0.000152f, -0.000042f, -0.000158f, +0.000008f, -0.000018f, +0.000175f + }, + { + -0.006324f, -0.089693f, +0.002743f, +0.002274f, +0.003309f, +0.007966f, -0.012737f, -0.004371f, -0.001997f, -0.000686f, + +0.000482f, +0.000679f, -0.002051f, -0.004511f, +0.005264f, +0.000091f, +0.010663f, -0.000189f, -0.001188f, +0.007015f, + +0.003492f, +0.001718f, -0.000687f, +0.001231f, -0.002030f, +0.000337f, +0.002480f, -0.000327f, -0.000543f, +0.000394f, + -0.001504f, -0.002497f, -0.003273f, -0.001351f, -0.001390f, -0.000027f, +0.000920f, +0.000290f, +0.000572f, +0.001374f, + +0.000835f, +0.000707f, +0.000493f, +0.001021f, +0.001146f, +0.000277f, -0.001285f, +0.000078f, -0.000660f, +0.000717f, + +0.000250f, -0.000366f, +0.000023f, -0.000038f, +0.000302f, +0.000788f, -0.000149f, -0.000564f, -0.000492f, -0.000383f, + -0.000068f, -0.000105f, -0.000436f, +0.000079f, -0.000150f, +0.000194f, +0.000165f, +0.000425f, -0.000443f, +0.000022f, + +0.000071f, -0.000056f, +0.000102f, -0.000121f, +0.000137f, -0.000213f, +0.000077f, -0.000166f, -0.000125f, +0.000004f, + -0.000382f, +0.000039f, +0.000144f, -0.000241f, +0.000185f, +0.000147f, +0.000103f, +0.000169f, +0.000082f, +0.000040f, + +0.000109f, -0.000058f, +0.000001f, +0.000148f, +0.000092f, +0.000145f + }, + { + +0.001527f, +0.018775f, +0.004715f, -0.000591f, -0.001775f, +0.000786f, +0.001032f, +0.001653f, +0.000728f, +0.001354f, + +0.001006f, -0.000962f, -0.003030f, -0.006799f, +0.008449f, -0.007599f, +0.002895f, +0.002446f, +0.002067f, -0.005687f, + -0.002258f, -0.002811f, +0.000359f, +0.001083f, +0.003143f, +0.000851f, -0.001107f, -0.000011f, +0.002368f, +0.000793f, + +0.002453f, +0.002549f, -0.000616f, -0.002278f, -0.001756f, +0.000068f, -0.002664f, -0.000526f, -0.000690f, +0.001153f, + -0.000470f, -0.000656f, +0.000692f, +0.000509f, -0.000129f, +0.001099f, +0.000573f, -0.001021f, +0.001741f, +0.001398f, + +0.000866f, +0.000283f, -0.000330f, +0.000236f, +0.000310f, +0.000144f, +0.000096f, +0.000027f, -0.000513f, +0.000369f, + -0.000289f, -0.000300f, +0.000021f, +0.000164f, +0.000285f, -0.000333f, -0.000284f, +0.000417f, -0.000203f, +0.000098f, + +0.000146f, -0.000275f, +0.000248f, +0.000172f, -0.000164f, +0.000183f, -0.000074f, -0.000186f, +0.000011f, +0.000064f, + +0.000095f, +0.000051f, -0.000187f, -0.000276f, -0.000011f, +0.000089f, -0.000026f, +0.000051f, -0.000116f, -0.000173f, + +0.000021f, -0.000024f, +0.000020f, +0.000065f, +0.000122f, +0.000075f + }, + { + -0.004786f, +0.045268f, +0.003347f, -0.000645f, +0.003697f, -0.007600f, -0.007744f, -0.001645f, +0.001197f, +0.003449f, + -0.001973f, -0.001369f, +0.002477f, +0.003202f, -0.003432f, -0.008257f, -0.003042f, -0.000849f, +0.000108f, -0.001802f, + +0.000460f, -0.000226f, -0.002683f, -0.000547f, -0.000807f, -0.000502f, +0.000109f, -0.001423f, -0.001268f, +0.000221f, + -0.004354f, -0.003744f, -0.000793f, -0.000534f, +0.000698f, -0.000427f, +0.000653f, +0.000872f, -0.000668f, -0.002159f, + +0.000553f, -0.001037f, -0.000391f, +0.001672f, +0.001221f, +0.000136f, +0.000037f, -0.000924f, -0.000133f, +0.000004f, + +0.001865f, -0.000339f, -0.000746f, -0.000157f, -0.000218f, -0.000272f, +0.000144f, +0.000704f, -0.000178f, -0.000033f, + -0.000604f, -0.000214f, -0.000060f, +0.000120f, -0.000556f, +0.000126f, +0.000490f, -0.000132f, +0.000051f, +0.000243f, + +0.000082f, -0.000222f, +0.000115f, +0.000046f, +0.000197f, +0.000179f, +0.000072f, +0.000245f, -0.000277f, +0.000097f, + +0.000314f, +0.000292f, +0.000054f, +0.000154f, +0.000012f, -0.000061f, -0.000159f, -0.000202f, +0.000022f, +0.000231f, + +0.000168f, +0.000065f, +0.000002f, -0.000010f, +0.000082f, +0.000145f + }, + { + -0.000469f, +0.000754f, -0.003374f, +0.001740f, +0.000131f, -0.000020f, -0.000906f, -0.000812f, +0.000951f, +0.000402f, + -0.001048f, -0.002104f, -0.008358f, -0.031682f, -0.001001f, -0.005760f, -0.007497f, -0.003008f, -0.003956f, -0.002050f, + -0.001266f, +0.000663f, +0.008090f, -0.000945f, -0.006870f, -0.008624f, +0.001136f, -0.004991f, -0.002857f, +0.000176f, + -0.000284f, +0.000509f, -0.001597f, +0.002668f, -0.000564f, -0.002837f, -0.001738f, -0.001146f, +0.000485f, -0.001478f, + -0.002036f, -0.000405f, -0.000267f, -0.001950f, -0.000864f, -0.000749f, +0.000078f, +0.000276f, +0.000530f, -0.000149f, + -0.001415f, -0.000214f, +0.000381f, -0.000309f, +0.000880f, -0.000461f, -0.001271f, +0.000058f, -0.000068f, +0.000227f, + +0.000118f, +0.000136f, +0.000265f, +0.000077f, +0.000057f, -0.000078f, -0.000160f, -0.000247f, +0.000563f, +0.000030f, + +0.000194f, +0.000163f, +0.000061f, +0.000317f, +0.000330f, +0.000157f, -0.000151f, +0.000022f, -0.000182f, -0.000051f, + -0.000133f, +0.000032f, +0.000030f, -0.000029f, -0.000220f, +0.000166f, +0.000218f, +0.000032f, -0.000108f, -0.000056f, + -0.000021f, +0.000157f, +0.000017f, -0.000096f, +0.000216f, +0.000005f + }, + { + -0.018998f, +0.000195f, +0.001565f, -0.007510f, -0.005117f, +0.002266f, +0.010728f, +0.001125f, +0.001896f, +0.000073f, + +0.002665f, +0.000203f, +0.002110f, -0.005240f, +0.021070f, -0.003832f, -0.007314f, +0.001199f, +0.000460f, -0.001751f, + +0.002167f, +0.003228f, -0.001969f, -0.001740f, +0.000027f, +0.001347f, -0.000413f, -0.000201f, -0.002448f, -0.000676f, + -0.001455f, -0.000062f, +0.000123f, +0.001391f, +0.000548f, +0.000193f, -0.000515f, -0.000599f, -0.001746f, -0.000214f, + -0.001224f, -0.001612f, -0.002379f, -0.002214f, -0.001392f, -0.001100f, -0.000767f, +0.000640f, +0.000775f, +0.000440f, + -0.000022f, -0.000512f, +0.001207f, +0.000244f, +0.000659f, -0.000614f, -0.000594f, +0.000395f, +0.000012f, +0.000405f, + +0.000043f, -0.000178f, +0.000701f, -0.000317f, -0.000173f, -0.000324f, +0.000387f, +0.000114f, -0.000012f, +0.000137f, + -0.000208f, -0.000132f, +0.000180f, -0.000030f, -0.000205f, -0.000115f, +0.000310f, +0.000051f, -0.000316f, -0.000127f, + -0.000206f, -0.000162f, -0.000187f, -0.000181f, -0.000107f, -0.000289f, +0.000322f, +0.000194f, -0.000048f, -0.000003f, + +0.000169f, -0.000250f, -0.000095f, +0.000034f, +0.000011f, -0.000036f + }, + { + -0.001061f, -0.010061f, -0.001316f, -0.000843f, -0.000651f, -0.000017f, -0.001021f, +0.000220f, +0.001632f, -0.000791f, + -0.003424f, -0.002438f, -0.000969f, -0.017850f, +0.015972f, -0.007899f, -0.007231f, -0.005216f, -0.003007f, -0.003191f, + -0.009679f, -0.010878f, -0.002948f, +0.002933f, +0.002814f, -0.002210f, -0.000938f, -0.000739f, +0.000597f, -0.000973f, + -0.002419f, +0.000598f, +0.000964f, +0.000651f, +0.000852f, -0.000273f, +0.002023f, +0.000185f, -0.000840f, -0.000677f, + +0.000320f, +0.001160f, +0.000401f, -0.001692f, +0.000500f, -0.000546f, -0.000362f, -0.001288f, -0.000118f, +0.000897f, + -0.000032f, +0.000058f, +0.000096f, -0.001203f, -0.001854f, -0.000882f, +0.000043f, +0.000028f, +0.000239f, +0.000110f, + -0.000459f, -0.000419f, +0.000216f, -0.000731f, +0.000059f, -0.001051f, -0.000443f, +0.000589f, -0.000026f, +0.000280f, + +0.000062f, +0.000843f, +0.000144f, +0.000147f, +0.000042f, -0.000202f, +0.000065f, +0.000176f, +0.000186f, -0.000088f, + -0.000493f, -0.000289f, -0.000165f, +0.000089f, -0.000135f, -0.000171f, +0.000025f, -0.000042f, +0.000019f, +0.000011f, + -0.000020f, -0.000127f, +0.000025f, +0.000011f, -0.000008f, -0.000054f + } + }, + { + { + -0.011632f, +0.036114f, +0.026156f, -0.010866f, +0.002030f, +0.000580f, -0.000296f, -0.001546f, +0.001579f, -0.002814f, + +0.000155f, +0.002407f, +0.001163f, -0.001321f, -0.001896f, +0.003237f, -0.001433f, +0.001460f, -0.006882f, +0.002081f, + +0.000772f, -0.000626f, -0.002176f, -0.001138f, +0.001319f, +0.000582f, +0.002220f, -0.000448f, -0.000530f, -0.001205f, + +0.003632f, -0.000871f, +0.001383f, +0.002733f, +0.001366f, +0.002350f, -0.002434f, +0.002352f, +0.001339f, -0.000755f, + +0.000766f, -0.000204f, +0.000569f, +0.000834f, -0.001081f, +0.000340f, +0.001008f, -0.002540f, +0.000450f, +0.000803f, + +0.000718f, +0.000543f, -0.000435f, -0.000135f, -0.000062f, +0.000024f, -0.000171f, -0.000245f, -0.000526f, -0.000013f, + +0.000436f, +0.000040f, -0.000353f, -0.000271f, -0.000467f, -0.000023f, -0.000127f, +0.000072f, +0.000046f, +0.000003f, + +0.000333f, -0.000075f, +0.000506f, +0.000327f, -0.000087f, -0.000226f, +0.000163f, +0.000467f, -0.000158f, +0.000063f, + +0.000132f, -0.000013f, +0.000047f, +0.000120f, +0.000071f, -0.000185f, +0.000249f, -0.000093f, -0.000044f, -0.000097f, + +0.000127f, -0.000061f, +0.000017f, -0.000024f, -0.000006f, +0.000082f + }, + { + +0.000584f, +0.019836f, -0.000098f, -0.003903f, +0.002792f, +0.000141f, -0.000775f, -0.001714f, +0.001261f, -0.000095f, + -0.000814f, -0.001340f, +0.001033f, -0.001500f, -0.001702f, -0.000380f, -0.010171f, +0.001025f, +0.001840f, +0.002803f, + +0.001049f, -0.001484f, -0.000609f, -0.002998f, +0.003805f, +0.001247f, -0.001476f, -0.003296f, +0.001259f, -0.000952f, + -0.000862f, -0.000830f, +0.001735f, -0.000011f, +0.000917f, +0.000385f, +0.003446f, +0.001517f, +0.001322f, +0.001416f, + -0.002034f, +0.002498f, +0.000940f, -0.000600f, -0.000219f, -0.000259f, +0.000423f, -0.000697f, -0.000089f, -0.000664f, + +0.000034f, +0.000044f, +0.000644f, +0.000333f, +0.000267f, -0.000781f, -0.000608f, +0.000225f, -0.000115f, -0.000342f, + +0.000166f, +0.000657f, +0.000161f, +0.000088f, -0.000063f, +0.000007f, -0.000169f, +0.000394f, -0.000088f, -0.000015f, + +0.000129f, -0.000169f, -0.000076f, +0.000021f, +0.000180f, +0.000041f, -0.000179f, -0.000040f, +0.000142f, +0.000020f, + +0.000088f, -0.000095f, +0.000014f, +0.000023f, +0.000130f, +0.000070f, +0.000004f, +0.000023f, -0.000127f, +0.000228f, + -0.000148f, -0.000038f, -0.000010f, +0.000009f, +0.000078f, -0.000008f + }, + { + -0.004701f, -0.052188f, +0.000005f, -0.009808f, -0.001025f, +0.000501f, +0.000132f, -0.000372f, -0.000488f, +0.000728f, + +0.000364f, +0.000845f, +0.003927f, -0.003305f, -0.004772f, +0.001477f, -0.001462f, +0.004012f, -0.001612f, -0.000141f, + -0.002881f, +0.005468f, -0.000722f, -0.000246f, +0.001229f, +0.001639f, -0.000347f, +0.001381f, -0.001632f, -0.000404f, + +0.000465f, -0.000326f, +0.003530f, -0.001452f, +0.000194f, -0.002049f, -0.000294f, +0.001080f, -0.001085f, +0.000771f, + -0.000747f, -0.000783f, +0.000852f, -0.000318f, +0.000160f, +0.001262f, +0.000160f, +0.000324f, -0.000543f, +0.000011f, + -0.001762f, +0.000809f, +0.000364f, +0.000435f, +0.000148f, -0.000424f, -0.000065f, +0.000220f, -0.000267f, +0.000080f, + +0.000087f, +0.000108f, -0.000552f, +0.000382f, -0.000224f, +0.000439f, -0.000522f, -0.000224f, -0.000194f, +0.000400f, + -0.000237f, -0.000131f, +0.000240f, -0.000022f, -0.000039f, +0.000306f, +0.000019f, -0.000005f, -0.000270f, +0.000243f, + -0.000039f, -0.000174f, +0.000168f, -0.000064f, -0.000088f, -0.000020f, -0.000000f, +0.000046f, +0.000039f, +0.000067f, + +0.000010f, -0.000037f, -0.000023f, -0.000030f, -0.000009f, -0.000020f + }, + { + -0.010541f, -0.061025f, -0.006930f, +0.002036f, +0.002057f, -0.000398f, +0.000047f, -0.000426f, -0.000420f, -0.000565f, + +0.000487f, +0.000478f, -0.000827f, +0.002641f, -0.002349f, -0.000629f, +0.000549f, -0.004949f, +0.000585f, +0.000328f, + +0.000824f, +0.000402f, +0.000108f, +0.000726f, +0.000940f, +0.000028f, -0.001842f, -0.000906f, +0.000721f, +0.000977f, + +0.000979f, -0.000977f, -0.000975f, -0.000223f, +0.000225f, +0.000824f, -0.000952f, +0.000250f, -0.000804f, +0.000122f, + +0.000789f, -0.000822f, -0.000314f, +0.000942f, -0.000667f, +0.000199f, +0.000530f, +0.000346f, -0.000387f, +0.000109f, + +0.000669f, -0.000574f, +0.000135f, +0.000106f, -0.000367f, +0.000159f, +0.000074f, +0.000625f, +0.000350f, -0.000063f, + +0.000161f, +0.000079f, +0.000226f, +0.000197f, +0.000058f, +0.000267f, +0.000058f, -0.000045f, -0.000075f, +0.000104f, + +0.000105f, +0.000335f, -0.000293f, +0.000047f, -0.000252f, +0.000162f, -0.000036f, +0.000035f, -0.000001f, +0.000098f, + +0.000028f, +0.000136f, +0.000016f, -0.000098f, +0.000054f, -0.000023f, -0.000090f, +0.000005f, -0.000088f, -0.000025f, + +0.000034f, +0.000034f, -0.000029f, -0.000015f, +0.000058f, +0.000025f + }, + { + +0.000020f, +0.012405f, -0.002267f, -0.001644f, +0.000743f, +0.000108f, -0.000553f, +0.000244f, -0.000384f, +0.000355f, + +0.000280f, -0.000288f, -0.000486f, -0.004972f, -0.001025f, +0.001043f, -0.004637f, +0.000147f, +0.003087f, -0.002714f, + +0.000903f, +0.000037f, +0.001802f, +0.002295f, -0.000087f, +0.000674f, -0.003444f, -0.000040f, -0.000771f, -0.000276f, + +0.002495f, -0.001935f, -0.000041f, -0.000990f, +0.000277f, -0.001012f, -0.003058f, +0.001579f, -0.000276f, -0.000922f, + +0.000139f, +0.000677f, +0.000031f, +0.000114f, -0.000997f, +0.000512f, +0.000091f, +0.000118f, -0.000303f, -0.000035f, + -0.000097f, +0.000077f, -0.000539f, +0.000376f, -0.000592f, -0.000401f, +0.000242f, -0.000100f, -0.000218f, -0.000014f, + -0.000088f, -0.000680f, -0.000284f, -0.000102f, +0.000373f, -0.000018f, +0.000412f, +0.000130f, +0.000103f, +0.000044f, + +0.000150f, +0.000183f, -0.000002f, +0.000027f, -0.000203f, -0.000260f, +0.000086f, -0.000019f, -0.000002f, +0.000263f, + +0.000072f, +0.000214f, -0.000299f, -0.000181f, +0.000124f, -0.000026f, +0.000089f, +0.000006f, +0.000043f, -0.000060f, + -0.000005f, +0.000099f, +0.000013f, -0.000042f, -0.000100f, +0.000111f + }, + { + -0.013246f, -0.134816f, +0.006328f, -0.001832f, -0.000894f, +0.000619f, -0.000215f, +0.001290f, -0.001715f, -0.001787f, + +0.001945f, +0.001161f, -0.004674f, +0.003042f, +0.000426f, -0.000582f, -0.000365f, -0.000856f, +0.001668f, -0.000838f, + +0.000539f, -0.000240f, +0.000469f, -0.000661f, +0.000406f, -0.000371f, +0.000458f, -0.001014f, -0.001146f, -0.001596f, + +0.000976f, -0.002296f, +0.001969f, -0.001792f, -0.000247f, -0.001280f, -0.001224f, -0.000119f, +0.000700f, +0.000617f, + +0.000082f, -0.002127f, -0.000419f, +0.000935f, +0.000763f, -0.000627f, +0.000080f, +0.000049f, -0.000146f, -0.000109f, + -0.000615f, -0.000008f, +0.000287f, +0.000101f, +0.000679f, -0.000223f, +0.000667f, +0.000184f, -0.000042f, -0.000495f, + -0.000032f, +0.000056f, +0.000235f, -0.000152f, -0.000089f, +0.000035f, +0.000052f, +0.000190f, -0.000138f, -0.000254f, + +0.000009f, +0.000248f, -0.000097f, +0.000018f, -0.000046f, -0.000058f, +0.000110f, +0.000065f, -0.000122f, +0.000119f, + -0.000015f, +0.000007f, -0.000011f, -0.000370f, +0.000162f, +0.000085f, +0.000077f, -0.000074f, +0.000123f, -0.000002f, + +0.000058f, +0.000037f, -0.000073f, -0.000018f, -0.000089f, +0.000119f + }, + { + -0.001113f, +0.005702f, +0.003147f, -0.001366f, +0.000449f, +0.000017f, -0.000031f, -0.000518f, +0.000439f, -0.000032f, + -0.000282f, +0.000340f, -0.002267f, +0.009668f, -0.003993f, +0.003301f, -0.001067f, -0.002646f, +0.001192f, -0.004156f, + -0.001441f, -0.000027f, -0.001338f, -0.006866f, +0.001995f, +0.000773f, -0.001941f, +0.001073f, +0.000270f, -0.001707f, + +0.002023f, +0.000310f, -0.000494f, -0.001746f, +0.000633f, -0.000168f, -0.001073f, +0.000427f, -0.000191f, -0.000354f, + +0.001479f, -0.000655f, -0.000474f, +0.000316f, +0.000270f, -0.000729f, +0.000571f, -0.000193f, -0.000439f, -0.000805f, + -0.000644f, +0.000191f, -0.000389f, +0.000003f, +0.000369f, -0.000065f, +0.000140f, +0.000262f, +0.000141f, +0.000321f, + -0.000250f, +0.000283f, +0.000225f, +0.000044f, +0.000018f, -0.000054f, -0.000236f, +0.000364f, -0.000056f, +0.000074f, + -0.000574f, +0.000069f, -0.000110f, -0.000139f, +0.000054f, +0.000018f, +0.000192f, +0.000086f, -0.000142f, -0.000177f, + -0.000146f, +0.000126f, -0.000090f, +0.000104f, -0.000132f, -0.000010f, -0.000024f, -0.000076f, +0.000031f, -0.000100f, + -0.000025f, -0.000026f, -0.000013f, +0.000058f, -0.000010f, +0.000005f + }, + { + +0.021176f, +0.065842f, -0.015716f, -0.002654f, -0.000558f, -0.000332f, -0.000400f, -0.000640f, -0.000434f, +0.000140f, + +0.002468f, +0.000147f, -0.000702f, -0.001893f, -0.000536f, +0.002016f, -0.001022f, +0.000430f, +0.000381f, -0.000899f, + +0.001725f, +0.000115f, -0.000404f, +0.001981f, -0.000400f, +0.000623f, +0.000103f, -0.000351f, -0.000558f, +0.000916f, + -0.001270f, +0.000034f, +0.000223f, +0.000130f, +0.000334f, +0.001551f, -0.001078f, -0.000433f, -0.001717f, -0.000846f, + -0.000698f, +0.000485f, -0.000188f, -0.000028f, +0.000260f, -0.000567f, -0.000660f, +0.001267f, -0.000715f, +0.000220f, + +0.000286f, -0.000200f, -0.000134f, -0.000521f, -0.000100f, +0.000234f, +0.000019f, +0.000374f, +0.000322f, -0.000222f, + +0.000520f, -0.000461f, -0.000070f, -0.000455f, +0.000596f, -0.000044f, -0.000010f, -0.000139f, +0.000105f, -0.000184f, + -0.000118f, -0.000344f, -0.000127f, +0.000113f, +0.000106f, +0.000017f, -0.000009f, +0.000172f, +0.000061f, -0.000193f, + +0.000254f, +0.000137f, -0.000178f, +0.000073f, -0.000021f, +0.000019f, -0.000066f, +0.000011f, -0.000146f, +0.000195f, + +0.000009f, -0.000025f, +0.000082f, +0.000014f, +0.000086f, -0.000094f + }, + { + -0.001792f, +0.000358f, +0.001417f, -0.001977f, +0.000543f, -0.000280f, +0.000205f, -0.000459f, +0.000598f, -0.000027f, + -0.000711f, -0.001683f, +0.001679f, +0.000786f, +0.008009f, +0.000443f, +0.003395f, -0.001919f, -0.000390f, -0.005662f, + +0.005569f, -0.000546f, -0.004691f, +0.001514f, -0.002359f, -0.001197f, -0.003993f, +0.000813f, -0.000888f, +0.000473f, + +0.001128f, -0.002361f, -0.000346f, -0.000994f, +0.000035f, +0.001398f, +0.000168f, -0.000456f, +0.000905f, -0.000596f, + +0.000637f, +0.001144f, -0.001050f, -0.000523f, -0.000232f, -0.000218f, -0.000429f, -0.000153f, -0.000572f, -0.000210f, + +0.000123f, +0.000089f, -0.000493f, -0.000159f, +0.000765f, +0.000265f, -0.000320f, -0.000071f, -0.000029f, -0.000442f, + -0.000063f, +0.000095f, +0.000488f, -0.000609f, +0.000022f, -0.000297f, -0.000171f, -0.000255f, +0.000027f, +0.000197f, + -0.000144f, -0.000327f, -0.000049f, -0.000461f, +0.000044f, +0.000147f, -0.000182f, -0.000019f, +0.000003f, -0.000065f, + +0.000011f, +0.000069f, -0.000287f, +0.000021f, -0.000108f, +0.000053f, +0.000069f, +0.000202f, +0.000117f, -0.000103f, + +0.000038f, +0.000067f, -0.000065f, -0.000027f, +0.000016f, +0.000074f + }, + { + +0.006204f, -0.049649f, +0.007013f, -0.007321f, -0.003095f, +0.005835f, -0.012518f, +0.001117f, -0.000875f, -0.001185f, + +0.001390f, +0.000345f, +0.000797f, -0.002152f, -0.000326f, -0.000015f, +0.004997f, -0.002984f, +0.001222f, +0.002904f, + -0.001170f, +0.001120f, -0.002100f, -0.000277f, -0.001552f, +0.000140f, +0.000661f, -0.001607f, +0.000158f, +0.000561f, + -0.000799f, -0.001188f, -0.002395f, -0.000605f, +0.000021f, -0.000665f, -0.000131f, -0.000009f, +0.000719f, +0.000210f, + +0.000159f, +0.000379f, -0.000307f, -0.000057f, -0.000074f, +0.001208f, +0.000007f, +0.000534f, -0.000496f, +0.000294f, + +0.000544f, -0.000168f, +0.000144f, +0.000558f, -0.000281f, +0.000052f, -0.000027f, +0.000249f, -0.000217f, +0.000311f, + -0.000319f, -0.000003f, -0.000255f, -0.000076f, +0.000124f, -0.000054f, -0.000235f, +0.000258f, -0.000507f, +0.000162f, + +0.000185f, +0.000043f, -0.000165f, -0.000184f, +0.000221f, -0.000149f, -0.000064f, -0.000152f, -0.000246f, +0.000270f, + -0.000201f, -0.000013f, +0.000111f, -0.000094f, +0.000006f, -0.000056f, +0.000080f, +0.000078f, -0.000019f, +0.000090f, + -0.000095f, +0.000022f, -0.000047f, +0.000081f, -0.000089f, +0.000110f + }, + { + -0.000578f, +0.009211f, -0.006299f, -0.002674f, -0.000466f, +0.001388f, -0.000186f, -0.001789f, +0.000053f, +0.000397f, + -0.000528f, +0.001644f, +0.000310f, -0.001791f, +0.007998f, -0.005554f, +0.009835f, -0.000976f, -0.001414f, +0.001085f, + -0.002365f, -0.001998f, +0.001251f, +0.001999f, +0.000527f, -0.000328f, +0.002414f, -0.001833f, +0.001208f, -0.001596f, + +0.000033f, +0.001338f, -0.000542f, +0.000443f, -0.000963f, +0.001667f, -0.000853f, +0.001290f, +0.000024f, +0.001668f, + -0.000352f, -0.000459f, +0.001497f, +0.000255f, -0.000346f, -0.000299f, -0.000310f, -0.000416f, +0.001166f, -0.000091f, + +0.000134f, +0.000642f, -0.000019f, +0.000118f, -0.000031f, -0.000069f, -0.000360f, -0.000122f, -0.000125f, +0.000431f, + -0.000385f, -0.000099f, +0.000053f, -0.000186f, +0.000128f, +0.000244f, -0.000152f, +0.000434f, +0.000153f, +0.000200f, + -0.000052f, -0.000444f, +0.000002f, -0.000139f, -0.000101f, +0.000025f, +0.000089f, -0.000011f, -0.000058f, +0.000207f, + +0.000048f, -0.000075f, +0.000198f, -0.000141f, -0.000140f, -0.000058f, -0.000061f, -0.000095f, +0.000107f, -0.000164f, + +0.000059f, -0.000020f, -0.000048f, +0.000038f, +0.000094f, +0.000073f + }, + { + -0.005858f, +0.034639f, -0.004594f, +0.002655f, +0.002973f, +0.000140f, -0.002077f, +0.000078f, +0.001252f, -0.000461f, + -0.001485f, -0.000818f, +0.001443f, +0.004966f, +0.002890f, -0.004644f, +0.000084f, +0.001690f, -0.000647f, +0.000391f, + +0.000522f, +0.000702f, +0.000230f, +0.001014f, -0.001411f, +0.001185f, -0.000027f, +0.000623f, -0.001131f, +0.002017f, + -0.002088f, +0.000364f, +0.000090f, -0.001070f, +0.001364f, -0.000334f, +0.000040f, +0.000182f, -0.000878f, -0.000655f, + +0.000335f, +0.000105f, +0.000051f, +0.000809f, +0.000790f, -0.000420f, -0.000281f, -0.000915f, +0.000937f, -0.000517f, + +0.000863f, -0.000169f, +0.000193f, +0.000351f, -0.000198f, -0.000354f, -0.000046f, +0.000189f, -0.000178f, -0.000577f, + -0.000498f, +0.000034f, -0.000042f, -0.000011f, -0.000048f, -0.000067f, +0.000070f, -0.000092f, +0.000146f, +0.000047f, + +0.000211f, -0.000214f, +0.000327f, -0.000042f, -0.000098f, +0.000199f, -0.000042f, +0.000089f, -0.000155f, -0.000044f, + -0.000034f, +0.000109f, +0.000030f, +0.000049f, -0.000196f, +0.000135f, -0.000116f, -0.000004f, +0.000011f, -0.000034f, + +0.000118f, -0.000008f, +0.000008f, +0.000063f, -0.000026f, +0.000058f + }, + { + +0.000759f, -0.000572f, -0.001308f, +0.002906f, -0.001036f, -0.000863f, +0.001611f, -0.002042f, -0.000318f, +0.001500f, + +0.000737f, +0.000208f, +0.014092f, +0.000459f, -0.001569f, +0.004615f, +0.000017f, +0.001204f, +0.000998f, +0.000555f, + +0.010468f, -0.005704f, +0.001294f, +0.000254f, -0.000670f, -0.002342f, +0.003062f, -0.002332f, -0.000763f, +0.000047f, + +0.001852f, +0.000212f, -0.001726f, +0.000524f, -0.001301f, -0.000944f, -0.000082f, +0.000256f, -0.000760f, -0.000081f, + -0.000536f, -0.000116f, -0.000638f, -0.000908f, +0.000492f, -0.000305f, +0.000225f, -0.000154f, -0.000257f, +0.000911f, + -0.000804f, -0.000386f, +0.000617f, -0.000516f, +0.000467f, +0.000370f, -0.000211f, -0.000078f, -0.000027f, -0.000563f, + -0.000525f, -0.000173f, +0.000621f, -0.000039f, +0.000071f, -0.000333f, +0.000140f, +0.000135f, -0.000003f, -0.000147f, + -0.000014f, +0.000100f, -0.000167f, -0.000049f, +0.000002f, +0.000081f, -0.000006f, +0.000189f, -0.000063f, +0.000250f, + -0.000007f, -0.000032f, -0.000156f, -0.000020f, -0.000190f, +0.000044f, -0.000062f, +0.000200f, +0.000133f, +0.000025f, + -0.000047f, +0.000075f, +0.000172f, +0.000025f, -0.000017f, +0.000004f + }, + { + +0.006114f, +0.034223f, -0.000252f, -0.006863f, +0.000694f, +0.000586f, +0.001478f, -0.003757f, -0.001154f, +0.000899f, + +0.001774f, -0.000470f, +0.004567f, -0.007878f, +0.010415f, +0.001650f, -0.000399f, -0.000518f, +0.000832f, +0.000945f, + +0.000619f, +0.000965f, +0.000959f, -0.002412f, -0.000401f, +0.000584f, -0.001421f, -0.000995f, -0.002313f, +0.001881f, + -0.001591f, +0.001508f, -0.000283f, +0.001903f, -0.001532f, -0.000280f, +0.000835f, -0.000518f, -0.000735f, -0.000355f, + -0.000610f, +0.001232f, +0.000179f, -0.000673f, +0.000691f, -0.000130f, -0.000590f, -0.000245f, +0.000230f, +0.000162f, + +0.000636f, -0.000217f, +0.000465f, -0.000464f, +0.000490f, -0.000337f, -0.000685f, +0.000347f, +0.000119f, -0.000202f, + +0.000011f, -0.000023f, +0.000439f, -0.000380f, +0.000157f, -0.000249f, -0.000113f, +0.000220f, +0.000011f, +0.000020f, + -0.000291f, +0.000061f, +0.000121f, +0.000119f, -0.000386f, -0.000359f, +0.000059f, +0.000103f, -0.000119f, +0.000048f, + -0.000068f, +0.000019f, +0.000088f, -0.000034f, -0.000107f, -0.000162f, +0.000084f, +0.000039f, +0.000134f, -0.000069f, + +0.000013f, +0.000035f, -0.000067f, -0.000035f, -0.000002f, +0.000125f + }, + { + +0.001338f, -0.006025f, -0.000979f, -0.000266f, +0.000507f, +0.000121f, +0.000359f, +0.000386f, +0.000794f, +0.000078f, + -0.000080f, +0.000644f, -0.000719f, -0.021707f, +0.030001f, -0.001970f, -0.002156f, -0.001172f, +0.000945f, +0.005361f, + -0.000252f, -0.002529f, +0.002925f, +0.000649f, +0.000353f, -0.001253f, -0.001303f, -0.000481f, +0.001006f, +0.000316f, + -0.000459f, +0.002027f, +0.000682f, +0.001355f, +0.001842f, -0.001369f, +0.001374f, +0.001288f, -0.000387f, +0.000086f, + +0.000208f, +0.001056f, +0.000349f, -0.001163f, -0.000441f, -0.000085f, -0.000291f, -0.001166f, +0.000551f, +0.000179f, + -0.000807f, +0.000160f, +0.000265f, +0.000044f, -0.000179f, -0.000267f, +0.000241f, +0.000295f, -0.000428f, -0.000017f, + +0.000454f, +0.000205f, +0.000353f, -0.000199f, +0.000395f, -0.000241f, +0.000154f, +0.000049f, +0.000134f, +0.000198f, + -0.000066f, +0.000198f, +0.000103f, +0.000173f, -0.000017f, +0.000039f, -0.000176f, -0.000127f, -0.000017f, +0.000020f, + -0.000037f, -0.000157f, -0.000046f, +0.000002f, +0.000109f, -0.000102f, +0.000106f, +0.000060f, +0.000023f, -0.000048f, + +0.000050f, -0.000033f, +0.000004f, +0.000003f, +0.000022f, +0.000002f + } + }, + { + { + +0.005146f, +0.058872f, -0.037618f, -0.006437f, +0.005244f, +0.000719f, -0.000911f, -0.000707f, -0.000939f, -0.001951f, + -0.000757f, +0.002587f, +0.000108f, +0.001812f, -0.004295f, +0.001132f, +0.001572f, -0.002915f, -0.002205f, +0.000565f, + +0.000142f, -0.000081f, -0.001773f, -0.002122f, +0.001945f, +0.001383f, +0.001010f, -0.000745f, -0.000734f, -0.001483f, + +0.001264f, -0.000312f, +0.002215f, +0.001365f, +0.001752f, +0.001155f, -0.001499f, +0.001153f, +0.001210f, +0.000485f, + +0.000170f, -0.000585f, +0.000758f, +0.000008f, -0.000008f, +0.000126f, +0.000199f, -0.000680f, -0.000343f, +0.000680f, + +0.000333f, +0.000391f, -0.000009f, -0.000039f, -0.000084f, +0.000588f, -0.000437f, -0.000449f, +0.000228f, -0.000247f, + +0.000006f, +0.000371f, -0.000027f, -0.000319f, -0.000301f, +0.000024f, -0.000444f, +0.000105f, +0.000047f, +0.000278f, + -0.000004f, +0.000192f, +0.000106f, +0.000309f, +0.000164f, +0.000145f, +0.000060f, +0.000251f, -0.000040f, -0.000076f, + -0.000093f, -0.000127f, +0.000066f, +0.000079f, +0.000045f, -0.000132f, +0.000107f, -0.000084f, -0.000133f, -0.000071f, + +0.000041f, -0.000055f, +0.000000f, +0.000020f, -0.000007f, +0.000037f + }, + { + -0.002409f, +0.010960f, +0.006585f, +0.000388f, +0.001072f, +0.000282f, -0.000619f, -0.001710f, +0.000540f, -0.000164f, + -0.002207f, -0.000956f, +0.000950f, +0.000869f, -0.002999f, -0.003365f, -0.002044f, -0.000780f, +0.009155f, +0.000311f, + -0.000451f, -0.001887f, +0.000273f, -0.002089f, -0.000923f, +0.000785f, +0.000808f, -0.002855f, +0.000592f, +0.000086f, + +0.000305f, +0.000716f, -0.001781f, +0.002011f, -0.001222f, +0.000862f, +0.002284f, +0.001677f, +0.000931f, +0.001128f, + -0.000484f, +0.001129f, +0.000563f, -0.000314f, -0.000784f, +0.000913f, -0.000283f, -0.000293f, -0.000352f, -0.000725f, + +0.000027f, -0.000118f, -0.000118f, +0.000265f, -0.000034f, +0.000136f, -0.000543f, -0.000043f, +0.000080f, -0.000352f, + -0.000000f, +0.000232f, +0.000141f, +0.000323f, -0.000175f, -0.000126f, -0.000294f, -0.000049f, +0.000034f, -0.000012f, + +0.000201f, -0.000068f, +0.000119f, +0.000034f, -0.000067f, -0.000000f, +0.000133f, -0.000103f, -0.000023f, +0.000006f, + +0.000110f, -0.000032f, +0.000025f, +0.000080f, +0.000005f, -0.000076f, +0.000014f, -0.000073f, -0.000107f, +0.000023f, + +0.000046f, -0.000063f, -0.000085f, -0.000042f, +0.000077f, +0.000036f + }, + { + +0.007718f, -0.051553f, -0.008034f, -0.015984f, -0.001051f, +0.000504f, -0.000937f, -0.000714f, +0.000439f, -0.000406f, + +0.001559f, +0.000943f, +0.001405f, -0.000314f, -0.005086f, -0.000279f, -0.003179f, +0.003913f, +0.001937f, -0.000044f, + +0.000597f, +0.000914f, -0.000016f, +0.000319f, -0.000056f, +0.001643f, +0.000095f, +0.000852f, -0.001508f, -0.000376f, + +0.000517f, +0.000645f, +0.000523f, -0.002000f, +0.001488f, -0.001524f, -0.001756f, -0.000829f, +0.001201f, -0.000136f, + +0.000068f, -0.001231f, -0.000230f, -0.000809f, +0.000649f, +0.000866f, -0.000363f, -0.000089f, +0.000130f, -0.000401f, + -0.000381f, -0.000046f, +0.000104f, +0.000245f, -0.000634f, -0.000223f, +0.000154f, +0.000393f, -0.000176f, +0.000187f, + +0.000283f, -0.000108f, -0.000260f, -0.000048f, -0.000078f, -0.000242f, -0.000177f, -0.000005f, -0.000267f, +0.000149f, + +0.000037f, -0.000086f, -0.000036f, -0.000138f, +0.000243f, +0.000520f, -0.000167f, -0.000148f, -0.000092f, +0.000169f, + +0.000077f, -0.000121f, +0.000065f, +0.000023f, +0.000020f, -0.000016f, -0.000116f, +0.000147f, +0.000045f, +0.000032f, + +0.000043f, +0.000006f, -0.000069f, +0.000004f, +0.000088f, -0.000127f + }, + { + -0.008873f, -0.059380f, -0.005721f, -0.001376f, -0.000382f, -0.000023f, -0.000103f, -0.001319f, +0.000107f, +0.000844f, + +0.000483f, +0.000114f, -0.000289f, +0.000454f, +0.001432f, +0.000060f, -0.000387f, -0.004428f, +0.000955f, +0.000714f, + +0.000895f, +0.000139f, +0.000131f, +0.000190f, +0.000055f, +0.000632f, -0.001885f, +0.000116f, +0.000016f, -0.000569f, + +0.000379f, -0.000724f, -0.000183f, -0.000329f, +0.000226f, +0.001559f, -0.001054f, -0.000162f, +0.000053f, -0.000075f, + +0.000692f, -0.000601f, +0.000262f, +0.000329f, -0.000031f, -0.000407f, +0.000565f, +0.000120f, -0.000020f, -0.000309f, + +0.000440f, -0.000070f, +0.000005f, -0.000043f, -0.000350f, -0.000045f, +0.000124f, +0.000482f, +0.000294f, +0.000235f, + +0.000055f, -0.000170f, +0.000250f, -0.000077f, +0.000138f, +0.000110f, -0.000082f, +0.000115f, +0.000096f, -0.000163f, + +0.000235f, +0.000519f, +0.000007f, -0.000061f, +0.000016f, +0.000073f, -0.000001f, -0.000114f, -0.000026f, -0.000063f, + -0.000067f, +0.000033f, -0.000009f, -0.000069f, +0.000061f, +0.000073f, -0.000063f, -0.000012f, -0.000039f, -0.000067f, + +0.000018f, +0.000039f, -0.000015f, -0.000034f, +0.000029f, +0.000004f + }, + { + -0.000031f, +0.011787f, -0.000894f, -0.001154f, +0.000209f, +0.000124f, -0.000072f, -0.000132f, -0.000929f, +0.001236f, + +0.000335f, -0.001424f, +0.000693f, -0.000629f, -0.011129f, +0.005161f, +0.000734f, -0.012256f, -0.004127f, +0.000122f, + +0.002117f, +0.001852f, -0.001240f, -0.000990f, +0.002481f, +0.001107f, +0.001773f, -0.000917f, -0.001324f, +0.000166f, + -0.000065f, -0.000588f, -0.000720f, -0.000021f, -0.001561f, -0.000858f, -0.001661f, +0.000199f, +0.000044f, -0.000808f, + -0.000849f, +0.000405f, -0.000326f, -0.000060f, -0.000321f, -0.000120f, +0.000784f, -0.000237f, -0.000094f, -0.000377f, + -0.000262f, +0.000079f, +0.000096f, +0.000104f, -0.000549f, -0.000025f, +0.000136f, +0.000018f, -0.000088f, -0.000262f, + -0.000735f, +0.000061f, -0.000145f, +0.000152f, -0.000104f, -0.000098f, +0.000038f, +0.000202f, +0.000295f, -0.000114f, + +0.000289f, +0.000152f, -0.000098f, +0.000028f, -0.000138f, -0.000239f, -0.000119f, -0.000099f, -0.000101f, -0.000084f, + -0.000006f, +0.000178f, +0.000022f, -0.000148f, +0.000031f, +0.000064f, +0.000057f, +0.000050f, +0.000072f, -0.000115f, + -0.000044f, +0.000037f, +0.000108f, -0.000003f, -0.000135f, -0.000030f + }, + { + -0.016775f, -0.120231f, -0.002474f, -0.001162f, +0.000730f, +0.000646f, -0.000460f, +0.000934f, +0.000182f, -0.001979f, + +0.000755f, +0.000716f, +0.000138f, +0.000368f, -0.000640f, +0.001474f, -0.001155f, -0.001016f, +0.001193f, -0.001212f, + -0.000934f, -0.000242f, +0.000927f, +0.000030f, -0.000128f, -0.000553f, -0.000920f, +0.000624f, -0.001747f, +0.000126f, + -0.001373f, -0.000635f, +0.000556f, -0.002202f, -0.000255f, -0.000198f, -0.000238f, -0.000417f, +0.000028f, +0.000235f, + -0.001293f, -0.001400f, +0.000196f, +0.000912f, +0.000626f, -0.000234f, -0.000033f, +0.000197f, -0.000432f, -0.000959f, + +0.000330f, +0.000124f, -0.000515f, +0.000338f, +0.000800f, -0.000024f, -0.000010f, -0.000027f, -0.000302f, -0.000312f, + +0.000119f, +0.000152f, +0.000010f, -0.000203f, -0.000035f, +0.000082f, +0.000040f, +0.000140f, -0.000015f, -0.000102f, + +0.000007f, +0.000023f, +0.000130f, -0.000152f, +0.000005f, +0.000058f, -0.000073f, -0.000052f, +0.000027f, -0.000022f, + +0.000116f, +0.000091f, +0.000014f, -0.000171f, -0.000047f, -0.000137f, +0.000111f, -0.000196f, +0.000169f, +0.000058f, + +0.000019f, +0.000047f, -0.000089f, +0.000009f, -0.000002f, -0.000038f + }, + { + +0.000068f, +0.003403f, +0.000665f, +0.000522f, +0.000457f, +0.000090f, -0.000444f, -0.000215f, -0.000029f, +0.000381f, + -0.000077f, +0.000927f, +0.000633f, +0.000394f, +0.004893f, +0.004204f, -0.004514f, -0.000787f, -0.001844f, -0.002573f, + -0.001077f, +0.000168f, -0.003258f, +0.000132f, +0.001961f, -0.000561f, -0.002926f, +0.001858f, +0.000639f, -0.000313f, + +0.000218f, +0.000242f, +0.000301f, -0.002546f, -0.001095f, +0.000469f, -0.001298f, +0.000071f, +0.000285f, -0.000922f, + +0.000572f, -0.000043f, -0.000182f, -0.000012f, +0.000078f, -0.000545f, +0.000028f, -0.000085f, -0.000562f, -0.000434f, + -0.000295f, -0.000191f, -0.000485f, -0.000135f, +0.000189f, +0.000212f, -0.000414f, +0.000406f, +0.000408f, +0.000075f, + +0.000085f, +0.000145f, +0.000305f, -0.000086f, +0.000064f, +0.000005f, -0.000175f, -0.000167f, +0.000135f, +0.000098f, + -0.000116f, -0.000246f, +0.000099f, -0.000205f, -0.000216f, -0.000059f, -0.000027f, -0.000155f, -0.000103f, -0.000018f, + -0.000083f, -0.000077f, -0.000034f, +0.000045f, -0.000023f, -0.000043f, +0.000046f, -0.000044f, +0.000070f, +0.000069f, + +0.000034f, +0.000128f, -0.000037f, +0.000011f, +0.000025f, +0.000001f + }, + { + -0.000852f, +0.091777f, -0.001449f, -0.005873f, +0.000143f, -0.000703f, +0.000217f, -0.000507f, -0.000253f, +0.000215f, + +0.000104f, +0.000504f, +0.001071f, -0.000330f, -0.001171f, +0.001407f, +0.000053f, +0.003005f, -0.000223f, -0.001506f, + +0.000398f, +0.000857f, +0.000348f, +0.000358f, +0.001892f, +0.000102f, -0.000881f, +0.000638f, -0.001210f, -0.000669f, + -0.000182f, +0.001089f, +0.000210f, +0.000605f, +0.000556f, -0.001403f, -0.000096f, -0.001080f, -0.001056f, +0.000346f, + -0.001067f, +0.000092f, -0.000474f, +0.000521f, +0.000555f, +0.000015f, -0.001201f, +0.000930f, -0.000002f, -0.000017f, + -0.000158f, +0.000667f, +0.000255f, -0.000508f, -0.000200f, -0.000335f, -0.000195f, +0.000162f, +0.000522f, +0.000182f, + -0.000006f, +0.000033f, -0.000549f, +0.000085f, +0.000256f, +0.000256f, -0.000065f, -0.000011f, +0.000270f, -0.000374f, + -0.000126f, -0.000033f, -0.000142f, -0.000359f, +0.000013f, +0.000183f, -0.000100f, -0.000014f, -0.000086f, -0.000031f, + +0.000095f, -0.000016f, +0.000024f, +0.000038f, +0.000039f, +0.000004f, -0.000145f, -0.000042f, -0.000085f, -0.000028f, + +0.000042f, -0.000042f, +0.000048f, +0.000085f, -0.000031f, +0.000005f + }, + { + +0.000038f, -0.013412f, +0.001725f, +0.000073f, +0.000190f, +0.000146f, +0.000320f, -0.000205f, +0.000315f, -0.000110f, + -0.000594f, -0.000018f, +0.000862f, +0.001694f, +0.006237f, -0.000746f, +0.006477f, -0.001755f, -0.002366f, -0.002120f, + +0.002760f, +0.000574f, -0.000402f, -0.004073f, -0.002911f, +0.000321f, -0.001340f, -0.004055f, +0.003010f, -0.000041f, + +0.001908f, -0.002034f, -0.000866f, -0.001032f, -0.000280f, +0.000314f, -0.000437f, -0.000570f, +0.000842f, +0.000325f, + +0.000123f, +0.000451f, -0.000334f, -0.000919f, -0.001342f, -0.000528f, -0.000524f, +0.000102f, -0.000436f, -0.000402f, + +0.000320f, -0.000221f, +0.000348f, -0.000225f, +0.000786f, +0.000288f, -0.000454f, -0.000212f, -0.000659f, -0.000223f, + +0.000175f, +0.000463f, +0.000012f, +0.000134f, -0.000070f, +0.000069f, -0.000064f, -0.000115f, +0.000229f, +0.000024f, + -0.000233f, +0.000069f, -0.000167f, -0.000186f, -0.000169f, +0.000127f, +0.000100f, -0.000164f, -0.000062f, -0.000067f, + -0.000057f, +0.000152f, -0.000118f, +0.000060f, -0.000012f, -0.000017f, -0.000159f, +0.000159f, +0.000051f, -0.000014f, + -0.000031f, +0.000034f, +0.000022f, -0.000031f, -0.000010f, -0.000010f + }, + { + -0.006518f, -0.029080f, +0.007514f, -0.007881f, -0.002695f, -0.006571f, +0.000734f, +0.000259f, -0.001612f, -0.000168f, + +0.000909f, -0.001202f, +0.000396f, +0.000891f, -0.000743f, +0.000212f, +0.002030f, -0.000632f, +0.000172f, +0.001972f, + -0.000117f, +0.000106f, -0.001086f, -0.001143f, -0.000582f, -0.000045f, -0.000741f, -0.000879f, +0.000234f, -0.000258f, + -0.000699f, -0.001642f, -0.000266f, -0.001018f, +0.000135f, -0.000217f, +0.000460f, -0.000765f, +0.000710f, -0.000504f, + -0.000087f, +0.000695f, -0.000466f, +0.000081f, +0.000026f, +0.000365f, +0.000343f, +0.000425f, -0.000013f, -0.000247f, + +0.000055f, -0.000043f, -0.000278f, +0.000091f, +0.000553f, -0.000220f, -0.000230f, +0.000288f, -0.000246f, +0.000160f, + +0.000094f, -0.000106f, +0.000091f, -0.000265f, -0.000133f, +0.000007f, -0.000062f, -0.000118f, -0.000034f, +0.000026f, + +0.000187f, -0.000069f, -0.000187f, -0.000007f, -0.000043f, -0.000000f, -0.000224f, -0.000095f, -0.000046f, +0.000066f, + +0.000105f, +0.000026f, -0.000094f, -0.000010f, -0.000108f, -0.000129f, -0.000068f, +0.000000f, -0.000071f, +0.000016f, + -0.000080f, +0.000028f, +0.000061f, -0.000070f, -0.000035f, +0.000004f + }, + { + +0.000412f, +0.004200f, +0.001043f, -0.005142f, -0.001829f, +0.000184f, -0.002605f, -0.000265f, +0.000129f, -0.000920f, + -0.000156f, +0.000271f, -0.001230f, +0.001877f, +0.002563f, -0.000570f, +0.004774f, -0.000104f, +0.000730f, +0.000504f, + -0.001867f, +0.000917f, +0.000730f, +0.000391f, +0.000878f, -0.000715f, +0.001684f, -0.000459f, -0.000329f, +0.000193f, + -0.000926f, +0.000726f, -0.000159f, +0.001057f, +0.000290f, +0.000323f, +0.001014f, +0.000410f, +0.000411f, +0.000325f, + +0.000068f, +0.000539f, +0.000798f, -0.000047f, -0.000199f, -0.000653f, -0.000410f, +0.000061f, -0.000132f, -0.000229f, + +0.000052f, +0.000285f, +0.000614f, +0.000421f, -0.000166f, -0.000343f, -0.000302f, -0.000258f, +0.000052f, +0.000127f, + -0.000320f, -0.000040f, +0.000082f, -0.000064f, -0.000208f, +0.000255f, +0.000112f, -0.000038f, +0.000195f, +0.000122f, + -0.000077f, -0.000114f, -0.000095f, -0.000197f, +0.000001f, -0.000059f, +0.000235f, +0.000202f, +0.000024f, +0.000097f, + -0.000042f, -0.000075f, +0.000119f, +0.000077f, -0.000088f, -0.000025f, +0.000056f, -0.000087f, +0.000108f, +0.000073f, + -0.000012f, -0.000007f, -0.000029f, +0.000103f, -0.000037f, +0.000028f + }, + { + +0.008518f, +0.011228f, -0.001311f, +0.001294f, +0.000654f, +0.001744f, +0.002432f, +0.001194f, +0.000319f, -0.001244f, + -0.002193f, +0.001814f, +0.003307f, -0.000924f, +0.005284f, -0.002427f, -0.000426f, +0.001780f, +0.000160f, +0.000080f, + +0.000195f, +0.000831f, +0.000521f, +0.000927f, -0.001428f, +0.001223f, +0.000048f, +0.000113f, -0.000270f, +0.000255f, + -0.000182f, +0.000299f, +0.000068f, -0.000152f, +0.000920f, -0.000094f, +0.000922f, +0.000202f, -0.000079f, -0.000111f, + -0.000710f, +0.000827f, +0.001042f, -0.000070f, -0.000771f, +0.000288f, -0.000341f, -0.000199f, +0.000156f, +0.000159f, + +0.000020f, +0.000022f, +0.000486f, -0.000123f, +0.000350f, -0.000349f, +0.000002f, -0.000036f, -0.000016f, -0.000489f, + -0.000267f, +0.000047f, +0.000130f, -0.000362f, +0.000095f, -0.000095f, -0.000013f, +0.000147f, +0.000163f, -0.000092f, + +0.000106f, -0.000010f, +0.000095f, -0.000081f, -0.000116f, +0.000136f, -0.000062f, +0.000064f, +0.000023f, -0.000022f, + -0.000057f, -0.000066f, -0.000010f, -0.000104f, -0.000108f, +0.000129f, -0.000068f, +0.000066f, +0.000007f, -0.000146f, + +0.000013f, -0.000059f, -0.000052f, +0.000050f, +0.000006f, +0.000006f + }, + { + -0.000668f, -0.000447f, +0.000076f, +0.003667f, -0.002148f, +0.000402f, +0.000974f, -0.000594f, -0.000674f, +0.000670f, + +0.000710f, +0.001269f, -0.000027f, +0.017923f, -0.002895f, +0.002427f, +0.002335f, +0.001436f, +0.001190f, -0.000422f, + +0.007225f, +0.002683f, -0.006785f, +0.000737f, +0.000937f, -0.001338f, +0.001332f, -0.001260f, +0.000710f, -0.002048f, + +0.003015f, +0.000297f, -0.000794f, -0.000306f, -0.001413f, +0.000907f, -0.000414f, +0.000202f, -0.000312f, -0.000247f, + -0.000039f, -0.000251f, -0.001322f, +0.000192f, -0.000408f, +0.000625f, -0.000129f, -0.000977f, -0.000586f, +0.000937f, + +0.000143f, -0.000119f, -0.000319f, +0.000382f, -0.000271f, -0.000159f, +0.000373f, -0.000105f, -0.000448f, -0.000108f, + -0.000473f, -0.000006f, +0.000026f, -0.000070f, +0.000239f, +0.000067f, -0.000109f, +0.000409f, -0.000304f, -0.000194f, + +0.000152f, +0.000054f, -0.000007f, -0.000086f, -0.000310f, -0.000081f, -0.000032f, +0.000174f, +0.000272f, +0.000075f, + +0.000108f, +0.000035f, -0.000153f, -0.000011f, -0.000101f, +0.000091f, -0.000134f, +0.000115f, +0.000157f, +0.000058f, + +0.000040f, +0.000018f, -0.000004f, +0.000123f, -0.000111f, -0.000106f + }, + { + +0.005014f, +0.032349f, -0.000150f, +0.002289f, +0.001931f, -0.000187f, -0.002081f, -0.000623f, -0.002386f, +0.001227f, + +0.000660f, -0.002144f, +0.003632f, +0.006566f, -0.009459f, +0.002418f, +0.005506f, -0.001546f, +0.001143f, +0.001860f, + +0.001038f, +0.000184f, +0.000731f, -0.000546f, -0.002244f, +0.000047f, -0.001315f, -0.001357f, -0.001906f, +0.000241f, + +0.000504f, +0.000834f, +0.000122f, +0.001029f, -0.000855f, +0.000267f, +0.000451f, -0.000199f, -0.000315f, +0.000161f, + -0.000569f, +0.001164f, -0.000319f, +0.000240f, +0.000961f, +0.000333f, -0.000379f, -0.000096f, +0.000856f, -0.000368f, + +0.000784f, +0.000339f, -0.000748f, -0.000437f, +0.000463f, +0.000257f, +0.000008f, -0.000403f, +0.000305f, -0.000184f, + +0.000055f, +0.000381f, +0.000013f, -0.000181f, +0.000402f, -0.000037f, +0.000001f, +0.000188f, -0.000012f, -0.000086f, + -0.000033f, -0.000136f, +0.000122f, -0.000019f, -0.000258f, -0.000173f, -0.000074f, -0.000040f, +0.000188f, +0.000058f, + -0.000004f, +0.000025f, +0.000213f, +0.000097f, -0.000110f, +0.000055f, +0.000019f, -0.000120f, +0.000025f, +0.000016f, + -0.000009f, +0.000098f, -0.000011f, +0.000016f, -0.000018f, +0.000053f + }, + { + -0.000946f, -0.003806f, +0.002273f, -0.001003f, +0.000257f, -0.000139f, +0.000468f, +0.001163f, +0.000189f, +0.000407f, + +0.001473f, +0.001119f, -0.003320f, +0.007020f, -0.016537f, +0.004917f, +0.001111f, -0.000452f, +0.002894f, +0.004349f, + +0.000386f, +0.002718f, +0.001071f, -0.002871f, +0.002093f, +0.000046f, -0.001219f, +0.000321f, -0.000269f, -0.000424f, + +0.000338f, +0.000887f, +0.000869f, +0.001002f, +0.001481f, -0.000944f, +0.000164f, +0.001705f, +0.000860f, -0.000174f, + +0.000079f, +0.000158f, -0.000986f, +0.000327f, -0.000080f, -0.000580f, -0.000555f, -0.000373f, +0.000307f, -0.000379f, + -0.000188f, -0.000004f, -0.000330f, +0.000032f, +0.000549f, +0.000022f, -0.000198f, +0.000344f, -0.000590f, -0.000433f, + +0.000005f, +0.000311f, -0.000132f, +0.000214f, -0.000002f, +0.000135f, +0.000420f, -0.000329f, +0.000223f, +0.000048f, + +0.000135f, -0.000112f, -0.000158f, -0.000017f, -0.000074f, +0.000118f, -0.000169f, -0.000308f, -0.000112f, +0.000004f, + +0.000143f, +0.000005f, +0.000050f, +0.000004f, +0.000060f, -0.000018f, +0.000052f, +0.000085f, +0.000077f, +0.000025f, + +0.000038f, +0.000038f, -0.000008f, -0.000032f, -0.000033f, +0.000080f + } + }, + { + { + -0.004858f, +0.135080f, +0.017363f, -0.013049f, +0.002014f, +0.001390f, -0.000906f, -0.000631f, -0.000523f, -0.000483f, + -0.000878f, +0.001230f, +0.000128f, +0.000800f, -0.003970f, -0.000307f, +0.001292f, -0.001156f, +0.002703f, -0.000066f, + -0.000835f, -0.000613f, -0.000540f, -0.001665f, +0.001262f, -0.000467f, +0.000390f, -0.000745f, -0.000688f, -0.000988f, + +0.001540f, -0.000114f, -0.000232f, -0.000631f, +0.000469f, +0.001608f, -0.000942f, +0.000332f, -0.000375f, -0.000144f, + +0.000425f, -0.000440f, +0.000720f, -0.000297f, -0.000050f, -0.000635f, -0.000695f, +0.000731f, +0.000357f, -0.000124f, + -0.000536f, +0.000073f, -0.000071f, -0.000301f, -0.000514f, +0.000225f, -0.000194f, -0.000051f, +0.000732f, +0.000047f, + -0.000313f, +0.000070f, -0.000034f, +0.000044f, -0.000147f, +0.000291f, -0.000185f, -0.000079f, -0.000037f, +0.000170f, + +0.000058f, +0.000091f, -0.000155f, +0.000018f, +0.000054f, +0.000289f, +0.000011f, +0.000022f, +0.000297f, -0.000000f, + -0.000050f, -0.000173f, +0.000010f, +0.000013f, -0.000037f, +0.000066f, -0.000016f, +0.000058f, -0.000052f, +0.000013f, + +0.000032f, +0.000023f, -0.000000f, +0.000063f, -0.000011f, +0.000002f + }, + { + +0.001657f, -0.001890f, -0.011167f, +0.001438f, -0.000477f, +0.000777f, -0.000606f, -0.000374f, +0.000425f, +0.000599f, + -0.001376f, -0.000371f, +0.001119f, +0.001568f, -0.003700f, -0.002406f, +0.004107f, +0.000239f, +0.005061f, +0.001144f, + -0.000010f, -0.002882f, +0.001804f, -0.000331f, -0.002698f, -0.000506f, +0.001843f, -0.002279f, +0.001088f, -0.000073f, + +0.000568f, +0.001209f, -0.003125f, +0.001531f, -0.000218f, +0.000404f, +0.000070f, -0.000856f, -0.001024f, +0.000714f, + +0.000070f, +0.000166f, +0.000034f, -0.000224f, +0.000072f, +0.000837f, -0.000310f, -0.000095f, -0.000096f, -0.000756f, + -0.000212f, -0.000051f, -0.000470f, -0.000159f, -0.000503f, +0.000895f, -0.000107f, -0.000457f, -0.000291f, -0.000188f, + -0.000266f, -0.000236f, -0.000290f, +0.000123f, -0.000210f, -0.000139f, -0.000020f, -0.000323f, -0.000088f, -0.000106f, + +0.000184f, -0.000230f, +0.000090f, +0.000056f, -0.000203f, -0.000226f, +0.000180f, -0.000007f, +0.000142f, -0.000033f, + -0.000164f, +0.000092f, +0.000157f, -0.000027f, -0.000080f, -0.000069f, +0.000072f, -0.000011f, +0.000094f, -0.000177f, + +0.000080f, +0.000050f, +0.000000f, -0.000091f, -0.000023f, -0.000005f + }, + { + -0.006589f, -0.043146f, +0.021173f, -0.008076f, -0.002620f, -0.001517f, -0.001024f, -0.002456f, -0.001244f, +0.000497f, + +0.000945f, -0.001266f, -0.002464f, -0.000639f, -0.003216f, +0.002120f, -0.003348f, +0.001428f, +0.002769f, +0.002674f, + +0.000332f, -0.000052f, -0.001200f, -0.002410f, -0.000567f, +0.001647f, -0.001309f, -0.000242f, -0.000778f, +0.000186f, + +0.001145f, +0.000245f, -0.002172f, -0.002900f, +0.000258f, -0.000819f, -0.001926f, -0.000593f, +0.001485f, -0.000703f, + +0.000006f, +0.000137f, -0.000082f, -0.001807f, +0.000397f, -0.000895f, -0.001062f, -0.000015f, +0.000431f, +0.000198f, + +0.000575f, +0.000191f, -0.000414f, -0.000067f, -0.000653f, -0.000422f, +0.000381f, +0.000748f, +0.000338f, +0.000302f, + +0.000181f, -0.000243f, +0.000029f, -0.000118f, +0.000340f, -0.000165f, +0.000047f, +0.000375f, +0.000064f, -0.000279f, + -0.000106f, +0.000245f, -0.000050f, -0.000147f, +0.000151f, +0.000150f, -0.000053f, +0.000085f, -0.000093f, +0.000152f, + +0.000027f, +0.000040f, +0.000035f, +0.000024f, +0.000197f, -0.000038f, -0.000165f, +0.000023f, +0.000048f, +0.000028f, + -0.000022f, -0.000011f, -0.000007f, +0.000033f, +0.000087f, -0.000057f + }, + { + +0.017469f, -0.023914f, -0.005628f, -0.001286f, +0.000125f, -0.000062f, +0.000272f, -0.000661f, -0.000492f, +0.000288f, + +0.000227f, -0.001029f, +0.000136f, -0.000039f, -0.001260f, -0.000108f, -0.000175f, -0.005446f, +0.000368f, +0.000922f, + +0.000695f, +0.000174f, +0.000052f, -0.000286f, -0.001039f, -0.000065f, -0.000100f, +0.001110f, -0.000283f, -0.001461f, + +0.000609f, -0.000186f, +0.000135f, -0.000218f, +0.000358f, +0.001537f, -0.000262f, -0.000195f, +0.000967f, +0.000050f, + +0.000442f, +0.000395f, +0.001323f, +0.000018f, -0.000208f, -0.000290f, +0.000114f, -0.000087f, +0.000029f, -0.000442f, + +0.000015f, -0.000189f, +0.000183f, -0.000422f, -0.000355f, -0.000165f, -0.000247f, +0.000059f, -0.000027f, +0.000015f, + -0.000250f, -0.000341f, -0.000227f, +0.000002f, -0.000033f, -0.000058f, -0.000033f, -0.000113f, +0.000258f, -0.000179f, + +0.000010f, +0.000078f, +0.000280f, +0.000148f, +0.000140f, +0.000077f, -0.000055f, -0.000077f, -0.000003f, -0.000010f, + -0.000104f, -0.000047f, -0.000077f, +0.000120f, +0.000056f, +0.000091f, +0.000074f, -0.000089f, +0.000116f, +0.000046f, + -0.000017f, -0.000034f, -0.000007f, -0.000022f, -0.000055f, -0.000021f + }, + { + +0.000106f, +0.012576f, +0.001270f, +0.000041f, -0.000403f, -0.000010f, -0.000276f, +0.000371f, +0.000019f, +0.000233f, + +0.000313f, -0.000202f, +0.001865f, -0.002108f, -0.014637f, +0.004643f, +0.000490f, -0.002708f, +0.000187f, +0.001913f, + +0.003318f, +0.004155f, -0.000617f, -0.001604f, +0.001292f, -0.001747f, +0.003800f, +0.001043f, -0.000095f, +0.000111f, + +0.001047f, +0.001734f, +0.000821f, +0.000026f, -0.000600f, +0.000618f, +0.000602f, +0.000218f, -0.000539f, -0.000384f, + -0.001031f, +0.000604f, -0.000690f, -0.000159f, +0.000413f, -0.000191f, +0.000290f, -0.000041f, +0.000169f, +0.000325f, + -0.000204f, -0.000159f, +0.000132f, -0.000544f, -0.000254f, +0.000343f, +0.000290f, -0.000260f, -0.000126f, +0.000115f, + -0.000168f, +0.000366f, -0.000362f, +0.000005f, -0.000083f, -0.000155f, -0.000187f, -0.000172f, +0.000142f, -0.000135f, + -0.000071f, +0.000055f, +0.000021f, -0.000021f, +0.000147f, +0.000130f, -0.000296f, -0.000098f, -0.000021f, -0.000285f, + -0.000132f, -0.000107f, +0.000070f, +0.000075f, -0.000114f, +0.000081f, -0.000032f, -0.000018f, +0.000082f, -0.000096f, + +0.000015f, +0.000020f, -0.000041f, -0.000002f, +0.000049f, -0.000007f + }, + { + +0.029729f, -0.063954f, -0.002976f, -0.000452f, -0.000843f, +0.000371f, +0.000726f, -0.000733f, +0.002021f, +0.001162f, + -0.001768f, -0.000299f, +0.001768f, -0.000131f, -0.001887f, +0.001253f, -0.000566f, -0.000492f, -0.000387f, -0.001300f, + +0.000418f, -0.000169f, +0.000589f, +0.000888f, +0.000762f, -0.000025f, -0.000790f, +0.001120f, +0.000113f, +0.000971f, + -0.001145f, -0.000157f, +0.000946f, -0.000742f, -0.000051f, +0.000165f, +0.000929f, +0.000121f, -0.000014f, +0.000015f, + -0.000537f, -0.000446f, +0.000284f, +0.000211f, -0.000167f, +0.000050f, -0.000310f, +0.000025f, -0.000037f, -0.000479f, + +0.000620f, +0.000604f, -0.000051f, +0.000194f, -0.000223f, -0.000273f, -0.000473f, -0.000134f, -0.000302f, -0.000069f, + +0.000086f, -0.000009f, -0.000136f, -0.000403f, -0.000044f, +0.000139f, +0.000061f, +0.000088f, +0.000225f, +0.000154f, + -0.000026f, -0.000071f, +0.000029f, +0.000028f, +0.000071f, +0.000173f, -0.000124f, -0.000082f, +0.000101f, +0.000032f, + -0.000016f, -0.000046f, -0.000004f, +0.000075f, -0.000045f, -0.000173f, +0.000014f, -0.000090f, -0.000071f, +0.000053f, + -0.000004f, +0.000028f, -0.000037f, -0.000047f, +0.000103f, -0.000036f + }, + { + +0.000677f, +0.006252f, -0.000796f, +0.000852f, +0.000005f, -0.000084f, -0.000372f, +0.000082f, -0.000629f, -0.000038f, + +0.000084f, -0.000273f, -0.001422f, -0.003151f, +0.004428f, +0.004778f, -0.005173f, -0.002455f, -0.000622f, +0.001436f, + +0.001736f, +0.002350f, -0.002003f, -0.000199f, +0.002239f, +0.001212f, -0.000166f, +0.000772f, +0.000988f, -0.000511f, + -0.000576f, -0.000613f, -0.000613f, -0.001617f, -0.001538f, -0.000382f, -0.000529f, +0.000217f, -0.000064f, -0.000260f, + +0.000329f, -0.000215f, +0.000364f, -0.000231f, +0.000744f, -0.000155f, -0.000264f, +0.000125f, -0.000209f, -0.000013f, + +0.000366f, +0.000158f, +0.000064f, -0.000265f, -0.000377f, +0.000280f, -0.000262f, -0.000353f, -0.000205f, -0.000046f, + +0.000088f, +0.000103f, +0.000381f, -0.000216f, -0.000114f, +0.000111f, +0.000153f, -0.000019f, -0.000095f, -0.000062f, + +0.000395f, +0.000016f, +0.000104f, -0.000002f, +0.000005f, -0.000014f, -0.000035f, -0.000265f, -0.000136f, -0.000024f, + +0.000064f, -0.000114f, -0.000000f, -0.000048f, +0.000057f, +0.000044f, -0.000014f, +0.000026f, +0.000023f, +0.000004f, + +0.000052f, +0.000115f, +0.000034f, -0.000058f, +0.000038f, +0.000020f + }, + { + -0.009042f, +0.079622f, +0.010906f, -0.000086f, +0.001856f, -0.000535f, -0.000190f, +0.000158f, +0.000588f, +0.000276f, + -0.001449f, -0.001729f, +0.001481f, +0.002773f, +0.000537f, +0.002211f, +0.000153f, +0.000486f, +0.001468f, +0.000181f, + -0.000590f, +0.001044f, +0.000485f, -0.001276f, +0.000882f, -0.000022f, -0.000048f, +0.001262f, -0.000756f, -0.000016f, + +0.000595f, +0.001135f, +0.000860f, +0.000397f, +0.000735f, -0.000912f, -0.000250f, +0.000370f, +0.000523f, +0.000875f, + -0.000202f, +0.000647f, +0.000034f, -0.000203f, -0.000167f, +0.000192f, -0.000273f, +0.000850f, +0.000308f, -0.000570f, + -0.000655f, +0.000225f, +0.000529f, +0.000223f, -0.000078f, +0.000243f, -0.000045f, -0.000193f, -0.000007f, +0.000031f, + -0.000051f, +0.000298f, -0.000377f, +0.000055f, -0.000213f, +0.000119f, +0.000050f, +0.000117f, +0.000169f, -0.000125f, + +0.000022f, +0.000058f, +0.000197f, -0.000129f, -0.000158f, +0.000011f, +0.000144f, -0.000098f, -0.000023f, +0.000183f, + -0.000032f, -0.000080f, +0.000138f, +0.000108f, +0.000064f, -0.000013f, +0.000036f, -0.000032f, -0.000057f, -0.000121f, + +0.000055f, +0.000085f, +0.000002f, +0.000042f, -0.000052f, +0.000061f + }, + { + +0.001545f, -0.008225f, -0.001400f, +0.001336f, -0.000540f, +0.000271f, +0.000315f, +0.000231f, +0.000106f, +0.000086f, + +0.000368f, -0.000085f, -0.000498f, -0.004707f, +0.003646f, +0.001203f, -0.000065f, -0.003480f, +0.000640f, -0.002073f, + +0.000434f, +0.002282f, +0.000997f, -0.000555f, +0.000508f, +0.002842f, +0.002096f, -0.004502f, +0.003928f, -0.000022f, + +0.001013f, -0.000444f, -0.000116f, -0.000027f, +0.000074f, -0.001330f, -0.000830f, -0.000106f, +0.000595f, +0.000854f, + +0.000256f, +0.000006f, +0.000317f, +0.000305f, -0.000683f, -0.000389f, -0.000012f, +0.000252f, -0.000169f, -0.000179f, + +0.000607f, +0.000001f, +0.000761f, -0.000075f, +0.000248f, -0.000168f, -0.000188f, -0.000184f, -0.000518f, -0.000077f, + +0.000050f, +0.000044f, -0.000012f, +0.000392f, +0.000082f, +0.000406f, +0.000241f, +0.000073f, -0.000004f, -0.000113f, + -0.000258f, -0.000091f, -0.000030f, +0.000272f, -0.000144f, +0.000050f, +0.000135f, +0.000047f, -0.000125f, +0.000012f, + -0.000172f, +0.000028f, +0.000100f, +0.000090f, +0.000071f, +0.000004f, -0.000159f, -0.000033f, -0.000001f, -0.000014f, + -0.000003f, -0.000043f, +0.000047f, +0.000045f, -0.000046f, +0.000004f + }, + { + +0.007854f, -0.017586f, +0.009854f, +0.003098f, +0.001439f, -0.002998f, +0.007002f, -0.001200f, -0.000885f, +0.000197f, + +0.000672f, -0.001364f, -0.001581f, +0.001262f, +0.002201f, -0.002416f, +0.001626f, +0.000014f, -0.000686f, +0.001965f, + +0.000356f, -0.000642f, +0.000653f, +0.000586f, +0.000830f, +0.000310f, -0.000324f, +0.000516f, +0.000506f, +0.000022f, + +0.000205f, +0.000169f, +0.001776f, +0.000550f, +0.000549f, -0.000066f, +0.000890f, -0.001022f, -0.000538f, -0.000204f, + -0.000199f, -0.000007f, -0.000958f, +0.000209f, +0.000323f, -0.000246f, -0.000176f, +0.000319f, +0.000264f, -0.000058f, + -0.000330f, +0.000216f, -0.000063f, -0.000616f, +0.000482f, -0.000082f, -0.000354f, +0.000005f, -0.000045f, -0.000183f, + +0.000458f, -0.000175f, -0.000079f, -0.000173f, -0.000252f, +0.000143f, -0.000044f, -0.000054f, +0.000264f, +0.000050f, + +0.000165f, -0.000043f, -0.000075f, -0.000079f, -0.000111f, -0.000120f, -0.000063f, -0.000163f, +0.000167f, -0.000027f, + +0.000080f, +0.000133f, +0.000032f, +0.000004f, +0.000079f, -0.000002f, -0.000128f, -0.000013f, -0.000024f, -0.000102f, + +0.000009f, -0.000095f, +0.000126f, -0.000033f, +0.000029f, -0.000087f + }, + { + -0.000561f, +0.000542f, +0.004643f, -0.000510f, -0.000378f, -0.000325f, -0.003673f, -0.000417f, -0.000716f, -0.000293f, + +0.000846f, -0.001915f, -0.002108f, +0.000062f, +0.000659f, -0.002754f, -0.001529f, -0.002732f, +0.000871f, -0.003246f, + +0.000682f, +0.002240f, +0.000157f, -0.001123f, +0.000261f, -0.001293f, -0.000749f, -0.000464f, -0.000704f, +0.000787f, + -0.000485f, +0.000278f, -0.000703f, -0.000321f, +0.000192f, -0.000814f, +0.000241f, -0.000617f, -0.000092f, -0.000046f, + +0.000165f, +0.000368f, -0.000145f, -0.000215f, -0.000158f, -0.000648f, -0.000324f, +0.000312f, -0.000408f, +0.000021f, + -0.000129f, -0.000508f, +0.000010f, +0.000109f, -0.000110f, -0.000163f, -0.000059f, -0.000130f, -0.000096f, +0.000273f, + -0.000045f, -0.000265f, +0.000064f, +0.000212f, -0.000080f, -0.000091f, +0.000198f, -0.000143f, -0.000125f, -0.000032f, + -0.000047f, +0.000136f, -0.000018f, -0.000089f, -0.000021f, -0.000023f, +0.000065f, +0.000051f, +0.000175f, -0.000064f, + -0.000100f, +0.000077f, -0.000077f, -0.000002f, +0.000077f, +0.000083f, -0.000023f, +0.000037f, +0.000009f, +0.000143f, + -0.000006f, +0.000021f, +0.000017f, +0.000028f, -0.000062f, -0.000082f + }, + { + -0.005926f, -0.007860f, -0.002570f, -0.004213f, -0.000010f, -0.002145f, +0.003882f, +0.002588f, +0.000041f, -0.000067f, + -0.004260f, +0.001385f, +0.000548f, -0.003898f, +0.005074f, +0.000428f, +0.001350f, +0.000390f, +0.000389f, -0.001266f, + +0.001153f, +0.000960f, -0.000400f, +0.000528f, -0.001021f, -0.000613f, -0.000659f, -0.001600f, +0.000121f, -0.000846f, + +0.000924f, +0.000260f, +0.000171f, +0.000534f, -0.000238f, -0.001028f, +0.000860f, +0.000683f, +0.000676f, -0.000342f, + +0.000019f, +0.000356f, +0.000441f, -0.000650f, -0.000747f, +0.000305f, -0.000260f, +0.000183f, -0.000627f, -0.000078f, + +0.000244f, +0.000089f, +0.000297f, -0.000719f, +0.000433f, -0.000226f, +0.000162f, -0.000126f, -0.000376f, +0.000022f, + -0.000150f, +0.000064f, +0.000189f, -0.000141f, -0.000057f, +0.000048f, -0.000020f, -0.000014f, +0.000219f, +0.000029f, + -0.000131f, +0.000116f, -0.000026f, -0.000107f, -0.000090f, -0.000032f, -0.000096f, +0.000106f, +0.000050f, +0.000012f, + -0.000017f, +0.000042f, -0.000088f, -0.000181f, -0.000031f, -0.000086f, +0.000105f, +0.000084f, +0.000022f, +0.000023f, + -0.000034f, +0.000003f, -0.000071f, -0.000012f, +0.000024f, -0.000013f + }, + { + +0.000340f, -0.003084f, -0.002355f, +0.004994f, -0.002974f, +0.000880f, -0.000189f, +0.000374f, +0.000125f, +0.000084f, + -0.001372f, -0.000217f, -0.008220f, +0.004037f, -0.003945f, -0.004340f, -0.004082f, -0.001444f, +0.001179f, +0.000284f, + -0.003164f, +0.001094f, -0.007331f, -0.002433f, +0.000177f, +0.001816f, +0.000300f, -0.001105f, +0.001532f, -0.001305f, + +0.000780f, +0.000173f, +0.000634f, +0.000006f, -0.000626f, +0.000913f, +0.000163f, +0.000473f, +0.001059f, -0.000496f, + +0.000117f, +0.000567f, -0.000806f, +0.000210f, -0.000411f, +0.000100f, -0.000582f, -0.000933f, -0.000265f, +0.000985f, + +0.000705f, +0.000095f, -0.000956f, +0.000387f, -0.000043f, -0.000333f, -0.000332f, +0.000100f, -0.000254f, +0.000108f, + -0.000070f, +0.000528f, -0.000450f, -0.000296f, -0.000019f, +0.000337f, -0.000382f, +0.000118f, -0.000144f, -0.000102f, + +0.000274f, +0.000017f, +0.000097f, -0.000032f, -0.000048f, +0.000014f, -0.000085f, +0.000145f, +0.000123f, -0.000162f, + +0.000022f, +0.000099f, -0.000058f, +0.000028f, -0.000076f, +0.000044f, +0.000010f, -0.000078f, +0.000001f, +0.000096f, + +0.000071f, +0.000099f, -0.000106f, -0.000006f, +0.000030f, -0.000128f + }, + { + -0.009375f, +0.006908f, +0.000901f, +0.008619f, +0.000120f, +0.000096f, -0.000717f, +0.000867f, -0.000325f, -0.000371f, + +0.000871f, -0.002335f, +0.002363f, +0.002671f, -0.015713f, -0.001107f, +0.004333f, -0.001122f, +0.002645f, +0.000695f, + +0.000172f, +0.000873f, +0.000264f, +0.001817f, -0.001299f, -0.000015f, -0.001389f, +0.000511f, +0.000093f, -0.001609f, + +0.000225f, -0.000456f, -0.000517f, -0.000180f, -0.000045f, +0.000542f, +0.000021f, +0.000259f, -0.000284f, +0.000456f, + -0.000649f, +0.001104f, -0.000037f, +0.000134f, +0.000520f, +0.000536f, +0.000033f, +0.000866f, +0.000854f, -0.001045f, + -0.000097f, +0.000775f, -0.000327f, -0.000558f, +0.000292f, +0.000360f, +0.000332f, -0.000419f, -0.000048f, +0.000065f, + +0.000097f, +0.000412f, +0.000084f, -0.000148f, +0.000285f, -0.000063f, +0.000450f, +0.000145f, +0.000040f, -0.000067f, + +0.000182f, -0.000229f, +0.000006f, -0.000133f, -0.000028f, +0.000018f, +0.000095f, -0.000245f, +0.000040f, +0.000077f, + +0.000059f, -0.000156f, +0.000021f, +0.000119f, -0.000046f, -0.000016f, +0.000147f, -0.000083f, -0.000075f, +0.000052f, + +0.000011f, -0.000050f, +0.000060f, +0.000051f, +0.000018f, -0.000030f + }, + { + +0.000583f, -0.004900f, +0.000243f, -0.000114f, +0.000676f, -0.000319f, -0.000315f, +0.001319f, -0.000183f, +0.000389f, + +0.002132f, +0.000784f, -0.001434f, +0.016420f, -0.023556f, +0.000481f, +0.003182f, +0.001605f, +0.001913f, +0.003461f, + +0.000335f, +0.004325f, +0.001888f, -0.001470f, +0.001990f, +0.000379f, -0.001074f, -0.000578f, -0.000591f, +0.000356f, + -0.000512f, -0.001630f, +0.000050f, -0.000616f, +0.000444f, +0.000700f, -0.000192f, -0.000389f, +0.000493f, -0.000669f, + +0.000302f, +0.000323f, -0.000732f, +0.000263f, +0.000886f, -0.000405f, +0.000160f, +0.000218f, +0.000179f, -0.000364f, + +0.000178f, +0.000023f, -0.000217f, -0.000397f, -0.000082f, +0.000129f, -0.000166f, +0.000030f, -0.000137f, -0.000158f, + -0.000372f, +0.000136f, -0.000218f, -0.000146f, -0.000243f, -0.000150f, -0.000029f, +0.000054f, -0.000072f, -0.000153f, + -0.000056f, +0.000068f, -0.000296f, -0.000134f, -0.000085f, -0.000114f, +0.000170f, -0.000022f, -0.000100f, -0.000049f, + -0.000035f, -0.000015f, +0.000004f, +0.000128f, -0.000049f, +0.000050f, +0.000004f, -0.000074f, +0.000011f, +0.000125f, + -0.000004f, -0.000010f, +0.000094f, +0.000001f, -0.000062f, +0.000045f + } + }, + { + { + +0.011209f, +0.137801f, +0.009834f, -0.006959f, -0.000509f, -0.000966f, -0.000111f, +0.000524f, -0.000865f, -0.000333f, + +0.001200f, -0.000248f, +0.000881f, -0.003223f, -0.002339f, +0.001794f, -0.000167f, +0.001799f, +0.001600f, -0.000594f, + -0.001170f, -0.001276f, +0.000513f, -0.000273f, -0.000782f, +0.000486f, +0.000089f, -0.000697f, -0.000441f, +0.000542f, + +0.000494f, +0.001466f, -0.001213f, -0.000328f, +0.000032f, +0.001231f, +0.000776f, -0.000236f, -0.000202f, +0.000012f, + +0.000235f, -0.000051f, +0.000190f, -0.000462f, -0.000143f, +0.000093f, -0.000910f, -0.000136f, +0.001207f, -0.000226f, + -0.000363f, -0.000002f, -0.000214f, -0.000350f, -0.000549f, -0.000136f, -0.000084f, -0.000131f, +0.000221f, +0.000470f, + -0.000199f, -0.000251f, -0.000088f, -0.000004f, +0.000040f, +0.000064f, +0.000140f, -0.000080f, -0.000132f, +0.000114f, + +0.000145f, -0.000086f, -0.000039f, -0.000100f, -0.000072f, +0.000176f, +0.000079f, +0.000108f, +0.000194f, +0.000203f, + +0.000026f, -0.000012f, +0.000010f, -0.000003f, -0.000070f, +0.000075f, -0.000006f, +0.000157f, +0.000043f, +0.000060f, + -0.000041f, +0.000041f, +0.000042f, -0.000013f, +0.000001f, +0.000012f + }, + { + -0.000632f, -0.018336f, +0.003480f, +0.001240f, -0.001002f, -0.000487f, +0.000181f, +0.001055f, +0.000066f, +0.000024f, + +0.001032f, -0.001390f, -0.000464f, +0.000490f, -0.001181f, -0.001074f, +0.002689f, -0.000922f, -0.000650f, +0.002008f, + +0.001269f, -0.002039f, +0.000873f, -0.000035f, +0.000170f, +0.001139f, -0.001911f, -0.000085f, +0.000559f, -0.001415f, + +0.000180f, +0.001511f, -0.001045f, +0.000138f, +0.001127f, +0.001014f, -0.000634f, -0.000633f, -0.000989f, -0.000290f, + +0.000010f, +0.000096f, +0.000503f, +0.000458f, +0.000080f, +0.000023f, -0.000048f, -0.000025f, -0.000056f, -0.000626f, + -0.000010f, -0.000205f, +0.000037f, -0.000099f, -0.000450f, +0.000195f, +0.000169f, -0.000270f, -0.000642f, -0.000066f, + -0.000167f, +0.000052f, -0.000374f, -0.000147f, -0.000191f, +0.000060f, +0.000196f, +0.000022f, -0.000267f, -0.000096f, + +0.000180f, -0.000271f, -0.000124f, +0.000028f, -0.000054f, -0.000140f, -0.000111f, -0.000026f, +0.000162f, -0.000016f, + -0.000088f, +0.000041f, +0.000091f, -0.000038f, -0.000023f, -0.000005f, +0.000119f, +0.000043f, +0.000162f, -0.000104f, + -0.000039f, +0.000059f, +0.000046f, -0.000005f, +0.000016f, -0.000068f + }, + { + +0.004555f, -0.008386f, -0.014887f, -0.003223f, -0.004232f, -0.001324f, +0.000035f, -0.002674f, -0.002103f, +0.001170f, + +0.000346f, -0.000774f, -0.002956f, -0.004034f, +0.001872f, +0.001172f, +0.000879f, -0.000686f, +0.002769f, +0.000745f, + +0.000405f, -0.001042f, -0.000794f, -0.002031f, -0.000945f, +0.000539f, +0.000792f, +0.000108f, -0.000576f, -0.000074f, + +0.000565f, +0.000777f, -0.001651f, -0.001243f, -0.001747f, -0.001250f, -0.000332f, -0.000153f, -0.000456f, +0.000213f, + +0.000089f, +0.000557f, -0.000494f, -0.000675f, +0.000065f, -0.001498f, -0.000335f, -0.000063f, +0.000784f, -0.000121f, + +0.000142f, +0.000933f, -0.000376f, -0.000143f, -0.000373f, -0.000293f, +0.000445f, +0.000354f, +0.000176f, +0.000312f, + +0.000029f, +0.000257f, -0.000260f, -0.000006f, +0.000438f, +0.000156f, +0.000064f, +0.000038f, +0.000238f, -0.000216f, + -0.000196f, +0.000298f, +0.000099f, -0.000062f, -0.000027f, -0.000044f, +0.000103f, -0.000005f, +0.000049f, +0.000041f, + -0.000109f, +0.000172f, +0.000083f, -0.000090f, +0.000113f, +0.000024f, -0.000077f, +0.000033f, -0.000074f, +0.000068f, + -0.000040f, -0.000042f, +0.000034f, +0.000008f, -0.000011f, +0.000056f + }, + { + -0.015328f, +0.010902f, +0.002699f, +0.000878f, -0.002720f, +0.001100f, -0.000379f, +0.000466f, -0.000753f, -0.000874f, + -0.000593f, -0.000777f, +0.002411f, -0.001061f, -0.002744f, -0.001027f, +0.000334f, -0.005665f, -0.000030f, +0.000637f, + +0.000774f, +0.000346f, -0.000112f, -0.000234f, -0.000899f, -0.000802f, +0.000759f, +0.001520f, -0.001344f, -0.000224f, + +0.001019f, -0.000174f, +0.000426f, -0.000086f, +0.000031f, +0.000772f, +0.000508f, -0.000133f, +0.000743f, +0.000039f, + +0.000446f, +0.000649f, +0.000784f, -0.000379f, -0.000017f, +0.000599f, -0.000062f, -0.000206f, +0.000336f, -0.000788f, + +0.000241f, -0.000166f, -0.000059f, -0.000178f, -0.000081f, -0.000506f, -0.000266f, -0.000062f, +0.000257f, -0.000349f, + -0.000164f, -0.000106f, -0.000157f, +0.000070f, +0.000058f, -0.000159f, +0.000031f, -0.000061f, +0.000127f, -0.000004f, + -0.000084f, -0.000178f, +0.000144f, +0.000170f, +0.000016f, +0.000051f, -0.000031f, +0.000034f, +0.000037f, +0.000049f, + +0.000072f, -0.000062f, -0.000004f, +0.000106f, -0.000031f, +0.000104f, +0.000039f, -0.000006f, +0.000058f, +0.000072f, + +0.000026f, -0.000071f, -0.000018f, +0.000007f, -0.000023f, -0.000021f + }, + { + -0.000604f, +0.013100f, +0.001103f, -0.000024f, -0.000262f, +0.000011f, -0.000304f, +0.000146f, +0.000484f, +0.000424f, + -0.000009f, +0.000999f, +0.000323f, -0.000409f, -0.014133f, -0.001975f, +0.000997f, +0.006604f, +0.005421f, +0.000662f, + +0.000757f, +0.002687f, +0.001122f, -0.001296f, +0.001562f, -0.003213f, +0.000949f, +0.001330f, +0.000444f, +0.000194f, + +0.002889f, +0.000871f, +0.000341f, +0.000919f, +0.000195f, +0.000217f, +0.000868f, +0.000373f, -0.000492f, +0.000116f, + -0.000658f, +0.000140f, -0.000041f, -0.000494f, +0.000230f, +0.000198f, -0.000633f, +0.000582f, +0.000564f, +0.000346f, + +0.000049f, -0.000393f, -0.000190f, -0.000337f, +0.000075f, -0.000283f, +0.000115f, -0.000108f, -0.000106f, +0.000071f, + +0.000015f, +0.000183f, -0.000449f, +0.000076f, -0.000033f, +0.000069f, -0.000152f, -0.000158f, +0.000042f, +0.000034f, + -0.000180f, -0.000089f, +0.000141f, -0.000056f, +0.000019f, +0.000248f, -0.000144f, -0.000097f, +0.000074f, -0.000158f, + -0.000070f, -0.000129f, -0.000047f, +0.000037f, -0.000050f, +0.000011f, -0.000041f, +0.000025f, +0.000020f, -0.000012f, + +0.000009f, +0.000036f, -0.000065f, -0.000053f, +0.000054f, +0.000054f + }, + { + -0.026350f, -0.005447f, +0.011120f, -0.001981f, -0.000810f, +0.000252f, +0.000897f, -0.000930f, +0.001449f, +0.001426f, + -0.000761f, -0.000548f, -0.000385f, -0.000075f, -0.000337f, +0.000254f, +0.000683f, -0.000552f, -0.000511f, -0.000475f, + +0.000469f, +0.000186f, +0.000009f, +0.000863f, +0.000923f, +0.000342f, -0.000227f, -0.000650f, +0.000368f, +0.000026f, + +0.000691f, -0.000218f, +0.000451f, +0.000343f, +0.000056f, +0.000450f, +0.000163f, +0.000889f, -0.000464f, +0.000262f, + -0.000052f, +0.000289f, -0.000851f, +0.000204f, -0.000138f, +0.000038f, -0.000360f, -0.000709f, +0.000523f, -0.000042f, + +0.000279f, +0.000002f, +0.000861f, +0.000223f, -0.000752f, -0.000434f, +0.000136f, +0.000034f, +0.000036f, -0.000224f, + -0.000254f, +0.000002f, +0.000052f, -0.000234f, -0.000174f, -0.000114f, +0.000236f, +0.000123f, +0.000140f, +0.000104f, + -0.000067f, +0.000020f, -0.000046f, +0.000057f, +0.000039f, +0.000129f, +0.000006f, -0.000060f, +0.000143f, -0.000053f, + -0.000142f, -0.000137f, -0.000032f, +0.000036f, -0.000008f, +0.000011f, -0.000051f, +0.000034f, -0.000125f, -0.000020f, + +0.000067f, -0.000010f, +0.000025f, -0.000051f, +0.000037f, +0.000022f + }, + { + +0.000065f, +0.005358f, +0.002736f, -0.000145f, -0.000027f, +0.000162f, +0.000226f, -0.000208f, -0.000966f, -0.000334f, + +0.000045f, +0.000076f, -0.002607f, -0.001154f, -0.001582f, +0.002685f, -0.002643f, -0.002024f, -0.001958f, +0.002998f, + +0.001497f, +0.000822f, +0.000260f, -0.000185f, -0.000568f, +0.000261f, +0.002612f, +0.000110f, -0.000977f, +0.000922f, + +0.000489f, -0.000166f, -0.001510f, -0.000057f, -0.001159f, -0.000213f, -0.000535f, +0.000321f, -0.000648f, +0.000651f, + +0.000456f, -0.000376f, +0.000671f, -0.000242f, +0.000227f, +0.000209f, +0.000378f, -0.000173f, -0.000433f, +0.000116f, + +0.000256f, +0.000018f, +0.000211f, -0.000112f, -0.000256f, +0.000251f, +0.000007f, -0.000417f, -0.000394f, +0.000410f, + -0.000134f, -0.000119f, +0.000120f, +0.000048f, -0.000127f, +0.000062f, +0.000298f, +0.000288f, -0.000336f, -0.000143f, + +0.000138f, +0.000241f, +0.000073f, +0.000116f, +0.000138f, +0.000087f, -0.000018f, -0.000066f, -0.000130f, -0.000036f, + +0.000021f, +0.000028f, -0.000092f, -0.000049f, +0.000049f, +0.000024f, +0.000015f, -0.000022f, -0.000056f, -0.000092f, + -0.000012f, -0.000059f, +0.000074f, -0.000029f, +0.000017f, +0.000016f + }, + { + +0.008556f, +0.058073f, +0.004482f, +0.005709f, -0.000723f, +0.000092f, -0.001862f, +0.000926f, +0.000391f, -0.000285f, + -0.000355f, -0.001289f, -0.000887f, +0.001436f, +0.003318f, +0.001376f, -0.000471f, -0.001490f, +0.001107f, +0.001788f, + -0.000074f, +0.000054f, +0.000915f, -0.000720f, -0.000587f, +0.000482f, +0.000211f, +0.000009f, +0.000446f, +0.000423f, + +0.000856f, +0.000322f, +0.001134f, +0.000421f, -0.000087f, +0.000747f, +0.000094f, +0.000315f, +0.000153f, +0.000407f, + +0.000539f, +0.000687f, -0.000166f, -0.000867f, -0.000125f, -0.000065f, +0.000223f, +0.000246f, +0.000311f, -0.000198f, + -0.000448f, -0.000285f, +0.000248f, +0.000364f, -0.000047f, +0.000432f, +0.000130f, +0.000044f, -0.000158f, +0.000054f, + -0.000275f, +0.000215f, -0.000005f, -0.000201f, -0.000283f, +0.000001f, +0.000103f, +0.000195f, -0.000009f, +0.000124f, + +0.000022f, -0.000123f, +0.000223f, +0.000187f, -0.000070f, -0.000117f, +0.000120f, +0.000174f, -0.000045f, +0.000153f, + +0.000022f, +0.000016f, +0.000061f, +0.000120f, -0.000030f, +0.000039f, +0.000112f, -0.000036f, -0.000031f, -0.000019f, + -0.000002f, +0.000137f, +0.000010f, +0.000002f, +0.000012f, +0.000002f + }, + { + -0.000178f, +0.005458f, -0.004329f, -0.000133f, -0.000066f, -0.000147f, +0.000193f, -0.000011f, +0.000485f, -0.000008f, + +0.001029f, -0.001348f, -0.000583f, -0.004325f, +0.003312f, -0.001127f, -0.001117f, -0.002188f, +0.002538f, -0.002454f, + -0.001719f, +0.002709f, +0.001007f, -0.000206f, +0.002004f, +0.002328f, +0.001448f, -0.001521f, +0.000318f, +0.001277f, + -0.000294f, +0.002061f, -0.000375f, -0.000005f, -0.000527f, -0.001782f, +0.000549f, +0.000321f, -0.000122f, +0.000317f, + +0.000549f, +0.000329f, +0.000537f, +0.000261f, +0.000207f, +0.000406f, -0.000226f, -0.000368f, +0.000200f, -0.000133f, + +0.000149f, +0.000343f, +0.000149f, +0.000314f, +0.000018f, -0.000128f, -0.000157f, +0.000055f, -0.000187f, -0.000076f, + +0.000033f, -0.000109f, -0.000130f, +0.000026f, +0.000133f, +0.000217f, +0.000015f, +0.000083f, -0.000160f, -0.000199f, + -0.000200f, -0.000298f, -0.000098f, +0.000336f, -0.000017f, -0.000108f, +0.000061f, +0.000206f, -0.000110f, -0.000036f, + -0.000020f, -0.000126f, +0.000091f, -0.000059f, +0.000083f, -0.000016f, +0.000078f, -0.000003f, -0.000023f, -0.000065f, + +0.000069f, -0.000051f, -0.000009f, +0.000051f, -0.000007f, +0.000051f + }, + { + -0.008545f, +0.007600f, -0.000803f, +0.006172f, +0.001065f, +0.004718f, +0.000003f, -0.001966f, +0.000223f, +0.000942f, + +0.000619f, -0.000781f, -0.001123f, +0.000072f, +0.003067f, -0.005102f, +0.003400f, +0.000590f, -0.001607f, +0.001630f, + +0.000394f, -0.000539f, +0.000607f, +0.001231f, +0.000685f, -0.000095f, +0.000345f, +0.000883f, -0.000090f, +0.000409f, + +0.000751f, +0.000507f, +0.000747f, +0.001372f, +0.001220f, -0.000986f, +0.000597f, -0.000109f, -0.000790f, +0.000091f, + +0.000191f, -0.000553f, -0.000284f, -0.000628f, +0.000153f, +0.000596f, -0.000128f, -0.000296f, +0.000433f, -0.000019f, + +0.000046f, +0.000127f, +0.000367f, -0.000244f, -0.000109f, +0.000164f, -0.000167f, -0.000179f, -0.000035f, -0.000195f, + -0.000006f, +0.000161f, -0.000167f, +0.000021f, -0.000278f, -0.000007f, +0.000048f, +0.000076f, +0.000174f, +0.000132f, + +0.000011f, +0.000053f, -0.000015f, -0.000112f, -0.000091f, -0.000165f, +0.000116f, -0.000118f, +0.000077f, +0.000021f, + -0.000112f, +0.000101f, +0.000098f, +0.000046f, +0.000152f, +0.000069f, +0.000039f, -0.000015f, +0.000047f, -0.000028f, + +0.000033f, -0.000095f, -0.000005f, +0.000038f, +0.000027f, -0.000017f + }, + { + +0.000366f, -0.000974f, +0.001765f, +0.002184f, +0.000805f, -0.000234f, -0.002461f, -0.000401f, -0.001686f, +0.001165f, + +0.000806f, -0.000987f, -0.001857f, +0.000682f, -0.000247f, -0.002674f, -0.002714f, -0.004439f, +0.004392f, -0.004849f, + +0.000869f, +0.000382f, -0.000237f, +0.000085f, +0.001045f, -0.001742f, -0.000962f, -0.000914f, -0.000101f, -0.000889f, + -0.000546f, +0.000607f, -0.001246f, +0.000052f, +0.000308f, -0.001110f, -0.000648f, -0.000221f, -0.000303f, -0.000026f, + +0.000155f, +0.000537f, -0.000332f, -0.000356f, -0.000205f, -0.000339f, -0.000289f, +0.000224f, -0.000103f, +0.000918f, + -0.000552f, -0.000311f, -0.000460f, -0.000337f, +0.000257f, -0.000138f, -0.000188f, +0.000130f, -0.000126f, +0.000212f, + +0.000194f, -0.000087f, -0.000028f, +0.000051f, +0.000185f, -0.000187f, +0.000129f, +0.000121f, -0.000099f, -0.000069f, + +0.000028f, -0.000019f, -0.000135f, -0.000024f, +0.000034f, -0.000047f, -0.000094f, -0.000118f, +0.000185f, -0.000077f, + -0.000103f, +0.000131f, +0.000002f, -0.000146f, +0.000016f, +0.000078f, -0.000073f, +0.000013f, -0.000056f, +0.000012f, + +0.000064f, -0.000011f, -0.000003f, -0.000028f, +0.000030f, -0.000042f + }, + { + +0.002284f, -0.014335f, -0.005790f, -0.006130f, +0.000576f, -0.001063f, +0.002381f, +0.001071f, +0.000048f, -0.000019f, + -0.003800f, -0.000428f, +0.000033f, -0.001081f, +0.000882f, +0.002334f, +0.000561f, +0.000278f, +0.000484f, -0.000990f, + +0.000943f, +0.000968f, +0.000028f, -0.000121f, +0.000151f, -0.001294f, -0.000705f, -0.000932f, -0.000697f, -0.000783f, + +0.001511f, -0.000223f, -0.000338f, +0.000331f, -0.000213f, -0.001116f, -0.000463f, +0.000272f, +0.000918f, -0.000317f, + +0.000869f, -0.000331f, -0.000793f, -0.000019f, +0.000084f, +0.000026f, -0.000187f, -0.000382f, -0.000133f, -0.000286f, + +0.000484f, +0.000211f, -0.000202f, -0.000305f, -0.000065f, -0.000013f, -0.000010f, +0.000043f, -0.000556f, -0.000018f, + +0.000072f, -0.000183f, +0.000007f, +0.000223f, -0.000102f, +0.000087f, -0.000012f, -0.000087f, -0.000023f, +0.000256f, + -0.000099f, -0.000009f, +0.000029f, -0.000080f, +0.000020f, -0.000065f, -0.000017f, +0.000023f, -0.000049f, -0.000032f, + +0.000044f, +0.000178f, -0.000008f, -0.000169f, +0.000033f, -0.000156f, +0.000137f, +0.000034f, +0.000016f, +0.000110f, + +0.000004f, +0.000050f, +0.000051f, -0.000026f, +0.000017f, -0.000021f + }, + { + -0.000138f, -0.006472f, +0.001038f, +0.002120f, -0.000299f, +0.000146f, -0.000216f, +0.000146f, -0.000190f, +0.000551f, + -0.000202f, +0.001001f, +0.004880f, -0.016154f, -0.005171f, -0.001111f, -0.005665f, -0.002355f, +0.000565f, +0.001768f, + -0.005003f, -0.001172f, -0.001765f, -0.002493f, +0.000131f, +0.001569f, -0.000711f, -0.000384f, +0.001130f, -0.000263f, + -0.000443f, -0.000067f, +0.000343f, -0.000078f, +0.001182f, -0.000273f, -0.000312f, +0.000882f, +0.000433f, -0.000116f, + +0.000440f, +0.000465f, -0.000406f, -0.000149f, -0.000028f, -0.000374f, -0.000724f, -0.000240f, +0.000394f, +0.000068f, + +0.000652f, +0.000262f, -0.000143f, -0.000208f, +0.000461f, -0.000318f, -0.000295f, -0.000181f, -0.000089f, +0.000059f, + -0.000000f, +0.000408f, -0.000421f, -0.000052f, -0.000126f, +0.000038f, -0.000137f, -0.000170f, -0.000027f, +0.000139f, + -0.000016f, +0.000030f, +0.000049f, -0.000057f, +0.000313f, +0.000033f, +0.000055f, +0.000158f, -0.000102f, -0.000135f, + -0.000033f, +0.000024f, -0.000055f, -0.000085f, -0.000026f, -0.000027f, +0.000100f, -0.000066f, -0.000140f, +0.000145f, + +0.000023f, +0.000092f, +0.000081f, -0.000055f, +0.000021f, +0.000016f + }, + { + +0.006876f, -0.016096f, +0.000979f, +0.003580f, -0.000165f, -0.001597f, +0.001481f, +0.001914f, +0.000285f, -0.000709f, + -0.000736f, +0.001730f, +0.000724f, -0.004474f, -0.004717f, -0.000500f, -0.002141f, -0.000472f, +0.002240f, +0.000283f, + -0.000417f, +0.001260f, +0.001316f, +0.001496f, +0.000502f, -0.001062f, -0.001419f, +0.001284f, +0.000211f, -0.001034f, + -0.000269f, -0.000917f, -0.000268f, -0.000741f, -0.000041f, +0.000174f, +0.000366f, -0.000350f, -0.000119f, -0.000002f, + +0.000545f, +0.000160f, +0.000792f, -0.000114f, -0.000187f, -0.000009f, +0.000133f, +0.000736f, +0.000353f, -0.000366f, + -0.000482f, +0.000211f, +0.000365f, -0.000182f, -0.000064f, +0.000320f, -0.000201f, -0.000054f, -0.000441f, +0.000485f, + -0.000064f, +0.000040f, +0.000089f, -0.000039f, -0.000157f, +0.000091f, +0.000155f, +0.000113f, +0.000175f, -0.000072f, + +0.000064f, -0.000156f, +0.000011f, -0.000056f, -0.000018f, -0.000033f, +0.000040f, -0.000109f, -0.000152f, -0.000079f, + +0.000058f, -0.000102f, -0.000120f, +0.000007f, -0.000016f, -0.000125f, +0.000097f, +0.000124f, -0.000072f, +0.000019f, + -0.000004f, -0.000076f, -0.000009f, +0.000015f, +0.000066f, -0.000020f + }, + { + -0.000834f, -0.004248f, -0.000613f, +0.001066f, +0.000016f, -0.000361f, -0.000287f, +0.000093f, +0.001734f, -0.000879f, + +0.001436f, +0.000362f, -0.000335f, -0.006014f, +0.008801f, +0.003236f, -0.001124f, +0.002972f, +0.000053f, +0.002268f, + +0.000906f, +0.000808f, +0.002349f, +0.001305f, +0.001290f, -0.001736f, -0.000902f, -0.000777f, +0.000523f, +0.000863f, + -0.000632f, -0.000361f, -0.000706f, -0.001495f, +0.000474f, +0.000808f, +0.000285f, -0.000939f, -0.000167f, +0.000030f, + +0.000728f, +0.000274f, +0.000950f, -0.000485f, +0.000343f, -0.000298f, +0.000647f, +0.000076f, +0.000031f, -0.000349f, + +0.000361f, +0.000166f, +0.000231f, -0.000694f, -0.000387f, -0.000127f, +0.000032f, +0.000142f, +0.000146f, +0.000534f, + -0.000155f, -0.000107f, +0.000023f, -0.000121f, -0.000078f, -0.000257f, -0.000335f, +0.000194f, -0.000042f, -0.000127f, + -0.000246f, +0.000135f, +0.000125f, -0.000096f, +0.000029f, -0.000088f, +0.000096f, +0.000091f, +0.000010f, -0.000114f, + -0.000182f, -0.000119f, -0.000032f, +0.000033f, -0.000050f, +0.000093f, +0.000013f, -0.000093f, +0.000006f, +0.000062f, + -0.000021f, -0.000045f, +0.000034f, +0.000087f, -0.000009f, -0.000041f + } + }, + { + { + -0.013545f, +0.062910f, -0.015756f, -0.002327f, +0.002316f, -0.001235f, -0.000298f, +0.001845f, -0.000126f, -0.001110f, + +0.001239f, -0.000578f, +0.000688f, +0.000611f, +0.000386f, +0.002471f, +0.000226f, +0.002357f, -0.002401f, -0.000690f, + +0.001007f, -0.000127f, +0.001092f, +0.000594f, -0.000855f, +0.000724f, -0.000196f, +0.000593f, +0.000021f, +0.000280f, + -0.000093f, +0.001166f, -0.000858f, -0.000136f, +0.000366f, +0.000732f, +0.000460f, -0.000885f, -0.000306f, -0.000138f, + +0.000260f, +0.000430f, +0.000007f, -0.001237f, -0.000578f, +0.000487f, +0.000065f, -0.000493f, +0.000919f, +0.000342f, + +0.000122f, -0.000028f, -0.000085f, +0.000210f, +0.000111f, +0.000091f, -0.000078f, -0.000158f, -0.000306f, +0.000186f, + +0.000130f, -0.000120f, -0.000071f, -0.000338f, -0.000050f, +0.000053f, +0.000225f, +0.000112f, -0.000240f, -0.000082f, + +0.000001f, -0.000133f, +0.000003f, +0.000114f, -0.000030f, -0.000103f, -0.000173f, +0.000109f, -0.000140f, +0.000129f, + +0.000009f, +0.000209f, +0.000062f, -0.000074f, -0.000025f, -0.000109f, +0.000079f, +0.000012f, +0.000005f, +0.000025f, + -0.000042f, -0.000026f, +0.000060f, -0.000049f, -0.000004f, +0.000013f + }, + { + +0.000766f, -0.026141f, +0.000597f, +0.001968f, +0.000266f, +0.000384f, +0.001374f, -0.000162f, +0.000122f, +0.000450f, + +0.002597f, -0.000597f, +0.000168f, +0.001551f, +0.001382f, -0.000923f, +0.000747f, -0.000646f, -0.000920f, -0.000545f, + +0.001394f, -0.002200f, -0.000280f, +0.001060f, +0.002225f, +0.001661f, -0.002423f, +0.001988f, +0.000731f, -0.000999f, + +0.000302f, +0.000242f, -0.000296f, +0.000417f, +0.000545f, +0.001383f, +0.000200f, +0.000416f, +0.000296f, -0.000340f, + -0.000530f, +0.000614f, +0.001000f, +0.000483f, -0.000927f, -0.000186f, +0.000081f, +0.000015f, +0.000078f, +0.000280f, + +0.000617f, -0.000397f, +0.000026f, +0.000278f, +0.000361f, -0.000197f, +0.000041f, -0.000088f, -0.000282f, +0.000085f, + -0.000088f, +0.000027f, -0.000142f, +0.000048f, -0.000114f, +0.000360f, +0.000164f, +0.000320f, +0.000012f, +0.000041f, + +0.000153f, +0.000007f, -0.000119f, -0.000146f, -0.000025f, +0.000156f, -0.000095f, -0.000081f, +0.000042f, -0.000088f, + +0.000120f, -0.000036f, -0.000123f, -0.000034f, -0.000053f, -0.000022f, +0.000108f, +0.000024f, -0.000007f, +0.000075f, + -0.000100f, -0.000070f, +0.000026f, +0.000072f, +0.000063f, -0.000072f + }, + { + -0.004374f, +0.028774f, +0.015640f, -0.000731f, +0.001943f, -0.000227f, +0.000700f, -0.000722f, -0.000160f, +0.000604f, + -0.000768f, -0.000329f, +0.001135f, -0.002206f, +0.003393f, +0.001597f, +0.001736f, -0.000364f, +0.005024f, -0.000338f, + -0.000673f, -0.000760f, +0.000238f, -0.000045f, -0.000078f, -0.000458f, +0.000505f, +0.001240f, +0.000073f, -0.000324f, + +0.000904f, +0.001890f, +0.000266f, +0.000623f, -0.000806f, -0.001595f, +0.000412f, +0.000077f, -0.000062f, +0.000595f, + +0.000360f, +0.000500f, -0.000223f, +0.000047f, +0.000193f, -0.000524f, -0.000312f, -0.000332f, +0.000445f, -0.000006f, + -0.000647f, +0.000578f, -0.000185f, -0.000089f, +0.000322f, +0.000024f, +0.000031f, -0.000036f, +0.000068f, +0.000309f, + -0.000218f, +0.000353f, -0.000280f, +0.000292f, +0.000025f, +0.000131f, +0.000040f, -0.000271f, -0.000040f, +0.000141f, + +0.000057f, -0.000024f, +0.000054f, +0.000075f, -0.000035f, +0.000002f, -0.000019f, -0.000133f, +0.000121f, +0.000061f, + -0.000006f, +0.000090f, +0.000078f, -0.000114f, -0.000050f, +0.000094f, +0.000038f, +0.000135f, -0.000160f, +0.000089f, + +0.000056f, -0.000054f, -0.000037f, -0.000033f, -0.000052f, -0.000017f + }, + { + +0.007096f, +0.023476f, -0.015111f, +0.000872f, -0.000601f, +0.000548f, -0.000452f, +0.000125f, -0.000376f, -0.000406f, + -0.000112f, -0.000281f, +0.002422f, -0.000857f, -0.001054f, -0.001038f, +0.001032f, -0.003552f, +0.000130f, -0.000123f, + +0.000585f, -0.000441f, -0.000194f, +0.000345f, +0.000161f, +0.000246f, -0.000330f, +0.001495f, -0.001471f, +0.000444f, + +0.001749f, -0.000134f, +0.000732f, -0.000030f, -0.000611f, +0.000367f, -0.000667f, -0.000051f, +0.000275f, +0.000033f, + +0.000828f, +0.000220f, +0.000291f, +0.000036f, +0.000008f, +0.000373f, -0.000150f, -0.000399f, +0.000708f, -0.000667f, + +0.000220f, +0.000120f, +0.000012f, +0.000447f, +0.000147f, -0.000321f, +0.000160f, +0.000090f, +0.000302f, -0.000356f, + -0.000069f, +0.000187f, +0.000292f, -0.000046f, +0.000138f, -0.000072f, -0.000052f, +0.000112f, -0.000005f, +0.000052f, + +0.000030f, -0.000039f, -0.000255f, -0.000112f, -0.000067f, +0.000066f, +0.000037f, +0.000071f, +0.000000f, -0.000001f, + +0.000135f, +0.000059f, +0.000109f, -0.000038f, -0.000066f, +0.000028f, -0.000103f, +0.000109f, -0.000036f, -0.000000f, + +0.000047f, +0.000004f, -0.000031f, -0.000028f, +0.000065f, +0.000029f + }, + { + +0.000856f, +0.012754f, -0.001544f, -0.000638f, +0.000330f, -0.000016f, -0.000463f, +0.000342f, +0.000043f, -0.000382f, + -0.000409f, +0.000434f, -0.000905f, +0.002921f, -0.008732f, -0.002112f, -0.001756f, -0.000444f, +0.005424f, -0.000629f, + -0.001385f, +0.000106f, +0.002168f, +0.000310f, -0.000650f, -0.004593f, -0.001775f, -0.000241f, +0.000571f, +0.001214f, + +0.002185f, -0.000394f, -0.000308f, +0.000418f, -0.000731f, -0.001085f, -0.000337f, +0.000411f, -0.001017f, +0.000169f, + +0.000205f, +0.000019f, +0.000471f, +0.000031f, +0.000206f, +0.000049f, -0.000555f, +0.000218f, +0.000293f, -0.000128f, + +0.000232f, -0.000127f, -0.000355f, +0.000347f, +0.000336f, -0.000506f, -0.000060f, +0.000241f, -0.000207f, -0.000309f, + +0.000061f, +0.000075f, -0.000588f, +0.000020f, -0.000133f, +0.000121f, -0.000022f, +0.000029f, +0.000009f, -0.000007f, + +0.000082f, -0.000060f, +0.000095f, +0.000022f, -0.000079f, -0.000086f, -0.000081f, -0.000027f, +0.000061f, +0.000070f, + +0.000015f, +0.000105f, -0.000030f, -0.000130f, +0.000046f, -0.000106f, +0.000026f, +0.000059f, -0.000080f, -0.000041f, + -0.000052f, +0.000037f, +0.000006f, -0.000043f, -0.000070f, +0.000035f + }, + { + +0.013853f, +0.019865f, -0.014012f, +0.000902f, +0.000308f, -0.000297f, -0.001086f, -0.000084f, -0.000020f, -0.001373f, + +0.001226f, +0.000366f, -0.000612f, +0.000458f, -0.000167f, +0.000151f, +0.000861f, -0.000815f, +0.000448f, -0.000492f, + +0.000024f, +0.000398f, +0.000195f, +0.000541f, -0.000416f, +0.000034f, -0.000392f, -0.001203f, -0.001204f, -0.000563f, + +0.001464f, +0.000270f, +0.000014f, -0.000088f, +0.000657f, +0.000111f, -0.001343f, +0.000205f, -0.000636f, +0.000331f, + -0.000150f, +0.000943f, -0.000862f, -0.000271f, -0.000018f, +0.000082f, +0.000130f, -0.000375f, +0.000122f, -0.000101f, + +0.000871f, -0.000421f, +0.000307f, +0.000159f, +0.000181f, -0.000473f, +0.000368f, +0.000196f, +0.000136f, -0.000213f, + -0.000323f, -0.000078f, +0.000195f, +0.000118f, +0.000045f, -0.000215f, +0.000112f, +0.000133f, -0.000111f, -0.000175f, + -0.000132f, +0.000077f, +0.000141f, -0.000042f, -0.000013f, -0.000139f, -0.000034f, -0.000018f, +0.000089f, -0.000056f, + -0.000061f, +0.000005f, +0.000009f, -0.000196f, -0.000060f, +0.000041f, +0.000051f, -0.000037f, +0.000080f, -0.000104f, + +0.000039f, +0.000023f, +0.000027f, +0.000029f, -0.000011f, +0.000019f + }, + { + -0.000528f, -0.001467f, +0.001687f, -0.000433f, -0.000129f, +0.000066f, -0.000401f, -0.000344f, -0.000056f, -0.000084f, + -0.000022f, +0.000357f, -0.000443f, +0.003041f, -0.003876f, -0.003176f, -0.002775f, +0.000244f, -0.000904f, +0.004106f, + -0.000116f, -0.000769f, -0.000452f, -0.000903f, -0.001225f, -0.000607f, +0.001136f, +0.001193f, -0.002701f, +0.001563f, + +0.001678f, +0.001465f, +0.000131f, -0.000498f, -0.000394f, +0.000498f, -0.001147f, -0.000104f, -0.000613f, +0.000132f, + +0.000785f, -0.000205f, +0.000118f, -0.000236f, -0.000602f, -0.000404f, +0.000239f, -0.000137f, -0.000401f, +0.000264f, + +0.000068f, -0.000242f, +0.000145f, +0.000351f, +0.000228f, +0.000163f, -0.000083f, +0.000390f, -0.000086f, +0.000335f, + -0.000064f, -0.000119f, -0.000263f, -0.000128f, -0.000124f, -0.000060f, +0.000035f, +0.000314f, -0.000047f, +0.000011f, + -0.000251f, +0.000032f, +0.000027f, -0.000041f, -0.000083f, +0.000129f, +0.000042f, +0.000032f, +0.000017f, +0.000100f, + -0.000066f, +0.000062f, -0.000081f, +0.000081f, +0.000006f, -0.000024f, +0.000114f, -0.000101f, -0.000041f, -0.000014f, + -0.000041f, -0.000093f, -0.000006f, +0.000015f, -0.000024f, -0.000047f + }, + { + -0.004578f, +0.050719f, +0.002927f, +0.004997f, -0.000713f, -0.000112f, -0.001395f, -0.000144f, -0.000663f, -0.000361f, + +0.000687f, +0.000737f, -0.001730f, -0.001638f, +0.000111f, -0.001334f, -0.001592f, -0.000743f, -0.001049f, +0.000508f, + +0.000870f, -0.000350f, -0.000104f, -0.000085f, -0.000045f, -0.000064f, +0.000096f, -0.000297f, +0.000925f, +0.000068f, + +0.000071f, -0.000185f, +0.000062f, +0.000488f, -0.000037f, +0.000678f, +0.000513f, -0.000250f, -0.000712f, +0.000320f, + +0.000070f, +0.000112f, -0.000178f, +0.000325f, -0.000645f, -0.000051f, +0.000272f, -0.000064f, -0.000332f, -0.000113f, + -0.000049f, +0.000611f, +0.000500f, -0.000153f, -0.000156f, +0.000264f, +0.000236f, +0.000142f, +0.000297f, +0.000340f, + -0.000327f, -0.000035f, +0.000094f, +0.000305f, +0.000097f, -0.000029f, -0.000049f, +0.000051f, +0.000168f, +0.000008f, + -0.000021f, -0.000020f, +0.000026f, +0.000098f, +0.000192f, -0.000002f, -0.000253f, +0.000238f, +0.000009f, -0.000007f, + +0.000028f, +0.000071f, -0.000018f, +0.000002f, -0.000059f, +0.000031f, -0.000039f, +0.000066f, +0.000016f, +0.000061f, + -0.000017f, -0.000000f, -0.000053f, -0.000024f, +0.000050f, -0.000057f + }, + { + -0.001209f, +0.005451f, +0.002834f, +0.000094f, +0.000494f, -0.000236f, -0.000489f, -0.001215f, +0.000466f, -0.000015f, + +0.000663f, -0.000902f, +0.000624f, -0.003586f, +0.005456f, +0.001687f, +0.003067f, +0.000267f, +0.003042f, -0.001241f, + +0.000312f, +0.000283f, -0.000179f, -0.001440f, +0.001865f, +0.001778f, -0.001756f, +0.000477f, -0.001100f, +0.000127f, + +0.001414f, +0.001492f, -0.001233f, -0.000132f, -0.000709f, -0.000736f, +0.000443f, -0.000814f, +0.000150f, -0.000199f, + -0.000390f, +0.000482f, -0.000183f, -0.000537f, +0.000026f, +0.000507f, -0.000387f, -0.000258f, +0.000370f, +0.000119f, + -0.000100f, -0.000149f, -0.000433f, -0.000038f, -0.000098f, -0.000002f, -0.000309f, +0.000302f, -0.000068f, -0.000103f, + +0.000118f, +0.000064f, -0.000158f, -0.000150f, -0.000289f, -0.000132f, -0.000047f, -0.000043f, -0.000033f, -0.000013f, + +0.000081f, -0.000024f, -0.000193f, -0.000015f, +0.000068f, +0.000004f, +0.000022f, +0.000030f, -0.000084f, -0.000154f, + +0.000100f, -0.000051f, -0.000135f, -0.000146f, +0.000008f, -0.000046f, +0.000029f, +0.000082f, +0.000032f, -0.000038f, + +0.000013f, -0.000007f, -0.000031f, -0.000019f, -0.000002f, -0.000001f + }, + { + +0.007346f, +0.019813f, -0.022685f, -0.006808f, -0.001453f, +0.001333f, -0.006211f, +0.000085f, -0.000324f, +0.000047f, + +0.001064f, +0.000129f, +0.000309f, +0.000911f, +0.000979f, -0.003440f, +0.001573f, -0.000550f, -0.000474f, +0.000399f, + -0.001039f, -0.000398f, -0.000368f, -0.000071f, -0.000036f, +0.000115f, +0.000786f, +0.000213f, -0.000450f, -0.000065f, + -0.000337f, -0.000260f, -0.000247f, -0.000332f, +0.000970f, -0.000303f, +0.000284f, -0.000081f, +0.000266f, +0.000056f, + +0.000383f, -0.000641f, -0.000039f, -0.000240f, -0.000206f, +0.000636f, +0.000394f, -0.000435f, -0.000409f, -0.000434f, + +0.000488f, -0.000386f, +0.000232f, +0.000680f, -0.000314f, -0.000137f, +0.000109f, +0.000229f, +0.000063f, +0.000253f, + -0.000404f, +0.000213f, -0.000023f, +0.000057f, -0.000111f, -0.000207f, +0.000029f, +0.000066f, -0.000072f, +0.000042f, + +0.000002f, +0.000104f, -0.000080f, +0.000092f, +0.000031f, -0.000005f, +0.000121f, +0.000104f, -0.000048f, +0.000115f, + -0.000156f, -0.000037f, -0.000011f, +0.000061f, -0.000031f, +0.000018f, +0.000141f, +0.000003f, +0.000002f, +0.000076f, + +0.000003f, +0.000070f, -0.000075f, -0.000023f, -0.000058f, +0.000047f + }, + { + -0.000145f, +0.002533f, -0.000283f, -0.000806f, +0.000438f, +0.000357f, -0.000319f, +0.000599f, -0.001825f, -0.000113f, + +0.000028f, +0.001674f, -0.000227f, +0.000598f, +0.000256f, +0.001144f, +0.000051f, -0.004168f, +0.003589f, -0.000354f, + -0.000254f, -0.001797f, -0.000652f, -0.000081f, +0.001036f, -0.001980f, +0.000666f, -0.001303f, -0.000194f, -0.000112f, + -0.000266f, +0.000614f, -0.000731f, +0.000329f, -0.000532f, +0.000482f, -0.000015f, +0.000548f, +0.000052f, -0.000002f, + -0.000142f, -0.000341f, -0.000086f, +0.000174f, -0.000184f, -0.000028f, +0.000188f, +0.000112f, +0.000156f, +0.000833f, + -0.000572f, +0.000164f, -0.000163f, -0.000355f, +0.000215f, -0.000040f, -0.000104f, +0.000199f, +0.000038f, +0.000094f, + +0.000083f, +0.000217f, -0.000017f, -0.000112f, +0.000012f, +0.000012f, -0.000058f, +0.000170f, +0.000207f, -0.000086f, + +0.000059f, -0.000130f, -0.000202f, +0.000016f, +0.000195f, -0.000008f, +0.000017f, -0.000104f, -0.000099f, +0.000042f, + -0.000049f, +0.000034f, +0.000193f, -0.000053f, -0.000044f, -0.000039f, -0.000035f, -0.000042f, +0.000054f, -0.000118f, + +0.000007f, -0.000023f, -0.000056f, +0.000007f, +0.000036f, +0.000078f + }, + { + -0.000221f, -0.013539f, +0.000208f, -0.001975f, +0.000186f, +0.002626f, +0.000917f, -0.000420f, +0.000149f, -0.000095f, + -0.000794f, -0.001354f, +0.001110f, +0.000742f, -0.001280f, +0.000491f, -0.000710f, +0.001053f, +0.000172f, +0.000064f, + -0.000826f, -0.000410f, -0.000142f, +0.000365f, +0.000373f, +0.000129f, -0.000934f, -0.000321f, -0.000887f, +0.000054f, + +0.000640f, -0.000374f, -0.000182f, -0.000568f, +0.000224f, -0.000788f, -0.000942f, -0.000165f, +0.000410f, -0.000102f, + +0.000311f, -0.000394f, -0.000771f, +0.000564f, +0.000370f, +0.000296f, -0.000169f, -0.000367f, +0.000468f, -0.000196f, + +0.000004f, -0.000094f, -0.000369f, +0.000034f, -0.000182f, +0.000074f, -0.000102f, +0.000137f, -0.000037f, -0.000263f, + +0.000118f, -0.000191f, -0.000120f, +0.000141f, +0.000121f, -0.000019f, -0.000058f, +0.000012f, -0.000196f, +0.000011f, + +0.000037f, -0.000149f, +0.000050f, +0.000000f, +0.000042f, +0.000060f, +0.000083f, +0.000027f, +0.000007f, -0.000027f, + -0.000021f, +0.000015f, +0.000104f, +0.000033f, +0.000085f, +0.000096f, +0.000048f, +0.000005f, +0.000013f, -0.000022f, + +0.000032f, -0.000023f, +0.000117f, +0.000058f, -0.000015f, -0.000004f + }, + { + +0.000102f, -0.008310f, -0.000298f, +0.000513f, +0.000387f, -0.000308f, +0.000921f, -0.000818f, -0.000799f, +0.000558f, + -0.000412f, +0.001604f, +0.002718f, -0.013500f, -0.004331f, +0.002408f, -0.000771f, -0.000234f, +0.001909f, +0.001640f, + +0.001860f, +0.000214f, +0.002152f, +0.001357f, +0.001465f, +0.000459f, -0.000887f, -0.001132f, +0.001180f, +0.000448f, + +0.001959f, -0.000353f, -0.000157f, -0.000612f, +0.001261f, +0.000350f, -0.000986f, +0.000297f, -0.000674f, +0.000743f, + +0.000540f, +0.000160f, +0.000130f, -0.000027f, -0.000078f, +0.000351f, -0.000561f, -0.000031f, +0.000147f, -0.000581f, + +0.000326f, -0.000012f, +0.000404f, -0.000154f, +0.000202f, -0.000025f, +0.000426f, -0.000340f, +0.000058f, +0.000133f, + -0.000192f, -0.000078f, +0.000038f, +0.000229f, +0.000068f, -0.000119f, +0.000126f, -0.000072f, -0.000125f, +0.000150f, + -0.000133f, +0.000060f, +0.000047f, -0.000170f, +0.000040f, -0.000024f, +0.000100f, +0.000093f, -0.000130f, -0.000008f, + +0.000077f, -0.000034f, -0.000046f, -0.000008f, -0.000018f, +0.000006f, -0.000057f, +0.000095f, -0.000107f, +0.000059f, + -0.000009f, -0.000114f, +0.000084f, +0.000080f, -0.000093f, +0.000065f + }, + { + -0.001640f, -0.021354f, +0.000699f, -0.005958f, -0.001151f, +0.000300f, +0.000838f, +0.000740f, -0.000379f, +0.000414f, + +0.000161f, +0.002506f, -0.000429f, +0.001463f, +0.004854f, -0.000494f, -0.004472f, -0.000174f, +0.000023f, -0.000544f, + -0.000886f, +0.000007f, +0.001708f, -0.000030f, +0.001959f, +0.000499f, -0.000665f, +0.001986f, +0.000134f, +0.000340f, + -0.000830f, -0.000731f, +0.000107f, -0.000310f, -0.001339f, -0.000546f, +0.000777f, -0.000290f, +0.000013f, -0.000434f, + +0.001371f, -0.000272f, +0.000599f, -0.000044f, +0.000018f, +0.000310f, -0.000305f, -0.000352f, +0.000069f, -0.000019f, + +0.000189f, -0.000141f, +0.000334f, +0.000279f, +0.000044f, -0.000010f, -0.000666f, -0.000109f, -0.000121f, +0.000268f, + -0.000372f, -0.000119f, -0.000040f, -0.000088f, -0.000368f, -0.000001f, -0.000397f, -0.000038f, +0.000090f, -0.000093f, + -0.000026f, +0.000041f, -0.000066f, +0.000087f, -0.000037f, -0.000148f, -0.000175f, +0.000099f, -0.000015f, -0.000150f, + +0.000028f, +0.000053f, +0.000003f, -0.000076f, -0.000014f, +0.000023f, -0.000108f, +0.000117f, +0.000058f, -0.000012f, + -0.000041f, +0.000048f, -0.000071f, -0.000024f, +0.000002f, +0.000042f + }, + { + +0.001033f, -0.001382f, -0.001209f, +0.000457f, -0.000284f, -0.000186f, -0.000082f, -0.002307f, +0.000075f, -0.001596f, + +0.000530f, +0.001858f, -0.000764f, -0.005167f, +0.021334f, +0.002388f, -0.004123f, -0.000995f, -0.000336f, +0.000719f, + -0.002941f, -0.002192f, +0.000956f, -0.001894f, -0.000906f, -0.001124f, +0.001245f, +0.000477f, +0.001045f, +0.000724f, + -0.000007f, +0.001469f, -0.000281f, -0.000908f, +0.000580f, -0.000819f, +0.000554f, +0.000035f, -0.000371f, +0.000114f, + +0.000310f, +0.000849f, +0.001389f, -0.000731f, -0.000500f, +0.000083f, +0.000327f, -0.000391f, +0.000068f, -0.000212f, + +0.000063f, +0.000123f, +0.000402f, -0.000220f, +0.000113f, +0.000070f, +0.000157f, +0.000265f, +0.000050f, +0.000591f, + +0.000314f, +0.000059f, -0.000221f, -0.000083f, +0.000199f, +0.000046f, -0.000071f, -0.000225f, +0.000303f, +0.000168f, + +0.000030f, -0.000045f, +0.000284f, +0.000118f, -0.000012f, +0.000127f, -0.000151f, -0.000122f, +0.000084f, -0.000016f, + -0.000042f, -0.000102f, +0.000017f, -0.000208f, +0.000029f, +0.000045f, +0.000026f, +0.000025f, +0.000015f, -0.000068f, + -0.000015f, -0.000017f, -0.000066f, +0.000083f, +0.000050f, -0.000048f + } + }, + { + { + +0.008357f, +0.023519f, -0.017625f, -0.001137f, +0.000417f, -0.000649f, -0.000029f, +0.001204f, -0.000449f, -0.001154f, + +0.000144f, +0.000064f, +0.000292f, +0.001539f, +0.001927f, +0.001476f, +0.000418f, +0.000810f, -0.000981f, -0.001225f, + +0.000149f, +0.000951f, +0.001006f, -0.000040f, +0.000024f, +0.001098f, -0.000620f, +0.000683f, -0.000291f, -0.000068f, + -0.000353f, +0.000287f, -0.000189f, +0.000433f, -0.000288f, +0.000635f, -0.000448f, -0.000263f, -0.001079f, +0.000517f, + +0.000038f, +0.000024f, +0.000133f, -0.000846f, -0.000553f, -0.000056f, +0.000241f, -0.000147f, +0.000445f, +0.000225f, + +0.000185f, +0.000076f, +0.000105f, +0.000229f, +0.000317f, +0.000151f, -0.000117f, +0.000147f, -0.000196f, -0.000163f, + +0.000152f, +0.000115f, +0.000049f, -0.000304f, -0.000125f, +0.000136f, +0.000061f, +0.000001f, -0.000052f, -0.000051f, + -0.000080f, -0.000053f, -0.000068f, +0.000075f, +0.000084f, -0.000037f, -0.000154f, +0.000021f, -0.000107f, -0.000059f, + -0.000024f, +0.000065f, +0.000026f, -0.000046f, +0.000027f, -0.000100f, -0.000022f, -0.000047f, -0.000017f, -0.000054f, + +0.000026f, -0.000048f, +0.000018f, +0.000007f, +0.000002f, +0.000010f + }, + { + -0.000953f, -0.018630f, -0.000726f, -0.000176f, +0.000408f, -0.000236f, +0.002000f, -0.000566f, +0.000075f, +0.000510f, + +0.001106f, +0.000911f, +0.000054f, +0.000670f, +0.001745f, -0.001067f, +0.001871f, +0.000719f, +0.000695f, -0.000826f, + -0.000669f, -0.001677f, +0.000083f, +0.001949f, +0.001405f, +0.000223f, -0.001284f, +0.001883f, +0.000950f, -0.000199f, + +0.000456f, -0.000615f, +0.000380f, -0.000219f, +0.000446f, +0.000357f, +0.000877f, +0.000321f, +0.001003f, -0.000445f, + -0.000147f, +0.000322f, +0.000609f, -0.000086f, -0.000581f, -0.000105f, +0.000094f, +0.000151f, -0.000065f, +0.000444f, + +0.000312f, -0.000181f, -0.000348f, +0.000159f, +0.000503f, -0.000108f, -0.000076f, +0.000012f, +0.000214f, -0.000123f, + -0.000243f, -0.000174f, +0.000026f, +0.000269f, -0.000130f, +0.000306f, +0.000033f, +0.000004f, +0.000209f, +0.000041f, + -0.000003f, +0.000163f, +0.000038f, -0.000139f, -0.000023f, +0.000087f, +0.000063f, -0.000012f, -0.000092f, -0.000060f, + +0.000130f, -0.000005f, -0.000098f, -0.000068f, -0.000060f, -0.000042f, -0.000046f, +0.000022f, -0.000073f, +0.000029f, + -0.000017f, -0.000050f, -0.000054f, +0.000024f, +0.000036f, -0.000022f + }, + { + +0.004994f, +0.048446f, -0.007700f, -0.000783f, -0.000467f, -0.000142f, +0.000223f, -0.000305f, +0.000759f, -0.000182f, + -0.000818f, -0.000476f, +0.001552f, -0.000553f, +0.001972f, +0.001060f, +0.000735f, +0.000788f, +0.002974f, +0.000995f, + +0.000236f, -0.000242f, -0.000388f, +0.000745f, -0.001068f, -0.000545f, +0.000262f, +0.000893f, +0.000038f, -0.000671f, + +0.001734f, +0.001554f, +0.000417f, +0.000087f, -0.000095f, -0.000646f, -0.000000f, -0.000503f, +0.000453f, +0.000737f, + +0.000634f, -0.000076f, -0.000084f, +0.000242f, -0.000432f, -0.000191f, -0.000519f, -0.000042f, -0.000205f, +0.000300f, + -0.000364f, -0.000190f, +0.000029f, -0.000035f, +0.000016f, +0.000119f, -0.000047f, +0.000037f, +0.000133f, +0.000212f, + -0.000073f, +0.000076f, -0.000337f, +0.000414f, +0.000006f, -0.000127f, -0.000028f, -0.000160f, -0.000146f, +0.000174f, + +0.000149f, -0.000097f, -0.000056f, +0.000077f, +0.000074f, +0.000141f, -0.000097f, -0.000150f, +0.000034f, +0.000089f, + +0.000140f, -0.000007f, +0.000059f, +0.000055f, -0.000095f, +0.000001f, +0.000052f, +0.000087f, -0.000029f, +0.000013f, + +0.000045f, +0.000017f, -0.000040f, -0.000048f, -0.000004f, -0.000040f + }, + { + +0.000874f, +0.011179f, +0.001291f, -0.000247f, -0.000310f, -0.000210f, -0.000111f, -0.000673f, -0.000276f, -0.000233f, + +0.001138f, +0.000458f, +0.000564f, -0.000339f, +0.001430f, -0.001118f, -0.000686f, -0.000956f, -0.000285f, -0.000310f, + +0.000069f, -0.000103f, -0.000574f, +0.000291f, +0.000265f, +0.000814f, -0.000392f, +0.000682f, -0.000579f, +0.000311f, + +0.000108f, +0.000458f, +0.000298f, -0.000328f, +0.000499f, -0.000786f, -0.000068f, +0.000209f, -0.000171f, +0.000238f, + +0.000786f, +0.000180f, -0.000111f, +0.000290f, +0.000473f, -0.000124f, -0.000240f, +0.000072f, +0.000062f, -0.000039f, + -0.000336f, +0.000308f, +0.000130f, +0.000226f, +0.000080f, +0.000023f, +0.000039f, +0.000276f, -0.000096f, +0.000013f, + -0.000077f, +0.000230f, +0.000102f, -0.000055f, -0.000060f, +0.000021f, -0.000055f, +0.000112f, -0.000018f, -0.000033f, + +0.000097f, +0.000188f, -0.000184f, -0.000151f, +0.000029f, +0.000056f, -0.000011f, +0.000014f, +0.000034f, -0.000018f, + -0.000023f, +0.000041f, +0.000021f, -0.000056f, -0.000004f, +0.000019f, -0.000088f, +0.000063f, +0.000029f, -0.000029f, + +0.000021f, +0.000034f, -0.000046f, -0.000031f, +0.000036f, +0.000039f + }, + { + -0.000669f, +0.009371f, +0.003333f, -0.000917f, +0.000266f, -0.000052f, -0.000286f, +0.000313f, -0.000241f, -0.000332f, + -0.000403f, +0.000086f, -0.000527f, +0.002539f, -0.007171f, -0.001318f, -0.001604f, -0.003381f, -0.001743f, +0.001483f, + -0.000185f, -0.000449f, +0.001267f, +0.000527f, -0.001868f, -0.002470f, +0.000152f, -0.000691f, +0.000428f, +0.002009f, + +0.000363f, -0.000565f, -0.000987f, +0.000519f, -0.001089f, -0.001194f, -0.000837f, +0.000213f, -0.000153f, -0.000549f, + +0.000298f, -0.000518f, +0.000215f, +0.000406f, +0.000125f, -0.000074f, +0.000144f, -0.000154f, +0.000208f, -0.000325f, + +0.000102f, +0.000208f, -0.000337f, +0.000466f, +0.000023f, -0.000039f, -0.000294f, +0.000162f, -0.000015f, -0.000343f, + -0.000006f, -0.000074f, -0.000236f, -0.000266f, -0.000226f, +0.000011f, +0.000029f, +0.000137f, +0.000051f, -0.000166f, + +0.000171f, +0.000146f, -0.000046f, +0.000021f, -0.000031f, -0.000180f, -0.000042f, -0.000105f, -0.000100f, -0.000002f, + -0.000001f, +0.000139f, +0.000081f, -0.000131f, +0.000031f, -0.000064f, +0.000016f, +0.000066f, -0.000048f, -0.000089f, + -0.000065f, +0.000010f, +0.000012f, +0.000009f, -0.000086f, -0.000021f + }, + { + -0.001637f, +0.016069f, +0.002868f, +0.002171f, +0.000788f, -0.000044f, -0.001394f, +0.000598f, -0.000108f, -0.001979f, + +0.000418f, +0.000732f, +0.000461f, -0.000477f, +0.001590f, +0.000361f, -0.000655f, -0.001158f, +0.000241f, -0.000263f, + -0.000743f, -0.000246f, +0.000035f, +0.001097f, -0.000102f, -0.000161f, -0.001154f, +0.000007f, -0.000871f, -0.000841f, + +0.000171f, +0.001089f, -0.000324f, -0.000067f, +0.000874f, -0.000279f, -0.001689f, +0.000247f, -0.000033f, +0.000052f, + -0.000573f, +0.000159f, -0.000020f, -0.000161f, +0.000046f, +0.000138f, +0.000108f, +0.000325f, -0.000116f, -0.000087f, + +0.000540f, +0.000028f, -0.000118f, +0.000017f, +0.000459f, -0.000149f, -0.000200f, +0.000033f, -0.000035f, -0.000042f, + +0.000002f, -0.000218f, +0.000052f, +0.000199f, +0.000107f, -0.000134f, -0.000053f, +0.000091f, -0.000045f, -0.000106f, + -0.000049f, +0.000009f, +0.000146f, -0.000004f, -0.000009f, -0.000141f, -0.000170f, +0.000015f, +0.000021f, +0.000016f, + +0.000030f, +0.000076f, +0.000051f, -0.000110f, -0.000145f, -0.000037f, +0.000040f, -0.000105f, +0.000072f, +0.000003f, + -0.000014f, +0.000017f, +0.000013f, +0.000055f, +0.000017f, -0.000009f + }, + { + -0.000304f, -0.005008f, +0.001466f, +0.000328f, +0.000084f, -0.000084f, -0.000419f, -0.000221f, -0.000113f, +0.000151f, + +0.000317f, -0.000152f, +0.000260f, +0.000569f, -0.001042f, -0.001998f, -0.000115f, -0.000642f, +0.000794f, +0.002775f, + -0.000251f, -0.000571f, -0.002822f, +0.000862f, -0.000318f, -0.000189f, +0.000440f, -0.000816f, -0.000846f, +0.000846f, + +0.001489f, +0.000961f, +0.000643f, -0.000718f, -0.001202f, +0.000498f, -0.000465f, -0.000690f, -0.000385f, -0.000242f, + +0.000477f, +0.000112f, +0.000226f, -0.000255f, -0.001006f, -0.000437f, -0.000343f, -0.000172f, +0.000131f, +0.000085f, + -0.000029f, -0.000049f, -0.000152f, +0.000304f, +0.000387f, +0.000024f, -0.000117f, +0.000469f, +0.000035f, +0.000112f, + +0.000037f, -0.000029f, -0.000141f, -0.000207f, -0.000133f, +0.000057f, -0.000166f, +0.000032f, +0.000173f, +0.000185f, + -0.000246f, -0.000077f, +0.000039f, -0.000099f, -0.000220f, -0.000047f, +0.000042f, -0.000033f, -0.000023f, +0.000113f, + +0.000000f, -0.000039f, -0.000052f, +0.000092f, +0.000020f, -0.000028f, +0.000068f, -0.000017f, +0.000028f, +0.000054f, + +0.000051f, +0.000028f, -0.000028f, -0.000028f, -0.000000f, -0.000051f + }, + { + +0.001974f, +0.057382f, -0.006471f, +0.000559f, +0.000752f, -0.000416f, -0.000512f, -0.000646f, -0.000590f, +0.000038f, + -0.000058f, +0.000662f, +0.000039f, -0.001126f, -0.002684f, -0.001088f, -0.000529f, +0.000631f, -0.000774f, -0.000857f, + +0.000973f, +0.000155f, -0.001144f, +0.000093f, +0.000419f, -0.000196f, -0.000048f, -0.000314f, +0.000868f, -0.000164f, + +0.000061f, +0.000325f, +0.000057f, -0.000088f, +0.000602f, +0.000007f, +0.000156f, -0.000161f, -0.001300f, +0.000699f, + -0.000230f, -0.000041f, -0.000339f, +0.000902f, -0.000381f, +0.000439f, -0.000522f, +0.000285f, -0.000072f, -0.000336f, + -0.000381f, +0.000902f, +0.000734f, -0.000044f, -0.000036f, -0.000139f, +0.000091f, +0.000103f, +0.000340f, +0.000325f, + +0.000031f, -0.000132f, -0.000086f, +0.000359f, +0.000247f, +0.000080f, -0.000127f, +0.000055f, +0.000178f, -0.000037f, + -0.000011f, +0.000003f, -0.000048f, -0.000107f, +0.000078f, +0.000147f, -0.000249f, -0.000045f, +0.000031f, -0.000020f, + -0.000017f, +0.000079f, +0.000049f, -0.000061f, -0.000017f, +0.000033f, -0.000105f, +0.000054f, -0.000001f, +0.000049f, + -0.000017f, -0.000040f, -0.000045f, -0.000068f, +0.000009f, -0.000007f + }, + { + +0.000111f, -0.000270f, +0.002141f, +0.000161f, -0.000000f, +0.000065f, -0.000910f, -0.000434f, -0.000029f, +0.000093f, + +0.000451f, -0.000005f, -0.000021f, +0.000557f, +0.001190f, +0.000933f, +0.007823f, +0.000799f, +0.002650f, -0.000611f, + -0.001242f, +0.000949f, -0.000026f, -0.000730f, -0.000249f, +0.000946f, -0.001231f, -0.000751f, -0.000286f, +0.000362f, + +0.001857f, +0.000527f, -0.001155f, -0.000825f, +0.000101f, -0.000366f, -0.000739f, -0.000444f, +0.000121f, +0.000073f, + -0.001214f, +0.000209f, -0.000070f, -0.000460f, -0.000540f, -0.000167f, -0.000122f, +0.000018f, +0.000257f, +0.000102f, + -0.000173f, -0.000366f, -0.000288f, -0.000208f, +0.000099f, +0.000022f, -0.000202f, -0.000026f, -0.000098f, -0.000128f, + +0.000072f, +0.000132f, -0.000008f, +0.000089f, -0.000234f, -0.000144f, +0.000247f, -0.000120f, +0.000118f, -0.000056f, + +0.000137f, +0.000111f, -0.000031f, -0.000122f, -0.000005f, +0.000010f, +0.000112f, -0.000084f, -0.000038f, -0.000132f, + -0.000006f, +0.000094f, -0.000080f, -0.000083f, -0.000102f, +0.000007f, -0.000096f, -0.000018f, +0.000070f, +0.000027f, + -0.000066f, -0.000005f, -0.000013f, -0.000050f, +0.000017f, -0.000030f + }, + { + -0.005420f, +0.018177f, -0.003663f, -0.008976f, +0.000071f, -0.003731f, -0.003986f, +0.001696f, -0.000822f, -0.000581f, + +0.000247f, +0.000362f, +0.000056f, +0.001164f, +0.000286f, -0.000076f, -0.000044f, -0.000395f, -0.000773f, +0.000195f, + -0.000865f, -0.000572f, -0.000534f, +0.000165f, -0.000510f, +0.000152f, +0.000760f, -0.000376f, -0.000046f, -0.000006f, + -0.000750f, -0.000468f, -0.000317f, -0.000930f, +0.000504f, +0.000782f, -0.000119f, -0.000279f, +0.000526f, +0.000013f, + -0.000145f, -0.000434f, -0.000107f, +0.000180f, -0.000019f, -0.000057f, +0.000272f, -0.000067f, -0.000599f, -0.000543f, + +0.000210f, -0.000308f, -0.000315f, +0.000388f, +0.000106f, +0.000046f, +0.000023f, +0.000129f, +0.000130f, +0.000347f, + -0.000205f, +0.000150f, -0.000011f, -0.000104f, +0.000025f, -0.000154f, -0.000021f, +0.000011f, -0.000070f, -0.000053f, + +0.000072f, +0.000009f, -0.000088f, +0.000094f, +0.000048f, +0.000075f, -0.000018f, +0.000091f, +0.000035f, +0.000070f, + +0.000009f, -0.000034f, -0.000085f, +0.000047f, -0.000122f, -0.000077f, +0.000025f, +0.000014f, -0.000048f, +0.000034f, + -0.000034f, +0.000090f, -0.000006f, -0.000064f, -0.000063f, +0.000006f + }, + { + +0.000320f, +0.007325f, -0.003166f, -0.001701f, -0.000517f, -0.000334f, -0.001538f, +0.000945f, -0.000161f, -0.000997f, + -0.000954f, +0.001381f, +0.000195f, -0.000678f, +0.000817f, +0.001660f, -0.001115f, +0.000343f, -0.001587f, +0.002977f, + -0.000063f, -0.001291f, -0.000175f, -0.001077f, -0.000118f, -0.000679f, -0.000091f, -0.000712f, +0.000011f, +0.000621f, + -0.000072f, +0.000072f, +0.000076f, +0.000113f, -0.000708f, +0.000989f, +0.000346f, +0.000670f, -0.000275f, -0.000008f, + -0.000077f, +0.000063f, -0.000140f, +0.000114f, -0.000178f, -0.000115f, +0.000150f, -0.000004f, +0.000368f, -0.000186f, + -0.000226f, +0.000156f, +0.000154f, -0.000165f, +0.000248f, +0.000009f, -0.000021f, -0.000051f, +0.000074f, +0.000092f, + -0.000058f, +0.000145f, +0.000064f, -0.000068f, -0.000131f, +0.000078f, -0.000047f, -0.000014f, +0.000146f, -0.000015f, + +0.000081f, -0.000086f, -0.000119f, -0.000024f, +0.000105f, +0.000078f, +0.000072f, +0.000068f, -0.000116f, -0.000025f, + +0.000008f, +0.000010f, +0.000111f, +0.000073f, +0.000003f, -0.000040f, +0.000049f, +0.000001f, +0.000069f, -0.000029f, + -0.000029f, +0.000013f, -0.000034f, +0.000024f, -0.000021f, +0.000033f + }, + { + -0.000500f, -0.015482f, +0.001822f, +0.001892f, -0.001537f, +0.003260f, +0.002197f, -0.000456f, +0.000079f, -0.000731f, + +0.000322f, -0.000090f, +0.000200f, +0.001137f, -0.000812f, +0.000163f, -0.000612f, +0.000570f, -0.000084f, +0.000157f, + -0.000552f, -0.001120f, +0.000525f, -0.000483f, +0.000201f, +0.000692f, -0.000746f, -0.000827f, -0.000363f, -0.000085f, + +0.000086f, +0.000016f, +0.000463f, -0.000863f, -0.000203f, +0.000339f, -0.000248f, +0.000099f, +0.000000f, +0.000025f, + -0.000207f, -0.000205f, -0.000139f, +0.000306f, +0.000188f, -0.000054f, +0.000184f, -0.000083f, +0.000419f, +0.000006f, + -0.000451f, -0.000306f, -0.000067f, -0.000055f, +0.000005f, +0.000101f, -0.000143f, +0.000140f, +0.000172f, -0.000296f, + +0.000024f, -0.000000f, -0.000013f, -0.000103f, +0.000147f, -0.000011f, +0.000015f, -0.000024f, -0.000005f, -0.000195f, + +0.000016f, -0.000081f, -0.000002f, -0.000024f, -0.000019f, +0.000050f, +0.000083f, +0.000088f, +0.000094f, -0.000011f, + -0.000042f, -0.000094f, +0.000017f, +0.000103f, +0.000019f, +0.000133f, +0.000029f, +0.000019f, +0.000014f, -0.000096f, + -0.000004f, -0.000065f, +0.000036f, +0.000058f, +0.000017f, -0.000017f + }, + { + -0.000014f, -0.007140f, -0.001277f, +0.000089f, +0.000980f, -0.000059f, +0.000468f, -0.000072f, -0.000573f, -0.000690f, + +0.000128f, +0.000470f, -0.003230f, -0.001664f, -0.004505f, -0.000054f, +0.002577f, -0.000171f, +0.001057f, +0.000802f, + +0.003660f, +0.000884f, +0.000736f, +0.001135f, +0.002498f, -0.000050f, -0.000835f, -0.001062f, +0.002006f, -0.000117f, + +0.001562f, -0.000331f, -0.000792f, +0.000786f, +0.000799f, +0.000615f, -0.000813f, +0.000001f, -0.000353f, +0.000271f, + +0.000597f, -0.000520f, +0.000408f, -0.000089f, +0.000243f, +0.000359f, -0.000347f, -0.000254f, -0.000162f, +0.000081f, + -0.000211f, -0.000203f, +0.000340f, +0.000004f, -0.000178f, -0.000029f, +0.000342f, -0.000149f, +0.000020f, +0.000097f, + +0.000126f, -0.000329f, +0.000022f, +0.000133f, +0.000157f, +0.000032f, +0.000055f, +0.000043f, -0.000065f, -0.000018f, + -0.000067f, +0.000084f, +0.000026f, -0.000124f, -0.000138f, -0.000104f, -0.000001f, +0.000024f, -0.000008f, +0.000023f, + +0.000081f, +0.000019f, +0.000016f, +0.000075f, -0.000002f, +0.000030f, -0.000092f, +0.000050f, +0.000032f, -0.000044f, + +0.000018f, -0.000084f, -0.000045f, +0.000063f, -0.000056f, -0.000020f + }, + { + -0.002022f, -0.013450f, -0.002255f, -0.007557f, +0.000849f, +0.002127f, -0.000441f, -0.000208f, -0.000901f, +0.000476f, + -0.000055f, +0.001554f, -0.000556f, +0.001477f, +0.005296f, +0.000492f, -0.002273f, -0.000368f, -0.000698f, -0.000354f, + +0.000042f, -0.000618f, +0.000816f, +0.000858f, +0.000934f, +0.001241f, +0.000140f, +0.000540f, -0.000378f, +0.000448f, + -0.000691f, +0.000550f, -0.000449f, -0.000408f, -0.000962f, -0.000263f, +0.000491f, -0.000198f, +0.000106f, -0.000443f, + +0.000792f, +0.000131f, +0.000272f, +0.000176f, +0.000268f, +0.000328f, +0.000025f, -0.000631f, +0.000341f, +0.000176f, + +0.000047f, +0.000166f, -0.000010f, +0.000221f, +0.000051f, +0.000074f, -0.000251f, -0.000367f, +0.000191f, +0.000062f, + -0.000250f, +0.000051f, -0.000144f, +0.000022f, -0.000140f, -0.000001f, -0.000289f, -0.000128f, -0.000060f, +0.000039f, + -0.000090f, +0.000074f, -0.000066f, -0.000044f, -0.000012f, -0.000040f, -0.000174f, +0.000070f, +0.000077f, +0.000002f, + -0.000017f, +0.000033f, +0.000150f, -0.000004f, -0.000019f, +0.000120f, -0.000049f, -0.000061f, +0.000034f, -0.000002f, + -0.000027f, +0.000091f, -0.000014f, +0.000003f, -0.000020f, +0.000029f + }, + { + -0.000655f, -0.000848f, +0.002192f, +0.000043f, -0.000529f, -0.000164f, +0.000187f, -0.001634f, -0.001212f, -0.000784f, + +0.000274f, +0.001277f, +0.000666f, +0.006730f, -0.000860f, +0.001389f, +0.000904f, -0.002206f, +0.000893f, -0.001763f, + -0.000776f, -0.000747f, -0.000082f, -0.003583f, -0.000928f, +0.000128f, +0.001449f, +0.000868f, -0.000764f, +0.000978f, + +0.001363f, +0.000593f, -0.000421f, +0.000086f, +0.000537f, -0.001455f, +0.000393f, +0.000690f, -0.000590f, +0.000465f, + +0.000117f, +0.000403f, +0.000433f, -0.000401f, -0.000210f, +0.000084f, -0.000101f, +0.000035f, -0.000158f, -0.000223f, + +0.000076f, +0.000198f, -0.000049f, -0.000118f, +0.000292f, +0.000087f, +0.000119f, +0.000051f, +0.000118f, +0.000141f, + +0.000112f, +0.000155f, -0.000382f, -0.000085f, +0.000061f, +0.000147f, +0.000119f, -0.000149f, +0.000140f, +0.000082f, + +0.000214f, -0.000087f, +0.000002f, +0.000110f, -0.000112f, +0.000119f, -0.000101f, -0.000204f, -0.000001f, +0.000009f, + +0.000067f, +0.000015f, +0.000111f, -0.000166f, +0.000003f, +0.000000f, -0.000013f, +0.000075f, +0.000027f, -0.000050f, + +0.000030f, +0.000010f, -0.000016f, -0.000016f, +0.000013f, +0.000015f + } + }, + { + { + -0.004707f, +0.058937f, +0.022511f, +0.000669f, -0.000764f, -0.000110f, +0.000627f, -0.000254f, -0.000865f, -0.000053f, + -0.000523f, -0.000227f, +0.000719f, +0.000867f, +0.000874f, -0.000867f, -0.000538f, +0.000072f, +0.000420f, -0.001897f, + -0.000173f, +0.000090f, +0.000611f, +0.000111f, +0.000321f, +0.000518f, -0.000259f, +0.000946f, +0.000564f, +0.000220f, + -0.000670f, -0.000139f, -0.000937f, +0.000306f, -0.000438f, +0.000743f, -0.000684f, +0.000386f, -0.001135f, -0.000009f, + -0.000124f, -0.000051f, +0.000179f, -0.000205f, +0.000051f, -0.000048f, -0.000057f, +0.000006f, +0.000330f, +0.000002f, + -0.000012f, -0.000092f, -0.000030f, +0.000130f, +0.000080f, +0.000057f, -0.000041f, +0.000207f, +0.000034f, +0.000098f, + +0.000013f, +0.000091f, +0.000095f, +0.000151f, +0.000004f, +0.000198f, +0.000101f, -0.000224f, +0.000047f, +0.000002f, + +0.000014f, +0.000102f, -0.000024f, -0.000081f, +0.000022f, +0.000189f, +0.000011f, -0.000181f, +0.000104f, -0.000062f, + -0.000054f, -0.000094f, -0.000022f, -0.000002f, -0.000008f, +0.000104f, -0.000115f, +0.000023f, +0.000002f, -0.000054f, + -0.000037f, -0.000006f, -0.000027f, +0.000028f, +0.000022f, +0.000018f + }, + { + +0.000175f, -0.007841f, +0.004510f, +0.000042f, -0.001267f, -0.000848f, +0.000881f, -0.000519f, -0.000652f, -0.000622f, + -0.001328f, -0.000048f, -0.000881f, -0.000216f, -0.000902f, -0.002376f, +0.002738f, -0.000972f, -0.001564f, +0.000335f, + -0.000591f, -0.000890f, +0.000358f, +0.000810f, +0.000854f, +0.000305f, +0.000188f, +0.000685f, +0.000160f, +0.000857f, + +0.001259f, -0.000324f, -0.000293f, -0.001119f, +0.000486f, -0.000687f, +0.000431f, -0.000027f, +0.000436f, -0.000096f, + +0.000507f, +0.000013f, +0.000410f, -0.000272f, +0.000250f, +0.000028f, +0.000036f, -0.000133f, -0.000121f, +0.000106f, + -0.000014f, +0.000209f, -0.000353f, -0.000084f, -0.000105f, +0.000256f, +0.000115f, +0.000000f, +0.000073f, +0.000059f, + -0.000065f, -0.000058f, -0.000094f, +0.000175f, -0.000133f, -0.000020f, +0.000089f, -0.000202f, +0.000033f, -0.000088f, + +0.000019f, -0.000039f, +0.000067f, +0.000084f, +0.000029f, -0.000151f, +0.000020f, +0.000048f, +0.000065f, -0.000013f, + -0.000038f, +0.000074f, +0.000065f, -0.000037f, +0.000025f, -0.000021f, -0.000070f, +0.000023f, +0.000046f, -0.000123f, + +0.000047f, +0.000039f, -0.000015f, -0.000056f, -0.000059f, -0.000013f + }, + { + -0.004174f, +0.040176f, -0.000935f, +0.003513f, -0.000235f, +0.000460f, +0.000317f, -0.000354f, +0.000387f, +0.000137f, + -0.000082f, -0.000748f, -0.000206f, -0.000484f, -0.000180f, -0.000469f, -0.001413f, -0.000497f, -0.000407f, -0.000008f, + +0.000173f, -0.000033f, -0.001120f, +0.000680f, -0.000483f, -0.000600f, -0.000280f, -0.000013f, +0.000105f, -0.000301f, + +0.000927f, +0.001023f, -0.000331f, -0.000588f, -0.000155f, +0.000666f, +0.000540f, -0.000335f, -0.000009f, +0.000227f, + +0.000298f, -0.000106f, +0.000267f, +0.000039f, -0.000184f, -0.000196f, -0.000473f, +0.000024f, -0.000255f, +0.000175f, + +0.000120f, -0.000284f, -0.000299f, +0.000105f, -0.000269f, -0.000066f, +0.000023f, -0.000097f, +0.000018f, +0.000127f, + +0.000018f, -0.000202f, -0.000271f, +0.000138f, +0.000135f, -0.000108f, -0.000092f, -0.000133f, -0.000008f, -0.000051f, + +0.000061f, +0.000091f, -0.000135f, +0.000007f, +0.000031f, -0.000041f, +0.000074f, +0.000085f, -0.000087f, +0.000021f, + +0.000117f, -0.000018f, -0.000058f, +0.000122f, +0.000056f, -0.000069f, -0.000029f, -0.000058f, +0.000044f, -0.000003f, + -0.000039f, +0.000031f, +0.000034f, -0.000017f, +0.000026f, +0.000021f + }, + { + -0.003704f, -0.009407f, -0.006874f, -0.000463f, +0.000710f, +0.000011f, -0.000096f, -0.000023f, -0.000225f, -0.000405f, + +0.000804f, +0.000366f, -0.000761f, -0.001341f, +0.001635f, +0.000684f, -0.000155f, -0.001145f, -0.000077f, -0.000060f, + -0.000058f, +0.000217f, -0.000441f, +0.000316f, -0.000309f, +0.000270f, +0.000561f, +0.000410f, +0.000026f, -0.000514f, + -0.000733f, +0.000583f, +0.000357f, -0.000187f, +0.000945f, -0.001002f, +0.000279f, -0.000492f, -0.000099f, -0.000136f, + -0.000066f, +0.000186f, +0.000128f, -0.000033f, +0.000274f, +0.000102f, -0.000076f, +0.000160f, -0.000031f, +0.000570f, + -0.000331f, -0.000128f, +0.000169f, -0.000300f, -0.000186f, +0.000076f, +0.000014f, +0.000141f, -0.000422f, +0.000138f, + +0.000042f, +0.000137f, -0.000179f, +0.000176f, -0.000169f, -0.000053f, +0.000074f, -0.000189f, +0.000081f, +0.000005f, + -0.000027f, -0.000001f, +0.000121f, +0.000054f, +0.000096f, +0.000087f, -0.000042f, -0.000050f, +0.000032f, +0.000040f, + -0.000115f, -0.000060f, -0.000109f, +0.000055f, +0.000018f, -0.000003f, +0.000009f, -0.000072f, +0.000089f, +0.000034f, + -0.000011f, -0.000025f, -0.000004f, +0.000009f, -0.000040f, -0.000008f + }, + { + +0.000721f, +0.003737f, -0.000268f, +0.000557f, -0.000364f, +0.000020f, +0.000495f, +0.000498f, -0.000364f, -0.000289f, + +0.000004f, +0.000099f, -0.000326f, +0.000106f, -0.008274f, +0.000707f, -0.000319f, +0.001167f, -0.006965f, -0.000807f, + +0.000265f, +0.001910f, -0.000130f, -0.001585f, -0.001092f, -0.001420f, +0.002151f, -0.001024f, -0.000329f, +0.000541f, + -0.000635f, -0.000529f, -0.000421f, +0.000594f, -0.000704f, -0.000899f, -0.000721f, +0.000227f, +0.000615f, -0.000329f, + -0.000219f, -0.000158f, +0.000200f, +0.000060f, +0.000125f, +0.000060f, -0.000014f, -0.000096f, +0.000045f, -0.000458f, + -0.000263f, +0.000066f, +0.000084f, +0.000117f, -0.000098f, +0.000292f, -0.000097f, -0.000049f, +0.000075f, +0.000005f, + +0.000176f, +0.000040f, -0.000019f, +0.000008f, -0.000082f, -0.000086f, -0.000012f, +0.000106f, +0.000130f, -0.000132f, + -0.000053f, +0.000154f, -0.000013f, -0.000022f, +0.000033f, +0.000005f, -0.000040f, -0.000014f, -0.000030f, -0.000127f, + -0.000019f, -0.000078f, +0.000077f, +0.000091f, -0.000043f, +0.000042f, -0.000034f, -0.000007f, +0.000030f, -0.000041f, + -0.000030f, -0.000013f, -0.000042f, +0.000025f, +0.000040f, -0.000020f + }, + { + -0.003327f, -0.005603f, -0.007827f, +0.001445f, -0.000128f, -0.000097f, +0.000582f, -0.000464f, -0.000001f, +0.000601f, + -0.000960f, -0.000252f, +0.000377f, -0.000871f, +0.000557f, -0.000606f, -0.000193f, -0.001055f, -0.000748f, +0.000379f, + +0.000265f, -0.000870f, -0.000964f, +0.000469f, +0.000043f, +0.000100f, -0.000637f, +0.000302f, +0.000712f, +0.000079f, + -0.001167f, +0.000058f, +0.000200f, +0.000249f, +0.000314f, -0.000208f, -0.001007f, +0.000611f, +0.000202f, +0.000380f, + -0.000004f, +0.000136f, +0.000291f, -0.000435f, -0.000091f, +0.000520f, +0.000355f, +0.000744f, +0.000344f, -0.000041f, + -0.000124f, +0.000291f, +0.000038f, +0.000075f, +0.000019f, +0.000245f, -0.000162f, -0.000165f, -0.000163f, +0.000127f, + +0.000134f, -0.000035f, -0.000085f, -0.000154f, +0.000044f, +0.000024f, +0.000007f, +0.000020f, +0.000128f, +0.000087f, + +0.000029f, -0.000031f, -0.000103f, +0.000106f, -0.000002f, +0.000083f, -0.000073f, -0.000038f, -0.000049f, +0.000012f, + -0.000005f, -0.000009f, +0.000059f, +0.000160f, -0.000025f, -0.000013f, -0.000020f, +0.000006f, -0.000109f, +0.000113f, + -0.000001f, -0.000039f, -0.000032f, -0.000025f, +0.000088f, -0.000003f + }, + { + +0.000740f, -0.002593f, -0.001796f, +0.000324f, +0.000153f, +0.000047f, -0.000171f, +0.000295f, -0.000193f, -0.000055f, + +0.000212f, -0.000489f, -0.000817f, -0.002399f, -0.001053f, +0.001626f, +0.005019f, +0.000430f, -0.001328f, +0.000448f, + +0.000466f, +0.000087f, -0.003075f, -0.001164f, -0.000978f, +0.000123f, +0.001185f, -0.001889f, -0.000479f, -0.000147f, + -0.000014f, -0.000797f, +0.000303f, +0.000601f, -0.001347f, -0.000015f, -0.000264f, -0.000475f, +0.000260f, +0.000677f, + -0.000267f, -0.000355f, +0.000690f, -0.000231f, -0.000365f, -0.000045f, -0.000366f, -0.000178f, +0.000217f, +0.000062f, + +0.000099f, +0.000042f, -0.000110f, -0.000122f, -0.000036f, -0.000066f, -0.000131f, -0.000060f, -0.000144f, -0.000020f, + +0.000050f, +0.000031f, +0.000152f, -0.000090f, -0.000051f, +0.000201f, +0.000045f, -0.000048f, -0.000175f, +0.000015f, + +0.000057f, +0.000046f, -0.000093f, -0.000047f, -0.000046f, -0.000068f, +0.000073f, -0.000071f, -0.000075f, -0.000010f, + +0.000101f, -0.000042f, +0.000007f, +0.000025f, +0.000020f, +0.000006f, -0.000031f, +0.000041f, +0.000006f, -0.000023f, + +0.000072f, +0.000068f, +0.000068f, -0.000075f, +0.000041f, +0.000028f + }, + { + -0.001037f, +0.058817f, +0.003137f, -0.001640f, -0.000767f, -0.000215f, -0.000389f, -0.000010f, +0.000088f, +0.000629f, + -0.000408f, -0.000629f, +0.001288f, +0.000973f, -0.001299f, +0.000374f, +0.001175f, +0.000447f, +0.000818f, -0.000054f, + -0.000226f, +0.000473f, -0.000564f, -0.000582f, -0.000088f, +0.000135f, +0.000355f, -0.000500f, -0.000541f, -0.000248f, + +0.000013f, +0.000086f, +0.000676f, -0.000377f, +0.000675f, +0.000176f, -0.000372f, +0.000488f, -0.000650f, +0.000125f, + -0.000194f, -0.000160f, -0.000218f, +0.000693f, -0.000087f, +0.000160f, -0.000527f, +0.000090f, +0.000064f, -0.000311f, + -0.000621f, -0.000214f, -0.000023f, +0.000083f, -0.000012f, -0.000016f, -0.000023f, -0.000215f, -0.000182f, +0.000130f, + +0.000196f, +0.000088f, -0.000078f, +0.000077f, -0.000065f, +0.000076f, -0.000139f, +0.000056f, -0.000002f, +0.000028f, + +0.000052f, -0.000087f, +0.000063f, -0.000074f, -0.000194f, +0.000048f, +0.000111f, -0.000253f, -0.000093f, +0.000091f, + -0.000100f, -0.000033f, +0.000010f, -0.000041f, +0.000002f, +0.000018f, -0.000013f, +0.000018f, +0.000011f, -0.000014f, + -0.000047f, +0.000043f, +0.000021f, -0.000034f, -0.000042f, -0.000013f + }, + { + +0.000953f, -0.000575f, -0.004693f, +0.000408f, -0.000717f, +0.000129f, +0.000162f, +0.000981f, -0.000192f, -0.000125f, + +0.000099f, +0.000120f, +0.000329f, +0.002134f, +0.000708f, -0.001871f, +0.003676f, -0.000643f, +0.001230f, -0.001640f, + -0.001989f, +0.001839f, -0.000735f, +0.000176f, -0.001277f, -0.000765f, +0.000899f, -0.002506f, +0.000282f, -0.000682f, + -0.000382f, +0.000573f, -0.000824f, -0.000320f, +0.000241f, -0.001155f, -0.000605f, +0.000454f, -0.000110f, +0.000665f, + -0.000436f, -0.000236f, -0.000061f, -0.000096f, -0.000413f, -0.000463f, -0.000090f, -0.000002f, -0.000018f, -0.000265f, + -0.000083f, -0.000104f, +0.000166f, +0.000039f, -0.000071f, -0.000044f, +0.000240f, -0.000136f, -0.000220f, -0.000267f, + -0.000046f, -0.000049f, -0.000006f, +0.000087f, +0.000026f, +0.000068f, +0.000302f, -0.000001f, +0.000026f, -0.000190f, + -0.000019f, -0.000019f, +0.000087f, +0.000165f, -0.000027f, -0.000086f, +0.000080f, +0.000000f, -0.000017f, +0.000045f, + -0.000079f, -0.000001f, +0.000063f, +0.000042f, -0.000001f, +0.000061f, -0.000038f, -0.000135f, -0.000006f, +0.000021f, + -0.000035f, -0.000066f, +0.000036f, +0.000018f, -0.000018f, -0.000002f + }, + { + +0.004197f, +0.029251f, +0.009512f, -0.001307f, +0.001805f, +0.000137f, +0.001139f, +0.000699f, -0.000134f, -0.000427f, + -0.000536f, +0.000233f, -0.000857f, -0.000056f, +0.001656f, -0.000158f, +0.001234f, +0.000380f, -0.001879f, +0.000230f, + +0.000799f, -0.000384f, +0.000014f, +0.000690f, +0.000350f, -0.000133f, -0.000322f, -0.000600f, -0.000155f, +0.000272f, + -0.000057f, -0.000233f, +0.000477f, -0.000492f, -0.000352f, +0.000256f, -0.000479f, -0.000101f, -0.000187f, -0.000071f, + -0.000478f, -0.000111f, -0.000039f, +0.000276f, +0.000416f, -0.000368f, -0.000493f, +0.000023f, +0.000051f, -0.000197f, + -0.000204f, +0.000199f, -0.000060f, -0.000298f, +0.000294f, +0.000407f, -0.000001f, -0.000294f, +0.000066f, +0.000055f, + +0.000224f, +0.000186f, -0.000009f, +0.000048f, +0.000013f, +0.000068f, -0.000037f, -0.000037f, +0.000060f, -0.000144f, + -0.000055f, -0.000048f, +0.000045f, -0.000032f, +0.000041f, -0.000023f, -0.000001f, -0.000089f, +0.000123f, -0.000113f, + +0.000033f, +0.000114f, +0.000012f, -0.000035f, +0.000023f, +0.000002f, -0.000077f, -0.000003f, -0.000018f, -0.000086f, + +0.000000f, -0.000055f, +0.000063f, -0.000007f, +0.000024f, -0.000056f + }, + { + -0.000496f, +0.008855f, +0.001152f, -0.001237f, -0.000204f, -0.000110f, -0.000701f, +0.001240f, -0.000223f, -0.000635f, + -0.001561f, -0.000526f, +0.000062f, -0.001353f, +0.000661f, -0.001457f, -0.002901f, +0.002521f, -0.002721f, -0.001698f, + +0.000409f, -0.000366f, +0.001020f, -0.000132f, +0.000363f, +0.000755f, -0.000716f, -0.000320f, -0.000066f, +0.000452f, + +0.000067f, +0.000149f, +0.000211f, -0.000119f, +0.000119f, -0.000155f, -0.000262f, +0.000610f, -0.000170f, +0.000417f, + -0.000057f, +0.000437f, +0.000188f, -0.000002f, -0.000050f, +0.000198f, -0.000022f, +0.000031f, +0.000059f, -0.000319f, + +0.000070f, +0.000047f, +0.000015f, -0.000178f, +0.000256f, +0.000078f, +0.000169f, -0.000057f, -0.000065f, +0.000115f, + -0.000072f, -0.000302f, +0.000023f, +0.000142f, +0.000048f, -0.000127f, +0.000058f, +0.000007f, -0.000069f, -0.000060f, + +0.000031f, -0.000007f, -0.000022f, +0.000023f, -0.000051f, -0.000002f, -0.000040f, +0.000090f, +0.000147f, -0.000079f, + +0.000008f, +0.000100f, -0.000090f, -0.000031f, +0.000083f, +0.000066f, +0.000029f, +0.000076f, -0.000056f, +0.000084f, + +0.000002f, +0.000012f, +0.000034f, +0.000008f, -0.000003f, -0.000078f + }, + { + +0.001465f, -0.014193f, +0.000742f, +0.000715f, -0.000039f, -0.000133f, +0.000975f, -0.000605f, +0.000250f, +0.000389f, + -0.000424f, +0.001184f, -0.000152f, -0.000342f, -0.000972f, +0.000041f, -0.000577f, -0.000368f, +0.000237f, -0.000286f, + +0.000946f, -0.000679f, +0.000633f, -0.000590f, +0.000515f, -0.000383f, +0.000037f, -0.000850f, +0.000702f, -0.000690f, + -0.000249f, -0.000358f, +0.000197f, -0.000155f, -0.000968f, +0.000046f, +0.000062f, +0.000052f, +0.000298f, -0.000192f, + +0.000192f, +0.000083f, +0.000322f, -0.000188f, -0.000260f, -0.000230f, +0.000323f, +0.000045f, +0.000306f, +0.000187f, + -0.000202f, -0.000416f, +0.000200f, -0.000084f, +0.000122f, -0.000063f, -0.000139f, +0.000054f, -0.000127f, +0.000142f, + +0.000058f, -0.000016f, +0.000078f, -0.000024f, -0.000148f, -0.000035f, +0.000021f, -0.000126f, +0.000204f, +0.000029f, + -0.000069f, +0.000066f, +0.000010f, +0.000012f, -0.000030f, -0.000067f, -0.000015f, +0.000006f, +0.000058f, +0.000040f, + -0.000025f, -0.000017f, -0.000098f, +0.000000f, +0.000000f, -0.000087f, +0.000087f, -0.000004f, +0.000017f, +0.000028f, + -0.000035f, -0.000003f, -0.000062f, -0.000041f, +0.000047f, -0.000021f + }, + { + -0.000167f, -0.003570f, +0.001010f, -0.000461f, -0.000397f, +0.000199f, -0.000607f, +0.000060f, -0.000587f, -0.000622f, + -0.000005f, -0.001225f, +0.003481f, +0.009182f, -0.000596f, -0.002417f, +0.001316f, -0.000443f, -0.000403f, +0.000190f, + -0.000874f, +0.002345f, -0.000153f, -0.002049f, +0.000319f, +0.000299f, +0.001022f, +0.000679f, +0.001407f, -0.000402f, + -0.001543f, +0.000043f, -0.000306f, +0.000490f, +0.000110f, +0.000112f, +0.000434f, -0.000315f, +0.000253f, -0.000499f, + +0.000161f, -0.000286f, +0.000592f, -0.000423f, +0.000506f, +0.000512f, +0.000142f, -0.000086f, -0.000177f, +0.000132f, + -0.000218f, -0.000118f, -0.000209f, +0.000032f, -0.000062f, -0.000233f, -0.000324f, +0.000017f, -0.000082f, -0.000105f, + +0.000290f, +0.000220f, -0.000095f, -0.000114f, -0.000087f, +0.000346f, -0.000096f, -0.000024f, +0.000074f, -0.000088f, + -0.000027f, +0.000057f, +0.000107f, -0.000034f, -0.000002f, -0.000057f, -0.000116f, -0.000057f, +0.000066f, -0.000002f, + -0.000075f, +0.000064f, +0.000105f, +0.000026f, +0.000027f, +0.000026f, +0.000063f, -0.000079f, +0.000005f, -0.000006f, + +0.000064f, +0.000107f, -0.000097f, -0.000100f, +0.000074f, -0.000030f + }, + { + +0.002737f, -0.003649f, +0.003181f, -0.001882f, +0.001220f, +0.001662f, -0.000176f, +0.000082f, +0.000417f, -0.000551f, + -0.000922f, +0.000321f, +0.000175f, +0.000113f, +0.001001f, -0.000947f, +0.000498f, +0.000030f, -0.000314f, -0.000651f, + +0.000552f, +0.000578f, -0.000577f, +0.000708f, -0.001005f, +0.000370f, +0.000225f, +0.000649f, -0.000031f, -0.000575f, + +0.000369f, +0.000614f, -0.000430f, -0.000034f, +0.000117f, -0.000349f, -0.000080f, -0.000107f, +0.000293f, +0.000411f, + -0.000127f, -0.000319f, -0.000193f, -0.000263f, +0.000013f, +0.000167f, +0.000219f, -0.000121f, +0.000330f, +0.000286f, + -0.000527f, +0.000182f, -0.000309f, -0.000318f, -0.000229f, +0.000134f, +0.000275f, +0.000077f, +0.000106f, +0.000021f, + -0.000217f, +0.000170f, -0.000030f, +0.000078f, +0.000127f, -0.000001f, +0.000158f, -0.000037f, -0.000090f, -0.000019f, + +0.000068f, +0.000000f, +0.000022f, -0.000156f, -0.000018f, +0.000019f, +0.000041f, -0.000062f, -0.000023f, +0.000074f, + +0.000028f, -0.000071f, +0.000021f, +0.000058f, +0.000020f, +0.000027f, +0.000138f, -0.000062f, -0.000080f, +0.000015f, + +0.000003f, -0.000037f, +0.000029f, +0.000004f, +0.000033f, -0.000036f + }, + { + +0.000357f, -0.002055f, +0.001412f, +0.000539f, -0.000177f, -0.000124f, +0.000014f, -0.000186f, -0.000838f, -0.000213f, + +0.000185f, -0.000558f, +0.000239f, +0.005144f, -0.009880f, +0.002062f, +0.003274f, -0.000044f, +0.001272f, +0.000436f, + +0.002802f, +0.001433f, -0.000349f, -0.000841f, +0.001228f, +0.000275f, +0.001224f, +0.000821f, -0.001555f, +0.001320f, + +0.000970f, -0.000273f, -0.000091f, -0.000063f, +0.000367f, -0.000437f, +0.000195f, -0.000415f, +0.000139f, +0.001076f, + +0.000140f, -0.000574f, -0.000247f, -0.000293f, +0.000659f, +0.000020f, -0.000081f, +0.000182f, -0.000044f, -0.000211f, + +0.000124f, +0.000132f, -0.000215f, -0.000384f, +0.000010f, +0.000039f, +0.000086f, -0.000178f, +0.000279f, +0.000012f, + -0.000493f, -0.000072f, -0.000090f, +0.000061f, -0.000096f, +0.000006f, -0.000109f, +0.000272f, -0.000132f, -0.000032f, + +0.000119f, +0.000082f, -0.000155f, +0.000017f, -0.000007f, -0.000088f, +0.000111f, -0.000020f, -0.000024f, -0.000034f, + +0.000008f, +0.000073f, +0.000077f, +0.000115f, -0.000071f, -0.000003f, -0.000015f, -0.000030f, -0.000003f, +0.000057f, + +0.000029f, -0.000045f, +0.000061f, -0.000004f, -0.000028f, +0.000036f + } + }, + { + { + +0.007374f, +0.086748f, +0.000977f, +0.001042f, -0.001523f, +0.000011f, +0.000223f, -0.001085f, -0.000142f, +0.000474f, + -0.000186f, -0.000027f, +0.000691f, +0.001356f, -0.001532f, -0.000216f, -0.000568f, -0.000295f, +0.000056f, -0.000386f, + +0.000402f, -0.000840f, +0.000202f, +0.000053f, +0.000346f, +0.000182f, +0.000130f, +0.000236f, +0.001021f, +0.000581f, + +0.000296f, -0.000648f, -0.000562f, -0.000073f, +0.000292f, +0.000094f, +0.000151f, +0.000225f, -0.000583f, -0.000496f, + -0.000134f, -0.000087f, -0.000014f, +0.000164f, +0.000403f, -0.000073f, -0.000377f, +0.000155f, +0.000046f, +0.000228f, + +0.000140f, -0.000101f, +0.000040f, +0.000085f, -0.000196f, +0.000026f, +0.000105f, -0.000077f, -0.000119f, +0.000299f, + -0.000092f, -0.000024f, -0.000021f, +0.000210f, +0.000073f, +0.000134f, +0.000127f, -0.000139f, +0.000008f, -0.000069f, + +0.000105f, +0.000070f, +0.000037f, -0.000077f, -0.000068f, +0.000030f, +0.000089f, -0.000118f, +0.000089f, +0.000043f, + +0.000043f, -0.000022f, -0.000045f, +0.000033f, -0.000052f, +0.000095f, +0.000007f, +0.000006f, +0.000031f, +0.000010f, + -0.000068f, +0.000021f, -0.000002f, -0.000002f, -0.000003f, +0.000012f + }, + { + +0.000758f, -0.002948f, +0.000053f, -0.001165f, -0.000427f, -0.000474f, +0.000052f, -0.000082f, -0.000308f, -0.000384f, + -0.001632f, -0.000501f, -0.001162f, -0.000449f, -0.001895f, -0.001092f, -0.000262f, +0.000568f, -0.002340f, -0.000226f, + -0.000415f, -0.000180f, +0.000194f, -0.000348f, +0.001871f, +0.000971f, +0.000559f, +0.000247f, -0.000179f, +0.000283f, + +0.000781f, +0.000244f, -0.000483f, -0.000898f, +0.000266f, -0.000260f, +0.000167f, +0.000127f, -0.000032f, +0.000078f, + +0.000280f, +0.000211f, +0.000577f, +0.000127f, +0.000161f, -0.000088f, +0.000043f, -0.000552f, +0.000179f, +0.000051f, + +0.000000f, +0.000297f, +0.000073f, -0.000057f, -0.000315f, +0.000112f, +0.000058f, +0.000115f, -0.000154f, +0.000050f, + +0.000078f, +0.000163f, -0.000107f, -0.000102f, +0.000026f, -0.000079f, +0.000164f, +0.000030f, -0.000123f, -0.000066f, + +0.000084f, -0.000171f, +0.000009f, +0.000046f, +0.000064f, -0.000163f, -0.000131f, -0.000018f, +0.000132f, +0.000072f, + -0.000057f, +0.000022f, +0.000064f, +0.000011f, +0.000024f, +0.000058f, -0.000010f, +0.000006f, +0.000108f, -0.000078f, + +0.000009f, +0.000027f, +0.000039f, -0.000004f, -0.000061f, -0.000025f + }, + { + +0.002253f, +0.024286f, +0.006361f, +0.005886f, -0.001223f, +0.000713f, +0.000992f, -0.000253f, -0.000712f, +0.000067f, + -0.000288f, +0.000110f, -0.001301f, +0.000416f, -0.000516f, -0.000571f, +0.000023f, -0.001670f, -0.000454f, -0.000275f, + -0.000431f, -0.000453f, -0.001077f, -0.000240f, +0.000745f, -0.000326f, -0.000087f, -0.000366f, +0.000259f, +0.000268f, + +0.000961f, -0.000269f, -0.000222f, -0.000020f, -0.000332f, +0.000953f, +0.000303f, +0.000104f, -0.000535f, -0.000193f, + +0.000189f, -0.000081f, +0.000239f, -0.000005f, +0.000030f, -0.000095f, -0.000243f, +0.000060f, -0.000052f, -0.000074f, + +0.000049f, -0.000058f, -0.000308f, +0.000276f, -0.000098f, -0.000190f, -0.000129f, -0.000026f, -0.000137f, +0.000119f, + +0.000084f, -0.000089f, -0.000037f, -0.000103f, +0.000093f, +0.000030f, -0.000041f, -0.000110f, +0.000040f, -0.000079f, + -0.000056f, +0.000113f, -0.000063f, +0.000064f, -0.000058f, -0.000186f, +0.000097f, +0.000182f, -0.000041f, -0.000066f, + +0.000016f, +0.000066f, -0.000021f, +0.000009f, +0.000039f, -0.000013f, -0.000022f, -0.000056f, +0.000035f, -0.000009f, + -0.000038f, -0.000036f, +0.000046f, +0.000014f, -0.000015f, +0.000027f + }, + { + +0.000493f, -0.029912f, +0.005601f, -0.000080f, +0.000405f, +0.000173f, +0.000240f, +0.000398f, -0.000355f, -0.000283f, + -0.000354f, +0.000132f, -0.000533f, +0.000570f, -0.001088f, +0.000625f, +0.000501f, -0.001488f, -0.000505f, +0.000248f, + -0.000245f, -0.000230f, +0.000504f, +0.000016f, -0.000475f, -0.000046f, +0.000976f, +0.000587f, -0.000072f, -0.000536f, + -0.000310f, +0.000612f, +0.000360f, +0.000015f, +0.000573f, -0.000716f, +0.000226f, -0.000390f, +0.000047f, -0.000160f, + -0.000437f, +0.000189f, +0.000116f, -0.000115f, -0.000060f, +0.000357f, +0.000363f, +0.000020f, -0.000033f, +0.000456f, + +0.000100f, -0.000447f, +0.000132f, -0.000342f, -0.000040f, +0.000049f, -0.000140f, -0.000021f, -0.000268f, +0.000013f, + +0.000137f, +0.000112f, -0.000043f, +0.000196f, -0.000023f, +0.000012f, +0.000055f, -0.000232f, -0.000002f, +0.000118f, + -0.000022f, -0.000161f, +0.000024f, +0.000087f, +0.000042f, +0.000016f, +0.000035f, +0.000018f, +0.000018f, +0.000098f, + -0.000027f, -0.000045f, -0.000052f, +0.000040f, -0.000005f, -0.000033f, +0.000053f, -0.000048f, +0.000004f, +0.000043f, + +0.000021f, -0.000023f, -0.000017f, +0.000024f, -0.000015f, -0.000010f + }, + { + -0.001132f, -0.000180f, +0.003575f, +0.000976f, -0.000378f, +0.000008f, +0.000587f, +0.000280f, +0.000016f, +0.000014f, + +0.000000f, -0.000176f, +0.000423f, +0.000077f, -0.007746f, -0.000986f, -0.000917f, +0.002430f, -0.000568f, -0.002531f, + +0.000446f, +0.001196f, -0.001039f, -0.000942f, -0.001163f, +0.000073f, -0.001281f, -0.000734f, +0.000072f, +0.000188f, + -0.000442f, +0.000078f, -0.000325f, +0.000186f, -0.000510f, +0.000223f, -0.000881f, -0.000305f, +0.000772f, +0.000343f, + -0.000443f, +0.000025f, +0.000561f, -0.000122f, -0.000109f, +0.000080f, -0.000019f, -0.000051f, -0.000100f, -0.000001f, + -0.000017f, -0.000561f, +0.000285f, -0.000059f, -0.000152f, +0.000160f, +0.000110f, +0.000035f, -0.000046f, +0.000106f, + +0.000216f, +0.000069f, -0.000078f, +0.000053f, +0.000054f, -0.000026f, +0.000047f, -0.000038f, +0.000118f, +0.000088f, + -0.000166f, -0.000002f, +0.000066f, -0.000032f, +0.000011f, +0.000033f, -0.000043f, +0.000053f, +0.000063f, -0.000017f, + +0.000011f, -0.000105f, +0.000008f, +0.000058f, -0.000036f, +0.000031f, -0.000040f, -0.000009f, +0.000011f, +0.000004f, + -0.000011f, -0.000006f, -0.000017f, -0.000029f, +0.000070f, +0.000017f + }, + { + +0.000061f, -0.026286f, +0.005291f, +0.000694f, -0.000865f, -0.000012f, +0.000840f, -0.000587f, -0.000361f, +0.001409f, + -0.000350f, -0.000578f, -0.000342f, -0.000547f, +0.000467f, -0.001259f, -0.000282f, -0.000558f, -0.000265f, +0.000049f, + +0.000814f, -0.000277f, -0.000901f, -0.000343f, +0.000279f, +0.000155f, -0.000009f, -0.000436f, +0.000501f, -0.000040f, + -0.000414f, -0.000320f, +0.000602f, +0.000372f, -0.000417f, -0.000095f, +0.000138f, -0.000012f, +0.000262f, +0.000634f, + +0.000837f, -0.000300f, -0.000224f, -0.000325f, +0.000136f, +0.000361f, +0.000252f, +0.000340f, +0.000390f, +0.000298f, + -0.000367f, +0.000011f, +0.000323f, +0.000345f, -0.000155f, +0.000139f, +0.000222f, -0.000122f, -0.000123f, +0.000089f, + -0.000051f, +0.000055f, -0.000010f, -0.000080f, -0.000048f, -0.000012f, +0.000052f, -0.000016f, +0.000142f, +0.000088f, + +0.000004f, +0.000002f, -0.000100f, +0.000035f, -0.000016f, +0.000103f, +0.000067f, -0.000029f, -0.000075f, -0.000060f, + -0.000011f, -0.000073f, -0.000036f, +0.000129f, +0.000045f, +0.000053f, +0.000001f, +0.000085f, -0.000097f, +0.000023f, + +0.000002f, -0.000016f, -0.000015f, -0.000018f, +0.000015f, +0.000022f + }, + { + +0.000113f, +0.000461f, -0.001642f, -0.000285f, +0.000046f, +0.000072f, -0.000514f, +0.000398f, +0.000154f, -0.000155f, + -0.000125f, -0.000610f, -0.000848f, -0.004511f, -0.001407f, +0.005164f, +0.001794f, +0.000338f, -0.000750f, +0.000055f, + -0.000179f, +0.001197f, -0.002237f, -0.003686f, -0.000772f, +0.000598f, -0.000315f, +0.000175f, -0.001086f, +0.000224f, + +0.000332f, -0.000249f, -0.000679f, +0.000565f, -0.000255f, -0.000333f, -0.000456f, -0.000065f, +0.000533f, +0.000735f, + -0.000347f, +0.000018f, +0.000353f, -0.000510f, -0.000008f, +0.000233f, -0.000186f, -0.000074f, -0.000040f, +0.000002f, + +0.000172f, -0.000026f, +0.000059f, -0.000113f, -0.000118f, -0.000076f, +0.000050f, -0.000241f, -0.000106f, -0.000135f, + +0.000137f, -0.000061f, +0.000055f, +0.000029f, -0.000075f, +0.000064f, +0.000184f, +0.000081f, -0.000211f, -0.000125f, + +0.000026f, +0.000116f, -0.000042f, -0.000011f, +0.000078f, +0.000034f, +0.000069f, +0.000040f, -0.000013f, -0.000062f, + +0.000072f, -0.000008f, +0.000067f, -0.000060f, +0.000035f, +0.000019f, -0.000053f, -0.000010f, -0.000049f, -0.000080f, + -0.000024f, +0.000018f, +0.000068f, -0.000034f, +0.000013f, +0.000051f + }, + { + +0.002241f, +0.059691f, -0.001893f, -0.002116f, -0.000124f, -0.000058f, -0.000931f, -0.000339f, +0.000765f, +0.000231f, + +0.000509f, -0.000824f, +0.000426f, +0.000106f, +0.000771f, +0.000423f, +0.001068f, -0.000439f, +0.000379f, +0.001116f, + -0.000538f, +0.000082f, +0.000052f, -0.000530f, -0.000295f, +0.000158f, +0.000442f, -0.000352f, -0.001306f, -0.000048f, + +0.000122f, -0.000348f, +0.001209f, -0.000526f, +0.000285f, +0.000958f, -0.000414f, +0.000209f, +0.000691f, -0.000588f, + +0.000110f, -0.000671f, +0.000294f, -0.000114f, +0.000059f, +0.000118f, -0.000432f, -0.000320f, +0.000034f, +0.000041f, + -0.000427f, -0.000530f, -0.000457f, +0.000026f, +0.000214f, +0.000142f, +0.000079f, -0.000159f, -0.000336f, -0.000003f, + +0.000098f, +0.000048f, +0.000063f, -0.000004f, -0.000089f, -0.000052f, -0.000098f, +0.000083f, -0.000038f, +0.000030f, + +0.000038f, -0.000084f, +0.000106f, +0.000037f, -0.000075f, -0.000111f, +0.000181f, -0.000063f, -0.000109f, +0.000057f, + -0.000078f, -0.000007f, -0.000057f, -0.000001f, -0.000032f, +0.000003f, +0.000090f, +0.000030f, +0.000001f, +0.000005f, + -0.000014f, +0.000040f, +0.000034f, +0.000013f, -0.000047f, -0.000041f + }, + { + +0.000078f, +0.002073f, -0.001965f, -0.000727f, -0.000338f, -0.000088f, +0.000222f, +0.000868f, +0.000547f, -0.000384f, + -0.000413f, +0.000160f, +0.000780f, +0.001861f, +0.002226f, -0.005390f, +0.002308f, -0.000280f, -0.000007f, -0.001035f, + -0.001112f, +0.000772f, +0.001469f, -0.001091f, +0.000041f, -0.001864f, -0.000306f, -0.001484f, +0.001136f, -0.001405f, + -0.000654f, -0.000001f, -0.000094f, +0.000159f, -0.000496f, -0.000621f, -0.000024f, +0.000154f, -0.000029f, -0.000058f, + +0.000826f, -0.000328f, -0.000155f, +0.000085f, -0.000198f, +0.000108f, -0.000067f, -0.000049f, -0.000187f, -0.000270f, + -0.000159f, +0.000172f, +0.000027f, +0.000053f, -0.000118f, +0.000018f, +0.000261f, -0.000072f, +0.000005f, -0.000196f, + -0.000077f, -0.000220f, -0.000023f, -0.000091f, -0.000035f, -0.000009f, +0.000076f, -0.000044f, +0.000037f, -0.000173f, + -0.000087f, -0.000158f, -0.000060f, +0.000239f, +0.000050f, -0.000082f, -0.000025f, +0.000104f, -0.000009f, +0.000039f, + -0.000020f, -0.000112f, +0.000017f, +0.000035f, +0.000040f, +0.000033f, +0.000095f, -0.000025f, -0.000065f, -0.000022f, + +0.000022f, -0.000062f, +0.000003f, +0.000040f, -0.000022f, +0.000028f + }, + { + -0.003123f, +0.035421f, +0.010608f, +0.002619f, +0.000438f, +0.002151f, +0.002221f, -0.000790f, +0.000604f, +0.000139f, + -0.000293f, +0.000077f, -0.000140f, -0.001078f, +0.000728f, +0.000347f, +0.001343f, +0.000252f, -0.001282f, -0.000242f, + +0.000957f, -0.000286f, +0.000429f, +0.000325f, +0.000690f, -0.000186f, -0.000414f, -0.000116f, -0.000321f, -0.000009f, + +0.000258f, +0.000480f, +0.000179f, +0.000351f, -0.000118f, -0.000498f, -0.000460f, +0.000126f, -0.000629f, +0.000030f, + -0.000172f, +0.000189f, -0.000400f, +0.000150f, +0.000297f, +0.000090f, -0.000501f, -0.000138f, +0.000054f, +0.000134f, + -0.000130f, +0.000272f, +0.000215f, -0.000192f, +0.000119f, +0.000266f, +0.000229f, -0.000350f, +0.000066f, -0.000177f, + +0.000225f, +0.000214f, +0.000010f, +0.000111f, -0.000068f, +0.000134f, -0.000034f, -0.000018f, +0.000047f, -0.000081f, + -0.000117f, +0.000021f, +0.000094f, -0.000020f, +0.000026f, -0.000053f, +0.000075f, -0.000084f, +0.000021f, -0.000069f, + -0.000056f, +0.000057f, +0.000066f, -0.000016f, +0.000106f, +0.000113f, -0.000006f, +0.000004f, +0.000017f, -0.000046f, + +0.000041f, -0.000112f, +0.000019f, +0.000024f, +0.000049f, -0.000018f + }, + { + +0.000280f, +0.006318f, +0.002729f, -0.001026f, -0.000421f, -0.000002f, +0.000407f, +0.000517f, +0.000301f, -0.000067f, + -0.000913f, -0.000221f, -0.000911f, -0.001912f, -0.000348f, -0.000541f, -0.001471f, -0.000603f, -0.000690f, -0.002688f, + -0.000547f, +0.000074f, +0.001499f, +0.000138f, +0.000846f, +0.000332f, -0.000411f, +0.000491f, -0.000584f, -0.000406f, + -0.000299f, +0.000038f, +0.000273f, -0.000219f, +0.000337f, -0.000312f, -0.000625f, +0.000247f, +0.000074f, +0.000449f, + -0.000026f, +0.000016f, +0.000599f, -0.000072f, +0.000041f, +0.000240f, +0.000012f, +0.000223f, +0.000054f, +0.000005f, + +0.000179f, -0.000005f, -0.000197f, -0.000254f, -0.000028f, +0.000281f, -0.000005f, +0.000062f, +0.000011f, +0.000014f, + +0.000067f, -0.000201f, -0.000062f, +0.000113f, +0.000113f, -0.000075f, -0.000002f, +0.000146f, -0.000089f, -0.000004f, + -0.000003f, -0.000068f, -0.000043f, +0.000027f, -0.000045f, -0.000042f, -0.000127f, -0.000002f, +0.000109f, -0.000032f, + -0.000004f, +0.000121f, -0.000036f, -0.000099f, +0.000004f, +0.000057f, -0.000016f, +0.000016f, -0.000076f, +0.000011f, + +0.000033f, +0.000021f, +0.000016f, -0.000013f, +0.000035f, -0.000057f + }, + { + -0.002891f, -0.009531f, -0.000132f, +0.000287f, +0.001198f, -0.002568f, +0.001297f, +0.000220f, -0.000274f, +0.001190f, + -0.001429f, +0.000375f, +0.000202f, -0.000735f, -0.000901f, -0.000688f, +0.000270f, -0.000683f, +0.000080f, +0.000167f, + +0.000316f, +0.000270f, +0.000037f, -0.000155f, +0.000459f, -0.000380f, +0.000206f, -0.000796f, +0.000341f, -0.000064f, + -0.000412f, -0.000369f, -0.000727f, +0.000318f, -0.000358f, -0.001018f, -0.000197f, -0.000370f, +0.000314f, -0.000018f, + +0.000083f, +0.000320f, +0.000206f, -0.000110f, -0.000285f, -0.000078f, -0.000070f, +0.000347f, +0.000037f, +0.000010f, + +0.000247f, -0.000172f, -0.000082f, +0.000004f, -0.000117f, -0.000029f, -0.000139f, +0.000011f, -0.000227f, +0.000178f, + +0.000096f, +0.000017f, -0.000038f, +0.000070f, -0.000153f, -0.000001f, -0.000041f, -0.000111f, +0.000056f, +0.000164f, + +0.000003f, +0.000019f, +0.000022f, +0.000019f, +0.000039f, -0.000021f, -0.000068f, -0.000029f, -0.000029f, -0.000004f, + -0.000001f, +0.000080f, -0.000029f, -0.000027f, +0.000010f, -0.000095f, +0.000053f, -0.000004f, +0.000029f, +0.000066f, + +0.000000f, +0.000053f, -0.000020f, -0.000037f, +0.000019f, -0.000002f + }, + { + +0.000300f, -0.001079f, -0.000801f, -0.001604f, +0.000349f, -0.000059f, -0.000505f, -0.000315f, -0.000739f, +0.000107f, + +0.000085f, -0.000414f, +0.001035f, +0.008852f, +0.001271f, -0.000799f, -0.000846f, -0.000211f, -0.001105f, +0.001515f, + -0.003036f, +0.000167f, +0.001835f, -0.001989f, +0.000359f, +0.000369f, +0.000444f, +0.001838f, +0.000341f, +0.000874f, + -0.001979f, -0.000584f, +0.000099f, +0.000219f, -0.000122f, -0.000560f, +0.000574f, +0.000204f, +0.000510f, -0.000307f, + -0.000469f, +0.000306f, +0.000330f, -0.000221f, +0.000605f, +0.000192f, +0.000332f, +0.000047f, +0.000102f, -0.000208f, + -0.000148f, +0.000079f, -0.000126f, +0.000051f, -0.000109f, -0.000024f, -0.000383f, -0.000003f, +0.000119f, -0.000254f, + -0.000007f, +0.000350f, +0.000067f, -0.000044f, -0.000226f, +0.000210f, -0.000024f, -0.000077f, +0.000107f, -0.000005f, + -0.000032f, -0.000008f, +0.000026f, +0.000034f, +0.000078f, +0.000029f, -0.000020f, -0.000004f, +0.000015f, -0.000015f, + -0.000087f, -0.000033f, +0.000057f, -0.000026f, +0.000023f, +0.000006f, +0.000074f, -0.000060f, -0.000015f, +0.000031f, + -0.000004f, +0.000119f, +0.000015f, -0.000087f, +0.000042f, +0.000051f + }, + { + -0.001516f, +0.004067f, -0.002951f, +0.002225f, -0.000185f, -0.002137f, +0.002533f, +0.001017f, +0.000854f, -0.000673f, + +0.001073f, -0.001131f, +0.000961f, -0.000092f, -0.001171f, -0.000749f, +0.000291f, -0.000554f, -0.000086f, -0.000920f, + +0.000261f, +0.001089f, -0.000446f, +0.000381f, -0.000653f, +0.000084f, +0.000203f, +0.000692f, +0.000346f, -0.000323f, + +0.000681f, -0.000419f, -0.000172f, -0.000320f, +0.000310f, -0.000319f, -0.000305f, +0.000148f, -0.000064f, +0.000317f, + -0.000307f, +0.000018f, +0.000008f, -0.000352f, -0.000300f, +0.000033f, -0.000222f, +0.000056f, +0.000152f, +0.000099f, + -0.000337f, -0.000100f, -0.000127f, -0.000173f, -0.000342f, +0.000060f, +0.000115f, +0.000231f, -0.000119f, +0.000005f, + +0.000026f, -0.000086f, +0.000121f, -0.000126f, +0.000111f, -0.000134f, +0.000146f, -0.000033f, -0.000005f, -0.000051f, + +0.000097f, -0.000004f, +0.000017f, -0.000060f, -0.000066f, -0.000049f, +0.000069f, -0.000058f, -0.000117f, +0.000000f, + +0.000014f, -0.000051f, -0.000094f, -0.000019f, +0.000038f, -0.000087f, +0.000117f, +0.000072f, -0.000048f, -0.000019f, + +0.000001f, -0.000090f, +0.000000f, -0.000009f, +0.000032f, -0.000004f + }, + { + -0.000601f, -0.001611f, +0.000185f, +0.000274f, +0.000495f, -0.000016f, -0.000615f, +0.001486f, -0.001774f, -0.000465f, + +0.000315f, -0.000492f, +0.000802f, -0.000810f, +0.002875f, +0.002765f, +0.000566f, +0.000443f, -0.000717f, +0.001720f, + +0.002230f, +0.001412f, -0.000530f, +0.001163f, +0.001484f, -0.000239f, -0.000336f, +0.000398f, +0.000898f, +0.000389f, + +0.000837f, +0.000102f, +0.000092f, -0.000313f, -0.000188f, +0.000082f, +0.000157f, -0.000591f, +0.000469f, +0.000611f, + +0.000616f, -0.000335f, +0.000182f, -0.000291f, +0.000211f, +0.000188f, +0.000039f, +0.000020f, +0.000065f, -0.000201f, + +0.000138f, +0.000074f, +0.000025f, -0.000294f, -0.000332f, -0.000009f, +0.000061f, +0.000096f, +0.000107f, +0.000441f, + -0.000217f, -0.000185f, +0.000021f, +0.000131f, -0.000007f, -0.000063f, -0.000221f, +0.000225f, -0.000017f, +0.000039f, + -0.000105f, +0.000169f, +0.000080f, +0.000013f, +0.000059f, -0.000082f, +0.000044f, +0.000133f, +0.000005f, -0.000011f, + -0.000076f, +0.000004f, -0.000078f, +0.000131f, -0.000022f, -0.000012f, +0.000011f, -0.000055f, -0.000023f, +0.000029f, + -0.000005f, -0.000059f, +0.000051f, +0.000037f, -0.000004f, +0.000009f + } + }, + { + { + -0.009381f, +0.072871f, +0.004295f, -0.002960f, +0.001696f, -0.000062f, -0.000938f, -0.000492f, +0.000186f, -0.000233f, + +0.000948f, +0.000963f, -0.000502f, +0.000338f, -0.002183f, +0.001348f, +0.000255f, -0.000207f, -0.000343f, +0.001662f, + +0.001458f, -0.000133f, -0.000376f, -0.000342f, +0.000171f, +0.000138f, -0.000624f, -0.000230f, +0.000105f, -0.000068f, + +0.000796f, -0.000366f, +0.000254f, +0.000103f, +0.000626f, -0.000592f, +0.000122f, +0.000221f, +0.000408f, +0.000435f, + +0.000312f, -0.000115f, -0.000057f, +0.000081f, +0.000122f, +0.000017f, -0.000121f, +0.000018f, -0.000012f, +0.000254f, + +0.000287f, -0.000089f, -0.000067f, +0.000025f, -0.000175f, +0.000123f, +0.000137f, -0.000169f, -0.000381f, +0.000012f, + +0.000093f, +0.000040f, -0.000073f, -0.000090f, -0.000011f, -0.000060f, -0.000037f, +0.000086f, +0.000050f, -0.000010f, + +0.000053f, -0.000060f, +0.000028f, +0.000103f, -0.000002f, -0.000177f, -0.000030f, +0.000050f, -0.000086f, +0.000087f, + +0.000020f, +0.000074f, +0.000022f, +0.000021f, +0.000033f, -0.000085f, +0.000110f, -0.000071f, +0.000001f, +0.000033f, + +0.000009f, -0.000016f, +0.000033f, -0.000017f, -0.000022f, -0.000015f + }, + { + -0.000829f, -0.003039f, +0.002879f, -0.002347f, +0.000339f, +0.000169f, +0.000412f, -0.000497f, +0.000531f, +0.000029f, + -0.000461f, -0.000113f, -0.000759f, +0.001194f, +0.001116f, +0.000167f, -0.001667f, +0.001480f, +0.000666f, -0.000071f, + -0.000074f, +0.000244f, -0.000581f, -0.001394f, +0.000469f, +0.000765f, +0.000079f, +0.000540f, -0.000092f, -0.001091f, + -0.000307f, -0.000396f, -0.000391f, -0.000240f, -0.000423f, +0.000244f, +0.000076f, -0.000003f, +0.000170f, +0.000292f, + -0.000132f, -0.000125f, +0.000320f, +0.000255f, -0.000329f, +0.000063f, +0.000058f, -0.000332f, +0.000206f, +0.000096f, + +0.000282f, +0.000036f, +0.000152f, +0.000129f, +0.000244f, -0.000294f, -0.000363f, +0.000074f, -0.000049f, -0.000101f, + +0.000038f, +0.000170f, +0.000017f, -0.000116f, +0.000027f, +0.000102f, -0.000081f, +0.000178f, -0.000022f, -0.000077f, + +0.000022f, +0.000003f, -0.000050f, -0.000154f, +0.000024f, +0.000094f, -0.000091f, -0.000102f, -0.000012f, +0.000071f, + +0.000099f, -0.000054f, -0.000069f, +0.000040f, -0.000036f, +0.000057f, +0.000047f, -0.000005f, -0.000010f, +0.000099f, + -0.000017f, -0.000060f, -0.000007f, +0.000064f, +0.000045f, +0.000004f + }, + { + -0.001149f, +0.019233f, +0.004840f, +0.004907f, +0.001955f, +0.000761f, +0.000588f, +0.000539f, +0.000169f, -0.000336f, + -0.000019f, +0.001206f, -0.000893f, -0.000409f, +0.000381f, -0.000265f, +0.000883f, -0.000725f, +0.001715f, -0.000227f, + +0.000290f, -0.000185f, -0.000526f, -0.000373f, +0.000395f, -0.000319f, +0.000559f, +0.000420f, +0.000443f, +0.000284f, + +0.000697f, -0.001710f, -0.000474f, +0.000223f, -0.000291f, -0.000246f, +0.000056f, +0.000052f, -0.000393f, -0.000239f, + -0.000119f, -0.000698f, -0.000354f, -0.000038f, -0.000359f, +0.000199f, -0.000195f, -0.000029f, +0.000033f, -0.000124f, + -0.000478f, +0.000005f, +0.000236f, +0.000250f, +0.000079f, +0.000142f, -0.000056f, +0.000123f, -0.000127f, +0.000064f, + -0.000144f, +0.000123f, +0.000163f, +0.000137f, -0.000174f, +0.000027f, +0.000089f, -0.000007f, -0.000067f, +0.000052f, + -0.000001f, -0.000111f, -0.000066f, +0.000151f, -0.000031f, -0.000062f, -0.000060f, -0.000023f, +0.000066f, -0.000046f, + -0.000035f, +0.000008f, +0.000075f, -0.000040f, -0.000116f, +0.000054f, +0.000051f, +0.000047f, -0.000050f, -0.000005f, + +0.000033f, -0.000033f, -0.000011f, +0.000005f, -0.000039f, -0.000038f + }, + { + +0.005783f, -0.026549f, +0.001782f, -0.002483f, -0.000526f, +0.000215f, +0.000361f, +0.000149f, -0.000102f, +0.000570f, + -0.000338f, -0.000455f, -0.000650f, +0.001013f, -0.000394f, +0.000099f, +0.000486f, -0.000338f, +0.000044f, -0.000084f, + -0.000307f, -0.000503f, +0.000765f, +0.000259f, -0.000152f, +0.000069f, -0.000407f, +0.000943f, -0.000628f, -0.000212f, + +0.000286f, +0.000338f, +0.000116f, +0.000198f, +0.000066f, -0.000131f, +0.000306f, -0.000020f, -0.000209f, -0.000018f, + -0.000062f, -0.000037f, -0.000209f, +0.000162f, -0.000449f, -0.000268f, +0.000439f, -0.000096f, +0.000051f, -0.000026f, + +0.000178f, +0.000056f, -0.000125f, -0.000023f, -0.000025f, +0.000021f, -0.000064f, +0.000025f, +0.000178f, -0.000092f, + -0.000103f, +0.000069f, +0.000097f, -0.000078f, +0.000117f, +0.000097f, -0.000005f, +0.000125f, -0.000123f, +0.000104f, + +0.000131f, +0.000043f, -0.000205f, -0.000036f, -0.000012f, -0.000090f, +0.000013f, +0.000048f, +0.000008f, +0.000034f, + +0.000055f, +0.000059f, +0.000091f, -0.000042f, -0.000009f, -0.000004f, -0.000038f, +0.000063f, -0.000088f, -0.000044f, + +0.000034f, +0.000051f, -0.000029f, -0.000000f, +0.000038f, +0.000008f + }, + { + +0.001167f, -0.001789f, -0.001817f, -0.000169f, +0.000433f, +0.000048f, -0.000074f, +0.000260f, +0.000326f, +0.000237f, + +0.000163f, -0.000158f, -0.000315f, +0.000309f, -0.004396f, +0.001091f, -0.001495f, -0.000743f, +0.006333f, -0.000701f, + +0.000919f, -0.000904f, -0.000734f, +0.001141f, -0.001160f, +0.000954f, -0.002466f, -0.000631f, -0.000591f, +0.000516f, + +0.001135f, +0.001092f, -0.000526f, +0.000334f, -0.000022f, +0.000636f, -0.001285f, -0.000272f, +0.000054f, -0.000201f, + -0.000111f, -0.000307f, +0.000356f, -0.000129f, -0.000392f, +0.000025f, +0.000147f, -0.000058f, +0.000248f, -0.000044f, + +0.000284f, -0.000312f, -0.000080f, +0.000203f, -0.000006f, -0.000020f, -0.000112f, +0.000233f, +0.000116f, -0.000055f, + +0.000056f, +0.000091f, -0.000095f, -0.000106f, +0.000004f, +0.000055f, +0.000039f, +0.000111f, +0.000049f, +0.000011f, + +0.000090f, -0.000063f, -0.000071f, -0.000011f, -0.000019f, -0.000054f, +0.000035f, -0.000033f, -0.000013f, +0.000110f, + +0.000034f, +0.000081f, -0.000027f, -0.000151f, +0.000062f, -0.000034f, +0.000025f, +0.000023f, -0.000051f, +0.000021f, + -0.000040f, +0.000010f, +0.000068f, -0.000043f, -0.000054f, +0.000004f + }, + { + +0.006935f, -0.023188f, -0.001288f, +0.000502f, -0.000648f, +0.000024f, -0.000532f, +0.000842f, -0.000526f, -0.000860f, + +0.000906f, -0.000045f, -0.000508f, -0.000225f, +0.000993f, +0.000118f, +0.000466f, +0.000038f, +0.001002f, -0.000279f, + -0.000037f, +0.000245f, +0.000301f, -0.000176f, -0.000384f, -0.000150f, -0.000381f, -0.000158f, +0.000062f, -0.000187f, + +0.000698f, +0.000345f, +0.000330f, -0.000237f, -0.000429f, +0.000115f, +0.000638f, +0.000256f, -0.000060f, +0.000328f, + +0.000384f, -0.000433f, -0.000305f, +0.000192f, +0.000079f, -0.000219f, -0.000207f, -0.000206f, -0.000053f, +0.000173f, + +0.000141f, -0.000393f, +0.000009f, +0.000033f, +0.000224f, -0.000225f, +0.000111f, +0.000151f, +0.000185f, +0.000017f, + -0.000247f, -0.000043f, +0.000078f, +0.000166f, +0.000109f, -0.000080f, -0.000026f, +0.000072f, +0.000037f, +0.000015f, + -0.000013f, -0.000022f, +0.000063f, -0.000080f, +0.000002f, -0.000038f, +0.000106f, +0.000059f, -0.000023f, -0.000046f, + +0.000047f, -0.000009f, -0.000056f, -0.000123f, -0.000042f, +0.000034f, +0.000037f, -0.000017f, +0.000098f, -0.000060f, + -0.000007f, +0.000013f, -0.000005f, +0.000039f, -0.000060f, +0.000001f + }, + { + -0.000597f, -0.001250f, +0.001555f, -0.000064f, +0.000098f, -0.000165f, -0.000531f, +0.000193f, +0.000332f, +0.000009f, + -0.000237f, -0.000012f, +0.000562f, +0.002917f, +0.001994f, +0.002474f, -0.000865f, +0.000143f, -0.001310f, -0.001623f, + -0.000519f, +0.000822f, -0.001706f, -0.000742f, +0.000554f, +0.001236f, -0.000978f, +0.002141f, -0.000157f, +0.000732f, + -0.000128f, +0.000348f, -0.000608f, -0.000797f, +0.000239f, +0.000625f, -0.000394f, -0.000242f, -0.000165f, -0.000289f, + +0.000142f, +0.000301f, -0.000166f, -0.000303f, -0.000395f, +0.000107f, +0.000199f, +0.000078f, -0.000056f, +0.000046f, + -0.000136f, -0.000192f, +0.000083f, +0.000085f, +0.000005f, -0.000084f, -0.000020f, +0.000081f, -0.000096f, -0.000146f, + +0.000120f, -0.000054f, -0.000152f, -0.000039f, -0.000110f, -0.000033f, -0.000064f, +0.000082f, +0.000070f, +0.000018f, + -0.000258f, +0.000002f, +0.000097f, +0.000010f, +0.000018f, +0.000083f, -0.000016f, +0.000071f, +0.000069f, +0.000014f, + +0.000007f, +0.000023f, +0.000029f, -0.000046f, -0.000019f, -0.000001f, +0.000058f, -0.000064f, -0.000027f, +0.000007f, + -0.000067f, -0.000045f, -0.000024f, +0.000045f, -0.000009f, -0.000009f + }, + { + -0.006945f, +0.057290f, +0.000050f, -0.001801f, +0.000431f, -0.000097f, +0.000277f, -0.000269f, +0.000405f, -0.000347f, + +0.000832f, +0.000651f, -0.000584f, -0.000772f, +0.001735f, +0.000517f, +0.000112f, -0.000050f, -0.001463f, +0.000238f, + +0.000548f, -0.000561f, -0.000548f, +0.000144f, +0.000087f, -0.000151f, +0.000594f, +0.000232f, -0.000451f, -0.000175f, + +0.000047f, -0.000616f, +0.000188f, -0.000862f, -0.000502f, +0.000679f, +0.000493f, +0.000450f, +0.000869f, -0.000197f, + +0.000161f, -0.000381f, +0.000355f, -0.000017f, -0.000480f, +0.000119f, -0.000051f, +0.000070f, -0.000231f, +0.000291f, + +0.000126f, +0.000275f, -0.000146f, -0.000317f, +0.000045f, -0.000082f, +0.000120f, +0.000022f, -0.000024f, +0.000026f, + -0.000161f, -0.000150f, +0.000017f, +0.000070f, +0.000082f, -0.000071f, -0.000053f, +0.000029f, +0.000011f, -0.000068f, + -0.000003f, +0.000026f, -0.000021f, -0.000041f, +0.000167f, -0.000034f, -0.000139f, +0.000135f, +0.000002f, -0.000016f, + +0.000047f, +0.000076f, -0.000076f, -0.000001f, -0.000022f, -0.000011f, -0.000038f, +0.000054f, -0.000016f, +0.000022f, + +0.000009f, -0.000035f, -0.000010f, +0.000025f, +0.000022f, -0.000012f + }, + { + -0.000870f, -0.001384f, +0.002678f, -0.000398f, +0.000431f, -0.000030f, -0.000044f, -0.000501f, +0.000510f, +0.000220f, + -0.000188f, +0.000003f, -0.000159f, -0.000714f, +0.003208f, -0.001665f, +0.003284f, -0.001927f, -0.000399f, +0.000147f, + -0.000345f, -0.000390f, +0.003154f, -0.000250f, +0.002088f, -0.000486f, -0.001411f, +0.000626f, +0.000363f, -0.000887f, + +0.000984f, -0.000701f, +0.000111f, +0.000005f, -0.001073f, +0.000359f, +0.000442f, -0.000257f, +0.000485f, -0.000488f, + +0.000296f, +0.000035f, -0.000207f, +0.000117f, +0.000106f, +0.000363f, -0.000289f, -0.000040f, -0.000159f, +0.000058f, + +0.000017f, +0.000155f, -0.000252f, -0.000024f, +0.000143f, +0.000142f, -0.000174f, +0.000067f, +0.000211f, -0.000092f, + +0.000178f, -0.000025f, -0.000082f, -0.000002f, -0.000083f, -0.000132f, -0.000136f, -0.000286f, +0.000097f, +0.000021f, + +0.000043f, -0.000049f, -0.000158f, -0.000077f, +0.000029f, -0.000012f, -0.000020f, +0.000060f, +0.000086f, -0.000016f, + +0.000101f, -0.000014f, -0.000126f, -0.000030f, -0.000024f, -0.000050f, +0.000046f, +0.000112f, +0.000013f, -0.000022f, + -0.000021f, +0.000004f, -0.000023f, -0.000006f, -0.000005f, -0.000014f + }, + { + +0.001217f, +0.032183f, -0.005631f, -0.000307f, -0.000025f, +0.002067f, +0.000259f, -0.000906f, -0.000056f, +0.000102f, + +0.000032f, -0.000567f, +0.000561f, -0.000326f, -0.001829f, -0.000132f, +0.000226f, +0.000064f, +0.000288f, +0.000133f, + -0.000065f, +0.000016f, -0.000091f, -0.000393f, +0.000090f, +0.000563f, +0.000197f, -0.000503f, -0.000226f, +0.000069f, + +0.000115f, +0.000541f, -0.000539f, +0.000159f, +0.000832f, +0.000114f, +0.000004f, +0.000227f, +0.000157f, -0.000313f, + -0.000305f, -0.000010f, -0.000227f, -0.000172f, -0.000610f, +0.000405f, +0.000181f, -0.000232f, -0.000271f, +0.000013f, + +0.000306f, -0.000062f, +0.000066f, +0.000412f, -0.000093f, -0.000203f, +0.000363f, +0.000118f, -0.000036f, +0.000012f, + -0.000129f, +0.000091f, -0.000098f, -0.000016f, +0.000043f, -0.000014f, +0.000041f, +0.000029f, -0.000142f, +0.000004f, + +0.000008f, +0.000073f, -0.000061f, +0.000041f, +0.000005f, +0.000040f, -0.000010f, +0.000068f, -0.000074f, +0.000090f, + -0.000061f, -0.000057f, -0.000041f, +0.000039f, -0.000039f, +0.000044f, +0.000071f, +0.000014f, -0.000013f, +0.000055f, + +0.000001f, +0.000024f, -0.000025f, -0.000023f, -0.000024f, +0.000052f + }, + { + -0.000060f, +0.004045f, -0.000825f, -0.001096f, -0.000480f, -0.000049f, +0.000305f, -0.000739f, -0.000463f, +0.000278f, + +0.000485f, +0.001180f, -0.001105f, -0.001128f, -0.001501f, +0.000539f, +0.000424f, -0.001753f, -0.000511f, +0.001760f, + -0.000759f, -0.001388f, +0.000886f, +0.000261f, +0.000921f, -0.000096f, +0.000565f, +0.000399f, -0.000298f, +0.000001f, + -0.000293f, -0.000156f, -0.000151f, -0.000065f, -0.000249f, +0.000413f, -0.000304f, +0.000056f, -0.000131f, -0.000051f, + -0.000194f, -0.000392f, +0.000331f, +0.000047f, +0.000163f, -0.000032f, -0.000012f, +0.000069f, +0.000080f, +0.000107f, + +0.000067f, +0.000098f, +0.000027f, -0.000099f, -0.000189f, +0.000097f, -0.000249f, +0.000020f, +0.000235f, +0.000029f, + -0.000021f, +0.000158f, -0.000033f, -0.000065f, -0.000119f, +0.000137f, -0.000113f, +0.000029f, +0.000074f, +0.000033f, + +0.000061f, -0.000056f, -0.000077f, -0.000033f, +0.000058f, +0.000020f, -0.000002f, -0.000027f, -0.000173f, +0.000042f, + -0.000002f, -0.000023f, +0.000109f, +0.000018f, -0.000069f, -0.000054f, +0.000003f, -0.000060f, +0.000045f, -0.000093f, + -0.000016f, +0.000022f, -0.000023f, +0.000017f, +0.000007f, +0.000055f + }, + { + +0.003205f, -0.000185f, -0.002073f, -0.002160f, -0.000654f, -0.001197f, -0.000730f, -0.000381f, -0.000224f, +0.000614f, + +0.000290f, -0.000578f, -0.000241f, +0.000135f, -0.000338f, -0.000526f, +0.000494f, +0.000000f, -0.000652f, +0.000605f, + -0.000782f, +0.000385f, +0.000395f, +0.000252f, -0.000456f, -0.000176f, -0.000540f, +0.000209f, +0.000184f, +0.000688f, + -0.000379f, -0.000073f, -0.000449f, -0.000225f, +0.000498f, -0.000237f, +0.000050f, -0.000173f, -0.000078f, -0.000078f, + -0.000458f, +0.000294f, -0.000248f, -0.000128f, -0.000130f, +0.000181f, -0.000124f, +0.000098f, -0.000205f, -0.000308f, + +0.000138f, +0.000183f, -0.000269f, +0.000209f, -0.000312f, +0.000120f, +0.000065f, +0.000094f, +0.000071f, -0.000172f, + +0.000133f, +0.000137f, -0.000147f, -0.000008f, +0.000167f, +0.000056f, -0.000083f, +0.000010f, -0.000086f, -0.000058f, + +0.000140f, -0.000064f, -0.000010f, +0.000006f, +0.000052f, +0.000052f, -0.000026f, +0.000005f, -0.000053f, -0.000098f, + -0.000035f, -0.000005f, +0.000058f, +0.000029f, -0.000012f, +0.000086f, -0.000048f, -0.000000f, +0.000038f, -0.000046f, + +0.000034f, -0.000003f, +0.000072f, +0.000029f, -0.000042f, -0.000002f + }, + { + -0.000338f, +0.000301f, +0.002746f, -0.000913f, +0.000695f, -0.000251f, +0.000971f, -0.000585f, -0.000732f, +0.000185f, + -0.000231f, +0.000595f, -0.003781f, +0.001332f, -0.002138f, +0.001578f, -0.000768f, +0.000174f, -0.000174f, +0.000904f, + +0.000765f, -0.001749f, +0.002880f, +0.000460f, +0.000380f, -0.000362f, +0.000054f, +0.000861f, -0.000210f, +0.000649f, + +0.000723f, +0.000008f, +0.000349f, -0.000360f, +0.000116f, +0.000017f, -0.000682f, +0.000348f, -0.000245f, -0.000150f, + -0.000554f, +0.000319f, +0.000364f, +0.000032f, -0.000008f, -0.000266f, +0.000046f, +0.000155f, +0.000298f, -0.000200f, + -0.000025f, +0.000081f, +0.000257f, -0.000027f, -0.000172f, +0.000144f, +0.000221f, -0.000066f, +0.000143f, -0.000045f, + -0.000190f, -0.000230f, +0.000078f, +0.000038f, +0.000027f, -0.000030f, +0.000062f, -0.000045f, -0.000046f, +0.000090f, + -0.000008f, -0.000013f, -0.000072f, +0.000032f, -0.000049f, +0.000050f, +0.000152f, +0.000105f, +0.000035f, +0.000014f, + +0.000060f, -0.000066f, -0.000055f, -0.000024f, -0.000019f, +0.000013f, -0.000072f, +0.000052f, +0.000007f, +0.000027f, + -0.000032f, -0.000065f, +0.000054f, +0.000082f, -0.000082f, +0.000053f + }, + { + -0.000203f, +0.007356f, -0.003067f, +0.001122f, -0.000615f, -0.003504f, +0.000254f, +0.000148f, -0.000053f, +0.000317f, + +0.000413f, -0.001042f, +0.001441f, +0.000090f, +0.000626f, +0.001240f, -0.000284f, -0.000229f, -0.000267f, -0.000681f, + -0.000224f, -0.000059f, +0.000058f, -0.000564f, -0.000257f, -0.000700f, -0.000794f, +0.000478f, +0.000001f, +0.000782f, + +0.000477f, -0.000083f, +0.000303f, -0.000227f, -0.000143f, -0.000065f, -0.000234f, -0.000161f, -0.000103f, -0.000078f, + +0.000265f, +0.000100f, +0.000281f, -0.000050f, -0.000076f, -0.000004f, -0.000637f, -0.000571f, -0.000144f, -0.000295f, + +0.000293f, -0.000108f, -0.000013f, +0.000279f, -0.000103f, +0.000056f, -0.000144f, -0.000082f, -0.000095f, -0.000027f, + +0.000196f, -0.000217f, +0.000037f, -0.000060f, -0.000013f, -0.000077f, -0.000116f, +0.000055f, +0.000015f, +0.000042f, + -0.000052f, +0.000056f, -0.000020f, +0.000105f, -0.000014f, -0.000050f, -0.000080f, +0.000093f, +0.000015f, -0.000053f, + -0.000056f, +0.000054f, -0.000009f, -0.000119f, -0.000017f, -0.000038f, -0.000093f, +0.000061f, +0.000087f, -0.000018f, + -0.000037f, +0.000028f, -0.000031f, -0.000004f, -0.000027f, +0.000052f + }, + { + +0.000738f, -0.001069f, -0.003048f, -0.000773f, +0.000267f, -0.000130f, -0.000102f, +0.001234f, -0.001221f, +0.000243f, + +0.000144f, +0.000080f, -0.000922f, -0.001544f, +0.013176f, +0.004819f, -0.000785f, +0.000603f, -0.001476f, +0.000153f, + +0.000542f, -0.000059f, +0.000234f, +0.000560f, +0.000722f, -0.000284f, -0.000884f, -0.000641f, +0.000934f, -0.000430f, + +0.000188f, +0.000604f, +0.000192f, -0.000381f, +0.000005f, -0.000609f, -0.000177f, +0.000083f, +0.000246f, +0.000461f, + +0.000220f, -0.000087f, +0.000634f, -0.000023f, -0.000598f, -0.000033f, -0.000268f, -0.000278f, -0.000016f, -0.000001f, + +0.000057f, -0.000057f, +0.000156f, +0.000063f, -0.000059f, -0.000093f, -0.000054f, +0.000347f, -0.000275f, +0.000249f, + +0.000287f, +0.000049f, -0.000113f, +0.000001f, -0.000021f, +0.000071f, +0.000107f, -0.000244f, +0.000098f, +0.000048f, + -0.000102f, -0.000101f, +0.000107f, +0.000054f, -0.000006f, +0.000220f, -0.000100f, +0.000043f, +0.000052f, +0.000037f, + +0.000040f, -0.000044f, -0.000082f, -0.000115f, +0.000060f, -0.000035f, +0.000001f, +0.000031f, +0.000010f, -0.000056f, + +0.000012f, -0.000006f, -0.000042f, +0.000015f, +0.000034f, -0.000005f + } + }, + { + { + +0.006261f, +0.052209f, -0.010612f, +0.002465f, +0.001238f, -0.000259f, -0.000985f, +0.000108f, -0.000343f, -0.000532f, + +0.000646f, +0.000663f, +0.000103f, -0.000731f, -0.000003f, +0.000271f, +0.001633f, -0.000729f, +0.000012f, +0.000828f, + +0.001320f, +0.000518f, -0.000369f, -0.000259f, +0.000048f, +0.000099f, -0.000173f, -0.000828f, +0.000252f, -0.000594f, + +0.000228f, +0.000206f, +0.000290f, -0.000106f, +0.000277f, -0.000214f, -0.000118f, -0.000407f, +0.000623f, +0.000460f, + +0.000475f, +0.000108f, -0.000429f, +0.000075f, -0.000047f, -0.000171f, +0.000043f, +0.000108f, -0.000050f, +0.000093f, + +0.000291f, +0.000092f, -0.000118f, -0.000045f, -0.000042f, +0.000254f, +0.000049f, -0.000012f, -0.000137f, -0.000158f, + +0.000122f, +0.000012f, +0.000141f, -0.000142f, -0.000044f, -0.000060f, -0.000057f, +0.000053f, +0.000066f, +0.000042f, + +0.000049f, -0.000106f, -0.000026f, +0.000120f, +0.000043f, -0.000057f, -0.000095f, +0.000038f, -0.000053f, -0.000025f, + -0.000037f, +0.000024f, +0.000034f, -0.000040f, +0.000097f, -0.000096f, +0.000001f, -0.000041f, -0.000022f, -0.000021f, + +0.000020f, -0.000012f, +0.000026f, -0.000008f, -0.000002f, -0.000014f + }, + { + +0.000386f, -0.001968f, -0.000102f, -0.000366f, +0.000013f, +0.000217f, +0.000532f, -0.000666f, +0.000019f, +0.000024f, + +0.000081f, +0.000106f, -0.000523f, -0.000056f, +0.003224f, +0.000916f, -0.000441f, +0.000152f, +0.001287f, +0.000494f, + +0.000089f, -0.000562f, +0.000155f, -0.000660f, -0.001021f, +0.000391f, +0.000498f, -0.000400f, +0.000058f, -0.000490f, + -0.000589f, -0.000091f, -0.000171f, -0.000129f, -0.000538f, +0.000195f, +0.000015f, -0.000666f, +0.000170f, +0.000822f, + -0.000188f, -0.000305f, -0.000316f, +0.000521f, -0.000356f, +0.000129f, +0.000009f, -0.000128f, +0.000156f, +0.000114f, + +0.000309f, -0.000167f, -0.000008f, +0.000002f, +0.000301f, -0.000150f, -0.000162f, -0.000092f, +0.000072f, -0.000052f, + -0.000100f, -0.000024f, +0.000082f, +0.000005f, +0.000046f, +0.000124f, -0.000172f, +0.000015f, +0.000003f, -0.000027f, + -0.000039f, +0.000122f, -0.000040f, -0.000068f, -0.000057f, +0.000107f, +0.000049f, -0.000038f, -0.000083f, -0.000000f, + +0.000099f, -0.000019f, -0.000070f, +0.000030f, -0.000015f, -0.000041f, +0.000024f, -0.000002f, -0.000079f, +0.000081f, + +0.000010f, -0.000038f, -0.000037f, +0.000014f, +0.000041f, +0.000027f + }, + { + +0.001068f, +0.016376f, +0.004992f, +0.002037f, +0.002393f, +0.000746f, +0.000258f, +0.000594f, +0.000778f, -0.000310f, + -0.000484f, +0.000669f, +0.000402f, -0.000797f, +0.000201f, +0.000612f, +0.000345f, -0.000282f, +0.000947f, +0.001628f, + -0.000356f, +0.000262f, +0.000340f, -0.000250f, -0.000296f, -0.000876f, +0.000987f, -0.000252f, +0.000489f, +0.000740f, + -0.000133f, -0.000860f, -0.001130f, +0.000176f, +0.000103f, -0.000254f, -0.000136f, -0.000257f, +0.000294f, -0.000521f, + -0.000086f, -0.000920f, -0.000184f, -0.000404f, -0.000060f, -0.000110f, -0.000066f, -0.000118f, +0.000009f, -0.000260f, + -0.000321f, -0.000053f, +0.000255f, -0.000011f, +0.000167f, +0.000103f, +0.000056f, +0.000102f, -0.000007f, -0.000016f, + -0.000048f, -0.000031f, +0.000058f, +0.000255f, -0.000165f, -0.000059f, +0.000016f, -0.000003f, -0.000038f, +0.000035f, + +0.000061f, -0.000132f, -0.000043f, +0.000055f, +0.000053f, +0.000077f, -0.000096f, -0.000138f, +0.000066f, +0.000034f, + -0.000025f, -0.000018f, +0.000055f, +0.000045f, -0.000124f, +0.000010f, +0.000036f, +0.000031f, -0.000017f, -0.000010f, + +0.000045f, +0.000022f, -0.000040f, -0.000001f, -0.000013f, -0.000045f + }, + { + -0.010920f, -0.006257f, +0.002848f, -0.003931f, +0.000432f, +0.000359f, -0.000203f, +0.000164f, -0.000007f, +0.000599f, + +0.000407f, -0.000202f, -0.000937f, +0.000586f, +0.000286f, +0.000047f, +0.000175f, -0.000071f, +0.000521f, -0.000017f, + -0.000115f, -0.000403f, +0.000150f, +0.000431f, +0.000001f, +0.000733f, -0.000565f, +0.000776f, -0.001089f, -0.000151f, + +0.000423f, +0.000031f, -0.000214f, +0.000462f, -0.000161f, +0.000352f, -0.000145f, -0.000037f, -0.000116f, -0.000263f, + +0.000064f, +0.000104f, -0.000290f, +0.000321f, -0.000202f, -0.000610f, +0.000014f, +0.000144f, +0.000038f, -0.000000f, + -0.000091f, +0.000301f, -0.000238f, +0.000204f, -0.000174f, +0.000003f, +0.000046f, -0.000028f, +0.000188f, +0.000063f, + -0.000109f, +0.000031f, -0.000018f, -0.000183f, +0.000004f, +0.000060f, +0.000031f, +0.000168f, -0.000052f, +0.000001f, + +0.000142f, +0.000164f, -0.000089f, -0.000082f, -0.000010f, -0.000031f, -0.000041f, +0.000030f, -0.000026f, -0.000011f, + -0.000021f, +0.000047f, +0.000083f, -0.000043f, -0.000029f, +0.000034f, -0.000062f, +0.000052f, -0.000022f, -0.000065f, + +0.000004f, +0.000046f, +0.000008f, -0.000035f, +0.000036f, +0.000003f + }, + { + -0.000684f, -0.003542f, +0.001499f, -0.000327f, +0.000245f, +0.000177f, +0.000233f, -0.000006f, +0.000016f, +0.000484f, + -0.000003f, -0.000108f, -0.000124f, -0.001779f, +0.000151f, +0.002139f, -0.002261f, -0.002030f, +0.002552f, +0.000982f, + +0.000134f, -0.001336f, -0.000411f, +0.000680f, +0.000157f, -0.000136f, -0.000615f, +0.000717f, -0.000537f, -0.000104f, + +0.001028f, +0.000415f, -0.000214f, +0.000157f, -0.000452f, +0.000141f, -0.000934f, +0.000070f, -0.000462f, -0.000238f, + -0.000145f, +0.000049f, -0.000461f, -0.000105f, +0.000030f, -0.000121f, +0.000254f, +0.000008f, -0.000112f, +0.000093f, + -0.000049f, +0.000222f, -0.000141f, +0.000119f, +0.000119f, +0.000067f, -0.000120f, +0.000192f, +0.000198f, -0.000075f, + -0.000100f, +0.000111f, -0.000004f, -0.000217f, -0.000138f, -0.000019f, +0.000051f, +0.000138f, +0.000015f, -0.000080f, + +0.000195f, +0.000048f, -0.000153f, +0.000032f, -0.000033f, -0.000054f, +0.000009f, -0.000114f, -0.000101f, +0.000042f, + +0.000010f, +0.000123f, +0.000051f, -0.000158f, +0.000018f, -0.000022f, +0.000035f, +0.000029f, -0.000027f, +0.000001f, + -0.000042f, -0.000013f, +0.000055f, +0.000004f, -0.000073f, -0.000037f + }, + { + -0.012023f, -0.000595f, +0.001161f, +0.001961f, -0.000649f, +0.000030f, -0.000443f, -0.000085f, +0.000422f, -0.001219f, + +0.000216f, +0.000119f, +0.000062f, +0.000080f, +0.000259f, +0.001227f, +0.000258f, +0.000272f, +0.000490f, +0.000054f, + -0.000758f, -0.000126f, +0.000548f, +0.000136f, -0.000422f, -0.000520f, -0.000066f, -0.000102f, +0.000082f, -0.000200f, + +0.000723f, +0.000792f, +0.000148f, -0.000419f, -0.000398f, +0.000191f, +0.000385f, +0.000333f, -0.000015f, -0.000038f, + -0.000446f, +0.000007f, +0.000121f, +0.000325f, -0.000277f, -0.000448f, -0.000074f, +0.000122f, -0.000054f, -0.000058f, + +0.000230f, -0.000270f, -0.000159f, -0.000220f, +0.000232f, -0.000085f, -0.000037f, +0.000065f, +0.000089f, +0.000029f, + -0.000123f, -0.000095f, +0.000056f, +0.000137f, +0.000038f, +0.000056f, -0.000057f, +0.000092f, -0.000009f, -0.000011f, + +0.000024f, -0.000015f, +0.000104f, -0.000103f, +0.000042f, -0.000027f, -0.000009f, +0.000021f, +0.000035f, +0.000019f, + +0.000031f, +0.000084f, +0.000005f, -0.000140f, -0.000063f, -0.000043f, +0.000012f, -0.000075f, +0.000102f, -0.000013f, + -0.000022f, +0.000002f, -0.000005f, +0.000046f, -0.000016f, -0.000039f + }, + { + -0.000121f, -0.002740f, +0.000476f, +0.000809f, +0.000186f, -0.000051f, -0.000287f, -0.000091f, +0.000169f, +0.000215f, + -0.000168f, +0.000164f, +0.000511f, +0.002431f, +0.003589f, +0.001588f, +0.000592f, -0.000253f, -0.000001f, -0.000996f, + -0.000323f, -0.000447f, -0.002265f, +0.002281f, -0.000115f, +0.000645f, +0.000053f, +0.001052f, +0.000507f, +0.000052f, + -0.000159f, +0.000347f, -0.000087f, -0.000731f, -0.000238f, +0.000622f, -0.000549f, -0.000257f, -0.000375f, -0.000724f, + +0.000277f, +0.000186f, -0.000113f, -0.000093f, -0.000404f, -0.000155f, +0.000083f, +0.000036f, -0.000099f, +0.000085f, + -0.000121f, -0.000019f, -0.000118f, +0.000078f, +0.000082f, -0.000114f, -0.000182f, +0.000193f, -0.000040f, -0.000100f, + +0.000061f, +0.000079f, -0.000160f, -0.000087f, -0.000052f, -0.000038f, -0.000133f, -0.000019f, +0.000078f, +0.000115f, + -0.000168f, -0.000062f, +0.000080f, -0.000030f, -0.000060f, -0.000042f, -0.000027f, -0.000025f, +0.000027f, +0.000078f, + -0.000005f, +0.000015f, -0.000034f, +0.000015f, -0.000037f, -0.000004f, +0.000057f, +0.000005f, +0.000005f, +0.000073f, + +0.000011f, +0.000001f, -0.000050f, +0.000049f, +0.000011f, -0.000040f + }, + { + +0.013064f, +0.036636f, -0.003761f, -0.000440f, -0.000674f, +0.000011f, +0.000263f, +0.000372f, -0.000201f, -0.000114f, + -0.000027f, +0.001009f, -0.000278f, +0.000008f, +0.000502f, +0.000686f, -0.000274f, +0.000792f, -0.000866f, -0.000681f, + +0.000408f, +0.000057f, -0.000730f, +0.000042f, +0.000264f, -0.000126f, +0.000315f, +0.000095f, -0.000206f, -0.000013f, + +0.000138f, -0.000232f, -0.000568f, -0.000399f, -0.000704f, +0.000079f, +0.000728f, +0.000567f, +0.000219f, +0.000354f, + -0.000208f, +0.000068f, -0.000033f, +0.000046f, -0.000054f, +0.000040f, -0.000019f, +0.000268f, +0.000063f, -0.000134f, + +0.000114f, +0.000515f, +0.000211f, -0.000234f, -0.000103f, -0.000169f, -0.000065f, -0.000035f, +0.000090f, +0.000152f, + -0.000206f, -0.000051f, -0.000000f, -0.000009f, +0.000183f, -0.000019f, -0.000023f, -0.000046f, +0.000039f, -0.000044f, + -0.000010f, +0.000060f, -0.000083f, -0.000130f, +0.000081f, +0.000049f, -0.000187f, +0.000008f, +0.000046f, -0.000032f, + +0.000045f, +0.000052f, -0.000010f, -0.000014f, -0.000010f, -0.000006f, -0.000093f, +0.000002f, +0.000019f, -0.000029f, + +0.000021f, -0.000039f, -0.000041f, -0.000007f, +0.000017f, +0.000017f + }, + { + -0.000210f, -0.003664f, +0.001362f, -0.000631f, +0.000213f, +0.000088f, -0.000257f, -0.000435f, +0.000326f, +0.000211f, + +0.000205f, +0.000219f, -0.000089f, +0.001102f, -0.000340f, +0.004237f, +0.000886f, -0.000781f, -0.001832f, +0.000314f, + +0.000352f, +0.000111f, +0.000811f, +0.001725f, +0.000416f, +0.001220f, -0.001499f, +0.000517f, -0.000705f, +0.000187f, + +0.001034f, -0.000396f, -0.000417f, -0.000004f, -0.000920f, +0.000208f, +0.000541f, -0.000207f, +0.000249f, +0.000043f, + -0.000662f, -0.000053f, +0.000117f, -0.000214f, -0.000109f, +0.000007f, -0.000312f, +0.000148f, +0.000050f, -0.000153f, + +0.000093f, -0.000031f, -0.000108f, -0.000121f, +0.000250f, +0.000110f, -0.000300f, +0.000087f, +0.000023f, +0.000107f, + +0.000087f, +0.000090f, -0.000047f, +0.000113f, -0.000006f, +0.000045f, -0.000124f, -0.000129f, -0.000017f, +0.000078f, + +0.000187f, +0.000008f, -0.000063f, -0.000142f, -0.000084f, +0.000028f, +0.000003f, +0.000058f, +0.000094f, -0.000028f, + +0.000024f, +0.000093f, -0.000037f, -0.000057f, -0.000026f, -0.000048f, -0.000083f, +0.000064f, +0.000055f, -0.000008f, + -0.000064f, +0.000026f, -0.000012f, -0.000026f, -0.000008f, -0.000030f + }, + { + +0.000731f, +0.027691f, -0.003097f, -0.001589f, -0.000252f, -0.000188f, +0.000057f, +0.000508f, -0.000684f, -0.000167f, + -0.000106f, -0.000839f, +0.000177f, +0.001033f, -0.002242f, -0.000259f, +0.000309f, -0.000023f, +0.000356f, +0.000358f, + -0.000284f, +0.000084f, -0.000324f, -0.000184f, -0.000294f, +0.000065f, +0.000581f, -0.000472f, -0.000261f, +0.000092f, + -0.000031f, +0.000049f, -0.000422f, -0.000141f, +0.000547f, +0.000447f, +0.000369f, -0.000073f, +0.000512f, -0.000452f, + -0.000184f, -0.000417f, +0.000044f, -0.000190f, -0.000318f, -0.000288f, +0.000397f, -0.000120f, -0.000348f, -0.000274f, + +0.000205f, -0.000212f, -0.000215f, +0.000456f, +0.000150f, -0.000251f, +0.000137f, +0.000266f, -0.000100f, +0.000133f, + -0.000043f, -0.000033f, -0.000093f, -0.000078f, +0.000125f, -0.000073f, -0.000023f, +0.000067f, -0.000131f, -0.000042f, + +0.000069f, +0.000020f, -0.000106f, +0.000034f, -0.000000f, +0.000062f, -0.000064f, +0.000064f, -0.000026f, +0.000087f, + +0.000017f, -0.000032f, -0.000050f, -0.000004f, -0.000096f, -0.000056f, +0.000006f, -0.000003f, -0.000038f, +0.000017f, + -0.000032f, +0.000081f, -0.000010f, -0.000023f, -0.000049f, +0.000009f + }, + { + +0.000203f, +0.002152f, -0.002453f, +0.000397f, +0.000223f, +0.000169f, -0.001044f, -0.000600f, -0.000609f, +0.000028f, + +0.000665f, -0.000010f, +0.000092f, +0.000169f, -0.002884f, -0.000029f, +0.000452f, -0.000206f, -0.001070f, +0.002592f, + -0.000354f, -0.000586f, -0.000452f, -0.000034f, +0.000408f, +0.000299f, +0.000305f, +0.000067f, +0.000008f, +0.000646f, + +0.000230f, -0.000272f, -0.000240f, +0.000085f, -0.000184f, +0.000374f, +0.000219f, -0.000030f, -0.000176f, -0.000198f, + +0.000117f, -0.000197f, -0.000193f, +0.000056f, +0.000137f, -0.000082f, -0.000008f, +0.000010f, +0.000048f, -0.000108f, + -0.000064f, +0.000034f, +0.000117f, +0.000188f, -0.000055f, -0.000067f, -0.000118f, -0.000091f, +0.000193f, +0.000096f, + -0.000096f, +0.000057f, +0.000043f, -0.000016f, -0.000238f, +0.000120f, -0.000026f, -0.000122f, +0.000041f, +0.000046f, + +0.000039f, +0.000032f, -0.000023f, -0.000066f, +0.000040f, +0.000036f, +0.000109f, +0.000038f, -0.000139f, -0.000023f, + +0.000025f, -0.000053f, +0.000079f, +0.000069f, -0.000005f, -0.000055f, +0.000033f, -0.000023f, +0.000091f, -0.000040f, + -0.000039f, +0.000006f, -0.000003f, +0.000036f, -0.000026f, +0.000035f + }, + { + -0.001380f, +0.004450f, -0.000370f, +0.000019f, -0.002586f, +0.000635f, -0.001213f, -0.000066f, +0.000135f, -0.000818f, + +0.001326f, +0.000064f, -0.000656f, +0.000741f, +0.000196f, -0.000674f, +0.000130f, +0.000401f, -0.000777f, +0.000228f, + -0.000590f, +0.000042f, +0.000484f, +0.000119f, -0.000698f, +0.000156f, -0.000621f, +0.000415f, +0.000112f, +0.000197f, + +0.000086f, -0.000146f, +0.000082f, -0.000365f, +0.000171f, +0.000667f, -0.000160f, +0.000237f, +0.000135f, -0.000336f, + -0.000354f, +0.000138f, -0.000083f, -0.000263f, +0.000011f, +0.000084f, -0.000011f, +0.000113f, -0.000140f, -0.000356f, + -0.000116f, +0.000168f, -0.000123f, +0.000133f, -0.000221f, +0.000139f, +0.000175f, +0.000032f, +0.000191f, -0.000123f, + -0.000012f, +0.000154f, +0.000000f, -0.000118f, +0.000117f, +0.000072f, -0.000006f, +0.000046f, -0.000018f, -0.000152f, + +0.000078f, -0.000031f, -0.000049f, -0.000003f, +0.000005f, +0.000024f, +0.000000f, +0.000026f, +0.000019f, -0.000079f, + -0.000011f, -0.000061f, -0.000024f, +0.000034f, -0.000028f, +0.000098f, -0.000010f, -0.000001f, +0.000029f, -0.000092f, + +0.000018f, -0.000057f, +0.000022f, +0.000029f, -0.000021f, +0.000000f + }, + { + +0.000325f, +0.001204f, +0.001461f, -0.000069f, +0.000134f, -0.000067f, +0.000813f, -0.000141f, -0.000605f, -0.000251f, + -0.000226f, -0.000005f, +0.000736f, -0.001747f, -0.005191f, +0.001253f, +0.001973f, -0.000121f, +0.000106f, -0.000103f, + +0.002371f, -0.000778f, -0.000481f, +0.000901f, +0.001790f, -0.000196f, -0.000468f, +0.001039f, +0.000113f, -0.000396f, + +0.001735f, +0.000813f, -0.000119f, -0.000157f, -0.000028f, +0.000550f, -0.000859f, -0.000193f, -0.000240f, -0.000142f, + -0.000160f, +0.000093f, +0.000302f, +0.000241f, -0.000236f, -0.000258f, -0.000171f, -0.000013f, +0.000203f, -0.000058f, + +0.000050f, -0.000090f, +0.000210f, -0.000094f, -0.000123f, +0.000020f, +0.000132f, +0.000111f, -0.000066f, +0.000190f, + -0.000036f, -0.000387f, -0.000066f, -0.000009f, +0.000111f, +0.000025f, +0.000008f, +0.000033f, -0.000051f, +0.000016f, + +0.000023f, +0.000025f, -0.000056f, +0.000004f, -0.000070f, -0.000075f, +0.000097f, +0.000076f, +0.000046f, +0.000034f, + +0.000102f, +0.000029f, -0.000057f, +0.000056f, -0.000022f, +0.000012f, -0.000096f, +0.000032f, +0.000061f, +0.000002f, + +0.000005f, -0.000093f, -0.000034f, +0.000091f, -0.000060f, -0.000025f + }, + { + +0.001269f, +0.006000f, -0.003538f, +0.002120f, +0.000152f, +0.000600f, -0.003698f, +0.000228f, -0.000452f, +0.000619f, + -0.001165f, +0.000212f, +0.000219f, -0.000367f, +0.002735f, +0.001101f, +0.000143f, +0.000781f, -0.000493f, -0.000041f, + -0.000259f, -0.000638f, -0.000181f, -0.000440f, -0.000295f, -0.000684f, -0.000566f, +0.000356f, -0.000864f, +0.001070f, + +0.000143f, +0.000151f, +0.000481f, +0.000356f, -0.000600f, +0.000109f, +0.000271f, -0.000352f, -0.000129f, -0.000290f, + +0.000347f, +0.000060f, +0.000154f, +0.000076f, +0.000195f, +0.000027f, -0.000204f, -0.000616f, -0.000078f, -0.000440f, + +0.000332f, +0.000031f, -0.000113f, +0.000180f, +0.000130f, +0.000065f, +0.000012f, -0.000157f, +0.000038f, -0.000016f, + +0.000127f, -0.000089f, -0.000111f, +0.000091f, +0.000009f, +0.000029f, -0.000092f, +0.000038f, -0.000028f, +0.000038f, + -0.000070f, +0.000078f, -0.000053f, +0.000071f, +0.000023f, +0.000026f, -0.000090f, +0.000052f, +0.000124f, -0.000004f, + -0.000033f, +0.000048f, +0.000084f, -0.000045f, -0.000055f, +0.000075f, -0.000092f, -0.000042f, +0.000053f, -0.000000f, + -0.000022f, +0.000071f, -0.000016f, +0.000023f, -0.000027f, +0.000027f + }, + { + -0.000358f, -0.000361f, -0.000938f, -0.000554f, -0.000527f, +0.000010f, +0.000019f, -0.000220f, -0.000424f, +0.000608f, + +0.000004f, +0.000546f, -0.000098f, +0.003024f, +0.002213f, +0.005272f, +0.000258f, +0.000007f, -0.001856f, +0.000444f, + +0.000964f, -0.001581f, +0.000913f, +0.001051f, -0.000563f, -0.000342f, -0.000899f, -0.000075f, +0.000447f, -0.000148f, + -0.000105f, +0.000632f, +0.000182f, -0.000761f, +0.000077f, -0.000080f, -0.000759f, +0.000484f, -0.000210f, +0.000446f, + +0.000082f, -0.000078f, -0.000077f, +0.000117f, -0.000377f, -0.000268f, -0.000250f, +0.000018f, -0.000107f, -0.000136f, + -0.000068f, -0.000000f, -0.000058f, +0.000100f, +0.000101f, +0.000021f, -0.000048f, +0.000128f, -0.000214f, -0.000238f, + +0.000250f, +0.000057f, -0.000111f, -0.000195f, -0.000037f, +0.000056f, +0.000284f, -0.000197f, -0.000032f, +0.000029f, + -0.000014f, -0.000144f, -0.000051f, -0.000018f, -0.000034f, +0.000178f, -0.000017f, -0.000027f, +0.000005f, +0.000019f, + +0.000118f, +0.000003f, +0.000030f, -0.000128f, +0.000001f, -0.000013f, -0.000008f, +0.000039f, +0.000023f, -0.000024f, + +0.000008f, +0.000041f, -0.000032f, -0.000035f, +0.000017f, +0.000028f + } + }, + { + { + -0.003717f, +0.047142f, -0.009451f, +0.002361f, +0.000315f, -0.000013f, +0.000289f, +0.000250f, -0.000069f, +0.000028f, + -0.000511f, -0.000675f, +0.000167f, -0.000077f, +0.002446f, -0.001118f, +0.000246f, -0.000753f, +0.000466f, -0.000620f, + +0.000242f, -0.000102f, -0.000141f, -0.000352f, +0.000243f, +0.000055f, +0.000528f, -0.000679f, +0.000267f, -0.000710f, + -0.000128f, +0.000587f, +0.000078f, -0.000143f, -0.000328f, +0.000162f, -0.000178f, -0.000676f, -0.000152f, -0.000054f, + +0.000563f, +0.000594f, -0.000152f, +0.000054f, -0.000086f, -0.000314f, -0.000158f, +0.000415f, +0.000237f, +0.000186f, + +0.000049f, +0.000031f, -0.000053f, -0.000018f, -0.000028f, +0.000021f, -0.000109f, +0.000106f, +0.000139f, +0.000079f, + -0.000059f, -0.000123f, +0.000031f, +0.000063f, +0.000047f, +0.000079f, +0.000116f, -0.000084f, +0.000038f, -0.000005f, + +0.000077f, -0.000004f, -0.000004f, -0.000014f, -0.000025f, +0.000164f, +0.000035f, -0.000100f, +0.000166f, -0.000044f, + -0.000025f, -0.000056f, -0.000023f, -0.000065f, +0.000006f, +0.000081f, -0.000113f, +0.000061f, +0.000014f, -0.000028f, + -0.000016f, +0.000023f, -0.000027f, +0.000012f, +0.000029f, +0.000005f + }, + { + -0.000237f, +0.002758f, +0.001784f, +0.000656f, -0.000158f, -0.000131f, +0.000091f, -0.000138f, -0.000509f, +0.000361f, + +0.000132f, +0.000456f, -0.000627f, -0.000468f, +0.002679f, +0.000174f, +0.000573f, -0.000954f, -0.002319f, -0.000165f, + -0.000329f, -0.000878f, +0.001613f, +0.000196f, -0.001559f, -0.001073f, +0.000504f, -0.001058f, +0.000267f, +0.000369f, + +0.000357f, +0.001349f, -0.000218f, -0.000450f, +0.000226f, -0.000026f, +0.000244f, -0.000888f, -0.000299f, +0.000613f, + +0.000233f, +0.000166f, -0.000407f, -0.000197f, -0.000154f, +0.000051f, -0.000003f, -0.000024f, +0.000343f, -0.000103f, + -0.000145f, -0.000034f, -0.000066f, -0.000216f, -0.000317f, +0.000129f, +0.000271f, +0.000028f, +0.000061f, +0.000162f, + -0.000141f, -0.000170f, -0.000047f, +0.000050f, +0.000117f, +0.000035f, +0.000102f, -0.000093f, -0.000116f, +0.000009f, + +0.000028f, -0.000068f, +0.000008f, +0.000109f, +0.000011f, -0.000060f, +0.000058f, +0.000049f, +0.000035f, -0.000041f, + -0.000083f, +0.000055f, +0.000068f, -0.000005f, +0.000044f, -0.000035f, -0.000036f, -0.000007f, +0.000027f, -0.000097f, + +0.000038f, +0.000067f, +0.000014f, -0.000049f, -0.000053f, +0.000001f + }, + { + -0.000680f, +0.014540f, +0.006353f, -0.000501f, -0.003072f, -0.000795f, -0.000700f, -0.000132f, +0.000115f, +0.000322f, + +0.000075f, +0.000052f, +0.000083f, +0.000151f, -0.000623f, +0.000774f, +0.000247f, -0.000161f, -0.001306f, +0.001589f, + +0.000225f, +0.001639f, +0.000426f, +0.000102f, +0.000222f, -0.000506f, +0.000405f, -0.001026f, +0.000687f, +0.000224f, + -0.000553f, +0.000774f, -0.000637f, +0.000037f, -0.000096f, +0.000360f, -0.000187f, -0.000332f, +0.000200f, -0.000496f, + +0.000020f, -0.000266f, +0.000607f, -0.000353f, +0.000324f, -0.000312f, +0.000236f, +0.000070f, +0.000035f, -0.000289f, + +0.000007f, +0.000083f, -0.000038f, -0.000010f, -0.000029f, -0.000143f, +0.000140f, -0.000127f, -0.000134f, +0.000011f, + +0.000119f, -0.000207f, -0.000030f, -0.000027f, +0.000136f, -0.000078f, -0.000137f, -0.000029f, +0.000109f, -0.000043f, + +0.000046f, +0.000080f, -0.000026f, -0.000048f, -0.000021f, +0.000002f, +0.000062f, -0.000029f, -0.000053f, +0.000041f, + +0.000002f, +0.000023f, -0.000056f, +0.000089f, +0.000039f, -0.000036f, -0.000021f, -0.000065f, +0.000046f, -0.000033f, + -0.000022f, +0.000022f, +0.000018f, +0.000002f, +0.000027f, +0.000041f + }, + { + +0.011951f, +0.020388f, -0.001477f, -0.004940f, -0.000325f, +0.000101f, -0.000930f, +0.000260f, -0.000369f, +0.000019f, + +0.000701f, +0.000217f, -0.000992f, -0.000466f, -0.000724f, +0.000077f, +0.000220f, -0.000694f, +0.000018f, +0.000420f, + +0.000043f, -0.000023f, -0.000243f, -0.000059f, +0.000045f, +0.000583f, +0.000602f, +0.000762f, -0.000029f, -0.000111f, + -0.000354f, +0.000059f, -0.000320f, -0.000183f, -0.000345f, +0.000116f, +0.000242f, -0.000666f, -0.000085f, -0.000506f, + -0.000176f, +0.000290f, -0.000241f, +0.000068f, +0.000224f, -0.000104f, -0.000331f, +0.000110f, -0.000000f, +0.000323f, + -0.000124f, +0.000093f, +0.000028f, +0.000108f, -0.000074f, -0.000013f, +0.000079f, +0.000057f, -0.000100f, +0.000103f, + +0.000023f, +0.000040f, -0.000159f, +0.000054f, -0.000187f, -0.000110f, +0.000065f, -0.000151f, +0.000093f, -0.000036f, + -0.000057f, -0.000029f, +0.000127f, +0.000024f, +0.000029f, +0.000059f, -0.000057f, -0.000012f, -0.000029f, +0.000028f, + -0.000068f, -0.000028f, -0.000068f, +0.000013f, -0.000030f, +0.000026f, +0.000008f, -0.000068f, +0.000072f, +0.000022f, + -0.000011f, -0.000039f, +0.000031f, +0.000008f, -0.000021f, -0.000032f + }, + { + +0.000425f, -0.007702f, -0.001434f, +0.000520f, -0.000486f, +0.000080f, +0.000326f, -0.000065f, +0.000072f, +0.000481f, + +0.000012f, +0.000192f, +0.000408f, -0.000138f, +0.003633f, +0.002754f, +0.000216f, +0.001197f, -0.006819f, -0.000710f, + -0.000197f, -0.000307f, -0.000382f, -0.001105f, +0.000491f, +0.000551f, +0.002979f, +0.000803f, -0.001410f, -0.001446f, + -0.000421f, -0.000236f, +0.000263f, +0.000092f, -0.000078f, -0.000230f, -0.000263f, +0.000610f, -0.000068f, +0.000408f, + -0.000260f, +0.000370f, -0.000316f, -0.000156f, +0.000331f, +0.000121f, +0.000109f, +0.000328f, -0.000192f, -0.000065f, + -0.000347f, +0.000215f, +0.000302f, -0.000139f, -0.000067f, +0.000060f, -0.000038f, -0.000013f, +0.000088f, +0.000110f, + -0.000066f, +0.000040f, +0.000065f, -0.000043f, +0.000047f, -0.000123f, -0.000082f, -0.000019f, +0.000017f, -0.000032f, + -0.000073f, +0.000039f, -0.000065f, +0.000009f, -0.000028f, +0.000063f, -0.000022f, +0.000012f, +0.000010f, -0.000101f, + -0.000019f, -0.000062f, +0.000068f, +0.000062f, -0.000097f, +0.000034f, -0.000035f, -0.000016f, +0.000050f, +0.000001f, + +0.000003f, -0.000013f, -0.000043f, -0.000003f, +0.000049f, -0.000014f + }, + { + +0.011848f, +0.029435f, +0.000201f, +0.004532f, +0.001753f, +0.000053f, +0.000820f, -0.001480f, +0.000896f, +0.001176f, + -0.000966f, -0.000592f, +0.000112f, +0.000491f, +0.000734f, +0.000782f, -0.000069f, +0.000469f, -0.000163f, +0.000573f, + -0.000036f, -0.000836f, -0.000379f, -0.000103f, +0.000079f, -0.000394f, +0.000305f, +0.000068f, +0.000623f, -0.000203f, + -0.000294f, +0.000130f, +0.000481f, +0.000144f, -0.000385f, +0.000295f, -0.000034f, -0.000164f, -0.000097f, -0.000242f, + -0.000483f, -0.000282f, +0.000181f, -0.000064f, -0.000390f, -0.000240f, -0.000217f, +0.000122f, +0.000032f, -0.000058f, + -0.000152f, +0.000318f, +0.000160f, -0.000160f, -0.000248f, +0.000230f, +0.000122f, -0.000150f, -0.000200f, +0.000045f, + +0.000043f, +0.000070f, -0.000019f, -0.000137f, -0.000146f, +0.000126f, +0.000003f, -0.000027f, +0.000050f, +0.000020f, + -0.000015f, -0.000020f, -0.000014f, +0.000038f, -0.000015f, +0.000075f, -0.000046f, -0.000081f, -0.000004f, +0.000033f, + -0.000037f, +0.000026f, +0.000046f, +0.000074f, +0.000001f, -0.000044f, -0.000047f, +0.000019f, -0.000090f, +0.000047f, + -0.000011f, -0.000011f, -0.000016f, -0.000026f, +0.000058f, -0.000013f + }, + { + +0.000470f, +0.000777f, -0.000947f, +0.000382f, -0.000072f, +0.000051f, +0.000131f, +0.000302f, -0.000126f, +0.000214f, + +0.000116f, -0.000011f, -0.000459f, +0.000765f, +0.002678f, -0.003080f, -0.001062f, +0.000787f, +0.001059f, -0.000255f, + +0.000570f, -0.000791f, -0.002324f, +0.001952f, +0.000061f, +0.000625f, +0.000747f, -0.000636f, +0.000472f, -0.000229f, + -0.000072f, +0.000562f, +0.000192f, +0.000451f, -0.000458f, +0.000060f, -0.000269f, +0.000244f, -0.000126f, -0.000201f, + -0.000233f, -0.000421f, +0.000286f, -0.000049f, +0.000240f, -0.000057f, -0.000286f, -0.000023f, -0.000024f, +0.000022f, + +0.000079f, +0.000069f, -0.000182f, -0.000138f, -0.000009f, -0.000008f, -0.000004f, -0.000087f, +0.000039f, +0.000039f, + +0.000038f, -0.000021f, +0.000054f, +0.000108f, -0.000005f, +0.000006f, +0.000029f, -0.000055f, -0.000109f, +0.000017f, + +0.000123f, +0.000086f, -0.000031f, -0.000043f, +0.000017f, -0.000105f, +0.000025f, -0.000043f, -0.000050f, -0.000037f, + +0.000063f, -0.000009f, -0.000018f, +0.000015f, +0.000006f, +0.000002f, -0.000055f, +0.000071f, -0.000020f, -0.000017f, + +0.000046f, +0.000059f, +0.000029f, -0.000034f, +0.000010f, +0.000004f + }, + { + -0.015654f, +0.000634f, +0.004944f, +0.000631f, -0.000494f, +0.000055f, -0.000547f, +0.000822f, +0.000031f, +0.000104f, + -0.000811f, -0.000768f, +0.000644f, +0.000962f, -0.000292f, +0.000530f, -0.000595f, -0.000131f, +0.001320f, +0.000189f, + -0.000662f, +0.000890f, +0.000393f, -0.000141f, -0.000214f, +0.000355f, -0.000048f, -0.000098f, -0.000516f, +0.000190f, + +0.000501f, -0.000024f, +0.000106f, +0.000156f, -0.000184f, -0.000195f, -0.000364f, +0.000072f, -0.000343f, -0.000132f, + -0.000178f, +0.000182f, -0.000025f, -0.000369f, +0.000438f, -0.000389f, -0.000510f, -0.000030f, +0.000299f, -0.000193f, + -0.000061f, -0.000242f, +0.000070f, +0.000372f, -0.000071f, +0.000032f, -0.000043f, -0.000062f, -0.000089f, +0.000057f, + -0.000059f, +0.000170f, +0.000107f, -0.000136f, -0.000014f, +0.000067f, +0.000035f, +0.000007f, -0.000025f, +0.000062f, + +0.000071f, -0.000006f, +0.000022f, -0.000010f, -0.000146f, -0.000059f, +0.000154f, -0.000168f, -0.000067f, +0.000036f, + -0.000069f, -0.000029f, +0.000030f, -0.000012f, -0.000012f, +0.000029f, +0.000035f, -0.000046f, +0.000020f, -0.000050f, + +0.000004f, +0.000022f, -0.000017f, -0.000006f, -0.000033f, +0.000000f + }, + { + +0.000846f, -0.000180f, -0.003113f, -0.000386f, -0.000407f, +0.000096f, +0.000101f, +0.000129f, -0.000295f, -0.000232f, + +0.000004f, -0.000010f, -0.000746f, -0.000531f, -0.001535f, +0.003699f, -0.003808f, -0.000405f, +0.000613f, +0.000404f, + -0.000750f, +0.001164f, -0.001805f, +0.001223f, -0.001006f, +0.000948f, +0.001393f, -0.000824f, +0.000366f, +0.000728f, + -0.000618f, +0.000360f, -0.000648f, +0.000772f, +0.000485f, -0.000212f, +0.000461f, +0.000182f, -0.000417f, +0.000388f, + -0.000423f, -0.000502f, +0.000314f, -0.000081f, -0.000381f, -0.000332f, -0.000035f, -0.000033f, -0.000025f, -0.000309f, + -0.000007f, -0.000069f, +0.000199f, -0.000092f, -0.000080f, +0.000056f, +0.000180f, +0.000064f, -0.000121f, +0.000080f, + -0.000113f, -0.000009f, +0.000081f, -0.000041f, +0.000049f, +0.000237f, +0.000075f, +0.000159f, +0.000000f, -0.000028f, + +0.000043f, -0.000029f, +0.000128f, +0.000166f, -0.000107f, -0.000025f, +0.000015f, +0.000079f, -0.000042f, -0.000006f, + -0.000108f, +0.000004f, +0.000120f, +0.000025f, +0.000045f, +0.000019f, -0.000026f, -0.000068f, -0.000034f, +0.000016f, + +0.000005f, -0.000022f, +0.000004f, +0.000011f, +0.000002f, +0.000015f + }, + { + -0.001423f, +0.019211f, -0.001628f, -0.000111f, +0.000324f, -0.001206f, +0.000445f, +0.000345f, -0.000160f, +0.000188f, + -0.000444f, -0.000512f, -0.000529f, -0.000034f, +0.000235f, +0.000174f, +0.000487f, -0.000321f, -0.000612f, +0.000252f, + +0.000682f, -0.000246f, -0.000148f, +0.000151f, +0.000179f, -0.000126f, +0.000218f, -0.000321f, -0.000314f, -0.000073f, + +0.000296f, -0.000005f, -0.000056f, +0.000124f, -0.000146f, +0.000045f, +0.000248f, -0.000115f, -0.000038f, -0.000079f, + +0.000035f, -0.000110f, -0.000213f, -0.000049f, +0.000383f, -0.000485f, +0.000012f, -0.000059f, -0.000037f, -0.000198f, + -0.000303f, -0.000045f, -0.000167f, -0.000281f, +0.000142f, +0.000028f, -0.000034f, -0.000064f, -0.000040f, -0.000129f, + +0.000238f, -0.000035f, -0.000064f, -0.000014f, -0.000029f, +0.000071f, -0.000071f, +0.000040f, +0.000063f, -0.000081f, + -0.000017f, -0.000034f, +0.000042f, -0.000080f, +0.000009f, -0.000002f, +0.000042f, -0.000088f, +0.000090f, -0.000052f, + +0.000012f, +0.000075f, +0.000058f, -0.000066f, +0.000038f, -0.000011f, -0.000097f, -0.000029f, -0.000002f, -0.000081f, + +0.000007f, -0.000040f, +0.000034f, +0.000030f, +0.000036f, -0.000035f + }, + { + -0.000376f, -0.000266f, -0.002118f, +0.000100f, -0.000051f, -0.000209f, -0.002019f, -0.000252f, +0.000146f, +0.000152f, + -0.000054f, -0.001118f, +0.001265f, +0.000575f, -0.000923f, +0.000013f, -0.000491f, +0.001195f, -0.000361f, -0.001223f, + -0.000404f, +0.000841f, -0.000778f, -0.001420f, -0.001034f, +0.001167f, -0.000474f, -0.000688f, -0.000704f, +0.000093f, + +0.000527f, +0.000280f, +0.000178f, +0.000095f, +0.000435f, -0.000557f, +0.000088f, +0.000160f, +0.000066f, +0.000142f, + +0.000202f, +0.000226f, -0.000205f, -0.000154f, -0.000062f, +0.000020f, -0.000024f, +0.000143f, +0.000051f, -0.000133f, + -0.000104f, -0.000276f, -0.000145f, +0.000182f, +0.000232f, +0.000010f, +0.000051f, -0.000032f, -0.000025f, +0.000045f, + +0.000053f, -0.000163f, +0.000010f, +0.000131f, +0.000047f, -0.000032f, +0.000138f, -0.000011f, -0.000115f, +0.000009f, + -0.000065f, +0.000050f, +0.000059f, +0.000005f, -0.000065f, -0.000043f, -0.000009f, +0.000024f, +0.000129f, -0.000069f, + +0.000020f, +0.000043f, -0.000082f, -0.000050f, +0.000047f, +0.000020f, +0.000000f, +0.000025f, -0.000035f, +0.000081f, + +0.000002f, -0.000021f, +0.000029f, +0.000002f, +0.000009f, -0.000066f + }, + { + -0.001438f, +0.003654f, +0.000945f, +0.001123f, -0.000561f, +0.000295f, +0.001202f, +0.000403f, -0.000335f, -0.000418f, + -0.000006f, +0.000947f, -0.000334f, +0.000724f, +0.000706f, -0.000198f, +0.000339f, +0.000040f, -0.000018f, -0.000635f, + +0.000354f, -0.000263f, -0.000204f, -0.000316f, +0.000139f, +0.000180f, -0.000013f, -0.000421f, +0.000272f, -0.000850f, + +0.000212f, -0.000012f, -0.000040f, +0.000125f, -0.000636f, +0.000165f, -0.000396f, +0.000315f, +0.000915f, -0.000066f, + +0.000013f, -0.000142f, +0.000125f, -0.000248f, +0.000298f, -0.000138f, +0.000021f, +0.000385f, -0.000014f, -0.000057f, + +0.000134f, -0.000062f, +0.000216f, -0.000031f, -0.000075f, -0.000037f, +0.000065f, +0.000028f, -0.000015f, +0.000178f, + -0.000087f, -0.000000f, +0.000123f, +0.000041f, -0.000192f, -0.000017f, +0.000038f, -0.000020f, +0.000141f, +0.000026f, + -0.000132f, +0.000053f, +0.000010f, -0.000004f, -0.000034f, -0.000062f, -0.000011f, -0.000003f, +0.000037f, +0.000035f, + +0.000046f, +0.000028f, -0.000120f, -0.000007f, +0.000009f, -0.000094f, +0.000076f, -0.000001f, +0.000032f, +0.000023f, + -0.000020f, +0.000010f, -0.000062f, -0.000047f, +0.000027f, -0.000007f + }, + { + -0.000261f, +0.001421f, +0.000808f, +0.000386f, +0.000281f, +0.000260f, -0.000450f, +0.000449f, +0.000248f, +0.000473f, + -0.000051f, -0.000941f, +0.001930f, +0.000763f, +0.000842f, -0.000239f, +0.001135f, +0.000699f, -0.000553f, +0.001103f, + -0.001158f, +0.001858f, +0.001144f, -0.000287f, +0.000812f, -0.000161f, -0.000351f, +0.001624f, -0.000356f, +0.000814f, + +0.000363f, +0.000609f, -0.000372f, +0.000163f, -0.000098f, +0.000219f, +0.000305f, -0.000585f, +0.000360f, -0.000187f, + +0.000086f, +0.000085f, +0.000111f, -0.000030f, +0.000255f, +0.000051f, -0.000115f, -0.000181f, +0.000160f, +0.000063f, + -0.000018f, -0.000084f, -0.000170f, +0.000034f, +0.000211f, +0.000054f, -0.000380f, +0.000151f, -0.000272f, -0.000040f, + +0.000222f, +0.000159f, -0.000221f, -0.000180f, -0.000134f, +0.000240f, -0.000121f, -0.000071f, +0.000113f, -0.000044f, + -0.000019f, +0.000031f, +0.000007f, -0.000024f, +0.000090f, -0.000056f, -0.000045f, -0.000048f, -0.000019f, -0.000022f, + -0.000032f, +0.000080f, +0.000018f, +0.000039f, +0.000010f, -0.000011f, +0.000061f, -0.000079f, +0.000022f, -0.000023f, + +0.000027f, +0.000084f, -0.000078f, -0.000065f, +0.000068f, -0.000032f + }, + { + -0.001051f, +0.002857f, -0.002667f, +0.002397f, -0.000169f, +0.003193f, -0.001491f, +0.000683f, +0.000532f, -0.000251f, + -0.000509f, +0.000238f, -0.001040f, -0.000189f, +0.001767f, -0.000969f, +0.000291f, +0.000652f, +0.000351f, -0.000150f, + -0.000151f, +0.000300f, -0.000545f, +0.000566f, -0.000344f, +0.000257f, -0.000098f, +0.000633f, -0.000259f, -0.000265f, + +0.000116f, -0.000316f, -0.000149f, +0.000316f, -0.000135f, -0.000147f, +0.000145f, +0.000039f, -0.000131f, -0.000014f, + -0.000065f, +0.000211f, +0.000037f, -0.000076f, +0.000098f, +0.000113f, +0.000487f, +0.000153f, +0.000022f, -0.000052f, + -0.000133f, +0.000192f, +0.000026f, -0.000097f, -0.000041f, +0.000030f, +0.000216f, +0.000071f, -0.000036f, +0.000040f, + +0.000012f, +0.000011f, -0.000091f, -0.000004f, +0.000151f, +0.000036f, +0.000168f, -0.000011f, +0.000023f, -0.000034f, + +0.000046f, -0.000011f, -0.000011f, -0.000064f, +0.000006f, +0.000043f, +0.000107f, -0.000080f, -0.000038f, +0.000046f, + +0.000066f, -0.000020f, +0.000028f, +0.000082f, -0.000006f, +0.000020f, +0.000100f, -0.000047f, -0.000076f, +0.000017f, + +0.000040f, -0.000025f, +0.000022f, +0.000023f, +0.000028f, -0.000035f + }, + { + +0.000101f, +0.000203f, +0.001408f, +0.000789f, -0.000315f, -0.000151f, -0.000450f, -0.000298f, -0.000463f, -0.000106f, + -0.000320f, +0.000149f, +0.000776f, +0.007279f, -0.008401f, -0.003403f, +0.000067f, +0.000070f, -0.001919f, -0.000055f, + +0.000609f, -0.001569f, +0.000168f, +0.001428f, -0.001103f, +0.000378f, -0.000052f, -0.000217f, -0.000100f, -0.000211f, + +0.000121f, +0.000340f, +0.000418f, -0.000349f, -0.000291f, +0.000516f, -0.000492f, -0.000343f, -0.000232f, +0.000251f, + +0.000285f, -0.000080f, -0.000643f, -0.000348f, +0.000415f, -0.000121f, -0.000083f, +0.000442f, +0.000152f, -0.000277f, + -0.000119f, +0.000014f, -0.000116f, -0.000139f, +0.000039f, +0.000259f, -0.000001f, -0.000160f, +0.000152f, -0.000124f, + -0.000272f, -0.000151f, +0.000100f, -0.000088f, -0.000007f, -0.000167f, -0.000001f, +0.000337f, -0.000180f, +0.000027f, + -0.000002f, +0.000113f, -0.000069f, -0.000093f, +0.000020f, -0.000132f, +0.000105f, +0.000049f, -0.000043f, -0.000062f, + -0.000039f, +0.000055f, +0.000049f, +0.000128f, -0.000082f, +0.000018f, +0.000019f, -0.000048f, -0.000006f, +0.000061f, + -0.000008f, +0.000004f, +0.000051f, -0.000022f, -0.000042f, +0.000020f + } + }, + { + { + +0.005523f, +0.027615f, +0.004667f, +0.002945f, -0.001128f, -0.000136f, +0.000660f, -0.000326f, +0.000100f, +0.000462f, + -0.000164f, -0.000549f, -0.000072f, +0.000148f, +0.001214f, -0.000179f, -0.001053f, -0.000177f, -0.000214f, -0.000171f, + -0.000084f, +0.000173f, -0.000473f, -0.000138f, +0.000190f, +0.000111f, +0.000397f, -0.000250f, +0.000115f, +0.000271f, + -0.000384f, +0.000522f, -0.000267f, +0.000003f, -0.000452f, +0.000348f, -0.000254f, -0.000411f, -0.000103f, -0.000223f, + +0.000202f, +0.000636f, +0.000146f, -0.000028f, -0.000091f, +0.000020f, -0.000211f, +0.000316f, +0.000116f, +0.000292f, + +0.000034f, +0.000135f, +0.000050f, -0.000097f, -0.000108f, -0.000090f, -0.000127f, +0.000024f, -0.000029f, +0.000211f, + -0.000059f, -0.000174f, -0.000112f, +0.000161f, +0.000091f, +0.000045f, +0.000117f, -0.000020f, -0.000004f, +0.000023f, + -0.000047f, +0.000081f, +0.000029f, -0.000047f, -0.000057f, +0.000082f, +0.000088f, -0.000061f, +0.000118f, +0.000066f, + +0.000018f, +0.000026f, -0.000058f, -0.000017f, -0.000063f, +0.000092f, -0.000023f, +0.000048f, +0.000034f, +0.000015f, + -0.000019f, +0.000027f, -0.000021f, -0.000010f, +0.000020f, +0.000008f + }, + { + +0.000351f, +0.007300f, -0.002718f, +0.001046f, -0.000302f, +0.000070f, -0.000730f, +0.000467f, -0.000166f, +0.000033f, + +0.000217f, +0.000338f, -0.001076f, +0.000593f, +0.001894f, -0.000450f, -0.000607f, +0.000112f, -0.003742f, -0.001100f, + +0.000417f, -0.001283f, +0.001375f, +0.000964f, -0.000968f, -0.001164f, +0.000811f, -0.000954f, +0.000122f, -0.000137f, + +0.000688f, +0.001476f, -0.000401f, -0.000025f, +0.000140f, -0.000055f, +0.000260f, -0.000365f, -0.000319f, -0.000033f, + +0.000459f, +0.000466f, -0.000088f, -0.000321f, -0.000174f, -0.000077f, +0.000113f, -0.000009f, +0.000005f, +0.000135f, + -0.000206f, +0.000062f, +0.000077f, -0.000077f, -0.000438f, -0.000090f, +0.000274f, +0.000060f, +0.000018f, +0.000010f, + +0.000013f, -0.000005f, -0.000066f, +0.000012f, +0.000081f, -0.000037f, +0.000223f, +0.000014f, -0.000094f, -0.000016f, + +0.000044f, -0.000131f, -0.000021f, +0.000042f, +0.000073f, -0.000072f, -0.000046f, +0.000044f, +0.000039f, +0.000019f, + -0.000081f, +0.000029f, +0.000067f, -0.000014f, +0.000055f, +0.000030f, -0.000022f, +0.000009f, +0.000075f, -0.000072f, + -0.000001f, +0.000050f, +0.000039f, -0.000015f, -0.000030f, -0.000022f + }, + { + -0.000193f, +0.019414f, +0.000747f, -0.001527f, -0.001421f, -0.001006f, -0.000394f, -0.000225f, -0.000199f, -0.000040f, + +0.000527f, -0.000118f, +0.000217f, +0.000888f, -0.000744f, -0.000094f, +0.000491f, -0.000021f, -0.001420f, +0.000723f, + +0.000393f, +0.001124f, +0.000110f, +0.000219f, +0.000282f, -0.000022f, +0.000281f, -0.000296f, +0.000391f, -0.000338f, + -0.000059f, +0.000436f, +0.000001f, -0.000115f, +0.000021f, +0.000275f, -0.000055f, -0.000250f, -0.000037f, -0.000285f, + -0.000321f, +0.000168f, +0.000269f, -0.000010f, +0.000278f, -0.000008f, +0.000195f, +0.000147f, +0.000036f, -0.000086f, + -0.000180f, +0.000153f, -0.000010f, +0.000059f, -0.000075f, -0.000143f, +0.000046f, -0.000093f, -0.000115f, -0.000060f, + +0.000070f, -0.000036f, +0.000004f, -0.000116f, +0.000077f, +0.000066f, -0.000129f, +0.000043f, +0.000066f, -0.000031f, + -0.000038f, +0.000102f, +0.000065f, -0.000030f, -0.000071f, -0.000095f, +0.000055f, +0.000082f, -0.000058f, -0.000015f, + -0.000005f, +0.000029f, -0.000030f, -0.000003f, +0.000084f, -0.000019f, -0.000027f, -0.000039f, -0.000002f, -0.000016f, + -0.000025f, -0.000016f, +0.000029f, +0.000011f, +0.000004f, +0.000054f + }, + { + -0.007920f, +0.047353f, -0.002115f, -0.004443f, +0.000023f, -0.000010f, -0.000495f, +0.000124f, -0.000130f, +0.000287f, + -0.000450f, +0.000047f, +0.000058f, -0.001561f, -0.000299f, -0.000858f, +0.000446f, -0.000903f, -0.000296f, +0.000347f, + +0.000109f, +0.000024f, +0.000071f, -0.000167f, -0.000004f, +0.000089f, +0.000843f, +0.000507f, +0.000379f, +0.000060f, + -0.000234f, +0.000046f, +0.000012f, -0.000372f, -0.000481f, +0.000271f, +0.000295f, -0.000481f, -0.000044f, -0.000695f, + -0.000081f, -0.000188f, +0.000241f, -0.000109f, +0.000114f, +0.000058f, -0.000163f, +0.000167f, -0.000139f, +0.000315f, + +0.000132f, -0.000153f, +0.000171f, +0.000043f, -0.000076f, -0.000028f, +0.000009f, +0.000121f, -0.000096f, -0.000028f, + +0.000063f, +0.000105f, -0.000111f, +0.000182f, -0.000113f, -0.000111f, +0.000042f, -0.000147f, +0.000032f, +0.000005f, + -0.000043f, -0.000131f, +0.000032f, +0.000077f, -0.000012f, +0.000040f, +0.000008f, -0.000027f, +0.000002f, +0.000034f, + +0.000012f, -0.000026f, -0.000062f, +0.000020f, -0.000033f, -0.000011f, +0.000042f, -0.000049f, +0.000014f, +0.000044f, + +0.000010f, -0.000036f, +0.000004f, +0.000025f, -0.000023f, -0.000015f + }, + { + -0.000582f, -0.009416f, +0.000687f, +0.000202f, -0.000285f, +0.000014f, +0.000294f, +0.000337f, -0.000293f, +0.000362f, + +0.000317f, -0.000141f, +0.000512f, -0.000964f, +0.006953f, -0.001141f, +0.001107f, +0.001283f, -0.002118f, -0.002495f, + -0.000651f, -0.000434f, +0.000175f, -0.001655f, +0.001271f, -0.000220f, +0.001207f, +0.000307f, -0.000232f, -0.001637f, + -0.000474f, -0.000046f, +0.000107f, +0.000210f, +0.000147f, -0.000065f, -0.000144f, +0.000416f, +0.000032f, +0.000648f, + -0.000061f, +0.000090f, +0.000005f, -0.000082f, +0.000301f, +0.000143f, +0.000131f, +0.000158f, -0.000087f, -0.000127f, + -0.000023f, -0.000079f, +0.000293f, -0.000170f, -0.000082f, -0.000041f, +0.000014f, +0.000060f, -0.000099f, +0.000071f, + +0.000093f, +0.000005f, +0.000006f, +0.000055f, +0.000133f, -0.000068f, -0.000019f, -0.000056f, +0.000015f, +0.000036f, + -0.000148f, -0.000063f, +0.000040f, -0.000022f, -0.000057f, +0.000079f, +0.000006f, +0.000066f, +0.000078f, -0.000051f, + +0.000025f, -0.000091f, -0.000048f, +0.000123f, -0.000065f, +0.000012f, -0.000034f, -0.000035f, +0.000041f, +0.000018f, + +0.000014f, +0.000005f, -0.000050f, -0.000023f, +0.000058f, +0.000013f + }, + { + -0.005710f, +0.056455f, -0.001240f, +0.005024f, +0.000027f, +0.000054f, +0.000605f, -0.000661f, +0.000230f, +0.001582f, + -0.000577f, -0.000662f, -0.000219f, -0.000233f, +0.001427f, +0.000331f, +0.000234f, +0.000386f, -0.000223f, +0.000435f, + +0.000385f, -0.000033f, -0.001193f, -0.000342f, +0.000414f, -0.000127f, +0.000094f, +0.000070f, +0.000076f, +0.000342f, + -0.000304f, -0.000279f, +0.000344f, +0.000633f, -0.000295f, +0.000205f, +0.000072f, -0.000450f, +0.000065f, -0.000137f, + -0.000392f, -0.000018f, -0.000025f, -0.000385f, -0.000428f, +0.000097f, -0.000369f, -0.000067f, +0.000014f, +0.000185f, + -0.000306f, +0.000178f, +0.000315f, -0.000040f, -0.000149f, +0.000089f, +0.000272f, -0.000047f, -0.000095f, -0.000046f, + -0.000065f, +0.000171f, +0.000014f, -0.000085f, -0.000176f, +0.000014f, +0.000055f, -0.000019f, +0.000056f, -0.000026f, + -0.000025f, +0.000032f, -0.000064f, +0.000066f, -0.000027f, +0.000029f, +0.000015f, -0.000032f, -0.000032f, -0.000017f, + -0.000037f, -0.000062f, +0.000010f, +0.000073f, +0.000018f, +0.000024f, -0.000030f, +0.000058f, -0.000080f, -0.000001f, + +0.000015f, -0.000016f, +0.000005f, -0.000049f, +0.000028f, +0.000016f + }, + { + +0.000256f, +0.002253f, +0.000363f, -0.000768f, -0.000099f, +0.000085f, +0.000228f, +0.000407f, -0.000125f, -0.000076f, + +0.000032f, +0.000083f, -0.000753f, -0.000659f, +0.002209f, -0.003197f, -0.001150f, -0.000270f, +0.000755f, +0.000592f, + +0.000235f, +0.000080f, -0.003748f, +0.000581f, +0.000749f, +0.000689f, +0.001309f, -0.000414f, -0.000115f, +0.000508f, + -0.000416f, +0.000225f, +0.000256f, +0.000636f, -0.000001f, -0.000318f, -0.000121f, +0.000438f, +0.000016f, +0.000217f, + -0.000232f, -0.000439f, +0.000183f, -0.000104f, +0.000329f, +0.000116f, -0.000139f, +0.000006f, -0.000085f, -0.000063f, + +0.000009f, +0.000112f, -0.000095f, -0.000111f, -0.000052f, +0.000054f, +0.000145f, -0.000199f, +0.000036f, +0.000092f, + -0.000022f, -0.000141f, +0.000097f, +0.000056f, +0.000026f, +0.000029f, -0.000019f, +0.000070f, -0.000107f, -0.000067f, + +0.000084f, +0.000121f, +0.000002f, -0.000041f, +0.000108f, +0.000012f, +0.000033f, +0.000023f, -0.000010f, -0.000057f, + +0.000035f, +0.000005f, +0.000021f, -0.000025f, +0.000021f, +0.000004f, -0.000060f, +0.000003f, -0.000024f, -0.000070f, + -0.000018f, +0.000014f, +0.000049f, -0.000041f, -0.000016f, +0.000030f + }, + { + +0.012785f, -0.034183f, +0.000256f, +0.000552f, -0.000106f, -0.000016f, -0.000607f, +0.000215f, +0.000111f, +0.000272f, + -0.000443f, -0.000886f, -0.000003f, +0.000798f, +0.000652f, -0.000136f, +0.000027f, -0.000916f, +0.000793f, +0.000927f, + -0.000439f, +0.000383f, +0.000626f, +0.000101f, -0.000273f, +0.000216f, -0.000154f, +0.000190f, -0.000883f, +0.000223f, + +0.000648f, -0.000115f, +0.000264f, +0.000072f, -0.000065f, +0.000059f, -0.000354f, -0.000304f, -0.000026f, -0.000249f, + -0.000214f, +0.000118f, +0.000045f, -0.000484f, +0.000090f, -0.000411f, -0.000419f, -0.000106f, -0.000060f, +0.000139f, + -0.000008f, -0.000419f, -0.000222f, +0.000302f, -0.000014f, +0.000164f, +0.000158f, -0.000012f, -0.000128f, -0.000085f, + -0.000078f, +0.000135f, +0.000079f, -0.000047f, -0.000064f, +0.000030f, +0.000036f, +0.000033f, -0.000045f, +0.000064f, + +0.000062f, -0.000011f, +0.000046f, +0.000124f, -0.000105f, -0.000104f, +0.000164f, -0.000071f, -0.000050f, -0.000004f, + -0.000009f, -0.000070f, -0.000001f, -0.000002f, -0.000016f, +0.000022f, +0.000073f, -0.000013f, +0.000002f, -0.000007f, + +0.000002f, +0.000013f, +0.000019f, +0.000007f, -0.000015f, -0.000019f + }, + { + +0.000272f, +0.002926f, -0.003373f, +0.000397f, -0.000341f, -0.000111f, +0.000126f, +0.000245f, -0.000198f, -0.000248f, + -0.000097f, -0.000567f, -0.000473f, +0.000532f, -0.003864f, -0.001677f, +0.000892f, -0.001750f, +0.000686f, -0.000208f, + -0.000471f, +0.000918f, -0.001619f, +0.001759f, -0.000749f, +0.000692f, +0.000574f, +0.000143f, +0.000297f, +0.000249f, + -0.000799f, +0.000153f, +0.000156f, +0.000067f, +0.000709f, -0.000161f, +0.000429f, +0.000246f, -0.000278f, +0.000194f, + -0.000012f, -0.000409f, +0.000079f, +0.000297f, -0.000178f, -0.000080f, +0.000062f, -0.000249f, -0.000112f, -0.000251f, + -0.000118f, +0.000006f, +0.000148f, -0.000018f, -0.000037f, +0.000069f, +0.000249f, +0.000121f, -0.000006f, +0.000016f, + -0.000106f, -0.000153f, +0.000067f, -0.000170f, +0.000035f, +0.000103f, +0.000044f, +0.000108f, +0.000026f, -0.000034f, + -0.000067f, -0.000056f, +0.000073f, +0.000176f, -0.000011f, -0.000041f, +0.000013f, +0.000061f, -0.000038f, -0.000013f, + -0.000061f, -0.000077f, +0.000071f, +0.000042f, +0.000042f, +0.000038f, +0.000048f, -0.000016f, -0.000069f, +0.000003f, + +0.000054f, -0.000026f, -0.000005f, +0.000012f, -0.000002f, +0.000044f + }, + { + +0.001296f, +0.010689f, +0.004776f, -0.000540f, -0.000367f, +0.000753f, -0.000067f, -0.000503f, +0.000121f, +0.000309f, + -0.000273f, +0.000041f, -0.000257f, -0.000978f, +0.001148f, -0.000575f, +0.000232f, +0.000024f, -0.000229f, -0.000063f, + +0.000979f, -0.000504f, +0.000046f, -0.000278f, +0.000657f, +0.000009f, -0.000096f, -0.000124f, -0.000118f, -0.000338f, + +0.000495f, +0.000328f, -0.000074f, +0.000177f, +0.000207f, -0.000260f, -0.000056f, +0.000096f, -0.000337f, +0.000115f, + +0.000104f, +0.000166f, -0.000211f, -0.000172f, +0.000210f, -0.000117f, -0.000200f, -0.000001f, +0.000213f, -0.000079f, + -0.000336f, +0.000134f, +0.000079f, -0.000294f, -0.000039f, +0.000060f, +0.000001f, -0.000128f, +0.000010f, -0.000166f, + +0.000072f, +0.000005f, +0.000024f, +0.000030f, -0.000078f, +0.000060f, -0.000004f, +0.000004f, +0.000106f, -0.000027f, + -0.000063f, -0.000027f, +0.000099f, -0.000098f, +0.000028f, -0.000025f, +0.000087f, -0.000085f, +0.000037f, -0.000064f, + -0.000016f, +0.000036f, +0.000069f, -0.000023f, +0.000085f, +0.000070f, -0.000038f, -0.000011f, +0.000013f, -0.000040f, + +0.000024f, -0.000066f, +0.000000f, +0.000038f, +0.000052f, +0.000003f + }, + { + +0.000290f, -0.001884f, -0.000949f, -0.000716f, +0.000601f, -0.000211f, -0.000670f, -0.000616f, +0.000394f, -0.000030f, + +0.000052f, -0.000202f, +0.000595f, +0.000077f, +0.000153f, -0.000273f, -0.000819f, +0.000436f, +0.000323f, -0.001613f, + -0.001098f, +0.000734f, -0.001284f, -0.000233f, -0.001057f, +0.000664f, -0.000306f, -0.000498f, -0.001109f, -0.000027f, + +0.000080f, +0.000310f, +0.000237f, +0.000068f, +0.000550f, -0.000667f, -0.000111f, -0.000063f, +0.000196f, +0.000133f, + +0.000170f, +0.000015f, +0.000031f, -0.000074f, -0.000077f, +0.000116f, +0.000045f, +0.000009f, +0.000212f, +0.000046f, + +0.000010f, -0.000255f, -0.000202f, -0.000087f, +0.000140f, +0.000043f, +0.000053f, +0.000073f, -0.000068f, +0.000030f, + +0.000102f, -0.000108f, -0.000025f, +0.000075f, +0.000218f, -0.000065f, +0.000080f, +0.000117f, -0.000040f, -0.000039f, + -0.000052f, -0.000009f, +0.000026f, +0.000024f, -0.000066f, -0.000064f, -0.000081f, -0.000056f, +0.000118f, -0.000011f, + +0.000009f, +0.000050f, -0.000067f, -0.000091f, -0.000014f, +0.000038f, -0.000035f, +0.000002f, -0.000090f, +0.000048f, + +0.000019f, -0.000018f, +0.000016f, -0.000006f, +0.000033f, -0.000042f + }, + { + +0.003093f, -0.005604f, +0.003794f, -0.000258f, +0.000457f, +0.000514f, +0.000377f, +0.000525f, -0.000733f, +0.000432f, + -0.000560f, -0.000138f, +0.000654f, +0.000342f, +0.000433f, -0.000214f, +0.000007f, -0.000224f, +0.000464f, -0.000683f, + +0.000716f, -0.000035f, -0.000748f, -0.000021f, +0.000401f, +0.000026f, -0.000062f, -0.000366f, +0.000079f, -0.000447f, + -0.000217f, +0.000183f, -0.000229f, +0.000064f, -0.000376f, -0.000335f, -0.000515f, +0.000024f, +0.000578f, -0.000029f, + +0.000270f, -0.000097f, -0.000200f, -0.000060f, +0.000228f, +0.000070f, -0.000029f, +0.000167f, +0.000102f, -0.000007f, + +0.000344f, -0.000046f, +0.000200f, -0.000073f, -0.000071f, -0.000132f, +0.000020f, +0.000099f, -0.000148f, +0.000122f, + +0.000081f, -0.000045f, +0.000014f, +0.000090f, -0.000121f, -0.000063f, +0.000026f, -0.000059f, +0.000046f, +0.000105f, + -0.000078f, +0.000025f, +0.000051f, +0.000004f, +0.000014f, -0.000049f, -0.000047f, -0.000029f, -0.000006f, +0.000054f, + +0.000022f, +0.000073f, -0.000066f, -0.000008f, +0.000036f, -0.000119f, +0.000047f, +0.000008f, +0.000012f, +0.000083f, + -0.000005f, +0.000050f, -0.000028f, -0.000042f, +0.000011f, +0.000007f + }, + { + +0.000164f, +0.002878f, -0.001111f, +0.000327f, +0.000049f, +0.000357f, -0.000640f, -0.000060f, +0.000545f, +0.000724f, + +0.000071f, -0.000681f, -0.000179f, +0.002487f, +0.001589f, +0.001597f, +0.000306f, +0.000317f, -0.000643f, +0.001455f, + -0.002102f, +0.001054f, +0.002495f, +0.000361f, -0.000888f, +0.000399f, -0.000178f, +0.001755f, -0.000232f, +0.001338f, + -0.000464f, +0.000131f, -0.000271f, +0.000162f, -0.000028f, -0.000263f, +0.000213f, -0.000156f, +0.000277f, +0.000005f, + +0.000060f, +0.000232f, -0.000009f, -0.000037f, +0.000337f, +0.000030f, +0.000020f, +0.000034f, +0.000085f, +0.000045f, + -0.000057f, +0.000116f, -0.000067f, -0.000069f, +0.000287f, +0.000193f, -0.000301f, -0.000001f, -0.000130f, -0.000144f, + +0.000025f, +0.000203f, -0.000049f, -0.000156f, -0.000156f, +0.000117f, -0.000035f, -0.000112f, +0.000082f, +0.000051f, + -0.000043f, -0.000021f, +0.000021f, -0.000022f, +0.000117f, +0.000067f, -0.000018f, -0.000042f, -0.000046f, -0.000032f, + -0.000062f, +0.000002f, +0.000015f, -0.000025f, +0.000010f, -0.000036f, +0.000105f, -0.000064f, -0.000032f, +0.000006f, + +0.000000f, +0.000087f, +0.000016f, -0.000085f, +0.000047f, +0.000037f + }, + { + +0.000100f, +0.001193f, -0.001373f, -0.000447f, -0.000003f, +0.000937f, +0.001500f, -0.000239f, +0.001216f, +0.000055f, + -0.000093f, -0.000295f, -0.000680f, +0.001796f, -0.001245f, -0.001083f, -0.000174f, -0.000597f, +0.000629f, -0.000215f, + -0.000176f, +0.000528f, -0.000240f, +0.000719f, -0.000259f, +0.000134f, +0.000019f, +0.000568f, +0.000373f, -0.000500f, + +0.000112f, -0.000378f, -0.000266f, -0.000173f, +0.000167f, -0.000421f, -0.000122f, +0.000164f, -0.000148f, +0.000087f, + -0.000173f, +0.000149f, +0.000213f, -0.000119f, -0.000047f, +0.000068f, +0.000214f, +0.000250f, +0.000039f, +0.000092f, + -0.000216f, -0.000066f, +0.000264f, -0.000043f, -0.000158f, -0.000050f, +0.000097f, +0.000101f, -0.000031f, -0.000006f, + -0.000009f, +0.000053f, -0.000027f, -0.000137f, +0.000092f, -0.000039f, +0.000143f, +0.000000f, +0.000057f, -0.000071f, + +0.000086f, -0.000015f, +0.000011f, -0.000043f, -0.000007f, -0.000010f, +0.000119f, -0.000045f, -0.000127f, -0.000022f, + +0.000058f, -0.000012f, -0.000040f, +0.000023f, +0.000010f, -0.000049f, +0.000086f, +0.000042f, -0.000054f, -0.000003f, + +0.000040f, -0.000060f, +0.000003f, -0.000007f, +0.000036f, -0.000016f + }, + { + -0.000337f, +0.000119f, +0.001232f, +0.000743f, +0.000027f, -0.000174f, -0.000591f, +0.000177f, -0.000566f, -0.000163f, + -0.000145f, -0.000208f, +0.000299f, -0.000269f, +0.000989f, -0.001689f, -0.001161f, +0.000011f, -0.000720f, -0.000768f, + +0.000404f, -0.000116f, -0.001002f, +0.001408f, -0.000019f, -0.000400f, +0.001206f, -0.001233f, -0.000488f, +0.000158f, + +0.000012f, +0.000426f, +0.000472f, -0.000026f, -0.000366f, +0.000290f, +0.000063f, -0.000495f, -0.000288f, +0.000040f, + +0.000189f, +0.000226f, -0.000364f, -0.000138f, +0.000158f, +0.000130f, -0.000074f, +0.000434f, +0.000160f, -0.000142f, + -0.000136f, -0.000083f, +0.000082f, -0.000081f, -0.000068f, +0.000067f, +0.000076f, -0.000127f, +0.000219f, +0.000219f, + -0.000158f, -0.000218f, +0.000174f, +0.000012f, +0.000071f, -0.000168f, -0.000160f, +0.000273f, -0.000071f, +0.000037f, + -0.000035f, +0.000135f, +0.000062f, -0.000021f, +0.000086f, -0.000139f, +0.000054f, +0.000087f, +0.000014f, -0.000039f, + -0.000114f, +0.000009f, -0.000039f, +0.000113f, -0.000014f, +0.000004f, +0.000020f, -0.000048f, -0.000013f, +0.000032f, + -0.000000f, -0.000033f, +0.000039f, +0.000021f, -0.000021f, -0.000015f + } + }, + { + { + -0.006593f, -0.002709f, +0.002327f, +0.004486f, +0.000666f, -0.000363f, -0.000194f, -0.000055f, -0.000019f, -0.000564f, + +0.000335f, +0.000735f, -0.000144f, -0.001159f, -0.001462f, +0.001077f, -0.000360f, +0.000094f, -0.000079f, +0.001461f, + -0.000358f, +0.000074f, -0.000035f, +0.000069f, -0.000163f, +0.000075f, -0.000526f, -0.000512f, -0.000091f, +0.000646f, + +0.000025f, +0.000082f, -0.000413f, -0.000245f, -0.000026f, -0.000256f, -0.000141f, -0.000415f, +0.000013f, +0.000062f, + -0.000241f, +0.000057f, +0.000122f, -0.000075f, -0.000202f, +0.000191f, +0.000093f, +0.000021f, -0.000215f, +0.000101f, + +0.000067f, -0.000014f, -0.000037f, +0.000004f, -0.000118f, -0.000072f, -0.000119f, -0.000066f, -0.000204f, -0.000041f, + +0.000160f, +0.000031f, -0.000011f, -0.000037f, +0.000046f, -0.000071f, -0.000019f, +0.000185f, -0.000058f, +0.000018f, + -0.000099f, -0.000014f, +0.000012f, +0.000075f, +0.000035f, -0.000081f, -0.000038f, +0.000058f, -0.000118f, +0.000072f, + +0.000001f, +0.000098f, +0.000009f, +0.000031f, -0.000003f, -0.000108f, +0.000100f, -0.000032f, +0.000017f, +0.000040f, + +0.000031f, -0.000016f, +0.000036f, -0.000016f, -0.000012f, -0.000007f + }, + { + -0.000278f, +0.008271f, -0.000788f, -0.000266f, +0.000579f, +0.000333f, -0.000627f, +0.000223f, +0.000402f, -0.000342f, + +0.000136f, +0.000065f, -0.000574f, -0.000706f, +0.000336f, +0.002086f, +0.000496f, +0.002037f, -0.000196f, -0.001104f, + -0.000199f, -0.001553f, -0.000665f, -0.000044f, +0.000825f, +0.000916f, +0.001047f, +0.000191f, +0.000577f, -0.000289f, + +0.000272f, +0.000325f, -0.000470f, +0.000871f, +0.000174f, +0.000400f, -0.000079f, -0.000031f, +0.000245f, -0.000121f, + -0.000227f, +0.000147f, +0.000214f, +0.000185f, -0.000383f, +0.000040f, +0.000089f, -0.000045f, -0.000289f, +0.000185f, + +0.000029f, -0.000113f, +0.000053f, +0.000121f, +0.000168f, -0.000338f, -0.000011f, -0.000044f, -0.000027f, -0.000252f, + +0.000012f, +0.000132f, +0.000137f, -0.000048f, -0.000075f, -0.000030f, -0.000052f, +0.000169f, +0.000073f, -0.000046f, + -0.000023f, +0.000090f, -0.000031f, -0.000143f, +0.000016f, +0.000134f, -0.000050f, -0.000035f, -0.000091f, +0.000053f, + +0.000070f, -0.000045f, -0.000062f, +0.000021f, -0.000015f, +0.000014f, +0.000048f, +0.000036f, -0.000024f, +0.000091f, + -0.000031f, -0.000057f, -0.000022f, +0.000033f, +0.000052f, -0.000004f + }, + { + +0.000474f, +0.021702f, -0.001101f, -0.002635f, +0.001644f, +0.000096f, +0.000185f, +0.000048f, -0.000078f, -0.000616f, + +0.000393f, +0.000328f, +0.000037f, -0.000185f, -0.000564f, -0.000962f, +0.000749f, -0.000127f, +0.000871f, +0.000240f, + -0.000775f, -0.000430f, -0.000064f, -0.000332f, -0.000321f, -0.000193f, +0.000520f, +0.000428f, +0.000144f, -0.000217f, + +0.000674f, -0.000575f, +0.000330f, +0.000705f, +0.000576f, -0.000484f, +0.000020f, -0.000016f, +0.000240f, +0.000037f, + +0.000051f, -0.000066f, -0.000371f, +0.000238f, -0.000035f, +0.000223f, -0.000019f, -0.000036f, +0.000166f, +0.000204f, + -0.000474f, +0.000057f, +0.000083f, -0.000187f, -0.000023f, +0.000145f, +0.000069f, +0.000135f, +0.000035f, +0.000020f, + -0.000128f, +0.000115f, +0.000077f, +0.000100f, -0.000173f, +0.000112f, +0.000036f, +0.000076f, -0.000069f, +0.000083f, + +0.000001f, -0.000096f, +0.000043f, +0.000064f, -0.000015f, +0.000046f, -0.000075f, -0.000023f, +0.000092f, -0.000039f, + -0.000044f, -0.000022f, +0.000071f, -0.000027f, -0.000045f, +0.000020f, +0.000018f, +0.000071f, -0.000054f, +0.000009f, + +0.000035f, -0.000027f, -0.000031f, +0.000012f, -0.000030f, -0.000024f + }, + { + +0.000061f, +0.061332f, -0.000526f, -0.004577f, +0.000207f, +0.000264f, +0.000284f, -0.000090f, +0.000220f, +0.000833f, + -0.001047f, -0.000721f, +0.000302f, -0.000868f, +0.000591f, -0.001392f, +0.000058f, -0.000067f, +0.000095f, -0.000194f, + -0.000269f, -0.000444f, +0.000439f, +0.000318f, +0.000170f, +0.000461f, -0.000697f, +0.000020f, -0.000162f, +0.000330f, + +0.000592f, +0.000214f, +0.000112f, +0.000288f, -0.000165f, +0.000658f, -0.000105f, +0.000045f, -0.000258f, -0.000412f, + +0.000556f, -0.000534f, +0.000083f, +0.000208f, -0.000130f, -0.000163f, +0.000333f, +0.000300f, +0.000023f, +0.000044f, + +0.000049f, +0.000064f, -0.000038f, +0.000164f, -0.000014f, +0.000072f, -0.000044f, +0.000025f, +0.000115f, -0.000195f, + -0.000099f, +0.000139f, +0.000120f, +0.000007f, +0.000071f, +0.000017f, -0.000075f, +0.000117f, -0.000114f, +0.000044f, + +0.000116f, +0.000055f, -0.000172f, -0.000007f, -0.000014f, -0.000010f, +0.000047f, +0.000014f, -0.000018f, -0.000053f, + +0.000055f, +0.000027f, +0.000072f, -0.000028f, -0.000016f, +0.000016f, -0.000030f, +0.000073f, -0.000071f, -0.000049f, + +0.000010f, +0.000036f, -0.000013f, -0.000013f, +0.000028f, +0.000020f + }, + { + +0.000480f, -0.007684f, -0.000317f, -0.000757f, +0.000452f, -0.000056f, -0.000291f, +0.000164f, -0.000339f, +0.000155f, + +0.000097f, -0.000022f, +0.000715f, -0.000931f, +0.008493f, -0.000062f, -0.002389f, -0.003946f, +0.005762f, -0.000755f, + -0.000358f, -0.001268f, +0.000784f, +0.000079f, +0.000208f, -0.001345f, -0.002167f, -0.000756f, +0.001860f, +0.000177f, + -0.000500f, +0.000505f, -0.000348f, +0.000321f, -0.000491f, +0.000022f, -0.000140f, +0.000026f, -0.000061f, +0.000265f, + -0.000082f, -0.000207f, +0.000215f, +0.000071f, -0.000088f, -0.000193f, -0.000063f, -0.000147f, +0.000093f, -0.000346f, + +0.000157f, -0.000058f, -0.000158f, +0.000089f, -0.000000f, +0.000006f, -0.000059f, +0.000132f, -0.000033f, -0.000120f, + +0.000070f, +0.000083f, -0.000081f, -0.000106f, +0.000051f, +0.000099f, +0.000102f, +0.000067f, -0.000016f, +0.000013f, + +0.000165f, +0.000005f, +0.000026f, +0.000045f, -0.000042f, -0.000070f, +0.000028f, -0.000027f, -0.000004f, +0.000070f, + +0.000028f, +0.000087f, -0.000052f, -0.000062f, +0.000073f, -0.000045f, +0.000016f, +0.000022f, -0.000030f, +0.000011f, + -0.000026f, +0.000010f, +0.000043f, -0.000002f, -0.000047f, -0.000006f + }, + { + -0.004502f, +0.063905f, +0.001711f, +0.004737f, -0.001196f, +0.000004f, -0.000386f, +0.000967f, -0.000460f, -0.000739f, + +0.000879f, +0.000411f, -0.000291f, -0.000991f, +0.000757f, +0.000243f, -0.000082f, -0.000272f, -0.000049f, -0.000127f, + -0.000114f, +0.001013f, -0.000133f, -0.000353f, -0.000149f, -0.000009f, +0.000006f, +0.000404f, -0.000865f, -0.000000f, + +0.000292f, +0.000225f, +0.000121f, +0.000269f, -0.000084f, -0.000140f, +0.000018f, -0.000352f, -0.000047f, +0.000029f, + -0.000205f, +0.000659f, -0.000321f, -0.000214f, +0.000002f, +0.000237f, -0.000005f, -0.000200f, -0.000359f, +0.000013f, + +0.000078f, -0.000311f, +0.000077f, -0.000062f, +0.000315f, -0.000176f, +0.000105f, +0.000113f, +0.000149f, -0.000043f, + -0.000179f, -0.000019f, -0.000000f, +0.000119f, +0.000058f, -0.000037f, -0.000024f, +0.000078f, +0.000019f, -0.000022f, + -0.000013f, +0.000004f, +0.000029f, -0.000038f, +0.000034f, -0.000123f, +0.000039f, +0.000073f, -0.000010f, -0.000026f, + +0.000060f, -0.000001f, -0.000035f, -0.000105f, -0.000021f, +0.000019f, +0.000049f, -0.000008f, +0.000111f, -0.000075f, + +0.000012f, +0.000006f, +0.000026f, +0.000015f, -0.000055f, -0.000008f + }, + { + -0.000538f, -0.000009f, +0.003613f, -0.000177f, +0.000006f, -0.000087f, -0.000099f, -0.000054f, -0.000045f, -0.000011f, + -0.000134f, +0.000288f, +0.000159f, -0.000507f, +0.002195f, -0.000057f, -0.000239f, -0.000222f, -0.000149f, -0.000648f, + -0.000655f, +0.000084f, -0.004711f, -0.000217f, +0.000085f, +0.001127f, -0.000671f, +0.000174f, -0.000526f, +0.000413f, + -0.000463f, +0.000296f, +0.000400f, -0.000437f, +0.000489f, +0.000325f, -0.000099f, +0.000433f, +0.000217f, -0.000064f, + +0.000391f, +0.000072f, -0.000234f, -0.000031f, -0.000152f, +0.000021f, +0.000202f, +0.000140f, -0.000077f, +0.000086f, + -0.000147f, -0.000049f, -0.000075f, +0.000044f, -0.000008f, -0.000044f, -0.000018f, +0.000112f, -0.000008f, -0.000038f, + -0.000048f, -0.000055f, -0.000056f, -0.000079f, -0.000000f, -0.000025f, -0.000237f, +0.000111f, +0.000139f, +0.000042f, + -0.000163f, -0.000044f, +0.000093f, -0.000034f, +0.000030f, +0.000080f, -0.000037f, +0.000045f, +0.000068f, +0.000046f, + -0.000033f, +0.000015f, +0.000000f, -0.000008f, -0.000015f, +0.000006f, +0.000058f, -0.000058f, +0.000013f, +0.000014f, + -0.000056f, -0.000053f, -0.000041f, +0.000027f, -0.000026f, -0.000006f + }, + { + -0.006710f, -0.057630f, -0.003418f, -0.000626f, +0.000201f, +0.000234f, +0.000677f, -0.000216f, -0.000110f, +0.000023f, + +0.000017f, +0.000838f, -0.000810f, -0.000197f, +0.001420f, -0.000149f, +0.000409f, +0.000387f, -0.001037f, -0.000136f, + +0.000377f, -0.000373f, -0.000041f, +0.000746f, +0.000163f, -0.000516f, -0.000359f, +0.000181f, -0.000825f, -0.000515f, + +0.000164f, -0.000264f, -0.000078f, +0.000031f, -0.000394f, -0.000025f, -0.000183f, -0.000594f, +0.000331f, +0.000099f, + -0.000276f, -0.000007f, -0.000031f, -0.000262f, -0.000404f, +0.000220f, +0.000033f, +0.000129f, -0.000633f, +0.000061f, + +0.000089f, +0.000182f, -0.000080f, -0.000238f, -0.000057f, -0.000007f, +0.000196f, +0.000109f, +0.000060f, +0.000058f, + -0.000069f, -0.000117f, -0.000076f, +0.000119f, +0.000087f, -0.000075f, -0.000023f, -0.000028f, +0.000025f, -0.000034f, + -0.000045f, +0.000062f, -0.000076f, +0.000002f, +0.000153f, +0.000044f, -0.000129f, +0.000108f, +0.000054f, -0.000084f, + +0.000084f, -0.000000f, -0.000027f, +0.000000f, +0.000018f, +0.000009f, -0.000039f, +0.000031f, -0.000003f, +0.000045f, + +0.000027f, -0.000049f, +0.000007f, +0.000009f, +0.000033f, -0.000004f + }, + { + -0.000803f, +0.000558f, +0.001647f, +0.000217f, +0.000266f, -0.000051f, -0.000112f, -0.000332f, +0.000191f, +0.000039f, + +0.000145f, -0.000174f, +0.000156f, -0.001115f, -0.002734f, -0.002227f, +0.000600f, -0.002502f, -0.000681f, -0.000074f, + -0.000129f, -0.001144f, -0.001120f, +0.000979f, -0.000527f, +0.001038f, -0.000421f, +0.001987f, -0.000026f, +0.000054f, + +0.000055f, -0.000880f, +0.000579f, -0.000301f, -0.000036f, +0.000109f, +0.000078f, -0.000484f, +0.000287f, +0.000078f, + +0.000038f, +0.000341f, -0.000054f, +0.000108f, -0.000115f, +0.000135f, -0.000070f, -0.000027f, +0.000105f, +0.000114f, + -0.000023f, -0.000076f, -0.000174f, +0.000015f, +0.000212f, +0.000077f, -0.000129f, +0.000082f, +0.000099f, +0.000077f, + +0.000053f, -0.000072f, +0.000003f, +0.000042f, -0.000047f, -0.000058f, -0.000049f, -0.000068f, +0.000098f, +0.000042f, + -0.000003f, +0.000016f, -0.000093f, -0.000109f, +0.000097f, +0.000100f, +0.000041f, -0.000030f, +0.000051f, -0.000051f, + +0.000072f, +0.000010f, -0.000116f, -0.000050f, -0.000007f, -0.000018f, -0.000016f, +0.000093f, -0.000002f, -0.000010f, + -0.000005f, +0.000025f, -0.000008f, -0.000012f, -0.000004f, -0.000007f + }, + { + -0.001546f, +0.004894f, -0.000213f, -0.001062f, -0.000124f, +0.001690f, -0.000478f, -0.000401f, -0.000763f, -0.000398f, + +0.000307f, +0.000111f, +0.000645f, -0.000058f, -0.000103f, -0.000222f, -0.000572f, -0.000015f, +0.000478f, -0.000131f, + -0.000034f, -0.000460f, -0.000076f, -0.000510f, +0.000028f, +0.000073f, +0.000064f, -0.000429f, +0.000070f, -0.000111f, + +0.000231f, +0.000368f, -0.000543f, -0.000091f, +0.000831f, -0.000011f, -0.000237f, -0.000122f, +0.000213f, -0.000243f, + +0.000056f, +0.000229f, +0.000210f, -0.000083f, -0.000326f, +0.000221f, +0.000373f, +0.000024f, +0.000008f, -0.000009f, + +0.000198f, +0.000019f, +0.000105f, +0.000362f, -0.000065f, -0.000173f, +0.000111f, +0.000134f, -0.000073f, +0.000087f, + -0.000251f, -0.000029f, +0.000077f, -0.000020f, +0.000037f, -0.000067f, +0.000061f, +0.000023f, -0.000063f, +0.000049f, + +0.000029f, +0.000006f, -0.000037f, +0.000017f, +0.000003f, +0.000042f, -0.000015f, +0.000068f, -0.000094f, +0.000064f, + +0.000004f, -0.000075f, -0.000046f, +0.000045f, -0.000057f, +0.000018f, +0.000058f, +0.000018f, -0.000010f, +0.000068f, + -0.000004f, +0.000060f, -0.000046f, -0.000021f, -0.000031f, +0.000041f + }, + { + -0.000240f, -0.000149f, +0.001466f, +0.000433f, +0.000028f, +0.000358f, +0.000520f, -0.000814f, -0.000164f, -0.000554f, + +0.000238f, +0.000683f, -0.000536f, -0.000619f, -0.001049f, +0.000610f, +0.000118f, -0.000660f, +0.000004f, +0.001962f, + -0.001424f, -0.000655f, -0.000566f, +0.001054f, -0.000448f, -0.000072f, +0.000464f, -0.000368f, -0.000789f, -0.000067f, + -0.000921f, -0.000308f, -0.000149f, +0.000139f, +0.000003f, +0.000036f, -0.000118f, -0.000415f, +0.000034f, -0.000159f, + +0.000271f, -0.000261f, -0.000093f, +0.000112f, +0.000045f, -0.000180f, +0.000001f, -0.000152f, +0.000150f, +0.000051f, + +0.000147f, +0.000127f, +0.000054f, -0.000094f, -0.000098f, +0.000019f, -0.000066f, -0.000010f, +0.000022f, -0.000050f, + -0.000044f, +0.000197f, +0.000004f, -0.000126f, -0.000045f, +0.000097f, -0.000076f, +0.000023f, +0.000136f, +0.000005f, + +0.000028f, -0.000043f, -0.000043f, -0.000033f, +0.000041f, +0.000015f, +0.000015f, -0.000049f, -0.000125f, +0.000052f, + -0.000004f, -0.000051f, +0.000097f, +0.000035f, -0.000063f, -0.000020f, +0.000017f, -0.000039f, +0.000032f, -0.000057f, + -0.000018f, +0.000003f, -0.000031f, +0.000012f, -0.000005f, +0.000068f + }, + { + -0.002310f, -0.015032f, -0.000020f, -0.001573f, -0.000510f, +0.001423f, -0.000926f, +0.000108f, -0.000497f, +0.000248f, + +0.000763f, -0.001014f, +0.000439f, -0.000257f, -0.000406f, -0.000669f, -0.000019f, +0.000445f, -0.000001f, +0.000112f, + -0.000249f, +0.000264f, -0.000374f, +0.000303f, -0.000181f, +0.000307f, -0.000473f, +0.000608f, -0.000337f, +0.000485f, + -0.000274f, +0.000143f, -0.000027f, -0.000247f, +0.000555f, +0.000082f, -0.000240f, -0.000157f, -0.000347f, -0.000285f, + -0.000068f, -0.000130f, -0.000628f, +0.000089f, -0.000017f, +0.000187f, -0.000128f, -0.000115f, +0.000129f, -0.000073f, + +0.000127f, +0.000192f, -0.000042f, +0.000119f, -0.000077f, +0.000029f, +0.000010f, +0.000127f, +0.000076f, -0.000230f, + +0.000106f, +0.000062f, -0.000108f, -0.000086f, +0.000219f, +0.000010f, -0.000054f, -0.000002f, -0.000117f, -0.000079f, + +0.000147f, -0.000031f, -0.000004f, -0.000004f, +0.000034f, +0.000034f, -0.000010f, +0.000015f, -0.000016f, -0.000034f, + -0.000039f, -0.000013f, +0.000048f, +0.000025f, -0.000004f, +0.000048f, -0.000062f, -0.000001f, -0.000010f, -0.000030f, + +0.000029f, -0.000013f, +0.000061f, +0.000036f, -0.000035f, +0.000007f + }, + { + -0.000115f, +0.003090f, -0.000525f, -0.000551f, +0.000246f, -0.000124f, +0.000355f, -0.000553f, -0.000145f, -0.000073f, + -0.000636f, +0.000592f, -0.001247f, +0.001983f, +0.000374f, +0.003451f, +0.000045f, +0.000078f, +0.000120f, +0.000464f, + +0.000671f, -0.000511f, +0.003170f, +0.001162f, -0.001029f, +0.000339f, -0.000018f, +0.000948f, -0.000454f, -0.000926f, + -0.000269f, -0.000259f, -0.000158f, -0.000012f, -0.000243f, +0.000010f, -0.000458f, +0.000639f, -0.000177f, +0.000207f, + +0.000175f, +0.000123f, -0.000115f, +0.000156f, -0.000106f, -0.000019f, +0.000021f, +0.000129f, +0.000138f, -0.000119f, + -0.000109f, +0.000091f, +0.000308f, -0.000140f, +0.000019f, +0.000243f, +0.000257f, -0.000116f, +0.000039f, +0.000033f, + -0.000191f, -0.000201f, +0.000178f, +0.000027f, +0.000049f, -0.000126f, +0.000164f, +0.000039f, -0.000127f, +0.000093f, + +0.000020f, -0.000024f, -0.000039f, -0.000020f, -0.000059f, +0.000044f, +0.000095f, +0.000056f, -0.000004f, +0.000013f, + +0.000057f, -0.000053f, -0.000069f, -0.000037f, -0.000044f, -0.000020f, -0.000023f, +0.000069f, -0.000013f, +0.000015f, + -0.000016f, -0.000081f, +0.000055f, +0.000061f, -0.000088f, +0.000032f + }, + { + +0.000153f, +0.005064f, +0.001501f, -0.002054f, -0.000344f, -0.001738f, -0.000026f, -0.000168f, +0.000209f, +0.000787f, + -0.000627f, -0.000416f, +0.000459f, -0.000755f, -0.003039f, +0.001124f, -0.001007f, -0.000753f, +0.000219f, -0.000255f, + -0.000301f, -0.000272f, +0.000437f, -0.000444f, -0.000105f, +0.000077f, -0.000220f, -0.000295f, -0.000305f, +0.000588f, + -0.000337f, -0.000195f, +0.000100f, -0.000288f, -0.000174f, -0.000215f, +0.000042f, -0.000247f, -0.000059f, -0.000288f, + +0.000107f, -0.000069f, +0.000180f, +0.000089f, +0.000097f, +0.000058f, -0.000312f, -0.000302f, +0.000047f, -0.000114f, + +0.000303f, -0.000259f, +0.000080f, +0.000143f, -0.000015f, -0.000018f, -0.000129f, -0.000104f, +0.000222f, -0.000040f, + +0.000061f, +0.000061f, +0.000061f, -0.000005f, -0.000061f, -0.000044f, -0.000155f, -0.000004f, +0.000039f, +0.000057f, + -0.000044f, +0.000052f, -0.000012f, +0.000079f, -0.000012f, -0.000037f, -0.000049f, +0.000111f, +0.000024f, -0.000074f, + -0.000051f, +0.000028f, +0.000014f, -0.000084f, -0.000025f, +0.000009f, -0.000110f, +0.000029f, +0.000071f, -0.000004f, + +0.000004f, +0.000046f, -0.000038f, -0.000027f, -0.000035f, +0.000037f + }, + { + +0.000457f, +0.001162f, -0.001232f, -0.000273f, +0.000308f, +0.000086f, -0.000192f, +0.000127f, -0.000196f, +0.000556f, + -0.000158f, -0.000284f, -0.000754f, -0.004757f, +0.007784f, +0.005186f, -0.000878f, -0.000243f, +0.000128f, +0.000164f, + +0.001246f, +0.000258f, -0.000004f, +0.001029f, -0.000521f, -0.000676f, +0.000983f, -0.001180f, +0.000162f, -0.000410f, + -0.000482f, +0.000367f, +0.000233f, +0.000283f, +0.000076f, -0.000661f, +0.000359f, +0.000492f, -0.000464f, +0.000031f, + -0.000299f, -0.000017f, +0.000282f, +0.000565f, -0.000463f, +0.000299f, -0.000008f, +0.000027f, -0.000076f, +0.000069f, + -0.000008f, -0.000021f, +0.000179f, +0.000173f, -0.000024f, -0.000136f, -0.000058f, +0.000001f, -0.000113f, +0.000039f, + +0.000253f, -0.000028f, -0.000029f, -0.000007f, +0.000180f, +0.000035f, +0.000034f, -0.000271f, +0.000079f, +0.000076f, + +0.000008f, -0.000115f, +0.000108f, +0.000072f, +0.000032f, +0.000135f, -0.000093f, -0.000024f, +0.000047f, +0.000061f, + +0.000028f, -0.000021f, -0.000036f, -0.000106f, +0.000100f, -0.000014f, +0.000009f, +0.000032f, +0.000011f, -0.000052f, + +0.000015f, -0.000007f, -0.000044f, +0.000015f, +0.000045f, -0.000009f + } + }, + { + { + +0.003812f, -0.011435f, -0.006723f, +0.003316f, +0.001762f, -0.000076f, -0.000413f, +0.000099f, -0.000187f, -0.001088f, + +0.000277f, +0.000789f, -0.000052f, -0.000618f, -0.001977f, +0.000784f, +0.000647f, -0.000465f, +0.000660f, +0.001342f, + -0.000260f, -0.000108f, +0.000330f, -0.000098f, -0.000164f, +0.000021f, -0.000301f, -0.000982f, +0.000490f, -0.000014f, + -0.000198f, -0.000155f, -0.000246f, -0.000195f, +0.000257f, -0.000577f, -0.000079f, -0.000681f, -0.000079f, +0.000307f, + +0.000065f, -0.000158f, -0.000080f, -0.000248f, +0.000082f, -0.000208f, +0.000346f, +0.000074f, -0.000230f, -0.000214f, + +0.000146f, -0.000201f, +0.000036f, +0.000171f, -0.000146f, +0.000027f, -0.000067f, -0.000070f, -0.000071f, -0.000132f, + +0.000168f, +0.000076f, +0.000064f, -0.000082f, -0.000016f, -0.000032f, -0.000050f, +0.000129f, -0.000007f, +0.000003f, + -0.000029f, -0.000058f, -0.000027f, +0.000088f, +0.000068f, -0.000007f, -0.000099f, +0.000051f, -0.000102f, -0.000012f, + -0.000017f, +0.000006f, +0.000021f, +0.000018f, +0.000046f, -0.000120f, +0.000043f, -0.000025f, -0.000011f, +0.000004f, + +0.000038f, -0.000016f, +0.000027f, +0.000010f, -0.000008f, -0.000009f + }, + { + +0.000035f, +0.005571f, +0.001215f, -0.000424f, +0.000687f, +0.000190f, -0.000094f, -0.000160f, +0.000235f, +0.000175f, + +0.000057f, -0.000335f, -0.000884f, +0.001764f, -0.001796f, +0.002932f, +0.000736f, +0.000629f, +0.001122f, +0.000444f, + -0.000451f, -0.001167f, -0.001009f, -0.000448f, +0.000553f, +0.000908f, +0.000354f, +0.001122f, +0.000420f, +0.000032f, + -0.000525f, +0.000067f, +0.000425f, +0.000470f, +0.000355f, +0.000474f, -0.000338f, -0.000079f, +0.000224f, -0.000032f, + -0.000255f, -0.000026f, +0.000019f, +0.000132f, -0.000135f, -0.000041f, -0.000041f, +0.000063f, -0.000188f, +0.000099f, + -0.000011f, -0.000032f, -0.000178f, +0.000102f, +0.000275f, -0.000106f, -0.000123f, -0.000107f, +0.000004f, -0.000210f, + -0.000056f, +0.000044f, +0.000129f, +0.000013f, -0.000070f, +0.000009f, -0.000138f, +0.000066f, +0.000060f, -0.000009f, + -0.000032f, +0.000104f, +0.000031f, -0.000074f, -0.000031f, +0.000115f, +0.000034f, +0.000010f, -0.000112f, +0.000006f, + +0.000052f, +0.000011f, -0.000079f, +0.000022f, -0.000043f, -0.000019f, +0.000019f, +0.000029f, -0.000070f, +0.000070f, + +0.000002f, -0.000050f, -0.000050f, +0.000019f, +0.000039f, +0.000010f + }, + { + -0.000078f, +0.017696f, +0.002836f, -0.002354f, +0.000667f, +0.000521f, +0.000064f, -0.000157f, +0.000260f, -0.000268f, + +0.000138f, +0.000403f, -0.000085f, -0.000169f, +0.000089f, -0.001502f, +0.000188f, -0.000078f, +0.001915f, -0.000967f, + +0.000729f, -0.001460f, +0.000293f, +0.000208f, -0.000923f, -0.000492f, +0.000374f, +0.000405f, +0.000077f, +0.000135f, + +0.000713f, -0.000777f, +0.000188f, +0.000517f, +0.000781f, -0.000305f, -0.000162f, +0.000031f, +0.000219f, -0.000020f, + +0.000317f, -0.000294f, -0.000161f, -0.000006f, -0.000105f, +0.000178f, -0.000054f, -0.000083f, +0.000060f, +0.000196f, + -0.000238f, -0.000113f, -0.000082f, -0.000094f, -0.000085f, +0.000197f, -0.000026f, +0.000163f, +0.000122f, +0.000056f, + -0.000110f, +0.000046f, +0.000024f, +0.000169f, -0.000136f, -0.000062f, +0.000089f, +0.000038f, -0.000041f, +0.000082f, + +0.000035f, -0.000091f, -0.000045f, +0.000046f, +0.000063f, +0.000115f, -0.000075f, -0.000116f, +0.000120f, +0.000003f, + -0.000016f, -0.000050f, +0.000044f, +0.000032f, -0.000057f, +0.000006f, -0.000002f, +0.000062f, -0.000029f, +0.000010f, + +0.000038f, -0.000004f, -0.000027f, -0.000002f, -0.000002f, -0.000042f + }, + { + +0.008268f, +0.053215f, -0.001790f, -0.005033f, +0.000057f, -0.000000f, +0.000448f, -0.000168f, -0.000179f, +0.000695f, + -0.000115f, -0.000573f, -0.000138f, -0.000110f, -0.000619f, +0.000077f, -0.000361f, +0.000395f, +0.000544f, -0.000429f, + -0.000343f, -0.000076f, +0.000102f, +0.000293f, +0.000259f, +0.000551f, -0.000711f, -0.000264f, +0.000019f, +0.000165f, + +0.000356f, +0.000310f, +0.000045f, +0.000193f, +0.000038f, +0.000301f, -0.000105f, +0.000332f, -0.000486f, -0.000238f, + +0.000582f, -0.000226f, -0.000103f, +0.000255f, -0.000092f, -0.000239f, +0.000264f, +0.000143f, +0.000104f, +0.000020f, + -0.000203f, +0.000292f, -0.000086f, +0.000111f, +0.000058f, +0.000079f, +0.000137f, -0.000159f, +0.000099f, -0.000056f, + -0.000096f, +0.000042f, +0.000126f, -0.000172f, +0.000068f, +0.000018f, -0.000075f, +0.000149f, -0.000075f, -0.000005f, + +0.000050f, +0.000174f, -0.000065f, -0.000053f, +0.000017f, -0.000001f, +0.000020f, -0.000004f, -0.000044f, -0.000051f, + +0.000003f, -0.000015f, +0.000079f, -0.000030f, +0.000012f, +0.000032f, -0.000044f, +0.000042f, -0.000026f, -0.000054f, + -0.000016f, +0.000037f, +0.000005f, -0.000023f, +0.000025f, +0.000008f + }, + { + +0.000033f, -0.006470f, -0.000535f, -0.000453f, +0.000314f, +0.000016f, -0.000345f, +0.000022f, -0.000248f, -0.000174f, + +0.000174f, +0.000262f, +0.000018f, +0.001369f, +0.005692f, +0.001813f, -0.003129f, -0.003073f, +0.001471f, +0.000583f, + +0.000082f, -0.000515f, -0.000483f, +0.002117f, -0.001365f, -0.000961f, -0.001270f, -0.001465f, +0.001518f, +0.001491f, + -0.000641f, +0.000887f, -0.000401f, -0.000076f, -0.000349f, +0.000033f, -0.000106f, -0.000389f, -0.000073f, -0.000160f, + +0.000026f, -0.000120f, +0.000066f, -0.000045f, +0.000080f, -0.000264f, -0.000117f, -0.000176f, +0.000105f, -0.000291f, + -0.000047f, +0.000201f, -0.000278f, +0.000196f, -0.000051f, +0.000132f, -0.000069f, +0.000061f, +0.000137f, -0.000178f, + -0.000036f, +0.000077f, -0.000069f, -0.000117f, -0.000043f, +0.000073f, +0.000039f, +0.000107f, +0.000005f, -0.000044f, + +0.000226f, +0.000084f, +0.000002f, +0.000040f, -0.000006f, -0.000101f, +0.000001f, -0.000034f, -0.000070f, +0.000025f, + -0.000014f, +0.000091f, +0.000039f, -0.000099f, +0.000050f, -0.000020f, +0.000017f, +0.000042f, -0.000035f, -0.000004f, + -0.000033f, -0.000003f, +0.000048f, +0.000015f, -0.000061f, -0.000017f + }, + { + +0.014156f, +0.043773f, -0.001579f, +0.002916f, +0.000020f, +0.000113f, -0.000452f, +0.000597f, -0.000107f, -0.001152f, + +0.000688f, +0.000399f, +0.000255f, +0.000334f, -0.001270f, +0.000502f, -0.000053f, -0.000431f, +0.000089f, -0.000306f, + -0.000250f, +0.000341f, +0.000558f, -0.000134f, -0.000408f, +0.000330f, -0.000377f, +0.000584f, -0.000701f, -0.000187f, + +0.000292f, +0.000542f, +0.000008f, -0.000089f, -0.000097f, +0.000194f, -0.000187f, -0.000048f, -0.000356f, +0.000019f, + +0.000013f, +0.000224f, -0.000042f, -0.000256f, +0.000349f, -0.000088f, +0.000395f, -0.000285f, -0.000285f, -0.000172f, + +0.000279f, -0.000183f, -0.000193f, -0.000153f, +0.000281f, -0.000039f, -0.000117f, +0.000032f, +0.000076f, -0.000017f, + +0.000013f, -0.000129f, -0.000063f, +0.000098f, +0.000119f, -0.000014f, +0.000006f, +0.000048f, +0.000020f, -0.000006f, + +0.000002f, -0.000023f, +0.000059f, -0.000057f, +0.000052f, -0.000114f, -0.000014f, +0.000041f, +0.000027f, -0.000004f, + +0.000047f, +0.000088f, -0.000002f, -0.000084f, -0.000056f, -0.000021f, +0.000029f, -0.000041f, +0.000099f, -0.000029f, + -0.000005f, +0.000007f, +0.000006f, +0.000044f, -0.000038f, -0.000026f + }, + { + -0.000212f, -0.000617f, +0.002236f, +0.000422f, +0.000020f, -0.000066f, -0.000243f, -0.000136f, -0.000048f, +0.000231f, + -0.000128f, +0.000127f, +0.000148f, +0.000009f, +0.003645f, +0.001042f, -0.000397f, +0.000278f, -0.000021f, -0.001372f, + -0.000311f, -0.000561f, -0.005098f, +0.001133f, -0.000254f, +0.001895f, -0.001498f, -0.000408f, +0.000296f, +0.000526f, + -0.000709f, +0.000160f, +0.000544f, -0.000477f, +0.000149f, +0.000033f, +0.000252f, -0.000001f, +0.000311f, -0.000134f, + +0.000200f, +0.000094f, -0.000094f, -0.000052f, -0.000246f, -0.000148f, +0.000318f, -0.000038f, +0.000004f, +0.000083f, + -0.000013f, -0.000142f, -0.000105f, +0.000051f, +0.000078f, -0.000083f, -0.000146f, +0.000178f, -0.000064f, -0.000042f, + -0.000045f, +0.000023f, -0.000090f, -0.000049f, +0.000002f, -0.000065f, -0.000163f, -0.000039f, +0.000135f, +0.000087f, + -0.000048f, -0.000122f, +0.000025f, +0.000018f, -0.000087f, +0.000027f, -0.000040f, -0.000027f, +0.000043f, +0.000071f, + -0.000017f, -0.000004f, -0.000009f, +0.000008f, -0.000029f, -0.000012f, +0.000075f, -0.000018f, +0.000037f, +0.000062f, + -0.000001f, -0.000024f, -0.000047f, +0.000019f, +0.000005f, -0.000027f + }, + { + -0.000610f, -0.067001f, -0.001819f, -0.001149f, +0.000317f, -0.000064f, +0.001404f, -0.000310f, -0.000205f, +0.000006f, + -0.000010f, +0.000652f, -0.000120f, -0.000051f, +0.000799f, -0.000170f, +0.000077f, +0.001278f, -0.000838f, -0.000882f, + +0.000427f, +0.000120f, -0.000703f, +0.000440f, +0.000270f, -0.000386f, -0.000173f, -0.000299f, -0.000323f, -0.000273f, + -0.000223f, -0.000281f, -0.000303f, -0.000095f, -0.000292f, -0.000356f, -0.000033f, -0.000439f, +0.000047f, +0.000336f, + -0.000180f, -0.000045f, -0.000189f, -0.000001f, -0.000416f, +0.000476f, +0.000048f, +0.000154f, -0.000333f, -0.000064f, + -0.000104f, +0.000371f, +0.000197f, -0.000238f, -0.000071f, -0.000084f, +0.000003f, +0.000078f, +0.000095f, +0.000053f, + +0.000087f, -0.000087f, -0.000127f, +0.000055f, +0.000150f, -0.000010f, -0.000025f, -0.000084f, +0.000042f, -0.000032f, + -0.000052f, +0.000056f, -0.000069f, -0.000112f, +0.000092f, +0.000130f, -0.000173f, +0.000046f, +0.000052f, -0.000044f, + +0.000008f, +0.000053f, -0.000021f, +0.000019f, +0.000034f, +0.000001f, -0.000078f, +0.000011f, +0.000006f, +0.000019f, + +0.000018f, -0.000041f, -0.000004f, -0.000012f, +0.000022f, +0.000018f + }, + { + -0.000318f, -0.001686f, +0.001180f, +0.000132f, +0.000233f, +0.000046f, -0.000045f, -0.000422f, +0.000189f, +0.000135f, + +0.000271f, -0.000052f, -0.000075f, -0.002806f, -0.000383f, +0.001129f, -0.001605f, -0.000544f, -0.000857f, -0.000819f, + +0.000209f, -0.000834f, +0.000253f, -0.001403f, -0.000054f, +0.001473f, -0.000080f, +0.001111f, -0.000126f, +0.000065f, + +0.000150f, -0.000372f, +0.000388f, -0.000196f, -0.000433f, +0.000139f, -0.000013f, -0.000379f, +0.000383f, +0.000003f, + -0.000178f, +0.000229f, +0.000084f, -0.000301f, +0.000019f, -0.000145f, -0.000118f, +0.000202f, -0.000003f, +0.000091f, + +0.000110f, -0.000060f, -0.000181f, -0.000048f, +0.000262f, +0.000107f, -0.000181f, -0.000039f, -0.000059f, +0.000112f, + +0.000118f, +0.000152f, -0.000051f, +0.000044f, +0.000038f, -0.000032f, +0.000025f, -0.000058f, +0.000061f, +0.000098f, + +0.000079f, +0.000053f, -0.000052f, -0.000134f, +0.000039f, +0.000105f, +0.000070f, -0.000040f, +0.000043f, -0.000039f, + +0.000023f, +0.000086f, -0.000076f, -0.000053f, -0.000019f, -0.000048f, -0.000061f, +0.000030f, +0.000045f, -0.000008f, + -0.000035f, +0.000029f, +0.000002f, -0.000009f, -0.000006f, -0.000041f + }, + { + +0.001896f, -0.005000f, +0.000813f, +0.001174f, -0.000293f, -0.000207f, +0.000673f, -0.000269f, -0.000940f, -0.000627f, + +0.000230f, -0.000203f, +0.000508f, +0.000749f, -0.000694f, +0.000089f, -0.000724f, +0.000047f, +0.000238f, +0.000137f, + -0.000414f, -0.000409f, -0.000245f, -0.000037f, -0.000189f, -0.000037f, -0.000239f, -0.000075f, +0.000065f, -0.000221f, + -0.000114f, +0.000201f, -0.000531f, -0.000401f, +0.000668f, +0.000393f, +0.000035f, -0.000125f, +0.000170f, -0.000176f, + -0.000141f, +0.000021f, +0.000192f, +0.000185f, -0.000319f, +0.000062f, +0.000384f, -0.000017f, -0.000091f, -0.000021f, + +0.000099f, -0.000007f, -0.000083f, +0.000210f, +0.000124f, -0.000132f, +0.000119f, +0.000118f, -0.000071f, +0.000140f, + -0.000112f, -0.000108f, +0.000049f, -0.000066f, +0.000099f, -0.000063f, -0.000001f, +0.000021f, -0.000077f, +0.000038f, + +0.000050f, +0.000016f, -0.000107f, +0.000044f, -0.000007f, +0.000046f, -0.000073f, +0.000102f, -0.000062f, +0.000071f, + +0.000034f, -0.000040f, -0.000083f, +0.000014f, -0.000080f, -0.000070f, +0.000024f, +0.000014f, -0.000027f, +0.000035f, + -0.000021f, +0.000074f, -0.000005f, -0.000033f, -0.000043f, +0.000008f + }, + { + +0.000374f, +0.003632f, -0.001044f, -0.000232f, -0.000129f, -0.000028f, +0.000310f, -0.000643f, -0.000465f, -0.000386f, + -0.000223f, +0.000556f, -0.000293f, -0.000082f, -0.001506f, -0.000219f, +0.001129f, -0.000477f, +0.000025f, +0.001911f, + -0.000194f, -0.001118f, -0.000002f, +0.000153f, -0.000023f, -0.000642f, +0.000282f, -0.000311f, -0.000098f, +0.000005f, + -0.000747f, -0.000289f, -0.000533f, +0.000102f, -0.000215f, +0.000416f, -0.000096f, -0.000226f, +0.000075f, -0.000232f, + +0.000186f, -0.000055f, -0.000160f, -0.000053f, -0.000020f, -0.000225f, -0.000018f, -0.000031f, -0.000062f, +0.000006f, + +0.000029f, +0.000140f, +0.000175f, +0.000059f, -0.000086f, +0.000023f, -0.000055f, -0.000068f, +0.000021f, -0.000035f, + -0.000104f, +0.000117f, +0.000057f, -0.000102f, -0.000121f, +0.000074f, -0.000049f, -0.000067f, +0.000064f, +0.000028f, + +0.000040f, +0.000037f, -0.000032f, -0.000057f, +0.000031f, +0.000051f, +0.000074f, +0.000018f, -0.000108f, +0.000009f, + -0.000009f, -0.000050f, +0.000071f, +0.000084f, -0.000013f, -0.000039f, +0.000045f, -0.000008f, +0.000075f, -0.000033f, + -0.000029f, -0.000000f, -0.000020f, +0.000023f, -0.000030f, +0.000047f + }, + { + -0.000774f, -0.018949f, -0.000005f, -0.000322f, -0.000667f, +0.000288f, +0.000345f, -0.000241f, +0.000039f, -0.000334f, + +0.000794f, -0.000047f, +0.000285f, -0.000518f, -0.000289f, -0.000144f, +0.000028f, +0.000321f, -0.000226f, +0.000209f, + -0.000525f, +0.000056f, +0.000089f, +0.000033f, -0.000306f, +0.000345f, -0.000339f, +0.000348f, -0.000179f, +0.000467f, + +0.000174f, -0.000125f, +0.000008f, -0.000032f, +0.000321f, +0.000414f, +0.000242f, -0.000026f, -0.000323f, -0.000259f, + -0.000308f, -0.000165f, -0.000310f, -0.000106f, -0.000126f, -0.000030f, +0.000104f, -0.000020f, +0.000074f, -0.000029f, + -0.000124f, +0.000177f, -0.000108f, +0.000162f, +0.000013f, +0.000102f, +0.000022f, +0.000049f, +0.000225f, -0.000291f, + +0.000051f, +0.000060f, -0.000038f, -0.000116f, +0.000172f, +0.000020f, -0.000016f, +0.000022f, -0.000083f, -0.000125f, + +0.000109f, +0.000011f, -0.000039f, -0.000019f, -0.000001f, +0.000033f, +0.000003f, +0.000044f, +0.000027f, -0.000051f, + -0.000014f, -0.000077f, +0.000028f, +0.000003f, -0.000023f, +0.000073f, -0.000041f, -0.000005f, -0.000010f, -0.000072f, + -0.000002f, -0.000041f, +0.000030f, +0.000040f, -0.000019f, -0.000006f + }, + { + +0.000101f, +0.002328f, +0.000457f, -0.000437f, +0.000049f, -0.000136f, +0.000425f, -0.000097f, -0.000289f, -0.000691f, + -0.000397f, +0.000243f, +0.001545f, -0.001485f, +0.000028f, +0.003356f, +0.000838f, -0.000756f, +0.000382f, +0.000131f, + +0.003315f, -0.001180f, +0.001592f, +0.000679f, +0.000601f, -0.000545f, +0.000539f, +0.000318f, -0.000090f, -0.001058f, + -0.000338f, -0.000152f, -0.000147f, +0.000070f, -0.000279f, +0.000220f, -0.000367f, +0.000449f, -0.000219f, +0.000142f, + +0.000064f, +0.000016f, -0.000053f, +0.000167f, -0.000167f, +0.000021f, +0.000094f, -0.000106f, +0.000084f, -0.000087f, + -0.000082f, -0.000025f, +0.000190f, -0.000033f, -0.000043f, +0.000012f, +0.000280f, -0.000061f, +0.000008f, +0.000145f, + -0.000103f, -0.000250f, +0.000031f, +0.000088f, +0.000108f, -0.000106f, +0.000110f, +0.000128f, -0.000130f, -0.000009f, + +0.000061f, -0.000012f, -0.000020f, -0.000010f, -0.000091f, -0.000058f, +0.000065f, +0.000042f, +0.000035f, +0.000023f, + +0.000062f, +0.000010f, -0.000057f, +0.000013f, -0.000036f, +0.000007f, -0.000073f, +0.000065f, +0.000020f, +0.000002f, + +0.000006f, -0.000090f, -0.000016f, +0.000068f, -0.000066f, -0.000030f + }, + { + +0.000898f, +0.006315f, -0.000280f, -0.000004f, -0.000029f, -0.001378f, -0.001251f, +0.000039f, -0.000273f, +0.000526f, + -0.000679f, -0.000202f, +0.000347f, -0.001052f, -0.001724f, +0.000441f, +0.000028f, -0.000315f, -0.000066f, -0.000152f, + +0.000051f, -0.000617f, +0.000559f, -0.000603f, -0.000140f, -0.000333f, -0.000244f, -0.000562f, -0.000278f, +0.000317f, + -0.000211f, +0.000058f, +0.000198f, -0.000108f, -0.000005f, -0.000246f, +0.000037f, -0.000302f, -0.000091f, -0.000126f, + +0.000046f, -0.000210f, +0.000143f, +0.000238f, +0.000128f, +0.000143f, -0.000246f, -0.000239f, -0.000028f, -0.000073f, + +0.000217f, -0.000020f, -0.000157f, +0.000049f, +0.000202f, +0.000031f, -0.000057f, -0.000130f, +0.000163f, +0.000034f, + +0.000099f, -0.000004f, +0.000067f, +0.000103f, -0.000048f, +0.000006f, -0.000135f, -0.000022f, +0.000006f, +0.000086f, + -0.000060f, +0.000029f, +0.000003f, +0.000053f, +0.000009f, +0.000001f, -0.000065f, +0.000096f, +0.000101f, -0.000008f, + -0.000062f, +0.000024f, +0.000060f, -0.000046f, -0.000018f, +0.000061f, -0.000091f, -0.000050f, +0.000046f, +0.000026f, + -0.000004f, +0.000068f, -0.000012f, -0.000012f, -0.000027f, +0.000018f + }, + { + -0.000156f, +0.003133f, -0.001743f, -0.000375f, +0.000238f, -0.000076f, +0.000383f, +0.000160f, -0.000393f, +0.000207f, + +0.000089f, +0.000438f, -0.002125f, +0.004561f, -0.004495f, +0.004301f, +0.000800f, +0.000721f, -0.000090f, +0.000257f, + +0.001897f, +0.000066f, -0.000189f, +0.000254f, -0.000261f, -0.000322f, +0.000370f, -0.000112f, -0.000595f, +0.000067f, + -0.000847f, -0.000078f, +0.000641f, -0.000094f, +0.000216f, -0.000406f, -0.000122f, +0.000236f, +0.000273f, -0.000321f, + -0.000290f, -0.000333f, +0.000243f, +0.000389f, -0.000197f, +0.000009f, +0.000128f, +0.000017f, -0.000139f, +0.000033f, + +0.000047f, +0.000028f, +0.000014f, +0.000086f, +0.000108f, -0.000032f, -0.000177f, +0.000041f, -0.000220f, -0.000177f, + +0.000103f, +0.000124f, -0.000162f, -0.000033f, +0.000065f, +0.000076f, +0.000176f, -0.000285f, +0.000016f, +0.000019f, + +0.000058f, -0.000136f, -0.000015f, +0.000053f, -0.000041f, +0.000151f, -0.000050f, -0.000067f, +0.000006f, +0.000033f, + +0.000111f, +0.000001f, +0.000052f, -0.000098f, +0.000028f, -0.000000f, +0.000007f, +0.000041f, +0.000019f, -0.000025f, + +0.000001f, +0.000031f, -0.000040f, -0.000008f, +0.000018f, +0.000013f + } + }, + { + { + -0.002133f, +0.013127f, +0.010778f, +0.000181f, -0.001480f, +0.000319f, +0.000430f, +0.000187f, +0.000358f, -0.000332f, + -0.000688f, -0.000216f, +0.000261f, +0.000817f, +0.000244f, -0.000098f, +0.000729f, -0.000508f, +0.000605f, -0.000668f, + +0.000037f, +0.000297f, +0.000597f, +0.000011f, -0.000189f, -0.000298f, +0.000257f, -0.001031f, +0.000546f, -0.000126f, + -0.000143f, +0.000234f, -0.000017f, +0.000246f, +0.000067f, +0.000153f, +0.000238f, -0.000390f, -0.000257f, +0.000131f, + +0.000162f, +0.000043f, -0.000216f, -0.000214f, +0.000410f, -0.000506f, -0.000083f, +0.000107f, -0.000149f, -0.000142f, + -0.000005f, -0.000204f, -0.000057f, +0.000023f, -0.000038f, +0.000029f, -0.000089f, +0.000035f, +0.000150f, +0.000051f, + -0.000094f, -0.000076f, -0.000008f, +0.000065f, -0.000015f, +0.000058f, +0.000055f, -0.000078f, +0.000000f, -0.000017f, + +0.000048f, +0.000053f, +0.000009f, -0.000035f, -0.000057f, +0.000121f, +0.000018f, -0.000064f, +0.000098f, -0.000043f, + -0.000016f, -0.000093f, -0.000027f, +0.000003f, -0.000025f, +0.000071f, -0.000068f, +0.000039f, -0.000015f, -0.000026f, + -0.000022f, +0.000014f, -0.000025f, +0.000030f, +0.000018f, +0.000004f + }, + { + +0.000099f, +0.002116f, -0.001287f, +0.000607f, -0.000746f, +0.000050f, +0.000091f, -0.000060f, -0.000548f, +0.000532f, + -0.000009f, -0.000122f, -0.001086f, +0.000734f, -0.004831f, +0.001120f, +0.001167f, -0.000782f, -0.000707f, +0.001241f, + -0.000423f, -0.000801f, +0.000509f, +0.000254f, -0.000171f, -0.000683f, -0.000720f, +0.000094f, +0.000285f, +0.000411f, + +0.000042f, +0.000772f, -0.000095f, -0.000371f, +0.000505f, -0.000006f, -0.000117f, -0.000264f, -0.000074f, -0.000058f, + +0.000075f, -0.000002f, -0.000268f, -0.000133f, +0.000180f, -0.000238f, -0.000210f, -0.000109f, +0.000181f, +0.000137f, + -0.000157f, +0.000375f, -0.000056f, -0.000082f, -0.000341f, +0.000227f, +0.000111f, -0.000102f, -0.000003f, +0.000078f, + -0.000052f, -0.000066f, +0.000038f, +0.000085f, +0.000053f, -0.000007f, +0.000094f, -0.000126f, -0.000101f, +0.000021f, + +0.000029f, -0.000087f, +0.000086f, +0.000095f, -0.000016f, -0.000107f, +0.000033f, +0.000112f, +0.000033f, -0.000023f, + -0.000118f, +0.000083f, +0.000061f, -0.000001f, +0.000021f, -0.000021f, -0.000053f, +0.000005f, +0.000015f, -0.000097f, + +0.000027f, +0.000048f, +0.000014f, -0.000016f, -0.000045f, -0.000007f + }, + { + +0.000066f, +0.006779f, -0.002095f, +0.000881f, -0.000909f, +0.000015f, -0.000089f, -0.000463f, +0.000089f, +0.000427f, + +0.000282f, +0.000044f, -0.000202f, +0.001103f, +0.000377f, -0.000427f, +0.000253f, -0.000251f, +0.000123f, -0.000929f, + +0.000477f, -0.000949f, -0.000013f, +0.000421f, -0.000200f, +0.000099f, -0.000082f, -0.000317f, +0.000221f, -0.000306f, + +0.000211f, +0.000231f, +0.000189f, +0.000029f, +0.000179f, +0.000499f, -0.000067f, -0.000109f, +0.000100f, -0.000154f, + +0.000096f, -0.000036f, +0.000394f, -0.000308f, -0.000050f, -0.000186f, -0.000044f, -0.000107f, -0.000123f, -0.000057f, + +0.000155f, +0.000110f, -0.000222f, +0.000020f, -0.000168f, -0.000122f, -0.000031f, -0.000072f, +0.000022f, +0.000072f, + +0.000060f, -0.000067f, -0.000030f, -0.000126f, +0.000080f, -0.000096f, -0.000036f, +0.000012f, +0.000096f, -0.000062f, + -0.000007f, +0.000121f, -0.000046f, -0.000049f, +0.000004f, +0.000008f, +0.000108f, +0.000017f, -0.000045f, +0.000002f, + +0.000043f, -0.000000f, -0.000069f, +0.000053f, +0.000071f, -0.000023f, -0.000037f, -0.000041f, +0.000032f, -0.000012f, + -0.000026f, +0.000012f, +0.000038f, -0.000020f, +0.000027f, +0.000045f + }, + { + -0.013188f, +0.027633f, +0.002104f, -0.004124f, +0.000554f, -0.000147f, -0.000290f, -0.000079f, -0.000482f, -0.000164f, + +0.000212f, +0.000674f, +0.000228f, -0.000362f, -0.001468f, +0.000677f, +0.000163f, +0.000016f, +0.000421f, +0.000039f, + -0.000029f, +0.000593f, -0.000164f, -0.000221f, +0.000245f, +0.000199f, +0.000344f, -0.000255f, +0.000460f, -0.000198f, + -0.000358f, +0.000167f, -0.000138f, -0.000148f, +0.000201f, -0.000476f, -0.000190f, -0.000217f, -0.000056f, -0.000003f, + +0.000064f, -0.000193f, -0.000146f, +0.000020f, +0.000215f, +0.000073f, -0.000329f, -0.000158f, -0.000204f, +0.000221f, + -0.000198f, +0.000071f, +0.000113f, -0.000069f, +0.000131f, +0.000012f, +0.000035f, -0.000178f, -0.000088f, +0.000148f, + +0.000154f, -0.000034f, -0.000134f, -0.000025f, -0.000053f, -0.000030f, +0.000059f, -0.000074f, +0.000088f, -0.000042f, + -0.000112f, -0.000030f, +0.000155f, +0.000027f, -0.000017f, +0.000032f, -0.000019f, -0.000014f, -0.000019f, +0.000030f, + -0.000006f, -0.000046f, -0.000049f, +0.000001f, -0.000013f, +0.000017f, +0.000038f, -0.000069f, +0.000068f, +0.000032f, + -0.000022f, -0.000036f, +0.000018f, +0.000013f, -0.000018f, -0.000031f + }, + { + -0.000279f, -0.006495f, +0.001004f, +0.000501f, -0.000359f, +0.000107f, +0.000075f, +0.000075f, -0.000010f, -0.000274f, + +0.000000f, -0.000128f, +0.000330f, -0.001575f, +0.000299f, +0.001192f, -0.000448f, +0.002894f, -0.005711f, -0.000593f, + -0.000192f, +0.000460f, -0.000934f, +0.001866f, -0.000325f, -0.000466f, +0.002064f, -0.000369f, +0.000826f, +0.000995f, + -0.000824f, +0.000563f, +0.000770f, +0.000072f, +0.000001f, -0.000243f, -0.000191f, -0.000165f, -0.000034f, +0.000027f, + +0.000136f, +0.000361f, +0.000000f, -0.000311f, +0.000301f, -0.000046f, -0.000058f, +0.000188f, +0.000200f, +0.000159f, + -0.000230f, +0.000130f, +0.000205f, +0.000049f, -0.000171f, +0.000138f, +0.000090f, -0.000093f, +0.000090f, +0.000001f, + -0.000108f, -0.000068f, +0.000007f, -0.000016f, -0.000000f, -0.000028f, -0.000070f, -0.000046f, +0.000022f, +0.000017f, + -0.000074f, +0.000041f, +0.000029f, -0.000020f, +0.000025f, +0.000078f, -0.000019f, +0.000036f, +0.000015f, -0.000069f, + -0.000037f, -0.000098f, +0.000039f, +0.000055f, -0.000089f, +0.000047f, -0.000020f, -0.000008f, +0.000030f, -0.000009f, + +0.000003f, -0.000009f, -0.000051f, -0.000003f, +0.000054f, +0.000012f + }, + { + -0.018207f, +0.002215f, +0.002852f, +0.002306f, +0.000009f, +0.000039f, +0.000070f, -0.001291f, +0.000522f, +0.000821f, + -0.000817f, -0.000649f, +0.000117f, +0.000698f, -0.001364f, -0.000041f, +0.000184f, +0.000235f, -0.000191f, +0.000229f, + +0.000411f, -0.000544f, +0.000177f, +0.000305f, -0.000016f, +0.000037f, -0.000377f, +0.000118f, -0.000146f, +0.000200f, + -0.000063f, +0.000123f, +0.000021f, -0.000068f, -0.000315f, +0.000526f, -0.000064f, -0.000117f, -0.000169f, +0.000301f, + +0.000278f, -0.000348f, +0.000051f, +0.000087f, +0.000621f, -0.000315f, +0.000297f, -0.000023f, +0.000042f, -0.000145f, + -0.000130f, +0.000252f, +0.000074f, -0.000031f, -0.000213f, +0.000115f, -0.000111f, -0.000155f, -0.000133f, +0.000016f, + +0.000172f, +0.000040f, -0.000067f, -0.000095f, -0.000114f, +0.000007f, +0.000091f, -0.000087f, +0.000028f, +0.000050f, + +0.000035f, -0.000016f, -0.000078f, +0.000018f, -0.000007f, +0.000034f, -0.000045f, -0.000076f, +0.000011f, +0.000022f, + -0.000075f, -0.000009f, +0.000033f, +0.000113f, +0.000010f, +0.000001f, -0.000045f, +0.000032f, -0.000088f, +0.000051f, + -0.000003f, -0.000013f, -0.000015f, -0.000023f, +0.000039f, -0.000001f + }, + { + +0.000485f, +0.001339f, -0.001365f, +0.000007f, +0.000016f, +0.000134f, +0.000019f, -0.000011f, -0.000421f, +0.000190f, + +0.000085f, +0.000124f, -0.000114f, -0.000568f, +0.003899f, +0.002448f, +0.001792f, +0.000002f, +0.000138f, -0.000991f, + +0.000302f, +0.000400f, -0.003159f, +0.001440f, -0.000129f, +0.000643f, -0.001115f, -0.001162f, +0.000505f, +0.000118f, + -0.000363f, +0.000072f, -0.000232f, +0.000371f, -0.000101f, -0.000503f, +0.000372f, -0.000101f, +0.000209f, +0.000302f, + -0.000215f, -0.000255f, +0.000289f, -0.000175f, +0.000277f, +0.000018f, -0.000102f, -0.000187f, +0.000079f, -0.000063f, + +0.000227f, +0.000002f, -0.000045f, -0.000052f, +0.000058f, -0.000009f, -0.000028f, -0.000128f, -0.000030f, -0.000028f, + -0.000118f, -0.000036f, +0.000076f, +0.000013f, +0.000005f, +0.000016f, +0.000091f, -0.000074f, -0.000112f, -0.000098f, + +0.000191f, +0.000056f, -0.000087f, +0.000027f, -0.000011f, -0.000051f, +0.000017f, -0.000069f, -0.000060f, -0.000040f, + +0.000036f, -0.000010f, +0.000017f, +0.000006f, +0.000003f, -0.000025f, -0.000043f, +0.000033f, +0.000002f, -0.000010f, + +0.000041f, +0.000039f, +0.000045f, -0.000035f, +0.000033f, +0.000009f + }, + { + +0.008606f, -0.061039f, -0.001233f, -0.000386f, +0.000399f, -0.000249f, +0.000433f, +0.000265f, -0.000094f, +0.000335f, + -0.000025f, -0.000717f, +0.000784f, -0.000057f, -0.000719f, +0.000057f, -0.000434f, -0.000174f, +0.000873f, +0.000460f, + -0.000329f, +0.000395f, -0.000636f, -0.000591f, -0.000223f, +0.000245f, -0.000121f, -0.000083f, -0.000202f, -0.000040f, + -0.000397f, -0.000423f, +0.000055f, +0.000106f, +0.000296f, -0.000019f, -0.000495f, -0.000221f, +0.000014f, +0.000102f, + +0.000070f, +0.000239f, +0.000039f, -0.000219f, +0.000242f, +0.000305f, -0.000050f, +0.000152f, +0.000369f, +0.000067f, + -0.000204f, -0.000195f, +0.000049f, +0.000299f, +0.000064f, +0.000009f, -0.000169f, -0.000005f, -0.000065f, -0.000074f, + +0.000117f, +0.000157f, +0.000082f, -0.000104f, -0.000042f, +0.000034f, +0.000007f, -0.000005f, -0.000023f, +0.000056f, + +0.000038f, -0.000021f, +0.000046f, +0.000006f, -0.000146f, -0.000003f, +0.000132f, -0.000102f, -0.000045f, +0.000043f, + -0.000085f, -0.000008f, +0.000002f, +0.000023f, +0.000024f, +0.000027f, +0.000035f, -0.000035f, +0.000016f, -0.000026f, + -0.000030f, +0.000018f, +0.000017f, -0.000020f, -0.000028f, +0.000003f + }, + { + +0.000740f, +0.000946f, -0.003205f, +0.000381f, -0.000374f, -0.000007f, +0.000262f, +0.000475f, +0.000151f, -0.000069f, + +0.000143f, -0.000057f, +0.000511f, +0.002314f, +0.003497f, +0.004022f, -0.000682f, +0.000103f, +0.000259f, -0.000818f, + -0.001135f, +0.000053f, +0.000848f, -0.000158f, -0.001057f, -0.000245f, +0.001048f, -0.000619f, -0.000371f, +0.000123f, + -0.000336f, +0.000457f, -0.000194f, +0.000191f, +0.000131f, -0.000521f, -0.000110f, +0.000129f, -0.000263f, +0.000202f, + +0.000005f, -0.000274f, +0.000440f, -0.000038f, +0.000110f, -0.000357f, -0.000028f, +0.000143f, -0.000088f, -0.000185f, + +0.000112f, +0.000058f, +0.000167f, -0.000126f, -0.000057f, -0.000030f, +0.000198f, +0.000019f, -0.000300f, -0.000071f, + -0.000062f, +0.000079f, +0.000003f, -0.000119f, +0.000068f, +0.000109f, +0.000145f, +0.000069f, -0.000037f, -0.000027f, + -0.000001f, +0.000028f, +0.000077f, +0.000093f, -0.000055f, -0.000029f, +0.000007f, +0.000011f, -0.000056f, +0.000018f, + -0.000088f, -0.000012f, +0.000095f, +0.000045f, +0.000038f, +0.000021f, -0.000001f, -0.000095f, -0.000014f, +0.000004f, + +0.000003f, -0.000031f, +0.000012f, +0.000025f, +0.000012f, +0.000024f + }, + { + -0.001307f, -0.015003f, -0.001682f, +0.001021f, +0.000424f, -0.001813f, +0.000593f, +0.000018f, +0.000360f, +0.000353f, + +0.000045f, -0.000190f, -0.000557f, -0.000373f, -0.000077f, -0.001087f, -0.000197f, +0.000348f, -0.000478f, +0.000033f, + +0.000512f, -0.000397f, +0.000050f, +0.000342f, +0.000238f, -0.000346f, -0.000366f, +0.000514f, -0.000186f, -0.000590f, + -0.000244f, -0.000273f, -0.000154f, -0.000066f, -0.000277f, -0.000186f, +0.000327f, +0.000121f, -0.000322f, +0.000341f, + -0.000220f, -0.000128f, -0.000162f, +0.000190f, +0.000395f, -0.000159f, -0.000284f, +0.000012f, +0.000256f, +0.000055f, + -0.000323f, +0.000102f, -0.000169f, -0.000447f, +0.000218f, +0.000143f, -0.000033f, -0.000074f, +0.000084f, -0.000127f, + +0.000239f, +0.000002f, +0.000003f, -0.000083f, -0.000019f, +0.000093f, -0.000049f, +0.000002f, +0.000069f, -0.000034f, + -0.000036f, -0.000023f, +0.000026f, -0.000035f, +0.000036f, -0.000037f, +0.000003f, -0.000057f, +0.000060f, -0.000042f, + +0.000012f, +0.000044f, +0.000030f, -0.000042f, +0.000054f, -0.000025f, -0.000061f, -0.000016f, +0.000009f, -0.000064f, + +0.000005f, -0.000045f, +0.000045f, +0.000025f, +0.000036f, -0.000037f + }, + { + -0.000323f, +0.007863f, +0.002719f, -0.001308f, +0.000225f, -0.000365f, -0.000381f, -0.000254f, -0.000060f, +0.000220f, + -0.000116f, -0.000649f, +0.000627f, +0.000101f, -0.000988f, -0.000815f, +0.000953f, +0.001399f, +0.001087f, -0.001875f, + +0.000097f, +0.000747f, +0.000634f, -0.000282f, -0.000328f, -0.000098f, -0.000642f, -0.000504f, -0.000421f, +0.000020f, + +0.000280f, +0.000142f, -0.000587f, -0.000358f, +0.000011f, -0.000445f, -0.000243f, +0.000029f, +0.000238f, +0.000120f, + -0.000015f, +0.000224f, -0.000019f, -0.000211f, -0.000081f, +0.000028f, -0.000004f, +0.000217f, +0.000046f, +0.000055f, + -0.000104f, -0.000218f, -0.000037f, +0.000083f, +0.000108f, +0.000033f, +0.000100f, +0.000044f, -0.000080f, +0.000045f, + +0.000078f, -0.000198f, +0.000006f, +0.000059f, +0.000096f, -0.000134f, +0.000088f, -0.000014f, -0.000158f, +0.000001f, + -0.000046f, +0.000047f, +0.000049f, +0.000028f, -0.000062f, -0.000038f, -0.000018f, +0.000018f, +0.000131f, -0.000056f, + -0.000002f, +0.000063f, -0.000076f, -0.000035f, +0.000045f, +0.000014f, -0.000022f, +0.000035f, -0.000036f, +0.000062f, + +0.000012f, -0.000014f, +0.000024f, -0.000003f, +0.000002f, -0.000068f + }, + { + +0.004795f, -0.014132f, -0.001647f, +0.000048f, +0.000714f, -0.002166f, +0.000841f, +0.000403f, +0.000128f, -0.000360f, + -0.000670f, +0.000888f, +0.000296f, -0.000203f, +0.000440f, +0.000765f, +0.000860f, -0.000198f, -0.000011f, -0.000618f, + +0.000414f, +0.000133f, +0.000172f, -0.000216f, +0.000243f, +0.000017f, +0.000180f, -0.000650f, +0.000123f, -0.000318f, + +0.000237f, -0.000211f, -0.000310f, +0.000702f, -0.000230f, -0.000212f, +0.000026f, +0.000310f, +0.000479f, -0.000037f, + +0.000053f, -0.000014f, +0.000354f, -0.000168f, +0.000019f, -0.000241f, +0.000146f, +0.000083f, -0.000115f, -0.000141f, + -0.000001f, -0.000078f, +0.000076f, -0.000106f, +0.000079f, +0.000067f, -0.000007f, -0.000032f, +0.000032f, +0.000039f, + -0.000025f, -0.000072f, +0.000095f, +0.000061f, -0.000135f, -0.000036f, +0.000053f, -0.000019f, +0.000070f, +0.000037f, + -0.000128f, +0.000053f, -0.000002f, -0.000027f, -0.000011f, -0.000035f, -0.000012f, +0.000020f, +0.000019f, +0.000008f, + +0.000027f, -0.000005f, -0.000068f, -0.000031f, +0.000009f, -0.000096f, +0.000058f, -0.000004f, -0.000009f, +0.000027f, + -0.000052f, +0.000004f, -0.000057f, -0.000043f, +0.000021f, +0.000006f + }, + { + -0.000019f, +0.002071f, +0.000743f, +0.000835f, -0.000165f, +0.000219f, -0.000524f, +0.000390f, +0.000116f, -0.000290f, + +0.000624f, -0.000195f, -0.000316f, -0.001288f, +0.002646f, -0.000356f, +0.001940f, -0.000687f, -0.000640f, +0.000083f, + +0.000248f, +0.001567f, +0.000608f, -0.000859f, +0.001267f, -0.000313f, -0.000248f, +0.000629f, +0.000170f, +0.000738f, + -0.000502f, +0.000503f, +0.000072f, +0.000295f, -0.000136f, -0.000143f, +0.000445f, -0.000072f, +0.000118f, -0.000247f, + -0.000242f, -0.000217f, -0.000004f, +0.000026f, +0.000162f, +0.000027f, +0.000103f, -0.000372f, -0.000074f, +0.000155f, + +0.000060f, +0.000001f, -0.000165f, +0.000031f, +0.000080f, -0.000104f, -0.000294f, +0.000054f, -0.000034f, -0.000011f, + +0.000107f, +0.000215f, -0.000150f, -0.000099f, -0.000091f, +0.000144f, -0.000050f, -0.000002f, +0.000057f, -0.000048f, + +0.000015f, -0.000047f, +0.000028f, +0.000023f, +0.000098f, -0.000033f, -0.000057f, -0.000084f, -0.000006f, +0.000010f, + -0.000051f, +0.000056f, +0.000022f, +0.000033f, +0.000037f, -0.000003f, +0.000040f, -0.000065f, +0.000009f, -0.000009f, + +0.000021f, +0.000080f, -0.000053f, -0.000079f, +0.000080f, -0.000021f + }, + { + -0.002299f, +0.003264f, +0.001841f, +0.001737f, -0.000193f, +0.000035f, -0.000453f, +0.000415f, +0.000377f, -0.000638f, + +0.000434f, +0.000256f, -0.000797f, +0.000756f, +0.000511f, -0.000849f, +0.000302f, -0.000387f, +0.000133f, -0.000217f, + +0.000314f, +0.000204f, +0.000079f, +0.000395f, +0.000048f, +0.000238f, -0.000040f, -0.000596f, -0.000310f, -0.000556f, + +0.000467f, -0.000145f, -0.000068f, +0.000349f, +0.000668f, -0.000260f, -0.000049f, +0.000052f, +0.000082f, +0.000480f, + -0.000275f, -0.000288f, -0.000424f, -0.000358f, -0.000185f, +0.000123f, +0.000156f, +0.000209f, -0.000109f, +0.000173f, + -0.000315f, +0.000215f, -0.000026f, -0.000153f, +0.000074f, -0.000007f, +0.000170f, +0.000057f, -0.000133f, +0.000044f, + -0.000013f, -0.000003f, -0.000010f, -0.000072f, +0.000042f, +0.000006f, +0.000160f, -0.000046f, +0.000004f, -0.000021f, + +0.000096f, -0.000039f, +0.000041f, -0.000088f, -0.000004f, +0.000043f, +0.000099f, -0.000073f, -0.000043f, +0.000052f, + +0.000030f, -0.000035f, +0.000009f, +0.000073f, +0.000013f, +0.000000f, +0.000110f, -0.000045f, -0.000080f, +0.000027f, + +0.000015f, -0.000043f, +0.000039f, +0.000011f, +0.000037f, -0.000040f + }, + { + +0.000032f, +0.003841f, +0.000562f, +0.000214f, +0.000094f, -0.000056f, -0.000086f, +0.000003f, -0.000345f, +0.000319f, + +0.000350f, -0.000070f, +0.000436f, +0.005640f, -0.015380f, -0.000115f, +0.001282f, +0.001322f, -0.000898f, -0.000287f, + +0.001610f, +0.000118f, -0.000874f, +0.000845f, +0.001152f, +0.000500f, -0.000004f, +0.000547f, -0.000243f, +0.000943f, + -0.000343f, -0.000701f, +0.000361f, -0.000573f, -0.000510f, +0.000636f, -0.000140f, -0.000937f, +0.000681f, -0.000045f, + +0.000180f, -0.000169f, -0.000258f, -0.000410f, +0.000393f, -0.000177f, +0.000084f, +0.000323f, -0.000048f, -0.000026f, + +0.000087f, +0.000044f, -0.000035f, -0.000234f, +0.000011f, +0.000208f, +0.000011f, -0.000069f, +0.000069f, -0.000053f, + -0.000275f, +0.000026f, -0.000026f, -0.000051f, -0.000018f, -0.000086f, -0.000019f, +0.000287f, -0.000100f, -0.000043f, + -0.000019f, +0.000079f, -0.000073f, -0.000038f, -0.000000f, -0.000129f, +0.000118f, +0.000053f, -0.000026f, -0.000081f, + -0.000052f, +0.000005f, +0.000050f, +0.000124f, -0.000090f, +0.000021f, +0.000020f, -0.000043f, -0.000016f, +0.000055f, + -0.000014f, +0.000006f, +0.000045f, +0.000002f, -0.000051f, +0.000006f + } + } +}; + +const float leftBRIRImag[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS_MAX]= +{ + { + { + +0.009895f, -0.028551f, +0.030329f, +0.054707f, -0.029041f, +0.023876f, +0.003374f, +0.000340f, -0.018431f, +0.004622f, + +0.000915f, -0.022215f, +0.010646f, +0.009840f, +0.011695f, -0.023007f, +0.004257f, -0.008676f, +0.020758f, -0.006481f, + +0.009139f, -0.006925f, +0.006698f, -0.010971f, +0.013021f, -0.005878f, -0.008686f, -0.002255f, +0.011478f, -0.005832f, + +0.008100f, -0.004175f, +0.004193f, -0.001489f, -0.002079f, +0.017929f, -0.002225f, -0.008913f, -0.005051f, +0.001066f, + +0.012284f, +0.011686f, -0.013601f, -0.004982f, +0.002401f, +0.003552f, -0.000908f, +0.002811f, -0.001353f, +0.001435f, + +0.000421f, -0.000537f, -0.004646f, +0.007740f, -0.004177f, -0.005006f, +0.000972f, +0.002837f, +0.000522f, +0.002567f, + -0.000992f, +0.001383f, -0.000484f, +0.001111f, +0.000479f, -0.000733f, +0.002578f, -0.002489f, -0.004365f, -0.000694f, + -0.001548f, +0.001112f, +0.000010f, +0.002147f, -0.006195f, +0.006187f, +0.000552f, -0.000054f, +0.002942f, -0.001335f, + -0.002581f, +0.001535f, -0.000257f, +0.001656f, -0.002117f, +0.000354f, -0.000052f, +0.002477f, -0.004390f, +0.000311f, + +0.001018f, +0.000572f, +0.000132f, +0.000278f, -0.001961f, +0.001063f + }, + { + -0.003499f, +0.033039f, -0.032264f, +0.037222f, -0.026681f, +0.013974f, +0.005584f, +0.006533f, -0.016046f, -0.003463f, + +0.002486f, -0.012055f, +0.001851f, +0.002929f, +0.015220f, -0.025973f, +0.009091f, -0.006825f, +0.019001f, -0.008219f, + +0.001361f, -0.005047f, +0.016288f, -0.010814f, +0.002972f, -0.009380f, +0.006079f, -0.004400f, +0.001007f, -0.006148f, + +0.011764f, +0.003931f, -0.011519f, -0.007802f, +0.010625f, -0.002170f, +0.007699f, -0.011194f, -0.003152f, -0.006306f, + +0.011015f, +0.010379f, -0.010885f, -0.003926f, +0.009017f, -0.005451f, -0.003277f, +0.004240f, -0.001089f, +0.007307f, + -0.005148f, -0.002343f, -0.000078f, +0.002508f, -0.004943f, +0.005729f, -0.003857f, +0.004031f, -0.003995f, +0.002816f, + +0.002609f, +0.001645f, -0.004319f, -0.000801f, +0.005385f, -0.006243f, +0.008428f, -0.005100f, +0.002238f, -0.004829f, + +0.002762f, -0.003732f, +0.000921f, -0.000077f, +0.000160f, -0.001817f, +0.000679f, +0.003101f, +0.003459f, -0.000860f, + +0.000429f, -0.000737f, +0.001517f, +0.000125f, -0.002581f, -0.001748f, +0.002728f, +0.000624f, -0.001503f, -0.003351f, + +0.003151f, -0.000136f, +0.000126f, -0.001160f, +0.001478f, +0.001321f + }, + { + +0.002816f, +0.002820f, -0.008232f, +0.051715f, -0.026744f, +0.025687f, +0.006058f, -0.017771f, +0.001479f, +0.010379f, + -0.011374f, -0.018655f, +0.016330f, +0.005795f, -0.004846f, -0.006424f, +0.014734f, -0.008971f, +0.004544f, -0.001649f, + -0.002723f, +0.009036f, -0.003338f, +0.003556f, -0.001079f, +0.009479f, -0.017092f, -0.018195f, -0.001283f, -0.002709f, + +0.018337f, -0.003198f, -0.003717f, +0.016892f, -0.003625f, -0.006374f, +0.003859f, +0.008071f, -0.005430f, -0.006945f, + -0.000026f, +0.005152f, +0.006389f, -0.000547f, -0.000053f, -0.010605f, +0.007501f, +0.008952f, -0.002974f, -0.008248f, + +0.003031f, -0.002100f, -0.005715f, +0.003717f, +0.003712f, +0.000030f, -0.003298f, -0.006181f, -0.000286f, +0.006645f, + +0.002656f, +0.002757f, -0.000717f, -0.000759f, +0.004488f, -0.002079f, +0.003126f, +0.000259f, +0.001539f, -0.006162f, + -0.002261f, -0.003163f, +0.001930f, -0.001646f, +0.002131f, -0.004658f, +0.002467f, +0.002735f, +0.001249f, +0.000439f, + +0.001943f, +0.001349f, -0.002044f, -0.000248f, +0.000447f, +0.002708f, -0.004255f, -0.001737f, -0.001226f, +0.003913f, + +0.000022f, -0.001106f, +0.000454f, +0.002245f, -0.000434f, -0.000574f + }, + { + +0.027491f, -0.088768f, +0.029093f, +0.034925f, -0.012075f, +0.011319f, -0.003862f, +0.005789f, -0.006674f, -0.015155f, + +0.010890f, -0.010052f, +0.010087f, +0.006548f, -0.001411f, +0.017636f, -0.004464f, -0.008077f, -0.004646f, +0.008106f, + -0.005810f, +0.014689f, -0.011966f, -0.014850f, +0.019997f, +0.010968f, -0.013555f, -0.012565f, +0.012902f, +0.011489f, + -0.007014f, -0.001886f, +0.007521f, -0.008907f, +0.003178f, +0.001174f, +0.004349f, -0.007110f, +0.005274f, -0.004896f, + +0.001277f, +0.001271f, +0.001589f, -0.002147f, +0.002788f, +0.003401f, -0.005817f, +0.000667f, +0.006739f, -0.005255f, + +0.001209f, +0.003998f, +0.001089f, -0.005178f, +0.001973f, -0.002304f, -0.002567f, +0.004967f, -0.005144f, +0.005079f, + -0.000560f, +0.000322f, -0.000241f, -0.000041f, +0.000064f, +0.001237f, -0.000086f, +0.001216f, -0.001624f, -0.001895f, + -0.001655f, -0.000646f, +0.000616f, +0.000687f, -0.000313f, +0.002153f, +0.000298f, -0.000168f, +0.000577f, +0.000343f, + +0.000653f, -0.001125f, -0.000748f, +0.000756f, -0.000556f, +0.001078f, +0.000886f, -0.001954f, -0.001091f, +0.000565f, + +0.001270f, -0.000845f, -0.001548f, +0.001241f, +0.000256f, +0.000635f + }, + { + -0.000439f, +0.020838f, -0.037461f, +0.043524f, -0.039373f, +0.016352f, +0.011505f, -0.003529f, +0.001727f, -0.005253f, + -0.006027f, -0.014428f, +0.009600f, +0.014221f, -0.019595f, +0.019476f, +0.015663f, -0.027105f, +0.019771f, -0.003661f, + -0.005611f, +0.012413f, -0.004226f, -0.023637f, +0.031134f, -0.006322f, -0.013723f, -0.017936f, +0.018781f, -0.012811f, + +0.020222f, -0.017411f, +0.011964f, -0.010057f, -0.001815f, +0.006294f, -0.004226f, -0.008177f, +0.013074f, -0.004000f, + +0.005200f, +0.001613f, -0.002816f, -0.007382f, +0.005115f, +0.010296f, -0.011520f, -0.002815f, -0.002404f, +0.012735f, + -0.002590f, -0.002986f, +0.002392f, +0.001288f, +0.002837f, -0.003282f, +0.001530f, -0.001326f, -0.000828f, +0.006871f, + -0.001868f, -0.004160f, +0.000172f, +0.001899f, +0.003482f, +0.002758f, -0.005145f, +0.001369f, -0.005055f, +0.003846f, + -0.002492f, +0.000252f, -0.002593f, +0.002114f, +0.000896f, -0.000534f, +0.001045f, -0.001111f, +0.002699f, +0.000788f, + -0.002496f, +0.001170f, -0.001209f, +0.002775f, -0.004226f, +0.001803f, +0.001462f, -0.001625f, -0.000696f, +0.000971f, + -0.000254f, +0.001289f, -0.002091f, -0.000072f, -0.000322f, +0.000799f + }, + { + +0.036339f, -0.119978f, +0.043693f, +0.040555f, -0.004507f, +0.004208f, +0.006206f, -0.006580f, -0.007521f, +0.002676f, + +0.009647f, -0.033419f, -0.007975f, +0.030305f, -0.016872f, +0.027836f, -0.006581f, -0.019038f, -0.002402f, -0.003782f, + +0.028666f, -0.020755f, -0.019578f, +0.008342f, +0.010728f, -0.010030f, +0.022701f, -0.021851f, +0.017824f, -0.014178f, + -0.002425f, -0.010752f, +0.015226f, +0.015629f, -0.004384f, -0.005347f, -0.001085f, -0.007247f, +0.009858f, +0.000863f, + +0.002459f, -0.013562f, +0.004915f, +0.005829f, -0.002082f, -0.007346f, -0.000426f, +0.001505f, +0.000053f, +0.003185f, + -0.002681f, -0.000119f, +0.003991f, +0.000748f, +0.001402f, +0.002976f, -0.001184f, -0.006699f, +0.000926f, -0.000767f, + +0.001282f, +0.004082f, -0.010046f, +0.005641f, -0.002188f, +0.000169f, +0.005178f, -0.001547f, -0.003454f, +0.001715f, + -0.002257f, +0.000224f, +0.002609f, +0.003002f, -0.003769f, +0.002993f, -0.000206f, -0.000381f, -0.000479f, +0.000508f, + -0.002733f, -0.002820f, +0.001316f, +0.000163f, +0.000999f, +0.003048f, -0.000753f, -0.000323f, -0.002384f, +0.000453f, + +0.000067f, -0.000305f, +0.000960f, +0.000952f, -0.000063f, +0.001971f + }, + { + -0.003345f, +0.038570f, -0.061080f, +0.044228f, -0.035088f, +0.014082f, +0.012330f, -0.002270f, -0.004311f, -0.004103f, + -0.001037f, -0.007374f, -0.022590f, +0.010560f, +0.006104f, +0.022569f, +0.000116f, -0.018077f, -0.004143f, -0.003773f, + +0.020337f, +0.000142f, -0.023107f, -0.013302f, +0.012033f, -0.004907f, +0.028324f, -0.029394f, +0.008418f, +0.001867f, + -0.017166f, -0.008088f, +0.020500f, +0.001142f, -0.001386f, -0.012243f, +0.002418f, +0.002804f, +0.004024f, -0.000268f, + -0.001715f, -0.007254f, +0.008285f, -0.000810f, +0.002179f, -0.003686f, +0.004906f, -0.001986f, +0.000500f, -0.004513f, + +0.002725f, -0.001024f, +0.007372f, -0.001149f, +0.005067f, -0.001647f, -0.000070f, -0.004945f, +0.005778f, -0.004457f, + +0.000296f, -0.001839f, -0.004274f, +0.002817f, +0.003291f, -0.002576f, +0.004217f, -0.005118f, +0.000803f, +0.000967f, + -0.000505f, +0.000941f, +0.001094f, +0.000837f, +0.002819f, -0.001844f, -0.000469f, -0.000105f, -0.001328f, -0.001950f, + +0.001066f, -0.002429f, -0.000719f, +0.002357f, -0.001916f, +0.004250f, -0.002088f, +0.000188f, -0.003038f, +0.001812f, + -0.000024f, -0.000257f, +0.001937f, -0.001006f, -0.000863f, +0.001363f + }, + { + +0.031631f, -0.105976f, +0.045843f, +0.040860f, -0.009952f, +0.014268f, -0.004814f, -0.005527f, +0.004628f, -0.011000f, + +0.003644f, -0.031151f, +0.014438f, +0.027692f, -0.023731f, +0.013680f, -0.013147f, -0.007540f, +0.025096f, +0.002901f, + -0.008951f, -0.009282f, +0.023548f, -0.022604f, -0.018362f, +0.026921f, +0.005238f, -0.003045f, -0.013082f, +0.010320f, + -0.007585f, +0.000466f, -0.000980f, -0.005397f, +0.020375f, -0.007380f, -0.009252f, +0.006841f, -0.000785f, +0.003700f, + -0.002149f, -0.004829f, -0.005071f, +0.007744f, +0.001764f, -0.000658f, -0.004049f, +0.001243f, +0.002701f, +0.003473f, + -0.001641f, -0.012557f, +0.008486f, +0.008011f, -0.001969f, +0.005112f, +0.000339f, -0.000100f, -0.007952f, +0.002039f, + +0.003730f, -0.008576f, +0.004803f, +0.000428f, -0.007983f, +0.002820f, +0.005484f, +0.000712f, -0.002861f, -0.001526f, + +0.002112f, +0.000323f, +0.000403f, +0.005312f, -0.004655f, -0.000054f, +0.008519f, -0.007258f, +0.000489f, -0.000795f, + -0.002156f, -0.002301f, -0.000336f, +0.000903f, +0.002435f, +0.001549f, +0.000956f, -0.000740f, -0.002919f, -0.000654f, + +0.000754f, +0.000748f, +0.002264f, +0.000844f, -0.001389f, +0.000773f + }, + { + -0.003537f, +0.042176f, -0.071803f, +0.046403f, -0.031671f, +0.008196f, +0.016943f, +0.000437f, -0.006427f, -0.007143f, + +0.003299f, -0.019593f, -0.007383f, +0.022614f, -0.001025f, -0.005523f, +0.004937f, -0.015200f, +0.022148f, -0.001021f, + -0.008633f, +0.006776f, +0.003508f, -0.020870f, +0.000236f, +0.009050f, +0.031461f, -0.023828f, +0.003296f, -0.008787f, + -0.005953f, +0.020786f, -0.022326f, +0.019157f, -0.008673f, -0.004029f, +0.004791f, +0.006183f, -0.003009f, +0.004329f, + -0.008356f, +0.003112f, +0.002310f, -0.007183f, +0.004151f, +0.003263f, +0.001992f, -0.009694f, +0.001414f, +0.007478f, + -0.003009f, -0.010212f, +0.007529f, +0.006774f, +0.003210f, -0.004184f, +0.006912f, -0.002545f, -0.008920f, +0.003406f, + -0.002114f, -0.001084f, -0.001420f, -0.000938f, +0.001427f, -0.000950f, +0.004357f, +0.003872f, -0.004031f, -0.003257f, + +0.002486f, -0.000298f, +0.004282f, +0.003557f, -0.001860f, -0.001899f, +0.001730f, +0.001633f, -0.002456f, -0.001672f, + -0.000862f, -0.000318f, +0.000813f, -0.000626f, +0.001403f, +0.003200f, -0.001392f, -0.002376f, -0.002357f, -0.000835f, + +0.003150f, -0.000600f, +0.001056f, +0.001484f, -0.000773f, -0.002219f + }, + { + +0.020573f, -0.061237f, +0.015535f, +0.033722f, +0.005983f, +0.000194f, -0.026112f, -0.001072f, +0.021556f, -0.005863f, + -0.008469f, -0.013959f, +0.023936f, -0.018840f, -0.002787f, +0.011071f, -0.004172f, +0.014701f, -0.015846f, +0.008258f, + -0.003057f, +0.022595f, -0.018016f, +0.020471f, -0.018350f, -0.007031f, +0.006206f, -0.008813f, +0.010144f, +0.006658f, + +0.005611f, -0.013133f, +0.014518f, -0.011846f, +0.000107f, +0.003408f, +0.000134f, -0.003061f, -0.004789f, +0.003774f, + +0.010011f, -0.004710f, +0.007618f, -0.019421f, +0.003568f, +0.005026f, -0.015373f, +0.011176f, +0.003419f, +0.006809f, + -0.007974f, +0.001546f, +0.000386f, -0.004445f, +0.003662f, +0.000908f, +0.001532f, -0.001659f, +0.004017f, -0.001477f, + -0.001387f, -0.002022f, +0.001351f, -0.000222f, +0.001955f, +0.002547f, -0.000821f, -0.001761f, +0.005428f, -0.003346f, + +0.000453f, -0.001066f, -0.000152f, -0.005242f, +0.002963f, -0.003641f, +0.002906f, -0.001205f, +0.003632f, -0.002361f, + +0.002076f, +0.001952f, -0.000370f, -0.004567f, +0.005463f, -0.002219f, +0.000174f, +0.001088f, -0.001183f, -0.002200f, + +0.001003f, -0.000172f, -0.001860f, +0.000804f, +0.001695f, +0.001573f + }, + { + +0.003635f, -0.002333f, -0.008290f, +0.032767f, -0.005703f, +0.011123f, -0.035414f, +0.008268f, +0.028229f, -0.008370f, + -0.002500f, -0.004046f, +0.009181f, +0.003187f, -0.012414f, +0.012863f, -0.019462f, +0.004964f, +0.009720f, +0.002863f, + -0.015270f, +0.021588f, -0.009941f, +0.006947f, -0.006198f, -0.017734f, +0.005900f, -0.002550f, -0.017042f, +0.019931f, + +0.004398f, +0.003667f, +0.003658f, -0.005699f, +0.001796f, +0.003393f, -0.003343f, +0.007840f, -0.005272f, +0.012760f, + -0.006969f, +0.004277f, -0.007677f, -0.003072f, +0.003470f, -0.003710f, +0.000627f, +0.014975f, -0.007740f, +0.007741f, + -0.002005f, -0.010413f, -0.004003f, +0.002057f, +0.002478f, +0.000408f, +0.001550f, +0.006611f, -0.003379f, -0.001877f, + -0.002207f, -0.002285f, +0.000574f, +0.002085f, +0.004696f, -0.007474f, +0.003378f, -0.001302f, -0.000463f, -0.001187f, + +0.001487f, -0.001629f, +0.003211f, -0.005039f, -0.000174f, +0.001769f, -0.000267f, -0.000605f, +0.003124f, -0.001634f, + +0.000098f, +0.002410f, -0.000752f, +0.000686f, -0.001228f, -0.000850f, -0.002738f, +0.002571f, -0.003740f, +0.003105f, + -0.000548f, -0.000115f, +0.002204f, +0.000598f, +0.000422f, -0.000716f + }, + { + +0.031151f, -0.101373f, +0.044734f, +0.030209f, +0.004885f, -0.000427f, -0.012441f, +0.020202f, -0.005586f, +0.018379f, + -0.054458f, +0.018383f, +0.015739f, -0.029512f, +0.023684f, +0.006432f, -0.000976f, +0.005168f, -0.000382f, -0.007842f, + +0.004562f, +0.003752f, -0.007221f, +0.004595f, -0.001687f, -0.001540f, -0.005289f, +0.011981f, +0.014551f, -0.024865f, + -0.001696f, +0.003535f, +0.001596f, +0.010745f, -0.004459f, +0.001213f, +0.005915f, -0.016705f, +0.002586f, +0.010938f, + -0.014778f, +0.002443f, +0.007148f, -0.006633f, +0.002673f, +0.007450f, -0.004068f, +0.004380f, -0.003100f, +0.007268f, + +0.000108f, -0.005089f, +0.000071f, +0.000470f, +0.001261f, -0.003063f, -0.009656f, +0.006376f, -0.001964f, +0.000444f, + +0.006792f, -0.001365f, +0.001608f, -0.001638f, +0.001698f, -0.000631f, -0.004269f, +0.001288f, +0.001432f, +0.000217f, + +0.000363f, -0.001806f, +0.001162f, -0.000172f, +0.001711f, -0.000425f, +0.001001f, -0.003938f, -0.002385f, -0.000818f, + -0.001484f, +0.002935f, -0.002561f, -0.001182f, +0.001583f, -0.001870f, +0.000470f, +0.001867f, +0.002055f, -0.001737f, + +0.002106f, +0.000945f, +0.001006f, -0.001184f, -0.000431f, -0.000907f + }, + { + +0.000835f, +0.012358f, -0.016825f, +0.028583f, -0.004425f, +0.002279f, -0.036895f, +0.021170f, +0.003966f, +0.010742f, + +0.005036f, -0.049075f, +0.043540f, -0.026268f, +0.007978f, +0.005813f, +0.008065f, -0.018267f, +0.009731f, +0.009857f, + -0.026213f, +0.009153f, -0.017787f, +0.018347f, +0.001466f, -0.006248f, -0.000317f, +0.009321f, -0.004614f, +0.004872f, + -0.014623f, +0.009287f, -0.007827f, +0.008790f, +0.012535f, -0.013980f, +0.004550f, -0.013387f, +0.007264f, -0.010643f, + +0.002450f, -0.000506f, +0.010691f, -0.008311f, -0.000187f, +0.004500f, -0.004779f, +0.006101f, +0.000337f, +0.001200f, + +0.008467f, -0.008440f, -0.000326f, -0.000650f, +0.001117f, -0.005377f, -0.005218f, +0.003672f, -0.003993f, +0.003443f, + -0.005075f, +0.006635f, -0.001710f, +0.000562f, -0.001185f, +0.005140f, -0.004812f, -0.004085f, +0.006496f, +0.003319f, + -0.004132f, +0.000349f, +0.003460f, +0.000396f, -0.000464f, -0.002300f, +0.004339f, -0.005217f, -0.001580f, -0.001446f, + +0.002218f, -0.002528f, -0.000753f, -0.000997f, +0.000847f, +0.000278f, +0.000064f, +0.001215f, -0.001713f, +0.001930f, + +0.000292f, +0.002401f, -0.000818f, +0.000348f, +0.000744f, -0.001989f + }, + { + +0.030051f, -0.094893f, +0.041345f, +0.011978f, +0.014982f, -0.006589f, -0.021219f, +0.022936f, +0.001714f, -0.012057f, + -0.009101f, -0.009559f, -0.019102f, +0.025642f, -0.006405f, -0.000868f, +0.013116f, -0.010884f, -0.014481f, +0.002995f, + +0.003407f, -0.000390f, -0.000054f, +0.006020f, -0.015620f, -0.001063f, +0.013169f, +0.001721f, -0.006719f, +0.004793f, + -0.007201f, -0.000307f, -0.006466f, +0.014477f, -0.013906f, +0.003942f, -0.006754f, +0.010838f, -0.007380f, +0.002502f, + +0.011618f, +0.004046f, -0.016922f, +0.001578f, +0.005872f, -0.013552f, +0.002205f, +0.002745f, +0.003949f, +0.002237f, + +0.005627f, -0.002263f, -0.001632f, -0.006578f, -0.002975f, +0.006192f, -0.002727f, +0.002331f, -0.002854f, +0.002305f, + +0.003836f, -0.005771f, +0.002282f, -0.004484f, +0.006913f, -0.003100f, +0.002935f, +0.000991f, -0.000757f, -0.002864f, + +0.001589f, -0.001246f, -0.000108f, +0.001843f, -0.003751f, +0.001948f, -0.001405f, -0.001257f, -0.002758f, +0.000285f, + +0.000013f, -0.000669f, +0.002634f, -0.000597f, +0.002651f, -0.002350f, +0.000757f, +0.001868f, -0.000450f, -0.001938f, + -0.000776f, -0.000478f, +0.002360f, -0.001209f, +0.000735f, -0.002416f + }, + { + +0.007324f, -0.016293f, +0.003666f, +0.014398f, +0.004357f, -0.003445f, -0.041252f, +0.033866f, -0.006165f, +0.007134f, + -0.001507f, -0.022548f, +0.000745f, +0.016897f, +0.010562f, -0.033693f, +0.022943f, -0.001320f, -0.007613f, -0.002602f, + +0.004740f, -0.002216f, +0.010284f, +0.012383f, -0.017238f, +0.004524f, -0.001437f, -0.010699f, +0.007210f, +0.004486f, + -0.015248f, +0.019136f, -0.002145f, +0.011081f, -0.022050f, +0.012358f, +0.001061f, -0.001055f, -0.006737f, +0.010871f, + -0.002460f, +0.007716f, -0.006530f, -0.000826f, +0.005627f, -0.000318f, -0.004695f, +0.006089f, +0.005079f, +0.008095f, + -0.001181f, -0.006723f, -0.000857f, +0.000852f, -0.001548f, -0.000407f, -0.000354f, +0.005709f, -0.003143f, +0.003804f, + -0.001922f, -0.001868f, +0.001659f, +0.001899f, +0.001533f, -0.001592f, -0.000143f, +0.005551f, -0.003215f, +0.001359f, + -0.001596f, -0.000007f, +0.003279f, -0.003216f, +0.001147f, +0.000115f, +0.003244f, -0.002224f, -0.003979f, +0.001845f, + +0.002884f, -0.002477f, +0.001670f, +0.000292f, -0.000868f, +0.004339f, -0.001028f, -0.000569f, -0.001518f, +0.000082f, + -0.000724f, +0.001151f, +0.000511f, -0.000531f, +0.001180f, +0.000455f + } + }, + { + { + -0.008350f, +0.053718f, +0.142128f, +0.114639f, +0.004961f, +0.026055f, +0.007911f, +0.008605f, -0.011433f, +0.007274f, + -0.005538f, -0.034077f, -0.001547f, -0.002710f, +0.021605f, -0.029595f, -0.001745f, -0.012672f, +0.013911f, +0.003608f, + +0.022058f, -0.017510f, +0.005225f, -0.003888f, +0.027232f, -0.003300f, -0.009654f, -0.008011f, +0.012875f, -0.003892f, + -0.002981f, -0.008293f, +0.019716f, +0.017443f, +0.007177f, +0.024126f, -0.000034f, +0.001220f, +0.002280f, +0.004440f, + +0.009447f, +0.004987f, -0.016763f, -0.003994f, +0.012038f, +0.010669f, -0.003342f, -0.000206f, -0.004855f, +0.000987f, + +0.007135f, +0.008137f, +0.001610f, +0.006807f, -0.006982f, -0.000598f, +0.002567f, -0.000360f, +0.001979f, +0.003783f, + -0.003086f, +0.003273f, +0.002021f, +0.001801f, -0.000748f, -0.005886f, -0.003658f, -0.002795f, -0.000143f, +0.002321f, + -0.001313f, +0.003931f, -0.001220f, +0.001582f, -0.005068f, +0.008907f, +0.002633f, +0.001317f, +0.002293f, -0.005989f, + -0.007963f, -0.002082f, -0.001316f, +0.002729f, +0.000412f, +0.001924f, +0.000630f, +0.002969f, -0.003935f, +0.002504f, + +0.001968f, -0.000872f, -0.001302f, -0.000432f, -0.000864f, +0.001583f + }, + { + -0.000631f, +0.114395f, +0.029079f, +0.017584f, -0.040108f, +0.004551f, -0.006146f, +0.011910f, -0.003039f, +0.000572f, + -0.002744f, -0.013487f, -0.005014f, -0.011725f, +0.000596f, -0.041849f, +0.022431f, +0.000327f, +0.002471f, -0.017398f, + +0.001530f, -0.005391f, +0.035835f, -0.015222f, -0.011788f, -0.013822f, +0.010653f, +0.010717f, +0.014123f, -0.005694f, + +0.002403f, -0.006207f, -0.020413f, -0.009635f, +0.003161f, -0.015040f, +0.007846f, -0.021365f, -0.015041f, -0.010030f, + +0.011291f, +0.014851f, -0.012845f, -0.008505f, +0.010535f, +0.001385f, -0.000725f, -0.002480f, -0.004598f, +0.016191f, + -0.002963f, -0.009394f, -0.001414f, +0.008612f, +0.002396f, +0.013663f, -0.001967f, +0.004280f, -0.006533f, +0.000965f, + +0.000698f, -0.004616f, -0.007312f, -0.002962f, -0.000207f, -0.010299f, +0.012657f, +0.001645f, +0.009127f, -0.002425f, + +0.010118f, -0.001478f, -0.000299f, +0.001731f, +0.000713f, -0.004655f, +0.001577f, +0.004644f, +0.000095f, -0.001743f, + +0.000054f, -0.002693f, +0.001794f, -0.000097f, -0.003949f, -0.002420f, +0.004292f, +0.003997f, +0.000107f, -0.003454f, + +0.003292f, -0.002159f, +0.000086f, -0.001040f, +0.001780f, +0.003142f + }, + { + +0.000709f, +0.110350f, +0.089409f, +0.078858f, +0.001183f, +0.027955f, +0.015972f, +0.000652f, +0.002814f, +0.016965f, + -0.009781f, -0.032815f, +0.014656f, +0.009626f, -0.009591f, -0.026737f, +0.021241f, +0.006809f, +0.004166f, -0.000996f, + +0.006622f, +0.000420f, -0.018649f, +0.002337f, +0.004341f, +0.008986f, -0.027034f, -0.033767f, -0.009440f, -0.012560f, + +0.019142f, +0.004554f, -0.002924f, +0.024591f, +0.001565f, -0.005319f, +0.010222f, +0.015483f, -0.006560f, -0.002934f, + -0.001928f, -0.001815f, +0.015346f, +0.015579f, +0.009069f, -0.016569f, +0.005420f, +0.011569f, +0.000385f, -0.003164f, + +0.008200f, -0.004762f, -0.012952f, +0.006152f, +0.004895f, -0.009268f, -0.003339f, +0.001384f, +0.002054f, +0.002635f, + -0.000900f, +0.002201f, +0.003055f, +0.003646f, +0.000608f, -0.001735f, +0.009615f, +0.004783f, +0.002198f, -0.008570f, + +0.002187f, +0.002160f, +0.005454f, -0.001276f, +0.000308f, -0.007538f, -0.000337f, +0.000422f, -0.000013f, -0.002881f, + +0.000863f, +0.001749f, -0.001306f, +0.000663f, +0.000062f, +0.005080f, -0.002544f, +0.000451f, -0.000095f, +0.003935f, + +0.000246f, -0.002235f, -0.000454f, +0.003907f, +0.000641f, +0.000464f + }, + { + -0.024150f, -0.174344f, +0.020682f, +0.089231f, +0.028191f, +0.004933f, -0.010313f, -0.000042f, -0.017862f, +0.007329f, + +0.045236f, +0.005878f, +0.011897f, -0.005672f, +0.005524f, +0.033323f, +0.012835f, -0.003410f, -0.014459f, +0.011312f, + -0.015141f, +0.008442f, +0.008978f, +0.001954f, +0.017111f, +0.011184f, +0.003795f, +0.007209f, +0.024019f, +0.018730f, + -0.003213f, +0.004703f, +0.002401f, -0.020097f, +0.007478f, +0.005014f, -0.002543f, -0.012827f, -0.000759f, -0.006910f, + +0.004526f, -0.004031f, +0.006590f, +0.006470f, +0.007241f, +0.009649f, +0.000999f, +0.007615f, +0.006041f, -0.006058f, + +0.010987f, +0.006296f, -0.001102f, -0.004428f, -0.002596f, -0.002865f, -0.002028f, +0.000613f, -0.008514f, +0.006524f, + -0.000166f, +0.003142f, +0.000780f, -0.002682f, -0.001161f, +0.002375f, +0.002734f, +0.001865f, -0.005045f, -0.002158f, + -0.001874f, -0.001779f, +0.000392f, -0.002461f, -0.001286f, +0.003307f, +0.002199f, +0.001104f, +0.001589f, +0.001855f, + +0.000901f, -0.000858f, -0.002307f, +0.000648f, -0.000875f, +0.000946f, +0.002177f, -0.004158f, -0.003085f, -0.000053f, + +0.001381f, +0.000183f, +0.000438f, +0.003116f, +0.001199f, -0.000016f + }, + { + +0.000523f, +0.087106f, +0.000110f, +0.004594f, -0.073216f, +0.012384f, +0.010048f, -0.002995f, +0.007025f, +0.021407f, + +0.002338f, -0.021292f, +0.007972f, -0.000405f, -0.030533f, +0.035486f, +0.048736f, -0.009853f, +0.014013f, -0.015582f, + -0.007684f, +0.016292f, +0.013597f, -0.023630f, +0.022627f, -0.007207f, -0.016943f, -0.041848f, +0.001342f, -0.038250f, + +0.019304f, -0.010401f, +0.007897f, -0.021366f, -0.009318f, +0.006765f, +0.003427f, -0.008606f, +0.009890f, +0.002636f, + +0.009828f, +0.001698f, -0.001503f, -0.007736f, +0.007478f, +0.010585f, -0.014127f, +0.006339f, +0.007137f, +0.023262f, + -0.003180f, -0.007226f, +0.009095f, +0.008779f, +0.006721f, +0.001002f, +0.006923f, +0.001306f, -0.002424f, +0.010024f, + -0.000069f, -0.002761f, +0.004219f, +0.003445f, +0.007495f, +0.003960f, -0.007614f, +0.000236f, -0.008722f, +0.004537f, + +0.001705f, +0.001856f, -0.005980f, +0.001948f, -0.001008f, -0.003219f, -0.000303f, -0.001865f, +0.002863f, +0.001890f, + +0.000780f, +0.003736f, -0.002315f, +0.000613f, -0.006192f, +0.002630f, +0.001534f, -0.001954f, +0.001548f, +0.002503f, + +0.000872f, +0.001925f, -0.002202f, +0.000721f, +0.000215f, +0.001123f + }, + { + -0.029211f, -0.225112f, +0.035357f, +0.121301f, +0.055823f, -0.008408f, +0.008018f, -0.005411f, -0.005554f, +0.011069f, + +0.014487f, -0.036375f, -0.021718f, +0.017220f, -0.034043f, +0.004006f, -0.032731f, -0.019473f, -0.002642f, -0.023031f, + +0.017936f, -0.026186f, -0.018443f, +0.010204f, +0.018946f, -0.007967f, +0.011645f, -0.020886f, +0.037213f, -0.018805f, + -0.006195f, -0.007137f, +0.023800f, +0.020182f, +0.003519f, +0.005239f, -0.007310f, -0.017228f, +0.004474f, -0.003938f, + +0.015374f, -0.005464f, -0.003480f, -0.000514f, -0.010083f, -0.013585f, -0.003756f, +0.006987f, +0.011231f, +0.006502f, + -0.005779f, +0.003034f, +0.007485f, -0.000984f, -0.002035f, -0.003021f, -0.003716f, -0.005379f, +0.001081f, -0.002465f, + +0.004460f, +0.007457f, -0.008609f, +0.010294f, -0.004055f, -0.001885f, +0.009879f, +0.002845f, -0.003846f, -0.000553f, + -0.006290f, -0.004245f, +0.001286f, +0.006583f, -0.005040f, +0.001967f, -0.001303f, -0.002296f, +0.000523f, +0.001262f, + -0.003290f, -0.000639f, +0.002310f, -0.000023f, -0.000837f, -0.000812f, -0.001744f, +0.002439f, -0.000234f, +0.002495f, + +0.002510f, +0.000951f, +0.000081f, +0.000575f, +0.001337f, +0.003081f + }, + { + -0.002000f, +0.083919f, -0.038690f, -0.004410f, -0.074599f, +0.012544f, +0.007236f, -0.004739f, +0.000769f, +0.007613f, + -0.001486f, -0.015934f, -0.032997f, -0.011839f, -0.007981f, +0.022907f, -0.010714f, -0.024495f, -0.003927f, -0.017002f, + +0.005649f, -0.007346f, -0.022945f, -0.012705f, +0.006124f, -0.005320f, +0.044813f, -0.041175f, -0.016466f, -0.010951f, + -0.028524f, -0.024700f, +0.010500f, -0.005034f, -0.002052f, -0.014790f, +0.001237f, +0.003813f, -0.001014f, -0.002098f, + +0.009019f, -0.007900f, -0.000643f, +0.004450f, +0.014952f, -0.001156f, +0.003235f, -0.004647f, +0.000699f, +0.001961f, + +0.001416f, +0.000733f, +0.012318f, -0.003869f, +0.006462f, +0.000859f, -0.000920f, -0.004556f, +0.006034f, -0.009425f, + +0.000857f, +0.000660f, -0.004512f, +0.003193f, +0.002883f, -0.007134f, -0.000166f, -0.005712f, +0.006961f, +0.006104f, + +0.003173f, +0.002770f, +0.001766f, +0.000057f, +0.001983f, -0.000468f, -0.003183f, -0.005403f, -0.005147f, -0.002098f, + +0.003311f, -0.002718f, -0.002549f, +0.002624f, -0.003122f, +0.003389f, -0.003169f, -0.000621f, -0.001383f, +0.004428f, + +0.000913f, -0.000277f, -0.000123f, -0.003526f, -0.001443f, +0.001339f + }, + { + -0.026515f, -0.179332f, +0.055491f, +0.113951f, +0.055600f, +0.016234f, -0.013578f, -0.019209f, +0.009082f, -0.002014f, + +0.010448f, -0.040876f, +0.000891f, +0.024366f, -0.036923f, +0.002423f, -0.006243f, +0.001904f, +0.024927f, +0.019805f, + +0.002854f, +0.000701f, +0.041911f, -0.010689f, -0.020653f, +0.010479f, -0.001251f, +0.004171f, -0.007697f, +0.011652f, + -0.010561f, -0.007496f, -0.001356f, -0.004916f, +0.022521f, -0.003145f, -0.010692f, +0.003268f, -0.000735f, +0.010920f, + -0.002017f, -0.004261f, +0.008681f, +0.013474f, +0.000490f, +0.006049f, +0.003378f, +0.002581f, +0.001482f, +0.008836f, + -0.006405f, -0.022686f, +0.010230f, +0.008879f, -0.002952f, +0.013141f, +0.004905f, +0.004847f, -0.002049f, +0.008922f, + +0.011930f, -0.009348f, +0.001698f, -0.001167f, -0.009207f, +0.006806f, +0.003386f, -0.001262f, -0.000087f, +0.000476f, + +0.003559f, -0.003878f, -0.006661f, +0.004300f, -0.003626f, +0.001206f, +0.013867f, -0.005093f, +0.003045f, +0.000551f, + -0.002585f, -0.003683f, -0.001477f, +0.001282f, +0.004849f, +0.003326f, +0.001223f, +0.000554f, -0.001516f, -0.000745f, + +0.000791f, +0.000951f, +0.001501f, -0.000340f, -0.002216f, +0.002063f + }, + { + -0.003362f, +0.072186f, -0.064216f, -0.003011f, -0.065572f, -0.002017f, +0.011553f, +0.008755f, -0.003508f, -0.007068f, + +0.006192f, -0.021027f, -0.010643f, +0.009631f, -0.010107f, -0.014692f, -0.002951f, -0.006740f, +0.035654f, -0.001039f, + -0.007148f, +0.016412f, -0.001209f, -0.002142f, +0.033290f, +0.008851f, +0.019968f, -0.021924f, +0.023010f, -0.009080f, + -0.005101f, +0.008103f, -0.040518f, +0.004430f, -0.020889f, +0.009017f, +0.016620f, +0.007088f, -0.002938f, +0.008188f, + -0.003821f, +0.005379f, +0.003333f, -0.012936f, +0.005069f, +0.010975f, +0.002223f, -0.011691f, +0.001251f, +0.003820f, + +0.000069f, -0.008845f, +0.002204f, +0.006554f, +0.002222f, -0.005310f, +0.006060f, -0.002143f, -0.005893f, +0.002620f, + -0.000660f, +0.000367f, -0.002476f, +0.000057f, +0.000596f, +0.000577f, +0.007533f, +0.006852f, -0.000374f, +0.000889f, + +0.004118f, +0.001091f, +0.006854f, +0.003169f, -0.002056f, -0.002570f, +0.001906f, +0.005265f, +0.001464f, -0.001523f, + -0.001254f, -0.002296f, +0.001205f, -0.001172f, +0.000014f, +0.004559f, -0.001368f, -0.002165f, -0.002081f, -0.003913f, + +0.000994f, -0.001262f, -0.002207f, -0.001922f, -0.000935f, -0.002354f + }, + { + -0.014933f, -0.062080f, +0.068882f, +0.057501f, +0.005586f, +0.016196f, -0.016669f, -0.023026f, +0.019589f, -0.026298f, + -0.010630f, -0.014403f, +0.002595f, -0.031702f, -0.002330f, +0.030654f, +0.009247f, +0.013970f, -0.018607f, +0.024328f, + +0.005796f, +0.022460f, -0.012859f, +0.001258f, -0.032747f, +0.001422f, +0.012370f, +0.001942f, +0.035241f, +0.020117f, + +0.009795f, -0.001512f, +0.013232f, -0.008894f, +0.000772f, -0.007997f, -0.005072f, -0.000233f, +0.000378f, -0.001562f, + -0.002980f, -0.013330f, +0.008084f, -0.019916f, +0.006939f, +0.008927f, -0.021024f, -0.000250f, +0.000053f, +0.010624f, + -0.001693f, +0.011076f, +0.007733f, -0.006121f, +0.004246f, +0.002148f, -0.000746f, -0.005029f, +0.006144f, +0.007853f, + +0.004708f, -0.003047f, -0.000541f, -0.002481f, -0.000317f, -0.001917f, +0.001000f, +0.003292f, +0.012670f, +0.000134f, + +0.001332f, -0.001211f, -0.002860f, -0.006777f, +0.002673f, -0.003323f, +0.003917f, -0.001440f, +0.002111f, -0.003584f, + +0.003339f, +0.000485f, -0.000824f, -0.004881f, +0.004510f, -0.003854f, -0.001073f, -0.001540f, -0.002326f, -0.001503f, + +0.000605f, -0.000080f, -0.001938f, +0.001251f, +0.003106f, +0.002793f + }, + { + -0.000142f, +0.076731f, +0.047000f, +0.016062f, -0.024972f, +0.006715f, -0.035529f, +0.022925f, +0.044036f, -0.004771f, + +0.031512f, +0.002746f, -0.006100f, -0.008273f, -0.022533f, +0.004731f, -0.046894f, +0.015155f, +0.026387f, +0.008715f, + -0.019766f, -0.000010f, -0.004286f, +0.008307f, -0.011217f, -0.016023f, +0.003752f, -0.007725f, -0.018881f, +0.037316f, + +0.019147f, +0.012323f, +0.007947f, +0.004561f, +0.005479f, +0.007249f, +0.006708f, +0.018099f, -0.002346f, +0.026781f, + -0.000204f, +0.004117f, -0.002006f, +0.005383f, +0.001333f, -0.007732f, -0.001072f, +0.007808f, -0.008656f, +0.005492f, + -0.002589f, -0.002915f, +0.001358f, +0.004008f, -0.000463f, -0.007618f, +0.000886f, +0.006750f, -0.008112f, -0.003150f, + +0.001967f, +0.003271f, -0.002747f, -0.001606f, -0.003454f, -0.009362f, +0.010508f, -0.000078f, -0.001136f, -0.002657f, + +0.000345f, -0.005305f, +0.002477f, -0.003154f, +0.001433f, +0.000635f, -0.004066f, +0.001275f, +0.005641f, -0.003691f, + -0.004087f, -0.000395f, +0.001801f, +0.004575f, -0.004017f, -0.005992f, -0.000917f, +0.006475f, -0.000902f, +0.008346f, + +0.000057f, -0.000161f, +0.001983f, -0.000798f, -0.000436f, -0.002752f + }, + { + -0.022880f, -0.202062f, +0.035318f, +0.057107f, +0.034632f, +0.046479f, +0.024143f, +0.022637f, -0.002090f, -0.019613f, + -0.082562f, +0.044320f, +0.041813f, -0.030007f, +0.012200f, +0.005302f, +0.016208f, +0.021422f, -0.001075f, +0.007190f, + +0.026168f, +0.006104f, -0.007435f, -0.004171f, +0.003928f, +0.007429f, -0.011072f, +0.011631f, +0.013127f, -0.028807f, + -0.011588f, -0.000503f, +0.009741f, +0.017235f, -0.011837f, +0.005819f, +0.019453f, -0.011492f, +0.001825f, +0.006504f, + -0.010452f, +0.007899f, -0.002388f, -0.007472f, +0.011476f, +0.010105f, -0.005523f, +0.005918f, +0.005396f, +0.008860f, + -0.008393f, -0.008316f, +0.002487f, +0.004907f, +0.002183f, -0.006850f, -0.007759f, +0.016089f, +0.009841f, +0.003021f, + +0.000307f, -0.007029f, +0.002988f, +0.003142f, +0.003086f, -0.002248f, -0.003851f, +0.001892f, -0.003863f, -0.005725f, + -0.004661f, -0.005968f, -0.003500f, -0.007042f, +0.000302f, -0.001016f, -0.000728f, -0.006418f, -0.004897f, -0.003645f, + -0.001181f, +0.005701f, -0.003295f, -0.004368f, -0.000005f, -0.001768f, -0.001535f, -0.000365f, +0.002495f, -0.002635f, + -0.000368f, +0.000591f, +0.003346f, +0.000627f, +0.000715f, -0.000423f + }, + { + -0.000436f, +0.096733f, +0.041272f, +0.002344f, -0.035885f, -0.025824f, -0.049723f, +0.026705f, +0.011762f, +0.009718f, + +0.017519f, -0.039739f, +0.046385f, -0.027378f, -0.015539f, -0.030347f, -0.014806f, -0.008686f, +0.023620f, +0.006128f, + -0.039834f, -0.002422f, -0.023206f, +0.020793f, +0.021583f, +0.007721f, -0.002223f, +0.002951f, -0.009022f, +0.014704f, + -0.006380f, +0.006341f, -0.019581f, -0.003899f, +0.008059f, -0.017272f, +0.000015f, -0.029753f, -0.005240f, -0.002673f, + +0.019247f, +0.001550f, +0.001294f, -0.014991f, +0.002619f, +0.007815f, -0.003138f, +0.008106f, +0.004441f, +0.001839f, + +0.003338f, -0.022804f, -0.003851f, +0.005333f, +0.001696f, -0.007622f, -0.011831f, -0.003160f, -0.003945f, +0.000429f, + -0.013475f, +0.002258f, -0.003634f, +0.004588f, +0.000723f, +0.007289f, -0.003845f, -0.004079f, +0.003560f, +0.000911f, + -0.002652f, +0.000637f, +0.003434f, -0.003855f, -0.005141f, -0.001234f, +0.006084f, -0.006632f, -0.003144f, +0.000108f, + +0.004518f, -0.004789f, -0.004875f, -0.001014f, +0.002718f, -0.001113f, -0.003211f, -0.001539f, -0.005395f, +0.000345f, + +0.001807f, +0.003110f, -0.002259f, +0.001695f, +0.001216f, -0.003476f + }, + { + -0.023167f, -0.188237f, +0.030335f, +0.027562f, +0.022143f, +0.012619f, -0.005553f, +0.024531f, +0.009067f, -0.054759f, + -0.038106f, -0.020398f, -0.055748f, +0.004321f, -0.008692f, +0.003719f, +0.002616f, -0.025339f, -0.025018f, -0.000405f, + +0.009791f, -0.006269f, -0.019720f, -0.002266f, -0.034591f, -0.009898f, +0.029075f, +0.023875f, -0.005603f, -0.012266f, + -0.019844f, +0.000316f, -0.006013f, +0.013454f, -0.012725f, +0.000337f, -0.011844f, +0.025171f, -0.007744f, -0.003985f, + +0.011048f, +0.000959f, -0.016158f, +0.002453f, +0.001565f, -0.012407f, -0.000664f, +0.001931f, +0.011021f, +0.005074f, + +0.010164f, -0.005254f, -0.013930f, -0.003653f, +0.008081f, +0.010194f, -0.006241f, -0.002780f, -0.004313f, +0.003160f, + +0.007882f, -0.001094f, +0.001206f, -0.013530f, +0.002802f, -0.004447f, +0.004073f, +0.006517f, +0.005811f, -0.000995f, + +0.003292f, -0.005223f, -0.007661f, -0.001284f, -0.008190f, +0.001043f, -0.004297f, -0.002146f, -0.003214f, -0.003135f, + -0.002460f, -0.000283f, +0.003718f, -0.000262f, +0.005984f, -0.002651f, +0.000029f, +0.004650f, -0.000683f, -0.003753f, + -0.002027f, +0.001089f, +0.007626f, +0.001353f, +0.000838f, -0.001142f + }, + { + -0.002662f, +0.046250f, +0.052461f, -0.004210f, -0.024751f, -0.042011f, -0.066950f, +0.032181f, +0.013560f, +0.012430f, + -0.016627f, -0.031865f, +0.002763f, +0.012756f, +0.001857f, -0.044151f, +0.011328f, -0.001802f, -0.011731f, +0.003268f, + +0.005312f, -0.014863f, +0.013952f, +0.025192f, -0.010445f, +0.013768f, -0.003064f, -0.021584f, +0.006777f, +0.002958f, + -0.006257f, +0.042718f, +0.002793f, +0.015485f, -0.012573f, +0.022936f, +0.005722f, -0.000026f, -0.014940f, +0.005101f, + -0.005688f, +0.014995f, +0.002627f, +0.014363f, +0.019944f, +0.012009f, -0.000034f, +0.016085f, +0.015470f, +0.010483f, + +0.008750f, +0.002064f, -0.004329f, +0.001317f, +0.002857f, -0.000104f, +0.003303f, +0.009780f, -0.007962f, +0.003490f, + +0.004163f, -0.000163f, +0.002806f, +0.007219f, +0.000959f, -0.001474f, +0.005532f, +0.002228f, -0.004154f, +0.005605f, + -0.001669f, -0.001072f, +0.004093f, -0.002877f, +0.001167f, +0.003486f, +0.008783f, -0.000719f, -0.007387f, +0.003058f, + +0.005111f, -0.002730f, +0.005080f, +0.002765f, -0.001172f, +0.004451f, -0.003826f, -0.002709f, +0.001421f, +0.002622f, + +0.000747f, +0.003972f, +0.002009f, -0.000508f, +0.003257f, +0.001273f + } + }, + { + { + +0.002515f, +0.189634f, -0.027014f, +0.038445f, +0.071505f, +0.023123f, +0.005794f, -0.000246f, +0.016140f, -0.017328f, + -0.009672f, -0.013321f, -0.010972f, -0.018578f, +0.022220f, -0.019820f, -0.002625f, +0.009851f, +0.007220f, -0.018272f, + +0.023789f, -0.020286f, +0.011599f, -0.015319f, +0.016497f, +0.013222f, -0.005975f, -0.012611f, +0.005703f, +0.004999f, + -0.024955f, +0.017484f, +0.012929f, +0.007735f, +0.010628f, +0.011421f, +0.007380f, +0.003092f, +0.002730f, +0.001310f, + +0.003616f, -0.003510f, +0.001196f, -0.004795f, +0.005050f, +0.010484f, +0.001825f, -0.005229f, -0.001730f, -0.000886f, + +0.004343f, +0.004028f, +0.012274f, -0.000413f, -0.004710f, +0.006357f, -0.001617f, -0.001855f, +0.003314f, +0.001096f, + -0.000111f, -0.000009f, +0.006724f, +0.001965f, -0.005187f, +0.002082f, -0.011045f, +0.002764f, -0.004400f, +0.001956f, + +0.004956f, +0.000061f, -0.003181f, +0.001016f, +0.000722f, +0.000905f, +0.002523f, +0.006276f, +0.000222f, -0.005149f, + -0.007442f, -0.004856f, +0.001139f, +0.003146f, +0.002767f, -0.001822f, +0.004422f, -0.001082f, -0.001395f, -0.000224f, + +0.001204f, +0.001062f, +0.001366f, -0.001062f, -0.001685f, +0.000488f + }, + { + +0.003985f, +0.045633f, +0.063580f, -0.026282f, +0.028249f, -0.007712f, -0.006509f, -0.004873f, +0.016730f, -0.010679f, + +0.000339f, -0.001511f, -0.012721f, -0.006901f, -0.000602f, -0.006056f, -0.008394f, +0.000516f, -0.012716f, -0.001963f, + -0.009009f, +0.011533f, +0.013665f, -0.010529f, -0.000844f, -0.014612f, -0.008769f, +0.012278f, +0.023562f, -0.002469f, + -0.001764f, -0.016887f, -0.013845f, -0.000396f, -0.009506f, +0.003431f, -0.003650f, -0.017891f, -0.015130f, -0.002036f, + +0.001148f, +0.009233f, -0.017045f, +0.000211f, +0.011932f, -0.008567f, +0.003520f, +0.003287f, -0.008674f, +0.012947f, + -0.004480f, -0.004683f, -0.001100f, +0.003985f, +0.017482f, -0.003063f, +0.000865f, +0.004582f, -0.003680f, -0.006495f, + +0.001779f, -0.003693f, -0.000231f, -0.003472f, -0.003469f, -0.003619f, +0.004181f, +0.005904f, +0.008257f, -0.001650f, + +0.006639f, +0.002935f, -0.002394f, +0.002005f, -0.002360f, -0.000015f, +0.000926f, +0.000699f, -0.003702f, -0.000181f, + +0.004116f, -0.002878f, -0.003940f, +0.005188f, -0.003635f, -0.001472f, +0.001305f, +0.002564f, +0.001417f, +0.001872f, + -0.004303f, -0.001474f, -0.000536f, +0.000814f, +0.002523f, +0.002228f + }, + { + -0.002554f, +0.162488f, +0.045172f, -0.014008f, +0.083014f, +0.020305f, +0.013375f, +0.012008f, -0.006905f, +0.000069f, + +0.008336f, -0.028291f, +0.004748f, +0.007284f, -0.003077f, -0.024230f, +0.001984f, +0.006795f, +0.005945f, +0.009600f, + +0.012775f, -0.000782f, -0.016401f, -0.005156f, +0.010851f, -0.003066f, -0.006939f, -0.037132f, -0.007679f, -0.013636f, + +0.024870f, -0.012042f, +0.006466f, +0.015490f, +0.007775f, -0.010208f, +0.011397f, +0.013175f, -0.009952f, +0.006173f, + -0.013928f, +0.009637f, +0.008649f, +0.014332f, +0.010172f, -0.007613f, +0.009377f, -0.002344f, -0.001060f, +0.002561f, + +0.006371f, -0.001441f, -0.009702f, -0.001385f, +0.005415f, -0.006750f, +0.002375f, -0.002894f, +0.006881f, -0.003115f, + -0.001164f, +0.002302f, +0.001366f, +0.000683f, +0.000750f, +0.004708f, +0.005228f, +0.004732f, +0.000257f, -0.001007f, + +0.001094f, +0.002646f, +0.002060f, -0.003457f, +0.003300f, -0.004903f, -0.004253f, -0.002036f, +0.001857f, -0.000818f, + -0.000157f, +0.002085f, -0.001554f, +0.002404f, -0.003870f, +0.006445f, -0.000740f, +0.001249f, -0.001518f, +0.004179f, + +0.001036f, -0.001940f, -0.001448f, +0.001897f, -0.000537f, -0.000328f + }, + { + +0.022020f, -0.146001f, -0.053909f, +0.086091f, +0.018625f, +0.019940f, -0.013426f, -0.006191f, -0.000400f, +0.027836f, + +0.012128f, +0.011786f, +0.007656f, -0.008985f, +0.019441f, +0.009765f, +0.002839f, +0.015720f, -0.014563f, +0.010049f, + -0.006451f, +0.002880f, +0.011509f, +0.003259f, +0.015000f, +0.010859f, +0.007620f, +0.015926f, +0.013165f, +0.016030f, + +0.000610f, +0.003517f, +0.001264f, -0.013123f, -0.006657f, +0.000540f, -0.011168f, +0.001155f, -0.009111f, +0.004630f, + +0.003358f, -0.002388f, +0.006075f, -0.004376f, +0.016585f, -0.000415f, +0.005818f, +0.009532f, +0.001765f, -0.005360f, + +0.004835f, +0.012805f, -0.002753f, -0.001856f, -0.007053f, +0.005890f, +0.000650f, -0.007105f, -0.006828f, +0.010347f, + -0.000706f, -0.005154f, +0.006332f, -0.005330f, +0.004025f, -0.000056f, +0.004878f, -0.002164f, -0.009203f, +0.003390f, + -0.004113f, -0.000008f, +0.001515f, -0.003383f, -0.001509f, +0.003039f, +0.000520f, +0.002269f, +0.002544f, -0.000436f, + -0.000276f, +0.000742f, -0.000413f, -0.000373f, -0.000196f, -0.000094f, +0.001257f, -0.003918f, +0.000543f, -0.001819f, + +0.002573f, -0.002450f, +0.002486f, +0.002221f, -0.000308f, -0.001151f + }, + { + +0.000200f, +0.068844f, +0.021804f, -0.023863f, -0.022473f, -0.011200f, +0.005787f, +0.007091f, -0.003167f, +0.013669f, + +0.000494f, -0.003395f, -0.000624f, -0.001702f, -0.007952f, +0.018439f, +0.028657f, +0.012064f, +0.005127f, -0.020593f, + +0.012017f, -0.022230f, +0.030488f, -0.004647f, +0.005700f, +0.000946f, -0.021291f, -0.030924f, -0.012561f, -0.021315f, + +0.002991f, +0.001930f, -0.002597f, -0.005557f, -0.017975f, +0.004104f, -0.007089f, +0.013098f, +0.000599f, +0.003235f, + +0.000840f, +0.006066f, +0.001274f, +0.004029f, -0.003232f, +0.010374f, +0.000249f, -0.003115f, +0.005283f, +0.018700f, + +0.003149f, -0.012916f, +0.000259f, +0.018070f, +0.004422f, +0.009741f, +0.004591f, -0.001846f, -0.001689f, +0.005303f, + +0.004265f, +0.000437f, +0.001141f, +0.004093f, +0.008483f, +0.002717f, -0.003833f, -0.004478f, +0.002752f, -0.003166f, + +0.004903f, +0.000703f, -0.005839f, -0.000106f, -0.001946f, -0.005706f, +0.000351f, +0.000145f, +0.002089f, +0.003254f, + +0.001281f, +0.003740f, -0.003747f, -0.001573f, -0.002875f, +0.002372f, -0.000258f, +0.001036f, -0.000139f, -0.000157f, + +0.003942f, +0.000843f, -0.000082f, -0.001149f, +0.000376f, +0.002234f + }, + { + +0.025162f, -0.156737f, -0.086011f, +0.124402f, +0.030338f, +0.015196f, +0.004439f, -0.000872f, -0.007864f, +0.008334f, + -0.005239f, +0.010496f, -0.011838f, -0.019802f, -0.020988f, -0.004480f, -0.044057f, -0.017495f, +0.005777f, -0.007849f, + +0.001637f, -0.019399f, +0.000050f, -0.007492f, +0.004081f, +0.011061f, +0.005937f, -0.010301f, +0.020668f, -0.006606f, + -0.016813f, +0.006113f, +0.021417f, +0.009268f, +0.004327f, -0.002251f, -0.006208f, +0.000597f, -0.005210f, +0.003893f, + +0.006915f, -0.000486f, -0.010510f, +0.005630f, -0.021692f, -0.007379f, +0.006921f, +0.000662f, +0.011132f, +0.006656f, + -0.001839f, -0.002235f, -0.001323f, +0.002698f, +0.005688f, -0.010060f, -0.007567f, +0.003539f, +0.000412f, +0.003365f, + +0.000722f, -0.000202f, +0.002469f, +0.003509f, -0.000705f, +0.000958f, +0.005941f, -0.001073f, +0.001812f, -0.002289f, + -0.006269f, +0.003084f, -0.004361f, +0.003883f, +0.000645f, -0.003759f, +0.001722f, -0.002060f, +0.000892f, -0.000896f, + -0.005560f, +0.006515f, -0.002212f, +0.000160f, -0.000693f, -0.001815f, -0.000246f, -0.001875f, +0.004228f, +0.002090f, + +0.000898f, +0.001897f, -0.000310f, +0.001244f, +0.000015f, +0.001775f + }, + { + +0.003994f, -0.031257f, +0.081513f, -0.030435f, -0.044952f, +0.005475f, +0.000115f, -0.011255f, +0.011655f, +0.010201f, + -0.013285f, -0.014542f, -0.018510f, -0.013243f, +0.002012f, +0.010774f, -0.016404f, -0.016602f, -0.015956f, -0.018231f, + -0.000207f, -0.006568f, -0.009884f, -0.004857f, +0.011584f, +0.001445f, +0.004639f, -0.012601f, -0.019825f, +0.002992f, + -0.040405f, -0.025033f, +0.015783f, -0.009242f, -0.012103f, -0.000054f, +0.003427f, -0.007406f, +0.005680f, -0.007363f, + +0.012281f, -0.007195f, -0.004757f, +0.016303f, -0.005007f, +0.001750f, -0.001626f, +0.008689f, -0.005355f, +0.004143f, + -0.004979f, +0.003871f, -0.000238f, +0.005259f, +0.005319f, -0.000844f, +0.003554f, -0.001085f, -0.000403f, -0.006852f, + -0.001067f, +0.000620f, -0.003342f, +0.001222f, -0.002822f, -0.002293f, -0.003490f, +0.002027f, +0.003164f, +0.005645f, + +0.003298f, +0.003925f, -0.001135f, +0.004442f, -0.000973f, -0.000880f, -0.000681f, -0.004819f, -0.005017f, +0.002945f, + -0.002323f, -0.002064f, -0.001506f, +0.003551f, -0.003046f, +0.002003f, +0.000659f, -0.004415f, +0.000321f, +0.003986f, + +0.001108f, -0.001055f, +0.000216f, -0.003480f, -0.001210f, -0.001761f + }, + { + +0.023813f, -0.099711f, -0.074641f, +0.098691f, +0.060780f, +0.023796f, -0.014716f, -0.014957f, -0.000988f, +0.011122f, + -0.005550f, -0.017386f, -0.016468f, +0.017993f, +0.004874f, -0.016379f, -0.021365f, +0.026241f, +0.011351f, +0.027976f, + +0.009426f, -0.002102f, +0.021973f, -0.007748f, +0.009240f, -0.016673f, +0.014803f, -0.003082f, +0.006685f, -0.005336f, + -0.006313f, -0.004889f, -0.007303f, +0.010493f, +0.010491f, +0.002378f, -0.012484f, +0.004938f, +0.005374f, +0.014833f, + -0.001993f, -0.006637f, +0.005583f, +0.014509f, -0.002280f, +0.006617f, -0.001498f, +0.008275f, +0.003909f, -0.000194f, + -0.006195f, -0.011113f, +0.009654f, -0.000263f, -0.002182f, +0.012416f, +0.002601f, +0.002397f, +0.002870f, +0.013548f, + +0.007179f, -0.000661f, -0.002926f, -0.003623f, -0.006404f, +0.008322f, -0.001534f, +0.002140f, +0.002228f, -0.001041f, + +0.001166f, -0.005800f, -0.002476f, -0.001796f, +0.002024f, -0.000494f, +0.010574f, -0.002008f, +0.002970f, +0.000687f, + -0.000565f, -0.000773f, -0.002955f, +0.002998f, +0.003659f, +0.002119f, -0.001443f, +0.001920f, +0.001055f, -0.001691f, + -0.000289f, -0.000520f, +0.001531f, +0.001653f, -0.003003f, +0.003874f + }, + { + +0.004102f, -0.065114f, +0.084047f, -0.033157f, -0.034744f, -0.005267f, +0.002550f, +0.006891f, -0.001586f, -0.008429f, + +0.000531f, -0.010533f, -0.001780f, -0.013774f, +0.000876f, +0.000056f, +0.005896f, -0.012911f, +0.006933f, +0.025469f, + -0.014012f, +0.012542f, +0.006413f, +0.015884f, +0.020685f, -0.007985f, +0.021670f, -0.026083f, +0.030787f, -0.019879f, + +0.027665f, -0.021550f, -0.021554f, -0.005286f, -0.024473f, +0.004471f, +0.024919f, +0.006032f, -0.003035f, +0.003386f, + +0.000133f, -0.001048f, +0.005330f, -0.013836f, +0.008489f, +0.001573f, -0.001745f, +0.002330f, -0.000841f, +0.005268f, + -0.004979f, -0.004572f, -0.000701f, +0.003678f, +0.003935f, -0.004217f, -0.001635f, +0.003339f, -0.003288f, -0.001640f, + +0.002518f, +0.000614f, -0.002158f, +0.000048f, -0.001730f, +0.003373f, +0.004506f, +0.004728f, +0.002695f, +0.003439f, + +0.002691f, +0.006266f, +0.000033f, -0.000677f, +0.001429f, -0.003422f, +0.005036f, +0.002129f, +0.002746f, -0.003485f, + +0.000548f, +0.000546f, -0.001411f, -0.004334f, +0.003939f, +0.000042f, -0.002309f, +0.001503f, -0.001154f, -0.003541f, + +0.000695f, -0.002220f, -0.000759f, -0.001270f, -0.005105f, -0.001448f + }, + { + +0.010177f, +0.017965f, -0.003024f, +0.026703f, -0.000323f, -0.017500f, +0.063053f, -0.015184f, -0.017991f, -0.025186f, + -0.013685f, -0.001004f, -0.013704f, +0.005753f, -0.005378f, +0.009227f, +0.005120f, -0.012717f, +0.019018f, +0.005415f, + +0.020644f, -0.005426f, +0.001467f, -0.020866f, -0.014109f, +0.023563f, -0.017709f, +0.015320f, +0.021543f, +0.027203f, + +0.007987f, +0.010786f, -0.022826f, +0.015887f, +0.011832f, -0.014928f, +0.001013f, -0.015200f, +0.018579f, +0.001912f, + +0.008002f, -0.025431f, +0.001927f, -0.012412f, -0.003491f, +0.000076f, -0.000021f, -0.011329f, +0.002797f, -0.002522f, + +0.004216f, +0.010334f, +0.004310f, +0.008997f, -0.001460f, -0.006032f, +0.006531f, -0.012152f, +0.000002f, +0.016460f, + -0.002744f, -0.000022f, +0.002248f, -0.000521f, +0.002103f, -0.009562f, +0.009058f, +0.003034f, +0.010042f, -0.000853f, + +0.001485f, -0.001098f, -0.007817f, +0.002451f, -0.001868f, +0.002675f, +0.000226f, +0.000366f, -0.003249f, -0.001037f, + +0.003255f, -0.002037f, -0.003326f, -0.001689f, +0.001616f, -0.001415f, -0.000801f, -0.001202f, -0.000749f, -0.003370f, + +0.002599f, +0.002125f, -0.003349f, +0.000721f, -0.001103f, +0.002787f + }, + { + -0.001557f, +0.114111f, -0.000372f, +0.013431f, -0.000772f, -0.033535f, +0.003736f, +0.029216f, +0.003452f, -0.005163f, + +0.050025f, -0.007526f, -0.010256f, -0.014491f, -0.027393f, +0.012571f, -0.035478f, +0.008544f, +0.020431f, -0.015665f, + +0.016737f, -0.020093f, +0.008258f, -0.010339f, +0.014067f, -0.017813f, -0.002609f, +0.009331f, -0.003725f, +0.031024f, + +0.018667f, +0.001181f, +0.007188f, +0.007811f, -0.023729f, +0.034279f, +0.010126f, +0.011293f, -0.002049f, +0.006331f, + +0.015690f, +0.006361f, -0.006830f, +0.003182f, -0.003213f, -0.003028f, +0.012639f, -0.005021f, +0.000062f, -0.004171f, + -0.002230f, +0.005123f, -0.000867f, -0.003956f, +0.000606f, +0.003540f, -0.002418f, -0.001408f, -0.005602f, -0.002838f, + +0.003791f, +0.005260f, -0.003021f, +0.003573f, -0.009844f, -0.004919f, +0.006954f, -0.004753f, +0.002890f, +0.001060f, + +0.002828f, -0.005025f, -0.004725f, -0.000212f, +0.003501f, -0.002110f, +0.000444f, +0.002811f, -0.004110f, +0.001340f, + -0.003813f, -0.002974f, +0.000710f, +0.006882f, -0.002615f, -0.006074f, +0.001088f, +0.003262f, +0.004105f, +0.004434f, + -0.000936f, -0.000804f, -0.001614f, +0.003975f, -0.002400f, -0.000841f + }, + { + +0.014817f, -0.210049f, -0.006006f, +0.031781f, +0.026644f, +0.019583f, +0.073024f, -0.001907f, +0.005088f, -0.031723f, + -0.017205f, +0.002438f, +0.022045f, +0.013311f, -0.008189f, -0.009919f, +0.001953f, +0.026121f, +0.014037f, +0.008013f, + +0.018793f, +0.011805f, +0.005050f, -0.008969f, -0.003436f, +0.019898f, -0.015294f, +0.010051f, +0.001027f, -0.020340f, + +0.001643f, -0.009072f, +0.005586f, -0.003850f, +0.011597f, -0.008031f, +0.023436f, +0.002806f, +0.007278f, +0.001483f, + -0.010471f, +0.003181f, -0.010203f, +0.009611f, +0.001058f, -0.000526f, +0.004676f, +0.004791f, +0.009474f, +0.000933f, + -0.011168f, -0.002824f, +0.008435f, -0.001768f, +0.010262f, -0.013712f, -0.001361f, +0.011876f, +0.007681f, +0.003003f, + +0.004982f, -0.005091f, -0.002599f, +0.004925f, -0.001151f, +0.002482f, -0.005021f, -0.000212f, -0.001481f, -0.011769f, + -0.000383f, -0.005061f, -0.006674f, -0.004878f, -0.000596f, -0.000191f, -0.004956f, -0.000989f, -0.004820f, -0.007041f, + +0.002369f, +0.002303f, -0.002671f, -0.001818f, +0.000151f, -0.001309f, -0.004994f, +0.000542f, +0.002775f, -0.001667f, + +0.001146f, -0.002226f, +0.001473f, +0.004811f, -0.001169f, -0.000874f + }, + { + +0.000746f, +0.098992f, +0.013426f, +0.002946f, -0.019621f, -0.011264f, -0.037170f, +0.017981f, -0.001057f, +0.005531f, + -0.000215f, -0.010370f, +0.024969f, -0.021456f, -0.031561f, -0.007804f, -0.031106f, +0.011791f, +0.029979f, -0.026176f, + -0.016181f, -0.013511f, +0.003325f, +0.006552f, +0.021440f, +0.002458f, -0.003987f, -0.016328f, +0.023412f, +0.005882f, + +0.017732f, -0.016370f, -0.007742f, -0.000584f, -0.009397f, -0.003727f, -0.019166f, -0.023011f, -0.010944f, +0.015409f, + +0.010574f, -0.007999f, +0.004151f, -0.008273f, -0.005945f, +0.006844f, +0.003346f, +0.004351f, +0.008956f, +0.003598f, + -0.003371f, -0.015091f, -0.000788f, -0.001076f, +0.005081f, -0.012044f, -0.003700f, -0.010506f, -0.005298f, +0.003233f, + -0.012174f, +0.001853f, -0.008513f, +0.000406f, +0.008570f, +0.002194f, -0.004125f, +0.005690f, -0.004785f, -0.002683f, + +0.001615f, +0.000715f, -0.004086f, +0.002322f, -0.002731f, -0.002244f, +0.001640f, -0.000785f, -0.007289f, +0.002965f, + +0.000732f, -0.003051f, -0.002774f, +0.003171f, +0.001914f, +0.000063f, -0.007445f, +0.000937f, -0.006571f, +0.000523f, + -0.001013f, +0.001083f, +0.002216f, +0.000691f, -0.001518f, -0.002114f + }, + { + +0.016239f, -0.189185f, -0.024806f, +0.037138f, -0.004699f, -0.006371f, +0.054419f, -0.007425f, -0.011470f, -0.013642f, + -0.040930f, -0.007639f, -0.054484f, -0.008196f, -0.032653f, +0.024165f, +0.014408f, -0.028959f, -0.029989f, +0.017456f, + +0.005527f, +0.006565f, -0.033852f, -0.013410f, -0.014028f, -0.011686f, +0.017672f, +0.025760f, -0.000367f, -0.018952f, + -0.021562f, +0.011994f, +0.000438f, -0.004681f, -0.008050f, -0.005197f, +0.006306f, +0.002174f, +0.010776f, -0.000311f, + +0.002214f, +0.001621f, -0.018350f, +0.012340f, -0.014744f, +0.006573f, -0.008675f, +0.001613f, +0.007693f, +0.008898f, + +0.004535f, -0.005968f, -0.005646f, +0.002286f, +0.003736f, -0.002980f, -0.000035f, -0.005362f, +0.004364f, +0.002223f, + +0.002088f, +0.005109f, -0.000984f, -0.014105f, +0.006263f, -0.007155f, -0.000604f, +0.003327f, +0.007829f, +0.005340f, + -0.003032f, -0.001374f, -0.009546f, +0.000404f, -0.006587f, +0.002502f, -0.005263f, -0.002680f, -0.000531f, -0.000855f, + -0.002877f, +0.000109f, +0.005334f, -0.000572f, +0.001643f, -0.001776f, -0.000645f, +0.003723f, +0.002592f, -0.003866f, + -0.002191f, +0.003545f, +0.003724f, +0.003190f, -0.000011f, +0.001552f + }, + { + -0.000124f, +0.110841f, -0.010620f, -0.002964f, -0.018475f, -0.034799f, -0.050043f, +0.015389f, +0.015447f, -0.002615f, + -0.014968f, -0.011532f, -0.000618f, -0.029151f, -0.011639f, +0.040162f, -0.018168f, +0.000763f, -0.007395f, -0.004142f, + -0.029285f, +0.011408f, +0.011708f, +0.005982f, +0.016986f, -0.006323f, +0.011975f, -0.022353f, -0.003530f, +0.031689f, + -0.001518f, +0.006396f, +0.024389f, -0.016091f, +0.016731f, +0.010085f, +0.003441f, +0.016945f, -0.017550f, -0.008992f, + +0.000600f, +0.005743f, +0.007863f, +0.019149f, +0.007621f, +0.018284f, -0.001993f, +0.018015f, +0.009629f, +0.004396f, + +0.020650f, -0.002177f, -0.007263f, +0.005150f, -0.002149f, +0.002303f, +0.003851f, +0.004588f, -0.001183f, -0.000970f, + +0.015188f, -0.001720f, -0.005601f, +0.005092f, -0.000317f, +0.003223f, +0.008057f, -0.004321f, +0.000697f, +0.000401f, + +0.003302f, -0.004652f, -0.000584f, +0.000842f, -0.001234f, +0.013068f, +0.002036f, -0.004588f, -0.007187f, +0.005979f, + +0.000588f, +0.003160f, +0.003797f, -0.002650f, +0.001882f, +0.000741f, -0.001965f, +0.001085f, +0.001717f, -0.000773f, + +0.005128f, +0.000145f, +0.003894f, +0.000156f, +0.001391f, +0.000273f + } + }, + { + { + +0.004883f, +0.211408f, -0.058552f, -0.084760f, -0.030524f, +0.012458f, +0.006276f, -0.008724f, +0.023777f, -0.010662f, + +0.001733f, -0.002750f, -0.008953f, -0.016391f, +0.016823f, -0.013911f, +0.013581f, +0.036448f, -0.007296f, -0.061088f, + +0.000915f, -0.025533f, +0.017959f, -0.003901f, +0.004136f, +0.002107f, +0.002984f, -0.007012f, -0.008365f, -0.004432f, + -0.020843f, +0.020258f, -0.002902f, -0.004683f, -0.001641f, -0.005506f, +0.004437f, +0.005130f, +0.007090f, -0.002334f, + -0.007782f, -0.013775f, +0.001985f, -0.001374f, +0.003796f, +0.005865f, -0.003992f, -0.009330f, +0.001571f, -0.000303f, + -0.007059f, -0.006899f, +0.009399f, -0.004284f, -0.007770f, +0.004163f, -0.001139f, -0.004224f, -0.000967f, -0.000802f, + +0.003137f, +0.002996f, +0.005992f, +0.008210f, +0.001577f, +0.006565f, -0.007529f, +0.000762f, -0.006378f, -0.000888f, + +0.000838f, -0.000981f, -0.004288f, -0.003006f, +0.002381f, -0.001853f, -0.001526f, +0.007989f, +0.003092f, -0.001511f, + -0.001932f, -0.001132f, +0.003396f, +0.003588f, +0.002208f, -0.003405f, +0.000603f, -0.001930f, +0.001166f, -0.000979f, + +0.000124f, +0.001018f, +0.002324f, +0.001005f, -0.000247f, +0.000003f + }, + { + -0.002933f, -0.071562f, -0.029880f, -0.043511f, +0.031544f, -0.011084f, -0.004639f, -0.003974f, +0.018946f, -0.009868f, + -0.004093f, +0.005286f, +0.010978f, +0.013349f, +0.001977f, +0.009135f, -0.016433f, -0.024527f, -0.007740f, +0.028132f, + -0.002805f, -0.009597f, -0.000591f, +0.009363f, +0.002273f, -0.023590f, -0.016706f, +0.008206f, +0.006496f, -0.007450f, + -0.003072f, -0.009046f, -0.011342f, -0.006899f, +0.005216f, +0.017851f, +0.005747f, -0.005732f, -0.008011f, +0.002342f, + -0.005925f, -0.002658f, -0.011221f, +0.002698f, -0.000670f, -0.013148f, +0.004769f, +0.003508f, -0.009850f, +0.008221f, + -0.008843f, -0.003339f, -0.000297f, -0.002431f, +0.010071f, -0.007157f, -0.000173f, +0.002118f, +0.001066f, -0.009616f, + -0.000339f, +0.000201f, +0.007502f, +0.001396f, -0.001244f, -0.000929f, -0.002724f, +0.002116f, +0.004052f, -0.003762f, + +0.004122f, +0.002307f, -0.004461f, +0.000439f, -0.002373f, +0.000298f, -0.002029f, -0.004368f, -0.005112f, +0.000649f, + +0.005183f, +0.001828f, -0.000645f, +0.006533f, -0.000953f, -0.001095f, -0.002287f, -0.001530f, -0.000762f, +0.002330f, + -0.004790f, -0.001709f, -0.001276f, +0.001732f, +0.000974f, -0.003755f + }, + { + +0.000758f, +0.074154f, -0.064360f, -0.097699f, +0.023215f, -0.002154f, +0.006656f, +0.006287f, -0.006224f, -0.005561f, + +0.005807f, -0.025396f, -0.004707f, -0.006188f, +0.001604f, -0.003852f, -0.003673f, -0.002142f, +0.008410f, +0.013301f, + +0.006123f, +0.005842f, -0.005404f, -0.000103f, +0.008229f, -0.017560f, +0.009690f, -0.016100f, +0.004246f, -0.000037f, + +0.015632f, -0.021356f, +0.002566f, -0.007334f, -0.006140f, -0.001078f, +0.007376f, +0.007474f, -0.005246f, +0.009585f, + -0.008431f, +0.009731f, -0.005368f, -0.006092f, +0.009541f, +0.013743f, +0.015299f, -0.005101f, -0.004014f, -0.001921f, + +0.002505f, +0.007937f, +0.000879f, -0.004294f, +0.001406f, -0.006709f, +0.008209f, +0.000552f, +0.005464f, -0.008620f, + -0.002753f, +0.002325f, +0.000661f, -0.005687f, -0.005476f, -0.000044f, +0.000464f, +0.003215f, -0.002401f, +0.000121f, + +0.001602f, +0.002906f, +0.003703f, -0.004278f, -0.002313f, -0.003268f, -0.001357f, -0.001729f, +0.002941f, -0.002164f, + -0.001336f, +0.004152f, -0.001465f, +0.001928f, -0.003288f, +0.002913f, -0.001207f, +0.002918f, -0.000846f, +0.001124f, + -0.000525f, +0.000964f, -0.001917f, -0.000740f, -0.001318f, -0.000947f + }, + { + -0.023695f, -0.063263f, +0.041789f, +0.047257f, -0.013945f, +0.019856f, -0.005383f, -0.009322f, -0.008321f, +0.006397f, + -0.008653f, -0.002569f, -0.005017f, -0.014932f, -0.009825f, -0.006138f, +0.003846f, +0.020692f, -0.007033f, +0.015966f, + +0.012000f, +0.003217f, +0.010159f, -0.000104f, +0.002641f, +0.001493f, +0.002250f, +0.005514f, -0.001859f, +0.001832f, + -0.006188f, +0.004033f, +0.011652f, -0.011585f, -0.022911f, -0.014560f, -0.009666f, +0.010843f, -0.009882f, +0.007863f, + +0.002218f, -0.000228f, +0.012875f, -0.003007f, +0.014291f, -0.015032f, -0.004503f, +0.001962f, -0.000072f, +0.003495f, + +0.002513f, +0.003627f, -0.002695f, +0.002665f, -0.005782f, +0.007898f, +0.001129f, -0.004965f, -0.004017f, +0.002637f, + -0.003415f, -0.002114f, +0.008073f, -0.004024f, +0.003705f, -0.003873f, +0.004892f, +0.001361f, -0.003884f, +0.004971f, + -0.003748f, -0.001642f, +0.001148f, -0.003439f, -0.000897f, +0.001569f, -0.004034f, -0.001742f, -0.000320f, -0.001724f, + -0.001248f, +0.000701f, +0.002318f, +0.001272f, -0.000171f, +0.000198f, -0.000841f, -0.004769f, +0.001025f, -0.001214f, + +0.002765f, -0.002461f, +0.003244f, -0.000823f, +0.000010f, +0.000889f + }, + { + -0.001128f, +0.011557f, -0.009032f, -0.009489f, +0.010615f, -0.007577f, +0.002479f, +0.002721f, -0.010979f, +0.003908f, + +0.001798f, +0.015162f, -0.000327f, -0.020635f, -0.026648f, -0.022372f, -0.014165f, +0.011107f, -0.002445f, -0.015491f, + +0.017056f, -0.024535f, +0.028453f, -0.010690f, -0.001230f, +0.016299f, +0.004893f, +0.000813f, -0.001865f, -0.011860f, + -0.006703f, +0.005243f, -0.002757f, +0.001042f, -0.000200f, +0.012637f, +0.000519f, +0.012829f, -0.008306f, +0.001108f, + +0.005643f, +0.006484f, -0.005471f, -0.001221f, -0.004315f, +0.007984f, +0.005149f, -0.001695f, -0.004975f, +0.006839f, + +0.002580f, -0.011268f, -0.007678f, +0.006665f, -0.002170f, +0.006637f, +0.001839f, -0.002133f, -0.003872f, +0.001433f, + +0.001974f, +0.001353f, +0.003354f, +0.006236f, +0.005063f, +0.000780f, +0.000233f, -0.002060f, +0.007203f, -0.008089f, + -0.000318f, +0.000905f, -0.004031f, -0.000701f, +0.000456f, -0.003259f, +0.003365f, +0.001901f, -0.000464f, -0.000659f, + +0.000333f, +0.003106f, -0.004821f, -0.001236f, -0.000859f, +0.001386f, -0.002332f, +0.001505f, -0.001647f, -0.002954f, + +0.003083f, +0.000102f, -0.001045f, -0.001432f, +0.000337f, +0.002043f + }, + { + -0.028402f, -0.049258f, +0.041777f, +0.048509f, -0.048415f, +0.009187f, +0.011501f, -0.003893f, -0.020066f, -0.001368f, + -0.005342f, +0.018060f, -0.007453f, -0.016236f, -0.016333f, -0.008681f, -0.019613f, +0.004312f, +0.008928f, -0.004884f, + +0.001074f, -0.014960f, +0.007867f, -0.012073f, +0.006066f, +0.022555f, +0.005261f, -0.007475f, +0.018274f, +0.006652f, + -0.004746f, +0.009697f, +0.004678f, -0.003576f, -0.001499f, -0.001890f, -0.007595f, -0.000633f, -0.006401f, +0.002568f, + +0.004230f, +0.003951f, -0.012249f, -0.002046f, -0.021352f, -0.001473f, +0.017082f, +0.000266f, +0.004893f, -0.003281f, + -0.003703f, +0.004946f, -0.004792f, +0.000123f, +0.008742f, -0.005128f, -0.004135f, +0.005495f, -0.001580f, +0.000824f, + -0.002617f, -0.001581f, +0.008996f, +0.000364f, -0.006739f, -0.000882f, +0.002009f, -0.002364f, +0.005670f, +0.000480f, + -0.002500f, +0.007051f, -0.004097f, -0.000466f, +0.002832f, -0.000128f, +0.003280f, -0.002950f, +0.000256f, +0.000006f, + -0.003685f, +0.006720f, -0.006462f, -0.002097f, +0.001695f, -0.001480f, +0.002622f, -0.001465f, +0.001967f, +0.002519f, + +0.001304f, +0.003572f, -0.001359f, -0.000906f, -0.001409f, -0.001945f + }, + { + -0.000004f, -0.065225f, +0.068425f, -0.007208f, -0.000717f, +0.005749f, -0.001354f, -0.002446f, +0.012086f, +0.003676f, + -0.010049f, +0.003273f, -0.011627f, -0.015838f, -0.002600f, -0.017555f, -0.030924f, -0.007655f, -0.000326f, -0.010106f, + -0.014464f, -0.009090f, +0.026038f, +0.005155f, -0.001454f, +0.011501f, -0.001184f, -0.007086f, +0.001686f, +0.040470f, + -0.001901f, -0.013609f, +0.007795f, +0.007216f, -0.003073f, +0.000652f, +0.002720f, -0.010654f, +0.014650f, -0.004677f, + +0.005219f, -0.010105f, -0.005663f, +0.018366f, -0.014159f, -0.002689f, -0.003709f, +0.002844f, -0.006830f, +0.009394f, + -0.008782f, -0.008331f, -0.013543f, +0.003099f, +0.002915f, -0.003664f, +0.001089f, -0.000854f, +0.000903f, -0.003314f, + -0.004446f, -0.007332f, -0.003034f, +0.001414f, -0.004591f, +0.001494f, +0.000740f, +0.003781f, +0.002516f, +0.002208f, + -0.001316f, +0.006946f, +0.002852f, +0.003427f, +0.000540f, -0.000055f, +0.000322f, +0.003720f, +0.000917f, +0.003600f, + -0.002303f, -0.000536f, -0.001329f, +0.001486f, -0.005507f, +0.000277f, +0.002836f, -0.003976f, -0.000792f, +0.000938f, + -0.001086f, -0.001023f, +0.002002f, -0.002155f, -0.000808f, -0.002774f + }, + { + -0.027596f, -0.012601f, +0.028573f, +0.013249f, -0.029170f, +0.010929f, +0.004677f, +0.003398f, +0.003982f, +0.012001f, + +0.005481f, +0.010255f, -0.010389f, +0.009390f, +0.030202f, +0.008808f, -0.025901f, +0.023852f, +0.003809f, +0.013033f, + +0.002345f, -0.002554f, +0.007424f, -0.014792f, +0.015171f, -0.018979f, +0.013281f, -0.002132f, +0.019125f, -0.003857f, + -0.007913f, +0.005627f, +0.000253f, +0.002091f, -0.004855f, +0.002810f, +0.002730f, +0.008953f, -0.002582f, +0.007273f, + +0.000655f, -0.002590f, -0.008156f, +0.002674f, -0.000769f, +0.010219f, -0.003982f, -0.003407f, -0.000923f, +0.001476f, + -0.003784f, +0.000529f, +0.006026f, -0.012499f, -0.002486f, +0.012306f, +0.006792f, +0.005360f, -0.004230f, +0.005212f, + +0.005370f, +0.002253f, -0.005885f, -0.001436f, +0.001577f, +0.009084f, -0.000005f, +0.005028f, +0.000579f, -0.001690f, + +0.003611f, -0.004039f, -0.000005f, -0.001324f, +0.001947f, -0.004074f, +0.005898f, -0.000294f, +0.004239f, +0.000981f, + +0.000933f, +0.003836f, +0.000280f, +0.004821f, +0.002453f, -0.000315f, -0.002944f, +0.001918f, +0.003086f, -0.001117f, + -0.000971f, -0.001181f, +0.000748f, +0.001852f, -0.002071f, +0.001951f + }, + { + +0.002834f, -0.055733f, +0.107833f, -0.007122f, +0.008995f, +0.000539f, -0.004691f, +0.004845f, -0.000821f, -0.004941f, + -0.000755f, +0.004990f, +0.006947f, -0.024656f, -0.002963f, +0.018844f, +0.028185f, -0.006416f, +0.008015f, +0.030585f, + -0.009198f, +0.009149f, -0.018608f, -0.002520f, +0.013435f, -0.021464f, +0.016200f, -0.020488f, +0.026636f, -0.019075f, + +0.033505f, -0.015600f, -0.018304f, -0.001613f, -0.011018f, -0.000612f, +0.017118f, -0.006439f, -0.017398f, -0.005654f, + -0.000429f, -0.002915f, +0.003490f, -0.011630f, +0.009144f, -0.007736f, -0.006365f, +0.009885f, -0.002863f, +0.000107f, + -0.000156f, -0.001519f, -0.006244f, -0.003159f, -0.000640f, -0.004693f, +0.003971f, +0.007085f, -0.004993f, -0.003880f, + -0.000714f, -0.002983f, +0.000727f, +0.002709f, -0.003342f, +0.003253f, +0.001622f, -0.001336f, +0.001011f, +0.002883f, + -0.001372f, +0.002504f, -0.002018f, -0.001102f, +0.004130f, -0.002778f, +0.000312f, -0.002538f, -0.001968f, -0.004054f, + +0.004606f, +0.000766f, -0.003369f, -0.005095f, +0.003505f, -0.000639f, -0.000987f, +0.004141f, +0.001896f, -0.000257f, + +0.001828f, -0.000432f, -0.000524f, +0.000259f, -0.001372f, +0.001268f + }, + { + -0.010058f, +0.125346f, +0.071137f, -0.008130f, -0.022175f, -0.018522f, +0.070935f, -0.022807f, -0.030550f, -0.029324f, + -0.006750f, +0.008200f, -0.000059f, +0.020225f, -0.004190f, -0.015894f, -0.026880f, -0.040855f, +0.003751f, -0.006516f, + +0.010122f, -0.025715f, +0.015862f, +0.006857f, +0.012528f, +0.026196f, -0.025286f, +0.012221f, -0.013800f, -0.001322f, + +0.000704f, +0.007762f, -0.020987f, +0.015777f, +0.008172f, -0.007248f, +0.008950f, -0.024723f, +0.020914f, +0.011391f, + +0.012848f, -0.015740f, +0.006224f, -0.009042f, -0.008994f, +0.001982f, +0.011236f, -0.008523f, -0.002224f, -0.005082f, + +0.000391f, +0.008259f, +0.007420f, -0.004265f, -0.012855f, -0.008301f, +0.006300f, -0.007639f, -0.003852f, +0.006867f, + -0.002947f, +0.001502f, +0.000265f, -0.002761f, +0.002215f, -0.011591f, +0.005447f, +0.003376f, +0.004145f, -0.005009f, + +0.003247f, +0.002418f, -0.006029f, +0.005930f, +0.000987f, +0.002941f, +0.003401f, -0.000036f, -0.009227f, -0.004489f, + +0.003260f, -0.004483f, -0.003683f, +0.004222f, +0.000492f, -0.000104f, +0.003818f, +0.000748f, +0.000365f, -0.001693f, + +0.002250f, +0.001653f, -0.003120f, +0.000571f, -0.003091f, +0.000580f + }, + { + +0.000030f, +0.084367f, -0.048213f, -0.022118f, +0.003953f, -0.006944f, +0.019377f, -0.004425f, -0.026556f, -0.021289f, + +0.022468f, -0.005473f, -0.000760f, -0.027100f, -0.047859f, +0.024220f, +0.010539f, -0.003329f, -0.008002f, -0.020772f, + +0.016501f, -0.015780f, +0.019991f, -0.020056f, +0.024723f, -0.002035f, +0.001139f, +0.027715f, +0.012494f, -0.001080f, + -0.001144f, -0.016014f, +0.001441f, +0.015897f, -0.037629f, +0.011516f, -0.011113f, -0.001279f, -0.004391f, -0.001189f, + +0.003290f, -0.004848f, +0.001456f, +0.012347f, -0.001906f, +0.001067f, +0.010057f, -0.010924f, +0.006075f, +0.000028f, + +0.000722f, +0.002215f, -0.003106f, -0.009914f, -0.001882f, +0.003469f, -0.009311f, -0.002406f, +0.005372f, +0.006070f, + +0.002229f, +0.003460f, +0.006726f, +0.009522f, -0.000577f, +0.003221f, +0.001287f, -0.008693f, +0.004908f, +0.005900f, + +0.002288f, -0.004643f, -0.003415f, -0.004604f, -0.002771f, +0.001750f, +0.007093f, +0.002090f, -0.008378f, +0.002890f, + -0.001086f, -0.002473f, -0.000730f, +0.002124f, -0.002051f, -0.002303f, +0.004560f, +0.004687f, +0.002767f, -0.000801f, + -0.003233f, -0.002088f, -0.004735f, +0.002311f, -0.001296f, +0.001618f + }, + { + -0.011141f, -0.228117f, -0.028463f, -0.008147f, +0.007899f, -0.042694f, +0.013973f, -0.008021f, +0.010179f, -0.016119f, + +0.013387f, +0.000162f, -0.001990f, -0.010332f, -0.011046f, +0.011519f, -0.002658f, +0.010333f, +0.019600f, +0.008140f, + +0.004100f, +0.001324f, +0.020242f, +0.006429f, -0.010897f, +0.015265f, -0.009124f, -0.001718f, -0.002550f, -0.003952f, + +0.002541f, -0.014510f, +0.003828f, -0.013765f, +0.009112f, -0.014138f, +0.015958f, +0.009988f, +0.007653f, -0.000698f, + -0.002306f, -0.000623f, -0.018292f, +0.008920f, -0.002393f, -0.003232f, -0.002188f, -0.004367f, +0.006722f, -0.004325f, + -0.006826f, +0.003875f, +0.014753f, +0.002963f, +0.011157f, -0.011516f, -0.006448f, -0.003222f, -0.001830f, -0.004902f, + -0.002240f, -0.004348f, +0.003024f, +0.002535f, -0.007042f, -0.001407f, -0.006338f, +0.001575f, +0.002086f, -0.008716f, + +0.000515f, -0.003830f, -0.002405f, +0.003300f, -0.001440f, -0.003019f, -0.002486f, +0.005939f, +0.001294f, -0.002945f, + +0.003482f, -0.002999f, -0.001825f, +0.002565f, +0.000578f, -0.000509f, -0.004642f, +0.000980f, +0.004244f, -0.000267f, + +0.002170f, -0.001998f, -0.000212f, +0.004935f, -0.002433f, -0.002427f + }, + { + -0.001325f, +0.021920f, -0.050222f, +0.005774f, -0.008548f, +0.006900f, -0.022200f, +0.011613f, -0.004685f, -0.002377f, + -0.006700f, -0.006690f, +0.031371f, -0.011662f, -0.038550f, +0.022290f, +0.007753f, +0.024233f, +0.012254f, -0.019852f, + -0.002117f, +0.010770f, +0.020075f, -0.019290f, +0.007482f, -0.006472f, -0.003663f, -0.017187f, +0.009688f, -0.002711f, + +0.011553f, -0.016761f, +0.013727f, +0.001555f, -0.005877f, -0.003753f, -0.023747f, -0.019965f, -0.004049f, +0.023668f, + +0.009655f, -0.008194f, +0.009380f, -0.004019f, -0.012452f, +0.005674f, +0.004766f, +0.000026f, +0.002761f, -0.001044f, + -0.005687f, -0.010557f, -0.002835f, -0.003212f, +0.013390f, -0.003509f, +0.001014f, -0.004415f, -0.000087f, +0.009147f, + -0.001072f, +0.006280f, -0.011853f, -0.000765f, +0.005572f, -0.004509f, -0.007998f, +0.004330f, -0.007671f, -0.001730f, + +0.002664f, -0.003106f, -0.004296f, +0.005794f, -0.004449f, -0.002922f, +0.001200f, +0.005452f, -0.001081f, +0.005245f, + -0.000049f, +0.000077f, +0.000537f, +0.002906f, +0.003796f, +0.003938f, -0.002779f, +0.004840f, -0.003533f, -0.002316f, + -0.003853f, +0.000193f, +0.003036f, +0.001280f, -0.002423f, -0.002353f + }, + { + -0.013146f, -0.184239f, -0.013584f, +0.033013f, +0.001074f, -0.023351f, +0.052053f, +0.006835f, +0.001291f, +0.017948f, + -0.000898f, +0.017902f, -0.036930f, +0.011227f, -0.032528f, +0.013504f, +0.005403f, -0.014107f, -0.013774f, +0.016839f, + +0.001548f, +0.015044f, -0.013192f, +0.000771f, +0.005769f, -0.009490f, +0.007045f, +0.012268f, -0.009695f, -0.019520f, + -0.017083f, +0.011632f, +0.001895f, -0.013889f, -0.007890f, +0.010377f, +0.016548f, -0.008514f, +0.007280f, -0.002795f, + -0.001629f, +0.008821f, -0.000728f, +0.023230f, -0.015457f, +0.011004f, -0.006473f, +0.002141f, -0.002294f, +0.008917f, + +0.005131f, -0.008999f, -0.000724f, -0.000386f, -0.006217f, -0.005236f, -0.002110f, -0.001071f, +0.011215f, -0.005032f, + -0.002310f, +0.002620f, -0.001995f, -0.010912f, +0.006524f, -0.003100f, +0.000048f, -0.001623f, +0.001497f, +0.000599f, + +0.001926f, +0.002473f, -0.010952f, +0.003669f, -0.001345f, +0.005443f, -0.003227f, -0.001079f, +0.003190f, +0.001802f, + +0.001237f, +0.003551f, +0.002589f, -0.002951f, +0.001811f, +0.000386f, +0.000723f, +0.002266f, +0.003547f, -0.000230f, + +0.001734f, +0.001383f, -0.001491f, +0.003923f, +0.000748f, +0.001372f + }, + { + -0.001056f, +0.111518f, -0.018150f, -0.008704f, +0.002250f, +0.012710f, -0.026799f, -0.004600f, +0.004087f, -0.003759f, + -0.003046f, +0.004272f, -0.003921f, +0.017222f, +0.045140f, +0.059560f, -0.001753f, +0.007509f, +0.004351f, -0.021522f, + -0.030350f, +0.013165f, -0.011698f, -0.007390f, +0.020251f, -0.010927f, +0.017232f, -0.006068f, -0.004111f, +0.024132f, + -0.001643f, -0.005534f, +0.019161f, -0.017231f, +0.014570f, +0.004120f, -0.011757f, -0.003643f, -0.014154f, -0.009366f, + -0.004189f, -0.000375f, -0.000997f, -0.000846f, -0.011576f, +0.008307f, -0.010064f, +0.003918f, +0.002190f, -0.000437f, + +0.017386f, +0.001715f, -0.002263f, +0.003513f, -0.009706f, +0.000549f, +0.002530f, +0.004765f, +0.006481f, -0.005586f, + +0.005432f, -0.003385f, -0.003797f, +0.001530f, -0.003101f, +0.002747f, +0.004117f, -0.001046f, +0.001765f, -0.008189f, + +0.003877f, -0.002977f, -0.007776f, -0.003515f, -0.003816f, +0.002735f, -0.003652f, +0.001160f, -0.001126f, +0.002862f, + -0.001825f, +0.002332f, -0.002492f, -0.003118f, +0.002304f, -0.002726f, -0.001519f, +0.000403f, -0.001729f, -0.002087f, + +0.003240f, -0.003461f, +0.005297f, +0.001651f, -0.000991f, +0.000012f + } + }, + { + { + -0.008284f, +0.211916f, -0.010306f, -0.113087f, -0.033144f, +0.013997f, +0.007648f, -0.003333f, +0.024033f, -0.014551f, + +0.007578f, -0.005071f, -0.005551f, -0.005831f, -0.002184f, +0.003168f, +0.006608f, +0.029486f, -0.008127f, -0.047197f, + -0.007831f, -0.016072f, +0.001617f, +0.006841f, +0.001821f, +0.003536f, +0.000721f, -0.007313f, +0.000649f, -0.017565f, + -0.002426f, +0.014351f, +0.007330f, -0.014200f, -0.007128f, +0.007912f, +0.008431f, -0.006393f, +0.004247f, +0.002269f, + -0.011122f, -0.006936f, -0.001978f, +0.003538f, +0.006273f, -0.000749f, -0.006034f, -0.004931f, +0.000935f, -0.003660f, + -0.004349f, -0.000993f, +0.001622f, -0.004195f, -0.005609f, -0.000177f, -0.000461f, -0.007011f, -0.001850f, +0.001656f, + -0.001868f, +0.006745f, -0.000110f, +0.010284f, +0.004385f, +0.003896f, +0.001034f, -0.008420f, -0.001477f, -0.004970f, + +0.000705f, +0.000025f, -0.005521f, -0.000866f, +0.000062f, -0.000038f, +0.002134f, +0.000919f, +0.004101f, +0.001439f, + -0.001927f, -0.000771f, +0.000861f, +0.004357f, -0.000609f, +0.001527f, -0.002766f, +0.000859f, -0.001534f, +0.001519f, + +0.001600f, -0.000214f, +0.001668f, -0.000187f, +0.001765f, +0.000486f + }, + { + -0.000598f, -0.108535f, -0.004872f, +0.007982f, -0.031250f, -0.006178f, -0.005330f, +0.012059f, -0.002506f, -0.005528f, + +0.008673f, -0.004867f, +0.022286f, +0.008045f, -0.000694f, -0.007649f, -0.003188f, -0.028086f, +0.002580f, +0.022663f, + +0.006380f, -0.017815f, +0.001593f, +0.014157f, -0.001825f, -0.011083f, -0.006399f, +0.001341f, -0.012029f, +0.007723f, + -0.006819f, +0.000918f, -0.022070f, -0.001331f, +0.001508f, +0.013021f, +0.006096f, +0.003575f, -0.010269f, +0.006547f, + -0.012336f, -0.009198f, +0.000854f, -0.004919f, +0.000871f, -0.006494f, +0.009591f, -0.003922f, -0.009750f, +0.003109f, + -0.004203f, -0.001903f, +0.000391f, -0.000649f, +0.001221f, -0.002908f, +0.002478f, -0.002847f, +0.001732f, -0.009592f, + +0.001076f, +0.006217f, +0.001562f, +0.001657f, -0.002999f, +0.000557f, -0.002037f, +0.002712f, +0.004164f, -0.004019f, + +0.000878f, +0.003093f, -0.002395f, -0.000158f, -0.001083f, -0.001287f, -0.005051f, -0.003765f, +0.001534f, -0.000935f, + -0.000142f, +0.003588f, +0.003464f, +0.001883f, +0.002176f, -0.001729f, -0.002885f, -0.001783f, +0.001110f, +0.000898f, + -0.001889f, -0.000722f, -0.000781f, +0.000129f, +0.000518f, -0.005177f + }, + { + +0.000810f, -0.034339f, +0.001518f, -0.061297f, -0.027848f, -0.003135f, +0.007863f, +0.009551f, -0.010620f, -0.009218f, + +0.018721f, -0.030526f, +0.001019f, -0.015995f, -0.000957f, +0.004077f, -0.004218f, -0.000420f, -0.000418f, +0.021286f, + -0.011007f, +0.022396f, -0.002069f, -0.006647f, +0.010257f, -0.008517f, -0.010870f, -0.002472f, +0.002663f, +0.006562f, + -0.001760f, -0.003349f, -0.006364f, -0.001956f, -0.013020f, -0.001523f, +0.005650f, +0.003551f, +0.000387f, +0.001716f, + +0.002506f, +0.000876f, +0.003926f, -0.006469f, -0.001740f, +0.017873f, +0.009722f, -0.000847f, -0.004993f, -0.006134f, + +0.005822f, +0.013330f, -0.007228f, +0.002418f, +0.001299f, -0.007404f, +0.006354f, +0.002091f, +0.001296f, -0.006403f, + -0.002499f, -0.001505f, +0.006653f, -0.009321f, -0.002453f, -0.000424f, -0.003363f, +0.002584f, +0.003161f, -0.003343f, + -0.001641f, +0.007179f, +0.002148f, -0.003798f, -0.005382f, -0.005533f, +0.003938f, +0.001309f, -0.002255f, -0.000846f, + +0.002163f, +0.000998f, -0.000193f, +0.001878f, -0.001756f, -0.002520f, +0.002302f, +0.001249f, +0.000234f, -0.000395f, + +0.000770f, -0.000118f, -0.000081f, -0.001728f, -0.000183f, -0.001051f + }, + { + +0.026357f, -0.001120f, -0.066058f, +0.023750f, +0.022115f, +0.007885f, +0.001498f, -0.010550f, -0.011250f, -0.007481f, + +0.007404f, -0.013002f, -0.007172f, -0.002478f, -0.019114f, -0.007472f, +0.009424f, -0.002191f, +0.011287f, +0.020782f, + +0.009724f, +0.001069f, -0.010976f, +0.007158f, +0.010388f, -0.007375f, -0.002106f, +0.003573f, +0.002834f, -0.002244f, + +0.001598f, +0.001134f, +0.014979f, -0.015083f, -0.012404f, -0.018929f, -0.004862f, +0.000192f, -0.000759f, +0.001487f, + +0.006345f, +0.002186f, +0.010516f, +0.005716f, +0.007595f, -0.010634f, -0.007218f, +0.001414f, -0.007207f, +0.011078f, + +0.000875f, -0.000433f, +0.004218f, +0.001217f, -0.002169f, -0.000099f, +0.001680f, -0.002557f, -0.000983f, -0.009967f, + +0.006524f, +0.002402f, +0.004472f, -0.003428f, -0.002105f, -0.000917f, +0.004628f, +0.003998f, +0.001376f, -0.002288f, + -0.001619f, -0.005893f, +0.003743f, -0.000101f, -0.002241f, +0.001988f, -0.003459f, -0.000049f, -0.003516f, -0.001754f, + -0.001125f, +0.000054f, +0.002353f, +0.004160f, -0.002643f, +0.000778f, -0.003092f, -0.002232f, -0.001597f, +0.001280f, + +0.004040f, -0.003811f, +0.003506f, -0.001131f, +0.000436f, +0.000802f + }, + { + +0.000704f, -0.070258f, +0.048807f, +0.010030f, -0.002454f, -0.001901f, -0.003119f, +0.003405f, -0.004949f, -0.002756f, + +0.011019f, +0.014804f, -0.002683f, -0.024655f, -0.026595f, -0.017686f, -0.023810f, +0.019013f, -0.034848f, +0.009965f, + +0.005227f, -0.000751f, -0.008943f, +0.006411f, +0.000642f, +0.002629f, +0.011225f, +0.008464f, -0.000055f, -0.000385f, + -0.019474f, +0.001272f, +0.002632f, -0.003956f, +0.019037f, +0.006136f, +0.006757f, +0.009025f, -0.016479f, +0.000279f, + +0.018456f, -0.010209f, +0.002622f, +0.002908f, -0.006411f, -0.003720f, +0.009254f, +0.000458f, -0.006710f, +0.002784f, + +0.003579f, -0.005314f, -0.010639f, +0.002686f, -0.005508f, +0.009087f, -0.002070f, -0.000914f, -0.003086f, +0.000612f, + +0.001774f, +0.003070f, +0.003068f, +0.003171f, +0.005182f, +0.003263f, -0.004661f, -0.004028f, +0.004128f, -0.000644f, + -0.002942f, -0.001957f, +0.001283f, -0.004732f, +0.002804f, +0.000477f, +0.004617f, -0.000152f, +0.000554f, -0.002902f, + +0.000160f, -0.000834f, -0.001687f, +0.001674f, -0.004050f, +0.001398f, -0.002440f, +0.001400f, -0.002399f, -0.000905f, + -0.000021f, +0.000341f, -0.001333f, -0.000280f, +0.001364f, +0.001729f + }, + { + +0.031211f, -0.025296f, -0.043805f, -0.000340f, +0.010779f, +0.000424f, +0.001013f, -0.006142f, +0.005909f, -0.020534f, + +0.011094f, -0.015817f, +0.009222f, -0.000029f, -0.017073f, -0.015386f, -0.006253f, +0.000889f, -0.019834f, +0.001895f, + +0.014823f, -0.016816f, +0.009916f, -0.026104f, +0.033388f, +0.016828f, -0.003129f, +0.000306f, +0.004068f, +0.011888f, + +0.004006f, +0.018069f, -0.009036f, +0.000262f, -0.001819f, -0.005437f, -0.007758f, -0.005355f, +0.002260f, -0.003318f, + -0.000845f, +0.006571f, -0.014199f, -0.006024f, -0.007765f, -0.006418f, +0.015052f, -0.007830f, +0.005391f, -0.000604f, + -0.004004f, +0.009633f, -0.000381f, +0.000050f, -0.003451f, +0.006817f, +0.000390f, +0.001746f, -0.008429f, -0.001652f, + -0.000351f, +0.002244f, +0.005856f, -0.005698f, +0.003035f, -0.004569f, +0.000889f, -0.002293f, +0.003500f, +0.001621f, + +0.003687f, +0.005559f, -0.004542f, -0.004750f, +0.004766f, +0.002745f, +0.001216f, -0.002752f, -0.001558f, -0.000828f, + -0.000697f, +0.001354f, -0.002749f, -0.001776f, +0.001837f, +0.000672f, +0.002431f, +0.000668f, -0.002262f, +0.001902f, + +0.001395f, +0.003936f, -0.001430f, -0.000190f, -0.002408f, -0.002029f + }, + { + -0.002962f, +0.001650f, -0.015452f, +0.012387f, +0.003806f, +0.001584f, -0.001221f, +0.009073f, -0.003185f, -0.001695f, + -0.007192f, +0.006987f, -0.009857f, -0.000908f, -0.008365f, -0.020013f, -0.036313f, -0.022058f, +0.011456f, -0.005632f, + -0.022168f, -0.006958f, +0.023055f, +0.011149f, -0.000685f, +0.003956f, +0.006515f, -0.012409f, +0.004078f, +0.039931f, + +0.006954f, +0.000872f, -0.011132f, +0.021726f, +0.002393f, -0.012148f, +0.013730f, -0.013716f, +0.009593f, +0.007394f, + -0.002364f, -0.009237f, -0.007887f, +0.012827f, -0.003941f, -0.003476f, -0.004679f, +0.005295f, -0.012485f, +0.009847f, + -0.002509f, -0.010799f, -0.006606f, -0.002753f, +0.004294f, -0.010414f, +0.003040f, -0.000813f, -0.001559f, +0.002336f, + -0.004799f, -0.004744f, -0.003111f, -0.005403f, -0.002652f, -0.000313f, +0.004614f, +0.002303f, +0.000845f, +0.001352f, + +0.004955f, +0.004962f, +0.003299f, -0.002012f, +0.001381f, +0.002944f, +0.000434f, +0.001517f, +0.006835f, -0.004320f, + +0.000152f, -0.000178f, +0.002995f, -0.002330f, -0.003515f, -0.001238f, -0.000391f, +0.000617f, -0.003613f, +0.001373f, + -0.001977f, +0.000513f, +0.000149f, -0.001587f, -0.002105f, +0.000357f + }, + { + +0.033029f, -0.007031f, -0.032162f, -0.032087f, +0.009424f, +0.004269f, +0.011296f, -0.005803f, +0.007096f, +0.005042f, + +0.036946f, -0.008858f, -0.007749f, +0.010667f, +0.015160f, +0.029897f, -0.022896f, +0.002040f, +0.007100f, +0.013898f, + -0.002428f, +0.000680f, +0.009866f, -0.009836f, -0.000036f, -0.010142f, +0.008404f, +0.002561f, +0.011968f, +0.001979f, + -0.006472f, +0.004371f, -0.002487f, +0.001788f, -0.007429f, -0.004311f, +0.016935f, +0.003771f, -0.006614f, +0.000148f, + +0.001540f, +0.002545f, -0.011899f, -0.005126f, +0.006167f, +0.004351f, +0.004605f, -0.008920f, +0.004831f, +0.000430f, + -0.007559f, +0.005314f, -0.005065f, -0.000099f, -0.003396f, +0.008261f, +0.004001f, +0.009870f, -0.003404f, +0.000085f, + +0.007441f, -0.002696f, -0.001012f, -0.001630f, +0.004837f, +0.006099f, +0.001973f, +0.003388f, -0.001058f, +0.002182f, + +0.003131f, -0.007283f, -0.000116f, +0.003666f, -0.002576f, -0.001803f, +0.001638f, +0.003405f, -0.000426f, +0.002077f, + +0.000851f, +0.004781f, +0.000723f, +0.003090f, +0.002951f, -0.002036f, +0.000047f, +0.001794f, +0.002540f, -0.001742f, + +0.000027f, -0.002109f, +0.002220f, +0.001689f, -0.000371f, -0.001959f + }, + { + -0.004583f, +0.066019f, -0.030711f, +0.021787f, +0.006999f, +0.004808f, -0.004855f, +0.000166f, +0.001793f, -0.000683f, + -0.005929f, +0.011861f, -0.000458f, -0.018246f, -0.008287f, +0.016728f, +0.024687f, -0.000460f, +0.005441f, +0.013978f, + +0.006478f, +0.006811f, -0.007281f, -0.013531f, +0.008641f, -0.014214f, +0.008924f, -0.004956f, +0.005929f, +0.009057f, + -0.006293f, +0.002136f, -0.013094f, -0.005772f, -0.002702f, +0.000278f, +0.006967f, -0.000196f, -0.024136f, +0.001163f, + +0.004446f, -0.007083f, -0.001072f, -0.012110f, +0.007468f, -0.005862f, -0.002154f, +0.004661f, -0.002877f, -0.002886f, + +0.002353f, -0.002166f, -0.003380f, -0.006386f, +0.003288f, -0.005972f, +0.004445f, +0.004816f, -0.003217f, -0.004127f, + -0.003864f, +0.000143f, +0.002404f, -0.002028f, -0.001098f, +0.000562f, +0.002586f, +0.000611f, -0.000042f, -0.002035f, + +0.000316f, -0.000840f, -0.000133f, +0.002282f, +0.001237f, -0.001689f, -0.000077f, -0.003326f, -0.002669f, -0.001829f, + +0.001586f, +0.001330f, -0.003536f, -0.000785f, +0.001550f, +0.000412f, -0.001800f, +0.002623f, +0.001996f, +0.004139f, + -0.002007f, +0.002686f, -0.001778f, -0.000735f, +0.000657f, +0.002588f + }, + { + +0.011169f, +0.192466f, -0.017952f, -0.003520f, -0.031547f, +0.004198f, +0.038181f, -0.006771f, -0.026515f, -0.015280f, + -0.023617f, -0.003213f, +0.010251f, -0.001446f, +0.019208f, -0.014648f, -0.033020f, -0.024019f, -0.005316f, -0.021201f, + +0.009415f, -0.024054f, +0.011766f, +0.012322f, +0.013698f, +0.027984f, -0.019578f, -0.000099f, +0.002035f, -0.011860f, + -0.002701f, -0.002453f, +0.002201f, +0.010106f, +0.005204f, -0.015189f, +0.010347f, -0.009908f, +0.000289f, +0.012658f, + +0.007578f, +0.002590f, -0.018156f, +0.000503f, +0.003032f, -0.006263f, +0.006952f, +0.006979f, -0.004419f, -0.006621f, + -0.002799f, +0.003666f, +0.021310f, -0.014989f, -0.010053f, -0.000738f, -0.005143f, -0.005468f, -0.000589f, -0.003427f, + -0.000929f, +0.005402f, +0.001192f, -0.006977f, +0.003863f, -0.004899f, -0.004804f, +0.006336f, +0.001570f, -0.006679f, + +0.007548f, -0.000942f, +0.001036f, +0.001187f, +0.001387f, +0.001295f, +0.003052f, -0.002210f, -0.006474f, -0.002770f, + -0.000584f, +0.002695f, -0.007165f, +0.001094f, +0.001806f, +0.001393f, +0.006605f, +0.001148f, +0.000786f, -0.001805f, + +0.001961f, -0.001634f, -0.000213f, +0.000284f, +0.000478f, -0.003187f + }, + { + +0.000358f, -0.016243f, +0.039415f, -0.015629f, -0.006491f, -0.007252f, +0.026465f, +0.001038f, -0.028095f, -0.009910f, + -0.007449f, +0.005325f, -0.006423f, -0.005785f, -0.029156f, -0.006146f, +0.019734f, -0.016294f, +0.008590f, -0.026536f, + -0.011343f, +0.021044f, +0.020043f, -0.034287f, +0.020565f, +0.010429f, -0.005188f, +0.008501f, +0.030204f, -0.022818f, + +0.010187f, -0.009493f, -0.002421f, +0.002472f, -0.012539f, -0.019671f, -0.002688f, -0.008266f, -0.000337f, +0.005595f, + -0.008529f, -0.010224f, +0.010630f, +0.001920f, +0.006695f, +0.006351f, +0.005650f, -0.007245f, +0.005043f, +0.000050f, + -0.003435f, +0.005663f, -0.004500f, -0.014634f, +0.003749f, +0.001035f, -0.000532f, -0.010337f, +0.010307f, +0.007122f, + +0.000294f, -0.004468f, +0.009937f, +0.007090f, +0.007352f, -0.000136f, -0.000322f, -0.003436f, +0.001088f, +0.009993f, + -0.004336f, -0.002857f, -0.001839f, -0.001950f, -0.007206f, +0.000388f, +0.005725f, +0.001272f, -0.001567f, -0.002265f, + +0.004455f, -0.004390f, -0.002642f, -0.002364f, +0.001779f, +0.000073f, +0.006576f, +0.002308f, -0.000601f, +0.000350f, + -0.000688f, -0.003329f, +0.000153f, -0.003172f, -0.000061f, +0.001704f + }, + { + +0.006845f, -0.248167f, -0.014974f, +0.000818f, -0.011660f, +0.000427f, -0.041761f, -0.003855f, +0.002633f, -0.007629f, + -0.011877f, +0.020058f, -0.017764f, -0.000975f, -0.022580f, +0.004369f, +0.025015f, -0.016137f, +0.031440f, +0.012730f, + +0.002523f, -0.005741f, +0.009087f, +0.009527f, -0.004816f, +0.008312f, +0.008939f, -0.012902f, -0.008640f, +0.010484f, + -0.008314f, -0.010482f, +0.005414f, -0.005646f, +0.000650f, -0.014412f, +0.009922f, +0.011086f, -0.001104f, +0.006873f, + +0.006857f, -0.008751f, -0.008005f, +0.004468f, -0.006214f, +0.000936f, -0.005580f, -0.012118f, +0.007128f, -0.004235f, + +0.007502f, -0.002703f, +0.004315f, +0.009464f, -0.003059f, -0.002297f, -0.002304f, -0.005214f, -0.008907f, -0.001507f, + -0.000465f, -0.006727f, +0.003442f, -0.001827f, -0.007425f, -0.000842f, -0.003091f, -0.003439f, +0.006504f, +0.000766f, + -0.006903f, -0.002570f, +0.002986f, +0.003516f, -0.005125f, -0.000902f, -0.004199f, +0.004974f, +0.005100f, -0.004101f, + +0.002760f, +0.000113f, -0.000183f, +0.003707f, -0.002502f, -0.003124f, +0.000392f, -0.001650f, +0.002119f, +0.004667f, + -0.000406f, -0.001422f, +0.000721f, +0.000859f, -0.001502f, +0.002016f + }, + { + +0.000516f, -0.055750f, +0.005203f, +0.003634f, +0.004865f, +0.001358f, -0.014612f, -0.001497f, +0.005517f, -0.005240f, + -0.013020f, +0.011342f, -0.010203f, +0.021840f, -0.007016f, +0.020752f, -0.015096f, +0.033314f, +0.004027f, -0.013288f, + +0.004872f, -0.008153f, +0.030372f, -0.009677f, -0.025838f, +0.017976f, -0.013154f, -0.006012f, -0.011726f, +0.008383f, + +0.012299f, -0.027068f, +0.015655f, -0.011606f, +0.020153f, -0.014524f, -0.006272f, -0.015050f, -0.002542f, +0.012101f, + +0.005393f, -0.001793f, -0.004326f, -0.000292f, -0.004653f, +0.002822f, +0.006977f, -0.004927f, +0.001725f, +0.002553f, + -0.012781f, -0.007060f, -0.002740f, -0.000593f, +0.010153f, +0.002064f, +0.000247f, +0.003821f, -0.003860f, +0.005939f, + +0.006751f, +0.004783f, -0.012207f, +0.002900f, -0.002270f, -0.003658f, -0.008400f, +0.006549f, -0.003885f, -0.000424f, + -0.002319f, -0.000455f, -0.001967f, -0.000751f, +0.004431f, -0.004391f, -0.002466f, +0.005837f, -0.001003f, +0.006956f, + -0.006370f, +0.004166f, +0.005139f, -0.004942f, +0.008061f, +0.004353f, +0.000630f, -0.001094f, +0.001358f, -0.005992f, + +0.000164f, +0.001916f, +0.004626f, -0.003660f, -0.001642f, -0.001202f + }, + { + +0.010789f, -0.175653f, -0.029908f, +0.016369f, +0.009169f, +0.006584f, +0.010570f, +0.017193f, -0.011048f, +0.020429f, + +0.006000f, +0.007320f, -0.015925f, -0.008513f, -0.014595f, +0.009792f, -0.003887f, -0.015605f, +0.013494f, +0.000620f, + +0.005423f, +0.010729f, -0.015435f, -0.001461f, +0.023774f, -0.010643f, +0.006332f, +0.002185f, -0.004695f, -0.013842f, + -0.017396f, -0.002024f, +0.003904f, -0.007068f, +0.007076f, +0.005849f, +0.004418f, -0.008591f, +0.009661f, +0.003732f, + -0.005799f, -0.007265f, +0.014168f, +0.013830f, -0.017635f, +0.006696f, -0.002155f, +0.007468f, +0.002225f, +0.004755f, + +0.001064f, -0.005187f, -0.002352f, -0.001073f, -0.011027f, +0.004754f, -0.007301f, +0.006598f, +0.007439f, -0.005714f, + +0.006215f, -0.005297f, -0.005472f, -0.003389f, +0.000646f, -0.002441f, +0.002651f, -0.003615f, +0.001636f, -0.001118f, + +0.001402f, +0.001335f, -0.003874f, -0.002508f, +0.004887f, +0.000035f, -0.000256f, -0.003232f, +0.002327f, +0.000889f, + +0.003413f, +0.003909f, -0.000031f, -0.000858f, +0.000534f, -0.001011f, +0.005526f, +0.000262f, +0.000216f, +0.001729f, + +0.001162f, +0.000066f, -0.001699f, +0.003160f, +0.003181f, -0.000008f + }, + { + +0.001136f, +0.052935f, +0.024114f, -0.025512f, +0.019288f, +0.005259f, -0.021281f, -0.003652f, -0.004851f, +0.001275f, + +0.008506f, +0.004474f, -0.012318f, +0.000069f, +0.097733f, +0.011397f, +0.016205f, +0.006543f, +0.027162f, -0.022119f, + -0.014591f, -0.004744f, -0.004808f, -0.002164f, +0.010156f, -0.012384f, +0.005015f, +0.002684f, +0.009982f, +0.018752f, + -0.000297f, -0.018000f, +0.016541f, -0.016329f, +0.013707f, +0.002132f, +0.002211f, -0.019315f, -0.012451f, +0.000628f, + -0.003207f, -0.013271f, -0.005688f, -0.004620f, -0.000666f, +0.002830f, -0.005001f, -0.002557f, +0.004625f, +0.006932f, + +0.007375f, +0.003997f, +0.000389f, -0.001810f, -0.011559f, -0.000087f, +0.007744f, +0.003003f, +0.008099f, -0.004655f, + +0.002869f, -0.002005f, +0.000840f, -0.004478f, -0.005622f, +0.005667f, -0.000961f, +0.008696f, -0.001405f, -0.004397f, + +0.001254f, -0.007088f, -0.002150f, -0.001208f, -0.000878f, -0.005978f, -0.000890f, +0.002536f, -0.001153f, -0.003578f, + +0.000861f, -0.000779f, -0.002869f, +0.001872f, -0.000341f, -0.003433f, +0.000134f, -0.000977f, -0.004042f, +0.000442f, + +0.000448f, -0.002007f, +0.003799f, +0.001460f, -0.000754f, -0.001352f + } + }, + { + { + +0.009504f, +0.187348f, -0.012059f, -0.061788f, +0.010334f, +0.010615f, -0.000031f, -0.001678f, +0.030926f, +0.002686f, + +0.002748f, -0.022157f, -0.008670f, -0.001256f, +0.000231f, -0.002442f, -0.004074f, +0.022603f, -0.010895f, -0.007435f, + +0.034787f, -0.008059f, -0.005709f, -0.005606f, -0.015695f, -0.010158f, -0.003928f, +0.000585f, +0.021039f, +0.006594f, + +0.009576f, +0.009492f, +0.019204f, -0.003776f, -0.004545f, +0.013093f, +0.015907f, -0.003357f, +0.000770f, +0.009592f, + -0.002009f, -0.002201f, -0.004884f, -0.002138f, +0.001203f, +0.003486f, +0.001395f, +0.005245f, +0.002611f, -0.005807f, + +0.002515f, -0.000255f, -0.004365f, -0.004304f, -0.008688f, -0.006056f, -0.000967f, -0.008859f, -0.004401f, +0.000015f, + -0.005477f, +0.002741f, -0.007955f, +0.004996f, +0.002315f, -0.002594f, -0.001000f, -0.006435f, +0.001534f, -0.004301f, + -0.002264f, -0.000053f, +0.000474f, +0.003361f, -0.001698f, -0.002596f, -0.001223f, -0.001935f, +0.002187f, +0.001380f, + -0.003313f, -0.001019f, +0.000199f, +0.001317f, -0.002390f, +0.001231f, -0.002346f, +0.001451f, -0.002059f, +0.002398f, + +0.002660f, -0.001525f, +0.000991f, +0.000397f, +0.001678f, +0.000909f + }, + { + +0.002140f, -0.030711f, +0.062358f, +0.040940f, -0.032137f, -0.008529f, +0.001171f, +0.019266f, -0.003976f, -0.005665f, + -0.003053f, -0.014908f, +0.011386f, -0.001424f, +0.002018f, -0.015377f, +0.011238f, +0.008119f, +0.022738f, +0.014047f, + +0.012971f, -0.016088f, -0.006644f, +0.000746f, -0.004702f, -0.002425f, +0.003044f, +0.006096f, -0.013817f, +0.007779f, + +0.003447f, +0.011844f, -0.020653f, +0.002464f, +0.001015f, +0.001286f, +0.001985f, +0.012055f, -0.008302f, +0.004956f, + -0.006777f, +0.005513f, +0.006333f, +0.000570f, +0.013167f, -0.001304f, +0.004810f, -0.011983f, -0.011343f, +0.005663f, + +0.006458f, +0.006214f, +0.002078f, -0.002868f, -0.008269f, -0.004432f, +0.005655f, -0.000198f, -0.001939f, -0.010845f, + +0.007334f, +0.006883f, -0.004884f, +0.000305f, -0.004835f, +0.002152f, +0.004339f, +0.003628f, +0.004947f, -0.004279f, + -0.002643f, -0.000674f, -0.001199f, +0.001768f, -0.000332f, -0.000628f, +0.000571f, +0.002960f, +0.003834f, +0.002008f, + +0.002277f, +0.001563f, +0.001482f, -0.000703f, +0.000726f, -0.000215f, +0.000478f, -0.000683f, +0.000729f, +0.001604f, + +0.004140f, +0.003390f, +0.000829f, -0.001179f, -0.000054f, -0.003338f + }, + { + +0.000289f, -0.150191f, -0.070355f, +0.023721f, +0.010359f, -0.006315f, +0.011318f, -0.003558f, -0.019121f, -0.005369f, + +0.013277f, -0.029464f, +0.011823f, -0.006042f, +0.013857f, +0.019905f, +0.001025f, -0.021772f, -0.028071f, +0.009526f, + -0.012972f, +0.013716f, -0.008088f, +0.002798f, +0.009902f, -0.012188f, -0.020037f, -0.002511f, +0.002386f, +0.000167f, + -0.000310f, +0.000688f, -0.015307f, -0.000478f, -0.003258f, +0.001486f, -0.004433f, -0.013741f, -0.008813f, -0.001638f, + +0.007298f, +0.003657f, +0.008505f, -0.010370f, -0.013335f, +0.008863f, +0.002562f, -0.001253f, +0.001125f, -0.003605f, + +0.005147f, +0.007894f, -0.007800f, +0.007390f, +0.001017f, -0.004968f, +0.005402f, +0.001422f, +0.004357f, -0.004127f, + -0.003830f, -0.004198f, +0.005892f, -0.002150f, -0.001519f, -0.003816f, -0.002713f, +0.000430f, +0.002127f, -0.004176f, + -0.004164f, +0.001434f, +0.001805f, -0.000643f, -0.005391f, -0.003857f, +0.007455f, +0.003826f, -0.001379f, -0.000994f, + +0.002418f, +0.001409f, -0.001471f, +0.002197f, -0.000891f, -0.003724f, +0.001971f, +0.003042f, +0.002708f, +0.001604f, + +0.001739f, -0.001579f, +0.001176f, -0.000143f, +0.000540f, -0.000756f + }, + { + -0.025328f, +0.003560f, +0.009409f, +0.016590f, -0.002509f, +0.003725f, +0.003109f, -0.012508f, -0.011247f, -0.018131f, + +0.002154f, -0.006564f, +0.003213f, +0.006994f, -0.011376f, -0.003750f, +0.006792f, -0.006331f, +0.002845f, +0.010238f, + -0.000957f, -0.003113f, -0.015548f, +0.000945f, +0.015491f, +0.004100f, -0.008724f, +0.004796f, +0.000001f, -0.004612f, + +0.011883f, +0.002103f, +0.007279f, -0.007896f, +0.004302f, +0.006814f, +0.010296f, -0.003054f, -0.000607f, +0.000113f, + +0.016394f, +0.006725f, +0.007116f, +0.004418f, -0.001198f, -0.001348f, +0.000502f, +0.002397f, -0.007069f, +0.005170f, + -0.001813f, -0.000171f, +0.004793f, +0.002298f, +0.000882f, -0.001702f, +0.001662f, +0.002742f, -0.001986f, -0.009686f, + +0.006396f, -0.003158f, +0.005833f, -0.000173f, -0.002373f, +0.005536f, +0.004615f, +0.004295f, +0.002895f, -0.005045f, + +0.000042f, -0.001440f, +0.004147f, +0.003172f, +0.000009f, +0.001798f, -0.002398f, +0.001094f, -0.002561f, -0.001477f, + -0.000711f, -0.000180f, -0.000053f, +0.003667f, -0.001762f, +0.000999f, -0.002009f, +0.001239f, +0.000273f, +0.000774f, + +0.001639f, -0.003708f, +0.002001f, -0.002350f, +0.000982f, +0.000801f + }, + { + +0.000464f, -0.094563f, +0.029559f, +0.017711f, -0.010004f, -0.000279f, +0.002104f, +0.005286f, +0.002103f, +0.000984f, + +0.009941f, +0.009697f, -0.000405f, -0.017636f, -0.009544f, +0.011806f, -0.023466f, -0.000737f, -0.028245f, +0.004729f, + -0.008466f, -0.011119f, -0.032608f, +0.014232f, +0.012028f, -0.013373f, -0.002037f, +0.006039f, -0.003720f, +0.008070f, + +0.000848f, +0.000498f, +0.001879f, -0.007926f, +0.002807f, -0.002214f, +0.014521f, +0.010545f, -0.008701f, -0.003194f, + +0.019560f, -0.011247f, -0.006617f, +0.001013f, -0.004133f, -0.002645f, +0.002128f, -0.002796f, -0.007890f, -0.001023f, + +0.003653f, +0.004191f, -0.004835f, +0.003035f, -0.000823f, +0.007790f, -0.006224f, +0.000505f, -0.004987f, -0.005157f, + -0.003581f, +0.001578f, +0.002315f, -0.002071f, -0.000598f, -0.001004f, -0.003447f, -0.002743f, -0.000465f, +0.002627f, + +0.002181f, +0.001678f, +0.000500f, -0.005540f, +0.004054f, +0.002309f, +0.005990f, -0.001780f, -0.000880f, -0.003378f, + -0.000131f, -0.001451f, +0.000445f, +0.002954f, -0.006550f, +0.000929f, -0.001088f, +0.001270f, -0.002273f, -0.001227f, + -0.002244f, -0.000337f, -0.001340f, +0.000523f, -0.000100f, -0.000909f + }, + { + -0.025869f, -0.046324f, +0.030387f, -0.005907f, -0.008810f, -0.006752f, +0.001815f, +0.011722f, +0.018698f, -0.022711f, + +0.011689f, -0.022791f, +0.014339f, +0.009236f, -0.013826f, -0.010059f, -0.006067f, +0.001358f, -0.011592f, +0.003114f, + +0.008400f, -0.012585f, +0.012635f, -0.021297f, +0.029087f, +0.007562f, -0.001258f, -0.003342f, -0.009914f, +0.004673f, + +0.004241f, +0.006941f, -0.010788f, +0.009838f, +0.006126f, -0.006452f, -0.012240f, -0.011162f, -0.002734f, -0.006073f, + -0.004176f, +0.003269f, -0.011969f, +0.000941f, +0.005932f, -0.002950f, +0.010062f, -0.015457f, -0.003085f, -0.004630f, + -0.011150f, +0.004762f, +0.006877f, +0.006874f, -0.005843f, +0.004501f, -0.000465f, +0.001276f, -0.005337f, -0.000872f, + +0.002352f, +0.003251f, -0.000697f, -0.005401f, +0.005783f, -0.003123f, +0.002333f, -0.002347f, +0.002379f, -0.000193f, + -0.000209f, +0.002130f, -0.002922f, -0.004071f, +0.001067f, +0.001603f, +0.001836f, -0.000800f, -0.000920f, +0.000002f, + +0.000257f, -0.000033f, -0.002123f, -0.002391f, +0.001101f, -0.000786f, -0.000534f, +0.000416f, -0.003133f, -0.000175f, + +0.000314f, +0.001564f, -0.002012f, +0.001090f, -0.001092f, -0.001314f + }, + { + +0.000937f, +0.026954f, -0.026992f, +0.003543f, -0.007243f, +0.000738f, -0.000702f, +0.004185f, -0.015091f, +0.001493f, + -0.001921f, +0.011345f, +0.003906f, +0.008712f, -0.004756f, +0.003403f, -0.005513f, -0.012579f, +0.016276f, -0.003764f, + -0.030722f, -0.014688f, +0.001998f, +0.006487f, -0.009863f, -0.002957f, +0.017165f, -0.006388f, +0.002082f, +0.015058f, + -0.003413f, +0.008147f, -0.002627f, +0.017876f, +0.001753f, -0.013045f, +0.013483f, -0.007088f, -0.000763f, -0.003371f, + +0.000111f, +0.003855f, -0.000645f, +0.006969f, -0.000987f, +0.001133f, -0.005878f, +0.009365f, -0.002302f, +0.009134f, + -0.004647f, -0.006359f, +0.001690f, -0.009037f, -0.002956f, -0.008732f, +0.005723f, -0.001487f, +0.001686f, +0.008774f, + -0.003610f, -0.003363f, -0.002633f, -0.005146f, -0.000856f, +0.001962f, +0.006672f, +0.000391f, -0.000584f, +0.001610f, + +0.003863f, +0.000064f, +0.002017f, -0.001508f, +0.001595f, +0.000946f, -0.002919f, -0.002173f, +0.006846f, -0.004198f, + +0.002263f, -0.003111f, +0.000641f, -0.002508f, -0.001804f, +0.002307f, +0.000278f, +0.002113f, -0.004081f, +0.000575f, + -0.003132f, -0.000276f, -0.000632f, -0.001627f, -0.002027f, +0.001712f + }, + { + -0.033157f, -0.035432f, +0.038230f, -0.045814f, -0.012016f, -0.006809f, +0.013628f, -0.003507f, -0.000647f, -0.007980f, + +0.039803f, +0.002501f, -0.002000f, +0.012512f, +0.000663f, +0.008615f, -0.017723f, +0.006341f, -0.003980f, -0.006933f, + -0.012577f, +0.002634f, +0.018901f, -0.004475f, -0.000447f, -0.000887f, +0.004443f, -0.007435f, -0.002531f, +0.000643f, + +0.004459f, +0.009064f, -0.012626f, -0.012228f, -0.005149f, -0.003643f, +0.009453f, +0.000404f, -0.008742f, -0.006439f, + -0.002244f, +0.006726f, +0.002498f, +0.003255f, +0.003539f, -0.002401f, +0.009220f, +0.006006f, +0.013395f, +0.003485f, + -0.005781f, +0.003253f, -0.002970f, +0.008025f, -0.001265f, +0.002984f, +0.000374f, +0.007758f, -0.005257f, -0.000237f, + +0.003215f, -0.006080f, +0.004715f, -0.002616f, +0.000905f, +0.006347f, +0.001331f, +0.004128f, +0.001295f, +0.002913f, + +0.002388f, -0.007335f, +0.001057f, +0.005243f, -0.002942f, -0.001955f, +0.000058f, -0.000151f, -0.005248f, -0.000220f, + +0.000310f, +0.003247f, -0.003088f, -0.001945f, +0.000455f, +0.000679f, +0.002250f, -0.000902f, -0.000062f, -0.000875f, + +0.001476f, -0.002924f, +0.000360f, -0.000172f, +0.001323f, -0.000663f + }, + { + -0.002042f, +0.042587f, -0.090742f, +0.008167f, -0.006677f, +0.000931f, +0.000330f, +0.002854f, +0.003076f, +0.002181f, + -0.012140f, +0.001715f, +0.018401f, +0.008208f, -0.009851f, -0.021333f, -0.010745f, +0.004063f, +0.009793f, +0.002446f, + -0.005851f, +0.003289f, +0.001042f, -0.000134f, +0.008335f, -0.019492f, +0.019854f, -0.005814f, -0.008327f, +0.009663f, + -0.011299f, -0.000790f, -0.009671f, -0.000241f, +0.006461f, +0.007996f, +0.003011f, +0.009538f, -0.015602f, +0.009078f, + +0.006565f, -0.007145f, +0.002204f, -0.013553f, +0.006098f, +0.000037f, -0.004169f, -0.006653f, -0.004880f, -0.002013f, + -0.002540f, +0.000248f, +0.001795f, -0.005893f, +0.002178f, -0.006268f, +0.004308f, +0.000642f, -0.002943f, +0.000669f, + -0.002933f, +0.001769f, -0.000256f, -0.004976f, +0.001732f, -0.002506f, -0.000675f, -0.001927f, -0.001723f, -0.002044f, + -0.001083f, -0.001453f, +0.001832f, +0.002281f, +0.001236f, +0.000217f, +0.003249f, +0.001146f, -0.000849f, -0.001202f, + -0.000283f, -0.000016f, -0.001884f, +0.000902f, -0.001233f, -0.000892f, -0.000846f, +0.001669f, -0.000190f, +0.002126f, + -0.001873f, +0.002642f, -0.002723f, +0.001536f, +0.002885f, +0.000572f + }, + { + -0.009374f, +0.151674f, -0.038720f, +0.007307f, -0.012775f, +0.009269f, +0.016016f, +0.013825f, +0.000301f, -0.008097f, + -0.028067f, -0.006507f, +0.005967f, -0.017595f, +0.009499f, +0.014516f, +0.003436f, -0.008062f, -0.012254f, -0.045322f, + -0.006626f, -0.017842f, +0.000361f, +0.006685f, -0.008029f, +0.020701f, -0.004702f, -0.000253f, +0.007285f, -0.010362f, + +0.005249f, -0.004686f, +0.007334f, +0.012826f, +0.003325f, -0.010764f, +0.003873f, -0.015096f, -0.010554f, -0.004501f, + -0.002282f, +0.009329f, -0.014698f, +0.002012f, +0.005141f, -0.009941f, +0.002261f, +0.013600f, +0.004534f, +0.003502f, + +0.000106f, +0.001509f, +0.019740f, -0.001805f, +0.005644f, +0.001494f, -0.007778f, -0.004181f, -0.001149f, -0.014369f, + +0.000173f, +0.006048f, +0.001072f, -0.006761f, +0.001036f, +0.001068f, -0.003585f, -0.001443f, -0.002036f, -0.002977f, + +0.005717f, -0.001303f, +0.003144f, -0.004199f, -0.003025f, -0.002714f, +0.002850f, +0.003804f, +0.001515f, -0.000535f, + -0.003296f, +0.002493f, -0.004496f, +0.001585f, -0.001481f, +0.000741f, +0.004727f, +0.000543f, +0.003841f, -0.000851f, + +0.002790f, +0.000903f, -0.000772f, -0.002641f, +0.000868f, -0.002434f + }, + { + +0.002155f, -0.081058f, +0.001664f, +0.008290f, +0.000868f, -0.002923f, +0.030406f, +0.008415f, -0.012071f, -0.004618f, + -0.008523f, +0.016549f, +0.003779f, +0.001812f, -0.005633f, +0.009904f, +0.009864f, -0.019748f, +0.018282f, -0.017982f, + -0.015988f, +0.013211f, -0.006847f, -0.036677f, +0.008493f, +0.002847f, -0.005478f, -0.003491f, +0.009314f, -0.033379f, + +0.018102f, +0.003339f, +0.003535f, +0.002448f, -0.009108f, -0.021666f, -0.005791f, -0.013605f, +0.000583f, +0.002306f, + -0.012302f, -0.005285f, +0.006048f, -0.010181f, +0.010586f, +0.009559f, -0.004851f, -0.011545f, +0.004277f, +0.004722f, + -0.003853f, -0.000092f, -0.001758f, -0.003460f, +0.012137f, +0.005315f, +0.002943f, -0.012130f, +0.008583f, +0.007453f, + +0.002508f, -0.007963f, -0.002301f, -0.000791f, +0.007820f, -0.005696f, -0.002871f, -0.003421f, -0.001788f, +0.009335f, + -0.002574f, -0.001971f, +0.000939f, +0.000048f, -0.005354f, -0.000758f, +0.001849f, +0.003603f, +0.000706f, -0.005809f, + +0.003011f, -0.003977f, -0.000147f, +0.002482f, +0.006750f, -0.001096f, +0.002714f, +0.001850f, -0.000133f, +0.003816f, + +0.001364f, -0.002437f, +0.003246f, -0.003148f, -0.002123f, +0.001964f + }, + { + +0.002888f, -0.203379f, +0.059325f, +0.033980f, -0.024186f, -0.002645f, -0.047073f, -0.009417f, +0.002354f, -0.008323f, + -0.059243f, +0.002044f, +0.000173f, +0.013222f, -0.028062f, -0.029298f, +0.001099f, -0.023684f, +0.029673f, +0.000222f, + -0.004854f, +0.002452f, -0.009830f, -0.008764f, -0.006291f, -0.001108f, -0.000538f, -0.005871f, +0.001651f, +0.016018f, + -0.000036f, -0.003929f, +0.001491f, -0.014357f, +0.006092f, -0.004130f, -0.004429f, -0.008355f, -0.019710f, +0.007935f, + +0.015975f, +0.002700f, +0.000357f, +0.000260f, +0.005747f, +0.005763f, -0.010641f, -0.009106f, +0.002670f, -0.009214f, + +0.007662f, -0.007016f, -0.010784f, +0.006357f, -0.007211f, -0.002924f, +0.002557f, +0.004780f, -0.001193f, -0.004407f, + -0.002727f, -0.005582f, -0.002039f, -0.009891f, -0.001796f, +0.002930f, +0.000318f, +0.001957f, +0.007714f, +0.008229f, + -0.000533f, -0.002073f, +0.006202f, +0.004409f, -0.006208f, +0.003114f, -0.003858f, -0.000753f, +0.005443f, -0.000746f, + +0.001213f, +0.002393f, +0.003479f, +0.004201f, -0.002356f, -0.002068f, +0.000984f, -0.003344f, -0.000610f, +0.004448f, + +0.000782f, -0.000877f, -0.000108f, -0.001980f, -0.002653f, +0.002178f + }, + { + +0.001160f, -0.074540f, +0.008472f, +0.014353f, +0.008042f, +0.003586f, -0.014260f, -0.006320f, +0.001192f, -0.003056f, + -0.002218f, +0.017282f, +0.000052f, +0.036982f, +0.012997f, +0.028732f, -0.016170f, +0.015882f, +0.001054f, +0.023427f, + +0.008227f, -0.045981f, -0.001729f, -0.001089f, -0.026353f, -0.003086f, -0.024843f, +0.005412f, +0.010134f, +0.011727f, + +0.015130f, -0.016361f, +0.015199f, -0.004684f, +0.020494f, -0.021833f, +0.000488f, +0.006891f, +0.008942f, +0.000757f, + -0.011637f, -0.014303f, -0.014355f, -0.000204f, +0.001401f, -0.004136f, +0.001464f, -0.006286f, +0.002840f, -0.000272f, + -0.011569f, +0.001132f, +0.003809f, +0.005679f, +0.004188f, +0.001833f, +0.001752f, +0.002597f, -0.000017f, +0.002980f, + +0.004820f, +0.008642f, -0.001438f, +0.007368f, -0.004526f, -0.000563f, -0.009246f, +0.004428f, +0.004127f, +0.001168f, + -0.002829f, +0.005122f, +0.001809f, -0.001475f, +0.006051f, +0.002939f, -0.001173f, -0.002687f, -0.003954f, +0.004755f, + -0.006206f, +0.004869f, +0.003773f, -0.009983f, +0.003613f, +0.004750f, +0.005000f, -0.001604f, -0.000585f, -0.001547f, + +0.004596f, +0.001129f, +0.001617f, -0.002738f, +0.001022f, +0.000855f + }, + { + -0.005385f, -0.137403f, +0.015889f, -0.002486f, +0.014457f, -0.003387f, -0.026269f, +0.000356f, -0.028098f, +0.002046f, + +0.013381f, +0.000352f, -0.023516f, +0.012333f, +0.029464f, +0.030459f, -0.004785f, -0.013455f, +0.018689f, -0.006663f, + -0.005530f, +0.000846f, +0.007600f, +0.020166f, +0.025685f, +0.000214f, +0.013116f, -0.001720f, -0.000195f, -0.004095f, + -0.016975f, -0.006934f, +0.012872f, +0.015574f, +0.004161f, -0.018208f, -0.015093f, -0.011700f, +0.006582f, +0.004216f, + -0.001656f, -0.018859f, -0.008852f, +0.001074f, -0.016805f, +0.000768f, -0.000566f, +0.003530f, +0.013717f, +0.017090f, + -0.000314f, -0.004834f, -0.004075f, +0.001344f, +0.000297f, +0.008819f, -0.011677f, +0.005363f, +0.006644f, -0.006074f, + +0.005198f, -0.007471f, -0.003295f, +0.002252f, -0.002676f, -0.006155f, +0.001898f, -0.004631f, +0.002386f, -0.001710f, + -0.000192f, +0.003963f, +0.003258f, -0.002492f, +0.003103f, -0.004436f, -0.002177f, -0.003066f, -0.001494f, -0.006018f, + -0.002629f, +0.002486f, +0.002338f, -0.000232f, -0.002171f, -0.000951f, +0.005019f, -0.001574f, -0.001510f, -0.000353f, + -0.000111f, +0.001866f, +0.000477f, +0.000665f, -0.000308f, +0.000701f + }, + { + +0.002482f, -0.020647f, -0.017754f, -0.017158f, +0.002603f, -0.010953f, -0.018608f, +0.002903f, -0.005078f, +0.009175f, + +0.007840f, -0.009862f, -0.008827f, -0.028504f, +0.055435f, -0.011655f, +0.009159f, +0.000090f, +0.034748f, +0.006828f, + -0.001374f, -0.010886f, +0.002487f, -0.006816f, +0.001046f, -0.009204f, -0.010281f, -0.004304f, +0.007749f, -0.003590f, + -0.009301f, -0.008543f, +0.017258f, -0.019394f, +0.001422f, +0.002738f, +0.000449f, -0.018001f, +0.001693f, +0.011565f, + -0.001238f, -0.009091f, -0.009774f, -0.001629f, +0.010753f, -0.006589f, -0.010621f, +0.001331f, +0.005213f, +0.002145f, + +0.000940f, -0.000574f, -0.001866f, +0.000250f, -0.007043f, +0.004967f, +0.007649f, +0.002720f, +0.006541f, -0.003602f, + +0.001620f, -0.003967f, +0.007019f, +0.000443f, -0.003439f, +0.002332f, -0.001497f, +0.009736f, -0.000101f, -0.002550f, + -0.000208f, -0.003761f, +0.006292f, +0.003473f, +0.000731f, -0.004082f, -0.001415f, +0.001125f, -0.000200f, -0.002399f, + +0.004156f, -0.000352f, -0.002140f, +0.001132f, -0.003253f, -0.004116f, -0.000079f, -0.002084f, -0.005067f, -0.001006f, + +0.000031f, +0.000658f, +0.002747f, +0.000641f, +0.001367f, +0.000498f + } + }, + { + { + -0.014571f, +0.061120f, +0.085737f, -0.014648f, -0.005062f, +0.002856f, +0.003101f, +0.016160f, +0.009665f, +0.018014f, + -0.018593f, -0.025944f, -0.004214f, +0.009638f, -0.012331f, +0.005317f, +0.001547f, +0.003646f, -0.007534f, +0.002823f, + +0.040321f, -0.008266f, -0.015840f, -0.013576f, -0.006040f, -0.002154f, -0.010699f, +0.003118f, +0.004384f, +0.013211f, + +0.015884f, +0.008460f, +0.010051f, +0.001778f, -0.006321f, +0.011922f, +0.015857f, +0.004827f, +0.003398f, +0.009110f, + -0.003037f, -0.006983f, +0.000549f, -0.005964f, -0.002748f, +0.002644f, +0.005489f, +0.007547f, -0.003628f, +0.002895f, + -0.002592f, -0.003655f, -0.000236f, -0.005656f, -0.005448f, -0.003752f, -0.003666f, -0.004591f, -0.003133f, -0.001210f, + -0.004011f, -0.000190f, -0.000640f, -0.000288f, -0.001777f, -0.003557f, +0.000831f, -0.004510f, -0.000943f, -0.003366f, + -0.000698f, -0.001000f, +0.003725f, +0.001604f, -0.001932f, -0.000700f, -0.004041f, -0.000069f, +0.001774f, -0.000339f, + -0.001699f, -0.003754f, +0.000768f, +0.000158f, +0.000445f, -0.002144f, +0.001884f, -0.002222f, +0.001153f, +0.000818f, + +0.001326f, -0.001039f, -0.000817f, +0.002276f, +0.000555f, -0.001048f + }, + { + -0.000605f, +0.055467f, -0.000155f, +0.033266f, -0.001835f, -0.008020f, -0.003409f, +0.016384f, +0.002388f, +0.003463f, + -0.014185f, -0.024166f, +0.014435f, -0.004548f, -0.000251f, -0.000678f, +0.002841f, +0.022380f, +0.005863f, +0.006151f, + +0.014995f, -0.001626f, -0.003489f, -0.014162f, -0.006211f, -0.004654f, +0.009124f, +0.002222f, -0.001764f, +0.001927f, + +0.013264f, +0.005441f, -0.016894f, +0.006306f, -0.012908f, +0.009334f, -0.011009f, +0.020839f, -0.005326f, +0.005549f, + -0.006869f, +0.004198f, +0.005106f, +0.007778f, +0.008445f, +0.002920f, +0.002679f, -0.011591f, -0.005984f, +0.004446f, + +0.002370f, +0.003003f, -0.000053f, +0.000792f, -0.003716f, -0.003892f, -0.000164f, +0.000818f, -0.002427f, -0.005703f, + +0.003314f, +0.006230f, -0.000361f, -0.005024f, -0.000111f, +0.000679f, +0.003818f, +0.001665f, +0.003895f, -0.004306f, + +0.000123f, -0.000008f, -0.001697f, -0.000006f, +0.000754f, -0.000300f, +0.002914f, +0.003495f, +0.001364f, +0.005211f, + +0.001413f, +0.001980f, +0.000111f, -0.001561f, -0.001617f, +0.000140f, +0.001922f, -0.000760f, +0.001611f, +0.000427f, + +0.006437f, +0.001080f, +0.000789f, +0.000709f, -0.001846f, -0.001505f + }, + { + -0.000671f, -0.179046f, -0.030861f, +0.057259f, -0.014365f, +0.003498f, +0.007378f, -0.004015f, -0.014157f, +0.004880f, + +0.000217f, -0.022193f, +0.003267f, +0.005551f, +0.011252f, +0.009458f, -0.007527f, -0.011795f, -0.015632f, -0.003957f, + -0.003309f, +0.000100f, -0.001767f, +0.007812f, -0.009154f, -0.010553f, -0.006451f, +0.000708f, -0.005408f, +0.002591f, + +0.003804f, -0.006044f, -0.001763f, -0.016922f, +0.004504f, -0.003064f, -0.009022f, -0.014469f, -0.009789f, -0.004564f, + +0.011285f, +0.002526f, +0.005683f, -0.008177f, -0.002926f, +0.004220f, -0.000350f, -0.004191f, +0.003471f, +0.003498f, + -0.000944f, -0.005316f, +0.007077f, -0.000285f, -0.002034f, -0.000042f, +0.007773f, +0.000992f, -0.000710f, +0.000275f, + -0.005720f, -0.000605f, -0.000533f, +0.004455f, -0.006327f, +0.000567f, -0.000804f, +0.000775f, -0.000783f, -0.000006f, + -0.005899f, -0.000573f, +0.001931f, +0.001391f, -0.005393f, -0.000785f, +0.001665f, +0.001509f, +0.003107f, -0.000901f, + +0.001126f, -0.000015f, +0.001531f, +0.002504f, -0.000241f, -0.001932f, +0.000833f, +0.002276f, +0.001593f, +0.002287f, + +0.000959f, -0.001274f, +0.001312f, +0.000324f, +0.000279f, -0.001010f + }, + { + +0.018376f, -0.044508f, -0.018015f, +0.027672f, +0.007527f, +0.003362f, +0.005376f, -0.013116f, -0.013011f, -0.009585f, + -0.002557f, -0.006996f, +0.011176f, +0.002538f, -0.014908f, -0.006044f, -0.002215f, +0.023706f, -0.025270f, +0.011278f, + -0.000762f, -0.006977f, -0.004701f, +0.009740f, +0.004252f, +0.011175f, -0.027033f, +0.019782f, -0.005326f, -0.000558f, + +0.013811f, +0.010054f, -0.004539f, -0.000849f, +0.007499f, +0.005176f, +0.006893f, +0.005532f, -0.005703f, +0.000328f, + +0.012223f, +0.011493f, -0.000876f, +0.005479f, -0.000209f, +0.002677f, -0.008169f, +0.010349f, -0.004350f, -0.001820f, + -0.000129f, +0.003963f, +0.001788f, +0.005976f, -0.001134f, -0.001661f, +0.001193f, +0.002800f, -0.002239f, -0.002583f, + -0.003701f, +0.002858f, +0.001007f, +0.005184f, -0.006750f, +0.006594f, +0.002743f, +0.004526f, +0.000428f, -0.000676f, + -0.003538f, +0.003011f, -0.000977f, +0.007352f, -0.001137f, +0.001032f, -0.000362f, +0.000268f, -0.001141f, -0.002016f, + +0.001778f, -0.000608f, +0.000582f, +0.000433f, -0.002110f, +0.001945f, +0.001621f, +0.000287f, -0.000834f, +0.000504f, + -0.000663f, -0.002088f, +0.001397f, +0.000349f, -0.001344f, -0.000865f + }, + { + +0.000040f, -0.048580f, -0.014247f, +0.019114f, -0.005997f, -0.001130f, +0.001600f, -0.001790f, +0.011267f, +0.002245f, + +0.013994f, -0.001880f, -0.002538f, -0.004313f, -0.000596f, -0.001963f, -0.003183f, -0.016789f, -0.006225f, -0.018741f, + -0.009323f, -0.004498f, -0.018423f, +0.000140f, +0.006253f, +0.009323f, -0.016346f, -0.001503f, -0.000097f, -0.001402f, + +0.006753f, +0.000793f, +0.000918f, +0.000902f, -0.005684f, -0.002855f, +0.011510f, +0.010591f, -0.004704f, -0.000910f, + +0.007176f, -0.000342f, -0.008503f, +0.000392f, -0.006343f, +0.004763f, +0.003227f, -0.004470f, -0.008507f, -0.000564f, + -0.000022f, +0.008051f, +0.000598f, +0.004106f, -0.001163f, +0.000588f, -0.000414f, -0.000807f, -0.000783f, -0.003693f, + -0.005601f, +0.002240f, -0.000002f, -0.006359f, +0.003528f, -0.005909f, -0.001161f, +0.003931f, -0.005417f, +0.001241f, + +0.004146f, +0.002206f, -0.001833f, +0.000132f, +0.000937f, +0.001506f, +0.002000f, -0.001544f, +0.000542f, -0.002541f, + -0.001423f, +0.004030f, -0.001930f, -0.001246f, +0.000232f, -0.002213f, +0.001385f, -0.001900f, -0.001030f, -0.002298f, + -0.001437f, -0.000809f, +0.001356f, +0.000292f, -0.002517f, -0.000655f + }, + { + +0.013178f, -0.077224f, +0.002166f, -0.016661f, +0.014189f, -0.004548f, -0.003634f, +0.018353f, +0.004028f, -0.005826f, + -0.001382f, -0.011028f, +0.011016f, +0.011951f, -0.018331f, +0.006869f, +0.000518f, -0.011898f, -0.012659f, +0.007719f, + -0.000740f, +0.000414f, -0.006109f, +0.001491f, +0.004124f, +0.002740f, +0.010262f, -0.003120f, -0.002629f, -0.005639f, + +0.002349f, +0.003024f, -0.000677f, +0.003118f, +0.005975f, -0.012817f, -0.001546f, -0.009555f, -0.009990f, +0.002082f, + -0.008412f, +0.005493f, -0.011315f, +0.000420f, +0.006079f, -0.000975f, +0.003877f, -0.007169f, -0.006442f, -0.002280f, + -0.002739f, -0.002927f, +0.003701f, +0.005909f, -0.000431f, +0.001524f, -0.000771f, +0.003069f, -0.001168f, -0.008299f, + +0.004067f, +0.003467f, -0.002943f, +0.002075f, +0.002585f, +0.002099f, -0.004287f, +0.000419f, +0.002629f, -0.000752f, + -0.000937f, -0.001797f, -0.001382f, +0.000410f, -0.002795f, +0.003146f, -0.001160f, +0.001903f, -0.002659f, -0.000032f, + +0.002429f, -0.001917f, -0.003819f, -0.001370f, -0.001011f, -0.001099f, +0.001420f, -0.000999f, +0.000176f, -0.002022f, + -0.001662f, +0.001825f, -0.002076f, +0.001204f, +0.000314f, +0.000277f + }, + { + +0.001357f, +0.019751f, -0.008678f, -0.006037f, -0.007275f, +0.000502f, -0.000674f, -0.000505f, -0.009021f, +0.001153f, + +0.006191f, -0.000085f, +0.008624f, +0.017723f, -0.015166f, +0.003862f, -0.000104f, -0.001586f, -0.000186f, +0.008272f, + -0.032895f, -0.009778f, -0.017653f, +0.017875f, -0.012363f, +0.010514f, +0.011159f, -0.004386f, +0.006113f, -0.006684f, + -0.003970f, +0.007467f, +0.003323f, +0.002773f, +0.012677f, +0.000765f, +0.000126f, -0.002814f, -0.000987f, -0.004755f, + -0.005616f, +0.009994f, +0.003409f, +0.004379f, -0.007252f, +0.000860f, -0.003674f, +0.001684f, +0.010068f, +0.000803f, + -0.001589f, -0.002698f, -0.002620f, -0.006736f, -0.007563f, -0.007011f, +0.002917f, +0.003350f, +0.004602f, +0.001694f, + -0.001637f, -0.000342f, -0.005332f, -0.000708f, -0.001822f, +0.004473f, +0.003305f, +0.002270f, +0.000647f, +0.001003f, + +0.000790f, +0.000481f, +0.001064f, +0.001763f, -0.000714f, +0.000110f, -0.002913f, -0.004388f, +0.006377f, -0.001372f, + +0.000734f, -0.001161f, -0.001685f, -0.000239f, -0.000503f, +0.000557f, +0.000760f, -0.000094f, -0.000687f, -0.000225f, + -0.001687f, -0.002197f, -0.000321f, +0.001173f, -0.004052f, -0.000158f + }, + { + +0.026158f, -0.092108f, +0.001800f, -0.045494f, -0.000451f, -0.002985f, +0.021052f, -0.009115f, -0.002829f, +0.002582f, + +0.006947f, +0.020007f, -0.002547f, +0.013321f, -0.004339f, +0.001384f, -0.003551f, -0.000983f, -0.002991f, -0.019638f, + +0.015008f, -0.003006f, +0.004910f, +0.003194f, +0.005237f, +0.000430f, -0.006146f, -0.004244f, -0.003649f, -0.002280f, + +0.012619f, +0.002579f, -0.009052f, -0.011703f, +0.001702f, -0.003023f, +0.004578f, +0.003005f, -0.003453f, -0.003238f, + -0.000380f, -0.000130f, +0.010141f, +0.003903f, +0.001526f, +0.003463f, +0.000461f, +0.015101f, +0.005299f, +0.002964f, + -0.000085f, +0.000153f, +0.000986f, +0.002895f, +0.003736f, -0.002618f, +0.007389f, -0.000917f, -0.002825f, +0.002192f, + -0.003260f, +0.002699f, -0.000411f, +0.001994f, -0.002617f, +0.004900f, +0.005336f, -0.001125f, +0.006867f, +0.001687f, + -0.003132f, -0.000985f, -0.002385f, +0.003386f, +0.003644f, -0.003661f, -0.005015f, +0.001573f, -0.000270f, -0.002882f, + -0.000087f, +0.000961f, -0.001794f, -0.003755f, +0.001267f, +0.001490f, +0.000793f, -0.000302f, -0.001902f, +0.001730f, + -0.000728f, -0.002672f, +0.001111f, -0.000098f, +0.000453f, +0.000695f + }, + { + +0.004843f, -0.045986f, -0.005381f, -0.021930f, +0.001662f, -0.002610f, +0.005529f, -0.005188f, +0.007168f, +0.001152f, + +0.003731f, -0.011333f, +0.017010f, +0.019760f, -0.020185f, -0.004903f, -0.003039f, -0.007672f, +0.002162f, -0.000651f, + -0.003199f, -0.001071f, +0.003699f, +0.007924f, +0.006219f, -0.008598f, +0.003164f, -0.004205f, +0.004465f, +0.001530f, + -0.009239f, -0.009595f, -0.002691f, +0.001117f, +0.005916f, +0.010163f, +0.000302f, +0.007836f, -0.008524f, +0.010066f, + +0.003476f, -0.015237f, +0.002270f, -0.000552f, -0.007486f, +0.004994f, -0.009967f, -0.006380f, +0.001883f, +0.003981f, + -0.010174f, +0.002733f, +0.002561f, -0.002671f, -0.001447f, +0.002119f, -0.004703f, +0.000432f, -0.007382f, +0.003271f, + +0.002149f, -0.000331f, -0.000548f, -0.002972f, -0.001970f, +0.001353f, -0.002950f, +0.000523f, +0.001025f, -0.002638f, + -0.003871f, +0.000840f, +0.000799f, +0.000483f, +0.002032f, +0.000073f, +0.002604f, +0.001215f, +0.000044f, +0.000010f, + -0.000796f, -0.000601f, +0.000620f, -0.001632f, -0.000996f, -0.001075f, -0.000530f, +0.000941f, +0.000717f, +0.000797f, + +0.000599f, -0.001702f, -0.000386f, +0.001084f, +0.002758f, -0.000267f + }, + { + +0.006264f, +0.119827f, -0.025970f, -0.001179f, +0.009141f, +0.025206f, -0.006142f, +0.014143f, -0.001689f, -0.000378f, + -0.021341f, -0.005505f, +0.009514f, -0.012682f, -0.011936f, +0.011577f, +0.016913f, -0.020448f, -0.021960f, -0.010235f, + -0.038053f, +0.005087f, -0.011022f, +0.009343f, -0.004404f, +0.001754f, +0.008669f, +0.001189f, +0.010455f, -0.017926f, + +0.007902f, -0.000763f, -0.001428f, +0.012102f, +0.006577f, +0.000295f, -0.008573f, -0.008741f, -0.007919f, +0.001308f, + -0.014446f, +0.003659f, +0.000255f, -0.000192f, -0.003554f, +0.001682f, +0.001949f, +0.007314f, +0.000253f, +0.001789f, + +0.009181f, -0.004265f, +0.014265f, +0.003225f, +0.005705f, -0.003546f, +0.000484f, -0.002856f, -0.006525f, -0.009502f, + -0.001174f, +0.000634f, +0.007808f, -0.002166f, -0.006821f, +0.002055f, -0.002355f, -0.001844f, -0.002042f, +0.003148f, + +0.003051f, -0.001263f, +0.000070f, -0.004663f, -0.004497f, +0.000371f, +0.002822f, +0.003837f, +0.000193f, -0.000565f, + +0.000298f, +0.003552f, -0.005018f, +0.000986f, -0.001372f, -0.001658f, +0.003780f, +0.003235f, -0.000093f, +0.001983f, + +0.001437f, +0.001147f, -0.002576f, -0.001869f, +0.000377f, -0.000643f + }, + { + -0.003285f, -0.078139f, -0.008163f, +0.014308f, -0.000059f, +0.014515f, -0.003166f, -0.008725f, +0.014542f, -0.008189f, + +0.006052f, +0.005456f, +0.008642f, +0.002345f, -0.002231f, +0.010894f, +0.007201f, -0.005367f, -0.002125f, +0.010969f, + -0.012615f, -0.007280f, -0.031110f, -0.000125f, -0.003669f, -0.000356f, -0.000810f, +0.003881f, -0.012027f, -0.008333f, + +0.004912f, +0.007883f, +0.003361f, +0.000558f, -0.008605f, -0.009862f, -0.012226f, -0.019266f, -0.001849f, -0.000162f, + +0.002375f, -0.006574f, -0.002021f, -0.003165f, +0.004367f, -0.003556f, +0.005450f, -0.011998f, -0.004997f, +0.005572f, + +0.005797f, -0.000212f, -0.003337f, +0.005704f, +0.008159f, +0.006567f, +0.001169f, -0.010433f, +0.006965f, +0.003676f, + +0.005474f, -0.000348f, -0.007800f, -0.003801f, +0.005471f, -0.007700f, -0.002729f, -0.002231f, +0.000111f, +0.003165f, + +0.000511f, +0.003181f, -0.001589f, -0.002381f, -0.001946f, -0.001711f, +0.001375f, +0.006740f, -0.003347f, -0.002123f, + -0.001926f, -0.000996f, +0.002159f, +0.001704f, +0.003820f, +0.001910f, +0.000820f, +0.001822f, +0.002946f, +0.001158f, + +0.002270f, -0.000805f, +0.001542f, -0.000892f, -0.002604f, +0.001188f + }, + { + -0.015527f, -0.114286f, -0.003011f, +0.041750f, -0.019502f, -0.038449f, +0.002371f, -0.014130f, -0.007537f, -0.010514f, + -0.044035f, -0.010919f, +0.009501f, +0.007022f, -0.014677f, -0.027738f, -0.020832f, -0.007854f, +0.000291f, +0.019537f, + -0.006673f, +0.012974f, -0.026100f, -0.003996f, -0.009620f, -0.002156f, -0.004719f, +0.005943f, +0.001667f, +0.005381f, + +0.001758f, -0.001441f, +0.003676f, -0.017452f, -0.003455f, +0.015573f, -0.002752f, -0.013463f, -0.020345f, +0.009553f, + +0.011123f, -0.000680f, +0.012846f, -0.007285f, +0.008113f, -0.002434f, +0.000151f, -0.002772f, -0.001961f, -0.011123f, + -0.001000f, +0.003035f, -0.011093f, -0.005573f, -0.000262f, +0.003187f, +0.000304f, +0.000608f, +0.004357f, -0.004588f, + -0.008408f, -0.001511f, -0.006217f, -0.000494f, +0.003491f, -0.002747f, +0.002295f, +0.002498f, +0.006166f, +0.001608f, + +0.003742f, +0.000504f, +0.003246f, +0.002384f, -0.002707f, +0.001849f, -0.000677f, -0.000204f, +0.002470f, -0.000670f, + +0.001518f, +0.000880f, +0.003294f, +0.003356f, -0.004028f, +0.002692f, -0.003632f, +0.000187f, +0.000696f, +0.002137f, + +0.000951f, -0.001865f, +0.000848f, -0.002316f, -0.002012f, +0.001924f + }, + { + -0.000955f, -0.041505f, -0.008789f, +0.010814f, -0.002572f, -0.000398f, +0.001269f, -0.003716f, -0.002451f, -0.013357f, + +0.011517f, +0.005661f, +0.016162f, +0.010783f, +0.021199f, +0.021898f, +0.001967f, -0.000940f, +0.001428f, +0.015799f, + -0.000111f, -0.004527f, -0.039965f, +0.006508f, -0.005465f, -0.030326f, +0.009175f, -0.017860f, +0.019154f, +0.006418f, + +0.011650f, +0.009455f, -0.009493f, +0.001946f, +0.013039f, -0.014689f, -0.004746f, +0.017123f, -0.002226f, +0.006649f, + -0.000108f, -0.021241f, -0.013063f, -0.003322f, +0.000315f, -0.008829f, -0.004837f, +0.000409f, +0.007020f, -0.007246f, + -0.002541f, +0.000958f, +0.005178f, +0.007285f, -0.002723f, -0.004154f, +0.007286f, -0.003988f, +0.005011f, +0.000834f, + +0.010527f, -0.000898f, +0.001721f, +0.004132f, +0.002986f, -0.006662f, -0.003636f, +0.001491f, +0.005780f, -0.005251f, + -0.000005f, +0.003839f, +0.002762f, +0.002507f, +0.003902f, +0.002348f, +0.000423f, -0.003417f, -0.003122f, +0.000515f, + -0.000247f, +0.003284f, -0.003583f, -0.002797f, +0.001221f, +0.003976f, -0.000544f, +0.001652f, +0.002184f, +0.000701f, + +0.004329f, +0.000413f, -0.000579f, -0.000121f, -0.003067f, +0.000806f + }, + { + -0.002940f, -0.097772f, -0.013006f, -0.010034f, +0.025537f, -0.031270f, -0.005875f, +0.002199f, -0.020607f, -0.015489f, + +0.024215f, -0.021981f, -0.000964f, -0.006185f, +0.054225f, +0.019303f, -0.015404f, +0.018475f, -0.001041f, -0.004204f, + -0.008442f, +0.007754f, +0.014364f, +0.017516f, +0.003578f, +0.006859f, +0.025616f, +0.001564f, -0.003556f, +0.006682f, + -0.006413f, -0.022521f, +0.008767f, +0.020890f, -0.001018f, -0.016103f, -0.015812f, -0.006842f, +0.004554f, -0.003447f, + +0.000347f, -0.011414f, -0.014901f, -0.005580f, -0.002308f, -0.011203f, +0.004638f, -0.000228f, +0.014522f, +0.012295f, + +0.005998f, -0.000762f, +0.001349f, -0.008129f, +0.004392f, +0.007518f, -0.008314f, +0.003386f, +0.003580f, +0.004109f, + -0.003604f, -0.004425f, -0.003256f, +0.003378f, -0.007893f, +0.000241f, -0.005297f, -0.001756f, -0.003592f, +0.002415f, + +0.002895f, +0.001788f, +0.004488f, -0.001930f, +0.002463f, -0.005885f, -0.002745f, -0.000987f, +0.000128f, -0.006153f, + -0.001939f, -0.000210f, +0.002024f, +0.000694f, -0.001751f, -0.000035f, -0.000871f, +0.001259f, -0.000506f, +0.000381f, + +0.000140f, +0.001100f, +0.001870f, -0.000465f, -0.002627f, +0.002355f + }, + { + -0.005490f, -0.038288f, -0.000235f, -0.006691f, -0.017232f, -0.006607f, -0.004539f, -0.003583f, +0.001209f, +0.002059f, + +0.008155f, -0.019866f, +0.002820f, +0.019096f, -0.044431f, +0.001751f, +0.002307f, -0.005162f, +0.032439f, +0.012992f, + -0.008467f, -0.001793f, -0.011042f, +0.001427f, -0.007355f, -0.006227f, +0.001472f, -0.017582f, +0.000553f, +0.015686f, + -0.015078f, -0.000331f, +0.001305f, -0.007203f, -0.004759f, -0.006653f, +0.005687f, -0.005124f, -0.003591f, +0.009906f, + -0.005964f, -0.000195f, -0.008583f, +0.004706f, +0.002750f, -0.006575f, -0.005475f, -0.005717f, +0.007127f, +0.001771f, + -0.002782f, -0.000130f, +0.005917f, -0.008392f, +0.002706f, +0.003088f, +0.001945f, +0.006758f, +0.001687f, -0.000023f, + -0.003016f, +0.000281f, +0.004988f, -0.002874f, +0.003887f, -0.004559f, +0.002599f, +0.001127f, +0.003583f, -0.000987f, + +0.001904f, -0.004766f, +0.001565f, +0.009149f, +0.000081f, -0.002257f, +0.002994f, -0.001199f, -0.001091f, -0.002147f, + +0.007295f, +0.000370f, -0.002970f, -0.004209f, -0.000277f, -0.001340f, -0.003451f, +0.001569f, -0.002101f, -0.003729f, + -0.002207f, +0.001293f, +0.001228f, +0.000848f, +0.003805f, +0.001312f + } + }, + { + { + +0.022172f, -0.051363f, -0.075589f, +0.019555f, +0.031447f, +0.006688f, +0.013155f, +0.011471f, +0.006225f, +0.023805f, + -0.008586f, -0.023915f, -0.007057f, -0.004257f, -0.014725f, +0.010792f, -0.005435f, -0.002898f, -0.000855f, -0.002691f, + +0.014105f, -0.009075f, -0.003893f, -0.003416f, -0.003449f, +0.000577f, +0.001502f, +0.005085f, -0.004131f, +0.001911f, + +0.008046f, +0.005896f, -0.005111f, -0.006435f, -0.006897f, +0.006773f, +0.012063f, +0.006753f, +0.006073f, +0.006871f, + -0.000703f, -0.007735f, -0.002871f, -0.010888f, -0.004168f, +0.006335f, +0.006883f, +0.004109f, -0.004914f, +0.009119f, + -0.001455f, -0.007957f, +0.003335f, -0.002569f, +0.000359f, +0.004606f, +0.001374f, +0.000953f, +0.002363f, -0.001554f, + -0.002932f, +0.006581f, +0.005502f, -0.001017f, -0.002354f, -0.000458f, +0.004264f, -0.001924f, -0.000720f, -0.001563f, + +0.003026f, -0.000458f, +0.000977f, +0.000551f, +0.000427f, -0.000369f, -0.002585f, +0.002167f, +0.001388f, -0.002007f, + -0.000906f, -0.004610f, +0.002382f, +0.001360f, -0.000124f, -0.001176f, +0.002429f, -0.004602f, -0.000863f, -0.002601f, + -0.001813f, -0.001867f, -0.001847f, +0.000383f, -0.000049f, -0.001145f + }, + { + -0.000893f, +0.086663f, +0.008459f, -0.000180f, +0.009974f, +0.001374f, -0.007765f, +0.006976f, +0.003763f, +0.002530f, + -0.019067f, -0.028426f, +0.008824f, +0.007146f, +0.014857f, +0.004113f, -0.016210f, -0.003078f, -0.009755f, +0.004440f, + +0.008344f, +0.012519f, +0.017696f, +0.003171f, +0.000036f, -0.018984f, -0.009126f, -0.007390f, +0.004290f, +0.009140f, + +0.013422f, -0.000629f, -0.018260f, +0.002645f, -0.011655f, +0.008492f, -0.014393f, +0.027621f, -0.003465f, +0.010330f, + +0.000228f, -0.005411f, -0.005028f, +0.004735f, +0.001863f, -0.003226f, +0.006238f, -0.001646f, +0.000160f, +0.005219f, + -0.004928f, -0.004280f, -0.000983f, +0.000195f, -0.003974f, -0.003814f, +0.000446f, -0.000370f, -0.000773f, +0.000734f, + +0.003326f, +0.002812f, -0.001553f, -0.006160f, +0.003751f, +0.001811f, +0.000647f, -0.001949f, -0.001843f, -0.003712f, + +0.002092f, -0.000290f, -0.001234f, +0.000059f, +0.000806f, -0.000250f, +0.001932f, +0.000295f, -0.002949f, +0.003595f, + -0.000950f, -0.000792f, +0.000564f, +0.001389f, -0.002127f, -0.001705f, +0.001287f, -0.001633f, -0.000373f, -0.001362f, + +0.002258f, -0.001573f, -0.000722f, +0.002020f, +0.000717f, -0.001149f + }, + { + -0.003140f, -0.107261f, +0.047886f, +0.093387f, +0.006862f, +0.002617f, +0.001931f, -0.004214f, -0.000123f, +0.002766f, + -0.015243f, -0.019581f, +0.004733f, +0.004819f, +0.008582f, +0.006379f, +0.001119f, -0.007449f, -0.015229f, -0.004231f, + -0.007838f, -0.004274f, +0.000986f, +0.013099f, -0.006280f, +0.000799f, +0.015618f, +0.007028f, -0.006226f, +0.004918f, + +0.001194f, -0.010480f, +0.003655f, -0.015741f, -0.001855f, -0.008851f, -0.018461f, -0.003706f, +0.003170f, -0.005957f, + +0.000154f, -0.001075f, +0.006389f, -0.006157f, +0.008054f, +0.002818f, -0.002461f, +0.000062f, +0.009890f, +0.007353f, + -0.005524f, -0.010701f, +0.005946f, -0.007241f, -0.002500f, -0.003356f, +0.005468f, +0.001792f, -0.002191f, -0.003098f, + -0.005619f, +0.001568f, -0.002826f, +0.004245f, -0.004119f, +0.001573f, +0.000167f, +0.003443f, -0.000463f, +0.002953f, + -0.002811f, +0.002183f, +0.001637f, +0.000438f, -0.001867f, +0.000156f, -0.001377f, -0.000074f, +0.001749f, -0.001788f, + +0.000679f, +0.000402f, +0.000589f, +0.003156f, +0.003990f, +0.000997f, -0.000447f, +0.000885f, -0.000414f, +0.000067f, + +0.002036f, +0.000628f, +0.001777f, +0.000740f, -0.000180f, -0.003534f + }, + { + -0.006121f, -0.074290f, -0.005329f, +0.019708f, -0.011917f, -0.002420f, +0.005253f, -0.007126f, -0.000680f, +0.001442f, + -0.003852f, +0.003122f, +0.005230f, -0.014591f, -0.022274f, +0.009800f, +0.000176f, +0.014902f, -0.040223f, -0.002323f, + -0.006306f, +0.001545f, +0.010516f, +0.011656f, -0.003880f, -0.003006f, -0.019750f, +0.019262f, -0.006558f, -0.001178f, + -0.000577f, -0.001454f, -0.007897f, +0.004358f, +0.005319f, -0.002277f, +0.001251f, -0.001614f, -0.012718f, -0.002006f, + -0.002064f, +0.003923f, -0.008039f, -0.004378f, +0.005614f, +0.009014f, -0.006156f, +0.010675f, -0.004518f, -0.001095f, + +0.000724f, -0.000280f, -0.003138f, +0.003750f, -0.003361f, -0.004188f, +0.001028f, +0.002331f, -0.000057f, +0.004755f, + -0.001874f, +0.005722f, -0.004202f, +0.002302f, -0.006586f, +0.002074f, -0.002227f, -0.001467f, -0.000524f, +0.003007f, + -0.002946f, +0.001822f, -0.003449f, +0.004981f, +0.001126f, +0.003080f, +0.000343f, +0.001043f, -0.000480f, -0.000591f, + +0.003406f, -0.000214f, -0.000129f, -0.000932f, -0.001866f, +0.002557f, +0.004639f, +0.001898f, +0.000717f, -0.000233f, + -0.001128f, -0.001262f, -0.000645f, -0.000036f, -0.001167f, -0.002668f + }, + { + -0.002474f, -0.005290f, +0.011889f, +0.006749f, -0.000660f, +0.001881f, +0.001322f, -0.011603f, +0.000571f, +0.003814f, + +0.008636f, -0.007969f, +0.002542f, +0.008863f, -0.004306f, -0.010726f, +0.008799f, -0.008022f, -0.004117f, -0.017722f, + -0.001800f, +0.004233f, +0.003226f, +0.006984f, +0.005257f, +0.029636f, -0.008495f, -0.008554f, -0.009130f, -0.010697f, + +0.001958f, +0.008154f, -0.002407f, -0.000471f, -0.004798f, -0.000218f, +0.006911f, +0.005303f, -0.000885f, +0.002259f, + +0.000148f, +0.007609f, +0.001651f, +0.001405f, -0.002361f, +0.008723f, +0.008529f, +0.002613f, -0.004746f, +0.000875f, + +0.001262f, +0.008195f, -0.003610f, +0.002416f, +0.004463f, +0.004859f, +0.002541f, +0.003301f, +0.003793f, -0.000740f, + -0.001218f, -0.000134f, +0.001153f, -0.003603f, +0.002680f, -0.005992f, -0.001069f, +0.001898f, -0.003682f, -0.000406f, + +0.000826f, +0.003690f, +0.001063f, +0.001851f, -0.001762f, -0.002127f, +0.001157f, +0.001903f, +0.004725f, +0.000240f, + -0.002666f, +0.002210f, -0.001308f, -0.001877f, -0.000435f, -0.000868f, +0.003177f, -0.001455f, +0.001401f, +0.000098f, + +0.000262f, -0.000065f, +0.001368f, -0.000441f, -0.001229f, +0.001038f + }, + { + +0.003054f, -0.101774f, +0.017906f, -0.023206f, -0.014280f, -0.000270f, -0.002600f, +0.010675f, -0.014238f, -0.001816f, + +0.009196f, +0.011668f, +0.001572f, +0.003149f, -0.021671f, +0.005924f, +0.012761f, -0.011855f, -0.016356f, -0.001193f, + -0.011312f, +0.006876f, -0.002406f, +0.002336f, -0.011752f, -0.015246f, +0.009466f, +0.001741f, -0.005477f, -0.008163f, + +0.003704f, +0.001569f, +0.000855f, +0.005474f, +0.004755f, -0.013229f, +0.007797f, +0.002282f, -0.006530f, +0.005750f, + -0.001190f, +0.009513f, -0.004709f, +0.001756f, +0.004812f, +0.005572f, +0.009437f, +0.003448f, -0.000262f, -0.000073f, + -0.001459f, -0.007171f, -0.003227f, -0.002042f, -0.000768f, +0.004593f, -0.000689f, +0.003686f, +0.002224f, -0.003021f, + +0.004101f, +0.000940f, +0.001606f, +0.003415f, -0.002842f, +0.002279f, -0.004310f, +0.002893f, +0.003646f, -0.001417f, + +0.000269f, -0.003226f, -0.004458f, +0.001053f, -0.002896f, +0.000316f, -0.002990f, +0.001810f, -0.001928f, -0.002491f, + -0.001886f, -0.001583f, -0.003105f, -0.000480f, -0.000943f, -0.001642f, +0.000008f, -0.001546f, +0.001497f, +0.000313f, + -0.000560f, +0.001978f, -0.000708f, +0.000884f, +0.000592f, +0.001487f + }, + { + -0.000264f, +0.018519f, +0.009061f, -0.008264f, -0.000563f, +0.001580f, -0.004611f, -0.001386f, -0.002488f, +0.001096f, + +0.000766f, -0.005056f, +0.013448f, +0.000932f, -0.041654f, -0.004380f, -0.016176f, -0.007773f, -0.010237f, +0.010526f, + -0.013916f, +0.001236f, -0.013075f, +0.015890f, -0.008765f, +0.017684f, +0.011972f, -0.010229f, -0.006541f, -0.018760f, + -0.005547f, +0.013891f, +0.004291f, +0.002015f, +0.011658f, +0.004487f, -0.004099f, -0.003721f, +0.007023f, +0.002855f, + -0.008443f, -0.003095f, -0.000779f, -0.000115f, -0.007724f, +0.006671f, -0.006629f, -0.004986f, +0.003419f, -0.002439f, + +0.004204f, +0.000016f, -0.004000f, -0.000787f, -0.006119f, -0.006905f, +0.001496f, -0.000482f, +0.000971f, -0.002307f, + -0.004019f, -0.000236f, -0.001236f, +0.003452f, -0.001881f, +0.003737f, +0.000078f, +0.002661f, +0.003383f, -0.001042f, + +0.000494f, +0.004550f, +0.001094f, +0.003219f, -0.002498f, -0.001163f, -0.002266f, -0.005402f, +0.002527f, -0.001301f, + +0.002393f, -0.000252f, -0.003394f, +0.001501f, -0.000200f, -0.002611f, +0.000524f, -0.000933f, +0.001158f, +0.000131f, + +0.000589f, +0.000474f, +0.001046f, +0.002322f, -0.003286f, +0.000385f + }, + { + -0.013676f, -0.130635f, +0.021661f, -0.051033f, -0.015770f, -0.005017f, +0.009869f, +0.001576f, +0.006882f, +0.007140f, + -0.022682f, -0.003448f, -0.014040f, -0.002467f, -0.024592f, -0.018265f, +0.004293f, +0.007498f, +0.009214f, +0.002040f, + +0.027544f, +0.001426f, -0.002508f, -0.004619f, +0.009186f, -0.000613f, -0.002055f, +0.012591f, -0.000948f, -0.011971f, + +0.002483f, +0.001059f, +0.008680f, +0.015725f, +0.016886f, -0.002590f, -0.003941f, +0.000656f, +0.002910f, +0.003939f, + +0.006553f, +0.001357f, +0.011629f, +0.000676f, -0.002199f, +0.003433f, -0.007187f, +0.005518f, -0.004393f, -0.001611f, + +0.000528f, +0.002063f, +0.002263f, -0.003415f, +0.001460f, -0.000877f, +0.009175f, +0.000694f, +0.000125f, +0.006162f, + +0.001654f, +0.004106f, -0.004442f, +0.001679f, -0.003942f, -0.001682f, +0.004485f, +0.001494f, +0.002451f, -0.000618f, + +0.000461f, +0.005268f, -0.000769f, -0.000771f, +0.004326f, -0.000233f, -0.003669f, -0.000740f, +0.001458f, -0.000005f, + +0.001902f, +0.000384f, -0.000691f, -0.001871f, +0.000731f, -0.001859f, -0.002141f, +0.000602f, -0.002241f, +0.001535f, + -0.000783f, -0.002209f, +0.000586f, -0.000581f, -0.000950f, -0.000066f + }, + { + +0.001013f, -0.047931f, +0.040315f, -0.010441f, +0.003080f, -0.005611f, +0.007482f, -0.000713f, +0.002151f, -0.006117f, + +0.005465f, -0.006003f, +0.020881f, +0.015731f, -0.013505f, +0.040361f, +0.040620f, -0.011371f, -0.013959f, +0.006197f, + +0.004337f, -0.000687f, +0.002648f, -0.000743f, -0.010637f, -0.010396f, +0.005600f, +0.002581f, +0.008775f, +0.006336f, + +0.001523f, -0.019677f, -0.009673f, +0.011622f, +0.012044f, -0.000004f, -0.001820f, +0.012393f, -0.004167f, +0.007112f, + -0.009047f, -0.020734f, +0.002014f, +0.002022f, -0.000855f, +0.004451f, -0.007649f, +0.001410f, +0.001609f, +0.007569f, + -0.003787f, +0.006085f, +0.001780f, -0.002446f, -0.003771f, +0.003206f, -0.007329f, -0.002929f, -0.005779f, +0.005320f, + +0.002933f, -0.000137f, +0.002780f, +0.003114f, +0.000633f, +0.002071f, -0.002839f, +0.003524f, +0.006014f, +0.001821f, + -0.004374f, +0.000531f, +0.000648f, -0.000951f, -0.000044f, -0.002104f, +0.001456f, +0.000793f, -0.001571f, +0.002248f, + +0.002034f, +0.001085f, +0.002318f, -0.003242f, -0.001470f, +0.001485f, +0.003236f, +0.003272f, +0.001060f, -0.001790f, + +0.000421f, -0.000342f, +0.000837f, -0.000682f, +0.000340f, -0.000447f + }, + { + -0.006236f, +0.121930f, +0.001656f, -0.006697f, +0.023958f, +0.052469f, +0.005614f, +0.000593f, -0.003591f, +0.009037f, + +0.007606f, -0.008569f, -0.019825f, -0.022089f, -0.008058f, +0.002702f, -0.001117f, -0.015101f, +0.005605f, +0.019174f, + -0.022875f, -0.000778f, -0.011804f, +0.002064f, -0.010620f, -0.010700f, -0.000514f, -0.001226f, +0.012406f, -0.018048f, + -0.003215f, +0.001559f, -0.002409f, +0.008989f, +0.004415f, +0.008776f, +0.003490f, +0.002460f, +0.008783f, +0.008908f, + -0.011592f, +0.010713f, -0.001151f, -0.004797f, +0.001156f, +0.009188f, +0.000564f, -0.009541f, -0.013607f, -0.004657f, + +0.011589f, -0.011420f, -0.001719f, -0.002144f, -0.001686f, -0.007658f, +0.003594f, -0.003930f, -0.006848f, -0.005983f, + -0.001807f, -0.003800f, +0.009831f, +0.008857f, -0.001401f, +0.004839f, +0.000494f, +0.000005f, +0.001713f, +0.003047f, + +0.001175f, -0.000132f, -0.002696f, -0.005843f, -0.003186f, +0.003103f, +0.001436f, -0.001267f, +0.000022f, +0.001801f, + +0.001792f, +0.004232f, -0.003375f, +0.001357f, -0.002304f, -0.001202f, +0.004875f, +0.001686f, -0.003576f, -0.000277f, + -0.000211f, -0.002137f, -0.003603f, -0.000601f, -0.002183f, -0.000492f + }, + { + +0.000140f, -0.061661f, -0.006624f, +0.009810f, +0.000572f, +0.005223f, -0.012029f, -0.019444f, +0.005945f, -0.001278f, + +0.006198f, -0.006947f, +0.001435f, -0.015444f, -0.006021f, +0.010741f, +0.010793f, +0.013254f, +0.006557f, +0.020052f, + +0.001276f, -0.018009f, -0.024566f, +0.011422f, +0.002813f, +0.007158f, -0.009423f, -0.001429f, -0.012191f, +0.002502f, + +0.002074f, -0.002809f, +0.009093f, +0.001983f, -0.015347f, -0.004890f, -0.009526f, -0.019682f, -0.000768f, +0.001374f, + +0.011774f, +0.002479f, +0.000634f, +0.000330f, +0.001347f, -0.015954f, +0.000430f, -0.009323f, -0.008126f, +0.007393f, + +0.011848f, +0.001437f, -0.001572f, +0.006046f, +0.004468f, +0.005575f, +0.004071f, -0.002716f, +0.005286f, -0.001030f, + +0.007128f, +0.001676f, -0.003909f, -0.006573f, +0.001362f, -0.004533f, -0.000491f, +0.002527f, +0.000212f, -0.000075f, + +0.000739f, +0.000486f, -0.002348f, +0.000861f, -0.001344f, +0.000179f, +0.002564f, +0.003125f, -0.001980f, +0.001811f, + -0.004408f, +0.001993f, +0.003156f, -0.003506f, -0.000023f, +0.003235f, +0.000548f, +0.001361f, +0.003220f, +0.000807f, + +0.001695f, -0.002212f, +0.000236f, +0.000725f, -0.001554f, -0.000646f + }, + { + +0.025336f, -0.043254f, -0.029287f, +0.011233f, -0.003420f, -0.022399f, +0.031412f, +0.003806f, +0.003866f, +0.012796f, + -0.008074f, -0.007192f, +0.001732f, +0.017385f, +0.021021f, -0.001101f, -0.018071f, -0.014765f, -0.003714f, +0.021490f, + -0.011701f, +0.010316f, -0.027023f, -0.008044f, -0.010288f, +0.007782f, +0.011004f, +0.011807f, -0.004018f, +0.000211f, + +0.004714f, -0.011456f, -0.003372f, -0.007706f, +0.000463f, +0.014237f, +0.000987f, -0.003228f, -0.013578f, +0.006860f, + -0.002444f, -0.012710f, +0.016904f, -0.002404f, +0.002942f, -0.000226f, +0.011703f, +0.000090f, +0.008071f, -0.009785f, + -0.003154f, +0.008527f, -0.001177f, -0.005316f, -0.003080f, +0.000642f, -0.000019f, -0.003031f, +0.008230f, +0.003316f, + -0.002123f, +0.002929f, -0.001528f, +0.006100f, +0.006850f, -0.001187f, -0.003133f, -0.003667f, -0.000581f, -0.002530f, + +0.005770f, -0.000344f, -0.000409f, +0.000300f, -0.001150f, +0.001023f, -0.002972f, +0.001862f, +0.003979f, -0.001185f, + -0.000642f, -0.002451f, -0.000626f, +0.000575f, -0.002479f, +0.003526f, -0.002689f, +0.001950f, +0.000105f, -0.000441f, + +0.000613f, -0.001615f, +0.001030f, -0.001087f, -0.001594f, +0.001402f + }, + { + -0.001821f, -0.013745f, +0.001349f, +0.013710f, -0.009635f, -0.007575f, +0.006773f, +0.001774f, +0.001161f, -0.012475f, + +0.015682f, -0.000979f, -0.026819f, -0.043899f, -0.000457f, +0.002198f, -0.000207f, -0.009320f, -0.008868f, +0.007426f, + +0.000124f, +0.008340f, -0.021941f, +0.012475f, -0.003788f, -0.035661f, +0.020152f, -0.018307f, +0.013739f, +0.003500f, + -0.007556f, +0.005255f, -0.003029f, -0.001832f, +0.004992f, -0.010845f, -0.004793f, +0.010975f, -0.012761f, +0.003126f, + +0.006492f, -0.001322f, -0.000908f, -0.006583f, -0.006767f, -0.010944f, -0.002354f, -0.004049f, +0.007614f, +0.007252f, + +0.009557f, +0.000876f, -0.001154f, +0.000480f, -0.001618f, -0.007941f, -0.005278f, -0.009910f, +0.007343f, +0.002137f, + +0.008183f, -0.006326f, -0.003871f, -0.000770f, +0.002327f, -0.008927f, -0.001057f, -0.003173f, -0.005697f, -0.009564f, + +0.003166f, +0.002155f, -0.001385f, +0.001700f, +0.002306f, +0.002754f, +0.001488f, -0.002660f, -0.003674f, -0.000982f, + +0.000242f, +0.001027f, -0.001378f, -0.000288f, -0.003765f, +0.002258f, +0.000051f, +0.001546f, +0.003305f, +0.002102f, + +0.002866f, -0.000921f, -0.000477f, +0.000415f, -0.003090f, +0.001741f + }, + { + +0.012755f, -0.072756f, -0.004220f, -0.002208f, +0.013276f, -0.016350f, +0.016672f, +0.011256f, +0.001875f, -0.005023f, + +0.027675f, -0.014956f, -0.013005f, -0.032832f, +0.026579f, +0.002713f, -0.041189f, +0.004533f, +0.007385f, +0.007096f, + -0.003640f, +0.015066f, +0.009660f, +0.010571f, -0.009978f, -0.002477f, +0.027291f, +0.006234f, +0.006194f, +0.016111f, + +0.010349f, -0.012716f, +0.003556f, +0.007699f, +0.004645f, +0.003078f, +0.004384f, -0.004848f, +0.002297f, -0.009707f, + -0.005917f, +0.002718f, +0.001952f, +0.000631f, +0.000302f, -0.006602f, +0.007357f, -0.002157f, +0.001593f, +0.002247f, + +0.000687f, -0.001470f, +0.004536f, -0.002347f, +0.005212f, +0.002249f, -0.010091f, +0.001320f, -0.002425f, +0.004321f, + -0.004766f, -0.003049f, -0.003537f, -0.003342f, -0.006584f, +0.005277f, -0.005552f, -0.002454f, -0.003034f, +0.003314f, + +0.000983f, -0.000199f, +0.006091f, -0.000349f, +0.001353f, -0.000686f, +0.003238f, -0.000975f, +0.001299f, -0.002216f, + -0.000043f, -0.000478f, -0.002139f, -0.002692f, -0.002303f, +0.000645f, -0.002652f, +0.000071f, -0.000044f, +0.002999f, + +0.002426f, +0.002277f, +0.002292f, -0.000393f, -0.000440f, +0.002357f + }, + { + +0.004528f, -0.030142f, -0.004459f, +0.004574f, -0.010310f, +0.009586f, +0.014492f, -0.010486f, +0.003801f, -0.010808f, + +0.009750f, +0.000665f, +0.007362f, -0.020028f, -0.124694f, -0.012363f, -0.001706f, -0.010672f, +0.009606f, -0.003830f, + -0.009781f, +0.010508f, -0.012464f, +0.004413f, -0.008440f, -0.014346f, +0.008364f, -0.006042f, +0.012623f, +0.030053f, + +0.002262f, +0.001692f, -0.006103f, -0.004879f, -0.011894f, -0.018940f, +0.007789f, +0.001906f, -0.007584f, -0.002404f, + -0.007607f, +0.007775f, -0.005680f, +0.003541f, -0.004817f, -0.005111f, +0.002169f, -0.002865f, +0.002310f, -0.002853f, + -0.002482f, -0.000190f, +0.010966f, -0.000939f, +0.006041f, +0.001933f, -0.003246f, +0.000854f, +0.001033f, -0.000715f, + +0.000388f, +0.005493f, +0.004191f, -0.007236f, +0.001375f, -0.009150f, -0.003380f, -0.002575f, +0.004470f, -0.000681f, + +0.003708f, -0.001728f, -0.002773f, +0.007971f, +0.004449f, +0.004184f, +0.006186f, -0.001300f, +0.000459f, +0.001300f, + +0.009425f, +0.003242f, -0.003924f, -0.005732f, -0.000508f, -0.000731f, -0.002940f, +0.002126f, +0.000789f, +0.000022f, + +0.000825f, -0.000023f, -0.001158f, +0.000320f, +0.000922f, -0.000706f + } + }, + { + { + -0.026406f, -0.058357f, +0.011700f, +0.062147f, -0.034983f, +0.020862f, +0.016928f, +0.002629f, +0.013025f, +0.005029f, + +0.006749f, -0.033456f, +0.008818f, -0.001782f, -0.010425f, +0.004834f, -0.017175f, +0.011425f, -0.001778f, +0.006871f, + -0.005406f, +0.006898f, -0.002017f, +0.001819f, -0.010716f, -0.004028f, +0.011247f, +0.005096f, +0.000122f, -0.007567f, + +0.010988f, +0.001423f, +0.001514f, -0.014818f, +0.007108f, -0.006580f, +0.011086f, +0.009465f, +0.009942f, -0.001547f, + -0.002443f, -0.007131f, -0.000470f, -0.005378f, -0.001031f, +0.006535f, -0.000398f, +0.004354f, +0.000688f, +0.006164f, + -0.000501f, -0.010578f, +0.014125f, -0.007969f, -0.001517f, +0.000675f, +0.009281f, +0.000974f, +0.000539f, -0.001029f, + -0.006739f, +0.007700f, +0.003554f, +0.001413f, -0.004292f, -0.002160f, +0.007124f, -0.001794f, +0.000412f, -0.001488f, + +0.004324f, +0.002176f, -0.003414f, +0.000412f, +0.002297f, -0.004190f, +0.001431f, +0.000902f, +0.002723f, -0.004194f, + +0.001439f, -0.002934f, +0.000410f, +0.001680f, -0.002293f, +0.002722f, +0.000154f, -0.003929f, -0.002542f, -0.001332f, + -0.003556f, +0.000185f, -0.000886f, +0.000177f, -0.000679f, -0.001684f + }, + { + -0.000142f, +0.075610f, +0.013475f, -0.063244f, +0.047953f, +0.000728f, -0.003018f, -0.000656f, +0.006034f, -0.003069f, + -0.006208f, -0.029320f, -0.000478f, +0.017080f, +0.009264f, +0.007735f, -0.021856f, -0.019209f, -0.010101f, +0.015525f, + +0.012737f, +0.004477f, +0.024790f, +0.012303f, +0.002149f, -0.015156f, -0.013626f, -0.009917f, +0.002882f, +0.008966f, + -0.005485f, +0.005900f, -0.010775f, -0.000198f, -0.003213f, -0.005592f, +0.008650f, +0.010828f, +0.003870f, -0.002412f, + +0.008409f, -0.000958f, -0.007016f, -0.003221f, -0.000184f, +0.003620f, +0.000885f, +0.003539f, -0.000246f, +0.004940f, + -0.006326f, -0.005523f, +0.006865f, -0.007327f, -0.007536f, -0.000033f, -0.000133f, +0.001946f, -0.003966f, +0.003618f, + +0.004170f, -0.000223f, +0.003324f, -0.010223f, +0.002807f, +0.002178f, +0.000010f, -0.000368f, -0.005250f, -0.000178f, + -0.000227f, -0.001643f, -0.000111f, +0.003528f, -0.001585f, +0.001181f, -0.002136f, -0.000156f, -0.001111f, +0.000662f, + -0.003019f, +0.001563f, +0.000650f, +0.000795f, -0.000562f, -0.001272f, -0.000408f, +0.000583f, -0.002180f, -0.001368f, + +0.000201f, -0.000492f, +0.000344f, +0.000273f, +0.001916f, -0.001538f + }, + { + +0.008783f, -0.052881f, +0.000718f, +0.084234f, +0.006275f, +0.005944f, -0.000847f, -0.008332f, +0.005612f, -0.001359f, + -0.015938f, -0.027726f, +0.020046f, -0.013270f, +0.021549f, +0.001229f, -0.010753f, +0.001448f, -0.012162f, +0.018485f, + -0.011302f, -0.009776f, -0.008273f, +0.016054f, -0.007526f, +0.000999f, +0.015499f, +0.009895f, -0.004671f, +0.001516f, + -0.009022f, +0.011330f, -0.001362f, -0.005623f, -0.006739f, -0.006108f, -0.013066f, -0.008372f, +0.008143f, -0.003693f, + -0.001585f, -0.010015f, +0.005865f, -0.000085f, +0.006785f, +0.005000f, +0.001014f, -0.005129f, +0.009381f, +0.004286f, + -0.004913f, -0.002058f, +0.001608f, -0.008314f, +0.001906f, -0.003584f, -0.000489f, +0.004045f, -0.003829f, -0.006742f, + +0.000555f, -0.000247f, -0.004695f, +0.003312f, -0.000703f, -0.000597f, +0.003584f, +0.001536f, -0.001241f, +0.001688f, + +0.000709f, +0.002873f, +0.000851f, +0.001129f, -0.003813f, +0.000601f, +0.002890f, +0.000614f, -0.002570f, -0.000764f, + +0.000014f, -0.001923f, -0.000673f, +0.003223f, +0.004598f, +0.002048f, -0.000796f, -0.000325f, -0.001003f, +0.000930f, + +0.001461f, +0.000155f, +0.003423f, -0.000983f, -0.000119f, -0.001515f + }, + { + -0.008639f, -0.085668f, -0.005887f, +0.028624f, -0.005721f, +0.001668f, -0.005519f, -0.002081f, +0.001472f, +0.014291f, + -0.028832f, +0.006283f, +0.008680f, -0.012469f, -0.023902f, +0.016203f, -0.006346f, +0.010669f, -0.024190f, -0.005714f, + -0.006290f, -0.000285f, +0.004372f, +0.000328f, +0.012585f, -0.032897f, +0.009747f, -0.008356f, +0.011030f, -0.002316f, + -0.016373f, +0.002730f, -0.007849f, +0.008398f, +0.007512f, -0.011962f, +0.005761f, -0.008607f, -0.002831f, +0.007424f, + -0.007403f, -0.003857f, -0.006952f, -0.003126f, +0.000259f, +0.002009f, +0.008065f, -0.000940f, -0.003326f, +0.005713f, + +0.000270f, -0.004064f, +0.001135f, -0.003091f, -0.002258f, -0.007336f, +0.005981f, +0.004686f, -0.006230f, +0.010735f, + +0.001460f, +0.004191f, -0.008020f, +0.003664f, -0.000720f, -0.005071f, -0.001540f, -0.007637f, +0.007659f, -0.000499f, + -0.003652f, +0.002373f, -0.001185f, -0.000387f, +0.003650f, +0.004882f, -0.000759f, -0.003186f, +0.003183f, -0.000297f, + +0.002197f, +0.000745f, -0.000631f, -0.002664f, +0.000569f, +0.000582f, +0.007036f, +0.000765f, +0.002850f, -0.000891f, + -0.001547f, -0.001333f, -0.000248f, -0.000313f, -0.001687f, -0.004022f + }, + { + +0.004136f, +0.018802f, -0.007373f, -0.013283f, +0.014571f, -0.000952f, +0.006469f, -0.006468f, -0.006696f, +0.005295f, + +0.004270f, -0.008152f, -0.006184f, -0.008377f, +0.015573f, +0.000290f, -0.016703f, +0.016921f, -0.012970f, -0.017695f, + +0.005066f, +0.008891f, -0.011798f, +0.017378f, +0.000068f, +0.026959f, +0.000830f, -0.009885f, -0.004580f, -0.007558f, + -0.005089f, +0.018094f, -0.009440f, +0.003080f, -0.001606f, +0.002168f, +0.001005f, +0.001761f, +0.009962f, -0.001607f, + -0.007245f, +0.012102f, +0.011919f, -0.008647f, -0.002057f, +0.000935f, +0.009180f, +0.007627f, -0.002916f, -0.001594f, + -0.001313f, +0.001601f, +0.008176f, -0.000243f, +0.003221f, +0.002109f, +0.004457f, +0.005830f, -0.000875f, +0.001976f, + -0.000440f, -0.003783f, +0.008611f, -0.000262f, -0.001709f, -0.008345f, -0.001226f, -0.000296f, -0.000722f, +0.004054f, + -0.005909f, +0.002732f, +0.002402f, -0.000396f, +0.000588f, +0.000487f, -0.001478f, +0.003158f, +0.003947f, -0.001874f, + +0.001385f, -0.000646f, +0.000443f, -0.002266f, -0.000475f, +0.002223f, -0.000535f, -0.001701f, +0.002726f, -0.000286f, + +0.000873f, +0.001020f, -0.001295f, +0.000937f, -0.000056f, -0.000208f + }, + { + -0.020524f, -0.081515f, +0.010554f, -0.036298f, +0.013169f, -0.008647f, +0.011476f, +0.000581f, -0.021179f, +0.012215f, + -0.020856f, +0.034953f, -0.008383f, +0.005820f, -0.013275f, -0.004905f, +0.002943f, +0.002948f, -0.008387f, -0.011006f, + -0.008139f, +0.000868f, -0.008912f, -0.006218f, +0.010590f, -0.017921f, +0.012200f, -0.005600f, -0.003533f, -0.008807f, + +0.007453f, -0.009705f, +0.014251f, +0.003929f, -0.009004f, +0.005498f, -0.000863f, +0.006511f, +0.000800f, -0.002012f, + +0.006710f, -0.000860f, -0.000200f, +0.002944f, +0.000203f, +0.006260f, +0.005606f, +0.014522f, -0.001218f, +0.001694f, + -0.007086f, -0.002992f, -0.002285f, -0.005602f, -0.000988f, +0.006797f, +0.002373f, +0.000641f, +0.000000f, +0.004668f, + -0.004310f, -0.001192f, +0.006198f, +0.001304f, -0.004925f, +0.000532f, -0.000413f, +0.002964f, +0.002545f, +0.001059f, + -0.000248f, -0.003655f, -0.004345f, -0.002385f, +0.000847f, -0.004656f, -0.000891f, +0.002519f, -0.001488f, -0.001332f, + -0.004130f, +0.000051f, -0.001339f, +0.001647f, -0.002943f, +0.000745f, -0.002414f, +0.000913f, +0.000720f, +0.001382f, + -0.000773f, +0.000036f, +0.002154f, -0.001012f, +0.000287f, +0.001586f + }, + { + -0.001031f, +0.009203f, +0.012177f, -0.007797f, +0.003527f, -0.001042f, -0.004266f, -0.000516f, +0.000197f, -0.001666f, + -0.003241f, +0.002850f, -0.010713f, +0.007698f, -0.038440f, +0.000591f, -0.036220f, -0.003233f, -0.004923f, -0.005683f, + +0.000311f, +0.009203f, +0.003283f, -0.012584f, +0.000887f, +0.001441f, +0.007292f, -0.009950f, +0.008072f, -0.023513f, + +0.008276f, +0.010114f, -0.015313f, +0.022899f, +0.006994f, +0.007666f, -0.006202f, -0.003185f, +0.006776f, +0.004639f, + -0.003258f, -0.012548f, +0.002130f, -0.006565f, +0.003434f, +0.005760f, -0.003881f, -0.002910f, -0.010107f, +0.002189f, + +0.000491f, +0.002369f, +0.000295f, -0.000020f, -0.002652f, -0.009386f, +0.003876f, -0.004563f, -0.001231f, -0.000820f, + -0.006222f, +0.000837f, +0.000112f, +0.001524f, -0.002823f, +0.003869f, +0.003707f, -0.001475f, +0.001948f, -0.001004f, + +0.001538f, +0.005078f, -0.000391f, +0.002947f, -0.000732f, -0.002505f, +0.000018f, -0.002487f, -0.000879f, -0.002441f, + -0.000080f, +0.002154f, -0.004870f, +0.002603f, +0.000323f, -0.002274f, -0.000880f, -0.002775f, +0.002743f, +0.000933f, + +0.000295f, +0.001134f, +0.000742f, +0.001055f, -0.000751f, -0.000212f + }, + { + -0.003695f, -0.143659f, +0.015237f, -0.075894f, +0.019284f, +0.009651f, -0.029863f, +0.036305f, -0.003769f, +0.010570f, + -0.015451f, -0.025897f, -0.001443f, -0.011446f, -0.007080f, -0.012003f, -0.016379f, +0.000463f, +0.017649f, +0.014291f, + +0.007457f, +0.008519f, +0.004422f, -0.012197f, +0.003094f, -0.005587f, -0.004382f, +0.023000f, -0.005997f, +0.000604f, + -0.006327f, +0.007336f, +0.009463f, +0.010365f, +0.011969f, +0.000131f, -0.000930f, -0.002495f, +0.006001f, +0.000388f, + +0.008687f, +0.003295f, +0.003261f, +0.000857f, -0.001607f, -0.000864f, -0.002242f, -0.001797f, -0.000449f, -0.008726f, + +0.004544f, +0.000303f, -0.000391f, +0.004127f, -0.007954f, +0.003707f, +0.008336f, +0.000875f, +0.003270f, +0.002682f, + +0.003207f, +0.001783f, +0.000446f, -0.005167f, +0.001456f, -0.005619f, +0.000186f, +0.010032f, -0.002587f, +0.001101f, + +0.004097f, +0.003161f, +0.000682f, -0.003538f, +0.001989f, -0.001739f, +0.000285f, -0.001633f, +0.004196f, -0.000201f, + -0.000559f, +0.002914f, +0.001587f, -0.001930f, -0.001694f, -0.002197f, -0.002461f, +0.001795f, -0.001780f, +0.001396f, + -0.000800f, -0.001651f, +0.000212f, -0.000531f, -0.003339f, +0.000578f + }, + { + -0.004627f, +0.014167f, +0.000361f, +0.006536f, -0.004466f, -0.002059f, +0.004541f, +0.000853f, +0.004489f, -0.012167f, + -0.003117f, +0.006199f, +0.009088f, +0.013094f, -0.011476f, +0.038239f, +0.057766f, -0.020711f, -0.009162f, -0.001814f, + +0.013750f, +0.006563f, -0.004102f, -0.001108f, -0.009670f, +0.002917f, -0.007312f, +0.012438f, -0.001736f, +0.008638f, + -0.006815f, -0.013681f, -0.003980f, +0.007839f, +0.015593f, -0.004634f, -0.000966f, +0.011972f, -0.006949f, +0.005410f, + -0.005891f, -0.020581f, -0.001367f, +0.012700f, -0.005314f, -0.008605f, -0.001536f, +0.006221f, +0.000300f, +0.000199f, + +0.002328f, +0.006164f, +0.000876f, +0.004890f, -0.011784f, +0.000157f, +0.000307f, -0.002859f, +0.000040f, -0.002474f, + +0.005505f, +0.001825f, +0.001572f, -0.001892f, +0.005259f, +0.003524f, -0.005682f, +0.006658f, +0.005138f, +0.001582f, + -0.003831f, +0.000059f, -0.004192f, +0.004090f, -0.002067f, -0.000527f, +0.000905f, +0.000936f, -0.000907f, +0.004106f, + +0.000151f, +0.001536f, +0.002803f, -0.002922f, +0.000398f, +0.001214f, +0.003966f, +0.001931f, +0.003209f, -0.001500f, + -0.001209f, -0.000864f, +0.001837f, +0.000138f, -0.001367f, +0.000748f + }, + { + +0.010159f, +0.113965f, -0.006707f, -0.015710f, +0.036239f, +0.004550f, +0.033675f, -0.011229f, +0.020860f, +0.002559f, + +0.020257f, -0.017889f, -0.025646f, -0.017873f, +0.006748f, -0.012269f, -0.003005f, -0.015640f, +0.007073f, -0.003630f, + +0.016028f, -0.017858f, -0.002250f, +0.005504f, -0.012422f, +0.001205f, -0.011804f, -0.001994f, -0.005650f, +0.002775f, + -0.007969f, -0.006132f, +0.012103f, -0.007152f, +0.006587f, +0.002669f, +0.009777f, +0.000833f, +0.005017f, +0.017553f, + +0.002860f, +0.007723f, -0.004992f, -0.006838f, +0.006747f, +0.007269f, -0.013300f, -0.007637f, -0.005781f, -0.010186f, + +0.001802f, -0.005446f, +0.001142f, -0.003483f, -0.005198f, -0.004644f, -0.001844f, -0.002447f, -0.000979f, -0.007196f, + -0.004203f, -0.001422f, +0.008661f, +0.009806f, -0.001949f, +0.004149f, +0.000761f, +0.000946f, +0.004321f, +0.000950f, + -0.001467f, -0.002134f, +0.000680f, -0.007366f, -0.001603f, +0.001480f, +0.005061f, -0.004436f, -0.002228f, +0.003022f, + +0.001328f, +0.005540f, -0.002888f, -0.001400f, +0.003277f, -0.001320f, +0.001354f, +0.002513f, -0.001970f, -0.002658f, + +0.000980f, -0.005400f, +0.001322f, -0.001633f, -0.002665f, -0.000712f + }, + { + +0.003915f, -0.059141f, -0.000395f, -0.005516f, +0.011227f, -0.001050f, -0.009703f, -0.002621f, -0.000539f, +0.003268f, + +0.001749f, -0.015164f, +0.002819f, -0.024976f, +0.010389f, -0.010245f, +0.025413f, +0.012493f, +0.013010f, +0.004666f, + -0.013193f, -0.001901f, -0.007585f, -0.010488f, +0.009921f, +0.011838f, -0.016117f, +0.001166f, -0.008725f, -0.011960f, + +0.010240f, -0.010830f, +0.023990f, -0.010156f, -0.015840f, -0.007091f, -0.013613f, -0.007609f, +0.000236f, +0.003231f, + +0.016026f, +0.002124f, -0.000007f, -0.000888f, -0.003201f, -0.002451f, -0.013515f, -0.003135f, +0.000576f, +0.006811f, + +0.003874f, -0.003081f, +0.002054f, +0.001678f, +0.003496f, +0.002887f, +0.005199f, +0.004674f, +0.002453f, +0.002928f, + +0.006147f, +0.000390f, -0.005791f, +0.001582f, -0.002519f, -0.002969f, +0.002707f, +0.003648f, -0.004719f, +0.000471f, + +0.001670f, -0.000310f, -0.001838f, +0.001141f, -0.002541f, +0.000478f, +0.004279f, -0.000541f, +0.002118f, -0.000287f, + -0.004938f, +0.003542f, +0.001625f, -0.003721f, -0.000537f, +0.004220f, +0.000238f, +0.002053f, +0.000497f, +0.000669f, + -0.000182f, -0.000237f, -0.001034f, +0.000099f, +0.000970f, -0.003849f + }, + { + -0.027916f, +0.021879f, -0.019974f, +0.000459f, +0.015812f, +0.015229f, -0.004147f, -0.012988f, +0.022603f, +0.018667f, + -0.001342f, -0.016478f, +0.020122f, +0.016551f, +0.012641f, -0.004928f, -0.011245f, -0.010147f, +0.001113f, +0.015678f, + -0.001155f, -0.010796f, -0.015000f, -0.006951f, +0.002595f, +0.003707f, +0.019413f, -0.007227f, -0.000440f, -0.001821f, + +0.018631f, -0.024934f, -0.013579f, +0.011975f, -0.006532f, +0.006544f, +0.006633f, +0.003689f, -0.004439f, -0.003447f, + -0.004550f, -0.006276f, +0.005950f, +0.002806f, +0.001665f, -0.004378f, +0.017466f, -0.004366f, +0.008984f, -0.002504f, + +0.004098f, -0.009302f, +0.006986f, -0.007879f, -0.000421f, -0.001780f, -0.000148f, -0.006557f, +0.011817f, +0.004211f, + -0.002967f, +0.001473f, -0.001889f, +0.008967f, -0.001835f, +0.002510f, -0.000822f, -0.001041f, -0.003833f, -0.000201f, + +0.000743f, +0.001636f, +0.004459f, -0.004225f, +0.000973f, -0.005168f, -0.001619f, +0.006838f, -0.002223f, -0.000711f, + +0.001871f, -0.000610f, -0.003876f, -0.001630f, +0.002949f, -0.000818f, -0.000729f, +0.001066f, +0.000094f, -0.001278f, + +0.000984f, +0.000805f, -0.002784f, +0.000900f, -0.000387f, -0.000810f + }, + { + +0.004258f, +0.001534f, -0.015180f, +0.015330f, -0.019353f, +0.004708f, -0.006776f, +0.002346f, +0.008585f, -0.008100f, + +0.008120f, +0.003635f, +0.005412f, -0.093399f, -0.000016f, -0.011418f, +0.010270f, -0.007489f, -0.005272f, +0.001638f, + +0.005016f, -0.005250f, +0.000493f, -0.003755f, -0.003942f, -0.021335f, +0.006562f, -0.013083f, -0.005521f, +0.000684f, + -0.004737f, +0.012001f, +0.004167f, -0.015846f, +0.007634f, -0.010849f, +0.001192f, +0.009132f, -0.009115f, +0.006421f, + -0.012553f, +0.011169f, +0.001458f, -0.009608f, -0.004963f, -0.006815f, -0.001529f, -0.006389f, -0.000114f, +0.016934f, + +0.000682f, +0.001590f, -0.003253f, +0.000336f, +0.000567f, -0.000637f, -0.012034f, -0.004528f, +0.003761f, -0.004798f, + +0.016754f, -0.005847f, -0.009716f, -0.002779f, +0.001972f, -0.005399f, -0.000659f, -0.001695f, -0.011273f, +0.000180f, + +0.002412f, -0.004548f, -0.000398f, +0.000882f, +0.002452f, +0.002494f, -0.000156f, +0.000339f, -0.002570f, -0.004441f, + +0.002588f, -0.001580f, +0.000083f, -0.000131f, -0.001876f, -0.001333f, +0.001160f, +0.000681f, +0.003911f, +0.000832f, + +0.001316f, +0.001196f, +0.001800f, -0.001567f, -0.000820f, +0.001088f + }, + { + -0.022339f, -0.045626f, -0.001530f, +0.019499f, -0.016318f, +0.024275f, +0.009234f, -0.008306f, +0.017705f, +0.021034f, + +0.006852f, +0.009054f, -0.061953f, +0.014313f, -0.021268f, -0.001549f, -0.020236f, -0.018761f, +0.011265f, +0.015842f, + -0.003334f, +0.007122f, +0.004032f, +0.009678f, -0.007059f, -0.016047f, +0.036319f, +0.002649f, +0.014277f, +0.015763f, + +0.009807f, -0.018553f, +0.006144f, -0.007304f, +0.024659f, +0.001268f, +0.009714f, -0.010411f, +0.003484f, -0.009130f, + -0.010343f, -0.003455f, +0.005072f, +0.010324f, -0.007253f, +0.004699f, +0.003913f, +0.010530f, -0.005281f, -0.000712f, + -0.013461f, +0.009518f, +0.001386f, +0.001924f, +0.002118f, -0.000309f, -0.009571f, -0.000336f, -0.004987f, +0.005123f, + -0.008234f, +0.000490f, -0.003465f, -0.009471f, +0.000032f, +0.002160f, -0.003796f, -0.002416f, -0.000536f, +0.001849f, + +0.002173f, -0.002588f, +0.005116f, +0.000825f, -0.000662f, -0.000262f, +0.004889f, -0.000596f, -0.003993f, +0.002304f, + +0.002437f, +0.000409f, -0.003685f, -0.003280f, -0.003402f, +0.001180f, -0.002860f, +0.001117f, -0.002207f, +0.004221f, + +0.003952f, +0.000317f, +0.001353f, -0.002548f, +0.003755f, -0.001014f + }, + { + -0.002563f, -0.037748f, +0.009877f, +0.001693f, +0.005453f, -0.002590f, +0.018527f, -0.003033f, +0.006667f, -0.012034f, + -0.005281f, +0.007271f, +0.013778f, -0.067877f, -0.068772f, +0.010406f, -0.005969f, +0.010552f, -0.013696f, -0.016360f, + +0.009403f, +0.011630f, -0.024861f, +0.002138f, -0.000713f, -0.020789f, +0.003209f, +0.014356f, +0.010039f, +0.016991f, + +0.016176f, -0.000708f, -0.007361f, -0.004471f, -0.014356f, +0.004600f, -0.015473f, -0.001780f, +0.008509f, -0.017527f, + -0.010224f, +0.014877f, -0.001361f, -0.002240f, -0.008013f, +0.007154f, -0.002998f, +0.005423f, +0.000952f, -0.013596f, + +0.004624f, +0.003424f, +0.000371f, +0.005187f, +0.004192f, -0.003725f, -0.001888f, -0.002861f, +0.006828f, -0.000229f, + +0.004590f, +0.000882f, +0.008684f, -0.008724f, -0.001912f, +0.002309f, -0.012322f, +0.004986f, -0.001258f, +0.000394f, + +0.000400f, +0.003422f, +0.001340f, +0.000787f, +0.005016f, +0.001729f, +0.007198f, +0.000502f, +0.001615f, +0.001671f, + +0.003889f, +0.004506f, -0.003317f, -0.002649f, -0.001983f, -0.000515f, -0.001683f, +0.003442f, -0.002203f, -0.000023f, + +0.001385f, +0.000278f, -0.003103f, +0.004629f, -0.003253f, +0.002612f + } + }, + { + { + +0.028235f, +0.013519f, +0.046771f, +0.125150f, -0.009544f, -0.003206f, -0.004306f, -0.006612f, +0.010335f, +0.018780f, + +0.038857f, -0.012509f, +0.014820f, +0.007239f, -0.001006f, +0.010005f, -0.001032f, +0.024360f, -0.004805f, +0.003360f, + -0.004840f, +0.012937f, +0.012059f, +0.014385f, -0.009488f, -0.004576f, +0.005693f, +0.004557f, +0.007841f, -0.008691f, + +0.006260f, -0.006553f, +0.003915f, -0.011278f, +0.014051f, +0.002003f, +0.011463f, +0.007318f, +0.000220f, -0.003958f, + +0.003058f, +0.002435f, +0.011299f, +0.006398f, +0.001353f, -0.004619f, -0.004110f, +0.003898f, -0.001982f, -0.002994f, + +0.002054f, -0.008879f, +0.003105f, -0.014403f, -0.005678f, -0.008270f, +0.006590f, +0.001315f, -0.001833f, -0.000891f, + -0.006781f, +0.002729f, -0.003079f, -0.000331f, -0.003283f, +0.000715f, +0.005265f, -0.006154f, +0.000604f, -0.000634f, + +0.002797f, +0.002192f, -0.003615f, -0.000414f, +0.001702f, -0.002575f, +0.002639f, -0.002119f, +0.001010f, -0.002904f, + +0.002277f, -0.001741f, -0.000308f, +0.000749f, -0.002972f, +0.001067f, -0.001651f, -0.000099f, -0.001608f, +0.000923f, + +0.001042f, +0.002616f, +0.000903f, -0.000032f, -0.001390f, -0.001217f + }, + { + +0.002306f, +0.036909f, -0.015050f, -0.088735f, +0.005215f, -0.005590f, -0.003714f, -0.003148f, +0.006490f, -0.000245f, + +0.001147f, -0.023172f, -0.007792f, +0.001198f, -0.001133f, +0.001622f, -0.020815f, -0.005589f, +0.000286f, +0.008458f, + +0.017640f, +0.000702f, +0.016442f, +0.018946f, +0.016642f, -0.009862f, -0.010779f, -0.012939f, -0.001794f, +0.000885f, + -0.010868f, +0.003023f, -0.023698f, +0.001936f, +0.009647f, +0.002865f, +0.014272f, +0.002101f, +0.005538f, -0.002890f, + +0.004843f, +0.001158f, -0.003635f, -0.013540f, -0.002820f, +0.019275f, +0.011889f, +0.003966f, -0.009211f, +0.003981f, + -0.004246f, -0.003372f, +0.005243f, -0.006526f, -0.004191f, +0.001923f, +0.000360f, -0.003612f, -0.003380f, +0.006149f, + +0.001915f, -0.005223f, +0.001722f, -0.007078f, +0.001498f, +0.000719f, +0.000061f, -0.001785f, -0.002843f, +0.001469f, + -0.003467f, -0.003067f, -0.000595f, +0.001635f, -0.001803f, +0.001091f, -0.004107f, +0.003592f, +0.000388f, -0.004078f, + -0.002962f, +0.003978f, +0.000640f, -0.001517f, +0.000331f, -0.000429f, +0.001048f, +0.003676f, -0.001398f, +0.000175f, + +0.002678f, +0.001409f, +0.001061f, -0.002305f, -0.000703f, -0.000901f + }, + { + -0.011347f, -0.018289f, +0.031751f, +0.017155f, -0.047954f, -0.003822f, -0.003755f, +0.000747f, +0.009037f, -0.003007f, + -0.003701f, -0.030756f, +0.008176f, -0.024669f, +0.010095f, +0.015687f, -0.002742f, +0.001966f, -0.007917f, +0.019707f, + -0.004989f, -0.004988f, -0.015410f, +0.004627f, -0.007298f, -0.009524f, +0.004980f, +0.018174f, +0.003247f, -0.011075f, + -0.011766f, +0.022365f, +0.004344f, +0.011527f, +0.010802f, +0.012122f, +0.000380f, -0.007939f, +0.016561f, +0.001450f, + +0.000111f, -0.013931f, +0.003719f, +0.001352f, +0.001973f, +0.003387f, -0.001605f, -0.008582f, +0.004721f, +0.002722f, + -0.001166f, +0.004914f, +0.001927f, -0.003477f, +0.006194f, -0.003190f, -0.007769f, +0.002268f, -0.007428f, -0.007804f, + +0.005317f, +0.003756f, -0.002062f, +0.002886f, -0.001419f, -0.003462f, +0.004471f, +0.001609f, -0.000583f, +0.000511f, + -0.000781f, +0.004423f, +0.000810f, +0.000804f, -0.003823f, +0.000849f, +0.005448f, +0.001868f, -0.003811f, -0.003987f, + -0.003980f, -0.003417f, -0.003484f, -0.001283f, +0.001974f, +0.000057f, -0.002733f, -0.000312f, +0.002092f, +0.002943f, + +0.000566f, -0.000384f, +0.002862f, +0.001581f, +0.003123f, +0.000435f + }, + { + +0.020530f, -0.045286f, +0.011879f, +0.031932f, -0.017427f, +0.003081f, -0.006186f, -0.001824f, -0.003481f, -0.000197f, + -0.022545f, +0.014074f, +0.013938f, +0.012586f, -0.019027f, +0.019768f, -0.009120f, +0.003313f, -0.013397f, +0.002451f, + +0.000966f, -0.020782f, -0.030356f, -0.015457f, +0.000403f, -0.047678f, +0.008401f, -0.006391f, +0.010299f, -0.001198f, + -0.012763f, +0.010470f, -0.001076f, +0.006356f, +0.018785f, -0.007592f, +0.005687f, -0.003200f, +0.009224f, +0.011281f, + -0.007800f, -0.004569f, -0.007100f, +0.002688f, -0.001496f, -0.003487f, +0.005001f, -0.008960f, -0.005799f, +0.009556f, + +0.006078f, +0.000819f, +0.000804f, -0.003046f, +0.001367f, -0.005984f, +0.002269f, +0.005161f, -0.003597f, +0.007823f, + +0.002867f, +0.001921f, -0.011492f, -0.000575f, +0.002499f, -0.000003f, +0.000954f, -0.002419f, +0.008702f, -0.003693f, + -0.003422f, +0.003581f, +0.000035f, -0.003493f, +0.000130f, -0.000293f, -0.003372f, -0.002846f, +0.002296f, -0.000897f, + +0.000181f, -0.002347f, -0.000720f, -0.000666f, -0.000193f, -0.002830f, +0.002807f, +0.000871f, +0.004164f, +0.000854f, + +0.000794f, +0.000949f, -0.000141f, -0.001710f, +0.001466f, -0.000565f + }, + { + -0.003302f, +0.032158f, +0.009409f, -0.020841f, +0.002606f, -0.005316f, +0.001280f, -0.000613f, +0.000965f, +0.004640f, + -0.006536f, -0.017695f, -0.004155f, +0.009055f, +0.030237f, -0.006345f, -0.005708f, +0.010428f, -0.014874f, +0.004101f, + +0.024299f, +0.000900f, -0.035289f, +0.016386f, -0.011150f, +0.014158f, +0.021254f, +0.008506f, +0.000293f, +0.007894f, + +0.009264f, +0.013533f, -0.006857f, +0.012880f, -0.000251f, -0.003059f, +0.000089f, -0.000617f, -0.002864f, -0.017150f, + -0.013003f, +0.004330f, +0.005778f, -0.007708f, -0.004735f, -0.007037f, +0.000329f, +0.003426f, +0.001975f, +0.000164f, + -0.002519f, +0.000146f, +0.012205f, -0.001348f, -0.000911f, -0.001970f, -0.003283f, +0.003600f, -0.001042f, +0.001467f, + -0.001670f, -0.003439f, +0.006698f, -0.000624f, -0.001513f, -0.006430f, -0.005636f, -0.003625f, +0.001451f, +0.004953f, + -0.004916f, +0.005407f, +0.004906f, -0.001852f, +0.000093f, +0.002724f, +0.000109f, +0.002498f, -0.000553f, -0.004576f, + +0.002517f, -0.000532f, +0.003816f, -0.000352f, -0.003224f, -0.001047f, -0.001692f, +0.001329f, +0.003171f, -0.001551f, + -0.000196f, +0.001184f, -0.001077f, +0.000389f, -0.000343f, -0.001044f + }, + { + +0.033433f, -0.021092f, +0.010897f, -0.040982f, -0.005771f, -0.006139f, +0.015971f, -0.018566f, -0.034762f, +0.008712f, + -0.003597f, +0.046911f, -0.009666f, +0.017770f, -0.002265f, -0.010992f, -0.018014f, -0.002051f, +0.003407f, -0.001795f, + +0.002924f, +0.001028f, -0.017245f, -0.007861f, +0.034911f, -0.003240f, +0.013850f, -0.011227f, -0.007965f, -0.006738f, + +0.007284f, -0.004439f, +0.012454f, +0.005417f, -0.001135f, +0.006533f, -0.001162f, +0.002673f, -0.004902f, -0.003966f, + +0.004045f, -0.002032f, +0.001611f, -0.001270f, -0.001639f, +0.005020f, +0.000537f, +0.011575f, -0.001235f, +0.000864f, + -0.010217f, -0.002908f, +0.002762f, -0.003154f, -0.000043f, +0.006204f, -0.000461f, -0.007085f, -0.003983f, +0.004004f, + -0.005572f, -0.000564f, -0.001212f, -0.003795f, -0.004200f, +0.002485f, +0.004412f, +0.002496f, +0.000978f, +0.001443f, + +0.000248f, -0.003700f, -0.003408f, +0.000066f, +0.004592f, -0.000697f, +0.002147f, +0.003978f, +0.002020f, +0.000914f, + -0.001575f, +0.002313f, +0.002479f, +0.004443f, -0.001423f, +0.004241f, +0.001544f, +0.001339f, -0.001191f, +0.001922f, + -0.000685f, +0.000424f, +0.004960f, -0.000468f, -0.000453f, +0.000755f + }, + { + -0.000072f, -0.022964f, -0.027828f, -0.001077f, +0.008896f, -0.000424f, -0.001857f, -0.000677f, -0.007570f, -0.002049f, + -0.008454f, -0.004240f, -0.012508f, +0.014901f, -0.015096f, +0.005886f, -0.034005f, +0.003030f, -0.003855f, +0.006419f, + +0.007890f, +0.004016f, -0.000598f, -0.028646f, -0.016599f, -0.011826f, -0.007429f, -0.008175f, +0.018050f, -0.020196f, + +0.011487f, +0.007999f, -0.015386f, +0.025176f, +0.008540f, +0.006061f, -0.007293f, -0.002703f, +0.004928f, -0.000890f, + +0.007036f, -0.007546f, -0.011501f, -0.012465f, +0.008864f, +0.003601f, +0.000191f, -0.001431f, -0.018140f, +0.002385f, + +0.001411f, +0.002363f, +0.006964f, +0.005368f, +0.001906f, -0.003864f, +0.004455f, -0.010001f, -0.007382f, +0.001878f, + -0.004266f, -0.001532f, +0.001374f, +0.003154f, +0.000096f, +0.002530f, +0.001771f, -0.006194f, +0.000355f, +0.000645f, + -0.000206f, +0.003155f, -0.005752f, -0.002784f, +0.000977f, -0.001216f, +0.002518f, +0.001823f, -0.000235f, -0.005045f, + -0.003655f, +0.000906f, -0.004062f, +0.000017f, +0.001960f, +0.001539f, -0.001683f, -0.002861f, +0.003034f, +0.002549f, + +0.001315f, -0.000203f, -0.001502f, +0.000978f, +0.001087f, +0.002033f + }, + { + +0.025434f, -0.107260f, +0.022450f, -0.112608f, -0.003590f, +0.008838f, -0.018990f, +0.059496f, -0.006005f, +0.002388f, + +0.019178f, +0.021512f, +0.014687f, -0.003149f, +0.012168f, -0.013139f, -0.038432f, -0.006377f, +0.022468f, +0.004287f, + -0.011460f, -0.001696f, -0.000229f, -0.023395f, -0.009821f, +0.000200f, +0.009732f, +0.019392f, +0.001053f, +0.009679f, + -0.015047f, +0.007846f, +0.001564f, -0.004197f, +0.004732f, -0.007740f, -0.000864f, +0.000081f, +0.004145f, -0.005554f, + +0.003258f, -0.000306f, -0.005857f, -0.009654f, -0.010479f, +0.000794f, +0.007648f, +0.001353f, -0.001075f, -0.010438f, + +0.007185f, +0.003565f, -0.000271f, +0.001621f, -0.010589f, +0.001400f, -0.000801f, -0.001029f, +0.007922f, +0.001634f, + +0.000020f, -0.002571f, +0.000741f, -0.004026f, +0.007666f, -0.003058f, +0.001019f, +0.006612f, -0.002791f, +0.002971f, + +0.001352f, -0.001098f, +0.000577f, -0.001246f, -0.000484f, -0.004867f, -0.001538f, -0.001456f, +0.004425f, -0.000914f, + -0.001436f, +0.004459f, +0.003819f, -0.000446f, -0.002223f, -0.000464f, -0.001357f, +0.002175f, -0.000207f, +0.001612f, + -0.000421f, -0.001896f, -0.001993f, -0.000189f, -0.001868f, +0.001964f + }, + { + -0.000059f, +0.045273f, -0.002285f, +0.019274f, +0.006236f, +0.000164f, +0.006810f, -0.004704f, +0.000174f, -0.006638f, + -0.000176f, +0.001180f, -0.000461f, +0.017361f, +0.003063f, +0.006853f, +0.023964f, -0.016281f, +0.000508f, -0.004627f, + +0.016961f, -0.001548f, -0.016249f, -0.005412f, +0.000751f, +0.012059f, -0.003565f, +0.027713f, -0.005604f, -0.006766f, + -0.014988f, -0.018989f, -0.004183f, +0.005859f, +0.013656f, +0.006867f, +0.007084f, +0.002650f, -0.014717f, -0.005178f, + -0.009878f, -0.009179f, +0.002131f, +0.012033f, -0.014792f, -0.006967f, +0.008314f, +0.000954f, -0.006400f, -0.002285f, + +0.000266f, -0.000034f, -0.002992f, +0.006639f, -0.004289f, +0.005588f, +0.005595f, +0.003973f, +0.011164f, -0.003077f, + -0.002686f, +0.000385f, +0.003212f, -0.001964f, +0.003173f, +0.001022f, -0.002222f, +0.001676f, -0.006345f, -0.000610f, + +0.000443f, +0.004128f, -0.003318f, +0.003587f, +0.000375f, +0.003191f, +0.001325f, -0.000308f, -0.000386f, +0.004016f, + -0.000479f, +0.001659f, +0.004257f, -0.001087f, +0.001569f, +0.002108f, +0.003710f, +0.002771f, +0.004190f, -0.001407f, + -0.001261f, -0.000634f, +0.000737f, +0.000043f, -0.001961f, -0.000979f + }, + { + -0.015503f, +0.107460f, +0.017447f, -0.012559f, -0.003612f, -0.041818f, -0.005445f, -0.017988f, +0.027866f, -0.003843f, + +0.008415f, -0.017182f, +0.013445f, +0.004683f, +0.007915f, -0.008368f, +0.011175f, -0.011042f, -0.018602f, -0.006524f, + +0.033624f, -0.008838f, -0.005204f, -0.001865f, -0.011882f, +0.009956f, -0.006297f, +0.001680f, -0.003120f, +0.011671f, + -0.001911f, -0.008857f, +0.010382f, -0.017498f, +0.002867f, -0.002876f, +0.006638f, +0.002752f, +0.001345f, +0.017119f, + +0.002274f, +0.000626f, -0.002776f, -0.006123f, -0.005413f, -0.001987f, -0.010758f, +0.004767f, +0.005817f, -0.015144f, + -0.002895f, -0.004047f, -0.005211f, -0.001448f, +0.007005f, +0.003675f, -0.006540f, -0.001958f, +0.005245f, -0.009984f, + -0.006309f, -0.001424f, +0.002748f, +0.007011f, -0.002999f, -0.001409f, -0.002147f, +0.000629f, +0.003460f, -0.000779f, + -0.000700f, -0.004143f, +0.001228f, -0.002736f, -0.000368f, -0.004091f, +0.001862f, -0.000881f, +0.000453f, +0.002283f, + -0.003599f, +0.002174f, +0.000269f, +0.000714f, +0.002533f, +0.001299f, +0.001782f, -0.000675f, -0.001163f, -0.000754f, + +0.002500f, -0.002225f, +0.005311f, +0.000470f, +0.000316f, -0.000883f + }, + { + -0.005099f, -0.050498f, +0.013481f, -0.024300f, +0.000461f, +0.023260f, +0.019527f, -0.009410f, -0.008572f, +0.014824f, + +0.007741f, -0.010514f, -0.001916f, -0.034620f, +0.008519f, -0.007160f, +0.016977f, +0.002096f, +0.018153f, +0.011657f, + -0.025459f, +0.008875f, -0.004237f, -0.028813f, +0.000851f, +0.000984f, -0.022143f, +0.002435f, -0.014098f, -0.022287f, + +0.013632f, -0.007631f, +0.013561f, -0.009790f, +0.006820f, +0.001602f, -0.005421f, -0.000644f, -0.001093f, +0.006251f, + +0.013565f, -0.001156f, +0.007572f, +0.000402f, -0.000187f, +0.007119f, -0.007984f, +0.008712f, -0.001856f, -0.003460f, + -0.003749f, -0.006133f, +0.000596f, -0.002881f, -0.001053f, -0.003794f, +0.000544f, +0.011402f, +0.004650f, +0.002234f, + -0.003672f, -0.008798f, -0.000712f, +0.008774f, +0.002222f, +0.000604f, +0.001279f, +0.004104f, -0.000686f, +0.003356f, + +0.005069f, +0.001244f, -0.002399f, +0.000217f, -0.001645f, +0.001202f, +0.003605f, -0.003827f, +0.000673f, -0.000531f, + -0.003996f, +0.000455f, +0.000723f, -0.000359f, +0.001975f, +0.004068f, -0.000268f, -0.000901f, -0.003404f, -0.000528f, + -0.001954f, -0.000229f, -0.000499f, +0.000011f, +0.003267f, -0.000642f + }, + { + +0.018630f, +0.068240f, -0.000657f, +0.028056f, +0.004935f, +0.071610f, +0.021182f, -0.025690f, +0.013180f, +0.000491f, + +0.015197f, +0.008542f, -0.007164f, -0.017353f, +0.021379f, -0.000368f, -0.004494f, +0.020863f, +0.004132f, -0.003861f, + +0.004670f, +0.000971f, +0.001877f, +0.005601f, +0.008242f, +0.006261f, +0.012343f, -0.007888f, +0.002338f, -0.002477f, + +0.030700f, -0.016680f, -0.012199f, +0.016439f, -0.007019f, -0.001359f, +0.002566f, +0.005853f, -0.000249f, -0.001758f, + -0.000935f, -0.001238f, +0.002504f, +0.000301f, +0.005565f, -0.001154f, +0.001024f, -0.013664f, +0.007533f, -0.004512f, + -0.001072f, -0.012024f, +0.012490f, -0.006479f, -0.008613f, -0.002987f, +0.001318f, -0.009291f, +0.008485f, +0.001865f, + -0.006698f, +0.001113f, -0.006038f, -0.002769f, -0.008027f, +0.001022f, +0.000916f, +0.008650f, +0.002407f, -0.000287f, + -0.002713f, +0.000851f, +0.005600f, -0.008616f, +0.000174f, -0.003098f, -0.002279f, +0.005687f, -0.003460f, -0.003098f, + +0.000343f, +0.002646f, -0.000912f, +0.000516f, +0.004132f, -0.001024f, +0.000380f, -0.000633f, -0.001103f, -0.000965f, + +0.001976f, +0.001794f, -0.004556f, +0.000629f, +0.000984f, -0.001308f + }, + { + -0.003931f, +0.008134f, +0.002087f, +0.016889f, -0.007298f, +0.003469f, -0.015233f, +0.002188f, +0.014067f, -0.008241f, + +0.006751f, +0.012079f, +0.004834f, -0.078694f, +0.009417f, -0.023700f, +0.002860f, -0.012363f, +0.003918f, +0.002999f, + -0.006610f, +0.002357f, +0.009368f, -0.012644f, -0.005244f, -0.016359f, -0.006541f, -0.001243f, -0.008946f, -0.009543f, + +0.001721f, +0.004693f, +0.002403f, -0.024393f, +0.006714f, -0.009733f, -0.005853f, +0.005740f, -0.005864f, +0.002481f, + -0.017600f, +0.012265f, +0.004615f, -0.006711f, -0.002767f, -0.000545f, -0.004890f, -0.006674f, -0.003185f, +0.008725f, + -0.011971f, -0.004662f, +0.001294f, +0.009143f, +0.003403f, +0.004008f, -0.005126f, -0.004770f, +0.000910f, -0.010284f, + +0.010065f, -0.002356f, -0.009550f, -0.008221f, +0.001325f, -0.001807f, -0.000828f, +0.002910f, +0.000634f, +0.007924f, + +0.000002f, -0.004692f, +0.000777f, -0.000982f, -0.000837f, -0.001165f, -0.003364f, +0.000040f, +0.001151f, -0.000806f, + +0.003090f, -0.001937f, +0.000446f, -0.003482f, -0.002492f, -0.000475f, +0.001889f, +0.000098f, +0.000932f, -0.000827f, + +0.000519f, -0.000480f, +0.004086f, +0.002267f, +0.003480f, +0.001903f + }, + { + +0.026106f, +0.020239f, +0.012473f, +0.024617f, -0.020208f, +0.036109f, +0.004226f, -0.016052f, -0.004449f, +0.018928f, + -0.005810f, -0.003595f, -0.059746f, -0.010737f, -0.064376f, +0.009615f, +0.001097f, -0.025543f, -0.000111f, +0.012357f, + +0.004029f, -0.001132f, -0.007531f, +0.009037f, -0.008763f, -0.042687f, +0.020334f, -0.013631f, -0.013727f, +0.003086f, + +0.008071f, -0.015439f, +0.006983f, -0.008751f, +0.021251f, -0.014884f, -0.006605f, -0.006863f, +0.015278f, -0.004782f, + -0.002561f, -0.003019f, +0.007398f, +0.011996f, -0.009686f, +0.012951f, +0.008589f, +0.007694f, -0.007071f, -0.004663f, + -0.010800f, +0.012389f, -0.008232f, -0.008366f, -0.002042f, +0.005149f, -0.009066f, -0.001176f, -0.003340f, -0.000627f, + -0.010231f, -0.001183f, -0.000807f, -0.006954f, +0.001985f, -0.000461f, -0.004166f, +0.000307f, -0.000376f, -0.001617f, + -0.000739f, -0.003305f, +0.001511f, -0.001065f, +0.001971f, +0.001073f, +0.001294f, -0.004339f, -0.005734f, +0.000208f, + -0.000380f, +0.001596f, +0.003224f, -0.000062f, -0.004152f, -0.001391f, -0.002752f, +0.001701f, -0.003994f, +0.000987f, + -0.000799f, -0.003463f, +0.001199f, -0.002137f, +0.002927f, -0.000554f + }, + { + +0.002972f, -0.053462f, -0.006524f, +0.006400f, +0.015015f, -0.002030f, +0.011851f, +0.001165f, +0.014177f, +0.003117f, + -0.006055f, -0.003152f, +0.006219f, +0.028356f, +0.060932f, +0.006159f, +0.014043f, +0.007056f, -0.032292f, -0.014945f, + +0.019807f, +0.003576f, -0.019735f, +0.004848f, -0.000666f, -0.015760f, -0.000353f, +0.009383f, -0.010849f, -0.005534f, + +0.008633f, +0.013080f, +0.006423f, +0.007585f, -0.003623f, +0.015286f, -0.013293f, -0.015668f, +0.004450f, -0.015232f, + -0.010759f, +0.021422f, +0.001805f, -0.001228f, +0.002323f, +0.014856f, -0.000470f, +0.001313f, -0.003401f, -0.006430f, + +0.007097f, -0.003531f, +0.001273f, +0.012537f, -0.000506f, -0.010289f, -0.000268f, +0.002586f, +0.007190f, -0.003389f, + +0.005873f, -0.000496f, +0.009739f, -0.004507f, +0.000258f, +0.009888f, -0.005701f, +0.010823f, +0.000079f, -0.000205f, + -0.005129f, +0.000921f, +0.003015f, -0.002232f, +0.002470f, -0.002381f, +0.001805f, -0.001909f, -0.001114f, -0.000748f, + +0.000521f, +0.001105f, +0.000952f, +0.002179f, +0.000873f, +0.003963f, +0.000471f, +0.000635f, -0.002450f, -0.000283f, + -0.000831f, +0.002041f, -0.001265f, +0.005768f, -0.002820f, +0.002582f + } + }, + { + { + -0.032246f, +0.058970f, +0.058704f, +0.111977f, +0.024281f, -0.015506f, -0.008080f, +0.006770f, -0.007336f, +0.027168f, + +0.021472f, +0.008476f, +0.008575f, +0.009482f, -0.000728f, +0.006548f, +0.018807f, +0.003044f, +0.001780f, -0.000566f, + +0.002266f, +0.015540f, +0.002221f, +0.015700f, -0.005109f, -0.005261f, +0.000690f, +0.011396f, -0.003278f, +0.000575f, + +0.004622f, -0.005612f, -0.002233f, +0.000845f, +0.005038f, +0.009373f, -0.003765f, +0.014924f, -0.000646f, -0.002655f, + +0.005747f, +0.000101f, +0.004289f, +0.006007f, +0.006701f, -0.008510f, +0.003658f, -0.005821f, +0.002238f, -0.007933f, + +0.002311f, -0.001065f, -0.004863f, -0.011007f, -0.003373f, -0.008913f, +0.002775f, +0.002007f, -0.001839f, -0.004307f, + +0.001888f, -0.000554f, -0.005739f, -0.000673f, -0.002077f, +0.000971f, -0.000325f, -0.003910f, -0.003485f, +0.003927f, + -0.002250f, +0.002723f, -0.000880f, +0.000006f, +0.000498f, -0.002076f, -0.000973f, -0.002244f, -0.001239f, -0.001323f, + +0.000275f, +0.001934f, -0.001743f, +0.000078f, +0.000130f, -0.002897f, +0.000073f, -0.001301f, -0.001448f, +0.002209f, + +0.002567f, +0.001465f, +0.001174f, -0.000197f, +0.001163f, -0.000699f + }, + { + -0.002751f, -0.016116f, +0.028019f, -0.020373f, -0.049026f, -0.004341f, +0.001874f, +0.003787f, +0.000235f, +0.008665f, + -0.016550f, -0.016481f, +0.005166f, -0.013064f, -0.004565f, +0.011719f, -0.029283f, -0.006138f, +0.025004f, -0.026140f, + +0.010529f, +0.025176f, -0.003688f, +0.010122f, +0.019483f, -0.003682f, +0.004009f, -0.026192f, +0.007302f, +0.002125f, + -0.013039f, -0.005097f, -0.015465f, +0.006692f, +0.003653f, +0.001075f, +0.019744f, +0.000313f, +0.000753f, +0.003646f, + -0.003249f, +0.007458f, +0.004227f, -0.015172f, -0.004621f, +0.019491f, +0.009967f, +0.007168f, -0.007235f, -0.002953f, + -0.002256f, -0.002587f, -0.005366f, +0.002840f, +0.001050f, -0.000253f, -0.002085f, -0.001975f, +0.001377f, -0.003882f, + +0.000473f, -0.000883f, +0.001210f, +0.000615f, -0.003355f, -0.000576f, +0.000701f, -0.002760f, +0.004128f, -0.003680f, + -0.004391f, -0.001140f, -0.000648f, -0.001580f, +0.001530f, -0.000013f, -0.003780f, +0.002722f, -0.000101f, -0.003153f, + +0.000847f, +0.001581f, +0.003612f, -0.003396f, +0.000365f, -0.001659f, +0.002991f, +0.002140f, -0.002495f, +0.004739f, + +0.000942f, +0.000857f, +0.000861f, -0.002050f, +0.000150f, -0.001941f + }, + { + +0.009753f, +0.041008f, -0.048865f, -0.060896f, +0.022426f, +0.000212f, -0.004221f, -0.001552f, +0.010895f, -0.005506f, + -0.016818f, -0.012369f, -0.021779f, +0.010061f, -0.006146f, +0.015755f, -0.003978f, -0.003600f, -0.006483f, +0.017047f, + +0.007737f, -0.007872f, -0.009030f, -0.014099f, +0.003048f, -0.003502f, +0.006807f, +0.010090f, +0.005469f, -0.011802f, + -0.012067f, +0.007737f, +0.022187f, -0.002961f, +0.026010f, -0.003659f, +0.015844f, -0.005785f, +0.001308f, +0.000193f, + +0.004583f, -0.009049f, +0.000471f, +0.007260f, -0.002806f, +0.002899f, -0.007585f, +0.006562f, -0.005353f, +0.005369f, + -0.004920f, +0.006846f, -0.005240f, +0.005350f, +0.003007f, -0.000820f, -0.009332f, -0.001307f, -0.007118f, -0.001555f, + +0.000541f, -0.000265f, +0.004379f, +0.006128f, -0.006355f, -0.001086f, +0.003159f, -0.001100f, +0.000949f, +0.003342f, + -0.002798f, +0.001430f, +0.001857f, +0.002210f, -0.004788f, +0.000966f, +0.003863f, +0.001729f, -0.004105f, -0.000893f, + -0.004862f, -0.001194f, -0.000911f, -0.005461f, +0.001364f, +0.000499f, -0.001774f, -0.000988f, +0.001455f, +0.003714f, + +0.001043f, +0.000026f, +0.000179f, +0.002226f, +0.001455f, +0.002022f + }, + { + -0.022948f, +0.004436f, -0.002443f, +0.043063f, +0.005061f, -0.002358f, -0.003641f, -0.011824f, +0.013385f, -0.011292f, + -0.017846f, +0.015710f, +0.001058f, +0.025464f, -0.002972f, +0.005966f, -0.013467f, +0.018816f, -0.015349f, -0.020729f, + +0.010190f, -0.016462f, -0.040475f, -0.003809f, -0.009878f, -0.038665f, +0.002056f, +0.010275f, -0.003006f, +0.000681f, + +0.006496f, -0.002845f, -0.001204f, +0.012757f, +0.015976f, -0.002116f, +0.003150f, +0.005261f, +0.003151f, +0.004072f, + +0.001279f, +0.002441f, -0.011454f, +0.004228f, -0.002235f, -0.000526f, -0.005754f, -0.004859f, +0.001274f, +0.007870f, + +0.001228f, +0.006153f, -0.006949f, +0.004240f, -0.006808f, -0.000741f, +0.001607f, +0.004611f, +0.005255f, -0.005862f, + +0.007885f, -0.002738f, -0.003883f, -0.008220f, +0.003672f, +0.005105f, -0.003148f, +0.007775f, +0.000055f, -0.001587f, + -0.002509f, +0.004656f, -0.000197f, -0.001253f, -0.001065f, -0.004641f, -0.001924f, +0.000218f, +0.000547f, -0.002171f, + -0.003056f, +0.002815f, -0.003044f, -0.000987f, -0.001076f, -0.001618f, -0.002419f, +0.004089f, +0.002435f, +0.000979f, + +0.000468f, +0.002432f, +0.000118f, -0.002580f, +0.002651f, +0.001031f + }, + { + +0.001356f, +0.054386f, -0.014489f, -0.014105f, -0.005310f, +0.000143f, -0.001752f, +0.000446f, +0.001887f, +0.001161f, + -0.000647f, -0.014425f, -0.006986f, -0.008410f, +0.053095f, -0.010262f, +0.019450f, -0.017161f, +0.006277f, +0.012373f, + +0.013090f, -0.002524f, -0.030806f, +0.006801f, -0.006406f, +0.014120f, +0.009909f, +0.011295f, +0.015672f, +0.003225f, + +0.002341f, +0.008013f, +0.001293f, +0.007866f, -0.007238f, +0.003337f, +0.000630f, -0.002127f, -0.014675f, -0.017252f, + +0.003381f, -0.003580f, -0.001379f, +0.001283f, -0.010729f, -0.010836f, +0.006427f, -0.003794f, +0.006109f, +0.002105f, + +0.002989f, -0.001565f, +0.006499f, -0.002795f, +0.001676f, -0.006193f, -0.001283f, +0.003995f, +0.000045f, -0.000724f, + -0.002562f, +0.005071f, -0.002990f, -0.001007f, +0.000071f, -0.001871f, -0.006607f, -0.001430f, -0.000435f, +0.003167f, + -0.000830f, +0.005838f, +0.000639f, +0.000597f, -0.002230f, +0.003948f, +0.001876f, -0.002535f, -0.002379f, -0.001796f, + +0.004014f, +0.000739f, +0.003026f, -0.000892f, -0.002210f, -0.003798f, -0.000814f, +0.002972f, +0.000497f, -0.000009f, + -0.000263f, -0.001020f, +0.000495f, +0.001891f, -0.001595f, -0.001448f + }, + { + -0.031219f, +0.078929f, -0.030796f, -0.030312f, +0.008832f, +0.003475f, +0.007998f, -0.026735f, -0.012876f, -0.010352f, + +0.037505f, +0.014522f, -0.001571f, +0.013710f, +0.016180f, -0.003643f, -0.040911f, -0.004535f, +0.013933f, +0.003838f, + -0.000248f, -0.009725f, -0.006916f, -0.005013f, +0.026479f, +0.011845f, -0.002280f, +0.000424f, -0.012363f, -0.002522f, + +0.000370f, +0.002385f, +0.006144f, +0.002949f, +0.002266f, +0.005709f, +0.008543f, -0.005327f, -0.015985f, -0.002237f, + +0.001282f, +0.006288f, +0.002099f, -0.003440f, +0.000234f, -0.004207f, +0.002401f, +0.008696f, +0.003652f, -0.007774f, + +0.002019f, -0.001488f, -0.000214f, -0.004315f, +0.004037f, -0.000913f, +0.000213f, -0.006949f, -0.002383f, -0.000544f, + -0.002895f, +0.004367f, -0.010113f, -0.000658f, +0.002466f, -0.002960f, +0.003200f, +0.003087f, +0.000350f, +0.003623f, + -0.002276f, -0.004499f, +0.003515f, -0.001089f, +0.003567f, -0.001580f, +0.001983f, +0.002607f, +0.004428f, +0.000335f, + +0.000965f, +0.001676f, +0.003916f, +0.002271f, -0.000515f, +0.003357f, +0.000904f, +0.000787f, +0.001123f, -0.000920f, + -0.000187f, +0.001737f, +0.002817f, +0.000982f, +0.000869f, -0.000152f + }, + { + +0.000853f, -0.042855f, -0.011867f, +0.005624f, +0.000937f, +0.000751f, -0.000355f, -0.002097f, -0.008334f, -0.003454f, + +0.006418f, -0.015072f, -0.001998f, +0.009595f, -0.003768f, -0.004678f, -0.027434f, -0.001767f, -0.008430f, +0.018266f, + +0.016767f, -0.004749f, -0.006442f, +0.000266f, -0.028243f, -0.015844f, -0.020222f, +0.008489f, +0.010479f, -0.012321f, + +0.010277f, -0.002466f, +0.005673f, +0.001251f, +0.017261f, +0.000759f, -0.009677f, +0.000299f, +0.002091f, -0.010730f, + +0.010734f, -0.001804f, -0.019769f, -0.005142f, +0.010637f, -0.008851f, -0.000042f, +0.001030f, -0.015444f, +0.007423f, + +0.001009f, -0.003936f, +0.010354f, +0.002818f, +0.002658f, -0.003310f, -0.001697f, +0.001980f, -0.011208f, +0.000787f, + -0.004082f, -0.001254f, +0.005163f, +0.004876f, -0.000584f, +0.000034f, -0.000807f, -0.002142f, -0.000826f, +0.001267f, + -0.000129f, -0.000939f, -0.001272f, -0.005977f, +0.001942f, -0.003204f, +0.002999f, +0.001456f, +0.001019f, -0.005021f, + -0.002698f, +0.000546f, -0.001043f, -0.002666f, +0.000557f, +0.004607f, -0.002131f, +0.001743f, +0.000350f, +0.001437f, + +0.003162f, -0.000586f, -0.003587f, +0.002925f, -0.000674f, +0.001901f + }, + { + -0.047095f, -0.019605f, +0.014210f, -0.120858f, +0.018301f, -0.003081f, +0.018907f, +0.020715f, +0.002572f, -0.006477f, + +0.022225f, +0.018268f, +0.024605f, -0.002871f, +0.016229f, -0.006564f, -0.040384f, +0.001862f, +0.015513f, -0.000176f, + +0.002433f, -0.012120f, +0.003617f, -0.010129f, -0.017012f, -0.000795f, +0.016459f, +0.005284f, +0.008083f, +0.004913f, + -0.002000f, +0.000639f, -0.006234f, +0.008172f, -0.007034f, -0.002288f, +0.001749f, -0.002414f, +0.002026f, -0.002646f, + +0.007422f, -0.006335f, -0.010226f, -0.006639f, -0.000815f, -0.001892f, +0.011343f, -0.003888f, +0.001704f, -0.003794f, + +0.000454f, +0.005564f, -0.003489f, -0.004187f, -0.000194f, -0.003424f, -0.001533f, -0.000780f, +0.007501f, +0.002911f, + +0.003766f, -0.005933f, +0.002455f, -0.000935f, +0.007761f, -0.004065f, +0.003193f, +0.003202f, +0.001532f, -0.001251f, + -0.003241f, +0.003303f, -0.001441f, -0.001381f, +0.000430f, -0.001920f, -0.005193f, +0.001266f, -0.000073f, +0.000928f, + -0.002241f, +0.004837f, +0.003530f, +0.000561f, -0.004170f, +0.002001f, -0.001119f, +0.001028f, -0.001154f, -0.000245f, + +0.002385f, -0.000299f, -0.003522f, -0.000159f, -0.001342f, +0.002055f + }, + { + +0.003927f, +0.012470f, +0.018633f, +0.006862f, +0.007857f, +0.003618f, +0.003119f, +0.001381f, -0.008325f, -0.004769f, + +0.015878f, -0.005577f, +0.003322f, -0.011728f, +0.024688f, -0.012083f, +0.003489f, +0.008545f, +0.001509f, -0.008011f, + +0.027664f, -0.020469f, -0.012274f, -0.000082f, +0.000950f, +0.000896f, +0.020063f, +0.016069f, -0.001217f, -0.005550f, + -0.013962f, -0.035810f, +0.022017f, +0.007911f, +0.009201f, +0.002502f, +0.002428f, -0.005849f, -0.002528f, -0.017751f, + -0.014144f, +0.011233f, -0.005873f, +0.009757f, -0.013562f, -0.000050f, +0.008903f, -0.006824f, -0.005476f, -0.002527f, + +0.001849f, +0.001494f, -0.004062f, +0.001613f, +0.002268f, +0.006155f, +0.002955f, +0.002461f, +0.007114f, +0.004615f, + -0.004365f, -0.001641f, +0.004540f, +0.001667f, +0.002135f, -0.002787f, +0.000537f, -0.002298f, -0.007303f, +0.001015f, + +0.002983f, +0.000423f, -0.001753f, +0.002897f, +0.002928f, +0.000530f, +0.004274f, -0.002839f, +0.002154f, +0.001318f, + -0.001985f, +0.003042f, +0.002287f, +0.000190f, +0.002441f, +0.001279f, +0.000714f, +0.003729f, +0.003179f, +0.001303f, + -0.002948f, +0.000244f, -0.000051f, +0.000600f, -0.002970f, -0.002585f + }, + { + +0.021094f, +0.109210f, -0.010801f, -0.005859f, -0.048080f, +0.033520f, -0.053264f, +0.010095f, +0.009967f, -0.009075f, + +0.015103f, -0.037095f, +0.037896f, -0.001457f, -0.007560f, +0.016058f, +0.002087f, +0.013013f, -0.027807f, -0.003542f, + +0.005745f, +0.012415f, -0.029343f, +0.008735f, -0.011157f, +0.008473f, -0.004739f, -0.002531f, +0.006504f, +0.007217f, + -0.001643f, +0.010681f, -0.002963f, -0.019277f, +0.004010f, -0.003442f, +0.010339f, -0.002265f, +0.008639f, +0.004882f, + +0.001881f, -0.000524f, -0.003544f, -0.001300f, -0.001987f, -0.008004f, -0.004532f, +0.003039f, -0.003642f, -0.006475f, + +0.002590f, -0.002910f, -0.010248f, -0.000756f, +0.012939f, +0.004053f, -0.011463f, -0.000163f, +0.005958f, -0.006117f, + -0.008945f, -0.002991f, +0.006356f, -0.002336f, +0.002445f, -0.002954f, +0.001429f, +0.001487f, +0.000621f, -0.001004f, + +0.000240f, -0.003025f, -0.000899f, +0.000289f, -0.001469f, -0.002773f, -0.002336f, +0.001397f, +0.001934f, -0.002225f, + -0.000755f, +0.003344f, -0.002390f, +0.000901f, +0.002001f, +0.000203f, +0.004958f, -0.001297f, -0.001356f, +0.002230f, + -0.001725f, +0.002257f, +0.003687f, -0.000827f, +0.002392f, -0.002262f + }, + { + +0.004889f, -0.045313f, -0.007403f, -0.012042f, -0.011568f, +0.013553f, +0.029342f, -0.009097f, -0.010107f, +0.015361f, + +0.004130f, +0.009872f, -0.022202f, -0.022648f, -0.005795f, +0.003264f, +0.001827f, +0.001048f, +0.012650f, +0.033389f, + -0.024388f, -0.005967f, -0.014074f, -0.024573f, +0.005115f, +0.005731f, -0.009017f, -0.000928f, -0.024069f, +0.009385f, + -0.004483f, -0.005138f, +0.014834f, -0.020102f, +0.015108f, -0.004645f, -0.000800f, +0.008941f, +0.000889f, +0.002491f, + +0.002258f, +0.010001f, -0.000714f, -0.002381f, +0.001304f, +0.004666f, -0.001126f, +0.012467f, -0.008848f, -0.012454f, + +0.002479f, -0.000881f, -0.004290f, -0.002030f, -0.000626f, +0.002213f, -0.007529f, +0.013417f, +0.004146f, +0.000068f, + -0.006886f, -0.008880f, +0.002495f, +0.003935f, +0.003405f, +0.007842f, -0.003057f, +0.001910f, +0.001397f, +0.005005f, + +0.005276f, -0.000812f, +0.002605f, -0.004038f, +0.000494f, +0.001443f, +0.003533f, -0.004557f, +0.000787f, -0.004511f, + -0.000131f, -0.001530f, +0.003382f, +0.000338f, +0.001826f, +0.002607f, +0.002406f, -0.002812f, -0.002069f, -0.001231f, + -0.001602f, -0.000578f, +0.000947f, -0.000631f, +0.000300f, +0.002164f + }, + { + +0.005231f, +0.096164f, -0.011396f, +0.050536f, -0.001478f, +0.088358f, +0.000961f, -0.013783f, -0.012738f, -0.005145f, + +0.033288f, +0.002883f, -0.001647f, -0.027229f, +0.020317f, +0.006984f, -0.013050f, +0.025773f, +0.012132f, -0.032093f, + +0.015141f, +0.004651f, +0.004871f, +0.001208f, +0.007371f, +0.017493f, -0.000270f, +0.006188f, -0.014659f, +0.008060f, + +0.020651f, -0.015891f, -0.000382f, +0.011054f, -0.000167f, -0.000918f, +0.006822f, -0.011421f, +0.003856f, +0.005567f, + -0.009685f, +0.002359f, +0.006888f, +0.003420f, +0.000793f, +0.006159f, -0.013188f, -0.010433f, +0.000142f, +0.002770f, + -0.006878f, +0.001301f, +0.000134f, -0.003341f, -0.004849f, +0.000459f, -0.010712f, +0.002986f, +0.001985f, -0.000917f, + -0.001240f, +0.000817f, -0.003856f, -0.013526f, -0.003356f, +0.003162f, +0.003667f, +0.003846f, -0.000346f, +0.001624f, + +0.000535f, -0.001017f, +0.003294f, -0.003297f, -0.003177f, -0.002305f, +0.001505f, +0.000324f, -0.001367f, -0.001701f, + +0.001751f, +0.000707f, +0.000211f, +0.001792f, -0.000547f, +0.002399f, +0.002696f, -0.002645f, -0.003212f, +0.001512f, + +0.001137f, -0.000389f, +0.001043f, -0.001393f, -0.000461f, -0.003676f + }, + { + +0.002099f, +0.016961f, -0.001083f, +0.006998f, +0.004561f, -0.000160f, -0.009542f, -0.008957f, +0.009816f, -0.003172f, + +0.004321f, +0.008096f, -0.011614f, -0.016172f, -0.022024f, -0.013384f, +0.005818f, -0.013447f, -0.007520f, +0.008682f, + -0.003670f, +0.011688f, -0.004865f, -0.005644f, -0.005253f, -0.007411f, -0.010328f, -0.013306f, +0.012586f, -0.021896f, + +0.026987f, -0.020361f, -0.001053f, -0.007215f, -0.009466f, +0.008697f, -0.019511f, +0.013015f, +0.004057f, -0.010939f, + -0.007270f, -0.000246f, +0.000015f, +0.003725f, -0.005627f, +0.004481f, -0.012113f, -0.000328f, -0.002804f, +0.001359f, + -0.010681f, -0.002998f, -0.003274f, +0.011087f, +0.002736f, -0.000534f, +0.004410f, -0.000816f, -0.009257f, -0.002504f, + +0.001984f, +0.001278f, -0.007696f, -0.007453f, +0.002632f, -0.003568f, -0.001079f, +0.001204f, +0.002954f, +0.011587f, + -0.006705f, -0.000949f, +0.002216f, -0.001206f, -0.003596f, -0.000237f, -0.003265f, +0.002034f, -0.003746f, +0.000990f, + +0.004759f, -0.003392f, -0.000942f, -0.001971f, +0.001582f, -0.003095f, +0.002374f, +0.001586f, -0.000911f, -0.000340f, + +0.001018f, -0.001976f, +0.005427f, +0.000285f, +0.004020f, +0.002098f + }, + { + -0.016302f, +0.111112f, +0.000470f, +0.010864f, -0.004840f, +0.022265f, -0.017823f, +0.017966f, -0.030146f, +0.010664f, + +0.007787f, -0.035577f, -0.016543f, -0.022009f, -0.052696f, +0.005285f, +0.003989f, -0.002168f, -0.010443f, +0.010092f, + +0.018531f, -0.027793f, -0.002668f, -0.000427f, +0.006216f, -0.040175f, +0.000027f, -0.019295f, -0.007864f, +0.007775f, + -0.012829f, +0.014696f, -0.006157f, -0.010450f, +0.013101f, -0.002187f, -0.019518f, -0.006628f, +0.021263f, -0.010212f, + +0.004590f, -0.003803f, +0.007409f, +0.004278f, -0.000330f, +0.005942f, +0.013938f, -0.001966f, -0.002446f, -0.011981f, + +0.011082f, -0.006087f, -0.007964f, -0.005793f, -0.005808f, +0.007773f, -0.008484f, -0.001107f, +0.003654f, -0.011460f, + -0.000527f, -0.004662f, -0.000575f, -0.002474f, +0.001738f, +0.000711f, -0.002687f, -0.001426f, -0.002663f, +0.001950f, + -0.002605f, -0.003618f, +0.002808f, -0.003445f, +0.004061f, +0.000085f, -0.000708f, -0.002247f, -0.003317f, -0.001414f, + -0.001803f, +0.002368f, +0.003641f, -0.004524f, -0.000509f, -0.002846f, +0.000210f, -0.002284f, +0.000187f, -0.001426f, + -0.000983f, -0.000493f, -0.000908f, +0.000892f, -0.000676f, +0.000502f + }, + { + -0.004033f, -0.042596f, -0.005694f, +0.008063f, +0.005948f, +0.005432f, -0.000155f, +0.004573f, +0.014653f, +0.003541f, + +0.001223f, -0.009782f, +0.006197f, +0.035298f, +0.051110f, -0.014540f, +0.030617f, +0.001436f, -0.000438f, -0.019881f, + +0.019387f, -0.030330f, -0.001912f, -0.017187f, -0.002631f, +0.010121f, -0.004267f, -0.003137f, -0.018883f, -0.001382f, + +0.002048f, +0.006403f, +0.014332f, +0.000429f, +0.016878f, -0.001494f, -0.011769f, +0.001637f, -0.003971f, -0.002425f, + -0.006637f, +0.009059f, +0.002444f, +0.004620f, +0.002407f, +0.012470f, -0.004914f, -0.002762f, +0.009202f, -0.001525f, + +0.005691f, -0.003117f, -0.006800f, +0.016359f, -0.000435f, -0.008580f, -0.002316f, +0.004827f, +0.000399f, -0.000561f, + +0.010733f, +0.001117f, -0.001630f, +0.003334f, -0.004475f, +0.007383f, +0.007013f, -0.001124f, +0.004612f, -0.003173f, + -0.001875f, -0.004002f, +0.003015f, +0.002515f, -0.000718f, -0.001567f, -0.001971f, -0.000981f, -0.002229f, -0.001712f, + +0.004590f, +0.000154f, +0.002878f, -0.001622f, +0.004143f, +0.003339f, +0.001869f, -0.002963f, -0.001099f, +0.000489f, + -0.000266f, +0.000381f, +0.000172f, +0.004064f, +0.000135f, -0.000292f + } + }, + { + { + +0.035627f, +0.021743f, -0.057503f, +0.063878f, -0.000470f, -0.011304f, +0.000578f, +0.010713f, -0.012698f, +0.008712f, + -0.002364f, +0.012777f, -0.004770f, -0.002839f, -0.005940f, +0.000913f, +0.009290f, -0.014944f, +0.002643f, +0.016258f, + +0.013870f, +0.010998f, -0.006636f, +0.009533f, -0.009228f, -0.010645f, -0.001339f, +0.006728f, -0.016926f, -0.008348f, + +0.006218f, -0.001313f, -0.001741f, +0.005780f, +0.002803f, +0.006911f, -0.005680f, +0.016182f, +0.000226f, +0.001555f, + +0.002349f, -0.003205f, +0.001965f, -0.003081f, +0.007217f, -0.005426f, +0.000030f, -0.007613f, +0.006725f, -0.002577f, + +0.001100f, +0.004742f, +0.000547f, -0.005720f, +0.003179f, -0.006785f, -0.001622f, -0.002969f, -0.002543f, -0.006865f, + +0.002730f, -0.000353f, -0.006742f, -0.001734f, -0.001896f, +0.001917f, -0.002944f, -0.005518f, -0.004953f, +0.002183f, + -0.003621f, +0.001952f, -0.000743f, -0.003592f, -0.001374f, -0.003517f, -0.003063f, -0.001404f, -0.000711f, -0.001550f, + -0.002213f, +0.000350f, -0.001991f, +0.001089f, +0.001842f, -0.002101f, -0.000032f, -0.001995f, +0.000905f, +0.002217f, + +0.000615f, -0.000634f, +0.000079f, +0.000510f, +0.003911f, +0.001606f + }, + { + +0.001084f, -0.065150f, -0.004528f, +0.059389f, +0.013398f, -0.004236f, +0.006625f, +0.011157f, +0.003558f, +0.012268f, + -0.027537f, -0.018114f, +0.006241f, -0.014299f, -0.012084f, +0.012202f, -0.024446f, -0.012268f, +0.019218f, -0.029043f, + -0.000679f, +0.009024f, -0.025699f, -0.010519f, +0.009855f, -0.008044f, +0.013048f, -0.010637f, +0.005490f, +0.004362f, + -0.000005f, +0.001154f, -0.002006f, +0.013096f, -0.003430f, -0.011650f, +0.005552f, -0.005331f, -0.003911f, +0.008029f, + +0.000414f, +0.006176f, +0.007665f, -0.004849f, -0.003499f, +0.014446f, +0.003257f, -0.000676f, -0.005467f, -0.000339f, + +0.003254f, -0.000963f, -0.011645f, +0.005497f, +0.003001f, -0.004148f, -0.003199f, -0.006848f, -0.002749f, -0.003831f, + +0.002511f, -0.000649f, +0.000067f, +0.002507f, +0.002373f, -0.000414f, +0.000511f, +0.002354f, +0.004771f, -0.004237f, + -0.003030f, +0.002534f, +0.002113f, -0.004688f, +0.000213f, -0.000723f, -0.005646f, +0.000665f, +0.002084f, +0.000119f, + +0.002657f, +0.002220f, +0.003689f, -0.001431f, +0.001369f, -0.002130f, +0.002426f, -0.000388f, -0.003805f, +0.004136f, + -0.000626f, +0.000817f, +0.000317f, -0.001073f, +0.000105f, -0.002505f + }, + { + -0.006460f, +0.117666f, +0.019048f, -0.101531f, +0.006772f, +0.005211f, -0.007228f, -0.007400f, +0.007386f, -0.004909f, + +0.014141f, +0.000117f, -0.046484f, +0.028207f, -0.011268f, +0.012091f, -0.000930f, -0.008020f, -0.033178f, -0.024641f, + -0.008079f, +0.002849f, +0.006477f, +0.003834f, +0.025433f, +0.008803f, +0.012950f, +0.002266f, -0.003938f, -0.009992f, + -0.001664f, -0.005263f, -0.004103f, -0.030306f, +0.017809f, -0.013018f, +0.000020f, -0.012335f, -0.006712f, +0.001690f, + +0.004042f, -0.002410f, +0.006612f, +0.006584f, -0.000594f, +0.005843f, -0.012849f, +0.004425f, -0.001595f, +0.004607f, + -0.006444f, +0.009319f, -0.008025f, -0.000238f, +0.001356f, +0.007099f, +0.003572f, +0.001623f, -0.004345f, +0.002013f, + -0.000202f, -0.008872f, -0.002352f, +0.004115f, -0.008714f, -0.003840f, +0.003840f, -0.001575f, -0.001811f, +0.003172f, + -0.004191f, -0.000876f, -0.000064f, +0.000752f, -0.001638f, +0.001093f, -0.002528f, -0.001277f, -0.001420f, +0.003256f, + +0.000956f, +0.004452f, +0.004056f, -0.002234f, -0.000335f, +0.000369f, +0.000527f, +0.000364f, -0.000431f, -0.000267f, + -0.000955f, -0.001645f, -0.001350f, -0.000241f, -0.000067f, +0.001901f + }, + { + +0.012138f, +0.041205f, +0.017162f, +0.053880f, -0.009240f, +0.004817f, +0.001200f, -0.011796f, +0.008912f, -0.024276f, + -0.017892f, +0.020567f, -0.010395f, +0.002654f, -0.003121f, +0.011619f, -0.010826f, +0.026363f, -0.001753f, -0.019469f, + +0.007870f, +0.001925f, -0.004387f, +0.016956f, -0.005694f, -0.026529f, +0.008438f, +0.023475f, +0.016637f, +0.001305f, + +0.013755f, +0.005799f, -0.002516f, +0.014257f, +0.014907f, -0.004568f, -0.003873f, +0.003930f, -0.005959f, -0.003041f, + +0.001946f, +0.009858f, -0.000535f, +0.005379f, -0.004202f, -0.002764f, -0.011294f, +0.003505f, +0.006149f, +0.003761f, + -0.003302f, +0.006338f, -0.004573f, +0.001976f, -0.011709f, +0.002647f, +0.005087f, -0.003149f, -0.000770f, -0.001507f, + +0.005090f, -0.006467f, +0.003416f, -0.001106f, +0.003398f, +0.002530f, -0.001852f, +0.007380f, -0.005112f, -0.000859f, + -0.002417f, +0.002934f, +0.000018f, +0.002805f, +0.002297f, -0.004689f, +0.001378f, +0.001939f, -0.001357f, -0.000828f, + -0.003461f, +0.002609f, -0.005677f, -0.004784f, -0.002659f, -0.001735f, -0.002085f, +0.001212f, -0.000357f, +0.000101f, + +0.000369f, +0.001353f, +0.001191f, -0.000076f, +0.001403f, -0.001020f + }, + { + -0.000072f, +0.065969f, -0.005826f, +0.001688f, +0.010309f, +0.000823f, -0.001337f, +0.004140f, +0.008504f, +0.004106f, + +0.003419f, -0.007697f, -0.004082f, +0.013565f, +0.070497f, -0.006490f, +0.023018f, -0.005885f, +0.015200f, +0.001296f, + +0.003775f, +0.006821f, -0.014247f, +0.007368f, -0.004947f, +0.026761f, +0.016408f, +0.003692f, +0.008307f, -0.009832f, + -0.011521f, -0.008632f, -0.002472f, -0.001753f, -0.028831f, +0.002536f, +0.000728f, -0.000312f, -0.005459f, -0.016419f, + +0.000383f, -0.000607f, +0.004194f, +0.008120f, -0.005047f, -0.003283f, +0.008587f, -0.009235f, +0.002837f, +0.001189f, + +0.007266f, -0.004271f, -0.003968f, -0.008782f, -0.002782f, -0.004456f, +0.006786f, +0.005560f, -0.000895f, -0.003823f, + -0.002894f, +0.005331f, -0.008074f, -0.003500f, +0.003240f, +0.003604f, -0.005138f, +0.000170f, +0.001497f, +0.002099f, + +0.000484f, +0.000946f, -0.005419f, -0.001273f, -0.005328f, +0.000373f, -0.000927f, -0.004137f, +0.000519f, +0.001193f, + +0.003667f, +0.000682f, +0.001536f, -0.000515f, -0.001859f, -0.004426f, +0.001180f, +0.002015f, -0.001507f, +0.000607f, + +0.001189f, -0.000103f, +0.001132f, +0.000748f, -0.002508f, -0.000546f + }, + { + +0.008160f, +0.137007f, -0.012250f, -0.044187f, -0.022356f, +0.001619f, +0.005927f, -0.015614f, +0.007385f, -0.001668f, + +0.043021f, +0.000105f, +0.008550f, +0.028832f, +0.014407f, +0.005161f, -0.020462f, -0.013055f, -0.009159f, +0.000858f, + +0.014991f, +0.004549f, +0.003767f, -0.000911f, +0.002056f, -0.004866f, -0.014643f, +0.012359f, +0.010831f, +0.005501f, + -0.006176f, -0.007143f, -0.004813f, -0.005766f, +0.001650f, +0.007948f, +0.002321f, -0.012199f, -0.014137f, -0.002501f, + -0.000518f, +0.007733f, -0.004478f, -0.011913f, +0.003337f, -0.008622f, -0.004109f, +0.004545f, +0.000906f, -0.007856f, + +0.006133f, +0.001110f, -0.000865f, -0.000469f, +0.007648f, -0.001233f, +0.002310f, -0.002408f, +0.003027f, -0.000574f, + -0.003627f, +0.006340f, -0.006595f, -0.000713f, +0.002906f, -0.001564f, -0.000362f, -0.002536f, -0.002991f, +0.001822f, + -0.000825f, -0.000504f, +0.006804f, +0.001631f, +0.002278f, -0.002368f, +0.000884f, +0.002075f, +0.001205f, -0.003353f, + -0.001300f, -0.001014f, +0.000481f, +0.000793f, -0.001576f, -0.000004f, -0.001295f, +0.000117f, -0.000336f, -0.001610f, + +0.000218f, +0.001071f, +0.000786f, -0.000469f, +0.001522f, +0.001565f + }, + { + +0.000379f, -0.019133f, +0.019563f, +0.003115f, -0.003087f, +0.001710f, +0.003417f, -0.001238f, -0.005409f, -0.001743f, + +0.009785f, -0.008282f, -0.002622f, -0.007961f, -0.028312f, -0.019302f, +0.014212f, +0.031372f, -0.010867f, +0.007242f, + -0.013889f, -0.018726f, +0.010889f, +0.049056f, +0.013724f, -0.010920f, -0.017435f, +0.005112f, +0.005673f, -0.011144f, + -0.000237f, -0.008488f, +0.005985f, -0.000593f, +0.006801f, -0.006141f, -0.003153f, +0.010485f, +0.002363f, -0.019312f, + -0.001349f, -0.012960f, -0.013766f, +0.003473f, +0.003574f, -0.012136f, -0.004534f, -0.000712f, -0.007583f, +0.007815f, + -0.003277f, -0.004980f, +0.010099f, -0.000518f, -0.003968f, -0.004207f, +0.002279f, +0.004972f, -0.007151f, +0.009151f, + +0.004567f, +0.002973f, +0.006386f, +0.007291f, -0.002601f, -0.001119f, +0.001074f, +0.004031f, -0.001039f, -0.004087f, + -0.000906f, -0.003122f, -0.000182f, +0.000812f, +0.002236f, -0.004683f, +0.002866f, +0.000406f, +0.002329f, +0.001022f, + +0.002908f, +0.000815f, -0.000346f, -0.000735f, -0.000193f, +0.003263f, +0.000294f, +0.003661f, -0.001030f, -0.002798f, + +0.003344f, +0.001748f, -0.001174f, +0.004531f, -0.001814f, -0.000649f + }, + { + +0.059943f, +0.118450f, -0.007210f, -0.134809f, +0.010731f, -0.014956f, +0.002794f, +0.006619f, -0.010073f, +0.004193f, + +0.007543f, -0.020996f, +0.031158f, +0.013216f, +0.015099f, +0.004390f, -0.008793f, +0.017922f, +0.026176f, +0.015178f, + +0.009648f, +0.001257f, +0.024393f, -0.000902f, -0.010373f, +0.007946f, +0.003735f, -0.002452f, -0.003885f, -0.012821f, + -0.001971f, +0.006376f, +0.001461f, +0.021567f, -0.004126f, -0.002990f, -0.003257f, -0.001948f, +0.003934f, -0.005303f, + +0.006791f, -0.003524f, +0.000636f, -0.003024f, +0.009784f, +0.008287f, +0.011191f, -0.000789f, +0.008570f, +0.002402f, + +0.000996f, -0.002525f, -0.011062f, -0.000070f, +0.004834f, -0.002461f, -0.000171f, -0.002639f, +0.007575f, +0.007267f, + +0.007547f, -0.004310f, +0.003791f, +0.000977f, +0.001675f, -0.004689f, +0.004791f, +0.002906f, +0.000828f, -0.001732f, + -0.002295f, +0.003365f, -0.000290f, +0.001122f, +0.003411f, -0.002049f, -0.008182f, -0.000379f, +0.000705f, +0.003289f, + -0.003642f, +0.001261f, +0.001785f, -0.001149f, -0.004478f, +0.002755f, -0.001343f, +0.001961f, +0.000620f, -0.001488f, + -0.000825f, +0.000902f, +0.000329f, +0.001035f, -0.002529f, -0.000725f + }, + { + -0.000444f, -0.028747f, +0.005351f, -0.007735f, -0.008795f, -0.002489f, +0.001477f, +0.002185f, -0.012162f, +0.000120f, + +0.024032f, -0.011224f, -0.000478f, -0.001434f, +0.038199f, -0.010563f, -0.013573f, +0.000960f, +0.011037f, -0.006684f, + +0.009869f, -0.023114f, -0.002065f, +0.016201f, +0.002470f, -0.009813f, +0.024844f, +0.008963f, +0.005088f, +0.011645f, + +0.004915f, -0.044968f, +0.007646f, +0.010785f, -0.004263f, -0.011263f, +0.009875f, -0.008884f, -0.007533f, -0.013450f, + -0.006071f, +0.006553f, -0.009530f, +0.010603f, -0.001732f, +0.008835f, +0.007032f, -0.003715f, +0.002151f, +0.003850f, + +0.002372f, +0.000327f, -0.002155f, -0.001286f, -0.000137f, +0.008126f, -0.001361f, -0.001845f, -0.000148f, +0.005014f, + -0.001636f, -0.004584f, +0.002203f, +0.003759f, -0.000451f, -0.003776f, +0.003867f, +0.000681f, -0.001708f, +0.006114f, + +0.002718f, +0.001344f, -0.002985f, +0.002070f, +0.003663f, -0.005473f, -0.000087f, -0.004066f, +0.000342f, -0.001756f, + -0.001930f, +0.001399f, -0.001214f, +0.000193f, +0.003190f, -0.002201f, -0.001322f, +0.002757f, -0.000905f, +0.000352f, + -0.001031f, -0.001485f, -0.000967f, +0.000862f, -0.004241f, -0.002370f + }, + { + -0.028101f, +0.135716f, +0.081754f, -0.006248f, -0.036348f, +0.095430f, +0.026563f, +0.025470f, -0.052790f, -0.018392f, + +0.040752f, -0.016205f, +0.043892f, -0.021306f, -0.032697f, +0.012581f, +0.003219f, +0.017471f, -0.005370f, +0.004735f, + -0.015563f, +0.004056f, -0.021578f, +0.000843f, -0.021998f, +0.006499f, -0.004268f, +0.013498f, +0.010944f, +0.006646f, + +0.012944f, +0.019434f, -0.009323f, -0.009221f, +0.006360f, -0.004686f, +0.015153f, +0.003347f, +0.011596f, -0.002125f, + -0.011474f, -0.009195f, +0.000944f, +0.009177f, +0.004608f, +0.000435f, +0.002773f, -0.001639f, -0.012633f, -0.001877f, + +0.013804f, +0.003442f, -0.005611f, -0.005412f, +0.001763f, +0.005250f, -0.001596f, -0.004337f, +0.007514f, -0.002137f, + -0.006085f, +0.002076f, +0.007111f, -0.003154f, +0.008924f, +0.004018f, -0.001990f, -0.003655f, +0.001020f, +0.003215f, + +0.003980f, +0.000022f, -0.003767f, -0.002606f, -0.000256f, +0.001146f, -0.005026f, -0.002185f, +0.000608f, -0.000248f, + +0.003521f, +0.003215f, -0.000888f, +0.003233f, +0.001420f, -0.001274f, +0.004048f, -0.002511f, -0.002307f, +0.003267f, + -0.000131f, +0.002169f, +0.000546f, -0.002051f, +0.001520f, -0.003074f + }, + { + -0.006195f, -0.010684f, +0.024593f, -0.015765f, -0.008825f, -0.021902f, -0.003906f, -0.004407f, -0.014068f, +0.012638f, + +0.003517f, -0.016418f, -0.025683f, +0.010327f, +0.017043f, +0.003897f, -0.006186f, -0.014685f, -0.011371f, +0.022395f, + -0.015591f, -0.019065f, -0.023817f, -0.013409f, +0.010387f, +0.020142f, +0.024266f, +0.020436f, -0.016139f, +0.026755f, + +0.004513f, -0.003583f, +0.011623f, -0.013453f, +0.009455f, -0.013671f, -0.000916f, +0.005490f, -0.002118f, -0.001068f, + -0.004824f, +0.004366f, -0.004672f, -0.004133f, -0.001353f, +0.001747f, -0.001252f, +0.011903f, -0.004534f, -0.016299f, + +0.003909f, +0.005907f, -0.002100f, -0.001742f, -0.001668f, +0.005998f, -0.007661f, +0.003548f, -0.001143f, -0.001992f, + -0.002802f, -0.003872f, -0.000682f, -0.003060f, -0.002707f, +0.006395f, +0.000759f, +0.003367f, -0.000728f, +0.005302f, + +0.004284f, -0.005143f, -0.001713f, -0.004957f, +0.002378f, +0.001287f, +0.002928f, -0.006515f, +0.001711f, -0.002370f, + -0.000504f, -0.000288f, +0.003835f, +0.000228f, +0.000127f, -0.000268f, +0.001805f, +0.001372f, +0.003776f, -0.000948f, + -0.001984f, -0.003794f, -0.000870f, +0.000901f, -0.002037f, +0.000513f + }, + { + -0.035156f, +0.082381f, -0.007192f, +0.023758f, +0.028769f, +0.070458f, -0.018135f, -0.007625f, +0.000740f, -0.016695f, + +0.007518f, -0.009644f, +0.006163f, -0.014044f, +0.032828f, +0.027967f, -0.041132f, -0.006465f, +0.011398f, -0.025819f, + +0.027894f, +0.016077f, +0.008547f, -0.015558f, +0.004245f, +0.020334f, -0.005699f, +0.000631f, -0.013165f, -0.008657f, + -0.001430f, -0.002925f, +0.011088f, +0.005166f, -0.001221f, -0.000411f, +0.002869f, -0.015287f, +0.002958f, +0.014648f, + -0.002605f, -0.000644f, +0.010302f, -0.000632f, -0.014130f, -0.009542f, -0.013371f, +0.002052f, +0.004135f, +0.001397f, + -0.005552f, -0.002474f, +0.000068f, +0.002865f, +0.003043f, +0.005342f, -0.010353f, +0.001413f, -0.001636f, +0.001748f, + +0.002948f, -0.001520f, -0.002029f, -0.006920f, -0.001663f, -0.002190f, +0.001351f, +0.002852f, -0.002733f, +0.001291f, + +0.000120f, -0.002472f, +0.003381f, -0.001553f, -0.003204f, +0.001001f, +0.004116f, -0.001374f, +0.004965f, +0.005774f, + +0.004429f, +0.002397f, -0.002287f, -0.000841f, +0.000337f, +0.000714f, +0.000853f, +0.001075f, +0.000308f, +0.003230f, + -0.000536f, -0.001749f, +0.002358f, -0.002804f, -0.002143f, -0.002659f + }, + { + -0.001102f, +0.052149f, +0.013830f, -0.009791f, +0.002650f, -0.005788f, -0.010909f, -0.010501f, +0.010921f, +0.000316f, + -0.007347f, -0.012192f, +0.014784f, +0.041891f, -0.009557f, +0.001676f, +0.001036f, -0.017636f, -0.005825f, +0.011814f, + -0.010077f, +0.006636f, +0.007560f, +0.018880f, +0.015673f, +0.000076f, -0.015025f, -0.006017f, +0.043834f, -0.016800f, + +0.018092f, -0.028636f, -0.007807f, +0.003917f, -0.001387f, +0.024199f, -0.013745f, +0.001989f, +0.006130f, -0.000043f, + -0.006087f, -0.012441f, -0.003678f, +0.010491f, -0.008095f, -0.006335f, -0.011917f, +0.000524f, -0.002364f, +0.008216f, + -0.000281f, +0.007511f, -0.004025f, +0.007263f, +0.001106f, +0.000667f, +0.010133f, +0.000875f, -0.010775f, -0.001158f, + +0.002919f, +0.004408f, -0.000223f, -0.000210f, +0.002808f, -0.000671f, +0.005682f, +0.000047f, -0.005679f, +0.001836f, + -0.007640f, +0.001936f, +0.002934f, +0.002454f, +0.000936f, +0.000354f, -0.003470f, +0.001869f, -0.007628f, -0.002141f, + +0.001198f, -0.004855f, -0.001947f, -0.001119f, +0.004769f, +0.000304f, +0.004004f, +0.005092f, +0.001930f, -0.001381f, + -0.000330f, -0.001477f, +0.004492f, -0.002756f, -0.000043f, +0.001780f + }, + { + -0.007286f, +0.138256f, +0.001569f, +0.022052f, +0.007395f, -0.019211f, -0.029794f, +0.027372f, -0.021379f, +0.021731f, + +0.032455f, -0.003771f, +0.011393f, +0.005595f, -0.023936f, -0.010452f, +0.019986f, +0.042135f, +0.011493f, +0.000199f, + -0.001079f, -0.036995f, +0.004050f, +0.006428f, +0.006406f, -0.026376f, +0.005133f, -0.016725f, -0.002105f, -0.010297f, + -0.035694f, +0.014149f, +0.006867f, +0.000724f, -0.011836f, -0.014651f, -0.005579f, +0.005432f, +0.019092f, -0.004424f, + +0.011182f, -0.002291f, +0.001656f, -0.004534f, -0.007170f, -0.016375f, -0.008548f, -0.002134f, +0.004954f, -0.007495f, + +0.006130f, -0.008485f, +0.005251f, +0.000818f, -0.006871f, -0.002835f, -0.007927f, +0.003806f, +0.005494f, -0.009266f, + +0.002010f, +0.002182f, +0.005652f, +0.002900f, +0.005517f, +0.005092f, +0.003164f, +0.000699f, -0.000936f, +0.002769f, + -0.001564f, +0.001562f, +0.010379f, -0.002196f, +0.002611f, +0.000932f, +0.003128f, +0.000610f, -0.001313f, -0.000744f, + -0.004606f, -0.000844f, +0.001575f, -0.003611f, +0.002268f, -0.003474f, +0.000138f, -0.001967f, +0.003292f, -0.000134f, + +0.000105f, +0.003025f, +0.000920f, +0.003842f, +0.000669f, +0.000904f + }, + { + +0.003085f, -0.047474f, -0.018505f, +0.027460f, +0.011030f, -0.002077f, -0.005108f, -0.002905f, +0.013924f, -0.006249f, + +0.004895f, -0.002049f, -0.002519f, -0.060940f, -0.069184f, -0.027258f, +0.024663f, +0.004364f, +0.005436f, -0.006354f, + +0.012780f, -0.036421f, +0.001264f, -0.022856f, +0.002249f, +0.017474f, +0.007471f, +0.001937f, -0.021662f, -0.007709f, + -0.011250f, -0.006649f, -0.005449f, -0.017786f, +0.013088f, +0.014624f, +0.011969f, +0.010169f, +0.000333f, +0.002884f, + +0.001169f, +0.011842f, +0.002448f, +0.007828f, +0.001838f, +0.005059f, -0.004362f, -0.002764f, +0.007143f, -0.002784f, + +0.008748f, +0.010633f, -0.002623f, +0.008499f, -0.003901f, -0.001676f, +0.003527f, +0.004443f, +0.001655f, +0.001309f, + +0.006870f, +0.004320f, +0.002250f, +0.002095f, -0.012357f, -0.004355f, +0.004136f, -0.007626f, +0.004255f, +0.001673f, + -0.000006f, -0.003313f, +0.002068f, +0.000736f, -0.003818f, -0.002125f, -0.000816f, -0.001310f, -0.004738f, -0.002395f, + +0.007270f, +0.002349f, +0.001767f, -0.004051f, +0.004626f, +0.002922f, +0.003021f, -0.002618f, -0.001119f, +0.003132f, + -0.000240f, -0.002281f, +0.001324f, +0.003439f, -0.001870f, -0.000269f + } + }, + { + { + -0.033384f, -0.090919f, +0.076209f, +0.014265f, +0.037782f, -0.006125f, +0.014221f, +0.012653f, -0.012667f, +0.007782f, + -0.022731f, +0.014800f, -0.001583f, +0.001665f, +0.001585f, -0.011695f, -0.000916f, -0.018865f, +0.017902f, +0.012907f, + +0.018249f, -0.007170f, +0.004079f, +0.006243f, -0.002570f, -0.003843f, -0.015944f, +0.001192f, +0.003602f, -0.007585f, + +0.003982f, +0.006289f, -0.015347f, +0.006153f, +0.012275f, -0.000278f, +0.011638f, -0.005116f, +0.010031f, -0.000902f, + -0.014082f, +0.005345f, +0.012780f, -0.002354f, -0.000847f, -0.000504f, -0.006290f, -0.003430f, +0.004775f, +0.010561f, + -0.007131f, +0.006382f, +0.004231f, -0.001222f, -0.004904f, -0.001768f, +0.001185f, -0.005644f, -0.001607f, +0.001423f, + -0.001653f, -0.008994f, +0.002236f, -0.004637f, +0.003200f, -0.001089f, -0.002740f, -0.004852f, -0.002458f, +0.000667f, + +0.000315f, -0.002280f, +0.000116f, -0.006984f, -0.002660f, -0.000494f, -0.002950f, -0.003222f, +0.000341f, +0.000059f, + -0.004176f, +0.000529f, -0.002962f, +0.003464f, -0.000330f, +0.000063f, +0.000905f, -0.004596f, +0.003403f, +0.001404f, + +0.000656f, -0.002191f, -0.000712f, +0.002922f, +0.001490f, +0.002631f + }, + { + +0.000743f, -0.093825f, +0.008105f, +0.066181f, +0.016102f, -0.004066f, +0.005057f, +0.006357f, +0.007547f, +0.017208f, + -0.042104f, -0.009682f, -0.009616f, +0.009367f, -0.007044f, -0.010676f, -0.000409f, -0.006835f, +0.008297f, -0.022817f, + +0.006892f, +0.004818f, -0.047828f, -0.016447f, +0.030002f, +0.002941f, -0.002377f, +0.003555f, -0.020401f, +0.005751f, + +0.002704f, +0.003077f, +0.013027f, -0.009249f, +0.000570f, +0.004671f, -0.008061f, +0.001567f, -0.009416f, +0.002484f, + +0.012838f, -0.000237f, +0.006288f, -0.003439f, +0.004469f, -0.004277f, +0.007186f, -0.000592f, -0.003471f, +0.001473f, + +0.001283f, +0.000254f, -0.008863f, +0.002641f, -0.003012f, +0.000699f, +0.001104f, -0.013242f, +0.000135f, -0.001465f, + -0.002090f, +0.000443f, +0.000320f, -0.000174f, -0.001753f, +0.003665f, +0.002494f, -0.000623f, +0.002761f, +0.003052f, + -0.003403f, -0.001553f, +0.003298f, -0.001375f, +0.000087f, -0.005808f, -0.003103f, -0.001646f, +0.001535f, +0.002601f, + -0.000502f, +0.004884f, +0.000219f, +0.001472f, +0.000827f, -0.000386f, -0.002437f, -0.000357f, +0.001597f, +0.001282f, + -0.002647f, +0.001826f, -0.000203f, +0.000667f, -0.001181f, -0.002687f + }, + { + +0.002922f, +0.181320f, -0.025801f, -0.070873f, -0.021801f, -0.000029f, +0.003313f, -0.020183f, +0.009913f, -0.005646f, + -0.004386f, +0.019833f, -0.024647f, +0.018078f, -0.001673f, +0.005539f, -0.011743f, -0.002091f, -0.040346f, -0.014051f, + -0.028673f, +0.019773f, +0.000637f, +0.017396f, +0.016778f, +0.003656f, +0.017330f, -0.005021f, +0.001191f, -0.006942f, + +0.004691f, -0.004600f, -0.013148f, -0.021962f, -0.004876f, +0.009498f, -0.016489f, +0.000760f, -0.008093f, -0.001811f, + -0.000324f, -0.000197f, +0.010907f, -0.001519f, +0.007372f, -0.001075f, -0.009576f, -0.000971f, +0.005473f, -0.003936f, + +0.005425f, +0.004939f, -0.006322f, -0.001251f, +0.001492f, +0.003121f, +0.010324f, -0.002746f, -0.004122f, -0.000455f, + +0.003321f, -0.008147f, -0.003189f, -0.006314f, -0.000775f, -0.000358f, +0.002181f, -0.002648f, -0.002126f, +0.003821f, + -0.001439f, -0.002216f, -0.002548f, -0.003320f, +0.003456f, +0.001970f, -0.001370f, -0.005198f, +0.002269f, +0.000685f, + +0.002932f, +0.002121f, +0.004861f, -0.000000f, -0.001649f, -0.000347f, +0.004001f, -0.000723f, +0.000917f, -0.003242f, + -0.000635f, -0.001693f, +0.000021f, -0.002498f, -0.000090f, +0.003002f + }, + { + +0.009907f, +0.039665f, -0.005417f, +0.046443f, +0.030165f, -0.000266f, -0.002086f, -0.010348f, +0.009983f, -0.019788f, + -0.000813f, -0.006663f, -0.000671f, -0.007462f, -0.012213f, -0.000442f, +0.018752f, -0.003648f, +0.012138f, -0.001729f, + -0.008227f, +0.003118f, +0.031107f, -0.007017f, +0.001284f, -0.018558f, +0.020093f, +0.009103f, +0.027433f, -0.012597f, + +0.004487f, +0.016262f, -0.006158f, +0.012664f, +0.005746f, +0.010495f, -0.013271f, +0.002833f, -0.012060f, +0.002417f, + -0.003508f, +0.013540f, +0.008664f, -0.000247f, -0.008929f, +0.003754f, -0.014545f, +0.005897f, +0.003134f, -0.001329f, + +0.006686f, -0.002399f, +0.000413f, -0.003408f, -0.009597f, -0.000166f, +0.007559f, -0.000891f, -0.007031f, +0.008006f, + -0.001195f, -0.005710f, +0.005656f, +0.005255f, -0.004411f, -0.000236f, +0.007200f, -0.000660f, -0.005209f, +0.002669f, + -0.001875f, -0.005077f, +0.007556f, -0.000320f, +0.001484f, -0.002269f, +0.001051f, +0.002355f, -0.003258f, -0.000138f, + +0.001277f, -0.000059f, -0.004572f, -0.005612f, -0.002019f, -0.002677f, +0.001041f, -0.001556f, +0.002293f, -0.001531f, + -0.001350f, +0.000696f, +0.003581f, +0.002252f, -0.000986f, -0.001924f + }, + { + -0.000785f, +0.058943f, +0.003867f, +0.013770f, +0.001064f, +0.002213f, -0.000454f, +0.001633f, +0.012213f, -0.000812f, + +0.003472f, -0.010267f, +0.008939f, -0.019387f, +0.061263f, +0.051244f, +0.012945f, +0.010989f, -0.020093f, +0.003372f, + +0.006151f, +0.005013f, -0.007533f, -0.001464f, +0.011470f, +0.028338f, -0.001849f, +0.000204f, +0.008343f, -0.022312f, + +0.009034f, +0.000066f, +0.000755f, -0.007352f, -0.026163f, -0.000219f, +0.000331f, -0.003273f, +0.002311f, -0.010111f, + -0.003762f, +0.004954f, -0.006129f, +0.014016f, +0.000963f, -0.012736f, +0.004611f, +0.002340f, -0.005118f, +0.004882f, + +0.001915f, -0.006472f, -0.003726f, -0.008154f, -0.000301f, -0.005819f, +0.011052f, -0.002470f, -0.000797f, -0.002647f, + +0.000208f, +0.001803f, -0.004480f, -0.002211f, +0.001581f, +0.006338f, +0.000820f, -0.009383f, +0.004841f, -0.002025f, + -0.001815f, +0.002705f, -0.004122f, -0.003346f, -0.002256f, -0.004280f, +0.000630f, -0.001815f, +0.000149f, +0.002474f, + +0.003666f, -0.002775f, -0.000244f, +0.000708f, -0.002387f, -0.002961f, +0.000808f, +0.001511f, -0.002023f, +0.000240f, + +0.001502f, +0.000034f, +0.001912f, -0.001277f, -0.001432f, -0.000721f + }, + { + +0.029665f, +0.096117f, -0.006150f, -0.076763f, +0.016247f, -0.008852f, -0.000701f, -0.018044f, +0.032019f, +0.004577f, + +0.025381f, -0.010916f, +0.022943f, +0.024800f, +0.005975f, +0.002064f, -0.007182f, -0.014421f, -0.011523f, -0.007821f, + +0.024824f, +0.010256f, -0.009417f, +0.015161f, -0.013384f, -0.009441f, -0.009827f, +0.012980f, +0.006193f, +0.014430f, + -0.009609f, -0.012480f, +0.001595f, -0.001600f, -0.003546f, +0.010076f, -0.001215f, -0.011366f, -0.005606f, -0.004076f, + +0.003076f, -0.000959f, -0.001520f, -0.022052f, +0.008680f, -0.009407f, +0.002819f, -0.001992f, +0.002076f, +0.002267f, + -0.002568f, +0.006523f, -0.001530f, +0.004121f, -0.000881f, +0.000722f, +0.000590f, +0.002153f, +0.005602f, -0.003352f, + -0.003015f, +0.007669f, -0.005485f, -0.002756f, +0.000992f, +0.003985f, -0.003780f, -0.004425f, -0.002687f, -0.000465f, + -0.000666f, +0.002685f, +0.002297f, +0.005255f, -0.002210f, +0.002038f, -0.000339f, +0.002190f, -0.001664f, -0.002615f, + -0.003160f, -0.000321f, -0.000473f, +0.003393f, -0.001557f, -0.002589f, -0.000979f, +0.000059f, -0.002469f, -0.001605f, + +0.001899f, +0.000874f, -0.000517f, -0.000304f, +0.002147f, +0.001306f + }, + { + -0.000704f, +0.012398f, -0.001063f, +0.000171f, -0.000996f, +0.002364f, -0.000769f, -0.003539f, -0.004620f, +0.009647f, + +0.000218f, -0.010955f, +0.000239f, -0.010258f, -0.041146f, -0.008470f, +0.024625f, +0.026816f, -0.004311f, -0.016187f, + -0.020071f, -0.004111f, +0.018284f, +0.011707f, +0.040379f, -0.018562f, -0.022550f, +0.011764f, -0.004110f, +0.002780f, + +0.008957f, -0.016405f, -0.000859f, +0.008924f, -0.004116f, +0.002443f, -0.000795f, +0.012742f, -0.003284f, -0.005843f, + -0.000357f, -0.022608f, -0.010110f, +0.008095f, +0.000424f, -0.007244f, -0.007159f, -0.009003f, +0.007439f, -0.004240f, + +0.000560f, +0.002282f, -0.002558f, +0.004190f, -0.004050f, +0.002320f, -0.001203f, +0.000015f, -0.002597f, +0.008466f, + +0.005142f, +0.001857f, +0.004742f, +0.009350f, -0.003076f, -0.004371f, +0.006115f, +0.003500f, -0.004032f, -0.001567f, + -0.000406f, -0.001053f, -0.001253f, +0.002062f, +0.000407f, -0.003786f, +0.001782f, +0.001645f, -0.000613f, +0.001680f, + +0.005139f, +0.001700f, -0.002457f, +0.001929f, +0.000174f, -0.001344f, +0.003419f, +0.001899f, -0.000206f, -0.004214f, + +0.002957f, +0.001981f, +0.002079f, +0.001983f, +0.000363f, -0.003547f + }, + { + -0.054987f, +0.321355f, -0.031335f, -0.126368f, -0.001141f, -0.012879f, -0.006853f, +0.012993f, -0.023432f, +0.005051f, + -0.015702f, -0.015676f, +0.034761f, +0.019946f, +0.014643f, -0.021227f, +0.018751f, +0.005146f, +0.030702f, +0.036776f, + -0.001199f, +0.013092f, +0.008373f, +0.000745f, -0.014893f, +0.021952f, -0.020778f, +0.019502f, -0.011112f, -0.018314f, + +0.002324f, +0.001714f, +0.008090f, +0.016696f, -0.002618f, -0.004046f, -0.005549f, +0.003517f, -0.007903f, +0.000856f, + +0.000760f, +0.003142f, +0.006725f, -0.007161f, +0.009404f, +0.012951f, +0.002075f, +0.006740f, +0.012609f, -0.007987f, + -0.000797f, -0.000461f, -0.012949f, +0.001254f, +0.008028f, -0.002973f, -0.001195f, +0.004330f, -0.001879f, +0.005148f, + +0.007865f, +0.004423f, +0.000622f, +0.000552f, -0.004271f, +0.003501f, +0.001925f, +0.004233f, -0.000523f, -0.001377f, + -0.000049f, -0.000676f, +0.003763f, +0.001645f, -0.000511f, -0.004516f, +0.001728f, -0.004236f, -0.001247f, +0.005048f, + -0.003553f, -0.001311f, +0.002651f, -0.001880f, -0.001866f, +0.004828f, -0.003041f, -0.001769f, +0.003395f, -0.000764f, + -0.001892f, -0.001919f, +0.003245f, -0.000384f, +0.000590f, -0.001626f + }, + { + -0.003092f, -0.010313f, -0.005851f, -0.014159f, -0.002905f, -0.004600f, -0.002243f, +0.003637f, -0.010537f, +0.004148f, + +0.011570f, +0.003156f, -0.004020f, +0.016087f, +0.011072f, +0.018279f, -0.027856f, -0.011886f, +0.017450f, -0.001238f, + -0.010455f, -0.005158f, +0.013166f, +0.014823f, -0.005661f, -0.013121f, +0.035639f, -0.011731f, +0.030255f, +0.006093f, + -0.011126f, -0.009114f, -0.018837f, +0.001293f, +0.003933f, -0.019249f, +0.010818f, -0.003187f, -0.019695f, -0.007199f, + +0.004835f, -0.001819f, -0.000290f, -0.001680f, +0.007367f, +0.006066f, +0.008616f, -0.003606f, -0.004741f, +0.003540f, + +0.008391f, +0.001601f, +0.002808f, -0.005433f, -0.000170f, +0.003290f, +0.004219f, -0.001984f, -0.002808f, +0.007310f, + -0.005827f, +0.002359f, +0.000906f, +0.004472f, -0.001843f, -0.000216f, -0.000452f, +0.004671f, -0.000011f, +0.004835f, + +0.002400f, -0.001674f, -0.003859f, +0.004773f, -0.000740f, -0.005547f, -0.000340f, -0.001004f, -0.001697f, -0.001842f, + +0.001331f, +0.002182f, -0.003923f, +0.001228f, +0.004472f, -0.003264f, +0.000481f, -0.000293f, -0.001037f, -0.000229f, + +0.002452f, -0.003779f, -0.000811f, -0.000109f, -0.005324f, +0.001102f + }, + { + +0.036719f, +0.109878f, +0.060018f, -0.024343f, -0.010085f, +0.030190f, +0.055684f, +0.033154f, -0.032727f, -0.002585f, + -0.000071f, +0.016171f, +0.022334f, -0.015500f, -0.025462f, -0.008488f, +0.021256f, +0.003808f, +0.013803f, -0.011420f, + -0.014813f, -0.001145f, -0.007734f, -0.002658f, -0.002688f, +0.003612f, -0.005927f, +0.015490f, +0.005295f, +0.002233f, + +0.015369f, +0.023801f, -0.018332f, +0.004367f, -0.004307f, -0.000964f, +0.011350f, +0.006403f, +0.005861f, +0.005441f, + -0.013356f, -0.001761f, -0.007970f, +0.004141f, +0.010350f, +0.005660f, -0.005209f, -0.000967f, -0.006615f, -0.002283f, + +0.012828f, +0.005488f, -0.005024f, -0.006630f, -0.008025f, +0.002502f, +0.005525f, -0.001755f, +0.003333f, -0.000154f, + -0.002313f, +0.000745f, +0.005832f, -0.000373f, +0.000736f, +0.010659f, -0.004502f, -0.005809f, +0.007024f, -0.001022f, + +0.000430f, +0.002345f, -0.000168f, -0.000791f, -0.000779f, -0.000214f, -0.003029f, -0.004300f, -0.000098f, -0.001516f, + +0.003391f, +0.002652f, +0.005435f, +0.002314f, -0.001403f, -0.001577f, +0.005067f, -0.002733f, -0.000139f, +0.000999f, + +0.000147f, +0.001203f, -0.000840f, -0.001604f, +0.002598f, -0.003436f + }, + { + +0.007959f, +0.003403f, -0.001140f, -0.001980f, -0.007270f, -0.026457f, -0.005084f, -0.016930f, -0.010359f, +0.022924f, + -0.005343f, -0.036841f, +0.003276f, +0.002105f, +0.033529f, -0.005231f, -0.005630f, -0.024182f, -0.011787f, -0.002578f, + +0.019670f, -0.034131f, -0.009634f, -0.012149f, +0.000913f, +0.023068f, +0.023525f, +0.006872f, +0.003575f, +0.015690f, + +0.011301f, +0.001094f, -0.001888f, -0.004838f, +0.001217f, -0.008386f, -0.004654f, +0.000956f, -0.001818f, +0.003821f, + -0.006550f, +0.000894f, +0.003864f, -0.004960f, +0.007159f, -0.003757f, -0.003819f, +0.000870f, +0.004591f, -0.007197f, + +0.002639f, +0.002757f, -0.006122f, +0.000419f, -0.002383f, -0.002402f, +0.005020f, -0.001752f, -0.002431f, +0.000457f, + -0.003943f, -0.000708f, -0.003045f, -0.002237f, -0.001673f, +0.004108f, +0.001692f, +0.005771f, -0.001393f, +0.000607f, + +0.001774f, -0.002787f, -0.005189f, -0.000561f, +0.002758f, -0.003846f, +0.000304f, -0.003659f, +0.004433f, -0.002832f, + +0.000296f, +0.002737f, -0.002161f, +0.002811f, -0.001969f, +0.000198f, -0.001272f, +0.001830f, +0.003687f, +0.000412f, + -0.000197f, -0.004009f, -0.002505f, +0.002792f, -0.002554f, -0.001384f + }, + { + +0.050294f, -0.043887f, -0.015827f, +0.023476f, +0.069209f, +0.004410f, +0.024947f, -0.025179f, +0.018543f, +0.000243f, + -0.020798f, -0.019289f, +0.014150f, +0.009573f, +0.031089f, +0.014414f, -0.006846f, -0.040609f, +0.011289f, -0.012367f, + +0.027606f, +0.015860f, +0.009124f, -0.016411f, +0.009314f, -0.002779f, +0.006909f, -0.006208f, -0.000161f, -0.010806f, + -0.005848f, +0.012624f, -0.003598f, +0.013638f, +0.000543f, -0.008511f, -0.008681f, -0.000963f, +0.006725f, +0.005050f, + -0.001279f, -0.005362f, +0.022672f, -0.013201f, -0.015542f, -0.014594f, +0.000812f, -0.004296f, +0.006715f, -0.009835f, + +0.001390f, +0.000811f, +0.002251f, -0.004354f, +0.001646f, +0.003889f, -0.001618f, -0.006436f, +0.000132f, +0.000709f, + +0.006072f, -0.004274f, +0.002389f, -0.005944f, -0.003486f, -0.001092f, +0.000203f, +0.000912f, -0.002649f, +0.003065f, + +0.000394f, +0.001596f, -0.000887f, -0.000570f, -0.001407f, -0.000861f, +0.003830f, -0.003687f, +0.008610f, +0.006892f, + +0.002117f, +0.000326f, -0.001894f, +0.000910f, +0.001059f, -0.002203f, +0.001275f, +0.001583f, +0.003407f, +0.002039f, + -0.001398f, -0.000316f, +0.000265f, -0.000115f, -0.002444f, -0.002187f + }, + { + +0.000688f, +0.075515f, -0.010802f, -0.002148f, -0.011140f, +0.003619f, -0.007983f, -0.012581f, +0.001248f, +0.002359f, + +0.003047f, -0.005753f, +0.002676f, +0.069185f, -0.040831f, +0.023072f, -0.006576f, +0.000469f, -0.025853f, -0.011338f, + +0.007201f, +0.001282f, +0.023069f, -0.009376f, +0.012530f, -0.007828f, +0.012770f, -0.002460f, +0.017630f, +0.025377f, + -0.029409f, +0.000413f, -0.008797f, -0.004468f, +0.004356f, +0.005347f, +0.012400f, -0.015254f, +0.013897f, +0.002392f, + -0.008333f, -0.011204f, -0.000447f, +0.007764f, +0.001000f, -0.015296f, -0.007603f, +0.000411f, -0.003609f, +0.009536f, + -0.001157f, +0.016827f, -0.004786f, -0.003814f, +0.002266f, +0.009541f, +0.002536f, +0.002001f, -0.005062f, -0.004422f, + +0.000603f, +0.009442f, +0.001051f, -0.000763f, +0.000729f, +0.006924f, +0.006186f, -0.000735f, -0.002049f, -0.010567f, + -0.005405f, +0.002736f, +0.000548f, +0.007268f, +0.002670f, -0.001674f, -0.003528f, +0.001035f, -0.007853f, -0.001492f, + -0.002649f, -0.002694f, -0.001989f, +0.001512f, +0.004437f, +0.000552f, +0.002722f, +0.005922f, +0.001598f, -0.000396f, + -0.003132f, +0.000199f, +0.001810f, -0.005153f, +0.002304f, +0.001527f + }, + { + +0.032590f, +0.096225f, -0.024036f, +0.009853f, +0.037361f, -0.058418f, +0.011676f, +0.008324f, +0.004178f, +0.002297f, + +0.039175f, +0.017248f, -0.005795f, -0.027975f, +0.019363f, -0.019703f, +0.042278f, +0.021891f, +0.034006f, -0.014916f, + -0.019823f, -0.004265f, -0.006244f, +0.020812f, -0.012887f, -0.019807f, +0.019316f, -0.018329f, -0.003259f, -0.024230f, + -0.007311f, -0.004548f, -0.003063f, +0.012428f, -0.018949f, +0.000641f, -0.010262f, +0.009393f, +0.001242f, +0.007537f, + +0.012069f, +0.003149f, -0.001109f, -0.015781f, -0.005820f, -0.012297f, -0.020192f, +0.009820f, -0.002725f, +0.012540f, + -0.015264f, +0.003777f, +0.003074f, -0.000542f, -0.007635f, -0.010147f, +0.003973f, +0.006882f, -0.007365f, -0.005267f, + -0.000013f, +0.003132f, +0.006131f, -0.001625f, +0.009574f, +0.003164f, +0.011027f, -0.006399f, +0.005489f, +0.003391f, + +0.000494f, +0.001889f, +0.004849f, +0.001263f, +0.004751f, -0.000140f, +0.006463f, -0.003695f, -0.004242f, +0.000069f, + -0.002891f, +0.001192f, -0.000808f, -0.000351f, -0.001341f, -0.001647f, +0.000502f, -0.002060f, +0.000948f, +0.002158f, + +0.000318f, +0.002442f, +0.000658f, +0.002110f, +0.002822f, +0.000639f + }, + { + -0.001419f, -0.072770f, +0.003517f, +0.038717f, -0.005287f, +0.000246f, +0.002637f, -0.002651f, +0.012991f, -0.013378f, + +0.006408f, -0.000847f, +0.000995f, -0.026727f, -0.122976f, +0.008373f, +0.000578f, +0.001824f, +0.007293f, +0.001555f, + -0.011369f, -0.009710f, +0.005276f, -0.023906f, +0.002699f, +0.007783f, +0.006611f, +0.007828f, -0.010346f, -0.005979f, + -0.011967f, -0.018709f, -0.007198f, -0.014862f, +0.008275f, +0.015745f, +0.015004f, +0.011455f, +0.002768f, -0.003643f, + +0.010152f, +0.001939f, -0.000102f, +0.004708f, +0.004888f, -0.002949f, -0.002646f, +0.007509f, -0.002899f, +0.005074f, + +0.002609f, +0.007099f, +0.005500f, -0.002485f, -0.002762f, +0.005405f, +0.002120f, +0.003419f, +0.004931f, +0.007644f, + -0.006314f, +0.009853f, -0.000135f, +0.001347f, +0.000143f, -0.015144f, +0.003090f, -0.001230f, +0.001094f, +0.001992f, + -0.002823f, +0.002122f, +0.001197f, -0.000622f, -0.000631f, -0.004019f, +0.000453f, -0.000681f, -0.001983f, -0.007985f, + +0.005341f, +0.006359f, -0.002518f, -0.000494f, +0.002177f, +0.002309f, +0.002020f, -0.000584f, -0.000074f, +0.004308f, + -0.000918f, -0.004921f, +0.001979f, +0.004480f, -0.003308f, +0.001316f + } + }, + { + { + +0.030267f, -0.250345f, -0.079482f, -0.061973f, -0.038731f, -0.002806f, +0.016336f, +0.006336f, -0.005335f, +0.015481f, + -0.018166f, +0.006682f, -0.002343f, +0.015870f, +0.003743f, -0.021447f, -0.022345f, -0.023698f, +0.021922f, +0.006867f, + +0.011625f, -0.007283f, +0.010491f, +0.013584f, +0.009698f, +0.004986f, -0.011363f, +0.005642f, +0.003156f, -0.012941f, + +0.014781f, +0.009737f, -0.009238f, +0.007154f, +0.009520f, -0.008696f, +0.010374f, -0.008233f, +0.010808f, -0.000948f, + -0.005463f, +0.007676f, +0.005190f, +0.002861f, +0.008840f, -0.000145f, -0.005924f, +0.010456f, +0.010774f, +0.013300f, + -0.001788f, -0.002170f, +0.000192f, +0.010501f, -0.001682f, +0.003355f, +0.013622f, -0.002141f, +0.000329f, +0.005655f, + -0.006014f, -0.009620f, +0.011183f, +0.001672f, +0.005084f, -0.002359f, -0.000056f, -0.000325f, -0.000449f, -0.002087f, + -0.003868f, -0.004695f, -0.002146f, -0.009265f, -0.000856f, +0.004081f, -0.000026f, -0.001520f, +0.000825f, +0.003278f, + -0.001849f, +0.001831f, -0.001613f, +0.003978f, +0.000653f, +0.002145f, +0.002485f, -0.003109f, +0.002313f, +0.001310f, + +0.001869f, -0.001624f, -0.000392f, +0.002191f, -0.002234f, +0.000092f + }, + { + -0.001383f, -0.092461f, +0.004667f, +0.026706f, -0.014142f, -0.008463f, -0.003404f, -0.011942f, -0.016078f, +0.000528f, + -0.017160f, +0.009143f, -0.009626f, +0.041929f, +0.023514f, +0.015236f, +0.025955f, +0.011794f, +0.010735f, -0.009926f, + +0.019210f, +0.007795f, -0.033993f, -0.028317f, +0.028489f, +0.002447f, -0.026246f, -0.004629f, -0.021764f, +0.005768f, + -0.003389f, -0.007210f, +0.005628f, -0.003005f, +0.000766f, -0.000592f, -0.009899f, +0.001600f, -0.000632f, -0.000699f, + +0.000927f, -0.013099f, -0.005479f, -0.001483f, +0.008827f, -0.011150f, +0.006590f, +0.003220f, -0.011334f, -0.003208f, + +0.000467f, +0.001170f, -0.002407f, +0.002026f, -0.010185f, +0.000938f, +0.011729f, -0.007069f, +0.001145f, -0.004362f, + -0.000211f, +0.003602f, -0.000776f, -0.005754f, -0.008542f, +0.005547f, +0.002307f, -0.006557f, -0.001828f, +0.003231f, + -0.002278f, -0.001268f, +0.004200f, +0.001007f, -0.001666f, -0.007205f, -0.004281f, -0.004164f, +0.001426f, +0.001295f, + -0.003560f, +0.004791f, -0.002390f, +0.001784f, +0.002282f, +0.000438f, -0.001896f, -0.001142f, +0.000029f, -0.001735f, + -0.003599f, +0.000877f, -0.000060f, +0.000378f, -0.001040f, -0.000126f + }, + { + +0.001182f, +0.224240f, +0.014517f, -0.010475f, +0.004071f, -0.006086f, +0.008015f, -0.014830f, +0.005353f, -0.011593f, + +0.001110f, +0.022512f, -0.005145f, +0.013197f, +0.006318f, +0.024747f, -0.018038f, -0.006579f, -0.017163f, +0.014729f, + -0.021308f, +0.006414f, -0.007096f, +0.016956f, +0.007563f, -0.010546f, +0.009674f, -0.006126f, +0.005624f, +0.004634f, + +0.002154f, -0.002818f, -0.005659f, -0.004974f, +0.002476f, +0.005510f, -0.009267f, +0.019420f, +0.006591f, +0.006160f, + -0.011192f, -0.013338f, +0.015297f, -0.003204f, +0.001000f, +0.007955f, +0.006872f, +0.001882f, -0.000579f, -0.002363f, + +0.013576f, -0.001068f, -0.007727f, +0.002641f, +0.000954f, -0.001234f, +0.006660f, -0.002307f, -0.003247f, -0.005742f, + +0.002551f, -0.005273f, -0.003081f, -0.007171f, +0.003850f, -0.000737f, -0.001812f, +0.000836f, +0.000061f, +0.001806f, + +0.000214f, -0.003239f, -0.002946f, -0.001562f, +0.005039f, +0.002930f, +0.000898f, -0.002614f, +0.003286f, -0.002744f, + +0.002161f, +0.000646f, +0.002484f, +0.000773f, -0.000803f, -0.001752f, +0.002410f, -0.000789f, +0.001615f, -0.001664f, + +0.002554f, +0.000557f, +0.001489f, -0.000382f, +0.002533f, +0.004006f + }, + { + -0.036016f, -0.017953f, +0.022607f, +0.037980f, -0.003028f, -0.009549f, -0.000733f, -0.002092f, +0.021381f, -0.018421f, + -0.007647f, -0.000823f, +0.004561f, -0.015234f, -0.009924f, +0.012302f, +0.015999f, -0.019837f, +0.021877f, +0.010630f, + -0.002432f, +0.015051f, +0.037461f, -0.017509f, +0.003648f, -0.018434f, +0.012803f, +0.001633f, +0.005287f, -0.023961f, + -0.002547f, +0.009936f, -0.010281f, +0.010000f, +0.007588f, +0.017235f, -0.015338f, -0.002298f, -0.007231f, +0.002039f, + -0.015743f, +0.001677f, +0.004761f, -0.000643f, -0.014869f, -0.004642f, -0.007700f, +0.002174f, -0.008352f, -0.000904f, + +0.019849f, +0.001230f, -0.001691f, -0.002692f, -0.004064f, -0.001135f, +0.001225f, -0.006532f, -0.004411f, +0.013298f, + -0.001204f, -0.003716f, +0.005249f, +0.008888f, -0.002255f, -0.003199f, +0.004161f, -0.002141f, -0.002307f, +0.004875f, + -0.001384f, -0.007305f, +0.004205f, -0.005030f, +0.000456f, -0.001140f, +0.001638f, +0.002604f, -0.001931f, +0.001420f, + +0.002411f, +0.001280f, +0.001517f, -0.001536f, -0.001405f, -0.001294f, +0.004062f, +0.001934f, +0.004172f, -0.001906f, + -0.001262f, +0.000569f, +0.001671f, +0.000892f, +0.000049f, +0.000733f + }, + { + +0.002018f, +0.051594f, +0.000878f, +0.015897f, -0.002201f, +0.002189f, +0.003929f, +0.000834f, +0.003655f, -0.004871f, + +0.011451f, -0.004935f, +0.009134f, -0.003645f, +0.033962f, +0.012838f, -0.005131f, -0.019350f, -0.014398f, +0.018474f, + +0.008165f, -0.002042f, +0.008419f, +0.026784f, +0.028090f, +0.030781f, -0.020611f, -0.027747f, -0.008509f, -0.014322f, + +0.036125f, +0.041071f, +0.023106f, -0.009076f, -0.014597f, +0.001500f, +0.002512f, +0.004764f, +0.013934f, +0.002649f, + +0.000441f, +0.002871f, -0.013101f, +0.002035f, -0.000873f, -0.008937f, -0.002834f, +0.002277f, -0.002967f, +0.003675f, + -0.003198f, -0.011499f, +0.000298f, +0.000003f, +0.005646f, -0.002212f, +0.004959f, -0.008306f, -0.007988f, -0.000897f, + +0.002725f, -0.005848f, -0.002331f, +0.000723f, +0.002126f, +0.011328f, +0.001568f, -0.014721f, -0.000417f, -0.004277f, + +0.001461f, +0.003719f, -0.006129f, +0.000878f, +0.003831f, -0.007027f, +0.001031f, +0.001512f, -0.003558f, -0.000141f, + +0.002790f, -0.006967f, -0.000877f, +0.000816f, -0.002703f, -0.000473f, +0.001510f, +0.000255f, -0.001925f, -0.000845f, + -0.001920f, -0.001939f, +0.000168f, -0.001019f, -0.000510f, -0.002689f + }, + { + -0.069078f, -0.005915f, +0.049828f, -0.092657f, -0.010643f, +0.000710f, +0.006378f, +0.001412f, +0.035882f, -0.034701f, + -0.023552f, -0.019896f, +0.019712f, +0.012051f, +0.011014f, +0.001941f, +0.008145f, +0.001027f, -0.012162f, -0.012024f, + +0.023335f, +0.006647f, -0.015432f, +0.025711f, +0.000629f, -0.009431f, -0.001324f, +0.024451f, +0.006988f, +0.005640f, + -0.015977f, -0.014247f, +0.000877f, -0.000287f, -0.005519f, +0.013421f, +0.001493f, -0.004995f, +0.009992f, +0.001283f, + -0.003121f, -0.009718f, +0.001342f, -0.017147f, +0.015220f, +0.002557f, +0.008965f, -0.002628f, -0.001767f, +0.008625f, + +0.002505f, +0.008029f, -0.002171f, -0.001292f, -0.005009f, +0.004273f, -0.000191f, -0.001036f, +0.001013f, -0.002935f, + -0.005633f, +0.002695f, -0.004532f, -0.001876f, -0.002235f, +0.000405f, -0.001676f, -0.000227f, -0.002314f, -0.002490f, + +0.002284f, +0.005772f, -0.003438f, +0.000178f, -0.001525f, +0.004804f, -0.000853f, -0.000702f, -0.003280f, -0.001256f, + -0.001985f, +0.000924f, +0.000051f, +0.002507f, -0.002128f, -0.002679f, +0.000018f, -0.000440f, -0.002938f, -0.002244f, + +0.001274f, +0.000604f, -0.000861f, -0.000614f, +0.001070f, -0.000120f + }, + { + -0.001133f, +0.020307f, -0.005801f, -0.002064f, -0.004145f, +0.000814f, +0.000631f, -0.004328f, -0.007864f, +0.001979f, + -0.008270f, -0.003124f, -0.000087f, +0.008701f, -0.030969f, -0.007430f, +0.013982f, +0.004555f, -0.017024f, -0.035896f, + -0.016892f, +0.004956f, +0.007806f, -0.014228f, +0.029119f, -0.031138f, -0.034149f, +0.020011f, +0.007821f, +0.006134f, + +0.020692f, -0.011758f, +0.007035f, +0.011316f, -0.007851f, +0.005958f, +0.006620f, +0.008939f, -0.008367f, +0.006732f, + +0.005571f, -0.009486f, +0.003427f, +0.009226f, +0.000002f, -0.002675f, -0.000940f, +0.000726f, +0.013169f, -0.007652f, + -0.000073f, +0.001505f, -0.004713f, +0.009899f, +0.001456f, +0.004182f, -0.007721f, -0.006025f, +0.001288f, +0.005704f, + -0.001221f, -0.004110f, -0.003017f, +0.004619f, -0.003583f, -0.005733f, +0.004723f, +0.001705f, -0.004420f, +0.001045f, + -0.001424f, -0.002989f, -0.001590f, -0.001317f, +0.001548f, +0.000586f, -0.000071f, +0.000151f, -0.000064f, -0.000931f, + +0.000811f, +0.000997f, +0.000851f, +0.001942f, -0.001225f, -0.001328f, +0.001525f, +0.000070f, +0.000447f, -0.003294f, + +0.001212f, -0.000305f, +0.001791f, +0.001086f, -0.000070f, -0.002534f + }, + { + +0.027895f, +0.525123f, +0.039485f, -0.114204f, +0.006994f, -0.034456f, -0.030817f, +0.019756f, -0.017083f, -0.004319f, + -0.018676f, -0.008318f, +0.019993f, +0.007104f, +0.023880f, -0.022507f, +0.012207f, -0.002350f, +0.006810f, +0.017832f, + -0.023468f, +0.007475f, +0.011119f, +0.003805f, -0.016678f, +0.009993f, -0.026038f, +0.020509f, +0.006405f, -0.005937f, + -0.011580f, -0.003649f, +0.001367f, +0.008394f, -0.011263f, -0.010417f, +0.001688f, -0.003649f, -0.007926f, +0.005916f, + -0.001310f, +0.013039f, +0.009546f, -0.002581f, +0.001860f, +0.005644f, +0.004055f, +0.000645f, +0.007070f, -0.005514f, + -0.002531f, +0.002999f, -0.006542f, +0.006699f, +0.012789f, -0.001071f, +0.000675f, +0.009007f, -0.007063f, -0.003036f, + +0.004284f, -0.000481f, -0.001594f, -0.001161f, -0.006406f, +0.006673f, +0.001162f, +0.000259f, +0.001634f, +0.004077f, + +0.000711f, -0.002911f, +0.004240f, -0.000076f, -0.004454f, -0.000188f, +0.009111f, -0.002761f, +0.000106f, +0.002441f, + -0.003720f, +0.000970f, +0.002167f, -0.001687f, +0.000515f, +0.005325f, -0.001024f, +0.000208f, +0.001550f, -0.002861f, + -0.001382f, -0.001431f, +0.003383f, -0.001754f, +0.001936f, -0.002217f + }, + { + +0.000439f, +0.011746f, -0.003967f, -0.006190f, +0.006088f, +0.000401f, +0.000500f, +0.008128f, -0.002909f, -0.002975f, + -0.001908f, +0.005182f, +0.000209f, -0.002061f, -0.010806f, +0.031097f, -0.001739f, +0.006864f, -0.007948f, -0.031510f, + +0.003901f, +0.013590f, +0.008809f, +0.020211f, -0.006628f, -0.018281f, +0.027798f, +0.001905f, +0.022931f, -0.011583f, + +0.001097f, +0.000166f, -0.022190f, -0.009885f, +0.000393f, -0.016179f, +0.000316f, +0.002910f, -0.011317f, -0.007920f, + +0.003825f, -0.010027f, +0.004932f, +0.003120f, -0.005364f, -0.007184f, +0.006289f, +0.002309f, -0.005106f, -0.000832f, + +0.011538f, +0.002453f, +0.008096f, +0.000659f, +0.003510f, +0.003048f, +0.006155f, +0.001593f, -0.000852f, +0.004018f, + -0.004928f, +0.008072f, +0.004827f, +0.006387f, +0.005604f, +0.001968f, -0.002207f, +0.004153f, -0.001997f, +0.004014f, + -0.000191f, -0.003851f, -0.003391f, +0.004589f, -0.001617f, -0.002898f, +0.002501f, +0.002406f, -0.001738f, -0.000575f, + +0.003318f, +0.003181f, -0.003857f, +0.000804f, +0.004827f, -0.002123f, +0.000623f, -0.002342f, -0.001035f, +0.000774f, + +0.004001f, +0.000313f, +0.000622f, -0.000387f, -0.002653f, +0.002541f + }, + { + -0.045090f, +0.042907f, +0.071196f, -0.024873f, +0.002054f, -0.008819f, +0.001851f, -0.004702f, -0.015218f, +0.026055f, + +0.012860f, +0.013687f, -0.003474f, +0.010840f, -0.006605f, -0.032726f, +0.016565f, +0.006873f, +0.013139f, +0.000617f, + +0.014669f, +0.026135f, +0.007328f, +0.004648f, +0.002794f, +0.011328f, +0.001283f, -0.003475f, -0.005733f, +0.001931f, + -0.004817f, -0.002412f, -0.013222f, +0.006418f, -0.009723f, +0.001374f, +0.002256f, -0.003103f, +0.003478f, +0.010974f, + +0.003302f, +0.019936f, +0.000462f, +0.004228f, +0.001465f, -0.006515f, -0.010210f, +0.006339f, +0.001309f, -0.003349f, + +0.005032f, +0.001917f, -0.006277f, -0.001806f, -0.002859f, +0.000002f, -0.001841f, -0.001760f, +0.008287f, +0.002247f, + -0.004528f, -0.003317f, +0.001118f, +0.000659f, +0.001026f, +0.008276f, -0.004251f, -0.006581f, +0.006850f, -0.006657f, + -0.011372f, -0.001970f, -0.001494f, -0.002083f, +0.003363f, +0.002207f, +0.000830f, -0.002993f, -0.000855f, -0.000839f, + +0.002253f, +0.003176f, +0.005672f, +0.001716f, -0.001753f, -0.002784f, +0.005724f, -0.000209f, -0.000915f, -0.001406f, + -0.001271f, -0.001698f, +0.000994f, +0.001350f, +0.003257f, -0.001479f + }, + { + -0.007490f, +0.017357f, +0.031756f, +0.005160f, -0.007107f, -0.015996f, +0.000028f, -0.017280f, -0.017396f, +0.002800f, + -0.019757f, -0.027154f, -0.004870f, -0.001155f, +0.043893f, -0.013403f, +0.008320f, -0.011429f, -0.009266f, -0.002678f, + +0.023466f, -0.016031f, +0.012273f, -0.005808f, -0.011944f, -0.003844f, -0.005298f, -0.008569f, -0.002857f, +0.002019f, + +0.009095f, -0.002892f, -0.000632f, -0.003804f, -0.002640f, -0.003249f, +0.001744f, -0.002379f, -0.010222f, -0.001030f, + -0.000169f, +0.002329f, +0.000212f, -0.004909f, +0.011633f, +0.004149f, -0.004176f, -0.010195f, +0.004921f, +0.007489f, + +0.000530f, -0.005669f, -0.006765f, +0.001559f, -0.001259f, -0.005959f, +0.003531f, -0.004544f, +0.001070f, +0.005223f, + -0.005339f, -0.000277f, -0.001113f, +0.002490f, -0.000780f, -0.002165f, -0.000643f, +0.004300f, -0.002871f, -0.000678f, + -0.000856f, -0.005533f, -0.005476f, +0.000015f, +0.001697f, -0.002172f, +0.001349f, -0.003055f, +0.006161f, -0.000158f, + -0.000042f, +0.000815f, -0.004958f, +0.002605f, -0.000638f, +0.001714f, -0.002789f, -0.002054f, -0.000784f, -0.000432f, + +0.002182f, -0.001434f, -0.002042f, +0.003219f, -0.001471f, -0.001363f + }, + { + -0.033546f, -0.160731f, -0.011525f, +0.017905f, +0.066193f, -0.020816f, -0.003322f, -0.019092f, +0.025569f, +0.030163f, + -0.010287f, -0.023501f, +0.029496f, +0.013918f, +0.013578f, +0.005741f, +0.027963f, -0.019657f, +0.000095f, -0.019072f, + +0.015658f, -0.006771f, -0.001423f, -0.027122f, +0.002460f, -0.001747f, +0.009529f, +0.002670f, +0.013521f, +0.000869f, + +0.007370f, +0.025469f, -0.000796f, +0.007583f, -0.004488f, -0.018185f, -0.016713f, +0.005374f, -0.006177f, -0.012946f, + -0.010007f, -0.008841f, +0.013909f, -0.015192f, -0.012230f, -0.009386f, +0.005492f, -0.008885f, +0.000910f, -0.012275f, + +0.006413f, -0.001259f, -0.002322f, -0.001362f, -0.008159f, -0.000558f, +0.004618f, -0.009039f, -0.001607f, +0.004246f, + +0.009227f, -0.005946f, +0.000479f, -0.008088f, -0.004780f, +0.002458f, -0.000330f, -0.000721f, -0.000592f, +0.002347f, + -0.000917f, +0.002382f, +0.000593f, +0.001201f, +0.003621f, +0.000771f, +0.002828f, -0.007462f, +0.001699f, +0.001377f, + -0.003007f, -0.003479f, -0.001595f, +0.003239f, -0.000274f, -0.003933f, +0.002371f, +0.000710f, +0.002083f, +0.001237f, + -0.000749f, -0.001288f, -0.001667f, +0.002817f, +0.000647f, -0.001521f + }, + { + +0.000890f, +0.076115f, -0.000201f, +0.018487f, -0.013649f, -0.016921f, -0.010973f, -0.006142f, +0.001409f, +0.013575f, + +0.013874f, +0.004521f, -0.025343f, +0.027554f, -0.031743f, +0.037721f, +0.001001f, -0.002241f, -0.030102f, -0.008561f, + +0.017242f, -0.021965f, +0.005011f, -0.009614f, -0.016672f, -0.008980f, +0.028350f, -0.008120f, -0.022373f, +0.012036f, + -0.038237f, +0.016471f, +0.000067f, -0.013214f, +0.003121f, -0.013587f, +0.005087f, -0.018304f, +0.006229f, -0.000864f, + -0.007473f, +0.000381f, +0.008197f, +0.001027f, +0.008536f, -0.004166f, -0.001600f, +0.004694f, +0.002625f, +0.009133f, + -0.007261f, +0.006170f, -0.009039f, -0.000231f, +0.006538f, +0.013825f, +0.004513f, +0.006894f, +0.003646f, -0.003975f, + -0.000099f, +0.012488f, -0.001396f, -0.001063f, +0.001961f, +0.004850f, +0.004469f, +0.002516f, +0.000761f, -0.007825f, + -0.002945f, -0.000253f, -0.004346f, +0.001570f, -0.002113f, -0.005561f, -0.002054f, +0.002887f, -0.004434f, +0.003696f, + -0.001052f, -0.004631f, -0.003999f, -0.002081f, +0.002048f, -0.000334f, +0.000319f, +0.003027f, +0.000901f, +0.001102f, + -0.003157f, -0.001181f, -0.000684f, -0.004966f, +0.002457f, +0.001253f + }, + { + -0.043754f, +0.011673f, +0.003930f, -0.015413f, +0.009471f, -0.029858f, +0.029451f, -0.019506f, +0.012171f, +0.013839f, + +0.011582f, +0.000662f, -0.004847f, +0.016303f, +0.059762f, -0.030473f, +0.025148f, +0.001263f, +0.021810f, -0.029932f, + -0.026265f, -0.004321f, -0.012972f, +0.029326f, +0.002332f, -0.013124f, +0.027482f, -0.013152f, -0.002220f, -0.015426f, + -0.000481f, -0.014377f, -0.000325f, +0.023363f, +0.000527f, +0.016003f, -0.019653f, -0.008448f, -0.007669f, +0.001668f, + +0.002642f, -0.009834f, -0.004901f, -0.012842f, -0.001802f, +0.003050f, -0.005627f, +0.010949f, -0.004662f, +0.022803f, + -0.010622f, +0.002032f, -0.003673f, -0.002866f, -0.007318f, -0.005662f, +0.005031f, +0.004309f, -0.010924f, -0.005480f, + -0.002259f, +0.002696f, +0.006404f, -0.005571f, +0.002917f, -0.002223f, +0.008719f, -0.007596f, +0.005192f, +0.003053f, + -0.000077f, -0.000700f, +0.000146f, +0.004490f, +0.008129f, -0.001375f, +0.002299f, -0.006716f, -0.006159f, -0.001884f, + -0.000978f, +0.002690f, -0.002267f, +0.002993f, +0.001424f, -0.000350f, -0.000307f, -0.001926f, -0.000218f, +0.000190f, + -0.001534f, +0.001849f, -0.000873f, -0.001800f, +0.002668f, +0.002563f + }, + { + +0.001183f, -0.099729f, -0.024336f, +0.020037f, -0.000438f, +0.000693f, -0.012798f, -0.001907f, +0.011109f, -0.016343f, + +0.001297f, +0.020671f, +0.014218f, +0.081884f, -0.003756f, +0.000540f, -0.008702f, +0.004595f, +0.029148f, -0.000195f, + -0.018407f, +0.002608f, +0.018608f, -0.010447f, +0.000268f, -0.003281f, -0.015761f, -0.024311f, -0.037925f, -0.005188f, + +0.015047f, +0.001641f, +0.005287f, -0.005470f, +0.000859f, -0.010550f, -0.008609f, -0.007463f, -0.007193f, -0.015592f, + -0.003621f, +0.006938f, +0.002698f, -0.005743f, -0.010284f, -0.003533f, +0.007533f, -0.008136f, -0.010991f, +0.013119f, + -0.007229f, -0.005511f, +0.001462f, -0.005384f, -0.005523f, +0.008812f, +0.003132f, +0.004030f, +0.006060f, +0.005233f, + -0.010031f, +0.007410f, -0.002717f, +0.002764f, +0.011362f, -0.007187f, +0.003996f, +0.001589f, +0.000129f, +0.003475f, + -0.001040f, +0.004592f, -0.000254f, -0.002308f, +0.002300f, -0.001361f, +0.005185f, +0.005044f, +0.004642f, -0.009621f, + -0.001976f, +0.001744f, -0.006443f, -0.002388f, +0.002213f, +0.001567f, -0.002560f, -0.000904f, +0.001483f, +0.004409f, + -0.001134f, -0.004552f, -0.000202f, +0.003635f, -0.002503f, +0.001960f + } + }, + { + { + -0.032955f, -0.385428f, +0.061318f, -0.085198f, -0.021268f, +0.000597f, -0.003775f, +0.028864f, -0.018004f, -0.017678f, + +0.017818f, +0.010489f, +0.003255f, +0.017963f, -0.014536f, -0.006766f, -0.012063f, -0.019914f, +0.006155f, +0.010225f, + -0.001229f, -0.003037f, +0.017277f, +0.010159f, +0.020390f, +0.004587f, -0.013287f, +0.001963f, -0.000144f, -0.008664f, + +0.007014f, -0.001985f, +0.018263f, -0.003289f, +0.008323f, -0.013112f, +0.004432f, -0.008602f, +0.014827f, +0.000849f, + +0.004349f, +0.005403f, +0.003819f, +0.000612f, +0.008202f, -0.006408f, +0.003093f, +0.005590f, +0.008494f, +0.005420f, + +0.011395f, -0.010220f, +0.002234f, +0.007772f, -0.003675f, +0.005169f, +0.010274f, +0.003428f, -0.001961f, +0.007734f, + -0.005755f, -0.004341f, +0.007037f, +0.005317f, -0.003320f, +0.002871f, -0.000760f, +0.002314f, -0.002464f, -0.003523f, + +0.000002f, -0.006612f, -0.004401f, -0.003620f, +0.000286f, +0.000820f, -0.001998f, +0.000553f, -0.001713f, +0.002895f, + -0.000187f, +0.004675f, -0.000983f, +0.003872f, +0.000528f, -0.000114f, +0.001170f, -0.000672f, -0.000985f, +0.003701f, + +0.003994f, -0.001527f, -0.000081f, +0.000292f, -0.000950f, -0.001578f + }, + { + +0.001267f, -0.040840f, -0.030678f, -0.006880f, +0.005743f, -0.004875f, -0.003092f, -0.011182f, -0.011508f, -0.020900f, + -0.015983f, +0.025247f, +0.001026f, +0.011114f, +0.041533f, +0.038498f, -0.007121f, +0.038921f, +0.006670f, -0.020867f, + +0.020447f, +0.002042f, -0.008555f, -0.023188f, -0.011289f, +0.031710f, -0.018185f, -0.022930f, -0.029367f, +0.007654f, + +0.008356f, -0.010120f, +0.008907f, -0.003543f, +0.002368f, -0.000107f, -0.008221f, -0.009984f, +0.004819f, +0.001399f, + -0.009693f, -0.014694f, -0.002513f, +0.001574f, +0.004426f, +0.007829f, -0.004087f, +0.005057f, -0.014260f, -0.004033f, + +0.002897f, -0.000889f, +0.004954f, -0.003010f, -0.004115f, -0.006559f, +0.008786f, +0.000007f, +0.001118f, -0.008488f, + +0.004308f, +0.002220f, +0.000293f, -0.007160f, -0.008033f, +0.008533f, -0.003947f, -0.004821f, -0.000985f, +0.001273f, + -0.001022f, +0.003200f, -0.001267f, +0.004991f, -0.005926f, -0.002011f, -0.005690f, -0.002428f, +0.001871f, -0.000539f, + -0.001236f, +0.001435f, -0.001068f, +0.002488f, -0.000217f, -0.000971f, +0.001638f, -0.001653f, -0.001832f, -0.002721f, + +0.001046f, -0.002263f, +0.000575f, -0.000837f, -0.000005f, +0.002065f + }, + { + -0.005274f, +0.216782f, +0.024387f, +0.027145f, -0.026478f, -0.004209f, +0.005637f, +0.005390f, -0.001526f, -0.023891f, + -0.013284f, +0.047086f, +0.009969f, -0.023612f, +0.019312f, +0.020638f, +0.000075f, -0.027878f, +0.006381f, +0.015045f, + -0.008801f, -0.009024f, -0.001215f, -0.000067f, +0.019017f, -0.012182f, -0.000501f, +0.003080f, -0.002672f, +0.013276f, + +0.005778f, -0.014049f, +0.007800f, +0.002314f, -0.001458f, -0.005577f, +0.006055f, +0.014336f, +0.014803f, +0.001490f, + -0.007104f, -0.011988f, +0.005505f, -0.003243f, -0.008186f, +0.010555f, +0.008220f, +0.011599f, -0.002629f, +0.006538f, + +0.006963f, -0.001710f, -0.000213f, -0.005335f, +0.003287f, +0.003470f, +0.005802f, -0.000697f, -0.005738f, -0.011200f, + +0.003289f, -0.001378f, -0.001490f, -0.002910f, -0.004654f, -0.000634f, -0.002466f, +0.000223f, +0.001856f, -0.001058f, + +0.003668f, -0.004110f, -0.003493f, +0.000016f, +0.003876f, +0.002865f, -0.001145f, +0.001688f, +0.002590f, -0.001597f, + +0.001186f, +0.001235f, +0.001250f, +0.002370f, -0.001924f, -0.000442f, -0.000052f, +0.000955f, +0.001811f, -0.001489f, + +0.003413f, +0.001599f, -0.001647f, +0.000422f, +0.002983f, +0.002171f + }, + { + +0.055885f, -0.121233f, -0.020854f, +0.026816f, +0.028967f, -0.009499f, -0.004099f, +0.006184f, -0.002006f, +0.007604f, + -0.003476f, -0.004163f, -0.001422f, -0.017662f, -0.000461f, +0.011189f, -0.015681f, +0.013905f, +0.025344f, -0.003753f, + -0.003425f, +0.018394f, +0.016624f, -0.011603f, -0.000287f, +0.010854f, -0.009544f, +0.001232f, -0.003066f, +0.002259f, + -0.021133f, +0.005982f, +0.001190f, +0.009056f, +0.001520f, +0.018676f, -0.009322f, -0.005291f, -0.005322f, +0.000826f, + +0.003492f, -0.008882f, +0.005474f, -0.003533f, -0.013147f, -0.013778f, +0.005612f, -0.008202f, -0.005545f, +0.002696f, + +0.012923f, +0.006305f, -0.008534f, +0.000486f, +0.000508f, -0.002680f, -0.000034f, -0.005522f, -0.002889f, +0.009645f, + +0.001295f, +0.000907f, +0.000590f, +0.004093f, -0.001204f, -0.001992f, +0.000015f, +0.005929f, -0.002363f, +0.001044f, + -0.000267f, -0.002459f, +0.001546f, -0.005281f, +0.000081f, +0.002192f, +0.000104f, -0.002796f, +0.000375f, +0.003104f, + +0.001692f, +0.000709f, +0.004104f, -0.000833f, -0.001414f, -0.000659f, +0.001489f, +0.003067f, +0.002922f, -0.001217f, + -0.000726f, +0.001970f, +0.000827f, -0.000366f, +0.001237f, +0.000774f + }, + { + -0.003275f, +0.032246f, +0.019740f, +0.012349f, -0.000524f, +0.000613f, +0.003208f, +0.006912f, -0.005444f, +0.001369f, + -0.000092f, +0.001246f, +0.008812f, +0.021122f, +0.023585f, +0.007231f, -0.028027f, -0.076139f, +0.091989f, -0.010470f, + +0.005913f, -0.007174f, +0.015509f, +0.022493f, +0.005382f, +0.030013f, -0.003796f, -0.036229f, -0.017341f, +0.013630f, + +0.018792f, +0.039756f, +0.025355f, -0.002682f, -0.001096f, -0.016805f, +0.015034f, +0.003977f, +0.003681f, +0.012929f, + +0.001731f, -0.003764f, -0.006358f, -0.001258f, -0.014601f, +0.006665f, -0.006024f, -0.002300f, +0.006549f, +0.001164f, + -0.004949f, -0.005428f, -0.007913f, +0.004984f, +0.002585f, +0.001308f, -0.007240f, +0.000088f, -0.008635f, -0.000484f, + +0.003007f, -0.005254f, +0.004606f, -0.003391f, +0.000552f, +0.009550f, +0.000210f, -0.007073f, -0.008663f, +0.000369f, + +0.001726f, +0.000822f, -0.001339f, +0.002319f, +0.003454f, -0.008749f, +0.003485f, -0.000191f, -0.002454f, -0.000594f, + +0.002075f, -0.002847f, +0.001187f, -0.003666f, -0.001846f, +0.000265f, +0.001397f, +0.001293f, -0.001696f, -0.000830f, + -0.004266f, -0.001558f, -0.000613f, -0.000543f, -0.001669f, -0.000298f + }, + { + +0.096260f, -0.170950f, -0.027963f, -0.085272f, +0.011361f, -0.000966f, -0.001295f, +0.022383f, +0.029759f, -0.042877f, + -0.017437f, -0.018659f, +0.038020f, -0.003985f, +0.005971f, +0.021253f, -0.007327f, +0.005957f, +0.004812f, -0.022177f, + +0.008139f, +0.012766f, -0.002770f, +0.000454f, +0.013852f, +0.000345f, -0.000140f, +0.022375f, -0.000703f, +0.006239f, + -0.009399f, -0.019992f, -0.007441f, +0.009873f, -0.010246f, +0.013243f, +0.004791f, +0.003940f, +0.007177f, -0.011160f, + -0.009015f, +0.001905f, -0.001451f, -0.007623f, +0.006159f, +0.006931f, +0.008634f, +0.000251f, -0.007042f, +0.008933f, + +0.001032f, +0.006425f, +0.004031f, -0.005000f, -0.007313f, +0.008058f, -0.002168f, -0.001924f, -0.002952f, +0.002197f, + -0.006441f, -0.001330f, -0.000009f, -0.003912f, +0.000120f, -0.002280f, +0.000181f, +0.001012f, -0.003332f, -0.002702f, + +0.004319f, +0.002586f, +0.001295f, -0.004630f, +0.001697f, +0.000410f, -0.000647f, +0.001191f, -0.002886f, -0.001655f, + -0.001692f, +0.002060f, +0.000801f, +0.000192f, -0.000217f, -0.003349f, +0.000785f, -0.002358f, +0.000763f, -0.002172f, + +0.000402f, -0.001005f, +0.000645f, -0.000264f, +0.000274f, -0.000441f + }, + { + +0.001721f, +0.008658f, -0.001528f, +0.000175f, -0.004203f, -0.001887f, -0.001019f, -0.001995f, -0.004046f, -0.004844f, + -0.006169f, -0.001343f, +0.002458f, -0.023701f, +0.007345f, +0.013695f, -0.014621f, +0.005324f, -0.010133f, -0.037779f, + -0.000738f, -0.008332f, +0.024952f, -0.011038f, -0.001553f, -0.006757f, -0.026298f, -0.003354f, +0.000513f, +0.002232f, + +0.030902f, -0.002919f, +0.007607f, +0.011195f, -0.006776f, +0.003248f, +0.009239f, +0.003975f, -0.013565f, +0.007729f, + +0.004151f, +0.001395f, +0.003630f, +0.006142f, -0.006091f, -0.000485f, +0.006170f, -0.003299f, +0.008657f, -0.003141f, + -0.002036f, +0.004178f, +0.001390f, +0.001399f, +0.003134f, +0.003187f, -0.006238f, -0.001112f, -0.001059f, -0.003292f, + -0.000420f, +0.001248f, -0.005743f, -0.000975f, +0.000076f, -0.003343f, +0.000093f, +0.003340f, -0.003306f, +0.002113f, + -0.001234f, -0.004427f, +0.000251f, -0.003755f, +0.002960f, +0.002313f, -0.003009f, +0.000066f, +0.001747f, -0.001102f, + -0.000447f, -0.002622f, +0.002772f, +0.002207f, -0.001119f, +0.000363f, +0.002138f, -0.000466f, -0.000575f, -0.000068f, + -0.000990f, -0.001121f, +0.000690f, +0.000831f, -0.001234f, -0.000419f + }, + { + +0.018023f, +0.633921f, -0.026242f, -0.111686f, -0.005583f, -0.011666f, -0.035808f, -0.010925f, -0.008948f, +0.011412f, + -0.019942f, +0.017682f, +0.016157f, -0.016154f, +0.013791f, +0.005205f, -0.011818f, +0.030649f, -0.020483f, +0.002638f, + +0.005806f, -0.018613f, +0.010100f, -0.007539f, -0.001896f, +0.001916f, -0.002618f, +0.007084f, +0.004322f, +0.007769f, + -0.013499f, +0.000550f, +0.001018f, -0.000120f, -0.000305f, -0.002472f, +0.007481f, -0.017317f, -0.013335f, +0.011347f, + -0.006599f, +0.019842f, -0.002442f, +0.012800f, -0.010931f, +0.018751f, +0.006606f, -0.002183f, -0.000433f, +0.001797f, + -0.005444f, +0.007037f, +0.007683f, -0.003960f, +0.006926f, -0.001389f, +0.001126f, +0.012358f, -0.010072f, -0.002197f, + +0.004695f, -0.003682f, -0.002064f, -0.001255f, +0.003669f, +0.001921f, +0.002571f, -0.004610f, +0.000474f, +0.006374f, + +0.000799f, -0.001173f, +0.003380f, -0.005480f, -0.001386f, +0.002568f, +0.003744f, +0.002580f, +0.000946f, -0.002607f, + -0.000787f, +0.003901f, +0.000568f, -0.001289f, +0.000853f, +0.000594f, +0.002000f, +0.001391f, -0.001876f, -0.000666f, + -0.000878f, -0.000878f, +0.001875f, -0.001325f, +0.001402f, -0.000527f + }, + { + +0.002505f, -0.003858f, +0.001327f, +0.007595f, -0.002320f, +0.002663f, +0.003628f, -0.003769f, +0.003829f, +0.007108f, + -0.010727f, +0.003178f, +0.000139f, -0.002487f, -0.001382f, -0.006474f, +0.014173f, +0.015095f, -0.001372f, -0.031353f, + +0.009613f, -0.000732f, -0.008037f, +0.033642f, -0.016181f, +0.015848f, -0.001900f, +0.016473f, +0.006709f, -0.011287f, + +0.022215f, -0.021243f, -0.020875f, -0.003419f, -0.004804f, -0.004079f, -0.001714f, -0.014949f, +0.012116f, -0.007359f, + -0.008779f, +0.000518f, -0.003556f, +0.004809f, -0.010982f, -0.000994f, -0.000733f, +0.001157f, +0.000139f, +0.006444f, + +0.001957f, -0.003289f, +0.003059f, +0.009392f, +0.011161f, -0.004162f, +0.008411f, -0.002621f, +0.007499f, -0.005769f, + +0.006311f, +0.003691f, +0.003845f, +0.003939f, +0.007123f, +0.004599f, -0.003999f, -0.000252f, -0.000328f, +0.004613f, + +0.000962f, -0.003898f, -0.001734f, +0.002736f, -0.003261f, +0.003272f, +0.000031f, +0.001631f, -0.000753f, -0.000836f, + +0.003967f, +0.000695f, -0.002327f, +0.002540f, +0.001622f, -0.001759f, -0.000517f, -0.000504f, -0.000481f, +0.001234f, + +0.001850f, +0.003765f, -0.001715f, -0.001192f, +0.001147f, +0.000552f + }, + { + +0.051956f, +0.018443f, -0.023013f, -0.028398f, -0.006302f, +0.037503f, -0.043143f, -0.033437f, -0.001861f, +0.016735f, + +0.018859f, +0.002339f, +0.006114f, +0.021149f, -0.009888f, -0.001350f, -0.005069f, +0.010796f, -0.000351f, +0.014411f, + +0.012346f, +0.028574f, +0.013216f, -0.002495f, +0.011002f, +0.009395f, +0.011529f, -0.024963f, +0.001146f, +0.008687f, + -0.023229f, -0.005366f, -0.000718f, -0.013915f, -0.000142f, +0.011303f, -0.012201f, -0.005983f, +0.005800f, +0.005995f, + +0.013640f, +0.018392f, +0.003309f, +0.006902f, -0.010008f, -0.002752f, -0.006101f, +0.005517f, -0.000436f, +0.003859f, + -0.000584f, -0.003692f, -0.001703f, +0.004755f, -0.005722f, +0.004594f, -0.009666f, +0.003632f, +0.005127f, -0.003157f, + +0.000362f, +0.000421f, -0.001906f, -0.000736f, +0.002640f, +0.007180f, -0.005149f, -0.002009f, +0.000370f, -0.006898f, + -0.004942f, -0.007960f, +0.000641f, -0.002853f, +0.003776f, +0.003083f, -0.000796f, +0.000888f, -0.002921f, +0.003191f, + +0.000211f, +0.003112f, +0.005503f, +0.000363f, -0.004535f, -0.000497f, +0.004586f, +0.000803f, -0.000571f, -0.002973f, + +0.000256f, -0.002515f, +0.002553f, +0.000967f, +0.001019f, +0.000865f + }, + { + +0.005156f, +0.052656f, -0.021161f, +0.017083f, -0.028034f, -0.007741f, -0.006139f, +0.001879f, -0.016413f, -0.014560f, + -0.024317f, -0.018078f, -0.023096f, +0.031070f, +0.007857f, -0.017923f, +0.031521f, -0.027370f, +0.017271f, +0.019836f, + -0.002567f, -0.013734f, +0.028442f, -0.020136f, -0.001885f, -0.014219f, -0.011746f, -0.011167f, +0.002654f, +0.004908f, + -0.001612f, +0.009096f, -0.001823f, -0.007359f, -0.002936f, +0.004344f, -0.001525f, -0.002294f, -0.011121f, -0.010337f, + +0.002226f, -0.000270f, -0.001192f, +0.009641f, -0.004348f, +0.005007f, +0.000654f, -0.008548f, +0.003876f, +0.007049f, + +0.000594f, -0.006406f, -0.004741f, +0.000930f, -0.004533f, -0.004131f, +0.004171f, -0.005732f, +0.005866f, +0.003632f, + -0.006482f, +0.001753f, -0.001757f, -0.002092f, -0.000866f, -0.000089f, -0.001766f, +0.001543f, +0.002333f, -0.003232f, + +0.001537f, -0.005505f, -0.003464f, -0.002249f, +0.000693f, +0.000807f, +0.000026f, -0.000090f, +0.003647f, +0.003848f, + -0.001978f, -0.000774f, -0.002878f, +0.001238f, +0.001464f, -0.001967f, -0.000915f, -0.000304f, -0.001236f, -0.000861f, + +0.001089f, -0.000343f, -0.000596f, +0.001525f, -0.001522f, +0.001042f + }, + { + -0.011099f, -0.212850f, +0.002362f, +0.034963f, +0.020819f, +0.033977f, -0.049289f, -0.005131f, +0.029513f, +0.010411f, + +0.019282f, -0.031223f, +0.037386f, +0.003170f, +0.014379f, -0.007149f, +0.006831f, +0.026566f, -0.027442f, -0.012647f, + +0.008352f, -0.012377f, -0.005973f, -0.015999f, -0.003059f, +0.012190f, -0.005849f, +0.016254f, +0.009644f, -0.006248f, + +0.010525f, +0.021898f, +0.010752f, -0.005351f, -0.003955f, -0.000265f, -0.024390f, +0.014423f, -0.027866f, -0.012621f, + -0.006770f, -0.004974f, -0.014990f, +0.009439f, -0.017529f, +0.000458f, +0.005210f, -0.012823f, -0.012380f, +0.006048f, + +0.003762f, -0.002426f, -0.010486f, +0.013083f, -0.014682f, +0.001639f, +0.000314f, -0.007300f, +0.000675f, +0.001100f, + +0.005360f, -0.003501f, +0.000326f, -0.010897f, -0.001172f, +0.002017f, -0.002989f, +0.000126f, +0.003422f, +0.004249f, + -0.001749f, -0.000806f, +0.002938f, +0.001341f, +0.002661f, +0.002133f, -0.000130f, -0.002961f, -0.002481f, -0.000593f, + -0.002062f, -0.004057f, -0.001334f, +0.003364f, +0.000022f, -0.002447f, +0.001137f, -0.000217f, +0.002001f, -0.001642f, + -0.000007f, +0.000835f, -0.002719f, +0.003519f, +0.001135f, +0.000198f + }, + { + -0.003569f, +0.072683f, +0.011752f, +0.014637f, -0.013239f, -0.012070f, -0.007541f, -0.006754f, -0.000309f, +0.013250f, + +0.002155f, +0.019523f, +0.001087f, +0.000956f, -0.061191f, +0.051701f, +0.008441f, -0.013205f, -0.022764f, -0.011292f, + +0.042790f, -0.018564f, -0.026402f, +0.016613f, -0.056795f, +0.007648f, +0.043565f, -0.014042f, -0.040266f, +0.000370f, + -0.009875f, +0.004821f, +0.004101f, -0.009637f, -0.000144f, -0.016138f, -0.011128f, +0.004740f, -0.009427f, -0.005598f, + -0.000312f, +0.009135f, +0.013732f, -0.010150f, +0.001250f, +0.007043f, -0.000173f, -0.002796f, +0.007841f, +0.002721f, + +0.004117f, -0.006580f, -0.006143f, +0.004521f, +0.002555f, +0.007925f, +0.006507f, +0.004244f, +0.004357f, +0.001410f, + +0.001030f, +0.003370f, -0.000424f, +0.000915f, +0.005336f, +0.000775f, +0.005440f, -0.002799f, -0.001821f, +0.000881f, + -0.002646f, -0.001869f, -0.003655f, -0.003332f, -0.003460f, -0.005529f, +0.003896f, -0.001681f, +0.000260f, +0.002312f, + +0.000661f, -0.005992f, -0.001561f, -0.005087f, +0.001143f, +0.001357f, -0.001965f, +0.004422f, +0.001121f, -0.001419f, + +0.000304f, -0.000595f, -0.004998f, +0.000330f, -0.002541f, +0.002708f + }, + { + +0.032924f, -0.108289f, +0.030183f, -0.016501f, -0.008445f, +0.021362f, -0.014022f, -0.017797f, -0.007686f, +0.033555f, + -0.015302f, -0.004810f, +0.015518f, +0.014284f, +0.054385f, +0.000096f, +0.013359f, -0.013976f, +0.010824f, -0.008197f, + -0.022984f, -0.011956f, -0.012152f, +0.019100f, +0.002486f, -0.002699f, +0.017226f, -0.013573f, -0.000429f, -0.008010f, + -0.004320f, -0.012837f, +0.008176f, +0.008373f, +0.016388f, +0.009662f, -0.012347f, -0.024062f, +0.009195f, -0.015805f, + +0.010238f, -0.005638f, -0.008890f, -0.002505f, -0.010561f, -0.000904f, +0.000709f, +0.012889f, +0.002948f, +0.000190f, + +0.003971f, +0.005344f, -0.016474f, +0.002423f, -0.009055f, +0.005301f, -0.002252f, +0.000607f, -0.007092f, -0.008791f, + +0.001033f, +0.005051f, -0.003843f, +0.001845f, -0.001320f, +0.002535f, -0.000173f, -0.001859f, -0.002508f, +0.003625f, + +0.003403f, +0.000692f, -0.001808f, +0.004619f, +0.003696f, +0.001458f, -0.005104f, -0.001429f, -0.003824f, -0.002663f, + -0.000867f, +0.003361f, -0.000535f, +0.002052f, -0.000117f, +0.001958f, -0.005088f, +0.001486f, +0.000388f, -0.001656f, + -0.000179f, +0.001500f, -0.000197f, -0.003135f, +0.002232f, +0.002172f + }, + { + -0.001229f, -0.116353f, -0.009447f, +0.011987f, +0.000065f, -0.002468f, -0.016378f, +0.007616f, -0.014156f, +0.013628f, + -0.015270f, +0.030260f, +0.003632f, +0.002344f, +0.108295f, +0.029637f, -0.010245f, -0.019538f, +0.006831f, +0.026687f, + -0.012659f, -0.013751f, +0.024303f, -0.017081f, +0.012529f, -0.004175f, -0.017037f, -0.035774f, -0.033732f, -0.013657f, + +0.017156f, -0.001631f, +0.018480f, -0.013004f, -0.001772f, -0.006999f, -0.021572f, -0.005404f, -0.007484f, +0.002767f, + -0.012445f, -0.013279f, +0.014169f, -0.002109f, -0.018485f, -0.003872f, +0.008307f, -0.006116f, -0.005092f, +0.012073f, + -0.010634f, -0.006720f, -0.000271f, +0.000157f, -0.008268f, +0.004652f, +0.003420f, +0.003989f, -0.001285f, +0.002622f, + +0.003619f, +0.003161f, -0.003624f, +0.004470f, +0.007247f, +0.005294f, -0.005198f, +0.000267f, -0.002405f, +0.006996f, + +0.001598f, -0.003344f, +0.005496f, -0.005538f, +0.002462f, +0.002695f, +0.002028f, +0.003259f, +0.001063f, -0.003078f, + -0.000220f, -0.005369f, -0.001786f, -0.001928f, +0.002737f, -0.001042f, -0.001066f, -0.000061f, +0.000063f, +0.002455f, + +0.000675f, -0.001008f, -0.002261f, -0.000650f, -0.000792f, +0.002264f + } + }, + { + { + +0.034785f, -0.411669f, -0.048043f, -0.071052f, -0.004066f, -0.010813f, -0.005819f, +0.018226f, -0.034854f, -0.025564f, + +0.002220f, +0.014767f, -0.004543f, +0.007869f, -0.010034f, +0.003300f, +0.011210f, -0.000874f, +0.007211f, -0.001749f, + -0.022683f, -0.008788f, +0.009064f, +0.003528f, +0.018164f, -0.000419f, -0.005182f, +0.011555f, -0.002720f, -0.009322f, + -0.001750f, -0.009508f, +0.011250f, -0.018684f, -0.000987f, -0.002452f, +0.003924f, -0.006085f, +0.012819f, -0.002272f, + +0.004725f, +0.005397f, -0.000623f, -0.009970f, +0.000822f, -0.007647f, +0.010033f, -0.000071f, +0.005577f, -0.007286f, + +0.000693f, -0.015233f, -0.007614f, -0.002114f, -0.003198f, +0.004099f, +0.003779f, +0.000557f, +0.000095f, +0.010357f, + -0.001046f, -0.000619f, -0.000554f, +0.000948f, -0.004153f, +0.006517f, +0.001787f, +0.003859f, -0.003291f, -0.004603f, + +0.001222f, -0.002444f, -0.000271f, +0.003897f, +0.002857f, +0.000866f, -0.004840f, -0.002097f, +0.000536f, +0.003207f, + -0.001316f, +0.003577f, -0.000885f, +0.002590f, -0.000724f, -0.001439f, +0.000588f, +0.000831f, +0.001375f, +0.004320f, + +0.002853f, -0.001915f, -0.000488f, -0.000852f, +0.000433f, -0.000428f + }, + { + -0.001293f, +0.039184f, +0.033845f, -0.023080f, -0.001203f, +0.002494f, +0.002470f, +0.003664f, +0.006774f, +0.000528f, + -0.002734f, +0.014951f, -0.004755f, -0.024213f, +0.011222f, +0.011645f, -0.049156f, +0.038523f, -0.004897f, -0.036733f, + +0.020967f, -0.003999f, +0.000193f, +0.000885f, -0.014571f, +0.030496f, +0.006874f, -0.001203f, -0.006070f, +0.010909f, + +0.009568f, -0.005017f, -0.001563f, -0.010868f, +0.000822f, +0.000695f, -0.001171f, -0.010094f, -0.008291f, +0.003749f, + -0.002978f, -0.011433f, -0.001170f, +0.000764f, +0.000780f, +0.005414f, -0.005465f, +0.011287f, +0.000536f, +0.004727f, + -0.004843f, -0.002845f, +0.011654f, -0.001390f, +0.002173f, -0.002665f, +0.001006f, -0.001602f, +0.001947f, -0.002830f, + +0.004997f, -0.001189f, +0.007149f, +0.005784f, +0.001965f, +0.006399f, -0.009858f, -0.006075f, +0.000689f, +0.002675f, + +0.002574f, +0.006824f, -0.000904f, +0.002302f, -0.004802f, +0.000604f, -0.001453f, +0.001574f, +0.002651f, -0.000946f, + -0.001675f, -0.000021f, -0.001234f, -0.000380f, -0.001375f, +0.000258f, +0.002995f, -0.002174f, -0.001890f, -0.000501f, + +0.003905f, -0.002183f, +0.000707f, +0.000417f, +0.000056f, +0.003048f + }, + { + +0.007699f, +0.135897f, -0.055987f, +0.033564f, +0.008070f, +0.007987f, +0.000232f, +0.017649f, +0.016668f, +0.008725f, + -0.015682f, +0.024810f, -0.023390f, -0.050247f, +0.016096f, +0.019654f, +0.011281f, -0.011224f, +0.005452f, +0.009495f, + -0.007045f, +0.000154f, +0.022755f, +0.010446f, +0.018267f, -0.003697f, +0.016266f, +0.010157f, -0.014198f, +0.000988f, + +0.006283f, -0.004817f, +0.024579f, -0.003454f, -0.012686f, -0.007672f, +0.011828f, +0.005514f, -0.007737f, +0.002452f, + +0.002608f, -0.008904f, +0.003757f, +0.009641f, +0.009093f, +0.015652f, +0.003466f, +0.015100f, -0.002967f, +0.000514f, + +0.004683f, -0.002866f, -0.002103f, -0.000580f, +0.009962f, +0.001190f, -0.000600f, -0.003229f, -0.002579f, -0.009529f, + +0.000384f, -0.003536f, -0.002508f, -0.002156f, -0.005764f, -0.000745f, -0.006269f, -0.005266f, +0.000927f, +0.001595f, + +0.005977f, -0.000161f, -0.003903f, -0.004407f, -0.000824f, +0.002710f, -0.001065f, +0.001518f, +0.002798f, -0.000194f, + +0.001100f, +0.000927f, -0.000619f, +0.002081f, +0.000006f, +0.001621f, -0.001493f, +0.001301f, +0.003944f, -0.000506f, + +0.000375f, -0.000139f, -0.002778f, -0.001512f, +0.000901f, -0.000254f + }, + { + -0.058877f, -0.266754f, +0.013659f, +0.007192f, -0.016488f, -0.002834f, -0.003073f, -0.007451f, -0.009730f, +0.030302f, + +0.022208f, +0.014122f, -0.003134f, -0.004552f, +0.003938f, +0.003301f, -0.014594f, +0.033658f, +0.010905f, -0.019931f, + -0.003977f, +0.012135f, +0.006173f, -0.014937f, -0.000881f, +0.012679f, -0.021616f, +0.004482f, +0.002045f, +0.014634f, + -0.005495f, +0.004638f, -0.003402f, +0.000526f, -0.009682f, +0.011468f, -0.003823f, -0.008275f, -0.014323f, +0.006273f, + +0.019618f, -0.002659f, +0.005495f, -0.004030f, -0.003796f, -0.002649f, +0.015312f, -0.004529f, -0.002502f, +0.007516f, + +0.000676f, +0.005374f, -0.002651f, -0.002214f, -0.003674f, +0.002034f, +0.005708f, -0.002771f, -0.006190f, +0.004416f, + +0.000938f, +0.000616f, -0.004850f, -0.003408f, -0.000281f, -0.000570f, -0.000929f, +0.006157f, -0.001826f, +0.003144f, + +0.003189f, -0.000510f, +0.001813f, +0.000138f, -0.000154f, +0.000022f, -0.000743f, -0.002785f, +0.002102f, +0.005415f, + +0.001261f, -0.001142f, +0.001840f, -0.000292f, +0.000301f, -0.001733f, -0.002314f, +0.000039f, +0.001215f, -0.000360f, + +0.001079f, +0.004013f, +0.001621f, -0.001532f, -0.000671f, -0.001315f + }, + { + +0.003979f, +0.007773f, -0.011999f, +0.001830f, -0.002923f, -0.000717f, -0.002854f, +0.001927f, -0.007204f, -0.000662f, + +0.002563f, +0.012974f, +0.024198f, +0.026366f, -0.014580f, -0.031638f, -0.023689f, -0.011094f, +0.116810f, -0.040100f, + -0.026321f, -0.018644f, +0.017582f, +0.003961f, -0.017723f, +0.008276f, +0.003244f, -0.023939f, -0.019767f, +0.015274f, + -0.000055f, +0.013827f, +0.014385f, +0.003272f, +0.001255f, -0.016321f, +0.022532f, -0.000400f, -0.012905f, +0.005230f, + +0.000245f, +0.000863f, +0.003055f, -0.006377f, -0.021759f, +0.018589f, +0.008106f, -0.000510f, +0.009264f, -0.001297f, + -0.007813f, +0.000705f, -0.001987f, +0.002012f, -0.016000f, -0.003275f, -0.001996f, +0.000372f, +0.004254f, +0.009952f, + +0.002688f, -0.003453f, +0.001386f, -0.008523f, -0.002697f, +0.004441f, +0.000805f, +0.001206f, -0.006290f, +0.001173f, + +0.004887f, +0.004249f, +0.001963f, +0.000810f, +0.000204f, -0.004990f, +0.006743f, +0.000727f, -0.000171f, +0.003112f, + +0.006191f, +0.001550f, +0.002526f, -0.005204f, -0.002105f, +0.001707f, +0.003820f, +0.002092f, -0.000657f, -0.001305f, + -0.002839f, +0.000990f, +0.000468f, -0.000726f, -0.002974f, -0.000136f + }, + { + -0.097957f, -0.401080f, +0.019526f, -0.072362f, -0.005722f, +0.003428f, -0.012562f, -0.007211f, +0.021261f, -0.007603f, + +0.027713f, -0.011745f, +0.012201f, -0.008775f, +0.015873f, +0.032750f, -0.003393f, +0.011050f, +0.015769f, -0.021288f, + +0.012196f, +0.020865f, +0.002499f, -0.006816f, +0.000671f, +0.005528f, -0.005459f, +0.007744f, +0.004307f, +0.007159f, + -0.010696f, -0.017727f, -0.018041f, +0.004400f, -0.009728f, +0.003215f, +0.011284f, +0.013230f, +0.001689f, -0.009888f, + -0.001339f, +0.001778f, -0.011285f, -0.014767f, -0.007911f, -0.001298f, -0.001266f, -0.006422f, -0.009305f, -0.001541f, + -0.005102f, +0.005548f, +0.006761f, -0.002319f, -0.002685f, +0.001547f, -0.002443f, +0.002081f, -0.008278f, +0.000670f, + +0.003098f, -0.002444f, -0.001347f, -0.000103f, +0.001201f, -0.001501f, +0.001924f, +0.000339f, -0.002033f, -0.000199f, + +0.003473f, +0.000944f, +0.003180f, -0.004349f, +0.000732f, -0.002863f, -0.001250f, +0.000745f, -0.002574f, +0.000015f, + -0.001505f, +0.002113f, +0.000250f, -0.000887f, +0.000710f, -0.001408f, +0.002321f, +0.001215f, +0.003953f, -0.001081f, + +0.000381f, -0.002860f, -0.000567f, -0.000148f, -0.000723f, -0.001994f + }, + { + +0.000466f, +0.007609f, +0.006585f, -0.001491f, -0.003936f, -0.001401f, +0.000428f, -0.001666f, -0.001953f, +0.001979f, + +0.006658f, +0.003031f, +0.009586f, +0.009072f, +0.032523f, -0.013270f, -0.018076f, +0.022359f, +0.005929f, -0.017369f, + +0.025000f, +0.007259f, +0.020606f, -0.016630f, +0.020423f, +0.029491f, -0.000029f, -0.010769f, +0.015392f, +0.009119f, + -0.016490f, -0.016986f, +0.026344f, +0.025965f, -0.008674f, -0.017868f, -0.008609f, -0.010395f, -0.021875f, +0.007033f, + -0.001287f, -0.004843f, -0.006768f, -0.003406f, -0.007182f, -0.000057f, +0.003172f, -0.012072f, +0.007756f, -0.000894f, + +0.004415f, +0.009260f, -0.004924f, -0.001939f, +0.006942f, -0.000259f, -0.001022f, +0.004682f, -0.001514f, -0.005875f, + -0.001406f, +0.006389f, -0.005842f, -0.005635f, +0.000790f, +0.001917f, -0.000816f, +0.004934f, -0.001457f, -0.001276f, + +0.000347f, +0.000741f, +0.002184f, -0.001447f, +0.000947f, +0.000779f, +0.001301f, +0.002367f, +0.001245f, +0.000785f, + +0.000911f, -0.004669f, +0.000117f, +0.000102f, -0.000410f, +0.001779f, +0.001118f, -0.000742f, +0.000723f, -0.000222f, + -0.002409f, -0.004254f, -0.002153f, +0.000122f, -0.002381f, +0.000564f + }, + { + -0.072515f, +0.596569f, +0.025947f, -0.069445f, +0.025489f, -0.008953f, -0.025128f, -0.004660f, -0.003404f, +0.030305f, + -0.009581f, +0.002189f, +0.001874f, -0.034434f, +0.012993f, +0.025900f, -0.012674f, +0.039040f, -0.037145f, -0.018999f, + +0.007883f, -0.013913f, +0.013027f, -0.002879f, -0.001013f, +0.001372f, +0.004972f, +0.009126f, +0.008791f, +0.019539f, + +0.008864f, +0.010149f, -0.002993f, +0.004134f, +0.006864f, +0.023985f, +0.017573f, -0.010622f, -0.006059f, +0.009405f, + -0.004461f, +0.012520f, -0.002483f, +0.018114f, +0.001689f, +0.018918f, +0.004025f, -0.004422f, -0.007119f, +0.000785f, + +0.002772f, +0.013707f, +0.004151f, -0.014921f, -0.000276f, -0.003990f, -0.000920f, +0.013972f, -0.005301f, -0.000748f, + +0.000729f, +0.001851f, +0.003848f, +0.000253f, +0.005764f, -0.001289f, +0.001725f, -0.002784f, +0.001323f, +0.002724f, + -0.003212f, -0.000574f, +0.003253f, -0.004442f, +0.003442f, +0.001472f, +0.000625f, +0.003271f, +0.001136f, -0.001624f, + -0.001424f, +0.001716f, +0.000298f, +0.000154f, +0.000474f, -0.002412f, -0.000286f, +0.001576f, -0.002363f, -0.000835f, + -0.000233f, +0.001028f, +0.001131f, -0.002289f, +0.000415f, +0.000449f + }, + { + -0.000204f, -0.017212f, +0.000793f, +0.007960f, -0.005617f, +0.000641f, -0.000293f, -0.004302f, +0.007590f, +0.003527f, + -0.008787f, +0.013626f, -0.014980f, +0.007595f, +0.030818f, -0.047245f, -0.022460f, -0.009840f, -0.009901f, -0.010417f, + -0.010738f, -0.034700f, -0.040831f, +0.041559f, +0.026445f, +0.031560f, +0.008579f, +0.012615f, +0.004740f, +0.001666f, + +0.021021f, -0.029466f, -0.018331f, +0.005577f, +0.004082f, +0.006172f, +0.002001f, -0.009007f, +0.020873f, -0.006612f, + -0.007470f, +0.006058f, -0.003542f, +0.000304f, -0.007591f, -0.002592f, -0.005793f, +0.006840f, +0.006624f, +0.003912f, + -0.005288f, -0.007691f, -0.001413f, +0.007885f, +0.010512f, -0.001106f, +0.006672f, -0.003877f, +0.005112f, -0.009716f, + +0.007086f, -0.001545f, -0.007034f, +0.000026f, +0.005363f, +0.004881f, -0.001381f, -0.002037f, -0.001507f, +0.001586f, + +0.001668f, -0.001048f, -0.003573f, +0.003512f, +0.001687f, +0.004963f, -0.003719f, -0.000067f, -0.002312f, -0.004009f, + +0.002514f, -0.001541f, -0.002849f, +0.000646f, +0.000042f, -0.001205f, -0.000008f, +0.001165f, -0.000520f, -0.000673f, + -0.001020f, +0.002573f, -0.001217f, +0.000262f, +0.002526f, +0.000448f + }, + { + -0.057835f, -0.034718f, +0.043570f, -0.023371f, -0.000680f, +0.062572f, -0.037908f, -0.041711f, -0.022169f, -0.022024f, + -0.004249f, -0.005590f, +0.009538f, +0.021694f, +0.001228f, +0.023930f, +0.020965f, +0.028952f, +0.009755f, +0.025065f, + +0.008384f, +0.002273f, -0.014236f, -0.020876f, +0.007363f, +0.004391f, -0.000870f, -0.024444f, -0.004137f, -0.005359f, + -0.025063f, -0.002917f, -0.004000f, -0.014557f, -0.002765f, +0.005990f, -0.004949f, +0.011344f, +0.008806f, -0.004114f, + +0.005755f, +0.010762f, -0.004571f, +0.004040f, -0.006901f, -0.002414f, -0.003377f, +0.010123f, +0.001901f, +0.002497f, + -0.005537f, -0.005656f, +0.003999f, +0.008961f, -0.004025f, +0.008057f, -0.008615f, -0.000352f, +0.001662f, -0.002600f, + +0.008745f, +0.007726f, +0.002863f, +0.000060f, -0.000616f, +0.004965f, -0.003001f, +0.001170f, +0.000631f, -0.001656f, + +0.005877f, -0.004800f, -0.000007f, -0.002515f, +0.004242f, +0.002881f, -0.002913f, +0.003823f, +0.000994f, +0.001578f, + -0.001846f, +0.001580f, +0.002609f, -0.000463f, -0.001791f, +0.000554f, +0.000544f, -0.001739f, +0.001190f, -0.002086f, + +0.002469f, -0.000522f, +0.000911f, +0.000143f, +0.000654f, -0.000149f + }, + { + -0.003110f, +0.093411f, -0.009615f, -0.005521f, -0.025424f, -0.001179f, -0.015762f, +0.004470f, -0.013559f, -0.011932f, + -0.008876f, -0.010073f, -0.021996f, +0.020425f, -0.023243f, -0.034277f, +0.026666f, -0.029870f, +0.040146f, +0.044435f, + -0.002001f, -0.026367f, +0.027399f, -0.028136f, -0.000460f, +0.004721f, -0.005306f, -0.010034f, +0.012338f, +0.014467f, + -0.014406f, -0.002411f, -0.005087f, +0.001029f, +0.012901f, +0.017652f, -0.007048f, -0.012631f, -0.011188f, -0.007668f, + +0.009264f, +0.003377f, -0.009664f, +0.004068f, -0.017950f, -0.000104f, +0.007525f, +0.002615f, +0.009140f, +0.005608f, + +0.001491f, -0.009041f, -0.003886f, +0.008571f, +0.005676f, +0.002823f, +0.003675f, -0.007173f, +0.006407f, +0.004116f, + -0.003383f, -0.002068f, -0.001722f, -0.002463f, -0.003070f, -0.000678f, -0.006077f, -0.003745f, +0.001571f, -0.002043f, + +0.006263f, +0.000196f, +0.001345f, +0.000267f, +0.002086f, +0.001097f, +0.003530f, +0.002480f, -0.000476f, +0.002446f, + -0.003085f, +0.000427f, +0.001598f, -0.000236f, +0.002205f, +0.000396f, +0.001596f, +0.002216f, +0.001865f, +0.001064f, + +0.000390f, -0.002191f, +0.000146f, +0.002194f, -0.002345f, +0.001653f + }, + { + +0.059475f, -0.123507f, -0.023820f, +0.011616f, -0.002404f, +0.043116f, -0.011360f, -0.018106f, -0.013553f, +0.009126f, + +0.053924f, -0.005397f, +0.034502f, -0.024910f, -0.017109f, -0.014243f, -0.005824f, +0.026454f, -0.032274f, -0.028472f, + +0.003038f, +0.005600f, +0.009206f, -0.015857f, -0.016476f, -0.002183f, -0.023039f, +0.006396f, -0.001950f, -0.033417f, + -0.004710f, +0.019935f, +0.003722f, -0.010986f, +0.005192f, +0.023179f, -0.017782f, +0.021960f, -0.011109f, -0.008585f, + -0.000975f, -0.005872f, -0.025796f, +0.015190f, -0.005582f, +0.005615f, +0.000886f, -0.004792f, -0.006858f, +0.004199f, + -0.000538f, +0.002781f, -0.010588f, +0.008980f, -0.005268f, +0.007055f, -0.001657f, -0.001103f, +0.002374f, -0.003614f, + -0.003755f, -0.004907f, +0.001211f, -0.005219f, +0.004036f, -0.000133f, -0.002754f, -0.000160f, +0.003976f, +0.006217f, + +0.001933f, +0.001630f, +0.000549f, -0.000195f, +0.000222f, +0.000347f, -0.000689f, -0.002173f, -0.003831f, -0.001292f, + +0.003146f, -0.001275f, -0.002956f, +0.000723f, -0.001230f, -0.000274f, -0.000222f, -0.001728f, +0.001017f, -0.002511f, + +0.002041f, +0.001635f, -0.001220f, +0.002588f, -0.000573f, +0.000720f + }, + { + +0.005524f, +0.063126f, -0.008834f, +0.006740f, -0.008531f, -0.001339f, -0.004167f, -0.002037f, -0.001597f, +0.001697f, + -0.006916f, +0.006410f, -0.005950f, -0.015378f, -0.091573f, +0.010342f, -0.027504f, -0.005887f, -0.004863f, -0.016601f, + +0.018551f, +0.053136f, +0.021345f, +0.021232f, -0.025779f, -0.002039f, +0.016523f, -0.011786f, -0.031498f, -0.001396f, + +0.016250f, +0.000385f, +0.000880f, -0.001362f, -0.001281f, -0.014773f, -0.027119f, +0.006725f, -0.003237f, -0.002042f, + +0.008129f, +0.007876f, +0.006028f, -0.022180f, -0.011171f, +0.000404f, -0.006301f, -0.007841f, +0.009277f, +0.002162f, + +0.010037f, -0.007461f, -0.011771f, -0.005721f, -0.004230f, +0.000989f, -0.000969f, +0.000033f, -0.001014f, -0.006580f, + -0.006150f, +0.004750f, -0.000945f, -0.002871f, +0.004559f, -0.004419f, -0.004079f, -0.005650f, +0.000336f, +0.000721f, + -0.000835f, -0.001756f, -0.002027f, -0.002697f, -0.000960f, -0.001188f, +0.006269f, -0.000091f, +0.002989f, +0.001186f, + +0.000686f, -0.000526f, +0.002657f, -0.004156f, +0.001152f, +0.001025f, -0.001310f, +0.003247f, +0.000337f, +0.000925f, + +0.001298f, +0.000274f, -0.004402f, +0.000505f, -0.003932f, +0.000350f + }, + { + -0.003571f, -0.164858f, +0.016401f, -0.022974f, -0.017958f, +0.021946f, -0.021610f, -0.009809f, -0.010155f, +0.001963f, + -0.018275f, -0.002938f, +0.019488f, -0.006977f, +0.006131f, -0.002795f, +0.000249f, -0.030284f, +0.003154f, +0.027671f, + +0.015202f, +0.011324f, -0.010826f, +0.006885f, +0.007566f, +0.004901f, +0.001812f, -0.023035f, -0.005449f, -0.006892f, + -0.005038f, -0.016119f, -0.009830f, -0.012103f, +0.015117f, +0.016876f, +0.003376f, -0.011479f, +0.015911f, -0.013574f, + +0.017643f, +0.018160f, +0.004360f, -0.007991f, -0.008141f, +0.001369f, +0.001200f, +0.006548f, -0.007924f, -0.014117f, + -0.000616f, +0.008998f, -0.010099f, +0.002033f, -0.006839f, +0.007774f, -0.004766f, +0.005381f, +0.004724f, -0.005042f, + -0.001698f, +0.004013f, -0.008315f, +0.003127f, -0.000198f, -0.002778f, -0.005264f, -0.002538f, -0.006938f, +0.002863f, + +0.005044f, +0.003017f, -0.000427f, -0.002854f, -0.009234f, -0.004094f, -0.002882f, +0.005447f, +0.001373f, +0.000499f, + +0.003007f, +0.003682f, -0.002091f, +0.000801f, +0.001142f, +0.001347f, -0.007057f, +0.001558f, +0.002664f, -0.001415f, + +0.000568f, +0.001894f, -0.000265f, -0.002112f, +0.000216f, +0.000395f + }, + { + -0.000373f, -0.112908f, -0.002404f, +0.000624f, -0.016536f, +0.001305f, -0.007131f, +0.004081f, -0.021309f, +0.010816f, + -0.020714f, +0.021344f, +0.009835f, -0.019338f, +0.066981f, +0.023916f, -0.032394f, -0.034077f, -0.004129f, +0.022643f, + +0.010299f, -0.012085f, +0.006255f, -0.021281f, +0.008668f, -0.013184f, -0.010839f, -0.017714f, -0.012799f, -0.022033f, + -0.006802f, -0.016686f, +0.014994f, -0.012108f, -0.004545f, +0.005877f, -0.005585f, -0.006098f, -0.000748f, +0.027171f, + -0.000730f, -0.018381f, +0.012030f, +0.001664f, -0.005985f, -0.005400f, -0.008495f, -0.010080f, +0.004610f, +0.016847f, + -0.003837f, -0.003895f, +0.001980f, +0.008444f, +0.001217f, +0.007748f, -0.000652f, -0.004964f, -0.006970f, -0.000192f, + +0.006555f, +0.003675f, -0.011743f, -0.005323f, -0.000986f, +0.003985f, -0.006644f, -0.002322f, -0.001523f, +0.005294f, + +0.001174f, -0.007333f, +0.001373f, -0.007705f, +0.002749f, +0.005145f, -0.000369f, -0.001582f, +0.000181f, +0.003524f, + +0.000265f, -0.004071f, +0.003132f, -0.002554f, +0.001466f, -0.001177f, +0.001017f, +0.000441f, -0.001214f, -0.000008f, + +0.002971f, +0.002386f, +0.000019f, -0.000730f, -0.002038f, +0.000243f + } + }, + { + { + -0.024666f, -0.386495f, +0.006687f, -0.040235f, -0.016992f, -0.009858f, -0.001441f, -0.008552f, +0.009319f, -0.021058f, + -0.020651f, +0.014678f, -0.011593f, +0.011300f, -0.032193f, +0.013898f, +0.007787f, +0.000868f, -0.002547f, +0.000682f, + -0.014983f, +0.004092f, -0.004359f, +0.000901f, +0.019922f, -0.007792f, +0.007555f, +0.012273f, -0.003594f, -0.003502f, + -0.001065f, -0.009232f, -0.008214f, -0.009473f, -0.014336f, +0.019323f, -0.002657f, +0.006253f, -0.002080f, -0.006923f, + +0.012878f, -0.004245f, +0.008278f, -0.005737f, -0.001753f, -0.004939f, +0.001413f, -0.002900f, +0.007030f, -0.001425f, + -0.008522f, -0.012145f, +0.000777f, -0.017413f, +0.008776f, +0.002333f, -0.010337f, -0.000922f, +0.010440f, +0.009947f, + -0.006379f, +0.009091f, -0.005979f, +0.002290f, -0.008000f, +0.008549f, +0.002491f, +0.001281f, -0.001612f, -0.002192f, + -0.001464f, +0.003137f, -0.000875f, +0.002894f, +0.000132f, +0.001824f, -0.002800f, -0.002332f, +0.002021f, +0.000251f, + +0.001193f, -0.000793f, +0.000456f, +0.002440f, -0.001988f, +0.000668f, -0.000874f, +0.001099f, +0.004113f, +0.002324f, + -0.000732f, +0.001862f, -0.003454f, -0.000520f, +0.002088f, -0.000575f + }, + { + +0.001678f, +0.087913f, -0.002715f, -0.028931f, +0.000898f, +0.003788f, +0.000793f, +0.012403f, -0.000100f, +0.008515f, + +0.004081f, +0.010387f, -0.003950f, -0.005575f, -0.013550f, -0.022437f, -0.017553f, +0.016652f, -0.022768f, -0.016601f, + +0.027645f, +0.015964f, -0.034196f, +0.018904f, +0.009876f, -0.003359f, +0.013717f, -0.013714f, -0.000007f, +0.016062f, + -0.004250f, +0.008619f, -0.010043f, -0.003028f, +0.002565f, +0.005133f, -0.008022f, -0.002286f, -0.022032f, +0.002964f, + +0.003309f, +0.000679f, -0.000171f, -0.006284f, -0.006169f, +0.000080f, +0.006964f, +0.002039f, +0.008553f, -0.002347f, + -0.007344f, +0.008443f, +0.007494f, +0.000680f, +0.000587f, +0.001189f, -0.003831f, +0.001708f, -0.002403f, -0.001345f, + +0.003185f, +0.003318f, +0.003378f, +0.003921f, +0.007458f, -0.000583f, -0.001972f, -0.005491f, -0.001422f, +0.003382f, + +0.008463f, -0.000611f, +0.002262f, -0.001872f, -0.002501f, +0.000698f, +0.000505f, +0.000516f, +0.003444f, -0.001804f, + -0.000286f, -0.001800f, +0.001254f, -0.002004f, -0.000140f, -0.001274f, +0.002971f, -0.000874f, +0.000332f, -0.001089f, + +0.000666f, -0.001069f, -0.000847f, +0.003214f, -0.000767f, +0.001108f + }, + { + -0.008126f, +0.014413f, +0.062132f, +0.024371f, +0.015977f, +0.004152f, -0.005633f, +0.025904f, -0.006054f, +0.023788f, + -0.022709f, +0.035594f, -0.045069f, -0.019556f, +0.000440f, +0.014842f, -0.006824f, +0.014324f, -0.004422f, +0.005167f, + +0.002277f, +0.003701f, +0.015531f, +0.014909f, +0.019328f, -0.001853f, +0.019692f, +0.007850f, -0.018342f, -0.006983f, + +0.003484f, +0.020341f, +0.012141f, +0.002055f, -0.022595f, +0.010275f, +0.000176f, +0.001515f, -0.016301f, +0.009321f, + +0.002401f, +0.001334f, +0.000882f, +0.003420f, +0.010984f, +0.014143f, +0.004300f, +0.009434f, -0.000687f, +0.005453f, + -0.004087f, +0.002319f, -0.002688f, +0.001064f, +0.006612f, +0.001532f, -0.001126f, -0.007184f, -0.003968f, -0.005921f, + -0.001070f, -0.003288f, -0.001603f, -0.004702f, -0.002299f, +0.000392f, -0.006672f, -0.003874f, -0.002038f, +0.003409f, + +0.004147f, +0.002547f, -0.002926f, -0.004948f, -0.004370f, -0.001237f, +0.001876f, -0.000014f, -0.000491f, +0.004651f, + -0.001302f, +0.003744f, -0.000974f, +0.000372f, +0.000909f, +0.002505f, -0.001702f, +0.000722f, +0.003096f, +0.000592f, + -0.002265f, +0.000317f, +0.000030f, -0.002842f, -0.000516f, +0.000295f + }, + { + +0.039081f, -0.417729f, +0.010658f, -0.006518f, +0.001294f, +0.004577f, -0.000992f, -0.002848f, -0.021015f, +0.039857f, + +0.004511f, +0.030536f, -0.015381f, +0.007827f, +0.010780f, +0.011113f, -0.019920f, +0.053937f, -0.022392f, -0.011747f, + +0.009812f, +0.011525f, -0.011564f, -0.009778f, +0.000034f, +0.011466f, -0.009361f, -0.003044f, +0.003578f, -0.000070f, + +0.000228f, +0.012352f, -0.008735f, -0.008402f, -0.002334f, -0.001971f, +0.012736f, -0.014648f, -0.010980f, -0.005784f, + +0.015998f, +0.008904f, +0.006666f, -0.015317f, -0.001155f, +0.010589f, +0.006268f, +0.003959f, -0.005233f, +0.011902f, + -0.004375f, +0.000579f, +0.000487f, -0.000116f, -0.006743f, -0.000508f, +0.004682f, +0.000684f, -0.001574f, +0.002334f, + +0.000509f, -0.002565f, -0.002106f, -0.003915f, +0.001412f, -0.001865f, -0.001294f, +0.001302f, +0.002591f, +0.004153f, + +0.001269f, -0.001608f, +0.000890f, +0.004161f, -0.002157f, +0.000789f, -0.001792f, +0.000399f, +0.002312f, +0.005233f, + -0.000369f, -0.000784f, +0.000297f, +0.000845f, -0.000336f, -0.001079f, -0.000425f, -0.003660f, +0.001166f, +0.001316f, + +0.000678f, +0.002753f, +0.000336f, -0.000136f, -0.001333f, -0.002888f + }, + { + -0.004323f, -0.004016f, +0.000971f, -0.006452f, +0.005123f, -0.003191f, +0.002536f, -0.001727f, -0.009944f, +0.004404f, + -0.009296f, +0.017069f, +0.019455f, +0.040826f, -0.053813f, -0.026552f, -0.009768f, +0.081513f, +0.026532f, -0.019763f, + -0.062393f, -0.000202f, +0.010923f, -0.003506f, -0.007284f, -0.035096f, +0.018681f, +0.000164f, -0.013684f, +0.017180f, + -0.007645f, +0.006125f, +0.014850f, -0.006542f, +0.010413f, -0.019253f, +0.018255f, +0.004810f, -0.016906f, +0.012084f, + -0.010976f, +0.008189f, +0.003417f, -0.014600f, -0.008980f, +0.014020f, +0.012896f, -0.006650f, -0.000565f, +0.008030f, + -0.010415f, -0.001629f, +0.003652f, -0.003859f, -0.010008f, -0.008488f, +0.005377f, -0.004097f, +0.006177f, +0.010500f, + -0.002131f, +0.000134f, -0.002248f, -0.004962f, -0.002866f, +0.000846f, -0.000219f, +0.001445f, +0.000020f, -0.001056f, + +0.000853f, +0.006821f, +0.002824f, +0.001322f, -0.003389f, -0.002173f, +0.005061f, -0.000798f, +0.003813f, +0.002971f, + +0.005450f, -0.000343f, +0.000531f, -0.000246f, -0.004324f, +0.001387f, +0.004230f, +0.001286f, +0.000400f, -0.003110f, + +0.000677f, -0.000489f, +0.001962f, -0.002409f, -0.000836f, -0.000905f + }, + { + +0.065601f, -0.637273f, +0.012054f, -0.044495f, -0.013553f, +0.000470f, +0.007210f, -0.023572f, +0.004878f, +0.025837f, + +0.009134f, +0.015775f, -0.034500f, +0.008309f, +0.023953f, +0.013748f, +0.014680f, +0.004055f, +0.000793f, -0.009136f, + +0.010788f, -0.003709f, +0.017596f, -0.007406f, -0.008242f, +0.014921f, +0.004974f, -0.017645f, +0.007809f, +0.004681f, + -0.013302f, -0.004322f, -0.012779f, -0.003677f, -0.003098f, -0.006366f, +0.011774f, +0.019096f, -0.004074f, -0.003252f, + +0.000220f, -0.009416f, -0.007089f, -0.005660f, -0.010716f, -0.010399f, -0.002605f, -0.005402f, -0.006543f, -0.013583f, + +0.007443f, +0.001858f, +0.005073f, -0.005376f, +0.003617f, -0.006208f, +0.004199f, -0.001456f, -0.002389f, -0.005561f, + +0.004949f, +0.001435f, +0.001785f, -0.004329f, -0.001332f, -0.000944f, +0.002321f, -0.001919f, +0.003173f, -0.001341f, + +0.000109f, -0.000140f, +0.001890f, +0.000270f, -0.003634f, -0.000508f, -0.004105f, +0.002716f, +0.000694f, -0.001371f, + -0.002762f, +0.001114f, -0.001076f, +0.001482f, +0.002285f, -0.001651f, +0.000787f, +0.003072f, +0.002978f, +0.000238f, + -0.003129f, +0.000527f, -0.003010f, -0.001101f, +0.000601f, -0.001799f + }, + { + -0.001901f, +0.020607f, -0.001957f, -0.005210f, -0.001221f, +0.000580f, -0.000637f, +0.002229f, -0.002924f, +0.000017f, + +0.006910f, -0.000584f, +0.008141f, -0.000227f, +0.027789f, -0.016763f, +0.012305f, +0.008640f, -0.000736f, -0.000458f, + +0.037498f, -0.016448f, +0.044017f, -0.012413f, +0.010407f, +0.005154f, +0.036338f, -0.020758f, +0.013573f, +0.016547f, + -0.018513f, -0.013748f, +0.012245f, +0.042294f, -0.020094f, -0.010616f, -0.013625f, -0.010879f, -0.014703f, +0.001860f, + -0.002511f, -0.009947f, -0.001361f, -0.011998f, -0.000189f, -0.004033f, +0.009479f, -0.015049f, +0.003931f, +0.001872f, + +0.005573f, +0.003098f, +0.004262f, -0.004329f, +0.002509f, -0.005194f, +0.006391f, +0.006039f, -0.010732f, -0.001217f, + -0.000067f, +0.004831f, +0.001059f, -0.007040f, -0.002256f, +0.007499f, +0.000617f, +0.001798f, -0.001363f, -0.002123f, + +0.000690f, +0.003667f, -0.004122f, +0.005542f, +0.000226f, -0.002409f, +0.002896f, -0.000448f, +0.001973f, -0.000128f, + +0.002779f, -0.001328f, -0.001181f, -0.001597f, +0.001705f, -0.000224f, +0.000270f, -0.000266f, +0.001791f, -0.003242f, + -0.002368f, -0.000935f, -0.002324f, -0.001272f, -0.001002f, -0.000961f + }, + { + +0.122423f, +0.455486f, -0.057501f, -0.017818f, -0.017865f, -0.006469f, -0.030858f, +0.002695f, -0.009453f, +0.036123f, + -0.005119f, -0.028295f, +0.011743f, -0.003208f, -0.039873f, +0.048102f, -0.004267f, +0.008875f, -0.002765f, -0.015379f, + -0.017580f, -0.007778f, -0.002557f, +0.028783f, -0.002710f, +0.007823f, -0.000142f, +0.000011f, +0.004009f, +0.030009f, + +0.001270f, +0.009049f, -0.006274f, +0.020790f, +0.003391f, +0.042114f, -0.006572f, -0.002076f, -0.004917f, -0.003487f, + +0.012930f, -0.006033f, +0.002251f, +0.002585f, +0.024175f, +0.002499f, +0.014188f, -0.008934f, -0.006398f, -0.002151f, + +0.003728f, +0.007459f, -0.006579f, -0.007722f, -0.005467f, +0.004580f, +0.001509f, +0.007487f, -0.001466f, -0.000198f, + -0.002546f, +0.003279f, +0.001584f, +0.005938f, -0.000330f, -0.001392f, +0.002398f, -0.001253f, +0.001757f, +0.001316f, + -0.001368f, +0.000067f, +0.000270f, +0.000397f, +0.002334f, -0.000518f, +0.001678f, +0.001227f, +0.002297f, +0.000449f, + -0.002014f, +0.001151f, -0.001210f, +0.001678f, -0.001787f, -0.003108f, +0.000878f, +0.000746f, -0.000813f, -0.001429f, + -0.001293f, +0.003555f, -0.002117f, -0.000282f, +0.000034f, +0.000737f + }, + { + -0.002263f, +0.011633f, -0.022926f, +0.004336f, -0.002292f, -0.000259f, -0.001303f, +0.002400f, +0.000885f, +0.000625f, + -0.007916f, +0.012581f, -0.000383f, +0.014907f, +0.024886f, -0.057794f, -0.016990f, -0.024389f, -0.002715f, +0.008211f, + -0.042446f, -0.012662f, -0.028546f, +0.037054f, +0.025465f, -0.006707f, +0.039244f, -0.013426f, -0.007090f, +0.045020f, + -0.015450f, -0.007609f, -0.026353f, +0.010709f, +0.012445f, -0.012755f, +0.009925f, +0.001011f, +0.010917f, +0.008651f, + -0.005176f, -0.002229f, +0.003555f, -0.011812f, +0.009615f, -0.005130f, -0.006643f, -0.000109f, +0.010896f, +0.007537f, + -0.013307f, +0.002672f, -0.001572f, +0.005672f, +0.004832f, +0.007248f, -0.002119f, -0.001583f, -0.000354f, -0.002598f, + +0.003903f, -0.000728f, -0.008120f, -0.003676f, +0.009498f, +0.001703f, +0.002600f, -0.001742f, -0.002952f, +0.000316f, + -0.000021f, +0.001213f, -0.006102f, +0.004575f, +0.002902f, +0.001551f, -0.001976f, -0.001319f, -0.001236f, -0.001286f, + -0.002041f, -0.000413f, -0.000390f, -0.001683f, -0.002024f, -0.000147f, +0.003038f, +0.001305f, -0.002163f, -0.000939f, + -0.000492f, -0.000547f, +0.000822f, +0.001591f, +0.000299f, +0.001004f + }, + { + +0.062779f, -0.090473f, -0.018356f, -0.027490f, -0.005714f, +0.062389f, -0.022414f, -0.056810f, -0.013805f, -0.021671f, + +0.003927f, -0.013616f, +0.008570f, +0.014733f, +0.005370f, +0.000561f, +0.034996f, +0.014868f, +0.049282f, +0.008777f, + +0.006697f, -0.000662f, -0.012829f, -0.033884f, +0.003959f, +0.008280f, -0.018644f, +0.007739f, -0.024593f, -0.005316f, + -0.003968f, -0.012531f, -0.005259f, -0.012369f, -0.000082f, -0.010154f, +0.010498f, +0.023774f, -0.001920f, +0.001192f, + -0.000161f, -0.002341f, -0.009161f, +0.011021f, -0.012181f, +0.003732f, +0.008247f, -0.003116f, +0.006627f, -0.004193f, + +0.002565f, -0.001917f, -0.000950f, -0.004388f, +0.009756f, +0.002219f, -0.002358f, -0.003229f, -0.001066f, -0.006149f, + +0.016752f, +0.006133f, +0.007787f, -0.001467f, -0.007732f, +0.005231f, +0.001037f, +0.004273f, +0.001942f, -0.006017f, + +0.008122f, -0.002249f, -0.002344f, -0.000769f, +0.003109f, +0.007249f, -0.002507f, -0.003261f, +0.005605f, -0.002775f, + -0.001008f, +0.001493f, +0.003917f, +0.001210f, +0.000119f, -0.000432f, -0.002211f, -0.002002f, +0.001020f, -0.000810f, + +0.002647f, -0.000422f, +0.000035f, +0.002010f, -0.001195f, -0.000695f + }, + { + +0.001549f, +0.125030f, -0.047925f, -0.011397f, -0.006887f, +0.004146f, -0.013420f, -0.007283f, -0.010830f, +0.001878f, + +0.009072f, -0.011019f, -0.015671f, -0.015527f, +0.011079f, -0.047875f, -0.000848f, +0.006129f, +0.037911f, -0.004307f, + +0.023658f, -0.015034f, +0.012118f, -0.019566f, -0.002770f, +0.015785f, -0.013935f, -0.000059f, -0.004554f, +0.010594f, + +0.002332f, -0.007167f, -0.008206f, +0.004444f, +0.005057f, +0.022484f, -0.012264f, -0.008047f, -0.005950f, -0.001889f, + +0.002016f, +0.005588f, -0.007326f, +0.000054f, -0.015920f, +0.002199f, +0.006257f, +0.011163f, +0.007388f, +0.002371f, + +0.002868f, -0.013285f, +0.000930f, +0.002828f, +0.009139f, +0.002413f, +0.001777f, +0.000176f, +0.000818f, +0.000230f, + +0.002097f, -0.007417f, +0.003145f, -0.003400f, -0.001138f, -0.004587f, -0.003791f, -0.001707f, +0.002335f, +0.001691f, + +0.000599f, +0.000458f, +0.003924f, -0.001763f, +0.002103f, -0.000682f, +0.002584f, +0.001904f, -0.000482f, +0.002584f, + -0.001583f, +0.000122f, +0.001309f, -0.001818f, +0.003287f, -0.001007f, +0.002863f, +0.002800f, +0.002791f, +0.001961f, + -0.000417f, -0.002331f, -0.000688f, +0.000053f, +0.000716f, -0.000413f + }, + { + -0.083475f, +0.065419f, -0.013103f, -0.010836f, +0.050893f, -0.004935f, +0.015120f, -0.014167f, -0.035431f, +0.025618f, + +0.043999f, +0.017078f, +0.012862f, -0.002895f, -0.044253f, -0.002293f, -0.015284f, +0.020811f, -0.000183f, -0.036514f, + -0.013461f, +0.018902f, +0.004704f, -0.006867f, -0.030088f, -0.000279f, -0.013041f, -0.004147f, -0.002401f, -0.032089f, + -0.012157f, +0.016349f, +0.004069f, -0.000302f, -0.003173f, +0.017942f, -0.014978f, +0.017051f, +0.000287f, +0.000086f, + -0.006950f, -0.012311f, -0.000336f, +0.007926f, -0.012956f, +0.006767f, -0.004832f, -0.001830f, +0.003270f, -0.002596f, + +0.002300f, +0.008474f, -0.007354f, -0.008350f, +0.012328f, -0.002163f, -0.004212f, +0.005152f, -0.002596f, +0.001843f, + -0.007721f, -0.005648f, -0.003332f, +0.005441f, -0.001575f, +0.000465f, +0.002982f, -0.005486f, +0.003074f, +0.010230f, + -0.001060f, -0.000424f, +0.000103f, +0.001480f, +0.000255f, -0.000438f, -0.000487f, -0.002028f, -0.003272f, -0.000114f, + +0.004062f, +0.000742f, -0.002588f, -0.000055f, -0.000548f, -0.000074f, -0.000264f, -0.002532f, -0.000265f, -0.000938f, + +0.001100f, +0.001520f, -0.000450f, +0.000617f, -0.000724f, +0.000549f + }, + { + -0.005853f, +0.040145f, +0.012949f, +0.000004f, -0.004527f, -0.001268f, -0.002547f, +0.003346f, -0.002315f, -0.004366f, + -0.004426f, -0.005403f, -0.029191f, +0.029632f, -0.086853f, -0.025975f, -0.064973f, +0.007815f, +0.011397f, -0.010521f, + -0.010526f, +0.065624f, +0.033459f, -0.018518f, +0.025250f, -0.004649f, -0.002042f, +0.007768f, -0.021823f, -0.009788f, + +0.009524f, +0.002041f, +0.006398f, -0.001915f, -0.009035f, -0.004830f, -0.025296f, -0.013480f, +0.011852f, +0.005217f, + +0.005811f, +0.005099f, -0.006740f, -0.011284f, -0.009866f, -0.013872f, +0.007412f, -0.011775f, +0.008419f, -0.003802f, + +0.013524f, +0.000985f, -0.010306f, -0.009929f, -0.006035f, +0.001813f, +0.000642f, -0.002932f, -0.002002f, -0.005604f, + -0.007557f, +0.011468f, -0.004560f, -0.002500f, +0.000753f, -0.003922f, -0.002488f, -0.010150f, +0.006667f, -0.004288f, + -0.003024f, +0.002355f, -0.004673f, -0.001528f, +0.005353f, -0.000066f, +0.002189f, +0.000458f, +0.001852f, +0.003192f, + -0.001379f, +0.001007f, +0.000598f, -0.000514f, +0.002034f, -0.001138f, +0.000961f, +0.000232f, +0.002914f, +0.002263f, + -0.001662f, +0.002673f, -0.002359f, -0.004175f, -0.000875f, -0.001044f + }, + { + -0.032599f, -0.135270f, -0.000029f, -0.016348f, -0.000271f, +0.008431f, -0.018748f, +0.009049f, -0.004255f, -0.023578f, + -0.002348f, +0.004474f, -0.013726f, +0.016096f, -0.013357f, -0.019646f, -0.001416f, -0.007542f, -0.014970f, +0.038599f, + +0.007464f, +0.024722f, -0.002665f, +0.003240f, -0.007337f, +0.009601f, -0.015102f, +0.001940f, -0.005853f, -0.015483f, + -0.007184f, -0.013080f, -0.012006f, -0.010488f, +0.008846f, +0.012106f, +0.003049f, +0.005711f, +0.008471f, -0.001314f, + +0.006502f, +0.026268f, -0.002357f, -0.002060f, -0.008872f, +0.002613f, +0.010338f, -0.004431f, -0.009974f, -0.007463f, + -0.007955f, -0.001809f, +0.008197f, -0.008754f, -0.004770f, +0.006413f, -0.003569f, +0.010522f, -0.001456f, -0.003907f, + -0.001070f, +0.002681f, -0.001124f, -0.000512f, -0.000037f, -0.002974f, -0.002645f, -0.001566f, -0.007650f, +0.003161f, + +0.010550f, -0.002406f, +0.001752f, -0.006932f, -0.008601f, -0.002585f, -0.001667f, +0.002881f, +0.002377f, +0.002782f, + +0.004115f, +0.000096f, -0.000128f, +0.000281f, +0.001965f, -0.002587f, +0.000206f, -0.000602f, +0.001988f, -0.000408f, + +0.000704f, -0.000606f, +0.000935f, +0.000591f, -0.002191f, +0.001593f + }, + { + +0.002750f, -0.122959f, +0.012343f, -0.009775f, -0.011847f, +0.006572f, -0.002234f, -0.005788f, -0.010543f, -0.007661f, + +0.017668f, -0.009136f, +0.019113f, +0.039073f, -0.053653f, +0.021127f, -0.042692f, +0.009766f, -0.015340f, -0.002037f, + +0.059527f, +0.002481f, -0.020127f, -0.013588f, +0.000465f, -0.006454f, -0.028854f, -0.014780f, +0.012720f, -0.017826f, + +0.004488f, -0.032082f, -0.000315f, -0.009103f, -0.006794f, +0.031117f, -0.010856f, -0.021784f, +0.013044f, +0.022060f, + +0.000163f, -0.008631f, +0.005616f, -0.000792f, -0.000549f, -0.007052f, -0.012123f, -0.010349f, +0.010940f, +0.007751f, + +0.004338f, +0.001235f, +0.003046f, -0.005112f, +0.011336f, +0.005989f, +0.002107f, -0.008801f, +0.005193f, -0.005596f, + +0.002665f, +0.006418f, -0.010862f, -0.003222f, -0.005214f, -0.001904f, -0.002925f, +0.002123f, -0.000632f, +0.000677f, + +0.002592f, -0.001230f, -0.005716f, -0.002823f, -0.000315f, +0.001441f, +0.003446f, -0.002226f, -0.001297f, +0.001619f, + -0.000114f, +0.000576f, -0.001508f, -0.000082f, +0.001079f, -0.002758f, +0.000928f, +0.001959f, +0.000555f, -0.002180f, + +0.004782f, +0.000953f, +0.001821f, -0.001395f, -0.001853f, -0.003244f + } + }, + { + { + +0.007748f, -0.380502f, +0.008703f, -0.029205f, +0.004620f, +0.008134f, -0.005334f, -0.035598f, +0.007420f, -0.029125f, + -0.052226f, -0.001557f, -0.002282f, +0.019914f, -0.011544f, +0.007298f, -0.005602f, -0.006411f, -0.017291f, +0.005877f, + +0.001361f, +0.000585f, -0.019966f, -0.008099f, +0.021260f, +0.011714f, +0.010368f, -0.005635f, +0.000668f, +0.000621f, + +0.012667f, +0.010005f, -0.004915f, +0.000591f, +0.012196f, +0.027145f, -0.005756f, +0.009181f, -0.005720f, -0.009540f, + +0.005149f, -0.004753f, +0.013692f, -0.004352f, -0.002767f, -0.002247f, -0.001315f, -0.008960f, -0.002324f, -0.004540f, + -0.006518f, +0.000617f, +0.005887f, -0.008319f, +0.010266f, -0.006637f, -0.015072f, +0.003674f, +0.006010f, -0.001881f, + -0.010642f, +0.002975f, -0.003193f, +0.007824f, -0.005927f, +0.007449f, -0.002132f, -0.003636f, +0.002585f, +0.005067f, + +0.002271f, +0.004065f, -0.002532f, -0.000240f, -0.002226f, +0.001111f, -0.000594f, -0.000083f, +0.001689f, -0.002512f, + -0.001285f, -0.003383f, +0.000644f, +0.000275f, -0.005149f, +0.002608f, +0.002757f, -0.000214f, -0.000425f, -0.000949f, + -0.003527f, +0.002982f, -0.002091f, -0.001170f, +0.000612f, -0.000567f + }, + { + -0.001963f, +0.083076f, -0.007936f, -0.023951f, -0.000816f, +0.001427f, +0.004121f, +0.005754f, -0.005269f, +0.021350f, + +0.001449f, -0.000953f, +0.015304f, -0.007852f, -0.036678f, -0.018368f, -0.008269f, -0.000337f, -0.002552f, +0.006952f, + +0.002405f, +0.014277f, -0.034427f, +0.018997f, +0.036817f, +0.003209f, -0.015888f, -0.014861f, +0.000279f, -0.000864f, + -0.015947f, -0.000164f, -0.022739f, -0.013785f, -0.003145f, +0.015372f, +0.002072f, +0.006428f, -0.012057f, +0.009061f, + +0.010934f, +0.011863f, +0.003465f, -0.011608f, -0.017075f, -0.014289f, +0.007241f, +0.005698f, +0.006077f, -0.003615f, + -0.002247f, +0.009951f, +0.001420f, -0.001836f, +0.001882f, +0.002775f, +0.001568f, -0.003797f, -0.007568f, +0.003822f, + +0.001566f, +0.000872f, -0.000125f, -0.000475f, +0.001894f, -0.003149f, +0.005415f, +0.001086f, +0.001049f, +0.004462f, + +0.007306f, -0.004592f, +0.003454f, +0.000352f, -0.000195f, +0.000851f, -0.003321f, -0.004743f, -0.000567f, -0.001461f, + +0.001830f, -0.000556f, +0.000191f, -0.001519f, +0.001114f, -0.001534f, +0.002437f, -0.000697f, +0.000416f, -0.001748f, + -0.000282f, -0.000469f, -0.002988f, -0.000428f, -0.002876f, +0.000263f + }, + { + +0.007813f, -0.093511f, -0.027619f, +0.032803f, +0.009778f, -0.012335f, -0.015355f, +0.008146f, -0.012557f, +0.023386f, + -0.038248f, +0.034477f, -0.016661f, +0.005965f, +0.001946f, -0.006497f, +0.004169f, +0.034617f, -0.003691f, +0.020268f, + -0.012208f, -0.014254f, +0.011710f, +0.011330f, +0.010001f, -0.010729f, -0.004506f, +0.000084f, -0.011949f, -0.008234f, + +0.006862f, +0.021317f, +0.002752f, +0.018895f, -0.014336f, +0.009443f, -0.004486f, -0.000712f, -0.005579f, +0.009665f, + -0.008058f, +0.003058f, +0.001303f, -0.007648f, -0.004986f, +0.002842f, -0.001457f, +0.004421f, +0.004283f, +0.000420f, + -0.019706f, +0.003519f, -0.000583f, -0.007753f, -0.001586f, -0.003369f, -0.001699f, -0.000999f, -0.001696f, +0.000169f, + +0.000603f, -0.002327f, +0.000131f, -0.003278f, +0.002381f, +0.003292f, +0.003806f, +0.002543f, -0.003783f, -0.001423f, + -0.000439f, +0.003565f, -0.001907f, -0.003679f, -0.005777f, -0.006201f, +0.001662f, +0.000177f, -0.001388f, +0.001563f, + -0.003232f, +0.001479f, -0.002032f, -0.000019f, -0.000907f, +0.001098f, -0.000626f, +0.001273f, +0.001767f, -0.002519f, + -0.003007f, +0.000731f, +0.002737f, -0.001442f, -0.001537f, +0.000671f + }, + { + -0.000266f, -0.531127f, -0.022111f, -0.008110f, -0.009255f, +0.000456f, +0.012300f, +0.009552f, -0.024260f, +0.030971f, + -0.002201f, +0.033814f, +0.007887f, +0.016623f, +0.000052f, +0.016010f, -0.016781f, +0.033805f, -0.025766f, +0.026817f, + +0.027993f, -0.003173f, -0.012979f, -0.000567f, -0.002203f, +0.013200f, -0.007513f, -0.024287f, -0.014868f, -0.019603f, + -0.011560f, +0.007373f, -0.004686f, +0.007017f, +0.011477f, -0.002192f, +0.006690f, -0.013880f, -0.006339f, -0.015552f, + +0.009197f, +0.004352f, +0.005309f, -0.013264f, -0.004256f, +0.002163f, -0.007199f, +0.003840f, -0.004983f, +0.014057f, + +0.001087f, -0.000532f, +0.006470f, -0.001112f, -0.011714f, -0.003132f, +0.001543f, +0.000062f, +0.002400f, +0.000502f, + -0.000074f, -0.003958f, +0.000352f, +0.000802f, -0.000418f, -0.001520f, -0.001740f, -0.002167f, +0.003106f, +0.002295f, + +0.001258f, +0.003701f, +0.005037f, +0.003275f, -0.004218f, +0.001082f, +0.000838f, +0.002476f, +0.002767f, +0.003696f, + -0.000139f, -0.001721f, -0.000370f, +0.001778f, +0.000099f, -0.001175f, -0.000245f, -0.003124f, -0.001096f, -0.001516f, + -0.000477f, +0.000055f, -0.000872f, +0.000530f, +0.000522f, -0.000819f + }, + { + +0.004368f, -0.011829f, -0.013817f, -0.014503f, -0.001505f, +0.000012f, +0.005252f, -0.002813f, -0.015343f, -0.003941f, + -0.015872f, -0.002099f, -0.013702f, +0.013747f, -0.059528f, +0.021840f, +0.037151f, +0.017898f, -0.070423f, -0.014072f, + -0.025823f, +0.018771f, +0.000518f, +0.003265f, -0.006237f, -0.050405f, -0.003391f, +0.005015f, -0.000006f, +0.011851f, + +0.000062f, +0.005901f, -0.004697f, -0.010972f, +0.017508f, -0.011053f, +0.019465f, +0.005476f, -0.005760f, +0.013401f, + -0.007527f, +0.013707f, +0.010096f, -0.003300f, +0.010261f, +0.002927f, -0.012853f, -0.004397f, -0.003537f, -0.000109f, + -0.009716f, +0.002412f, +0.005685f, -0.003240f, -0.002769f, -0.001164f, +0.012824f, -0.006952f, -0.003217f, -0.003704f, + -0.011839f, +0.000444f, -0.000028f, -0.000423f, -0.002080f, +0.002251f, -0.000243f, -0.003900f, +0.000285f, -0.001754f, + -0.004296f, +0.003958f, +0.001522f, -0.004291f, -0.003207f, +0.002182f, +0.002030f, -0.004985f, +0.002903f, +0.002280f, + +0.001196f, -0.006774f, -0.001104f, +0.001093f, -0.003601f, +0.001085f, +0.001038f, -0.000337f, +0.000554f, -0.001272f, + +0.002176f, -0.001253f, +0.002334f, -0.000106f, +0.000528f, -0.001653f + }, + { + -0.004785f, -0.774263f, +0.000333f, -0.004082f, +0.007349f, +0.005431f, +0.016420f, -0.026273f, -0.009066f, +0.015795f, + -0.001212f, +0.009411f, -0.058099f, -0.012026f, -0.000257f, -0.000139f, +0.002524f, -0.014497f, -0.027103f, -0.021793f, + +0.015072f, -0.010001f, +0.016472f, -0.007709f, -0.003844f, +0.017960f, +0.007256f, -0.005017f, +0.009945f, -0.010088f, + -0.017998f, +0.005263f, -0.016065f, -0.004836f, +0.011866f, -0.002272f, -0.005194f, -0.002424f, -0.004080f, +0.009226f, + +0.008929f, -0.004020f, -0.001084f, +0.000226f, +0.001103f, -0.006295f, -0.005843f, -0.007392f, -0.004599f, -0.016237f, + +0.003054f, -0.000907f, +0.001750f, -0.009867f, +0.007669f, -0.000993f, +0.005028f, +0.002658f, -0.001000f, -0.005835f, + +0.001513f, +0.000350f, -0.000831f, -0.005745f, +0.003752f, -0.002364f, -0.002065f, +0.000462f, +0.005565f, -0.001860f, + -0.001500f, -0.003221f, -0.000029f, +0.000805f, -0.007384f, -0.000931f, -0.003165f, +0.005659f, +0.005422f, -0.000960f, + -0.002579f, -0.001536f, -0.002435f, +0.002822f, +0.001464f, -0.001285f, +0.000708f, +0.002601f, +0.000294f, -0.001880f, + -0.005645f, -0.000551f, -0.002315f, -0.000114f, +0.000168f, -0.000808f + }, + { + +0.000509f, +0.017308f, -0.018577f, -0.004870f, +0.004017f, +0.002572f, +0.000928f, +0.005503f, -0.000697f, -0.006604f, + -0.001731f, -0.015571f, -0.013936f, +0.000860f, +0.027900f, +0.003896f, +0.017512f, +0.017643f, +0.023298f, +0.016981f, + +0.015910f, -0.022714f, +0.020432f, -0.068851f, -0.002407f, -0.023621f, +0.032865f, +0.007904f, +0.014024f, +0.012020f, + -0.007196f, +0.002483f, -0.001215f, +0.011240f, -0.027537f, -0.003173f, -0.013133f, -0.004694f, +0.002253f, +0.008586f, + -0.002553f, -0.003976f, -0.003829f, -0.015222f, +0.005582f, +0.000436f, +0.013023f, -0.012477f, +0.003655f, +0.001090f, + +0.007654f, +0.002659f, +0.006145f, -0.003674f, +0.000253f, -0.006080f, +0.001918f, +0.002605f, -0.008643f, +0.008292f, + +0.007315f, +0.007628f, +0.005261f, -0.005783f, -0.004676f, +0.002823f, +0.001013f, +0.001960f, -0.000336f, -0.002572f, + -0.000566f, +0.000569f, -0.007503f, +0.004873f, -0.002467f, -0.002931f, +0.004612f, -0.001107f, -0.001171f, -0.004539f, + +0.001930f, +0.003387f, +0.001675f, -0.000497f, +0.001395f, -0.003329f, +0.001243f, -0.000117f, -0.000454f, -0.002789f, + -0.000524f, +0.001967f, +0.000892f, -0.000606f, -0.000634f, -0.001922f + }, + { + -0.155546f, +0.240132f, +0.075412f, -0.013544f, -0.015494f, +0.013591f, -0.013509f, +0.016810f, -0.008287f, +0.018399f, + -0.006611f, -0.018816f, +0.013938f, +0.012253f, -0.063384f, +0.016496f, -0.013535f, -0.007672f, +0.017927f, +0.005442f, + -0.004244f, +0.012358f, -0.002266f, +0.017936f, -0.001196f, +0.012107f, -0.011456f, +0.003694f, -0.004402f, -0.003103f, + -0.027128f, +0.004126f, -0.002355f, +0.015766f, -0.007520f, +0.032990f, +0.000270f, +0.011849f, -0.008254f, -0.008359f, + +0.006462f, -0.014907f, -0.007035f, -0.013100f, +0.008651f, -0.010026f, +0.009335f, -0.005860f, -0.008521f, -0.013406f, + -0.000676f, -0.001151f, -0.015969f, +0.003895f, -0.002098f, +0.002671f, +0.002799f, +0.001294f, -0.002422f, -0.000064f, + -0.008193f, -0.003561f, -0.004298f, -0.000388f, -0.005054f, -0.000747f, +0.003942f, +0.002768f, +0.002860f, +0.000231f, + +0.000558f, -0.001587f, -0.000610f, +0.003172f, -0.000804f, +0.000217f, +0.002259f, -0.001770f, +0.001615f, -0.000327f, + -0.002684f, -0.000335f, -0.003471f, -0.000498f, -0.000780f, +0.001511f, +0.001503f, -0.002892f, -0.002437f, +0.000162f, + -0.000135f, +0.002760f, -0.001563f, -0.001032f, -0.001288f, +0.000770f + }, + { + +0.000047f, +0.026466f, -0.022250f, +0.000659f, -0.000929f, -0.000332f, +0.003286f, -0.001743f, -0.006072f, +0.003589f, + -0.009487f, +0.012668f, +0.000243f, -0.039724f, -0.015478f, -0.007169f, +0.023377f, -0.015689f, -0.007157f, +0.029592f, + -0.021503f, +0.022657f, -0.005783f, +0.000534f, -0.026138f, -0.046188f, +0.028283f, -0.015734f, -0.009622f, +0.031964f, + -0.023479f, +0.004742f, -0.014930f, +0.012288f, +0.007643f, -0.013950f, +0.014936f, +0.009075f, +0.007945f, +0.014651f, + +0.003121f, +0.000263f, +0.011953f, -0.014383f, +0.010644f, +0.003214f, +0.000843f, +0.000271f, -0.000650f, +0.009278f, + +0.002367f, +0.006063f, +0.002561f, +0.006496f, -0.005250f, +0.001722f, -0.002624f, -0.002905f, -0.003515f, -0.000463f, + +0.005619f, +0.003692f, -0.004346f, -0.002259f, +0.009703f, +0.001451f, +0.003941f, +0.000728f, -0.002247f, -0.002154f, + -0.003721f, +0.002121f, -0.004814f, -0.001340f, -0.000410f, +0.000259f, -0.002599f, -0.001366f, +0.001663f, +0.004808f, + +0.002181f, +0.003662f, -0.000939f, -0.001504f, -0.003142f, -0.001274f, +0.003683f, +0.000870f, -0.001914f, -0.000545f, + +0.000210f, -0.000661f, +0.001102f, +0.000094f, -0.001006f, +0.001459f + }, + { + -0.065114f, -0.104685f, +0.099155f, -0.016424f, +0.006860f, +0.023243f, -0.031229f, -0.039433f, +0.004328f, -0.019762f, + +0.004552f, +0.004048f, +0.011320f, -0.008386f, -0.025816f, -0.020073f, +0.013014f, -0.009731f, +0.051808f, +0.020067f, + +0.014287f, -0.005259f, -0.011426f, -0.033741f, -0.002620f, +0.009855f, -0.006807f, +0.008773f, -0.024434f, -0.000285f, + +0.008192f, -0.016100f, -0.002665f, +0.001860f, -0.002511f, -0.010810f, +0.021710f, +0.019629f, -0.011043f, -0.001524f, + -0.013993f, -0.008815f, -0.010741f, +0.001051f, -0.014438f, +0.009342f, +0.010972f, -0.003987f, +0.008725f, -0.008216f, + +0.002746f, +0.002328f, -0.006329f, -0.010205f, +0.008828f, -0.000808f, -0.000104f, +0.000122f, +0.002548f, -0.002616f, + +0.015405f, -0.001766f, +0.002259f, -0.000737f, -0.010154f, -0.003035f, -0.001386f, +0.002769f, +0.001594f, -0.005422f, + +0.006112f, +0.004381f, +0.000812f, -0.003215f, -0.001993f, +0.001519f, -0.000118f, -0.003249f, +0.002115f, -0.002347f, + +0.000310f, +0.000848f, +0.002083f, +0.005226f, +0.004938f, +0.001132f, -0.003391f, -0.005872f, -0.003575f, +0.001092f, + +0.003716f, -0.002261f, -0.001301f, +0.002316f, -0.000624f, -0.001705f + }, + { + +0.000549f, +0.129850f, -0.028106f, +0.013465f, +0.001115f, +0.013913f, +0.010543f, -0.002024f, -0.005909f, +0.016182f, + +0.028899f, +0.023630f, +0.004479f, -0.032150f, +0.014136f, -0.036498f, -0.000545f, -0.004314f, -0.004145f, -0.042466f, + +0.019308f, -0.008438f, +0.001726f, -0.019619f, -0.008167f, +0.003175f, -0.017250f, -0.008435f, -0.014504f, +0.007299f, + +0.006121f, -0.011640f, -0.008782f, -0.003163f, -0.016809f, +0.001846f, -0.012216f, +0.001562f, +0.010944f, +0.023254f, + +0.021791f, +0.003789f, -0.016060f, -0.001825f, -0.007132f, +0.010047f, +0.009588f, +0.018481f, +0.004301f, -0.001919f, + +0.000011f, -0.006656f, +0.007791f, -0.000879f, +0.001383f, -0.009638f, -0.003814f, +0.003517f, +0.000332f, -0.000417f, + -0.002167f, -0.004536f, +0.011698f, +0.004469f, +0.006743f, -0.004759f, -0.007328f, +0.003371f, +0.005459f, -0.000839f, + -0.003556f, -0.002770f, +0.000447f, -0.003804f, -0.000194f, -0.003658f, -0.001601f, +0.001648f, -0.001052f, +0.001970f, + +0.002665f, -0.000592f, -0.001507f, -0.002170f, +0.000360f, -0.003565f, +0.000116f, +0.001113f, +0.000571f, +0.001038f, + +0.000085f, -0.001495f, -0.000714f, -0.002004f, +0.001238f, -0.001158f + }, + { + +0.066578f, +0.283561f, +0.020378f, +0.009391f, +0.058829f, +0.000965f, +0.032682f, +0.012347f, -0.011496f, +0.024795f, + +0.031521f, +0.018461f, +0.002102f, -0.012270f, -0.045436f, +0.015174f, -0.008181f, +0.013594f, -0.009706f, -0.027560f, + +0.001836f, +0.022199f, +0.001700f, +0.015674f, -0.021017f, -0.024794f, -0.025794f, +0.000808f, +0.008259f, -0.018214f, + -0.009738f, +0.006124f, +0.006501f, +0.009831f, -0.010998f, +0.011344f, -0.009081f, +0.014138f, +0.001787f, +0.007230f, + -0.002239f, -0.003934f, +0.007098f, +0.002202f, -0.015109f, +0.007785f, -0.010647f, -0.004132f, +0.012312f, -0.008016f, + -0.000355f, +0.009007f, -0.006910f, -0.011223f, +0.004945f, -0.014100f, -0.005457f, +0.005667f, -0.003838f, +0.000916f, + -0.002320f, +0.002825f, -0.000092f, +0.004045f, -0.006665f, +0.001485f, +0.005937f, -0.002555f, -0.003745f, +0.001808f, + -0.000589f, -0.002705f, -0.001281f, +0.004255f, +0.003349f, +0.003602f, +0.002849f, +0.001289f, +0.002161f, +0.000962f, + +0.000128f, +0.001047f, +0.002571f, +0.000814f, -0.000762f, +0.000684f, +0.001395f, +0.000728f, +0.001580f, -0.001040f, + +0.000109f, +0.000347f, -0.001960f, -0.000812f, -0.001938f, -0.000046f + }, + { + +0.005320f, -0.010365f, -0.037200f, -0.007186f, -0.014133f, -0.008982f, -0.001219f, +0.012845f, +0.004316f, -0.006906f, + -0.010308f, -0.015781f, -0.020118f, +0.022460f, -0.107968f, -0.016379f, -0.053075f, +0.001431f, +0.019925f, -0.008207f, + -0.036826f, -0.004091f, -0.013028f, -0.023333f, +0.016126f, +0.005109f, +0.030193f, +0.027040f, -0.000395f, -0.022616f, + -0.029492f, +0.001685f, +0.014850f, -0.006916f, -0.006079f, +0.016065f, -0.011758f, -0.020072f, +0.004110f, -0.002104f, + -0.001597f, +0.000388f, -0.006262f, -0.003701f, +0.000983f, -0.013233f, +0.005852f, -0.005884f, +0.017379f, -0.003849f, + +0.002605f, +0.001423f, +0.000639f, -0.003205f, -0.000354f, +0.008745f, +0.009159f, +0.004305f, +0.003635f, +0.004894f, + -0.002478f, +0.008862f, -0.008026f, -0.004232f, -0.001601f, -0.001813f, +0.000491f, -0.007535f, +0.005240f, -0.005464f, + -0.000807f, +0.005806f, -0.003682f, +0.002625f, +0.007760f, -0.001738f, -0.001940f, -0.001414f, -0.003135f, -0.001945f, + -0.000779f, +0.004737f, +0.002920f, -0.000008f, +0.002491f, -0.001156f, -0.000264f, -0.000653f, +0.005584f, +0.002590f, + -0.003436f, +0.001784f, -0.000522f, -0.002777f, +0.000729f, +0.000168f + }, + { + +0.059193f, -0.037419f, -0.032551f, -0.037083f, +0.006505f, +0.010121f, -0.007734f, +0.023427f, +0.013255f, -0.013440f, + -0.008161f, -0.012498f, -0.024382f, -0.013868f, -0.043011f, +0.014778f, +0.030078f, -0.019517f, -0.039344f, +0.018553f, + -0.002471f, +0.010231f, -0.002036f, +0.004485f, -0.010855f, -0.005201f, -0.025311f, +0.023356f, -0.002662f, -0.016467f, + +0.000333f, -0.013117f, -0.005206f, -0.010066f, -0.009946f, -0.003103f, +0.017715f, +0.024872f, -0.000330f, -0.007273f, + -0.003562f, +0.015286f, +0.002414f, +0.011335f, +0.003747f, +0.009398f, -0.001314f, -0.018000f, -0.012181f, -0.007852f, + -0.008633f, -0.000713f, +0.009369f, -0.008567f, -0.002436f, +0.007285f, -0.004244f, -0.000073f, -0.009001f, +0.002440f, + +0.005114f, +0.003900f, +0.002004f, +0.002299f, +0.005455f, +0.005548f, +0.007438f, +0.006304f, +0.002616f, +0.001159f, + +0.004141f, -0.004384f, +0.003427f, +0.000184f, -0.003722f, +0.001121f, -0.000135f, -0.003032f, +0.000615f, +0.004577f, + +0.003724f, +0.000033f, +0.000777f, +0.000852f, +0.001425f, -0.001516f, +0.002089f, -0.001464f, +0.003585f, +0.000724f, + -0.002480f, -0.003134f, +0.000443f, +0.000479f, -0.000625f, +0.001300f + }, + { + -0.004233f, -0.122761f, +0.030808f, +0.004093f, +0.003884f, +0.017486f, +0.015294f, -0.001084f, -0.012720f, -0.003760f, + +0.025510f, -0.015446f, +0.008878f, -0.011382f, -0.160912f, -0.033874f, +0.007808f, +0.067446f, +0.006253f, -0.020529f, + +0.076853f, +0.052536f, +0.012802f, +0.012193f, -0.007943f, -0.005350f, -0.016737f, -0.013600f, +0.024986f, +0.002328f, + +0.002766f, -0.024772f, -0.007838f, -0.009419f, -0.002842f, +0.022822f, -0.007841f, -0.015073f, +0.021280f, +0.006998f, + -0.007297f, -0.006812f, -0.007128f, -0.005979f, -0.008027f, -0.000641f, +0.002021f, +0.000392f, +0.004534f, +0.000311f, + +0.010921f, +0.007487f, +0.003988f, -0.009568f, +0.010649f, +0.006049f, +0.003623f, -0.003192f, +0.012932f, -0.002812f, + -0.004203f, +0.007025f, +0.001291f, +0.007630f, -0.002926f, -0.004130f, +0.000256f, +0.004621f, -0.001476f, -0.001715f, + +0.000633f, +0.003156f, +0.000642f, +0.000556f, -0.002416f, -0.000717f, +0.004548f, -0.003464f, -0.002930f, -0.003092f, + -0.003963f, +0.001809f, -0.002511f, -0.000928f, +0.000928f, -0.000616f, +0.000386f, +0.002886f, +0.002382f, -0.003327f, + +0.002612f, -0.000592f, +0.001709f, +0.000749f, +0.000530f, -0.001833f + } + }, + { + { + +0.000476f, -0.471869f, +0.059514f, -0.034048f, +0.014860f, -0.001417f, +0.010185f, -0.035296f, -0.003586f, -0.046250f, + -0.012974f, -0.028851f, -0.000595f, +0.004146f, +0.021353f, -0.004111f, -0.013998f, -0.006130f, -0.018504f, +0.004712f, + +0.007060f, +0.003540f, -0.017508f, +0.008009f, +0.003605f, +0.013601f, +0.000815f, -0.006392f, +0.008932f, -0.005452f, + +0.010649f, +0.005337f, -0.000425f, -0.002944f, +0.029511f, +0.008661f, +0.007039f, +0.000791f, -0.003631f, +0.003047f, + -0.008668f, +0.002019f, +0.007168f, +0.006785f, -0.016872f, +0.010470f, -0.009951f, -0.009277f, -0.005856f, -0.005983f, + -0.002389f, +0.006749f, -0.004285f, +0.006043f, +0.002508f, -0.006065f, -0.006967f, -0.002683f, +0.000281f, -0.003772f, + -0.003196f, -0.001096f, -0.000678f, +0.001587f, +0.003207f, +0.000011f, +0.001039f, -0.006323f, +0.004340f, +0.006755f, + -0.001756f, +0.002410f, +0.002239f, -0.003263f, -0.002082f, -0.000732f, +0.001317f, +0.001078f, -0.000257f, -0.000812f, + -0.004575f, -0.003291f, +0.003430f, -0.000652f, -0.003611f, +0.001189f, +0.002457f, +0.001709f, -0.002675f, -0.000792f, + +0.000161f, -0.001202f, -0.001174f, +0.000874f, -0.001554f, +0.000557f + }, + { + +0.001364f, +0.026236f, +0.016828f, +0.018540f, -0.023915f, +0.001762f, +0.000969f, +0.000846f, +0.006455f, +0.013700f, + -0.002605f, -0.002727f, +0.011139f, -0.013273f, -0.023577f, +0.010295f, -0.006856f, -0.026667f, +0.001423f, +0.023773f, + -0.008771f, -0.002508f, -0.002761f, +0.026240f, -0.008489f, +0.016619f, -0.020862f, +0.010585f, -0.010815f, -0.002040f, + -0.030248f, +0.003100f, -0.018230f, -0.007608f, +0.000065f, +0.001028f, +0.008480f, +0.014070f, -0.000354f, -0.003427f, + +0.008786f, +0.013353f, +0.003770f, -0.004954f, -0.017084f, -0.020809f, +0.010060f, +0.012545f, -0.001055f, -0.007591f, + +0.004636f, -0.003514f, +0.004385f, +0.000240f, +0.009417f, -0.001844f, +0.006690f, -0.008391f, -0.004094f, -0.001627f, + -0.001971f, +0.005985f, -0.002761f, -0.000047f, -0.000122f, -0.000890f, +0.000854f, +0.004180f, +0.004650f, +0.005314f, + +0.003216f, +0.002444f, -0.001328f, -0.002341f, +0.001613f, +0.000072f, -0.004000f, -0.003598f, -0.001508f, -0.001736f, + +0.000102f, +0.002042f, -0.002965f, +0.002222f, -0.000453f, -0.000082f, +0.000049f, +0.000987f, -0.001098f, -0.000374f, + -0.001112f, -0.001969f, -0.001499f, -0.001363f, -0.000451f, -0.000650f + }, + { + -0.007392f, -0.135388f, +0.010669f, +0.034504f, -0.002688f, -0.010270f, -0.006233f, -0.018644f, +0.015464f, -0.003054f, + -0.030668f, +0.043304f, -0.016371f, -0.011602f, +0.018123f, -0.003583f, +0.001449f, +0.048455f, +0.006879f, -0.002882f, + +0.009614f, -0.021418f, +0.012297f, +0.003391f, -0.006689f, +0.014805f, -0.028978f, +0.007129f, -0.007463f, -0.007233f, + +0.011520f, +0.023276f, -0.015584f, +0.019592f, -0.005185f, +0.002130f, -0.002215f, -0.005498f, +0.003642f, +0.007662f, + +0.001384f, -0.009234f, -0.006623f, -0.000170f, -0.004068f, -0.001054f, -0.003998f, +0.007725f, +0.003457f, -0.008523f, + -0.010032f, +0.001831f, -0.001951f, -0.000510f, -0.006114f, +0.000505f, -0.009346f, +0.003830f, -0.004920f, +0.003351f, + +0.003667f, -0.002262f, +0.001340f, -0.005936f, +0.001531f, +0.003929f, +0.006883f, +0.002321f, -0.004643f, +0.000104f, + +0.000740f, -0.003106f, +0.000862f, -0.002043f, -0.002217f, -0.005782f, +0.001627f, -0.004527f, +0.002547f, -0.000102f, + +0.001328f, -0.005334f, +0.000278f, +0.000315f, -0.000363f, -0.002618f, +0.000442f, +0.003647f, -0.000008f, -0.001681f, + -0.002699f, +0.000147f, +0.001651f, +0.000083f, -0.001253f, -0.000003f + }, + { + -0.044724f, -0.554975f, +0.026927f, -0.002478f, +0.001121f, +0.003608f, +0.008709f, -0.004480f, -0.014030f, +0.018693f, + +0.030381f, -0.002183f, +0.016405f, +0.020913f, -0.011419f, +0.007170f, -0.009364f, +0.019854f, -0.003597f, +0.032178f, + +0.013210f, -0.000472f, +0.003501f, -0.010991f, +0.005044f, +0.023034f, -0.023661f, -0.017015f, -0.026844f, -0.017207f, + -0.008545f, -0.003810f, +0.011568f, -0.001635f, +0.010375f, +0.009047f, -0.011474f, -0.002850f, -0.012069f, -0.013736f, + +0.020495f, +0.001654f, +0.005700f, -0.000051f, -0.019660f, -0.005808f, +0.000217f, -0.004175f, +0.008766f, +0.003264f, + +0.005354f, +0.003327f, -0.003033f, -0.001773f, -0.003038f, -0.004126f, +0.002160f, -0.005705f, +0.010554f, -0.003444f, + -0.000722f, +0.002059f, -0.002365f, -0.001254f, +0.000702f, -0.000312f, -0.001031f, +0.002886f, -0.001236f, +0.000371f, + +0.003821f, +0.003721f, +0.006195f, -0.002484f, +0.001228f, -0.001238f, +0.003429f, +0.001302f, +0.002412f, +0.001258f, + +0.001433f, -0.004497f, +0.000867f, +0.001911f, +0.000110f, -0.000107f, -0.001569f, +0.000155f, -0.003164f, -0.002119f, + -0.000133f, +0.000795f, -0.000429f, -0.000588f, +0.000199f, -0.000063f + }, + { + -0.003619f, -0.021674f, +0.000263f, -0.010916f, -0.003183f, +0.003368f, -0.002289f, -0.000037f, -0.010154f, -0.006166f, + -0.014519f, +0.001094f, -0.011088f, +0.008595f, -0.039962f, +0.025569f, +0.006959f, -0.064390f, +0.003424f, -0.025921f, + -0.005711f, +0.047889f, -0.050687f, +0.008846f, +0.010561f, -0.042087f, -0.016231f, +0.004445f, +0.009386f, +0.017259f, + -0.007751f, +0.030686f, -0.011999f, -0.028280f, +0.016060f, +0.013015f, -0.003740f, +0.008278f, +0.008265f, +0.002909f, + +0.007524f, -0.001277f, +0.011481f, +0.008498f, +0.011511f, -0.004901f, -0.016619f, -0.000255f, -0.000585f, -0.007511f, + +0.002115f, -0.000269f, +0.000711f, -0.002236f, +0.001962f, -0.001669f, +0.007662f, +0.001749f, -0.005988f, -0.010650f, + -0.005021f, -0.004280f, -0.000409f, +0.001135f, -0.001599f, +0.001558f, -0.001049f, -0.001321f, +0.000421f, -0.002480f, + +0.001765f, -0.003442f, +0.001609f, -0.002312f, -0.001522f, -0.001544f, +0.001526f, -0.002665f, +0.000464f, +0.002709f, + +0.001073f, -0.006020f, -0.000898f, -0.001521f, -0.003458f, +0.000942f, +0.000823f, +0.000552f, -0.001315f, +0.001125f, + +0.000673f, +0.001379f, -0.000116f, +0.001044f, -0.000016f, -0.001525f + }, + { + -0.063191f, -0.751861f, +0.027437f, +0.027727f, +0.003766f, +0.005213f, -0.015200f, +0.031318f, -0.019346f, -0.009709f, + +0.002233f, -0.001218f, -0.030874f, -0.010005f, -0.017170f, +0.021490f, -0.012439f, -0.029927f, -0.032167f, -0.018822f, + +0.015510f, +0.007440f, +0.008704f, -0.010573f, +0.004436f, +0.013052f, +0.007352f, +0.014106f, +0.002211f, -0.010228f, + -0.003038f, -0.002821f, -0.030417f, +0.001517f, +0.007128f, -0.003232f, -0.009229f, -0.007179f, +0.002461f, +0.000562f, + +0.017205f, +0.000721f, -0.004907f, +0.006240f, +0.006032f, -0.003448f, -0.014565f, +0.002606f, -0.006544f, -0.013590f, + +0.003909f, -0.003789f, +0.000257f, -0.003166f, +0.004313f, +0.005597f, -0.005576f, +0.006882f, -0.004417f, -0.000073f, + -0.004234f, +0.001491f, -0.002193f, -0.005050f, +0.007509f, -0.000989f, -0.003405f, +0.003492f, -0.001043f, +0.001415f, + -0.002889f, -0.002344f, -0.000616f, +0.000020f, -0.004428f, -0.001783f, -0.002813f, +0.004755f, +0.005854f, -0.002479f, + +0.000037f, -0.002030f, -0.000434f, +0.000571f, -0.001260f, +0.001503f, +0.001471f, +0.000236f, -0.000010f, -0.000954f, + -0.004218f, -0.002175f, -0.000683f, +0.000700f, -0.001970f, -0.000392f + }, + { + +0.000752f, -0.013472f, +0.004545f, +0.006139f, -0.001583f, +0.000041f, +0.002850f, +0.002193f, +0.005759f, +0.000690f, + -0.013901f, -0.005272f, -0.023976f, +0.029400f, -0.009585f, +0.077641f, -0.025086f, -0.003736f, +0.011198f, +0.038742f, + -0.012502f, -0.012004f, +0.045835f, -0.067383f, -0.020397f, -0.021082f, -0.002536f, +0.043201f, -0.012339f, -0.028213f, + +0.018023f, +0.017590f, +0.003220f, -0.008369f, -0.021580f, -0.002282f, -0.008937f, -0.002596f, +0.001899f, +0.002852f, + +0.003440f, -0.000430f, -0.004215f, -0.012664f, -0.002768f, +0.006761f, +0.010569f, -0.005066f, -0.002964f, +0.001761f, + +0.006010f, +0.003100f, +0.003897f, +0.004276f, -0.006225f, +0.000345f, -0.000979f, -0.003650f, -0.002258f, +0.010052f, + +0.009489f, +0.004737f, -0.000073f, -0.006014f, +0.000258f, -0.001939f, +0.003090f, -0.004445f, +0.005500f, +0.002962f, + -0.000228f, -0.006262f, -0.003751f, -0.000951f, -0.002187f, +0.000847f, +0.002037f, -0.000469f, -0.001483f, -0.005138f, + +0.003256f, +0.001209f, +0.000802f, +0.001983f, +0.000637f, -0.004986f, +0.002205f, -0.000454f, -0.000905f, -0.000751f, + +0.000801f, +0.000873f, -0.000058f, -0.000377f, +0.000843f, -0.002089f + }, + { + +0.162421f, -0.017866f, -0.061923f, -0.045119f, +0.007353f, +0.008691f, +0.013411f, -0.005908f, +0.005341f, -0.002797f, + -0.012615f, +0.014580f, -0.012146f, +0.021606f, -0.056014f, +0.005920f, +0.011526f, -0.004775f, -0.001382f, +0.001312f, + +0.004983f, +0.004687f, +0.011461f, +0.014334f, +0.010868f, -0.007830f, -0.004294f, +0.012080f, -0.002397f, -0.016087f, + -0.026387f, -0.000168f, +0.005564f, +0.001400f, +0.003774f, +0.014561f, +0.000250f, +0.020562f, -0.014489f, +0.008574f, + -0.009223f, -0.008892f, -0.013835f, -0.001299f, -0.003632f, -0.006005f, -0.000264f, +0.013764f, -0.018698f, -0.008410f, + +0.001169f, -0.001712f, -0.008181f, -0.002652f, -0.000323f, +0.004038f, +0.003207f, -0.004854f, +0.000708f, -0.000238f, + -0.003553f, -0.009717f, -0.005625f, -0.001253f, -0.006121f, -0.002104f, +0.003703f, +0.007285f, +0.001436f, -0.000746f, + +0.004938f, -0.003709f, -0.005132f, +0.004537f, -0.002218f, +0.002303f, +0.000904f, -0.002756f, +0.001687f, +0.000471f, + -0.002635f, -0.000879f, -0.003096f, -0.002354f, -0.000075f, +0.002746f, +0.000051f, -0.000496f, -0.001206f, -0.001620f, + +0.000563f, -0.000261f, +0.000398f, +0.000081f, -0.000998f, +0.000123f + }, + { + +0.002204f, -0.004513f, +0.008013f, -0.011380f, +0.008592f, +0.000650f, +0.004472f, -0.001717f, -0.004764f, -0.001698f, + -0.000797f, +0.003010f, +0.009900f, +0.023719f, -0.084536f, +0.019909f, -0.021236f, +0.009902f, -0.034089f, +0.012755f, + +0.032592f, +0.000337f, +0.019109f, -0.061518f, -0.005026f, -0.022297f, -0.025219f, +0.016216f, -0.006426f, +0.012138f, + +0.001322f, -0.017059f, +0.004865f, -0.003305f, +0.002404f, +0.006507f, +0.007116f, +0.004890f, +0.012285f, +0.018330f, + -0.010892f, +0.008436f, +0.010035f, -0.008788f, +0.000945f, +0.002943f, +0.004834f, +0.000316f, -0.001097f, +0.001453f, + +0.014132f, +0.000097f, +0.003066f, +0.005061f, -0.003096f, -0.000678f, +0.000315f, -0.006460f, +0.002943f, +0.003120f, + +0.001847f, -0.000256f, -0.005769f, +0.001074f, +0.008283f, -0.000472f, +0.006808f, +0.000166f, -0.000476f, -0.004402f, + -0.000831f, -0.002741f, -0.001923f, -0.000866f, +0.000042f, +0.000114f, -0.001696f, +0.000403f, +0.001574f, +0.002216f, + +0.003456f, +0.007235f, -0.005105f, -0.000685f, -0.001603f, -0.000235f, +0.000179f, +0.000672f, +0.001634f, -0.002105f, + -0.000337f, +0.001190f, +0.000263f, +0.000828f, -0.001969f, -0.000523f + }, + { + +0.063667f, -0.044585f, -0.125064f, +0.004212f, +0.029951f, -0.038334f, -0.001526f, -0.040749f, +0.002457f, +0.001205f, + +0.014113f, -0.005008f, -0.006937f, +0.000215f, -0.021194f, -0.018592f, -0.005650f, +0.010592f, +0.041188f, +0.015752f, + +0.015088f, -0.005090f, -0.001708f, -0.017222f, -0.015777f, +0.005652f, +0.023432f, -0.010467f, -0.019296f, -0.010560f, + +0.014360f, -0.024733f, +0.013099f, -0.003960f, -0.016843f, +0.002957f, +0.014937f, +0.016718f, -0.001086f, -0.010597f, + -0.020306f, -0.000821f, +0.000346f, -0.004137f, -0.009076f, +0.000832f, +0.010382f, -0.000453f, +0.003766f, -0.010936f, + -0.001809f, +0.010110f, -0.002477f, -0.008939f, +0.006283f, -0.004469f, -0.003854f, +0.004412f, +0.002300f, +0.003156f, + +0.010219f, -0.000771f, -0.003351f, -0.004248f, -0.000092f, -0.010544f, -0.003895f, +0.007743f, -0.003171f, -0.001666f, + +0.001569f, +0.006715f, -0.000583f, -0.002776f, -0.000368f, -0.001408f, -0.000344f, +0.001021f, -0.004237f, +0.001089f, + -0.000272f, +0.005260f, -0.001807f, +0.006605f, +0.003314f, +0.001036f, -0.003985f, -0.002366f, -0.003709f, +0.001476f, + +0.000801f, -0.000164f, -0.001891f, +0.000453f, +0.000719f, -0.002686f + }, + { + -0.002708f, +0.094942f, +0.012797f, +0.015648f, -0.001875f, -0.005386f, +0.022146f, -0.002463f, +0.011298f, +0.002902f, + +0.008489f, +0.028642f, +0.010246f, -0.033016f, +0.002470f, -0.011655f, -0.000246f, +0.009117f, -0.069777f, +0.017993f, + -0.010536f, -0.018937f, +0.009038f, -0.003868f, -0.010912f, -0.008087f, -0.009619f, -0.014682f, +0.001068f, -0.014073f, + +0.013608f, -0.024820f, +0.000505f, +0.008989f, -0.018097f, -0.008078f, -0.007091f, -0.005290f, +0.012927f, +0.023858f, + +0.015762f, -0.003775f, -0.003715f, -0.003213f, +0.003805f, +0.016215f, -0.003474f, +0.018097f, -0.002633f, +0.005392f, + -0.011533f, -0.000636f, +0.008992f, +0.002214f, -0.006352f, -0.012596f, -0.001569f, +0.002541f, -0.001091f, +0.010411f, + -0.010067f, -0.000550f, +0.010333f, +0.008473f, +0.001160f, +0.000732f, -0.009734f, +0.003438f, +0.002434f, +0.001469f, + -0.005887f, +0.000597f, -0.003443f, -0.001051f, -0.002943f, +0.000640f, -0.002585f, -0.000166f, +0.001638f, -0.002729f, + +0.004106f, +0.001834f, -0.005832f, +0.001544f, -0.002584f, +0.000444f, -0.001792f, -0.000605f, -0.000993f, +0.001806f, + -0.000999f, +0.000347f, +0.001630f, -0.003755f, -0.001097f, -0.000198f + }, + { + -0.011894f, +0.416049f, +0.031517f, +0.007649f, -0.012482f, +0.040351f, +0.039309f, +0.006705f, -0.002291f, +0.021310f, + +0.017917f, +0.021020f, +0.012202f, -0.001672f, -0.046574f, -0.003135f, +0.008358f, +0.005106f, -0.018633f, +0.003727f, + -0.019315f, +0.018387f, -0.010741f, +0.020240f, -0.023244f, -0.012914f, -0.019338f, -0.003135f, +0.003861f, -0.000208f, + -0.015881f, +0.007968f, +0.010815f, -0.000834f, -0.005159f, +0.006494f, +0.003163f, +0.006640f, -0.009271f, +0.003283f, + -0.004872f, +0.002765f, +0.016266f, -0.010344f, -0.011919f, +0.010051f, -0.016635f, -0.001118f, +0.019836f, -0.006890f, + -0.002567f, +0.003945f, -0.007165f, -0.004794f, -0.006239f, -0.012976f, -0.003994f, +0.000573f, +0.000228f, -0.007867f, + +0.004353f, +0.006730f, +0.000939f, -0.002598f, -0.002802f, +0.000669f, +0.000341f, +0.004289f, -0.003175f, -0.002465f, + -0.000640f, -0.003781f, +0.003219f, +0.003305f, +0.003027f, +0.001510f, +0.004342f, +0.001552f, +0.004570f, +0.000606f, + -0.000943f, -0.001514f, +0.004933f, +0.001191f, -0.000043f, +0.001429f, -0.000390f, +0.002400f, -0.000562f, -0.000237f, + +0.000935f, -0.002554f, +0.000078f, -0.001069f, -0.001474f, -0.000232f + }, + { + -0.004666f, -0.059332f, +0.008517f, -0.010636f, -0.000345f, -0.015383f, -0.000910f, +0.016294f, +0.003339f, -0.013755f, + -0.009081f, -0.010107f, -0.012720f, -0.017330f, -0.101563f, -0.010713f, -0.002612f, -0.008223f, +0.033849f, -0.030172f, + +0.017932f, -0.061289f, -0.024537f, +0.019743f, -0.023983f, +0.007652f, +0.042210f, +0.031045f, -0.021942f, -0.012272f, + -0.018468f, -0.007991f, +0.023639f, -0.028741f, +0.009856f, +0.002666f, -0.004878f, -0.015243f, -0.008749f, +0.003448f, + -0.002412f, +0.006896f, -0.006204f, +0.000320f, -0.001174f, -0.004121f, -0.001590f, +0.001021f, +0.003050f, +0.004922f, + -0.001392f, -0.003503f, +0.008233f, -0.001256f, -0.002459f, +0.009554f, +0.010047f, +0.005712f, +0.004603f, +0.009268f, + -0.004496f, -0.000067f, +0.006381f, -0.005140f, -0.006968f, +0.002924f, -0.001117f, -0.002379f, +0.000966f, -0.000767f, + -0.006469f, +0.004411f, +0.000798f, -0.000018f, +0.001992f, +0.002718f, -0.002729f, -0.001817f, -0.002184f, -0.003602f, + +0.000027f, +0.003164f, +0.004195f, -0.001980f, +0.000763f, +0.000785f, -0.000139f, +0.001364f, +0.002358f, +0.001663f, + -0.001551f, +0.000073f, -0.000322f, -0.001407f, +0.001518f, -0.001062f + }, + { + -0.061202f, +0.096577f, +0.018573f, -0.055294f, +0.027354f, -0.030821f, +0.015595f, +0.004201f, +0.005804f, +0.010874f, + +0.018114f, -0.039551f, -0.023853f, -0.048921f, -0.027186f, +0.032076f, +0.036688f, -0.014346f, -0.032660f, -0.003966f, + +0.000466f, +0.000925f, +0.009236f, -0.006495f, -0.001175f, -0.013075f, -0.013334f, +0.002635f, -0.001306f, +0.014595f, + -0.003500f, -0.018786f, -0.004849f, -0.013481f, -0.007056f, +0.008275f, +0.000893f, +0.015909f, -0.016741f, -0.005507f, + +0.021814f, -0.002530f, +0.003544f, +0.013511f, +0.012395f, -0.006667f, +0.001110f, -0.012685f, -0.013842f, -0.007370f, + -0.002433f, -0.003128f, +0.000226f, +0.000117f, +0.003086f, +0.001078f, +0.001229f, -0.005133f, -0.004589f, -0.001984f, + +0.007759f, +0.002772f, +0.003643f, -0.000762f, +0.005117f, +0.006665f, +0.008558f, +0.005759f, +0.008967f, +0.001113f, + -0.004826f, +0.003451f, -0.003437f, +0.001040f, +0.000215f, -0.000844f, +0.000554f, -0.003278f, +0.000570f, +0.003681f, + +0.001422f, +0.001426f, +0.003010f, +0.001819f, -0.000696f, +0.001688f, -0.000197f, -0.001708f, +0.001412f, -0.000056f, + -0.001033f, -0.001852f, +0.000148f, -0.000218f, -0.000066f, -0.001096f + }, + { + +0.005269f, -0.112397f, +0.015100f, +0.002170f, +0.018749f, +0.003585f, +0.011178f, -0.003185f, -0.011481f, +0.012932f, + +0.006058f, -0.004980f, +0.012829f, -0.095898f, -0.077875f, -0.054608f, +0.067222f, +0.030269f, +0.036693f, +0.010683f, + +0.004506f, +0.054638f, +0.020833f, +0.023412f, -0.015135f, +0.004341f, -0.025642f, -0.016149f, +0.025576f, -0.015381f, + -0.002572f, +0.001371f, -0.003209f, -0.005380f, +0.004491f, +0.002785f, +0.001522f, +0.007732f, -0.006073f, +0.007771f, + -0.007450f, -0.010263f, +0.001155f, +0.004396f, -0.021766f, -0.001464f, +0.004680f, +0.008984f, -0.005733f, -0.001923f, + +0.004991f, +0.006788f, +0.000015f, +0.005528f, +0.009198f, +0.004664f, -0.002340f, -0.003235f, +0.007053f, -0.000284f, + -0.004357f, +0.010048f, +0.005481f, +0.002292f, -0.000479f, -0.003759f, +0.005209f, +0.002968f, -0.005962f, -0.003390f, + +0.002378f, +0.002030f, +0.002481f, +0.000719f, -0.004221f, +0.001159f, +0.004084f, -0.002619f, -0.003029f, -0.002872f, + -0.000641f, -0.002916f, -0.001434f, -0.000205f, +0.000179f, +0.000707f, -0.000024f, +0.002229f, +0.000677f, -0.000869f, + -0.000690f, +0.000981f, -0.000534f, +0.001331f, +0.000302f, +0.001966f + } + }, + { + { + +0.001477f, -0.529576f, -0.053199f, -0.039469f, +0.003830f, -0.020725f, +0.008074f, -0.020852f, -0.008955f, -0.030849f, + +0.003223f, -0.048716f, -0.015634f, +0.010822f, +0.029039f, -0.022888f, -0.013475f, +0.003306f, -0.016872f, -0.016479f, + +0.001366f, +0.013446f, -0.015675f, +0.011088f, +0.002938f, +0.014042f, +0.002292f, +0.008369f, +0.003434f, -0.030162f, + -0.014724f, +0.002854f, +0.019295f, +0.002082f, +0.017811f, -0.003918f, -0.002076f, +0.008465f, +0.011500f, +0.004965f, + -0.009365f, -0.004603f, -0.010985f, +0.002678f, -0.019565f, +0.005051f, -0.004332f, -0.008361f, -0.007899f, -0.013092f, + -0.009019f, +0.004303f, -0.006875f, +0.004442f, -0.000532f, -0.007147f, -0.004520f, +0.000847f, -0.002175f, -0.002876f, + +0.008791f, +0.002817f, -0.004619f, -0.005542f, -0.002195f, +0.000634f, +0.004847f, -0.005464f, +0.000372f, +0.001310f, + -0.004101f, -0.001443f, +0.000781f, -0.002672f, -0.001913f, -0.001738f, +0.001262f, +0.001139f, +0.001133f, +0.002845f, + -0.000098f, +0.000545f, +0.003761f, -0.001500f, -0.002651f, +0.001099f, +0.001280f, +0.001416f, -0.001107f, +0.001353f, + +0.000922f, -0.000167f, +0.000073f, +0.001462f, -0.000654f, +0.002199f + }, + { + +0.000433f, -0.022774f, -0.027920f, +0.031290f, -0.002948f, -0.002339f, -0.003491f, -0.002869f, -0.009706f, -0.012065f, + -0.021819f, -0.007039f, +0.025867f, -0.000961f, -0.008427f, +0.027188f, -0.001326f, -0.008983f, -0.017711f, +0.003392f, + -0.000220f, -0.011009f, +0.005201f, +0.014444f, -0.052730f, +0.021130f, +0.003252f, +0.034142f, +0.005778f, +0.007460f, + -0.018104f, +0.012219f, -0.001540f, -0.000788f, +0.009144f, -0.001732f, +0.014510f, +0.013502f, -0.003263f, -0.003501f, + +0.000273f, +0.010205f, +0.004807f, +0.000704f, +0.003140f, -0.005513f, +0.006615f, +0.000064f, -0.007822f, -0.010731f, + -0.000062f, -0.005927f, +0.005014f, -0.000933f, +0.005829f, -0.012468f, -0.000884f, -0.002948f, +0.008886f, +0.003629f, + -0.003112f, +0.001240f, -0.003696f, +0.003006f, -0.002133f, -0.001419f, +0.001639f, +0.004225f, +0.001897f, -0.000308f, + +0.002011f, +0.004127f, -0.007510f, -0.007134f, +0.001805f, +0.001655f, -0.000495f, +0.000742f, -0.000116f, -0.000103f, + +0.000447f, +0.000537f, -0.002153f, +0.003869f, +0.000631f, +0.000956f, -0.000019f, -0.000039f, -0.000954f, +0.001538f, + -0.001081f, -0.002236f, +0.000330f, +0.000403f, -0.000361f, -0.000878f + }, + { + +0.006181f, -0.115485f, -0.003486f, -0.008989f, -0.026763f, -0.004978f, -0.004790f, -0.024002f, +0.012985f, +0.011634f, + -0.014775f, +0.016822f, -0.032228f, -0.004046f, +0.040310f, +0.016231f, +0.012509f, +0.038893f, -0.009906f, +0.005116f, + +0.025975f, -0.002616f, +0.013719f, -0.019090f, +0.006612f, +0.038617f, -0.028486f, -0.004941f, -0.007402f, +0.005195f, + -0.007912f, -0.004318f, -0.017596f, +0.001154f, -0.012137f, +0.003147f, +0.002875f, -0.001963f, +0.000344f, +0.002685f, + +0.001207f, -0.004875f, +0.001542f, +0.004437f, -0.005016f, -0.001727f, +0.003232f, +0.008772f, -0.004901f, -0.005181f, + -0.000087f, +0.001072f, -0.004452f, +0.002785f, -0.003499f, +0.002278f, -0.001829f, +0.009835f, -0.002561f, +0.001961f, + +0.001388f, +0.000484f, +0.005093f, -0.003463f, -0.000001f, +0.003600f, +0.005556f, +0.000959f, -0.001843f, +0.001598f, + -0.001728f, -0.003259f, +0.004578f, +0.001379f, +0.004500f, -0.001607f, -0.002221f, -0.005563f, +0.005956f, +0.002330f, + +0.003713f, -0.005061f, -0.001030f, -0.000647f, +0.001541f, -0.001266f, -0.000590f, +0.001627f, +0.000893f, +0.001365f, + -0.002574f, -0.000531f, -0.000608f, -0.000879f, -0.000758f, +0.000328f + }, + { + +0.080322f, -0.484836f, -0.031029f, +0.042197f, +0.019459f, -0.003451f, -0.008147f, -0.014129f, -0.000706f, +0.007877f, + +0.003046f, -0.016910f, +0.005882f, +0.003854f, -0.043084f, -0.017791f, -0.025093f, -0.009799f, -0.018158f, +0.017662f, + +0.001351f, +0.017493f, +0.021652f, -0.011587f, +0.009662f, +0.019765f, -0.017576f, +0.007749f, -0.006847f, +0.009402f, + +0.008365f, -0.007069f, +0.008549f, -0.006188f, +0.008312f, +0.008315f, -0.012352f, +0.003781f, -0.002452f, -0.001873f, + +0.015867f, +0.000468f, +0.008561f, +0.008252f, -0.013044f, -0.002104f, -0.004432f, -0.016213f, +0.003875f, -0.002134f, + +0.010630f, +0.010428f, -0.005976f, -0.001811f, +0.004285f, +0.006747f, +0.010963f, -0.006669f, +0.006286f, -0.002788f, + +0.006623f, +0.008935f, -0.005520f, -0.003442f, -0.000023f, +0.003285f, +0.004225f, +0.005320f, +0.000558f, +0.001477f, + +0.002853f, +0.000571f, +0.001263f, -0.003181f, +0.003072f, -0.001303f, +0.003316f, +0.000278f, +0.000696f, -0.001227f, + -0.000249f, -0.004181f, -0.000175f, -0.000456f, -0.001154f, +0.000202f, -0.003027f, -0.000201f, -0.001291f, +0.000186f, + +0.001114f, +0.001598f, +0.000561f, +0.000084f, +0.002356f, +0.001241f + }, + { + +0.002238f, -0.038921f, -0.017659f, +0.000770f, +0.007172f, +0.001574f, -0.002929f, +0.011576f, +0.003156f, +0.003069f, + -0.009873f, +0.000350f, -0.023373f, -0.015656f, -0.049417f, -0.004439f, -0.022483f, -0.014419f, +0.078550f, -0.012744f, + -0.008536f, +0.036267f, -0.046229f, +0.007754f, +0.001779f, -0.011675f, +0.010229f, -0.000218f, -0.004213f, +0.014480f, + +0.008400f, +0.027346f, +0.004411f, -0.009989f, +0.001078f, +0.006667f, -0.003145f, +0.015368f, +0.014923f, +0.005355f, + +0.010778f, -0.011445f, +0.005552f, +0.014496f, +0.016222f, +0.002051f, -0.011138f, +0.007825f, +0.014459f, +0.001802f, + +0.009901f, -0.001180f, -0.001166f, -0.001120f, +0.002330f, -0.004184f, -0.000612f, -0.001621f, -0.001798f, -0.001677f, + +0.001595f, +0.000136f, +0.004275f, -0.001047f, -0.002395f, +0.003174f, +0.002887f, +0.003357f, +0.001634f, -0.002953f, + +0.002039f, -0.001733f, +0.003467f, +0.000404f, -0.001063f, -0.001088f, +0.004063f, -0.000425f, -0.001328f, -0.001195f, + +0.001695f, -0.002104f, -0.000092f, -0.001412f, -0.002266f, +0.000303f, -0.000967f, -0.000127f, -0.001083f, +0.002102f, + +0.001120f, +0.001359f, -0.002141f, -0.000214f, +0.000644f, -0.000075f + }, + { + +0.113570f, -0.612072f, -0.037817f, +0.044334f, -0.004079f, +0.000502f, -0.006614f, +0.044729f, -0.018122f, +0.003311f, + +0.008365f, +0.018720f, -0.003439f, -0.007229f, +0.009351f, +0.030198f, -0.015590f, -0.013942f, -0.006439f, +0.004867f, + +0.023212f, +0.010613f, +0.006900f, -0.014253f, -0.001927f, +0.010698f, +0.009338f, +0.020897f, +0.008789f, +0.005366f, + +0.002855f, -0.008503f, -0.034144f, -0.010695f, -0.005625f, -0.012913f, -0.012385f, +0.001063f, +0.002582f, -0.008987f, + +0.011979f, +0.006138f, -0.002149f, +0.007886f, +0.020563f, +0.012277f, -0.014601f, +0.001920f, +0.005380f, +0.004927f, + +0.009751f, +0.001951f, +0.001914f, +0.002089f, +0.006336f, +0.003369f, -0.010832f, +0.000832f, -0.007312f, +0.002718f, + -0.002554f, +0.005701f, +0.005205f, -0.001448f, +0.004607f, -0.000727f, -0.000696f, +0.001432f, -0.002448f, +0.003917f, + -0.001133f, +0.001422f, +0.000009f, -0.001360f, -0.002030f, -0.001121f, -0.003144f, +0.001260f, +0.003526f, -0.002310f, + +0.002775f, +0.000321f, -0.002573f, -0.000152f, -0.000613f, +0.001663f, +0.000808f, -0.000465f, +0.000664f, +0.000582f, + +0.000508f, -0.000013f, -0.001012f, +0.000725f, -0.000788f, +0.000180f + }, + { + +0.000197f, -0.025766f, +0.011649f, +0.011379f, -0.001493f, -0.001567f, -0.000894f, +0.004808f, +0.007543f, +0.004654f, + -0.001225f, +0.009306f, -0.008940f, +0.054635f, -0.007315f, +0.018913f, -0.057469f, -0.002157f, -0.015700f, +0.021394f, + +0.010881f, +0.017183f, +0.047930f, -0.059181f, -0.015775f, -0.018101f, -0.029545f, +0.033180f, -0.004678f, -0.036495f, + -0.004283f, +0.003166f, +0.004535f, -0.005595f, -0.011912f, +0.000993f, -0.004881f, +0.000440f, -0.003853f, -0.004237f, + +0.000579f, -0.003060f, -0.001176f, -0.001345f, -0.005822f, +0.003848f, +0.011676f, +0.003297f, -0.000040f, -0.003199f, + -0.000017f, +0.002456f, +0.002535f, +0.001103f, -0.006760f, +0.004253f, +0.001490f, +0.000004f, -0.002359f, -0.002825f, + -0.001978f, -0.002826f, -0.001188f, -0.004837f, +0.000403f, -0.002908f, +0.004436f, +0.001106f, +0.008829f, -0.000100f, + -0.002250f, -0.002575f, +0.000241f, -0.001758f, -0.002188f, +0.000943f, +0.000222f, -0.001078f, +0.000334f, -0.003651f, + +0.002083f, -0.001292f, +0.001067f, +0.000852f, -0.000910f, -0.001328f, +0.002721f, -0.001492f, +0.002288f, +0.000298f, + -0.000590f, -0.000765f, -0.001162f, +0.000508f, +0.000277f, -0.002229f + }, + { + -0.138895f, -0.279522f, +0.020939f, -0.091970f, +0.000202f, +0.006051f, +0.016852f, -0.001263f, +0.003474f, -0.001166f, + -0.012789f, +0.007249f, -0.007880f, +0.044331f, -0.031836f, +0.004026f, +0.035854f, +0.011135f, -0.022482f, +0.004373f, + +0.014985f, +0.007592f, +0.013912f, +0.010875f, +0.010993f, -0.003765f, +0.009146f, +0.011909f, -0.001779f, -0.009741f, + -0.017933f, +0.003079f, +0.012294f, +0.001160f, +0.002917f, -0.003144f, -0.011658f, +0.018985f, -0.015178f, +0.010963f, + -0.006190f, +0.000591f, -0.010950f, +0.008131f, +0.007855f, -0.000786f, -0.008595f, +0.016678f, -0.001155f, +0.005725f, + +0.014675f, +0.009732f, -0.004215f, -0.001759f, -0.000398f, +0.006979f, +0.007184f, -0.006690f, -0.000570f, -0.003985f, + -0.006980f, -0.007373f, -0.003068f, -0.000741f, +0.001055f, +0.001810f, +0.001806f, +0.004621f, +0.002089f, -0.004752f, + +0.001736f, -0.001614f, -0.005803f, +0.002019f, -0.004591f, -0.001168f, -0.002521f, -0.003432f, -0.000327f, -0.001239f, + -0.001499f, +0.003178f, +0.000797f, -0.000406f, +0.000466f, +0.001241f, -0.000158f, +0.002347f, -0.000009f, -0.002603f, + -0.001600f, -0.002111f, +0.000575f, +0.000651f, +0.000204f, +0.002820f + }, + { + -0.000105f, -0.022977f, +0.013192f, +0.003930f, +0.012926f, -0.001241f, +0.003094f, +0.001057f, +0.002298f, -0.000944f, + +0.002288f, +0.006909f, +0.005822f, -0.018208f, -0.130082f, +0.008272f, -0.037393f, -0.002526f, -0.034067f, +0.043195f, + +0.030528f, -0.029139f, +0.029148f, -0.069508f, -0.023766f, -0.009519f, -0.026043f, +0.021929f, +0.012962f, -0.003799f, + -0.003224f, -0.008113f, -0.003519f, -0.018699f, +0.012320f, +0.013460f, -0.009563f, -0.000878f, +0.018541f, +0.014541f, + -0.014166f, +0.010959f, +0.008195f, -0.002647f, -0.006260f, -0.010384f, -0.002226f, +0.000639f, +0.000267f, -0.005846f, + +0.004785f, -0.011209f, -0.004161f, +0.006442f, +0.000244f, -0.003571f, +0.002980f, -0.001774f, +0.005047f, +0.000387f, + -0.000800f, -0.003510f, -0.007182f, -0.000013f, +0.001257f, -0.004541f, +0.002455f, -0.001608f, -0.000196f, -0.002842f, + +0.002624f, -0.003257f, +0.001229f, +0.002562f, +0.000580f, +0.003899f, +0.001768f, +0.000554f, +0.003287f, +0.000989f, + -0.000051f, +0.004256f, -0.004990f, +0.000668f, +0.001337f, +0.001321f, -0.002229f, -0.000739f, +0.003301f, -0.002175f, + -0.000687f, +0.003317f, -0.000341f, +0.000904f, +0.000530f, -0.000811f + }, + { + -0.059617f, -0.023830f, -0.006555f, -0.008232f, +0.017525f, -0.000275f, +0.057712f, -0.009349f, -0.002965f, -0.000078f, + +0.019657f, -0.002042f, -0.025386f, -0.013219f, +0.000835f, +0.004381f, -0.017392f, -0.004764f, +0.003585f, -0.020209f, + +0.002990f, +0.011187f, +0.007971f, -0.007733f, +0.014850f, +0.014198f, +0.011487f, -0.011992f, +0.005247f, +0.005870f, + +0.010259f, -0.021713f, +0.022787f, +0.002881f, -0.024588f, +0.001432f, -0.009864f, -0.010272f, +0.005847f, +0.014791f, + -0.007679f, +0.001613f, +0.006265f, +0.004388f, -0.003159f, -0.011657f, +0.007972f, -0.001174f, -0.000855f, -0.006227f, + -0.001617f, +0.000001f, -0.003141f, -0.001983f, +0.009172f, -0.006553f, -0.004983f, +0.006714f, -0.000888f, -0.002020f, + -0.001985f, -0.006849f, -0.001459f, -0.003488f, +0.000597f, -0.008672f, -0.003381f, +0.004397f, -0.002583f, +0.001767f, + -0.001917f, +0.001399f, -0.000993f, -0.003334f, -0.000238f, -0.001507f, -0.000915f, +0.003689f, -0.001002f, +0.003626f, + +0.000039f, +0.005164f, -0.003718f, +0.003650f, +0.000888f, +0.003583f, +0.001655f, +0.001134f, -0.001790f, -0.000341f, + -0.002633f, -0.000451f, -0.002927f, -0.000510f, +0.002513f, -0.000204f + }, + { + +0.003815f, +0.050867f, -0.026289f, +0.002615f, -0.009383f, -0.018871f, +0.002702f, -0.006116f, +0.013900f, -0.015449f, + -0.017325f, +0.011375f, -0.000238f, -0.022882f, -0.007264f, -0.011697f, -0.008334f, -0.000266f, -0.060185f, +0.027524f, + -0.010493f, -0.009784f, +0.015672f, +0.012259f, -0.000212f, -0.022508f, -0.020877f, -0.007688f, +0.021559f, -0.007844f, + +0.004928f, -0.018519f, +0.003850f, +0.001380f, -0.007673f, +0.001974f, -0.010968f, -0.011003f, +0.003081f, -0.000710f, + +0.000563f, -0.006702f, -0.007733f, -0.001171f, +0.005432f, +0.007562f, -0.012914f, +0.013393f, -0.004304f, -0.005071f, + -0.019736f, +0.002308f, +0.006112f, -0.000635f, -0.007628f, -0.011722f, -0.001635f, +0.002324f, -0.000467f, +0.012847f, + -0.003262f, -0.003857f, +0.001300f, +0.006020f, +0.001455f, +0.005773f, -0.005927f, +0.000833f, -0.000617f, +0.001719f, + -0.002722f, +0.006382f, -0.000341f, -0.002190f, -0.002631f, +0.003674f, -0.001618f, -0.001118f, -0.000290f, -0.004165f, + +0.001634f, +0.000965f, -0.005971f, +0.002277f, -0.002529f, +0.001881f, +0.000640f, +0.000540f, -0.001296f, -0.001588f, + -0.001242f, +0.002284f, +0.003068f, -0.002005f, -0.000581f, -0.000588f + }, + { + -0.056499f, +0.383462f, +0.037830f, +0.006957f, -0.017878f, -0.003956f, +0.007624f, +0.013347f, -0.019117f, +0.007420f, + +0.008888f, +0.003615f, +0.016657f, +0.008399f, -0.035837f, -0.006610f, -0.004610f, +0.001311f, -0.024164f, -0.002382f, + -0.009083f, +0.024959f, -0.023121f, -0.004664f, -0.005330f, +0.021940f, +0.005459f, +0.004307f, -0.002617f, -0.000968f, + -0.010957f, +0.009216f, +0.003740f, -0.010954f, +0.015998f, +0.003568f, -0.026026f, -0.005075f, -0.014099f, -0.003434f, + -0.003325f, -0.000717f, +0.007392f, +0.002945f, -0.007733f, -0.001882f, -0.025215f, +0.002075f, +0.023622f, -0.003785f, + -0.012081f, -0.010668f, -0.006639f, +0.005024f, -0.006951f, -0.008867f, -0.001977f, -0.004389f, -0.005911f, -0.013143f, + +0.007003f, +0.008403f, +0.001800f, -0.002205f, +0.000103f, -0.003517f, -0.005461f, +0.006208f, -0.000286f, -0.004023f, + -0.003869f, -0.004121f, +0.002529f, +0.001725f, +0.004131f, +0.002986f, +0.004528f, +0.002280f, +0.003632f, -0.000179f, + -0.000111f, -0.002468f, +0.004834f, -0.000137f, -0.001653f, +0.001327f, -0.000922f, +0.001521f, -0.002421f, +0.001454f, + +0.001389f, -0.003120f, +0.001283f, +0.000222f, -0.000765f, -0.002000f + }, + { + +0.003701f, -0.094582f, -0.019585f, +0.011539f, +0.009653f, -0.010478f, +0.010224f, +0.012490f, -0.005110f, -0.018880f, + -0.000523f, -0.004196f, +0.019079f, +0.014670f, -0.044985f, +0.032291f, +0.036267f, +0.010895f, +0.028032f, -0.032133f, + +0.048456f, +0.010286f, -0.018912f, -0.027057f, -0.046469f, +0.005514f, -0.001633f, -0.000452f, -0.005420f, +0.014878f, + +0.002283f, +0.001354f, +0.013115f, -0.045422f, +0.004012f, -0.011416f, -0.006744f, -0.004766f, -0.009470f, -0.003990f, + -0.002244f, +0.014426f, +0.009465f, +0.010285f, -0.003135f, +0.009974f, +0.006443f, -0.000153f, -0.002791f, +0.005495f, + +0.009872f, -0.003324f, -0.001198f, -0.001255f, +0.001900f, +0.006505f, +0.002499f, -0.005150f, +0.000144f, +0.004349f, + -0.006385f, -0.000654f, +0.010540f, +0.002287f, -0.002808f, +0.004553f, -0.003386f, -0.008655f, -0.001482f, -0.001244f, + -0.004389f, +0.003855f, -0.001897f, -0.002927f, -0.004194f, +0.003106f, -0.002145f, -0.003827f, -0.001235f, -0.002475f, + -0.002528f, -0.003075f, +0.000679f, -0.003841f, -0.000092f, -0.001328f, -0.002513f, +0.001669f, -0.000940f, -0.000627f, + -0.000898f, +0.000398f, +0.000638f, +0.000674f, +0.001931f, -0.000964f + }, + { + +0.034909f, +0.224798f, +0.019710f, -0.036941f, +0.032958f, -0.052581f, -0.019279f, -0.020724f, -0.004436f, +0.014863f, + +0.021706f, -0.045663f, -0.003666f, -0.002928f, +0.019978f, +0.028690f, +0.044769f, -0.000545f, -0.021122f, +0.015235f, + +0.014495f, +0.008963f, +0.011876f, -0.002748f, -0.007068f, -0.013754f, -0.004991f, -0.007096f, -0.006415f, +0.002570f, + -0.009032f, -0.010148f, -0.001708f, -0.021797f, -0.009064f, -0.002205f, -0.021563f, -0.004959f, -0.022016f, +0.000905f, + +0.022825f, -0.020229f, -0.005578f, +0.002286f, +0.002636f, -0.017099f, -0.007603f, -0.002906f, +0.006504f, +0.013834f, + +0.015182f, -0.002520f, -0.007719f, +0.010607f, +0.014101f, +0.001024f, +0.002287f, -0.006521f, +0.000470f, +0.001791f, + +0.001700f, -0.000176f, +0.001770f, -0.002197f, -0.001616f, -0.002884f, +0.002485f, +0.002032f, +0.002857f, -0.000050f, + -0.003741f, +0.002636f, -0.003073f, +0.001495f, -0.000220f, -0.001653f, -0.000196f, -0.001621f, +0.002993f, +0.002837f, + -0.001782f, -0.001071f, +0.001923f, +0.003185f, +0.000667f, +0.002802f, -0.001511f, -0.002398f, +0.000742f, -0.001996f, + -0.000204f, +0.000376f, -0.000371f, -0.000121f, +0.000580f, -0.000662f + }, + { + -0.006714f, -0.104897f, +0.027938f, +0.003072f, +0.009754f, -0.015214f, +0.002405f, +0.004057f, -0.005420f, +0.011395f, + -0.009189f, -0.014552f, +0.017254f, -0.009221f, +0.060717f, -0.041344f, +0.038292f, +0.009182f, +0.011685f, +0.009610f, + -0.005601f, -0.003567f, -0.033259f, +0.016276f, +0.000144f, +0.010110f, -0.025014f, -0.013709f, +0.003976f, -0.026187f, + +0.015813f, +0.011717f, -0.000297f, +0.004374f, +0.006047f, +0.000934f, +0.021152f, +0.017582f, -0.014047f, +0.009792f, + -0.005966f, -0.008289f, +0.005154f, +0.002202f, -0.018742f, -0.007509f, -0.001596f, +0.003590f, -0.006485f, -0.001072f, + -0.004802f, +0.000305f, -0.004027f, +0.005589f, +0.009837f, +0.002430f, -0.003510f, -0.001619f, -0.001218f, -0.003751f, + -0.005556f, +0.004940f, +0.002636f, -0.000133f, -0.002104f, -0.002247f, -0.001414f, -0.002439f, -0.003766f, -0.008381f, + +0.000949f, +0.001670f, -0.000311f, -0.001655f, -0.001135f, +0.003521f, +0.000363f, -0.001227f, +0.002807f, -0.000180f, + -0.000220f, -0.003701f, -0.000084f, +0.003628f, +0.003812f, +0.000608f, -0.000540f, -0.000634f, -0.002847f, -0.002395f, + -0.002535f, +0.000108f, -0.000808f, +0.000023f, -0.000529f, +0.002831f + } + }, + { + { + -0.000851f, -0.277721f, -0.240802f, +0.003602f, -0.049267f, -0.005537f, -0.003462f, +0.004498f, -0.019744f, -0.002737f, + -0.020585f, -0.030604f, -0.040606f, -0.001402f, +0.045386f, -0.024887f, -0.011675f, +0.000382f, -0.005047f, -0.029676f, + -0.005454f, +0.012271f, -0.001383f, -0.008546f, +0.002102f, +0.014189f, +0.009146f, +0.019811f, -0.014154f, -0.010015f, + -0.025454f, +0.000062f, +0.017606f, +0.013736f, -0.002110f, +0.003233f, -0.003892f, +0.011112f, +0.008532f, +0.001131f, + +0.003705f, -0.008104f, -0.014679f, +0.001725f, -0.004926f, -0.011911f, +0.004195f, -0.011572f, -0.005638f, -0.010440f, + -0.002564f, -0.010127f, +0.001273f, -0.005786f, +0.001195f, -0.001156f, -0.001424f, -0.002270f, -0.002916f, +0.002907f, + +0.003727f, -0.001154f, -0.004059f, +0.000058f, -0.004428f, +0.002043f, +0.002348f, -0.003888f, -0.002551f, -0.000725f, + -0.002106f, -0.001487f, +0.002100f, -0.002601f, -0.002661f, -0.001866f, +0.002005f, -0.000114f, +0.002491f, +0.002911f, + +0.001640f, +0.000393f, +0.001027f, -0.001990f, +0.000640f, +0.000754f, -0.000949f, +0.002410f, -0.000559f, +0.001479f, + +0.000909f, +0.000096f, +0.000039f, +0.000539f, +0.000995f, +0.001033f + }, + { + -0.002279f, -0.029376f, -0.016638f, +0.001771f, +0.019389f, -0.001596f, -0.003851f, -0.000280f, -0.005298f, -0.012170f, + -0.032490f, -0.008634f, +0.017689f, -0.010318f, -0.002627f, +0.017436f, +0.013289f, +0.002983f, -0.037813f, +0.010725f, + -0.008921f, -0.011205f, +0.020863f, +0.016943f, -0.053767f, +0.012767f, +0.022956f, +0.013141f, +0.008291f, -0.003894f, + +0.015359f, -0.016827f, +0.017462f, -0.003105f, +0.018520f, -0.004029f, +0.004841f, +0.006189f, +0.003484f, -0.003575f, + -0.001245f, +0.009717f, +0.009440f, -0.004505f, +0.006125f, -0.001992f, +0.000846f, -0.006160f, -0.000341f, -0.005711f, + -0.010178f, -0.000627f, +0.004886f, -0.000085f, -0.005109f, -0.004346f, +0.001751f, -0.001837f, +0.009922f, +0.001653f, + -0.003305f, -0.003581f, -0.001107f, +0.006127f, -0.002412f, +0.001244f, -0.000589f, +0.002587f, +0.004367f, -0.002926f, + +0.001437f, +0.002244f, -0.005879f, -0.005561f, +0.001770f, +0.000216f, +0.000416f, +0.001848f, -0.000263f, -0.000088f, + +0.001727f, -0.002264f, +0.000263f, +0.002218f, +0.002452f, +0.001276f, -0.002045f, +0.000118f, +0.000408f, +0.001426f, + -0.001477f, -0.001616f, +0.000990f, +0.000327f, -0.001537f, +0.000899f + }, + { + -0.003851f, -0.046432f, -0.044008f, -0.038206f, -0.000826f, -0.006893f, -0.003215f, -0.005973f, -0.003622f, +0.001522f, + +0.012721f, -0.013580f, -0.008362f, -0.010205f, +0.023550f, +0.029596f, +0.013442f, +0.040797f, -0.033651f, +0.019625f, + +0.020371f, +0.011720f, +0.000667f, -0.008158f, +0.020044f, +0.015341f, -0.009990f, -0.008144f, +0.005332f, -0.001519f, + -0.012485f, -0.005482f, -0.008066f, -0.019856f, -0.009124f, +0.003318f, +0.008912f, +0.000797f, -0.001574f, -0.001964f, + -0.003001f, +0.003764f, +0.005370f, -0.002200f, +0.003298f, -0.004796f, +0.006400f, +0.007067f, -0.008571f, -0.004619f, + +0.005500f, -0.002891f, -0.002217f, -0.004724f, +0.003929f, -0.002398f, +0.005705f, +0.001048f, -0.000218f, +0.001408f, + +0.004272f, +0.000170f, +0.004026f, -0.003332f, -0.001244f, +0.005333f, +0.002404f, -0.001938f, +0.001536f, +0.001898f, + -0.001740f, -0.001655f, +0.003087f, +0.000466f, +0.003956f, +0.002251f, -0.005978f, -0.002622f, +0.002349f, +0.002104f, + +0.003305f, +0.000010f, -0.002832f, -0.000240f, +0.000875f, +0.000262f, -0.000869f, +0.000463f, +0.001033f, +0.001408f, + -0.000610f, -0.001659f, -0.002011f, -0.001990f, +0.000834f, +0.001200f + }, + { + -0.094552f, -0.344672f, +0.045941f, +0.092823f, -0.023101f, -0.001011f, -0.007762f, -0.010612f, +0.008446f, -0.012525f, + +0.005368f, +0.004840f, -0.008723f, -0.012664f, -0.040884f, -0.005732f, -0.041957f, -0.012010f, +0.002090f, +0.000231f, + +0.007838f, +0.015430f, +0.017682f, -0.011791f, +0.000790f, +0.011721f, -0.002115f, +0.006856f, +0.003588f, +0.005238f, + +0.017990f, -0.010550f, +0.006140f, -0.000791f, +0.002343f, +0.002540f, +0.001747f, -0.001159f, -0.007098f, +0.009491f, + +0.001170f, +0.007647f, +0.008657f, -0.003633f, +0.001489f, -0.000627f, -0.010794f, -0.010237f, -0.004250f, +0.007081f, + +0.004425f, +0.012691f, -0.002948f, -0.004672f, +0.009235f, +0.007252f, +0.004614f, +0.001701f, -0.004785f, +0.002030f, + +0.006057f, +0.007410f, -0.001948f, -0.004001f, -0.002814f, +0.005319f, +0.005434f, +0.002644f, -0.000624f, +0.003268f, + +0.000938f, +0.000616f, +0.001127f, -0.000506f, +0.000267f, -0.000770f, +0.002613f, +0.001979f, -0.000260f, -0.000577f, + -0.001623f, -0.000473f, -0.003005f, -0.001743f, -0.001137f, +0.000894f, -0.001291f, -0.001648f, -0.000417f, +0.000294f, + +0.001224f, +0.000871f, +0.000690f, +0.000976f, +0.001082f, +0.001335f + }, + { + -0.001199f, -0.064311f, +0.007976f, +0.010549f, -0.000050f, -0.000683f, +0.002166f, +0.007028f, +0.008034f, +0.000727f, + -0.006881f, +0.004963f, -0.013220f, -0.017933f, -0.038585f, -0.053205f, -0.030733f, +0.073288f, +0.011223f, +0.005776f, + +0.004932f, +0.018122f, -0.015996f, -0.018827f, -0.007911f, -0.021063f, +0.042164f, -0.013887f, +0.001969f, +0.009245f, + +0.011410f, +0.012673f, +0.005051f, +0.007708f, -0.002096f, -0.001524f, +0.004264f, +0.011860f, +0.009388f, +0.007068f, + +0.006442f, -0.006809f, +0.010940f, +0.009126f, +0.004744f, +0.006763f, +0.000925f, +0.001788f, +0.009767f, +0.010346f, + +0.009020f, -0.002234f, -0.002005f, -0.000987f, -0.000705f, -0.004659f, +0.000600f, -0.002779f, -0.003069f, +0.003113f, + +0.005813f, -0.005237f, +0.006338f, -0.001781f, +0.003487f, -0.003373f, +0.001978f, +0.006746f, +0.000732f, +0.001433f, + -0.001754f, +0.000587f, +0.000850f, +0.003971f, -0.002118f, -0.000290f, +0.002726f, +0.001399f, -0.001867f, -0.002157f, + +0.001274f, +0.000873f, -0.000938f, -0.001262f, -0.001631f, -0.000418f, -0.000499f, -0.000073f, +0.000402f, +0.000454f, + +0.001290f, +0.001052f, -0.001524f, -0.000085f, +0.000999f, +0.000223f + }, + { + -0.130693f, -0.375111f, +0.026557f, +0.009649f, +0.023491f, -0.000570f, +0.025115f, +0.013864f, -0.015985f, +0.022349f, + +0.005842f, -0.011936f, +0.022237f, +0.000365f, +0.005558f, +0.013351f, -0.010235f, -0.004173f, +0.002148f, +0.025091f, + +0.005461f, +0.005493f, +0.006035f, -0.004455f, -0.011591f, +0.002160f, +0.015518f, +0.007845f, +0.019122f, +0.016782f, + -0.004495f, -0.014513f, -0.022106f, -0.014898f, -0.012073f, -0.008455f, -0.003210f, +0.003611f, -0.005888f, -0.008984f, + +0.002340f, +0.008187f, +0.009315f, -0.002235f, +0.016621f, +0.010356f, -0.010225f, +0.001083f, +0.007194f, +0.007548f, + -0.000224f, +0.008928f, -0.003261f, +0.012553f, +0.000251f, +0.002546f, -0.002999f, -0.001147f, -0.005913f, -0.000673f, + +0.001889f, +0.001044f, +0.002852f, +0.005636f, -0.002974f, -0.001148f, +0.003510f, -0.001407f, +0.001306f, +0.000805f, + -0.000106f, +0.002618f, -0.003519f, -0.000050f, -0.000643f, -0.000201f, -0.002049f, +0.000734f, -0.000283f, +0.000620f, + +0.001388f, +0.002861f, -0.002732f, -0.001368f, +0.000059f, +0.001515f, -0.000024f, -0.000640f, +0.000140f, +0.002475f, + -0.000349f, +0.000284f, +0.000045f, -0.000316f, +0.000888f, +0.000116f + }, + { + -0.000902f, -0.023093f, +0.011804f, +0.002419f, +0.007312f, -0.001573f, -0.002095f, +0.006261f, +0.003469f, +0.001074f, + +0.006760f, +0.007456f, -0.000139f, +0.009465f, +0.010427f, -0.028625f, +0.002705f, -0.002965f, +0.001434f, -0.001132f, + +0.013476f, +0.011650f, +0.039000f, -0.008155f, -0.032951f, +0.001361f, -0.039013f, +0.007640f, -0.009668f, +0.003242f, + -0.014449f, -0.011339f, -0.002268f, +0.011608f, +0.000209f, -0.013569f, +0.002004f, +0.002188f, -0.006076f, -0.006189f, + -0.000191f, -0.003051f, -0.002650f, -0.002588f, -0.001053f, +0.007413f, -0.000246f, +0.010621f, +0.002674f, -0.003131f, + -0.002986f, +0.003347f, +0.001769f, -0.005161f, -0.000603f, +0.002001f, +0.003460f, -0.006295f, +0.005647f, -0.005925f, + -0.004123f, -0.001220f, -0.001741f, -0.002373f, -0.000325f, -0.000087f, +0.003145f, +0.002272f, +0.006174f, -0.001979f, + +0.000220f, -0.001558f, +0.000344f, -0.002121f, -0.000315f, -0.001542f, +0.001475f, +0.000488f, -0.000421f, -0.001586f, + -0.000925f, -0.001537f, +0.002721f, +0.000385f, -0.000968f, -0.000218f, +0.001390f, -0.001156f, -0.000041f, +0.001622f, + -0.000108f, -0.002088f, +0.000594f, +0.000476f, -0.001188f, -0.000388f + }, + { + +0.090355f, -0.432231f, -0.072197f, -0.094932f, -0.018809f, +0.006460f, -0.002932f, +0.007184f, +0.006705f, +0.013322f, + -0.003841f, -0.021931f, -0.005852f, +0.014143f, +0.028598f, -0.018625f, +0.014880f, +0.024755f, -0.017216f, +0.012428f, + +0.010953f, +0.008584f, +0.008386f, +0.008497f, +0.004414f, +0.002634f, +0.015055f, -0.000878f, -0.006060f, -0.008932f, + -0.003556f, -0.000484f, +0.006796f, +0.006097f, +0.002064f, -0.002419f, -0.007690f, +0.006225f, -0.001967f, +0.003504f, + -0.006784f, +0.002030f, -0.002319f, -0.001164f, +0.014868f, -0.005883f, -0.005321f, +0.015418f, +0.005465f, +0.010869f, + +0.012532f, -0.000695f, +0.003240f, +0.000135f, +0.001163f, +0.006345f, +0.002043f, -0.009080f, -0.001728f, -0.004906f, + -0.004915f, +0.000835f, -0.002939f, -0.001403f, +0.000979f, +0.004674f, +0.001382f, -0.002085f, +0.004629f, -0.002208f, + -0.001921f, +0.000456f, -0.001945f, -0.003090f, -0.001914f, -0.003089f, -0.002473f, -0.000972f, -0.003798f, -0.000958f, + +0.000975f, +0.001780f, +0.000702f, +0.000103f, -0.000778f, +0.002609f, +0.000223f, +0.000423f, +0.001958f, -0.002200f, + -0.002453f, -0.000485f, -0.000333f, +0.000728f, -0.000902f, +0.002216f + }, + { + -0.002046f, -0.000674f, -0.009989f, +0.018633f, +0.002102f, +0.000217f, +0.001128f, +0.003187f, +0.002278f, +0.001698f, + -0.002269f, +0.008584f, -0.002696f, -0.004764f, -0.100375f, -0.056053f, -0.029966f, +0.007775f, -0.020657f, +0.047838f, + +0.021952f, -0.033338f, +0.006958f, -0.010879f, -0.044826f, -0.019666f, +0.004117f, -0.012175f, +0.025116f, -0.013381f, + -0.007231f, +0.006911f, -0.007601f, -0.017654f, +0.020896f, -0.005072f, -0.005084f, +0.006961f, +0.007042f, +0.015962f, + -0.000761f, -0.000814f, +0.009222f, +0.002227f, -0.011414f, -0.008726f, -0.006113f, -0.001464f, +0.000965f, -0.000756f, + -0.001240f, -0.008998f, -0.005253f, +0.003250f, +0.000303f, +0.000625f, +0.004578f, -0.000225f, -0.000247f, -0.000878f, + +0.001713f, -0.005213f, -0.002630f, -0.004075f, +0.000294f, -0.001504f, -0.002418f, -0.000973f, +0.002670f, -0.003240f, + -0.000406f, -0.002256f, +0.001592f, +0.002928f, +0.002073f, +0.001522f, +0.003666f, +0.000307f, +0.001987f, +0.001669f, + -0.001015f, -0.001865f, +0.000979f, +0.001274f, +0.000992f, +0.000715f, -0.001957f, +0.000097f, +0.001809f, -0.001169f, + +0.001179f, +0.000390f, -0.000017f, +0.000515f, +0.001802f, -0.000376f + }, + { + +0.054731f, -0.025384f, -0.107790f, +0.025085f, -0.005672f, +0.011758f, +0.048596f, +0.005326f, -0.016275f, +0.016000f, + +0.005431f, +0.012909f, -0.025212f, -0.034762f, -0.012382f, +0.003436f, -0.001225f, +0.009269f, -0.024011f, -0.000092f, + +0.007325f, +0.004671f, +0.002357f, -0.007060f, +0.025362f, +0.017051f, -0.000837f, -0.004848f, +0.010699f, +0.002001f, + -0.015727f, +0.008060f, +0.003797f, +0.013428f, -0.015480f, -0.010340f, -0.011476f, -0.008567f, +0.007373f, +0.011241f, + -0.002506f, +0.000271f, +0.003137f, +0.003329f, +0.010221f, -0.010133f, -0.007267f, +0.002930f, -0.003684f, -0.003343f, + +0.007567f, -0.008711f, +0.000654f, +0.000948f, +0.000753f, -0.000033f, -0.008363f, +0.004393f, -0.000460f, -0.002779f, + +0.000965f, -0.007448f, -0.004828f, +0.000345f, -0.003275f, -0.004269f, +0.000298f, -0.001071f, +0.003057f, -0.001748f, + +0.000656f, -0.000275f, -0.001863f, -0.003446f, +0.003045f, -0.001971f, +0.000864f, +0.000663f, +0.000446f, +0.001572f, + +0.003335f, +0.002447f, -0.000932f, +0.001830f, +0.001864f, +0.001489f, +0.001738f, +0.001008f, -0.000631f, -0.000371f, + -0.003137f, -0.000179f, -0.003098f, -0.000104f, +0.000971f, +0.001904f + }, + { + -0.004262f, -0.007976f, +0.028233f, -0.004156f, -0.004316f, -0.002756f, -0.017308f, -0.008755f, +0.001507f, +0.005374f, + -0.005118f, -0.017290f, -0.008100f, -0.018270f, -0.010257f, -0.003215f, -0.016903f, +0.012316f, -0.017824f, -0.013921f, + -0.003977f, -0.000826f, +0.001064f, +0.012920f, +0.009069f, -0.010065f, -0.026091f, -0.003405f, -0.002202f, +0.014342f, + +0.002243f, -0.010358f, -0.001619f, -0.003049f, +0.010681f, -0.019936f, -0.002869f, -0.010093f, +0.003164f, -0.003707f, + -0.012349f, +0.008739f, -0.011497f, -0.002198f, +0.003511f, -0.001771f, +0.003899f, -0.004455f, -0.004247f, -0.007702f, + -0.006804f, -0.000797f, -0.001524f, +0.003213f, +0.000525f, -0.014574f, -0.002189f, +0.001036f, +0.000654f, +0.006863f, + +0.005892f, -0.003162f, -0.001790f, +0.003139f, +0.004884f, -0.000837f, -0.001345f, -0.000749f, -0.001209f, -0.000287f, + +0.000695f, +0.004226f, +0.001020f, -0.000724f, -0.001760f, +0.000742f, +0.000820f, -0.001101f, -0.001396f, +0.000273f, + -0.003017f, +0.000292f, -0.001342f, -0.000735f, -0.000942f, +0.000852f, +0.000639f, -0.000206f, +0.000518f, -0.001525f, + -0.001605f, +0.001871f, +0.002462f, -0.000745f, -0.000454f, +0.000262f + }, + { + +0.102628f, +0.202008f, -0.002539f, +0.003131f, -0.009516f, -0.012491f, +0.003694f, +0.004949f, -0.015128f, -0.003860f, + +0.023901f, +0.008673f, +0.006514f, -0.010135f, -0.004443f, -0.018143f, +0.002077f, -0.005743f, -0.028096f, -0.000277f, + +0.011778f, -0.002656f, -0.005407f, -0.015866f, +0.028134f, -0.003338f, +0.025591f, -0.007234f, -0.003177f, -0.011654f, + +0.006499f, +0.000840f, -0.003721f, -0.010880f, +0.008993f, +0.007596f, -0.016637f, -0.006185f, -0.013908f, +0.000170f, + -0.008940f, +0.008402f, -0.004916f, +0.004567f, +0.005101f, -0.018138f, -0.019604f, +0.009721f, +0.006633f, +0.000928f, + -0.007501f, -0.013498f, -0.002773f, -0.002609f, -0.002166f, -0.004252f, -0.007034f, -0.002655f, -0.007515f, -0.005893f, + +0.007259f, +0.004300f, +0.001166f, -0.000548f, -0.001416f, -0.000732f, -0.006001f, +0.001735f, +0.001788f, -0.004047f, + -0.003288f, -0.000919f, +0.000987f, +0.002009f, +0.002497f, +0.002855f, +0.003238f, +0.003108f, +0.003701f, -0.001414f, + +0.000226f, -0.000665f, +0.002093f, +0.002389f, -0.002146f, +0.000315f, +0.001103f, -0.000540f, -0.003021f, +0.002681f, + +0.000716f, -0.002617f, +0.000019f, +0.001156f, -0.000974f, -0.001542f + }, + { + -0.002083f, -0.101853f, -0.005458f, +0.010247f, +0.006475f, +0.002601f, +0.005717f, -0.000327f, +0.001693f, -0.018644f, + +0.002075f, -0.005488f, +0.015946f, +0.045521f, +0.018147f, -0.041428f, +0.032767f, +0.006796f, -0.003168f, +0.008348f, + -0.021880f, +0.058027f, -0.000008f, -0.035117f, -0.035140f, -0.005955f, -0.014427f, -0.014523f, +0.013542f, +0.021565f, + +0.007863f, -0.015784f, +0.009103f, -0.012795f, -0.010500f, -0.015843f, -0.004811f, +0.005428f, -0.000397f, -0.013624f, + +0.000720f, +0.004504f, +0.017929f, +0.010058f, +0.003798f, +0.003191f, +0.006352f, +0.000677f, -0.001474f, -0.000399f, + +0.012793f, -0.001489f, -0.001647f, +0.000180f, +0.001204f, +0.001630f, -0.002431f, -0.003486f, +0.001882f, -0.001759f, + -0.001103f, +0.000828f, +0.008417f, +0.001518f, -0.002232f, -0.000359f, -0.001024f, -0.007962f, +0.001615f, -0.001908f, + -0.003869f, +0.000069f, -0.000871f, -0.002301f, -0.003462f, +0.001515f, -0.000153f, -0.005011f, -0.002757f, -0.000375f, + -0.002816f, -0.003631f, -0.002240f, -0.000036f, +0.000216f, -0.002474f, -0.001732f, +0.000886f, -0.002253f, -0.001214f, + +0.000026f, +0.000723f, +0.000522f, +0.000337f, +0.001400f, +0.000616f + }, + { + +0.007064f, +0.260005f, -0.004064f, +0.020656f, -0.013406f, -0.028452f, -0.024755f, -0.012433f, +0.003027f, -0.008589f, + +0.033380f, -0.039665f, -0.000734f, -0.008758f, +0.039781f, +0.001411f, +0.029258f, +0.014416f, -0.011654f, +0.012643f, + +0.017614f, +0.014844f, -0.004992f, +0.002445f, +0.001529f, -0.007660f, -0.013364f, -0.009701f, +0.006646f, -0.016597f, + -0.007513f, -0.001815f, -0.006053f, -0.018518f, -0.005765f, -0.006255f, -0.008671f, -0.020802f, -0.002130f, -0.008680f, + +0.008485f, +0.003637f, -0.013477f, -0.007223f, -0.001570f, -0.010246f, -0.001439f, +0.000953f, +0.000220f, +0.009858f, + +0.011587f, +0.011166f, -0.004037f, +0.004169f, +0.010898f, -0.001132f, +0.000977f, -0.001286f, -0.001031f, +0.007251f, + -0.001984f, +0.000754f, -0.003510f, -0.001139f, -0.001124f, -0.000567f, -0.002028f, +0.001808f, +0.002450f, -0.005782f, + +0.004991f, +0.000994f, -0.002081f, +0.001082f, -0.000310f, -0.004325f, -0.002296f, +0.002210f, +0.002940f, +0.003752f, + -0.000599f, -0.002691f, +0.000193f, +0.003666f, +0.000957f, -0.000693f, -0.000357f, -0.000065f, +0.000061f, -0.003195f, + -0.000010f, +0.001525f, +0.000160f, -0.000011f, -0.000620f, +0.001542f + }, + { + +0.007725f, -0.085097f, -0.002819f, +0.012037f, -0.000184f, +0.000469f, -0.008656f, +0.001162f, -0.005206f, -0.003519f, + +0.001948f, -0.001045f, -0.005143f, -0.010877f, +0.105405f, -0.021055f, +0.000769f, +0.015712f, +0.001586f, +0.032245f, + -0.022675f, -0.022501f, -0.021134f, +0.004905f, +0.022954f, -0.006559f, -0.015629f, -0.035401f, -0.016469f, +0.011039f, + +0.006436f, +0.013007f, +0.002364f, -0.004920f, +0.003841f, +0.013974f, +0.012512f, +0.013325f, +0.003739f, +0.000885f, + +0.006534f, -0.011960f, +0.010278f, -0.010163f, -0.011505f, -0.006479f, -0.008686f, +0.000948f, +0.002242f, -0.006762f, + -0.004525f, -0.000004f, -0.001427f, +0.009961f, +0.005062f, +0.004217f, -0.002273f, -0.004174f, -0.004962f, +0.001670f, + -0.004565f, -0.001777f, +0.006486f, -0.000263f, -0.004333f, -0.004156f, -0.001646f, -0.005075f, -0.003201f, -0.004336f, + +0.000988f, -0.000056f, -0.001222f, -0.000169f, +0.001292f, +0.001860f, +0.002174f, -0.002136f, +0.000554f, +0.000815f, + -0.000455f, -0.004335f, +0.001222f, +0.003799f, +0.004437f, +0.000251f, -0.000879f, -0.000886f, -0.003476f, -0.001895f, + -0.002032f, -0.000139f, +0.000145f, -0.001367f, +0.000289f, +0.001109f + } + }, + { + { + -0.006202f, +0.041130f, +0.061582f, +0.049766f, -0.019043f, +0.008486f, -0.004938f, +0.015414f, -0.001801f, -0.005006f, + -0.010140f, +0.009812f, -0.031412f, -0.018326f, +0.016368f, -0.029276f, -0.011746f, -0.008309f, -0.002837f, -0.021529f, + -0.003875f, +0.011100f, +0.009701f, -0.004642f, -0.002708f, +0.007015f, -0.006484f, +0.004138f, +0.002837f, +0.010188f, + -0.013538f, +0.009230f, +0.007548f, +0.005840f, -0.004359f, +0.008621f, +0.002809f, +0.004991f, -0.004562f, -0.004017f, + +0.010237f, -0.001044f, -0.008975f, +0.001359f, +0.002034f, -0.004026f, +0.010194f, -0.003238f, +0.001293f, -0.003171f, + +0.002730f, -0.008230f, +0.004805f, -0.006399f, +0.003354f, +0.001585f, -0.000420f, -0.003339f, -0.003291f, +0.002334f, + -0.002133f, -0.003760f, -0.002120f, +0.001323f, -0.004703f, +0.002536f, +0.001981f, -0.001159f, -0.000374f, -0.000785f, + +0.000367f, +0.001503f, +0.002866f, -0.001644f, -0.001830f, -0.002285f, +0.000979f, +0.000538f, +0.002943f, +0.002155f, + +0.000796f, -0.001501f, -0.000329f, -0.001291f, +0.001088f, +0.000948f, -0.001507f, +0.001165f, -0.001632f, +0.000740f, + +0.000351f, +0.000456f, -0.000696f, -0.000166f, +0.000910f, -0.000400f + }, + { + +0.002388f, -0.002013f, +0.001642f, -0.017208f, +0.003652f, -0.002300f, -0.006857f, +0.006432f, +0.001338f, -0.000860f, + -0.017918f, -0.011738f, +0.012032f, -0.005955f, -0.005304f, -0.017767f, -0.007014f, +0.014100f, -0.001319f, +0.019621f, + -0.010130f, -0.001896f, +0.004210f, +0.021212f, -0.033534f, +0.011393f, +0.012005f, -0.003865f, +0.006070f, +0.000553f, + +0.026563f, -0.017789f, +0.012268f, -0.011748f, +0.008380f, -0.006895f, -0.004346f, -0.003868f, +0.001227f, -0.005803f, + -0.004918f, +0.003849f, +0.004683f, -0.009435f, +0.000791f, -0.002406f, -0.000740f, -0.007625f, +0.001422f, +0.002845f, + -0.005288f, -0.000796f, -0.000523f, -0.002058f, -0.004052f, -0.001357f, +0.003068f, -0.003720f, +0.006325f, +0.000325f, + -0.003106f, -0.002050f, -0.001394f, +0.003981f, -0.001226f, +0.001947f, -0.002760f, -0.000803f, +0.001507f, -0.001076f, + +0.003281f, +0.000296f, -0.000155f, +0.000148f, +0.002266f, +0.000100f, +0.001832f, +0.002474f, +0.000001f, -0.000890f, + +0.001502f, -0.000729f, +0.000592f, -0.001444f, -0.000106f, +0.000354f, -0.001771f, +0.000994f, +0.001007f, +0.002220f, + +0.000111f, -0.000927f, +0.000401f, +0.000555f, -0.000908f, +0.001295f + }, + { + +0.001390f, +0.026715f, +0.023965f, -0.010838f, +0.013290f, -0.004917f, +0.005052f, +0.002763f, -0.008130f, +0.004307f, + +0.013467f, -0.029244f, +0.001618f, +0.007243f, +0.014490f, +0.003786f, -0.021101f, +0.029407f, -0.030942f, +0.015067f, + +0.008164f, +0.000987f, +0.000790f, -0.001671f, +0.005095f, +0.008877f, +0.007410f, -0.000048f, +0.013077f, -0.002028f, + -0.009315f, +0.009476f, +0.000698f, -0.015174f, -0.004318f, +0.002657f, +0.001521f, -0.001183f, +0.002748f, +0.001566f, + -0.001903f, +0.003817f, +0.004633f, -0.003828f, +0.005793f, -0.006148f, +0.000144f, +0.000683f, -0.008068f, -0.004392f, + +0.002762f, -0.002726f, -0.000340f, -0.004872f, +0.004358f, -0.003320f, +0.002635f, -0.004803f, +0.000338f, -0.000192f, + -0.000273f, -0.004346f, +0.001065f, -0.002266f, -0.000657f, +0.002133f, -0.000152f, -0.001894f, +0.002987f, +0.001900f, + -0.000184f, -0.002040f, -0.000359f, -0.002432f, +0.000113f, +0.001487f, -0.001733f, -0.000359f, -0.001309f, -0.001942f, + +0.001264f, +0.002500f, -0.000661f, +0.001845f, +0.000685f, -0.000264f, -0.001033f, -0.000566f, -0.000630f, -0.000208f, + -0.000549f, -0.001037f, +0.000132f, -0.001064f, +0.000869f, +0.000608f + }, + { + +0.082386f, -0.140381f, +0.021834f, +0.103399f, -0.020785f, +0.010043f, +0.006187f, -0.005920f, +0.004864f, -0.004945f, + +0.003871f, +0.003117f, -0.004755f, -0.001658f, -0.011436f, +0.019428f, -0.010538f, -0.015781f, -0.012186f, +0.002405f, + +0.003791f, -0.004849f, +0.001171f, -0.011768f, -0.000140f, +0.009333f, +0.004736f, +0.006190f, -0.001134f, +0.002007f, + +0.018864f, -0.009438f, +0.002226f, -0.002574f, -0.001533f, -0.002442f, +0.002821f, +0.002079f, -0.005495f, +0.001555f, + -0.007895f, +0.002028f, -0.001021f, -0.005978f, +0.012107f, +0.010763f, +0.000788f, -0.002439f, -0.005295f, +0.001485f, + -0.004851f, +0.011367f, +0.004717f, -0.003116f, +0.000656f, -0.001467f, -0.002880f, +0.001033f, -0.005329f, +0.002208f, + +0.002470f, -0.000749f, +0.001310f, +0.003330f, -0.003478f, +0.000482f, -0.002391f, -0.002798f, +0.001267f, +0.001784f, + -0.000462f, +0.000638f, -0.001137f, -0.000949f, +0.000091f, -0.001213f, +0.001067f, +0.000850f, -0.000277f, +0.000174f, + -0.000671f, +0.000518f, -0.002559f, -0.000804f, +0.000185f, +0.002496f, +0.000336f, -0.001402f, +0.000322f, -0.000045f, + -0.001244f, -0.000402f, +0.000242f, -0.000135f, -0.000808f, +0.000198f + }, + { + +0.000645f, -0.061528f, +0.010580f, +0.008868f, -0.001804f, -0.000660f, -0.000097f, -0.001448f, +0.002533f, -0.000236f, + -0.015512f, -0.000743f, -0.011680f, -0.021339f, -0.018050f, +0.007924f, +0.005661f, +0.009743f, -0.051571f, +0.022514f, + +0.007028f, +0.014725f, -0.002325f, -0.018717f, -0.005183f, -0.009578f, +0.035617f, -0.027432f, -0.000532f, -0.005064f, + -0.004791f, +0.000753f, -0.003880f, +0.006031f, +0.000026f, -0.002744f, +0.004106f, +0.006895f, -0.007426f, -0.003019f, + +0.007776f, -0.006323f, +0.001573f, +0.001102f, -0.002859f, +0.004254f, +0.004158f, -0.003930f, +0.001553f, +0.006312f, + +0.002074f, -0.003874f, -0.001302f, +0.001040f, +0.001142f, -0.004786f, +0.000560f, -0.005009f, +0.000633f, +0.005565f, + +0.003342f, -0.004361f, +0.003814f, -0.003021f, +0.004315f, -0.002799f, +0.000229f, +0.002639f, +0.001276f, +0.003506f, + -0.004018f, +0.001063f, +0.001012f, +0.003109f, +0.000288f, +0.000258f, +0.001763f, +0.002119f, -0.000433f, -0.000831f, + +0.001064f, +0.001521f, +0.000373f, +0.001922f, +0.000124f, -0.000546f, -0.000560f, -0.000025f, +0.000042f, -0.000035f, + +0.001520f, +0.001283f, -0.000685f, -0.000298f, +0.000581f, -0.000384f + }, + { + +0.110560f, -0.094230f, +0.011348f, -0.037230f, -0.035301f, -0.004354f, -0.003057f, -0.014450f, -0.006173f, +0.007222f, + -0.012408f, -0.015268f, +0.009277f, -0.008440f, +0.013770f, +0.014582f, -0.001565f, +0.003759f, +0.001142f, +0.013605f, + -0.006782f, -0.007493f, -0.001494f, -0.002514f, -0.010900f, -0.001031f, +0.003873f, -0.002648f, +0.006681f, -0.000085f, + -0.000477f, +0.004961f, -0.003481f, -0.003286f, -0.001037f, +0.003121f, +0.002863f, +0.006777f, +0.003115f, -0.005086f, + -0.007908f, -0.008943f, -0.001479f, -0.011586f, +0.004661f, +0.006367f, -0.013331f, -0.004711f, +0.002563f, -0.002399f, + -0.009847f, +0.004219f, -0.004569f, +0.006792f, -0.001604f, +0.004269f, +0.001655f, +0.003078f, -0.002404f, +0.000709f, + +0.001454f, -0.002286f, -0.002701f, +0.003200f, -0.003344f, -0.002744f, +0.001982f, -0.003063f, +0.000074f, -0.000709f, + -0.000064f, +0.001460f, -0.002667f, +0.001906f, -0.000820f, +0.001219f, -0.001248f, +0.000822f, -0.001890f, -0.000912f, + -0.000285f, +0.002840f, -0.001067f, +0.000227f, +0.001044f, +0.001275f, -0.001011f, +0.000298f, +0.000124f, +0.000464f, + -0.000993f, +0.001112f, +0.000008f, +0.000204f, +0.001751f, -0.000261f + }, + { + -0.000381f, -0.015922f, +0.006083f, -0.006032f, +0.004448f, -0.000199f, -0.001702f, +0.006829f, +0.000239f, -0.001438f, + +0.004180f, +0.008540f, +0.003908f, +0.006965f, +0.001668f, -0.033378f, +0.038942f, +0.020846f, +0.006062f, -0.024524f, + +0.001127f, +0.019993f, +0.009396f, +0.000166f, +0.016634f, +0.029773f, -0.028301f, -0.010176f, -0.015229f, +0.028594f, + -0.001657f, -0.012060f, +0.003141f, +0.008444f, +0.002346f, -0.003470f, +0.005748f, +0.006204f, +0.000802f, -0.004488f, + -0.000266f, -0.005672f, -0.001268f, +0.002334f, +0.005447f, +0.009543f, -0.001655f, +0.007121f, -0.000264f, -0.001201f, + -0.004407f, -0.000858f, +0.005423f, -0.000985f, +0.000703f, +0.000360f, +0.002890f, -0.004557f, +0.006547f, -0.005594f, + -0.000645f, +0.004480f, +0.003557f, +0.002250f, +0.001411f, -0.000087f, +0.001020f, -0.001307f, +0.000052f, -0.003245f, + +0.002669f, +0.001470f, -0.000239f, -0.000155f, +0.002433f, -0.001621f, +0.000339f, -0.000436f, +0.000946f, -0.000345f, + -0.000269f, -0.000456f, +0.002058f, -0.000799f, -0.001272f, -0.000219f, +0.000788f, -0.001183f, -0.001270f, +0.000209f, + +0.000171f, -0.001042f, +0.001311f, +0.000852f, -0.000442f, +0.000382f + }, + { + -0.031846f, -0.409565f, +0.061353f, -0.075654f, +0.012552f, -0.000508f, -0.023662f, +0.000466f, +0.011005f, +0.009339f, + -0.003237f, -0.006408f, +0.000353f, -0.003763f, +0.019134f, -0.026926f, -0.001904f, +0.017785f, +0.005606f, +0.016590f, + -0.005716f, -0.008373f, -0.012236f, +0.000505f, +0.001557f, -0.000438f, -0.000863f, -0.012353f, -0.005913f, -0.002603f, + -0.000938f, -0.004770f, +0.002694f, +0.005491f, +0.001178f, -0.004497f, -0.011721f, +0.001493f, +0.000031f, +0.000697f, + -0.007609f, +0.005116f, +0.005530f, -0.005477f, +0.009442f, -0.005125f, -0.001874f, +0.011640f, +0.001705f, +0.001060f, + -0.000548f, -0.010568f, +0.000043f, +0.003080f, -0.000249f, +0.001809f, +0.000401f, -0.004036f, +0.003705f, -0.001611f, + -0.005094f, +0.005075f, +0.000356f, +0.000228f, +0.003300f, +0.004375f, +0.000901f, -0.003228f, +0.003003f, -0.000743f, + -0.001049f, +0.002839f, +0.001505f, -0.001880f, -0.002155f, -0.003561f, -0.001559f, +0.000373f, -0.001238f, -0.000872f, + -0.000180f, -0.000224f, -0.001824f, -0.000734f, -0.001214f, +0.001968f, +0.000048f, -0.001334f, +0.001516f, -0.000829f, + -0.001053f, +0.000712f, -0.000767f, +0.000620f, -0.001128f, +0.001148f + }, + { + +0.000212f, +0.010466f, -0.018547f, +0.007614f, -0.005842f, -0.000071f, -0.000686f, +0.000354f, +0.001344f, +0.002977f, + -0.006809f, +0.004024f, +0.003769f, +0.019602f, -0.056289f, -0.042743f, -0.000292f, +0.008684f, -0.018032f, +0.025212f, + +0.000708f, -0.001318f, -0.004557f, +0.004670f, -0.003653f, +0.010206f, +0.026774f, -0.018378f, +0.010979f, -0.005253f, + +0.010207f, +0.017117f, -0.010965f, -0.012619f, +0.016406f, -0.015236f, -0.007430f, +0.005726f, -0.003924f, +0.004252f, + +0.005669f, +0.002860f, +0.003051f, -0.005883f, -0.005062f, -0.000151f, +0.001135f, +0.000500f, -0.002009f, -0.003757f, + +0.001168f, +0.000372f, -0.003610f, -0.000133f, -0.001783f, -0.000857f, -0.001106f, -0.002496f, -0.001295f, +0.000701f, + +0.006181f, +0.000296f, +0.002566f, -0.001056f, +0.000209f, +0.000548f, -0.001609f, -0.002929f, +0.000328f, -0.005802f, + -0.001871f, -0.002462f, -0.000487f, +0.001718f, -0.000084f, -0.002422f, -0.000279f, -0.002252f, +0.000292f, +0.000199f, + -0.001016f, -0.000811f, +0.002753f, +0.000704f, +0.000786f, +0.001913f, +0.000136f, +0.001178f, +0.000733f, -0.000213f, + +0.001183f, -0.001351f, -0.000507f, -0.000166f, +0.001044f, -0.000199f + }, + { + -0.049023f, +0.032256f, +0.058908f, +0.008350f, -0.005563f, -0.018469f, +0.011465f, +0.021689f, -0.003994f, -0.001545f, + -0.010587f, +0.016343f, +0.006656f, -0.002320f, -0.008861f, -0.004767f, -0.003394f, -0.002139f, -0.018869f, +0.012343f, + +0.006037f, +0.001454f, +0.001012f, -0.016040f, +0.013816f, +0.001654f, -0.014398f, -0.008564f, +0.006277f, +0.007688f, + -0.015847f, +0.008659f, +0.000281f, +0.008442f, -0.013725f, -0.002485f, +0.000940f, -0.000301f, +0.004904f, +0.002354f, + -0.011786f, +0.001505f, -0.000366f, -0.009649f, +0.006553f, -0.002014f, -0.008474f, +0.001030f, +0.002470f, -0.001963f, + +0.008918f, -0.004258f, -0.001424f, -0.001262f, -0.001151f, +0.002127f, -0.005216f, +0.003829f, +0.000673f, -0.002718f, + +0.000319f, -0.005011f, -0.001537f, +0.001694f, +0.000327f, +0.000636f, +0.002894f, -0.000825f, +0.004764f, +0.000011f, + +0.001450f, +0.000543f, +0.002137f, -0.001168f, +0.002804f, -0.000797f, +0.000235f, -0.002422f, +0.000456f, +0.000864f, + +0.002668f, +0.000548f, -0.001922f, -0.000587f, +0.000202f, +0.000080f, +0.001041f, +0.001138f, -0.001351f, -0.000038f, + -0.001508f, +0.000975f, -0.001043f, +0.000291f, -0.000538f, +0.000808f + }, + { + +0.004856f, -0.033514f, +0.003861f, -0.003302f, -0.000525f, +0.002951f, -0.012784f, +0.003150f, +0.001056f, +0.014928f, + +0.007726f, -0.009892f, +0.008888f, -0.002140f, -0.004850f, +0.000488f, -0.006804f, +0.020633f, +0.000108f, -0.002185f, + +0.005729f, -0.004822f, -0.016222f, +0.003060f, +0.010144f, +0.000320f, -0.016333f, -0.010290f, -0.013994f, +0.023216f, + +0.018722f, -0.008415f, +0.000352f, -0.011769f, -0.000016f, -0.017500f, +0.008734f, -0.002409f, +0.004652f, -0.002383f, + -0.013960f, +0.007154f, -0.012593f, -0.001722f, +0.007207f, -0.007764f, +0.001524f, -0.001869f, +0.002746f, +0.002280f, + +0.001249f, -0.002700f, -0.002511f, +0.003151f, +0.004697f, -0.005681f, -0.000928f, -0.002155f, -0.000991f, +0.003902f, + +0.004366f, -0.005540f, -0.000581f, +0.003725f, +0.004020f, -0.004571f, -0.002824f, +0.000664f, +0.000495f, -0.000824f, + -0.001129f, +0.000770f, +0.001729f, +0.000694f, -0.001178f, -0.000645f, +0.000056f, +0.000051f, -0.000264f, +0.000769f, + -0.001321f, +0.001509f, -0.001765f, -0.001037f, -0.000226f, -0.000180f, +0.000450f, +0.000210f, +0.001204f, +0.000125f, + -0.000441f, +0.000474f, +0.000232f, -0.000059f, -0.000025f, +0.000369f + }, + { + -0.099443f, -0.108108f, -0.037781f, +0.005652f, +0.006328f, +0.021036f, +0.025653f, -0.012358f, -0.009653f, +0.008500f, + +0.015546f, +0.001939f, +0.003638f, -0.008413f, +0.011314f, +0.004398f, +0.003643f, -0.017835f, -0.022495f, +0.012945f, + +0.017895f, -0.004148f, +0.009578f, -0.000457f, +0.033381f, -0.003840f, +0.027082f, -0.008193f, +0.004110f, -0.012246f, + +0.004234f, -0.001539f, -0.009561f, -0.008503f, +0.004252f, -0.001524f, -0.014636f, +0.005960f, -0.003407f, +0.005404f, + -0.006079f, +0.002179f, -0.014049f, -0.000816f, +0.005099f, -0.011101f, -0.006415f, +0.004808f, -0.004500f, -0.000287f, + +0.003693f, -0.003602f, +0.000122f, -0.001004f, -0.002928f, -0.002220f, +0.000116f, +0.002698f, -0.000783f, +0.000425f, + +0.002954f, -0.000569f, -0.001663f, -0.000186f, -0.000786f, +0.002658f, -0.003489f, +0.000087f, +0.001924f, -0.000943f, + +0.001101f, +0.002842f, +0.000364f, -0.002220f, -0.002169f, -0.000815f, +0.000171f, -0.000763f, +0.000452f, -0.001470f, + +0.001719f, +0.000375f, -0.000321f, +0.001234f, -0.002422f, -0.000705f, +0.000735f, -0.001395f, -0.001305f, +0.002721f, + -0.000050f, -0.001009f, +0.000416f, +0.000846f, -0.000456f, +0.000417f + }, + { + -0.000038f, -0.072490f, +0.009017f, -0.003548f, -0.001994f, -0.006825f, +0.000007f, -0.005271f, +0.001077f, -0.008009f, + +0.009388f, -0.011589f, -0.011948f, +0.013923f, +0.001064f, -0.032618f, +0.017155f, -0.023559f, -0.002220f, +0.012185f, + -0.058625f, +0.001808f, -0.015873f, -0.013326f, -0.010053f, -0.000943f, -0.016093f, -0.014584f, +0.018557f, +0.004357f, + +0.007339f, -0.002575f, +0.009574f, +0.001831f, -0.001514f, +0.005597f, +0.012625f, +0.003655f, +0.009575f, -0.001525f, + +0.003704f, -0.000772f, +0.009671f, +0.000933f, +0.002041f, -0.005479f, -0.007196f, -0.004980f, -0.000333f, -0.003334f, + +0.005513f, -0.001994f, +0.002818f, +0.001277f, -0.002530f, -0.002558f, -0.003415f, +0.000198f, +0.001716f, -0.002662f, + +0.001777f, +0.000722f, +0.002128f, -0.001172f, -0.002326f, -0.001058f, +0.001372f, -0.004368f, -0.000040f, -0.001050f, + -0.000122f, +0.000112f, -0.000437f, -0.000539f, -0.000017f, +0.001235f, -0.000276f, -0.003860f, -0.001190f, +0.002264f, + -0.000230f, -0.000307f, -0.000779f, +0.001101f, +0.001508f, -0.001316f, -0.000836f, -0.000010f, -0.001184f, +0.000389f, + +0.000719f, +0.000496f, -0.001310f, -0.001190f, +0.000629f, +0.000214f + }, + { + -0.043096f, +0.168146f, -0.030473f, +0.040362f, +0.012291f, +0.026263f, +0.012631f, -0.001917f, +0.005331f, -0.019854f, + +0.021923f, -0.034651f, +0.007491f, -0.010788f, +0.019496f, -0.015587f, +0.009814f, -0.005260f, -0.015524f, -0.002917f, + -0.007017f, +0.008487f, -0.001062f, +0.002982f, +0.001049f, +0.001516f, -0.010771f, -0.003902f, +0.004683f, -0.013349f, + +0.006634f, +0.003111f, +0.001160f, -0.001840f, -0.000460f, -0.004702f, +0.007147f, -0.000378f, +0.006680f, -0.012692f, + -0.009844f, -0.000706f, +0.000361f, -0.002474f, +0.006316f, +0.008005f, +0.003442f, +0.000809f, -0.002101f, +0.000656f, + -0.000167f, +0.009585f, -0.000869f, -0.000089f, +0.007034f, -0.002507f, +0.001379f, +0.000533f, -0.004718f, +0.002052f, + -0.002939f, +0.002817f, -0.001011f, +0.002071f, +0.000949f, +0.000360f, -0.001710f, -0.000030f, +0.000860f, -0.004488f, + +0.006518f, +0.002088f, -0.001336f, -0.000542f, +0.000039f, -0.001934f, -0.002389f, +0.001192f, +0.001649f, +0.002346f, + +0.000821f, -0.000866f, -0.000408f, +0.001195f, -0.000516f, -0.002806f, +0.000101f, +0.000876f, +0.000551f, -0.001518f, + +0.000616f, +0.000953f, +0.000323f, +0.000050f, -0.000617f, +0.001683f + }, + { + -0.007661f, -0.057960f, +0.032244f, +0.000319f, -0.002592f, +0.007869f, -0.013671f, +0.004937f, +0.003828f, +0.001261f, + +0.001142f, -0.003576f, +0.010387f, -0.005616f, +0.081720f, -0.013428f, -0.008578f, +0.003546f, -0.010875f, +0.004853f, + -0.015452f, -0.001766f, -0.016162f, +0.000764f, +0.010830f, -0.008649f, -0.003531f, -0.008110f, +0.012994f, +0.010924f, + -0.012155f, +0.004741f, -0.002543f, -0.008183f, +0.003444f, +0.011376f, -0.002808f, +0.002315f, +0.002701f, -0.005618f, + +0.009545f, -0.001527f, +0.012718f, -0.005585f, -0.000219f, +0.005349f, -0.000347f, +0.000113f, +0.004650f, -0.002269f, + -0.000036f, -0.002099f, -0.003076f, +0.003164f, -0.002023f, -0.000154f, -0.004118f, -0.000725f, -0.001853f, +0.002517f, + -0.002703f, -0.001979f, +0.006234f, +0.000229f, -0.004178f, -0.004022f, +0.002133f, +0.000151f, +0.001590f, -0.000123f, + +0.001397f, +0.001209f, -0.000635f, +0.000150f, +0.000874f, +0.000803f, +0.001479f, -0.001549f, +0.000443f, -0.001457f, + -0.002021f, -0.001926f, +0.001524f, +0.001482f, +0.000852f, -0.000561f, +0.000204f, +0.000572f, -0.000507f, +0.000004f, + -0.000924f, +0.000896f, +0.000882f, -0.000960f, +0.000873f, -0.000433f + } + }, + { + { + +0.010017f, +0.090806f, +0.064807f, +0.020127f, +0.004666f, +0.005564f, +0.003327f, -0.001042f, +0.000838f, -0.000887f, + -0.011803f, +0.008190f, -0.007102f, -0.014462f, -0.005276f, -0.027594f, -0.012193f, -0.006058f, -0.007113f, -0.001164f, + -0.005687f, +0.008123f, +0.009737f, +0.002880f, -0.006749f, -0.003146f, -0.004776f, +0.004085f, +0.002364f, +0.003950f, + +0.001786f, +0.008836f, +0.000614f, +0.002411f, +0.003712f, +0.002269f, +0.011137f, -0.003219f, -0.005662f, +0.002438f, + +0.006168f, -0.002706f, +0.003574f, -0.002247f, -0.002014f, +0.004582f, +0.002178f, +0.001195f, +0.000254f, +0.000404f, + -0.001826f, -0.002437f, +0.000406f, -0.000691f, +0.001411f, -0.000990f, +0.001432f, -0.003912f, +0.000933f, -0.000788f, + -0.005143f, -0.000227f, -0.001379f, +0.000369f, -0.001383f, -0.000383f, +0.001600f, +0.000209f, +0.000488f, -0.000707f, + -0.000258f, +0.001185f, +0.000033f, +0.001293f, -0.002066f, -0.000481f, +0.000579f, +0.000741f, +0.001319f, +0.001312f, + +0.000438f, +0.000309f, -0.001786f, -0.001088f, +0.000522f, +0.000564f, -0.001244f, +0.000576f, -0.001054f, +0.000605f, + +0.000222f, +0.000306f, -0.000760f, +0.000526f, +0.000249f, -0.000234f + }, + { + -0.000934f, +0.016318f, -0.005139f, -0.002559f, -0.010752f, +0.001562f, -0.005891f, -0.000032f, +0.001502f, -0.003495f, + -0.007524f, -0.004713f, +0.002494f, -0.005453f, +0.000742f, -0.019450f, -0.002468f, +0.014635f, +0.024240f, -0.002472f, + -0.008762f, +0.003235f, -0.007579f, +0.004605f, +0.000896f, +0.002650f, -0.003836f, -0.000588f, +0.007135f, +0.008622f, + +0.009908f, -0.004046f, -0.000229f, +0.009017f, -0.017670f, +0.003139f, -0.009756f, -0.006206f, +0.004896f, -0.002968f, + -0.004024f, +0.000489f, -0.001464f, +0.002747f, -0.007896f, -0.002343f, -0.001404f, -0.002247f, -0.000988f, +0.002916f, + -0.002736f, -0.003698f, -0.000790f, -0.003445f, -0.000485f, -0.000016f, +0.001257f, -0.000847f, +0.002615f, -0.000698f, + -0.002518f, -0.000444f, -0.000632f, +0.000279f, +0.001014f, -0.001942f, +0.000184f, +0.000575f, -0.001234f, +0.000459f, + +0.002177f, -0.000712f, +0.003250f, +0.001007f, +0.000958f, +0.000501f, +0.000757f, +0.002617f, +0.000180f, -0.001278f, + -0.000893f, +0.001614f, +0.000362f, -0.001797f, +0.000051f, -0.000544f, -0.000399f, +0.000908f, +0.000538f, +0.001217f, + +0.000511f, -0.000046f, -0.000398f, +0.000335f, -0.000011f, +0.000698f + }, + { + -0.000143f, +0.047005f, +0.011701f, +0.020070f, -0.006701f, -0.001830f, +0.005955f, +0.005299f, -0.004522f, +0.001460f, + -0.000444f, -0.016231f, +0.001870f, +0.010118f, +0.000801f, +0.004075f, -0.006613f, +0.003183f, +0.002831f, -0.002871f, + +0.008315f, -0.013002f, +0.005524f, +0.003939f, -0.000640f, +0.001973f, +0.004511f, +0.005646f, +0.007912f, +0.000202f, + -0.005622f, +0.007685f, -0.002816f, -0.001946f, -0.007861f, -0.001776f, +0.002074f, +0.000656f, -0.000429f, +0.003712f, + +0.001994f, +0.002399f, +0.001566f, -0.001509f, -0.001139f, -0.000933f, -0.000983f, -0.005186f, -0.002510f, -0.004885f, + -0.001067f, +0.000828f, -0.000505f, -0.003664f, +0.003669f, -0.002763f, +0.001698f, -0.002229f, -0.000572f, -0.000391f, + -0.002893f, -0.001994f, -0.000762f, -0.000858f, -0.000732f, +0.000296f, +0.000654f, -0.000573f, +0.001661f, -0.000053f, + +0.002246f, -0.000713f, -0.002098f, -0.001858f, -0.000793f, -0.000577f, +0.001366f, -0.000623f, -0.001022f, -0.001548f, + -0.000563f, +0.001863f, +0.000971f, +0.001411f, +0.000350f, -0.000372f, -0.000800f, -0.000991f, -0.000492f, -0.000779f, + -0.000146f, -0.000461f, -0.000177f, +0.000147f, -0.000165f, +0.000524f + }, + { + -0.048100f, +0.063035f, -0.002537f, +0.083575f, +0.002580f, -0.001299f, +0.007027f, +0.003494f, +0.004862f, +0.002229f, + -0.004788f, +0.000340f, +0.004248f, -0.001384f, +0.012498f, +0.004222f, -0.002732f, -0.014356f, -0.008239f, +0.001509f, + +0.008400f, -0.010567f, -0.008513f, +0.000776f, -0.000356f, +0.007456f, -0.002246f, +0.007010f, -0.001245f, +0.002424f, + +0.011963f, -0.003139f, -0.002345f, -0.001487f, -0.000054f, +0.000270f, -0.000471f, +0.000154f, +0.000419f, -0.000114f, + -0.012188f, +0.004203f, -0.000606f, -0.005091f, +0.010607f, +0.007956f, +0.003531f, +0.001274f, -0.004576f, -0.004054f, + -0.001031f, +0.008371f, +0.002291f, +0.000418f, -0.001835f, -0.000902f, -0.002368f, -0.003597f, -0.000721f, +0.001997f, + +0.000198f, -0.001896f, +0.000322f, +0.003596f, -0.001061f, -0.002073f, -0.001137f, -0.002934f, +0.001105f, +0.000608f, + +0.000164f, -0.000144f, -0.000605f, -0.001103f, -0.000263f, -0.000975f, +0.000640f, -0.000327f, -0.000349f, -0.000280f, + +0.000861f, -0.000144f, -0.001034f, -0.001058f, +0.000704f, +0.001709f, -0.000054f, +0.000397f, -0.000463f, -0.000317f, + -0.001366f, +0.000169f, -0.001102f, +0.000244f, -0.001096f, -0.000177f + }, + { + +0.000420f, -0.049401f, +0.001055f, +0.003618f, +0.001106f, -0.000147f, -0.000060f, -0.004794f, -0.000105f, -0.000045f, + -0.009247f, -0.007926f, -0.013541f, -0.012068f, -0.005294f, +0.023234f, +0.003271f, -0.053061f, -0.016713f, +0.015281f, + +0.011442f, +0.000184f, +0.006047f, -0.010947f, +0.000301f, +0.018184f, -0.013103f, -0.010294f, -0.002860f, +0.004161f, + -0.006725f, +0.000379f, -0.007853f, +0.001709f, +0.003034f, -0.001709f, -0.003281f, +0.006377f, -0.006103f, +0.000720f, + -0.000461f, -0.001437f, -0.002726f, +0.001486f, +0.000428f, +0.003464f, -0.001904f, +0.000581f, -0.001972f, +0.003286f, + -0.000041f, +0.001002f, -0.002426f, +0.001166f, -0.002076f, -0.000894f, +0.000243f, -0.004314f, +0.004539f, +0.004995f, + -0.001588f, -0.001397f, -0.000043f, +0.000389f, +0.000907f, +0.001375f, -0.002489f, +0.000283f, +0.000458f, +0.002266f, + +0.000618f, -0.001244f, +0.001408f, +0.001119f, +0.002059f, +0.000657f, +0.002072f, +0.000442f, -0.000052f, +0.000162f, + -0.000438f, +0.001191f, +0.000965f, +0.001762f, +0.000232f, -0.000398f, -0.000294f, -0.000500f, +0.000403f, +0.000485f, + +0.000675f, +0.000719f, +0.000879f, -0.000045f, -0.000688f, -0.000013f + }, + { + -0.060383f, +0.135257f, -0.011593f, -0.045279f, -0.003187f, -0.005185f, -0.007650f, -0.007847f, -0.004536f, -0.013299f, + -0.002834f, -0.006215f, -0.011306f, -0.001520f, +0.011106f, +0.010120f, +0.007095f, -0.003002f, +0.007265f, +0.001592f, + -0.010665f, -0.004511f, -0.000411f, -0.006828f, +0.001346f, -0.002668f, +0.000988f, -0.002924f, +0.001986f, -0.003862f, + -0.000272f, +0.010689f, -0.002102f, -0.000172f, -0.000834f, +0.004661f, -0.001910f, +0.004640f, +0.006294f, -0.003495f, + -0.008408f, -0.008838f, -0.003977f, -0.003537f, -0.003839f, +0.000597f, -0.002628f, -0.000304f, -0.004613f, -0.006869f, + -0.003699f, -0.005587f, +0.000674f, +0.003544f, +0.002678f, -0.001052f, +0.004102f, +0.003857f, +0.001226f, +0.000344f, + -0.000107f, -0.004710f, -0.001356f, -0.000907f, -0.001466f, -0.001255f, -0.000824f, -0.001101f, -0.000871f, +0.000582f, + +0.000032f, -0.000500f, -0.001003f, -0.000331f, +0.000642f, -0.000630f, -0.000057f, +0.001436f, -0.001615f, -0.000838f, + -0.000889f, +0.001693f, +0.000118f, +0.000250f, +0.000481f, +0.001601f, -0.000614f, -0.000125f, +0.001089f, -0.001483f, + -0.000290f, +0.000324f, +0.000408f, +0.001364f, +0.000264f, -0.000034f + }, + { + +0.001319f, -0.003488f, -0.005813f, -0.004281f, +0.000225f, +0.000726f, -0.000947f, +0.003171f, +0.000970f, +0.001057f, + -0.000027f, +0.008203f, -0.002726f, -0.005135f, +0.000553f, +0.028454f, +0.012530f, +0.007736f, +0.008702f, -0.004442f, + -0.009273f, +0.004029f, +0.016097f, +0.006915f, +0.018475f, +0.012021f, -0.021863f, -0.006513f, -0.011869f, +0.021617f, + +0.002987f, -0.008440f, -0.010641f, +0.002956f, +0.010961f, +0.000208f, +0.005026f, +0.000997f, +0.006474f, -0.004502f, + -0.001694f, -0.003541f, -0.000867f, +0.003171f, +0.005713f, +0.007100f, -0.000337f, +0.006622f, +0.000980f, +0.001354f, + -0.006095f, -0.001595f, +0.006034f, +0.000768f, -0.000546f, +0.000397f, -0.000708f, +0.001749f, -0.000610f, -0.001317f, + +0.001549f, +0.004103f, +0.001551f, +0.002750f, +0.001016f, +0.002366f, -0.000227f, -0.002051f, -0.002432f, +0.000347f, + +0.000743f, +0.001104f, +0.000164f, +0.000463f, +0.000196f, -0.000547f, -0.000220f, +0.000437f, +0.000348f, -0.000307f, + -0.000646f, +0.000632f, +0.001574f, -0.001055f, -0.000973f, +0.000042f, +0.000424f, -0.001432f, -0.000341f, -0.000059f, + -0.000748f, +0.000474f, +0.000371f, +0.000933f, +0.000412f, +0.000113f + }, + { + -0.019144f, -0.323714f, -0.004829f, -0.050792f, -0.011981f, -0.000061f, -0.015179f, -0.002345f, +0.008634f, +0.006217f, + -0.003295f, -0.004151f, +0.006833f, -0.004161f, +0.011026f, -0.013036f, -0.001765f, +0.005661f, +0.005106f, +0.012063f, + -0.001498f, -0.008866f, -0.011574f, -0.003842f, -0.002038f, +0.004243f, -0.006826f, -0.010438f, -0.008435f, +0.003003f, + -0.002305f, -0.002815f, -0.001399f, +0.003639f, +0.003222f, -0.009443f, -0.000871f, -0.005892f, -0.002156f, +0.002046f, + +0.000326f, -0.001551f, +0.004867f, -0.000599f, -0.001883f, +0.000159f, +0.002215f, +0.003216f, +0.004680f, -0.002962f, + -0.004493f, -0.001549f, -0.004755f, +0.003763f, -0.002322f, +0.003625f, -0.001874f, +0.001048f, -0.001235f, +0.000835f, + -0.001674f, +0.000560f, +0.002160f, +0.001090f, +0.001934f, +0.004867f, +0.000717f, -0.000746f, +0.000289f, -0.000508f, + +0.001085f, +0.000048f, +0.001768f, -0.000711f, -0.002539f, -0.002697f, -0.001082f, -0.000597f, -0.000366f, -0.000216f, + -0.000984f, -0.000131f, -0.001509f, -0.001204f, +0.000216f, +0.000274f, -0.000689f, -0.000291f, -0.000134f, +0.000126f, + +0.000105f, -0.000202f, -0.000563f, -0.000213f, +0.000010f, +0.000507f + }, + { + +0.001702f, -0.004080f, -0.001356f, -0.006125f, -0.000549f, -0.000112f, +0.000835f, -0.001290f, +0.001150f, -0.000236f, + +0.002052f, -0.000184f, -0.003799f, -0.000527f, -0.013597f, -0.020795f, +0.001188f, -0.005185f, -0.009653f, +0.000623f, + +0.002533f, +0.015799f, +0.002279f, -0.006870f, +0.000701f, +0.015458f, +0.013876f, +0.010557f, -0.013509f, +0.003854f, + +0.014256f, +0.004942f, -0.001115f, -0.007104f, -0.000597f, -0.003040f, -0.006601f, -0.001949f, -0.000264f, -0.002333f, + +0.009058f, +0.004039f, -0.004707f, -0.006724f, -0.001144f, +0.001621f, +0.004571f, -0.000368f, -0.001625f, -0.003902f, + +0.001016f, +0.004713f, -0.005195f, +0.000495f, -0.001457f, -0.000931f, -0.002067f, -0.002461f, -0.001349f, +0.003878f, + +0.002814f, +0.002489f, +0.001541f, +0.000043f, +0.000568f, -0.000364f, -0.000279f, -0.001808f, -0.002891f, -0.002459f, + -0.003303f, -0.000559f, -0.000766f, -0.000897f, -0.001265f, -0.001320f, -0.000050f, -0.002318f, -0.000225f, -0.000157f, + +0.000281f, +0.000289f, +0.001040f, +0.001562f, +0.000218f, +0.001336f, +0.000612f, +0.001629f, +0.000134f, +0.000097f, + +0.000124f, -0.000431f, -0.000764f, +0.000166f, -0.000195f, +0.001046f + }, + { + +0.041891f, -0.041207f, +0.034631f, -0.004929f, +0.013842f, -0.016317f, -0.007971f, +0.013463f, +0.007009f, -0.006545f, + -0.005348f, +0.006885f, +0.019298f, -0.002753f, -0.000189f, -0.015138f, -0.002405f, +0.000449f, -0.016987f, +0.015210f, + +0.006188f, -0.002276f, -0.001471f, +0.000946f, -0.002204f, -0.006502f, -0.017111f, +0.003572f, +0.002222f, +0.007627f, + -0.017359f, +0.006594f, -0.000220f, +0.005368f, -0.003535f, -0.006840f, +0.001871f, +0.002442f, +0.004100f, -0.002889f, + -0.008837f, +0.000058f, +0.000842f, -0.009122f, -0.006888f, +0.004598f, -0.005567f, +0.003447f, +0.000018f, +0.001324f, + +0.001056f, +0.003473f, -0.001502f, -0.002260f, -0.001392f, +0.000172f, +0.000292f, +0.000044f, +0.001746f, -0.001528f, + -0.001556f, -0.001341f, -0.000898f, -0.000437f, +0.002590f, +0.001216f, -0.000859f, +0.002244f, +0.003924f, +0.000940f, + +0.000411f, -0.000049f, +0.002126f, -0.000397f, +0.001221f, +0.000110f, -0.001167f, +0.000012f, -0.000902f, +0.001572f, + +0.000805f, +0.001334f, -0.002362f, -0.000744f, -0.000368f, +0.000008f, +0.000843f, +0.000515f, -0.001077f, -0.000482f, + -0.000657f, +0.000114f, -0.000314f, +0.000124f, +0.000405f, -0.000878f + }, + { + -0.004876f, -0.033296f, +0.009675f, +0.005598f, -0.004128f, +0.002119f, -0.006367f, -0.000014f, -0.000136f, +0.008528f, + +0.004240f, +0.006601f, -0.002239f, +0.012866f, +0.002765f, -0.007048f, -0.004944f, +0.001576f, +0.016229f, +0.004258f, + -0.004510f, +0.000349f, -0.007035f, -0.006818f, +0.015124f, -0.011232f, -0.009512f, -0.016294f, -0.001262f, +0.011948f, + +0.024871f, -0.011624f, +0.001915f, -0.007390f, -0.009948f, -0.008810f, -0.000027f, +0.005499f, +0.007078f, -0.005231f, + -0.002860f, -0.004174f, -0.006347f, -0.002046f, +0.002606f, -0.002322f, -0.003427f, +0.003559f, +0.000847f, +0.004110f, + +0.000325f, -0.002352f, +0.000853f, +0.000296f, +0.002717f, -0.000996f, -0.003583f, -0.000951f, -0.001009f, +0.002007f, + +0.001730f, -0.003101f, +0.001460f, +0.002894f, +0.001132f, -0.000934f, -0.001939f, -0.000722f, +0.001734f, -0.001283f, + -0.001110f, -0.000870f, +0.001109f, +0.000901f, -0.000203f, -0.002370f, +0.000170f, -0.000493f, +0.000663f, +0.000130f, + +0.000699f, +0.000108f, -0.000707f, -0.000445f, -0.000326f, -0.000810f, +0.000009f, +0.000866f, +0.000700f, +0.000088f, + -0.000152f, +0.000572f, -0.000428f, +0.000357f, +0.000071f, +0.000365f + }, + { + +0.047880f, -0.311115f, -0.019974f, -0.009466f, +0.000805f, +0.044796f, +0.005574f, -0.018569f, -0.007963f, +0.009910f, + +0.010765f, +0.007287f, +0.000169f, -0.007607f, +0.000593f, +0.017871f, +0.003876f, -0.012170f, -0.022101f, +0.014880f, + +0.000307f, +0.009068f, +0.004791f, +0.016047f, +0.006079f, +0.009060f, +0.013406f, +0.002646f, +0.003494f, -0.008723f, + -0.001001f, -0.004241f, -0.002291f, +0.000622f, -0.004798f, -0.009363f, -0.004766f, +0.002703f, -0.000686f, +0.005861f, + -0.004422f, -0.000092f, -0.006154f, -0.010191f, +0.000257f, -0.002735f, -0.001223f, -0.002403f, -0.000631f, +0.000275f, + +0.000619f, +0.001175f, -0.004024f, +0.002394f, -0.005461f, -0.000120f, -0.001772f, +0.005353f, +0.001127f, +0.001520f, + -0.001957f, +0.002737f, -0.003414f, -0.000743f, -0.000755f, +0.002685f, +0.001714f, -0.002994f, -0.000000f, +0.000205f, + +0.002859f, +0.000250f, +0.000180f, -0.002290f, -0.001516f, -0.000614f, -0.000632f, -0.000527f, -0.000802f, +0.000046f, + -0.000091f, +0.000956f, -0.000069f, -0.000197f, +0.000216f, -0.001387f, +0.000119f, -0.000717f, -0.000825f, -0.000018f, + +0.000941f, -0.000143f, +0.000381f, +0.000034f, +0.000292f, +0.000377f + }, + { + +0.002202f, -0.053630f, -0.009798f, -0.003659f, +0.002215f, -0.005832f, +0.003094f, -0.006798f, +0.001984f, -0.004859f, + -0.001636f, -0.001029f, -0.008124f, +0.004089f, -0.023692f, -0.003331f, -0.005118f, -0.007435f, -0.005139f, -0.003435f, + -0.007511f, -0.047459f, -0.005632f, -0.020280f, +0.003212f, -0.005561f, -0.012173f, -0.020630f, +0.011820f, +0.001801f, + -0.001999f, +0.009255f, +0.011980f, +0.006827f, +0.001459f, +0.011876f, +0.008486f, +0.003659f, +0.006493f, -0.002836f, + +0.000629f, +0.000972f, +0.005616f, -0.002951f, +0.004009f, -0.001230f, -0.011299f, -0.001572f, -0.001727f, -0.003907f, + +0.003272f, +0.001423f, +0.004107f, -0.001282f, -0.004610f, -0.000482f, -0.002048f, +0.000749f, +0.001103f, -0.000776f, + -0.001318f, +0.001885f, -0.001008f, +0.001960f, -0.001009f, -0.002627f, -0.000727f, -0.000225f, -0.001612f, -0.000878f, + +0.001047f, -0.000448f, +0.000615f, +0.000121f, +0.000123f, +0.000125f, -0.000576f, -0.001720f, -0.000682f, +0.000309f, + +0.001055f, +0.001652f, -0.001009f, +0.001049f, +0.000262f, -0.000293f, -0.000594f, -0.000306f, -0.000334f, -0.000235f, + +0.001193f, -0.000324f, -0.001084f, -0.000440f, -0.000396f, -0.000478f + }, + { + +0.056154f, +0.017709f, +0.008070f, +0.009959f, +0.012594f, +0.027974f, +0.000990f, +0.013922f, -0.000666f, -0.003887f, + -0.015853f, -0.003433f, +0.000054f, -0.006478f, +0.008328f, +0.007313f, -0.009821f, -0.007310f, -0.014435f, -0.002476f, + -0.013220f, +0.003897f, +0.000653f, +0.001633f, +0.003935f, +0.000337f, -0.015320f, +0.006181f, +0.000251f, +0.001314f, + +0.003971f, -0.001027f, +0.000389f, +0.006606f, -0.005598f, -0.000732f, +0.008786f, +0.002648f, -0.001586f, -0.008941f, + -0.002362f, -0.008762f, -0.001338f, +0.000868f, +0.003384f, +0.014263f, +0.003706f, -0.004369f, +0.003796f, -0.006056f, + +0.000786f, +0.007420f, +0.002004f, -0.000652f, +0.002223f, +0.001323f, +0.000685f, +0.000190f, -0.006380f, -0.000718f, + +0.002110f, -0.000138f, +0.001820f, +0.003061f, -0.000690f, +0.000740f, -0.000573f, -0.001097f, -0.000833f, +0.000301f, + +0.001542f, +0.001858f, +0.001272f, -0.000131f, -0.001607f, -0.000189f, -0.002755f, +0.000761f, +0.001170f, +0.001233f, + +0.001480f, -0.000506f, +0.000257f, -0.001087f, +0.001111f, -0.001902f, -0.000207f, +0.000263f, -0.000190f, +0.000276f, + +0.000182f, +0.000069f, +0.000756f, -0.000043f, +0.000074f, +0.000790f + }, + { + +0.007682f, -0.030544f, -0.006187f, -0.001199f, -0.002859f, +0.005422f, -0.005872f, +0.007118f, -0.000246f, +0.002625f, + +0.002046f, -0.004834f, -0.003015f, +0.020464f, +0.037228f, +0.010576f, -0.004618f, -0.005754f, -0.015035f, -0.011414f, + +0.012682f, -0.007077f, -0.011032f, -0.004522f, -0.004433f, +0.001494f, -0.001674f, +0.007094f, +0.005173f, +0.003850f, + -0.003867f, -0.004087f, +0.001887f, -0.009315f, +0.001191f, +0.008350f, -0.002489f, -0.005813f, +0.006879f, -0.005605f, + +0.001245f, +0.004225f, +0.005542f, +0.006092f, -0.001078f, +0.001476f, +0.003074f, +0.001356f, +0.002834f, -0.001923f, + -0.001206f, +0.000548f, +0.000042f, -0.000470f, -0.001469f, -0.002964f, -0.001660f, -0.000633f, +0.000963f, -0.001105f, + -0.003179f, +0.001092f, +0.002485f, +0.000826f, -0.002845f, -0.000738f, +0.001159f, +0.001913f, +0.000498f, +0.001348f, + -0.000392f, +0.001710f, -0.000341f, +0.000729f, +0.000045f, +0.000566f, +0.000780f, -0.000405f, +0.000539f, -0.002605f, + -0.002462f, +0.000754f, +0.000683f, +0.000513f, -0.000527f, -0.000759f, +0.000182f, +0.000827f, +0.000581f, +0.000125f, + -0.000050f, +0.000789f, +0.000118f, +0.000186f, -0.000010f, -0.000625f + } + }, + { + { + -0.006723f, +0.065045f, +0.021526f, -0.022242f, -0.005087f, +0.001197f, -0.000163f, -0.004573f, -0.005879f, +0.008873f, + +0.010868f, +0.009867f, +0.000806f, -0.001406f, +0.009544f, -0.009952f, +0.005895f, +0.005522f, -0.003526f, +0.006370f, + +0.002548f, +0.006457f, +0.005332f, +0.002953f, -0.010116f, -0.004302f, -0.006617f, +0.002161f, +0.001906f, +0.001991f, + +0.000587f, +0.008404f, +0.001156f, +0.000118f, +0.000459f, -0.004669f, +0.009527f, +0.000813f, -0.001579f, +0.000211f, + +0.002947f, -0.000791f, +0.007086f, +0.001287f, -0.001264f, +0.005949f, +0.000562f, +0.001402f, -0.000137f, +0.002170f, + -0.000971f, -0.001413f, -0.000082f, +0.004422f, +0.001721f, -0.002384f, +0.002000f, -0.003523f, +0.001146f, +0.000863f, + -0.000973f, +0.003404f, +0.000161f, +0.000389f, +0.000404f, -0.000747f, +0.000300f, -0.000726f, +0.000436f, +0.000935f, + -0.000633f, -0.000412f, -0.000594f, +0.001431f, -0.001260f, -0.000075f, -0.000407f, -0.000352f, -0.000779f, +0.000139f, + -0.000258f, +0.000870f, -0.000140f, -0.000258f, +0.000229f, +0.000582f, -0.000377f, +0.000733f, -0.000382f, +0.000765f, + +0.000195f, -0.000041f, -0.000863f, +0.000475f, -0.000170f, -0.000206f + }, + { + +0.000346f, +0.013789f, -0.003100f, +0.025264f, +0.004894f, +0.001509f, -0.002810f, -0.004056f, -0.002235f, +0.001287f, + -0.000699f, +0.001234f, +0.005310f, +0.005214f, +0.010799f, +0.001719f, +0.007825f, -0.002791f, -0.000366f, -0.006651f, + +0.000720f, +0.011671f, -0.002207f, -0.003546f, -0.006141f, -0.008463f, -0.015483f, -0.002099f, +0.009564f, +0.004735f, + +0.002695f, -0.002114f, -0.004533f, +0.016752f, -0.012867f, +0.007644f, -0.002126f, -0.004754f, +0.001654f, -0.001540f, + -0.003669f, -0.000692f, -0.001664f, +0.007075f, -0.002511f, -0.002011f, -0.002920f, +0.002369f, +0.000211f, +0.002680f, + -0.001850f, -0.005297f, -0.001472f, -0.001817f, +0.000945f, -0.002426f, +0.000963f, -0.000777f, +0.001183f, -0.000994f, + -0.000594f, -0.000174f, -0.001180f, -0.000454f, +0.000753f, -0.001703f, -0.000192f, +0.000428f, -0.001246f, -0.000722f, + -0.000122f, -0.000537f, +0.002689f, +0.000149f, +0.000828f, -0.000079f, -0.000892f, +0.000359f, -0.001818f, -0.000283f, + -0.000058f, +0.001266f, +0.000197f, -0.000678f, +0.000136f, -0.000546f, +0.000705f, +0.000181f, -0.000949f, +0.000249f, + -0.000051f, +0.000354f, +0.000282f, +0.000117f, -0.000032f, -0.000022f + }, + { + +0.000814f, +0.020385f, -0.019981f, +0.033828f, +0.007681f, +0.000276f, +0.001511f, +0.004457f, +0.000028f, -0.002121f, + +0.001200f, -0.000569f, -0.000817f, +0.004340f, -0.001502f, +0.010372f, -0.000890f, -0.001702f, +0.010984f, -0.008375f, + +0.001961f, -0.014328f, +0.003965f, -0.007383f, -0.010580f, -0.005095f, +0.000303f, -0.004470f, -0.009353f, -0.000522f, + -0.005095f, -0.001446f, -0.003495f, +0.002827f, -0.000011f, +0.003539f, -0.000723f, -0.002013f, -0.001839f, -0.001606f, + -0.000828f, +0.000701f, +0.001310f, +0.002000f, -0.000715f, +0.000957f, -0.001686f, -0.007073f, -0.002271f, -0.002143f, + -0.000530f, +0.001512f, +0.003853f, +0.000900f, +0.004697f, -0.002454f, +0.001286f, +0.003589f, +0.002076f, -0.001464f, + -0.002106f, +0.000087f, -0.000152f, -0.000274f, -0.001926f, -0.000842f, -0.000087f, -0.001175f, -0.000039f, +0.000136f, + +0.002894f, +0.001047f, +0.000887f, +0.000262f, +0.000442f, -0.000355f, +0.001799f, -0.000643f, -0.000671f, +0.000222f, + -0.000004f, -0.000045f, -0.000143f, +0.000435f, +0.000486f, +0.000366f, -0.000389f, -0.000941f, -0.000230f, -0.000711f, + -0.000335f, -0.000014f, +0.000074f, +0.000315f, -0.000477f, +0.000250f + }, + { + +0.005790f, +0.136520f, -0.018566f, +0.074023f, +0.002450f, -0.004157f, +0.005136f, +0.009616f, +0.005153f, +0.001347f, + -0.003799f, +0.005058f, +0.014893f, +0.008118f, +0.010914f, -0.009910f, +0.000523f, -0.000949f, +0.010718f, +0.013062f, + +0.011199f, +0.001397f, +0.003217f, +0.004821f, +0.001173f, +0.011593f, -0.006674f, +0.006344f, -0.003641f, -0.003913f, + +0.005836f, -0.001301f, +0.001131f, +0.003463f, +0.003329f, +0.002124f, -0.006105f, +0.000070f, -0.001261f, +0.002441f, + +0.000591f, +0.007165f, -0.000669f, -0.002255f, +0.005932f, -0.001462f, +0.000060f, +0.003333f, +0.000371f, -0.001064f, + -0.003421f, +0.001671f, -0.000343f, +0.003090f, -0.000574f, +0.002231f, +0.000929f, -0.003314f, +0.001041f, +0.000943f, + -0.001630f, -0.001910f, -0.000149f, +0.001756f, -0.000080f, -0.002058f, -0.000843f, -0.000740f, +0.001683f, +0.000609f, + -0.000138f, -0.000287f, +0.000220f, -0.000855f, -0.000044f, -0.000469f, -0.000263f, -0.001945f, -0.000329f, +0.000670f, + +0.001405f, -0.000270f, -0.000301f, -0.000384f, +0.000400f, +0.000230f, -0.000497f, +0.000725f, -0.000582f, +0.000311f, + -0.000403f, +0.000721f, -0.001159f, +0.000523f, -0.000372f, +0.000457f + }, + { + -0.002288f, -0.044330f, -0.000060f, -0.003029f, +0.000912f, +0.000076f, +0.001081f, -0.002165f, -0.001605f, +0.003763f, + -0.003035f, -0.003858f, +0.000815f, +0.002121f, +0.004242f, +0.015753f, -0.013129f, -0.027393f, +0.017756f, +0.009590f, + +0.010156f, -0.010765f, -0.000887f, -0.004141f, -0.007262f, +0.011507f, -0.002805f, +0.008160f, -0.004244f, +0.009650f, + +0.007701f, +0.003190f, -0.002959f, -0.002671f, -0.000901f, +0.000005f, -0.005807f, +0.004240f, -0.003888f, +0.003932f, + -0.003277f, -0.002854f, -0.000785f, +0.003466f, -0.001534f, -0.000500f, -0.003910f, +0.001864f, -0.000014f, +0.003720f, + -0.000429f, +0.001558f, -0.001585f, +0.002213f, -0.001405f, +0.001428f, +0.001712f, -0.002197f, +0.003456f, +0.000954f, + -0.001561f, +0.001805f, -0.001704f, -0.000196f, +0.000563f, +0.002035f, -0.001998f, +0.000592f, +0.000345f, -0.000603f, + +0.001552f, -0.000278f, +0.000145f, -0.000364f, +0.001805f, -0.000200f, +0.000438f, -0.001055f, +0.000038f, +0.000203f, + -0.001360f, -0.000086f, -0.000328f, +0.000215f, +0.000416f, +0.000952f, +0.000291f, -0.000108f, +0.000981f, +0.000674f, + -0.000064f, -0.000036f, +0.001281f, +0.000584f, -0.000812f, +0.000469f + }, + { + +0.000165f, +0.206338f, -0.008699f, -0.023547f, -0.003743f, -0.000164f, +0.001430f, +0.005907f, -0.003447f, -0.013785f, + +0.000178f, +0.001950f, -0.000671f, +0.000587f, -0.000414f, +0.004639f, +0.001174f, -0.004290f, +0.009013f, -0.002429f, + -0.009928f, +0.005095f, +0.007110f, -0.008306f, +0.004638f, -0.002178f, -0.001721f, +0.001849f, +0.006759f, -0.001983f, + -0.005121f, +0.000862f, -0.010483f, -0.000940f, -0.000365f, +0.006759f, -0.001402f, -0.001788f, +0.001729f, +0.000246f, + -0.002463f, -0.001490f, +0.000755f, +0.004155f, -0.002188f, -0.000618f, +0.004277f, +0.004829f, -0.003985f, -0.001116f, + -0.001211f, -0.005342f, +0.003731f, +0.004013f, +0.005492f, -0.001208f, +0.000847f, +0.000052f, -0.001285f, +0.000484f, + +0.000136f, -0.005295f, +0.001008f, +0.001628f, +0.001919f, +0.001707f, -0.000650f, +0.000637f, -0.001483f, -0.000475f, + +0.000191f, -0.001580f, -0.001589f, -0.001979f, +0.000004f, -0.001101f, -0.001026f, +0.001222f, +0.000257f, +0.000220f, + -0.001040f, +0.001089f, +0.000130f, -0.000163f, -0.000175f, +0.000877f, -0.000190f, -0.000463f, +0.000311f, -0.001837f, + +0.000403f, +0.000409f, +0.000095f, +0.000651f, -0.000632f, +0.000023f + }, + { + -0.000305f, +0.010271f, +0.012632f, -0.000097f, +0.000909f, +0.001027f, -0.001609f, -0.001399f, -0.000117f, +0.000330f, + -0.004476f, +0.003272f, -0.004718f, +0.004084f, -0.000323f, +0.034782f, -0.001249f, -0.007537f, +0.017862f, +0.016389f, + -0.006004f, +0.002917f, +0.011391f, -0.011995f, -0.002848f, -0.016458f, -0.035139f, +0.000915f, -0.006080f, +0.005970f, + -0.001524f, +0.004597f, -0.008661f, -0.008952f, +0.004775f, -0.003330f, -0.002889f, -0.000985f, +0.005045f, -0.007051f, + -0.002578f, -0.000908f, +0.003910f, +0.000267f, -0.002632f, +0.003042f, -0.002287f, +0.002588f, -0.002130f, +0.002521f, + -0.003478f, -0.000130f, +0.004245f, +0.002838f, -0.001887f, -0.002422f, -0.001153f, +0.005523f, +0.000441f, -0.001762f, + +0.001084f, +0.001796f, -0.001200f, +0.002112f, +0.001120f, +0.001351f, -0.001063f, -0.001375f, -0.000657f, +0.001505f, + +0.000127f, +0.000195f, +0.000056f, +0.000825f, -0.000248f, -0.000782f, +0.000211f, -0.000131f, -0.001365f, -0.000579f, + -0.000791f, -0.000658f, +0.000667f, -0.000262f, -0.000181f, -0.000284f, +0.000733f, -0.000480f, +0.000391f, +0.000121f, + -0.000494f, +0.000728f, -0.000411f, +0.000521f, +0.000132f, -0.000126f + }, + { + +0.050409f, -0.212177f, -0.014862f, -0.045536f, +0.006706f, +0.004629f, +0.000500f, +0.000396f, -0.000641f, +0.006989f, + +0.004028f, +0.006401f, +0.009117f, +0.000139f, +0.007912f, -0.008510f, +0.000048f, -0.006706f, -0.004204f, +0.006380f, + +0.001512f, +0.001242f, -0.004651f, -0.010175f, -0.003014f, +0.003896f, -0.002280f, +0.001262f, -0.001705f, +0.006273f, + +0.003511f, -0.000374f, -0.002352f, -0.000737f, +0.002064f, -0.004970f, +0.009583f, -0.000831f, -0.003701f, +0.003623f, + +0.002454f, -0.003293f, +0.003064f, +0.002896f, -0.002918f, +0.000073f, -0.001179f, -0.003307f, +0.002528f, -0.000117f, + +0.000072f, +0.004236f, -0.001760f, +0.003760f, -0.000523f, +0.004335f, -0.001501f, +0.000785f, -0.001913f, +0.002178f, + -0.001260f, -0.002167f, +0.003014f, +0.001166f, -0.000809f, +0.002194f, -0.000731f, -0.000540f, +0.000052f, -0.001223f, + +0.000944f, -0.000777f, +0.001819f, +0.000891f, -0.000237f, +0.000251f, -0.000507f, -0.000502f, +0.000864f, +0.001467f, + +0.000048f, +0.000173f, -0.000880f, -0.000693f, +0.000006f, -0.000053f, -0.000353f, +0.000078f, -0.000734f, +0.000260f, + +0.000829f, +0.000020f, +0.000082f, -0.000200f, -0.000336f, +0.000269f + }, + { + -0.000094f, -0.004631f, +0.015040f, -0.005827f, +0.000558f, -0.000128f, +0.000101f, -0.001805f, +0.000877f, -0.001805f, + +0.004318f, +0.001564f, -0.003345f, +0.007629f, +0.004876f, +0.016703f, +0.015344f, -0.001722f, +0.000618f, +0.002383f, + -0.006615f, +0.003274f, +0.002668f, -0.012654f, +0.003047f, +0.015889f, -0.002613f, +0.009192f, -0.007524f, -0.000465f, + -0.004892f, -0.007118f, +0.012058f, -0.001371f, -0.006499f, +0.003716f, -0.003186f, -0.001558f, +0.003515f, -0.002762f, + +0.005376f, +0.003197f, -0.003071f, -0.000657f, +0.002670f, +0.000879f, +0.000552f, -0.000343f, +0.002101f, -0.001118f, + -0.000306f, +0.003766f, -0.003120f, +0.002874f, +0.001482f, -0.001324f, -0.000934f, +0.000218f, -0.001360f, +0.002011f, + +0.000644f, -0.001020f, -0.001642f, -0.000300f, -0.000136f, -0.002125f, -0.000320f, -0.000702f, -0.000814f, -0.000193f, + -0.001442f, +0.000765f, +0.000027f, +0.000840f, +0.000009f, -0.000745f, +0.000200f, -0.001647f, +0.000838f, -0.000253f, + +0.000243f, +0.000117f, +0.000236f, +0.000014f, -0.001617f, +0.000580f, -0.000692f, +0.000660f, -0.000015f, -0.000039f, + +0.000016f, +0.000379f, -0.000387f, +0.000130f, -0.000639f, +0.000717f + }, + { + -0.034706f, -0.113761f, +0.054238f, +0.010720f, +0.022847f, -0.004952f, -0.005470f, -0.003742f, -0.002699f, -0.004632f, + +0.004134f, +0.002794f, +0.011772f, -0.004371f, -0.000607f, -0.006920f, +0.006192f, +0.005336f, -0.019607f, +0.009695f, + -0.001906f, -0.002225f, -0.000410f, -0.003173f, -0.001014f, -0.000459f, -0.010768f, +0.012399f, +0.006933f, +0.003161f, + -0.017867f, +0.002094f, -0.002990f, +0.007527f, +0.000099f, -0.008165f, -0.000138f, -0.001554f, +0.002838f, -0.002480f, + -0.007978f, +0.002233f, +0.000449f, -0.004233f, -0.005387f, +0.002185f, -0.000284f, +0.006610f, -0.001937f, +0.000480f, + +0.000464f, +0.006143f, +0.001968f, +0.001744f, +0.001453f, +0.000773f, +0.000935f, -0.001135f, +0.001807f, +0.001626f, + +0.000859f, +0.000373f, -0.001672f, -0.001742f, +0.002019f, +0.000089f, -0.001240f, -0.000013f, +0.000536f, +0.002170f, + +0.000263f, -0.001281f, +0.000946f, -0.000562f, -0.000650f, -0.001290f, -0.000614f, +0.001127f, -0.001404f, +0.000318f, + -0.001849f, +0.000823f, -0.001607f, +0.000152f, -0.000510f, +0.000348f, +0.000526f, +0.000123f, -0.001002f, +0.000513f, + -0.000116f, +0.000398f, +0.000053f, -0.000623f, +0.000497f, -0.000403f + }, + { + +0.003343f, -0.025121f, -0.003468f, -0.002194f, -0.005843f, +0.000684f, -0.005714f, -0.001451f, -0.001642f, -0.003712f, + -0.000334f, +0.005808f, -0.009467f, +0.001262f, +0.000902f, -0.000239f, -0.001414f, -0.003889f, +0.014589f, +0.000381f, + -0.006176f, +0.012110f, +0.009204f, +0.002713f, +0.008794f, -0.018063f, -0.003191f, -0.009933f, +0.003422f, +0.001731f, + +0.014563f, -0.005622f, +0.004491f, -0.006417f, -0.006661f, +0.001023f, +0.001681f, +0.002420f, +0.005522f, -0.004475f, + +0.002897f, +0.002651f, -0.000716f, +0.000697f, -0.000436f, -0.001835f, -0.000284f, +0.003571f, -0.003668f, -0.000414f, + -0.002263f, +0.000818f, +0.002642f, -0.001436f, -0.001954f, +0.000328f, -0.000146f, +0.000744f, -0.000505f, +0.003392f, + +0.002358f, -0.000293f, +0.001391f, +0.000859f, +0.000234f, +0.000452f, -0.000848f, +0.000297f, +0.002129f, -0.000609f, + -0.000477f, -0.001010f, +0.000267f, +0.000419f, +0.000929f, -0.001099f, +0.000273f, -0.001318f, +0.000144f, -0.000211f, + +0.000272f, -0.000350f, -0.000252f, +0.000484f, +0.000372f, -0.000268f, -0.000545f, -0.000185f, -0.000216f, -0.000318f, + +0.000200f, +0.000823f, -0.000292f, +0.000333f, -0.000390f, +0.000013f + }, + { + +0.023341f, -0.332473f, -0.007099f, -0.015864f, -0.013992f, +0.007604f, -0.028144f, -0.008549f, -0.003829f, +0.005921f, + +0.002638f, -0.008527f, -0.004049f, +0.000812f, -0.001108f, +0.020007f, +0.004535f, -0.006094f, -0.017711f, +0.003761f, + -0.007656f, +0.014809f, +0.000993f, +0.008823f, -0.014134f, -0.003338f, -0.001393f, +0.000994f, +0.007489f, -0.001629f, + +0.000402f, -0.004541f, +0.001636f, +0.001816f, -0.008151f, -0.007759f, +0.001855f, -0.002574f, -0.007645f, +0.001779f, + -0.006008f, +0.002325f, +0.004510f, -0.004260f, -0.001714f, +0.002638f, +0.005130f, -0.000982f, +0.000871f, +0.002963f, + -0.000300f, +0.001195f, -0.005111f, +0.003526f, -0.001457f, +0.001671f, -0.002587f, +0.002826f, -0.001702f, +0.000241f, + -0.001563f, +0.003450f, -0.002436f, -0.000875f, -0.001172f, +0.000289f, +0.000809f, -0.001669f, -0.001055f, -0.000605f, + +0.001752f, -0.002377f, -0.000102f, -0.000566f, -0.000218f, -0.001135f, +0.000027f, +0.000521f, +0.000383f, +0.001142f, + +0.000323f, +0.000635f, +0.000401f, +0.000300f, +0.000796f, -0.000707f, -0.000612f, -0.000518f, -0.000930f, -0.000942f, + +0.000832f, -0.000208f, +0.000641f, -0.000090f, +0.000382f, +0.000358f + }, + { + -0.003796f, -0.034325f, +0.011257f, -0.001586f, +0.004281f, +0.002630f, +0.012397f, -0.005089f, +0.000790f, -0.003631f, + +0.000881f, +0.009550f, +0.004828f, -0.015650f, -0.034725f, +0.027844f, +0.009761f, +0.001511f, +0.001953f, -0.001161f, + +0.033000f, -0.001813f, +0.019664f, -0.013205f, -0.010485f, -0.007717f, +0.003610f, -0.014800f, +0.001510f, +0.004015f, + +0.003482f, +0.000183f, -0.003309f, +0.006382f, -0.000431f, +0.004916f, +0.002256f, -0.002230f, +0.002384f, +0.000784f, + -0.000106f, -0.009474f, -0.000713f, -0.003987f, +0.002030f, +0.006376f, -0.005585f, +0.001973f, +0.002089f, -0.002779f, + +0.002443f, +0.000486f, +0.003386f, +0.002772f, -0.000438f, +0.000816f, +0.001529f, -0.000780f, -0.001439f, +0.000978f, + -0.002758f, +0.000468f, -0.001308f, +0.000552f, +0.000060f, -0.000846f, +0.000700f, +0.002097f, -0.001227f, -0.001132f, + +0.001640f, +0.000329f, +0.000564f, -0.000108f, -0.000233f, +0.000381f, +0.001310f, +0.000213f, -0.000210f, -0.000577f, + +0.000087f, +0.000249f, -0.000513f, +0.001017f, -0.000231f, +0.000629f, -0.000301f, +0.000477f, +0.000421f, -0.000828f, + +0.000499f, -0.000033f, -0.000078f, +0.000119f, -0.000800f, -0.000390f + }, + { + -0.042092f, -0.111785f, +0.014510f, -0.008699f, +0.006156f, -0.002589f, -0.022797f, +0.007368f, -0.009514f, +0.003539f, + -0.010886f, -0.001144f, +0.001388f, -0.001998f, +0.012828f, +0.018069f, -0.005274f, +0.006902f, -0.010537f, -0.007179f, + -0.017977f, +0.001035f, -0.000849f, -0.002839f, +0.003659f, +0.004094f, -0.007131f, +0.012570f, +0.003244f, +0.006766f, + +0.002220f, +0.000814f, +0.002783f, +0.004467f, -0.004417f, -0.003002f, +0.001433f, -0.003911f, -0.005116f, -0.001573f, + +0.007191f, -0.008293f, -0.003474f, -0.000331f, -0.004010f, +0.003386f, +0.000813f, -0.006321f, +0.002683f, -0.004162f, + +0.001037f, +0.002347f, -0.001181f, +0.000218f, -0.000203f, -0.001862f, +0.001797f, +0.001290f, -0.003593f, +0.001108f, + +0.001639f, -0.001746f, +0.000205f, +0.000928f, -0.002294f, -0.000160f, -0.000846f, -0.000622f, -0.000944f, +0.001170f, + -0.000547f, +0.000332f, +0.000921f, +0.000346f, -0.001830f, +0.001138f, -0.001148f, +0.000201f, +0.000747f, -0.000591f, + -0.000319f, -0.000712f, -0.000097f, -0.002092f, +0.000744f, -0.000564f, +0.000612f, +0.000224f, -0.000025f, +0.000815f, + +0.000226f, +0.000140f, +0.000920f, +0.000128f, -0.000252f, -0.000103f + }, + { + -0.008392f, -0.024459f, +0.012005f, +0.001448f, -0.004912f, +0.004622f, -0.003474f, +0.002210f, -0.007467f, -0.002384f, + -0.000057f, -0.001760f, -0.003305f, -0.004249f, -0.008180f, -0.000829f, +0.002878f, -0.002717f, -0.009852f, -0.015703f, + +0.004421f, -0.007093f, -0.007898f, +0.001349f, +0.000140f, +0.003520f, -0.004670f, +0.001650f, -0.006370f, -0.007445f, + -0.000342f, -0.005955f, +0.003793f, -0.004946f, -0.004696f, -0.004533f, +0.000308f, -0.005498f, +0.001450f, -0.003909f, + +0.001621f, +0.002573f, -0.002356f, -0.000586f, -0.002634f, +0.001593f, +0.002487f, -0.000621f, -0.001794f, -0.002227f, + +0.002667f, +0.002161f, -0.000747f, +0.000638f, -0.000591f, -0.001222f, +0.001551f, +0.002212f, +0.000175f, -0.003082f, + -0.001837f, +0.001207f, -0.000218f, +0.001492f, -0.000233f, +0.001541f, +0.001737f, +0.001061f, -0.001547f, +0.001301f, + -0.000239f, +0.000956f, -0.000114f, -0.001138f, -0.002033f, -0.000719f, +0.000057f, -0.000416f, +0.000833f, -0.000193f, + -0.001024f, -0.000255f, -0.000501f, +0.000061f, -0.000068f, -0.000393f, -0.000001f, -0.000050f, +0.000407f, +0.000738f, + +0.000337f, +0.000299f, -0.000541f, +0.000398f, +0.000064f, -0.000291f + } + }, + { + { + +0.003802f, +0.090446f, -0.049549f, -0.021631f, +0.000623f, -0.001765f, -0.006916f, +0.005307f, -0.007098f, +0.005540f, + +0.017440f, +0.009965f, -0.004410f, -0.003813f, +0.015058f, -0.004892f, +0.005401f, +0.006489f, +0.005626f, -0.005226f, + +0.008092f, +0.001605f, +0.005975f, -0.006852f, +0.001259f, -0.003922f, -0.003781f, +0.001811f, +0.001799f, -0.000831f, + +0.000198f, +0.010446f, -0.002292f, +0.003149f, -0.006371f, -0.002232f, +0.003478f, +0.004760f, +0.003252f, +0.003588f, + -0.001234f, +0.003431f, +0.001806f, +0.003464f, -0.003604f, +0.005968f, +0.002211f, -0.001545f, +0.000861f, +0.002107f, + -0.003226f, -0.000056f, -0.000169f, +0.004787f, +0.001120f, -0.001550f, -0.000252f, -0.001630f, -0.001287f, +0.002737f, + +0.001090f, +0.002451f, +0.001638f, -0.001144f, +0.001057f, +0.000252f, -0.001258f, +0.001172f, -0.000950f, +0.001241f, + -0.000606f, -0.000429f, -0.000201f, +0.001407f, -0.000872f, -0.000246f, -0.000670f, -0.000675f, -0.000678f, -0.000247f, + +0.000815f, -0.000092f, +0.000804f, +0.000001f, -0.000421f, +0.000839f, +0.000294f, -0.000432f, +0.000723f, +0.000508f, + +0.000380f, +0.000138f, -0.000694f, +0.000359f, -0.000453f, +0.000158f + }, + { + -0.001645f, +0.008906f, +0.002598f, +0.018543f, +0.007231f, -0.003125f, -0.000203f, -0.000213f, -0.001419f, +0.000424f, + -0.005694f, +0.009640f, -0.003882f, +0.010800f, +0.003097f, +0.007294f, +0.003036f, +0.004489f, -0.019289f, -0.000410f, + +0.003589f, +0.007200f, +0.012349f, -0.005353f, -0.016411f, -0.009747f, -0.012402f, +0.003977f, +0.004949f, +0.001733f, + +0.001583f, +0.004865f, -0.001789f, +0.004165f, -0.002536f, +0.000009f, +0.005213f, +0.000143f, -0.001904f, -0.002814f, + +0.000294f, -0.001102f, -0.000506f, +0.004268f, +0.001536f, -0.003048f, -0.003400f, +0.000756f, +0.002886f, -0.000425f, + -0.001819f, -0.004448f, -0.001048f, +0.000084f, +0.000637f, -0.004162f, +0.000528f, -0.000183f, +0.001450f, -0.000672f, + -0.000829f, +0.000623f, -0.002305f, -0.000470f, +0.000928f, -0.000531f, -0.001162f, +0.000726f, -0.000428f, -0.001190f, + -0.001105f, +0.000412f, +0.000871f, -0.000314f, +0.000700f, -0.000879f, +0.000418f, -0.001112f, -0.000734f, +0.000379f, + -0.000148f, -0.000304f, +0.000624f, +0.000109f, +0.000053f, +0.000141f, +0.000745f, -0.000574f, -0.000371f, -0.000739f, + +0.000253f, -0.000247f, +0.001187f, +0.000223f, -0.000067f, -0.000471f + }, + { + -0.003326f, +0.007865f, -0.018921f, +0.011415f, +0.022596f, +0.004497f, -0.001317f, +0.002502f, -0.001798f, +0.000372f, + +0.000743f, +0.009368f, -0.008107f, +0.000023f, +0.010157f, +0.007320f, +0.004395f, -0.005706f, +0.000257f, -0.001499f, + +0.006253f, -0.010595f, -0.006868f, -0.009499f, -0.003515f, -0.002670f, +0.003085f, -0.005525f, -0.015027f, +0.001066f, + -0.006529f, -0.001697f, +0.006658f, -0.000806f, -0.003639f, +0.003808f, -0.002300f, -0.000067f, -0.002889f, -0.001452f, + -0.001803f, +0.001770f, +0.000581f, +0.003774f, +0.001589f, -0.000479f, -0.003947f, -0.001725f, -0.004235f, -0.001276f, + +0.001744f, -0.001017f, +0.003480f, +0.003465f, +0.001277f, -0.000292f, +0.001863f, +0.002128f, +0.001698f, -0.000059f, + -0.002069f, +0.001533f, -0.001057f, -0.000665f, -0.001844f, -0.000385f, -0.001833f, +0.000154f, -0.000449f, +0.001707f, + +0.000518f, +0.000819f, +0.002250f, -0.000283f, +0.000816f, +0.000022f, +0.000497f, -0.000064f, -0.000176f, +0.000398f, + +0.000567f, -0.000197f, -0.000789f, -0.000061f, +0.001050f, +0.000319f, -0.000313f, -0.000430f, -0.000932f, +0.000062f, + -0.000699f, +0.000052f, +0.000098f, +0.000052f, -0.000176f, -0.000068f + }, + { + +0.026114f, +0.108407f, -0.020680f, +0.080600f, -0.005062f, +0.000602f, -0.000227f, +0.010696f, +0.000762f, +0.001632f, + -0.007265f, +0.013062f, +0.009717f, +0.005732f, +0.001546f, -0.008641f, +0.004261f, +0.000557f, +0.014776f, +0.005755f, + +0.007484f, +0.005807f, +0.005603f, +0.008925f, -0.002390f, +0.009378f, +0.002795f, -0.001313f, +0.000373f, -0.001874f, + +0.000158f, +0.003926f, -0.003015f, +0.003154f, +0.000793f, +0.002703f, -0.004343f, +0.003156f, -0.003707f, +0.000117f, + +0.008130f, +0.002010f, -0.000381f, +0.004093f, -0.004205f, +0.000522f, +0.002994f, +0.001520f, +0.002972f, -0.000912f, + -0.002086f, -0.001077f, -0.000288f, +0.003404f, +0.000366f, +0.000468f, +0.001922f, -0.001207f, -0.000103f, -0.000444f, + -0.001696f, +0.000308f, +0.000653f, -0.001113f, +0.001709f, -0.001878f, +0.000011f, +0.000402f, -0.000399f, +0.000835f, + -0.000291f, +0.000689f, +0.000003f, -0.000199f, -0.000917f, +0.000727f, -0.001374f, -0.001608f, +0.000177f, +0.000909f, + +0.000224f, -0.000005f, -0.000293f, +0.000042f, -0.000199f, -0.000519f, +0.000544f, -0.000313f, +0.000020f, +0.000137f, + +0.000053f, +0.000169f, +0.000042f, +0.000161f, -0.000240f, +0.000361f + }, + { + +0.003873f, -0.040716f, -0.010638f, -0.003395f, +0.003549f, -0.001149f, -0.001181f, +0.002650f, -0.000541f, +0.000424f, + +0.000677f, -0.003888f, +0.005008f, +0.006000f, +0.005769f, -0.006324f, -0.021725f, +0.036907f, +0.014441f, -0.005708f, + +0.005982f, -0.019020f, -0.003001f, +0.004827f, -0.003854f, -0.008185f, +0.013471f, +0.000593f, +0.003939f, +0.007900f, + +0.009420f, -0.003560f, +0.006508f, -0.007743f, -0.007408f, +0.001796f, +0.003148f, -0.000897f, -0.006413f, +0.006429f, + -0.003696f, -0.003697f, +0.003171f, +0.000452f, +0.000768f, -0.001949f, -0.003625f, +0.003649f, +0.000986f, +0.002034f, + +0.001821f, +0.001003f, +0.000510f, -0.000744f, -0.000753f, +0.000536f, +0.001051f, +0.001540f, +0.000824f, +0.000225f, + -0.000446f, +0.002808f, -0.002700f, +0.000159f, +0.002008f, -0.000784f, +0.000575f, +0.000090f, +0.000888f, -0.001697f, + +0.002158f, -0.000284f, -0.000648f, +0.000155f, +0.000409f, +0.000131f, +0.000300f, -0.000448f, -0.000168f, -0.000223f, + -0.000810f, -0.000745f, -0.000312f, -0.000006f, +0.000955f, +0.001089f, +0.000188f, +0.000173f, +0.000334f, +0.000788f, + -0.000393f, +0.000162f, +0.001257f, +0.000344f, -0.000286f, +0.000994f + }, + { + +0.042897f, +0.138854f, -0.020323f, -0.026825f, +0.020437f, -0.000483f, -0.000298f, +0.008529f, -0.008956f, +0.002992f, + -0.004221f, +0.005996f, -0.001333f, +0.002142f, +0.002241f, +0.000630f, +0.002023f, -0.003057f, +0.008051f, +0.000922f, + -0.003155f, +0.003370f, +0.001002f, -0.002284f, +0.002328f, -0.002493f, -0.001498f, -0.000455f, +0.006364f, +0.006280f, + -0.006622f, -0.003410f, -0.008837f, +0.001299f, -0.003255f, +0.004611f, -0.002150f, -0.000578f, +0.003341f, -0.003652f, + -0.003302f, +0.004067f, -0.002955f, +0.002838f, +0.002874f, +0.000195f, +0.004541f, +0.003214f, -0.002821f, +0.000354f, + -0.006536f, +0.001961f, +0.003608f, +0.001784f, +0.006710f, +0.001404f, -0.001016f, -0.000010f, -0.001446f, -0.000502f, + -0.000670f, -0.001527f, +0.001802f, +0.001489f, +0.000947f, +0.001627f, -0.000571f, -0.000237f, -0.001070f, -0.001309f, + +0.002169f, -0.002066f, -0.001869f, -0.001207f, -0.001024f, -0.000656f, -0.000849f, +0.000645f, +0.000772f, -0.000340f, + -0.000418f, +0.000506f, -0.000146f, +0.000319f, +0.000122f, +0.000130f, +0.000005f, -0.000137f, -0.000602f, +0.000174f, + +0.000040f, +0.000243f, +0.000069f, -0.000123f, +0.000018f, +0.000348f + }, + { + -0.000518f, +0.028792f, +0.002093f, -0.002738f, +0.001547f, +0.000637f, -0.002152f, -0.001058f, +0.000968f, -0.000194f, + -0.002700f, +0.003715f, -0.004115f, -0.001395f, +0.013589f, +0.015542f, -0.009563f, -0.009776f, +0.021873f, +0.021103f, + +0.000397f, -0.001563f, +0.001195f, -0.023064f, +0.000302f, -0.008928f, -0.019974f, -0.022821f, +0.005638f, -0.004696f, + +0.000765f, +0.009070f, -0.010557f, -0.001993f, +0.007937f, -0.004263f, -0.007121f, +0.001172f, +0.005102f, -0.002992f, + -0.004421f, -0.004083f, +0.004399f, -0.000170f, -0.003606f, +0.002917f, -0.001889f, -0.000417f, -0.000268f, +0.003160f, + -0.002039f, +0.000566f, +0.000351f, +0.002427f, -0.001066f, +0.000855f, -0.001331f, +0.002778f, +0.000925f, -0.001091f, + +0.000128f, +0.000355f, +0.001275f, -0.000430f, +0.000507f, +0.000011f, +0.000707f, -0.000296f, -0.000738f, +0.000180f, + +0.000200f, +0.000965f, -0.000436f, +0.000678f, +0.000989f, -0.001107f, +0.000956f, -0.000245f, -0.001329f, -0.000901f, + -0.000403f, -0.000873f, +0.000423f, -0.000111f, +0.000114f, -0.000139f, +0.000109f, -0.000368f, +0.000426f, -0.000033f, + +0.000045f, -0.000287f, -0.000055f, +0.000136f, +0.000178f, -0.000136f + }, + { + -0.056552f, -0.093432f, +0.016562f, -0.045903f, -0.006792f, +0.001974f, +0.005153f, +0.007824f, -0.006388f, +0.007823f, + -0.000186f, +0.011677f, -0.004202f, +0.008008f, +0.003314f, -0.008717f, +0.005824f, -0.014189f, +0.002751f, +0.003565f, + +0.004968f, -0.000013f, -0.001555f, -0.010110f, -0.003786f, -0.000746f, +0.000743f, +0.001526f, +0.004503f, +0.003615f, + +0.003502f, +0.001009f, +0.001415f, +0.000151f, -0.000325f, -0.003344f, +0.010638f, -0.001979f, +0.002726f, -0.003095f, + +0.002723f, -0.001209f, -0.000253f, +0.001875f, +0.001629f, -0.002413f, -0.003121f, -0.003613f, +0.002682f, +0.000521f, + +0.003444f, -0.000295f, +0.002473f, +0.001292f, +0.001276f, +0.002530f, +0.000333f, +0.001170f, +0.000550f, -0.000924f, + -0.000971f, -0.000745f, +0.002130f, +0.001418f, -0.000510f, +0.000203f, -0.000981f, +0.000372f, +0.000529f, -0.002135f, + +0.000049f, +0.000408f, +0.000666f, +0.001414f, +0.000378f, +0.000146f, -0.000613f, +0.000459f, +0.000366f, +0.001649f, + +0.000438f, -0.000271f, +0.000226f, +0.000001f, -0.000966f, +0.000047f, +0.000646f, -0.000553f, -0.000385f, +0.000667f, + +0.000547f, -0.000091f, +0.000147f, +0.000508f, -0.000688f, -0.000423f + }, + { + -0.001452f, +0.006767f, +0.010448f, -0.001979f, -0.000635f, -0.000851f, -0.002741f, +0.001607f, +0.001321f, -0.002479f, + +0.002302f, +0.002675f, -0.004676f, +0.003261f, +0.003554f, +0.043739f, -0.025838f, +0.008821f, +0.006983f, +0.001090f, + +0.000043f, -0.003285f, -0.005636f, +0.001064f, +0.000928f, -0.007036f, +0.006487f, +0.012528f, -0.000271f, -0.002169f, + -0.013063f, -0.000191f, +0.009253f, +0.000500f, +0.001323f, +0.002028f, -0.004218f, -0.003780f, +0.003273f, +0.001818f, + -0.001314f, +0.003065f, -0.001158f, +0.003928f, -0.001646f, +0.000768f, -0.003584f, +0.000306f, +0.004993f, +0.000123f, + -0.002670f, +0.001481f, +0.000110f, +0.000311f, +0.003981f, -0.001479f, -0.002335f, +0.003200f, +0.000774f, -0.000632f, + -0.000896f, -0.002943f, -0.001884f, -0.000927f, +0.000857f, -0.003063f, -0.000314f, -0.000736f, +0.001073f, -0.000998f, + -0.000287f, +0.000282f, +0.000192f, +0.000383f, +0.000100f, +0.000546f, -0.000970f, -0.000401f, +0.000504f, -0.000326f, + -0.000142f, -0.000466f, +0.000607f, -0.000368f, -0.001064f, +0.000071f, -0.000124f, -0.000309f, +0.000365f, -0.000109f, + -0.000141f, +0.000118f, +0.000030f, -0.000270f, -0.000072f, -0.000160f + }, + { + +0.030113f, -0.140934f, -0.009004f, +0.021816f, +0.000688f, +0.014227f, +0.007371f, -0.006522f, -0.007670f, +0.000521f, + +0.007227f, +0.002973f, -0.008433f, -0.000997f, +0.001194f, -0.001340f, +0.002084f, +0.011375f, -0.017153f, -0.000732f, + +0.002050f, +0.000467f, -0.003494f, -0.008927f, +0.005185f, -0.001891f, +0.001249f, +0.006914f, +0.006495f, -0.003970f, + -0.003529f, -0.001072f, -0.002657f, +0.004925f, -0.003337f, -0.003559f, -0.002484f, -0.006868f, +0.006381f, +0.002338f, + -0.007733f, +0.003633f, -0.001705f, -0.004731f, +0.000230f, -0.002847f, +0.003681f, +0.000871f, +0.001674f, -0.000124f, + +0.000357f, +0.003757f, +0.003790f, +0.001805f, +0.000198f, +0.002398f, +0.000194f, -0.000386f, -0.000019f, +0.001695f, + +0.002368f, +0.000154f, -0.001733f, -0.000512f, -0.001148f, +0.001409f, +0.000847f, -0.000898f, -0.001657f, +0.002765f, + +0.000135f, +0.000264f, -0.000889f, -0.000719f, -0.000049f, -0.001095f, +0.000252f, -0.000047f, -0.000450f, -0.001022f, + -0.000899f, +0.000363f, +0.000114f, -0.000718f, -0.000049f, +0.001068f, -0.000446f, +0.000468f, +0.000215f, -0.000051f, + -0.000245f, +0.000391f, -0.000233f, -0.000489f, -0.000157f, +0.000748f + }, + { + -0.001053f, -0.021981f, -0.007894f, -0.005761f, +0.000882f, -0.001197f, -0.002120f, +0.001008f, +0.000061f, -0.008876f, + +0.000431f, -0.009339f, +0.007798f, -0.003196f, +0.003180f, -0.007651f, -0.001540f, -0.004966f, +0.010569f, -0.009249f, + +0.008508f, +0.002922f, +0.017067f, +0.009695f, -0.005273f, -0.013445f, -0.004848f, -0.001163f, +0.003467f, +0.001642f, + +0.001079f, +0.008707f, -0.002587f, -0.005097f, -0.003376f, +0.002972f, +0.001703f, -0.002974f, +0.002380f, +0.001851f, + -0.001123f, +0.003324f, +0.001150f, +0.003783f, -0.005424f, +0.001072f, +0.002561f, +0.000489f, -0.002851f, -0.000544f, + -0.004264f, +0.000772f, +0.001152f, +0.000740f, -0.002727f, +0.000963f, -0.000079f, +0.000169f, +0.000273f, +0.003025f, + +0.002849f, +0.001602f, +0.000404f, -0.000758f, -0.000050f, +0.000838f, +0.000258f, +0.000462f, +0.000230f, -0.000299f, + -0.000617f, -0.000242f, +0.000376f, +0.001406f, +0.000129f, -0.000294f, +0.000337f, -0.001160f, -0.000432f, -0.000440f, + +0.000131f, -0.000943f, +0.000565f, +0.000012f, +0.000996f, +0.000253f, -0.001388f, -0.000561f, -0.000295f, -0.000303f, + -0.000104f, +0.000598f, +0.000473f, +0.000262f, -0.000203f, -0.000233f + }, + { + -0.077186f, -0.191612f, -0.002980f, -0.006434f, -0.025891f, -0.038292f, +0.003018f, +0.004451f, -0.008298f, +0.008597f, + -0.007994f, -0.002124f, -0.012137f, +0.015859f, -0.004535f, +0.008609f, -0.003763f, +0.002443f, -0.012115f, -0.011163f, + +0.005758f, +0.013840f, +0.000712f, +0.003411f, -0.005607f, -0.010318f, -0.004070f, +0.004833f, +0.005571f, -0.001355f, + -0.001842f, -0.005654f, +0.000726f, -0.000125f, -0.007913f, +0.001272f, -0.003017f, -0.004873f, -0.006207f, -0.000396f, + +0.000452f, -0.006598f, +0.006529f, +0.000317f, +0.000175f, +0.001170f, +0.001851f, +0.001288f, +0.003123f, +0.002259f, + +0.000256f, -0.001195f, -0.001723f, +0.000891f, -0.000566f, +0.001136f, -0.000530f, -0.001110f, -0.001787f, -0.000273f, + +0.000915f, -0.000693f, +0.001818f, -0.000753f, -0.000743f, +0.000208f, -0.001526f, -0.000057f, -0.000718f, -0.000609f, + +0.000048f, -0.001463f, -0.001092f, +0.000932f, +0.000278f, -0.001271f, +0.000604f, +0.000104f, +0.000423f, +0.000696f, + +0.001323f, +0.000349f, -0.000219f, +0.000598f, +0.000433f, -0.000086f, -0.000532f, -0.000680f, -0.000605f, -0.000416f, + -0.000001f, -0.000000f, +0.000621f, +0.000137f, +0.000215f, +0.000246f + }, + { + +0.004245f, -0.017113f, -0.014744f, +0.003576f, +0.008158f, +0.005306f, +0.006567f, -0.006697f, +0.000029f, -0.001076f, + +0.002091f, +0.009135f, +0.004531f, -0.005774f, -0.023462f, +0.012813f, +0.015503f, -0.001872f, +0.010895f, -0.002412f, + +0.006670f, +0.042272f, +0.013247f, +0.008881f, -0.024253f, -0.014451f, +0.010226f, -0.002920f, -0.013193f, +0.010137f, + -0.002298f, +0.000573f, -0.002453f, +0.002674f, +0.000305f, +0.002714f, +0.001247f, -0.001527f, -0.003955f, +0.004123f, + +0.001729f, -0.007176f, -0.001765f, -0.002626f, -0.001815f, +0.006088f, +0.001007f, -0.000952f, +0.000899f, -0.000594f, + +0.001157f, +0.002421f, -0.000486f, +0.001568f, +0.003595f, +0.000570f, +0.000493f, -0.000834f, -0.001844f, +0.000099f, + -0.000896f, -0.000934f, +0.000627f, -0.001323f, +0.000673f, -0.000887f, -0.000562f, +0.000637f, +0.001166f, -0.001127f, + +0.000457f, +0.000894f, +0.000683f, +0.000387f, -0.000290f, +0.000553f, +0.000865f, +0.000634f, -0.000044f, -0.000983f, + +0.000123f, -0.000829f, +0.000936f, +0.000490f, -0.000171f, +0.000636f, -0.001062f, +0.000659f, +0.000292f, -0.000098f, + -0.000594f, +0.000151f, +0.000359f, +0.000081f, -0.000425f, -0.000207f + }, + { + +0.009627f, -0.169816f, -0.002697f, -0.010819f, +0.008852f, -0.017645f, -0.006253f, +0.002321f, -0.004430f, -0.001677f, + -0.000613f, -0.008972f, -0.002621f, +0.018940f, -0.001578f, +0.008066f, -0.002983f, +0.020684f, -0.019467f, -0.002079f, + -0.007458f, -0.003900f, -0.003103f, +0.002906f, -0.003139f, +0.000468f, +0.003490f, +0.004020f, +0.005800f, +0.004223f, + +0.002524f, +0.003000f, +0.001939f, -0.002338f, +0.001559f, -0.002017f, -0.004820f, -0.004380f, -0.001595f, +0.002114f, + +0.000640f, +0.003341f, -0.007571f, -0.003943f, -0.001117f, -0.005652f, -0.001642f, -0.000462f, -0.000068f, +0.000637f, + -0.000773f, +0.002828f, -0.002740f, +0.002306f, -0.000944f, -0.001843f, +0.004079f, -0.000902f, -0.000041f, -0.000240f, + +0.001154f, -0.000332f, -0.000758f, -0.000106f, -0.001860f, -0.001859f, +0.000099f, -0.001213f, -0.000457f, +0.001066f, + -0.000769f, -0.000124f, +0.001649f, -0.000859f, -0.000940f, +0.000495f, +0.000570f, -0.000452f, +0.000471f, -0.000233f, + -0.000751f, -0.000178f, -0.000577f, -0.001742f, +0.000035f, +0.000507f, +0.000051f, +0.000290f, +0.000147f, -0.000054f, + +0.000709f, +0.000544f, +0.000239f, -0.000170f, +0.000295f, -0.000223f + }, + { + +0.008299f, -0.025095f, -0.008518f, +0.009268f, -0.006459f, -0.001715f, +0.002464f, -0.003673f, -0.003326f, -0.006074f, + -0.000824f, -0.004808f, -0.002584f, +0.000182f, -0.002025f, -0.004899f, +0.006096f, -0.008859f, -0.008638f, -0.015401f, + +0.002364f, -0.012473f, +0.003380f, +0.004003f, +0.000199f, -0.004636f, +0.001518f, +0.002350f, -0.018143f, -0.003999f, + +0.002280f, -0.003317f, +0.004561f, -0.006599f, -0.005231f, -0.003975f, +0.005917f, -0.003737f, -0.001012f, -0.004708f, + +0.005640f, +0.002052f, -0.000770f, -0.004079f, -0.001486f, +0.000488f, +0.001412f, -0.000658f, -0.003158f, -0.002209f, + +0.001218f, +0.004422f, -0.001393f, -0.000772f, -0.001035f, +0.002571f, +0.002981f, -0.001812f, +0.001788f, -0.001679f, + -0.002082f, +0.001852f, -0.000060f, +0.001040f, -0.000580f, +0.002542f, -0.001634f, +0.000981f, -0.000695f, +0.000403f, + +0.001159f, -0.000524f, +0.001310f, -0.001573f, -0.000728f, -0.002148f, +0.000347f, -0.000234f, +0.000208f, +0.000477f, + -0.000723f, -0.000583f, -0.001407f, +0.000158f, +0.000790f, +0.000086f, -0.000498f, +0.000052f, +0.000077f, +0.000574f, + +0.000169f, +0.000341f, -0.000372f, +0.000320f, -0.000658f, +0.000259f + } + }, + { + { + -0.004022f, +0.071692f, -0.030597f, +0.013226f, +0.020625f, +0.002655f, -0.001163f, +0.017326f, -0.000973f, -0.002488f, + +0.004235f, +0.005832f, -0.007044f, -0.005041f, +0.014614f, -0.003959f, -0.002898f, +0.002522f, +0.004474f, -0.009338f, + +0.005148f, -0.000831f, +0.005814f, -0.009720f, +0.010201f, -0.000268f, +0.001425f, +0.007512f, +0.003482f, +0.001223f, + +0.002551f, +0.004633f, -0.011211f, +0.000680f, -0.008927f, -0.001107f, +0.001535f, +0.001630f, +0.005430f, +0.004294f, + +0.000317f, +0.003033f, -0.005493f, +0.003068f, -0.001575f, +0.002760f, +0.003085f, -0.000102f, -0.000422f, +0.001437f, + -0.002650f, +0.001665f, +0.002951f, +0.001572f, +0.001069f, +0.002103f, +0.001220f, +0.000119f, -0.001375f, +0.001560f, + -0.000012f, +0.000479f, +0.000360f, -0.000990f, +0.001003f, +0.001880f, +0.000593f, +0.002111f, +0.000510f, +0.001332f, + -0.001461f, +0.000213f, -0.000669f, -0.000058f, -0.000456f, +0.001012f, -0.000230f, -0.000864f, -0.000201f, -0.000764f, + +0.000784f, -0.000227f, +0.000603f, -0.000159f, -0.000509f, +0.000704f, -0.000023f, -0.000509f, +0.000434f, +0.000166f, + +0.000258f, +0.000385f, -0.000327f, +0.000352f, -0.000047f, +0.000562f + }, + { + +0.002294f, +0.004189f, -0.003487f, -0.018700f, -0.022785f, -0.000015f, +0.004327f, +0.008158f, +0.004049f, -0.001480f, + -0.012462f, +0.000673f, -0.003356f, +0.008048f, -0.001191f, +0.001897f, -0.015705f, -0.002837f, -0.008544f, +0.010335f, + +0.001659f, -0.003187f, +0.003599f, -0.006100f, -0.006630f, -0.001378f, -0.012829f, -0.000739f, +0.000038f, +0.000037f, + -0.000207f, +0.006006f, -0.006263f, -0.006293f, +0.007412f, +0.000599f, +0.003873f, +0.006616f, +0.002135f, -0.000680f, + +0.003167f, -0.000232f, -0.000015f, -0.002968f, -0.003137f, -0.002315f, -0.002900f, -0.002784f, +0.002124f, +0.002085f, + +0.000514f, -0.000395f, +0.001740f, +0.000385f, +0.001306f, -0.000525f, +0.002096f, -0.000234f, +0.001593f, +0.000500f, + -0.001128f, -0.000188f, -0.000992f, +0.000032f, -0.001116f, -0.001524f, -0.001115f, +0.000463f, +0.000059f, -0.000605f, + -0.000628f, -0.000259f, -0.000276f, -0.001751f, -0.000347f, -0.001292f, +0.000883f, -0.000484f, +0.000588f, +0.000025f, + -0.000428f, -0.000562f, +0.000288f, -0.000406f, -0.000272f, -0.000262f, -0.000529f, -0.000847f, +0.000196f, -0.000562f, + +0.000450f, -0.000433f, +0.000564f, -0.000257f, -0.000185f, -0.000300f + }, + { + +0.006623f, +0.024307f, -0.018324f, -0.053551f, -0.023061f, +0.004530f, -0.003360f, +0.000989f, -0.003695f, +0.003862f, + +0.008669f, +0.017776f, +0.000291f, +0.001393f, +0.004468f, +0.000518f, +0.002087f, -0.010071f, -0.011263f, +0.003534f, + +0.012222f, +0.001827f, +0.001526f, +0.001990f, +0.009016f, -0.003477f, +0.006871f, +0.004693f, -0.002642f, +0.001626f, + -0.005781f, +0.006133f, +0.010041f, +0.002670f, -0.001144f, +0.001383f, -0.005739f, +0.000517f, -0.000310f, +0.002698f, + +0.001342f, +0.003418f, -0.001160f, +0.000339f, +0.000702f, -0.000348f, +0.000106f, +0.002037f, -0.001720f, +0.000036f, + +0.003558f, -0.002754f, -0.000220f, +0.001071f, +0.000118f, -0.001852f, -0.000003f, -0.000500f, -0.000039f, -0.001269f, + -0.004051f, +0.000000f, -0.000539f, -0.000117f, -0.000729f, +0.000463f, -0.002056f, +0.000177f, -0.002097f, +0.000731f, + -0.000123f, -0.000489f, +0.001173f, -0.001438f, -0.000537f, -0.000284f, +0.000149f, -0.000448f, -0.000355f, -0.000202f, + +0.000225f, +0.000305f, -0.000659f, -0.000131f, +0.000381f, -0.000343f, -0.000443f, +0.000275f, -0.000642f, -0.000017f, + -0.000090f, +0.000017f, -0.000318f, +0.000046f, +0.000051f, +0.000068f + }, + { + -0.034802f, -0.002925f, -0.029563f, +0.095837f, -0.003518f, -0.001117f, -0.000371f, +0.006469f, -0.004480f, +0.002187f, + -0.010476f, +0.006741f, +0.002278f, -0.002545f, -0.007812f, -0.012547f, +0.002198f, -0.003539f, +0.010777f, -0.002034f, + -0.002226f, -0.000222f, +0.002261f, +0.000277f, -0.008031f, +0.004459f, +0.004477f, -0.002760f, +0.000897f, -0.002987f, + -0.001773f, +0.002642f, -0.007367f, +0.001609f, +0.000053f, +0.002456f, -0.000940f, +0.002395f, -0.003397f, +0.000927f, + +0.006059f, -0.002893f, -0.004443f, +0.003071f, -0.002471f, +0.000057f, +0.001865f, +0.002973f, +0.002845f, +0.001354f, + +0.002256f, -0.000067f, -0.003542f, -0.001154f, -0.000677f, -0.001891f, +0.000152f, +0.000982f, +0.000170f, -0.000443f, + -0.000795f, +0.001430f, +0.003101f, -0.000642f, +0.000363f, -0.000591f, +0.001277f, -0.000181f, -0.000510f, -0.000305f, + -0.002074f, +0.000046f, +0.000249f, -0.000211f, -0.001343f, +0.001238f, -0.000112f, +0.000118f, +0.000642f, +0.000117f, + -0.001142f, -0.000297f, -0.000396f, +0.000141f, +0.000158f, -0.000250f, +0.000833f, -0.000825f, +0.000291f, -0.000025f, + -0.000454f, -0.000102f, +0.000228f, +0.000411f, -0.000211f, +0.000296f + }, + { + -0.004382f, -0.028251f, +0.013432f, -0.003757f, -0.000663f, -0.001711f, -0.001038f, +0.006714f, +0.005052f, -0.001232f, + +0.001648f, -0.003314f, +0.004615f, +0.015182f, +0.015380f, +0.001930f, +0.003522f, +0.045921f, -0.007248f, -0.012660f, + +0.005985f, -0.015235f, -0.006396f, +0.002629f, -0.000957f, -0.019862f, +0.000830f, -0.005698f, +0.003813f, +0.003740f, + +0.007485f, -0.008533f, +0.005652f, -0.005017f, -0.014352f, -0.006343f, +0.006478f, +0.001016f, -0.005098f, +0.004271f, + -0.005248f, -0.003069f, +0.001740f, -0.003120f, -0.000807f, -0.002403f, -0.001467f, +0.004055f, +0.001846f, +0.002811f, + +0.000189f, -0.001225f, +0.000111f, -0.002032f, -0.000636f, -0.000514f, -0.001001f, -0.001289f, -0.000391f, +0.001753f, + -0.000842f, +0.001437f, -0.000645f, +0.000085f, +0.000396f, -0.002358f, +0.001132f, -0.000005f, +0.001559f, -0.000434f, + +0.000817f, +0.000648f, +0.000128f, -0.000410f, -0.000539f, -0.000819f, -0.000593f, -0.000292f, -0.000415f, -0.000050f, + +0.000212f, -0.000344f, -0.000039f, +0.000093f, +0.000121f, -0.000150f, -0.000184f, +0.000497f, -0.000248f, +0.000283f, + +0.000007f, -0.000080f, +0.000346f, -0.000007f, +0.000025f, +0.000855f + }, + { + -0.050430f, +0.012409f, +0.008351f, -0.042469f, -0.007734f, +0.003581f, -0.000509f, +0.003920f, +0.000097f, +0.007684f, + -0.006163f, +0.007929f, +0.000027f, -0.002876f, +0.000265f, +0.002435f, +0.005216f, -0.000396f, +0.007003f, +0.003732f, + +0.008981f, +0.004521f, -0.006146f, -0.003252f, +0.001230f, +0.000014f, +0.001310f, -0.004262f, +0.002490f, +0.005011f, + -0.003094f, +0.000847f, +0.000642f, +0.004785f, -0.007040f, +0.000919f, -0.001489f, +0.003076f, +0.006666f, -0.004495f, + -0.007607f, +0.002093f, -0.001448f, +0.001454f, +0.003248f, -0.000248f, -0.002256f, -0.002074f, -0.000171f, +0.000438f, + -0.005459f, +0.005555f, +0.002518f, -0.001461f, +0.002895f, +0.002672f, +0.000116f, +0.001631f, +0.000583f, +0.000930f, + +0.001491f, -0.000390f, +0.000538f, +0.000010f, -0.000718f, -0.000522f, -0.002102f, -0.001013f, -0.000092f, -0.001548f, + +0.001852f, -0.000704f, -0.001048f, +0.000126f, -0.000810f, -0.000538f, -0.001164f, +0.000855f, +0.001136f, +0.000221f, + -0.000214f, +0.000548f, +0.000098f, +0.000521f, +0.000460f, -0.000107f, +0.000044f, +0.000692f, -0.000543f, +0.000880f, + +0.000497f, +0.000697f, +0.000202f, -0.000215f, +0.000332f, +0.000590f + }, + { + -0.000225f, +0.022740f, -0.008889f, -0.001684f, +0.001910f, +0.000105f, -0.000850f, -0.000349f, -0.001364f, +0.003337f, + +0.000566f, +0.001153f, +0.000807f, -0.003973f, +0.002810f, -0.019153f, -0.022155f, -0.005752f, +0.003470f, +0.007553f, + +0.010551f, -0.001338f, -0.000793f, -0.028472f, -0.004304f, +0.002194f, +0.008988f, -0.010524f, +0.009318f, +0.006802f, + +0.002050f, +0.010789f, +0.005372f, +0.009642f, +0.006451f, -0.005996f, -0.000609f, +0.001784f, +0.001850f, -0.001760f, + -0.000155f, -0.003671f, +0.002932f, -0.000134f, -0.000244f, +0.003859f, -0.002256f, -0.001072f, -0.000305f, +0.003858f, + -0.000956f, -0.000918f, -0.002332f, +0.000667f, +0.000935f, +0.000900f, -0.001782f, -0.000165f, -0.001499f, -0.001139f, + -0.000587f, -0.000949f, +0.001291f, -0.002485f, -0.002099f, +0.000022f, +0.003117f, -0.000202f, -0.001744f, +0.000469f, + +0.000749f, +0.001466f, -0.000432f, +0.000182f, +0.001248f, -0.000774f, +0.000678f, -0.000267f, -0.001214f, -0.000235f, + +0.000513f, -0.000174f, +0.000709f, +0.000120f, +0.000496f, -0.000406f, +0.000061f, -0.000136f, +0.000171f, -0.000136f, + +0.000043f, -0.000541f, +0.000155f, -0.000102f, -0.000061f, +0.000079f + }, + { + +0.038017f, -0.000471f, -0.018288f, -0.031106f, +0.013158f, -0.000267f, -0.000410f, +0.006366f, -0.006919f, +0.004248f, + -0.001228f, +0.002913f, -0.019891f, -0.002655f, +0.008466f, -0.004974f, +0.009537f, -0.004591f, +0.010075f, -0.002894f, + -0.007580f, -0.002171f, +0.000069f, -0.006711f, -0.000197f, +0.002118f, +0.003281f, +0.000487f, -0.002576f, +0.001297f, + +0.006283f, +0.006273f, +0.002941f, +0.003009f, +0.001643f, -0.008100f, +0.003272f, -0.006923f, +0.001237f, -0.006393f, + -0.000156f, -0.003207f, -0.000156f, +0.001992f, +0.005459f, -0.001930f, -0.001480f, -0.001852f, -0.000323f, -0.003591f, + +0.000459f, -0.003756f, -0.000310f, -0.000624f, +0.000450f, +0.000679f, -0.000646f, +0.002116f, +0.000683f, -0.001013f, + -0.000336f, -0.001592f, +0.000617f, +0.000686f, -0.000896f, -0.000656f, -0.001092f, +0.000665f, +0.000499f, -0.001150f, + +0.000447f, +0.000424f, +0.000684f, +0.001451f, +0.000244f, -0.000190f, -0.000627f, +0.000811f, -0.000089f, +0.000013f, + -0.000229f, -0.000139f, +0.000712f, +0.001285f, +0.000083f, +0.000504f, +0.001398f, -0.000199f, +0.000030f, +0.000248f, + +0.000229f, +0.000598f, +0.000263f, +0.000361f, -0.000212f, -0.000231f + }, + { + -0.000130f, +0.007261f, +0.002735f, +0.005004f, +0.001759f, -0.000132f, -0.001351f, +0.002389f, +0.000710f, -0.003494f, + -0.003325f, +0.000291f, -0.006853f, +0.003336f, +0.003557f, +0.038053f, -0.021105f, +0.010072f, +0.005322f, -0.005560f, + -0.008826f, -0.004618f, -0.011385f, -0.001014f, +0.000533f, -0.009796f, +0.004934f, +0.005939f, +0.007485f, +0.000077f, + -0.009545f, +0.014516f, +0.005156f, +0.001342f, +0.010550f, +0.000804f, -0.002760f, -0.000295f, -0.000676f, -0.002329f, + -0.003908f, +0.001347f, -0.002356f, +0.001293f, -0.004149f, +0.000775f, -0.000861f, -0.001577f, +0.000574f, -0.001790f, + -0.002098f, +0.002079f, +0.001346f, +0.000215f, +0.003078f, -0.000427f, -0.002329f, +0.001259f, +0.000644f, +0.000034f, + -0.001662f, -0.001943f, -0.000302f, -0.000724f, +0.001932f, -0.001441f, +0.001058f, +0.000658f, +0.001390f, -0.001439f, + -0.000506f, -0.001473f, -0.000248f, -0.000147f, -0.001996f, -0.000261f, -0.000995f, -0.000529f, +0.000270f, -0.000383f, + -0.000324f, -0.000558f, +0.000721f, +0.000162f, -0.000412f, +0.000365f, -0.000266f, -0.000959f, -0.000241f, -0.000373f, + -0.000015f, -0.000314f, -0.000203f, -0.000608f, -0.000172f, +0.000088f + }, + { + -0.028749f, -0.185587f, +0.018097f, +0.017632f, -0.030580f, +0.010260f, +0.025427f, +0.000544f, -0.000529f, +0.005632f, + +0.001338f, -0.006096f, -0.017779f, -0.004489f, +0.007562f, -0.005498f, -0.007910f, +0.009566f, -0.014895f, -0.006846f, + +0.006317f, +0.007755f, -0.002914f, -0.009614f, +0.007551f, +0.004930f, +0.006591f, +0.005559f, +0.001099f, -0.002480f, + +0.000239f, -0.004792f, -0.002788f, +0.005289f, -0.003606f, +0.002064f, +0.005845f, -0.004750f, +0.005573f, +0.002332f, + -0.004953f, +0.005461f, -0.002307f, -0.001072f, +0.005119f, -0.007695f, -0.003857f, -0.002843f, +0.001312f, -0.001874f, + -0.000284f, +0.000944f, +0.001036f, -0.001395f, -0.001719f, +0.002801f, -0.000637f, +0.002300f, +0.001550f, -0.001089f, + +0.002380f, +0.001090f, -0.000593f, +0.001819f, -0.001846f, +0.002725f, +0.002419f, -0.000759f, -0.001180f, -0.000084f, + -0.000877f, +0.001362f, -0.000631f, -0.000443f, +0.000986f, +0.000687f, +0.001092f, -0.000356f, +0.000281f, -0.000538f, + +0.000730f, +0.000224f, +0.000326f, -0.000227f, +0.000843f, +0.000476f, -0.001175f, +0.000730f, +0.000924f, +0.000215f, + +0.000101f, +0.000092f, -0.000072f, +0.000266f, -0.000107f, +0.000425f + }, + { + -0.000501f, -0.033461f, -0.006116f, +0.001104f, -0.001211f, +0.007522f, +0.003439f, +0.002245f, +0.002635f, -0.002384f, + +0.005338f, -0.013750f, +0.005322f, -0.008942f, +0.000283f, +0.001557f, +0.000773f, -0.004779f, +0.002531f, -0.019881f, + +0.000864f, -0.010168f, +0.004069f, -0.002564f, -0.003539f, -0.008945f, -0.004927f, +0.004163f, +0.003874f, +0.000154f, + -0.004558f, +0.004426f, -0.002789f, +0.000851f, +0.000094f, +0.001422f, +0.002537f, -0.005104f, +0.002344f, +0.005333f, + -0.002697f, -0.000520f, -0.000812f, +0.003984f, -0.004152f, +0.003119f, +0.002070f, -0.001918f, -0.004287f, +0.000659f, + -0.002199f, -0.002611f, -0.001810f, +0.002412f, -0.000404f, -0.001194f, -0.000824f, -0.000303f, -0.001849f, +0.000474f, + +0.002198f, +0.001641f, +0.000468f, -0.001436f, -0.000637f, -0.000670f, +0.000490f, -0.000153f, -0.000849f, +0.000342f, + +0.000429f, +0.000371f, +0.000600f, +0.001496f, +0.000203f, -0.000424f, -0.000127f, -0.000484f, +0.000290f, +0.000271f, + +0.000110f, -0.000882f, +0.000374f, -0.000237f, +0.001027f, +0.000261f, -0.000794f, -0.000488f, -0.000320f, -0.000335f, + -0.000957f, +0.000108f, +0.000301f, -0.000264f, -0.000173f, -0.000066f + }, + { + +0.089984f, +0.033904f, -0.004097f, -0.005764f, -0.011474f, -0.021079f, +0.012678f, +0.008438f, -0.003867f, +0.011523f, + -0.004983f, +0.003056f, -0.013185f, +0.005443f, -0.013137f, -0.006449f, -0.011966f, +0.000258f, -0.010816f, +0.000981f, + +0.014677f, +0.004767f, -0.001456f, +0.003423f, +0.005839f, -0.005671f, -0.004221f, -0.001552f, +0.000127f, -0.003688f, + -0.002573f, -0.007238f, +0.000848f, -0.000734f, -0.005704f, +0.006057f, -0.000111f, +0.002689f, -0.005058f, -0.002338f, + +0.001428f, -0.007724f, +0.006576f, +0.001799f, +0.003069f, -0.001335f, +0.000377f, +0.002735f, +0.001063f, -0.002356f, + -0.001256f, -0.002321f, -0.004724f, -0.001522f, -0.000033f, -0.000704f, -0.000004f, +0.000625f, -0.001066f, -0.000747f, + +0.000265f, -0.001674f, +0.002231f, +0.001035f, +0.001044f, +0.001682f, -0.000908f, +0.000436f, +0.000470f, +0.000291f, + +0.000081f, +0.000163f, +0.000029f, +0.000913f, +0.000028f, -0.001036f, +0.000850f, +0.000136f, -0.000128f, +0.000143f, + +0.000459f, +0.000026f, -0.000905f, +0.000047f, -0.000254f, -0.000509f, +0.000367f, -0.000198f, +0.000476f, +0.000800f, + -0.000290f, -0.000387f, +0.000255f, -0.000008f, +0.000127f, +0.000363f + }, + { + -0.003605f, +0.010838f, +0.016074f, -0.000268f, +0.001724f, -0.000342f, +0.003821f, -0.009040f, -0.002025f, +0.001322f, + -0.000712f, +0.000411f, +0.001282f, +0.012764f, -0.006361f, +0.006217f, +0.005304f, -0.010513f, +0.006908f, -0.000991f, + -0.017756f, +0.024033f, +0.016276f, +0.023453f, +0.001128f, -0.010238f, +0.002163f, +0.006430f, -0.008501f, +0.005869f, + -0.004824f, -0.001898f, -0.005438f, +0.001630f, +0.003171f, -0.001060f, -0.002875f, -0.000314f, -0.002983f, +0.000023f, + +0.000290f, -0.001645f, +0.003178f, +0.000832f, -0.002484f, +0.002112f, +0.003192f, -0.002133f, -0.000851f, +0.001102f, + +0.000908f, +0.000061f, -0.002992f, -0.000312f, +0.002419f, -0.000628f, -0.001687f, +0.000434f, +0.001735f, -0.000066f, + +0.000102f, +0.000706f, +0.000895f, -0.000962f, -0.001021f, -0.001434f, -0.000042f, +0.000488f, +0.001133f, -0.001794f, + -0.001377f, +0.000412f, -0.000405f, +0.000179f, +0.000142f, +0.000096f, -0.000191f, +0.000200f, +0.000493f, -0.000701f, + +0.000670f, -0.000027f, +0.000903f, +0.000436f, -0.000422f, +0.000756f, -0.000361f, +0.000237f, +0.000096f, +0.000209f, + -0.000400f, +0.000573f, +0.000505f, +0.000696f, +0.000287f, -0.000099f + }, + { + +0.024411f, -0.147860f, -0.010714f, -0.003728f, +0.023330f, +0.003639f, +0.014108f, +0.008396f, -0.003973f, -0.002430f, + +0.004396f, -0.007797f, -0.004879f, -0.000999f, -0.035604f, +0.000166f, +0.002870f, +0.025658f, -0.016408f, +0.008364f, + +0.005541f, -0.001837f, -0.001603f, +0.006348f, -0.005295f, +0.003903f, +0.006897f, -0.002159f, +0.003710f, -0.003198f, + -0.005215f, -0.000890f, +0.000854f, -0.001764f, +0.001474f, +0.001486f, +0.005389f, +0.004638f, +0.004876f, +0.003332f, + -0.004339f, +0.003601f, -0.006590f, -0.002493f, +0.004183f, -0.000530f, -0.000694f, +0.002406f, -0.000658f, -0.000100f, + -0.002287f, +0.003847f, -0.001383f, +0.001031f, -0.000093f, -0.001316f, +0.005685f, +0.002239f, +0.001717f, -0.000399f, + +0.000149f, +0.000470f, -0.000811f, +0.000877f, +0.000666f, -0.001826f, -0.000627f, -0.000914f, +0.000250f, +0.001429f, + +0.000572f, -0.000923f, +0.001747f, -0.000225f, +0.000090f, +0.000285f, +0.000612f, -0.000505f, +0.000727f, +0.000899f, + +0.000371f, +0.000793f, -0.000113f, -0.000563f, +0.000203f, -0.000424f, -0.000584f, +0.000269f, +0.000696f, -0.000190f, + +0.000235f, -0.000179f, -0.000258f, -0.000391f, +0.000288f, +0.000014f + }, + { + -0.006551f, -0.020305f, +0.011673f, +0.014860f, -0.001060f, -0.000776f, +0.006590f, -0.002896f, +0.001079f, -0.001793f, + +0.001026f, -0.005435f, -0.002545f, +0.026582f, +0.021470f, -0.021634f, -0.003646f, -0.006707f, -0.002713f, -0.003288f, + +0.016809f, +0.002103f, +0.014955f, +0.006983f, +0.007675f, -0.001504f, +0.001256f, +0.007975f, -0.008372f, +0.002270f, + +0.003681f, -0.001213f, +0.000360f, -0.005563f, +0.003652f, +0.005311f, +0.006734f, -0.000943f, +0.005212f, -0.000565f, + +0.004216f, -0.001402f, +0.001396f, -0.002156f, -0.001124f, -0.001618f, -0.001678f, -0.002289f, -0.001117f, -0.001508f, + -0.000546f, +0.002805f, -0.001172f, -0.000584f, -0.000092f, +0.003436f, +0.002634f, -0.001779f, +0.002974f, -0.000579f, + -0.002842f, +0.001277f, +0.001990f, +0.001709f, -0.001003f, -0.000290f, -0.004086f, -0.000089f, -0.000752f, +0.001450f, + +0.001830f, -0.000820f, +0.000171f, -0.000997f, +0.000950f, -0.001025f, +0.001297f, -0.000426f, -0.000624f, +0.000491f, + -0.000328f, -0.000004f, -0.000562f, +0.000540f, +0.000542f, +0.000469f, -0.000383f, -0.000024f, -0.000231f, -0.000224f, + -0.000819f, +0.000002f, -0.000140f, +0.000631f, -0.000520f, +0.000682f + } + }, + { + { + +0.000990f, +0.003012f, +0.066430f, +0.031112f, -0.000909f, +0.003394f, -0.000048f, +0.013192f, +0.001678f, +0.001927f, + -0.000318f, +0.006146f, -0.013488f, +0.010328f, -0.002114f, +0.003630f, -0.004321f, -0.003159f, +0.006784f, -0.003706f, + -0.008783f, +0.001177f, +0.009060f, -0.009582f, +0.012451f, -0.001610f, +0.001619f, +0.001197f, +0.003349f, +0.005613f, + +0.004397f, +0.000593f, -0.007183f, -0.004878f, -0.004567f, -0.003183f, +0.003368f, -0.000573f, +0.007077f, +0.000005f, + +0.003268f, +0.004232f, -0.006520f, +0.000349f, +0.003551f, +0.001007f, +0.001252f, +0.001633f, -0.000849f, -0.001122f, + +0.001894f, +0.001625f, +0.004011f, -0.001659f, +0.002751f, +0.003877f, -0.000528f, -0.000253f, -0.001704f, +0.001547f, + +0.000154f, -0.000459f, -0.000288f, +0.000128f, +0.000597f, +0.001891f, +0.000154f, +0.001848f, +0.002027f, -0.000160f, + -0.000906f, -0.000180f, -0.000571f, -0.000006f, +0.000087f, -0.000019f, +0.000585f, -0.000819f, -0.000146f, -0.001316f, + +0.000650f, -0.000480f, -0.000088f, +0.000021f, -0.000045f, +0.000373f, -0.000213f, -0.000229f, -0.000076f, -0.000200f, + +0.000298f, +0.000569f, +0.000147f, +0.000058f, +0.000461f, +0.000002f + }, + { + +0.000062f, -0.020507f, +0.024698f, -0.034573f, -0.011691f, -0.000154f, +0.005271f, +0.002749f, +0.010003f, -0.004567f, + -0.008728f, -0.002876f, +0.002958f, +0.005946f, -0.005117f, +0.005918f, -0.021409f, -0.006028f, +0.001569f, +0.010748f, + +0.001014f, -0.008896f, -0.000176f, -0.008136f, +0.002095f, -0.004853f, -0.014578f, -0.000360f, -0.005449f, +0.006111f, + +0.001805f, -0.002001f, -0.002698f, -0.005933f, +0.006720f, +0.000263f, -0.000166f, +0.006865f, +0.002619f, +0.001359f, + +0.003844f, -0.000419f, -0.001694f, -0.004282f, -0.000129f, -0.002131f, -0.003739f, -0.000650f, -0.000052f, +0.002818f, + -0.000917f, +0.000338f, +0.002427f, +0.000211f, +0.002534f, -0.000853f, +0.003102f, -0.000915f, +0.001429f, +0.001548f, + -0.001760f, -0.000766f, -0.001021f, +0.000624f, -0.001995f, -0.002499f, +0.000241f, +0.000504f, -0.000205f, +0.000195f, + +0.000759f, -0.001967f, -0.000046f, -0.000608f, -0.001077f, -0.000274f, +0.000831f, -0.000917f, +0.000344f, -0.000107f, + -0.000244f, -0.000631f, +0.000318f, -0.000889f, -0.000308f, -0.000449f, -0.000399f, -0.000349f, -0.000555f, -0.000057f, + +0.000224f, +0.000190f, -0.000433f, -0.000236f, -0.000005f, -0.000225f + }, + { + -0.008584f, +0.045964f, -0.009278f, -0.076563f, -0.006534f, -0.002641f, +0.000886f, +0.004631f, +0.000019f, -0.002708f, + +0.001818f, +0.023390f, +0.006446f, +0.004626f, +0.000110f, -0.007654f, -0.000041f, -0.002139f, -0.008050f, +0.001013f, + -0.000563f, +0.016871f, -0.007398f, +0.016065f, +0.002783f, -0.009070f, +0.013496f, +0.003269f, +0.001879f, -0.001084f, + +0.000695f, +0.003133f, +0.009488f, +0.007158f, -0.003276f, -0.002302f, -0.001913f, -0.001131f, -0.000045f, +0.001854f, + -0.000087f, +0.002989f, +0.003306f, -0.004798f, +0.000122f, -0.001559f, +0.002530f, +0.000345f, +0.001981f, +0.000110f, + +0.002142f, -0.002194f, -0.001889f, -0.000406f, +0.001721f, -0.000619f, -0.001739f, -0.001233f, -0.000868f, -0.000708f, + -0.003501f, -0.000915f, -0.001212f, -0.000061f, +0.001656f, -0.000799f, -0.002280f, +0.001203f, -0.002302f, +0.000067f, + -0.000145f, -0.000668f, +0.000049f, -0.000575f, -0.000578f, -0.000478f, +0.000265f, -0.000952f, +0.000365f, -0.001010f, + +0.000196f, +0.000060f, -0.000319f, +0.000530f, -0.000758f, -0.000188f, -0.000476f, +0.000307f, -0.000339f, -0.000465f, + +0.000206f, -0.000216f, -0.000087f, +0.000126f, +0.000470f, -0.000067f + }, + { + +0.019112f, -0.140762f, +0.018560f, +0.093065f, +0.000282f, -0.001508f, +0.004232f, -0.003217f, -0.001468f, +0.003558f, + +0.002112f, -0.003291f, -0.006690f, -0.000318f, -0.000231f, -0.003718f, +0.004236f, -0.007582f, +0.003575f, -0.002167f, + +0.002569f, -0.005572f, -0.002446f, +0.000875f, -0.003234f, -0.003224f, +0.003809f, +0.001342f, -0.003245f, -0.004755f, + -0.004106f, +0.004241f, -0.004761f, +0.001744f, -0.000727f, +0.001203f, +0.002649f, -0.000170f, -0.000471f, +0.001196f, + +0.004401f, -0.004008f, -0.000535f, -0.001213f, -0.002783f, +0.001650f, +0.003965f, +0.001372f, -0.000574f, +0.002448f, + +0.003001f, +0.001079f, -0.005125f, -0.001751f, -0.001987f, -0.001246f, +0.000744f, +0.000580f, +0.000829f, -0.000594f, + +0.000041f, +0.000067f, +0.001957f, -0.000523f, -0.000069f, +0.000736f, +0.000038f, -0.000521f, +0.000155f, -0.001194f, + -0.001296f, +0.000168f, +0.000100f, -0.000089f, -0.000758f, +0.000310f, +0.000913f, +0.000504f, +0.000030f, -0.000677f, + -0.000562f, -0.000399f, +0.000081f, +0.000216f, +0.000357f, -0.000111f, +0.000676f, -0.000394f, -0.000114f, -0.000055f, + -0.000561f, +0.000049f, +0.000067f, +0.000253f, -0.000108f, +0.000066f + }, + { + +0.004218f, -0.013207f, -0.003004f, -0.004848f, -0.001300f, -0.000644f, +0.002338f, +0.001484f, +0.006729f, -0.000543f, + -0.007045f, +0.005423f, +0.006366f, +0.003049f, +0.019400f, +0.012466f, +0.016727f, -0.006407f, -0.002040f, -0.006456f, + +0.000979f, -0.002195f, -0.019857f, +0.010019f, -0.007348f, -0.013889f, +0.000589f, -0.002708f, +0.004621f, +0.003516f, + +0.003071f, -0.001777f, -0.002952f, -0.003119f, -0.008188f, -0.006697f, +0.003031f, +0.001658f, -0.002493f, -0.002912f, + -0.003332f, -0.002691f, +0.001096f, -0.001967f, -0.000303f, -0.003172f, -0.000727f, +0.000291f, +0.004442f, +0.001133f, + -0.001036f, -0.001143f, +0.001387f, -0.001812f, -0.000335f, -0.001099f, -0.001563f, -0.001075f, +0.001302f, -0.000019f, + -0.000326f, -0.000814f, +0.001295f, -0.001216f, -0.000685f, +0.000367f, -0.000004f, +0.000512f, -0.000449f, +0.001152f, + -0.001315f, +0.001797f, +0.000311f, -0.000648f, -0.000125f, -0.000401f, -0.000944f, -0.000311f, -0.000964f, -0.000168f, + +0.000771f, +0.000139f, -0.000522f, +0.000467f, -0.000129f, -0.000286f, -0.000250f, +0.000712f, -0.000256f, -0.000508f, + +0.000108f, +0.000257f, +0.000064f, +0.000159f, +0.000043f, +0.000218f + }, + { + +0.023980f, -0.090652f, +0.005705f, -0.064016f, +0.014926f, +0.002874f, +0.004804f, -0.005027f, +0.002727f, -0.003069f, + +0.006032f, +0.002004f, +0.010331f, -0.011729f, -0.000896f, -0.000907f, +0.003827f, +0.002290f, +0.008172f, -0.005295f, + +0.015405f, +0.003377f, -0.007154f, -0.000421f, -0.000370f, -0.001812f, +0.001170f, +0.000065f, -0.001400f, -0.003749f, + +0.002636f, +0.004756f, +0.004367f, +0.000748f, -0.005202f, +0.001187f, -0.000020f, -0.000312f, +0.006332f, -0.001130f, + -0.007470f, -0.001923f, -0.000676f, +0.001893f, +0.000833f, +0.002223f, -0.006022f, -0.002736f, +0.002036f, -0.001124f, + -0.000789f, +0.002767f, -0.000331f, -0.001077f, +0.001601f, +0.003741f, +0.000140f, +0.000434f, +0.001059f, +0.000252f, + +0.002103f, -0.000427f, -0.000177f, -0.001664f, -0.000043f, -0.000117f, -0.002526f, -0.001111f, +0.000537f, -0.001315f, + +0.000981f, +0.001503f, -0.002679f, +0.000728f, +0.000228f, -0.001460f, -0.000718f, +0.000683f, +0.001115f, +0.000368f, + -0.000193f, +0.000812f, -0.000102f, +0.000528f, +0.000751f, -0.000365f, +0.000043f, +0.000677f, -0.000458f, +0.000844f, + +0.000418f, +0.000338f, +0.000308f, -0.000247f, +0.000446f, +0.000425f + }, + { + +0.000501f, +0.006157f, +0.000186f, +0.000868f, -0.001162f, +0.000461f, -0.000836f, +0.002173f, -0.002188f, +0.000667f, + +0.003213f, +0.000357f, +0.001101f, -0.007400f, -0.003356f, -0.015433f, -0.012155f, -0.012142f, +0.016228f, -0.013692f, + +0.016369f, -0.012701f, -0.007682f, +0.000796f, -0.001956f, +0.003306f, +0.000173f, -0.001638f, +0.003894f, +0.008960f, + +0.003739f, +0.003792f, +0.015846f, +0.005395f, +0.000894f, -0.004822f, +0.007253f, -0.000722f, +0.000695f, -0.005106f, + +0.002223f, +0.000477f, -0.001208f, -0.002019f, +0.002700f, +0.001735f, +0.000943f, -0.001621f, -0.000374f, +0.002847f, + -0.000192f, -0.002904f, -0.001848f, +0.001579f, +0.001136f, -0.000680f, +0.000294f, -0.002095f, -0.002557f, +0.000273f, + +0.000688f, -0.001417f, +0.000039f, -0.001420f, -0.001538f, -0.000104f, +0.001395f, -0.000645f, -0.000306f, +0.000967f, + +0.000990f, -0.000457f, +0.000466f, -0.000289f, -0.000185f, +0.000722f, -0.000584f, -0.000016f, -0.000595f, -0.000295f, + +0.000060f, +0.000975f, +0.000240f, -0.000131f, +0.000278f, -0.000261f, +0.000236f, -0.000059f, +0.000279f, +0.000172f, + -0.000299f, -0.000243f, +0.000009f, +0.000335f, -0.000065f, +0.000078f + }, + { + -0.002518f, +0.019648f, +0.018205f, +0.002023f, -0.021593f, +0.003395f, +0.000813f, +0.000565f, -0.003231f, +0.001602f, + -0.001758f, -0.003222f, -0.005322f, -0.009979f, +0.012080f, -0.006358f, +0.008646f, +0.001749f, +0.005856f, -0.001482f, + -0.016597f, +0.003317f, -0.001527f, -0.004313f, +0.000536f, -0.001385f, +0.002904f, +0.000705f, -0.004164f, +0.006423f, + +0.003671f, +0.004287f, -0.000775f, +0.004292f, +0.002299f, -0.006086f, -0.001784f, -0.003785f, -0.000001f, -0.003353f, + -0.004654f, -0.003447f, +0.004238f, +0.001517f, +0.001569f, +0.000132f, +0.000900f, -0.000367f, -0.004066f, -0.004014f, + -0.001891f, -0.000508f, -0.003672f, -0.000195f, -0.000620f, +0.000506f, +0.000024f, +0.002542f, -0.000444f, -0.000117f, + -0.001378f, -0.001561f, +0.000096f, +0.000716f, -0.000397f, -0.000393f, -0.001149f, +0.001431f, -0.001220f, -0.000413f, + +0.001151f, +0.000194f, +0.000031f, +0.001702f, +0.000065f, -0.000468f, -0.000882f, +0.000470f, +0.001007f, -0.001169f, + -0.000004f, -0.000252f, +0.000594f, +0.000292f, +0.001329f, -0.000347f, +0.000972f, +0.000817f, +0.000123f, -0.000135f, + +0.000372f, +0.000219f, +0.000124f, +0.000288f, -0.000261f, +0.000201f + }, + { + +0.001349f, -0.005285f, +0.007265f, +0.003976f, +0.003166f, +0.000900f, +0.000154f, -0.001704f, +0.003406f, +0.001559f, + -0.008186f, -0.001829f, -0.006967f, +0.006210f, +0.008931f, +0.013434f, +0.024698f, -0.008509f, +0.008485f, -0.011420f, + -0.013889f, +0.005206f, -0.005079f, -0.012953f, +0.002502f, -0.000557f, +0.000636f, -0.000090f, +0.007850f, +0.001797f, + -0.005740f, +0.017159f, -0.004230f, +0.003596f, +0.012654f, -0.004270f, -0.000296f, +0.000494f, +0.001606f, -0.005469f, + -0.002279f, -0.004025f, +0.001262f, +0.001091f, -0.005246f, -0.001061f, +0.003908f, -0.000676f, -0.002602f, -0.001772f, + +0.000155f, +0.000189f, +0.003064f, -0.000286f, +0.000811f, +0.000343f, -0.000650f, -0.002305f, +0.000723f, +0.002107f, + -0.001139f, -0.000938f, +0.000782f, +0.000561f, +0.000838f, -0.001068f, +0.001522f, +0.001525f, -0.000156f, -0.001535f, + +0.000337f, -0.002417f, -0.000377f, -0.000821f, -0.001945f, +0.000292f, -0.000415f, -0.001064f, -0.000644f, +0.000188f, + -0.000134f, +0.000374f, +0.000441f, -0.000210f, +0.000315f, -0.000168f, -0.000162f, -0.000687f, -0.000556f, -0.000322f, + +0.000455f, -0.000436f, -0.000432f, -0.000378f, -0.000872f, +0.000668f + }, + { + +0.028596f, -0.207279f, -0.033332f, +0.024324f, -0.032919f, +0.015077f, +0.007691f, -0.001346f, +0.009567f, -0.008247f, + +0.001435f, -0.007955f, -0.004342f, -0.011107f, +0.017351f, -0.010511f, -0.006813f, +0.003814f, -0.006987f, -0.005238f, + +0.003251f, +0.007914f, -0.002903f, -0.006701f, +0.001110f, +0.003861f, +0.005772f, +0.005651f, -0.001646f, -0.001916f, + +0.002967f, -0.006804f, -0.003854f, +0.004102f, +0.000373f, +0.004565f, +0.006241f, -0.002375f, +0.002538f, -0.001479f, + +0.002541f, -0.001460f, -0.000003f, +0.003991f, -0.000922f, -0.004138f, -0.004978f, -0.002431f, +0.001581f, +0.000659f, + -0.002125f, -0.001165f, -0.001342f, -0.000689f, +0.000720f, +0.000521f, -0.000242f, +0.002536f, +0.002387f, +0.001207f, + +0.000138f, +0.000552f, +0.000923f, +0.001420f, -0.001689f, +0.002873f, +0.001129f, -0.000445f, -0.000386f, -0.001985f, + +0.000150f, +0.001393f, -0.000509f, +0.000360f, +0.001263f, +0.000682f, -0.000405f, +0.000602f, +0.000330f, -0.000008f, + +0.000856f, -0.000294f, +0.000431f, +0.000181f, +0.000482f, -0.000469f, -0.000946f, +0.000499f, +0.000437f, -0.000152f, + +0.000820f, +0.000083f, +0.000226f, +0.000036f, +0.000344f, -0.000386f + }, + { + +0.001186f, -0.049535f, -0.004781f, +0.018827f, -0.005993f, +0.002374f, +0.010533f, -0.000498f, +0.000172f, +0.002041f, + +0.001460f, -0.005721f, -0.005921f, +0.007014f, -0.009849f, +0.011629f, -0.001846f, -0.006781f, -0.011971f, -0.003776f, + -0.008201f, +0.002939f, -0.006325f, -0.015040f, +0.004705f, -0.004312f, -0.005761f, +0.008309f, +0.001161f, -0.005289f, + +0.004223f, -0.002218f, -0.005503f, -0.000119f, +0.002667f, -0.002038f, +0.001750f, -0.000524f, +0.000662f, +0.004805f, + -0.001235f, -0.002805f, -0.000786f, +0.000845f, +0.001846f, +0.000362f, +0.000912f, -0.002728f, -0.001337f, -0.002023f, + -0.001017f, -0.002710f, +0.000002f, +0.001254f, -0.000752f, -0.001009f, -0.001421f, -0.000330f, -0.000580f, -0.000341f, + +0.000902f, -0.000667f, +0.001642f, -0.000515f, -0.000478f, -0.000255f, -0.000637f, -0.000580f, +0.000014f, -0.000279f, + +0.000378f, +0.000606f, +0.000119f, +0.001553f, -0.000242f, +0.000329f, -0.000922f, +0.000302f, -0.000030f, +0.000942f, + +0.000216f, -0.000535f, -0.000369f, +0.000112f, +0.000291f, +0.000150f, -0.000028f, -0.000571f, -0.000391f, -0.000136f, + -0.000925f, +0.000174f, +0.000153f, -0.000473f, -0.000065f, +0.000084f + }, + { + -0.061067f, +0.226406f, +0.004349f, +0.002610f, -0.011826f, -0.004351f, +0.008833f, -0.002845f, +0.000289f, +0.010626f, + -0.000106f, +0.000251f, +0.000564f, -0.017955f, -0.005963f, -0.006379f, -0.001857f, -0.009454f, -0.009488f, +0.008772f, + +0.010326f, -0.005159f, +0.005391f, +0.000228f, +0.009353f, -0.002622f, -0.005481f, +0.002771f, -0.008928f, +0.002452f, + -0.008095f, -0.000911f, +0.000347f, -0.006249f, -0.004198f, +0.005949f, +0.005044f, +0.000406f, -0.000668f, -0.002624f, + -0.003575f, -0.001303f, +0.004292f, -0.005118f, +0.005574f, +0.002284f, +0.000914f, -0.000611f, +0.002444f, -0.002972f, + -0.001225f, -0.002127f, -0.004052f, -0.000261f, -0.001882f, -0.000893f, -0.002206f, +0.003930f, -0.002361f, -0.000123f, + -0.000994f, -0.001313f, +0.002437f, +0.000409f, +0.001979f, +0.000975f, +0.000637f, -0.001191f, +0.001193f, +0.000431f, + -0.000011f, +0.000577f, +0.000856f, -0.000257f, -0.001319f, +0.001158f, +0.000221f, +0.000513f, -0.000553f, +0.000530f, + -0.001240f, +0.000439f, -0.000559f, -0.000119f, -0.000551f, -0.000411f, +0.000316f, -0.000079f, +0.000949f, +0.000161f, + -0.000429f, +0.000020f, -0.000157f, -0.000038f, +0.000125f, +0.000463f + }, + { + +0.002655f, +0.029782f, +0.002578f, -0.003055f, +0.002016f, -0.004734f, +0.011720f, -0.013386f, -0.002735f, +0.002841f, + -0.002702f, +0.004946f, +0.000945f, +0.011714f, -0.008703f, +0.003360f, -0.004856f, -0.002654f, -0.005219f, +0.002567f, + -0.004083f, -0.000401f, +0.013342f, +0.012995f, +0.015050f, -0.001781f, -0.003210f, -0.001136f, +0.004494f, -0.009980f, + +0.004567f, -0.004762f, +0.001989f, -0.003925f, +0.004647f, -0.001206f, -0.004158f, -0.003458f, +0.005852f, -0.003292f, + -0.003580f, +0.003237f, -0.000534f, +0.000908f, -0.002029f, +0.001270f, +0.004203f, -0.004156f, -0.000488f, +0.003237f, + -0.001283f, -0.001565f, +0.001329f, -0.000856f, +0.000488f, -0.000408f, -0.001299f, +0.000726f, +0.001101f, -0.000685f, + +0.001895f, +0.000017f, +0.000145f, +0.001485f, -0.002289f, +0.000193f, -0.001171f, +0.000465f, +0.000125f, -0.000542f, + -0.002188f, +0.001452f, -0.001300f, +0.000094f, +0.000650f, -0.000716f, -0.000794f, +0.000059f, +0.000951f, -0.000021f, + +0.000171f, +0.001203f, +0.000087f, +0.000361f, -0.000280f, +0.000919f, -0.000249f, +0.000052f, +0.000116f, +0.000184f, + +0.000143f, +0.000407f, +0.000101f, +0.000861f, +0.000362f, -0.000229f + }, + { + -0.042906f, -0.048370f, -0.004453f, +0.018531f, -0.006017f, +0.013823f, +0.009923f, +0.003811f, -0.005498f, +0.003842f, + +0.000071f, -0.005158f, -0.009261f, -0.003055f, -0.040768f, +0.009521f, +0.008805f, +0.011048f, -0.003980f, +0.003669f, + +0.003813f, -0.003093f, +0.006325f, +0.000894f, -0.000520f, +0.004681f, +0.006106f, -0.005379f, -0.000631f, -0.002460f, + -0.001833f, -0.001405f, -0.001151f, +0.005611f, -0.002494f, +0.006755f, +0.005263f, +0.006815f, +0.000404f, +0.001149f, + -0.003165f, -0.005103f, +0.001586f, +0.003190f, -0.000471f, +0.003207f, +0.002237f, -0.001840f, +0.000992f, -0.000697f, + -0.001168f, +0.000564f, -0.000598f, +0.000454f, +0.000186f, -0.000079f, +0.004135f, +0.002795f, +0.000930f, -0.001582f, + +0.001278f, +0.000155f, -0.000143f, +0.001253f, +0.000381f, -0.000733f, -0.000675f, -0.000240f, +0.000519f, +0.000350f, + +0.000868f, -0.001110f, +0.000315f, +0.000460f, +0.001058f, +0.000331f, -0.000076f, -0.000052f, -0.000436f, +0.001227f, + +0.000667f, +0.001713f, -0.000012f, -0.000168f, +0.000375f, -0.000896f, -0.000338f, -0.000353f, +0.000565f, +0.000546f, + +0.000152f, -0.000445f, -0.000428f, +0.000079f, -0.000005f, -0.000185f + }, + { + +0.004813f, +0.003122f, -0.015750f, +0.009403f, +0.007546f, -0.006545f, +0.008562f, -0.002010f, -0.000679f, +0.002446f, + +0.003117f, -0.004753f, -0.005161f, +0.009730f, +0.029056f, -0.013099f, -0.012121f, +0.003622f, -0.000842f, +0.003908f, + +0.013059f, +0.007893f, +0.009809f, +0.003529f, +0.006516f, -0.001708f, +0.000573f, +0.003650f, -0.003180f, +0.003385f, + +0.003118f, +0.000258f, -0.003909f, -0.000138f, +0.005082f, +0.011102f, -0.001126f, +0.002615f, +0.004048f, +0.002016f, + -0.001453f, -0.002067f, -0.000783f, +0.003058f, -0.002232f, -0.001626f, -0.003349f, -0.001057f, +0.001088f, -0.002178f, + -0.000026f, +0.000919f, -0.000230f, -0.000150f, +0.001765f, +0.002455f, +0.001111f, +0.000480f, +0.000149f, -0.002399f, + +0.000041f, +0.000284f, +0.001983f, +0.001056f, +0.000021f, -0.002923f, -0.000058f, -0.000534f, +0.000218f, +0.001302f, + +0.000349f, -0.000409f, -0.000869f, +0.000040f, +0.000084f, +0.000210f, +0.000451f, +0.000255f, -0.000652f, -0.000428f, + -0.000165f, +0.000585f, +0.000213f, +0.000102f, -0.000289f, +0.000456f, +0.000021f, -0.000454f, +0.000527f, -0.000261f, + -0.000916f, -0.000222f, -0.000032f, +0.000446f, +0.000050f, +0.000713f + } + }, + { + { + +0.006345f, +0.072584f, +0.096494f, +0.044926f, +0.009654f, -0.001223f, -0.001289f, +0.009008f, -0.003257f, -0.003030f, + -0.005377f, -0.000188f, -0.014441f, +0.012157f, +0.001378f, +0.018118f, +0.008603f, -0.006818f, -0.002930f, -0.003360f, + -0.011726f, -0.001454f, +0.005765f, -0.001819f, +0.008560f, -0.009055f, -0.003282f, -0.002736f, -0.002440f, -0.000243f, + +0.000595f, +0.004507f, +0.002182f, -0.003350f, -0.001736f, -0.007186f, +0.005434f, +0.000573f, -0.000966f, -0.003632f, + +0.003519f, +0.003878f, -0.003153f, +0.001201f, +0.004248f, +0.002982f, +0.001435f, +0.000783f, +0.000050f, -0.000976f, + -0.000099f, +0.000213f, +0.002351f, -0.002829f, +0.000497f, +0.002884f, -0.001207f, +0.000499f, -0.001302f, +0.001359f, + +0.000322f, -0.000491f, +0.000641f, +0.000266f, -0.001238f, -0.001581f, -0.001002f, +0.001010f, +0.000940f, +0.000011f, + -0.000924f, -0.000287f, +0.000223f, +0.000044f, -0.000912f, -0.001109f, +0.000615f, -0.000815f, -0.000316f, -0.000895f, + -0.000158f, -0.001136f, -0.000427f, -0.000166f, +0.000226f, +0.000467f, -0.000097f, -0.000235f, -0.000176f, -0.000416f, + +0.000335f, +0.000462f, -0.000029f, +0.000035f, +0.000627f, -0.000155f + }, + { + -0.003260f, -0.067952f, +0.003254f, -0.000049f, +0.017924f, +0.005794f, +0.002809f, -0.004997f, +0.000841f, -0.000912f, + +0.001760f, -0.001388f, +0.002323f, +0.002041f, -0.007604f, +0.001715f, -0.019692f, -0.006175f, +0.000549f, +0.008965f, + -0.006487f, -0.011544f, -0.002331f, -0.015185f, +0.000756f, -0.005606f, -0.012575f, +0.002111f, -0.009225f, +0.010217f, + +0.003344f, -0.004348f, -0.001442f, -0.003187f, +0.004809f, +0.004400f, -0.005615f, -0.001937f, +0.001676f, +0.001975f, + +0.002820f, +0.000985f, -0.002386f, -0.004090f, +0.002054f, +0.005981f, +0.000693f, +0.001704f, +0.001462f, +0.001561f, + -0.001690f, +0.000047f, +0.000340f, -0.002402f, +0.001627f, -0.003010f, +0.003039f, -0.000383f, +0.000926f, +0.001430f, + -0.001559f, +0.000657f, +0.000044f, -0.000346f, -0.001728f, -0.002050f, +0.001272f, +0.001420f, +0.000570f, +0.000273f, + +0.000474f, -0.000418f, +0.001191f, +0.000245f, +0.000359f, +0.000775f, +0.000430f, -0.001073f, -0.001276f, -0.000469f, + +0.000418f, -0.000090f, +0.000016f, -0.000405f, +0.000147f, -0.000476f, -0.000023f, +0.000081f, -0.000379f, +0.000560f, + +0.000352f, -0.000042f, -0.000158f, +0.000120f, +0.000146f, -0.000065f + }, + { + +0.007339f, +0.022157f, -0.036072f, -0.009140f, +0.044023f, -0.002520f, +0.003927f, +0.008042f, -0.001760f, -0.014189f, + -0.011685f, +0.025584f, +0.005734f, -0.001337f, +0.002566f, -0.009665f, +0.000210f, +0.005441f, -0.007998f, -0.004827f, + -0.010539f, +0.014613f, -0.002421f, +0.017512f, -0.000620f, -0.002993f, +0.013853f, +0.001842f, +0.002120f, +0.005037f, + +0.001300f, -0.000535f, +0.009165f, +0.002163f, -0.008158f, -0.001922f, +0.001020f, -0.003497f, -0.000353f, -0.000991f, + -0.004887f, -0.000836f, +0.003153f, -0.004234f, -0.001569f, -0.002540f, +0.000548f, -0.001653f, +0.002162f, -0.000109f, + +0.000600f, -0.002591f, -0.001511f, -0.000911f, +0.001200f, -0.000484f, -0.001759f, +0.000172f, +0.000123f, +0.001426f, + -0.000067f, +0.000084f, -0.002302f, -0.001570f, -0.001775f, -0.001269f, -0.000278f, +0.000604f, -0.001683f, +0.001626f, + +0.000281f, -0.000762f, -0.000419f, +0.000413f, +0.000909f, -0.000604f, -0.000118f, -0.000707f, +0.000232f, -0.001659f, + -0.000196f, -0.000482f, -0.000243f, +0.000757f, -0.000308f, +0.000366f, -0.000150f, +0.000382f, -0.000254f, -0.000085f, + +0.000050f, -0.000288f, +0.000011f, -0.000011f, +0.000233f, -0.000192f + }, + { + +0.012474f, -0.220146f, -0.028401f, +0.073884f, -0.011168f, -0.000102f, +0.003108f, -0.005192f, +0.000906f, +0.006821f, + +0.002096f, -0.002010f, -0.000659f, +0.002920f, +0.014176f, +0.009050f, +0.003743f, -0.010063f, -0.001859f, -0.004820f, + +0.004606f, -0.002125f, -0.003289f, -0.000473f, -0.001543f, -0.007658f, -0.005910f, +0.004549f, -0.001756f, +0.000282f, + -0.001849f, +0.005288f, +0.005348f, +0.007242f, +0.003071f, +0.003003f, -0.003434f, -0.003917f, +0.000062f, -0.001033f, + +0.002016f, -0.003077f, +0.003551f, +0.001904f, -0.002070f, +0.000342f, +0.003577f, +0.001702f, -0.004172f, -0.002064f, + -0.000343f, -0.000057f, -0.003661f, -0.000697f, -0.001789f, +0.001457f, +0.002315f, -0.001099f, +0.001708f, -0.000966f, + -0.000146f, -0.001107f, -0.000846f, -0.001276f, +0.000190f, +0.000522f, -0.001131f, -0.000061f, +0.000488f, -0.000069f, + +0.000327f, +0.000888f, +0.000324f, -0.000058f, -0.000737f, -0.000069f, +0.000917f, +0.001124f, +0.000536f, -0.000652f, + +0.000665f, +0.000636f, +0.000508f, +0.000219f, +0.000562f, -0.000338f, +0.000044f, -0.000063f, +0.000012f, +0.000113f, + -0.000350f, +0.000289f, -0.000069f, +0.000176f, -0.000182f, -0.000077f + }, + { + -0.003798f, +0.010297f, +0.016444f, -0.004448f, +0.001687f, +0.001365f, +0.002096f, -0.003899f, +0.001814f, -0.000878f, + -0.005218f, +0.004943f, +0.008496f, -0.009734f, -0.006166f, -0.013364f, -0.029090f, -0.056671f, -0.018818f, -0.007513f, + +0.003016f, +0.014623f, -0.004984f, +0.014229f, -0.003001f, -0.000527f, +0.008971f, +0.008364f, +0.004039f, -0.001096f, + -0.004224f, +0.005613f, +0.006044f, +0.004076f, +0.006573f, +0.000726f, +0.002364f, +0.007872f, -0.000135f, -0.006310f, + -0.002924f, -0.001510f, +0.002159f, +0.000213f, -0.000354f, -0.000030f, -0.000138f, -0.001120f, +0.005638f, +0.001507f, + -0.003477f, -0.003395f, +0.001969f, +0.001260f, +0.000459f, -0.000704f, -0.000206f, -0.000165f, +0.002168f, -0.000953f, + -0.002671f, -0.002394f, +0.000110f, -0.000797f, +0.000383f, +0.002018f, -0.000089f, -0.000690f, -0.001519f, +0.000528f, + -0.001138f, +0.000992f, -0.000151f, -0.000247f, -0.000215f, +0.000124f, -0.000061f, +0.000567f, -0.000165f, +0.000106f, + +0.001228f, +0.001167f, -0.000459f, +0.000237f, -0.000328f, +0.000067f, +0.000059f, +0.000484f, +0.000046f, -0.000045f, + +0.000512f, +0.000234f, -0.000020f, +0.000165f, -0.000401f, -0.000221f + }, + { + +0.020459f, -0.123209f, -0.004462f, -0.065679f, -0.003640f, -0.002361f, -0.001682f, -0.009768f, -0.000308f, -0.001402f, + +0.016133f, +0.003425f, +0.010175f, -0.015657f, +0.001808f, -0.001041f, -0.005374f, +0.000736f, +0.006888f, -0.005716f, + +0.016095f, +0.002863f, -0.008718f, -0.008477f, -0.002374f, -0.001267f, -0.000393f, -0.000198f, -0.004255f, -0.006999f, + +0.001733f, +0.002087f, +0.000820f, +0.003282f, +0.000699f, +0.001047f, -0.004166f, -0.005787f, +0.001503f, -0.000516f, + -0.002247f, +0.000187f, -0.001891f, +0.000624f, -0.004893f, +0.001734f, -0.001447f, +0.000130f, +0.000828f, -0.001939f, + -0.001097f, -0.002464f, -0.001908f, +0.001407f, +0.001387f, +0.001973f, -0.001076f, -0.001618f, -0.001619f, -0.002500f, + -0.000556f, -0.000525f, +0.001171f, -0.001595f, +0.000297f, +0.001358f, -0.001158f, +0.000415f, +0.001216f, -0.000847f, + +0.001036f, +0.001634f, -0.001420f, +0.001531f, +0.001654f, -0.000961f, -0.000778f, -0.000185f, -0.000205f, -0.000540f, + -0.000532f, +0.000507f, +0.000120f, +0.000443f, +0.000536f, -0.000174f, +0.000089f, +0.000454f, -0.000259f, -0.000122f, + -0.000423f, -0.000516f, -0.000095f, -0.000207f, -0.000010f, -0.000306f + }, + { + +0.000733f, -0.005326f, -0.001981f, +0.001633f, -0.002866f, +0.000633f, +0.000300f, +0.000997f, -0.003237f, -0.003394f, + -0.000745f, -0.002121f, -0.007537f, -0.010055f, -0.001253f, -0.003750f, -0.004727f, -0.014024f, +0.011867f, -0.007502f, + +0.016494f, -0.010954f, +0.007481f, +0.019984f, +0.002136f, +0.001602f, -0.003884f, +0.004187f, +0.002894f, +0.002972f, + -0.004472f, -0.004763f, +0.009391f, -0.003470f, -0.001566f, -0.007081f, +0.001733f, -0.003735f, -0.000255f, -0.005009f, + +0.000822f, +0.002671f, +0.000991f, -0.002309f, +0.000215f, -0.000556f, -0.000971f, -0.002271f, -0.001391f, +0.001182f, + -0.002057f, -0.002895f, +0.000384f, +0.003892f, +0.000803f, +0.000373f, +0.002265f, -0.001378f, -0.001593f, +0.000734f, + +0.001517f, -0.001833f, -0.001222f, -0.000722f, -0.000137f, +0.001051f, +0.000576f, -0.001289f, -0.000895f, -0.000285f, + +0.000346f, +0.000024f, +0.001230f, -0.000962f, -0.001232f, +0.000692f, -0.000711f, +0.000281f, +0.000464f, -0.000191f, + -0.000771f, +0.001178f, +0.000377f, -0.000402f, +0.000056f, +0.000328f, +0.000723f, +0.000061f, +0.000292f, +0.000102f, + -0.000320f, -0.000216f, -0.000322f, +0.000250f, -0.000138f, +0.000176f + }, + { + -0.035785f, -0.024081f, +0.009071f, +0.024548f, +0.000936f, +0.006983f, +0.003688f, -0.005224f, -0.006702f, +0.002303f, + +0.002617f, +0.010090f, +0.012690f, -0.005206f, +0.006855f, -0.007853f, +0.005042f, +0.001474f, -0.001842f, -0.004952f, + -0.017403f, -0.001484f, -0.001613f, -0.003247f, +0.002977f, +0.000770f, +0.000201f, +0.004028f, +0.003158f, +0.004714f, + -0.002967f, -0.001653f, -0.005904f, +0.000158f, +0.001683f, -0.006166f, -0.000046f, +0.000231f, -0.000242f, +0.002509f, + +0.000222f, +0.001975f, +0.006050f, +0.001799f, -0.002266f, +0.001818f, +0.001208f, +0.000598f, +0.002146f, -0.001633f, + -0.003868f, -0.000106f, -0.004063f, -0.000709f, +0.000070f, +0.000959f, -0.001535f, +0.000684f, -0.000091f, +0.000505f, + -0.001257f, -0.000646f, +0.000253f, +0.000018f, -0.000341f, +0.000560f, +0.000034f, +0.001620f, -0.000188f, +0.000151f, + +0.000500f, -0.000475f, -0.000819f, +0.000987f, -0.000220f, -0.000581f, -0.000709f, +0.000232f, +0.000813f, -0.001178f, + -0.000026f, -0.000586f, -0.000397f, -0.000893f, +0.000709f, -0.001119f, +0.000107f, +0.000670f, -0.000033f, -0.000345f, + -0.000178f, -0.000598f, -0.000168f, +0.000184f, -0.000375f, +0.000350f + }, + { + +0.000358f, -0.008163f, +0.012179f, -0.001698f, +0.000925f, +0.001230f, +0.001332f, +0.000099f, +0.006499f, +0.002693f, + -0.005205f, -0.003660f, -0.002748f, +0.007514f, -0.002138f, +0.009542f, +0.031080f, +0.000886f, +0.010260f, -0.011099f, + -0.004259f, +0.005196f, -0.000285f, -0.005051f, +0.011573f, +0.009794f, +0.000902f, +0.001375f, -0.001010f, -0.000898f, + +0.001004f, +0.006615f, -0.006490f, +0.001130f, +0.006659f, -0.001042f, +0.003058f, -0.002239f, +0.000126f, -0.004158f, + +0.001283f, -0.005906f, -0.003659f, +0.002487f, -0.001081f, +0.002645f, +0.005024f, +0.001544f, +0.001536f, -0.000205f, + +0.000054f, -0.002158f, +0.002867f, -0.000417f, -0.001140f, -0.001849f, -0.000632f, -0.001942f, +0.000920f, +0.003150f, + +0.000589f, +0.001300f, +0.002415f, +0.000064f, -0.001265f, -0.001639f, +0.001022f, +0.000577f, -0.000358f, +0.000630f, + +0.001625f, -0.001148f, +0.001041f, -0.000932f, -0.001111f, +0.000604f, +0.000210f, -0.000124f, -0.000065f, +0.000147f, + +0.000332f, +0.000067f, -0.000361f, -0.000248f, +0.000747f, +0.000131f, +0.000097f, -0.000121f, +0.000196f, +0.000135f, + +0.000171f, -0.000194f, -0.000080f, +0.000464f, -0.000468f, +0.000254f + }, + { + -0.028110f, -0.215063f, -0.007744f, +0.023762f, -0.009634f, -0.011101f, -0.027940f, -0.002521f, +0.006666f, -0.018019f, + +0.000197f, +0.007007f, +0.014582f, -0.000364f, +0.020485f, -0.010421f, -0.009064f, +0.006700f, -0.002288f, -0.005966f, + +0.002012f, +0.010573f, -0.001245f, -0.006224f, -0.002498f, -0.001121f, -0.001249f, +0.001244f, -0.001138f, -0.002326f, + +0.006643f, -0.004307f, -0.000686f, +0.007810f, +0.003106f, +0.005102f, +0.003609f, -0.002307f, +0.001476f, -0.002220f, + +0.005047f, +0.000362f, +0.000470f, +0.003590f, -0.000208f, -0.002305f, -0.001985f, +0.000239f, +0.001196f, +0.003269f, + -0.003405f, +0.000865f, +0.002073f, -0.001532f, +0.000765f, +0.003242f, +0.001718f, +0.001882f, +0.001660f, -0.000044f, + -0.002377f, +0.001513f, +0.000949f, -0.000732f, -0.000186f, +0.002044f, -0.000296f, -0.000243f, +0.000617f, -0.001225f, + +0.000124f, +0.001613f, +0.000190f, +0.001227f, +0.000536f, -0.000765f, -0.001411f, +0.000825f, -0.000116f, -0.000388f, + -0.000028f, -0.000487f, +0.000727f, +0.000704f, -0.000570f, -0.000896f, -0.000743f, +0.000499f, +0.000381f, +0.000170f, + +0.000868f, +0.000694f, +0.000550f, -0.000223f, +0.000177f, -0.000761f + }, + { + -0.001664f, -0.045286f, -0.009765f, +0.016224f, -0.004721f, -0.009974f, +0.002423f, -0.001153f, +0.000574f, +0.000923f, + +0.002107f, -0.003817f, -0.005990f, +0.009022f, -0.014572f, +0.008093f, +0.008331f, +0.010446f, +0.003266f, +0.003950f, + -0.021779f, +0.005636f, +0.002189f, -0.014730f, +0.005252f, +0.002237f, -0.002170f, +0.004012f, -0.004789f, -0.007312f, + +0.005100f, -0.006257f, -0.006078f, -0.003979f, -0.002647f, -0.005611f, -0.002371f, -0.000861f, -0.002413f, -0.000959f, + -0.001175f, +0.000692f, +0.000967f, +0.000067f, +0.002032f, -0.000785f, +0.000437f, -0.000342f, -0.000650f, -0.002357f, + -0.000387f, -0.000493f, +0.001759f, -0.000374f, -0.003747f, -0.000417f, -0.001302f, -0.002306f, -0.001884f, -0.000831f, + -0.001434f, -0.003275f, +0.000269f, +0.000059f, +0.001077f, +0.001265f, -0.000290f, -0.000609f, +0.000337f, -0.000712f, + -0.000531f, -0.000271f, -0.000632f, +0.000590f, -0.000286f, +0.000937f, -0.001065f, -0.000164f, -0.000263f, +0.000423f, + +0.000486f, +0.000461f, -0.000030f, +0.000208f, -0.000179f, -0.000037f, +0.000220f, -0.000130f, +0.000418f, +0.000380f, + -0.000207f, +0.000234f, -0.000178f, -0.000289f, -0.000228f, +0.000062f + }, + { + +0.009230f, +0.306026f, -0.010553f, +0.005473f, +0.000509f, +0.017401f, +0.006643f, -0.001669f, +0.003630f, +0.004576f, + -0.008296f, -0.005425f, +0.001778f, -0.015936f, -0.003062f, +0.002611f, +0.009652f, -0.008769f, -0.004980f, +0.005183f, + -0.003598f, -0.007462f, +0.007638f, +0.001352f, +0.002539f, -0.001727f, -0.008679f, +0.004924f, -0.002765f, +0.011189f, + -0.006666f, -0.002513f, -0.000099f, -0.005709f, -0.005997f, -0.004156f, +0.002852f, +0.001808f, +0.002297f, -0.000544f, + +0.000175f, +0.002832f, +0.002242f, -0.008769f, -0.000133f, +0.002404f, +0.000727f, -0.001934f, +0.002926f, -0.003276f, + -0.001876f, +0.002189f, -0.000840f, +0.000205f, -0.001559f, +0.000294f, -0.001499f, +0.004928f, -0.001096f, -0.000125f, + -0.001745f, -0.001865f, -0.000651f, -0.002729f, +0.000117f, +0.000082f, +0.001595f, -0.001004f, +0.000708f, -0.000367f, + -0.000325f, +0.000375f, +0.000272f, -0.001542f, -0.000704f, +0.002489f, +0.000471f, +0.000225f, -0.001234f, +0.000092f, + -0.001769f, -0.000068f, +0.000143f, +0.000508f, -0.000745f, -0.000464f, -0.000080f, +0.000128f, +0.000656f, -0.000564f, + -0.000093f, +0.000198f, -0.000399f, -0.000327f, +0.000501f, +0.000602f + }, + { + -0.001967f, +0.047799f, +0.012586f, -0.004075f, +0.010345f, +0.002289f, +0.016879f, -0.008300f, +0.001365f, -0.001060f, + -0.002549f, +0.009176f, -0.016711f, -0.038148f, -0.024990f, +0.003654f, -0.003222f, +0.006376f, -0.010485f, -0.001133f, + +0.010766f, +0.008063f, +0.021444f, +0.006622f, +0.003613f, +0.000733f, -0.004909f, -0.008191f, +0.003476f, -0.002000f, + +0.008197f, -0.007505f, -0.003167f, -0.011159f, +0.002378f, -0.002281f, -0.004847f, -0.002335f, +0.006403f, -0.004644f, + -0.005494f, +0.004423f, +0.001804f, -0.004006f, -0.007350f, +0.000419f, +0.004711f, +0.000629f, +0.001160f, +0.003723f, + +0.000854f, -0.000467f, +0.003117f, +0.001086f, +0.003097f, +0.000836f, -0.001558f, -0.001994f, +0.000109f, -0.001778f, + +0.000390f, -0.000020f, -0.000973f, +0.001649f, +0.000230f, +0.000649f, -0.001019f, -0.000443f, -0.001559f, +0.000163f, + -0.000991f, +0.002365f, -0.000171f, -0.000518f, -0.001211f, -0.002118f, -0.000821f, +0.000270f, +0.001168f, +0.000443f, + +0.000523f, +0.000518f, -0.001580f, -0.000038f, -0.000409f, +0.000788f, -0.000145f, +0.000087f, +0.000053f, -0.000117f, + +0.000045f, -0.000051f, -0.000157f, +0.000687f, +0.000050f, -0.000004f + }, + { + +0.037669f, +0.078346f, +0.007615f, +0.015315f, -0.010868f, -0.002789f, -0.008329f, -0.002654f, -0.008237f, +0.003488f, + -0.002090f, +0.003735f, -0.007880f, +0.017368f, -0.004763f, +0.008228f, +0.002596f, +0.007248f, +0.006121f, +0.011589f, + -0.002008f, -0.004010f, +0.006853f, -0.002723f, +0.006722f, +0.010260f, +0.004229f, -0.002694f, +0.004933f, +0.006621f, + +0.006115f, +0.007623f, +0.002894f, +0.002982f, -0.007086f, +0.002118f, -0.003868f, -0.002404f, -0.003209f, -0.001483f, + -0.000776f, -0.005786f, +0.000968f, +0.005173f, +0.000325f, +0.002633f, +0.001383f, -0.004041f, +0.000428f, -0.001006f, + +0.000339f, +0.000699f, -0.001951f, +0.000613f, +0.000369f, -0.002279f, +0.000917f, +0.000988f, -0.000144f, -0.002380f, + +0.000435f, +0.000787f, +0.001232f, +0.001735f, +0.000026f, -0.000881f, -0.000956f, +0.000139f, -0.000275f, -0.000666f, + -0.000366f, -0.001800f, -0.001676f, -0.000939f, +0.000548f, -0.000289f, -0.001138f, +0.000096f, +0.000001f, +0.000345f, + -0.000214f, +0.001436f, +0.000333f, -0.000010f, +0.000761f, -0.000176f, +0.000049f, -0.000069f, +0.000580f, +0.000472f, + -0.000097f, -0.000301f, -0.000444f, -0.000164f, -0.000058f, -0.000059f + }, + { + -0.004487f, +0.024884f, +0.004208f, -0.002236f, +0.001073f, -0.004201f, +0.010713f, -0.000898f, -0.005375f, -0.006574f, + -0.000458f, -0.002713f, -0.006288f, -0.027516f, -0.024986f, -0.006746f, -0.004117f, +0.003597f, +0.004159f, +0.007641f, + +0.001182f, +0.008599f, +0.007501f, -0.008554f, +0.000366f, +0.000579f, +0.003205f, -0.000635f, -0.015681f, -0.001435f, + +0.008045f, +0.004661f, +0.001136f, +0.002715f, +0.002267f, +0.002990f, -0.002914f, +0.004976f, +0.000039f, -0.003228f, + -0.003954f, -0.002937f, -0.003349f, +0.001041f, -0.004264f, +0.001485f, -0.001407f, +0.001162f, +0.004705f, -0.001719f, + -0.000058f, +0.001744f, +0.003458f, +0.003487f, +0.001569f, +0.001131f, -0.000630f, -0.000413f, -0.000861f, -0.000809f, + +0.003085f, -0.000464f, -0.001818f, -0.000849f, +0.001381f, -0.001193f, +0.001958f, +0.000298f, +0.001327f, +0.000303f, + -0.001148f, -0.000598f, -0.000674f, +0.000370f, -0.000132f, +0.000228f, -0.000238f, -0.000162f, -0.000783f, -0.000022f, + +0.000347f, +0.000331f, +0.000664f, -0.000117f, -0.000930f, +0.000082f, +0.000342f, -0.000363f, +0.000778f, +0.000226f, + -0.000037f, +0.000303f, +0.000002f, +0.000484f, +0.000502f, +0.000514f + } + }, + { + { + -0.010676f, +0.322599f, -0.124309f, +0.043726f, +0.013808f, -0.007829f, +0.001674f, +0.009140f, -0.014454f, +0.005903f, + -0.001605f, -0.006144f, -0.004251f, +0.004600f, +0.012729f, +0.001620f, +0.013324f, +0.002418f, -0.018418f, +0.001796f, + -0.011031f, +0.008803f, -0.004426f, +0.009590f, -0.001258f, -0.009428f, +0.003968f, -0.002510f, -0.002849f, -0.001807f, + -0.001863f, +0.001157f, +0.005596f, +0.000368f, -0.001931f, -0.007386f, +0.006314f, +0.003501f, -0.002128f, -0.001722f, + +0.000084f, -0.001589f, +0.003570f, -0.001577f, +0.003482f, +0.004369f, +0.002936f, -0.000738f, -0.002487f, +0.002519f, + -0.002798f, -0.000452f, -0.002716f, +0.002807f, -0.001070f, +0.001744f, -0.001267f, +0.000208f, -0.000013f, +0.001179f, + -0.000270f, +0.001274f, +0.001253f, -0.002159f, +0.000026f, -0.002082f, +0.000517f, +0.001376f, -0.001811f, +0.000777f, + +0.000306f, -0.000408f, +0.000105f, -0.000930f, -0.000943f, -0.001138f, +0.001304f, -0.000674f, -0.000822f, -0.000252f, + -0.000259f, -0.000210f, -0.000539f, -0.000300f, +0.000203f, +0.000757f, -0.000375f, -0.000470f, +0.000271f, -0.000050f, + +0.000299f, +0.000509f, -0.000392f, +0.000092f, +0.000480f, -0.000243f + }, + { + +0.003276f, -0.094618f, +0.009510f, +0.022767f, +0.007440f, +0.005549f, -0.002656f, +0.004873f, -0.004127f, -0.005525f, + +0.002901f, +0.006969f, -0.004703f, +0.002113f, -0.007708f, -0.011885f, -0.002502f, -0.008157f, -0.009064f, +0.009230f, + -0.000049f, -0.006266f, -0.003756f, -0.012147f, +0.003946f, -0.016214f, -0.012868f, +0.002813f, -0.007220f, +0.011672f, + -0.002613f, +0.001601f, -0.003573f, +0.000164f, +0.002283f, +0.006776f, -0.001974f, -0.000038f, -0.003476f, -0.000425f, + +0.000051f, +0.006312f, -0.003357f, -0.001235f, +0.000259f, +0.005964f, +0.002570f, -0.000693f, +0.004884f, -0.000526f, + -0.003392f, +0.000765f, -0.000817f, -0.000398f, -0.001271f, -0.001584f, +0.001685f, -0.000342f, +0.000070f, +0.000973f, + -0.000310f, +0.000878f, +0.001349f, -0.001226f, -0.001156f, -0.000114f, +0.001339f, +0.000194f, -0.000472f, +0.001292f, + -0.000957f, +0.000292f, +0.000526f, +0.000420f, +0.000752f, +0.000025f, -0.000603f, +0.000928f, -0.002014f, +0.000078f, + +0.000128f, -0.000033f, -0.000214f, +0.000592f, +0.000015f, -0.000309f, +0.000006f, -0.000101f, -0.000382f, +0.000521f, + +0.000421f, -0.000410f, +0.000185f, +0.000135f, +0.000382f, -0.000371f + }, + { + -0.003286f, -0.060860f, +0.041522f, +0.040235f, -0.005171f, -0.000248f, +0.006761f, +0.002735f, +0.000225f, +0.000875f, + -0.013330f, +0.015287f, +0.006201f, +0.000855f, -0.012263f, +0.000361f, -0.000509f, +0.013185f, -0.020466f, -0.000622f, + -0.005506f, +0.008026f, +0.005441f, +0.004130f, -0.008554f, +0.025476f, +0.000436f, +0.006177f, -0.009058f, +0.011216f, + +0.000514f, -0.002408f, +0.010951f, -0.005709f, -0.006747f, +0.003118f, -0.000211f, -0.004954f, -0.000518f, -0.002610f, + -0.001378f, +0.000596f, -0.003407f, +0.000158f, +0.000568f, -0.002846f, -0.001571f, -0.001180f, +0.002297f, -0.002479f, + +0.000117f, +0.000816f, -0.001778f, +0.000847f, -0.001106f, -0.001016f, -0.000458f, +0.001740f, +0.000200f, -0.000947f, + +0.000568f, +0.000255f, -0.002367f, -0.001574f, -0.001495f, -0.001808f, +0.000685f, -0.001784f, +0.000256f, +0.001388f, + -0.000090f, +0.000504f, -0.000564f, -0.000400f, +0.001441f, -0.000256f, -0.000179f, -0.000529f, -0.000738f, -0.001369f, + +0.000551f, -0.000495f, -0.000437f, +0.000660f, +0.000401f, +0.000111f, +0.000167f, -0.000068f, +0.000083f, +0.000420f, + -0.000515f, +0.000043f, +0.000114f, -0.000349f, +0.000082f, +0.000018f + }, + { + -0.047042f, -0.226515f, +0.040270f, +0.048614f, +0.006694f, +0.004240f, -0.003650f, +0.001051f, -0.001406f, +0.003653f, + -0.001672f, +0.007451f, +0.002298f, -0.014578f, +0.021394f, +0.011333f, +0.001907f, -0.003076f, -0.010792f, +0.000149f, + -0.001299f, +0.002776f, -0.004972f, +0.004888f, -0.000094f, -0.007803f, -0.003983f, +0.002967f, -0.002156f, +0.003751f, + -0.001627f, +0.006693f, +0.009475f, +0.000321f, +0.004022f, +0.002549f, -0.004564f, -0.004679f, +0.000115f, -0.000584f, + +0.000323f, -0.000328f, +0.003478f, +0.001350f, -0.002699f, +0.000600f, +0.000712f, +0.004000f, -0.003452f, -0.001032f, + -0.002255f, -0.001483f, -0.002139f, -0.000740f, -0.000888f, +0.002931f, +0.002348f, -0.003386f, +0.002858f, -0.001683f, + +0.000370f, -0.000270f, -0.002285f, +0.000760f, -0.000984f, -0.000054f, -0.000249f, +0.000695f, -0.000120f, +0.000620f, + +0.000394f, +0.000326f, +0.000683f, -0.000159f, -0.001183f, +0.000756f, +0.000456f, +0.000438f, +0.001304f, -0.000286f, + +0.001121f, +0.000456f, +0.000315f, +0.000132f, +0.000196f, -0.000111f, -0.000244f, +0.000166f, -0.000228f, +0.000348f, + -0.000182f, +0.000546f, -0.000235f, -0.000196f, +0.000164f, +0.000013f + }, + { + +0.002924f, +0.048638f, -0.024362f, +0.000163f, +0.000977f, +0.000661f, +0.004433f, -0.005964f, -0.001678f, -0.001787f, + -0.004138f, +0.003666f, +0.016647f, +0.000347f, -0.042994f, +0.004568f, -0.030548f, -0.018026f, -0.050140f, -0.000681f, + +0.009163f, +0.003089f, +0.001777f, +0.011330f, -0.006342f, +0.005097f, +0.008725f, +0.011058f, +0.005033f, -0.009537f, + +0.005684f, +0.007846f, +0.007530f, +0.000229f, +0.007697f, +0.000043f, +0.002250f, +0.006327f, -0.001126f, -0.004133f, + -0.001128f, +0.000107f, +0.001497f, +0.001178f, -0.002669f, +0.000862f, +0.002706f, +0.001074f, +0.001724f, +0.002442f, + -0.005414f, -0.002397f, +0.002675f, +0.001133f, +0.000098f, -0.000557f, -0.000623f, +0.000625f, +0.002369f, -0.000985f, + -0.005326f, +0.000425f, -0.002102f, -0.000355f, +0.001596f, +0.001465f, -0.000065f, -0.000103f, -0.001003f, -0.000729f, + -0.000352f, +0.000174f, -0.000010f, +0.000797f, -0.001489f, -0.000167f, +0.000638f, +0.000397f, +0.000090f, +0.000886f, + +0.000467f, +0.001594f, -0.000619f, -0.000146f, -0.000236f, +0.000500f, -0.000431f, +0.000562f, +0.000278f, +0.000233f, + +0.000571f, -0.000179f, +0.000553f, -0.000185f, -0.000309f, +0.000323f + }, + { + -0.064450f, -0.074002f, +0.028788f, -0.044318f, -0.005863f, -0.005211f, +0.002912f, -0.011285f, +0.002945f, +0.005654f, + +0.006759f, +0.005389f, +0.001974f, -0.014272f, +0.002973f, -0.003786f, -0.009149f, +0.012882f, +0.003397f, -0.002871f, + +0.014673f, +0.000346f, -0.001573f, -0.013262f, +0.000404f, -0.001551f, -0.002389f, -0.001960f, -0.003811f, -0.005494f, + -0.000486f, -0.003039f, -0.000068f, +0.008059f, +0.002003f, +0.000474f, -0.002453f, -0.010596f, -0.002699f, +0.003232f, + +0.002144f, -0.002036f, -0.001924f, +0.002959f, -0.008635f, -0.000064f, +0.003358f, -0.000380f, -0.001256f, +0.003185f, + -0.002205f, -0.003989f, +0.000356f, +0.001616f, -0.001168f, +0.002988f, -0.000273f, -0.000565f, -0.003266f, -0.003491f, + -0.000539f, -0.000125f, -0.000123f, +0.000012f, +0.000948f, +0.001735f, -0.001068f, -0.000603f, +0.000979f, -0.000237f, + +0.001071f, +0.000175f, +0.001000f, +0.000582f, +0.001849f, -0.000653f, -0.000521f, -0.000598f, -0.000522f, -0.001570f, + +0.000540f, +0.000026f, +0.000227f, +0.000273f, +0.000478f, +0.000300f, +0.000087f, +0.000498f, -0.000160f, -0.000797f, + +0.000168f, -0.000782f, -0.000531f, -0.000155f, +0.000313f, -0.000297f + }, + { + -0.001228f, -0.010555f, +0.006386f, +0.000404f, -0.001097f, +0.000627f, +0.000239f, -0.002141f, -0.000836f, -0.001221f, + -0.001661f, -0.004125f, -0.014061f, +0.003389f, -0.005648f, -0.010116f, -0.010091f, -0.003940f, +0.001264f, +0.020502f, + -0.000758f, +0.003710f, -0.005606f, +0.031640f, -0.009767f, +0.004242f, +0.004082f, -0.010461f, +0.008640f, -0.000550f, + +0.001173f, -0.002299f, -0.005721f, +0.007102f, -0.008660f, -0.001764f, -0.001243f, -0.004074f, +0.000537f, -0.003448f, + -0.002802f, +0.003223f, -0.000937f, +0.000712f, -0.000695f, -0.001044f, -0.002518f, -0.000626f, -0.001685f, -0.000625f, + -0.004394f, +0.000255f, +0.000855f, +0.002276f, +0.000451f, +0.001097f, +0.003231f, -0.001086f, +0.001118f, -0.000790f, + +0.001326f, -0.001387f, -0.001054f, -0.000153f, -0.000615f, +0.001259f, +0.001149f, -0.001288f, -0.001459f, -0.000988f, + +0.001033f, +0.000632f, +0.000070f, -0.000169f, -0.000403f, +0.000604f, -0.000344f, +0.000127f, +0.000066f, +0.000028f, + +0.000514f, +0.000007f, -0.000302f, +0.000073f, -0.000114f, +0.000778f, +0.000260f, +0.000539f, -0.000047f, -0.000207f, + +0.000005f, -0.000127f, -0.000760f, +0.000163f, +0.000087f, -0.000199f + }, + { + +0.063650f, -0.085687f, -0.038923f, +0.019354f, -0.001226f, +0.003770f, -0.004016f, -0.000961f, -0.009498f, +0.008580f, + +0.011471f, -0.000324f, +0.012697f, +0.024381f, -0.027093f, +0.005691f, -0.006641f, +0.006138f, -0.002825f, -0.006168f, + -0.008831f, -0.006674f, -0.000826f, -0.001078f, +0.001615f, -0.004596f, +0.003607f, +0.001183f, +0.009861f, -0.004475f, + -0.002397f, +0.003848f, -0.000411f, -0.002978f, -0.000054f, -0.000456f, -0.006998f, +0.004345f, -0.003282f, +0.002079f, + -0.002252f, +0.006285f, +0.002553f, +0.002319f, -0.003719f, +0.003615f, +0.002132f, -0.003551f, +0.005517f, +0.002432f, + -0.004506f, -0.000095f, -0.004158f, -0.001108f, -0.001147f, +0.002300f, -0.000015f, -0.001969f, +0.000831f, +0.001038f, + -0.002287f, +0.000394f, +0.000673f, -0.000234f, -0.000875f, +0.000609f, +0.001349f, -0.000078f, +0.000795f, +0.000491f, + +0.000468f, -0.000888f, +0.000383f, +0.000257f, +0.000111f, -0.000975f, +0.000129f, +0.000095f, +0.000113f, +0.000068f, + -0.000104f, -0.000115f, -0.000452f, -0.001435f, -0.000041f, -0.000074f, -0.000621f, +0.000797f, +0.000032f, -0.000408f, + -0.000168f, -0.000829f, -0.000046f, +0.000310f, -0.000171f, +0.000049f + }, + { + -0.001379f, +0.006965f, +0.003517f, -0.001453f, -0.001262f, -0.000249f, +0.003140f, +0.001869f, +0.005297f, -0.001902f, + -0.005974f, -0.006580f, +0.007861f, +0.019405f, -0.026213f, +0.013364f, +0.003266f, +0.024987f, +0.007538f, -0.010959f, + +0.005505f, -0.006753f, +0.008096f, +0.000586f, -0.005830f, +0.011357f, +0.010313f, +0.010540f, -0.003660f, -0.008015f, + +0.014913f, -0.016841f, +0.007709f, +0.001715f, -0.003086f, +0.003365f, +0.004999f, -0.004180f, -0.002912f, +0.000311f, + -0.001174f, -0.006808f, -0.002337f, +0.003070f, -0.000607f, +0.003172f, +0.003173f, +0.000245f, +0.004381f, -0.000329f, + -0.000294f, -0.002385f, +0.002167f, +0.001032f, -0.000478f, -0.003861f, +0.000601f, +0.000617f, -0.000314f, +0.000889f, + +0.000615f, +0.001533f, +0.001862f, -0.000359f, -0.001613f, -0.000758f, -0.000062f, +0.000253f, +0.000758f, +0.001179f, + +0.000348f, -0.000809f, +0.000891f, -0.000010f, +0.000338f, -0.000435f, +0.000823f, -0.000851f, +0.000658f, -0.000378f, + +0.001125f, -0.000462f, -0.000673f, -0.000059f, +0.000905f, -0.000026f, -0.000209f, +0.000502f, +0.000193f, +0.000034f, + +0.000022f, +0.000161f, -0.000062f, +0.000157f, +0.000001f, -0.000126f + }, + { + +0.028053f, -0.165567f, -0.116071f, +0.010766f, +0.038417f, +0.002690f, -0.052192f, -0.008930f, +0.000036f, -0.005836f, + -0.004540f, +0.003711f, +0.016277f, +0.009091f, +0.011288f, -0.006439f, -0.006604f, -0.002547f, +0.003595f, -0.002536f, + -0.000370f, +0.005597f, +0.000576f, +0.000221f, -0.001250f, -0.011988f, +0.003855f, -0.003475f, +0.007018f, -0.011267f, + +0.008646f, +0.003339f, -0.004897f, +0.009595f, -0.000324f, +0.001313f, +0.000233f, +0.002366f, +0.002849f, +0.005292f, + -0.006169f, +0.004694f, +0.002199f, +0.000254f, +0.000048f, -0.000865f, -0.001109f, +0.004194f, -0.003484f, +0.001413f, + -0.001544f, +0.002846f, +0.001456f, -0.000441f, +0.001221f, +0.002103f, +0.001948f, +0.001000f, +0.001964f, -0.001363f, + +0.000829f, -0.001162f, +0.002541f, -0.001382f, +0.001246f, -0.000698f, +0.000661f, +0.000025f, -0.000665f, -0.000357f, + +0.000037f, +0.001653f, +0.000486f, +0.001054f, +0.000347f, -0.001346f, -0.000281f, -0.000002f, -0.000288f, +0.000108f, + -0.000962f, +0.000575f, +0.000470f, +0.000785f, -0.000889f, -0.000399f, -0.000385f, +0.000761f, -0.000219f, +0.001229f, + -0.000075f, +0.001006f, +0.000347f, -0.000330f, -0.000130f, +0.000015f + }, + { + +0.001893f, -0.013154f, -0.030874f, -0.002760f, +0.005359f, -0.006048f, -0.000440f, -0.007192f, +0.003421f, -0.000761f, + +0.003931f, -0.008492f, +0.004250f, -0.001348f, -0.005056f, +0.002029f, +0.002063f, +0.017335f, +0.008926f, -0.005853f, + -0.017213f, +0.003767f, +0.011889f, -0.006306f, -0.000638f, +0.010695f, -0.013821f, +0.010344f, -0.011687f, -0.001663f, + +0.000619f, -0.001773f, -0.003250f, -0.005472f, -0.006288f, -0.003116f, -0.002288f, +0.000084f, -0.002083f, -0.005834f, + +0.000454f, +0.000361f, +0.002889f, +0.000315f, +0.000669f, -0.001225f, +0.002022f, -0.000418f, -0.000630f, -0.001589f, + -0.002684f, +0.001631f, +0.000691f, +0.000036f, -0.004071f, +0.001103f, -0.002845f, -0.001574f, -0.000966f, -0.002176f, + +0.000780f, -0.003197f, -0.000674f, +0.001266f, +0.000221f, +0.000440f, -0.000365f, +0.000233f, +0.000143f, -0.001613f, + +0.000268f, -0.000911f, -0.000017f, +0.000099f, +0.000420f, -0.000033f, -0.000502f, -0.000662f, +0.000371f, -0.000572f, + +0.000805f, +0.000176f, +0.000348f, +0.000024f, -0.000166f, +0.000097f, -0.000043f, +0.000029f, +0.000664f, -0.000040f, + +0.000272f, -0.000104f, -0.000128f, -0.000020f, -0.000105f, +0.000037f + }, + { + +0.038722f, +0.279686f, -0.015771f, +0.001184f, +0.001655f, +0.010539f, -0.003933f, +0.011141f, -0.002949f, -0.002359f, + -0.003388f, -0.004930f, -0.000284f, -0.011138f, -0.008015f, +0.010216f, +0.008872f, -0.000258f, +0.002541f, -0.002995f, + -0.003208f, -0.005090f, +0.000537f, +0.011642f, -0.010933f, +0.004742f, -0.003976f, -0.003378f, +0.004390f, +0.007869f, + -0.001980f, -0.003758f, -0.004289f, -0.002769f, -0.005365f, -0.008154f, +0.005287f, +0.000580f, +0.002897f, -0.002812f, + +0.004497f, -0.002396f, -0.001898f, +0.001521f, -0.002960f, +0.002626f, -0.000803f, +0.000230f, +0.002431f, +0.000044f, + -0.003170f, -0.000220f, +0.002640f, -0.001749f, -0.002046f, +0.002028f, +0.000556f, +0.001765f, -0.000323f, -0.001790f, + -0.002126f, +0.000775f, -0.002686f, -0.002150f, -0.000090f, -0.000250f, +0.000966f, +0.000136f, -0.000956f, +0.000469f, + -0.000456f, +0.000049f, +0.001023f, -0.002121f, -0.000024f, +0.001404f, +0.001835f, -0.000985f, -0.000464f, -0.000222f, + -0.001210f, -0.000147f, +0.000227f, +0.000345f, -0.000506f, -0.000168f, -0.000779f, +0.000772f, -0.000053f, -0.000436f, + +0.000115f, +0.000104f, +0.000111f, -0.000328f, +0.000269f, +0.000472f + }, + { + +0.001277f, +0.053753f, +0.009032f, -0.000061f, -0.001369f, +0.008719f, +0.006441f, +0.003694f, -0.002873f, -0.003608f, + +0.008206f, -0.003172f, +0.008329f, -0.085933f, -0.005689f, +0.005190f, +0.002203f, -0.001662f, -0.004440f, -0.003718f, + -0.001238f, +0.022078f, +0.030094f, +0.004270f, -0.011883f, +0.011261f, -0.010826f, -0.000757f, -0.006721f, +0.017526f, + -0.003310f, -0.000934f, -0.006728f, -0.007779f, +0.003067f, -0.007524f, -0.000052f, -0.003238f, +0.001241f, -0.002296f, + -0.002823f, +0.003123f, +0.001584f, -0.007119f, -0.002800f, +0.000250f, +0.004675f, +0.002328f, -0.002596f, -0.000503f, + +0.005453f, +0.002597f, +0.002253f, +0.001785f, +0.003714f, -0.001164f, -0.000599f, -0.003078f, -0.000063f, -0.001547f, + -0.001332f, +0.001765f, -0.000241f, -0.000978f, +0.002124f, -0.001073f, +0.000566f, -0.002980f, +0.001042f, -0.000962f, + +0.000219f, +0.000574f, +0.000452f, -0.000328f, -0.001739f, -0.000670f, -0.000750f, +0.000048f, +0.001501f, +0.000191f, + +0.000713f, -0.000226f, -0.001431f, -0.000648f, -0.000259f, +0.000310f, +0.000217f, +0.000041f, -0.000007f, -0.000258f, + -0.000359f, -0.000111f, +0.000405f, +0.000253f, +0.000030f, +0.000617f + }, + { + -0.013935f, +0.143209f, +0.019446f, -0.004390f, -0.010319f, +0.012958f, -0.022055f, -0.006124f, -0.002560f, +0.007094f, + +0.001369f, +0.001158f, -0.005171f, -0.023567f, +0.057970f, +0.009424f, -0.009566f, +0.003646f, +0.006784f, +0.014016f, + -0.002839f, +0.004002f, -0.004093f, +0.005287f, +0.008179f, +0.009354f, -0.002180f, +0.006404f, +0.000141f, +0.010456f, + +0.004952f, +0.003461f, +0.005482f, -0.002608f, -0.002255f, +0.001479f, -0.004256f, -0.005712f, -0.001647f, -0.002353f, + +0.003918f, -0.004187f, -0.004205f, +0.002819f, +0.004668f, +0.000039f, -0.002025f, -0.003732f, +0.000784f, +0.002317f, + -0.001702f, +0.003261f, -0.000905f, +0.002089f, -0.001865f, -0.002825f, +0.000259f, -0.000099f, +0.000020f, -0.000270f, + -0.001573f, +0.001918f, +0.000526f, +0.000138f, +0.000576f, -0.000438f, -0.001071f, +0.000634f, -0.000524f, -0.001032f, + -0.000903f, -0.001518f, -0.000826f, -0.001071f, -0.000329f, -0.000431f, -0.000800f, +0.000197f, +0.000424f, -0.000443f, + +0.000237f, +0.000336f, +0.000081f, +0.000444f, +0.000478f, +0.000101f, +0.000077f, +0.000072f, +0.000418f, +0.000195f, + +0.000172f, -0.000132f, -0.000560f, -0.000306f, +0.000053f, -0.000092f + }, + { + +0.004400f, +0.025951f, -0.006493f, -0.005622f, -0.001481f, +0.001838f, +0.007100f, +0.001990f, -0.004611f, -0.009374f, + -0.005968f, +0.000771f, -0.002717f, +0.005084f, -0.075227f, -0.003136f, -0.001231f, +0.007688f, -0.003005f, +0.014317f, + -0.005760f, +0.014912f, -0.009117f, +0.000061f, +0.000749f, -0.002795f, +0.007157f, -0.006166f, -0.011313f, -0.000261f, + +0.002115f, +0.003194f, +0.007636f, +0.003352f, -0.003060f, +0.000906f, +0.001008f, +0.002181f, -0.002263f, -0.002500f, + -0.001760f, -0.001842f, -0.001217f, -0.004720f, -0.001265f, +0.000078f, -0.001032f, +0.002325f, +0.002394f, -0.001140f, + -0.000177f, +0.003676f, +0.003839f, +0.004719f, +0.000387f, -0.000412f, -0.000059f, -0.001725f, -0.001129f, +0.001491f, + +0.002562f, +0.000144f, -0.002355f, -0.001495f, +0.000503f, +0.000653f, +0.001873f, -0.000050f, +0.001877f, -0.001907f, + -0.000108f, +0.000590f, -0.000496f, -0.000459f, +0.000607f, -0.000289f, -0.000728f, -0.000427f, -0.000116f, +0.000158f, + +0.000639f, -0.000210f, +0.000479f, -0.000361f, -0.000229f, -0.000543f, +0.000267f, +0.000324f, +0.000527f, +0.000083f, + +0.000483f, -0.000290f, +0.000421f, +0.000338f, +0.000423f, -0.000116f + } + }, + { + { + +0.010693f, +0.417234f, -0.084083f, +0.011468f, -0.016776f, -0.005790f, -0.000757f, -0.001771f, -0.014771f, +0.013472f, + -0.002242f, +0.002480f, +0.001457f, -0.002997f, +0.017699f, +0.002761f, +0.007783f, +0.014157f, -0.013047f, -0.005441f, + -0.003824f, +0.015366f, -0.007732f, +0.004552f, +0.001741f, -0.002974f, +0.009722f, -0.001777f, +0.000618f, +0.000651f, + +0.002954f, +0.004379f, -0.000727f, -0.003797f, +0.002421f, -0.002963f, +0.008597f, +0.001662f, -0.006595f, +0.000351f, + +0.000406f, -0.002653f, +0.000780f, -0.000229f, +0.000928f, -0.000753f, +0.002173f, +0.000100f, -0.003767f, +0.001579f, + -0.004505f, -0.001026f, -0.000672f, +0.005366f, -0.000540f, -0.000880f, -0.000477f, +0.002678f, +0.001519f, +0.001393f, + -0.000125f, +0.001649f, +0.001014f, -0.001737f, +0.002316f, +0.000474f, +0.000591f, +0.000577f, -0.002022f, +0.000744f, + +0.000831f, -0.000374f, +0.000317f, -0.000163f, -0.000441f, +0.000068f, +0.002402f, +0.000360f, +0.000078f, -0.000218f, + -0.000109f, +0.000744f, +0.000815f, -0.000003f, -0.000201f, +0.000923f, -0.000297f, +0.000021f, +0.001075f, +0.000458f, + -0.000091f, -0.000033f, -0.000561f, -0.000421f, +0.000131f, -0.000125f + }, + { + -0.000422f, -0.055849f, +0.031670f, +0.012747f, -0.005466f, -0.001006f, -0.004333f, +0.007294f, -0.002743f, -0.001763f, + +0.004336f, +0.003736f, -0.011321f, +0.000614f, -0.004650f, -0.009143f, +0.004016f, -0.003330f, -0.007980f, +0.009636f, + +0.005940f, +0.011093f, +0.020715f, -0.001094f, +0.007364f, -0.017258f, -0.015578f, +0.006533f, -0.005350f, +0.002104f, + +0.001896f, +0.011861f, -0.003448f, -0.001936f, +0.000197f, +0.005677f, -0.000892f, -0.002652f, -0.005731f, -0.002594f, + -0.003990f, +0.009109f, +0.000889f, -0.000501f, -0.001825f, -0.000392f, -0.001287f, -0.003305f, +0.001721f, -0.002173f, + -0.003454f, +0.000707f, -0.000993f, -0.000666f, -0.002887f, -0.000635f, +0.000558f, -0.000376f, +0.000124f, -0.000323f, + -0.000804f, +0.000439f, +0.001518f, +0.000192f, +0.000379f, +0.001025f, +0.001409f, +0.000293f, -0.001116f, -0.000064f, + -0.002320f, -0.000919f, -0.000229f, -0.000649f, -0.000435f, -0.000459f, -0.000517f, +0.001434f, -0.000167f, +0.000858f, + -0.000291f, -0.000222f, +0.000099f, +0.000478f, +0.000048f, -0.000091f, -0.000356f, +0.000289f, +0.000100f, +0.000248f, + +0.000362f, -0.000652f, -0.000070f, +0.000049f, +0.000265f, -0.000262f + }, + { + -0.000869f, -0.186049f, -0.053866f, +0.038145f, -0.006144f, +0.004282f, +0.002896f, -0.003312f, +0.002999f, -0.001364f, + -0.017618f, +0.014125f, +0.002548f, -0.002667f, -0.011035f, +0.003667f, -0.004765f, +0.009567f, -0.017263f, +0.009558f, + +0.000700f, +0.005655f, +0.001675f, -0.006028f, -0.010344f, +0.024670f, -0.011958f, -0.003007f, -0.010625f, +0.011477f, + +0.003263f, +0.004188f, +0.008949f, -0.007663f, +0.002298f, +0.007313f, -0.000073f, -0.002615f, +0.003729f, +0.006995f, + -0.000044f, +0.001580f, -0.000761f, +0.001099f, +0.000525f, -0.003799f, +0.000011f, -0.000605f, +0.000083f, -0.004042f, + +0.001530f, +0.001116f, -0.003248f, -0.000721f, -0.001480f, -0.001093f, -0.001845f, +0.000579f, +0.000475f, -0.001514f, + -0.000149f, +0.001726f, -0.000788f, -0.002000f, -0.000886f, -0.002006f, +0.000808f, -0.002029f, -0.000377f, +0.000262f, + -0.000555f, +0.000353f, -0.000179f, -0.000045f, +0.001202f, -0.000272f, +0.000363f, +0.000327f, -0.000698f, -0.000559f, + +0.001498f, +0.000278f, -0.000519f, +0.000188f, +0.000276f, -0.000172f, +0.000336f, +0.000330f, +0.000160f, +0.000350f, + -0.000065f, +0.000635f, +0.000430f, -0.000433f, +0.000117f, +0.000104f + }, + { + +0.071114f, -0.124693f, -0.006001f, +0.036646f, -0.002488f, +0.003173f, -0.005521f, +0.002390f, -0.003078f, -0.002212f, + -0.008246f, -0.000733f, +0.005196f, -0.008469f, +0.015268f, +0.003972f, -0.002154f, -0.004919f, -0.004118f, +0.002314f, + -0.003255f, +0.005741f, -0.001430f, +0.006056f, +0.005664f, +0.002215f, -0.001310f, +0.001998f, +0.001040f, +0.001495f, + +0.000070f, +0.004010f, +0.002891f, -0.004530f, -0.005162f, -0.002197f, -0.002599f, -0.005268f, -0.002143f, -0.002094f, + +0.000980f, +0.001272f, +0.000608f, -0.002786f, -0.003093f, -0.000871f, -0.001163f, +0.003399f, -0.000547f, +0.002622f, + -0.001382f, -0.000828f, +0.000645f, +0.000372f, -0.001067f, +0.001722f, -0.000681f, -0.003386f, +0.002206f, -0.002481f, + -0.000080f, +0.001286f, -0.000174f, +0.002097f, -0.000894f, -0.000275f, -0.000329f, -0.000421f, +0.000186f, +0.001241f, + -0.000012f, +0.000066f, +0.001191f, +0.000380f, -0.001140f, +0.000338f, +0.000077f, +0.000090f, +0.001111f, -0.000230f, + +0.000127f, -0.000100f, +0.000018f, -0.000205f, -0.000278f, +0.000063f, -0.000067f, +0.000255f, -0.000024f, +0.000200f, + +0.000077f, +0.000539f, -0.000058f, -0.000058f, +0.000147f, +0.000297f + }, + { + -0.001724f, +0.072241f, -0.002019f, +0.002009f, +0.000569f, -0.000085f, +0.002608f, -0.003809f, -0.000488f, -0.000346f, + +0.003677f, +0.005006f, +0.010525f, -0.009602f, -0.036334f, +0.038902f, +0.005993f, +0.040962f, -0.001749f, +0.013617f, + +0.008869f, +0.005417f, +0.002759f, +0.010783f, -0.001191f, +0.003119f, -0.002969f, -0.005653f, -0.001600f, -0.012331f, + +0.008485f, +0.002983f, +0.007324f, +0.000031f, +0.002280f, -0.000985f, -0.003561f, -0.004112f, +0.002441f, +0.000916f, + -0.000608f, +0.001122f, +0.001816f, +0.001103f, -0.002362f, -0.001983f, +0.003146f, +0.001241f, -0.000713f, +0.001801f, + -0.004099f, -0.000918f, +0.001671f, -0.000894f, -0.001490f, -0.000828f, -0.003077f, -0.001401f, +0.000970f, -0.000786f, + -0.003568f, +0.000730f, -0.002717f, -0.000202f, +0.000336f, -0.001138f, -0.000250f, +0.001444f, -0.000340f, -0.001023f, + -0.000524f, -0.000027f, +0.000558f, +0.000977f, -0.001788f, -0.000858f, +0.000243f, +0.000914f, -0.000160f, -0.000272f, + -0.000730f, +0.000913f, -0.000335f, -0.000042f, -0.000541f, +0.000785f, -0.000198f, +0.000133f, +0.000335f, +0.000192f, + +0.000207f, -0.000439f, +0.000368f, -0.000082f, +0.000049f, +0.000533f + }, + { + +0.092145f, +0.051207f, -0.027686f, -0.020332f, +0.003283f, -0.000172f, +0.003793f, -0.013550f, +0.002631f, -0.004307f, + -0.008396f, -0.002064f, -0.002437f, -0.003734f, +0.006708f, -0.001749f, -0.004681f, +0.012452f, +0.002145f, -0.001190f, + +0.007336f, -0.004036f, +0.001604f, -0.003966f, +0.007714f, +0.002013f, +0.003449f, -0.002129f, -0.006808f, -0.006843f, + -0.002906f, +0.002461f, +0.005846f, +0.001806f, -0.000126f, +0.002183f, +0.000918f, -0.007054f, -0.003824f, +0.002387f, + +0.002425f, -0.002832f, -0.001882f, +0.002329f, -0.004834f, +0.002605f, +0.005594f, +0.001583f, -0.000132f, +0.003672f, + -0.003512f, -0.002409f, +0.001347f, +0.001388f, -0.002359f, +0.000737f, -0.000212f, +0.001055f, +0.000518f, +0.000562f, + -0.000069f, -0.000923f, -0.000442f, -0.000139f, -0.000083f, +0.001051f, -0.000640f, -0.001118f, +0.000491f, -0.000960f, + -0.000297f, -0.000516f, +0.001213f, -0.000169f, +0.000577f, -0.000908f, +0.000098f, +0.000897f, +0.000135f, -0.001737f, + +0.000606f, -0.000400f, +0.000242f, +0.000373f, +0.000293f, +0.000106f, -0.000139f, +0.000460f, -0.000331f, -0.000117f, + +0.000831f, -0.000350f, -0.000105f, +0.000151f, +0.000571f, -0.000005f + }, + { + -0.000069f, -0.013599f, -0.001087f, -0.001516f, -0.001591f, +0.000105f, +0.000150f, -0.003555f, -0.000852f, +0.001043f, + -0.003318f, -0.006830f, -0.006443f, +0.012502f, -0.002486f, -0.000283f, -0.001554f, +0.005674f, -0.001827f, +0.016282f, + -0.001186f, -0.002796f, -0.007580f, +0.034419f, -0.011125f, +0.004381f, +0.005367f, -0.012086f, +0.011744f, +0.002373f, + +0.002841f, +0.001239f, -0.011456f, +0.008563f, -0.004664f, -0.005902f, -0.002110f, +0.000056f, +0.006539f, +0.000921f, + -0.001750f, +0.001893f, -0.003037f, +0.000340f, +0.000129f, -0.001324f, -0.002837f, +0.000410f, +0.000004f, +0.001083f, + -0.003750f, +0.001398f, -0.000524f, -0.000565f, +0.000176f, +0.000934f, +0.001363f, -0.002083f, +0.004374f, +0.000962f, + +0.003372f, +0.001742f, +0.000857f, +0.000408f, +0.000336f, +0.001370f, +0.000913f, -0.001092f, -0.001927f, -0.000485f, + +0.001508f, +0.000349f, -0.000021f, +0.001548f, +0.001354f, +0.000424f, -0.000241f, -0.000059f, -0.000721f, -0.000035f, + +0.000700f, -0.000042f, -0.000198f, +0.000437f, +0.000099f, +0.000258f, -0.000539f, +0.000298f, -0.000243f, -0.000355f, + +0.000067f, +0.000169f, -0.000493f, -0.000356f, -0.000171f, -0.000051f + }, + { + -0.075211f, -0.168596f, +0.038119f, +0.017023f, +0.001196f, -0.000618f, -0.008687f, +0.004592f, -0.005076f, +0.002083f, + +0.005863f, -0.010433f, +0.007581f, +0.020139f, -0.042272f, -0.000840f, -0.009538f, +0.004074f, +0.002592f, +0.006572f, + +0.000676f, -0.009180f, -0.004481f, +0.003096f, +0.003141f, -0.003959f, +0.001075f, -0.001834f, +0.008974f, -0.005881f, + -0.000169f, +0.008999f, +0.005021f, -0.004512f, -0.003618f, -0.001506f, -0.003158f, +0.005957f, -0.009497f, -0.002370f, + -0.002386f, +0.004899f, +0.000121f, -0.001056f, -0.001779f, +0.002519f, -0.000043f, -0.002148f, +0.007682f, +0.004441f, + -0.002023f, -0.001969f, -0.001901f, +0.001816f, -0.000275f, +0.004619f, +0.000724f, -0.000735f, +0.000317f, -0.000269f, + -0.001480f, +0.000151f, -0.000163f, -0.000588f, -0.000274f, +0.000977f, +0.000704f, -0.000433f, +0.000885f, +0.000093f, + -0.000254f, -0.000405f, +0.000846f, +0.000368f, +0.000349f, -0.000728f, +0.000372f, -0.000152f, +0.000341f, +0.000997f, + +0.000493f, +0.000383f, +0.000378f, -0.000361f, -0.000278f, +0.000092f, -0.000384f, +0.000359f, +0.000051f, -0.000019f, + +0.000132f, -0.000662f, +0.000073f, +0.000383f, -0.000147f, -0.000494f + }, + { + -0.000538f, +0.004825f, -0.009191f, -0.002141f, -0.001181f, -0.000743f, +0.000014f, -0.005674f, -0.001756f, -0.000474f, + -0.004604f, -0.004443f, +0.004381f, +0.007807f, -0.032270f, +0.012144f, -0.021368f, +0.011596f, +0.008269f, -0.015778f, + +0.004388f, -0.008439f, +0.009414f, +0.001745f, -0.011788f, +0.012087f, +0.002782f, -0.000067f, +0.001831f, -0.006443f, + +0.009155f, -0.016034f, +0.008863f, -0.000258f, -0.005443f, -0.001300f, +0.005806f, -0.000114f, -0.000191f, -0.000054f, + -0.003845f, -0.004421f, -0.000013f, +0.001847f, +0.000154f, +0.002111f, -0.000023f, -0.004197f, +0.003241f, +0.002221f, + -0.000944f, -0.000781f, +0.002290f, -0.001274f, -0.000449f, -0.000489f, +0.000682f, +0.001721f, +0.000597f, -0.002787f, + -0.003120f, +0.000690f, +0.001537f, -0.000800f, -0.000100f, +0.001022f, +0.000492f, +0.000938f, +0.001247f, +0.000927f, + +0.000268f, -0.000977f, +0.000437f, +0.000342f, +0.000702f, -0.000700f, +0.000254f, -0.001156f, +0.000845f, +0.000045f, + +0.000652f, -0.000358f, +0.000429f, +0.000156f, +0.000202f, -0.000463f, -0.000263f, -0.000134f, -0.000422f, +0.000046f, + -0.000041f, +0.000017f, +0.000173f, +0.000242f, +0.000300f, +0.000099f + }, + { + -0.029155f, -0.061565f, +0.031403f, -0.001710f, +0.014235f, +0.008423f, -0.013697f, +0.003923f, -0.002204f, -0.007962f, + +0.000209f, +0.000288f, -0.002551f, -0.004224f, -0.005171f, -0.011178f, -0.000287f, -0.010612f, +0.007047f, +0.005207f, + -0.008779f, -0.007273f, +0.000066f, +0.001633f, +0.005712f, -0.001923f, +0.008853f, -0.005085f, +0.004596f, -0.009405f, + +0.005442f, +0.002829f, -0.002424f, +0.004889f, -0.005235f, -0.007306f, -0.006480f, -0.002233f, +0.003422f, +0.009357f, + -0.007490f, +0.005756f, +0.001028f, -0.000464f, -0.002452f, -0.005421f, -0.002904f, +0.004212f, -0.003637f, -0.001840f, + -0.003353f, -0.000640f, -0.000149f, +0.001008f, +0.001781f, -0.000881f, +0.000012f, +0.001595f, +0.000645f, -0.001958f, + +0.002516f, -0.002758f, +0.002807f, -0.000629f, -0.001304f, -0.000358f, +0.002342f, -0.000523f, -0.000037f, +0.000051f, + -0.000453f, +0.001747f, -0.000171f, -0.000701f, +0.000056f, -0.000014f, +0.001021f, +0.000095f, -0.000351f, +0.000052f, + -0.000720f, +0.000462f, +0.000432f, +0.000415f, -0.000265f, -0.000102f, -0.000387f, +0.000495f, -0.000275f, +0.001157f, + -0.000249f, +0.000378f, -0.000286f, -0.000232f, +0.000382f, +0.000423f + }, + { + -0.001619f, +0.020448f, +0.004930f, +0.000148f, +0.005673f, -0.001176f, +0.002618f, -0.001956f, +0.003037f, -0.003181f, + +0.004278f, -0.004395f, +0.006802f, -0.005561f, -0.006936f, -0.001280f, -0.008678f, +0.006067f, +0.006191f, +0.006302f, + +0.005226f, +0.007645f, +0.016285f, +0.005101f, +0.004039f, +0.008985f, -0.009851f, +0.017795f, -0.003644f, +0.003260f, + -0.002076f, +0.006385f, +0.003443f, -0.000797f, +0.001500f, +0.001879f, +0.003358f, +0.001501f, +0.001615f, +0.000240f, + +0.001040f, -0.002474f, -0.000044f, -0.001648f, +0.000338f, -0.001351f, +0.002705f, -0.000304f, +0.001095f, +0.000277f, + -0.001654f, +0.000771f, -0.001369f, +0.001990f, +0.000621f, +0.002404f, -0.002472f, +0.000976f, +0.001735f, +0.000256f, + +0.003094f, -0.001788f, +0.000286f, +0.001374f, -0.000224f, -0.000590f, -0.000212f, +0.000104f, -0.000263f, -0.001095f, + +0.000045f, -0.001387f, -0.000097f, -0.000479f, -0.000137f, -0.000461f, +0.000108f, -0.000462f, +0.000768f, -0.000333f, + +0.000370f, -0.000473f, -0.000053f, +0.000138f, +0.000395f, +0.000391f, +0.000073f, -0.000170f, +0.000299f, -0.000157f, + +0.000099f, -0.000113f, -0.000038f, +0.000111f, +0.000064f, -0.000048f + }, + { + -0.061816f, +0.159821f, -0.003286f, -0.008603f, +0.002502f, +0.007643f, -0.007727f, +0.008039f, +0.004715f, +0.007108f, + -0.000720f, +0.004682f, +0.011955f, +0.013410f, -0.000001f, +0.004968f, +0.008708f, +0.002181f, +0.005803f, -0.004137f, + +0.010844f, +0.001076f, -0.003446f, +0.014624f, -0.003246f, +0.001585f, -0.005146f, -0.004632f, +0.000011f, +0.003188f, + +0.000322f, -0.001154f, -0.000010f, +0.004175f, +0.001400f, -0.003860f, +0.005615f, -0.001712f, +0.000002f, -0.004355f, + +0.002993f, -0.002715f, +0.002064f, +0.007756f, -0.001780f, +0.001674f, -0.002099f, +0.000192f, +0.002116f, +0.000630f, + -0.002099f, -0.002235f, +0.000753f, -0.002004f, +0.000360f, +0.001397f, -0.000271f, +0.000748f, -0.001408f, -0.002452f, + -0.001376f, +0.001940f, -0.001648f, -0.000135f, +0.000441f, -0.000546f, +0.000425f, +0.000370f, -0.000167f, +0.000172f, + -0.001338f, -0.000394f, +0.000908f, -0.000839f, +0.000242f, -0.000643f, +0.000684f, -0.001158f, +0.000271f, +0.000813f, + +0.000225f, +0.000210f, -0.000496f, +0.000135f, -0.000088f, -0.000210f, -0.000668f, +0.000536f, +0.000171f, +0.000097f, + -0.000255f, -0.000216f, +0.000162f, -0.000188f, -0.000071f, +0.000104f + }, + { + -0.000234f, +0.034893f, -0.000997f, +0.001350f, -0.002449f, +0.004710f, -0.006066f, +0.000756f, -0.001464f, -0.002575f, + +0.006268f, -0.002501f, +0.023470f, -0.062505f, +0.006399f, +0.005745f, +0.004871f, -0.000659f, -0.005866f, -0.018509f, + -0.005788f, +0.030061f, +0.001265f, -0.008062f, -0.000657f, +0.012677f, -0.007605f, +0.006187f, -0.003523f, +0.017577f, + -0.001852f, +0.004233f, +0.000164f, +0.001973f, +0.004287f, -0.007815f, +0.003001f, -0.005705f, -0.003284f, -0.001648f, + -0.002039f, +0.001721f, +0.003669f, -0.003255f, +0.000321f, -0.001018f, +0.003282f, +0.002258f, -0.004637f, -0.004291f, + +0.003086f, -0.000081f, -0.000818f, -0.000240f, +0.002251f, -0.000530f, +0.001597f, -0.000122f, +0.000653f, -0.000721f, + -0.000700f, +0.001745f, -0.000917f, -0.002205f, +0.000805f, -0.002099f, +0.000913f, -0.001640f, +0.003057f, +0.000184f, + -0.000029f, -0.000910f, -0.000078f, +0.000266f, -0.000554f, +0.000107f, -0.000152f, +0.000283f, +0.000873f, -0.000507f, + +0.000319f, -0.000194f, -0.000309f, +0.000002f, -0.000155f, -0.000251f, -0.000490f, -0.001079f, -0.000686f, -0.000125f, + -0.000273f, +0.000083f, +0.000319f, -0.000263f, -0.000032f, +0.000540f + }, + { + -0.014161f, +0.130087f, +0.001197f, -0.005322f, -0.001610f, +0.018704f, -0.011680f, +0.010633f, +0.009454f, +0.000769f, + +0.003108f, +0.006764f, -0.003401f, +0.000634f, +0.085526f, +0.000089f, -0.017799f, -0.004576f, -0.005936f, +0.005026f, + -0.004047f, +0.002201f, -0.002836f, +0.005637f, +0.001535f, +0.005407f, -0.007005f, +0.007636f, -0.000621f, +0.002997f, + +0.001690f, +0.002793f, +0.005328f, -0.001031f, +0.001602f, +0.001311f, -0.003175f, -0.000743f, +0.004853f, +0.000254f, + +0.002869f, -0.000621f, -0.004463f, -0.002386f, +0.004156f, +0.000855f, -0.000465f, -0.001612f, -0.000095f, +0.004315f, + -0.002744f, +0.003515f, +0.003066f, +0.006789f, +0.000203f, -0.001563f, +0.001301f, +0.000189f, +0.000353f, +0.001268f, + -0.001079f, +0.000363f, -0.001419f, -0.000581f, +0.001496f, +0.000301f, -0.000192f, +0.000943f, +0.000109f, -0.000809f, + +0.001128f, -0.000751f, -0.000656f, -0.000823f, -0.000327f, +0.000561f, +0.000600f, +0.000682f, +0.000426f, -0.000197f, + -0.000128f, -0.000511f, -0.000393f, +0.000228f, +0.000107f, -0.000436f, +0.000251f, -0.000160f, -0.000242f, -0.000472f, + -0.000334f, -0.000139f, -0.000294f, -0.000393f, -0.000009f, +0.000376f + }, + { + -0.003171f, +0.014195f, -0.005233f, -0.005022f, -0.001153f, +0.001846f, +0.002070f, +0.000546f, +0.004625f, -0.003970f, + -0.001375f, +0.003485f, +0.001004f, +0.042845f, -0.028247f, -0.008908f, -0.012505f, +0.006602f, -0.000482f, +0.010423f, + -0.015297f, +0.000675f, -0.010626f, +0.005997f, +0.008879f, -0.004220f, -0.006314f, -0.005571f, -0.000605f, +0.005960f, + +0.004807f, +0.001926f, -0.001866f, -0.001319f, -0.005016f, +0.000027f, -0.001421f, -0.003605f, -0.001993f, +0.001165f, + -0.000002f, +0.000474f, +0.002791f, -0.003961f, +0.000403f, +0.002492f, +0.000565f, -0.000173f, +0.000479f, -0.000437f, + +0.000072f, +0.001745f, +0.000746f, +0.001706f, -0.001904f, -0.001028f, -0.000920f, -0.001349f, +0.000395f, +0.000151f, + -0.000821f, +0.001160f, +0.000702f, -0.001534f, -0.000660f, -0.000490f, +0.000865f, +0.000702f, +0.001597f, -0.001175f, + +0.001481f, +0.000553f, -0.000493f, +0.000241f, +0.001669f, -0.000080f, -0.000186f, -0.000034f, -0.000332f, -0.000076f, + +0.000247f, -0.000903f, -0.000037f, +0.000117f, +0.000475f, -0.000315f, -0.000192f, -0.000070f, -0.000132f, -0.000126f, + +0.000290f, -0.000641f, +0.000413f, -0.000228f, -0.000465f, -0.000374f + } + }, + { + { + -0.013356f, +0.316179f, +0.068555f, -0.020471f, -0.005130f, -0.000560f, -0.004401f, -0.002500f, -0.004026f, +0.010125f, + -0.001250f, -0.001436f, +0.004184f, +0.001719f, -0.003776f, +0.023143f, -0.005973f, +0.008432f, +0.006506f, -0.014236f, + +0.008750f, +0.002630f, +0.004989f, -0.013907f, +0.007494f, +0.003718f, +0.004746f, -0.002490f, -0.000203f, +0.000979f, + +0.007816f, +0.000020f, -0.007067f, -0.003101f, +0.005257f, +0.001265f, +0.003637f, -0.000703f, -0.002474f, -0.001294f, + +0.003740f, +0.002590f, -0.006906f, +0.003375f, -0.001387f, +0.000331f, +0.000958f, +0.001463f, -0.003164f, -0.001575f, + -0.001518f, -0.001629f, +0.000787f, +0.001539f, +0.002253f, -0.001870f, -0.000208f, +0.002925f, +0.003447f, -0.000912f, + +0.001053f, +0.001628f, +0.000033f, +0.000276f, +0.001109f, +0.000487f, +0.000423f, -0.000092f, -0.000240f, -0.000591f, + +0.000869f, +0.000095f, -0.000309f, +0.000158f, -0.000667f, +0.001609f, +0.001446f, +0.001203f, -0.000399f, -0.000239f, + -0.000214f, +0.000117f, +0.001295f, -0.000023f, +0.000060f, +0.000189f, -0.000014f, +0.000465f, +0.000484f, +0.000525f, + +0.000041f, -0.000664f, -0.000013f, -0.000365f, -0.000119f, +0.000027f + }, + { + -0.000893f, +0.048678f, -0.040643f, +0.001993f, -0.004704f, -0.002185f, -0.002055f, +0.003764f, -0.000508f, +0.001233f, + +0.006796f, +0.000004f, -0.004395f, +0.001049f, -0.011421f, -0.000010f, -0.000753f, -0.012851f, +0.018962f, -0.003410f, + +0.008059f, +0.020065f, +0.007876f, -0.002719f, +0.002894f, -0.003325f, -0.009513f, +0.003496f, -0.006714f, -0.006871f, + +0.005770f, +0.012441f, -0.002487f, -0.002550f, -0.004140f, +0.000787f, +0.001567f, -0.001270f, -0.004678f, -0.000066f, + -0.003281f, +0.005625f, +0.001757f, +0.002426f, -0.003590f, -0.005360f, +0.000272f, +0.000950f, -0.001381f, -0.002431f, + -0.001456f, -0.000192f, -0.000253f, -0.001728f, -0.002543f, +0.000932f, -0.001609f, +0.001607f, +0.001325f, -0.001287f, + -0.002150f, +0.001238f, +0.000226f, +0.001329f, -0.000491f, +0.001088f, +0.000544f, +0.001188f, -0.000767f, -0.000676f, + -0.001826f, -0.001344f, -0.000238f, -0.000145f, -0.001400f, -0.000015f, +0.000732f, -0.000153f, +0.001021f, +0.000165f, + -0.000192f, -0.000070f, +0.000422f, -0.000471f, +0.000343f, -0.000056f, -0.001043f, +0.000351f, +0.000428f, +0.000097f, + +0.000465f, -0.000262f, -0.000582f, +0.000274f, -0.000228f, +0.000206f + }, + { + +0.002897f, -0.271262f, +0.008285f, +0.018221f, +0.008144f, +0.005021f, -0.002042f, +0.000702f, +0.000723f, +0.000729f, + -0.008157f, -0.001472f, +0.008523f, -0.004144f, +0.009299f, -0.009425f, -0.005638f, -0.000152f, -0.007636f, +0.003349f, + +0.013395f, -0.006545f, -0.005167f, -0.004206f, -0.003323f, +0.008750f, -0.010160f, -0.005350f, -0.000691f, +0.006550f, + +0.002771f, +0.012192f, -0.000362f, -0.004941f, +0.010050f, +0.004316f, +0.001681f, -0.000199f, +0.000699f, +0.007312f, + +0.000478f, -0.001350f, +0.001694f, +0.002437f, -0.002517f, -0.002714f, -0.000596f, +0.000412f, -0.001260f, -0.001037f, + +0.001151f, -0.001115f, -0.001109f, -0.001364f, -0.001172f, +0.000040f, -0.002893f, -0.001939f, +0.001544f, -0.000195f, + -0.001014f, +0.000780f, +0.000473f, -0.001859f, -0.000842f, -0.001380f, +0.000570f, -0.001939f, +0.000072f, -0.000135f, + -0.000569f, -0.000336f, +0.000061f, +0.000923f, +0.000751f, -0.000051f, -0.000653f, +0.000937f, -0.000987f, -0.000424f, + +0.001001f, +0.000626f, -0.000330f, -0.000132f, +0.000551f, -0.000273f, -0.000228f, +0.000289f, +0.000052f, +0.000377f, + +0.000295f, +0.000752f, +0.000352f, -0.000078f, -0.000066f, -0.000119f + }, + { + -0.074778f, +0.051907f, +0.007172f, +0.034432f, +0.001284f, -0.003475f, +0.001177f, +0.004756f, -0.000982f, -0.007209f, + -0.006131f, -0.005217f, +0.004212f, -0.005147f, +0.015456f, +0.003022f, -0.001058f, +0.000383f, -0.004424f, -0.001002f, + -0.001262f, -0.000129f, +0.001741f, +0.002408f, +0.006321f, +0.001420f, -0.000560f, -0.000562f, +0.001224f, -0.004160f, + +0.004216f, +0.002699f, +0.002051f, -0.002290f, -0.004130f, -0.005370f, -0.002396f, -0.004297f, -0.002533f, -0.001582f, + +0.000683f, +0.000955f, +0.000121f, -0.004063f, -0.003172f, -0.000542f, +0.000368f, +0.001856f, +0.000221f, +0.000974f, + +0.000602f, +0.001725f, -0.002160f, +0.000239f, +0.000349f, -0.000828f, -0.000039f, -0.001404f, -0.001486f, +0.001503f, + -0.001972f, -0.000278f, +0.001181f, +0.002105f, -0.000915f, -0.000515f, -0.000279f, -0.000506f, +0.001046f, +0.000503f, + +0.000118f, -0.000005f, +0.000813f, +0.000482f, -0.001039f, +0.000137f, -0.000483f, +0.000646f, +0.000077f, +0.000372f, + -0.000417f, -0.000448f, +0.000071f, +0.000253f, -0.000442f, +0.000145f, +0.000190f, +0.000082f, +0.000116f, +0.000086f, + +0.000221f, +0.000182f, -0.000087f, +0.000165f, -0.000113f, +0.000400f + }, + { + +0.000805f, +0.069203f, +0.002078f, +0.001785f, -0.002145f, +0.002570f, -0.000150f, -0.001275f, -0.001713f, +0.001902f, + -0.001802f, +0.010261f, +0.002030f, +0.005475f, -0.021241f, +0.009956f, +0.001667f, +0.016643f, +0.053028f, +0.009560f, + +0.019990f, -0.005740f, -0.000428f, +0.013540f, +0.005826f, -0.004499f, -0.001718f, -0.012684f, -0.002974f, -0.005542f, + +0.002613f, +0.003107f, -0.000417f, +0.009044f, -0.000859f, -0.004175f, +0.001883f, -0.006092f, +0.000037f, -0.000389f, + +0.000651f, -0.000048f, +0.001775f, -0.001272f, +0.001221f, -0.001822f, +0.001609f, +0.000337f, +0.000160f, -0.001071f, + -0.000154f, +0.001830f, -0.001558f, -0.001286f, -0.001922f, +0.001348f, -0.004232f, -0.002386f, -0.000598f, +0.000621f, + -0.002133f, -0.000659f, -0.001117f, -0.001004f, -0.000384f, -0.001377f, -0.000100f, +0.000612f, +0.000384f, -0.000841f, + -0.000238f, +0.000316f, +0.000311f, +0.000417f, -0.000418f, -0.001538f, -0.000000f, +0.000775f, -0.000559f, -0.000748f, + -0.000061f, +0.000037f, -0.000061f, +0.000054f, -0.000087f, +0.000288f, -0.000107f, +0.000092f, -0.000039f, +0.000440f, + -0.000146f, -0.000380f, +0.000399f, +0.000277f, -0.000127f, +0.000105f + }, + { + -0.091792f, +0.256231f, +0.004478f, -0.000467f, -0.009904f, +0.003182f, -0.005938f, -0.002510f, +0.000430f, -0.001584f, + -0.007633f, -0.005734f, -0.008547f, +0.001839f, +0.003469f, -0.002775f, +0.003025f, +0.003472f, +0.002990f, -0.001684f, + -0.001874f, +0.004554f, +0.001102f, +0.002421f, +0.002769f, +0.003102f, +0.001147f, +0.002919f, -0.007360f, -0.008423f, + -0.003509f, +0.007773f, +0.006718f, -0.003667f, +0.003817f, -0.001486f, +0.002834f, -0.006735f, -0.001878f, +0.001718f, + -0.000469f, +0.003272f, -0.000442f, -0.002835f, +0.000966f, +0.000617f, +0.003735f, +0.000038f, +0.001016f, +0.001377f, + +0.000890f, -0.002070f, -0.000640f, +0.002033f, -0.001420f, -0.001061f, -0.001127f, +0.000693f, +0.001352f, +0.001468f, + +0.000141f, -0.001272f, -0.000968f, +0.000321f, +0.000033f, -0.000558f, +0.000215f, -0.000531f, -0.000169f, -0.000499f, + -0.001085f, +0.000692f, -0.000253f, +0.000325f, +0.000440f, -0.000937f, +0.000252f, +0.000511f, +0.000613f, -0.000579f, + +0.000095f, -0.000471f, +0.000281f, +0.000195f, +0.000425f, -0.000101f, +0.000368f, -0.000491f, -0.000071f, +0.000378f, + +0.000441f, -0.000022f, -0.000002f, +0.000344f, +0.000219f, +0.000173f + }, + { + +0.000844f, -0.018051f, -0.000965f, -0.001884f, -0.000168f, -0.000046f, -0.000410f, -0.002969f, -0.000405f, -0.001415f, + -0.002031f, -0.005921f, -0.003298f, +0.019431f, -0.015329f, +0.006854f, +0.003056f, +0.006883f, +0.006772f, -0.009555f, + +0.007625f, +0.003480f, -0.000035f, +0.018059f, -0.007693f, +0.000959f, -0.001978f, +0.003881f, +0.004742f, +0.006212f, + -0.001447f, +0.004524f, -0.002560f, -0.001492f, -0.002443f, -0.004830f, +0.002534f, -0.001588f, +0.006081f, +0.000081f, + +0.000309f, -0.000984f, -0.000757f, +0.000027f, +0.000311f, +0.001308f, -0.003089f, -0.000871f, +0.001168f, +0.000091f, + -0.002144f, -0.001261f, -0.000200f, +0.001174f, -0.000763f, +0.000670f, -0.000363f, -0.001026f, +0.002611f, +0.001627f, + +0.003356f, +0.001984f, +0.001754f, -0.000399f, +0.001041f, +0.000827f, -0.000125f, -0.000949f, -0.001461f, +0.000321f, + +0.000809f, +0.000315f, +0.000295f, +0.000784f, +0.001536f, +0.000507f, -0.000153f, -0.000716f, -0.000767f, +0.000539f, + -0.000022f, +0.000552f, +0.000130f, +0.000383f, +0.000007f, -0.000171f, -0.000627f, +0.000356f, -0.000074f, -0.000140f, + +0.000427f, +0.000092f, -0.000329f, -0.000366f, +0.000056f, -0.000218f + }, + { + +0.070067f, -0.285547f, -0.025016f, +0.021137f, -0.002741f, -0.005063f, -0.001068f, -0.001735f, +0.000649f, -0.004463f, + -0.000840f, +0.001538f, +0.001311f, -0.005369f, -0.017121f, +0.001658f, -0.006070f, +0.003262f, +0.005095f, +0.000661f, + +0.005887f, -0.004502f, -0.007702f, +0.004631f, +0.003968f, -0.007201f, +0.001336f, -0.002785f, +0.005361f, -0.002432f, + +0.003496f, +0.004764f, +0.005319f, -0.004630f, -0.001632f, +0.000919f, -0.000913f, -0.000454f, -0.007336f, -0.003966f, + +0.003518f, -0.002472f, -0.000417f, -0.000949f, +0.003157f, +0.003262f, -0.004126f, +0.001777f, +0.003924f, +0.001220f, + +0.002289f, -0.002443f, -0.001873f, +0.000765f, -0.000215f, +0.004224f, -0.000004f, +0.001684f, +0.000555f, -0.001879f, + -0.000527f, -0.000659f, -0.000134f, -0.000004f, -0.001158f, +0.001492f, -0.000166f, -0.000250f, +0.000535f, +0.000588f, + -0.000365f, -0.000376f, -0.000010f, +0.000267f, -0.000242f, +0.000295f, -0.000274f, -0.000280f, +0.000742f, +0.000096f, + +0.000640f, +0.001252f, +0.000061f, -0.000355f, -0.000499f, +0.000284f, +0.000001f, -0.000073f, +0.000219f, +0.000035f, + +0.000054f, -0.000140f, +0.000176f, -0.000262f, +0.000215f, -0.000462f + }, + { + +0.001540f, -0.011513f, -0.003371f, +0.000971f, -0.001697f, -0.000419f, +0.000227f, -0.004532f, -0.006099f, -0.000472f, + -0.002722f, -0.002531f, +0.000937f, +0.003595f, -0.028389f, +0.018299f, -0.008742f, -0.008374f, +0.007530f, -0.006419f, + -0.012988f, -0.003513f, +0.009799f, -0.013419f, +0.007166f, +0.013477f, -0.010025f, -0.000564f, +0.011362f, -0.010831f, + -0.001867f, +0.002393f, -0.001071f, -0.007754f, +0.001094f, +0.000476f, +0.003296f, -0.001399f, +0.002193f, +0.000616f, + -0.003330f, +0.000503f, -0.003935f, -0.001291f, +0.002089f, -0.001686f, +0.002335f, -0.000507f, -0.001499f, +0.002845f, + -0.002667f, +0.003687f, -0.001179f, -0.000338f, -0.000095f, +0.000319f, +0.000479f, +0.001824f, +0.001518f, -0.004119f, + -0.002920f, +0.001950f, +0.000247f, +0.000542f, +0.000376f, -0.000214f, +0.001336f, +0.000892f, +0.001842f, -0.000548f, + +0.000808f, -0.000350f, -0.000608f, +0.000542f, -0.000185f, +0.000332f, -0.000760f, -0.000602f, +0.000439f, +0.000221f, + -0.000082f, +0.000611f, +0.000307f, +0.000635f, +0.000071f, -0.001173f, +0.000027f, -0.000187f, -0.000311f, -0.000126f, + -0.000092f, +0.000019f, +0.000060f, +0.000288f, +0.000381f, +0.000193f + }, + { + +0.029740f, -0.030563f, -0.022840f, -0.007689f, +0.001406f, -0.009482f, +0.010669f, -0.000676f, +0.001020f, -0.007602f, + -0.005119f, -0.001443f, -0.004907f, +0.000429f, -0.005801f, -0.006288f, +0.004720f, -0.014106f, +0.006109f, +0.000399f, + -0.005895f, -0.010357f, +0.006068f, -0.005126f, +0.005105f, +0.003925f, +0.003825f, -0.001142f, -0.002295f, -0.004441f, + -0.005513f, +0.005280f, +0.008225f, -0.006496f, +0.001935f, -0.008641f, -0.004829f, -0.006298f, +0.004149f, +0.004384f, + +0.002084f, +0.000421f, +0.002377f, -0.000331f, -0.004224f, -0.003237f, -0.002415f, +0.002822f, -0.001588f, -0.004736f, + -0.001037f, -0.003119f, -0.001902f, +0.000394f, +0.004787f, -0.001718f, -0.001043f, +0.001747f, +0.000513f, -0.000322f, + +0.000819f, -0.001198f, -0.000107f, +0.001070f, -0.002594f, +0.001128f, +0.001305f, -0.000636f, +0.000685f, -0.000217f, + -0.000926f, +0.001162f, +0.000137f, -0.000194f, -0.000752f, +0.000334f, +0.001081f, +0.000057f, -0.000317f, -0.000389f, + +0.000005f, +0.000050f, +0.000933f, -0.000321f, +0.000299f, -0.001089f, -0.000287f, +0.000197f, +0.000333f, +0.000309f, + +0.000469f, -0.000181f, -0.000364f, +0.000188f, +0.000398f, +0.000069f + }, + { + +0.001294f, +0.048200f, -0.010075f, -0.000379f, +0.001815f, +0.003617f, -0.003355f, +0.003224f, +0.000404f, +0.000736f, + -0.001667f, -0.002923f, +0.002890f, -0.004917f, -0.006219f, +0.003890f, -0.007122f, +0.004916f, +0.000918f, +0.011770f, + +0.003003f, +0.016430f, +0.004224f, +0.005711f, +0.002603f, +0.001334f, +0.004838f, +0.012820f, +0.003018f, +0.005381f, + -0.001531f, +0.000548f, +0.005060f, +0.000723f, +0.005136f, -0.002183f, +0.003771f, +0.000810f, +0.003407f, +0.001262f, + +0.002361f, -0.004740f, -0.000334f, -0.000137f, +0.001105f, -0.001528f, +0.002941f, +0.000187f, -0.000114f, +0.000565f, + +0.000471f, -0.002168f, -0.000395f, +0.002531f, +0.001138f, +0.001376f, -0.000131f, +0.000148f, +0.001873f, +0.000354f, + +0.000880f, +0.000406f, +0.000964f, +0.000015f, +0.000582f, -0.000892f, -0.000230f, +0.000101f, +0.000330f, -0.001523f, + -0.000562f, -0.000295f, -0.000116f, -0.000729f, -0.000467f, -0.000062f, -0.000120f, +0.000003f, +0.000500f, +0.000001f, + +0.000153f, -0.000683f, -0.000358f, +0.000582f, +0.000492f, -0.000062f, +0.000442f, +0.000026f, -0.000064f, +0.000439f, + -0.000308f, +0.000064f, -0.000131f, -0.000163f, +0.000238f, -0.000057f + }, + { + +0.054752f, -0.014533f, +0.014709f, -0.006443f, +0.000796f, +0.004975f, +0.000939f, +0.001801f, +0.002290f, +0.010732f, + +0.003679f, +0.002184f, -0.003224f, +0.017998f, +0.015869f, -0.000100f, +0.003343f, +0.000790f, +0.006918f, +0.000039f, + +0.010956f, -0.000792f, +0.002214f, +0.007181f, +0.006782f, -0.007709f, -0.001307f, -0.000818f, -0.003128f, -0.002003f, + +0.000082f, +0.002000f, +0.003961f, -0.000102f, +0.007241f, -0.003214f, +0.000388f, +0.003418f, -0.006665f, +0.000188f, + -0.001849f, +0.001452f, +0.009159f, -0.001079f, -0.000600f, +0.001622f, -0.000141f, +0.000457f, -0.000134f, -0.000013f, + -0.002103f, -0.000718f, -0.002524f, -0.000240f, +0.001784f, +0.000818f, +0.000273f, -0.001092f, +0.000516f, -0.001578f, + -0.001428f, +0.000602f, -0.000945f, -0.000417f, -0.000128f, +0.000337f, +0.000696f, -0.000711f, +0.001254f, -0.000916f, + -0.000669f, +0.000442f, +0.000205f, -0.000437f, -0.000164f, -0.001156f, +0.000405f, -0.000229f, +0.000091f, +0.000092f, + +0.000325f, +0.000091f, -0.000246f, +0.000427f, +0.000070f, -0.000537f, +0.000011f, -0.000318f, +0.000221f, +0.000181f, + -0.000145f, -0.000293f, -0.000265f, +0.000238f, -0.000155f, -0.000054f + }, + { + -0.000790f, +0.016322f, +0.014562f, -0.000390f, +0.005934f, -0.003916f, -0.007540f, +0.000612f, -0.004281f, +0.003202f, + +0.000299f, +0.008423f, -0.028773f, -0.001244f, +0.011652f, +0.007755f, -0.004057f, -0.004955f, +0.002382f, -0.017621f, + -0.000812f, -0.001445f, -0.001580f, +0.015012f, +0.006567f, -0.009176f, +0.003012f, +0.012004f, +0.004820f, -0.001426f, + -0.000091f, +0.005522f, +0.006194f, -0.000877f, +0.003194f, -0.003124f, -0.005693f, +0.002857f, -0.006720f, -0.003043f, + -0.001360f, -0.000377f, +0.004469f, +0.001553f, -0.000693f, -0.000697f, +0.002989f, +0.000069f, -0.004494f, -0.004167f, + -0.000458f, -0.000105f, +0.000932f, +0.000680f, +0.000075f, +0.000875f, +0.000452f, +0.000358f, +0.001144f, +0.000134f, + -0.000526f, +0.001121f, -0.001276f, -0.000320f, -0.001428f, -0.000950f, -0.000102f, +0.000749f, +0.001784f, +0.000505f, + -0.000514f, -0.000021f, -0.001113f, +0.000343f, +0.000057f, -0.000431f, +0.000186f, +0.000575f, +0.000411f, -0.000333f, + +0.000123f, -0.000163f, +0.000283f, -0.000172f, +0.000062f, -0.000049f, -0.000942f, -0.000507f, -0.000752f, +0.000001f, + -0.000630f, +0.000303f, +0.000051f, -0.000385f, +0.000132f, +0.000319f + }, + { + +0.032848f, +0.066274f, -0.000384f, -0.005014f, +0.003999f, +0.003061f, +0.009783f, -0.004353f, +0.015183f, -0.002416f, + +0.002327f, +0.003793f, +0.009022f, +0.020990f, +0.041824f, +0.005300f, -0.015745f, -0.001059f, -0.007934f, -0.001440f, + +0.001828f, -0.002703f, +0.000093f, +0.008313f, -0.000567f, -0.000437f, -0.000775f, +0.006709f, -0.007040f, +0.001415f, + +0.003001f, +0.003288f, +0.001233f, +0.002299f, +0.007298f, -0.002144f, -0.004875f, +0.004258f, +0.006322f, -0.001393f, + +0.002084f, +0.001489f, -0.004045f, -0.003938f, +0.001968f, +0.004609f, -0.002659f, +0.001504f, -0.000207f, +0.000912f, + -0.001236f, +0.003650f, +0.003137f, +0.004409f, +0.001802f, +0.000707f, +0.000238f, -0.000628f, +0.001862f, +0.000488f, + -0.000741f, -0.001338f, -0.000057f, -0.000222f, +0.001131f, +0.000136f, +0.000558f, +0.000099f, +0.000872f, -0.000405f, + +0.000434f, -0.000008f, -0.001652f, -0.000051f, +0.000278f, +0.000686f, +0.000649f, +0.000416f, +0.000028f, +0.000260f, + +0.000107f, -0.000451f, +0.000347f, -0.000473f, +0.000282f, -0.000466f, -0.000052f, -0.000486f, -0.000181f, -0.000432f, + -0.000560f, +0.000064f, -0.000176f, -0.000301f, +0.000067f, +0.000472f + }, + { + +0.001673f, +0.000877f, +0.004568f, -0.008003f, +0.001078f, +0.003304f, -0.000523f, -0.002181f, +0.006622f, -0.000228f, + +0.003512f, -0.007671f, +0.003163f, -0.042119f, +0.065898f, +0.001006f, -0.007356f, +0.002448f, +0.006812f, +0.002300f, + -0.002012f, -0.001155f, -0.003889f, -0.003445f, +0.006622f, +0.000990f, -0.007814f, -0.007873f, +0.001659f, +0.008480f, + +0.004271f, +0.000058f, -0.010461f, +0.002667f, +0.001981f, -0.000521f, -0.003636f, +0.001921f, -0.006809f, +0.001563f, + -0.001440f, +0.000202f, +0.001805f, -0.001491f, +0.002133f, +0.001799f, +0.000265f, -0.000245f, -0.001438f, +0.001916f, + +0.001971f, +0.000226f, -0.001735f, +0.000057f, -0.000932f, -0.001373f, +0.000089f, -0.000207f, -0.000596f, -0.000298f, + -0.001264f, +0.000927f, +0.001642f, -0.001221f, -0.000190f, +0.000240f, -0.001098f, +0.001129f, +0.000761f, -0.000275f, + +0.001262f, +0.000134f, +0.000023f, -0.000072f, +0.000926f, +0.000760f, -0.000673f, +0.000272f, -0.000516f, -0.000300f, + +0.000150f, -0.000104f, -0.000257f, +0.000209f, -0.000019f, +0.000031f, -0.000715f, +0.000120f, -0.000202f, +0.000092f, + -0.000110f, +0.000031f, +0.000052f, -0.000280f, -0.000405f, -0.000204f + } + }, + { + { + +0.019472f, +0.240624f, +0.021662f, -0.013335f, -0.001718f, +0.003957f, -0.002222f, +0.004402f, -0.000145f, +0.003624f, + -0.006208f, -0.007645f, +0.003730f, -0.000687f, -0.004800f, +0.021552f, -0.016223f, +0.002616f, +0.016873f, -0.004880f, + +0.001393f, -0.007172f, +0.002946f, -0.012348f, +0.009918f, +0.002611f, -0.004933f, -0.008744f, -0.001898f, -0.002955f, + -0.000201f, +0.000633f, -0.007519f, -0.001976f, +0.003858f, -0.005711f, +0.001514f, -0.001650f, -0.002413f, -0.002077f, + +0.004942f, +0.005153f, -0.002429f, +0.007533f, -0.000550f, -0.000472f, -0.001198f, -0.000365f, -0.003544f, -0.001274f, + +0.002152f, +0.000592f, -0.001531f, -0.000702f, +0.003276f, -0.000598f, -0.001634f, +0.000885f, +0.001412f, -0.003051f, + +0.001714f, +0.000331f, -0.002164f, +0.000017f, +0.000182f, -0.000637f, -0.000468f, -0.000540f, -0.000049f, -0.001118f, + +0.000893f, +0.000419f, -0.000594f, +0.001437f, +0.000395f, +0.000940f, -0.000303f, +0.000308f, +0.000003f, +0.000438f, + -0.000410f, -0.000503f, +0.000906f, +0.000138f, +0.000036f, -0.000491f, -0.000275f, -0.000232f, -0.000513f, -0.000073f, + +0.000233f, -0.000245f, +0.000200f, +0.000014f, +0.000071f, -0.000121f + }, + { + -0.001030f, +0.128667f, +0.025113f, -0.000727f, -0.005801f, +0.001068f, -0.001643f, +0.002243f, +0.006203f, +0.002749f, + +0.002542f, -0.000534f, -0.001392f, +0.001853f, -0.018280f, +0.007193f, +0.011594f, -0.009084f, +0.026408f, -0.003343f, + -0.017795f, -0.002550f, +0.000773f, -0.005023f, +0.001504f, +0.001020f, -0.005936f, +0.004519f, -0.001904f, -0.004103f, + +0.003156f, +0.012558f, +0.001805f, -0.001919f, -0.006662f, -0.002767f, -0.001015f, +0.001224f, -0.001267f, +0.003815f, + +0.003156f, +0.004703f, -0.003686f, -0.001931f, -0.002378f, -0.002764f, +0.000213f, +0.003298f, +0.000151f, +0.002157f, + +0.001998f, +0.001175f, +0.000637f, -0.000409f, -0.001136f, -0.001009f, -0.001593f, +0.000857f, +0.002004f, +0.000715f, + -0.000929f, +0.001374f, -0.000402f, +0.000870f, -0.000018f, +0.000308f, -0.001008f, +0.001250f, +0.000389f, +0.000028f, + -0.000507f, -0.000276f, -0.000371f, +0.000494f, -0.000542f, +0.000235f, +0.000326f, -0.000539f, +0.000695f, +0.000017f, + -0.000293f, -0.000350f, +0.000159f, -0.001132f, -0.000464f, -0.000178f, -0.000398f, +0.000389f, +0.000093f, -0.000125f, + +0.000125f, -0.000137f, -0.000288f, +0.000482f, -0.000190f, +0.000295f + }, + { + -0.003593f, -0.237278f, +0.041739f, +0.016958f, +0.010643f, +0.010813f, +0.000113f, -0.001569f, -0.002282f, +0.001939f, + -0.000061f, +0.003412f, +0.013053f, +0.001377f, +0.010677f, -0.005042f, -0.011525f, -0.017360f, -0.000922f, -0.005035f, + -0.001090f, -0.012240f, -0.007998f, -0.006965f, -0.009947f, +0.000872f, -0.013231f, -0.008819f, +0.001845f, +0.005565f, + +0.002244f, +0.008794f, -0.001279f, +0.000824f, +0.007999f, +0.000115f, +0.002107f, -0.002732f, -0.001984f, +0.003978f, + -0.003004f, -0.006817f, +0.001001f, +0.004639f, +0.001544f, +0.000017f, -0.003912f, +0.000256f, +0.000610f, +0.000879f, + +0.001241f, -0.000354f, +0.000593f, -0.000306f, -0.000060f, +0.001245f, -0.001734f, -0.002420f, +0.000110f, +0.000148f, + +0.000222f, +0.001246f, +0.000760f, +0.000069f, -0.000034f, -0.000927f, +0.001019f, -0.000405f, +0.001141f, +0.001006f, + +0.000551f, -0.000441f, -0.000883f, +0.000596f, +0.000650f, +0.000001f, -0.001220f, +0.000385f, -0.000601f, -0.000553f, + -0.000297f, -0.000009f, +0.000021f, -0.000288f, +0.000132f, -0.000292f, -0.000052f, +0.000057f, -0.000257f, -0.000060f, + -0.000023f, +0.000097f, -0.000498f, -0.000010f, +0.000074f, -0.000101f + }, + { + +0.056824f, +0.205353f, -0.019375f, +0.031804f, +0.000898f, -0.002004f, +0.004076f, +0.004434f, +0.001843f, -0.000163f, + +0.001790f, -0.001099f, +0.002801f, -0.011996f, +0.006056f, +0.000219f, -0.007007f, +0.008445f, +0.008610f, -0.000782f, + -0.000745f, -0.009022f, -0.006873f, -0.000831f, +0.001388f, -0.004167f, -0.005775f, -0.000378f, +0.001450f, -0.001559f, + +0.007536f, -0.001943f, -0.001309f, +0.000920f, -0.000359f, -0.000535f, +0.001585f, -0.001449f, +0.000137f, +0.000977f, + -0.001422f, -0.001948f, +0.001021f, -0.001187f, -0.002542f, +0.000783f, +0.000902f, -0.001974f, -0.001461f, -0.001639f, + +0.000312f, +0.001775f, -0.002608f, +0.001623f, +0.000226f, -0.001140f, +0.000898f, -0.000230f, -0.000805f, +0.002690f, + -0.001282f, -0.000210f, +0.000476f, +0.000936f, -0.000142f, -0.000399f, -0.000079f, +0.000498f, +0.000338f, -0.000145f, + -0.000327f, -0.000771f, -0.000809f, +0.000158f, +0.000448f, +0.000336f, -0.000771f, +0.000124f, -0.000561f, +0.000248f, + -0.000713f, -0.000769f, +0.000073f, +0.000502f, +0.000044f, -0.000102f, -0.000188f, -0.000020f, -0.000233f, +0.000099f, + +0.000036f, -0.000037f, -0.000125f, +0.000174f, -0.000148f, +0.000001f + }, + { + -0.000119f, +0.046121f, -0.012649f, +0.001216f, -0.001989f, +0.001731f, -0.000644f, +0.001490f, +0.000994f, +0.001665f, + -0.006856f, +0.003637f, +0.003454f, +0.011655f, -0.007862f, +0.003145f, -0.003688f, -0.000094f, +0.026662f, +0.002410f, + +0.006181f, -0.007025f, +0.005433f, +0.000748f, -0.004245f, -0.007033f, +0.002245f, -0.006185f, -0.000243f, -0.000005f, + +0.001026f, -0.001015f, -0.002613f, +0.014074f, -0.001093f, -0.009043f, -0.002332f, -0.004715f, +0.002631f, -0.001831f, + -0.001358f, +0.000030f, +0.000416f, +0.000022f, +0.004246f, +0.000420f, +0.000454f, -0.002436f, +0.002447f, +0.000111f, + -0.001158f, +0.002385f, -0.000771f, -0.000252f, -0.000867f, +0.002738f, -0.001360f, +0.000848f, -0.000154f, -0.000945f, + -0.001801f, +0.000712f, +0.000092f, +0.000810f, +0.001993f, -0.000464f, -0.000447f, +0.000596f, +0.000716f, +0.000035f, + +0.000859f, +0.000225f, -0.000623f, +0.000635f, +0.000929f, -0.000644f, -0.000200f, +0.000617f, -0.000881f, -0.000915f, + +0.000029f, +0.000148f, +0.000209f, -0.000038f, -0.000104f, -0.000287f, -0.000389f, -0.000197f, -0.000303f, +0.000378f, + -0.000115f, +0.000007f, +0.000374f, -0.000089f, -0.000399f, -0.000058f + }, + { + +0.061710f, +0.459021f, -0.008219f, -0.000427f, -0.009419f, +0.003125f, -0.001138f, +0.008910f, +0.001018f, +0.000939f, + +0.000742f, -0.000167f, -0.003816f, -0.002490f, -0.000955f, -0.004903f, -0.004545f, -0.004420f, +0.002030f, -0.000441f, + -0.002941f, +0.001223f, -0.001517f, +0.001398f, +0.001750f, +0.004128f, +0.001493f, +0.009362f, +0.001292f, -0.002391f, + -0.003440f, +0.004238f, +0.001226f, -0.008725f, +0.003838f, -0.000800f, +0.004620f, -0.001569f, +0.002015f, +0.001901f, + +0.001343f, +0.007603f, +0.003776f, +0.002292f, +0.002149f, -0.000736f, -0.001599f, -0.002628f, +0.001026f, -0.000084f, + +0.001676f, -0.002041f, +0.000126f, +0.001677f, -0.001510f, -0.001182f, -0.002691f, -0.000632f, +0.000116f, +0.000003f, + +0.000116f, -0.000174f, -0.000453f, +0.000524f, +0.001289f, -0.000338f, +0.000262f, -0.000361f, -0.000166f, +0.000872f, + -0.000003f, +0.001464f, -0.000062f, -0.000223f, +0.000472f, -0.000581f, +0.000498f, +0.000310f, +0.000362f, -0.000066f, + +0.000965f, +0.000430f, +0.000060f, -0.000551f, -0.000069f, -0.000120f, +0.000331f, -0.000743f, +0.000240f, +0.000052f, + -0.000181f, -0.000328f, +0.000106f, +0.000299f, -0.000196f, -0.000095f + }, + { + +0.000079f, -0.009558f, +0.009574f, -0.000205f, +0.001823f, -0.000136f, +0.000795f, -0.000812f, +0.000964f, +0.001582f, + +0.002549f, +0.003768f, -0.004162f, +0.011337f, -0.011019f, +0.004279f, +0.000819f, +0.011469f, +0.002057f, -0.025572f, + -0.001702f, -0.009345f, +0.002315f, +0.022006f, -0.006381f, +0.001257f, +0.004327f, +0.014649f, -0.001401f, +0.001652f, + -0.000835f, +0.002595f, -0.002791f, -0.001136f, +0.000544f, -0.004393f, +0.002361f, -0.002313f, +0.002911f, +0.000411f, + +0.000298f, -0.002470f, +0.001423f, +0.001603f, +0.000255f, +0.002715f, -0.001577f, -0.000862f, +0.001494f, +0.000807f, + -0.001638f, -0.000897f, +0.000750f, +0.002196f, -0.000740f, -0.001159f, -0.002361f, -0.000325f, +0.000084f, -0.002714f, + +0.000672f, -0.000265f, -0.000505f, -0.000362f, +0.000990f, -0.000702f, -0.000787f, -0.000257f, -0.000410f, +0.000612f, + -0.000154f, -0.000198f, +0.000087f, -0.000718f, +0.000879f, +0.000650f, -0.000144f, -0.000553f, -0.000413f, +0.000844f, + -0.000108f, +0.000756f, +0.000174f, +0.000003f, -0.000375f, +0.000001f, -0.000473f, +0.000011f, +0.000233f, +0.000396f, + +0.000639f, -0.000002f, -0.000250f, +0.000050f, +0.000165f, -0.000216f + }, + { + -0.049538f, -0.411099f, -0.006845f, +0.015602f, -0.002685f, -0.003569f, +0.005830f, -0.003942f, +0.003327f, -0.000752f, + -0.002352f, +0.007557f, +0.002514f, +0.002693f, +0.000997f, +0.006103f, +0.005308f, +0.006237f, +0.005281f, -0.001619f, + +0.000664f, -0.001510f, +0.000185f, +0.006654f, +0.001054f, -0.006902f, +0.007485f, -0.000974f, +0.003133f, -0.001891f, + +0.003673f, -0.003193f, -0.000469f, +0.001079f, +0.001280f, +0.012169f, +0.010478f, +0.000454f, -0.000597f, +0.000621f, + +0.001549f, -0.004287f, -0.001511f, -0.000423f, +0.000945f, +0.001323f, -0.002703f, +0.000453f, +0.000185f, +0.000479f, + +0.003089f, -0.000553f, -0.000138f, +0.000527f, -0.001481f, +0.001220f, -0.001600f, +0.002022f, +0.000071f, -0.002333f, + -0.000319f, -0.000431f, -0.000078f, -0.000693f, -0.000613f, +0.002180f, -0.000997f, -0.001178f, -0.000728f, -0.000435f, + -0.000917f, -0.001012f, -0.000708f, -0.000169f, -0.000515f, +0.000235f, -0.000500f, -0.000351f, +0.000209f, -0.000971f, + +0.000160f, +0.000838f, -0.000494f, -0.000687f, -0.000024f, +0.000214f, +0.000113f, +0.000543f, +0.000204f, +0.000123f, + +0.000430f, +0.000050f, -0.000067f, -0.000167f, +0.000319f, -0.000290f + }, + { + +0.000571f, -0.009034f, +0.006449f, +0.002019f, +0.001191f, +0.000007f, +0.000337f, -0.002005f, -0.003664f, +0.000054f, + -0.000666f, -0.003606f, -0.006470f, -0.008362f, -0.028732f, +0.020306f, +0.002826f, -0.004422f, -0.002849f, -0.011615f, + -0.017982f, -0.004877f, -0.008116f, -0.022771f, +0.016052f, +0.012355f, -0.003768f, +0.001532f, +0.005293f, -0.003242f, + +0.002996f, +0.001959f, -0.003808f, -0.011660f, +0.003485f, +0.002066f, -0.000700f, -0.001519f, +0.007075f, +0.003336f, + -0.003537f, +0.002163f, -0.002655f, +0.000569f, +0.001463f, -0.003201f, +0.002750f, +0.000428f, -0.002554f, -0.000930f, + -0.003950f, +0.004534f, -0.001392f, -0.000079f, +0.001028f, +0.000848f, +0.000323f, +0.001994f, +0.003226f, -0.001568f, + -0.001609f, +0.001276f, -0.000816f, -0.000077f, -0.000200f, -0.001033f, +0.000834f, +0.000004f, -0.000511f, -0.001293f, + +0.001277f, -0.000205f, -0.000646f, -0.000662f, -0.000163f, +0.001164f, -0.000365f, -0.000376f, +0.000444f, +0.000328f, + -0.000305f, +0.000541f, -0.000006f, +0.000275f, +0.000153f, -0.000939f, +0.000498f, +0.000422f, +0.000176f, +0.000246f, + -0.000040f, -0.000068f, -0.000049f, +0.000198f, +0.000237f, +0.000161f + }, + { + -0.027636f, -0.016107f, +0.036620f, -0.013495f, -0.006565f, -0.015407f, +0.013729f, -0.002477f, +0.000578f, -0.001638f, + -0.002792f, +0.003478f, +0.000016f, +0.002464f, +0.007430f, +0.006593f, +0.013604f, +0.002892f, +0.000056f, -0.007828f, + +0.001452f, -0.009782f, +0.006669f, -0.001240f, +0.002614f, +0.000421f, +0.003259f, -0.002525f, +0.000578f, +0.000909f, + -0.009991f, -0.002557f, +0.004580f, -0.003450f, +0.007151f, -0.000882f, +0.003385f, -0.006364f, +0.002964f, +0.000339f, + +0.002555f, +0.001552f, +0.003615f, +0.001499f, -0.000815f, +0.003424f, +0.001118f, +0.001782f, +0.000847f, -0.001053f, + -0.000528f, -0.003002f, -0.002336f, -0.002338f, +0.002235f, -0.002019f, -0.001060f, +0.001259f, -0.000305f, +0.000396f, + -0.000245f, -0.002236f, -0.000804f, +0.001955f, -0.001567f, +0.000097f, -0.000432f, -0.000854f, +0.000466f, +0.000084f, + -0.000329f, +0.000325f, -0.001154f, +0.000215f, -0.000160f, +0.000122f, +0.000311f, +0.000529f, +0.000062f, -0.000391f, + -0.000379f, -0.000663f, +0.000520f, -0.000471f, -0.000335f, -0.000888f, +0.000056f, +0.000023f, +0.000254f, -0.000232f, + +0.000110f, -0.000012f, -0.000129f, +0.000042f, +0.000128f, -0.000195f + }, + { + -0.001201f, +0.056749f, +0.008084f, +0.003258f, -0.003442f, +0.002037f, -0.002407f, +0.006258f, +0.000305f, -0.002256f, + -0.003019f, -0.002582f, -0.002774f, -0.001812f, -0.011338f, +0.003223f, +0.001661f, +0.008485f, +0.002734f, +0.015193f, + +0.000401f, +0.012170f, -0.007348f, -0.011257f, -0.001747f, +0.005971f, +0.008973f, +0.013632f, +0.005202f, +0.004836f, + -0.003154f, -0.005703f, +0.004706f, -0.000148f, +0.005337f, -0.003073f, -0.000523f, -0.000772f, +0.001068f, -0.003590f, + +0.001488f, -0.001357f, +0.001321f, +0.002338f, +0.001678f, -0.003274f, +0.001088f, +0.000396f, -0.000090f, +0.000022f, + +0.001648f, -0.000763f, -0.000939f, +0.000412f, -0.000288f, +0.001092f, -0.000220f, -0.000573f, +0.000808f, +0.000001f, + +0.000859f, +0.001110f, +0.001269f, +0.000217f, +0.000917f, +0.000433f, +0.000892f, +0.000287f, +0.000929f, -0.001275f, + -0.000621f, +0.000427f, +0.000659f, +0.000161f, -0.000183f, +0.000032f, -0.000134f, -0.000191f, -0.000342f, -0.000112f, + +0.000186f, -0.000613f, -0.000640f, +0.000085f, +0.000058f, -0.000364f, +0.000457f, +0.000052f, -0.000292f, +0.000336f, + -0.000410f, -0.000024f, -0.000303f, -0.000201f, +0.000037f, -0.000126f + }, + { + -0.028152f, -0.123977f, +0.020673f, -0.010058f, -0.006564f, +0.000960f, +0.002475f, +0.001081f, -0.004086f, +0.000976f, + -0.002195f, +0.004449f, -0.014236f, +0.002004f, +0.019005f, -0.005346f, -0.006880f, -0.003944f, +0.001393f, -0.004336f, + +0.005281f, +0.000985f, +0.003047f, +0.001563f, +0.006878f, -0.001640f, +0.005246f, +0.003718f, -0.005053f, -0.005001f, + -0.000435f, +0.001847f, +0.003456f, -0.002158f, +0.000288f, -0.007272f, -0.001078f, +0.002235f, -0.007387f, +0.001138f, + -0.000849f, +0.001770f, +0.006375f, -0.004358f, -0.000209f, +0.001627f, +0.000691f, +0.002199f, -0.000213f, -0.002088f, + -0.000910f, +0.001164f, -0.001367f, +0.001682f, +0.001163f, +0.000866f, +0.000686f, +0.000368f, +0.002588f, -0.000564f, + -0.002487f, +0.000354f, +0.000427f, -0.000095f, +0.000432f, +0.001075f, +0.000672f, -0.001252f, +0.001299f, -0.001157f, + -0.000029f, +0.000389f, -0.000030f, -0.000031f, +0.000383f, -0.000875f, -0.000201f, +0.000027f, -0.000080f, -0.000475f, + -0.000414f, -0.000183f, +0.000053f, +0.000321f, +0.000271f, +0.000274f, +0.000213f, -0.000430f, +0.000002f, +0.000144f, + +0.000097f, -0.000388f, -0.000441f, -0.000096f, -0.000234f, +0.000125f + }, + { + +0.001223f, +0.002413f, +0.001148f, -0.002895f, +0.008093f, +0.000506f, +0.000354f, +0.004479f, -0.001719f, +0.002658f, + -0.001096f, +0.016463f, +0.017689f, +0.055144f, +0.014727f, +0.019035f, +0.000323f, +0.001101f, +0.005963f, -0.004200f, + -0.007059f, -0.030404f, -0.016798f, +0.014731f, +0.016969f, -0.004145f, +0.007816f, +0.003379f, +0.004128f, -0.005539f, + -0.005690f, +0.000351f, +0.001947f, -0.002895f, -0.002679f, -0.006155f, -0.004815f, +0.002608f, -0.003403f, +0.002220f, + +0.001287f, +0.002531f, +0.003709f, +0.000829f, -0.001897f, -0.000505f, +0.004287f, +0.000538f, -0.003728f, -0.002711f, + -0.003473f, -0.001225f, +0.000662f, -0.000261f, +0.000826f, +0.002072f, +0.000745f, +0.000549f, +0.001031f, -0.000170f, + -0.000312f, +0.000084f, -0.000917f, +0.001082f, +0.000019f, +0.000154f, +0.000370f, +0.000488f, -0.000665f, -0.000130f, + -0.000218f, +0.000885f, -0.000277f, +0.000376f, -0.000201f, +0.000048f, +0.000499f, +0.000053f, -0.000048f, -0.000651f, + -0.000267f, -0.000432f, -0.000024f, -0.000151f, +0.000333f, +0.000497f, -0.000250f, +0.000714f, -0.000219f, +0.000221f, + -0.000114f, +0.000422f, +0.000069f, -0.000245f, -0.000005f, +0.000112f + }, + { + -0.035312f, -0.021394f, +0.003262f, -0.007246f, +0.001445f, -0.007423f, +0.002126f, -0.006848f, +0.007667f, -0.005686f, + -0.002883f, -0.003015f, +0.014628f, -0.015745f, -0.022033f, +0.009237f, -0.002473f, -0.002706f, -0.009571f, -0.000645f, + -0.001832f, -0.003163f, +0.000324f, +0.007454f, +0.002289f, -0.000562f, +0.000505f, +0.002758f, -0.005534f, +0.005445f, + +0.003261f, +0.002213f, -0.001240f, -0.002102f, +0.005233f, -0.001444f, -0.005087f, +0.002852f, +0.000580f, -0.004506f, + +0.002708f, -0.000839f, -0.002727f, +0.000164f, +0.000941f, +0.004267f, -0.003358f, +0.001654f, +0.001686f, -0.000669f, + -0.002394f, +0.001309f, +0.001283f, -0.000023f, -0.001032f, +0.000485f, -0.001292f, -0.001630f, +0.001942f, +0.000964f, + +0.000194f, -0.001387f, -0.000283f, -0.000495f, -0.000127f, -0.000897f, -0.000304f, -0.000118f, +0.001272f, -0.000116f, + -0.000651f, -0.000217f, -0.001703f, +0.000203f, +0.000768f, +0.000368f, -0.000493f, +0.000220f, +0.000103f, +0.000216f, + -0.000098f, -0.000575f, +0.000229f, -0.000910f, -0.000044f, +0.000020f, -0.000066f, -0.000531f, +0.000100f, -0.000317f, + -0.000348f, +0.000560f, +0.000302f, +0.000067f, -0.000031f, +0.000160f + }, + { + -0.001216f, -0.004061f, +0.005499f, -0.003523f, +0.004052f, +0.000113f, -0.004447f, -0.007396f, +0.003607f, +0.005804f, + +0.004396f, -0.011291f, -0.001639f, -0.023426f, +0.094695f, +0.001740f, -0.005765f, +0.008678f, +0.017115f, -0.006365f, + -0.010238f, +0.005348f, +0.003189f, -0.014844f, +0.002271f, +0.007640f, -0.006385f, -0.006469f, -0.000830f, +0.003079f, + +0.002786f, -0.000642f, -0.009722f, +0.009776f, +0.008188f, +0.002916f, -0.000804f, +0.006065f, -0.005026f, -0.000591f, + +0.000317f, +0.002702f, +0.002477f, +0.001818f, +0.000246f, -0.001189f, -0.002151f, -0.002236f, +0.000482f, +0.005291f, + +0.001705f, -0.000583f, -0.001510f, -0.000894f, -0.000298f, +0.000578f, +0.001094f, +0.000196f, +0.000344f, +0.000626f, + -0.001268f, -0.000544f, +0.001863f, -0.000099f, +0.000833f, +0.001122f, -0.001893f, -0.000742f, +0.000041f, -0.000604f, + +0.000170f, -0.000616f, -0.000197f, -0.000650f, +0.000164f, +0.000905f, -0.000757f, +0.000548f, -0.000410f, -0.000217f, + +0.000199f, +0.000117f, -0.000093f, -0.000195f, -0.000345f, +0.000332f, -0.000414f, +0.000184f, +0.000132f, +0.000256f, + -0.000132f, +0.000135f, +0.000027f, +0.000123f, +0.000019f, -0.000008f + } + }, + { + { + -0.021786f, +0.176761f, +0.089323f, -0.027304f, +0.003482f, +0.003748f, +0.000107f, +0.005796f, +0.000819f, -0.001381f, + -0.009910f, -0.007117f, +0.004740f, -0.003710f, +0.008595f, +0.001620f, -0.000141f, +0.003203f, -0.000541f, +0.007763f, + -0.002018f, -0.006497f, -0.005436f, +0.001320f, +0.003070f, +0.002593f, -0.006432f, -0.007723f, -0.006485f, +0.003178f, + -0.006552f, +0.001476f, -0.002954f, -0.002002f, +0.001136f, -0.004620f, -0.001165f, -0.001210f, +0.001546f, -0.002140f, + +0.004185f, +0.002628f, +0.002153f, +0.001098f, +0.000595f, +0.000472f, +0.000798f, -0.002434f, -0.003298f, -0.001321f, + +0.004252f, +0.001005f, -0.003600f, +0.000237f, +0.001269f, +0.001684f, -0.001616f, -0.000213f, -0.001042f, -0.000725f, + +0.001374f, -0.000488f, -0.001095f, +0.000476f, -0.001132f, -0.000546f, -0.000785f, +0.000090f, -0.000657f, -0.000199f, + +0.000023f, +0.000805f, -0.000648f, +0.000789f, +0.000786f, +0.000043f, +0.000112f, +0.000158f, +0.000561f, +0.000521f, + -0.000182f, -0.000415f, +0.000506f, -0.000119f, +0.000098f, -0.000190f, -0.000396f, -0.000148f, -0.000600f, +0.000064f, + +0.000090f, +0.000020f, -0.000150f, +0.000187f, +0.000058f, +0.000042f + }, + { + +0.002562f, +0.105923f, +0.035805f, -0.005124f, +0.002769f, -0.001022f, -0.000249f, +0.001676f, +0.008023f, +0.004218f, + -0.003749f, +0.001093f, -0.000280f, -0.006607f, -0.016731f, +0.022520f, +0.000818f, +0.009642f, +0.003067f, -0.005311f, + -0.013908f, -0.007034f, +0.001081f, -0.004406f, +0.003225f, -0.003953f, -0.002452f, +0.005924f, -0.005893f, +0.002695f, + -0.004538f, +0.013398f, +0.002791f, -0.003188f, -0.000584f, -0.007511f, +0.001389f, +0.002170f, +0.001828f, +0.002171f, + +0.002101f, +0.003716f, -0.003047f, -0.002711f, -0.001105f, -0.000497f, +0.000713f, +0.001913f, +0.000540f, +0.001160f, + +0.003282f, +0.001638f, +0.000919f, -0.000776f, -0.000523f, -0.002896f, -0.000492f, +0.000516f, +0.000992f, +0.001575f, + +0.001509f, -0.000744f, +0.000343f, -0.000581f, +0.001098f, -0.000261f, -0.000397f, +0.000962f, +0.000166f, -0.000243f, + +0.000918f, -0.000543f, -0.000555f, -0.000006f, +0.000213f, -0.000026f, +0.000050f, -0.000085f, +0.000011f, +0.000128f, + -0.000368f, -0.000082f, -0.000369f, -0.000495f, -0.000371f, +0.000144f, +0.000191f, -0.000270f, +0.000036f, -0.000170f, + -0.000340f, -0.000136f, +0.000241f, +0.000417f, +0.000136f, -0.000082f + }, + { + +0.005625f, -0.095492f, -0.074637f, +0.014469f, +0.013916f, +0.012782f, -0.001460f, -0.002938f, +0.000797f, -0.003086f, + +0.010501f, +0.001960f, +0.001698f, +0.008690f, +0.007984f, -0.000709f, -0.005238f, -0.023311f, -0.008023f, -0.000726f, + -0.012530f, -0.008245f, -0.012111f, +0.003683f, -0.005293f, -0.008183f, -0.007966f, -0.007162f, -0.001739f, +0.004309f, + +0.006302f, +0.003590f, +0.000661f, +0.003080f, -0.002051f, +0.001472f, +0.004827f, -0.005284f, +0.000998f, -0.001153f, + -0.003884f, -0.002252f, -0.001598f, +0.001773f, +0.001863f, +0.002513f, -0.003848f, -0.000781f, +0.001799f, -0.000264f, + +0.001088f, +0.000650f, +0.000576f, -0.000078f, -0.000084f, +0.001292f, -0.001067f, -0.001624f, +0.000050f, -0.000124f, + -0.000751f, +0.002556f, +0.000955f, +0.000138f, -0.000995f, +0.001057f, -0.001487f, +0.001019f, +0.000576f, +0.001474f, + -0.000007f, +0.000032f, -0.000334f, +0.000095f, +0.000187f, -0.000030f, -0.000598f, -0.000181f, -0.000460f, -0.000207f, + -0.000850f, +0.000229f, +0.000004f, -0.000478f, +0.000301f, -0.000118f, +0.000404f, -0.000456f, -0.000016f, -0.000295f, + -0.000001f, -0.000040f, -0.000543f, -0.000262f, +0.000050f, +0.000099f + }, + { + -0.026104f, +0.285162f, +0.006503f, +0.028130f, +0.004889f, -0.000785f, +0.003873f, -0.000282f, +0.003193f, +0.002503f, + -0.001757f, +0.003805f, -0.001744f, -0.001134f, -0.006057f, -0.005455f, +0.006608f, +0.009660f, +0.003305f, -0.002027f, + -0.001695f, -0.006917f, -0.004833f, -0.001588f, -0.001282f, -0.001923f, -0.005090f, +0.001343f, -0.001386f, +0.004466f, + +0.001243f, -0.003961f, +0.000420f, +0.002316f, +0.002569f, -0.001964f, +0.001043f, -0.000577f, +0.000236f, +0.004065f, + -0.003955f, -0.000234f, -0.002333f, +0.001483f, +0.000666f, -0.001040f, -0.001377f, -0.001720f, -0.000076f, -0.002704f, + +0.001668f, -0.000547f, -0.001993f, +0.000664f, +0.001601f, +0.000512f, +0.000307f, -0.000014f, -0.001125f, +0.001738f, + +0.000751f, -0.000407f, +0.000031f, +0.000295f, +0.000371f, +0.000037f, -0.000337f, +0.000960f, -0.000003f, +0.000049f, + -0.000339f, -0.000774f, -0.001233f, -0.000221f, +0.001210f, +0.000056f, -0.000104f, -0.000163f, -0.000600f, +0.000096f, + -0.000381f, -0.000260f, -0.000221f, +0.000359f, +0.000192f, -0.000376f, -0.000144f, -0.000002f, -0.000528f, +0.000170f, + +0.000188f, +0.000107f, -0.000042f, -0.000169f, +0.000202f, -0.000262f + }, + { + -0.000946f, +0.016452f, +0.008457f, -0.000542f, +0.001055f, -0.000517f, +0.001041f, +0.001025f, +0.002280f, -0.000082f, + -0.003593f, +0.002688f, +0.006890f, +0.001251f, +0.012186f, -0.014022f, -0.001570f, +0.041645f, -0.042072f, +0.014227f, + +0.009964f, -0.002155f, +0.000356f, -0.007523f, -0.009307f, -0.001476f, -0.001585f, +0.002241f, -0.000785f, +0.006733f, + -0.004467f, -0.000116f, -0.002263f, +0.008796f, +0.002294f, -0.005542f, -0.003244f, +0.000150f, +0.002167f, -0.000199f, + -0.003726f, +0.000373f, -0.002552f, -0.000392f, +0.004170f, +0.002878f, -0.001403f, +0.001426f, -0.000153f, +0.002103f, + -0.002043f, +0.000470f, +0.001785f, -0.002828f, +0.000719f, +0.001282f, +0.002039f, +0.000498f, -0.001440f, -0.000554f, + -0.000283f, -0.000353f, -0.000224f, +0.001970f, +0.001544f, +0.001000f, -0.000156f, +0.000398f, +0.000601f, +0.000089f, + -0.000046f, +0.000536f, -0.000445f, +0.000655f, +0.000567f, +0.000393f, -0.000778f, +0.000416f, -0.000063f, -0.000677f, + +0.000097f, -0.000084f, -0.000076f, +0.000095f, -0.000134f, -0.000702f, +0.000220f, -0.000346f, -0.000143f, +0.000335f, + -0.000155f, +0.000457f, +0.000054f, -0.000111f, -0.000323f, +0.000004f + }, + { + -0.014720f, +0.563568f, -0.011558f, -0.012793f, +0.007445f, -0.001774f, +0.000926f, +0.007073f, +0.001004f, +0.000886f, + +0.007768f, -0.005160f, +0.000504f, -0.003486f, +0.001380f, +0.000685f, -0.013127f, -0.002460f, +0.002602f, -0.002479f, + +0.000019f, -0.001300f, +0.003225f, -0.002010f, +0.001893f, +0.002114f, +0.003968f, +0.006390f, +0.001474f, -0.003649f, + +0.000618f, +0.002985f, -0.003679f, -0.003560f, -0.000722f, +0.002138f, +0.003035f, +0.001656f, +0.002336f, +0.002467f, + +0.005820f, +0.002426f, +0.006592f, +0.003138f, -0.004454f, +0.001493f, -0.005312f, +0.002357f, -0.000433f, -0.001311f, + +0.001151f, -0.001630f, +0.002059f, -0.000767f, -0.000668f, -0.001825f, -0.001402f, -0.001006f, +0.000954f, -0.000074f, + -0.001167f, +0.000623f, +0.000407f, +0.000562f, +0.000300f, +0.000601f, +0.000022f, +0.000032f, +0.000132f, +0.000277f, + +0.001071f, +0.000408f, +0.000919f, +0.000041f, -0.000478f, -0.000025f, +0.000402f, -0.000207f, +0.000021f, +0.000881f, + +0.000529f, +0.000480f, -0.000593f, -0.000306f, -0.000190f, +0.000483f, -0.000300f, -0.000472f, +0.000326f, -0.000163f, + -0.000120f, -0.000446f, +0.000396f, -0.000258f, +0.000061f, -0.000168f + }, + { + -0.000542f, +0.008396f, -0.000594f, +0.000509f, +0.001645f, -0.000011f, +0.000166f, -0.000205f, +0.000881f, +0.001637f, + +0.001767f, +0.000699f, +0.005352f, -0.005131f, +0.000313f, +0.008300f, +0.004305f, -0.004114f, -0.004549f, -0.013147f, + +0.001533f, -0.000978f, +0.012640f, +0.001668f, -0.004872f, +0.000305f, +0.006930f, +0.009442f, -0.001501f, +0.000590f, + -0.002734f, +0.003233f, +0.001086f, -0.002386f, -0.002730f, -0.002711f, +0.002643f, -0.001333f, -0.000306f, +0.003734f, + -0.000938f, -0.003588f, +0.004142f, +0.002567f, -0.002609f, +0.001470f, +0.000864f, -0.000685f, +0.000794f, -0.001573f, + +0.000298f, -0.001480f, +0.000537f, +0.001958f, -0.000907f, +0.000622f, -0.002973f, +0.000582f, +0.000155f, -0.002705f, + -0.000252f, -0.000624f, -0.001332f, +0.000280f, +0.001476f, -0.001959f, -0.001100f, +0.000224f, +0.000174f, +0.000588f, + -0.000423f, -0.000491f, -0.000026f, -0.000028f, +0.000654f, +0.000293f, +0.000217f, -0.000353f, -0.000019f, +0.000622f, + -0.000013f, +0.000205f, +0.000437f, -0.000250f, -0.000170f, -0.000110f, +0.000035f, -0.000315f, +0.000120f, +0.000384f, + +0.000210f, +0.000005f, -0.000094f, -0.000007f, +0.000060f, -0.000119f + }, + { + +0.019229f, -0.449954f, -0.040939f, +0.002016f, +0.003914f, +0.000321f, +0.002838f, +0.002978f, -0.000212f, -0.002471f, + +0.001932f, +0.003210f, +0.002791f, -0.006634f, +0.011913f, +0.008149f, +0.003835f, +0.004855f, +0.004202f, -0.000224f, + -0.002712f, +0.002363f, +0.003210f, +0.005674f, +0.000192f, -0.004820f, +0.002994f, +0.001696f, +0.002729f, +0.002754f, + -0.000356f, -0.004319f, +0.003749f, -0.004230f, +0.006776f, +0.015034f, +0.004691f, +0.003161f, -0.002232f, +0.005917f, + -0.002274f, -0.002643f, -0.004096f, +0.000241f, +0.001517f, +0.001025f, -0.000272f, -0.003706f, +0.001515f, +0.002942f, + +0.002159f, +0.000398f, +0.000841f, -0.003598f, +0.001308f, +0.000343f, -0.000579f, +0.000837f, -0.001139f, +0.000273f, + -0.001414f, -0.000082f, -0.000521f, -0.001536f, +0.000798f, +0.001324f, -0.001267f, -0.000381f, -0.000431f, -0.001020f, + -0.000916f, -0.001205f, +0.000430f, -0.000336f, -0.000366f, -0.000288f, +0.000151f, -0.000024f, -0.000246f, -0.000853f, + +0.000633f, -0.000100f, -0.000250f, -0.000704f, +0.000021f, +0.000172f, +0.000148f, +0.000723f, -0.000132f, +0.000441f, + +0.000214f, +0.000028f, -0.000281f, +0.000354f, -0.000284f, +0.000087f + }, + { + -0.001750f, +0.014403f, -0.004793f, -0.002429f, +0.002633f, -0.000307f, -0.000861f, -0.001136f, -0.000948f, -0.001200f, + -0.001160f, -0.002523f, -0.001458f, -0.010578f, -0.023322f, +0.002030f, -0.001870f, +0.020105f, -0.016345f, -0.012467f, + -0.017346f, +0.000117f, -0.011513f, -0.007499f, +0.006621f, +0.006332f, +0.006192f, -0.001871f, -0.003221f, +0.003961f, + +0.002468f, -0.001022f, -0.002049f, -0.007263f, -0.000039f, +0.004870f, -0.004045f, -0.000728f, +0.004954f, +0.004355f, + -0.000887f, -0.001104f, -0.001569f, +0.003774f, -0.000285f, -0.001729f, +0.000716f, -0.001231f, +0.000839f, -0.003590f, + -0.001078f, +0.001585f, -0.000686f, -0.000570f, +0.001526f, +0.000846f, +0.000210f, +0.003163f, +0.001685f, -0.000845f, + -0.000299f, -0.001169f, -0.000376f, -0.000103f, +0.000124f, -0.001735f, +0.000175f, -0.000840f, -0.000451f, +0.000509f, + +0.000446f, +0.000099f, -0.000623f, -0.000959f, +0.000669f, +0.000320f, +0.000036f, +0.000103f, +0.000189f, +0.000305f, + +0.000078f, -0.000505f, +0.000339f, -0.000261f, +0.000229f, -0.000300f, +0.000499f, +0.000338f, +0.000245f, +0.000452f, + -0.000015f, -0.000340f, +0.000070f, -0.000001f, +0.000520f, -0.000008f + }, + { + +0.023366f, +0.028432f, -0.066831f, -0.011039f, -0.000908f, -0.002685f, +0.001983f, -0.001929f, -0.002120f, +0.003373f, + +0.001429f, -0.000343f, -0.000277f, +0.002214f, +0.012468f, +0.002812f, +0.017239f, +0.009498f, -0.006305f, -0.005405f, + -0.000650f, -0.005146f, +0.001440f, +0.003377f, +0.003136f, +0.002842f, -0.000898f, -0.002835f, +0.002181f, -0.000216f, + -0.004439f, -0.003357f, +0.001019f, -0.003142f, +0.004500f, +0.005055f, +0.000396f, -0.001399f, -0.000379f, -0.001024f, + +0.005359f, +0.000089f, +0.002764f, +0.001469f, +0.000537f, +0.004565f, +0.003572f, -0.000235f, -0.001508f, +0.003434f, + -0.001875f, -0.001884f, -0.001415f, -0.001787f, -0.000760f, +0.000236f, -0.001060f, -0.000288f, -0.000241f, +0.000918f, + -0.000232f, -0.001600f, -0.000800f, +0.000899f, -0.000715f, +0.000008f, -0.001491f, +0.000115f, -0.000029f, +0.000253f, + +0.000649f, -0.000266f, -0.000936f, +0.000092f, +0.000167f, -0.000077f, +0.000294f, +0.000130f, +0.000428f, -0.000423f, + -0.000789f, -0.000383f, +0.000013f, -0.000065f, -0.000551f, -0.000084f, +0.000120f, -0.000031f, +0.000246f, +0.000143f, + -0.000220f, +0.000019f, -0.000029f, -0.000136f, +0.000055f, -0.000068f + }, + { + +0.000711f, +0.035108f, +0.022530f, +0.001603f, -0.000138f, -0.001633f, -0.001166f, +0.003876f, +0.003416f, -0.005439f, + +0.002148f, -0.004657f, -0.008707f, +0.009827f, -0.015422f, +0.006452f, +0.000030f, +0.001628f, +0.015529f, -0.005644f, + +0.008721f, +0.009472f, -0.005590f, -0.006877f, -0.004582f, +0.008794f, +0.006922f, +0.012509f, +0.007978f, +0.002299f, + -0.003942f, -0.012659f, +0.009959f, +0.002348f, -0.000144f, -0.001420f, -0.003719f, +0.003242f, -0.002277f, -0.003579f, + -0.001708f, -0.000538f, +0.004686f, +0.000344f, +0.000516f, -0.000010f, -0.002236f, +0.002803f, -0.000238f, -0.000796f, + -0.000112f, +0.000652f, -0.000280f, -0.000957f, +0.001158f, +0.000417f, -0.001253f, -0.000430f, +0.000105f, +0.000971f, + +0.001746f, +0.000005f, +0.000211f, +0.000766f, +0.000431f, +0.001159f, +0.001456f, +0.000505f, +0.000027f, +0.000315f, + -0.000724f, +0.000308f, +0.000013f, +0.000392f, +0.000057f, -0.000215f, -0.000301f, -0.000503f, -0.000290f, +0.000117f, + -0.000143f, -0.000357f, +0.000012f, -0.000630f, -0.000289f, -0.000000f, -0.000022f, +0.000293f, -0.000130f, -0.000248f, + -0.000129f, -0.000092f, -0.000280f, +0.000043f, -0.000005f, -0.000109f + }, + { + -0.000279f, -0.151715f, +0.002133f, -0.000704f, -0.010483f, -0.007623f, +0.009708f, +0.001688f, -0.004057f, -0.000797f, + -0.005257f, +0.005662f, -0.007716f, -0.002242f, +0.006599f, -0.003491f, -0.003891f, -0.002404f, -0.002559f, -0.000462f, + +0.002853f, +0.000118f, +0.004632f, +0.000832f, +0.001526f, +0.005568f, +0.004437f, +0.001809f, -0.004670f, -0.002378f, + -0.002669f, +0.001055f, +0.002950f, +0.000180f, -0.003140f, -0.008488f, -0.001007f, -0.002028f, -0.000606f, -0.002705f, + -0.000314f, +0.004821f, +0.004613f, -0.005644f, +0.001471f, -0.000464f, +0.000191f, +0.002020f, +0.002727f, -0.002775f, + -0.001539f, -0.000159f, +0.000151f, +0.001988f, +0.000264f, +0.002076f, +0.000245f, +0.001844f, +0.000448f, -0.000137f, + -0.001503f, +0.000112f, +0.000189f, +0.000436f, +0.000646f, +0.000270f, +0.000273f, -0.000933f, +0.000393f, -0.000081f, + +0.000003f, +0.000182f, +0.000375f, -0.000058f, -0.000108f, -0.000345f, -0.000247f, +0.000187f, -0.000474f, -0.000121f, + -0.000397f, -0.000248f, +0.000085f, +0.000578f, +0.000146f, +0.000440f, -0.000322f, -0.000334f, +0.000322f, -0.000037f, + +0.000058f, -0.000217f, -0.000155f, -0.000260f, -0.000107f, +0.000303f + }, + { + -0.001151f, -0.005131f, +0.001334f, +0.002063f, +0.004098f, +0.004919f, +0.003750f, -0.001220f, +0.005061f, +0.000988f, + +0.003680f, +0.009583f, -0.003100f, +0.087080f, +0.009198f, +0.015404f, +0.007391f, +0.002742f, -0.000590f, +0.003226f, + -0.007887f, -0.030028f, +0.002264f, -0.001079f, +0.003961f, +0.008311f, +0.011704f, -0.001331f, +0.001623f, -0.005471f, + -0.009905f, +0.002964f, -0.000208f, -0.002763f, -0.005571f, -0.002359f, -0.004490f, +0.000195f, +0.001160f, +0.000422f, + +0.004627f, +0.002730f, -0.000321f, +0.000852f, -0.004224f, +0.002779f, +0.003825f, +0.000681f, -0.001944f, -0.003721f, + -0.002486f, -0.001772f, +0.001797f, +0.000581f, +0.001225f, -0.000037f, +0.001188f, +0.000140f, +0.000645f, -0.000749f, + +0.000076f, -0.001010f, +0.000751f, +0.001062f, -0.000551f, +0.000137f, +0.001171f, +0.000063f, -0.001756f, -0.000184f, + -0.000214f, +0.000636f, +0.001270f, +0.000121f, -0.000758f, +0.000027f, +0.000898f, +0.000173f, -0.000663f, -0.000202f, + -0.000166f, -0.000362f, -0.000587f, -0.000101f, -0.000092f, +0.000280f, +0.000597f, +0.000399f, +0.000390f, -0.000388f, + +0.000329f, +0.000499f, -0.000204f, -0.000028f, +0.000006f, -0.000032f + }, + { + +0.023282f, -0.087935f, -0.018446f, -0.000254f, -0.002374f, +0.005155f, -0.010218f, -0.000679f, +0.000223f, -0.001798f, + +0.002243f, -0.000100f, +0.006279f, +0.002553f, -0.047127f, -0.006683f, +0.008993f, -0.001313f, -0.010365f, +0.002340f, + -0.005089f, +0.000592f, +0.000447f, +0.004739f, +0.003628f, +0.001080f, +0.001049f, +0.002101f, +0.002305f, -0.000918f, + +0.005226f, -0.000547f, -0.000532f, -0.001396f, +0.000955f, +0.000941f, -0.002582f, -0.000011f, -0.002705f, -0.004190f, + +0.001626f, +0.003294f, -0.002049f, +0.000323f, -0.001202f, +0.002224f, -0.001248f, -0.001229f, +0.001460f, -0.000364f, + +0.000150f, -0.000582f, +0.001111f, -0.001268f, -0.000917f, +0.000174f, -0.001937f, +0.000835f, -0.000034f, +0.001900f, + -0.001186f, +0.000137f, -0.000785f, -0.000825f, -0.000712f, -0.001152f, -0.001259f, +0.000282f, +0.001243f, +0.000578f, + -0.001567f, -0.000054f, -0.001392f, -0.000318f, +0.000812f, +0.000165f, -0.000098f, -0.000030f, +0.000315f, -0.000317f, + -0.000572f, +0.000118f, -0.000545f, -0.000585f, -0.000487f, +0.000706f, -0.000014f, -0.000240f, -0.000133f, -0.000125f, + -0.000243f, +0.000465f, +0.000199f, +0.000031f, +0.000310f, -0.000074f + }, + { + +0.001272f, -0.007894f, +0.004867f, -0.001392f, +0.001418f, -0.001293f, -0.003147f, -0.004966f, -0.000810f, +0.004420f, + +0.002759f, -0.002720f, -0.003317f, +0.054605f, -0.006893f, -0.005841f, +0.012914f, -0.003743f, +0.014360f, -0.010639f, + -0.005401f, +0.012287f, +0.005789f, -0.020707f, -0.005069f, +0.010213f, -0.006158f, -0.001877f, +0.000451f, +0.002591f, + -0.000947f, -0.000755f, -0.005183f, +0.008808f, +0.006269f, +0.003938f, -0.002836f, +0.002855f, +0.000751f, -0.001181f, + +0.003477f, +0.000319f, +0.003549f, +0.001517f, -0.000499f, -0.001303f, -0.001387f, -0.002248f, +0.000942f, +0.004165f, + -0.000164f, +0.001601f, -0.000240f, -0.003159f, +0.001259f, -0.000787f, +0.002437f, +0.000985f, -0.000139f, +0.000765f, + +0.000825f, -0.000848f, -0.000027f, +0.000944f, +0.000265f, +0.000274f, -0.000311f, -0.001351f, -0.000135f, -0.000608f, + -0.000310f, -0.000498f, -0.000181f, +0.000120f, -0.000089f, +0.000572f, -0.000358f, -0.000063f, -0.000226f, +0.000482f, + -0.000492f, +0.000130f, +0.000308f, -0.000476f, -0.000321f, +0.000258f, -0.000312f, +0.000090f, +0.000322f, -0.000083f, + -0.000019f, +0.000207f, -0.000045f, +0.000239f, -0.000007f, +0.000007f + } + }, + { + { + +0.019440f, +0.002091f, -0.101951f, -0.015108f, -0.003232f, -0.001833f, -0.003902f, +0.000068f, +0.001585f, +0.002243f, + -0.007184f, -0.007726f, +0.000330f, -0.005674f, +0.009512f, -0.001259f, +0.001832f, +0.004490f, -0.007475f, -0.001377f, + -0.004192f, -0.000594f, +0.000158f, +0.004237f, -0.002078f, +0.002341f, -0.000092f, +0.003031f, +0.000431f, +0.003004f, + -0.005224f, +0.000104f, -0.002580f, -0.000123f, +0.000433f, -0.001763f, +0.000113f, -0.001507f, -0.000996f, -0.003700f, + +0.003062f, -0.000772f, +0.001080f, +0.000959f, +0.001236f, +0.001969f, +0.003612f, +0.000249f, -0.000103f, -0.000805f, + +0.000468f, -0.000320f, -0.001596f, +0.001343f, +0.000100f, +0.001371f, -0.000397f, +0.000546f, -0.000076f, +0.000644f, + +0.000173f, -0.000391f, +0.000149f, +0.000842f, -0.000434f, +0.000118f, -0.000399f, +0.000466f, -0.000116f, +0.000374f, + -0.000174f, +0.000498f, -0.000572f, +0.000552f, +0.000187f, -0.000331f, +0.000165f, +0.000046f, +0.000543f, -0.000164f, + -0.000379f, -0.000085f, +0.000375f, -0.000336f, -0.000180f, +0.000121f, -0.000143f, +0.000098f, -0.000219f, +0.000151f, + -0.000041f, +0.000269f, -0.000214f, +0.000127f, +0.000113f, +0.000075f + }, + { + -0.000518f, +0.012393f, -0.040097f, -0.007977f, +0.002628f, -0.001288f, -0.000853f, -0.001374f, +0.000252f, +0.002057f, + -0.003147f, -0.001078f, -0.003822f, +0.006099f, -0.002791f, +0.011584f, -0.007033f, +0.001202f, -0.007114f, +0.001511f, + -0.000836f, -0.002650f, -0.000847f, -0.000140f, +0.006332f, -0.005513f, -0.003535f, +0.003057f, -0.005991f, +0.002371f, + -0.005815f, +0.009529f, -0.002437f, -0.003366f, +0.002936f, -0.003806f, +0.007170f, +0.003687f, +0.000507f, +0.001508f, + +0.000095f, +0.000455f, -0.001713f, +0.001192f, +0.000241f, -0.000224f, -0.000025f, -0.001255f, -0.000351f, -0.000536f, + +0.000692f, +0.000842f, +0.001400f, -0.000780f, -0.000354f, -0.000973f, +0.000192f, +0.000312f, -0.000172f, +0.000801f, + +0.001091f, -0.001278f, +0.000121f, -0.001031f, +0.001008f, -0.000216f, -0.000052f, +0.000316f, +0.000206f, -0.000112f, + +0.001053f, -0.000443f, -0.000357f, +0.000061f, +0.000024f, -0.000626f, -0.000026f, +0.000205f, -0.000368f, +0.000000f, + -0.000015f, +0.000254f, +0.000188f, +0.000116f, -0.000047f, +0.000098f, +0.000054f, -0.000244f, -0.000021f, +0.000036f, + -0.000074f, -0.000062f, +0.000214f, -0.000025f, +0.000093f, -0.000103f + }, + { + -0.009603f, +0.050413f, +0.043876f, -0.014723f, -0.015772f, +0.003756f, -0.003159f, -0.001619f, +0.002748f, -0.000759f, + +0.007562f, -0.008654f, -0.003566f, +0.004286f, -0.000820f, +0.000018f, +0.000499f, -0.017144f, -0.009450f, +0.000651f, + -0.014001f, +0.002084f, -0.003853f, +0.005215f, -0.001239f, -0.001366f, -0.000130f, -0.001928f, -0.006297f, -0.003809f, + +0.003843f, +0.000942f, -0.001473f, -0.002236f, -0.003773f, +0.004149f, +0.000504f, -0.006429f, -0.000550f, -0.003184f, + -0.001380f, +0.001032f, -0.002443f, +0.000970f, +0.000415f, +0.000910f, -0.002644f, -0.001605f, +0.000819f, +0.000331f, + +0.000535f, -0.001230f, -0.000392f, +0.000503f, -0.000229f, +0.000913f, +0.000001f, -0.000543f, -0.000177f, -0.000138f, + -0.000315f, +0.001808f, -0.000617f, -0.000284f, -0.000851f, +0.000575f, -0.001675f, +0.000474f, -0.000459f, +0.000226f, + -0.000903f, +0.000055f, -0.000064f, -0.000416f, -0.000525f, +0.000343f, +0.000441f, +0.000416f, -0.000515f, +0.000172f, + -0.000106f, +0.000263f, -0.000121f, -0.000285f, +0.000110f, -0.000331f, +0.000445f, -0.000515f, +0.000324f, -0.000018f, + -0.000035f, +0.000211f, -0.000031f, -0.000150f, +0.000229f, +0.000145f + }, + { + -0.003976f, +0.265165f, -0.022349f, +0.023520f, -0.000231f, -0.000559f, +0.001189f, -0.001886f, +0.001551f, +0.001705f, + -0.000290f, +0.006314f, -0.003556f, -0.007499f, -0.006117f, +0.004451f, +0.003070f, +0.009696f, +0.007238f, -0.001678f, + +0.002121f, +0.003032f, +0.002039f, -0.000813f, +0.002560f, +0.002685f, -0.000939f, +0.001265f, -0.002305f, +0.002100f, + +0.000195f, -0.001037f, +0.000886f, +0.000211f, +0.000918f, -0.001597f, +0.003429f, -0.000540f, -0.001150f, +0.005793f, + -0.002261f, +0.000320f, -0.003589f, +0.000897f, +0.001491f, -0.000852f, -0.000671f, -0.000457f, +0.001713f, -0.000262f, + +0.001079f, -0.001763f, -0.000614f, +0.000282f, +0.000764f, -0.000371f, -0.000208f, +0.000957f, -0.000705f, +0.000807f, + +0.000740f, -0.000252f, -0.000333f, +0.000279f, +0.000084f, +0.000169f, -0.000111f, +0.000514f, +0.000013f, +0.000683f, + -0.000168f, -0.000768f, -0.000314f, +0.000034f, +0.000474f, -0.000262f, +0.000105f, +0.000422f, -0.000002f, +0.000214f, + +0.000093f, +0.000523f, +0.000006f, -0.000049f, -0.000095f, -0.000125f, +0.000124f, -0.000136f, -0.000239f, +0.000299f, + +0.000020f, -0.000016f, +0.000068f, -0.000150f, +0.000314f, -0.000151f + }, + { + +0.002129f, -0.001042f, -0.005338f, -0.000369f, -0.000272f, +0.000219f, +0.002008f, +0.000611f, +0.001607f, +0.001014f, + -0.001188f, -0.001105f, +0.003195f, +0.001431f, +0.011216f, -0.013803f, -0.009144f, +0.042863f, -0.040981f, +0.002141f, + +0.001907f, -0.003787f, -0.005690f, -0.003289f, -0.002119f, +0.001713f, +0.002622f, +0.006554f, +0.000816f, +0.003937f, + -0.002826f, +0.002405f, -0.001360f, +0.005226f, +0.001943f, -0.002279f, -0.000267f, +0.002474f, +0.005604f, +0.003364f, + -0.002280f, -0.000249f, -0.002284f, -0.000880f, +0.001364f, +0.000546f, -0.002960f, +0.001202f, -0.001171f, +0.002035f, + -0.001900f, -0.000934f, +0.001733f, -0.001211f, +0.000776f, -0.000398f, +0.001532f, +0.000444f, -0.000312f, +0.000859f, + +0.000674f, -0.000786f, -0.000502f, +0.001506f, +0.000254f, -0.000225f, -0.000198f, +0.000613f, +0.000067f, -0.000129f, + -0.000137f, +0.000459f, -0.000333f, +0.000842f, +0.000175f, +0.000542f, -0.000164f, +0.000749f, +0.000426f, -0.000323f, + +0.000182f, +0.000007f, -0.000083f, -0.000058f, -0.000078f, -0.000356f, +0.000303f, -0.000241f, +0.000126f, +0.000391f, + -0.000191f, +0.000236f, +0.000008f, +0.000001f, -0.000193f, +0.000049f + }, + { + -0.028539f, +0.501921f, -0.030612f, -0.009238f, +0.008007f, -0.000745f, -0.000484f, +0.002922f, +0.003455f, -0.000641f, + +0.002956f, -0.001126f, +0.000820f, -0.001419f, +0.005692f, -0.001137f, -0.009988f, +0.001697f, +0.002952f, -0.000894f, + +0.003107f, -0.001016f, +0.001679f, -0.001908f, +0.001818f, -0.001656f, +0.000168f, +0.000005f, -0.001062f, +0.001247f, + +0.002245f, -0.003052f, -0.002745f, +0.001696f, +0.000885f, +0.002504f, +0.000491f, -0.000043f, +0.002718f, +0.000898f, + +0.005284f, -0.000859f, +0.000918f, -0.001605f, -0.006741f, +0.001133f, -0.003589f, +0.003837f, -0.001276f, -0.000047f, + +0.001782f, -0.001236f, +0.002378f, -0.000095f, +0.000839f, -0.000621f, -0.000147f, -0.001008f, +0.000726f, -0.000238f, + -0.001241f, +0.001716f, +0.000524f, +0.000026f, -0.000548f, +0.000372f, +0.000173f, -0.000155f, +0.000051f, -0.000600f, + +0.000455f, -0.000327f, +0.000661f, +0.000067f, -0.000405f, -0.000099f, -0.000029f, -0.000197f, +0.000066f, +0.000607f, + -0.000164f, +0.000214f, -0.000103f, +0.000307f, -0.000208f, +0.000461f, -0.000225f, -0.000177f, +0.000143f, -0.000109f, + -0.000110f, -0.000405f, +0.000196f, -0.000325f, +0.000238f, -0.000048f + }, + { + -0.000546f, +0.015852f, +0.003912f, +0.001967f, +0.000384f, +0.000126f, +0.001423f, +0.000459f, -0.000855f, +0.000084f, + -0.000013f, +0.000593f, +0.002192f, +0.007364f, +0.020585f, +0.005221f, +0.001532f, -0.006271f, +0.008116f, +0.007052f, + +0.004424f, -0.007363f, +0.009935f, +0.008282f, -0.000806f, -0.000204f, +0.004345f, -0.001146f, -0.006213f, +0.000535f, + -0.000721f, +0.005582f, +0.001601f, +0.000004f, -0.001111f, -0.001461f, +0.001870f, +0.000566f, +0.000152f, +0.001315f, + -0.002053f, -0.002015f, +0.002545f, +0.000396f, -0.002891f, -0.000387f, +0.000135f, -0.000151f, +0.000630f, -0.002406f, + +0.000931f, +0.000069f, +0.000397f, +0.000725f, -0.000202f, +0.002055f, -0.001301f, +0.000225f, +0.000930f, -0.000537f, + +0.000290f, -0.000621f, -0.000467f, +0.000663f, +0.000605f, -0.001367f, +0.000310f, +0.000260f, -0.000189f, +0.000598f, + +0.000058f, -0.000086f, +0.000306f, +0.000346f, +0.000185f, -0.000371f, +0.000168f, -0.000163f, +0.000116f, +0.000227f, + -0.000560f, -0.000184f, +0.000396f, -0.000275f, +0.000067f, +0.000057f, +0.000178f, -0.000133f, +0.000028f, -0.000200f, + -0.000341f, -0.000038f, -0.000062f, -0.000092f, +0.000071f, +0.000063f + }, + { + +0.008898f, -0.347228f, +0.057766f, +0.005939f, +0.006671f, +0.001156f, -0.001842f, +0.002094f, +0.000448f, -0.000059f, + +0.004381f, -0.003693f, -0.000559f, -0.006156f, +0.004765f, +0.001525f, -0.001519f, -0.000010f, +0.002583f, +0.001101f, + -0.005836f, +0.001946f, +0.003082f, +0.004457f, +0.001297f, -0.001842f, +0.002635f, -0.000584f, -0.000599f, +0.001632f, + -0.000842f, -0.002857f, +0.003564f, -0.005295f, +0.002161f, +0.006215f, -0.001249f, +0.003229f, -0.000233f, +0.005533f, + -0.003153f, -0.000837f, -0.002578f, +0.000398f, +0.002847f, -0.000272f, +0.000849f, -0.002032f, +0.001150f, +0.001190f, + +0.000211f, -0.000066f, +0.002291f, -0.001784f, +0.001504f, +0.000999f, -0.001093f, -0.000473f, -0.000496f, +0.000842f, + -0.001327f, +0.000076f, -0.000040f, -0.000327f, +0.001143f, +0.000387f, -0.000597f, +0.000521f, +0.000119f, -0.000454f, + -0.000299f, +0.000221f, +0.001682f, +0.000403f, -0.000132f, -0.000452f, +0.000478f, +0.000344f, +0.000129f, -0.000325f, + +0.000621f, -0.000189f, +0.000290f, -0.000183f, -0.000050f, +0.000054f, -0.000043f, +0.000168f, -0.000331f, +0.000263f, + +0.000091f, +0.000042f, -0.000305f, +0.000346f, -0.000339f, -0.000095f + }, + { + -0.000386f, +0.015138f, -0.014091f, -0.004742f, -0.000151f, -0.000114f, +0.001153f, +0.001462f, -0.000131f, -0.000146f, + -0.000907f, +0.000228f, +0.003558f, -0.005977f, -0.017343f, +0.000047f, -0.010770f, +0.018272f, -0.010934f, -0.000402f, + -0.004111f, +0.004929f, -0.000908f, -0.000256f, -0.002094f, +0.004513f, +0.002902f, -0.001286f, -0.001245f, +0.001951f, + -0.001919f, -0.002964f, +0.001524f, -0.002660f, -0.001833f, +0.000286f, -0.003810f, -0.001579f, -0.000431f, +0.002355f, + -0.001941f, -0.001444f, -0.000231f, +0.001030f, -0.002791f, -0.001075f, -0.001269f, -0.001215f, +0.002271f, -0.001985f, + +0.000591f, -0.000155f, +0.000233f, -0.000382f, -0.000669f, -0.000384f, -0.000561f, +0.002014f, +0.000709f, -0.000667f, + +0.000782f, -0.001412f, -0.000348f, +0.000153f, +0.000857f, -0.000418f, +0.000152f, -0.000678f, +0.000334f, +0.001225f, + +0.000308f, +0.000348f, +0.000111f, -0.000271f, +0.000422f, -0.000365f, +0.000269f, +0.000329f, +0.000077f, +0.000144f, + -0.000013f, -0.000787f, +0.000322f, -0.000175f, +0.000220f, -0.000103f, +0.000349f, -0.000135f, -0.000127f, +0.000045f, + +0.000008f, -0.000340f, +0.000175f, -0.000116f, +0.000336f, -0.000015f + }, + { + -0.019253f, +0.048452f, -0.012082f, -0.006452f, +0.005227f, +0.005448f, +0.009073f, +0.002028f, -0.000915f, +0.005495f, + +0.000399f, -0.005538f, -0.001663f, -0.000407f, +0.002562f, -0.001943f, +0.014919f, +0.004945f, -0.001704f, +0.000168f, + -0.003184f, -0.001689f, +0.005744f, +0.002686f, +0.001987f, +0.004009f, -0.000351f, -0.003349f, +0.002938f, +0.001968f, + +0.001918f, +0.004081f, +0.003236f, -0.004514f, +0.000138f, +0.002565f, -0.003467f, +0.001084f, +0.002716f, -0.000688f, + +0.001014f, -0.001786f, +0.000810f, -0.001426f, -0.001074f, +0.000185f, +0.000840f, -0.000843f, -0.002913f, +0.001638f, + -0.001442f, +0.000689f, +0.000341f, -0.000645f, -0.000088f, +0.001205f, -0.000375f, -0.000184f, -0.000446f, +0.000547f, + +0.000890f, -0.000190f, +0.000173f, +0.000357f, -0.000810f, +0.001016f, -0.000979f, +0.000150f, +0.000184f, +0.000041f, + +0.000448f, +0.000185f, +0.000161f, +0.000111f, +0.000148f, -0.000312f, +0.000261f, -0.000228f, +0.000465f, -0.000105f, + -0.000363f, +0.000053f, +0.000214f, +0.000057f, -0.000063f, +0.000257f, +0.000118f, -0.000082f, +0.000048f, +0.000201f, + -0.000274f, -0.000088f, -0.000019f, -0.000085f, +0.000081f, -0.000050f + }, + { + +0.000460f, +0.010453f, -0.005024f, -0.003855f, +0.003259f, -0.000703f, +0.003567f, +0.002239f, -0.000174f, -0.003209f, + +0.004625f, -0.003823f, -0.003952f, +0.016574f, -0.008101f, +0.004040f, +0.004578f, +0.001127f, +0.005858f, -0.006293f, + +0.006353f, +0.004516f, +0.005824f, +0.001418f, -0.003905f, +0.002191f, +0.001383f, +0.005211f, +0.000964f, +0.000848f, + -0.003747f, -0.006906f, +0.006400f, -0.002438f, -0.003466f, -0.004893f, -0.005270f, +0.002283f, -0.001045f, -0.001265f, + -0.002397f, -0.000764f, +0.003588f, -0.001435f, -0.000614f, +0.000474f, -0.003157f, +0.001383f, +0.000653f, +0.000481f, + -0.000672f, +0.000182f, +0.000151f, +0.000566f, +0.002116f, -0.000323f, -0.001077f, -0.000481f, -0.000738f, +0.000491f, + +0.001757f, -0.000895f, -0.000282f, +0.000569f, -0.000156f, +0.000032f, +0.000733f, +0.000230f, -0.000316f, +0.000821f, + -0.000387f, -0.000377f, -0.000122f, +0.000277f, -0.000348f, -0.000316f, +0.000090f, -0.000007f, +0.000108f, +0.000069f, + -0.000131f, -0.000223f, +0.000196f, -0.000400f, +0.000024f, +0.000081f, -0.000332f, +0.000134f, -0.000014f, +0.000038f, + +0.000201f, +0.000003f, -0.000185f, -0.000019f, +0.000081f, +0.000069f + }, + { + +0.016913f, -0.109002f, +0.005705f, -0.003169f, -0.003336f, -0.008570f, +0.006991f, -0.000073f, -0.001304f, +0.004666f, + -0.006009f, +0.006915f, -0.005299f, -0.009520f, +0.001728f, +0.002311f, +0.001901f, +0.004093f, +0.002174f, -0.002218f, + +0.000112f, -0.004084f, +0.000200f, +0.000376f, +0.000337f, +0.003933f, +0.001750f, -0.000832f, -0.002381f, +0.001427f, + -0.000143f, -0.000234f, +0.000926f, +0.000252f, +0.000170f, -0.002414f, +0.002425f, +0.000026f, +0.001784f, -0.001546f, + +0.001057f, -0.000328f, -0.000524f, -0.002253f, +0.003721f, -0.001185f, +0.000197f, -0.000053f, +0.002792f, -0.000242f, + -0.000896f, -0.001025f, +0.000067f, +0.000934f, -0.000464f, +0.002591f, -0.000160f, +0.000062f, -0.000435f, +0.000766f, + -0.000737f, +0.000106f, +0.000037f, +0.000089f, +0.000137f, -0.000035f, -0.000026f, -0.000607f, +0.000321f, +0.000083f, + -0.000060f, +0.000181f, +0.000400f, +0.000239f, +0.000045f, +0.000057f, +0.000243f, +0.000272f, -0.000266f, +0.000415f, + +0.000005f, -0.000025f, -0.000064f, +0.000199f, -0.000228f, +0.000083f, -0.000242f, -0.000225f, +0.000186f, -0.000183f, + -0.000013f, +0.000094f, +0.000108f, -0.000163f, -0.000062f, +0.000152f + }, + { + +0.001010f, -0.014305f, -0.007476f, +0.000630f, -0.003075f, +0.000397f, +0.000633f, -0.001236f, +0.003197f, -0.000555f, + +0.002379f, +0.004060f, -0.021809f, +0.055547f, -0.012359f, -0.008001f, +0.005010f, +0.000326f, -0.002707f, +0.003834f, + +0.003696f, -0.007020f, +0.016722f, -0.001566f, -0.004603f, +0.004901f, +0.003378f, -0.007589f, -0.002211f, +0.001031f, + -0.004576f, +0.002005f, -0.002151f, -0.001512f, -0.002351f, +0.000300f, +0.000071f, +0.001497f, +0.000952f, -0.000917f, + +0.004554f, +0.001518f, -0.002986f, +0.000030f, -0.003719f, +0.000750f, +0.001467f, +0.000966f, -0.000717f, -0.001814f, + -0.000045f, -0.001337f, -0.000773f, -0.001343f, +0.001082f, -0.001050f, -0.000122f, -0.000620f, +0.000763f, -0.000915f, + +0.000709f, -0.000871f, -0.000973f, -0.000349f, -0.000902f, -0.000105f, +0.000397f, -0.000640f, -0.001202f, +0.000119f, + +0.000022f, +0.000069f, +0.000668f, +0.000080f, -0.000170f, -0.000264f, -0.000158f, -0.000119f, -0.000266f, +0.000105f, + -0.000032f, -0.000422f, -0.000242f, +0.000143f, -0.000030f, +0.000086f, +0.000107f, -0.000286f, +0.000412f, -0.000092f, + +0.000161f, +0.000260f, -0.000022f, +0.000132f, +0.000111f, -0.000015f + }, + { + -0.005083f, -0.102358f, +0.001738f, +0.002791f, +0.002506f, +0.014414f, -0.012344f, -0.001490f, +0.001710f, -0.000374f, + +0.007038f, +0.000062f, +0.000098f, +0.001461f, -0.039303f, -0.003859f, +0.011234f, +0.004889f, -0.003542f, +0.005781f, + -0.002833f, +0.001945f, -0.002141f, +0.000877f, -0.000574f, +0.000006f, +0.001919f, +0.002907f, +0.002686f, -0.002259f, + +0.002757f, -0.002232f, +0.001177f, +0.000240f, +0.000220f, -0.000790f, -0.000558f, +0.001522f, -0.000666f, +0.000016f, + +0.000256f, +0.002811f, -0.000788f, +0.000524f, -0.001954f, -0.000145f, -0.001280f, -0.000526f, +0.000707f, +0.000817f, + +0.000210f, -0.001308f, +0.002006f, +0.000313f, -0.000431f, +0.000831f, -0.001417f, +0.001056f, -0.000944f, +0.001187f, + -0.000960f, +0.000276f, -0.000916f, -0.000757f, -0.000347f, +0.000072f, -0.000155f, -0.000149f, +0.000291f, +0.000487f, + -0.000691f, +0.000438f, -0.000624f, -0.000542f, +0.000328f, -0.000160f, +0.000063f, -0.000039f, +0.000130f, -0.000016f, + +0.000058f, +0.000249f, -0.000496f, +0.000210f, -0.000266f, +0.000585f, +0.000418f, -0.000100f, -0.000316f, +0.000152f, + -0.000199f, +0.000220f, +0.000167f, +0.000014f, +0.000218f, -0.000210f + }, + { + -0.000865f, -0.012041f, +0.003018f, -0.001566f, -0.000454f, -0.000476f, -0.000190f, -0.001797f, -0.002753f, -0.003892f, + -0.003038f, -0.002395f, +0.004046f, -0.012473f, -0.086283f, +0.006517f, +0.009379f, -0.008373f, +0.006814f, +0.003061f, + +0.002717f, +0.001674f, +0.005562f, -0.008434f, -0.000888f, +0.004423f, -0.007170f, -0.000297f, +0.001511f, +0.004237f, + -0.001359f, +0.002035f, -0.001240f, +0.003656f, -0.003239f, +0.001512f, -0.000748f, -0.000730f, +0.001188f, +0.000367f, + +0.002421f, -0.000829f, +0.002028f, -0.001631f, +0.000001f, -0.000491f, -0.000486f, -0.001353f, -0.000328f, +0.002048f, + -0.002344f, +0.000562f, +0.000172f, -0.003506f, +0.001486f, +0.000197f, +0.001292f, -0.001000f, -0.000423f, +0.000623f, + +0.000450f, -0.000868f, +0.000167f, +0.000669f, -0.000096f, +0.000149f, -0.000020f, -0.000300f, +0.000850f, -0.000255f, + -0.000134f, -0.000136f, -0.000147f, +0.000316f, -0.000050f, -0.000033f, -0.000418f, -0.000147f, -0.000199f, +0.000316f, + -0.000389f, +0.000159f, +0.000184f, +0.000018f, +0.000008f, +0.000268f, -0.000165f, +0.000021f, +0.000068f, -0.000220f, + -0.000104f, +0.000121f, -0.000059f, +0.000141f, -0.000333f, -0.000108f + } + }, + { + { + -0.019346f, -0.070846f, -0.004744f, -0.012389f, -0.006706f, -0.001654f, -0.001557f, -0.004012f, +0.001654f, -0.000930f, + -0.005206f, -0.003281f, +0.000292f, -0.001747f, +0.000857f, +0.000266f, +0.002752f, +0.000281f, +0.001740f, -0.008821f, + -0.002064f, +0.001985f, +0.000821f, +0.001452f, -0.000491f, -0.000523f, +0.004712f, +0.002324f, +0.000533f, -0.000758f, + -0.000689f, -0.000464f, -0.000680f, -0.000438f, -0.000967f, +0.000070f, +0.000109f, -0.002286f, -0.000523f, -0.000444f, + +0.000216f, -0.001296f, +0.000602f, +0.000957f, +0.000631f, +0.002403f, +0.002832f, +0.001688f, -0.000094f, -0.000680f, + -0.001002f, -0.000721f, +0.000237f, +0.000825f, +0.000493f, +0.000511f, -0.000018f, +0.001352f, +0.000687f, +0.000191f, + -0.000490f, -0.000060f, +0.000761f, +0.000676f, -0.000487f, +0.000734f, -0.000557f, +0.000348f, +0.000264f, +0.000149f, + +0.000227f, +0.000096f, -0.000195f, +0.000329f, +0.000092f, +0.000037f, +0.000027f, +0.000231f, +0.000161f, -0.000369f, + -0.000344f, -0.000062f, +0.000061f, -0.000148f, -0.000186f, +0.000217f, -0.000002f, -0.000013f, -0.000047f, -0.000079f, + -0.000041f, +0.000124f, -0.000107f, +0.000071f, +0.000138f, +0.000074f + }, + { + -0.002911f, -0.033496f, -0.007489f, -0.002753f, -0.005895f, -0.000670f, -0.001271f, -0.001552f, -0.001030f, -0.000375f, + -0.000084f, -0.001240f, -0.002437f, +0.000138f, +0.005667f, +0.002715f, +0.001926f, -0.002409f, +0.001156f, -0.001006f, + +0.002681f, -0.003402f, -0.000432f, -0.001620f, +0.003073f, +0.000234f, -0.001942f, +0.000302f, -0.004267f, -0.001848f, + -0.002580f, +0.001801f, -0.001413f, -0.000840f, +0.002227f, +0.001965f, +0.003950f, +0.001923f, +0.000366f, +0.002170f, + -0.000971f, -0.000852f, -0.000181f, +0.000538f, +0.000508f, +0.000350f, -0.000735f, -0.000995f, -0.000640f, -0.000653f, + +0.000114f, +0.000461f, +0.000480f, -0.000278f, -0.000575f, +0.001044f, +0.000341f, -0.000231f, -0.000500f, +0.000561f, + +0.000007f, -0.000893f, +0.000125f, -0.000201f, -0.000228f, +0.000026f, +0.000298f, +0.000054f, +0.000229f, +0.000144f, + +0.000181f, -0.000083f, +0.000116f, +0.000022f, -0.000503f, -0.000213f, +0.000143f, +0.000061f, -0.000163f, -0.000304f, + +0.000127f, +0.000341f, +0.000259f, +0.000009f, -0.000014f, -0.000109f, -0.000055f, +0.000043f, -0.000155f, -0.000036f, + +0.000106f, +0.000056f, -0.000024f, -0.000114f, -0.000080f, +0.000040f + }, + { + +0.012464f, +0.097402f, -0.010196f, -0.028237f, -0.007759f, -0.000222f, -0.001613f, -0.000268f, +0.001068f, +0.004997f, + -0.000375f, -0.008183f, -0.001462f, +0.001992f, +0.001037f, -0.005239f, -0.000248f, -0.006369f, -0.010198f, +0.000152f, + -0.011961f, +0.001207f, +0.000411f, +0.002283f, +0.000891f, -0.001902f, -0.001562f, -0.001586f, -0.004795f, -0.002136f, + +0.000124f, +0.000742f, -0.001283f, -0.000462f, -0.001618f, +0.001096f, -0.001740f, -0.001642f, -0.001381f, -0.002354f, + -0.001606f, +0.000915f, +0.000076f, +0.000152f, -0.000456f, -0.001273f, -0.000624f, -0.001463f, -0.000046f, +0.000817f, + -0.000025f, -0.001232f, -0.001233f, -0.000394f, +0.000464f, +0.001211f, -0.000417f, +0.000336f, -0.000366f, +0.000377f, + -0.000394f, -0.000203f, +0.000037f, -0.000389f, -0.000078f, -0.000468f, -0.000701f, -0.000315f, -0.000116f, -0.000107f, + -0.000427f, -0.000325f, -0.000717f, -0.000078f, -0.000130f, +0.000271f, +0.000581f, +0.000077f, -0.000282f, +0.000272f, + +0.000147f, +0.000069f, -0.000217f, -0.000128f, -0.000059f, -0.000237f, +0.000031f, -0.000082f, +0.000078f, +0.000035f, + +0.000193f, +0.000130f, +0.000195f, +0.000023f, +0.000095f, +0.000065f + }, + { + +0.023111f, +0.165959f, +0.028872f, +0.016365f, +0.001918f, +0.000995f, -0.000641f, -0.000760f, -0.000088f, +0.001985f, + +0.002499f, +0.001781f, -0.001691f, -0.004048f, -0.002191f, +0.000884f, +0.005249f, +0.010346f, +0.002042f, +0.000016f, + -0.000398f, +0.004152f, +0.000983f, +0.001494f, +0.002521f, +0.002834f, -0.000077f, +0.000738f, -0.001263f, -0.000685f, + +0.000456f, +0.001271f, -0.000906f, -0.000265f, +0.000070f, +0.000683f, +0.000508f, -0.000225f, +0.000525f, +0.002030f, + +0.000437f, +0.000317f, -0.002474f, -0.000421f, +0.000320f, -0.000859f, +0.000034f, -0.000250f, +0.002029f, +0.000743f, + -0.000748f, -0.000783f, -0.000043f, -0.000645f, -0.000314f, +0.000035f, +0.000085f, +0.000651f, +0.000027f, +0.000548f, + +0.000317f, -0.000620f, +0.000219f, -0.000030f, -0.000040f, -0.000269f, +0.000349f, -0.000032f, +0.000203f, +0.000376f, + -0.000036f, -0.000218f, +0.000211f, +0.000152f, -0.000095f, -0.000209f, +0.000022f, +0.000221f, +0.000258f, +0.000014f, + +0.000206f, +0.000213f, +0.000156f, -0.000078f, -0.000085f, +0.000046f, +0.000122f, -0.000142f, +0.000071f, +0.000004f, + -0.000009f, -0.000112f, +0.000096f, +0.000001f, +0.000021f, +0.000108f + }, + { + -0.002406f, -0.003376f, +0.001879f, -0.000043f, -0.000718f, +0.000604f, +0.001835f, +0.000019f, +0.000675f, +0.000530f, + +0.000784f, +0.000732f, -0.001829f, -0.002083f, +0.007709f, +0.001193f, +0.004648f, -0.012497f, -0.000959f, -0.001256f, + +0.004435f, -0.004142f, -0.008467f, +0.001007f, +0.001987f, +0.001634f, +0.002046f, +0.002474f, +0.002308f, -0.001103f, + +0.001870f, +0.003444f, +0.001146f, -0.000181f, -0.000485f, -0.000001f, +0.000413f, +0.002408f, +0.004226f, +0.001914f, + +0.000222f, -0.002136f, -0.000416f, -0.000384f, +0.000058f, -0.001195f, -0.001702f, -0.000589f, -0.000333f, +0.000236f, + +0.000231f, -0.000468f, +0.000034f, +0.000242f, +0.000070f, -0.000224f, +0.000960f, -0.000234f, -0.000506f, +0.000857f, + +0.000335f, +0.000187f, -0.000084f, +0.000457f, -0.000335f, -0.000770f, +0.000367f, +0.000164f, +0.000281f, -0.000051f, + -0.000374f, +0.000500f, +0.000325f, +0.000104f, +0.000274f, +0.000235f, +0.000288f, +0.000315f, +0.000137f, -0.000112f, + -0.000009f, +0.000088f, +0.000143f, -0.000177f, -0.000082f, -0.000063f, -0.000104f, +0.000055f, +0.000010f, +0.000192f, + +0.000085f, -0.000068f, -0.000007f, +0.000020f, -0.000017f, +0.000037f + }, + { + +0.052529f, +0.306525f, +0.036302f, -0.005514f, +0.002391f, +0.001976f, +0.000433f, +0.000292f, +0.003139f, -0.000329f, + -0.001989f, +0.001496f, +0.000407f, +0.001226f, +0.000988f, -0.000064f, -0.004206f, -0.000418f, -0.000273f, +0.001010f, + +0.001141f, -0.000685f, +0.002382f, -0.000648f, +0.000519f, -0.001570f, -0.000298f, -0.000146f, -0.001390f, -0.000047f, + +0.002655f, -0.002114f, +0.000213f, -0.001377f, +0.003837f, +0.001529f, +0.001092f, +0.000022f, +0.001574f, +0.001918f, + +0.001599f, +0.000029f, -0.000973f, -0.003213f, -0.002237f, -0.001043f, +0.000379f, -0.000146f, -0.000171f, +0.001022f, + +0.000147f, +0.000395f, +0.000773f, +0.000053f, +0.000563f, -0.000273f, -0.000362f, -0.001024f, +0.000951f, +0.000303f, + -0.000628f, +0.000704f, +0.000090f, -0.000055f, -0.000391f, +0.000108f, +0.000046f, -0.000027f, +0.000312f, -0.000518f, + -0.000107f, -0.000056f, +0.000089f, -0.000062f, +0.000026f, -0.000279f, -0.000109f, +0.000052f, +0.000163f, +0.000260f, + +0.000021f, +0.000302f, +0.000227f, +0.000197f, -0.000019f, +0.000005f, -0.000002f, +0.000009f, -0.000098f, -0.000023f, + -0.000257f, -0.000144f, +0.000016f, -0.000025f, +0.000085f, -0.000060f + }, + { + +0.001036f, +0.009360f, +0.004391f, +0.002329f, +0.000002f, +0.000316f, +0.001248f, -0.000038f, -0.000487f, +0.000271f, + -0.000815f, +0.000979f, +0.000053f, +0.009372f, +0.017214f, +0.006689f, +0.003709f, -0.000601f, +0.002974f, +0.014285f, + +0.004246f, -0.001693f, +0.006202f, +0.006402f, -0.004152f, +0.002208f, +0.003421f, -0.002880f, -0.003241f, -0.001217f, + +0.002397f, +0.001387f, +0.000670f, +0.002096f, -0.000812f, +0.000682f, -0.000217f, +0.000689f, +0.000757f, -0.000848f, + -0.000694f, +0.000233f, +0.000487f, -0.001127f, -0.001019f, -0.000372f, -0.000229f, +0.000371f, +0.000165f, -0.000997f, + +0.000129f, +0.000107f, +0.000408f, -0.000188f, +0.000820f, +0.000274f, +0.000450f, -0.000250f, +0.000297f, +0.000852f, + -0.000076f, +0.000332f, -0.000171f, +0.000585f, -0.000183f, +0.000146f, -0.000168f, -0.000346f, -0.000163f, +0.000743f, + +0.000602f, -0.000161f, -0.000290f, +0.000374f, -0.000226f, -0.000308f, +0.000081f, +0.000056f, -0.000007f, -0.000236f, + -0.000319f, -0.000138f, +0.000180f, -0.000012f, +0.000035f, -0.000077f, +0.000156f, +0.000076f, +0.000037f, -0.000155f, + -0.000079f, +0.000031f, -0.000099f, -0.000092f, +0.000081f, +0.000030f + }, + { + -0.024123f, -0.196398f, -0.009694f, +0.005852f, +0.001671f, +0.000379f, -0.001376f, +0.001721f, +0.000260f, +0.000423f, + +0.001107f, -0.001360f, -0.000691f, -0.002024f, -0.001042f, +0.001981f, -0.001388f, -0.001014f, +0.001218f, +0.001494f, + -0.002801f, +0.000806f, -0.000000f, +0.003601f, +0.001770f, +0.000036f, -0.000217f, +0.001214f, -0.001652f, +0.000186f, + -0.000290f, +0.001288f, +0.000710f, -0.003016f, -0.000941f, -0.000007f, +0.000776f, +0.002857f, +0.002363f, +0.000351f, + -0.001586f, -0.001703f, -0.000668f, +0.001493f, +0.001978f, -0.000605f, -0.000354f, +0.001211f, +0.000116f, -0.000540f, + +0.000881f, -0.000286f, +0.001098f, +0.000920f, -0.000364f, +0.000493f, -0.000412f, -0.000497f, +0.000425f, -0.000347f, + -0.000288f, +0.000041f, -0.000576f, +0.000150f, +0.000956f, -0.000027f, +0.000039f, +0.000088f, +0.000137f, +0.000270f, + +0.000069f, +0.000301f, +0.000916f, +0.000211f, -0.000290f, -0.000118f, +0.000378f, +0.000057f, +0.000246f, +0.000232f, + +0.000116f, +0.000222f, +0.000129f, +0.000080f, +0.000036f, +0.000081f, +0.000019f, -0.000234f, -0.000199f, -0.000010f, + +0.000195f, +0.000049f, -0.000063f, +0.000000f, -0.000167f, -0.000187f + }, + { + +0.001816f, -0.006683f, -0.006273f, -0.000596f, -0.001315f, +0.000320f, +0.001011f, +0.000911f, -0.000005f, -0.001099f, + -0.001716f, +0.002322f, +0.000427f, -0.001779f, -0.012404f, -0.006216f, +0.003667f, +0.001871f, -0.001158f, +0.003126f, + -0.004531f, +0.001784f, +0.000843f, +0.004448f, -0.002042f, +0.001201f, -0.001168f, +0.000870f, +0.001526f, -0.001255f, + -0.005183f, -0.000597f, +0.000216f, +0.000804f, -0.001395f, -0.002860f, +0.000099f, -0.002687f, -0.001905f, +0.001390f, + -0.001993f, -0.001158f, +0.000322f, -0.002060f, -0.002269f, -0.000304f, -0.001098f, -0.000243f, -0.000762f, +0.000954f, + +0.000313f, -0.000250f, +0.001028f, -0.000652f, -0.001172f, -0.000366f, -0.000133f, +0.000005f, +0.000431f, -0.000039f, + +0.000313f, -0.000029f, -0.000492f, +0.000434f, +0.001032f, +0.000635f, -0.000399f, -0.000127f, +0.000194f, +0.000522f, + +0.000797f, +0.000335f, +0.000162f, +0.000103f, -0.000345f, -0.000136f, +0.000225f, +0.000070f, +0.000202f, +0.000078f, + -0.000017f, -0.000173f, +0.000266f, -0.000014f, -0.000108f, +0.000091f, -0.000112f, -0.000276f, -0.000127f, -0.000030f, + +0.000023f, -0.000078f, +0.000032f, -0.000062f, +0.000031f, -0.000011f + }, + { + +0.015873f, +0.022336f, -0.016643f, -0.004063f, +0.000428f, +0.007099f, +0.009186f, +0.003728f, -0.001637f, +0.001389f, + +0.000186f, -0.006024f, +0.000869f, -0.002496f, -0.002703f, +0.001918f, +0.005901f, +0.006664f, -0.001251f, +0.000168f, + -0.002087f, +0.001740f, +0.003323f, +0.003235f, +0.001613f, +0.001492f, +0.000718f, -0.000130f, -0.000323f, +0.002741f, + +0.003288f, +0.004657f, +0.001254f, -0.002478f, -0.002799f, +0.000724f, -0.002126f, +0.001746f, +0.001150f, +0.001113f, + -0.001719f, -0.000842f, -0.000172f, -0.001158f, -0.000577f, -0.001007f, -0.000630f, -0.000351f, -0.001482f, -0.001883f, + +0.000279f, +0.000586f, -0.000644f, -0.000148f, +0.000407f, +0.000798f, +0.000231f, +0.000128f, -0.000146f, +0.000016f, + +0.000697f, +0.000441f, -0.000030f, +0.000077f, -0.000373f, +0.000087f, -0.000115f, +0.000160f, +0.000184f, -0.000109f, + -0.000044f, +0.000527f, +0.000158f, +0.000132f, -0.000047f, -0.000036f, +0.000088f, +0.000009f, +0.000114f, +0.000175f, + -0.000022f, +0.000050f, +0.000086f, -0.000082f, +0.000024f, -0.000045f, -0.000098f, -0.000013f, -0.000113f, +0.000047f, + -0.000087f, -0.000069f, +0.000013f, -0.000005f, -0.000047f, -0.000104f + }, + { + -0.001356f, -0.001427f, -0.000432f, +0.005615f, -0.000886f, +0.000168f, +0.002574f, +0.001250f, +0.000027f, -0.001732f, + +0.001608f, +0.001309f, +0.002232f, +0.004428f, -0.001969f, +0.005531f, +0.001989f, -0.001259f, +0.002273f, +0.002035f, + +0.004451f, +0.001020f, +0.005846f, +0.001113f, -0.001701f, +0.001410f, +0.000750f, +0.001268f, +0.000612f, +0.000813f, + -0.002884f, -0.000141f, +0.001150f, -0.000279f, -0.004875f, -0.004575f, -0.001175f, -0.000706f, -0.000430f, +0.000138f, + -0.002029f, -0.000196f, +0.000333f, -0.000852f, -0.000053f, -0.001097f, +0.000100f, -0.000391f, -0.000505f, +0.000820f, + -0.000216f, +0.000034f, +0.000263f, +0.001585f, +0.001867f, -0.000330f, -0.000718f, -0.000262f, -0.000708f, +0.000424f, + +0.000575f, -0.000482f, +0.000165f, +0.000161f, +0.000168f, -0.000250f, +0.000025f, -0.000053f, +0.000024f, +0.000182f, + +0.000130f, -0.000408f, -0.000249f, +0.000146f, -0.000414f, -0.000199f, +0.000276f, +0.000358f, +0.000172f, -0.000104f, + -0.000065f, -0.000075f, -0.000113f, -0.000056f, +0.000135f, -0.000029f, -0.000149f, +0.000028f, +0.000149f, +0.000159f, + +0.000104f, -0.000016f, -0.000085f, -0.000107f, +0.000065f, +0.000015f + }, + { + -0.018495f, -0.042886f, -0.006205f, -0.002288f, -0.004624f, +0.002863f, -0.001334f, -0.001100f, -0.000530f, +0.003028f, + +0.002180f, -0.000069f, -0.002001f, -0.002132f, -0.000540f, +0.002920f, +0.001235f, +0.001979f, +0.002329f, -0.000369f, + -0.001306f, -0.002582f, -0.001349f, +0.000013f, +0.002198f, +0.000869f, +0.001005f, -0.000666f, -0.001149f, +0.001681f, + +0.002561f, -0.001541f, -0.000716f, +0.000408f, -0.000035f, +0.000906f, +0.001433f, +0.002552f, +0.001633f, -0.000242f, + -0.000784f, +0.000334f, -0.003841f, +0.001483f, +0.001421f, +0.000089f, +0.000846f, +0.000031f, +0.000817f, +0.000049f, + -0.000715f, +0.000079f, -0.000478f, +0.000064f, +0.000302f, +0.001224f, +0.000196f, -0.000350f, +0.000273f, +0.000464f, + -0.000143f, -0.000017f, -0.000042f, +0.000066f, -0.000126f, -0.000108f, -0.000034f, +0.000215f, +0.000123f, -0.000216f, + +0.000108f, +0.000318f, +0.000190f, +0.000049f, -0.000056f, +0.000197f, +0.000161f, +0.000268f, +0.000144f, +0.000009f, + +0.000152f, -0.000017f, -0.000114f, -0.000028f, -0.000090f, -0.000070f, +0.000092f, -0.000238f, -0.000056f, -0.000154f, + -0.000094f, +0.000065f, -0.000034f, +0.000000f, -0.000086f, +0.000014f + }, + { + -0.000825f, -0.011728f, -0.003656f, -0.004460f, -0.002906f, -0.000297f, -0.001301f, +0.000171f, +0.000747f, +0.002489f, + +0.000790f, +0.000711f, +0.014097f, -0.003255f, -0.002093f, -0.007565f, +0.000433f, -0.000538f, -0.000115f, -0.000261f, + +0.004834f, -0.005884f, +0.011955f, +0.001970f, +0.003349f, -0.003127f, -0.000804f, -0.001522f, -0.005587f, -0.001177f, + -0.001602f, +0.000930f, -0.001087f, -0.001927f, +0.001576f, +0.000477f, +0.001486f, -0.000858f, +0.000588f, +0.000850f, + +0.002086f, +0.000527f, -0.001749f, -0.000072f, -0.001559f, -0.001391f, +0.000430f, -0.000434f, +0.000353f, -0.000674f, + -0.001027f, -0.001477f, -0.001277f, -0.000989f, +0.000360f, -0.000322f, -0.000909f, +0.000147f, +0.000058f, -0.000294f, + +0.001077f, -0.000679f, -0.001404f, -0.001031f, -0.000375f, -0.000176f, +0.000164f, -0.000652f, -0.000484f, +0.000065f, + -0.000170f, +0.000344f, -0.000132f, +0.000300f, +0.000176f, -0.000520f, -0.000432f, -0.000311f, +0.000230f, -0.000102f, + +0.000109f, -0.000116f, +0.000019f, +0.000295f, -0.000110f, +0.000019f, -0.000119f, -0.000163f, +0.000170f, +0.000202f, + +0.000054f, +0.000094f, -0.000106f, +0.000089f, +0.000125f, +0.000009f + }, + { + -0.009229f, -0.075174f, -0.010230f, +0.004897f, +0.003371f, +0.002754f, -0.002010f, -0.000023f, +0.001601f, +0.000718f, + +0.004941f, +0.000539f, -0.000449f, -0.011351f, -0.013371f, +0.002010f, -0.000024f, +0.003986f, +0.003436f, -0.000985f, + -0.000768f, +0.001651f, +0.000520f, -0.002339f, -0.001100f, -0.000913f, +0.002332f, +0.002216f, +0.002005f, -0.002338f, + +0.001002f, -0.001398f, +0.000586f, +0.002727f, -0.001833f, +0.001206f, +0.000115f, +0.002081f, +0.000424f, +0.000561f, + -0.000203f, +0.002456f, -0.000574f, -0.000303f, -0.000366f, -0.000859f, -0.000202f, -0.001274f, +0.000460f, +0.000563f, + +0.000583f, -0.000397f, +0.000466f, +0.000986f, +0.000500f, +0.000923f, -0.000182f, -0.000023f, -0.000542f, -0.000095f, + +0.000399f, -0.000452f, -0.000610f, -0.000011f, -0.000035f, +0.000108f, +0.000259f, -0.000053f, -0.000048f, +0.000181f, + +0.000307f, -0.000214f, -0.000231f, -0.000215f, -0.000059f, +0.000154f, -0.000043f, +0.000017f, +0.000129f, +0.000335f, + +0.000171f, +0.000036f, +0.000019f, +0.000223f, -0.000010f, +0.000203f, +0.000216f, -0.000037f, -0.000187f, -0.000061f, + +0.000036f, +0.000139f, +0.000063f, +0.000077f, +0.000106f, -0.000150f + }, + { + +0.000443f, -0.007169f, -0.003063f, +0.000430f, -0.002433f, +0.000532f, -0.000322f, -0.001327f, -0.002358f, -0.001941f, + -0.002785f, -0.001119f, +0.004188f, -0.028627f, -0.056429f, -0.003725f, +0.004667f, -0.001723f, -0.001632f, +0.013346f, + +0.004962f, -0.003426f, -0.000922f, -0.003926f, +0.001386f, -0.000656f, -0.003280f, +0.000221f, +0.001540f, +0.004931f, + -0.002651f, +0.001159f, +0.000366f, +0.000174f, -0.001636f, -0.000543f, -0.000899f, -0.000942f, +0.001587f, +0.001467f, + -0.000725f, -0.000222f, +0.000952f, -0.001092f, +0.000027f, +0.000495f, -0.000547f, +0.000172f, -0.001577f, -0.000361f, + -0.000190f, -0.000592f, -0.000480f, -0.000994f, -0.000005f, +0.000377f, -0.000081f, -0.000914f, -0.000161f, -0.000012f, + -0.000136f, -0.000456f, +0.000653f, -0.000037f, +0.000089f, +0.000078f, -0.000095f, +0.000359f, +0.000160f, +0.000092f, + -0.000146f, +0.000021f, -0.000121f, +0.000205f, +0.000013f, -0.000157f, -0.000113f, -0.000345f, -0.000180f, +0.000119f, + +0.000018f, +0.000105f, +0.000123f, +0.000103f, +0.000039f, +0.000070f, -0.000147f, -0.000053f, +0.000081f, -0.000106f, + -0.000101f, +0.000086f, +0.000021f, -0.000132f, -0.000165f, -0.000150f + } + }, + { + { + +0.021392f, +0.014473f, +0.037566f, -0.008558f, +0.001322f, +0.000248f, +0.000010f, -0.001830f, +0.001227f, -0.000610f, + +0.001753f, +0.001447f, +0.000888f, -0.001346f, -0.000940f, +0.000218f, -0.000182f, -0.003310f, +0.005138f, -0.003851f, + -0.000571f, +0.000979f, +0.000394f, -0.000496f, -0.000413f, -0.000663f, +0.002433f, -0.000941f, -0.000702f, +0.000430f, + +0.000766f, -0.001283f, +0.000691f, +0.000281f, +0.000027f, -0.001033f, +0.000350f, -0.000455f, -0.000272f, +0.000952f, + +0.000744f, -0.001105f, -0.000040f, -0.000598f, -0.001013f, +0.001299f, -0.000025f, +0.001024f, +0.000789f, -0.000487f, + -0.000391f, -0.000432f, +0.000178f, +0.000417f, +0.000182f, +0.000266f, -0.000146f, +0.000843f, +0.000273f, -0.000182f, + -0.000227f, -0.000334f, +0.000165f, +0.000163f, -0.000389f, +0.000920f, -0.000545f, +0.000343f, +0.000220f, +0.000078f, + +0.000028f, -0.000116f, -0.000022f, +0.000063f, -0.000130f, +0.000125f, +0.000147f, +0.000249f, -0.000188f, -0.000139f, + -0.000137f, +0.000037f, +0.000187f, +0.000073f, -0.000078f, +0.000031f, +0.000149f, -0.000003f, -0.000027f, -0.000020f, + -0.000007f, -0.000073f, -0.000019f, +0.000036f, +0.000026f, -0.000069f + }, + { + +0.003603f, -0.030156f, -0.003247f, +0.005645f, -0.000678f, +0.000475f, -0.000504f, -0.000114f, +0.000425f, -0.000748f, + +0.000360f, -0.000193f, -0.001881f, -0.003009f, +0.003464f, -0.004102f, -0.000791f, +0.000810f, +0.010399f, +0.003323f, + +0.001556f, -0.002736f, -0.000912f, -0.002481f, +0.000513f, +0.000388f, -0.002237f, +0.002043f, -0.001606f, -0.002151f, + -0.001233f, +0.001551f, +0.000730f, +0.001626f, +0.000975f, +0.001430f, +0.000451f, -0.001102f, -0.000185f, +0.000991f, + -0.001122f, +0.000192f, -0.000208f, +0.000902f, +0.000050f, +0.000321f, +0.000078f, +0.000572f, -0.000308f, -0.000156f, + +0.000507f, -0.000059f, +0.000015f, +0.000075f, -0.000025f, +0.000473f, +0.000172f, +0.000079f, -0.000367f, +0.000003f, + -0.000120f, -0.000213f, +0.000340f, +0.000195f, -0.000351f, -0.000099f, +0.000157f, +0.000174f, +0.000121f, -0.000035f, + -0.000081f, +0.000279f, +0.000403f, +0.000276f, -0.000274f, +0.000200f, +0.000234f, -0.000028f, -0.000161f, -0.000310f, + +0.000100f, +0.000127f, -0.000015f, -0.000094f, -0.000064f, -0.000164f, -0.000008f, +0.000097f, -0.000102f, +0.000085f, + +0.000088f, +0.000029f, -0.000150f, -0.000069f, -0.000022f, +0.000087f + }, + { + -0.010950f, +0.072074f, -0.005644f, -0.016836f, +0.005010f, +0.001976f, -0.000976f, -0.000083f, +0.000010f, +0.001504f, + -0.003067f, -0.002900f, -0.000257f, -0.000261f, +0.005467f, -0.003367f, +0.001296f, +0.000793f, -0.000640f, +0.004764f, + -0.001905f, +0.004135f, -0.002413f, -0.000014f, +0.000304f, -0.002852f, -0.001179f, +0.000810f, -0.000313f, +0.001454f, + -0.000373f, +0.000968f, -0.000317f, +0.000713f, +0.000946f, +0.000605f, +0.000465f, -0.000125f, -0.000778f, -0.000153f, + -0.000406f, +0.001017f, +0.000270f, -0.000170f, -0.000723f, -0.001008f, +0.000293f, -0.000896f, -0.000250f, +0.000469f, + +0.000056f, +0.000182f, -0.000352f, -0.000274f, -0.000003f, +0.000712f, -0.000557f, +0.000430f, -0.000398f, +0.000445f, + -0.000491f, -0.000604f, +0.000583f, +0.000423f, +0.000120f, -0.000468f, -0.000175f, +0.000095f, +0.000186f, +0.000069f, + -0.000040f, -0.000070f, -0.000460f, +0.000285f, +0.000184f, +0.000168f, +0.000034f, -0.000219f, +0.000122f, +0.000309f, + -0.000118f, +0.000039f, -0.000012f, -0.000115f, -0.000108f, -0.000166f, +0.000000f, +0.000110f, +0.000057f, -0.000020f, + +0.000161f, +0.000025f, +0.000053f, +0.000097f, +0.000015f, -0.000027f + }, + { + -0.027734f, +0.056632f, -0.000886f, +0.011828f, -0.000674f, +0.000564f, +0.000331f, -0.000290f, -0.000127f, +0.002318f, + +0.002062f, -0.001691f, +0.000713f, -0.000907f, +0.000835f, +0.000934f, -0.000520f, +0.004609f, -0.000507f, -0.000830f, + -0.001377f, +0.001250f, -0.000590f, +0.000723f, -0.000578f, -0.000664f, -0.002607f, +0.001625f, -0.000418f, -0.000569f, + -0.000227f, -0.000144f, -0.000756f, +0.000372f, -0.000183f, +0.000451f, -0.000757f, +0.000069f, -0.000029f, +0.000801f, + +0.000622f, +0.000544f, -0.000630f, -0.000547f, -0.000690f, -0.000185f, +0.001171f, -0.000452f, +0.001171f, +0.000072f, + -0.000884f, +0.000234f, +0.000088f, -0.000500f, -0.000293f, +0.000290f, +0.000222f, +0.000244f, +0.000036f, +0.000135f, + -0.000163f, -0.000616f, +0.000362f, -0.000178f, +0.000170f, -0.000177f, +0.000091f, -0.000052f, +0.000028f, +0.000144f, + +0.000144f, +0.000150f, +0.000220f, +0.000061f, -0.000090f, -0.000173f, -0.000009f, +0.000017f, +0.000068f, -0.000178f, + -0.000012f, -0.000103f, +0.000082f, -0.000100f, -0.000091f, -0.000032f, +0.000000f, +0.000067f, +0.000092f, -0.000143f, + -0.000030f, -0.000051f, +0.000051f, +0.000007f, -0.000022f, +0.000128f + }, + { + +0.001747f, -0.001200f, -0.001932f, +0.000100f, +0.000365f, -0.000155f, +0.000590f, -0.000031f, -0.000069f, +0.000628f, + +0.001192f, +0.000785f, -0.003291f, -0.000097f, +0.008043f, -0.000439f, +0.001851f, -0.018801f, +0.014391f, +0.000671f, + +0.004072f, -0.000135f, -0.002718f, +0.001401f, -0.001313f, -0.001851f, -0.001323f, +0.000153f, +0.000327f, -0.000117f, + +0.000904f, +0.001270f, -0.000630f, -0.001028f, -0.001862f, -0.001611f, -0.000133f, +0.000706f, -0.000168f, -0.000163f, + +0.001412f, -0.001314f, +0.000673f, +0.000397f, -0.000111f, -0.000793f, -0.001119f, -0.000656f, +0.000426f, -0.000141f, + +0.001063f, -0.000003f, -0.000702f, +0.000624f, -0.000130f, -0.000167f, -0.000101f, -0.000433f, -0.000063f, +0.000327f, + -0.000578f, -0.000010f, +0.000025f, +0.000303f, -0.000083f, -0.000264f, +0.000387f, -0.000241f, -0.000009f, +0.000070f, + +0.000136f, +0.000258f, -0.000088f, -0.000378f, -0.000075f, -0.000157f, +0.000154f, -0.000040f, -0.000072f, -0.000050f, + -0.000065f, -0.000045f, -0.000036f, -0.000168f, +0.000162f, +0.000006f, -0.000101f, +0.000102f, -0.000128f, +0.000040f, + +0.000030f, -0.000172f, -0.000007f, +0.000096f, -0.000027f, -0.000003f + }, + { + -0.053451f, +0.100571f, -0.006781f, -0.005689f, -0.000741f, +0.000738f, -0.000852f, -0.000359f, +0.000355f, -0.001312f, + -0.000532f, +0.000861f, +0.001424f, +0.001526f, -0.002101f, +0.001408f, -0.000155f, +0.000156f, -0.000607f, +0.000179f, + -0.000313f, -0.000145f, +0.002139f, -0.000251f, +0.000701f, -0.000652f, -0.000896f, +0.000640f, -0.001653f, -0.000646f, + +0.001914f, -0.000183f, +0.001001f, -0.003997f, +0.001666f, -0.000510f, +0.001794f, +0.000941f, +0.000775f, +0.000048f, + -0.001570f, -0.000284f, -0.000044f, -0.000374f, +0.001411f, +0.000623f, +0.001393f, -0.000609f, -0.000331f, +0.000255f, + -0.000111f, +0.000025f, -0.000484f, -0.000310f, +0.000702f, -0.000102f, +0.000002f, -0.000562f, +0.000587f, +0.000338f, + -0.000388f, +0.000084f, -0.000227f, +0.000062f, +0.000249f, +0.000035f, -0.000100f, +0.000138f, +0.000292f, -0.000052f, + +0.000112f, +0.000104f, -0.000137f, -0.000147f, +0.000253f, -0.000271f, +0.000124f, +0.000150f, +0.000159f, +0.000004f, + -0.000115f, +0.000209f, -0.000051f, +0.000002f, +0.000043f, -0.000118f, +0.000067f, -0.000039f, +0.000046f, +0.000015f, + -0.000131f, -0.000009f, +0.000092f, +0.000120f, +0.000013f, -0.000111f + }, + { + +0.000163f, +0.001363f, +0.000161f, +0.000094f, -0.000431f, -0.000256f, +0.000338f, -0.000294f, +0.000093f, +0.000002f, + -0.000696f, +0.000571f, +0.001498f, +0.000085f, +0.002310f, +0.003427f, -0.000773f, +0.000355f, -0.002797f, +0.001744f, + -0.001455f, -0.004811f, -0.002138f, +0.003379f, -0.000695f, +0.000848f, -0.001224f, +0.000212f, -0.002237f, -0.000960f, + +0.002552f, -0.000640f, +0.000100f, +0.001339f, +0.000474f, +0.001511f, -0.000068f, -0.000168f, +0.000148f, -0.000636f, + +0.000450f, +0.000666f, +0.000093f, -0.000857f, -0.000375f, +0.000521f, +0.000431f, +0.000317f, +0.000371f, +0.000045f, + +0.000511f, -0.000099f, +0.000118f, -0.000204f, +0.000135f, -0.000627f, +0.000265f, -0.000391f, -0.000361f, +0.000593f, + +0.000172f, +0.000855f, -0.000279f, +0.000200f, -0.000190f, +0.000507f, -0.000149f, -0.000192f, -0.000182f, +0.000373f, + +0.000169f, -0.000175f, -0.000130f, +0.000267f, -0.000236f, +0.000056f, +0.000040f, -0.000122f, -0.000077f, +0.000002f, + +0.000027f, +0.000057f, +0.000117f, -0.000018f, -0.000015f, -0.000055f, +0.000155f, +0.000088f, +0.000131f, +0.000030f, + +0.000099f, +0.000039f, -0.000038f, +0.000078f, +0.000043f, -0.000039f + }, + { + +0.026076f, -0.089216f, +0.005314f, +0.003242f, -0.000940f, -0.000149f, +0.000109f, -0.000945f, -0.000118f, -0.000080f, + -0.001079f, +0.000583f, +0.000522f, +0.000087f, +0.001723f, +0.001990f, -0.000612f, +0.001155f, -0.000584f, +0.000878f, + -0.000085f, -0.000504f, -0.002023f, +0.001201f, +0.001103f, +0.000868f, +0.000076f, +0.001244f, -0.000813f, -0.000790f, + -0.000943f, +0.000919f, -0.000126f, -0.000751f, -0.000053f, -0.002451f, -0.000747f, +0.000272f, +0.000030f, -0.000112f, + +0.000391f, -0.000633f, -0.000107f, +0.001220f, +0.000469f, -0.000149f, -0.000090f, +0.000895f, -0.001973f, -0.001614f, + +0.000419f, -0.000167f, +0.000479f, +0.000491f, -0.000479f, +0.000106f, -0.000224f, -0.000022f, +0.000508f, -0.000106f, + +0.000018f, -0.000389f, -0.000722f, +0.000241f, +0.000539f, -0.000476f, +0.000013f, -0.000113f, +0.000074f, +0.000268f, + -0.000002f, +0.000025f, +0.000157f, -0.000155f, -0.000055f, +0.000103f, -0.000032f, -0.000014f, +0.000226f, +0.000105f, + +0.000034f, +0.000116f, -0.000097f, +0.000065f, +0.000066f, -0.000010f, +0.000039f, -0.000043f, -0.000020f, -0.000036f, + +0.000055f, -0.000028f, -0.000055f, -0.000036f, +0.000016f, -0.000073f + }, + { + +0.000116f, -0.015679f, -0.001616f, +0.001362f, -0.000195f, +0.000458f, +0.000270f, +0.000083f, +0.000217f, -0.000039f, + -0.001003f, +0.002154f, +0.000156f, +0.005542f, +0.001387f, -0.000026f, +0.006504f, -0.003305f, -0.001971f, +0.005831f, + -0.001364f, -0.002181f, +0.001724f, +0.004062f, -0.001096f, -0.000155f, -0.004814f, +0.001341f, +0.000741f, -0.001338f, + -0.003412f, +0.000806f, +0.000830f, +0.001143f, +0.001009f, -0.000614f, +0.000955f, -0.002200f, -0.001073f, +0.000110f, + -0.000929f, +0.000113f, +0.000088f, -0.001023f, -0.000712f, +0.000611f, +0.000300f, +0.000699f, -0.001221f, +0.001033f, + -0.000060f, -0.000720f, +0.000411f, +0.000179f, -0.000075f, -0.000019f, -0.000184f, -0.000601f, +0.000312f, -0.000119f, + +0.000300f, +0.000597f, -0.000304f, +0.000171f, +0.000283f, +0.000231f, -0.000292f, -0.000062f, +0.000011f, -0.000124f, + +0.000106f, -0.000095f, -0.000118f, -0.000123f, -0.000123f, +0.000118f, +0.000149f, -0.000038f, +0.000083f, -0.000085f, + +0.000129f, +0.000113f, +0.000028f, +0.000005f, -0.000027f, +0.000078f, -0.000136f, +0.000011f, -0.000014f, -0.000123f, + +0.000038f, +0.000056f, -0.000000f, -0.000016f, -0.000060f, -0.000067f + }, + { + -0.011740f, -0.003104f, +0.004026f, +0.000190f, -0.001226f, -0.006375f, -0.004230f, +0.002543f, -0.003129f, -0.000831f, + +0.001805f, -0.003282f, +0.002238f, -0.000599f, -0.001056f, +0.002031f, -0.002926f, -0.000287f, -0.000389f, -0.000499f, + -0.002661f, +0.000987f, +0.000784f, -0.000052f, -0.001222f, +0.000113f, +0.000132f, -0.000170f, -0.001056f, +0.000109f, + -0.001438f, +0.000213f, +0.000372f, +0.000515f, -0.000587f, +0.001477f, -0.000853f, +0.000979f, +0.000337f, +0.000046f, + -0.001399f, -0.000249f, +0.001081f, -0.000024f, -0.000412f, -0.000648f, -0.000177f, +0.000291f, -0.000052f, -0.000851f, + +0.000488f, +0.000221f, -0.000692f, +0.000199f, +0.000457f, +0.000207f, +0.000206f, +0.000327f, -0.000093f, -0.000292f, + -0.000577f, +0.000024f, -0.000107f, +0.000366f, -0.000050f, -0.000416f, -0.000048f, +0.000029f, -0.000117f, +0.000228f, + -0.000263f, +0.000040f, -0.000216f, +0.000330f, -0.000099f, -0.000022f, -0.000053f, +0.000234f, +0.000041f, +0.000243f, + +0.000075f, +0.000115f, -0.000131f, -0.000131f, -0.000100f, -0.000145f, +0.000006f, +0.000058f, -0.000154f, -0.000031f, + +0.000031f, +0.000103f, +0.000038f, -0.000051f, -0.000059f, -0.000073f + }, + { + +0.001206f, -0.002932f, -0.001727f, +0.009838f, -0.000629f, -0.000823f, -0.000516f, -0.000343f, +0.000692f, -0.001125f, + +0.000702f, +0.002723f, -0.001297f, +0.001679f, -0.004655f, +0.003881f, +0.000713f, -0.008338f, -0.000985f, +0.005730f, + -0.000377f, -0.003052f, +0.002664f, -0.000783f, -0.001005f, +0.000730f, +0.000241f, -0.000011f, +0.000365f, +0.000395f, + -0.000632f, -0.000154f, -0.001576f, +0.000163f, -0.000577f, -0.000046f, +0.001389f, +0.000183f, +0.000434f, +0.000636f, + -0.001042f, +0.000116f, -0.000335f, -0.000422f, +0.000367f, -0.000810f, +0.001119f, +0.000146f, -0.000782f, +0.000138f, + +0.000273f, +0.000118f, +0.000022f, +0.000781f, +0.000527f, -0.000243f, -0.000310f, +0.000018f, -0.000074f, -0.000067f, + -0.000682f, +0.000020f, +0.000516f, -0.000093f, +0.000139f, -0.000013f, -0.000245f, -0.000206f, +0.000182f, -0.000147f, + -0.000002f, -0.000119f, -0.000204f, -0.000035f, -0.000115f, +0.000156f, +0.000099f, +0.000148f, -0.000043f, -0.000028f, + -0.000001f, -0.000063f, -0.000183f, +0.000085f, +0.000113f, -0.000063f, +0.000067f, +0.000077f, +0.000033f, +0.000004f, + +0.000037f, +0.000021f, -0.000001f, -0.000037f, -0.000023f, +0.000031f + }, + { + +0.010818f, +0.005912f, +0.001253f, +0.000606f, -0.004722f, +0.004512f, -0.001755f, -0.000424f, +0.000008f, +0.001054f, + +0.002402f, -0.001511f, +0.001703f, +0.002639f, -0.002320f, -0.000002f, -0.000956f, -0.001496f, -0.000066f, +0.000906f, + -0.000774f, -0.000909f, -0.000514f, -0.000916f, +0.000931f, -0.000194f, -0.000133f, +0.001025f, -0.000372f, +0.000457f, + +0.001091f, -0.000218f, -0.000576f, -0.000602f, +0.000850f, +0.001296f, +0.000571f, +0.000796f, -0.000626f, +0.000787f, + -0.000393f, +0.001164f, -0.001332f, +0.002581f, -0.000028f, -0.000043f, +0.000944f, -0.000157f, -0.000080f, +0.000179f, + +0.000022f, +0.000888f, -0.000284f, +0.000369f, -0.000130f, +0.000223f, -0.000140f, -0.000399f, +0.000268f, -0.000146f, + +0.000037f, +0.000513f, +0.000073f, -0.000124f, +0.000097f, +0.000025f, -0.000021f, +0.000319f, +0.000196f, -0.000453f, + +0.000165f, +0.000137f, -0.000071f, -0.000177f, -0.000066f, +0.000167f, -0.000071f, +0.000094f, -0.000062f, -0.000166f, + +0.000033f, -0.000113f, -0.000060f, -0.000123f, -0.000052f, +0.000109f, +0.000102f, -0.000081f, -0.000003f, -0.000080f, + -0.000001f, -0.000050f, -0.000004f, +0.000072f, -0.000072f, -0.000048f + }, + { + +0.000385f, -0.006916f, +0.002131f, -0.002909f, -0.001433f, +0.000185f, -0.000801f, -0.000210f, -0.000131f, +0.001167f, + -0.001028f, +0.003444f, +0.002882f, -0.027444f, -0.000081f, -0.000551f, +0.000570f, +0.001810f, +0.001712f, -0.000996f, + +0.001154f, -0.011650f, +0.005267f, +0.000946f, +0.006251f, -0.002735f, -0.001223f, +0.000136f, -0.001445f, -0.000355f, + +0.000809f, +0.000905f, +0.000446f, -0.001067f, +0.001190f, +0.000422f, +0.000920f, -0.000572f, -0.000244f, +0.000253f, + +0.000733f, +0.000361f, -0.000475f, +0.001579f, -0.000135f, -0.000642f, +0.000334f, -0.000781f, +0.000357f, -0.000696f, + -0.001175f, -0.000155f, +0.000230f, +0.000095f, +0.000622f, -0.000165f, -0.000152f, +0.000570f, -0.000069f, -0.000136f, + +0.000732f, -0.000371f, -0.000415f, -0.000234f, +0.000187f, -0.000045f, +0.000297f, +0.000075f, -0.000185f, +0.000293f, + -0.000030f, +0.000272f, -0.000437f, +0.000213f, +0.000136f, -0.000365f, -0.000126f, -0.000157f, +0.000361f, -0.000042f, + +0.000200f, +0.000039f, +0.000065f, +0.000123f, -0.000189f, +0.000149f, -0.000118f, +0.000059f, -0.000066f, +0.000043f, + -0.000010f, -0.000044f, -0.000139f, +0.000161f, -0.000084f, -0.000073f + }, + { + +0.013864f, -0.028435f, -0.000708f, -0.001612f, -0.000363f, -0.002399f, -0.001820f, -0.001344f, +0.001275f, +0.001576f, + +0.001236f, +0.000414f, +0.001757f, +0.002719f, +0.009743f, +0.005087f, -0.005617f, +0.001076f, +0.001632f, -0.003209f, + -0.000416f, +0.000405f, +0.000516f, -0.001619f, +0.000939f, -0.001785f, -0.000025f, -0.001052f, +0.000403f, -0.001289f, + +0.000786f, -0.000002f, +0.000026f, +0.001305f, -0.002573f, +0.001465f, -0.000920f, +0.000501f, -0.000015f, +0.000792f, + +0.000860f, +0.001295f, -0.000939f, +0.000434f, +0.000447f, -0.000413f, +0.000396f, -0.000658f, +0.000507f, +0.000006f, + +0.001344f, +0.000018f, -0.000335f, +0.000492f, +0.000259f, +0.000357f, +0.000128f, -0.000082f, -0.000295f, -0.000566f, + +0.000505f, -0.000161f, -0.000114f, +0.000252f, -0.000179f, +0.000051f, +0.000285f, -0.000026f, -0.000140f, +0.000083f, + +0.000199f, +0.000098f, -0.000006f, +0.000013f, -0.000150f, +0.000293f, -0.000101f, -0.000017f, +0.000072f, +0.000133f, + -0.000106f, +0.000033f, +0.000187f, +0.000010f, -0.000064f, +0.000050f, -0.000140f, -0.000070f, +0.000015f, -0.000090f, + +0.000034f, +0.000078f, -0.000055f, +0.000019f, -0.000018f, -0.000116f + }, + { + -0.000659f, -0.004449f, -0.000690f, +0.001866f, -0.001132f, +0.000697f, +0.000095f, -0.000064f, +0.000030f, +0.001794f, + -0.000221f, -0.000286f, +0.001166f, +0.010072f, +0.014230f, +0.007375f, +0.002461f, +0.001143f, +0.001573f, +0.009610f, + -0.001672f, -0.002807f, +0.001807f, -0.003051f, +0.000492f, -0.000327f, -0.000438f, +0.001375f, -0.000082f, +0.001735f, + -0.002519f, +0.001257f, -0.000490f, +0.000436f, -0.000363f, -0.001534f, -0.000292f, -0.000644f, -0.000593f, +0.000867f, + -0.001526f, -0.000569f, -0.000102f, -0.000096f, +0.000469f, +0.000785f, -0.000477f, +0.000870f, -0.000593f, -0.000338f, + +0.000611f, -0.000130f, -0.000112f, +0.000109f, +0.000037f, +0.000381f, -0.000128f, -0.000334f, -0.000030f, +0.000060f, + +0.000349f, -0.000090f, +0.000118f, -0.000343f, +0.000336f, +0.000358f, +0.000269f, -0.000002f, -0.000040f, +0.000301f, + +0.000227f, +0.000088f, -0.000081f, +0.000130f, -0.000089f, +0.000318f, +0.000022f, -0.000125f, -0.000069f, +0.000137f, + +0.000076f, +0.000043f, +0.000037f, -0.000157f, -0.000109f, -0.000032f, -0.000096f, -0.000103f, +0.000087f, +0.000004f, + -0.000041f, +0.000098f, -0.000035f, -0.000134f, +0.000055f, -0.000018f + } + }, + { + { + -0.017767f, +0.114503f, +0.000172f, -0.001411f, +0.002357f, -0.000796f, +0.000302f, +0.001854f, -0.000840f, +0.000633f, + +0.001971f, +0.000528f, +0.000165f, +0.000446f, -0.000781f, -0.001368f, -0.000189f, -0.000714f, +0.001762f, -0.000719f, + -0.001052f, +0.000099f, -0.000023f, -0.001281f, -0.000773f, -0.000878f, +0.001102f, -0.000255f, -0.001099f, +0.000929f, + -0.000940f, -0.000982f, +0.000536f, +0.000955f, -0.000416f, -0.000457f, -0.000065f, +0.000193f, +0.000244f, +0.001221f, + +0.000060f, -0.000169f, +0.000030f, -0.000933f, -0.000223f, +0.000340f, +0.000437f, +0.000436f, -0.000399f, +0.000096f, + +0.000222f, +0.000136f, -0.000376f, +0.000076f, -0.000262f, +0.000469f, -0.000042f, -0.000092f, -0.000214f, -0.000210f, + +0.000305f, -0.000249f, -0.000198f, -0.000220f, -0.000041f, +0.000227f, +0.000053f, +0.000147f, -0.000098f, -0.000017f, + -0.000006f, -0.000127f, +0.000103f, +0.000022f, -0.000149f, -0.000097f, +0.000123f, +0.000192f, -0.000085f, +0.000193f, + +0.000092f, +0.000096f, +0.000005f, +0.000149f, +0.000009f, -0.000023f, +0.000128f, +0.000049f, +0.000076f, +0.000035f, + -0.000020f, -0.000095f, -0.000011f, -0.000017f, -0.000021f, -0.000024f + }, + { + -0.001419f, -0.028599f, +0.008311f, +0.004160f, +0.002975f, -0.000239f, -0.000562f, +0.000960f, +0.000007f, +0.000482f, + -0.000487f, +0.000073f, -0.002025f, -0.001800f, -0.000599f, -0.002104f, -0.001021f, -0.001212f, +0.004581f, +0.006008f, + -0.001865f, -0.001498f, -0.000885f, -0.001632f, -0.003939f, +0.002625f, -0.000232f, +0.001749f, -0.001740f, -0.001626f, + -0.001065f, +0.000314f, +0.002580f, +0.001919f, +0.000557f, +0.001019f, -0.001101f, +0.000599f, -0.000194f, +0.000474f, + -0.000650f, +0.000473f, +0.000510f, +0.000526f, +0.000215f, +0.000332f, +0.000549f, +0.000530f, -0.000054f, +0.000528f, + -0.000123f, +0.000158f, +0.000006f, +0.000738f, -0.000077f, -0.000473f, -0.000086f, -0.000040f, +0.000075f, -0.000071f, + -0.000047f, +0.000317f, +0.000155f, +0.000184f, -0.000021f, -0.000061f, -0.000093f, +0.000540f, +0.000063f, -0.000213f, + +0.000122f, +0.000412f, -0.000029f, +0.000117f, +0.000169f, +0.000245f, -0.000051f, -0.000119f, -0.000085f, -0.000067f, + +0.000021f, -0.000070f, -0.000075f, -0.000027f, -0.000019f, +0.000046f, +0.000057f, -0.000005f, +0.000049f, +0.000046f, + -0.000077f, +0.000022f, -0.000011f, +0.000094f, -0.000003f, -0.000020f + }, + { + +0.005992f, +0.058243f, -0.016926f, +0.000211f, -0.000842f, +0.001801f, +0.000111f, -0.000792f, -0.000185f, -0.000780f, + -0.002288f, +0.000428f, -0.001499f, +0.001925f, +0.003509f, -0.000334f, -0.000922f, +0.000006f, +0.005808f, -0.001235f, + +0.001382f, +0.002074f, -0.002028f, -0.000973f, +0.000811f, -0.002108f, -0.000555f, +0.000912f, +0.000479f, +0.001896f, + -0.000823f, -0.001781f, +0.002532f, +0.000905f, +0.000059f, +0.000302f, +0.001317f, -0.000420f, -0.001109f, -0.001001f, + +0.000602f, -0.000048f, -0.000115f, +0.000263f, -0.000416f, -0.000247f, +0.000030f, -0.000216f, -0.000072f, +0.000409f, + -0.000717f, +0.000962f, -0.000421f, +0.000342f, +0.000375f, -0.000080f, +0.000086f, +0.000200f, -0.000273f, -0.000335f, + -0.000040f, +0.000053f, +0.000517f, +0.000237f, -0.000146f, +0.000040f, +0.000010f, -0.000036f, +0.000130f, +0.000085f, + +0.000154f, -0.000135f, +0.000018f, +0.000069f, +0.000106f, +0.000002f, -0.000004f, -0.000122f, +0.000239f, +0.000068f, + -0.000033f, +0.000090f, -0.000038f, -0.000173f, -0.000044f, +0.000083f, +0.000005f, -0.000013f, +0.000014f, +0.000087f, + -0.000023f, -0.000052f, -0.000027f, +0.000042f, -0.000051f, +0.000033f + }, + { + +0.020302f, -0.021038f, +0.003148f, +0.009244f, +0.000803f, +0.000800f, +0.000782f, -0.000454f, +0.000655f, +0.001461f, + +0.000281f, -0.001849f, +0.002492f, -0.001423f, +0.000437f, -0.000192f, +0.001571f, +0.001024f, -0.001567f, -0.000957f, + -0.000691f, +0.000300f, +0.000144f, +0.000013f, -0.001330f, -0.001450f, -0.001920f, +0.000858f, -0.000108f, +0.001192f, + +0.000075f, -0.001251f, +0.000549f, +0.000018f, -0.000310f, +0.000636f, -0.000563f, +0.000179f, -0.000229f, +0.000322f, + +0.000398f, +0.000115f, +0.000282f, -0.000412f, -0.001179f, +0.000771f, +0.000678f, +0.000247f, +0.000367f, -0.000543f, + -0.000144f, +0.000312f, -0.000319f, +0.000028f, +0.000120f, +0.000118f, +0.000379f, -0.000057f, +0.000204f, -0.000263f, + +0.000195f, -0.000054f, +0.000019f, -0.000035f, +0.000371f, -0.000050f, +0.000060f, +0.000134f, -0.000113f, +0.000231f, + +0.000055f, -0.000025f, +0.000025f, +0.000007f, +0.000103f, -0.000171f, +0.000128f, -0.000097f, -0.000026f, +0.000008f, + +0.000062f, -0.000064f, -0.000019f, -0.000114f, -0.000099f, -0.000093f, -0.000026f, +0.000067f, -0.000079f, -0.000058f, + +0.000046f, +0.000041f, -0.000064f, +0.000080f, +0.000022f, +0.000049f + }, + { + -0.001258f, -0.000373f, -0.001097f, +0.000553f, +0.000610f, -0.000512f, +0.000078f, +0.001638f, -0.000966f, +0.000427f, + +0.002022f, -0.000351f, -0.000158f, +0.003435f, +0.003268f, -0.005500f, -0.007905f, +0.006284f, +0.001496f, +0.002694f, + -0.000594f, +0.000866f, +0.002303f, -0.002697f, -0.004386f, -0.001160f, +0.000063f, +0.001668f, -0.001909f, +0.001322f, + +0.000363f, +0.001045f, -0.001732f, +0.000485f, -0.001241f, -0.000665f, -0.000725f, +0.000027f, -0.000586f, +0.000526f, + +0.000234f, +0.000095f, +0.000547f, +0.001173f, -0.000769f, -0.000263f, -0.000557f, -0.000516f, +0.000725f, +0.000542f, + +0.000382f, +0.000134f, -0.000619f, +0.000697f, -0.000090f, -0.000281f, -0.000367f, +0.000122f, +0.000031f, +0.000174f, + -0.000332f, -0.000261f, -0.000166f, +0.000255f, +0.000604f, +0.000199f, +0.000068f, -0.000328f, +0.000038f, +0.000134f, + +0.000167f, +0.000004f, -0.000209f, -0.000259f, -0.000061f, -0.000215f, +0.000151f, +0.000046f, +0.000126f, +0.000042f, + -0.000013f, -0.000038f, -0.000205f, -0.000040f, +0.000052f, -0.000000f, +0.000033f, -0.000071f, -0.000025f, +0.000048f, + +0.000017f, -0.000028f, -0.000017f, +0.000043f, -0.000025f, +0.000015f + }, + { + +0.037094f, -0.046989f, +0.002505f, -0.004275f, -0.000985f, -0.000447f, +0.000290f, +0.000549f, -0.001580f, +0.000202f, + +0.002156f, +0.000339f, +0.001245f, -0.001018f, -0.000334f, +0.000581f, +0.000516f, -0.000088f, -0.000398f, +0.001028f, + +0.000493f, +0.000119f, +0.000955f, -0.000256f, -0.000271f, +0.000524f, -0.001471f, +0.000996f, -0.001460f, +0.000025f, + +0.000375f, +0.000186f, -0.001105f, -0.000913f, -0.001502f, +0.000708f, +0.001276f, +0.001314f, -0.000050f, +0.000173f, + -0.000022f, -0.000204f, -0.000881f, +0.000560f, +0.001500f, +0.001173f, +0.000085f, -0.000011f, -0.000344f, +0.000533f, + -0.000655f, -0.000097f, -0.000257f, +0.000102f, +0.000532f, -0.000188f, +0.000352f, +0.000302f, +0.000030f, -0.000089f, + -0.000290f, -0.000130f, +0.000423f, +0.000274f, +0.000208f, -0.000235f, +0.000055f, +0.000299f, +0.000066f, +0.000305f, + +0.000028f, +0.000242f, -0.000082f, -0.000123f, +0.000101f, -0.000184f, +0.000380f, -0.000008f, +0.000013f, -0.000030f, + -0.000099f, +0.000020f, -0.000241f, -0.000067f, +0.000060f, +0.000056f, +0.000049f, +0.000059f, -0.000025f, -0.000056f, + -0.000022f, +0.000075f, +0.000065f, +0.000013f, -0.000042f, -0.000050f + }, + { + -0.000935f, +0.001793f, +0.002666f, -0.001217f, -0.000224f, -0.000122f, +0.000252f, +0.000214f, +0.000210f, -0.000531f, + +0.000042f, +0.000059f, +0.002406f, -0.003765f, -0.001110f, +0.001408f, -0.002439f, +0.000869f, -0.001163f, -0.004679f, + -0.001844f, -0.002210f, -0.001723f, -0.001102f, +0.000794f, +0.000666f, -0.003678f, +0.001172f, -0.001809f, -0.000703f, + +0.000995f, -0.000205f, -0.000676f, +0.001991f, +0.000828f, +0.001197f, -0.000002f, -0.001035f, -0.000267f, +0.000554f, + +0.000672f, -0.000516f, +0.000183f, -0.000650f, -0.000097f, +0.000517f, +0.000803f, +0.000462f, +0.000166f, +0.000186f, + -0.000039f, +0.000138f, +0.000179f, -0.000300f, -0.000200f, -0.000196f, +0.000061f, -0.000254f, -0.000415f, +0.000133f, + +0.000262f, +0.000337f, -0.000353f, -0.000006f, +0.000155f, +0.000239f, -0.000022f, +0.000307f, -0.000037f, -0.000100f, + -0.000136f, +0.000088f, +0.000217f, +0.000069f, -0.000024f, +0.000203f, +0.000051f, +0.000164f, -0.000041f, +0.000066f, + +0.000036f, +0.000118f, +0.000004f, -0.000034f, +0.000019f, +0.000028f, +0.000052f, -0.000042f, +0.000093f, -0.000015f, + -0.000053f, -0.000063f, +0.000026f, +0.000096f, -0.000025f, -0.000051f + }, + { + -0.021797f, -0.019020f, -0.004493f, +0.002305f, -0.000865f, +0.000090f, +0.000439f, -0.001770f, -0.000309f, +0.000179f, + -0.000484f, +0.000066f, +0.000022f, +0.002083f, +0.001043f, +0.002079f, -0.000115f, +0.000203f, -0.000446f, +0.000431f, + +0.000587f, -0.000965f, -0.000374f, +0.000738f, -0.000593f, +0.001541f, +0.001330f, +0.000366f, +0.000415f, -0.001347f, + +0.000001f, -0.000942f, -0.000196f, +0.000513f, +0.000553f, -0.000713f, -0.000039f, +0.000285f, -0.000595f, -0.000078f, + +0.000222f, -0.000097f, +0.000086f, -0.000095f, -0.000053f, +0.001611f, -0.000916f, -0.000869f, -0.001307f, -0.000581f, + +0.000403f, +0.000253f, -0.000169f, -0.000394f, +0.000354f, -0.000147f, +0.000027f, -0.000018f, +0.000361f, -0.000011f, + -0.000065f, -0.000370f, +0.000000f, -0.000037f, -0.000204f, +0.000001f, -0.000082f, -0.000213f, +0.000185f, +0.000025f, + +0.000109f, +0.000039f, -0.000095f, +0.000082f, +0.000104f, -0.000101f, -0.000015f, +0.000261f, +0.000015f, +0.000039f, + +0.000046f, +0.000054f, -0.000144f, +0.000021f, +0.000035f, -0.000039f, +0.000076f, +0.000153f, -0.000007f, -0.000034f, + -0.000008f, -0.000092f, -0.000012f, +0.000084f, +0.000044f, -0.000045f + }, + { + -0.001700f, -0.005506f, +0.001119f, -0.001448f, +0.000571f, +0.000040f, -0.000468f, +0.000773f, +0.000660f, +0.000306f, + -0.000050f, +0.000190f, -0.000249f, -0.000687f, +0.011405f, -0.002881f, +0.001330f, +0.001623f, -0.000982f, +0.002069f, + +0.000772f, -0.003432f, +0.003138f, +0.002261f, +0.002301f, -0.004208f, -0.000409f, +0.000213f, -0.002118f, +0.000203f, + -0.001991f, +0.000362f, +0.001185f, -0.000137f, +0.001451f, +0.000353f, -0.000205f, -0.001276f, +0.000117f, -0.001201f, + +0.000764f, +0.000170f, -0.000077f, +0.000589f, +0.000093f, +0.000143f, +0.000894f, -0.000029f, +0.000122f, -0.000191f, + -0.000549f, -0.000504f, -0.000036f, +0.000205f, +0.000361f, -0.000192f, +0.000305f, +0.000003f, +0.000287f, -0.000256f, + -0.000106f, +0.000071f, +0.000352f, -0.000352f, -0.000316f, -0.000037f, -0.000250f, -0.000178f, -0.000022f, +0.000004f, + -0.000137f, -0.000339f, -0.000066f, -0.000153f, +0.000293f, +0.000034f, +0.000059f, +0.000083f, -0.000014f, -0.000009f, + -0.000010f, +0.000021f, -0.000178f, -0.000007f, +0.000088f, +0.000075f, +0.000010f, +0.000209f, +0.000036f, -0.000133f, + -0.000004f, +0.000090f, -0.000028f, +0.000051f, -0.000044f, +0.000026f + }, + { + +0.006524f, -0.031766f, +0.009426f, -0.000506f, -0.001691f, -0.002554f, -0.008350f, -0.000858f, -0.000975f, -0.001361f, + +0.002340f, -0.000183f, +0.000812f, -0.000226f, +0.000486f, +0.000204f, -0.003306f, +0.001908f, -0.000872f, -0.002753f, + -0.000302f, +0.000675f, +0.000878f, -0.001192f, +0.000173f, -0.001064f, +0.000093f, -0.000713f, +0.000683f, -0.001504f, + -0.000472f, -0.000862f, -0.000534f, +0.001747f, +0.000856f, -0.000222f, +0.000461f, -0.000336f, +0.000492f, -0.000548f, + +0.000117f, +0.000070f, +0.001105f, -0.000217f, -0.000287f, +0.000730f, +0.000335f, -0.000164f, +0.000164f, +0.000857f, + +0.000004f, +0.000009f, +0.000337f, -0.000173f, -0.000186f, +0.000364f, +0.000341f, +0.000122f, -0.000141f, -0.000264f, + -0.000817f, -0.000162f, +0.000168f, +0.000273f, +0.000048f, -0.000405f, -0.000086f, -0.000070f, -0.000097f, +0.000278f, + +0.000073f, -0.000239f, -0.000143f, +0.000295f, -0.000063f, +0.000036f, -0.000050f, +0.000114f, +0.000110f, +0.000045f, + -0.000050f, +0.000036f, +0.000018f, -0.000024f, -0.000109f, +0.000114f, +0.000111f, +0.000070f, +0.000030f, -0.000023f, + +0.000039f, +0.000068f, -0.000052f, -0.000077f, -0.000018f, +0.000079f + }, + { + -0.000661f, -0.002606f, +0.005450f, +0.003135f, +0.000174f, +0.000413f, -0.002174f, -0.000426f, +0.000112f, +0.001382f, + -0.000064f, +0.000920f, -0.001054f, -0.001859f, +0.000217f, -0.000662f, -0.001415f, -0.004177f, +0.000885f, +0.004929f, + -0.004132f, -0.000941f, +0.000276f, -0.000717f, +0.000338f, +0.000802f, +0.001001f, +0.000224f, +0.000936f, -0.001037f, + -0.000580f, -0.001389f, -0.000778f, -0.001304f, +0.001778f, +0.001051f, -0.000749f, +0.000546f, +0.000113f, -0.000092f, + -0.000270f, -0.000372f, +0.000349f, +0.000744f, -0.000384f, -0.000203f, +0.000622f, -0.000074f, -0.000055f, -0.000165f, + +0.000535f, +0.000064f, +0.000100f, -0.000241f, +0.000039f, +0.000115f, -0.000072f, -0.000224f, +0.000258f, -0.000296f, + -0.000272f, +0.000156f, +0.000017f, -0.000065f, +0.000065f, +0.000310f, -0.000093f, +0.000055f, +0.000213f, -0.000152f, + +0.000018f, -0.000074f, -0.000152f, -0.000085f, +0.000101f, +0.000057f, -0.000184f, -0.000183f, -0.000081f, +0.000098f, + -0.000036f, +0.000011f, -0.000035f, -0.000027f, -0.000107f, -0.000099f, +0.000098f, +0.000086f, -0.000105f, -0.000123f, + +0.000082f, +0.000034f, -0.000049f, +0.000014f, +0.000017f, +0.000021f + }, + { + -0.002172f, +0.026331f, -0.001851f, -0.000637f, +0.000153f, -0.000628f, +0.000228f, -0.000610f, +0.000862f, +0.000535f, + -0.000553f, -0.002486f, -0.000221f, +0.003144f, -0.000844f, +0.000817f, -0.002913f, -0.001882f, -0.000007f, +0.000603f, + -0.001186f, +0.000536f, -0.000229f, -0.000219f, -0.001175f, +0.000970f, -0.000271f, +0.002098f, -0.000410f, +0.000167f, + -0.000251f, +0.000612f, -0.000883f, -0.001122f, +0.000870f, +0.000434f, -0.000413f, -0.000721f, -0.000757f, +0.001067f, + +0.000453f, -0.000257f, +0.001367f, +0.001055f, +0.000324f, -0.000237f, +0.000654f, -0.000005f, -0.000229f, +0.000171f, + +0.000644f, +0.000523f, +0.000292f, +0.000258f, +0.000187f, -0.000085f, -0.000089f, -0.000435f, +0.000326f, -0.000507f, + +0.000434f, -0.000050f, +0.000215f, +0.000020f, +0.000292f, -0.000315f, -0.000071f, +0.000016f, +0.000045f, -0.000078f, + +0.000207f, -0.000088f, -0.000068f, +0.000039f, -0.000037f, +0.000108f, -0.000064f, +0.000027f, -0.000177f, -0.000133f, + -0.000070f, +0.000069f, -0.000003f, -0.000018f, -0.000058f, +0.000133f, -0.000060f, +0.000012f, -0.000022f, -0.000000f, + +0.000082f, +0.000015f, +0.000114f, -0.000051f, -0.000037f, +0.000036f + }, + { + +0.000136f, -0.006038f, +0.001279f, -0.002179f, +0.000699f, -0.000250f, +0.000645f, -0.000813f, +0.000305f, -0.001268f, + +0.000618f, +0.004187f, -0.008717f, -0.008885f, +0.000409f, +0.001679f, -0.001096f, +0.004166f, +0.000316f, -0.000342f, + -0.007748f, +0.000960f, +0.001697f, +0.000603f, +0.005007f, +0.000904f, -0.003567f, +0.001832f, -0.001214f, +0.001499f, + -0.001095f, +0.001854f, -0.000562f, -0.000745f, +0.000482f, -0.000727f, +0.000610f, +0.000168f, +0.000091f, +0.000346f, + +0.000475f, +0.000558f, +0.000326f, +0.000610f, -0.000388f, +0.000194f, +0.000704f, +0.000244f, -0.000884f, -0.000353f, + -0.000426f, +0.000250f, +0.000452f, +0.000179f, +0.000694f, +0.000192f, +0.000095f, +0.000273f, -0.000142f, -0.000191f, + -0.000314f, -0.000085f, +0.000259f, +0.000086f, +0.000059f, +0.000137f, -0.000015f, +0.000112f, -0.000071f, +0.000134f, + +0.000079f, -0.000025f, +0.000040f, -0.000077f, +0.000107f, -0.000022f, +0.000134f, -0.000120f, +0.000040f, +0.000186f, + -0.000021f, -0.000106f, +0.000007f, -0.000131f, -0.000136f, +0.000043f, +0.000042f, +0.000138f, -0.000119f, -0.000030f, + -0.000117f, +0.000044f, +0.000119f, +0.000101f, -0.000122f, +0.000023f + }, + { + -0.009896f, +0.006933f, +0.001776f, -0.009048f, -0.000352f, -0.002900f, -0.004723f, +0.000691f, -0.000884f, +0.002288f, + -0.000400f, +0.001424f, +0.000755f, +0.003515f, +0.012136f, +0.000231f, -0.002693f, +0.000225f, -0.001154f, -0.001219f, + -0.000364f, +0.000396f, +0.000688f, +0.000816f, +0.001116f, -0.001244f, +0.000000f, -0.000159f, -0.000623f, -0.000354f, + -0.000368f, +0.000927f, -0.000861f, -0.001109f, +0.000090f, -0.000402f, -0.000693f, -0.000460f, -0.000634f, +0.000723f, + +0.001754f, +0.000448f, +0.000318f, -0.000257f, -0.000033f, -0.000484f, -0.000578f, +0.000217f, -0.000203f, +0.000642f, + +0.000906f, +0.000442f, -0.000172f, -0.000033f, -0.000111f, -0.000148f, +0.000006f, -0.000059f, -0.000043f, -0.000223f, + -0.000051f, -0.000051f, +0.000177f, -0.000303f, -0.000412f, -0.000076f, -0.000065f, +0.000004f, +0.000134f, -0.000033f, + +0.000059f, +0.000072f, -0.000037f, +0.000201f, -0.000183f, -0.000055f, -0.000073f, +0.000094f, -0.000055f, -0.000143f, + -0.000152f, -0.000052f, +0.000010f, -0.000148f, +0.000069f, -0.000136f, -0.000108f, +0.000110f, +0.000062f, -0.000130f, + +0.000051f, +0.000054f, -0.000082f, -0.000041f, -0.000037f, +0.000004f + }, + { + +0.000883f, -0.006375f, -0.000483f, +0.001895f, -0.000356f, +0.000053f, -0.000420f, -0.000065f, +0.000085f, +0.002214f, + -0.000757f, +0.001649f, -0.002233f, +0.016884f, +0.019388f, +0.005387f, +0.001507f, -0.000335f, +0.004574f, +0.001622f, + -0.001167f, +0.001350f, +0.000309f, -0.002454f, -0.000416f, +0.001787f, -0.001005f, +0.000102f, +0.000141f, -0.000419f, + -0.000458f, +0.000050f, +0.000325f, +0.000136f, +0.000511f, -0.001030f, -0.000123f, -0.000027f, -0.001109f, +0.000130f, + -0.000011f, +0.000424f, -0.000264f, +0.000014f, +0.000295f, +0.000478f, -0.000361f, -0.000203f, +0.000449f, +0.000172f, + +0.000115f, +0.000412f, +0.000482f, +0.000032f, -0.000062f, +0.000424f, -0.000187f, +0.000277f, +0.000106f, +0.000506f, + +0.000618f, -0.000048f, -0.000436f, +0.000042f, +0.000516f, +0.000264f, +0.000009f, -0.000209f, +0.000186f, +0.000210f, + +0.000188f, +0.000043f, +0.000258f, +0.000023f, +0.000024f, +0.000333f, -0.000050f, +0.000042f, +0.000012f, +0.000217f, + -0.000095f, -0.000066f, -0.000173f, -0.000121f, +0.000054f, -0.000173f, +0.000055f, -0.000101f, -0.000060f, +0.000056f, + +0.000015f, +0.000014f, -0.000058f, +0.000008f, +0.000032f, -0.000061f + } + }, + { + { + +0.009236f, +0.110738f, -0.049293f, +0.000469f, +0.007619f, -0.000835f, +0.000197f, +0.003063f, -0.000387f, +0.000444f, + +0.000636f, +0.000211f, +0.000405f, -0.000830f, -0.001662f, -0.002099f, +0.000007f, +0.000599f, +0.000368f, +0.000452f, + -0.000987f, -0.001452f, -0.001758f, +0.000366f, -0.000002f, -0.001283f, +0.000904f, -0.000132f, -0.001010f, +0.001420f, + -0.001234f, -0.000906f, +0.000340f, +0.000858f, -0.000406f, -0.000582f, -0.000630f, +0.000641f, -0.000119f, +0.000957f, + +0.000370f, +0.000789f, +0.000755f, -0.000659f, +0.000235f, -0.000102f, +0.000722f, -0.000128f, -0.000784f, +0.000380f, + +0.000157f, +0.000166f, -0.000525f, -0.000182f, -0.000419f, +0.000216f, -0.000338f, -0.000360f, -0.000515f, -0.000236f, + +0.000084f, -0.000203f, -0.000204f, -0.000153f, +0.000114f, +0.000021f, +0.000038f, +0.000034f, -0.000214f, +0.000074f, + +0.000203f, +0.000075f, +0.000066f, -0.000128f, -0.000251f, -0.000155f, +0.000017f, +0.000030f, +0.000056f, +0.000157f, + +0.000086f, +0.000009f, -0.000142f, +0.000040f, -0.000038f, +0.000117f, -0.000098f, -0.000074f, +0.000105f, +0.000111f, + -0.000022f, -0.000013f, -0.000057f, -0.000070f, -0.000039f, +0.000013f + }, + { + -0.000416f, -0.031612f, +0.003433f, +0.000711f, +0.001386f, -0.000873f, -0.001797f, +0.001479f, +0.000073f, +0.000183f, + -0.001028f, +0.000983f, -0.001508f, -0.002929f, -0.003856f, +0.001338f, +0.004101f, -0.000731f, -0.005639f, -0.002533f, + -0.005033f, -0.001149f, +0.000955f, -0.000792f, -0.002601f, +0.002787f, -0.000715f, +0.000338f, -0.001082f, -0.000356f, + -0.001353f, -0.001453f, +0.001128f, +0.000896f, +0.000696f, +0.001581f, -0.000031f, +0.001432f, +0.000312f, +0.000212f, + -0.000218f, +0.000433f, -0.000662f, -0.000716f, +0.000683f, +0.000336f, -0.000212f, -0.000217f, +0.000286f, +0.000574f, + -0.000262f, +0.000355f, -0.000003f, +0.000379f, -0.000461f, -0.000324f, -0.000398f, -0.000118f, +0.000193f, +0.000217f, + +0.000112f, +0.000163f, +0.000067f, -0.000069f, +0.000035f, +0.000116f, -0.000062f, +0.000283f, +0.000014f, -0.000011f, + +0.000113f, -0.000013f, -0.000179f, -0.000054f, +0.000175f, +0.000155f, -0.000024f, +0.000094f, +0.000110f, -0.000068f, + -0.000027f, -0.000014f, +0.000029f, -0.000012f, +0.000073f, +0.000125f, -0.000019f, -0.000060f, +0.000066f, -0.000087f, + -0.000114f, +0.000035f, +0.000042f, +0.000064f, -0.000023f, -0.000037f + }, + { + -0.001838f, +0.078249f, +0.010426f, +0.008956f, -0.000434f, +0.000485f, +0.000409f, -0.000029f, +0.000717f, +0.001146f, + +0.000516f, +0.001676f, -0.000634f, -0.001600f, -0.000388f, +0.001001f, +0.001160f, +0.002653f, +0.004056f, -0.002625f, + -0.000089f, +0.001038f, -0.002178f, +0.000333f, +0.002012f, -0.001904f, -0.000803f, +0.000741f, -0.000370f, +0.001364f, + -0.000348f, -0.002042f, +0.001248f, +0.000658f, -0.000753f, -0.000410f, +0.000524f, +0.000965f, -0.000540f, -0.001849f, + +0.000528f, +0.000173f, -0.000889f, +0.000241f, +0.000798f, -0.000434f, -0.000128f, +0.000206f, +0.000098f, +0.000060f, + -0.000847f, +0.000793f, -0.000490f, +0.000618f, -0.000035f, -0.000285f, +0.000634f, +0.000195f, -0.000364f, -0.000592f, + -0.000079f, +0.000176f, +0.000022f, -0.000414f, -0.000200f, +0.000188f, +0.000050f, -0.000193f, -0.000247f, -0.000176f, + +0.000044f, +0.000077f, +0.000128f, -0.000103f, -0.000033f, -0.000101f, +0.000212f, -0.000014f, -0.000049f, -0.000040f, + -0.000077f, +0.000068f, -0.000092f, -0.000026f, +0.000072f, +0.000030f, +0.000026f, -0.000082f, -0.000015f, +0.000022f, + -0.000167f, -0.000082f, +0.000037f, -0.000037f, -0.000073f, +0.000049f + }, + { + -0.007164f, -0.066714f, -0.003882f, +0.007669f, -0.000506f, +0.000519f, -0.000057f, -0.000462f, +0.000461f, -0.000397f, + -0.001615f, -0.000639f, +0.003307f, -0.000974f, -0.000328f, +0.000204f, -0.000096f, -0.001083f, +0.000129f, +0.000259f, + -0.000461f, +0.000298f, -0.000067f, -0.000595f, -0.000603f, -0.000389f, +0.000285f, +0.000651f, -0.000660f, +0.000972f, + -0.000218f, -0.001196f, +0.000556f, -0.000253f, +0.000365f, -0.000220f, -0.000611f, +0.000329f, -0.000208f, -0.000118f, + -0.000617f, +0.000172f, +0.000333f, -0.000669f, -0.000992f, +0.000734f, -0.000146f, +0.000081f, +0.000052f, -0.000094f, + +0.000271f, +0.000079f, +0.000144f, +0.000042f, +0.000460f, +0.000004f, +0.000106f, -0.000147f, -0.000173f, -0.000285f, + +0.000436f, +0.000263f, +0.000170f, +0.000135f, +0.000193f, -0.000102f, +0.000000f, +0.000027f, -0.000026f, +0.000149f, + -0.000032f, -0.000217f, +0.000024f, +0.000019f, +0.000177f, -0.000066f, +0.000064f, -0.000079f, +0.000036f, +0.000074f, + +0.000105f, +0.000004f, -0.000086f, -0.000007f, -0.000041f, -0.000065f, -0.000007f, -0.000085f, -0.000023f, +0.000060f, + +0.000062f, -0.000004f, -0.000070f, +0.000075f, +0.000010f, -0.000012f + }, + { + +0.001351f, -0.001336f, -0.003154f, +0.000972f, +0.000081f, -0.000347f, +0.000441f, +0.001302f, -0.001242f, -0.000036f, + +0.001479f, +0.000510f, +0.001985f, -0.001265f, +0.002119f, -0.002985f, -0.006814f, +0.016476f, -0.006939f, +0.001769f, + -0.000433f, -0.000784f, +0.000409f, -0.002955f, -0.003054f, +0.001612f, +0.002377f, +0.001391f, -0.001769f, +0.000950f, + +0.000246f, +0.000666f, -0.001661f, +0.000576f, +0.000847f, +0.001150f, +0.000217f, -0.000153f, +0.000002f, +0.001347f, + +0.000371f, +0.000779f, -0.000167f, +0.000549f, -0.000763f, +0.000208f, +0.000037f, -0.000275f, +0.000268f, +0.000675f, + -0.000385f, +0.000169f, +0.000092f, +0.000377f, +0.000364f, +0.000242f, +0.000008f, -0.000083f, -0.000175f, +0.000293f, + -0.000089f, -0.000433f, -0.000337f, +0.000239f, +0.000320f, -0.000137f, -0.000130f, -0.000251f, +0.000191f, +0.000052f, + -0.000116f, +0.000040f, +0.000028f, +0.000109f, +0.000119f, -0.000145f, +0.000120f, +0.000166f, +0.000155f, -0.000079f, + -0.000062f, -0.000090f, -0.000086f, +0.000100f, -0.000116f, -0.000004f, +0.000000f, -0.000097f, +0.000062f, +0.000071f, + +0.000125f, +0.000082f, -0.000023f, +0.000022f, +0.000050f, +0.000018f + }, + { + -0.014080f, -0.119594f, +0.003141f, -0.002673f, +0.001153f, -0.000434f, +0.000633f, -0.000091f, -0.000751f, +0.000827f, + +0.000860f, -0.000681f, -0.000230f, -0.002442f, +0.000108f, -0.000153f, -0.000283f, +0.001338f, -0.000282f, +0.001631f, + +0.001527f, -0.001357f, -0.000264f, -0.001012f, -0.000759f, +0.000131f, -0.000503f, -0.000033f, -0.001396f, -0.000390f, + -0.001474f, -0.000346f, -0.000903f, +0.000908f, -0.000950f, +0.001059f, +0.000253f, +0.000721f, +0.000195f, +0.000482f, + +0.000890f, +0.000430f, +0.000163f, +0.000126f, -0.000061f, +0.000296f, -0.000207f, +0.000407f, -0.000176f, +0.001214f, + -0.000341f, +0.000149f, +0.000252f, +0.000325f, -0.000192f, -0.000527f, +0.000439f, +0.000109f, -0.000092f, -0.000026f, + -0.000036f, +0.000058f, +0.000260f, +0.000158f, -0.000013f, -0.000207f, +0.000120f, +0.000072f, -0.000056f, +0.000101f, + -0.000015f, +0.000138f, +0.000071f, +0.000034f, +0.000021f, -0.000014f, +0.000264f, -0.000089f, +0.000031f, +0.000097f, + -0.000094f, -0.000042f, -0.000130f, +0.000116f, +0.000062f, +0.000123f, -0.000043f, +0.000085f, -0.000129f, -0.000027f, + +0.000034f, +0.000046f, -0.000057f, -0.000047f, +0.000075f, +0.000021f + }, + { + +0.000078f, +0.000638f, -0.002747f, -0.001906f, -0.000167f, +0.000012f, +0.000733f, +0.000983f, +0.000058f, -0.000241f, + +0.000155f, -0.000475f, +0.001880f, -0.001572f, -0.001909f, -0.007032f, -0.004698f, +0.001676f, +0.001047f, -0.002246f, + +0.000261f, -0.001190f, -0.002493f, -0.000606f, +0.000954f, -0.001424f, -0.002308f, -0.000505f, -0.002101f, -0.001155f, + -0.000942f, -0.000975f, -0.002449f, +0.001507f, -0.000202f, -0.000140f, -0.000088f, -0.000172f, -0.000365f, +0.000835f, + -0.000174f, -0.001551f, +0.000643f, +0.000467f, +0.000390f, -0.000297f, +0.000463f, +0.000303f, -0.000222f, -0.000077f, + -0.000074f, +0.000055f, -0.000152f, -0.000696f, -0.000015f, +0.000046f, -0.000051f, -0.000189f, +0.000021f, +0.000202f, + +0.000105f, +0.000064f, -0.000399f, -0.000073f, +0.000196f, +0.000176f, +0.000342f, +0.000519f, +0.000000f, -0.000119f, + -0.000004f, +0.000184f, +0.000068f, +0.000117f, +0.000201f, +0.000141f, -0.000014f, +0.000147f, -0.000010f, +0.000012f, + +0.000036f, +0.000086f, +0.000001f, -0.000049f, +0.000040f, -0.000042f, -0.000084f, -0.000075f, +0.000004f, -0.000063f, + -0.000011f, +0.000003f, +0.000001f, -0.000044f, -0.000008f, -0.000006f + }, + { + +0.015867f, +0.022747f, -0.009229f, +0.001436f, +0.000559f, +0.000136f, -0.000390f, +0.000421f, +0.000413f, +0.000330f, + -0.000096f, -0.001281f, -0.000053f, -0.000160f, -0.002369f, +0.000658f, -0.001380f, -0.000646f, +0.000078f, +0.000161f, + -0.000208f, +0.000043f, +0.000174f, +0.000846f, -0.001568f, +0.000566f, +0.000619f, -0.000971f, -0.000270f, -0.000477f, + +0.000937f, -0.000255f, +0.000763f, +0.000714f, +0.000631f, +0.000365f, +0.000863f, +0.000986f, -0.000170f, -0.000652f, + -0.000123f, +0.000760f, -0.000022f, -0.001309f, -0.000547f, +0.000926f, -0.000613f, -0.000643f, +0.000068f, +0.000636f, + +0.000786f, +0.000065f, -0.000289f, -0.000243f, +0.000664f, +0.000069f, -0.000099f, -0.000198f, +0.000131f, -0.000091f, + +0.000130f, +0.000106f, +0.000550f, -0.000012f, -0.000433f, +0.000117f, -0.000064f, -0.000019f, +0.000107f, -0.000057f, + +0.000263f, +0.000095f, +0.000042f, +0.000107f, -0.000059f, -0.000207f, +0.000142f, +0.000066f, -0.000184f, -0.000009f, + -0.000086f, -0.000008f, +0.000037f, +0.000072f, -0.000028f, +0.000015f, +0.000082f, +0.000013f, -0.000021f, +0.000041f, + +0.000003f, -0.000057f, +0.000016f, +0.000085f, -0.000053f, -0.000063f + }, + { + +0.000134f, +0.009647f, +0.005763f, -0.001276f, +0.000079f, -0.000126f, -0.000696f, +0.000785f, +0.000331f, +0.000045f, + +0.000045f, +0.000534f, -0.001007f, -0.002069f, +0.009109f, -0.007831f, -0.005652f, +0.003371f, +0.001586f, +0.002096f, + +0.002238f, -0.001749f, +0.002013f, +0.000760f, +0.001045f, -0.003587f, +0.002233f, +0.000736f, -0.001610f, +0.000541f, + -0.001583f, +0.000241f, +0.001882f, +0.000710f, +0.000815f, -0.001101f, +0.000006f, +0.001388f, +0.001397f, -0.000388f, + +0.000859f, -0.000591f, +0.000257f, +0.000829f, +0.000230f, +0.000371f, +0.000669f, -0.000570f, +0.000449f, -0.000038f, + -0.000382f, -0.000271f, -0.000061f, -0.000427f, -0.000016f, -0.000471f, +0.000418f, +0.000146f, -0.000122f, -0.000206f, + -0.000015f, +0.000049f, +0.000556f, -0.000387f, -0.000019f, +0.000294f, -0.000055f, +0.000052f, +0.000103f, -0.000033f, + -0.000169f, -0.000202f, +0.000125f, +0.000044f, +0.000235f, -0.000240f, -0.000169f, -0.000030f, -0.000053f, +0.000059f, + -0.000086f, -0.000058f, +0.000070f, +0.000081f, +0.000020f, +0.000030f, +0.000061f, +0.000117f, -0.000027f, -0.000022f, + +0.000020f, -0.000012f, -0.000024f, +0.000002f, +0.000012f, +0.000070f + }, + { + -0.002073f, -0.036831f, +0.009674f, -0.003463f, +0.000527f, +0.005028f, -0.000284f, -0.001447f, -0.000028f, +0.000366f, + +0.001148f, -0.001020f, +0.000157f, -0.000013f, -0.000250f, -0.000302f, -0.000902f, +0.003430f, +0.000350f, -0.001560f, + +0.000318f, +0.000122f, +0.000106f, -0.000387f, +0.001729f, -0.000826f, -0.000338f, -0.000680f, +0.000911f, -0.001588f, + +0.000767f, +0.000018f, -0.001301f, -0.000048f, -0.000061f, -0.000876f, -0.000060f, -0.000472f, +0.000648f, +0.000362f, + +0.000909f, -0.000001f, +0.000454f, +0.000192f, +0.000455f, +0.000858f, +0.000401f, -0.000066f, -0.000033f, +0.000777f, + -0.000345f, -0.000149f, +0.000402f, -0.000373f, -0.000429f, +0.000325f, +0.000335f, +0.000104f, -0.000077f, +0.000010f, + -0.000145f, -0.000260f, +0.000092f, +0.000072f, +0.000033f, +0.000064f, +0.000005f, +0.000021f, +0.000123f, +0.000115f, + +0.000160f, -0.000132f, -0.000029f, +0.000038f, -0.000111f, -0.000044f, -0.000016f, -0.000151f, +0.000200f, -0.000101f, + -0.000108f, +0.000046f, +0.000139f, +0.000035f, +0.000064f, +0.000124f, -0.000014f, -0.000007f, +0.000052f, +0.000032f, + +0.000003f, +0.000016f, +0.000005f, -0.000013f, +0.000027f, +0.000088f + }, + { + +0.000592f, -0.000545f, +0.001496f, -0.004343f, -0.000170f, +0.000782f, -0.001690f, +0.000459f, -0.000287f, +0.001754f, + -0.000539f, -0.001640f, +0.000433f, +0.000643f, +0.002622f, -0.002182f, -0.001746f, -0.000148f, +0.002228f, -0.000099f, + -0.000963f, +0.002279f, -0.000216f, -0.000102f, +0.000966f, +0.001733f, +0.000820f, +0.000064f, +0.001480f, -0.000183f, + -0.000196f, -0.000631f, +0.000219f, -0.001117f, +0.001864f, +0.000735f, -0.001198f, +0.000482f, +0.000052f, -0.000016f, + -0.000482f, +0.000367f, +0.001195f, +0.000375f, -0.000654f, -0.000075f, +0.000074f, -0.000373f, +0.000174f, -0.000074f, + -0.000016f, -0.000342f, -0.000149f, -0.000733f, -0.000034f, +0.000009f, +0.000123f, -0.000126f, +0.000180f, -0.000176f, + +0.000227f, +0.000032f, -0.000033f, +0.000090f, +0.000047f, +0.000065f, +0.000159f, +0.000205f, -0.000014f, -0.000063f, + +0.000130f, +0.000058f, +0.000113f, +0.000074f, +0.000049f, -0.000092f, -0.000157f, -0.000170f, +0.000104f, +0.000024f, + -0.000110f, +0.000042f, -0.000007f, -0.000132f, -0.000084f, -0.000089f, -0.000026f, +0.000069f, -0.000070f, -0.000063f, + +0.000080f, -0.000006f, -0.000031f, +0.000012f, +0.000060f, -0.000053f + }, + { + -0.002759f, +0.025671f, -0.000476f, +0.001796f, +0.001986f, -0.002626f, +0.002637f, +0.000751f, +0.000462f, -0.001279f, + -0.001969f, +0.000543f, -0.001474f, +0.002602f, -0.000596f, +0.000313f, -0.000618f, -0.000822f, -0.000334f, -0.000367f, + -0.000219f, +0.000027f, -0.000019f, +0.000400f, -0.001246f, +0.001066f, -0.000573f, +0.001233f, +0.000356f, +0.000232f, + -0.000025f, +0.000752f, -0.000327f, +0.000166f, -0.000349f, -0.000443f, -0.000286f, -0.000945f, -0.000309f, +0.000561f, + +0.001050f, -0.000105f, +0.000482f, -0.000798f, +0.000181f, -0.000801f, -0.000056f, -0.000154f, -0.000208f, +0.000147f, + +0.000317f, -0.000373f, -0.000105f, -0.000407f, +0.000077f, -0.000144f, +0.000147f, -0.000464f, +0.000090f, -0.000309f, + +0.000426f, -0.000441f, -0.000041f, -0.000017f, +0.000085f, -0.000266f, +0.000021f, -0.000027f, -0.000006f, +0.000132f, + +0.000077f, -0.000045f, -0.000019f, +0.000038f, -0.000040f, -0.000010f, -0.000032f, +0.000015f, -0.000118f, -0.000042f, + -0.000015f, +0.000180f, -0.000023f, +0.000096f, -0.000000f, +0.000019f, -0.000008f, +0.000026f, +0.000013f, +0.000045f, + +0.000011f, +0.000004f, +0.000048f, -0.000060f, +0.000027f, +0.000083f + }, + { + -0.000358f, -0.007046f, +0.002538f, -0.001910f, -0.000986f, +0.000757f, +0.000113f, -0.000582f, +0.001091f, -0.001718f, + +0.001073f, +0.003004f, +0.006190f, +0.017858f, +0.001899f, -0.001443f, -0.001816f, +0.002617f, -0.002131f, -0.000529f, + -0.007083f, +0.004123f, +0.001972f, -0.000928f, +0.002154f, +0.002508f, -0.002585f, +0.002938f, -0.000712f, +0.003328f, + -0.002551f, +0.000448f, -0.001641f, -0.000996f, +0.000789f, -0.000292f, +0.000988f, -0.000059f, +0.000271f, -0.000421f, + +0.000170f, +0.000143f, -0.000215f, -0.000135f, -0.000213f, +0.000041f, +0.000102f, +0.000275f, -0.000040f, +0.000479f, + -0.000129f, -0.000115f, +0.000236f, +0.000187f, +0.000591f, +0.000255f, -0.000098f, +0.000151f, -0.000199f, -0.000333f, + +0.000074f, +0.000460f, +0.000073f, -0.000096f, -0.000031f, +0.000069f, -0.000129f, -0.000041f, +0.000017f, +0.000069f, + -0.000054f, -0.000239f, +0.000096f, -0.000209f, +0.000189f, +0.000094f, +0.000205f, -0.000028f, -0.000131f, +0.000099f, + -0.000110f, -0.000164f, +0.000020f, -0.000089f, -0.000025f, -0.000003f, +0.000087f, +0.000027f, -0.000066f, -0.000044f, + -0.000165f, +0.000075f, +0.000069f, -0.000052f, -0.000035f, +0.000084f + }, + { + +0.002450f, +0.024900f, +0.004091f, -0.005184f, +0.000675f, -0.000754f, -0.005171f, +0.001963f, -0.000645f, +0.000719f, + -0.002055f, -0.000465f, -0.000974f, -0.006695f, -0.000453f, +0.001111f, +0.001704f, +0.000346f, -0.000974f, -0.000015f, + -0.000072f, +0.000575f, +0.000330f, +0.001589f, +0.001811f, +0.000229f, +0.000881f, +0.001106f, -0.000656f, -0.000904f, + -0.000315f, +0.000256f, -0.000440f, -0.000704f, +0.000834f, -0.000078f, +0.000101f, -0.000059f, -0.000659f, +0.000046f, + +0.000630f, +0.000637f, +0.000261f, +0.000013f, +0.000534f, -0.000482f, -0.000476f, +0.000777f, -0.000799f, +0.000461f, + +0.000137f, +0.000089f, -0.000338f, -0.000217f, -0.000227f, -0.000277f, -0.000022f, +0.000266f, +0.000073f, +0.000330f, + +0.000163f, +0.000108f, -0.000101f, -0.000347f, -0.000057f, +0.000036f, +0.000063f, -0.000111f, +0.000073f, -0.000162f, + +0.000034f, -0.000245f, -0.000103f, +0.000041f, -0.000156f, -0.000061f, +0.000014f, +0.000009f, -0.000073f, -0.000084f, + -0.000088f, -0.000124f, -0.000101f, -0.000106f, +0.000031f, -0.000078f, +0.000113f, +0.000102f, -0.000034f, -0.000091f, + -0.000027f, -0.000048f, -0.000058f, -0.000074f, +0.000030f, +0.000024f + }, + { + -0.000477f, -0.006651f, +0.002027f, +0.002046f, +0.000151f, +0.000088f, -0.000336f, -0.000056f, -0.000188f, +0.001821f, + -0.000289f, +0.000894f, -0.001436f, -0.006564f, -0.024410f, -0.003211f, +0.001014f, -0.000498f, +0.002829f, -0.002990f, + +0.000701f, +0.003583f, -0.001774f, -0.000924f, +0.001543f, +0.000670f, -0.002492f, -0.000684f, +0.000002f, -0.000123f, + -0.000149f, +0.000761f, +0.001143f, -0.000277f, -0.000475f, +0.000048f, -0.000412f, -0.000867f, -0.000731f, -0.000337f, + +0.001448f, +0.000672f, -0.000449f, -0.000064f, +0.000340f, -0.000192f, -0.000368f, -0.000147f, +0.000475f, -0.000085f, + -0.000317f, +0.000503f, +0.000566f, -0.000281f, -0.000122f, +0.000128f, -0.000321f, -0.000041f, +0.000098f, +0.000451f, + +0.000294f, -0.000145f, -0.000200f, +0.000267f, +0.000263f, -0.000051f, -0.000049f, +0.000210f, +0.000233f, -0.000090f, + -0.000114f, -0.000119f, +0.000101f, -0.000048f, +0.000004f, +0.000012f, +0.000049f, +0.000102f, +0.000021f, +0.000037f, + -0.000272f, -0.000066f, -0.000093f, +0.000116f, +0.000062f, -0.000152f, +0.000064f, -0.000056f, -0.000054f, +0.000042f, + -0.000019f, -0.000017f, -0.000008f, +0.000024f, -0.000044f, -0.000080f + } + }, + { + { + -0.006270f, +0.033016f, +0.028530f, -0.001216f, +0.001499f, +0.002033f, -0.000518f, +0.001422f, +0.000832f, -0.000674f, + -0.001569f, +0.001412f, +0.001770f, +0.001316f, -0.005627f, -0.001343f, +0.000154f, +0.001094f, -0.001807f, +0.003053f, + -0.000986f, -0.001950f, -0.000770f, +0.000114f, -0.000572f, -0.000255f, +0.001431f, +0.000065f, -0.000838f, -0.000168f, + -0.000371f, +0.000094f, -0.000662f, +0.000397f, -0.000275f, +0.000216f, -0.001069f, +0.000301f, -0.000486f, +0.000771f, + +0.001202f, +0.000710f, -0.000207f, +0.000332f, +0.000035f, -0.000152f, +0.000977f, -0.000696f, +0.000054f, +0.000178f, + -0.000388f, -0.000021f, +0.000206f, +0.000020f, -0.000055f, -0.000372f, +0.000264f, -0.000250f, -0.000271f, +0.000002f, + -0.000453f, -0.000094f, +0.000107f, +0.000093f, +0.000065f, +0.000139f, -0.000128f, -0.000133f, +0.000010f, +0.000072f, + +0.000418f, -0.000002f, +0.000045f, -0.000236f, -0.000110f, -0.000020f, -0.000084f, +0.000003f, +0.000128f, -0.000156f, + +0.000049f, -0.000110f, -0.000139f, -0.000008f, +0.000035f, +0.000067f, -0.000185f, -0.000056f, +0.000016f, +0.000009f, + +0.000016f, +0.000004f, -0.000047f, -0.000015f, -0.000039f, -0.000022f + }, + { + +0.000415f, -0.024741f, -0.005351f, -0.001447f, -0.000790f, +0.000858f, -0.002587f, +0.000493f, +0.000013f, +0.000548f, + -0.000606f, +0.000282f, -0.001540f, -0.001123f, -0.003431f, +0.001714f, +0.003448f, +0.000571f, -0.005109f, -0.002694f, + -0.001630f, -0.001546f, +0.000564f, -0.000555f, +0.000286f, -0.000380f, +0.000922f, -0.002262f, -0.000450f, +0.000732f, + -0.002381f, -0.000419f, -0.000714f, +0.000226f, +0.000655f, +0.001115f, +0.001214f, +0.000396f, +0.001042f, -0.000095f, + +0.000367f, -0.000658f, -0.000863f, -0.000486f, +0.000448f, +0.000135f, -0.000190f, -0.000275f, +0.000800f, -0.000231f, + -0.000014f, +0.000128f, -0.000237f, -0.000179f, -0.000117f, +0.000367f, -0.000231f, -0.000048f, +0.000247f, +0.000022f, + -0.000310f, -0.000106f, +0.000169f, -0.000071f, -0.000085f, +0.000125f, +0.000021f, -0.000142f, +0.000140f, +0.000046f, + +0.000006f, -0.000110f, +0.000082f, +0.000010f, +0.000019f, +0.000075f, +0.000163f, +0.000204f, +0.000010f, -0.000221f, + +0.000090f, +0.000034f, +0.000083f, -0.000038f, +0.000045f, -0.000061f, -0.000081f, -0.000003f, -0.000039f, -0.000056f, + +0.000017f, +0.000014f, -0.000004f, -0.000186f, -0.000001f, +0.000058f + }, + { + +0.000789f, +0.090351f, +0.008249f, +0.004861f, -0.004471f, -0.000407f, +0.000619f, +0.001162f, +0.000081f, +0.000773f, + +0.000465f, +0.001331f, +0.002643f, -0.003903f, -0.002642f, +0.001058f, +0.000481f, +0.003117f, +0.000858f, -0.000258f, + +0.001480f, -0.000132f, -0.000187f, +0.001133f, -0.000478f, -0.002813f, -0.000517f, +0.000758f, +0.000655f, -0.001469f, + +0.001048f, +0.000485f, -0.000555f, +0.000634f, -0.000258f, +0.000495f, -0.001527f, +0.001514f, -0.000620f, -0.000538f, + +0.000126f, +0.000867f, -0.000470f, -0.000633f, +0.000840f, -0.000853f, -0.000181f, -0.000426f, +0.000141f, +0.000257f, + -0.000665f, +0.000248f, -0.000342f, +0.000859f, -0.000615f, -0.000262f, +0.000047f, +0.000257f, +0.000062f, -0.000340f, + -0.000303f, +0.000087f, -0.000237f, -0.000483f, -0.000040f, +0.000084f, -0.000165f, -0.000014f, -0.000349f, -0.000059f, + -0.000162f, -0.000026f, +0.000034f, -0.000005f, -0.000192f, +0.000141f, +0.000335f, -0.000039f, -0.000257f, +0.000051f, + -0.000048f, -0.000159f, -0.000008f, +0.000160f, -0.000049f, -0.000054f, -0.000089f, +0.000009f, +0.000000f, -0.000038f, + -0.000057f, +0.000035f, +0.000049f, -0.000030f, +0.000020f, -0.000009f + }, + { + -0.004249f, -0.073034f, +0.000355f, +0.006096f, -0.001839f, +0.000477f, -0.000382f, +0.000427f, -0.000501f, -0.000333f, + -0.000793f, +0.000312f, +0.000390f, +0.001847f, +0.000358f, +0.001111f, +0.000262f, -0.000903f, -0.000655f, +0.000791f, + -0.000348f, +0.000049f, -0.000095f, -0.000243f, +0.000279f, +0.000007f, +0.000395f, +0.000358f, -0.000395f, -0.001028f, + -0.000369f, -0.000345f, -0.000125f, -0.000887f, +0.000723f, -0.001103f, +0.000088f, +0.000086f, +0.000213f, -0.000523f, + -0.000254f, +0.000328f, -0.000033f, -0.000749f, -0.000223f, -0.000329f, -0.000406f, +0.000289f, +0.000374f, +0.000139f, + -0.000098f, +0.000152f, +0.000379f, -0.000127f, +0.000163f, +0.000046f, -0.000234f, -0.000407f, +0.000017f, +0.000169f, + +0.000002f, +0.000062f, +0.000105f, +0.000149f, -0.000260f, +0.000131f, -0.000250f, -0.000087f, +0.000232f, -0.000148f, + -0.000060f, +0.000029f, +0.000234f, -0.000016f, +0.000134f, -0.000028f, -0.000014f, -0.000060f, +0.000049f, -0.000022f, + -0.000036f, +0.000014f, -0.000094f, +0.000090f, -0.000079f, +0.000035f, +0.000008f, -0.000070f, +0.000100f, +0.000026f, + -0.000053f, -0.000001f, +0.000002f, -0.000023f, -0.000004f, -0.000011f + }, + { + -0.001291f, -0.004106f, +0.004482f, -0.000455f, -0.000439f, +0.000471f, +0.000366f, -0.000196f, -0.000754f, -0.000372f, + +0.001203f, +0.000460f, +0.001481f, +0.002784f, +0.001174f, -0.002943f, +0.002636f, -0.000907f, -0.002699f, +0.002181f, + +0.000583f, +0.000745f, -0.002020f, -0.000318f, -0.001486f, +0.003489f, -0.000704f, +0.000735f, +0.000416f, -0.000626f, + -0.000110f, +0.001627f, -0.000785f, -0.000935f, +0.001703f, -0.000092f, +0.001157f, -0.000886f, +0.000869f, +0.001405f, + -0.000001f, +0.000705f, -0.000731f, -0.000079f, -0.000395f, -0.000217f, -0.000127f, -0.000300f, -0.000191f, +0.000410f, + -0.000203f, +0.000366f, +0.000348f, +0.000025f, +0.000530f, +0.000317f, +0.000184f, -0.000422f, -0.000183f, +0.000232f, + -0.000057f, -0.000490f, +0.000066f, -0.000076f, -0.000387f, -0.000312f, -0.000150f, -0.000077f, +0.000168f, -0.000028f, + -0.000067f, +0.000167f, +0.000215f, +0.000143f, +0.000132f, -0.000135f, +0.000169f, -0.000002f, -0.000088f, -0.000149f, + -0.000200f, -0.000081f, +0.000150f, +0.000014f, -0.000158f, +0.000020f, -0.000080f, -0.000017f, +0.000100f, +0.000034f, + +0.000061f, +0.000000f, +0.000017f, +0.000105f, +0.000011f, -0.000050f + }, + { + -0.004646f, -0.127692f, +0.004030f, -0.000911f, -0.001238f, +0.000304f, -0.000389f, -0.000749f, +0.001204f, -0.000196f, + -0.001876f, -0.000127f, -0.000111f, -0.001092f, -0.001592f, +0.000796f, +0.000413f, +0.000764f, +0.000019f, +0.000735f, + +0.000357f, -0.001868f, -0.000211f, -0.000821f, -0.000083f, +0.000137f, +0.000271f, -0.000953f, -0.000539f, -0.000884f, + -0.001530f, -0.000029f, -0.000002f, +0.000503f, -0.000024f, +0.000544f, -0.000440f, +0.000782f, +0.000654f, +0.000638f, + +0.000070f, +0.000553f, -0.000008f, -0.000233f, -0.000063f, +0.000111f, +0.000540f, +0.000120f, +0.000006f, +0.000713f, + +0.000121f, +0.000079f, -0.000167f, +0.000376f, -0.000354f, -0.000246f, -0.000178f, -0.000380f, +0.000294f, +0.000238f, + +0.000011f, +0.000072f, -0.000256f, +0.000027f, -0.000035f, -0.000036f, -0.000076f, -0.000116f, +0.000115f, -0.000102f, + +0.000086f, -0.000074f, +0.000129f, +0.000098f, -0.000062f, +0.000145f, -0.000010f, -0.000019f, +0.000175f, +0.000132f, + +0.000004f, +0.000070f, +0.000112f, +0.000175f, -0.000034f, +0.000010f, -0.000060f, -0.000021f, -0.000105f, +0.000015f, + -0.000003f, +0.000020f, -0.000086f, +0.000082f, +0.000066f, +0.000041f + }, + { + +0.000518f, -0.005934f, -0.001649f, -0.000011f, -0.000190f, +0.000270f, +0.000153f, +0.001662f, -0.000763f, +0.000377f, + -0.000425f, +0.000412f, +0.001107f, +0.001776f, -0.005289f, -0.003920f, +0.002373f, -0.001942f, +0.001448f, -0.000072f, + -0.000745f, +0.000301f, -0.003613f, +0.000169f, +0.002265f, -0.003552f, +0.001710f, -0.002943f, -0.000889f, -0.000770f, + -0.002171f, +0.000566f, -0.001215f, +0.000053f, -0.001173f, -0.000532f, +0.000061f, +0.000600f, -0.000104f, -0.000494f, + -0.000609f, -0.000080f, +0.000205f, +0.001028f, +0.000408f, -0.000778f, +0.000147f, +0.000492f, -0.000305f, +0.000167f, + -0.000100f, -0.000026f, -0.000354f, -0.000442f, -0.000233f, -0.000021f, -0.000183f, +0.000019f, -0.000093f, +0.000364f, + +0.000309f, -0.000036f, +0.000008f, +0.000062f, +0.000062f, +0.000143f, +0.000302f, +0.000121f, +0.000042f, +0.000190f, + +0.000207f, -0.000120f, -0.000141f, +0.000168f, +0.000076f, +0.000080f, -0.000118f, -0.000057f, -0.000031f, -0.000081f, + +0.000048f, +0.000035f, +0.000065f, -0.000049f, -0.000023f, -0.000073f, -0.000040f, +0.000058f, -0.000005f, +0.000056f, + +0.000114f, +0.000093f, -0.000019f, -0.000086f, +0.000045f, +0.000027f + }, + { + -0.008895f, +0.040617f, +0.010404f, +0.000673f, +0.000892f, +0.000496f, -0.000560f, +0.000637f, +0.001055f, -0.000317f, + -0.000511f, -0.000290f, +0.000104f, -0.002868f, -0.002339f, +0.000381f, -0.000636f, -0.000102f, +0.000714f, -0.000480f, + -0.000480f, +0.000634f, -0.000764f, +0.000558f, -0.000092f, -0.000174f, -0.000003f, -0.001384f, -0.000178f, -0.000698f, + +0.000451f, +0.000420f, +0.001279f, +0.000059f, +0.000369f, -0.000536f, +0.000902f, +0.000362f, +0.000165f, -0.000806f, + +0.000143f, +0.000276f, +0.000771f, -0.001055f, -0.000848f, +0.000306f, -0.000212f, +0.000091f, +0.000527f, +0.000322f, + +0.000176f, -0.000285f, +0.000294f, +0.000451f, +0.000090f, +0.000175f, -0.000410f, -0.000148f, +0.000058f, +0.000021f, + +0.000283f, +0.000190f, +0.000342f, -0.000049f, -0.000248f, +0.000073f, -0.000166f, +0.000214f, +0.000014f, +0.000147f, + +0.000236f, +0.000018f, +0.000067f, -0.000071f, -0.000253f, +0.000035f, +0.000003f, -0.000184f, +0.000042f, -0.000150f, + -0.000059f, +0.000045f, +0.000090f, +0.000071f, +0.000053f, +0.000032f, +0.000062f, -0.000105f, -0.000051f, +0.000024f, + -0.000018f, +0.000021f, -0.000019f, -0.000013f, -0.000086f, -0.000026f + }, + { + +0.001384f, +0.007739f, +0.000050f, +0.000424f, -0.000525f, +0.000210f, -0.000301f, -0.000056f, -0.000341f, -0.000043f, + +0.000466f, +0.001485f, +0.000383f, -0.000958f, +0.001715f, -0.003393f, -0.003521f, +0.002332f, +0.001977f, +0.002281f, + -0.000448f, +0.000473f, +0.002324f, -0.000449f, -0.001558f, -0.000667f, +0.001842f, +0.000039f, -0.001274f, -0.001051f, + +0.001176f, -0.000888f, +0.002300f, +0.001589f, -0.000255f, -0.000960f, -0.000219f, +0.001332f, +0.001058f, +0.000020f, + -0.000288f, -0.000646f, +0.000473f, +0.000053f, -0.000180f, +0.000366f, +0.000262f, -0.000197f, -0.000041f, +0.000289f, + -0.000072f, -0.000023f, -0.000015f, -0.000762f, -0.000254f, +0.000233f, -0.000091f, -0.000186f, -0.000405f, -0.000001f, + +0.000140f, +0.000414f, +0.000215f, +0.000046f, +0.000419f, +0.000437f, +0.000297f, +0.000091f, +0.000101f, -0.000001f, + +0.000004f, +0.000025f, -0.000019f, +0.000037f, -0.000131f, -0.000221f, -0.000177f, -0.000060f, +0.000001f, +0.000030f, + -0.000034f, +0.000067f, +0.000258f, +0.000086f, -0.000055f, -0.000031f, -0.000086f, -0.000112f, +0.000010f, +0.000082f, + -0.000036f, -0.000020f, -0.000013f, -0.000063f, -0.000015f, -0.000007f + }, + { + -0.000453f, -0.036279f, +0.001159f, +0.001735f, +0.001368f, -0.001045f, +0.007626f, -0.001646f, -0.000532f, -0.000373f, + -0.000039f, -0.001109f, -0.001038f, +0.000424f, -0.000454f, +0.000257f, -0.001655f, +0.003378f, -0.001248f, +0.001106f, + -0.000146f, +0.000131f, -0.001191f, +0.000733f, +0.000812f, -0.000248f, +0.000031f, -0.000693f, -0.000459f, -0.000544f, + +0.000605f, +0.000152f, -0.000463f, -0.002754f, +0.000704f, -0.000326f, -0.000215f, +0.000113f, +0.000506f, +0.000553f, + +0.000232f, -0.000331f, +0.000358f, +0.000798f, -0.000326f, -0.000208f, +0.000405f, +0.000075f, -0.000069f, -0.000244f, + -0.000334f, -0.000171f, -0.000169f, -0.000200f, +0.000005f, +0.000328f, +0.000131f, +0.000190f, +0.000106f, -0.000125f, + +0.000286f, -0.000251f, +0.000022f, -0.000036f, +0.000022f, +0.000048f, +0.000022f, +0.000077f, +0.000103f, -0.000134f, + +0.000080f, +0.000115f, +0.000033f, -0.000145f, -0.000072f, -0.000099f, +0.000023f, -0.000123f, +0.000057f, -0.000012f, + +0.000092f, +0.000051f, +0.000018f, -0.000048f, +0.000106f, -0.000119f, -0.000166f, -0.000040f, -0.000094f, +0.000038f, + +0.000020f, +0.000003f, +0.000083f, +0.000049f, -0.000015f, -0.000052f + }, + { + -0.000736f, +0.004597f, -0.005320f, -0.000319f, -0.000708f, +0.000686f, +0.000462f, -0.000821f, -0.000545f, -0.000622f, + +0.000263f, +0.000103f, +0.000629f, -0.000506f, +0.003921f, -0.001095f, -0.001030f, -0.000126f, -0.000767f, -0.000305f, + +0.002086f, +0.001859f, -0.000760f, +0.000154f, +0.001535f, +0.000766f, +0.000780f, -0.000669f, +0.001273f, +0.001578f, + -0.000402f, +0.000074f, +0.000236f, -0.000898f, +0.001011f, +0.000005f, +0.000443f, +0.000453f, +0.000062f, +0.000187f, + -0.000692f, +0.000468f, +0.001316f, -0.000597f, +0.000063f, +0.000182f, -0.000573f, -0.000252f, -0.000233f, -0.000040f, + -0.000270f, -0.000375f, -0.000068f, -0.000111f, +0.000224f, +0.000032f, +0.000032f, -0.000142f, -0.000217f, -0.000008f, + +0.000117f, -0.000199f, +0.000371f, +0.000147f, -0.000032f, -0.000247f, +0.000097f, +0.000035f, -0.000161f, +0.000010f, + +0.000233f, +0.000083f, +0.000253f, -0.000036f, -0.000080f, -0.000078f, +0.000108f, +0.000058f, +0.000171f, -0.000023f, + -0.000085f, -0.000087f, -0.000103f, +0.000055f, +0.000042f, -0.000064f, +0.000024f, -0.000010f, +0.000049f, +0.000063f, + +0.000009f, +0.000009f, +0.000014f, -0.000021f, +0.000018f, -0.000033f + }, + { + +0.004089f, +0.017156f, +0.003383f, -0.000304f, -0.001215f, -0.001226f, +0.002093f, +0.002074f, +0.000649f, +0.000122f, + -0.000677f, +0.000155f, +0.001854f, -0.001285f, +0.000082f, -0.000067f, +0.000769f, +0.000112f, -0.000492f, -0.000766f, + -0.000173f, -0.000945f, +0.000045f, +0.001149f, -0.000267f, +0.000285f, -0.000678f, +0.000258f, +0.000907f, -0.000438f, + +0.000440f, +0.000558f, +0.000622f, +0.000594f, -0.000596f, -0.000123f, +0.000594f, +0.000105f, +0.000518f, -0.000313f, + +0.000546f, +0.000579f, -0.000282f, -0.001109f, +0.000204f, -0.000493f, -0.000034f, -0.000165f, -0.000364f, +0.000114f, + -0.000526f, -0.000193f, -0.000330f, -0.000403f, -0.000083f, -0.000118f, -0.000004f, +0.000063f, +0.000013f, -0.000009f, + -0.000155f, -0.000134f, -0.000078f, -0.000146f, -0.000240f, +0.000181f, +0.000150f, +0.000096f, +0.000033f, -0.000004f, + -0.000009f, +0.000087f, +0.000008f, -0.000049f, -0.000145f, -0.000023f, -0.000008f, -0.000009f, +0.000087f, -0.000033f, + -0.000046f, -0.000013f, +0.000073f, +0.000060f, -0.000046f, -0.000039f, +0.000057f, +0.000002f, +0.000069f, -0.000023f, + -0.000087f, -0.000057f, -0.000097f, +0.000038f, +0.000043f, +0.000026f + }, + { + +0.000297f, -0.005163f, -0.000585f, -0.001344f, -0.000981f, -0.000391f, -0.000159f, -0.000042f, +0.001074f, -0.001039f, + +0.000480f, +0.000893f, +0.008977f, +0.023749f, -0.008197f, -0.000256f, -0.000916f, -0.000787f, -0.002208f, -0.001214f, + +0.000730f, +0.000445f, -0.000757f, -0.000741f, -0.000398f, +0.001048f, +0.000849f, +0.000510f, +0.000577f, +0.001529f, + -0.002185f, +0.000525f, -0.001390f, -0.000183f, +0.000225f, +0.001662f, -0.000026f, -0.000468f, +0.000729f, -0.000876f, + -0.000231f, +0.000414f, -0.000118f, -0.000958f, +0.000860f, -0.000404f, -0.000647f, -0.000296f, +0.000064f, +0.000312f, + -0.000104f, -0.000650f, +0.000311f, +0.000190f, +0.000126f, +0.000278f, -0.000254f, +0.000401f, -0.000212f, +0.000062f, + +0.000486f, +0.000372f, -0.000284f, -0.000368f, -0.000034f, +0.000150f, -0.000184f, +0.000166f, +0.000042f, -0.000044f, + -0.000139f, -0.000025f, -0.000092f, -0.000118f, +0.000071f, -0.000041f, -0.000167f, +0.000077f, +0.000071f, -0.000027f, + -0.000001f, +0.000129f, +0.000102f, +0.000032f, +0.000031f, -0.000019f, -0.000018f, -0.000046f, -0.000069f, +0.000016f, + -0.000021f, -0.000085f, -0.000112f, -0.000013f, +0.000053f, -0.000035f + }, + { + +0.003692f, +0.027648f, -0.004632f, +0.003531f, +0.000794f, +0.001325f, -0.003080f, +0.001787f, -0.000081f, -0.000674f, + -0.000157f, -0.004506f, -0.000024f, +0.000983f, -0.010709f, +0.001057f, +0.005333f, -0.000987f, -0.000915f, +0.000543f, + -0.000033f, -0.000238f, -0.000213f, +0.001211f, +0.001892f, +0.000742f, +0.000180f, +0.000827f, -0.001260f, -0.000675f, + -0.000271f, -0.000289f, +0.000957f, +0.000614f, -0.000425f, +0.000373f, +0.001027f, +0.000623f, -0.000172f, -0.000185f, + -0.000516f, -0.000073f, +0.000678f, +0.000059f, +0.001318f, +0.000046f, +0.000132f, -0.000096f, +0.000017f, +0.000102f, + -0.000326f, +0.000059f, -0.000098f, -0.000230f, -0.000133f, +0.000145f, +0.000514f, +0.000025f, -0.000067f, +0.000085f, + +0.000377f, +0.000230f, -0.000222f, +0.000144f, +0.000194f, +0.000242f, +0.000117f, -0.000039f, -0.000043f, -0.000034f, + +0.000154f, -0.000365f, -0.000078f, -0.000033f, +0.000019f, +0.000058f, +0.000021f, -0.000104f, +0.000025f, +0.000114f, + +0.000033f, -0.000108f, +0.000027f, +0.000054f, +0.000021f, -0.000010f, +0.000063f, -0.000034f, -0.000111f, +0.000033f, + -0.000108f, -0.000057f, +0.000020f, -0.000045f, +0.000002f, -0.000009f + }, + { + +0.000073f, -0.004271f, +0.000269f, +0.000620f, +0.000988f, +0.000193f, -0.000344f, -0.000752f, +0.001028f, +0.000708f, + +0.000651f, +0.001128f, -0.000066f, -0.008731f, -0.034432f, -0.003603f, +0.002932f, +0.000124f, +0.002467f, -0.002760f, + +0.003610f, +0.000523f, -0.000658f, +0.000303f, +0.001441f, +0.000693f, -0.001544f, -0.000882f, -0.000455f, +0.000149f, + -0.000429f, +0.001251f, +0.000451f, -0.000579f, -0.001177f, +0.000873f, -0.001722f, -0.000992f, +0.000485f, -0.001215f, + +0.001066f, -0.000262f, -0.000467f, +0.000232f, +0.000720f, -0.000598f, +0.000030f, +0.000249f, +0.000068f, -0.000473f, + -0.000293f, +0.000219f, +0.000142f, -0.000108f, -0.000043f, -0.000102f, -0.000539f, -0.000310f, +0.000115f, -0.000330f, + -0.000069f, -0.000017f, +0.000181f, +0.000139f, +0.000015f, -0.000133f, +0.000306f, +0.000370f, +0.000034f, -0.000064f, + -0.000114f, -0.000182f, -0.000151f, -0.000019f, -0.000140f, -0.000028f, +0.000177f, +0.000018f, -0.000015f, -0.000200f, + -0.000046f, +0.000035f, +0.000060f, +0.000097f, -0.000127f, -0.000005f, -0.000079f, -0.000022f, +0.000048f, +0.000002f, + -0.000012f, +0.000022f, +0.000004f, -0.000042f, -0.000050f, +0.000007f + } + }, + { + { + +0.010883f, +0.008754f, +0.009926f, +0.003321f, +0.000677f, +0.000394f, -0.000667f, -0.000414f, -0.000626f, -0.000671f, + -0.000852f, +0.000934f, +0.000886f, +0.000759f, -0.004287f, +0.002011f, +0.000555f, -0.000401f, -0.001913f, +0.003524f, + -0.000541f, -0.000676f, +0.001086f, -0.000710f, -0.000426f, +0.000503f, +0.000972f, -0.000118f, -0.000751f, -0.000483f, + +0.000536f, +0.000071f, -0.001125f, +0.000934f, +0.000786f, +0.000324f, -0.001115f, +0.000142f, -0.000331f, +0.000614f, + +0.000870f, -0.000105f, -0.001174f, +0.000406f, +0.000609f, +0.000296f, +0.000457f, -0.000134f, +0.000562f, -0.000448f, + -0.000410f, +0.000145f, +0.000695f, +0.000526f, +0.000430f, -0.000135f, +0.000410f, +0.000237f, +0.000351f, +0.000110f, + -0.000248f, +0.000054f, +0.000189f, +0.000115f, +0.000076f, +0.000219f, -0.000214f, -0.000163f, +0.000106f, +0.000052f, + +0.000181f, -0.000206f, +0.000136f, -0.000042f, +0.000048f, -0.000079f, -0.000135f, +0.000110f, +0.000015f, -0.000201f, + +0.000025f, +0.000010f, -0.000056f, -0.000023f, +0.000045f, -0.000055f, +0.000003f, -0.000026f, -0.000070f, -0.000098f, + +0.000026f, +0.000015f, +0.000038f, +0.000043f, +0.000005f, -0.000023f + }, + { + -0.000130f, -0.007026f, +0.009720f, +0.000357f, -0.001231f, +0.000861f, -0.002579f, -0.000658f, -0.000086f, +0.000781f, + -0.000746f, +0.000042f, +0.000347f, -0.000035f, -0.002222f, +0.000392f, -0.001436f, -0.000101f, +0.002247f, +0.002214f, + -0.000038f, -0.001735f, -0.000120f, -0.000388f, +0.001376f, -0.000742f, +0.000857f, -0.000724f, +0.000191f, +0.001301f, + -0.000941f, -0.000289f, -0.000700f, +0.000606f, -0.000745f, -0.000427f, -0.000312f, -0.000561f, +0.001023f, +0.000406f, + +0.000625f, +0.000070f, +0.000226f, +0.000034f, -0.000136f, +0.000001f, +0.000085f, +0.000231f, +0.000390f, -0.000297f, + +0.000109f, -0.000299f, -0.000047f, +0.000178f, +0.000465f, +0.000218f, -0.000383f, -0.000224f, +0.000231f, -0.000116f, + -0.000469f, -0.000179f, +0.000122f, +0.000112f, -0.000031f, +0.000160f, +0.000001f, -0.000090f, +0.000135f, +0.000060f, + -0.000048f, -0.000017f, +0.000122f, +0.000021f, -0.000036f, +0.000114f, +0.000051f, +0.000039f, -0.000147f, -0.000182f, + +0.000217f, -0.000001f, +0.000019f, -0.000029f, -0.000030f, -0.000023f, +0.000028f, -0.000026f, -0.000102f, +0.000043f, + +0.000057f, -0.000006f, -0.000026f, -0.000160f, +0.000022f, +0.000052f + }, + { + -0.000915f, +0.076678f, -0.002030f, +0.001629f, -0.000629f, +0.000773f, -0.000051f, +0.000723f, +0.000281f, -0.000596f, + -0.001726f, +0.000067f, +0.001517f, -0.001549f, +0.000539f, -0.000582f, -0.001754f, +0.001986f, -0.000169f, -0.002483f, + +0.001364f, -0.000108f, +0.000842f, +0.000751f, -0.001116f, -0.002266f, +0.000280f, +0.000334f, +0.000327f, -0.001802f, + +0.001017f, +0.000000f, -0.001469f, +0.000359f, -0.000075f, +0.000784f, -0.000546f, +0.001056f, -0.000338f, +0.000762f, + +0.000498f, +0.000505f, -0.000093f, -0.000068f, +0.000416f, -0.000873f, +0.000260f, +0.000085f, +0.000381f, +0.000368f, + -0.000190f, +0.000153f, -0.000396f, +0.000750f, -0.000354f, +0.000172f, -0.000226f, +0.000186f, +0.000349f, +0.000013f, + -0.000257f, -0.000059f, -0.000047f, +0.000070f, +0.000011f, +0.000031f, -0.000184f, +0.000132f, -0.000071f, +0.000164f, + -0.000076f, -0.000227f, -0.000096f, +0.000139f, -0.000073f, +0.000139f, +0.000036f, -0.000080f, -0.000005f, +0.000038f, + -0.000086f, -0.000171f, +0.000041f, +0.000153f, -0.000057f, -0.000079f, -0.000102f, +0.000052f, -0.000008f, +0.000023f, + -0.000013f, +0.000010f, -0.000040f, +0.000017f, -0.000002f, -0.000060f + }, + { + +0.008917f, -0.055842f, -0.000161f, +0.005486f, -0.002097f, +0.000579f, -0.000245f, +0.000421f, -0.000784f, +0.000298f, + +0.000047f, +0.000302f, -0.001198f, +0.000978f, +0.001938f, +0.001983f, -0.000686f, +0.000747f, +0.001368f, +0.001020f, + -0.000188f, -0.000232f, +0.000424f, +0.000237f, +0.000185f, +0.000006f, -0.000352f, +0.000027f, -0.000901f, +0.000281f, + +0.000274f, -0.000570f, -0.000240f, -0.001568f, +0.000261f, -0.001176f, -0.000591f, +0.000658f, +0.000423f, -0.000113f, + +0.000684f, +0.000096f, -0.000480f, -0.000902f, -0.000008f, -0.000465f, -0.000237f, +0.000521f, +0.000412f, -0.000290f, + -0.000133f, +0.000120f, -0.000077f, -0.000270f, -0.000414f, +0.000066f, -0.000053f, -0.000428f, +0.000110f, -0.000088f, + -0.000338f, -0.000130f, -0.000081f, -0.000090f, -0.000283f, +0.000100f, -0.000195f, +0.000085f, +0.000086f, -0.000265f, + -0.000011f, +0.000148f, +0.000128f, -0.000102f, +0.000075f, -0.000114f, -0.000037f, -0.000114f, +0.000007f, -0.000009f, + +0.000005f, +0.000063f, +0.000033f, +0.000025f, -0.000089f, +0.000019f, -0.000038f, +0.000066f, +0.000043f, -0.000065f, + -0.000078f, +0.000046f, +0.000005f, -0.000051f, -0.000002f, +0.000015f + }, + { + +0.000800f, -0.007832f, -0.001033f, -0.001229f, -0.000105f, +0.000103f, -0.000329f, -0.000505f, -0.000425f, -0.000170f, + +0.000679f, -0.000563f, -0.000035f, +0.000145f, +0.001310f, +0.001079f, +0.000694f, -0.009410f, +0.003940f, +0.001284f, + +0.001064f, +0.001968f, -0.002379f, +0.001172f, -0.002212f, +0.001518f, -0.002195f, +0.000209f, +0.001243f, +0.001105f, + +0.000185f, +0.001547f, -0.000406f, -0.001350f, +0.000032f, -0.001034f, +0.000890f, -0.001034f, +0.000401f, +0.000753f, + -0.000128f, +0.000236f, -0.000881f, +0.000081f, -0.000277f, -0.000566f, -0.000225f, +0.000065f, +0.000062f, +0.000048f, + +0.000404f, +0.000564f, +0.000195f, +0.000345f, +0.000246f, +0.000155f, +0.000196f, -0.000240f, -0.000018f, +0.000171f, + +0.000227f, -0.000258f, +0.000229f, -0.000137f, -0.000522f, -0.000136f, +0.000040f, +0.000150f, +0.000057f, -0.000037f, + +0.000191f, +0.000141f, +0.000119f, -0.000081f, -0.000005f, -0.000235f, +0.000164f, -0.000042f, -0.000161f, -0.000062f, + -0.000036f, +0.000080f, +0.000087f, -0.000116f, -0.000003f, +0.000049f, +0.000007f, +0.000052f, +0.000019f, -0.000014f, + -0.000006f, -0.000043f, +0.000023f, +0.000086f, -0.000057f, -0.000014f + }, + { + +0.012509f, -0.093358f, +0.010767f, -0.000663f, -0.002407f, +0.000238f, -0.000836f, +0.000731f, +0.001358f, -0.000987f, + -0.001030f, +0.000469f, +0.000424f, -0.000808f, -0.000958f, +0.003313f, +0.000866f, -0.000525f, -0.000136f, -0.000439f, + -0.000503f, -0.000773f, +0.000120f, -0.000944f, +0.000164f, +0.000667f, -0.000109f, +0.000123f, +0.000613f, +0.000293f, + -0.000547f, +0.000329f, -0.000380f, -0.000496f, +0.000399f, -0.000304f, -0.000747f, +0.000122f, +0.000174f, +0.000628f, + -0.000314f, +0.000151f, -0.001241f, -0.000060f, +0.000512f, +0.000153f, +0.000166f, -0.000283f, -0.000301f, +0.000257f, + +0.000118f, -0.000535f, -0.000544f, +0.000127f, -0.000118f, +0.000087f, -0.000180f, -0.000413f, +0.000165f, +0.000099f, + -0.000014f, +0.000055f, -0.000314f, +0.000029f, +0.000259f, +0.000104f, -0.000114f, -0.000150f, -0.000039f, -0.000119f, + +0.000123f, +0.000055f, +0.000059f, +0.000018f, +0.000047f, -0.000004f, -0.000062f, +0.000057f, +0.000143f, -0.000023f, + +0.000062f, +0.000155f, +0.000008f, -0.000020f, -0.000075f, -0.000007f, +0.000014f, -0.000057f, +0.000045f, +0.000023f, + -0.000011f, +0.000009f, -0.000011f, +0.000159f, -0.000031f, -0.000012f + }, + { + +0.000250f, -0.007009f, +0.001174f, +0.000622f, -0.000092f, -0.000124f, -0.000691f, +0.000998f, -0.000625f, +0.000438f, + -0.000276f, -0.000037f, -0.000043f, -0.000488f, -0.005095f, +0.001347f, +0.004669f, -0.001533f, +0.002430f, +0.001255f, + -0.001477f, +0.000779f, -0.001944f, +0.000250f, +0.002304f, -0.001323f, +0.003080f, -0.001587f, -0.000500f, +0.000813f, + -0.000762f, +0.001724f, -0.000089f, -0.000971f, -0.000553f, -0.000046f, +0.000260f, +0.000882f, +0.000241f, -0.000482f, + +0.000105f, +0.001252f, +0.000297f, +0.000498f, +0.000031f, -0.000316f, +0.000106f, -0.000044f, -0.000104f, +0.000564f, + -0.000403f, -0.000226f, -0.000131f, -0.000063f, -0.000268f, -0.000205f, -0.000106f, +0.000296f, -0.000312f, +0.000158f, + +0.000077f, -0.000053f, +0.000013f, +0.000059f, -0.000013f, +0.000018f, -0.000153f, -0.000341f, -0.000108f, +0.000272f, + +0.000051f, -0.000280f, -0.000087f, +0.000038f, -0.000101f, +0.000082f, -0.000219f, -0.000079f, +0.000072f, +0.000007f, + -0.000014f, -0.000020f, +0.000070f, -0.000008f, -0.000048f, +0.000015f, +0.000020f, -0.000000f, +0.000026f, +0.000059f, + +0.000037f, +0.000020f, -0.000012f, +0.000015f, +0.000022f, -0.000020f + }, + { + +0.003355f, +0.040596f, -0.001507f, +0.000146f, -0.001300f, +0.000444f, +0.000510f, -0.000730f, +0.000373f, -0.000503f, + -0.000407f, +0.001277f, +0.000332f, -0.000981f, +0.000174f, -0.000052f, +0.000116f, +0.000945f, +0.000183f, -0.000455f, + +0.000450f, +0.000617f, -0.001275f, +0.000314f, +0.000809f, -0.000514f, -0.000032f, -0.000959f, +0.000224f, -0.000794f, + +0.000187f, +0.000130f, +0.000764f, -0.000241f, +0.000208f, -0.000619f, +0.000736f, -0.000179f, +0.000407f, +0.000010f, + +0.000240f, -0.000740f, +0.000632f, -0.000246f, -0.000712f, +0.000763f, -0.000097f, +0.000169f, -0.000291f, -0.000369f, + -0.000088f, +0.000005f, +0.000027f, -0.000116f, -0.000056f, +0.000224f, -0.000263f, +0.000134f, +0.000345f, -0.000006f, + +0.000196f, -0.000018f, -0.000025f, +0.000007f, +0.000006f, +0.000122f, -0.000060f, +0.000281f, -0.000021f, +0.000043f, + +0.000087f, +0.000002f, -0.000081f, -0.000114f, -0.000030f, +0.000137f, -0.000134f, -0.000065f, +0.000163f, -0.000179f, + -0.000040f, +0.000060f, -0.000023f, -0.000021f, +0.000039f, -0.000066f, +0.000023f, +0.000007f, -0.000055f, +0.000004f, + +0.000037f, +0.000044f, -0.000010f, -0.000003f, -0.000011f, +0.000038f + }, + { + -0.000174f, -0.002107f, -0.000790f, +0.001130f, -0.000148f, +0.000262f, -0.000549f, -0.000578f, -0.000256f, +0.000154f, + +0.000101f, +0.000652f, -0.000225f, +0.001578f, +0.002086f, -0.002299f, +0.000098f, +0.000323f, -0.000515f, +0.001428f, + -0.000399f, -0.001118f, +0.000528f, +0.000148f, +0.001868f, +0.000457f, -0.001993f, +0.000017f, -0.000484f, -0.000772f, + +0.002642f, -0.001908f, +0.000663f, -0.000111f, -0.000932f, +0.000777f, +0.000056f, -0.000402f, +0.000763f, -0.000557f, + -0.000569f, -0.000414f, -0.000401f, -0.000388f, -0.000037f, +0.000060f, +0.000147f, +0.000588f, -0.000011f, +0.000370f, + +0.000109f, -0.000083f, -0.000152f, -0.000472f, -0.000046f, +0.000347f, -0.000198f, -0.000241f, -0.000009f, +0.000406f, + +0.000189f, +0.000029f, -0.000179f, +0.000167f, +0.000226f, +0.000153f, +0.000172f, -0.000047f, +0.000028f, +0.000086f, + +0.000127f, +0.000014f, -0.000077f, -0.000079f, -0.000161f, +0.000035f, -0.000036f, -0.000106f, -0.000047f, -0.000007f, + +0.000050f, +0.000082f, +0.000032f, +0.000036f, -0.000057f, -0.000122f, -0.000121f, -0.000042f, +0.000027f, +0.000031f, + -0.000053f, +0.000042f, -0.000020f, -0.000078f, -0.000081f, -0.000033f + }, + { + +0.002213f, -0.045965f, -0.012167f, +0.002048f, +0.001316f, -0.005506f, +0.002989f, -0.001102f, -0.000459f, -0.000893f, + -0.000140f, -0.001101f, -0.000253f, +0.000543f, -0.002475f, +0.000849f, -0.001509f, +0.000815f, -0.001537f, +0.001456f, + -0.001342f, +0.000053f, -0.000949f, +0.000213f, -0.000643f, -0.000665f, +0.000474f, -0.000764f, -0.000603f, +0.000212f, + +0.000203f, +0.000424f, +0.000847f, -0.001687f, +0.001323f, +0.000268f, +0.000234f, -0.000090f, +0.000396f, -0.000062f, + -0.000208f, -0.000516f, +0.000685f, +0.000575f, -0.000817f, -0.000407f, +0.000120f, -0.000152f, -0.000110f, -0.000178f, + +0.000094f, +0.000106f, -0.000091f, -0.000054f, -0.000111f, -0.000056f, -0.000013f, +0.000074f, +0.000061f, -0.000115f, + +0.000066f, +0.000015f, +0.000037f, -0.000122f, +0.000016f, -0.000118f, +0.000052f, +0.000088f, -0.000070f, -0.000088f, + -0.000013f, +0.000013f, -0.000043f, +0.000009f, -0.000057f, +0.000029f, +0.000037f, +0.000069f, -0.000101f, +0.000022f, + +0.000142f, +0.000019f, -0.000131f, -0.000064f, -0.000019f, -0.000135f, -0.000080f, +0.000007f, -0.000091f, +0.000034f, + +0.000038f, +0.000021f, +0.000003f, -0.000017f, -0.000039f, -0.000058f + }, + { + +0.000537f, +0.008323f, -0.003034f, +0.004021f, +0.000059f, -0.000202f, +0.000382f, -0.002143f, -0.001035f, -0.000622f, + +0.000864f, +0.001516f, -0.000201f, -0.001948f, +0.000596f, -0.000748f, -0.001097f, -0.000830f, -0.002459f, +0.000729f, + +0.000862f, -0.000099f, -0.000157f, +0.000651f, +0.000132f, -0.001270f, +0.000629f, -0.001317f, +0.000975f, +0.000945f, + -0.000281f, -0.000274f, -0.000011f, -0.000386f, +0.000112f, -0.000252f, +0.000905f, +0.000248f, -0.000408f, -0.000314f, + -0.000545f, -0.000184f, +0.000400f, -0.000539f, +0.000347f, +0.000256f, -0.000242f, -0.000121f, -0.000201f, -0.000190f, + -0.000219f, +0.000121f, +0.000134f, +0.000259f, +0.000134f, +0.000104f, +0.000029f, -0.000123f, -0.000091f, +0.000025f, + -0.000220f, -0.000082f, +0.000372f, -0.000049f, -0.000064f, +0.000048f, -0.000005f, -0.000038f, +0.000032f, +0.000054f, + +0.000285f, +0.000015f, +0.000136f, +0.000006f, +0.000023f, +0.000066f, +0.000181f, +0.000078f, -0.000007f, -0.000055f, + -0.000006f, -0.000013f, -0.000104f, +0.000134f, +0.000061f, -0.000066f, +0.000071f, -0.000022f, +0.000045f, -0.000019f, + -0.000062f, +0.000010f, +0.000038f, -0.000001f, -0.000046f, +0.000021f + }, + { + -0.003821f, +0.003990f, -0.001485f, -0.002649f, -0.000857f, +0.001613f, +0.000529f, +0.000300f, +0.000238f, +0.000455f, + +0.001150f, +0.000104f, +0.001747f, -0.002422f, +0.000849f, -0.000073f, +0.000619f, +0.000703f, -0.000746f, -0.000276f, + -0.000388f, -0.000382f, +0.000268f, +0.000740f, -0.000689f, -0.000176f, -0.000938f, +0.000240f, -0.000096f, -0.000496f, + -0.000289f, -0.000392f, +0.000426f, -0.000364f, -0.000490f, +0.000225f, +0.001283f, +0.001108f, +0.000285f, -0.000617f, + -0.000291f, -0.000076f, -0.000159f, -0.000380f, +0.000339f, +0.000046f, +0.000014f, +0.000038f, -0.000155f, +0.000153f, + -0.000543f, +0.000212f, -0.000200f, +0.000177f, -0.000025f, -0.000165f, -0.000129f, +0.000137f, +0.000119f, -0.000082f, + -0.000298f, +0.000165f, +0.000142f, -0.000136f, -0.000081f, +0.000218f, +0.000156f, +0.000142f, +0.000070f, -0.000161f, + +0.000041f, +0.000053f, +0.000013f, -0.000016f, -0.000081f, +0.000072f, -0.000018f, +0.000041f, +0.000114f, -0.000022f, + -0.000048f, -0.000111f, +0.000071f, +0.000024f, +0.000004f, +0.000073f, -0.000013f, -0.000039f, +0.000009f, -0.000087f, + -0.000041f, -0.000040f, -0.000026f, +0.000048f, -0.000016f, -0.000015f + }, + { + -0.000272f, -0.001315f, +0.001891f, -0.001712f, -0.000359f, -0.000371f, +0.000194f, -0.000629f, +0.001055f, -0.000431f, + -0.000229f, +0.000377f, -0.005017f, +0.002378f, -0.007947f, +0.004740f, +0.000631f, +0.002047f, +0.000501f, -0.000033f, + +0.003370f, -0.003181f, -0.004056f, +0.000312f, -0.000093f, -0.000648f, +0.000305f, -0.000620f, +0.000561f, +0.000316f, + -0.000362f, +0.000554f, -0.001532f, -0.000044f, +0.000181f, +0.001148f, -0.000970f, -0.000136f, +0.000591f, -0.000178f, + -0.000221f, -0.000153f, -0.000451f, -0.001030f, +0.000621f, -0.000534f, -0.000884f, -0.000177f, -0.000135f, +0.000353f, + +0.000145f, -0.000706f, +0.000359f, +0.000095f, -0.000378f, +0.000028f, -0.000115f, +0.000229f, +0.000032f, +0.000333f, + +0.000196f, -0.000099f, -0.000180f, -0.000035f, +0.000108f, +0.000056f, -0.000196f, +0.000206f, -0.000092f, +0.000115f, + +0.000028f, +0.000202f, -0.000182f, -0.000106f, -0.000035f, -0.000061f, -0.000115f, +0.000070f, +0.000082f, -0.000023f, + +0.000084f, +0.000113f, +0.000017f, +0.000007f, +0.000005f, +0.000016f, -0.000087f, +0.000026f, -0.000038f, +0.000112f, + +0.000008f, -0.000149f, -0.000063f, +0.000089f, -0.000037f, -0.000028f + }, + { + -0.006019f, +0.018320f, -0.001163f, +0.003479f, +0.000298f, +0.002254f, +0.000761f, +0.001677f, -0.000850f, +0.000412f, + +0.000952f, -0.002751f, +0.001478f, +0.002630f, -0.009095f, +0.000846f, +0.003198f, -0.000385f, -0.000695f, -0.000703f, + -0.000229f, -0.000423f, -0.000850f, -0.000687f, +0.000785f, -0.000212f, +0.000757f, +0.000908f, -0.001443f, +0.000504f, + -0.000060f, +0.000609f, +0.001595f, +0.000405f, -0.000833f, +0.000950f, +0.000815f, +0.000237f, +0.000054f, +0.000084f, + -0.000538f, -0.001176f, +0.000515f, -0.000131f, +0.000909f, -0.000260f, -0.000159f, -0.000666f, -0.000085f, -0.000377f, + +0.000026f, -0.000200f, -0.000132f, +0.000184f, +0.000184f, +0.000005f, +0.000223f, -0.000276f, +0.000033f, -0.000416f, + +0.000161f, +0.000246f, -0.000033f, +0.000343f, +0.000132f, +0.000238f, +0.000074f, +0.000130f, -0.000068f, +0.000105f, + +0.000151f, -0.000094f, +0.000065f, +0.000037f, -0.000031f, +0.000057f, -0.000011f, +0.000047f, +0.000083f, +0.000091f, + +0.000043f, -0.000029f, +0.000138f, +0.000017f, +0.000058f, -0.000001f, -0.000101f, -0.000042f, -0.000018f, +0.000043f, + -0.000061f, +0.000019f, +0.000030f, +0.000030f, -0.000033f, +0.000004f + }, + { + -0.000266f, -0.003849f, -0.001120f, -0.000599f, +0.000241f, +0.000055f, -0.000124f, -0.000093f, +0.001456f, +0.001052f, + +0.000856f, +0.000178f, -0.000311f, +0.010414f, +0.000390f, +0.001333f, +0.000651f, +0.000099f, +0.003707f, -0.002515f, + -0.000125f, -0.001057f, +0.000457f, -0.000129f, +0.000073f, +0.000925f, +0.000372f, -0.000639f, -0.001411f, -0.001546f, + -0.000916f, +0.000662f, -0.001218f, -0.000006f, -0.000025f, +0.000102f, -0.001030f, +0.000267f, +0.000557f, -0.000927f, + +0.000104f, -0.000396f, -0.000209f, +0.000297f, +0.000305f, -0.000290f, +0.000101f, +0.000151f, -0.000080f, -0.000324f, + +0.000137f, +0.000034f, -0.000151f, +0.000233f, +0.000141f, -0.000171f, -0.000532f, -0.000256f, -0.000147f, -0.000568f, + -0.000008f, +0.000045f, +0.000044f, +0.000018f, +0.000027f, -0.000033f, +0.000222f, +0.000036f, +0.000023f, +0.000021f, + +0.000007f, -0.000112f, -0.000069f, +0.000039f, -0.000125f, +0.000146f, -0.000054f, -0.000042f, +0.000022f, -0.000055f, + +0.000138f, +0.000084f, +0.000056f, -0.000068f, -0.000045f, +0.000075f, -0.000094f, -0.000034f, +0.000064f, -0.000043f, + -0.000023f, +0.000046f, +0.000023f, -0.000027f, -0.000003f, +0.000024f + } + }, + { + { + -0.012884f, +0.063306f, -0.005824f, +0.003779f, +0.000939f, -0.001030f, +0.000223f, -0.000724f, -0.000048f, -0.000299f, + +0.000872f, -0.000592f, -0.000684f, -0.000858f, -0.000509f, +0.001470f, +0.000588f, -0.001213f, +0.000730f, +0.001175f, + -0.000375f, -0.000536f, +0.000933f, -0.000370f, -0.000559f, +0.000221f, +0.000069f, +0.000233f, -0.000265f, -0.000501f, + +0.000072f, -0.000117f, -0.000009f, +0.000944f, +0.000260f, -0.000451f, +0.000462f, +0.000566f, +0.000058f, -0.000265f, + +0.000423f, -0.000387f, -0.000113f, +0.000121f, +0.000441f, +0.000757f, -0.000343f, -0.000162f, +0.000232f, -0.000147f, + +0.000217f, -0.000103f, +0.000541f, +0.000255f, +0.000235f, +0.000266f, -0.000085f, +0.000106f, +0.000199f, +0.000076f, + +0.000257f, +0.000010f, -0.000047f, -0.000012f, -0.000092f, +0.000036f, +0.000068f, +0.000040f, -0.000021f, -0.000077f, + -0.000058f, +0.000000f, +0.000061f, +0.000068f, -0.000071f, -0.000175f, -0.000028f, +0.000004f, +0.000028f, +0.000074f, + +0.000072f, +0.000146f, +0.000014f, -0.000017f, -0.000022f, -0.000056f, +0.000117f, -0.000053f, +0.000046f, -0.000055f, + +0.000010f, +0.000007f, +0.000027f, +0.000010f, +0.000020f, +0.000003f + }, + { + +0.000760f, +0.007540f, +0.000117f, +0.002018f, +0.000769f, -0.001445f, -0.001010f, -0.000147f, +0.000024f, -0.000521f, + -0.000002f, +0.000338f, +0.000321f, -0.001152f, -0.000487f, -0.001728f, -0.003525f, -0.000704f, +0.003408f, +0.001195f, + +0.000106f, -0.001564f, -0.002509f, +0.000206f, +0.000488f, +0.001308f, +0.000085f, +0.000084f, +0.001063f, +0.000685f, + -0.000590f, -0.000200f, +0.000719f, +0.000086f, -0.000704f, -0.000519f, -0.000306f, +0.000108f, +0.000262f, +0.000714f, + -0.000193f, +0.000817f, +0.000813f, +0.000301f, -0.000047f, -0.000124f, +0.000257f, +0.000071f, -0.000001f, +0.000146f, + +0.000163f, -0.000252f, +0.000416f, +0.000398f, +0.000188f, -0.000532f, -0.000212f, -0.000228f, -0.000016f, +0.000131f, + -0.000003f, -0.000002f, -0.000158f, +0.000142f, +0.000079f, -0.000084f, +0.000210f, +0.000250f, +0.000009f, -0.000032f, + +0.000135f, -0.000003f, -0.000051f, -0.000024f, +0.000081f, +0.000078f, -0.000146f, -0.000097f, -0.000081f, +0.000089f, + +0.000036f, -0.000067f, +0.000021f, +0.000074f, -0.000050f, +0.000103f, +0.000088f, -0.000095f, +0.000032f, +0.000065f, + -0.000084f, -0.000024f, +0.000052f, +0.000039f, +0.000065f, -0.000056f + }, + { + -0.000282f, +0.043048f, +0.014934f, +0.006078f, +0.004036f, -0.000658f, +0.000396f, +0.000365f, -0.000412f, -0.000927f, + -0.000014f, -0.000910f, -0.000796f, +0.000162f, +0.001005f, -0.000634f, +0.000036f, +0.000329f, -0.000701f, -0.001004f, + -0.000058f, +0.000818f, +0.000352f, +0.000144f, -0.000715f, -0.000430f, +0.000463f, -0.000420f, +0.000034f, -0.000550f, + -0.001333f, +0.000003f, +0.000029f, +0.000347f, -0.000572f, +0.000118f, +0.001394f, -0.000712f, +0.000009f, +0.000021f, + +0.000546f, -0.000227f, +0.000649f, +0.000283f, +0.000567f, -0.000067f, -0.000175f, +0.000422f, +0.000324f, +0.000005f, + +0.000280f, -0.000025f, +0.000311f, -0.000060f, +0.000522f, +0.000160f, -0.000128f, +0.000048f, +0.000005f, +0.000050f, + +0.000041f, +0.000062f, +0.000223f, -0.000103f, +0.000043f, +0.000234f, -0.000097f, +0.000002f, +0.000117f, +0.000126f, + -0.000051f, -0.000141f, +0.000041f, +0.000048f, +0.000010f, -0.000029f, -0.000127f, +0.000030f, +0.000087f, -0.000068f, + -0.000054f, -0.000042f, +0.000085f, -0.000025f, +0.000039f, +0.000024f, -0.000005f, -0.000045f, +0.000012f, +0.000023f, + -0.000042f, -0.000101f, -0.000065f, +0.000010f, -0.000084f, -0.000003f + }, + { + -0.006355f, -0.027077f, -0.007063f, +0.003165f, +0.000191f, -0.000274f, +0.000269f, +0.000146f, -0.000156f, -0.000272f, + -0.001070f, +0.000442f, -0.001196f, +0.001137f, +0.001410f, +0.000730f, -0.000176f, +0.001342f, +0.000136f, +0.000099f, + +0.000286f, -0.000040f, +0.000955f, -0.000298f, -0.000515f, -0.000306f, -0.000974f, +0.000462f, -0.000084f, +0.001004f, + +0.000542f, -0.000963f, +0.000514f, -0.001063f, -0.000544f, -0.000262f, -0.001060f, +0.000612f, -0.000039f, +0.000255f, + +0.000388f, -0.000237f, -0.000051f, -0.000607f, -0.000467f, +0.000414f, +0.000230f, +0.000028f, +0.000384f, -0.000321f, + -0.000037f, -0.000151f, -0.000210f, -0.000045f, -0.000260f, +0.000262f, -0.000103f, -0.000118f, -0.000076f, -0.000279f, + -0.000213f, +0.000070f, -0.000061f, -0.000077f, +0.000096f, -0.000087f, +0.000106f, +0.000039f, -0.000075f, -0.000007f, + -0.000000f, -0.000049f, -0.000149f, -0.000020f, -0.000043f, -0.000022f, -0.000025f, -0.000107f, +0.000010f, +0.000089f, + +0.000143f, +0.000099f, +0.000040f, -0.000077f, -0.000054f, -0.000084f, -0.000001f, +0.000014f, -0.000088f, -0.000014f, + +0.000040f, +0.000066f, -0.000034f, -0.000012f, +0.000015f, -0.000007f + }, + { + -0.000529f, -0.012215f, +0.000965f, +0.000038f, +0.000134f, -0.000397f, -0.000168f, -0.000317f, +0.000035f, +0.000609f, + +0.000006f, -0.000651f, -0.000004f, +0.001634f, +0.002505f, -0.003203f, -0.006330f, +0.000905f, +0.003130f, -0.000385f, + +0.001047f, +0.000545f, -0.000823f, +0.000611f, -0.001335f, -0.001601f, -0.000965f, +0.000236f, +0.000089f, +0.001379f, + +0.001391f, +0.000575f, +0.000092f, -0.000355f, -0.000475f, -0.000367f, -0.000128f, +0.000139f, -0.000066f, -0.000052f, + +0.000584f, -0.000269f, +0.000061f, -0.000092f, -0.000082f, -0.000194f, -0.000224f, +0.000245f, +0.000310f, +0.000078f, + +0.000898f, +0.000142f, +0.000265f, +0.000291f, +0.000199f, -0.000067f, +0.000096f, +0.000101f, +0.000203f, -0.000080f, + +0.000355f, -0.000029f, +0.000124f, -0.000111f, +0.000008f, +0.000049f, +0.000099f, +0.000083f, -0.000104f, +0.000139f, + +0.000121f, -0.000097f, +0.000011f, -0.000069f, -0.000170f, -0.000002f, +0.000122f, +0.000026f, +0.000072f, +0.000055f, + +0.000090f, +0.000030f, -0.000109f, -0.000021f, +0.000055f, +0.000012f, +0.000055f, -0.000006f, +0.000027f, +0.000021f, + -0.000030f, +0.000060f, +0.000035f, -0.000056f, -0.000022f, +0.000053f + }, + { + -0.009788f, -0.046408f, -0.006548f, -0.001041f, -0.000559f, -0.000284f, +0.000547f, +0.000337f, -0.000270f, +0.000926f, + +0.001040f, -0.000099f, -0.000364f, -0.000853f, +0.000070f, +0.003268f, +0.000697f, -0.000606f, +0.000244f, -0.000191f, + -0.000108f, +0.000394f, -0.000897f, -0.001174f, +0.000287f, +0.001027f, -0.000410f, +0.000227f, +0.000689f, +0.000251f, + -0.000704f, -0.000044f, -0.000580f, -0.000825f, +0.000624f, -0.000344f, +0.000222f, -0.000794f, +0.000053f, +0.000536f, + +0.000448f, +0.000228f, -0.001414f, +0.000127f, +0.000371f, +0.000249f, -0.000381f, -0.000270f, -0.000330f, +0.000071f, + -0.000096f, -0.000519f, -0.000076f, +0.000208f, +0.000254f, +0.000034f, +0.000150f, +0.000030f, -0.000056f, -0.000242f, + -0.000018f, +0.000054f, +0.000007f, +0.000222f, +0.000275f, -0.000070f, -0.000007f, -0.000022f, -0.000145f, +0.000062f, + +0.000080f, +0.000114f, +0.000001f, +0.000041f, +0.000058f, +0.000010f, +0.000069f, -0.000009f, -0.000063f, +0.000005f, + +0.000003f, -0.000024f, -0.000170f, -0.000069f, +0.000031f, +0.000020f, +0.000077f, +0.000027f, +0.000056f, -0.000035f, + +0.000002f, +0.000013f, +0.000050f, +0.000031f, -0.000049f, +0.000006f + }, + { + -0.000657f, -0.001955f, +0.001782f, -0.000375f, -0.000148f, -0.000215f, -0.000201f, +0.000184f, +0.000198f, -0.000497f, + +0.000217f, +0.000306f, -0.000655f, -0.003623f, -0.002936f, +0.001421f, -0.000108f, -0.000744f, -0.001195f, +0.001387f, + +0.000314f, +0.000036f, +0.001512f, -0.002406f, +0.000491f, +0.000541f, +0.000398f, +0.000922f, -0.001836f, +0.000279f, + +0.000357f, +0.001195f, +0.000360f, -0.000527f, +0.000866f, -0.000480f, +0.000262f, +0.000232f, +0.000353f, -0.000089f, + +0.000608f, +0.000459f, +0.000598f, +0.000187f, -0.000276f, +0.000495f, +0.000132f, -0.000424f, +0.000150f, +0.000009f, + -0.000368f, -0.000073f, -0.000023f, -0.000126f, -0.000068f, -0.000149f, +0.000166f, +0.000224f, -0.000296f, -0.000097f, + -0.000039f, -0.000088f, -0.000161f, -0.000015f, +0.000033f, -0.000197f, -0.000089f, -0.000124f, -0.000004f, -0.000054f, + -0.000199f, -0.000007f, +0.000121f, +0.000074f, -0.000013f, +0.000064f, -0.000033f, +0.000149f, +0.000073f, +0.000022f, + +0.000026f, -0.000001f, +0.000027f, -0.000057f, +0.000006f, +0.000089f, -0.000037f, -0.000096f, +0.000003f, -0.000080f, + -0.000127f, -0.000071f, +0.000039f, +0.000058f, -0.000042f, -0.000026f + }, + { + -0.003340f, +0.023172f, +0.011069f, +0.000313f, +0.000444f, +0.000881f, +0.000369f, -0.001564f, -0.000243f, +0.000099f, + +0.000614f, +0.000333f, -0.000760f, +0.001659f, +0.000818f, -0.000755f, +0.000818f, -0.000700f, -0.000830f, +0.000472f, + +0.000694f, +0.000229f, +0.000297f, -0.000100f, -0.000176f, -0.000289f, +0.000534f, -0.000797f, +0.000042f, -0.000034f, + -0.000138f, -0.000131f, +0.000112f, +0.000550f, +0.000048f, +0.000937f, +0.000352f, +0.000638f, -0.000175f, +0.000186f, + +0.000159f, -0.000615f, +0.000116f, -0.000219f, -0.000275f, +0.000627f, -0.000060f, -0.000814f, -0.000296f, +0.000342f, + -0.000246f, -0.000080f, -0.000553f, -0.000286f, +0.000253f, +0.000124f, +0.000233f, +0.000096f, +0.000353f, +0.000014f, + +0.000038f, -0.000044f, -0.000003f, +0.000022f, +0.000063f, +0.000038f, +0.000047f, +0.000067f, +0.000057f, -0.000037f, + +0.000046f, +0.000052f, -0.000105f, +0.000118f, +0.000199f, -0.000054f, -0.000033f, +0.000113f, -0.000007f, -0.000055f, + -0.000001f, -0.000110f, -0.000032f, -0.000000f, -0.000033f, -0.000108f, +0.000034f, +0.000150f, -0.000020f, +0.000006f, + +0.000024f, +0.000024f, +0.000075f, +0.000048f, +0.000030f, +0.000001f + }, + { + -0.001060f, -0.002526f, +0.005613f, -0.000129f, +0.000439f, -0.000127f, -0.000079f, -0.000904f, +0.000621f, -0.000114f, + -0.000072f, -0.000106f, -0.000654f, +0.002001f, +0.002134f, -0.003963f, -0.000226f, -0.000166f, -0.001009f, +0.003857f, + -0.000561f, -0.002563f, -0.000261f, +0.002919f, +0.001203f, +0.001164f, -0.001843f, +0.000261f, -0.001151f, +0.000208f, + +0.000443f, -0.000180f, +0.000520f, -0.001670f, +0.000236f, +0.001057f, +0.000037f, -0.000752f, +0.000412f, -0.000334f, + +0.000251f, -0.000433f, -0.000548f, +0.000342f, +0.000505f, -0.000186f, +0.000390f, +0.000403f, +0.000213f, +0.000156f, + -0.000007f, -0.000283f, -0.000239f, +0.000006f, -0.000062f, +0.000055f, +0.000019f, +0.000204f, +0.000271f, +0.000200f, + +0.000017f, -0.000356f, -0.000107f, -0.000030f, -0.000144f, -0.000255f, -0.000079f, +0.000004f, +0.000056f, +0.000099f, + -0.000058f, -0.000076f, -0.000173f, +0.000026f, +0.000137f, +0.000035f, -0.000068f, -0.000002f, +0.000018f, -0.000074f, + +0.000038f, -0.000142f, -0.000119f, +0.000038f, -0.000028f, -0.000067f, +0.000072f, +0.000093f, +0.000008f, -0.000065f, + +0.000020f, +0.000033f, -0.000019f, -0.000046f, -0.000045f, +0.000042f + }, + { + -0.004331f, -0.038306f, -0.008845f, -0.003848f, +0.001040f, +0.000853f, -0.005625f, +0.000066f, -0.000738f, +0.000106f, + +0.000134f, +0.000357f, +0.000113f, -0.001496f, -0.000879f, +0.000027f, -0.000558f, +0.000469f, -0.000300f, -0.000526f, + -0.000433f, -0.000338f, -0.000374f, -0.000460f, -0.000116f, -0.000982f, -0.000299f, -0.000025f, +0.000314f, +0.000097f, + -0.000054f, +0.000112f, +0.000831f, +0.000166f, +0.000936f, -0.000077f, +0.000353f, +0.000211f, -0.000212f, -0.000241f, + +0.000511f, +0.000400f, +0.000287f, -0.000533f, +0.000096f, +0.000419f, +0.000044f, +0.000003f, +0.000021f, +0.000395f, + +0.000226f, +0.000303f, +0.000227f, -0.000097f, -0.000524f, -0.000132f, +0.000177f, -0.000243f, +0.000008f, +0.000018f, + -0.000325f, +0.000175f, +0.000121f, -0.000001f, -0.000089f, -0.000075f, +0.000019f, -0.000045f, -0.000024f, +0.000103f, + +0.000007f, -0.000098f, -0.000024f, +0.000072f, +0.000017f, +0.000019f, +0.000017f, +0.000078f, -0.000121f, +0.000040f, + -0.000016f, -0.000042f, -0.000033f, +0.000011f, -0.000005f, +0.000081f, +0.000095f, +0.000043f, +0.000062f, +0.000029f, + +0.000030f, +0.000010f, -0.000090f, -0.000054f, +0.000018f, +0.000043f + }, + { + -0.000288f, +0.006248f, +0.002086f, +0.002186f, +0.000541f, +0.000611f, -0.000851f, -0.003011f, +0.000249f, +0.000339f, + +0.000536f, +0.000710f, -0.000422f, -0.001054f, -0.002228f, -0.000870f, +0.000779f, -0.002383f, -0.001497f, +0.001440f, + -0.002409f, -0.000179f, +0.001843f, +0.000164f, -0.000473f, -0.000164f, -0.000098f, -0.000385f, +0.000358f, -0.000794f, + -0.000155f, -0.000454f, -0.000176f, +0.000074f, +0.000029f, -0.000147f, -0.000025f, -0.000118f, -0.000359f, -0.000586f, + -0.000488f, -0.000006f, -0.000062f, +0.000254f, +0.000118f, -0.000093f, -0.000047f, -0.000119f, -0.000023f, +0.000275f, + +0.000121f, +0.000193f, -0.000133f, -0.000160f, -0.000365f, +0.000336f, -0.000064f, +0.000021f, +0.000122f, -0.000108f, + -0.000042f, +0.000185f, -0.000063f, -0.000130f, +0.000097f, +0.000300f, -0.000018f, +0.000202f, +0.000165f, +0.000056f, + +0.000141f, +0.000041f, +0.000004f, +0.000045f, +0.000113f, +0.000055f, +0.000005f, -0.000151f, -0.000082f, +0.000018f, + -0.000058f, +0.000042f, +0.000077f, -0.000045f, -0.000077f, -0.000033f, -0.000000f, -0.000010f, -0.000047f, -0.000117f, + -0.000041f, +0.000019f, +0.000015f, +0.000017f, -0.000013f, +0.000029f + }, + { + +0.003199f, -0.004493f, -0.006318f, -0.001899f, +0.001355f, -0.000543f, -0.000974f, +0.001571f, -0.000343f, +0.001076f, + +0.000178f, -0.001052f, -0.000388f, -0.000824f, +0.000824f, -0.000448f, +0.000779f, -0.000160f, +0.000072f, +0.000148f, + -0.000666f, +0.000634f, +0.000496f, -0.000598f, -0.000638f, -0.000178f, +0.000814f, -0.000161f, -0.000652f, -0.000783f, + -0.000688f, -0.000245f, -0.000332f, -0.000785f, -0.000005f, +0.000217f, -0.000342f, +0.000090f, -0.000110f, +0.000092f, + -0.000021f, -0.000363f, +0.000025f, +0.000091f, +0.000072f, +0.000349f, -0.000399f, +0.000107f, +0.000306f, -0.000059f, + +0.000210f, +0.000112f, +0.000260f, +0.000155f, -0.000210f, +0.000027f, -0.000147f, -0.000111f, +0.000059f, -0.000200f, + -0.000044f, +0.000064f, +0.000021f, +0.000103f, +0.000118f, -0.000095f, +0.000024f, +0.000037f, -0.000022f, +0.000030f, + +0.000135f, -0.000151f, +0.000094f, +0.000030f, +0.000033f, +0.000052f, -0.000061f, +0.000019f, +0.000023f, -0.000012f, + -0.000022f, +0.000040f, +0.000046f, +0.000002f, +0.000089f, +0.000058f, -0.000101f, +0.000031f, -0.000049f, -0.000004f, + +0.000055f, +0.000018f, +0.000092f, -0.000021f, -0.000018f, +0.000012f + }, + { + +0.000357f, +0.003514f, -0.003541f, -0.001146f, +0.000411f, +0.000399f, +0.000380f, -0.000975f, +0.000665f, -0.000038f, + -0.000004f, +0.000698f, +0.001521f, -0.012962f, +0.002212f, +0.002873f, +0.000316f, +0.003007f, -0.000607f, +0.001585f, + -0.000673f, -0.001332f, -0.001435f, -0.000103f, -0.000251f, +0.001808f, -0.000189f, -0.001966f, +0.000428f, +0.000720f, + +0.001053f, +0.000388f, -0.002339f, -0.000530f, +0.000006f, +0.000498f, -0.000831f, +0.000164f, +0.000153f, +0.000539f, + -0.000028f, -0.000227f, -0.000581f, -0.000448f, -0.000289f, +0.000098f, +0.000041f, -0.000011f, -0.000374f, +0.000213f, + +0.000504f, -0.000009f, +0.000166f, -0.000020f, -0.000014f, -0.000021f, +0.000183f, -0.000273f, +0.000156f, -0.000027f, + -0.000271f, +0.000041f, +0.000207f, +0.000099f, +0.000157f, -0.000126f, +0.000029f, -0.000112f, -0.000119f, +0.000205f, + +0.000108f, +0.000041f, +0.000007f, -0.000115f, -0.000047f, +0.000195f, +0.000045f, +0.000067f, +0.000003f, -0.000008f, + -0.000063f, -0.000081f, -0.000128f, -0.000095f, -0.000005f, -0.000022f, +0.000035f, +0.000055f, -0.000012f, +0.000017f, + -0.000065f, -0.000013f, +0.000123f, +0.000042f, -0.000071f, +0.000061f + }, + { + +0.004358f, +0.003265f, +0.003776f, -0.002750f, -0.001131f, -0.000206f, +0.000297f, +0.001129f, -0.000279f, +0.000921f, + -0.001528f, +0.002862f, -0.000155f, -0.002359f, -0.000569f, +0.000800f, -0.000658f, -0.000630f, -0.000371f, -0.000698f, + -0.000443f, -0.000256f, -0.000977f, -0.000365f, +0.000450f, +0.000584f, +0.001149f, +0.000552f, +0.000192f, +0.000859f, + -0.000178f, +0.000857f, +0.000563f, -0.000486f, -0.000308f, +0.000269f, +0.000012f, -0.000317f, +0.000217f, -0.000083f, + -0.000258f, -0.000445f, +0.000255f, +0.000085f, -0.000240f, -0.000694f, -0.000423f, -0.000549f, -0.000230f, +0.000039f, + +0.000094f, -0.000550f, +0.000020f, +0.000346f, -0.000039f, -0.000228f, -0.000141f, -0.000038f, -0.000131f, -0.000268f, + +0.000091f, -0.000016f, +0.000213f, -0.000032f, -0.000064f, -0.000115f, +0.000129f, +0.000025f, +0.000002f, +0.000080f, + -0.000002f, +0.000144f, +0.000092f, +0.000000f, -0.000136f, -0.000074f, +0.000027f, +0.000139f, -0.000029f, -0.000157f, + -0.000004f, -0.000008f, -0.000073f, -0.000050f, +0.000029f, -0.000064f, -0.000082f, +0.000116f, +0.000055f, -0.000054f, + +0.000022f, +0.000015f, -0.000062f, +0.000019f, +0.000003f, +0.000020f + }, + { + +0.000448f, -0.005626f, -0.001611f, +0.000382f, -0.000132f, -0.000073f, +0.000286f, +0.000631f, +0.001070f, +0.000454f, + -0.000641f, +0.000045f, -0.001595f, +0.007198f, +0.021949f, -0.002258f, -0.000400f, -0.000666f, +0.002711f, -0.001186f, + -0.002909f, -0.000949f, +0.001603f, -0.000143f, -0.000675f, -0.000320f, +0.000975f, -0.001588f, -0.001007f, -0.002012f, + -0.000182f, +0.000757f, -0.001186f, +0.000541f, +0.000168f, -0.000838f, +0.000770f, +0.000376f, -0.000210f, -0.000240f, + -0.000392f, +0.000465f, +0.000849f, -0.000030f, -0.000487f, +0.000320f, -0.000476f, +0.000074f, +0.000273f, -0.000015f, + +0.000014f, +0.000249f, +0.000329f, +0.000349f, -0.000215f, -0.000142f, -0.000177f, -0.000081f, -0.000299f, +0.000183f, + +0.000377f, +0.000023f, +0.000004f, -0.000082f, +0.000108f, +0.000226f, -0.000334f, -0.000120f, +0.000162f, +0.000138f, + -0.000094f, -0.000003f, +0.000167f, +0.000100f, +0.000064f, +0.000083f, -0.000194f, +0.000072f, +0.000043f, +0.000181f, + -0.000003f, -0.000102f, -0.000074f, -0.000016f, +0.000051f, +0.000013f, +0.000028f, -0.000040f, -0.000058f, -0.000023f, + +0.000000f, -0.000042f, +0.000025f, +0.000043f, +0.000018f, -0.000055f + } + }, + { + { + +0.007908f, +0.095817f, -0.018402f, +0.000515f, +0.000825f, -0.000348f, +0.001170f, -0.000487f, -0.000040f, +0.000097f, + +0.000322f, -0.001052f, -0.000627f, +0.000631f, +0.001956f, -0.000334f, +0.000175f, -0.000484f, -0.000625f, -0.000233f, + +0.000719f, +0.000358f, +0.000276f, -0.000051f, -0.000303f, -0.000336f, +0.000050f, +0.000473f, -0.000442f, -0.000539f, + -0.000281f, -0.000086f, +0.000330f, +0.000718f, -0.000131f, -0.000053f, +0.000742f, +0.000647f, +0.000172f, -0.000194f, + -0.000043f, -0.000297f, +0.000128f, -0.000336f, +0.000229f, +0.000264f, -0.000592f, -0.000302f, -0.000168f, -0.000268f, + -0.000006f, -0.000520f, +0.000078f, -0.000158f, -0.000083f, +0.000180f, -0.000048f, -0.000018f, +0.000035f, +0.000256f, + +0.000175f, -0.000074f, -0.000131f, -0.000025f, -0.000035f, +0.000040f, +0.000136f, +0.000040f, -0.000017f, -0.000071f, + +0.000029f, +0.000177f, +0.000028f, +0.000034f, -0.000028f, -0.000026f, +0.000010f, -0.000100f, +0.000128f, +0.000092f, + +0.000055f, +0.000082f, -0.000038f, -0.000012f, -0.000029f, +0.000040f, +0.000024f, -0.000027f, +0.000082f, -0.000012f, + -0.000019f, +0.000020f, -0.000020f, -0.000008f, +0.000026f, +0.000016f + }, + { + -0.001363f, +0.010381f, +0.002131f, -0.001186f, +0.000144f, -0.000331f, +0.000348f, +0.000395f, -0.000015f, -0.000260f, + +0.000521f, +0.000075f, -0.000022f, -0.000383f, -0.001778f, -0.000993f, -0.000958f, -0.001813f, +0.000150f, -0.000418f, + -0.000320f, -0.000414f, -0.000479f, +0.001057f, -0.000277f, +0.000256f, +0.000338f, +0.000552f, +0.000490f, +0.000564f, + -0.000514f, +0.000039f, +0.000758f, +0.000010f, +0.000623f, +0.000091f, +0.000257f, +0.000286f, -0.000667f, -0.000200f, + -0.000497f, +0.000500f, +0.000032f, -0.000427f, +0.000290f, +0.000013f, -0.000006f, -0.000638f, -0.000066f, +0.000142f, + -0.000096f, -0.000181f, +0.000331f, +0.000100f, -0.000394f, -0.000403f, +0.000044f, -0.000109f, -0.000045f, +0.000280f, + +0.000190f, +0.000032f, -0.000156f, -0.000039f, +0.000068f, -0.000013f, +0.000162f, +0.000110f, -0.000106f, -0.000040f, + +0.000191f, -0.000116f, -0.000016f, +0.000038f, +0.000107f, -0.000057f, -0.000138f, -0.000001f, +0.000032f, +0.000079f, + -0.000086f, -0.000085f, +0.000023f, +0.000060f, +0.000008f, +0.000082f, +0.000033f, -0.000048f, +0.000062f, -0.000049f, + -0.000093f, +0.000017f, +0.000096f, +0.000075f, +0.000038f, -0.000063f + }, + { + +0.002206f, +0.013600f, -0.010289f, +0.006431f, +0.001365f, -0.001251f, +0.000667f, +0.000671f, +0.000021f, -0.000012f, + +0.000836f, -0.001288f, -0.001167f, +0.000473f, +0.000966f, +0.000277f, +0.001479f, +0.001146f, -0.000648f, +0.000828f, + +0.000116f, +0.000680f, -0.000244f, -0.000037f, -0.000180f, +0.001142f, +0.000959f, -0.000721f, -0.000540f, +0.000454f, + -0.000391f, +0.000314f, -0.000132f, -0.000074f, -0.000736f, +0.000961f, +0.001426f, -0.000504f, +0.000629f, -0.000486f, + -0.000090f, -0.000428f, +0.000415f, -0.000375f, +0.000322f, -0.000030f, -0.000164f, +0.000392f, +0.000161f, -0.000220f, + +0.000274f, +0.000094f, +0.000265f, -0.000143f, +0.000535f, +0.000093f, +0.000009f, -0.000122f, -0.000182f, -0.000138f, + +0.000140f, +0.000194f, +0.000357f, -0.000087f, +0.000053f, +0.000143f, -0.000162f, -0.000038f, +0.000117f, +0.000042f, + -0.000012f, +0.000046f, +0.000099f, -0.000066f, -0.000054f, -0.000049f, +0.000016f, +0.000057f, -0.000035f, -0.000018f, + +0.000026f, +0.000025f, +0.000048f, -0.000059f, +0.000051f, +0.000059f, +0.000037f, -0.000109f, +0.000043f, +0.000038f, + -0.000037f, -0.000046f, +0.000007f, -0.000018f, -0.000024f, +0.000052f + }, + { + -0.000205f, -0.012775f, -0.004594f, +0.001885f, -0.000177f, -0.000629f, -0.000307f, -0.000104f, -0.000244f, -0.000354f, + -0.001294f, +0.000607f, -0.001203f, +0.001448f, +0.000402f, -0.000627f, -0.000720f, +0.000029f, -0.000516f, -0.000345f, + +0.000088f, -0.000569f, +0.000229f, -0.000800f, -0.000672f, -0.000279f, +0.000079f, +0.000441f, +0.000313f, +0.000628f, + +0.000258f, -0.000500f, +0.000621f, -0.000339f, -0.000250f, +0.000062f, -0.000434f, -0.000172f, -0.000161f, +0.000209f, + -0.000256f, -0.000236f, +0.000314f, -0.000116f, -0.000323f, +0.000479f, -0.000016f, -0.000137f, +0.000179f, -0.000129f, + +0.000128f, -0.000129f, +0.000084f, -0.000050f, +0.000043f, +0.000306f, -0.000009f, +0.000033f, -0.000358f, -0.000168f, + +0.000135f, +0.000174f, -0.000019f, +0.000069f, +0.000060f, -0.000003f, +0.000218f, -0.000093f, +0.000002f, +0.000065f, + -0.000040f, -0.000159f, -0.000075f, +0.000062f, -0.000026f, +0.000016f, -0.000041f, +0.000003f, +0.000059f, +0.000052f, + +0.000067f, +0.000017f, -0.000047f, -0.000018f, -0.000001f, -0.000060f, +0.000052f, -0.000046f, -0.000036f, +0.000042f, + +0.000034f, -0.000005f, -0.000026f, +0.000029f, +0.000011f, -0.000018f + }, + { + +0.000637f, -0.013372f, -0.001065f, +0.000234f, -0.000046f, -0.000144f, +0.000494f, -0.000110f, -0.000261f, +0.000499f, + +0.000227f, -0.000442f, +0.000938f, -0.000532f, +0.003177f, +0.000840f, -0.001153f, +0.008294f, -0.003612f, -0.000120f, + +0.001672f, +0.000689f, -0.000527f, -0.000609f, -0.000765f, +0.000800f, +0.002233f, +0.000579f, +0.000055f, +0.000583f, + +0.000526f, -0.000690f, +0.000657f, +0.000052f, -0.000475f, +0.000016f, +0.000431f, +0.000240f, -0.000714f, -0.000359f, + +0.000376f, -0.000033f, +0.000392f, -0.000164f, +0.000141f, +0.000053f, +0.000056f, +0.000388f, -0.000220f, -0.000003f, + +0.000552f, -0.000244f, +0.000307f, -0.000116f, -0.000107f, -0.000414f, +0.000048f, +0.000148f, +0.000129f, -0.000028f, + +0.000283f, -0.000132f, +0.000147f, +0.000130f, +0.000311f, +0.000047f, +0.000033f, -0.000091f, -0.000190f, +0.000097f, + -0.000046f, -0.000128f, +0.000002f, +0.000081f, +0.000005f, +0.000153f, +0.000014f, -0.000000f, +0.000120f, +0.000009f, + +0.000030f, -0.000070f, -0.000041f, +0.000135f, -0.000045f, -0.000023f, -0.000021f, -0.000095f, +0.000016f, -0.000002f, + -0.000002f, +0.000073f, -0.000012f, -0.000069f, +0.000054f, +0.000046f + }, + { + +0.001633f, -0.021476f, -0.001144f, -0.000558f, +0.001044f, +0.000018f, +0.001057f, -0.000945f, -0.000702f, +0.001786f, + +0.001002f, -0.000153f, -0.000045f, +0.001007f, +0.000909f, +0.001192f, -0.000596f, -0.000367f, +0.000443f, +0.000501f, + +0.000215f, -0.000231f, -0.000174f, -0.000336f, +0.000013f, +0.000159f, -0.000065f, +0.000094f, +0.000301f, -0.000235f, + -0.000793f, -0.000001f, +0.000200f, +0.000354f, +0.000184f, -0.000722f, +0.000806f, -0.000134f, -0.000122f, +0.000213f, + +0.000714f, +0.000504f, -0.000607f, -0.000021f, -0.000027f, +0.000280f, -0.000178f, +0.000167f, -0.000185f, +0.000205f, + -0.000156f, +0.000070f, +0.000289f, +0.000178f, +0.000109f, +0.000046f, +0.000469f, +0.000190f, -0.000072f, -0.000346f, + -0.000042f, +0.000108f, +0.000040f, +0.000160f, -0.000045f, -0.000130f, +0.000187f, +0.000003f, -0.000078f, +0.000034f, + +0.000004f, -0.000029f, +0.000019f, +0.000083f, -0.000081f, +0.000083f, +0.000070f, -0.000043f, -0.000104f, +0.000028f, + -0.000078f, -0.000061f, -0.000058f, +0.000037f, +0.000061f, +0.000020f, -0.000008f, +0.000067f, -0.000012f, +0.000012f, + -0.000023f, -0.000016f, -0.000011f, -0.000035f, +0.000019f, -0.000002f + }, + { + -0.000229f, +0.001999f, +0.001599f, -0.000662f, +0.000055f, +0.000073f, +0.000011f, -0.000382f, -0.000194f, -0.000329f, + +0.000216f, -0.000026f, -0.000352f, -0.002856f, -0.003479f, +0.000446f, -0.001511f, -0.002654f, -0.002151f, +0.001791f, + +0.000854f, -0.000460f, +0.001975f, -0.002083f, -0.000231f, +0.000351f, -0.001231f, -0.001346f, -0.000771f, +0.000409f, + -0.000258f, +0.000449f, +0.000316f, +0.000308f, +0.000881f, -0.000538f, -0.000395f, -0.000179f, +0.000567f, +0.000482f, + -0.000197f, -0.000580f, +0.000416f, -0.000249f, -0.000108f, +0.000555f, +0.000073f, -0.000197f, +0.000145f, -0.000358f, + -0.000142f, +0.000233f, +0.000084f, -0.000159f, +0.000195f, +0.000002f, +0.000165f, -0.000035f, +0.000031f, +0.000039f, + -0.000094f, -0.000029f, -0.000076f, -0.000020f, +0.000157f, -0.000128f, +0.000147f, +0.000007f, -0.000039f, -0.000189f, + -0.000057f, +0.000221f, +0.000052f, +0.000132f, +0.000095f, +0.000049f, +0.000044f, +0.000131f, -0.000003f, -0.000007f, + +0.000070f, -0.000022f, +0.000016f, -0.000045f, +0.000028f, +0.000048f, -0.000081f, -0.000073f, -0.000038f, -0.000089f, + -0.000085f, -0.000009f, +0.000042f, -0.000018f, -0.000005f, +0.000013f + }, + { + +0.008061f, +0.012525f, -0.008358f, -0.000812f, +0.000348f, +0.000349f, -0.000515f, -0.000455f, -0.000238f, +0.000205f, + +0.000505f, -0.001128f, -0.000566f, +0.001080f, -0.000922f, -0.000694f, +0.000174f, -0.001446f, +0.000048f, +0.000884f, + -0.000325f, -0.000356f, +0.000606f, -0.000054f, -0.000588f, +0.000491f, +0.000754f, -0.000392f, +0.000092f, -0.000141f, + -0.000492f, -0.000341f, -0.000131f, +0.000343f, +0.000060f, +0.000780f, -0.000245f, +0.000055f, -0.000539f, +0.000165f, + +0.000211f, -0.000041f, +0.000056f, -0.000644f, -0.000270f, +0.000206f, -0.000009f, -0.000887f, +0.000001f, +0.000498f, + -0.000076f, -0.000157f, -0.000455f, -0.000057f, +0.000267f, +0.000164f, +0.000260f, -0.000077f, +0.000138f, -0.000158f, + -0.000108f, +0.000017f, +0.000149f, -0.000074f, -0.000089f, +0.000005f, -0.000001f, -0.000004f, +0.000048f, +0.000014f, + +0.000019f, +0.000028f, +0.000071f, +0.000126f, +0.000013f, -0.000167f, +0.000081f, +0.000028f, -0.000053f, +0.000051f, + -0.000020f, -0.000155f, +0.000012f, +0.000022f, -0.000034f, -0.000044f, +0.000037f, +0.000084f, +0.000012f, +0.000010f, + +0.000001f, +0.000039f, +0.000052f, +0.000059f, +0.000001f, -0.000042f + }, + { + +0.000021f, +0.000713f, +0.002663f, -0.000546f, +0.000042f, -0.000134f, +0.000338f, -0.000370f, +0.000883f, -0.000026f, + -0.000396f, +0.000049f, +0.000223f, +0.002019f, +0.002667f, -0.002286f, -0.002214f, +0.000387f, -0.000317f, +0.001893f, + +0.000709f, +0.000599f, +0.001396f, +0.004086f, -0.000312f, +0.000843f, -0.000160f, -0.001062f, -0.000962f, +0.000855f, + -0.000589f, -0.000245f, -0.000144f, -0.000909f, +0.000371f, -0.000124f, +0.000615f, +0.000379f, +0.000107f, -0.000222f, + +0.000529f, -0.000139f, +0.000057f, +0.000430f, +0.000174f, -0.000485f, +0.000083f, -0.000094f, +0.000173f, -0.000045f, + -0.000094f, -0.000076f, +0.000212f, +0.000109f, -0.000249f, -0.000131f, +0.000136f, +0.000235f, -0.000191f, -0.000060f, + +0.000072f, -0.000138f, +0.000197f, -0.000074f, -0.000027f, -0.000106f, -0.000132f, -0.000036f, -0.000005f, +0.000010f, + -0.000082f, -0.000012f, -0.000037f, +0.000132f, +0.000083f, -0.000073f, -0.000038f, +0.000054f, +0.000059f, -0.000028f, + -0.000045f, -0.000221f, -0.000025f, +0.000028f, -0.000004f, +0.000029f, +0.000098f, +0.000038f, -0.000002f, -0.000043f, + +0.000038f, -0.000003f, +0.000030f, -0.000005f, +0.000028f, +0.000054f + }, + { + +0.005913f, -0.023630f, -0.006527f, -0.003562f, +0.001809f, +0.001585f, -0.005225f, +0.000352f, -0.000507f, +0.000776f, + -0.000024f, +0.000271f, -0.000113f, -0.000970f, -0.000678f, -0.000230f, +0.001056f, +0.000479f, +0.000172f, -0.000202f, + +0.000334f, -0.000228f, +0.000183f, +0.000067f, +0.000700f, -0.000481f, -0.000744f, +0.000208f, +0.000963f, -0.000308f, + -0.000373f, -0.000352f, +0.000149f, +0.000289f, +0.000698f, -0.000565f, +0.000323f, +0.000524f, -0.000446f, -0.000183f, + +0.000514f, +0.000689f, -0.000121f, -0.000596f, +0.000890f, +0.000608f, -0.000045f, +0.000330f, +0.000130f, +0.000416f, + +0.000065f, +0.000085f, +0.000149f, -0.000265f, -0.000376f, +0.000064f, +0.000049f, -0.000247f, +0.000078f, -0.000074f, + -0.000147f, -0.000008f, +0.000004f, +0.000049f, -0.000191f, +0.000072f, -0.000004f, -0.000145f, +0.000024f, -0.000016f, + +0.000017f, -0.000061f, +0.000027f, -0.000004f, +0.000066f, -0.000030f, +0.000037f, -0.000052f, +0.000019f, -0.000044f, + -0.000048f, -0.000005f, +0.000067f, +0.000003f, +0.000068f, +0.000121f, +0.000062f, +0.000007f, +0.000060f, +0.000002f, + -0.000006f, -0.000024f, -0.000045f, -0.000012f, +0.000044f, +0.000049f + }, + { + +0.000431f, +0.002014f, -0.001257f, +0.000027f, +0.000267f, +0.000166f, -0.001135f, -0.002139f, +0.000694f, +0.000921f, + +0.000296f, -0.000364f, -0.000035f, -0.000854f, -0.002507f, -0.003196f, +0.001726f, -0.000266f, -0.000575f, -0.000489f, + -0.002659f, +0.000410f, +0.001986f, -0.000186f, -0.000305f, +0.000250f, -0.000773f, +0.000376f, +0.000828f, -0.000593f, + +0.000039f, -0.000311f, -0.000303f, -0.000236f, +0.000108f, -0.000414f, -0.000332f, -0.000270f, -0.000217f, -0.000040f, + -0.000446f, +0.000221f, -0.000070f, +0.000052f, -0.000115f, -0.000233f, -0.000141f, +0.000103f, +0.000307f, +0.000419f, + +0.000086f, +0.000012f, -0.000280f, -0.000076f, -0.000150f, +0.000129f, +0.000024f, +0.000098f, +0.000103f, -0.000127f, + +0.000117f, +0.000074f, -0.000114f, +0.000023f, +0.000094f, +0.000043f, +0.000097f, +0.000233f, -0.000105f, -0.000056f, + -0.000025f, -0.000050f, +0.000076f, +0.000083f, +0.000020f, -0.000106f, -0.000069f, -0.000131f, +0.000055f, +0.000012f, + -0.000049f, +0.000039f, +0.000066f, -0.000095f, -0.000022f, +0.000002f, -0.000039f, -0.000016f, -0.000065f, -0.000030f, + +0.000019f, +0.000013f, +0.000007f, +0.000018f, +0.000039f, -0.000031f + }, + { + -0.002448f, -0.008823f, -0.002893f, -0.000418f, +0.002023f, -0.003812f, -0.002407f, +0.002079f, +0.000491f, +0.001063f, + -0.000719f, -0.000270f, -0.000207f, +0.000281f, +0.000807f, -0.000115f, +0.000916f, -0.000044f, +0.000600f, +0.000322f, + -0.000184f, +0.000356f, +0.000086f, -0.000916f, -0.000510f, -0.000408f, +0.001243f, -0.000211f, -0.000113f, -0.000548f, + +0.000002f, +0.000140f, -0.000600f, -0.000300f, +0.000243f, +0.000065f, -0.001157f, -0.000654f, -0.000268f, +0.000169f, + +0.000233f, -0.000418f, +0.000187f, +0.000217f, +0.000092f, +0.000067f, -0.000523f, +0.000162f, +0.000425f, -0.000250f, + +0.000352f, -0.000022f, +0.000463f, -0.000148f, -0.000158f, +0.000147f, +0.000043f, -0.000227f, -0.000135f, +0.000033f, + +0.000128f, -0.000178f, -0.000002f, +0.000180f, -0.000030f, -0.000174f, -0.000078f, -0.000026f, -0.000015f, +0.000132f, + +0.000042f, -0.000110f, +0.000092f, -0.000031f, -0.000018f, -0.000016f, -0.000026f, -0.000039f, -0.000029f, -0.000038f, + +0.000001f, +0.000111f, -0.000014f, +0.000006f, +0.000024f, -0.000038f, -0.000031f, +0.000032f, -0.000007f, +0.000053f, + +0.000019f, +0.000028f, +0.000028f, -0.000060f, -0.000000f, +0.000028f + }, + { + -0.000367f, +0.005592f, -0.000432f, -0.000574f, -0.000094f, +0.000329f, -0.000259f, -0.001017f, +0.000420f, -0.000175f, + +0.000446f, +0.000178f, +0.003825f, -0.009668f, +0.002563f, +0.000629f, -0.000936f, +0.001447f, -0.001217f, +0.001549f, + -0.002017f, +0.001675f, +0.000425f, -0.001656f, -0.000874f, +0.002043f, -0.000736f, -0.001217f, -0.000379f, +0.000550f, + +0.000226f, +0.000671f, -0.001620f, +0.000235f, -0.000324f, -0.000759f, -0.000862f, -0.000423f, +0.000049f, +0.000580f, + +0.000123f, +0.000138f, -0.000229f, -0.000096f, +0.000232f, +0.000298f, +0.000577f, +0.000277f, -0.000117f, +0.000097f, + +0.000360f, +0.000182f, -0.000069f, -0.000093f, +0.000253f, -0.000071f, -0.000038f, -0.000284f, +0.000109f, -0.000158f, + -0.000153f, +0.000162f, +0.000077f, -0.000044f, +0.000090f, -0.000100f, -0.000014f, -0.000173f, +0.000078f, +0.000076f, + +0.000024f, -0.000026f, +0.000095f, -0.000045f, +0.000051f, +0.000125f, -0.000038f, +0.000007f, -0.000056f, +0.000007f, + -0.000094f, -0.000062f, -0.000092f, -0.000076f, +0.000039f, -0.000043f, +0.000074f, -0.000062f, +0.000016f, +0.000010f, + -0.000064f, +0.000061f, +0.000071f, -0.000063f, +0.000021f, +0.000052f + }, + { + -0.000739f, -0.005590f, -0.000543f, -0.005166f, -0.000369f, -0.003073f, -0.004000f, +0.000103f, -0.000226f, -0.000241f, + -0.000277f, +0.004407f, -0.001214f, -0.000265f, +0.002319f, -0.001321f, -0.001290f, -0.000409f, -0.000016f, +0.000299f, + +0.000162f, +0.000420f, -0.000335f, +0.000402f, -0.000001f, +0.000561f, +0.001029f, +0.000578f, +0.000147f, +0.000253f, + +0.000196f, +0.000120f, -0.000528f, -0.000645f, +0.000006f, -0.000092f, -0.000092f, +0.000038f, +0.000555f, -0.000095f, + -0.000622f, +0.000171f, +0.000096f, -0.000095f, -0.000063f, -0.000307f, -0.000082f, +0.000179f, +0.000102f, +0.000193f, + -0.000249f, -0.000125f, +0.000061f, -0.000049f, -0.000203f, -0.000084f, -0.000010f, +0.000310f, -0.000091f, +0.000040f, + +0.000100f, +0.000024f, +0.000194f, -0.000154f, +0.000030f, -0.000115f, +0.000179f, -0.000069f, +0.000026f, -0.000033f, + +0.000047f, +0.000047f, +0.000043f, -0.000017f, -0.000029f, -0.000063f, +0.000088f, +0.000013f, -0.000104f, -0.000103f, + +0.000040f, -0.000028f, -0.000140f, -0.000011f, -0.000002f, -0.000045f, +0.000065f, +0.000093f, -0.000014f, -0.000044f, + +0.000014f, -0.000030f, -0.000065f, -0.000005f, +0.000049f, +0.000001f + }, + { + -0.000094f, -0.005169f, +0.001507f, +0.000862f, -0.000251f, +0.000233f, +0.000225f, +0.000830f, +0.000862f, -0.000493f, + -0.000911f, +0.000509f, +0.000350f, +0.000156f, +0.007440f, -0.003650f, +0.001429f, -0.000407f, +0.000577f, -0.001014f, + -0.000516f, -0.000398f, +0.000252f, -0.000151f, +0.000013f, -0.000878f, -0.000026f, -0.002549f, +0.000620f, +0.000455f, + +0.000062f, +0.000632f, -0.000265f, +0.000913f, -0.000259f, -0.000139f, +0.000720f, -0.000543f, +0.000594f, +0.000102f, + -0.000085f, +0.000773f, +0.000567f, -0.000393f, -0.000076f, +0.000249f, -0.000409f, +0.000098f, +0.000362f, +0.000162f, + -0.000070f, +0.000213f, +0.000115f, -0.000022f, -0.000211f, +0.000041f, +0.000088f, +0.000028f, -0.000028f, +0.000174f, + +0.000073f, -0.000066f, +0.000095f, -0.000069f, -0.000003f, +0.000058f, -0.000348f, +0.000123f, +0.000088f, +0.000110f, + -0.000104f, +0.000052f, +0.000181f, +0.000063f, +0.000069f, -0.000109f, -0.000098f, +0.000096f, -0.000014f, +0.000062f, + -0.000094f, -0.000071f, -0.000071f, +0.000083f, +0.000028f, -0.000011f, +0.000057f, +0.000001f, -0.000061f, +0.000018f, + -0.000015f, -0.000088f, +0.000039f, +0.000040f, -0.000031f, -0.000058f + } + }, + { + { + -0.004007f, +0.068196f, +0.007701f, +0.003848f, +0.000039f, +0.000719f, +0.000302f, -0.000129f, -0.000229f, -0.000688f, + -0.000863f, -0.000389f, -0.000148f, +0.001562f, +0.001387f, -0.001040f, +0.000142f, +0.000435f, -0.000575f, -0.001149f, + +0.001345f, +0.000436f, -0.000337f, +0.000502f, -0.000353f, +0.000027f, +0.000556f, -0.000127f, -0.000938f, +0.000162f, + +0.000061f, +0.000124f, -0.000032f, -0.000265f, +0.000401f, +0.000450f, +0.000207f, +0.000230f, +0.000098f, +0.000214f, + -0.000076f, -0.000183f, -0.000012f, -0.000416f, +0.000075f, -0.000327f, -0.000063f, -0.000065f, -0.000373f, -0.000503f, + -0.000338f, -0.000247f, -0.000089f, +0.000036f, +0.000103f, -0.000034f, +0.000389f, +0.000176f, +0.000176f, +0.000058f, + -0.000052f, -0.000134f, +0.000147f, +0.000123f, +0.000026f, +0.000034f, +0.000042f, -0.000029f, +0.000106f, +0.000034f, + +0.000118f, +0.000099f, +0.000008f, -0.000014f, +0.000075f, +0.000164f, -0.000083f, -0.000035f, +0.000056f, -0.000113f, + -0.000085f, -0.000048f, -0.000030f, -0.000019f, +0.000046f, +0.000007f, -0.000073f, +0.000008f, -0.000056f, +0.000006f, + -0.000025f, -0.000010f, -0.000004f, +0.000037f, +0.000001f, -0.000015f + }, + { + +0.000935f, +0.007007f, -0.000564f, -0.002397f, -0.000642f, +0.000547f, +0.000195f, +0.000068f, -0.000075f, +0.000250f, + +0.000625f, -0.000585f, +0.000141f, +0.000778f, -0.002851f, +0.000460f, +0.000790f, -0.000613f, +0.000285f, -0.000725f, + +0.000109f, -0.000028f, +0.000633f, -0.000182f, -0.000256f, +0.000460f, -0.000079f, +0.000245f, +0.000186f, -0.000165f, + +0.000699f, -0.000333f, +0.000049f, +0.000005f, +0.000459f, +0.000273f, -0.000036f, -0.000089f, -0.000333f, +0.000121f, + -0.000351f, -0.000482f, -0.000635f, -0.000082f, +0.000327f, -0.000047f, -0.000231f, -0.000192f, -0.000336f, -0.000213f, + -0.000014f, -0.000013f, -0.000171f, -0.000419f, +0.000037f, +0.000168f, +0.000048f, +0.000040f, +0.000092f, +0.000032f, + -0.000148f, -0.000143f, +0.000032f, -0.000080f, -0.000027f, +0.000117f, -0.000075f, -0.000096f, -0.000053f, +0.000074f, + -0.000032f, -0.000028f, +0.000148f, +0.000101f, -0.000012f, -0.000026f, +0.000075f, +0.000053f, -0.000007f, -0.000134f, + -0.000030f, +0.000089f, -0.000023f, -0.000032f, +0.000009f, -0.000042f, -0.000063f, +0.000042f, -0.000056f, -0.000071f, + +0.000057f, +0.000030f, -0.000034f, -0.000032f, -0.000023f, +0.000047f + }, + { + -0.002824f, +0.005155f, +0.002175f, +0.002605f, -0.001333f, -0.000580f, +0.000842f, +0.001078f, +0.000556f, +0.000541f, + -0.000076f, -0.001365f, +0.000106f, -0.000168f, -0.000007f, +0.000414f, +0.000937f, +0.001406f, -0.001065f, +0.002142f, + +0.001211f, -0.000151f, -0.000235f, +0.000083f, -0.000171f, +0.000449f, -0.000367f, +0.000286f, -0.000703f, +0.000013f, + +0.000551f, +0.001003f, -0.000733f, -0.000486f, +0.000414f, +0.000854f, +0.000268f, +0.000672f, +0.000693f, -0.000168f, + -0.000036f, +0.000197f, -0.000218f, -0.000568f, -0.000259f, -0.000044f, -0.000094f, +0.000044f, -0.000029f, +0.000138f, + +0.000069f, +0.000115f, -0.000132f, +0.000024f, +0.000001f, +0.000139f, -0.000033f, -0.000140f, -0.000001f, -0.000121f, + -0.000005f, +0.000186f, +0.000010f, +0.000004f, +0.000193f, -0.000224f, +0.000033f, -0.000001f, -0.000113f, -0.000062f, + +0.000105f, +0.000019f, -0.000077f, -0.000035f, -0.000013f, +0.000093f, +0.000121f, -0.000079f, -0.000067f, +0.000032f, + -0.000017f, -0.000012f, +0.000000f, +0.000080f, -0.000002f, -0.000058f, -0.000042f, -0.000020f, +0.000039f, +0.000006f, + +0.000033f, +0.000089f, +0.000013f, -0.000002f, +0.000062f, +0.000000f + }, + { + +0.006174f, -0.014042f, -0.007658f, -0.000823f, +0.000098f, -0.000682f, -0.000321f, -0.000232f, -0.000353f, -0.000058f, + -0.000310f, +0.000181f, -0.000642f, +0.001220f, +0.001124f, -0.000489f, +0.000040f, -0.000575f, -0.000123f, -0.000281f, + +0.000213f, -0.000870f, -0.000837f, -0.000190f, -0.000122f, -0.000454f, +0.000915f, +0.000213f, +0.000264f, -0.000679f, + -0.000360f, +0.000170f, -0.000372f, +0.000188f, -0.000060f, +0.000330f, -0.000233f, -0.000672f, +0.000476f, -0.000302f, + -0.000168f, +0.000163f, -0.000058f, -0.000044f, -0.000161f, -0.000153f, -0.000310f, +0.000095f, +0.000023f, +0.000024f, + +0.000304f, -0.000041f, +0.000061f, -0.000082f, -0.000091f, +0.000153f, -0.000083f, +0.000017f, -0.000227f, -0.000116f, + +0.000039f, -0.000103f, +0.000013f, +0.000075f, -0.000204f, +0.000084f, +0.000045f, -0.000053f, +0.000010f, -0.000097f, + -0.000055f, +0.000111f, +0.000183f, -0.000028f, -0.000011f, -0.000040f, -0.000056f, +0.000061f, +0.000014f, -0.000045f, + -0.000044f, -0.000091f, -0.000002f, +0.000054f, +0.000020f, +0.000035f, -0.000010f, -0.000008f, +0.000093f, -0.000010f, + -0.000061f, -0.000024f, +0.000027f, -0.000008f, -0.000050f, +0.000032f + }, + { + -0.000440f, -0.011945f, +0.000448f, +0.000257f, -0.000435f, +0.000333f, -0.000139f, +0.000378f, -0.000684f, +0.000090f, + +0.000226f, +0.000192f, -0.000025f, +0.001040f, +0.003934f, +0.002457f, +0.005663f, -0.000337f, -0.004692f, +0.001983f, + +0.001246f, +0.000560f, +0.000347f, -0.000598f, +0.000568f, +0.002514f, +0.001330f, -0.000237f, +0.000025f, +0.000898f, + +0.000306f, -0.000353f, +0.000130f, -0.000133f, +0.000168f, -0.000647f, +0.000548f, -0.000652f, -0.000734f, +0.000266f, + -0.000098f, -0.000037f, -0.000244f, -0.000039f, +0.000174f, -0.000093f, +0.000031f, +0.000274f, -0.000439f, -0.000191f, + +0.000131f, +0.000071f, +0.000019f, -0.000135f, -0.000024f, -0.000198f, -0.000027f, -0.000019f, +0.000154f, -0.000003f, + -0.000040f, +0.000078f, +0.000186f, +0.000005f, +0.000001f, -0.000313f, +0.000040f, -0.000085f, -0.000037f, -0.000028f, + -0.000014f, +0.000087f, +0.000088f, +0.000123f, +0.000212f, +0.000075f, -0.000141f, -0.000056f, -0.000118f, -0.000108f, + -0.000089f, -0.000056f, +0.000179f, +0.000089f, -0.000103f, +0.000010f, -0.000124f, -0.000018f, +0.000028f, -0.000032f, + -0.000014f, -0.000034f, -0.000028f, +0.000056f, +0.000040f, -0.000043f + }, + { + +0.005721f, -0.018923f, -0.004700f, +0.000500f, +0.000724f, +0.000183f, +0.000018f, -0.000555f, +0.000494f, -0.000173f, + -0.000905f, +0.000420f, +0.000988f, +0.001319f, +0.000465f, +0.000604f, -0.000348f, -0.000129f, -0.000535f, +0.000373f, + -0.000554f, -0.000717f, +0.000593f, -0.000035f, +0.000090f, -0.000494f, +0.000591f, +0.000391f, -0.000036f, -0.000623f, + -0.000545f, +0.000119f, +0.000806f, +0.000524f, -0.000102f, -0.000060f, +0.000041f, +0.000212f, -0.000244f, +0.000163f, + +0.000004f, +0.000235f, +0.000646f, -0.000462f, -0.000416f, +0.000293f, +0.000054f, +0.000481f, +0.000045f, +0.000180f, + +0.000045f, +0.000318f, -0.000257f, -0.000180f, +0.000091f, +0.000011f, +0.000144f, +0.000021f, +0.000020f, -0.000096f, + +0.000087f, -0.000026f, -0.000248f, -0.000042f, -0.000057f, +0.000057f, +0.000029f, -0.000081f, +0.000053f, -0.000031f, + -0.000082f, -0.000099f, +0.000077f, +0.000072f, -0.000081f, +0.000102f, -0.000077f, +0.000011f, +0.000068f, +0.000003f, + -0.000036f, +0.000085f, +0.000183f, +0.000055f, -0.000007f, -0.000079f, -0.000055f, +0.000001f, -0.000023f, +0.000078f, + -0.000048f, -0.000033f, -0.000057f, +0.000032f, +0.000073f, -0.000027f + }, + { + +0.000711f, +0.000500f, -0.001951f, +0.000539f, +0.000166f, +0.000253f, +0.000235f, -0.001056f, -0.000206f, +0.000205f, + +0.000175f, -0.000237f, -0.000101f, +0.003386f, -0.009641f, +0.001556f, +0.000656f, -0.000483f, -0.002079f, +0.002229f, + +0.001139f, -0.000302f, +0.000919f, +0.000082f, -0.000498f, -0.000525f, -0.000452f, -0.002096f, +0.001179f, -0.002028f, + +0.000025f, +0.000312f, +0.000786f, +0.000235f, -0.000541f, +0.000130f, -0.000273f, -0.000279f, +0.000058f, +0.000418f, + -0.000668f, -0.000063f, +0.000362f, +0.000249f, +0.000045f, -0.000163f, -0.000085f, +0.000061f, -0.000028f, -0.000222f, + +0.000153f, +0.000111f, -0.000032f, -0.000235f, +0.000210f, +0.000015f, -0.000126f, -0.000233f, +0.000418f, -0.000002f, + +0.000057f, +0.000117f, +0.000177f, -0.000011f, +0.000087f, +0.000039f, -0.000028f, -0.000089f, -0.000076f, +0.000077f, + +0.000184f, -0.000032f, -0.000104f, +0.000091f, -0.000012f, -0.000063f, -0.000072f, -0.000042f, -0.000103f, +0.000015f, + +0.000059f, -0.000037f, +0.000007f, +0.000001f, +0.000013f, -0.000048f, +0.000005f, +0.000038f, -0.000018f, +0.000043f, + +0.000068f, +0.000079f, -0.000001f, -0.000035f, +0.000036f, +0.000034f + }, + { + -0.011709f, +0.024988f, +0.006278f, -0.000216f, -0.001243f, +0.000139f, -0.000026f, +0.000035f, -0.000259f, -0.000371f, + -0.000482f, -0.000294f, +0.000905f, -0.000724f, -0.001394f, -0.000644f, -0.000931f, +0.000485f, +0.000937f, -0.000223f, + -0.000510f, -0.000250f, +0.000110f, -0.000453f, +0.000384f, +0.000501f, +0.000050f, +0.000410f, -0.000457f, -0.000565f, + -0.000554f, -0.000255f, +0.000140f, -0.000261f, -0.000236f, -0.000226f, -0.000013f, -0.000532f, -0.000334f, +0.000193f, + +0.000302f, +0.000345f, -0.000574f, -0.000123f, -0.000455f, -0.000022f, +0.000458f, -0.000249f, +0.000142f, -0.000132f, + -0.000054f, -0.000491f, +0.000530f, -0.000002f, -0.000043f, +0.000083f, -0.000004f, -0.000025f, -0.000144f, -0.000106f, + +0.000107f, +0.000082f, -0.000073f, -0.000151f, +0.000066f, +0.000082f, +0.000005f, -0.000105f, +0.000085f, +0.000139f, + +0.000014f, -0.000050f, +0.000119f, -0.000137f, -0.000215f, +0.000040f, +0.000020f, -0.000160f, +0.000041f, +0.000018f, + -0.000082f, -0.000021f, +0.000059f, +0.000002f, -0.000002f, +0.000026f, -0.000027f, -0.000062f, +0.000018f, -0.000002f, + +0.000042f, +0.000037f, -0.000013f, +0.000004f, -0.000029f, +0.000007f + }, + { + +0.000894f, -0.001144f, -0.002069f, +0.000657f, -0.000610f, +0.000282f, +0.000080f, -0.000704f, +0.000568f, +0.000212f, + -0.000175f, +0.000180f, +0.000715f, +0.000543f, +0.003214f, +0.000849f, -0.003406f, +0.002655f, +0.001585f, -0.001191f, + +0.000018f, +0.003182f, +0.002321f, +0.001758f, -0.000549f, +0.000601f, +0.001132f, -0.003179f, +0.000417f, -0.000125f, + -0.000076f, -0.000039f, -0.000555f, +0.000423f, -0.000282f, -0.000655f, +0.000695f, +0.000569f, -0.000103f, -0.000001f, + -0.000403f, +0.000078f, +0.000366f, -0.000097f, -0.000675f, -0.000443f, -0.000136f, -0.000131f, +0.000068f, +0.000233f, + -0.000014f, +0.000177f, +0.000216f, -0.000212f, -0.000240f, -0.000009f, -0.000068f, -0.000094f, -0.000451f, +0.000048f, + +0.000241f, +0.000199f, +0.000193f, +0.000168f, +0.000356f, +0.000037f, +0.000122f, -0.000049f, +0.000005f, -0.000045f, + +0.000058f, +0.000163f, +0.000068f, -0.000095f, -0.000141f, -0.000072f, +0.000016f, -0.000018f, +0.000045f, +0.000019f, + -0.000084f, +0.000046f, +0.000112f, -0.000017f, -0.000046f, -0.000000f, -0.000080f, -0.000106f, +0.000029f, +0.000044f, + +0.000001f, -0.000021f, +0.000022f, -0.000015f, +0.000011f, -0.000050f + }, + { + -0.005859f, -0.019048f, +0.006471f, -0.000682f, -0.000923f, -0.001594f, -0.000415f, -0.000304f, +0.000319f, -0.000523f, + -0.000813f, -0.000760f, -0.000310f, +0.000411f, -0.001024f, -0.000492f, +0.001705f, -0.000243f, +0.000499f, -0.000057f, + +0.000681f, -0.000494f, +0.000016f, +0.000227f, +0.000420f, +0.000142f, -0.000576f, +0.000224f, -0.000031f, -0.000114f, + -0.000282f, -0.000355f, -0.000279f, -0.000271f, -0.000112f, +0.000402f, +0.000343f, +0.000005f, +0.000106f, -0.000162f, + -0.000094f, +0.000115f, -0.000080f, +0.000102f, +0.000396f, +0.000031f, -0.000172f, +0.000576f, +0.000012f, -0.000336f, + -0.000174f, -0.000051f, -0.000420f, -0.000233f, +0.000230f, +0.000029f, -0.000014f, +0.000091f, -0.000090f, -0.000007f, + +0.000122f, -0.000180f, -0.000069f, +0.000030f, -0.000058f, +0.000034f, -0.000031f, -0.000047f, -0.000018f, -0.000131f, + -0.000096f, +0.000050f, -0.000054f, -0.000059f, +0.000042f, -0.000022f, +0.000001f, -0.000019f, +0.000076f, -0.000053f, + +0.000086f, +0.000035f, -0.000033f, -0.000032f, -0.000011f, -0.000080f, -0.000095f, -0.000015f, -0.000070f, -0.000025f, + -0.000014f, +0.000002f, +0.000066f, +0.000013f, -0.000010f, -0.000055f + }, + { + -0.000631f, -0.000509f, +0.000853f, +0.000313f, -0.000597f, -0.000675f, -0.000821f, -0.000670f, +0.000243f, +0.000523f, + -0.000221f, -0.000556f, +0.001295f, -0.001243f, -0.001844f, -0.002133f, +0.000928f, +0.000360f, -0.000835f, -0.001836f, + +0.000961f, -0.000617f, +0.000428f, -0.000416f, +0.000365f, -0.000262f, -0.000817f, +0.000491f, +0.000622f, +0.000909f, + +0.000244f, -0.000433f, -0.000344f, -0.000034f, -0.000505f, -0.000289f, +0.000461f, -0.000268f, +0.000224f, -0.000150f, + +0.000145f, -0.000146f, -0.000095f, -0.000190f, -0.000010f, -0.000296f, -0.000047f, +0.000045f, +0.000222f, +0.000077f, + -0.000308f, -0.000035f, +0.000190f, +0.000259f, +0.000123f, -0.000077f, +0.000196f, -0.000045f, -0.000090f, +0.000002f, + -0.000055f, -0.000082f, +0.000134f, +0.000208f, -0.000123f, -0.000130f, +0.000042f, -0.000108f, -0.000135f, -0.000051f, + +0.000030f, +0.000081f, +0.000073f, -0.000001f, -0.000085f, -0.000013f, +0.000031f, +0.000120f, +0.000129f, -0.000060f, + -0.000015f, -0.000080f, -0.000022f, +0.000087f, +0.000084f, +0.000006f, +0.000012f, -0.000012f, +0.000030f, +0.000083f, + -0.000017f, +0.000020f, +0.000014f, -0.000001f, +0.000009f, -0.000028f + }, + { + +0.001374f, -0.010670f, -0.003691f, +0.001148f, -0.000419f, -0.003486f, -0.000151f, +0.001286f, +0.001079f, +0.000606f, + +0.000273f, +0.000873f, +0.000348f, +0.001441f, -0.000103f, +0.000734f, -0.000329f, +0.000754f, -0.000185f, +0.000147f, + +0.000510f, -0.000875f, -0.000234f, -0.000179f, -0.000521f, -0.000194f, +0.000254f, +0.000174f, -0.000158f, -0.000067f, + +0.000515f, +0.000102f, +0.000011f, +0.000221f, -0.000008f, +0.000265f, -0.000060f, +0.000083f, -0.000356f, +0.000016f, + -0.000405f, +0.000159f, -0.000372f, +0.000252f, +0.000111f, -0.000146f, -0.000076f, -0.000138f, +0.000102f, +0.000031f, + -0.000032f, -0.000061f, -0.000033f, -0.000104f, -0.000042f, +0.000099f, +0.000058f, -0.000112f, +0.000025f, +0.000058f, + +0.000003f, -0.000155f, +0.000155f, -0.000092f, -0.000140f, +0.000064f, +0.000043f, +0.000063f, +0.000054f, -0.000069f, + -0.000034f, +0.000106f, -0.000063f, -0.000070f, -0.000107f, -0.000047f, +0.000056f, -0.000038f, +0.000025f, -0.000006f, + -0.000011f, -0.000040f, -0.000050f, +0.000028f, -0.000071f, -0.000043f, +0.000083f, -0.000025f, +0.000053f, -0.000012f, + -0.000075f, -0.000030f, -0.000107f, -0.000014f, +0.000027f, -0.000011f + }, + { + +0.000237f, +0.004598f, +0.002059f, -0.001940f, -0.000764f, -0.000185f, -0.000542f, +0.000127f, +0.000238f, -0.000852f, + +0.000201f, -0.000444f, -0.003458f, +0.003105f, -0.001360f, -0.002837f, +0.001137f, -0.000020f, -0.000043f, -0.000299f, + +0.002026f, -0.000625f, -0.000174f, -0.003355f, -0.000329f, +0.000017f, -0.000376f, -0.000434f, -0.000501f, +0.000326f, + -0.000494f, +0.000768f, -0.000541f, +0.000203f, +0.000244f, -0.000912f, -0.000449f, -0.000771f, +0.000034f, -0.000125f, + +0.000241f, +0.000013f, -0.000007f, -0.000122f, +0.000334f, +0.000152f, +0.000236f, -0.000108f, +0.000403f, +0.000019f, + -0.000168f, -0.000276f, -0.000171f, +0.000173f, +0.000090f, -0.000351f, -0.000052f, -0.000023f, +0.000020f, +0.000207f, + +0.000255f, -0.000090f, -0.000284f, -0.000048f, +0.000019f, -0.000032f, -0.000076f, +0.000073f, +0.000172f, -0.000073f, + -0.000024f, +0.000007f, +0.000033f, +0.000054f, -0.000011f, -0.000145f, -0.000200f, -0.000004f, -0.000007f, -0.000012f, + +0.000083f, +0.000084f, +0.000030f, +0.000068f, +0.000032f, +0.000015f, -0.000025f, -0.000128f, +0.000053f, +0.000031f, + +0.000033f, -0.000030f, -0.000130f, -0.000025f, +0.000054f, -0.000072f + }, + { + -0.001841f, -0.003347f, -0.002289f, -0.002414f, +0.000185f, -0.002477f, -0.002410f, -0.000204f, +0.000093f, -0.001171f, + +0.001350f, +0.000670f, -0.000181f, +0.001436f, -0.000654f, -0.000489f, +0.000466f, +0.000192f, +0.000160f, -0.000133f, + +0.000247f, -0.000105f, +0.000093f, +0.000169f, -0.000425f, +0.000093f, +0.000413f, +0.000698f, -0.000613f, -0.000233f, + +0.000800f, -0.000269f, +0.000172f, +0.000218f, +0.000256f, -0.000416f, +0.000469f, +0.000770f, +0.000514f, -0.000221f, + -0.000950f, +0.000094f, -0.000268f, +0.000239f, +0.000366f, +0.000497f, +0.000426f, +0.000081f, +0.000017f, -0.000040f, + -0.000232f, +0.000352f, -0.000215f, -0.000215f, -0.000063f, +0.000336f, +0.000214f, +0.000074f, -0.000034f, +0.000258f, + +0.000048f, +0.000117f, +0.000144f, +0.000136f, +0.000268f, +0.000194f, +0.000166f, -0.000070f, -0.000024f, +0.000004f, + +0.000024f, -0.000030f, +0.000003f, +0.000014f, +0.000137f, +0.000062f, +0.000019f, -0.000148f, +0.000068f, +0.000113f, + +0.000053f, -0.000014f, +0.000046f, +0.000090f, -0.000044f, +0.000054f, +0.000064f, -0.000098f, -0.000022f, +0.000021f, + -0.000048f, -0.000021f, +0.000032f, -0.000008f, +0.000002f, -0.000011f + }, + { + -0.000200f, -0.003803f, +0.002130f, +0.000126f, +0.000097f, +0.000384f, +0.000333f, +0.000749f, +0.000992f, -0.000967f, + -0.000095f, +0.000130f, +0.001869f, +0.000697f, -0.009343f, +0.000027f, +0.005007f, +0.001146f, -0.002281f, +0.000269f, + +0.001657f, -0.000254f, -0.000404f, -0.000331f, +0.000317f, -0.000191f, -0.001186f, -0.001422f, +0.000676f, +0.000746f, + -0.000333f, +0.000502f, +0.000849f, -0.000288f, +0.000366f, +0.000397f, -0.001266f, -0.000171f, +0.000868f, -0.000383f, + +0.000210f, +0.000071f, -0.000272f, +0.000254f, +0.000236f, -0.000359f, +0.000424f, +0.000066f, +0.000122f, +0.000050f, + -0.000239f, +0.000012f, -0.000193f, -0.000189f, +0.000076f, -0.000147f, -0.000023f, -0.000118f, -0.000129f, -0.000343f, + -0.000256f, +0.000086f, +0.000070f, -0.000165f, -0.000092f, -0.000126f, +0.000269f, +0.000081f, -0.000085f, -0.000023f, + +0.000084f, -0.000052f, -0.000074f, +0.000004f, -0.000041f, -0.000085f, +0.000094f, -0.000038f, -0.000103f, -0.000115f, + +0.000044f, +0.000091f, +0.000098f, +0.000027f, -0.000071f, +0.000013f, -0.000043f, +0.000019f, +0.000061f, +0.000006f, + -0.000025f, -0.000007f, +0.000001f, -0.000030f, -0.000042f, +0.000039f + } + }, + { + { + +0.005866f, +0.036231f, -0.016480f, +0.003584f, +0.000040f, -0.000064f, -0.000741f, -0.000231f, -0.000218f, -0.000810f, + -0.000154f, -0.000138f, +0.000033f, -0.000087f, -0.001199f, -0.000378f, +0.000183f, +0.000665f, +0.000984f, -0.000094f, + +0.000249f, -0.000414f, -0.000114f, +0.000651f, +0.000123f, +0.000097f, +0.000292f, -0.000068f, -0.000565f, +0.000824f, + +0.000527f, +0.000346f, +0.000338f, -0.000121f, +0.000400f, +0.000081f, +0.000250f, +0.000076f, +0.000106f, +0.000469f, + +0.000068f, -0.000064f, -0.000066f, -0.000338f, -0.000166f, -0.000379f, +0.000087f, +0.000116f, -0.000190f, -0.000545f, + -0.000309f, +0.000034f, +0.000136f, +0.000104f, +0.000059f, -0.000206f, +0.000117f, -0.000089f, +0.000076f, -0.000137f, + -0.000013f, -0.000166f, +0.000117f, +0.000102f, +0.000025f, +0.000010f, -0.000067f, +0.000016f, +0.000144f, +0.000039f, + +0.000045f, -0.000089f, -0.000007f, -0.000016f, +0.000010f, +0.000031f, -0.000121f, +0.000061f, -0.000029f, -0.000133f, + -0.000090f, +0.000008f, +0.000058f, +0.000014f, +0.000068f, -0.000077f, -0.000017f, -0.000003f, -0.000059f, +0.000011f, + +0.000005f, -0.000029f, +0.000043f, +0.000045f, -0.000022f, -0.000027f + }, + { + -0.000093f, +0.006045f, -0.001659f, -0.001907f, +0.000497f, +0.000658f, -0.000288f, -0.000431f, +0.000110f, -0.000476f, + +0.000106f, -0.000554f, +0.000302f, +0.000328f, -0.002247f, +0.001153f, +0.001257f, +0.000409f, +0.001124f, -0.000694f, + +0.000143f, -0.000029f, -0.000277f, -0.000719f, +0.000131f, +0.000951f, +0.000144f, +0.000111f, -0.000519f, -0.000888f, + +0.000541f, -0.001106f, -0.000188f, +0.000466f, +0.000080f, +0.000609f, +0.000121f, -0.000090f, +0.000120f, +0.000451f, + -0.000232f, -0.000489f, -0.000540f, +0.000102f, +0.000117f, -0.000036f, -0.000098f, +0.000471f, -0.000242f, -0.000224f, + +0.000242f, -0.000090f, -0.000212f, -0.000185f, +0.000438f, -0.000017f, +0.000066f, +0.000192f, +0.000043f, -0.000247f, + -0.000262f, -0.000103f, +0.000084f, +0.000021f, -0.000045f, +0.000051f, -0.000147f, -0.000023f, -0.000012f, +0.000057f, + -0.000096f, +0.000094f, +0.000074f, +0.000020f, -0.000041f, +0.000041f, +0.000081f, +0.000023f, -0.000036f, -0.000101f, + +0.000046f, +0.000061f, -0.000082f, -0.000058f, -0.000027f, -0.000047f, -0.000045f, +0.000043f, -0.000075f, +0.000033f, + +0.000077f, -0.000022f, -0.000070f, -0.000045f, -0.000011f, +0.000068f + }, + { + +0.002164f, +0.006465f, -0.002727f, -0.003409f, -0.002855f, -0.000453f, +0.000178f, +0.000338f, +0.000109f, -0.000268f, + -0.000627f, -0.001351f, -0.000054f, -0.000310f, -0.000552f, -0.000395f, -0.000153f, +0.001160f, -0.000474f, +0.001125f, + +0.001180f, -0.001044f, +0.000309f, +0.001102f, -0.000012f, -0.000200f, -0.000395f, +0.001037f, -0.000203f, +0.000107f, + +0.000187f, +0.000144f, -0.000522f, -0.000191f, +0.000741f, +0.000021f, -0.000273f, +0.000259f, +0.000444f, +0.000460f, + +0.000103f, +0.000024f, -0.000257f, -0.000459f, -0.000389f, -0.000029f, -0.000097f, -0.000026f, -0.000042f, +0.000109f, + -0.000226f, +0.000036f, -0.000007f, -0.000129f, -0.000329f, +0.000122f, -0.000159f, -0.000038f, +0.000157f, +0.000005f, + -0.000194f, +0.000024f, -0.000153f, -0.000021f, +0.000013f, -0.000219f, +0.000137f, -0.000017f, -0.000135f, -0.000022f, + +0.000033f, -0.000196f, -0.000060f, +0.000108f, -0.000005f, +0.000111f, +0.000017f, -0.000103f, +0.000052f, +0.000048f, + -0.000046f, -0.000054f, +0.000034f, +0.000074f, -0.000029f, -0.000048f, -0.000045f, +0.000041f, -0.000018f, -0.000020f, + +0.000049f, +0.000084f, -0.000030f, +0.000024f, +0.000027f, -0.000043f + }, + { + -0.007704f, -0.026412f, -0.001422f, -0.001779f, +0.000139f, -0.000310f, +0.000164f, -0.000154f, +0.000171f, +0.000844f, + +0.000269f, -0.000238f, -0.000146f, +0.000862f, +0.000977f, -0.000507f, -0.000311f, -0.000459f, -0.000078f, -0.000461f, + +0.000202f, -0.000232f, -0.000330f, +0.000065f, +0.000184f, -0.000116f, +0.000786f, +0.000260f, -0.000656f, -0.000856f, + +0.000141f, +0.000452f, -0.000499f, +0.000316f, -0.000024f, +0.000763f, +0.000098f, -0.000139f, +0.000670f, -0.000227f, + +0.000281f, -0.000000f, -0.000287f, -0.000035f, -0.000049f, -0.000138f, -0.000176f, +0.000026f, +0.000166f, -0.000103f, + +0.000182f, +0.000057f, -0.000202f, +0.000075f, -0.000114f, +0.000108f, -0.000149f, -0.000109f, +0.000007f, -0.000084f, + -0.000086f, -0.000112f, +0.000002f, -0.000020f, -0.000168f, -0.000002f, -0.000124f, +0.000039f, +0.000004f, -0.000055f, + +0.000024f, +0.000169f, +0.000114f, -0.000025f, -0.000013f, -0.000078f, +0.000013f, +0.000042f, -0.000011f, -0.000073f, + -0.000045f, -0.000055f, +0.000076f, +0.000039f, +0.000010f, +0.000013f, -0.000063f, +0.000057f, +0.000061f, -0.000033f, + -0.000042f, +0.000011f, +0.000024f, -0.000018f, -0.000042f, +0.000053f + }, + { + -0.000189f, -0.010008f, +0.001515f, -0.000104f, -0.000201f, +0.000214f, -0.000298f, +0.000790f, -0.000380f, +0.000205f, + +0.000131f, +0.000262f, -0.000552f, -0.000864f, +0.002015f, +0.002807f, +0.002936f, -0.005823f, +0.001752f, +0.003541f, + +0.000988f, -0.000348f, +0.000143f, -0.000071f, +0.000592f, +0.001213f, -0.002452f, -0.001112f, +0.001107f, +0.002346f, + +0.000854f, +0.000577f, +0.000035f, +0.000328f, +0.000224f, -0.001342f, +0.000063f, +0.000039f, -0.000165f, +0.000280f, + -0.000061f, +0.000243f, -0.000032f, -0.000069f, +0.000141f, +0.000092f, -0.000137f, +0.000182f, -0.000222f, -0.000433f, + +0.000057f, +0.000070f, -0.000076f, -0.000010f, +0.000084f, +0.000092f, +0.000075f, +0.000140f, +0.000233f, +0.000013f, + +0.000051f, +0.000159f, +0.000130f, -0.000096f, -0.000102f, -0.000248f, +0.000188f, +0.000125f, -0.000028f, -0.000074f, + +0.000145f, +0.000106f, +0.000077f, +0.000041f, +0.000100f, -0.000034f, -0.000050f, -0.000031f, -0.000156f, -0.000055f, + -0.000024f, +0.000049f, +0.000107f, -0.000055f, -0.000004f, +0.000012f, -0.000068f, +0.000049f, +0.000000f, -0.000023f, + -0.000016f, -0.000028f, -0.000004f, +0.000066f, -0.000016f, -0.000038f + }, + { + -0.007444f, -0.032082f, +0.000941f, +0.001946f, -0.000504f, +0.000128f, -0.000199f, +0.000482f, +0.000207f, -0.001190f, + -0.000877f, +0.000405f, +0.000472f, +0.000222f, -0.000873f, -0.000014f, -0.000215f, +0.000090f, -0.000424f, -0.000319f, + -0.000923f, -0.000154f, +0.000576f, -0.000358f, +0.000010f, -0.000498f, +0.000271f, +0.000736f, -0.000576f, -0.000786f, + -0.000032f, +0.000513f, +0.000317f, -0.000288f, +0.000220f, +0.000301f, -0.000133f, +0.000126f, -0.000074f, +0.000212f, + -0.000940f, -0.000199f, +0.000694f, +0.000130f, +0.000002f, -0.000009f, -0.000274f, +0.000227f, +0.000013f, +0.000127f, + +0.000147f, -0.000044f, -0.000500f, -0.000215f, +0.000002f, -0.000272f, -0.000199f, -0.000002f, +0.000189f, +0.000096f, + +0.000076f, -0.000064f, -0.000185f, +0.000009f, +0.000066f, +0.000010f, -0.000098f, +0.000013f, +0.000057f, -0.000066f, + -0.000118f, -0.000003f, +0.000066f, -0.000008f, +0.000002f, +0.000029f, -0.000077f, +0.000024f, +0.000097f, +0.000027f, + +0.000053f, +0.000115f, +0.000110f, -0.000063f, -0.000035f, -0.000043f, +0.000002f, -0.000052f, +0.000034f, +0.000023f, + -0.000041f, -0.000022f, -0.000015f, +0.000070f, +0.000003f, -0.000042f + }, + { + +0.000072f, -0.001279f, -0.001035f, +0.000466f, -0.000052f, -0.000026f, +0.000601f, -0.000239f, +0.000253f, +0.000150f, + +0.000001f, -0.000095f, +0.000017f, +0.003819f, -0.009458f, +0.000627f, -0.000359f, +0.000054f, -0.002039f, +0.001699f, + +0.001115f, -0.000988f, +0.000260f, +0.001866f, +0.001124f, -0.000892f, +0.000169f, +0.000037f, +0.000806f, -0.002424f, + -0.000169f, -0.000028f, +0.000178f, -0.000568f, -0.000083f, +0.000754f, +0.000014f, -0.000120f, -0.000314f, -0.000210f, + -0.000250f, +0.000668f, -0.000042f, +0.000066f, -0.000023f, -0.000146f, +0.000028f, +0.000184f, +0.000003f, -0.000078f, + -0.000079f, -0.000128f, +0.000020f, -0.000062f, +0.000054f, -0.000059f, -0.000108f, -0.000122f, +0.000128f, -0.000034f, + +0.000145f, +0.000075f, +0.000166f, -0.000051f, +0.000028f, +0.000060f, -0.000195f, -0.000045f, +0.000039f, +0.000130f, + +0.000058f, -0.000142f, -0.000062f, -0.000005f, -0.000090f, -0.000012f, -0.000116f, -0.000066f, -0.000075f, +0.000057f, + -0.000006f, -0.000051f, +0.000006f, -0.000017f, -0.000018f, -0.000039f, +0.000047f, +0.000028f, +0.000029f, +0.000075f, + +0.000066f, +0.000028f, -0.000050f, +0.000011f, +0.000015f, +0.000002f + }, + { + +0.010744f, +0.042791f, -0.005442f, +0.001033f, +0.000023f, +0.000545f, +0.000828f, -0.000324f, +0.000080f, -0.000534f, + -0.000628f, +0.000820f, +0.000373f, -0.001053f, +0.000336f, -0.000250f, -0.000661f, +0.000694f, -0.000041f, -0.000653f, + -0.000012f, -0.000354f, -0.000032f, +0.000048f, +0.001047f, +0.000074f, -0.000316f, -0.000124f, -0.000791f, -0.000358f, + -0.000187f, +0.000058f, -0.000099f, -0.000549f, -0.000138f, -0.000701f, +0.000025f, -0.000204f, -0.000118f, +0.000257f, + +0.000101f, +0.000058f, -0.000301f, +0.000092f, -0.000591f, -0.000038f, +0.000367f, +0.000227f, +0.000060f, -0.000335f, + -0.000052f, -0.000147f, +0.000616f, -0.000165f, -0.000115f, -0.000021f, -0.000091f, -0.000034f, -0.000056f, +0.000043f, + +0.000106f, -0.000062f, -0.000146f, -0.000016f, +0.000153f, +0.000012f, +0.000032f, -0.000071f, -0.000021f, +0.000027f, + -0.000011f, -0.000052f, -0.000036f, -0.000150f, -0.000020f, +0.000139f, -0.000104f, -0.000096f, +0.000132f, -0.000021f, + -0.000007f, +0.000077f, +0.000015f, +0.000001f, +0.000048f, +0.000009f, -0.000021f, -0.000032f, -0.000026f, -0.000013f, + +0.000038f, +0.000005f, -0.000024f, -0.000029f, -0.000014f, +0.000050f + }, + { + +0.000158f, -0.003274f, +0.000884f, +0.001198f, -0.000220f, +0.000233f, -0.000302f, -0.001051f, +0.000194f, +0.000051f, + +0.000192f, +0.000113f, +0.000425f, +0.001558f, +0.003018f, +0.003631f, +0.001840f, +0.002617f, +0.001249f, -0.002224f, + -0.000360f, +0.002574f, -0.000412f, -0.001214f, -0.000183f, +0.000558f, +0.000616f, -0.000658f, +0.001252f, -0.000766f, + +0.000948f, -0.000192f, +0.000263f, +0.000408f, -0.000363f, +0.000033f, +0.000107f, -0.000168f, +0.000163f, -0.000104f, + -0.000570f, +0.000055f, +0.000084f, -0.000228f, -0.000539f, -0.000126f, -0.000034f, +0.000122f, +0.000091f, +0.000341f, + +0.000020f, -0.000027f, -0.000198f, -0.000204f, +0.000056f, +0.000109f, -0.000331f, -0.000230f, -0.000186f, +0.000227f, + +0.000235f, -0.000012f, -0.000078f, +0.000070f, +0.000131f, -0.000013f, +0.000139f, -0.000036f, +0.000068f, -0.000066f, + +0.000113f, +0.000138f, +0.000019f, -0.000192f, -0.000157f, +0.000022f, +0.000006f, -0.000099f, -0.000009f, -0.000002f, + +0.000001f, +0.000126f, +0.000044f, -0.000005f, -0.000033f, -0.000020f, -0.000094f, -0.000053f, +0.000062f, +0.000027f, + -0.000036f, +0.000015f, +0.000008f, -0.000013f, -0.000032f, -0.000061f + }, + { + +0.004930f, -0.013252f, +0.002012f, +0.001812f, -0.000568f, -0.002114f, +0.000232f, -0.000379f, +0.000133f, -0.001184f, + -0.000581f, -0.000527f, +0.000072f, +0.000924f, +0.000110f, -0.000108f, +0.000016f, -0.001132f, +0.000474f, +0.000320f, + +0.000169f, -0.000356f, +0.000256f, +0.000229f, +0.000100f, -0.000065f, -0.000568f, -0.000024f, -0.000313f, +0.000304f, + +0.000120f, -0.000133f, -0.000121f, -0.000109f, -0.000074f, +0.000309f, -0.000107f, -0.000456f, +0.000235f, -0.000399f, + -0.000123f, -0.000151f, +0.000347f, +0.000330f, -0.000285f, -0.000137f, -0.000202f, +0.000251f, -0.000099f, -0.000289f, + -0.000090f, -0.000058f, -0.000404f, +0.000135f, +0.000435f, +0.000079f, +0.000055f, +0.000089f, -0.000082f, +0.000116f, + +0.000079f, -0.000073f, -0.000070f, +0.000043f, +0.000129f, -0.000058f, -0.000044f, +0.000014f, -0.000073f, +0.000020f, + -0.000044f, +0.000055f, -0.000087f, +0.000026f, -0.000006f, -0.000001f, -0.000050f, +0.000093f, -0.000034f, -0.000023f, + +0.000084f, -0.000012f, -0.000105f, +0.000007f, -0.000067f, -0.000102f, -0.000069f, +0.000011f, -0.000077f, +0.000001f, + +0.000006f, +0.000045f, +0.000044f, -0.000016f, -0.000016f, -0.000063f + }, + { + +0.000468f, -0.001534f, -0.003758f, -0.001308f, -0.001118f, -0.000055f, +0.000936f, +0.000469f, +0.000072f, -0.000343f, + +0.000238f, +0.000152f, +0.000541f, +0.000549f, +0.000919f, -0.000058f, -0.000655f, -0.001749f, -0.000871f, +0.000561f, + +0.001177f, -0.000776f, -0.000293f, -0.001008f, +0.000316f, -0.000818f, -0.000494f, -0.000508f, -0.000383f, +0.000370f, + -0.000083f, -0.000424f, -0.000291f, +0.000077f, -0.000431f, +0.000064f, +0.000757f, -0.000126f, +0.000135f, -0.000437f, + +0.000490f, +0.000039f, -0.000053f, -0.000200f, +0.000038f, -0.000209f, +0.000121f, -0.000081f, -0.000181f, -0.000148f, + -0.000164f, +0.000129f, +0.000186f, +0.000165f, +0.000065f, -0.000056f, +0.000005f, -0.000052f, -0.000019f, +0.000037f, + -0.000150f, +0.000013f, +0.000142f, +0.000065f, -0.000156f, +0.000022f, -0.000114f, -0.000176f, +0.000072f, +0.000033f, + +0.000076f, +0.000040f, -0.000043f, -0.000047f, -0.000028f, +0.000079f, +0.000065f, +0.000097f, -0.000014f, -0.000037f, + +0.000015f, -0.000074f, -0.000039f, +0.000110f, +0.000030f, -0.000009f, +0.000041f, -0.000020f, +0.000060f, +0.000035f, + -0.000038f, +0.000018f, -0.000007f, -0.000012f, -0.000044f, +0.000033f + }, + { + +0.000252f, -0.010322f, -0.002583f, +0.000982f, -0.000550f, +0.000992f, +0.001825f, -0.000154f, +0.000489f, +0.000151f, + +0.000597f, +0.000123f, -0.000027f, +0.000519f, -0.000344f, +0.000589f, -0.001149f, +0.000197f, -0.000668f, -0.000031f, + -0.000066f, -0.000606f, -0.000044f, +0.000049f, -0.000230f, +0.000013f, -0.000422f, +0.000813f, +0.000056f, -0.000045f, + +0.000274f, +0.000177f, +0.000501f, +0.000138f, +0.000096f, +0.000639f, +0.000663f, +0.000511f, -0.000448f, -0.000295f, + -0.000616f, +0.000403f, -0.000670f, +0.000061f, -0.000007f, +0.000195f, +0.000281f, -0.000210f, -0.000177f, +0.000132f, + -0.000278f, -0.000021f, -0.000196f, +0.000140f, -0.000057f, +0.000015f, -0.000031f, +0.000081f, +0.000133f, -0.000068f, + -0.000034f, -0.000033f, +0.000099f, -0.000172f, -0.000026f, +0.000059f, +0.000044f, +0.000108f, +0.000032f, -0.000195f, + +0.000033f, +0.000068f, -0.000094f, -0.000023f, -0.000056f, -0.000009f, +0.000026f, -0.000020f, -0.000007f, -0.000024f, + -0.000023f, -0.000090f, +0.000023f, +0.000018f, -0.000056f, +0.000028f, +0.000027f, -0.000013f, +0.000021f, -0.000071f, + -0.000030f, -0.000026f, -0.000054f, +0.000013f, +0.000001f, -0.000020f + }, + { + -0.000082f, +0.004123f, +0.001671f, -0.001425f, +0.000432f, -0.000281f, -0.000013f, -0.000102f, +0.000125f, -0.000814f, + -0.000404f, -0.000307f, -0.000073f, +0.007969f, -0.001577f, -0.002295f, +0.001940f, +0.000710f, +0.001292f, -0.000206f, + +0.002952f, -0.001764f, -0.002250f, -0.004135f, -0.000848f, -0.001459f, +0.000141f, -0.000666f, +0.000054f, -0.000533f, + -0.000807f, +0.000666f, +0.000161f, +0.000243f, +0.000481f, -0.000077f, -0.000049f, -0.000186f, -0.000443f, -0.000607f, + +0.000246f, +0.000263f, +0.000188f, +0.000090f, +0.000292f, -0.000010f, -0.000237f, -0.000323f, +0.000185f, -0.000209f, + -0.000264f, -0.000306f, +0.000076f, +0.000150f, -0.000143f, -0.000243f, +0.000134f, -0.000020f, -0.000026f, +0.000295f, + +0.000197f, -0.000253f, -0.000177f, +0.000056f, +0.000080f, -0.000091f, -0.000148f, +0.000110f, -0.000017f, -0.000075f, + -0.000005f, +0.000033f, -0.000068f, +0.000006f, -0.000076f, -0.000058f, -0.000090f, +0.000035f, -0.000009f, -0.000069f, + +0.000100f, +0.000082f, +0.000038f, +0.000075f, -0.000001f, +0.000027f, -0.000083f, -0.000030f, +0.000017f, +0.000021f, + +0.000062f, -0.000091f, -0.000105f, +0.000066f, -0.000015f, -0.000062f + }, + { + +0.001955f, +0.001624f, -0.001048f, -0.000554f, +0.000259f, +0.001935f, +0.002977f, +0.000380f, +0.000068f, +0.000130f, + +0.000087f, -0.001209f, +0.000778f, -0.000152f, -0.002775f, +0.000666f, +0.000417f, +0.000157f, +0.000068f, -0.000234f, + +0.000723f, -0.000358f, +0.000095f, -0.000437f, -0.000217f, -0.000224f, +0.000159f, +0.000714f, -0.000618f, +0.000361f, + +0.000432f, -0.000453f, +0.000354f, +0.000463f, +0.000276f, -0.000289f, +0.000637f, +0.000725f, +0.000306f, -0.000000f, + -0.000252f, -0.000166f, -0.000224f, +0.000284f, +0.000276f, +0.000267f, +0.000187f, -0.000080f, +0.000148f, -0.000121f, + +0.000196f, +0.000109f, -0.000272f, +0.000022f, +0.000102f, +0.000333f, +0.000011f, -0.000191f, +0.000124f, +0.000176f, + +0.000063f, +0.000084f, +0.000119f, +0.000203f, +0.000129f, +0.000099f, +0.000028f, -0.000028f, -0.000030f, +0.000067f, + -0.000101f, -0.000002f, -0.000038f, +0.000003f, +0.000063f, +0.000056f, -0.000031f, -0.000065f, +0.000124f, +0.000060f, + -0.000020f, +0.000019f, +0.000102f, +0.000045f, -0.000021f, +0.000058f, -0.000051f, -0.000094f, +0.000039f, +0.000008f, + -0.000034f, +0.000030f, +0.000034f, -0.000011f, -0.000058f, -0.000015f + }, + { + -0.000026f, -0.003107f, +0.000657f, +0.000027f, +0.000361f, +0.000201f, +0.000470f, -0.001038f, -0.000472f, -0.000275f, + +0.000128f, -0.000328f, +0.001194f, +0.004622f, -0.002727f, +0.001510f, +0.003545f, +0.000426f, -0.001685f, +0.001019f, + +0.000928f, -0.000977f, -0.000385f, +0.000601f, +0.001278f, +0.000676f, -0.000845f, -0.000438f, +0.000210f, +0.000270f, + +0.000138f, +0.000547f, +0.000609f, -0.000445f, +0.000336f, +0.000010f, -0.000561f, +0.000925f, +0.000536f, -0.000529f, + -0.000383f, -0.000316f, -0.000237f, +0.000439f, +0.000012f, -0.000446f, +0.000441f, +0.000185f, +0.000086f, +0.000079f, + -0.000089f, -0.000107f, -0.000179f, +0.000070f, +0.000228f, -0.000207f, -0.000016f, -0.000036f, -0.000172f, -0.000327f, + -0.000136f, +0.000097f, -0.000044f, -0.000122f, -0.000040f, -0.000031f, +0.000295f, -0.000184f, -0.000091f, -0.000054f, + +0.000090f, -0.000131f, -0.000115f, -0.000025f, -0.000052f, +0.000074f, +0.000002f, -0.000044f, -0.000037f, -0.000013f, + +0.000133f, +0.000074f, +0.000091f, -0.000077f, -0.000075f, +0.000010f, -0.000055f, +0.000006f, +0.000067f, -0.000022f, + -0.000017f, +0.000026f, -0.000020f, -0.000046f, +0.000005f, +0.000062f + } + }, + { + { + -0.007167f, +0.030888f, +0.005645f, +0.001318f, +0.000560f, -0.000536f, -0.000234f, -0.000008f, -0.000597f, -0.000147f, + +0.000706f, -0.000785f, -0.000224f, -0.000379f, -0.000868f, -0.000868f, +0.000818f, +0.000194f, +0.000630f, +0.000877f, + -0.001415f, +0.000736f, -0.000171f, +0.000224f, +0.000321f, -0.000183f, -0.000095f, +0.000080f, +0.000029f, +0.000803f, + +0.000248f, +0.000601f, +0.000518f, +0.000615f, -0.000479f, +0.000185f, +0.000601f, +0.000259f, +0.000269f, +0.000106f, + -0.000092f, +0.000260f, -0.000127f, -0.000331f, -0.000044f, +0.000204f, -0.000294f, -0.000220f, -0.000090f, -0.000236f, + -0.000121f, +0.000154f, +0.000112f, +0.000011f, -0.000254f, -0.000201f, -0.000187f, -0.000223f, -0.000171f, -0.000050f, + +0.000212f, -0.000125f, -0.000168f, -0.000052f, +0.000060f, -0.000066f, +0.000122f, +0.000063f, -0.000027f, -0.000023f, + -0.000049f, -0.000026f, +0.000027f, +0.000004f, -0.000094f, -0.000173f, +0.000017f, +0.000027f, -0.000047f, +0.000096f, + +0.000066f, +0.000121f, +0.000057f, +0.000017f, -0.000020f, -0.000015f, +0.000071f, -0.000009f, +0.000040f, +0.000046f, + -0.000004f, -0.000024f, +0.000039f, -0.000002f, -0.000016f, +0.000013f + }, + { + -0.000185f, +0.007943f, -0.002271f, +0.001866f, +0.000291f, -0.000350f, -0.000023f, +0.000195f, -0.000003f, -0.000298f, + -0.000565f, +0.000446f, -0.000370f, -0.001719f, +0.000187f, -0.000814f, -0.000031f, +0.000320f, -0.000664f, -0.000212f, + -0.000243f, -0.000092f, -0.001185f, -0.000137f, -0.000165f, +0.000420f, +0.001266f, +0.000553f, -0.000156f, -0.001137f, + +0.000033f, -0.000686f, +0.000548f, +0.000447f, -0.000005f, +0.000516f, +0.000503f, +0.000171f, -0.000186f, -0.000348f, + +0.000276f, +0.000272f, -0.000155f, -0.000086f, +0.000214f, -0.000063f, +0.000245f, +0.000200f, -0.000307f, +0.000118f, + +0.000086f, +0.000040f, +0.000183f, +0.000421f, -0.000117f, -0.000410f, +0.000065f, +0.000034f, -0.000082f, -0.000125f, + +0.000045f, +0.000075f, +0.000027f, -0.000028f, +0.000064f, -0.000094f, +0.000098f, +0.000156f, -0.000008f, -0.000039f, + +0.000006f, +0.000096f, -0.000140f, -0.000062f, +0.000088f, +0.000011f, -0.000115f, -0.000073f, +0.000001f, +0.000096f, + +0.000021f, -0.000107f, -0.000027f, -0.000003f, +0.000006f, +0.000065f, +0.000021f, -0.000021f, +0.000038f, +0.000064f, + -0.000059f, -0.000030f, +0.000037f, +0.000069f, +0.000030f, -0.000025f + }, + { + -0.001831f, +0.003635f, +0.000171f, -0.002436f, +0.002708f, -0.000964f, +0.000383f, -0.000280f, -0.000192f, -0.000426f, + -0.000175f, -0.000983f, -0.000852f, +0.000251f, -0.000391f, +0.000151f, +0.000475f, +0.000453f, -0.000369f, -0.000010f, + +0.000607f, -0.000470f, +0.000434f, +0.000684f, +0.000610f, +0.000290f, +0.000105f, +0.000827f, -0.000407f, +0.000148f, + +0.000213f, -0.000396f, +0.000100f, -0.000095f, -0.000421f, -0.000269f, +0.000746f, -0.000453f, +0.000220f, +0.000300f, + -0.000036f, -0.000284f, -0.000151f, -0.000014f, -0.000072f, +0.000128f, -0.000001f, -0.000077f, +0.000326f, -0.000291f, + -0.000110f, +0.000072f, +0.000089f, -0.000134f, +0.000050f, +0.000115f, -0.000159f, -0.000004f, -0.000039f, +0.000054f, + -0.000121f, +0.000139f, -0.000104f, +0.000015f, -0.000129f, +0.000069f, +0.000081f, -0.000134f, +0.000108f, +0.000026f, + -0.000120f, -0.000144f, +0.000125f, +0.000001f, +0.000029f, -0.000015f, -0.000171f, +0.000076f, +0.000107f, -0.000021f, + -0.000003f, +0.000010f, +0.000029f, -0.000014f, +0.000024f, +0.000059f, +0.000022f, +0.000003f, -0.000071f, +0.000025f, + -0.000025f, -0.000051f, -0.000017f, +0.000006f, -0.000035f, -0.000011f + }, + { + +0.003446f, -0.044406f, +0.002179f, -0.001733f, -0.000436f, -0.000048f, +0.000186f, +0.000090f, +0.000360f, +0.000474f, + -0.000065f, -0.000346f, +0.000760f, -0.000586f, +0.000179f, -0.000969f, +0.000359f, -0.000570f, -0.000817f, -0.000210f, + -0.000245f, +0.000491f, +0.000031f, -0.000089f, -0.000054f, -0.000344f, +0.000159f, +0.000469f, +0.000173f, -0.000229f, + +0.000277f, +0.000248f, +0.000094f, -0.000021f, +0.000012f, +0.000672f, +0.000112f, +0.000377f, -0.000004f, +0.000395f, + +0.000091f, -0.000606f, +0.000031f, +0.000093f, +0.000107f, +0.000152f, -0.000010f, +0.000032f, +0.000072f, -0.000142f, + +0.000176f, -0.000016f, -0.000233f, +0.000322f, -0.000063f, +0.000060f, -0.000036f, -0.000091f, -0.000106f, -0.000139f, + -0.000020f, +0.000188f, +0.000033f, -0.000068f, +0.000128f, -0.000143f, +0.000026f, +0.000051f, -0.000020f, +0.000036f, + +0.000110f, -0.000065f, -0.000160f, +0.000062f, -0.000029f, -0.000006f, +0.000040f, -0.000003f, +0.000002f, +0.000046f, + +0.000078f, +0.000035f, +0.000029f, -0.000024f, +0.000005f, -0.000085f, -0.000010f, +0.000029f, -0.000073f, +0.000017f, + +0.000047f, +0.000023f, -0.000004f, +0.000007f, +0.000021f, +0.000004f + }, + { + +0.000510f, -0.010126f, -0.000686f, +0.000274f, +0.000329f, -0.000532f, +0.000106f, +0.000950f, +0.000160f, +0.000397f, + +0.000115f, +0.000226f, -0.000194f, +0.001814f, -0.002385f, +0.000069f, -0.001990f, -0.001463f, +0.005755f, +0.002298f, + -0.000699f, +0.000739f, -0.000544f, -0.000170f, -0.000586f, +0.000289f, -0.002744f, -0.000806f, +0.001431f, +0.001770f, + +0.000494f, +0.001605f, -0.000378f, +0.001308f, -0.000472f, -0.000348f, +0.000097f, +0.000099f, +0.000186f, +0.000044f, + +0.000036f, +0.000336f, +0.000642f, -0.000213f, +0.000027f, +0.000283f, -0.000180f, +0.000482f, -0.000187f, -0.000096f, + +0.000282f, -0.000230f, +0.000089f, +0.000031f, -0.000082f, +0.000023f, +0.000160f, +0.000268f, +0.000168f, +0.000118f, + +0.000190f, +0.000140f, +0.000041f, +0.000110f, +0.000163f, +0.000027f, +0.000145f, +0.000094f, -0.000061f, +0.000059f, + +0.000033f, -0.000041f, +0.000024f, -0.000036f, -0.000100f, +0.000015f, +0.000149f, +0.000051f, +0.000047f, +0.000041f, + +0.000105f, +0.000027f, -0.000089f, -0.000034f, +0.000063f, -0.000039f, +0.000046f, +0.000001f, -0.000041f, +0.000031f, + +0.000018f, +0.000040f, +0.000003f, -0.000026f, -0.000016f, +0.000064f + }, + { + +0.001991f, -0.046820f, +0.000562f, +0.002759f, -0.000978f, -0.000083f, +0.000576f, +0.000522f, -0.001104f, +0.000519f, + +0.001081f, -0.000177f, -0.000632f, -0.000442f, -0.000449f, -0.000485f, -0.000061f, +0.000533f, +0.000001f, -0.000250f, + +0.000026f, +0.000667f, -0.000447f, -0.000685f, +0.000088f, -0.000106f, -0.000131f, +0.000114f, -0.000965f, +0.000026f, + -0.000157f, +0.000188f, -0.000354f, +0.000090f, +0.000269f, -0.000068f, -0.000052f, +0.000130f, -0.000014f, +0.000289f, + -0.000221f, -0.000112f, -0.000188f, +0.000562f, +0.000459f, -0.000475f, -0.000455f, -0.000286f, +0.000016f, +0.000244f, + +0.000106f, -0.000339f, -0.000071f, +0.000181f, -0.000102f, -0.000157f, +0.000045f, +0.000201f, +0.000040f, +0.000056f, + -0.000088f, -0.000000f, +0.000149f, +0.000169f, +0.000038f, -0.000136f, -0.000012f, +0.000090f, -0.000033f, -0.000021f, + -0.000025f, +0.000117f, +0.000003f, -0.000044f, +0.000000f, -0.000013f, +0.000090f, -0.000002f, -0.000047f, +0.000029f, + +0.000017f, -0.000025f, -0.000146f, -0.000058f, +0.000009f, +0.000075f, +0.000042f, +0.000021f, +0.000028f, -0.000069f, + +0.000034f, -0.000010f, +0.000028f, -0.000024f, -0.000044f, +0.000006f + }, + { + -0.000493f, +0.001771f, +0.000459f, -0.000846f, -0.000001f, -0.000061f, +0.000488f, +0.000295f, +0.000419f, -0.000198f, + -0.000020f, +0.000089f, -0.000173f, -0.002308f, -0.003934f, -0.004390f, +0.000794f, -0.000439f, -0.001614f, +0.000040f, + +0.000617f, +0.000106f, +0.001668f, -0.001027f, +0.000972f, -0.001079f, -0.000169f, +0.001483f, -0.001157f, +0.000068f, + -0.000231f, +0.000303f, -0.001277f, +0.000238f, +0.000899f, +0.000437f, -0.000017f, -0.000005f, -0.000515f, +0.000148f, + +0.000169f, +0.000168f, -0.000129f, -0.000118f, -0.000223f, +0.000260f, +0.000262f, +0.000115f, -0.000041f, -0.000155f, + -0.000321f, -0.000090f, +0.000156f, +0.000102f, -0.000013f, +0.000021f, +0.000141f, +0.000057f, -0.000216f, -0.000049f, + -0.000039f, -0.000058f, +0.000032f, -0.000030f, -0.000092f, -0.000024f, -0.000084f, +0.000194f, +0.000067f, -0.000148f, + -0.000180f, +0.000046f, +0.000137f, -0.000020f, +0.000044f, +0.000063f, +0.000042f, +0.000083f, +0.000031f, +0.000007f, + -0.000008f, -0.000017f, +0.000022f, -0.000042f, -0.000025f, +0.000027f, -0.000017f, -0.000062f, -0.000006f, -0.000064f, + -0.000077f, -0.000075f, -0.000012f, +0.000030f, -0.000040f, +0.000002f + }, + { + -0.006506f, +0.054384f, -0.000045f, +0.001330f, +0.000823f, +0.000559f, +0.000215f, -0.000689f, +0.000080f, -0.000115f, + +0.000445f, -0.000047f, -0.000860f, -0.000356f, +0.001234f, -0.000345f, +0.000198f, -0.000251f, -0.001164f, +0.000058f, + +0.000391f, -0.000235f, +0.000509f, +0.000292f, -0.000057f, -0.000027f, -0.000254f, +0.000344f, -0.000857f, -0.000164f, + +0.000140f, -0.000165f, -0.000171f, +0.000240f, -0.000408f, -0.000153f, -0.000060f, +0.000153f, +0.000256f, +0.000280f, + -0.000062f, -0.000265f, +0.000109f, -0.000411f, -0.000016f, -0.000274f, -0.000015f, -0.000257f, -0.000024f, +0.000259f, + -0.000013f, +0.000102f, -0.000149f, -0.000334f, +0.000070f, +0.000117f, +0.000107f, +0.000103f, -0.000009f, +0.000038f, + -0.000099f, -0.000164f, +0.000067f, +0.000076f, -0.000004f, -0.000013f, -0.000020f, +0.000033f, -0.000078f, -0.000130f, + +0.000023f, +0.000027f, -0.000093f, +0.000176f, +0.000159f, -0.000043f, -0.000024f, +0.000109f, -0.000001f, -0.000001f, + +0.000063f, +0.000011f, -0.000048f, +0.000010f, +0.000028f, -0.000046f, +0.000049f, +0.000045f, +0.000006f, +0.000011f, + -0.000017f, -0.000009f, +0.000043f, +0.000025f, +0.000019f, +0.000000f + }, + { + -0.000859f, +0.001062f, +0.003988f, -0.000157f, +0.000302f, -0.000192f, -0.000480f, -0.000495f, +0.000291f, +0.000098f, + -0.000030f, -0.000147f, -0.000640f, +0.001474f, +0.005818f, -0.002390f, +0.004457f, +0.002270f, -0.000226f, -0.000748f, + +0.000466f, -0.000587f, -0.002146f, +0.001054f, +0.000628f, +0.001349f, -0.000467f, +0.001356f, +0.000779f, -0.000774f, + +0.000450f, -0.000135f, +0.000640f, -0.000099f, +0.000098f, +0.000125f, -0.000509f, -0.000164f, +0.000244f, -0.000106f, + +0.000403f, -0.000049f, -0.000300f, +0.000225f, +0.000155f, +0.000270f, +0.000023f, -0.000066f, +0.000475f, -0.000090f, + -0.000143f, -0.000296f, -0.000166f, -0.000048f, +0.000144f, +0.000007f, -0.000107f, +0.000005f, +0.000262f, +0.000047f, + -0.000039f, -0.000187f, -0.000196f, -0.000236f, -0.000260f, -0.000086f, -0.000077f, -0.000022f, +0.000086f, -0.000115f, + +0.000014f, +0.000000f, -0.000135f, +0.000024f, +0.000084f, +0.000037f, -0.000126f, -0.000044f, -0.000004f, +0.000006f, + +0.000043f, -0.000092f, -0.000111f, +0.000041f, +0.000003f, +0.000027f, +0.000081f, +0.000082f, +0.000026f, -0.000022f, + -0.000013f, +0.000029f, -0.000021f, +0.000036f, -0.000015f, +0.000021f + }, + { + -0.004339f, -0.007690f, +0.003814f, +0.002138f, +0.000414f, -0.000542f, -0.000652f, -0.000554f, -0.000409f, +0.000099f, + +0.000350f, +0.000344f, +0.000165f, -0.000598f, +0.001795f, -0.001222f, -0.001366f, +0.000601f, +0.000319f, -0.000309f, + -0.000123f, +0.000287f, +0.000390f, -0.000039f, +0.000256f, -0.000213f, -0.000626f, +0.000131f, +0.000223f, -0.000087f, + +0.000292f, -0.000057f, +0.000262f, +0.000520f, +0.000258f, -0.000230f, -0.000479f, -0.000035f, -0.000019f, -0.000322f, + +0.000516f, +0.000073f, +0.000275f, -0.000092f, -0.000118f, +0.000582f, -0.000071f, -0.000220f, +0.000114f, +0.000368f, + +0.000055f, +0.000017f, +0.000180f, +0.000067f, -0.000050f, +0.000108f, +0.000124f, -0.000078f, +0.000018f, +0.000002f, + -0.000176f, +0.000144f, +0.000057f, -0.000027f, +0.000055f, +0.000015f, -0.000031f, -0.000041f, +0.000009f, +0.000150f, + +0.000007f, -0.000032f, +0.000023f, +0.000053f, +0.000000f, +0.000022f, -0.000004f, +0.000029f, -0.000082f, +0.000000f, + -0.000080f, -0.000060f, +0.000022f, +0.000045f, +0.000000f, +0.000097f, +0.000091f, +0.000045f, +0.000058f, +0.000027f, + +0.000015f, +0.000007f, -0.000070f, -0.000021f, +0.000035f, +0.000035f + }, + { + -0.000239f, -0.001749f, -0.001846f, -0.003158f, -0.000141f, +0.000725f, +0.000759f, +0.000433f, -0.000023f, -0.000148f, + +0.000814f, +0.000603f, -0.000639f, +0.001641f, +0.001341f, -0.000471f, -0.001842f, -0.001919f, +0.000336f, +0.000456f, + -0.001212f, -0.000071f, -0.000041f, -0.000748f, -0.000259f, +0.000354f, -0.000660f, -0.000558f, -0.000625f, -0.001182f, + -0.000160f, -0.000128f, -0.000236f, -0.000200f, +0.000060f, +0.000306f, -0.000249f, -0.000134f, -0.000222f, -0.000443f, + +0.000300f, +0.000049f, +0.000088f, +0.000051f, -0.000251f, +0.000089f, +0.000044f, -0.000128f, +0.000001f, +0.000074f, + +0.000285f, +0.000145f, -0.000183f, -0.000226f, -0.000142f, -0.000014f, -0.000074f, +0.000038f, +0.000094f, -0.000027f, + +0.000222f, +0.000068f, -0.000192f, -0.000099f, +0.000145f, +0.000093f, -0.000038f, +0.000113f, +0.000156f, +0.000005f, + +0.000013f, -0.000061f, -0.000061f, +0.000017f, +0.000065f, -0.000018f, -0.000051f, -0.000142f, -0.000071f, +0.000035f, + -0.000050f, +0.000058f, +0.000053f, -0.000063f, -0.000102f, -0.000000f, -0.000018f, -0.000031f, -0.000009f, -0.000081f, + +0.000001f, -0.000014f, -0.000012f, -0.000001f, +0.000010f, +0.000027f + }, + { + -0.001975f, -0.006170f, -0.004253f, +0.000063f, +0.000723f, +0.002726f, -0.000499f, -0.000856f, +0.000392f, +0.000177f, + -0.000188f, -0.001082f, -0.000207f, -0.000556f, +0.000654f, -0.000378f, -0.000222f, -0.000491f, -0.000034f, -0.000292f, + -0.000374f, +0.000255f, +0.000283f, -0.000360f, +0.000253f, +0.000036f, -0.000122f, +0.000494f, -0.000095f, +0.000037f, + -0.000072f, +0.000148f, -0.000173f, -0.000183f, +0.000344f, +0.000276f, -0.000208f, -0.000403f, -0.000148f, -0.000115f, + -0.000366f, +0.000019f, -0.000073f, +0.000233f, -0.000233f, +0.000145f, +0.000080f, +0.000037f, +0.000047f, +0.000116f, + -0.000186f, +0.000237f, +0.000057f, +0.000168f, -0.000100f, -0.000092f, -0.000061f, +0.000124f, -0.000116f, -0.000121f, + +0.000073f, +0.000016f, -0.000031f, +0.000076f, +0.000050f, -0.000156f, -0.000022f, -0.000028f, -0.000072f, +0.000020f, + +0.000063f, -0.000057f, +0.000008f, +0.000017f, +0.000055f, +0.000045f, -0.000055f, -0.000053f, -0.000049f, -0.000038f, + -0.000025f, +0.000056f, +0.000076f, -0.000032f, +0.000053f, -0.000006f, -0.000066f, +0.000035f, -0.000033f, -0.000003f, + +0.000068f, +0.000040f, +0.000072f, -0.000016f, -0.000037f, +0.000009f + }, + { + -0.000038f, +0.003406f, -0.000189f, +0.001415f, +0.000460f, -0.000131f, +0.000602f, -0.000647f, +0.000032f, -0.000280f, + -0.000350f, +0.000549f, +0.001473f, +0.003878f, +0.003394f, -0.003227f, +0.002535f, +0.000703f, +0.001067f, +0.001161f, + -0.001574f, +0.001127f, -0.001481f, -0.002733f, -0.001410f, -0.000372f, -0.000104f, -0.001688f, +0.001109f, +0.000109f, + -0.000488f, -0.000188f, +0.000327f, -0.000070f, -0.000029f, +0.000235f, -0.000082f, -0.000040f, -0.000302f, +0.000061f, + -0.000059f, -0.000059f, +0.000290f, +0.000260f, +0.000220f, +0.000075f, -0.000085f, +0.000155f, -0.000253f, -0.000127f, + +0.000100f, +0.000179f, +0.000211f, -0.000042f, -0.000095f, +0.000202f, -0.000009f, -0.000234f, +0.000034f, -0.000061f, + -0.000153f, -0.000045f, +0.000198f, +0.000102f, -0.000056f, -0.000101f, -0.000031f, -0.000140f, -0.000112f, +0.000043f, + +0.000042f, +0.000002f, -0.000063f, -0.000059f, +0.000035f, +0.000148f, +0.000113f, -0.000009f, -0.000038f, -0.000028f, + -0.000068f, -0.000088f, -0.000060f, -0.000047f, -0.000027f, -0.000005f, +0.000003f, +0.000060f, -0.000072f, -0.000001f, + -0.000011f, +0.000001f, +0.000110f, +0.000032f, -0.000067f, +0.000073f + }, + { + -0.000745f, +0.004687f, -0.000722f, -0.002259f, -0.000243f, +0.003359f, +0.001124f, -0.000068f, +0.000109f, +0.001406f, + -0.000554f, -0.000034f, +0.000348f, -0.001558f, -0.000472f, +0.000271f, -0.001223f, +0.000166f, -0.000072f, +0.000037f, + +0.000342f, +0.000278f, +0.000154f, -0.000417f, +0.000895f, -0.000222f, -0.000080f, +0.000786f, +0.000524f, +0.000150f, + +0.000117f, -0.000171f, -0.000320f, -0.000069f, +0.000115f, -0.000023f, +0.000133f, +0.000077f, -0.000069f, +0.000184f, + +0.000561f, -0.000320f, +0.000303f, -0.000121f, -0.000277f, -0.000381f, -0.000094f, -0.000169f, +0.000148f, +0.000253f, + +0.000100f, -0.000317f, +0.000057f, +0.000137f, -0.000037f, -0.000207f, -0.000206f, +0.000060f, +0.000159f, -0.000077f, + +0.000130f, +0.000036f, +0.000054f, -0.000075f, -0.000105f, -0.000153f, -0.000114f, +0.000098f, +0.000027f, -0.000031f, + -0.000099f, +0.000082f, -0.000003f, -0.000006f, -0.000119f, -0.000060f, +0.000035f, +0.000074f, -0.000064f, -0.000112f, + -0.000060f, +0.000012f, -0.000055f, -0.000065f, +0.000008f, -0.000053f, -0.000061f, +0.000113f, +0.000042f, -0.000035f, + +0.000029f, +0.000003f, -0.000056f, -0.000026f, -0.000019f, +0.000008f + }, + { + +0.000181f, -0.002302f, -0.002060f, +0.000890f, -0.000125f, +0.000268f, +0.000116f, -0.001039f, -0.000533f, -0.000828f, + +0.000289f, -0.000199f, -0.000809f, +0.005600f, +0.001073f, +0.006005f, -0.000905f, +0.000935f, -0.000160f, -0.001104f, + -0.001014f, +0.000742f, -0.000829f, +0.000785f, +0.001354f, +0.001970f, -0.001995f, +0.000415f, -0.001058f, +0.000397f, + +0.000867f, +0.000341f, +0.000310f, +0.000740f, -0.001044f, +0.000110f, +0.001419f, +0.000485f, -0.000422f, +0.000037f, + -0.000026f, +0.000311f, +0.000301f, -0.000135f, -0.000161f, +0.000065f, -0.000324f, +0.000214f, +0.000308f, +0.000108f, + +0.000117f, -0.000010f, +0.000304f, +0.000123f, +0.000054f, -0.000157f, +0.000053f, +0.000120f, +0.000027f, +0.000183f, + +0.000216f, -0.000001f, -0.000118f, +0.000111f, -0.000008f, +0.000025f, -0.000195f, -0.000175f, +0.000097f, +0.000041f, + -0.000072f, -0.000042f, +0.000137f, -0.000036f, +0.000085f, +0.000002f, -0.000118f, +0.000034f, +0.000145f, +0.000089f, + +0.000010f, -0.000049f, -0.000089f, -0.000023f, +0.000028f, -0.000010f, +0.000025f, -0.000007f, -0.000061f, -0.000022f, + +0.000002f, -0.000031f, -0.000017f, +0.000033f, -0.000000f, -0.000017f + } + }, + { + { + +0.003834f, +0.023669f, -0.015645f, +0.002674f, -0.000110f, -0.000229f, +0.000646f, +0.000343f, -0.000514f, +0.000059f, + +0.000411f, -0.000502f, -0.000068f, +0.000721f, +0.001131f, -0.000986f, +0.000724f, -0.000210f, -0.000391f, -0.000085f, + -0.001776f, +0.000691f, -0.000499f, -0.000001f, +0.000159f, -0.000228f, -0.000064f, +0.000559f, +0.000471f, +0.000783f, + +0.000335f, +0.000442f, +0.000053f, +0.000516f, -0.000701f, +0.000275f, +0.000178f, -0.000081f, +0.000209f, -0.000021f, + -0.000224f, -0.000036f, -0.000090f, -0.000154f, +0.000001f, +0.000178f, -0.000079f, -0.000063f, -0.000049f, +0.000023f, + -0.000228f, -0.000139f, +0.000007f, -0.000039f, -0.000196f, +0.000018f, -0.000040f, -0.000059f, -0.000078f, +0.000117f, + +0.000122f, -0.000045f, -0.000122f, -0.000029f, +0.000117f, -0.000012f, +0.000182f, -0.000044f, -0.000105f, +0.000007f, + -0.000015f, +0.000046f, +0.000036f, -0.000034f, -0.000076f, -0.000066f, +0.000042f, -0.000035f, +0.000023f, +0.000095f, + +0.000071f, +0.000054f, -0.000035f, -0.000005f, -0.000041f, +0.000053f, +0.000031f, +0.000019f, +0.000044f, +0.000027f, + -0.000021f, +0.000011f, -0.000009f, -0.000027f, +0.000000f, +0.000027f + }, + { + +0.000040f, +0.009083f, -0.000873f, +0.002232f, +0.000135f, -0.000228f, +0.000306f, +0.000458f, +0.000098f, +0.000274f, + -0.000276f, +0.000451f, -0.000539f, +0.000279f, +0.002095f, -0.000992f, -0.000038f, -0.000498f, -0.001734f, -0.000229f, + -0.000641f, +0.000000f, -0.000863f, +0.000409f, +0.000370f, -0.000095f, +0.000695f, +0.000277f, +0.000438f, -0.000616f, + +0.000301f, -0.000153f, +0.000254f, +0.000098f, +0.000371f, -0.000094f, -0.000218f, +0.000005f, -0.000040f, -0.000647f, + +0.000095f, +0.000577f, +0.000098f, -0.000264f, +0.000293f, -0.000015f, +0.000066f, -0.000075f, -0.000093f, +0.000087f, + -0.000100f, +0.000182f, +0.000254f, +0.000288f, -0.000387f, -0.000123f, +0.000073f, -0.000187f, -0.000099f, +0.000050f, + +0.000074f, +0.000027f, -0.000063f, -0.000061f, +0.000146f, -0.000084f, +0.000139f, +0.000021f, -0.000067f, +0.000023f, + +0.000049f, -0.000048f, -0.000090f, -0.000014f, +0.000090f, -0.000082f, -0.000131f, -0.000015f, +0.000066f, +0.000072f, + -0.000039f, -0.000063f, +0.000066f, +0.000030f, +0.000026f, +0.000063f, +0.000001f, -0.000019f, +0.000061f, -0.000016f, + -0.000068f, +0.000004f, +0.000049f, +0.000044f, +0.000001f, -0.000041f + }, + { + +0.002107f, +0.006219f, -0.000434f, -0.001528f, +0.001965f, -0.000850f, +0.000531f, -0.000332f, -0.000033f, +0.000258f, + +0.000705f, -0.000551f, -0.000354f, +0.001268f, +0.001157f, +0.001743f, +0.000697f, +0.000084f, -0.000004f, +0.000209f, + +0.000197f, +0.000430f, -0.000346f, -0.000102f, +0.000210f, +0.000486f, -0.000101f, +0.000354f, -0.000091f, -0.000156f, + -0.000081f, -0.000194f, +0.000435f, +0.000012f, -0.000893f, +0.000145f, +0.000759f, -0.000374f, +0.000045f, -0.000151f, + -0.000077f, -0.000034f, +0.000129f, -0.000016f, +0.000149f, +0.000133f, +0.000140f, -0.000055f, +0.000212f, -0.000368f, + +0.000296f, +0.000181f, -0.000022f, +0.000046f, +0.000208f, +0.000010f, -0.000087f, -0.000153f, -0.000091f, +0.000077f, + -0.000060f, +0.000184f, +0.000001f, -0.000015f, -0.000069f, +0.000021f, -0.000048f, -0.000098f, +0.000182f, -0.000026f, + -0.000092f, -0.000005f, +0.000140f, -0.000103f, +0.000009f, -0.000010f, -0.000076f, +0.000123f, +0.000009f, -0.000046f, + +0.000064f, +0.000071f, -0.000010f, -0.000051f, +0.000024f, +0.000084f, +0.000024f, -0.000042f, -0.000039f, +0.000023f, + -0.000056f, -0.000060f, +0.000034f, -0.000022f, -0.000014f, +0.000025f + }, + { + +0.004476f, -0.045561f, -0.000410f, -0.001084f, +0.000912f, -0.000199f, -0.000031f, +0.000114f, -0.000016f, +0.000161f, + -0.000225f, -0.000089f, +0.001073f, -0.000682f, -0.000185f, -0.000167f, +0.000594f, -0.000756f, -0.000262f, +0.000005f, + -0.000480f, +0.000512f, +0.000240f, -0.000072f, +0.000206f, -0.000314f, +0.000124f, -0.000179f, +0.000396f, +0.000087f, + +0.000088f, -0.000090f, +0.000074f, -0.000151f, -0.000208f, +0.000141f, -0.000279f, -0.000028f, -0.000060f, +0.000500f, + -0.000000f, -0.000489f, +0.000333f, +0.000400f, +0.000201f, +0.000403f, +0.000048f, +0.000099f, -0.000018f, -0.000127f, + +0.000052f, -0.000156f, +0.000005f, +0.000203f, -0.000099f, -0.000073f, -0.000062f, +0.000016f, -0.000235f, -0.000095f, + +0.000104f, +0.000167f, -0.000020f, -0.000031f, +0.000111f, -0.000063f, +0.000113f, -0.000042f, +0.000063f, +0.000030f, + +0.000021f, -0.000152f, -0.000109f, +0.000105f, +0.000010f, +0.000055f, +0.000019f, +0.000010f, +0.000012f, +0.000066f, + +0.000063f, +0.000018f, -0.000062f, -0.000047f, +0.000012f, -0.000068f, +0.000022f, -0.000035f, -0.000064f, +0.000044f, + +0.000045f, -0.000006f, -0.000002f, +0.000018f, +0.000005f, -0.000036f + }, + { + -0.000333f, -0.008573f, +0.001489f, +0.000505f, +0.000094f, -0.000254f, +0.000365f, +0.000791f, +0.000344f, +0.000074f, + -0.000127f, +0.000162f, -0.000404f, +0.001432f, -0.002027f, -0.001978f, -0.002286f, +0.002440f, +0.000071f, +0.000764f, + -0.001390f, +0.000626f, -0.000472f, -0.000262f, -0.000256f, +0.001343f, -0.000268f, -0.000685f, -0.000042f, -0.000034f, + -0.000046f, +0.000738f, -0.000478f, +0.000910f, -0.000333f, +0.000576f, +0.000574f, +0.000032f, +0.000036f, -0.000199f, + -0.000102f, +0.000195f, +0.000171f, -0.000459f, +0.000017f, +0.000169f, +0.000047f, +0.000502f, -0.000398f, +0.000144f, + +0.000252f, -0.000098f, +0.000317f, -0.000075f, -0.000050f, -0.000053f, +0.000145f, +0.000175f, +0.000008f, -0.000001f, + +0.000022f, -0.000060f, -0.000096f, +0.000149f, +0.000217f, -0.000051f, -0.000011f, -0.000061f, -0.000001f, +0.000112f, + -0.000128f, -0.000111f, -0.000001f, +0.000012f, -0.000069f, +0.000075f, +0.000095f, +0.000065f, +0.000115f, +0.000008f, + +0.000060f, -0.000054f, -0.000097f, +0.000022f, +0.000016f, -0.000006f, +0.000049f, -0.000026f, -0.000015f, +0.000026f, + +0.000024f, +0.000053f, -0.000022f, -0.000045f, +0.000024f, +0.000046f + }, + { + +0.007490f, -0.040831f, +0.000939f, +0.003230f, -0.000553f, -0.000045f, +0.000215f, -0.000536f, -0.000465f, +0.001295f, + +0.000642f, -0.000595f, -0.000621f, +0.000138f, +0.000007f, -0.000761f, -0.000040f, +0.000751f, +0.000029f, +0.000181f, + +0.000227f, +0.000225f, -0.000620f, -0.000630f, +0.000089f, +0.000017f, -0.000021f, -0.000515f, -0.000729f, +0.000408f, + -0.000031f, -0.000047f, -0.000475f, +0.000072f, +0.000036f, +0.000038f, +0.000046f, +0.000054f, -0.000035f, +0.000243f, + +0.000253f, -0.000048f, -0.000212f, +0.000155f, -0.000005f, -0.000360f, -0.000115f, -0.000179f, +0.000009f, +0.000226f, + +0.000002f, +0.000072f, +0.000222f, +0.000133f, -0.000053f, +0.000172f, +0.000178f, -0.000015f, -0.000123f, -0.000097f, + -0.000131f, +0.000075f, +0.000143f, +0.000129f, -0.000030f, -0.000083f, +0.000085f, +0.000049f, -0.000011f, -0.000015f, + -0.000001f, +0.000058f, -0.000007f, +0.000020f, -0.000011f, +0.000065f, +0.000064f, -0.000043f, -0.000072f, +0.000034f, + -0.000040f, -0.000078f, -0.000116f, +0.000054f, +0.000034f, +0.000058f, +0.000004f, +0.000051f, -0.000050f, -0.000034f, + +0.000056f, +0.000008f, +0.000012f, -0.000060f, +0.000002f, +0.000032f + }, + { + -0.000214f, +0.003329f, +0.000076f, -0.000714f, -0.000055f, -0.000095f, +0.000336f, +0.000191f, +0.000203f, -0.000247f, + -0.000092f, +0.000020f, -0.000251f, -0.001705f, -0.000832f, -0.004133f, +0.002017f, +0.000026f, -0.001840f, -0.000363f, + +0.000655f, -0.000183f, +0.001230f, -0.002859f, -0.000509f, -0.000847f, -0.000078f, +0.001018f, -0.000122f, +0.001977f, + +0.000785f, +0.000356f, -0.001356f, +0.001030f, +0.000674f, -0.000348f, -0.000427f, +0.000106f, -0.000436f, +0.000543f, + -0.000067f, -0.000439f, -0.000032f, -0.000072f, -0.000012f, +0.000220f, +0.000132f, +0.000023f, -0.000021f, -0.000149f, + -0.000209f, -0.000012f, +0.000068f, -0.000017f, +0.000054f, +0.000067f, +0.000224f, +0.000042f, -0.000007f, +0.000095f, + -0.000047f, -0.000109f, +0.000027f, -0.000032f, -0.000128f, -0.000003f, +0.000082f, +0.000103f, -0.000079f, -0.000227f, + -0.000090f, +0.000137f, +0.000029f, -0.000022f, +0.000064f, +0.000003f, +0.000106f, +0.000098f, +0.000000f, -0.000028f, + +0.000042f, -0.000016f, +0.000013f, -0.000030f, +0.000007f, +0.000019f, -0.000055f, -0.000068f, -0.000056f, -0.000078f, + -0.000058f, -0.000024f, +0.000033f, -0.000008f, -0.000036f, +0.000011f + }, + { + +0.000543f, +0.060071f, -0.000578f, +0.001004f, +0.000581f, +0.000331f, -0.000157f, +0.000290f, -0.000114f, +0.000017f, + +0.000734f, -0.000870f, -0.000227f, +0.000467f, +0.000429f, -0.000654f, +0.000091f, -0.000210f, -0.000355f, +0.000157f, + +0.000071f, +0.000003f, +0.000261f, -0.000518f, -0.000987f, +0.000059f, -0.000442f, +0.000261f, -0.000458f, +0.000364f, + +0.000095f, -0.000026f, +0.000241f, +0.000299f, -0.000189f, +0.000350f, -0.000085f, +0.000197f, -0.000101f, -0.000149f, + -0.000090f, +0.000003f, +0.000078f, -0.000437f, +0.000395f, -0.000602f, -0.000130f, -0.000430f, +0.000066f, +0.000350f, + +0.000021f, -0.000093f, -0.000201f, -0.000113f, +0.000057f, +0.000084f, +0.000094f, +0.000078f, +0.000015f, -0.000028f, + -0.000134f, -0.000006f, +0.000102f, -0.000087f, -0.000126f, -0.000000f, -0.000021f, +0.000052f, -0.000004f, -0.000043f, + +0.000038f, +0.000020f, +0.000002f, +0.000214f, +0.000015f, -0.000096f, +0.000109f, +0.000030f, -0.000082f, +0.000035f, + +0.000032f, -0.000036f, -0.000024f, +0.000011f, +0.000003f, -0.000010f, +0.000038f, +0.000000f, +0.000027f, +0.000010f, + -0.000034f, -0.000017f, +0.000035f, +0.000034f, -0.000009f, -0.000028f + }, + { + -0.000251f, +0.003506f, +0.000668f, -0.001283f, +0.000182f, -0.000165f, -0.000165f, +0.000093f, +0.000342f, -0.000072f, + -0.000176f, -0.000184f, -0.000934f, +0.000314f, +0.004721f, -0.009431f, -0.001921f, +0.002022f, +0.000198f, -0.000270f, + -0.000087f, -0.001192f, -0.001358f, +0.002929f, +0.000536f, +0.001954f, +0.000380f, +0.000578f, +0.000661f, -0.000493f, + -0.000405f, +0.000119f, +0.000554f, +0.000088f, -0.000157f, -0.000342f, -0.000426f, -0.000041f, +0.000001f, +0.000140f, + +0.000543f, -0.000204f, -0.000291f, +0.000072f, +0.000263f, +0.000308f, +0.000069f, -0.000248f, +0.000263f, -0.000338f, + -0.000183f, -0.000250f, +0.000054f, -0.000076f, -0.000007f, +0.000004f, +0.000226f, +0.000233f, +0.000178f, -0.000124f, + -0.000112f, -0.000008f, +0.000018f, -0.000222f, -0.000084f, -0.000018f, -0.000133f, +0.000014f, +0.000014f, -0.000125f, + -0.000083f, -0.000048f, -0.000017f, +0.000178f, +0.000098f, -0.000008f, -0.000062f, +0.000050f, -0.000007f, +0.000008f, + -0.000013f, -0.000147f, -0.000054f, +0.000054f, +0.000009f, +0.000046f, +0.000108f, +0.000014f, -0.000042f, -0.000020f, + +0.000015f, +0.000009f, +0.000005f, +0.000044f, +0.000018f, +0.000034f + }, + { + +0.003674f, -0.003264f, -0.002687f, +0.001745f, +0.001205f, +0.001149f, -0.000019f, -0.000355f, -0.000162f, +0.000661f, + -0.000118f, +0.000271f, -0.000001f, -0.001335f, +0.001528f, -0.000952f, -0.000763f, +0.000537f, +0.000189f, -0.000263f, + +0.000338f, +0.000260f, +0.000246f, -0.000234f, +0.000256f, +0.000078f, -0.000621f, +0.000079f, +0.000582f, -0.000198f, + +0.000151f, -0.000356f, +0.000092f, +0.000358f, -0.000157f, -0.000461f, -0.000251f, +0.000283f, -0.000228f, -0.000086f, + +0.000591f, +0.000065f, -0.000122f, -0.000098f, +0.000316f, +0.000555f, -0.000312f, -0.000370f, +0.000175f, +0.000453f, + -0.000009f, -0.000000f, +0.000317f, -0.000153f, -0.000296f, +0.000071f, +0.000031f, -0.000194f, +0.000002f, -0.000027f, + -0.000070f, -0.000003f, +0.000029f, -0.000031f, -0.000075f, +0.000089f, -0.000008f, -0.000059f, +0.000056f, +0.000074f, + +0.000048f, +0.000003f, +0.000070f, -0.000019f, +0.000042f, +0.000016f, +0.000027f, -0.000088f, +0.000021f, -0.000036f, + -0.000088f, +0.000001f, +0.000080f, +0.000000f, +0.000063f, +0.000103f, +0.000054f, +0.000026f, +0.000067f, +0.000012f, + +0.000001f, -0.000034f, -0.000041f, +0.000011f, +0.000036f, +0.000045f + }, + { + +0.000315f, -0.000592f, +0.001192f, -0.002107f, +0.000222f, +0.000041f, -0.000465f, +0.000555f, +0.000531f, +0.000518f, + +0.000157f, +0.000214f, +0.000042f, +0.000277f, +0.001102f, -0.000279f, -0.000483f, +0.000209f, +0.001130f, -0.001082f, + -0.000875f, +0.000838f, -0.000004f, -0.000627f, +0.000236f, +0.000845f, -0.001382f, -0.000358f, -0.000312f, -0.000810f, + +0.000267f, +0.000267f, -0.000025f, -0.000106f, +0.000138f, -0.000008f, -0.000381f, -0.000024f, -0.000016f, -0.000055f, + -0.000135f, -0.000211f, -0.000011f, +0.000018f, -0.000246f, +0.000115f, +0.000038f, -0.000010f, +0.000169f, +0.000191f, + +0.000179f, -0.000038f, -0.000115f, -0.000075f, -0.000059f, -0.000125f, -0.000010f, +0.000105f, +0.000040f, -0.000093f, + +0.000289f, -0.000074f, -0.000234f, -0.000048f, +0.000192f, -0.000007f, +0.000075f, +0.000139f, -0.000013f, -0.000059f, + -0.000067f, -0.000039f, +0.000042f, +0.000062f, +0.000022f, -0.000099f, -0.000064f, -0.000120f, +0.000035f, +0.000041f, + -0.000019f, +0.000086f, +0.000039f, -0.000117f, -0.000064f, +0.000019f, -0.000034f, -0.000011f, -0.000028f, -0.000050f, + +0.000020f, -0.000024f, -0.000003f, +0.000006f, +0.000050f, -0.000029f + }, + { + +0.002271f, +0.001456f, -0.001568f, +0.001012f, +0.000949f, +0.000941f, -0.001093f, -0.000308f, +0.000467f, +0.000303f, + -0.000456f, -0.000606f, +0.000141f, +0.000333f, +0.000797f, +0.000171f, +0.000968f, -0.000666f, +0.000184f, -0.000321f, + +0.000226f, +0.000500f, +0.000283f, -0.000375f, +0.000464f, -0.000064f, +0.000173f, -0.000145f, -0.000264f, -0.000005f, + -0.000049f, -0.000143f, -0.000423f, +0.000158f, +0.000144f, -0.000111f, -0.000507f, -0.000127f, +0.000192f, -0.000047f, + -0.000017f, -0.000003f, +0.000186f, +0.000261f, -0.000256f, -0.000254f, +0.000007f, +0.000148f, +0.000013f, +0.000122f, + +0.000124f, +0.000142f, +0.000174f, -0.000095f, -0.000059f, +0.000052f, +0.000011f, +0.000009f, -0.000198f, -0.000007f, + +0.000133f, -0.000023f, -0.000006f, +0.000142f, -0.000002f, -0.000111f, -0.000012f, -0.000037f, -0.000042f, +0.000126f, + -0.000019f, -0.000050f, +0.000051f, +0.000012f, +0.000048f, +0.000023f, -0.000027f, -0.000053f, -0.000018f, +0.000014f, + +0.000036f, +0.000089f, -0.000006f, -0.000024f, +0.000042f, -0.000049f, -0.000018f, +0.000023f, -0.000024f, +0.000034f, + +0.000044f, +0.000038f, +0.000030f, -0.000031f, -0.000013f, +0.000022f + }, + { + +0.000131f, +0.003242f, -0.000372f, +0.001961f, +0.000384f, +0.000088f, +0.000521f, -0.000486f, +0.000431f, +0.000161f, + +0.000181f, +0.000724f, -0.000569f, -0.001138f, +0.002130f, -0.003804f, +0.001911f, -0.000383f, +0.000347f, +0.000923f, + -0.003070f, +0.003982f, +0.001203f, -0.000775f, -0.000217f, +0.000183f, +0.000219f, -0.001111f, +0.000586f, +0.001379f, + -0.000010f, -0.000167f, -0.000016f, +0.000080f, +0.000057f, +0.000184f, -0.000019f, -0.000211f, +0.000048f, +0.000156f, + -0.000118f, -0.000241f, -0.000046f, -0.000078f, +0.000018f, -0.000153f, +0.000078f, +0.000322f, -0.000264f, -0.000175f, + +0.000188f, +0.000282f, +0.000041f, -0.000097f, +0.000101f, +0.000154f, -0.000140f, -0.000120f, +0.000035f, -0.000132f, + -0.000059f, +0.000085f, +0.000061f, -0.000060f, -0.000070f, +0.000028f, +0.000008f, -0.000140f, +0.000043f, +0.000010f, + +0.000018f, -0.000039f, +0.000008f, +0.000012f, +0.000093f, +0.000100f, +0.000087f, -0.000047f, -0.000034f, +0.000035f, + -0.000089f, -0.000101f, -0.000060f, -0.000053f, -0.000009f, -0.000015f, +0.000063f, +0.000016f, -0.000038f, -0.000013f, + -0.000029f, +0.000065f, +0.000103f, -0.000037f, -0.000010f, +0.000072f + }, + { + +0.000033f, +0.003020f, -0.000850f, -0.000133f, -0.000539f, +0.000010f, -0.002186f, +0.000129f, -0.000348f, +0.000263f, + -0.000001f, +0.000766f, -0.000766f, +0.000894f, +0.003318f, -0.000223f, -0.000621f, +0.000350f, -0.000592f, -0.000127f, + +0.000099f, +0.000424f, +0.000109f, +0.000227f, +0.001040f, +0.000066f, +0.000029f, +0.000438f, +0.000415f, -0.000347f, + -0.000100f, +0.000005f, -0.000064f, -0.000179f, +0.000118f, +0.000086f, -0.000209f, -0.000387f, -0.000169f, +0.000115f, + +0.000375f, -0.000067f, +0.000081f, -0.000428f, -0.000285f, -0.000337f, -0.000096f, -0.000084f, +0.000033f, +0.000400f, + -0.000143f, -0.000170f, +0.000151f, -0.000030f, -0.000135f, -0.000189f, -0.000087f, +0.000213f, -0.000031f, -0.000050f, + -0.000017f, -0.000057f, +0.000044f, -0.000136f, -0.000050f, -0.000147f, -0.000028f, +0.000063f, +0.000029f, -0.000130f, + -0.000006f, +0.000021f, +0.000004f, -0.000017f, -0.000093f, -0.000052f, +0.000088f, +0.000018f, -0.000103f, -0.000051f, + +0.000005f, -0.000012f, -0.000103f, -0.000032f, -0.000001f, -0.000048f, +0.000044f, +0.000108f, -0.000017f, -0.000013f, + +0.000030f, -0.000036f, -0.000044f, -0.000012f, +0.000038f, +0.000013f + }, + { + +0.000153f, -0.002199f, -0.000846f, +0.000949f, -0.000600f, -0.000029f, -0.000124f, -0.000099f, +0.000312f, -0.000598f, + +0.000823f, +0.000521f, -0.000396f, -0.001223f, -0.010002f, +0.001140f, -0.003152f, -0.000037f, +0.000088f, -0.000013f, + -0.000809f, +0.001883f, +0.000688f, -0.000400f, -0.000433f, +0.001519f, -0.001220f, +0.001985f, -0.000702f, +0.000214f, + +0.000516f, -0.000142f, -0.000295f, +0.000611f, -0.000936f, +0.000615f, +0.001055f, -0.000258f, +0.000026f, +0.000364f, + +0.000074f, +0.000157f, -0.000074f, -0.000560f, +0.000058f, +0.000160f, -0.000401f, +0.000083f, +0.000118f, +0.000031f, + +0.000161f, +0.000066f, +0.000198f, -0.000148f, +0.000019f, -0.000033f, -0.000009f, +0.000011f, +0.000084f, +0.000230f, + +0.000080f, -0.000014f, +0.000022f, +0.000164f, -0.000011f, -0.000020f, -0.000154f, +0.000044f, +0.000080f, +0.000022f, + -0.000129f, +0.000055f, +0.000112f, -0.000075f, +0.000103f, -0.000121f, -0.000004f, +0.000032f, +0.000076f, +0.000004f, + -0.000060f, -0.000044f, -0.000086f, +0.000073f, +0.000022f, +0.000004f, +0.000022f, -0.000022f, -0.000073f, +0.000005f, + +0.000006f, -0.000034f, +0.000008f, +0.000049f, -0.000024f, -0.000039f + } + }, + { + { + -0.001288f, +0.008067f, -0.001642f, -0.000189f, +0.000856f, +0.000588f, +0.000401f, -0.000094f, -0.000052f, -0.000865f, + -0.000655f, +0.000863f, +0.000267f, +0.000255f, +0.001226f, -0.000131f, +0.000121f, +0.000312f, -0.000613f, -0.001533f, + -0.000298f, +0.000261f, +0.000197f, -0.000568f, -0.000007f, +0.000112f, +0.000493f, +0.000345f, +0.000089f, +0.000797f, + +0.000207f, +0.000223f, -0.000280f, -0.000037f, +0.000231f, +0.000093f, +0.000028f, -0.000793f, -0.000077f, +0.000176f, + -0.000222f, +0.000050f, -0.000014f, +0.000006f, -0.000232f, -0.000254f, +0.000087f, +0.000232f, -0.000120f, -0.000211f, + -0.000370f, -0.000171f, +0.000043f, +0.000138f, -0.000014f, +0.000142f, +0.000194f, +0.000249f, +0.000113f, -0.000055f, + -0.000054f, +0.000032f, +0.000087f, +0.000086f, +0.000089f, +0.000054f, -0.000002f, -0.000122f, +0.000008f, +0.000132f, + +0.000070f, -0.000008f, -0.000039f, -0.000049f, +0.000074f, +0.000123f, -0.000086f, -0.000029f, +0.000010f, -0.000098f, + -0.000063f, -0.000097f, +0.000004f, -0.000027f, +0.000014f, +0.000023f, -0.000063f, +0.000020f, -0.000042f, -0.000033f, + -0.000008f, +0.000017f, -0.000003f, +0.000001f, +0.000007f, -0.000002f + }, + { + -0.000091f, +0.005865f, +0.001140f, -0.000560f, -0.000013f, +0.000543f, +0.000403f, -0.000195f, -0.000072f, +0.000375f, + +0.000131f, +0.000286f, +0.000087f, -0.000658f, +0.002267f, +0.002932f, +0.000336f, -0.000192f, +0.000318f, -0.001403f, + -0.000084f, -0.000062f, -0.000751f, +0.001221f, +0.001376f, -0.001235f, -0.000104f, -0.000300f, +0.000330f, +0.000203f, + -0.000369f, -0.000056f, -0.000299f, +0.000277f, +0.000242f, -0.000520f, -0.000390f, -0.000065f, -0.000118f, +0.000011f, + -0.000331f, +0.000128f, -0.000168f, -0.000011f, +0.000105f, -0.000092f, -0.000194f, +0.000029f, +0.000121f, -0.000289f, + +0.000108f, +0.000091f, -0.000165f, -0.000225f, +0.000155f, +0.000402f, -0.000080f, -0.000104f, +0.000050f, +0.000034f, + -0.000287f, -0.000108f, -0.000076f, -0.000023f, +0.000020f, +0.000055f, -0.000050f, -0.000171f, +0.000009f, +0.000021f, + +0.000008f, -0.000076f, +0.000151f, +0.000012f, -0.000034f, -0.000057f, +0.000089f, +0.000082f, +0.000018f, -0.000128f, + -0.000021f, +0.000122f, +0.000019f, -0.000016f, -0.000021f, -0.000049f, -0.000030f, +0.000019f, -0.000048f, -0.000056f, + +0.000069f, +0.000010f, -0.000051f, -0.000085f, -0.000028f, +0.000039f + }, + { + -0.001903f, +0.004573f, +0.007430f, -0.001277f, -0.002557f, +0.000036f, -0.000053f, -0.000293f, +0.000674f, +0.000545f, + -0.000242f, -0.000350f, +0.000603f, +0.000871f, +0.001323f, +0.001125f, +0.000272f, -0.000061f, +0.000992f, -0.000210f, + +0.000768f, +0.000680f, -0.000468f, +0.000093f, -0.000001f, -0.000541f, -0.000508f, +0.000211f, +0.000281f, +0.000038f, + +0.000138f, +0.000362f, -0.000021f, -0.000380f, +0.000137f, +0.000405f, -0.000118f, +0.000304f, +0.000188f, +0.000027f, + +0.000307f, -0.000164f, +0.000167f, -0.000429f, -0.000209f, -0.000105f, +0.000097f, -0.000025f, -0.000018f, +0.000116f, + +0.000238f, -0.000165f, -0.000167f, +0.000194f, -0.000075f, -0.000079f, -0.000005f, -0.000182f, +0.000155f, -0.000023f, + -0.000092f, -0.000029f, -0.000068f, +0.000032f, +0.000072f, -0.000208f, -0.000088f, +0.000025f, -0.000021f, -0.000101f, + +0.000101f, -0.000027f, -0.000079f, -0.000012f, +0.000037f, +0.000107f, +0.000096f, -0.000040f, -0.000092f, +0.000034f, + +0.000047f, -0.000013f, -0.000009f, +0.000047f, -0.000024f, -0.000032f, -0.000038f, +0.000004f, +0.000031f, -0.000043f, + +0.000010f, +0.000065f, +0.000029f, -0.000010f, +0.000046f, -0.000002f + }, + { + -0.011697f, -0.025372f, +0.002191f, -0.000662f, -0.001015f, -0.000075f, -0.000228f, -0.000145f, -0.000269f, +0.000104f, + +0.000574f, +0.000384f, +0.000416f, +0.000379f, +0.000349f, +0.000278f, -0.000064f, -0.000343f, +0.000338f, -0.000181f, + +0.000032f, -0.000309f, -0.000029f, +0.000184f, +0.000252f, +0.000249f, -0.000248f, +0.000053f, +0.000001f, -0.000566f, + +0.000013f, -0.000257f, -0.000189f, +0.000229f, -0.000190f, -0.000457f, -0.000035f, -0.000189f, +0.000440f, +0.000018f, + -0.000108f, +0.000132f, +0.000152f, +0.000199f, +0.000325f, +0.000068f, -0.000219f, +0.000075f, +0.000005f, -0.000038f, + -0.000157f, +0.000100f, +0.000042f, -0.000125f, +0.000054f, -0.000279f, -0.000083f, -0.000026f, -0.000105f, +0.000071f, + +0.000001f, -0.000146f, +0.000002f, -0.000053f, -0.000120f, +0.000029f, -0.000058f, -0.000021f, +0.000103f, -0.000086f, + -0.000095f, +0.000122f, +0.000174f, -0.000012f, +0.000052f, +0.000004f, -0.000020f, +0.000044f, -0.000032f, -0.000033f, + -0.000069f, -0.000065f, -0.000017f, +0.000027f, -0.000003f, +0.000037f, -0.000031f, -0.000006f, +0.000058f, -0.000009f, + -0.000050f, -0.000008f, +0.000024f, -0.000017f, -0.000033f, -0.000011f + }, + { + +0.000344f, -0.003897f, -0.001151f, +0.000045f, -0.000309f, +0.000325f, +0.000118f, +0.000254f, +0.000290f, -0.000710f, + +0.000269f, +0.000146f, -0.000049f, -0.003216f, +0.002804f, +0.000772f, +0.001600f, -0.000258f, -0.004097f, +0.001165f, + +0.000157f, +0.000185f, -0.000509f, +0.000160f, +0.000354f, +0.001957f, +0.000359f, -0.000193f, +0.000466f, -0.001977f, + +0.000533f, -0.000292f, +0.000228f, -0.000264f, -0.000123f, +0.001046f, -0.000103f, -0.000191f, +0.000075f, -0.000500f, + +0.000083f, +0.000039f, -0.000524f, -0.000457f, +0.000116f, -0.000215f, +0.000263f, +0.000133f, -0.000273f, -0.000100f, + -0.000118f, +0.000259f, +0.000142f, -0.000055f, +0.000075f, +0.000194f, -0.000128f, -0.000014f, +0.000124f, -0.000079f, + -0.000162f, -0.000072f, +0.000014f, -0.000046f, -0.000124f, -0.000187f, -0.000128f, -0.000059f, +0.000137f, -0.000031f, + -0.000027f, +0.000096f, -0.000009f, +0.000108f, +0.000093f, -0.000011f, -0.000079f, -0.000021f, -0.000066f, -0.000103f, + -0.000081f, -0.000008f, +0.000097f, -0.000007f, -0.000035f, +0.000008f, -0.000028f, +0.000011f, +0.000018f, -0.000015f, + -0.000004f, -0.000033f, -0.000009f, +0.000044f, +0.000016f, -0.000071f + }, + { + -0.014917f, -0.011895f, +0.004041f, +0.001193f, +0.001898f, +0.000180f, -0.000508f, -0.000849f, +0.000784f, -0.000168f, + -0.001053f, +0.000002f, +0.000151f, +0.000291f, -0.000585f, -0.000190f, +0.000377f, -0.000167f, -0.000027f, +0.000264f, + -0.000443f, -0.000539f, +0.000166f, -0.000270f, -0.000057f, -0.000120f, +0.000240f, -0.000446f, -0.000042f, -0.000250f, + -0.000061f, +0.000298f, +0.000050f, +0.000006f, -0.000151f, -0.000078f, +0.000363f, -0.000053f, +0.000239f, -0.000090f, + +0.000017f, -0.000298f, +0.000176f, +0.000230f, -0.000574f, +0.000153f, +0.000136f, +0.000002f, +0.000081f, -0.000053f, + +0.000195f, +0.000247f, +0.000024f, -0.000367f, +0.000012f, +0.000144f, -0.000171f, -0.000190f, -0.000014f, +0.000025f, + -0.000018f, -0.000052f, -0.000152f, -0.000025f, +0.000047f, +0.000029f, +0.000017f, -0.000072f, +0.000122f, -0.000043f, + -0.000060f, -0.000094f, +0.000050f, +0.000083f, +0.000002f, +0.000072f, -0.000084f, -0.000013f, +0.000054f, +0.000044f, + -0.000012f, +0.000044f, +0.000146f, +0.000104f, -0.000051f, -0.000067f, -0.000021f, -0.000045f, -0.000047f, +0.000069f, + -0.000017f, -0.000001f, -0.000025f, +0.000017f, +0.000054f, -0.000006f + }, + { + +0.000504f, -0.000179f, -0.001035f, +0.000691f, -0.000151f, +0.000137f, -0.000059f, -0.000123f, -0.000050f, +0.000314f, + -0.000209f, -0.000075f, +0.000006f, -0.001204f, +0.000841f, +0.001086f, +0.000526f, -0.000268f, -0.000826f, +0.000335f, + +0.000637f, +0.000953f, -0.001786f, -0.002082f, -0.000058f, -0.000329f, -0.000132f, +0.000638f, +0.000817f, +0.001250f, + +0.000493f, -0.000153f, +0.000425f, +0.000398f, -0.000580f, -0.000102f, -0.000290f, +0.000026f, -0.000058f, -0.000075f, + -0.000365f, -0.000106f, +0.000085f, +0.000202f, +0.000129f, -0.000243f, -0.000143f, +0.000122f, -0.000056f, +0.000108f, + -0.000067f, +0.000027f, -0.000160f, -0.000151f, +0.000060f, +0.000024f, -0.000065f, +0.000004f, +0.000235f, +0.000117f, + +0.000130f, +0.000105f, +0.000030f, +0.000002f, -0.000022f, +0.000088f, -0.000011f, -0.000187f, -0.000127f, +0.000080f, + +0.000146f, -0.000124f, -0.000113f, -0.000047f, -0.000063f, -0.000098f, -0.000018f, -0.000089f, -0.000071f, +0.000003f, + +0.000037f, -0.000025f, -0.000008f, +0.000019f, -0.000003f, -0.000036f, -0.000005f, +0.000037f, -0.000024f, +0.000061f, + +0.000083f, +0.000068f, +0.000008f, -0.000029f, +0.000029f, -0.000005f + }, + { + +0.007129f, +0.053807f, +0.002005f, +0.000088f, +0.000057f, -0.000027f, +0.000461f, +0.000683f, -0.000023f, -0.000270f, + -0.000297f, +0.000055f, +0.000767f, -0.000257f, -0.000529f, -0.000046f, -0.000161f, +0.000401f, +0.000840f, -0.000844f, + -0.000235f, +0.000165f, -0.000268f, -0.000907f, -0.000056f, -0.000098f, -0.000392f, -0.000024f, -0.000162f, -0.000148f, + -0.000027f, +0.000511f, +0.000347f, -0.000398f, -0.000057f, -0.000326f, -0.000349f, +0.000270f, -0.000524f, -0.000130f, + +0.000137f, +0.000074f, -0.000031f, -0.000012f, +0.000124f, -0.000357f, -0.000043f, +0.000031f, +0.000033f, -0.000174f, + -0.000100f, -0.000108f, +0.000344f, +0.000216f, -0.000123f, -0.000187f, -0.000056f, -0.000041f, -0.000048f, +0.000099f, + +0.000001f, -0.000001f, -0.000029f, -0.000212f, -0.000030f, +0.000071f, +0.000026f, -0.000023f, +0.000046f, +0.000104f, + -0.000046f, +0.000009f, +0.000020f, -0.000090f, -0.000158f, +0.000095f, +0.000015f, -0.000160f, +0.000017f, +0.000015f, + -0.000053f, +0.000053f, +0.000031f, +0.000003f, +0.000011f, +0.000043f, -0.000036f, -0.000084f, +0.000014f, -0.000020f, + +0.000004f, +0.000012f, -0.000049f, -0.000028f, -0.000036f, +0.000016f + }, + { + +0.000839f, +0.000567f, -0.004115f, -0.000078f, -0.000255f, +0.000162f, +0.000039f, +0.000020f, -0.000321f, -0.000018f, + +0.000243f, +0.000339f, +0.000228f, -0.000429f, +0.002075f, -0.007453f, -0.001816f, +0.001886f, +0.000518f, -0.000600f, + -0.001949f, +0.001135f, +0.000191f, +0.001077f, -0.000672f, +0.002471f, +0.001029f, -0.000921f, +0.000772f, -0.000417f, + -0.000102f, +0.000489f, -0.000054f, +0.000669f, -0.000659f, -0.000799f, +0.000290f, -0.000046f, +0.000061f, +0.000303f, + -0.000200f, -0.000352f, -0.000105f, -0.000395f, -0.000216f, -0.000095f, +0.000059f, -0.000004f, -0.000138f, -0.000068f, + -0.000091f, -0.000014f, +0.000094f, -0.000243f, -0.000240f, +0.000167f, +0.000140f, -0.000128f, -0.000061f, -0.000071f, + +0.000181f, +0.000183f, +0.000213f, +0.000084f, +0.000187f, +0.000149f, +0.000058f, +0.000050f, -0.000155f, -0.000017f, + +0.000022f, +0.000089f, +0.000102f, +0.000036f, -0.000125f, -0.000044f, +0.000031f, +0.000004f, +0.000033f, -0.000001f, + -0.000048f, +0.000047f, +0.000105f, -0.000002f, +0.000008f, -0.000021f, -0.000084f, -0.000112f, -0.000008f, +0.000030f, + -0.000011f, +0.000004f, +0.000038f, -0.000014f, -0.000001f, -0.000045f + }, + { + -0.002017f, +0.002137f, +0.000624f, +0.001806f, -0.000456f, +0.000138f, +0.000692f, +0.000440f, -0.000272f, -0.000303f, + -0.000815f, -0.000573f, -0.000425f, +0.000546f, -0.000027f, -0.000072f, +0.000240f, -0.000875f, -0.000272f, +0.000571f, + +0.000583f, +0.000022f, +0.000060f, -0.000220f, -0.000319f, +0.000240f, +0.000054f, -0.000148f, +0.000113f, -0.000059f, + -0.000304f, -0.000170f, -0.000078f, -0.000766f, -0.000562f, +0.000186f, +0.000202f, +0.000025f, +0.000038f, +0.000063f, + -0.000096f, -0.000167f, -0.000101f, +0.000419f, +0.000143f, -0.000445f, -0.000235f, -0.000005f, +0.000034f, -0.000203f, + -0.000214f, -0.000093f, -0.000205f, -0.000200f, +0.000256f, -0.000050f, -0.000139f, +0.000058f, -0.000039f, +0.000042f, + +0.000155f, -0.000171f, -0.000058f, -0.000058f, +0.000021f, +0.000015f, -0.000040f, +0.000022f, +0.000004f, -0.000089f, + +0.000024f, +0.000054f, +0.000007f, -0.000071f, +0.000009f, -0.000001f, -0.000008f, -0.000031f, +0.000062f, -0.000031f, + +0.000066f, +0.000044f, -0.000024f, -0.000053f, -0.000014f, -0.000092f, -0.000091f, -0.000020f, -0.000049f, -0.000031f, + -0.000011f, -0.000002f, +0.000073f, +0.000018f, -0.000030f, -0.000050f + }, + { + -0.000460f, +0.002836f, +0.000668f, -0.001949f, -0.000435f, -0.000329f, -0.000492f, +0.000625f, +0.000011f, +0.000346f, + -0.000841f, +0.000178f, +0.001154f, -0.000415f, +0.001038f, -0.000241f, +0.000659f, +0.001367f, -0.000801f, -0.000472f, + +0.001555f, +0.000635f, -0.000408f, -0.000933f, +0.000319f, -0.000305f, -0.000906f, -0.000019f, -0.000266f, +0.000343f, + +0.000436f, +0.000271f, -0.000126f, +0.000154f, -0.000283f, -0.000160f, +0.000398f, +0.000171f, +0.000261f, +0.000140f, + -0.000131f, -0.000133f, -0.000271f, -0.000110f, -0.000043f, -0.000138f, +0.000088f, +0.000057f, -0.000060f, +0.000031f, + -0.000172f, -0.000105f, +0.000206f, +0.000301f, +0.000114f, -0.000046f, +0.000024f, -0.000058f, -0.000125f, +0.000035f, + -0.000060f, -0.000144f, +0.000087f, +0.000074f, -0.000087f, -0.000094f, +0.000041f, -0.000150f, -0.000116f, -0.000016f, + -0.000042f, +0.000089f, +0.000090f, -0.000012f, -0.000063f, -0.000015f, +0.000051f, +0.000146f, +0.000078f, -0.000049f, + +0.000048f, -0.000025f, -0.000056f, +0.000053f, +0.000083f, -0.000000f, +0.000023f, +0.000018f, +0.000024f, +0.000069f, + -0.000009f, -0.000008f, -0.000006f, +0.000001f, +0.000008f, -0.000027f + }, + { + +0.000002f, +0.006185f, -0.001083f, +0.002816f, -0.001363f, -0.000837f, +0.001237f, +0.000324f, +0.000616f, -0.000273f, + +0.000370f, +0.000883f, +0.000094f, +0.000888f, +0.000677f, +0.000820f, +0.000532f, -0.000380f, +0.000040f, -0.000462f, + +0.000549f, -0.000183f, -0.000172f, +0.000183f, +0.000001f, -0.000082f, +0.000208f, -0.000544f, -0.000052f, +0.000235f, + -0.000035f, +0.000004f, +0.000253f, +0.000660f, -0.000465f, +0.000246f, +0.000459f, +0.000430f, +0.000197f, -0.000059f, + -0.000074f, -0.000023f, +0.000222f, -0.000303f, -0.000131f, -0.000147f, +0.000060f, +0.000049f, -0.000033f, -0.000022f, + -0.000027f, -0.000044f, -0.000079f, -0.000064f, +0.000115f, -0.000055f, +0.000049f, +0.000008f, +0.000079f, +0.000093f, + -0.000121f, +0.000082f, +0.000079f, -0.000092f, -0.000037f, +0.000081f, +0.000070f, +0.000074f, +0.000070f, -0.000061f, + -0.000067f, +0.000041f, -0.000023f, -0.000038f, -0.000050f, -0.000006f, +0.000039f, -0.000014f, +0.000035f, +0.000035f, + +0.000025f, -0.000019f, -0.000091f, +0.000009f, -0.000056f, -0.000010f, +0.000064f, -0.000031f, +0.000022f, -0.000007f, + -0.000060f, -0.000034f, -0.000087f, +0.000003f, +0.000022f, -0.000013f + }, + { + -0.000175f, +0.002247f, +0.002029f, +0.000382f, +0.000174f, -0.000094f, +0.000220f, +0.000263f, +0.000191f, -0.000123f, + +0.000333f, +0.000273f, -0.001723f, +0.001458f, -0.004173f, -0.002438f, +0.001322f, +0.000306f, -0.000053f, -0.000728f, + +0.001411f, +0.001795f, -0.000989f, +0.000017f, +0.000474f, -0.000407f, -0.000749f, +0.000670f, -0.000682f, +0.000242f, + +0.000643f, +0.000727f, +0.000105f, +0.000394f, +0.000032f, +0.000599f, -0.000092f, -0.000311f, -0.000264f, -0.000208f, + -0.000094f, -0.000217f, -0.000055f, -0.000219f, +0.000034f, -0.000109f, -0.000213f, -0.000181f, +0.000120f, -0.000147f, + -0.000157f, -0.000204f, -0.000083f, +0.000079f, -0.000040f, -0.000115f, -0.000093f, +0.000227f, -0.000047f, +0.000134f, + +0.000346f, -0.000063f, -0.000316f, -0.000164f, -0.000019f, +0.000095f, -0.000019f, +0.000076f, +0.000053f, -0.000050f, + -0.000026f, -0.000013f, +0.000033f, +0.000043f, -0.000014f, -0.000147f, -0.000086f, -0.000003f, +0.000022f, +0.000008f, + +0.000046f, +0.000098f, +0.000032f, +0.000051f, +0.000033f, +0.000010f, -0.000005f, -0.000067f, +0.000038f, +0.000013f, + +0.000033f, -0.000002f, -0.000118f, -0.000008f, +0.000040f, -0.000070f + }, + { + -0.000296f, +0.003607f, -0.000508f, +0.001151f, +0.000540f, -0.002325f, +0.000304f, -0.000078f, -0.000938f, -0.000351f, + +0.000606f, -0.000457f, -0.000642f, +0.000473f, +0.004104f, -0.000376f, +0.001059f, +0.000676f, -0.000711f, -0.000028f, + +0.000061f, -0.000019f, -0.000113f, +0.000255f, +0.000331f, +0.000297f, -0.000320f, -0.000369f, -0.000064f, -0.000421f, + +0.000029f, +0.000230f, +0.000473f, +0.000515f, +0.000187f, +0.000106f, +0.000051f, -0.000021f, +0.000394f, -0.000537f, + -0.000089f, -0.000252f, -0.000246f, -0.000058f, +0.000284f, +0.000280f, +0.000304f, +0.000008f, +0.000030f, -0.000090f, + -0.000081f, +0.000231f, -0.000193f, -0.000128f, +0.000098f, +0.000243f, +0.000169f, +0.000033f, -0.000081f, +0.000044f, + -0.000046f, +0.000074f, +0.000055f, +0.000094f, +0.000135f, +0.000140f, +0.000069f, -0.000057f, +0.000004f, -0.000049f, + -0.000013f, -0.000067f, -0.000015f, -0.000034f, +0.000093f, +0.000068f, -0.000001f, -0.000085f, +0.000087f, +0.000122f, + +0.000024f, -0.000014f, +0.000083f, +0.000083f, -0.000034f, +0.000061f, +0.000052f, -0.000101f, -0.000024f, +0.000039f, + -0.000032f, -0.000001f, +0.000038f, +0.000008f, +0.000006f, -0.000007f + }, + { + -0.000401f, -0.001414f, +0.001091f, +0.000023f, -0.000093f, -0.000094f, -0.000415f, +0.000827f, +0.000063f, +0.000229f, + +0.000296f, +0.000641f, +0.001577f, -0.007383f, -0.008309f, -0.004822f, +0.000596f, -0.000059f, -0.000172f, +0.001138f, + +0.000870f, +0.000710f, +0.000971f, -0.000940f, -0.000677f, +0.000501f, +0.000133f, +0.002456f, -0.000732f, +0.000223f, + -0.000637f, -0.000217f, +0.000142f, +0.000052f, -0.000037f, +0.000906f, -0.000867f, -0.000117f, +0.000675f, +0.000003f, + -0.000414f, -0.000333f, -0.000504f, -0.000086f, +0.000156f, -0.000081f, +0.000038f, -0.000082f, +0.000035f, +0.000039f, + -0.000004f, -0.000077f, -0.000370f, -0.000126f, +0.000007f, +0.000172f, -0.000279f, -0.000056f, -0.000136f, -0.000314f, + -0.000173f, +0.000059f, +0.000102f, -0.000033f, -0.000043f, -0.000101f, +0.000243f, +0.000173f, -0.000160f, -0.000049f, + -0.000012f, +0.000009f, -0.000183f, -0.000051f, -0.000085f, -0.000037f, +0.000146f, -0.000083f, -0.000064f, -0.000091f, + +0.000044f, +0.000089f, +0.000090f, +0.000036f, -0.000085f, +0.000017f, -0.000056f, -0.000017f, +0.000046f, +0.000018f, + -0.000015f, +0.000030f, +0.000015f, -0.000035f, -0.000003f, +0.000018f + } + }, + { + { + +0.002899f, +0.013833f, +0.006638f, -0.000390f, -0.000640f, +0.000339f, +0.000088f, -0.000143f, +0.000050f, -0.000879f, + -0.000157f, +0.000966f, -0.000019f, -0.000309f, +0.000119f, -0.000043f, -0.000653f, -0.000027f, +0.000061f, -0.000673f, + +0.000476f, +0.000156f, +0.000249f, -0.000676f, -0.000119f, -0.000089f, -0.000026f, -0.000145f, +0.000036f, +0.000645f, + -0.000041f, -0.000247f, -0.000673f, -0.000355f, +0.000523f, -0.000188f, -0.000085f, -0.000669f, -0.000068f, +0.000054f, + -0.000024f, +0.000240f, -0.000153f, -0.000101f, -0.000309f, -0.000210f, +0.000075f, +0.000239f, +0.000057f, -0.000163f, + -0.000205f, -0.000048f, -0.000031f, +0.000246f, +0.000132f, +0.000088f, +0.000172f, +0.000232f, +0.000091f, -0.000128f, + +0.000024f, +0.000029f, +0.000117f, +0.000031f, -0.000030f, -0.000042f, -0.000077f, -0.000082f, +0.000034f, +0.000078f, + +0.000013f, -0.000056f, -0.000024f, -0.000012f, +0.000068f, +0.000048f, -0.000115f, +0.000023f, -0.000037f, -0.000110f, + -0.000067f, -0.000059f, +0.000035f, -0.000029f, +0.000018f, -0.000042f, -0.000023f, +0.000000f, -0.000045f, -0.000030f, + +0.000006f, -0.000007f, +0.000027f, +0.000020f, +0.000000f, -0.000016f + }, + { + +0.000324f, +0.000463f, -0.003145f, -0.000985f, -0.000181f, +0.000185f, -0.000049f, -0.000398f, -0.000037f, +0.000462f, + +0.000674f, +0.000134f, +0.000030f, -0.000300f, +0.003432f, +0.003821f, -0.000039f, -0.000782f, +0.000110f, -0.001254f, + +0.000280f, +0.000941f, +0.000449f, +0.000762f, +0.000852f, -0.000642f, -0.000534f, -0.000422f, +0.000471f, +0.000292f, + -0.000410f, -0.001278f, -0.000676f, +0.000558f, -0.000342f, -0.000138f, -0.000086f, +0.000176f, +0.000296f, +0.000349f, + -0.000406f, -0.000258f, -0.000221f, +0.000158f, -0.000072f, +0.000014f, -0.000173f, +0.000174f, +0.000119f, -0.000238f, + +0.000167f, -0.000075f, -0.000264f, -0.000197f, +0.000446f, +0.000381f, +0.000010f, +0.000076f, +0.000088f, -0.000096f, + -0.000244f, +0.000041f, +0.000014f, -0.000027f, -0.000085f, +0.000027f, -0.000092f, -0.000077f, +0.000036f, -0.000037f, + -0.000006f, +0.000012f, +0.000072f, -0.000026f, +0.000005f, +0.000041f, +0.000117f, +0.000029f, -0.000027f, -0.000079f, + +0.000036f, +0.000109f, -0.000028f, -0.000013f, -0.000047f, -0.000051f, +0.000011f, +0.000009f, -0.000082f, +0.000000f, + +0.000069f, -0.000025f, -0.000067f, -0.000065f, -0.000000f, +0.000049f + }, + { + +0.001122f, -0.002630f, -0.002395f, -0.001533f, -0.001015f, +0.000193f, -0.000052f, -0.000234f, +0.000334f, -0.000049f, + -0.000398f, +0.000102f, +0.000518f, -0.000059f, +0.000380f, +0.000318f, -0.000536f, -0.000555f, +0.001385f, -0.001211f, + +0.000198f, +0.000137f, -0.000455f, +0.000347f, +0.000172f, -0.000486f, -0.000463f, +0.000304f, +0.000158f, +0.000308f, + +0.000489f, +0.000178f, -0.000041f, -0.000231f, +0.000388f, -0.000132f, -0.000334f, +0.000370f, +0.000134f, -0.000037f, + +0.000179f, -0.000423f, +0.000050f, -0.000314f, -0.000354f, -0.000164f, -0.000006f, +0.000020f, +0.000045f, +0.000114f, + +0.000067f, -0.000048f, -0.000153f, +0.000066f, -0.000094f, +0.000113f, +0.000013f, -0.000128f, +0.000153f, -0.000074f, + -0.000141f, -0.000050f, -0.000076f, +0.000067f, +0.000072f, -0.000132f, +0.000021f, +0.000048f, -0.000091f, -0.000029f, + +0.000134f, -0.000097f, -0.000088f, +0.000041f, +0.000037f, +0.000090f, +0.000004f, -0.000093f, -0.000030f, +0.000042f, + -0.000002f, -0.000044f, +0.000036f, +0.000058f, -0.000046f, -0.000050f, -0.000030f, +0.000043f, +0.000010f, -0.000033f, + +0.000045f, +0.000058f, -0.000023f, +0.000012f, +0.000036f, -0.000026f + }, + { + +0.014583f, +0.004732f, -0.003811f, +0.000327f, +0.000610f, -0.000080f, -0.000169f, -0.000028f, -0.000051f, -0.000360f, + +0.000052f, -0.000041f, -0.000442f, +0.000464f, +0.000175f, -0.000717f, -0.000178f, +0.000130f, +0.000507f, -0.000243f, + +0.000189f, -0.000181f, +0.000195f, +0.000264f, +0.000193f, -0.000020f, -0.000695f, +0.000213f, -0.000399f, -0.000312f, + +0.000237f, -0.000229f, -0.000038f, +0.000364f, -0.000065f, -0.000420f, -0.000303f, -0.000018f, +0.000285f, -0.000189f, + +0.000019f, +0.000104f, +0.000192f, -0.000066f, +0.000013f, -0.000231f, +0.000018f, +0.000055f, +0.000061f, -0.000017f, + -0.000182f, +0.000223f, -0.000117f, -0.000108f, +0.000039f, -0.000095f, +0.000070f, +0.000067f, +0.000100f, +0.000106f, + -0.000002f, -0.000129f, +0.000056f, -0.000046f, -0.000089f, +0.000036f, -0.000089f, +0.000055f, +0.000032f, -0.000045f, + -0.000062f, +0.000112f, +0.000111f, -0.000066f, +0.000021f, -0.000044f, -0.000009f, +0.000016f, -0.000063f, -0.000043f, + -0.000045f, -0.000047f, +0.000033f, +0.000011f, +0.000009f, +0.000064f, -0.000043f, +0.000052f, +0.000028f, -0.000042f, + -0.000048f, +0.000010f, +0.000006f, -0.000027f, -0.000013f, +0.000017f + }, + { + -0.000717f, -0.000593f, +0.001565f, -0.000399f, +0.000010f, +0.000219f, -0.000267f, -0.000163f, +0.000065f, -0.000617f, + +0.000117f, +0.000294f, -0.000275f, -0.000450f, +0.005237f, -0.000651f, +0.000940f, -0.001681f, +0.000389f, +0.000624f, + +0.000336f, +0.000811f, +0.000268f, +0.001161f, +0.000214f, +0.000755f, -0.000821f, -0.000477f, -0.000353f, -0.002648f, + +0.000422f, +0.000095f, +0.000341f, -0.000504f, -0.000421f, +0.000679f, -0.000035f, +0.000168f, +0.000188f, -0.000421f, + -0.000017f, -0.000083f, -0.000329f, -0.000048f, +0.000176f, -0.000171f, +0.000089f, -0.000085f, -0.000081f, -0.000218f, + -0.000036f, +0.000210f, -0.000147f, -0.000020f, +0.000054f, +0.000190f, -0.000229f, -0.000045f, +0.000114f, -0.000050f, + -0.000040f, +0.000026f, -0.000025f, -0.000146f, -0.000137f, -0.000061f, +0.000005f, +0.000019f, +0.000058f, -0.000058f, + +0.000123f, +0.000112f, -0.000011f, +0.000057f, +0.000046f, -0.000072f, -0.000096f, -0.000053f, -0.000082f, -0.000032f, + -0.000030f, +0.000054f, +0.000082f, -0.000059f, +0.000002f, -0.000018f, -0.000022f, +0.000042f, +0.000003f, -0.000030f, + -0.000026f, -0.000046f, +0.000014f, +0.000052f, -0.000033f, -0.000059f + }, + { + +0.015911f, +0.025711f, +0.000163f, -0.001146f, -0.001102f, +0.000101f, -0.000498f, +0.000153f, +0.000432f, -0.001160f, + -0.000915f, +0.000428f, +0.000346f, +0.000982f, +0.000321f, -0.000039f, +0.000015f, -0.000767f, -0.000100f, -0.000121f, + -0.000673f, -0.000371f, +0.000209f, -0.000167f, -0.000170f, -0.000029f, +0.000435f, +0.000007f, +0.000049f, -0.000267f, + -0.000088f, +0.000438f, -0.000021f, -0.000434f, -0.000277f, -0.000133f, +0.000212f, +0.000006f, +0.000386f, -0.000250f, + +0.000056f, +0.000017f, -0.000026f, +0.000286f, -0.000417f, +0.000250f, +0.000085f, -0.000018f, -0.000039f, -0.000172f, + +0.000212f, +0.000072f, -0.000111f, -0.000322f, +0.000067f, -0.000070f, -0.000244f, -0.000055f, +0.000086f, +0.000072f, + +0.000044f, -0.000046f, -0.000176f, -0.000080f, +0.000107f, +0.000036f, -0.000048f, -0.000023f, +0.000109f, -0.000016f, + -0.000044f, -0.000049f, +0.000041f, +0.000036f, +0.000007f, -0.000019f, -0.000062f, +0.000030f, +0.000081f, +0.000023f, + +0.000007f, +0.000069f, +0.000111f, +0.000012f, -0.000056f, -0.000047f, +0.000018f, -0.000057f, +0.000020f, +0.000036f, + -0.000035f, -0.000009f, -0.000010f, +0.000050f, +0.000020f, -0.000019f + }, + { + +0.000256f, -0.001034f, -0.000021f, +0.000534f, -0.000063f, +0.000050f, -0.000253f, -0.000370f, -0.000032f, +0.000436f, + -0.000063f, -0.000112f, -0.000102f, +0.000053f, +0.001058f, +0.002617f, +0.000019f, -0.000272f, -0.000033f, +0.000183f, + -0.000138f, -0.000999f, -0.002075f, +0.000168f, +0.000309f, -0.000570f, -0.000774f, +0.000256f, -0.000548f, -0.000235f, + +0.000069f, +0.000303f, +0.000793f, -0.000169f, -0.000374f, +0.000336f, +0.000061f, +0.000105f, -0.000155f, -0.000239f, + -0.000028f, +0.000373f, +0.000042f, +0.000183f, -0.000085f, -0.000376f, -0.000114f, +0.000170f, -0.000094f, +0.000203f, + -0.000070f, -0.000032f, -0.000166f, -0.000025f, +0.000002f, +0.000015f, -0.000085f, +0.000076f, +0.000031f, -0.000060f, + +0.000109f, +0.000128f, -0.000027f, +0.000004f, +0.000058f, +0.000027f, -0.000108f, -0.000050f, -0.000015f, +0.000135f, + +0.000098f, -0.000167f, -0.000070f, -0.000065f, -0.000080f, -0.000082f, -0.000074f, -0.000102f, -0.000023f, +0.000036f, + -0.000007f, -0.000018f, +0.000017f, +0.000040f, -0.000012f, -0.000016f, +0.000029f, +0.000049f, +0.000028f, +0.000078f, + +0.000065f, +0.000023f, -0.000030f, +0.000004f, +0.000027f, -0.000006f + }, + { + -0.014368f, +0.028438f, +0.003616f, +0.000137f, -0.000134f, -0.000004f, +0.000843f, -0.000118f, +0.000107f, -0.000329f, + -0.000341f, +0.000980f, +0.000421f, -0.000402f, +0.000458f, +0.000282f, -0.000017f, +0.000409f, +0.000487f, -0.000748f, + +0.000089f, +0.000134f, +0.000034f, -0.000256f, +0.000415f, -0.000385f, +0.000004f, -0.000130f, -0.000341f, +0.000195f, + +0.000271f, +0.000328f, +0.000076f, -0.000652f, -0.000242f, -0.000639f, -0.000467f, +0.000389f, -0.000186f, +0.000043f, + +0.000252f, +0.000001f, -0.000189f, +0.000104f, -0.000047f, -0.000094f, +0.000121f, +0.000140f, -0.000218f, -0.000219f, + -0.000083f, +0.000029f, +0.000344f, +0.000050f, -0.000081f, -0.000094f, -0.000013f, -0.000049f, -0.000052f, +0.000077f, + -0.000008f, -0.000032f, -0.000055f, -0.000075f, +0.000048f, +0.000027f, +0.000049f, -0.000030f, +0.000000f, +0.000042f, + -0.000064f, -0.000011f, -0.000080f, -0.000131f, -0.000069f, +0.000114f, -0.000115f, -0.000094f, +0.000073f, -0.000018f, + -0.000048f, +0.000051f, -0.000003f, -0.000011f, +0.000030f, +0.000004f, -0.000045f, -0.000038f, -0.000006f, -0.000024f, + +0.000006f, +0.000006f, -0.000040f, -0.000028f, -0.000007f, +0.000044f + }, + { + +0.000283f, -0.002321f, -0.002095f, +0.000942f, -0.000140f, +0.000220f, +0.000032f, -0.000131f, -0.000379f, +0.000194f, + +0.000424f, +0.000219f, +0.000002f, -0.003277f, -0.000792f, -0.001486f, +0.000802f, -0.000266f, +0.000296f, -0.000834f, + -0.001900f, +0.001638f, +0.001464f, -0.000267f, -0.001764f, +0.001759f, +0.000106f, -0.000593f, +0.000237f, -0.000695f, + -0.000073f, -0.000131f, +0.000070f, +0.000565f, -0.000436f, -0.000233f, +0.000321f, -0.000218f, +0.000560f, +0.000084f, + -0.000421f, +0.000132f, +0.000090f, -0.000437f, -0.000387f, -0.000105f, +0.000078f, +0.000291f, -0.000141f, +0.000007f, + -0.000036f, +0.000051f, -0.000021f, -0.000125f, -0.000061f, +0.000140f, -0.000034f, -0.000289f, -0.000053f, -0.000016f, + +0.000174f, +0.000131f, +0.000226f, +0.000164f, +0.000096f, +0.000084f, +0.000039f, -0.000010f, -0.000145f, +0.000006f, + +0.000096f, +0.000077f, -0.000018f, -0.000114f, -0.000120f, +0.000017f, +0.000009f, -0.000051f, +0.000015f, -0.000022f, + +0.000012f, +0.000105f, +0.000054f, -0.000016f, +0.000006f, -0.000077f, -0.000116f, -0.000051f, +0.000036f, +0.000026f, + -0.000034f, +0.000017f, +0.000010f, -0.000025f, -0.000015f, -0.000055f + }, + { + -0.000023f, +0.001897f, -0.003480f, -0.000174f, -0.001163f, -0.001356f, +0.000085f, +0.000503f, -0.000389f, -0.000552f, + -0.000448f, -0.000500f, -0.000195f, +0.001025f, -0.000314f, +0.000189f, +0.000398f, -0.000780f, -0.000229f, +0.000631f, + -0.000219f, -0.000503f, -0.000150f, -0.000182f, -0.000268f, +0.000257f, +0.000239f, -0.000261f, -0.000021f, +0.000301f, + -0.000139f, -0.000157f, -0.000068f, -0.000487f, -0.000367f, +0.000377f, +0.000269f, +0.000082f, +0.000462f, +0.000018f, + -0.000085f, -0.000125f, +0.000156f, +0.000377f, -0.000245f, -0.000372f, +0.000219f, +0.000142f, -0.000140f, -0.000344f, + -0.000078f, -0.000033f, -0.000212f, +0.000003f, +0.000244f, -0.000177f, -0.000034f, +0.000131f, -0.000085f, +0.000054f, + +0.000075f, -0.000035f, -0.000049f, -0.000054f, +0.000132f, -0.000062f, -0.000019f, +0.000029f, -0.000097f, -0.000058f, + -0.000028f, +0.000003f, -0.000044f, -0.000005f, -0.000011f, -0.000009f, -0.000056f, +0.000064f, +0.000006f, +0.000037f, + +0.000085f, +0.000006f, -0.000070f, -0.000032f, -0.000066f, -0.000098f, -0.000069f, -0.000002f, -0.000049f, -0.000010f, + +0.000011f, +0.000026f, +0.000043f, -0.000007f, -0.000033f, -0.000048f + }, + { + +0.000430f, +0.006230f, +0.001766f, -0.000138f, +0.000012f, -0.000358f, -0.000185f, +0.000455f, -0.000473f, -0.000088f, + -0.000494f, +0.000292f, +0.000591f, -0.000380f, +0.001201f, +0.000657f, +0.000572f, +0.000450f, -0.000968f, +0.000937f, + +0.001535f, +0.000510f, +0.000253f, -0.000141f, +0.000553f, -0.000241f, -0.000345f, -0.000209f, +0.000245f, +0.000893f, + +0.000160f, +0.000077f, -0.000153f, +0.000132f, -0.000677f, -0.000144f, +0.000454f, +0.000082f, +0.000283f, +0.000095f, + +0.000226f, -0.000068f, -0.000046f, +0.000151f, +0.000008f, -0.000211f, +0.000078f, +0.000046f, -0.000230f, -0.000171f, + -0.000153f, +0.000010f, +0.000222f, +0.000229f, +0.000029f, +0.000061f, -0.000037f, -0.000111f, -0.000065f, +0.000089f, + -0.000186f, -0.000041f, +0.000128f, -0.000002f, -0.000156f, -0.000001f, -0.000081f, -0.000204f, +0.000003f, +0.000006f, + +0.000005f, +0.000082f, -0.000000f, -0.000066f, -0.000039f, +0.000064f, +0.000068f, +0.000125f, -0.000010f, -0.000040f, + +0.000028f, -0.000057f, -0.000049f, +0.000099f, +0.000068f, -0.000012f, +0.000028f, +0.000003f, +0.000043f, +0.000042f, + -0.000024f, +0.000014f, +0.000003f, +0.000003f, -0.000028f, +0.000021f + }, + { + -0.003642f, +0.004262f, -0.000146f, +0.000714f, -0.002073f, -0.000423f, +0.000970f, -0.000302f, -0.000072f, -0.000268f, + +0.000506f, +0.000275f, -0.000007f, -0.000017f, -0.000210f, +0.000329f, +0.000122f, -0.000057f, -0.000143f, -0.000143f, + +0.000322f, -0.000543f, -0.000239f, +0.000295f, -0.000211f, -0.000124f, -0.000118f, -0.000171f, -0.000256f, +0.000134f, + +0.000029f, +0.000344f, +0.000337f, +0.000275f, -0.000495f, +0.000116f, +0.000675f, +0.000590f, -0.000100f, -0.000016f, + -0.000071f, -0.000070f, +0.000064f, -0.000109f, -0.000002f, +0.000009f, -0.000047f, -0.000031f, -0.000075f, +0.000064f, + -0.000080f, +0.000031f, -0.000223f, +0.000062f, +0.000134f, -0.000039f, +0.000062f, +0.000112f, +0.000154f, +0.000025f, + -0.000152f, +0.000113f, +0.000002f, -0.000143f, +0.000043f, +0.000037f, +0.000032f, +0.000059f, +0.000007f, -0.000165f, + +0.000006f, +0.000028f, -0.000045f, -0.000009f, -0.000040f, +0.000005f, +0.000043f, +0.000025f, +0.000022f, -0.000001f, + -0.000019f, -0.000067f, -0.000018f, +0.000026f, -0.000063f, +0.000033f, +0.000030f, -0.000021f, +0.000017f, -0.000035f, + -0.000053f, -0.000047f, -0.000054f, +0.000018f, +0.000015f, -0.000020f + }, + { + +0.000173f, +0.000678f, +0.000081f, -0.000508f, +0.000089f, -0.000358f, +0.000185f, +0.000292f, +0.000156f, -0.000330f, + +0.000031f, +0.000314f, +0.000204f, +0.004407f, -0.004298f, +0.000307f, +0.000995f, -0.000176f, -0.000494f, -0.001171f, + +0.003341f, +0.000488f, -0.002832f, -0.001007f, +0.000244f, -0.000632f, -0.000227f, +0.000848f, -0.000904f, -0.000347f, + +0.000947f, +0.000526f, -0.000022f, +0.000078f, -0.000243f, +0.000433f, -0.000239f, +0.000109f, -0.000420f, -0.000123f, + -0.000025f, -0.000175f, +0.000084f, -0.000134f, -0.000056f, +0.000054f, -0.000197f, -0.000066f, +0.000325f, -0.000006f, + -0.000138f, -0.000221f, +0.000002f, +0.000149f, -0.000048f, -0.000118f, -0.000032f, +0.000154f, -0.000067f, +0.000197f, + +0.000200f, -0.000176f, -0.000218f, -0.000030f, +0.000106f, +0.000054f, -0.000052f, +0.000093f, -0.000024f, -0.000007f, + -0.000043f, -0.000003f, -0.000019f, +0.000004f, -0.000066f, -0.000113f, -0.000067f, +0.000020f, +0.000041f, -0.000011f, + +0.000074f, +0.000085f, +0.000029f, +0.000059f, +0.000008f, +0.000035f, -0.000044f, -0.000025f, +0.000022f, +0.000017f, + +0.000036f, -0.000065f, -0.000119f, +0.000042f, -0.000005f, -0.000070f + }, + { + +0.000932f, +0.005102f, -0.001977f, -0.000425f, +0.000609f, -0.001202f, +0.002022f, -0.000135f, -0.000902f, -0.000365f, + -0.000293f, -0.001009f, +0.000359f, -0.001431f, +0.001556f, -0.000124f, +0.000406f, +0.000798f, -0.000359f, -0.000150f, + +0.000091f, -0.000092f, +0.000169f, -0.000039f, +0.000326f, +0.000061f, -0.000726f, -0.000808f, -0.000035f, +0.000242f, + -0.000080f, +0.000251f, +0.000513f, +0.000473f, +0.000085f, +0.000225f, +0.000184f, -0.000026f, +0.000246f, -0.000656f, + +0.000009f, -0.000597f, -0.000153f, +0.000302f, +0.000492f, +0.000287f, +0.000189f, -0.000069f, +0.000094f, -0.000249f, + +0.000206f, +0.000156f, -0.000203f, -0.000036f, +0.000159f, +0.000307f, +0.000107f, -0.000089f, +0.000031f, -0.000066f, + +0.000053f, +0.000072f, -0.000026f, +0.000148f, +0.000085f, +0.000128f, -0.000015f, -0.000053f, -0.000007f, +0.000057f, + -0.000056f, -0.000032f, -0.000036f, -0.000012f, +0.000092f, +0.000071f, -0.000067f, -0.000051f, +0.000110f, +0.000080f, + -0.000007f, +0.000020f, +0.000116f, +0.000024f, -0.000020f, +0.000066f, -0.000045f, -0.000098f, +0.000028f, +0.000030f, + -0.000027f, +0.000026f, +0.000030f, +0.000006f, -0.000032f, +0.000002f + }, + { + +0.000204f, -0.000057f, +0.000762f, -0.000358f, +0.000058f, -0.000136f, -0.000131f, +0.000963f, +0.000485f, +0.000506f, + -0.000701f, +0.000126f, +0.001324f, -0.000178f, +0.007379f, -0.001539f, -0.000003f, -0.000127f, +0.000176f, +0.001674f, + +0.000753f, -0.000260f, +0.001085f, -0.000430f, -0.000642f, +0.000856f, -0.000189f, +0.001386f, -0.000583f, +0.000207f, + -0.000467f, -0.000015f, +0.000101f, -0.000058f, +0.000132f, +0.000442f, -0.000893f, +0.000028f, +0.000238f, -0.000005f, + -0.000608f, -0.000325f, -0.000081f, +0.000396f, -0.000045f, -0.000146f, +0.000195f, -0.000045f, -0.000082f, +0.000007f, + -0.000023f, -0.000038f, -0.000260f, +0.000062f, -0.000016f, +0.000091f, -0.000294f, +0.000009f, -0.000182f, -0.000320f, + -0.000057f, +0.000064f, +0.000009f, -0.000031f, +0.000018f, -0.000048f, +0.000272f, -0.000006f, -0.000125f, -0.000021f, + +0.000011f, -0.000055f, -0.000161f, +0.000016f, -0.000087f, +0.000071f, +0.000061f, -0.000091f, -0.000040f, -0.000048f, + +0.000081f, +0.000072f, +0.000089f, -0.000027f, -0.000065f, +0.000004f, -0.000056f, +0.000001f, +0.000075f, +0.000008f, + -0.000012f, +0.000036f, -0.000001f, -0.000043f, +0.000029f, +0.000030f + } + }, + { + { + -0.003601f, +0.043083f, -0.003184f, -0.002078f, +0.001345f, -0.000442f, +0.000214f, +0.000409f, -0.000110f, +0.000045f, + +0.000651f, -0.000218f, -0.000360f, +0.000587f, -0.001444f, +0.000565f, -0.000781f, -0.000486f, -0.000375f, +0.001081f, + +0.000279f, -0.000300f, -0.000011f, -0.000411f, -0.000033f, -0.000455f, -0.000122f, -0.000323f, +0.000337f, +0.000584f, + +0.000185f, -0.000461f, +0.000250f, -0.000361f, +0.000041f, -0.000236f, +0.000370f, -0.000015f, -0.000113f, -0.000458f, + -0.000033f, +0.000277f, -0.000145f, -0.000069f, -0.000087f, +0.000077f, -0.000113f, -0.000192f, +0.000359f, +0.000008f, + +0.000106f, +0.000023f, -0.000227f, +0.000196f, +0.000088f, -0.000122f, -0.000047f, -0.000111f, -0.000103f, +0.000007f, + +0.000203f, -0.000012f, -0.000066f, -0.000161f, +0.000002f, -0.000106f, +0.000051f, +0.000047f, -0.000040f, -0.000058f, + -0.000075f, +0.000001f, +0.000028f, +0.000004f, -0.000105f, -0.000138f, +0.000079f, -0.000018f, -0.000031f, +0.000092f, + +0.000058f, +0.000108f, +0.000006f, -0.000020f, -0.000042f, -0.000008f, +0.000063f, -0.000027f, +0.000064f, +0.000025f, + -0.000003f, -0.000008f, +0.000020f, -0.000005f, -0.000011f, +0.000018f + }, + { + -0.000378f, -0.003471f, +0.001888f, -0.000239f, +0.000499f, -0.000214f, -0.000437f, +0.000057f, +0.000273f, +0.000138f, + +0.000674f, +0.000486f, -0.000597f, -0.000522f, +0.003018f, +0.000802f, -0.000870f, +0.000166f, -0.001538f, -0.001009f, + +0.000193f, +0.001251f, +0.000113f, +0.000134f, -0.000493f, +0.000410f, -0.000466f, +0.000915f, +0.000083f, -0.000048f, + -0.000236f, -0.001625f, +0.000303f, +0.000130f, -0.000405f, +0.000662f, +0.000306f, +0.000349f, +0.000256f, -0.000392f, + +0.000021f, -0.000054f, +0.000482f, -0.000022f, -0.000166f, +0.000118f, +0.000001f, +0.000073f, -0.000063f, +0.000148f, + +0.000038f, -0.000102f, +0.000183f, +0.000234f, +0.000056f, -0.000226f, +0.000088f, +0.000101f, -0.000062f, -0.000044f, + +0.000093f, +0.000185f, +0.000031f, -0.000067f, -0.000000f, -0.000078f, +0.000031f, +0.000176f, -0.000002f, -0.000071f, + +0.000043f, +0.000033f, -0.000162f, -0.000075f, +0.000112f, +0.000034f, -0.000071f, -0.000072f, +0.000015f, +0.000130f, + +0.000008f, -0.000076f, +0.000018f, +0.000033f, -0.000002f, +0.000059f, +0.000043f, -0.000035f, +0.000042f, +0.000042f, + -0.000079f, -0.000024f, +0.000038f, +0.000059f, +0.000028f, -0.000026f + }, + { + -0.000808f, -0.012298f, +0.003068f, +0.001721f, +0.001245f, -0.000340f, +0.000158f, -0.000168f, -0.000485f, -0.000678f, + +0.000473f, +0.000418f, -0.000582f, +0.000722f, +0.000152f, +0.000721f, -0.000693f, -0.000379f, +0.000700f, -0.001099f, + -0.000882f, +0.000314f, -0.000397f, +0.000375f, +0.000568f, +0.000271f, -0.000196f, +0.000505f, -0.000524f, +0.000364f, + +0.000315f, -0.000271f, +0.000255f, -0.000026f, -0.000380f, -0.000044f, +0.000264f, -0.000192f, -0.000007f, -0.000267f, + -0.000314f, -0.000226f, -0.000173f, +0.000170f, -0.000053f, +0.000122f, -0.000115f, +0.000186f, +0.000110f, -0.000048f, + -0.000039f, +0.000343f, -0.000058f, -0.000058f, +0.000157f, +0.000122f, -0.000009f, -0.000078f, -0.000061f, -0.000086f, + +0.000017f, +0.000084f, +0.000015f, -0.000025f, +0.000000f, +0.000134f, +0.000019f, -0.000052f, +0.000053f, +0.000072f, + -0.000036f, -0.000054f, +0.000105f, -0.000032f, -0.000017f, -0.000056f, -0.000091f, +0.000020f, +0.000041f, +0.000007f, + -0.000003f, +0.000031f, +0.000022f, -0.000049f, +0.000027f, +0.000054f, +0.000040f, -0.000014f, -0.000038f, +0.000012f, + -0.000004f, -0.000068f, -0.000031f, +0.000002f, -0.000022f, +0.000009f + }, + { + -0.012139f, +0.034166f, +0.002717f, +0.000936f, -0.000559f, +0.000096f, -0.000052f, +0.000392f, +0.000026f, -0.000728f, + -0.000321f, -0.000282f, -0.000121f, -0.000139f, -0.000980f, -0.001248f, +0.000307f, -0.000178f, -0.000225f, -0.000056f, + -0.000036f, +0.000400f, +0.000393f, -0.000083f, +0.000128f, -0.000685f, -0.000156f, -0.000135f, -0.000256f, +0.000824f, + +0.000101f, -0.000046f, +0.000446f, +0.000040f, -0.000143f, -0.000522f, +0.000043f, +0.000161f, +0.000150f, -0.000125f, + -0.000104f, -0.000294f, +0.000346f, -0.000061f, +0.000034f, -0.000111f, +0.000359f, +0.000012f, -0.000010f, +0.000090f, + -0.000038f, -0.000026f, -0.000153f, +0.000211f, -0.000078f, +0.000105f, +0.000043f, +0.000239f, +0.000008f, -0.000017f, + +0.000026f, +0.000122f, +0.000115f, +0.000030f, +0.000172f, -0.000072f, +0.000066f, +0.000052f, -0.000072f, +0.000110f, + +0.000027f, -0.000175f, -0.000124f, -0.000015f, -0.000021f, +0.000005f, +0.000060f, -0.000014f, -0.000018f, +0.000046f, + +0.000088f, +0.000039f, -0.000020f, -0.000054f, +0.000011f, -0.000025f, +0.000025f, +0.000019f, -0.000090f, +0.000003f, + +0.000044f, +0.000007f, -0.000034f, +0.000017f, +0.000028f, -0.000005f + }, + { + +0.000794f, +0.000415f, -0.002334f, +0.000090f, +0.000339f, -0.000229f, -0.000116f, +0.000193f, +0.000162f, -0.000132f, + -0.000073f, -0.000248f, +0.000623f, -0.001283f, +0.003585f, -0.001421f, -0.001023f, +0.000981f, +0.004704f, -0.001401f, + -0.000215f, +0.000557f, +0.000626f, +0.001049f, -0.000285f, -0.000771f, -0.000538f, -0.001413f, -0.001109f, -0.000423f, + -0.000629f, +0.000777f, +0.000403f, -0.000207f, +0.000090f, -0.000255f, +0.000709f, +0.000522f, -0.000164f, +0.000107f, + -0.000061f, -0.000117f, +0.000383f, +0.000063f, +0.000027f, +0.000269f, -0.000111f, +0.000033f, +0.000241f, -0.000006f, + +0.000041f, -0.000130f, -0.000032f, +0.000066f, -0.000131f, -0.000024f, -0.000019f, +0.000098f, +0.000016f, +0.000047f, + +0.000098f, +0.000078f, -0.000067f, -0.000067f, +0.000199f, +0.000153f, +0.000088f, +0.000012f, -0.000077f, +0.000060f, + +0.000015f, -0.000061f, -0.000014f, -0.000023f, -0.000093f, +0.000001f, +0.000035f, +0.000035f, +0.000120f, +0.000111f, + +0.000062f, +0.000033f, -0.000138f, +0.000013f, +0.000039f, -0.000020f, +0.000041f, -0.000009f, -0.000017f, +0.000007f, + +0.000010f, +0.000020f, +0.000017f, -0.000042f, -0.000025f, +0.000053f + }, + { + -0.010354f, +0.055737f, +0.001437f, -0.001401f, -0.000367f, -0.000207f, +0.000048f, +0.001049f, -0.001250f, +0.000149f, + +0.001016f, -0.000125f, -0.000455f, +0.000652f, +0.001017f, -0.000392f, -0.000219f, -0.000084f, +0.000014f, -0.000409f, + +0.000169f, +0.000393f, -0.000265f, -0.000702f, -0.000239f, +0.000186f, +0.000086f, -0.000124f, -0.000163f, +0.000213f, + -0.000126f, -0.000162f, -0.000493f, -0.000085f, -0.000182f, -0.000091f, +0.000138f, -0.000033f, +0.000255f, -0.000061f, + +0.000303f, +0.000150f, -0.000245f, +0.000368f, -0.000322f, -0.000081f, -0.000095f, -0.000080f, -0.000305f, +0.000080f, + -0.000081f, -0.000093f, +0.000198f, +0.000164f, -0.000063f, -0.000174f, +0.000235f, +0.000190f, +0.000000f, -0.000090f, + -0.000047f, +0.000057f, +0.000160f, +0.000026f, -0.000013f, -0.000059f, +0.000016f, +0.000075f, -0.000021f, +0.000077f, + -0.000000f, +0.000095f, -0.000038f, -0.000022f, +0.000017f, -0.000041f, +0.000067f, +0.000018f, -0.000024f, -0.000019f, + -0.000039f, -0.000050f, -0.000120f, -0.000056f, +0.000054f, +0.000062f, +0.000029f, +0.000042f, +0.000038f, -0.000067f, + +0.000014f, +0.000014f, +0.000018f, -0.000013f, -0.000033f, +0.000019f + }, + { + -0.000538f, +0.000874f, +0.002336f, -0.000289f, -0.000014f, -0.000155f, -0.000062f, -0.000039f, +0.000166f, -0.000078f, + +0.000080f, +0.000134f, -0.000500f, -0.001871f, +0.000150f, +0.002302f, -0.002173f, -0.000118f, -0.000029f, -0.000403f, + -0.000544f, +0.000382f, -0.000891f, -0.001417f, -0.001095f, -0.000829f, +0.000266f, -0.000027f, -0.001986f, +0.000583f, + +0.000535f, +0.000167f, -0.000506f, +0.000579f, +0.000849f, +0.000217f, -0.000208f, +0.000049f, -0.000139f, +0.000291f, + +0.000471f, -0.000029f, -0.000127f, -0.000135f, -0.000175f, +0.000065f, +0.000035f, +0.000234f, -0.000177f, -0.000012f, + -0.000147f, -0.000021f, +0.000059f, +0.000077f, -0.000055f, +0.000093f, +0.000156f, +0.000142f, -0.000253f, -0.000100f, + -0.000029f, -0.000045f, -0.000114f, -0.000060f, +0.000058f, -0.000082f, +0.000010f, +0.000180f, +0.000027f, -0.000173f, + -0.000086f, +0.000060f, +0.000079f, -0.000017f, +0.000032f, +0.000027f, +0.000051f, +0.000050f, +0.000087f, -0.000019f, + -0.000012f, +0.000024f, +0.000027f, +0.000009f, -0.000013f, +0.000039f, -0.000029f, -0.000043f, +0.000002f, -0.000052f, + -0.000091f, -0.000068f, -0.000001f, +0.000028f, -0.000040f, -0.000004f + }, + { + +0.016875f, -0.009632f, -0.005220f, +0.001105f, +0.000042f, +0.000283f, +0.000034f, -0.000428f, +0.000010f, +0.000280f, + +0.000715f, -0.000028f, -0.000940f, -0.000264f, +0.001967f, -0.000058f, +0.000111f, -0.000463f, -0.000430f, +0.000745f, + -0.000200f, -0.000038f, +0.000233f, +0.000560f, -0.000320f, -0.000403f, +0.000306f, +0.000053f, -0.000493f, +0.000104f, + +0.000619f, -0.000143f, -0.000176f, +0.000163f, -0.000232f, -0.000065f, -0.000254f, +0.000369f, +0.000045f, +0.000147f, + -0.000015f, -0.000050f, -0.000079f, -0.000178f, -0.000070f, -0.000042f, -0.000066f, -0.000278f, -0.000225f, +0.000139f, + +0.000123f, +0.000026f, -0.000331f, -0.000166f, +0.000112f, +0.000094f, +0.000171f, +0.000107f, +0.000031f, -0.000094f, + -0.000165f, +0.000044f, +0.000019f, +0.000069f, -0.000044f, -0.000076f, +0.000063f, +0.000033f, -0.000079f, -0.000102f, + +0.000023f, -0.000009f, -0.000046f, +0.000131f, +0.000118f, -0.000099f, -0.000013f, +0.000128f, -0.000040f, +0.000005f, + +0.000030f, -0.000056f, -0.000055f, -0.000002f, +0.000007f, -0.000047f, +0.000039f, +0.000052f, -0.000006f, -0.000001f, + -0.000024f, -0.000008f, +0.000029f, +0.000035f, +0.000031f, -0.000002f + }, + { + -0.000767f, +0.000283f, +0.003241f, -0.000716f, +0.000319f, -0.000220f, -0.000004f, +0.000115f, +0.000117f, +0.000121f, + +0.000048f, -0.000269f, -0.000313f, +0.000022f, -0.005448f, +0.001947f, +0.000004f, -0.002444f, +0.000237f, -0.000050f, + -0.000266f, +0.000010f, +0.001157f, -0.000038f, -0.000863f, -0.000104f, +0.000231f, +0.000944f, -0.000682f, +0.000709f, + -0.000696f, -0.000947f, +0.000737f, -0.000335f, +0.000409f, +0.000162f, -0.000330f, +0.000056f, +0.000334f, +0.000019f, + +0.000295f, +0.000368f, -0.000106f, +0.000178f, +0.000091f, +0.000194f, -0.000027f, +0.000270f, +0.000010f, -0.000062f, + -0.000207f, -0.000041f, -0.000190f, +0.000070f, +0.000140f, -0.000097f, +0.000152f, +0.000076f, +0.000098f, -0.000040f, + -0.000066f, -0.000125f, +0.000105f, -0.000133f, -0.000230f, -0.000068f, -0.000143f, -0.000101f, +0.000076f, -0.000104f, + +0.000048f, -0.000109f, -0.000148f, +0.000005f, +0.000129f, -0.000005f, -0.000045f, +0.000011f, -0.000011f, +0.000006f, + +0.000028f, -0.000096f, -0.000074f, +0.000008f, +0.000019f, -0.000006f, +0.000060f, +0.000090f, +0.000008f, -0.000053f, + +0.000007f, +0.000011f, -0.000019f, +0.000022f, +0.000016f, +0.000025f + }, + { + +0.001219f, -0.001922f, -0.004324f, +0.000473f, +0.000142f, -0.000811f, +0.000060f, +0.000165f, -0.000277f, +0.000170f, + +0.000413f, -0.000013f, +0.000247f, -0.000502f, +0.000221f, -0.000056f, -0.000009f, +0.000387f, +0.000273f, -0.000362f, + -0.000392f, -0.000078f, -0.000239f, -0.000280f, +0.000261f, +0.000084f, +0.000099f, -0.000270f, +0.000297f, +0.000277f, + -0.000183f, +0.000275f, +0.000029f, +0.000446f, -0.000321f, +0.000241f, -0.000107f, +0.000261f, +0.000322f, +0.000005f, + +0.000203f, +0.000375f, +0.000174f, -0.000264f, +0.000100f, +0.000329f, +0.000298f, -0.000053f, -0.000069f, +0.000271f, + +0.000205f, -0.000042f, +0.000334f, +0.000088f, -0.000326f, -0.000142f, +0.000147f, -0.000022f, -0.000052f, -0.000075f, + -0.000090f, +0.000141f, -0.000036f, +0.000035f, +0.000011f, -0.000015f, +0.000054f, -0.000084f, -0.000030f, +0.000100f, + -0.000023f, -0.000045f, +0.000028f, +0.000060f, -0.000014f, -0.000004f, -0.000006f, +0.000019f, -0.000048f, +0.000051f, + -0.000079f, -0.000028f, +0.000039f, +0.000021f, +0.000005f, +0.000110f, +0.000070f, +0.000036f, +0.000072f, +0.000026f, + +0.000024f, -0.000007f, -0.000072f, -0.000016f, +0.000031f, +0.000048f + }, + { + -0.000474f, +0.007922f, -0.000185f, +0.001272f, +0.000118f, +0.000266f, +0.000350f, -0.000311f, -0.000167f, +0.000176f, + +0.000690f, -0.000432f, +0.000051f, +0.000383f, +0.001125f, +0.000580f, -0.000512f, -0.000696f, +0.000656f, +0.000910f, + -0.000705f, +0.000410f, +0.000890f, +0.000660f, +0.000101f, +0.000228f, +0.000151f, -0.000459f, +0.000055f, +0.000019f, + -0.000286f, -0.000048f, -0.000078f, -0.000298f, -0.000115f, +0.000119f, -0.000332f, -0.000310f, +0.000026f, -0.000090f, + +0.000184f, +0.000010f, +0.000338f, +0.000203f, -0.000100f, -0.000024f, -0.000058f, -0.000023f, +0.000000f, +0.000001f, + +0.000191f, +0.000146f, -0.000174f, -0.000189f, -0.000172f, +0.000066f, -0.000068f, +0.000076f, +0.000066f, +0.000033f, + +0.000033f, +0.000083f, -0.000168f, -0.000136f, +0.000070f, +0.000106f, -0.000070f, +0.000092f, +0.000118f, -0.000016f, + -0.000033f, -0.000056f, -0.000048f, +0.000027f, +0.000022f, -0.000011f, -0.000040f, -0.000148f, -0.000065f, +0.000061f, + -0.000041f, +0.000044f, +0.000043f, -0.000053f, -0.000075f, -0.000010f, -0.000039f, +0.000001f, -0.000039f, -0.000064f, + +0.000016f, -0.000000f, -0.000006f, +0.000009f, +0.000011f, +0.000030f + }, + { + +0.005705f, -0.007607f, -0.002038f, -0.001284f, +0.000194f, -0.000036f, -0.000700f, -0.000025f, -0.000789f, +0.000188f, + -0.000319f, -0.001334f, +0.000119f, -0.000394f, -0.000586f, -0.000008f, +0.000126f, -0.000038f, +0.000004f, +0.000383f, + -0.000311f, +0.000404f, +0.000061f, -0.000293f, +0.000011f, +0.000085f, -0.000098f, +0.000118f, -0.000313f, -0.000249f, + +0.000013f, +0.000324f, -0.000449f, -0.000115f, -0.000102f, -0.000267f, -0.000152f, -0.000172f, -0.000161f, +0.000288f, + +0.000019f, +0.000119f, -0.000214f, +0.000299f, -0.000114f, +0.000002f, -0.000306f, +0.000048f, +0.000065f, +0.000159f, + +0.000137f, +0.000139f, +0.000067f, +0.000027f, +0.000047f, +0.000027f, -0.000032f, +0.000104f, -0.000017f, -0.000085f, + +0.000082f, +0.000030f, -0.000114f, +0.000104f, +0.000058f, -0.000116f, -0.000083f, -0.000038f, -0.000129f, +0.000029f, + +0.000030f, -0.000049f, +0.000028f, +0.000068f, +0.000060f, +0.000021f, -0.000020f, -0.000018f, -0.000039f, -0.000016f, + -0.000012f, +0.000049f, +0.000090f, -0.000031f, +0.000051f, -0.000010f, -0.000060f, +0.000027f, -0.000023f, +0.000018f, + +0.000034f, +0.000030f, +0.000070f, -0.000019f, -0.000017f, +0.000022f + }, + { + -0.000195f, +0.000117f, -0.000352f, +0.000325f, +0.000215f, +0.000200f, +0.000180f, -0.000311f, +0.000122f, +0.000257f, + +0.000293f, +0.000123f, -0.000651f, +0.005004f, -0.002888f, +0.004277f, -0.000409f, +0.000018f, -0.000542f, -0.000555f, + +0.000804f, +0.000127f, -0.001059f, +0.000184f, -0.000191f, -0.000152f, -0.000227f, +0.000238f, +0.000299f, +0.000952f, + +0.000177f, -0.000335f, -0.000306f, -0.000352f, -0.000017f, -0.000411f, -0.000049f, +0.000274f, -0.000231f, +0.000380f, + -0.000256f, +0.000089f, +0.000042f, -0.000037f, -0.000197f, +0.000140f, +0.000168f, +0.000335f, -0.000011f, +0.000215f, + +0.000075f, +0.000199f, +0.000174f, -0.000073f, +0.000013f, +0.000249f, -0.000050f, -0.000098f, -0.000014f, -0.000105f, + -0.000271f, +0.000046f, +0.000156f, +0.000077f, +0.000048f, -0.000093f, +0.000016f, -0.000109f, -0.000014f, +0.000048f, + -0.000003f, -0.000046f, -0.000001f, -0.000052f, +0.000028f, +0.000142f, +0.000077f, -0.000006f, +0.000008f, +0.000005f, + -0.000062f, -0.000110f, -0.000041f, -0.000049f, -0.000026f, -0.000010f, +0.000012f, +0.000071f, -0.000051f, -0.000012f, + -0.000030f, +0.000003f, +0.000108f, +0.000004f, -0.000042f, +0.000058f + }, + { + -0.001336f, +0.006824f, -0.001141f, -0.002600f, -0.000058f, +0.000606f, +0.000205f, -0.000560f, -0.000137f, +0.000304f, + -0.000415f, -0.000272f, +0.000477f, -0.000333f, -0.000075f, -0.000529f, -0.001056f, +0.000016f, -0.000051f, +0.000098f, + -0.000251f, +0.000293f, +0.000382f, +0.000271f, +0.001006f, -0.000330f, -0.000206f, -0.000591f, +0.000686f, +0.000686f, + -0.000345f, -0.000081f, +0.000083f, -0.000293f, +0.000052f, +0.000245f, -0.000222f, -0.000250f, -0.000345f, -0.000021f, + +0.000221f, -0.000506f, +0.000125f, +0.000074f, -0.000038f, -0.000267f, -0.000276f, -0.000066f, +0.000097f, +0.000155f, + +0.000221f, -0.000275f, +0.000160f, +0.000104f, -0.000123f, -0.000106f, -0.000096f, +0.000008f, +0.000084f, -0.000147f, + +0.000106f, -0.000057f, -0.000059f, -0.000077f, -0.000098f, -0.000113f, -0.000122f, +0.000042f, -0.000016f, +0.000042f, + -0.000044f, +0.000050f, -0.000021f, +0.000002f, -0.000070f, -0.000056f, -0.000030f, +0.000095f, -0.000073f, -0.000105f, + -0.000026f, +0.000025f, -0.000058f, -0.000095f, +0.000013f, -0.000048f, -0.000050f, +0.000116f, +0.000024f, -0.000037f, + +0.000033f, +0.000005f, -0.000040f, -0.000021f, -0.000009f, +0.000031f + }, + { + -0.000111f, -0.000038f, -0.000711f, -0.000055f, +0.000195f, -0.000137f, +0.000102f, +0.000240f, +0.001094f, -0.000246f, + -0.000880f, +0.000246f, -0.000345f, +0.001021f, +0.015216f, +0.000707f, -0.002709f, -0.000753f, +0.000831f, -0.000277f, + -0.000413f, +0.001252f, +0.000115f, +0.000394f, +0.000721f, -0.000038f, +0.000041f, +0.000320f, +0.000041f, +0.000154f, + +0.000274f, -0.000381f, +0.000001f, +0.000474f, -0.000360f, -0.000063f, +0.000854f, -0.000103f, -0.000314f, +0.000163f, + -0.000034f, +0.000255f, +0.000272f, -0.000092f, -0.000093f, -0.000041f, -0.000128f, -0.000034f, +0.000128f, +0.000111f, + -0.000047f, +0.000167f, +0.000281f, +0.000066f, -0.000057f, -0.000099f, +0.000104f, -0.000021f, +0.000055f, +0.000246f, + +0.000262f, -0.000102f, -0.000063f, +0.000116f, +0.000104f, +0.000071f, -0.000185f, -0.000090f, +0.000104f, +0.000011f, + -0.000058f, -0.000032f, +0.000132f, +0.000032f, +0.000067f, +0.000032f, -0.000126f, +0.000055f, +0.000072f, +0.000057f, + -0.000046f, -0.000073f, -0.000069f, -0.000011f, +0.000077f, -0.000032f, +0.000032f, +0.000006f, -0.000044f, -0.000009f, + +0.000016f, -0.000035f, -0.000003f, +0.000033f, +0.000020f, -0.000038f + } + }, + { + { + +0.000513f, +0.056536f, -0.002765f, -0.004322f, +0.000111f, -0.000314f, +0.000241f, +0.000406f, -0.000137f, +0.000231f, + +0.000507f, -0.000561f, -0.000570f, +0.000282f, -0.001245f, +0.001177f, +0.000074f, +0.000361f, +0.000278f, +0.001478f, + +0.000081f, -0.000157f, -0.000162f, -0.000224f, +0.000252f, -0.000101f, -0.000065f, -0.000140f, +0.000440f, +0.000051f, + +0.000270f, -0.000072f, +0.000836f, +0.000213f, -0.000120f, +0.000083f, +0.000261f, -0.000156f, +0.000056f, -0.000256f, + +0.000028f, +0.000228f, -0.000132f, +0.000215f, +0.000148f, +0.000083f, -0.000014f, -0.000389f, +0.000181f, +0.000196f, + +0.000171f, +0.000062f, -0.000088f, +0.000042f, -0.000066f, -0.000174f, -0.000128f, -0.000112f, -0.000054f, +0.000112f, + +0.000058f, -0.000057f, -0.000011f, -0.000094f, +0.000056f, -0.000035f, +0.000137f, +0.000015f, -0.000069f, -0.000037f, + -0.000040f, +0.000052f, +0.000001f, -0.000040f, -0.000105f, -0.000081f, +0.000103f, -0.000044f, +0.000021f, +0.000093f, + +0.000050f, +0.000084f, -0.000017f, -0.000023f, -0.000060f, +0.000062f, +0.000044f, -0.000017f, +0.000076f, +0.000032f, + -0.000014f, +0.000006f, -0.000006f, -0.000016f, -0.000011f, +0.000019f + }, + { + +0.000272f, -0.004140f, +0.001449f, +0.000284f, +0.000337f, -0.000400f, -0.000529f, +0.000178f, +0.000121f, -0.000189f, + -0.000239f, -0.000179f, -0.000622f, -0.002216f, +0.000111f, -0.000958f, -0.001664f, +0.000543f, -0.000821f, -0.000015f, + -0.000102f, +0.001565f, +0.000368f, -0.000079f, -0.001249f, -0.000073f, +0.000219f, +0.001164f, -0.000402f, -0.000484f, + -0.000003f, -0.001004f, +0.000249f, -0.000129f, +0.000011f, +0.000293f, -0.000078f, +0.000223f, +0.000142f, -0.000520f, + +0.000345f, +0.000189f, +0.000458f, -0.000352f, -0.000244f, +0.000012f, +0.000080f, -0.000013f, +0.000002f, +0.000113f, + -0.000125f, -0.000084f, +0.000162f, +0.000198f, -0.000211f, -0.000169f, +0.000003f, -0.000085f, -0.000113f, +0.000105f, + +0.000231f, +0.000182f, +0.000006f, -0.000084f, +0.000064f, -0.000013f, +0.000113f, +0.000101f, -0.000017f, -0.000020f, + +0.000034f, -0.000018f, -0.000086f, -0.000038f, +0.000102f, -0.000022f, -0.000070f, -0.000071f, +0.000011f, +0.000102f, + -0.000031f, -0.000077f, +0.000027f, +0.000017f, +0.000008f, +0.000047f, +0.000015f, -0.000015f, +0.000074f, +0.000002f, + -0.000078f, +0.000010f, +0.000069f, +0.000057f, +0.000001f, -0.000038f + }, + { + +0.001103f, -0.016156f, -0.001573f, +0.002518f, +0.001232f, -0.000359f, +0.000063f, -0.000144f, -0.000340f, -0.000172f, + +0.000836f, -0.000021f, -0.000443f, +0.001074f, -0.000443f, +0.001347f, +0.000056f, -0.000027f, +0.000606f, +0.000204f, + -0.000694f, +0.000687f, +0.000252f, +0.000031f, +0.000011f, +0.000350f, -0.000129f, +0.000163f, -0.000960f, +0.000096f, + +0.000098f, -0.000319f, +0.000509f, +0.000213f, -0.000450f, +0.000306f, +0.000366f, -0.000176f, +0.000010f, -0.000275f, + -0.000169f, +0.000043f, -0.000248f, +0.000097f, +0.000205f, +0.000168f, -0.000135f, +0.000145f, +0.000096f, -0.000117f, + +0.000037f, +0.000282f, -0.000138f, -0.000077f, +0.000134f, -0.000009f, +0.000015f, -0.000053f, -0.000046f, -0.000033f, + +0.000114f, +0.000124f, -0.000004f, -0.000092f, +0.000023f, +0.000135f, -0.000027f, -0.000049f, +0.000112f, +0.000016f, + -0.000063f, +0.000019f, +0.000102f, -0.000100f, -0.000044f, -0.000063f, -0.000025f, +0.000060f, -0.000026f, -0.000037f, + +0.000001f, +0.000030f, -0.000024f, -0.000066f, +0.000022f, +0.000035f, +0.000033f, -0.000050f, -0.000022f, +0.000022f, + -0.000034f, -0.000072f, +0.000010f, -0.000024f, -0.000021f, +0.000023f + }, + { + +0.005644f, +0.052815f, -0.001840f, +0.001561f, +0.000647f, +0.000438f, +0.000329f, +0.000459f, -0.000001f, -0.000619f, + -0.000214f, +0.000065f, -0.000024f, -0.001011f, -0.000955f, +0.000044f, +0.000511f, -0.000621f, -0.000379f, -0.000228f, + -0.000167f, +0.000306f, -0.000124f, -0.000241f, +0.000339f, -0.000435f, +0.000168f, -0.000362f, -0.000000f, +0.000660f, + +0.000081f, +0.000019f, +0.000117f, -0.000419f, -0.000388f, -0.000777f, +0.000190f, +0.000083f, +0.000424f, +0.000562f, + -0.000062f, -0.000327f, +0.000436f, -0.000035f, -0.000029f, +0.000014f, +0.000230f, -0.000062f, -0.000031f, +0.000130f, + -0.000056f, -0.000112f, -0.000019f, +0.000195f, -0.000096f, +0.000000f, -0.000114f, +0.000165f, -0.000095f, -0.000028f, + +0.000022f, +0.000075f, +0.000059f, +0.000048f, +0.000143f, -0.000082f, +0.000125f, -0.000016f, -0.000056f, +0.000073f, + +0.000032f, -0.000161f, -0.000092f, +0.000002f, -0.000015f, +0.000052f, +0.000031f, -0.000025f, +0.000016f, +0.000076f, + +0.000068f, +0.000035f, -0.000042f, -0.000029f, +0.000028f, -0.000027f, +0.000038f, -0.000033f, -0.000069f, +0.000021f, + +0.000038f, -0.000010f, -0.000021f, +0.000026f, +0.000014f, -0.000016f + }, + { + -0.000418f, +0.001668f, +0.000149f, +0.000304f, +0.000076f, -0.000238f, +0.000073f, +0.000163f, +0.000128f, +0.000144f, + +0.000137f, -0.000123f, +0.001227f, -0.000146f, +0.003587f, -0.002657f, -0.000511f, +0.001998f, +0.000732f, -0.000842f, + +0.000339f, +0.000432f, +0.001045f, +0.000744f, -0.001147f, -0.000252f, +0.000619f, -0.000685f, +0.000614f, +0.000215f, + -0.000300f, +0.001142f, +0.000374f, -0.000134f, +0.000219f, -0.000492f, +0.000498f, +0.000347f, -0.000130f, +0.000195f, + -0.000001f, +0.000099f, +0.000377f, +0.000010f, +0.000104f, +0.000170f, +0.000018f, +0.000297f, +0.000191f, +0.000048f, + -0.000123f, -0.000242f, +0.000113f, -0.000034f, -0.000087f, +0.000071f, +0.000107f, +0.000195f, +0.000018f, +0.000054f, + +0.000085f, +0.000046f, -0.000030f, +0.000033f, +0.000247f, +0.000082f, +0.000017f, -0.000037f, -0.000041f, +0.000077f, + -0.000084f, -0.000048f, -0.000011f, -0.000014f, -0.000061f, +0.000066f, +0.000063f, +0.000070f, +0.000129f, +0.000056f, + +0.000018f, -0.000015f, -0.000100f, +0.000082f, +0.000015f, +0.000014f, +0.000038f, -0.000031f, -0.000002f, +0.000017f, + +0.000028f, +0.000033f, -0.000002f, -0.000047f, +0.000020f, +0.000051f + }, + { + +0.000858f, +0.068268f, -0.000401f, -0.001673f, -0.000382f, -0.000174f, +0.000142f, +0.000605f, -0.000866f, +0.000910f, + +0.000912f, -0.000446f, -0.000559f, -0.000242f, +0.000269f, -0.000259f, -0.000235f, +0.000074f, -0.000076f, -0.000113f, + +0.000453f, +0.000193f, -0.000633f, -0.000858f, +0.000063f, +0.000131f, +0.000062f, -0.000444f, -0.000166f, +0.000573f, + +0.000008f, -0.000155f, -0.000238f, +0.000186f, -0.000206f, -0.000168f, -0.000208f, -0.000442f, +0.000080f, +0.000006f, + +0.000072f, -0.000314f, -0.000301f, +0.000507f, -0.000230f, -0.000201f, -0.000207f, -0.000295f, -0.000211f, +0.000216f, + -0.000133f, +0.000105f, +0.000276f, +0.000094f, -0.000188f, -0.000070f, +0.000320f, +0.000095f, -0.000073f, -0.000144f, + -0.000089f, +0.000033f, +0.000203f, +0.000048f, -0.000109f, -0.000024f, +0.000081f, +0.000031f, -0.000027f, +0.000065f, + +0.000008f, +0.000069f, -0.000048f, +0.000007f, -0.000023f, +0.000013f, +0.000080f, -0.000001f, -0.000048f, -0.000012f, + -0.000046f, -0.000058f, -0.000101f, -0.000011f, +0.000061f, +0.000056f, -0.000002f, +0.000062f, -0.000022f, -0.000045f, + +0.000029f, +0.000028f, +0.000011f, -0.000048f, -0.000014f, +0.000022f + }, + { + -0.000196f, +0.001581f, +0.000974f, -0.000705f, +0.000014f, -0.000047f, +0.000214f, +0.000226f, +0.000199f, -0.000081f, + +0.000177f, +0.000208f, -0.000500f, -0.000724f, +0.001250f, +0.000468f, -0.002188f, +0.000078f, -0.000654f, -0.000399f, + +0.000372f, -0.000030f, +0.000026f, +0.000278f, -0.000680f, -0.001156f, -0.000569f, -0.000388f, -0.001142f, +0.000603f, + +0.000191f, -0.000137f, -0.000977f, +0.000928f, +0.000681f, +0.000067f, -0.000127f, +0.000247f, +0.000085f, +0.000338f, + +0.000036f, -0.000418f, -0.000032f, -0.000142f, +0.000149f, +0.000283f, -0.000042f, +0.000101f, -0.000119f, -0.000032f, + -0.000095f, -0.000017f, +0.000118f, +0.000075f, -0.000053f, -0.000006f, +0.000087f, +0.000010f, -0.000167f, -0.000054f, + -0.000087f, -0.000022f, -0.000053f, -0.000090f, -0.000003f, -0.000076f, +0.000118f, +0.000130f, -0.000070f, -0.000197f, + -0.000026f, +0.000086f, +0.000064f, +0.000038f, +0.000074f, +0.000010f, +0.000072f, +0.000067f, +0.000059f, -0.000057f, + +0.000017f, +0.000020f, -0.000006f, -0.000033f, -0.000016f, +0.000026f, -0.000049f, -0.000032f, -0.000015f, -0.000069f, + -0.000088f, -0.000034f, +0.000026f, +0.000001f, -0.000035f, -0.000004f + }, + { + -0.013430f, -0.045187f, +0.000180f, +0.001096f, +0.000325f, +0.000185f, -0.000837f, -0.000341f, -0.000019f, +0.000398f, + +0.000487f, -0.000987f, -0.000710f, +0.000050f, +0.000844f, -0.000889f, +0.000035f, -0.000477f, -0.000048f, +0.000825f, + -0.000769f, -0.000681f, -0.000601f, +0.000129f, -0.000715f, -0.000236f, -0.000113f, -0.000446f, -0.000728f, -0.000126f, + +0.000175f, -0.000217f, +0.000055f, +0.000499f, -0.000173f, -0.000172f, -0.000360f, +0.000620f, +0.000270f, +0.000130f, + -0.000080f, +0.000053f, -0.000087f, -0.000298f, +0.000338f, -0.000006f, -0.000113f, -0.000345f, -0.000075f, +0.000138f, + +0.000085f, -0.000032f, -0.000302f, -0.000009f, +0.000093f, +0.000092f, +0.000150f, +0.000064f, -0.000001f, -0.000064f, + -0.000089f, +0.000092f, +0.000022f, +0.000017f, -0.000074f, -0.000063f, +0.000031f, +0.000031f, -0.000039f, -0.000057f, + +0.000043f, +0.000010f, +0.000047f, +0.000165f, +0.000058f, -0.000105f, +0.000096f, +0.000093f, -0.000092f, +0.000026f, + +0.000034f, -0.000051f, +0.000003f, +0.000040f, -0.000007f, -0.000025f, +0.000052f, +0.000036f, +0.000011f, -0.000009f, + -0.000039f, +0.000002f, +0.000035f, +0.000042f, +0.000022f, -0.000030f + }, + { + -0.000349f, +0.001367f, +0.001579f, -0.000878f, +0.000039f, -0.000225f, +0.000056f, +0.000234f, +0.000115f, -0.000186f, + -0.000344f, -0.000119f, +0.000224f, +0.001370f, -0.005161f, -0.001728f, -0.001516f, -0.001132f, +0.000886f, +0.001805f, + +0.002248f, +0.000862f, +0.000324f, -0.000032f, -0.000771f, -0.000668f, -0.000309f, -0.000221f, -0.000891f, +0.001336f, + -0.000658f, -0.000287f, +0.000430f, -0.000523f, +0.000434f, +0.000005f, -0.000222f, +0.000399f, +0.000086f, +0.000156f, + +0.000410f, +0.000098f, -0.000163f, +0.000252f, +0.000155f, +0.000146f, -0.000010f, +0.000047f, +0.000083f, +0.000196f, + +0.000036f, +0.000006f, -0.000104f, +0.000072f, +0.000091f, -0.000161f, +0.000224f, +0.000088f, +0.000077f, -0.000017f, + -0.000111f, -0.000177f, -0.000061f, -0.000248f, -0.000120f, +0.000001f, -0.000121f, -0.000046f, +0.000143f, -0.000113f, + -0.000010f, -0.000113f, -0.000051f, +0.000123f, +0.000115f, -0.000071f, -0.000047f, +0.000029f, -0.000022f, +0.000025f, + +0.000008f, -0.000116f, -0.000025f, +0.000025f, +0.000023f, +0.000037f, +0.000094f, +0.000049f, -0.000026f, -0.000052f, + +0.000021f, -0.000017f, -0.000003f, +0.000030f, +0.000031f, +0.000034f + }, + { + -0.001782f, -0.001779f, +0.001497f, +0.001844f, +0.000449f, +0.000795f, +0.000929f, +0.000284f, +0.000330f, +0.000903f, + +0.000284f, -0.000249f, -0.000065f, -0.001047f, +0.000268f, -0.000081f, +0.001085f, +0.001292f, +0.000636f, -0.000365f, + -0.000164f, +0.000085f, +0.000071f, -0.000102f, +0.000220f, -0.000220f, +0.000084f, -0.000142f, +0.000125f, +0.000048f, + -0.000039f, +0.000247f, -0.000063f, +0.000714f, -0.000238f, +0.000194f, -0.000149f, +0.000002f, -0.000052f, +0.000103f, + +0.000201f, +0.000492f, +0.000010f, -0.000232f, +0.000416f, +0.000328f, +0.000058f, -0.000033f, +0.000055f, +0.000267f, + +0.000205f, -0.000025f, +0.000263f, +0.000003f, -0.000277f, -0.000031f, +0.000114f, -0.000064f, +0.000005f, -0.000092f, + -0.000015f, +0.000095f, -0.000022f, +0.000030f, -0.000092f, +0.000007f, +0.000025f, -0.000077f, +0.000058f, +0.000053f, + -0.000012f, -0.000013f, +0.000061f, +0.000020f, +0.000014f, -0.000009f, +0.000040f, -0.000059f, +0.000000f, +0.000007f, + -0.000109f, -0.000011f, +0.000077f, +0.000016f, +0.000054f, +0.000110f, +0.000054f, +0.000019f, +0.000068f, +0.000012f, + +0.000012f, -0.000031f, -0.000054f, +0.000003f, +0.000033f, +0.000042f + }, + { + +0.000721f, +0.007490f, -0.001892f, +0.000313f, +0.000346f, +0.000344f, -0.000200f, -0.000746f, +0.000096f, +0.000485f, + +0.000668f, -0.000597f, +0.000231f, -0.000332f, +0.000665f, +0.000261f, -0.000613f, -0.000534f, +0.000091f, -0.001161f, + -0.001406f, -0.000281f, +0.000183f, +0.000101f, -0.000291f, +0.000316f, -0.000193f, -0.000246f, +0.000089f, -0.000066f, + +0.000026f, +0.000020f, -0.000210f, -0.000149f, +0.000302f, +0.000063f, -0.000470f, -0.000250f, -0.000055f, -0.000132f, + -0.000084f, -0.000038f, +0.000225f, +0.000007f, -0.000092f, +0.000078f, -0.000101f, -0.000025f, +0.000153f, +0.000100f, + +0.000114f, +0.000044f, -0.000251f, -0.000186f, -0.000087f, +0.000021f, +0.000045f, +0.000136f, +0.000019f, -0.000005f, + +0.000122f, +0.000038f, -0.000190f, -0.000076f, +0.000106f, -0.000005f, +0.000047f, +0.000143f, +0.000021f, -0.000022f, + -0.000060f, -0.000062f, -0.000014f, +0.000057f, +0.000014f, -0.000046f, -0.000041f, -0.000133f, -0.000001f, +0.000040f, + -0.000028f, +0.000070f, +0.000033f, -0.000102f, -0.000072f, -0.000003f, -0.000045f, +0.000014f, -0.000051f, -0.000039f, + +0.000021f, -0.000019f, -0.000011f, +0.000004f, +0.000034f, -0.000011f + }, + { + -0.004348f, -0.021608f, -0.000911f, -0.000195f, +0.000642f, -0.000394f, -0.000037f, +0.000741f, -0.000315f, +0.000134f, + -0.000542f, -0.000674f, +0.000101f, -0.000187f, -0.000582f, -0.000212f, +0.000256f, -0.000300f, +0.000133f, +0.000290f, + -0.000143f, +0.000511f, +0.000056f, -0.000306f, +0.000316f, +0.000079f, +0.000179f, +0.000199f, +0.000133f, -0.000134f, + -0.000051f, -0.000172f, -0.000646f, +0.000104f, -0.000326f, -0.000278f, -0.000441f, -0.000384f, -0.000095f, +0.000295f, + +0.000095f, -0.000031f, -0.000433f, -0.000006f, -0.000253f, -0.000122f, -0.000196f, +0.000112f, +0.000087f, +0.000111f, + +0.000149f, -0.000032f, +0.000157f, -0.000134f, -0.000013f, -0.000008f, -0.000046f, +0.000046f, -0.000132f, +0.000013f, + +0.000194f, -0.000053f, -0.000102f, +0.000146f, -0.000040f, -0.000088f, -0.000069f, -0.000053f, -0.000067f, +0.000150f, + -0.000008f, -0.000047f, +0.000032f, +0.000068f, +0.000065f, -0.000010f, -0.000021f, -0.000033f, -0.000042f, -0.000001f, + +0.000017f, +0.000085f, +0.000046f, -0.000028f, +0.000057f, -0.000044f, -0.000020f, +0.000013f, -0.000021f, +0.000034f, + +0.000028f, +0.000053f, +0.000053f, -0.000027f, -0.000006f, +0.000037f + }, + { + +0.000234f, -0.000057f, -0.000768f, +0.000800f, +0.000156f, +0.000268f, -0.000070f, -0.000417f, -0.000017f, +0.000196f, + +0.000030f, -0.000592f, -0.002493f, +0.003631f, -0.000581f, +0.003327f, -0.001538f, -0.000320f, +0.000970f, +0.000427f, + -0.002064f, +0.000111f, -0.001021f, -0.000325f, +0.000181f, +0.000390f, +0.000195f, +0.000365f, +0.000299f, +0.001021f, + -0.000964f, -0.000461f, -0.000423f, -0.000335f, -0.000022f, -0.000466f, +0.000181f, -0.000002f, -0.000217f, +0.000318f, + -0.000134f, +0.000310f, -0.000008f, -0.000057f, -0.000202f, +0.000004f, +0.000117f, +0.000185f, -0.000169f, +0.000123f, + +0.000064f, +0.000250f, +0.000072f, -0.000135f, +0.000060f, +0.000182f, -0.000150f, -0.000041f, +0.000002f, -0.000215f, + -0.000209f, +0.000195f, +0.000123f, -0.000012f, -0.000054f, -0.000073f, +0.000043f, -0.000143f, +0.000075f, +0.000041f, + -0.000007f, -0.000060f, +0.000066f, -0.000018f, +0.000068f, +0.000115f, +0.000049f, -0.000041f, +0.000008f, +0.000034f, + -0.000083f, -0.000109f, -0.000037f, -0.000045f, -0.000005f, -0.000023f, +0.000050f, +0.000034f, -0.000037f, -0.000015f, + -0.000034f, +0.000054f, +0.000112f, -0.000033f, +0.000008f, +0.000061f + }, + { + +0.001021f, +0.009273f, -0.000757f, -0.001584f, -0.000064f, +0.000593f, -0.000211f, +0.000217f, +0.000205f, +0.000021f, + +0.000101f, +0.000140f, -0.000158f, -0.000066f, -0.000125f, -0.000894f, -0.000833f, +0.000069f, +0.000181f, +0.000202f, + -0.000338f, +0.000288f, +0.000151f, +0.000441f, +0.001035f, -0.000240f, +0.000038f, -0.000334f, +0.000879f, +0.000598f, + -0.000241f, -0.000304f, +0.000095f, -0.000260f, -0.000177f, -0.000052f, -0.000170f, -0.000191f, -0.000166f, +0.000050f, + -0.000147f, -0.000220f, +0.000073f, -0.000237f, -0.000142f, -0.000352f, -0.000333f, -0.000003f, +0.000072f, +0.000306f, + -0.000037f, -0.000144f, +0.000276f, +0.000060f, -0.000215f, -0.000213f, -0.000054f, +0.000110f, +0.000029f, -0.000006f, + +0.000077f, -0.000066f, -0.000028f, -0.000121f, -0.000043f, -0.000092f, -0.000055f, +0.000039f, +0.000019f, -0.000002f, + +0.000030f, +0.000038f, -0.000009f, -0.000026f, -0.000077f, -0.000055f, +0.000022f, +0.000049f, -0.000118f, -0.000076f, + +0.000016f, +0.000022f, -0.000080f, -0.000060f, +0.000008f, -0.000057f, +0.000014f, +0.000106f, -0.000016f, -0.000021f, + +0.000026f, -0.000020f, -0.000035f, -0.000015f, +0.000025f, +0.000023f + }, + { + +0.000402f, -0.001495f, -0.001884f, +0.000316f, +0.000187f, -0.000004f, +0.000133f, -0.000198f, +0.000779f, -0.000423f, + -0.000383f, -0.000053f, -0.000099f, -0.006940f, +0.005274f, +0.003584f, -0.001893f, -0.001726f, -0.000507f, -0.000222f, + -0.000317f, +0.000845f, +0.000112f, +0.000691f, +0.000712f, +0.000036f, +0.000573f, +0.000641f, +0.000972f, +0.000666f, + +0.000079f, -0.000058f, +0.000220f, +0.000307f, -0.000486f, +0.000185f, +0.000772f, -0.000150f, +0.000058f, -0.000076f, + +0.000320f, +0.000493f, +0.000083f, -0.000481f, +0.000055f, -0.000018f, -0.000238f, -0.000189f, +0.000001f, +0.000028f, + -0.000145f, +0.000179f, +0.000289f, -0.000047f, +0.000034f, -0.000054f, +0.000176f, +0.000012f, +0.000210f, +0.000281f, + +0.000139f, -0.000159f, -0.000045f, +0.000121f, +0.000038f, -0.000006f, -0.000229f, +0.000004f, +0.000073f, +0.000024f, + -0.000057f, +0.000039f, +0.000148f, -0.000018f, +0.000057f, -0.000063f, -0.000064f, +0.000060f, +0.000025f, +0.000003f, + -0.000087f, -0.000061f, -0.000062f, +0.000037f, +0.000070f, -0.000007f, +0.000039f, -0.000016f, -0.000072f, -0.000008f, + +0.000005f, -0.000043f, +0.000015f, +0.000038f, -0.000011f, -0.000042f + } + } +}; + +const float rightBRIRReal[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS_MAX]= +{ + { + { + -0.002626f, -0.091984f, +0.112454f, +0.032889f, -0.018787f, +0.020135f, -0.040166f, -0.046445f, -0.039117f, +0.013418f, + +0.017182f, +0.006263f, +0.051753f, +0.017991f, -0.017273f, -0.014571f, +0.004824f, +0.045673f, +0.002516f, -0.028876f, + -0.018614f, -0.000233f, -0.014210f, -0.000345f, -0.033314f, -0.000234f, -0.008287f, +0.014615f, +0.002657f, +0.041244f, + +0.007988f, +0.000967f, -0.016643f, +0.002161f, +0.018013f, -0.005292f, -0.019658f, -0.004553f, +0.015985f, +0.024332f, + +0.012325f, -0.028393f, -0.036958f, +0.000012f, +0.014259f, +0.004401f, -0.001464f, -0.006581f, +0.006742f, -0.020979f, + -0.003024f, +0.005075f, +0.001263f, +0.003405f, +0.001322f, +0.008734f, +0.016774f, +0.016192f, +0.004745f, -0.003023f, + -0.001688f, -0.000306f, +0.000506f, -0.010260f, -0.007314f, -0.009882f, -0.012185f, -0.022195f, -0.005114f, -0.001018f, + +0.009550f, +0.008692f, +0.008496f, +0.004482f, +0.011601f, +0.010002f, +0.006993f, +0.004236f, +0.002123f, -0.001852f, + +0.000104f, -0.005423f, -0.004225f, -0.008126f, -0.009280f, -0.004170f, -0.001537f, -0.004997f, -0.008491f, +0.005719f, + +0.006197f, +0.003095f, +0.000349f, +0.000155f, +0.003755f, +0.002206f + }, + { + +0.004919f, -0.095386f, +0.124053f, -0.015697f, +0.035913f, -0.018521f, -0.036348f, -0.052516f, -0.013161f, +0.009784f, + +0.008901f, +0.036876f, +0.038571f, +0.004469f, -0.025103f, +0.016424f, -0.009310f, +0.049941f, -0.022953f, -0.022712f, + +0.003293f, -0.027499f, -0.015957f, -0.003968f, -0.007109f, -0.014544f, +0.000560f, +0.031722f, +0.010526f, +0.006277f, + +0.000365f, -0.005303f, -0.007273f, +0.008598f, +0.024339f, +0.006596f, -0.022474f, -0.005834f, +0.010760f, +0.013438f, + +0.000540f, -0.020743f, -0.009388f, +0.007212f, -0.006048f, -0.015220f, +0.009370f, +0.004605f, -0.001744f, -0.009482f, + -0.008456f, -0.002932f, +0.003339f, +0.002680f, +0.000756f, +0.019608f, +0.011465f, +0.009581f, +0.006395f, +0.010447f, + -0.000806f, -0.005562f, -0.007976f, -0.004493f, -0.011419f, -0.015257f, -0.015816f, -0.017768f, -0.003138f, +0.001517f, + +0.001753f, +0.009699f, +0.013487f, +0.010184f, +0.017604f, +0.011297f, +0.008167f, +0.006076f, -0.003928f, -0.009072f, + -0.003002f, -0.005302f, -0.008729f, -0.012691f, -0.005865f, +0.000469f, -0.002336f, -0.002416f, +0.001988f, +0.001768f, + +0.006487f, +0.002197f, -0.001045f, +0.003595f, -0.000533f, -0.000087f + }, + { + +0.002371f, -0.102239f, +0.130602f, -0.012847f, +0.031526f, -0.001903f, -0.067157f, -0.018273f, +0.003170f, -0.025677f, + +0.010545f, +0.020547f, +0.038030f, +0.001859f, +0.009985f, +0.008685f, -0.011709f, +0.009396f, +0.002348f, -0.001855f, + +0.007032f, +0.006271f, -0.024756f, -0.023850f, -0.032530f, -0.026169f, -0.038805f, +0.018433f, +0.043789f, +0.056149f, + +0.008966f, -0.000807f, +0.013400f, -0.004701f, -0.015611f, -0.007087f, +0.005971f, -0.004905f, -0.013002f, -0.001660f, + +0.025840f, +0.002527f, -0.015595f, -0.010920f, +0.003142f, +0.003172f, +0.000238f, -0.022082f, -0.017089f, -0.007475f, + -0.002722f, +0.011160f, +0.015255f, +0.003771f, +0.014825f, -0.000794f, -0.009696f, +0.017684f, +0.032232f, +0.016622f, + -0.003140f, -0.007946f, -0.012051f, -0.002400f, -0.011365f, -0.019873f, -0.011785f, -0.022991f, -0.012280f, -0.015610f, + -0.001900f, +0.015175f, +0.011841f, +0.014766f, +0.018579f, +0.015310f, +0.017258f, +0.010536f, +0.005214f, -0.000988f, + -0.009193f, -0.010375f, -0.011902f, -0.005221f, -0.006926f, -0.010096f, -0.009423f, +0.001378f, +0.010446f, +0.003376f, + -0.003868f, +0.001471f, -0.001449f, -0.003910f, -0.005467f, -0.003336f + }, + { + +0.000564f, -0.066587f, +0.087062f, +0.026248f, -0.024360f, +0.015070f, -0.024941f, -0.024942f, -0.043150f, -0.032055f, + +0.040954f, +0.018554f, +0.062695f, +0.004183f, +0.004934f, -0.024908f, -0.038268f, +0.026678f, +0.016424f, -0.006447f, + -0.001552f, -0.020931f, -0.019639f, +0.011155f, +0.021935f, -0.029200f, -0.023702f, +0.022973f, +0.012058f, +0.011795f, + -0.007980f, +0.005958f, +0.013033f, -0.017547f, +0.001049f, +0.007811f, +0.003803f, +0.000334f, +0.001290f, -0.002987f, + +0.007679f, -0.012197f, -0.012133f, +0.007014f, -0.006724f, -0.004298f, -0.001449f, +0.009421f, -0.000027f, -0.010373f, + +0.014766f, +0.004202f, -0.009704f, +0.000081f, -0.000714f, +0.003343f, +0.004317f, +0.000603f, +0.006223f, +0.000140f, + -0.005321f, -0.003893f, +0.005639f, +0.000074f, -0.007684f, -0.003903f, +0.000882f, +0.000788f, -0.012462f, -0.004038f, + +0.006968f, +0.006532f, +0.005018f, +0.005665f, +0.000488f, +0.001809f, -0.004227f, +0.005507f, +0.001594f, -0.004166f, + -0.001945f, +0.000937f, -0.000895f, -0.002800f, -0.001256f, -0.000284f, -0.004216f, -0.005711f, +0.001721f, +0.002112f, + -0.000916f, +0.000115f, +0.000567f, +0.007798f, +0.002932f, +0.002671f + }, + { + +0.001666f, -0.041376f, +0.097623f, -0.052418f, +0.036112f, -0.012835f, -0.024260f, -0.038437f, -0.026326f, -0.023128f, + +0.040447f, +0.036446f, +0.039993f, +0.018840f, -0.012233f, -0.011276f, -0.029095f, +0.030939f, -0.015488f, -0.000699f, + -0.000699f, -0.038556f, -0.035968f, +0.056013f, +0.015707f, -0.041508f, -0.012167f, +0.027488f, +0.040874f, -0.008169f, + -0.024412f, +0.014149f, -0.011409f, -0.010785f, +0.012658f, -0.003709f, -0.007668f, +0.023531f, +0.005853f, +0.001764f, + -0.001855f, -0.011050f, -0.007934f, +0.010609f, -0.001228f, -0.017845f, -0.013191f, +0.002377f, +0.022763f, +0.001753f, + -0.006159f, +0.002132f, -0.011970f, +0.008922f, +0.004841f, -0.008873f, +0.011393f, +0.008069f, +0.003166f, +0.000949f, + -0.013549f, +0.002975f, +0.004332f, -0.003866f, -0.003245f, -0.011883f, -0.008549f, -0.004174f, +0.005358f, -0.002642f, + +0.004272f, +0.005506f, +0.012704f, +0.006268f, +0.007150f, +0.004407f, -0.001985f, -0.005593f, -0.003597f, -0.009715f, + -0.004237f, +0.000923f, -0.001200f, -0.000261f, +0.000253f, +0.000017f, -0.004304f, -0.001286f, +0.002442f, +0.002595f, + -0.001585f, +0.001289f, -0.000935f, +0.002463f, +0.002901f, +0.004676f + }, + { + -0.004050f, -0.073050f, +0.096420f, +0.040655f, -0.036664f, +0.017952f, -0.020075f, -0.045128f, -0.037587f, +0.001975f, + +0.002725f, -0.003929f, +0.046383f, +0.083217f, +0.005472f, +0.016851f, -0.074807f, -0.020715f, -0.003260f, +0.022054f, + -0.015679f, -0.043455f, -0.032602f, +0.073273f, +0.011045f, +0.025909f, -0.034716f, -0.014683f, -0.001407f, -0.011081f, + +0.004575f, +0.060003f, +0.005990f, -0.018629f, -0.022468f, -0.010518f, +0.008302f, +0.012123f, -0.000264f, -0.008743f, + -0.034883f, +0.025522f, +0.013887f, -0.019726f, -0.014578f, +0.006546f, +0.015123f, +0.001403f, +0.008514f, +0.007104f, + +0.006983f, -0.000170f, +0.011973f, -0.001818f, -0.006791f, -0.014751f, -0.019580f, -0.009661f, +0.001487f, -0.001793f, + -0.007205f, -0.001120f, +0.004357f, +0.013158f, +0.011712f, +0.005776f, -0.005371f, -0.001393f, +0.004069f, +0.009914f, + +0.002459f, +0.010826f, -0.001358f, -0.001234f, -0.007199f, -0.005368f, -0.012194f, -0.009313f, -0.005590f, -0.000329f, + -0.005369f, +0.005234f, +0.010834f, +0.006705f, +0.004616f, -0.002623f, -0.008596f, -0.002714f, +0.001302f, +0.004940f, + +0.004725f, +0.005621f, +0.002327f, -0.000822f, -0.002757f, +0.000967f + }, + { + +0.001269f, -0.038460f, +0.104052f, -0.069352f, +0.049874f, -0.022910f, -0.029584f, -0.031089f, -0.030876f, +0.004071f, + -0.005977f, +0.020708f, +0.094485f, +0.029371f, +0.019354f, -0.030412f, -0.070395f, -0.011234f, +0.030981f, +0.017226f, + -0.041039f, -0.045879f, +0.002071f, +0.027306f, +0.021226f, +0.026577f, -0.016963f, -0.011802f, +0.003393f, -0.004777f, + -0.006079f, +0.039185f, +0.019401f, -0.029855f, -0.025531f, +0.011340f, +0.010572f, -0.007136f, -0.003117f, -0.019577f, + -0.010488f, +0.016309f, +0.009123f, +0.001297f, -0.002883f, -0.002108f, +0.011125f, -0.007347f, -0.000416f, +0.014537f, + +0.014730f, +0.001136f, +0.004673f, +0.000268f, -0.013320f, -0.023244f, -0.011374f, -0.004133f, +0.002617f, -0.011766f, + -0.002675f, +0.007823f, +0.010544f, +0.003291f, +0.006354f, +0.006199f, -0.001065f, -0.003185f, +0.007126f, +0.003557f, + +0.008914f, +0.008229f, -0.002392f, -0.000366f, -0.011420f, -0.006384f, -0.005386f, -0.007969f, -0.004933f, -0.003720f, + -0.002352f, +0.005145f, +0.004786f, +0.006877f, +0.002937f, +0.000685f, -0.004972f, -0.004256f, +0.001242f, +0.005907f, + -0.000379f, +0.002987f, +0.004985f, -0.002592f, +0.000295f, -0.003449f + }, + { + -0.004157f, -0.060323f, +0.083203f, +0.039794f, -0.036717f, +0.020897f, -0.025007f, -0.034272f, -0.031072f, -0.024760f, + -0.000998f, +0.022314f, +0.070542f, +0.049464f, -0.038618f, +0.019768f, -0.036649f, +0.029468f, +0.010225f, -0.047899f, + -0.027133f, -0.018283f, -0.014402f, -0.027981f, +0.067339f, +0.068939f, -0.016976f, -0.070859f, +0.021392f, -0.014830f, + +0.017421f, +0.030413f, +0.021651f, -0.006659f, -0.025694f, -0.001340f, +0.002116f, -0.003434f, -0.017647f, +0.002407f, + -0.018175f, -0.009812f, +0.013525f, +0.014872f, -0.003068f, -0.006386f, -0.001761f, +0.026296f, +0.010537f, -0.007237f, + -0.003080f, +0.020031f, +0.022122f, -0.005348f, -0.017106f, -0.014774f, -0.018287f, -0.028999f, -0.010723f, +0.012706f, + -0.005548f, -0.004651f, +0.009074f, +0.010528f, +0.013573f, +0.018056f, +0.014532f, -0.010693f, -0.010059f, +0.013080f, + +0.011388f, +0.004481f, -0.003305f, -0.005373f, -0.008468f, -0.004419f, -0.018445f, -0.018167f, -0.004965f, +0.002231f, + +0.002270f, +0.009652f, +0.007305f, +0.009093f, +0.002598f, -0.001868f, -0.007371f, -0.004179f, +0.007021f, +0.011871f, + +0.004523f, +0.006646f, -0.000097f, -0.007227f, -0.006826f, -0.002948f + }, + { + +0.000941f, -0.044094f, +0.109804f, -0.073937f, +0.055858f, -0.020020f, -0.035497f, -0.037051f, -0.023878f, +0.000226f, + -0.009250f, +0.061056f, +0.070502f, +0.009437f, -0.009815f, -0.008946f, -0.024591f, +0.032256f, -0.031037f, -0.032700f, + -0.024210f, +0.010421f, -0.028830f, -0.021243f, +0.079933f, +0.010727f, +0.006359f, -0.055370f, +0.013295f, +0.029021f, + +0.026940f, -0.016967f, -0.013493f, +0.026264f, -0.015633f, -0.009662f, +0.007789f, -0.004763f, -0.021226f, -0.028899f, + +0.002391f, +0.007813f, +0.003190f, +0.021845f, -0.005564f, -0.003680f, +0.010593f, +0.012747f, +0.006321f, +0.005903f, + -0.002617f, +0.009340f, +0.016941f, +0.008451f, -0.024435f, -0.017691f, -0.025645f, -0.031341f, -0.008820f, +0.003859f, + +0.004534f, +0.011937f, +0.011547f, +0.004280f, +0.003822f, +0.021157f, +0.006229f, -0.005379f, +0.003404f, +0.003844f, + +0.013751f, +0.004010f, +0.000249f, -0.013736f, -0.016171f, -0.002333f, -0.011896f, -0.008191f, -0.006236f, -0.001770f, + +0.006106f, +0.007203f, +0.005697f, +0.004779f, +0.002075f, -0.002754f, -0.003636f, -0.000180f, +0.002136f, +0.010256f, + +0.005555f, -0.000734f, +0.001710f, -0.002561f, -0.003573f, -0.003050f + }, + { + +0.002190f, -0.089866f, +0.114820f, +0.027895f, -0.010424f, -0.065978f, +0.002761f, +0.007385f, +0.016021f, -0.038197f, + -0.017028f, +0.035990f, +0.008253f, -0.019622f, +0.012206f, +0.027197f, -0.003262f, -0.011867f, +0.038914f, -0.009334f, + +0.028961f, +0.002318f, -0.024548f, -0.028802f, -0.052649f, -0.025898f, +0.008610f, +0.000557f, +0.022862f, +0.020252f, + +0.010404f, +0.017997f, -0.002086f, -0.015251f, +0.017789f, +0.000507f, -0.003808f, +0.006473f, +0.022842f, +0.001650f, + -0.012254f, -0.030566f, -0.024494f, -0.009148f, +0.018401f, +0.007228f, +0.034694f, -0.000505f, +0.004019f, -0.033861f, + -0.026367f, +0.003587f, -0.000949f, +0.012101f, +0.013697f, +0.017073f, +0.003288f, -0.013361f, -0.002429f, -0.008061f, + -0.005454f, +0.014690f, +0.018759f, +0.006268f, +0.000432f, -0.009994f, -0.009049f, -0.005162f, -0.008237f, -0.009102f, + -0.005555f, -0.007982f, -0.004440f, -0.000137f, +0.014733f, +0.011790f, +0.009120f, +0.004697f, +0.008027f, +0.008908f, + +0.000566f, -0.007040f, -0.004159f, -0.003113f, -0.001064f, -0.005748f, -0.008081f, -0.005662f, -0.010267f, +0.000977f, + +0.003994f, +0.000701f, +0.005608f, +0.003190f, +0.002403f, -0.002453f + }, + { + +0.002988f, -0.049390f, +0.099889f, -0.013724f, -0.018414f, -0.089835f, +0.068462f, -0.001002f, -0.005412f, -0.021757f, + -0.003411f, +0.049304f, -0.006413f, -0.021428f, +0.034330f, -0.025512f, +0.010371f, -0.006968f, +0.029931f, -0.025688f, + +0.014086f, -0.017538f, -0.020421f, -0.014991f, -0.037334f, +0.034980f, +0.009581f, +0.025207f, -0.002760f, +0.042903f, + -0.045553f, +0.016406f, -0.010670f, +0.008019f, +0.018439f, -0.007156f, -0.004478f, -0.000203f, -0.007345f, -0.012330f, + -0.015364f, -0.014996f, -0.004558f, +0.009168f, +0.019567f, +0.019055f, +0.023773f, -0.006824f, -0.018919f, +0.003844f, + -0.034060f, -0.016853f, +0.020352f, +0.017607f, +0.006138f, +0.012604f, -0.001888f, +0.000635f, -0.014635f, -0.002884f, + -0.003097f, +0.002616f, +0.004431f, +0.005792f, -0.012535f, -0.009041f, -0.003033f, +0.002739f, +0.000431f, +0.006339f, + +0.001078f, +0.001648f, -0.004795f, +0.001085f, +0.008090f, +0.004383f, +0.003342f, +0.001445f, +0.002241f, +0.000329f, + -0.002384f, -0.006953f, -0.009799f, -0.005643f, +0.003041f, -0.002914f, +0.001954f, +0.000433f, -0.002751f, +0.005194f, + +0.005162f, +0.001823f, +0.004406f, +0.001330f, -0.002383f, -0.002361f + }, + { + +0.000436f, -0.087446f, +0.121313f, +0.024718f, -0.025816f, -0.044646f, -0.009521f, +0.037450f, -0.023468f, -0.010725f, + -0.083993f, +0.067398f, +0.019467f, +0.014747f, +0.067784f, +0.008986f, -0.047529f, -0.029258f, +0.012877f, -0.042138f, + +0.014017f, -0.001170f, +0.001656f, +0.027947f, -0.037599f, +0.027201f, +0.013888f, -0.011305f, -0.025074f, -0.013492f, + +0.025294f, +0.009986f, +0.015165f, +0.008862f, -0.025397f, -0.031433f, +0.004222f, -0.000681f, +0.005335f, -0.009622f, + +0.010093f, +0.026943f, +0.002413f, -0.001957f, +0.019931f, +0.008270f, +0.000297f, +0.000053f, +0.002812f, +0.001075f, + -0.031715f, -0.023720f, -0.004165f, -0.011659f, -0.012853f, -0.013113f, +0.007493f, +0.010608f, +0.007707f, +0.035684f, + +0.013493f, +0.002546f, -0.014085f, -0.002349f, +0.005312f, -0.004030f, -0.012415f, +0.014143f, +0.015080f, -0.000651f, + -0.005964f, +0.001450f, +0.003833f, -0.007555f, -0.018156f, -0.006858f, -0.012725f, -0.007952f, -0.002141f, +0.005255f, + +0.002882f, +0.002468f, +0.004662f, +0.011014f, +0.006481f, +0.010711f, +0.012227f, +0.006496f, -0.001234f, -0.002674f, + -0.002832f, -0.009746f, -0.012441f, -0.008285f, -0.008948f, -0.004024f + }, + { + -0.007397f, -0.017761f, +0.081072f, -0.018595f, -0.031152f, -0.055820f, +0.056058f, +0.002859f, -0.018669f, -0.022159f, + -0.054689f, +0.075668f, -0.006481f, +0.061680f, +0.024949f, -0.019871f, -0.039919f, +0.003876f, -0.014460f, -0.027331f, + +0.016988f, -0.002039f, +0.016271f, -0.009324f, -0.018518f, +0.017239f, +0.023176f, +0.003393f, -0.027990f, -0.004303f, + +0.010276f, +0.014052f, +0.010346f, +0.005351f, -0.019770f, -0.036977f, -0.023701f, +0.013798f, +0.006538f, -0.014372f, + +0.032580f, +0.026711f, +0.029195f, -0.028315f, +0.017284f, +0.020758f, -0.010578f, -0.008527f, +0.003346f, -0.004393f, + -0.018071f, -0.029349f, -0.018974f, -0.007902f, -0.013854f, -0.003130f, +0.022807f, +0.006027f, +0.017396f, +0.017145f, + +0.003645f, +0.002277f, -0.004889f, +0.000591f, +0.003927f, -0.004036f, +0.002614f, +0.019514f, +0.000021f, -0.007769f, + -0.000153f, -0.004977f, -0.001780f, -0.007824f, -0.010163f, -0.006285f, -0.014498f, -0.008555f, -0.001908f, +0.004746f, + +0.005369f, +0.008628f, +0.009793f, +0.010248f, +0.006463f, +0.007293f, +0.005515f, -0.000864f, +0.000535f, +0.000123f, + -0.003258f, -0.004441f, -0.010192f, -0.010172f, -0.008089f, -0.004420f + }, + { + +0.002811f, -0.081316f, +0.115097f, +0.012186f, -0.006536f, -0.060388f, +0.008720f, +0.014165f, -0.013447f, -0.019596f, + -0.029051f, +0.020671f, +0.021437f, +0.045447f, -0.018790f, -0.003224f, +0.002091f, -0.007357f, -0.013631f, +0.020397f, + +0.010830f, +0.018342f, -0.022804f, -0.016874f, -0.009384f, +0.008478f, -0.019255f, -0.019837f, +0.006406f, +0.009260f, + -0.010485f, +0.020562f, +0.001700f, +0.002207f, -0.008287f, +0.043127f, -0.017300f, +0.029738f, -0.006732f, +0.014781f, + -0.022478f, -0.034911f, -0.017080f, +0.006116f, +0.000370f, +0.003263f, +0.029480f, +0.017696f, +0.003311f, -0.008238f, + -0.033850f, -0.004877f, -0.010342f, -0.011509f, +0.010972f, +0.010975f, +0.006128f, +0.002400f, +0.003616f, +0.010971f, + -0.001684f, -0.002428f, +0.011354f, +0.008068f, -0.003688f, -0.007101f, -0.008356f, -0.002072f, -0.011090f, -0.000310f, + +0.000124f, +0.001507f, -0.005044f, +0.001721f, +0.000906f, -0.001759f, -0.002204f, +0.000015f, +0.009049f, +0.005862f, + +0.005194f, +0.003749f, +0.000126f, +0.002832f, -0.004904f, +0.000994f, -0.004946f, -0.007446f, -0.006764f, +0.002219f, + -0.000288f, +0.000713f, -0.001430f, +0.002343f, -0.001700f, +0.002610f + }, + { + -0.006217f, -0.013388f, +0.067848f, -0.012897f, -0.021346f, -0.056777f, +0.053953f, -0.015433f, -0.021452f, +0.011208f, + -0.032609f, +0.013694f, +0.060868f, -0.009873f, -0.012618f, +0.031967f, -0.018713f, -0.024377f, +0.010406f, +0.004159f, + +0.000413f, +0.002984f, +0.002455f, -0.020324f, -0.022209f, +0.010644f, +0.006718f, +0.003857f, +0.000984f, -0.000327f, + -0.014605f, +0.006520f, +0.005370f, -0.004400f, -0.016379f, +0.020798f, +0.009098f, +0.004721f, +0.017005f, +0.015857f, + -0.009999f, -0.025020f, -0.013240f, +0.011309f, -0.018543f, +0.008244f, +0.008220f, +0.018936f, -0.007838f, -0.008121f, + -0.023962f, -0.005177f, +0.000315f, -0.002577f, +0.010816f, +0.011817f, +0.012248f, -0.002520f, +0.003026f, -0.011318f, + +0.000127f, +0.000269f, +0.002225f, +0.006403f, +0.004370f, -0.005433f, +0.003213f, +0.000365f, -0.009226f, -0.003653f, + -0.001362f, -0.000316f, -0.002569f, -0.000611f, +0.000898f, +0.001198f, -0.005630f, -0.002840f, +0.008469f, +0.006670f, + +0.000974f, +0.003762f, +0.000868f, +0.003725f, -0.002653f, -0.000927f, -0.002855f, -0.007487f, -0.002664f, -0.003302f, + +0.002723f, -0.002561f, +0.001210f, -0.001676f, +0.002342f, -0.000985f + } + }, + { + { + +0.005007f, -0.014294f, +0.110044f, +0.046944f, +0.016024f, +0.011647f, -0.012991f, +0.004501f, -0.001118f, +0.013586f, + +0.001506f, -0.019113f, +0.004169f, -0.012622f, +0.001476f, -0.014243f, -0.027496f, +0.018652f, +0.005031f, -0.008627f, + +0.006046f, +0.023982f, -0.002206f, -0.001958f, -0.036236f, -0.011195f, -0.022668f, +0.002652f, -0.015114f, +0.022833f, + +0.002723f, +0.005492f, -0.000626f, -0.003848f, -0.003069f, -0.009132f, +0.007504f, -0.000048f, -0.002998f, -0.004407f, + -0.012143f, -0.002503f, -0.008794f, +0.004562f, +0.004359f, -0.005565f, -0.005226f, -0.002670f, +0.007515f, -0.015540f, + +0.001064f, +0.002934f, -0.002818f, +0.000334f, -0.004728f, +0.005334f, +0.011133f, +0.000154f, -0.007129f, +0.000572f, + +0.008698f, +0.008950f, +0.003266f, -0.006376f, +0.002223f, -0.000157f, +0.000412f, -0.004737f, +0.006144f, +0.001505f, + +0.010013f, +0.005736f, +0.003437f, +0.002416f, +0.003534f, -0.001922f, -0.001646f, -0.000660f, +0.003488f, +0.001155f, + +0.005753f, -0.000099f, +0.002361f, +0.003075f, -0.002459f, -0.002764f, -0.001349f, -0.003467f, -0.004264f, -0.000113f, + -0.000494f, +0.001684f, +0.001383f, +0.001405f, +0.002248f, -0.000626f + }, + { + -0.010661f, -0.226958f, -0.039330f, +0.035432f, +0.067703f, -0.015417f, -0.021811f, -0.018302f, +0.014286f, +0.003720f, + +0.004485f, -0.000912f, +0.001274f, +0.002703f, +0.009506f, +0.039611f, -0.016936f, +0.013783f, -0.014929f, -0.012532f, + +0.004827f, -0.005742f, -0.005807f, -0.005952f, +0.008659f, +0.008796f, -0.006785f, +0.005139f, +0.010704f, +0.007342f, + +0.008798f, +0.007140f, -0.017032f, -0.003626f, +0.002174f, +0.007575f, +0.005938f, +0.005782f, +0.003120f, -0.001939f, + +0.003455f, +0.005330f, -0.004046f, -0.001499f, -0.004748f, -0.014842f, +0.000313f, +0.001749f, -0.001231f, +0.000927f, + -0.005349f, +0.003864f, +0.003092f, -0.005229f, -0.010377f, +0.004807f, +0.007327f, +0.005785f, -0.000682f, +0.001040f, + -0.005437f, +0.002077f, -0.006266f, -0.003555f, -0.000373f, -0.001372f, +0.000835f, -0.004330f, +0.003563f, +0.005433f, + -0.002271f, -0.003291f, -0.000257f, -0.001695f, +0.006182f, +0.002387f, +0.002883f, +0.002432f, -0.001584f, -0.008367f, + -0.002654f, +0.000220f, -0.001419f, -0.004196f, -0.000307f, -0.000867f, -0.001441f, +0.002475f, +0.002687f, -0.003347f, + -0.001142f, -0.001629f, -0.003005f, +0.001652f, +0.001143f, +0.002180f + }, + { + -0.003904f, -0.128268f, +0.056819f, +0.034048f, +0.065833f, +0.002597f, -0.022355f, +0.008635f, +0.020437f, +0.002492f, + +0.021072f, +0.001764f, +0.008189f, +0.000732f, +0.003402f, -0.015248f, -0.011867f, +0.002602f, +0.002638f, +0.006662f, + -0.009046f, -0.013159f, -0.011748f, +0.005864f, -0.003891f, +0.004868f, -0.028377f, -0.000605f, -0.007996f, -0.001501f, + -0.009691f, +0.011535f, +0.014757f, -0.002534f, -0.011747f, -0.008804f, +0.000437f, +0.000233f, +0.005697f, +0.005970f, + +0.006531f, -0.005792f, +0.000343f, +0.003957f, +0.005200f, +0.001785f, -0.002213f, -0.006338f, +0.009348f, +0.009263f, + -0.008968f, -0.003540f, +0.003624f, -0.008391f, +0.005260f, -0.004026f, -0.004321f, +0.008644f, +0.007187f, -0.003612f, + -0.002761f, +0.005067f, +0.002512f, +0.002308f, -0.005194f, -0.007001f, +0.003274f, -0.002906f, +0.005009f, -0.001143f, + -0.000405f, +0.003959f, -0.001293f, -0.000256f, +0.001103f, -0.001553f, +0.001819f, +0.000327f, +0.000827f, +0.002558f, + +0.001188f, +0.003886f, +0.000595f, +0.001412f, -0.003010f, -0.002038f, -0.003537f, -0.001970f, +0.002584f, -0.001905f, + -0.003888f, +0.002327f, +0.001235f, +0.001167f, -0.002725f, -0.003726f + }, + { + -0.000209f, -0.041404f, +0.068870f, +0.025763f, -0.013397f, -0.007942f, -0.012463f, +0.002279f, -0.012562f, -0.010816f, + +0.029104f, -0.002976f, +0.022616f, +0.007623f, -0.000736f, -0.034268f, -0.008299f, +0.030749f, -0.009134f, -0.019952f, + -0.004047f, -0.000809f, +0.022390f, +0.024536f, +0.005618f, -0.007251f, +0.008686f, +0.006303f, -0.007300f, -0.001053f, + -0.013642f, +0.016911f, +0.013417f, -0.010302f, +0.003241f, +0.010663f, +0.009922f, -0.000916f, -0.004534f, -0.006419f, + +0.008890f, +0.004414f, +0.005808f, +0.006580f, -0.017709f, -0.001445f, -0.001240f, +0.000500f, -0.002952f, -0.001085f, + +0.005523f, -0.010164f, -0.005468f, +0.004523f, +0.001402f, +0.005184f, +0.003731f, +0.000309f, -0.003477f, +0.003850f, + +0.006503f, +0.000348f, -0.004498f, -0.003955f, +0.001585f, +0.004769f, +0.003904f, +0.004910f, -0.002841f, -0.004237f, + +0.001414f, +0.000417f, +0.004320f, +0.005825f, -0.000843f, +0.001519f, -0.001605f, +0.003551f, +0.000841f, -0.000564f, + -0.000543f, +0.002252f, +0.000972f, +0.000243f, +0.001187f, +0.000414f, -0.001845f, +0.000391f, +0.004481f, +0.003052f, + +0.000141f, +0.000190f, +0.000689f, +0.005663f, +0.001417f, +0.000398f + }, + { + -0.002470f, -0.200808f, -0.052043f, -0.026054f, +0.073740f, +0.005175f, -0.006591f, -0.013563f, -0.014882f, -0.046509f, + +0.018616f, +0.002358f, +0.011460f, +0.008625f, -0.028832f, -0.009725f, -0.003909f, +0.042151f, +0.000886f, +0.016132f, + +0.006147f, -0.024842f, -0.038607f, +0.012764f, +0.005050f, -0.004909f, +0.005461f, -0.003956f, +0.005273f, +0.004115f, + -0.000252f, -0.000404f, -0.011114f, -0.006626f, -0.000087f, +0.005195f, +0.003721f, +0.008124f, -0.006342f, +0.000910f, + -0.005946f, -0.025783f, -0.019599f, +0.006167f, -0.004593f, +0.001395f, +0.012518f, +0.001395f, +0.009149f, -0.001322f, + +0.001151f, +0.016127f, +0.000653f, +0.011809f, +0.002667f, -0.008220f, -0.001678f, -0.014690f, -0.006773f, +0.001079f, + -0.004275f, +0.012939f, +0.009093f, -0.005287f, -0.007142f, -0.007014f, +0.003915f, -0.001932f, +0.004178f, -0.000859f, + +0.001416f, -0.006412f, -0.001941f, -0.001561f, +0.003059f, +0.004170f, +0.002890f, +0.002406f, +0.000614f, +0.001319f, + +0.005833f, +0.004831f, +0.000411f, +0.001949f, +0.002459f, -0.000877f, -0.004706f, -0.001664f, -0.002799f, -0.001859f, + -0.002201f, -0.000721f, -0.002234f, -0.000948f, -0.000872f, +0.002230f + }, + { + +0.005291f, +0.036362f, +0.134909f, +0.015235f, -0.035841f, -0.012534f, -0.005976f, -0.007681f, -0.006245f, +0.005963f, + -0.006982f, -0.012398f, -0.001794f, +0.016940f, -0.024493f, +0.020806f, -0.030480f, +0.003487f, -0.000300f, -0.020098f, + -0.030926f, -0.008255f, -0.007071f, +0.051267f, -0.033575f, -0.001858f, -0.008951f, +0.013960f, -0.006971f, -0.011475f, + -0.009663f, +0.018299f, -0.034787f, -0.011297f, +0.000718f, -0.008728f, -0.002894f, +0.010547f, -0.003397f, +0.007557f, + -0.012046f, +0.016150f, +0.001782f, -0.000415f, +0.008347f, +0.003378f, +0.006068f, +0.003349f, +0.004444f, +0.001470f, + -0.001064f, -0.008062f, +0.002677f, -0.000148f, +0.005141f, +0.007008f, -0.009314f, -0.017358f, -0.009249f, -0.001643f, + -0.004686f, +0.004903f, +0.007339f, +0.002735f, +0.006958f, +0.005934f, -0.005100f, -0.001072f, -0.000426f, +0.005784f, + +0.008665f, +0.010232f, +0.000867f, +0.001555f, -0.006387f, -0.000498f, -0.002121f, +0.001487f, +0.003393f, +0.004248f, + -0.000900f, +0.001918f, +0.001674f, -0.002298f, +0.001004f, +0.002684f, +0.000046f, -0.000040f, -0.002003f, -0.000482f, + +0.000215f, +0.000331f, -0.002483f, -0.000002f, -0.000862f, -0.000102f + }, + { + -0.000205f, -0.216736f, -0.060989f, -0.055679f, +0.066096f, -0.002241f, +0.002120f, -0.006289f, -0.009098f, +0.005325f, + +0.003581f, +0.007125f, +0.027759f, -0.011484f, +0.013721f, -0.002023f, -0.024038f, +0.000313f, +0.022400f, -0.005591f, + -0.035882f, -0.010480f, -0.010769f, -0.003223f, +0.007461f, +0.003163f, -0.019537f, -0.015672f, -0.000424f, +0.008663f, + -0.009091f, +0.013080f, +0.003291f, -0.000510f, +0.009449f, +0.015250f, +0.006535f, -0.008571f, +0.006763f, +0.004541f, + +0.004687f, +0.008192f, +0.006012f, +0.011072f, -0.000243f, -0.016993f, -0.009175f, -0.007330f, +0.009089f, +0.009341f, + +0.005900f, -0.000763f, +0.009190f, +0.015907f, +0.005501f, +0.001076f, +0.003801f, -0.000813f, +0.014487f, +0.001000f, + +0.001084f, +0.008136f, +0.009245f, -0.003571f, -0.004952f, -0.000023f, +0.002378f, -0.001222f, +0.004938f, -0.001877f, + -0.002272f, -0.004908f, -0.007209f, +0.002922f, -0.000128f, +0.000477f, -0.006614f, -0.007567f, +0.001210f, +0.004149f, + +0.003224f, +0.004100f, +0.000580f, +0.002788f, -0.003096f, +0.000632f, +0.001686f, -0.002388f, -0.000251f, +0.001336f, + -0.002523f, -0.000293f, -0.000650f, -0.005813f, -0.001353f, -0.000845f + }, + { + +0.004518f, +0.053320f, +0.139534f, +0.013218f, -0.024425f, +0.001118f, -0.017612f, -0.004302f, +0.005083f, -0.007617f, + -0.003757f, -0.006212f, +0.013686f, -0.006668f, -0.060514f, +0.015181f, -0.063122f, -0.007723f, +0.013457f, +0.006952f, + +0.005747f, -0.004835f, -0.003278f, -0.027973f, +0.026987f, +0.032197f, +0.010904f, -0.037137f, +0.026876f, -0.010649f, + -0.004308f, -0.002753f, -0.007590f, -0.011380f, -0.013091f, +0.009996f, +0.016517f, +0.013378f, -0.003576f, -0.002589f, + -0.012916f, +0.008519f, +0.007743f, -0.006295f, -0.002805f, +0.005942f, -0.001164f, +0.009745f, -0.001594f, -0.000431f, + +0.007123f, +0.002211f, +0.006629f, +0.003915f, -0.004313f, -0.000008f, +0.003502f, -0.004120f, -0.004688f, +0.002732f, + -0.000397f, -0.005006f, -0.000807f, +0.003047f, +0.000267f, +0.002274f, +0.009808f, +0.003485f, -0.003523f, +0.004623f, + +0.007946f, +0.001166f, -0.003575f, +0.001767f, +0.003929f, +0.004325f, -0.008125f, -0.004840f, +0.002335f, +0.000949f, + -0.003823f, +0.003558f, +0.002308f, +0.003191f, -0.001322f, -0.001573f, -0.003911f, -0.001133f, +0.001194f, +0.002051f, + -0.001809f, +0.002388f, -0.001574f, -0.001753f, -0.000845f, +0.000028f + }, + { + +0.000543f, -0.218307f, -0.060798f, -0.058511f, +0.069107f, +0.007875f, +0.010140f, -0.003973f, +0.001950f, +0.004438f, + -0.007110f, +0.015100f, +0.010271f, +0.005448f, +0.002118f, -0.012893f, -0.007232f, +0.014349f, -0.027664f, -0.018765f, + -0.001899f, +0.000068f, -0.031174f, -0.003459f, +0.038839f, -0.030574f, +0.006824f, -0.019476f, +0.017237f, +0.015143f, + +0.021198f, -0.016688f, -0.011588f, +0.020020f, -0.008133f, -0.005370f, +0.003976f, +0.001759f, -0.017243f, -0.029694f, + +0.002643f, +0.003702f, -0.005336f, +0.011599f, -0.017131f, -0.010995f, +0.010740f, +0.009435f, -0.005221f, +0.000902f, + +0.006518f, +0.002976f, -0.005748f, +0.001855f, -0.006164f, +0.003995f, -0.001292f, -0.011153f, -0.002173f, -0.007840f, + -0.004994f, +0.002552f, -0.004294f, +0.000655f, +0.000109f, +0.009654f, +0.005807f, -0.002333f, +0.006211f, +0.000121f, + +0.000322f, -0.001822f, +0.002338f, +0.000184f, -0.004978f, +0.001839f, -0.005122f, -0.000536f, -0.002930f, -0.002889f, + -0.000334f, -0.004966f, -0.005132f, -0.000463f, -0.001304f, -0.003489f, -0.000187f, +0.001860f, +0.001062f, +0.004239f, + -0.000475f, -0.001931f, +0.001649f, +0.000246f, +0.000074f, -0.001287f + }, + { + -0.003496f, -0.100254f, +0.076413f, +0.021559f, +0.018939f, -0.010702f, +0.011306f, -0.035194f, +0.023452f, +0.000821f, + +0.005782f, +0.007645f, -0.021944f, +0.011563f, +0.020050f, +0.029650f, +0.003684f, -0.018125f, +0.037487f, -0.000878f, + +0.021840f, +0.011479f, +0.009900f, +0.003551f, -0.015214f, -0.011317f, +0.002025f, -0.013691f, -0.012247f, -0.013637f, + -0.004323f, +0.001735f, -0.014556f, -0.012946f, -0.012230f, -0.005137f, +0.013853f, +0.007174f, -0.000486f, +0.007288f, + +0.010851f, -0.008543f, +0.007397f, +0.002516f, -0.000600f, -0.007759f, +0.001974f, -0.022003f, -0.001207f, -0.024081f, + -0.008179f, -0.000810f, -0.016569f, +0.003198f, +0.002133f, -0.001617f, -0.000664f, -0.013850f, +0.011021f, +0.000731f, + -0.004492f, +0.004824f, +0.000245f, -0.012319f, -0.012668f, -0.006020f, +0.002465f, +0.004977f, +0.003098f, -0.005929f, + -0.005702f, -0.005405f, -0.000127f, +0.002561f, +0.005694f, -0.001072f, -0.003529f, -0.004228f, -0.000108f, +0.001610f, + -0.002324f, -0.004162f, +0.000642f, +0.001685f, +0.002330f, -0.004091f, -0.009063f, -0.000745f, -0.000564f, +0.001159f, + +0.001595f, +0.001048f, +0.004874f, +0.001415f, +0.004110f, +0.000016f + }, + { + -0.006231f, -0.182247f, -0.012818f, +0.003576f, +0.040676f, -0.010896f, +0.101655f, -0.039086f, -0.012151f, +0.024888f, + +0.001402f, +0.020457f, -0.002489f, -0.010928f, +0.012472f, -0.016442f, +0.022504f, +0.028952f, +0.052608f, -0.024482f, + +0.018937f, +0.009209f, +0.001736f, -0.000027f, -0.018199f, +0.029534f, +0.006447f, +0.018728f, -0.007163f, +0.028220f, + -0.038256f, +0.010958f, -0.010604f, -0.006869f, -0.008567f, -0.007348f, +0.004586f, +0.008407f, -0.001921f, +0.000325f, + +0.003712f, -0.003459f, -0.001832f, -0.003304f, -0.005534f, +0.002395f, +0.006194f, -0.003350f, -0.000199f, -0.000404f, + -0.018013f, +0.003240f, +0.017431f, +0.001415f, -0.008400f, +0.006601f, -0.011650f, +0.004564f, -0.003741f, -0.005341f, + -0.000628f, +0.005494f, -0.001024f, +0.000782f, -0.001400f, +0.001221f, -0.007814f, -0.000413f, -0.002780f, -0.000708f, + -0.000531f, -0.000531f, -0.003977f, +0.002002f, +0.001580f, +0.002040f, -0.000212f, -0.001123f, +0.003849f, +0.000469f, + -0.000190f, +0.001610f, -0.003181f, -0.004036f, +0.003501f, +0.002871f, +0.005762f, +0.000657f, +0.000206f, +0.003060f, + +0.001053f, -0.004352f, -0.000478f, +0.003381f, -0.000352f, -0.000031f + }, + { + -0.000362f, -0.068245f, +0.089695f, +0.024946f, +0.010615f, -0.017941f, -0.034164f, -0.000064f, -0.016740f, -0.001633f, + -0.048027f, +0.048680f, +0.021552f, +0.023497f, +0.026125f, -0.017404f, -0.043651f, -0.005085f, +0.025610f, -0.010883f, + +0.028646f, +0.014121f, +0.012349f, +0.021985f, -0.031772f, -0.001174f, -0.001662f, +0.020267f, -0.002664f, -0.011779f, + +0.004459f, -0.022264f, -0.024299f, -0.006322f, +0.003936f, -0.009179f, +0.020533f, +0.006976f, -0.001977f, -0.015332f, + +0.002621f, +0.007698f, +0.004394f, +0.021293f, +0.011751f, -0.005930f, -0.001466f, -0.000666f, -0.004622f, -0.004222f, + -0.007798f, -0.003364f, -0.000394f, +0.001091f, -0.004113f, +0.002413f, +0.004600f, -0.007155f, -0.002438f, +0.010957f, + -0.002541f, +0.006989f, -0.010952f, -0.010104f, -0.000472f, -0.002747f, -0.006812f, +0.011502f, +0.006063f, +0.000896f, + +0.001568f, +0.001658f, +0.002406f, +0.004522f, -0.004331f, +0.000317f, -0.002196f, -0.002212f, +0.001333f, +0.004558f, + -0.002731f, +0.000948f, +0.000902f, +0.003097f, +0.000747f, +0.003876f, -0.001854f, -0.003615f, -0.001833f, +0.000339f, + +0.003619f, +0.001064f, -0.001052f, +0.000365f, -0.003735f, -0.000577f + }, + { + +0.022343f, -0.099045f, -0.049851f, -0.018600f, +0.032970f, +0.021822f, +0.061055f, +0.017215f, -0.002596f, +0.006813f, + -0.032703f, +0.044740f, -0.022684f, +0.001730f, -0.031956f, -0.018524f, -0.037513f, +0.015247f, +0.001110f, -0.012632f, + +0.022744f, +0.006185f, +0.012943f, -0.007730f, -0.024273f, -0.008515f, -0.002807f, -0.000152f, -0.002274f, +0.012245f, + -0.002961f, -0.023826f, -0.028386f, -0.011189f, +0.000743f, +0.001242f, +0.005848f, +0.017758f, +0.007838f, +0.000890f, + +0.016448f, -0.016621f, +0.004975f, -0.030960f, +0.005729f, +0.008361f, -0.005675f, -0.001206f, +0.014908f, +0.008960f, + -0.005019f, -0.014145f, -0.009144f, +0.009268f, -0.011013f, -0.005867f, +0.009264f, -0.007374f, +0.001633f, +0.001613f, + +0.000387f, +0.004867f, +0.002076f, +0.001080f, +0.004055f, -0.002221f, -0.009179f, -0.002174f, -0.007474f, +0.003171f, + +0.007223f, +0.000065f, +0.005150f, -0.000988f, -0.000164f, +0.002647f, -0.005905f, -0.000489f, +0.001998f, +0.004519f, + +0.002558f, +0.002464f, +0.003673f, +0.001264f, +0.001825f, +0.004970f, -0.001851f, -0.004332f, -0.000108f, -0.001369f, + -0.003276f, -0.002295f, -0.000813f, +0.000286f, +0.001206f, +0.003272f + }, + { + -0.005159f, -0.119096f, +0.061277f, +0.000301f, +0.011310f, -0.015004f, +0.006400f, -0.004180f, +0.024668f, +0.004036f, + -0.014881f, -0.002665f, -0.029827f, +0.021548f, +0.010519f, +0.011075f, -0.016194f, +0.003394f, -0.005471f, +0.005513f, + -0.001723f, +0.015124f, -0.007375f, +0.034652f, +0.012416f, +0.011046f, +0.005128f, +0.002424f, +0.011783f, +0.007791f, + -0.032004f, -0.005830f, -0.004633f, +0.011243f, -0.017041f, +0.026767f, -0.003359f, +0.023656f, -0.017033f, +0.016072f, + +0.007833f, +0.000543f, +0.004174f, +0.013306f, -0.000904f, -0.009133f, +0.007965f, +0.011713f, +0.013523f, +0.012863f, + -0.004286f, +0.013996f, +0.002278f, -0.002060f, +0.005520f, +0.005162f, +0.003144f, -0.000198f, +0.004970f, +0.007084f, + -0.001951f, -0.005446f, +0.001401f, +0.002769f, +0.003734f, +0.005196f, -0.000489f, -0.000145f, -0.006263f, -0.002001f, + -0.001683f, +0.002371f, -0.002204f, -0.000914f, -0.004338f, +0.001754f, +0.000623f, -0.000781f, +0.000728f, -0.002223f, + +0.005149f, +0.007896f, +0.001794f, +0.002957f, -0.001805f, +0.002824f, -0.003335f, -0.005575f, -0.002398f, +0.005605f, + +0.000494f, +0.002323f, +0.000754f, +0.002977f, +0.001963f, +0.002265f + }, + { + +0.018198f, -0.098903f, -0.050793f, -0.017470f, +0.043549f, +0.036161f, +0.059008f, -0.026629f, -0.037816f, +0.008594f, + -0.012681f, +0.018755f, +0.059020f, +0.001392f, +0.039048f, +0.056117f, -0.004031f, +0.004033f, +0.027815f, -0.009181f, + -0.019447f, +0.008043f, +0.009637f, -0.015838f, -0.000575f, -0.005418f, -0.008017f, -0.000940f, -0.004097f, +0.002350f, + -0.001333f, +0.007605f, -0.005594f, -0.019142f, -0.040502f, -0.001572f, -0.004956f, -0.015025f, +0.000920f, +0.005021f, + -0.000803f, +0.005181f, +0.005854f, +0.008728f, -0.007111f, +0.001311f, -0.015729f, +0.001924f, -0.005073f, -0.004702f, + -0.010995f, +0.009837f, +0.002462f, -0.006041f, -0.001443f, +0.000593f, +0.006194f, -0.004996f, +0.004334f, -0.008495f, + -0.000862f, -0.004002f, -0.004677f, +0.003897f, +0.000672f, -0.009350f, +0.002019f, +0.005095f, -0.000911f, -0.002104f, + +0.001148f, +0.004871f, -0.003799f, +0.002916f, +0.005869f, +0.005777f, +0.000676f, -0.003657f, +0.001893f, -0.000287f, + +0.000620f, +0.001814f, -0.003215f, -0.001312f, -0.003136f, +0.002593f, +0.002385f, +0.000975f, +0.004680f, -0.001762f, + +0.000702f, -0.003604f, +0.002981f, -0.000583f, +0.001753f, +0.002383f + } + }, + { + { + -0.002001f, +0.120721f, -0.017484f, +0.037160f, +0.041208f, -0.000432f, +0.001172f, -0.001453f, +0.009845f, +0.009956f, + -0.002020f, -0.013495f, +0.003319f, -0.022076f, -0.013002f, -0.001811f, -0.017825f, -0.009323f, +0.007165f, -0.006179f, + +0.025770f, +0.038787f, -0.014970f, -0.028247f, -0.009328f, -0.028693f, -0.002082f, -0.007808f, +0.002355f, -0.020726f, + +0.012350f, -0.001254f, +0.008477f, +0.005408f, -0.019882f, -0.002726f, +0.012084f, -0.004859f, +0.001455f, -0.014467f, + -0.010366f, +0.008860f, -0.005199f, +0.005500f, -0.007693f, -0.003059f, +0.007687f, +0.002828f, -0.013846f, +0.000149f, + +0.000083f, -0.000142f, -0.001206f, -0.000175f, -0.010643f, +0.000990f, +0.015188f, -0.005189f, -0.003176f, +0.006658f, + -0.004387f, +0.012830f, +0.004401f, -0.006118f, +0.002544f, -0.000144f, +0.000933f, +0.001918f, +0.003932f, +0.005726f, + +0.012638f, -0.000440f, +0.002103f, +0.004775f, +0.001891f, -0.008382f, -0.003586f, +0.002658f, +0.002984f, +0.001407f, + +0.005817f, +0.000101f, +0.001256f, +0.005644f, -0.001257f, -0.003263f, +0.000710f, -0.002489f, +0.000468f, -0.002842f, + -0.002711f, +0.001355f, -0.000145f, +0.002748f, +0.002423f, -0.001222f + }, + { + +0.010487f, -0.178229f, -0.144691f, +0.133696f, -0.000580f, -0.015382f, -0.027442f, +0.011508f, +0.012344f, -0.002924f, + +0.001226f, -0.010461f, +0.002911f, +0.003295f, +0.021788f, +0.011234f, +0.002692f, -0.014366f, +0.020898f, -0.029634f, + -0.000027f, +0.012549f, -0.008618f, +0.005963f, +0.013566f, -0.001560f, +0.006757f, -0.007970f, +0.007189f, +0.019551f, + +0.004369f, +0.004047f, -0.008440f, -0.002232f, -0.005281f, -0.001876f, +0.010814f, +0.005482f, -0.008354f, +0.009697f, + +0.000905f, +0.012690f, -0.000586f, -0.006349f, +0.004330f, -0.016760f, -0.001895f, +0.002190f, -0.007776f, +0.010280f, + -0.008294f, -0.000385f, +0.007830f, -0.011119f, -0.001776f, -0.004424f, +0.005206f, +0.005919f, -0.004780f, +0.000733f, + -0.005452f, +0.001223f, -0.003586f, +0.002793f, -0.002777f, +0.000611f, +0.004515f, -0.002808f, +0.003352f, +0.007343f, + -0.001348f, -0.004503f, -0.003776f, -0.003031f, +0.001360f, +0.001103f, +0.002305f, +0.001007f, -0.000016f, -0.005808f, + -0.002242f, -0.002759f, +0.000341f, -0.000208f, +0.001112f, -0.001918f, -0.002359f, +0.001857f, +0.004115f, -0.003282f, + -0.002828f, -0.001419f, -0.001594f, -0.001781f, +0.001724f, +0.000197f + }, + { + +0.000627f, +0.019731f, -0.104321f, +0.098643f, +0.019155f, -0.017028f, +0.000836f, +0.003627f, +0.030840f, +0.013166f, + -0.004121f, +0.006567f, +0.007199f, +0.002982f, +0.001312f, -0.011187f, +0.002341f, -0.016375f, +0.002997f, +0.010705f, + -0.018628f, -0.014743f, -0.008769f, +0.009270f, +0.001263f, +0.003590f, -0.033209f, +0.009343f, -0.002003f, -0.017762f, + -0.007024f, +0.005510f, +0.010760f, +0.009457f, -0.011895f, -0.008398f, +0.003351f, -0.001854f, +0.009610f, -0.003622f, + -0.001269f, +0.002676f, +0.002196f, +0.003875f, -0.004231f, +0.010159f, -0.005061f, +0.000271f, +0.012256f, +0.007451f, + +0.001885f, -0.012609f, -0.001541f, -0.003392f, -0.002670f, +0.000644f, +0.003710f, +0.003121f, -0.002364f, -0.005988f, + +0.001955f, +0.004488f, +0.001164f, +0.004573f, -0.005297f, -0.002267f, +0.000569f, +0.007940f, +0.001882f, +0.000993f, + +0.002297f, -0.003423f, -0.000347f, -0.000487f, -0.006179f, -0.000621f, -0.000647f, +0.001828f, +0.002439f, +0.000507f, + +0.002680f, +0.005958f, +0.002659f, -0.003049f, -0.001486f, +0.000304f, -0.000946f, -0.002296f, +0.000730f, -0.000656f, + -0.004354f, +0.000288f, +0.000583f, +0.004838f, -0.001965f, -0.003566f + }, + { + -0.001496f, +0.041948f, -0.012596f, +0.005812f, +0.010844f, -0.008192f, -0.005334f, -0.002631f, +0.008123f, +0.019758f, + -0.021358f, +0.007833f, +0.007947f, +0.007533f, -0.012296f, +0.003213f, -0.008229f, -0.005162f, -0.015393f, +0.000693f, + -0.010153f, +0.010020f, +0.030265f, +0.030619f, -0.011072f, -0.007451f, +0.011489f, +0.003838f, -0.009792f, +0.002122f, + -0.006314f, +0.007639f, +0.015850f, -0.010332f, +0.006341f, +0.002712f, +0.007558f, +0.012171f, -0.005852f, -0.009324f, + +0.009384f, +0.005059f, +0.003571f, +0.008552f, -0.023715f, +0.001817f, -0.001502f, +0.004426f, -0.009282f, +0.009589f, + -0.009757f, -0.013823f, +0.005836f, +0.004712f, -0.002468f, +0.006976f, -0.001795f, +0.005241f, -0.005517f, +0.009472f, + +0.002518f, +0.002804f, -0.005844f, -0.000317f, +0.002653f, -0.004393f, +0.009677f, -0.000439f, +0.002681f, +0.002595f, + -0.002970f, -0.003706f, +0.008494f, +0.001502f, +0.000679f, -0.000093f, +0.002071f, -0.000414f, -0.001241f, +0.001765f, + -0.000853f, +0.002579f, +0.000834f, +0.000030f, +0.001526f, +0.001721f, -0.003080f, +0.005462f, +0.001607f, +0.002610f, + -0.000408f, +0.000084f, +0.002351f, +0.001594f, +0.003236f, -0.002029f + }, + { + -0.000718f, -0.328228f, +0.025788f, +0.051720f, +0.008529f, +0.006723f, -0.020825f, +0.007782f, -0.016818f, -0.051795f, + +0.024448f, -0.014481f, +0.013221f, -0.000693f, -0.023207f, -0.002031f, +0.023236f, -0.016525f, +0.026325f, +0.007068f, + +0.002069f, +0.004171f, -0.029544f, -0.004513f, -0.001693f, +0.007106f, +0.014221f, -0.007324f, -0.007558f, +0.009915f, + -0.005748f, -0.004716f, +0.000765f, -0.006482f, -0.002870f, +0.007070f, +0.005612f, +0.003577f, -0.003686f, -0.001809f, + -0.008040f, -0.023899f, -0.019835f, +0.001671f, -0.005675f, +0.007410f, +0.026950f, -0.002936f, -0.007495f, +0.005941f, + -0.005262f, +0.020437f, +0.011919f, +0.000236f, +0.002994f, -0.002576f, -0.009423f, -0.015807f, -0.001244f, +0.000094f, + -0.003521f, +0.014641f, +0.003955f, -0.006405f, -0.002722f, -0.000101f, -0.001272f, -0.003527f, +0.002318f, -0.000579f, + +0.000855f, -0.002324f, -0.003365f, -0.000136f, +0.002451f, -0.000060f, +0.002726f, +0.009399f, -0.002907f, +0.004263f, + +0.004123f, +0.003634f, +0.002761f, -0.000901f, +0.002111f, +0.000656f, -0.002805f, -0.001619f, -0.003375f, -0.003591f, + -0.001996f, +0.000937f, -0.002773f, -0.003177f, -0.000308f, +0.002568f + }, + { + +0.002070f, +0.100628f, +0.064105f, -0.031021f, +0.012420f, -0.013065f, -0.010660f, +0.002159f, +0.007606f, +0.003523f, + -0.021297f, -0.004136f, -0.000549f, -0.023784f, +0.003855f, +0.011385f, -0.013906f, +0.000220f, +0.004109f, -0.029039f, + -0.024612f, +0.000129f, -0.002072f, +0.038766f, -0.040258f, +0.009751f, -0.005558f, +0.014301f, -0.009294f, -0.016455f, + -0.001469f, +0.004818f, -0.032360f, -0.002663f, -0.006845f, +0.000646f, -0.004590f, +0.001370f, +0.000714f, +0.017449f, + -0.008757f, +0.006088f, +0.000918f, +0.006843f, +0.016160f, -0.002410f, -0.005208f, +0.009890f, +0.005865f, +0.002697f, + -0.002091f, -0.008539f, -0.003337f, +0.008671f, +0.004520f, +0.007489f, -0.012796f, -0.014973f, -0.012467f, +0.002406f, + -0.003083f, +0.001865f, +0.008850f, -0.000423f, +0.006972f, +0.005368f, +0.003318f, -0.005788f, -0.002458f, +0.001476f, + +0.017780f, -0.000096f, +0.000157f, -0.000777f, +0.001017f, +0.001364f, -0.000402f, +0.000018f, +0.007048f, +0.004117f, + -0.001744f, +0.000923f, +0.004038f, -0.002884f, -0.000867f, -0.000710f, +0.004353f, +0.000831f, -0.002567f, -0.000547f, + -0.002832f, +0.000865f, -0.005603f, -0.000132f, +0.003209f, -0.001250f + }, + { + -0.006030f, -0.354455f, +0.034633f, +0.053905f, -0.035748f, +0.003052f, +0.008633f, -0.015126f, +0.012319f, -0.015783f, + +0.027485f, +0.007676f, -0.003241f, +0.002129f, -0.003188f, -0.020282f, +0.019074f, -0.009220f, +0.003672f, +0.002043f, + -0.029195f, -0.000796f, -0.017109f, +0.003840f, +0.006458f, -0.014269f, -0.000878f, -0.016179f, +0.001611f, +0.009211f, + -0.011059f, -0.001100f, +0.007767f, +0.008783f, +0.009924f, +0.008889f, +0.003390f, -0.005602f, +0.013092f, +0.006391f, + +0.009508f, -0.006423f, +0.014900f, +0.006763f, -0.004206f, -0.007666f, -0.015323f, +0.000045f, +0.013358f, -0.003108f, + -0.000575f, +0.007994f, +0.012465f, +0.009658f, +0.014072f, +0.006326f, +0.005641f, +0.000030f, +0.008297f, +0.003391f, + +0.005074f, -0.002929f, +0.009131f, +0.003070f, -0.012730f, -0.000156f, +0.004885f, +0.000229f, -0.000074f, +0.000104f, + -0.001178f, -0.009595f, -0.003114f, -0.000466f, +0.001513f, -0.000689f, -0.002735f, -0.004802f, -0.000960f, +0.004161f, + +0.004482f, +0.002200f, +0.000374f, +0.000049f, -0.000926f, -0.000752f, +0.004168f, -0.001199f, -0.002621f, +0.002000f, + -0.002347f, +0.000008f, -0.003370f, -0.003647f, -0.003232f, +0.002336f + }, + { + +0.003883f, +0.075503f, +0.102668f, -0.024804f, +0.010187f, +0.002364f, -0.004230f, -0.001031f, +0.007249f, -0.004458f, + +0.002379f, -0.021386f, +0.007573f, -0.020854f, -0.042178f, +0.016113f, -0.060394f, -0.029485f, +0.008686f, +0.029222f, + -0.000989f, +0.003212f, +0.007772f, -0.025149f, +0.014341f, +0.009911f, +0.016470f, -0.012020f, +0.012990f, +0.005803f, + -0.010138f, -0.021619f, -0.016491f, -0.003796f, -0.006878f, +0.009087f, +0.012003f, +0.019808f, -0.001429f, -0.005120f, + -0.003366f, +0.006027f, -0.001620f, -0.007663f, +0.005430f, +0.002003f, -0.000633f, -0.000248f, +0.009745f, -0.003834f, + +0.010865f, +0.002088f, -0.001544f, +0.006474f, +0.001256f, -0.006201f, +0.005472f, +0.003296f, -0.000107f, -0.009508f, + +0.004045f, +0.000123f, -0.003683f, +0.004258f, -0.003539f, -0.001390f, +0.006114f, +0.007690f, +0.004337f, +0.000305f, + +0.009200f, -0.000433f, -0.004296f, -0.001577f, +0.005793f, +0.004536f, -0.003244f, -0.003023f, +0.004580f, -0.000914f, + -0.004151f, +0.001337f, +0.001626f, -0.000937f, -0.000216f, +0.000512f, -0.002262f, -0.000244f, -0.003710f, +0.002081f, + -0.000294f, +0.001288f, -0.002822f, +0.001544f, -0.001243f, -0.000079f + }, + { + -0.006694f, -0.330796f, +0.013699f, +0.058874f, -0.027305f, -0.007582f, +0.015867f, -0.002427f, +0.024374f, -0.000179f, + -0.002738f, -0.027425f, +0.016845f, -0.000864f, -0.003296f, -0.010576f, +0.018548f, -0.013735f, -0.001341f, -0.028975f, + -0.005074f, -0.009178f, -0.012698f, +0.000856f, +0.012341f, -0.012794f, -0.012101f, +0.011095f, +0.006041f, +0.009052f, + +0.004273f, +0.001228f, +0.004726f, +0.003465f, -0.004609f, -0.003609f, -0.000282f, +0.008679f, -0.016631f, -0.028092f, + -0.004017f, +0.005059f, +0.002559f, +0.001690f, -0.009259f, -0.013146f, +0.004321f, +0.005695f, -0.010054f, +0.006938f, + +0.008846f, +0.001322f, -0.009597f, -0.007826f, +0.008937f, +0.002050f, -0.000232f, -0.002095f, -0.000470f, -0.007860f, + -0.008469f, +0.001068f, -0.005854f, +0.000595f, +0.001491f, +0.003625f, +0.005062f, -0.002044f, +0.001583f, +0.003906f, + -0.006420f, +0.000498f, -0.001554f, +0.009743f, -0.005871f, -0.001795f, -0.002473f, +0.000551f, +0.000068f, -0.000694f, + -0.004210f, -0.006599f, -0.003451f, +0.000537f, -0.003323f, -0.004041f, +0.003578f, -0.000191f, +0.002670f, -0.000344f, + -0.002466f, +0.000466f, +0.000007f, +0.003868f, -0.001064f, -0.003068f + }, + { + +0.000724f, -0.012733f, -0.005371f, +0.016099f, -0.002752f, +0.001405f, +0.039656f, -0.027017f, -0.001002f, +0.004496f, + +0.017087f, -0.005671f, -0.015679f, +0.021841f, -0.006799f, +0.014456f, +0.026509f, +0.020594f, +0.012416f, -0.015318f, + +0.022745f, +0.006976f, +0.021392f, +0.001853f, -0.004453f, -0.005373f, -0.012723f, -0.012188f, +0.000406f, -0.019487f, + -0.004069f, -0.005314f, -0.030240f, +0.006585f, -0.029918f, +0.005687f, +0.019308f, -0.001470f, -0.018138f, +0.019946f, + +0.002900f, +0.002469f, -0.004875f, +0.020910f, -0.016073f, +0.005189f, -0.020676f, -0.009874f, -0.004851f, -0.024075f, + +0.010805f, -0.012584f, -0.021126f, +0.014256f, +0.005297f, -0.013279f, -0.005545f, -0.007269f, +0.009915f, -0.002309f, + +0.006390f, +0.001707f, -0.004424f, -0.018338f, -0.012416f, +0.005696f, +0.002930f, +0.000902f, +0.009589f, -0.010830f, + -0.006726f, -0.003509f, +0.001798f, +0.009913f, -0.005539f, -0.003027f, -0.002854f, -0.002316f, -0.001818f, -0.002117f, + -0.002337f, +0.000245f, -0.000180f, +0.002976f, -0.002648f, -0.001951f, -0.005648f, +0.001171f, +0.002911f, -0.001820f, + -0.000139f, +0.000677f, +0.005075f, +0.000682f, +0.002776f, +0.001389f + }, + { + +0.005400f, -0.242165f, +0.007941f, +0.000740f, +0.019441f, +0.060414f, +0.042447f, -0.045146f, +0.001948f, +0.039477f, + +0.010129f, -0.011417f, +0.015585f, +0.014261f, -0.025557f, +0.023507f, +0.020532f, +0.043036f, +0.026691f, -0.001535f, + +0.001756f, -0.007181f, +0.017293f, -0.010203f, -0.001269f, +0.031032f, +0.006576f, +0.006166f, +0.010930f, -0.025558f, + +0.006834f, +0.001062f, -0.012421f, -0.006733f, -0.025795f, +0.005341f, +0.003805f, +0.010083f, -0.002276f, +0.001088f, + +0.013527f, -0.002534f, +0.011057f, -0.010770f, -0.022386f, -0.004456f, -0.000534f, -0.000179f, +0.017287f, -0.019544f, + -0.002824f, +0.009240f, +0.008016f, +0.002214f, -0.009904f, +0.002506f, -0.007757f, -0.000422f, +0.001072f, -0.015958f, + +0.010298f, +0.006832f, +0.002299f, -0.008579f, +0.002671f, +0.006252f, -0.013771f, +0.003004f, -0.002719f, -0.007141f, + +0.007920f, -0.006198f, -0.003547f, +0.000008f, -0.003981f, +0.004868f, +0.000348f, +0.002105f, -0.000175f, +0.001610f, + +0.001492f, +0.001413f, -0.004173f, +0.000714f, +0.000850f, +0.002116f, +0.003723f, +0.001159f, +0.006724f, -0.001034f, + -0.001588f, -0.001044f, -0.002077f, +0.002252f, -0.001829f, +0.000771f + }, + { + -0.000509f, +0.045800f, -0.031774f, +0.027760f, +0.012184f, -0.020224f, -0.006932f, -0.019358f, -0.006374f, -0.012491f, + +0.017211f, -0.014845f, +0.020440f, +0.046689f, -0.025299f, -0.004945f, -0.034755f, +0.023141f, +0.003154f, +0.004430f, + +0.012097f, +0.021027f, +0.047245f, +0.005145f, -0.020612f, -0.017570f, -0.007817f, +0.027225f, +0.014868f, -0.012015f, + -0.006677f, -0.030541f, -0.032234f, -0.009682f, +0.016844f, -0.007297f, +0.014815f, +0.003268f, +0.004999f, -0.005922f, + -0.010698f, +0.005410f, +0.011518f, +0.021888f, +0.010241f, -0.010016f, -0.001339f, -0.002499f, -0.004252f, -0.006855f, + -0.007000f, +0.008175f, -0.009425f, +0.012632f, -0.007324f, +0.006276f, +0.005168f, -0.010500f, +0.005593f, -0.011120f, + +0.002728f, +0.010105f, -0.010025f, -0.010052f, -0.006147f, -0.003037f, +0.003941f, +0.004817f, +0.002995f, +0.004495f, + -0.000456f, +0.007436f, -0.003743f, +0.002820f, +0.002352f, -0.000643f, +0.003455f, -0.004054f, +0.001650f, +0.006395f, + -0.007729f, -0.000125f, +0.003945f, +0.001024f, +0.000539f, +0.003453f, -0.004603f, -0.003317f, -0.004355f, +0.002049f, + +0.002853f, +0.004188f, -0.000632f, +0.002290f, -0.003894f, -0.002407f + }, + { + -0.033563f, -0.103273f, +0.003317f, -0.007842f, +0.026696f, +0.069116f, -0.011531f, +0.016968f, -0.002760f, -0.005532f, + +0.001220f, +0.032210f, -0.018805f, -0.010324f, -0.029955f, -0.011573f, -0.030998f, +0.002812f, +0.000702f, +0.006928f, + +0.020077f, +0.013634f, -0.010101f, -0.010780f, -0.016397f, -0.001060f, -0.006758f, -0.008455f, -0.005375f, +0.000403f, + +0.012872f, -0.038466f, -0.023830f, -0.005714f, -0.009902f, +0.021297f, +0.012427f, +0.007193f, +0.002220f, +0.007251f, + +0.010177f, -0.017274f, -0.004940f, -0.012721f, +0.001136f, -0.011187f, +0.011144f, +0.000184f, +0.001159f, +0.015631f, + -0.005584f, +0.002510f, -0.008112f, +0.008415f, -0.013234f, +0.000577f, -0.003736f, +0.002508f, -0.006281f, -0.004790f, + -0.000960f, +0.005796f, +0.006946f, +0.002222f, +0.000235f, +0.004516f, -0.011177f, -0.008320f, -0.009276f, +0.007847f, + +0.000719f, +0.006904f, +0.002784f, -0.001538f, +0.005294f, -0.002235f, +0.003371f, +0.000215f, -0.000058f, +0.004325f, + -0.001662f, +0.001319f, +0.001844f, +0.000818f, +0.004716f, +0.006197f, -0.007025f, -0.001256f, +0.000223f, -0.003085f, + -0.001395f, -0.002573f, +0.000921f, +0.001562f, -0.000753f, +0.002642f + }, + { + +0.002981f, -0.059915f, -0.022595f, +0.008259f, -0.009065f, -0.007690f, +0.033681f, -0.012111f, +0.012040f, +0.028961f, + -0.009110f, -0.010416f, -0.014714f, -0.030265f, +0.059586f, +0.025945f, -0.047895f, -0.002299f, -0.000644f, +0.007123f, + -0.012166f, +0.019955f, +0.020219f, +0.027763f, +0.006601f, +0.014834f, -0.013594f, +0.021797f, +0.026997f, -0.002585f, + -0.037599f, -0.007640f, -0.004921f, -0.000808f, +0.006469f, -0.001180f, +0.022424f, +0.005579f, -0.011893f, +0.005284f, + +0.019178f, +0.012918f, +0.009522f, +0.009663f, +0.004879f, -0.016205f, -0.001235f, +0.009775f, +0.007469f, +0.017139f, + +0.015746f, +0.002275f, +0.001422f, +0.012047f, -0.007115f, +0.000350f, +0.006933f, -0.001083f, +0.005649f, +0.004873f, + -0.002432f, -0.002635f, +0.002603f, -0.003561f, +0.003507f, -0.000973f, +0.011754f, -0.005674f, +0.000172f, +0.001141f, + -0.004405f, -0.002402f, +0.001591f, +0.000624f, -0.010093f, +0.004258f, +0.000909f, +0.003334f, -0.002311f, -0.005210f, + +0.004385f, +0.010708f, -0.000045f, +0.000663f, +0.003107f, +0.000477f, -0.002891f, -0.004282f, -0.001507f, +0.005005f, + -0.001274f, +0.003774f, +0.003491f, +0.001221f, +0.000883f, +0.002190f + }, + { + -0.026590f, -0.135543f, +0.015018f, -0.006206f, +0.026766f, +0.082717f, +0.010623f, -0.016561f, -0.045477f, -0.002971f, + +0.008449f, +0.004921f, +0.054069f, +0.006294f, +0.074226f, +0.030447f, -0.019143f, +0.010145f, +0.048306f, +0.002468f, + -0.015725f, -0.012885f, +0.007939f, -0.020816f, +0.016731f, -0.000390f, +0.010066f, -0.028279f, -0.003746f, -0.001241f, + +0.013385f, +0.016161f, -0.021576f, -0.026187f, -0.025344f, -0.005126f, -0.004987f, -0.023913f, -0.005040f, -0.001497f, + +0.002919f, +0.007869f, +0.011361f, -0.009659f, +0.022167f, -0.008714f, -0.014278f, -0.010755f, +0.002764f, -0.005686f, + -0.000769f, +0.004496f, +0.004238f, -0.003090f, -0.008860f, -0.003695f, +0.002630f, +0.000191f, +0.006856f, -0.003561f, + -0.008464f, +0.005459f, -0.012492f, +0.002193f, -0.006086f, -0.004003f, +0.002077f, +0.002624f, +0.000950f, +0.002152f, + -0.001280f, +0.010882f, -0.006949f, -0.000754f, +0.009898f, +0.003739f, +0.004336f, -0.004327f, -0.000642f, -0.003755f, + +0.004962f, -0.000592f, -0.003536f, -0.003815f, +0.002550f, +0.003131f, +0.000876f, +0.002624f, +0.004896f, -0.002506f, + +0.001632f, -0.002810f, +0.000701f, +0.002506f, +0.000607f, +0.000532f + } + }, + { + { + -0.002845f, +0.098158f, -0.041338f, -0.041723f, -0.028323f, +0.002722f, +0.006905f, -0.001438f, +0.000389f, -0.004706f, + +0.015019f, -0.008325f, +0.001432f, +0.008125f, -0.010347f, +0.001686f, -0.003372f, -0.020329f, +0.013931f, +0.008604f, + +0.016358f, +0.012381f, +0.000103f, +0.009092f, +0.016872f, -0.031310f, -0.005623f, -0.007372f, +0.007692f, -0.034117f, + -0.002729f, -0.011454f, -0.012889f, +0.006996f, +0.001795f, +0.005700f, +0.005683f, -0.005123f, +0.009015f, -0.008558f, + -0.008753f, +0.016558f, +0.005574f, +0.001335f, -0.005629f, +0.002556f, +0.015110f, +0.003728f, -0.013783f, +0.015096f, + +0.007203f, -0.001633f, -0.001325f, -0.003058f, -0.014911f, -0.004764f, +0.008854f, -0.002574f, +0.003419f, +0.003374f, + -0.010978f, +0.001773f, -0.004326f, -0.007060f, -0.000987f, -0.007603f, -0.002168f, +0.002669f, +0.003833f, -0.000043f, + +0.001511f, -0.003453f, +0.001717f, +0.002844f, +0.001723f, -0.004843f, -0.001405f, +0.001607f, -0.000310f, -0.001728f, + -0.000342f, -0.003040f, -0.002327f, +0.001666f, +0.000007f, +0.000226f, +0.002766f, +0.001995f, +0.003851f, +0.000771f, + +0.001005f, +0.001836f, -0.001393f, +0.001638f, +0.002040f, +0.001262f + }, + { + -0.010301f, -0.032570f, +0.016091f, +0.128825f, +0.000887f, -0.010646f, -0.016930f, +0.007203f, -0.003082f, -0.001108f, + +0.000162f, -0.004156f, +0.003077f, -0.014225f, +0.011634f, +0.013387f, -0.010797f, -0.010142f, +0.041788f, -0.019305f, + +0.000675f, +0.016284f, +0.006208f, +0.009121f, +0.004641f, -0.000340f, +0.022082f, +0.010512f, -0.002668f, -0.003209f, + -0.004882f, +0.004138f, -0.003798f, +0.006824f, +0.001045f, -0.002798f, +0.006459f, +0.010023f, -0.004729f, +0.003007f, + +0.001371f, +0.010812f, +0.002110f, -0.001470f, +0.013507f, -0.011864f, +0.001447f, +0.003878f, -0.005151f, +0.006115f, + -0.007512f, -0.007483f, -0.002192f, -0.010223f, +0.006498f, -0.000871f, +0.000960f, +0.002164f, -0.006424f, -0.003352f, + -0.009012f, -0.002386f, -0.004993f, +0.009024f, +0.009625f, +0.005393f, +0.007319f, +0.003555f, +0.000088f, +0.002637f, + +0.000546f, -0.001146f, -0.003138f, -0.006144f, -0.001756f, -0.000699f, +0.000079f, -0.002223f, +0.001679f, +0.000669f, + +0.001063f, -0.001183f, +0.002040f, -0.002401f, -0.000222f, +0.001811f, -0.001233f, +0.000209f, +0.001409f, -0.002029f, + +0.000090f, +0.001004f, +0.001647f, -0.000852f, +0.000197f, -0.002680f + }, + { + +0.002425f, +0.154058f, -0.024490f, +0.010987f, -0.041565f, -0.003074f, +0.007382f, -0.011926f, +0.011496f, +0.004215f, + -0.003621f, +0.001655f, +0.000329f, -0.010271f, -0.000713f, +0.005798f, +0.008601f, -0.017084f, -0.009516f, +0.004921f, + -0.003066f, +0.005325f, -0.007143f, +0.000767f, +0.003740f, +0.016839f, -0.012201f, +0.016663f, -0.006937f, -0.023537f, + -0.007414f, -0.006511f, +0.000137f, +0.001733f, -0.002287f, -0.000170f, +0.006753f, +0.000646f, +0.009525f, -0.007725f, + -0.004797f, +0.007538f, +0.009121f, -0.001007f, -0.013531f, +0.007247f, +0.002069f, +0.003733f, +0.000127f, +0.002199f, + +0.013490f, -0.008177f, -0.003755f, -0.000981f, -0.001463f, -0.000286f, -0.000836f, +0.000314f, +0.005400f, +0.001073f, + -0.004028f, +0.000548f, +0.000944f, +0.007896f, -0.001203f, +0.003183f, -0.002751f, +0.002684f, -0.003506f, -0.004074f, + +0.000342f, -0.004582f, +0.001751f, +0.001872f, -0.007599f, -0.000512f, -0.001271f, -0.002382f, +0.003317f, +0.004342f, + +0.002752f, +0.004464f, +0.001023f, -0.004086f, +0.000480f, +0.002981f, +0.000838f, -0.001859f, +0.000222f, +0.000993f, + -0.001603f, +0.001192f, -0.000561f, +0.003198f, -0.001514f, -0.000997f + }, + { + +0.001296f, +0.092170f, +0.016154f, -0.011435f, +0.000781f, -0.000652f, +0.000689f, -0.000865f, +0.004682f, +0.022868f, + -0.018405f, -0.003766f, -0.003381f, -0.008913f, -0.029114f, +0.000712f, -0.021770f, -0.010602f, -0.007028f, -0.005227f, + -0.010169f, +0.002161f, +0.012783f, +0.023897f, -0.002588f, +0.004183f, +0.003778f, +0.006217f, +0.000536f, -0.005269f, + -0.006706f, +0.011837f, +0.014682f, -0.010232f, +0.001919f, -0.022942f, -0.013750f, +0.008087f, -0.002843f, -0.008974f, + +0.011236f, -0.004253f, -0.015384f, +0.005471f, -0.020989f, +0.008711f, -0.001472f, -0.003085f, -0.006681f, +0.004185f, + -0.011954f, -0.013748f, +0.004446f, +0.009873f, -0.007926f, +0.003327f, +0.003219f, +0.007862f, -0.005252f, +0.001094f, + -0.004462f, -0.001100f, -0.001877f, +0.003550f, +0.006338f, -0.005332f, +0.008211f, -0.000604f, -0.002188f, +0.001357f, + -0.001578f, -0.004004f, +0.004417f, -0.002113f, +0.001478f, +0.002877f, -0.002005f, -0.008202f, -0.004971f, -0.000119f, + -0.003962f, -0.001626f, -0.000903f, +0.000410f, -0.000190f, +0.001092f, -0.001173f, +0.005608f, -0.002050f, -0.000341f, + -0.000875f, -0.001824f, -0.003495f, -0.004015f, +0.000627f, -0.002562f + }, + { + +0.004139f, -0.347644f, +0.011394f, +0.070553f, +0.003351f, +0.003842f, -0.020487f, +0.015352f, +0.004318f, -0.031982f, + +0.038276f, -0.026409f, -0.000876f, +0.000401f, -0.002956f, -0.006718f, +0.004847f, -0.023024f, +0.019598f, -0.001091f, + -0.013983f, -0.005429f, -0.001950f, +0.013014f, -0.000396f, +0.000310f, +0.009650f, +0.009236f, +0.008724f, +0.016625f, + -0.004753f, +0.003434f, +0.003901f, +0.005167f, +0.002449f, +0.006135f, +0.003205f, +0.002632f, -0.002091f, +0.002621f, + +0.007896f, -0.002756f, -0.013580f, -0.000521f, +0.000540f, +0.007705f, +0.015179f, -0.015669f, -0.013984f, +0.005878f, + -0.014026f, +0.007473f, +0.008474f, -0.000679f, -0.001960f, +0.000222f, +0.000632f, -0.000803f, +0.008029f, +0.002799f, + -0.005779f, +0.003381f, -0.008461f, -0.006062f, +0.005767f, +0.005320f, -0.003456f, -0.002090f, +0.001188f, -0.001571f, + +0.002864f, +0.000672f, +0.002594f, +0.000764f, +0.002143f, -0.000410f, -0.003794f, +0.001730f, -0.004514f, +0.003696f, + -0.000200f, +0.001483f, +0.000541f, -0.005767f, +0.000108f, -0.001976f, -0.000755f, +0.000917f, -0.000988f, +0.000355f, + -0.000083f, +0.005383f, +0.000054f, -0.001324f, +0.000064f, +0.000704f + }, + { + -0.005280f, -0.032372f, -0.059784f, -0.026981f, +0.020391f, -0.003505f, -0.008708f, +0.005225f, +0.010227f, +0.005880f, + -0.006491f, +0.015366f, +0.012553f, +0.001603f, +0.025671f, +0.005129f, -0.019844f, +0.003434f, -0.002059f, +0.001886f, + +0.005926f, +0.003287f, +0.004909f, +0.031410f, -0.026358f, +0.040511f, -0.011371f, +0.005113f, +0.004091f, +0.008110f, + +0.024740f, +0.016164f, -0.015902f, +0.011017f, -0.004301f, +0.002294f, -0.000152f, -0.011939f, -0.006230f, +0.012445f, + -0.006440f, +0.001481f, -0.000690f, +0.008084f, +0.005357f, -0.006417f, -0.002703f, +0.004919f, -0.000358f, +0.006166f, + +0.005740f, +0.002262f, +0.007436f, +0.005217f, -0.002362f, +0.002576f, -0.007522f, -0.001861f, -0.006405f, +0.001942f, + +0.004079f, -0.000111f, +0.000980f, -0.001653f, +0.003551f, +0.000303f, +0.001576f, -0.003286f, +0.006043f, +0.000352f, + +0.006804f, -0.007444f, -0.006755f, -0.001273f, +0.001798f, +0.000673f, +0.002764f, -0.000404f, +0.004395f, +0.000530f, + -0.003911f, +0.001378f, +0.002188f, -0.001191f, -0.000257f, -0.003725f, +0.002594f, +0.000066f, -0.001597f, -0.000049f, + -0.001271f, -0.000008f, -0.006076f, -0.000513f, +0.002082f, -0.000278f + }, + { + +0.011620f, -0.356596f, +0.014883f, +0.101424f, -0.002852f, -0.006025f, +0.000423f, -0.020390f, +0.026376f, -0.009836f, + +0.004431f, -0.003565f, +0.004432f, +0.002860f, -0.008213f, -0.003896f, +0.030427f, -0.019476f, -0.011646f, +0.020437f, + +0.001626f, +0.002142f, -0.017707f, +0.020864f, +0.017404f, -0.006103f, +0.016040f, +0.000456f, +0.007351f, +0.007655f, + -0.006573f, -0.004316f, +0.003852f, +0.000767f, +0.006936f, -0.001516f, -0.002083f, -0.009872f, +0.002358f, -0.000430f, + +0.004299f, -0.005947f, +0.011344f, +0.003864f, -0.003805f, +0.002263f, -0.007377f, +0.000382f, +0.009300f, +0.000357f, + -0.002757f, -0.005486f, +0.010459f, +0.005125f, +0.005101f, -0.003761f, -0.007571f, -0.015132f, -0.000599f, -0.000585f, + +0.001863f, -0.010934f, -0.000628f, +0.007673f, -0.007173f, -0.003119f, +0.001250f, -0.001519f, -0.001077f, +0.000505f, + +0.001605f, -0.000605f, -0.001297f, -0.004274f, +0.003155f, +0.003516f, +0.001209f, +0.001416f, -0.001608f, -0.002604f, + -0.000517f, +0.000182f, -0.002647f, +0.002114f, +0.002833f, +0.000145f, +0.002726f, +0.000850f, -0.001403f, +0.000110f, + -0.000914f, +0.002246f, +0.001547f, +0.000136f, -0.002474f, +0.003876f + }, + { + -0.005094f, -0.082928f, -0.052459f, -0.016718f, +0.017689f, +0.008010f, -0.003157f, +0.000519f, +0.004238f, -0.000538f, + +0.013275f, -0.003611f, +0.003441f, -0.004262f, +0.007968f, +0.026710f, -0.052508f, -0.018163f, +0.025494f, +0.031053f, + +0.000804f, +0.010755f, +0.003764f, -0.027368f, +0.013581f, -0.022673f, +0.001212f, -0.006855f, +0.015914f, -0.001002f, + -0.017211f, +0.002927f, -0.011781f, -0.004787f, -0.002597f, -0.013778f, -0.009333f, +0.016143f, -0.009756f, -0.001841f, + +0.005061f, -0.000413f, -0.009483f, -0.011325f, +0.003281f, -0.002522f, -0.004421f, +0.005300f, +0.017296f, -0.008174f, + +0.009771f, -0.001344f, -0.012333f, +0.004608f, +0.006444f, -0.003360f, +0.007358f, +0.003450f, +0.000348f, -0.010769f, + +0.000747f, +0.002514f, -0.003300f, +0.000223f, +0.000248f, +0.002166f, -0.000191f, +0.000693f, -0.001686f, -0.005808f, + +0.000461f, +0.001963f, +0.004715f, -0.000844f, +0.004987f, +0.006561f, -0.000608f, -0.004284f, +0.003162f, +0.001199f, + -0.001274f, -0.000322f, +0.001666f, -0.001960f, +0.001384f, +0.002987f, -0.003462f, +0.000770f, -0.001828f, +0.001674f, + +0.000317f, +0.002032f, -0.002073f, +0.000024f, -0.002314f, +0.000207f + }, + { + +0.011661f, -0.325268f, -0.000830f, +0.102723f, +0.000410f, -0.022069f, -0.007512f, -0.016016f, +0.011325f, -0.014096f, + -0.011417f, -0.023346f, +0.018863f, -0.005308f, -0.013351f, -0.029068f, +0.011495f, +0.000944f, -0.002924f, -0.020008f, + +0.007398f, +0.001794f, +0.007691f, -0.005076f, -0.001264f, -0.002394f, -0.009235f, +0.015076f, -0.000043f, -0.002453f, + +0.003301f, +0.009542f, +0.012745f, +0.006015f, -0.000511f, -0.001488f, -0.003146f, +0.015161f, -0.004567f, -0.012823f, + +0.006498f, +0.008003f, -0.001039f, -0.003643f, -0.008645f, -0.017264f, -0.006132f, +0.015808f, +0.000985f, +0.005213f, + +0.003270f, -0.003146f, -0.001183f, +0.000601f, +0.006569f, +0.003909f, -0.001110f, -0.001909f, -0.002271f, -0.001771f, + -0.002146f, -0.008203f, -0.011688f, +0.003171f, +0.003584f, +0.000197f, -0.002678f, -0.006822f, -0.004614f, -0.004091f, + -0.006874f, +0.007593f, -0.002555f, +0.005608f, -0.004283f, +0.001752f, +0.002254f, +0.001872f, -0.001552f, +0.000166f, + +0.001307f, +0.001610f, +0.004863f, +0.004327f, -0.000979f, -0.002539f, +0.003475f, -0.000516f, +0.000115f, -0.003757f, + -0.000935f, +0.001209f, -0.001425f, +0.002686f, -0.000208f, -0.000535f + }, + { + +0.000753f, +0.094013f, +0.051104f, -0.024576f, -0.027690f, -0.013609f, +0.043574f, -0.004189f, -0.005099f, -0.008979f, + +0.017846f, +0.008949f, -0.013596f, +0.011684f, -0.013513f, -0.005048f, +0.027822f, +0.015513f, -0.008758f, -0.032674f, + +0.018484f, -0.000047f, +0.014784f, -0.011235f, -0.003450f, -0.008280f, -0.012377f, +0.002782f, +0.019497f, -0.010431f, + -0.007480f, -0.002684f, -0.022310f, +0.012572f, -0.035079f, -0.007788f, +0.016027f, +0.003926f, -0.016826f, -0.000414f, + -0.003492f, +0.007441f, -0.007467f, +0.026006f, -0.029015f, -0.002267f, -0.010650f, +0.001940f, +0.009222f, -0.009268f, + +0.010820f, -0.009138f, -0.013860f, +0.013977f, +0.012643f, +0.005560f, +0.002592f, +0.001778f, +0.013907f, +0.005123f, + +0.014252f, -0.000414f, -0.000675f, -0.003521f, -0.001832f, +0.008178f, -0.000220f, +0.000641f, +0.009215f, -0.006280f, + -0.002197f, -0.004245f, +0.002480f, +0.010356f, -0.006310f, -0.002632f, -0.000394f, +0.005007f, +0.005262f, +0.002614f, + +0.002809f, -0.001115f, -0.004704f, +0.001451f, -0.004716f, -0.001961f, -0.003273f, +0.002494f, +0.002514f, -0.001725f, + +0.000965f, +0.001061f, +0.003659f, -0.000911f, +0.001092f, -0.000134f + }, + { + -0.005247f, -0.255562f, -0.018018f, -0.005643f, +0.018528f, +0.004958f, -0.009991f, -0.007784f, +0.027793f, +0.018177f, + -0.009309f, -0.002299f, +0.023513f, +0.034779f, +0.014103f, +0.033351f, +0.002642f, +0.016267f, +0.020605f, +0.016774f, + +0.005086f, -0.008700f, +0.006350f, -0.015728f, -0.000534f, +0.018017f, -0.011173f, -0.008989f, +0.005771f, -0.030890f, + -0.000750f, +0.005141f, -0.005347f, -0.003416f, -0.025522f, +0.011880f, +0.005356f, -0.004395f, +0.001810f, -0.002618f, + +0.003180f, +0.008712f, +0.013769f, -0.009544f, -0.016746f, -0.005316f, -0.001789f, -0.015158f, +0.005653f, -0.012004f, + +0.005320f, +0.000324f, -0.012503f, -0.003360f, +0.001928f, +0.007600f, -0.005367f, +0.001565f, +0.007322f, -0.012020f, + +0.010735f, +0.001096f, +0.005582f, -0.006015f, -0.004064f, +0.006810f, -0.003442f, +0.007297f, -0.000230f, -0.002618f, + +0.007065f, -0.008804f, -0.006446f, -0.008377f, -0.006867f, +0.003413f, -0.002359f, +0.004951f, -0.002045f, +0.000180f, + +0.001369f, -0.003895f, -0.005026f, +0.000889f, -0.000926f, -0.000919f, -0.000431f, +0.001178f, +0.005465f, -0.001836f, + -0.002932f, +0.000465f, -0.001489f, -0.001132f, -0.005178f, -0.001434f + }, + { + +0.000096f, +0.109681f, -0.003683f, +0.002639f, +0.001263f, -0.005480f, +0.007852f, -0.019993f, -0.003886f, -0.010610f, + +0.014300f, -0.017647f, +0.011281f, +0.025759f, -0.014657f, +0.051088f, -0.008490f, +0.006639f, -0.008990f, +0.007002f, + +0.007486f, +0.002449f, +0.024962f, -0.010232f, -0.011988f, -0.000036f, +0.003040f, +0.001887f, -0.002426f, -0.017584f, + +0.003244f, +0.004767f, +0.008721f, +0.003910f, -0.001308f, -0.010184f, +0.024219f, -0.004338f, -0.003770f, +0.004708f, + -0.001919f, -0.001980f, -0.007809f, +0.010390f, -0.000046f, -0.010518f, +0.005756f, -0.001758f, +0.003070f, -0.010454f, + -0.016595f, +0.004482f, -0.010897f, +0.008953f, -0.010723f, +0.007335f, +0.010664f, -0.002503f, +0.011676f, -0.005867f, + +0.004932f, +0.007078f, -0.007495f, -0.004047f, +0.002830f, -0.001427f, -0.003096f, -0.003965f, +0.000980f, +0.002323f, + -0.008390f, +0.001704f, -0.004739f, +0.002387f, +0.002939f, -0.002047f, +0.000233f, -0.002554f, +0.001615f, +0.005728f, + -0.004607f, -0.002578f, -0.001053f, +0.001187f, +0.001889f, +0.004019f, -0.001229f, -0.000108f, -0.001194f, +0.002622f, + +0.000304f, +0.003483f, -0.001225f, +0.003425f, -0.000686f, -0.000277f + }, + { + +0.035019f, -0.083048f, -0.063877f, -0.034040f, +0.013631f, +0.019339f, -0.068516f, -0.002975f, -0.010026f, +0.007217f, + -0.010135f, +0.008691f, +0.000492f, +0.036148f, +0.021787f, -0.004132f, -0.020215f, -0.002237f, -0.005360f, +0.001755f, + +0.003789f, +0.008422f, -0.001698f, -0.000133f, -0.014158f, -0.000657f, -0.015227f, -0.004946f, -0.003436f, -0.015785f, + +0.003222f, -0.025718f, -0.002066f, -0.001340f, -0.013658f, +0.007979f, +0.001335f, -0.000496f, -0.004378f, +0.009221f, + +0.012402f, -0.010003f, +0.002623f, +0.000573f, +0.001372f, -0.010828f, +0.011145f, +0.005084f, -0.000021f, +0.007810f, + +0.000508f, +0.005798f, -0.002067f, +0.009251f, -0.016806f, +0.000507f, -0.010494f, +0.003034f, +0.004225f, -0.003959f, + -0.005485f, +0.002919f, +0.008697f, +0.009657f, -0.000870f, +0.001945f, -0.011035f, -0.007510f, -0.011169f, +0.003213f, + +0.000961f, +0.010648f, +0.000640f, +0.000731f, +0.009245f, +0.001037f, +0.003053f, -0.007377f, -0.008292f, -0.002075f, + -0.002375f, +0.000779f, -0.001720f, -0.002699f, -0.000439f, +0.003135f, -0.004853f, +0.002728f, +0.004316f, +0.001340f, + -0.002024f, -0.003453f, -0.002400f, -0.001155f, -0.002512f, +0.000625f + }, + { + -0.001648f, +0.026502f, +0.026042f, +0.001294f, -0.005435f, +0.005724f, +0.031845f, -0.012163f, +0.003164f, +0.017519f, + +0.003113f, -0.005121f, -0.020952f, -0.052612f, +0.059153f, +0.048832f, -0.008801f, +0.021980f, +0.015351f, +0.011001f, + -0.043323f, +0.003685f, +0.012507f, +0.004827f, +0.010074f, +0.001796f, -0.025991f, +0.018318f, +0.023930f, +0.017552f, + -0.018303f, -0.008249f, +0.003128f, +0.002243f, -0.008279f, -0.011238f, +0.020757f, +0.001202f, -0.006713f, -0.005339f, + +0.000586f, +0.001476f, -0.000778f, -0.004319f, +0.005394f, -0.005608f, -0.003386f, -0.004453f, -0.004038f, +0.003769f, + +0.005127f, -0.003481f, -0.000631f, +0.015476f, -0.001063f, +0.001557f, +0.003403f, -0.001818f, -0.000676f, -0.007009f, + -0.008563f, -0.008592f, -0.006501f, -0.005637f, +0.001047f, -0.004507f, +0.006073f, -0.005732f, +0.002022f, +0.003160f, + +0.000970f, -0.003058f, -0.001481f, +0.004525f, -0.006629f, +0.001570f, +0.001148f, +0.006695f, +0.002824f, -0.001759f, + -0.000574f, +0.005679f, +0.001776f, +0.000187f, +0.001405f, +0.005670f, +0.001543f, -0.005212f, -0.001303f, +0.004009f, + -0.003657f, +0.001543f, -0.001309f, -0.002380f, -0.002315f, +0.002135f + }, + { + +0.027637f, -0.122965f, -0.022229f, -0.017338f, -0.008992f, +0.006587f, -0.034625f, +0.010876f, -0.012810f, +0.007881f, + -0.009107f, -0.016707f, +0.015237f, +0.001096f, +0.062815f, -0.001139f, -0.000998f, +0.018060f, +0.020366f, +0.003553f, + +0.003707f, -0.015115f, +0.011269f, +0.004222f, +0.023726f, -0.004946f, +0.013819f, -0.008795f, +0.014541f, -0.005065f, + -0.017438f, -0.001334f, -0.004077f, +0.006524f, +0.001763f, -0.001800f, +0.001850f, -0.016163f, -0.014570f, -0.008571f, + +0.003104f, +0.003932f, +0.014931f, -0.004403f, +0.019126f, -0.002191f, +0.008634f, -0.002670f, +0.002749f, -0.003188f, + -0.003127f, +0.002663f, +0.002980f, -0.004170f, -0.002129f, +0.000989f, -0.001814f, -0.013293f, -0.001759f, +0.009575f, + -0.001851f, +0.006413f, -0.007119f, +0.000785f, +0.001271f, -0.001212f, -0.006797f, -0.000043f, +0.002942f, +0.004202f, + -0.002406f, +0.008471f, -0.005867f, -0.006227f, +0.001592f, +0.001342f, +0.003184f, -0.004645f, +0.004505f, +0.001136f, + +0.000311f, -0.002628f, -0.003711f, -0.002285f, +0.002419f, +0.000077f, +0.001447f, +0.001808f, +0.002144f, -0.004159f, + +0.001752f, +0.001508f, +0.005718f, +0.004470f, +0.000401f, -0.001749f + } + }, + { + { + +0.004152f, -0.028546f, +0.064053f, -0.058586f, -0.046700f, +0.010821f, +0.000999f, +0.008239f, +0.002802f, -0.014521f, + +0.018518f, -0.005393f, -0.005553f, +0.011074f, -0.020909f, +0.002233f, +0.011313f, -0.007855f, +0.016681f, +0.010869f, + +0.020860f, -0.018434f, +0.012929f, +0.028339f, +0.021898f, -0.050395f, -0.002610f, -0.003896f, +0.013568f, -0.011641f, + -0.028670f, -0.008994f, -0.010810f, -0.000089f, +0.011508f, +0.006371f, -0.005569f, +0.006000f, -0.003248f, -0.001187f, + +0.004281f, +0.001784f, +0.022081f, -0.016315f, +0.002881f, +0.009219f, -0.000179f, +0.002399f, +0.001266f, +0.009914f, + +0.000523f, +0.002548f, +0.001663f, -0.012329f, +0.000391f, -0.004056f, -0.005689f, +0.004213f, +0.006808f, -0.005741f, + -0.000056f, -0.007008f, -0.001323f, -0.005829f, -0.006183f, -0.000613f, -0.003770f, +0.005850f, -0.001741f, -0.000980f, + -0.003968f, +0.001724f, +0.001665f, -0.000424f, -0.000329f, +0.002617f, -0.001284f, -0.000518f, -0.003049f, -0.000136f, + -0.002297f, +0.000358f, -0.002404f, -0.000085f, -0.001450f, +0.001754f, -0.000076f, +0.004445f, +0.000200f, +0.002641f, + +0.003796f, +0.001553f, -0.000918f, -0.000388f, +0.001056f, +0.000300f + }, + { + +0.012291f, +0.072374f, -0.019711f, -0.000158f, +0.070717f, -0.008249f, +0.001699f, -0.015811f, -0.012173f, +0.014717f, + -0.014379f, +0.007144f, -0.002544f, -0.000993f, -0.006603f, +0.007312f, -0.015153f, +0.007232f, +0.018195f, -0.007627f, + +0.001030f, +0.016149f, +0.012955f, +0.010485f, -0.015040f, +0.003552f, +0.022445f, +0.022988f, -0.004691f, -0.011845f, + -0.007825f, +0.007273f, +0.000963f, -0.000110f, +0.007718f, +0.003807f, +0.000207f, +0.010436f, +0.001068f, -0.005609f, + +0.010375f, -0.007589f, +0.013098f, -0.005093f, +0.009193f, -0.010261f, +0.001388f, +0.007151f, +0.002334f, -0.009127f, + +0.006394f, -0.015287f, -0.006659f, -0.006162f, +0.011531f, -0.002139f, -0.003297f, +0.006317f, -0.003232f, -0.009537f, + +0.002242f, -0.005576f, -0.004395f, +0.009938f, +0.008169f, +0.000120f, +0.004289f, +0.008689f, +0.001911f, -0.002107f, + +0.002982f, -0.002015f, -0.002946f, -0.002277f, -0.003841f, -0.002122f, +0.001275f, -0.001809f, -0.001354f, +0.009891f, + -0.001887f, -0.002913f, +0.001522f, -0.003505f, +0.003232f, +0.000896f, -0.002079f, +0.001598f, -0.002433f, -0.002390f, + +0.002641f, +0.002009f, +0.003092f, -0.001170f, -0.000655f, -0.005338f + }, + { + -0.002107f, +0.191159f, -0.033511f, -0.072493f, +0.030441f, +0.005824f, +0.000275f, -0.008983f, -0.003143f, -0.001825f, + +0.008847f, -0.015313f, +0.003735f, -0.014851f, -0.002358f, +0.020112f, -0.000444f, +0.000363f, -0.024877f, -0.004509f, + +0.003536f, +0.015759f, -0.012787f, -0.008064f, +0.028173f, -0.006249f, +0.000983f, +0.002800f, +0.006132f, -0.019439f, + -0.010949f, -0.005693f, +0.010136f, -0.015308f, -0.002438f, +0.005176f, +0.006501f, +0.010804f, +0.003629f, -0.011246f, + +0.003156f, +0.003561f, +0.015221f, -0.008773f, -0.014863f, +0.009314f, +0.004930f, +0.001477f, -0.007326f, +0.006116f, + +0.012496f, -0.008140f, -0.003824f, +0.005304f, -0.008458f, -0.001722f, -0.007543f, +0.007361f, +0.006247f, +0.005674f, + -0.006432f, +0.001192f, -0.001108f, +0.011173f, -0.002779f, +0.001987f, +0.001554f, -0.005630f, -0.004083f, -0.003556f, + -0.001802f, -0.004413f, +0.003982f, +0.001991f, -0.006306f, +0.000726f, -0.001209f, +0.001600f, -0.001107f, +0.001555f, + +0.004430f, +0.001586f, -0.001021f, -0.005055f, +0.002266f, +0.003637f, -0.000705f, -0.001179f, +0.000579f, +0.000766f, + +0.001373f, -0.000294f, -0.000837f, +0.000414f, -0.000583f, +0.000289f + }, + { + +0.000674f, +0.085364f, +0.025428f, -0.018664f, -0.004949f, +0.004052f, +0.001173f, -0.002288f, -0.004545f, +0.009896f, + +0.018132f, -0.022345f, +0.002803f, -0.022885f, -0.026279f, -0.004875f, -0.016431f, -0.018722f, -0.018822f, +0.007620f, + -0.019749f, +0.000551f, +0.007522f, +0.012107f, +0.011325f, +0.015985f, -0.007626f, +0.002288f, +0.010079f, -0.018054f, + +0.008656f, +0.010886f, +0.007991f, -0.001814f, +0.000146f, -0.026404f, -0.017270f, +0.001349f, +0.003329f, +0.004195f, + -0.005207f, +0.000792f, -0.022912f, +0.004651f, -0.016248f, +0.001867f, +0.005880f, -0.015889f, +0.014683f, +0.002012f, + -0.025312f, -0.005443f, +0.005910f, +0.009329f, -0.014083f, +0.001392f, +0.012692f, -0.004360f, +0.007889f, -0.001646f, + -0.005825f, -0.007082f, +0.003354f, +0.002840f, +0.004397f, -0.002826f, +0.003379f, +0.003058f, -0.006081f, +0.002902f, + -0.000492f, -0.000893f, -0.000158f, +0.000793f, -0.005095f, +0.005320f, +0.000558f, -0.009784f, -0.002415f, -0.004744f, + -0.003227f, -0.002891f, +0.000587f, -0.000473f, -0.002788f, +0.002399f, +0.000001f, +0.003086f, -0.001569f, -0.001301f, + -0.001137f, -0.000005f, -0.005652f, -0.004789f, +0.002318f, -0.001962f + }, + { + -0.004983f, -0.287697f, -0.013148f, +0.074242f, +0.001226f, +0.002354f, -0.009804f, +0.002901f, +0.007911f, -0.014863f, + +0.013480f, -0.007086f, -0.010499f, -0.000603f, +0.007036f, +0.003915f, -0.002196f, -0.008479f, +0.005776f, -0.011927f, + -0.003805f, -0.022204f, +0.024474f, +0.003987f, -0.000467f, -0.003904f, +0.003395f, +0.011331f, +0.014469f, +0.015784f, + +0.001272f, +0.012356f, -0.008395f, +0.013786f, +0.000202f, +0.004680f, +0.002059f, -0.002977f, +0.008168f, +0.001259f, + -0.003087f, +0.009058f, -0.010374f, +0.000606f, +0.000292f, +0.003652f, -0.000888f, -0.003731f, -0.008147f, +0.000434f, + -0.003797f, -0.012101f, +0.008161f, -0.001007f, +0.002063f, +0.004610f, -0.003146f, +0.004479f, +0.005593f, +0.004125f, + -0.001859f, -0.003152f, -0.012249f, -0.001815f, +0.005550f, +0.008323f, -0.007755f, +0.000474f, +0.001547f, -0.000709f, + +0.004339f, +0.001089f, +0.003056f, -0.005008f, +0.005027f, -0.000170f, -0.000009f, -0.006486f, -0.003433f, +0.001325f, + -0.000228f, +0.004259f, -0.001078f, -0.007278f, +0.001844f, -0.004107f, -0.000558f, +0.002831f, -0.001363f, +0.001203f, + -0.001157f, +0.008065f, +0.000051f, -0.000616f, +0.000553f, -0.002313f + }, + { + -0.000176f, -0.067386f, -0.063749f, +0.008515f, -0.005868f, +0.001676f, -0.004288f, +0.001199f, +0.003905f, +0.006237f, + +0.000676f, +0.006942f, +0.020255f, +0.012145f, +0.010253f, +0.024766f, -0.037143f, +0.004754f, -0.025392f, +0.013822f, + +0.004507f, +0.006143f, +0.009945f, +0.022351f, +0.005743f, +0.024302f, -0.012240f, -0.000085f, +0.018941f, +0.012759f, + +0.013492f, +0.011072f, +0.006390f, -0.005801f, +0.007429f, -0.002855f, +0.006038f, -0.012770f, +0.005142f, -0.013585f, + +0.000578f, +0.000339f, +0.007040f, +0.003788f, +0.003489f, -0.009667f, +0.004310f, -0.005877f, +0.005655f, +0.007128f, + +0.005504f, +0.000360f, +0.015399f, -0.004635f, +0.000045f, -0.003101f, -0.003604f, -0.001853f, +0.005995f, -0.004063f, + +0.004695f, -0.003773f, -0.001433f, +0.000838f, +0.004558f, +0.002428f, +0.000716f, -0.002642f, +0.001430f, +0.005335f, + -0.003402f, -0.000743f, -0.007907f, +0.002057f, -0.001418f, -0.000741f, +0.001671f, -0.001095f, +0.003871f, +0.003440f, + -0.006183f, -0.000763f, +0.005130f, -0.002415f, -0.000435f, -0.001625f, +0.000710f, -0.000283f, -0.002063f, -0.000317f, + -0.000289f, -0.001144f, -0.003256f, -0.001300f, +0.002892f, -0.001402f + }, + { + -0.013569f, -0.272947f, -0.007711f, +0.108365f, +0.000574f, -0.015424f, -0.003778f, -0.006388f, +0.004433f, -0.002265f, + -0.020433f, +0.013904f, +0.003319f, +0.019044f, -0.019922f, -0.000535f, +0.010558f, +0.000302f, -0.028113f, +0.016069f, + +0.021205f, -0.007958f, -0.016987f, +0.035690f, +0.014111f, +0.005932f, +0.003170f, +0.008188f, +0.014120f, -0.007545f, + +0.000152f, -0.011118f, +0.011323f, +0.001411f, -0.001853f, -0.003625f, +0.003766f, -0.002334f, -0.007795f, +0.000560f, + -0.005477f, +0.012254f, -0.001401f, +0.005893f, -0.004201f, -0.001828f, -0.001030f, -0.002068f, +0.002980f, +0.006952f, + -0.002322f, -0.012797f, +0.013086f, +0.001639f, +0.004617f, -0.012607f, -0.005038f, -0.007528f, -0.005852f, -0.007950f, + -0.002351f, +0.000987f, -0.001908f, +0.004113f, -0.003408f, -0.006991f, +0.004717f, -0.001483f, -0.005940f, +0.005770f, + -0.001664f, +0.006135f, -0.000864f, -0.004211f, -0.002632f, +0.004515f, +0.003267f, +0.004413f, -0.003115f, -0.002561f, + -0.003738f, -0.000155f, -0.004719f, +0.005647f, +0.001952f, +0.002168f, +0.000378f, +0.002203f, -0.000260f, -0.003308f, + +0.000935f, +0.001064f, +0.004033f, +0.000961f, -0.002982f, +0.002142f + }, + { + -0.003516f, -0.055949f, -0.123166f, +0.032875f, -0.007223f, +0.008517f, -0.003950f, +0.002250f, -0.002933f, +0.002543f, + +0.016424f, +0.011215f, -0.010355f, +0.007589f, +0.040627f, -0.022065f, -0.027166f, -0.011963f, +0.004958f, +0.018038f, + +0.014809f, +0.006353f, +0.006761f, -0.019345f, +0.009497f, -0.021887f, -0.007918f, +0.013996f, -0.001713f, -0.010789f, + -0.013701f, +0.009918f, -0.007390f, -0.000868f, -0.009994f, -0.015958f, -0.010183f, +0.006951f, -0.001158f, +0.004990f, + +0.000690f, -0.007045f, -0.002683f, -0.011972f, +0.005265f, -0.004892f, -0.001799f, +0.003904f, +0.005496f, +0.003832f, + -0.001351f, +0.009128f, -0.016633f, +0.005567f, +0.011039f, -0.000032f, +0.000143f, +0.000552f, -0.006073f, -0.000140f, + -0.006817f, +0.001926f, +0.001362f, -0.001553f, +0.003270f, +0.000255f, +0.005942f, -0.002565f, -0.005787f, -0.005105f, + -0.000524f, +0.000854f, +0.005004f, +0.000709f, +0.006012f, +0.003621f, -0.002338f, -0.004027f, +0.001049f, -0.000312f, + +0.005582f, -0.002647f, +0.001050f, -0.001184f, +0.002194f, +0.002083f, -0.005079f, +0.001584f, +0.002565f, +0.000157f, + +0.002549f, -0.001843f, +0.001421f, +0.000097f, -0.004647f, -0.001195f + }, + { + -0.012491f, -0.267117f, +0.003303f, +0.108361f, -0.015550f, -0.015533f, -0.017181f, -0.001061f, -0.008887f, -0.002642f, + -0.035500f, +0.006347f, +0.013492f, -0.002627f, -0.015763f, -0.011525f, -0.011577f, +0.003644f, -0.005879f, +0.004774f, + -0.014359f, +0.009143f, +0.010113f, -0.009256f, +0.000694f, +0.004479f, -0.002487f, +0.000301f, +0.006261f, -0.011926f, + +0.007995f, +0.017048f, -0.001076f, +0.006037f, -0.001664f, +0.008330f, -0.006425f, +0.013369f, -0.000230f, +0.001162f, + -0.002123f, +0.006242f, -0.000025f, -0.004075f, -0.001593f, -0.018731f, -0.003251f, +0.012669f, -0.000330f, +0.009521f, + +0.000402f, -0.004585f, +0.001887f, +0.009108f, -0.003689f, +0.003773f, -0.002972f, -0.003312f, -0.006314f, +0.003024f, + +0.002022f, -0.013202f, -0.005493f, +0.003019f, +0.002646f, +0.000142f, -0.003748f, -0.006116f, -0.006454f, -0.005809f, + -0.000672f, +0.008484f, +0.000207f, -0.002228f, -0.001959f, -0.001672f, +0.004106f, -0.000066f, +0.000692f, -0.003390f, + +0.004065f, +0.004925f, +0.006492f, -0.000708f, +0.001766f, +0.000663f, +0.000272f, +0.000708f, -0.000521f, -0.001219f, + -0.002376f, +0.000326f, +0.001881f, +0.000893f, -0.002196f, +0.002895f + }, + { + +0.001012f, +0.143657f, +0.001120f, -0.028215f, -0.022192f, +0.002890f, +0.029581f, +0.011406f, -0.014449f, -0.012789f, + -0.000660f, +0.009485f, +0.024645f, -0.022218f, +0.004976f, +0.005863f, +0.005679f, -0.002148f, -0.000429f, -0.021546f, + +0.011611f, +0.003018f, +0.017005f, -0.014631f, -0.003384f, -0.023454f, -0.003438f, +0.021229f, -0.001342f, -0.005803f, + -0.004167f, -0.004838f, +0.010302f, -0.023006f, -0.009113f, -0.008197f, +0.001952f, +0.001045f, +0.012805f, -0.022485f, + -0.001185f, +0.013164f, -0.009245f, +0.008348f, -0.020919f, -0.002017f, -0.001950f, +0.001911f, +0.009644f, +0.004028f, + -0.008449f, -0.010568f, +0.000462f, +0.012105f, +0.008332f, +0.011172f, -0.001964f, +0.006234f, +0.007215f, +0.011689f, + +0.004315f, +0.001094f, +0.001965f, +0.001125f, -0.000629f, +0.005758f, -0.001762f, +0.004804f, +0.002237f, -0.000185f, + -0.000042f, -0.003122f, -0.000048f, +0.009503f, -0.004896f, -0.001038f, -0.001283f, +0.004037f, +0.007459f, +0.003059f, + +0.005311f, -0.003371f, -0.003928f, +0.001737f, -0.003790f, -0.002291f, +0.000361f, +0.002559f, -0.003984f, +0.001053f, + -0.001037f, +0.003041f, +0.002228f, -0.002518f, +0.002523f, -0.000482f + }, + { + +0.009553f, -0.173943f, -0.085566f, -0.002141f, -0.000069f, +0.022954f, -0.044351f, -0.010483f, +0.026746f, -0.004170f, + +0.020953f, +0.002178f, +0.018809f, +0.016256f, +0.057682f, +0.005647f, -0.007381f, +0.016315f, +0.015879f, +0.020670f, + -0.000594f, +0.000948f, -0.003980f, -0.009174f, +0.006747f, -0.007719f, -0.006556f, +0.011980f, -0.011850f, -0.008764f, + -0.014891f, +0.013545f, -0.011160f, +0.000935f, -0.008569f, -0.008993f, +0.017202f, -0.007365f, -0.000537f, -0.002770f, + -0.008698f, +0.016160f, +0.001416f, -0.002919f, -0.002720f, -0.007755f, +0.003995f, -0.024092f, -0.004078f, -0.001783f, + +0.002535f, -0.002677f, -0.014092f, +0.004610f, -0.000063f, +0.004674f, -0.002811f, +0.003467f, +0.000336f, -0.002504f, + +0.011386f, -0.001246f, +0.001434f, +0.000204f, -0.006606f, -0.002205f, +0.012382f, +0.006551f, -0.004503f, -0.000339f, + +0.002779f, -0.005923f, -0.004871f, -0.008854f, -0.003796f, +0.002257f, -0.002322f, +0.004400f, -0.002389f, +0.003254f, + -0.005557f, -0.006077f, -0.001355f, +0.000523f, +0.000471f, -0.000709f, -0.001385f, +0.002618f, +0.000804f, -0.002293f, + +0.001644f, -0.002989f, +0.000282f, -0.002017f, -0.004142f, -0.001234f + }, + { + +0.001165f, +0.089985f, +0.017241f, -0.003593f, +0.002491f, -0.000683f, -0.004980f, -0.005237f, -0.011638f, -0.008081f, + -0.015690f, +0.018695f, -0.001710f, +0.012649f, +0.016550f, +0.034496f, +0.007553f, -0.016102f, -0.001107f, +0.003212f, + +0.021961f, -0.019719f, +0.022788f, -0.018593f, -0.016987f, +0.021621f, +0.001804f, -0.012765f, -0.003532f, -0.011053f, + -0.003352f, +0.008727f, +0.020142f, +0.012067f, -0.014248f, -0.005667f, +0.008121f, +0.000134f, +0.008738f, -0.000301f, + +0.008490f, -0.012670f, -0.004243f, +0.005570f, -0.005999f, -0.003768f, +0.004589f, -0.001191f, +0.006705f, -0.008350f, + -0.006357f, -0.010962f, -0.006293f, -0.004413f, +0.006854f, -0.002890f, +0.003773f, +0.002260f, +0.011145f, +0.004332f, + +0.000197f, +0.001599f, -0.002152f, -0.002228f, +0.006393f, -0.007102f, -0.005739f, -0.000592f, -0.004056f, +0.004073f, + -0.003250f, -0.000310f, -0.004131f, -0.002930f, +0.007422f, +0.000444f, -0.006177f, +0.000942f, +0.001991f, -0.001425f, + +0.003375f, -0.003737f, -0.004629f, -0.000463f, +0.003742f, +0.002911f, +0.001762f, -0.000158f, +0.002585f, +0.000883f, + -0.001416f, +0.004043f, -0.002747f, -0.000858f, +0.003147f, +0.002414f + }, + { + -0.029905f, -0.088887f, +0.006529f, -0.024131f, +0.008149f, +0.010585f, -0.058018f, -0.031186f, -0.002318f, +0.003541f, + +0.005535f, -0.011136f, +0.000220f, +0.044552f, +0.022561f, -0.023244f, +0.025931f, -0.019225f, +0.011046f, +0.014588f, + -0.018602f, +0.005513f, +0.006852f, -0.016025f, -0.002120f, -0.004555f, -0.010963f, +0.004275f, +0.004916f, -0.029625f, + -0.005887f, +0.001201f, -0.008966f, +0.008814f, -0.022085f, +0.003666f, -0.002717f, -0.012666f, +0.006528f, +0.001553f, + +0.008568f, +0.002290f, +0.011115f, +0.006357f, -0.016739f, -0.004317f, +0.007320f, +0.013271f, -0.005721f, -0.001987f, + +0.014931f, -0.008065f, +0.006375f, -0.002552f, -0.011054f, +0.000546f, -0.011462f, -0.001289f, +0.011110f, +0.000867f, + -0.000221f, -0.000267f, +0.001019f, +0.011251f, -0.001711f, -0.003568f, -0.004944f, -0.005129f, -0.014707f, +0.005808f, + -0.001086f, +0.008761f, +0.001612f, -0.000646f, +0.010030f, -0.000613f, +0.003642f, -0.011333f, -0.009673f, +0.001450f, + -0.002923f, +0.001464f, -0.001915f, -0.000345f, -0.003488f, +0.001026f, -0.000603f, +0.004155f, +0.004012f, +0.001839f, + -0.004660f, -0.001670f, -0.006665f, -0.000083f, -0.002419f, +0.001517f + }, + { + +0.003335f, +0.100835f, -0.045222f, +0.003907f, +0.008269f, +0.002160f, +0.009986f, +0.009965f, +0.005931f, -0.001073f, + +0.010676f, -0.007920f, -0.007481f, +0.003499f, +0.018287f, -0.019491f, +0.022597f, +0.038866f, +0.016275f, +0.002236f, + -0.027460f, -0.012268f, +0.013074f, +0.007239f, +0.003500f, -0.018074f, -0.006575f, +0.013640f, +0.013831f, +0.023327f, + -0.017135f, -0.005897f, +0.003804f, +0.006412f, -0.005993f, -0.016739f, +0.011243f, +0.005968f, +0.001709f, -0.002334f, + -0.011544f, +0.000828f, +0.006024f, -0.017244f, +0.000438f, -0.003116f, -0.003056f, -0.001190f, +0.000972f, +0.000775f, + -0.012344f, +0.004859f, +0.002122f, +0.003549f, +0.004624f, +0.013078f, -0.010253f, +0.004961f, -0.004207f, -0.004557f, + -0.009527f, -0.012651f, -0.005779f, +0.003780f, -0.001305f, -0.003449f, -0.004098f, +0.000431f, -0.001249f, +0.005272f, + +0.004543f, -0.008505f, -0.001299f, +0.003187f, -0.002940f, +0.001061f, +0.002173f, +0.003796f, +0.002436f, +0.003559f, + +0.001938f, -0.002495f, +0.002572f, +0.002063f, -0.000667f, +0.009310f, -0.002083f, -0.003769f, +0.002819f, -0.003782f, + +0.001002f, +0.002531f, -0.006298f, +0.000779f, -0.004114f, -0.000175f + }, + { + -0.023908f, -0.136296f, +0.058851f, -0.023844f, -0.032871f, +0.005741f, -0.021062f, -0.014630f, +0.007527f, +0.009672f, + -0.020458f, +0.003012f, -0.027625f, +0.033685f, +0.047287f, -0.005366f, +0.011168f, +0.027106f, -0.014262f, +0.015332f, + -0.002677f, -0.002989f, -0.003504f, +0.023843f, +0.013316f, +0.005695f, -0.008853f, +0.010837f, +0.004463f, +0.007550f, + -0.027120f, -0.012724f, +0.009017f, +0.009236f, +0.017098f, -0.025254f, +0.010041f, -0.001285f, -0.006289f, -0.013486f, + -0.006025f, +0.006095f, +0.004742f, +0.000593f, +0.014646f, -0.001964f, +0.013263f, +0.004600f, -0.001642f, +0.012823f, + -0.003683f, -0.009961f, +0.001885f, -0.003562f, +0.003603f, +0.002543f, -0.002773f, -0.005831f, -0.006907f, +0.010840f, + -0.000307f, +0.004206f, +0.001888f, -0.009351f, +0.008336f, -0.002558f, -0.003744f, -0.009209f, +0.000834f, +0.004157f, + +0.000006f, +0.004062f, -0.001698f, -0.000314f, -0.007662f, +0.003448f, -0.001426f, -0.001360f, +0.005335f, +0.003789f, + -0.004253f, +0.002079f, -0.006005f, -0.000351f, +0.001861f, -0.000437f, +0.002354f, +0.001649f, -0.001492f, -0.004820f, + +0.002322f, +0.003602f, +0.008122f, +0.000562f, +0.001631f, -0.002577f + } + }, + { + { + -0.001234f, -0.120946f, +0.014286f, -0.000541f, -0.007134f, +0.006237f, -0.005188f, +0.009124f, +0.011752f, -0.003640f, + +0.010492f, -0.005529f, -0.011102f, +0.000701f, -0.017378f, +0.025871f, +0.037416f, +0.001951f, +0.004147f, -0.003791f, + +0.024144f, -0.027681f, -0.003945f, +0.015972f, +0.009779f, -0.043589f, +0.000788f, +0.004819f, +0.015899f, +0.014727f, + -0.000104f, +0.002020f, -0.011772f, -0.010925f, +0.005624f, +0.001072f, +0.003794f, +0.015486f, -0.006635f, -0.000218f, + +0.006333f, -0.008552f, +0.016885f, -0.014616f, +0.004794f, +0.004536f, -0.007085f, +0.006234f, +0.006205f, +0.004384f, + -0.003198f, -0.001741f, -0.000726f, -0.008042f, +0.005553f, -0.001455f, -0.009556f, -0.002320f, +0.003507f, -0.001017f, + +0.007115f, -0.004312f, +0.004055f, +0.003895f, -0.000654f, +0.006692f, -0.000624f, +0.003753f, -0.003762f, +0.000929f, + -0.001700f, +0.000007f, +0.000601f, -0.001182f, +0.000279f, +0.004288f, -0.000780f, -0.001214f, -0.002466f, +0.001395f, + -0.002546f, +0.004165f, +0.001149f, +0.001213f, -0.001496f, -0.002259f, -0.003465f, +0.002015f, -0.003596f, +0.000765f, + +0.005249f, +0.001334f, -0.000248f, +0.001647f, -0.000685f, +0.000344f + }, + { + -0.012369f, +0.178115f, +0.081879f, -0.125513f, -0.052034f, -0.006054f, +0.002507f, -0.035739f, -0.018295f, +0.020967f, + +0.007823f, +0.015321f, -0.016334f, +0.000605f, +0.003137f, +0.006900f, -0.011361f, -0.013778f, -0.016991f, -0.019317f, + -0.012307f, +0.000940f, +0.002337f, +0.015925f, -0.019874f, -0.003822f, +0.016374f, +0.009319f, +0.001897f, +0.009367f, + -0.000891f, -0.000915f, +0.005884f, +0.009642f, +0.012470f, +0.009904f, +0.001166f, +0.003535f, +0.001080f, -0.003188f, + +0.001787f, -0.013549f, +0.006528f, -0.014171f, +0.002435f, -0.004260f, +0.003330f, +0.002915f, +0.000676f, -0.008713f, + +0.004887f, -0.013243f, -0.000005f, -0.001339f, +0.011668f, -0.004393f, -0.002658f, +0.005700f, +0.001992f, +0.003201f, + +0.008844f, -0.000302f, -0.000625f, +0.004364f, +0.000397f, -0.006303f, -0.004185f, +0.001974f, -0.000820f, -0.002931f, + +0.007919f, +0.003373f, +0.002905f, +0.000408f, -0.002475f, -0.001258f, +0.000448f, -0.004452f, -0.004511f, +0.006172f, + +0.000168f, -0.000502f, +0.000698f, -0.001940f, +0.003083f, -0.002258f, -0.004286f, +0.003078f, -0.001646f, -0.000709f, + +0.001108f, -0.000415f, +0.002187f, -0.001930f, -0.000070f, -0.002098f + }, + { + +0.001693f, +0.150231f, -0.051559f, -0.083275f, +0.041914f, +0.011577f, +0.010538f, -0.002793f, -0.009542f, -0.006412f, + +0.004730f, -0.025221f, -0.012245f, -0.003520f, +0.005678f, +0.013440f, -0.000004f, +0.011474f, -0.017023f, -0.015982f, + +0.002663f, +0.011421f, -0.018347f, -0.012192f, +0.025584f, -0.003370f, +0.008520f, +0.003892f, -0.006085f, -0.017075f, + +0.008047f, +0.013159f, +0.014416f, -0.019821f, -0.007849f, +0.006042f, -0.011372f, +0.007224f, +0.015115f, -0.009787f, + +0.006190f, +0.009926f, +0.019604f, -0.003867f, -0.018252f, -0.001363f, -0.004559f, -0.005800f, -0.004160f, +0.005872f, + -0.005318f, -0.016194f, -0.004618f, +0.001596f, -0.007821f, +0.005297f, -0.002419f, +0.006553f, +0.001667f, +0.009171f, + +0.000052f, +0.003736f, -0.003929f, +0.006194f, -0.003183f, -0.003128f, +0.000257f, -0.003714f, -0.004849f, -0.000538f, + -0.001534f, -0.005232f, +0.003862f, -0.002247f, -0.005045f, +0.001842f, -0.004915f, -0.000633f, -0.005598f, -0.004050f, + +0.000351f, -0.001312f, -0.000190f, -0.002661f, -0.001522f, -0.001204f, -0.002071f, -0.002562f, -0.000270f, -0.001781f, + +0.001704f, +0.001278f, -0.001026f, +0.000407f, -0.000518f, +0.000377f + }, + { + -0.000534f, -0.006045f, -0.039844f, +0.002146f, +0.007794f, +0.001587f, -0.002825f, +0.003141f, -0.004068f, -0.006901f, + +0.000893f, -0.033201f, +0.003440f, -0.021676f, -0.013946f, +0.000213f, -0.031250f, -0.023838f, -0.026250f, -0.013971f, + -0.029220f, -0.001603f, -0.001060f, +0.000705f, +0.014715f, -0.000027f, -0.022217f, +0.012165f, +0.023379f, -0.007251f, + +0.008526f, +0.003284f, +0.006718f, +0.010181f, +0.003825f, -0.003563f, -0.006006f, -0.009910f, +0.001366f, -0.002622f, + -0.009889f, +0.007701f, -0.022499f, +0.002517f, -0.010472f, -0.000469f, -0.000253f, -0.016953f, +0.017622f, +0.008396f, + -0.012457f, +0.005678f, +0.001530f, +0.011091f, -0.007288f, -0.001706f, +0.006733f, -0.007511f, +0.008863f, +0.000118f, + -0.001477f, -0.001384f, +0.002192f, -0.001562f, +0.004922f, -0.005676f, -0.002448f, +0.004936f, +0.000700f, +0.004535f, + -0.001692f, -0.001742f, -0.002998f, +0.001206f, -0.007817f, +0.000860f, +0.002801f, -0.003251f, +0.001330f, -0.005176f, + -0.004406f, -0.003948f, -0.000478f, +0.000974f, -0.000365f, +0.000963f, -0.002678f, +0.001794f, -0.000679f, -0.001206f, + -0.000475f, +0.001630f, +0.000340f, -0.000288f, +0.005758f, +0.001197f + }, + { + +0.005619f, -0.175265f, +0.056542f, +0.059440f, -0.007782f, -0.000038f, +0.003155f, +0.001051f, -0.001229f, -0.010261f, + +0.023625f, +0.022582f, +0.008339f, +0.010348f, +0.001324f, +0.007729f, +0.028193f, -0.004494f, -0.012609f, -0.003147f, + +0.013959f, -0.003127f, +0.025137f, -0.017070f, -0.009630f, +0.001868f, +0.007050f, +0.005153f, +0.011824f, +0.017044f, + +0.014337f, +0.016766f, -0.003149f, +0.026039f, +0.003971f, -0.004362f, -0.008095f, -0.017026f, +0.001681f, -0.007280f, + -0.019456f, -0.006823f, -0.011845f, +0.000840f, -0.004946f, -0.000556f, -0.004463f, +0.005214f, +0.004990f, -0.004233f, + -0.006221f, -0.005468f, +0.008469f, -0.002715f, +0.005490f, +0.005394f, -0.002328f, -0.002027f, -0.004425f, +0.002104f, + +0.001443f, -0.005006f, -0.003624f, +0.004918f, +0.003676f, +0.008014f, -0.002433f, +0.002610f, -0.000632f, -0.005128f, + +0.000625f, -0.002408f, -0.002825f, -0.006317f, +0.002873f, -0.003969f, +0.001418f, -0.002171f, -0.002099f, +0.001127f, + +0.001473f, +0.001252f, -0.003014f, -0.003410f, +0.003641f, -0.002589f, -0.000374f, +0.002512f, -0.003119f, -0.001006f, + -0.000879f, +0.006508f, -0.000538f, -0.000693f, +0.000225f, -0.001488f + }, + { + +0.003862f, +0.001443f, +0.005394f, +0.015464f, -0.012770f, +0.001536f, -0.001774f, -0.003831f, -0.012184f, -0.001914f, + -0.008965f, -0.004604f, +0.021633f, +0.001894f, +0.001930f, +0.029805f, -0.036038f, -0.015664f, -0.034380f, +0.000231f, + -0.011245f, -0.002086f, +0.006655f, +0.000987f, -0.018615f, +0.015195f, +0.003244f, -0.002067f, -0.013409f, +0.000478f, + +0.002213f, -0.003136f, +0.006965f, -0.006727f, +0.007346f, -0.003175f, +0.005090f, -0.013692f, +0.006912f, -0.012094f, + -0.000606f, -0.007451f, +0.007159f, +0.003985f, +0.004674f, -0.000035f, +0.006431f, -0.008320f, +0.004652f, +0.010742f, + +0.009323f, -0.003115f, +0.011418f, -0.010244f, -0.001093f, -0.002401f, -0.004171f, -0.001692f, +0.004956f, -0.011118f, + +0.005654f, +0.004821f, +0.003533f, +0.002842f, +0.003070f, +0.000602f, +0.000296f, -0.005660f, -0.002673f, +0.001802f, + -0.002715f, +0.003621f, -0.002640f, +0.007056f, +0.001382f, +0.000894f, +0.001718f, -0.002620f, +0.000983f, -0.000155f, + -0.003746f, +0.001301f, +0.001432f, -0.003715f, +0.001158f, -0.003936f, -0.003045f, +0.000129f, +0.000638f, +0.001618f, + -0.003064f, -0.003352f, -0.000270f, +0.000279f, -0.000085f, -0.001969f + }, + { + +0.016186f, -0.178227f, +0.022761f, +0.094671f, -0.000403f, -0.007376f, -0.000922f, -0.020958f, -0.022751f, +0.001706f, + -0.003368f, +0.017475f, -0.021582f, +0.002349f, -0.015315f, -0.001010f, -0.010990f, +0.008782f, -0.027827f, -0.004737f, + +0.013897f, -0.003864f, -0.009958f, +0.021313f, -0.004814f, -0.004291f, +0.001133f, +0.007375f, +0.008960f, -0.005510f, + +0.015106f, +0.008122f, +0.015603f, +0.007855f, -0.008246f, -0.004769f, +0.008662f, -0.001301f, -0.005168f, +0.007576f, + -0.000890f, +0.017190f, -0.009370f, -0.004777f, -0.007034f, -0.001631f, +0.001402f, -0.005367f, -0.004654f, +0.004046f, + +0.002249f, -0.009501f, +0.004139f, -0.008428f, -0.005338f, -0.010219f, +0.005761f, +0.000686f, +0.001120f, -0.001789f, + +0.003336f, +0.005724f, -0.001326f, -0.001516f, -0.001866f, -0.001995f, +0.006952f, -0.001088f, -0.008033f, +0.007363f, + -0.001619f, +0.001632f, +0.001782f, -0.000078f, -0.001688f, +0.004326f, +0.004306f, +0.002735f, -0.002781f, -0.000949f, + -0.004289f, -0.002480f, -0.002948f, +0.004909f, -0.004064f, +0.002488f, +0.000247f, -0.001194f, +0.000381f, -0.001027f, + -0.000334f, -0.002165f, +0.003912f, +0.001349f, -0.003258f, +0.002556f + }, + { + +0.006083f, +0.078962f, -0.015422f, +0.026280f, -0.016108f, +0.000662f, -0.009142f, +0.002223f, +0.000297f, -0.000983f, + +0.002809f, -0.003007f, -0.007970f, +0.017523f, +0.027893f, -0.026094f, -0.012802f, -0.006163f, -0.016955f, -0.019678f, + +0.003842f, +0.002897f, +0.002671f, -0.003688f, +0.013611f, -0.025614f, +0.008987f, +0.013162f, -0.023762f, -0.016554f, + -0.023515f, +0.005855f, +0.006212f, +0.010329f, -0.003439f, -0.003679f, +0.001625f, +0.013344f, +0.007153f, +0.000725f, + -0.004886f, -0.002812f, +0.004265f, -0.004478f, +0.009844f, -0.000661f, +0.002784f, +0.009298f, +0.001082f, +0.006897f, + +0.002696f, +0.008031f, -0.016401f, +0.008764f, +0.004462f, -0.004891f, +0.000950f, +0.000833f, -0.004346f, +0.008901f, + -0.007055f, -0.004093f, -0.000020f, -0.000615f, +0.004058f, -0.004596f, +0.002677f, +0.000502f, -0.002928f, -0.001144f, + +0.001983f, -0.001201f, +0.002763f, -0.004002f, -0.000841f, +0.001666f, -0.000451f, -0.000933f, +0.004012f, -0.000678f, + +0.002698f, -0.006655f, -0.001461f, -0.000854f, -0.000679f, +0.000728f, -0.001902f, +0.001174f, +0.001973f, +0.001126f, + +0.003167f, -0.000905f, +0.001025f, -0.002232f, -0.005672f, -0.002978f + }, + { + +0.014045f, -0.198845f, +0.016757f, +0.094252f, -0.009093f, +0.005447f, -0.005801f, +0.010413f, +0.002406f, +0.008599f, + -0.009901f, +0.021833f, -0.002222f, -0.001581f, +0.013502f, +0.015947f, +0.000324f, +0.006804f, +0.001726f, +0.008423f, + -0.004766f, +0.000430f, -0.001290f, -0.004566f, -0.007897f, +0.006771f, +0.001734f, -0.011194f, -0.007043f, -0.028527f, + +0.000099f, +0.009156f, -0.008177f, +0.003770f, -0.001211f, +0.009965f, +0.002537f, +0.016459f, +0.003810f, +0.011708f, + +0.002040f, +0.007172f, -0.001656f, +0.005362f, +0.010761f, -0.007799f, -0.001435f, +0.007808f, -0.002784f, +0.010336f, + +0.006944f, -0.001619f, +0.005285f, +0.006434f, -0.005834f, +0.000466f, -0.001140f, +0.000615f, +0.000583f, +0.001058f, + -0.001724f, -0.005138f, -0.001634f, -0.000077f, -0.007846f, -0.006369f, +0.004696f, +0.000515f, -0.002336f, -0.000932f, + +0.004049f, +0.006969f, -0.001366f, -0.006432f, -0.002343f, -0.002728f, +0.000893f, +0.000293f, +0.001089f, -0.005154f, + +0.001033f, +0.005076f, +0.005758f, -0.004559f, -0.001621f, -0.000131f, +0.001766f, +0.002993f, +0.001711f, +0.000882f, + -0.001538f, +0.000811f, +0.003346f, +0.002807f, -0.002015f, +0.002573f + }, + { + -0.001191f, +0.075452f, -0.051348f, -0.010026f, +0.005627f, +0.007181f, +0.019131f, +0.025279f, -0.003750f, -0.013721f, + -0.013086f, -0.002728f, +0.008792f, -0.024378f, +0.014043f, +0.006483f, +0.005308f, -0.002761f, +0.026896f, +0.024612f, + +0.004085f, -0.003604f, +0.004781f, -0.018678f, +0.002717f, -0.015263f, +0.000892f, +0.013414f, -0.006450f, +0.008372f, + +0.002363f, +0.000599f, +0.025440f, -0.003332f, +0.009848f, -0.011105f, +0.002573f, +0.009674f, +0.021808f, -0.022304f, + -0.003535f, +0.003304f, -0.018930f, -0.005676f, -0.011182f, +0.010389f, +0.006626f, -0.000876f, +0.003540f, +0.003834f, + -0.010645f, -0.002493f, +0.008621f, +0.005826f, -0.012367f, -0.007587f, -0.013042f, -0.005624f, -0.001196f, +0.000169f, + -0.011001f, -0.001666f, +0.002659f, -0.004960f, -0.008268f, -0.000342f, +0.001278f, +0.008077f, +0.006937f, +0.007061f, + +0.000523f, -0.001723f, -0.003318f, +0.002559f, -0.003100f, +0.002305f, -0.002152f, +0.001211f, +0.004531f, +0.000705f, + +0.002689f, -0.004146f, -0.007043f, +0.000024f, -0.000270f, +0.002340f, +0.002943f, +0.001136f, -0.003237f, +0.001967f, + -0.001830f, +0.000161f, -0.001582f, -0.002442f, +0.005107f, -0.000695f + }, + { + -0.016014f, -0.075257f, +0.038826f, +0.004357f, -0.018068f, +0.018153f, -0.046063f, -0.065021f, +0.010960f, +0.028767f, + +0.027766f, -0.027657f, -0.032898f, -0.030784f, +0.043647f, +0.007684f, -0.005290f, +0.003457f, -0.003571f, +0.008633f, + +0.002681f, +0.007126f, -0.008780f, -0.008442f, +0.011629f, -0.000537f, +0.002123f, +0.020557f, +0.010609f, +0.016414f, + -0.011781f, -0.001398f, -0.019640f, +0.010019f, +0.004065f, -0.014793f, +0.009424f, -0.005850f, -0.004276f, +0.003035f, + -0.006046f, +0.014025f, -0.006982f, -0.005251f, +0.007571f, +0.005206f, +0.020391f, -0.014003f, +0.001938f, +0.012165f, + +0.008723f, +0.001459f, -0.006318f, +0.007830f, -0.002542f, +0.002857f, -0.003700f, +0.013139f, -0.002932f, -0.010821f, + +0.006106f, +0.000596f, +0.005239f, +0.004347f, -0.004435f, -0.004554f, +0.006192f, +0.005369f, -0.002042f, +0.000227f, + -0.000360f, -0.005179f, +0.003609f, +0.003880f, +0.001326f, +0.000742f, -0.004474f, +0.003746f, -0.002370f, +0.003003f, + -0.003569f, -0.005135f, -0.003917f, -0.001494f, +0.001207f, -0.000853f, -0.001578f, +0.001343f, -0.001051f, -0.003379f, + +0.003538f, -0.001734f, +0.001574f, +0.000524f, +0.002344f, +0.001075f + }, + { + -0.000314f, +0.012186f, -0.032943f, -0.005713f, +0.004973f, +0.004483f, -0.015466f, -0.000540f, -0.001715f, -0.002550f, + -0.028120f, +0.010749f, -0.018601f, -0.017184f, +0.002124f, +0.004165f, -0.007080f, -0.001170f, +0.030018f, +0.010744f, + +0.005749f, -0.042284f, +0.008554f, -0.019868f, -0.017221f, +0.000957f, -0.012453f, -0.031262f, -0.017708f, +0.013423f, + +0.007702f, +0.002565f, +0.011509f, +0.015307f, +0.005263f, +0.006459f, -0.007782f, -0.015971f, +0.006083f, -0.007487f, + +0.013429f, +0.001186f, +0.005977f, +0.007423f, +0.001574f, -0.001098f, -0.001429f, +0.005574f, +0.014868f, -0.003658f, + +0.009588f, -0.004921f, -0.000816f, -0.004968f, +0.007862f, -0.003795f, -0.001556f, -0.000635f, +0.002679f, +0.002054f, + +0.001164f, -0.002943f, -0.004150f, -0.001447f, +0.004503f, -0.000166f, -0.001931f, -0.002589f, -0.006845f, +0.001937f, + +0.000336f, +0.003188f, +0.002493f, +0.000093f, +0.003004f, +0.003017f, -0.001613f, -0.000498f, +0.001392f, -0.001640f, + +0.000120f, -0.007027f, -0.005522f, -0.003424f, -0.000439f, -0.001222f, +0.002148f, +0.001807f, +0.005183f, -0.000529f, + -0.004248f, +0.004077f, -0.001147f, -0.001633f, +0.001753f, +0.000519f + }, + { + +0.028299f, -0.110028f, -0.054541f, -0.001565f, +0.007362f, +0.019777f, -0.031267f, -0.012635f, +0.002995f, +0.009949f, + +0.011368f, -0.010433f, -0.004986f, +0.020135f, -0.003119f, -0.040862f, +0.039931f, +0.004559f, +0.032401f, +0.023616f, + -0.021797f, +0.004399f, +0.000906f, -0.002838f, +0.017392f, +0.001521f, +0.000664f, +0.006269f, +0.011048f, -0.014113f, + +0.009410f, +0.019528f, -0.009634f, -0.003410f, -0.022481f, +0.009925f, -0.005351f, -0.013896f, +0.006754f, -0.009262f, + +0.008785f, +0.003990f, +0.001423f, -0.004642f, -0.015325f, -0.005599f, -0.003386f, -0.003837f, -0.018849f, -0.004256f, + +0.017338f, -0.000059f, +0.013360f, -0.001981f, -0.004725f, +0.002477f, -0.010032f, +0.000258f, -0.001156f, -0.010474f, + +0.000377f, -0.002507f, -0.009150f, +0.003028f, -0.006210f, -0.005983f, -0.000995f, +0.002459f, -0.010176f, +0.002309f, + -0.005431f, +0.004438f, +0.002389f, -0.000918f, -0.000704f, -0.009613f, +0.004988f, -0.006033f, -0.004428f, +0.002976f, + -0.002838f, -0.001831f, -0.002694f, +0.003109f, +0.002605f, +0.001016f, -0.002752f, +0.000901f, -0.001333f, +0.000442f, + -0.004259f, -0.002609f, -0.003847f, +0.004712f, +0.002358f, +0.003322f + }, + { + -0.003745f, +0.105224f, -0.030086f, -0.004368f, +0.001137f, +0.005089f, +0.004299f, +0.000215f, +0.013153f, +0.002320f, + +0.010509f, -0.005812f, +0.017811f, -0.008856f, -0.044790f, -0.034200f, -0.005149f, +0.003774f, +0.003440f, +0.024868f, + +0.007068f, -0.004147f, +0.008921f, +0.019026f, +0.002263f, -0.030551f, -0.007564f, -0.005910f, +0.021722f, +0.033827f, + -0.022048f, -0.015919f, -0.002862f, -0.001042f, -0.006627f, -0.010268f, -0.000763f, -0.001486f, +0.008545f, +0.010028f, + -0.014718f, -0.004554f, +0.003645f, -0.016658f, -0.001553f, -0.009200f, +0.000229f, +0.007843f, +0.003789f, -0.005524f, + -0.014524f, +0.011751f, +0.002664f, +0.006244f, +0.002609f, +0.011859f, -0.011590f, +0.005885f, -0.004374f, -0.001167f, + +0.008993f, +0.004153f, -0.002721f, +0.008844f, +0.002715f, -0.001092f, -0.002729f, +0.001910f, -0.000934f, -0.000608f, + +0.002081f, -0.006658f, -0.004151f, -0.000153f, +0.000823f, +0.006546f, +0.002635f, +0.000903f, -0.002719f, +0.000560f, + +0.005143f, +0.000290f, +0.002865f, -0.001407f, -0.005403f, +0.003962f, -0.001518f, +0.000782f, +0.005587f, -0.003671f, + +0.001497f, +0.004056f, -0.002602f, +0.001205f, +0.000008f, +0.000102f + }, + { + +0.022740f, -0.122504f, +0.002187f, -0.034534f, -0.027881f, +0.008717f, -0.015158f, -0.013693f, +0.016198f, +0.018461f, + +0.006532f, +0.010914f, -0.027596f, +0.023483f, +0.015290f, -0.009432f, +0.013604f, +0.019378f, -0.034642f, -0.003375f, + -0.002597f, -0.004550f, -0.021104f, +0.027458f, +0.012837f, +0.002890f, -0.016106f, +0.006046f, +0.003803f, +0.021525f, + -0.017097f, -0.027772f, -0.013331f, -0.007006f, +0.021699f, -0.016141f, +0.005426f, -0.002410f, +0.014715f, +0.006066f, + -0.004040f, +0.013733f, +0.004833f, -0.002601f, +0.011190f, -0.009024f, -0.002766f, +0.005039f, +0.008123f, +0.021742f, + +0.003206f, -0.009326f, -0.000533f, -0.006052f, +0.004750f, +0.004069f, +0.000609f, +0.005485f, +0.000268f, +0.012257f, + -0.003103f, -0.001270f, +0.000077f, -0.008916f, +0.007603f, -0.004933f, -0.005595f, -0.009919f, -0.000977f, -0.001633f, + -0.004613f, +0.000694f, +0.002568f, +0.006971f, -0.003274f, +0.002126f, -0.006111f, +0.002724f, +0.010998f, +0.004007f, + -0.008383f, +0.003426f, +0.000353f, -0.001738f, -0.002498f, -0.002263f, +0.002124f, +0.004221f, -0.000968f, -0.007375f, + +0.001191f, +0.003044f, +0.005690f, -0.002527f, -0.000464f, +0.000034f + } + }, + { + { + -0.001352f, -0.090659f, -0.020104f, +0.049967f, -0.025559f, -0.002949f, -0.001262f, +0.012338f, +0.009950f, +0.011038f, + -0.005484f, -0.004123f, -0.011341f, -0.020427f, -0.005560f, +0.030302f, +0.008941f, +0.008754f, -0.004541f, +0.015387f, + +0.021669f, -0.019778f, -0.017112f, +0.008871f, -0.004917f, -0.017386f, -0.005967f, +0.010210f, +0.006936f, +0.016303f, + +0.013282f, -0.011187f, +0.003283f, -0.022346f, -0.001709f, +0.004657f, +0.020719f, +0.004459f, -0.002277f, -0.001400f, + -0.000704f, -0.007380f, +0.007257f, +0.004286f, -0.000368f, -0.007157f, +0.003428f, +0.002840f, -0.001007f, +0.000846f, + +0.000700f, +0.005882f, -0.006544f, +0.001317f, -0.005981f, -0.001913f, -0.001764f, -0.004830f, +0.001086f, +0.003575f, + +0.000270f, +0.004821f, +0.003476f, -0.001011f, +0.008107f, +0.003985f, +0.000453f, +0.002883f, -0.002777f, +0.001129f, + +0.001153f, -0.002782f, +0.000842f, +0.001908f, -0.004538f, +0.003309f, +0.000582f, +0.000430f, -0.001111f, -0.001524f, + +0.002430f, +0.002165f, +0.000388f, +0.003032f, -0.002759f, -0.000457f, -0.004077f, -0.001487f, -0.000210f, +0.000130f, + +0.002790f, +0.000627f, +0.000271f, +0.003585f, -0.000004f, +0.000270f + }, + { + +0.009500f, +0.279015f, -0.054121f, -0.118754f, -0.055858f, -0.004959f, -0.018894f, -0.022364f, +0.008820f, -0.001452f, + +0.020240f, +0.011278f, -0.014677f, -0.004276f, +0.010007f, +0.000476f, +0.010698f, -0.028010f, -0.026386f, +0.001152f, + -0.014836f, +0.002877f, +0.000378f, -0.005776f, -0.004706f, +0.000622f, +0.006242f, -0.001146f, +0.002570f, +0.022587f, + -0.007233f, +0.000850f, +0.018626f, +0.005016f, +0.012121f, +0.010969f, -0.002154f, -0.007041f, +0.006790f, +0.009577f, + -0.007011f, -0.007172f, -0.000025f, -0.009800f, -0.001548f, -0.002388f, +0.004349f, +0.005877f, -0.004787f, -0.004935f, + -0.004664f, -0.002399f, -0.000286f, +0.002720f, +0.001139f, -0.005241f, +0.007147f, -0.002402f, -0.001890f, +0.012978f, + +0.005924f, -0.000911f, +0.004301f, -0.005053f, +0.002494f, -0.003333f, -0.003475f, -0.002509f, -0.000373f, -0.002785f, + +0.008519f, +0.003513f, +0.002453f, -0.001321f, -0.001816f, +0.002877f, -0.002091f, -0.004370f, +0.000592f, -0.002379f, + +0.000562f, +0.001703f, -0.001607f, +0.001752f, -0.000777f, -0.001738f, -0.000494f, +0.001370f, -0.000015f, -0.001587f, + -0.000989f, +0.000795f, -0.001652f, +0.000592f, -0.000421f, -0.000134f + }, + { + -0.004619f, -0.007284f, +0.073463f, -0.044741f, +0.011030f, +0.011374f, +0.015565f, -0.007638f, -0.014397f, +0.017936f, + -0.021068f, -0.005134f, -0.008204f, -0.003431f, +0.014743f, -0.002606f, +0.013784f, -0.010833f, -0.000434f, -0.002886f, + -0.003884f, -0.009593f, -0.012405f, +0.008358f, +0.006105f, +0.004774f, +0.005824f, +0.004199f, -0.004279f, -0.003304f, + +0.007022f, +0.005779f, +0.001003f, -0.006667f, -0.003955f, +0.008895f, -0.013855f, -0.000947f, +0.006763f, +0.009762f, + -0.003170f, +0.006768f, +0.016888f, +0.001462f, -0.011932f, -0.006774f, -0.009999f, +0.001722f, -0.001947f, +0.008766f, + -0.015349f, -0.008351f, -0.004200f, -0.005142f, +0.000003f, +0.002105f, +0.001081f, -0.000798f, -0.001548f, +0.009812f, + +0.003678f, +0.004360f, -0.003078f, -0.002847f, +0.001832f, -0.005778f, +0.000445f, +0.001128f, -0.003400f, -0.000164f, + -0.003198f, -0.000029f, -0.001359f, -0.004220f, -0.002003f, -0.002370f, -0.005070f, -0.001140f, -0.004039f, -0.002576f, + +0.000237f, -0.000666f, -0.001413f, -0.000738f, +0.000270f, -0.002999f, -0.002614f, -0.004133f, +0.000444f, +0.000105f, + +0.000044f, -0.000862f, -0.000415f, +0.002620f, +0.000539f, -0.001759f + }, + { + -0.002214f, -0.066486f, +0.006456f, +0.013674f, -0.002206f, -0.000452f, -0.001096f, +0.003646f, +0.003765f, -0.019816f, + +0.002196f, -0.023043f, -0.013688f, -0.009939f, +0.002583f, -0.026018f, -0.014575f, -0.017038f, -0.027212f, -0.014183f, + -0.024507f, -0.011672f, +0.009630f, +0.003728f, +0.000988f, -0.011406f, -0.001433f, +0.013335f, +0.007283f, +0.003860f, + +0.003328f, +0.005201f, +0.002864f, +0.016755f, +0.000545f, +0.004081f, +0.007044f, -0.014424f, -0.004938f, -0.012945f, + -0.005870f, +0.009235f, -0.012963f, -0.003794f, +0.002265f, -0.006044f, -0.007479f, -0.002419f, +0.002008f, +0.007985f, + -0.000682f, +0.001629f, -0.004720f, +0.008901f, +0.004183f, -0.001340f, -0.002888f, -0.000045f, +0.002232f, +0.004539f, + +0.001491f, -0.000627f, -0.000820f, +0.000395f, +0.002230f, -0.003947f, -0.002382f, +0.005075f, +0.004068f, -0.000853f, + +0.000970f, -0.002304f, -0.001703f, +0.000919f, -0.007404f, -0.003006f, +0.002531f, -0.000709f, +0.000766f, -0.000013f, + -0.008063f, -0.003531f, +0.001082f, -0.000805f, +0.000277f, +0.001851f, -0.001634f, -0.001688f, +0.000587f, -0.000357f, + +0.001968f, -0.001213f, +0.001945f, +0.003402f, +0.003115f, +0.000840f + }, + { + -0.009973f, -0.109242f, +0.012168f, +0.055011f, +0.003772f, +0.001913f, -0.002197f, +0.003732f, -0.012950f, +0.016565f, + +0.011438f, +0.018979f, +0.010917f, +0.009929f, +0.005080f, +0.012264f, +0.027324f, -0.007912f, +0.018742f, -0.012149f, + -0.003102f, +0.007920f, +0.008554f, -0.016474f, -0.002428f, +0.003753f, +0.013829f, -0.000655f, +0.001142f, +0.021597f, + +0.020936f, -0.005694f, +0.017592f, +0.017436f, +0.006519f, -0.004097f, -0.001999f, -0.014599f, -0.002040f, -0.009681f, + -0.018907f, -0.018470f, -0.008957f, -0.004516f, -0.000211f, +0.003640f, -0.006934f, +0.007725f, +0.008658f, -0.004696f, + -0.006307f, -0.002608f, +0.005886f, -0.002134f, +0.010221f, -0.003612f, +0.001998f, -0.004477f, -0.008409f, +0.002300f, + -0.001144f, -0.002666f, +0.005461f, +0.000479f, +0.006632f, -0.002818f, +0.004478f, +0.004837f, -0.003946f, -0.002222f, + -0.000696f, -0.003712f, -0.005955f, +0.000069f, -0.003363f, -0.001470f, +0.001411f, +0.000915f, +0.000184f, -0.001111f, + +0.002030f, +0.000342f, -0.002459f, -0.000502f, +0.003121f, -0.000131f, -0.001491f, -0.001087f, -0.001767f, -0.002495f, + +0.001389f, +0.000696f, -0.000350f, +0.003446f, -0.002311f, -0.000550f + }, + { + -0.000121f, +0.024822f, +0.015934f, +0.006360f, -0.006747f, -0.003432f, +0.001202f, -0.002691f, -0.002846f, -0.008931f, + -0.010417f, -0.008410f, +0.011614f, -0.019109f, +0.036045f, +0.002032f, -0.004873f, -0.030430f, -0.012372f, -0.012561f, + -0.013169f, +0.008691f, +0.004220f, -0.009743f, -0.012679f, +0.002830f, +0.017587f, -0.008753f, -0.018855f, +0.004261f, + -0.011079f, +0.000542f, -0.005146f, -0.006872f, +0.009681f, -0.003817f, +0.000622f, -0.006134f, -0.004649f, +0.002173f, + -0.005773f, -0.004790f, +0.004830f, +0.005281f, +0.003223f, +0.009625f, -0.000203f, -0.001997f, +0.000680f, +0.008973f, + +0.007476f, +0.003306f, +0.006665f, -0.011261f, -0.000366f, -0.002865f, +0.000272f, -0.001194f, +0.000391f, -0.003485f, + +0.002694f, +0.002215f, +0.005663f, +0.000730f, +0.001979f, +0.000427f, +0.000168f, -0.003366f, -0.001543f, -0.006789f, + +0.004088f, +0.001053f, +0.000229f, +0.005158f, +0.004151f, +0.000873f, -0.000677f, +0.001285f, +0.000529f, -0.003672f, + +0.001715f, -0.001561f, -0.001111f, +0.000395f, -0.001918f, -0.003027f, -0.001661f, -0.002352f, +0.003000f, -0.000030f, + -0.003063f, -0.001740f, +0.000530f, -0.001506f, -0.002317f, -0.000562f + }, + { + -0.023020f, -0.071051f, -0.022474f, +0.080458f, +0.002223f, -0.000186f, +0.006137f, -0.022582f, -0.035814f, +0.004431f, + +0.004682f, +0.008881f, +0.004732f, -0.017247f, -0.023012f, +0.000136f, -0.021076f, +0.015770f, -0.005604f, -0.023450f, + +0.007587f, +0.014031f, +0.005096f, -0.013487f, +0.000045f, -0.000642f, -0.002677f, +0.002015f, +0.001649f, +0.002145f, + +0.007926f, +0.015454f, +0.006995f, +0.019021f, -0.009792f, +0.006003f, -0.004799f, +0.002745f, -0.001645f, +0.011787f, + +0.008535f, +0.003723f, +0.003443f, -0.015718f, -0.003968f, -0.001381f, -0.002403f, +0.002510f, -0.003373f, +0.003805f, + -0.004949f, -0.003347f, +0.002412f, -0.011844f, -0.003657f, -0.000117f, +0.003683f, -0.000943f, +0.004130f, -0.000837f, + +0.004424f, +0.004616f, +0.002684f, -0.003402f, -0.003937f, -0.001240f, +0.004005f, -0.000690f, -0.000745f, +0.004060f, + -0.001313f, -0.005988f, +0.000408f, +0.003570f, +0.004058f, -0.000490f, +0.006780f, -0.005033f, +0.001041f, +0.000126f, + -0.001115f, -0.003722f, -0.001684f, +0.000826f, -0.002133f, +0.001397f, -0.001396f, +0.000533f, -0.001894f, +0.001591f, + -0.002290f, -0.000886f, +0.002512f, -0.000838f, -0.000582f, +0.002514f + }, + { + +0.002307f, +0.056206f, +0.048252f, -0.007428f, +0.007780f, -0.008973f, -0.007056f, -0.001539f, +0.006184f, +0.000206f, + -0.004035f, +0.002900f, +0.006721f, -0.003509f, +0.008458f, -0.015528f, -0.007141f, -0.007245f, -0.024580f, -0.016470f, + +0.002911f, -0.002207f, +0.012143f, -0.008179f, +0.002333f, -0.009665f, +0.007530f, -0.000266f, -0.007640f, -0.005697f, + -0.027174f, +0.005115f, +0.002887f, +0.011757f, -0.004258f, +0.000280f, +0.011295f, -0.000722f, +0.018597f, -0.001821f, + -0.012446f, +0.005635f, +0.005243f, +0.005303f, -0.002291f, +0.014483f, +0.002170f, +0.003504f, +0.003662f, -0.000364f, + +0.000638f, +0.008970f, -0.010527f, +0.006906f, -0.001098f, -0.006152f, +0.007518f, -0.003356f, +0.000539f, +0.006373f, + -0.001310f, -0.002623f, -0.001172f, +0.002389f, -0.001042f, -0.002760f, -0.005009f, +0.005517f, -0.001802f, +0.002034f, + +0.000941f, -0.000502f, +0.003182f, -0.005690f, -0.001430f, -0.000045f, -0.000026f, +0.001532f, +0.002703f, -0.000698f, + -0.001984f, -0.002396f, -0.001653f, +0.001491f, -0.004515f, -0.001655f, +0.000956f, -0.000315f, +0.002042f, +0.001047f, + +0.002262f, -0.000318f, -0.000663f, -0.002166f, -0.002235f, -0.004430f + }, + { + -0.021323f, -0.115452f, -0.018529f, +0.072883f, +0.003163f, +0.012651f, -0.007988f, +0.006076f, +0.021394f, +0.003838f, + +0.028180f, -0.012836f, +0.001889f, -0.008934f, +0.033047f, -0.004987f, -0.011024f, +0.018660f, +0.007494f, +0.010760f, + +0.005229f, -0.008646f, -0.007800f, +0.000511f, -0.003511f, +0.000940f, -0.001098f, -0.002703f, -0.024129f, -0.021727f, + -0.002322f, +0.005792f, -0.002707f, +0.006920f, +0.007510f, +0.005296f, -0.001647f, +0.010691f, +0.009983f, -0.001067f, + +0.008037f, +0.008297f, -0.003800f, +0.011326f, +0.010374f, -0.003206f, -0.000406f, -0.001152f, +0.002461f, +0.002230f, + +0.011753f, -0.001201f, +0.005054f, -0.003223f, +0.006472f, -0.006427f, +0.004299f, +0.000613f, +0.001841f, -0.000303f, + -0.006433f, -0.000117f, -0.001258f, +0.000181f, -0.009290f, -0.007375f, +0.005271f, +0.003782f, -0.001422f, -0.000171f, + +0.006229f, -0.001054f, -0.001044f, -0.000951f, -0.004201f, +0.001401f, -0.000948f, -0.001618f, +0.001086f, -0.001101f, + -0.002407f, +0.003479f, +0.001145f, -0.001483f, -0.000770f, -0.000988f, +0.001262f, +0.003444f, -0.000263f, +0.000494f, + -0.000194f, -0.000541f, +0.003978f, +0.003987f, -0.000415f, -0.001107f + }, + { + -0.003040f, +0.006090f, -0.012601f, -0.001727f, +0.025521f, +0.014574f, -0.017476f, +0.011177f, +0.020041f, -0.008940f, + -0.017724f, +0.002814f, -0.008077f, +0.010501f, -0.005973f, +0.008464f, +0.015253f, -0.011794f, +0.025158f, +0.052007f, + -0.027469f, +0.009167f, +0.003813f, -0.006338f, -0.010691f, -0.005055f, +0.003604f, +0.000421f, +0.001265f, -0.003911f, + +0.011341f, +0.012007f, +0.002581f, +0.006349f, +0.000601f, -0.004856f, -0.001202f, +0.005250f, +0.013868f, -0.006981f, + +0.000561f, -0.010329f, +0.001047f, -0.019737f, +0.000917f, +0.005762f, +0.006732f, -0.007520f, -0.000107f, -0.002203f, + -0.000018f, +0.000702f, +0.005297f, +0.001171f, -0.003237f, -0.016853f, -0.009790f, -0.010552f, +0.000252f, -0.004275f, + -0.017658f, +0.003417f, +0.001993f, -0.007189f, -0.007986f, -0.004524f, +0.004413f, +0.010931f, -0.000739f, +0.009497f, + -0.000749f, -0.000310f, -0.002892f, -0.000811f, +0.001849f, +0.003072f, -0.004065f, +0.004483f, -0.001238f, -0.003196f, + +0.000726f, -0.002782f, -0.003540f, +0.001572f, -0.000445f, +0.001940f, +0.003441f, -0.000887f, +0.002379f, -0.000938f, + -0.003152f, +0.002060f, -0.002964f, -0.001179f, +0.002276f, +0.000775f + }, + { + +0.020180f, -0.077264f, +0.003835f, +0.008196f, +0.005719f, -0.018381f, -0.000198f, -0.051291f, -0.010240f, +0.027750f, + +0.009841f, -0.008056f, -0.041790f, -0.031489f, +0.013262f, +0.014759f, -0.009908f, +0.003659f, +0.004030f, -0.006064f, + +0.019658f, -0.001519f, -0.004478f, -0.012936f, +0.000703f, +0.009322f, +0.015307f, +0.012395f, -0.001576f, +0.017214f, + +0.006032f, -0.017669f, -0.009491f, +0.010168f, -0.001559f, -0.015868f, +0.005110f, -0.000201f, -0.001346f, +0.000076f, + +0.009044f, -0.004116f, -0.000084f, +0.001026f, -0.000338f, +0.006280f, +0.008615f, +0.003088f, +0.005024f, +0.011181f, + +0.002647f, +0.007835f, -0.004148f, +0.009838f, -0.007682f, +0.003684f, -0.006710f, +0.015099f, -0.001585f, -0.008430f, + -0.001041f, +0.010924f, -0.000965f, +0.003428f, -0.004041f, +0.000527f, -0.003622f, +0.004525f, +0.002696f, -0.001780f, + -0.000135f, -0.001319f, +0.001156f, +0.004274f, +0.003564f, -0.000250f, -0.001316f, -0.001850f, +0.000877f, +0.000317f, + -0.000288f, -0.006098f, -0.003059f, -0.002424f, +0.000393f, -0.000926f, +0.000496f, -0.000418f, -0.000545f, -0.003593f, + +0.002232f, -0.001714f, +0.003944f, +0.001981f, +0.001868f, +0.002274f + }, + { + -0.002812f, -0.037538f, -0.001723f, -0.010172f, +0.007179f, +0.003799f, -0.006625f, -0.003681f, +0.002444f, -0.006729f, + +0.002031f, -0.017293f, -0.000033f, -0.054047f, +0.016087f, -0.010659f, -0.009057f, +0.000486f, +0.034788f, +0.018941f, + -0.003763f, -0.022366f, -0.006504f, -0.011377f, -0.011096f, -0.017094f, -0.007947f, -0.010859f, -0.032949f, +0.016574f, + +0.032378f, -0.012666f, -0.002265f, +0.021791f, +0.005472f, +0.006759f, -0.005964f, -0.005942f, -0.004070f, -0.007568f, + +0.009542f, +0.003441f, +0.017789f, -0.005924f, +0.004993f, -0.009557f, +0.004099f, +0.017163f, +0.001365f, -0.008036f, + +0.023002f, -0.010531f, +0.003131f, -0.003459f, +0.001865f, +0.004429f, -0.003440f, -0.000407f, -0.001726f, +0.008604f, + -0.003337f, -0.001150f, -0.001914f, +0.002100f, -0.006277f, +0.001671f, -0.002084f, +0.001415f, -0.006780f, -0.000130f, + +0.002057f, +0.003534f, +0.000534f, -0.001358f, +0.002033f, +0.005850f, +0.002603f, +0.001771f, -0.003983f, -0.003940f, + +0.002615f, -0.006608f, -0.004047f, -0.005005f, +0.000568f, -0.002111f, +0.003297f, -0.000743f, +0.005056f, -0.000613f, + -0.001554f, -0.000253f, +0.003917f, -0.000702f, -0.003552f, +0.001275f + }, + { + -0.031140f, -0.052877f, -0.036906f, -0.018560f, +0.019187f, -0.013136f, +0.003389f, +0.010173f, -0.007198f, +0.000071f, + -0.004636f, +0.007908f, +0.022079f, -0.008046f, -0.027027f, -0.022983f, +0.036724f, +0.008882f, +0.039652f, +0.012950f, + -0.009636f, -0.002536f, -0.005231f, +0.006860f, +0.016885f, -0.010491f, +0.001335f, +0.007217f, +0.003280f, +0.007853f, + +0.010074f, +0.003467f, -0.014977f, -0.005696f, -0.007740f, +0.020461f, -0.019315f, -0.005467f, +0.003774f, -0.004069f, + +0.001481f, -0.003792f, +0.002871f, -0.009031f, -0.000307f, -0.009300f, -0.003812f, -0.008254f, -0.012822f, +0.000843f, + +0.012486f, +0.003658f, +0.002235f, -0.000246f, +0.002780f, -0.002308f, -0.006106f, -0.000025f, -0.005288f, -0.013419f, + +0.002210f, -0.002363f, -0.005719f, -0.006012f, -0.009709f, +0.001358f, +0.002809f, -0.000511f, -0.003474f, -0.002510f, + -0.000313f, -0.005035f, +0.005084f, -0.001449f, -0.005182f, -0.004740f, +0.004070f, -0.006853f, +0.000033f, -0.002593f, + -0.001493f, -0.002767f, +0.001833f, +0.001452f, +0.002700f, -0.001220f, -0.000552f, +0.000611f, -0.003051f, +0.000527f, + -0.001997f, -0.003187f, +0.000510f, +0.002941f, +0.002701f, +0.000774f + }, + { + +0.000405f, +0.063496f, +0.007891f, -0.015403f, -0.000447f, +0.004930f, +0.012062f, -0.000142f, +0.010400f, +0.008043f, + +0.002747f, -0.003425f, +0.015515f, -0.019741f, -0.015608f, -0.009442f, -0.038886f, -0.010041f, +0.013332f, -0.006425f, + +0.034407f, +0.008425f, -0.000598f, +0.016272f, +0.007811f, -0.027313f, -0.004349f, -0.013010f, +0.020830f, +0.008191f, + +0.006458f, -0.009221f, -0.004171f, -0.011732f, -0.001494f, -0.009557f, +0.002518f, -0.003348f, -0.001409f, +0.010080f, + -0.005963f, -0.003928f, -0.005186f, -0.007263f, -0.002592f, -0.010552f, -0.002641f, +0.012975f, -0.001707f, -0.001190f, + -0.004350f, +0.009985f, -0.004782f, +0.012100f, +0.004836f, +0.003655f, -0.010062f, +0.008668f, -0.004133f, +0.001581f, + +0.001679f, +0.007216f, +0.004669f, +0.007550f, -0.001384f, -0.000462f, -0.000055f, +0.004666f, -0.002117f, -0.002399f, + +0.001551f, -0.005755f, -0.004421f, -0.001575f, +0.001387f, +0.007073f, +0.003749f, +0.000599f, -0.002200f, +0.001209f, + +0.003142f, +0.001934f, +0.000621f, -0.004691f, -0.001424f, -0.002384f, +0.002672f, -0.000120f, +0.005216f, -0.002299f, + +0.001009f, +0.002183f, +0.003358f, -0.001898f, +0.000410f, +0.001181f + }, + { + -0.025940f, -0.055351f, -0.018909f, -0.017904f, -0.009930f, -0.021777f, +0.000213f, -0.009233f, +0.015381f, +0.004027f, + +0.018450f, -0.018140f, +0.012744f, +0.042040f, -0.033283f, -0.004285f, +0.012669f, +0.013034f, -0.019626f, -0.001073f, + +0.002332f, +0.004021f, -0.016598f, +0.000789f, +0.014224f, +0.004260f, -0.016813f, +0.004807f, -0.000339f, +0.005008f, + -0.002598f, -0.007393f, -0.011379f, -0.013470f, +0.001983f, +0.004015f, +0.000587f, -0.000707f, +0.011597f, +0.004982f, + -0.006962f, +0.017721f, -0.002011f, +0.004621f, -0.005023f, -0.001675f, +0.002441f, +0.001421f, +0.006169f, +0.006847f, + +0.009700f, -0.005904f, -0.004932f, +0.000200f, -0.003245f, +0.001361f, +0.006620f, +0.010318f, +0.002564f, +0.004162f, + -0.000716f, -0.006021f, -0.005916f, +0.004572f, +0.001043f, -0.000871f, -0.002635f, -0.009522f, -0.004949f, -0.003335f, + -0.005228f, +0.003390f, +0.001583f, +0.003512f, -0.001977f, +0.001345f, -0.004800f, +0.008732f, +0.005605f, -0.001832f, + +0.001247f, +0.001011f, +0.002179f, -0.002367f, -0.006020f, +0.000791f, +0.002517f, +0.000665f, +0.002337f, -0.003389f, + -0.001178f, +0.003220f, +0.003527f, -0.002901f, -0.002510f, +0.000048f + } + }, + { + { + +0.000245f, -0.014068f, +0.026797f, +0.065150f, -0.020748f, -0.004243f, +0.001653f, -0.002266f, +0.001209f, +0.005580f, + -0.008129f, -0.018250f, -0.018446f, -0.007815f, +0.002021f, +0.011038f, -0.022833f, -0.009363f, -0.019510f, -0.005111f, + +0.008857f, -0.016132f, -0.040787f, -0.011875f, +0.008412f, -0.000655f, -0.000317f, -0.003435f, -0.006406f, -0.000375f, + +0.009468f, -0.008064f, +0.007110f, -0.014429f, -0.001078f, +0.003389f, +0.014845f, -0.000787f, -0.004465f, -0.006249f, + -0.002049f, -0.007794f, +0.006726f, +0.003885f, -0.001396f, -0.011497f, -0.001331f, +0.001765f, +0.001788f, +0.007061f, + +0.004334f, +0.010216f, -0.003833f, -0.000722f, -0.008354f, +0.003968f, +0.002759f, -0.008644f, -0.001626f, +0.001051f, + -0.005979f, +0.001607f, +0.005387f, +0.000248f, +0.001212f, -0.003603f, +0.000432f, +0.004758f, +0.003995f, +0.002466f, + +0.002882f, -0.005023f, -0.006824f, +0.003644f, -0.002869f, +0.001620f, +0.004139f, +0.004086f, -0.002062f, +0.000349f, + +0.001528f, -0.001789f, +0.000699f, +0.003658f, -0.000486f, +0.002805f, -0.000842f, -0.000416f, +0.000044f, +0.001705f, + +0.003653f, +0.002290f, +0.002577f, +0.003168f, -0.000534f, -0.001094f + }, + { + -0.007616f, +0.293974f, -0.017633f, -0.106164f, -0.032509f, +0.008405f, +0.015694f, +0.024423f, +0.011515f, -0.031116f, + +0.002389f, +0.036281f, +0.011679f, +0.005057f, -0.000198f, -0.000528f, +0.030884f, -0.011745f, -0.001235f, +0.023407f, + -0.003411f, +0.004450f, -0.011100f, -0.017873f, -0.007545f, -0.004735f, +0.015161f, -0.000353f, -0.015807f, +0.019138f, + -0.009005f, +0.001537f, +0.017755f, -0.000559f, -0.000792f, -0.001621f, +0.006755f, +0.013259f, +0.018541f, +0.010075f, + -0.007974f, -0.007055f, +0.005285f, -0.003414f, -0.001104f, -0.004942f, +0.002415f, +0.008235f, +0.007124f, -0.002696f, + -0.001949f, +0.006533f, -0.003443f, -0.006698f, -0.003819f, -0.002584f, +0.002481f, -0.008504f, -0.008719f, +0.000675f, + -0.000643f, -0.003775f, +0.003413f, -0.002702f, +0.004722f, -0.000020f, +0.000194f, -0.005516f, -0.002812f, -0.002265f, + +0.006342f, +0.001992f, -0.001067f, -0.004479f, -0.002691f, +0.005575f, -0.001123f, -0.000190f, +0.004252f, -0.003812f, + -0.002365f, -0.000475f, -0.001022f, +0.001507f, -0.001362f, -0.000561f, +0.001053f, +0.002389f, +0.001497f, -0.001967f, + -0.001315f, -0.000142f, -0.002946f, +0.000925f, +0.000310f, +0.000992f + }, + { + +0.008355f, -0.121090f, -0.030040f, -0.003239f, +0.018980f, -0.004623f, +0.014222f, +0.001379f, -0.005244f, +0.021426f, + +0.005471f, +0.012795f, -0.003502f, +0.008605f, +0.023983f, +0.012503f, +0.021888f, -0.018050f, +0.003872f, +0.021788f, + -0.000049f, -0.004598f, +0.006408f, +0.018338f, +0.010739f, +0.003953f, -0.005770f, +0.005790f, +0.010650f, +0.000975f, + -0.000013f, -0.000411f, -0.000438f, -0.010100f, -0.003461f, +0.013171f, -0.004551f, -0.003717f, +0.001829f, +0.010283f, + -0.002955f, -0.000139f, +0.009695f, +0.004754f, -0.005376f, +0.010773f, +0.005572f, +0.002887f, -0.005968f, +0.006789f, + -0.001070f, +0.006499f, +0.004045f, -0.000946f, +0.005581f, +0.004816f, -0.002252f, -0.004023f, -0.006569f, +0.001961f, + +0.000350f, +0.002630f, -0.005509f, -0.003998f, +0.004729f, -0.003968f, +0.002136f, +0.004580f, -0.003003f, -0.001149f, + +0.000159f, +0.002082f, -0.001863f, -0.000578f, -0.000608f, -0.005120f, -0.004560f, +0.001584f, +0.003690f, +0.005226f, + +0.001035f, -0.002021f, -0.000562f, +0.000590f, +0.004709f, +0.000320f, -0.001344f, -0.002701f, -0.001037f, +0.000610f, + -0.001743f, -0.003473f, -0.000908f, +0.003489f, +0.000854f, -0.003799f + }, + { + +0.003163f, -0.068756f, -0.004152f, +0.016838f, +0.006060f, -0.001439f, -0.002180f, -0.001224f, +0.003049f, -0.019819f, + -0.002744f, -0.014122f, -0.007158f, +0.002353f, +0.025767f, -0.004947f, +0.013532f, +0.007183f, +0.004132f, +0.001230f, + -0.016226f, -0.014778f, +0.010230f, +0.004531f, -0.011114f, -0.010225f, -0.007620f, -0.004453f, +0.003914f, -0.003857f, + +0.004014f, +0.014946f, -0.000034f, +0.013033f, +0.002451f, -0.001861f, +0.012936f, -0.005270f, +0.000672f, -0.004912f, + -0.002523f, +0.014029f, -0.002266f, +0.002547f, +0.011322f, +0.001603f, +0.001176f, -0.001272f, -0.008657f, -0.003069f, + -0.003363f, -0.003102f, -0.008411f, +0.003709f, +0.001973f, -0.001642f, -0.000385f, +0.003791f, -0.001091f, +0.006483f, + +0.001810f, +0.002117f, +0.002891f, -0.001394f, +0.003966f, -0.002844f, -0.007102f, -0.000455f, -0.002767f, -0.002437f, + +0.006120f, +0.002437f, -0.000096f, +0.001211f, -0.005139f, -0.001903f, +0.001223f, -0.003244f, -0.002522f, +0.003347f, + -0.003962f, -0.000482f, -0.000258f, -0.001736f, +0.002040f, +0.001429f, -0.002224f, -0.000544f, +0.000283f, -0.000137f, + +0.002487f, -0.003352f, +0.000583f, +0.000813f, -0.000540f, -0.000581f + }, + { + +0.017885f, -0.063203f, +0.012991f, +0.042167f, -0.007484f, -0.005431f, -0.002440f, +0.014916f, -0.013990f, +0.017422f, + +0.012953f, +0.014663f, +0.003089f, +0.004793f, +0.006352f, -0.011674f, +0.008537f, -0.000324f, +0.041015f, -0.004181f, + -0.003439f, +0.006162f, +0.012114f, +0.002091f, +0.003921f, +0.001426f, -0.001396f, -0.001732f, +0.008660f, +0.005969f, + +0.008183f, -0.006156f, +0.012806f, +0.004892f, -0.000120f, -0.007931f, +0.002763f, +0.009014f, +0.001908f, -0.005755f, + -0.004734f, -0.010044f, -0.000897f, +0.007138f, +0.011674f, +0.006481f, -0.008837f, +0.006017f, +0.004268f, +0.000190f, + -0.000774f, -0.005608f, +0.001460f, -0.002520f, +0.005795f, -0.008074f, -0.004258f, -0.003530f, -0.001903f, +0.006986f, + -0.003580f, -0.001301f, +0.002959f, -0.004740f, +0.006249f, -0.000753f, +0.004468f, +0.002553f, -0.004229f, -0.000928f, + -0.001209f, -0.000932f, +0.000786f, +0.003652f, -0.001767f, -0.002947f, +0.000595f, +0.003815f, +0.000688f, -0.000286f, + +0.001430f, -0.000317f, -0.000549f, +0.001319f, +0.002198f, -0.000135f, -0.001834f, -0.003414f, +0.000982f, -0.000083f, + -0.000206f, -0.002138f, -0.002526f, +0.002047f, -0.002895f, +0.000553f + }, + { + -0.002906f, +0.006029f, +0.004991f, +0.006745f, -0.002844f, -0.001806f, +0.005413f, +0.000579f, -0.000367f, -0.007732f, + -0.007596f, -0.005095f, +0.004240f, -0.009945f, +0.070097f, +0.027067f, +0.032156f, -0.003792f, +0.003055f, -0.000419f, + -0.001362f, +0.017853f, -0.004153f, -0.010112f, -0.000772f, +0.008681f, +0.025045f, +0.005203f, +0.004290f, +0.002130f, + -0.020857f, -0.012207f, -0.012718f, -0.007343f, -0.000303f, -0.006482f, -0.001630f, -0.008053f, -0.002683f, +0.009163f, + -0.005982f, -0.009023f, +0.004160f, +0.004320f, +0.001799f, +0.009457f, +0.004559f, +0.006454f, -0.001777f, +0.006937f, + +0.002743f, -0.000018f, +0.008390f, -0.007957f, -0.005211f, -0.003993f, +0.004484f, -0.002242f, -0.002010f, -0.003515f, + +0.002377f, +0.001875f, +0.003387f, +0.001118f, +0.004862f, -0.000184f, -0.002813f, -0.001330f, +0.000655f, -0.007626f, + +0.003035f, -0.002167f, +0.000176f, +0.005348f, +0.004635f, +0.001542f, -0.001672f, -0.002710f, -0.003517f, -0.004826f, + +0.002248f, -0.000718f, +0.000182f, +0.003730f, -0.000808f, -0.001560f, +0.000952f, -0.000577f, +0.003497f, +0.000409f, + -0.000581f, -0.002442f, -0.002166f, -0.001154f, -0.001704f, -0.002186f + }, + { + +0.030302f, +0.001869f, -0.021688f, +0.078637f, +0.002439f, +0.007165f, -0.000862f, -0.002786f, -0.002352f, -0.013198f, + -0.007319f, +0.013134f, +0.012540f, -0.009745f, -0.020817f, +0.011246f, +0.017413f, +0.019584f, +0.007672f, -0.001935f, + +0.011813f, +0.010430f, +0.003291f, -0.018642f, +0.007422f, +0.003020f, -0.010807f, -0.004198f, +0.005714f, +0.000031f, + +0.014148f, +0.020780f, -0.011998f, +0.008891f, -0.001558f, +0.020359f, -0.004237f, +0.002937f, +0.002331f, +0.002577f, + +0.001752f, -0.000044f, +0.006245f, -0.007636f, +0.011218f, -0.000391f, -0.000982f, +0.007932f, -0.000873f, +0.010388f, + +0.003471f, +0.001677f, +0.001853f, -0.006373f, +0.003184f, +0.001412f, +0.007631f, +0.001236f, +0.005600f, +0.000642f, + -0.001732f, -0.002140f, +0.004041f, -0.000707f, -0.006917f, -0.004909f, -0.003726f, -0.000069f, +0.008151f, +0.006586f, + +0.001353f, -0.004417f, -0.001250f, +0.000608f, +0.004212f, +0.000261f, +0.003950f, -0.006308f, +0.002171f, +0.000280f, + -0.001567f, -0.001117f, -0.003258f, -0.003565f, -0.002689f, +0.002144f, -0.000160f, +0.001510f, -0.002569f, +0.001485f, + -0.003318f, +0.000460f, +0.002218f, -0.001126f, +0.001970f, +0.001576f + }, + { + -0.006558f, -0.043411f, -0.016275f, -0.018264f, +0.009099f, -0.001106f, +0.001022f, +0.005945f, +0.005865f, -0.006670f, + -0.003034f, +0.015628f, -0.003485f, -0.046527f, -0.001903f, +0.012885f, +0.023102f, +0.011067f, -0.013232f, -0.005528f, + -0.009400f, -0.015631f, +0.008251f, -0.015216f, +0.000304f, -0.011471f, +0.002523f, -0.005074f, +0.008924f, +0.012014f, + -0.006948f, +0.015486f, -0.005319f, +0.010415f, +0.003281f, +0.002618f, +0.015928f, -0.005277f, -0.004841f, -0.012012f, + +0.000472f, +0.011390f, +0.004200f, +0.005588f, -0.001464f, +0.011940f, +0.000043f, -0.002230f, +0.001055f, -0.002575f, + +0.002444f, +0.008968f, -0.007087f, +0.003935f, -0.005446f, -0.004872f, +0.007191f, -0.004816f, +0.004588f, +0.010491f, + +0.003437f, +0.001956f, +0.002862f, +0.005262f, -0.003679f, +0.000150f, -0.003479f, +0.004508f, -0.001384f, +0.004543f, + +0.004982f, +0.001502f, +0.003274f, -0.005582f, -0.006007f, -0.001462f, +0.000445f, +0.001658f, -0.000448f, -0.005029f, + -0.002445f, +0.000407f, +0.001421f, +0.001047f, -0.005230f, -0.000702f, -0.000161f, -0.002697f, +0.000548f, -0.000088f, + +0.000232f, -0.002310f, -0.001535f, -0.000479f, -0.000021f, -0.003015f + }, + { + +0.031972f, -0.044615f, -0.009200f, +0.080944f, -0.008678f, +0.004819f, -0.007966f, +0.003097f, +0.016650f, -0.017342f, + +0.019485f, -0.007342f, -0.011805f, -0.015859f, +0.030061f, +0.003036f, -0.014318f, +0.002162f, +0.001638f, -0.001607f, + -0.006251f, -0.017565f, -0.009949f, +0.005307f, +0.007227f, +0.008088f, -0.006978f, +0.004882f, -0.012619f, -0.004614f, + -0.005491f, -0.007586f, -0.001434f, +0.003457f, +0.008341f, +0.009811f, -0.001789f, -0.004132f, -0.000411f, -0.003673f, + -0.000898f, -0.001541f, -0.006491f, +0.005745f, +0.006995f, -0.003814f, -0.001299f, -0.000762f, +0.003408f, -0.006024f, + +0.004911f, -0.000056f, +0.004186f, -0.007602f, +0.008406f, -0.002502f, +0.000563f, -0.003735f, -0.003571f, +0.003126f, + -0.005865f, +0.001101f, +0.000916f, +0.003974f, +0.000113f, +0.000721f, +0.002029f, -0.000140f, -0.001958f, -0.001436f, + +0.003691f, -0.000113f, +0.000172f, +0.002972f, -0.000638f, +0.002684f, -0.000967f, -0.002473f, -0.000555f, +0.001633f, + -0.001275f, -0.000572f, -0.000082f, +0.000048f, +0.000047f, -0.000699f, -0.000916f, -0.000619f, -0.004050f, -0.000636f, + -0.000813f, -0.001076f, -0.000098f, +0.002155f, +0.001211f, -0.001447f + }, + { + +0.007257f, -0.013929f, -0.016307f, +0.001469f, +0.012282f, -0.017963f, -0.042032f, -0.004732f, +0.014056f, +0.003092f, + -0.002883f, +0.016219f, -0.000582f, +0.030104f, +0.009931f, -0.002086f, +0.003750f, -0.012067f, -0.011128f, +0.019531f, + -0.025480f, +0.005451f, +0.007079f, -0.020279f, -0.017411f, +0.004528f, -0.005805f, -0.007415f, +0.006186f, -0.007960f, + +0.011473f, +0.014184f, -0.007098f, -0.011243f, -0.012060f, -0.000463f, -0.003158f, -0.002472f, +0.012044f, -0.001175f, + -0.001311f, -0.010062f, +0.011046f, -0.003490f, +0.007294f, -0.000578f, +0.001630f, -0.008929f, +0.003694f, -0.000457f, + +0.000062f, +0.002862f, -0.003946f, +0.000100f, +0.007654f, -0.012496f, -0.002181f, -0.002649f, +0.003601f, +0.003600f, + -0.010258f, +0.006076f, +0.002501f, -0.006755f, -0.005454f, +0.002827f, +0.000828f, +0.000884f, -0.010197f, +0.001659f, + -0.001434f, +0.000778f, -0.001345f, +0.003823f, +0.000835f, +0.000097f, +0.000009f, +0.004899f, -0.003186f, -0.003352f, + -0.001032f, -0.000548f, +0.000111f, +0.000840f, -0.002273f, +0.001675f, +0.000741f, -0.002990f, +0.004130f, +0.000207f, + -0.003729f, +0.001299f, -0.002687f, -0.001795f, +0.000663f, +0.000293f + }, + { + -0.021326f, -0.108604f, -0.004676f, -0.007831f, +0.013048f, +0.001451f, +0.025859f, -0.008861f, +0.013623f, +0.021033f, + -0.000946f, -0.000077f, -0.010249f, -0.011949f, -0.008337f, -0.003370f, -0.019506f, -0.011768f, -0.006622f, -0.019653f, + +0.009879f, -0.003429f, +0.001895f, -0.016324f, -0.009123f, +0.006285f, +0.001242f, -0.000560f, -0.011019f, -0.009505f, + -0.010740f, -0.019453f, -0.007070f, -0.008147f, +0.000947f, +0.014918f, +0.024147f, +0.002407f, +0.010441f, -0.000738f, + -0.007277f, -0.013719f, +0.005655f, +0.005082f, -0.000921f, +0.006657f, -0.000242f, -0.006392f, +0.004602f, +0.003908f, + -0.014594f, -0.001632f, -0.007296f, +0.010765f, -0.001216f, +0.010621f, -0.006112f, +0.007056f, -0.000182f, -0.004265f, + -0.006779f, +0.007023f, +0.003492f, +0.003892f, -0.006895f, +0.000224f, -0.002345f, +0.002803f, -0.001659f, -0.003136f, + +0.002248f, +0.001290f, +0.000112f, -0.000857f, +0.002499f, -0.001207f, -0.000953f, -0.000506f, +0.000546f, -0.001584f, + +0.004466f, -0.001872f, -0.001696f, -0.001835f, -0.000476f, -0.002494f, -0.001559f, -0.002931f, -0.001523f, -0.001473f, + +0.001095f, -0.001904f, +0.004342f, +0.000479f, +0.001717f, +0.002037f + }, + { + +0.004422f, -0.050168f, -0.016994f, -0.007784f, +0.002928f, +0.002439f, +0.007551f, -0.004839f, -0.000581f, +0.000891f, + +0.024675f, -0.006597f, +0.012822f, -0.051586f, +0.004134f, -0.010013f, -0.004238f, -0.000878f, +0.013329f, +0.003110f, + +0.007279f, +0.004930f, +0.003411f, +0.000450f, -0.003681f, -0.011652f, +0.020663f, +0.026289f, -0.001962f, +0.012668f, + +0.026701f, -0.003379f, +0.004314f, +0.022370f, +0.003935f, +0.001098f, -0.009927f, +0.010163f, +0.000718f, -0.005088f, + +0.009580f, +0.001426f, +0.014600f, -0.012020f, +0.002219f, -0.013019f, -0.003176f, +0.012869f, -0.000217f, -0.016454f, + +0.016804f, +0.001661f, +0.016949f, +0.001172f, -0.000640f, +0.006977f, +0.003911f, +0.007953f, +0.001862f, +0.005582f, + -0.001860f, +0.001020f, -0.006579f, +0.002792f, -0.004362f, +0.002637f, +0.000685f, +0.002594f, -0.006149f, +0.000340f, + -0.005839f, -0.003576f, -0.003097f, -0.000195f, +0.002778f, +0.000744f, +0.001443f, +0.002073f, -0.000465f, +0.001835f, + -0.000488f, -0.003783f, +0.002735f, -0.000978f, +0.001864f, -0.003451f, +0.002317f, +0.000080f, +0.003549f, -0.003254f, + -0.001873f, +0.000520f, +0.005458f, +0.000517f, -0.003214f, +0.002024f + }, + { + +0.027244f, +0.062653f, -0.013275f, -0.012378f, +0.014916f, -0.047121f, -0.007986f, -0.006053f, -0.022401f, -0.010362f, + -0.013663f, +0.016086f, +0.014789f, -0.030105f, +0.005225f, -0.004968f, +0.015134f, -0.002761f, +0.031201f, -0.001274f, + -0.015345f, -0.004712f, +0.006003f, +0.009177f, -0.000271f, -0.016036f, -0.006929f, -0.012758f, -0.006541f, +0.003194f, + -0.008306f, -0.009844f, -0.011727f, -0.000025f, +0.001280f, +0.018834f, -0.011952f, +0.012855f, -0.011019f, -0.010661f, + +0.000975f, -0.015195f, +0.003094f, +0.011582f, +0.018869f, +0.002193f, +0.006970f, +0.005893f, +0.000897f, +0.002346f, + +0.009253f, -0.002881f, -0.008862f, -0.006438f, +0.000213f, -0.001403f, +0.000402f, -0.002114f, -0.006639f, -0.007288f, + +0.003663f, +0.000103f, -0.005548f, -0.009784f, -0.006959f, +0.002450f, -0.001476f, +0.002488f, +0.000839f, -0.004780f, + +0.002346f, -0.004302f, -0.000115f, -0.005413f, -0.005300f, -0.000053f, +0.007516f, +0.000528f, +0.003566f, -0.004229f, + +0.000664f, +0.001791f, +0.000640f, -0.003135f, +0.001484f, +0.000167f, +0.001665f, +0.002375f, +0.000415f, +0.002576f, + -0.000287f, -0.001120f, -0.001123f, -0.000127f, +0.000167f, -0.000654f + }, + { + +0.003043f, +0.053434f, +0.006697f, -0.000761f, +0.013583f, +0.005198f, +0.002163f, -0.019413f, -0.009436f, +0.008950f, + +0.009593f, -0.008150f, -0.004859f, +0.057312f, +0.146504f, +0.040140f, -0.041345f, -0.022146f, +0.011050f, -0.019553f, + +0.023440f, +0.020899f, +0.004970f, -0.009580f, -0.005466f, -0.027085f, +0.000444f, -0.003055f, +0.013410f, -0.008059f, + +0.008432f, -0.011773f, -0.000362f, -0.005536f, +0.008694f, -0.000624f, +0.012597f, +0.001106f, -0.018864f, +0.003938f, + +0.002787f, -0.012531f, -0.012902f, -0.001152f, -0.000286f, -0.011449f, -0.002076f, +0.011143f, -0.011117f, -0.004143f, + -0.001250f, +0.003660f, -0.007067f, +0.008653f, +0.006320f, +0.001703f, -0.012513f, +0.005571f, -0.003309f, +0.003763f, + -0.007687f, +0.001222f, +0.003833f, -0.002107f, -0.006309f, -0.000838f, +0.000495f, +0.004571f, -0.004792f, -0.002144f, + +0.001287f, +0.000838f, +0.000289f, -0.003195f, -0.000516f, +0.004080f, +0.003324f, +0.000123f, -0.001210f, -0.001125f, + -0.001867f, +0.000438f, -0.000500f, -0.003767f, +0.001629f, -0.000955f, +0.002267f, -0.003028f, +0.001301f, -0.001541f, + +0.000247f, +0.000003f, +0.000546f, -0.005216f, -0.002132f, +0.000469f + }, + { + +0.026735f, +0.031288f, -0.002974f, -0.006824f, -0.004170f, -0.013950f, +0.011532f, +0.002059f, +0.006090f, -0.029031f, + -0.028275f, -0.037291f, +0.011784f, -0.011819f, -0.088485f, -0.012323f, +0.034292f, +0.030290f, +0.010350f, +0.029581f, + +0.011878f, +0.005004f, +0.001352f, +0.006735f, +0.026741f, +0.012338f, -0.015733f, +0.016495f, +0.007052f, +0.008444f, + +0.030838f, +0.017473f, -0.017911f, -0.006537f, +0.005844f, +0.000417f, -0.010016f, -0.003186f, -0.008354f, -0.005565f, + -0.008116f, +0.005375f, -0.010838f, -0.002865f, -0.012073f, -0.004017f, +0.004086f, -0.002171f, -0.002174f, -0.010004f, + -0.001678f, -0.011466f, -0.005279f, -0.000309f, -0.009145f, +0.001148f, +0.008472f, +0.005005f, -0.000930f, -0.005817f, + -0.005180f, -0.008613f, -0.004948f, +0.008810f, -0.001157f, +0.000486f, -0.000715f, -0.004680f, -0.003026f, -0.000576f, + -0.003119f, +0.003072f, +0.000514f, -0.001704f, -0.003354f, +0.004596f, -0.001313f, +0.007905f, -0.002778f, -0.006430f, + +0.002881f, +0.000034f, +0.002011f, -0.001730f, -0.005185f, +0.001395f, +0.004191f, +0.000159f, +0.003630f, +0.001044f, + -0.000678f, +0.000536f, -0.000323f, -0.003476f, -0.001146f, +0.000327f + } + }, + { + { + +0.002141f, +0.058218f, -0.016126f, +0.015408f, +0.002458f, -0.004789f, +0.003331f, -0.008028f, -0.012076f, +0.005837f, + +0.012799f, -0.036831f, +0.003183f, -0.008745f, -0.006536f, +0.004108f, -0.016613f, -0.001759f, -0.001840f, -0.018749f, + -0.005244f, -0.010422f, -0.023884f, -0.013142f, +0.014564f, -0.009334f, +0.006058f, -0.025888f, +0.007273f, -0.006025f, + -0.007141f, +0.002197f, +0.002904f, +0.002643f, -0.000352f, -0.011392f, +0.008480f, +0.006069f, -0.008357f, -0.010972f, + +0.004683f, -0.002619f, +0.006741f, -0.004043f, +0.001512f, -0.012293f, -0.003597f, +0.006969f, -0.005265f, +0.011418f, + +0.008416f, +0.004677f, +0.002739f, -0.004189f, -0.008997f, +0.002225f, -0.000848f, -0.005069f, +0.004935f, -0.001796f, + -0.003291f, -0.001403f, +0.000467f, +0.002912f, -0.002362f, -0.004775f, +0.004417f, -0.003583f, +0.010178f, +0.003184f, + -0.000002f, -0.004177f, -0.006014f, +0.003474f, -0.002964f, -0.000768f, +0.004205f, +0.005897f, +0.000947f, -0.001229f, + +0.000833f, -0.000778f, +0.002753f, -0.000657f, +0.000024f, +0.002540f, +0.000095f, +0.001882f, -0.002057f, +0.003952f, + +0.002676f, +0.001606f, +0.004102f, -0.000000f, -0.000032f, +0.001169f + }, + { + +0.007317f, +0.237430f, +0.033904f, -0.161933f, +0.031218f, +0.000566f, +0.019346f, +0.033601f, -0.003239f, -0.016472f, + -0.000577f, +0.047694f, -0.000383f, -0.001986f, -0.004823f, +0.002085f, +0.012025f, +0.005409f, +0.024144f, +0.004625f, + -0.010788f, +0.004471f, -0.010975f, -0.009028f, -0.002251f, -0.009598f, +0.006464f, +0.010912f, -0.015429f, +0.007776f, + -0.000950f, +0.004891f, +0.003836f, -0.003482f, +0.001621f, +0.004469f, +0.004795f, +0.014123f, +0.016509f, +0.002852f, + -0.001885f, -0.010978f, -0.004018f, +0.001668f, +0.007750f, -0.008904f, +0.003446f, -0.000342f, +0.019578f, -0.011567f, + -0.003536f, +0.006057f, -0.003403f, -0.003437f, -0.002377f, -0.000314f, -0.005362f, -0.005690f, -0.002245f, -0.006161f, + +0.001824f, -0.008650f, -0.002449f, +0.002885f, +0.001010f, +0.006024f, +0.001005f, -0.002379f, -0.007322f, +0.003270f, + -0.002632f, +0.001492f, -0.002443f, +0.000880f, -0.003342f, +0.004490f, +0.000176f, +0.001764f, +0.001140f, +0.000826f, + -0.003458f, -0.002609f, +0.001539f, -0.002619f, +0.002156f, -0.000838f, +0.002607f, -0.000648f, +0.000724f, -0.001595f, + -0.000493f, -0.000509f, +0.000219f, +0.002928f, -0.001134f, -0.001329f + }, + { + -0.007839f, -0.151081f, +0.016031f, +0.063568f, -0.056096f, +0.015111f, -0.001031f, -0.011990f, +0.020499f, +0.001629f, + +0.008320f, +0.020093f, -0.003100f, +0.017618f, +0.018170f, +0.016606f, +0.021841f, -0.014833f, +0.001374f, +0.049415f, + -0.024645f, -0.005746f, +0.019716f, +0.007774f, +0.007514f, +0.006151f, -0.012420f, +0.018230f, +0.009989f, -0.001436f, + -0.005004f, +0.002693f, +0.006178f, -0.016725f, +0.005804f, -0.003180f, +0.018145f, -0.014805f, +0.004793f, +0.004600f, + +0.008873f, -0.007611f, -0.004542f, +0.014147f, -0.005524f, +0.009697f, +0.010273f, -0.001110f, -0.000578f, -0.003794f, + +0.011698f, +0.006335f, +0.006710f, +0.000071f, +0.001867f, +0.004392f, -0.001037f, -0.001787f, -0.003918f, +0.000025f, + +0.000644f, +0.001449f, -0.007385f, -0.001215f, +0.005105f, -0.001729f, +0.000043f, -0.000402f, +0.004212f, -0.005505f, + +0.000402f, +0.002191f, -0.000657f, +0.001376f, +0.001779f, -0.004531f, -0.002516f, -0.003980f, +0.007005f, +0.006159f, + -0.000047f, -0.005655f, +0.000199f, +0.001636f, +0.004410f, +0.002178f, -0.004007f, +0.000452f, -0.003924f, +0.004126f, + -0.003818f, -0.002500f, -0.000888f, +0.002553f, +0.000650f, -0.002057f + }, + { + -0.000253f, -0.053200f, -0.006889f, +0.013469f, +0.003832f, -0.001180f, -0.000770f, -0.009605f, +0.004088f, -0.001739f, + -0.015785f, -0.018885f, +0.000689f, -0.013582f, +0.031017f, +0.013743f, -0.008594f, +0.006933f, +0.032503f, -0.012305f, + -0.013261f, -0.006080f, -0.012117f, +0.006131f, -0.002146f, -0.013285f, -0.013530f, -0.010193f, +0.013410f, -0.000488f, + +0.012595f, +0.009999f, -0.001265f, +0.011833f, +0.005059f, -0.005932f, +0.004602f, -0.007762f, +0.011093f, +0.001050f, + -0.003268f, +0.001033f, +0.008567f, +0.004803f, +0.004701f, +0.004329f, +0.005018f, -0.003950f, -0.002828f, -0.007975f, + -0.003135f, -0.006492f, +0.001237f, -0.001020f, -0.001711f, -0.002839f, +0.002266f, +0.004126f, -0.003826f, +0.005787f, + +0.002782f, +0.003593f, +0.002129f, -0.000307f, -0.000066f, +0.001200f, -0.008813f, +0.001666f, -0.006303f, +0.001474f, + +0.004714f, -0.000829f, -0.000479f, +0.001096f, -0.002683f, +0.002024f, -0.006135f, -0.000177f, -0.002970f, +0.001419f, + +0.001209f, +0.001941f, -0.008041f, +0.001139f, -0.000552f, +0.000701f, -0.000528f, +0.000245f, -0.002075f, +0.001511f, + +0.001661f, -0.000963f, -0.001310f, -0.000289f, -0.001992f, +0.001872f + }, + { + -0.024490f, -0.018803f, +0.020645f, +0.055123f, -0.014883f, -0.007046f, +0.000199f, +0.006319f, -0.002353f, +0.009169f, + +0.015881f, +0.025483f, +0.008671f, -0.009449f, +0.006961f, -0.013047f, +0.002119f, -0.002751f, +0.035258f, -0.005052f, + +0.009029f, -0.008550f, +0.017317f, +0.019518f, -0.008793f, +0.008623f, -0.010036f, +0.009909f, +0.003633f, -0.006908f, + +0.000206f, +0.010277f, +0.005062f, +0.004705f, +0.000501f, -0.004775f, -0.001334f, +0.013568f, +0.001431f, -0.009343f, + +0.003227f, +0.006449f, -0.002070f, +0.009699f, +0.008853f, +0.005070f, -0.012032f, +0.007182f, -0.002437f, +0.008868f, + -0.007703f, -0.001810f, -0.004833f, +0.005825f, -0.004380f, -0.000923f, -0.010241f, +0.000882f, -0.004542f, +0.007074f, + -0.000607f, -0.000999f, -0.001652f, +0.000863f, -0.000776f, +0.003772f, +0.004062f, -0.002558f, +0.000636f, -0.000955f, + -0.005223f, +0.002967f, +0.001153f, -0.000263f, +0.003361f, -0.002507f, +0.001820f, +0.000209f, +0.000666f, +0.001288f, + -0.002994f, +0.001234f, +0.002919f, -0.000569f, -0.002703f, +0.001628f, -0.000419f, -0.001877f, +0.000114f, +0.001614f, + -0.002884f, -0.001596f, -0.002799f, +0.002006f, -0.002132f, +0.002452f + }, + { + -0.000279f, +0.007443f, -0.013502f, -0.002138f, +0.009889f, -0.000239f, +0.000154f, -0.000214f, -0.001714f, -0.004484f, + +0.004934f, -0.007514f, -0.007397f, -0.020801f, +0.084137f, +0.035220f, +0.025858f, +0.001684f, +0.000036f, +0.007756f, + -0.002526f, +0.019999f, -0.011970f, -0.003110f, +0.015035f, +0.001837f, +0.019184f, +0.002371f, +0.014812f, -0.015979f, + +0.009105f, -0.017541f, -0.003697f, +0.000878f, -0.004781f, -0.007189f, -0.003463f, -0.005742f, +0.002347f, +0.005131f, + -0.006188f, -0.004242f, -0.006385f, -0.002695f, +0.004140f, +0.008194f, +0.010633f, +0.003456f, +0.001183f, +0.001136f, + +0.003751f, +0.000149f, +0.005411f, -0.001530f, -0.008687f, -0.005259f, +0.007414f, -0.001083f, -0.005949f, +0.001444f, + -0.000034f, -0.000721f, -0.001007f, +0.005488f, +0.001216f, +0.002497f, -0.001805f, -0.000825f, -0.001653f, -0.001663f, + +0.000181f, -0.002522f, -0.000969f, +0.003229f, +0.003867f, -0.000676f, +0.005063f, -0.005157f, -0.006931f, -0.001570f, + -0.003355f, +0.001537f, +0.000966f, +0.005394f, +0.000846f, -0.000626f, -0.001945f, -0.001744f, +0.002519f, +0.000968f, + +0.002189f, -0.002712f, -0.003151f, -0.000817f, +0.000548f, -0.002323f + }, + { + -0.031000f, +0.070114f, -0.000492f, +0.082610f, -0.003048f, +0.003957f, -0.010588f, -0.004652f, +0.030959f, -0.025693f, + +0.005253f, +0.005581f, +0.005745f, -0.002465f, -0.019575f, +0.007483f, +0.058382f, -0.011384f, +0.009546f, +0.010160f, + +0.008702f, -0.001005f, +0.005695f, -0.019201f, +0.020159f, +0.011770f, -0.004114f, -0.015469f, +0.001061f, -0.003858f, + +0.014210f, +0.018758f, +0.000540f, -0.003052f, +0.006616f, +0.014533f, -0.005922f, +0.008060f, +0.006437f, -0.003546f, + -0.001110f, -0.003126f, -0.001081f, -0.008118f, +0.019064f, -0.004790f, +0.004204f, +0.006817f, -0.005239f, +0.013282f, + +0.003298f, +0.001229f, +0.000754f, -0.004390f, +0.006071f, -0.001986f, +0.005876f, -0.000080f, +0.004660f, +0.003738f, + -0.002305f, +0.000617f, -0.001616f, +0.002469f, -0.006360f, -0.004458f, -0.003926f, +0.000170f, +0.010614f, +0.004499f, + -0.001466f, +0.000346f, +0.002055f, -0.001458f, +0.001523f, +0.004123f, -0.003683f, +0.000788f, -0.002136f, +0.003281f, + -0.003676f, +0.000642f, -0.006242f, -0.001505f, -0.000836f, +0.002124f, +0.000010f, +0.000702f, -0.002538f, +0.000637f, + -0.000619f, +0.000393f, +0.000157f, +0.000385f, +0.002574f, -0.001552f + }, + { + -0.000689f, -0.071311f, -0.024826f, -0.001798f, -0.008283f, +0.010476f, +0.004003f, +0.006736f, -0.001905f, -0.004404f, + -0.007441f, +0.016129f, -0.008130f, -0.024835f, +0.004959f, +0.001853f, +0.039561f, -0.012510f, -0.021603f, +0.003713f, + -0.006561f, -0.006882f, -0.002762f, -0.020127f, +0.002366f, -0.008140f, +0.008826f, -0.013953f, -0.000595f, +0.007450f, + +0.013536f, +0.012927f, -0.005796f, +0.005608f, +0.011459f, -0.003432f, +0.009021f, -0.006652f, -0.016308f, -0.002167f, + +0.005698f, -0.001890f, +0.011927f, -0.001847f, +0.004903f, +0.005129f, +0.000431f, +0.001266f, -0.003085f, -0.000867f, + +0.008130f, +0.004976f, +0.001282f, -0.003896f, -0.001585f, -0.002398f, -0.000801f, -0.003241f, +0.005347f, +0.012406f, + +0.002074f, +0.004646f, -0.001149f, +0.006593f, -0.006072f, +0.006095f, -0.003386f, -0.000846f, +0.000769f, +0.003344f, + +0.001786f, +0.003637f, -0.001156f, +0.001046f, -0.005007f, -0.004582f, +0.000279f, +0.002308f, -0.000597f, -0.003029f, + -0.001069f, -0.000837f, -0.001221f, +0.001153f, -0.000452f, -0.003362f, -0.002511f, +0.000833f, +0.000278f, +0.000498f, + -0.000213f, -0.003015f, -0.002509f, -0.000023f, +0.001261f, -0.003172f + }, + { + -0.038860f, +0.035952f, +0.017102f, +0.097596f, -0.022765f, -0.002401f, +0.006166f, -0.010894f, +0.006965f, -0.003084f, + -0.030230f, +0.039614f, -0.027867f, +0.004132f, -0.017271f, -0.012578f, +0.030685f, -0.008582f, -0.005834f, -0.011416f, + -0.012314f, -0.013880f, -0.003588f, +0.008509f, -0.000172f, +0.021979f, -0.014853f, +0.000936f, -0.009050f, -0.000300f, + -0.002106f, -0.004623f, -0.006403f, -0.004364f, +0.003388f, +0.008849f, +0.003223f, -0.006146f, +0.002366f, -0.001269f, + -0.002285f, -0.000468f, -0.006700f, +0.001533f, -0.000772f, +0.001296f, +0.002609f, -0.005715f, +0.009498f, -0.002120f, + -0.004210f, +0.004567f, -0.003737f, +0.003147f, -0.001982f, +0.006248f, -0.012607f, +0.002739f, -0.011138f, +0.012673f, + -0.002276f, -0.004791f, -0.001364f, +0.001205f, +0.003202f, +0.003576f, -0.000204f, +0.001232f, -0.001115f, +0.000962f, + -0.000796f, +0.004375f, +0.000456f, -0.001001f, +0.002759f, -0.001975f, +0.000981f, -0.001271f, -0.001621f, +0.000864f, + +0.000383f, -0.001732f, +0.001224f, +0.001472f, -0.001025f, -0.000239f, -0.000116f, -0.002944f, -0.004001f, +0.001627f, + -0.003676f, +0.000018f, -0.002727f, +0.003360f, +0.001675f, -0.001302f + }, + { + -0.006894f, -0.026370f, +0.030270f, -0.007668f, -0.004044f, -0.040667f, -0.001410f, -0.010666f, +0.001050f, +0.019325f, + -0.013586f, -0.003238f, +0.027467f, +0.011833f, +0.027012f, -0.006634f, -0.007992f, -0.005537f, -0.015706f, -0.003091f, + +0.003550f, -0.011244f, +0.006908f, -0.030323f, -0.022588f, +0.008425f, -0.011548f, +0.005975f, +0.010776f, -0.000549f, + +0.004634f, +0.010294f, -0.004726f, -0.012867f, -0.011830f, +0.002603f, +0.000147f, +0.001507f, +0.005864f, +0.008884f, + -0.008785f, -0.002448f, +0.005201f, +0.000095f, +0.006151f, +0.007204f, -0.004537f, -0.005625f, -0.009082f, +0.010535f, + -0.000422f, +0.001478f, -0.002006f, -0.005659f, +0.004587f, -0.007925f, +0.000611f, +0.007874f, -0.005401f, +0.007176f, + +0.000575f, +0.002697f, -0.001112f, -0.001525f, -0.004829f, +0.005537f, -0.003651f, -0.006014f, -0.001798f, -0.002364f, + +0.000422f, -0.003169f, +0.002669f, +0.005197f, -0.003021f, +0.000427f, -0.000033f, +0.000496f, +0.004665f, -0.003870f, + -0.000388f, -0.000160f, -0.001550f, +0.001569f, -0.003745f, +0.003791f, -0.001481f, -0.000341f, +0.000384f, +0.002219f, + -0.001080f, -0.000258f, -0.003525f, +0.002008f, -0.001899f, -0.001323f + }, + { + +0.021500f, -0.127454f, -0.055492f, -0.023221f, +0.039214f, +0.040737f, +0.003892f, +0.006992f, -0.004379f, +0.003439f, + -0.011872f, +0.007718f, +0.021834f, -0.012115f, +0.003343f, -0.023179f, -0.009541f, -0.030827f, +0.003927f, -0.002981f, + -0.004506f, +0.001404f, -0.000548f, -0.028830f, +0.003329f, -0.005650f, +0.011277f, -0.001690f, -0.016047f, -0.016610f, + -0.007736f, -0.013640f, -0.005142f, -0.014244f, +0.011057f, +0.005922f, +0.021641f, -0.001860f, +0.016358f, -0.000641f, + -0.007998f, -0.015604f, +0.014154f, -0.001418f, +0.004319f, +0.006459f, -0.005856f, -0.003901f, +0.000770f, +0.000649f, + -0.014159f, -0.007494f, -0.005760f, +0.006623f, +0.001925f, +0.007040f, +0.001177f, -0.003966f, +0.004167f, +0.000536f, + -0.000159f, -0.004351f, +0.004079f, +0.002195f, -0.002583f, -0.001644f, -0.000930f, +0.002395f, -0.000755f, -0.003966f, + +0.004074f, -0.000128f, -0.001773f, -0.002748f, +0.003741f, -0.000958f, -0.000184f, -0.000184f, +0.002893f, -0.002850f, + +0.001979f, +0.000332f, -0.003303f, +0.001746f, -0.000416f, -0.002528f, -0.003716f, -0.001381f, -0.004767f, +0.002168f, + -0.001399f, +0.002514f, +0.001614f, -0.000991f, +0.001816f, -0.000048f + }, + { + -0.002394f, -0.043604f, -0.009018f, -0.005631f, -0.012881f, +0.010326f, +0.007849f, -0.005465f, +0.001999f, -0.002938f, + +0.019549f, +0.007110f, -0.015659f, -0.016561f, +0.005394f, -0.003371f, +0.002012f, +0.013046f, -0.007304f, -0.000349f, + +0.000680f, +0.015577f, -0.009251f, +0.003972f, +0.011304f, -0.018908f, +0.023948f, +0.026957f, +0.036160f, -0.013005f, + -0.002054f, +0.017427f, +0.012682f, +0.012876f, -0.011493f, +0.011525f, -0.008570f, +0.016565f, -0.005425f, +0.001450f, + +0.000671f, +0.005640f, +0.001773f, +0.002262f, +0.001109f, -0.001913f, -0.006480f, -0.005562f, +0.003153f, -0.004129f, + +0.008218f, +0.005914f, +0.008487f, +0.000749f, -0.001007f, +0.009439f, +0.007762f, +0.003877f, +0.005529f, +0.002941f, + -0.001552f, +0.003677f, -0.008612f, +0.000475f, +0.000819f, +0.000750f, -0.000986f, -0.001162f, +0.001336f, -0.000110f, + -0.007371f, -0.007831f, -0.004804f, +0.006380f, -0.000951f, -0.000213f, +0.001550f, +0.000578f, -0.002429f, +0.006072f, + -0.002807f, +0.000013f, +0.000295f, +0.000480f, +0.003843f, -0.003800f, +0.004336f, +0.000855f, -0.001124f, -0.001752f, + -0.000061f, +0.000781f, +0.001288f, +0.000637f, +0.000260f, +0.000597f + }, + { + -0.009445f, +0.127947f, -0.009894f, -0.030695f, -0.017873f, -0.014443f, -0.012185f, -0.005693f, -0.021477f, -0.024077f, + +0.011129f, +0.002539f, +0.025959f, -0.032257f, +0.016773f, -0.004448f, +0.004443f, -0.002450f, +0.015202f, -0.008926f, + +0.005859f, -0.010994f, +0.000786f, +0.018684f, -0.007261f, +0.002732f, -0.013944f, -0.026127f, -0.006051f, +0.002116f, + -0.001897f, -0.017488f, +0.002205f, -0.004726f, +0.007757f, +0.012699f, -0.020998f, +0.022733f, -0.009375f, -0.007982f, + -0.001887f, -0.015208f, -0.000180f, +0.014906f, +0.019861f, +0.011278f, +0.005652f, +0.002650f, +0.002510f, -0.000884f, + +0.009503f, -0.005471f, -0.006179f, -0.003454f, -0.006687f, +0.001929f, -0.000526f, -0.000018f, -0.002483f, -0.006864f, + -0.000317f, +0.003203f, -0.007847f, -0.012820f, +0.004980f, +0.000442f, -0.008180f, +0.004341f, -0.005961f, +0.000107f, + +0.001124f, -0.001745f, +0.000519f, -0.005942f, -0.003763f, +0.002338f, +0.000689f, +0.005023f, +0.000538f, -0.003255f, + +0.003012f, +0.002417f, -0.002469f, -0.002776f, +0.001107f, +0.003573f, +0.001391f, +0.001358f, -0.000802f, +0.005072f, + -0.000908f, +0.000583f, -0.004465f, +0.001794f, -0.001278f, +0.000604f + }, + { + -0.003628f, +0.054341f, +0.006482f, +0.010395f, +0.013371f, +0.001707f, +0.001521f, -0.021767f, -0.010321f, +0.003295f, + +0.016357f, +0.003097f, -0.019935f, -0.007249f, +0.249690f, +0.039433f, -0.025345f, -0.036166f, +0.016461f, +0.000622f, + -0.010853f, +0.024208f, +0.023041f, -0.015043f, -0.021030f, -0.026867f, +0.007043f, +0.002302f, +0.000324f, -0.002311f, + +0.004780f, -0.011845f, -0.002471f, -0.014582f, +0.021952f, +0.000575f, +0.005704f, +0.003300f, -0.013801f, -0.004300f, + +0.009186f, -0.020633f, -0.002589f, -0.002421f, -0.007662f, -0.000709f, +0.002296f, -0.005240f, -0.000228f, -0.007946f, + -0.003931f, +0.003048f, -0.006891f, +0.002494f, +0.005700f, -0.005651f, -0.001796f, +0.001713f, -0.004174f, +0.007364f, + -0.011345f, -0.009144f, +0.013150f, -0.006527f, -0.005590f, +0.000221f, -0.003996f, +0.009010f, -0.009669f, +0.003902f, + +0.000320f, +0.000659f, -0.000549f, -0.002664f, -0.001148f, +0.002031f, +0.003224f, -0.003738f, +0.003543f, +0.000611f, + -0.001793f, -0.001481f, -0.003798f, +0.003605f, -0.003133f, +0.000915f, -0.000773f, +0.000592f, -0.003229f, +0.002698f, + +0.000498f, -0.001443f, -0.003695f, -0.001990f, -0.004396f, -0.000172f + }, + { + -0.018617f, +0.097431f, +0.004326f, -0.018222f, -0.020174f, +0.011611f, +0.005877f, +0.006564f, +0.002567f, -0.021423f, + -0.043211f, -0.023602f, -0.008714f, -0.032266f, -0.091180f, +0.004470f, +0.060203f, +0.009616f, +0.039555f, +0.009136f, + +0.025003f, -0.011400f, +0.018854f, +0.009712f, +0.019325f, +0.014282f, -0.006264f, +0.013737f, +0.015106f, +0.011249f, + +0.016450f, +0.020649f, -0.005990f, -0.003469f, +0.003164f, -0.002360f, -0.015877f, +0.004181f, -0.009971f, -0.018376f, + +0.004416f, -0.002735f, +0.004166f, -0.012005f, -0.005045f, -0.008021f, +0.007076f, -0.002592f, -0.009603f, -0.005539f, + -0.001183f, -0.013570f, +0.005554f, -0.012147f, -0.003687f, +0.002521f, +0.011382f, -0.004337f, -0.003064f, -0.004004f, + -0.008875f, -0.006752f, -0.000190f, +0.004727f, -0.002303f, +0.001682f, -0.001980f, +0.002611f, -0.002636f, -0.008160f, + -0.001342f, +0.002836f, +0.003922f, -0.001979f, -0.002691f, +0.004941f, -0.001661f, +0.003866f, -0.001473f, -0.005850f, + +0.003339f, +0.000917f, +0.001254f, -0.002142f, -0.000796f, -0.000042f, +0.001902f, +0.000726f, +0.000495f, +0.000051f, + +0.001080f, +0.000596f, -0.000996f, -0.002582f, +0.001680f, -0.000142f + } + }, + { + { + -0.001512f, +0.092096f, +0.022725f, -0.048405f, -0.027445f, +0.009791f, +0.001837f, +0.002579f, -0.006484f, +0.008674f, + +0.021944f, -0.011945f, +0.027018f, -0.003670f, -0.019597f, +0.013655f, +0.023679f, +0.036464f, +0.015870f, -0.028666f, + +0.009351f, +0.017035f, -0.001581f, -0.001179f, +0.002617f, -0.015820f, +0.007758f, -0.029150f, -0.000977f, -0.004994f, + -0.004793f, +0.004241f, +0.004271f, -0.004256f, -0.010455f, -0.018157f, +0.001884f, -0.004171f, -0.018860f, -0.006821f, + +0.013648f, +0.007963f, +0.004674f, -0.012244f, +0.009907f, -0.005968f, -0.007261f, +0.001940f, -0.008068f, +0.005947f, + +0.000338f, -0.001999f, +0.000795f, +0.001410f, -0.003350f, -0.002345f, -0.003430f, -0.001952f, +0.000170f, -0.011411f, + -0.002944f, +0.002217f, +0.003693f, +0.004166f, -0.003773f, -0.004348f, +0.004572f, -0.000165f, +0.010759f, +0.001092f, + -0.005940f, -0.000408f, +0.001913f, -0.000548f, -0.002617f, -0.000265f, +0.001337f, +0.002447f, +0.003669f, +0.002236f, + -0.000201f, -0.000376f, +0.001818f, -0.001343f, +0.000400f, +0.000308f, -0.002132f, +0.001926f, -0.002687f, +0.001604f, + +0.000348f, -0.000730f, +0.001565f, -0.000647f, -0.000987f, -0.000071f + }, + { + -0.004837f, +0.182593f, -0.002630f, -0.105206f, +0.091073f, +0.014126f, +0.008452f, -0.006046f, -0.007786f, -0.010315f, + -0.034361f, +0.013588f, -0.008042f, -0.007420f, +0.004908f, -0.010851f, -0.019964f, -0.008839f, +0.014122f, -0.006236f, + -0.004759f, +0.007171f, -0.010896f, -0.004992f, +0.008279f, +0.007857f, +0.014271f, +0.014404f, -0.022406f, -0.005900f, + -0.013687f, -0.000188f, +0.008426f, -0.003179f, -0.008397f, -0.005158f, -0.003063f, +0.003738f, -0.000263f, -0.009082f, + -0.005782f, -0.014483f, -0.004362f, +0.000279f, +0.005260f, -0.009159f, -0.001518f, -0.007755f, +0.004412f, -0.015922f, + -0.003722f, +0.004601f, +0.001191f, +0.000499f, +0.000827f, +0.000803f, -0.002582f, +0.001068f, +0.000524f, -0.010076f, + +0.001269f, -0.008215f, -0.001467f, +0.005999f, -0.004775f, -0.001127f, -0.003343f, +0.004527f, -0.001667f, +0.001392f, + -0.008382f, +0.000322f, -0.000439f, +0.003734f, -0.005616f, +0.000900f, +0.003329f, +0.001384f, -0.000492f, +0.004194f, + -0.000211f, -0.000708f, +0.002280f, -0.004496f, +0.003654f, +0.000009f, +0.001655f, -0.001892f, -0.003562f, -0.000998f, + +0.003134f, +0.001960f, +0.003344f, +0.003273f, -0.001290f, -0.001831f + }, + { + +0.002174f, -0.157647f, +0.007759f, +0.121977f, -0.017540f, +0.014369f, +0.003777f, -0.003529f, +0.016121f, -0.001977f, + +0.024859f, +0.036908f, -0.007511f, +0.011648f, +0.019321f, +0.000663f, +0.013406f, -0.000813f, +0.003379f, +0.036195f, + -0.014864f, +0.009300f, +0.014562f, +0.005626f, +0.003419f, +0.000516f, -0.009202f, +0.016354f, +0.001547f, +0.001945f, + -0.013096f, -0.007004f, +0.021237f, +0.003275f, +0.008480f, -0.005068f, +0.013734f, -0.017503f, +0.004780f, -0.008988f, + +0.006693f, -0.003962f, -0.007991f, +0.022415f, -0.002523f, -0.008573f, -0.002704f, -0.003509f, -0.002289f, -0.003184f, + +0.008794f, +0.002333f, +0.003209f, +0.000407f, -0.003042f, -0.003073f, +0.000242f, +0.005005f, +0.004590f, +0.003421f, + +0.003988f, +0.006537f, +0.000040f, +0.001781f, +0.002982f, +0.001027f, +0.002876f, -0.003861f, +0.005558f, -0.007917f, + -0.004080f, +0.000400f, +0.001176f, +0.001692f, +0.000468f, -0.004534f, -0.001506f, -0.004071f, +0.001118f, -0.001744f, + -0.002711f, -0.005498f, -0.000949f, +0.000227f, +0.001481f, -0.000480f, -0.003170f, +0.002182f, -0.002074f, +0.004830f, + -0.002476f, +0.000208f, +0.000052f, +0.002589f, +0.001114f, +0.000083f + }, + { + -0.002995f, -0.050766f, -0.003370f, -0.001805f, -0.006943f, -0.001634f, -0.004478f, -0.002462f, +0.005530f, +0.001169f, + -0.003272f, -0.021742f, +0.000148f, -0.015143f, +0.005079f, -0.004765f, -0.029616f, +0.000047f, +0.033838f, -0.015435f, + -0.001976f, -0.004916f, -0.028641f, +0.005215f, -0.008058f, -0.016731f, -0.002296f, -0.008776f, +0.007593f, +0.000872f, + +0.011424f, +0.016329f, -0.003669f, +0.007863f, +0.003248f, -0.004361f, +0.005702f, +0.002171f, +0.019756f, +0.006679f, + -0.007072f, -0.000060f, +0.010797f, +0.004287f, -0.008364f, -0.009023f, +0.000366f, -0.002103f, +0.007810f, -0.008502f, + -0.003669f, +0.003908f, +0.005366f, -0.003121f, -0.001009f, +0.000482f, +0.001165f, +0.003155f, -0.003638f, +0.001038f, + -0.001517f, -0.001145f, +0.000712f, +0.003242f, -0.001425f, +0.005016f, -0.002173f, +0.005250f, -0.003140f, +0.002320f, + -0.000741f, -0.004385f, -0.000902f, -0.002279f, -0.004101f, +0.001001f, -0.003151f, +0.004542f, -0.000579f, +0.003200f, + +0.002291f, +0.002182f, -0.003201f, +0.002105f, -0.004819f, -0.000702f, -0.000283f, +0.000790f, -0.001516f, +0.001007f, + -0.000077f, +0.001056f, -0.000591f, -0.002054f, -0.001915f, +0.003673f + }, + { + +0.023873f, +0.030719f, +0.017558f, +0.075618f, -0.005020f, +0.005829f, +0.001236f, -0.004205f, +0.004671f, +0.017882f, + +0.003256f, +0.014361f, +0.016958f, -0.007788f, +0.008102f, -0.009484f, -0.005559f, -0.015786f, +0.023562f, -0.011644f, + -0.003029f, +0.001868f, +0.008828f, -0.017112f, -0.014483f, +0.008191f, +0.002327f, +0.044005f, +0.013283f, -0.012632f, + -0.003656f, +0.009984f, +0.000849f, +0.007508f, +0.011992f, +0.000326f, -0.010539f, -0.003312f, +0.003909f, +0.001772f, + +0.009855f, +0.012382f, -0.000291f, -0.000571f, +0.002098f, +0.007620f, -0.009506f, +0.005709f, -0.009516f, +0.006548f, + -0.002702f, +0.000587f, -0.013405f, -0.003456f, -0.008355f, +0.003347f, -0.002780f, +0.005557f, -0.002212f, +0.005214f, + +0.003093f, -0.001199f, -0.002686f, +0.002227f, -0.000550f, +0.001302f, -0.001408f, -0.007920f, -0.000277f, +0.002055f, + -0.004296f, -0.001170f, -0.002601f, +0.003043f, +0.008465f, -0.000422f, -0.000052f, -0.002716f, -0.002103f, +0.000403f, + -0.004224f, +0.000784f, +0.002054f, -0.001762f, -0.006944f, +0.001781f, +0.001686f, -0.000647f, +0.001171f, +0.003454f, + -0.001926f, -0.000009f, -0.000468f, +0.002773f, -0.000769f, +0.002987f + }, + { + +0.002937f, +0.028401f, -0.005901f, -0.006481f, +0.006750f, -0.002264f, +0.002187f, +0.001020f, +0.003051f, +0.010582f, + +0.004216f, -0.020368f, -0.016832f, -0.043502f, +0.062218f, +0.012454f, +0.003098f, -0.010920f, -0.005323f, -0.000492f, + -0.019707f, +0.009401f, +0.021944f, +0.020362f, +0.002089f, +0.000126f, +0.012201f, -0.011894f, +0.014769f, -0.005686f, + +0.021636f, +0.004312f, +0.010686f, +0.006529f, -0.002043f, -0.001517f, +0.007586f, -0.004107f, -0.004237f, -0.008942f, + -0.005692f, +0.006127f, -0.006009f, -0.003872f, +0.000735f, -0.000364f, +0.007259f, +0.000859f, -0.003698f, -0.003826f, + +0.001914f, -0.002039f, +0.001217f, +0.000359f, -0.002127f, -0.007618f, -0.000526f, -0.002206f, -0.000405f, +0.005517f, + -0.002581f, -0.004398f, -0.004489f, +0.004196f, -0.001252f, +0.003079f, +0.001288f, +0.001500f, -0.000775f, +0.001438f, + +0.001942f, +0.003481f, -0.002161f, -0.004358f, +0.000640f, -0.002490f, +0.007877f, -0.000620f, -0.003098f, -0.002591f, + -0.005599f, +0.005066f, +0.000146f, +0.002982f, +0.000111f, -0.003082f, -0.002409f, -0.000195f, +0.000593f, -0.002248f, + +0.001770f, -0.000366f, +0.000502f, +0.001127f, +0.001226f, -0.000557f + }, + { + +0.020837f, +0.124920f, +0.001142f, +0.100057f, -0.002591f, +0.007993f, -0.001959f, -0.017106f, +0.017868f, +0.004681f, + -0.003248f, -0.017535f, +0.026510f, +0.023405f, -0.000084f, +0.022576f, +0.063044f, -0.018036f, +0.002612f, +0.000013f, + +0.003525f, +0.003834f, +0.018775f, +0.004555f, +0.011883f, +0.001245f, -0.005673f, -0.008845f, +0.005232f, -0.006119f, + +0.008382f, +0.012708f, -0.005798f, -0.014842f, -0.001765f, +0.002552f, -0.012435f, +0.006957f, +0.008910f, -0.003352f, + +0.003653f, -0.000034f, -0.005210f, -0.009225f, +0.007052f, -0.011878f, -0.005502f, -0.007189f, -0.010343f, +0.002274f, + -0.002828f, +0.001004f, +0.001620f, -0.000028f, +0.008772f, -0.001728f, +0.004158f, +0.002459f, +0.003938f, -0.000943f, + +0.000500f, +0.004807f, -0.003083f, +0.004893f, +0.001323f, +0.002070f, -0.002249f, -0.004109f, +0.005701f, +0.005249f, + +0.001341f, +0.004352f, +0.004442f, -0.000942f, +0.000783f, +0.001961f, -0.001107f, +0.006589f, -0.002955f, +0.000616f, + -0.005798f, +0.004089f, -0.001830f, -0.000011f, +0.000345f, +0.002152f, +0.002232f, +0.002295f, -0.004895f, -0.000998f, + +0.002802f, +0.000895f, -0.000458f, -0.000150f, +0.001790f, -0.003026f + }, + { + +0.006206f, -0.004386f, +0.015331f, +0.027484f, +0.006998f, +0.005081f, +0.007086f, +0.003765f, -0.009707f, -0.000512f, + -0.009421f, +0.001794f, -0.003612f, +0.003726f, +0.028204f, +0.008096f, +0.018929f, -0.020634f, -0.013138f, +0.014173f, + -0.000035f, -0.001779f, -0.003679f, -0.012738f, -0.003133f, -0.028671f, -0.002981f, -0.014800f, -0.004562f, -0.000485f, + -0.011963f, -0.010056f, -0.002965f, +0.007422f, +0.010700f, -0.010292f, -0.003695f, -0.017297f, -0.013872f, +0.005034f, + -0.002054f, +0.001640f, +0.014922f, +0.000308f, +0.004788f, -0.000831f, +0.001545f, +0.005007f, +0.000752f, +0.002904f, + +0.003788f, +0.006387f, +0.004466f, -0.003954f, +0.006419f, +0.001701f, +0.000002f, -0.000661f, -0.001392f, +0.002114f, + -0.005217f, +0.005282f, -0.006054f, +0.006049f, -0.006213f, +0.003350f, -0.000116f, -0.004995f, -0.001886f, -0.000902f, + -0.005165f, +0.000297f, -0.004619f, +0.000588f, -0.001347f, -0.002731f, +0.001955f, +0.008145f, +0.002824f, +0.000159f, + +0.002706f, -0.002310f, -0.004315f, +0.001193f, +0.001286f, -0.000864f, -0.000171f, +0.003396f, +0.000573f, +0.001306f, + +0.001855f, -0.001073f, -0.000792f, +0.000184f, +0.002729f, -0.003746f + }, + { + +0.035906f, +0.122675f, +0.020299f, +0.132683f, -0.010382f, -0.000237f, -0.002189f, -0.034367f, -0.008888f, +0.002554f, + -0.050122f, +0.015725f, -0.023421f, +0.001359f, -0.048641f, -0.022121f, +0.039852f, -0.024678f, -0.017499f, -0.012055f, + -0.016505f, -0.019342f, -0.003330f, +0.006154f, -0.004066f, +0.020008f, -0.006453f, +0.012755f, -0.000803f, -0.002156f, + -0.004869f, -0.018914f, -0.025568f, -0.009973f, -0.009608f, -0.004503f, +0.002224f, +0.000892f, +0.011044f, +0.008527f, + -0.004440f, +0.000436f, -0.007859f, +0.002851f, +0.000617f, +0.004404f, +0.008615f, -0.008674f, +0.002133f, -0.000022f, + -0.005655f, -0.001473f, -0.007010f, +0.000539f, -0.006428f, +0.005101f, -0.013373f, +0.005766f, -0.003336f, +0.013785f, + -0.004519f, -0.007395f, -0.005817f, -0.006268f, -0.008202f, -0.001600f, +0.004956f, +0.004033f, +0.003746f, +0.006381f, + -0.001668f, +0.001319f, -0.000828f, -0.005496f, +0.002634f, -0.004840f, -0.004683f, +0.001276f, +0.002960f, -0.000217f, + +0.001897f, +0.001327f, +0.004701f, +0.000741f, -0.004900f, -0.000842f, +0.001044f, -0.001798f, -0.003027f, +0.000851f, + -0.001932f, +0.001707f, -0.003817f, +0.001819f, +0.001171f, -0.001193f + }, + { + +0.004026f, -0.045896f, +0.006804f, -0.004468f, -0.008903f, -0.000184f, +0.039414f, -0.031794f, -0.029086f, +0.029769f, + -0.001038f, -0.013562f, +0.000298f, -0.026615f, +0.010567f, +0.002230f, -0.000188f, -0.015039f, +0.005532f, +0.015184f, + +0.009174f, -0.004924f, -0.000052f, -0.022622f, -0.024047f, +0.006388f, -0.002757f, +0.000368f, +0.008652f, +0.011009f, + -0.001553f, +0.012171f, +0.017859f, +0.001414f, -0.016993f, +0.000609f, +0.010972f, -0.001029f, +0.004920f, +0.030856f, + +0.008336f, +0.001954f, +0.004361f, -0.012799f, -0.007097f, +0.007067f, -0.003952f, +0.003046f, -0.010805f, +0.004231f, + +0.005215f, +0.002775f, -0.000567f, -0.011615f, -0.004181f, -0.012784f, +0.000012f, +0.011410f, -0.006582f, +0.006395f, + +0.002011f, +0.000986f, -0.004336f, -0.005416f, -0.001590f, +0.006180f, -0.003694f, -0.002721f, +0.005783f, +0.002179f, + -0.000369f, -0.004418f, +0.001539f, +0.001982f, +0.001832f, +0.001940f, -0.003277f, +0.003929f, +0.011319f, +0.001855f, + -0.001608f, -0.001671f, -0.000463f, +0.004060f, -0.002300f, +0.001718f, -0.001537f, +0.000619f, -0.000769f, +0.002784f, + -0.000006f, -0.000512f, -0.001582f, +0.003826f, -0.001702f, -0.000548f + }, + { + -0.020847f, -0.164871f, -0.033359f, -0.009741f, +0.027424f, +0.012009f, -0.001361f, +0.010331f, +0.013107f, -0.006963f, + -0.008458f, +0.012288f, +0.042557f, +0.022310f, +0.016413f, -0.027729f, +0.006946f, -0.010358f, +0.014727f, -0.000262f, + -0.004918f, +0.004910f, +0.009870f, -0.010539f, +0.017349f, -0.021265f, +0.007305f, +0.005718f, +0.005168f, +0.009553f, + +0.016755f, +0.007609f, -0.007846f, -0.017645f, +0.000676f, -0.025632f, -0.000948f, -0.001844f, +0.015900f, +0.006589f, + +0.009063f, -0.003847f, +0.011432f, -0.002563f, -0.001485f, -0.004185f, -0.010704f, -0.008109f, -0.003956f, -0.003792f, + -0.000188f, +0.004404f, -0.006435f, -0.002817f, -0.002001f, +0.009011f, +0.001448f, -0.006229f, +0.002939f, +0.000099f, + +0.006430f, -0.002013f, -0.002223f, -0.003954f, -0.005129f, -0.003009f, +0.001467f, +0.003513f, -0.000429f, -0.002608f, + +0.002902f, -0.001747f, -0.005002f, -0.000708f, +0.008080f, +0.000454f, -0.000998f, -0.000027f, +0.003927f, -0.001621f, + -0.000663f, -0.002865f, -0.005506f, -0.000193f, +0.000668f, +0.004152f, -0.001435f, -0.002207f, -0.003299f, +0.002645f, + -0.001744f, +0.002776f, +0.001171f, -0.002343f, -0.000772f, -0.001905f + }, + { + -0.000689f, -0.046939f, -0.004468f, +0.004409f, -0.017615f, -0.007484f, -0.007643f, -0.001284f, -0.000488f, -0.000684f, + +0.005624f, -0.002890f, +0.012795f, +0.030376f, +0.013577f, -0.004709f, +0.016586f, +0.025452f, -0.019182f, -0.011844f, + -0.009829f, +0.005911f, -0.010366f, +0.010639f, +0.031899f, -0.001146f, +0.007475f, -0.012794f, +0.010925f, -0.016768f, + -0.017030f, +0.001575f, -0.004005f, +0.008226f, -0.014774f, -0.005947f, -0.007192f, +0.029345f, -0.002137f, -0.002087f, + -0.002346f, +0.002269f, +0.002157f, +0.007393f, +0.002103f, +0.013417f, +0.005082f, -0.013543f, -0.008386f, -0.003849f, + +0.003508f, -0.007786f, -0.003002f, -0.003086f, +0.003301f, +0.006598f, -0.005298f, -0.008032f, -0.001423f, -0.000397f, + +0.001486f, +0.002638f, -0.008833f, +0.003018f, +0.004565f, +0.005334f, -0.002365f, -0.003765f, +0.006133f, -0.001007f, + -0.005625f, -0.002258f, -0.004054f, +0.008721f, -0.001188f, -0.000155f, +0.002436f, -0.002293f, -0.005126f, +0.004504f, + -0.004623f, +0.001706f, -0.000485f, -0.003416f, +0.003087f, -0.004884f, +0.003415f, +0.002716f, -0.000259f, -0.000333f, + +0.000977f, +0.000001f, -0.001002f, -0.002051f, -0.001539f, +0.000163f + }, + { + -0.015371f, +0.090404f, -0.024343f, +0.006079f, -0.007202f, +0.019875f, +0.015332f, +0.009801f, +0.003059f, -0.024681f, + +0.003706f, -0.011758f, -0.010269f, -0.042191f, +0.025241f, -0.017770f, -0.005371f, +0.009113f, -0.007868f, +0.004463f, + +0.033588f, -0.006565f, +0.009204f, +0.004802f, -0.004235f, +0.025511f, -0.007855f, -0.008246f, +0.013994f, +0.001037f, + +0.002888f, -0.003068f, +0.021226f, +0.004149f, -0.005668f, +0.000530f, -0.011729f, +0.023852f, +0.001955f, +0.007873f, + +0.008063f, -0.009869f, -0.001592f, -0.002109f, +0.001747f, -0.002299f, -0.003989f, -0.002944f, -0.008768f, -0.009701f, + -0.000959f, -0.003846f, +0.008297f, +0.003866f, -0.003407f, +0.010936f, +0.001862f, -0.001824f, -0.004671f, -0.005001f, + -0.002350f, -0.001329f, -0.000421f, -0.004398f, +0.003627f, +0.002333f, -0.005877f, -0.003035f, -0.010423f, -0.002417f, + -0.002325f, -0.003293f, -0.000211f, -0.001925f, -0.000679f, +0.004013f, +0.002669f, +0.004926f, +0.000310f, -0.002329f, + +0.003117f, +0.002281f, -0.000860f, +0.001011f, +0.002074f, +0.002977f, -0.001393f, -0.001722f, -0.004937f, +0.003373f, + -0.000451f, +0.002761f, -0.003266f, +0.001137f, -0.001966f, +0.001567f + }, + { + +0.003740f, +0.042564f, -0.013449f, +0.003624f, -0.002693f, +0.001731f, +0.017458f, +0.003391f, +0.009155f, +0.000363f, + +0.009154f, +0.001076f, -0.014747f, -0.053271f, +0.150468f, +0.026030f, +0.017688f, -0.003791f, +0.029024f, +0.027652f, + -0.024065f, -0.006601f, +0.008784f, -0.026319f, -0.027937f, -0.008067f, +0.006481f, -0.020627f, -0.003033f, -0.007133f, + +0.001450f, +0.003277f, +0.002733f, -0.010286f, +0.013113f, -0.009240f, +0.008459f, +0.006886f, -0.007344f, -0.003554f, + +0.005422f, -0.009973f, -0.000093f, -0.004775f, -0.004144f, +0.002388f, +0.008217f, -0.003051f, -0.001701f, -0.003848f, + +0.000990f, +0.005327f, -0.016773f, -0.019667f, -0.003340f, -0.003208f, -0.000405f, +0.002833f, -0.004184f, +0.005150f, + +0.000874f, -0.006638f, +0.004321f, -0.000087f, +0.004175f, +0.000386f, -0.010012f, +0.004365f, -0.006736f, +0.007620f, + +0.000084f, -0.005205f, -0.003681f, -0.001073f, -0.003811f, -0.000706f, +0.000004f, -0.004216f, +0.002429f, -0.000339f, + +0.002593f, +0.000896f, -0.001416f, +0.005842f, -0.005013f, +0.000386f, -0.000985f, +0.003709f, +0.001034f, +0.001048f, + -0.000529f, -0.000782f, -0.002829f, +0.000941f, -0.003940f, +0.000423f + }, + { + +0.002129f, +0.113632f, -0.014444f, -0.045759f, -0.022421f, +0.044932f, +0.026294f, +0.012051f, +0.001491f, -0.003618f, + -0.026106f, -0.007640f, +0.001025f, +0.032987f, -0.002619f, +0.016931f, +0.050399f, +0.004758f, +0.027450f, +0.008066f, + +0.021767f, -0.024194f, +0.023743f, +0.007166f, -0.005981f, +0.005075f, -0.000797f, +0.022643f, +0.021165f, -0.013823f, + -0.011015f, -0.003207f, -0.010584f, -0.001803f, +0.008109f, +0.002511f, +0.001947f, +0.009948f, -0.011880f, -0.006965f, + +0.017105f, +0.008126f, +0.016044f, -0.013360f, -0.002388f, -0.006240f, +0.003418f, +0.001093f, +0.005425f, +0.000810f, + +0.000710f, -0.010827f, +0.003796f, -0.006677f, +0.003113f, +0.006631f, +0.011759f, -0.002323f, -0.005348f, -0.006737f, + -0.005381f, -0.001120f, +0.002987f, +0.001875f, -0.000945f, +0.001300f, -0.003593f, -0.001347f, -0.001258f, -0.004098f, + +0.000375f, -0.000459f, +0.003950f, +0.008037f, +0.001707f, +0.001320f, -0.007156f, +0.001994f, +0.002245f, -0.005687f, + +0.000543f, -0.000506f, +0.001070f, -0.000782f, +0.000681f, +0.000341f, -0.001483f, -0.000446f, -0.000062f, -0.002581f, + +0.002392f, +0.000559f, -0.001304f, +0.000641f, +0.004735f, +0.001327f + } + }, + { + { + -0.001828f, +0.096569f, +0.019613f, -0.074319f, +0.011641f, +0.002763f, -0.005559f, +0.011787f, -0.005212f, +0.010179f, + +0.015948f, +0.005291f, +0.003879f, +0.008041f, -0.017480f, +0.020014f, +0.032246f, +0.031820f, +0.010449f, -0.024704f, + +0.015199f, +0.003202f, +0.011599f, +0.016515f, -0.021632f, +0.006440f, -0.024039f, -0.003083f, -0.006905f, +0.002606f, + -0.011918f, -0.011291f, +0.009537f, +0.002945f, -0.022167f, -0.009721f, +0.008112f, +0.000604f, -0.020573f, -0.003499f, + -0.000783f, +0.008270f, +0.013175f, -0.012622f, +0.005551f, -0.003870f, -0.004636f, +0.006953f, -0.006597f, -0.003682f, + +0.003573f, +0.002642f, -0.007402f, -0.002047f, +0.009027f, -0.001655f, -0.009333f, -0.001422f, -0.006671f, -0.010130f, + +0.004335f, +0.000002f, +0.002422f, +0.000309f, +0.001003f, +0.004476f, -0.004716f, +0.006903f, -0.000817f, +0.003547f, + -0.003516f, +0.000831f, +0.005432f, -0.002121f, -0.002527f, -0.000516f, +0.002035f, -0.002492f, +0.002671f, +0.004292f, + +0.000252f, +0.004937f, -0.002970f, -0.000828f, +0.001571f, -0.002421f, -0.003044f, -0.000786f, +0.001460f, +0.001167f, + -0.001544f, +0.000188f, -0.000370f, +0.002901f, -0.002242f, -0.001152f + }, + { + -0.000070f, +0.235554f, -0.036219f, +0.005810f, -0.043754f, +0.031298f, +0.023651f, -0.038108f, +0.007010f, +0.004221f, + -0.019197f, -0.037165f, +0.013149f, -0.013084f, +0.007448f, -0.010035f, -0.018825f, -0.005429f, -0.012201f, +0.006221f, + +0.014324f, -0.015268f, -0.003562f, -0.004017f, +0.009488f, +0.009464f, +0.002836f, +0.013739f, -0.004022f, -0.018306f, + -0.008643f, +0.002123f, +0.003218f, +0.001283f, -0.007225f, -0.000398f, +0.000350f, -0.003337f, -0.005018f, -0.006950f, + -0.007748f, -0.018603f, -0.002769f, +0.000071f, -0.000027f, +0.007885f, -0.015402f, -0.003992f, -0.008210f, +0.002511f, + -0.008799f, -0.000826f, +0.004338f, -0.002639f, +0.001578f, -0.000039f, +0.000062f, +0.009556f, -0.010286f, -0.004693f, + -0.003331f, -0.000382f, -0.000779f, +0.000839f, -0.004513f, +0.001573f, -0.010038f, +0.005999f, +0.003346f, -0.002911f, + -0.008444f, +0.002108f, +0.001923f, -0.002396f, +0.000568f, -0.004597f, +0.004615f, +0.003814f, +0.000493f, -0.000298f, + +0.001852f, +0.000406f, -0.000371f, -0.001998f, +0.003041f, +0.001003f, +0.000872f, +0.000275f, -0.005193f, -0.000292f, + +0.002523f, -0.000025f, +0.005439f, -0.000561f, -0.000011f, +0.001145f + }, + { + +0.005037f, -0.190573f, +0.031395f, +0.095125f, +0.002124f, +0.009079f, +0.012541f, +0.018029f, +0.002007f, +0.003718f, + +0.000719f, +0.046979f, +0.015756f, +0.002630f, +0.022420f, -0.002069f, +0.003120f, +0.002656f, +0.023414f, +0.007709f, + -0.005633f, +0.021109f, -0.003158f, +0.012633f, -0.000428f, +0.000231f, +0.003125f, +0.002312f, -0.003596f, +0.004348f, + -0.001659f, -0.006119f, +0.026121f, -0.000077f, -0.005022f, +0.020467f, -0.013813f, -0.012714f, +0.010505f, -0.009959f, + -0.007717f, +0.006913f, -0.008824f, +0.012854f, +0.003079f, -0.011115f, -0.002549f, -0.001843f, -0.007991f, +0.008554f, + -0.000943f, +0.006627f, +0.006449f, -0.006044f, -0.008563f, -0.009866f, +0.006787f, +0.006592f, +0.003177f, +0.006897f, + +0.004655f, -0.000634f, +0.006675f, -0.001163f, +0.000187f, -0.002790f, +0.011150f, -0.004389f, +0.002254f, -0.005440f, + -0.002303f, -0.004767f, +0.000634f, +0.000248f, -0.001976f, -0.001104f, -0.004902f, +0.001505f, -0.001554f, -0.006362f, + -0.002367f, -0.000794f, -0.002266f, +0.001295f, +0.000139f, -0.003184f, +0.000116f, +0.000358f, +0.002901f, +0.000407f, + -0.000329f, +0.000422f, +0.000267f, +0.003010f, -0.001566f, -0.000208f + }, + { + +0.003580f, -0.052339f, -0.010298f, -0.010180f, +0.001778f, -0.002734f, -0.009010f, +0.007013f, +0.004344f, -0.000215f, + -0.000738f, -0.024636f, -0.002061f, +0.004654f, -0.018377f, +0.008682f, -0.029820f, +0.001994f, +0.017008f, -0.005162f, + +0.003914f, -0.002186f, -0.035184f, +0.005908f, -0.009014f, -0.022227f, +0.010026f, -0.010302f, -0.011909f, +0.015644f, + +0.016290f, +0.012759f, -0.008194f, +0.014509f, -0.015026f, +0.024864f, +0.000036f, +0.006417f, -0.002364f, +0.019463f, + -0.020155f, +0.009993f, +0.006428f, +0.003679f, -0.005421f, -0.008659f, -0.000367f, -0.000329f, +0.009848f, -0.006074f, + -0.009038f, +0.005415f, +0.001943f, -0.001113f, +0.001496f, +0.001770f, +0.000186f, +0.001926f, +0.000201f, +0.004638f, + -0.000461f, -0.003914f, -0.004556f, +0.006728f, -0.006198f, +0.003482f, +0.001112f, +0.000539f, +0.005393f, +0.002415f, + -0.001013f, -0.006809f, +0.000722f, -0.004111f, -0.001002f, -0.001498f, +0.002770f, +0.001253f, +0.000165f, +0.002807f, + +0.002197f, -0.000885f, +0.001855f, +0.002701f, -0.006036f, +0.000113f, -0.001258f, +0.001819f, -0.000905f, +0.000055f, + +0.000094f, +0.002530f, -0.001002f, -0.002787f, +0.000444f, +0.001670f + }, + { + -0.012796f, +0.076098f, +0.000082f, +0.089648f, +0.006916f, +0.001737f, +0.010064f, -0.004758f, +0.007828f, +0.018944f, + +0.003279f, +0.002848f, +0.012117f, -0.003787f, -0.003152f, +0.002464f, -0.007901f, -0.010721f, +0.011551f, -0.000638f, + -0.020234f, +0.020416f, -0.008518f, -0.030243f, -0.011153f, +0.017860f, -0.002396f, +0.035086f, +0.019346f, -0.002782f, + +0.006428f, -0.009186f, +0.007920f, -0.002374f, +0.019397f, -0.001900f, -0.000047f, -0.012644f, -0.003241f, +0.009786f, + +0.011145f, +0.005447f, +0.002390f, +0.003411f, -0.008350f, +0.005324f, +0.006079f, -0.001234f, -0.014701f, +0.007597f, + +0.006483f, -0.005826f, -0.013587f, -0.009849f, +0.004482f, -0.002345f, +0.003144f, +0.003653f, +0.000283f, -0.002003f, + +0.003701f, +0.001064f, +0.003612f, +0.002568f, -0.005424f, -0.000201f, +0.001020f, -0.007910f, -0.003385f, +0.002463f, + -0.001066f, -0.001525f, -0.004870f, +0.003671f, +0.005311f, +0.006218f, -0.004673f, -0.000820f, -0.004666f, +0.002230f, + -0.004117f, +0.001977f, +0.000045f, +0.000186f, -0.005320f, +0.000407f, +0.000355f, +0.003440f, -0.000690f, +0.003099f, + -0.000715f, -0.002715f, +0.000597f, +0.001561f, +0.002408f, +0.000999f + }, + { + +0.000016f, +0.014968f, +0.020008f, +0.002054f, -0.007235f, -0.000998f, +0.000627f, +0.003842f, +0.006197f, +0.003880f, + +0.007599f, -0.024885f, -0.016131f, -0.033356f, +0.059635f, +0.009903f, +0.006760f, -0.026315f, -0.005130f, -0.016083f, + -0.009269f, +0.007009f, +0.024829f, +0.025802f, -0.003068f, +0.004269f, -0.004620f, -0.005753f, -0.009678f, +0.014402f, + +0.008054f, +0.010039f, +0.002116f, +0.003034f, +0.004987f, +0.001515f, +0.007816f, +0.002061f, -0.004142f, -0.009730f, + -0.001920f, +0.000307f, -0.009294f, +0.002837f, +0.004309f, -0.005848f, +0.002379f, +0.001002f, -0.004244f, +0.001514f, + -0.001760f, +0.001658f, -0.004135f, +0.006232f, -0.001884f, -0.003987f, -0.011182f, -0.002146f, +0.004016f, +0.006557f, + -0.007637f, +0.001368f, -0.004733f, -0.000930f, +0.001563f, +0.000250f, +0.003290f, +0.002146f, -0.000613f, +0.003361f, + +0.000584f, +0.003393f, +0.000533f, -0.001391f, -0.003080f, -0.000738f, +0.005590f, -0.001345f, +0.000166f, -0.004575f, + -0.002751f, +0.002527f, -0.001544f, +0.003611f, -0.000173f, -0.002743f, -0.000789f, -0.001720f, -0.000834f, -0.002773f, + +0.001479f, +0.001225f, +0.000839f, +0.001847f, +0.000427f, +0.000183f + }, + { + +0.001035f, +0.149983f, -0.008916f, +0.117574f, -0.008571f, -0.003121f, +0.009765f, +0.002670f, -0.017128f, +0.025105f, + -0.004169f, -0.020861f, +0.033248f, +0.002099f, +0.029905f, +0.022166f, +0.030633f, -0.014291f, +0.004394f, +0.016440f, + -0.017437f, +0.020477f, +0.003208f, +0.041497f, -0.012495f, -0.005020f, -0.011774f, -0.008326f, +0.003035f, -0.002671f, + +0.001773f, +0.010958f, -0.010381f, -0.010195f, -0.005605f, -0.010896f, +0.004862f, +0.003035f, +0.001395f, +0.004137f, + +0.004064f, +0.002540f, -0.005251f, -0.000202f, -0.003740f, -0.013544f, -0.008308f, -0.000963f, -0.007669f, +0.001247f, + -0.007392f, -0.008437f, +0.015061f, +0.001452f, -0.000190f, +0.003228f, +0.004346f, +0.002024f, +0.004787f, -0.003476f, + +0.002669f, +0.009562f, -0.005033f, +0.003132f, +0.005156f, -0.003282f, +0.002426f, -0.001198f, -0.001829f, +0.003904f, + +0.003958f, +0.001658f, +0.002740f, +0.001013f, +0.002745f, +0.000526f, +0.000608f, +0.004612f, -0.003036f, -0.000935f, + -0.001014f, +0.001015f, +0.003486f, -0.002861f, +0.002207f, -0.000907f, +0.004314f, +0.000393f, -0.004139f, -0.000768f, + +0.002058f, -0.000832f, +0.001483f, +0.000972f, -0.000986f, -0.001586f + }, + { + -0.000786f, +0.063199f, -0.011171f, +0.015329f, +0.018495f, -0.002414f, +0.008910f, +0.003928f, -0.012817f, -0.008245f, + +0.013486f, -0.005553f, -0.009936f, +0.014998f, +0.035809f, +0.016033f, -0.017254f, -0.018633f, +0.000639f, +0.030474f, + -0.004279f, +0.006479f, -0.023248f, -0.000633f, +0.006842f, -0.036152f, -0.015429f, -0.007744f, -0.018281f, +0.023853f, + -0.036617f, -0.016262f, +0.015921f, -0.001517f, +0.022684f, -0.005171f, -0.030062f, -0.003290f, +0.006700f, +0.002774f, + -0.010743f, +0.009304f, +0.004155f, +0.014094f, -0.008391f, -0.002419f, +0.004938f, +0.005995f, +0.005040f, +0.011683f, + -0.014962f, +0.010328f, +0.003290f, -0.003224f, +0.005278f, +0.005085f, -0.004961f, +0.001597f, -0.001187f, +0.000621f, + -0.000414f, -0.004169f, -0.000887f, +0.007903f, -0.007111f, -0.000047f, +0.001820f, -0.002064f, -0.004076f, -0.002729f, + -0.004790f, +0.000894f, -0.006207f, +0.000122f, -0.001724f, -0.002066f, +0.002159f, +0.007119f, +0.004499f, +0.001117f, + +0.002881f, -0.001083f, -0.004103f, +0.001438f, -0.000074f, -0.001914f, +0.001757f, +0.002746f, +0.001456f, -0.000625f, + +0.000773f, +0.002917f, -0.000570f, -0.001887f, +0.003581f, -0.002970f + }, + { + -0.019425f, +0.208707f, -0.004175f, +0.145299f, -0.008486f, -0.017543f, -0.000918f, -0.022952f, -0.004124f, +0.003660f, + -0.026178f, -0.010900f, +0.015968f, -0.027376f, -0.028816f, -0.004377f, +0.010129f, -0.017829f, -0.015086f, -0.017119f, + -0.016956f, -0.006298f, -0.008212f, -0.008343f, +0.006400f, +0.004739f, +0.007267f, +0.007737f, +0.003354f, -0.006144f, + -0.005723f, -0.012521f, -0.026320f, -0.001575f, -0.025069f, -0.003027f, +0.005588f, +0.015456f, -0.006982f, +0.008578f, + +0.000199f, -0.008145f, -0.005712f, +0.009139f, -0.004302f, +0.009885f, +0.002277f, -0.007795f, -0.005126f, +0.003161f, + +0.003343f, -0.010896f, -0.008333f, +0.000745f, +0.002696f, -0.006691f, -0.004004f, -0.001097f, +0.006654f, +0.002186f, + +0.000611f, -0.003661f, -0.002102f, -0.009387f, -0.011279f, -0.006651f, +0.007816f, +0.003094f, +0.006969f, +0.001466f, + +0.000753f, +0.001198f, -0.000412f, -0.010627f, +0.004520f, -0.002249f, -0.008574f, +0.001018f, +0.004974f, +0.000181f, + +0.000448f, +0.003208f, +0.005458f, -0.002173f, -0.004046f, -0.001100f, -0.000070f, +0.000416f, -0.002722f, -0.000545f, + +0.001018f, -0.001372f, -0.000891f, -0.001054f, +0.001448f, -0.000131f + }, + { + -0.002875f, -0.065813f, +0.001166f, +0.011017f, -0.011497f, +0.023556f, +0.013950f, -0.029465f, -0.021938f, +0.022264f, + +0.004118f, -0.010575f, -0.001603f, -0.009015f, -0.009383f, -0.010791f, +0.013074f, -0.003687f, +0.004072f, +0.018799f, + +0.009112f, +0.004001f, -0.019465f, -0.006922f, -0.008101f, -0.009527f, +0.002016f, -0.002302f, +0.000857f, +0.026313f, + -0.015468f, +0.007232f, +0.031017f, +0.004534f, -0.025002f, +0.002631f, +0.014789f, -0.001030f, -0.003177f, +0.029567f, + +0.023549f, -0.004943f, +0.000356f, -0.014639f, -0.001562f, +0.004121f, +0.003340f, -0.003574f, -0.000873f, -0.008652f, + +0.005309f, +0.002846f, -0.005236f, -0.005476f, -0.001807f, -0.017835f, +0.001090f, -0.001017f, +0.002927f, -0.000866f, + +0.001796f, +0.000098f, -0.003566f, -0.005659f, +0.004169f, -0.001568f, -0.001997f, +0.000886f, +0.004534f, +0.001363f, + -0.001463f, -0.001394f, +0.004627f, -0.000039f, -0.000238f, +0.003924f, -0.004435f, +0.002078f, +0.007547f, +0.008943f, + -0.002662f, -0.001622f, -0.001220f, +0.004584f, -0.003070f, -0.000947f, +0.002145f, -0.000498f, -0.001396f, +0.001202f, + +0.001101f, -0.003399f, +0.003104f, +0.000585f, +0.000755f, -0.001541f + }, + { + +0.017469f, -0.257384f, +0.021138f, -0.003863f, +0.020824f, -0.056961f, +0.081643f, -0.004020f, +0.005457f, -0.000037f, + -0.001241f, -0.007098f, +0.044825f, +0.009043f, +0.024014f, -0.025845f, +0.026001f, +0.001593f, +0.006877f, -0.012168f, + -0.000359f, -0.005900f, +0.011625f, +0.005278f, +0.007994f, -0.011427f, +0.011607f, -0.012488f, +0.016208f, +0.024929f, + +0.000163f, +0.011181f, +0.002529f, -0.018810f, -0.013443f, -0.004735f, -0.014520f, +0.003679f, +0.008411f, +0.001405f, + +0.015848f, +0.009621f, -0.003583f, +0.000226f, +0.004778f, -0.010088f, -0.008838f, -0.012057f, +0.004659f, -0.010363f, + +0.005120f, +0.002512f, +0.001003f, -0.008707f, +0.001964f, +0.004561f, -0.001328f, -0.001474f, +0.000486f, -0.005411f, + +0.009047f, +0.002477f, -0.005373f, -0.006997f, -0.002832f, +0.001940f, -0.002734f, +0.004349f, -0.000675f, -0.000249f, + -0.001450f, -0.000150f, -0.004058f, +0.001355f, +0.003368f, +0.002261f, -0.001988f, +0.000821f, +0.002825f, +0.001618f, + -0.005045f, +0.000073f, -0.002753f, -0.004061f, +0.000511f, +0.004490f, -0.002644f, -0.002214f, -0.000170f, -0.000860f, + +0.001914f, +0.000625f, +0.001116f, +0.001284f, -0.003383f, -0.000923f + }, + { + +0.001992f, -0.064388f, +0.000694f, +0.007766f, -0.008353f, -0.002051f, -0.022742f, +0.006823f, -0.002052f, +0.005486f, + -0.030872f, +0.012084f, +0.011014f, +0.025510f, +0.032079f, -0.014615f, +0.016625f, +0.028299f, -0.036388f, -0.008053f, + -0.003966f, -0.000193f, -0.005536f, +0.002549f, +0.034227f, +0.000731f, +0.019920f, -0.003825f, -0.018757f, -0.009099f, + -0.014690f, -0.010540f, -0.020539f, +0.018865f, -0.001070f, -0.011223f, -0.000413f, +0.009893f, +0.004474f, -0.005064f, + -0.004805f, -0.001557f, +0.008797f, +0.008347f, -0.001334f, +0.010974f, +0.000798f, -0.011065f, -0.002787f, +0.000545f, + -0.004341f, -0.006275f, -0.005669f, -0.000610f, +0.002520f, +0.010786f, -0.012949f, -0.000028f, -0.002631f, -0.004858f, + +0.000911f, +0.000619f, -0.001053f, +0.003434f, -0.001250f, +0.003707f, +0.000506f, -0.003502f, +0.004355f, -0.002000f, + -0.001506f, -0.000358f, -0.003237f, +0.005447f, +0.001815f, +0.001407f, -0.002284f, -0.001872f, -0.002190f, -0.000610f, + -0.004375f, +0.006199f, -0.001316f, -0.004834f, +0.001760f, -0.002485f, +0.001395f, +0.002922f, +0.001258f, -0.002392f, + +0.001228f, +0.001487f, -0.001195f, -0.003209f, -0.001327f, +0.002836f + }, + { + +0.034600f, +0.004758f, -0.018678f, +0.023568f, -0.009706f, +0.047721f, -0.011518f, +0.023850f, -0.003538f, +0.009250f, + -0.035490f, +0.017809f, -0.039035f, -0.025682f, +0.000076f, -0.010732f, -0.000648f, +0.021918f, -0.011564f, +0.008066f, + +0.018867f, -0.001057f, +0.015613f, +0.005322f, +0.003710f, +0.014283f, -0.008385f, -0.003487f, +0.006537f, +0.002358f, + +0.012867f, -0.021664f, +0.024417f, +0.004433f, -0.006983f, +0.001620f, +0.009278f, -0.001364f, +0.011602f, +0.003288f, + +0.014967f, -0.000309f, -0.004567f, -0.008399f, -0.006189f, +0.002314f, -0.003557f, +0.000351f, -0.017963f, -0.002324f, + -0.008610f, -0.003366f, +0.008732f, +0.007328f, -0.005610f, +0.008592f, -0.001256f, -0.004377f, -0.001422f, -0.003059f, + -0.005613f, -0.002499f, +0.001239f, +0.001001f, -0.004183f, +0.003448f, +0.003710f, -0.009089f, -0.009992f, -0.003659f, + -0.005247f, +0.000092f, +0.000115f, -0.001877f, -0.000803f, +0.002532f, +0.004932f, +0.003764f, -0.002904f, +0.000571f, + +0.004316f, +0.002522f, -0.001038f, +0.002527f, +0.000995f, +0.000400f, -0.000725f, -0.000379f, -0.005118f, +0.002560f, + -0.000173f, +0.000848f, -0.002013f, +0.001422f, -0.001352f, +0.000905f + }, + { + -0.005777f, +0.051308f, -0.010272f, -0.000697f, -0.011795f, +0.010732f, +0.020658f, +0.005045f, +0.012664f, +0.004214f, + +0.000710f, -0.005951f, +0.008228f, +0.100190f, -0.068661f, -0.000711f, +0.026068f, +0.030645f, +0.008704f, +0.023414f, + -0.012118f, -0.014030f, -0.005471f, -0.018178f, -0.032611f, -0.007160f, -0.006552f, -0.011871f, -0.008192f, +0.006720f, + +0.001868f, +0.016977f, +0.000059f, -0.002995f, -0.007357f, +0.000263f, +0.005214f, +0.007833f, -0.005390f, +0.003735f, + -0.002098f, +0.001897f, -0.000765f, -0.007328f, +0.003326f, +0.003104f, -0.007381f, +0.002657f, -0.006306f, +0.008125f, + +0.002249f, -0.000260f, -0.010662f, -0.017907f, -0.013628f, +0.004246f, -0.003223f, -0.001914f, +0.006591f, -0.002937f, + +0.006096f, -0.001225f, -0.007876f, +0.007405f, +0.009003f, +0.000368f, -0.008331f, -0.000972f, +0.005604f, -0.000530f, + -0.001355f, -0.003055f, -0.006383f, +0.001659f, -0.005780f, -0.000393f, -0.002562f, +0.003160f, -0.003518f, -0.000575f, + +0.003634f, -0.000687f, +0.002670f, +0.002231f, -0.001301f, -0.001287f, -0.001344f, +0.002177f, +0.003952f, +0.000856f, + -0.003112f, +0.002022f, -0.002648f, +0.001062f, -0.000035f, -0.002556f + }, + { + +0.017759f, +0.085213f, -0.005907f, -0.057037f, +0.004691f, +0.037147f, +0.024678f, +0.008157f, -0.009916f, +0.009998f, + -0.006765f, -0.001904f, -0.031734f, +0.007104f, +0.085210f, +0.013654f, +0.007736f, +0.031086f, -0.002275f, +0.018640f, + +0.002049f, +0.000247f, +0.009542f, +0.004116f, -0.015160f, +0.013293f, +0.020933f, +0.005482f, +0.005053f, -0.022780f, + +0.005506f, -0.021765f, +0.002550f, -0.003371f, +0.009198f, -0.013744f, +0.014068f, +0.001064f, +0.006204f, -0.004034f, + +0.012455f, -0.000379f, +0.024634f, -0.003608f, -0.006844f, -0.005979f, -0.009537f, +0.004350f, +0.005544f, +0.005252f, + -0.006358f, -0.003263f, -0.009739f, +0.010433f, -0.001175f, +0.007205f, +0.006630f, +0.001530f, -0.004181f, -0.007436f, + -0.004633f, +0.000502f, +0.007505f, +0.001490f, -0.009340f, +0.001531f, -0.000093f, -0.004072f, -0.001683f, +0.001752f, + +0.001515f, +0.001072f, +0.000809f, +0.007219f, +0.001110f, -0.001535f, -0.003203f, +0.000613f, -0.000067f, -0.003661f, + +0.002643f, -0.001174f, -0.001623f, +0.000003f, +0.000891f, +0.000941f, -0.002902f, -0.000609f, +0.002863f, -0.005839f, + +0.002967f, +0.002413f, -0.000934f, +0.001556f, +0.001874f, +0.001654f + } + }, + { + { + +0.003666f, +0.070616f, -0.008442f, -0.016774f, +0.048447f, -0.000983f, -0.012015f, -0.006057f, -0.016951f, +0.007404f, + +0.000226f, -0.014619f, -0.003707f, +0.018053f, +0.000429f, +0.017994f, -0.007094f, -0.012845f, +0.003355f, -0.003351f, + +0.030798f, +0.001006f, -0.007397f, +0.015969f, -0.021733f, +0.005805f, -0.021267f, +0.012986f, +0.000222f, +0.003897f, + -0.018234f, -0.019148f, +0.006137f, +0.002176f, -0.006925f, -0.005897f, -0.001109f, +0.012485f, +0.001286f, +0.002843f, + -0.005661f, +0.012307f, +0.017038f, -0.007663f, +0.005344f, +0.003762f, +0.012444f, +0.013112f, -0.005190f, -0.004570f, + +0.005293f, +0.005947f, -0.005509f, -0.001268f, +0.010538f, +0.002692f, -0.010254f, -0.000907f, -0.000174f, +0.002856f, + +0.006004f, -0.004573f, +0.000227f, -0.002675f, -0.001512f, +0.000890f, -0.005954f, +0.006296f, -0.001403f, +0.002108f, + -0.002644f, +0.003628f, +0.006365f, +0.000058f, -0.002476f, -0.001625f, -0.000780f, -0.004009f, +0.000407f, +0.004030f, + +0.000130f, +0.006011f, -0.002737f, +0.001604f, -0.000568f, -0.003553f, -0.001289f, -0.000661f, +0.002669f, +0.002229f, + -0.000222f, +0.001456f, -0.001163f, +0.001192f, -0.001355f, +0.000957f + }, + { + +0.003807f, +0.354570f, +0.037188f, +0.100238f, +0.018193f, +0.013310f, +0.029373f, -0.000128f, +0.025010f, +0.018595f, + -0.007354f, -0.067306f, -0.005320f, -0.009220f, +0.021795f, +0.008518f, -0.019033f, -0.016017f, -0.007876f, +0.003670f, + +0.004039f, -0.004641f, +0.005805f, -0.008196f, +0.003071f, +0.004667f, -0.002091f, +0.006565f, +0.014447f, +0.001137f, + +0.000405f, +0.003494f, +0.007522f, +0.016306f, +0.001508f, -0.007515f, -0.010340f, -0.004097f, +0.003641f, +0.006146f, + +0.000674f, -0.009428f, +0.010116f, +0.001209f, -0.005331f, +0.004832f, -0.008830f, +0.004162f, +0.005040f, +0.013815f, + -0.005237f, -0.001396f, -0.002355f, -0.012333f, -0.006350f, +0.003881f, +0.002411f, +0.005165f, -0.009465f, +0.002194f, + -0.007834f, -0.000875f, +0.003625f, -0.001595f, -0.000684f, +0.007718f, -0.007868f, +0.002162f, +0.002193f, +0.002416f, + -0.003849f, +0.000650f, +0.003113f, -0.001423f, +0.003390f, -0.006711f, +0.000899f, +0.001958f, -0.001762f, +0.000382f, + +0.000613f, -0.002886f, -0.000336f, +0.001036f, +0.002460f, +0.003537f, +0.002673f, +0.000942f, -0.002517f, -0.001484f, + +0.001644f, -0.000015f, +0.003159f, -0.000711f, +0.002618f, +0.001165f + }, + { + -0.010342f, -0.209390f, +0.022984f, +0.001144f, -0.056639f, +0.012706f, +0.014683f, +0.015001f, -0.005230f, -0.007648f, + +0.001600f, +0.063926f, +0.018033f, -0.000685f, +0.025721f, -0.001999f, -0.001170f, +0.004826f, +0.028970f, -0.015439f, + -0.017152f, +0.021827f, -0.005873f, +0.012565f, -0.016981f, -0.013051f, +0.001038f, +0.004989f, +0.006537f, +0.006839f, + +0.006131f, -0.005359f, +0.016447f, -0.007363f, +0.005303f, +0.022574f, -0.028204f, -0.014177f, +0.009513f, -0.009330f, + -0.015794f, +0.000830f, -0.005337f, +0.007398f, -0.001020f, -0.002271f, +0.005278f, -0.005054f, -0.014903f, +0.009943f, + +0.004713f, +0.003126f, -0.000767f, -0.008619f, -0.002606f, -0.008476f, +0.002245f, +0.003499f, -0.000779f, +0.007516f, + +0.002682f, -0.008821f, +0.001055f, -0.006979f, -0.003813f, -0.008025f, +0.009645f, -0.004126f, +0.000626f, -0.000562f, + -0.001271f, -0.006431f, -0.004152f, -0.005373f, -0.003880f, +0.000116f, -0.001940f, +0.004600f, -0.002502f, -0.004348f, + +0.004599f, +0.003295f, +0.000765f, +0.002339f, -0.000552f, -0.000965f, +0.002897f, -0.000193f, +0.002482f, -0.000157f, + +0.001955f, +0.002446f, -0.000881f, +0.000590f, +0.000132f, +0.001438f + }, + { + -0.003239f, -0.023437f, +0.025347f, -0.013494f, -0.002867f, +0.001378f, -0.001447f, +0.011538f, +0.002678f, -0.002889f, + +0.009458f, +0.003791f, +0.013478f, +0.003878f, -0.028705f, +0.018801f, -0.000610f, +0.013276f, +0.015976f, +0.000376f, + -0.000303f, -0.001063f, -0.022333f, +0.007704f, -0.015460f, -0.019045f, +0.023115f, +0.008799f, -0.003535f, +0.016697f, + +0.010237f, -0.004483f, -0.009555f, +0.012014f, -0.009330f, +0.033181f, +0.010449f, +0.001334f, -0.024654f, +0.016065f, + -0.011738f, +0.009061f, -0.003756f, -0.001995f, +0.001155f, -0.007095f, -0.000186f, +0.000123f, +0.007169f, +0.001026f, + +0.002531f, +0.003776f, -0.002499f, +0.002314f, -0.002875f, -0.006981f, -0.002116f, +0.002401f, -0.001223f, +0.006074f, + +0.007705f, +0.002599f, -0.002970f, +0.004027f, -0.009506f, +0.003059f, +0.004540f, +0.000946f, +0.005886f, +0.002236f, + +0.002751f, +0.004209f, +0.005818f, -0.007907f, -0.002024f, -0.000402f, +0.003998f, +0.000531f, -0.002314f, +0.003321f, + +0.004944f, +0.000491f, +0.001096f, +0.002636f, -0.001790f, +0.002535f, -0.000043f, +0.005305f, +0.000714f, +0.000469f, + +0.001022f, -0.001031f, -0.001254f, +0.001555f, +0.002549f, -0.001072f + }, + { + -0.007282f, +0.062777f, -0.003454f, +0.089053f, -0.006931f, +0.001270f, +0.018768f, -0.001664f, -0.007120f, -0.017086f, + -0.043129f, -0.016730f, +0.015504f, +0.003304f, +0.019001f, +0.026436f, +0.007222f, -0.023920f, -0.031471f, -0.022486f, + -0.033423f, +0.011897f, -0.012869f, -0.028596f, -0.003509f, +0.023353f, -0.016636f, +0.003903f, +0.003796f, +0.013413f, + +0.012081f, -0.015069f, +0.004537f, -0.011854f, +0.017546f, +0.004709f, +0.005968f, -0.016023f, -0.019584f, -0.000146f, + -0.001915f, -0.002458f, -0.001937f, +0.009720f, -0.003742f, +0.001865f, +0.019200f, +0.007844f, -0.011732f, +0.004758f, + +0.001189f, -0.010719f, -0.008504f, +0.002465f, +0.011882f, +0.002091f, +0.001436f, +0.000005f, +0.001460f, -0.005205f, + +0.001023f, +0.007853f, +0.009043f, -0.001662f, -0.010003f, +0.003491f, +0.001729f, +0.000390f, +0.001861f, +0.003563f, + +0.002077f, +0.002216f, -0.002388f, +0.000335f, +0.000633f, +0.005774f, -0.003336f, +0.000483f, -0.005111f, +0.000391f, + -0.003158f, +0.001561f, -0.000236f, +0.002383f, +0.000134f, +0.002515f, -0.002350f, -0.000592f, -0.003209f, +0.001989f, + +0.000566f, -0.000194f, +0.002243f, +0.001193f, +0.000721f, -0.001201f + }, + { + -0.002558f, -0.029810f, +0.000633f, +0.013268f, -0.005452f, -0.003469f, -0.000867f, -0.002594f, -0.002575f, -0.004862f, + +0.007648f, -0.014259f, -0.002556f, +0.001765f, +0.087725f, +0.004735f, -0.007631f, -0.015601f, -0.014682f, -0.021690f, + +0.013800f, +0.015410f, -0.007010f, +0.000599f, -0.001876f, +0.004370f, -0.019606f, -0.007884f, +0.007022f, +0.012753f, + -0.019448f, -0.023108f, -0.013774f, +0.000357f, +0.008403f, +0.012521f, +0.003071f, -0.005024f, +0.000351f, +0.001855f, + -0.011384f, -0.010272f, +0.001024f, +0.004088f, +0.005831f, -0.006850f, -0.003225f, +0.003095f, -0.003437f, +0.007193f, + -0.001079f, -0.000530f, -0.002957f, +0.011204f, +0.000364f, +0.000530f, -0.004586f, -0.000329f, +0.003563f, +0.008526f, + -0.003399f, +0.004384f, -0.002700f, -0.008596f, -0.002268f, +0.001234f, +0.002550f, -0.001129f, +0.001525f, +0.007855f, + +0.000289f, -0.001464f, -0.000095f, +0.002105f, -0.001164f, +0.001331f, +0.002161f, -0.006371f, +0.001398f, +0.000986f, + -0.000076f, -0.000986f, -0.005982f, +0.002178f, +0.000212f, -0.002742f, +0.001996f, -0.001596f, -0.003345f, -0.003517f, + +0.001446f, +0.002758f, -0.000188f, -0.001662f, -0.002027f, -0.000552f + }, + { + -0.031536f, +0.115950f, +0.007673f, +0.115482f, -0.014437f, -0.003913f, +0.024467f, +0.028979f, -0.013869f, -0.000151f, + -0.001445f, -0.002226f, +0.031644f, -0.004632f, +0.023419f, -0.001391f, +0.000745f, -0.031731f, -0.004776f, +0.004803f, + -0.015367f, +0.032032f, -0.004366f, +0.011364f, -0.021401f, +0.001087f, -0.018012f, -0.017991f, -0.002335f, +0.004886f, + -0.013813f, -0.009594f, -0.008746f, +0.003158f, +0.008442f, -0.008154f, +0.005246f, +0.007226f, +0.004314f, -0.000079f, + +0.000909f, +0.011331f, -0.000314f, +0.001341f, +0.003078f, -0.006995f, +0.001364f, +0.002795f, -0.012554f, +0.004414f, + +0.001910f, -0.008328f, +0.014826f, -0.002161f, -0.005061f, +0.004805f, +0.004582f, +0.001787f, +0.005041f, -0.005423f, + -0.000118f, +0.002818f, -0.007807f, +0.001001f, -0.003920f, -0.006391f, +0.006662f, +0.004314f, -0.000860f, +0.001713f, + +0.002041f, -0.001525f, -0.002100f, -0.000176f, +0.002719f, -0.002131f, -0.001876f, +0.001300f, -0.000323f, -0.001123f, + -0.002556f, +0.000465f, +0.003899f, -0.000402f, +0.004542f, -0.004397f, +0.000434f, -0.000399f, -0.001574f, +0.002311f, + +0.001409f, +0.000741f, +0.002758f, -0.000444f, +0.000316f, +0.000174f + }, + { + -0.005051f, +0.032632f, -0.023391f, -0.007221f, +0.001044f, -0.003229f, +0.005354f, +0.000487f, -0.011952f, -0.000373f, + +0.022806f, +0.003734f, +0.000190f, +0.015495f, +0.032847f, +0.000813f, -0.023704f, -0.005278f, +0.011259f, +0.032663f, + -0.011060f, -0.004709f, -0.019977f, +0.012673f, +0.017371f, -0.032904f, -0.028458f, -0.000095f, +0.002446f, +0.009119f, + -0.037212f, +0.010671f, +0.026735f, -0.001786f, +0.017745f, +0.006713f, -0.014793f, +0.017657f, +0.013174f, +0.002862f, + +0.001727f, +0.006602f, -0.010352f, +0.005129f, -0.010639f, +0.001906f, +0.008920f, +0.003999f, +0.007197f, +0.008727f, + -0.016339f, +0.005930f, -0.007558f, -0.009021f, -0.000720f, +0.000909f, -0.005185f, +0.001539f, +0.004349f, +0.006470f, + +0.003392f, -0.002624f, -0.003864f, +0.007628f, -0.001444f, +0.004723f, +0.001406f, -0.002146f, -0.000265f, +0.000456f, + -0.005205f, +0.000186f, -0.007856f, -0.001615f, -0.000627f, -0.001532f, -0.001721f, +0.002249f, +0.003898f, +0.001736f, + +0.004227f, +0.002208f, -0.002034f, -0.001094f, -0.002545f, -0.001529f, -0.000347f, -0.000792f, +0.002200f, -0.000102f, + +0.001098f, +0.000504f, -0.001533f, -0.001110f, +0.002674f, -0.001652f + }, + { + -0.011639f, +0.244054f, +0.015473f, +0.120510f, -0.021818f, -0.004595f, +0.020531f, +0.014216f, +0.023731f, -0.007602f, + -0.009503f, +0.012775f, +0.033919f, +0.012896f, +0.010476f, -0.005946f, +0.015484f, +0.013591f, -0.004577f, -0.001644f, + +0.006172f, -0.002246f, -0.017236f, -0.011927f, +0.015112f, +0.004537f, +0.005498f, +0.006472f, +0.002767f, -0.008907f, + -0.002013f, +0.010381f, -0.001525f, +0.010232f, -0.012900f, +0.006562f, -0.000399f, +0.009897f, -0.016270f, -0.008599f, + -0.007727f, -0.004740f, -0.003379f, +0.003196f, -0.003558f, -0.001271f, -0.011143f, -0.002632f, -0.011378f, -0.018008f, + -0.006188f, -0.010701f, -0.006267f, -0.004082f, +0.000714f, -0.002976f, +0.002901f, +0.003282f, +0.011203f, -0.000644f, + -0.003886f, -0.001033f, +0.000242f, -0.009428f, -0.006784f, -0.006841f, +0.002109f, -0.003504f, +0.000186f, -0.004467f, + -0.000584f, +0.001614f, +0.000336f, -0.010521f, +0.002068f, -0.000702f, -0.005732f, +0.001227f, +0.003103f, +0.003352f, + +0.003858f, -0.000127f, +0.003773f, +0.001128f, -0.002509f, +0.001548f, +0.001005f, -0.001440f, -0.003748f, -0.001093f, + +0.001860f, +0.000856f, +0.001650f, -0.002575f, +0.000486f, +0.001740f + }, + { + +0.002956f, -0.102441f, -0.053326f, -0.001381f, -0.010653f, -0.010297f, -0.014481f, +0.000753f, +0.007769f, +0.032736f, + +0.014579f, +0.019189f, +0.029129f, +0.006075f, -0.014667f, -0.007624f, +0.008080f, -0.012809f, -0.000305f, +0.011667f, + +0.015304f, +0.018085f, -0.013419f, -0.004030f, +0.013474f, -0.003963f, +0.009161f, +0.000714f, +0.002042f, +0.018674f, + -0.024467f, +0.014591f, +0.018972f, -0.012064f, -0.014183f, +0.001188f, -0.009634f, -0.018922f, -0.009761f, +0.008862f, + +0.010436f, -0.005789f, +0.004737f, +0.000549f, +0.004001f, -0.000784f, +0.000866f, -0.004348f, +0.011223f, -0.006447f, + -0.006926f, -0.009757f, -0.008335f, +0.002391f, +0.003487f, -0.008937f, +0.000592f, -0.004014f, +0.004370f, -0.004499f, + -0.002191f, -0.003121f, +0.001757f, -0.002570f, +0.000625f, +0.001050f, +0.000104f, +0.000583f, +0.000070f, -0.000761f, + +0.000207f, +0.000935f, +0.004798f, -0.003440f, -0.004610f, +0.002060f, -0.002709f, +0.001718f, +0.001585f, +0.006486f, + -0.002309f, +0.002248f, +0.001167f, +0.000918f, -0.006107f, -0.003908f, +0.001184f, -0.001132f, -0.004000f, -0.003157f, + +0.000194f, -0.003832f, +0.000220f, -0.000012f, +0.001311f, -0.001566f + }, + { + -0.011139f, -0.260271f, +0.084204f, -0.002630f, -0.010164f, -0.092200f, +0.060123f, -0.000278f, +0.011775f, +0.018659f, + +0.003604f, -0.012848f, +0.013057f, -0.034434f, +0.008601f, -0.013756f, +0.036200f, +0.033273f, +0.019484f, -0.018589f, + +0.001522f, -0.003358f, +0.007793f, -0.003553f, +0.001130f, -0.006982f, -0.002998f, -0.020203f, +0.002764f, +0.015273f, + -0.002448f, -0.001205f, +0.005627f, -0.014441f, -0.007219f, +0.013544f, -0.007104f, -0.002755f, +0.008153f, +0.003614f, + +0.008498f, +0.006640f, -0.001071f, +0.004821f, +0.003527f, -0.007789f, -0.001520f, -0.014631f, +0.005102f, -0.003391f, + +0.005261f, -0.007785f, -0.003952f, -0.002399f, +0.006603f, -0.003094f, -0.006288f, -0.007065f, -0.001544f, -0.003960f, + +0.002155f, -0.003283f, -0.005230f, -0.001451f, +0.001957f, +0.006740f, +0.001206f, +0.000213f, -0.000414f, +0.002708f, + -0.001678f, +0.000181f, +0.000359f, +0.000190f, -0.001124f, +0.000629f, -0.004569f, -0.000874f, +0.002457f, +0.005469f, + -0.002515f, +0.000093f, +0.000309f, -0.002461f, -0.000013f, +0.001108f, -0.003201f, -0.002388f, +0.000762f, +0.001062f, + +0.000020f, -0.004025f, +0.000032f, +0.003835f, -0.000785f, -0.000952f + }, + { + -0.002473f, -0.072923f, +0.009017f, +0.022773f, +0.008308f, +0.005541f, -0.018061f, +0.011396f, -0.003512f, +0.003268f, + -0.026919f, +0.003464f, -0.020958f, -0.014199f, +0.033129f, -0.028648f, -0.008301f, +0.010420f, -0.046183f, +0.000458f, + +0.010630f, +0.001321f, -0.021000f, -0.016800f, +0.011176f, +0.007053f, +0.028462f, -0.005981f, -0.008081f, +0.002398f, + -0.007197f, -0.004949f, -0.015199f, +0.025029f, +0.001983f, -0.010263f, -0.015073f, -0.027867f, -0.017775f, +0.001159f, + +0.016066f, +0.002317f, -0.011283f, -0.003525f, -0.002403f, -0.000777f, -0.002905f, -0.004003f, +0.001680f, +0.004839f, + -0.004198f, -0.004915f, -0.001188f, -0.000091f, +0.002692f, +0.009049f, -0.008214f, +0.014764f, +0.010690f, -0.000463f, + -0.007378f, +0.002414f, +0.002529f, +0.003583f, -0.002690f, +0.001689f, +0.004744f, +0.000805f, -0.000384f, -0.002221f, + -0.001042f, -0.001167f, -0.004153f, +0.000314f, +0.001952f, +0.004848f, -0.004642f, -0.001867f, -0.000085f, -0.002530f, + -0.004378f, +0.003583f, +0.000241f, -0.003641f, +0.000002f, +0.001213f, -0.001276f, +0.001442f, +0.001907f, -0.001245f, + +0.001927f, +0.000392f, +0.000295f, -0.000456f, +0.000351f, +0.002576f + }, + { + -0.039216f, -0.081783f, -0.009576f, +0.024996f, -0.010745f, +0.023887f, -0.035958f, +0.021938f, +0.021290f, +0.015485f, + -0.061283f, +0.024454f, -0.000985f, -0.004328f, -0.008470f, +0.012916f, +0.020761f, +0.006486f, -0.020558f, -0.007364f, + -0.008767f, +0.000225f, +0.002851f, +0.011145f, +0.009065f, -0.018155f, -0.021894f, -0.014215f, -0.024487f, -0.005452f, + +0.021764f, -0.036866f, +0.006834f, +0.012842f, +0.005140f, +0.007957f, +0.012488f, -0.009402f, -0.007003f, -0.011287f, + +0.020169f, +0.016930f, +0.000400f, -0.002226f, -0.002420f, +0.010768f, +0.006943f, +0.008108f, -0.014941f, -0.006393f, + -0.008741f, -0.009261f, -0.002723f, -0.004006f, -0.017497f, -0.008674f, -0.009578f, +0.001236f, -0.000647f, +0.000777f, + +0.003058f, +0.002688f, +0.006299f, +0.001680f, -0.006171f, +0.005997f, +0.010039f, -0.005288f, -0.010013f, -0.003499f, + -0.003464f, +0.004575f, -0.001147f, -0.005088f, -0.001684f, +0.001276f, +0.005069f, +0.000445f, -0.001965f, +0.003384f, + +0.003485f, +0.004478f, +0.001417f, -0.000455f, -0.002956f, -0.000553f, +0.000569f, +0.001166f, -0.005866f, +0.001163f, + +0.000182f, +0.001367f, -0.000022f, +0.000140f, -0.003854f, -0.002858f + }, + { + +0.007708f, +0.079932f, -0.006838f, -0.003282f, -0.003023f, +0.012750f, +0.012379f, -0.002631f, +0.005506f, +0.005596f, + -0.010131f, -0.005292f, +0.014491f, +0.038071f, -0.124812f, -0.008298f, -0.002384f, +0.025464f, -0.023646f, -0.017826f, + -0.001353f, -0.000627f, -0.006862f, -0.011350f, -0.022757f, -0.002609f, -0.012361f, +0.005653f, -0.011750f, +0.004983f, + +0.011489f, +0.024502f, +0.004319f, -0.003170f, -0.000574f, +0.022683f, +0.011105f, +0.002722f, +0.001751f, +0.003025f, + -0.008496f, -0.003677f, -0.007432f, +0.003596f, +0.005411f, +0.002056f, -0.004353f, +0.005420f, -0.004546f, +0.008823f, + -0.000279f, -0.004342f, +0.008766f, +0.001136f, -0.008884f, +0.008774f, -0.003363f, +0.004408f, +0.006988f, -0.009738f, + +0.000921f, -0.001733f, -0.001411f, +0.014050f, +0.006482f, +0.002725f, +0.002903f, +0.005065f, +0.009075f, -0.003445f, + +0.000588f, +0.006885f, -0.001118f, -0.000682f, -0.009384f, +0.003356f, +0.001843f, +0.001547f, -0.007934f, -0.002019f, + +0.001205f, -0.000103f, +0.002310f, -0.001749f, +0.001025f, +0.004169f, +0.003802f, -0.000971f, +0.003317f, +0.004159f, + -0.006378f, +0.002166f, +0.000802f, +0.002981f, +0.002699f, -0.002353f + }, + { + -0.034593f, +0.037598f, +0.043336f, -0.036530f, +0.003696f, +0.011195f, +0.003983f, +0.006540f, -0.016483f, +0.007089f, + +0.014978f, +0.000106f, -0.032032f, +0.010811f, +0.081698f, +0.006988f, -0.008362f, -0.005593f, -0.037414f, -0.001811f, + -0.014874f, +0.015473f, +0.018537f, -0.005148f, -0.018937f, +0.013216f, +0.002237f, -0.019650f, -0.011276f, -0.021903f, + +0.000871f, -0.022459f, +0.014701f, +0.006863f, +0.006189f, -0.012952f, +0.007061f, -0.000476f, +0.010594f, -0.012385f, + +0.001753f, -0.008168f, +0.015351f, -0.004020f, -0.011156f, -0.009184f, -0.014830f, -0.008988f, -0.012683f, -0.004012f, + +0.000588f, +0.002851f, -0.015279f, +0.014653f, -0.000850f, -0.005240f, -0.001797f, +0.005058f, -0.001558f, -0.010933f, + -0.003005f, +0.006583f, +0.008337f, +0.003240f, -0.001497f, +0.003757f, -0.001395f, -0.000140f, +0.000696f, +0.002802f, + -0.002013f, -0.001404f, -0.002867f, +0.001484f, -0.001175f, -0.003301f, -0.003475f, +0.002494f, -0.000917f, -0.004095f, + +0.004193f, +0.000602f, -0.002888f, -0.000857f, +0.000527f, +0.000644f, -0.000572f, +0.000044f, +0.003056f, -0.002314f, + +0.004023f, +0.002842f, +0.000794f, +0.001006f, +0.000979f, +0.001401f + } + }, + { + { + -0.002235f, +0.014689f, +0.030726f, +0.052665f, -0.025664f, +0.004723f, -0.010426f, -0.004763f, -0.011727f, +0.004696f, + -0.009006f, -0.018568f, -0.004842f, +0.015563f, +0.024378f, +0.003829f, -0.045756f, -0.010499f, +0.025266f, -0.003779f, + +0.019506f, -0.001304f, +0.002528f, +0.013275f, -0.019600f, +0.011085f, -0.033420f, +0.021848f, -0.005451f, +0.001079f, + -0.003478f, -0.024662f, +0.007648f, -0.000294f, -0.003813f, -0.004009f, -0.007455f, -0.001093f, +0.014208f, +0.002386f, + -0.005948f, +0.016353f, +0.008911f, +0.001418f, -0.004671f, +0.002532f, +0.028125f, +0.006058f, -0.012597f, -0.001183f, + +0.004058f, +0.013795f, -0.008712f, +0.008575f, +0.011281f, -0.001543f, -0.009292f, +0.003448f, -0.003624f, +0.004926f, + +0.000905f, +0.002380f, -0.000614f, -0.007140f, -0.000945f, -0.002405f, -0.001515f, +0.002335f, +0.003362f, +0.004640f, + -0.001786f, +0.003697f, -0.004056f, +0.007660f, -0.004003f, +0.000551f, -0.001855f, +0.002129f, -0.005326f, +0.003878f, + +0.001779f, +0.003094f, +0.002022f, +0.001346f, -0.004428f, -0.002311f, +0.001043f, +0.000185f, +0.001408f, +0.002290f, + +0.002078f, +0.000563f, -0.000124f, -0.001936f, +0.000236f, +0.001894f + }, + { + -0.006450f, +0.464562f, +0.004074f, +0.132112f, -0.020974f, +0.011546f, +0.016134f, +0.016808f, +0.016468f, -0.003589f, + +0.006472f, -0.048092f, -0.017988f, -0.002791f, -0.000955f, +0.019947f, -0.000465f, -0.017120f, +0.003685f, -0.004085f, + -0.003895f, -0.003233f, +0.007904f, +0.000108f, -0.000780f, -0.014273f, +0.002567f, +0.007475f, +0.023872f, -0.003202f, + +0.001560f, +0.013278f, -0.006477f, +0.015537f, +0.010923f, -0.009125f, -0.003190f, -0.002502f, +0.002479f, +0.000872f, + +0.004045f, -0.001677f, +0.015352f, -0.010639f, -0.000853f, -0.011023f, -0.000499f, +0.009444f, +0.010866f, +0.003897f, + -0.001472f, -0.000523f, -0.000594f, -0.018200f, +0.000031f, +0.010683f, -0.009554f, -0.000166f, -0.003415f, +0.000720f, + -0.001974f, -0.002306f, +0.003388f, -0.001044f, +0.004482f, +0.001783f, +0.001016f, -0.003065f, +0.000511f, +0.003522f, + -0.003618f, +0.000080f, +0.003026f, +0.001171f, +0.001691f, -0.000330f, -0.001539f, -0.001894f, -0.003444f, +0.000415f, + +0.003558f, -0.002547f, -0.001492f, +0.001187f, +0.001896f, +0.003504f, +0.003724f, -0.001924f, -0.000003f, -0.000936f, + +0.001590f, +0.002993f, +0.001912f, -0.001504f, +0.001726f, -0.000483f + }, + { + +0.012981f, -0.178506f, -0.036178f, -0.072328f, +0.028175f, -0.006702f, +0.019710f, +0.001389f, +0.006497f, -0.020357f, + +0.003438f, +0.048807f, +0.017699f, +0.006281f, +0.003890f, +0.018087f, -0.006741f, +0.015700f, -0.006527f, +0.011431f, + -0.014638f, +0.002377f, +0.003208f, +0.010618f, -0.007731f, -0.013300f, -0.014326f, -0.002664f, +0.021810f, -0.007848f, + +0.016130f, +0.007063f, +0.003259f, -0.010393f, +0.018353f, -0.007339f, -0.003664f, -0.013308f, -0.005890f, +0.000026f, + -0.012222f, -0.005295f, +0.003743f, +0.001231f, +0.003698f, +0.002892f, +0.002302f, -0.004333f, -0.012781f, -0.000453f, + +0.019612f, -0.004474f, -0.001205f, -0.006913f, +0.000934f, +0.001383f, -0.001968f, -0.001100f, -0.001385f, +0.009459f, + +0.002206f, -0.009751f, -0.003708f, -0.006291f, -0.004155f, -0.002153f, +0.004490f, -0.004323f, -0.003524f, +0.002192f, + -0.001414f, -0.006811f, -0.005894f, +0.001036f, -0.002276f, +0.001273f, +0.000183f, -0.000225f, -0.000113f, -0.004598f, + +0.003899f, +0.003366f, +0.003768f, +0.000007f, -0.000278f, +0.000428f, +0.002328f, -0.001376f, +0.003795f, +0.001380f, + +0.002759f, -0.000322f, -0.000936f, -0.001968f, +0.003478f, +0.002147f + }, + { + +0.004102f, +0.006495f, -0.003469f, -0.007297f, -0.004122f, -0.002383f, +0.006036f, +0.004991f, +0.004420f, +0.007229f, + -0.007275f, +0.013983f, +0.008884f, +0.011684f, -0.031193f, -0.015930f, +0.025657f, +0.040655f, +0.013340f, -0.010841f, + -0.002072f, +0.005806f, -0.013090f, -0.024283f, +0.007774f, +0.014818f, +0.002207f, -0.004027f, +0.002658f, +0.006788f, + +0.013476f, -0.021869f, +0.015361f, -0.009983f, -0.003780f, +0.016272f, +0.031815f, -0.001863f, -0.004816f, -0.002997f, + +0.009534f, -0.003091f, -0.014287f, -0.003099f, +0.003520f, -0.001103f, +0.000043f, -0.000824f, +0.010469f, -0.001365f, + +0.002008f, -0.007011f, +0.006094f, +0.008794f, -0.008278f, -0.002823f, -0.004849f, -0.002505f, +0.003634f, +0.002961f, + +0.006182f, +0.002008f, +0.001926f, +0.002186f, -0.002367f, -0.000424f, +0.004932f, -0.004177f, +0.006808f, +0.004639f, + -0.001226f, +0.006576f, +0.002221f, -0.000974f, -0.005028f, +0.003498f, -0.000187f, -0.001260f, +0.000960f, +0.001016f, + +0.003195f, -0.000421f, +0.001611f, +0.000764f, +0.000754f, +0.000580f, +0.003466f, +0.004958f, -0.001236f, +0.001061f, + +0.004225f, -0.001351f, -0.002176f, +0.001396f, +0.001717f, -0.002916f + }, + { + +0.030327f, -0.007903f, -0.008205f, +0.084008f, +0.012648f, -0.001769f, +0.004562f, +0.006664f, -0.017920f, -0.007216f, + -0.051865f, -0.019183f, +0.039220f, -0.009042f, +0.031846f, +0.017555f, +0.000294f, -0.027926f, -0.029026f, -0.035834f, + -0.010472f, -0.007037f, -0.028560f, +0.003542f, -0.012454f, +0.018265f, -0.021520f, -0.001742f, +0.009834f, +0.020304f, + +0.000135f, -0.000700f, -0.004462f, -0.010837f, +0.003749f, +0.019375f, -0.019830f, +0.018818f, -0.024517f, -0.005066f, + -0.006930f, -0.000788f, -0.003064f, +0.008279f, +0.007924f, -0.008540f, +0.016059f, +0.007213f, -0.007688f, +0.002935f, + -0.002760f, -0.010413f, +0.001659f, +0.002145f, +0.006929f, +0.002922f, -0.002830f, +0.002663f, +0.000327f, +0.003917f, + -0.013929f, +0.008108f, +0.008124f, +0.003431f, -0.010526f, +0.011370f, -0.008348f, +0.004777f, +0.004284f, +0.001934f, + -0.002689f, +0.003348f, +0.003760f, -0.000615f, +0.001409f, -0.001453f, -0.001958f, -0.001917f, +0.001102f, -0.003760f, + +0.000779f, +0.000436f, +0.003070f, -0.004849f, +0.005621f, +0.003001f, -0.001430f, -0.003949f, -0.003780f, +0.002219f, + +0.000402f, -0.001568f, +0.002672f, +0.002809f, -0.002151f, -0.000159f + }, + { + -0.000190f, -0.047520f, +0.003167f, +0.011532f, -0.000917f, -0.003474f, -0.001874f, -0.002373f, +0.000047f, -0.005333f, + -0.002089f, -0.006932f, +0.005528f, +0.019918f, +0.049360f, +0.004434f, +0.001528f, -0.008067f, -0.011495f, -0.006984f, + +0.017896f, +0.007687f, -0.012418f, -0.001636f, -0.008956f, +0.002188f, -0.007186f, -0.028009f, +0.023925f, +0.005968f, + -0.010371f, -0.006710f, -0.020298f, -0.005600f, +0.004155f, +0.019984f, -0.007387f, -0.009417f, +0.007450f, +0.000569f, + -0.014729f, -0.007441f, +0.002229f, +0.006914f, -0.001599f, +0.005183f, -0.008159f, +0.002458f, -0.003502f, +0.002712f, + +0.002625f, +0.000221f, +0.005719f, +0.006344f, -0.005393f, -0.003661f, +0.004667f, +0.000051f, +0.008507f, +0.000851f, + +0.002312f, -0.000650f, -0.001743f, -0.008845f, -0.000699f, -0.000504f, +0.002453f, -0.006290f, +0.008582f, +0.002070f, + -0.002445f, +0.003036f, +0.000872f, +0.002688f, +0.000020f, -0.001661f, +0.003257f, -0.004545f, +0.001973f, -0.001448f, + -0.000168f, -0.000869f, -0.005937f, +0.001588f, -0.000452f, -0.001927f, -0.000322f, -0.000492f, +0.000273f, -0.002399f, + -0.000998f, +0.001569f, +0.001239f, -0.003695f, -0.000853f, -0.000767f + }, + { + +0.060840f, -0.026404f, +0.013560f, +0.096031f, +0.015030f, -0.005843f, +0.012912f, +0.018676f, +0.016147f, -0.017737f, + +0.024242f, -0.004126f, +0.025738f, +0.007518f, +0.014343f, -0.010803f, -0.022284f, -0.030802f, +0.005694f, +0.008907f, + +0.001068f, +0.001726f, +0.012121f, -0.017688f, +0.005698f, +0.007883f, -0.010888f, -0.026049f, +0.003730f, -0.006169f, + -0.006100f, -0.010846f, +0.002394f, +0.002103f, +0.008082f, -0.005563f, +0.001366f, +0.006453f, +0.001289f, -0.002210f, + +0.007310f, +0.003130f, +0.004308f, +0.007744f, -0.001076f, -0.010499f, +0.020308f, -0.005801f, -0.014409f, +0.001533f, + +0.005226f, -0.008014f, +0.009069f, -0.001632f, -0.000639f, +0.001224f, +0.005556f, -0.000904f, +0.005096f, -0.001997f, + -0.003448f, +0.001997f, -0.012519f, +0.007838f, -0.007951f, -0.000678f, -0.002340f, +0.007797f, +0.000325f, +0.000116f, + +0.002770f, -0.001089f, -0.002205f, -0.002080f, -0.000153f, -0.001122f, +0.000709f, -0.000172f, -0.000732f, +0.000787f, + -0.000777f, -0.001685f, +0.000845f, +0.003331f, +0.000588f, -0.003947f, -0.000776f, +0.000161f, +0.000862f, +0.005020f, + -0.000831f, +0.001874f, +0.000718f, +0.000329f, -0.000215f, +0.001687f + }, + { + +0.001484f, -0.028140f, +0.009102f, -0.010372f, -0.007471f, +0.002956f, -0.001945f, +0.001877f, -0.009995f, +0.003493f, + +0.014666f, +0.008935f, +0.021591f, +0.016776f, +0.000187f, -0.016379f, -0.004615f, -0.009007f, -0.001415f, +0.032330f, + -0.004926f, -0.018596f, -0.006331f, +0.000475f, +0.016581f, -0.036674f, -0.024386f, +0.009491f, +0.023412f, -0.012001f, + -0.033639f, +0.028648f, +0.001501f, +0.007684f, +0.012740f, +0.000669f, -0.018049f, +0.032011f, +0.003114f, +0.000431f, + +0.016128f, -0.011163f, +0.010391f, -0.012063f, -0.004066f, +0.003561f, +0.007847f, +0.001472f, +0.004818f, +0.010759f, + -0.008208f, -0.003964f, -0.004932f, -0.007207f, -0.002115f, -0.000590f, -0.006601f, +0.005078f, +0.002037f, +0.008785f, + +0.002114f, -0.000016f, -0.001943f, +0.004624f, +0.005811f, +0.004079f, +0.001258f, -0.002525f, +0.000660f, -0.000269f, + -0.010913f, +0.000940f, -0.001486f, -0.004903f, +0.000800f, +0.000633f, -0.001659f, -0.000816f, +0.003209f, +0.002861f, + -0.000142f, +0.002292f, +0.001737f, -0.004679f, -0.000571f, +0.000313f, -0.001025f, -0.003078f, +0.001433f, +0.000423f, + +0.001432f, -0.003032f, +0.001142f, +0.002353f, -0.001483f, -0.000903f + }, + { + +0.053074f, +0.189622f, -0.024697f, +0.111632f, +0.029453f, -0.018744f, +0.014672f, +0.014218f, +0.040873f, -0.019197f, + +0.021791f, -0.005851f, -0.003741f, +0.026045f, +0.024829f, -0.005418f, +0.018034f, +0.004471f, -0.007413f, +0.008643f, + +0.012506f, +0.003728f, -0.015850f, -0.008618f, +0.024895f, +0.004902f, -0.006409f, +0.001318f, +0.002213f, -0.003110f, + +0.012923f, +0.006909f, -0.003335f, +0.009425f, -0.001440f, +0.001159f, -0.005889f, +0.007378f, -0.000523f, -0.021536f, + -0.017983f, +0.002633f, +0.008151f, -0.002012f, -0.013760f, -0.001432f, -0.005355f, -0.007255f, -0.003394f, -0.020315f, + -0.010425f, -0.007314f, +0.005234f, -0.015063f, -0.006358f, +0.000156f, +0.001042f, +0.005054f, +0.004231f, -0.001558f, + +0.001775f, -0.000716f, +0.004690f, -0.008669f, -0.010151f, +0.000196f, -0.007174f, -0.003001f, -0.000824f, -0.005789f, + +0.005038f, +0.000698f, +0.000900f, -0.006974f, -0.004409f, -0.000040f, +0.000081f, -0.003323f, +0.002198f, +0.005902f, + +0.007771f, -0.001864f, -0.000852f, +0.007711f, -0.004570f, +0.001275f, -0.001213f, -0.002867f, -0.000617f, -0.001870f, + +0.000790f, +0.001413f, +0.001615f, -0.001907f, -0.000269f, +0.002242f + }, + { + -0.001137f, -0.099824f, -0.044545f, -0.010512f, +0.006063f, -0.031526f, -0.018155f, -0.004203f, +0.020402f, +0.020526f, + -0.004609f, +0.045650f, +0.021964f, +0.023392f, -0.019060f, -0.011706f, -0.015276f, +0.010325f, +0.010007f, -0.014201f, + +0.038286f, -0.004148f, +0.009348f, -0.019135f, +0.026319f, -0.004240f, -0.002847f, +0.003387f, +0.014810f, +0.008577f, + -0.023661f, +0.006323f, +0.031013f, -0.021568f, -0.009168f, +0.008960f, -0.033174f, -0.004338f, +0.002389f, -0.012430f, + +0.003069f, +0.002908f, -0.002982f, +0.007297f, +0.009036f, -0.001881f, -0.002377f, -0.001144f, +0.017521f, -0.008717f, + -0.012611f, -0.011114f, -0.008160f, +0.019335f, -0.008494f, +0.003958f, -0.001101f, -0.001063f, -0.003288f, -0.002344f, + +0.000535f, -0.002982f, -0.001624f, +0.005578f, -0.004525f, +0.003869f, -0.004490f, +0.000945f, -0.002656f, +0.003901f, + +0.001469f, -0.000611f, -0.002764f, +0.003819f, -0.006160f, -0.002378f, +0.004234f, +0.001589f, +0.001169f, +0.003663f, + +0.000057f, -0.001121f, +0.000517f, +0.000750f, -0.004410f, -0.002570f, -0.000453f, -0.001619f, -0.004876f, -0.005079f, + +0.001008f, -0.001107f, -0.000926f, -0.002615f, +0.001488f, +0.001142f + }, + { + +0.003785f, -0.268941f, +0.071919f, -0.003534f, -0.031390f, +0.017005f, -0.029529f, +0.015174f, +0.003677f, +0.004524f, + -0.005775f, +0.021483f, -0.016447f, -0.013211f, -0.002575f, -0.011706f, +0.017230f, +0.051855f, -0.009994f, +0.002046f, + +0.005691f, +0.015400f, -0.008276f, -0.002544f, -0.020179f, +0.009183f, -0.007631f, -0.011494f, -0.019839f, +0.009634f, + +0.016091f, -0.019157f, +0.007013f, -0.011015f, -0.003861f, +0.011866f, +0.003464f, -0.010891f, +0.009200f, +0.011568f, + +0.000801f, -0.001010f, +0.004839f, +0.008103f, -0.005502f, -0.004147f, +0.000131f, -0.008727f, -0.000764f, -0.002527f, + -0.003789f, -0.007188f, -0.000654f, -0.006311f, +0.008015f, -0.003095f, -0.005502f, -0.008193f, -0.000519f, +0.004147f, + -0.008712f, -0.006343f, +0.002933f, -0.000096f, +0.001587f, +0.005629f, +0.003721f, -0.006824f, +0.003243f, +0.001318f, + +0.003653f, -0.003744f, +0.005923f, -0.004794f, +0.001572f, +0.001653f, -0.004344f, -0.001458f, -0.000036f, +0.004032f, + +0.000323f, +0.000006f, -0.000839f, -0.000174f, +0.001541f, -0.002543f, +0.000278f, -0.002282f, -0.002436f, +0.002490f, + +0.000102f, -0.003720f, +0.002337f, -0.000780f, +0.001072f, -0.001665f + }, + { + +0.004158f, -0.053501f, -0.006180f, +0.003805f, +0.025596f, +0.005108f, -0.008599f, -0.000102f, +0.002643f, -0.009560f, + +0.001210f, -0.016397f, -0.014623f, -0.037114f, +0.032186f, -0.014769f, +0.004518f, +0.006018f, -0.048936f, -0.013185f, + +0.020872f, -0.008382f, -0.025631f, +0.008610f, -0.001206f, -0.002575f, +0.044871f, -0.010625f, -0.004833f, +0.013443f, + -0.019086f, +0.002857f, -0.012629f, +0.023380f, -0.001997f, -0.017023f, -0.003529f, -0.019418f, -0.026486f, +0.000329f, + +0.023962f, +0.001513f, -0.007335f, -0.011539f, +0.000135f, -0.006759f, -0.014222f, +0.009647f, -0.003878f, +0.003627f, + -0.000786f, -0.001354f, +0.002939f, -0.005156f, +0.001110f, -0.001620f, +0.003126f, +0.016275f, +0.010947f, +0.004828f, + -0.010279f, +0.006654f, -0.003071f, +0.010656f, -0.004425f, -0.000519f, +0.006462f, -0.003004f, -0.001890f, +0.002079f, + -0.001648f, -0.004681f, -0.003587f, -0.001358f, +0.004094f, +0.002146f, -0.004903f, -0.001714f, +0.000880f, -0.001942f, + -0.001586f, +0.000003f, -0.000969f, +0.001072f, -0.005385f, +0.002132f, -0.000839f, +0.002580f, -0.001353f, +0.003252f, + +0.001053f, -0.002358f, +0.000062f, +0.000111f, +0.001671f, +0.000967f + }, + { + +0.023543f, -0.167861f, -0.009686f, +0.049400f, -0.038171f, -0.032696f, +0.010360f, +0.005174f, +0.021793f, +0.015491f, + -0.046722f, +0.013097f, -0.001378f, +0.023008f, -0.010717f, +0.001073f, +0.033889f, -0.017019f, +0.002626f, -0.000819f, + -0.032624f, -0.002436f, -0.006123f, +0.016984f, +0.003421f, -0.011581f, -0.018236f, -0.010902f, -0.033054f, +0.006900f, + +0.005518f, -0.018129f, -0.000585f, +0.012861f, +0.013582f, +0.001467f, +0.002702f, +0.003406f, -0.015269f, -0.003607f, + +0.002252f, +0.018198f, +0.009456f, -0.000068f, +0.000822f, +0.004981f, +0.008402f, +0.004333f, -0.004412f, -0.000716f, + -0.016780f, -0.005931f, -0.004192f, -0.014901f, -0.009831f, -0.011978f, -0.013050f, +0.004146f, +0.000789f, +0.006551f, + +0.000118f, +0.006394f, +0.004131f, -0.001819f, -0.000957f, +0.007536f, +0.001043f, -0.000896f, -0.005813f, -0.001322f, + -0.003511f, +0.004017f, -0.001824f, -0.007961f, +0.001741f, +0.000404f, +0.002488f, +0.000360f, -0.000836f, +0.002376f, + +0.004063f, +0.002969f, +0.005324f, -0.001740f, -0.004305f, -0.002621f, +0.005113f, -0.000674f, -0.005429f, +0.000580f, + +0.003917f, +0.000244f, +0.000394f, -0.004730f, -0.002000f, -0.003065f + }, + { + -0.007576f, +0.099986f, +0.000007f, -0.004563f, +0.006112f, +0.015693f, -0.011359f, +0.004712f, -0.007614f, +0.011684f, + -0.010972f, -0.007455f, +0.020204f, -0.065201f, +0.024860f, -0.020987f, -0.009823f, +0.011923f, -0.014491f, -0.016589f, + -0.018911f, -0.004432f, +0.015927f, -0.013225f, -0.027560f, +0.012444f, -0.018126f, +0.023792f, -0.036041f, +0.004314f, + +0.013604f, +0.017956f, +0.012879f, +0.012950f, -0.012888f, +0.022657f, +0.011532f, +0.003229f, +0.000789f, -0.023355f, + +0.003540f, +0.001934f, -0.012077f, +0.007231f, +0.008290f, +0.002668f, +0.002765f, +0.005167f, -0.004410f, +0.007856f, + -0.003060f, -0.016837f, +0.015325f, -0.000107f, +0.002177f, +0.010236f, -0.007087f, +0.001121f, +0.000179f, +0.001254f, + -0.002753f, -0.002585f, +0.005763f, +0.008602f, -0.000489f, +0.007892f, +0.003519f, +0.007746f, +0.005074f, +0.003127f, + -0.003506f, +0.008470f, +0.001144f, -0.002965f, -0.005542f, +0.000073f, +0.002461f, -0.000487f, -0.003968f, -0.001539f, + -0.002040f, +0.001783f, +0.001229f, +0.000008f, -0.000991f, +0.001105f, +0.006530f, +0.000924f, -0.002492f, +0.005141f, + -0.003943f, +0.000609f, +0.000195f, +0.002006f, +0.003583f, -0.002047f + }, + { + +0.039316f, -0.059393f, +0.050304f, -0.033522f, -0.017303f, -0.010308f, +0.019376f, +0.010417f, +0.008931f, -0.018882f, + +0.033526f, -0.026061f, -0.011636f, +0.052070f, +0.006657f, -0.019030f, +0.018762f, -0.028731f, -0.002474f, -0.008954f, + -0.026679f, +0.027642f, +0.015240f, +0.011167f, -0.018491f, +0.009103f, -0.014154f, -0.024259f, -0.018792f, +0.015669f, + -0.013568f, -0.006584f, +0.002720f, +0.019021f, -0.014543f, -0.002815f, +0.004735f, +0.020223f, +0.005775f, -0.014971f, + -0.010253f, -0.012136f, +0.000942f, +0.011500f, -0.015984f, -0.010869f, -0.012983f, -0.014812f, -0.010519f, -0.000605f, + +0.008309f, +0.000736f, -0.006767f, +0.006027f, +0.008207f, -0.008384f, -0.010688f, +0.000143f, -0.001263f, -0.007408f, + +0.002555f, -0.000593f, +0.007293f, +0.001166f, +0.006993f, -0.000497f, -0.006335f, +0.005483f, +0.000180f, +0.002444f, + -0.006991f, -0.003994f, -0.000367f, +0.000372f, -0.000620f, -0.003263f, -0.005090f, +0.003771f, -0.002665f, -0.000273f, + +0.003998f, -0.000205f, -0.001457f, -0.000206f, +0.000697f, -0.000049f, +0.002220f, +0.000032f, -0.001602f, +0.001749f, + +0.004489f, +0.000073f, +0.003051f, -0.001832f, +0.004095f, -0.000597f + } + }, + { + { + +0.000260f, -0.077718f, -0.047276f, +0.048477f, -0.030764f, -0.001722f, -0.013081f, +0.006441f, +0.000174f, -0.000879f, + -0.013683f, -0.010457f, -0.009772f, -0.028218f, -0.014908f, -0.011470f, -0.034677f, +0.004911f, +0.021658f, -0.010013f, + +0.026713f, +0.011533f, -0.006319f, +0.005466f, -0.008616f, +0.011952f, -0.029644f, +0.012374f, -0.009090f, +0.002045f, + +0.009310f, +0.006761f, +0.017889f, -0.009807f, -0.002479f, -0.001756f, -0.011703f, -0.005881f, +0.010816f, -0.000669f, + -0.007950f, +0.005130f, +0.003183f, +0.001992f, -0.004641f, -0.002369f, +0.017330f, -0.004135f, -0.014632f, -0.001971f, + +0.006074f, +0.012974f, -0.005049f, +0.018882f, +0.007760f, -0.003909f, -0.003607f, +0.001650f, -0.007394f, +0.005329f, + +0.000168f, +0.008277f, +0.007269f, +0.002213f, +0.004594f, -0.000963f, -0.003205f, -0.001378f, +0.005281f, +0.009657f, + +0.004384f, +0.005766f, -0.005862f, +0.009162f, +0.000510f, +0.005815f, -0.000797f, +0.004080f, -0.000364f, +0.004267f, + -0.000524f, +0.000785f, +0.002674f, +0.001841f, -0.001950f, +0.000770f, +0.002643f, -0.000054f, -0.000042f, -0.000929f, + +0.001866f, +0.001740f, +0.000705f, -0.003209f, -0.001763f, +0.000228f + }, + { + +0.011217f, +0.551291f, +0.055243f, +0.124283f, -0.023879f, -0.014312f, -0.015743f, -0.011599f, -0.008870f, -0.030515f, + -0.011070f, +0.003419f, +0.012830f, -0.019361f, -0.017748f, -0.001262f, +0.005189f, +0.008393f, +0.019173f, +0.008962f, + +0.003451f, -0.005992f, +0.010001f, +0.014384f, +0.004806f, -0.008210f, -0.004191f, -0.005827f, +0.008771f, -0.006312f, + -0.000160f, +0.004339f, -0.018022f, +0.001641f, +0.006791f, -0.009984f, -0.000866f, -0.000468f, -0.000289f, -0.002907f, + +0.007103f, -0.005069f, +0.012170f, -0.005652f, -0.003347f, -0.017551f, -0.001777f, +0.004177f, +0.002387f, -0.005238f, + -0.006342f, -0.002793f, +0.005588f, -0.005994f, +0.005725f, +0.006355f, -0.015213f, -0.001617f, -0.000512f, +0.006706f, + +0.004934f, -0.003617f, +0.007101f, +0.010156f, +0.002610f, -0.003476f, +0.004367f, +0.001083f, +0.005722f, +0.004772f, + -0.003753f, -0.001876f, +0.001962f, +0.001914f, -0.000104f, +0.001447f, +0.001532f, +0.001249f, -0.002114f, -0.000872f, + +0.004022f, -0.003517f, -0.003299f, +0.000821f, -0.001216f, +0.000281f, +0.001806f, -0.001455f, +0.002668f, +0.001121f, + +0.001482f, +0.002398f, +0.001541f, -0.001448f, +0.001832f, -0.001510f + }, + { + -0.013753f, -0.085934f, +0.057205f, -0.083064f, +0.031432f, +0.001232f, +0.010334f, -0.010200f, +0.006922f, -0.014453f, + -0.018279f, +0.010655f, -0.011844f, -0.013728f, +0.007725f, +0.023156f, -0.019422f, +0.019339f, -0.012792f, +0.003301f, + -0.019164f, -0.009854f, -0.008755f, -0.001242f, +0.000545f, +0.004969f, -0.009041f, +0.001852f, +0.006212f, -0.030799f, + +0.014631f, +0.018064f, +0.003081f, -0.019333f, +0.007795f, -0.006888f, +0.025735f, +0.014769f, +0.009696f, -0.002046f, + -0.011554f, +0.007548f, +0.008215f, -0.000405f, +0.006284f, -0.003425f, -0.009104f, +0.000827f, -0.000489f, +0.002262f, + +0.018838f, -0.009308f, -0.001983f, +0.000104f, +0.006676f, +0.007716f, +0.001363f, +0.000800f, -0.000429f, +0.006227f, + +0.000806f, -0.007144f, -0.001305f, -0.000241f, +0.000197f, +0.000847f, +0.001632f, -0.004362f, -0.005313f, -0.006462f, + +0.002476f, +0.000206f, -0.000741f, +0.008291f, +0.002703f, +0.006802f, +0.002337f, -0.004994f, -0.003368f, -0.005635f, + +0.000028f, -0.000812f, +0.004372f, -0.000365f, -0.000313f, +0.001322f, +0.000310f, -0.001346f, +0.003542f, +0.000565f, + +0.000604f, -0.003689f, -0.000156f, -0.000085f, +0.003218f, +0.002480f + }, + { + -0.004796f, +0.021413f, +0.016122f, +0.001551f, +0.000250f, -0.002132f, +0.006051f, -0.004171f, -0.000924f, +0.005458f, + -0.009985f, +0.007992f, -0.000800f, +0.001133f, -0.034431f, -0.017123f, +0.025240f, +0.015777f, -0.008308f, +0.006765f, + +0.020043f, -0.002726f, -0.006936f, -0.004263f, +0.017370f, +0.031948f, +0.013418f, +0.000930f, +0.001052f, -0.020183f, + -0.001884f, -0.005293f, +0.018245f, +0.001440f, +0.003799f, +0.002273f, +0.030777f, +0.005024f, +0.011705f, -0.001884f, + +0.012002f, -0.004928f, -0.017337f, -0.007049f, +0.004490f, +0.010633f, +0.000612f, -0.005879f, +0.005826f, -0.006861f, + +0.004005f, -0.003103f, +0.001924f, -0.003090f, -0.005451f, +0.000175f, -0.010508f, -0.006703f, +0.006658f, +0.005134f, + +0.003476f, +0.002491f, +0.003276f, +0.001386f, +0.002855f, +0.005240f, +0.002488f, -0.008110f, -0.001835f, -0.000556f, + -0.001704f, +0.003876f, -0.001753f, -0.001216f, -0.000872f, +0.003751f, -0.001684f, +0.000678f, -0.000494f, -0.003120f, + -0.000407f, -0.001854f, +0.001863f, +0.003106f, +0.001085f, -0.003025f, +0.000854f, +0.003584f, -0.000336f, +0.000499f, + +0.002824f, -0.001014f, -0.001031f, -0.000126f, -0.000220f, -0.001140f + }, + { + -0.048227f, -0.130418f, -0.006290f, +0.068483f, -0.013329f, -0.004415f, -0.008694f, +0.001273f, -0.017353f, -0.018791f, + -0.004718f, +0.030401f, +0.024409f, -0.021079f, -0.000044f, -0.005936f, +0.004044f, -0.027421f, -0.020522f, -0.028218f, + -0.005985f, -0.011832f, -0.021979f, +0.007177f, -0.015968f, +0.021500f, -0.013058f, +0.014872f, +0.019909f, +0.000376f, + -0.016542f, +0.005762f, -0.012074f, -0.006214f, +0.006100f, +0.002142f, -0.027297f, +0.020077f, -0.017816f, +0.005634f, + +0.004545f, +0.009913f, -0.007530f, -0.003815f, +0.000248f, -0.014155f, +0.003012f, -0.001970f, -0.000394f, +0.001564f, + -0.005324f, -0.006446f, +0.005189f, +0.000364f, +0.002826f, -0.000765f, -0.005010f, +0.001418f, +0.000677f, -0.001561f, + -0.019570f, +0.001531f, +0.002535f, +0.011668f, -0.007779f, +0.007047f, -0.008202f, +0.001903f, +0.000378f, -0.002330f, + -0.005424f, +0.003225f, +0.004390f, -0.000546f, -0.000426f, -0.000477f, +0.005097f, +0.000544f, +0.001639f, -0.004015f, + -0.001802f, +0.000146f, +0.005722f, -0.007052f, +0.000923f, +0.002653f, +0.000607f, -0.005122f, -0.003204f, +0.002271f, + -0.000829f, -0.001960f, +0.002966f, +0.001481f, -0.001893f, +0.001609f + }, + { + +0.002651f, -0.015268f, +0.016786f, +0.003749f, -0.001455f, +0.000513f, +0.000658f, +0.000068f, +0.003639f, -0.009598f, + -0.012943f, -0.007599f, +0.009876f, -0.008261f, +0.006137f, -0.013079f, +0.008626f, +0.016504f, +0.015540f, +0.014164f, + +0.013041f, -0.006444f, -0.001722f, +0.013762f, -0.022353f, -0.012448f, +0.014953f, -0.023544f, +0.008734f, +0.003025f, + +0.018528f, +0.015629f, -0.019144f, -0.003214f, -0.007424f, +0.002119f, -0.011734f, -0.011643f, +0.003756f, -0.006904f, + -0.012964f, +0.007569f, +0.015002f, +0.018458f, +0.005889f, +0.008399f, -0.009992f, +0.002172f, -0.012391f, -0.000997f, + +0.010586f, +0.002072f, +0.003639f, -0.004826f, -0.004348f, -0.001265f, +0.006604f, +0.001559f, +0.005966f, -0.002554f, + +0.002509f, -0.002513f, -0.001250f, -0.005516f, +0.004869f, -0.000798f, -0.002297f, -0.007648f, +0.009117f, +0.000766f, + -0.003287f, +0.004861f, -0.001223f, +0.001924f, +0.002881f, -0.000637f, +0.005224f, -0.000062f, +0.004681f, -0.001990f, + -0.001470f, +0.000493f, -0.004534f, -0.000145f, +0.000252f, +0.001131f, +0.000983f, -0.000328f, +0.002110f, -0.000700f, + -0.002992f, -0.000184f, +0.003014f, +0.000112f, +0.000806f, -0.001145f + }, + { + -0.074655f, -0.260866f, -0.020177f, +0.079553f, +0.009044f, -0.002662f, -0.006705f, +0.020983f, +0.028349f, -0.011190f, + +0.052574f, +0.002309f, +0.011813f, +0.011108f, +0.003872f, +0.000409f, -0.003165f, -0.015006f, -0.004149f, -0.003211f, + +0.008666f, -0.012887f, +0.014433f, +0.004795f, +0.028881f, +0.005765f, +0.002382f, +0.000010f, +0.017764f, -0.001883f, + +0.006954f, +0.004548f, +0.012381f, -0.001083f, +0.013245f, +0.006242f, -0.002452f, -0.002460f, -0.002542f, -0.002980f, + +0.003564f, -0.002553f, +0.002855f, +0.007775f, +0.010419f, -0.006542f, +0.005908f, -0.018739f, -0.011169f, -0.002852f, + +0.002250f, -0.006356f, -0.000718f, -0.010890f, -0.002520f, +0.000733f, +0.002314f, -0.007310f, +0.002029f, +0.000366f, + -0.003188f, +0.012467f, -0.006198f, +0.007532f, +0.000765f, +0.008606f, -0.005298f, +0.000813f, -0.000820f, +0.000472f, + -0.001713f, -0.001324f, +0.001196f, +0.000034f, -0.000333f, -0.000622f, -0.000561f, -0.002107f, -0.002593f, +0.002773f, + -0.000407f, -0.004185f, +0.000690f, +0.002888f, -0.001870f, -0.002491f, -0.000103f, +0.000584f, -0.001213f, +0.004197f, + +0.000635f, +0.000559f, -0.001624f, +0.001135f, +0.001656f, +0.002200f + }, + { + +0.003722f, -0.029396f, -0.000871f, -0.001915f, -0.003914f, +0.002519f, -0.003972f, +0.003738f, -0.006709f, -0.002369f, + -0.004036f, -0.002731f, +0.008185f, -0.006947f, -0.033922f, -0.018382f, +0.015852f, -0.015200f, -0.037948f, +0.002024f, + -0.020094f, -0.025562f, +0.021195f, +0.008634f, +0.009011f, -0.017627f, -0.009572f, -0.013195f, -0.006790f, -0.012989f, + -0.013489f, +0.016878f, -0.015262f, +0.001377f, +0.001605f, +0.008489f, -0.021397f, +0.008480f, -0.016231f, +0.000464f, + +0.024540f, -0.015182f, +0.011854f, -0.008066f, -0.002499f, +0.001079f, +0.011703f, +0.010977f, -0.004935f, +0.010799f, + +0.005753f, +0.006315f, +0.001693f, -0.004688f, +0.001954f, +0.000176f, -0.004342f, +0.010228f, -0.009301f, -0.006547f, + -0.000232f, +0.008054f, -0.000317f, +0.001115f, +0.008322f, +0.005317f, +0.003030f, -0.005190f, -0.004418f, +0.001871f, + -0.006070f, +0.005474f, +0.005665f, -0.002183f, +0.002946f, +0.000213f, -0.002564f, -0.002280f, +0.001014f, +0.000996f, + -0.001873f, -0.001575f, +0.001165f, -0.001686f, +0.001830f, +0.003582f, -0.000937f, -0.004739f, +0.000425f, +0.001063f, + -0.001030f, -0.002727f, +0.001859f, -0.000174f, -0.004235f, -0.002589f + }, + { + -0.094860f, +0.063786f, +0.043413f, +0.123446f, +0.035331f, -0.009268f, +0.031508f, -0.015153f, -0.002359f, +0.000831f, + +0.027470f, -0.014172f, -0.013225f, -0.003864f, +0.001461f, -0.011511f, +0.003468f, -0.017054f, +0.001613f, +0.009176f, + +0.014900f, +0.018972f, -0.007742f, -0.008069f, +0.016606f, +0.007680f, -0.006503f, -0.005543f, +0.000143f, +0.005012f, + +0.021596f, +0.001911f, -0.018809f, +0.008827f, +0.018485f, +0.021758f, -0.012561f, -0.013347f, +0.011539f, -0.006542f, + -0.010466f, +0.018460f, +0.012976f, -0.007565f, -0.011215f, +0.000329f, +0.002472f, +0.001714f, -0.000259f, -0.014072f, + -0.001527f, -0.006012f, +0.004227f, -0.013520f, -0.002488f, -0.002595f, -0.009917f, -0.000587f, +0.000625f, +0.002308f, + +0.006751f, -0.002477f, +0.003036f, -0.001991f, -0.003449f, +0.004326f, -0.004977f, -0.001155f, +0.000833f, -0.005090f, + +0.003882f, -0.000306f, +0.002610f, -0.000712f, +0.000959f, +0.002817f, +0.004324f, -0.002281f, +0.001178f, +0.005276f, + +0.005504f, -0.003308f, -0.000443f, +0.001711f, -0.006410f, -0.001249f, -0.004041f, -0.000625f, +0.003420f, -0.000416f, + -0.001472f, -0.001235f, -0.000583f, -0.000131f, +0.000291f, +0.000309f + }, + { + -0.002590f, -0.097412f, -0.024113f, -0.001004f, +0.002037f, -0.025853f, -0.007369f, -0.006779f, +0.010437f, +0.005083f, + -0.027059f, +0.019110f, +0.008439f, +0.023431f, -0.021645f, -0.009476f, -0.018902f, +0.004596f, +0.009100f, -0.041556f, + +0.000224f, -0.012842f, +0.023545f, -0.005227f, +0.008782f, -0.007196f, +0.008725f, +0.011963f, +0.012291f, -0.003152f, + -0.014818f, +0.001500f, +0.016973f, -0.007029f, +0.002562f, +0.017557f, -0.018764f, +0.001982f, +0.000118f, -0.012236f, + +0.010159f, +0.005980f, -0.002643f, +0.009764f, -0.003919f, -0.010023f, -0.002881f, +0.007242f, +0.025473f, -0.002189f, + -0.003320f, +0.006445f, +0.004621f, +0.013823f, -0.016658f, +0.006254f, -0.003326f, -0.002045f, +0.002035f, +0.005047f, + +0.006048f, -0.003220f, -0.007609f, +0.010116f, -0.005238f, +0.000722f, +0.001158f, +0.003827f, -0.004010f, -0.001292f, + -0.002345f, +0.000302f, -0.006226f, +0.002625f, -0.002421f, -0.003652f, +0.002209f, -0.001563f, +0.000528f, +0.002603f, + +0.003098f, +0.000604f, -0.000428f, -0.000120f, -0.002665f, +0.001893f, -0.000607f, -0.002961f, -0.003718f, -0.003545f, + +0.000087f, -0.000672f, -0.001202f, -0.003049f, +0.001296f, -0.000088f + }, + { + +0.003907f, -0.319354f, +0.009422f, -0.008483f, -0.007520f, +0.049822f, -0.060413f, +0.002330f, +0.011275f, -0.011170f, + -0.014644f, +0.013502f, -0.019363f, +0.001389f, -0.003410f, -0.015411f, +0.005839f, +0.051284f, -0.010534f, +0.005244f, + -0.002478f, +0.011675f, +0.007644f, -0.004726f, -0.027722f, +0.012847f, +0.000159f, -0.008953f, -0.032454f, -0.012588f, + +0.008170f, -0.009519f, +0.004517f, -0.010367f, +0.017089f, +0.020057f, +0.000073f, -0.011691f, -0.006250f, +0.007726f, + +0.008331f, -0.006025f, +0.007879f, +0.005008f, -0.018875f, -0.007486f, -0.000091f, -0.004859f, +0.001360f, -0.011100f, + -0.005991f, -0.003920f, -0.001677f, -0.003791f, +0.010469f, -0.003422f, -0.007415f, +0.000703f, +0.001582f, +0.004705f, + -0.001605f, +0.002884f, +0.007135f, -0.000257f, +0.000525f, +0.004844f, +0.006091f, -0.004501f, +0.004257f, -0.000120f, + +0.000366f, -0.002782f, +0.010114f, -0.002859f, +0.002896f, +0.002483f, -0.001159f, +0.001352f, +0.000093f, +0.005953f, + +0.002078f, +0.000880f, -0.000430f, +0.001674f, +0.001371f, -0.000370f, +0.004093f, -0.000094f, -0.003230f, +0.000494f, + +0.000790f, -0.002876f, +0.001395f, -0.005016f, +0.001325f, +0.000148f + }, + { + -0.006293f, -0.044488f, +0.009727f, -0.001799f, +0.008008f, -0.004428f, +0.000265f, -0.001407f, +0.004078f, +0.000395f, + +0.016967f, -0.005538f, -0.012946f, -0.002017f, +0.052217f, -0.003707f, +0.021236f, +0.020253f, -0.022691f, -0.021211f, + +0.002227f, +0.022602f, +0.020372f, +0.019378f, +0.003267f, -0.025733f, +0.019089f, -0.002910f, -0.007256f, +0.006945f, + +0.001245f, +0.023586f, -0.010772f, +0.020014f, -0.007489f, -0.020756f, +0.015403f, +0.005778f, -0.014592f, -0.000399f, + +0.012724f, -0.010871f, -0.009149f, +0.001724f, +0.008262f, -0.000931f, -0.011064f, +0.009302f, -0.000218f, +0.007782f, + -0.003058f, -0.006376f, -0.002226f, -0.009284f, +0.001257f, -0.002944f, +0.004400f, +0.003520f, -0.002943f, +0.005302f, + -0.001205f, +0.012541f, +0.001854f, +0.005549f, -0.012193f, -0.004753f, +0.003129f, -0.004953f, -0.000668f, +0.001687f, + -0.003178f, -0.000521f, +0.005231f, +0.003017f, +0.001070f, -0.000663f, -0.001855f, -0.001463f, +0.001797f, -0.000295f, + -0.001873f, -0.002645f, -0.005646f, +0.001008f, -0.003897f, -0.000709f, -0.003974f, +0.001709f, -0.004362f, -0.001984f, + -0.001091f, -0.001664f, +0.000821f, +0.000802f, +0.003281f, +0.002238f + }, + { + +0.012152f, -0.203078f, -0.031865f, +0.027970f, -0.062166f, -0.048458f, -0.000394f, -0.008108f, -0.007677f, +0.011983f, + -0.018868f, -0.002203f, -0.001730f, +0.023475f, -0.014149f, +0.012554f, +0.035538f, +0.013090f, +0.024623f, +0.004355f, + -0.012954f, +0.009128f, +0.007650f, -0.001348f, -0.014473f, +0.004485f, +0.001233f, +0.023168f, -0.006489f, +0.011557f, + +0.014949f, -0.001737f, -0.001890f, +0.014304f, +0.007389f, -0.006959f, +0.009988f, +0.007009f, -0.009130f, +0.003435f, + -0.000692f, +0.007283f, -0.001448f, -0.007679f, -0.000093f, -0.007017f, +0.005768f, +0.013017f, +0.000120f, +0.004752f, + -0.009130f, -0.006766f, -0.006661f, -0.003549f, +0.006109f, -0.003475f, -0.013700f, +0.001440f, +0.002213f, +0.010005f, + +0.003046f, +0.006929f, +0.005909f, +0.006982f, +0.001624f, -0.002794f, -0.010512f, -0.000756f, -0.004888f, -0.002831f, + -0.002822f, +0.000287f, -0.000604f, -0.000789f, +0.004302f, -0.002724f, -0.003599f, -0.000190f, +0.001610f, -0.000703f, + +0.002781f, -0.000283f, +0.001308f, -0.001339f, -0.000790f, -0.002846f, +0.002537f, +0.000151f, +0.000353f, +0.000190f, + +0.002481f, +0.000704f, +0.001183f, -0.003902f, +0.000538f, +0.003258f + }, + { + +0.007618f, +0.084600f, -0.030316f, -0.010579f, +0.004988f, +0.003958f, -0.019354f, +0.011157f, -0.000771f, +0.016939f, + +0.002864f, -0.002671f, +0.006820f, +0.011982f, +0.150269f, -0.034845f, -0.010668f, +0.008734f, -0.027723f, +0.001622f, + -0.026058f, -0.010520f, +0.035223f, +0.000737f, -0.011992f, +0.033130f, -0.007011f, +0.015755f, -0.032104f, -0.007012f, + -0.015815f, -0.015875f, -0.000752f, +0.009569f, -0.010632f, +0.018867f, -0.005992f, -0.011776f, +0.006183f, -0.021000f, + +0.004317f, +0.008845f, -0.005478f, +0.008564f, +0.001929f, +0.005789f, +0.010049f, -0.010741f, -0.009474f, -0.001887f, + -0.002964f, -0.006656f, +0.011091f, +0.003890f, +0.007808f, +0.010233f, -0.010294f, +0.003491f, +0.002482f, -0.000261f, + -0.001413f, -0.001435f, +0.002704f, -0.000434f, -0.005275f, +0.002577f, -0.001937f, +0.008055f, +0.003244f, +0.004148f, + -0.004521f, +0.001949f, -0.001640f, +0.003525f, +0.001889f, +0.000156f, -0.001798f, -0.001498f, +0.000285f, +0.002705f, + -0.000675f, -0.001677f, -0.000332f, +0.000836f, -0.002194f, -0.000148f, +0.002765f, -0.002596f, -0.005582f, +0.004012f, + -0.000697f, +0.002220f, -0.003405f, -0.001119f, +0.003297f, -0.001739f + }, + { + -0.023947f, -0.193677f, -0.013113f, -0.039710f, -0.006410f, -0.009431f, +0.022247f, +0.022748f, +0.027241f, -0.037135f, + +0.019020f, +0.020544f, +0.014426f, -0.040227f, -0.105046f, +0.000157f, +0.051065f, -0.003654f, +0.051023f, -0.000462f, + -0.036403f, +0.024870f, +0.027680f, +0.020675f, -0.021980f, -0.011100f, -0.017072f, +0.014432f, +0.003640f, +0.026619f, + -0.003882f, -0.008177f, +0.000067f, +0.032289f, +0.007464f, +0.008727f, +0.000737f, +0.008949f, +0.020763f, +0.003278f, + -0.006829f, -0.013735f, -0.007526f, +0.020338f, -0.005805f, +0.001739f, +0.008820f, +0.001674f, +0.002064f, +0.010927f, + +0.010661f, +0.004283f, +0.001290f, +0.000112f, +0.004493f, -0.007087f, -0.011340f, -0.008603f, -0.002895f, -0.002044f, + -0.000634f, -0.008651f, -0.000328f, -0.002833f, +0.001586f, -0.007018f, -0.004816f, -0.001465f, -0.007595f, +0.002447f, + -0.003282f, -0.006583f, -0.001162f, +0.002590f, +0.003545f, +0.001738f, -0.003235f, +0.003406f, +0.000005f, +0.000556f, + +0.003342f, +0.002176f, +0.002258f, +0.001153f, +0.002623f, +0.001015f, +0.002997f, +0.000301f, -0.003102f, -0.003182f, + +0.000206f, -0.001544f, +0.003005f, -0.000484f, +0.003212f, -0.001661f + } + }, + { + { + -0.000203f, -0.139800f, +0.002357f, +0.018682f, +0.000826f, -0.008412f, -0.004587f, +0.002304f, -0.005642f, +0.008867f, + -0.020724f, -0.032019f, +0.026152f, -0.014086f, -0.025398f, -0.028038f, -0.007870f, -0.005324f, +0.034094f, -0.001054f, + -0.009047f, +0.010007f, -0.002240f, +0.011038f, -0.005096f, +0.000352f, -0.003615f, -0.016477f, +0.006436f, +0.006252f, + +0.010935f, +0.006972f, +0.011056f, -0.009664f, -0.008208f, -0.003240f, +0.000062f, -0.011238f, +0.016498f, -0.007562f, + -0.004746f, -0.001001f, +0.003087f, +0.000194f, -0.006787f, +0.004944f, +0.019762f, -0.012465f, -0.007334f, -0.008819f, + +0.005253f, +0.005076f, -0.000615f, +0.019209f, +0.006285f, -0.000334f, +0.004199f, -0.009903f, -0.001369f, +0.001243f, + -0.001433f, +0.011882f, +0.005524f, +0.006805f, +0.001867f, +0.002794f, -0.002199f, -0.003124f, +0.000331f, +0.011709f, + +0.004962f, +0.004874f, +0.001059f, +0.002785f, +0.003942f, +0.003246f, -0.000205f, +0.001357f, +0.003034f, +0.002725f, + -0.000843f, +0.001253f, +0.002103f, -0.000687f, +0.001929f, -0.000464f, +0.003527f, -0.001450f, -0.001456f, -0.002844f, + +0.001707f, +0.002557f, +0.002394f, -0.003097f, -0.001888f, -0.000682f + }, + { + -0.017301f, +0.588153f, +0.055606f, +0.070844f, +0.014476f, -0.013777f, -0.027724f, -0.013629f, -0.016464f, -0.005166f, + -0.049686f, +0.016691f, +0.019986f, -0.028178f, -0.008048f, -0.005224f, +0.028453f, +0.013555f, +0.010254f, +0.010091f, + +0.005692f, -0.010117f, +0.000509f, +0.025760f, +0.006935f, -0.002659f, -0.022505f, +0.012981f, -0.013317f, +0.010373f, + -0.003207f, -0.014118f, +0.003453f, -0.017153f, +0.000979f, -0.002590f, +0.009605f, -0.004458f, +0.000374f, -0.003141f, + +0.004317f, +0.003748f, -0.010537f, +0.005313f, -0.011182f, +0.000624f, -0.006139f, -0.006465f, +0.007347f, -0.006346f, + -0.005763f, -0.001908f, +0.003722f, +0.000817f, -0.004167f, -0.002345f, -0.005435f, -0.003006f, +0.002640f, -0.000047f, + +0.008807f, -0.006485f, +0.007858f, +0.013777f, -0.000062f, -0.002030f, +0.005355f, -0.000272f, +0.006575f, +0.000828f, + -0.002255f, -0.001838f, +0.000552f, +0.003066f, +0.000832f, -0.001469f, +0.001739f, +0.000534f, -0.000368f, -0.000813f, + +0.002812f, +0.000830f, -0.007210f, +0.001132f, -0.000010f, +0.000005f, -0.001350f, +0.001566f, +0.001263f, +0.002033f, + +0.001225f, +0.000160f, +0.001947f, +0.000019f, +0.000051f, -0.000440f + }, + { + +0.013268f, +0.054696f, -0.074955f, -0.038944f, +0.007227f, +0.012014f, -0.014427f, -0.005184f, -0.007275f, +0.019718f, + -0.010226f, -0.010408f, -0.015801f, -0.007864f, +0.016049f, -0.000194f, -0.009297f, +0.034195f, -0.021976f, +0.006128f, + -0.006474f, -0.012273f, -0.023105f, +0.013412f, +0.006192f, -0.007290f, -0.002540f, +0.001863f, -0.008605f, -0.012856f, + +0.011080f, +0.006902f, -0.005725f, +0.003463f, -0.003287f, -0.008887f, +0.034334f, +0.016892f, +0.016464f, -0.010955f, + -0.009899f, +0.009799f, -0.000554f, -0.002353f, +0.011460f, -0.004112f, -0.018922f, +0.014598f, -0.000906f, +0.003989f, + +0.006356f, -0.004481f, +0.000713f, +0.002620f, -0.001646f, +0.010125f, +0.003674f, +0.002722f, -0.000510f, +0.000530f, + -0.000512f, -0.003559f, -0.000209f, +0.002507f, -0.002443f, +0.006748f, -0.001208f, -0.011437f, +0.000657f, -0.008184f, + +0.002563f, -0.002277f, +0.003147f, +0.006389f, +0.006364f, +0.002915f, -0.000871f, +0.001304f, -0.004056f, -0.005614f, + -0.000736f, +0.001665f, -0.001057f, +0.001059f, +0.000332f, -0.000711f, -0.000722f, +0.002774f, +0.000900f, -0.000890f, + -0.000560f, -0.002331f, +0.000144f, +0.001154f, +0.001863f, +0.001436f + }, + { + +0.003735f, +0.036371f, -0.004259f, +0.002013f, -0.001735f, +0.000949f, +0.003546f, -0.004430f, -0.004595f, +0.007687f, + -0.007972f, -0.001583f, +0.003065f, +0.003584f, +0.004833f, -0.035677f, +0.013075f, +0.013657f, +0.006279f, -0.026712f, + +0.030872f, +0.010084f, -0.019708f, +0.002319f, +0.003813f, +0.034410f, +0.021678f, -0.002205f, -0.000132f, +0.007285f, + -0.039832f, +0.029411f, -0.008584f, +0.015663f, +0.014417f, -0.003958f, +0.022689f, +0.000915f, +0.023177f, -0.001641f, + +0.010764f, -0.013273f, -0.001432f, -0.006316f, -0.005483f, +0.010589f, -0.005699f, -0.001440f, -0.005857f, +0.000769f, + +0.002651f, -0.003414f, +0.000440f, -0.006877f, +0.003409f, -0.007338f, -0.002711f, -0.010403f, +0.008017f, +0.005912f, + +0.000145f, +0.005867f, -0.000049f, +0.000237f, +0.003179f, +0.008171f, -0.000872f, -0.003637f, -0.006884f, +0.000722f, + +0.003045f, -0.003976f, -0.002291f, +0.001882f, +0.000348f, +0.000831f, -0.000400f, -0.000542f, +0.001553f, -0.003491f, + +0.002878f, -0.002080f, +0.000026f, +0.002720f, -0.000599f, -0.001458f, +0.000359f, +0.001319f, +0.001529f, -0.000098f, + +0.000929f, +0.000835f, +0.000351f, -0.001561f, -0.001606f, +0.001825f + }, + { + +0.053944f, -0.260097f, -0.037466f, +0.048352f, +0.022642f, -0.000634f, -0.011956f, -0.025621f, +0.012374f, -0.040070f, + +0.010817f, +0.042278f, +0.022260f, -0.005333f, -0.029035f, +0.016160f, -0.011470f, -0.036645f, +0.013267f, -0.030063f, + -0.001518f, -0.020724f, -0.009145f, +0.007456f, -0.017740f, +0.018566f, -0.002911f, +0.016748f, +0.012095f, -0.002005f, + -0.015131f, -0.005642f, -0.009489f, -0.002578f, +0.002170f, -0.005508f, +0.015575f, -0.023259f, +0.001605f, +0.008179f, + +0.009533f, +0.002317f, -0.006292f, -0.006873f, -0.007648f, -0.003053f, -0.005324f, -0.003823f, +0.013839f, -0.008310f, + -0.009486f, -0.002731f, +0.007204f, +0.001480f, -0.003292f, -0.007875f, +0.009689f, -0.005947f, -0.000044f, -0.006113f, + -0.008309f, +0.000142f, +0.002340f, +0.002420f, +0.001666f, -0.001186f, -0.002372f, -0.000488f, +0.001087f, -0.003070f, + -0.002806f, +0.001154f, +0.001259f, +0.001402f, -0.001290f, +0.001368f, +0.004544f, +0.000540f, +0.003612f, -0.007045f, + -0.001241f, +0.005230f, +0.000727f, -0.002220f, -0.001409f, +0.000490f, +0.002000f, -0.002729f, -0.002113f, -0.001203f, + +0.001383f, -0.001459f, +0.001312f, +0.002384f, +0.000316f, -0.000635f + }, + { + +0.000154f, +0.024230f, -0.003820f, -0.004378f, -0.000453f, +0.000798f, +0.002174f, +0.004617f, -0.001120f, -0.008753f, + -0.008907f, -0.011212f, +0.011607f, -0.009867f, -0.007242f, -0.006108f, +0.028167f, -0.015913f, +0.051038f, +0.000091f, + -0.005427f, -0.001155f, +0.010282f, +0.017640f, -0.042720f, -0.003562f, +0.023100f, -0.020851f, +0.011148f, -0.003538f, + +0.001187f, +0.024150f, -0.020888f, +0.010008f, -0.005520f, -0.008256f, -0.011455f, -0.010129f, -0.003390f, -0.002334f, + -0.001533f, +0.010071f, +0.003740f, +0.022345f, +0.003983f, +0.004642f, -0.006368f, -0.002674f, -0.017007f, +0.006935f, + +0.015781f, -0.003127f, +0.000966f, -0.011302f, +0.005474f, -0.005271f, +0.009561f, -0.001337f, +0.004750f, -0.000873f, + +0.002195f, +0.000404f, -0.002402f, -0.000425f, -0.000194f, +0.006289f, -0.004732f, -0.008523f, +0.002210f, +0.004565f, + -0.002688f, +0.002378f, +0.000020f, +0.002431f, +0.007067f, -0.001333f, +0.001553f, +0.002006f, +0.007575f, -0.004941f, + -0.002138f, +0.000801f, -0.000335f, -0.004353f, -0.000306f, +0.003235f, +0.001297f, -0.001062f, +0.001392f, +0.000963f, + -0.003023f, -0.000891f, +0.001787f, +0.003744f, -0.000156f, -0.001547f + }, + { + +0.063234f, -0.471319f, -0.026524f, +0.079025f, +0.010226f, +0.008015f, -0.009975f, +0.026044f, +0.007240f, +0.012160f, + +0.027952f, +0.005634f, -0.006821f, +0.015978f, +0.012233f, +0.012387f, -0.022174f, +0.008425f, +0.005190f, -0.035946f, + +0.030874f, -0.015861f, +0.003106f, +0.026648f, +0.032827f, -0.007984f, +0.002342f, +0.008870f, +0.010683f, +0.009068f, + +0.006283f, -0.004125f, +0.019335f, -0.000304f, +0.010264f, +0.002240f, +0.010656f, -0.007382f, -0.009582f, +0.006803f, + -0.005920f, +0.000940f, +0.001877f, +0.003871f, +0.013273f, +0.000889f, -0.011214f, -0.013523f, -0.004240f, -0.015475f, + -0.002161f, +0.004820f, -0.001351f, -0.013947f, +0.001373f, +0.008352f, -0.004356f, -0.010232f, -0.000103f, +0.003302f, + -0.001414f, +0.013492f, +0.000372f, -0.000727f, +0.007254f, +0.006605f, -0.003364f, -0.002697f, -0.000457f, -0.000569f, + -0.004562f, +0.001133f, +0.001454f, -0.001410f, +0.000525f, +0.002045f, -0.005139f, +0.000598f, -0.003501f, +0.003064f, + -0.000028f, -0.003753f, -0.000324f, +0.004231f, -0.004465f, -0.001093f, +0.000088f, +0.000901f, +0.000858f, +0.000929f, + +0.001130f, +0.000076f, -0.000963f, +0.000715f, +0.001572f, +0.001036f + }, + { + -0.001349f, +0.009490f, -0.022802f, +0.006382f, -0.004706f, -0.002312f, -0.001614f, -0.002325f, -0.000829f, +0.003028f, + -0.016100f, +0.009941f, -0.012263f, -0.013742f, -0.022537f, -0.026569f, +0.007709f, -0.002366f, -0.015489f, -0.003540f, + -0.025233f, -0.009211f, +0.032676f, +0.019508f, -0.018016f, +0.005767f, +0.001029f, -0.032331f, -0.028850f, +0.007381f, + +0.007203f, -0.014580f, -0.001863f, -0.002862f, +0.003794f, +0.016608f, -0.020957f, -0.023321f, +0.001428f, +0.006641f, + +0.001423f, -0.000316f, +0.013853f, -0.002885f, -0.003969f, +0.005961f, -0.007488f, +0.025985f, -0.007459f, +0.005336f, + +0.018579f, +0.005768f, -0.006498f, -0.001806f, -0.005831f, +0.002886f, +0.003338f, +0.007942f, -0.009042f, -0.006283f, + -0.001691f, +0.005297f, -0.002630f, +0.003086f, +0.004634f, +0.005283f, +0.002689f, -0.007067f, -0.000213f, -0.001862f, + +0.000226f, +0.000811f, +0.007647f, -0.004294f, +0.004348f, +0.000411f, -0.001165f, -0.001953f, +0.001533f, -0.001841f, + -0.001031f, +0.000581f, -0.002142f, +0.002009f, -0.001176f, +0.004387f, +0.001189f, -0.001715f, -0.002895f, +0.001782f, + -0.003346f, +0.001300f, -0.001902f, -0.000456f, -0.003453f, -0.002757f + }, + { + +0.125381f, -0.112987f, -0.078019f, +0.141806f, +0.024767f, +0.016266f, +0.029617f, -0.010539f, -0.036068f, -0.003640f, + +0.025630f, +0.005578f, -0.000804f, -0.009272f, -0.009198f, -0.005403f, +0.014462f, -0.054315f, -0.004948f, +0.019971f, + +0.003188f, +0.021564f, +0.001538f, -0.004008f, -0.003945f, +0.015026f, -0.001633f, -0.001508f, -0.011483f, +0.008351f, + +0.013914f, +0.003367f, -0.024933f, +0.013484f, +0.019872f, +0.012413f, +0.011995f, -0.020867f, -0.004675f, +0.012029f, + -0.005151f, +0.017822f, +0.010991f, -0.008320f, -0.015649f, +0.002660f, +0.014089f, -0.000534f, -0.007675f, -0.004660f, + +0.002283f, -0.005192f, -0.001588f, -0.008961f, -0.000871f, -0.000945f, -0.013849f, -0.004736f, +0.001644f, +0.004212f, + +0.006431f, +0.004894f, -0.006291f, -0.000081f, +0.001708f, -0.001384f, -0.001564f, +0.001039f, +0.001592f, -0.002186f, + +0.000102f, -0.000971f, +0.001954f, -0.000037f, +0.003454f, +0.001255f, +0.004810f, -0.000335f, +0.003935f, +0.000193f, + +0.004769f, -0.002216f, +0.002508f, -0.006701f, -0.000860f, -0.004805f, -0.002550f, +0.002437f, +0.003545f, -0.002759f, + -0.000859f, +0.000149f, -0.001551f, -0.000657f, -0.001595f, +0.000530f + }, + { + +0.005673f, -0.121000f, -0.021282f, +0.022683f, -0.007475f, -0.037450f, +0.003026f, +0.004176f, -0.006502f, +0.008113f, + -0.014254f, +0.014374f, -0.001027f, +0.014672f, -0.016171f, -0.001925f, -0.007025f, -0.022970f, -0.009781f, -0.003707f, + -0.019945f, -0.001915f, +0.011044f, +0.008575f, -0.008384f, -0.000722f, +0.015717f, +0.019138f, -0.009908f, +0.008376f, + -0.003931f, -0.003122f, +0.008562f, +0.002211f, -0.007674f, +0.006224f, -0.000960f, -0.001599f, -0.013766f, +0.008358f, + +0.018762f, -0.007542f, +0.000984f, +0.009213f, -0.017945f, -0.000193f, -0.004137f, +0.017484f, +0.012112f, -0.000817f, + +0.001307f, +0.005412f, +0.009429f, +0.001641f, -0.006374f, -0.001313f, -0.004580f, -0.003457f, +0.003251f, +0.007048f, + -0.000788f, +0.002175f, -0.008328f, +0.004802f, +0.000561f, -0.003050f, -0.001780f, +0.002961f, -0.002707f, +0.000414f, + -0.001085f, -0.000833f, -0.003093f, -0.002270f, +0.002239f, -0.004486f, +0.000216f, -0.002364f, +0.006144f, -0.000598f, + +0.001463f, -0.000181f, +0.000862f, +0.000531f, -0.003853f, +0.000962f, +0.000993f, -0.001649f, -0.002693f, -0.002233f, + -0.000489f, -0.000894f, -0.001028f, -0.002030f, -0.001417f, +0.001073f + }, + { + -0.013294f, -0.378256f, +0.073112f, -0.007170f, -0.004854f, -0.002392f, -0.003778f, -0.003125f, +0.008810f, -0.014266f, + +0.013598f, -0.038286f, +0.005150f, +0.000173f, -0.005778f, -0.012125f, +0.017040f, +0.027616f, -0.012896f, +0.024898f, + -0.003680f, -0.005405f, +0.010775f, +0.002485f, -0.015247f, +0.004073f, -0.008848f, +0.001146f, -0.024004f, -0.019052f, + +0.008250f, -0.020384f, -0.007290f, +0.006423f, +0.016778f, +0.015787f, +0.003383f, -0.003656f, -0.011234f, +0.000819f, + +0.003406f, +0.006656f, +0.006794f, +0.001997f, -0.015359f, -0.005736f, -0.001006f, -0.008001f, -0.002216f, -0.010994f, + +0.001197f, -0.003299f, +0.002189f, -0.003470f, +0.002232f, +0.007935f, -0.014017f, +0.009212f, +0.000072f, +0.001894f, + +0.001094f, +0.006468f, +0.004215f, +0.003580f, +0.001159f, -0.001689f, +0.006311f, +0.004636f, -0.001533f, +0.004279f, + -0.005042f, -0.002865f, +0.005599f, +0.004515f, -0.000116f, +0.002235f, -0.001295f, +0.004499f, +0.001680f, +0.005246f, + -0.001692f, -0.000194f, +0.000281f, +0.002651f, +0.001111f, +0.003660f, +0.000458f, -0.000045f, -0.001359f, -0.000513f, + +0.001661f, -0.001678f, -0.000381f, -0.005265f, +0.001272f, -0.001576f + }, + { + +0.006911f, -0.025357f, -0.017331f, -0.001801f, -0.011864f, +0.002375f, +0.004737f, -0.003083f, +0.001488f, +0.008111f, + +0.019976f, -0.008398f, -0.035766f, +0.027209f, +0.047186f, +0.009807f, +0.029316f, -0.008399f, -0.008570f, +0.019500f, + -0.025235f, +0.004216f, +0.060992f, -0.015806f, +0.014842f, -0.002204f, -0.020468f, +0.010110f, -0.012654f, +0.021919f, + +0.008248f, +0.014639f, -0.006977f, +0.025878f, -0.011739f, -0.015806f, +0.009497f, -0.000470f, +0.008106f, -0.008192f, + -0.003133f, -0.006509f, -0.002315f, +0.005407f, +0.000795f, +0.005198f, -0.008960f, +0.003871f, +0.006170f, -0.001746f, + +0.002823f, -0.007461f, -0.008954f, -0.011045f, +0.005364f, -0.000102f, +0.001328f, -0.002361f, -0.003076f, +0.000742f, + +0.008305f, +0.006252f, +0.009019f, -0.001485f, -0.007702f, -0.008821f, +0.003056f, -0.003408f, +0.000601f, +0.000148f, + -0.002114f, +0.002528f, +0.006039f, +0.002858f, -0.002981f, -0.001699f, +0.005392f, -0.003000f, -0.001878f, -0.000291f, + -0.001871f, +0.002488f, -0.005703f, -0.003801f, +0.000292f, -0.003004f, -0.002913f, +0.000183f, -0.001986f, -0.002913f, + -0.001158f, -0.003998f, +0.003836f, +0.000838f, +0.000329f, +0.000135f + }, + { + -0.053007f, -0.120464f, -0.019376f, +0.007141f, -0.041694f, -0.021962f, -0.031681f, +0.006793f, -0.002489f, -0.009406f, + +0.007344f, -0.009878f, -0.010347f, +0.010488f, -0.025446f, +0.036743f, +0.032130f, +0.033172f, +0.028724f, -0.012123f, + +0.007317f, -0.010455f, +0.013652f, +0.000717f, -0.019115f, +0.003250f, -0.004460f, +0.025131f, +0.027390f, -0.011631f, + +0.005980f, +0.017954f, -0.000563f, +0.005025f, +0.001527f, -0.003471f, +0.011374f, +0.009094f, -0.002972f, +0.000275f, + +0.004972f, -0.001317f, +0.005099f, -0.020783f, +0.003875f, -0.002261f, +0.005095f, +0.003645f, +0.005221f, +0.002214f, + -0.008743f, -0.009356f, +0.000427f, -0.000995f, +0.002524f, +0.002132f, -0.010596f, -0.000939f, +0.001210f, +0.005899f, + +0.006066f, +0.009163f, +0.004450f, +0.007866f, -0.001376f, -0.003795f, -0.013452f, -0.002257f, -0.000125f, -0.004751f, + -0.000462f, +0.000878f, -0.001496f, +0.003122f, -0.002588f, -0.004734f, +0.000644f, -0.001857f, +0.004256f, -0.005449f, + +0.003845f, -0.000973f, +0.000161f, +0.000120f, -0.001527f, -0.000005f, +0.001023f, -0.003576f, +0.004953f, +0.000152f, + -0.000310f, +0.000969f, +0.003076f, -0.003429f, +0.000258f, +0.004810f + }, + { + -0.010093f, +0.066302f, +0.000968f, -0.017596f, -0.005531f, -0.006829f, +0.013768f, -0.003806f, +0.013012f, +0.009991f, + +0.010723f, +0.007992f, -0.000731f, +0.069876f, +0.076557f, -0.054872f, -0.000964f, -0.002908f, -0.023838f, -0.001815f, + -0.014268f, -0.031341f, +0.035148f, +0.013919f, +0.003095f, +0.005125f, +0.020639f, -0.018440f, +0.006244f, -0.012234f, + -0.017398f, -0.026097f, +0.002089f, +0.006261f, -0.002124f, -0.002204f, -0.009554f, +0.007344f, +0.007868f, -0.009714f, + -0.015094f, +0.012668f, +0.007866f, -0.006069f, +0.009065f, -0.000119f, +0.003414f, -0.017961f, +0.007796f, -0.005536f, + -0.001012f, +0.004314f, -0.005700f, +0.012600f, +0.000834f, +0.011643f, -0.009055f, -0.000001f, +0.000334f, +0.004421f, + -0.000056f, -0.004287f, +0.003510f, -0.000953f, -0.007191f, +0.000037f, -0.001243f, +0.003600f, +0.004679f, +0.004531f, + -0.003552f, -0.002504f, -0.004395f, +0.005601f, +0.007562f, -0.001955f, -0.000802f, +0.001449f, -0.001141f, -0.002373f, + -0.000315f, -0.002210f, +0.002401f, +0.001091f, -0.000981f, +0.002786f, -0.005729f, +0.002337f, -0.001266f, -0.004533f, + +0.002837f, +0.001804f, -0.000281f, -0.002924f, +0.001343f, -0.002049f + }, + { + -0.008403f, -0.215667f, -0.037317f, -0.034671f, +0.009126f, -0.002344f, -0.005483f, +0.022951f, +0.017008f, +0.006823f, + -0.028121f, +0.029311f, +0.033201f, -0.026887f, -0.128842f, +0.028423f, +0.058664f, -0.013401f, +0.053174f, +0.000093f, + -0.001600f, -0.001815f, +0.024479f, +0.009692f, -0.014477f, -0.009301f, -0.023811f, +0.011380f, +0.011038f, +0.010576f, + +0.005421f, -0.016731f, +0.017806f, +0.012812f, +0.019781f, +0.016291f, -0.003191f, -0.003271f, +0.034045f, +0.002937f, + -0.025655f, +0.018267f, -0.010761f, +0.016841f, +0.009306f, -0.002507f, +0.004222f, +0.002390f, +0.007746f, +0.016996f, + +0.007492f, +0.000078f, +0.006796f, -0.003499f, +0.000189f, -0.004979f, -0.002711f, -0.004977f, -0.005735f, -0.002278f, + -0.005394f, -0.006613f, +0.004768f, -0.008460f, +0.002652f, -0.007896f, -0.001161f, -0.013781f, +0.001815f, -0.004677f, + +0.000509f, -0.006697f, +0.003176f, -0.001448f, +0.001764f, +0.008287f, -0.002088f, -0.000241f, +0.003652f, -0.002276f, + +0.006053f, +0.002102f, +0.003407f, -0.001314f, +0.003176f, +0.000435f, +0.002979f, +0.000585f, -0.004762f, -0.002542f, + -0.000505f, -0.002032f, +0.000742f, +0.002025f, -0.001309f, +0.002682f + } + }, + { + { + +0.000849f, -0.110880f, +0.027714f, -0.000013f, -0.004675f, -0.002802f, +0.000599f, +0.002926f, +0.018415f, +0.028952f, + -0.020988f, -0.044748f, +0.035435f, +0.002033f, -0.029991f, -0.021282f, +0.018644f, -0.018103f, +0.004079f, +0.021087f, + +0.011181f, -0.006977f, -0.017500f, +0.011579f, -0.013013f, -0.008470f, -0.002546f, -0.016948f, -0.007212f, -0.013717f, + +0.011217f, +0.005792f, +0.004577f, -0.005432f, -0.010086f, +0.003489f, +0.023690f, +0.015127f, +0.023749f, -0.003933f, + -0.001622f, -0.005691f, +0.007833f, +0.006991f, -0.005777f, -0.002210f, +0.011236f, -0.001734f, +0.000378f, -0.012445f, + +0.002503f, -0.004491f, -0.004460f, +0.007736f, -0.002236f, +0.005073f, +0.013226f, -0.004447f, -0.003656f, -0.007173f, + -0.001735f, +0.002821f, -0.001786f, +0.006246f, +0.000305f, -0.002821f, -0.006290f, -0.003983f, -0.008943f, +0.005783f, + +0.007642f, +0.003671f, -0.001376f, -0.000146f, -0.001231f, -0.000274f, -0.002504f, -0.001345f, +0.001616f, -0.002160f, + -0.002426f, +0.001412f, -0.002519f, -0.004336f, +0.001091f, +0.000055f, +0.003958f, -0.002141f, -0.001710f, -0.002269f, + -0.000429f, -0.001216f, +0.001309f, +0.000098f, +0.002071f, +0.000833f + }, + { + +0.021654f, +0.507075f, -0.057054f, +0.006284f, -0.010263f, +0.009384f, -0.013878f, +0.013801f, -0.000629f, -0.015144f, + -0.030314f, +0.039742f, +0.018104f, +0.005426f, +0.020806f, +0.016792f, +0.036163f, +0.001931f, +0.016778f, +0.028279f, + +0.016389f, -0.015311f, -0.019522f, +0.012784f, +0.013292f, +0.012499f, -0.019905f, +0.005535f, -0.027906f, +0.005239f, + +0.000946f, -0.006703f, +0.015308f, -0.006619f, +0.007606f, +0.001377f, +0.013105f, +0.001357f, +0.004763f, +0.007546f, + -0.004576f, -0.001396f, -0.009257f, +0.001283f, -0.013817f, +0.008116f, +0.002596f, +0.000706f, +0.015723f, -0.008156f, + -0.004587f, +0.002856f, +0.002323f, +0.007287f, -0.003255f, -0.008562f, -0.004855f, -0.007854f, -0.001374f, +0.002663f, + +0.007100f, -0.004297f, +0.004007f, -0.000942f, -0.002811f, -0.000787f, +0.000579f, -0.006112f, +0.000220f, -0.001770f, + +0.001785f, -0.000191f, -0.001357f, -0.000999f, +0.001050f, -0.002065f, -0.000630f, +0.001490f, +0.001559f, -0.000778f, + +0.000781f, +0.000412f, -0.006635f, +0.000324f, +0.000772f, +0.001179f, -0.000789f, +0.001619f, -0.001370f, -0.001354f, + -0.001413f, -0.001439f, +0.000240f, +0.000262f, +0.001559f, +0.001506f + }, + { + -0.011433f, +0.186330f, +0.046516f, -0.014047f, +0.011573f, +0.005854f, -0.015217f, -0.000283f, +0.008395f, +0.024140f, + -0.041825f, -0.008217f, +0.011925f, +0.004113f, +0.026533f, -0.000036f, -0.002046f, +0.031771f, -0.026973f, +0.030288f, + +0.022108f, -0.002413f, -0.014532f, +0.035940f, +0.035472f, +0.005835f, +0.005460f, +0.003375f, -0.004108f, -0.003781f, + +0.005086f, -0.009701f, -0.009473f, +0.005118f, -0.009778f, -0.008416f, +0.021527f, -0.001283f, +0.010370f, -0.008815f, + -0.014034f, +0.000247f, -0.004709f, -0.004337f, +0.005333f, +0.002181f, -0.014408f, +0.006616f, -0.003493f, +0.000337f, + +0.003109f, +0.001562f, +0.005233f, -0.000376f, -0.009385f, +0.005254f, +0.001283f, +0.000520f, +0.000282f, +0.006450f, + -0.000883f, -0.004801f, -0.001494f, +0.000202f, -0.004958f, +0.004578f, -0.005646f, -0.008811f, +0.007517f, -0.005965f, + +0.000236f, -0.004302f, +0.001663f, -0.000076f, +0.001286f, +0.000617f, +0.000395f, +0.006314f, -0.000663f, -0.001270f, + +0.001295f, +0.001008f, -0.003588f, +0.001299f, +0.001928f, -0.001692f, -0.001046f, +0.003105f, -0.001358f, -0.002949f, + -0.001286f, -0.001434f, +0.000084f, +0.000548f, +0.000681f, -0.000821f + }, + { + -0.002307f, +0.046511f, +0.004786f, +0.005313f, +0.002621f, -0.001756f, +0.000713f, +0.001033f, -0.003707f, +0.009816f, + -0.001743f, +0.001449f, +0.010855f, +0.007289f, +0.031692f, -0.010524f, -0.000130f, -0.025203f, -0.002022f, -0.014139f, + +0.028860f, +0.010398f, -0.020466f, +0.009098f, +0.013423f, +0.033267f, +0.008205f, -0.011755f, +0.003465f, +0.043498f, + -0.008334f, +0.026036f, -0.020897f, +0.004239f, -0.002067f, -0.027570f, +0.019581f, +0.015763f, +0.010079f, -0.011796f, + +0.010014f, -0.006813f, -0.004885f, -0.012795f, -0.008549f, +0.003284f, -0.008369f, -0.001723f, -0.018568f, -0.005151f, + +0.001943f, -0.007263f, +0.000693f, +0.001428f, +0.007010f, -0.006839f, +0.002154f, -0.004967f, +0.006538f, +0.001630f, + -0.000847f, +0.004348f, -0.002233f, +0.000626f, -0.002681f, -0.000197f, -0.000838f, +0.002744f, -0.003235f, -0.001738f, + +0.001245f, -0.004759f, -0.001433f, +0.000308f, +0.000246f, +0.001382f, -0.001962f, -0.001425f, +0.002660f, +0.000049f, + +0.006141f, -0.001987f, -0.001939f, +0.000994f, -0.002257f, -0.000315f, +0.000182f, -0.000411f, -0.000664f, +0.000106f, + +0.001612f, +0.000567f, +0.001509f, -0.002748f, -0.002787f, +0.000233f + }, + { + -0.043344f, -0.372667f, +0.004137f, +0.017157f, -0.019759f, +0.002358f, +0.002721f, -0.020064f, +0.033241f, -0.038122f, + -0.005638f, +0.026774f, +0.026311f, +0.014834f, -0.045147f, +0.001091f, +0.008640f, -0.028523f, +0.021957f, +0.010312f, + +0.013793f, -0.000437f, +0.015995f, +0.007039f, -0.018348f, -0.002010f, -0.017355f, +0.026462f, +0.020631f, -0.005508f, + -0.013474f, -0.008873f, -0.002003f, -0.005006f, -0.008515f, +0.007515f, +0.040806f, -0.024124f, +0.000694f, +0.002219f, + -0.003426f, -0.011683f, -0.006025f, -0.000010f, -0.003694f, +0.009006f, +0.002340f, +0.000136f, +0.016525f, -0.009673f, + -0.000289f, -0.005696f, -0.009111f, -0.005432f, +0.000915f, -0.001136f, +0.014666f, -0.003841f, +0.004366f, -0.003108f, + -0.002951f, +0.005795f, +0.002171f, +0.004752f, +0.005846f, -0.002376f, -0.000847f, -0.001199f, +0.004089f, +0.000551f, + -0.002306f, +0.000672f, -0.000071f, +0.002858f, -0.000932f, -0.001673f, +0.002593f, +0.004134f, +0.008256f, -0.002976f, + +0.000854f, +0.002961f, +0.000438f, +0.002538f, +0.000008f, +0.000359f, +0.002283f, -0.000037f, +0.002350f, +0.000402f, + +0.001331f, -0.001328f, +0.000302f, +0.002275f, +0.000929f, -0.001606f + }, + { + -0.003140f, +0.013381f, -0.006741f, -0.003732f, +0.000492f, -0.000522f, -0.000704f, +0.000931f, +0.001178f, +0.005825f, + +0.009521f, -0.003934f, +0.014454f, +0.029520f, +0.003535f, -0.011337f, +0.023574f, -0.034381f, +0.006512f, -0.025073f, + +0.008457f, +0.010529f, +0.010994f, +0.024296f, -0.008156f, +0.011139f, +0.008923f, -0.030005f, -0.009556f, -0.015347f, + +0.002140f, +0.022869f, -0.012436f, +0.012569f, -0.006091f, -0.010516f, -0.015743f, -0.014492f, +0.002883f, +0.007981f, + +0.002296f, +0.001407f, -0.007675f, +0.012963f, -0.000099f, +0.002015f, +0.001742f, +0.007714f, -0.017593f, +0.002813f, + +0.004079f, -0.014135f, -0.000549f, +0.002864f, +0.013017f, -0.007213f, +0.005554f, +0.003094f, +0.006109f, -0.001558f, + +0.002166f, +0.006727f, +0.008136f, +0.004212f, +0.001233f, +0.006545f, -0.003036f, -0.003440f, -0.003516f, +0.001359f, + -0.003869f, -0.002014f, +0.000329f, +0.003410f, +0.002699f, -0.004853f, -0.001399f, -0.001517f, +0.005948f, -0.002872f, + +0.000219f, +0.000346f, +0.001743f, -0.001848f, -0.001437f, +0.000325f, +0.002178f, +0.000251f, -0.000728f, +0.000413f, + -0.002212f, -0.000385f, +0.000179f, +0.001896f, -0.000611f, -0.000110f + }, + { + -0.027145f, -0.605965f, -0.009919f, +0.065256f, -0.028404f, +0.000445f, -0.019182f, -0.011194f, -0.023681f, -0.008053f, + -0.016638f, -0.011469f, -0.001735f, +0.017645f, +0.022736f, +0.004081f, -0.019314f, +0.019268f, +0.006133f, -0.018124f, + +0.048705f, +0.010937f, +0.011854f, +0.002624f, +0.007210f, -0.003919f, -0.003038f, -0.010483f, -0.009676f, +0.017663f, + +0.012731f, -0.007796f, +0.019010f, -0.006009f, -0.012308f, -0.011955f, +0.013206f, -0.005666f, -0.009246f, +0.002580f, + -0.008127f, +0.002422f, -0.000319f, -0.004141f, +0.005572f, -0.001356f, -0.009551f, +0.000032f, -0.002831f, -0.017559f, + -0.000112f, +0.009480f, +0.011795f, +0.001727f, +0.006301f, +0.006301f, -0.001044f, +0.002597f, +0.001199f, -0.000832f, + -0.000110f, +0.012393f, +0.005129f, -0.001937f, +0.002597f, +0.001166f, -0.005740f, -0.002309f, +0.002912f, -0.001452f, + -0.008559f, -0.001308f, +0.001675f, -0.002072f, +0.000308f, +0.002799f, -0.007655f, -0.002135f, -0.004971f, +0.001397f, + -0.000686f, -0.000338f, +0.001712f, +0.003238f, -0.001317f, +0.000988f, -0.000444f, -0.002167f, -0.001058f, +0.000058f, + -0.000202f, -0.001256f, -0.001194f, +0.000538f, +0.001669f, +0.001146f + }, + { + -0.002870f, +0.006005f, -0.018208f, +0.002535f, -0.004978f, -0.001731f, -0.003274f, +0.000295f, +0.008065f, +0.009093f, + -0.005698f, +0.013428f, -0.021509f, +0.001542f, +0.012013f, +0.010789f, +0.027973f, -0.000207f, +0.004409f, +0.018168f, + +0.003718f, +0.002871f, +0.035536f, +0.038063f, -0.011282f, +0.018479f, +0.031857f, -0.033019f, -0.023285f, +0.033143f, + -0.001523f, -0.024047f, +0.007002f, +0.002971f, +0.019951f, +0.021813f, -0.024210f, -0.023779f, +0.006188f, -0.010253f, + -0.021043f, +0.004937f, +0.014781f, +0.002882f, +0.002521f, +0.004389f, -0.022195f, +0.013872f, +0.004949f, +0.010739f, + +0.008335f, -0.002872f, -0.001396f, +0.002052f, -0.010389f, +0.000458f, -0.003161f, -0.000997f, -0.003321f, -0.002469f, + -0.004160f, -0.000942f, -0.012828f, -0.001109f, -0.001202f, +0.000735f, +0.004128f, -0.002150f, -0.002419f, -0.001265f, + +0.004681f, -0.003946f, +0.003181f, -0.003318f, +0.002890f, +0.001229f, -0.000236f, -0.001267f, +0.005057f, +0.001876f, + +0.001687f, -0.000062f, -0.004747f, +0.002451f, -0.000522f, +0.003991f, +0.001043f, -0.000488f, -0.002726f, -0.001875f, + -0.003169f, +0.002732f, -0.002216f, +0.002567f, +0.000791f, -0.000122f + }, + { + -0.135615f, -0.330402f, +0.039433f, +0.099226f, -0.043485f, -0.012640f, +0.016292f, +0.001075f, -0.033205f, -0.010904f, + +0.006611f, +0.018917f, +0.030057f, +0.025408f, +0.019023f, -0.008377f, -0.011178f, -0.052393f, -0.003051f, +0.014227f, + -0.012692f, +0.013919f, -0.006509f, -0.012716f, -0.018700f, +0.000781f, -0.010010f, +0.008405f, -0.003506f, -0.004292f, + -0.005495f, -0.000248f, -0.014867f, +0.008873f, +0.008376f, +0.007222f, +0.016775f, -0.001136f, +0.003545f, +0.014030f, + -0.008770f, +0.003978f, +0.009737f, -0.000140f, +0.001673f, +0.009797f, +0.003883f, -0.003359f, -0.000670f, +0.007077f, + +0.001705f, -0.008066f, +0.003684f, -0.002906f, -0.002085f, +0.008528f, -0.000766f, -0.001233f, +0.007665f, +0.003181f, + +0.000082f, +0.000892f, -0.007332f, +0.006926f, +0.008083f, +0.000090f, +0.001085f, +0.003881f, +0.007276f, +0.000595f, + -0.003160f, -0.000135f, +0.001138f, -0.002884f, +0.002276f, +0.001698f, +0.004153f, -0.002560f, +0.002140f, -0.003567f, + +0.001818f, -0.001970f, +0.001930f, -0.006962f, +0.002828f, -0.000189f, -0.000782f, +0.000843f, +0.001106f, -0.001982f, + +0.000932f, +0.000387f, -0.001808f, +0.000165f, -0.001263f, -0.000506f + }, + { + -0.007286f, -0.115691f, -0.003296f, +0.012555f, -0.015207f, -0.036172f, -0.007574f, -0.006620f, -0.014103f, +0.013711f, + +0.012813f, +0.031851f, +0.002598f, -0.005806f, -0.036475f, +0.010210f, +0.005821f, -0.021677f, -0.015642f, -0.006478f, + -0.008099f, +0.019387f, +0.007071f, -0.005661f, +0.004726f, +0.005473f, +0.004182f, +0.004111f, -0.008619f, +0.006967f, + -0.008159f, -0.009413f, -0.001395f, +0.002094f, -0.017370f, -0.000217f, +0.002107f, -0.008008f, -0.014021f, +0.022527f, + +0.030160f, -0.001324f, +0.003527f, -0.001026f, -0.019170f, +0.011210f, -0.003664f, +0.005108f, -0.003969f, -0.019345f, + -0.002396f, +0.001526f, -0.005911f, -0.007914f, -0.000752f, +0.001798f, -0.006326f, -0.009321f, -0.007757f, -0.005692f, + -0.002928f, +0.011086f, -0.004363f, -0.001869f, -0.004339f, -0.001813f, -0.002377f, -0.003209f, -0.001645f, +0.001925f, + -0.005594f, -0.002249f, +0.001148f, +0.000379f, +0.003644f, -0.002440f, +0.000896f, -0.004955f, +0.004493f, +0.002928f, + +0.003808f, +0.001219f, -0.000160f, -0.000018f, -0.003156f, -0.000316f, +0.002388f, +0.000229f, +0.002112f, -0.000771f, + -0.000956f, +0.000138f, +0.000932f, -0.001240f, -0.003151f, +0.000253f + }, + { + +0.024285f, -0.400620f, +0.031113f, +0.014887f, +0.049061f, -0.019851f, -0.015231f, +0.002116f, +0.020384f, +0.003165f, + +0.027621f, -0.033062f, +0.021033f, -0.001227f, -0.006711f, -0.007370f, -0.001485f, +0.003452f, -0.035285f, -0.013351f, + -0.030590f, -0.015340f, +0.013875f, +0.004038f, -0.012390f, +0.005809f, -0.000577f, +0.015202f, -0.009119f, -0.013864f, + -0.000639f, -0.010112f, +0.007335f, -0.002251f, +0.001102f, +0.010655f, +0.001292f, +0.000485f, +0.001284f, +0.005570f, + -0.004205f, -0.001539f, +0.007531f, +0.006028f, +0.002115f, +0.000792f, -0.002820f, -0.008434f, -0.003331f, -0.000161f, + +0.008993f, +0.001030f, +0.004062f, -0.005711f, +0.005577f, +0.015907f, -0.004725f, +0.013238f, -0.005502f, -0.000861f, + +0.002768f, +0.007097f, -0.001176f, +0.002509f, +0.008206f, -0.001670f, +0.003149f, +0.007700f, +0.000079f, +0.004632f, + -0.004704f, -0.007104f, -0.001635f, +0.000887f, -0.004013f, +0.000635f, -0.001458f, +0.006441f, +0.001359f, +0.004021f, + -0.002714f, -0.001453f, -0.000979f, -0.000927f, -0.002920f, +0.001961f, -0.001006f, -0.000932f, -0.000967f, -0.000548f, + +0.002208f, +0.000460f, +0.001959f, -0.000953f, +0.002885f, -0.001399f + }, + { + -0.006113f, +0.013834f, +0.025836f, -0.004911f, -0.022689f, -0.003543f, +0.006613f, -0.007921f, +0.000347f, +0.004796f, + +0.013804f, -0.004776f, -0.007064f, +0.032962f, +0.018903f, +0.028759f, +0.059000f, -0.005483f, -0.016169f, +0.022063f, + +0.005386f, +0.019006f, +0.028648f, -0.048115f, +0.004012f, +0.010775f, -0.033804f, +0.003739f, +0.016826f, +0.035680f, + +0.003565f, +0.005840f, -0.007108f, +0.018173f, -0.006755f, +0.005003f, +0.001546f, -0.019427f, +0.002500f, -0.006035f, + -0.003061f, -0.001397f, +0.001072f, +0.004274f, -0.002519f, +0.000394f, -0.001193f, +0.001282f, -0.011198f, -0.011839f, + +0.009015f, +0.000615f, -0.001998f, -0.004756f, +0.001075f, -0.005994f, -0.003792f, +0.003242f, -0.002635f, -0.004408f, + +0.006947f, +0.004149f, +0.000987f, -0.002290f, +0.004193f, -0.007402f, -0.001685f, -0.003151f, -0.003687f, +0.002738f, + +0.003898f, +0.004508f, +0.005863f, -0.002425f, -0.006033f, +0.001562f, +0.007807f, -0.001979f, -0.001526f, +0.001879f, + +0.002954f, +0.006987f, -0.004772f, -0.001682f, +0.003333f, -0.000432f, +0.000666f, -0.000628f, -0.001244f, -0.001328f, + +0.001258f, -0.001653f, -0.000442f, -0.003003f, -0.000307f, -0.003606f + }, + { + +0.072776f, +0.062798f, +0.001728f, +0.007249f, -0.025863f, +0.025536f, +0.013241f, +0.042790f, +0.011991f, -0.011787f, + -0.006076f, +0.013423f, +0.010003f, +0.015031f, -0.025208f, +0.052070f, +0.030542f, +0.001208f, +0.016177f, -0.025014f, + -0.009228f, -0.031273f, +0.000055f, -0.001343f, -0.024413f, -0.006723f, -0.014606f, +0.005777f, +0.015964f, -0.006799f, + +0.014656f, +0.009671f, -0.009167f, -0.011023f, -0.009387f, -0.004784f, +0.003913f, +0.009936f, -0.003685f, -0.010218f, + +0.014369f, -0.000060f, -0.001107f, -0.020186f, +0.009854f, +0.012940f, +0.003998f, -0.004043f, +0.002727f, +0.010488f, + -0.002262f, -0.009203f, +0.010234f, -0.006093f, -0.003641f, +0.005358f, -0.011983f, +0.001100f, +0.003477f, +0.001514f, + +0.001186f, +0.008088f, +0.002067f, +0.002820f, -0.001663f, +0.000489f, -0.009253f, -0.000406f, -0.002298f, -0.006644f, + +0.001569f, -0.000170f, -0.003443f, -0.001218f, -0.005881f, -0.002898f, +0.003706f, -0.000281f, -0.000616f, -0.006702f, + +0.003404f, -0.001334f, -0.000470f, -0.003102f, -0.003489f, -0.001110f, +0.000795f, +0.000267f, +0.005192f, -0.002627f, + -0.000510f, -0.000114f, +0.003429f, -0.002451f, +0.001134f, +0.003996f + }, + { + +0.012968f, +0.073737f, -0.008797f, -0.007196f, -0.005457f, -0.007892f, +0.007176f, -0.014363f, +0.010876f, +0.016425f, + +0.003595f, -0.004452f, -0.017002f, -0.110437f, -0.123622f, -0.036812f, -0.002074f, -0.002112f, +0.013280f, -0.004668f, + -0.036655f, -0.028207f, +0.028312f, +0.006302f, +0.027897f, +0.018267f, +0.015128f, -0.003080f, +0.026605f, -0.002317f, + -0.001292f, +0.001685f, +0.022632f, +0.002137f, -0.002410f, -0.013566f, -0.000795f, +0.017741f, +0.008540f, +0.007748f, + -0.019409f, +0.004102f, +0.007362f, -0.011719f, -0.003645f, -0.011656f, +0.001122f, -0.015666f, +0.012346f, -0.001483f, + -0.001840f, +0.006906f, -0.003728f, +0.003655f, -0.006570f, +0.008571f, -0.007382f, +0.000943f, -0.004413f, +0.001723f, + -0.004557f, -0.007862f, -0.002962f, -0.004684f, -0.007975f, +0.006453f, +0.003692f, -0.007808f, -0.005373f, +0.001510f, + -0.003907f, -0.002472f, -0.004151f, +0.000490f, +0.006649f, -0.000090f, +0.003691f, +0.001510f, -0.005833f, -0.002693f, + -0.001927f, +0.000268f, +0.005809f, +0.000449f, -0.000133f, +0.005851f, -0.001616f, +0.004873f, +0.000418f, -0.003744f, + +0.001197f, -0.001031f, +0.001071f, -0.001183f, +0.000584f, -0.000320f + }, + { + +0.041102f, -0.132478f, -0.024407f, -0.025884f, +0.014035f, +0.011579f, +0.007374f, +0.017197f, +0.001937f, +0.007411f, + -0.040152f, +0.016519f, +0.036663f, +0.052435f, -0.035869f, +0.022713f, +0.021508f, -0.024476f, +0.039573f, +0.008051f, + +0.000994f, -0.023393f, +0.004286f, -0.005327f, -0.009897f, +0.006209f, -0.010615f, -0.008507f, -0.010414f, +0.011489f, + +0.005118f, -0.026945f, +0.010570f, -0.003760f, +0.006834f, +0.009576f, -0.009428f, -0.004384f, +0.019011f, +0.002528f, + -0.013318f, +0.028212f, -0.004933f, +0.014125f, +0.008094f, +0.004616f, +0.007091f, -0.004821f, +0.001269f, +0.009343f, + -0.004874f, -0.004859f, +0.008088f, +0.005970f, +0.001537f, -0.004267f, +0.014650f, +0.004258f, -0.006406f, -0.001631f, + -0.005377f, -0.006102f, +0.010299f, -0.005956f, +0.001529f, -0.001254f, +0.009509f, -0.002152f, +0.005379f, -0.010299f, + +0.001095f, +0.000250f, +0.002549f, -0.003727f, +0.000712f, +0.010299f, +0.001406f, -0.000879f, +0.004370f, +0.000192f, + +0.009439f, +0.001827f, +0.000166f, -0.002910f, +0.001289f, -0.001909f, -0.001770f, -0.002474f, -0.003730f, -0.002863f, + -0.003565f, -0.001976f, -0.001045f, -0.001909f, -0.003375f, +0.003346f + } + }, + { + { + -0.000004f, -0.025128f, -0.028436f, -0.023789f, +0.002351f, +0.006887f, -0.003219f, -0.005129f, +0.014110f, +0.004486f, + +0.010925f, -0.020794f, +0.004335f, -0.005326f, -0.000368f, -0.030043f, -0.009654f, +0.017438f, -0.021662f, +0.036128f, + +0.013231f, -0.010535f, -0.017410f, -0.006901f, +0.009461f, -0.026033f, -0.014596f, -0.004728f, -0.018901f, +0.006185f, + -0.010964f, +0.018403f, -0.020265f, +0.008153f, +0.007557f, +0.018911f, +0.001491f, +0.014024f, +0.029141f, -0.005348f, + -0.002693f, -0.007742f, +0.006491f, +0.013280f, +0.000251f, -0.003629f, -0.005063f, +0.002933f, +0.003664f, -0.004029f, + +0.001962f, -0.011343f, +0.008597f, -0.002038f, +0.006582f, -0.003773f, +0.015236f, -0.003012f, -0.000621f, -0.008310f, + +0.000355f, -0.003863f, +0.000686f, -0.002657f, +0.002410f, -0.005994f, -0.007301f, -0.002792f, -0.002027f, +0.005352f, + -0.000043f, +0.002035f, -0.002177f, +0.002142f, -0.002170f, +0.001455f, -0.002742f, +0.001421f, -0.001294f, -0.002400f, + -0.001022f, +0.000771f, -0.002050f, -0.001781f, -0.001750f, -0.001128f, +0.004575f, -0.001944f, -0.001796f, -0.001206f, + -0.000049f, -0.000453f, -0.001246f, +0.001309f, +0.003567f, -0.000040f + }, + { + -0.025942f, +0.390884f, +0.063283f, -0.015332f, +0.023642f, -0.004843f, -0.012209f, +0.031390f, -0.013613f, -0.022891f, + -0.003834f, +0.040075f, +0.004986f, +0.012742f, +0.000353f, +0.030616f, +0.050716f, -0.013533f, +0.022828f, +0.030645f, + +0.004744f, -0.017294f, -0.020388f, +0.013833f, +0.014383f, +0.001269f, -0.013106f, +0.012420f, -0.016469f, -0.007873f, + -0.005729f, +0.011265f, +0.009597f, -0.006877f, +0.007917f, -0.003514f, +0.006063f, +0.020742f, +0.002337f, +0.015329f, + -0.009805f, +0.002984f, +0.001363f, -0.014773f, -0.001749f, -0.003517f, +0.000970f, +0.002713f, +0.016216f, -0.002856f, + +0.006183f, +0.007219f, -0.004073f, +0.008272f, -0.004688f, -0.009491f, -0.000099f, -0.011360f, -0.002138f, +0.008975f, + +0.003608f, +0.002776f, -0.001978f, -0.009684f, +0.005380f, -0.002368f, -0.003463f, -0.000798f, -0.000331f, -0.006614f, + +0.005024f, -0.000168f, -0.004110f, -0.000569f, +0.003392f, +0.000249f, -0.004762f, +0.003326f, +0.000970f, +0.002020f, + +0.000781f, -0.005230f, -0.000144f, -0.000481f, +0.000649f, +0.000090f, +0.001665f, -0.000237f, -0.002290f, -0.003311f, + -0.000380f, -0.000399f, +0.000518f, +0.000861f, +0.000961f, +0.000828f + }, + { + +0.008079f, +0.250663f, -0.014189f, -0.010798f, -0.010956f, +0.008573f, -0.008460f, +0.010705f, -0.002242f, +0.014980f, + -0.037509f, -0.032070f, +0.028621f, +0.030338f, +0.002638f, +0.002246f, +0.003558f, -0.007702f, -0.016141f, +0.035077f, + +0.013309f, +0.005858f, +0.009341f, +0.017002f, +0.034581f, +0.009464f, +0.011988f, +0.003264f, +0.012150f, -0.014326f, + +0.000158f, -0.009159f, -0.016742f, -0.003707f, -0.000394f, +0.004570f, +0.004971f, -0.001117f, +0.007794f, -0.000667f, + -0.006580f, -0.018690f, -0.002545f, +0.000744f, -0.003661f, +0.009850f, -0.001311f, -0.009503f, +0.006615f, -0.000956f, + +0.005311f, +0.007082f, -0.004560f, -0.000400f, -0.002448f, -0.000238f, +0.003342f, -0.001862f, +0.004856f, +0.002487f, + -0.002454f, -0.002952f, -0.002972f, -0.001219f, +0.002034f, -0.002135f, -0.010212f, -0.002161f, +0.001819f, +0.000954f, + -0.002738f, +0.000679f, +0.000302f, -0.001416f, +0.000873f, +0.000525f, +0.001901f, +0.004342f, +0.000266f, +0.002582f, + +0.000331f, -0.000397f, -0.001563f, +0.000877f, -0.001006f, -0.000219f, +0.000691f, +0.001628f, -0.002691f, -0.001458f, + -0.001483f, -0.001767f, +0.002259f, -0.000777f, -0.000403f, -0.001029f + }, + { + +0.001934f, +0.051356f, -0.002324f, +0.010588f, -0.002729f, +0.001445f, -0.003134f, +0.004349f, -0.006235f, +0.005028f, + +0.011092f, -0.005669f, +0.011114f, +0.009651f, +0.007158f, +0.033447f, -0.024282f, -0.028610f, +0.000148f, +0.005825f, + -0.004453f, -0.010887f, +0.005858f, -0.003006f, +0.023477f, +0.021505f, -0.004500f, +0.006805f, -0.015639f, +0.038788f, + +0.029098f, -0.003444f, -0.003714f, -0.007312f, -0.000009f, -0.016444f, +0.005411f, +0.022739f, +0.004133f, -0.009649f, + +0.007087f, -0.005358f, -0.013298f, -0.004186f, -0.014381f, +0.002860f, +0.002682f, -0.001213f, -0.025766f, +0.001311f, + +0.003594f, -0.011397f, +0.003883f, -0.000731f, +0.002020f, -0.002199f, +0.000393f, +0.005035f, +0.000556f, -0.000403f, + +0.001446f, +0.001767f, -0.002737f, +0.003910f, -0.005337f, -0.001680f, +0.002170f, -0.003341f, +0.001795f, -0.002015f, + -0.005296f, -0.000084f, -0.002085f, +0.000095f, +0.001207f, +0.001929f, -0.004066f, +0.000598f, +0.001366f, +0.002730f, + +0.003167f, +0.003059f, -0.005657f, +0.000208f, -0.002948f, +0.001240f, +0.000988f, -0.001504f, -0.000870f, +0.001781f, + +0.002085f, -0.000720f, +0.000421f, -0.001252f, -0.003840f, +0.000329f + }, + { + +0.016527f, -0.484179f, +0.021641f, -0.007141f, +0.008691f, -0.003008f, -0.000684f, -0.008572f, +0.023932f, -0.044448f, + +0.014450f, +0.015571f, +0.029702f, +0.005160f, -0.035665f, -0.005518f, +0.007836f, -0.035223f, +0.033397f, +0.014819f, + -0.006236f, +0.014241f, +0.014280f, +0.002735f, -0.009797f, -0.008528f, -0.014265f, +0.027227f, +0.008126f, -0.004139f, + +0.005773f, -0.030055f, +0.012218f, -0.016681f, -0.002963f, +0.005469f, +0.005087f, +0.022224f, -0.020758f, +0.006720f, + -0.001650f, -0.014164f, -0.003320f, -0.007499f, +0.004996f, +0.003364f, +0.012470f, -0.004541f, +0.018997f, -0.006334f, + +0.000667f, -0.003368f, -0.016411f, +0.002295f, -0.002930f, +0.004494f, +0.002278f, +0.006001f, +0.004401f, -0.004582f, + -0.002784f, +0.006511f, +0.004883f, +0.001200f, +0.008769f, -0.002557f, -0.007971f, +0.002295f, +0.004481f, +0.002108f, + -0.000250f, -0.001446f, +0.001717f, +0.001453f, -0.001016f, +0.000007f, +0.001281f, +0.002602f, +0.008083f, -0.001632f, + +0.002672f, +0.000057f, +0.001738f, +0.002055f, -0.000500f, +0.002105f, +0.000914f, -0.000453f, +0.003668f, +0.001216f, + -0.000980f, -0.000395f, -0.000003f, +0.000753f, +0.002051f, -0.000395f + }, + { + +0.000975f, -0.005453f, -0.002931f, -0.003807f, +0.003925f, +0.001015f, -0.002367f, +0.002940f, +0.001987f, +0.004150f, + +0.006520f, +0.008052f, +0.000339f, +0.021203f, -0.017606f, +0.025272f, +0.000150f, -0.008767f, -0.007526f, -0.004485f, + -0.001552f, +0.017437f, +0.007916f, -0.008401f, -0.002173f, +0.020063f, -0.011273f, -0.029919f, +0.008689f, -0.014469f, + +0.012605f, +0.009589f, +0.004206f, +0.002410f, -0.002527f, -0.012871f, -0.013312f, -0.008260f, +0.010235f, -0.005561f, + +0.009093f, -0.010971f, -0.005131f, +0.012443f, -0.002273f, -0.000391f, +0.003520f, +0.003795f, -0.007721f, +0.003194f, + -0.005139f, -0.004876f, -0.006382f, +0.013945f, +0.004625f, -0.005966f, +0.000585f, +0.010687f, -0.001414f, +0.009146f, + -0.001786f, +0.005250f, +0.012496f, -0.001350f, +0.004103f, +0.003639f, -0.002795f, -0.001066f, -0.003821f, +0.002150f, + -0.007113f, -0.003166f, +0.000141f, +0.004714f, -0.003236f, +0.000174f, -0.000828f, -0.004703f, +0.002160f, +0.000546f, + +0.002216f, +0.000108f, +0.000555f, +0.000538f, -0.000897f, -0.003025f, +0.000886f, +0.001559f, -0.000918f, +0.000122f, + -0.001516f, +0.000147f, +0.000893f, -0.000352f, -0.000333f, -0.000642f + }, + { + -0.025059f, -0.671750f, +0.040931f, +0.035155f, -0.004364f, -0.003652f, +0.000707f, -0.025909f, -0.018907f, -0.021093f, + -0.001606f, -0.004240f, +0.009794f, -0.028177f, +0.021465f, +0.017510f, -0.009334f, +0.033218f, -0.028054f, +0.009874f, + +0.013010f, +0.035419f, +0.011647f, -0.004481f, -0.004096f, +0.007651f, -0.013953f, -0.001583f, -0.014536f, +0.009583f, + +0.020012f, -0.001527f, -0.002385f, +0.010843f, -0.022720f, -0.013221f, +0.020419f, -0.009607f, -0.002566f, -0.012400f, + +0.006179f, +0.000676f, -0.002677f, -0.002408f, +0.002569f, -0.005777f, -0.015312f, +0.017853f, -0.016011f, -0.003242f, + +0.004918f, -0.000674f, +0.016137f, +0.005676f, +0.006511f, +0.000384f, +0.001693f, +0.005820f, -0.002235f, -0.000777f, + +0.001994f, +0.003559f, +0.011348f, -0.002274f, -0.001117f, -0.000911f, -0.001548f, -0.000893f, +0.004254f, -0.002468f, + -0.007715f, -0.003467f, +0.003126f, -0.000471f, -0.005463f, +0.000667f, -0.000632f, -0.003831f, -0.006971f, +0.004124f, + -0.003523f, +0.001980f, +0.003591f, -0.002269f, +0.003948f, +0.000833f, +0.002116f, -0.004417f, -0.000513f, -0.000022f, + -0.001645f, +0.001512f, -0.003055f, -0.001415f, +0.003406f, +0.000493f + }, + { + +0.000903f, -0.018697f, -0.002525f, -0.007544f, +0.001618f, +0.000474f, -0.002102f, +0.003036f, +0.002097f, +0.005664f, + +0.002626f, -0.000798f, -0.008870f, +0.005873f, +0.006116f, +0.034613f, +0.024660f, -0.025598f, +0.048946f, -0.031990f, + +0.030047f, +0.014466f, -0.006696f, +0.010715f, +0.015900f, +0.010748f, +0.025938f, -0.004822f, +0.011542f, -0.016169f, + -0.012318f, -0.011103f, +0.011097f, +0.024509f, +0.002067f, +0.009151f, -0.013444f, -0.004726f, -0.012938f, -0.012502f, + -0.009343f, -0.000353f, +0.009120f, +0.004546f, -0.004141f, +0.007525f, -0.009029f, -0.010576f, +0.019164f, +0.012513f, + -0.000783f, -0.004236f, +0.002811f, +0.001269f, -0.009364f, +0.005245f, +0.001016f, -0.010802f, +0.001768f, -0.001721f, + -0.007963f, +0.003292f, -0.014251f, -0.001583f, -0.002326f, +0.004989f, -0.006548f, +0.005645f, -0.000507f, -0.002483f, + +0.004837f, -0.002020f, -0.000289f, -0.001202f, -0.003923f, +0.003663f, +0.000257f, -0.000472f, +0.002177f, +0.003843f, + +0.000202f, -0.001333f, +0.000917f, -0.002820f, +0.003377f, +0.000084f, +0.001450f, -0.001696f, +0.002122f, -0.004897f, + -0.001639f, +0.000624f, -0.000538f, +0.001034f, +0.002453f, +0.001723f + }, + { + +0.120527f, -0.566917f, -0.038031f, +0.058110f, -0.016555f, -0.010939f, +0.003488f, -0.000168f, -0.010432f, +0.000496f, + -0.022734f, +0.037850f, +0.019077f, +0.046159f, -0.001927f, +0.008966f, -0.039558f, -0.012392f, -0.015968f, -0.001450f, + +0.002641f, +0.004502f, -0.010247f, -0.006364f, -0.013384f, -0.002585f, -0.012274f, +0.006390f, +0.003780f, -0.000471f, + -0.010493f, -0.002107f, -0.008885f, +0.015917f, -0.001233f, +0.003022f, +0.006450f, +0.022086f, +0.006298f, -0.007670f, + -0.005696f, +0.004152f, +0.010044f, -0.005905f, +0.004364f, +0.004899f, +0.005639f, +0.000479f, +0.000985f, +0.007876f, + -0.003820f, -0.011243f, +0.004720f, +0.003402f, -0.010763f, +0.010919f, +0.004676f, +0.002020f, +0.003379f, +0.004077f, + -0.002264f, -0.003464f, +0.006420f, -0.001795f, +0.006580f, +0.003540f, -0.000545f, +0.005258f, +0.004906f, +0.003093f, + -0.004195f, +0.000599f, +0.000822f, -0.001351f, -0.001328f, +0.000745f, +0.006575f, -0.002369f, +0.000245f, -0.002900f, + +0.000723f, +0.000007f, -0.001947f, +0.000654f, -0.001049f, +0.003648f, -0.000379f, -0.001132f, -0.002619f, +0.001350f, + +0.001602f, -0.001483f, -0.000691f, -0.002015f, +0.000351f, +0.001601f + }, + { + +0.008374f, -0.084784f, -0.043197f, +0.001593f, -0.015335f, -0.014135f, -0.017492f, -0.008318f, -0.009803f, +0.013869f, + +0.018482f, +0.016992f, +0.010542f, -0.021593f, -0.029352f, +0.014985f, -0.020803f, +0.004919f, +0.025030f, -0.070324f, + +0.021813f, +0.023728f, +0.012745f, -0.015428f, +0.019163f, -0.005210f, +0.009443f, +0.002690f, -0.008479f, -0.010899f, + -0.007846f, +0.006014f, -0.004703f, -0.004004f, -0.008104f, -0.008554f, +0.005546f, -0.004634f, -0.004742f, +0.006399f, + +0.025531f, +0.001850f, +0.008340f, -0.004598f, -0.006162f, +0.001274f, +0.002543f, -0.006530f, +0.004317f, -0.021062f, + +0.000585f, -0.000679f, -0.015250f, -0.003876f, -0.004697f, +0.006200f, -0.004832f, -0.000730f, -0.015800f, -0.005514f, + -0.000562f, +0.007386f, -0.001502f, -0.003725f, -0.004803f, +0.001433f, -0.000917f, -0.010189f, +0.004028f, -0.000256f, + -0.001752f, -0.007338f, -0.000360f, +0.003114f, +0.001304f, -0.002369f, +0.003350f, -0.000308f, +0.000038f, +0.001416f, + +0.000295f, +0.003541f, +0.003238f, -0.001700f, -0.001900f, -0.003323f, +0.003916f, -0.000323f, +0.003100f, -0.001348f, + +0.001211f, -0.002626f, +0.003870f, -0.003260f, -0.002427f, -0.000109f + }, + { + -0.033805f, -0.431365f, +0.105930f, +0.025498f, +0.054001f, -0.005442f, -0.004820f, -0.004308f, +0.020848f, -0.001701f, + +0.007841f, -0.000375f, +0.014191f, -0.009573f, -0.005412f, +0.009626f, -0.008824f, -0.011723f, -0.030678f, -0.002685f, + -0.046453f, -0.001791f, +0.001565f, +0.009830f, -0.016300f, +0.009713f, -0.010735f, +0.005193f, +0.004762f, +0.008916f, + -0.009347f, -0.006158f, +0.007573f, -0.007903f, -0.001458f, +0.003268f, +0.012754f, -0.000362f, +0.012231f, +0.000767f, + -0.007270f, -0.007464f, +0.004814f, -0.003253f, +0.006752f, +0.009762f, -0.003955f, -0.012950f, -0.005760f, +0.016851f, + -0.005672f, -0.000963f, +0.010622f, -0.007032f, +0.005487f, +0.004519f, +0.009893f, +0.008442f, -0.004269f, -0.005212f, + +0.005374f, +0.001541f, +0.005323f, +0.000437f, +0.006811f, -0.002961f, +0.000870f, +0.005017f, +0.004764f, +0.004515f, + -0.005494f, -0.006717f, -0.000958f, -0.000385f, -0.004342f, +0.002882f, -0.001288f, +0.005588f, -0.000145f, -0.000526f, + +0.000425f, +0.000931f, -0.004153f, -0.000083f, -0.003462f, +0.000655f, -0.000751f, -0.000103f, -0.001596f, +0.000345f, + +0.000602f, +0.001744f, -0.000123f, +0.001555f, +0.002317f, +0.000856f + }, + { + +0.005222f, +0.056425f, -0.008784f, -0.011672f, -0.010980f, -0.008659f, +0.005245f, +0.000788f, -0.009139f, +0.008273f, + +0.015103f, -0.011536f, +0.026412f, +0.003081f, +0.022820f, +0.004564f, +0.072040f, -0.018266f, +0.006883f, -0.013953f, + +0.007022f, +0.048945f, -0.029501f, +0.007968f, -0.029571f, +0.024428f, -0.026681f, -0.001734f, +0.019520f, +0.036046f, + +0.002801f, -0.014851f, +0.025618f, -0.004284f, -0.009459f, +0.017141f, -0.015741f, +0.007011f, -0.009652f, +0.000233f, + +0.001699f, +0.002534f, +0.003195f, -0.003302f, +0.005418f, -0.018615f, +0.010880f, +0.000715f, -0.009738f, -0.003147f, + -0.000411f, +0.001428f, +0.000211f, -0.000166f, -0.009687f, -0.011418f, -0.001269f, +0.009692f, -0.002607f, +0.004133f, + -0.000315f, +0.001824f, -0.000931f, -0.001606f, -0.000954f, +0.001008f, -0.006904f, +0.001563f, -0.004737f, +0.001401f, + +0.002143f, +0.003883f, +0.004693f, -0.005209f, +0.002382f, +0.004434f, -0.000956f, +0.004566f, -0.002585f, -0.002547f, + +0.007947f, +0.003760f, -0.002823f, +0.003467f, -0.001965f, +0.002990f, -0.001021f, -0.001256f, +0.001890f, -0.001847f, + +0.001155f, -0.000255f, -0.003545f, -0.001542f, +0.000529f, -0.004574f + }, + { + -0.053912f, +0.259795f, +0.000041f, -0.012490f, -0.026804f, +0.047868f, +0.007870f, +0.040483f, -0.027298f, +0.016350f, + -0.001890f, +0.022110f, -0.004837f, -0.003023f, +0.014450f, +0.035953f, +0.028918f, -0.001719f, +0.000733f, -0.013990f, + -0.020627f, -0.014175f, -0.017254f, -0.010919f, -0.010141f, -0.005613f, +0.007009f, +0.002384f, -0.017245f, -0.010804f, + +0.024005f, +0.009447f, -0.009352f, -0.007581f, +0.004733f, -0.013941f, -0.007278f, +0.001444f, +0.004586f, -0.009853f, + +0.014323f, -0.009580f, -0.006798f, -0.007363f, -0.001205f, +0.024935f, -0.005192f, -0.006765f, +0.004340f, +0.009594f, + +0.005626f, -0.013173f, +0.004057f, +0.003272f, -0.004950f, -0.003559f, -0.000772f, +0.003364f, +0.000866f, +0.001982f, + -0.002048f, +0.010521f, +0.002326f, -0.001059f, -0.001581f, +0.001151f, -0.006541f, +0.000044f, +0.001713f, -0.008173f, + -0.000227f, -0.000686f, -0.003241f, -0.000639f, -0.005255f, +0.000862f, -0.000254f, -0.000198f, -0.005621f, +0.000428f, + -0.001796f, +0.003407f, -0.001000f, -0.004511f, -0.001135f, -0.003031f, +0.001537f, +0.003773f, +0.002621f, -0.004876f, + +0.003440f, -0.001905f, +0.000880f, -0.000336f, +0.001482f, +0.001936f + }, + { + -0.013488f, +0.081782f, +0.013612f, +0.013230f, -0.018627f, +0.004213f, -0.010673f, +0.006566f, -0.005795f, -0.006316f, + +0.002702f, +0.006003f, -0.012232f, -0.075665f, -0.184234f, +0.006377f, -0.045958f, +0.023760f, +0.019086f, -0.068435f, + +0.024741f, -0.016969f, +0.008274f, +0.018924f, +0.003361f, +0.034777f, +0.002910f, +0.016251f, +0.013147f, +0.017197f, + -0.014704f, +0.006661f, +0.017768f, +0.008756f, -0.003114f, -0.032457f, +0.021335f, +0.015757f, -0.001643f, +0.010970f, + -0.010213f, -0.008821f, +0.009198f, -0.004911f, -0.012637f, -0.006387f, -0.001735f, -0.006704f, -0.002879f, +0.006036f, + +0.002194f, -0.003176f, +0.002982f, -0.006195f, +0.001184f, +0.005170f, -0.004729f, +0.005927f, -0.010265f, +0.001540f, + -0.006370f, -0.003915f, -0.007817f, -0.006800f, -0.001805f, +0.000269f, +0.007788f, -0.004759f, -0.006555f, -0.000081f, + -0.008558f, -0.001546f, +0.007208f, -0.004859f, +0.002906f, +0.003794f, +0.000620f, +0.001643f, -0.002688f, -0.000281f, + -0.004124f, +0.002272f, +0.002643f, -0.003364f, +0.003567f, +0.003841f, -0.000127f, +0.005954f, -0.000195f, -0.001458f, + -0.001913f, -0.002106f, +0.001009f, +0.002019f, -0.001137f, +0.002671f + }, + { + -0.055737f, -0.009783f, +0.008988f, -0.002457f, -0.028149f, +0.012964f, +0.011374f, +0.031829f, -0.003939f, -0.004484f, + -0.018706f, +0.017675f, -0.000739f, +0.010788f, +0.053842f, +0.025129f, -0.001045f, -0.008816f, +0.000965f, +0.028457f, + -0.009676f, -0.019302f, +0.009891f, -0.006328f, -0.020152f, +0.012802f, -0.011467f, -0.005130f, -0.001967f, +0.005049f, + -0.011998f, -0.007393f, -0.006177f, -0.003144f, +0.019387f, +0.010911f, -0.030311f, +0.017531f, -0.001928f, +0.008746f, + -0.013930f, +0.006381f, +0.008253f, +0.005407f, +0.006500f, +0.005724f, +0.013932f, -0.003758f, -0.002042f, -0.003083f, + +0.001202f, -0.005990f, +0.000105f, +0.016878f, -0.006737f, -0.008286f, +0.020098f, +0.004678f, -0.003305f, -0.005265f, + -0.008742f, +0.000370f, +0.007449f, -0.000478f, +0.001953f, +0.000176f, +0.005704f, +0.006935f, -0.005879f, -0.001480f, + +0.000379f, +0.002673f, -0.006120f, -0.002316f, +0.002718f, +0.005829f, +0.008042f, -0.003941f, +0.001928f, +0.005696f, + +0.002706f, +0.005923f, -0.002327f, -0.001251f, +0.001284f, -0.003591f, -0.001779f, -0.001486f, -0.003089f, -0.001411f, + -0.005439f, -0.000355f, -0.004460f, -0.001730f, -0.000187f, +0.001541f + } + }, + { + { + -0.001967f, +0.059869f, +0.030841f, -0.042580f, -0.018684f, +0.003712f, +0.002148f, -0.005977f, +0.005193f, +0.007183f, + +0.013423f, -0.010044f, -0.004284f, -0.027925f, -0.025414f, -0.052686f, -0.034978f, -0.004892f, -0.034498f, +0.016190f, + -0.009752f, +0.008980f, +0.010490f, -0.008229f, -0.012130f, -0.034905f, -0.019332f, -0.009749f, -0.016276f, +0.009049f, + -0.029144f, +0.002803f, -0.016131f, +0.012729f, +0.005385f, +0.022926f, +0.003056f, +0.005882f, +0.012637f, -0.009549f, + -0.002317f, -0.006745f, -0.000457f, -0.003741f, -0.002913f, +0.010014f, +0.000193f, +0.006061f, +0.007180f, +0.006286f, + +0.010866f, +0.002242f, +0.015648f, +0.000216f, +0.014597f, -0.003975f, +0.005346f, -0.006926f, +0.005095f, -0.004349f, + +0.003145f, +0.002625f, +0.003284f, -0.006567f, -0.001201f, -0.003551f, -0.004459f, -0.001996f, +0.004232f, +0.004790f, + -0.005883f, -0.003094f, -0.002577f, +0.006891f, +0.000089f, +0.003296f, -0.000374f, +0.002138f, +0.002646f, +0.000230f, + -0.002528f, +0.003388f, +0.003116f, +0.000506f, +0.000020f, +0.000337f, +0.003904f, -0.000471f, +0.000042f, -0.000784f, + +0.000496f, -0.001533f, -0.001587f, +0.002589f, +0.003667f, -0.001731f + }, + { + +0.032523f, +0.278998f, -0.066119f, -0.007358f, +0.010908f, -0.000649f, -0.013765f, +0.000384f, -0.038899f, -0.006645f, + +0.015056f, +0.024814f, -0.012249f, -0.010086f, +0.004708f, -0.012903f, -0.004407f, -0.006985f, +0.012958f, +0.012148f, + -0.005462f, -0.023542f, -0.023776f, +0.015386f, +0.007095f, -0.006856f, -0.002067f, +0.019596f, -0.004003f, -0.008076f, + -0.009648f, +0.018399f, +0.002305f, -0.022003f, +0.023940f, +0.015863f, +0.002514f, +0.009575f, -0.012564f, +0.010962f, + -0.006889f, +0.011959f, +0.004414f, -0.011209f, +0.012434f, -0.002982f, +0.005431f, +0.003869f, +0.009996f, +0.005535f, + +0.012982f, +0.015749f, +0.006247f, +0.013768f, +0.002678f, -0.004078f, +0.008551f, -0.000558f, +0.002202f, +0.009512f, + +0.005026f, +0.007354f, +0.000106f, -0.010404f, +0.004085f, -0.001355f, -0.004987f, -0.000871f, +0.005000f, -0.002400f, + +0.003406f, -0.000803f, +0.000263f, +0.004503f, +0.000995f, +0.001303f, -0.002487f, +0.001399f, +0.001194f, +0.003211f, + +0.001418f, -0.004389f, +0.002516f, +0.001446f, +0.000787f, -0.001791f, +0.002546f, +0.001941f, -0.001440f, -0.002277f, + +0.002919f, +0.001586f, +0.001137f, +0.003854f, +0.001283f, -0.002573f + }, + { + -0.003947f, +0.221195f, -0.043193f, -0.015932f, -0.008332f, +0.008594f, -0.008949f, +0.010120f, -0.013757f, -0.016587f, + -0.043415f, -0.039830f, +0.002519f, -0.001056f, -0.012559f, +0.008957f, -0.002707f, -0.017094f, -0.015486f, +0.005167f, + -0.014796f, -0.012729f, -0.005418f, +0.004389f, +0.031492f, +0.011267f, +0.004354f, +0.002637f, +0.012239f, -0.025197f, + -0.011276f, -0.003814f, -0.001489f, -0.007989f, -0.013923f, +0.001590f, +0.000652f, -0.011434f, +0.009918f, +0.011189f, + +0.002897f, -0.006826f, +0.007780f, +0.005985f, +0.002390f, +0.009558f, +0.004873f, +0.001508f, +0.013190f, +0.002649f, + +0.006069f, +0.003390f, -0.006484f, +0.003650f, +0.000356f, -0.006643f, +0.005193f, +0.002372f, +0.002627f, -0.003531f, + +0.000676f, -0.000989f, -0.001668f, -0.002695f, +0.007021f, +0.000753f, -0.007685f, +0.003078f, +0.004588f, +0.008479f, + +0.001699f, +0.001198f, +0.000879f, +0.002722f, +0.001647f, -0.002725f, -0.001780f, +0.001274f, +0.002687f, +0.003663f, + -0.000717f, -0.001884f, -0.001156f, -0.000033f, -0.002024f, +0.001141f, -0.000771f, -0.001363f, -0.001078f, +0.000827f, + +0.000709f, +0.000622f, +0.002286f, -0.001467f, -0.000633f, -0.001322f + }, + { + -0.001338f, +0.044481f, -0.003129f, +0.014685f, -0.001043f, +0.001503f, -0.000693f, +0.003793f, -0.008363f, +0.000284f, + +0.003523f, -0.015654f, +0.016627f, -0.006424f, -0.061584f, +0.001259f, -0.020177f, -0.017766f, -0.004779f, -0.009189f, + -0.027128f, -0.027096f, -0.003675f, -0.002089f, +0.020290f, -0.004317f, -0.016648f, +0.007686f, -0.019748f, +0.021493f, + +0.017057f, -0.002089f, +0.001721f, -0.011635f, -0.004838f, -0.002856f, +0.013549f, -0.007065f, -0.005306f, +0.000252f, + +0.004013f, -0.002207f, -0.013168f, -0.002328f, -0.004921f, +0.011601f, +0.010415f, +0.003920f, -0.006978f, +0.009535f, + +0.000035f, -0.013839f, +0.001332f, -0.002882f, -0.000396f, -0.003017f, -0.000311f, +0.007096f, +0.001803f, -0.003876f, + -0.004348f, +0.002574f, +0.000959f, +0.007197f, -0.003446f, -0.004120f, +0.001086f, -0.000901f, +0.002456f, -0.003926f, + -0.007208f, +0.002471f, -0.000294f, -0.000928f, -0.000890f, +0.000888f, -0.000470f, +0.003755f, -0.000189f, +0.001755f, + +0.000733f, +0.004264f, -0.002745f, +0.000962f, -0.002444f, +0.000075f, +0.000570f, +0.000256f, +0.000173f, +0.002866f, + +0.001428f, -0.001845f, +0.000708f, +0.001169f, -0.001273f, +0.000830f + }, + { + +0.020631f, -0.544589f, -0.018512f, -0.013048f, -0.004873f, -0.000194f, -0.003779f, -0.001673f, +0.028960f, -0.031043f, + +0.000487f, -0.010240f, +0.021500f, +0.004886f, -0.012910f, -0.009678f, +0.011416f, -0.027388f, +0.009015f, -0.016746f, + -0.019125f, +0.011265f, +0.007035f, -0.007771f, -0.016153f, -0.005303f, -0.028433f, +0.002371f, -0.009053f, +0.001458f, + +0.028181f, -0.015963f, +0.008540f, -0.019567f, +0.005644f, +0.009798f, -0.043340f, -0.012869f, -0.017386f, -0.003739f, + -0.014770f, -0.014707f, -0.000859f, -0.000218f, +0.003192f, +0.006337f, +0.012285f, -0.012297f, +0.014148f, +0.003639f, + +0.009662f, +0.003938f, -0.003893f, +0.009983f, +0.004398f, +0.002293f, -0.010331f, +0.005231f, +0.002315f, -0.000091f, + -0.000007f, +0.001219f, -0.000315f, -0.002432f, +0.009945f, +0.001488f, -0.011850f, -0.000733f, +0.004167f, +0.000327f, + +0.000148f, -0.001872f, -0.002650f, -0.001241f, -0.003020f, -0.003544f, -0.001053f, -0.001394f, +0.005086f, +0.001084f, + +0.003393f, -0.000787f, +0.002870f, +0.000689f, -0.003115f, -0.001993f, -0.001284f, -0.000496f, +0.001103f, -0.001346f, + -0.002188f, +0.000015f, -0.000277f, -0.003065f, +0.000727f, -0.000195f + }, + { + +0.002225f, +0.008703f, +0.003311f, +0.001196f, +0.006814f, +0.000252f, -0.000485f, +0.003279f, +0.003273f, +0.001918f, + +0.003559f, -0.001084f, -0.025696f, -0.031219f, -0.101872f, -0.000418f, +0.010524f, +0.003081f, -0.009022f, +0.016613f, + +0.023488f, -0.003749f, -0.022632f, -0.025018f, -0.019430f, -0.015017f, -0.018625f, -0.026295f, +0.021666f, -0.007969f, + -0.010939f, -0.015542f, -0.004414f, +0.021232f, +0.022983f, +0.007005f, +0.010131f, -0.001136f, +0.001829f, -0.018825f, + +0.006312f, -0.012259f, -0.012356f, +0.004672f, -0.004658f, -0.003456f, -0.002855f, +0.001293f, +0.004274f, +0.007461f, + -0.004654f, +0.003362f, -0.000453f, +0.011787f, +0.004524f, -0.004280f, +0.000655f, +0.012022f, -0.003143f, +0.007878f, + -0.006193f, -0.000611f, +0.008168f, -0.006656f, -0.001143f, -0.001641f, -0.004542f, +0.002703f, +0.000306f, -0.005671f, + -0.010000f, +0.001130f, -0.003854f, -0.001867f, -0.003676f, +0.003658f, +0.003208f, -0.004923f, -0.000853f, +0.000351f, + +0.000932f, -0.000261f, +0.000071f, +0.001133f, -0.001846f, -0.004085f, +0.000875f, +0.001755f, -0.001094f, +0.001219f, + +0.000427f, +0.000033f, -0.000092f, -0.001083f, +0.000130f, -0.000717f + }, + { + +0.080318f, -0.636161f, -0.045165f, +0.017000f, -0.002233f, +0.007073f, +0.014109f, +0.004157f, +0.003094f, -0.013441f, + -0.007674f, +0.000324f, +0.018041f, -0.050383f, -0.000224f, +0.011474f, -0.002365f, +0.035512f, -0.038729f, +0.003429f, + +0.011086f, +0.011379f, -0.006992f, +0.001091f, +0.004337f, +0.017367f, -0.005003f, +0.000098f, -0.011991f, -0.000234f, + +0.000294f, +0.001852f, -0.001309f, +0.004243f, -0.022085f, -0.002243f, +0.021387f, -0.013322f, +0.002417f, -0.011529f, + +0.010386f, +0.001328f, -0.000628f, -0.004420f, +0.004619f, +0.005578f, -0.018188f, +0.012652f, -0.004907f, +0.006030f, + +0.006174f, -0.003279f, +0.013184f, +0.005874f, +0.003245f, -0.000950f, +0.004827f, +0.010483f, +0.004071f, +0.001059f, + +0.000523f, -0.006216f, +0.007143f, +0.001414f, -0.004248f, +0.002209f, +0.005585f, +0.004140f, +0.002759f, +0.000611f, + -0.003351f, -0.003325f, +0.004904f, +0.000853f, -0.004839f, +0.001738f, +0.003715f, +0.000373f, -0.004954f, +0.005447f, + -0.004896f, +0.000271f, +0.004648f, +0.000431f, +0.002722f, -0.001209f, +0.003630f, -0.002121f, -0.000019f, +0.000185f, + +0.000317f, +0.002996f, -0.001719f, -0.001806f, +0.001917f, +0.001352f + }, + { + +0.002620f, +0.000722f, +0.009459f, -0.002107f, +0.002919f, +0.002269f, +0.001638f, -0.007853f, -0.007742f, +0.010364f, + -0.007370f, -0.000680f, +0.000009f, +0.018536f, -0.005557f, -0.004893f, -0.019631f, -0.068311f, +0.023913f, -0.063955f, + +0.003368f, -0.000021f, -0.006610f, -0.012985f, -0.005517f, -0.011523f, +0.008574f, +0.007674f, +0.011181f, -0.061075f, + -0.026406f, +0.009628f, +0.002541f, +0.026394f, -0.001382f, -0.001351f, -0.002778f, +0.013446f, -0.007600f, +0.003985f, + +0.007473f, -0.010073f, +0.004016f, +0.000512f, +0.000412f, +0.016358f, +0.003557f, -0.008787f, +0.003819f, +0.000352f, + -0.003527f, +0.005171f, +0.004710f, +0.004878f, -0.002418f, +0.006104f, +0.002429f, -0.013206f, +0.001789f, +0.004114f, + -0.005515f, +0.006895f, -0.006213f, +0.001606f, -0.001807f, +0.003000f, -0.008505f, +0.004395f, -0.003076f, -0.000437f, + +0.007489f, -0.001402f, -0.001588f, -0.001991f, -0.005366f, +0.001597f, -0.001511f, -0.001546f, +0.001771f, +0.004271f, + -0.001741f, -0.003633f, +0.002993f, -0.002358f, +0.003237f, -0.002383f, -0.000495f, -0.003709f, +0.002242f, -0.001037f, + +0.001289f, -0.000674f, +0.000050f, +0.000620f, +0.000135f, +0.001296f + }, + { + -0.080897f, -0.739112f, +0.049233f, +0.063673f, +0.001102f, -0.002372f, +0.012517f, +0.003736f, +0.012795f, +0.017160f, + -0.036974f, -0.010327f, -0.016589f, +0.031055f, -0.018217f, -0.001380f, -0.009335f, +0.020783f, -0.009438f, +0.000779f, + -0.008557f, -0.015449f, -0.005846f, +0.019613f, +0.013639f, +0.012027f, -0.006237f, +0.006662f, +0.008828f, -0.005041f, + -0.011019f, +0.011744f, -0.006175f, +0.012276f, -0.006911f, -0.006032f, -0.007573f, +0.013709f, +0.000975f, -0.021581f, + -0.016584f, -0.001483f, +0.001500f, -0.005756f, -0.001631f, -0.005070f, +0.013825f, +0.010140f, -0.007595f, -0.008294f, + -0.005247f, -0.008745f, +0.005839f, +0.006163f, -0.009979f, +0.007257f, +0.005120f, +0.006810f, +0.002611f, -0.000308f, + -0.003581f, -0.002245f, +0.007324f, -0.003638f, +0.001875f, -0.001313f, -0.000466f, +0.003354f, +0.001421f, +0.003200f, + -0.000945f, +0.003185f, -0.000258f, -0.003430f, -0.000650f, -0.001790f, +0.002167f, -0.000312f, +0.001982f, -0.000110f, + +0.002456f, +0.000012f, -0.000625f, +0.004271f, -0.002452f, +0.000879f, -0.001708f, -0.003106f, -0.001628f, +0.003895f, + +0.001776f, -0.001462f, -0.000877f, -0.003057f, -0.000401f, +0.003667f + }, + { + -0.008907f, -0.028148f, +0.019244f, -0.005860f, -0.027928f, +0.008389f, +0.008024f, +0.008022f, +0.004978f, +0.011274f, + -0.002151f, -0.007698f, -0.004970f, -0.045033f, -0.039265f, +0.004627f, -0.036250f, +0.025952f, +0.089757f, -0.027382f, + +0.001877f, -0.016698f, -0.011494f, -0.017552f, +0.033099f, -0.003021f, -0.002042f, -0.013061f, -0.012625f, -0.013748f, + -0.020796f, +0.003564f, +0.022319f, +0.014075f, +0.000087f, -0.006109f, +0.001781f, +0.024247f, +0.002091f, -0.023231f, + +0.007706f, -0.005499f, -0.000490f, -0.001632f, +0.011857f, +0.006749f, +0.006226f, -0.001420f, +0.009704f, -0.001694f, + +0.015089f, -0.002781f, -0.012141f, +0.000202f, -0.011444f, +0.009015f, +0.004589f, +0.000337f, -0.016216f, +0.004796f, + +0.006369f, +0.002593f, -0.001945f, -0.000858f, -0.002291f, +0.003744f, -0.001855f, -0.010943f, +0.007751f, +0.002573f, + +0.003884f, -0.006169f, -0.004338f, +0.002511f, +0.001548f, -0.001822f, +0.004515f, +0.000861f, -0.002208f, -0.002219f, + -0.000585f, +0.002481f, +0.003890f, -0.001487f, -0.001417f, -0.003005f, +0.002505f, -0.000687f, -0.000253f, -0.002506f, + +0.002614f, -0.000984f, +0.004975f, -0.002736f, +0.000697f, +0.002453f + }, + { + +0.039409f, -0.459045f, -0.003757f, +0.020210f, +0.009744f, +0.022951f, +0.034072f, +0.006016f, +0.006741f, -0.027334f, + -0.008626f, +0.023301f, +0.035180f, +0.020598f, +0.011192f, +0.007058f, -0.008607f, -0.001030f, -0.021067f, +0.013949f, + -0.031668f, -0.007264f, -0.009034f, +0.002603f, -0.011617f, +0.015683f, -0.025657f, -0.000382f, +0.009582f, +0.017995f, + +0.003942f, +0.004936f, +0.007250f, -0.015081f, -0.001733f, +0.005500f, +0.017326f, +0.001845f, +0.005906f, +0.004908f, + +0.006255f, -0.011911f, -0.008988f, -0.016326f, +0.000839f, +0.005421f, -0.008618f, -0.006688f, -0.005568f, +0.010935f, + -0.017566f, -0.014625f, +0.001423f, -0.001876f, +0.009074f, +0.002341f, +0.006883f, +0.003873f, +0.005131f, -0.003902f, + -0.007678f, -0.010520f, +0.003730f, +0.000347f, -0.000409f, -0.007079f, -0.003869f, -0.002689f, +0.004457f, +0.005375f, + -0.002403f, -0.001782f, +0.001580f, +0.003977f, +0.003525f, +0.002986f, -0.000592f, +0.001063f, -0.006665f, -0.001666f, + +0.002029f, +0.001086f, -0.005335f, +0.001620f, -0.001404f, +0.001384f, +0.000835f, -0.000168f, -0.002328f, +0.002077f, + +0.001736f, +0.001957f, -0.000563f, +0.001095f, +0.002790f, +0.001077f + }, + { + -0.004199f, +0.086956f, +0.020941f, +0.001038f, +0.017798f, +0.007116f, -0.000772f, -0.002474f, -0.008074f, +0.011171f, + +0.017834f, -0.015451f, +0.040597f, -0.012176f, -0.003977f, -0.030504f, +0.037184f, -0.012649f, +0.017870f, -0.032072f, + -0.006461f, +0.013736f, -0.026784f, +0.058725f, -0.029197f, +0.003214f, -0.006721f, +0.015868f, +0.006529f, +0.029684f, + -0.008999f, -0.024439f, +0.048660f, -0.006556f, -0.019990f, +0.015737f, -0.018320f, +0.026077f, +0.016983f, +0.026350f, + +0.018900f, -0.007070f, -0.000451f, +0.012942f, +0.011948f, -0.017656f, +0.007980f, +0.002273f, +0.009374f, +0.004425f, + -0.007115f, -0.001294f, +0.003300f, +0.001868f, -0.013917f, -0.007129f, +0.000850f, +0.002518f, -0.004037f, -0.000363f, + -0.006651f, -0.001607f, -0.000863f, +0.000792f, -0.005731f, -0.002005f, -0.006116f, +0.000023f, -0.002130f, +0.001346f, + -0.000652f, -0.000098f, +0.001957f, -0.002836f, +0.007246f, +0.006301f, -0.005899f, +0.003709f, -0.000259f, -0.002301f, + +0.006846f, +0.003393f, -0.000955f, +0.004956f, -0.002460f, +0.002530f, -0.000902f, +0.000026f, +0.003677f, -0.000668f, + +0.000603f, -0.000361f, -0.002154f, +0.001369f, +0.000816f, -0.002188f + }, + { + +0.002298f, +0.339212f, +0.002453f, +0.003012f, -0.022563f, +0.045461f, -0.030651f, -0.027328f, -0.067342f, -0.007661f, + -0.019460f, +0.012608f, -0.008771f, +0.000691f, +0.005060f, +0.010836f, +0.014855f, -0.007680f, -0.020343f, -0.001364f, + +0.010543f, -0.016068f, -0.030318f, +0.003594f, +0.018129f, +0.017583f, +0.019237f, -0.000520f, -0.024485f, -0.009586f, + +0.007032f, -0.006085f, -0.000152f, -0.002310f, +0.002019f, -0.003149f, -0.011288f, -0.015170f, -0.004144f, -0.019463f, + +0.001481f, -0.003659f, +0.006213f, +0.002513f, -0.012712f, +0.002052f, -0.006983f, -0.012344f, -0.006944f, +0.001512f, + +0.010462f, -0.009364f, +0.003559f, +0.012086f, -0.005269f, -0.000476f, +0.005995f, +0.010642f, -0.000927f, +0.002044f, + +0.005360f, +0.009135f, +0.000184f, +0.002652f, +0.004195f, +0.001943f, -0.004839f, +0.004082f, +0.009311f, +0.001380f, + +0.003498f, +0.000243f, +0.001130f, +0.003059f, -0.002287f, -0.000067f, -0.003716f, -0.003014f, -0.006375f, +0.006185f, + +0.001785f, +0.001194f, +0.000826f, -0.002618f, +0.001014f, -0.000094f, +0.001640f, +0.000848f, +0.001465f, -0.003967f, + +0.003673f, -0.001672f, +0.000447f, +0.000599f, +0.000424f, -0.000369f + }, + { + +0.012725f, +0.066439f, -0.022130f, +0.020092f, -0.004925f, +0.008762f, -0.020369f, -0.000386f, -0.018298f, -0.018650f, + -0.010526f, +0.002665f, +0.002309f, +0.046358f, -0.048192f, +0.013438f, -0.029056f, +0.010242f, -0.002876f, -0.028549f, + +0.063422f, +0.011040f, +0.002516f, -0.013353f, -0.029421f, +0.018194f, +0.027190f, +0.056331f, +0.004399f, -0.006684f, + -0.029561f, -0.003260f, -0.004350f, -0.009261f, -0.016086f, -0.022414f, +0.024066f, +0.004570f, -0.004458f, -0.003609f, + -0.015086f, -0.013056f, -0.003093f, +0.000456f, +0.001721f, +0.003189f, +0.002679f, -0.002020f, -0.009422f, -0.007117f, + -0.004463f, -0.003966f, -0.001185f, -0.003719f, +0.004719f, +0.000634f, -0.011346f, +0.004073f, -0.003353f, +0.001609f, + -0.001540f, +0.002025f, -0.001176f, -0.001677f, -0.000128f, -0.001282f, +0.003299f, -0.000862f, -0.000196f, +0.002812f, + -0.002482f, +0.007661f, +0.013327f, -0.004905f, -0.001263f, +0.005594f, -0.000237f, +0.000280f, +0.000535f, +0.002944f, + -0.004832f, -0.001531f, -0.000172f, -0.005875f, +0.000105f, +0.001352f, +0.000794f, +0.002982f, -0.004260f, -0.001227f, + +0.001927f, +0.002422f, +0.001131f, +0.001455f, -0.000777f, +0.000924f + }, + { + +0.044843f, +0.140038f, +0.006984f, -0.005066f, -0.025534f, -0.006134f, -0.002534f, +0.040641f, +0.009835f, -0.014887f, + +0.022482f, +0.042206f, -0.015513f, +0.019434f, +0.052829f, +0.021093f, +0.019417f, -0.000909f, -0.017293f, -0.000807f, + -0.030994f, -0.019961f, +0.005710f, -0.004997f, -0.006197f, -0.007801f, -0.018856f, +0.003162f, +0.007568f, +0.015643f, + -0.014475f, +0.007434f, -0.000020f, -0.005235f, -0.012237f, -0.015141f, -0.026275f, +0.015258f, -0.019523f, -0.004504f, + -0.013625f, -0.009677f, -0.008437f, -0.005588f, -0.000785f, +0.003539f, +0.000006f, -0.014023f, +0.005924f, +0.003935f, + +0.000338f, -0.003404f, -0.000094f, +0.011822f, -0.004606f, -0.009050f, +0.008352f, -0.002753f, -0.002581f, -0.002200f, + -0.001320f, +0.002526f, +0.005546f, -0.000947f, +0.002774f, -0.000011f, -0.001172f, +0.003401f, -0.003748f, +0.003248f, + -0.004529f, +0.001419f, -0.000067f, -0.000185f, +0.001205f, -0.002497f, -0.000634f, -0.003033f, +0.001391f, -0.001087f, + -0.003749f, +0.005082f, -0.001788f, -0.000727f, +0.000916f, -0.002794f, -0.000755f, +0.002575f, +0.001200f, +0.000519f, + -0.002281f, +0.002121f, -0.001473f, -0.001796f, -0.000215f, -0.000400f + } + }, + { + { + +0.003091f, +0.081387f, -0.002105f, -0.010578f, -0.028840f, +0.000940f, +0.001777f, +0.004029f, -0.008413f, +0.030725f, + -0.008660f, +0.014242f, -0.034273f, -0.001967f, -0.060902f, -0.021076f, -0.038038f, -0.027369f, +0.002537f, -0.002507f, + -0.009753f, -0.007624f, +0.008090f, -0.021772f, -0.002708f, -0.012313f, -0.031853f, -0.018806f, -0.024988f, +0.006013f, + +0.001438f, -0.008633f, -0.013809f, +0.012347f, -0.005559f, +0.021098f, +0.000934f, +0.019996f, -0.007098f, -0.004466f, + -0.011393f, +0.003005f, +0.006248f, -0.014070f, -0.008554f, +0.016067f, +0.009152f, +0.004453f, -0.002023f, +0.008696f, + +0.006024f, +0.004036f, +0.013453f, +0.007145f, +0.010178f, +0.004433f, -0.004819f, -0.003437f, +0.003143f, -0.002967f, + +0.004743f, +0.007401f, -0.002297f, -0.000800f, -0.001626f, -0.001410f, +0.000091f, -0.004468f, +0.003277f, +0.005048f, + -0.004469f, -0.003466f, +0.000379f, +0.008819f, -0.000588f, -0.000656f, +0.004241f, +0.000432f, +0.003573f, -0.000980f, + -0.000441f, +0.000950f, +0.003109f, +0.002259f, +0.001815f, -0.001372f, +0.001024f, -0.000385f, +0.001210f, -0.000353f, + +0.000262f, -0.001298f, -0.000285f, +0.002069f, +0.002705f, -0.001118f + }, + { + -0.036309f, +0.230435f, +0.021129f, +0.025687f, -0.009602f, +0.000046f, -0.001448f, -0.027572f, -0.019703f, +0.001712f, + +0.021069f, -0.010727f, -0.001285f, -0.018615f, +0.003506f, -0.043641f, +0.008123f, +0.013757f, +0.001099f, +0.003805f, + -0.010622f, -0.021659f, -0.018599f, +0.023068f, +0.000369f, +0.015254f, -0.003542f, +0.002646f, +0.005648f, -0.003560f, + -0.011633f, +0.004211f, +0.004710f, -0.019063f, +0.017094f, +0.018116f, -0.000547f, +0.012804f, -0.000098f, -0.005323f, + -0.006296f, +0.001049f, -0.001421f, +0.008259f, -0.004656f, +0.005814f, +0.002318f, +0.013279f, -0.000526f, +0.008935f, + +0.009685f, +0.009025f, +0.012803f, +0.013052f, +0.006988f, -0.006244f, +0.001812f, +0.004779f, +0.005154f, +0.012690f, + -0.003552f, +0.006703f, +0.004144f, -0.000825f, -0.004550f, +0.002402f, -0.006184f, +0.001487f, +0.003774f, -0.001221f, + +0.002513f, +0.000169f, +0.003130f, +0.001249f, +0.000582f, -0.000179f, +0.003518f, +0.000678f, -0.001150f, +0.001582f, + +0.000786f, +0.000946f, -0.000206f, -0.000024f, +0.000795f, +0.001072f, +0.001403f, +0.001642f, -0.000724f, +0.000104f, + +0.001020f, +0.001584f, +0.001015f, +0.003898f, +0.001209f, -0.002941f + }, + { + +0.000485f, +0.142915f, +0.012900f, +0.012008f, -0.024996f, +0.000188f, -0.005683f, +0.004916f, -0.007273f, -0.021421f, + -0.030361f, -0.030474f, -0.008641f, -0.000225f, -0.008646f, -0.006520f, +0.002711f, -0.009376f, +0.005378f, -0.029494f, + +0.008999f, -0.021457f, +0.009762f, -0.012429f, +0.005228f, +0.012621f, -0.001744f, +0.009353f, -0.003888f, -0.019758f, + -0.027677f, +0.015095f, -0.005816f, +0.003545f, -0.015972f, +0.001258f, -0.002868f, +0.000963f, +0.005822f, +0.011937f, + +0.001326f, -0.001565f, +0.015509f, -0.009034f, +0.004818f, +0.017308f, -0.000516f, +0.006049f, +0.012131f, -0.000906f, + +0.008680f, -0.002494f, -0.006356f, +0.004262f, +0.004124f, -0.008507f, +0.007184f, -0.003683f, +0.002284f, -0.004176f, + +0.008082f, -0.008223f, +0.005704f, -0.004461f, +0.005474f, +0.001588f, -0.001782f, +0.000288f, +0.004963f, +0.006121f, + +0.004520f, +0.000512f, +0.000582f, +0.002468f, +0.001577f, -0.003258f, -0.002339f, -0.001242f, +0.003321f, +0.001336f, + -0.001835f, -0.000505f, +0.001442f, +0.001152f, -0.002343f, -0.000381f, -0.000011f, -0.001632f, -0.000608f, -0.000006f, + +0.000600f, +0.001497f, +0.000670f, -0.001643f, +0.000321f, -0.000538f + }, + { + -0.000571f, +0.037839f, -0.001633f, +0.008792f, +0.007629f, -0.000867f, +0.002696f, -0.005183f, -0.003803f, -0.000307f, + -0.000278f, +0.001187f, +0.006800f, -0.015041f, -0.058775f, -0.023105f, -0.010176f, +0.017108f, -0.012600f, -0.026225f, + -0.026711f, -0.000076f, -0.027781f, -0.004023f, +0.024091f, -0.000020f, -0.013566f, -0.015596f, +0.009956f, +0.005643f, + +0.002518f, -0.012521f, +0.001957f, +0.021774f, -0.017734f, -0.010044f, +0.026842f, -0.017990f, +0.009626f, -0.008175f, + +0.002282f, +0.000035f, -0.011304f, -0.001677f, +0.000452f, +0.006470f, +0.002769f, -0.003559f, +0.018073f, -0.002167f, + +0.000405f, -0.005931f, -0.006448f, -0.000671f, -0.001447f, -0.002175f, -0.002167f, +0.007864f, -0.001464f, +0.002613f, + -0.004692f, -0.000342f, +0.006717f, +0.003706f, -0.004501f, +0.003155f, -0.000473f, -0.003212f, -0.001235f, +0.000730f, + -0.001430f, -0.004032f, -0.000437f, +0.001823f, -0.002247f, -0.001218f, +0.000682f, +0.005374f, +0.000638f, +0.000341f, + -0.000756f, +0.003537f, -0.000274f, +0.000378f, -0.000758f, -0.001524f, -0.000039f, -0.000914f, +0.002412f, +0.002747f, + -0.000658f, +0.000644f, -0.001442f, +0.001153f, +0.000719f, -0.000708f + }, + { + -0.057375f, -0.524580f, +0.028697f, +0.002278f, -0.006748f, -0.001346f, -0.005304f, +0.010560f, +0.005115f, -0.005109f, + -0.002848f, -0.004320f, +0.014050f, +0.000804f, -0.011296f, -0.031294f, +0.009397f, +0.011550f, -0.004410f, -0.023310f, + -0.015101f, +0.017000f, -0.016117f, +0.002324f, -0.009694f, -0.015906f, -0.017855f, -0.005576f, -0.016546f, +0.010638f, + +0.016817f, +0.002301f, -0.008016f, -0.009758f, +0.006565f, +0.008045f, -0.031201f, -0.030625f, -0.017918f, +0.002012f, + -0.010050f, -0.008519f, -0.007924f, +0.001232f, +0.000292f, +0.001855f, +0.012656f, -0.010444f, +0.007476f, +0.013735f, + +0.003651f, -0.001262f, +0.004501f, +0.010433f, +0.005345f, -0.002812f, -0.006104f, +0.004955f, -0.005074f, +0.004548f, + +0.000975f, -0.000802f, -0.001628f, -0.000103f, +0.003203f, +0.002483f, -0.006925f, -0.001237f, +0.003993f, +0.000424f, + -0.001128f, -0.003690f, -0.005389f, -0.000671f, -0.005793f, -0.001057f, -0.000810f, -0.000591f, +0.003074f, +0.001886f, + +0.000689f, +0.001210f, +0.001250f, +0.000900f, -0.000855f, -0.004078f, -0.000015f, +0.000405f, -0.002386f, -0.002207f, + +0.000477f, -0.001569f, +0.001138f, -0.003276f, +0.000525f, -0.001884f + }, + { + -0.001142f, +0.032121f, -0.004059f, +0.002456f, -0.000491f, +0.000456f, +0.001638f, -0.002538f, +0.007975f, +0.007849f, + -0.011193f, -0.003476f, -0.012784f, -0.055394f, -0.122561f, +0.023018f, +0.001753f, +0.000199f, +0.011903f, +0.020517f, + -0.006322f, -0.029939f, -0.000293f, -0.020400f, -0.025045f, -0.024170f, -0.003550f, -0.028974f, +0.018223f, -0.004994f, + -0.020189f, -0.002634f, -0.021628f, +0.024729f, +0.026565f, +0.007471f, +0.003003f, +0.000990f, -0.001811f, -0.000921f, + -0.007937f, -0.011244f, -0.007808f, -0.009469f, +0.007376f, -0.007163f, -0.000001f, +0.006807f, +0.003112f, -0.006667f, + +0.003667f, +0.001405f, +0.005269f, -0.000208f, +0.008434f, +0.003683f, -0.003418f, +0.011780f, +0.000130f, +0.004348f, + -0.009085f, +0.000143f, +0.003966f, -0.002744f, -0.003467f, -0.004726f, +0.004819f, -0.003432f, +0.001575f, -0.001088f, + -0.005166f, -0.001008f, -0.006653f, -0.006791f, -0.000208f, +0.000304f, +0.005989f, -0.001470f, -0.002967f, +0.004616f, + -0.000818f, -0.000891f, -0.000085f, +0.000249f, -0.003161f, -0.000172f, -0.001339f, +0.002552f, -0.000754f, +0.000324f, + -0.000032f, +0.000172f, -0.000358f, -0.001366f, +0.002110f, -0.001501f + }, + { + -0.122157f, -0.480561f, +0.029047f, +0.032963f, -0.003092f, +0.003405f, +0.007549f, -0.009667f, +0.018425f, +0.019627f, + -0.009524f, -0.007978f, -0.006493f, -0.024509f, -0.023473f, +0.009452f, +0.016037f, +0.012291f, -0.015130f, -0.001733f, + +0.010521f, +0.001539f, -0.016203f, +0.013262f, +0.008092f, +0.007050f, -0.002102f, +0.006422f, +0.001781f, -0.014928f, + -0.001528f, +0.010994f, -0.004869f, +0.000314f, -0.008404f, -0.006747f, +0.005774f, -0.013230f, +0.009990f, -0.001660f, + +0.003805f, -0.005046f, +0.010811f, -0.009618f, +0.009613f, +0.000992f, -0.008823f, -0.005099f, +0.005320f, +0.009216f, + +0.003984f, +0.014633f, -0.011005f, +0.004518f, +0.010782f, -0.003789f, +0.006557f, +0.007928f, +0.003240f, +0.001543f, + +0.000741f, +0.001545f, +0.000687f, +0.006973f, -0.004696f, +0.003287f, +0.000691f, +0.004629f, -0.001736f, +0.002104f, + +0.002652f, -0.002181f, -0.000981f, -0.001167f, +0.002300f, -0.000022f, +0.001484f, +0.002991f, -0.003092f, +0.002276f, + -0.002221f, -0.000369f, +0.002345f, +0.002174f, +0.001856f, -0.000420f, +0.002364f, +0.000321f, -0.000559f, -0.000170f, + +0.000125f, +0.000761f, +0.000348f, +0.000811f, +0.000278f, +0.003071f + }, + { + -0.000760f, +0.032893f, -0.013185f, +0.004698f, +0.000084f, +0.003938f, +0.002499f, +0.002773f, -0.014514f, +0.004307f, + -0.011834f, +0.005092f, +0.013202f, +0.003475f, -0.011451f, -0.018000f, -0.025698f, -0.029963f, -0.018131f, -0.041165f, + +0.009068f, -0.024590f, +0.015884f, -0.021340f, -0.003092f, +0.006119f, -0.001231f, +0.024384f, -0.023081f, -0.053406f, + -0.021385f, +0.014405f, -0.008009f, +0.025960f, +0.007350f, -0.006416f, -0.003975f, +0.020776f, -0.014153f, +0.011659f, + +0.016662f, -0.019590f, +0.011423f, -0.008120f, +0.006666f, +0.004622f, +0.007083f, +0.003389f, -0.010968f, +0.002753f, + -0.001890f, +0.014628f, -0.004344f, +0.007131f, +0.008048f, +0.003054f, -0.004403f, -0.005422f, -0.003327f, +0.001748f, + -0.001939f, -0.002301f, -0.000890f, +0.004015f, +0.001360f, -0.004370f, -0.002275f, +0.002521f, -0.003108f, -0.000245f, + +0.006028f, +0.000246f, -0.002851f, -0.000699f, -0.000785f, -0.003438f, +0.000257f, -0.000364f, +0.001194f, +0.003953f, + -0.002981f, -0.003879f, +0.003783f, -0.001844f, +0.001097f, -0.001814f, +0.000045f, -0.002593f, +0.000709f, +0.000497f, + +0.001428f, -0.001726f, +0.000202f, -0.000597f, +0.001544f, +0.000176f + }, + { + +0.025685f, -0.805313f, -0.017354f, +0.070208f, +0.012320f, -0.012268f, +0.017586f, +0.004167f, +0.013661f, +0.004836f, + +0.018685f, -0.060088f, -0.014604f, +0.014468f, +0.016017f, -0.039987f, +0.018917f, +0.016834f, -0.004505f, -0.004577f, + +0.002369f, -0.026276f, -0.003990f, +0.020506f, +0.014803f, +0.002069f, +0.003418f, +0.001864f, +0.003374f, +0.003091f, + -0.001247f, -0.003149f, -0.009321f, +0.018435f, -0.006695f, -0.009637f, +0.002353f, +0.005864f, -0.012797f, -0.010389f, + -0.021896f, -0.004807f, -0.002708f, +0.003316f, -0.004380f, -0.004137f, +0.011847f, +0.009092f, -0.009387f, -0.000312f, + -0.002130f, -0.013872f, +0.008418f, -0.004367f, +0.008675f, -0.000861f, +0.005738f, +0.007324f, +0.001427f, -0.000138f, + -0.004228f, -0.001744f, +0.001090f, +0.000254f, +0.001479f, +0.001685f, +0.000010f, -0.001330f, +0.002859f, +0.001362f, + +0.003398f, +0.001066f, -0.004624f, -0.000964f, +0.002047f, -0.000734f, +0.000085f, +0.002975f, -0.001332f, +0.000629f, + +0.001496f, +0.000608f, +0.000317f, +0.003814f, -0.001362f, -0.002614f, -0.001324f, -0.002539f, -0.000877f, +0.002605f, + +0.001458f, -0.001138f, -0.001571f, -0.001199f, -0.001239f, +0.003210f + }, + { + +0.008200f, +0.044704f, -0.038442f, -0.018640f, -0.021192f, -0.007693f, +0.021577f, +0.021272f, -0.007028f, +0.017437f, + -0.022143f, -0.004330f, -0.021040f, -0.046429f, -0.023205f, +0.000286f, -0.008460f, +0.011453f, +0.025724f, +0.027501f, + +0.006846f, -0.018262f, -0.011418f, -0.010918f, +0.008194f, +0.004166f, -0.007210f, -0.022483f, -0.012194f, -0.007498f, + -0.002159f, -0.008694f, +0.020384f, +0.029882f, -0.010816f, +0.000655f, -0.013945f, +0.039991f, +0.002288f, -0.020713f, + -0.001130f, +0.002681f, -0.015608f, +0.010082f, +0.003730f, +0.013380f, +0.002938f, +0.004303f, +0.003862f, +0.006163f, + +0.009865f, -0.001893f, -0.002906f, -0.008900f, -0.004511f, -0.000081f, +0.002845f, +0.002470f, -0.006946f, -0.000211f, + +0.011752f, +0.002656f, -0.007996f, +0.003399f, -0.001872f, -0.000318f, -0.005685f, -0.006841f, +0.008605f, -0.000146f, + +0.009556f, -0.005731f, -0.007100f, +0.000719f, +0.004350f, +0.003139f, +0.000730f, -0.000628f, -0.001258f, -0.003879f, + +0.002635f, -0.001982f, +0.002819f, +0.002350f, -0.000936f, -0.002172f, +0.000172f, +0.000233f, -0.002452f, -0.000700f, + +0.001779f, +0.000997f, +0.003106f, -0.002027f, +0.001311f, +0.001847f + }, + { + -0.042311f, -0.452011f, +0.051289f, +0.041399f, -0.034327f, +0.050550f, -0.004465f, +0.026235f, -0.016203f, -0.011835f, + -0.012186f, +0.018686f, +0.030761f, +0.064479f, -0.024074f, +0.010115f, -0.020790f, +0.002987f, -0.016940f, +0.009372f, + -0.006419f, -0.009281f, -0.013487f, -0.019695f, +0.007747f, -0.000922f, -0.010549f, -0.003180f, +0.001437f, +0.020801f, + +0.011350f, +0.001190f, +0.001948f, -0.005226f, +0.005804f, +0.008600f, -0.001458f, +0.005603f, -0.010457f, +0.014086f, + +0.007991f, -0.007994f, -0.015162f, -0.008895f, -0.004738f, +0.004031f, -0.004317f, +0.000358f, +0.005657f, -0.010116f, + -0.016546f, -0.012593f, -0.005030f, +0.014736f, +0.002071f, +0.007723f, -0.003338f, -0.000818f, +0.011004f, -0.005375f, + -0.005942f, -0.010744f, +0.003607f, +0.001463f, -0.003983f, -0.002249f, -0.005592f, -0.005789f, +0.006402f, -0.001865f, + +0.000789f, +0.005282f, -0.000043f, +0.001430f, +0.007797f, -0.001027f, +0.000654f, -0.001966f, -0.006429f, +0.001248f, + +0.001761f, -0.000434f, -0.004234f, +0.000532f, +0.001458f, +0.001430f, +0.000634f, -0.000662f, -0.001398f, +0.000923f, + +0.001439f, +0.001223f, +0.001890f, +0.001111f, +0.000722f, +0.000397f + }, + { + +0.002259f, +0.106395f, -0.017351f, +0.015495f, +0.019465f, +0.013759f, -0.001503f, -0.009749f, -0.004534f, +0.005224f, + +0.003961f, +0.003127f, +0.001052f, -0.037143f, +0.085397f, -0.022473f, -0.013952f, -0.003053f, +0.047182f, -0.029161f, + -0.007617f, -0.004450f, +0.007316f, +0.017262f, -0.011686f, -0.021996f, +0.016229f, +0.024830f, +0.006979f, +0.011091f, + +0.009692f, -0.005625f, +0.028276f, -0.012551f, -0.008755f, +0.004577f, -0.005679f, +0.013162f, +0.029397f, +0.015354f, + +0.016703f, -0.001373f, +0.001052f, +0.014815f, +0.002397f, +0.009290f, -0.001110f, -0.005603f, +0.005764f, +0.004650f, + -0.004019f, +0.006360f, -0.011002f, +0.000365f, -0.006924f, -0.000450f, +0.004167f, -0.007621f, +0.007666f, -0.006014f, + -0.006650f, -0.006389f, +0.002819f, -0.000694f, -0.005152f, -0.007919f, +0.005728f, -0.002491f, +0.000766f, -0.003786f, + +0.001690f, -0.002938f, -0.002578f, +0.007762f, +0.004516f, +0.000345f, -0.002812f, +0.004313f, +0.002395f, -0.001031f, + +0.001088f, +0.004668f, +0.000165f, +0.001578f, -0.000246f, -0.000869f, -0.000582f, +0.001578f, +0.001405f, +0.002050f, + -0.001231f, -0.001117f, +0.000173f, +0.002386f, -0.002322f, +0.001096f + }, + { + +0.058638f, +0.311273f, -0.060785f, +0.053216f, -0.034413f, -0.012509f, -0.010020f, -0.023015f, -0.042282f, -0.036280f, + -0.016863f, -0.021451f, +0.007721f, +0.001967f, -0.002726f, +0.032639f, -0.012406f, +0.012928f, -0.021442f, -0.010014f, + +0.028820f, -0.037307f, -0.017789f, +0.020164f, +0.024725f, +0.007371f, +0.008743f, +0.012956f, -0.000377f, -0.011854f, + -0.009506f, +0.003340f, -0.022993f, +0.015735f, +0.004227f, -0.003652f, -0.003305f, -0.029900f, -0.007864f, -0.002481f, + -0.002888f, -0.011748f, +0.015481f, -0.009183f, -0.003682f, -0.008225f, +0.007224f, -0.004175f, -0.016754f, -0.003337f, + +0.001761f, +0.000814f, -0.006594f, +0.018997f, -0.007854f, +0.008393f, +0.004215f, +0.012199f, +0.000726f, -0.005618f, + +0.009135f, +0.004216f, +0.001270f, +0.003155f, +0.007376f, +0.002357f, -0.002263f, +0.003277f, +0.003982f, +0.003523f, + +0.005760f, -0.000764f, +0.004121f, +0.000881f, +0.001181f, -0.003410f, -0.003781f, -0.004898f, -0.000493f, +0.000782f, + +0.007891f, -0.004445f, +0.002955f, -0.002586f, -0.003481f, +0.006396f, -0.000201f, -0.002521f, +0.002563f, -0.000610f, + +0.000453f, +0.000919f, -0.000983f, +0.002478f, -0.000046f, -0.001704f + }, + { + -0.013075f, +0.028277f, +0.031233f, +0.007587f, +0.009707f, +0.012450f, -0.024221f, -0.011472f, +0.003425f, -0.023398f, + -0.001625f, -0.000733f, +0.005023f, -0.045671f, +0.080458f, -0.007846f, +0.020259f, -0.016728f, -0.035549f, +0.045057f, + +0.007571f, +0.022106f, -0.004725f, -0.025370f, -0.024754f, +0.008890f, +0.029855f, +0.046911f, -0.010314f, -0.007283f, + -0.009168f, -0.020397f, -0.010245f, -0.000696f, -0.028426f, +0.008466f, +0.003212f, +0.004968f, -0.007648f, -0.008298f, + -0.011456f, -0.006274f, +0.001689f, -0.007271f, -0.000134f, +0.011624f, -0.007386f, +0.000266f, -0.009134f, -0.002043f, + -0.011926f, +0.006286f, -0.009159f, +0.002445f, +0.002983f, -0.000351f, -0.012069f, -0.006581f, +0.006416f, -0.004957f, + +0.007452f, -0.000280f, +0.001211f, -0.000582f, +0.003736f, +0.001015f, -0.006923f, -0.002933f, +0.006327f, +0.002946f, + +0.004039f, +0.007095f, +0.006879f, -0.000936f, -0.004127f, +0.005624f, +0.000667f, -0.001959f, +0.000130f, +0.001895f, + -0.002837f, +0.000210f, +0.001185f, -0.003305f, -0.002725f, -0.001614f, +0.002686f, +0.001269f, -0.002406f, -0.001087f, + +0.002665f, +0.000571f, +0.000735f, +0.001687f, +0.000549f, -0.000553f + }, + { + -0.013250f, +0.234976f, -0.016168f, +0.005440f, -0.028913f, -0.037036f, +0.025841f, +0.018984f, +0.012348f, +0.003827f, + +0.028332f, +0.031882f, +0.006628f, +0.024538f, +0.018084f, -0.000749f, +0.039763f, -0.012616f, +0.005348f, -0.004504f, + -0.021849f, -0.008184f, -0.003840f, -0.012582f, +0.012831f, -0.044394f, +0.003454f, -0.006095f, +0.000526f, +0.038086f, + -0.009850f, +0.006569f, -0.012265f, -0.010140f, -0.007133f, -0.015284f, -0.006076f, -0.025639f, +0.011146f, -0.020633f, + -0.016465f, +0.008758f, -0.024292f, +0.008557f, -0.005315f, -0.000338f, -0.004677f, -0.006637f, +0.019277f, -0.000349f, + -0.000241f, -0.006518f, -0.003574f, +0.003682f, +0.006344f, -0.003303f, -0.002590f, -0.000450f, +0.003446f, -0.002083f, + -0.004603f, +0.004946f, +0.000280f, +0.003570f, +0.001490f, -0.002618f, -0.003419f, +0.001733f, +0.002889f, -0.001841f, + -0.001400f, -0.000386f, +0.001974f, +0.000734f, -0.000336f, +0.000048f, -0.005330f, -0.000693f, -0.000777f, +0.001095f, + -0.003697f, +0.000924f, +0.001608f, -0.003862f, -0.000057f, +0.001594f, +0.001077f, -0.000625f, +0.003646f, -0.001970f, + +0.001473f, +0.000312f, -0.000152f, -0.001266f, -0.002025f, -0.001349f + } + }, + { + { + -0.002566f, +0.050243f, -0.021820f, +0.028525f, +0.011430f, +0.001468f, +0.007022f, +0.013800f, -0.002760f, +0.018414f, + -0.017799f, +0.026106f, -0.035899f, +0.001282f, -0.049750f, +0.024153f, +0.004952f, -0.001625f, +0.013911f, -0.028400f, + -0.025181f, -0.025635f, -0.006846f, -0.050474f, -0.016863f, +0.010870f, -0.018228f, -0.009710f, -0.020818f, -0.021245f, + -0.019514f, -0.004513f, -0.001076f, +0.014366f, -0.010333f, +0.017673f, +0.003909f, +0.017552f, -0.012832f, +0.003536f, + -0.005216f, -0.001329f, +0.004082f, -0.004091f, +0.004817f, +0.010463f, -0.001472f, +0.005808f, -0.001428f, +0.003463f, + +0.000282f, -0.003525f, +0.005074f, -0.000375f, +0.001501f, +0.000588f, -0.008256f, -0.001738f, +0.009027f, +0.003663f, + +0.007955f, +0.004412f, -0.001117f, +0.009407f, +0.006994f, +0.001377f, -0.000601f, -0.001357f, -0.000137f, +0.004018f, + +0.001633f, +0.000941f, +0.002567f, +0.005381f, -0.002454f, +0.001953f, +0.003649f, -0.003191f, +0.002459f, +0.000953f, + +0.001047f, -0.002951f, -0.000873f, -0.000338f, +0.002223f, -0.001168f, +0.000037f, +0.000767f, +0.002091f, +0.000296f, + -0.000234f, -0.002239f, -0.000639f, +0.000741f, +0.001091f, -0.000850f + }, + { + +0.031258f, +0.198943f, -0.055473f, -0.004978f, -0.027515f, +0.003763f, -0.005648f, -0.006877f, +0.004195f, -0.016032f, + -0.021589f, -0.029254f, +0.011252f, -0.014059f, +0.015920f, -0.012498f, +0.015912f, +0.003185f, -0.000629f, +0.002111f, + +0.007988f, +0.016625f, -0.004555f, +0.005553f, -0.014049f, +0.018473f, -0.004210f, +0.005625f, +0.014339f, +0.006522f, + -0.012755f, -0.004338f, -0.001764f, -0.010768f, +0.006873f, -0.003716f, -0.004206f, +0.003700f, -0.005152f, -0.009998f, + -0.015643f, -0.013013f, -0.003940f, +0.009851f, -0.017450f, -0.000948f, +0.000208f, +0.011900f, -0.009614f, -0.000424f, + +0.005480f, -0.000687f, -0.001665f, +0.003607f, -0.003998f, -0.010376f, +0.000358f, -0.000352f, -0.001341f, +0.004166f, + -0.005607f, +0.005170f, +0.001371f, -0.000453f, -0.003051f, +0.004055f, -0.002601f, +0.007404f, +0.003659f, -0.000560f, + +0.000994f, +0.001183f, +0.005849f, +0.001101f, +0.003811f, +0.002199f, +0.004931f, +0.000281f, -0.002506f, -0.002770f, + -0.002114f, +0.004608f, +0.000795f, -0.002365f, +0.000317f, +0.002861f, +0.000644f, +0.000528f, -0.001439f, +0.000641f, + +0.001558f, +0.001303f, -0.000141f, +0.001369f, +0.000670f, -0.000965f + }, + { + +0.001699f, +0.046089f, -0.041345f, +0.061538f, +0.007330f, -0.004926f, -0.012212f, -0.000898f, -0.000443f, +0.007311f, + +0.027081f, +0.009992f, -0.005483f, +0.026352f, +0.021770f, -0.002565f, +0.008272f, +0.022312f, +0.029746f, -0.020978f, + +0.020356f, -0.026694f, +0.012265f, -0.007309f, -0.011570f, -0.000646f, -0.016386f, -0.012875f, -0.012317f, -0.011825f, + -0.013146f, +0.024118f, -0.012253f, +0.003473f, -0.012371f, -0.003687f, -0.000084f, +0.007405f, -0.003772f, +0.013768f, + +0.004949f, -0.001357f, +0.009149f, -0.015006f, +0.005012f, +0.014057f, -0.001135f, +0.001564f, +0.000611f, -0.006245f, + +0.009095f, +0.000132f, -0.008078f, -0.004828f, -0.004210f, -0.009455f, +0.000496f, -0.005005f, +0.005948f, -0.004161f, + +0.007787f, -0.007033f, +0.008708f, -0.001439f, +0.000755f, -0.000305f, -0.001130f, +0.000842f, +0.007512f, +0.001413f, + -0.002556f, -0.002037f, -0.001264f, -0.001353f, -0.000618f, -0.003439f, -0.001907f, -0.001310f, -0.001791f, -0.002990f, + -0.001456f, -0.000716f, -0.000634f, -0.000035f, -0.001545f, +0.000349f, +0.002279f, -0.000001f, -0.001116f, +0.000376f, + +0.000120f, -0.000577f, -0.000709f, -0.000618f, +0.002032f, +0.001678f + }, + { + +0.002206f, +0.049686f, +0.005171f, -0.004706f, +0.000055f, -0.000640f, +0.001054f, -0.004375f, +0.002514f, -0.004793f, + -0.008648f, -0.002761f, +0.011035f, -0.008814f, -0.025100f, +0.055083f, +0.037973f, +0.001240f, +0.002888f, +0.005272f, + +0.015055f, +0.029624f, -0.018822f, +0.004228f, -0.001092f, +0.014498f, +0.015840f, -0.039602f, -0.000981f, -0.016882f, + -0.010398f, +0.001517f, -0.009844f, +0.022840f, -0.000173f, -0.018111f, +0.012897f, -0.017202f, -0.002832f, -0.012515f, + -0.000278f, +0.006011f, +0.004881f, +0.012970f, +0.008922f, -0.013004f, -0.018170f, -0.007652f, +0.009280f, -0.008191f, + +0.005372f, -0.002470f, -0.005908f, -0.002611f, -0.000944f, +0.005721f, +0.003272f, +0.002276f, +0.000983f, +0.012590f, + +0.005404f, -0.000047f, -0.002825f, -0.000642f, -0.001849f, +0.005765f, +0.001177f, +0.001677f, +0.000466f, -0.000479f, + +0.005264f, -0.000244f, -0.002695f, +0.001555f, +0.002573f, +0.001559f, -0.001698f, +0.001070f, -0.001582f, -0.001432f, + -0.003298f, +0.000166f, +0.000616f, +0.001584f, -0.000256f, -0.000590f, -0.001196f, -0.002873f, +0.000070f, -0.000132f, + -0.000909f, +0.000979f, -0.001834f, +0.000771f, +0.000026f, -0.002048f + }, + { + +0.082802f, -0.453920f, -0.052884f, +0.032903f, +0.010915f, +0.003417f, -0.000950f, +0.015352f, +0.001570f, -0.009642f, + -0.020646f, -0.008426f, +0.013104f, -0.008035f, -0.010178f, -0.011401f, +0.032779f, +0.018314f, -0.001492f, -0.004101f, + -0.000646f, +0.001192f, -0.038415f, +0.008768f, -0.000426f, -0.001639f, +0.005182f, -0.014514f, -0.028909f, +0.017711f, + +0.018535f, -0.002348f, -0.017394f, -0.002436f, +0.005236f, -0.001011f, +0.010140f, +0.014976f, +0.015728f, +0.015718f, + -0.004432f, -0.005108f, -0.020824f, -0.012388f, +0.004889f, -0.001585f, -0.003633f, -0.006022f, +0.009209f, -0.001272f, + -0.010485f, -0.003515f, +0.004859f, +0.007285f, +0.002892f, -0.007877f, -0.004853f, +0.003672f, -0.007891f, +0.003877f, + +0.000538f, -0.003084f, -0.006010f, -0.002152f, -0.000321f, +0.004286f, +0.002451f, +0.002233f, +0.001687f, -0.000851f, + -0.000122f, -0.002488f, -0.003709f, +0.000979f, -0.008688f, -0.000356f, -0.001173f, -0.002072f, +0.000494f, -0.000807f, + -0.000018f, -0.000481f, -0.000255f, +0.003017f, -0.000827f, -0.003152f, +0.002407f, +0.001222f, -0.002147f, -0.001013f, + +0.002192f, -0.000247f, +0.003126f, -0.001728f, +0.001194f, -0.001510f + }, + { + -0.001211f, +0.011767f, -0.015865f, +0.004095f, -0.002175f, -0.000264f, +0.000167f, -0.003743f, -0.000074f, -0.007224f, + -0.016004f, +0.007629f, +0.003442f, -0.012207f, -0.085480f, -0.030291f, -0.042527f, +0.007336f, +0.001050f, +0.014144f, + +0.006649f, -0.017294f, +0.012156f, -0.016617f, -0.018035f, -0.004598f, -0.005620f, -0.040828f, -0.023829f, -0.036970f, + -0.004837f, +0.019374f, -0.022176f, -0.006600f, -0.002495f, -0.001170f, -0.004192f, +0.005781f, +0.004302f, +0.002909f, + -0.006845f, -0.000873f, +0.001394f, -0.011908f, +0.001089f, -0.007263f, +0.001830f, +0.010187f, +0.001553f, -0.011092f, + +0.001499f, -0.000197f, +0.000850f, -0.007207f, +0.010824f, +0.002556f, -0.011458f, +0.004570f, -0.002615f, +0.007354f, + -0.004185f, -0.000496f, +0.001872f, -0.001345f, -0.002572f, -0.003841f, +0.006188f, +0.001707f, +0.005595f, +0.003035f, + +0.003054f, +0.004094f, -0.004872f, -0.002538f, +0.001791f, -0.005905f, +0.001271f, +0.001067f, +0.000657f, +0.004841f, + -0.001849f, +0.000122f, +0.000799f, -0.000365f, -0.000481f, +0.001678f, -0.001103f, +0.002701f, -0.001811f, -0.000349f, + +0.001470f, +0.001442f, -0.001384f, -0.001096f, +0.002507f, -0.001344f + }, + { + +0.135466f, -0.286606f, -0.088552f, +0.074547f, +0.020597f, -0.000041f, -0.002505f, -0.029607f, +0.000737f, +0.009254f, + -0.004735f, -0.002090f, -0.015279f, -0.011747f, -0.010004f, +0.021745f, +0.013569f, +0.012098f, +0.010462f, +0.003975f, + +0.002587f, -0.012558f, -0.017768f, +0.004486f, -0.001982f, +0.001139f, -0.000595f, +0.012838f, +0.010828f, +0.000983f, + +0.000814f, -0.003899f, -0.010347f, +0.006290f, -0.005118f, -0.009242f, -0.002472f, -0.026311f, -0.001589f, -0.001750f, + +0.004484f, -0.000250f, +0.020851f, +0.003278f, +0.022529f, +0.008881f, +0.000229f, -0.003288f, +0.001900f, +0.003063f, + -0.002302f, +0.013527f, -0.014419f, +0.001365f, +0.011241f, -0.006377f, +0.002927f, -0.002772f, -0.002777f, -0.000552f, + +0.001864f, +0.008657f, +0.001139f, +0.004247f, +0.000376f, +0.003313f, -0.009999f, -0.002908f, -0.003157f, +0.005425f, + +0.005188f, -0.000723f, -0.002211f, -0.003227f, +0.003728f, +0.000074f, +0.000485f, +0.005550f, -0.000013f, +0.001991f, + -0.000693f, +0.000186f, -0.000246f, -0.001640f, -0.000327f, -0.001451f, +0.000743f, +0.000211f, -0.000003f, +0.002191f, + -0.000323f, -0.000455f, +0.001371f, +0.000525f, -0.001208f, +0.000135f + }, + { + -0.002414f, +0.011490f, -0.028637f, +0.003873f, +0.000969f, +0.001238f, +0.001459f, +0.003134f, -0.013109f, +0.003023f, + -0.006935f, +0.009091f, +0.002716f, -0.026839f, -0.031040f, +0.013358f, +0.030399f, +0.004491f, -0.022638f, -0.000253f, + +0.062826f, +0.011166f, +0.045874f, -0.002140f, -0.002421f, +0.018455f, +0.013079f, +0.024082f, -0.026608f, -0.003164f, + +0.016162f, +0.011927f, -0.000648f, +0.037219f, +0.015790f, +0.000455f, +0.001715f, +0.013421f, +0.000240f, +0.012526f, + +0.006067f, -0.017621f, +0.009896f, -0.000535f, +0.009024f, -0.004386f, -0.000605f, +0.011239f, +0.000217f, +0.002500f, + -0.002466f, +0.002436f, -0.010355f, -0.000400f, -0.002353f, +0.004953f, -0.003590f, +0.000817f, -0.002473f, -0.003487f, + -0.001319f, -0.005576f, -0.002300f, +0.004305f, -0.001024f, -0.005828f, +0.002304f, +0.000752f, -0.003471f, +0.001535f, + +0.004792f, -0.001871f, -0.002343f, +0.000561f, -0.001081f, -0.002429f, +0.001250f, +0.001103f, +0.002109f, +0.002668f, + +0.000617f, -0.001707f, +0.003047f, +0.002003f, -0.000503f, -0.002887f, +0.002116f, -0.000876f, +0.001503f, -0.000749f, + -0.000294f, -0.002157f, -0.001293f, -0.000861f, +0.000640f, -0.001171f + }, + { + +0.030096f, -0.756684f, +0.003793f, +0.098305f, +0.025058f, -0.019077f, +0.002018f, -0.003209f, +0.015145f, -0.005568f, + +0.041332f, -0.008948f, +0.023168f, +0.029575f, +0.046400f, -0.029127f, -0.000739f, -0.009932f, -0.005639f, -0.012007f, + -0.003657f, -0.015577f, +0.000007f, +0.011252f, -0.001913f, -0.006464f, -0.006548f, -0.011455f, -0.000878f, +0.002049f, + -0.014646f, -0.012086f, -0.002280f, +0.006883f, -0.018290f, -0.002953f, +0.010487f, -0.005768f, -0.017791f, +0.002817f, + -0.008054f, -0.001948f, -0.002135f, -0.001634f, -0.003537f, -0.001936f, +0.000439f, +0.002270f, -0.000697f, +0.020765f, + +0.013671f, -0.009032f, +0.005923f, -0.007708f, +0.009220f, +0.001798f, +0.003535f, +0.003276f, +0.007288f, +0.004788f, + -0.004505f, -0.001707f, -0.003830f, -0.001555f, +0.002900f, +0.000921f, -0.000942f, -0.000499f, +0.005753f, +0.003055f, + +0.004975f, +0.002011f, -0.004309f, +0.000448f, +0.003406f, -0.001685f, -0.002351f, +0.001952f, -0.001225f, -0.001170f, + -0.001439f, +0.000847f, +0.000268f, +0.001420f, -0.001153f, -0.000409f, +0.000669f, -0.003064f, -0.002659f, +0.001436f, + +0.001467f, -0.000937f, -0.000380f, +0.000306f, -0.002249f, +0.002778f + }, + { + -0.006837f, +0.100197f, +0.015638f, -0.008790f, -0.004280f, -0.013353f, +0.012328f, +0.011263f, -0.007036f, +0.019344f, + -0.027670f, -0.010086f, -0.003162f, -0.019425f, -0.017903f, +0.009061f, +0.002487f, -0.013855f, -0.034001f, +0.022736f, + +0.023883f, -0.021315f, -0.017268f, -0.023111f, -0.019974f, -0.006857f, +0.004658f, -0.005402f, -0.000253f, +0.016251f, + +0.013404f, -0.007935f, -0.006274f, +0.016326f, -0.015162f, -0.001316f, -0.017824f, +0.020789f, -0.004130f, -0.011622f, + -0.003301f, -0.002392f, -0.008529f, +0.012405f, -0.010852f, +0.007662f, +0.000480f, +0.006536f, +0.008694f, -0.001209f, + -0.005843f, -0.007870f, +0.002416f, -0.004406f, +0.000694f, -0.002184f, -0.003417f, -0.002860f, -0.009874f, -0.001979f, + +0.010102f, +0.001850f, -0.007556f, -0.000379f, -0.004435f, +0.004246f, +0.001268f, -0.006149f, +0.001490f, +0.000634f, + +0.011285f, -0.000016f, -0.002008f, +0.003784f, +0.005115f, -0.000288f, -0.000973f, +0.000490f, +0.002703f, +0.000239f, + +0.005629f, -0.002311f, -0.000073f, +0.000409f, -0.001165f, -0.000596f, +0.001168f, +0.001640f, -0.000055f, -0.000378f, + -0.000522f, -0.000066f, +0.000677f, -0.003274f, -0.000004f, +0.000363f + }, + { + +0.044810f, -0.457175f, -0.046238f, +0.012416f, -0.065660f, -0.027118f, -0.084625f, +0.027609f, +0.018007f, -0.002269f, + -0.016419f, +0.010204f, -0.010281f, +0.009962f, -0.051262f, +0.007548f, -0.018027f, +0.001750f, -0.013757f, +0.002932f, + +0.002536f, -0.004233f, -0.019185f, -0.017684f, +0.001916f, -0.015993f, -0.000736f, +0.000444f, -0.009565f, -0.002890f, + -0.000176f, +0.000823f, +0.008088f, +0.000826f, -0.004659f, +0.004710f, -0.004058f, +0.007345f, -0.003298f, +0.009113f, + -0.001658f, -0.008746f, -0.003724f, +0.002164f, -0.003945f, +0.005460f, -0.003665f, +0.003964f, +0.008207f, -0.000847f, + +0.002389f, -0.002888f, -0.001857f, +0.011846f, -0.003870f, +0.006948f, -0.003251f, -0.000119f, +0.008856f, -0.002719f, + +0.003116f, -0.001525f, +0.004958f, -0.000355f, -0.003304f, +0.000657f, -0.002718f, -0.006095f, +0.001833f, -0.006344f, + -0.001948f, +0.003510f, -0.001269f, -0.001211f, +0.003429f, -0.005775f, -0.002970f, +0.000482f, -0.002008f, +0.003699f, + +0.001770f, +0.000074f, +0.000060f, +0.000265f, +0.000764f, +0.002264f, -0.001463f, -0.000357f, -0.000845f, -0.000867f, + +0.000731f, -0.000542f, +0.001263f, +0.001804f, -0.000516f, -0.001019f + }, + { + +0.000143f, +0.103642f, -0.025321f, +0.008449f, +0.002453f, +0.010869f, +0.007456f, -0.012230f, +0.002676f, -0.000584f, + -0.009062f, -0.000907f, +0.005944f, -0.006091f, +0.103717f, -0.016075f, +0.003398f, +0.011214f, +0.062450f, +0.024976f, + +0.036583f, +0.011122f, -0.012154f, -0.008832f, -0.009057f, +0.010210f, +0.047890f, +0.038143f, +0.028253f, -0.001482f, + +0.015642f, -0.001586f, -0.001110f, -0.003873f, +0.005410f, -0.000353f, -0.003712f, -0.003058f, +0.008949f, -0.001069f, + -0.006177f, -0.006172f, +0.001678f, +0.011696f, +0.001994f, +0.013332f, +0.001724f, -0.005706f, -0.003038f, -0.002686f, + -0.000285f, +0.010057f, -0.010650f, +0.002161f, +0.001734f, +0.009938f, +0.004900f, -0.005264f, +0.011487f, +0.000297f, + -0.000320f, -0.004790f, +0.009832f, +0.001887f, -0.003241f, -0.007036f, +0.008908f, -0.000440f, +0.001438f, -0.003497f, + +0.003046f, -0.001134f, -0.002980f, +0.007936f, -0.001690f, -0.005456f, -0.001542f, +0.002581f, +0.000193f, -0.000543f, + -0.000337f, +0.000882f, -0.002509f, +0.001199f, +0.000662f, -0.001834f, -0.002972f, +0.000508f, +0.000065f, -0.000404f, + -0.001277f, +0.000175f, +0.001454f, +0.002669f, -0.001925f, +0.001758f + }, + { + -0.102240f, +0.178404f, +0.009384f, +0.037071f, -0.042003f, -0.053038f, -0.038522f, +0.015559f, -0.008132f, -0.031862f, + -0.000791f, -0.022061f, +0.006735f, +0.014676f, +0.004035f, +0.032810f, +0.009194f, +0.037452f, -0.015657f, -0.030978f, + +0.013519f, -0.029273f, +0.009601f, +0.037707f, +0.017124f, +0.003018f, +0.009459f, +0.003294f, +0.004291f, -0.001461f, + -0.009484f, +0.001030f, -0.012199f, +0.017549f, -0.009723f, -0.001832f, +0.012389f, -0.011744f, +0.007813f, -0.004740f, + -0.007472f, +0.000431f, +0.024211f, -0.003262f, +0.018780f, +0.004339f, +0.011561f, +0.001434f, -0.011228f, +0.003002f, + +0.001294f, +0.000563f, -0.007817f, +0.012284f, -0.015239f, +0.003604f, -0.001741f, +0.009620f, +0.003444f, -0.007610f, + +0.005472f, -0.001438f, -0.001129f, +0.005220f, +0.008127f, +0.002859f, -0.002220f, -0.000694f, -0.004254f, -0.001943f, + +0.005471f, +0.000660f, +0.002961f, -0.002546f, -0.001211f, -0.003351f, +0.002392f, -0.001274f, -0.001195f, -0.005403f, + +0.002368f, -0.005484f, +0.000061f, -0.003470f, -0.002897f, +0.004998f, +0.000909f, -0.001036f, +0.002990f, +0.000633f, + -0.000450f, +0.001794f, -0.002609f, +0.000810f, +0.000828f, -0.000243f + }, + { + +0.014007f, +0.001358f, -0.017224f, -0.006907f, -0.000741f, +0.017389f, -0.006311f, -0.006026f, +0.022825f, +0.008117f, + +0.015087f, +0.016722f, +0.011293f, -0.079573f, +0.059795f, +0.001982f, +0.021214f, -0.042106f, -0.024712f, +0.036131f, + -0.045632f, -0.028133f, -0.027315f, -0.025567f, -0.031156f, -0.027280f, -0.016821f, -0.004161f, -0.007663f, +0.003169f, + +0.005550f, -0.000622f, -0.003748f, +0.008608f, -0.010053f, +0.015970f, -0.003767f, -0.001327f, -0.002075f, +0.002441f, + -0.002816f, +0.000985f, -0.002862f, -0.010135f, -0.005685f, +0.017079f, -0.009598f, -0.009905f, -0.003190f, +0.006350f, + -0.009888f, +0.004487f, -0.009065f, +0.005098f, -0.005053f, -0.009718f, -0.006364f, +0.001599f, +0.006903f, -0.002046f, + +0.011840f, -0.005168f, -0.002075f, +0.000486f, +0.001510f, -0.001235f, -0.003964f, -0.001025f, +0.007198f, +0.002742f, + +0.001876f, -0.001092f, -0.000247f, +0.003040f, -0.002088f, +0.001835f, +0.000816f, -0.001141f, -0.001654f, +0.002684f, + -0.000599f, +0.000049f, +0.001992f, +0.001816f, +0.002364f, -0.000081f, +0.001797f, +0.000241f, -0.000343f, -0.001162f, + -0.000133f, -0.001165f, +0.000613f, +0.001492f, +0.000361f, +0.000885f + }, + { + -0.026863f, +0.267019f, -0.007253f, -0.026440f, -0.016721f, -0.042033f, +0.005724f, +0.011531f, +0.016174f, +0.019304f, + +0.018373f, +0.015521f, +0.010542f, +0.000602f, -0.002324f, +0.009619f, +0.026572f, -0.013445f, +0.009067f, +0.002869f, + +0.007030f, +0.002269f, -0.012469f, -0.040826f, -0.001922f, -0.036457f, +0.011197f, -0.001609f, -0.009053f, +0.036148f, + +0.005735f, +0.002062f, -0.008086f, +0.000785f, +0.008595f, -0.007683f, +0.002230f, -0.039093f, +0.008659f, -0.004256f, + -0.009528f, +0.019464f, -0.000867f, +0.027495f, +0.002874f, +0.001394f, +0.002872f, +0.004683f, +0.028058f, +0.001142f, + -0.005345f, -0.003791f, -0.003238f, +0.001695f, +0.005777f, +0.001841f, +0.004008f, +0.006752f, +0.008641f, +0.002499f, + -0.006038f, +0.002068f, -0.000014f, +0.003126f, -0.002057f, -0.004697f, -0.004324f, -0.006892f, +0.001780f, +0.002672f, + +0.001053f, -0.000093f, +0.001736f, +0.002660f, +0.000768f, +0.001208f, -0.001096f, +0.002788f, +0.000172f, -0.000114f, + -0.006319f, -0.001127f, +0.003213f, -0.002819f, +0.002894f, +0.001586f, -0.001146f, +0.000523f, +0.003119f, -0.003745f, + +0.000108f, +0.000308f, +0.002678f, -0.000304f, -0.002047f, +0.002376f + } + }, + { + { + +0.001090f, -0.000145f, +0.017223f, +0.022689f, +0.018861f, -0.001296f, +0.005542f, +0.007892f, +0.000819f, +0.024043f, + -0.007943f, -0.001847f, -0.006862f, +0.005547f, -0.060703f, +0.021444f, +0.019947f, +0.006207f, -0.015488f, -0.035263f, + +0.011014f, -0.036235f, -0.006885f, -0.039403f, -0.009230f, -0.017401f, -0.010102f, -0.006859f, -0.009599f, -0.031509f, + -0.013789f, +0.002451f, -0.010511f, +0.023219f, +0.000143f, +0.014437f, -0.002177f, -0.005409f, +0.004541f, +0.005464f, + -0.001719f, -0.005539f, +0.003181f, +0.002822f, +0.009724f, -0.006381f, +0.003008f, +0.011714f, +0.004961f, +0.004380f, + -0.006699f, -0.006750f, +0.003884f, +0.000169f, +0.005836f, -0.004107f, -0.005954f, +0.001288f, +0.003691f, +0.004222f, + +0.006932f, +0.007028f, -0.000917f, +0.007131f, +0.005345f, -0.000976f, +0.002377f, -0.001542f, -0.001664f, +0.002650f, + +0.002947f, +0.003712f, -0.000046f, +0.004271f, -0.001308f, +0.002985f, +0.002241f, -0.002923f, +0.001265f, +0.000035f, + +0.000975f, -0.001925f, +0.000007f, +0.001054f, -0.001444f, -0.001349f, +0.001275f, +0.001303f, +0.000594f, +0.001799f, + -0.001102f, -0.000179f, -0.001351f, +0.000447f, -0.000119f, +0.000865f + }, + { + -0.022173f, +0.025248f, +0.131878f, -0.056540f, +0.020122f, +0.005370f, -0.016235f, +0.010738f, +0.001449f, -0.025767f, + -0.018149f, -0.009676f, -0.000737f, -0.008034f, -0.003081f, +0.020345f, +0.006522f, +0.007683f, -0.003048f, -0.010225f, + +0.021333f, +0.023394f, -0.013642f, +0.001035f, -0.004131f, +0.010784f, +0.002081f, +0.014875f, +0.006482f, +0.008378f, + -0.016074f, -0.002438f, -0.014397f, +0.003971f, +0.006925f, -0.013052f, -0.003780f, +0.003338f, -0.010391f, -0.014480f, + -0.002015f, -0.018035f, +0.001825f, +0.002805f, -0.012695f, -0.005964f, -0.000972f, +0.005089f, +0.005908f, -0.002346f, + +0.002810f, -0.001476f, -0.009970f, +0.001503f, -0.001748f, -0.002323f, -0.003740f, -0.001987f, -0.003430f, -0.001024f, + -0.002053f, -0.000127f, +0.000546f, -0.000106f, +0.002337f, +0.000413f, +0.002288f, +0.005382f, -0.000578f, +0.005478f, + +0.001152f, -0.000610f, +0.005649f, +0.000549f, +0.004391f, +0.001736f, +0.002858f, -0.000705f, -0.001735f, -0.000909f, + -0.001735f, +0.004945f, -0.001318f, -0.001666f, +0.001817f, +0.001442f, +0.001541f, -0.000982f, -0.000841f, +0.000528f, + +0.000066f, +0.002102f, +0.001350f, -0.000681f, +0.000389f, -0.000038f + }, + { + -0.003162f, -0.044611f, +0.027444f, +0.047538f, +0.022697f, -0.007732f, -0.005458f, -0.001687f, +0.004251f, +0.012358f, + +0.019897f, +0.014753f, -0.002282f, +0.026637f, +0.022343f, +0.006653f, +0.016402f, +0.015047f, +0.012665f, +0.016703f, + -0.006744f, +0.006602f, -0.001089f, -0.006215f, -0.002779f, -0.014820f, -0.017730f, -0.017221f, +0.002263f, -0.007287f, + -0.010883f, +0.008962f, -0.010028f, -0.003419f, +0.003048f, -0.003834f, -0.008795f, +0.013024f, -0.015297f, +0.019540f, + +0.006545f, -0.003532f, -0.002499f, -0.008214f, +0.009870f, +0.003844f, +0.000583f, +0.005892f, -0.002232f, -0.002082f, + +0.001093f, +0.003055f, -0.002355f, -0.006217f, -0.011099f, -0.003417f, -0.002592f, +0.001138f, -0.000945f, +0.001763f, + -0.000664f, +0.004964f, -0.001523f, +0.001136f, +0.000422f, +0.002349f, -0.000936f, -0.000256f, +0.006953f, -0.000514f, + -0.003348f, -0.000819f, -0.001247f, -0.002014f, -0.005383f, +0.000730f, -0.000521f, -0.000640f, -0.003017f, -0.001418f, + -0.001144f, -0.001572f, -0.001194f, -0.001238f, +0.000987f, -0.001287f, +0.001774f, +0.001992f, -0.001359f, -0.000142f, + -0.000261f, +0.000394f, -0.001907f, +0.000325f, +0.001217f, +0.001740f + }, + { + -0.002259f, +0.050317f, +0.013464f, -0.011939f, +0.001096f, +0.001547f, -0.002754f, +0.001394f, -0.001213f, -0.008894f, + +0.002029f, -0.008623f, +0.006131f, +0.022178f, +0.025755f, -0.012527f, +0.060542f, +0.009431f, +0.007303f, +0.003244f, + +0.007555f, +0.027813f, -0.014321f, +0.002407f, -0.014688f, +0.013505f, +0.032159f, -0.022726f, -0.029261f, -0.002766f, + +0.004121f, -0.015853f, -0.020522f, +0.015386f, +0.007365f, -0.000877f, +0.008270f, -0.008386f, -0.022362f, -0.006329f, + -0.000447f, +0.008629f, +0.007359f, +0.012500f, +0.007551f, -0.011214f, -0.019056f, -0.005241f, -0.000156f, -0.001507f, + -0.003584f, -0.000569f, +0.000367f, -0.004354f, -0.004113f, +0.005547f, +0.003665f, +0.004986f, +0.006064f, +0.005012f, + +0.008906f, -0.000645f, -0.005423f, -0.002375f, +0.001708f, +0.002581f, +0.004249f, -0.000107f, +0.001156f, -0.000046f, + +0.003903f, +0.000210f, -0.000064f, -0.001579f, +0.004319f, +0.001129f, -0.001557f, -0.001302f, -0.002659f, -0.000213f, + -0.002061f, -0.001379f, +0.001126f, +0.001065f, +0.000002f, -0.001789f, +0.001064f, -0.002343f, -0.001686f, -0.001504f, + +0.000524f, +0.000081f, -0.000255f, -0.000616f, -0.000706f, -0.001782f + }, + { + -0.090268f, -0.320500f, +0.028018f, +0.052461f, +0.002112f, +0.005245f, -0.003617f, +0.017524f, -0.001101f, -0.015416f, + -0.009287f, -0.030441f, +0.025994f, -0.001066f, -0.026583f, +0.011735f, +0.012423f, +0.002672f, +0.032519f, -0.001537f, + +0.004176f, -0.026530f, -0.023219f, +0.011595f, -0.001786f, +0.015529f, +0.009333f, -0.006598f, -0.039617f, +0.005942f, + +0.001055f, +0.003966f, -0.000654f, -0.009419f, -0.004321f, +0.007278f, +0.031453f, +0.007672f, +0.020650f, -0.007717f, + +0.010699f, -0.004924f, -0.013393f, -0.016812f, +0.006957f, +0.006474f, -0.014006f, -0.003282f, +0.009902f, -0.010859f, + -0.008841f, +0.000251f, -0.003942f, +0.011112f, -0.001859f, -0.003128f, -0.000983f, -0.006547f, +0.001681f, +0.003992f, + -0.007144f, +0.003092f, -0.007098f, -0.001964f, -0.000607f, +0.005144f, +0.001398f, +0.002350f, +0.001234f, +0.002473f, + -0.004459f, +0.000064f, -0.003589f, +0.000451f, -0.002720f, -0.002360f, -0.001625f, -0.000615f, -0.001192f, -0.000831f, + -0.001653f, +0.001063f, -0.001003f, +0.002989f, -0.001258f, -0.002981f, +0.003414f, +0.000485f, +0.000781f, -0.000423f, + -0.000449f, -0.000065f, +0.001862f, +0.001309f, +0.000080f, +0.000282f + }, + { + +0.000174f, -0.012842f, -0.007852f, -0.000811f, +0.006343f, +0.000195f, -0.001044f, -0.006758f, +0.000436f, -0.013936f, + -0.001099f, +0.001841f, +0.004941f, +0.015788f, -0.059478f, -0.051365f, -0.047004f, -0.002305f, +0.015771f, +0.001984f, + +0.007924f, -0.006523f, -0.000537f, -0.030475f, -0.008962f, +0.044362f, -0.038696f, -0.031227f, -0.012446f, -0.040590f, + -0.010480f, -0.004303f, +0.001847f, -0.007218f, -0.025880f, +0.013483f, +0.004304f, +0.001775f, -0.003831f, +0.003776f, + +0.003031f, -0.002470f, -0.007829f, -0.011313f, -0.005909f, +0.001636f, -0.002080f, +0.006524f, -0.006334f, +0.002913f, + +0.006529f, +0.000199f, -0.006557f, -0.000948f, +0.006445f, -0.002668f, -0.005596f, -0.000107f, -0.000298f, +0.007665f, + -0.000690f, -0.000062f, -0.002213f, -0.000828f, +0.001346f, -0.001784f, +0.000052f, +0.004633f, +0.004473f, +0.003549f, + +0.002663f, +0.002240f, -0.001724f, -0.001170f, +0.002066f, -0.003568f, -0.001119f, +0.000153f, +0.001240f, +0.002141f, + +0.000757f, -0.003528f, +0.001960f, -0.000298f, -0.000511f, +0.002527f, +0.000593f, +0.001154f, -0.001982f, +0.000839f, + +0.000899f, -0.000615f, -0.000243f, +0.000170f, +0.000426f, +0.000008f + }, + { + -0.115399f, -0.108737f, +0.053038f, +0.112358f, -0.013290f, -0.007991f, -0.007916f, -0.011059f, -0.009773f, -0.017109f, + +0.006479f, -0.006422f, -0.004511f, -0.004099f, +0.012644f, -0.006608f, +0.014068f, +0.019191f, +0.002344f, +0.011125f, + +0.002116f, -0.014674f, -0.003166f, -0.011336f, -0.000850f, +0.000174f, +0.007354f, -0.001870f, +0.011220f, +0.010504f, + +0.003152f, -0.009372f, -0.013707f, +0.014970f, -0.006729f, -0.015459f, -0.011038f, -0.024688f, +0.002874f, +0.004571f, + -0.004174f, +0.013832f, +0.004842f, +0.019279f, +0.017196f, -0.001530f, +0.007852f, -0.003354f, +0.004658f, +0.000249f, + -0.002173f, +0.007727f, +0.000063f, -0.002494f, +0.007167f, -0.003540f, +0.001678f, -0.002793f, -0.001951f, -0.003955f, + +0.001079f, +0.007604f, +0.004088f, -0.000592f, +0.000942f, -0.000060f, -0.006626f, -0.005798f, +0.001592f, +0.003874f, + +0.002732f, +0.001184f, -0.001950f, -0.002160f, +0.000571f, +0.001056f, +0.001060f, +0.003039f, +0.000372f, +0.001147f, + -0.000624f, +0.001626f, -0.001910f, -0.001762f, +0.000873f, -0.003041f, +0.000040f, +0.001474f, -0.000031f, +0.002429f, + -0.000761f, +0.000697f, +0.000721f, -0.000633f, -0.000376f, -0.002077f + }, + { + +0.000741f, -0.028466f, -0.001238f, -0.003229f, +0.003752f, +0.001823f, -0.000351f, -0.001030f, -0.007462f, -0.000076f, + +0.002538f, +0.003037f, -0.018011f, +0.003245f, -0.027633f, -0.006072f, +0.044640f, +0.004728f, -0.024883f, +0.026601f, + +0.033719f, +0.037412f, +0.019676f, +0.006871f, +0.016744f, +0.018585f, +0.025370f, -0.004697f, -0.023200f, +0.025191f, + +0.004128f, -0.003274f, +0.019779f, +0.030963f, +0.028338f, -0.008506f, +0.011968f, -0.002178f, +0.018157f, +0.007991f, + -0.012858f, +0.000011f, -0.011418f, +0.002657f, +0.010700f, +0.003908f, +0.000207f, -0.004530f, +0.015856f, -0.004105f, + -0.002010f, -0.006835f, -0.000722f, +0.000499f, -0.005828f, -0.000308f, -0.000857f, -0.002835f, -0.000679f, +0.001128f, + -0.002391f, -0.007355f, +0.000760f, -0.000831f, -0.001871f, -0.003905f, +0.006804f, -0.003897f, -0.003518f, +0.004202f, + +0.001255f, -0.000367f, -0.001815f, +0.001045f, -0.002317f, +0.000284f, +0.001515f, +0.001404f, -0.000056f, +0.003279f, + +0.001485f, +0.000115f, +0.001327f, +0.000650f, +0.001170f, -0.002626f, -0.000179f, +0.001989f, +0.000797f, -0.000033f, + -0.001907f, -0.001659f, -0.001306f, +0.000163f, +0.000550f, +0.000296f + }, + { + -0.072011f, -0.607115f, -0.002239f, +0.141530f, -0.018108f, -0.011547f, -0.011573f, -0.005336f, +0.027739f, -0.014286f, + +0.011060f, +0.044263f, +0.020171f, +0.026523f, +0.031534f, +0.005229f, -0.026441f, -0.006540f, -0.002765f, -0.005561f, + -0.017140f, -0.008509f, +0.004914f, +0.003549f, -0.004437f, -0.000113f, -0.001591f, -0.014994f, -0.003586f, -0.003185f, + -0.009489f, -0.022089f, +0.011149f, -0.014260f, -0.004543f, +0.005141f, +0.001703f, -0.012245f, +0.004163f, +0.002924f, + -0.003093f, -0.017375f, +0.002487f, -0.005043f, +0.001687f, +0.007336f, -0.005035f, -0.002373f, +0.002389f, +0.016359f, + +0.012611f, +0.002366f, +0.002239f, +0.000330f, -0.003687f, +0.004406f, +0.002650f, +0.001299f, +0.007186f, +0.005851f, + -0.003430f, -0.003132f, -0.003923f, +0.001558f, +0.001503f, -0.001105f, +0.000044f, +0.000948f, +0.001296f, +0.005994f, + +0.004546f, +0.001255f, -0.002020f, +0.001470f, +0.000659f, -0.001576f, -0.000582f, -0.001985f, -0.000614f, +0.001064f, + -0.000690f, -0.001577f, +0.000294f, +0.001261f, -0.001211f, +0.000971f, -0.000226f, -0.001675f, -0.001907f, +0.000240f, + -0.000024f, +0.000087f, -0.000550f, +0.001574f, -0.002079f, +0.000913f + }, + { + +0.005702f, +0.109048f, -0.009820f, -0.000394f, +0.005140f, -0.011743f, +0.004400f, -0.000390f, +0.002939f, +0.007039f, + -0.002551f, -0.015469f, -0.024446f, +0.028287f, -0.015153f, -0.014347f, +0.014845f, -0.013157f, -0.049812f, +0.010152f, + +0.029972f, -0.012390f, -0.013313f, -0.025027f, -0.016890f, -0.002136f, -0.002305f, +0.007692f, -0.003259f, +0.025185f, + -0.001519f, +0.001538f, -0.024070f, +0.007343f, -0.007468f, -0.003322f, -0.001225f, +0.003760f, -0.002482f, -0.014236f, + -0.004008f, +0.007065f, -0.001708f, -0.004152f, +0.000701f, +0.005060f, +0.000536f, +0.001181f, +0.008774f, -0.004931f, + -0.008260f, -0.006038f, +0.001194f, -0.003071f, +0.002607f, +0.000888f, -0.003058f, -0.003949f, -0.008393f, -0.003691f, + +0.001699f, +0.006540f, -0.008889f, -0.000023f, -0.001570f, +0.002623f, +0.001855f, +0.000514f, -0.006013f, +0.002574f, + +0.003865f, +0.006278f, +0.001867f, +0.005112f, -0.000545f, +0.000330f, +0.002307f, -0.002702f, +0.002637f, +0.002495f, + +0.002692f, +0.000154f, -0.000667f, -0.002864f, -0.001064f, +0.001881f, +0.001978f, +0.000524f, +0.000447f, +0.000129f, + -0.000905f, +0.000359f, -0.001504f, -0.001097f, -0.001107f, +0.000445f + }, + { + -0.046422f, -0.391819f, -0.004579f, -0.023413f, -0.006498f, -0.064752f, -0.059842f, +0.008923f, +0.023036f, -0.004494f, + -0.005132f, +0.013029f, -0.020142f, -0.010873f, -0.026070f, +0.001911f, -0.013405f, -0.020704f, -0.005670f, -0.022589f, + +0.017177f, -0.000556f, -0.011674f, -0.016749f, -0.002939f, -0.013905f, +0.012045f, -0.010702f, -0.013221f, +0.001415f, + -0.006024f, +0.000389f, +0.007459f, -0.003912f, +0.003151f, +0.001156f, +0.008334f, -0.011240f, +0.009148f, +0.007165f, + -0.009648f, -0.002113f, +0.002192f, +0.006641f, -0.003272f, -0.002267f, +0.002392f, +0.004453f, -0.002170f, +0.008362f, + +0.004844f, -0.005419f, -0.000968f, +0.004221f, -0.002803f, +0.009620f, -0.001799f, +0.003958f, +0.002264f, +0.003387f, + +0.002594f, -0.000329f, +0.000557f, -0.004609f, +0.002737f, -0.002310f, +0.001021f, -0.005412f, -0.001950f, -0.002193f, + -0.001221f, +0.000836f, -0.000801f, -0.001461f, +0.000546f, -0.002362f, -0.006341f, +0.001728f, -0.001402f, +0.003640f, + +0.000914f, +0.000113f, +0.001790f, -0.000343f, -0.000248f, +0.001868f, -0.002554f, +0.001060f, -0.001173f, -0.000376f, + -0.000244f, +0.000117f, +0.000615f, +0.001532f, -0.000138f, -0.001839f + }, + { + -0.001991f, +0.075447f, +0.012579f, -0.005080f, -0.007067f, +0.007712f, +0.018684f, -0.004375f, +0.000435f, -0.002134f, + -0.016013f, -0.001403f, -0.013197f, +0.032941f, +0.053745f, +0.046319f, -0.018006f, -0.000723f, +0.067390f, +0.035491f, + -0.005135f, +0.064100f, -0.015165f, -0.018207f, -0.015462f, +0.031383f, +0.046301f, +0.015277f, +0.049677f, -0.007092f, + +0.002588f, +0.006274f, -0.009056f, +0.009000f, +0.002028f, -0.000639f, +0.001935f, -0.000731f, -0.012231f, +0.002575f, + -0.006874f, -0.007917f, +0.006999f, +0.004887f, -0.002644f, +0.015333f, +0.004754f, -0.002573f, -0.009534f, -0.009183f, + +0.010872f, +0.002476f, -0.002483f, +0.000031f, +0.001363f, +0.009502f, -0.002870f, +0.008500f, +0.002720f, +0.000656f, + +0.006240f, -0.004357f, +0.002430f, +0.002613f, +0.003364f, -0.002914f, +0.005222f, +0.000945f, -0.002461f, +0.002577f, + -0.002461f, -0.002945f, +0.001530f, +0.001106f, +0.000282f, -0.001289f, +0.000175f, -0.001672f, -0.001975f, -0.000141f, + +0.002723f, -0.001952f, -0.003565f, +0.002085f, +0.000926f, -0.001786f, -0.002247f, +0.001548f, -0.000897f, +0.000924f, + +0.000449f, -0.000124f, +0.001071f, -0.000251f, +0.001809f, -0.000360f + }, + { + +0.107916f, -0.042160f, +0.004942f, -0.004232f, -0.013006f, -0.057321f, -0.030897f, -0.000314f, -0.010707f, -0.004440f, + -0.015135f, -0.019801f, -0.003266f, +0.025887f, +0.029602f, -0.003698f, +0.029484f, +0.007040f, -0.006165f, -0.018615f, + -0.014189f, -0.008266f, +0.017920f, +0.036480f, +0.007238f, -0.001403f, +0.010022f, -0.008021f, +0.018076f, -0.005478f, + +0.004939f, -0.011768f, +0.003807f, -0.004593f, -0.000235f, +0.002713f, +0.001889f, -0.001408f, +0.006729f, -0.002787f, + -0.009407f, +0.006458f, +0.018245f, +0.001645f, +0.012086f, +0.013313f, -0.002738f, -0.003744f, -0.001240f, +0.009840f, + -0.002127f, +0.000459f, +0.007426f, -0.000658f, -0.005192f, -0.004669f, -0.003274f, -0.000751f, +0.009420f, -0.002270f, + +0.003805f, -0.002872f, -0.001899f, +0.006189f, +0.003912f, -0.001633f, +0.002898f, +0.000760f, -0.004077f, -0.005995f, + +0.004285f, +0.005965f, -0.002462f, -0.000309f, -0.000328f, -0.002451f, +0.001040f, +0.000890f, -0.004023f, -0.003025f, + -0.002233f, -0.000149f, -0.002810f, -0.003337f, -0.001976f, +0.001121f, +0.002480f, +0.002267f, +0.000329f, -0.000514f, + +0.000306f, +0.002329f, -0.001795f, -0.000694f, +0.000851f, -0.000677f + }, + { + -0.013656f, -0.007875f, +0.011505f, -0.005394f, +0.003642f, -0.002143f, +0.009829f, -0.001907f, +0.015279f, +0.022374f, + +0.010994f, +0.018978f, +0.004239f, -0.023702f, +0.009652f, -0.019377f, +0.012756f, -0.028615f, -0.008035f, -0.032172f, + -0.013061f, -0.052718f, -0.006828f, -0.029544f, -0.008681f, -0.039387f, -0.022396f, -0.012205f, +0.010415f, +0.004279f, + +0.006651f, +0.006752f, +0.002510f, +0.002058f, +0.004517f, -0.001977f, +0.010168f, -0.010812f, +0.002766f, +0.009517f, + -0.008136f, +0.005820f, -0.017618f, -0.005776f, +0.002421f, +0.016685f, -0.007636f, -0.016996f, +0.001023f, +0.002509f, + -0.001499f, -0.003035f, -0.002778f, -0.006161f, -0.000588f, -0.010276f, -0.000488f, +0.004769f, -0.000879f, +0.004797f, + +0.005732f, -0.004303f, -0.007409f, +0.001048f, +0.002877f, -0.004671f, +0.004494f, +0.000605f, -0.000031f, +0.002867f, + -0.001532f, -0.001119f, +0.001447f, +0.006421f, -0.001050f, -0.004883f, +0.003897f, +0.002317f, -0.000919f, +0.001444f, + -0.001830f, +0.001003f, +0.000793f, +0.002543f, +0.001365f, +0.001628f, +0.001453f, +0.000958f, +0.001671f, -0.002046f, + -0.002817f, -0.000820f, +0.000147f, +0.001118f, +0.000546f, +0.000589f + }, + { + +0.059105f, +0.186549f, -0.003387f, -0.021234f, -0.024502f, -0.029342f, -0.014941f, +0.012507f, +0.017957f, +0.010749f, + -0.001049f, +0.029258f, +0.006138f, +0.003755f, -0.018383f, +0.023020f, -0.009883f, -0.012306f, +0.011030f, +0.020862f, + +0.017261f, -0.007318f, -0.017312f, -0.024798f, -0.009080f, -0.032841f, +0.009506f, +0.002015f, +0.007781f, +0.011220f, + +0.010578f, +0.003330f, -0.000479f, -0.011398f, +0.010666f, -0.011372f, +0.000447f, -0.016262f, -0.010031f, +0.000110f, + +0.000221f, +0.011544f, +0.020280f, +0.012577f, +0.000929f, +0.002287f, +0.006463f, +0.011404f, +0.013603f, +0.007451f, + -0.009485f, -0.001166f, -0.003341f, +0.006312f, +0.002068f, +0.000303f, +0.003949f, +0.007201f, +0.005966f, +0.005742f, + -0.001038f, -0.001337f, -0.002502f, +0.002299f, -0.000517f, -0.002729f, -0.002216f, -0.004847f, -0.003149f, +0.002621f, + +0.001916f, -0.001599f, +0.002963f, +0.002554f, -0.000153f, +0.003541f, +0.001023f, -0.000481f, -0.000318f, -0.001721f, + -0.001825f, -0.000659f, +0.001150f, -0.000314f, +0.001004f, +0.002380f, -0.002139f, +0.000802f, +0.000899f, -0.000539f, + -0.003552f, +0.000966f, +0.002977f, +0.000626f, -0.001655f, +0.002856f + } + }, + { + { + +0.000375f, -0.024613f, +0.004998f, -0.009052f, -0.008551f, +0.000547f, -0.001436f, +0.000878f, -0.000840f, +0.024249f, + +0.000716f, +0.006428f, +0.018128f, +0.014194f, -0.040790f, +0.001038f, -0.026294f, +0.001754f, -0.002233f, +0.006768f, + +0.039594f, -0.019635f, +0.015790f, -0.035311f, -0.009525f, -0.008060f, +0.018058f, +0.014282f, +0.015879f, +0.001521f, + +0.001370f, +0.008148f, -0.018325f, +0.009780f, -0.003435f, +0.011062f, -0.010527f, -0.013900f, +0.006262f, +0.008021f, + +0.006420f, -0.004429f, -0.005687f, +0.003113f, +0.014647f, -0.007101f, -0.002722f, +0.010097f, +0.003785f, +0.004690f, + +0.004805f, -0.001388f, +0.002837f, +0.001121f, +0.003518f, -0.003379f, +0.000608f, +0.000538f, -0.000897f, +0.000988f, + +0.000540f, +0.003665f, -0.003365f, -0.000413f, +0.001455f, +0.000355f, +0.002936f, +0.001190f, +0.002214f, +0.000399f, + -0.001067f, +0.001781f, -0.001969f, +0.004132f, +0.000418f, +0.002556f, +0.001050f, -0.001266f, +0.000954f, -0.001109f, + +0.000762f, -0.000962f, +0.000970f, +0.000987f, +0.000260f, +0.000267f, +0.001015f, +0.001138f, -0.000446f, +0.000602f, + -0.001416f, +0.000481f, -0.000939f, +0.000807f, -0.000209f, +0.001145f + }, + { + +0.018257f, -0.154483f, -0.037326f, -0.056208f, +0.008325f, -0.004541f, -0.005895f, -0.002269f, -0.011291f, +0.004673f, + -0.002653f, -0.008859f, +0.007506f, +0.000193f, -0.008183f, +0.018135f, -0.009332f, -0.001952f, -0.002145f, -0.014121f, + +0.011679f, +0.014946f, -0.007173f, -0.008708f, -0.017489f, +0.001663f, -0.003309f, +0.013409f, -0.000323f, +0.003077f, + -0.003124f, +0.006461f, -0.009600f, +0.002349f, +0.002160f, -0.010505f, -0.010148f, -0.001811f, -0.005746f, -0.005741f, + +0.007568f, -0.007997f, +0.007609f, +0.005209f, +0.000098f, -0.000026f, -0.003033f, -0.005999f, +0.000489f, -0.005343f, + -0.000693f, +0.001165f, -0.004477f, +0.004704f, -0.000259f, +0.001589f, +0.002509f, +0.000245f, -0.003827f, +0.000448f, + +0.000361f, -0.001557f, -0.001524f, +0.001726f, +0.004066f, -0.000894f, +0.001952f, +0.005744f, -0.000284f, +0.003295f, + -0.000425f, -0.001691f, +0.002489f, -0.001121f, +0.001417f, -0.001585f, +0.000221f, -0.001389f, +0.000079f, +0.002308f, + -0.001272f, +0.001033f, -0.002030f, -0.001174f, +0.001309f, -0.000016f, +0.001487f, -0.001642f, -0.001953f, +0.000275f, + +0.000123f, +0.001296f, +0.000962f, -0.001841f, -0.000438f, -0.000032f + }, + { + +0.003799f, -0.072499f, -0.017891f, -0.013674f, -0.006035f, +0.002199f, +0.001979f, +0.000769f, +0.000404f, -0.013662f, + +0.004383f, +0.023948f, -0.020746f, +0.000246f, +0.019845f, +0.002217f, +0.004105f, -0.001113f, -0.014758f, +0.010569f, + -0.005110f, +0.010514f, +0.012533f, +0.011196f, +0.009878f, +0.000651f, -0.001346f, -0.009327f, +0.001259f, -0.004251f, + -0.001148f, +0.001512f, -0.016069f, -0.005010f, +0.006262f, +0.002145f, -0.007571f, +0.010826f, -0.016208f, +0.006283f, + -0.000574f, +0.002520f, +0.003929f, -0.002487f, +0.006908f, +0.001204f, +0.000838f, +0.004078f, -0.002232f, -0.000191f, + +0.000516f, +0.001671f, -0.000547f, -0.002520f, -0.003070f, +0.003676f, -0.000125f, +0.007070f, +0.001648f, +0.000695f, + -0.004226f, +0.005402f, -0.003793f, +0.000198f, -0.001103f, +0.001615f, -0.000822f, -0.002638f, +0.002292f, -0.000942f, + -0.001451f, -0.000984f, -0.000679f, +0.001653f, -0.001979f, +0.000436f, -0.000400f, +0.003118f, +0.000100f, +0.001608f, + +0.000955f, +0.000327f, +0.000580f, -0.001746f, +0.000951f, -0.000748f, -0.000756f, +0.000303f, -0.001121f, -0.000300f, + +0.000582f, +0.001521f, -0.001644f, -0.000758f, -0.000343f, +0.000885f + }, + { + +0.002276f, +0.032537f, -0.006922f, -0.009229f, +0.002432f, +0.000565f, -0.003053f, +0.003000f, +0.000701f, -0.005204f, + +0.002790f, -0.011888f, -0.001405f, +0.013159f, +0.060506f, +0.001391f, +0.015724f, -0.024664f, -0.008408f, +0.005028f, + -0.003556f, +0.027001f, -0.000871f, -0.002526f, -0.005279f, +0.007623f, +0.019892f, -0.000528f, -0.013558f, +0.008673f, + +0.004081f, -0.020478f, -0.012491f, +0.007662f, -0.001925f, +0.010270f, +0.016482f, -0.004159f, -0.010090f, +0.006812f, + +0.010104f, +0.009668f, -0.004830f, -0.000128f, +0.007883f, +0.000640f, -0.003897f, +0.000362f, -0.004585f, +0.003907f, + -0.003211f, -0.001431f, +0.003101f, -0.000310f, -0.002285f, +0.002643f, -0.003564f, +0.003352f, +0.003235f, -0.006100f, + +0.004075f, +0.001032f, -0.003970f, -0.003174f, +0.003468f, +0.000478f, +0.001695f, +0.000764f, +0.001045f, -0.002412f, + -0.001319f, -0.002131f, -0.000807f, -0.002045f, +0.001990f, -0.000346f, -0.000927f, -0.000504f, -0.001881f, +0.000279f, + -0.000799f, +0.000577f, -0.000328f, -0.000448f, +0.001331f, -0.001091f, +0.001144f, -0.000785f, -0.000246f, -0.000516f, + +0.000388f, -0.000742f, +0.001070f, +0.000287f, -0.000606f, -0.001181f + }, + { + +0.078009f, -0.130401f, +0.014911f, +0.068014f, -0.003452f, +0.005844f, -0.007656f, +0.001515f, -0.011333f, -0.010509f, + +0.019120f, -0.018295f, +0.022514f, +0.000815f, -0.016653f, +0.016097f, +0.000575f, -0.014829f, +0.028127f, +0.006224f, + -0.003635f, -0.013505f, +0.000649f, -0.002750f, -0.010742f, +0.008906f, -0.004838f, +0.018827f, -0.013676f, +0.001851f, + -0.001725f, -0.003167f, +0.000410f, -0.000772f, -0.003788f, -0.003596f, +0.007197f, -0.009108f, +0.017404f, -0.008916f, + +0.012343f, +0.000627f, +0.001595f, -0.005994f, +0.001003f, +0.004365f, -0.009251f, -0.002361f, +0.006017f, -0.011112f, + -0.002962f, +0.002280f, -0.009510f, +0.002749f, -0.006248f, +0.002457f, +0.001223f, -0.008782f, +0.001068f, +0.006376f, + -0.003355f, +0.004693f, -0.005268f, -0.001825f, -0.001462f, +0.004066f, -0.002406f, -0.000773f, -0.000516f, +0.001901f, + -0.003523f, +0.001812f, -0.002838f, +0.000855f, +0.000123f, -0.000335f, +0.001690f, +0.001932f, -0.000522f, +0.000108f, + -0.001161f, +0.000473f, -0.001120f, +0.001708f, -0.000733f, -0.001645f, +0.001333f, -0.001213f, +0.001099f, +0.000520f, + -0.000070f, -0.000246f, +0.000135f, +0.000525f, +0.000202f, +0.000644f + }, + { + +0.001743f, -0.019271f, -0.013570f, -0.002860f, +0.003061f, +0.001394f, -0.000934f, -0.003583f, +0.005261f, -0.005109f, + +0.010896f, +0.004836f, -0.003454f, +0.001382f, -0.008340f, +0.007191f, -0.030522f, +0.004091f, +0.009440f, -0.011111f, + +0.019645f, -0.001882f, -0.004754f, -0.021057f, -0.008538f, +0.054514f, -0.006952f, -0.008535f, +0.013306f, -0.016085f, + -0.000092f, +0.000283f, +0.006502f, +0.004914f, -0.013491f, +0.004518f, -0.005791f, +0.003565f, -0.001145f, +0.002292f, + +0.009533f, -0.003171f, -0.011182f, -0.005916f, -0.004608f, +0.004106f, -0.003283f, +0.001310f, -0.005391f, +0.008174f, + +0.008416f, -0.000319f, -0.004106f, +0.004025f, +0.004619f, -0.000007f, -0.002594f, -0.001136f, -0.002470f, +0.002097f, + -0.003238f, -0.002708f, -0.002897f, +0.000896f, +0.006069f, -0.000802f, -0.003068f, +0.001832f, -0.001815f, -0.000558f, + +0.001230f, +0.001242f, +0.000212f, +0.002054f, +0.004181f, -0.002059f, -0.001265f, +0.000137f, +0.001162f, -0.001211f, + -0.000162f, -0.003330f, +0.000559f, +0.000005f, -0.000670f, +0.000781f, -0.000436f, +0.000099f, -0.002492f, +0.000431f, + +0.000115f, -0.000919f, +0.000283f, -0.000143f, -0.000057f, +0.000229f + }, + { + +0.070552f, +0.053573f, -0.009624f, +0.105289f, -0.012326f, +0.001053f, +0.012697f, +0.004978f, -0.015890f, -0.022649f, + +0.010940f, +0.002104f, +0.018443f, +0.008921f, +0.018736f, -0.002257f, +0.009278f, +0.008560f, +0.000079f, +0.007109f, + -0.019127f, -0.018895f, +0.003063f, -0.014951f, -0.001891f, +0.002065f, +0.010599f, -0.003045f, +0.002330f, +0.000551f, + -0.001755f, -0.001173f, -0.009305f, +0.009134f, -0.001826f, -0.005655f, -0.005129f, -0.009410f, +0.009271f, -0.002842f, + -0.012239f, +0.007237f, -0.003614f, +0.002210f, -0.003307f, -0.006680f, +0.008705f, -0.005383f, +0.002239f, +0.002018f, + -0.005652f, +0.004266f, +0.011914f, -0.000690f, +0.000810f, -0.001767f, +0.006122f, +0.002083f, -0.001580f, -0.002701f, + -0.000951f, -0.000382f, +0.000535f, -0.001349f, -0.001451f, -0.000436f, -0.000903f, -0.000179f, +0.001447f, +0.000246f, + +0.000558f, -0.000136f, +0.000228f, +0.000018f, -0.001215f, -0.001207f, -0.001797f, -0.000057f, -0.001119f, -0.000369f, + -0.001509f, +0.001402f, -0.001105f, +0.000567f, +0.001338f, -0.001586f, +0.000551f, -0.000201f, -0.001426f, +0.000631f, + -0.001712f, +0.001289f, +0.000968f, -0.000932f, -0.000248f, -0.001929f + }, + { + +0.002111f, -0.014149f, +0.014504f, -0.005823f, -0.003179f, +0.000564f, -0.001397f, +0.002853f, -0.002999f, -0.000576f, + -0.000053f, -0.004820f, -0.013210f, -0.000829f, -0.007219f, -0.014647f, -0.016726f, -0.009892f, -0.005312f, +0.030228f, + +0.001197f, +0.004109f, -0.003045f, -0.003780f, +0.023643f, +0.019639f, +0.004345f, -0.001026f, -0.012079f, +0.019051f, + +0.006299f, -0.013600f, +0.013180f, +0.000336f, +0.004694f, -0.013302f, +0.010484f, -0.009754f, +0.009364f, -0.000951f, + -0.018455f, +0.004637f, -0.008557f, +0.000239f, -0.005268f, -0.001571f, +0.001809f, -0.008573f, +0.013252f, -0.006068f, + -0.000649f, -0.006415f, +0.003069f, +0.002195f, -0.003940f, +0.000176f, -0.000950f, -0.005512f, -0.001369f, +0.003602f, + +0.002012f, -0.001172f, +0.002383f, -0.001799f, -0.000910f, -0.004778f, +0.002854f, -0.002111f, -0.000900f, +0.002982f, + +0.000356f, +0.000185f, -0.001655f, +0.001518f, -0.000936f, +0.001070f, +0.001208f, +0.001204f, -0.001199f, +0.001771f, + +0.000998f, -0.001154f, -0.001153f, -0.001654f, +0.002152f, -0.001175f, +0.000324f, +0.001783f, +0.000646f, +0.001766f, + -0.000015f, +0.000449f, -0.000207f, -0.000174f, +0.000262f, +0.000572f + }, + { + +0.091009f, -0.367194f, +0.008985f, +0.116226f, -0.031367f, +0.001904f, -0.001499f, -0.004436f, +0.019206f, -0.006796f, + -0.002362f, +0.010185f, -0.018899f, +0.001895f, +0.014364f, +0.012913f, -0.017843f, +0.012012f, +0.010866f, +0.002363f, + -0.005043f, -0.005565f, +0.002855f, +0.004489f, -0.008262f, +0.004348f, +0.007867f, -0.013927f, -0.004944f, +0.001085f, + +0.003280f, -0.011230f, +0.012890f, -0.010843f, -0.002628f, -0.000460f, -0.000379f, -0.001801f, +0.018150f, +0.000773f, + +0.005410f, -0.002511f, +0.008806f, -0.001132f, +0.000785f, +0.006427f, +0.000912f, +0.001593f, -0.002126f, +0.002325f, + +0.004824f, +0.003874f, +0.001395f, -0.001409f, -0.006468f, +0.001633f, -0.002097f, -0.002271f, +0.003499f, +0.001898f, + -0.003898f, -0.001255f, +0.000075f, +0.001792f, -0.001655f, -0.001641f, -0.000508f, +0.001069f, +0.000579f, +0.003282f, + -0.000408f, -0.000280f, +0.000376f, -0.000323f, -0.000538f, -0.000433f, +0.000048f, -0.002085f, -0.000908f, +0.002581f, + +0.001546f, -0.001975f, -0.001208f, +0.001057f, +0.000000f, +0.000810f, +0.000228f, +0.001326f, -0.000921f, -0.000255f, + +0.000559f, +0.001004f, -0.001940f, +0.001092f, -0.000503f, -0.000358f + }, + { + -0.004117f, +0.086314f, +0.004614f, +0.013132f, -0.000210f, -0.019261f, -0.012160f, -0.006067f, -0.001463f, +0.002931f, + +0.004396f, -0.010449f, -0.001839f, +0.033520f, -0.011748f, -0.008762f, +0.004164f, +0.004443f, -0.010383f, +0.015734f, + +0.014150f, -0.003174f, +0.018017f, +0.005611f, +0.009687f, +0.003346f, +0.002678f, +0.031934f, +0.000869f, +0.010804f, + -0.008149f, +0.007709f, -0.018187f, +0.003797f, -0.007330f, +0.001766f, -0.000740f, -0.001977f, +0.000895f, -0.008525f, + -0.005408f, +0.007714f, +0.001252f, -0.007054f, +0.002201f, +0.004505f, +0.003987f, -0.002348f, -0.001368f, -0.009558f, + -0.002843f, -0.000907f, +0.002332f, -0.001207f, +0.005326f, +0.003299f, -0.002160f, -0.003803f, -0.001531f, +0.002049f, + -0.003291f, +0.005300f, -0.003163f, +0.001128f, -0.002987f, +0.000906f, +0.000631f, +0.002220f, -0.002267f, +0.001952f, + -0.001568f, +0.001516f, -0.001367f, +0.003086f, -0.002834f, +0.000133f, +0.004237f, -0.002824f, -0.000779f, +0.000173f, + +0.000294f, -0.000383f, -0.000244f, -0.000628f, +0.002189f, +0.000525f, -0.000532f, -0.001189f, +0.000009f, +0.000142f, + -0.001277f, +0.000619f, +0.000033f, +0.001053f, -0.000700f, -0.000152f + }, + { + +0.045184f, -0.289196f, -0.012278f, -0.000500f, +0.023771f, +0.006847f, -0.005837f, -0.014631f, +0.012558f, -0.003044f, + +0.000828f, +0.013249f, -0.010340f, +0.006224f, -0.013447f, +0.009571f, -0.001383f, -0.017196f, -0.003228f, -0.006044f, + +0.009604f, -0.005092f, +0.004576f, -0.009721f, +0.004045f, +0.003472f, +0.009116f, -0.010722f, +0.001322f, +0.009215f, + +0.001015f, +0.005665f, +0.004647f, -0.003994f, +0.004848f, -0.005247f, +0.009163f, -0.003961f, +0.007451f, +0.000282f, + -0.001944f, +0.001689f, -0.002258f, +0.002301f, -0.001010f, +0.001257f, +0.000826f, +0.001182f, -0.002834f, +0.007590f, + -0.002034f, -0.008597f, -0.003339f, -0.001282f, -0.000035f, +0.007892f, -0.003401f, +0.001883f, -0.000119f, +0.001697f, + -0.000036f, -0.000536f, -0.001466f, -0.006661f, +0.001874f, +0.000991f, +0.006360f, -0.003551f, -0.001500f, +0.002009f, + -0.000571f, +0.001128f, +0.002549f, -0.000836f, -0.001445f, -0.000396f, -0.002883f, +0.002769f, -0.002065f, +0.002151f, + +0.001181f, -0.000815f, +0.000227f, +0.001260f, -0.000660f, +0.000754f, -0.002512f, +0.001517f, +0.000264f, +0.000644f, + -0.000124f, +0.000982f, -0.000109f, +0.000263f, -0.000206f, -0.001549f + }, + { + +0.003411f, +0.047445f, -0.008514f, -0.003509f, -0.002764f, +0.009717f, +0.014535f, -0.002419f, +0.002485f, +0.000705f, + -0.009213f, -0.003084f, -0.004547f, +0.040195f, -0.008193f, +0.003508f, -0.020567f, -0.000740f, +0.042746f, +0.007179f, + -0.012981f, +0.056532f, +0.006219f, +0.007430f, -0.020806f, +0.010765f, +0.006620f, -0.015129f, +0.035193f, -0.003661f, + +0.000298f, +0.001042f, -0.013461f, +0.005107f, -0.004702f, -0.000504f, +0.005504f, +0.000136f, -0.012450f, +0.007930f, + -0.001029f, -0.001384f, +0.009140f, -0.004706f, -0.009634f, +0.002547f, +0.001730f, +0.005024f, -0.001050f, -0.003146f, + +0.008035f, +0.001024f, +0.001285f, -0.003243f, -0.004571f, +0.001900f, -0.005875f, +0.006602f, -0.000775f, -0.001692f, + +0.004497f, +0.000175f, -0.001726f, -0.004851f, +0.004499f, +0.000765f, +0.001287f, +0.000453f, -0.002671f, +0.001688f, + -0.000907f, -0.002513f, +0.000774f, -0.000070f, +0.002036f, +0.000974f, +0.002197f, -0.001507f, -0.002592f, +0.000024f, + +0.002991f, -0.001237f, -0.003273f, +0.002025f, +0.002845f, +0.001369f, -0.000578f, +0.000548f, -0.000836f, +0.001989f, + +0.002053f, +0.000477f, -0.000045f, -0.000982f, +0.001258f, -0.001280f + }, + { + -0.069158f, -0.273804f, +0.002358f, -0.014624f, +0.010684f, +0.022158f, +0.029815f, -0.001725f, -0.018819f, +0.015207f, + +0.008733f, +0.000661f, +0.008350f, +0.019052f, +0.005830f, -0.012995f, +0.011640f, -0.020410f, +0.003747f, +0.004240f, + -0.008899f, -0.018031f, -0.002671f, +0.012742f, -0.008948f, +0.009214f, +0.010923f, -0.020134f, +0.019748f, -0.001149f, + +0.005775f, -0.012971f, +0.006767f, -0.009962f, -0.001412f, +0.002886f, -0.000552f, +0.003262f, +0.008855f, +0.000717f, + -0.004815f, -0.001717f, +0.006349f, -0.003338f, +0.001328f, +0.006914f, -0.008425f, +0.000088f, +0.004367f, +0.005969f, + -0.003982f, -0.002143f, +0.004899f, +0.001334f, +0.002304f, -0.004147f, -0.003108f, -0.003310f, +0.006153f, -0.000974f, + +0.003951f, -0.002699f, -0.005493f, +0.000580f, -0.000168f, -0.004273f, +0.002982f, +0.002557f, +0.000148f, -0.002080f, + +0.001756f, +0.004374f, -0.000548f, -0.000232f, +0.000256f, -0.000737f, +0.001058f, +0.002669f, -0.000135f, +0.000091f, + -0.003109f, +0.001336f, -0.001236f, -0.000796f, -0.000030f, -0.001347f, -0.000198f, +0.000937f, -0.001044f, -0.001657f, + -0.000834f, +0.001113f, -0.001322f, -0.000512f, +0.000982f, -0.000644f + }, + { + +0.012357f, -0.016816f, -0.024235f, -0.001691f, +0.004064f, -0.011070f, +0.002242f, -0.010979f, -0.010704f, -0.002644f, + -0.009104f, +0.011306f, +0.027859f, -0.040475f, -0.019191f, +0.007403f, +0.025045f, -0.007925f, +0.004404f, -0.023785f, + +0.014258f, -0.016797f, +0.026774f, -0.008486f, +0.015091f, -0.008162f, -0.006571f, +0.004175f, +0.010746f, -0.015068f, + +0.004160f, +0.009670f, +0.002335f, +0.011431f, +0.008977f, -0.010461f, +0.011611f, -0.007523f, -0.003806f, +0.002494f, + -0.003793f, +0.010624f, -0.009993f, +0.001328f, -0.000079f, +0.004425f, -0.005889f, -0.003048f, +0.006769f, +0.001575f, + -0.000994f, -0.002484f, +0.002573f, -0.007296f, +0.005330f, -0.004140f, +0.001706f, +0.004641f, -0.005465f, +0.000672f, + +0.001521f, -0.002672f, -0.005676f, +0.000317f, +0.001079f, -0.004535f, +0.007389f, +0.002130f, -0.004519f, -0.000364f, + -0.000227f, -0.000099f, +0.001623f, +0.006048f, +0.000275f, -0.002805f, +0.003483f, +0.002050f, +0.000557f, +0.001692f, + -0.001777f, +0.000509f, -0.002316f, +0.000383f, -0.000257f, +0.001157f, +0.001134f, -0.000619f, +0.000439f, -0.001622f, + -0.001720f, +0.000054f, -0.001396f, -0.000477f, -0.000245f, +0.000125f + }, + { + -0.067596f, +0.044247f, +0.019953f, -0.001057f, +0.032606f, +0.018984f, -0.010356f, +0.000034f, +0.000101f, -0.013428f, + -0.017469f, +0.010787f, -0.023151f, -0.013398f, -0.025103f, +0.002372f, -0.024158f, -0.000429f, +0.009792f, +0.010910f, + +0.005305f, -0.016663f, -0.002566f, +0.008070f, +0.008306f, -0.013918f, +0.016639f, -0.001763f, +0.003397f, -0.004562f, + -0.004820f, +0.001942f, +0.002530f, -0.010269f, +0.010606f, -0.008358f, +0.004147f, +0.004972f, -0.001688f, +0.000431f, + +0.006170f, +0.005738f, +0.000571f, +0.000335f, -0.002474f, -0.005782f, -0.001433f, +0.003608f, +0.005818f, +0.000980f, + -0.011029f, +0.002472f, +0.001749f, +0.005431f, -0.001404f, -0.002753f, +0.001883f, +0.001117f, -0.001915f, +0.006551f, + +0.004347f, -0.001822f, -0.003950f, -0.000883f, -0.000016f, +0.003104f, +0.000932f, -0.002299f, -0.001578f, +0.004411f, + +0.001225f, -0.002908f, +0.001182f, +0.001427f, -0.001521f, +0.001617f, +0.000698f, -0.002318f, -0.001261f, +0.000247f, + +0.000575f, +0.000405f, -0.001174f, -0.000814f, +0.000685f, -0.000065f, -0.002876f, +0.001715f, +0.000123f, +0.000317f, + -0.001825f, +0.000787f, +0.000584f, +0.000519f, +0.000243f, +0.002026f + } + }, + { + { + -0.001058f, -0.013486f, -0.005863f, -0.014193f, -0.003597f, +0.000297f, -0.003004f, +0.000602f, +0.003709f, +0.005604f, + +0.018715f, +0.014507f, +0.006357f, -0.000826f, -0.023606f, -0.009586f, -0.023096f, +0.000589f, +0.002548f, -0.001893f, + +0.030324f, +0.005717f, +0.008758f, +0.004527f, -0.026790f, -0.000320f, +0.003350f, +0.005077f, +0.020570f, +0.019771f, + -0.000668f, -0.006133f, +0.007849f, -0.003510f, -0.001614f, +0.000787f, -0.001316f, -0.010572f, -0.002185f, +0.007923f, + +0.000572f, +0.001443f, -0.003634f, +0.001769f, +0.006124f, +0.001957f, -0.001677f, +0.004205f, +0.001348f, +0.005712f, + +0.005184f, +0.001179f, +0.001005f, +0.003819f, -0.000163f, +0.000203f, +0.002261f, -0.000620f, -0.002060f, +0.001848f, + -0.000108f, +0.003379f, -0.001859f, -0.000207f, -0.001803f, +0.002290f, +0.002464f, +0.001195f, +0.004575f, -0.000408f, + -0.000960f, -0.000202f, +0.000427f, +0.000437f, +0.002125f, +0.001757f, +0.000858f, -0.000067f, -0.000112f, -0.000244f, + +0.000649f, +0.000724f, +0.000675f, +0.000402f, +0.000736f, +0.000735f, -0.000048f, +0.001429f, -0.000566f, -0.000140f, + -0.000743f, -0.000399f, +0.000043f, +0.001292f, -0.000479f, +0.000308f + }, + { + -0.017648f, -0.171606f, -0.022307f, -0.020279f, -0.012084f, -0.003122f, +0.003218f, -0.013834f, -0.010690f, +0.003439f, + -0.004160f, +0.003461f, +0.000783f, -0.006328f, +0.002919f, +0.005402f, -0.010268f, +0.003279f, -0.006126f, -0.011422f, + +0.014734f, -0.004152f, +0.008463f, -0.009749f, -0.022388f, +0.001581f, -0.003237f, +0.006488f, +0.002059f, -0.006187f, + +0.007850f, -0.003712f, +0.006194f, -0.006701f, -0.006726f, +0.001262f, -0.005326f, -0.006293f, +0.000131f, -0.002508f, + -0.000424f, +0.001236f, +0.003900f, +0.001255f, +0.007296f, -0.001988f, -0.002904f, -0.002438f, -0.003198f, -0.003694f, + -0.002278f, -0.000205f, +0.005830f, -0.001269f, +0.001006f, +0.001214f, +0.001373f, +0.003449f, -0.002205f, -0.001155f, + +0.002289f, +0.000381f, -0.004069f, +0.004086f, +0.002666f, +0.001195f, +0.000973f, +0.003402f, +0.001478f, +0.001047f, + +0.000356f, -0.001278f, -0.000121f, -0.000233f, +0.000268f, -0.001672f, +0.000156f, -0.000889f, +0.001343f, -0.000091f, + +0.000509f, -0.000649f, -0.001311f, -0.000010f, +0.000223f, +0.000457f, +0.000342f, -0.000913f, -0.001448f, -0.000285f, + +0.000735f, +0.000641f, +0.000901f, -0.001024f, -0.000716f, -0.000175f + }, + { + -0.002328f, -0.035070f, -0.037193f, -0.041164f, +0.003469f, +0.003086f, +0.006475f, +0.001662f, -0.003352f, -0.007867f, + +0.000416f, +0.009279f, -0.003166f, -0.008317f, -0.002471f, +0.004055f, -0.003305f, -0.004034f, -0.002787f, -0.003562f, + +0.010920f, +0.003610f, +0.011320f, +0.009705f, +0.008113f, +0.003879f, +0.000850f, -0.000617f, -0.007370f, -0.005460f, + +0.002098f, -0.001410f, -0.009680f, -0.008615f, +0.007648f, +0.003232f, -0.001682f, -0.006674f, -0.000760f, +0.000750f, + +0.000279f, +0.001462f, +0.003469f, +0.001494f, +0.003882f, +0.003775f, -0.005160f, +0.001612f, +0.003360f, +0.002473f, + -0.001802f, -0.000525f, -0.000272f, -0.000817f, -0.001978f, +0.001436f, +0.002415f, +0.004422f, +0.002659f, -0.000375f, + -0.001241f, +0.001144f, -0.000019f, +0.000835f, -0.002519f, +0.000058f, +0.000636f, +0.000639f, -0.001796f, +0.000719f, + +0.000249f, -0.001566f, -0.001124f, +0.001683f, -0.000220f, -0.000275f, -0.001020f, +0.001442f, +0.001897f, +0.001450f, + +0.000755f, +0.000985f, -0.000710f, -0.000551f, +0.000854f, +0.000152f, -0.001408f, -0.000866f, -0.000283f, -0.000473f, + +0.000861f, +0.000782f, -0.000659f, -0.000387f, -0.000482f, +0.000034f + }, + { + -0.003741f, +0.017142f, +0.006336f, -0.002477f, -0.000556f, -0.000375f, -0.002457f, +0.001717f, -0.000343f, -0.002287f, + +0.001217f, -0.006333f, +0.000422f, +0.013986f, +0.054315f, +0.013038f, -0.028263f, +0.009848f, -0.021480f, -0.013448f, + +0.013200f, +0.013819f, +0.005741f, -0.002322f, -0.001143f, -0.002798f, +0.011272f, +0.006066f, -0.002323f, +0.013205f, + -0.014805f, -0.020320f, +0.005502f, +0.005984f, -0.000423f, +0.009279f, +0.011507f, -0.000793f, -0.001483f, +0.003991f, + +0.008092f, +0.007950f, +0.001170f, -0.004916f, +0.001517f, +0.004140f, +0.002355f, +0.000953f, -0.003549f, +0.005082f, + -0.005525f, +0.000594f, -0.000400f, +0.002842f, -0.001342f, +0.000318f, -0.002293f, +0.002196f, +0.000195f, -0.005056f, + +0.000302f, +0.002413f, -0.002918f, -0.001322f, +0.002066f, +0.001201f, +0.001015f, +0.000881f, +0.000474f, -0.000593f, + -0.004053f, -0.002750f, -0.001381f, +0.000129f, -0.000050f, -0.000430f, -0.000149f, -0.000145f, -0.001535f, +0.000059f, + +0.000594f, -0.000123f, -0.000068f, +0.000338f, +0.000179f, +0.000022f, +0.000000f, +0.000356f, +0.000011f, -0.000474f, + -0.000259f, +0.000218f, +0.000438f, +0.001026f, -0.000698f, +0.000176f + }, + { + -0.049011f, +0.070004f, -0.021702f, +0.070562f, +0.010487f, -0.000167f, -0.006627f, -0.003615f, -0.003017f, -0.010495f, + +0.007944f, +0.008040f, +0.004250f, +0.000454f, -0.000350f, +0.006485f, -0.001456f, -0.008322f, +0.013826f, +0.006218f, + -0.006522f, -0.003132f, -0.002591f, -0.008755f, -0.000126f, +0.005312f, -0.010164f, +0.014303f, -0.000373f, -0.003544f, + +0.002708f, -0.004622f, +0.001746f, -0.001772f, +0.000550f, +0.001239f, -0.012871f, +0.001361f, +0.003059f, +0.000182f, + +0.007961f, +0.001322f, +0.001596f, +0.000940f, -0.006418f, -0.000785f, -0.002038f, -0.001715f, -0.005309f, -0.002294f, + -0.000263f, -0.001946f, -0.000383f, -0.005284f, -0.002986f, +0.001350f, -0.000075f, -0.001974f, -0.000582f, +0.000511f, + +0.001550f, -0.000975f, +0.001051f, -0.001682f, -0.001293f, -0.000600f, +0.000645f, -0.002742f, +0.000597f, -0.001138f, + -0.002299f, +0.000676f, -0.001008f, +0.000987f, -0.000499f, +0.000311f, +0.001337f, +0.001695f, -0.000143f, +0.000555f, + -0.001068f, -0.000286f, +0.000649f, +0.000028f, -0.000793f, -0.001225f, +0.000183f, -0.000388f, +0.000334f, +0.000166f, + +0.000255f, -0.000142f, +0.000236f, -0.000846f, +0.000321f, +0.000639f + }, + { + -0.000432f, -0.015223f, -0.006293f, -0.001400f, -0.002876f, +0.001651f, +0.000891f, -0.001193f, -0.000345f, +0.006249f, + +0.005338f, +0.000265f, +0.000834f, +0.002047f, +0.000533f, -0.014663f, +0.006254f, -0.006415f, +0.009601f, -0.013994f, + +0.006044f, +0.007739f, -0.008642f, -0.000241f, -0.004407f, +0.012270f, +0.020202f, -0.004112f, +0.001895f, -0.007315f, + +0.005601f, +0.005787f, +0.002771f, +0.010516f, -0.005407f, -0.009171f, -0.001199f, +0.000532f, +0.007716f, +0.000369f, + +0.002088f, -0.003269f, -0.006903f, -0.004057f, -0.001125f, +0.001887f, +0.000802f, -0.004367f, +0.001695f, +0.003426f, + +0.007029f, -0.001662f, +0.000923f, +0.002587f, -0.000511f, +0.001471f, +0.001708f, -0.002891f, -0.001392f, -0.002159f, + -0.002682f, -0.002100f, -0.003137f, +0.002488f, +0.004585f, -0.000581f, -0.001509f, -0.001333f, -0.001857f, -0.000389f, + +0.000034f, +0.001781f, +0.002107f, +0.000737f, +0.003240f, +0.000711f, -0.001325f, +0.000358f, +0.001217f, -0.002521f, + -0.000871f, -0.001259f, -0.001180f, +0.000353f, +0.000144f, -0.000321f, -0.000023f, -0.000848f, -0.000969f, -0.000391f, + -0.000019f, -0.000756f, -0.000695f, +0.000808f, -0.000118f, +0.000058f + }, + { + -0.016935f, +0.148656f, +0.009292f, +0.088850f, -0.007201f, +0.004386f, +0.004828f, +0.007748f, -0.008920f, +0.000446f, + +0.000045f, +0.000901f, +0.018961f, +0.006119f, +0.008858f, -0.002361f, +0.010132f, +0.010573f, +0.003602f, +0.002815f, + -0.017498f, -0.016138f, +0.000481f, -0.011480f, +0.002180f, -0.000586f, +0.005499f, +0.005102f, -0.000863f, -0.006728f, + -0.001522f, +0.001854f, -0.003266f, -0.001412f, +0.005677f, -0.003200f, -0.008142f, -0.000179f, -0.000759f, -0.001811f, + -0.001912f, +0.001159f, +0.000110f, -0.007364f, -0.002238f, -0.006063f, -0.000200f, +0.003429f, -0.003744f, +0.002558f, + -0.006947f, +0.008963f, +0.004783f, +0.002605f, +0.000636f, +0.000903f, +0.003157f, +0.001100f, +0.001719f, -0.001859f, + +0.000021f, -0.000836f, -0.002989f, +0.001303f, -0.001994f, -0.001164f, +0.000773f, +0.002529f, -0.000763f, -0.001346f, + +0.001689f, -0.000718f, +0.000669f, +0.001205f, -0.001528f, -0.001431f, -0.001646f, -0.000957f, -0.000207f, -0.000827f, + -0.000530f, +0.000078f, -0.000300f, +0.001644f, -0.000749f, +0.000455f, +0.000419f, -0.001444f, -0.000732f, +0.000027f, + -0.000463f, +0.000017f, +0.000304f, -0.000201f, -0.000896f, -0.000340f + }, + { + -0.000643f, +0.007922f, +0.001604f, +0.000074f, -0.002472f, -0.000798f, +0.000253f, -0.000486f, +0.000884f, -0.002322f, + -0.000806f, -0.004474f, -0.000579f, -0.004620f, +0.006709f, -0.020002f, -0.028412f, -0.018137f, -0.001786f, +0.029562f, + +0.014903f, -0.017829f, -0.007005f, -0.000445f, +0.013991f, +0.013638f, +0.006043f, -0.006760f, +0.001135f, +0.004668f, + +0.009560f, -0.007787f, -0.008623f, +0.005301f, -0.001659f, -0.005195f, -0.001112f, -0.006144f, +0.003954f, -0.001049f, + -0.006750f, -0.003155f, -0.003221f, +0.000808f, -0.012709f, -0.000636f, +0.002122f, +0.001064f, +0.001143f, -0.006138f, + +0.001811f, -0.002196f, +0.004167f, +0.000253f, -0.001376f, -0.001443f, +0.000369f, -0.003077f, -0.002341f, +0.002507f, + +0.002504f, -0.000598f, +0.001368f, -0.001818f, +0.000841f, -0.003166f, -0.001363f, +0.001130f, +0.000336f, -0.000929f, + +0.001843f, -0.000117f, -0.000075f, -0.001047f, +0.001351f, +0.000322f, +0.001403f, -0.000690f, -0.000316f, +0.001177f, + -0.000504f, +0.000559f, -0.001098f, -0.001155f, +0.000669f, -0.000473f, +0.000469f, +0.001070f, +0.000069f, +0.001461f, + +0.000569f, +0.000511f, +0.000023f, -0.000931f, +0.001287f, -0.000436f + }, + { + -0.084217f, -0.105594f, +0.001691f, +0.081515f, -0.001245f, -0.001068f, +0.001656f, -0.001180f, +0.003486f, +0.010008f, + -0.009077f, -0.012157f, -0.011487f, -0.003112f, +0.011702f, +0.004498f, +0.000952f, +0.006364f, +0.004011f, +0.009022f, + -0.000967f, -0.006162f, -0.001752f, +0.002195f, -0.005099f, +0.007422f, +0.004603f, -0.007401f, -0.009381f, +0.001428f, + +0.000428f, +0.001960f, -0.004982f, +0.001239f, -0.005701f, -0.002792f, +0.001404f, +0.005072f, +0.014907f, +0.001112f, + +0.001488f, +0.004285f, +0.004452f, +0.002597f, -0.002013f, +0.004494f, +0.006302f, -0.003462f, +0.002601f, -0.003544f, + -0.000858f, +0.006159f, -0.001856f, +0.001152f, -0.004229f, -0.003377f, -0.000497f, -0.001027f, +0.002630f, -0.001655f, + -0.001813f, -0.000279f, +0.002224f, +0.000001f, -0.002024f, -0.000436f, -0.001435f, +0.000654f, +0.001161f, +0.000823f, + -0.000753f, -0.001377f, +0.002751f, -0.000998f, +0.000272f, -0.000273f, -0.001184f, -0.000210f, +0.000009f, +0.001541f, + +0.000534f, -0.000832f, -0.001433f, +0.000638f, +0.001115f, +0.000033f, -0.000196f, +0.000767f, -0.000010f, +0.000052f, + -0.000478f, +0.000731f, -0.000491f, +0.000173f, +0.000369f, -0.000142f + }, + { + +0.001204f, +0.052506f, +0.017207f, +0.015819f, -0.002557f, -0.007664f, -0.012974f, -0.011152f, +0.003559f, -0.007478f, + +0.004157f, -0.004713f, +0.001080f, +0.015064f, -0.000545f, +0.004937f, +0.004044f, -0.005082f, +0.023063f, -0.003353f, + +0.010786f, +0.005079f, +0.003518f, +0.016185f, +0.013763f, +0.009922f, -0.006641f, +0.019244f, +0.013238f, +0.007262f, + -0.007615f, -0.000852f, +0.002138f, -0.002977f, -0.009035f, +0.004177f, -0.005777f, +0.008862f, -0.004889f, -0.006321f, + +0.004495f, +0.000552f, -0.004369f, -0.005568f, +0.004774f, +0.001658f, +0.004816f, -0.001302f, -0.006256f, -0.004556f, + +0.002221f, -0.001431f, +0.002761f, -0.001297f, +0.002665f, +0.000853f, +0.000870f, -0.003534f, -0.001317f, +0.001344f, + +0.000936f, -0.000240f, +0.000002f, -0.000701f, -0.000151f, -0.000201f, +0.001274f, +0.000939f, +0.001087f, +0.000013f, + +0.000214f, -0.002345f, +0.000425f, +0.000945f, -0.001789f, +0.001117f, +0.000816f, +0.000059f, -0.001405f, -0.000905f, + -0.000335f, -0.000998f, +0.000637f, -0.000066f, +0.002346f, -0.000183f, -0.001123f, -0.000401f, -0.000706f, -0.001086f, + +0.000317f, +0.000018f, +0.000516f, +0.001078f, -0.000171f, -0.000495f + }, + { + -0.041777f, -0.177907f, -0.005917f, +0.010660f, +0.016855f, +0.012975f, +0.012164f, -0.010551f, -0.005342f, -0.003818f, + +0.004796f, +0.010306f, -0.000267f, +0.005217f, -0.007640f, +0.009140f, -0.000608f, -0.003400f, -0.008752f, +0.003679f, + -0.008215f, -0.001587f, +0.004199f, -0.001519f, -0.005035f, +0.016451f, -0.007338f, +0.006087f, +0.006201f, +0.003369f, + +0.008715f, +0.003198f, +0.002865f, -0.002570f, +0.000066f, +0.000644f, +0.005705f, +0.003204f, -0.002394f, +0.000183f, + +0.003334f, -0.000768f, +0.001204f, -0.000818f, -0.000189f, -0.001820f, +0.002385f, -0.000626f, +0.002078f, +0.003210f, + -0.004870f, -0.004182f, -0.005847f, -0.001096f, +0.004086f, +0.001268f, +0.000797f, -0.000878f, -0.000629f, +0.002982f, + -0.003095f, +0.000853f, -0.003216f, -0.001820f, -0.002807f, +0.002241f, +0.002737f, +0.000256f, -0.003060f, +0.003580f, + +0.001427f, -0.000121f, +0.002450f, +0.000434f, -0.001112f, -0.001653f, +0.000888f, +0.001312f, -0.001661f, -0.000078f, + +0.001348f, +0.000161f, -0.000221f, +0.000716f, +0.000108f, +0.000362f, -0.001284f, +0.000505f, +0.000788f, +0.000493f, + +0.000077f, +0.000588f, +0.000343f, -0.000078f, -0.000522f, -0.000015f + }, + { + -0.004892f, +0.024593f, +0.010279f, -0.004181f, +0.009535f, +0.011603f, +0.001075f, +0.007417f, +0.001524f, -0.001282f, + -0.001152f, -0.009625f, +0.003777f, -0.000452f, +0.013150f, +0.000790f, -0.021743f, +0.010567f, +0.014803f, +0.009080f, + +0.015939f, -0.007600f, +0.027223f, +0.009808f, +0.000205f, +0.006750f, -0.015395f, -0.000839f, +0.015367f, -0.004932f, + -0.001415f, +0.006125f, -0.005584f, -0.007390f, -0.003482f, -0.001627f, +0.006778f, +0.001879f, -0.003385f, +0.000889f, + +0.003695f, +0.002434f, +0.001583f, -0.002917f, -0.006371f, +0.001443f, +0.004692f, +0.000338f, +0.001578f, +0.006068f, + -0.000913f, -0.000468f, +0.003451f, -0.006001f, -0.001546f, -0.002005f, -0.000819f, +0.000043f, -0.000970f, -0.001221f, + +0.002415f, +0.000585f, -0.000453f, -0.003435f, +0.000021f, +0.002702f, -0.000487f, -0.001136f, +0.000512f, +0.000792f, + -0.000525f, -0.002339f, +0.001686f, -0.000205f, +0.002004f, +0.000275f, +0.002178f, -0.000921f, -0.000937f, +0.001351f, + +0.000010f, -0.001413f, +0.000256f, +0.000436f, +0.002647f, +0.000358f, +0.000156f, -0.000221f, -0.000542f, +0.001760f, + +0.001773f, +0.000977f, +0.000183f, -0.000167f, -0.000088f, -0.000399f + }, + { + +0.001366f, -0.357240f, -0.046428f, +0.008744f, +0.012506f, +0.051100f, +0.024702f, -0.011405f, -0.018514f, +0.019302f, + +0.011180f, -0.001741f, +0.010253f, +0.003522f, +0.002646f, -0.003138f, -0.009477f, -0.005215f, -0.003490f, +0.010708f, + -0.006568f, -0.015031f, -0.007996f, +0.006954f, +0.005149f, +0.006714f, +0.000524f, -0.010427f, +0.001898f, +0.009999f, + +0.001021f, -0.007359f, +0.000191f, -0.001737f, -0.003534f, -0.001350f, -0.001995f, +0.008192f, +0.005248f, +0.005185f, + -0.001329f, -0.006070f, -0.000762f, +0.004494f, -0.008107f, +0.002338f, -0.000100f, -0.002232f, +0.003631f, +0.002608f, + +0.001417f, -0.004569f, +0.000967f, +0.003381f, +0.000261f, +0.000008f, -0.002523f, -0.001980f, +0.000749f, +0.000581f, + +0.002860f, -0.001302f, -0.002771f, -0.005301f, -0.000367f, -0.000940f, +0.001823f, +0.001085f, +0.000577f, +0.003837f, + +0.000082f, +0.000103f, +0.003488f, +0.000422f, -0.000498f, +0.000485f, +0.000975f, +0.000998f, +0.000347f, +0.000542f, + -0.001758f, +0.000043f, +0.000152f, -0.000154f, +0.000165f, -0.001688f, +0.000199f, -0.000547f, -0.000469f, -0.001866f, + -0.000250f, -0.000346f, +0.000018f, -0.000078f, +0.000509f, -0.000431f + }, + { + -0.011519f, -0.017176f, -0.002612f, +0.003499f, -0.000355f, -0.007799f, -0.004878f, -0.000531f, -0.019511f, -0.007005f, + -0.011826f, +0.008951f, +0.021283f, -0.002470f, -0.029942f, -0.000979f, +0.015163f, +0.006784f, -0.000968f, -0.015261f, + +0.007474f, +0.007519f, +0.015380f, -0.005109f, +0.009308f, +0.003243f, +0.002714f, +0.009314f, +0.000333f, -0.005650f, + -0.006842f, +0.015239f, +0.000106f, +0.002433f, +0.007964f, -0.001340f, -0.000970f, +0.005224f, -0.003505f, -0.004779f, + +0.002132f, -0.002762f, +0.000476f, +0.002197f, +0.002170f, -0.003706f, +0.000702f, -0.000181f, +0.002885f, +0.001057f, + +0.002446f, -0.003223f, -0.000063f, -0.004586f, +0.004709f, +0.001212f, -0.000308f, +0.002846f, -0.004448f, -0.000047f, + +0.000245f, -0.000822f, -0.001111f, -0.002777f, +0.000653f, +0.000126f, +0.000412f, +0.001947f, -0.000212f, -0.002716f, + -0.000343f, +0.001624f, +0.003278f, +0.002735f, +0.000534f, +0.000730f, +0.001627f, +0.000669f, +0.000703f, +0.000477f, + -0.000209f, -0.000013f, -0.001478f, -0.000408f, -0.001048f, +0.000152f, +0.001201f, -0.000660f, +0.000462f, -0.001211f, + -0.001050f, +0.000537f, -0.001624f, -0.000461f, -0.000080f, -0.000367f + }, + { + +0.046651f, -0.103470f, -0.012704f, +0.015636f, +0.024142f, +0.015735f, +0.013920f, -0.009627f, +0.004063f, -0.021852f, + +0.006477f, -0.017713f, -0.014123f, -0.009181f, -0.025635f, -0.006044f, -0.008111f, -0.006971f, +0.006809f, +0.003662f, + -0.003480f, -0.006031f, -0.007055f, +0.015834f, +0.002625f, +0.006480f, +0.000769f, -0.000701f, +0.004113f, -0.002830f, + -0.003836f, -0.005137f, +0.002734f, -0.000144f, -0.003662f, +0.000659f, +0.000076f, +0.011775f, -0.000738f, -0.006235f, + +0.005911f, +0.003868f, +0.000363f, +0.001515f, -0.005134f, -0.005407f, -0.003428f, -0.001137f, +0.007051f, -0.001999f, + -0.002862f, +0.000120f, +0.002695f, +0.000089f, +0.002025f, -0.000608f, -0.001148f, -0.000114f, -0.000922f, +0.003257f, + +0.005062f, +0.001115f, -0.004443f, -0.002262f, -0.000403f, +0.003531f, +0.000681f, -0.000733f, -0.001545f, +0.004141f, + +0.000751f, -0.001010f, -0.000088f, +0.001729f, -0.001183f, -0.000562f, +0.000334f, -0.002152f, -0.000314f, -0.001544f, + +0.001062f, +0.001334f, -0.001765f, -0.000141f, -0.000713f, -0.000528f, -0.001922f, +0.001569f, +0.000800f, -0.000190f, + -0.000441f, -0.000090f, -0.000604f, +0.000793f, +0.000922f, +0.000172f + } + }, + { + { + +0.000799f, +0.005775f, +0.002777f, +0.011541f, +0.014104f, -0.001438f, -0.002109f, -0.002364f, -0.003428f, -0.002095f, + +0.007603f, -0.003808f, -0.003432f, +0.007572f, -0.003270f, +0.017155f, -0.001894f, +0.017160f, +0.005898f, -0.018148f, + +0.019316f, +0.003688f, +0.002021f, +0.013375f, -0.018312f, +0.006843f, -0.004742f, -0.016113f, -0.000137f, +0.016900f, + +0.004659f, -0.001888f, +0.014070f, -0.006582f, +0.000270f, -0.000746f, +0.000235f, -0.002949f, -0.002252f, +0.003361f, + -0.002870f, +0.002338f, -0.002383f, -0.002737f, -0.001068f, +0.002973f, +0.001432f, +0.002106f, -0.001002f, +0.000980f, + +0.000343f, -0.001174f, +0.000027f, +0.003551f, -0.002260f, +0.002259f, +0.002309f, +0.000038f, +0.000280f, +0.001866f, + +0.000288f, +0.004980f, +0.000019f, +0.002686f, +0.001822f, +0.002609f, +0.000856f, +0.000045f, +0.002128f, +0.000288f, + +0.000637f, -0.000187f, +0.000580f, -0.001480f, -0.000267f, +0.000512f, +0.000700f, -0.000966f, +0.000009f, +0.000216f, + -0.000318f, +0.000018f, -0.000394f, +0.000161f, +0.000559f, -0.000176f, -0.001463f, -0.000046f, -0.000597f, -0.000402f, + -0.000762f, +0.000255f, +0.000238f, +0.000592f, -0.000571f, +0.000190f + }, + { + +0.011518f, -0.123879f, -0.016944f, +0.017254f, +0.006114f, +0.002611f, +0.005642f, -0.007285f, -0.000159f, -0.004025f, + -0.012962f, +0.002304f, -0.001290f, -0.001029f, +0.000458f, -0.002415f, -0.006393f, +0.006656f, +0.004411f, +0.004199f, + +0.017116f, -0.008634f, +0.011622f, -0.001812f, -0.023729f, -0.004537f, -0.001313f, -0.000614f, -0.003933f, -0.006623f, + +0.002745f, -0.011741f, +0.013918f, -0.000093f, -0.005236f, +0.005417f, +0.004363f, +0.005725f, +0.008041f, +0.000111f, + -0.004179f, +0.002555f, +0.003208f, -0.000976f, +0.006662f, +0.004413f, +0.001872f, +0.001065f, -0.000624f, -0.001236f, + +0.001615f, -0.001549f, +0.003232f, -0.004190f, +0.000675f, +0.002063f, -0.000526f, +0.002068f, -0.000449f, -0.000767f, + +0.000141f, +0.001631f, -0.002809f, +0.001291f, +0.000185f, +0.001722f, +0.000262f, -0.000052f, -0.000979f, -0.001043f, + -0.000896f, -0.001331f, -0.000008f, -0.000405f, +0.000474f, -0.000471f, +0.001763f, -0.001159f, +0.000494f, -0.001248f, + +0.000379f, +0.000374f, -0.000340f, +0.000286f, -0.000505f, +0.000620f, +0.000209f, +0.000462f, -0.000245f, +0.000176f, + +0.000142f, -0.000368f, +0.000267f, -0.000042f, +0.000071f, -0.000535f + }, + { + -0.001226f, +0.005775f, +0.011695f, -0.000330f, +0.011902f, -0.001901f, +0.003706f, +0.003736f, +0.003403f, +0.002998f, + +0.004645f, +0.001431f, -0.004099f, -0.004819f, +0.001708f, +0.003607f, +0.000350f, +0.008974f, +0.008202f, -0.011338f, + +0.002466f, -0.010978f, +0.001360f, +0.002732f, +0.000228f, -0.001326f, -0.004418f, -0.005819f, -0.004315f, -0.000754f, + -0.002258f, -0.005519f, +0.002653f, -0.002637f, +0.006278f, +0.002089f, -0.007536f, -0.008200f, +0.008952f, +0.001898f, + -0.007373f, -0.002375f, +0.000324f, -0.004078f, -0.001106f, +0.001290f, -0.005855f, -0.000790f, -0.000865f, +0.001427f, + -0.000328f, +0.001057f, +0.000168f, -0.000706f, -0.001995f, -0.000393f, -0.000538f, -0.000362f, +0.000741f, +0.000121f, + -0.000822f, -0.000048f, +0.000243f, +0.001079f, -0.001044f, +0.000345f, +0.002090f, +0.002035f, -0.001754f, -0.000566f, + +0.000289f, -0.001563f, -0.002043f, +0.000591f, -0.000374f, -0.000219f, -0.002119f, -0.000840f, -0.000028f, -0.000397f, + -0.000123f, +0.001486f, -0.000054f, +0.000015f, +0.001052f, +0.000103f, -0.000619f, +0.000145f, +0.000187f, -0.000601f, + +0.000060f, -0.000230f, -0.000317f, +0.000177f, -0.000524f, -0.000346f + }, + { + +0.005229f, +0.013113f, -0.004920f, +0.001215f, +0.002178f, -0.000576f, -0.000889f, +0.001345f, -0.001498f, -0.004928f, + +0.002827f, +0.004693f, +0.005539f, +0.003371f, +0.037143f, +0.010683f, -0.016715f, +0.012423f, -0.015005f, +0.004648f, + +0.017478f, +0.005900f, +0.002665f, +0.003849f, -0.004121f, -0.008645f, +0.010942f, +0.004672f, -0.000079f, +0.011050f, + -0.007835f, +0.001420f, +0.013001f, +0.005056f, -0.001551f, +0.003657f, +0.001871f, -0.006202f, +0.002819f, +0.001051f, + -0.000318f, +0.001458f, -0.000236f, -0.004650f, +0.002318f, +0.003398f, +0.001972f, +0.002619f, -0.002800f, +0.003723f, + -0.000665f, +0.002542f, -0.004076f, +0.002693f, -0.000910f, -0.002294f, -0.002872f, +0.000133f, -0.000347f, -0.000146f, + +0.000904f, +0.002349f, -0.000085f, -0.000227f, +0.001260f, +0.000873f, +0.000357f, -0.000932f, -0.000925f, +0.001301f, + -0.001603f, -0.001474f, -0.000523f, +0.000722f, +0.000292f, -0.000483f, -0.000053f, +0.000543f, -0.000068f, +0.000821f, + +0.000796f, -0.000593f, +0.000166f, +0.000478f, -0.000188f, +0.000081f, +0.000276f, +0.000855f, -0.000077f, -0.000401f, + -0.000139f, +0.000481f, +0.000235f, +0.001033f, -0.000438f, +0.000343f + }, + { + +0.012568f, +0.160851f, -0.017435f, +0.065937f, -0.002850f, +0.000815f, -0.001525f, +0.000618f, +0.002611f, -0.009630f, + -0.003766f, -0.001157f, -0.002714f, +0.002647f, -0.002415f, +0.000797f, -0.008836f, -0.005736f, +0.008032f, -0.004360f, + -0.005519f, +0.001978f, -0.003252f, -0.003276f, -0.000637f, -0.002193f, -0.009458f, +0.012471f, +0.002548f, +0.000227f, + +0.003363f, -0.002987f, +0.006184f, +0.004739f, +0.003769f, +0.001933f, -0.009241f, +0.000097f, +0.002370f, +0.005016f, + +0.003398f, -0.004869f, -0.006551f, -0.002247f, -0.006138f, -0.003941f, -0.003289f, -0.001925f, -0.006650f, +0.001476f, + +0.003342f, +0.000364f, +0.003912f, -0.000966f, +0.001396f, +0.001578f, +0.003094f, +0.001794f, -0.002538f, -0.000830f, + +0.003936f, -0.002879f, +0.000757f, -0.000757f, -0.000647f, -0.000743f, +0.002558f, -0.000780f, +0.001439f, -0.002301f, + -0.002036f, +0.000791f, +0.000016f, +0.000563f, -0.002225f, -0.000321f, +0.000758f, +0.000953f, -0.000436f, +0.000412f, + -0.001387f, -0.000348f, +0.000416f, -0.000528f, -0.000432f, -0.001223f, -0.000355f, -0.000519f, -0.000839f, -0.000273f, + +0.001013f, +0.000232f, +0.000503f, -0.000665f, -0.000493f, -0.000072f + }, + { + -0.001776f, -0.015605f, +0.000114f, +0.002210f, -0.002107f, +0.000086f, -0.000069f, -0.000586f, -0.000060f, +0.005060f, + -0.002886f, -0.001349f, +0.002608f, -0.008097f, +0.006315f, +0.004761f, +0.025259f, +0.015366f, +0.010829f, -0.016228f, + +0.000644f, +0.009370f, +0.008039f, +0.007609f, -0.015480f, +0.005753f, +0.023120f, -0.000059f, +0.001426f, -0.015186f, + +0.004893f, +0.010931f, +0.002441f, +0.018634f, +0.003952f, -0.008449f, -0.004033f, -0.003751f, +0.003977f, -0.002384f, + -0.000843f, +0.000539f, -0.000513f, +0.000398f, +0.000436f, -0.002225f, +0.000589f, -0.001805f, +0.001830f, -0.001378f, + +0.000623f, -0.004651f, +0.000176f, -0.000471f, -0.001747f, +0.000246f, +0.000880f, -0.001899f, -0.000509f, -0.001576f, + +0.000798f, +0.001874f, -0.000195f, +0.002348f, +0.001807f, -0.000408f, +0.001089f, +0.001123f, +0.000622f, +0.001731f, + +0.000354f, +0.001740f, +0.002778f, -0.000269f, +0.000379f, +0.000988f, +0.000247f, -0.000045f, +0.000642f, -0.001710f, + -0.000642f, -0.000399f, -0.000365f, +0.000508f, +0.000084f, -0.000672f, -0.000146f, -0.000198f, +0.000177f, -0.000562f, + +0.000089f, -0.000581f, -0.000999f, +0.000708f, -0.000171f, +0.000472f + }, + { + -0.028570f, +0.142406f, +0.000757f, +0.079307f, -0.006764f, +0.002228f, -0.002286f, +0.011954f, -0.001501f, +0.010502f, + -0.000980f, -0.008892f, -0.000832f, -0.011245f, +0.003237f, +0.001346f, +0.001724f, -0.000876f, +0.008586f, +0.009111f, + -0.000693f, -0.008562f, +0.004053f, +0.002325f, +0.005757f, -0.007550f, -0.006333f, +0.001348f, -0.000414f, -0.004892f, + -0.003906f, +0.002033f, +0.003053f, -0.004045f, +0.002363f, -0.001202f, -0.004815f, -0.001527f, -0.003121f, +0.004430f, + -0.000713f, -0.002322f, +0.004531f, -0.007884f, -0.001447f, -0.007108f, -0.006193f, +0.001807f, -0.002338f, +0.004652f, + -0.007451f, +0.002849f, -0.000979f, +0.004603f, +0.002244f, +0.000895f, -0.000511f, -0.001547f, +0.001679f, -0.001211f, + +0.001292f, +0.001455f, -0.001724f, +0.003030f, -0.000612f, -0.001168f, +0.000856f, +0.001881f, -0.001086f, -0.001666f, + +0.001080f, +0.000618f, +0.000439f, +0.001565f, +0.001024f, +0.000233f, +0.000100f, -0.000406f, -0.000466f, +0.000422f, + +0.001476f, +0.000071f, -0.000493f, +0.000156f, -0.001629f, +0.000600f, +0.000535f, -0.001143f, -0.000341f, +0.000412f, + +0.000443f, -0.000132f, -0.000122f, -0.000056f, -0.000867f, -0.000159f + }, + { + -0.001767f, +0.002266f, -0.004004f, +0.003286f, +0.002076f, +0.000092f, +0.000417f, +0.002160f, +0.005800f, +0.000014f, + +0.005655f, +0.001622f, +0.000459f, -0.013984f, +0.010422f, +0.017627f, +0.022761f, +0.010582f, +0.002997f, +0.014452f, + +0.002391f, -0.013780f, -0.004364f, -0.013115f, -0.005317f, +0.007327f, -0.000204f, -0.007442f, +0.005067f, -0.001498f, + +0.006945f, -0.005735f, -0.019377f, +0.000832f, -0.001521f, +0.001903f, +0.005415f, -0.002253f, -0.002109f, -0.003548f, + -0.000913f, +0.003933f, +0.004705f, +0.003373f, -0.011432f, -0.000094f, +0.000985f, +0.002700f, +0.001280f, -0.001849f, + +0.006513f, -0.001312f, +0.002038f, -0.003199f, -0.000414f, -0.001529f, -0.001533f, +0.001708f, +0.001308f, +0.001942f, + +0.000945f, -0.003400f, -0.001518f, -0.001242f, +0.002876f, -0.002180f, -0.001568f, +0.000243f, -0.001633f, -0.001724f, + +0.002830f, -0.001018f, -0.001503f, -0.001708f, +0.002059f, +0.000192f, +0.000005f, -0.002047f, -0.000580f, +0.000368f, + -0.000900f, +0.000791f, -0.000012f, +0.000075f, +0.000021f, -0.000600f, -0.000246f, +0.000079f, -0.000528f, -0.000144f, + -0.000285f, +0.000143f, -0.000372f, -0.001094f, +0.001152f, -0.000741f + }, + { + +0.055432f, +0.099860f, -0.000121f, +0.071189f, +0.002313f, -0.000125f, +0.003120f, +0.003069f, +0.001837f, +0.002676f, + -0.009307f, -0.010624f, -0.000045f, -0.003002f, +0.001019f, -0.005845f, +0.001376f, +0.001672f, -0.007471f, +0.003720f, + +0.001255f, -0.001114f, -0.001320f, -0.002422f, -0.006511f, +0.000874f, +0.002028f, -0.001423f, -0.007817f, +0.002722f, + -0.002537f, -0.000962f, -0.010938f, +0.004668f, +0.000442f, +0.002726f, +0.004294f, -0.001822f, +0.001077f, -0.005860f, + +0.002522f, +0.009475f, +0.001492f, +0.000796f, -0.003509f, +0.001190f, +0.003069f, -0.007269f, -0.000941f, -0.007795f, + -0.006353f, +0.002674f, -0.005354f, +0.002732f, +0.002752f, -0.002583f, +0.000260f, +0.000321f, +0.001693f, -0.000873f, + -0.000871f, +0.000595f, +0.000509f, -0.001404f, -0.000482f, -0.000381f, -0.001481f, +0.000615f, -0.000015f, -0.001169f, + +0.000055f, -0.000307f, +0.002347f, -0.000304f, +0.000895f, +0.001019f, -0.000247f, +0.001036f, +0.000269f, +0.001255f, + -0.000349f, -0.000936f, +0.000003f, +0.000447f, +0.000239f, -0.000783f, -0.000823f, +0.000442f, -0.000451f, -0.000135f, + -0.000310f, +0.000452f, -0.000125f, +0.000000f, -0.000358f, -0.000344f + }, + { + +0.001927f, +0.035730f, -0.012597f, +0.002116f, +0.006916f, -0.003990f, -0.005560f, -0.001664f, +0.003645f, -0.008972f, + +0.001734f, +0.001800f, +0.001955f, -0.000068f, -0.003932f, +0.006794f, +0.009333f, -0.007631f, +0.023726f, -0.002977f, + +0.003203f, +0.002576f, -0.007465f, +0.005996f, +0.006846f, +0.008632f, -0.002347f, +0.005267f, +0.004505f, +0.005977f, + -0.003155f, +0.003941f, +0.008595f, -0.000882f, -0.011550f, +0.003693f, -0.006007f, +0.008808f, -0.005676f, -0.002256f, + +0.005686f, -0.007008f, -0.006268f, -0.002901f, +0.000103f, +0.001007f, +0.001251f, -0.002431f, -0.000461f, +0.002121f, + +0.004065f, -0.003216f, +0.001885f, -0.001508f, -0.001130f, +0.000753f, +0.001457f, -0.003712f, +0.000793f, +0.001278f, + +0.002529f, -0.001158f, +0.001297f, +0.001740f, +0.000656f, -0.001073f, -0.000562f, -0.001794f, +0.000209f, -0.000276f, + +0.001028f, -0.001902f, -0.000291f, -0.000170f, -0.000866f, +0.000590f, -0.001141f, +0.001367f, +0.000150f, -0.000207f, + +0.000688f, -0.000237f, +0.000276f, -0.000361f, +0.000473f, -0.000837f, +0.000114f, +0.000346f, -0.000165f, -0.000493f, + +0.000056f, -0.000908f, -0.000258f, +0.000544f, +0.000152f, +0.000018f + }, + { + +0.039298f, -0.107858f, -0.033545f, +0.019091f, +0.010333f, -0.012951f, -0.000032f, -0.003344f, -0.008293f, -0.004063f, + +0.000188f, +0.011609f, +0.001096f, +0.000706f, -0.004416f, +0.010184f, +0.003443f, +0.002327f, -0.010758f, +0.002243f, + -0.013378f, -0.003639f, +0.006040f, +0.005144f, -0.004856f, +0.015455f, -0.004771f, +0.012582f, +0.013174f, -0.000509f, + +0.001618f, +0.000891f, +0.003879f, -0.002163f, -0.000420f, +0.001412f, +0.001159f, +0.002639f, -0.005804f, -0.003833f, + +0.001247f, +0.000579f, +0.004234f, +0.003601f, -0.000112f, -0.003063f, +0.002140f, -0.002001f, +0.000816f, +0.000381f, + -0.002429f, +0.002562f, -0.001322f, -0.002120f, -0.000460f, -0.001421f, +0.001893f, +0.000219f, -0.001068f, +0.001715f, + -0.002616f, +0.002264f, -0.000453f, +0.000376f, -0.003246f, +0.000822f, -0.001588f, +0.000610f, -0.001726f, +0.000869f, + +0.000009f, -0.000422f, +0.001284f, +0.000857f, -0.000631f, -0.001655f, +0.001488f, +0.000654f, -0.001781f, -0.000286f, + +0.000556f, +0.000395f, +0.000351f, +0.000032f, +0.000340f, +0.000533f, -0.000460f, -0.000152f, +0.000268f, +0.000224f, + +0.000005f, -0.000056f, +0.000209f, -0.000005f, -0.000668f, +0.000455f + }, + { + +0.005726f, +0.006836f, -0.015951f, -0.004541f, +0.012954f, +0.009406f, +0.002107f, +0.011605f, +0.000207f, -0.004787f, + +0.002955f, -0.002030f, +0.001274f, -0.026432f, +0.008321f, +0.003835f, -0.011725f, +0.005418f, -0.010700f, -0.002065f, + +0.002839f, -0.035471f, +0.010438f, -0.006205f, -0.007685f, +0.006728f, +0.001301f, +0.005985f, +0.000652f, -0.018987f, + -0.007423f, +0.006181f, +0.006080f, +0.002943f, +0.002473f, -0.005129f, +0.000794f, +0.004970f, +0.000872f, -0.002171f, + +0.002376f, +0.000673f, -0.002208f, -0.003183f, -0.002833f, +0.004521f, +0.004474f, -0.002318f, +0.000946f, +0.007418f, + +0.000602f, +0.001714f, +0.001823f, -0.003935f, +0.001753f, -0.000502f, +0.000435f, -0.002155f, -0.000415f, -0.000868f, + -0.001607f, -0.001080f, +0.001685f, -0.000915f, -0.001174f, +0.000884f, +0.000717f, -0.000965f, +0.001831f, +0.000903f, + -0.000601f, -0.001142f, +0.000482f, -0.001239f, +0.001079f, -0.000467f, +0.001603f, +0.000120f, +0.001550f, +0.001931f, + -0.000199f, -0.000165f, +0.001074f, -0.000448f, +0.000760f, -0.001251f, -0.000528f, -0.000580f, -0.001204f, +0.000024f, + -0.000194f, +0.000100f, +0.000474f, +0.000586f, -0.000561f, -0.000174f + }, + { + +0.063063f, -0.278205f, -0.039671f, +0.023902f, +0.025312f, +0.017294f, -0.023075f, -0.008527f, -0.010824f, +0.014375f, + +0.014389f, +0.004940f, -0.000602f, -0.012720f, +0.001812f, +0.001313f, -0.006072f, +0.000766f, -0.014450f, +0.001914f, + -0.000668f, -0.007840f, -0.005478f, +0.006300f, +0.001468f, -0.011856f, +0.000537f, +0.004074f, +0.001504f, +0.005338f, + +0.001599f, -0.003071f, -0.004355f, -0.002035f, -0.003350f, -0.003670f, -0.006362f, +0.001691f, +0.001810f, +0.004955f, + +0.002627f, -0.002083f, +0.000490f, +0.009171f, +0.001455f, +0.009224f, +0.000036f, -0.004393f, -0.002697f, -0.003755f, + -0.003637f, -0.004193f, +0.003771f, +0.003866f, -0.001175f, -0.001129f, -0.003168f, -0.000692f, -0.000153f, -0.002263f, + +0.000881f, +0.000231f, +0.000392f, -0.002715f, +0.000175f, -0.000229f, +0.000058f, -0.000203f, +0.001924f, +0.004245f, + +0.000517f, +0.000065f, +0.002934f, -0.000041f, -0.000875f, -0.001107f, -0.001186f, +0.000017f, -0.000389f, -0.000092f, + -0.000471f, +0.000168f, +0.000405f, +0.000372f, +0.001606f, +0.000066f, +0.000931f, -0.000117f, +0.000690f, -0.000240f, + +0.000823f, +0.000497f, -0.000060f, -0.000193f, +0.000472f, -0.000145f + }, + { + +0.010849f, -0.013021f, -0.017647f, +0.001814f, -0.000954f, -0.001311f, +0.002955f, +0.009786f, -0.002343f, +0.006287f, + -0.006675f, -0.002351f, +0.006375f, -0.017139f, -0.011598f, +0.022613f, +0.006697f, +0.005198f, -0.001393f, -0.003207f, + +0.013671f, +0.002631f, -0.003011f, -0.019196f, -0.004429f, -0.001699f, +0.006971f, +0.020358f, +0.008844f, +0.007972f, + -0.013340f, +0.001540f, -0.004312f, -0.000118f, +0.005722f, +0.003737f, +0.005852f, +0.009007f, -0.005744f, -0.002741f, + +0.001769f, -0.003019f, +0.001768f, -0.003149f, -0.000530f, -0.001927f, +0.003289f, +0.002714f, +0.001151f, -0.001166f, + +0.003568f, -0.002004f, -0.000524f, -0.001592f, +0.003357f, +0.002932f, -0.002019f, +0.002001f, +0.001010f, +0.000316f, + -0.002176f, +0.000238f, +0.002571f, -0.000928f, -0.000439f, -0.000460f, -0.002861f, +0.000648f, +0.002478f, -0.001978f, + -0.000073f, +0.000113f, +0.001273f, +0.000795f, -0.000027f, +0.000334f, +0.000497f, -0.000145f, -0.000046f, +0.000138f, + -0.000207f, +0.000880f, +0.000344f, +0.000951f, -0.000552f, -0.000580f, +0.001436f, -0.000432f, +0.001057f, +0.000552f, + +0.000221f, +0.001343f, -0.000300f, +0.000350f, +0.000958f, +0.000270f + }, + { + -0.006620f, -0.204228f, -0.030984f, +0.018097f, +0.008175f, -0.016265f, +0.001241f, -0.012709f, +0.000489f, +0.001128f, + +0.018834f, -0.016320f, +0.004159f, +0.005432f, -0.008831f, +0.007293f, +0.006135f, -0.013345f, -0.012758f, -0.013855f, + +0.005239f, +0.003008f, -0.012652f, +0.002424f, +0.003864f, +0.014107f, +0.002676f, +0.000808f, +0.003648f, +0.002162f, + +0.002894f, -0.003116f, +0.000899f, +0.004302f, +0.001432f, +0.004006f, -0.002547f, +0.001696f, +0.000284f, -0.003696f, + -0.004010f, -0.005784f, -0.004917f, -0.000399f, -0.001787f, +0.001128f, +0.002926f, +0.001782f, +0.004105f, +0.001242f, + +0.004629f, +0.002309f, -0.002039f, -0.004341f, +0.001390f, +0.000715f, -0.001201f, -0.002162f, -0.002151f, +0.001415f, + +0.000338f, +0.002138f, -0.002109f, -0.001270f, +0.000348f, +0.001936f, +0.000047f, +0.001170f, +0.001049f, +0.003256f, + -0.000368f, +0.000535f, +0.000163f, +0.000723f, -0.000747f, -0.000117f, -0.000444f, -0.001142f, +0.001023f, -0.001136f, + +0.000244f, -0.000826f, -0.001602f, -0.000030f, -0.001241f, -0.000439f, -0.001686f, +0.000815f, +0.000395f, -0.000474f, + +0.000445f, -0.000129f, -0.001163f, +0.000096f, -0.000259f, -0.000540f + } + }, + { + { + -0.000674f, +0.025484f, -0.011719f, +0.031493f, -0.002843f, +0.000382f, -0.003131f, -0.002809f, -0.001260f, -0.000113f, + -0.005692f, -0.009160f, +0.002239f, +0.006914f, +0.005751f, +0.027285f, +0.009128f, +0.006269f, +0.006104f, -0.010107f, + -0.000870f, +0.005735f, +0.000007f, +0.011451f, -0.002147f, +0.001450f, -0.020833f, -0.007667f, -0.003493f, +0.009728f, + +0.001961f, +0.001569f, +0.008406f, -0.002275f, +0.002059f, -0.002170f, +0.002375f, +0.000967f, -0.003310f, +0.001480f, + +0.003688f, -0.005992f, -0.003397f, -0.000932f, +0.002641f, +0.001058f, +0.002067f, +0.001509f, -0.002094f, +0.000018f, + +0.001198f, -0.001986f, -0.000850f, -0.000206f, -0.000897f, +0.002420f, +0.001177f, +0.001186f, +0.001520f, +0.002696f, + +0.000582f, +0.001500f, +0.002684f, +0.002264f, +0.002326f, +0.001793f, +0.000123f, -0.000197f, -0.000150f, +0.000747f, + +0.001867f, -0.000066f, -0.000024f, -0.000148f, -0.001240f, +0.000464f, +0.000553f, -0.000347f, -0.001404f, +0.000731f, + -0.000360f, -0.000257f, -0.001277f, +0.000464f, +0.000073f, -0.000463f, -0.001009f, -0.000560f, -0.000022f, -0.000591f, + -0.000388f, +0.000029f, +0.000358f, -0.000267f, +0.000179f, +0.000038f + }, + { + -0.001282f, -0.101385f, +0.000149f, +0.012574f, +0.004734f, +0.003070f, -0.002190f, +0.005505f, +0.001462f, -0.005975f, + -0.019011f, +0.009150f, -0.003909f, +0.005460f, -0.000512f, -0.008161f, +0.002387f, +0.005487f, +0.008911f, +0.006394f, + +0.015950f, +0.000698f, -0.005150f, +0.002213f, -0.013337f, -0.006576f, +0.001239f, -0.004906f, -0.005634f, +0.003885f, + -0.008708f, -0.007601f, +0.006687f, +0.004469f, -0.001526f, +0.002775f, +0.004658f, +0.007103f, +0.004251f, +0.002748f, + -0.001422f, -0.000138f, +0.003305f, +0.000696f, +0.001157f, +0.003898f, +0.002867f, +0.002008f, +0.002715f, +0.000455f, + +0.001980f, -0.004825f, +0.000444f, -0.001032f, -0.002683f, +0.002321f, +0.000220f, -0.000441f, +0.000860f, +0.000127f, + -0.001924f, +0.001323f, -0.001792f, -0.000586f, +0.001754f, +0.000583f, +0.001285f, -0.001961f, -0.000220f, -0.001584f, + -0.001263f, -0.001210f, +0.000834f, -0.000656f, +0.001481f, -0.000746f, +0.001418f, -0.001073f, +0.000378f, -0.000472f, + -0.001095f, +0.001048f, -0.000507f, +0.000284f, +0.000094f, +0.000574f, -0.000207f, +0.000507f, -0.000001f, +0.000471f, + -0.000737f, -0.000207f, +0.000010f, +0.000103f, +0.000240f, -0.000658f + }, + { + +0.004354f, -0.002402f, +0.021918f, +0.062429f, -0.036406f, -0.001033f, +0.000618f, +0.004010f, +0.005936f, +0.004273f, + +0.003471f, +0.000984f, +0.000706f, +0.003534f, +0.009490f, -0.010152f, +0.008621f, +0.005507f, +0.011796f, -0.001428f, + -0.004516f, -0.021094f, +0.006869f, +0.002367f, -0.004332f, -0.000911f, +0.000808f, -0.008556f, -0.002028f, -0.000572f, + -0.005968f, -0.009458f, +0.009618f, +0.000699f, -0.000332f, +0.002508f, -0.008806f, -0.001933f, +0.002238f, +0.006439f, + -0.006964f, -0.003364f, -0.002883f, -0.005613f, -0.001113f, +0.001376f, -0.002271f, -0.001833f, -0.001827f, -0.001172f, + +0.002561f, +0.003009f, -0.000556f, -0.002857f, -0.002805f, +0.000043f, -0.000519f, +0.000228f, -0.000549f, +0.001388f, + -0.001562f, -0.001296f, +0.001320f, -0.000866f, +0.001395f, +0.000348f, +0.001651f, -0.000654f, +0.001098f, -0.000774f, + -0.001192f, -0.000184f, -0.000811f, -0.000500f, -0.000814f, -0.000597f, -0.001185f, -0.001073f, -0.000798f, +0.000349f, + -0.000126f, +0.000168f, +0.000335f, +0.000059f, +0.000899f, -0.000675f, +0.000550f, +0.000177f, -0.000128f, -0.000106f, + +0.000464f, -0.001000f, -0.000023f, +0.000120f, -0.000389f, +0.000146f + }, + { + -0.004938f, +0.011682f, +0.008535f, +0.000898f, +0.000915f, -0.001246f, +0.001332f, -0.002487f, +0.001075f, -0.003546f, + +0.000472f, +0.003873f, +0.011387f, +0.010297f, +0.008565f, +0.008043f, +0.033446f, -0.026397f, +0.015078f, +0.008979f, + +0.003504f, +0.010104f, -0.003362f, +0.006844f, -0.008406f, +0.005980f, +0.007596f, +0.000409f, -0.006447f, +0.007174f, + +0.002338f, +0.001076f, +0.009244f, +0.007479f, -0.002468f, +0.002859f, -0.004195f, -0.000867f, -0.000743f, -0.002180f, + -0.001711f, +0.000554f, -0.001326f, +0.004227f, +0.000693f, +0.001809f, -0.000113f, +0.001097f, -0.000975f, -0.000691f, + +0.003926f, -0.000293f, -0.001681f, +0.002619f, -0.001232f, -0.002837f, -0.001586f, -0.000110f, -0.001631f, +0.001601f, + +0.001870f, +0.000022f, +0.000869f, +0.000676f, +0.001621f, -0.000482f, -0.000315f, -0.001529f, -0.000584f, +0.000248f, + +0.000901f, -0.001042f, +0.000719f, -0.000237f, +0.001189f, -0.000297f, -0.001510f, +0.000409f, +0.000760f, +0.000463f, + +0.000799f, -0.000745f, -0.000082f, +0.000819f, -0.000851f, +0.000155f, +0.000299f, +0.000886f, -0.000995f, -0.000091f, + +0.000562f, +0.000167f, +0.000367f, +0.000075f, -0.000091f, +0.000111f + }, + { + +0.017277f, +0.137196f, -0.014053f, +0.061965f, +0.006144f, +0.001604f, +0.004373f, -0.007067f, -0.000992f, -0.008677f, + -0.000310f, -0.004151f, -0.008521f, +0.007714f, -0.015524f, +0.008628f, -0.009246f, +0.001828f, -0.001264f, -0.001960f, + -0.007126f, -0.000092f, -0.000415f, -0.000623f, +0.001737f, -0.004809f, -0.004418f, -0.001481f, +0.004121f, +0.000393f, + +0.005210f, +0.000178f, -0.000496f, +0.012185f, -0.000225f, -0.000975f, +0.004399f, -0.004421f, +0.004791f, +0.001320f, + +0.001209f, -0.004161f, -0.007158f, -0.003489f, -0.002656f, -0.002329f, -0.002013f, -0.003473f, -0.006188f, -0.001520f, + +0.004383f, +0.002855f, -0.001087f, +0.003436f, +0.001663f, +0.000806f, +0.003924f, -0.000012f, -0.000083f, +0.000049f, + +0.002758f, -0.002944f, +0.000837f, -0.000149f, -0.002335f, +0.000858f, +0.002928f, -0.000176f, +0.002018f, -0.002092f, + -0.001395f, +0.000323f, +0.000907f, +0.000104f, -0.001969f, -0.000154f, -0.000179f, -0.000215f, -0.000227f, -0.000274f, + -0.000867f, +0.000036f, +0.000033f, -0.000416f, -0.000252f, -0.000560f, -0.000449f, -0.000554f, -0.000945f, +0.000580f, + +0.000356f, +0.000424f, +0.000328f, +0.000250f, -0.000607f, -0.000609f + }, + { + +0.000940f, -0.016543f, -0.003623f, +0.001758f, -0.002071f, +0.000572f, +0.000446f, -0.001896f, +0.001208f, +0.003137f, + -0.005128f, +0.000019f, -0.000965f, +0.013464f, -0.006567f, +0.007785f, +0.012310f, +0.026586f, +0.000392f, -0.004126f, + +0.001816f, +0.002107f, +0.006899f, -0.001498f, +0.004368f, +0.003156f, -0.009868f, +0.026167f, +0.003348f, -0.016675f, + +0.004777f, +0.001147f, +0.004736f, +0.013901f, +0.001652f, +0.001414f, -0.006188f, -0.003227f, -0.001206f, +0.001531f, + -0.003929f, -0.000883f, +0.005112f, +0.000404f, +0.000074f, -0.003360f, -0.002064f, +0.001898f, +0.000231f, +0.000617f, + -0.004006f, -0.001504f, -0.000730f, -0.002657f, +0.000731f, -0.000632f, -0.001011f, -0.000452f, -0.001173f, -0.000157f, + -0.000059f, +0.003021f, +0.001979f, +0.000862f, -0.000112f, +0.001630f, +0.001282f, +0.002333f, +0.000387f, +0.001976f, + +0.002278f, +0.001173f, +0.000616f, +0.001168f, -0.001363f, +0.001181f, +0.000535f, -0.000610f, -0.000258f, -0.000310f, + +0.000249f, -0.000491f, -0.000615f, -0.000010f, +0.000664f, -0.000828f, +0.000614f, -0.000498f, +0.000151f, -0.000407f, + -0.000444f, -0.000045f, -0.000564f, +0.000094f, +0.000241f, -0.000270f + }, + { + +0.050863f, +0.053880f, -0.004017f, +0.079882f, -0.011566f, +0.000546f, +0.001284f, +0.000861f, +0.000614f, +0.004539f, + +0.003658f, -0.006640f, -0.011571f, -0.008662f, -0.003600f, +0.005118f, +0.003465f, -0.001565f, +0.004941f, +0.007099f, + +0.007431f, -0.003746f, -0.005569f, +0.006003f, +0.001959f, -0.006446f, -0.004214f, -0.002426f, -0.003330f, -0.000949f, + -0.004707f, +0.003712f, +0.002200f, -0.001644f, -0.001113f, +0.001105f, -0.002198f, -0.006405f, -0.001694f, +0.004303f, + -0.003125f, -0.002479f, +0.002067f, -0.001108f, -0.003882f, +0.000989f, -0.006817f, -0.002656f, +0.000152f, +0.000278f, + +0.000481f, -0.003950f, -0.001468f, +0.004241f, +0.001934f, +0.001074f, +0.000319f, -0.002250f, +0.000720f, -0.000258f, + +0.001574f, +0.000749f, +0.000561f, +0.000445f, -0.000253f, -0.000261f, +0.001081f, -0.000545f, -0.001205f, -0.000488f, + +0.000061f, +0.002164f, +0.000044f, +0.000417f, +0.002879f, -0.000244f, -0.000595f, -0.000181f, +0.000795f, -0.000192f, + +0.001179f, +0.000815f, -0.000861f, -0.001376f, +0.000290f, -0.000043f, +0.000599f, -0.001126f, -0.000222f, +0.000555f, + +0.000530f, +0.000151f, -0.000245f, -0.000055f, -0.000491f, -0.000591f + }, + { + +0.000268f, -0.001139f, -0.008807f, +0.001949f, +0.000551f, +0.001922f, -0.001153f, -0.000751f, +0.010134f, -0.000755f, + +0.006014f, -0.000890f, +0.004201f, -0.004875f, +0.002548f, +0.016722f, +0.021887f, +0.014833f, +0.008744f, -0.002110f, + +0.003768f, +0.000082f, +0.000033f, -0.012917f, -0.006122f, +0.010367f, -0.006084f, -0.007135f, -0.006629f, +0.016791f, + -0.007791f, +0.003859f, -0.006405f, -0.004825f, -0.002035f, +0.003517f, +0.004640f, +0.005046f, -0.002453f, -0.007044f, + -0.000997f, +0.005480f, +0.005348f, -0.001090f, -0.004567f, -0.003663f, +0.001820f, +0.001510f, +0.002586f, -0.000372f, + +0.004677f, -0.001354f, -0.000635f, -0.000834f, -0.002299f, -0.001127f, -0.000740f, +0.001025f, +0.001546f, +0.001611f, + -0.001067f, -0.002023f, -0.001592f, +0.000489f, +0.002105f, -0.002470f, -0.000268f, -0.001733f, -0.001509f, +0.000379f, + +0.002200f, -0.002325f, -0.001711f, +0.000300f, +0.000045f, +0.000490f, -0.000398f, -0.001924f, -0.000578f, +0.000777f, + +0.000047f, +0.000190f, +0.000724f, +0.000073f, -0.000290f, -0.000294f, -0.000392f, +0.000183f, +0.000037f, -0.000345f, + -0.000434f, -0.000208f, -0.000531f, -0.001072f, +0.000626f, +0.000077f + }, + { + -0.015464f, +0.203524f, +0.003531f, +0.073897f, -0.006766f, -0.001782f, -0.001370f, +0.005427f, +0.003895f, -0.004500f, + -0.010179f, -0.000867f, +0.001613f, -0.001368f, +0.003531f, +0.000115f, -0.007249f, +0.001111f, -0.008862f, +0.006478f, + +0.004928f, -0.000745f, -0.004426f, -0.001010f, -0.002919f, -0.000025f, -0.002292f, -0.000805f, -0.001969f, -0.000910f, + -0.004667f, -0.006449f, -0.002118f, -0.000259f, +0.005009f, +0.002201f, +0.000524f, +0.002353f, -0.004736f, -0.001324f, + -0.000564f, +0.007293f, +0.001930f, -0.000854f, +0.000088f, +0.001081f, -0.001717f, -0.005637f, -0.001801f, -0.005652f, + -0.002509f, -0.001172f, -0.001038f, +0.001220f, -0.000668f, +0.002040f, +0.000416f, +0.002838f, -0.003894f, +0.001353f, + -0.001152f, +0.002115f, -0.002238f, -0.000995f, +0.001182f, -0.001474f, -0.000062f, +0.000272f, -0.000927f, +0.000370f, + -0.000239f, +0.001166f, +0.000579f, +0.000383f, +0.000353f, +0.000938f, +0.001135f, +0.000694f, +0.000381f, +0.000295f, + -0.001111f, +0.000124f, +0.000202f, +0.000357f, -0.000475f, -0.000400f, -0.000705f, +0.000330f, -0.000655f, +0.000263f, + -0.000216f, -0.000223f, +0.000103f, +0.000025f, -0.000518f, -0.000013f + }, + { + -0.003439f, +0.037383f, -0.005242f, -0.007440f, +0.008479f, -0.008895f, +0.004807f, +0.003708f, -0.001211f, -0.007862f, + +0.001105f, +0.004850f, +0.006198f, -0.001164f, +0.002978f, -0.005046f, +0.007773f, -0.004984f, +0.016052f, -0.002240f, + +0.003938f, -0.005606f, -0.004648f, +0.002715f, +0.005753f, -0.004178f, +0.006185f, +0.002983f, -0.003457f, +0.006470f, + +0.006687f, -0.000686f, +0.010187f, -0.005147f, -0.010955f, +0.006653f, -0.002382f, +0.001753f, -0.003506f, -0.000275f, + +0.001755f, -0.003604f, -0.005532f, -0.001103f, -0.004793f, +0.002300f, -0.001266f, -0.001484f, +0.001664f, +0.003923f, + -0.000135f, -0.002364f, -0.000240f, -0.001696f, +0.000540f, +0.001094f, -0.000550f, -0.000744f, +0.000049f, +0.000853f, + +0.002236f, -0.001134f, +0.000982f, +0.001564f, +0.000181f, +0.000554f, -0.001254f, -0.001998f, -0.000321f, -0.000689f, + +0.001106f, +0.000632f, -0.002000f, +0.000734f, -0.000796f, +0.000717f, -0.000755f, +0.000860f, +0.000328f, +0.000768f, + +0.000626f, +0.000190f, -0.000364f, -0.000066f, -0.001158f, +0.000612f, -0.000066f, +0.000021f, -0.000167f, +0.000590f, + -0.000519f, -0.000066f, -0.000936f, -0.000342f, +0.000467f, -0.000019f + }, + { + -0.038838f, -0.055096f, +0.006596f, +0.011652f, +0.004914f, -0.009050f, -0.014620f, +0.000111f, -0.009166f, +0.003861f, + -0.001742f, +0.008958f, -0.005043f, +0.006044f, +0.000207f, -0.004222f, +0.011678f, -0.002254f, -0.005152f, -0.010658f, + -0.008738f, -0.002077f, +0.001362f, +0.006279f, -0.003491f, +0.009276f, +0.006450f, +0.004168f, +0.008676f, -0.000572f, + -0.002246f, +0.004142f, +0.001370f, -0.001777f, +0.008798f, -0.002251f, -0.006094f, +0.005974f, -0.004920f, -0.001989f, + -0.004857f, +0.003619f, +0.005500f, +0.002515f, +0.001551f, -0.003560f, +0.003065f, -0.002226f, +0.000176f, +0.001643f, + -0.001889f, -0.000276f, +0.001629f, -0.001314f, -0.004899f, +0.001829f, +0.000688f, +0.001986f, -0.000971f, -0.003449f, + +0.001028f, +0.001096f, +0.001284f, -0.000371f, -0.000362f, -0.000613f, -0.002448f, +0.000074f, +0.000036f, -0.001034f, + +0.000062f, +0.000278f, -0.000837f, +0.000985f, -0.000545f, -0.001152f, +0.001461f, -0.001670f, +0.000626f, -0.000270f, + -0.000029f, +0.000554f, +0.001086f, -0.000032f, -0.000075f, -0.000645f, +0.000501f, -0.000219f, -0.000488f, -0.000269f, + +0.000552f, -0.000490f, +0.000516f, +0.000474f, -0.000517f, -0.000205f + }, + { + -0.004983f, -0.010087f, +0.013322f, -0.009805f, +0.010125f, +0.000281f, +0.013190f, +0.008713f, +0.000222f, -0.005692f, + +0.002997f, -0.000593f, -0.001148f, -0.022464f, +0.013488f, -0.008194f, -0.000342f, +0.003477f, -0.023843f, +0.012380f, + -0.018720f, -0.005566f, -0.014007f, +0.001484f, +0.003123f, -0.009195f, +0.005449f, +0.018912f, +0.000721f, -0.020655f, + -0.002146f, +0.004094f, -0.000271f, +0.005244f, +0.006390f, -0.000219f, +0.000191f, +0.001274f, -0.005531f, -0.004030f, + +0.005326f, +0.000544f, -0.005315f, -0.004540f, +0.002608f, +0.004333f, -0.000697f, -0.002425f, +0.004621f, +0.000653f, + +0.002010f, +0.002436f, -0.000088f, +0.000895f, -0.002491f, +0.002734f, -0.000171f, +0.000245f, +0.000528f, -0.000872f, + -0.003898f, +0.000995f, -0.000569f, +0.001418f, +0.000403f, -0.002306f, +0.001144f, +0.001612f, +0.000286f, +0.001299f, + -0.002310f, +0.000024f, -0.000766f, -0.000243f, +0.000393f, +0.000136f, -0.000225f, +0.000799f, +0.002321f, +0.000019f, + +0.001171f, +0.000509f, +0.000145f, +0.000001f, -0.000494f, -0.000477f, -0.000955f, -0.000026f, -0.000892f, -0.000649f, + -0.000442f, +0.000044f, +0.000192f, +0.000679f, -0.000856f, +0.000251f + }, + { + -0.094872f, -0.102125f, +0.027667f, +0.008892f, +0.037536f, -0.028966f, -0.013621f, +0.012109f, -0.007038f, -0.006334f, + +0.011811f, +0.012793f, +0.001923f, -0.010703f, +0.000692f, -0.006876f, +0.005572f, +0.004999f, -0.020903f, +0.005267f, + -0.009341f, -0.004317f, +0.002558f, -0.003176f, +0.003485f, -0.015541f, +0.002969f, +0.005911f, +0.004342f, -0.001254f, + -0.000076f, +0.000139f, -0.006427f, -0.003626f, +0.001554f, -0.002911f, -0.003195f, -0.000526f, -0.003123f, +0.002637f, + +0.002452f, +0.002028f, +0.005813f, +0.005269f, +0.004536f, +0.011766f, -0.000887f, -0.002280f, -0.002683f, -0.003393f, + -0.008457f, +0.001623f, +0.000045f, -0.000124f, +0.000602f, -0.002859f, -0.001969f, +0.001311f, +0.000030f, -0.000442f, + -0.003414f, +0.001129f, +0.000029f, +0.000741f, -0.000990f, +0.000222f, -0.000058f, +0.001655f, +0.000659f, +0.001135f, + +0.001717f, +0.000609f, +0.000573f, +0.001017f, -0.001860f, -0.000505f, -0.001249f, +0.000783f, -0.001165f, -0.001008f, + -0.000350f, +0.000593f, -0.000457f, +0.000958f, +0.000711f, +0.000836f, +0.000515f, +0.000824f, -0.000040f, +0.000164f, + +0.000502f, +0.001251f, -0.000267f, -0.000360f, +0.000130f, +0.000214f + }, + { + -0.009373f, -0.022872f, +0.015120f, +0.002026f, -0.002388f, +0.000016f, +0.008719f, +0.001376f, +0.014588f, +0.004022f, + -0.003922f, -0.003030f, -0.002438f, -0.027887f, +0.025116f, +0.010542f, +0.000375f, -0.000060f, +0.007245f, +0.006349f, + -0.004770f, +0.005652f, -0.009854f, -0.010425f, -0.017030f, +0.011107f, -0.015379f, +0.029654f, +0.011056f, +0.010059f, + -0.008877f, -0.011212f, +0.001840f, +0.007306f, -0.001778f, +0.004511f, +0.009315f, +0.004220f, -0.000028f, +0.002288f, + -0.004299f, -0.000963f, -0.001394f, -0.002787f, -0.003699f, +0.002431f, +0.002026f, +0.003360f, -0.000932f, -0.001346f, + +0.002258f, -0.000151f, +0.000153f, -0.000720f, +0.001135f, +0.000705f, -0.001324f, +0.003030f, +0.000173f, +0.002226f, + -0.003061f, -0.000013f, +0.000912f, -0.001422f, -0.000921f, -0.000329f, -0.000776f, -0.000862f, +0.002278f, -0.000876f, + +0.000855f, -0.002203f, +0.000819f, +0.000980f, -0.000457f, +0.000333f, +0.000697f, -0.000271f, -0.000324f, +0.001365f, + -0.000359f, +0.000668f, +0.000399f, +0.001099f, -0.000194f, +0.000556f, +0.000436f, +0.000231f, +0.000970f, +0.000839f, + -0.000116f, +0.000481f, +0.000439f, +0.000540f, +0.000579f, +0.000482f + }, + { + -0.032571f, -0.183388f, +0.006618f, -0.012537f, +0.004010f, -0.003174f, -0.010001f, -0.000081f, -0.011719f, +0.011068f, + +0.008502f, -0.016548f, +0.016818f, -0.011041f, +0.017461f, +0.007429f, -0.007830f, -0.010239f, -0.009330f, -0.010401f, + +0.004506f, +0.002506f, -0.002119f, -0.009051f, +0.005547f, +0.005390f, +0.012584f, -0.003672f, +0.003330f, +0.004138f, + +0.004731f, -0.006157f, +0.004710f, +0.012232f, +0.000039f, +0.000514f, +0.000941f, -0.003748f, -0.000914f, -0.000203f, + -0.010388f, -0.001529f, -0.003040f, -0.004321f, +0.003125f, +0.002489f, +0.002196f, +0.003435f, +0.000197f, +0.003106f, + +0.002238f, +0.004828f, -0.007043f, +0.000683f, -0.002948f, +0.003116f, -0.002452f, +0.000597f, -0.003049f, +0.000448f, + -0.002227f, +0.004130f, -0.001636f, -0.001023f, +0.001380f, +0.000196f, +0.001019f, +0.002196f, -0.000430f, +0.002211f, + -0.000611f, +0.002122f, +0.000065f, -0.000542f, +0.000551f, -0.000121f, -0.000660f, -0.000177f, +0.000372f, -0.000869f, + +0.000397f, -0.000670f, -0.000988f, -0.000223f, -0.000476f, -0.001469f, -0.000353f, -0.000489f, +0.000185f, -0.000283f, + +0.000561f, -0.000338f, -0.000453f, -0.000645f, -0.000672f, -0.000044f + } + }, + { + { + +0.001805f, +0.042635f, -0.001119f, +0.005192f, -0.025707f, -0.001351f, -0.001336f, +0.001892f, +0.000975f, -0.002352f, + -0.012033f, -0.008921f, +0.007856f, +0.000976f, +0.004950f, +0.023437f, -0.000303f, -0.001240f, +0.001744f, -0.008412f, + -0.014013f, +0.002588f, -0.002543f, +0.002029f, -0.002017f, -0.006457f, -0.015315f, -0.001382f, -0.001901f, +0.008389f, + -0.000834f, -0.001154f, +0.003810f, -0.000278f, +0.002878f, -0.002973f, +0.001079f, +0.002781f, -0.002639f, -0.004107f, + +0.004434f, -0.002960f, -0.004268f, +0.004217f, +0.007978f, -0.003115f, -0.001223f, -0.000372f, -0.003951f, -0.000277f, + -0.000084f, -0.001410f, -0.001370f, -0.002662f, -0.000337f, +0.001087f, +0.000903f, +0.001501f, +0.000886f, +0.001815f, + +0.000344f, -0.000080f, +0.000924f, -0.000157f, +0.000562f, +0.000699f, -0.001158f, -0.002213f, -0.001076f, +0.000256f, + +0.001075f, -0.000145f, +0.000082f, +0.000596f, -0.000623f, -0.000021f, +0.000253f, +0.000292f, -0.001415f, -0.000145f, + -0.000909f, +0.000143f, -0.000875f, +0.000779f, +0.000513f, +0.000166f, +0.000070f, +0.000128f, -0.000154f, -0.000827f, + +0.000054f, -0.000216f, -0.000312f, -0.000777f, -0.000126f, -0.000058f + }, + { + -0.003272f, -0.089421f, +0.017246f, -0.030578f, -0.023992f, -0.001372f, -0.000615f, +0.010069f, -0.001269f, +0.004047f, + -0.009558f, +0.003954f, +0.001797f, +0.017229f, +0.007334f, -0.012428f, -0.009351f, -0.002729f, +0.008449f, +0.005182f, + +0.013361f, +0.007985f, -0.002563f, +0.001028f, -0.004729f, +0.006244f, +0.009660f, -0.005528f, -0.008471f, +0.007882f, + -0.003363f, -0.004799f, -0.001872f, +0.001306f, -0.003698f, +0.001256f, -0.000729f, +0.002511f, -0.001452f, -0.000401f, + -0.002594f, -0.002532f, +0.003343f, -0.001109f, -0.000049f, +0.001288f, +0.000791f, +0.000086f, -0.000847f, -0.000241f, + +0.001354f, -0.005583f, +0.000730f, +0.001541f, -0.001827f, -0.000025f, +0.000168f, +0.001721f, +0.000622f, +0.001304f, + -0.000699f, +0.000435f, -0.001855f, -0.001468f, +0.001462f, -0.000352f, +0.001240f, -0.000724f, +0.001990f, +0.000360f, + -0.000240f, -0.001580f, +0.000747f, +0.000019f, +0.001238f, -0.001191f, +0.000515f, -0.001633f, -0.000110f, +0.000195f, + -0.001147f, +0.000417f, -0.000475f, +0.000320f, +0.000422f, +0.000469f, -0.000617f, -0.000651f, -0.000902f, +0.000233f, + -0.000684f, +0.000149f, +0.000057f, -0.000145f, +0.000482f, -0.000310f + }, + { + -0.004898f, -0.011146f, +0.015996f, +0.065092f, -0.023166f, +0.000918f, +0.002808f, +0.003784f, +0.003062f, -0.002773f, + -0.007704f, +0.005111f, +0.002287f, +0.001670f, +0.011191f, -0.012723f, +0.004897f, -0.003557f, +0.001367f, -0.006560f, + -0.005383f, -0.014675f, +0.002020f, -0.005148f, +0.001894f, +0.004065f, +0.009218f, +0.001422f, -0.001099f, +0.000862f, + -0.005653f, -0.005030f, +0.008034f, -0.002713f, -0.002936f, +0.000284f, -0.008036f, +0.004375f, -0.000633f, +0.005307f, + -0.003461f, -0.000295f, +0.000463f, -0.003252f, -0.002342f, +0.001038f, +0.001300f, +0.001773f, +0.000804f, +0.000029f, + +0.002540f, +0.001690f, -0.001351f, -0.001683f, -0.001833f, +0.002194f, +0.001385f, +0.001256f, -0.001945f, +0.001524f, + -0.001134f, +0.000287f, +0.003014f, -0.000452f, +0.001967f, -0.000427f, +0.000394f, -0.000183f, +0.002524f, +0.000232f, + -0.001197f, +0.000543f, -0.000071f, +0.000253f, -0.000340f, -0.000194f, +0.000094f, -0.000378f, -0.000199f, +0.000704f, + +0.000327f, +0.000498f, +0.000038f, -0.001125f, +0.000317f, -0.000702f, +0.000024f, +0.000102f, +0.000176f, +0.000109f, + +0.000919f, -0.000220f, +0.000655f, +0.000202f, -0.000218f, +0.000143f + }, + { + +0.003714f, -0.008028f, -0.015019f, +0.002975f, +0.000735f, -0.001582f, +0.001310f, +0.000307f, +0.003951f, -0.003524f, + +0.000521f, +0.000546f, +0.003133f, +0.012838f, -0.002799f, -0.003065f, +0.028636f, -0.017555f, +0.024934f, +0.000156f, + +0.002230f, +0.002375f, -0.006464f, +0.004758f, -0.007616f, +0.009390f, +0.009014f, -0.000074f, -0.011611f, +0.009579f, + +0.006892f, -0.005807f, +0.000601f, +0.001265f, -0.006418f, -0.003520f, -0.008229f, -0.002147f, -0.005084f, -0.000559f, + +0.000728f, +0.000701f, -0.001137f, +0.006307f, +0.000919f, +0.000712f, -0.002607f, +0.002726f, +0.001132f, +0.001174f, + +0.002939f, +0.000086f, -0.000396f, +0.000599f, -0.001766f, -0.000397f, +0.000845f, +0.001369f, -0.001846f, -0.000700f, + -0.000372f, -0.001804f, +0.000874f, +0.001714f, +0.001670f, -0.001844f, +0.000632f, -0.000280f, -0.001276f, -0.000158f, + +0.001392f, -0.000707f, +0.000932f, -0.000309f, +0.000758f, +0.000488f, -0.000529f, -0.000264f, -0.000429f, -0.000221f, + +0.000352f, -0.000550f, -0.000661f, +0.000288f, -0.001244f, -0.000239f, +0.000616f, +0.001035f, -0.000670f, -0.000073f, + +0.000367f, -0.000381f, -0.000052f, -0.000393f, -0.000225f, +0.000073f + }, + { + -0.029451f, +0.030376f, -0.033023f, +0.045851f, -0.015128f, +0.000031f, +0.000958f, -0.015183f, -0.007552f, -0.014935f, + -0.006389f, -0.014656f, -0.009378f, +0.012501f, -0.014312f, +0.016109f, -0.003501f, -0.006940f, -0.009614f, -0.000365f, + -0.007564f, -0.006319f, +0.005022f, +0.004257f, -0.000701f, -0.006473f, -0.009152f, -0.007585f, +0.000200f, -0.003902f, + +0.002878f, -0.000570f, -0.006948f, +0.002710f, -0.006674f, +0.000101f, +0.008744f, -0.003784f, +0.005425f, -0.002540f, + -0.004553f, -0.006352f, -0.000863f, +0.003893f, +0.001287f, -0.000021f, +0.003222f, +0.000654f, -0.003458f, -0.003083f, + +0.000782f, +0.001553f, -0.001534f, +0.003952f, +0.000825f, -0.000822f, +0.000013f, -0.001237f, +0.001202f, +0.000111f, + +0.001056f, -0.002437f, +0.000608f, +0.000835f, -0.000286f, +0.002408f, +0.001520f, -0.000987f, +0.001901f, -0.000817f, + -0.000112f, -0.000127f, -0.000896f, -0.000012f, -0.000938f, +0.000614f, -0.000665f, -0.000493f, -0.000132f, -0.000233f, + -0.000650f, -0.000359f, +0.000545f, +0.000565f, +0.000232f, +0.000138f, -0.000271f, -0.000085f, -0.000191f, +0.000372f, + -0.000484f, +0.000176f, +0.000230f, +0.000563f, -0.000092f, -0.000123f + }, + { + +0.001031f, +0.004850f, +0.009069f, +0.000063f, -0.003847f, -0.000168f, -0.000351f, -0.000949f, +0.000991f, +0.000900f, + -0.001233f, +0.001527f, -0.001465f, +0.009061f, -0.010346f, -0.002631f, -0.021307f, +0.009143f, +0.004033f, -0.001498f, + +0.004203f, -0.004391f, +0.000854f, -0.000529f, +0.004276f, -0.001172f, -0.017771f, +0.023526f, +0.001552f, -0.016583f, + +0.007436f, -0.009417f, -0.007363f, +0.002349f, -0.001483f, +0.011168f, +0.005119f, +0.004432f, +0.000478f, -0.001155f, + -0.000485f, +0.002063f, +0.004800f, -0.000290f, -0.003192f, -0.002991f, -0.001008f, +0.000511f, -0.003299f, +0.001205f, + +0.000411f, +0.001902f, +0.000584f, -0.001418f, -0.000087f, -0.001383f, -0.001391f, -0.000644f, -0.001409f, +0.000679f, + -0.000045f, +0.003079f, +0.001938f, +0.000670f, -0.000206f, +0.000404f, -0.000223f, +0.001004f, +0.000030f, +0.000630f, + +0.000663f, +0.000484f, -0.000447f, +0.000953f, -0.001748f, +0.000362f, -0.000298f, -0.000888f, -0.000183f, -0.000163f, + +0.001292f, +0.000309f, -0.000568f, -0.000124f, +0.000637f, -0.000850f, +0.000636f, -0.000435f, +0.000123f, -0.000207f, + -0.000797f, +0.000065f, -0.000221f, -0.000112f, +0.000358f, -0.000214f + }, + { + -0.041432f, -0.061753f, +0.007117f, +0.088049f, +0.003788f, +0.001838f, -0.005533f, -0.005091f, +0.000763f, -0.009225f, + -0.001114f, -0.004365f, -0.000030f, +0.001757f, +0.001320f, +0.002832f, +0.000389f, -0.000683f, -0.002866f, -0.001966f, + -0.002146f, -0.001701f, -0.005867f, -0.006030f, -0.010288f, -0.004947f, +0.000294f, -0.006569f, -0.005799f, +0.000948f, + -0.002844f, +0.001704f, +0.002398f, +0.005435f, +0.002259f, +0.003983f, -0.001990f, -0.003386f, -0.003041f, -0.001614f, + -0.000291f, -0.002060f, +0.000469f, +0.004559f, -0.000599f, +0.004925f, -0.000983f, -0.001947f, -0.001679f, -0.001024f, + -0.002042f, -0.005909f, -0.002700f, -0.000175f, -0.000211f, +0.002110f, +0.001671f, -0.002712f, +0.001076f, -0.000798f, + +0.000629f, +0.000584f, -0.000194f, -0.001136f, -0.000080f, +0.000878f, +0.001314f, -0.000474f, -0.000392f, +0.000055f, + -0.000363f, +0.001672f, +0.000098f, -0.000189f, +0.000900f, -0.000893f, -0.000287f, -0.000331f, +0.000432f, -0.000058f, + +0.000547f, +0.000928f, +0.000271f, -0.000079f, +0.001054f, -0.000306f, +0.000556f, +0.000076f, +0.000023f, -0.000026f, + +0.000410f, +0.000277f, +0.000025f, +0.000195f, +0.000511f, +0.000447f + }, + { + +0.001801f, +0.010744f, -0.003272f, -0.003228f, -0.005309f, +0.001250f, -0.002155f, -0.004402f, +0.004761f, -0.003923f, + +0.004953f, +0.000855f, +0.006409f, -0.003902f, -0.000084f, -0.014804f, -0.033313f, -0.001633f, +0.019267f, -0.009830f, + -0.002212f, +0.011201f, +0.000799f, -0.006469f, -0.000542f, -0.005165f, -0.016787f, -0.006649f, +0.003323f, +0.020713f, + -0.010589f, +0.012967f, +0.012152f, +0.006677f, +0.002460f, -0.000239f, +0.003653f, -0.000134f, -0.003630f, -0.000332f, + -0.001597f, +0.001166f, +0.002236f, -0.002823f, -0.003139f, -0.002150f, +0.000408f, -0.000763f, +0.004871f, -0.000963f, + +0.000421f, -0.001830f, +0.000448f, -0.000045f, -0.001053f, -0.000718f, -0.000804f, -0.001577f, +0.000069f, +0.002816f, + +0.001061f, +0.001339f, +0.000088f, +0.000104f, +0.001661f, -0.001557f, +0.000879f, -0.001062f, -0.000729f, -0.000164f, + +0.000638f, -0.001111f, +0.000191f, +0.001154f, -0.000350f, +0.000051f, -0.000413f, -0.001308f, -0.000256f, +0.001807f, + +0.000868f, -0.000023f, +0.000984f, +0.000081f, +0.000097f, +0.000471f, +0.000798f, +0.000816f, +0.000268f, +0.000247f, + -0.000259f, -0.000509f, -0.000189f, -0.001001f, +0.000061f, +0.000054f + }, + { + -0.021436f, +0.166361f, -0.018486f, +0.089721f, +0.008118f, -0.001476f, -0.003425f, -0.004861f, -0.004406f, -0.003565f, + -0.006904f, -0.000855f, -0.003675f, +0.012103f, +0.012541f, +0.008795f, -0.003892f, -0.001073f, -0.009081f, +0.008525f, + +0.007356f, +0.001744f, -0.001138f, +0.004430f, +0.001207f, +0.002589f, +0.001243f, +0.003512f, -0.000961f, -0.004699f, + -0.004316f, -0.004119f, +0.000374f, -0.001578f, +0.002668f, -0.004086f, +0.000846f, +0.005988f, -0.000916f, +0.001892f, + +0.000103f, +0.003034f, +0.001262f, -0.001262f, +0.003753f, +0.003474f, -0.000685f, -0.001421f, +0.005764f, -0.002219f, + -0.001199f, +0.002374f, +0.000472f, +0.000993f, -0.001884f, +0.003627f, -0.000012f, +0.001112f, -0.003478f, +0.004099f, + -0.000760f, +0.000324f, -0.000626f, +0.001443f, +0.000409f, -0.001241f, +0.001013f, +0.001052f, +0.000593f, +0.000972f, + -0.000784f, +0.001269f, +0.000494f, +0.000182f, +0.000321f, +0.000366f, +0.000625f, -0.000050f, +0.000062f, -0.000102f, + -0.001464f, -0.000326f, +0.000177f, +0.000164f, -0.000879f, +0.000806f, -0.000274f, -0.000402f, -0.000808f, +0.000862f, + +0.000207f, -0.000513f, -0.000557f, -0.000176f, -0.000213f, +0.000541f + }, + { + +0.003328f, +0.041050f, -0.000193f, -0.009342f, -0.004043f, +0.003039f, +0.015491f, +0.003849f, +0.007752f, -0.004402f, + -0.004038f, -0.005975f, +0.001774f, -0.003464f, -0.001193f, +0.000492f, -0.001150f, -0.002857f, +0.015578f, -0.011819f, + -0.006444f, -0.021944f, -0.012739f, +0.002661f, +0.000056f, -0.012240f, +0.007194f, -0.000218f, -0.010664f, +0.005359f, + +0.007296f, -0.001157f, +0.005613f, -0.007929f, -0.004277f, +0.004784f, -0.001468f, +0.004334f, -0.000187f, -0.000796f, + +0.004918f, +0.004230f, +0.002219f, +0.000956f, -0.005163f, +0.001512f, -0.000258f, -0.001684f, -0.000934f, +0.002642f, + -0.000537f, -0.002593f, +0.000176f, -0.000842f, +0.000407f, +0.000825f, -0.001238f, +0.001898f, +0.000483f, -0.001270f, + -0.000136f, -0.001067f, -0.000649f, +0.001034f, -0.000586f, +0.000567f, -0.000223f, -0.001149f, +0.000452f, -0.000176f, + +0.001294f, +0.001310f, -0.001413f, +0.001847f, +0.000216f, +0.001529f, +0.000146f, +0.000571f, +0.000066f, +0.000202f, + -0.000604f, +0.000647f, +0.000535f, +0.000137f, -0.000455f, +0.001030f, -0.000283f, -0.000265f, -0.000501f, +0.000597f, + -0.000463f, +0.000049f, -0.000648f, -0.000351f, +0.000482f, -0.000317f + }, + { + +0.038261f, -0.019065f, -0.054666f, -0.009493f, -0.006351f, +0.002729f, -0.011647f, -0.007171f, -0.009219f, -0.002448f, + -0.007609f, +0.003481f, -0.006518f, +0.004376f, +0.004128f, -0.008831f, -0.003363f, -0.002962f, +0.009067f, +0.001884f, + +0.007364f, +0.005172f, -0.008157f, -0.002599f, -0.005910f, +0.005305f, +0.001403f, -0.009239f, -0.001151f, -0.005157f, + -0.004071f, +0.002561f, -0.002480f, -0.005137f, +0.011223f, +0.000930f, -0.006303f, +0.004263f, +0.000039f, +0.001749f, + -0.004704f, +0.002528f, +0.001961f, -0.000455f, +0.002560f, -0.000930f, +0.005144f, -0.002348f, -0.000097f, +0.003323f, + -0.002858f, -0.002759f, +0.000295f, -0.001976f, -0.004318f, +0.001716f, -0.002560f, -0.000435f, -0.001094f, -0.000933f, + +0.002438f, -0.001071f, -0.000316f, -0.001693f, +0.000881f, -0.000237f, -0.000847f, +0.000810f, +0.000932f, -0.000418f, + -0.000226f, +0.000671f, -0.001123f, +0.000716f, -0.000025f, -0.001388f, +0.000597f, -0.002031f, +0.001218f, +0.000473f, + +0.000404f, +0.000370f, +0.000687f, -0.000071f, -0.000432f, -0.000887f, +0.000209f, +0.000268f, -0.000476f, -0.000337f, + +0.000383f, -0.000324f, +0.000450f, +0.000646f, +0.000152f, -0.000251f + }, + { + +0.003288f, -0.033894f, -0.005127f, -0.007287f, -0.001034f, -0.004800f, +0.009079f, -0.001951f, -0.001657f, +0.002532f, + +0.000280f, -0.005431f, +0.002114f, -0.008937f, +0.011142f, -0.004538f, +0.004152f, +0.010089f, -0.008325f, +0.017153f, + -0.010063f, +0.012487f, -0.010662f, +0.009435f, +0.002369f, -0.004946f, -0.000041f, +0.004355f, -0.003900f, -0.009401f, + -0.001352f, -0.000290f, -0.003982f, +0.002773f, +0.004410f, -0.001230f, +0.002184f, -0.000199f, -0.003999f, -0.003166f, + +0.003207f, +0.001808f, -0.004493f, -0.004535f, +0.001075f, -0.003597f, -0.005746f, -0.006150f, +0.002110f, -0.001131f, + +0.001198f, +0.000592f, +0.001667f, +0.003558f, -0.004195f, -0.000387f, -0.001388f, +0.002413f, +0.001981f, +0.001070f, + -0.001998f, +0.002615f, -0.001763f, -0.001772f, -0.000176f, -0.000817f, -0.000424f, +0.000986f, -0.001188f, -0.000117f, + -0.002090f, +0.000463f, -0.001607f, -0.001084f, +0.001129f, +0.001286f, -0.000064f, +0.000052f, +0.000377f, -0.001505f, + +0.001088f, -0.000065f, -0.000371f, +0.000153f, -0.000525f, +0.000342f, -0.000819f, +0.000251f, -0.000027f, -0.000604f, + -0.000711f, +0.000256f, -0.000095f, +0.000438f, -0.000625f, +0.000419f + }, + { + +0.084728f, +0.114795f, +0.001662f, -0.009273f, +0.030420f, -0.027579f, -0.001441f, +0.015230f, -0.013602f, -0.016945f, + -0.002799f, +0.013203f, +0.007929f, -0.007964f, +0.003152f, -0.004160f, +0.007534f, +0.005445f, -0.021365f, -0.000691f, + -0.012708f, +0.001476f, +0.010709f, -0.000172f, +0.007926f, -0.003178f, +0.008702f, +0.004243f, +0.002249f, -0.001610f, + +0.002960f, +0.001563f, -0.002002f, -0.001802f, +0.002618f, -0.001509f, -0.001860f, +0.005569f, -0.001493f, -0.004967f, + +0.001086f, +0.001021f, -0.000135f, +0.003719f, -0.002755f, +0.003093f, -0.001612f, -0.001095f, +0.000378f, +0.002143f, + -0.004410f, +0.003271f, +0.001911f, +0.000573f, -0.001341f, -0.001484f, +0.000258f, +0.001620f, -0.000128f, +0.000868f, + -0.001970f, +0.000769f, +0.000474f, +0.002169f, -0.000860f, +0.000033f, -0.000346f, +0.001411f, -0.000864f, -0.001479f, + +0.000247f, -0.000612f, -0.001073f, +0.000159f, -0.001490f, +0.000807f, +0.000637f, +0.001258f, -0.001756f, -0.001352f, + -0.001680f, +0.000558f, -0.000940f, +0.000168f, -0.000071f, -0.000274f, -0.000342f, +0.000516f, -0.000316f, -0.000028f, + +0.000187f, +0.001304f, +0.000189f, -0.000319f, +0.000180f, -0.000032f + }, + { + +0.007641f, -0.030510f, -0.007763f, +0.004503f, +0.000415f, +0.004717f, +0.012042f, -0.001602f, +0.014403f, -0.003536f, + -0.006960f, -0.002463f, +0.001389f, -0.004342f, +0.054301f, +0.015928f, -0.004292f, -0.014246f, -0.003481f, +0.006239f, + +0.002153f, +0.009399f, +0.002873f, +0.004959f, -0.015585f, +0.011882f, -0.017062f, +0.013473f, -0.003074f, +0.006746f, + +0.001730f, -0.001029f, +0.003841f, +0.007265f, -0.005640f, -0.002693f, +0.005929f, +0.004477f, +0.004446f, +0.003531f, + -0.004848f, +0.000485f, +0.000675f, -0.001097f, +0.001003f, +0.004181f, -0.003930f, +0.000179f, +0.000401f, -0.001076f, + +0.001505f, -0.000539f, -0.000370f, -0.004325f, -0.001691f, -0.000272f, -0.002585f, +0.001697f, -0.001592f, +0.000657f, + -0.002009f, +0.000294f, -0.001632f, -0.001578f, +0.001329f, +0.000632f, +0.000779f, -0.000184f, +0.000570f, -0.000869f, + +0.001195f, -0.001920f, +0.000055f, +0.000644f, +0.000530f, +0.001162f, +0.000790f, -0.000092f, -0.000545f, +0.000875f, + -0.000199f, +0.000814f, -0.000531f, +0.000873f, +0.000100f, +0.001007f, +0.000263f, +0.000087f, +0.000132f, -0.000003f, + -0.000546f, +0.000190f, -0.000176f, +0.000028f, +0.000465f, +0.000182f + }, + { + +0.053987f, -0.071861f, +0.004445f, -0.026576f, +0.002720f, +0.011205f, +0.000420f, +0.011827f, -0.009927f, +0.003920f, + +0.003631f, -0.000649f, +0.012268f, -0.016909f, +0.023223f, +0.005933f, -0.014198f, +0.000382f, +0.003903f, -0.000623f, + -0.001170f, -0.003712f, +0.003550f, -0.003186f, +0.005219f, -0.005144f, +0.008437f, -0.006391f, +0.004680f, +0.007175f, + +0.001528f, +0.000200f, +0.009008f, +0.007831f, -0.004255f, -0.002861f, -0.000210f, -0.003430f, -0.001117f, +0.006518f, + -0.000988f, -0.000676f, -0.000631f, -0.002933f, -0.001225f, -0.002048f, +0.000108f, +0.000483f, -0.004427f, -0.001006f, + -0.000719f, +0.004617f, -0.006761f, +0.000630f, -0.005391f, +0.001286f, -0.003990f, +0.001089f, -0.002642f, -0.000713f, + -0.002827f, +0.002454f, -0.000342f, +0.000337f, +0.001773f, -0.000738f, -0.000317f, +0.000837f, -0.002901f, +0.001221f, + -0.000480f, +0.001631f, +0.000401f, -0.000268f, +0.000717f, +0.000409f, -0.000189f, +0.000083f, +0.001060f, -0.000417f, + +0.001096f, +0.001585f, -0.000066f, -0.000010f, +0.001005f, -0.000543f, +0.000089f, -0.000318f, -0.000342f, -0.000030f, + +0.000254f, -0.000610f, -0.000099f, -0.000242f, -0.000302f, -0.000021f + } + }, + { + { + -0.003085f, +0.043678f, +0.003338f, -0.026308f, -0.002989f, +0.003512f, +0.000910f, -0.004501f, +0.009742f, -0.008791f, + -0.009630f, -0.006089f, +0.005982f, +0.001082f, +0.007008f, +0.009468f, -0.015567f, +0.013821f, -0.004895f, -0.009283f, + -0.012595f, -0.002837f, +0.000821f, -0.005085f, +0.003182f, -0.008895f, -0.002612f, -0.004014f, +0.000396f, +0.002689f, + +0.006882f, -0.007312f, +0.005599f, -0.000583f, -0.003368f, +0.005783f, -0.004445f, +0.005650f, +0.001310f, -0.005394f, + +0.005144f, -0.000207f, -0.009685f, +0.006931f, +0.008020f, -0.001597f, -0.003447f, -0.001682f, -0.001988f, -0.000156f, + -0.003604f, +0.000993f, +0.000338f, -0.001688f, +0.001616f, -0.000088f, -0.000023f, +0.001363f, +0.000742f, -0.000199f, + +0.001483f, -0.000450f, +0.001463f, -0.001412f, +0.001338f, +0.000851f, -0.001239f, -0.001775f, -0.000733f, +0.000636f, + -0.000622f, -0.000074f, +0.000889f, -0.000034f, +0.000210f, -0.000711f, +0.000199f, +0.000618f, -0.000283f, -0.001064f, + -0.000467f, -0.000312f, +0.000601f, +0.000196f, +0.000221f, +0.000270f, +0.000390f, +0.000036f, -0.000392f, -0.000546f, + -0.000415f, -0.000320f, -0.000348f, -0.000150f, -0.000264f, -0.000122f + }, + { + +0.002359f, -0.073614f, -0.010625f, -0.050859f, -0.007075f, -0.005544f, +0.005845f, +0.004909f, -0.004862f, +0.006824f, + +0.008934f, -0.018832f, +0.013717f, +0.007975f, +0.010730f, -0.019576f, -0.004221f, +0.000859f, -0.004357f, +0.005403f, + +0.006177f, +0.017562f, -0.001004f, -0.005129f, +0.003332f, +0.001555f, +0.004503f, +0.002825f, -0.005692f, -0.001835f, + -0.005797f, +0.007772f, -0.001374f, -0.001824f, -0.006962f, +0.002893f, -0.004787f, +0.003371f, -0.003697f, +0.000967f, + -0.002219f, -0.002009f, +0.002999f, -0.001837f, -0.000131f, +0.003042f, -0.001532f, -0.000693f, -0.002282f, +0.001966f, + -0.001426f, -0.002709f, -0.001193f, +0.001130f, +0.002645f, -0.001748f, +0.000206f, +0.003330f, +0.001333f, +0.000082f, + +0.000947f, -0.000250f, -0.000577f, -0.001123f, +0.001062f, -0.000087f, -0.000292f, +0.000649f, +0.002031f, +0.000910f, + -0.000917f, -0.001040f, -0.000224f, +0.000998f, +0.000294f, -0.000194f, -0.001305f, -0.000470f, -0.000151f, +0.000105f, + -0.000476f, -0.000225f, -0.000243f, +0.000149f, +0.000689f, -0.000062f, -0.000758f, -0.000262f, -0.000854f, -0.000243f, + -0.000189f, +0.000146f, +0.000002f, -0.000240f, +0.000316f, -0.000008f + }, + { + +0.003233f, +0.025116f, -0.039619f, -0.014594f, +0.051811f, -0.000547f, +0.006405f, +0.003049f, +0.002083f, -0.001110f, + -0.010559f, +0.004977f, -0.001783f, -0.004902f, +0.000335f, +0.001063f, -0.004751f, -0.000125f, +0.003345f, -0.009526f, + -0.006838f, -0.017473f, -0.001656f, -0.000643f, -0.002026f, +0.011395f, +0.006799f, +0.006796f, -0.006521f, +0.001515f, + -0.004131f, +0.004295f, -0.007354f, +0.006085f, -0.003516f, -0.001096f, -0.006292f, +0.004356f, -0.003551f, +0.005090f, + +0.000439f, -0.000018f, -0.000371f, -0.000707f, -0.003349f, +0.000997f, +0.001843f, +0.000238f, +0.001303f, +0.004049f, + +0.000384f, -0.000491f, -0.003811f, +0.002399f, -0.000223f, +0.002120f, +0.000099f, +0.002251f, -0.003234f, -0.000369f, + +0.000158f, +0.001167f, +0.002680f, +0.000223f, +0.000229f, +0.001267f, -0.000438f, +0.000897f, +0.000191f, +0.001662f, + -0.000223f, -0.000037f, +0.000692f, +0.000268f, +0.000974f, -0.000780f, -0.000049f, -0.000922f, +0.000496f, -0.000173f, + +0.000692f, +0.000038f, +0.000622f, -0.000603f, -0.000555f, +0.000111f, -0.000205f, -0.000150f, +0.000289f, +0.000008f, + +0.000566f, +0.000415f, +0.000686f, +0.000040f, -0.000390f, +0.000036f + }, + { + -0.003106f, -0.040377f, +0.010819f, +0.006376f, +0.000803f, +0.000516f, -0.000063f, -0.000160f, +0.006088f, -0.001518f, + -0.003984f, +0.002756f, -0.002749f, +0.012902f, -0.011587f, +0.012546f, -0.008650f, -0.001329f, +0.023905f, +0.001668f, + +0.006064f, -0.002747f, -0.002550f, +0.004816f, -0.006773f, +0.006814f, +0.005720f, -0.000476f, -0.006664f, +0.009275f, + +0.003401f, -0.012082f, +0.001823f, +0.002780f, -0.004109f, -0.005241f, -0.004878f, -0.005899f, -0.002325f, +0.002060f, + +0.001227f, -0.001166f, -0.001499f, +0.007012f, -0.000401f, +0.000263f, -0.001547f, +0.002594f, +0.002949f, +0.004235f, + -0.000087f, +0.001474f, -0.000377f, -0.000516f, -0.001570f, +0.001846f, -0.000328f, +0.000270f, -0.001253f, -0.001356f, + -0.000945f, -0.000717f, +0.000882f, +0.001709f, +0.001239f, -0.001618f, +0.000538f, +0.000146f, -0.001036f, +0.000808f, + -0.000729f, -0.000220f, +0.000137f, +0.000310f, +0.000553f, +0.000008f, +0.000449f, -0.000517f, -0.000712f, +0.000122f, + +0.000025f, +0.000076f, -0.000641f, -0.000082f, -0.000565f, -0.000275f, +0.000580f, +0.000550f, +0.000037f, +0.000034f, + +0.000233f, -0.000480f, -0.000027f, -0.000123f, -0.000118f, +0.000004f + }, + { + +0.022231f, -0.105416f, +0.003345f, +0.026902f, +0.010924f, +0.002199f, -0.004808f, -0.007860f, -0.010844f, -0.006224f, + -0.012878f, -0.021509f, +0.003372f, +0.010186f, -0.011566f, -0.008337f, +0.011263f, -0.010616f, +0.000040f, +0.002920f, + -0.014143f, -0.007052f, +0.009200f, -0.005893f, -0.004435f, -0.000265f, -0.003611f, -0.008026f, +0.001580f, -0.007302f, + +0.001935f, +0.001347f, -0.008650f, +0.002207f, -0.000406f, -0.002975f, +0.005951f, -0.006410f, +0.001565f, -0.001682f, + -0.003674f, -0.002943f, +0.000905f, +0.003913f, +0.001326f, -0.000477f, +0.001575f, -0.000926f, +0.000684f, -0.001930f, + -0.001831f, +0.000137f, +0.000229f, +0.001920f, +0.001706f, -0.000334f, -0.002693f, -0.000564f, +0.000063f, +0.002344f, + -0.001752f, -0.001947f, +0.001171f, +0.001458f, +0.000284f, +0.001414f, +0.000291f, +0.000422f, -0.001197f, +0.000261f, + +0.000876f, +0.000024f, -0.003078f, +0.000595f, -0.001164f, +0.001146f, -0.000694f, -0.000015f, +0.000301f, -0.000204f, + -0.000656f, -0.000278f, -0.000237f, +0.000968f, -0.000142f, +0.000197f, -0.000399f, +0.000351f, +0.000248f, -0.000612f, + -0.000445f, +0.000481f, -0.000019f, -0.000114f, -0.000101f, +0.000371f + }, + { + -0.000474f, +0.032693f, -0.005795f, -0.002778f, -0.003260f, -0.000359f, +0.000039f, -0.001548f, +0.002393f, -0.003925f, + +0.010735f, -0.005119f, -0.005091f, +0.008111f, -0.004025f, -0.019393f, -0.019628f, +0.007567f, +0.013989f, -0.023644f, + +0.021035f, +0.001361f, +0.000221f, -0.000698f, -0.006968f, +0.004032f, +0.003986f, +0.002257f, -0.000265f, -0.006584f, + -0.002982f, -0.009898f, -0.002442f, -0.007061f, +0.004945f, +0.013292f, +0.007821f, +0.002682f, +0.000228f, +0.000619f, + +0.001373f, +0.003608f, +0.002317f, -0.001759f, -0.001386f, -0.003395f, -0.001243f, -0.000302f, -0.001246f, -0.001816f, + +0.001532f, +0.003891f, -0.000665f, -0.000223f, +0.000481f, -0.001935f, -0.001431f, -0.001592f, -0.001236f, -0.000045f, + +0.000096f, +0.002724f, +0.001163f, +0.000808f, -0.000472f, +0.000290f, +0.000356f, -0.000281f, +0.001715f, -0.001315f, + -0.000241f, +0.001375f, -0.000632f, -0.000099f, -0.000261f, -0.000557f, -0.000939f, +0.000171f, -0.000165f, +0.000490f, + +0.000195f, +0.000254f, -0.000402f, -0.000239f, +0.000234f, -0.000655f, +0.000422f, +0.000090f, -0.000476f, -0.000233f, + -0.000317f, -0.000174f, -0.000371f, -0.000150f, +0.000362f, +0.000466f + }, + { + +0.005541f, -0.136758f, +0.018517f, +0.086926f, +0.000659f, +0.000813f, +0.002654f, -0.011591f, +0.003606f, -0.005348f, + -0.001954f, -0.003270f, +0.004774f, +0.002372f, +0.000543f, +0.002132f, -0.002579f, +0.005425f, -0.004717f, -0.000818f, + -0.013693f, -0.000496f, -0.000472f, -0.003385f, -0.017636f, -0.002392f, +0.000234f, -0.004664f, +0.000212f, -0.006092f, + +0.002052f, +0.002592f, -0.002622f, +0.006177f, +0.001115f, +0.005877f, -0.005213f, +0.005190f, -0.002503f, -0.006435f, + +0.003961f, -0.003562f, -0.003969f, +0.004856f, +0.000731f, +0.004479f, +0.000315f, -0.003746f, -0.000739f, +0.001173f, + -0.003675f, -0.004205f, -0.002111f, -0.000781f, -0.001019f, +0.001956f, +0.003271f, -0.002624f, -0.000156f, -0.000387f, + +0.000849f, +0.001334f, -0.001783f, -0.001144f, -0.000498f, +0.002029f, +0.000749f, +0.000177f, -0.000816f, -0.000003f, + -0.000119f, -0.000368f, +0.000902f, +0.000880f, -0.001013f, +0.000457f, -0.000798f, +0.000797f, -0.000718f, +0.000607f, + +0.000397f, +0.000517f, +0.000327f, +0.000637f, -0.000131f, +0.000278f, +0.000091f, +0.000528f, +0.000089f, -0.000166f, + +0.000438f, +0.000146f, -0.000003f, +0.000556f, +0.000382f, +0.000654f + }, + { + -0.000018f, +0.014448f, +0.005792f, -0.008155f, -0.004824f, +0.000361f, -0.001330f, +0.000646f, -0.003725f, +0.000867f, + -0.003596f, +0.008073f, +0.006279f, +0.005413f, -0.012645f, -0.020642f, -0.037835f, -0.004893f, +0.019789f, -0.004092f, + +0.000832f, +0.005823f, -0.002209f, +0.001977f, -0.008154f, -0.004607f, -0.005053f, -0.016281f, +0.014726f, -0.001173f, + +0.001923f, +0.004537f, +0.013617f, +0.007289f, +0.005984f, -0.008709f, +0.002064f, +0.000402f, -0.001118f, +0.005003f, + -0.007113f, -0.000736f, +0.003750f, -0.003668f, -0.003792f, +0.001033f, +0.002130f, +0.000697f, +0.000431f, -0.002562f, + +0.001911f, +0.000556f, -0.001303f, +0.001009f, +0.001807f, -0.002418f, +0.001254f, -0.002795f, -0.000661f, +0.003042f, + +0.000476f, +0.001135f, +0.002121f, +0.000044f, +0.000971f, -0.002056f, +0.000351f, -0.000346f, +0.000836f, -0.001216f, + +0.000272f, +0.000243f, +0.000230f, +0.000507f, +0.000695f, -0.001100f, -0.000706f, -0.000005f, -0.000033f, +0.000932f, + +0.001196f, -0.000195f, +0.000369f, -0.000001f, +0.000476f, +0.000025f, +0.001191f, +0.000669f, -0.000205f, +0.000294f, + +0.000135f, -0.000165f, -0.000066f, -0.000569f, -0.000709f, +0.000288f + }, + { + +0.043627f, +0.013154f, +0.026845f, +0.091444f, +0.002098f, +0.001538f, +0.001504f, -0.010203f, -0.011165f, +0.007886f, + -0.011498f, +0.005117f, -0.008116f, +0.000723f, +0.007932f, +0.014828f, -0.002800f, +0.000596f, -0.002249f, +0.004810f, + +0.004814f, -0.003464f, +0.004897f, +0.002603f, +0.005076f, -0.001622f, +0.006001f, +0.001190f, -0.000729f, -0.007211f, + -0.003163f, -0.002256f, +0.001837f, +0.000216f, -0.001385f, -0.004555f, +0.005521f, +0.001086f, -0.000720f, +0.003659f, + +0.002049f, +0.001998f, +0.000497f, -0.000713f, +0.002991f, +0.003082f, -0.000738f, +0.003859f, +0.005094f, -0.005281f, + +0.001371f, +0.000884f, -0.000297f, +0.001699f, -0.000495f, +0.002891f, -0.000721f, +0.000108f, -0.000160f, +0.001434f, + +0.001385f, -0.001607f, +0.001653f, +0.001120f, -0.001534f, -0.000125f, +0.000326f, +0.001941f, +0.000891f, +0.000733f, + -0.000232f, +0.000377f, +0.000510f, +0.000325f, +0.001196f, +0.000073f, -0.000304f, -0.000075f, +0.000450f, -0.000407f, + -0.000979f, -0.000405f, -0.000549f, +0.000065f, -0.000758f, +0.000757f, -0.000165f, -0.000608f, -0.000056f, +0.000451f, + +0.000175f, -0.000439f, -0.000224f, -0.000424f, +0.000088f, +0.000908f + }, + { + -0.002886f, +0.016150f, +0.010790f, +0.013732f, -0.005807f, -0.008916f, +0.022058f, +0.001337f, +0.006674f, -0.000270f, + -0.004373f, +0.003766f, -0.011894f, +0.008333f, -0.020078f, +0.009910f, -0.003469f, +0.001859f, -0.009503f, +0.007571f, + -0.003088f, -0.020121f, -0.010451f, +0.006307f, -0.003004f, -0.012987f, +0.001353f, +0.004565f, -0.004435f, -0.003418f, + +0.008362f, -0.002062f, +0.004484f, -0.000166f, +0.002444f, -0.004173f, +0.003071f, +0.000031f, +0.002337f, -0.003370f, + +0.004550f, +0.004068f, +0.002635f, -0.001173f, +0.000054f, -0.000170f, +0.000748f, +0.000256f, -0.003369f, +0.002279f, + +0.002102f, -0.000369f, -0.001505f, -0.002244f, +0.000941f, -0.001261f, +0.000889f, +0.000949f, -0.000072f, -0.000206f, + -0.001574f, +0.000574f, -0.000276f, +0.000152f, -0.000652f, +0.000301f, +0.000504f, -0.001308f, -0.000092f, +0.001332f, + +0.000227f, +0.000167f, +0.000035f, +0.000644f, +0.001168f, +0.000802f, +0.000123f, +0.000784f, +0.000550f, -0.000474f, + -0.000630f, -0.000051f, +0.000870f, +0.000076f, +0.000488f, +0.000276f, +0.000303f, -0.000310f, -0.000368f, -0.000104f, + +0.000174f, -0.000033f, -0.000622f, -0.000098f, +0.000367f, -0.000248f + }, + { + -0.036233f, -0.008770f, +0.005670f, -0.014071f, -0.002509f, +0.013512f, -0.003215f, -0.016284f, -0.001271f, -0.011122f, + +0.006900f, -0.013883f, +0.006459f, -0.001020f, +0.006953f, -0.008933f, +0.002914f, -0.009537f, +0.010869f, +0.012053f, + +0.009141f, -0.003514f, -0.003659f, -0.006390f, -0.000132f, +0.002542f, +0.000323f, -0.003701f, -0.004523f, -0.004224f, + -0.000890f, +0.000876f, -0.006827f, -0.001390f, +0.007160f, -0.001953f, -0.003012f, +0.004310f, +0.000334f, +0.002706f, + -0.000688f, -0.002698f, +0.001721f, -0.000761f, +0.002668f, +0.000178f, +0.002219f, -0.001026f, +0.001971f, -0.000301f, + +0.001630f, -0.003966f, -0.002767f, -0.000794f, -0.001829f, +0.001189f, -0.003702f, -0.001470f, -0.000552f, +0.000615f, + +0.001513f, -0.001059f, -0.000383f, -0.001243f, -0.000887f, +0.000100f, -0.000186f, +0.000603f, +0.001513f, -0.000413f, + -0.000363f, -0.000043f, +0.000523f, +0.000012f, +0.000246f, -0.000910f, +0.000348f, -0.000690f, +0.000815f, +0.000466f, + +0.000581f, +0.000163f, +0.000046f, -0.000038f, -0.000379f, -0.000395f, +0.000408f, +0.000893f, -0.000804f, +0.000356f, + -0.000383f, -0.000057f, +0.000287f, +0.000444f, +0.000242f, +0.000048f + }, + { + -0.002003f, -0.052888f, +0.006047f, +0.006992f, -0.013722f, +0.008575f, -0.005832f, +0.000937f, -0.000165f, +0.004933f, + -0.003331f, -0.000505f, -0.008378f, +0.015733f, -0.009229f, +0.005344f, -0.001692f, +0.008956f, +0.010833f, -0.004218f, + +0.004294f, -0.002997f, +0.007223f, +0.001644f, +0.001383f, +0.003118f, -0.015135f, +0.007010f, -0.004676f, -0.007191f, + -0.002692f, -0.002569f, -0.003617f, +0.004216f, +0.005349f, -0.005091f, +0.013271f, -0.006825f, -0.001873f, -0.000246f, + +0.004539f, -0.003628f, -0.004566f, -0.001653f, -0.001635f, -0.005913f, -0.005700f, -0.001868f, +0.002571f, -0.001868f, + +0.003110f, -0.001581f, +0.001202f, +0.000098f, -0.001980f, -0.002614f, +0.000972f, +0.001612f, +0.000180f, +0.001899f, + -0.000687f, +0.000533f, -0.001096f, -0.001912f, -0.000806f, +0.000570f, -0.000733f, -0.000515f, -0.000573f, -0.000599f, + -0.000802f, -0.000353f, -0.000897f, -0.000379f, +0.000541f, +0.002079f, +0.000061f, -0.000253f, -0.000407f, -0.001311f, + +0.000785f, -0.000485f, +0.000007f, -0.000092f, -0.000532f, +0.000384f, -0.000463f, +0.000064f, -0.000275f, +0.000003f, + -0.000341f, +0.000089f, -0.000072f, +0.000539f, -0.000436f, +0.000241f + }, + { + -0.043072f, +0.285754f, -0.034020f, +0.012638f, +0.026989f, -0.026095f, +0.011750f, +0.002201f, -0.022357f, -0.013515f, + -0.005992f, +0.016211f, +0.005209f, -0.008062f, -0.005970f, +0.008289f, -0.000752f, +0.006536f, -0.015888f, -0.003926f, + -0.004669f, +0.003538f, +0.004732f, +0.001200f, +0.000251f, +0.009210f, +0.006876f, -0.001621f, +0.007897f, +0.000849f, + -0.000615f, +0.002289f, +0.003343f, -0.002053f, -0.000889f, -0.002755f, -0.001129f, +0.007245f, -0.003510f, +0.000379f, + -0.000654f, +0.001081f, +0.000219f, +0.002392f, -0.009625f, +0.000045f, +0.002135f, +0.000850f, +0.000480f, -0.000643f, + -0.000179f, +0.000796f, +0.001427f, +0.001391f, -0.003320f, +0.002390f, +0.000087f, +0.001581f, +0.000065f, +0.000803f, + -0.000678f, -0.001038f, +0.000663f, +0.000940f, +0.000162f, -0.000205f, +0.000374f, +0.001535f, -0.001196f, -0.000683f, + -0.000533f, -0.001251f, +0.000356f, -0.001221f, +0.000685f, -0.000701f, +0.001699f, -0.000468f, -0.000092f, -0.001523f, + -0.001595f, +0.000470f, -0.000009f, -0.000906f, +0.000274f, -0.000343f, -0.000385f, -0.000253f, +0.000036f, -0.000964f, + +0.000635f, +0.000754f, +0.000264f, +0.000238f, +0.000632f, +0.000103f + }, + { + -0.006619f, -0.047632f, +0.015573f, +0.014140f, +0.001067f, -0.002408f, +0.007136f, +0.003314f, +0.008244f, -0.011320f, + -0.003483f, +0.000559f, -0.002292f, +0.027076f, +0.025126f, -0.000874f, +0.005022f, -0.008847f, -0.001034f, -0.005787f, + +0.011387f, +0.014079f, +0.005789f, +0.006143f, -0.006242f, -0.000380f, +0.006559f, -0.015194f, +0.001178f, +0.005547f, + +0.000320f, +0.006279f, -0.001254f, +0.005156f, -0.005354f, -0.004141f, +0.006143f, +0.000147f, +0.005852f, -0.000088f, + +0.004905f, -0.003858f, +0.001687f, -0.001827f, +0.003355f, +0.004988f, -0.004773f, -0.002411f, +0.002097f, +0.000244f, + -0.002678f, +0.001683f, -0.000042f, -0.005074f, -0.000315f, -0.000134f, -0.000439f, +0.000363f, -0.002120f, -0.000782f, + +0.000100f, +0.000150f, -0.002054f, -0.001573f, +0.002657f, +0.001218f, -0.000370f, +0.000368f, -0.000970f, -0.000248f, + +0.000769f, +0.000956f, -0.001765f, +0.000125f, +0.001438f, +0.001406f, +0.000240f, -0.000471f, -0.000771f, +0.001211f, + -0.000006f, +0.000177f, -0.000120f, +0.000207f, -0.000027f, +0.000835f, -0.000001f, +0.000604f, -0.000234f, -0.000519f, + +0.000102f, +0.000100f, -0.000170f, +0.000032f, +0.000312f, -0.000019f + }, + { + -0.050960f, +0.053373f, +0.002221f, -0.020122f, +0.010460f, +0.012975f, +0.008723f, +0.010649f, -0.007611f, +0.000672f, + -0.002929f, +0.011925f, -0.005459f, -0.001319f, -0.001617f, +0.009269f, -0.009797f, +0.008201f, -0.007674f, +0.006929f, + -0.003206f, -0.012958f, +0.001664f, +0.011680f, -0.007878f, -0.004139f, +0.006188f, +0.006125f, -0.004007f, +0.009403f, + -0.007290f, +0.005415f, +0.009918f, -0.002042f, -0.003656f, -0.003018f, +0.004125f, -0.004767f, +0.000888f, +0.005303f, + +0.003114f, +0.001539f, -0.002905f, -0.002495f, -0.004133f, -0.001351f, -0.004258f, +0.000177f, -0.003227f, -0.000479f, + -0.000141f, -0.000815f, -0.001054f, -0.002814f, -0.003841f, +0.000625f, -0.001971f, -0.001286f, -0.000906f, +0.000070f, + +0.000362f, -0.002270f, +0.000956f, -0.000106f, +0.000774f, -0.000239f, -0.000543f, -0.000224f, -0.001813f, -0.000397f, + +0.001871f, -0.000190f, -0.000222f, +0.000641f, +0.001290f, +0.000293f, -0.000503f, +0.000005f, +0.000874f, -0.000414f, + +0.001120f, +0.001194f, +0.000059f, -0.000073f, +0.001444f, -0.000380f, -0.000214f, -0.000196f, +0.000123f, -0.000021f, + -0.000475f, -0.000078f, -0.000520f, -0.000177f, +0.000192f, -0.000021f + } + }, + { + { + +0.002088f, +0.016141f, -0.021465f, -0.016655f, +0.009822f, +0.005217f, +0.005004f, +0.003027f, +0.011269f, -0.004761f, + +0.006186f, -0.008175f, -0.014317f, -0.014245f, -0.008484f, -0.012108f, -0.026699f, +0.001800f, -0.013229f, -0.003793f, + -0.001696f, +0.001331f, +0.012931f, +0.001158f, -0.003026f, -0.005117f, +0.001600f, -0.004023f, +0.005913f, +0.007297f, + -0.003026f, -0.016307f, +0.000933f, -0.007574f, -0.005327f, +0.011572f, +0.006346f, +0.015725f, +0.005145f, -0.004190f, + +0.001395f, +0.001785f, -0.005439f, +0.001290f, +0.005313f, +0.001472f, -0.004588f, -0.001597f, -0.001222f, -0.000234f, + +0.001444f, +0.004974f, +0.001720f, +0.000864f, +0.001482f, +0.000576f, +0.000001f, +0.003198f, +0.002163f, -0.002331f, + +0.000154f, -0.001694f, +0.000350f, -0.001365f, +0.001211f, +0.001997f, +0.000731f, -0.000354f, -0.001454f, -0.000226f, + +0.000768f, +0.000203f, +0.000457f, +0.000494f, +0.000223f, -0.001542f, -0.000604f, -0.000026f, -0.000211f, -0.000266f, + +0.000039f, -0.000102f, +0.000400f, -0.000062f, +0.000281f, -0.000068f, -0.000194f, -0.000399f, -0.000197f, -0.000560f, + -0.000734f, -0.000049f, +0.000403f, +0.000767f, +0.000025f, +0.000030f + }, + { + -0.006631f, -0.080735f, -0.017363f, -0.033208f, +0.013517f, +0.000252f, +0.002588f, -0.000584f, -0.002552f, +0.008271f, + +0.007434f, -0.026133f, +0.004826f, -0.002330f, +0.010014f, -0.012975f, -0.001491f, -0.008195f, -0.016515f, -0.001730f, + -0.004000f, +0.003395f, -0.004169f, -0.003844f, -0.002292f, -0.003318f, +0.002164f, +0.004943f, +0.000124f, -0.001892f, + +0.001108f, +0.016848f, +0.002612f, -0.004635f, -0.006399f, +0.009246f, +0.000121f, +0.003250f, -0.000371f, +0.003218f, + -0.002674f, -0.008271f, -0.001214f, -0.001697f, -0.001900f, +0.002193f, -0.001306f, +0.002734f, -0.000524f, +0.003324f, + +0.000893f, -0.000047f, -0.001503f, -0.001565f, +0.004015f, -0.000868f, +0.001191f, +0.005316f, +0.002909f, +0.000007f, + -0.000225f, -0.000168f, +0.000492f, -0.000390f, -0.000128f, +0.000269f, -0.000440f, -0.000806f, +0.000997f, +0.000264f, + -0.001300f, -0.000243f, -0.000471f, -0.000021f, +0.000209f, +0.000089f, -0.001242f, +0.001080f, +0.000779f, +0.000180f, + -0.000225f, -0.000422f, -0.000061f, -0.000345f, +0.000201f, +0.000232f, -0.000660f, +0.000625f, -0.000437f, -0.000609f, + -0.000164f, +0.000189f, +0.000016f, -0.000056f, +0.000147f, -0.000018f + }, + { + -0.000252f, +0.099883f, +0.013170f, -0.090856f, -0.001292f, -0.003333f, +0.000118f, +0.001141f, +0.003430f, +0.005308f, + -0.009990f, -0.005321f, -0.009679f, -0.001265f, +0.011152f, +0.011262f, +0.004744f, -0.000202f, +0.001317f, -0.005679f, + +0.000769f, -0.023603f, -0.013460f, +0.002010f, +0.002893f, +0.008563f, -0.002900f, +0.005135f, -0.005126f, +0.000794f, + +0.000721f, +0.005478f, -0.009792f, +0.007232f, -0.002660f, -0.000187f, -0.000289f, +0.001473f, -0.008400f, +0.001247f, + +0.000011f, -0.000055f, +0.000088f, +0.001055f, -0.003115f, +0.001178f, -0.000845f, -0.002543f, +0.001289f, +0.004828f, + -0.000769f, +0.001756f, -0.000662f, +0.003716f, -0.001453f, -0.001038f, -0.001279f, +0.000955f, -0.004080f, +0.000094f, + +0.000267f, -0.001039f, +0.000620f, -0.002272f, -0.002983f, +0.000940f, -0.000026f, +0.000554f, -0.000702f, +0.001383f, + -0.000081f, -0.000425f, +0.001153f, +0.001474f, +0.001069f, -0.001119f, +0.000051f, -0.000908f, +0.000289f, -0.000691f, + +0.000344f, +0.000144f, +0.001120f, +0.000177f, -0.000161f, +0.000980f, +0.000337f, -0.000212f, +0.000397f, +0.000011f, + +0.000471f, -0.000095f, -0.000039f, +0.000101f, -0.000280f, -0.000104f + }, + { + +0.002559f, -0.061697f, -0.011795f, +0.000628f, +0.000548f, +0.001453f, -0.001605f, -0.001287f, +0.004993f, -0.005111f, + -0.003865f, +0.006916f, -0.011633f, -0.002285f, -0.027138f, -0.009209f, -0.014329f, +0.008454f, +0.013338f, +0.006569f, + +0.008667f, -0.006598f, +0.002485f, +0.012754f, -0.001614f, +0.002470f, +0.002652f, +0.001950f, +0.000837f, -0.000511f, + -0.011219f, -0.009597f, +0.009320f, +0.006274f, -0.000897f, -0.000947f, +0.006744f, -0.002117f, +0.001133f, +0.002781f, + -0.000634f, -0.002744f, -0.006185f, +0.002916f, +0.000761f, +0.002692f, -0.000096f, +0.001650f, +0.003846f, +0.003593f, + -0.000561f, +0.003362f, -0.000230f, -0.001233f, -0.001409f, +0.002676f, +0.000041f, +0.000066f, +0.000083f, -0.000314f, + -0.000058f, +0.000052f, -0.000282f, +0.000917f, +0.001329f, +0.000684f, +0.001014f, +0.000598f, +0.000994f, +0.001106f, + -0.001078f, +0.000295f, +0.000238f, +0.000095f, +0.000187f, +0.000013f, +0.001007f, -0.000002f, +0.000442f, +0.001148f, + +0.000526f, +0.000560f, +0.000034f, +0.000771f, +0.000268f, -0.000361f, -0.000100f, +0.000185f, +0.000181f, +0.000409f, + +0.000252f, -0.000461f, +0.000161f, +0.000285f, +0.000068f, -0.000204f + }, + { + -0.000818f, -0.211527f, -0.033873f, +0.014620f, -0.009119f, -0.000419f, -0.003018f, +0.002885f, -0.002733f, +0.007685f, + -0.002171f, -0.009093f, +0.006622f, -0.006666f, -0.023830f, -0.014796f, +0.006194f, -0.013021f, +0.015585f, +0.021928f, + -0.009824f, -0.002978f, +0.003331f, -0.015250f, -0.006475f, +0.002362f, +0.008468f, -0.001408f, +0.005714f, -0.007072f, + -0.004758f, -0.002626f, -0.002060f, +0.005751f, +0.000142f, -0.000277f, +0.009704f, -0.007717f, -0.000120f, +0.002266f, + +0.000998f, -0.000757f, +0.000797f, +0.006098f, +0.000372f, -0.004626f, -0.001469f, +0.000008f, +0.000026f, +0.000289f, + -0.003780f, -0.003511f, -0.000430f, -0.001619f, +0.000342f, -0.000731f, -0.000901f, +0.000491f, -0.001538f, +0.001019f, + -0.001087f, -0.001938f, +0.001510f, +0.002511f, +0.000787f, +0.000673f, +0.000300f, +0.000051f, -0.003106f, -0.001863f, + +0.000598f, +0.000555f, -0.001676f, +0.000940f, -0.001812f, +0.001057f, -0.001018f, -0.000565f, -0.000070f, +0.000218f, + -0.001016f, -0.001542f, -0.001032f, +0.000610f, -0.000287f, +0.000110f, -0.001078f, +0.000204f, +0.000163f, -0.000500f, + +0.000370f, +0.000256f, -0.000843f, -0.000632f, -0.000003f, +0.000380f + }, + { + -0.001149f, +0.031610f, -0.002743f, -0.002069f, -0.001253f, +0.000282f, +0.000546f, -0.000485f, +0.002499f, -0.004741f, + +0.011445f, -0.003860f, -0.001314f, +0.018659f, +0.007570f, -0.005261f, -0.009302f, -0.002410f, +0.006887f, -0.034148f, + +0.019242f, +0.013083f, -0.000959f, -0.012350f, -0.004172f, +0.005790f, -0.002428f, -0.004930f, +0.000497f, +0.002015f, + -0.001940f, -0.004716f, +0.005146f, +0.002796f, +0.010311f, +0.010955f, +0.005446f, -0.000211f, +0.002458f, +0.004948f, + +0.002461f, -0.001020f, -0.001481f, -0.001132f, +0.000513f, -0.002160f, -0.000436f, +0.000666f, +0.001747f, -0.000790f, + -0.000002f, +0.000709f, -0.001255f, +0.000799f, +0.000972f, -0.000780f, +0.000215f, -0.002656f, -0.001391f, +0.000007f, + -0.000388f, +0.001069f, -0.001473f, +0.000218f, -0.000020f, +0.000832f, +0.001112f, -0.000305f, +0.001695f, -0.002097f, + -0.001681f, +0.000709f, +0.000039f, -0.000659f, -0.001587f, -0.001264f, -0.000382f, -0.000062f, -0.000646f, +0.000065f, + -0.000722f, +0.000051f, +0.000032f, -0.000513f, -0.000119f, -0.000349f, +0.000755f, +0.000372f, -0.000616f, -0.000408f, + -0.000001f, -0.000164f, -0.000982f, -0.000117f, +0.000632f, +0.001003f + }, + { + +0.038924f, -0.129758f, -0.020809f, +0.076340f, -0.003360f, +0.001790f, +0.005116f, -0.010396f, +0.005815f, +0.008702f, + +0.012408f, +0.011438f, +0.008289f, -0.000296f, -0.002390f, +0.004162f, -0.002107f, +0.002051f, -0.003576f, -0.001465f, + -0.010929f, +0.003948f, +0.004338f, +0.004028f, -0.004178f, +0.004141f, +0.001396f, +0.003915f, +0.006521f, -0.005871f, + +0.000548f, +0.000622f, -0.007794f, +0.002299f, -0.000180f, +0.003236f, -0.000897f, +0.007265f, -0.003024f, -0.002215f, + +0.008456f, -0.003033f, -0.006228f, +0.001256f, -0.000278f, +0.002105f, +0.002397f, -0.000698f, +0.001657f, +0.001122f, + -0.004225f, +0.000986f, +0.000585f, +0.002191f, +0.000349f, +0.000829f, +0.001663f, -0.002666f, -0.000015f, -0.000001f, + +0.001186f, +0.000719f, -0.002547f, -0.001619f, -0.001797f, +0.000532f, -0.000563f, +0.000064f, -0.001388f, -0.000467f, + -0.000268f, -0.001075f, +0.000130f, +0.000201f, -0.000306f, +0.001036f, -0.001323f, +0.000390f, -0.000387f, +0.001281f, + +0.000424f, -0.000583f, -0.000069f, +0.000430f, -0.001015f, -0.000124f, -0.000108f, +0.000259f, +0.000497f, +0.000251f, + +0.000156f, -0.000351f, -0.000216f, +0.000212f, -0.000424f, -0.000079f + }, + { + -0.002130f, -0.009173f, -0.000178f, -0.000290f, -0.001481f, +0.000697f, +0.000318f, +0.003014f, -0.004006f, +0.002373f, + +0.001068f, +0.011945f, +0.005414f, +0.005730f, -0.011462f, -0.003286f, -0.010166f, +0.011371f, +0.006617f, +0.005337f, + +0.021547f, +0.000305f, -0.008017f, +0.009125f, -0.004646f, +0.002386f, +0.006234f, -0.000287f, +0.016204f, -0.014943f, + -0.002992f, -0.008008f, +0.003539f, -0.001227f, -0.000577f, -0.007356f, -0.002745f, -0.002995f, +0.002043f, +0.006632f, + -0.005865f, +0.000823f, +0.006417f, -0.002887f, -0.002131f, +0.006002f, +0.004789f, +0.002442f, +0.003916f, -0.000493f, + +0.000245f, -0.000748f, +0.000603f, +0.004468f, +0.003763f, -0.000818f, +0.002766f, -0.002917f, -0.002671f, -0.000751f, + -0.001964f, +0.000707f, +0.001209f, -0.001126f, +0.001084f, -0.002092f, +0.000390f, +0.000634f, +0.000425f, -0.001035f, + +0.001680f, +0.000874f, +0.000136f, -0.000359f, +0.000606f, -0.001421f, -0.000619f, +0.000796f, +0.000731f, -0.000394f, + +0.000357f, -0.000346f, +0.000087f, +0.000307f, -0.000060f, -0.000486f, -0.000360f, -0.000395f, -0.000325f, -0.000007f, + +0.000118f, -0.000065f, -0.000262f, -0.000282f, -0.000599f, -0.000222f + }, + { + -0.045131f, -0.205233f, -0.044040f, +0.074656f, -0.007631f, -0.002266f, -0.003104f, -0.008603f, -0.013618f, +0.001450f, + -0.020315f, +0.010136f, +0.006133f, -0.008980f, -0.018364f, +0.001206f, +0.004827f, +0.006665f, +0.004754f, +0.000974f, + -0.004455f, -0.006731f, +0.004988f, +0.001545f, +0.001830f, -0.004852f, +0.004976f, -0.000192f, +0.000445f, -0.002721f, + +0.001783f, -0.002260f, -0.005179f, +0.000436f, -0.000283f, -0.001990f, +0.010112f, -0.001669f, -0.005816f, +0.004847f, + +0.004221f, +0.002799f, -0.002564f, -0.000193f, +0.000256f, -0.002933f, -0.000856f, +0.006585f, +0.005224f, -0.004943f, + -0.001779f, -0.003145f, -0.001811f, +0.001370f, -0.001254f, -0.000522f, -0.000383f, +0.001526f, +0.001497f, +0.001752f, + +0.002055f, +0.000428f, +0.001531f, -0.000539f, -0.001972f, -0.000414f, -0.000124f, +0.001589f, -0.000256f, +0.000170f, + +0.000740f, -0.000422f, -0.000160f, +0.000606f, -0.000201f, -0.000995f, +0.000001f, +0.000275f, +0.000054f, +0.000242f, + +0.000014f, -0.000158f, -0.000637f, +0.000478f, +0.000015f, +0.000547f, -0.000329f, -0.000629f, +0.000489f, +0.000389f, + +0.000050f, +0.000156f, +0.000431f, +0.000022f, +0.000232f, +0.000789f + }, + { + +0.002452f, -0.023818f, -0.041085f, +0.004186f, +0.008350f, -0.012088f, +0.014354f, +0.004883f, +0.006586f, +0.003274f, + +0.004398f, +0.014398f, -0.003325f, +0.015500f, -0.023644f, +0.012382f, +0.011078f, -0.010076f, -0.033237f, +0.007274f, + +0.014505f, +0.010532f, +0.000267f, +0.002564f, -0.006959f, -0.008708f, -0.008774f, -0.005003f, +0.001463f, +0.005958f, + +0.015871f, -0.002881f, +0.005027f, +0.004853f, -0.000402f, -0.010589f, -0.000787f, -0.005464f, -0.000125f, -0.003185f, + +0.001690f, -0.002463f, +0.002557f, +0.005223f, +0.001245f, -0.000050f, +0.000747f, +0.000103f, -0.001207f, +0.005586f, + +0.002916f, +0.002036f, -0.000888f, -0.004326f, +0.000240f, -0.001107f, +0.002560f, +0.001748f, +0.001660f, +0.001559f, + -0.000479f, +0.000920f, +0.000053f, +0.000249f, -0.000674f, -0.000327f, -0.000070f, -0.002660f, -0.000642f, +0.001155f, + -0.000563f, -0.000384f, -0.000336f, -0.001248f, -0.000544f, -0.000525f, -0.000553f, +0.000746f, -0.000118f, +0.000293f, + +0.000595f, -0.000636f, -0.000063f, -0.000527f, +0.000355f, -0.000631f, +0.000106f, +0.000024f, -0.000012f, -0.000324f, + +0.000284f, +0.000377f, -0.000290f, +0.000142f, +0.000319f, -0.000255f + }, + { + +0.034652f, -0.039730f, -0.087321f, +0.003609f, +0.000333f, +0.006375f, +0.021981f, +0.000823f, +0.010092f, -0.001518f, + +0.013363f, -0.014002f, +0.001427f, +0.005135f, +0.020329f, -0.001296f, +0.009080f, -0.010278f, +0.006753f, -0.000675f, + +0.001840f, -0.002905f, +0.000433f, +0.001122f, +0.002825f, +0.000108f, +0.002531f, +0.006071f, +0.004821f, +0.001529f, + +0.000798f, -0.000595f, -0.006473f, +0.000776f, +0.001629f, -0.003649f, +0.000079f, +0.002683f, -0.002846f, -0.002191f, + -0.004402f, -0.001885f, +0.003461f, +0.002126f, +0.003309f, -0.001534f, -0.000402f, -0.001898f, +0.002063f, -0.004060f, + +0.001279f, -0.000178f, -0.002361f, +0.001304f, +0.001720f, +0.001931f, -0.001597f, -0.000925f, +0.001395f, +0.000932f, + +0.000200f, -0.000768f, +0.000437f, +0.000545f, -0.002347f, -0.000392f, -0.000853f, -0.000568f, +0.001310f, +0.000592f, + +0.000824f, +0.000353f, +0.000572f, +0.000097f, +0.000953f, -0.000386f, +0.000641f, +0.000302f, +0.001247f, +0.000518f, + +0.000266f, -0.000444f, -0.000377f, +0.000005f, +0.000459f, +0.000269f, +0.000650f, +0.000812f, -0.000464f, +0.000627f, + -0.000490f, -0.000211f, +0.000044f, -0.000099f, -0.000115f, +0.000007f + }, + { + +0.001242f, -0.073885f, -0.017140f, +0.026647f, +0.006105f, +0.012930f, -0.008471f, -0.002436f, -0.003080f, +0.005287f, + +0.001644f, +0.006958f, -0.004940f, +0.010964f, -0.011151f, +0.017414f, +0.000877f, +0.006994f, +0.007765f, -0.007575f, + +0.012431f, -0.013803f, +0.007339f, -0.002356f, +0.004125f, +0.005397f, -0.012161f, +0.001440f, -0.008413f, -0.007609f, + -0.003380f, +0.001939f, -0.001630f, +0.000791f, -0.001947f, -0.011200f, +0.009483f, -0.004980f, +0.006649f, -0.001293f, + -0.002389f, -0.004743f, -0.000358f, +0.000384f, -0.000253f, -0.000388f, -0.001576f, +0.000284f, +0.002941f, -0.003392f, + +0.002196f, -0.002945f, -0.001189f, -0.000858f, -0.000540f, -0.002857f, -0.000856f, +0.000820f, +0.001225f, +0.002079f, + -0.000671f, +0.000378f, -0.000482f, -0.000936f, -0.000150f, +0.001057f, -0.000278f, -0.001003f, +0.000191f, -0.001290f, + +0.000918f, +0.002601f, +0.000284f, +0.000542f, +0.000262f, +0.001325f, +0.000052f, -0.000528f, +0.000067f, -0.000400f, + +0.000084f, -0.000570f, +0.000471f, -0.000309f, -0.000228f, +0.000514f, -0.000402f, -0.000239f, -0.000578f, +0.000104f, + +0.000134f, +0.000820f, +0.000172f, +0.000245f, -0.000563f, +0.000217f + }, + { + -0.009161f, +0.313805f, -0.074347f, -0.000754f, +0.021987f, -0.023267f, +0.001278f, -0.012058f, -0.016823f, -0.004945f, + -0.013326f, +0.002886f, -0.001853f, -0.007806f, -0.006743f, +0.014090f, -0.005126f, -0.000206f, -0.011456f, -0.003296f, + +0.004232f, +0.009959f, +0.001768f, -0.004393f, -0.009278f, +0.003086f, -0.003487f, -0.000639f, +0.012255f, +0.000313f, + -0.000547f, +0.004891f, +0.008558f, -0.000634f, -0.007863f, -0.000883f, +0.004131f, +0.004625f, +0.001034f, +0.003892f, + -0.001737f, +0.002049f, +0.000144f, +0.002566f, -0.005336f, +0.001014f, +0.001755f, +0.001530f, +0.001032f, +0.000355f, + -0.000885f, -0.003687f, -0.002484f, -0.003532f, -0.004618f, +0.003631f, +0.000065f, +0.002166f, -0.000753f, -0.000034f, + -0.001098f, -0.002303f, -0.001151f, -0.000972f, +0.000228f, +0.001790f, +0.001161f, +0.000509f, -0.000514f, +0.001636f, + +0.001206f, -0.000300f, +0.001464f, -0.001556f, +0.001057f, -0.000637f, +0.001010f, -0.001128f, +0.000841f, -0.000737f, + -0.000232f, +0.000647f, +0.000221f, -0.000812f, -0.000175f, +0.000429f, +0.000861f, -0.000330f, +0.000290f, -0.001006f, + +0.000248f, +0.000056f, -0.000307f, +0.000378f, +0.000679f, +0.000225f + }, + { + +0.005797f, -0.049927f, +0.001320f, +0.008205f, -0.006485f, -0.007638f, +0.002387f, -0.002746f, -0.001402f, -0.007082f, + +0.003339f, +0.005643f, -0.004119f, -0.030499f, -0.031142f, +0.005767f, +0.009933f, +0.005482f, +0.015854f, +0.001441f, + +0.011141f, +0.002692f, -0.008105f, +0.004810f, -0.008345f, -0.011837f, +0.002082f, -0.021394f, -0.000307f, -0.000908f, + +0.001276f, +0.001644f, -0.008402f, +0.005669f, -0.003071f, -0.002909f, +0.002440f, -0.005008f, +0.003744f, -0.000230f, + +0.009714f, +0.000183f, +0.003502f, +0.001554f, +0.004146f, +0.002724f, -0.002893f, -0.000300f, +0.001528f, -0.000060f, + -0.002730f, +0.001947f, +0.000148f, -0.001661f, +0.002298f, +0.001412f, -0.000418f, -0.000212f, -0.000045f, +0.001667f, + +0.001702f, +0.000024f, -0.000948f, -0.000698f, +0.000791f, +0.001337f, -0.000839f, -0.000942f, -0.000371f, -0.000106f, + +0.000542f, +0.001448f, -0.001067f, +0.001162f, +0.001566f, +0.000192f, -0.000998f, -0.001820f, -0.001379f, +0.000658f, + -0.000771f, -0.000067f, +0.000469f, -0.000251f, -0.000613f, +0.000381f, -0.000495f, +0.000122f, +0.000108f, -0.000519f, + +0.000006f, +0.000002f, -0.000262f, +0.000045f, +0.000249f, -0.000146f + }, + { + +0.027346f, +0.143837f, -0.013432f, -0.018301f, +0.009739f, +0.007620f, -0.001909f, +0.002767f, -0.006109f, -0.002438f, + -0.006482f, +0.011541f, -0.001218f, -0.019077f, -0.042834f, +0.005840f, +0.006772f, +0.004298f, -0.019767f, -0.004864f, + -0.008856f, -0.009482f, -0.002782f, +0.002479f, -0.006197f, +0.008014f, +0.003636f, -0.003268f, -0.014020f, +0.007309f, + -0.008377f, -0.005162f, +0.000758f, -0.001939f, -0.004091f, -0.004740f, +0.005416f, -0.006203f, +0.001080f, +0.004585f, + -0.000147f, +0.002298f, -0.002107f, -0.002284f, -0.005707f, -0.004047f, -0.006416f, +0.001342f, -0.002049f, +0.002004f, + +0.003325f, -0.001279f, -0.001664f, -0.002947f, -0.001460f, +0.002446f, +0.001053f, -0.000192f, -0.000536f, +0.001008f, + +0.001616f, -0.001544f, +0.001350f, -0.001268f, -0.001354f, +0.000581f, +0.000750f, +0.000281f, -0.000253f, -0.000779f, + +0.001202f, -0.001090f, -0.001950f, -0.000189f, +0.000959f, +0.000016f, -0.000566f, -0.000252f, +0.001271f, -0.000312f, + -0.000600f, -0.000742f, -0.000186f, -0.000500f, +0.000633f, -0.000934f, -0.001175f, -0.000797f, +0.000285f, +0.000419f, + -0.000011f, +0.000237f, -0.000059f, -0.000019f, +0.000070f, +0.000016f + } + }, + { + { + +0.000978f, -0.048415f, +0.028247f, -0.000343f, +0.000751f, +0.000927f, +0.008283f, +0.004883f, +0.008728f, -0.000732f, + +0.005341f, -0.014582f, -0.014706f, -0.004007f, -0.010938f, -0.014343f, -0.016371f, -0.014181f, -0.003525f, -0.005346f, + +0.012722f, -0.001389f, +0.007933f, +0.004734f, -0.019811f, +0.005210f, -0.003300f, -0.005961f, +0.004169f, +0.009087f, + -0.008513f, -0.008033f, -0.001972f, -0.010849f, +0.002627f, +0.009781f, +0.003549f, +0.016291f, +0.004923f, +0.000891f, + +0.002134f, -0.001374f, +0.000747f, -0.002321f, +0.001742f, +0.001795f, -0.003933f, -0.004639f, +0.001973f, +0.002614f, + +0.002917f, +0.001784f, +0.000946f, +0.002357f, -0.000899f, +0.002344f, +0.000418f, +0.001110f, +0.002581f, -0.000366f, + -0.000904f, -0.002883f, -0.000293f, +0.001480f, +0.000264f, +0.000930f, +0.000111f, +0.000306f, -0.000860f, -0.000483f, + +0.000872f, +0.000407f, +0.000585f, +0.001028f, -0.001547f, -0.000718f, -0.000991f, +0.000505f, -0.000575f, -0.000304f, + -0.000280f, +0.000631f, -0.000345f, +0.000058f, -0.000585f, +0.000087f, -0.000118f, -0.000706f, +0.000459f, -0.000250f, + -0.000737f, -0.000237f, +0.000409f, +0.000886f, +0.000355f, +0.000227f + }, + { + +0.017685f, -0.192625f, +0.050759f, -0.003206f, -0.006708f, +0.003541f, -0.002565f, -0.000181f, +0.001363f, +0.006549f, + -0.004083f, -0.006818f, -0.004413f, +0.001108f, -0.004958f, -0.008532f, -0.002673f, -0.006743f, -0.010323f, -0.010023f, + +0.002375f, -0.006989f, +0.004105f, -0.001076f, -0.005543f, -0.001882f, -0.001623f, +0.011203f, -0.001373f, -0.003215f, + +0.002816f, +0.013008f, +0.008561f, -0.011691f, +0.004412f, +0.001136f, +0.004055f, +0.000827f, +0.001995f, +0.004755f, + +0.000022f, -0.011713f, -0.003468f, +0.000911f, -0.000542f, -0.001101f, +0.003096f, +0.002829f, -0.000019f, -0.000022f, + +0.003690f, +0.000612f, -0.002301f, -0.002736f, +0.003070f, -0.000485f, +0.003358f, +0.001136f, +0.002657f, +0.001270f, + -0.001990f, +0.001267f, +0.000537f, -0.000982f, +0.000517f, -0.000355f, +0.000137f, -0.001109f, -0.000667f, -0.000057f, + -0.000194f, +0.000669f, -0.000473f, -0.001750f, +0.000844f, +0.000662f, -0.001188f, +0.001170f, +0.000073f, +0.000798f, + +0.000051f, -0.000696f, -0.000218f, -0.000126f, -0.000074f, +0.000022f, +0.000123f, +0.000447f, -0.000307f, -0.000588f, + -0.000271f, +0.000242f, -0.000011f, +0.000037f, +0.000224f, -0.000089f + }, + { + -0.004254f, +0.166517f, -0.013816f, -0.057324f, -0.035364f, -0.002266f, +0.001750f, -0.001630f, +0.003183f, -0.004440f, + +0.005352f, -0.013149f, +0.000903f, +0.004839f, -0.001364f, +0.008436f, +0.007669f, +0.005733f, +0.002163f, -0.002053f, + +0.002755f, -0.013502f, -0.014005f, +0.006122f, +0.002478f, -0.003204f, -0.002279f, +0.000964f, +0.000883f, -0.002881f, + +0.007040f, -0.003355f, -0.002338f, -0.003555f, +0.002408f, -0.005377f, +0.007605f, -0.002483f, -0.005210f, -0.003180f, + -0.001439f, +0.001905f, +0.000598f, +0.000088f, -0.003898f, +0.002900f, -0.001600f, +0.000045f, +0.001612f, +0.001707f, + -0.001044f, +0.000927f, +0.002510f, +0.002156f, -0.000596f, -0.002239f, -0.000283f, -0.001676f, -0.001387f, +0.000844f, + -0.000954f, -0.000261f, -0.001415f, -0.001920f, -0.002724f, +0.000206f, -0.000374f, -0.000274f, +0.000187f, +0.000516f, + +0.000305f, -0.000044f, +0.000968f, +0.001572f, -0.000327f, -0.000196f, -0.000330f, -0.000941f, -0.000214f, +0.000404f, + -0.000166f, +0.000341f, +0.000975f, +0.000510f, +0.000210f, +0.000514f, +0.000417f, +0.000082f, +0.000260f, -0.000257f, + +0.000450f, -0.000260f, -0.000128f, -0.000076f, +0.000523f, -0.000240f + }, + { + -0.000967f, -0.074287f, +0.005813f, -0.005162f, +0.002367f, +0.000655f, -0.001482f, +0.000019f, +0.002030f, -0.002059f, + -0.003830f, +0.010164f, -0.008762f, -0.017624f, -0.026209f, -0.008390f, -0.002971f, +0.011557f, +0.004430f, +0.011423f, + +0.000693f, -0.005954f, +0.015384f, +0.001483f, +0.003504f, -0.004106f, +0.008166f, +0.000794f, +0.004030f, -0.005998f, + -0.010381f, -0.001041f, +0.002804f, +0.005543f, +0.001196f, -0.007239f, +0.011671f, -0.003056f, +0.005758f, -0.001507f, + +0.001433f, -0.002990f, -0.002943f, -0.000398f, +0.001755f, +0.001298f, +0.004127f, -0.002794f, +0.004896f, +0.000878f, + -0.000201f, +0.002632f, +0.001626f, -0.002070f, -0.000560f, +0.002931f, -0.000218f, +0.000331f, -0.001019f, -0.000397f, + +0.000346f, +0.001512f, -0.001744f, +0.001210f, +0.001041f, +0.001074f, +0.000231f, +0.000264f, +0.001805f, +0.000027f, + -0.000145f, +0.000531f, +0.000109f, +0.000646f, +0.000035f, +0.000710f, +0.000160f, +0.000568f, +0.000860f, +0.000650f, + +0.000748f, +0.000396f, -0.000286f, +0.001086f, +0.000287f, -0.000283f, -0.000256f, +0.000081f, +0.000011f, +0.000396f, + +0.000126f, -0.000118f, -0.000054f, +0.000111f, -0.000049f, -0.000245f + }, + { + -0.028403f, -0.278906f, +0.036879f, +0.003455f, +0.006995f, -0.005373f, -0.000066f, +0.005058f, -0.000409f, +0.012163f, + -0.003176f, -0.003327f, +0.000799f, +0.002373f, -0.033572f, -0.005775f, -0.007915f, -0.004754f, +0.017993f, +0.014210f, + -0.000921f, -0.006248f, +0.006923f, -0.015582f, -0.009237f, -0.003298f, +0.013335f, -0.006235f, +0.010487f, -0.007196f, + -0.005689f, -0.003393f, +0.006843f, +0.002791f, -0.003373f, +0.001589f, -0.002738f, +0.006189f, +0.000792f, -0.001677f, + +0.001600f, +0.002204f, +0.000389f, +0.003164f, +0.001334f, -0.001201f, -0.003882f, +0.002359f, -0.002187f, +0.003591f, + -0.003896f, -0.005080f, -0.001702f, -0.002752f, +0.001957f, +0.000965f, -0.000428f, +0.000677f, -0.000767f, -0.001057f, + +0.000467f, -0.001435f, +0.001945f, +0.001888f, +0.000095f, +0.000269f, +0.001012f, +0.000766f, -0.002736f, -0.002099f, + +0.001117f, -0.001113f, +0.001165f, -0.000061f, -0.001066f, -0.000728f, -0.000371f, -0.000502f, -0.000851f, +0.000632f, + -0.000950f, -0.001932f, -0.000912f, +0.000091f, +0.000235f, -0.000257f, -0.000754f, +0.000288f, -0.000300f, +0.000019f, + +0.001005f, -0.000369f, -0.000685f, -0.000501f, +0.000152f, +0.000060f + }, + { + +0.000589f, +0.005732f, +0.013720f, -0.004890f, +0.001184f, +0.001068f, -0.000119f, +0.000664f, +0.002221f, -0.000288f, + +0.005346f, -0.004301f, -0.005283f, +0.014231f, +0.012271f, +0.004502f, +0.000262f, -0.006245f, +0.003046f, -0.022163f, + +0.008263f, +0.009880f, +0.004765f, -0.025659f, -0.007253f, +0.021664f, -0.006024f, -0.003725f, +0.003976f, -0.001477f, + -0.008457f, +0.007140f, +0.002569f, +0.005704f, +0.010083f, +0.006357f, +0.002532f, -0.005209f, +0.005177f, +0.008352f, + -0.001313f, -0.001969f, -0.000163f, -0.000801f, +0.002139f, -0.000066f, -0.001500f, -0.000628f, +0.002607f, +0.000627f, + -0.001555f, +0.001203f, -0.003167f, +0.001778f, +0.000902f, -0.003243f, +0.001208f, -0.000525f, -0.002157f, -0.001741f, + +0.002646f, +0.000391f, -0.001315f, -0.000731f, +0.001766f, -0.000159f, +0.001166f, +0.000221f, +0.000638f, -0.001375f, + -0.000927f, -0.000202f, +0.000574f, -0.001379f, -0.001268f, -0.001473f, +0.000373f, -0.000706f, -0.000449f, +0.000519f, + -0.000916f, -0.000637f, +0.000774f, -0.000690f, -0.000102f, +0.000124f, +0.000458f, +0.000399f, -0.000261f, -0.000904f, + +0.000491f, +0.000058f, -0.001214f, -0.000329f, +0.000763f, +0.000548f + }, + { + -0.073409f, -0.052484f, +0.039048f, +0.056575f, +0.004253f, +0.006468f, -0.003614f, -0.000564f, -0.009509f, +0.014735f, + +0.015728f, +0.015704f, +0.004896f, -0.007787f, +0.008173f, -0.000564f, -0.003690f, -0.001099f, +0.000195f, -0.005616f, + -0.001530f, +0.002823f, -0.000454f, -0.003910f, +0.013083f, +0.004092f, +0.003359f, +0.006166f, -0.003485f, +0.004169f, + -0.002315f, -0.004860f, -0.002921f, -0.000448f, +0.001484f, -0.001600f, +0.007804f, -0.004958f, +0.003241f, +0.001532f, + +0.002926f, +0.000833f, -0.008997f, +0.000260f, +0.004669f, -0.000654f, +0.000208f, +0.002144f, +0.001128f, +0.000236f, + -0.001057f, +0.000148f, +0.003434f, +0.001493f, +0.000135f, +0.000113f, -0.000232f, -0.000312f, -0.001458f, -0.000297f, + -0.000250f, -0.001284f, -0.000487f, -0.000434f, -0.001717f, -0.000156f, -0.000433f, -0.001215f, -0.000610f, -0.000596f, + -0.000967f, -0.000977f, +0.001200f, -0.001238f, +0.000721f, +0.000669f, -0.000605f, -0.000212f, +0.000665f, -0.000191f, + +0.000474f, +0.000145f, +0.000057f, -0.000576f, -0.000602f, +0.000074f, -0.000010f, +0.000205f, +0.000735f, -0.000239f, + +0.000301f, -0.000471f, -0.000101f, -0.000383f, -0.000036f, -0.000501f + }, + { + +0.000232f, -0.026705f, +0.002008f, +0.006345f, -0.000728f, -0.001800f, +0.000454f, +0.000933f, +0.001961f, -0.001187f, + +0.004981f, +0.014935f, +0.000813f, +0.007516f, -0.019896f, +0.010933f, -0.002845f, +0.006396f, +0.002101f, +0.022272f, + +0.006722f, -0.000844f, -0.006351f, +0.008277f, -0.000696f, -0.002541f, -0.003477f, +0.018423f, +0.008022f, -0.010341f, + +0.001634f, -0.004502f, -0.002625f, -0.002107f, -0.006963f, +0.006070f, -0.004239f, -0.002207f, +0.004677f, +0.001430f, + -0.002381f, -0.001813f, +0.005420f, +0.000457f, -0.001187f, +0.003929f, +0.002084f, +0.003225f, +0.005404f, +0.001156f, + +0.000573f, -0.002430f, +0.001580f, +0.002875f, +0.001669f, +0.001809f, +0.002173f, -0.003651f, -0.002208f, -0.000146f, + -0.001380f, -0.002210f, -0.000779f, +0.001508f, +0.000023f, -0.000189f, -0.000544f, +0.000266f, +0.000104f, -0.001174f, + +0.002218f, +0.000600f, +0.000838f, -0.000923f, +0.000677f, -0.001444f, -0.000927f, +0.000360f, +0.001157f, -0.000084f, + +0.000008f, +0.000069f, +0.000141f, +0.000931f, -0.000790f, -0.000162f, -0.000998f, -0.000103f, +0.000087f, -0.000439f, + -0.000458f, -0.000082f, -0.000296f, -0.000088f, -0.000174f, -0.000335f + }, + { + +0.025843f, -0.398486f, +0.026231f, +0.042697f, +0.014505f, -0.000334f, -0.013525f, -0.005022f, -0.010185f, -0.001409f, + -0.017376f, +0.011031f, +0.001612f, -0.001286f, -0.006755f, -0.010751f, +0.011091f, -0.000529f, +0.000538f, +0.001618f, + -0.003139f, -0.003204f, +0.002089f, +0.005051f, -0.001749f, -0.002815f, +0.002373f, -0.000293f, -0.000008f, +0.000083f, + +0.005301f, -0.005865f, -0.003057f, -0.005115f, +0.001474f, +0.005602f, +0.003432f, -0.001267f, -0.006697f, +0.004448f, + +0.006683f, +0.003377f, -0.005218f, +0.001558f, -0.001157f, -0.005919f, +0.000692f, +0.004366f, +0.001451f, -0.000505f, + -0.005268f, -0.002080f, +0.000860f, +0.000480f, -0.001131f, -0.004192f, +0.002166f, +0.002394f, +0.000154f, +0.001973f, + +0.001529f, +0.001912f, -0.000924f, -0.000481f, -0.000383f, -0.000304f, +0.000035f, +0.000422f, -0.000467f, +0.000290f, + +0.001089f, -0.000851f, -0.000903f, +0.000762f, -0.000793f, -0.000617f, +0.000794f, +0.000005f, -0.000713f, +0.000600f, + +0.000647f, -0.000133f, -0.000577f, +0.000117f, +0.000929f, +0.000644f, -0.000237f, -0.000651f, +0.000038f, +0.000352f, + -0.000184f, +0.000327f, +0.000591f, +0.000727f, -0.000021f, +0.000010f + }, + { + -0.001482f, -0.065980f, +0.011437f, -0.014366f, +0.016281f, -0.001911f, -0.005932f, +0.005578f, +0.003107f, +0.006265f, + +0.014095f, +0.013644f, -0.001721f, +0.005209f, -0.007442f, -0.003497f, +0.016786f, -0.014765f, -0.027237f, -0.001984f, + +0.013733f, +0.030959f, -0.006784f, +0.004727f, -0.008749f, -0.020563f, -0.003350f, +0.003929f, -0.006125f, +0.011695f, + +0.007950f, -0.000744f, +0.002143f, +0.004685f, -0.004176f, -0.009597f, -0.004124f, -0.000714f, +0.002182f, -0.003482f, + +0.002383f, -0.003915f, -0.001888f, +0.007718f, +0.004234f, +0.001179f, -0.005666f, +0.000247f, +0.003315f, +0.004891f, + +0.000391f, +0.003082f, -0.003018f, -0.001065f, -0.001204f, -0.000542f, +0.002248f, +0.002989f, +0.002683f, -0.000680f, + +0.001358f, +0.000554f, -0.000683f, -0.000574f, -0.000269f, +0.000521f, -0.001312f, -0.001370f, -0.000903f, +0.000000f, + -0.000076f, +0.000118f, -0.000958f, -0.000724f, -0.001228f, -0.000918f, -0.000782f, +0.001319f, -0.000109f, +0.000312f, + +0.000761f, -0.000574f, -0.000508f, -0.000427f, -0.000386f, -0.000864f, +0.000352f, +0.000077f, +0.000411f, +0.000295f, + -0.000547f, -0.000115f, -0.000078f, +0.000358f, +0.000270f, -0.000410f + }, + { + -0.035288f, -0.088981f, +0.022502f, +0.016117f, +0.006055f, -0.014740f, +0.021301f, +0.007800f, +0.002485f, +0.015095f, + +0.001871f, -0.002420f, -0.005122f, -0.003434f, +0.022483f, +0.006287f, +0.002841f, -0.004984f, -0.001811f, -0.003160f, + +0.001370f, +0.000720f, +0.001962f, -0.002304f, +0.005422f, -0.006085f, +0.004337f, +0.003055f, +0.008502f, +0.002652f, + -0.003586f, +0.000854f, -0.002808f, -0.001702f, +0.000064f, +0.000675f, +0.001924f, -0.000611f, -0.000990f, -0.004397f, + -0.004290f, -0.001958f, +0.005348f, +0.002255f, -0.001378f, +0.003496f, +0.000360f, -0.001228f, -0.002567f, -0.000911f, + -0.000400f, +0.001478f, -0.000489f, -0.000358f, +0.001376f, -0.001020f, +0.003229f, -0.001471f, +0.001594f, -0.000339f, + -0.002071f, +0.001809f, +0.000565f, +0.001237f, -0.002890f, -0.001588f, +0.000196f, -0.000424f, +0.000512f, +0.001253f, + +0.000600f, -0.000127f, +0.000692f, +0.000326f, +0.000354f, +0.000240f, -0.000524f, +0.001294f, +0.001005f, +0.000395f, + +0.000150f, -0.000073f, -0.000345f, -0.000217f, +0.000137f, +0.000489f, +0.000440f, +0.000384f, +0.000083f, -0.000197f, + +0.000004f, -0.000158f, +0.000001f, -0.000080f, -0.000291f, -0.000372f + }, + { + -0.000162f, -0.060728f, -0.014223f, +0.017008f, +0.015347f, -0.002490f, -0.001421f, -0.006587f, +0.002986f, -0.003697f, + +0.006212f, +0.015159f, +0.005905f, -0.016616f, -0.000956f, +0.016634f, +0.008273f, +0.001102f, -0.000553f, -0.000248f, + +0.004376f, -0.007339f, +0.009448f, -0.007717f, +0.009604f, -0.011075f, -0.001600f, +0.001411f, -0.005434f, +0.000514f, + -0.010119f, +0.004799f, -0.002071f, +0.001290f, -0.005877f, -0.003923f, +0.000624f, +0.000226f, +0.007586f, -0.003527f, + -0.009032f, +0.001533f, -0.000883f, -0.003147f, -0.000978f, +0.003317f, -0.000845f, +0.002239f, -0.002125f, -0.001231f, + -0.000177f, -0.000951f, -0.000710f, -0.002745f, +0.002516f, -0.004451f, -0.001187f, -0.000035f, +0.004030f, +0.000922f, + -0.000415f, +0.000335f, -0.001190f, -0.001171f, +0.001427f, -0.000143f, +0.000533f, -0.000725f, -0.000672f, -0.000086f, + +0.000539f, +0.003436f, -0.000769f, +0.001081f, +0.000152f, +0.000709f, -0.000001f, -0.000011f, +0.000495f, -0.000482f, + +0.000055f, -0.001199f, +0.001207f, -0.000375f, +0.000006f, +0.000776f, -0.000845f, -0.000308f, -0.000404f, +0.000124f, + +0.000242f, +0.000302f, +0.000108f, +0.000064f, -0.000060f, -0.000165f + }, + { + +0.048997f, +0.208193f, -0.030149f, -0.009386f, +0.010642f, +0.000221f, -0.025404f, -0.003095f, -0.016649f, -0.005658f, + +0.003805f, -0.008588f, -0.000054f, -0.002600f, -0.005557f, +0.004536f, -0.005810f, +0.008872f, -0.008658f, -0.003689f, + -0.001259f, +0.014493f, +0.001928f, -0.008442f, -0.013814f, -0.000472f, +0.002549f, +0.002226f, +0.004792f, +0.001808f, + +0.005535f, -0.002451f, +0.008584f, +0.003771f, -0.012765f, +0.005721f, +0.002249f, -0.006983f, +0.007821f, +0.000115f, + +0.000984f, +0.003017f, +0.007257f, -0.004805f, -0.002099f, -0.000490f, +0.002100f, +0.002122f, +0.001630f, -0.000235f, + -0.003991f, -0.001856f, -0.004917f, -0.004531f, -0.000481f, -0.000590f, +0.000283f, +0.002834f, -0.000315f, +0.000696f, + -0.001517f, -0.001427f, -0.001622f, +0.000089f, -0.000697f, +0.001322f, +0.001133f, -0.000155f, +0.000138f, +0.001830f, + +0.001012f, -0.000750f, +0.002541f, -0.000988f, -0.000217f, +0.000631f, +0.000386f, -0.001297f, +0.000744f, -0.000540f, + -0.000143f, +0.000474f, +0.000005f, -0.000694f, -0.000250f, +0.000542f, +0.000814f, +0.000057f, +0.000367f, -0.000170f, + -0.000641f, +0.000184f, +0.000195f, +0.000167f, +0.000317f, +0.000430f + }, + { + -0.004362f, -0.040761f, +0.009091f, +0.001708f, -0.004935f, -0.001320f, -0.000660f, -0.001214f, -0.011601f, +0.004307f, + +0.000481f, -0.000229f, +0.005086f, -0.047068f, -0.008106f, +0.017744f, +0.002298f, +0.005296f, +0.021468f, -0.012386f, + +0.014444f, +0.004303f, -0.010549f, -0.004889f, -0.007016f, -0.004323f, -0.008645f, -0.012581f, -0.001893f, -0.008351f, + +0.010149f, -0.003509f, -0.006160f, +0.004102f, -0.006878f, +0.000533f, +0.003673f, -0.005150f, +0.004975f, +0.002169f, + +0.004230f, -0.000070f, +0.002677f, +0.004563f, +0.001427f, +0.000061f, +0.000298f, +0.000920f, +0.002535f, -0.001536f, + -0.001748f, +0.000676f, -0.001263f, +0.001498f, +0.001719f, +0.000486f, -0.001329f, +0.001437f, -0.000600f, +0.001262f, + +0.002834f, -0.001224f, +0.000071f, -0.000229f, -0.000548f, +0.001295f, -0.000697f, -0.001466f, +0.000242f, +0.000647f, + -0.000111f, +0.000725f, -0.000231f, +0.001347f, +0.000977f, -0.000573f, -0.000713f, -0.002028f, -0.000448f, -0.000100f, + -0.000664f, -0.000526f, +0.000992f, -0.000456f, -0.000097f, +0.000354f, -0.000475f, -0.000088f, +0.000151f, -0.000214f, + -0.000413f, +0.000031f, +0.000021f, +0.000032f, -0.000118f, +0.000161f + }, + { + +0.004988f, +0.159136f, -0.002088f, -0.009033f, +0.003790f, +0.002699f, +0.002013f, +0.003301f, -0.008135f, +0.008167f, + -0.005376f, -0.008685f, +0.013527f, -0.015715f, -0.045449f, -0.001601f, +0.023055f, -0.000206f, -0.012800f, -0.016870f, + -0.006205f, -0.001569f, -0.004649f, -0.002393f, -0.004760f, +0.014934f, -0.000577f, -0.010067f, -0.007335f, +0.002153f, + +0.001861f, -0.008829f, -0.007341f, -0.002191f, -0.004393f, +0.000894f, -0.000669f, -0.001325f, +0.002927f, -0.000285f, + +0.001496f, +0.004132f, -0.004376f, -0.003770f, -0.004993f, -0.003279f, -0.001935f, -0.001248f, -0.001796f, +0.001613f, + +0.001340f, +0.002437f, -0.000331f, -0.004258f, +0.001307f, +0.000052f, +0.000582f, +0.001592f, +0.000750f, -0.000069f, + +0.000722f, -0.001155f, -0.000321f, +0.000470f, -0.001568f, +0.001521f, +0.000318f, +0.000370f, +0.000615f, -0.000666f, + +0.000511f, -0.001022f, -0.001112f, -0.000916f, +0.000316f, -0.000372f, -0.000078f, -0.000037f, +0.000566f, +0.000568f, + -0.000683f, -0.001571f, +0.000318f, -0.000534f, -0.000601f, -0.000693f, -0.001307f, -0.000642f, +0.000228f, +0.000694f, + +0.000250f, +0.000066f, +0.000240f, -0.000441f, -0.000131f, -0.000263f + } + }, + { + { + -0.002690f, -0.113906f, -0.007630f, +0.009879f, +0.000558f, -0.001695f, +0.006495f, -0.001851f, -0.000542f, +0.004772f, + +0.007487f, -0.006462f, -0.004796f, -0.008623f, -0.004820f, +0.013585f, +0.002718f, -0.004271f, +0.024179f, +0.010159f, + +0.002542f, +0.000207f, +0.004669f, +0.008496f, -0.010153f, -0.008460f, -0.015499f, -0.007390f, -0.004767f, -0.013223f, + -0.011308f, +0.007412f, +0.007532f, -0.001905f, +0.000768f, +0.001062f, -0.001363f, +0.008329f, +0.001895f, +0.001134f, + +0.001217f, -0.003536f, -0.001357f, -0.003561f, -0.000181f, +0.000731f, -0.001090f, -0.001850f, +0.005954f, +0.003073f, + +0.001638f, +0.000849f, +0.000284f, +0.001154f, -0.001368f, +0.001014f, -0.001551f, -0.001960f, +0.001479f, -0.000561f, + -0.002243f, -0.001173f, +0.001027f, +0.000352f, +0.000286f, +0.000125f, -0.001432f, +0.000409f, +0.000320f, +0.000105f, + +0.000535f, -0.000161f, -0.000392f, +0.000341f, -0.001282f, +0.001073f, +0.000170f, +0.001690f, -0.000043f, +0.000332f, + -0.000106f, -0.000143f, -0.000532f, +0.000420f, -0.000547f, -0.000039f, +0.000012f, -0.000837f, +0.000432f, +0.000447f, + +0.000472f, +0.000273f, +0.000058f, +0.000150f, -0.000049f, +0.000326f + }, + { + -0.024368f, -0.335530f, +0.010211f, +0.024076f, +0.006753f, -0.000758f, -0.003999f, -0.000577f, -0.007696f, -0.009047f, + -0.017941f, -0.006814f, +0.002649f, -0.002776f, -0.019271f, -0.010659f, -0.008156f, -0.001656f, +0.005286f, -0.003422f, + +0.002727f, -0.007571f, +0.007780f, +0.001936f, -0.006951f, -0.001845f, +0.002920f, +0.010838f, -0.000882f, +0.002546f, + +0.001212f, -0.000348f, +0.004073f, -0.001503f, +0.005458f, -0.002862f, +0.006483f, +0.002445f, +0.003648f, +0.006510f, + -0.000520f, -0.005924f, -0.000268f, -0.000635f, -0.000186f, -0.003400f, +0.001756f, +0.000856f, -0.000201f, -0.000146f, + +0.004503f, +0.003724f, +0.001580f, -0.004147f, -0.000455f, -0.000459f, +0.002510f, -0.002692f, -0.000589f, +0.001164f, + -0.002326f, +0.000047f, -0.000180f, -0.001224f, -0.000338f, -0.001800f, +0.000759f, -0.000649f, -0.000974f, -0.000271f, + +0.000478f, +0.001079f, +0.000363f, -0.001008f, +0.000111f, +0.001158f, -0.000482f, +0.000149f, -0.000345f, +0.001011f, + -0.000251f, -0.000530f, -0.000083f, -0.000105f, +0.000357f, -0.000168f, -0.000025f, -0.000058f, -0.000205f, +0.000193f, + +0.000124f, +0.000495f, +0.000248f, -0.000115f, +0.000027f, -0.000160f + }, + { + +0.009300f, +0.247111f, +0.045845f, +0.005404f, +0.010514f, +0.003804f, +0.003730f, -0.002392f, -0.005308f, -0.010953f, + +0.004292f, -0.011263f, -0.004090f, +0.001834f, +0.001168f, +0.005442f, +0.009981f, +0.004912f, +0.003937f, +0.006795f, + +0.007959f, -0.000112f, +0.007090f, +0.015005f, -0.006267f, -0.004394f, -0.003301f, -0.005994f, -0.002714f, -0.006563f, + +0.001374f, -0.002054f, +0.000904f, -0.008452f, +0.001040f, -0.004164f, +0.006047f, -0.001536f, +0.000167f, -0.005804f, + -0.003519f, +0.002016f, +0.001645f, +0.003174f, -0.001399f, +0.002805f, -0.000704f, +0.002508f, +0.001236f, +0.000906f, + -0.001575f, +0.001122f, +0.003127f, -0.001160f, -0.002925f, -0.000452f, +0.002579f, -0.001395f, +0.000887f, +0.003737f, + -0.000269f, -0.000232f, -0.001050f, +0.001195f, +0.000500f, -0.000411f, -0.001492f, -0.001016f, +0.000573f, +0.000055f, + -0.000236f, +0.000705f, +0.000851f, +0.000275f, -0.001559f, -0.000064f, +0.000115f, -0.000029f, -0.000025f, +0.000285f, + -0.000268f, +0.000199f, +0.000611f, -0.000103f, +0.000047f, +0.000132f, +0.000072f, -0.000215f, -0.000183f, -0.000359f, + +0.000331f, -0.000476f, -0.000186f, -0.000071f, +0.000711f, -0.000187f + }, + { + -0.000879f, -0.071201f, +0.008900f, -0.006767f, +0.000415f, +0.000432f, -0.000236f, +0.000121f, -0.000463f, -0.003243f, + -0.003170f, +0.013273f, -0.004418f, +0.005567f, -0.007141f, -0.014283f, -0.004784f, -0.003628f, -0.013823f, +0.002902f, + -0.010256f, -0.016919f, +0.011528f, -0.004286f, +0.006895f, +0.000206f, +0.007554f, -0.000052f, +0.001765f, -0.010109f, + -0.000624f, +0.006738f, -0.001724f, +0.006171f, +0.000668f, -0.009212f, +0.005795f, -0.003671f, +0.005337f, -0.003989f, + +0.003235f, -0.000614f, -0.001040f, +0.000199f, +0.002667f, +0.002674f, +0.004604f, -0.005163f, +0.000071f, -0.003130f, + -0.002034f, +0.000850f, +0.001414f, -0.001334f, -0.000981f, +0.002206f, -0.000453f, +0.001007f, -0.000423f, -0.001229f, + -0.001624f, +0.000104f, -0.002409f, -0.000047f, -0.000265f, -0.000123f, -0.000864f, +0.000471f, +0.001064f, -0.000754f, + +0.000330f, +0.000095f, -0.000271f, +0.000860f, +0.000041f, +0.000467f, -0.000106f, +0.000464f, +0.000250f, -0.000093f, + +0.000505f, -0.000057f, -0.001561f, +0.000489f, +0.000390f, -0.000197f, -0.000431f, -0.000244f, -0.000360f, +0.000078f, + +0.000223f, +0.000030f, -0.000053f, +0.000024f, +0.000027f, -0.000281f + }, + { + +0.057917f, -0.251025f, -0.021837f, +0.004713f, +0.001645f, -0.002582f, -0.000509f, +0.004957f, -0.003063f, +0.005561f, + +0.010888f, +0.016240f, +0.003024f, +0.006065f, -0.022965f, -0.000372f, -0.008163f, -0.013106f, +0.001260f, +0.004284f, + -0.000480f, -0.004235f, +0.008696f, -0.007887f, +0.000266f, -0.001773f, +0.001140f, -0.015331f, -0.000528f, -0.007674f, + +0.000989f, -0.003844f, +0.002463f, -0.003503f, -0.008700f, +0.000574f, -0.015812f, +0.001333f, +0.006295f, -0.005387f, + -0.004293f, +0.004670f, +0.000695f, +0.000737f, +0.007463f, +0.005892f, +0.001780f, +0.008214f, +0.000232f, +0.001729f, + -0.000543f, -0.000215f, -0.000074f, -0.000023f, +0.002674f, +0.001248f, +0.000956f, +0.002197f, +0.000716f, -0.000543f, + -0.000033f, -0.001028f, +0.001926f, +0.000934f, -0.000915f, +0.001359f, +0.001404f, +0.001774f, +0.000150f, -0.000047f, + +0.001516f, -0.000774f, +0.001206f, -0.000824f, -0.000805f, -0.001039f, -0.000669f, -0.000849f, -0.000782f, +0.000254f, + -0.000907f, -0.000191f, +0.000212f, -0.000400f, -0.000176f, -0.000081f, -0.000292f, +0.000172f, +0.000047f, +0.000161f, + +0.000715f, +0.000136f, -0.000315f, -0.000194f, +0.000339f, -0.000014f + }, + { + +0.001039f, -0.016929f, -0.001958f, +0.001368f, +0.001566f, +0.000729f, -0.000146f, +0.001955f, +0.003509f, -0.004989f, + -0.001144f, -0.005925f, -0.010866f, +0.006796f, +0.008467f, +0.000606f, +0.002036f, +0.005767f, +0.011607f, -0.026488f, + -0.002605f, +0.003765f, -0.003403f, -0.028690f, -0.009168f, +0.021309f, -0.002883f, -0.002044f, -0.002229f, -0.007407f, + -0.004471f, +0.010668f, +0.003155f, -0.001266f, -0.000331f, +0.001752f, +0.002494f, -0.006623f, -0.000783f, +0.003184f, + +0.000614f, -0.001053f, -0.000411f, -0.000400f, +0.003377f, +0.001035f, -0.001169f, +0.000552f, +0.003308f, +0.001556f, + -0.003528f, -0.000811f, -0.004220f, +0.000089f, +0.000025f, -0.001528f, +0.001606f, +0.000775f, +0.000780f, +0.000171f, + +0.002627f, +0.000681f, +0.000161f, -0.000597f, +0.001425f, -0.001274f, +0.000487f, -0.000223f, -0.000647f, -0.001324f, + +0.000901f, -0.000003f, +0.000092f, -0.000442f, +0.000464f, +0.000780f, +0.001328f, -0.000228f, -0.000545f, +0.000854f, + +0.000168f, -0.000621f, +0.000757f, -0.000197f, +0.000622f, -0.000032f, -0.000180f, +0.000323f, +0.000600f, -0.000001f, + +0.000310f, +0.000161f, -0.000465f, -0.000319f, +0.000140f, -0.000147f + }, + { + +0.088119f, +0.084596f, -0.025317f, +0.027895f, -0.013481f, +0.000312f, -0.002606f, +0.001039f, -0.011934f, +0.006322f, + +0.002278f, -0.006899f, -0.011522f, -0.008515f, +0.015288f, -0.001573f, -0.001223f, +0.003209f, +0.002303f, -0.001007f, + -0.001594f, +0.000451f, -0.003701f, -0.005922f, +0.015880f, +0.003572f, +0.000250f, +0.001020f, -0.005471f, +0.006022f, + -0.000039f, -0.002438f, +0.002564f, +0.003946f, +0.003296f, -0.003361f, +0.003004f, -0.012084f, -0.001261f, +0.001118f, + +0.004200f, +0.003710f, -0.008620f, -0.001098f, +0.002855f, +0.001581f, +0.000551f, -0.000284f, +0.000703f, +0.002178f, + -0.000089f, -0.003375f, +0.003352f, -0.000665f, -0.001702f, -0.001144f, -0.001322f, +0.000213f, -0.001269f, -0.000898f, + -0.000177f, -0.000284f, -0.000427f, +0.000196f, -0.000781f, +0.000234f, +0.001234f, -0.001252f, +0.000037f, -0.000197f, + -0.001125f, -0.000314f, +0.001339f, -0.001583f, +0.000674f, +0.001138f, -0.000026f, -0.000749f, +0.000479f, -0.000983f, + -0.000665f, +0.000285f, +0.000677f, +0.000330f, +0.000658f, +0.000365f, -0.000070f, -0.000106f, -0.000146f, -0.000694f, + +0.000434f, -0.000352f, -0.000075f, -0.000638f, -0.000163f, -0.000275f + }, + { + +0.002284f, -0.007096f, +0.003291f, +0.001118f, +0.000589f, +0.000099f, +0.000147f, +0.000385f, +0.005203f, -0.001005f, + +0.000031f, +0.004611f, -0.003062f, +0.011702f, -0.023602f, +0.005703f, -0.001818f, -0.002715f, -0.002735f, +0.023590f, + -0.009305f, -0.014572f, -0.006988f, +0.000014f, +0.005549f, -0.003587f, -0.011099f, +0.011467f, -0.001646f, -0.001361f, + +0.010092f, +0.007141f, +0.001442f, -0.002571f, -0.001247f, +0.010770f, -0.002437f, -0.001645f, +0.003738f, +0.000097f, + -0.001726f, -0.003532f, +0.000509f, +0.002213f, -0.000137f, -0.001227f, -0.001562f, -0.002309f, +0.002118f, +0.002816f, + -0.000189f, -0.002261f, +0.001348f, -0.000515f, -0.000286f, -0.001151f, -0.000641f, -0.004409f, -0.001991f, +0.001361f, + +0.000107f, +0.000499f, +0.000120f, +0.001507f, +0.000204f, +0.000069f, -0.001239f, -0.000805f, -0.000128f, -0.002815f, + +0.001066f, +0.000253f, -0.000207f, -0.000371f, +0.000998f, -0.000567f, -0.000002f, +0.000717f, +0.001574f, +0.001337f, + +0.000877f, -0.000072f, +0.000121f, +0.000832f, -0.000549f, +0.000036f, -0.000843f, +0.000439f, +0.000630f, -0.000142f, + -0.000210f, -0.000113f, +0.000056f, +0.000686f, +0.000528f, +0.000035f + }, + { + +0.007517f, -0.470856f, -0.000840f, +0.018815f, -0.005468f, -0.006646f, -0.012332f, -0.001343f, -0.005012f, +0.005546f, + -0.014665f, +0.000388f, -0.007899f, +0.004078f, +0.009115f, -0.002047f, +0.000741f, -0.002037f, +0.003287f, +0.005125f, + +0.007634f, +0.002823f, -0.000279f, +0.002465f, -0.001666f, -0.000929f, +0.000414f, +0.000109f, +0.001614f, -0.000782f, + +0.004339f, -0.007483f, -0.000476f, -0.003872f, +0.003237f, -0.002970f, -0.004121f, +0.004313f, -0.001355f, +0.002541f, + +0.007111f, +0.000835f, -0.003024f, +0.004458f, +0.000147f, -0.006209f, -0.000717f, +0.000773f, -0.001681f, +0.000137f, + -0.002135f, -0.000017f, +0.000470f, +0.000176f, -0.000287f, -0.002276f, +0.001803f, -0.001445f, -0.003446f, +0.000544f, + +0.000251f, +0.001817f, -0.000798f, +0.000428f, +0.000986f, -0.000663f, -0.001149f, -0.000395f, -0.000846f, -0.000592f, + +0.000883f, +0.000282f, -0.001094f, +0.000303f, +0.000084f, -0.000356f, +0.000411f, -0.000027f, -0.000530f, +0.000502f, + +0.000951f, +0.000116f, -0.000402f, -0.000121f, +0.000937f, +0.000848f, -0.000227f, +0.000310f, +0.000067f, +0.000084f, + -0.000025f, +0.000433f, +0.000177f, +0.000449f, -0.000330f, -0.000268f + }, + { + +0.000118f, -0.082694f, +0.015439f, -0.010706f, +0.006560f, -0.001269f, -0.006125f, +0.003574f, -0.002241f, -0.001959f, + +0.007806f, +0.008934f, -0.003186f, +0.007471f, -0.003981f, -0.017566f, +0.002442f, -0.006848f, -0.002442f, +0.004374f, + -0.003293f, +0.019378f, -0.007398f, +0.004661f, +0.005475f, -0.009027f, -0.000301f, -0.002077f, -0.015949f, +0.008168f, + +0.000921f, -0.007008f, -0.003918f, -0.002899f, -0.006758f, +0.000089f, +0.005340f, +0.001641f, +0.004453f, -0.001385f, + +0.003693f, -0.002246f, -0.002406f, +0.004375f, +0.002025f, -0.000004f, -0.006708f, -0.001024f, +0.000821f, -0.000070f, + -0.002999f, +0.002564f, -0.001444f, +0.002838f, -0.000241f, -0.000683f, +0.001038f, +0.000869f, +0.000458f, -0.003975f, + +0.000252f, +0.001389f, -0.000599f, -0.000196f, -0.000504f, +0.000212f, -0.000856f, +0.000935f, +0.000003f, -0.001110f, + -0.000268f, +0.000125f, -0.001499f, -0.000946f, -0.002187f, -0.000443f, -0.000664f, +0.000572f, -0.001011f, -0.000935f, + +0.000712f, +0.000018f, -0.000023f, -0.000181f, -0.000554f, -0.000473f, +0.000145f, -0.000060f, +0.000274f, -0.000046f, + -0.000771f, +0.000036f, +0.000232f, +0.000075f, -0.000180f, -0.000102f + }, + { + +0.036299f, -0.088325f, -0.046420f, +0.000907f, +0.019469f, -0.006958f, -0.000454f, +0.004705f, -0.007586f, +0.008459f, + -0.008295f, -0.004772f, -0.002072f, -0.002759f, +0.007121f, -0.004053f, +0.000562f, -0.004170f, -0.006416f, -0.010032f, + +0.000170f, +0.004654f, +0.001153f, -0.006448f, +0.004251f, -0.009727f, +0.003990f, -0.003198f, +0.001752f, -0.000098f, + -0.002478f, +0.000744f, -0.002047f, -0.001118f, +0.002047f, +0.005398f, +0.001749f, -0.001848f, -0.000044f, -0.002446f, + -0.000994f, +0.000334f, +0.004529f, +0.000154f, -0.002210f, +0.006122f, +0.002624f, -0.001955f, -0.005114f, +0.000261f, + +0.000837f, +0.001819f, +0.000833f, -0.001515f, -0.001478f, -0.004506f, +0.001358f, -0.000145f, +0.000130f, -0.002058f, + -0.001181f, +0.002658f, +0.000102f, +0.000864f, -0.000428f, -0.000957f, -0.000005f, -0.000468f, +0.000201f, +0.001116f, + +0.000131f, -0.000567f, +0.000068f, -0.000647f, -0.000351f, +0.000602f, -0.000298f, +0.000438f, -0.000125f, -0.000025f, + +0.000339f, +0.000376f, +0.000070f, +0.000075f, -0.000166f, -0.000142f, -0.000774f, -0.000164f, +0.000127f, -0.000340f, + -0.000113f, -0.000173f, -0.000121f, +0.000046f, -0.000046f, -0.000435f + }, + { + -0.001249f, -0.031921f, +0.010982f, +0.006511f, +0.008854f, -0.004529f, +0.003811f, -0.006920f, -0.000326f, -0.004982f, + +0.002381f, +0.007856f, -0.017603f, -0.051735f, -0.006196f, +0.009745f, +0.003068f, +0.002655f, +0.001087f, +0.002481f, + +0.002644f, -0.006393f, +0.011031f, -0.007055f, -0.002103f, -0.008029f, +0.009055f, +0.008809f, +0.005428f, +0.006159f, + -0.011404f, +0.007227f, -0.000211f, +0.002918f, -0.005906f, -0.002863f, -0.008355f, -0.005505f, +0.003183f, -0.002937f, + -0.005936f, +0.003612f, -0.001668f, -0.004332f, +0.000097f, +0.003257f, -0.002569f, +0.002529f, -0.003863f, -0.002566f, + +0.000415f, -0.000292f, +0.000294f, -0.000666f, +0.001586f, -0.005525f, +0.000851f, -0.001080f, +0.001261f, -0.000776f, + -0.000687f, +0.000456f, +0.000082f, -0.000117f, +0.001182f, -0.000342f, -0.000548f, -0.000900f, -0.000687f, +0.001199f, + -0.000409f, +0.001472f, -0.000195f, +0.001250f, -0.000097f, +0.000604f, -0.000246f, -0.000293f, +0.000627f, -0.000049f, + +0.000805f, -0.000579f, +0.001090f, -0.000173f, -0.000328f, +0.000200f, -0.000576f, +0.000029f, -0.000448f, -0.000093f, + -0.000115f, -0.000270f, -0.000202f, -0.000052f, +0.000134f, +0.000086f + }, + { + -0.060837f, +0.070627f, +0.005917f, +0.002340f, +0.023197f, +0.020299f, -0.026988f, -0.007067f, -0.009153f, +0.003128f, + +0.020626f, +0.006389f, +0.001300f, +0.005819f, +0.013311f, +0.001501f, +0.000676f, +0.012805f, -0.002917f, +0.001467f, + -0.007790f, +0.000950f, -0.005497f, -0.003446f, -0.009625f, -0.003328f, +0.001698f, +0.003313f, +0.006532f, -0.002645f, + -0.000669f, -0.004517f, +0.006289f, +0.005027f, -0.005184f, +0.008327f, -0.007451f, -0.011271f, +0.006209f, -0.002628f, + +0.000720f, +0.001209f, +0.006528f, -0.009703f, -0.006865f, -0.003484f, +0.000643f, -0.000169f, -0.001288f, -0.000455f, + -0.002352f, +0.000550f, -0.003608f, -0.003449f, +0.001435f, +0.000642f, +0.002290f, +0.002771f, +0.000479f, +0.003653f, + -0.000494f, -0.001003f, -0.000098f, +0.000952f, -0.001568f, +0.000277f, -0.000554f, -0.001527f, -0.000841f, -0.000528f, + +0.000383f, +0.000226f, +0.003437f, +0.000105f, +0.000100f, +0.000969f, +0.000916f, -0.000766f, -0.000338f, +0.000360f, + +0.000484f, +0.000053f, -0.000647f, +0.000049f, +0.000413f, -0.000195f, +0.000141f, +0.000015f, +0.000044f, +0.000344f, + -0.000205f, +0.000122f, +0.000291f, +0.000109f, -0.000050f, -0.000089f + }, + { + +0.002867f, -0.033389f, +0.001541f, +0.000317f, +0.002585f, +0.002254f, +0.001545f, +0.004032f, -0.005534f, +0.008608f, + +0.005925f, +0.004912f, +0.005791f, +0.031958f, +0.105524f, +0.020349f, -0.011069f, -0.001922f, +0.014345f, -0.015907f, + +0.005477f, +0.002912f, -0.007316f, -0.008971f, +0.000984f, +0.007486f, -0.001932f, -0.004330f, -0.002147f, -0.010157f, + +0.010293f, +0.004567f, -0.002227f, +0.002664f, -0.009327f, -0.001617f, +0.003632f, -0.007409f, +0.005960f, +0.004655f, + -0.001589f, -0.001731f, +0.003029f, +0.001585f, -0.002850f, -0.001970f, +0.001780f, -0.000448f, +0.000823f, -0.000259f, + -0.000959f, +0.001230f, +0.000391f, +0.000278f, +0.000371f, -0.001525f, -0.001056f, +0.002093f, -0.002113f, -0.000088f, + +0.000886f, -0.001944f, +0.001527f, +0.001039f, -0.001613f, -0.000576f, -0.000556f, -0.001343f, +0.000350f, +0.000586f, + -0.001368f, +0.000454f, +0.000112f, +0.000061f, -0.000247f, +0.000063f, +0.000197f, -0.000306f, +0.000665f, -0.000226f, + -0.000031f, -0.000585f, +0.000579f, -0.000130f, -0.000076f, +0.000246f, -0.000251f, +0.000196f, +0.000015f, +0.000045f, + -0.000233f, +0.000125f, -0.000002f, +0.000142f, +0.000005f, -0.000316f + }, + { + -0.031095f, +0.109140f, +0.014362f, -0.000583f, +0.000051f, +0.002327f, +0.005433f, +0.014091f, -0.002738f, +0.011297f, + +0.002328f, +0.001851f, +0.017488f, +0.023337f, +0.011760f, +0.008249f, +0.021617f, -0.010230f, -0.004141f, -0.000749f, + +0.004962f, +0.005449f, +0.000177f, -0.001497f, -0.003447f, +0.012411f, +0.002330f, -0.010729f, -0.006260f, -0.000440f, + +0.001282f, -0.001809f, -0.000836f, +0.005384f, -0.000240f, +0.000757f, -0.007072f, -0.003282f, +0.000962f, -0.000356f, + +0.003559f, +0.004849f, -0.003902f, -0.005705f, -0.001155f, +0.000333f, +0.002712f, +0.001510f, -0.000818f, +0.000361f, + -0.000320f, +0.003821f, +0.002767f, -0.000970f, +0.004088f, -0.001260f, -0.002453f, +0.001820f, -0.000251f, -0.002159f, + -0.001358f, -0.002918f, -0.000592f, +0.001524f, -0.001127f, +0.000711f, -0.000301f, +0.000330f, +0.001262f, -0.000894f, + -0.000565f, -0.000681f, -0.000162f, -0.000510f, +0.000237f, +0.000124f, +0.000785f, +0.000054f, +0.000360f, +0.000190f, + -0.000143f, -0.000779f, +0.000569f, -0.000701f, -0.001130f, -0.000013f, -0.000135f, -0.000106f, -0.000408f, +0.000363f, + +0.000275f, -0.000039f, +0.000346f, -0.000014f, +0.000133f, -0.000674f + } + }, + { + { + +0.001273f, -0.120991f, -0.000660f, +0.009554f, -0.005477f, +0.000141f, +0.003655f, +0.001745f, -0.005301f, +0.005881f, + -0.000472f, +0.000426f, +0.000763f, -0.000695f, -0.013876f, +0.022468f, -0.000932f, +0.001191f, +0.003455f, +0.021201f, + -0.001801f, +0.001441f, +0.001827f, +0.001590f, +0.013929f, -0.017878f, -0.014810f, -0.005202f, -0.004354f, -0.024743f, + +0.003117f, +0.003597f, -0.000552f, +0.005751f, +0.001633f, -0.002085f, -0.002745f, +0.001799f, +0.008547f, -0.003085f, + +0.001835f, -0.001535f, -0.006167f, +0.001332f, +0.000157f, -0.002830f, +0.000549f, +0.000289f, +0.003920f, +0.001688f, + +0.001389f, +0.000042f, +0.000932f, -0.000623f, +0.001685f, -0.001218f, -0.000768f, -0.002462f, +0.000498f, -0.002116f, + -0.000203f, -0.000165f, +0.001178f, +0.000398f, -0.001073f, +0.001184f, -0.001106f, -0.000296f, +0.000898f, +0.000583f, + -0.000232f, -0.000078f, -0.000081f, -0.000297f, -0.000263f, +0.000746f, +0.000463f, +0.001459f, +0.000089f, -0.000036f, + +0.000605f, -0.000471f, +0.000356f, -0.000341f, +0.000032f, +0.000058f, +0.000291f, -0.000623f, -0.000237f, +0.000373f, + +0.000613f, +0.000219f, +0.000117f, -0.000022f, -0.000219f, +0.000419f + }, + { + +0.022245f, -0.377694f, +0.003063f, +0.019555f, +0.001784f, -0.006312f, +0.001565f, -0.000159f, -0.008224f, -0.015448f, + -0.012904f, -0.009347f, +0.007755f, -0.008908f, -0.014506f, -0.006818f, -0.020318f, -0.004581f, +0.014777f, -0.004156f, + -0.003600f, +0.008239f, -0.005800f, +0.005934f, -0.005016f, -0.004027f, +0.010728f, +0.002349f, -0.001184f, +0.001272f, + +0.001533f, -0.000005f, -0.003493f, +0.009355f, -0.003809f, +0.003965f, +0.002233f, +0.006644f, +0.004841f, +0.001214f, + -0.003256f, +0.000766f, -0.002835f, +0.000825f, +0.002980f, -0.004355f, -0.001513f, +0.001151f, +0.000209f, +0.001829f, + +0.004185f, +0.000300f, +0.002587f, -0.001573f, -0.002410f, +0.001037f, +0.001131f, -0.000951f, -0.002223f, +0.001944f, + -0.001212f, -0.000799f, -0.000441f, -0.000235f, -0.000307f, -0.002941f, +0.000477f, +0.000283f, -0.000174f, -0.001101f, + +0.000149f, +0.000333f, +0.000754f, -0.000357f, -0.000565f, +0.000549f, +0.001095f, -0.000730f, -0.000501f, +0.000775f, + +0.000530f, -0.000694f, -0.000159f, +0.000168f, +0.000558f, -0.000362f, -0.000232f, -0.000094f, -0.000392f, +0.000586f, + -0.000364f, +0.000588f, +0.000240f, +0.000099f, -0.000191f, -0.000142f + }, + { + -0.011872f, +0.247660f, +0.053103f, +0.028237f, +0.007730f, -0.003696f, +0.001596f, +0.002037f, -0.006472f, -0.006134f, + -0.001762f, -0.006631f, -0.008446f, +0.000603f, -0.005496f, +0.013504f, +0.007283f, -0.008937f, +0.001369f, +0.010783f, + +0.006853f, +0.002520f, +0.003485f, +0.016700f, -0.005766f, -0.004550f, +0.001156f, -0.006570f, -0.013732f, -0.001984f, + +0.000451f, +0.002576f, -0.003251f, -0.001549f, -0.004028f, +0.002177f, +0.001485f, -0.000816f, +0.006238f, -0.007373f, + -0.001731f, -0.000432f, -0.001492f, +0.009268f, -0.002370f, -0.000039f, +0.003337f, +0.001226f, +0.000098f, +0.000539f, + -0.000375f, +0.000928f, -0.000465f, -0.000402f, +0.000449f, -0.000768f, +0.000255f, -0.000547f, +0.001265f, +0.003083f, + +0.000158f, -0.000722f, +0.001090f, +0.000710f, +0.001542f, -0.001002f, -0.001364f, -0.001025f, +0.000574f, -0.000326f, + +0.001028f, +0.000045f, +0.001337f, +0.000036f, -0.001210f, -0.000380f, +0.000072f, +0.000055f, -0.000310f, +0.000320f, + -0.000126f, +0.000488f, -0.000281f, -0.000000f, +0.000316f, -0.000270f, -0.000267f, +0.000255f, -0.000258f, -0.000070f, + +0.000052f, -0.000431f, +0.000187f, -0.000141f, -0.000002f, +0.000282f + }, + { + +0.001673f, -0.053315f, -0.009248f, -0.004227f, -0.000513f, -0.000476f, +0.000022f, +0.002545f, -0.004478f, +0.001942f, + -0.002633f, +0.005064f, +0.001957f, -0.002038f, +0.008528f, -0.016629f, +0.002698f, -0.013425f, -0.022340f, +0.003882f, + -0.008175f, -0.018482f, +0.000691f, +0.001660f, +0.004116f, +0.005329f, +0.001649f, +0.004345f, -0.006520f, -0.006880f, + +0.001207f, +0.003718f, +0.001548f, +0.005350f, -0.003988f, +0.001096f, -0.003896f, +0.001197f, -0.002854f, +0.000519f, + +0.002804f, +0.000854f, -0.000413f, +0.000551f, +0.000789f, +0.003875f, +0.002000f, -0.002639f, -0.001271f, -0.002700f, + +0.000167f, -0.000683f, +0.000295f, -0.001153f, -0.000895f, +0.002940f, -0.001444f, +0.000839f, +0.000526f, -0.001793f, + -0.000921f, -0.001768f, -0.001498f, +0.000396f, -0.000648f, +0.000437f, -0.000530f, -0.000388f, +0.000637f, -0.000618f, + +0.000313f, -0.000613f, +0.000042f, +0.000597f, -0.000160f, -0.000051f, +0.000134f, +0.000431f, +0.000330f, -0.000461f, + +0.000362f, -0.000003f, -0.000878f, -0.000253f, +0.000234f, +0.000398f, -0.000898f, -0.000338f, -0.000016f, +0.000108f, + +0.000239f, -0.000106f, +0.000022f, +0.000176f, +0.000117f, -0.000064f + }, + { + -0.077156f, -0.097905f, -0.012245f, +0.011094f, +0.006460f, -0.001510f, -0.001957f, +0.001178f, +0.001376f, +0.001670f, + +0.009535f, +0.014673f, +0.006746f, +0.002389f, -0.003933f, -0.009224f, -0.011449f, -0.001847f, -0.003086f, -0.004094f, + -0.003570f, +0.007438f, -0.001010f, -0.001512f, -0.000806f, -0.001234f, -0.004308f, -0.004471f, -0.012962f, -0.003147f, + +0.002964f, -0.004624f, -0.001083f, -0.004605f, -0.007151f, +0.001927f, -0.017517f, -0.002127f, +0.005468f, -0.002772f, + -0.003941f, +0.002929f, +0.000096f, +0.001643f, +0.008122f, +0.005735f, +0.002647f, +0.004318f, +0.004418f, -0.001842f, + +0.002596f, +0.001009f, +0.000646f, +0.000598f, +0.000590f, +0.002744f, +0.000174f, +0.002370f, -0.000205f, -0.000708f, + +0.000131f, -0.000452f, -0.000297f, +0.002096f, -0.000893f, +0.000529f, +0.001463f, +0.000399f, +0.001604f, +0.000092f, + +0.000832f, +0.001429f, -0.000833f, -0.001415f, -0.000204f, +0.000360f, -0.001552f, -0.000465f, -0.000685f, -0.000116f, + -0.000648f, +0.000461f, -0.000274f, +0.000258f, -0.000625f, +0.000169f, +0.000047f, -0.000851f, +0.000428f, +0.000376f, + -0.000137f, +0.000254f, +0.000078f, +0.000076f, -0.000084f, +0.000251f + }, + { + -0.000924f, -0.013500f, -0.002829f, +0.003330f, +0.000458f, +0.000364f, +0.000083f, +0.001780f, +0.002616f, -0.000749f, + -0.003220f, -0.008686f, -0.002213f, -0.002374f, +0.008227f, -0.008295f, +0.006935f, +0.006905f, +0.005226f, -0.033721f, + +0.004686f, +0.000620f, -0.009252f, -0.012085f, -0.008028f, +0.001602f, +0.003300f, +0.000250f, -0.002585f, -0.009628f, + -0.001499f, +0.005656f, -0.000477f, +0.000940f, +0.002275f, +0.001641f, +0.001953f, -0.002450f, -0.004997f, +0.000473f, + +0.004541f, -0.001379f, -0.002427f, +0.001524f, +0.001826f, +0.001392f, +0.000376f, -0.000684f, +0.001981f, +0.002036f, + -0.003274f, -0.001786f, -0.000472f, -0.001893f, -0.001578f, -0.000215f, +0.000516f, +0.002181f, -0.000161f, +0.001469f, + +0.001960f, +0.000808f, -0.000069f, -0.000634f, +0.001306f, -0.000635f, +0.000917f, -0.001593f, -0.001111f, +0.000048f, + -0.000517f, +0.001240f, -0.000092f, -0.000016f, -0.000035f, +0.001657f, +0.000402f, +0.000393f, -0.000619f, +0.000965f, + +0.000547f, -0.000331f, +0.000114f, +0.000087f, +0.000336f, +0.000379f, -0.000557f, +0.000093f, +0.000875f, +0.000154f, + -0.000184f, +0.000014f, +0.000131f, -0.000257f, -0.000007f, -0.000296f + }, + { + -0.080403f, +0.274587f, +0.011083f, +0.011555f, +0.001410f, -0.005205f, -0.000355f, +0.001227f, -0.001983f, -0.005389f, + -0.001037f, -0.014458f, -0.008995f, -0.003992f, +0.012470f, -0.000674f, +0.004049f, -0.000055f, +0.004742f, -0.001585f, + -0.000751f, -0.003872f, -0.003842f, -0.004501f, +0.006012f, +0.009518f, +0.002806f, +0.000251f, +0.000900f, -0.003455f, + +0.001829f, -0.004843f, +0.005565f, +0.001754f, +0.001833f, +0.000905f, -0.003613f, -0.003325f, -0.006172f, -0.001212f, + +0.004942f, +0.002815f, -0.002128f, -0.005780f, +0.001264f, +0.002370f, -0.000727f, +0.002116f, +0.000535f, +0.003330f, + -0.000437f, -0.002620f, +0.001248f, -0.003170f, -0.000913f, +0.000175f, -0.000846f, -0.000399f, -0.000114f, -0.001489f, + +0.000394f, -0.000096f, -0.000891f, -0.000145f, +0.000094f, -0.000774f, +0.001725f, -0.000918f, +0.000142f, -0.000269f, + -0.000445f, -0.000475f, +0.000352f, +0.000323f, -0.000167f, +0.000347f, +0.000529f, -0.000290f, +0.000138f, -0.001150f, + -0.000135f, +0.000315f, -0.000037f, +0.001209f, +0.000806f, +0.000059f, -0.000164f, +0.000075f, -0.000443f, -0.000374f, + +0.000157f, -0.000125f, -0.000236f, -0.000354f, -0.000384f, +0.000267f + }, + { + -0.000749f, +0.024469f, -0.010431f, -0.003463f, +0.000741f, -0.000047f, -0.000387f, +0.002156f, +0.003017f, -0.000983f, + +0.000004f, -0.002613f, +0.002869f, +0.004719f, +0.006093f, -0.025110f, +0.009879f, -0.005660f, -0.001467f, +0.006164f, + +0.000552f, -0.017885f, +0.005762f, +0.003384f, -0.007863f, -0.007774f, -0.009183f, +0.006502f, -0.006318f, +0.007397f, + +0.002358f, +0.007170f, +0.001438f, +0.001239f, -0.001760f, +0.003972f, +0.000920f, +0.000529f, +0.002808f, +0.003827f, + -0.002851f, -0.004350f, +0.000718f, +0.000258f, -0.001421f, +0.001324f, -0.001309f, -0.002146f, -0.001828f, +0.004281f, + -0.000346f, +0.000034f, +0.000747f, -0.002669f, +0.001506f, -0.002716f, -0.001018f, -0.002912f, -0.001650f, -0.000168f, + +0.000306f, +0.001532f, +0.001443f, +0.000653f, +0.000925f, -0.000154f, -0.001628f, -0.000667f, +0.000902f, -0.003612f, + -0.000050f, +0.001384f, -0.000284f, -0.000539f, +0.000477f, -0.000061f, +0.000615f, +0.000748f, +0.000526f, +0.002064f, + +0.000615f, -0.000598f, +0.001172f, -0.000239f, -0.000241f, +0.000249f, -0.000592f, +0.000152f, +0.000564f, +0.000111f, + +0.000214f, -0.000092f, +0.000372f, +0.000268f, +0.000287f, +0.000107f + }, + { + -0.042241f, -0.436374f, +0.027659f, +0.008785f, -0.000080f, -0.006487f, -0.005215f, -0.002738f, -0.002839f, +0.001590f, + -0.003028f, -0.011393f, -0.009796f, -0.006812f, +0.014291f, +0.003779f, -0.003741f, +0.005749f, +0.002916f, +0.000811f, + +0.008742f, +0.004397f, +0.000627f, +0.004238f, -0.000113f, -0.003208f, +0.000975f, -0.000098f, +0.001868f, -0.001946f, + +0.006146f, -0.008885f, +0.000319f, -0.004021f, +0.003605f, -0.007481f, +0.000870f, +0.002155f, -0.000885f, +0.002198f, + +0.011169f, -0.008538f, +0.003095f, +0.001031f, +0.001977f, -0.002961f, +0.001161f, -0.004068f, +0.001762f, -0.001971f, + -0.001003f, +0.001081f, -0.002661f, -0.001055f, +0.002691f, -0.000465f, +0.001111f, -0.003171f, -0.001792f, +0.000095f, + +0.000198f, +0.000943f, -0.000600f, +0.000812f, +0.000131f, +0.000025f, -0.000013f, -0.000362f, -0.000051f, -0.000345f, + -0.000580f, +0.000458f, -0.000700f, -0.000149f, -0.000039f, +0.000270f, +0.000040f, +0.000630f, -0.000046f, +0.000383f, + +0.000111f, +0.000202f, -0.000263f, -0.000058f, +0.000520f, +0.000638f, -0.000426f, +0.000818f, +0.000061f, +0.000260f, + +0.000011f, +0.000731f, -0.000071f, -0.000170f, -0.000013f, -0.000344f + }, + { + +0.000952f, -0.071240f, +0.003557f, +0.001730f, -0.007897f, +0.004935f, -0.002251f, -0.003998f, +0.001015f, -0.002779f, + +0.003797f, +0.000407f, +0.007207f, -0.007945f, -0.001474f, -0.011240f, -0.005780f, +0.003796f, +0.005036f, +0.005408f, + -0.009876f, +0.010854f, +0.004970f, -0.003002f, +0.001231f, +0.005347f, -0.007297f, -0.007374f, -0.005742f, -0.004836f, + +0.009995f, -0.006925f, -0.006883f, -0.004944f, -0.005616f, +0.002646f, +0.002411f, -0.000141f, +0.006528f, +0.000798f, + -0.000943f, +0.002138f, +0.000832f, +0.002361f, -0.001172f, +0.001662f, -0.002705f, -0.003641f, +0.000520f, -0.004050f, + +0.000583f, +0.000463f, -0.000173f, +0.001985f, +0.000531f, -0.001400f, -0.000157f, +0.001543f, -0.002217f, -0.003078f, + -0.000090f, +0.002044f, -0.000370f, -0.000523f, -0.000384f, +0.000391f, -0.001182f, +0.002214f, -0.000615f, -0.001020f, + -0.000235f, +0.000557f, -0.001411f, -0.000942f, -0.001615f, -0.000227f, -0.000755f, -0.000559f, -0.000169f, -0.001496f, + -0.000004f, +0.000472f, +0.000173f, +0.000145f, -0.000666f, +0.000251f, -0.000290f, +0.000150f, +0.000027f, -0.000235f, + -0.000170f, -0.000378f, +0.000315f, -0.000140f, +0.000176f, -0.000027f + }, + { + -0.034719f, -0.079898f, +0.022328f, -0.008715f, +0.015753f, +0.019444f, -0.019003f, -0.003972f, -0.005515f, +0.001698f, + -0.000893f, -0.007648f, -0.004428f, +0.004688f, -0.001585f, +0.000664f, -0.009239f, +0.005093f, -0.004499f, -0.013795f, + +0.004124f, +0.002639f, +0.002745f, -0.012634f, +0.011793f, -0.007117f, -0.000229f, -0.004668f, -0.001798f, -0.001527f, + +0.001062f, +0.001704f, +0.000807f, -0.001874f, +0.001584f, +0.003956f, +0.004126f, +0.000397f, -0.006092f, +0.002378f, + +0.000996f, +0.002978f, -0.001362f, -0.000078f, +0.000651f, +0.002686f, +0.001518f, -0.001006f, -0.002710f, -0.002183f, + +0.001170f, +0.001190f, +0.002030f, -0.001061f, -0.004253f, -0.001062f, -0.001780f, +0.000100f, +0.000213f, -0.000767f, + -0.000018f, +0.000745f, +0.000589f, -0.000670f, +0.000815f, -0.000537f, -0.000715f, +0.000340f, -0.000081f, +0.000924f, + +0.000343f, -0.000557f, -0.000493f, +0.000379f, -0.000342f, +0.000091f, +0.000808f, -0.000119f, -0.000996f, +0.000218f, + +0.000392f, +0.000103f, +0.000590f, -0.000162f, -0.000519f, +0.000094f, -0.000525f, -0.000172f, +0.000402f, -0.000730f, + -0.000095f, -0.000263f, +0.000004f, +0.000059f, +0.000031f, -0.000317f + }, + { + +0.002121f, -0.009481f, -0.006604f, -0.000478f, +0.004202f, +0.000678f, +0.001672f, -0.003570f, -0.002222f, -0.004922f, + -0.000119f, +0.000669f, -0.005998f, -0.041034f, -0.014784f, -0.003171f, -0.001614f, +0.003587f, +0.009061f, -0.000934f, + +0.001176f, -0.008801f, +0.014715f, -0.001486f, -0.015551f, +0.004263f, +0.002430f, +0.010619f, -0.002007f, +0.005285f, + +0.003461f, -0.007586f, +0.003227f, +0.002888f, -0.009063f, +0.001474f, -0.007875f, +0.000556f, -0.003233f, -0.002884f, + +0.000271f, +0.001834f, -0.001420f, -0.002181f, -0.002487f, +0.000406f, -0.000547f, -0.000991f, +0.000925f, -0.002646f, + -0.000879f, -0.001352f, +0.000764f, +0.001765f, -0.000124f, -0.003505f, +0.000539f, -0.001631f, -0.001198f, -0.000364f, + +0.000725f, -0.000535f, +0.000602f, -0.000827f, -0.000780f, +0.000806f, -0.000199f, -0.000780f, -0.000672f, +0.001187f, + -0.000301f, -0.000260f, +0.000668f, +0.000771f, +0.001150f, +0.000590f, -0.000251f, -0.000412f, +0.000434f, +0.000121f, + +0.000174f, +0.000373f, +0.000218f, -0.000353f, -0.000535f, +0.000062f, -0.000032f, -0.000577f, -0.000075f, +0.000262f, + -0.000196f, -0.000458f, -0.000006f, +0.000052f, +0.000005f, +0.000306f + }, + { + +0.045452f, -0.066326f, -0.021020f, +0.022840f, +0.015296f, +0.001738f, +0.010106f, -0.013649f, -0.004224f, +0.001450f, + +0.016675f, +0.007932f, +0.015803f, -0.014015f, +0.017796f, +0.002589f, -0.001163f, +0.001643f, +0.005280f, -0.006471f, + +0.003809f, -0.008118f, -0.004995f, -0.007521f, +0.000980f, -0.001712f, +0.004246f, +0.001797f, -0.003350f, +0.001625f, + -0.001608f, +0.005988f, -0.000563f, +0.004135f, -0.000000f, -0.002404f, -0.002304f, -0.005149f, -0.004154f, +0.002698f, + +0.002525f, -0.001363f, +0.001618f, -0.004665f, -0.008940f, -0.004717f, -0.000204f, +0.002330f, -0.001458f, -0.003755f, + -0.000575f, -0.000726f, -0.000318f, -0.000135f, +0.000261f, +0.001515f, -0.000396f, +0.004267f, +0.000983f, +0.001220f, + +0.001131f, -0.001670f, -0.000168f, +0.001900f, -0.000855f, -0.000118f, -0.001887f, -0.001324f, -0.000768f, -0.000484f, + +0.001232f, -0.000342f, +0.001865f, +0.001736f, -0.000486f, +0.000898f, +0.000198f, +0.000561f, -0.000393f, +0.000250f, + +0.000200f, -0.000039f, -0.000524f, +0.000253f, +0.000496f, +0.000420f, -0.000627f, +0.000133f, -0.000327f, +0.000194f, + +0.000179f, +0.000122f, +0.000378f, +0.000076f, -0.000071f, +0.000038f + }, + { + -0.002081f, -0.019097f, -0.003982f, -0.001758f, -0.000079f, +0.003703f, +0.003657f, +0.002975f, +0.000059f, +0.000799f, + +0.003821f, +0.006239f, +0.008531f, +0.023309f, +0.138036f, -0.010591f, +0.006264f, -0.012048f, +0.006724f, +0.003547f, + -0.006076f, +0.006961f, -0.006115f, -0.009284f, +0.003972f, +0.007419f, +0.006086f, -0.005478f, -0.012487f, +0.006666f, + -0.003325f, +0.007395f, -0.001004f, -0.001394f, -0.004963f, +0.003448f, +0.000730f, -0.007891f, +0.001015f, +0.007206f, + -0.003462f, +0.000013f, +0.003860f, -0.001220f, +0.000681f, -0.001670f, -0.001064f, -0.000359f, +0.002590f, -0.000576f, + -0.000561f, -0.001086f, +0.001645f, +0.000578f, +0.000882f, -0.001752f, -0.001335f, +0.000394f, -0.000979f, -0.000695f, + +0.000733f, +0.000261f, -0.000193f, +0.000333f, +0.000101f, -0.001289f, -0.001206f, -0.000364f, +0.000185f, -0.000093f, + -0.001122f, +0.000001f, +0.000199f, +0.000003f, -0.000030f, +0.000097f, +0.000359f, +0.000295f, +0.000349f, -0.000024f, + +0.000248f, -0.000369f, +0.000127f, -0.000202f, -0.000112f, +0.000204f, -0.000278f, +0.000107f, +0.000091f, -0.000146f, + +0.000264f, +0.000132f, +0.000156f, -0.000128f, +0.000088f, -0.000296f + }, + { + +0.040554f, +0.006683f, +0.014598f, -0.001815f, +0.001398f, +0.005257f, +0.003183f, +0.016280f, -0.003777f, +0.010866f, + +0.003054f, +0.012655f, -0.003115f, -0.012924f, +0.078788f, +0.002497f, +0.013726f, -0.010536f, +0.001009f, +0.000452f, + +0.005328f, +0.002757f, +0.002181f, +0.002312f, -0.001388f, +0.002452f, +0.005520f, -0.013773f, +0.002629f, -0.003048f, + -0.006091f, +0.003033f, -0.001112f, +0.008445f, +0.001844f, +0.002691f, -0.008608f, -0.002380f, -0.001466f, -0.000436f, + +0.007432f, -0.000496f, -0.000093f, -0.005474f, +0.003027f, -0.001031f, -0.001563f, +0.000669f, +0.001233f, -0.000481f, + +0.001546f, +0.001978f, +0.001827f, +0.001279f, +0.003182f, -0.001106f, -0.003121f, +0.000280f, +0.000309f, -0.001809f, + -0.001366f, -0.001625f, -0.001054f, +0.000040f, +0.000848f, -0.001449f, -0.000310f, -0.000544f, +0.001806f, -0.000773f, + -0.000224f, -0.000347f, -0.000780f, +0.000159f, -0.000107f, +0.000383f, +0.001038f, -0.000163f, +0.000775f, -0.000723f, + +0.000056f, -0.000571f, +0.000797f, -0.000603f, -0.000936f, -0.000074f, +0.000351f, -0.000190f, -0.000185f, +0.000011f, + +0.000250f, +0.000082f, +0.000300f, +0.000231f, -0.000017f, -0.000225f + } + }, + { + { + +0.000472f, -0.041204f, +0.050237f, +0.007229f, -0.004853f, -0.000560f, +0.001478f, +0.001730f, -0.005379f, -0.001302f, + -0.001599f, +0.001792f, +0.006967f, +0.013582f, -0.018673f, +0.005840f, -0.014770f, -0.007372f, -0.009092f, +0.001702f, + -0.014378f, -0.007025f, -0.001472f, +0.007962f, +0.016797f, -0.006002f, -0.004495f, -0.007995f, -0.008516f, -0.017862f, + +0.009330f, -0.005625f, -0.003441f, +0.003125f, -0.001824f, -0.006478f, -0.002477f, +0.000646f, +0.006467f, -0.002875f, + +0.001950f, -0.000565f, -0.005298f, +0.001874f, -0.000518f, -0.001556f, +0.002220f, -0.001208f, +0.000935f, +0.000115f, + -0.001713f, -0.000298f, +0.001185f, -0.001832f, -0.000557f, -0.000990f, +0.001130f, -0.000470f, -0.000367f, -0.003322f, + +0.000655f, +0.000072f, +0.001231f, +0.000061f, -0.002325f, +0.001010f, -0.000798f, -0.000181f, +0.001517f, +0.001122f, + +0.000272f, +0.000153f, +0.000244f, -0.000188f, +0.000540f, +0.000528f, +0.000167f, +0.000587f, -0.000348f, -0.000321f, + +0.000572f, -0.000011f, +0.000525f, -0.000349f, +0.000567f, +0.000321f, +0.000515f, -0.000423f, -0.000376f, +0.000171f, + -0.000234f, -0.000343f, -0.000025f, -0.000140f, -0.000426f, +0.000109f + }, + { + -0.021043f, -0.240596f, +0.127411f, +0.006529f, -0.002458f, -0.000252f, +0.006146f, +0.004495f, +0.000925f, -0.005142f, + -0.000027f, -0.012487f, -0.001392f, -0.007984f, -0.000944f, +0.001334f, -0.005497f, -0.007861f, -0.005928f, -0.000524f, + -0.002138f, +0.011385f, -0.002972f, +0.004874f, -0.005259f, -0.005954f, +0.009808f, -0.002432f, -0.002088f, -0.001393f, + -0.001105f, -0.000722f, -0.003825f, +0.004663f, -0.006896f, +0.003276f, +0.000679f, +0.007509f, +0.002906f, +0.002975f, + +0.001338f, +0.003145f, -0.002914f, +0.005230f, +0.006264f, -0.001133f, -0.002193f, -0.000509f, +0.002199f, +0.001365f, + -0.001854f, -0.002678f, +0.002836f, -0.000322f, -0.001277f, +0.001079f, +0.002241f, -0.000868f, -0.003539f, +0.000535f, + -0.001225f, +0.000001f, +0.000695f, +0.001522f, -0.000293f, -0.002724f, -0.000256f, +0.000555f, -0.000143f, -0.001827f, + +0.000403f, -0.000681f, -0.000220f, +0.000004f, -0.000203f, +0.000451f, +0.000923f, -0.000653f, -0.000506f, +0.000076f, + +0.001005f, -0.000262f, -0.000040f, +0.000326f, +0.000569f, +0.000112f, -0.000185f, -0.000161f, -0.000463f, +0.000240f, + -0.000752f, +0.000273f, +0.000102f, +0.000215f, -0.000339f, +0.000021f + }, + { + +0.011175f, +0.106505f, -0.104212f, +0.000501f, +0.001959f, -0.010311f, -0.002755f, +0.002826f, +0.000836f, +0.003492f, + -0.002189f, -0.009658f, -0.016152f, +0.001873f, +0.004693f, +0.008890f, -0.002966f, -0.005513f, -0.010268f, -0.012300f, + -0.008293f, -0.017258f, -0.004064f, +0.011289f, -0.003006f, -0.000599f, -0.000110f, -0.006265f, -0.010785f, +0.005228f, + +0.007395f, +0.009195f, -0.005405f, +0.004428f, +0.003101f, +0.003052f, -0.000153f, +0.001693f, +0.009969f, -0.002989f, + +0.002167f, -0.000629f, -0.002480f, +0.007496f, -0.003238f, -0.002065f, +0.000254f, -0.001557f, -0.000199f, +0.002711f, + -0.000515f, -0.002268f, -0.002635f, -0.001997f, +0.000654f, +0.000707f, -0.003019f, -0.002042f, -0.000013f, -0.000112f, + +0.000027f, +0.000424f, +0.001041f, -0.001406f, +0.000535f, +0.000481f, -0.000469f, -0.000081f, +0.001385f, -0.000178f, + +0.001382f, -0.000004f, +0.001347f, +0.000297f, -0.001056f, -0.000854f, -0.000249f, -0.000327f, -0.000380f, +0.000356f, + -0.000056f, +0.000159f, -0.000681f, +0.000196f, +0.000680f, -0.000108f, -0.000144f, +0.000187f, +0.000139f, +0.000618f, + -0.000001f, -0.000356f, +0.000307f, -0.000041f, -0.000100f, +0.000215f + }, + { + -0.001879f, -0.020867f, +0.015677f, -0.004990f, +0.000117f, -0.000475f, -0.001451f, +0.001499f, -0.003190f, +0.002187f, + -0.004031f, +0.002430f, +0.001890f, -0.002597f, +0.026008f, +0.007173f, +0.002276f, -0.019258f, -0.029889f, -0.004009f, + -0.002156f, -0.018946f, -0.012098f, -0.010375f, -0.006517f, +0.006976f, +0.001040f, +0.006287f, -0.002247f, -0.002741f, + +0.000461f, -0.005738f, -0.002941f, +0.001638f, -0.006151f, +0.003933f, -0.001105f, +0.004286f, -0.005434f, -0.000463f, + +0.001543f, +0.002115f, -0.000893f, -0.000281f, +0.000534f, +0.000564f, -0.000836f, +0.000818f, +0.002768f, -0.000642f, + +0.003702f, -0.000014f, -0.002471f, -0.001233f, -0.001957f, +0.002309f, -0.000456f, -0.000491f, +0.000127f, +0.000126f, + +0.000581f, -0.000882f, -0.000410f, +0.000730f, +0.000076f, +0.000910f, -0.000002f, -0.000878f, +0.000046f, -0.000565f, + -0.000093f, -0.000895f, +0.000015f, -0.000010f, -0.000606f, -0.000794f, -0.000152f, +0.000329f, -0.000028f, -0.000810f, + -0.000559f, -0.000215f, +0.000435f, +0.000104f, +0.000206f, +0.000440f, -0.000606f, +0.000104f, +0.000083f, +0.000110f, + +0.000171f, +0.000012f, +0.000166f, +0.000355f, +0.000165f, -0.000053f + }, + { + +0.077480f, +0.072366f, -0.047084f, +0.017156f, +0.005841f, +0.001001f, -0.001494f, -0.003144f, -0.003707f, +0.005733f, + -0.002721f, -0.001895f, +0.005306f, +0.007312f, +0.019412f, +0.003350f, +0.009120f, +0.007586f, -0.016016f, -0.012842f, + -0.006487f, +0.003121f, -0.006972f, +0.000914f, +0.002193f, +0.002378f, -0.003374f, +0.002912f, -0.004927f, +0.001336f, + +0.005378f, -0.005443f, -0.006941f, -0.007537f, -0.000663f, +0.006323f, -0.003384f, +0.003315f, +0.003504f, -0.000640f, + +0.001151f, +0.003001f, -0.004735f, -0.001121f, +0.001546f, -0.000329f, -0.001712f, -0.001357f, +0.001822f, -0.001748f, + +0.002043f, +0.000409f, +0.002117f, +0.001077f, +0.000440f, +0.001170f, -0.000591f, -0.000252f, -0.002760f, -0.000296f, + +0.000635f, -0.001068f, -0.001355f, +0.001586f, -0.001401f, -0.000525f, +0.001052f, -0.001019f, +0.000267f, -0.000840f, + -0.000304f, +0.000774f, -0.001169f, -0.001119f, +0.000081f, +0.000992f, -0.000531f, +0.000909f, -0.000027f, +0.000192f, + -0.000351f, +0.001285f, +0.000237f, +0.000637f, -0.000655f, -0.000248f, +0.000159f, -0.000369f, +0.000143f, +0.000101f, + -0.000271f, -0.000010f, -0.000020f, +0.000008f, -0.000264f, +0.000435f + }, + { + -0.000202f, -0.009494f, -0.001819f, +0.002031f, +0.001605f, +0.000647f, +0.000930f, +0.002690f, +0.000048f, -0.001697f, + -0.001490f, -0.002313f, +0.001744f, -0.007617f, +0.007342f, -0.007434f, -0.000865f, -0.004525f, -0.004584f, -0.055361f, + -0.001727f, +0.010800f, -0.012965f, -0.005668f, +0.002365f, -0.011749f, -0.001736f, +0.006452f, -0.002503f, -0.010828f, + -0.001926f, +0.002045f, -0.002981f, -0.002154f, +0.004412f, +0.002345f, +0.003036f, +0.001133f, -0.006003f, -0.000889f, + +0.004752f, +0.000441f, -0.001279f, +0.000847f, -0.001478f, -0.000239f, -0.000909f, -0.003098f, +0.000839f, +0.001974f, + -0.000550f, +0.001718f, +0.002497f, -0.002488f, -0.001236f, +0.000598f, -0.000685f, +0.000453f, -0.000940f, +0.001883f, + +0.000744f, -0.000881f, -0.000127f, -0.000572f, +0.000473f, +0.000498f, +0.001289f, -0.001023f, +0.000535f, +0.000778f, + -0.000606f, +0.001089f, -0.000694f, +0.000086f, +0.000285f, +0.000374f, -0.000901f, +0.000583f, +0.000085f, +0.000667f, + -0.000554f, +0.000130f, +0.000211f, -0.000306f, -0.000116f, +0.000052f, -0.000556f, +0.000211f, +0.000626f, -0.000081f, + -0.000052f, -0.000009f, +0.000304f, +0.000190f, -0.000034f, -0.000590f + }, + { + +0.051213f, +0.491177f, +0.028651f, +0.021484f, +0.012504f, -0.003749f, +0.000541f, -0.000357f, +0.000843f, +0.000301f, + +0.008413f, -0.006350f, -0.004184f, +0.001520f, +0.006096f, -0.010248f, +0.001551f, -0.004024f, +0.001281f, -0.002842f, + +0.000895f, -0.000321f, -0.003332f, -0.006344f, -0.004054f, +0.001172f, -0.001247f, +0.002886f, +0.005478f, -0.004972f, + +0.002484f, -0.004326f, +0.001513f, -0.003977f, -0.003405f, -0.004211f, -0.003764f, +0.002916f, -0.003091f, +0.000279f, + +0.002991f, +0.000636f, -0.001124f, -0.001836f, +0.001825f, -0.001184f, +0.000855f, +0.002800f, +0.001320f, +0.003205f, + -0.000414f, -0.000214f, +0.000813f, -0.003149f, -0.001524f, +0.000725f, -0.000600f, -0.000343f, +0.000257f, -0.001788f, + +0.001402f, +0.001598f, -0.000705f, -0.000632f, +0.000106f, -0.001527f, +0.000433f, -0.000075f, +0.000779f, -0.000404f, + +0.000440f, +0.000015f, -0.000118f, +0.000397f, -0.000009f, +0.000215f, +0.000486f, +0.000154f, +0.000497f, -0.000070f, + +0.000812f, -0.000393f, -0.000811f, +0.000607f, +0.000189f, -0.000132f, -0.000268f, +0.000679f, +0.000424f, -0.000168f, + +0.000023f, +0.000430f, +0.000329f, +0.000225f, -0.000069f, +0.000426f + }, + { + -0.001941f, +0.020340f, -0.003242f, -0.000792f, +0.000949f, -0.000527f, -0.002130f, -0.001916f, -0.001677f, -0.002288f, + -0.002177f, -0.003788f, +0.005558f, +0.007913f, +0.043964f, +0.007501f, +0.023041f, +0.005668f, +0.007706f, +0.002435f, + +0.013734f, +0.004126f, +0.015311f, -0.004853f, -0.024007f, -0.001148f, -0.010414f, -0.000789f, -0.009161f, -0.002515f, + -0.005970f, +0.000343f, -0.004070f, -0.000190f, -0.000958f, -0.002763f, -0.002927f, +0.001538f, +0.001071f, +0.003194f, + -0.000067f, -0.003550f, +0.002756f, +0.003108f, -0.001172f, +0.000595f, -0.001325f, +0.000771f, -0.001736f, +0.002717f, + +0.000773f, +0.001251f, +0.000383f, -0.002266f, +0.001885f, -0.004222f, -0.001132f, -0.000625f, -0.000647f, -0.001673f, + -0.000212f, +0.002629f, +0.001989f, -0.000697f, +0.000800f, +0.001070f, -0.001340f, -0.000738f, +0.002232f, -0.001783f, + +0.000156f, +0.000100f, -0.000707f, -0.000320f, +0.000435f, +0.000061f, +0.000408f, -0.000347f, -0.000872f, +0.000664f, + -0.000234f, -0.000574f, +0.001199f, -0.000688f, -0.000244f, +0.000726f, -0.000439f, -0.000226f, -0.000018f, -0.000129f, + +0.000360f, -0.000266f, +0.000079f, -0.000081f, -0.000187f, -0.000302f + }, + { + +0.066323f, -0.343189f, -0.019325f, +0.009584f, +0.005697f, +0.000575f, +0.001609f, +0.002477f, -0.001987f, +0.001578f, + +0.004233f, -0.006969f, -0.001116f, -0.007521f, -0.001270f, -0.005127f, -0.006976f, +0.005054f, +0.011333f, -0.001124f, + -0.001432f, +0.000539f, +0.005732f, +0.005260f, -0.004438f, -0.002480f, +0.001109f, -0.001918f, -0.001040f, -0.007966f, + +0.009279f, -0.004405f, -0.002781f, -0.002247f, +0.002140f, -0.006419f, +0.004223f, +0.000120f, -0.001127f, +0.005464f, + +0.006820f, -0.010374f, +0.007101f, -0.000615f, +0.000379f, -0.001257f, +0.001144f, -0.001558f, +0.004689f, -0.002502f, + -0.002225f, -0.000721f, -0.003892f, +0.000339f, +0.004865f, -0.000084f, +0.001168f, -0.001647f, +0.001048f, +0.001155f, + +0.000306f, +0.000887f, +0.000980f, +0.001572f, +0.000315f, +0.000942f, +0.000279f, -0.000010f, +0.001046f, +0.000110f, + -0.000955f, +0.000694f, -0.000041f, +0.000221f, +0.000618f, +0.000749f, -0.000036f, +0.001305f, -0.000017f, -0.000180f, + -0.000026f, +0.000315f, -0.000644f, -0.000554f, -0.000257f, +0.000219f, -0.000394f, +0.000511f, +0.000067f, +0.000043f, + -0.000130f, +0.000569f, -0.000232f, -0.000356f, +0.000098f, -0.000011f + }, + { + -0.001723f, -0.046074f, +0.020307f, +0.006563f, -0.009929f, -0.001574f, -0.001351f, +0.002060f, +0.002784f, -0.005218f, + -0.006741f, -0.005014f, +0.000126f, -0.014888f, -0.005208f, -0.020545f, +0.002443f, +0.007223f, +0.007415f, +0.023182f, + -0.006428f, +0.006816f, -0.000651f, -0.007936f, +0.002089f, +0.003943f, -0.007537f, -0.005562f, +0.001941f, -0.006105f, + +0.011352f, -0.000089f, -0.000121f, -0.001925f, -0.005421f, +0.000163f, -0.002336f, -0.003005f, +0.000503f, -0.002677f, + -0.001968f, +0.002025f, +0.002119f, +0.002374f, -0.000584f, +0.002741f, -0.002030f, -0.002415f, +0.000800f, -0.005422f, + +0.001413f, +0.000473f, -0.002900f, +0.000260f, +0.000604f, -0.003679f, -0.003605f, -0.000553f, -0.001882f, -0.001619f, + +0.000722f, +0.002236f, +0.000058f, -0.000317f, +0.000298f, +0.000768f, -0.000841f, +0.001555f, -0.000737f, +0.000154f, + -0.000441f, +0.000731f, -0.000165f, +0.000494f, +0.000447f, +0.001129f, -0.000437f, -0.000422f, +0.000868f, -0.000254f, + -0.000278f, +0.000125f, +0.000463f, +0.000797f, -0.000100f, +0.000550f, +0.000150f, +0.000161f, +0.000280f, -0.000314f, + +0.000169f, -0.000248f, +0.000171f, -0.000059f, +0.000246f, -0.000125f + }, + { + +0.031005f, -0.097161f, -0.048984f, -0.009709f, -0.006890f, +0.012187f, -0.010318f, -0.011187f, -0.011012f, +0.004445f, + +0.005660f, -0.008245f, -0.009156f, +0.003334f, -0.008870f, -0.002597f, -0.018762f, +0.003164f, +0.011419f, -0.005749f, + +0.010004f, +0.003259f, +0.003962f, -0.011928f, +0.008376f, -0.005603f, +0.001939f, +0.000955f, -0.003162f, -0.005288f, + +0.000175f, +0.004600f, +0.007712f, +0.003369f, +0.002295f, +0.003535f, +0.002156f, +0.000245f, -0.004492f, +0.004103f, + +0.003223f, +0.003670f, -0.002950f, -0.001503f, -0.000471f, -0.000012f, -0.000438f, +0.001097f, +0.000557f, -0.004073f, + -0.000700f, +0.000603f, +0.000973f, +0.000104f, -0.000904f, +0.000968f, -0.000792f, +0.000168f, +0.000612f, +0.000184f, + +0.000763f, +0.000592f, -0.000081f, -0.001325f, +0.000361f, +0.000153f, -0.000568f, +0.001325f, +0.000008f, -0.000474f, + -0.000212f, +0.000274f, -0.000016f, +0.000393f, -0.000603f, -0.000638f, +0.000377f, -0.000311f, -0.000992f, +0.000020f, + -0.000010f, -0.000385f, +0.000295f, -0.000615f, -0.000335f, +0.000405f, +0.000148f, +0.000077f, +0.000543f, -0.000618f, + -0.000154f, -0.000262f, +0.000312f, +0.000311f, +0.000073f, -0.000214f + }, + { + -0.002145f, +0.006040f, -0.000087f, -0.009818f, -0.005125f, -0.001877f, +0.001621f, -0.001386f, -0.001524f, -0.002748f, + -0.000681f, -0.003391f, +0.021056f, +0.002722f, -0.005872f, -0.006373f, -0.009154f, +0.001159f, +0.011884f, -0.000788f, + -0.000567f, -0.012328f, +0.003880f, -0.012657f, -0.020312f, +0.008772f, +0.001241f, +0.000179f, -0.006462f, -0.000133f, + +0.003292f, -0.007025f, +0.002981f, +0.001347f, -0.005316f, +0.005371f, -0.001058f, +0.004532f, -0.001477f, -0.004287f, + +0.000346f, +0.004121f, +0.001591f, -0.000559f, -0.004146f, -0.000412f, +0.000310f, +0.000602f, +0.004442f, -0.001670f, + -0.001028f, -0.000018f, +0.000269f, -0.001061f, +0.000268f, +0.000196f, +0.003492f, +0.000288f, -0.001085f, -0.000559f, + +0.000774f, -0.000575f, +0.000389f, -0.001687f, -0.001622f, +0.000874f, +0.000465f, -0.000409f, -0.000434f, +0.000124f, + -0.000668f, -0.000406f, -0.000399f, -0.000276f, +0.001165f, +0.000478f, +0.000059f, -0.000345f, +0.000288f, +0.000199f, + -0.000158f, +0.000338f, -0.000215f, -0.000681f, -0.000338f, +0.000016f, +0.000347f, +0.000082f, +0.000216f, +0.000155f, + -0.000095f, -0.000036f, +0.000216f, +0.000048f, -0.000225f, +0.000131f + }, + { + -0.017931f, -0.133639f, -0.031316f, -0.000164f, +0.007766f, -0.002068f, +0.009774f, -0.018719f, +0.003009f, -0.003668f, + +0.003047f, +0.001188f, -0.014666f, -0.034599f, +0.015463f, -0.012433f, -0.013931f, -0.002949f, +0.011768f, -0.003132f, + +0.008034f, -0.004953f, +0.005348f, -0.000434f, +0.002408f, -0.003780f, -0.002785f, -0.002781f, -0.005575f, +0.000720f, + -0.003366f, +0.006124f, -0.003953f, +0.003366f, +0.002187f, -0.004671f, +0.002136f, +0.000020f, -0.004253f, +0.000243f, + -0.000151f, -0.001562f, +0.003726f, +0.005330f, -0.003328f, +0.000649f, +0.003124f, +0.001362f, -0.002662f, -0.001906f, + +0.001923f, -0.001356f, +0.001849f, +0.002960f, -0.000617f, +0.000173f, -0.001765f, +0.003660f, +0.000643f, -0.003193f, + -0.001276f, -0.000446f, +0.000433f, +0.002136f, -0.000020f, +0.001336f, -0.000247f, -0.000877f, -0.001559f, -0.001095f, + +0.000353f, -0.001554f, +0.000011f, +0.000519f, -0.000449f, +0.000113f, +0.000090f, +0.000717f, -0.000893f, -0.000642f, + +0.000259f, +0.000520f, -0.000521f, -0.000157f, +0.000384f, +0.001137f, +0.000016f, +0.000536f, +0.000188f, -0.000118f, + +0.000020f, +0.000059f, +0.000291f, +0.000399f, +0.000013f, +0.000157f + }, + { + +0.001561f, -0.011143f, -0.001273f, +0.003758f, -0.000429f, +0.002291f, +0.005099f, -0.002763f, -0.004450f, -0.000880f, + +0.001490f, +0.005217f, -0.003233f, -0.082635f, +0.030048f, -0.016539f, -0.009484f, -0.013562f, +0.007524f, +0.014482f, + +0.001459f, +0.004427f, -0.007117f, +0.003917f, +0.007319f, -0.001195f, +0.008630f, -0.007752f, -0.013728f, +0.009729f, + -0.003307f, +0.001448f, -0.007282f, -0.003872f, +0.000030f, +0.009137f, +0.004621f, -0.001333f, +0.000029f, +0.004260f, + -0.001620f, -0.000335f, -0.000450f, -0.002612f, +0.002907f, -0.000472f, -0.000387f, -0.001086f, +0.002283f, -0.000363f, + -0.000797f, -0.002040f, -0.000437f, +0.000029f, +0.000630f, +0.000361f, -0.000325f, +0.000769f, +0.000253f, -0.000361f, + +0.001644f, +0.000230f, -0.000328f, +0.000298f, +0.000147f, -0.001193f, -0.001577f, +0.000155f, +0.000024f, -0.001123f, + -0.000814f, -0.000256f, -0.000131f, +0.000213f, -0.000084f, +0.000108f, +0.000152f, -0.000347f, +0.000608f, +0.000507f, + +0.000568f, +0.000532f, +0.000387f, -0.000312f, -0.000329f, +0.000051f, -0.000022f, +0.000222f, +0.000661f, -0.000116f, + +0.000231f, +0.000109f, +0.000316f, -0.000068f, +0.000153f, +0.000056f + }, + { + -0.032649f, -0.095281f, -0.001887f, -0.008593f, +0.004775f, -0.008427f, -0.010824f, +0.011134f, -0.000985f, +0.010387f, + +0.000622f, +0.001383f, -0.013808f, -0.003778f, +0.082778f, -0.019173f, -0.010482f, -0.015793f, +0.002157f, -0.000718f, + -0.000234f, -0.003300f, -0.002808f, +0.001459f, +0.002332f, +0.004319f, +0.004830f, -0.017418f, -0.001173f, -0.001113f, + -0.006585f, +0.004807f, -0.001698f, +0.002457f, +0.001197f, +0.006702f, -0.000807f, +0.002094f, +0.001724f, -0.001826f, + +0.004756f, +0.003418f, +0.003061f, -0.004429f, +0.001738f, +0.001442f, +0.000618f, -0.001414f, -0.001284f, -0.000497f, + +0.000627f, -0.001222f, -0.001258f, -0.001582f, +0.000632f, -0.001510f, -0.001549f, -0.000061f, -0.000389f, -0.000476f, + +0.001134f, -0.000877f, -0.002120f, -0.001256f, +0.000632f, -0.001233f, +0.000005f, -0.000645f, +0.002318f, -0.000149f, + +0.000791f, +0.000827f, -0.000791f, -0.000219f, -0.000018f, +0.000344f, +0.000636f, -0.000553f, +0.000821f, -0.000420f, + +0.000107f, -0.000741f, +0.000849f, -0.000074f, -0.000595f, -0.000291f, +0.000222f, -0.000149f, +0.000280f, +0.000147f, + +0.000254f, -0.000111f, -0.000092f, -0.000101f, -0.000063f, +0.000208f + } + }, + { + { + +0.000593f, +0.084231f, -0.053294f, +0.001581f, +0.007484f, -0.004204f, -0.000262f, +0.000044f, -0.000071f, -0.003392f, + -0.003616f, +0.000020f, +0.013649f, +0.008505f, -0.022297f, -0.002198f, -0.000616f, -0.005944f, -0.019357f, -0.010886f, + +0.003611f, -0.015454f, -0.000719f, +0.013053f, +0.007265f, +0.006417f, -0.007186f, -0.012964f, -0.003484f, -0.015635f, + +0.008480f, -0.008444f, -0.006836f, -0.005433f, +0.000620f, -0.002019f, -0.001303f, +0.004109f, +0.002972f, +0.001043f, + -0.000780f, -0.001254f, -0.000567f, -0.000494f, -0.003751f, +0.000704f, +0.002248f, +0.000388f, -0.003691f, +0.001515f, + -0.000378f, -0.000906f, -0.000028f, -0.000076f, -0.002943f, +0.000659f, -0.000535f, +0.001795f, -0.001099f, -0.001990f, + +0.001572f, -0.001350f, +0.001067f, +0.000185f, -0.001913f, -0.000047f, +0.000451f, -0.000116f, +0.000764f, +0.001200f, + +0.000289f, -0.000191f, +0.000225f, +0.000781f, -0.000055f, +0.000208f, +0.000823f, -0.000769f, -0.000174f, -0.000015f, + +0.000036f, +0.000502f, +0.000085f, -0.000446f, +0.000466f, +0.000105f, +0.000353f, -0.000329f, +0.000279f, +0.000221f, + -0.000625f, -0.000394f, -0.000328f, -0.000025f, -0.000084f, +0.000078f + }, + { + +0.026883f, -0.034828f, -0.089426f, +0.014128f, +0.000231f, +0.005435f, +0.002931f, -0.000456f, +0.008574f, -0.001517f, + +0.000505f, -0.012381f, -0.001195f, -0.001077f, -0.012698f, -0.002994f, +0.017595f, +0.004403f, -0.028982f, +0.006921f, + -0.005716f, +0.002127f, +0.006807f, +0.000800f, +0.000366f, -0.007945f, +0.004665f, +0.001729f, -0.002407f, -0.001692f, + +0.000718f, -0.000767f, -0.000316f, -0.004788f, +0.003656f, -0.000952f, +0.001673f, +0.004858f, +0.004527f, +0.000552f, + +0.001298f, +0.005444f, -0.000535f, +0.003727f, +0.003995f, -0.000746f, +0.000410f, -0.001280f, +0.002158f, -0.000468f, + -0.002857f, -0.000152f, +0.000122f, +0.000219f, +0.001213f, -0.001205f, +0.000922f, -0.001473f, -0.001044f, +0.000003f, + -0.000599f, -0.000032f, -0.000100f, +0.000685f, -0.000668f, -0.000752f, +0.000094f, -0.000754f, -0.000038f, -0.001039f, + -0.000004f, -0.001209f, -0.000092f, +0.000054f, +0.000309f, +0.000400f, +0.000603f, -0.000327f, -0.000369f, -0.000430f, + +0.000965f, -0.000247f, +0.000505f, +0.000066f, +0.000241f, +0.000331f, +0.000013f, -0.000102f, -0.000008f, -0.000256f, + -0.000305f, -0.000319f, -0.000196f, +0.000316f, -0.000053f, +0.000117f + }, + { + -0.010615f, -0.091554f, +0.062404f, +0.006429f, -0.007969f, -0.011554f, -0.005330f, -0.000876f, +0.003278f, +0.005060f, + -0.007766f, -0.001842f, -0.016706f, +0.004418f, +0.017004f, -0.004281f, +0.000738f, +0.002716f, -0.014746f, -0.017332f, + -0.010885f, -0.012466f, -0.000244f, +0.002550f, +0.001636f, -0.003270f, -0.000339f, -0.011136f, +0.001474f, +0.007772f, + +0.003884f, +0.001613f, -0.000094f, +0.000681f, +0.006651f, +0.007753f, -0.006134f, +0.001589f, +0.008681f, -0.001526f, + +0.004055f, -0.003201f, +0.002651f, +0.004384f, -0.001264f, -0.004968f, +0.000298f, -0.002580f, +0.002149f, +0.002847f, + -0.001568f, -0.002767f, -0.002846f, -0.002313f, +0.002008f, +0.000890f, -0.004827f, -0.001003f, -0.001242f, -0.000936f, + +0.001212f, +0.000161f, +0.000382f, -0.001378f, -0.000822f, +0.002014f, -0.001454f, +0.000614f, +0.000969f, +0.000097f, + +0.001657f, -0.000031f, +0.000052f, +0.000998f, -0.000684f, -0.001263f, +0.000135f, -0.000567f, -0.000764f, +0.000509f, + +0.000479f, -0.000522f, -0.000154f, +0.000187f, +0.000686f, -0.000139f, +0.000012f, -0.000062f, +0.000463f, +0.000344f, + +0.000113f, -0.000179f, -0.000036f, -0.000128f, +0.000119f, +0.000059f + }, + { + +0.002509f, +0.010150f, -0.010989f, -0.002891f, -0.000552f, +0.000137f, -0.002089f, -0.000992f, +0.000008f, +0.000852f, + -0.001187f, -0.000416f, +0.002968f, -0.004749f, +0.021559f, +0.011873f, +0.004243f, -0.022639f, -0.024782f, +0.002144f, + -0.004213f, -0.014451f, -0.013214f, -0.008720f, -0.007790f, +0.004699f, +0.003954f, +0.003687f, -0.002473f, -0.003090f, + +0.000494f, -0.007797f, -0.000038f, -0.001592f, -0.000564f, +0.001662f, -0.001525f, +0.005352f, -0.003980f, -0.000215f, + -0.000597f, +0.001750f, -0.003028f, +0.001507f, +0.002837f, +0.000078f, -0.003531f, +0.001280f, +0.003666f, +0.000941f, + +0.001880f, +0.000171f, -0.002271f, -0.000657f, -0.001122f, +0.000243f, +0.000274f, -0.000624f, -0.001129f, +0.002017f, + +0.000107f, +0.000185f, +0.000093f, +0.000066f, +0.000338f, +0.000048f, +0.000928f, -0.000501f, -0.000350f, -0.000459f, + +0.000188f, -0.001453f, +0.000653f, +0.000011f, -0.000780f, -0.000117f, -0.000535f, -0.000007f, -0.000257f, -0.000267f, + -0.000598f, -0.000448f, +0.000754f, +0.000073f, +0.000391f, -0.000007f, -0.000122f, +0.000220f, -0.000357f, +0.000278f, + -0.000048f, +0.000103f, +0.000118f, +0.000085f, +0.000163f, -0.000077f + }, + { + -0.059984f, +0.204113f, -0.012400f, +0.011302f, +0.013158f, -0.001521f, +0.001310f, -0.003157f, -0.005260f, +0.009593f, + -0.006612f, -0.003449f, +0.002197f, +0.006711f, +0.029124f, -0.000296f, -0.000007f, +0.008095f, -0.004592f, -0.021672f, + +0.001062f, -0.004293f, -0.003176f, +0.000123f, +0.009967f, -0.007019f, +0.000663f, -0.007448f, +0.010820f, -0.001108f, + +0.001651f, -0.000884f, -0.007909f, -0.004991f, -0.001502f, +0.000869f, +0.017605f, -0.007822f, +0.003052f, -0.001516f, + +0.003674f, +0.001878f, -0.004422f, -0.000239f, -0.000618f, -0.001164f, -0.003856f, +0.000294f, -0.001348f, -0.000571f, + +0.001845f, +0.001166f, +0.001911f, +0.000552f, +0.001295f, +0.000260f, -0.000130f, -0.002883f, -0.000712f, +0.000604f, + -0.000943f, +0.000032f, -0.001564f, -0.000291f, +0.000669f, -0.001145f, +0.000766f, -0.000090f, -0.000055f, -0.001063f, + -0.001032f, +0.000604f, -0.000451f, -0.000574f, -0.000215f, +0.000387f, +0.000699f, +0.000831f, -0.000462f, +0.000330f, + -0.000210f, +0.000542f, +0.000599f, +0.000230f, -0.000220f, -0.000238f, -0.000222f, +0.000248f, -0.000186f, +0.000176f, + -0.000227f, +0.000298f, -0.000206f, +0.000326f, -0.000434f, +0.000333f + }, + { + +0.000234f, -0.008162f, -0.006993f, +0.003569f, +0.002078f, +0.000477f, +0.000474f, +0.000923f, -0.001771f, +0.001473f, + -0.003111f, -0.000675f, -0.003879f, -0.004859f, +0.016171f, -0.002242f, -0.001989f, -0.010848f, -0.004897f, -0.050706f, + -0.006104f, +0.010052f, -0.003985f, -0.015313f, +0.008083f, -0.013691f, -0.006647f, +0.005506f, -0.005966f, +0.002937f, + -0.005805f, -0.003828f, +0.000835f, -0.001910f, +0.006735f, -0.000217f, +0.000978f, +0.000652f, -0.002359f, +0.001291f, + +0.002801f, -0.003242f, +0.000926f, -0.001213f, -0.001294f, -0.000213f, +0.000476f, -0.001656f, -0.001357f, +0.001090f, + +0.001133f, +0.002427f, +0.000896f, -0.001398f, +0.000635f, -0.002283f, +0.000811f, +0.000281f, -0.000467f, +0.000474f, + +0.000681f, -0.001051f, -0.000879f, +0.001448f, -0.000656f, +0.001553f, +0.000036f, +0.000615f, +0.000472f, +0.000728f, + -0.000288f, +0.000543f, -0.000448f, -0.000034f, +0.000097f, +0.000114f, -0.001248f, -0.000107f, +0.000865f, +0.000038f, + -0.000473f, +0.000277f, +0.000478f, -0.000288f, -0.000497f, -0.000219f, +0.000197f, -0.000189f, +0.000715f, -0.000363f, + +0.000386f, -0.000098f, +0.000230f, +0.000242f, -0.000202f, -0.000346f + }, + { + -0.008024f, +0.642203f, -0.020992f, +0.032725f, +0.004047f, -0.002292f, +0.000103f, -0.000865f, -0.004480f, +0.006810f, + +0.007947f, +0.000581f, -0.006218f, +0.000009f, +0.006546f, -0.014948f, +0.001243f, -0.000948f, -0.002535f, +0.000396f, + +0.001413f, +0.001455f, -0.003501f, -0.005658f, -0.003775f, -0.002560f, -0.003794f, +0.003899f, +0.002980f, +0.000266f, + +0.004447f, -0.003586f, -0.002492f, -0.006793f, -0.003538f, -0.004230f, -0.004110f, +0.003510f, -0.000966f, +0.000438f, + -0.000263f, +0.001944f, +0.000129f, -0.000366f, +0.002325f, -0.005307f, +0.004085f, +0.000389f, +0.003356f, +0.001544f, + -0.002551f, +0.002424f, -0.000863f, +0.000371f, -0.001926f, +0.000989f, -0.000814f, -0.000973f, +0.001231f, -0.001464f, + +0.000995f, +0.000713f, -0.000365f, -0.000273f, -0.000259f, -0.001561f, +0.000248f, -0.000164f, +0.001027f, -0.000425f, + -0.000412f, +0.000807f, +0.000017f, -0.000155f, +0.000651f, +0.000134f, +0.000253f, +0.000595f, -0.000208f, +0.000142f, + +0.000914f, -0.000459f, -0.000630f, -0.000070f, +0.000180f, +0.000066f, -0.000009f, +0.000181f, +0.000398f, +0.000403f, + -0.000166f, +0.000555f, +0.000238f, +0.000318f, +0.000141f, -0.000028f + }, + { + +0.001054f, -0.013126f, +0.016849f, +0.001318f, +0.001036f, -0.000545f, -0.001942f, -0.001854f, -0.002852f, -0.000525f, + -0.001324f, +0.000958f, +0.003904f, +0.004682f, +0.058722f, +0.021525f, +0.005662f, +0.004556f, +0.013449f, -0.012623f, + +0.014984f, +0.021685f, +0.000240f, +0.004919f, -0.020115f, -0.001254f, -0.003306f, -0.006154f, -0.003594f, -0.011510f, + +0.001743f, -0.002345f, -0.007781f, +0.003527f, -0.000119f, -0.002776f, -0.005102f, -0.000229f, +0.003443f, +0.001635f, + +0.001421f, -0.001674f, +0.001251f, +0.001570f, +0.000842f, +0.000497f, -0.000257f, +0.000012f, -0.000881f, +0.001414f, + +0.001429f, -0.000937f, +0.002790f, -0.000503f, -0.000944f, -0.001745f, -0.002870f, +0.000397f, -0.000884f, -0.001452f, + +0.002311f, +0.000375f, +0.001249f, -0.000846f, +0.000182f, +0.000692f, -0.000129f, +0.000340f, -0.000351f, +0.000855f, + -0.000219f, -0.001669f, +0.000031f, -0.000195f, +0.000128f, +0.000332f, +0.000656f, -0.001173f, -0.000254f, +0.000114f, + -0.000960f, +0.000430f, -0.000022f, +0.000190f, -0.000092f, +0.000155f, +0.000149f, -0.000277f, -0.000484f, -0.000127f, + +0.000338f, -0.000140f, -0.000170f, -0.000050f, -0.000274f, -0.000387f + }, + { + -0.075424f, -0.242926f, +0.042822f, +0.022396f, -0.003771f, +0.001100f, +0.000014f, +0.001938f, +0.000552f, -0.001004f, + +0.000776f, +0.004003f, +0.001355f, -0.005036f, -0.011066f, -0.002798f, +0.003770f, -0.003855f, +0.005145f, +0.001278f, + -0.001826f, -0.000936f, +0.007375f, +0.000566f, -0.001241f, -0.002734f, -0.000490f, -0.001962f, -0.002678f, -0.003035f, + +0.004396f, -0.000846f, -0.006431f, +0.001107f, -0.001924f, +0.002795f, +0.000138f, +0.000313f, -0.000064f, +0.004685f, + +0.000162f, -0.002142f, +0.002121f, +0.001687f, -0.001838f, -0.000283f, +0.000093f, +0.000049f, +0.000934f, -0.000101f, + -0.001193f, -0.002514f, -0.001819f, +0.000253f, +0.003457f, +0.000328f, +0.000356f, +0.000204f, +0.001824f, +0.000362f, + +0.001003f, -0.000274f, +0.001314f, +0.001127f, +0.000694f, +0.001375f, -0.000671f, -0.000028f, +0.000600f, +0.000247f, + +0.000026f, +0.000131f, +0.000192f, +0.000128f, +0.000487f, -0.000327f, +0.000979f, +0.000954f, -0.000131f, +0.000041f, + -0.000006f, +0.000246f, -0.000807f, -0.000222f, -0.000251f, +0.000196f, +0.000212f, -0.000142f, -0.000021f, +0.000042f, + -0.000022f, +0.000191f, -0.000038f, -0.000212f, -0.000120f, +0.000105f + }, + { + +0.002567f, -0.004071f, -0.014011f, -0.001073f, -0.000770f, -0.000590f, -0.011876f, +0.005905f, +0.002639f, -0.003739f, + -0.010829f, -0.005055f, +0.001017f, -0.016653f, -0.010971f, -0.010559f, +0.011401f, -0.001513f, +0.007623f, +0.020755f, + +0.003393f, -0.002410f, +0.008982f, -0.011446f, +0.001406f, -0.004369f, -0.000532f, -0.006301f, +0.007008f, -0.000433f, + -0.001349f, +0.002647f, +0.003808f, -0.003141f, -0.005314f, +0.001365f, -0.001110f, -0.005695f, -0.000687f, -0.001270f, + -0.002132f, +0.000204f, +0.001489f, +0.003404f, +0.002347f, +0.000289f, -0.001385f, -0.001757f, +0.000308f, -0.003418f, + -0.000910f, +0.000117f, -0.001727f, +0.000397f, -0.001050f, -0.001439f, -0.003242f, -0.001729f, -0.001626f, -0.000128f, + +0.000612f, +0.001014f, +0.001046f, -0.000982f, +0.001374f, +0.000465f, -0.000501f, +0.000343f, -0.000845f, +0.000762f, + -0.000555f, +0.000002f, +0.000706f, +0.000636f, +0.000668f, +0.000715f, +0.000130f, -0.000359f, +0.000578f, +0.000996f, + -0.000473f, -0.000276f, +0.000561f, +0.000383f, +0.000260f, -0.000163f, +0.000383f, +0.000395f, +0.000322f, -0.000146f, + +0.000040f, -0.000198f, -0.000101f, +0.000215f, -0.000079f, +0.000043f + }, + { + -0.028175f, -0.134172f, +0.034378f, -0.001967f, -0.006443f, -0.010941f, -0.002826f, +0.001689f, -0.012139f, +0.004470f, + +0.011134f, -0.011091f, -0.004929f, +0.001464f, -0.015516f, +0.003677f, -0.013003f, +0.003442f, +0.005800f, -0.003473f, + +0.007781f, +0.002291f, +0.000656f, -0.004065f, -0.003211f, +0.002244f, -0.001478f, +0.006548f, -0.000860f, -0.005789f, + -0.005440f, -0.001696f, +0.014270f, +0.007215f, -0.000597f, +0.003269f, +0.005710f, +0.000411f, -0.004178f, +0.003827f, + +0.002489f, -0.000845f, -0.001800f, -0.000162f, -0.002136f, -0.000026f, +0.000600f, -0.000589f, +0.001167f, -0.003363f, + -0.001287f, +0.000618f, +0.001724f, -0.001086f, +0.000669f, -0.000217f, +0.001882f, -0.001655f, +0.001493f, -0.000537f, + +0.000682f, +0.000934f, -0.000380f, +0.000115f, -0.000890f, +0.000401f, -0.000366f, +0.001045f, +0.000129f, -0.000535f, + -0.000344f, +0.000167f, +0.000178f, +0.000354f, -0.000665f, -0.000332f, -0.000419f, -0.000220f, -0.000103f, -0.000600f, + +0.000170f, -0.000571f, -0.000187f, -0.000277f, +0.000199f, +0.000031f, +0.000195f, +0.000376f, -0.000152f, -0.000278f, + -0.000358f, +0.000134f, +0.000310f, +0.000130f, +0.000015f, -0.000164f + }, + { + +0.001824f, +0.020132f, -0.020902f, -0.007801f, +0.000270f, -0.001723f, -0.000754f, +0.002884f, -0.004088f, -0.001350f, + -0.001322f, -0.006595f, -0.005515f, +0.043773f, -0.005020f, +0.003941f, -0.010496f, -0.001499f, +0.004127f, +0.010654f, + -0.020187f, +0.005154f, -0.001990f, -0.009749f, -0.008830f, -0.005417f, +0.009779f, -0.007426f, -0.000046f, -0.004495f, + +0.001448f, -0.002959f, +0.005791f, -0.000748f, -0.000778f, +0.001360f, -0.001000f, +0.001400f, +0.000804f, -0.004211f, + -0.000908f, +0.002374f, +0.002280f, +0.000419f, -0.003519f, -0.000718f, -0.000870f, +0.003233f, +0.003237f, -0.000520f, + -0.001267f, +0.000755f, -0.000129f, -0.002339f, +0.000445f, +0.000725f, +0.002257f, +0.001695f, +0.001342f, +0.000125f, + +0.000730f, -0.002164f, -0.000054f, -0.000839f, -0.001319f, +0.000271f, +0.000859f, -0.000325f, +0.000054f, -0.000589f, + +0.000063f, -0.000432f, -0.001143f, +0.000156f, +0.000706f, -0.000028f, +0.000292f, -0.000396f, +0.000229f, +0.000226f, + -0.000015f, -0.000302f, -0.000203f, -0.000293f, +0.000025f, -0.000014f, +0.000109f, +0.000275f, +0.000325f, +0.000122f, + -0.000078f, +0.000027f, +0.000228f, -0.000185f, +0.000033f, -0.000095f + }, + { + -0.005845f, -0.148771f, -0.021341f, -0.015773f, +0.019185f, -0.005678f, -0.008865f, -0.007560f, +0.000673f, +0.000077f, + -0.010134f, +0.006707f, -0.013035f, -0.037889f, +0.012761f, -0.013231f, -0.002343f, -0.003379f, +0.004366f, -0.000229f, + -0.000889f, +0.003633f, +0.006029f, +0.003300f, -0.001585f, -0.005777f, -0.004860f, -0.002267f, -0.003384f, -0.001602f, + +0.002024f, -0.000005f, -0.005186f, +0.000951f, +0.003427f, -0.005480f, +0.005372f, -0.000716f, -0.002443f, -0.002652f, + +0.000616f, +0.004402f, +0.001903f, +0.002569f, +0.001223f, +0.003329f, +0.002549f, -0.001405f, -0.000254f, +0.000022f, + +0.001003f, -0.001899f, -0.000480f, +0.002321f, -0.000165f, -0.000661f, -0.000190f, +0.002416f, -0.000524f, -0.002645f, + -0.002420f, +0.000922f, +0.000309f, +0.001813f, +0.000502f, +0.001861f, -0.000645f, -0.001012f, -0.001407f, -0.000811f, + -0.000014f, -0.000527f, -0.001148f, -0.000614f, +0.000593f, -0.000165f, -0.000316f, +0.000971f, -0.001181f, -0.000319f, + +0.000050f, +0.000195f, -0.000545f, +0.000172f, +0.000230f, +0.000722f, +0.000647f, +0.000440f, +0.000505f, -0.000013f, + -0.000096f, -0.000029f, +0.000179f, +0.000170f, +0.000138f, +0.000005f + }, + { + -0.000784f, -0.002350f, -0.001455f, +0.000129f, -0.000885f, +0.000799f, +0.003285f, -0.002654f, -0.004645f, +0.000025f, + -0.000316f, +0.001702f, -0.004388f, +0.009197f, -0.080829f, -0.025914f, -0.007539f, -0.003520f, -0.000841f, +0.014910f, + +0.006084f, -0.004262f, -0.005613f, +0.010508f, -0.001344f, -0.000260f, -0.001492f, -0.002565f, -0.002777f, +0.002736f, + -0.000166f, -0.007628f, -0.001749f, -0.005372f, +0.000383f, +0.012422f, +0.001660f, -0.000715f, +0.002502f, -0.002489f, + +0.004948f, +0.000725f, -0.004519f, +0.000938f, +0.001152f, -0.002587f, +0.000944f, -0.001196f, +0.004446f, -0.000856f, + -0.002286f, -0.001503f, -0.000805f, +0.001094f, -0.001993f, +0.002415f, -0.000078f, -0.000492f, +0.001139f, -0.000176f, + +0.000611f, +0.000012f, +0.000474f, -0.001241f, +0.000751f, -0.001103f, -0.001263f, +0.000341f, +0.000793f, -0.001002f, + -0.001341f, -0.000478f, +0.000357f, -0.000724f, +0.000142f, +0.000068f, +0.000233f, -0.000095f, +0.000527f, +0.000647f, + +0.000323f, +0.000704f, -0.000148f, +0.000110f, -0.000420f, -0.000233f, +0.000437f, +0.000174f, +0.000640f, -0.000053f, + +0.000159f, +0.000208f, +0.000132f, +0.000053f, +0.000054f, +0.000015f + }, + { + +0.014671f, -0.143561f, -0.018234f, -0.011926f, +0.006329f, -0.005994f, -0.014314f, +0.005019f, +0.002960f, +0.010086f, + +0.003362f, -0.010671f, -0.002680f, +0.032153f, +0.037607f, -0.016831f, -0.018322f, -0.013234f, +0.000608f, -0.001601f, + +0.002135f, -0.008221f, -0.004466f, +0.000541f, -0.001385f, +0.006772f, +0.001064f, -0.004139f, -0.013932f, +0.004111f, + -0.002566f, +0.002967f, +0.001168f, -0.004729f, +0.005324f, +0.000408f, +0.003965f, +0.004116f, -0.001698f, +0.001133f, + +0.001353f, +0.006408f, +0.000087f, -0.001099f, +0.000132f, -0.000340f, +0.000772f, +0.001517f, -0.002806f, -0.000553f, + -0.000406f, +0.001129f, -0.001917f, -0.002469f, +0.001276f, -0.001415f, +0.000148f, -0.001957f, -0.001024f, +0.001486f, + -0.000124f, -0.000144f, -0.001022f, -0.000915f, -0.000633f, -0.001513f, +0.001329f, +0.000448f, +0.000116f, +0.000733f, + +0.000589f, +0.000114f, +0.000504f, -0.000779f, -0.000130f, +0.000664f, +0.000051f, +0.000256f, +0.000110f, -0.000010f, + -0.000643f, -0.000034f, +0.000028f, +0.000364f, -0.000299f, -0.000376f, -0.000110f, -0.000257f, +0.000277f, +0.000194f, + +0.000107f, +0.000057f, +0.000049f, -0.000348f, -0.000209f, +0.000252f + } + }, + { + { + -0.002922f, +0.130487f, -0.023142f, -0.014260f, +0.001688f, -0.000628f, +0.000722f, +0.000599f, -0.000057f, +0.000014f, + -0.000423f, -0.007433f, +0.004892f, -0.007524f, -0.029235f, +0.002683f, +0.008845f, +0.006597f, -0.012258f, -0.022835f, + +0.002571f, -0.005102f, +0.002470f, +0.006105f, -0.000546f, -0.000325f, -0.005843f, +0.000647f, +0.006166f, -0.009669f, + +0.007102f, -0.001139f, -0.001717f, -0.009223f, +0.001814f, -0.000212f, +0.000927f, -0.000546f, -0.003982f, +0.003457f, + -0.001127f, -0.003299f, +0.000261f, +0.000388f, -0.002589f, -0.000540f, -0.000709f, +0.000733f, -0.001853f, +0.001706f, + +0.000023f, -0.000948f, -0.000505f, +0.000960f, -0.001940f, +0.000533f, -0.001046f, -0.000209f, -0.000340f, +0.001357f, + +0.001621f, -0.002199f, +0.000682f, +0.000413f, -0.000775f, +0.000045f, +0.000377f, +0.000554f, +0.000745f, +0.000123f, + -0.000531f, -0.000037f, +0.000236f, +0.000663f, -0.000175f, -0.000237f, +0.000538f, +0.000077f, +0.000069f, -0.000461f, + -0.000324f, +0.000331f, -0.000030f, -0.000519f, -0.000055f, -0.000136f, +0.000366f, -0.000144f, +0.000462f, +0.000181f, + -0.000145f, -0.000047f, -0.000339f, +0.000045f, +0.000177f, +0.000197f + }, + { + -0.031646f, +0.059881f, +0.029214f, +0.002544f, -0.001595f, +0.005815f, -0.003208f, -0.005874f, +0.006700f, -0.000374f, + +0.010683f, +0.006595f, +0.002699f, -0.002882f, -0.011787f, -0.004128f, +0.013606f, +0.005089f, -0.022350f, +0.012861f, + -0.002822f, -0.003019f, +0.001000f, +0.001892f, +0.006983f, -0.005511f, -0.001267f, +0.000598f, +0.000065f, +0.001934f, + +0.000671f, +0.000413f, +0.003140f, -0.003234f, +0.007279f, -0.002012f, +0.000316f, +0.001972f, +0.001861f, -0.000360f, + +0.000057f, +0.001379f, -0.001058f, +0.003318f, +0.000666f, -0.004429f, -0.000798f, -0.002091f, +0.002277f, -0.000436f, + -0.000820f, +0.003634f, +0.000973f, -0.000010f, +0.001053f, -0.002126f, -0.000098f, -0.001603f, +0.000584f, +0.001253f, + +0.000318f, -0.000638f, -0.000902f, +0.000311f, -0.000162f, +0.000444f, +0.000286f, -0.001045f, +0.000419f, -0.000462f, + +0.000594f, -0.000663f, -0.000049f, -0.000184f, +0.000063f, +0.000273f, +0.000776f, +0.000068f, -0.000096f, +0.000043f, + +0.000580f, -0.000509f, +0.000514f, +0.000015f, +0.000163f, -0.000248f, +0.000360f, +0.000247f, +0.000445f, -0.000080f, + -0.000261f, -0.000157f, +0.000012f, +0.000071f, -0.000121f, +0.000208f + }, + { + +0.012174f, -0.227355f, -0.033757f, +0.030663f, -0.002102f, -0.002750f, -0.001268f, -0.002764f, +0.000176f, -0.000578f, + -0.008196f, +0.008632f, -0.001088f, +0.010728f, +0.011504f, -0.001200f, +0.007706f, +0.008469f, +0.001120f, +0.000638f, + -0.001498f, -0.006073f, +0.000327f, -0.002706f, +0.000336f, -0.001187f, +0.005883f, -0.002844f, +0.009100f, +0.004695f, + -0.000767f, -0.003003f, -0.002294f, -0.004190f, -0.000772f, +0.002387f, -0.004218f, -0.001809f, +0.001900f, -0.001064f, + +0.006506f, -0.001489f, +0.000459f, +0.001387f, +0.000533f, -0.001319f, +0.002029f, -0.002764f, +0.002052f, +0.001448f, + -0.001221f, -0.000299f, +0.001670f, -0.001830f, -0.001409f, +0.000220f, -0.002580f, +0.000450f, +0.000436f, -0.000319f, + -0.000524f, +0.000131f, +0.000879f, -0.000346f, -0.000290f, +0.002024f, -0.001288f, +0.000216f, -0.000089f, -0.001095f, + +0.000847f, +0.000634f, +0.000321f, +0.000769f, -0.000377f, -0.000331f, +0.000811f, -0.000003f, -0.000662f, +0.000556f, + +0.000693f, -0.000533f, +0.000259f, +0.000051f, -0.000135f, -0.000435f, +0.000225f, -0.000155f, +0.000359f, +0.000095f, + -0.000101f, -0.000197f, -0.000034f, -0.000311f, +0.000036f, -0.000018f + }, + { + -0.003046f, +0.023424f, +0.006049f, +0.000820f, +0.000857f, +0.000744f, -0.001034f, -0.000224f, +0.000040f, -0.001001f, + -0.002702f, +0.001881f, +0.006714f, -0.017054f, +0.003733f, +0.006570f, +0.006861f, -0.003173f, -0.006286f, +0.002538f, + -0.003676f, -0.000677f, +0.000815f, -0.001056f, -0.006024f, -0.002290f, -0.001218f, +0.002801f, +0.000185f, -0.002998f, + +0.004991f, -0.002230f, -0.000488f, -0.002534f, +0.002471f, +0.000679f, -0.003401f, +0.005049f, -0.001344f, +0.000927f, + +0.000762f, +0.001776f, -0.002583f, +0.001326f, +0.003155f, +0.001111f, -0.002805f, +0.000318f, +0.001747f, -0.000600f, + -0.001433f, -0.000104f, +0.001174f, +0.001347f, +0.000131f, -0.000385f, -0.000680f, +0.000915f, -0.000954f, +0.000554f, + -0.000178f, -0.000236f, -0.000412f, +0.000667f, -0.000223f, -0.001424f, +0.000524f, +0.000720f, -0.000113f, -0.000949f, + +0.000210f, -0.000792f, +0.000672f, -0.000115f, -0.000020f, +0.000602f, -0.000132f, +0.000226f, -0.000204f, +0.000439f, + -0.000081f, -0.000499f, +0.000318f, -0.000213f, +0.000259f, -0.000113f, +0.000115f, +0.000228f, -0.000462f, +0.000035f, + -0.000198f, +0.000086f, -0.000088f, -0.000138f, -0.000011f, -0.000059f + }, + { + +0.034355f, +0.222198f, -0.083685f, +0.000568f, -0.004145f, -0.000250f, +0.001020f, -0.000895f, -0.004958f, +0.002714f, + -0.000769f, -0.002715f, -0.004947f, +0.006918f, +0.027289f, -0.005453f, +0.000841f, -0.007114f, -0.012297f, -0.007547f, + +0.000424f, -0.003118f, +0.003310f, -0.006287f, +0.004265f, -0.010184f, +0.003689f, -0.005746f, +0.007118f, -0.001810f, + +0.001692f, +0.001309f, +0.001358f, -0.000912f, -0.002846f, -0.004560f, +0.013370f, -0.005100f, +0.003534f, -0.004131f, + +0.002121f, -0.000089f, -0.004027f, +0.000019f, +0.000513f, -0.000776f, -0.004390f, +0.000757f, +0.000889f, +0.002308f, + +0.001183f, -0.000260f, +0.001001f, -0.000613f, +0.000875f, +0.001191f, -0.000321f, -0.002577f, +0.000500f, +0.001312f, + -0.002011f, -0.000209f, -0.000546f, +0.000083f, +0.000948f, -0.000673f, +0.000460f, +0.000196f, +0.000780f, -0.000249f, + -0.000951f, -0.000018f, -0.000077f, +0.000373f, -0.000092f, -0.000080f, +0.000575f, -0.000013f, -0.000357f, +0.000779f, + -0.000031f, -0.000034f, +0.000158f, -0.000255f, -0.000158f, +0.000107f, +0.000059f, +0.000521f, -0.000251f, +0.000395f, + -0.000322f, +0.000278f, -0.000150f, +0.000296f, -0.000369f, +0.000221f + }, + { + +0.000175f, +0.000646f, -0.003743f, -0.001183f, -0.000343f, -0.000287f, +0.001046f, -0.000456f, -0.003171f, +0.002642f, + -0.002938f, +0.000862f, -0.004850f, -0.011357f, +0.016959f, +0.007901f, +0.002487f, -0.007428f, +0.007937f, -0.046563f, + -0.017059f, +0.002077f, -0.005191f, -0.020179f, +0.009577f, -0.002534f, -0.015398f, +0.000591f, +0.006017f, +0.008268f, + -0.003887f, -0.000703f, +0.008465f, -0.002496f, +0.001959f, -0.001199f, -0.002231f, -0.000407f, +0.001786f, +0.002992f, + +0.001898f, -0.003209f, +0.002634f, +0.000941f, -0.000552f, -0.000786f, +0.001114f, -0.000305f, -0.001518f, +0.000950f, + +0.000104f, +0.000300f, -0.000266f, -0.000650f, +0.001254f, -0.002713f, +0.000113f, +0.000033f, -0.000074f, +0.001187f, + +0.000358f, -0.000024f, +0.000203f, +0.000899f, -0.000734f, +0.001316f, -0.000581f, +0.000185f, +0.000190f, +0.000206f, + -0.000833f, -0.000228f, -0.000666f, +0.000018f, +0.000250f, +0.001323f, -0.000413f, -0.000623f, +0.000085f, -0.000494f, + -0.000101f, -0.000048f, +0.000199f, +0.000015f, -0.000175f, +0.000111f, +0.000646f, -0.000328f, +0.000496f, -0.000351f, + +0.000370f, +0.000108f, +0.000460f, +0.000035f, -0.000324f, -0.000225f + }, + { + -0.033504f, +0.631298f, +0.000748f, +0.023060f, -0.000408f, -0.000997f, -0.000923f, -0.000159f, -0.002945f, +0.005121f, + +0.003068f, -0.000055f, -0.004996f, +0.000167f, +0.003324f, -0.017020f, +0.003446f, -0.003003f, -0.006254f, +0.001519f, + +0.002645f, +0.003636f, -0.002818f, -0.004533f, +0.001940f, -0.001506f, -0.005736f, +0.001182f, +0.001488f, +0.001844f, + +0.002427f, -0.001006f, +0.002602f, -0.006514f, -0.004725f, -0.001409f, -0.001909f, +0.002068f, -0.001748f, -0.001643f, + -0.000863f, +0.002720f, -0.001899f, -0.001439f, +0.002575f, -0.003762f, +0.004399f, +0.000387f, -0.000254f, -0.002744f, + -0.002647f, +0.000283f, +0.000117f, +0.002264f, +0.000894f, +0.003227f, -0.001908f, -0.001771f, +0.001131f, -0.001322f, + +0.001097f, +0.000486f, -0.000831f, +0.000313f, +0.000856f, -0.000051f, +0.000148f, -0.001006f, +0.001024f, -0.000591f, + -0.000610f, +0.000827f, -0.000278f, -0.000870f, +0.000546f, +0.000215f, +0.000262f, +0.000562f, +0.000128f, +0.000164f, + +0.000073f, -0.000242f, -0.000070f, -0.000303f, -0.000059f, +0.000368f, +0.000251f, -0.000100f, +0.000088f, +0.000188f, + -0.000383f, +0.000117f, -0.000078f, +0.000127f, +0.000003f, +0.000026f + }, + { + +0.001357f, -0.017087f, +0.007909f, +0.000215f, +0.001308f, -0.000313f, -0.001022f, -0.000385f, +0.000071f, -0.000048f, + -0.001992f, +0.001611f, +0.003640f, -0.001774f, +0.041604f, +0.004209f, -0.011390f, -0.000129f, +0.010192f, -0.009359f, + +0.009298f, +0.013251f, -0.006414f, +0.001459f, -0.006830f, +0.008867f, +0.003256f, +0.006294f, +0.003626f, -0.010688f, + +0.005287f, +0.000840f, -0.005036f, +0.004164f, +0.001432f, -0.000059f, -0.003554f, +0.000688f, +0.001611f, -0.001092f, + +0.000415f, -0.000248f, -0.001051f, -0.001366f, -0.000912f, -0.001191f, +0.001285f, -0.000819f, +0.001673f, +0.002736f, + +0.000417f, -0.000792f, +0.002334f, +0.001186f, +0.000690f, +0.001015f, -0.000220f, -0.000164f, -0.001181f, -0.000905f, + +0.002338f, -0.000346f, +0.000042f, -0.000828f, -0.001220f, -0.000111f, +0.000667f, +0.000359f, -0.001102f, +0.000809f, + -0.000562f, -0.001371f, +0.000112f, -0.000190f, -0.000186f, -0.000675f, +0.000359f, -0.000610f, -0.000089f, +0.000307f, + -0.000973f, +0.000614f, -0.000268f, +0.000105f, +0.000379f, +0.000114f, -0.000110f, -0.000025f, +0.000101f, -0.000112f, + +0.000057f, -0.000115f, -0.000167f, -0.000045f, -0.000153f, -0.000254f + }, + { + +0.071576f, -0.176631f, -0.058883f, +0.031554f, -0.001408f, -0.001736f, -0.006872f, -0.001340f, +0.003349f, -0.000436f, + -0.000260f, +0.007609f, +0.003474f, +0.002627f, -0.005451f, +0.003069f, +0.006398f, -0.009301f, -0.004588f, -0.001097f, + +0.001230f, -0.001326f, +0.003050f, -0.003543f, -0.002597f, -0.001366f, +0.000275f, -0.002050f, +0.001170f, +0.000388f, + +0.001501f, +0.002441f, -0.000352f, +0.002697f, -0.001515f, +0.004658f, -0.001395f, +0.001508f, +0.000850f, +0.001673f, + -0.003718f, -0.003623f, -0.000949f, -0.000085f, -0.002260f, +0.001300f, +0.000823f, -0.001357f, -0.001122f, +0.000995f, + +0.000287f, -0.002074f, -0.000406f, -0.000292f, +0.001270f, -0.000891f, -0.000052f, -0.000117f, -0.000321f, -0.001375f, + +0.000134f, -0.000806f, -0.000109f, -0.000489f, -0.000609f, +0.000662f, -0.000151f, -0.000246f, +0.000306f, +0.000292f, + -0.000305f, -0.000379f, -0.000366f, -0.000685f, +0.000121f, -0.000622f, +0.000888f, +0.000114f, -0.000523f, -0.000098f, + +0.000015f, +0.000167f, -0.000624f, +0.000082f, -0.000212f, +0.000314f, +0.000387f, -0.000289f, -0.000044f, +0.000221f, + -0.000116f, +0.000102f, +0.000133f, +0.000159f, -0.000140f, -0.000120f + }, + { + -0.003190f, +0.029990f, +0.015313f, -0.010472f, +0.001804f, +0.004126f, -0.018218f, -0.000519f, +0.000184f, -0.000474f, + -0.003123f, -0.004432f, +0.004827f, -0.000887f, -0.006149f, -0.007032f, +0.018901f, +0.003958f, +0.007203f, +0.004256f, + -0.003281f, +0.000140f, +0.008201f, -0.011681f, +0.004594f, -0.000045f, +0.003782f, -0.007715f, +0.004628f, +0.001110f, + -0.004748f, -0.000215f, +0.004335f, -0.000734f, -0.000958f, +0.001257f, +0.003970f, +0.000738f, +0.001588f, +0.001324f, + +0.001836f, +0.003811f, +0.001897f, +0.000636f, +0.000438f, -0.000412f, +0.000713f, -0.001082f, +0.001989f, -0.001086f, + -0.001494f, +0.000505f, +0.000147f, +0.002212f, -0.000452f, +0.001775f, -0.000118f, +0.000209f, +0.000217f, +0.001371f, + +0.000600f, -0.000173f, +0.000463f, -0.000335f, +0.000483f, -0.000614f, -0.000536f, +0.000307f, -0.000745f, +0.000276f, + -0.000220f, +0.000052f, -0.000418f, +0.000273f, -0.000019f, +0.000060f, +0.000582f, -0.000236f, -0.000159f, +0.000708f, + -0.000088f, -0.000378f, +0.000440f, +0.000064f, -0.000234f, -0.000551f, -0.000060f, +0.000001f, +0.000040f, +0.000154f, + +0.000046f, -0.000172f, -0.000119f, +0.000264f, -0.000085f, -0.000048f + }, + { + +0.026930f, -0.149177f, -0.015685f, +0.018005f, -0.001332f, -0.002239f, +0.000491f, +0.002356f, -0.007409f, +0.001669f, + +0.008892f, -0.002137f, +0.001678f, +0.001980f, -0.010163f, +0.004246f, -0.001145f, +0.009192f, -0.001600f, -0.004173f, + +0.004136f, +0.003800f, +0.002796f, +0.002447f, -0.000686f, +0.004071f, -0.002279f, +0.001665f, -0.001722f, -0.000878f, + -0.003973f, -0.008517f, +0.008018f, +0.003017f, -0.002318f, +0.002854f, +0.004884f, +0.001490f, -0.002884f, +0.002395f, + +0.000109f, -0.002127f, -0.000531f, +0.001521f, -0.000392f, -0.000611f, -0.000878f, -0.002859f, -0.000453f, -0.001490f, + -0.000106f, -0.000124f, +0.001285f, -0.001883f, +0.000570f, -0.000327f, +0.002723f, -0.000286f, +0.000889f, -0.000894f, + +0.000031f, +0.000331f, +0.000189f, +0.001127f, -0.000653f, +0.000306f, -0.000268f, +0.000631f, +0.000130f, -0.000708f, + -0.000234f, -0.000061f, -0.000112f, +0.000244f, +0.000029f, +0.000585f, -0.000385f, -0.000206f, +0.000267f, -0.000347f, + +0.000435f, -0.000108f, -0.000255f, -0.000171f, +0.000118f, +0.000060f, +0.000019f, +0.000248f, -0.000356f, +0.000032f, + -0.000136f, -0.000094f, -0.000088f, -0.000019f, +0.000121f, +0.000023f + }, + { + -0.001456f, +0.027929f, -0.002122f, -0.000832f, +0.002595f, +0.000697f, +0.001394f, +0.003753f, -0.001418f, -0.000846f, + +0.000763f, -0.002040f, -0.005065f, +0.051260f, +0.003208f, +0.008151f, -0.006754f, +0.004313f, +0.000409f, +0.000079f, + -0.010431f, +0.023708f, +0.003437f, -0.001490f, -0.010401f, -0.004862f, +0.012607f, -0.007575f, +0.008591f, +0.004057f, + +0.003414f, +0.000201f, -0.000904f, -0.002780f, -0.000926f, -0.002488f, -0.001933f, +0.000815f, +0.001850f, +0.002887f, + -0.000257f, -0.002935f, +0.000176f, +0.000828f, -0.001439f, +0.001249f, -0.000275f, +0.003529f, +0.001588f, +0.000478f, + +0.000192f, +0.000288f, +0.000614f, -0.000699f, +0.001398f, +0.000293f, +0.000235f, +0.000563f, +0.000769f, -0.001056f, + +0.000802f, -0.001448f, +0.000157f, -0.000262f, -0.001217f, -0.000043f, -0.000149f, -0.000249f, -0.000419f, -0.000461f, + +0.001182f, +0.000301f, -0.000897f, +0.000003f, +0.000254f, -0.000255f, +0.000145f, -0.000494f, -0.000122f, -0.000074f, + +0.000236f, -0.000543f, -0.000141f, +0.000259f, +0.000381f, +0.000250f, -0.000100f, -0.000018f, +0.000031f, +0.000001f, + -0.000049f, -0.000064f, -0.000014f, -0.000393f, +0.000020f, -0.000265f + }, + { + +0.018805f, -0.114090f, -0.005677f, -0.013261f, +0.011884f, -0.004502f, -0.003802f, -0.000386f, +0.002700f, +0.005250f, + -0.002572f, +0.007277f, +0.003584f, -0.017058f, +0.011987f, -0.007516f, +0.004803f, -0.007477f, -0.005310f, +0.003603f, + +0.000269f, -0.000448f, +0.000346f, +0.002849f, -0.000558f, -0.000488f, +0.001131f, -0.000679f, -0.001444f, -0.002768f, + +0.004954f, -0.000115f, -0.007626f, -0.000802f, +0.003449f, -0.002972f, +0.002528f, -0.001622f, +0.003101f, -0.000645f, + +0.002015f, +0.002199f, -0.002148f, -0.002520f, +0.000470f, +0.004994f, +0.001082f, -0.004214f, +0.000222f, -0.001281f, + +0.000202f, +0.000934f, -0.001903f, +0.000197f, -0.000839f, -0.000580f, +0.000595f, +0.001088f, -0.000175f, -0.001112f, + -0.002135f, +0.001030f, -0.000619f, +0.001148f, -0.000604f, +0.000347f, +0.000304f, -0.000293f, -0.000848f, -0.000069f, + -0.000081f, +0.000042f, -0.000700f, -0.000354f, +0.000811f, +0.000179f, -0.000852f, +0.000523f, -0.000587f, +0.000092f, + -0.000496f, -0.000056f, -0.000666f, +0.000265f, +0.000162f, +0.000169f, +0.000022f, -0.000108f, +0.000159f, -0.000257f, + -0.000093f, +0.000143f, +0.000334f, -0.000175f, +0.000061f, +0.000068f + }, + { + +0.000298f, -0.003660f, -0.006638f, -0.002643f, -0.000530f, -0.002111f, +0.000488f, -0.001471f, -0.003159f, -0.000063f, + -0.003809f, +0.000272f, -0.006921f, +0.029209f, -0.036858f, -0.002073f, -0.001968f, +0.002764f, -0.003062f, +0.002174f, + +0.002271f, -0.001954f, -0.003830f, +0.010508f, -0.004848f, -0.003173f, -0.006919f, +0.005705f, +0.005005f, -0.002428f, + -0.002465f, -0.005162f, +0.004217f, -0.003098f, -0.005688f, +0.004873f, +0.000160f, +0.001685f, +0.003043f, -0.002777f, + +0.003412f, -0.000903f, -0.003197f, +0.002303f, +0.001317f, -0.000649f, +0.003514f, -0.003425f, +0.001347f, -0.002047f, + -0.000936f, -0.001635f, -0.001624f, +0.000719f, -0.002191f, +0.001285f, -0.000281f, +0.000320f, -0.000225f, -0.000461f, + +0.000805f, -0.001486f, +0.000646f, -0.000300f, +0.000698f, -0.000137f, +0.000070f, +0.000335f, +0.000868f, -0.000405f, + -0.001107f, -0.000167f, +0.001081f, -0.000811f, -0.000403f, -0.000139f, +0.000083f, +0.000396f, +0.000292f, -0.000081f, + -0.000334f, +0.000074f, -0.000448f, +0.000106f, -0.000162f, +0.000302f, +0.000425f, -0.000347f, +0.000053f, -0.000048f, + +0.000162f, +0.000055f, -0.000169f, +0.000092f, +0.000085f, -0.000091f + }, + { + +0.003718f, -0.133567f, +0.002175f, -0.011781f, +0.010627f, +0.013410f, -0.002759f, +0.002268f, -0.000997f, +0.001478f, + +0.004321f, -0.002748f, +0.006907f, -0.015928f, -0.016000f, +0.008108f, +0.006721f, +0.000753f, -0.002593f, -0.004335f, + +0.002273f, -0.002959f, -0.001047f, -0.002129f, -0.005066f, +0.006105f, +0.000288f, +0.005215f, -0.005903f, +0.004071f, + -0.000982f, +0.001296f, +0.000654f, -0.005646f, +0.001968f, -0.004161f, -0.000966f, +0.000324f, -0.003871f, +0.000442f, + -0.001368f, +0.004001f, -0.001406f, -0.002119f, +0.001448f, +0.001351f, +0.001699f, +0.002804f, -0.000244f, +0.000300f, + +0.000592f, +0.002529f, -0.000302f, -0.000770f, +0.001324f, -0.000562f, +0.000968f, +0.000092f, +0.001361f, +0.000621f, + -0.002218f, -0.000510f, -0.000002f, +0.000422f, +0.000570f, -0.000604f, +0.001066f, -0.000078f, -0.000906f, +0.000369f, + -0.000472f, -0.000655f, +0.000678f, +0.000007f, +0.000221f, +0.000142f, -0.000094f, +0.000525f, +0.000036f, -0.000097f, + -0.000326f, +0.000368f, -0.000441f, +0.000131f, -0.000057f, -0.000275f, +0.000031f, +0.000177f, +0.000079f, +0.000163f, + +0.000143f, +0.000121f, +0.000139f, -0.000316f, -0.000002f, +0.000181f + } + }, + { + { + +0.002615f, +0.069124f, +0.019724f, -0.009280f, -0.003160f, +0.001997f, +0.000857f, +0.002780f, -0.000110f, -0.003467f, + -0.000090f, -0.003023f, -0.003709f, -0.006969f, -0.014679f, -0.001974f, +0.003637f, +0.004754f, -0.005127f, -0.010686f, + -0.004297f, -0.004847f, +0.002357f, +0.001204f, +0.004307f, -0.009744f, -0.000980f, +0.003737f, +0.005234f, -0.007392f, + +0.004442f, +0.004466f, -0.001445f, -0.003368f, -0.002587f, -0.000288f, -0.000294f, -0.006073f, -0.000457f, +0.001600f, + -0.000510f, -0.002641f, +0.000011f, +0.000293f, -0.002928f, -0.000800f, -0.001192f, +0.001307f, -0.000210f, -0.000043f, + +0.001445f, -0.000470f, -0.000375f, -0.000029f, +0.000129f, -0.000973f, -0.000302f, -0.000978f, -0.000468f, +0.001519f, + -0.000170f, -0.000037f, +0.000660f, -0.000373f, +0.000007f, +0.000382f, +0.000422f, +0.000894f, +0.000074f, +0.000133f, + -0.000545f, +0.000034f, +0.000366f, +0.000072f, -0.000020f, -0.000029f, +0.000229f, +0.000628f, +0.000197f, -0.000608f, + -0.000220f, +0.000274f, +0.000116f, -0.000300f, +0.000056f, -0.000214f, +0.000059f, +0.000172f, +0.000264f, +0.000044f, + +0.000125f, -0.000136f, -0.000076f, +0.000060f, +0.000056f, -0.000017f + }, + { + +0.027646f, +0.043374f, -0.022996f, +0.011106f, -0.002819f, +0.001497f, -0.001563f, -0.003465f, -0.001285f, +0.006732f, + +0.002297f, +0.010100f, +0.002055f, -0.003092f, -0.005102f, -0.004518f, +0.000613f, -0.003367f, +0.000205f, +0.002850f, + -0.000002f, -0.000536f, -0.001451f, +0.005215f, +0.001884f, -0.000960f, -0.000573f, -0.001049f, -0.001637f, +0.002851f, + +0.000064f, +0.002178f, +0.001035f, +0.002291f, +0.002132f, -0.000192f, +0.000760f, +0.002484f, -0.001578f, +0.000383f, + +0.000456f, -0.000868f, -0.000410f, +0.001897f, -0.000120f, -0.003558f, -0.001328f, +0.000421f, -0.000110f, -0.000503f, + +0.001517f, +0.002135f, +0.000655f, +0.000999f, +0.000457f, -0.001146f, -0.001111f, -0.000311f, +0.000549f, +0.000296f, + +0.000843f, +0.000121f, -0.000921f, -0.000460f, -0.000010f, +0.000059f, +0.000188f, +0.000105f, +0.000179f, +0.000238f, + -0.000160f, +0.000013f, -0.000054f, -0.000099f, -0.000485f, +0.000442f, +0.000560f, +0.000249f, +0.000246f, +0.000087f, + +0.000033f, -0.000057f, +0.000325f, +0.000137f, +0.000138f, -0.000306f, +0.000080f, +0.000252f, +0.000326f, +0.000192f, + -0.000244f, -0.000072f, +0.000010f, -0.000068f, +0.000034f, +0.000071f + }, + { + -0.012094f, -0.233769f, -0.009561f, +0.015135f, +0.021649f, +0.002178f, -0.000161f, -0.002520f, -0.001268f, -0.005325f, + -0.003956f, +0.002996f, +0.005740f, +0.009488f, +0.002458f, +0.009101f, +0.001941f, +0.002069f, +0.007652f, +0.005080f, + -0.005524f, +0.000813f, +0.001114f, -0.004096f, -0.000251f, +0.000387f, +0.006881f, +0.004271f, +0.002895f, -0.001300f, + +0.000001f, -0.002981f, -0.002018f, -0.003954f, -0.000398f, -0.001422f, +0.001672f, -0.001444f, -0.001902f, +0.000470f, + +0.004088f, +0.001031f, -0.000153f, +0.000837f, +0.000822f, +0.000267f, -0.000176f, +0.001300f, +0.001341f, -0.000266f, + -0.001132f, -0.000187f, +0.001273f, +0.000016f, -0.001815f, -0.000512f, +0.000079f, +0.000721f, -0.000745f, +0.000027f, + -0.001449f, +0.000867f, +0.000117f, +0.000921f, +0.000583f, +0.000512f, -0.000431f, -0.000116f, -0.000526f, +0.000109f, + +0.000415f, +0.000380f, +0.000576f, +0.000328f, +0.000156f, -0.000121f, +0.000125f, +0.000085f, +0.000089f, +0.000032f, + +0.000252f, -0.000003f, +0.000392f, -0.000086f, -0.000528f, -0.000182f, -0.000042f, -0.000093f, +0.000195f, +0.000009f, + -0.000111f, +0.000030f, -0.000112f, -0.000044f, -0.000084f, -0.000039f + }, + { + +0.002514f, +0.017887f, +0.002740f, +0.002653f, +0.000906f, +0.000118f, +0.000744f, -0.000700f, -0.000730f, +0.000242f, + -0.001933f, -0.001359f, +0.003240f, -0.006159f, -0.002058f, -0.004965f, +0.008718f, -0.000508f, -0.007601f, +0.004401f, + -0.003429f, +0.002694f, +0.003643f, -0.004327f, +0.001835f, -0.005228f, -0.001215f, +0.000836f, -0.001139f, -0.001399f, + +0.001417f, +0.000965f, -0.000219f, -0.000413f, +0.000595f, -0.000577f, +0.000102f, +0.000744f, +0.001550f, +0.000473f, + +0.000810f, +0.000731f, +0.001205f, +0.000148f, +0.002602f, +0.000864f, -0.001132f, -0.000635f, -0.000236f, +0.000693f, + -0.002185f, -0.000440f, +0.002442f, +0.000340f, +0.000613f, +0.000074f, -0.000450f, -0.000099f, -0.000156f, +0.000172f, + -0.000891f, -0.000327f, -0.000341f, +0.000258f, -0.000094f, -0.000627f, -0.000116f, +0.000765f, -0.000095f, -0.000398f, + -0.000658f, -0.000193f, +0.000113f, -0.000408f, +0.000475f, +0.000375f, +0.000219f, +0.000054f, -0.000025f, +0.000284f, + -0.000116f, -0.000131f, +0.000006f, -0.000043f, +0.000129f, -0.000029f, +0.000068f, -0.000022f, -0.000147f, -0.000087f, + -0.000078f, -0.000008f, +0.000021f, -0.000064f, -0.000099f, +0.000166f + }, + { + -0.009785f, +0.175226f, +0.006625f, -0.013594f, +0.000300f, -0.000341f, +0.000724f, +0.000966f, -0.002784f, -0.000422f, + +0.003454f, -0.003277f, -0.004048f, +0.002948f, +0.016154f, +0.004264f, -0.009273f, -0.011284f, -0.001578f, -0.003952f, + -0.000273f, -0.000294f, +0.000881f, -0.002826f, -0.003116f, -0.005321f, +0.001178f, +0.001832f, -0.001065f, +0.001096f, + +0.001232f, -0.001189f, +0.002839f, -0.000855f, -0.000779f, -0.003629f, +0.001811f, +0.002312f, +0.000461f, -0.001953f, + -0.000967f, -0.001291f, -0.000928f, -0.002299f, +0.002421f, -0.000290f, -0.001908f, -0.000672f, +0.000012f, +0.002006f, + +0.002119f, +0.001013f, -0.000297f, +0.000483f, +0.000756f, +0.001049f, -0.000925f, -0.001593f, +0.000376f, +0.000739f, + -0.001327f, -0.000412f, -0.000240f, +0.000268f, +0.000298f, +0.000645f, -0.000757f, +0.000330f, +0.000678f, -0.000091f, + -0.000585f, -0.000405f, +0.000090f, +0.000146f, +0.000063f, -0.000025f, +0.000385f, -0.000091f, +0.000026f, +0.000438f, + +0.000240f, -0.000009f, -0.000090f, -0.000309f, +0.000088f, +0.000026f, +0.000196f, +0.000172f, -0.000260f, +0.000295f, + -0.000142f, +0.000225f, -0.000100f, +0.000064f, -0.000191f, +0.000058f + }, + { + +0.000328f, +0.002211f, -0.001555f, -0.001901f, +0.000278f, -0.000405f, +0.000765f, -0.000421f, -0.001363f, -0.000474f, + -0.000696f, -0.001883f, -0.004345f, -0.006959f, +0.006922f, +0.005697f, +0.010288f, -0.008188f, -0.000536f, -0.043787f, + -0.001874f, -0.006316f, -0.001712f, -0.014547f, +0.000303f, +0.002375f, -0.005925f, -0.005141f, +0.004925f, +0.003126f, + -0.002188f, +0.003629f, +0.001981f, -0.000005f, +0.000446f, -0.000726f, -0.001008f, +0.001487f, +0.001896f, +0.001619f, + +0.000222f, -0.000104f, +0.000769f, +0.000701f, +0.000318f, +0.000012f, -0.000518f, +0.000806f, +0.000326f, +0.000412f, + -0.000889f, -0.000419f, -0.000453f, -0.000804f, +0.000635f, -0.001634f, +0.000226f, -0.000359f, +0.000095f, +0.000973f, + +0.000696f, +0.000023f, -0.000039f, +0.001004f, +0.000065f, -0.000056f, -0.000291f, +0.000319f, -0.000095f, -0.000662f, + -0.000452f, -0.000025f, -0.000443f, +0.000058f, +0.000071f, +0.000927f, +0.000307f, -0.000094f, -0.000731f, -0.000184f, + -0.000026f, +0.000060f, +0.000030f, -0.000126f, +0.000099f, +0.000106f, +0.000279f, +0.000037f, +0.000237f, +0.000093f, + -0.000073f, +0.000244f, +0.000213f, +0.000027f, -0.000055f, -0.000015f + }, + { + +0.057810f, +0.436435f, +0.051308f, +0.014107f, +0.005564f, +0.000118f, -0.000835f, -0.000601f, +0.001204f, +0.001075f, + +0.001591f, -0.001361f, -0.003916f, -0.003042f, +0.001401f, -0.003196f, -0.004846f, -0.001668f, -0.003116f, -0.001250f, + +0.001072f, +0.000161f, -0.000822f, -0.000823f, -0.000686f, -0.000078f, -0.001430f, -0.000216f, +0.000043f, +0.000119f, + +0.002283f, -0.002187f, +0.001034f, -0.000877f, -0.005109f, +0.000892f, -0.000145f, -0.000519f, -0.002629f, -0.002110f, + +0.000049f, +0.000429f, +0.001074f, -0.002359f, -0.001245f, +0.002470f, +0.001230f, -0.001399f, -0.000228f, -0.002188f, + -0.001223f, -0.001165f, -0.000190f, +0.002137f, +0.001276f, +0.000904f, +0.000625f, -0.001241f, -0.000188f, +0.000447f, + +0.000509f, -0.000000f, -0.000791f, +0.000417f, +0.000355f, +0.000719f, +0.000349f, -0.000706f, +0.000197f, -0.000005f, + -0.000313f, +0.000106f, -0.000191f, -0.000202f, +0.000319f, +0.000335f, +0.000262f, +0.000097f, +0.000272f, +0.000041f, + +0.000129f, -0.000042f, -0.000023f, -0.000151f, -0.000155f, +0.000439f, +0.000087f, +0.000032f, -0.000030f, -0.000099f, + -0.000034f, -0.000066f, -0.000191f, +0.000054f, +0.000057f, +0.000065f + }, + { + -0.000985f, +0.002249f, -0.006865f, +0.003694f, +0.001272f, -0.000702f, -0.000273f, -0.001117f, +0.001089f, -0.000152f, + -0.001890f, +0.002373f, +0.000721f, +0.004195f, +0.017842f, +0.001051f, -0.003587f, -0.006626f, +0.005468f, +0.008410f, + +0.000460f, +0.002518f, -0.005696f, -0.001433f, -0.003812f, +0.002810f, +0.010152f, +0.009790f, -0.003356f, -0.005253f, + +0.005145f, +0.003481f, -0.002489f, +0.000430f, +0.000549f, -0.000763f, +0.001188f, -0.000498f, +0.001397f, -0.000658f, + -0.001310f, -0.000952f, -0.000587f, -0.001685f, -0.001164f, -0.000458f, +0.000302f, +0.000252f, +0.002008f, +0.001797f, + -0.001107f, +0.001689f, +0.001150f, +0.000803f, +0.000641f, +0.001656f, +0.000856f, -0.000497f, -0.000832f, -0.000374f, + +0.000966f, +0.000202f, -0.000660f, -0.000138f, -0.000727f, -0.000581f, +0.000171f, -0.000119f, -0.000571f, +0.000389f, + -0.000299f, -0.000520f, -0.000642f, +0.000133f, -0.000300f, -0.000551f, +0.000151f, +0.000134f, -0.000182f, -0.000079f, + -0.000243f, +0.000120f, +0.000028f, -0.000240f, +0.000271f, +0.000022f, +0.000072f, +0.000005f, +0.000203f, +0.000009f, + -0.000136f, -0.000005f, -0.000079f, -0.000011f, -0.000079f, -0.000134f + }, + { + -0.057317f, -0.067821f, -0.002241f, +0.019892f, +0.000350f, -0.000178f, -0.005695f, -0.002695f, +0.000155f, +0.002778f, + +0.002374f, +0.001326f, +0.002782f, -0.006187f, +0.004876f, +0.004190f, -0.000579f, -0.003251f, -0.004488f, -0.000710f, + +0.000751f, +0.001556f, -0.002333f, +0.000985f, -0.001606f, -0.002425f, -0.000201f, -0.000652f, -0.000620f, +0.003333f, + +0.000799f, +0.000888f, +0.002378f, +0.001146f, -0.001199f, +0.002818f, -0.001273f, +0.001300f, +0.000909f, -0.001123f, + -0.005175f, +0.003253f, -0.001408f, -0.002362f, -0.001277f, +0.000283f, +0.002225f, -0.001346f, -0.002217f, +0.000188f, + +0.001281f, -0.000840f, +0.000665f, -0.001017f, -0.000026f, -0.000069f, -0.000928f, +0.000334f, -0.001174f, -0.000898f, + -0.001190f, +0.000182f, -0.000435f, -0.000229f, -0.000899f, -0.000534f, +0.000291f, +0.000434f, +0.000158f, +0.000154f, + -0.000511f, -0.000493f, -0.000076f, -0.000764f, -0.000030f, +0.000064f, +0.000410f, -0.000134f, -0.000278f, -0.000375f, + +0.000206f, -0.000221f, -0.000224f, -0.000066f, -0.000281f, +0.000090f, +0.000171f, +0.000183f, +0.000045f, +0.000180f, + +0.000063f, +0.000025f, +0.000112f, -0.000055f, +0.000108f, -0.000001f + }, + { + +0.003026f, +0.030860f, +0.005828f, -0.002283f, -0.001860f, -0.001610f, -0.007981f, -0.002237f, +0.000507f, -0.001301f, + +0.001060f, -0.005319f, +0.001401f, +0.003373f, -0.010706f, +0.003765f, +0.002456f, +0.008028f, +0.010761f, +0.002172f, + -0.003533f, +0.001672f, +0.000366f, -0.001263f, +0.004091f, +0.000353f, -0.000510f, -0.003518f, +0.001261f, -0.002125f, + +0.002906f, -0.004099f, +0.003038f, +0.000318f, +0.000655f, +0.001657f, +0.003048f, +0.001193f, +0.003472f, +0.001500f, + +0.001871f, +0.003311f, +0.003389f, -0.001167f, -0.000032f, -0.000394f, +0.000249f, +0.000398f, +0.000140f, +0.000271f, + -0.000738f, +0.000373f, +0.000996f, +0.001829f, -0.000490f, +0.000978f, +0.001031f, +0.000180f, +0.000704f, +0.000934f, + +0.000083f, +0.000451f, -0.000147f, +0.000063f, -0.000543f, -0.000642f, -0.000250f, +0.000061f, +0.000190f, -0.000079f, + +0.000305f, -0.000436f, -0.000395f, +0.000059f, -0.000034f, +0.000072f, +0.000328f, -0.000219f, -0.000203f, +0.000047f, + -0.000009f, -0.000030f, +0.000272f, -0.000103f, -0.000119f, -0.000098f, -0.000259f, -0.000128f, -0.000115f, +0.000143f, + +0.000052f, -0.000050f, -0.000019f, +0.000081f, +0.000037f, +0.000010f + }, + { + -0.024696f, -0.096373f, +0.006055f, -0.001107f, +0.005589f, -0.002824f, +0.004514f, +0.000785f, -0.001338f, -0.001174f, + +0.001717f, +0.005033f, +0.001376f, +0.000221f, -0.001474f, -0.002787f, +0.010179f, +0.003694f, -0.003780f, +0.001856f, + +0.001438f, +0.001510f, +0.003424f, +0.001498f, +0.001965f, +0.001467f, +0.000432f, -0.001164f, +0.000291f, -0.003344f, + -0.002528f, -0.003785f, +0.002163f, +0.002624f, +0.000551f, +0.002611f, +0.001529f, +0.000464f, -0.001094f, +0.003124f, + -0.000102f, -0.000347f, -0.001239f, +0.000936f, -0.001178f, -0.001132f, -0.000406f, -0.001550f, -0.001170f, -0.001008f, + +0.000250f, -0.000209f, +0.000296f, -0.001226f, -0.000036f, -0.000179f, +0.000511f, +0.001743f, +0.000299f, +0.000007f, + -0.000027f, -0.000204f, +0.000399f, +0.000462f, -0.000162f, -0.000066f, +0.000030f, -0.000075f, +0.000356f, -0.000485f, + +0.000042f, -0.000397f, +0.000075f, +0.000433f, +0.000202f, +0.000391f, -0.000364f, -0.000011f, +0.000161f, -0.000047f, + +0.000119f, +0.000261f, -0.000396f, +0.000120f, -0.000115f, +0.000110f, +0.000054f, +0.000026f, -0.000132f, +0.000102f, + -0.000136f, -0.000025f, -0.000167f, -0.000107f, +0.000175f, +0.000047f + }, + { + +0.000879f, +0.021614f, +0.003546f, -0.001102f, +0.003330f, +0.000643f, +0.001125f, +0.001606f, -0.000036f, +0.000187f, + -0.000331f, +0.001569f, +0.014111f, +0.018317f, +0.007521f, +0.000116f, +0.001304f, +0.004223f, -0.000698f, -0.005187f, + -0.001272f, +0.014815f, +0.003547f, -0.000236f, -0.002732f, -0.004061f, +0.002383f, +0.004412f, +0.004754f, +0.007362f, + +0.001388f, -0.000757f, -0.002668f, -0.001332f, -0.001740f, -0.001506f, -0.000789f, +0.000034f, +0.000646f, +0.003176f, + +0.000709f, -0.001931f, -0.000853f, +0.000903f, +0.000533f, -0.000713f, -0.000053f, +0.003125f, -0.000923f, +0.001839f, + +0.001198f, +0.000005f, +0.000552f, +0.000429f, +0.000544f, +0.000307f, +0.000129f, -0.000312f, -0.000318f, -0.000123f, + -0.000949f, +0.000108f, -0.000123f, -0.000407f, -0.001051f, -0.000232f, -0.000421f, -0.000589f, -0.000341f, +0.000197f, + +0.000799f, +0.000186f, -0.000271f, +0.000302f, -0.000299f, +0.000141f, -0.000057f, -0.000257f, -0.000217f, -0.000160f, + +0.000046f, -0.000209f, -0.000050f, +0.000163f, +0.000123f, +0.000111f, -0.000066f, +0.000024f, -0.000029f, -0.000112f, + +0.000065f, -0.000007f, -0.000177f, -0.000121f, -0.000121f, -0.000144f + }, + { + -0.020629f, -0.067501f, -0.009707f, +0.004091f, -0.000891f, +0.003811f, +0.006723f, -0.000579f, -0.000673f, +0.004197f, + +0.003611f, -0.001606f, -0.006462f, +0.008758f, +0.010050f, -0.003553f, +0.000282f, -0.004740f, -0.005899f, +0.002744f, + +0.002221f, -0.001319f, -0.000771f, -0.000614f, +0.001265f, +0.000998f, +0.002400f, +0.000047f, -0.002094f, -0.001534f, + +0.005196f, -0.003219f, -0.001966f, -0.001589f, +0.002176f, +0.000572f, -0.001696f, -0.000769f, +0.003595f, +0.002169f, + +0.000220f, +0.000249f, -0.000190f, -0.004316f, -0.001911f, +0.002623f, -0.000072f, -0.001802f, -0.000826f, -0.000991f, + -0.000093f, -0.000191f, -0.000135f, +0.000278f, +0.001010f, -0.000863f, -0.000284f, +0.000336f, +0.000032f, +0.000137f, + -0.001103f, -0.000429f, +0.000478f, -0.000034f, -0.000249f, -0.000170f, -0.000021f, -0.000136f, -0.000255f, +0.000148f, + -0.000381f, +0.000045f, -0.000261f, +0.000212f, +0.000429f, +0.000183f, -0.000643f, -0.000143f, +0.000214f, +0.000201f, + -0.000608f, +0.000006f, -0.000508f, +0.000121f, +0.000242f, +0.000084f, -0.000233f, -0.000159f, -0.000165f, -0.000176f, + +0.000050f, -0.000077f, +0.000279f, -0.000043f, +0.000148f, +0.000214f + }, + { + -0.000475f, -0.003233f, -0.006720f, -0.005002f, +0.002366f, -0.001042f, -0.002372f, +0.001113f, -0.001634f, -0.000575f, + -0.003391f, -0.003007f, -0.004932f, -0.022877f, +0.056077f, -0.005553f, -0.006002f, +0.002792f, -0.004351f, -0.003989f, + +0.000534f, +0.002039f, +0.004574f, +0.001260f, -0.000126f, -0.006633f, -0.002826f, +0.006058f, +0.004687f, -0.003414f, + -0.002592f, -0.001060f, +0.000185f, -0.001435f, -0.003006f, +0.000173f, +0.001706f, +0.000963f, +0.002349f, +0.000012f, + -0.000593f, -0.000676f, +0.000401f, +0.001684f, -0.000591f, +0.000344f, +0.001896f, -0.000572f, -0.000678f, -0.001528f, + -0.000956f, -0.000327f, -0.000958f, -0.001291f, -0.000403f, -0.000483f, -0.000419f, +0.001133f, -0.000912f, -0.000283f, + +0.000549f, -0.000503f, -0.000307f, +0.000123f, +0.000671f, +0.000215f, +0.000164f, +0.000435f, -0.000027f, +0.000040f, + -0.000390f, +0.000148f, +0.000026f, +0.000051f, -0.000358f, +0.000090f, -0.000249f, +0.000345f, -0.000040f, -0.000062f, + +0.000003f, -0.000250f, -0.000327f, +0.000002f, +0.000056f, +0.000053f, +0.000063f, -0.000110f, -0.000081f, -0.000124f, + +0.000169f, +0.000161f, -0.000062f, +0.000030f, +0.000154f, -0.000164f + }, + { + -0.014971f, -0.089993f, -0.012952f, -0.002355f, +0.006688f, +0.012018f, +0.007861f, +0.002633f, -0.004723f, -0.001832f, + +0.002763f, +0.008486f, +0.002306f, +0.002627f, -0.036012f, +0.004175f, +0.013439f, +0.000839f, -0.002854f, -0.001701f, + -0.000140f, -0.000725f, -0.001627f, -0.001920f, -0.000812f, +0.001177f, +0.000320f, +0.005582f, +0.000202f, -0.002081f, + +0.000045f, +0.002811f, +0.000799f, -0.004633f, -0.001050f, -0.002994f, -0.001427f, -0.001741f, -0.000445f, -0.001810f, + -0.000529f, +0.001724f, -0.000850f, -0.001623f, +0.000935f, +0.000904f, +0.001333f, +0.001572f, +0.001363f, -0.000223f, + +0.001533f, +0.000668f, +0.001044f, +0.000957f, +0.000486f, -0.000061f, +0.000364f, +0.000919f, +0.001030f, -0.000404f, + -0.001121f, -0.000568f, -0.000427f, +0.000322f, +0.000656f, -0.000015f, -0.000001f, -0.000068f, -0.000528f, -0.000107f, + -0.000362f, -0.000531f, +0.000203f, +0.000580f, +0.000326f, -0.000342f, +0.000513f, +0.000238f, -0.000249f, +0.000126f, + -0.000191f, +0.000242f, -0.000362f, -0.000014f, -0.000082f, -0.000030f, -0.000014f, +0.000255f, +0.000099f, +0.000163f, + +0.000283f, +0.000061f, -0.000052f, -0.000137f, +0.000189f, +0.000026f + } + }, + { + { + +0.000569f, +0.011821f, -0.014026f, -0.001390f, +0.001642f, -0.000259f, -0.001026f, +0.000613f, +0.000215f, -0.002792f, + +0.000439f, -0.000130f, -0.001133f, +0.000033f, -0.001963f, +0.001131f, -0.002265f, +0.001728f, +0.000015f, -0.000564f, + +0.002473f, +0.003832f, +0.003199f, -0.000142f, +0.006401f, -0.006788f, -0.002084f, +0.000703f, +0.002145f, -0.006902f, + +0.006184f, +0.002362f, -0.003374f, -0.002157f, -0.001546f, +0.001331f, +0.002288f, -0.002976f, +0.001435f, +0.000411f, + -0.000010f, -0.000513f, -0.000310f, +0.000665f, -0.000493f, +0.000862f, -0.001156f, +0.000940f, +0.000005f, -0.000964f, + +0.000457f, -0.000734f, +0.000014f, +0.000280f, +0.000692f, -0.000366f, +0.000132f, -0.000640f, -0.000471f, -0.000017f, + -0.000933f, +0.000646f, +0.000809f, -0.000103f, +0.000149f, +0.000330f, -0.000047f, +0.000384f, -0.000285f, +0.000307f, + -0.000079f, -0.000069f, +0.000270f, -0.000294f, -0.000107f, +0.000062f, -0.000013f, +0.000232f, +0.000337f, -0.000132f, + +0.000080f, +0.000086f, +0.000011f, -0.000054f, +0.000426f, +0.000028f, -0.000053f, +0.000009f, +0.000068f, -0.000026f, + +0.000060f, +0.000003f, +0.000059f, +0.000120f, -0.000003f, -0.000113f + }, + { + -0.020268f, +0.029939f, +0.010806f, +0.006051f, -0.005559f, -0.002206f, +0.001257f, -0.000527f, -0.003473f, +0.001473f, + -0.005301f, +0.003591f, +0.001929f, -0.000456f, +0.001953f, -0.002111f, -0.005317f, +0.003278f, +0.010856f, -0.002178f, + -0.001748f, +0.001207f, -0.004304f, +0.002451f, +0.001063f, +0.001012f, +0.000612f, -0.001952f, -0.001723f, +0.001504f, + -0.000749f, +0.002321f, +0.000351f, +0.000742f, +0.000233f, +0.001576f, -0.002417f, -0.000145f, -0.001942f, +0.000656f, + -0.001155f, -0.001259f, +0.000010f, +0.001594f, +0.000713f, +0.000364f, -0.000379f, +0.000345f, -0.000431f, -0.000058f, + +0.001090f, -0.000372f, -0.000293f, -0.000360f, +0.000036f, -0.000053f, -0.000539f, +0.000590f, -0.000128f, -0.000524f, + +0.000073f, +0.000542f, -0.000125f, +0.000096f, +0.000251f, -0.000392f, -0.000145f, +0.000391f, +0.000140f, +0.000120f, + -0.000160f, +0.000545f, -0.000156f, -0.000088f, +0.000044f, +0.000097f, +0.000180f, +0.000186f, +0.000203f, -0.000216f, + -0.000209f, +0.000104f, +0.000040f, -0.000079f, -0.000002f, -0.000136f, -0.000105f, +0.000128f, -0.000104f, +0.000145f, + -0.000159f, -0.000009f, +0.000009f, -0.000027f, -0.000080f, -0.000056f + }, + { + +0.006560f, -0.150414f, +0.029082f, -0.015815f, +0.002934f, +0.000459f, +0.000053f, -0.000431f, -0.000825f, -0.000035f, + +0.000765f, +0.000408f, +0.001195f, +0.003867f, -0.005690f, +0.001011f, -0.006373f, -0.001690f, +0.005505f, +0.004067f, + -0.003241f, +0.002105f, +0.002343f, -0.001768f, +0.003910f, +0.001248f, +0.004054f, +0.002143f, -0.002787f, -0.004653f, + +0.001550f, +0.002303f, +0.001888f, -0.000069f, -0.000700f, -0.002422f, +0.001712f, -0.001891f, -0.000691f, -0.000258f, + +0.000914f, +0.000048f, -0.000437f, -0.000021f, +0.000173f, +0.001561f, -0.000327f, +0.000635f, +0.000138f, +0.000605f, + +0.000276f, -0.000080f, +0.000101f, +0.000619f, -0.000212f, +0.000047f, +0.000151f, +0.000429f, -0.000608f, +0.000442f, + -0.001234f, +0.000381f, -0.000444f, +0.000303f, -0.000101f, +0.000428f, +0.000052f, -0.000078f, -0.000356f, +0.000068f, + -0.000064f, -0.000289f, +0.000159f, +0.000101f, +0.000269f, -0.000305f, -0.000077f, +0.000248f, +0.000365f, -0.000134f, + +0.000156f, +0.000142f, +0.000137f, +0.000115f, -0.000189f, -0.000153f, -0.000107f, -0.000094f, +0.000149f, +0.000085f, + -0.000179f, +0.000117f, -0.000063f, +0.000048f, -0.000068f, +0.000015f + }, + { + -0.001430f, +0.009794f, -0.000474f, +0.000352f, -0.000116f, -0.000532f, +0.000524f, +0.000378f, -0.000484f, +0.000171f, + -0.000301f, -0.001223f, +0.003287f, -0.006063f, -0.004144f, -0.006175f, +0.000085f, +0.002051f, -0.003255f, +0.002121f, + +0.000206f, -0.000447f, +0.002464f, -0.001608f, +0.001534f, -0.003713f, -0.000486f, +0.002642f, +0.001653f, +0.000864f, + -0.000531f, +0.001333f, +0.001257f, +0.000862f, +0.001018f, -0.000220f, +0.000667f, -0.001623f, +0.000363f, +0.001264f, + +0.000860f, +0.000013f, +0.001456f, -0.000105f, +0.000214f, -0.000094f, +0.000279f, -0.000666f, -0.000643f, +0.001699f, + -0.000552f, -0.000725f, +0.001187f, -0.000780f, -0.000385f, -0.000001f, -0.000175f, -0.000410f, +0.000183f, +0.000327f, + -0.000628f, -0.000070f, -0.000302f, -0.000317f, -0.000156f, +0.000021f, -0.000280f, +0.000032f, -0.000277f, +0.000194f, + -0.000134f, -0.000351f, +0.000025f, -0.000032f, +0.000388f, -0.000185f, +0.000021f, +0.000033f, +0.000153f, +0.000149f, + -0.000024f, +0.000030f, +0.000133f, +0.000063f, +0.000131f, +0.000015f, -0.000081f, -0.000098f, +0.000007f, -0.000014f, + -0.000056f, -0.000050f, +0.000019f, +0.000078f, -0.000061f, +0.000145f + }, + { + -0.009536f, +0.140766f, -0.004172f, -0.008758f, -0.000715f, +0.000288f, +0.000480f, +0.002569f, +0.000850f, -0.000060f, + -0.001420f, -0.003909f, +0.000293f, -0.000381f, +0.004909f, +0.001261f, +0.003515f, +0.000843f, -0.000807f, -0.002021f, + +0.001473f, +0.001355f, +0.000104f, -0.001717f, -0.003119f, -0.000902f, +0.001203f, +0.002017f, -0.002739f, -0.000732f, + +0.001147f, -0.001535f, +0.000395f, +0.000003f, +0.002093f, -0.002642f, -0.001026f, -0.000186f, +0.000381f, +0.000756f, + -0.000810f, -0.001616f, +0.000164f, -0.000322f, +0.002252f, -0.000129f, +0.000816f, +0.000250f, -0.000605f, +0.000800f, + +0.000797f, -0.000581f, -0.000708f, +0.001176f, +0.000432f, -0.000023f, -0.000257f, +0.000164f, +0.000182f, -0.000090f, + -0.000274f, +0.000211f, -0.000149f, +0.000400f, -0.000167f, +0.000347f, -0.000661f, -0.000230f, -0.000127f, -0.000267f, + -0.000051f, -0.000094f, -0.000131f, -0.000340f, -0.000107f, +0.000063f, -0.000088f, +0.000149f, +0.000031f, +0.000017f, + +0.000139f, +0.000035f, -0.000289f, -0.000039f, +0.000083f, -0.000156f, +0.000056f, +0.000067f, -0.000195f, +0.000170f, + -0.000158f, +0.000095f, -0.000078f, +0.000075f, -0.000132f, +0.000102f + }, + { + -0.000700f, +0.003701f, +0.006645f, +0.000411f, -0.000576f, -0.000637f, +0.000177f, -0.000126f, -0.000969f, +0.000152f, + +0.001088f, -0.000455f, -0.000919f, -0.003233f, +0.000931f, -0.003790f, +0.009220f, -0.003759f, +0.006487f, -0.033194f, + +0.005903f, -0.003102f, +0.005380f, -0.001190f, +0.003126f, +0.000992f, +0.001620f, -0.000724f, -0.000429f, -0.001664f, + -0.001447f, +0.001501f, -0.003632f, -0.001224f, +0.000986f, +0.000584f, +0.001125f, +0.001342f, +0.000287f, -0.000330f, + -0.000860f, +0.000069f, -0.001777f, -0.000681f, -0.000260f, +0.000652f, +0.000240f, +0.000778f, -0.000068f, -0.000193f, + -0.000458f, -0.000526f, +0.000295f, -0.000585f, -0.000063f, -0.000235f, +0.000813f, -0.000700f, +0.000197f, +0.000234f, + +0.000182f, -0.000228f, -0.000398f, +0.000500f, -0.000367f, -0.000046f, -0.000133f, -0.000071f, -0.000192f, -0.000146f, + -0.000196f, +0.000435f, +0.000088f, +0.000023f, -0.000307f, +0.000272f, +0.000058f, +0.000162f, -0.000261f, +0.000170f, + -0.000222f, +0.000070f, -0.000075f, -0.000060f, +0.000018f, -0.000094f, +0.000034f, -0.000062f, -0.000010f, +0.000122f, + -0.000123f, -0.000063f, -0.000105f, +0.000023f, -0.000031f, -0.000008f + }, + { + -0.059982f, +0.191282f, -0.014337f, +0.004649f, +0.000433f, +0.000559f, -0.000477f, +0.000871f, +0.001976f, -0.000403f, + +0.000141f, -0.000894f, -0.002455f, -0.002233f, -0.000186f, +0.000900f, -0.001390f, +0.000659f, +0.001631f, -0.000079f, + +0.000905f, +0.000342f, +0.000416f, +0.000550f, -0.000564f, +0.000693f, -0.000167f, +0.000512f, -0.000111f, -0.002155f, + +0.000340f, -0.003211f, -0.000155f, +0.001098f, -0.000680f, +0.004231f, -0.000018f, -0.001287f, -0.001356f, +0.000117f, + +0.000121f, -0.001421f, +0.002043f, -0.001032f, -0.001146f, +0.002295f, +0.000083f, -0.002106f, +0.000603f, -0.000106f, + +0.000096f, -0.000630f, -0.001152f, +0.000891f, +0.000003f, -0.000861f, +0.000347f, -0.000530f, -0.000014f, +0.000516f, + +0.000163f, +0.000169f, -0.000469f, +0.000066f, -0.000103f, +0.000107f, +0.000215f, +0.000026f, -0.000043f, +0.000212f, + +0.000330f, -0.000034f, -0.000323f, +0.000180f, +0.000311f, +0.000078f, -0.000134f, -0.000163f, +0.000046f, -0.000127f, + +0.000284f, -0.000040f, +0.000027f, +0.000136f, -0.000054f, +0.000060f, -0.000078f, +0.000151f, +0.000015f, -0.000076f, + -0.000025f, -0.000021f, -0.000128f, +0.000104f, -0.000051f, +0.000006f + }, + { + -0.000846f, +0.008629f, -0.002235f, +0.000998f, +0.001004f, -0.000509f, +0.000992f, -0.000205f, -0.000071f, +0.000611f, + -0.000753f, +0.000885f, -0.002605f, -0.001812f, +0.003451f, -0.005568f, -0.002122f, -0.006673f, +0.002071f, +0.004809f, + -0.002772f, -0.002961f, -0.002162f, +0.001702f, -0.001602f, +0.003736f, +0.001262f, +0.001470f, -0.002371f, -0.002825f, + +0.003261f, +0.001629f, -0.003396f, +0.000245f, +0.000344f, -0.001337f, +0.001990f, +0.000288f, +0.000759f, -0.000593f, + -0.001117f, -0.000677f, +0.000885f, -0.000510f, -0.000511f, +0.000145f, -0.000114f, +0.001192f, +0.000744f, +0.000273f, + -0.001039f, +0.001453f, -0.000100f, -0.000435f, -0.000372f, +0.000288f, +0.000058f, +0.000063f, +0.000430f, -0.000154f, + +0.000387f, -0.000038f, -0.000053f, +0.000366f, +0.000084f, -0.000305f, -0.000351f, -0.000118f, +0.000081f, +0.000007f, + -0.000033f, +0.000325f, -0.000209f, +0.000214f, -0.000248f, -0.000282f, +0.000021f, +0.000159f, -0.000081f, +0.000010f, + +0.000165f, -0.000108f, +0.000040f, -0.000359f, -0.000027f, -0.000050f, -0.000033f, +0.000116f, +0.000007f, -0.000105f, + +0.000041f, -0.000031f, -0.000067f, +0.000005f, -0.000017f, +0.000062f + }, + { + +0.035394f, +0.046217f, -0.014230f, +0.010605f, -0.001482f, +0.001370f, -0.001165f, +0.000568f, -0.001231f, +0.000869f, + +0.000535f, -0.003425f, -0.000250f, -0.009582f, +0.006532f, -0.000725f, -0.000782f, +0.003688f, -0.001775f, -0.000722f, + +0.001479f, +0.001735f, -0.003732f, +0.002755f, +0.001115f, -0.000996f, +0.001504f, +0.001767f, -0.001047f, +0.001722f, + -0.000715f, -0.000124f, +0.001364f, +0.001097f, -0.001521f, +0.001357f, -0.001281f, -0.000064f, +0.000215f, +0.001045f, + -0.004820f, +0.002344f, -0.000264f, -0.001421f, -0.000651f, -0.001812f, +0.001119f, +0.001559f, -0.000046f, -0.000997f, + +0.000050f, -0.000849f, +0.001046f, -0.000517f, +0.000778f, +0.001150f, -0.000637f, +0.000076f, -0.000405f, +0.000316f, + -0.000688f, +0.000338f, -0.000449f, +0.000028f, -0.000308f, -0.000578f, +0.000259f, +0.000594f, +0.000012f, -0.000183f, + -0.000229f, +0.000082f, +0.000285f, -0.000382f, +0.000203f, +0.000425f, +0.000020f, -0.000006f, +0.000118f, +0.000028f, + +0.000087f, -0.000123f, +0.000061f, +0.000093f, -0.000148f, -0.000156f, -0.000072f, +0.000204f, +0.000044f, +0.000092f, + +0.000071f, -0.000018f, +0.000025f, -0.000238f, +0.000209f, +0.000003f + }, + { + -0.002257f, +0.018403f, -0.004632f, +0.001627f, +0.000875f, +0.001574f, +0.005601f, +0.001454f, +0.000018f, -0.000473f, + +0.004635f, -0.001346f, +0.001592f, +0.000967f, -0.012601f, +0.004963f, -0.003877f, +0.001308f, +0.004375f, +0.001787f, + -0.000924f, +0.003900f, -0.002769f, -0.002750f, +0.000896f, -0.000110f, -0.000707f, -0.001858f, +0.000279f, -0.003372f, + +0.005478f, -0.004343f, +0.000832f, -0.000172f, +0.000037f, +0.000504f, -0.000108f, -0.001010f, +0.002511f, -0.000262f, + -0.000113f, +0.000173f, +0.001382f, -0.000859f, -0.000621f, +0.000403f, +0.000073f, +0.001254f, -0.000173f, -0.000779f, + -0.000301f, +0.000274f, -0.000060f, +0.000520f, -0.000436f, +0.000076f, +0.000522f, -0.000477f, -0.000286f, +0.000224f, + -0.000160f, +0.000022f, -0.000357f, -0.000088f, -0.000023f, -0.000081f, -0.000056f, -0.000032f, +0.000048f, +0.000233f, + +0.000487f, -0.000190f, -0.000000f, -0.000226f, -0.000046f, +0.000163f, +0.000080f, -0.000154f, -0.000055f, -0.000132f, + +0.000069f, +0.000000f, +0.000146f, -0.000026f, +0.000079f, +0.000095f, -0.000105f, -0.000034f, -0.000022f, +0.000012f, + +0.000067f, -0.000057f, -0.000001f, +0.000002f, +0.000074f, +0.000063f + }, + { + +0.019898f, -0.040251f, -0.000171f, -0.006664f, +0.001249f, -0.006408f, +0.004445f, +0.001775f, +0.001646f, -0.000014f, + -0.000457f, +0.002785f, +0.000404f, -0.000092f, +0.003008f, +0.002467f, +0.013502f, +0.004233f, -0.002118f, +0.000877f, + -0.000130f, -0.000425f, +0.001184f, -0.001594f, +0.001802f, -0.000049f, +0.001720f, -0.001755f, -0.001526f, -0.000796f, + +0.001325f, -0.000034f, -0.000014f, -0.000259f, +0.000812f, +0.001705f, -0.000965f, +0.001204f, -0.000010f, +0.001717f, + -0.000083f, +0.001766f, -0.000943f, +0.001303f, -0.000072f, +0.000282f, +0.000475f, -0.000057f, +0.000806f, -0.000730f, + +0.000233f, -0.000773f, -0.000012f, +0.000246f, +0.000217f, -0.000459f, -0.000690f, +0.000608f, +0.000387f, +0.000181f, + -0.000008f, +0.000245f, +0.000177f, -0.000050f, +0.000074f, +0.000169f, +0.000117f, +0.000061f, +0.000360f, -0.000037f, + +0.000254f, -0.000342f, -0.000099f, +0.000284f, +0.000027f, +0.000007f, -0.000140f, +0.000139f, -0.000012f, +0.000041f, + -0.000049f, +0.000183f, -0.000132f, +0.000004f, +0.000030f, +0.000003f, +0.000054f, +0.000006f, -0.000004f, +0.000059f, + -0.000104f, +0.000065f, -0.000016f, -0.000057f, -0.000017f, +0.000001f + }, + { + -0.000144f, +0.013611f, -0.003714f, -0.003439f, +0.001551f, +0.001440f, -0.000459f, -0.000306f, +0.000183f, +0.001388f, + +0.000258f, +0.002359f, -0.000623f, -0.009659f, +0.005320f, -0.001355f, -0.001734f, -0.000377f, +0.000050f, -0.002754f, + -0.003475f, -0.000546f, +0.000579f, +0.001969f, +0.001854f, -0.000517f, -0.001405f, +0.002439f, +0.000543f, +0.002322f, + +0.001095f, -0.002115f, -0.000082f, +0.000675f, -0.000482f, -0.000690f, +0.000427f, -0.000349f, -0.000138f, +0.001195f, + +0.000706f, -0.000571f, -0.000827f, +0.001007f, +0.000466f, -0.001021f, -0.000906f, +0.000677f, -0.001776f, +0.000383f, + +0.000236f, +0.000113f, +0.000400f, +0.000422f, -0.000073f, +0.000052f, +0.000281f, -0.000447f, -0.000986f, +0.000132f, + -0.001189f, +0.000478f, +0.000578f, +0.000356f, -0.000784f, -0.000218f, +0.000313f, -0.000389f, -0.000162f, -0.000271f, + -0.000150f, -0.000284f, -0.000154f, +0.000384f, -0.000356f, +0.000183f, +0.000186f, +0.000052f, +0.000055f, +0.000050f, + -0.000099f, +0.000002f, +0.000043f, -0.000049f, -0.000134f, +0.000009f, -0.000064f, -0.000087f, +0.000056f, -0.000109f, + -0.000065f, -0.000025f, -0.000002f, +0.000120f, -0.000093f, +0.000010f + }, + { + +0.013729f, -0.005983f, +0.001946f, +0.010148f, -0.006372f, +0.001177f, +0.008604f, -0.001777f, +0.000370f, -0.000595f, + +0.000112f, -0.001902f, +0.001441f, +0.020342f, +0.005488f, -0.004566f, +0.000341f, -0.000303f, -0.001343f, +0.000362f, + +0.003315f, -0.001588f, -0.001686f, -0.001035f, +0.000991f, -0.002055f, -0.000971f, -0.000574f, +0.001245f, +0.000897f, + +0.002805f, -0.002105f, +0.002370f, -0.000400f, -0.000768f, -0.000657f, +0.000553f, +0.000150f, +0.000915f, +0.000552f, + -0.001474f, +0.000090f, +0.000808f, -0.002122f, -0.002037f, +0.000738f, -0.000620f, -0.000238f, -0.000456f, -0.000274f, + +0.000704f, +0.000079f, +0.000382f, +0.000326f, +0.001134f, +0.000141f, -0.000395f, +0.000162f, +0.000033f, +0.000114f, + +0.000131f, -0.000058f, +0.000773f, -0.000242f, +0.000303f, +0.000314f, -0.000195f, +0.000046f, +0.000119f, +0.000338f, + -0.000016f, +0.000139f, +0.000032f, +0.000249f, -0.000190f, -0.000041f, -0.000177f, -0.000249f, +0.000145f, +0.000172f, + +0.000037f, +0.000277f, -0.000232f, -0.000073f, -0.000057f, +0.000182f, -0.000093f, -0.000166f, -0.000031f, +0.000002f, + +0.000138f, -0.000010f, +0.000125f, +0.000060f, +0.000008f, +0.000087f + }, + { + +0.000551f, +0.004337f, +0.000555f, -0.002530f, +0.002796f, +0.000029f, -0.000963f, -0.000298f, -0.000930f, +0.000711f, + -0.000832f, +0.002581f, -0.003666f, -0.013083f, +0.077420f, -0.002589f, -0.004499f, -0.000197f, -0.002396f, -0.004337f, + -0.006781f, -0.003285f, +0.003366f, +0.000320f, +0.001634f, -0.004469f, +0.001686f, +0.000111f, +0.000542f, -0.000494f, + +0.000162f, +0.002059f, +0.001304f, +0.000002f, +0.000800f, +0.000052f, +0.001761f, +0.000028f, -0.000450f, +0.000929f, + -0.000688f, -0.000094f, +0.000889f, +0.000166f, -0.000871f, +0.000470f, +0.000582f, +0.000391f, -0.000296f, -0.000178f, + -0.000199f, +0.000605f, -0.000103f, -0.000931f, +0.000720f, +0.000667f, -0.000608f, +0.000623f, -0.000774f, -0.000029f, + +0.000563f, -0.000153f, -0.000274f, -0.000174f, +0.000136f, +0.000041f, -0.000631f, -0.000108f, -0.000053f, +0.000069f, + +0.000060f, +0.000385f, -0.000256f, +0.000651f, +0.000039f, +0.000016f, -0.000086f, +0.000063f, -0.000116f, -0.000048f, + +0.000096f, +0.000100f, -0.000073f, -0.000022f, +0.000092f, -0.000117f, -0.000083f, -0.000169f, +0.000180f, -0.000097f, + +0.000110f, +0.000115f, -0.000005f, -0.000048f, +0.000096f, -0.000064f + }, + { + +0.016168f, -0.035344f, +0.002678f, +0.009884f, +0.001426f, -0.001356f, +0.005031f, +0.004005f, -0.001749f, -0.000682f, + -0.000763f, +0.008610f, -0.003043f, +0.009263f, -0.020696f, -0.001624f, +0.005235f, -0.000515f, +0.001421f, +0.001313f, + -0.000364f, +0.000034f, +0.001058f, -0.000377f, +0.000102f, +0.001141f, -0.001965f, +0.001483f, -0.001338f, -0.003346f, + -0.000498f, +0.000724f, +0.000128f, -0.002018f, +0.001121f, -0.000028f, +0.000421f, -0.001074f, +0.000779f, -0.000343f, + +0.000069f, -0.000054f, -0.000678f, -0.001284f, -0.000078f, +0.000367f, -0.000594f, -0.000714f, +0.001083f, -0.000174f, + +0.000927f, -0.000971f, -0.000288f, +0.000625f, +0.000510f, +0.000105f, -0.000137f, +0.000510f, +0.000838f, -0.000472f, + -0.000090f, +0.000382f, -0.000179f, -0.000069f, +0.000178f, -0.000206f, -0.000186f, -0.000100f, -0.000341f, -0.000029f, + -0.000022f, -0.000135f, +0.000069f, +0.000187f, +0.000291f, -0.000171f, +0.000207f, -0.000118f, -0.000137f, +0.000166f, + -0.000180f, +0.000179f, -0.000138f, -0.000019f, -0.000131f, +0.000039f, +0.000103f, +0.000010f, +0.000132f, -0.000051f, + +0.000110f, +0.000003f, -0.000125f, -0.000022f, +0.000114f, +0.000004f + } + }, + { + { + -0.002966f, -0.017605f, +0.008481f, +0.003496f, +0.000874f, -0.001711f, -0.001170f, -0.000787f, +0.000672f, -0.001703f, + -0.001305f, +0.000937f, +0.000523f, +0.000894f, +0.000363f, +0.002069f, -0.003639f, +0.001123f, +0.002264f, -0.000335f, + +0.003180f, +0.000641f, +0.001467f, +0.003907f, +0.000066f, +0.000347f, -0.002326f, -0.000697f, -0.002506f, -0.002028f, + +0.002441f, +0.002086f, -0.003933f, -0.001028f, -0.000303f, -0.000183f, +0.000466f, +0.000686f, +0.002289f, -0.000377f, + +0.000286f, -0.000143f, -0.000128f, -0.000098f, +0.000873f, +0.000217f, +0.000217f, +0.000307f, -0.000702f, -0.000116f, + +0.000324f, -0.000659f, -0.000464f, -0.000070f, -0.000162f, +0.000516f, -0.000003f, +0.000113f, +0.000057f, -0.001006f, + -0.000227f, +0.000190f, +0.000174f, +0.000451f, +0.000001f, +0.000165f, -0.000079f, +0.000020f, -0.000239f, -0.000034f, + +0.000228f, +0.000063f, +0.000050f, -0.000178f, -0.000151f, +0.000222f, +0.000028f, +0.000012f, -0.000065f, +0.000094f, + +0.000079f, -0.000002f, -0.000104f, +0.000035f, +0.000143f, +0.000091f, -0.000006f, -0.000046f, +0.000049f, +0.000117f, + +0.000020f, -0.000030f, +0.000082f, +0.000101f, +0.000002f, -0.000010f + }, + { + +0.017437f, +0.012091f, -0.014694f, -0.000791f, +0.002262f, -0.001181f, +0.000971f, +0.000361f, +0.000358f, -0.002912f, + -0.001762f, +0.000516f, +0.000411f, +0.000543f, +0.002389f, -0.002258f, -0.001132f, +0.006248f, +0.004654f, -0.000238f, + -0.001784f, +0.000545f, -0.001771f, +0.000719f, +0.000618f, -0.000391f, +0.000758f, -0.001064f, -0.001008f, -0.000517f, + +0.001519f, +0.001047f, -0.000225f, +0.000933f, -0.000919f, +0.002573f, -0.001746f, -0.002036f, +0.000606f, +0.000607f, + -0.001523f, +0.000142f, -0.000278f, +0.000195f, +0.000937f, +0.000646f, +0.000840f, -0.000226f, +0.000485f, -0.000187f, + +0.000665f, -0.000820f, -0.000722f, -0.000387f, -0.000074f, -0.000158f, -0.000154f, +0.000412f, -0.000634f, -0.000338f, + -0.000188f, +0.000114f, +0.000250f, +0.000103f, +0.000039f, +0.000011f, -0.000092f, -0.000044f, +0.000114f, -0.000016f, + +0.000004f, +0.000342f, -0.000016f, -0.000413f, +0.000353f, +0.000171f, -0.000007f, +0.000340f, -0.000030f, -0.000193f, + -0.000019f, -0.000043f, -0.000131f, -0.000046f, -0.000045f, +0.000098f, -0.000089f, -0.000018f, -0.000012f, -0.000055f, + -0.000058f, -0.000087f, -0.000010f, -0.000043f, -0.000016f, -0.000042f + }, + { + +0.001229f, -0.096815f, -0.000442f, -0.022560f, -0.002445f, +0.001439f, -0.001035f, -0.000019f, -0.000375f, +0.002593f, + +0.000845f, +0.002923f, -0.001895f, +0.002189f, -0.001394f, -0.001697f, -0.006199f, +0.000830f, +0.003004f, -0.001153f, + +0.002478f, -0.001618f, +0.001059f, +0.000092f, +0.004380f, +0.002173f, +0.001282f, +0.000780f, -0.003247f, -0.001651f, + +0.001859f, +0.002551f, +0.001412f, +0.000989f, -0.000832f, -0.001512f, +0.001678f, -0.002755f, -0.000891f, -0.000097f, + +0.001129f, -0.001119f, -0.000441f, -0.000282f, -0.000660f, +0.001588f, +0.000830f, -0.000335f, -0.000494f, +0.000904f, + +0.000245f, +0.000441f, -0.000717f, +0.000493f, +0.000734f, -0.000207f, -0.000763f, +0.000026f, +0.000277f, -0.000111f, + -0.000588f, -0.000326f, +0.000101f, -0.000342f, -0.000389f, +0.000314f, +0.000062f, +0.000039f, -0.000200f, -0.000048f, + -0.000241f, -0.000369f, +0.000141f, +0.000138f, +0.000055f, -0.000224f, -0.000032f, +0.000203f, +0.000248f, +0.000080f, + +0.000125f, +0.000051f, -0.000044f, +0.000108f, +0.000102f, -0.000128f, +0.000001f, +0.000037f, +0.000055f, +0.000077f, + -0.000116f, +0.000023f, -0.000015f, -0.000017f, -0.000064f, +0.000069f + }, + { + +0.000906f, +0.007223f, -0.000160f, -0.001399f, -0.000095f, +0.000066f, +0.000064f, +0.000062f, +0.000124f, +0.000121f, + +0.000041f, +0.000155f, +0.000498f, -0.004133f, -0.009944f, +0.005677f, -0.001615f, -0.003731f, +0.003320f, +0.001494f, + +0.000061f, +0.000853f, +0.001537f, -0.000274f, -0.003116f, -0.000812f, +0.000546f, +0.001676f, +0.000719f, +0.001247f, + +0.000127f, +0.001598f, +0.000969f, +0.000332f, +0.000949f, +0.000598f, +0.000393f, -0.001894f, -0.000572f, +0.001268f, + +0.000745f, +0.000709f, +0.000088f, +0.000150f, -0.000016f, -0.000438f, +0.000447f, -0.000758f, -0.000021f, +0.000377f, + +0.001000f, -0.000540f, -0.000104f, -0.000178f, -0.000740f, -0.000032f, +0.000081f, -0.000359f, -0.000067f, +0.000598f, + -0.000249f, +0.000151f, -0.000025f, -0.000619f, -0.000303f, +0.000305f, -0.000087f, -0.000459f, -0.000161f, +0.000107f, + +0.000164f, +0.000035f, -0.000092f, +0.000090f, +0.000126f, -0.000072f, -0.000095f, -0.000071f, +0.000079f, +0.000080f, + +0.000047f, +0.000077f, +0.000041f, +0.000129f, +0.000088f, +0.000135f, -0.000098f, -0.000112f, +0.000011f, -0.000105f, + +0.000050f, -0.000039f, -0.000043f, +0.000007f, +0.000001f, -0.000037f + }, + { + +0.021105f, +0.086112f, +0.005885f, -0.003986f, -0.000094f, -0.000152f, +0.000335f, +0.001965f, +0.001875f, -0.000121f, + -0.003610f, -0.003297f, +0.000662f, -0.001034f, +0.005494f, +0.001111f, -0.002036f, +0.007784f, +0.001795f, -0.000256f, + +0.000850f, +0.001760f, -0.002205f, +0.000176f, -0.000905f, -0.001027f, +0.001731f, -0.001383f, -0.000885f, -0.000744f, + +0.000877f, +0.000391f, -0.000280f, -0.000819f, +0.000415f, -0.000985f, +0.001046f, -0.000243f, +0.000778f, +0.000853f, + +0.000232f, -0.001537f, -0.000900f, +0.001768f, +0.000350f, +0.000211f, +0.000846f, -0.000479f, +0.000067f, +0.000620f, + -0.000526f, -0.000368f, -0.000285f, +0.001052f, -0.000371f, -0.000401f, +0.000328f, +0.000555f, -0.000258f, -0.000077f, + +0.000195f, +0.000167f, -0.000565f, +0.000433f, -0.000170f, -0.000128f, +0.000182f, -0.000379f, -0.000374f, -0.000399f, + +0.000110f, -0.000009f, +0.000136f, -0.000276f, -0.000203f, +0.000134f, -0.000238f, +0.000203f, -0.000024f, -0.000094f, + -0.000000f, +0.000025f, -0.000252f, +0.000065f, +0.000083f, -0.000099f, -0.000047f, +0.000137f, -0.000108f, +0.000007f, + +0.000005f, -0.000012f, +0.000014f, +0.000054f, -0.000054f, +0.000035f + }, + { + -0.000083f, +0.005616f, +0.002323f, +0.000475f, -0.000297f, +0.000040f, -0.000672f, -0.000181f, -0.000699f, +0.000464f, + +0.000326f, +0.000177f, +0.000678f, -0.000785f, +0.002554f, -0.000444f, +0.000303f, +0.001997f, -0.002400f, -0.027170f, + +0.005400f, +0.000757f, +0.001252f, +0.006137f, +0.000929f, +0.000991f, +0.002020f, -0.001928f, +0.000424f, -0.003062f, + +0.001154f, -0.000660f, -0.002308f, -0.001985f, +0.001224f, +0.000108f, +0.001117f, +0.000414f, +0.000698f, -0.000360f, + -0.000885f, +0.000042f, -0.002029f, -0.000570f, -0.000763f, +0.000338f, +0.000004f, +0.000751f, +0.000549f, -0.000872f, + +0.000323f, -0.001068f, +0.000544f, -0.000092f, -0.000190f, +0.000129f, -0.000216f, +0.000053f, -0.000148f, +0.000051f, + +0.000373f, -0.000333f, +0.000021f, +0.000194f, -0.000439f, -0.000005f, +0.000123f, -0.000045f, -0.000009f, +0.000175f, + -0.000028f, +0.000047f, +0.000214f, -0.000113f, -0.000190f, +0.000026f, -0.000116f, -0.000052f, +0.000040f, +0.000025f, + -0.000149f, +0.000033f, -0.000031f, -0.000026f, +0.000083f, -0.000046f, -0.000085f, -0.000061f, -0.000072f, -0.000066f, + +0.000142f, -0.000042f, -0.000204f, -0.000045f, -0.000028f, -0.000041f + }, + { + +0.046170f, +0.013052f, +0.000054f, +0.006919f, +0.000018f, -0.000157f, +0.000484f, +0.000663f, +0.000089f, -0.000438f, + +0.000866f, -0.000128f, -0.001332f, -0.000638f, -0.002148f, +0.000860f, -0.000584f, +0.000746f, +0.001540f, +0.000742f, + +0.000978f, +0.001094f, +0.001009f, +0.000296f, -0.001022f, +0.000743f, -0.000840f, +0.000621f, +0.000412f, -0.001345f, + -0.000732f, -0.002300f, -0.000570f, +0.000296f, +0.000490f, +0.001406f, +0.001615f, -0.002198f, -0.000256f, +0.000674f, + +0.000114f, -0.000947f, +0.000115f, +0.000623f, -0.000006f, +0.000440f, +0.000556f, -0.001244f, +0.000805f, +0.000283f, + -0.000058f, -0.000493f, -0.000344f, +0.000228f, -0.000059f, -0.001099f, -0.000174f, -0.000021f, -0.000085f, -0.000043f, + +0.000146f, +0.000141f, -0.000154f, +0.000021f, +0.000023f, -0.000367f, -0.000204f, +0.000370f, -0.000039f, +0.000266f, + +0.000100f, +0.000379f, -0.000313f, -0.000102f, +0.000300f, +0.000086f, -0.000064f, -0.000215f, +0.000040f, +0.000038f, + +0.000150f, -0.000025f, -0.000092f, +0.000014f, +0.000085f, -0.000126f, -0.000037f, +0.000162f, +0.000118f, -0.000007f, + -0.000081f, -0.000041f, +0.000055f, +0.000101f, +0.000014f, -0.000073f + }, + { + +0.000633f, +0.000509f, +0.001573f, -0.000804f, +0.000929f, +0.000242f, +0.000310f, +0.000719f, -0.000945f, -0.000160f, + +0.000372f, +0.000646f, -0.001509f, -0.001397f, -0.005074f, +0.000567f, +0.000651f, +0.002340f, -0.001488f, +0.001725f, + -0.002290f, -0.000776f, +0.002103f, -0.000367f, -0.000848f, +0.002602f, +0.001597f, -0.002338f, -0.003419f, +0.002038f, + -0.001537f, +0.000967f, -0.001563f, -0.000526f, +0.000882f, -0.000328f, -0.000712f, +0.001833f, +0.000309f, -0.000794f, + -0.000782f, -0.000509f, +0.000436f, +0.000657f, -0.000398f, +0.000445f, -0.000681f, +0.001292f, +0.000901f, -0.000001f, + -0.000326f, +0.000085f, +0.000287f, -0.000349f, -0.000493f, -0.000592f, -0.000596f, +0.000677f, +0.000599f, -0.000066f, + +0.000147f, -0.000248f, +0.000606f, -0.000202f, +0.000136f, -0.000032f, -0.000206f, -0.000025f, +0.000257f, -0.000195f, + +0.000021f, +0.000067f, -0.000013f, +0.000337f, -0.000248f, -0.000200f, -0.000005f, -0.000066f, -0.000119f, -0.000059f, + +0.000140f, +0.000047f, +0.000005f, -0.000085f, -0.000234f, +0.000008f, -0.000055f, -0.000001f, -0.000037f, -0.000121f, + +0.000021f, -0.000035f, -0.000099f, +0.000012f, +0.000014f, +0.000057f + }, + { + -0.012511f, +0.101740f, +0.001025f, +0.003861f, +0.002297f, -0.000859f, +0.000406f, +0.000432f, -0.000090f, -0.000318f, + -0.001217f, +0.000027f, -0.000451f, -0.004351f, +0.001701f, -0.000719f, +0.000697f, +0.001712f, -0.000734f, -0.001295f, + +0.000668f, +0.000992f, -0.000161f, +0.000867f, +0.001012f, -0.000434f, +0.000315f, +0.003364f, -0.001606f, -0.000298f, + -0.000170f, +0.001067f, -0.000955f, +0.000548f, -0.000737f, +0.000378f, +0.001413f, +0.000819f, -0.002109f, +0.000269f, + -0.001981f, +0.000502f, -0.001109f, -0.000360f, +0.000000f, -0.001379f, -0.001239f, +0.001740f, +0.001231f, -0.000196f, + -0.000934f, -0.000943f, +0.000594f, +0.000255f, +0.000389f, +0.000870f, +0.000101f, -0.000019f, +0.000187f, +0.000199f, + -0.000393f, -0.000007f, -0.000081f, -0.000339f, +0.000179f, +0.000018f, +0.000085f, +0.000055f, +0.000089f, -0.000070f, + -0.000056f, +0.000061f, +0.000037f, -0.000027f, +0.000249f, +0.000256f, +0.000037f, -0.000020f, +0.000130f, +0.000172f, + -0.000075f, -0.000011f, +0.000116f, +0.000145f, +0.000040f, -0.000090f, -0.000091f, +0.000075f, -0.000070f, +0.000051f, + +0.000056f, -0.000015f, +0.000009f, -0.000126f, +0.000040f, +0.000037f + }, + { + +0.001506f, +0.008673f, -0.008098f, +0.002980f, +0.005426f, -0.000807f, +0.007645f, +0.002003f, +0.000263f, +0.001547f, + +0.001570f, +0.000828f, +0.000651f, +0.001328f, -0.009727f, +0.000772f, -0.001783f, +0.001836f, -0.003174f, +0.005679f, + +0.001659f, +0.002923f, -0.002027f, -0.002287f, -0.001629f, -0.000319f, -0.001418f, +0.000332f, -0.000305f, -0.001751f, + +0.001809f, +0.000673f, -0.001505f, -0.000122f, +0.000041f, +0.000633f, -0.002110f, -0.000545f, +0.000317f, -0.000011f, + +0.000478f, -0.000853f, -0.000451f, +0.000654f, -0.000434f, +0.000467f, +0.000031f, +0.000480f, +0.000279f, -0.000315f, + -0.000683f, +0.000532f, -0.000270f, -0.000589f, +0.000556f, +0.000020f, -0.000216f, -0.000265f, -0.000470f, -0.000076f, + +0.000109f, -0.000367f, +0.000220f, -0.000140f, +0.000129f, +0.000341f, -0.000118f, -0.000184f, -0.000177f, +0.000134f, + +0.000330f, -0.000022f, +0.000161f, -0.000097f, -0.000035f, +0.000041f, +0.000173f, -0.000078f, +0.000192f, -0.000021f, + +0.000188f, +0.000024f, +0.000007f, -0.000024f, +0.000010f, -0.000091f, +0.000070f, +0.000020f, +0.000033f, -0.000019f, + +0.000023f, -0.000037f, -0.000031f, -0.000000f, +0.000012f, +0.000024f + }, + { + -0.014379f, -0.006611f, +0.007433f, +0.001811f, -0.002977f, -0.000746f, -0.007571f, +0.002484f, +0.001591f, +0.002139f, + +0.001234f, -0.000048f, +0.000739f, -0.000650f, +0.002193f, +0.007547f, +0.005559f, +0.002905f, +0.004033f, -0.001324f, + -0.001430f, +0.000243f, +0.000242f, -0.001560f, +0.000352f, -0.000052f, +0.000706f, +0.000336f, -0.001636f, -0.000660f, + +0.001175f, +0.001573f, -0.000697f, -0.001923f, +0.002287f, +0.000230f, -0.000057f, +0.001280f, +0.001416f, -0.000725f, + +0.000269f, +0.000871f, +0.000700f, +0.001149f, +0.000272f, +0.000360f, +0.000106f, +0.000193f, +0.000688f, -0.000479f, + +0.000050f, -0.000170f, -0.000472f, +0.000125f, +0.000520f, -0.000298f, -0.000103f, -0.000158f, +0.000441f, +0.000410f, + -0.000135f, +0.000255f, -0.000029f, +0.000143f, +0.000146f, +0.000196f, +0.000186f, +0.000229f, +0.000013f, +0.000024f, + +0.000276f, -0.000111f, -0.000183f, -0.000046f, -0.000104f, -0.000178f, -0.000159f, +0.000176f, +0.000130f, -0.000082f, + +0.000036f, +0.000032f, +0.000006f, -0.000135f, +0.000065f, -0.000042f, -0.000052f, +0.000039f, +0.000049f, +0.000017f, + -0.000083f, -0.000001f, +0.000058f, +0.000046f, -0.000095f, -0.000048f + }, + { + -0.000387f, +0.010448f, -0.000717f, -0.005202f, +0.000505f, +0.001846f, -0.000179f, -0.000470f, +0.000240f, -0.000483f, + +0.000139f, +0.001853f, -0.002657f, -0.004468f, +0.004521f, -0.001857f, +0.000846f, -0.005392f, +0.001652f, -0.001687f, + -0.003010f, -0.003768f, +0.001034f, +0.000996f, -0.000843f, +0.002912f, +0.001128f, +0.000583f, +0.001111f, -0.001009f, + +0.000744f, -0.001264f, +0.000682f, +0.000283f, +0.000036f, -0.000764f, +0.000548f, -0.000113f, +0.000047f, -0.000329f, + +0.000250f, +0.000053f, +0.000191f, +0.000521f, -0.000745f, +0.000280f, -0.000404f, -0.000626f, -0.000493f, -0.000484f, + -0.000602f, +0.000620f, +0.000189f, +0.000361f, -0.000011f, +0.000011f, +0.000283f, +0.000166f, -0.000395f, -0.000001f, + -0.000587f, +0.000247f, +0.000263f, +0.000302f, +0.000006f, -0.000326f, +0.000160f, +0.000064f, -0.000174f, -0.000216f, + -0.000521f, -0.000254f, -0.000145f, -0.000036f, -0.000061f, -0.000025f, +0.000089f, +0.000019f, +0.000076f, +0.000146f, + -0.000082f, +0.000035f, +0.000122f, -0.000028f, -0.000058f, -0.000016f, +0.000025f, -0.000018f, -0.000034f, -0.000060f, + -0.000087f, -0.000036f, +0.000079f, +0.000014f, -0.000033f, +0.000006f + }, + { + -0.003791f, +0.027693f, +0.005085f, -0.002136f, -0.004259f, +0.000137f, +0.003315f, +0.000054f, +0.000692f, -0.001680f, + -0.000297f, -0.001477f, +0.004916f, +0.015190f, +0.001590f, -0.001494f, -0.001376f, +0.001700f, +0.000001f, -0.001473f, + +0.001464f, -0.000345f, -0.000393f, -0.000686f, -0.001194f, -0.003101f, +0.000535f, -0.002964f, +0.000874f, +0.002231f, + +0.001031f, -0.000936f, +0.001596f, +0.000678f, -0.000217f, -0.001542f, +0.001069f, +0.000566f, -0.000094f, +0.000601f, + -0.001532f, +0.000181f, -0.000361f, +0.000422f, -0.000207f, +0.000286f, +0.000206f, -0.000147f, -0.000307f, +0.000706f, + +0.000401f, -0.000695f, +0.000549f, +0.000341f, +0.000189f, +0.000572f, -0.000522f, -0.000003f, +0.000165f, -0.000128f, + -0.000037f, +0.000056f, +0.000417f, +0.000038f, +0.000428f, +0.000407f, -0.000015f, +0.000264f, -0.000004f, +0.000235f, + +0.000042f, +0.000173f, +0.000036f, -0.000261f, -0.000105f, -0.000087f, +0.000043f, -0.000210f, -0.000124f, -0.000033f, + +0.000261f, +0.000186f, +0.000015f, -0.000222f, -0.000220f, +0.000126f, +0.000057f, +0.000095f, +0.000011f, +0.000084f, + +0.000083f, +0.000149f, -0.000086f, +0.000051f, -0.000043f, -0.000039f + }, + { + -0.000050f, +0.004590f, +0.002894f, +0.000912f, -0.000402f, +0.001260f, -0.000045f, -0.001366f, -0.001209f, +0.001151f, + +0.000166f, +0.001016f, -0.001261f, +0.022114f, +0.013520f, +0.001077f, -0.000148f, -0.002865f, +0.003975f, -0.005160f, + -0.009743f, -0.002138f, +0.001287f, +0.002717f, -0.001469f, -0.002787f, +0.002088f, -0.000959f, -0.000411f, -0.002142f, + +0.003296f, +0.000486f, +0.000908f, +0.001061f, +0.001667f, +0.001264f, +0.001085f, -0.000428f, +0.000080f, +0.000346f, + -0.000068f, +0.000673f, -0.000247f, -0.000891f, +0.000234f, +0.000579f, +0.000081f, +0.000461f, -0.000363f, +0.000123f, + -0.000081f, +0.000003f, -0.000270f, +0.000340f, +0.000224f, +0.000387f, +0.000077f, -0.000094f, -0.000060f, +0.000151f, + +0.000045f, -0.000369f, +0.000053f, -0.000085f, -0.000185f, -0.000000f, -0.000588f, -0.000386f, +0.000145f, -0.000100f, + +0.000054f, +0.000312f, -0.000048f, +0.000359f, +0.000204f, -0.000035f, +0.000101f, -0.000144f, -0.000044f, +0.000005f, + -0.000034f, +0.000081f, +0.000054f, +0.000091f, +0.000075f, -0.000010f, -0.000140f, -0.000014f, +0.000161f, +0.000091f, + -0.000088f, +0.000001f, +0.000062f, +0.000006f, -0.000065f, +0.000013f + }, + { + -0.009930f, +0.001101f, +0.003178f, +0.010711f, +0.000477f, -0.002527f, -0.000630f, +0.002108f, +0.001741f, +0.002987f, + -0.002296f, +0.003084f, -0.002151f, -0.005120f, +0.006805f, -0.003983f, -0.005167f, -0.000584f, +0.001240f, +0.002987f, + -0.000271f, -0.000117f, +0.000806f, -0.000273f, -0.000733f, +0.002396f, -0.002209f, -0.001634f, -0.001771f, -0.001929f, + +0.000006f, +0.000107f, -0.001178f, +0.000668f, -0.000252f, +0.001113f, +0.001005f, +0.000082f, -0.000087f, -0.000533f, + -0.000339f, +0.000085f, -0.000418f, +0.000173f, -0.000426f, +0.000313f, -0.001075f, -0.000356f, -0.000066f, +0.000190f, + +0.000485f, -0.000747f, -0.000034f, -0.000217f, +0.000255f, -0.000114f, +0.000153f, +0.000564f, +0.000240f, -0.000092f, + +0.000272f, +0.000444f, +0.000119f, -0.000061f, -0.000215f, -0.000144f, -0.000073f, +0.000005f, -0.000016f, -0.000090f, + +0.000028f, +0.000064f, +0.000102f, -0.000005f, -0.000274f, +0.000390f, -0.000048f, +0.000014f, -0.000024f, -0.000021f, + +0.000039f, -0.000031f, -0.000072f, -0.000042f, -0.000012f, -0.000027f, +0.000001f, -0.000169f, +0.000174f, +0.000039f, + -0.000059f, +0.000082f, -0.000089f, -0.000046f, -0.000006f, +0.000013f + } + }, + { + { + +0.002467f, -0.027596f, -0.007297f, +0.002037f, -0.000172f, -0.001550f, -0.000683f, -0.001097f, +0.000163f, +0.000789f, + +0.000596f, +0.001710f, +0.002137f, -0.000199f, +0.002789f, +0.004666f, -0.002753f, -0.000643f, +0.000835f, -0.001830f, + +0.005316f, -0.000074f, -0.000768f, +0.004009f, -0.000276f, +0.004190f, +0.000910f, -0.000608f, -0.001471f, -0.001173f, + -0.003068f, -0.001121f, -0.003678f, +0.000458f, +0.001665f, +0.001003f, +0.000128f, -0.000233f, -0.000437f, -0.000495f, + +0.000774f, -0.000007f, +0.000527f, +0.000067f, +0.001237f, +0.000435f, +0.000310f, -0.000085f, -0.000608f, +0.000571f, + +0.000296f, -0.000447f, -0.000370f, -0.000017f, -0.000732f, +0.000115f, -0.000015f, -0.000024f, +0.000442f, -0.000187f, + +0.000347f, -0.000015f, -0.000333f, +0.000060f, -0.000282f, +0.000003f, -0.000274f, +0.000010f, +0.000013f, -0.000329f, + +0.000079f, +0.000090f, +0.000041f, +0.000262f, +0.000069f, +0.000293f, -0.000028f, -0.000011f, -0.000168f, +0.000032f, + -0.000002f, +0.000038f, -0.000080f, -0.000019f, -0.000105f, -0.000016f, +0.000052f, -0.000114f, -0.000043f, +0.000049f, + +0.000104f, -0.000088f, +0.000025f, -0.000015f, -0.000051f, +0.000072f + }, + { + -0.017038f, -0.037529f, -0.008881f, -0.002559f, +0.000061f, +0.000606f, -0.000528f, -0.000234f, +0.002086f, -0.001037f, + -0.000215f, +0.001142f, -0.000449f, -0.000564f, +0.000764f, -0.001732f, +0.001423f, +0.000894f, -0.002776f, +0.001580f, + -0.001472f, +0.000227f, -0.000454f, +0.000245f, +0.000985f, -0.000346f, +0.000660f, +0.000844f, +0.000763f, +0.000424f, + +0.002183f, -0.000276f, -0.002224f, +0.000077f, +0.000707f, +0.001720f, -0.000584f, -0.000498f, +0.000843f, +0.000072f, + -0.000747f, +0.000425f, -0.000160f, +0.000161f, +0.000927f, -0.000590f, +0.000992f, -0.000471f, +0.000739f, -0.000469f, + +0.000352f, +0.000136f, -0.000578f, -0.000384f, +0.000122f, -0.000224f, -0.000433f, -0.000299f, -0.000091f, +0.000078f, + -0.000015f, -0.000366f, -0.000044f, -0.000052f, -0.000059f, +0.000324f, -0.000003f, -0.000323f, +0.000088f, -0.000213f, + -0.000045f, +0.000060f, +0.000007f, -0.000364f, +0.000045f, +0.000151f, -0.000312f, +0.000133f, -0.000070f, +0.000090f, + +0.000141f, -0.000229f, -0.000050f, +0.000001f, -0.000164f, -0.000135f, +0.000178f, -0.000082f, +0.000048f, -0.000084f, + +0.000081f, -0.000007f, +0.000039f, -0.000088f, +0.000019f, -0.000023f + }, + { + -0.004945f, -0.086014f, +0.014126f, -0.009736f, +0.000321f, +0.000646f, +0.000087f, -0.000410f, -0.000843f, +0.000341f, + -0.001192f, +0.000870f, -0.002057f, +0.005891f, +0.004307f, +0.000267f, -0.000728f, +0.003372f, +0.000677f, +0.000252f, + +0.003969f, -0.002582f, -0.000232f, -0.002017f, +0.002666f, +0.000107f, -0.001066f, -0.000214f, -0.001430f, -0.000828f, + +0.001360f, +0.001238f, +0.000816f, -0.000454f, -0.000639f, -0.000484f, +0.001467f, -0.001534f, -0.000633f, -0.000107f, + +0.001165f, -0.001311f, +0.000032f, -0.000056f, -0.000998f, -0.000108f, +0.000862f, +0.000278f, -0.000072f, +0.000328f, + -0.000450f, +0.000101f, -0.000492f, +0.000349f, +0.000196f, -0.000048f, -0.000343f, -0.000146f, +0.000681f, +0.000320f, + -0.000033f, +0.000205f, +0.000049f, -0.000442f, -0.000247f, +0.000248f, -0.000052f, +0.000155f, +0.000073f, -0.000044f, + -0.000146f, -0.000169f, -0.000042f, +0.000073f, -0.000034f, -0.000089f, +0.000001f, +0.000011f, -0.000017f, +0.000073f, + -0.000057f, -0.000123f, -0.000011f, -0.000205f, +0.000089f, +0.000136f, +0.000061f, +0.000087f, +0.000027f, -0.000014f, + +0.000006f, -0.000070f, -0.000035f, -0.000068f, -0.000005f, +0.000099f + }, + { + -0.000860f, +0.005860f, +0.001532f, -0.000235f, -0.000393f, +0.000116f, -0.000183f, +0.000199f, +0.000498f, -0.000611f, + -0.000304f, -0.000936f, +0.000147f, +0.001326f, -0.009130f, +0.003685f, +0.001889f, +0.001034f, +0.007376f, +0.001487f, + -0.001123f, +0.000447f, -0.001053f, -0.001176f, -0.002041f, +0.000676f, +0.002924f, +0.000932f, -0.000514f, +0.000438f, + -0.000941f, +0.000641f, +0.000246f, -0.000439f, +0.001126f, +0.000706f, -0.000436f, -0.000144f, +0.000590f, +0.000055f, + -0.000042f, +0.000226f, -0.000888f, -0.000075f, +0.000064f, -0.000217f, +0.000345f, -0.000446f, +0.000434f, -0.000332f, + +0.000430f, -0.000145f, -0.000124f, +0.000149f, +0.000051f, -0.000008f, +0.000157f, +0.000282f, -0.000351f, +0.000499f, + -0.000153f, +0.000341f, +0.000270f, -0.000026f, -0.000102f, +0.000066f, -0.000012f, -0.000092f, +0.000027f, -0.000179f, + +0.000043f, +0.000289f, -0.000016f, -0.000007f, -0.000078f, +0.000080f, +0.000051f, +0.000012f, -0.000068f, -0.000045f, + -0.000094f, -0.000008f, -0.000160f, +0.000090f, -0.000064f, +0.000050f, +0.000083f, -0.000004f, +0.000027f, -0.000074f, + +0.000125f, +0.000058f, -0.000044f, -0.000080f, +0.000013f, -0.000075f + }, + { + -0.022418f, +0.023156f, +0.005724f, -0.000984f, -0.000751f, -0.000564f, -0.001015f, +0.000406f, +0.000524f, -0.000197f, + +0.000851f, -0.000139f, +0.001672f, -0.000929f, +0.001667f, -0.000117f, +0.001204f, +0.010013f, +0.000335f, +0.000054f, + +0.002562f, +0.001895f, -0.001393f, -0.000403f, +0.001327f, -0.001460f, +0.000818f, -0.001347f, +0.000860f, -0.000478f, + +0.001097f, +0.000450f, -0.000101f, -0.000730f, -0.000170f, -0.001012f, +0.001999f, +0.001164f, +0.000717f, -0.000544f, + +0.000715f, +0.000124f, -0.000769f, +0.000221f, -0.000031f, +0.000223f, -0.000242f, -0.000181f, +0.000069f, -0.000003f, + +0.000100f, +0.000093f, -0.000922f, +0.000515f, -0.001162f, -0.000980f, -0.000315f, +0.000385f, -0.000179f, +0.000104f, + +0.000065f, +0.000234f, -0.000313f, +0.000093f, -0.000333f, +0.000167f, +0.000211f, -0.000183f, +0.000117f, -0.000256f, + +0.000042f, -0.000091f, +0.000206f, +0.000100f, -0.000038f, -0.000091f, -0.000076f, +0.000019f, +0.000096f, +0.000087f, + -0.000051f, -0.000061f, -0.000068f, -0.000042f, +0.000049f, -0.000070f, -0.000020f, +0.000177f, -0.000115f, +0.000047f, + -0.000018f, +0.000084f, +0.000003f, +0.000004f, +0.000024f, +0.000044f + }, + { + +0.000613f, +0.007622f, -0.001441f, -0.000810f, -0.000025f, +0.000341f, -0.000386f, +0.000081f, -0.000003f, +0.000101f, + -0.000740f, +0.000360f, -0.000098f, -0.000758f, +0.005855f, +0.002253f, -0.004274f, +0.001057f, +0.004503f, -0.023396f, + -0.000918f, -0.001571f, -0.001361f, +0.001329f, +0.000922f, +0.000965f, -0.000879f, -0.002297f, +0.001438f, -0.000183f, + +0.002815f, -0.000157f, -0.000051f, -0.000171f, +0.001194f, -0.001239f, -0.000277f, -0.001357f, -0.000099f, -0.000395f, + -0.000063f, +0.000267f, -0.000389f, +0.000474f, -0.001056f, +0.000031f, -0.000387f, -0.000001f, -0.000081f, -0.000777f, + +0.000943f, -0.000500f, +0.000015f, +0.000164f, +0.000178f, -0.000326f, -0.000478f, +0.000069f, -0.000324f, -0.000161f, + +0.000141f, -0.000158f, +0.000358f, +0.000130f, -0.000241f, +0.000123f, +0.000153f, +0.000241f, +0.000158f, +0.000166f, + +0.000240f, -0.000067f, -0.000075f, +0.000007f, +0.000093f, +0.000025f, -0.000041f, -0.000013f, +0.000077f, -0.000032f, + -0.000002f, -0.000067f, -0.000041f, -0.000070f, +0.000192f, -0.000001f, -0.000006f, -0.000020f, -0.000014f, -0.000076f, + +0.000102f, +0.000060f, -0.000014f, -0.000068f, -0.000016f, -0.000063f + }, + { + -0.025877f, -0.085914f, +0.001838f, +0.006538f, -0.000345f, -0.000023f, +0.000721f, -0.000400f, -0.001290f, -0.000626f, + +0.001110f, +0.000131f, +0.001341f, +0.001947f, -0.000270f, +0.000197f, -0.000598f, +0.000168f, -0.000869f, +0.000564f, + +0.000424f, +0.000356f, +0.000049f, -0.000363f, -0.000507f, +0.000571f, -0.000006f, +0.000664f, +0.000374f, -0.000162f, + +0.000410f, -0.000172f, +0.000208f, +0.000238f, -0.000023f, -0.001488f, -0.000024f, -0.001562f, +0.001114f, +0.000635f, + -0.000234f, -0.000799f, -0.000689f, +0.000890f, +0.000289f, -0.000201f, +0.000162f, -0.000423f, +0.001009f, -0.000312f, + +0.000393f, -0.000239f, -0.000058f, -0.000226f, +0.000326f, -0.000119f, +0.000130f, +0.000090f, +0.000132f, +0.000175f, + -0.000237f, -0.000423f, +0.000120f, +0.000328f, +0.000168f, -0.000286f, -0.000293f, +0.000024f, +0.000057f, +0.000250f, + -0.000305f, +0.000419f, +0.000064f, -0.000361f, -0.000038f, +0.000108f, +0.000128f, -0.000161f, +0.000155f, +0.000145f, + -0.000112f, -0.000059f, -0.000016f, -0.000041f, +0.000030f, +0.000110f, -0.000012f, -0.000039f, +0.000043f, +0.000046f, + -0.000020f, -0.000130f, +0.000078f, +0.000069f, +0.000055f, -0.000088f + }, + { + +0.000625f, -0.002649f, -0.001716f, +0.000108f, -0.000131f, +0.000345f, +0.000042f, +0.000688f, -0.000241f, -0.000286f, + -0.000037f, +0.000024f, -0.000009f, -0.003284f, -0.012393f, -0.003496f, -0.001843f, +0.004436f, -0.001695f, -0.000489f, + -0.003251f, +0.002293f, +0.001853f, +0.000274f, -0.002495f, -0.003226f, -0.000127f, -0.002509f, -0.003830f, +0.001707f, + -0.002128f, +0.000983f, +0.000564f, +0.000285f, +0.000221f, -0.000062f, -0.000838f, +0.001292f, +0.000072f, -0.000569f, + +0.000186f, -0.000348f, -0.000677f, +0.000360f, +0.000354f, +0.000440f, -0.000950f, -0.000267f, +0.000589f, +0.000225f, + -0.000260f, -0.000300f, +0.000211f, -0.000083f, -0.000359f, -0.000044f, -0.000246f, +0.000254f, -0.000354f, -0.000023f, + +0.000335f, -0.000278f, +0.000226f, -0.000178f, +0.000058f, +0.000222f, +0.000344f, -0.000004f, -0.000050f, -0.000056f, + +0.000037f, -0.000083f, -0.000039f, +0.000320f, -0.000126f, +0.000045f, +0.000260f, -0.000025f, -0.000111f, +0.000023f, + -0.000056f, +0.000014f, +0.000001f, +0.000130f, +0.000036f, +0.000028f, -0.000005f, -0.000097f, +0.000006f, -0.000006f, + -0.000107f, +0.000016f, -0.000028f, +0.000018f, -0.000047f, -0.000051f + }, + { + -0.002854f, +0.105206f, -0.003202f, +0.002725f, +0.001013f, -0.001353f, -0.000570f, -0.000976f, +0.001348f, +0.000051f, + -0.002071f, +0.000966f, -0.000017f, +0.000855f, +0.000943f, +0.001405f, +0.001813f, +0.000868f, +0.000021f, -0.000140f, + +0.000615f, -0.000448f, +0.000954f, +0.000272f, -0.000709f, -0.000176f, -0.001074f, +0.000903f, -0.001980f, +0.000624f, + +0.001013f, +0.000178f, -0.001649f, +0.000819f, -0.000299f, +0.000650f, +0.000950f, +0.001625f, -0.001500f, -0.001797f, + -0.002620f, -0.000294f, -0.000905f, +0.000929f, +0.000595f, +0.000131f, -0.000375f, +0.000371f, +0.000658f, +0.000432f, + -0.000410f, -0.000705f, +0.000207f, -0.000083f, -0.000849f, -0.000064f, +0.000481f, +0.000152f, +0.000008f, +0.000434f, + -0.000034f, +0.000099f, +0.000141f, -0.000520f, +0.000012f, +0.000243f, -0.000095f, -0.000441f, +0.000118f, +0.000214f, + -0.000013f, -0.000059f, +0.000125f, -0.000035f, +0.000063f, -0.000102f, +0.000170f, -0.000151f, +0.000060f, +0.000053f, + +0.000128f, +0.000008f, +0.000003f, +0.000044f, -0.000081f, +0.000106f, +0.000114f, -0.000004f, -0.000161f, -0.000051f, + -0.000073f, -0.000011f, +0.000005f, +0.000083f, -0.000046f, -0.000006f + }, + { + -0.000973f, +0.002776f, -0.001037f, +0.002972f, +0.000721f, -0.001200f, +0.003138f, +0.001585f, -0.000257f, -0.000216f, + -0.000340f, -0.000501f, +0.000520f, +0.003540f, -0.001680f, +0.005002f, -0.000205f, +0.004848f, -0.000829f, +0.000851f, + -0.001459f, +0.002555f, +0.001374f, -0.000480f, -0.001221f, -0.000272f, +0.000191f, +0.001346f, +0.000127f, -0.000298f, + -0.000722f, +0.002254f, -0.000545f, -0.001203f, -0.000117f, +0.001880f, -0.000937f, -0.000744f, -0.000250f, +0.000015f, + +0.000436f, -0.000468f, -0.000434f, +0.000640f, +0.001261f, -0.000057f, -0.000668f, +0.000102f, +0.000538f, +0.000177f, + -0.001153f, +0.000177f, +0.000079f, -0.000606f, +0.000010f, +0.000554f, -0.000117f, -0.000021f, -0.000295f, -0.000189f, + -0.000075f, -0.000200f, +0.000444f, +0.000096f, +0.000037f, +0.000354f, -0.000023f, -0.000109f, +0.000054f, -0.000180f, + +0.000093f, -0.000087f, -0.000017f, +0.000256f, +0.000036f, -0.000134f, +0.000219f, -0.000065f, +0.000128f, +0.000072f, + +0.000194f, -0.000022f, +0.000001f, -0.000063f, +0.000052f, -0.000129f, -0.000007f, +0.000059f, +0.000014f, +0.000042f, + -0.000045f, +0.000004f, -0.000130f, -0.000009f, +0.000027f, -0.000032f + }, + { + +0.010405f, +0.015225f, +0.000572f, +0.004955f, +0.001066f, -0.000633f, -0.014143f, -0.000016f, -0.000036f, +0.003177f, + +0.001046f, +0.000366f, +0.000247f, -0.000433f, +0.000805f, +0.003157f, -0.002214f, -0.002794f, +0.002023f, -0.000245f, + -0.001257f, +0.001570f, -0.000796f, -0.001632f, -0.001460f, -0.001337f, +0.000241f, +0.000748f, -0.000050f, +0.000747f, + -0.000453f, +0.000171f, +0.000954f, -0.001157f, +0.000670f, -0.001220f, +0.001595f, -0.000044f, +0.000167f, -0.000822f, + -0.000347f, -0.000750f, +0.000045f, +0.000084f, +0.000138f, +0.001221f, +0.000285f, -0.000557f, +0.000047f, +0.000374f, + +0.000407f, -0.000004f, -0.000251f, -0.000310f, +0.000231f, -0.000417f, +0.000123f, -0.000153f, -0.000064f, +0.000459f, + -0.000182f, -0.000153f, -0.000187f, +0.000088f, +0.000092f, -0.000075f, +0.000207f, +0.000153f, -0.000072f, -0.000234f, + +0.000165f, -0.000072f, -0.000065f, -0.000042f, -0.000181f, -0.000006f, -0.000203f, -0.000003f, +0.000133f, -0.000231f, + +0.000064f, +0.000063f, -0.000080f, +0.000090f, -0.000011f, +0.000076f, -0.000081f, +0.000075f, -0.000060f, +0.000017f, + -0.000010f, +0.000005f, -0.000025f, +0.000044f, +0.000050f, -0.000039f + }, + { + +0.000589f, +0.008261f, -0.002108f, -0.003899f, +0.001513f, -0.000719f, +0.000107f, +0.000200f, -0.000136f, -0.000826f, + -0.000611f, -0.000075f, +0.003233f, +0.005540f, -0.000143f, -0.000490f, +0.004708f, -0.002932f, +0.002046f, +0.000920f, + +0.002368f, +0.002865f, -0.001004f, -0.000897f, -0.004113f, +0.000376f, +0.002057f, -0.000856f, +0.001090f, -0.000534f, + -0.001270f, +0.001185f, -0.000138f, +0.000423f, +0.000706f, -0.000599f, -0.000142f, +0.000193f, -0.000205f, -0.000039f, + +0.000144f, +0.000506f, +0.000884f, +0.000547f, -0.000673f, +0.000767f, +0.000150f, +0.000463f, +0.000190f, +0.000387f, + -0.000088f, +0.000257f, +0.000278f, +0.000237f, -0.000121f, -0.000461f, -0.000686f, -0.000134f, +0.000459f, +0.000499f, + +0.000077f, +0.000257f, -0.000298f, -0.000039f, +0.000283f, -0.000115f, -0.000288f, +0.000262f, -0.000083f, +0.000025f, + -0.000163f, +0.000110f, +0.000043f, -0.000088f, +0.000019f, +0.000009f, -0.000104f, -0.000126f, +0.000036f, +0.000006f, + +0.000062f, -0.000086f, +0.000029f, +0.000111f, +0.000050f, +0.000067f, +0.000060f, +0.000064f, +0.000014f, +0.000030f, + -0.000003f, +0.000026f, +0.000007f, -0.000088f, +0.000058f, -0.000035f + }, + { + -0.002038f, +0.019957f, -0.000654f, -0.005187f, -0.000888f, +0.000302f, -0.001982f, +0.000722f, +0.001758f, +0.000285f, + +0.000180f, -0.001618f, -0.003970f, -0.002339f, -0.001953f, -0.001367f, +0.000180f, +0.002312f, -0.000921f, -0.000068f, + -0.000559f, +0.000532f, -0.000216f, +0.000350f, +0.000297f, -0.000201f, +0.003029f, -0.001799f, +0.001454f, +0.001770f, + +0.000599f, -0.002106f, +0.000942f, +0.001151f, +0.000839f, -0.000717f, +0.001010f, +0.000754f, +0.000019f, -0.000440f, + -0.001467f, +0.000160f, +0.000158f, +0.001164f, +0.000887f, +0.000582f, +0.000574f, -0.000738f, +0.000132f, +0.000825f, + +0.000188f, -0.000681f, +0.000012f, +0.000454f, -0.000032f, +0.000177f, -0.000541f, -0.000503f, -0.000197f, +0.000199f, + -0.000054f, +0.000175f, -0.000005f, +0.000066f, -0.000066f, -0.000002f, +0.000009f, +0.000196f, +0.000010f, +0.000049f, + -0.000117f, +0.000261f, +0.000192f, -0.000268f, -0.000107f, -0.000065f, +0.000033f, +0.000264f, -0.000065f, +0.000041f, + -0.000190f, -0.000099f, +0.000092f, +0.000089f, -0.000147f, -0.000121f, -0.000016f, +0.000111f, -0.000095f, -0.000007f, + +0.000053f, +0.000110f, -0.000007f, -0.000052f, -0.000020f, -0.000051f + }, + { + -0.000277f, +0.001464f, +0.000616f, +0.001617f, -0.000795f, +0.000464f, +0.000128f, -0.000190f, -0.000883f, +0.000118f, + -0.000251f, +0.002015f, +0.000602f, +0.000740f, -0.025677f, +0.000989f, +0.003564f, -0.003990f, +0.004623f, +0.002743f, + -0.000585f, +0.000371f, +0.000941f, +0.001363f, -0.002214f, -0.000804f, -0.001021f, +0.000444f, +0.000630f, -0.002221f, + +0.002514f, -0.002092f, +0.000500f, +0.001041f, -0.000954f, -0.000184f, +0.000525f, -0.000647f, +0.000648f, -0.000632f, + +0.000466f, +0.001447f, -0.000462f, -0.000482f, +0.000169f, +0.000119f, +0.000359f, -0.000040f, -0.000229f, +0.000018f, + +0.000087f, -0.000335f, -0.000324f, +0.000188f, +0.000111f, +0.000142f, -0.000117f, -0.000031f, +0.000465f, +0.000432f, + +0.000025f, -0.000581f, +0.000110f, -0.000008f, -0.000067f, -0.000048f, +0.000148f, +0.000032f, -0.000003f, -0.000028f, + -0.000236f, +0.000032f, +0.000154f, +0.000002f, +0.000010f, -0.000120f, -0.000042f, +0.000188f, +0.000064f, +0.000154f, + +0.000013f, -0.000193f, -0.000046f, +0.000125f, -0.000094f, +0.000048f, +0.000014f, +0.000111f, -0.000031f, +0.000196f, + -0.000021f, -0.000047f, -0.000061f, +0.000103f, -0.000039f, -0.000112f + }, + { + +0.002126f, +0.015326f, -0.003159f, +0.002568f, +0.001463f, +0.000731f, -0.002534f, +0.001070f, +0.001555f, +0.003201f, + -0.000588f, -0.000307f, -0.001495f, -0.002901f, +0.010098f, -0.001557f, -0.003450f, +0.001440f, -0.000759f, +0.001040f, + -0.001210f, -0.000179f, +0.001184f, -0.000427f, -0.001819f, +0.001400f, -0.002401f, -0.000341f, -0.000259f, +0.000020f, + +0.000706f, +0.000618f, -0.001351f, +0.001185f, -0.000036f, -0.000477f, +0.000040f, +0.000414f, -0.000832f, -0.000382f, + +0.000037f, +0.000711f, -0.000363f, +0.000401f, +0.000552f, +0.000477f, +0.000108f, +0.000723f, -0.000674f, -0.000211f, + +0.000515f, -0.000305f, -0.000260f, -0.000575f, +0.000258f, -0.000484f, +0.000265f, +0.000524f, -0.000154f, +0.000035f, + +0.000166f, +0.000038f, +0.000001f, +0.000098f, +0.000044f, +0.000119f, +0.000070f, +0.000114f, -0.000022f, +0.000020f, + -0.000061f, +0.000089f, +0.000306f, +0.000053f, -0.000405f, +0.000169f, -0.000122f, +0.000130f, +0.000079f, +0.000094f, + +0.000093f, +0.000119f, +0.000001f, +0.000064f, +0.000084f, -0.000026f, -0.000023f, -0.000053f, -0.000088f, +0.000071f, + -0.000048f, +0.000042f, +0.000092f, +0.000025f, +0.000004f, -0.000035f + } + }, + { + { + -0.000880f, -0.031078f, -0.000227f, +0.000028f, -0.000909f, -0.000908f, +0.000066f, -0.000833f, -0.000007f, +0.000027f, + +0.001619f, +0.000544f, +0.002226f, +0.000062f, +0.003309f, -0.000301f, +0.000869f, +0.000009f, +0.002249f, -0.000853f, + +0.003519f, -0.000705f, +0.000093f, +0.002523f, +0.001590f, +0.003169f, +0.000803f, -0.000304f, -0.000553f, -0.001054f, + -0.003010f, -0.001702f, -0.001027f, +0.000476f, +0.000879f, +0.001313f, -0.001800f, +0.001144f, -0.002500f, +0.000183f, + +0.000610f, -0.000361f, +0.000427f, +0.000864f, +0.000971f, -0.000023f, +0.000246f, -0.000342f, -0.000416f, +0.000486f, + +0.000349f, -0.000198f, -0.000201f, -0.000033f, -0.000321f, -0.000289f, -0.000117f, +0.000104f, +0.000005f, +0.000206f, + +0.000183f, +0.000260f, -0.000190f, -0.000295f, -0.000218f, +0.000012f, -0.000060f, +0.000006f, +0.000274f, -0.000306f, + -0.000167f, +0.000116f, +0.000158f, +0.000196f, +0.000390f, -0.000010f, +0.000038f, +0.000028f, -0.000005f, +0.000009f, + +0.000016f, +0.000107f, +0.000072f, +0.000044f, -0.000154f, -0.000036f, +0.000041f, -0.000080f, -0.000014f, -0.000066f, + +0.000091f, -0.000017f, -0.000059f, -0.000000f, -0.000049f, +0.000018f + }, + { + +0.013684f, -0.087790f, -0.000936f, -0.005775f, -0.000450f, +0.000586f, -0.000748f, -0.000328f, -0.001212f, +0.001516f, + +0.000200f, +0.001030f, -0.000479f, -0.000384f, -0.001419f, -0.000218f, +0.000555f, -0.001503f, -0.001805f, -0.000163f, + +0.000152f, -0.000893f, -0.000440f, +0.001176f, +0.001063f, +0.000481f, -0.000325f, +0.001248f, +0.001482f, +0.000320f, + +0.001349f, -0.000107f, -0.001621f, -0.000938f, +0.001038f, +0.000211f, +0.001280f, -0.000528f, +0.000377f, -0.000580f, + +0.000483f, -0.000403f, +0.000200f, -0.000033f, +0.000607f, -0.000325f, -0.000080f, -0.000367f, +0.000038f, +0.000053f, + -0.000221f, +0.000705f, -0.000015f, +0.000074f, -0.000165f, -0.000289f, -0.000399f, -0.000359f, +0.000375f, +0.000237f, + +0.000131f, -0.000291f, -0.000229f, +0.000090f, -0.000069f, +0.000144f, +0.000043f, -0.000272f, +0.000024f, +0.000138f, + -0.000181f, -0.000088f, +0.000007f, -0.000096f, -0.000201f, -0.000032f, -0.000106f, -0.000004f, -0.000110f, +0.000213f, + +0.000119f, -0.000209f, -0.000017f, +0.000049f, -0.000087f, -0.000236f, +0.000081f, +0.000011f, +0.000005f, +0.000016f, + +0.000014f, +0.000066f, +0.000028f, -0.000038f, -0.000033f, -0.000014f + }, + { + +0.004049f, -0.062907f, -0.018174f, +0.002707f, -0.001723f, +0.001038f, +0.000646f, -0.000409f, -0.000777f, -0.001336f, + -0.000898f, -0.001136f, +0.000729f, +0.002765f, +0.004503f, -0.001445f, +0.004730f, -0.000227f, +0.001976f, +0.000300f, + +0.002533f, -0.000038f, +0.000521f, -0.001539f, -0.000252f, +0.000750f, +0.000317f, -0.000202f, -0.001015f, -0.001432f, + +0.001066f, +0.001386f, +0.000073f, +0.000122f, -0.001277f, -0.000863f, +0.001294f, -0.000982f, -0.000530f, +0.000682f, + -0.000860f, +0.001711f, -0.000732f, +0.000219f, +0.000230f, -0.001049f, +0.000171f, +0.000306f, +0.000954f, -0.000277f, + -0.000414f, -0.000237f, -0.000010f, -0.000006f, -0.000261f, +0.000130f, +0.000311f, +0.000027f, +0.000522f, +0.000308f, + +0.000171f, +0.000471f, -0.000367f, -0.000012f, +0.000075f, +0.000109f, -0.000220f, +0.000262f, +0.000203f, -0.000172f, + -0.000023f, +0.000028f, -0.000012f, +0.000063f, -0.000013f, -0.000066f, -0.000016f, -0.000021f, -0.000114f, -0.000008f, + -0.000104f, -0.000094f, +0.000072f, -0.000160f, -0.000064f, +0.000140f, +0.000011f, +0.000012f, +0.000026f, -0.000048f, + -0.000022f, -0.000014f, +0.000010f, -0.000051f, +0.000016f, +0.000035f + }, + { + +0.000618f, +0.005872f, -0.001399f, +0.001055f, -0.000254f, -0.000160f, +0.000126f, +0.000315f, +0.000097f, -0.000427f, + -0.000493f, -0.000977f, -0.000610f, -0.001690f, -0.001956f, -0.002518f, +0.002471f, +0.003448f, +0.003506f, +0.001931f, + -0.000100f, -0.000523f, -0.001126f, -0.000568f, -0.001080f, +0.001359f, +0.001435f, -0.000711f, +0.000728f, -0.000081f, + -0.001453f, +0.001358f, +0.000055f, -0.000165f, -0.000244f, +0.001099f, +0.000024f, +0.000678f, +0.000326f, +0.000356f, + +0.000105f, -0.000013f, -0.000375f, -0.000660f, -0.000037f, +0.000296f, -0.000132f, -0.000127f, +0.000641f, -0.000033f, + -0.000278f, -0.000090f, +0.000196f, +0.000209f, +0.000017f, +0.000281f, -0.000088f, +0.000233f, +0.000118f, -0.000019f, + -0.000369f, +0.000163f, +0.000265f, +0.000134f, +0.000056f, -0.000117f, -0.000017f, +0.000191f, -0.000031f, -0.000152f, + -0.000210f, +0.000146f, -0.000015f, -0.000060f, -0.000045f, -0.000004f, +0.000245f, +0.000057f, -0.000040f, -0.000053f, + -0.000116f, -0.000012f, -0.000096f, -0.000012f, +0.000002f, -0.000074f, +0.000081f, +0.000060f, +0.000061f, +0.000002f, + +0.000030f, +0.000056f, +0.000028f, -0.000058f, +0.000013f, +0.000020f + }, + { + +0.014622f, -0.023180f, -0.004011f, -0.000162f, +0.000789f, -0.000659f, -0.001300f, -0.000194f, +0.000438f, -0.000548f, + +0.002105f, +0.002546f, -0.000206f, +0.000021f, +0.000972f, -0.000899f, -0.000183f, +0.007940f, +0.001875f, +0.001074f, + +0.001865f, -0.000106f, +0.000332f, -0.000329f, +0.000207f, +0.000063f, -0.000437f, -0.000007f, -0.000798f, +0.000050f, + +0.000692f, +0.000235f, +0.000166f, +0.000270f, -0.000179f, -0.000391f, -0.001283f, +0.001140f, +0.000494f, -0.000580f, + +0.000166f, +0.000202f, +0.000154f, -0.000975f, +0.000051f, +0.000489f, -0.000224f, +0.000118f, +0.000353f, -0.000249f, + +0.000379f, +0.000143f, -0.000421f, -0.000349f, -0.000708f, -0.000519f, -0.000893f, -0.000110f, +0.000305f, -0.000069f, + +0.000149f, +0.000184f, -0.000176f, -0.000104f, -0.000130f, +0.000241f, -0.000017f, -0.000277f, +0.000282f, +0.000010f, + -0.000059f, -0.000120f, -0.000077f, +0.000175f, -0.000017f, -0.000240f, +0.000127f, -0.000025f, +0.000096f, +0.000128f, + +0.000020f, -0.000047f, +0.000031f, -0.000128f, +0.000047f, -0.000105f, +0.000068f, +0.000091f, -0.000117f, +0.000027f, + -0.000040f, +0.000040f, +0.000048f, -0.000054f, +0.000034f, +0.000027f + }, + { + +0.000104f, +0.004501f, +0.002755f, -0.000992f, +0.000255f, -0.000167f, +0.000166f, -0.000358f, +0.000471f, -0.000025f, + -0.000337f, -0.000250f, +0.000241f, +0.001996f, -0.001151f, -0.000367f, -0.000293f, +0.000068f, +0.001016f, -0.015846f, + -0.001833f, -0.002716f, -0.000609f, -0.002173f, +0.001902f, -0.000230f, -0.000384f, -0.001726f, -0.000074f, +0.003250f, + +0.002269f, -0.001048f, +0.000175f, +0.000815f, +0.000555f, -0.001388f, -0.000547f, -0.000263f, -0.000803f, -0.000426f, + +0.000241f, +0.000285f, +0.000555f, -0.000059f, -0.000319f, -0.000091f, -0.000551f, -0.000224f, -0.000137f, -0.000554f, + +0.000242f, +0.000108f, -0.000219f, +0.000309f, -0.000184f, -0.000438f, -0.000162f, -0.000069f, +0.000011f, -0.000390f, + +0.000009f, +0.000099f, -0.000045f, +0.000070f, +0.000117f, +0.000074f, +0.000149f, -0.000006f, +0.000143f, -0.000069f, + +0.000304f, +0.000094f, -0.000110f, -0.000067f, +0.000035f, +0.000198f, +0.000108f, +0.000223f, -0.000084f, -0.000077f, + +0.000081f, -0.000014f, -0.000121f, -0.000061f, +0.000116f, +0.000017f, +0.000059f, -0.000101f, +0.000028f, +0.000092f, + -0.000076f, -0.000020f, +0.000134f, -0.000051f, -0.000037f, +0.000030f + }, + { + +0.006822f, -0.115110f, -0.006962f, +0.003654f, +0.000084f, +0.000981f, +0.000315f, -0.000552f, -0.000462f, -0.000944f, + +0.001196f, +0.000292f, +0.000935f, +0.000373f, +0.000696f, +0.000351f, +0.000898f, -0.000658f, -0.000425f, -0.000277f, + -0.000142f, -0.000470f, -0.000180f, -0.000546f, +0.000506f, +0.000010f, -0.000094f, +0.000553f, -0.000167f, +0.000882f, + +0.000915f, +0.000186f, +0.000687f, -0.000672f, +0.000079f, -0.000875f, -0.000407f, -0.001580f, +0.001783f, -0.000032f, + -0.000223f, +0.000156f, -0.001291f, +0.000483f, +0.000092f, +0.000128f, -0.000197f, -0.000188f, +0.000145f, -0.000308f, + +0.000042f, -0.000175f, +0.000138f, -0.000288f, +0.000230f, +0.000166f, +0.000267f, +0.000322f, +0.000076f, +0.000145f, + -0.000198f, -0.000201f, +0.000014f, +0.000191f, +0.000053f, +0.000103f, +0.000162f, -0.000158f, -0.000128f, +0.000100f, + -0.000058f, -0.000030f, +0.000233f, -0.000106f, -0.000138f, -0.000039f, +0.000223f, -0.000038f, +0.000054f, +0.000123f, + -0.000158f, -0.000055f, +0.000117f, +0.000009f, -0.000051f, +0.000156f, +0.000137f, -0.000070f, -0.000079f, -0.000063f, + +0.000053f, -0.000067f, -0.000056f, +0.000039f, +0.000052f, -0.000026f + }, + { + -0.000275f, +0.000676f, -0.000970f, +0.000857f, -0.000369f, +0.000159f, +0.000192f, -0.000238f, +0.000470f, -0.000023f, + -0.000616f, -0.000993f, +0.000876f, -0.002023f, -0.016004f, -0.004041f, -0.003215f, +0.000618f, -0.000714f, +0.000651f, + -0.003477f, +0.000552f, +0.000849f, +0.000220f, -0.000191f, -0.006238f, -0.000532f, -0.000691f, -0.002561f, -0.000873f, + -0.000078f, +0.000811f, +0.000072f, +0.000155f, +0.000001f, +0.000203f, -0.000082f, +0.000451f, -0.000299f, +0.000659f, + -0.000232f, -0.000477f, -0.000529f, +0.000019f, -0.000026f, +0.000172f, -0.000117f, -0.000657f, -0.000430f, +0.000320f, + +0.000210f, -0.000260f, +0.000033f, +0.000196f, +0.000017f, -0.000136f, +0.000263f, +0.000145f, -0.000519f, +0.000260f, + +0.000085f, +0.000087f, -0.000077f, +0.000010f, +0.000010f, -0.000091f, +0.000160f, +0.000140f, -0.000141f, +0.000054f, + -0.000011f, -0.000049f, -0.000079f, +0.000091f, +0.000131f, +0.000066f, +0.000230f, +0.000104f, -0.000045f, +0.000096f, + -0.000146f, -0.000048f, +0.000007f, +0.000046f, +0.000102f, +0.000013f, +0.000065f, -0.000050f, -0.000024f, +0.000103f, + -0.000091f, -0.000004f, +0.000032f, +0.000012f, -0.000066f, -0.000053f + }, + { + +0.007730f, +0.078546f, +0.004586f, +0.001450f, +0.000145f, +0.000508f, -0.000673f, -0.001090f, +0.000686f, +0.001027f, + -0.000399f, -0.000679f, -0.002264f, +0.001243f, +0.001910f, +0.001238f, +0.001809f, +0.000150f, +0.000129f, +0.000492f, + +0.000660f, -0.000114f, +0.000523f, +0.000745f, -0.000869f, -0.000650f, +0.000649f, -0.000162f, -0.001412f, -0.000283f, + +0.000825f, +0.000089f, -0.000807f, +0.000632f, +0.000437f, +0.000599f, +0.000212f, -0.000238f, +0.000040f, -0.001697f, + -0.001951f, -0.000901f, -0.000335f, +0.000965f, +0.000153f, +0.000277f, +0.000461f, +0.000025f, +0.000606f, -0.000305f, + +0.000070f, -0.000029f, -0.000232f, -0.000227f, -0.000671f, -0.000406f, +0.000352f, +0.000084f, +0.000198f, +0.000145f, + +0.000240f, -0.000208f, +0.000032f, -0.000200f, -0.000315f, -0.000011f, +0.000052f, -0.000401f, -0.000020f, +0.000309f, + +0.000054f, -0.000181f, -0.000050f, +0.000070f, +0.000180f, -0.000182f, +0.000092f, +0.000037f, -0.000099f, +0.000068f, + +0.000047f, -0.000016f, -0.000063f, +0.000016f, -0.000146f, +0.000010f, +0.000144f, +0.000099f, -0.000006f, -0.000142f, + -0.000116f, +0.000047f, -0.000028f, +0.000110f, -0.000004f, -0.000004f + }, + { + +0.000598f, +0.001423f, +0.003180f, +0.001458f, -0.001953f, +0.002633f, +0.000143f, +0.000665f, -0.000657f, -0.000719f, + -0.000889f, +0.000057f, +0.000267f, +0.001351f, +0.001216f, +0.003366f, +0.001113f, +0.000879f, +0.005172f, +0.000431f, + -0.001973f, +0.000064f, +0.001599f, +0.001265f, +0.000415f, -0.000646f, +0.000860f, +0.000800f, -0.000564f, +0.000566f, + -0.001762f, +0.000682f, +0.001086f, -0.001185f, +0.000996f, +0.000829f, +0.000189f, -0.000077f, +0.000055f, -0.000307f, + +0.000563f, +0.000453f, -0.000039f, -0.000033f, +0.001065f, -0.000171f, -0.000406f, +0.000227f, -0.000194f, +0.000425f, + -0.000382f, -0.000264f, +0.000654f, -0.000392f, -0.000537f, +0.000171f, +0.000392f, -0.000106f, -0.000092f, +0.000059f, + -0.000329f, +0.000114f, +0.000117f, +0.000022f, -0.000040f, -0.000163f, +0.000241f, +0.000072f, +0.000323f, -0.000064f, + -0.000117f, -0.000095f, -0.000225f, +0.000222f, +0.000019f, -0.000024f, +0.000069f, -0.000040f, -0.000046f, -0.000008f, + +0.000054f, -0.000002f, +0.000027f, +0.000012f, +0.000079f, +0.000011f, -0.000099f, +0.000032f, -0.000045f, +0.000028f, + -0.000008f, +0.000017f, -0.000102f, -0.000014f, +0.000058f, +0.000036f + }, + { + -0.007562f, +0.032197f, +0.010437f, +0.002182f, +0.000154f, -0.003954f, -0.004737f, -0.002739f, +0.000537f, +0.002120f, + +0.000193f, +0.000738f, +0.000038f, +0.001275f, +0.000724f, -0.000396f, -0.002485f, -0.000980f, +0.000935f, +0.000911f, + -0.000679f, +0.000956f, -0.000535f, -0.000881f, -0.001483f, -0.000515f, -0.000370f, -0.000293f, +0.000540f, +0.000952f, + -0.000103f, -0.000188f, +0.000069f, -0.000326f, -0.000209f, -0.000863f, +0.000921f, +0.000302f, -0.000241f, -0.000262f, + -0.000325f, -0.000097f, -0.000389f, -0.000709f, +0.000100f, +0.000748f, +0.000327f, +0.000063f, -0.000388f, +0.000305f, + +0.000665f, -0.000113f, -0.000296f, -0.000159f, -0.000360f, -0.000285f, -0.000091f, +0.000163f, -0.000185f, +0.000126f, + -0.000009f, -0.000183f, -0.000173f, +0.000073f, +0.000096f, -0.000165f, +0.000140f, -0.000062f, +0.000026f, -0.000170f, + +0.000087f, +0.000018f, -0.000019f, -0.000002f, -0.000015f, +0.000120f, -0.000086f, -0.000120f, -0.000029f, +0.000013f, + +0.000014f, +0.000073f, -0.000094f, +0.000103f, -0.000042f, +0.000092f, +0.000090f, +0.000034f, -0.000044f, +0.000001f, + +0.000020f, -0.000016f, -0.000062f, +0.000019f, +0.000063f, +0.000039f + }, + { + -0.000640f, +0.003881f, +0.002373f, -0.001415f, +0.000655f, -0.001089f, +0.000094f, -0.000053f, -0.000070f, -0.000775f, + -0.000829f, +0.000109f, +0.002909f, +0.005503f, -0.002240f, +0.003495f, -0.000111f, +0.000190f, +0.001394f, +0.000754f, + +0.003414f, +0.002313f, +0.000046f, +0.000514f, -0.002046f, -0.002111f, -0.000519f, -0.000544f, +0.001221f, +0.001111f, + -0.001606f, +0.001111f, -0.000323f, +0.000424f, -0.000446f, +0.000134f, -0.000613f, +0.000307f, +0.000302f, +0.000480f, + +0.000343f, +0.000208f, +0.000665f, +0.000648f, +0.000007f, +0.000425f, +0.000099f, +0.000479f, +0.000192f, +0.000844f, + +0.000368f, -0.000245f, +0.000152f, +0.000348f, -0.000141f, -0.000423f, -0.000776f, -0.000393f, -0.000047f, +0.000293f, + +0.000211f, +0.000168f, -0.000206f, -0.000266f, +0.000109f, +0.000057f, -0.000354f, +0.000015f, -0.000077f, +0.000006f, + +0.000215f, +0.000040f, -0.000026f, +0.000111f, +0.000051f, +0.000111f, -0.000093f, -0.000101f, +0.000008f, -0.000073f, + +0.000027f, -0.000035f, -0.000061f, +0.000102f, +0.000041f, +0.000033f, +0.000050f, +0.000028f, -0.000011f, +0.000039f, + +0.000022f, +0.000073f, -0.000026f, -0.000045f, +0.000036f, +0.000003f + }, + { + +0.001727f, +0.003592f, -0.000294f, +0.001511f, -0.001026f, +0.001793f, +0.000322f, +0.001671f, +0.000329f, +0.000116f, + +0.001076f, -0.000048f, -0.000557f, -0.008597f, -0.003922f, +0.000768f, -0.000226f, +0.000184f, -0.000585f, +0.002411f, + -0.000553f, -0.000207f, -0.000328f, -0.000227f, +0.001449f, +0.001872f, +0.002318f, -0.000797f, +0.001838f, +0.001637f, + -0.000003f, -0.001004f, +0.000202f, +0.000957f, +0.000599f, +0.001038f, -0.000670f, +0.000747f, +0.000395f, -0.000528f, + -0.000815f, -0.000333f, +0.000400f, +0.000348f, -0.000335f, +0.000205f, +0.000042f, -0.000391f, -0.000186f, +0.000177f, + +0.000371f, +0.000115f, -0.000150f, +0.000638f, +0.000182f, +0.000155f, -0.000117f, -0.000493f, -0.000499f, +0.000361f, + +0.000063f, +0.000048f, -0.000128f, +0.000215f, -0.000163f, -0.000296f, +0.000034f, +0.000097f, +0.000137f, -0.000044f, + -0.000084f, +0.000154f, +0.000218f, +0.000024f, +0.000042f, -0.000012f, -0.000164f, +0.000296f, +0.000119f, +0.000103f, + -0.000136f, -0.000255f, -0.000017f, +0.000125f, +0.000025f, -0.000124f, -0.000089f, -0.000117f, -0.000101f, -0.000073f, + +0.000058f, +0.000033f, +0.000091f, +0.000014f, +0.000029f, +0.000014f + }, + { + -0.000045f, +0.002073f, -0.002852f, +0.000666f, +0.000661f, -0.000456f, -0.000131f, +0.000453f, +0.000161f, -0.001227f, + -0.000459f, +0.001588f, +0.001491f, -0.012117f, +0.004399f, -0.007132f, +0.003577f, -0.001004f, +0.000589f, +0.004165f, + +0.002245f, +0.000466f, +0.002580f, +0.000936f, -0.003053f, +0.002124f, -0.002212f, +0.000296f, +0.000144f, +0.001272f, + -0.001433f, -0.000468f, -0.000440f, +0.000831f, -0.002070f, -0.000737f, +0.000299f, -0.000411f, +0.000953f, -0.000657f, + +0.000143f, +0.000985f, +0.000211f, -0.000162f, -0.000145f, +0.000359f, +0.000161f, -0.000223f, -0.000101f, -0.000210f, + +0.000312f, +0.000013f, -0.000235f, -0.000263f, +0.000352f, -0.000296f, -0.000003f, +0.000118f, +0.000302f, +0.000230f, + -0.000062f, +0.000025f, -0.000219f, +0.000020f, +0.000214f, -0.000046f, +0.000213f, +0.000159f, -0.000020f, -0.000016f, + -0.000133f, -0.000011f, +0.000243f, -0.000200f, -0.000061f, +0.000085f, -0.000060f, +0.000139f, +0.000051f, +0.000032f, + +0.000129f, -0.000123f, -0.000216f, +0.000074f, -0.000095f, -0.000046f, -0.000005f, +0.000095f, -0.000080f, +0.000059f, + +0.000086f, +0.000063f, -0.000049f, +0.000079f, +0.000008f, -0.000104f + }, + { + +0.002753f, +0.013921f, +0.001082f, -0.003762f, +0.001571f, +0.002680f, -0.000519f, +0.001395f, +0.001606f, +0.000754f, + +0.002287f, -0.001327f, -0.000306f, +0.004363f, -0.000999f, -0.001197f, +0.000995f, +0.002100f, -0.001861f, +0.000733f, + -0.001404f, +0.000596f, +0.000487f, +0.000781f, -0.001184f, -0.000945f, -0.001082f, +0.000780f, -0.000709f, +0.000719f, + +0.000104f, +0.000766f, -0.000637f, +0.000218f, +0.000787f, -0.000729f, -0.000921f, +0.000282f, -0.000786f, +0.000263f, + +0.000501f, -0.000126f, -0.000214f, +0.000093f, +0.000973f, +0.000325f, +0.000280f, +0.000194f, +0.000130f, -0.000565f, + +0.000184f, +0.000328f, -0.000100f, -0.000299f, +0.000013f, -0.000141f, -0.000108f, +0.000102f, +0.000133f, +0.000290f, + -0.000099f, -0.000140f, -0.000132f, +0.000245f, +0.000118f, -0.000025f, +0.000132f, -0.000169f, -0.000013f, +0.000041f, + -0.000018f, -0.000067f, +0.000184f, +0.000183f, +0.000066f, -0.000123f, -0.000178f, +0.000197f, +0.000045f, +0.000029f, + +0.000111f, +0.000209f, +0.000029f, +0.000026f, +0.000057f, +0.000049f, -0.000014f, +0.000009f, +0.000004f, -0.000069f, + +0.000080f, -0.000007f, +0.000074f, +0.000080f, +0.000031f, -0.000040f + } + }, + { + { + +0.000334f, -0.025325f, +0.005920f, +0.001240f, -0.000460f, -0.000023f, +0.000623f, -0.000035f, +0.001183f, -0.000337f, + +0.000818f, -0.001704f, +0.000700f, -0.000412f, +0.000478f, -0.002966f, -0.000130f, +0.000685f, +0.000619f, -0.001187f, + +0.002842f, -0.001019f, -0.000042f, +0.001715f, +0.001081f, +0.001209f, +0.000807f, +0.001782f, +0.001303f, +0.000649f, + +0.000302f, +0.000569f, +0.000677f, -0.000680f, -0.001027f, -0.001043f, -0.001573f, +0.001819f, -0.001982f, +0.000385f, + -0.000076f, -0.000626f, +0.000030f, +0.000529f, -0.000149f, +0.000059f, +0.000285f, -0.000330f, +0.000109f, +0.000269f, + -0.000304f, -0.000328f, -0.000048f, -0.000347f, +0.000083f, +0.000134f, +0.000004f, +0.000211f, -0.000158f, +0.000070f, + -0.000196f, +0.000166f, +0.000182f, +0.000065f, -0.000023f, +0.000154f, +0.000086f, +0.000002f, +0.000079f, -0.000084f, + -0.000057f, -0.000056f, +0.000196f, -0.000051f, +0.000208f, -0.000216f, +0.000071f, +0.000010f, +0.000060f, +0.000119f, + +0.000020f, -0.000010f, +0.000016f, +0.000069f, +0.000056f, +0.000029f, -0.000002f, -0.000041f, +0.000025f, -0.000037f, + -0.000076f, +0.000042f, -0.000057f, +0.000086f, +0.000020f, -0.000046f + }, + { + -0.009411f, -0.083437f, +0.023110f, -0.005002f, -0.001782f, -0.001021f, +0.000052f, +0.000742f, -0.002478f, +0.001209f, + +0.000182f, -0.000148f, +0.000557f, -0.000204f, -0.002049f, -0.000343f, -0.001167f, -0.000152f, +0.001909f, -0.000648f, + +0.000113f, -0.000334f, -0.000600f, +0.000524f, +0.000161f, +0.000641f, -0.000253f, +0.000450f, +0.000504f, -0.000688f, + +0.000024f, -0.000036f, -0.000277f, +0.000240f, +0.000007f, -0.000957f, +0.000421f, +0.000104f, +0.000416f, -0.001101f, + +0.000331f, +0.000375f, +0.000732f, -0.000476f, -0.000181f, +0.000317f, -0.000745f, +0.000076f, -0.000205f, -0.000331f, + -0.000744f, -0.000273f, +0.000026f, +0.000177f, -0.000132f, +0.000143f, -0.000164f, +0.000124f, +0.000174f, +0.000058f, + +0.000029f, +0.000026f, -0.000080f, +0.000272f, +0.000174f, +0.000136f, -0.000175f, -0.000260f, -0.000128f, +0.000182f, + -0.000112f, +0.000050f, -0.000032f, +0.000049f, -0.000022f, -0.000228f, +0.000066f, +0.000052f, -0.000070f, +0.000019f, + +0.000041f, +0.000017f, -0.000045f, +0.000045f, +0.000053f, +0.000052f, -0.000135f, +0.000114f, -0.000066f, +0.000020f, + -0.000029f, +0.000016f, -0.000017f, +0.000053f, -0.000046f, +0.000042f + }, + { + -0.003242f, -0.021477f, +0.015182f, +0.003844f, +0.003903f, +0.000362f, -0.000133f, +0.000289f, +0.000253f, +0.000606f, + -0.000456f, -0.001214f, -0.000205f, -0.000255f, +0.004340f, -0.000306f, +0.001903f, -0.002872f, +0.002582f, -0.001072f, + +0.002000f, +0.000959f, +0.001412f, -0.000870f, -0.001276f, -0.000048f, +0.000583f, +0.001422f, +0.000387f, -0.000269f, + +0.000534f, +0.000842f, +0.000210f, +0.000911f, -0.001035f, -0.000730f, +0.001254f, -0.000690f, +0.000617f, +0.001517f, + -0.001599f, +0.001741f, -0.000384f, +0.000557f, +0.000348f, -0.000723f, -0.000278f, -0.000193f, +0.000306f, +0.000064f, + -0.000098f, -0.000578f, -0.000010f, -0.000174f, -0.000247f, +0.000131f, -0.000138f, -0.000024f, +0.000286f, +0.000132f, + -0.000195f, +0.000107f, -0.000159f, +0.000223f, -0.000211f, -0.000119f, -0.000365f, +0.000116f, +0.000159f, -0.000097f, + +0.000030f, -0.000028f, +0.000050f, -0.000012f, +0.000136f, -0.000016f, -0.000022f, -0.000000f, +0.000021f, -0.000054f, + -0.000103f, -0.000066f, -0.000037f, +0.000068f, -0.000090f, -0.000026f, +0.000039f, -0.000053f, -0.000019f, +0.000025f, + -0.000091f, +0.000018f, -0.000009f, +0.000039f, -0.000031f, -0.000050f + }, + { + -0.000308f, +0.007487f, -0.000055f, +0.000506f, +0.000414f, -0.000101f, -0.000075f, -0.000080f, +0.000029f, +0.000269f, + +0.000475f, -0.000043f, -0.000746f, -0.001105f, +0.005416f, -0.001870f, -0.004206f, +0.000395f, +0.001535f, +0.000031f, + +0.000806f, -0.000188f, -0.000988f, +0.000787f, -0.000805f, -0.000661f, -0.002067f, -0.001409f, +0.000161f, -0.000228f, + -0.002228f, +0.001078f, +0.000666f, +0.000759f, -0.000546f, +0.000537f, +0.001417f, +0.000425f, -0.000354f, +0.000693f, + -0.000130f, -0.000142f, +0.000027f, -0.000277f, +0.000014f, +0.000028f, -0.000152f, -0.000345f, +0.000301f, +0.000228f, + +0.000003f, -0.000394f, +0.000112f, +0.000089f, -0.000240f, +0.000416f, -0.000229f, -0.000317f, +0.000292f, +0.000143f, + -0.000326f, -0.000118f, +0.000148f, -0.000166f, -0.000045f, +0.000075f, +0.000006f, +0.000163f, -0.000061f, +0.000075f, + -0.000085f, -0.000136f, -0.000055f, -0.000051f, +0.000116f, -0.000131f, +0.000043f, +0.000041f, +0.000114f, -0.000012f, + -0.000015f, -0.000020f, +0.000067f, -0.000031f, +0.000064f, -0.000022f, -0.000056f, -0.000011f, +0.000051f, -0.000005f, + -0.000053f, -0.000047f, +0.000031f, +0.000038f, -0.000004f, +0.000029f + }, + { + -0.003799f, -0.040216f, +0.001691f, -0.002482f, -0.000494f, +0.000276f, -0.000580f, -0.000863f, +0.000700f, +0.000021f, + +0.000002f, +0.001761f, -0.000461f, +0.001019f, +0.000712f, -0.001409f, +0.000995f, +0.005930f, -0.000693f, -0.000011f, + +0.000118f, -0.000391f, +0.000872f, +0.000862f, -0.000885f, +0.001129f, -0.000257f, +0.000582f, -0.001411f, -0.000161f, + -0.000275f, -0.000563f, -0.000805f, +0.000412f, +0.000112f, -0.000013f, -0.001871f, -0.001357f, -0.000347f, +0.000240f, + +0.000006f, -0.000179f, +0.000171f, -0.000471f, -0.000278f, -0.000277f, -0.000141f, +0.000125f, +0.000117f, -0.000331f, + -0.000273f, -0.000207f, +0.000521f, -0.000105f, -0.000110f, +0.000088f, +0.000077f, -0.000141f, -0.000152f, -0.000340f, + +0.000094f, +0.000125f, -0.000121f, +0.000185f, +0.000112f, +0.000028f, -0.000063f, -0.000258f, +0.000167f, +0.000006f, + +0.000030f, +0.000010f, -0.000260f, -0.000128f, -0.000015f, -0.000014f, +0.000026f, +0.000139f, -0.000014f, -0.000083f, + -0.000005f, +0.000056f, +0.000001f, +0.000085f, +0.000002f, -0.000163f, +0.000037f, +0.000003f, -0.000021f, -0.000017f, + +0.000008f, +0.000016f, +0.000041f, -0.000031f, -0.000050f, -0.000034f + }, + { + -0.000524f, -0.004345f, +0.000853f, +0.000153f, +0.000139f, -0.000348f, -0.000131f, -0.000368f, +0.000250f, -0.000058f, + +0.000449f, +0.000216f, +0.000876f, +0.000248f, -0.002889f, +0.000900f, +0.001591f, -0.000260f, +0.003368f, -0.009970f, + +0.000343f, -0.001373f, +0.001971f, +0.000136f, +0.000324f, -0.001252f, +0.000616f, -0.001486f, -0.001610f, +0.002349f, + +0.002618f, -0.000173f, -0.000385f, +0.000024f, +0.000820f, -0.000471f, -0.000058f, +0.000360f, -0.000426f, +0.000030f, + -0.000414f, +0.000975f, +0.000803f, +0.000142f, +0.000256f, -0.000193f, -0.000256f, -0.000088f, -0.000070f, -0.000594f, + -0.000286f, -0.000071f, -0.000306f, -0.000257f, -0.000476f, -0.000098f, +0.000244f, +0.000048f, +0.000318f, -0.000049f, + +0.000042f, -0.000060f, -0.000110f, +0.000079f, -0.000064f, -0.000021f, +0.000022f, -0.000257f, +0.000092f, -0.000135f, + +0.000037f, +0.000138f, +0.000100f, -0.000014f, -0.000124f, +0.000011f, -0.000043f, +0.000274f, -0.000098f, +0.000066f, + +0.000012f, +0.000158f, +0.000057f, -0.000039f, -0.000103f, -0.000003f, +0.000066f, -0.000090f, +0.000019f, +0.000122f, + -0.000020f, -0.000108f, -0.000015f, +0.000047f, +0.000052f, +0.000102f + }, + { + +0.005400f, -0.091752f, +0.011522f, +0.002923f, -0.000876f, +0.000806f, +0.000049f, +0.000648f, +0.000896f, -0.001041f, + +0.000238f, -0.000014f, -0.000010f, -0.000611f, -0.000004f, +0.000747f, +0.000630f, -0.000522f, +0.001555f, -0.000592f, + -0.000576f, -0.000640f, -0.000007f, -0.000143f, +0.000480f, -0.000038f, -0.000324f, +0.000844f, -0.000400f, +0.000273f, + +0.000522f, -0.000258f, +0.000651f, -0.000631f, -0.000040f, -0.000019f, +0.000202f, -0.001640f, +0.000742f, -0.000487f, + +0.000375f, +0.001086f, -0.000474f, +0.000017f, +0.000273f, +0.000339f, +0.000113f, -0.000090f, -0.000150f, -0.000255f, + -0.000319f, -0.000234f, -0.000277f, -0.000008f, +0.000089f, -0.000031f, +0.000064f, +0.000066f, -0.000120f, +0.000045f, + +0.000010f, +0.000079f, -0.000042f, -0.000022f, -0.000234f, -0.000045f, +0.000063f, +0.000018f, -0.000156f, +0.000007f, + +0.000272f, -0.000160f, -0.000169f, +0.000106f, +0.000069f, -0.000150f, +0.000041f, +0.000018f, -0.000069f, -0.000050f, + +0.000089f, -0.000039f, +0.000069f, +0.000112f, +0.000009f, -0.000098f, +0.000049f, +0.000011f, -0.000031f, -0.000067f, + -0.000006f, +0.000040f, -0.000070f, +0.000004f, -0.000015f, -0.000005f + }, + { + -0.000634f, +0.001003f, +0.001818f, -0.000208f, +0.000193f, +0.000098f, -0.000013f, -0.000499f, -0.000041f, +0.000295f, + +0.000465f, +0.000087f, +0.001539f, -0.000048f, -0.010765f, +0.000021f, -0.000995f, -0.001081f, +0.000096f, +0.002248f, + -0.001984f, -0.000607f, +0.002125f, +0.002430f, +0.001389f, -0.002476f, +0.001262f, +0.000478f, -0.000937f, -0.000852f, + +0.000780f, +0.000129f, -0.000628f, +0.000111f, -0.000210f, -0.000009f, +0.000222f, +0.000348f, -0.000785f, +0.001022f, + -0.000241f, -0.000114f, +0.000272f, +0.000080f, -0.000578f, +0.000085f, -0.000025f, +0.000450f, -0.000752f, -0.000467f, + +0.000229f, -0.000153f, -0.000347f, -0.000240f, +0.000341f, +0.000116f, -0.000091f, +0.000018f, -0.000046f, +0.000041f, + -0.000227f, -0.000174f, +0.000034f, +0.000137f, +0.000081f, -0.000323f, -0.000215f, +0.000116f, +0.000171f, +0.000054f, + -0.000044f, +0.000040f, -0.000130f, -0.000098f, +0.000100f, -0.000002f, +0.000018f, +0.000095f, +0.000044f, +0.000013f, + +0.000083f, +0.000053f, -0.000022f, -0.000131f, -0.000094f, +0.000001f, -0.000022f, +0.000062f, -0.000036f, +0.000028f, + +0.000025f, -0.000020f, +0.000033f, +0.000066f, +0.000009f, +0.000016f + }, + { + -0.006076f, +0.054560f, -0.002434f, -0.001149f, -0.000496f, +0.000336f, +0.000503f, +0.000828f, -0.000970f, +0.000414f, + +0.002297f, -0.000199f, -0.001213f, -0.001767f, +0.001215f, -0.001408f, +0.000104f, -0.000396f, -0.000129f, -0.000208f, + -0.000347f, -0.000099f, -0.000956f, +0.000440f, +0.000510f, -0.000608f, +0.000839f, +0.000185f, -0.000568f, -0.000218f, + -0.000318f, +0.000570f, +0.000069f, +0.000840f, +0.000229f, -0.000141f, -0.000576f, -0.000733f, +0.000343f, -0.000659f, + -0.000428f, +0.000785f, -0.000032f, +0.000031f, -0.000011f, -0.000324f, +0.000230f, +0.000331f, +0.000162f, -0.001155f, + -0.000194f, +0.000208f, -0.000215f, +0.000250f, +0.000542f, +0.000002f, -0.000140f, -0.000303f, +0.000316f, -0.000170f, + +0.000027f, -0.000027f, -0.000004f, +0.000093f, -0.000009f, -0.000239f, +0.000045f, +0.000066f, +0.000040f, +0.000074f, + +0.000100f, -0.000013f, -0.000005f, +0.000127f, +0.000078f, -0.000029f, -0.000160f, +0.000076f, -0.000090f, +0.000103f, + -0.000127f, +0.000060f, +0.000004f, +0.000015f, -0.000048f, -0.000057f, -0.000033f, +0.000077f, +0.000073f, -0.000036f, + +0.000035f, +0.000072f, -0.000021f, -0.000046f, +0.000072f, +0.000014f + }, + { + -0.000513f, +0.005073f, +0.001327f, +0.000281f, -0.000844f, -0.000334f, +0.000947f, +0.001125f, -0.001000f, -0.000338f, + -0.000512f, +0.000749f, -0.001411f, -0.002237f, -0.001042f, +0.003844f, +0.001111f, -0.003533f, +0.001053f, +0.001158f, + -0.001417f, -0.000119f, -0.000502f, +0.000466f, +0.001235f, +0.000443f, +0.000590f, +0.000899f, -0.000744f, -0.000559f, + +0.000049f, -0.000838f, +0.000384f, -0.000859f, -0.000082f, -0.000141f, +0.000162f, +0.000078f, +0.000683f, -0.000247f, + +0.000519f, +0.000494f, +0.000220f, -0.000150f, -0.000333f, +0.000313f, +0.000016f, +0.000462f, -0.000555f, -0.000109f, + +0.000230f, +0.000042f, +0.000393f, -0.000097f, -0.000034f, -0.000365f, +0.000184f, -0.000196f, -0.000054f, +0.000146f, + -0.000126f, +0.000134f, +0.000085f, -0.000174f, -0.000059f, -0.000395f, -0.000039f, -0.000072f, +0.000289f, +0.000256f, + -0.000129f, +0.000036f, -0.000059f, -0.000079f, -0.000020f, +0.000100f, -0.000016f, -0.000077f, -0.000003f, -0.000025f, + -0.000008f, -0.000058f, +0.000028f, +0.000003f, -0.000023f, +0.000091f, -0.000012f, +0.000012f, -0.000019f, -0.000075f, + +0.000061f, -0.000002f, -0.000032f, -0.000041f, +0.000019f, +0.000096f + }, + { + +0.004265f, +0.041440f, +0.004288f, +0.003727f, -0.001515f, +0.002801f, +0.010016f, -0.001590f, -0.000519f, -0.000829f, + -0.000392f, -0.000063f, -0.000116f, -0.000379f, +0.000510f, +0.000820f, -0.001371f, -0.001391f, -0.000735f, -0.000655f, + +0.000164f, -0.000290f, +0.000287f, -0.000404f, -0.000557f, +0.000128f, -0.000363f, -0.000732f, -0.000627f, +0.000482f, + -0.000007f, -0.000056f, -0.000069f, -0.000563f, -0.000300f, +0.000178f, -0.000502f, +0.000012f, +0.000043f, -0.000208f, + -0.000211f, +0.000529f, -0.000532f, -0.000419f, -0.000051f, -0.000135f, +0.000018f, +0.000316f, -0.000044f, -0.000119f, + +0.000454f, -0.000042f, -0.000154f, +0.000361f, +0.000051f, -0.000083f, -0.000554f, -0.000057f, +0.000118f, +0.000170f, + -0.000001f, +0.000024f, +0.000017f, -0.000046f, -0.000093f, -0.000015f, +0.000007f, -0.000095f, -0.000058f, -0.000049f, + +0.000077f, -0.000055f, -0.000088f, +0.000028f, +0.000105f, +0.000026f, +0.000132f, +0.000084f, -0.000115f, +0.000173f, + -0.000110f, -0.000007f, +0.000028f, -0.000125f, +0.000012f, -0.000051f, +0.000140f, -0.000014f, +0.000045f, -0.000018f, + -0.000048f, +0.000004f, +0.000022f, -0.000013f, -0.000086f, +0.000059f + }, + { + +0.000646f, -0.000602f, -0.002076f, +0.000161f, +0.000352f, +0.000233f, -0.000094f, -0.000681f, +0.000088f, +0.000153f, + +0.000249f, +0.000667f, -0.004993f, -0.002453f, +0.000635f, +0.000846f, -0.002632f, -0.000531f, +0.000128f, -0.000773f, + +0.001480f, -0.003233f, -0.000401f, +0.000404f, +0.000431f, -0.000852f, -0.001359f, -0.000446f, -0.000103f, +0.001007f, + +0.000721f, -0.000296f, -0.000114f, +0.000259f, -0.000442f, -0.000042f, -0.001029f, -0.000665f, +0.001216f, -0.000007f, + +0.000133f, +0.000156f, -0.000372f, +0.000124f, -0.000044f, -0.000228f, -0.000085f, +0.000264f, +0.000165f, +0.000072f, + +0.000138f, -0.000224f, -0.000386f, +0.000175f, -0.000102f, +0.000308f, +0.000050f, -0.000023f, -0.000341f, +0.000020f, + -0.000298f, +0.000051f, +0.000130f, -0.000018f, -0.000245f, -0.000172f, +0.000212f, -0.000069f, -0.000013f, -0.000081f, + +0.000185f, +0.000057f, -0.000178f, +0.000054f, -0.000050f, -0.000031f, +0.000095f, +0.000118f, +0.000017f, +0.000021f, + -0.000114f, +0.000078f, +0.000033f, -0.000026f, -0.000029f, +0.000015f, +0.000041f, -0.000057f, -0.000069f, +0.000005f, + -0.000014f, +0.000032f, +0.000038f, +0.000040f, -0.000041f, +0.000003f + }, + { + +0.000260f, +0.002004f, -0.003471f, +0.004301f, -0.002518f, +0.001707f, +0.004089f, +0.001147f, +0.000922f, -0.001136f, + +0.000071f, +0.000251f, +0.001725f, -0.003855f, -0.003440f, +0.001547f, -0.001442f, -0.000000f, +0.000122f, +0.000024f, + +0.000864f, -0.000007f, +0.000421f, +0.000644f, +0.001369f, +0.000140f, +0.001085f, -0.000842f, +0.001378f, +0.001180f, + -0.000652f, -0.000720f, -0.000024f, +0.000519f, -0.000498f, +0.000557f, -0.000177f, +0.000477f, -0.000483f, +0.000778f, + +0.000229f, +0.000287f, +0.000161f, +0.000090f, -0.000826f, -0.000300f, -0.000395f, +0.000331f, -0.000713f, -0.000318f, + +0.000331f, +0.000416f, +0.000103f, +0.000046f, +0.000113f, +0.000290f, +0.000127f, +0.000179f, -0.000078f, +0.000068f, + +0.000163f, -0.000133f, +0.000074f, +0.000137f, -0.000068f, -0.000120f, +0.000008f, -0.000012f, -0.000185f, -0.000011f, + +0.000136f, -0.000043f, +0.000019f, +0.000160f, +0.000104f, -0.000027f, -0.000085f, -0.000028f, +0.000119f, +0.000026f, + +0.000191f, -0.000166f, -0.000133f, -0.000059f, +0.000063f, +0.000173f, +0.000006f, -0.000163f, +0.000018f, -0.000057f, + -0.000008f, -0.000038f, -0.000025f, +0.000089f, +0.000001f, +0.000004f + }, + { + +0.000251f, +0.005872f, -0.000966f, -0.001688f, -0.000385f, -0.000384f, -0.000270f, -0.000215f, +0.001046f, -0.000026f, + -0.000260f, +0.001413f, -0.000849f, -0.003404f, +0.033013f, -0.001366f, -0.000836f, -0.002464f, -0.001581f, +0.002352f, + +0.001448f, +0.000782f, +0.001710f, +0.000193f, -0.001939f, +0.001067f, +0.000158f, +0.000930f, +0.000539f, +0.002857f, + -0.001013f, +0.000834f, -0.000866f, -0.000192f, +0.000012f, -0.000080f, +0.000030f, -0.000444f, -0.000029f, -0.000368f, + -0.000391f, +0.000300f, +0.000137f, -0.000322f, -0.000223f, +0.000183f, -0.000677f, -0.000166f, -0.000098f, -0.000065f, + -0.000242f, +0.000298f, +0.000110f, -0.000242f, +0.000268f, -0.000368f, -0.000181f, +0.000002f, -0.000010f, -0.000105f, + -0.000079f, +0.000523f, -0.000190f, -0.000080f, +0.000141f, +0.000262f, -0.000099f, -0.000156f, +0.000056f, +0.000043f, + +0.000141f, +0.000070f, +0.000002f, -0.000103f, -0.000040f, +0.000065f, +0.000102f, -0.000187f, -0.000051f, -0.000228f, + -0.000012f, +0.000145f, -0.000143f, +0.000033f, +0.000050f, -0.000074f, -0.000104f, -0.000069f, +0.000044f, -0.000101f, + -0.000033f, +0.000104f, +0.000064f, -0.000014f, +0.000012f, +0.000051f + }, + { + -0.003883f, +0.007999f, +0.003868f, -0.002244f, -0.000428f, -0.000596f, +0.001012f, +0.000050f, -0.000450f, +0.000229f, + +0.000209f, +0.000575f, +0.001619f, +0.000373f, -0.007890f, +0.000207f, +0.002943f, +0.001339f, -0.000627f, +0.000895f, + -0.001446f, -0.000355f, -0.000528f, +0.000341f, +0.000564f, -0.000786f, -0.000940f, +0.001589f, +0.000141f, +0.001307f, + -0.000441f, +0.000089f, +0.000163f, -0.000421f, +0.000368f, -0.000201f, -0.000623f, -0.000451f, -0.000458f, +0.000510f, + +0.000529f, +0.000203f, +0.000278f, +0.000114f, +0.000348f, +0.000299f, -0.000049f, -0.000202f, +0.000387f, -0.000313f, + -0.000018f, -0.000087f, +0.000082f, +0.000386f, +0.000271f, +0.000363f, -0.000043f, -0.000185f, +0.000227f, +0.000225f, + -0.000022f, +0.000003f, -0.000341f, -0.000086f, +0.000071f, -0.000004f, +0.000016f, -0.000237f, +0.000054f, -0.000084f, + +0.000150f, -0.000104f, -0.000246f, -0.000033f, +0.000252f, +0.000050f, -0.000131f, +0.000096f, -0.000028f, -0.000020f, + -0.000025f, -0.000044f, -0.000015f, +0.000003f, +0.000001f, +0.000045f, +0.000013f, -0.000119f, +0.000184f, -0.000110f, + +0.000098f, +0.000041f, -0.000020f, +0.000020f, -0.000010f, +0.000039f + } + }, + { + { + -0.000332f, -0.011102f, -0.004470f, +0.001800f, +0.000766f, -0.000106f, +0.000263f, +0.000580f, +0.000197f, +0.000416f, + +0.000036f, -0.000182f, -0.000804f, -0.000866f, -0.000667f, -0.000030f, +0.000325f, -0.000983f, -0.000890f, -0.000830f, + +0.001845f, -0.000818f, +0.000122f, +0.001008f, +0.001072f, +0.001550f, +0.000946f, +0.001222f, +0.000854f, +0.000906f, + +0.000350f, +0.001718f, -0.000239f, -0.001423f, -0.000108f, -0.002470f, -0.000348f, +0.000379f, +0.000072f, +0.000708f, + -0.000127f, -0.000165f, -0.000066f, +0.000300f, -0.000211f, +0.000324f, +0.000062f, -0.000005f, +0.000242f, -0.000422f, + -0.000097f, -0.000583f, -0.000155f, -0.000268f, -0.000148f, +0.000285f, +0.000229f, +0.000314f, +0.000030f, -0.000017f, + -0.000134f, -0.000178f, +0.000251f, +0.000253f, -0.000011f, -0.000002f, -0.000035f, -0.000017f, -0.000104f, -0.000024f, + -0.000007f, +0.000003f, +0.000141f, +0.000009f, -0.000074f, -0.000147f, +0.000088f, +0.000024f, -0.000045f, +0.000049f, + -0.000023f, +0.000010f, -0.000072f, -0.000013f, +0.000051f, +0.000050f, -0.000006f, -0.000015f, +0.000001f, +0.000090f, + -0.000112f, -0.000029f, +0.000039f, +0.000051f, +0.000038f, -0.000004f + }, + { + +0.008797f, -0.040961f, -0.029053f, -0.002101f, -0.000289f, -0.000846f, +0.000035f, +0.000950f, -0.000117f, -0.000251f, + -0.000329f, -0.000440f, +0.000706f, +0.001599f, -0.001951f, -0.000300f, -0.000174f, +0.000411f, +0.001441f, -0.001029f, + +0.000069f, -0.000209f, -0.000237f, +0.000143f, +0.000189f, -0.000106f, -0.000111f, +0.000924f, -0.000482f, +0.000348f, + -0.000575f, +0.000417f, -0.000599f, +0.000933f, -0.001055f, +0.000108f, -0.001112f, +0.000788f, +0.000559f, -0.000793f, + +0.000105f, +0.000635f, +0.000307f, -0.000117f, -0.000435f, +0.000333f, -0.000043f, -0.000289f, +0.000345f, -0.000543f, + -0.000145f, -0.000831f, -0.000425f, -0.000112f, -0.000016f, +0.000067f, -0.000010f, +0.000147f, -0.000123f, -0.000130f, + -0.000122f, +0.000104f, +0.000058f, +0.000083f, +0.000229f, +0.000131f, -0.000041f, -0.000276f, -0.000148f, -0.000129f, + -0.000022f, +0.000134f, -0.000029f, -0.000006f, +0.000080f, -0.000072f, -0.000043f, +0.000100f, +0.000040f, -0.000109f, + -0.000013f, +0.000068f, -0.000039f, -0.000032f, +0.000040f, +0.000158f, -0.000042f, +0.000006f, -0.000044f, -0.000018f, + -0.000004f, -0.000032f, -0.000010f, +0.000021f, -0.000013f, +0.000033f + }, + { + +0.004364f, +0.011511f, -0.010102f, -0.000362f, +0.000686f, +0.000191f, -0.000382f, +0.000055f, +0.000685f, +0.001110f, + -0.000144f, -0.000639f, -0.000397f, +0.000079f, +0.004698f, +0.000358f, -0.002063f, +0.001302f, +0.001006f, -0.000864f, + +0.000916f, +0.001009f, -0.000130f, +0.000530f, -0.000137f, -0.000477f, +0.000053f, +0.000514f, +0.000984f, +0.000356f, + +0.000333f, +0.000588f, +0.000406f, +0.000462f, +0.000047f, -0.000023f, +0.000718f, -0.000626f, +0.000441f, +0.000730f, + -0.000390f, +0.000582f, +0.000222f, -0.000324f, +0.000168f, -0.000135f, -0.000322f, -0.000343f, -0.000655f, +0.000116f, + +0.000417f, -0.000312f, -0.000029f, -0.000287f, +0.000038f, -0.000079f, -0.000436f, -0.000082f, +0.000061f, +0.000035f, + -0.000003f, -0.000218f, -0.000043f, -0.000127f, -0.000285f, -0.000233f, -0.000216f, -0.000042f, +0.000182f, -0.000028f, + -0.000109f, -0.000031f, +0.000098f, -0.000046f, +0.000034f, +0.000021f, +0.000023f, +0.000018f, +0.000083f, -0.000103f, + +0.000027f, -0.000044f, -0.000114f, +0.000019f, +0.000083f, -0.000055f, +0.000025f, +0.000042f, -0.000041f, +0.000061f, + -0.000038f, -0.000042f, -0.000049f, +0.000035f, -0.000033f, -0.000053f + }, + { + +0.000339f, +0.008694f, -0.000061f, -0.000570f, +0.000251f, +0.000154f, -0.000206f, -0.000169f, -0.000135f, +0.000465f, + +0.000598f, +0.000430f, -0.000344f, +0.001282f, +0.006298f, -0.002177f, -0.004194f, +0.000377f, +0.000329f, +0.000677f, + +0.001267f, +0.000211f, +0.000221f, -0.000390f, -0.000474f, +0.000356f, -0.002770f, -0.002314f, -0.000346f, +0.000315f, + -0.002665f, +0.000591f, +0.001375f, +0.000461f, -0.000044f, +0.001084f, +0.000862f, +0.000088f, -0.000322f, +0.000141f, + -0.000194f, -0.000202f, +0.000123f, -0.000056f, +0.000200f, -0.000499f, -0.000238f, +0.000230f, -0.000324f, +0.000009f, + +0.000207f, -0.000167f, -0.000133f, +0.000248f, -0.000329f, -0.000032f, +0.000128f, -0.000283f, +0.000141f, +0.000199f, + +0.000003f, -0.000118f, +0.000129f, -0.000236f, -0.000117f, +0.000200f, -0.000010f, +0.000002f, -0.000029f, +0.000087f, + +0.000085f, -0.000081f, +0.000060f, -0.000040f, +0.000111f, -0.000017f, -0.000126f, -0.000071f, +0.000105f, -0.000002f, + +0.000053f, -0.000041f, +0.000045f, -0.000011f, -0.000002f, +0.000075f, -0.000044f, -0.000020f, -0.000018f, -0.000021f, + -0.000028f, -0.000052f, -0.000047f, +0.000042f, -0.000018f, -0.000027f + }, + { + -0.003880f, -0.034254f, -0.000037f, -0.002594f, +0.000544f, -0.000161f, +0.000078f, -0.000649f, +0.000271f, +0.000788f, + -0.000884f, -0.000441f, +0.000623f, +0.001675f, -0.000828f, +0.000741f, +0.000466f, +0.005467f, +0.000740f, -0.000107f, + -0.000481f, -0.000287f, +0.000899f, +0.000387f, +0.000497f, +0.000166f, +0.000324f, +0.000187f, -0.000094f, -0.000736f, + -0.001065f, -0.000648f, -0.000699f, +0.000346f, +0.000354f, -0.000493f, -0.000471f, -0.000887f, -0.000326f, +0.000672f, + +0.000040f, -0.000273f, -0.000115f, -0.000121f, -0.000228f, -0.000735f, -0.000218f, +0.000108f, -0.000107f, -0.000000f, + -0.000414f, -0.000295f, +0.000114f, -0.000065f, +0.000160f, -0.000089f, +0.000373f, +0.000080f, -0.000322f, +0.000062f, + +0.000040f, -0.000072f, -0.000145f, +0.000115f, +0.000103f, -0.000142f, -0.000021f, +0.000069f, -0.000012f, +0.000002f, + -0.000051f, +0.000088f, +0.000009f, -0.000180f, -0.000058f, +0.000139f, -0.000162f, +0.000164f, -0.000015f, -0.000120f, + -0.000061f, +0.000061f, -0.000079f, +0.000128f, -0.000014f, -0.000063f, +0.000009f, -0.000068f, +0.000069f, +0.000031f, + +0.000024f, +0.000012f, +0.000021f, -0.000000f, -0.000041f, -0.000023f + }, + { + -0.000300f, -0.007224f, +0.000494f, +0.000734f, +0.000022f, -0.000057f, -0.000416f, -0.000194f, -0.000136f, +0.000120f, + +0.000302f, +0.000680f, +0.001085f, +0.002054f, -0.001108f, +0.000219f, -0.000453f, +0.000056f, +0.000663f, -0.006154f, + -0.001185f, +0.001408f, +0.000762f, +0.001950f, +0.000709f, -0.001609f, +0.001313f, -0.001745f, -0.002145f, +0.002179f, + +0.001574f, +0.000711f, -0.000072f, -0.000080f, +0.000050f, +0.000226f, +0.000224f, -0.000195f, -0.000202f, +0.000064f, + -0.000095f, +0.000575f, +0.000302f, +0.000156f, -0.000007f, -0.000179f, +0.000086f, -0.000008f, -0.000440f, -0.000195f, + -0.000332f, -0.000222f, -0.000158f, -0.000231f, -0.000395f, -0.000061f, +0.000257f, +0.000021f, +0.000229f, +0.000082f, + +0.000043f, +0.000022f, -0.000134f, +0.000067f, -0.000141f, -0.000013f, +0.000038f, -0.000145f, +0.000137f, +0.000192f, + -0.000064f, -0.000004f, +0.000107f, +0.000004f, -0.000138f, -0.000160f, -0.000062f, +0.000008f, +0.000013f, +0.000115f, + -0.000083f, +0.000132f, +0.000103f, +0.000044f, -0.000078f, -0.000031f, -0.000001f, +0.000007f, -0.000018f, +0.000024f, + +0.000063f, -0.000035f, -0.000105f, +0.000021f, +0.000075f, +0.000050f + }, + { + -0.008112f, -0.045556f, -0.008426f, +0.001732f, +0.000265f, -0.000193f, +0.000087f, +0.000505f, +0.000364f, +0.000021f, + -0.000644f, +0.000552f, +0.000063f, -0.000904f, -0.000002f, +0.000890f, -0.000057f, -0.000565f, +0.001162f, +0.000192f, + +0.000361f, -0.000270f, -0.000130f, +0.000187f, -0.000417f, +0.000159f, +0.000041f, +0.000138f, +0.000530f, -0.000259f, + +0.000505f, -0.000618f, -0.000286f, +0.000371f, -0.000614f, -0.000134f, +0.000309f, -0.001032f, -0.000173f, +0.000387f, + -0.000033f, +0.000428f, +0.000656f, -0.000148f, +0.000263f, -0.000017f, +0.000686f, +0.000231f, -0.000292f, +0.000046f, + -0.000259f, -0.000295f, -0.000275f, +0.000188f, +0.000004f, -0.000116f, -0.000242f, +0.000031f, -0.000168f, -0.000089f, + +0.000090f, +0.000071f, -0.000092f, -0.000105f, -0.000200f, -0.000178f, -0.000223f, +0.000126f, -0.000037f, -0.000033f, + +0.000297f, +0.000019f, -0.000286f, +0.000019f, +0.000090f, -0.000066f, -0.000045f, +0.000033f, -0.000083f, -0.000094f, + +0.000097f, +0.000049f, -0.000029f, -0.000010f, +0.000095f, -0.000102f, -0.000063f, +0.000012f, +0.000012f, +0.000030f, + -0.000033f, +0.000050f, +0.000017f, +0.000002f, -0.000035f, +0.000002f + }, + { + +0.000083f, -0.002175f, +0.000968f, -0.000113f, +0.000092f, +0.000135f, +0.000041f, -0.000096f, -0.000540f, +0.000090f, + +0.000874f, +0.000875f, +0.000896f, +0.001034f, -0.003820f, -0.001973f, -0.001062f, +0.001929f, +0.000548f, -0.000103f, + +0.001499f, +0.000114f, +0.001694f, +0.000986f, -0.000193f, +0.002264f, +0.001059f, -0.001439f, +0.000675f, +0.000480f, + +0.000544f, -0.000601f, -0.000387f, -0.000380f, +0.000426f, +0.000075f, +0.000071f, -0.000055f, -0.000756f, +0.000753f, + -0.000351f, +0.000516f, +0.000185f, +0.000255f, -0.000554f, +0.000140f, -0.000108f, +0.000433f, -0.000192f, -0.000356f, + -0.000275f, -0.000139f, -0.000208f, -0.000222f, -0.000053f, +0.000182f, -0.000144f, -0.000286f, +0.000234f, +0.000143f, + -0.000310f, -0.000250f, -0.000042f, +0.000080f, +0.000087f, -0.000101f, -0.000180f, -0.000025f, +0.000209f, +0.000038f, + +0.000035f, -0.000052f, -0.000031f, -0.000117f, -0.000021f, +0.000027f, -0.000054f, -0.000034f, +0.000060f, -0.000038f, + +0.000129f, +0.000105f, +0.000017f, -0.000079f, -0.000107f, -0.000039f, -0.000049f, -0.000000f, -0.000013f, -0.000043f, + +0.000035f, -0.000023f, -0.000010f, +0.000072f, +0.000041f, +0.000020f + }, + { + +0.002741f, +0.040632f, +0.001226f, -0.003657f, -0.000355f, -0.000027f, +0.000760f, +0.000968f, -0.000547f, -0.000505f, + +0.001516f, +0.000833f, +0.000250f, -0.002869f, +0.001844f, -0.001255f, -0.000670f, +0.000123f, -0.000071f, -0.000690f, + -0.001091f, +0.000027f, -0.000817f, -0.000154f, +0.000484f, +0.000548f, -0.000312f, +0.000012f, +0.000687f, -0.000451f, + -0.000144f, -0.000169f, +0.000121f, +0.000543f, +0.000039f, -0.000419f, +0.000831f, -0.000910f, -0.000243f, -0.000264f, + +0.000344f, +0.000039f, -0.000022f, -0.000297f, +0.000126f, -0.000007f, -0.000410f, +0.000120f, +0.000313f, -0.000930f, + -0.000411f, +0.000203f, +0.000075f, +0.000196f, +0.000554f, +0.000171f, -0.000278f, -0.000152f, +0.000207f, +0.000172f, + -0.000002f, -0.000011f, +0.000030f, +0.000074f, +0.000171f, -0.000040f, -0.000147f, +0.000067f, +0.000022f, -0.000026f, + +0.000152f, +0.000197f, -0.000004f, +0.000084f, -0.000017f, +0.000087f, -0.000121f, -0.000033f, -0.000057f, +0.000036f, + -0.000048f, +0.000093f, +0.000081f, +0.000010f, +0.000076f, -0.000011f, -0.000072f, +0.000004f, -0.000014f, +0.000004f, + +0.000057f, +0.000025f, +0.000045f, -0.000064f, +0.000007f, +0.000050f + }, + { + +0.000686f, +0.008614f, -0.003023f, -0.000864f, -0.000156f, -0.001704f, +0.001125f, +0.001298f, -0.000400f, -0.000022f, + -0.001012f, +0.001126f, -0.000204f, -0.001244f, -0.001239f, -0.000116f, +0.002552f, -0.002471f, -0.003064f, +0.001213f, + +0.000978f, +0.000002f, -0.000928f, -0.000513f, +0.000710f, +0.000921f, -0.000085f, +0.000154f, +0.000249f, -0.000170f, + +0.000041f, +0.000065f, -0.000504f, -0.000771f, -0.000013f, -0.000641f, -0.000690f, -0.000286f, +0.000384f, -0.000299f, + +0.000180f, +0.000098f, +0.000277f, +0.000372f, -0.000356f, +0.000088f, +0.000148f, +0.000106f, -0.000041f, -0.000286f, + +0.000058f, -0.000058f, -0.000149f, -0.000046f, +0.000315f, -0.000056f, -0.000075f, -0.000007f, -0.000195f, -0.000092f, + +0.000101f, +0.000130f, +0.000091f, -0.000067f, -0.000001f, -0.000116f, -0.000060f, -0.000207f, -0.000148f, +0.000261f, + +0.000006f, +0.000044f, +0.000092f, -0.000049f, -0.000012f, +0.000041f, +0.000008f, +0.000019f, +0.000056f, +0.000079f, + +0.000071f, -0.000026f, -0.000050f, -0.000001f, -0.000088f, -0.000012f, +0.000089f, -0.000003f, +0.000018f, -0.000047f, + +0.000018f, +0.000001f, -0.000027f, -0.000013f, -0.000046f, +0.000035f + }, + { + -0.000640f, +0.047561f, -0.000689f, +0.004519f, +0.000706f, +0.002294f, +0.007543f, +0.000525f, -0.000432f, -0.000686f, + -0.000182f, -0.000174f, -0.000038f, -0.000815f, -0.001183f, +0.000748f, +0.000380f, -0.002089f, -0.000184f, -0.000900f, + +0.000158f, -0.000722f, -0.000185f, -0.000288f, -0.000504f, -0.000381f, -0.000178f, -0.000210f, -0.000764f, -0.000080f, + -0.000292f, +0.000273f, -0.000021f, -0.000192f, -0.000160f, +0.000154f, -0.000127f, -0.000554f, -0.000137f, -0.000160f, + -0.000226f, +0.000220f, -0.000158f, -0.000221f, +0.000366f, -0.000062f, -0.000129f, +0.000058f, +0.000195f, +0.000186f, + +0.000057f, -0.000026f, -0.000076f, +0.000369f, +0.000188f, +0.000107f, -0.000274f, -0.000174f, +0.000029f, +0.000174f, + -0.000000f, +0.000195f, -0.000012f, +0.000014f, -0.000049f, -0.000093f, +0.000036f, -0.000034f, -0.000079f, +0.000010f, + +0.000030f, -0.000048f, -0.000079f, -0.000100f, -0.000042f, -0.000057f, +0.000046f, +0.000173f, -0.000017f, +0.000095f, + -0.000098f, -0.000085f, +0.000094f, -0.000133f, +0.000004f, -0.000075f, -0.000005f, +0.000035f, +0.000025f, -0.000021f, + -0.000066f, +0.000014f, +0.000065f, -0.000012f, -0.000092f, -0.000003f + }, + { + -0.000600f, -0.003086f, +0.001019f, -0.000109f, -0.000054f, +0.000295f, +0.000089f, -0.000273f, -0.000356f, +0.000452f, + +0.000266f, +0.000160f, -0.003006f, -0.004283f, +0.002785f, -0.001543f, -0.001459f, -0.001420f, -0.000282f, +0.000911f, + -0.000499f, -0.002799f, -0.002040f, +0.000562f, -0.000039f, +0.000861f, -0.001892f, +0.000044f, -0.001499f, +0.001334f, + +0.001079f, -0.000388f, +0.000337f, +0.000668f, -0.000628f, -0.000400f, -0.000450f, -0.000285f, +0.000190f, -0.000275f, + -0.000108f, +0.000403f, -0.000358f, -0.000413f, -0.000160f, -0.000329f, +0.000326f, -0.000294f, +0.000432f, -0.000276f, + -0.000246f, +0.000062f, -0.000165f, +0.000006f, -0.000022f, +0.000173f, +0.000328f, +0.000414f, +0.000002f, -0.000034f, + -0.000211f, -0.000124f, +0.000139f, +0.000134f, -0.000079f, -0.000161f, +0.000246f, +0.000012f, +0.000083f, -0.000041f, + -0.000087f, -0.000030f, -0.000114f, -0.000145f, -0.000033f, -0.000096f, +0.000038f, +0.000147f, +0.000059f, +0.000036f, + -0.000034f, +0.000046f, +0.000053f, +0.000021f, -0.000024f, +0.000043f, +0.000070f, -0.000043f, -0.000034f, -0.000031f, + -0.000017f, +0.000016f, +0.000013f, +0.000036f, -0.000051f, -0.000003f + }, + { + -0.000043f, +0.005544f, +0.000432f, -0.001659f, -0.000271f, -0.001684f, +0.002977f, +0.001482f, +0.001665f, -0.000662f, + -0.001551f, +0.000148f, -0.001905f, +0.000952f, -0.000885f, +0.000678f, -0.000499f, -0.000878f, +0.000289f, -0.001164f, + +0.000485f, +0.000447f, +0.000624f, +0.001167f, +0.000230f, -0.000114f, -0.000326f, -0.000047f, +0.000486f, +0.000481f, + -0.000447f, -0.000612f, +0.000118f, +0.000348f, -0.000041f, -0.000374f, +0.000247f, +0.000311f, -0.000497f, +0.000367f, + +0.000374f, +0.000449f, +0.000495f, +0.000266f, +0.000212f, -0.000085f, +0.000013f, +0.000192f, -0.000310f, -0.000254f, + +0.000333f, -0.000034f, +0.000471f, -0.000402f, -0.000209f, +0.000128f, +0.000038f, +0.000413f, +0.000135f, -0.000215f, + +0.000161f, -0.000013f, +0.000162f, -0.000146f, +0.000015f, +0.000128f, +0.000024f, +0.000049f, -0.000197f, -0.000047f, + +0.000109f, +0.000040f, -0.000063f, -0.000060f, +0.000035f, +0.000024f, -0.000013f, -0.000082f, -0.000006f, -0.000079f, + +0.000125f, +0.000051f, -0.000084f, -0.000189f, -0.000031f, +0.000155f, +0.000154f, +0.000037f, +0.000010f, +0.000001f, + -0.000011f, -0.000037f, -0.000082f, +0.000005f, -0.000033f, -0.000054f + }, + { + +0.000168f, +0.005495f, +0.001993f, -0.001889f, -0.000690f, -0.000160f, -0.000053f, -0.000580f, +0.000269f, +0.000998f, + +0.000660f, +0.000506f, -0.000478f, +0.012134f, +0.004761f, +0.005153f, -0.003821f, -0.001745f, -0.000247f, -0.000153f, + +0.001063f, -0.000121f, +0.000581f, +0.000338f, -0.000166f, -0.002081f, -0.000416f, +0.001588f, +0.000237f, +0.002524f, + +0.000293f, +0.000605f, -0.000824f, -0.000457f, +0.001458f, +0.000402f, -0.000301f, +0.000145f, -0.000791f, +0.000132f, + -0.000242f, -0.000155f, -0.000007f, -0.000295f, -0.000256f, +0.000021f, -0.000500f, -0.000141f, -0.000184f, +0.000015f, + -0.000093f, -0.000288f, +0.000198f, +0.000004f, +0.000035f, -0.000123f, -0.000134f, -0.000052f, +0.000085f, -0.000097f, + -0.000159f, +0.000152f, +0.000065f, -0.000120f, +0.000009f, +0.000218f, -0.000019f, -0.000277f, +0.000052f, -0.000006f, + +0.000184f, +0.000016f, -0.000108f, +0.000018f, +0.000030f, -0.000039f, +0.000064f, -0.000130f, -0.000148f, -0.000107f, + -0.000126f, +0.000132f, +0.000034f, -0.000034f, +0.000095f, +0.000001f, -0.000034f, -0.000052f, +0.000054f, -0.000059f, + -0.000105f, +0.000001f, +0.000087f, -0.000007f, -0.000030f, +0.000074f + }, + { + +0.002475f, -0.000910f, +0.000372f, +0.004246f, -0.001687f, -0.002168f, +0.000396f, -0.000952f, -0.000083f, +0.000551f, + -0.001544f, +0.001679f, +0.000398f, -0.002118f, -0.003196f, -0.000544f, +0.001974f, -0.000259f, +0.000203f, +0.000359f, + +0.000098f, -0.000666f, -0.000796f, -0.000372f, +0.000533f, +0.000051f, -0.000231f, -0.000505f, +0.000968f, +0.000131f, + +0.000444f, -0.000892f, +0.000319f, -0.000023f, +0.000232f, +0.000510f, -0.000096f, -0.000874f, +0.000012f, +0.000085f, + -0.000219f, +0.000568f, +0.000660f, +0.000240f, -0.000336f, +0.000284f, +0.000023f, -0.000015f, +0.000152f, -0.000313f, + -0.000096f, -0.000067f, -0.000106f, +0.000215f, +0.000277f, +0.000283f, +0.000249f, -0.000102f, +0.000174f, +0.000197f, + -0.000067f, +0.000184f, -0.000143f, -0.000138f, -0.000051f, +0.000096f, -0.000018f, -0.000099f, +0.000126f, -0.000047f, + +0.000021f, +0.000108f, -0.000242f, -0.000211f, +0.000042f, +0.000121f, +0.000061f, -0.000015f, -0.000092f, +0.000085f, + -0.000027f, -0.000150f, -0.000016f, +0.000010f, -0.000005f, -0.000003f, -0.000004f, -0.000148f, +0.000044f, +0.000034f, + +0.000024f, +0.000057f, +0.000006f, -0.000017f, -0.000051f, +0.000057f + } + }, + { + { + -0.000355f, -0.000278f, +0.000117f, -0.000383f, +0.000598f, -0.000314f, +0.000041f, +0.000506f, -0.000466f, +0.000159f, + -0.000560f, +0.000873f, -0.001611f, -0.000350f, +0.000654f, -0.000637f, +0.002258f, -0.000854f, -0.001116f, -0.001266f, + +0.001747f, -0.000183f, +0.000202f, +0.000243f, -0.000561f, +0.000482f, -0.000025f, -0.000508f, +0.000766f, +0.001453f, + -0.001767f, +0.001353f, -0.001061f, -0.000956f, +0.001196f, -0.001295f, +0.000366f, -0.000584f, -0.000588f, +0.000113f, + +0.000061f, +0.000279f, -0.000126f, -0.000063f, +0.000028f, +0.000354f, -0.000194f, +0.000248f, +0.000358f, -0.000376f, + +0.000268f, -0.000737f, -0.000246f, +0.000108f, -0.000407f, +0.000102f, +0.000331f, +0.000068f, +0.000209f, +0.000328f, + +0.000240f, -0.000158f, -0.000069f, +0.000152f, +0.000130f, -0.000041f, -0.000224f, -0.000037f, +0.000099f, -0.000047f, + -0.000013f, +0.000015f, -0.000080f, +0.000145f, -0.000065f, -0.000058f, +0.000054f, +0.000093f, -0.000031f, -0.000031f, + -0.000049f, +0.000106f, +0.000014f, -0.000043f, -0.000120f, -0.000029f, +0.000060f, +0.000019f, -0.000056f, +0.000025f, + +0.000048f, -0.000068f, +0.000018f, -0.000041f, -0.000006f, +0.000032f + }, + { + -0.010001f, -0.023968f, +0.001764f, -0.002906f, +0.001948f, +0.000458f, -0.001133f, +0.000496f, +0.001663f, -0.000031f, + -0.000176f, +0.000757f, -0.000551f, +0.001551f, -0.000382f, +0.000587f, +0.001734f, -0.000112f, -0.001076f, -0.000495f, + -0.000126f, -0.000756f, +0.000456f, +0.000457f, -0.000232f, -0.000457f, -0.000008f, +0.001320f, +0.000041f, +0.000714f, + -0.000445f, +0.000630f, -0.001055f, +0.000188f, -0.000201f, +0.000354f, -0.001252f, +0.000226f, +0.000109f, -0.000261f, + +0.000457f, +0.000380f, -0.000019f, +0.000200f, +0.000076f, -0.000347f, +0.000560f, -0.000600f, +0.000516f, -0.000322f, + +0.000346f, +0.000121f, -0.000270f, -0.000288f, +0.000021f, -0.000072f, +0.000140f, -0.000189f, -0.000188f, -0.000064f, + +0.000059f, -0.000091f, -0.000010f, -0.000125f, -0.000062f, +0.000045f, +0.000299f, -0.000050f, +0.000036f, -0.000219f, + -0.000063f, +0.000029f, +0.000061f, -0.000071f, -0.000115f, +0.000194f, -0.000109f, +0.000022f, +0.000082f, +0.000079f, + +0.000018f, -0.000032f, +0.000054f, -0.000026f, -0.000045f, -0.000093f, +0.000162f, -0.000094f, +0.000036f, -0.000043f, + -0.000018f, -0.000012f, +0.000049f, -0.000043f, +0.000014f, -0.000038f + }, + { + -0.004756f, +0.020018f, +0.009213f, +0.002699f, -0.002076f, -0.000697f, +0.000033f, -0.000570f, +0.000116f, -0.000092f, + -0.000083f, -0.000199f, -0.000079f, -0.000561f, +0.002822f, +0.000321f, -0.001260f, +0.002202f, -0.000868f, -0.001434f, + +0.000103f, +0.000665f, -0.000052f, +0.001049f, +0.000750f, -0.000087f, -0.000270f, -0.000644f, +0.000335f, +0.000560f, + +0.000229f, -0.000368f, -0.000114f, +0.000025f, +0.000278f, -0.000062f, +0.000188f, -0.000270f, +0.000138f, -0.000229f, + +0.000138f, -0.000297f, +0.000456f, +0.000024f, -0.000142f, -0.000401f, +0.000244f, +0.000109f, -0.000212f, -0.000368f, + +0.000101f, +0.000151f, +0.000220f, -0.000323f, +0.000113f, +0.000288f, -0.000077f, -0.000285f, -0.000106f, -0.000028f, + +0.000303f, -0.000083f, -0.000186f, -0.000084f, +0.000063f, -0.000078f, -0.000066f, -0.000003f, +0.000246f, +0.000099f, + -0.000095f, +0.000032f, +0.000104f, -0.000029f, -0.000095f, +0.000031f, +0.000003f, +0.000011f, +0.000001f, +0.000035f, + +0.000128f, -0.000037f, -0.000004f, -0.000144f, +0.000076f, +0.000036f, -0.000048f, +0.000040f, +0.000007f, +0.000041f, + +0.000068f, -0.000062f, -0.000012f, -0.000029f, +0.000015f, +0.000014f + }, + { + -0.000383f, +0.008210f, +0.001052f, -0.000266f, -0.000467f, +0.000037f, +0.000051f, +0.000160f, -0.000060f, -0.000070f, + +0.000022f, +0.000492f, +0.000519f, -0.000278f, +0.003190f, +0.002994f, +0.002529f, +0.001586f, +0.000221f, +0.000774f, + -0.000903f, +0.000417f, +0.001489f, -0.000399f, +0.000917f, +0.001861f, -0.000334f, -0.002320f, -0.002274f, +0.001505f, + +0.000655f, -0.000179f, +0.000239f, +0.000467f, +0.000378f, +0.000836f, -0.000667f, +0.000656f, +0.000321f, -0.000580f, + -0.000318f, -0.000056f, -0.000021f, +0.000110f, +0.000531f, -0.000048f, -0.000117f, +0.000233f, -0.000094f, -0.000115f, + -0.000025f, +0.000295f, -0.000088f, +0.000044f, -0.000337f, -0.000372f, +0.000128f, +0.000207f, -0.000220f, -0.000096f, + +0.000199f, +0.000150f, +0.000000f, -0.000120f, -0.000098f, +0.000095f, +0.000018f, +0.000025f, -0.000013f, -0.000089f, + -0.000063f, +0.000084f, +0.000205f, +0.000004f, -0.000070f, +0.000148f, +0.000031f, -0.000064f, -0.000029f, -0.000070f, + -0.000002f, +0.000063f, -0.000058f, -0.000026f, -0.000134f, +0.000021f, +0.000073f, +0.000043f, -0.000013f, -0.000053f, + +0.000039f, +0.000053f, -0.000053f, -0.000026f, +0.000021f, -0.000042f + }, + { + +0.006274f, -0.015100f, +0.007043f, -0.000098f, +0.000612f, -0.000548f, -0.000134f, -0.000481f, +0.000314f, +0.001267f, + +0.000396f, -0.001758f, +0.000190f, +0.001667f, -0.000782f, +0.001580f, -0.000909f, +0.003445f, +0.001106f, +0.000413f, + -0.000141f, -0.000483f, +0.000324f, -0.000935f, +0.001726f, -0.000800f, +0.000084f, -0.000428f, +0.000693f, +0.000218f, + -0.000186f, -0.000023f, +0.000193f, -0.000148f, -0.000101f, -0.000072f, -0.000037f, +0.000234f, +0.000041f, -0.000354f, + -0.000043f, -0.000147f, +0.000281f, -0.000110f, -0.000043f, -0.000274f, -0.000096f, +0.000274f, -0.000046f, +0.000022f, + +0.000252f, +0.000184f, -0.000595f, -0.000172f, -0.000056f, -0.000130f, -0.000184f, +0.000094f, -0.000008f, +0.000362f, + -0.000160f, -0.000084f, +0.000100f, -0.000126f, -0.000153f, -0.000026f, -0.000077f, +0.000163f, +0.000108f, +0.000034f, + -0.000094f, -0.000049f, +0.000110f, +0.000188f, +0.000095f, +0.000028f, -0.000009f, -0.000065f, +0.000003f, +0.000022f, + -0.000101f, +0.000013f, +0.000009f, -0.000094f, -0.000029f, +0.000033f, +0.000026f, -0.000016f, +0.000022f, +0.000072f, + -0.000042f, -0.000011f, +0.000007f, -0.000015f, +0.000040f, +0.000036f + }, + { + +0.000743f, -0.002709f, -0.000637f, +0.000440f, -0.000076f, +0.000166f, +0.000077f, +0.000128f, +0.000029f, -0.000198f, + -0.000460f, +0.000158f, -0.000802f, -0.002042f, +0.000974f, +0.003305f, -0.002967f, -0.000836f, +0.002186f, -0.003281f, + -0.001407f, +0.000382f, -0.001207f, -0.000496f, +0.000216f, +0.000195f, +0.001504f, -0.001433f, -0.000166f, +0.000620f, + -0.001079f, -0.000260f, +0.000435f, +0.000262f, -0.000429f, +0.000372f, +0.000150f, -0.000792f, -0.000188f, +0.000004f, + +0.000477f, -0.000284f, +0.000162f, +0.000271f, -0.000373f, -0.000145f, -0.000119f, +0.000178f, +0.000045f, +0.000273f, + +0.000156f, +0.000011f, -0.000146f, +0.000241f, +0.000272f, -0.000132f, -0.000068f, -0.000039f, +0.000110f, -0.000005f, + -0.000003f, +0.000160f, -0.000025f, -0.000019f, -0.000021f, -0.000095f, -0.000006f, -0.000030f, +0.000034f, +0.000122f, + +0.000096f, -0.000018f, -0.000063f, +0.000006f, +0.000058f, -0.000037f, +0.000030f, -0.000162f, -0.000054f, +0.000009f, + +0.000008f, -0.000037f, -0.000019f, +0.000042f, +0.000062f, -0.000024f, -0.000021f, +0.000028f, -0.000024f, -0.000065f, + -0.000013f, +0.000069f, +0.000039f, -0.000063f, -0.000016f, -0.000038f + }, + { + +0.003288f, -0.010633f, +0.004842f, +0.000458f, -0.000013f, -0.000561f, +0.000177f, -0.000581f, -0.000727f, +0.000575f, + +0.000162f, +0.000227f, -0.000045f, +0.000052f, +0.000555f, -0.001326f, -0.000413f, -0.000366f, -0.000721f, +0.000515f, + +0.000790f, +0.000612f, -0.000158f, -0.000278f, -0.000427f, -0.000003f, +0.000526f, -0.000402f, +0.000059f, -0.000662f, + +0.000483f, -0.000203f, -0.000549f, +0.000324f, -0.000735f, -0.000431f, +0.000448f, -0.000425f, +0.000202f, +0.000331f, + -0.000429f, -0.000354f, +0.000344f, +0.000162f, +0.000027f, -0.000213f, +0.000175f, +0.000460f, +0.000001f, +0.000093f, + +0.000254f, -0.000285f, +0.000173f, -0.000043f, +0.000052f, +0.000071f, -0.000260f, +0.000153f, +0.000017f, -0.000103f, + +0.000011f, +0.000001f, -0.000019f, +0.000066f, +0.000059f, +0.000078f, -0.000142f, -0.000086f, +0.000095f, +0.000027f, + -0.000049f, +0.000183f, +0.000100f, -0.000104f, -0.000073f, -0.000011f, +0.000088f, -0.000056f, -0.000026f, -0.000012f, + -0.000156f, +0.000065f, +0.000002f, -0.000175f, -0.000036f, +0.000096f, -0.000033f, -0.000033f, +0.000003f, +0.000085f, + +0.000043f, -0.000042f, +0.000033f, -0.000015f, -0.000004f, +0.000013f + }, + { + +0.000666f, -0.000547f, -0.001958f, -0.000051f, -0.000394f, +0.000061f, +0.000036f, -0.000068f, +0.000050f, -0.000193f, + -0.000129f, -0.000058f, +0.000121f, +0.000590f, +0.002188f, +0.004920f, -0.000416f, +0.003089f, -0.000318f, -0.001381f, + +0.000177f, +0.000005f, -0.000589f, +0.000020f, -0.000125f, +0.002034f, +0.001997f, -0.001067f, +0.000759f, +0.000757f, + -0.000136f, -0.000362f, +0.000588f, -0.000480f, +0.000325f, +0.000523f, +0.000008f, -0.000269f, -0.000942f, -0.000157f, + -0.000516f, +0.000499f, -0.000319f, +0.000038f, +0.000001f, +0.000235f, +0.000172f, -0.000397f, +0.000155f, +0.000609f, + -0.000219f, -0.000225f, +0.000149f, +0.000376f, -0.000195f, +0.000090f, -0.000015f, -0.000415f, +0.000007f, +0.000461f, + -0.000152f, -0.000065f, -0.000167f, +0.000004f, -0.000002f, +0.000137f, +0.000186f, -0.000037f, -0.000055f, -0.000047f, + -0.000021f, -0.000113f, +0.000041f, +0.000061f, -0.000077f, -0.000069f, +0.000056f, -0.000035f, -0.000047f, -0.000009f, + -0.000066f, +0.000063f, +0.000027f, +0.000041f, +0.000093f, -0.000035f, +0.000037f, -0.000068f, +0.000016f, +0.000019f, + -0.000070f, -0.000004f, -0.000005f, +0.000019f, +0.000015f, +0.000003f + }, + { + +0.000102f, +0.034658f, +0.001798f, -0.002796f, -0.000464f, -0.000254f, -0.000231f, -0.000634f, +0.001113f, -0.000323f, + -0.001311f, +0.000488f, +0.000596f, -0.001232f, +0.000737f, +0.001415f, +0.000175f, +0.000099f, +0.000488f, -0.000116f, + -0.000873f, -0.000598f, +0.000147f, +0.000131f, -0.000184f, +0.001117f, -0.000750f, -0.000230f, +0.001087f, -0.000518f, + +0.000400f, -0.000553f, -0.000119f, +0.000229f, +0.000090f, +0.000031f, +0.001272f, -0.000239f, +0.000511f, -0.000190f, + +0.000465f, -0.000408f, -0.000261f, -0.000459f, -0.000508f, +0.000340f, -0.000644f, -0.000917f, +0.000618f, +0.000017f, + -0.000082f, +0.000237f, +0.000346f, +0.000227f, -0.000078f, -0.000079f, +0.000085f, +0.000164f, -0.000199f, +0.000162f, + +0.000283f, -0.000113f, -0.000031f, -0.000198f, -0.000104f, +0.000339f, +0.000120f, -0.000101f, +0.000006f, +0.000028f, + +0.000018f, +0.000176f, +0.000089f, -0.000068f, -0.000095f, -0.000129f, +0.000173f, -0.000065f, -0.000094f, -0.000014f, + +0.000072f, -0.000021f, +0.000019f, +0.000027f, +0.000052f, +0.000060f, +0.000067f, +0.000007f, -0.000078f, -0.000029f, + -0.000027f, -0.000001f, +0.000014f, +0.000049f, -0.000068f, +0.000044f + }, + { + -0.000683f, +0.008085f, -0.001011f, -0.002160f, +0.001197f, +0.000854f, -0.000469f, +0.000580f, -0.000099f, +0.000356f, + -0.001374f, +0.000352f, +0.001324f, +0.000907f, -0.000551f, -0.002547f, +0.001661f, +0.000160f, -0.001840f, -0.002413f, + +0.000724f, +0.000915f, +0.000146f, -0.000681f, -0.000442f, +0.000303f, +0.000319f, -0.000382f, -0.000512f, +0.000576f, + -0.000694f, +0.001021f, -0.000345f, -0.000473f, +0.000279f, -0.000362f, -0.000439f, -0.000638f, +0.000138f, -0.000226f, + -0.000256f, -0.000229f, -0.000146f, +0.000190f, +0.000486f, -0.000286f, -0.000012f, -0.000246f, +0.000366f, +0.000299f, + -0.000048f, -0.000187f, -0.000137f, -0.000270f, -0.000077f, +0.000497f, -0.000001f, +0.000138f, -0.000093f, -0.000171f, + +0.000018f, +0.000060f, -0.000057f, +0.000117f, -0.000063f, +0.000128f, +0.000213f, -0.000115f, -0.000114f, -0.000125f, + +0.000005f, +0.000005f, +0.000001f, +0.000198f, -0.000038f, -0.000084f, +0.000047f, +0.000085f, -0.000019f, +0.000016f, + +0.000083f, +0.000024f, -0.000034f, +0.000005f, -0.000013f, -0.000096f, +0.000006f, +0.000041f, +0.000021f, +0.000054f, + -0.000068f, +0.000037f, -0.000036f, +0.000024f, -0.000020f, -0.000038f + }, + { + -0.001978f, +0.040089f, -0.007545f, +0.000508f, +0.000522f, -0.002341f, -0.003302f, +0.000425f, +0.000530f, +0.000547f, + +0.000365f, +0.000657f, -0.000074f, -0.000350f, -0.001295f, -0.000461f, -0.000594f, -0.001087f, +0.000520f, +0.000277f, + -0.000143f, +0.000011f, -0.000372f, +0.000344f, -0.000598f, -0.000325f, +0.000226f, -0.000102f, -0.000092f, +0.000349f, + -0.000442f, +0.000064f, +0.000516f, +0.000456f, +0.000083f, -0.000911f, +0.000735f, -0.000629f, -0.000208f, +0.000370f, + -0.000732f, -0.000634f, +0.000216f, -0.000124f, +0.000532f, +0.000185f, +0.000056f, -0.000071f, -0.000256f, +0.000230f, + -0.000079f, +0.000056f, -0.000024f, -0.000150f, -0.000006f, +0.000157f, +0.000156f, +0.000278f, -0.000225f, -0.000007f, + -0.000050f, +0.000197f, -0.000005f, +0.000075f, +0.000111f, -0.000261f, +0.000089f, +0.000002f, +0.000080f, -0.000009f, + +0.000035f, -0.000002f, +0.000104f, +0.000006f, -0.000159f, +0.000006f, -0.000117f, -0.000038f, +0.000040f, -0.000026f, + +0.000017f, -0.000029f, -0.000004f, +0.000123f, -0.000036f, +0.000071f, -0.000130f, +0.000027f, -0.000080f, +0.000003f, + +0.000028f, -0.000014f, -0.000020f, +0.000021f, +0.000045f, -0.000055f + }, + { + +0.000553f, -0.003501f, +0.000221f, -0.000743f, +0.000135f, -0.000826f, +0.000360f, +0.000277f, -0.000343f, +0.000449f, + +0.000007f, -0.000612f, +0.002550f, +0.003798f, +0.001826f, -0.001713f, -0.000121f, -0.000311f, +0.000098f, +0.000111f, + -0.001471f, +0.002793f, -0.000339f, +0.001150f, -0.002201f, +0.000436f, +0.000072f, +0.001229f, -0.001200f, +0.001204f, + -0.001065f, +0.000465f, -0.000069f, +0.001257f, -0.000056f, +0.000119f, -0.000191f, +0.000401f, -0.000756f, +0.000016f, + -0.000444f, +0.000095f, +0.000226f, -0.000452f, -0.000307f, -0.000205f, +0.000178f, -0.000033f, +0.000308f, -0.000023f, + -0.000063f, +0.000012f, +0.000200f, +0.000005f, -0.000097f, -0.000226f, -0.000108f, +0.000309f, +0.000354f, +0.000033f, + +0.000151f, -0.000216f, -0.000156f, -0.000021f, +0.000194f, +0.000096f, -0.000154f, +0.000155f, +0.000003f, +0.000100f, + -0.000045f, -0.000077f, +0.000051f, -0.000069f, +0.000032f, +0.000024f, -0.000053f, -0.000072f, +0.000002f, -0.000027f, + +0.000110f, -0.000044f, -0.000044f, +0.000091f, +0.000013f, -0.000010f, +0.000021f, +0.000046f, +0.000020f, -0.000012f, + +0.000025f, +0.000040f, -0.000051f, -0.000033f, +0.000029f, +0.000000f + }, + { + -0.001178f, +0.002080f, +0.005296f, -0.002417f, +0.000829f, -0.001903f, -0.002108f, -0.000574f, +0.000036f, +0.001120f, + -0.000033f, -0.000243f, -0.000557f, +0.001907f, +0.000992f, +0.000498f, +0.000494f, -0.000177f, -0.000258f, -0.000217f, + -0.000926f, +0.000882f, -0.000216f, +0.000465f, -0.000238f, +0.000175f, -0.000819f, -0.000075f, -0.000003f, -0.000364f, + +0.000260f, -0.000474f, +0.000088f, +0.000786f, +0.000952f, -0.000335f, -0.000286f, -0.000011f, +0.000254f, -0.000284f, + -0.000448f, -0.000084f, +0.000610f, +0.000115f, +0.000567f, +0.000090f, +0.000331f, -0.000471f, +0.000570f, +0.000180f, + +0.000168f, -0.000160f, +0.000207f, -0.000132f, -0.000170f, -0.000235f, -0.000135f, +0.000135f, -0.000015f, +0.000129f, + -0.000052f, -0.000049f, +0.000063f, -0.000055f, -0.000145f, -0.000000f, -0.000005f, +0.000148f, +0.000142f, -0.000087f, + -0.000147f, +0.000159f, +0.000071f, -0.000117f, -0.000041f, +0.000049f, -0.000044f, +0.000103f, -0.000058f, +0.000000f, + -0.000151f, +0.000098f, +0.000054f, -0.000016f, -0.000039f, -0.000142f, +0.000041f, +0.000110f, -0.000031f, +0.000024f, + +0.000048f, -0.000002f, +0.000026f, -0.000061f, +0.000022f, -0.000033f + }, + { + -0.000496f, +0.002585f, +0.001551f, -0.000376f, -0.000008f, +0.000298f, +0.000272f, +0.000284f, -0.000194f, +0.000229f, + +0.000691f, -0.000253f, +0.001349f, -0.001256f, -0.028400f, +0.000777f, -0.001191f, -0.000733f, +0.001638f, -0.001025f, + -0.000821f, -0.001399f, -0.000237f, +0.000096f, -0.000774f, -0.001012f, -0.002243f, +0.000879f, -0.000895f, +0.001120f, + -0.000079f, +0.000057f, +0.000163f, +0.000604f, +0.000312f, +0.000604f, +0.000107f, +0.000092f, -0.000193f, +0.000190f, + +0.000415f, -0.000208f, -0.000489f, -0.000015f, +0.000034f, -0.000042f, +0.000137f, -0.000172f, +0.000056f, -0.000115f, + +0.000327f, -0.000476f, -0.000056f, -0.000179f, +0.000090f, -0.000018f, -0.000033f, +0.000103f, +0.000057f, +0.000063f, + +0.000101f, -0.000276f, +0.000026f, -0.000017f, +0.000055f, -0.000114f, +0.000313f, +0.000084f, -0.000026f, -0.000086f, + -0.000044f, -0.000048f, +0.000093f, -0.000037f, +0.000072f, -0.000014f, -0.000151f, +0.000158f, -0.000056f, +0.000119f, + -0.000023f, -0.000104f, -0.000005f, -0.000011f, -0.000046f, +0.000062f, +0.000096f, +0.000101f, -0.000076f, +0.000083f, + +0.000000f, -0.000060f, -0.000021f, +0.000061f, -0.000002f, -0.000063f + }, + { + +0.000014f, -0.006451f, -0.001769f, +0.003606f, +0.000041f, +0.001673f, -0.000167f, -0.000794f, +0.000601f, +0.000917f, + -0.000538f, -0.000116f, -0.000518f, +0.001476f, +0.003561f, -0.000459f, +0.000296f, +0.000364f, -0.000483f, +0.000235f, + +0.001368f, +0.000302f, +0.000245f, +0.000154f, -0.000710f, +0.000270f, -0.000319f, -0.002391f, -0.000259f, -0.000907f, + +0.000563f, -0.000650f, -0.000123f, -0.000076f, -0.000716f, -0.000264f, +0.000353f, -0.000017f, -0.000493f, -0.000309f, + -0.000271f, +0.000085f, -0.000032f, +0.000153f, +0.000209f, -0.000004f, +0.000090f, +0.000288f, -0.000066f, -0.000305f, + +0.000119f, +0.000149f, -0.000086f, -0.000271f, -0.000018f, -0.000196f, +0.000130f, +0.000124f, +0.000008f, +0.000131f, + -0.000039f, +0.000059f, -0.000038f, +0.000090f, -0.000060f, +0.000080f, +0.000156f, +0.000085f, +0.000108f, +0.000031f, + -0.000113f, +0.000107f, +0.000112f, -0.000013f, -0.000143f, -0.000048f, +0.000010f, +0.000018f, -0.000086f, +0.000028f, + +0.000040f, +0.000036f, -0.000046f, +0.000004f, +0.000024f, -0.000019f, +0.000012f, +0.000064f, -0.000137f, +0.000068f, + -0.000019f, -0.000031f, +0.000051f, -0.000007f, -0.000005f, +0.000015f + } + }, + { + { + +0.001201f, +0.000446f, -0.000980f, -0.002257f, -0.000202f, +0.000057f, +0.000063f, +0.000117f, -0.000098f, +0.000230f, + -0.000268f, +0.000464f, -0.000296f, -0.001995f, +0.000265f, +0.000064f, +0.001822f, +0.000155f, -0.000101f, -0.000400f, + +0.000049f, +0.000420f, +0.000212f, -0.000262f, +0.000042f, -0.000542f, +0.000047f, +0.000162f, +0.000678f, +0.000978f, + -0.001779f, +0.000985f, +0.000014f, -0.000838f, +0.000272f, -0.000046f, +0.000283f, -0.001300f, -0.000995f, -0.000617f, + +0.000669f, +0.000027f, -0.000055f, -0.000076f, -0.000035f, +0.000280f, +0.000049f, -0.000066f, +0.000252f, -0.000273f, + +0.000271f, -0.000439f, -0.000284f, +0.000079f, -0.000140f, -0.000042f, +0.000057f, +0.000054f, +0.000081f, +0.000300f, + +0.000176f, +0.000095f, +0.000117f, -0.000100f, +0.000190f, +0.000006f, -0.000127f, -0.000013f, +0.000193f, -0.000004f, + -0.000038f, -0.000045f, -0.000032f, +0.000065f, +0.000079f, -0.000018f, +0.000032f, +0.000054f, +0.000096f, -0.000027f, + -0.000033f, +0.000091f, +0.000116f, +0.000006f, -0.000078f, -0.000006f, +0.000023f, -0.000012f, -0.000022f, -0.000076f, + +0.000050f, -0.000021f, -0.000022f, -0.000027f, -0.000028f, -0.000001f + }, + { + +0.008584f, -0.037044f, -0.007252f, -0.002921f, -0.000186f, +0.000542f, -0.000599f, -0.001130f, +0.000798f, +0.000828f, + +0.000254f, +0.000670f, -0.000001f, -0.000385f, +0.000528f, +0.000758f, +0.000498f, -0.000238f, -0.000781f, -0.000186f, + -0.000364f, -0.001249f, +0.000352f, +0.000664f, -0.000227f, -0.000138f, +0.000084f, +0.000878f, +0.000599f, +0.000717f, + +0.000309f, +0.000196f, -0.001055f, -0.000470f, -0.000086f, +0.000472f, -0.000403f, -0.000303f, -0.000359f, -0.000086f, + +0.000182f, +0.000195f, +0.000314f, +0.000178f, +0.000173f, -0.000431f, +0.000119f, -0.000122f, -0.000212f, +0.000037f, + +0.000075f, +0.000315f, +0.000274f, -0.000251f, +0.000110f, -0.000146f, +0.000167f, -0.000092f, +0.000032f, +0.000048f, + +0.000072f, -0.000082f, +0.000021f, -0.000023f, -0.000063f, -0.000127f, +0.000224f, +0.000031f, +0.000159f, -0.000012f, + -0.000107f, -0.000103f, +0.000083f, -0.000030f, -0.000165f, +0.000044f, +0.000028f, -0.000042f, +0.000031f, +0.000154f, + +0.000009f, -0.000043f, +0.000039f, +0.000057f, -0.000024f, -0.000164f, +0.000102f, -0.000048f, +0.000021f, -0.000006f, + -0.000020f, +0.000023f, +0.000040f, -0.000036f, -0.000004f, -0.000039f + }, + { + +0.003303f, +0.013609f, +0.002337f, +0.005777f, -0.000500f, -0.000306f, -0.000037f, -0.000279f, -0.000361f, -0.000746f, + -0.000501f, -0.000031f, +0.000221f, +0.000678f, -0.000018f, -0.000162f, +0.000296f, +0.000846f, -0.001462f, -0.000389f, + +0.000067f, +0.000737f, +0.000426f, +0.000692f, +0.000250f, +0.000292f, +0.000038f, +0.000125f, -0.000628f, +0.000306f, + -0.000058f, -0.000271f, +0.000012f, -0.000247f, -0.000016f, -0.000102f, +0.000029f, +0.000197f, +0.000249f, -0.000517f, + +0.000168f, -0.000172f, +0.000810f, +0.000162f, -0.000047f, -0.000317f, -0.000188f, +0.000451f, +0.000429f, -0.000171f, + -0.000349f, +0.000079f, +0.000169f, -0.000200f, +0.000027f, +0.000322f, +0.000217f, -0.000089f, -0.000141f, -0.000091f, + +0.000247f, +0.000174f, -0.000162f, +0.000042f, +0.000147f, +0.000059f, -0.000036f, +0.000186f, +0.000043f, +0.000163f, + -0.000001f, +0.000060f, +0.000042f, +0.000027f, -0.000034f, -0.000011f, -0.000035f, -0.000054f, -0.000032f, +0.000099f, + +0.000007f, +0.000016f, +0.000074f, -0.000142f, -0.000048f, +0.000034f, -0.000048f, -0.000026f, +0.000032f, -0.000004f, + +0.000057f, +0.000001f, +0.000010f, -0.000023f, -0.000003f, +0.000022f + }, + { + +0.000051f, +0.007501f, +0.000016f, +0.000189f, -0.000137f, -0.000191f, +0.000090f, -0.000033f, +0.000256f, +0.000076f, + -0.000241f, +0.000138f, +0.000090f, +0.001943f, +0.001283f, -0.000179f, +0.003361f, +0.002666f, -0.000181f, +0.000104f, + -0.001613f, +0.001035f, +0.000295f, +0.001194f, +0.001217f, -0.000290f, +0.000386f, -0.000517f, -0.001465f, -0.000219f, + +0.000926f, +0.000664f, -0.000452f, +0.000456f, +0.000385f, +0.000526f, -0.000014f, -0.000012f, +0.000584f, -0.000247f, + -0.000180f, +0.000010f, +0.000169f, -0.000146f, +0.000356f, +0.000309f, +0.000054f, +0.000020f, +0.000223f, -0.000213f, + -0.000200f, +0.000428f, +0.000049f, -0.000133f, -0.000034f, -0.000263f, -0.000135f, +0.000357f, -0.000224f, -0.000203f, + -0.000035f, +0.000169f, -0.000000f, -0.000016f, -0.000047f, +0.000029f, -0.000016f, +0.000063f, +0.000079f, -0.000144f, + -0.000150f, +0.000008f, +0.000139f, +0.000069f, -0.000121f, +0.000090f, +0.000091f, +0.000052f, -0.000064f, -0.000053f, + -0.000039f, +0.000071f, -0.000050f, -0.000021f, -0.000102f, -0.000055f, +0.000056f, +0.000031f, +0.000062f, -0.000016f, + +0.000010f, +0.000041f, +0.000017f, -0.000013f, +0.000015f, +0.000031f + }, + { + -0.004036f, +0.003992f, +0.000290f, +0.001554f, -0.000067f, -0.000251f, -0.000159f, -0.000441f, +0.000272f, -0.000051f, + +0.001849f, -0.000375f, -0.000127f, -0.000501f, +0.000849f, +0.000255f, +0.000365f, +0.001308f, +0.001054f, +0.000728f, + -0.000487f, +0.000139f, +0.000432f, -0.000904f, +0.000529f, -0.000067f, -0.000299f, +0.000402f, +0.000116f, -0.000018f, + +0.000404f, +0.000103f, +0.000229f, -0.000312f, -0.000082f, -0.000192f, -0.000464f, -0.000323f, +0.000295f, -0.000740f, + -0.000750f, -0.000007f, +0.000690f, -0.000061f, -0.000574f, +0.000341f, +0.000311f, +0.000082f, -0.000036f, +0.000066f, + +0.000386f, +0.000365f, -0.000363f, -0.000230f, -0.000393f, +0.000118f, -0.000475f, -0.000014f, +0.000166f, +0.000111f, + -0.000055f, -0.000103f, +0.000188f, -0.000072f, -0.000166f, -0.000014f, -0.000022f, +0.000050f, +0.000070f, +0.000045f, + -0.000023f, -0.000093f, -0.000018f, +0.000123f, +0.000155f, -0.000019f, +0.000095f, -0.000101f, -0.000013f, +0.000120f, + -0.000056f, -0.000000f, +0.000031f, -0.000111f, -0.000082f, +0.000035f, +0.000011f, +0.000024f, -0.000025f, +0.000018f, + -0.000039f, -0.000028f, -0.000005f, -0.000029f, +0.000032f, +0.000039f + }, + { + +0.000120f, +0.001346f, -0.000427f, -0.000562f, +0.000021f, -0.000088f, +0.000331f, +0.000062f, +0.000332f, -0.000224f, + -0.000276f, -0.000357f, -0.000765f, -0.001698f, -0.000208f, -0.000149f, +0.000458f, -0.001525f, +0.002058f, -0.000925f, + -0.001984f, -0.001261f, -0.000305f, -0.001577f, -0.000771f, +0.000362f, -0.000269f, -0.000168f, -0.000315f, +0.000209f, + -0.001063f, -0.000517f, +0.000573f, +0.000925f, -0.000631f, -0.000069f, +0.000289f, -0.000447f, -0.000293f, -0.000179f, + +0.000687f, -0.000274f, +0.000176f, +0.000281f, -0.000129f, -0.000074f, -0.000049f, -0.000302f, +0.000359f, +0.000129f, + +0.000325f, +0.000100f, -0.000219f, +0.000034f, +0.000441f, +0.000045f, -0.000129f, -0.000037f, +0.000016f, -0.000014f, + -0.000079f, +0.000018f, +0.000108f, -0.000108f, +0.000062f, -0.000048f, -0.000047f, +0.000005f, -0.000087f, -0.000103f, + +0.000082f, +0.000081f, -0.000091f, -0.000017f, +0.000121f, +0.000071f, +0.000116f, -0.000040f, -0.000015f, -0.000079f, + +0.000066f, -0.000022f, -0.000069f, -0.000030f, +0.000041f, +0.000013f, -0.000003f, -0.000009f, +0.000001f, -0.000024f, + -0.000089f, +0.000033f, +0.000096f, -0.000023f, -0.000033f, -0.000027f + }, + { + +0.003729f, +0.002348f, -0.004645f, -0.001690f, +0.000516f, +0.000096f, -0.000083f, -0.000261f, -0.000287f, +0.000179f, + +0.000403f, -0.000313f, -0.000104f, -0.000005f, +0.000035f, -0.000997f, +0.000086f, +0.000157f, -0.000693f, -0.000051f, + +0.000226f, +0.000271f, -0.000446f, -0.000122f, -0.000021f, -0.000444f, +0.000820f, +0.000105f, -0.000612f, -0.000573f, + +0.000067f, +0.000210f, +0.000407f, -0.000413f, -0.000014f, -0.000194f, -0.000106f, -0.000178f, +0.000174f, +0.000062f, + -0.000224f, +0.000001f, -0.000029f, +0.000218f, -0.000481f, +0.000118f, -0.000320f, +0.000192f, +0.000151f, -0.000136f, + +0.000093f, -0.000055f, +0.000153f, -0.000342f, +0.000143f, +0.000187f, +0.000010f, +0.000091f, +0.000168f, -0.000003f, + -0.000015f, +0.000052f, -0.000010f, +0.000055f, +0.000086f, +0.000160f, +0.000113f, -0.000090f, +0.000026f, -0.000002f, + -0.000105f, +0.000025f, +0.000169f, +0.000014f, -0.000079f, -0.000022f, +0.000111f, -0.000065f, -0.000001f, -0.000028f, + -0.000123f, -0.000029f, +0.000052f, -0.000036f, -0.000135f, +0.000095f, +0.000062f, -0.000009f, -0.000042f, +0.000011f, + +0.000054f, -0.000038f, -0.000028f, -0.000004f, -0.000005f, +0.000020f + }, + { + +0.000007f, +0.002677f, -0.001349f, -0.000107f, -0.000365f, -0.000132f, -0.000107f, +0.000041f, +0.000317f, -0.000122f, + -0.000548f, -0.000453f, -0.001079f, +0.004515f, +0.003468f, -0.000748f, -0.001266f, +0.000679f, -0.000447f, +0.000563f, + -0.002113f, -0.000685f, -0.000943f, +0.000142f, +0.000982f, -0.000076f, +0.000760f, +0.000681f, -0.000413f, +0.000526f, + -0.000118f, +0.000086f, +0.000561f, +0.000076f, +0.000026f, +0.000102f, -0.000009f, -0.000262f, -0.000643f, -0.000386f, + -0.000063f, +0.000140f, -0.000329f, -0.000351f, +0.000342f, +0.000031f, +0.000063f, -0.000475f, +0.000019f, +0.000477f, + -0.000000f, -0.000067f, +0.000224f, +0.000365f, +0.000213f, +0.000029f, +0.000071f, -0.000245f, -0.000139f, +0.000178f, + +0.000128f, -0.000052f, -0.000037f, -0.000043f, -0.000067f, +0.000081f, +0.000140f, +0.000036f, -0.000101f, -0.000111f, + -0.000047f, -0.000050f, +0.000032f, +0.000065f, -0.000007f, -0.000024f, +0.000014f, +0.000099f, -0.000048f, +0.000031f, + -0.000102f, -0.000021f, -0.000011f, +0.000032f, +0.000113f, +0.000001f, +0.000075f, -0.000028f, -0.000008f, +0.000054f, + -0.000055f, -0.000000f, +0.000040f, -0.000007f, +0.000002f, -0.000016f + }, + { + -0.000725f, +0.043383f, -0.005436f, -0.001977f, -0.000347f, -0.000021f, -0.000180f, -0.001017f, +0.000912f, +0.000442f, + -0.001018f, -0.000468f, -0.000249f, -0.001461f, +0.000332f, +0.002231f, +0.000891f, +0.000229f, +0.000145f, +0.000004f, + -0.000205f, -0.000247f, -0.000745f, +0.000584f, -0.000170f, +0.000462f, +0.000238f, -0.000153f, +0.000527f, -0.000008f, + +0.000194f, -0.000552f, -0.000249f, +0.000025f, +0.000274f, +0.000763f, +0.000289f, +0.000002f, +0.000586f, +0.000169f, + -0.000042f, -0.000416f, -0.000043f, -0.000403f, -0.000621f, +0.000330f, +0.000075f, -0.001023f, -0.000070f, +0.000481f, + +0.000097f, +0.000283f, +0.000246f, +0.000246f, -0.000347f, -0.000102f, +0.000107f, +0.000153f, -0.000114f, -0.000087f, + +0.000168f, +0.000033f, -0.000087f, -0.000150f, -0.000142f, +0.000021f, +0.000215f, -0.000047f, +0.000035f, +0.000133f, + -0.000061f, +0.000024f, +0.000103f, -0.000081f, -0.000026f, -0.000129f, +0.000097f, -0.000050f, +0.000023f, -0.000087f, + +0.000070f, -0.000032f, -0.000073f, +0.000023f, -0.000047f, +0.000036f, +0.000086f, +0.000027f, +0.000004f, -0.000010f, + -0.000061f, -0.000029f, -0.000005f, +0.000081f, -0.000044f, +0.000022f + }, + { + +0.000345f, +0.006058f, +0.000304f, -0.001125f, -0.000229f, +0.002298f, -0.000506f, -0.000537f, -0.000079f, +0.000215f, + -0.000441f, -0.000988f, +0.000155f, +0.001399f, -0.000903f, -0.000350f, -0.000283f, +0.001254f, +0.000489f, -0.002082f, + -0.000144f, +0.000169f, -0.000136f, -0.000009f, -0.000256f, +0.000220f, +0.000388f, -0.000498f, -0.000817f, +0.000756f, + -0.000953f, +0.000496f, +0.000125f, +0.000033f, +0.000088f, +0.000142f, -0.000124f, -0.000057f, +0.000159f, -0.000152f, + -0.000205f, -0.000055f, -0.000003f, -0.000156f, +0.000493f, -0.000123f, -0.000106f, -0.000182f, +0.000111f, +0.000267f, + +0.000256f, -0.000029f, +0.000019f, -0.000084f, -0.000345f, +0.000345f, +0.000069f, +0.000108f, +0.000002f, -0.000032f, + -0.000088f, -0.000071f, -0.000106f, +0.000097f, -0.000132f, +0.000028f, +0.000180f, +0.000090f, +0.000122f, -0.000176f, + +0.000024f, -0.000034f, -0.000115f, +0.000143f, -0.000020f, -0.000058f, +0.000000f, -0.000011f, -0.000053f, -0.000068f, + -0.000012f, +0.000006f, -0.000001f, +0.000032f, +0.000075f, -0.000019f, -0.000068f, +0.000014f, -0.000008f, +0.000065f, + -0.000031f, +0.000011f, -0.000004f, +0.000014f, +0.000039f, -0.000028f + }, + { + +0.003340f, +0.027046f, -0.000230f, -0.002793f, +0.001192f, -0.001061f, -0.003957f, -0.000549f, +0.000369f, +0.000248f, + +0.000294f, +0.000402f, +0.000455f, -0.000269f, -0.000356f, -0.001308f, -0.000883f, -0.000111f, +0.000083f, +0.000885f, + -0.000184f, +0.000568f, +0.000004f, -0.000436f, +0.000190f, -0.000041f, -0.000225f, -0.000281f, +0.000410f, +0.000031f, + +0.000473f, -0.000022f, +0.000436f, -0.000002f, +0.000253f, -0.000657f, +0.000105f, +0.000008f, -0.000629f, +0.000298f, + -0.000130f, -0.000501f, -0.000150f, -0.000129f, -0.000037f, +0.000230f, +0.000168f, -0.000006f, -0.000176f, +0.000010f, + -0.000014f, +0.000078f, +0.000055f, -0.000209f, -0.000141f, -0.000041f, +0.000124f, +0.000238f, -0.000067f, -0.000104f, + +0.000009f, +0.000035f, +0.000029f, -0.000005f, +0.000051f, -0.000134f, +0.000003f, +0.000010f, +0.000062f, -0.000001f, + +0.000013f, +0.000040f, +0.000118f, +0.000132f, -0.000008f, +0.000006f, -0.000041f, -0.000115f, -0.000005f, -0.000058f, + +0.000050f, +0.000049f, -0.000058f, +0.000144f, -0.000019f, +0.000114f, -0.000060f, -0.000006f, -0.000049f, -0.000002f, + +0.000038f, +0.000006f, -0.000057f, -0.000016f, +0.000080f, -0.000001f + }, + { + -0.000499f, -0.002837f, +0.000215f, -0.000346f, +0.000153f, -0.000411f, -0.000154f, +0.000303f, +0.000010f, +0.000127f, + -0.000336f, -0.000461f, +0.001118f, +0.006914f, +0.000802f, -0.001902f, -0.000198f, +0.000281f, +0.001282f, -0.000797f, + -0.001291f, +0.003434f, +0.000750f, +0.000976f, -0.001150f, -0.001105f, -0.000073f, +0.001177f, -0.000172f, +0.000902f, + -0.001130f, +0.000360f, -0.000307f, +0.000202f, +0.000603f, +0.000065f, +0.000143f, +0.000347f, -0.000473f, +0.000352f, + -0.000190f, -0.000228f, +0.000091f, +0.000067f, -0.000070f, -0.000207f, -0.000212f, +0.000082f, +0.000280f, +0.000248f, + +0.000138f, -0.000058f, +0.000020f, +0.000070f, -0.000047f, -0.000173f, -0.000280f, -0.000092f, +0.000004f, +0.000031f, + +0.000106f, -0.000080f, -0.000145f, -0.000127f, +0.000010f, +0.000154f, -0.000205f, +0.000104f, -0.000002f, +0.000065f, + +0.000047f, -0.000020f, +0.000060f, +0.000076f, +0.000065f, +0.000081f, +0.000007f, -0.000083f, -0.000076f, -0.000032f, + +0.000074f, -0.000038f, -0.000048f, +0.000010f, +0.000032f, -0.000039f, -0.000026f, +0.000024f, +0.000016f, +0.000015f, + +0.000014f, +0.000041f, -0.000009f, -0.000030f, +0.000023f, +0.000019f + }, + { + +0.001114f, -0.003730f, +0.002183f, +0.000873f, +0.000776f, +0.002089f, -0.002702f, -0.001273f, +0.000099f, +0.001019f, + +0.000810f, -0.000366f, +0.000516f, -0.000079f, +0.001004f, +0.000337f, +0.000052f, +0.000382f, -0.001059f, +0.000751f, + -0.000164f, +0.000407f, -0.000167f, -0.000046f, -0.000170f, +0.000906f, -0.000184f, -0.000041f, +0.000169f, -0.000244f, + +0.000020f, +0.000145f, +0.000123f, +0.000543f, +0.000702f, +0.000364f, -0.000256f, -0.000586f, +0.000541f, -0.000142f, + -0.000468f, -0.000334f, -0.000049f, +0.000249f, -0.000152f, -0.000301f, +0.000320f, -0.000570f, +0.000272f, +0.000199f, + +0.000174f, +0.000039f, +0.000148f, +0.000148f, +0.000065f, -0.000061f, +0.000107f, -0.000093f, -0.000232f, +0.000179f, + -0.000033f, -0.000016f, -0.000070f, +0.000008f, -0.000126f, -0.000165f, +0.000060f, +0.000022f, +0.000138f, +0.000077f, + -0.000193f, +0.000046f, +0.000133f, +0.000124f, -0.000029f, +0.000014f, -0.000081f, +0.000138f, +0.000025f, +0.000092f, + -0.000131f, -0.000062f, +0.000041f, +0.000114f, +0.000038f, -0.000134f, -0.000096f, -0.000010f, -0.000059f, +0.000002f, + +0.000021f, -0.000005f, +0.000088f, +0.000003f, +0.000039f, +0.000045f + }, + { + +0.000223f, +0.000733f, -0.001341f, +0.001564f, +0.000008f, +0.000178f, +0.000245f, +0.000555f, +0.000448f, -0.000546f, + +0.000045f, -0.000049f, +0.000241f, -0.006493f, -0.015994f, -0.003659f, +0.001467f, -0.000645f, +0.001429f, -0.000255f, + -0.001191f, +0.000149f, -0.000729f, +0.000191f, -0.000663f, -0.000096f, -0.001005f, +0.000777f, -0.001677f, +0.000078f, + -0.000137f, +0.000222f, +0.000773f, +0.000434f, -0.000649f, +0.000273f, -0.000053f, -0.000105f, +0.000295f, -0.000169f, + +0.000280f, +0.000046f, -0.000246f, +0.000064f, +0.000060f, +0.000016f, -0.000026f, +0.000044f, +0.000077f, -0.000097f, + +0.000210f, -0.000057f, -0.000108f, -0.000293f, +0.000020f, -0.000051f, -0.000002f, +0.000055f, -0.000016f, +0.000054f, + +0.000182f, -0.000030f, -0.000084f, +0.000079f, +0.000134f, -0.000080f, +0.000214f, +0.000261f, -0.000049f, -0.000016f, + -0.000136f, -0.000116f, +0.000168f, -0.000017f, -0.000009f, +0.000087f, -0.000126f, +0.000126f, +0.000000f, +0.000041f, + +0.000093f, -0.000113f, -0.000090f, -0.000007f, -0.000100f, -0.000014f, +0.000061f, +0.000099f, -0.000071f, +0.000025f, + +0.000085f, +0.000015f, -0.000047f, +0.000032f, +0.000050f, -0.000082f + }, + { + -0.001852f, -0.004762f, +0.000229f, +0.000345f, +0.000574f, +0.004129f, -0.000648f, -0.000423f, +0.000618f, +0.000254f, + +0.001590f, -0.001160f, -0.000265f, +0.001399f, +0.002488f, +0.000648f, +0.000624f, +0.001201f, +0.000058f, -0.000095f, + +0.000820f, -0.000170f, +0.000533f, +0.001302f, -0.000696f, -0.000541f, -0.000755f, -0.002052f, -0.000088f, -0.000690f, + +0.000262f, -0.000030f, -0.000154f, -0.000521f, -0.000693f, -0.000696f, -0.000051f, +0.000340f, -0.000308f, -0.000652f, + +0.000148f, -0.000011f, +0.000009f, -0.000042f, +0.000379f, -0.000122f, -0.000144f, +0.000345f, -0.000014f, -0.000037f, + +0.000246f, +0.000075f, +0.000138f, -0.000244f, -0.000086f, -0.000306f, +0.000054f, +0.000140f, +0.000079f, -0.000028f, + -0.000014f, -0.000065f, -0.000029f, +0.000058f, -0.000019f, +0.000039f, +0.000086f, +0.000036f, +0.000007f, +0.000125f, + -0.000076f, -0.000106f, +0.000179f, +0.000184f, -0.000048f, -0.000097f, -0.000078f, -0.000010f, +0.000017f, -0.000049f, + +0.000022f, +0.000107f, +0.000020f, -0.000031f, +0.000005f, +0.000027f, +0.000007f, +0.000143f, -0.000063f, -0.000024f, + +0.000003f, -0.000012f, +0.000007f, +0.000030f, +0.000029f, -0.000010f + } + }, + { + { + -0.001056f, -0.003041f, +0.000517f, -0.001443f, -0.000352f, +0.000273f, -0.000048f, -0.000464f, +0.000167f, +0.000016f, + +0.000130f, -0.000048f, +0.001090f, +0.000852f, -0.000198f, -0.001504f, -0.000380f, +0.000279f, +0.001492f, -0.000257f, + -0.001892f, -0.000456f, +0.000629f, +0.000216f, +0.000789f, -0.000517f, -0.000604f, +0.000327f, -0.000421f, -0.000256f, + -0.000725f, -0.000403f, +0.000517f, -0.000134f, -0.000457f, -0.000349f, +0.000802f, -0.000118f, -0.000571f, -0.000794f, + +0.000230f, +0.000128f, +0.000148f, -0.000184f, -0.000431f, +0.000298f, +0.000129f, -0.000418f, +0.000046f, -0.000567f, + +0.000149f, -0.000008f, -0.000091f, -0.000113f, +0.000069f, +0.000009f, -0.000160f, +0.000232f, -0.000225f, -0.000139f, + -0.000040f, -0.000066f, +0.000151f, -0.000074f, +0.000052f, -0.000027f, +0.000092f, -0.000102f, -0.000064f, +0.000113f, + +0.000070f, -0.000070f, +0.000114f, -0.000043f, +0.000104f, -0.000012f, +0.000025f, -0.000102f, +0.000079f, +0.000040f, + -0.000007f, -0.000004f, +0.000021f, +0.000038f, +0.000097f, +0.000079f, -0.000031f, -0.000068f, +0.000027f, -0.000001f, + -0.000081f, +0.000049f, -0.000018f, +0.000042f, +0.000019f, -0.000045f + }, + { + -0.005313f, -0.043666f, +0.001634f, -0.000165f, -0.000234f, -0.000106f, +0.000506f, -0.000943f, -0.000681f, +0.000189f, + +0.000161f, -0.000403f, +0.000264f, -0.001093f, +0.000413f, +0.000779f, -0.001085f, +0.000339f, +0.001024f, -0.000188f, + +0.000114f, -0.000337f, +0.000054f, +0.000195f, +0.000065f, +0.000766f, +0.000468f, +0.000263f, +0.000068f, +0.000220f, + -0.000126f, +0.000058f, -0.000193f, -0.000154f, -0.000969f, +0.000489f, +0.000603f, +0.000437f, -0.000071f, -0.000247f, + -0.000688f, -0.000217f, +0.000351f, +0.000288f, -0.000043f, +0.000091f, -0.000290f, +0.000473f, -0.000525f, -0.000078f, + +0.000051f, -0.000175f, +0.000471f, +0.000008f, +0.000184f, +0.000057f, -0.000057f, +0.000243f, +0.000125f, +0.000136f, + +0.000047f, +0.000127f, +0.000056f, +0.000094f, +0.000096f, -0.000163f, -0.000066f, -0.000100f, +0.000088f, +0.000223f, + -0.000000f, -0.000036f, -0.000081f, -0.000046f, +0.000044f, -0.000205f, +0.000130f, +0.000002f, -0.000047f, -0.000028f, + -0.000038f, +0.000069f, -0.000038f, +0.000034f, +0.000065f, +0.000068f, -0.000164f, +0.000065f, -0.000011f, +0.000039f, + +0.000014f, -0.000001f, -0.000038f, +0.000029f, -0.000029f, +0.000012f + }, + { + -0.002307f, +0.004416f, -0.003567f, +0.001698f, +0.002094f, +0.000643f, -0.000534f, +0.000077f, -0.000120f, +0.000486f, + -0.000155f, +0.000123f, +0.000355f, -0.001204f, -0.002364f, -0.000396f, -0.000454f, -0.000743f, -0.001133f, -0.000081f, + +0.000554f, +0.000132f, +0.000001f, -0.000270f, -0.000836f, +0.000485f, +0.000848f, +0.001012f, -0.001084f, -0.000276f, + +0.000240f, +0.000190f, +0.000153f, +0.000489f, -0.000196f, -0.000432f, +0.000072f, +0.000099f, +0.000753f, +0.000128f, + -0.000181f, +0.000180f, +0.000502f, +0.000149f, +0.000370f, +0.000459f, -0.000268f, +0.000233f, +0.000265f, +0.000396f, + +0.000061f, +0.000014f, +0.000079f, +0.000023f, +0.000021f, -0.000010f, +0.000076f, +0.000206f, +0.000031f, -0.000025f, + -0.000142f, +0.000012f, +0.000048f, +0.000052f, -0.000025f, +0.000092f, -0.000053f, +0.000180f, -0.000140f, +0.000053f, + +0.000078f, +0.000018f, -0.000001f, -0.000032f, +0.000058f, -0.000018f, -0.000019f, -0.000006f, +0.000034f, -0.000007f, + -0.000069f, +0.000015f, +0.000002f, +0.000029f, -0.000026f, -0.000028f, +0.000042f, -0.000066f, -0.000040f, -0.000001f, + -0.000048f, +0.000051f, -0.000025f, +0.000037f, -0.000025f, -0.000016f + }, + { + +0.000280f, +0.007871f, -0.000776f, -0.000438f, +0.000435f, -0.000134f, -0.000277f, -0.000389f, +0.000094f, +0.000162f, + -0.000125f, +0.000314f, -0.000178f, +0.000955f, +0.002366f, -0.003056f, -0.002480f, +0.000272f, -0.000840f, +0.000566f, + +0.000280f, +0.000256f, -0.000904f, +0.002026f, -0.000025f, -0.001179f, -0.000702f, +0.000642f, +0.000297f, -0.000809f, + +0.000362f, +0.000821f, -0.000716f, +0.000204f, -0.000612f, -0.000450f, +0.000816f, -0.000443f, +0.000151f, +0.000402f, + -0.000139f, +0.000262f, +0.000541f, -0.000028f, +0.000108f, -0.000243f, +0.000142f, +0.000071f, +0.000112f, +0.000162f, + +0.000272f, +0.000032f, -0.000032f, -0.000071f, +0.000091f, +0.000274f, -0.000023f, +0.000008f, +0.000106f, +0.000014f, + -0.000174f, -0.000028f, +0.000136f, -0.000003f, +0.000014f, +0.000095f, -0.000062f, -0.000042f, +0.000052f, +0.000124f, + +0.000070f, -0.000188f, -0.000045f, +0.000031f, +0.000022f, -0.000060f, -0.000022f, +0.000045f, +0.000043f, +0.000049f, + +0.000015f, -0.000050f, +0.000026f, -0.000021f, +0.000035f, -0.000006f, -0.000100f, -0.000047f, +0.000074f, +0.000047f, + -0.000014f, -0.000053f, +0.000019f, +0.000067f, -0.000017f, +0.000031f + }, + { + -0.001459f, +0.009452f, -0.001917f, +0.001210f, -0.000190f, +0.000193f, +0.000388f, -0.000449f, +0.000395f, -0.000624f, + +0.000795f, +0.001727f, -0.000595f, -0.001467f, +0.001303f, -0.001471f, +0.000153f, +0.000099f, -0.000453f, +0.000387f, + -0.000533f, +0.000630f, +0.000184f, -0.000159f, -0.000954f, +0.000472f, -0.000189f, +0.001766f, +0.000586f, +0.000167f, + +0.000057f, -0.000124f, -0.000484f, +0.000227f, +0.000512f, +0.000059f, +0.000083f, -0.001209f, +0.000040f, +0.000250f, + -0.000435f, -0.000024f, +0.000152f, +0.000059f, -0.000506f, +0.000065f, +0.000467f, +0.000163f, -0.000019f, -0.000085f, + -0.000092f, +0.000101f, +0.000284f, +0.000166f, -0.000219f, +0.000056f, +0.000055f, +0.000071f, -0.000083f, -0.000279f, + +0.000115f, -0.000082f, +0.000002f, +0.000098f, +0.000024f, -0.000063f, +0.000097f, -0.000018f, -0.000128f, -0.000035f, + +0.000093f, +0.000034f, -0.000056f, -0.000121f, +0.000007f, +0.000011f, -0.000093f, +0.000055f, -0.000067f, +0.000024f, + -0.000023f, +0.000039f, -0.000038f, +0.000083f, -0.000071f, -0.000043f, +0.000004f, +0.000008f, +0.000007f, -0.000052f, + +0.000030f, -0.000018f, -0.000006f, +0.000014f, -0.000037f, -0.000015f + }, + { + -0.000653f, +0.000686f, +0.003792f, -0.000434f, -0.000021f, -0.000221f, +0.000008f, -0.000003f, +0.000313f, +0.000191f, + +0.000403f, -0.000077f, +0.000447f, -0.000803f, -0.001760f, -0.000505f, +0.004376f, -0.000407f, +0.000504f, +0.001200f, + +0.001186f, -0.001049f, -0.000406f, +0.000332f, -0.001393f, -0.001490f, -0.000584f, -0.000162f, -0.002324f, -0.000709f, + -0.000445f, -0.000335f, -0.000067f, +0.000426f, -0.000036f, -0.000013f, +0.000252f, +0.000338f, +0.000158f, -0.000049f, + -0.000282f, +0.000368f, +0.000169f, -0.000041f, +0.000444f, +0.000239f, +0.000086f, -0.000459f, +0.000099f, -0.000167f, + +0.000125f, +0.000225f, +0.000130f, -0.000254f, +0.000059f, +0.000118f, -0.000053f, -0.000048f, -0.000027f, +0.000039f, + -0.000085f, -0.000188f, +0.000102f, -0.000018f, -0.000055f, +0.000010f, +0.000025f, -0.000022f, -0.000012f, -0.000121f, + -0.000145f, +0.000114f, +0.000046f, -0.000035f, -0.000007f, -0.000010f, +0.000019f, +0.000128f, +0.000113f, -0.000009f, + -0.000069f, +0.000093f, +0.000000f, -0.000029f, -0.000071f, +0.000035f, +0.000015f, -0.000031f, +0.000003f, +0.000063f, + -0.000006f, -0.000071f, -0.000039f, +0.000046f, +0.000007f, +0.000010f + }, + { + -0.008027f, -0.005575f, +0.001612f, -0.001996f, -0.000782f, +0.000481f, -0.000048f, +0.000723f, +0.000593f, -0.000267f, + -0.000238f, -0.000234f, -0.000670f, +0.000878f, +0.000719f, -0.000511f, -0.000106f, +0.000245f, +0.000920f, -0.000592f, + -0.000465f, -0.000670f, -0.000361f, +0.000296f, -0.000028f, -0.000474f, +0.000044f, +0.000517f, -0.000604f, -0.000509f, + -0.000137f, +0.000150f, +0.001007f, -0.000439f, +0.000455f, +0.000320f, -0.000329f, -0.000360f, -0.000059f, -0.000059f, + -0.000174f, +0.000637f, +0.000491f, -0.000222f, -0.000466f, +0.000059f, -0.000094f, -0.000177f, -0.000011f, +0.000230f, + -0.000365f, +0.000133f, -0.000039f, -0.000317f, -0.000018f, +0.000024f, +0.000050f, +0.000012f, +0.000076f, +0.000067f, + +0.000116f, +0.000070f, -0.000083f, +0.000020f, -0.000098f, -0.000084f, +0.000081f, +0.000150f, -0.000086f, -0.000119f, + +0.000121f, -0.000152f, -0.000203f, +0.000117f, +0.000038f, -0.000057f, -0.000014f, +0.000022f, +0.000014f, -0.000058f, + +0.000134f, -0.000095f, -0.000008f, +0.000138f, -0.000006f, -0.000111f, +0.000035f, +0.000069f, +0.000004f, -0.000044f, + -0.000046f, +0.000056f, -0.000025f, +0.000022f, -0.000030f, +0.000013f + }, + { + -0.000659f, +0.000631f, +0.001539f, +0.000310f, +0.000456f, -0.000085f, -0.000182f, +0.000132f, -0.000040f, +0.000203f, + +0.000063f, -0.000052f, -0.000959f, +0.001080f, +0.002747f, +0.000298f, -0.000931f, -0.000789f, -0.001047f, +0.002821f, + +0.000170f, -0.000817f, -0.000158f, -0.000240f, -0.000633f, -0.001707f, -0.000838f, +0.000415f, -0.000369f, +0.000052f, + +0.000249f, +0.000423f, -0.000425f, -0.000048f, +0.000117f, -0.000595f, -0.000146f, +0.000011f, -0.000151f, +0.000382f, + +0.000126f, +0.000015f, +0.000114f, -0.000083f, -0.000125f, -0.000321f, -0.000245f, +0.000462f, -0.000353f, -0.000284f, + +0.000242f, -0.000049f, -0.000079f, -0.000101f, +0.000291f, +0.000010f, +0.000103f, +0.000183f, +0.000067f, -0.000273f, + +0.000008f, -0.000133f, +0.000186f, -0.000023f, +0.000051f, -0.000072f, -0.000163f, -0.000001f, +0.000077f, -0.000027f, + +0.000026f, +0.000053f, +0.000007f, -0.000042f, +0.000052f, +0.000047f, -0.000110f, +0.000095f, +0.000059f, +0.000002f, + +0.000070f, -0.000027f, -0.000022f, -0.000017f, -0.000024f, +0.000037f, -0.000003f, +0.000043f, -0.000031f, -0.000022f, + +0.000067f, -0.000009f, +0.000009f, -0.000007f, -0.000007f, +0.000005f + }, + { + -0.002835f, +0.059745f, +0.006370f, -0.002171f, +0.000437f, +0.000265f, +0.000257f, -0.000058f, -0.000695f, +0.000177f, + +0.001311f, -0.000566f, +0.000188f, -0.002021f, +0.001683f, -0.000091f, -0.000104f, +0.000302f, -0.000463f, -0.000443f, + -0.000254f, +0.000536f, -0.001482f, +0.000401f, +0.000479f, -0.000534f, +0.000258f, +0.000363f, +0.000103f, -0.000223f, + -0.000219f, +0.000017f, -0.000283f, -0.000334f, -0.000471f, +0.000033f, -0.000208f, -0.000161f, +0.000264f, +0.000626f, + -0.000408f, +0.000163f, +0.000707f, -0.000029f, -0.000099f, -0.000373f, +0.000146f, +0.000090f, -0.000042f, +0.000000f, + -0.000214f, +0.000279f, -0.000099f, +0.000031f, +0.000100f, +0.000105f, -0.000099f, -0.000128f, +0.000163f, -0.000051f, + -0.000035f, +0.000087f, -0.000063f, +0.000088f, +0.000118f, -0.000309f, -0.000045f, +0.000124f, +0.000025f, +0.000044f, + +0.000000f, -0.000013f, -0.000074f, -0.000008f, +0.000046f, +0.000093f, -0.000138f, -0.000031f, +0.000023f, -0.000024f, + -0.000022f, +0.000013f, -0.000088f, +0.000020f, -0.000038f, -0.000076f, -0.000054f, +0.000009f, +0.000040f, +0.000041f, + +0.000028f, -0.000035f, -0.000006f, -0.000046f, +0.000032f, +0.000015f + }, + { + -0.000102f, +0.005168f, -0.000921f, +0.001106f, -0.000704f, -0.000330f, +0.000813f, +0.000040f, -0.000211f, +0.000263f, + +0.000333f, +0.000501f, -0.000721f, +0.000170f, -0.001857f, +0.001167f, -0.000214f, -0.000955f, +0.000256f, +0.001599f, + +0.000032f, -0.001759f, -0.001637f, +0.000379f, +0.000659f, +0.000782f, -0.000300f, -0.000168f, -0.000194f, +0.000215f, + +0.000277f, -0.000218f, -0.000206f, +0.000310f, -0.000005f, -0.000118f, -0.000320f, +0.000202f, +0.000427f, -0.000132f, + -0.000203f, -0.000200f, +0.000290f, +0.000072f, -0.000454f, +0.000281f, -0.000105f, +0.000039f, -0.000162f, -0.000375f, + +0.000405f, +0.000310f, +0.000165f, +0.000301f, +0.000159f, -0.000198f, -0.000135f, +0.000007f, -0.000029f, +0.000121f, + +0.000102f, +0.000000f, +0.000072f, -0.000026f, +0.000023f, -0.000130f, -0.000119f, +0.000023f, +0.000083f, +0.000137f, + -0.000012f, -0.000004f, -0.000009f, -0.000081f, +0.000008f, +0.000040f, -0.000042f, -0.000067f, -0.000018f, -0.000034f, + -0.000052f, -0.000068f, -0.000026f, +0.000025f, +0.000033f, +0.000055f, -0.000003f, -0.000049f, -0.000030f, -0.000035f, + +0.000063f, -0.000024f, +0.000012f, -0.000009f, +0.000007f, +0.000033f + }, + { + -0.004230f, +0.017198f, +0.002745f, -0.001624f, -0.000435f, -0.000218f, +0.002921f, +0.000252f, -0.000266f, -0.000533f, + +0.000107f, -0.000437f, +0.000162f, -0.000116f, +0.000800f, -0.000998f, -0.000451f, +0.000084f, +0.000300f, +0.000548f, + +0.000290f, -0.000415f, +0.000772f, -0.000739f, +0.000572f, +0.000146f, -0.000209f, +0.000074f, -0.000266f, -0.000432f, + +0.000880f, +0.000396f, +0.000065f, -0.000649f, -0.000056f, +0.000285f, -0.000757f, +0.000191f, -0.000269f, +0.000128f, + +0.000439f, +0.000592f, -0.000099f, -0.000017f, -0.000410f, -0.000165f, -0.000142f, -0.000103f, +0.000259f, -0.000157f, + +0.000056f, +0.000015f, +0.000119f, +0.000288f, -0.000145f, -0.000145f, -0.000207f, -0.000225f, +0.000202f, -0.000003f, + +0.000033f, +0.000029f, +0.000067f, -0.000049f, -0.000102f, +0.000098f, -0.000068f, -0.000040f, -0.000077f, +0.000029f, + -0.000024f, +0.000010f, -0.000047f, +0.000045f, +0.000133f, -0.000038f, +0.000125f, +0.000056f, -0.000104f, +0.000017f, + -0.000025f, +0.000007f, +0.000055f, -0.000078f, +0.000021f, -0.000046f, +0.000066f, -0.000009f, +0.000058f, -0.000005f, + -0.000038f, +0.000024f, +0.000013f, -0.000029f, -0.000028f, +0.000050f + }, + { + +0.000330f, -0.003017f, -0.002175f, -0.000457f, -0.000369f, +0.000451f, -0.000265f, +0.000162f, +0.000016f, -0.000121f, + -0.000189f, +0.000063f, -0.001350f, +0.001666f, +0.000170f, -0.001060f, +0.000078f, -0.000311f, +0.001681f, -0.000192f, + -0.001363f, -0.000699f, +0.000728f, -0.000433f, +0.001222f, +0.000848f, -0.001168f, +0.000418f, -0.000108f, -0.000357f, + +0.000719f, +0.000195f, +0.000164f, -0.000536f, +0.000423f, -0.000294f, +0.000254f, -0.000174f, +0.000518f, +0.000349f, + +0.000264f, -0.000004f, -0.000345f, +0.000330f, +0.000187f, -0.000208f, -0.000046f, -0.000320f, +0.000040f, -0.000058f, + +0.000073f, +0.000091f, -0.000259f, +0.000127f, +0.000079f, +0.000119f, -0.000023f, -0.000063f, -0.000419f, -0.000095f, + -0.000225f, +0.000009f, +0.000034f, +0.000016f, -0.000180f, -0.000095f, +0.000175f, -0.000083f, +0.000028f, -0.000033f, + -0.000007f, +0.000063f, -0.000022f, +0.000062f, +0.000045f, +0.000008f, +0.000101f, +0.000069f, -0.000075f, +0.000032f, + -0.000063f, +0.000048f, +0.000063f, -0.000054f, +0.000002f, -0.000018f, -0.000014f, -0.000049f, -0.000026f, -0.000009f, + -0.000033f, +0.000001f, +0.000043f, +0.000038f, -0.000045f, +0.000015f + }, + { + -0.000169f, -0.005936f, -0.003667f, +0.002568f, -0.000220f, +0.003263f, +0.002446f, -0.000114f, +0.000728f, -0.000849f, + -0.000043f, -0.000030f, -0.000034f, -0.000812f, -0.000494f, +0.000788f, -0.001555f, +0.000118f, -0.000159f, -0.000363f, + +0.001265f, +0.000135f, +0.000197f, -0.000102f, -0.000029f, +0.000530f, -0.000058f, -0.000587f, +0.000128f, +0.000556f, + -0.000222f, +0.000451f, +0.000207f, -0.000102f, -0.000657f, +0.000072f, +0.000394f, -0.000335f, +0.000024f, +0.000469f, + +0.000127f, -0.000205f, -0.000218f, +0.000743f, -0.000463f, -0.000221f, +0.000097f, +0.000015f, -0.000415f, -0.000207f, + -0.000036f, -0.000082f, +0.000166f, -0.000005f, +0.000335f, +0.000166f, +0.000265f, +0.000188f, -0.000080f, -0.000231f, + +0.000009f, -0.000041f, -0.000014f, -0.000062f, +0.000023f, +0.000019f, +0.000056f, -0.000074f, -0.000088f, +0.000116f, + +0.000043f, -0.000052f, -0.000043f, +0.000154f, -0.000000f, -0.000003f, -0.000039f, -0.000063f, +0.000061f, +0.000005f, + +0.000139f, -0.000084f, -0.000044f, +0.000005f, +0.000043f, +0.000136f, -0.000010f, -0.000094f, -0.000002f, -0.000009f, + -0.000028f, -0.000037f, -0.000025f, +0.000067f, -0.000007f, +0.000055f + }, + { + -0.000003f, +0.000579f, -0.003242f, +0.000474f, -0.000045f, +0.000016f, +0.000196f, +0.000189f, +0.000688f, -0.000394f, + -0.000396f, +0.000198f, -0.001763f, +0.000499f, +0.007622f, +0.001532f, +0.001822f, -0.000386f, +0.000173f, -0.000207f, + -0.000295f, +0.001430f, -0.000036f, +0.001346f, +0.001486f, +0.000370f, +0.000820f, +0.000154f, -0.001475f, +0.000207f, + -0.001074f, +0.000186f, +0.000786f, +0.000101f, +0.000034f, -0.000026f, -0.000027f, -0.000096f, -0.000094f, +0.000313f, + -0.000390f, +0.000009f, +0.000243f, -0.000184f, -0.000045f, +0.000214f, -0.000543f, +0.000153f, +0.000059f, +0.000218f, + -0.000247f, +0.000306f, +0.000372f, -0.000044f, +0.000009f, -0.000003f, -0.000075f, -0.000037f, +0.000052f, -0.000100f, + -0.000128f, +0.000319f, -0.000068f, -0.000075f, +0.000028f, +0.000168f, -0.000195f, -0.000026f, +0.000039f, +0.000033f, + +0.000078f, -0.000061f, -0.000019f, +0.000046f, -0.000037f, +0.000064f, +0.000126f, -0.000127f, -0.000032f, -0.000092f, + -0.000015f, +0.000073f, -0.000033f, -0.000006f, +0.000036f, -0.000071f, -0.000053f, -0.000080f, +0.000058f, -0.000076f, + +0.000002f, +0.000069f, +0.000046f, -0.000055f, +0.000019f, +0.000058f + }, + { + +0.001628f, +0.001573f, +0.001020f, -0.000487f, -0.001114f, -0.000586f, -0.001199f, -0.000325f, +0.000220f, -0.000634f, + +0.001213f, +0.000421f, -0.000122f, -0.001460f, -0.003150f, -0.000685f, +0.001217f, +0.000062f, +0.000134f, -0.000292f, + +0.000026f, -0.000369f, -0.000017f, +0.000461f, +0.000206f, -0.000053f, -0.000454f, -0.000618f, +0.000726f, -0.000022f, + +0.000169f, +0.000020f, +0.000449f, -0.000050f, -0.000154f, -0.000594f, -0.000377f, -0.000255f, +0.000402f, -0.000418f, + +0.000188f, +0.000329f, +0.000358f, +0.000088f, -0.000073f, +0.000223f, -0.000251f, -0.000219f, -0.000085f, +0.000006f, + +0.000128f, +0.000019f, +0.000230f, +0.000227f, +0.000054f, +0.000025f, +0.000111f, -0.000118f, +0.000168f, -0.000072f, + +0.000047f, +0.000099f, -0.000087f, -0.000100f, +0.000023f, -0.000052f, -0.000162f, -0.000004f, +0.000045f, +0.000019f, + +0.000066f, -0.000105f, -0.000148f, +0.000041f, +0.000123f, +0.000047f, -0.000027f, -0.000060f, +0.000034f, +0.000003f, + -0.000065f, -0.000066f, +0.000084f, -0.000015f, -0.000032f, +0.000031f, +0.000019f, -0.000029f, +0.000127f, -0.000029f, + +0.000003f, +0.000039f, -0.000051f, +0.000007f, -0.000025f, -0.000003f + } + }, + { + { + +0.000262f, -0.000635f, -0.003161f, +0.001037f, -0.000725f, -0.000132f, +0.000137f, -0.000482f, -0.000027f, -0.000065f, + +0.000166f, -0.000161f, +0.001181f, +0.000976f, +0.000345f, -0.000829f, -0.000594f, -0.000323f, +0.000423f, -0.000253f, + -0.001191f, -0.001121f, +0.000590f, +0.000127f, +0.000589f, +0.000199f, -0.001017f, +0.000431f, -0.000444f, -0.001201f, + -0.000053f, -0.000519f, -0.000578f, +0.000733f, -0.000328f, -0.000293f, +0.000451f, +0.000649f, -0.000223f, -0.000432f, + -0.000021f, -0.000094f, +0.000268f, -0.000239f, -0.000142f, +0.000158f, +0.000102f, -0.000106f, -0.000220f, -0.000373f, + -0.000099f, +0.000044f, -0.000056f, -0.000208f, -0.000113f, +0.000013f, -0.000012f, +0.000247f, +0.000096f, -0.000291f, + -0.000098f, -0.000231f, +0.000015f, +0.000092f, -0.000003f, -0.000103f, +0.000038f, -0.000080f, -0.000222f, +0.000064f, + +0.000135f, +0.000035f, +0.000045f, -0.000020f, +0.000035f, -0.000004f, +0.000005f, -0.000060f, -0.000051f, +0.000016f, + +0.000024f, -0.000055f, -0.000058f, -0.000020f, +0.000097f, +0.000063f, +0.000002f, -0.000066f, +0.000017f, +0.000068f, + -0.000060f, +0.000021f, +0.000013f, +0.000014f, +0.000035f, -0.000009f + }, + { + +0.003558f, -0.032283f, -0.010037f, -0.001355f, -0.000288f, -0.000779f, +0.000416f, +0.000443f, +0.000105f, -0.000646f, + -0.000003f, -0.000501f, +0.000041f, -0.000101f, -0.001047f, +0.001054f, +0.000225f, +0.000083f, +0.000903f, -0.000188f, + +0.000247f, +0.000882f, -0.000718f, -0.000036f, +0.000407f, +0.000503f, +0.000005f, +0.000854f, -0.000128f, -0.000052f, + -0.000414f, -0.000441f, +0.000372f, +0.000324f, -0.000869f, -0.000132f, +0.000629f, +0.000580f, +0.000278f, -0.000484f, + -0.000208f, -0.000473f, +0.000273f, +0.000368f, -0.000337f, +0.000370f, -0.000192f, +0.000416f, -0.000162f, +0.000177f, + -0.000059f, -0.000487f, +0.000103f, +0.000140f, -0.000050f, +0.000106f, -0.000052f, +0.000225f, +0.000082f, +0.000035f, + -0.000128f, +0.000245f, +0.000050f, +0.000024f, +0.000095f, +0.000007f, -0.000137f, -0.000113f, -0.000129f, +0.000163f, + +0.000075f, +0.000005f, -0.000051f, -0.000117f, +0.000145f, -0.000098f, +0.000016f, +0.000066f, -0.000011f, -0.000117f, + -0.000034f, +0.000037f, -0.000019f, +0.000003f, +0.000021f, +0.000156f, -0.000114f, +0.000033f, -0.000001f, +0.000004f, + +0.000010f, +0.000001f, -0.000050f, +0.000023f, -0.000022f, +0.000023f + }, + { + +0.002744f, -0.005425f, +0.000254f, -0.002096f, +0.001846f, +0.000591f, -0.000546f, -0.000048f, -0.000047f, +0.001171f, + +0.000013f, +0.000187f, +0.000182f, +0.000053f, -0.002539f, -0.000889f, -0.000564f, -0.000438f, -0.000318f, -0.000681f, + +0.000524f, -0.000463f, -0.000016f, -0.000578f, -0.000337f, +0.000156f, +0.000854f, +0.000443f, -0.000579f, -0.000258f, + +0.000733f, +0.000329f, -0.000301f, +0.000692f, +0.000086f, -0.000479f, -0.000253f, +0.000178f, +0.000598f, +0.000182f, + -0.000349f, +0.000091f, +0.000334f, -0.000129f, +0.000158f, +0.000751f, +0.000126f, +0.000052f, -0.000183f, +0.000179f, + +0.000182f, +0.000163f, +0.000186f, +0.000025f, -0.000005f, +0.000009f, -0.000251f, +0.000183f, +0.000057f, +0.000030f, + -0.000210f, -0.000148f, +0.000052f, -0.000094f, -0.000083f, -0.000012f, +0.000038f, -0.000033f, -0.000014f, -0.000030f, + +0.000011f, -0.000006f, -0.000009f, -0.000085f, +0.000039f, +0.000016f, +0.000036f, +0.000009f, +0.000084f, -0.000000f, + -0.000041f, +0.000006f, -0.000083f, +0.000042f, +0.000052f, -0.000025f, +0.000059f, +0.000005f, -0.000056f, +0.000039f, + -0.000060f, +0.000008f, -0.000025f, +0.000008f, -0.000017f, -0.000024f + }, + { + -0.000236f, +0.007600f, +0.001046f, -0.000742f, +0.000217f, +0.000108f, -0.000411f, -0.000294f, -0.000162f, +0.000055f, + +0.000129f, +0.000275f, -0.000131f, -0.000685f, +0.004541f, +0.000229f, -0.004323f, +0.000140f, -0.001626f, +0.000892f, + +0.001204f, -0.001295f, +0.000287f, +0.000904f, -0.001003f, +0.000610f, -0.001140f, -0.000314f, +0.000957f, -0.000754f, + +0.000243f, +0.000347f, -0.000490f, -0.000128f, -0.000192f, -0.000338f, +0.000079f, +0.000123f, -0.000110f, -0.000075f, + +0.000150f, +0.000235f, +0.000343f, +0.000148f, -0.000008f, -0.000218f, -0.000054f, +0.000048f, +0.000084f, +0.000180f, + +0.000475f, -0.000112f, -0.000160f, +0.000084f, +0.000004f, +0.000164f, +0.000158f, -0.000097f, +0.000096f, +0.000135f, + -0.000053f, -0.000076f, +0.000163f, +0.000018f, -0.000043f, +0.000060f, +0.000006f, -0.000072f, -0.000040f, +0.000173f, + +0.000142f, -0.000066f, -0.000048f, +0.000017f, +0.000049f, +0.000003f, -0.000103f, -0.000052f, +0.000034f, +0.000080f, + +0.000049f, -0.000068f, +0.000013f, -0.000014f, +0.000032f, +0.000048f, -0.000086f, -0.000041f, +0.000011f, +0.000023f, + -0.000008f, -0.000053f, -0.000028f, +0.000062f, -0.000023f, -0.000014f + }, + { + +0.007597f, +0.004839f, -0.007591f, +0.001195f, -0.000282f, +0.000224f, +0.000350f, -0.000053f, +0.000046f, +0.000545f, + -0.000638f, +0.000852f, -0.000292f, -0.000493f, +0.000572f, -0.001033f, +0.000448f, -0.000175f, -0.000013f, +0.000002f, + -0.000169f, +0.000324f, -0.000456f, +0.000644f, -0.000593f, +0.000252f, +0.000188f, +0.002096f, +0.000082f, +0.000209f, + -0.000000f, -0.000410f, -0.000717f, +0.000478f, +0.000162f, +0.000423f, +0.000196f, +0.000055f, -0.000105f, +0.000135f, + +0.000396f, -0.000229f, -0.000156f, +0.000017f, -0.000334f, -0.000109f, +0.000162f, +0.000182f, -0.000037f, +0.000032f, + -0.000265f, -0.000112f, +0.000105f, +0.000261f, +0.000060f, -0.000109f, +0.000328f, +0.000014f, -0.000082f, -0.000204f, + +0.000052f, -0.000011f, -0.000115f, +0.000060f, +0.000059f, -0.000141f, +0.000104f, +0.000090f, -0.000086f, -0.000034f, + -0.000023f, +0.000141f, +0.000069f, -0.000074f, -0.000084f, +0.000057f, -0.000158f, +0.000029f, -0.000036f, -0.000058f, + +0.000003f, -0.000010f, -0.000051f, +0.000069f, +0.000032f, -0.000061f, -0.000007f, -0.000018f, +0.000023f, +0.000010f, + +0.000047f, -0.000007f, -0.000005f, +0.000040f, -0.000031f, -0.000027f + }, + { + -0.000059f, -0.001421f, +0.002573f, +0.000671f, -0.000046f, -0.000005f, -0.000229f, +0.000103f, +0.000018f, +0.000252f, + +0.000367f, +0.000070f, +0.000765f, +0.000946f, -0.001272f, +0.001118f, +0.001172f, +0.001235f, -0.000815f, +0.002157f, + +0.001008f, -0.000319f, -0.001219f, +0.001876f, -0.001503f, -0.000983f, -0.000954f, -0.000249f, -0.000484f, -0.001912f, + -0.000401f, -0.000278f, +0.000110f, -0.000392f, +0.000613f, +0.000291f, -0.000372f, +0.000428f, +0.000264f, +0.000125f, + -0.000537f, +0.000388f, +0.000264f, -0.000122f, +0.000163f, +0.000275f, -0.000002f, -0.000062f, -0.000148f, -0.000047f, + -0.000083f, +0.000234f, +0.000166f, -0.000022f, -0.000235f, +0.000029f, -0.000076f, +0.000130f, -0.000012f, +0.000021f, + +0.000063f, -0.000184f, -0.000013f, +0.000075f, -0.000100f, -0.000052f, +0.000112f, +0.000015f, +0.000086f, -0.000004f, + -0.000121f, -0.000008f, +0.000030f, +0.000054f, -0.000075f, -0.000092f, -0.000092f, +0.000067f, +0.000049f, +0.000079f, + -0.000081f, +0.000046f, +0.000057f, +0.000022f, -0.000054f, -0.000007f, +0.000010f, -0.000001f, -0.000018f, +0.000041f, + +0.000064f, -0.000048f, -0.000102f, +0.000015f, +0.000016f, +0.000022f + }, + { + +0.007260f, -0.023002f, +0.000260f, -0.002664f, -0.000262f, +0.000084f, -0.000083f, +0.000840f, +0.000199f, -0.000287f, + -0.000497f, +0.000216f, -0.000164f, +0.000432f, +0.000414f, -0.000100f, +0.000105f, -0.000449f, +0.001212f, +0.000093f, + -0.000426f, -0.000463f, -0.000246f, +0.000275f, -0.000344f, -0.000193f, -0.000209f, +0.000209f, -0.000510f, +0.000113f, + -0.000143f, -0.000148f, +0.000658f, +0.000112f, -0.000178f, +0.000275f, -0.000069f, -0.000109f, -0.000660f, +0.000017f, + +0.000033f, +0.000486f, +0.000456f, -0.000154f, +0.000018f, -0.000173f, +0.000070f, +0.000083f, -0.000088f, +0.000309f, + -0.000233f, +0.000074f, -0.000079f, -0.000118f, -0.000072f, -0.000128f, -0.000010f, +0.000057f, -0.000116f, +0.000009f, + +0.000062f, +0.000048f, -0.000019f, -0.000010f, -0.000097f, -0.000190f, -0.000110f, +0.000149f, -0.000044f, -0.000078f, + +0.000119f, -0.000000f, -0.000255f, +0.000012f, +0.000030f, -0.000032f, -0.000043f, +0.000029f, +0.000009f, -0.000060f, + +0.000133f, -0.000020f, -0.000068f, +0.000026f, +0.000085f, -0.000086f, -0.000063f, +0.000058f, +0.000042f, +0.000017f, + -0.000075f, +0.000049f, +0.000029f, +0.000015f, +0.000010f, -0.000023f + }, + { + -0.000066f, -0.002202f, +0.000572f, +0.000882f, +0.000253f, +0.000056f, -0.000169f, +0.000114f, -0.000138f, +0.000005f, + +0.000495f, +0.000234f, +0.000164f, +0.001337f, +0.002529f, +0.000336f, +0.000364f, +0.000482f, -0.000791f, +0.001132f, + +0.002615f, +0.000524f, -0.000750f, +0.001084f, -0.001196f, -0.002129f, -0.000346f, -0.000126f, -0.000225f, +0.000085f, + +0.000716f, -0.000243f, -0.000136f, -0.000400f, +0.000313f, -0.000319f, -0.000320f, -0.000167f, +0.000132f, +0.000157f, + +0.000199f, +0.000149f, +0.000035f, +0.000214f, -0.000145f, -0.000300f, -0.000353f, +0.000506f, +0.000060f, -0.000346f, + +0.000001f, -0.000016f, -0.000213f, -0.000105f, -0.000027f, +0.000045f, -0.000060f, +0.000159f, +0.000179f, -0.000177f, + -0.000083f, -0.000076f, +0.000050f, +0.000028f, +0.000082f, -0.000033f, -0.000116f, -0.000110f, +0.000097f, +0.000064f, + +0.000043f, +0.000055f, -0.000020f, -0.000006f, -0.000009f, +0.000023f, -0.000039f, -0.000046f, +0.000048f, -0.000038f, + +0.000097f, +0.000020f, +0.000027f, -0.000012f, -0.000056f, +0.000048f, -0.000056f, -0.000005f, +0.000015f, -0.000058f, + +0.000041f, +0.000002f, -0.000040f, +0.000018f, +0.000002f, +0.000009f + }, + { + +0.009605f, +0.059006f, -0.002942f, -0.001563f, -0.000685f, +0.000087f, -0.000459f, +0.000856f, -0.000559f, -0.000638f, + +0.001005f, +0.000352f, +0.000618f, +0.000495f, +0.000599f, -0.001310f, -0.000803f, +0.000338f, -0.000356f, -0.000219f, + -0.000597f, +0.000384f, -0.000698f, -0.000439f, +0.000369f, -0.000426f, +0.000035f, -0.000117f, -0.000121f, +0.000145f, + -0.000027f, -0.000250f, +0.000088f, -0.000713f, -0.000390f, -0.000358f, -0.000073f, +0.000888f, -0.001163f, +0.000895f, + -0.000380f, +0.000547f, +0.000256f, +0.000160f, -0.000099f, -0.000247f, -0.000184f, +0.000200f, +0.000294f, -0.000250f, + -0.000265f, -0.000080f, -0.000076f, +0.000136f, +0.000301f, +0.000051f, -0.000063f, -0.000113f, +0.000149f, +0.000072f, + +0.000030f, +0.000007f, -0.000074f, +0.000130f, +0.000179f, -0.000093f, -0.000173f, +0.000075f, -0.000018f, -0.000003f, + +0.000015f, +0.000077f, -0.000094f, +0.000075f, -0.000037f, +0.000103f, -0.000091f, -0.000026f, -0.000027f, -0.000026f, + -0.000045f, +0.000070f, -0.000009f, +0.000025f, +0.000018f, -0.000023f, -0.000067f, -0.000056f, +0.000005f, -0.000000f, + +0.000067f, -0.000012f, +0.000000f, -0.000072f, +0.000030f, +0.000015f + }, + { + +0.000206f, +0.004493f, -0.000835f, +0.000810f, +0.000120f, -0.001558f, +0.000202f, +0.000809f, +0.000216f, +0.000131f, + +0.000332f, +0.001322f, -0.000459f, +0.000179f, -0.002081f, +0.000257f, +0.000647f, -0.000917f, -0.001279f, +0.001531f, + +0.000133f, -0.001226f, -0.000880f, -0.000099f, +0.000377f, +0.000331f, -0.000292f, -0.000101f, +0.000355f, +0.000287f, + +0.000059f, -0.000223f, -0.000247f, +0.000257f, -0.000378f, -0.000071f, -0.000652f, -0.000137f, +0.000249f, -0.000272f, + -0.000179f, -0.000347f, +0.000100f, +0.000420f, -0.000491f, +0.000126f, +0.000061f, -0.000077f, +0.000006f, -0.000257f, + -0.000047f, +0.000319f, +0.000017f, +0.000233f, +0.000457f, -0.000262f, -0.000048f, -0.000004f, -0.000074f, +0.000037f, + +0.000139f, +0.000086f, +0.000151f, +0.000018f, +0.000046f, +0.000017f, -0.000145f, -0.000092f, -0.000124f, +0.000128f, + +0.000005f, +0.000035f, +0.000110f, -0.000103f, +0.000015f, +0.000008f, +0.000008f, -0.000028f, +0.000032f, +0.000046f, + +0.000017f, -0.000049f, -0.000035f, -0.000029f, -0.000040f, +0.000020f, +0.000050f, -0.000034f, -0.000012f, -0.000049f, + +0.000055f, -0.000018f, -0.000010f, -0.000012f, -0.000033f, +0.000018f + }, + { + +0.004775f, +0.009026f, -0.003382f, +0.001237f, -0.000272f, +0.000156f, +0.001583f, +0.001178f, +0.000428f, -0.000658f, + +0.000156f, -0.000181f, -0.000147f, -0.000199f, -0.000381f, +0.000364f, -0.000483f, -0.000385f, +0.000069f, +0.000032f, + +0.000339f, -0.000424f, +0.000370f, -0.000146f, +0.000307f, -0.000067f, -0.000407f, +0.000408f, -0.000154f, -0.000462f, + +0.000221f, -0.000063f, +0.000455f, -0.000418f, -0.000530f, +0.000646f, -0.000315f, -0.000313f, +0.000207f, +0.000085f, + -0.000001f, +0.000441f, +0.000222f, +0.000051f, -0.000102f, -0.000173f, -0.000214f, -0.000127f, +0.000138f, +0.000065f, + +0.000065f, -0.000079f, +0.000078f, +0.000250f, +0.000110f, -0.000049f, -0.000143f, -0.000319f, +0.000124f, +0.000102f, + +0.000067f, -0.000006f, +0.000140f, +0.000003f, -0.000129f, +0.000099f, -0.000032f, -0.000020f, -0.000116f, +0.000034f, + +0.000025f, -0.000024f, -0.000085f, -0.000062f, +0.000017f, -0.000048f, +0.000060f, +0.000102f, -0.000053f, +0.000019f, + -0.000018f, -0.000050f, +0.000085f, -0.000102f, +0.000001f, -0.000099f, +0.000028f, -0.000000f, +0.000043f, +0.000009f, + -0.000042f, -0.000009f, +0.000045f, +0.000011f, -0.000064f, +0.000016f + }, + { + -0.000103f, -0.003991f, -0.000610f, -0.000924f, -0.000487f, +0.000316f, +0.000030f, -0.000181f, +0.000147f, -0.000029f, + -0.000207f, +0.000163f, -0.000330f, -0.000812f, -0.000205f, +0.000024f, -0.000338f, -0.000046f, +0.000120f, +0.000118f, + +0.000991f, -0.003104f, +0.000397f, -0.001503f, +0.001168f, +0.001393f, +0.000164f, -0.000731f, -0.000009f, -0.000059f, + +0.000663f, +0.000260f, +0.000735f, -0.000279f, -0.000192f, +0.000088f, +0.000034f, -0.000350f, +0.000575f, +0.000041f, + +0.000070f, +0.000191f, -0.000144f, -0.000030f, +0.000018f, +0.000020f, +0.000007f, -0.000341f, -0.000079f, -0.000348f, + -0.000124f, +0.000311f, -0.000144f, +0.000112f, -0.000043f, +0.000185f, +0.000141f, +0.000126f, -0.000125f, -0.000031f, + -0.000119f, -0.000072f, -0.000018f, +0.000105f, -0.000047f, -0.000125f, +0.000247f, -0.000067f, +0.000065f, -0.000054f, + -0.000049f, +0.000052f, -0.000085f, -0.000012f, -0.000037f, -0.000043f, +0.000036f, +0.000079f, -0.000007f, +0.000061f, + -0.000052f, +0.000044f, +0.000079f, -0.000001f, +0.000012f, +0.000011f, +0.000022f, -0.000035f, -0.000025f, -0.000023f, + -0.000038f, -0.000009f, +0.000016f, +0.000026f, -0.000019f, -0.000023f + }, + { + -0.000747f, -0.004479f, -0.000193f, +0.000153f, -0.000489f, -0.000367f, +0.003964f, +0.000184f, +0.000969f, -0.000662f, + -0.001256f, -0.000074f, -0.000728f, +0.001000f, -0.000794f, +0.000979f, -0.001451f, -0.000166f, +0.000239f, -0.000950f, + +0.000803f, +0.000188f, +0.000368f, +0.000131f, +0.000125f, -0.000394f, -0.000350f, -0.000496f, -0.000522f, +0.000440f, + +0.000071f, +0.000178f, -0.000031f, -0.000050f, -0.000569f, -0.000377f, +0.000505f, +0.000080f, -0.000083f, +0.000333f, + +0.000032f, +0.000048f, +0.000283f, +0.000467f, +0.000244f, +0.000368f, -0.000186f, +0.000199f, -0.000239f, -0.000368f, + +0.000094f, -0.000229f, +0.000111f, -0.000080f, +0.000030f, +0.000083f, +0.000102f, +0.000246f, +0.000109f, -0.000233f, + -0.000073f, -0.000024f, +0.000001f, -0.000054f, +0.000045f, +0.000189f, -0.000004f, +0.000037f, -0.000116f, -0.000042f, + +0.000156f, -0.000000f, -0.000128f, -0.000025f, +0.000011f, -0.000049f, +0.000045f, -0.000090f, -0.000017f, -0.000077f, + +0.000139f, +0.000028f, -0.000032f, -0.000068f, -0.000038f, +0.000129f, +0.000084f, +0.000016f, +0.000045f, +0.000005f, + -0.000024f, -0.000001f, -0.000095f, +0.000002f, -0.000024f, -0.000018f + }, + { + +0.000315f, +0.001138f, -0.001496f, -0.000770f, -0.000028f, +0.000023f, +0.000009f, +0.000291f, +0.000147f, +0.000176f, + -0.000153f, +0.000018f, -0.001601f, +0.003673f, +0.002302f, +0.002967f, +0.000020f, +0.000751f, +0.000219f, -0.000941f, + -0.000434f, +0.000644f, +0.000413f, +0.000973f, +0.001202f, +0.000348f, +0.000408f, -0.000297f, -0.000229f, +0.000254f, + -0.000961f, +0.000430f, +0.000442f, +0.000304f, +0.000470f, +0.000089f, +0.000401f, -0.000109f, -0.000301f, +0.000544f, + -0.000333f, -0.000306f, +0.000145f, -0.000186f, -0.000098f, +0.000097f, -0.000349f, -0.000141f, +0.000094f, +0.000327f, + -0.000243f, +0.000089f, +0.000299f, +0.000231f, -0.000040f, +0.000018f, -0.000042f, -0.000089f, +0.000160f, -0.000076f, + -0.000229f, +0.000106f, -0.000020f, -0.000062f, -0.000076f, +0.000146f, -0.000137f, -0.000173f, +0.000041f, +0.000001f, + +0.000089f, +0.000024f, -0.000102f, +0.000042f, +0.000034f, -0.000066f, +0.000157f, -0.000122f, -0.000048f, -0.000061f, + -0.000080f, +0.000062f, +0.000060f, -0.000022f, +0.000100f, -0.000018f, -0.000026f, -0.000093f, +0.000056f, -0.000016f, + -0.000060f, -0.000004f, +0.000060f, -0.000034f, -0.000038f, +0.000075f + }, + { + +0.000017f, +0.003353f, +0.003389f, -0.001240f, -0.000730f, -0.004263f, +0.000107f, +0.000055f, -0.000056f, -0.000235f, + -0.000175f, -0.000032f, +0.000502f, -0.001707f, -0.003217f, -0.000798f, +0.001080f, -0.001438f, +0.000568f, -0.000131f, + -0.000098f, +0.000087f, -0.000305f, -0.000539f, +0.000549f, +0.000314f, -0.000149f, +0.000765f, -0.001055f, +0.000464f, + +0.000364f, -0.000184f, +0.000257f, +0.000599f, -0.000121f, -0.000058f, -0.000613f, -0.000189f, +0.000175f, +0.000101f, + -0.000244f, +0.000376f, +0.000338f, +0.000226f, -0.000158f, +0.000213f, +0.000136f, -0.000306f, -0.000300f, +0.000011f, + +0.000071f, -0.000164f, +0.000021f, +0.000181f, +0.000102f, +0.000112f, +0.000204f, -0.000060f, +0.000122f, +0.000024f, + -0.000009f, +0.000128f, +0.000040f, -0.000112f, -0.000019f, +0.000007f, -0.000140f, +0.000096f, +0.000049f, -0.000091f, + +0.000120f, +0.000010f, -0.000188f, -0.000142f, +0.000030f, +0.000082f, +0.000057f, -0.000030f, -0.000043f, +0.000070f, + -0.000029f, -0.000149f, +0.000040f, +0.000053f, -0.000035f, -0.000004f, -0.000003f, -0.000123f, +0.000084f, +0.000040f, + -0.000003f, +0.000039f, -0.000010f, -0.000034f, -0.000052f, -0.000005f + } + }, + { + { + +0.000034f, +0.007674f, +0.001430f, +0.001471f, +0.000347f, -0.000350f, +0.000190f, +0.000193f, -0.000147f, +0.000409f, + -0.000095f, +0.000133f, +0.000168f, -0.000240f, +0.001120f, -0.000540f, +0.001085f, -0.000622f, -0.000239f, -0.000158f, + +0.000663f, -0.000114f, -0.000288f, -0.000751f, -0.000730f, -0.000591f, -0.000838f, +0.000028f, -0.000341f, -0.000182f, + +0.000419f, +0.000755f, -0.001472f, +0.000718f, +0.000492f, +0.000115f, +0.000008f, +0.000203f, +0.000326f, +0.000253f, + +0.000240f, -0.000427f, +0.000048f, -0.000081f, +0.000347f, +0.000015f, -0.000317f, +0.000111f, +0.000039f, +0.000192f, + +0.000175f, -0.000092f, -0.000080f, +0.000117f, -0.000256f, -0.000246f, +0.000091f, -0.000103f, +0.000298f, +0.000098f, + +0.000150f, -0.000060f, -0.000189f, +0.000077f, +0.000147f, -0.000038f, -0.000118f, -0.000014f, -0.000029f, -0.000137f, + -0.000001f, +0.000087f, -0.000091f, +0.000082f, +0.000022f, +0.000001f, -0.000026f, +0.000084f, -0.000043f, -0.000079f, + +0.000031f, +0.000057f, +0.000024f, -0.000044f, -0.000079f, -0.000046f, +0.000059f, -0.000013f, -0.000020f, +0.000010f, + +0.000084f, -0.000040f, +0.000023f, -0.000050f, -0.000024f, +0.000031f + }, + { + -0.003066f, -0.021749f, +0.010729f, +0.002001f, +0.000924f, +0.000154f, -0.000129f, +0.000422f, +0.000815f, -0.000908f, + -0.000284f, -0.000022f, -0.000685f, +0.000842f, -0.001399f, -0.000584f, +0.001069f, -0.000454f, -0.001020f, -0.000098f, + -0.000250f, +0.000772f, +0.000320f, +0.000383f, -0.000002f, -0.000287f, -0.000799f, +0.000749f, -0.000088f, -0.000487f, + -0.000529f, -0.000571f, -0.000372f, +0.000190f, +0.000043f, -0.000441f, -0.000266f, +0.000102f, +0.000335f, -0.000056f, + +0.000659f, -0.000321f, -0.000154f, +0.000224f, -0.000072f, -0.000362f, +0.000048f, -0.000079f, +0.000039f, +0.000352f, + +0.000232f, +0.000029f, -0.000229f, -0.000097f, -0.000207f, -0.000222f, +0.000089f, -0.000019f, +0.000129f, -0.000012f, + -0.000071f, +0.000005f, -0.000033f, -0.000057f, -0.000039f, +0.000096f, +0.000075f, +0.000001f, -0.000134f, -0.000103f, + +0.000027f, -0.000078f, +0.000121f, -0.000056f, -0.000031f, +0.000179f, -0.000099f, -0.000025f, +0.000029f, +0.000046f, + +0.000033f, -0.000073f, +0.000061f, +0.000025f, -0.000058f, -0.000050f, +0.000143f, -0.000066f, +0.000033f, -0.000032f, + -0.000007f, +0.000037f, +0.000027f, -0.000047f, +0.000003f, -0.000019f + }, + { + -0.002705f, -0.012349f, +0.003664f, -0.001637f, -0.002783f, -0.000371f, -0.000116f, -0.000424f, -0.000130f, +0.000178f, + -0.000258f, +0.000187f, -0.000016f, +0.001111f, -0.001741f, -0.000890f, +0.000321f, +0.000760f, +0.000657f, -0.000096f, + -0.000027f, +0.000000f, -0.000105f, -0.000156f, +0.000639f, -0.000357f, -0.000426f, -0.000723f, -0.000511f, -0.000005f, + +0.000849f, +0.000027f, -0.000696f, -0.000611f, -0.000191f, -0.000172f, -0.000439f, -0.000039f, -0.000015f, -0.000352f, + -0.000108f, -0.000420f, +0.000243f, -0.000142f, -0.000246f, +0.000035f, +0.000266f, +0.000257f, -0.000072f, -0.000556f, + -0.000270f, +0.000364f, +0.000372f, -0.000077f, -0.000029f, +0.000163f, -0.000192f, -0.000230f, -0.000136f, +0.000121f, + +0.000100f, -0.000043f, -0.000139f, -0.000169f, +0.000118f, -0.000032f, +0.000024f, -0.000129f, +0.000116f, +0.000059f, + -0.000041f, -0.000011f, -0.000009f, -0.000059f, -0.000088f, +0.000002f, +0.000017f, +0.000005f, +0.000012f, +0.000078f, + +0.000030f, +0.000020f, +0.000017f, -0.000088f, +0.000016f, +0.000036f, -0.000024f, +0.000036f, -0.000003f, +0.000024f, + +0.000052f, -0.000025f, +0.000013f, -0.000055f, -0.000006f, +0.000022f + }, + { + +0.000186f, +0.006223f, +0.001131f, +0.000402f, -0.000293f, +0.000105f, -0.000034f, -0.000033f, -0.000272f, -0.000187f, + -0.000107f, +0.000044f, +0.000774f, -0.000497f, +0.000796f, +0.001491f, +0.000079f, +0.000157f, -0.002452f, +0.001334f, + +0.000493f, -0.001460f, -0.000368f, -0.000499f, -0.000210f, +0.001070f, +0.000209f, -0.000306f, +0.000455f, -0.001061f, + -0.000527f, -0.000459f, +0.000035f, -0.000116f, +0.000161f, +0.000653f, -0.001045f, +0.000162f, +0.000344f, -0.000781f, + +0.000241f, +0.000155f, -0.000120f, -0.000106f, -0.000028f, +0.000410f, -0.000080f, -0.000013f, +0.000334f, -0.000065f, + +0.000017f, +0.000170f, -0.000166f, -0.000011f, +0.000097f, -0.000150f, +0.000033f, +0.000246f, -0.000114f, -0.000063f, + +0.000033f, +0.000046f, -0.000029f, +0.000076f, -0.000047f, -0.000084f, +0.000000f, +0.000013f, -0.000058f, -0.000073f, + -0.000035f, +0.000173f, +0.000081f, +0.000004f, -0.000075f, +0.000138f, -0.000014f, -0.000026f, -0.000072f, -0.000007f, + +0.000018f, +0.000049f, -0.000072f, +0.000013f, -0.000042f, +0.000019f, +0.000048f, +0.000026f, +0.000006f, -0.000045f, + +0.000011f, +0.000058f, -0.000030f, -0.000016f, +0.000012f, -0.000031f + }, + { + -0.010798f, -0.013854f, +0.000122f, +0.002418f, -0.000246f, -0.000444f, -0.000359f, +0.000378f, -0.000221f, +0.000536f, + +0.000018f, -0.000672f, +0.000298f, +0.000392f, +0.000261f, +0.000523f, -0.000217f, -0.000770f, +0.000444f, +0.000177f, + +0.000516f, -0.000416f, -0.000642f, -0.000018f, +0.000483f, -0.000277f, +0.000362f, +0.001192f, -0.000502f, -0.000527f, + +0.000157f, -0.000087f, +0.000058f, +0.000040f, -0.000660f, +0.000086f, -0.000350f, +0.001229f, +0.000329f, -0.000606f, + +0.000672f, -0.000022f, +0.000019f, -0.000237f, +0.000054f, +0.000284f, -0.000376f, -0.000046f, +0.000140f, -0.000000f, + +0.000070f, +0.000220f, -0.000445f, +0.000067f, -0.000042f, -0.000053f, -0.000083f, -0.000052f, +0.000194f, +0.000252f, + +0.000027f, -0.000003f, -0.000027f, -0.000194f, -0.000120f, -0.000042f, -0.000058f, +0.000138f, +0.000061f, -0.000015f, + -0.000119f, -0.000034f, +0.000043f, +0.000175f, -0.000021f, -0.000009f, +0.000012f, -0.000111f, +0.000058f, +0.000030f, + +0.000003f, -0.000031f, +0.000024f, -0.000111f, +0.000037f, +0.000015f, +0.000006f, -0.000026f, -0.000041f, +0.000070f, + -0.000004f, -0.000013f, -0.000014f, +0.000013f, +0.000047f, +0.000015f + }, + { + +0.000469f, +0.000450f, -0.001271f, -0.000217f, +0.000048f, +0.000166f, +0.000138f, +0.000001f, -0.000094f, -0.000094f, + -0.000370f, +0.000003f, -0.000089f, -0.000371f, +0.001030f, +0.002088f, -0.002778f, +0.000790f, -0.000484f, +0.000920f, + -0.000875f, +0.000370f, +0.000667f, +0.002018f, -0.000197f, +0.001308f, +0.000078f, +0.000008f, +0.001219f, +0.000140f, + +0.000590f, -0.000655f, +0.000408f, -0.000347f, +0.000283f, +0.000399f, -0.000160f, -0.000227f, -0.000334f, +0.000089f, + +0.000326f, -0.000247f, +0.000170f, +0.000076f, -0.000129f, +0.000027f, -0.000408f, +0.000087f, +0.000012f, +0.000222f, + +0.000094f, +0.000086f, -0.000093f, +0.000255f, +0.000053f, -0.000054f, -0.000070f, +0.000234f, -0.000032f, -0.000024f, + +0.000135f, -0.000019f, -0.000021f, +0.000116f, +0.000070f, -0.000136f, -0.000023f, -0.000046f, +0.000067f, +0.000074f, + +0.000117f, -0.000008f, -0.000088f, +0.000034f, +0.000015f, -0.000035f, -0.000019f, -0.000078f, -0.000103f, -0.000019f, + +0.000053f, -0.000047f, -0.000020f, +0.000014f, +0.000069f, -0.000028f, -0.000021f, +0.000024f, -0.000006f, -0.000036f, + -0.000007f, +0.000064f, +0.000029f, -0.000050f, -0.000017f, -0.000019f + }, + { + -0.001549f, -0.035610f, +0.000965f, -0.002170f, +0.000987f, -0.000117f, +0.000097f, -0.000074f, -0.000810f, +0.000065f, + -0.000040f, +0.000091f, +0.000401f, +0.000535f, +0.000793f, -0.000379f, +0.000687f, -0.000642f, -0.000595f, +0.000579f, + +0.000258f, +0.000513f, -0.000252f, -0.000077f, -0.000642f, -0.000174f, +0.000197f, -0.000185f, -0.000099f, +0.000115f, + +0.000304f, +0.000136f, +0.000186f, +0.000271f, -0.000351f, +0.000219f, +0.000097f, +0.000250f, -0.000342f, +0.000085f, + -0.000142f, -0.000318f, -0.000104f, +0.000229f, +0.000097f, -0.000049f, -0.000213f, +0.000327f, +0.000099f, -0.000019f, + +0.000152f, -0.000097f, +0.000170f, +0.000055f, +0.000140f, -0.000048f, -0.000025f, +0.000236f, -0.000008f, -0.000042f, + -0.000086f, -0.000071f, -0.000007f, +0.000008f, +0.000036f, +0.000004f, -0.000098f, -0.000107f, +0.000061f, +0.000018f, + -0.000111f, +0.000157f, +0.000077f, -0.000109f, -0.000098f, +0.000028f, +0.000064f, -0.000071f, +0.000043f, +0.000032f, + -0.000092f, +0.000060f, +0.000016f, -0.000111f, -0.000013f, +0.000129f, -0.000068f, -0.000043f, -0.000006f, +0.000069f, + +0.000007f, -0.000055f, +0.000021f, -0.000033f, +0.000027f, -0.000020f + }, + { + +0.000612f, -0.000868f, -0.003613f, +0.000592f, -0.000192f, +0.000002f, +0.000063f, -0.000034f, +0.000041f, -0.000299f, + -0.000083f, +0.000165f, +0.000812f, -0.001331f, +0.000370f, +0.002815f, +0.000831f, +0.001926f, -0.000248f, -0.001266f, + +0.001054f, +0.001884f, -0.001489f, +0.000964f, +0.000288f, -0.000405f, +0.000574f, -0.000796f, -0.001004f, -0.000075f, + +0.000396f, -0.000290f, +0.000583f, -0.000532f, +0.000256f, +0.000572f, -0.000008f, -0.000413f, +0.000226f, -0.000219f, + +0.000109f, +0.000335f, -0.000263f, +0.000074f, +0.000220f, -0.000035f, +0.000128f, -0.000249f, +0.000310f, +0.000429f, + +0.000005f, +0.000006f, -0.000058f, +0.000167f, -0.000370f, -0.000073f, -0.000038f, -0.000127f, +0.000061f, +0.000248f, + -0.000005f, +0.000153f, -0.000138f, +0.000020f, -0.000017f, +0.000071f, +0.000246f, -0.000049f, -0.000093f, +0.000005f, + -0.000002f, -0.000076f, -0.000033f, +0.000119f, -0.000041f, -0.000006f, +0.000093f, -0.000074f, -0.000020f, +0.000006f, + -0.000089f, -0.000001f, +0.000035f, +0.000036f, +0.000032f, -0.000023f, +0.000003f, -0.000087f, +0.000040f, +0.000010f, + -0.000068f, +0.000032f, -0.000025f, +0.000011f, +0.000018f, -0.000004f + }, + { + -0.015411f, +0.036952f, +0.007928f, -0.000745f, +0.000485f, +0.000139f, -0.000826f, +0.000122f, +0.000990f, -0.000429f, + -0.001424f, +0.000198f, +0.000068f, +0.001359f, -0.000679f, +0.000561f, -0.000501f, -0.000075f, -0.000280f, +0.000193f, + -0.000171f, -0.000079f, -0.000001f, -0.000676f, -0.000507f, +0.000141f, -0.000486f, -0.000706f, +0.000062f, +0.000188f, + +0.000594f, -0.000644f, +0.000202f, -0.000701f, -0.000059f, -0.000622f, -0.000449f, +0.001156f, -0.001263f, -0.000149f, + -0.000159f, +0.000588f, -0.000148f, +0.000352f, -0.000099f, +0.000279f, -0.000105f, -0.000389f, +0.000230f, +0.000004f, + -0.000121f, -0.000561f, -0.000187f, +0.000017f, -0.000191f, -0.000069f, +0.000114f, -0.000056f, -0.000246f, +0.000011f, + +0.000096f, -0.000132f, -0.000053f, -0.000063f, -0.000136f, +0.000268f, +0.000117f, -0.000099f, -0.000011f, +0.000044f, + -0.000088f, +0.000107f, +0.000056f, +0.000031f, -0.000037f, -0.000121f, +0.000106f, -0.000030f, -0.000000f, -0.000055f, + +0.000011f, +0.000007f, +0.000017f, +0.000025f, -0.000001f, +0.000056f, +0.000066f, -0.000026f, -0.000010f, -0.000061f, + -0.000015f, +0.000026f, +0.000003f, +0.000041f, -0.000046f, +0.000012f + }, + { + -0.000322f, +0.001772f, +0.000427f, +0.000367f, +0.000758f, +0.000893f, -0.001044f, +0.000058f, +0.000384f, +0.000072f, + -0.000512f, +0.000220f, +0.000704f, +0.001396f, -0.001042f, -0.000825f, +0.000720f, +0.001297f, -0.000350f, -0.001249f, + -0.000241f, +0.000046f, +0.000978f, +0.000129f, -0.000440f, -0.000281f, +0.000363f, -0.000028f, -0.000337f, +0.000500f, + -0.001034f, +0.000409f, +0.000077f, +0.000072f, -0.000341f, +0.000464f, +0.000032f, -0.000337f, -0.000384f, -0.000410f, + -0.000082f, -0.000102f, -0.000181f, +0.000117f, +0.000416f, -0.000338f, +0.000085f, -0.000299f, +0.000105f, +0.000157f, + -0.000278f, +0.000052f, -0.000120f, -0.000257f, -0.000091f, +0.000194f, +0.000100f, +0.000024f, -0.000026f, -0.000049f, + +0.000007f, +0.000038f, -0.000073f, +0.000102f, -0.000067f, +0.000219f, +0.000149f, -0.000010f, -0.000042f, -0.000184f, + -0.000018f, -0.000037f, +0.000034f, +0.000095f, -0.000026f, -0.000085f, +0.000031f, +0.000018f, +0.000004f, +0.000021f, + +0.000062f, +0.000052f, +0.000028f, -0.000024f, -0.000008f, -0.000057f, -0.000013f, +0.000027f, -0.000003f, +0.000043f, + -0.000045f, +0.000009f, -0.000024f, +0.000015f, -0.000002f, -0.000044f + }, + { + -0.004436f, +0.001496f, -0.000145f, +0.000904f, -0.000018f, +0.002008f, -0.002909f, -0.000327f, +0.000792f, -0.000007f, + -0.000075f, +0.000046f, +0.000061f, +0.000234f, -0.001487f, +0.000574f, -0.000133f, -0.000327f, -0.000282f, +0.000103f, + -0.000104f, +0.000709f, -0.000222f, +0.000164f, -0.000349f, -0.000052f, -0.000178f, +0.000040f, +0.000349f, -0.000024f, + -0.000418f, -0.001045f, +0.000521f, +0.000151f, -0.000518f, -0.000452f, +0.000493f, -0.000363f, +0.000166f, +0.000624f, + -0.000226f, -0.000518f, +0.000183f, -0.000026f, +0.000270f, +0.000124f, -0.000106f, -0.000005f, -0.000324f, +0.000094f, + +0.000004f, -0.000017f, +0.000053f, -0.000258f, +0.000155f, +0.000014f, +0.000139f, +0.000095f, -0.000200f, -0.000006f, + +0.000024f, -0.000041f, +0.000052f, +0.000103f, +0.000114f, -0.000083f, +0.000007f, -0.000012f, +0.000004f, -0.000026f, + +0.000048f, +0.000017f, +0.000058f, -0.000007f, -0.000120f, +0.000017f, -0.000089f, -0.000054f, +0.000045f, -0.000061f, + +0.000065f, -0.000024f, -0.000061f, +0.000102f, -0.000052f, +0.000049f, -0.000069f, +0.000011f, -0.000064f, +0.000017f, + +0.000030f, -0.000041f, -0.000029f, +0.000028f, +0.000045f, -0.000034f + }, + { + +0.000035f, -0.004731f, +0.000228f, -0.000560f, +0.000284f, -0.000659f, +0.000009f, +0.000231f, +0.000055f, -0.000246f, + -0.000360f, -0.000319f, +0.001045f, +0.001104f, -0.003026f, -0.000692f, +0.001291f, +0.000178f, -0.001872f, -0.000609f, + +0.000883f, +0.000365f, +0.000847f, -0.000596f, -0.000763f, -0.000243f, +0.001057f, -0.000634f, -0.000564f, +0.000882f, + -0.000885f, +0.000972f, +0.000222f, +0.000168f, -0.000346f, -0.000010f, -0.000206f, +0.000225f, -0.000474f, +0.000002f, + -0.000176f, +0.000141f, +0.000501f, -0.000155f, -0.000235f, +0.000206f, +0.000062f, +0.000050f, -0.000024f, -0.000079f, + -0.000158f, +0.000133f, +0.000197f, +0.000038f, -0.000182f, -0.000059f, -0.000009f, +0.000192f, +0.000300f, +0.000037f, + +0.000221f, -0.000063f, -0.000156f, -0.000011f, +0.000207f, +0.000193f, -0.000048f, +0.000134f, +0.000002f, +0.000027f, + +0.000015f, -0.000024f, +0.000002f, -0.000009f, -0.000048f, +0.000022f, -0.000092f, -0.000076f, +0.000020f, -0.000010f, + +0.000072f, -0.000021f, -0.000009f, +0.000053f, +0.000028f, -0.000009f, +0.000022f, +0.000045f, +0.000023f, +0.000014f, + +0.000021f, +0.000022f, -0.000049f, -0.000038f, +0.000061f, -0.000011f + }, + { + +0.001975f, -0.001605f, +0.005358f, -0.000821f, -0.000142f, -0.002497f, -0.001477f, -0.000364f, +0.000439f, +0.000990f, + -0.000587f, -0.000790f, +0.000741f, +0.002311f, -0.000579f, +0.000128f, +0.000169f, +0.000334f, -0.000131f, +0.000300f, + -0.000976f, +0.000256f, -0.000053f, +0.000054f, +0.000001f, -0.000056f, -0.000207f, +0.000179f, -0.000433f, -0.000321f, + +0.000091f, -0.000356f, -0.000329f, -0.000088f, +0.000392f, -0.000119f, -0.000300f, +0.000181f, +0.000494f, -0.000493f, + -0.000543f, -0.000109f, +0.000372f, -0.000208f, +0.000323f, +0.000240f, +0.000033f, -0.000371f, +0.000354f, +0.000020f, + +0.000421f, -0.000035f, -0.000157f, +0.000004f, -0.000201f, -0.000158f, -0.000121f, -0.000062f, +0.000015f, +0.000204f, + -0.000049f, +0.000049f, +0.000021f, +0.000063f, -0.000153f, +0.000004f, -0.000062f, +0.000111f, +0.000120f, -0.000144f, + -0.000103f, +0.000121f, +0.000057f, -0.000076f, -0.000016f, -0.000038f, +0.000022f, +0.000107f, -0.000062f, -0.000017f, + -0.000127f, +0.000065f, +0.000060f, +0.000041f, -0.000053f, -0.000119f, +0.000013f, +0.000104f, +0.000004f, +0.000015f, + +0.000026f, +0.000023f, +0.000006f, -0.000062f, +0.000023f, -0.000041f + }, + { + -0.000577f, +0.001765f, +0.001940f, -0.000104f, +0.000065f, -0.000128f, -0.000322f, +0.000466f, -0.000750f, -0.000627f, + +0.000346f, +0.000045f, +0.000704f, +0.002782f, -0.009970f, +0.001331f, -0.000002f, -0.000281f, +0.000485f, -0.000841f, + -0.000403f, -0.000351f, +0.000313f, +0.000549f, -0.000049f, +0.001076f, -0.001131f, +0.000394f, +0.000616f, +0.000012f, + -0.000105f, +0.000710f, -0.000011f, +0.000421f, -0.000114f, +0.000293f, +0.000474f, +0.000013f, +0.000081f, +0.000062f, + +0.000309f, -0.000139f, -0.000013f, +0.000100f, -0.000039f, -0.000148f, +0.000191f, -0.000229f, +0.000048f, -0.000079f, + +0.000220f, -0.000202f, -0.000265f, +0.000004f, -0.000006f, -0.000083f, +0.000015f, +0.000038f, +0.000081f, +0.000027f, + +0.000147f, -0.000233f, -0.000105f, +0.000011f, -0.000065f, -0.000185f, +0.000142f, +0.000014f, -0.000065f, -0.000007f, + -0.000079f, +0.000003f, +0.000068f, -0.000048f, +0.000040f, -0.000057f, -0.000081f, +0.000112f, -0.000019f, +0.000091f, + +0.000018f, -0.000136f, +0.000024f, -0.000011f, -0.000017f, +0.000037f, +0.000074f, +0.000085f, -0.000074f, +0.000080f, + +0.000026f, -0.000064f, -0.000041f, +0.000043f, -0.000008f, -0.000049f + }, + { + -0.000851f, -0.000497f, +0.004042f, +0.000702f, +0.000503f, -0.000196f, +0.000913f, +0.000589f, -0.000278f, -0.000594f, + -0.000080f, -0.001690f, +0.000212f, +0.001946f, +0.003231f, +0.000072f, -0.000173f, -0.000567f, +0.000598f, -0.000666f, + +0.000095f, +0.000541f, +0.000041f, -0.000331f, -0.000487f, -0.000028f, +0.000452f, +0.002462f, +0.000083f, +0.000028f, + +0.000300f, +0.000133f, -0.000068f, +0.000417f, -0.000306f, +0.000240f, -0.000234f, +0.000429f, -0.000130f, +0.000520f, + +0.000013f, +0.000124f, +0.000073f, +0.000010f, -0.000015f, -0.000366f, +0.000323f, +0.000243f, -0.000209f, -0.000197f, + +0.000008f, -0.000035f, -0.000102f, -0.000224f, +0.000146f, -0.000264f, -0.000034f, +0.000073f, -0.000011f, +0.000177f, + -0.000073f, -0.000058f, +0.000115f, +0.000042f, -0.000002f, +0.000041f, +0.000010f, +0.000117f, -0.000063f, -0.000081f, + -0.000022f, -0.000010f, +0.000108f, +0.000006f, -0.000131f, -0.000100f, +0.000036f, +0.000052f, -0.000085f, +0.000020f, + +0.000080f, -0.000002f, -0.000052f, +0.000039f, +0.000018f, -0.000003f, -0.000030f, +0.000016f, -0.000134f, +0.000032f, + -0.000003f, -0.000018f, +0.000061f, +0.000003f, +0.000007f, -0.000016f + } + }, + { + { + +0.000229f, +0.013538f, -0.002371f, -0.000321f, +0.000499f, -0.000103f, -0.000104f, +0.000448f, -0.000007f, +0.000411f, + +0.000027f, +0.000551f, -0.000316f, +0.000285f, -0.000778f, -0.000347f, +0.001231f, +0.000127f, +0.000473f, -0.000624f, + +0.001014f, +0.000145f, -0.000476f, -0.000525f, -0.001310f, -0.000969f, -0.000349f, -0.000152f, +0.000148f, -0.000005f, + +0.000647f, +0.000286f, -0.000094f, -0.000139f, +0.000578f, +0.000103f, -0.000298f, +0.000250f, -0.000481f, +0.000503f, + +0.000101f, -0.000088f, -0.000174f, +0.000002f, +0.000318f, +0.000019f, -0.000431f, +0.000049f, +0.000034f, +0.000296f, + +0.000265f, +0.000019f, -0.000125f, +0.000176f, -0.000016f, -0.000276f, +0.000049f, -0.000269f, +0.000139f, +0.000252f, + +0.000053f, +0.000202f, -0.000064f, -0.000062f, +0.000098f, +0.000096f, -0.000067f, +0.000000f, +0.000092f, -0.000085f, + -0.000096f, +0.000031f, -0.000058f, +0.000096f, +0.000046f, +0.000000f, -0.000027f, +0.000087f, +0.000021f, -0.000048f, + +0.000003f, +0.000097f, +0.000082f, +0.000016f, -0.000068f, -0.000039f, +0.000018f, +0.000005f, -0.000018f, -0.000058f, + +0.000080f, -0.000020f, -0.000009f, -0.000016f, -0.000049f, +0.000005f + }, + { + +0.001743f, -0.020879f, +0.006169f, -0.000164f, -0.000423f, +0.000445f, -0.000261f, -0.000070f, -0.000078f, +0.000364f, + -0.000564f, +0.000003f, -0.000430f, -0.000522f, +0.000209f, -0.000902f, +0.000170f, -0.000356f, -0.001053f, -0.000593f, + +0.000144f, +0.000303f, +0.000542f, +0.000545f, -0.000159f, -0.000290f, -0.000477f, +0.000227f, -0.000039f, -0.000520f, + -0.000075f, -0.000632f, -0.000290f, -0.000098f, +0.000139f, -0.000089f, -0.000424f, -0.000211f, -0.000035f, +0.000199f, + +0.000429f, +0.000063f, -0.000392f, +0.000026f, +0.000168f, -0.000329f, -0.000081f, -0.000335f, -0.000018f, +0.000071f, + +0.000321f, +0.000276f, +0.000036f, -0.000097f, -0.000139f, -0.000288f, +0.000065f, +0.000039f, +0.000142f, +0.000038f, + +0.000142f, -0.000119f, +0.000035f, +0.000040f, -0.000150f, +0.000013f, +0.000092f, +0.000041f, +0.000018f, -0.000069f, + -0.000025f, -0.000083f, +0.000074f, +0.000048f, -0.000137f, +0.000112f, -0.000050f, -0.000053f, +0.000017f, +0.000070f, + +0.000061f, -0.000052f, +0.000047f, +0.000039f, -0.000000f, -0.000137f, +0.000100f, -0.000018f, +0.000017f, -0.000009f, + +0.000003f, +0.000023f, +0.000045f, -0.000046f, -0.000002f, -0.000025f + }, + { + +0.001485f, -0.001345f, -0.011872f, -0.000003f, -0.001341f, -0.000512f, +0.000340f, -0.000522f, +0.000110f, -0.000631f, + -0.000459f, +0.000301f, -0.000233f, +0.000106f, -0.000729f, -0.000445f, +0.000081f, +0.000281f, +0.001188f, +0.000122f, + -0.000292f, +0.000065f, +0.000044f, +0.000062f, +0.000441f, -0.000328f, -0.000268f, -0.000572f, -0.000338f, -0.000229f, + +0.000218f, -0.000275f, -0.000246f, -0.000652f, -0.000598f, -0.000175f, +0.000022f, -0.000245f, -0.000090f, -0.000510f, + +0.000084f, -0.000043f, +0.000070f, +0.000127f, -0.000120f, -0.000325f, +0.000270f, +0.000135f, +0.000239f, -0.000285f, + -0.000266f, +0.000069f, +0.000125f, +0.000049f, +0.000041f, +0.000007f, +0.000050f, -0.000099f, -0.000107f, +0.000022f, + +0.000078f, +0.000058f, +0.000014f, -0.000100f, +0.000122f, +0.000024f, -0.000017f, +0.000016f, +0.000061f, +0.000110f, + -0.000002f, +0.000002f, +0.000009f, -0.000027f, -0.000029f, -0.000017f, -0.000051f, +0.000020f, -0.000059f, +0.000030f, + +0.000026f, +0.000024f, +0.000075f, -0.000055f, -0.000064f, +0.000027f, -0.000037f, -0.000009f, +0.000034f, -0.000018f, + +0.000051f, -0.000006f, +0.000030f, -0.000027f, -0.000017f, +0.000025f + }, + { + -0.000448f, +0.003984f, +0.002468f, +0.000983f, -0.000217f, -0.000104f, +0.000069f, +0.000025f, -0.000131f, -0.000022f, + -0.000223f, -0.000530f, +0.000400f, +0.000340f, -0.003395f, +0.002013f, +0.002317f, +0.000015f, -0.003067f, +0.000881f, + -0.000829f, -0.000674f, +0.000110f, -0.000874f, +0.000566f, -0.000600f, +0.001744f, +0.000528f, -0.000647f, -0.000810f, + -0.000309f, -0.000623f, +0.000044f, -0.000275f, +0.000418f, +0.000427f, -0.000703f, -0.000006f, +0.000400f, -0.000536f, + +0.000183f, +0.000242f, -0.000150f, +0.000027f, -0.000301f, +0.000527f, +0.000196f, -0.000047f, +0.000334f, +0.000060f, + -0.000199f, +0.000085f, +0.000072f, -0.000107f, +0.000153f, -0.000108f, -0.000081f, +0.000301f, -0.000086f, -0.000206f, + -0.000062f, +0.000079f, -0.000039f, +0.000017f, -0.000036f, -0.000027f, -0.000035f, +0.000034f, +0.000006f, -0.000091f, + -0.000089f, +0.000070f, +0.000056f, +0.000010f, -0.000048f, +0.000039f, +0.000070f, +0.000033f, -0.000052f, -0.000033f, + -0.000021f, +0.000071f, -0.000051f, +0.000005f, -0.000023f, -0.000021f, +0.000032f, +0.000044f, +0.000044f, -0.000021f, + -0.000013f, +0.000055f, +0.000031f, -0.000026f, +0.000018f, +0.000017f + }, + { + +0.009309f, -0.036379f, -0.004170f, +0.002567f, +0.000371f, -0.000131f, -0.000784f, +0.000329f, -0.000281f, -0.000215f, + +0.000937f, -0.000226f, +0.000377f, +0.000551f, +0.000127f, +0.000274f, -0.000398f, -0.000729f, +0.000204f, +0.000012f, + +0.000350f, -0.000276f, +0.000015f, -0.000648f, +0.000184f, -0.000289f, +0.000308f, -0.000866f, +0.001504f, -0.000851f, + +0.000287f, -0.000090f, +0.000343f, -0.000336f, -0.000441f, -0.000009f, -0.000372f, +0.000300f, +0.000242f, -0.000341f, + +0.000329f, -0.000231f, +0.000111f, -0.000166f, +0.000086f, +0.000314f, -0.000237f, -0.000061f, +0.000215f, -0.000043f, + +0.000167f, +0.000320f, -0.000210f, -0.000117f, -0.000112f, +0.000042f, -0.000214f, -0.000184f, +0.000171f, +0.000205f, + +0.000122f, -0.000034f, +0.000084f, -0.000185f, -0.000171f, +0.000021f, -0.000091f, +0.000065f, +0.000089f, +0.000013f, + -0.000076f, -0.000085f, -0.000097f, +0.000111f, +0.000068f, -0.000068f, +0.000112f, -0.000071f, +0.000021f, +0.000079f, + +0.000043f, +0.000008f, +0.000031f, -0.000111f, -0.000048f, +0.000041f, +0.000003f, -0.000003f, -0.000055f, +0.000009f, + -0.000014f, -0.000003f, -0.000022f, -0.000016f, +0.000033f, +0.000033f + }, + { + +0.000216f, +0.002179f, -0.001067f, -0.000791f, +0.000040f, +0.000036f, +0.000184f, +0.000102f, +0.000073f, +0.000039f, + -0.000507f, -0.000280f, -0.000274f, -0.001338f, +0.000548f, +0.000994f, -0.000504f, -0.000328f, +0.000710f, +0.000847f, + -0.002074f, +0.000024f, +0.000654f, +0.000341f, +0.000888f, +0.000371f, +0.001039f, -0.000050f, +0.000415f, +0.001791f, + +0.000306f, -0.000355f, -0.000136f, +0.000146f, +0.000044f, +0.000384f, -0.000021f, -0.000203f, -0.000176f, -0.000323f, + +0.000619f, -0.000198f, +0.000093f, +0.000069f, -0.000025f, +0.000010f, -0.000325f, -0.000042f, +0.000042f, +0.000130f, + +0.000300f, -0.000005f, -0.000044f, +0.000051f, +0.000174f, +0.000068f, -0.000060f, +0.000168f, -0.000019f, -0.000083f, + +0.000049f, +0.000094f, +0.000075f, +0.000015f, +0.000073f, -0.000082f, -0.000084f, -0.000080f, -0.000022f, -0.000017f, + +0.000106f, +0.000062f, -0.000087f, +0.000004f, +0.000046f, +0.000050f, +0.000066f, -0.000045f, -0.000076f, -0.000067f, + +0.000059f, -0.000018f, -0.000074f, -0.000005f, +0.000054f, -0.000006f, -0.000011f, +0.000001f, +0.000014f, -0.000021f, + -0.000057f, +0.000034f, +0.000082f, -0.000023f, -0.000012f, -0.000027f + }, + { + -0.006717f, -0.033473f, +0.004251f, -0.000709f, -0.000772f, +0.000037f, +0.000575f, -0.000515f, -0.000620f, +0.000312f, + +0.000111f, -0.000258f, +0.000428f, +0.000676f, +0.000253f, +0.000320f, +0.000151f, +0.000363f, -0.000806f, -0.000107f, + +0.000260f, +0.000265f, -0.000409f, -0.000147f, -0.000243f, -0.000220f, -0.000042f, +0.000070f, +0.000125f, -0.000187f, + +0.000111f, +0.000687f, +0.000099f, -0.000169f, +0.000160f, -0.000075f, +0.000522f, +0.000390f, -0.000362f, -0.000004f, + -0.000031f, -0.000387f, -0.000320f, +0.000358f, -0.000154f, -0.000080f, -0.000238f, +0.000074f, +0.000357f, -0.000272f, + +0.000207f, -0.000021f, +0.000017f, +0.000031f, +0.000071f, +0.000157f, -0.000037f, +0.000270f, +0.000095f, -0.000018f, + -0.000011f, -0.000055f, -0.000022f, -0.000031f, +0.000065f, +0.000116f, +0.000050f, -0.000113f, -0.000019f, +0.000026f, + -0.000113f, +0.000066f, +0.000147f, -0.000043f, -0.000099f, +0.000001f, +0.000070f, -0.000017f, +0.000013f, +0.000052f, + -0.000097f, +0.000027f, +0.000041f, -0.000036f, -0.000084f, +0.000105f, +0.000032f, -0.000050f, -0.000024f, +0.000005f, + +0.000047f, -0.000063f, -0.000036f, -0.000026f, -0.000000f, +0.000012f + }, + { + +0.000147f, +0.001391f, -0.002438f, -0.000138f, -0.000284f, -0.000093f, +0.000033f, -0.000005f, +0.000180f, -0.000233f, + -0.000406f, -0.000282f, +0.000277f, -0.001042f, +0.000345f, +0.000531f, +0.000871f, +0.000227f, +0.000056f, -0.000745f, + -0.000061f, +0.000004f, -0.000842f, +0.000543f, +0.000153f, +0.000846f, +0.000094f, -0.000185f, -0.001207f, -0.000467f, + +0.000036f, -0.000040f, +0.000509f, -0.000152f, -0.000195f, +0.000861f, +0.000086f, -0.000312f, +0.000034f, +0.000071f, + -0.000249f, +0.000227f, -0.000210f, -0.000153f, +0.000179f, +0.000112f, +0.000317f, -0.000234f, -0.000020f, +0.000421f, + +0.000140f, -0.000000f, +0.000122f, +0.000087f, -0.000126f, -0.000040f, +0.000070f, -0.000144f, -0.000093f, +0.000247f, + +0.000095f, +0.000155f, -0.000010f, -0.000030f, +0.000000f, -0.000045f, +0.000189f, +0.000038f, -0.000043f, -0.000102f, + -0.000006f, -0.000057f, -0.000043f, +0.000105f, +0.000003f, +0.000011f, +0.000057f, +0.000048f, -0.000024f, +0.000036f, + -0.000098f, -0.000061f, -0.000028f, +0.000039f, +0.000059f, -0.000020f, +0.000039f, -0.000043f, +0.000002f, +0.000046f, + -0.000061f, +0.000015f, +0.000033f, -0.000021f, +0.000014f, -0.000003f + }, + { + +0.017198f, +0.004072f, -0.002279f, -0.000804f, -0.000005f, -0.000023f, +0.000107f, -0.000759f, +0.000653f, +0.000437f, + -0.001290f, -0.000368f, -0.000867f, +0.001236f, -0.001081f, +0.000600f, +0.000924f, -0.000465f, -0.000490f, +0.000619f, + +0.000240f, -0.000115f, -0.000593f, -0.000292f, -0.000557f, +0.000397f, -0.000235f, -0.000502f, +0.000082f, -0.000034f, + +0.000187f, -0.000258f, +0.000012f, -0.000232f, -0.000148f, -0.000500f, -0.000580f, +0.000230f, +0.000190f, -0.000686f, + -0.000252f, +0.000207f, +0.000269f, +0.000039f, +0.000133f, +0.000232f, -0.000105f, -0.000320f, -0.000002f, +0.000014f, + +0.000045f, -0.000268f, -0.000321f, -0.000104f, -0.000179f, -0.000183f, +0.000077f, -0.000055f, -0.000245f, +0.000028f, + -0.000016f, -0.000055f, -0.000056f, -0.000112f, -0.000268f, +0.000177f, +0.000201f, -0.000102f, +0.000039f, +0.000054f, + -0.000043f, -0.000045f, +0.000103f, -0.000008f, -0.000002f, -0.000126f, +0.000066f, +0.000019f, -0.000001f, -0.000015f, + +0.000011f, -0.000048f, +0.000009f, -0.000016f, -0.000050f, +0.000029f, +0.000053f, +0.000035f, +0.000025f, -0.000027f, + -0.000041f, +0.000014f, -0.000014f, +0.000058f, -0.000030f, -0.000009f + }, + { + +0.000249f, -0.002353f, +0.003656f, +0.000221f, +0.000216f, +0.001338f, -0.000103f, -0.000628f, +0.000121f, -0.000117f, + -0.000371f, -0.000227f, +0.000626f, +0.001338f, -0.000237f, -0.000269f, -0.000496f, +0.001028f, +0.001343f, -0.001390f, + -0.000720f, -0.000239f, +0.000442f, +0.000924f, -0.000024f, -0.000476f, +0.000669f, +0.000004f, -0.000551f, +0.000237f, + -0.001087f, +0.000003f, +0.000475f, +0.000030f, +0.000054f, +0.000092f, +0.000595f, -0.000137f, -0.000278f, -0.000235f, + +0.000022f, +0.000034f, -0.000077f, -0.000167f, +0.000543f, -0.000308f, +0.000030f, -0.000166f, -0.000161f, +0.000144f, + +0.000095f, -0.000058f, +0.000036f, -0.000178f, -0.000327f, +0.000080f, +0.000108f, -0.000027f, +0.000046f, +0.000030f, + -0.000035f, -0.000041f, -0.000132f, +0.000001f, -0.000078f, +0.000089f, +0.000174f, +0.000134f, +0.000120f, -0.000193f, + -0.000027f, -0.000039f, -0.000067f, +0.000066f, -0.000026f, -0.000033f, -0.000026f, -0.000012f, -0.000017f, -0.000067f, + +0.000001f, +0.000048f, +0.000044f, +0.000010f, +0.000042f, -0.000010f, -0.000054f, +0.000020f, -0.000018f, +0.000050f, + -0.000032f, +0.000001f, -0.000007f, +0.000017f, +0.000035f, -0.000027f + }, + { + +0.003346f, -0.001845f, -0.003569f, -0.001860f, +0.000656f, -0.000157f, -0.000669f, -0.000964f, +0.000236f, +0.000508f, + -0.000154f, -0.000118f, +0.000077f, +0.000467f, -0.000767f, +0.000274f, -0.000453f, +0.000142f, -0.000353f, +0.000366f, + -0.000339f, +0.000749f, -0.000036f, -0.000017f, -0.000186f, +0.000219f, -0.000054f, -0.000137f, +0.000086f, +0.000312f, + -0.000260f, -0.000624f, -0.000024f, +0.000386f, -0.000302f, -0.000750f, +0.000272f, -0.000108f, +0.000010f, +0.000258f, + +0.000336f, -0.000350f, -0.000111f, -0.000102f, +0.000124f, +0.000063f, -0.000089f, +0.000030f, -0.000135f, -0.000002f, + -0.000020f, -0.000052f, +0.000032f, -0.000276f, +0.000057f, -0.000011f, +0.000016f, +0.000175f, -0.000101f, -0.000085f, + -0.000055f, +0.000008f, -0.000034f, +0.000054f, +0.000160f, -0.000068f, -0.000024f, -0.000057f, +0.000044f, +0.000031f, + -0.000019f, +0.000039f, +0.000096f, +0.000080f, -0.000040f, +0.000034f, -0.000056f, -0.000112f, +0.000032f, -0.000046f, + +0.000042f, +0.000027f, -0.000090f, +0.000110f, -0.000031f, +0.000084f, -0.000017f, -0.000001f, -0.000042f, -0.000004f, + +0.000035f, -0.000017f, -0.000055f, -0.000002f, +0.000073f, -0.000008f + }, + { + -0.000104f, -0.003911f, +0.000155f, -0.000780f, +0.000339f, -0.000525f, -0.000232f, +0.000000f, +0.000333f, -0.000420f, + -0.000175f, -0.000414f, -0.000089f, +0.001261f, -0.000980f, -0.000855f, -0.000431f, +0.000633f, -0.000942f, +0.000067f, + -0.000634f, +0.002345f, +0.000075f, +0.000737f, -0.000846f, -0.000559f, +0.000040f, +0.000102f, -0.000359f, +0.000301f, + -0.000240f, +0.000404f, -0.000353f, +0.000393f, -0.000356f, -0.000151f, -0.000155f, +0.000466f, -0.000364f, +0.000209f, + -0.000117f, -0.000134f, +0.000535f, -0.000024f, -0.000132f, +0.000235f, -0.000162f, +0.000256f, -0.000003f, +0.000160f, + -0.000015f, -0.000118f, +0.000163f, -0.000074f, -0.000008f, -0.000126f, -0.000089f, -0.000020f, +0.000165f, -0.000028f, + +0.000181f, +0.000026f, -0.000160f, -0.000092f, +0.000063f, +0.000269f, -0.000100f, +0.000052f, +0.000027f, +0.000058f, + +0.000029f, +0.000005f, +0.000049f, +0.000043f, +0.000018f, +0.000029f, -0.000025f, -0.000088f, +0.000008f, -0.000041f, + +0.000057f, -0.000024f, -0.000051f, +0.000019f, +0.000034f, -0.000013f, -0.000026f, +0.000033f, +0.000025f, +0.000016f, + +0.000041f, +0.000018f, -0.000028f, -0.000019f, +0.000042f, +0.000011f + }, + { + -0.002735f, +0.008645f, +0.000164f, -0.000153f, -0.000226f, -0.000459f, -0.002835f, +0.000043f, +0.000120f, +0.000802f, + +0.000350f, -0.000243f, +0.000330f, +0.001681f, -0.000194f, -0.000511f, +0.000592f, +0.000357f, -0.000098f, +0.000804f, + -0.000341f, -0.000157f, -0.000241f, -0.000113f, -0.000194f, +0.000853f, -0.000156f, +0.000233f, +0.000237f, -0.000286f, + -0.000263f, -0.000228f, -0.000276f, -0.000080f, +0.000546f, +0.000193f, -0.000422f, -0.000069f, +0.000449f, -0.000269f, + -0.000389f, -0.000312f, -0.000016f, -0.000320f, -0.000162f, -0.000148f, -0.000114f, -0.000349f, +0.000123f, +0.000210f, + +0.000341f, +0.000152f, -0.000164f, +0.000228f, -0.000103f, -0.000061f, +0.000008f, -0.000155f, -0.000116f, +0.000240f, + +0.000049f, -0.000077f, +0.000001f, +0.000112f, -0.000150f, -0.000128f, -0.000066f, +0.000016f, +0.000132f, -0.000010f, + -0.000159f, +0.000032f, +0.000145f, +0.000039f, -0.000003f, +0.000010f, -0.000042f, +0.000122f, +0.000012f, +0.000058f, + -0.000116f, -0.000021f, +0.000039f, +0.000094f, +0.000020f, -0.000123f, -0.000067f, +0.000012f, -0.000038f, +0.000001f, + +0.000020f, +0.000004f, +0.000057f, -0.000004f, +0.000033f, +0.000015f + }, + { + +0.000379f, +0.000584f, +0.001049f, +0.000121f, -0.000118f, -0.000125f, -0.000238f, +0.000496f, -0.000766f, -0.000582f, + +0.000116f, +0.000023f, +0.001436f, -0.003926f, +0.002176f, -0.003458f, +0.000891f, +0.000633f, -0.000018f, -0.000760f, + +0.000106f, -0.000012f, +0.000292f, +0.000963f, -0.000415f, +0.001043f, -0.000281f, +0.000040f, +0.001111f, -0.000413f, + +0.000167f, +0.000034f, +0.000057f, +0.000242f, -0.000429f, +0.000260f, +0.000115f, -0.000125f, +0.000299f, +0.000009f, + +0.000173f, +0.000111f, +0.000094f, +0.000271f, +0.000049f, -0.000210f, +0.000185f, -0.000169f, +0.000054f, -0.000167f, + +0.000249f, -0.000083f, -0.000235f, -0.000229f, +0.000012f, -0.000063f, -0.000057f, +0.000074f, +0.000015f, +0.000016f, + +0.000214f, -0.000101f, -0.000137f, +0.000030f, +0.000071f, -0.000176f, +0.000081f, +0.000164f, -0.000072f, -0.000025f, + -0.000062f, +0.000000f, +0.000083f, -0.000044f, -0.000001f, +0.000055f, -0.000136f, +0.000089f, +0.000030f, +0.000056f, + +0.000060f, -0.000103f, -0.000045f, -0.000005f, -0.000074f, +0.000003f, +0.000035f, +0.000098f, -0.000059f, +0.000029f, + +0.000070f, +0.000002f, -0.000060f, +0.000034f, +0.000033f, -0.000074f + }, + { + -0.000086f, -0.002190f, +0.001986f, +0.000874f, +0.001411f, +0.003695f, -0.000407f, +0.000610f, -0.000257f, -0.000715f, + -0.000645f, -0.000495f, +0.000019f, -0.000100f, +0.006653f, +0.000461f, -0.000928f, +0.000823f, +0.000222f, -0.000380f, + -0.000210f, +0.000584f, +0.000189f, +0.000286f, -0.000465f, -0.000481f, +0.000022f, +0.002561f, +0.000503f, +0.000074f, + +0.000073f, +0.000142f, +0.000029f, -0.000022f, -0.000110f, +0.000039f, -0.000063f, +0.000093f, -0.000097f, +0.000418f, + +0.000445f, +0.000068f, -0.000177f, -0.000082f, +0.000315f, -0.000289f, -0.000145f, +0.000195f, +0.000124f, -0.000174f, + -0.000040f, +0.000058f, +0.000074f, -0.000128f, +0.000011f, -0.000254f, -0.000251f, +0.000029f, -0.000009f, +0.000157f, + -0.000024f, -0.000117f, +0.000041f, +0.000034f, +0.000023f, -0.000020f, +0.000056f, +0.000025f, -0.000092f, +0.000001f, + -0.000111f, -0.000027f, +0.000125f, +0.000120f, -0.000077f, -0.000102f, -0.000045f, +0.000069f, -0.000051f, -0.000032f, + +0.000043f, +0.000086f, -0.000013f, -0.000020f, +0.000037f, +0.000004f, -0.000019f, +0.000079f, -0.000090f, -0.000025f, + +0.000011f, -0.000031f, +0.000034f, +0.000043f, +0.000032f, -0.000011f + } + }, + { + { + -0.000246f, +0.011429f, -0.001860f, -0.000462f, -0.000113f, +0.000243f, -0.000324f, -0.000341f, +0.000277f, +0.000164f, + +0.000250f, -0.000368f, +0.000065f, -0.000116f, -0.003640f, -0.000755f, -0.000615f, +0.000129f, +0.001102f, -0.000257f, + -0.000061f, -0.000294f, +0.000278f, +0.000252f, -0.000714f, +0.000317f, +0.000535f, +0.000505f, +0.000600f, -0.000201f, + +0.000514f, -0.001001f, +0.001118f, -0.000112f, -0.000365f, -0.000583f, -0.000199f, +0.000902f, -0.000538f, +0.000113f, + -0.000239f, +0.000202f, -0.000031f, -0.000241f, -0.000047f, +0.000355f, -0.000031f, -0.000042f, -0.000086f, +0.000041f, + +0.000175f, +0.000214f, +0.000027f, -0.000050f, +0.000201f, +0.000095f, -0.000018f, -0.000022f, -0.000116f, -0.000058f, + -0.000135f, +0.000110f, +0.000184f, -0.000020f, -0.000030f, +0.000086f, +0.000114f, -0.000025f, -0.000053f, +0.000110f, + +0.000014f, -0.000029f, +0.000019f, -0.000068f, +0.000031f, +0.000020f, +0.000022f, -0.000055f, +0.000000f, +0.000032f, + -0.000020f, -0.000037f, -0.000019f, +0.000049f, +0.000075f, +0.000035f, -0.000040f, -0.000027f, +0.000014f, -0.000004f, + -0.000064f, +0.000041f, -0.000027f, +0.000039f, +0.000009f, -0.000028f + }, + { + -0.000097f, -0.026372f, +0.000968f, +0.000760f, -0.000786f, -0.000392f, +0.000697f, -0.000050f, -0.000931f, +0.000571f, + -0.000218f, -0.000220f, +0.000430f, +0.000089f, +0.002192f, +0.000841f, -0.000348f, +0.000233f, +0.001167f, -0.000396f, + +0.000020f, -0.000366f, -0.000446f, -0.000136f, -0.000373f, +0.000181f, -0.000213f, -0.000229f, -0.000223f, -0.000253f, + +0.000214f, -0.000204f, +0.000475f, +0.000093f, -0.000411f, +0.000173f, -0.000014f, +0.000202f, +0.000329f, -0.000113f, + -0.000535f, -0.000080f, -0.000041f, +0.000147f, -0.000075f, +0.000277f, -0.000450f, +0.000110f, -0.000286f, -0.000220f, + +0.000207f, -0.000249f, +0.000151f, +0.000065f, +0.000035f, +0.000053f, -0.000176f, +0.000181f, +0.000081f, +0.000005f, + +0.000059f, +0.000035f, +0.000068f, +0.000181f, -0.000005f, -0.000070f, -0.000080f, -0.000011f, +0.000038f, +0.000166f, + +0.000040f, -0.000002f, -0.000101f, +0.000028f, +0.000026f, -0.000159f, +0.000068f, +0.000024f, -0.000032f, -0.000079f, + +0.000019f, +0.000050f, -0.000049f, -0.000012f, +0.000065f, +0.000080f, -0.000155f, +0.000074f, -0.000020f, +0.000032f, + +0.000013f, -0.000027f, -0.000012f, +0.000034f, -0.000025f, +0.000015f + }, + { + -0.000862f, +0.018445f, +0.001382f, -0.000788f, +0.002292f, +0.000457f, +0.000120f, -0.000092f, +0.000106f, -0.000165f, + -0.000718f, +0.000133f, -0.000088f, +0.000283f, +0.000046f, +0.000074f, -0.000063f, -0.000563f, +0.001213f, +0.000537f, + +0.000638f, +0.000100f, +0.000432f, -0.000176f, -0.000548f, -0.000287f, +0.000298f, +0.000195f, +0.000080f, -0.000356f, + -0.000246f, -0.000314f, +0.000023f, +0.000479f, -0.000085f, -0.000094f, +0.000345f, -0.000315f, -0.000006f, -0.000110f, + -0.000118f, +0.000276f, -0.000049f, +0.000168f, +0.000353f, +0.000215f, -0.000242f, -0.000438f, -0.000021f, +0.000276f, + +0.000177f, -0.000177f, -0.000201f, +0.000081f, +0.000053f, -0.000197f, -0.000048f, +0.000204f, +0.000029f, -0.000027f, + -0.000178f, -0.000076f, +0.000246f, +0.000044f, -0.000060f, +0.000085f, -0.000037f, +0.000101f, -0.000066f, +0.000021f, + +0.000093f, +0.000015f, +0.000010f, -0.000009f, +0.000076f, -0.000039f, -0.000022f, +0.000011f, -0.000011f, -0.000038f, + -0.000052f, -0.000004f, +0.000015f, +0.000119f, -0.000035f, -0.000039f, +0.000040f, -0.000038f, -0.000004f, -0.000000f, + -0.000067f, +0.000009f, -0.000013f, +0.000048f, -0.000004f, -0.000006f + }, + { + +0.000635f, +0.002119f, -0.001450f, +0.000042f, +0.000276f, -0.000091f, -0.000124f, +0.000136f, +0.000157f, +0.000100f, + -0.000059f, -0.000117f, +0.000059f, -0.000476f, -0.006312f, -0.002384f, -0.001440f, -0.000439f, -0.002324f, -0.000538f, + +0.000410f, +0.000364f, +0.000577f, +0.000028f, +0.000224f, -0.001232f, -0.000460f, +0.000907f, +0.000311f, -0.000357f, + -0.000278f, -0.000369f, +0.000453f, -0.000118f, -0.000059f, -0.000724f, +0.000317f, -0.000011f, -0.000047f, +0.000160f, + +0.000044f, +0.000146f, +0.000096f, +0.000352f, -0.000400f, -0.000117f, +0.000324f, -0.000037f, -0.000039f, +0.000121f, + +0.000137f, -0.000239f, +0.000061f, -0.000080f, +0.000017f, +0.000197f, +0.000030f, +0.000018f, +0.000200f, -0.000005f, + -0.000131f, -0.000029f, +0.000073f, -0.000164f, -0.000092f, +0.000102f, +0.000016f, -0.000002f, -0.000010f, +0.000112f, + +0.000083f, -0.000133f, -0.000082f, -0.000017f, +0.000085f, -0.000105f, -0.000024f, +0.000037f, +0.000089f, +0.000023f, + -0.000036f, -0.000044f, +0.000049f, -0.000021f, +0.000051f, +0.000011f, -0.000084f, -0.000025f, +0.000032f, +0.000040f, + -0.000042f, -0.000053f, +0.000025f, +0.000037f, -0.000013f, +0.000021f + }, + { + -0.004432f, -0.047551f, +0.000831f, +0.001666f, -0.000346f, +0.000080f, -0.000353f, +0.000467f, +0.000186f, -0.000495f, + -0.000271f, +0.000800f, -0.000102f, -0.000952f, -0.000133f, -0.000422f, +0.000649f, -0.000331f, -0.000157f, +0.000028f, + -0.000204f, -0.000019f, +0.000354f, +0.000078f, -0.000979f, +0.000279f, +0.000251f, -0.001983f, +0.000349f, -0.000685f, + -0.000063f, -0.000173f, -0.000051f, +0.000097f, +0.000170f, +0.000374f, +0.000768f, -0.000632f, -0.000405f, +0.000271f, + +0.000093f, -0.000365f, -0.000127f, +0.000191f, -0.000212f, -0.000247f, +0.000119f, -0.000104f, -0.000107f, +0.000129f, + +0.000001f, -0.000028f, +0.000306f, -0.000008f, -0.000069f, -0.000055f, +0.000271f, -0.000068f, -0.000062f, -0.000191f, + +0.000179f, +0.000008f, +0.000064f, +0.000066f, -0.000011f, -0.000039f, +0.000052f, -0.000018f, -0.000041f, +0.000035f, + +0.000037f, +0.000062f, -0.000064f, -0.000129f, +0.000027f, +0.000025f, -0.000020f, +0.000131f, -0.000021f, +0.000019f, + +0.000042f, +0.000032f, -0.000019f, +0.000077f, -0.000068f, -0.000033f, +0.000025f, +0.000045f, +0.000026f, -0.000065f, + +0.000027f, +0.000009f, -0.000010f, -0.000001f, -0.000060f, -0.000002f + }, + { + -0.000503f, -0.000235f, +0.001978f, -0.000042f, +0.000035f, -0.000137f, -0.000126f, +0.000157f, -0.000033f, +0.000178f, + +0.000046f, -0.000131f, +0.000676f, -0.000174f, -0.000777f, +0.000218f, +0.002069f, -0.000984f, -0.000579f, +0.002381f, + -0.000193f, -0.000145f, -0.000900f, +0.000308f, +0.000623f, -0.001699f, +0.000629f, +0.000341f, -0.001111f, +0.000948f, + +0.000386f, +0.000203f, -0.000232f, +0.000029f, -0.000042f, +0.000066f, -0.000274f, +0.000319f, +0.000390f, -0.000207f, + -0.000227f, +0.000312f, +0.000048f, -0.000177f, +0.000127f, +0.000148f, +0.000219f, +0.000049f, -0.000006f, -0.000172f, + +0.000026f, +0.000027f, +0.000161f, -0.000122f, -0.000013f, +0.000198f, -0.000052f, +0.000014f, +0.000087f, -0.000002f, + +0.000070f, +0.000008f, +0.000127f, +0.000071f, -0.000051f, +0.000033f, +0.000012f, -0.000085f, -0.000009f, -0.000043f, + -0.000184f, +0.000029f, +0.000076f, +0.000007f, -0.000046f, +0.000016f, +0.000004f, +0.000055f, +0.000055f, +0.000031f, + -0.000079f, +0.000090f, -0.000013f, -0.000010f, -0.000069f, -0.000004f, +0.000019f, -0.000006f, -0.000012f, +0.000034f, + +0.000017f, -0.000061f, -0.000024f, +0.000043f, +0.000020f, +0.000018f + }, + { + +0.013512f, -0.014431f, -0.004021f, +0.000840f, -0.000167f, +0.000352f, +0.000414f, +0.000268f, +0.000367f, +0.000183f, + -0.000119f, +0.000093f, +0.000061f, +0.000306f, -0.000561f, +0.001177f, -0.000134f, +0.000366f, +0.000835f, -0.000468f, + -0.000160f, -0.000438f, -0.000454f, -0.000084f, +0.000228f, +0.000105f, -0.000290f, +0.001034f, +0.000426f, -0.000271f, + -0.000370f, +0.000336f, +0.000095f, -0.000529f, +0.000341f, -0.000047f, +0.000361f, +0.000533f, -0.000033f, +0.000038f, + -0.000037f, +0.000012f, -0.000035f, +0.000099f, +0.000039f, -0.000092f, +0.000196f, -0.000201f, +0.000057f, -0.000082f, + -0.000126f, +0.000148f, -0.000275f, +0.000013f, -0.000180f, -0.000078f, -0.000111f, +0.000054f, -0.000011f, +0.000055f, + +0.000100f, -0.000000f, -0.000010f, -0.000028f, -0.000037f, -0.000038f, +0.000053f, +0.000141f, -0.000099f, -0.000018f, + +0.000146f, -0.000086f, -0.000148f, +0.000121f, +0.000057f, -0.000027f, -0.000046f, +0.000054f, -0.000017f, -0.000046f, + +0.000099f, -0.000034f, -0.000045f, +0.000081f, +0.000004f, -0.000121f, +0.000021f, +0.000035f, +0.000035f, -0.000049f, + -0.000028f, +0.000059f, -0.000021f, +0.000020f, -0.000023f, +0.000001f + }, + { + -0.000575f, +0.000003f, +0.001802f, +0.000120f, +0.000282f, -0.000023f, -0.000009f, +0.000110f, -0.000238f, +0.000069f, + +0.000135f, -0.000226f, -0.000653f, -0.000679f, +0.001447f, -0.002377f, -0.000621f, -0.001277f, -0.000320f, +0.000023f, + -0.000497f, -0.001791f, +0.000338f, +0.000476f, -0.000476f, +0.001649f, +0.000129f, +0.000292f, -0.000283f, -0.000161f, + +0.000183f, -0.000336f, -0.000174f, +0.000206f, -0.000305f, +0.000181f, +0.000124f, +0.000080f, -0.000006f, +0.000158f, + -0.000251f, -0.000057f, +0.000084f, +0.000174f, -0.000203f, -0.000109f, -0.000049f, +0.000452f, -0.000362f, -0.000325f, + +0.000163f, +0.000001f, +0.000123f, -0.000127f, +0.000108f, +0.000010f, -0.000044f, +0.000165f, +0.000180f, -0.000134f, + +0.000033f, -0.000048f, +0.000181f, -0.000054f, +0.000094f, -0.000082f, -0.000125f, +0.000004f, +0.000113f, -0.000090f, + +0.000019f, +0.000042f, -0.000025f, -0.000026f, +0.000006f, +0.000053f, -0.000074f, +0.000050f, +0.000068f, +0.000002f, + +0.000083f, -0.000031f, -0.000049f, -0.000025f, -0.000056f, +0.000027f, -0.000010f, +0.000059f, -0.000020f, -0.000016f, + +0.000051f, -0.000025f, +0.000022f, -0.000006f, -0.000001f, +0.000008f + }, + { + -0.015056f, -0.032371f, -0.000311f, -0.001092f, +0.000999f, +0.000066f, +0.000915f, +0.000345f, -0.000919f, +0.000192f, + +0.001145f, -0.000093f, -0.000719f, -0.000799f, -0.000073f, -0.000088f, +0.001318f, -0.000046f, -0.000518f, +0.000635f, + +0.000134f, +0.000389f, -0.001076f, +0.000134f, +0.000248f, +0.000114f, +0.000246f, +0.000460f, +0.000134f, -0.000186f, + -0.000492f, +0.000296f, +0.000236f, +0.000281f, -0.000185f, -0.000081f, -0.000217f, -0.000543f, +0.000033f, -0.000077f, + -0.000337f, +0.000217f, +0.000493f, -0.000346f, -0.000009f, -0.000343f, -0.000189f, +0.000245f, -0.000048f, -0.000112f, + +0.000030f, +0.000339f, -0.000115f, -0.000140f, +0.000198f, +0.000001f, -0.000032f, -0.000078f, +0.000153f, +0.000051f, + -0.000131f, +0.000136f, -0.000020f, +0.000070f, +0.000030f, -0.000186f, -0.000094f, +0.000040f, -0.000013f, -0.000001f, + +0.000067f, -0.000114f, -0.000049f, +0.000009f, -0.000017f, +0.000109f, -0.000150f, +0.000016f, +0.000003f, +0.000050f, + -0.000052f, +0.000024f, -0.000013f, -0.000006f, -0.000008f, -0.000057f, -0.000064f, +0.000012f, +0.000044f, +0.000043f, + +0.000022f, -0.000024f, -0.000000f, -0.000046f, +0.000047f, -0.000005f + }, + { + -0.000289f, -0.004910f, +0.000109f, +0.000650f, -0.000614f, -0.000738f, +0.001617f, -0.000188f, -0.000783f, -0.000709f, + +0.000042f, +0.000645f, -0.000805f, -0.000581f, -0.000719f, +0.000615f, -0.001162f, -0.000676f, +0.000773f, +0.001554f, + -0.000096f, -0.000429f, -0.000768f, -0.000278f, +0.000246f, +0.000122f, -0.000066f, -0.000270f, +0.000069f, +0.000392f, + +0.000354f, -0.000597f, -0.000197f, +0.000132f, +0.000193f, -0.000500f, +0.000060f, +0.000112f, +0.000315f, -0.000033f, + +0.000059f, -0.000037f, +0.000208f, -0.000078f, -0.000283f, +0.000233f, +0.000068f, +0.000212f, -0.000260f, -0.000360f, + +0.000285f, +0.000155f, +0.000040f, +0.000177f, +0.000157f, -0.000384f, -0.000056f, -0.000115f, -0.000060f, +0.000104f, + +0.000096f, -0.000006f, +0.000063f, -0.000126f, -0.000001f, -0.000142f, -0.000109f, +0.000068f, +0.000053f, +0.000138f, + -0.000021f, +0.000024f, +0.000037f, -0.000103f, +0.000024f, +0.000079f, -0.000017f, -0.000034f, +0.000009f, -0.000042f, + -0.000064f, -0.000074f, -0.000012f, +0.000008f, -0.000001f, +0.000061f, +0.000012f, -0.000029f, -0.000005f, -0.000027f, + +0.000051f, -0.000035f, +0.000021f, -0.000005f, -0.000002f, +0.000038f + }, + { + -0.002240f, -0.003118f, +0.003226f, -0.000713f, -0.000255f, -0.002214f, +0.003559f, -0.000310f, -0.001048f, -0.000559f, + +0.000041f, -0.000340f, -0.000072f, -0.000029f, +0.000097f, +0.000485f, -0.000559f, +0.000206f, +0.000116f, +0.000094f, + +0.000233f, -0.000474f, +0.000252f, -0.000225f, +0.000218f, +0.000267f, +0.000054f, -0.000002f, -0.000510f, +0.000191f, + +0.000285f, +0.000416f, -0.000096f, -0.000035f, -0.000105f, +0.000222f, -0.000571f, +0.000038f, -0.000014f, -0.000579f, + +0.000346f, +0.000500f, -0.000138f, +0.000118f, -0.000027f, -0.000240f, -0.000068f, -0.000002f, +0.000274f, -0.000102f, + -0.000059f, -0.000133f, +0.000042f, +0.000130f, +0.000064f, +0.000022f, -0.000200f, -0.000222f, +0.000226f, +0.000002f, + -0.000097f, +0.000043f, +0.000026f, -0.000060f, -0.000061f, +0.000098f, -0.000056f, -0.000017f, -0.000044f, +0.000088f, + -0.000041f, +0.000007f, -0.000057f, +0.000009f, +0.000083f, -0.000024f, +0.000086f, +0.000022f, -0.000066f, +0.000029f, + -0.000049f, -0.000001f, +0.000055f, -0.000091f, +0.000038f, -0.000056f, +0.000079f, -0.000029f, +0.000051f, -0.000005f, + -0.000033f, +0.000034f, +0.000026f, -0.000028f, -0.000043f, +0.000037f + }, + { + +0.000044f, -0.002321f, +0.000066f, -0.000353f, +0.000098f, +0.000576f, -0.000163f, -0.000580f, +0.000050f, -0.000491f, + +0.000125f, +0.000222f, -0.001866f, -0.001184f, +0.001854f, +0.000604f, -0.000981f, -0.000049f, -0.000143f, +0.000774f, + -0.000017f, +0.000871f, +0.000237f, -0.000100f, +0.000677f, +0.000382f, -0.001024f, -0.000254f, -0.000019f, -0.000745f, + +0.001513f, -0.000543f, -0.000057f, +0.000127f, -0.000086f, +0.000056f, -0.000030f, -0.000372f, +0.000224f, +0.000018f, + -0.000005f, -0.000141f, -0.000164f, +0.000008f, -0.000003f, -0.000058f, -0.000113f, -0.000092f, +0.000042f, +0.000133f, + +0.000065f, +0.000066f, -0.000253f, -0.000159f, +0.000131f, +0.000070f, +0.000040f, -0.000049f, -0.000192f, -0.000060f, + -0.000161f, +0.000089f, +0.000030f, +0.000025f, -0.000235f, -0.000116f, +0.000175f, -0.000105f, +0.000087f, -0.000027f, + -0.000055f, +0.000076f, -0.000035f, +0.000039f, +0.000025f, -0.000057f, +0.000073f, +0.000055f, +0.000000f, +0.000032f, + -0.000052f, +0.000031f, +0.000028f, -0.000047f, -0.000002f, +0.000021f, -0.000017f, -0.000044f, -0.000017f, -0.000002f, + -0.000001f, -0.000017f, +0.000025f, +0.000034f, -0.000044f, -0.000001f + }, + { + +0.000856f, +0.016062f, -0.004267f, +0.001610f, -0.000476f, +0.000812f, +0.001615f, +0.000811f, +0.000297f, -0.000727f, + +0.000317f, +0.001000f, -0.000801f, +0.001111f, -0.000201f, +0.000073f, -0.000486f, +0.000067f, +0.000424f, -0.000511f, + +0.001294f, -0.000102f, +0.000282f, -0.000299f, -0.000409f, +0.000696f, +0.000438f, +0.000142f, +0.000151f, +0.000148f, + -0.000560f, +0.000130f, +0.000142f, +0.000156f, -0.000108f, -0.000024f, +0.000043f, -0.000247f, -0.000335f, +0.000436f, + +0.000391f, +0.000087f, -0.000179f, +0.000185f, -0.000385f, -0.000096f, -0.000330f, +0.000120f, -0.000351f, +0.000081f, + +0.000045f, +0.000026f, -0.000024f, -0.000059f, +0.000069f, +0.000155f, +0.000126f, +0.000086f, -0.000050f, -0.000233f, + +0.000082f, -0.000049f, -0.000007f, -0.000025f, -0.000006f, -0.000025f, -0.000057f, -0.000107f, -0.000121f, +0.000096f, + +0.000091f, -0.000109f, -0.000059f, +0.000081f, +0.000079f, +0.000049f, -0.000010f, -0.000047f, +0.000067f, -0.000007f, + +0.000144f, -0.000060f, -0.000070f, -0.000018f, +0.000035f, +0.000116f, -0.000001f, -0.000093f, -0.000018f, -0.000019f, + -0.000040f, -0.000031f, -0.000047f, +0.000062f, -0.000009f, +0.000035f + }, + { + -0.000248f, -0.000372f, -0.001133f, -0.000441f, +0.000024f, -0.000014f, +0.000179f, +0.000141f, -0.000177f, +0.000182f, + -0.000357f, +0.000042f, -0.001149f, -0.004113f, +0.015850f, -0.000588f, +0.001230f, +0.000988f, -0.000700f, -0.000192f, + +0.001001f, +0.000898f, -0.000878f, -0.000165f, +0.000023f, +0.000199f, +0.001379f, -0.000557f, +0.000762f, -0.000042f, + -0.000200f, -0.000205f, -0.000183f, -0.000492f, +0.000278f, +0.000048f, -0.000090f, -0.000145f, -0.000232f, +0.000201f, + -0.000432f, +0.000056f, +0.000119f, +0.000106f, +0.000155f, +0.000074f, -0.000277f, -0.000028f, +0.000032f, +0.000028f, + -0.000170f, +0.000209f, +0.000128f, -0.000094f, -0.000040f, -0.000008f, -0.000111f, -0.000039f, +0.000002f, -0.000091f, + -0.000097f, +0.000274f, +0.000009f, +0.000016f, +0.000056f, +0.000171f, -0.000145f, +0.000031f, +0.000092f, -0.000012f, + +0.000084f, +0.000034f, -0.000073f, +0.000036f, -0.000005f, +0.000058f, +0.000089f, -0.000152f, +0.000044f, -0.000075f, + -0.000031f, +0.000120f, -0.000017f, -0.000020f, +0.000029f, -0.000051f, -0.000061f, -0.000066f, +0.000080f, -0.000072f, + -0.000020f, +0.000075f, +0.000049f, -0.000045f, +0.000002f, +0.000050f + }, + { + +0.001541f, -0.000066f, -0.000753f, -0.001315f, -0.000521f, +0.001376f, -0.000056f, +0.000172f, +0.000410f, +0.000383f, + -0.001235f, +0.000709f, +0.000601f, -0.001925f, +0.003397f, +0.000027f, -0.000427f, -0.000326f, -0.000127f, +0.000658f, + -0.000093f, -0.000024f, -0.000171f, +0.000153f, +0.000296f, -0.000215f, -0.000684f, +0.000811f, -0.000367f, +0.000391f, + -0.000253f, +0.000067f, +0.000450f, -0.000266f, -0.000098f, +0.000111f, +0.000201f, -0.000402f, +0.000093f, +0.000024f, + +0.000152f, +0.000324f, +0.000108f, +0.000030f, +0.000107f, +0.000185f, -0.000392f, -0.000375f, +0.000072f, +0.000055f, + -0.000031f, -0.000057f, +0.000151f, +0.000128f, -0.000142f, -0.000025f, -0.000144f, -0.000089f, +0.000090f, +0.000010f, + -0.000003f, +0.000065f, -0.000026f, -0.000142f, +0.000032f, -0.000021f, -0.000034f, +0.000002f, -0.000021f, +0.000025f, + +0.000043f, +0.000028f, -0.000151f, -0.000012f, +0.000115f, +0.000080f, -0.000035f, -0.000021f, +0.000002f, +0.000043f, + -0.000025f, -0.000024f, +0.000044f, -0.000045f, -0.000019f, +0.000015f, +0.000013f, -0.000035f, +0.000136f, -0.000050f, + -0.000012f, +0.000008f, -0.000044f, +0.000014f, -0.000013f, +0.000011f + } + }, + { + { + -0.000138f, +0.003979f, +0.003569f, +0.000017f, +0.000154f, +0.000122f, -0.000199f, -0.000334f, -0.000006f, +0.000239f, + -0.000135f, -0.000683f, +0.000035f, +0.000782f, -0.004281f, -0.000233f, -0.001368f, +0.000176f, +0.000283f, +0.000614f, + +0.000183f, -0.001036f, -0.000070f, +0.000947f, -0.000720f, +0.000976f, +0.000619f, +0.000299f, +0.000448f, -0.000658f, + +0.000127f, -0.000443f, +0.000660f, +0.000139f, -0.001020f, -0.000269f, +0.000227f, +0.000725f, -0.000081f, +0.000025f, + -0.000195f, +0.000065f, +0.000082f, -0.000102f, -0.000161f, +0.000103f, +0.000269f, +0.000019f, -0.000128f, -0.000057f, + +0.000134f, +0.000185f, +0.000028f, -0.000054f, +0.000024f, +0.000166f, -0.000011f, +0.000145f, -0.000060f, -0.000169f, + -0.000065f, -0.000093f, +0.000138f, +0.000066f, -0.000039f, -0.000009f, +0.000055f, -0.000011f, -0.000118f, +0.000079f, + +0.000086f, +0.000000f, -0.000001f, -0.000078f, -0.000033f, +0.000059f, +0.000019f, -0.000073f, -0.000045f, +0.000020f, + -0.000019f, -0.000066f, -0.000080f, +0.000010f, +0.000060f, +0.000037f, -0.000023f, -0.000013f, -0.000003f, +0.000043f, + -0.000060f, +0.000034f, -0.000006f, +0.000014f, +0.000035f, -0.000005f + }, + { + -0.000459f, -0.031696f, +0.006406f, +0.002130f, -0.000801f, -0.000405f, +0.000921f, +0.000057f, -0.000037f, +0.000105f, + -0.000281f, -0.000399f, +0.000499f, +0.000565f, +0.001848f, +0.001488f, -0.000144f, +0.000138f, +0.001381f, -0.000156f, + +0.000177f, -0.000555f, -0.000233f, -0.000700f, +0.000106f, -0.000084f, -0.000073f, -0.000088f, -0.000253f, -0.000439f, + -0.000173f, +0.000293f, +0.000249f, +0.000296f, -0.000532f, +0.000252f, +0.000315f, +0.000231f, +0.000294f, -0.000120f, + -0.000428f, -0.000347f, +0.000145f, +0.000193f, -0.000157f, +0.000262f, -0.000266f, +0.000114f, +0.000021f, -0.000112f, + -0.000020f, -0.000282f, -0.000118f, +0.000021f, -0.000057f, +0.000222f, -0.000190f, +0.000075f, +0.000058f, +0.000014f, + -0.000072f, +0.000081f, +0.000068f, +0.000087f, +0.000016f, -0.000016f, -0.000060f, -0.000022f, -0.000073f, +0.000126f, + +0.000039f, +0.000063f, -0.000114f, -0.000046f, +0.000133f, -0.000145f, +0.000036f, +0.000067f, -0.000021f, -0.000085f, + -0.000025f, +0.000046f, -0.000036f, -0.000029f, +0.000015f, +0.000149f, -0.000119f, +0.000043f, -0.000011f, +0.000010f, + +0.000003f, -0.000010f, -0.000040f, +0.000037f, -0.000020f, +0.000021f + }, + { + +0.001388f, +0.031439f, -0.005806f, -0.002775f, +0.000525f, +0.000757f, -0.000376f, +0.000142f, -0.000060f, +0.000315f, + -0.000409f, +0.000005f, +0.000616f, -0.000460f, +0.000361f, +0.000302f, +0.000111f, +0.000126f, +0.000408f, +0.000128f, + +0.000990f, -0.000123f, +0.000208f, -0.000023f, -0.001053f, -0.000120f, +0.000121f, +0.000424f, +0.000251f, -0.000068f, + -0.000353f, -0.000130f, +0.000136f, +0.000285f, +0.000134f, -0.000090f, +0.000251f, +0.000039f, -0.000233f, +0.000001f, + -0.000056f, -0.000118f, +0.000103f, -0.000016f, +0.000153f, +0.000346f, -0.000219f, -0.000288f, -0.000256f, +0.000119f, + +0.000275f, +0.000015f, -0.000155f, +0.000035f, +0.000039f, -0.000165f, -0.000158f, +0.000064f, +0.000034f, -0.000003f, + -0.000151f, -0.000139f, +0.000106f, +0.000065f, -0.000146f, +0.000037f, -0.000019f, +0.000033f, -0.000015f, -0.000033f, + +0.000033f, -0.000003f, +0.000020f, +0.000003f, +0.000034f, -0.000031f, +0.000030f, -0.000001f, +0.000034f, -0.000010f, + -0.000026f, -0.000019f, -0.000036f, +0.000089f, +0.000045f, -0.000049f, +0.000058f, +0.000015f, -0.000045f, +0.000018f, + -0.000062f, -0.000007f, -0.000027f, +0.000034f, +0.000000f, -0.000010f + }, + { + -0.000470f, +0.001368f, +0.000466f, -0.000504f, +0.000271f, +0.000150f, -0.000188f, -0.000055f, +0.000207f, +0.000054f, + -0.000011f, +0.000114f, +0.000067f, -0.001117f, -0.007666f, +0.000519f, -0.001474f, -0.002651f, -0.000914f, +0.000310f, + +0.000277f, +0.000356f, +0.000823f, -0.000305f, +0.000241f, +0.000174f, -0.002040f, +0.000928f, +0.000151f, -0.000581f, + +0.000287f, -0.000218f, +0.000170f, -0.000025f, -0.000203f, -0.000759f, +0.000363f, +0.000074f, -0.000404f, +0.000262f, + -0.000096f, +0.000037f, +0.000318f, +0.000119f, +0.000070f, -0.000389f, +0.000007f, +0.000071f, -0.000161f, +0.000101f, + +0.000223f, -0.000161f, -0.000061f, +0.000012f, -0.000144f, +0.000178f, +0.000159f, -0.000061f, +0.000153f, +0.000149f, + -0.000002f, -0.000069f, +0.000087f, -0.000133f, -0.000128f, +0.000090f, +0.000030f, -0.000027f, -0.000059f, +0.000134f, + +0.000138f, -0.000058f, -0.000086f, -0.000006f, +0.000085f, -0.000049f, -0.000069f, -0.000015f, +0.000059f, +0.000046f, + -0.000000f, -0.000078f, +0.000046f, -0.000012f, +0.000029f, +0.000049f, -0.000069f, -0.000028f, -0.000023f, +0.000025f, + -0.000005f, -0.000072f, -0.000020f, +0.000032f, -0.000016f, -0.000014f + }, + { + -0.001590f, -0.049095f, -0.001060f, +0.000989f, +0.000699f, -0.000159f, +0.000284f, +0.000139f, +0.000294f, -0.000003f, + -0.000719f, +0.000294f, +0.000253f, -0.001735f, +0.000286f, -0.000495f, +0.000848f, -0.000508f, +0.000237f, -0.000040f, + -0.000021f, -0.000091f, -0.000005f, +0.000383f, -0.000681f, +0.000180f, +0.000282f, -0.001518f, -0.000543f, -0.000194f, + -0.000521f, -0.000215f, -0.000140f, +0.000263f, +0.000129f, +0.000564f, +0.000933f, -0.000255f, -0.000604f, +0.000478f, + +0.000125f, -0.000127f, -0.000281f, +0.000235f, -0.000059f, -0.000555f, +0.000086f, +0.000111f, -0.000201f, -0.000055f, + -0.000019f, -0.000199f, +0.000244f, +0.000133f, -0.000077f, -0.000087f, +0.000360f, +0.000075f, -0.000092f, -0.000149f, + +0.000106f, +0.000021f, +0.000037f, +0.000020f, +0.000080f, -0.000081f, +0.000062f, -0.000013f, -0.000008f, -0.000011f, + +0.000063f, +0.000088f, +0.000068f, -0.000105f, -0.000030f, +0.000074f, -0.000082f, +0.000096f, -0.000003f, -0.000022f, + +0.000013f, +0.000009f, -0.000024f, +0.000071f, -0.000008f, -0.000046f, +0.000021f, +0.000035f, +0.000050f, -0.000024f, + +0.000030f, +0.000010f, -0.000001f, +0.000019f, -0.000044f, -0.000017f + }, + { + -0.000237f, -0.000756f, +0.000848f, +0.000470f, -0.000019f, -0.000011f, -0.000180f, +0.000025f, -0.000064f, -0.000033f, + +0.000284f, +0.000160f, +0.000631f, -0.000029f, +0.001253f, -0.000239f, +0.000862f, +0.000089f, -0.000547f, +0.003201f, + -0.001123f, +0.000107f, -0.002200f, +0.002446f, +0.000130f, -0.001280f, -0.000177f, +0.000666f, -0.000207f, -0.000861f, + +0.000105f, +0.000689f, +0.000032f, -0.000135f, -0.000055f, -0.000042f, -0.000217f, +0.000210f, +0.000481f, +0.000258f, + -0.000694f, +0.000276f, +0.000087f, -0.000188f, +0.000092f, +0.000063f, +0.000263f, +0.000152f, +0.000015f, -0.000181f, + -0.000181f, +0.000155f, +0.000077f, -0.000012f, -0.000019f, +0.000050f, +0.000042f, -0.000037f, +0.000126f, +0.000004f, + +0.000097f, -0.000006f, +0.000076f, +0.000081f, -0.000026f, +0.000021f, +0.000033f, -0.000030f, +0.000056f, +0.000014f, + -0.000134f, -0.000080f, +0.000076f, +0.000045f, -0.000057f, -0.000066f, -0.000062f, +0.000011f, +0.000058f, +0.000053f, + -0.000077f, +0.000051f, +0.000034f, +0.000018f, -0.000062f, -0.000013f, +0.000020f, -0.000001f, -0.000016f, +0.000007f, + +0.000056f, -0.000033f, -0.000070f, +0.000035f, +0.000014f, +0.000022f + }, + { + -0.015500f, +0.016170f, +0.003602f, +0.001516f, -0.000572f, +0.000211f, -0.000043f, +0.000850f, -0.000143f, +0.000019f, + -0.000088f, +0.000521f, -0.000075f, +0.000296f, -0.000592f, +0.000770f, +0.000044f, +0.000117f, +0.000869f, +0.000059f, + -0.000066f, -0.000437f, -0.000207f, -0.000157f, +0.000294f, -0.000032f, -0.000172f, +0.000894f, +0.000460f, -0.000058f, + -0.000031f, -0.000132f, -0.000252f, -0.000210f, -0.000116f, +0.000166f, +0.000370f, +0.000300f, -0.000002f, -0.000056f, + -0.000026f, -0.000070f, +0.000465f, -0.000199f, +0.000282f, -0.000091f, +0.000211f, +0.000026f, -0.000032f, +0.000020f, + -0.000161f, +0.000073f, -0.000173f, -0.000049f, -0.000088f, -0.000167f, -0.000170f, -0.000079f, -0.000059f, +0.000005f, + +0.000070f, +0.000002f, +0.000002f, -0.000006f, -0.000056f, -0.000099f, -0.000090f, +0.000108f, +0.000003f, -0.000019f, + +0.000166f, -0.000040f, -0.000181f, +0.000046f, +0.000095f, -0.000002f, -0.000084f, +0.000035f, -0.000012f, -0.000041f, + +0.000096f, -0.000011f, -0.000074f, +0.000029f, +0.000058f, -0.000117f, -0.000042f, +0.000039f, +0.000059f, -0.000011f, + -0.000050f, +0.000061f, +0.000021f, +0.000029f, -0.000014f, -0.000019f + }, + { + -0.000237f, -0.001221f, +0.001210f, +0.000251f, +0.000173f, +0.000112f, -0.000088f, +0.000095f, -0.000251f, -0.000008f, + +0.000405f, +0.000239f, -0.000239f, -0.001956f, +0.001205f, -0.001442f, +0.000273f, +0.000362f, -0.000194f, +0.000758f, + -0.000724f, -0.000523f, +0.001458f, -0.000656f, -0.000222f, +0.000832f, +0.000262f, -0.000556f, +0.000449f, +0.000145f, + +0.000347f, -0.000221f, -0.000329f, +0.000000f, +0.000090f, -0.000424f, +0.000167f, +0.000056f, +0.000089f, -0.000014f, + -0.000068f, +0.000031f, +0.000106f, +0.000125f, -0.000061f, -0.000133f, -0.000133f, +0.000363f, -0.000097f, -0.000362f, + +0.000009f, -0.000026f, -0.000020f, -0.000084f, -0.000095f, +0.000077f, -0.000183f, +0.000177f, +0.000261f, -0.000171f, + +0.000007f, -0.000072f, +0.000098f, -0.000050f, +0.000095f, +0.000077f, -0.000147f, -0.000020f, +0.000060f, +0.000027f, + -0.000008f, +0.000021f, +0.000024f, -0.000041f, -0.000026f, +0.000033f, -0.000064f, -0.000024f, +0.000051f, -0.000060f, + +0.000099f, +0.000046f, +0.000007f, -0.000035f, -0.000071f, +0.000024f, -0.000037f, +0.000032f, +0.000005f, -0.000051f, + +0.000048f, -0.000015f, -0.000017f, +0.000014f, -0.000005f, +0.000013f + }, + { + +0.009811f, -0.063110f, -0.001394f, -0.000145f, -0.000386f, -0.000050f, +0.000446f, +0.000767f, -0.000752f, -0.000385f, + +0.001174f, +0.000350f, +0.000290f, -0.000319f, +0.000292f, -0.000719f, -0.000072f, +0.000672f, +0.000042f, +0.000125f, + -0.000381f, +0.000460f, -0.000972f, +0.000142f, +0.000230f, +0.000146f, +0.000103f, +0.000624f, -0.000220f, +0.000058f, + -0.000458f, +0.000402f, +0.000210f, +0.000171f, -0.000024f, -0.000145f, -0.000063f, -0.000413f, -0.000160f, +0.000384f, + -0.000159f, -0.000031f, +0.000284f, -0.000188f, -0.000108f, -0.000363f, -0.000337f, +0.000316f, +0.000001f, +0.000078f, + -0.000171f, +0.000094f, +0.000105f, -0.000052f, +0.000118f, +0.000176f, -0.000079f, -0.000027f, +0.000155f, +0.000112f, + +0.000015f, +0.000035f, +0.000043f, +0.000074f, +0.000169f, -0.000117f, -0.000214f, +0.000008f, -0.000022f, -0.000040f, + +0.000062f, -0.000009f, -0.000078f, +0.000004f, -0.000030f, +0.000103f, -0.000125f, -0.000012f, +0.000006f, +0.000018f, + -0.000026f, +0.000043f, +0.000014f, +0.000005f, +0.000038f, -0.000020f, -0.000070f, -0.000015f, -0.000003f, +0.000016f, + +0.000057f, -0.000025f, +0.000016f, -0.000059f, +0.000030f, +0.000012f + }, + { + +0.000546f, -0.004086f, -0.002094f, +0.000455f, -0.000246f, -0.001248f, +0.000793f, +0.000527f, -0.000782f, -0.000552f, + -0.000079f, +0.000842f, -0.000473f, -0.000376f, -0.001235f, +0.000097f, -0.000057f, -0.001022f, -0.001177f, +0.001933f, + +0.000280f, +0.000004f, -0.000366f, -0.000645f, +0.000115f, -0.000034f, -0.000625f, -0.000116f, +0.000358f, +0.000377f, + +0.001010f, -0.000379f, -0.000456f, -0.000093f, -0.000058f, -0.000385f, -0.000293f, -0.000053f, +0.000182f, -0.000034f, + -0.000128f, -0.000141f, +0.000197f, +0.000153f, -0.000427f, +0.000244f, +0.000042f, +0.000232f, -0.000114f, -0.000282f, + +0.000044f, +0.000097f, -0.000080f, +0.000209f, +0.000307f, -0.000273f, -0.000137f, -0.000050f, -0.000092f, +0.000039f, + +0.000117f, +0.000041f, +0.000129f, -0.000064f, -0.000003f, -0.000037f, -0.000102f, -0.000053f, -0.000117f, +0.000139f, + +0.000035f, +0.000012f, +0.000110f, -0.000081f, +0.000026f, +0.000056f, +0.000009f, +0.000001f, +0.000025f, +0.000034f, + -0.000017f, -0.000060f, -0.000032f, -0.000031f, -0.000038f, +0.000030f, +0.000043f, -0.000025f, +0.000007f, -0.000034f, + +0.000044f, -0.000024f, +0.000005f, -0.000009f, -0.000026f, +0.000019f + }, + { + +0.001259f, -0.005155f, +0.001517f, +0.000877f, -0.000721f, -0.000937f, +0.001154f, +0.001009f, -0.001221f, -0.000391f, + +0.000301f, -0.000200f, -0.000094f, -0.000456f, +0.000213f, +0.000604f, -0.000775f, +0.000069f, +0.000209f, -0.000030f, + -0.000116f, -0.000452f, +0.000131f, -0.000121f, +0.000047f, +0.000094f, +0.000073f, +0.000044f, -0.000308f, -0.000123f, + +0.000257f, +0.000353f, +0.000181f, -0.000249f, -0.000229f, +0.000495f, -0.000437f, -0.000107f, +0.000025f, -0.000428f, + -0.000098f, +0.000391f, +0.000110f, +0.000234f, +0.000033f, -0.000190f, -0.000011f, -0.000032f, +0.000230f, -0.000139f, + +0.000002f, -0.000100f, -0.000050f, +0.000212f, +0.000101f, +0.000060f, -0.000075f, -0.000244f, +0.000109f, +0.000079f, + -0.000006f, -0.000033f, +0.000050f, +0.000017f, -0.000109f, +0.000048f, -0.000003f, +0.000011f, -0.000059f, +0.000058f, + +0.000004f, -0.000012f, -0.000082f, -0.000071f, +0.000020f, -0.000041f, +0.000051f, +0.000065f, -0.000053f, +0.000035f, + -0.000044f, -0.000039f, +0.000097f, -0.000115f, +0.000021f, -0.000074f, +0.000014f, -0.000000f, +0.000030f, +0.000015f, + -0.000046f, +0.000021f, +0.000043f, +0.000001f, -0.000061f, +0.000010f + }, + { + +0.000150f, -0.000962f, -0.001154f, -0.000164f, -0.000204f, +0.000504f, +0.000009f, -0.000356f, -0.000264f, -0.000322f, + -0.000095f, +0.000580f, -0.001466f, -0.000507f, +0.001911f, -0.000359f, -0.000386f, -0.000542f, -0.000185f, +0.000122f, + +0.000824f, +0.000001f, -0.000221f, -0.000739f, +0.000261f, +0.001415f, -0.000559f, -0.001115f, +0.000479f, -0.000798f, + +0.001080f, -0.000122f, +0.000279f, +0.000278f, -0.000087f, +0.000145f, -0.000311f, -0.000517f, +0.000222f, -0.000118f, + -0.000097f, +0.000069f, -0.000269f, -0.000189f, +0.000044f, -0.000210f, -0.000002f, -0.000098f, -0.000012f, -0.000047f, + -0.000067f, +0.000196f, -0.000245f, -0.000130f, +0.000081f, +0.000086f, +0.000082f, +0.000106f, -0.000041f, +0.000005f, + -0.000162f, +0.000046f, +0.000073f, +0.000055f, -0.000104f, -0.000204f, +0.000190f, -0.000037f, +0.000060f, -0.000000f, + -0.000084f, +0.000043f, -0.000060f, -0.000029f, -0.000036f, -0.000062f, +0.000006f, +0.000092f, +0.000022f, +0.000034f, + -0.000030f, +0.000027f, +0.000039f, -0.000001f, -0.000013f, +0.000039f, +0.000013f, -0.000031f, -0.000019f, -0.000012f, + -0.000015f, -0.000019f, +0.000013f, +0.000026f, -0.000036f, -0.000020f + }, + { + +0.003341f, +0.015511f, -0.004034f, -0.000255f, -0.000163f, -0.000113f, +0.001797f, +0.000671f, +0.000855f, -0.000935f, + -0.000119f, +0.000755f, +0.000630f, +0.000086f, -0.000497f, +0.000354f, -0.000401f, -0.000047f, +0.000382f, -0.000910f, + +0.000940f, -0.000016f, +0.000190f, -0.000055f, +0.000121f, -0.000322f, +0.000068f, +0.000259f, -0.000385f, +0.000311f, + -0.000216f, +0.000044f, -0.000016f, +0.000290f, -0.000226f, -0.000127f, +0.000155f, -0.000153f, -0.000470f, +0.000207f, + +0.000461f, +0.000386f, -0.000075f, +0.000434f, -0.000093f, +0.000221f, -0.000189f, +0.000252f, -0.000228f, -0.000026f, + -0.000050f, -0.000074f, +0.000082f, -0.000187f, -0.000049f, +0.000074f, -0.000012f, +0.000165f, +0.000062f, -0.000220f, + -0.000006f, -0.000001f, +0.000019f, -0.000110f, +0.000019f, +0.000092f, +0.000010f, -0.000092f, -0.000134f, -0.000018f, + +0.000128f, -0.000042f, -0.000123f, -0.000007f, +0.000048f, +0.000050f, +0.000053f, -0.000091f, +0.000005f, -0.000052f, + +0.000131f, +0.000004f, -0.000051f, -0.000072f, -0.000018f, +0.000105f, +0.000077f, -0.000031f, +0.000029f, -0.000002f, + -0.000044f, -0.000016f, -0.000084f, +0.000012f, -0.000024f, -0.000006f + }, + { + +0.000500f, -0.000042f, -0.001936f, -0.000000f, -0.000195f, +0.000065f, +0.000227f, -0.000169f, -0.000054f, +0.000250f, + -0.000062f, -0.000101f, -0.000668f, +0.001722f, +0.004842f, +0.003177f, -0.000534f, +0.000105f, -0.000281f, +0.000086f, + +0.000657f, +0.000490f, -0.000721f, -0.000786f, -0.000172f, +0.000323f, +0.001130f, -0.000779f, +0.000029f, +0.000717f, + -0.000146f, -0.000053f, -0.000431f, -0.000213f, +0.000675f, -0.000250f, +0.000098f, +0.000027f, -0.000333f, +0.000254f, + -0.000344f, -0.000050f, -0.000001f, -0.000030f, -0.000010f, +0.000197f, -0.000226f, -0.000065f, -0.000015f, +0.000164f, + -0.000295f, +0.000127f, +0.000190f, +0.000029f, -0.000044f, -0.000040f, -0.000061f, -0.000030f, +0.000000f, -0.000028f, + -0.000192f, +0.000117f, +0.000053f, +0.000028f, -0.000034f, +0.000185f, -0.000081f, -0.000077f, +0.000070f, -0.000013f, + +0.000081f, +0.000049f, -0.000089f, +0.000061f, +0.000010f, -0.000017f, +0.000108f, -0.000120f, -0.000003f, -0.000039f, + -0.000086f, +0.000117f, +0.000036f, -0.000024f, +0.000068f, -0.000012f, -0.000024f, -0.000091f, +0.000077f, -0.000031f, + -0.000067f, +0.000022f, +0.000055f, -0.000032f, -0.000037f, +0.000070f + }, + { + -0.002221f, +0.004153f, +0.000923f, -0.001737f, -0.000647f, -0.001713f, +0.000854f, +0.000061f, +0.000353f, +0.000604f, + -0.000387f, -0.000356f, +0.000205f, +0.001703f, -0.001006f, -0.000380f, -0.000233f, -0.000875f, -0.000602f, +0.000644f, + +0.000102f, -0.000203f, -0.000122f, -0.000197f, +0.000316f, +0.000236f, -0.000612f, +0.000085f, -0.000156f, +0.000132f, + +0.000175f, -0.000253f, +0.000336f, +0.000062f, +0.000106f, +0.000051f, -0.000010f, -0.000170f, +0.000174f, -0.000182f, + +0.000017f, +0.000347f, +0.000255f, +0.000081f, -0.000166f, +0.000404f, -0.000095f, -0.000358f, -0.000175f, -0.000102f, + +0.000010f, +0.000000f, +0.000048f, +0.000091f, -0.000118f, +0.000027f, +0.000004f, -0.000107f, +0.000077f, -0.000031f, + +0.000027f, +0.000145f, -0.000022f, -0.000128f, -0.000062f, +0.000080f, -0.000018f, +0.000021f, +0.000033f, +0.000002f, + +0.000064f, +0.000072f, -0.000157f, -0.000138f, +0.000073f, +0.000097f, +0.000031f, -0.000027f, +0.000004f, +0.000038f, + +0.000019f, -0.000074f, +0.000020f, -0.000013f, -0.000031f, -0.000005f, -0.000003f, -0.000074f, +0.000094f, +0.000005f, + -0.000036f, +0.000021f, -0.000026f, -0.000028f, -0.000023f, +0.000014f + } + }, + { + { + +0.000374f, -0.001624f, -0.001899f, -0.000299f, +0.000192f, -0.000139f, -0.000115f, +0.000144f, -0.000449f, +0.000358f, + -0.000462f, +0.000084f, -0.000427f, -0.001190f, -0.003393f, +0.001378f, +0.001410f, +0.001054f, -0.001551f, -0.001027f, + +0.002150f, +0.000489f, -0.000090f, +0.000560f, -0.000769f, +0.000737f, +0.000040f, -0.000595f, +0.000192f, +0.000047f, + -0.000268f, +0.000264f, -0.000637f, -0.000090f, -0.000762f, +0.000053f, +0.000149f, +0.000226f, +0.000205f, +0.000284f, + +0.000067f, -0.000272f, -0.000028f, +0.000180f, +0.000184f, -0.000231f, -0.000091f, +0.000024f, -0.000003f, +0.000067f, + +0.000033f, -0.000161f, -0.000168f, +0.000137f, -0.000199f, -0.000137f, +0.000051f, -0.000059f, +0.000132f, +0.000017f, + +0.000085f, -0.000005f, -0.000088f, +0.000054f, +0.000065f, -0.000016f, -0.000105f, +0.000040f, +0.000068f, -0.000093f, + -0.000022f, +0.000086f, -0.000027f, +0.000057f, -0.000050f, +0.000055f, +0.000001f, +0.000080f, -0.000017f, -0.000079f, + -0.000016f, +0.000054f, +0.000003f, -0.000019f, -0.000089f, -0.000051f, +0.000051f, +0.000041f, -0.000036f, -0.000002f, + +0.000081f, -0.000034f, +0.000021f, -0.000033f, -0.000017f, +0.000030f + }, + { + +0.000543f, -0.038094f, +0.002469f, +0.001602f, +0.000214f, +0.000305f, -0.000302f, -0.000298f, +0.000959f, +0.000051f, + -0.000355f, +0.000167f, -0.000218f, +0.000172f, +0.000547f, +0.000402f, +0.000603f, -0.000675f, -0.000531f, +0.000091f, + +0.000287f, -0.000441f, +0.000300f, -0.000038f, +0.000464f, -0.000299f, -0.000465f, -0.000072f, +0.000156f, -0.000312f, + -0.000214f, +0.000199f, -0.000729f, -0.000120f, +0.000319f, +0.000365f, +0.000067f, -0.000132f, -0.000009f, +0.000087f, + +0.000271f, -0.000210f, -0.000070f, +0.000066f, +0.000059f, -0.000277f, +0.000152f, -0.000286f, +0.000467f, +0.000304f, + -0.000036f, +0.000160f, -0.000286f, -0.000152f, -0.000090f, +0.000129f, +0.000071f, -0.000172f, +0.000108f, +0.000039f, + +0.000047f, -0.000068f, +0.000015f, -0.000092f, -0.000129f, +0.000042f, +0.000059f, +0.000080f, -0.000054f, -0.000106f, + -0.000006f, -0.000045f, +0.000019f, -0.000032f, -0.000048f, +0.000126f, -0.000065f, -0.000014f, +0.000026f, +0.000075f, + +0.000011f, -0.000065f, +0.000055f, +0.000014f, -0.000067f, -0.000063f, +0.000136f, -0.000052f, +0.000018f, -0.000038f, + -0.000012f, +0.000034f, +0.000004f, -0.000039f, +0.000025f, -0.000014f + }, + { + -0.001366f, +0.030537f, +0.002268f, +0.001216f, -0.001661f, -0.000078f, -0.000226f, -0.000341f, -0.000028f, -0.000046f, + -0.000200f, -0.000062f, -0.000172f, +0.000193f, +0.000987f, -0.000190f, +0.000317f, -0.000622f, -0.001363f, -0.000785f, + -0.000622f, -0.000096f, +0.000087f, +0.000214f, -0.000146f, +0.000179f, -0.000020f, -0.000053f, -0.000081f, -0.000044f, + +0.000185f, +0.000351f, +0.000052f, -0.000488f, +0.000123f, -0.000056f, -0.000173f, +0.000199f, -0.000355f, -0.000314f, + +0.000428f, -0.000357f, +0.000135f, +0.000015f, -0.000328f, -0.000267f, +0.000392f, +0.000385f, +0.000043f, -0.000447f, + -0.000262f, +0.000197f, +0.000087f, -0.000000f, +0.000024f, +0.000052f, +0.000057f, -0.000137f, -0.000051f, +0.000050f, + +0.000179f, +0.000035f, -0.000086f, -0.000042f, -0.000028f, -0.000012f, +0.000007f, -0.000041f, +0.000108f, +0.000000f, + -0.000057f, +0.000006f, +0.000029f, +0.000012f, -0.000034f, +0.000010f, -0.000008f, -0.000027f, -0.000024f, +0.000061f, + +0.000041f, -0.000008f, +0.000016f, -0.000096f, +0.000008f, +0.000019f, -0.000024f, +0.000056f, -0.000000f, -0.000010f, + +0.000052f, -0.000015f, +0.000015f, -0.000038f, -0.000005f, +0.000010f + }, + { + +0.000329f, -0.000817f, -0.000940f, +0.000103f, -0.000399f, +0.000083f, +0.000003f, -0.000040f, -0.000046f, -0.000171f, + -0.000150f, -0.000338f, +0.000357f, -0.000096f, -0.008409f, +0.001803f, +0.001916f, -0.000504f, +0.000244f, +0.001108f, + +0.000467f, -0.000037f, -0.001198f, -0.001991f, +0.000653f, +0.000164f, -0.001025f, +0.000961f, -0.000112f, -0.000665f, + +0.000486f, -0.000375f, -0.000019f, -0.000168f, +0.000155f, +0.000343f, -0.000602f, +0.000209f, +0.000079f, -0.000254f, + +0.000222f, +0.000041f, +0.000006f, -0.000035f, +0.000350f, +0.000094f, -0.000222f, +0.000126f, +0.000089f, -0.000116f, + -0.000187f, +0.000150f, -0.000123f, -0.000022f, +0.000057f, -0.000045f, +0.000016f, +0.000158f, -0.000075f, +0.000071f, + +0.000095f, +0.000049f, +0.000008f, +0.000104f, -0.000020f, -0.000070f, -0.000069f, +0.000010f, -0.000055f, -0.000102f, + -0.000078f, +0.000115f, +0.000054f, +0.000059f, -0.000060f, +0.000099f, +0.000058f, -0.000012f, -0.000070f, +0.000004f, + -0.000001f, +0.000015f, -0.000050f, +0.000007f, -0.000053f, +0.000017f, +0.000060f, +0.000048f, -0.000028f, -0.000046f, + +0.000022f, +0.000031f, -0.000019f, -0.000039f, +0.000019f, -0.000016f + }, + { + +0.007164f, -0.042359f, -0.003342f, +0.000267f, -0.000574f, -0.000112f, +0.000282f, +0.000048f, -0.000201f, +0.000448f, + +0.000991f, -0.000815f, +0.000041f, -0.001025f, -0.000067f, -0.000128f, -0.000054f, -0.001263f, +0.000180f, -0.000287f, + +0.000252f, -0.000420f, -0.000436f, -0.000854f, +0.000624f, -0.000042f, -0.000237f, -0.001383f, -0.000150f, -0.000333f, + -0.000236f, -0.000199f, +0.000163f, +0.000057f, -0.000208f, -0.000141f, -0.000207f, +0.000726f, -0.000210f, -0.000279f, + +0.000289f, +0.000128f, -0.000011f, -0.000248f, +0.000137f, +0.000053f, -0.000104f, +0.000251f, -0.000021f, -0.000057f, + +0.000381f, -0.000095f, -0.000258f, +0.000205f, +0.000015f, +0.000108f, -0.000090f, -0.000040f, +0.000002f, +0.000094f, + +0.000010f, -0.000015f, +0.000102f, -0.000100f, -0.000029f, +0.000013f, -0.000103f, -0.000046f, +0.000092f, -0.000028f, + -0.000083f, -0.000087f, +0.000069f, +0.000155f, +0.000021f, +0.000003f, +0.000047f, -0.000130f, +0.000012f, +0.000020f, + -0.000009f, -0.000038f, +0.000015f, -0.000100f, +0.000029f, +0.000027f, -0.000005f, -0.000003f, -0.000019f, +0.000042f, + -0.000023f, +0.000009f, +0.000011f, +0.000001f, +0.000044f, +0.000021f + }, + { + +0.000490f, +0.001495f, -0.002089f, +0.000280f, +0.000022f, +0.000112f, +0.000107f, -0.000039f, +0.000002f, -0.000208f, + -0.000084f, +0.000027f, -0.000457f, -0.000283f, +0.004896f, -0.000442f, -0.002498f, +0.001745f, -0.001192f, +0.002736f, + -0.000097f, +0.000141f, -0.001656f, +0.001238f, -0.000428f, +0.000537f, -0.000177f, +0.000004f, +0.000916f, -0.000886f, + -0.000417f, +0.000539f, +0.000634f, +0.000246f, -0.000196f, +0.000176f, +0.000231f, -0.000223f, +0.000191f, +0.000283f, + +0.000177f, -0.000233f, +0.000075f, +0.000155f, +0.000004f, -0.000046f, -0.000136f, +0.000103f, -0.000008f, +0.000027f, + +0.000038f, +0.000084f, -0.000201f, +0.000112f, +0.000152f, -0.000105f, -0.000025f, +0.000018f, -0.000002f, -0.000102f, + +0.000084f, +0.000052f, -0.000073f, -0.000032f, +0.000084f, -0.000067f, -0.000011f, -0.000005f, +0.000021f, +0.000065f, + +0.000183f, -0.000063f, -0.000078f, +0.000035f, +0.000060f, +0.000008f, +0.000026f, -0.000080f, -0.000065f, -0.000036f, + +0.000056f, -0.000086f, -0.000033f, +0.000026f, +0.000060f, -0.000014f, +0.000004f, +0.000023f, +0.000004f, -0.000049f, + -0.000027f, +0.000061f, +0.000047f, -0.000033f, -0.000020f, -0.000016f + }, + { + +0.012153f, +0.046620f, -0.001559f, +0.000726f, +0.000409f, -0.000272f, -0.000214f, -0.000254f, -0.001225f, +0.000144f, + +0.000182f, +0.000182f, -0.000102f, +0.000027f, -0.000187f, +0.000165f, +0.000127f, -0.000250f, -0.000700f, +0.000501f, + +0.000427f, +0.000396f, -0.000075f, -0.000035f, +0.000379f, -0.000165f, -0.000121f, -0.000011f, +0.000529f, +0.000168f, + +0.000441f, +0.000044f, -0.000439f, +0.000382f, -0.000274f, -0.000317f, -0.000238f, +0.000107f, +0.000299f, -0.000112f, + +0.000043f, -0.000232f, +0.000085f, -0.000134f, +0.000070f, -0.000072f, -0.000147f, +0.000279f, +0.000212f, -0.000262f, + -0.000032f, -0.000280f, +0.000093f, -0.000129f, +0.000059f, -0.000009f, -0.000170f, -0.000013f, +0.000027f, -0.000076f, + -0.000087f, -0.000017f, +0.000007f, +0.000005f, +0.000073f, +0.000080f, -0.000072f, -0.000147f, +0.000084f, +0.000064f, + -0.000095f, +0.000060f, +0.000130f, -0.000097f, -0.000076f, +0.000041f, +0.000030f, -0.000070f, +0.000005f, +0.000045f, + -0.000099f, +0.000052f, +0.000006f, -0.000088f, -0.000021f, +0.000125f, -0.000023f, -0.000051f, -0.000013f, +0.000044f, + +0.000036f, -0.000058f, +0.000023f, -0.000002f, +0.000013f, -0.000002f + }, + { + +0.000565f, +0.001444f, -0.001832f, +0.000104f, -0.000305f, +0.000078f, +0.000035f, -0.000002f, +0.000038f, -0.000323f, + -0.000080f, +0.000086f, +0.000424f, -0.002098f, -0.001292f, +0.000150f, +0.001752f, +0.001530f, -0.000112f, +0.000799f, + +0.000417f, +0.001553f, +0.000240f, -0.001749f, -0.000627f, -0.001117f, +0.000544f, -0.000293f, +0.000439f, +0.000418f, + -0.000058f, -0.000288f, +0.000273f, -0.000239f, +0.000020f, -0.000100f, -0.000116f, -0.000351f, +0.000065f, -0.000348f, + +0.000028f, +0.000309f, -0.000121f, -0.000143f, +0.000230f, +0.000014f, +0.000126f, -0.000534f, +0.000204f, +0.000349f, + -0.000234f, -0.000083f, +0.000031f, +0.000173f, -0.000349f, +0.000007f, -0.000063f, -0.000122f, +0.000028f, +0.000222f, + +0.000043f, +0.000094f, -0.000131f, -0.000081f, -0.000050f, +0.000108f, +0.000085f, -0.000031f, -0.000047f, +0.000086f, + +0.000000f, -0.000003f, +0.000077f, +0.000090f, -0.000061f, -0.000033f, +0.000056f, -0.000054f, -0.000059f, -0.000063f, + -0.000099f, +0.000037f, +0.000025f, +0.000014f, +0.000055f, -0.000004f, +0.000020f, -0.000062f, +0.000036f, +0.000021f, + -0.000054f, +0.000018f, -0.000010f, +0.000001f, +0.000003f, +0.000001f + }, + { + -0.001980f, -0.081125f, +0.000884f, +0.001555f, +0.000271f, -0.000267f, -0.000433f, -0.000319f, +0.000870f, -0.000034f, + -0.001010f, +0.000077f, +0.000267f, +0.001619f, -0.000184f, +0.001006f, -0.000813f, -0.000230f, +0.000327f, +0.000135f, + -0.000329f, -0.000355f, -0.000644f, +0.000085f, -0.000254f, +0.000375f, -0.000274f, +0.000130f, +0.000099f, +0.000640f, + +0.000577f, -0.000253f, -0.000165f, -0.000029f, +0.000099f, +0.000073f, +0.000218f, +0.000631f, +0.000523f, -0.000142f, + +0.000260f, -0.000115f, -0.000206f, +0.000028f, -0.000165f, +0.000609f, +0.000211f, -0.000135f, -0.000120f, +0.000076f, + -0.000165f, -0.000307f, +0.000157f, +0.000053f, -0.000158f, +0.000106f, +0.000142f, +0.000122f, -0.000148f, +0.000047f, + +0.000119f, -0.000061f, +0.000122f, -0.000065f, -0.000118f, +0.000212f, +0.000076f, -0.000114f, +0.000013f, +0.000011f, + -0.000038f, +0.000054f, +0.000064f, -0.000035f, -0.000024f, -0.000131f, +0.000090f, +0.000011f, +0.000020f, -0.000071f, + +0.000040f, -0.000019f, +0.000015f, -0.000001f, +0.000012f, +0.000068f, +0.000054f, -0.000008f, -0.000035f, -0.000051f, + -0.000023f, +0.000004f, +0.000004f, +0.000048f, -0.000039f, +0.000018f + }, + { + -0.000631f, -0.001670f, +0.001807f, -0.000922f, +0.000555f, +0.000581f, -0.001260f, +0.000093f, +0.000167f, +0.000266f, + -0.000425f, -0.000442f, -0.000081f, +0.000510f, -0.000299f, -0.000119f, +0.000994f, +0.001020f, -0.001053f, -0.001744f, + -0.000718f, +0.001079f, +0.001378f, -0.000022f, -0.000293f, -0.000459f, +0.000106f, +0.000139f, -0.000187f, +0.000533f, + -0.000002f, +0.000628f, +0.000137f, -0.000343f, +0.000028f, +0.000152f, +0.000304f, -0.000157f, -0.000456f, -0.000172f, + -0.000164f, -0.000053f, -0.000069f, -0.000106f, +0.000248f, -0.000267f, -0.000002f, -0.000103f, +0.000115f, +0.000295f, + -0.000179f, -0.000089f, -0.000092f, -0.000173f, -0.000131f, +0.000255f, +0.000070f, +0.000054f, +0.000021f, -0.000066f, + -0.000130f, -0.000050f, -0.000029f, +0.000127f, -0.000092f, +0.000109f, +0.000141f, +0.000013f, -0.000061f, -0.000174f, + +0.000064f, -0.000050f, -0.000001f, +0.000082f, -0.000024f, -0.000053f, +0.000020f, +0.000040f, -0.000012f, +0.000015f, + +0.000051f, +0.000053f, +0.000016f, -0.000033f, +0.000010f, -0.000041f, -0.000022f, +0.000022f, -0.000003f, +0.000043f, + -0.000043f, +0.000018f, -0.000013f, +0.000005f, +0.000006f, -0.000038f + }, + { + -0.000052f, -0.005268f, +0.003880f, +0.002675f, +0.000755f, +0.002314f, -0.002643f, +0.000436f, -0.000155f, +0.000255f, + +0.000144f, +0.000337f, +0.000207f, -0.000385f, -0.000504f, +0.000784f, -0.000550f, -0.000212f, -0.000310f, +0.000524f, + -0.000467f, +0.000777f, -0.000356f, +0.000027f, -0.000507f, -0.000163f, +0.000028f, -0.000051f, +0.000293f, -0.000088f, + -0.000022f, -0.000460f, +0.000016f, +0.000191f, +0.000166f, -0.000196f, +0.000433f, -0.000276f, -0.000236f, +0.000352f, + -0.000344f, -0.000644f, +0.000147f, +0.000033f, +0.000229f, +0.000120f, +0.000049f, +0.000039f, -0.000182f, -0.000002f, + +0.000059f, -0.000064f, -0.000064f, -0.000147f, -0.000014f, -0.000023f, +0.000160f, +0.000207f, -0.000185f, +0.000033f, + +0.000092f, -0.000063f, -0.000080f, +0.000069f, +0.000067f, -0.000128f, +0.000043f, +0.000018f, +0.000046f, -0.000019f, + +0.000036f, +0.000025f, +0.000060f, -0.000007f, -0.000109f, +0.000020f, -0.000074f, -0.000059f, +0.000055f, -0.000028f, + +0.000049f, -0.000011f, -0.000042f, +0.000087f, -0.000056f, +0.000059f, -0.000092f, +0.000033f, -0.000054f, +0.000019f, + +0.000018f, -0.000031f, -0.000032f, +0.000027f, +0.000050f, -0.000035f + }, + { + -0.000196f, -0.000768f, +0.000572f, -0.000102f, +0.000079f, -0.000467f, +0.000145f, +0.000255f, -0.000033f, +0.000029f, + -0.000194f, +0.000021f, +0.001078f, +0.000103f, -0.000038f, +0.001771f, +0.000885f, +0.000618f, -0.000451f, -0.000729f, + -0.001165f, +0.000370f, -0.000201f, +0.000312f, -0.001256f, +0.000239f, +0.000459f, -0.001158f, +0.000008f, +0.000035f, + -0.001236f, +0.000419f, -0.000077f, +0.000649f, -0.000105f, +0.000037f, -0.000450f, +0.000218f, -0.000286f, +0.000039f, + -0.000295f, +0.000100f, +0.000247f, -0.000254f, -0.000076f, -0.000070f, -0.000046f, +0.000202f, -0.000017f, +0.000020f, + -0.000192f, +0.000031f, +0.000126f, -0.000077f, -0.000142f, -0.000230f, -0.000166f, -0.000022f, +0.000234f, +0.000096f, + +0.000219f, -0.000043f, -0.000104f, -0.000096f, +0.000135f, +0.000124f, -0.000112f, +0.000116f, +0.000005f, +0.000089f, + +0.000011f, -0.000020f, +0.000023f, -0.000008f, -0.000042f, +0.000022f, -0.000095f, -0.000053f, +0.000021f, -0.000057f, + +0.000070f, -0.000041f, -0.000064f, +0.000044f, -0.000007f, -0.000010f, +0.000003f, +0.000038f, +0.000021f, +0.000002f, + +0.000018f, +0.000022f, -0.000036f, -0.000034f, +0.000032f, -0.000010f + }, + { + -0.006371f, +0.002192f, +0.002147f, -0.001030f, +0.000759f, +0.000149f, -0.001122f, -0.000273f, +0.000075f, +0.000329f, + -0.000027f, -0.000375f, +0.000328f, -0.001187f, -0.000546f, -0.000284f, +0.000636f, -0.000024f, -0.000366f, +0.000071f, + -0.000794f, +0.000202f, -0.000098f, +0.000124f, +0.000373f, -0.000147f, -0.000464f, +0.000473f, -0.000210f, +0.000201f, + +0.000329f, -0.000176f, -0.000300f, +0.000225f, +0.000244f, -0.000045f, -0.000212f, -0.000009f, +0.000310f, -0.000410f, + -0.000142f, +0.000191f, +0.000102f, +0.000079f, +0.000167f, +0.000141f, +0.000133f, +0.000003f, +0.000387f, +0.000088f, + +0.000041f, +0.000024f, +0.000140f, +0.000117f, -0.000236f, -0.000124f, -0.000139f, -0.000034f, -0.000006f, +0.000186f, + -0.000029f, +0.000070f, +0.000030f, -0.000014f, -0.000089f, -0.000010f, +0.000019f, +0.000024f, +0.000130f, -0.000102f, + -0.000098f, +0.000115f, +0.000072f, -0.000053f, -0.000050f, +0.000003f, +0.000021f, +0.000065f, -0.000058f, +0.000004f, + -0.000138f, +0.000028f, +0.000050f, +0.000032f, -0.000023f, -0.000131f, +0.000010f, +0.000069f, +0.000002f, +0.000013f, + +0.000027f, +0.000026f, +0.000033f, -0.000049f, +0.000013f, -0.000025f + }, + { + -0.000623f, -0.000154f, +0.000757f, +0.000705f, -0.000059f, -0.000042f, -0.000220f, +0.000228f, -0.000190f, -0.000195f, + +0.000319f, -0.000701f, +0.001031f, +0.000801f, -0.014085f, -0.001577f, -0.000544f, -0.001383f, -0.000060f, +0.000588f, + +0.000423f, -0.000531f, -0.000059f, -0.000299f, -0.000868f, +0.000802f, -0.000425f, -0.000383f, -0.000501f, -0.000067f, + -0.000146f, -0.000132f, -0.000378f, +0.000526f, -0.000152f, -0.000234f, +0.000378f, +0.000000f, -0.000027f, -0.000027f, + +0.000370f, +0.000008f, -0.000199f, -0.000036f, -0.000268f, -0.000171f, +0.000331f, -0.000021f, +0.000134f, +0.000079f, + +0.000149f, -0.000154f, -0.000080f, +0.000013f, +0.000068f, -0.000103f, -0.000020f, +0.000057f, +0.000007f, +0.000059f, + +0.000119f, -0.000253f, -0.000099f, +0.000026f, -0.000042f, -0.000102f, +0.000153f, +0.000009f, -0.000108f, -0.000009f, + -0.000084f, -0.000039f, +0.000056f, -0.000021f, +0.000022f, -0.000016f, -0.000129f, +0.000125f, -0.000026f, +0.000089f, + +0.000010f, -0.000102f, +0.000018f, -0.000005f, -0.000038f, +0.000032f, +0.000060f, +0.000066f, -0.000076f, +0.000063f, + +0.000023f, -0.000055f, -0.000056f, +0.000036f, -0.000007f, -0.000052f + }, + { + +0.002093f, +0.006985f, +0.000306f, -0.000809f, +0.000610f, -0.000834f, -0.000725f, +0.000323f, -0.000379f, -0.000052f, + +0.001475f, -0.000416f, -0.000435f, -0.000127f, -0.002088f, +0.000615f, -0.000320f, -0.000219f, -0.000387f, -0.000121f, + -0.000140f, +0.000060f, +0.000209f, -0.000095f, -0.000870f, +0.000176f, +0.000716f, +0.000735f, -0.000228f, -0.000340f, + +0.000176f, -0.000156f, +0.000057f, +0.000243f, -0.000017f, -0.000216f, -0.000190f, +0.000505f, +0.000096f, +0.000114f, + +0.000152f, -0.000056f, -0.000070f, +0.000031f, +0.000071f, -0.000004f, +0.000191f, +0.000263f, -0.000013f, -0.000145f, + +0.000261f, +0.000305f, -0.000033f, -0.000246f, +0.000042f, -0.000141f, -0.000010f, +0.000107f, -0.000071f, +0.000045f, + -0.000002f, -0.000056f, -0.000029f, +0.000057f, -0.000030f, +0.000054f, +0.000058f, +0.000006f, -0.000047f, +0.000004f, + -0.000042f, +0.000036f, +0.000077f, -0.000007f, -0.000085f, -0.000071f, +0.000031f, +0.000063f, +0.000003f, -0.000031f, + +0.000065f, +0.000027f, -0.000048f, +0.000007f, +0.000023f, -0.000010f, -0.000035f, +0.000048f, -0.000137f, +0.000012f, + -0.000005f, -0.000026f, +0.000031f, -0.000005f, +0.000007f, -0.000022f + } + } +}; + +const float rightBRIRImag[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS_MAX]= +{ + { + { + -0.003791f, +0.035616f, -0.034450f, +0.040441f, -0.029208f, +0.017954f, +0.011952f, +0.008329f, -0.020104f, -0.006243f, + +0.004245f, -0.010854f, +0.001877f, +0.018565f, +0.016323f, -0.029876f, +0.012277f, -0.005391f, +0.019624f, -0.011547f, + +0.004712f, -0.005113f, +0.019768f, -0.018680f, +0.007412f, -0.020217f, +0.010813f, -0.006206f, +0.003340f, +0.001228f, + -0.003712f, +0.012907f, -0.008330f, -0.003791f, -0.000284f, +0.001418f, +0.012931f, -0.024378f, +0.007858f, -0.010698f, + +0.012380f, +0.017354f, -0.014538f, -0.004443f, -0.001842f, -0.001028f, +0.000687f, +0.010936f, -0.003543f, +0.003378f, + -0.005550f, +0.002422f, -0.001987f, +0.003558f, -0.001605f, -0.002153f, -0.004844f, +0.003678f, -0.001028f, +0.009272f, + -0.002623f, -0.003425f, +0.001118f, +0.001615f, +0.000303f, +0.000069f, +0.002704f, -0.001183f, -0.003852f, -0.005380f, + +0.003144f, -0.001632f, +0.000334f, +0.001724f, -0.003079f, +0.003885f, -0.003650f, +0.002843f, +0.000534f, +0.000864f, + +0.000686f, +0.000315f, +0.000489f, +0.000848f, -0.003228f, +0.000289f, -0.002032f, +0.003090f, -0.002176f, -0.002891f, + +0.002361f, -0.000048f, +0.000530f, -0.002042f, +0.000599f, -0.000001f + }, + { + +0.015156f, -0.046919f, +0.023866f, +0.056551f, -0.018603f, +0.018204f, -0.006295f, +0.005841f, -0.017601f, +0.000850f, + +0.005508f, -0.025128f, +0.017630f, +0.004815f, +0.013452f, -0.013149f, -0.012112f, -0.002673f, +0.025048f, -0.020564f, + +0.008179f, -0.000026f, -0.006170f, -0.006985f, +0.015915f, -0.004689f, -0.011409f, +0.002401f, +0.008634f, -0.013774f, + +0.025872f, -0.016717f, +0.001849f, +0.000660f, -0.002988f, +0.019139f, -0.002357f, -0.007661f, -0.008487f, -0.005312f, + +0.017901f, -0.004952f, -0.005629f, -0.004625f, +0.011985f, -0.009104f, +0.003950f, +0.001489f, +0.002572f, -0.001056f, + +0.000930f, -0.001780f, -0.005631f, +0.005814f, -0.007183f, +0.003234f, -0.001103f, +0.003008f, -0.002753f, -0.000448f, + +0.004966f, +0.002010f, -0.007550f, +0.008200f, +0.000854f, +0.000047f, +0.002977f, -0.003688f, -0.002937f, +0.000292f, + -0.003802f, -0.000313f, +0.001301f, +0.000813f, -0.001391f, +0.002152f, +0.000637f, +0.000919f, +0.004756f, -0.002570f, + +0.001029f, +0.001605f, -0.000617f, +0.000673f, -0.001594f, -0.002762f, +0.003751f, -0.002323f, -0.001274f, -0.000698f, + +0.000647f, +0.002001f, -0.000753f, +0.000262f, +0.000371f, -0.000401f + }, + { + +0.004299f, -0.003209f, -0.003761f, +0.055760f, -0.024853f, +0.024391f, -0.001604f, -0.015957f, +0.002351f, +0.006343f, + -0.008115f, -0.020569f, +0.012643f, +0.009013f, -0.009925f, +0.003359f, +0.012535f, -0.012377f, +0.010433f, -0.000091f, + -0.010594f, +0.011266f, +0.006100f, -0.002060f, +0.002277f, -0.002171f, -0.012298f, -0.017392f, -0.006387f, +0.003138f, + +0.021639f, -0.000998f, -0.008441f, +0.007443f, +0.004154f, -0.005729f, +0.006390f, +0.002980f, +0.006195f, -0.009220f, + -0.008181f, +0.011127f, +0.006971f, -0.007298f, -0.001284f, -0.002612f, +0.002489f, +0.004926f, -0.000254f, -0.004375f, + -0.007130f, +0.002882f, -0.002582f, +0.000713f, +0.000041f, +0.002210f, +0.002881f, -0.008372f, +0.000127f, +0.003099f, + +0.008382f, +0.001015f, +0.000337f, -0.005586f, +0.007747f, -0.004040f, +0.002872f, -0.002689f, +0.003474f, -0.004804f, + -0.004120f, -0.003075f, +0.001198f, -0.002518f, +0.001058f, -0.002374f, +0.001928f, -0.000488f, +0.004656f, +0.002497f, + +0.002037f, +0.000146f, +0.000636f, -0.002417f, +0.000216f, +0.001828f, -0.004316f, -0.002718f, -0.001475f, +0.003910f, + +0.000325f, -0.001053f, +0.000272f, +0.000247f, +0.000219f, -0.001413f + }, + { + +0.000562f, +0.015049f, -0.031657f, +0.038521f, -0.033022f, +0.012710f, +0.010685f, -0.001883f, +0.000869f, -0.001471f, + -0.005622f, -0.010958f, -0.003235f, +0.030773f, -0.030455f, +0.027403f, +0.004990f, -0.020239f, -0.000620f, +0.002078f, + +0.000073f, +0.009197f, +0.002127f, -0.016887f, +0.015101f, +0.013827f, -0.020001f, -0.014559f, +0.014014f, -0.013660f, + +0.020513f, -0.015651f, +0.004790f, +0.001380f, -0.006340f, +0.001655f, +0.000017f, -0.004094f, +0.008944f, -0.005050f, + +0.002472f, +0.006787f, -0.005301f, -0.003325f, +0.000165f, +0.007203f, -0.010677f, +0.002142f, +0.006378f, -0.001557f, + -0.008835f, +0.005949f, +0.003548f, -0.006529f, +0.003132f, -0.001672f, +0.001931f, -0.004389f, -0.000620f, +0.006489f, + +0.000236f, -0.003725f, -0.002856f, +0.006497f, +0.003731f, -0.003336f, -0.003984f, +0.005417f, -0.002780f, -0.003150f, + +0.001674f, -0.001999f, +0.002759f, -0.000623f, +0.000414f, +0.001472f, -0.001143f, -0.000976f, +0.002069f, -0.000229f, + -0.000752f, -0.000053f, +0.000146f, +0.001228f, -0.001831f, +0.001328f, +0.000937f, +0.000171f, -0.002131f, +0.001937f, + -0.000823f, +0.000024f, -0.001228f, +0.000033f, +0.000899f, +0.000148f + }, + { + +0.031079f, -0.100963f, +0.034014f, +0.043930f, -0.015193f, +0.011117f, -0.002004f, +0.000328f, -0.003409f, -0.022653f, + +0.010101f, -0.016582f, +0.017336f, -0.001914f, +0.003425f, +0.004211f, +0.006719f, -0.007042f, -0.003467f, +0.006217f, + -0.011715f, +0.013506f, -0.012220f, -0.017549f, +0.030531f, +0.000010f, -0.011696f, -0.013516f, +0.015369f, +0.015785f, + -0.001777f, -0.020855f, +0.025498f, -0.019570f, +0.007411f, +0.007851f, -0.004696f, -0.008433f, +0.012166f, -0.003196f, + +0.005940f, -0.005937f, +0.004706f, -0.005311f, +0.001921f, +0.005805f, -0.004376f, -0.003911f, -0.000236f, +0.004180f, + +0.001336f, -0.003118f, +0.003544f, -0.003611f, +0.000195f, +0.004241f, -0.012135f, +0.005817f, -0.000021f, +0.006245f, + -0.001650f, -0.001215f, -0.000318f, +0.001569f, -0.002899f, +0.009029f, -0.003874f, -0.002748f, -0.000394f, +0.000273f, + -0.004816f, -0.001913f, -0.000162f, +0.002463f, +0.001834f, +0.001245f, +0.001416f, -0.000379f, +0.001714f, +0.003885f, + -0.003784f, +0.000354f, -0.001659f, +0.002297f, -0.002478f, +0.000657f, +0.000994f, -0.000099f, -0.002571f, +0.003597f, + -0.001896f, +0.001375f, -0.000341f, -0.000967f, -0.000569f, +0.000971f + }, + { + -0.004541f, +0.045081f, -0.061054f, +0.043177f, -0.033020f, +0.011133f, +0.018265f, -0.006689f, +0.000432f, -0.012501f, + +0.010020f, -0.014024f, -0.016100f, +0.006235f, -0.000806f, +0.025484f, -0.000778f, -0.011684f, -0.007542f, -0.008898f, + +0.025761f, +0.001589f, -0.018234f, -0.013261f, +0.009468f, -0.004788f, +0.034638f, -0.026602f, +0.010301f, -0.008334f, + -0.008825f, -0.013069f, +0.016905f, +0.007814f, -0.001121f, -0.017714f, +0.005769f, -0.002227f, -0.004115f, +0.010645f, + -0.002158f, -0.018715f, +0.013931f, +0.004391f, -0.002375f, -0.010036f, +0.007984f, -0.006945f, +0.003214f, -0.002949f, + +0.003658f, -0.001122f, +0.000061f, +0.002870f, +0.004568f, +0.006022f, -0.006356f, -0.004375f, -0.000618f, +0.002222f, + -0.001832f, +0.001598f, -0.005641f, -0.002685f, +0.005231f, -0.002316f, +0.002807f, +0.000707f, -0.004551f, +0.001686f, + +0.000074f, +0.000185f, +0.002129f, -0.003117f, -0.002030f, +0.004874f, -0.000430f, +0.000043f, -0.002739f, +0.001221f, + -0.000975f, -0.004325f, +0.000197f, +0.001261f, +0.003576f, +0.002260f, -0.001576f, -0.001480f, -0.001593f, +0.000692f, + +0.000285f, -0.001473f, +0.002741f, -0.000002f, -0.000450f, -0.000607f + }, + { + +0.036117f, -0.119327f, +0.044976f, +0.037739f, -0.001219f, +0.002103f, +0.007910f, -0.005947f, +0.000356f, -0.018261f, + +0.019002f, -0.028213f, -0.003305f, +0.022168f, +0.006128f, +0.018084f, -0.014664f, -0.011038f, -0.007963f, +0.000761f, + +0.021748f, -0.009466f, -0.025281f, +0.008730f, +0.005341f, -0.007303f, +0.016566f, -0.015863f, +0.012280f, -0.001132f, + -0.005262f, -0.011727f, +0.016218f, +0.013931f, -0.009602f, -0.011008f, +0.008522f, -0.008221f, +0.011200f, -0.002612f, + -0.000806f, -0.010326f, +0.006563f, +0.005927f, -0.008185f, -0.004359f, +0.003896f, +0.002613f, +0.001596f, -0.004896f, + +0.001641f, -0.003403f, +0.007664f, +0.001231f, -0.000518f, +0.005706f, -0.006250f, +0.000972f, +0.004981f, -0.003980f, + -0.000078f, +0.000348f, -0.004083f, +0.001331f, -0.000848f, +0.001826f, +0.003498f, -0.003738f, +0.001630f, -0.004187f, + +0.001313f, +0.000447f, +0.002926f, +0.000433f, +0.003567f, -0.004496f, -0.000221f, +0.002305f, -0.000183f, -0.000633f, + -0.001989f, -0.001657f, -0.000426f, +0.002021f, -0.003825f, +0.007214f, -0.003633f, +0.001283f, -0.003259f, -0.000361f, + +0.002577f, -0.003052f, +0.001919f, -0.000278f, +0.000787f, +0.000639f + }, + { + -0.004144f, +0.045374f, -0.072072f, +0.045968f, -0.026150f, +0.002220f, +0.016361f, +0.001348f, +0.003320f, -0.012047f, + +0.002106f, -0.018684f, -0.005858f, +0.018462f, +0.003925f, +0.001033f, -0.004733f, -0.010901f, +0.019465f, +0.009475f, + -0.015377f, -0.000092f, -0.001831f, -0.001823f, -0.028757f, +0.025943f, +0.021352f, -0.013191f, -0.010846f, +0.003222f, + -0.008877f, +0.007365f, -0.010518f, +0.020756f, -0.015993f, +0.008567f, -0.009150f, +0.009497f, -0.009918f, +0.000967f, + +0.004153f, +0.001123f, -0.016148f, +0.004013f, +0.009431f, -0.001843f, -0.006558f, -0.006791f, +0.007685f, +0.009283f, + -0.008128f, -0.010130f, +0.015240f, +0.002291f, +0.003442f, -0.000674f, +0.000825f, +0.000382f, -0.011712f, +0.002348f, + +0.002999f, -0.006862f, +0.000962f, -0.000590f, -0.000935f, -0.001273f, +0.005840f, +0.004162f, -0.009001f, +0.000338f, + +0.003104f, +0.001575f, +0.004593f, +0.001355f, -0.000290f, -0.002256f, +0.004355f, -0.001903f, -0.003263f, -0.000659f, + -0.001294f, -0.000832f, +0.000698f, -0.000816f, +0.002170f, -0.000212f, +0.002000f, -0.001026f, -0.004872f, -0.000179f, + +0.001854f, -0.000515f, +0.004120f, +0.000527f, -0.000354f, -0.001380f + }, + { + +0.034893f, -0.116598f, +0.051025f, +0.035694f, -0.000997f, +0.018245f, -0.005301f, -0.002292f, -0.008323f, -0.000000f, + +0.006370f, -0.022686f, -0.004512f, +0.042219f, -0.034481f, +0.020360f, -0.012263f, -0.007853f, +0.020722f, -0.005794f, + +0.005172f, -0.028014f, +0.028510f, -0.021731f, -0.020878f, +0.019570f, +0.009691f, +0.004412f, -0.023657f, +0.007119f, + -0.001198f, +0.000920f, -0.005098f, +0.000793f, +0.012300f, -0.012051f, +0.001785f, +0.006111f, +0.001740f, -0.004239f, + -0.005123f, -0.004060f, -0.000797f, +0.001264f, +0.002020f, +0.002966f, +0.000674f, -0.001972f, -0.002580f, +0.002055f, + +0.004382f, -0.010227f, +0.002932f, +0.006830f, +0.001417f, +0.004780f, -0.002332f, -0.000024f, -0.008105f, -0.000001f, + +0.002378f, -0.004309f, +0.002387f, +0.007005f, -0.006738f, +0.001774f, +0.005883f, -0.000985f, +0.001149f, -0.005486f, + +0.001724f, +0.002457f, +0.000348f, +0.004471f, -0.003903f, -0.000096f, +0.001148f, -0.002147f, -0.001909f, -0.000392f, + -0.000904f, -0.002897f, +0.002295f, +0.000806f, +0.001663f, +0.000673f, +0.000174f, -0.000742f, -0.000727f, -0.000970f, + +0.000703f, +0.002098f, -0.001480f, +0.002680f, -0.000201f, -0.000227f + }, + { + +0.005126f, -0.001538f, -0.015235f, +0.030695f, +0.005281f, +0.006940f, -0.039109f, +0.010453f, +0.025729f, -0.008861f, + -0.003570f, -0.022616f, +0.023200f, +0.008870f, -0.021218f, +0.004430f, -0.018785f, +0.010071f, +0.008505f, +0.003754f, + -0.012304f, +0.018236f, -0.001993f, +0.002251f, +0.006982f, -0.022933f, +0.013043f, -0.018298f, -0.002656f, +0.005637f, + +0.008741f, -0.003656f, +0.012688f, -0.010035f, -0.003106f, +0.012127f, +0.000493f, -0.001092f, -0.009893f, +0.015247f, + -0.000467f, +0.003941f, -0.000487f, -0.021390f, +0.003195f, -0.003115f, -0.006729f, +0.009499f, +0.002141f, +0.005978f, + -0.009898f, -0.000030f, -0.005210f, +0.003261f, -0.004086f, +0.008716f, +0.002369f, -0.002758f, +0.007527f, -0.010094f, + +0.001631f, -0.009640f, +0.007037f, -0.004069f, +0.003800f, +0.001849f, +0.001873f, -0.001975f, +0.003919f, -0.004245f, + +0.001578f, -0.003325f, +0.001115f, -0.003713f, -0.002063f, -0.000404f, +0.000261f, +0.001356f, -0.000226f, +0.000382f, + +0.001363f, +0.000463f, -0.000105f, -0.000621f, +0.000770f, -0.002227f, -0.000718f, +0.002514f, -0.000664f, -0.003633f, + +0.001976f, -0.001506f, -0.000715f, -0.000132f, +0.002516f, -0.002111f + }, + { + +0.022350f, -0.075938f, +0.035126f, +0.029207f, +0.003163f, -0.004521f, -0.020930f, -0.014418f, +0.030501f, -0.006740f, + -0.011390f, -0.000896f, +0.012382f, -0.006164f, -0.001313f, +0.002459f, -0.002104f, +0.021712f, -0.012193f, +0.009687f, + +0.004707f, +0.014163f, -0.023884f, +0.021911f, -0.026152f, +0.001162f, +0.006696f, -0.000469f, +0.000056f, +0.004718f, + -0.001990f, -0.000962f, +0.004848f, -0.013501f, +0.007453f, +0.000046f, +0.003247f, -0.006705f, +0.006898f, -0.006236f, + +0.006251f, -0.005148f, +0.001841f, -0.002463f, +0.000287f, -0.000001f, -0.007061f, +0.013003f, -0.004662f, -0.000785f, + +0.009561f, -0.011175f, -0.002834f, -0.002082f, +0.007184f, -0.000181f, -0.000345f, +0.009599f, -0.003307f, -0.002433f, + -0.001748f, -0.000585f, -0.000145f, +0.005346f, +0.003550f, -0.003113f, -0.001236f, -0.001061f, +0.000341f, -0.001713f, + +0.003038f, -0.000514f, +0.003507f, -0.004291f, -0.000841f, +0.001188f, -0.002748f, +0.003677f, -0.000286f, -0.001103f, + +0.002232f, +0.004038f, -0.003380f, -0.000870f, -0.000191f, +0.002415f, -0.004147f, +0.000529f, -0.000457f, -0.000480f, + +0.000047f, -0.002087f, +0.002915f, +0.001516f, -0.000635f, +0.000426f + }, + { + +0.001111f, +0.011867f, -0.017990f, +0.028297f, +0.000426f, -0.002363f, -0.039425f, +0.031221f, -0.005193f, +0.008364f, + +0.006401f, -0.025754f, +0.026080f, -0.023642f, +0.002052f, +0.003631f, +0.009743f, -0.017352f, +0.007839f, +0.000594f, + -0.014943f, +0.001556f, -0.013070f, +0.022447f, +0.000669f, -0.015098f, +0.015087f, +0.007037f, -0.005164f, -0.004471f, + -0.004559f, +0.009403f, -0.010427f, +0.012295f, +0.008748f, -0.010688f, +0.004361f, -0.009843f, -0.000076f, +0.003307f, + -0.002826f, -0.014185f, +0.022416f, -0.006705f, -0.010075f, +0.012218f, -0.003595f, +0.003724f, -0.005893f, +0.008991f, + +0.009057f, -0.015570f, +0.004597f, -0.001585f, +0.002206f, -0.000167f, -0.009879f, +0.004410f, +0.000127f, -0.007267f, + +0.006999f, +0.006806f, -0.003321f, -0.000730f, +0.001635f, -0.001273f, +0.000587f, -0.005776f, +0.001981f, +0.007074f, + -0.002171f, -0.003334f, +0.005375f, +0.004819f, -0.003044f, -0.001193f, +0.002751f, -0.002876f, +0.001043f, -0.003590f, + +0.003531f, -0.002616f, -0.001019f, -0.000056f, +0.001974f, -0.001485f, -0.001004f, +0.005073f, +0.001846f, -0.000808f, + +0.002524f, +0.000703f, +0.000142f, -0.000624f, +0.000828f, -0.003011f + }, + { + +0.034061f, -0.110442f, +0.048213f, +0.025239f, +0.012269f, -0.002514f, -0.019908f, +0.023970f, -0.019269f, +0.028416f, + -0.046883f, -0.000178f, +0.012888f, -0.032642f, +0.030844f, +0.001553f, +0.000074f, -0.004604f, +0.003820f, -0.010144f, + -0.000311f, +0.007779f, -0.005806f, +0.007944f, -0.014090f, -0.000900f, +0.002712f, +0.013894f, +0.004462f, -0.016205f, + -0.005337f, +0.000814f, -0.006058f, +0.012871f, +0.007492f, -0.003853f, -0.000002f, -0.010796f, +0.012141f, -0.004061f, + -0.014549f, +0.001839f, +0.014417f, -0.002074f, -0.006590f, +0.007401f, -0.001645f, +0.005736f, -0.004139f, +0.000785f, + +0.001653f, -0.002559f, +0.000538f, +0.002989f, -0.008537f, +0.004625f, -0.010530f, +0.011204f, -0.007167f, +0.007388f, + -0.002460f, +0.002414f, -0.002064f, -0.000228f, +0.001363f, -0.001512f, -0.003710f, +0.000004f, +0.007957f, +0.003478f, + -0.005423f, +0.002982f, -0.000691f, +0.001599f, +0.000515f, -0.001164f, -0.001368f, +0.001924f, -0.004302f, +0.002464f, + -0.003819f, +0.000138f, -0.002363f, -0.000981f, +0.002320f, +0.000650f, -0.000354f, +0.002478f, -0.001367f, +0.001364f, + -0.000283f, +0.002098f, +0.001957f, +0.000225f, +0.000149f, -0.001690f + }, + { + +0.008157f, -0.014952f, -0.004610f, +0.021016f, +0.004300f, -0.001303f, -0.048770f, +0.041565f, -0.008153f, -0.009920f, + +0.012004f, -0.032354f, +0.010967f, +0.009596f, +0.019598f, -0.022471f, +0.025230f, -0.003797f, -0.009861f, -0.015772f, + +0.014787f, -0.015178f, +0.026701f, +0.003907f, -0.021712f, +0.012796f, +0.010293f, -0.020113f, +0.003656f, +0.005975f, + -0.013944f, +0.007406f, +0.004362f, +0.006323f, -0.024994f, +0.018065f, -0.003672f, -0.002683f, +0.001180f, +0.002073f, + +0.009488f, -0.004959f, -0.001422f, -0.006185f, +0.005975f, -0.003506f, -0.003574f, +0.008883f, +0.000407f, +0.002029f, + +0.001688f, +0.000331f, -0.002574f, -0.002714f, -0.000760f, -0.000615f, -0.002091f, +0.001747f, -0.002336f, -0.001154f, + +0.003304f, -0.005443f, +0.001853f, +0.003146f, +0.004879f, -0.002264f, -0.004307f, +0.003847f, -0.003045f, +0.000536f, + +0.001209f, +0.000809f, +0.000078f, -0.002629f, +0.002595f, +0.001081f, -0.001842f, -0.000580f, -0.000494f, +0.001876f, + +0.000284f, +0.000530f, +0.000551f, +0.000242f, +0.000446f, +0.000477f, -0.000401f, +0.000882f, -0.000876f, -0.001634f, + -0.000019f, -0.000847f, +0.000083f, +0.000996f, +0.001146f, -0.003415f + }, + { + +0.031471f, -0.102371f, +0.048731f, +0.002571f, +0.031337f, -0.013155f, -0.021248f, +0.022650f, -0.018393f, +0.012535f, + -0.013414f, -0.001893f, -0.018236f, +0.028763f, -0.008034f, +0.003288f, +0.004925f, -0.009888f, -0.012764f, +0.000884f, + +0.005916f, +0.015517f, -0.013872f, +0.014332f, -0.013445f, -0.016763f, +0.018277f, +0.003870f, -0.005788f, +0.005802f, + -0.011611f, +0.006351f, +0.000286f, +0.004177f, -0.016282f, +0.009266f, +0.000629f, +0.004378f, -0.008592f, +0.007596f, + +0.003657f, +0.008392f, -0.015385f, +0.001600f, +0.002894f, -0.006831f, -0.000403f, +0.004026f, +0.004754f, -0.000294f, + +0.003344f, -0.003990f, -0.003904f, +0.002277f, -0.005484f, +0.002950f, -0.003668f, +0.002270f, +0.000406f, +0.004562f, + -0.004674f, +0.001137f, +0.000017f, +0.000317f, +0.000708f, -0.004247f, +0.002698f, -0.000040f, +0.000686f, -0.005979f, + +0.005994f, -0.005415f, +0.004858f, -0.002041f, -0.001598f, +0.001694f, -0.000177f, -0.003148f, +0.000052f, -0.001476f, + +0.002110f, -0.001808f, +0.000649f, -0.001596f, +0.001986f, -0.000151f, +0.002280f, -0.000636f, -0.000539f, -0.001988f, + +0.000286f, +0.001015f, +0.000693f, -0.002775f, +0.002611f, -0.000593f + } + }, + { + { + -0.000492f, +0.127142f, +0.030490f, +0.014264f, -0.035944f, +0.023620f, +0.016300f, +0.015501f, -0.016171f, +0.001100f, + +0.002479f, -0.006976f, +0.021283f, +0.029754f, +0.011380f, -0.041859f, +0.028271f, +0.004580f, +0.009514f, -0.023580f, + +0.013174f, +0.012351f, +0.037096f, -0.033694f, -0.007608f, -0.028563f, +0.014571f, +0.002913f, +0.019502f, +0.004183f, + -0.021282f, -0.001475f, -0.019316f, -0.001425f, -0.004670f, -0.007110f, +0.009945f, -0.033870f, +0.003142f, -0.022763f, + +0.006673f, +0.019557f, -0.011205f, +0.002269f, -0.006265f, -0.008485f, +0.004070f, +0.024582f, -0.001157f, +0.003195f, + +0.001529f, +0.004204f, -0.000652f, +0.005671f, -0.000359f, -0.001155f, -0.009685f, -0.001868f, -0.002569f, +0.016346f, + -0.001001f, -0.009543f, -0.005063f, +0.000231f, -0.000778f, -0.003100f, -0.000187f, -0.000874f, -0.003108f, -0.005018f, + +0.009271f, +0.000628f, +0.000157f, +0.003205f, -0.002344f, +0.001975f, -0.008487f, +0.000500f, -0.000589f, +0.000350f, + -0.000638f, -0.001753f, -0.000961f, -0.002041f, -0.005803f, -0.000833f, -0.003869f, +0.002965f, +0.001063f, +0.001273f, + +0.004055f, -0.000334f, -0.000921f, -0.003242f, -0.000172f, -0.001795f + }, + { + -0.007837f, +0.022107f, +0.127114f, +0.120839f, +0.001794f, +0.002773f, -0.015184f, +0.015920f, -0.002210f, +0.007927f, + +0.008238f, -0.028435f, +0.016593f, +0.007225f, +0.033784f, -0.024372f, -0.029858f, -0.012470f, +0.011342f, -0.024519f, + -0.004079f, -0.013535f, -0.012085f, -0.005937f, +0.029009f, -0.002930f, -0.007080f, +0.007354f, +0.003273f, -0.013310f, + +0.037567f, -0.019525f, +0.007405f, +0.018909f, +0.008826f, +0.023754f, -0.005211f, -0.012007f, -0.023086f, -0.016654f, + +0.016544f, -0.010107f, -0.005647f, -0.004065f, +0.012187f, -0.003826f, +0.013470f, +0.003581f, +0.001941f, -0.002853f, + +0.003480f, -0.002259f, -0.009590f, +0.004383f, -0.002683f, +0.010189f, -0.003419f, -0.000946f, -0.007792f, -0.005691f, + +0.002501f, +0.000188f, -0.010032f, +0.015210f, +0.004677f, +0.000532f, +0.003285f, -0.002984f, -0.001447f, +0.000496f, + -0.003362f, +0.003906f, +0.003948f, +0.004497f, +0.000189f, +0.000256f, -0.000929f, -0.001518f, +0.002044f, -0.002702f, + +0.004598f, +0.001435f, -0.003800f, +0.000606f, +0.002298f, -0.000827f, +0.004897f, -0.002414f, -0.003063f, -0.000538f, + +0.001736f, +0.002346f, +0.001046f, +0.001436f, -0.001316f, -0.003433f + }, + { + +0.000671f, +0.110839f, +0.101416f, +0.091860f, +0.005660f, +0.012777f, -0.008042f, -0.007811f, +0.005404f, +0.017988f, + -0.007726f, -0.035331f, +0.004686f, +0.004796f, -0.012038f, +0.004397f, +0.029637f, +0.000049f, +0.017032f, +0.002561f, + -0.013992f, +0.004338f, +0.002661f, -0.006978f, -0.001991f, -0.016686f, -0.030465f, -0.026391f, -0.008065f, +0.006298f, + +0.027376f, +0.005574f, -0.013353f, +0.005959f, +0.013166f, +0.005872f, +0.019797f, +0.014006f, +0.017696f, -0.005558f, + -0.015198f, +0.008329f, +0.010258f, -0.006952f, -0.005429f, -0.008932f, -0.002966f, +0.003579f, +0.002287f, -0.006145f, + -0.006903f, +0.008747f, -0.006150f, +0.000402f, -0.001114f, -0.001603f, +0.012201f, +0.003396f, +0.000947f, -0.002934f, + +0.010431f, +0.004735f, +0.000763f, -0.009370f, +0.004800f, -0.004450f, +0.001665f, -0.002129f, +0.006339f, -0.005015f, + -0.000539f, -0.002990f, -0.000544f, -0.002495f, -0.000746f, -0.004227f, +0.001651f, +0.000630f, +0.010454f, +0.005959f, + +0.004160f, +0.001907f, +0.001995f, -0.003650f, -0.003609f, -0.000892f, -0.005898f, -0.001278f, -0.001766f, +0.002991f, + +0.001625f, -0.001037f, -0.002750f, -0.002003f, -0.000188f, +0.000621f + }, + { + +0.000990f, +0.080842f, +0.006590f, +0.002939f, -0.063577f, +0.008257f, +0.010604f, -0.004919f, +0.005113f, +0.037113f, + +0.012699f, -0.015215f, -0.006199f, +0.018887f, -0.053634f, +0.035855f, +0.043012f, -0.015612f, -0.032205f, -0.010302f, + +0.001258f, +0.015463f, +0.019228f, -0.008104f, +0.015893f, +0.009870f, -0.028033f, -0.028344f, +0.002831f, -0.025566f, + +0.028636f, -0.011375f, -0.007755f, -0.005683f, -0.007843f, -0.003330f, -0.008150f, -0.007394f, +0.013685f, +0.003644f, + +0.008056f, +0.006824f, -0.003341f, -0.007880f, -0.003775f, +0.008857f, -0.015107f, +0.002661f, +0.007104f, +0.003490f, + -0.010954f, -0.003320f, +0.005706f, -0.003025f, +0.004389f, -0.000141f, -0.001093f, -0.010051f, -0.001956f, +0.010995f, + +0.002149f, -0.003701f, -0.000580f, +0.012925f, +0.011365f, -0.002934f, -0.007096f, -0.000541f, -0.008584f, +0.001509f, + +0.008050f, -0.000326f, +0.005580f, -0.000333f, +0.000527f, +0.000851f, -0.000600f, +0.000707f, +0.001200f, -0.001471f, + -0.000259f, +0.000664f, +0.000207f, +0.001260f, -0.002235f, +0.001211f, +0.001370f, +0.003000f, +0.000330f, +0.002028f, + -0.001790f, -0.000677f, +0.000545f, +0.000926f, -0.000186f, -0.000303f + }, + { + -0.026835f, -0.181865f, +0.037564f, +0.107751f, +0.032150f, +0.003916f, -0.013587f, -0.004438f, -0.013500f, -0.019061f, + +0.018127f, -0.027756f, +0.016303f, -0.018435f, -0.007393f, +0.008794f, +0.039105f, -0.003404f, -0.028716f, -0.011274f, + -0.044767f, +0.001436f, +0.013655f, +0.001732f, +0.026819f, -0.000095f, +0.001978f, +0.001876f, +0.026554f, +0.017451f, + -0.002075f, -0.028912f, +0.026192f, -0.012989f, +0.015906f, +0.014152f, +0.001101f, -0.007629f, +0.014840f, +0.001461f, + +0.001782f, -0.011494f, +0.011753f, -0.003328f, -0.003503f, +0.006511f, +0.000759f, +0.005716f, +0.003309f, -0.000564f, + +0.001223f, -0.006044f, +0.007236f, -0.001145f, -0.007203f, +0.004614f, -0.014844f, +0.001762f, +0.001465f, +0.007694f, + +0.001861f, +0.003301f, -0.004797f, -0.003294f, -0.004021f, +0.015571f, +0.000944f, -0.003031f, -0.003769f, -0.004734f, + -0.010545f, -0.004038f, +0.002712f, +0.006084f, +0.007743f, +0.002468f, +0.000482f, +0.002498f, +0.006597f, +0.009007f, + -0.001043f, +0.000108f, -0.003056f, +0.002881f, -0.005147f, -0.001948f, +0.002383f, +0.002622f, -0.000338f, +0.005018f, + -0.001357f, +0.002903f, +0.000944f, -0.000235f, -0.000181f, +0.002126f + }, + { + -0.003185f, +0.100270f, -0.029126f, -0.009281f, -0.072169f, +0.013546f, +0.016975f, -0.009072f, +0.010034f, -0.005103f, + +0.007802f, -0.018048f, -0.010867f, -0.011273f, -0.023622f, +0.012181f, -0.009776f, -0.008777f, -0.016221f, -0.021456f, + +0.020390f, +0.001323f, -0.002958f, -0.025382f, -0.008702f, -0.010006f, +0.039060f, -0.025220f, +0.005527f, -0.018304f, + -0.010691f, -0.032201f, +0.000142f, +0.010727f, -0.006689f, -0.024096f, +0.007994f, -0.009646f, -0.010656f, +0.009432f, + +0.005178f, -0.016290f, +0.008334f, +0.004069f, +0.003675f, -0.004658f, +0.006706f, -0.013866f, +0.002914f, -0.000667f, + +0.005199f, +0.003319f, +0.000516f, +0.003473f, +0.010426f, +0.006826f, -0.012693f, -0.007533f, -0.001723f, +0.001412f, + -0.001387f, +0.002234f, -0.008857f, -0.005027f, +0.002840f, -0.007341f, +0.004239f, +0.007672f, -0.002719f, +0.000126f, + +0.000082f, -0.002792f, -0.005425f, -0.012384f, -0.008279f, +0.006008f, +0.000589f, +0.000922f, -0.002687f, +0.000674f, + -0.001525f, -0.004787f, +0.000102f, +0.004109f, +0.006266f, +0.001595f, -0.003404f, -0.000900f, -0.000193f, +0.002951f, + +0.001078f, -0.003480f, +0.001421f, -0.002189f, -0.000761f, +0.000053f + }, + { + -0.030217f, -0.221214f, +0.038313f, +0.121312f, +0.064707f, -0.003907f, +0.010002f, -0.007884f, +0.004944f, -0.022780f, + +0.023826f, -0.005094f, +0.000909f, +0.020493f, +0.008115f, -0.005734f, -0.029788f, -0.003137f, -0.018553f, -0.030074f, + +0.006583f, -0.014134f, -0.029065f, +0.014021f, +0.006633f, -0.019995f, +0.009369f, -0.009166f, +0.024812f, +0.003127f, + -0.000021f, -0.011782f, +0.009195f, +0.018955f, -0.001175f, -0.014172f, -0.001517f, -0.015883f, +0.015238f, +0.000148f, + +0.006233f, -0.010534f, +0.004895f, +0.001454f, -0.021112f, -0.010564f, +0.005267f, +0.009229f, +0.012845f, -0.003395f, + -0.009352f, -0.007743f, +0.014193f, -0.001162f, -0.005752f, +0.009354f, -0.000337f, +0.012997f, +0.012746f, -0.004475f, + +0.005915f, +0.002550f, -0.009430f, -0.001723f, -0.001543f, +0.000441f, +0.002673f, -0.002115f, +0.001608f, -0.007624f, + +0.002453f, -0.000548f, +0.004768f, +0.003531f, +0.003776f, -0.008140f, -0.002597f, +0.006363f, +0.003781f, +0.000026f, + -0.001018f, -0.002478f, -0.001446f, +0.000320f, -0.006837f, +0.007249f, -0.005413f, +0.001959f, -0.003069f, -0.001351f, + +0.003129f, -0.001881f, +0.000818f, -0.001412f, +0.002122f, +0.001692f + }, + { + -0.004134f, +0.078893f, -0.059682f, -0.002127f, -0.060617f, -0.007065f, +0.016696f, +0.014501f, +0.011325f, -0.005655f, + +0.014505f, -0.010427f, -0.010943f, +0.000286f, +0.009830f, +0.007337f, +0.003271f, +0.014110f, +0.015331f, -0.001794f, + -0.025418f, -0.008408f, -0.008112f, +0.017243f, -0.011046f, +0.014224f, -0.004306f, -0.010070f, +0.001507f, -0.000426f, + +0.006884f, +0.007839f, -0.029931f, +0.009998f, -0.019037f, +0.012281f, -0.010893f, +0.001655f, -0.015497f, +0.000224f, + +0.009042f, +0.008738f, -0.022560f, -0.003224f, +0.011806f, -0.000160f, -0.005826f, -0.009557f, +0.001611f, +0.012995f, + -0.003841f, -0.006817f, +0.020858f, +0.002630f, +0.006933f, +0.002031f, -0.004101f, -0.003763f, -0.009439f, +0.000590f, + -0.003484f, -0.009424f, +0.004092f, +0.001133f, +0.001681f, -0.001448f, +0.001601f, -0.001946f, -0.006213f, +0.009829f, + +0.009660f, +0.007110f, +0.009400f, +0.003770f, -0.000927f, -0.007563f, +0.001073f, +0.001559f, +0.001140f, +0.000655f, + +0.000532f, +0.000921f, -0.000204f, -0.004870f, -0.002147f, -0.003474f, +0.002213f, +0.001794f, -0.005261f, -0.003304f, + +0.001486f, -0.000281f, +0.003085f, +0.001261f, +0.001769f, -0.000273f + }, + { + -0.029485f, -0.205707f, +0.057007f, +0.129426f, +0.081460f, +0.020928f, -0.011809f, -0.003713f, +0.001069f, +0.017510f, + +0.030232f, -0.016894f, -0.021508f, +0.027481f, -0.061490f, +0.003144f, -0.004036f, -0.014495f, +0.013101f, +0.005423f, + +0.006718f, -0.051342f, +0.019772f, -0.010063f, -0.033144f, +0.004254f, +0.006226f, +0.007016f, -0.012031f, +0.007262f, + -0.022784f, -0.018352f, +0.006932f, +0.005257f, +0.005291f, -0.012935f, +0.001822f, +0.000522f, -0.004537f, +0.002376f, + +0.000423f, -0.012098f, +0.001181f, +0.000544f, +0.000884f, +0.017346f, +0.012489f, -0.004209f, -0.012583f, -0.000402f, + +0.005246f, -0.010863f, +0.003781f, +0.000229f, -0.003368f, +0.005246f, -0.010223f, -0.000779f, -0.003906f, +0.005584f, + +0.007814f, -0.002715f, +0.006893f, +0.014089f, -0.000233f, +0.005548f, +0.003548f, -0.000286f, +0.000730f, -0.008074f, + +0.001699f, +0.000446f, -0.003747f, +0.002418f, -0.002163f, -0.001382f, -0.003948f, -0.005746f, -0.004252f, +0.002258f, + -0.000749f, -0.005488f, +0.002416f, +0.002479f, +0.001478f, +0.000712f, +0.002446f, +0.001543f, +0.001608f, -0.000083f, + -0.002007f, +0.000949f, -0.001753f, +0.003297f, +0.001064f, -0.000843f + }, + { + -0.000633f, +0.082188f, +0.048760f, +0.019632f, -0.017441f, -0.012185f, -0.045362f, +0.033211f, +0.046861f, -0.012585f, + +0.004360f, -0.030819f, +0.023468f, +0.025510f, -0.027721f, -0.024079f, -0.052916f, +0.027297f, +0.033162f, +0.009518f, + -0.011374f, +0.009831f, -0.010468f, -0.008194f, +0.004808f, -0.018884f, +0.014603f, -0.028812f, -0.000211f, +0.014420f, + +0.025996f, +0.000904f, +0.010663f, -0.009868f, +0.002204f, +0.027928f, +0.018839f, +0.007836f, -0.012974f, +0.015666f, + -0.005101f, -0.000679f, -0.004716f, -0.034668f, -0.007855f, -0.004884f, -0.016476f, +0.001579f, -0.003905f, -0.002110f, + -0.004217f, +0.002836f, -0.005910f, +0.012871f, +0.007021f, +0.015379f, -0.003426f, -0.003500f, +0.008908f, -0.020345f, + -0.000759f, -0.009878f, +0.003412f, -0.014077f, -0.003098f, +0.002591f, +0.008189f, +0.000578f, +0.003295f, -0.005207f, + -0.000990f, -0.005295f, +0.003115f, +0.000478f, -0.001554f, -0.005935f, -0.003133f, +0.001822f, +0.000705f, -0.002703f, + -0.004657f, -0.001924f, +0.001114f, -0.000978f, -0.003733f, -0.009387f, -0.001607f, +0.005996f, +0.003084f, -0.000329f, + +0.002784f, -0.002209f, -0.002129f, -0.002315f, -0.000030f, -0.006689f + }, + { + -0.016943f, -0.090729f, +0.085556f, +0.053957f, -0.002613f, +0.022006f, +0.000939f, -0.053566f, +0.028333f, -0.011225f, + +0.001241f, +0.001394f, +0.002168f, +0.009110f, +0.003073f, +0.009243f, +0.032560f, +0.065612f, +0.002608f, +0.022439f, + +0.028054f, +0.008371f, -0.037395f, +0.012039f, -0.025103f, +0.012142f, +0.012665f, +0.003970f, +0.010219f, -0.010216f, + -0.013918f, +0.013853f, +0.005000f, -0.013590f, +0.004497f, -0.001230f, +0.003010f, -0.009149f, +0.005757f, -0.009027f, + +0.010926f, +0.003460f, +0.016835f, +0.014114f, +0.007280f, -0.002770f, -0.022847f, +0.001379f, -0.003756f, -0.004804f, + +0.007888f, +0.000071f, +0.002686f, -0.002363f, +0.013375f, -0.000237f, +0.000169f, +0.014090f, -0.006365f, -0.006978f, + -0.003995f, +0.001151f, +0.004938f, +0.006669f, +0.004054f, -0.001068f, +0.000367f, -0.000199f, +0.001694f, -0.002071f, + +0.003131f, +0.000020f, +0.003951f, -0.004189f, -0.003484f, -0.003453f, -0.005239f, +0.005992f, +0.000068f, -0.002283f, + +0.002626f, +0.003949f, -0.004534f, +0.001314f, +0.003123f, +0.002455f, -0.007052f, -0.003418f, +0.000452f, +0.001266f, + -0.002274f, -0.002218f, +0.005999f, +0.001854f, -0.002535f, +0.000091f + }, + { + +0.000033f, +0.102045f, +0.043645f, +0.002350f, -0.028552f, -0.028841f, -0.048966f, +0.037118f, -0.009384f, +0.003191f, + +0.044805f, +0.012357f, +0.017346f, -0.026996f, -0.015394f, -0.047681f, -0.020342f, -0.012786f, +0.004794f, -0.005811f, + -0.027102f, -0.020956f, -0.011366f, +0.031116f, +0.013367f, +0.002588f, +0.018276f, +0.002396f, -0.002242f, +0.017254f, + +0.011884f, +0.009059f, -0.014139f, +0.003768f, +0.000473f, -0.005948f, +0.003630f, -0.031937f, -0.013405f, +0.004003f, + -0.000864f, -0.025657f, +0.023404f, -0.003349f, -0.015876f, +0.012644f, -0.004422f, +0.001269f, -0.010534f, +0.002678f, + +0.006516f, -0.014638f, +0.006894f, -0.002403f, +0.006401f, +0.007271f, -0.008773f, +0.007737f, +0.009868f, -0.008148f, + -0.000620f, +0.002854f, -0.007012f, +0.003549f, +0.000967f, -0.009368f, +0.004110f, +0.000346f, -0.000081f, +0.005454f, + -0.001003f, +0.000914f, +0.010178f, +0.002794f, -0.004786f, +0.000250f, +0.006214f, +0.002368f, +0.006170f, -0.001266f, + +0.004588f, -0.003319f, +0.000325f, +0.002422f, +0.004334f, +0.000189f, -0.000962f, +0.006950f, +0.003820f, +0.000201f, + +0.002909f, -0.000344f, +0.000879f, -0.000758f, +0.000546f, -0.005139f + }, + { + -0.024284f, -0.223206f, +0.037317f, +0.063289f, +0.052465f, +0.041019f, +0.008409f, +0.002862f, -0.043321f, -0.004690f, + -0.064343f, +0.001365f, +0.002791f, -0.043344f, +0.015558f, -0.010789f, +0.009228f, +0.000521f, -0.009767f, -0.005770f, + +0.016872f, +0.020933f, -0.005034f, -0.013734f, -0.025611f, +0.006051f, +0.013147f, +0.020925f, +0.001304f, -0.030472f, + -0.024297f, -0.008688f, -0.009350f, +0.019448f, +0.009052f, -0.001193f, +0.018630f, -0.002733f, +0.010437f, -0.002388f, + -0.020802f, -0.002194f, +0.009713f, +0.000938f, +0.010130f, +0.005118f, -0.007277f, +0.014773f, -0.008043f, -0.014581f, + -0.012544f, -0.006333f, +0.012915f, +0.007133f, -0.010056f, +0.015554f, -0.009099f, +0.016380f, -0.000907f, +0.005543f, + -0.006839f, -0.000726f, -0.004014f, +0.000180f, -0.000753f, -0.003436f, +0.000198f, +0.002889f, +0.009349f, +0.008555f, + -0.006448f, +0.000573f, -0.002764f, -0.001837f, -0.001285f, -0.006676f, -0.006083f, +0.005393f, -0.001769f, +0.004199f, + -0.005701f, -0.003992f, -0.008274f, -0.006427f, +0.002390f, +0.002250f, -0.001011f, +0.003754f, +0.000952f, +0.001146f, + -0.000172f, +0.004184f, +0.004210f, +0.003103f, +0.001616f, -0.003751f + }, + { + -0.002932f, +0.052919f, +0.047219f, -0.000490f, -0.024037f, -0.034001f, -0.071996f, +0.041005f, -0.025998f, -0.030701f, + +0.013798f, -0.036311f, +0.025725f, +0.021322f, +0.024050f, -0.005789f, +0.039130f, -0.012558f, -0.027915f, -0.034758f, + +0.002694f, -0.024811f, +0.036765f, +0.026944f, -0.020713f, +0.010310f, +0.002021f, -0.028153f, +0.012715f, +0.007126f, + -0.018811f, +0.011754f, +0.005309f, -0.006874f, -0.028563f, +0.022301f, -0.008155f, -0.006463f, -0.007457f, -0.002199f, + -0.001840f, -0.003810f, +0.012105f, +0.004819f, +0.015545f, +0.009521f, +0.003408f, +0.009476f, -0.004297f, -0.007252f, + +0.006604f, +0.008925f, -0.005192f, +0.001975f, +0.003181f, -0.007491f, -0.010705f, -0.002736f, -0.005499f, -0.007492f, + -0.002105f, -0.005298f, +0.008634f, +0.006697f, +0.004462f, -0.008720f, -0.009375f, +0.003176f, -0.002495f, +0.007735f, + +0.007820f, +0.001562f, +0.000515f, -0.000296f, +0.003658f, +0.001739f, -0.001186f, +0.002915f, +0.002585f, +0.003299f, + +0.001596f, +0.001295f, +0.000364f, -0.001972f, +0.000521f, +0.000687f, -0.004676f, -0.000272f, +0.002218f, -0.001851f, + -0.002763f, -0.002747f, +0.000607f, +0.002785f, +0.001474f, -0.004432f + }, + { + -0.023631f, -0.213962f, +0.027535f, +0.022393f, +0.051924f, +0.006589f, -0.012179f, +0.002871f, -0.021780f, -0.000197f, + -0.029364f, +0.008522f, -0.040051f, +0.018047f, +0.005705f, +0.000597f, -0.022049f, -0.034058f, -0.032891f, -0.002640f, + +0.022029f, +0.027775f, -0.030585f, -0.004056f, -0.027018f, -0.019276f, +0.036675f, +0.015325f, -0.012532f, -0.005416f, + -0.012346f, +0.021477f, +0.005231f, -0.007126f, -0.016103f, +0.025494f, +0.006598f, +0.010278f, -0.005712f, +0.004479f, + -0.002062f, +0.006364f, -0.018989f, -0.013151f, -0.005207f, -0.004013f, -0.000146f, -0.001291f, -0.004322f, -0.005807f, + +0.009029f, +0.002328f, -0.007284f, +0.004808f, -0.003689f, -0.000337f, -0.015451f, -0.004066f, +0.002110f, +0.009638f, + -0.001699f, +0.004829f, +0.006107f, +0.001273f, -0.007343f, -0.012112f, +0.002609f, -0.004282f, -0.005854f, -0.009464f, + +0.006030f, -0.007585f, +0.004678f, -0.002966f, -0.002705f, -0.000390f, -0.003388f, -0.002970f, +0.000247f, -0.006616f, + -0.000990f, -0.004819f, -0.002281f, -0.004609f, +0.001736f, +0.003352f, +0.003851f, +0.000245f, -0.000413f, -0.003137f, + +0.000224f, +0.002396f, +0.000992f, -0.004449f, +0.002995f, -0.002844f + } + }, + { + { + +0.004321f, +0.053914f, +0.070227f, -0.043621f, +0.040426f, +0.006642f, +0.017140f, -0.000059f, -0.004976f, -0.000420f, + +0.019670f, -0.021323f, +0.031517f, +0.029682f, -0.024665f, +0.001095f, -0.007585f, +0.002040f, +0.012807f, -0.018304f, + -0.009669f, +0.025349f, +0.043196f, -0.017436f, -0.009303f, -0.017048f, -0.004253f, +0.007567f, +0.013073f, -0.002208f, + -0.007856f, -0.021014f, -0.014202f, +0.011682f, -0.003206f, -0.010536f, -0.005873f, -0.012495f, -0.004106f, -0.017846f, + -0.001869f, +0.012476f, -0.003338f, +0.000898f, -0.003351f, -0.007277f, +0.008533f, +0.003814f, +0.013344f, +0.000013f, + +0.000845f, -0.001932f, +0.005752f, +0.000488f, -0.001516f, -0.002337f, -0.007410f, +0.001861f, -0.001140f, +0.004946f, + +0.001062f, -0.009567f, -0.000507f, +0.003416f, -0.006419f, -0.003406f, +0.000819f, -0.001973f, -0.001069f, -0.006550f, + +0.007555f, +0.006583f, -0.000291f, +0.000146f, +0.003243f, -0.000609f, -0.005467f, -0.004913f, +0.000784f, -0.002886f, + -0.000635f, -0.000039f, -0.003224f, -0.000216f, +0.000205f, -0.003937f, -0.001853f, +0.002322f, +0.001139f, +0.002995f, + +0.001389f, -0.000351f, -0.000200f, -0.002210f, -0.000836f, +0.001040f + }, + { + +0.001404f, +0.202612f, -0.042440f, +0.042075f, +0.040288f, +0.012624f, -0.009198f, -0.001598f, +0.012517f, +0.009249f, + -0.004603f, -0.001052f, -0.002570f, +0.002424f, +0.032080f, -0.019415f, -0.019799f, -0.003964f, -0.002234f, -0.004261f, + -0.027784f, -0.005372f, -0.005935f, -0.010948f, +0.022820f, -0.002299f, +0.001537f, +0.003022f, -0.014020f, +0.008343f, + +0.015405f, +0.003231f, +0.008117f, +0.012929f, +0.007872f, +0.009931f, -0.006384f, +0.001512f, -0.021693f, -0.012426f, + +0.005484f, -0.006434f, +0.001723f, +0.001663f, +0.005521f, +0.002866f, +0.000973f, +0.002400f, +0.003538f, -0.003656f, + +0.006753f, -0.008159f, -0.001383f, +0.001717f, -0.000288f, +0.005608f, -0.005822f, -0.001478f, -0.003612f, -0.004677f, + -0.003276f, +0.003143f, -0.006166f, +0.011693f, +0.005600f, -0.002922f, +0.001373f, +0.000051f, -0.008068f, +0.005697f, + +0.000673f, +0.005470f, -0.001595f, +0.002558f, +0.001276f, -0.001123f, -0.002280f, -0.000423f, +0.002044f, -0.002254f, + +0.005768f, -0.002566f, -0.000582f, -0.004826f, +0.005662f, +0.003137f, -0.000383f, -0.001742f, -0.001549f, +0.002319f, + -0.001765f, +0.002823f, +0.000973f, +0.001441f, -0.002637f, -0.001701f + }, + { + -0.003738f, +0.192876f, +0.032853f, -0.010317f, +0.085002f, +0.010323f, -0.010316f, -0.014287f, +0.009075f, +0.018472f, + -0.004150f, -0.020018f, -0.008771f, -0.003165f, +0.006240f, +0.001989f, +0.017927f, +0.011792f, +0.003424f, +0.004040f, + +0.010452f, -0.016447f, +0.000277f, -0.014527f, +0.003329f, -0.000882f, -0.028772f, -0.033206f, -0.005893f, +0.020099f, + +0.001834f, -0.001162f, -0.001330f, +0.010529f, +0.015824f, -0.000676f, +0.011731f, +0.013850f, +0.014365f, -0.003119f, + -0.007439f, +0.007710f, +0.000391f, -0.000930f, -0.009413f, -0.005542f, +0.006061f, -0.005673f, -0.005941f, +0.004577f, + +0.002858f, +0.003853f, -0.006141f, +0.004428f, -0.002424f, -0.000921f, +0.004220f, +0.005460f, +0.010321f, -0.007394f, + +0.004027f, +0.005359f, +0.000558f, -0.003956f, +0.004071f, -0.003201f, -0.004122f, +0.003092f, +0.000218f, +0.000760f, + -0.000107f, -0.001355f, -0.001785f, +0.000397f, -0.003019f, -0.000860f, -0.001309f, +0.002932f, +0.011788f, +0.003408f, + +0.002505f, +0.003143f, +0.001253f, +0.000025f, -0.005133f, -0.001552f, -0.003305f, -0.001395f, -0.001231f, +0.003274f, + +0.001087f, -0.000923f, -0.003768f, -0.000567f, +0.000649f, +0.001732f + }, + { + -0.000732f, +0.077533f, +0.019690f, -0.027300f, -0.018640f, -0.003579f, +0.002577f, -0.001561f, -0.003751f, +0.035189f, + +0.011266f, -0.010551f, +0.001022f, -0.001342f, -0.020076f, +0.019502f, +0.020950f, +0.018138f, -0.044158f, -0.007474f, + +0.007178f, -0.013682f, +0.015086f, +0.007612f, +0.017129f, -0.003447f, -0.016675f, -0.012533f, -0.010560f, -0.017076f, + +0.011157f, -0.000261f, -0.010697f, +0.004924f, -0.017230f, -0.003620f, -0.011755f, +0.005374f, +0.002166f, +0.009919f, + +0.007996f, -0.003070f, +0.001867f, +0.002955f, -0.001957f, -0.002559f, -0.014315f, +0.007213f, -0.001207f, +0.005798f, + +0.006749f, -0.018098f, +0.002680f, +0.008346f, -0.005970f, +0.003758f, -0.003791f, -0.002991f, -0.007425f, +0.007453f, + +0.004194f, +0.000966f, +0.004115f, +0.005305f, +0.011083f, -0.005834f, -0.001052f, -0.005206f, -0.006001f, +0.003852f, + +0.007096f, -0.001618f, +0.002814f, +0.002228f, +0.003802f, -0.002883f, +0.000290f, +0.000830f, +0.002850f, -0.001793f, + -0.001194f, +0.000345f, +0.002560f, -0.000486f, -0.002107f, +0.001644f, +0.000938f, -0.000070f, +0.001878f, +0.001000f, + +0.000796f, -0.003144f, +0.000896f, -0.000250f, +0.000683f, +0.000880f + }, + { + +0.024130f, -0.114797f, -0.070598f, +0.081480f, +0.037148f, +0.026473f, -0.021092f, +0.012851f, -0.009915f, -0.003073f, + -0.018367f, -0.019361f, +0.008026f, -0.006310f, +0.001784f, -0.023030f, +0.044276f, -0.003089f, -0.020861f, -0.022160f, + -0.031876f, +0.007702f, +0.016020f, +0.002359f, +0.014321f, -0.006915f, +0.015495f, +0.011918f, +0.011604f, +0.008844f, + -0.003610f, -0.007191f, +0.002918f, +0.008963f, -0.003311f, +0.011779f, -0.002543f, +0.003964f, +0.003999f, +0.013222f, + +0.000658f, -0.002984f, -0.005895f, -0.000374f, +0.002951f, -0.008446f, +0.003554f, +0.008426f, +0.009754f, -0.004118f, + -0.003316f, -0.004508f, +0.007181f, +0.000474f, -0.006587f, +0.006844f, -0.001511f, -0.005132f, -0.003987f, +0.004498f, + -0.000381f, -0.000929f, +0.001587f, -0.001410f, -0.000199f, +0.003069f, +0.007892f, -0.005159f, -0.004704f, -0.003745f, + -0.005388f, -0.003770f, +0.007413f, -0.001964f, +0.009141f, +0.001140f, -0.002234f, +0.006816f, +0.006514f, +0.003038f, + -0.000697f, +0.002548f, -0.002241f, +0.002036f, -0.003800f, -0.001234f, +0.004082f, -0.000567f, +0.004820f, +0.000509f, + +0.000146f, +0.001813f, +0.002022f, +0.000415f, -0.001923f, +0.001246f + }, + { + +0.005397f, -0.041378f, +0.104895f, -0.030359f, -0.035936f, +0.001265f, +0.001423f, +0.001481f, -0.002751f, +0.008702f, + +0.004326f, -0.015264f, -0.010821f, +0.002652f, -0.032210f, -0.004588f, +0.011177f, -0.020715f, -0.007297f, -0.000396f, + -0.012409f, -0.009549f, +0.000000f, -0.035048f, +0.021117f, -0.014946f, +0.001528f, -0.003568f, +0.006234f, -0.008428f, + -0.018761f, -0.017378f, -0.000225f, +0.003401f, -0.016052f, -0.002899f, -0.004890f, -0.012130f, +0.003582f, +0.004717f, + +0.006950f, -0.014722f, +0.011250f, -0.004198f, +0.003078f, +0.011121f, -0.005651f, -0.007370f, -0.003614f, +0.013448f, + -0.000961f, +0.010947f, -0.009922f, +0.003742f, +0.006057f, +0.007461f, -0.001792f, -0.004469f, -0.012353f, +0.003948f, + +0.000361f, -0.007041f, -0.005357f, -0.000495f, -0.007863f, +0.002966f, +0.003114f, +0.011557f, -0.002112f, -0.009488f, + +0.001481f, +0.000333f, -0.006428f, -0.004755f, -0.008993f, +0.003119f, +0.001767f, -0.003300f, -0.002591f, +0.000337f, + +0.002670f, -0.006812f, +0.000204f, +0.008286f, -0.000813f, +0.002605f, -0.003225f, +0.002017f, +0.000352f, +0.001225f, + +0.001804f, -0.003582f, +0.001999f, -0.006066f, +0.001079f, +0.002094f + }, + { + +0.026756f, -0.150037f, -0.088445f, +0.134905f, +0.044992f, +0.009202f, +0.004801f, -0.003703f, +0.012814f, -0.019796f, + -0.012653f, +0.026007f, +0.006770f, -0.001287f, +0.027595f, -0.017305f, -0.026466f, -0.006647f, -0.015578f, -0.009289f, + -0.009770f, -0.019482f, -0.015026f, +0.000224f, -0.004476f, +0.003594f, -0.000272f, +0.002927f, +0.002999f, +0.013749f, + -0.001428f, -0.008273f, -0.002814f, +0.013355f, +0.005024f, -0.015830f, +0.004083f, -0.014448f, +0.009483f, +0.002492f, + +0.005243f, -0.005318f, +0.000354f, -0.003664f, -0.003631f, -0.005962f, -0.003470f, +0.005552f, +0.003536f, +0.007630f, + -0.018407f, -0.002872f, +0.006794f, -0.003804f, +0.001791f, +0.005345f, -0.000423f, +0.012406f, +0.013029f, +0.000032f, + +0.004580f, -0.005694f, -0.001438f, +0.005730f, -0.003617f, -0.005708f, +0.000535f, +0.002215f, -0.000814f, -0.004637f, + +0.004577f, +0.001222f, -0.000830f, +0.006053f, +0.002644f, -0.006597f, -0.000004f, +0.003940f, +0.000390f, -0.001516f, + +0.003165f, -0.002668f, -0.000628f, -0.000762f, -0.002055f, -0.000856f, -0.001133f, +0.003348f, -0.003888f, +0.000508f, + +0.001525f, +0.000186f, +0.002632f, -0.002987f, +0.002142f, -0.000581f + }, + { + +0.004805f, -0.075133f, +0.095286f, -0.023720f, -0.034003f, -0.014303f, +0.009346f, +0.011973f, +0.005667f, +0.006888f, + +0.007557f, +0.008500f, -0.028944f, +0.030826f, +0.000145f, +0.008449f, +0.015027f, +0.016640f, -0.010198f, -0.013519f, + -0.007359f, -0.009585f, -0.005426f, +0.014209f, -0.009076f, -0.010839f, +0.017982f, -0.017595f, +0.025975f, -0.021533f, + +0.032545f, -0.000272f, -0.026021f, +0.001272f, -0.004301f, -0.020776f, +0.011566f, -0.009135f, +0.002110f, +0.001859f, + +0.007556f, -0.003226f, -0.001812f, -0.007344f, +0.002927f, +0.004491f, -0.005740f, +0.002137f, -0.009661f, +0.004341f, + +0.003702f, -0.003229f, +0.010267f, +0.007147f, +0.007066f, +0.003526f, -0.002295f, -0.007314f, +0.001675f, -0.008600f, + -0.000579f, -0.007268f, +0.001743f, -0.003111f, +0.009945f, -0.010111f, +0.000556f, -0.001200f, +0.001869f, +0.005317f, + +0.006611f, +0.017747f, +0.001903f, +0.000197f, -0.001245f, -0.000041f, -0.000570f, -0.001455f, +0.001764f, +0.002215f, + -0.000622f, +0.000634f, +0.000200f, -0.005149f, -0.001290f, -0.002031f, -0.000311f, +0.001363f, -0.003725f, -0.003192f, + +0.001199f, +0.001746f, -0.000946f, +0.002252f, +0.002949f, -0.001050f + }, + { + +0.026323f, -0.132667f, -0.079924f, +0.146226f, +0.060814f, +0.018220f, -0.013642f, +0.008330f, -0.003740f, +0.031773f, + +0.014619f, -0.012688f, -0.008770f, -0.007333f, -0.013782f, -0.037298f, +0.025655f, -0.009435f, +0.000293f, +0.021691f, + -0.014192f, -0.023026f, +0.001271f, -0.029793f, +0.001736f, -0.004256f, +0.005236f, -0.004142f, -0.004361f, +0.001894f, + -0.011909f, -0.011089f, +0.008801f, +0.001918f, +0.001613f, -0.010844f, +0.002200f, -0.000318f, +0.006861f, +0.002337f, + -0.003029f, -0.016362f, +0.004510f, +0.001324f, +0.009695f, +0.005650f, +0.003024f, +0.013916f, -0.021660f, +0.000440f, + -0.002577f, +0.002187f, +0.005373f, -0.006808f, -0.003001f, +0.001974f, -0.007142f, -0.001394f, -0.003693f, +0.009230f, + -0.000148f, -0.003242f, +0.008835f, +0.007323f, +0.002040f, +0.002694f, +0.002108f, +0.003683f, -0.005682f, -0.003422f, + +0.003023f, -0.000800f, -0.005954f, +0.004664f, +0.002240f, -0.002295f, -0.006517f, -0.004769f, -0.005127f, +0.004631f, + -0.002705f, +0.000619f, -0.003447f, +0.002990f, -0.000189f, +0.000523f, +0.000399f, +0.002833f, -0.002152f, +0.003652f, + +0.000245f, -0.004143f, +0.000479f, +0.000881f, +0.004260f, -0.002754f + }, + { + -0.001718f, +0.134150f, -0.008816f, +0.013269f, -0.001244f, -0.041296f, +0.002181f, +0.031839f, +0.015639f, +0.000134f, + +0.004179f, -0.009358f, -0.005626f, +0.030049f, -0.030780f, -0.018819f, -0.019812f, -0.003249f, +0.037288f, +0.000976f, + -0.001154f, -0.005032f, +0.001591f, -0.005541f, +0.009526f, -0.014606f, +0.005417f, -0.019642f, +0.016185f, -0.005901f, + +0.024996f, +0.002813f, +0.009207f, -0.003164f, -0.008630f, +0.018128f, +0.020157f, +0.011682f, -0.008626f, +0.002625f, + +0.008633f, -0.008304f, -0.004122f, -0.017536f, -0.020417f, +0.006680f, -0.005452f, -0.009377f, +0.004829f, -0.007608f, + -0.001925f, +0.006763f, -0.011599f, +0.001900f, +0.022401f, +0.008668f, -0.005743f, +0.000429f, -0.005111f, -0.005363f, + -0.008324f, -0.004519f, +0.005762f, -0.005223f, -0.012381f, -0.002584f, +0.006545f, +0.002682f, -0.000485f, +0.006592f, + -0.008175f, -0.001470f, -0.002334f, +0.002766f, +0.003623f, -0.006995f, -0.000793f, +0.000495f, -0.002188f, -0.000923f, + -0.003996f, -0.004496f, +0.001341f, -0.000238f, -0.003911f, -0.004030f, -0.001553f, +0.003343f, +0.003692f, +0.001317f, + +0.001841f, -0.003450f, -0.000517f, -0.002465f, -0.001486f, -0.003387f + }, + { + +0.012721f, -0.008627f, -0.003767f, +0.042753f, -0.011710f, -0.019395f, +0.088755f, -0.035649f, -0.016319f, -0.033758f, + +0.028400f, +0.001539f, -0.002913f, +0.020676f, +0.007217f, +0.000252f, +0.027777f, +0.033256f, +0.045715f, +0.013819f, + +0.025088f, -0.009499f, -0.010396f, -0.003629f, -0.011775f, -0.001053f, +0.007717f, +0.008052f, +0.021379f, -0.013792f, + -0.010606f, +0.015825f, +0.004397f, -0.003720f, -0.003268f, +0.004786f, -0.014910f, +0.006112f, +0.009035f, -0.011433f, + +0.011781f, +0.011193f, +0.005875f, +0.028115f, -0.000705f, -0.003338f, -0.013553f, -0.010364f, +0.003403f, +0.006547f, + -0.008289f, -0.001686f, -0.002782f, +0.015208f, +0.006001f, -0.003247f, +0.002767f, +0.005414f, -0.000592f, -0.012017f, + -0.005447f, -0.000864f, +0.013500f, -0.003662f, +0.002212f, +0.004420f, -0.000090f, -0.001816f, +0.005006f, -0.003789f, + -0.001755f, +0.005703f, -0.003384f, -0.002232f, -0.002090f, -0.007192f, -0.000337f, +0.004027f, -0.003301f, +0.003489f, + -0.000185f, -0.000983f, +0.002565f, -0.004770f, +0.006099f, -0.003356f, -0.000879f, -0.003491f, +0.000570f, +0.002099f, + -0.002555f, +0.003552f, -0.001031f, +0.002759f, -0.002965f, +0.000732f + }, + { + -0.000037f, +0.111740f, +0.013164f, +0.000290f, -0.009778f, -0.013178f, -0.034187f, +0.011712f, -0.000027f, +0.003586f, + +0.015235f, +0.028557f, -0.017692f, -0.008294f, +0.013152f, -0.027725f, -0.050000f, -0.007112f, +0.000992f, -0.003848f, + -0.032505f, -0.019660f, -0.009361f, +0.038317f, +0.014370f, +0.008867f, +0.002026f, -0.018809f, +0.027116f, +0.017156f, + +0.029046f, -0.001004f, -0.002208f, -0.024314f, -0.004183f, +0.006591f, -0.008341f, -0.036756f, +0.001451f, +0.000955f, + -0.005635f, -0.018408f, -0.001204f, +0.005772f, -0.007373f, +0.015373f, -0.007035f, -0.001714f, -0.003510f, -0.008495f, + +0.003976f, -0.002719f, +0.001481f, -0.003303f, +0.006744f, +0.007155f, -0.002937f, +0.006129f, +0.001423f, +0.004594f, + -0.012148f, +0.004510f, +0.000519f, -0.000017f, -0.000603f, -0.009500f, -0.003429f, +0.003007f, +0.001968f, -0.002434f, + +0.001893f, +0.003921f, +0.009184f, -0.003214f, +0.000120f, +0.000076f, +0.005644f, +0.004345f, -0.000154f, +0.005242f, + +0.002871f, -0.004191f, +0.000371f, +0.004037f, +0.000378f, +0.002473f, +0.002877f, +0.002602f, +0.003593f, -0.002462f, + +0.001944f, +0.000802f, +0.002274f, -0.001753f, -0.000064f, -0.003456f + }, + { + +0.014898f, -0.235522f, -0.003958f, +0.050408f, +0.041201f, +0.008810f, +0.068310f, -0.024066f, -0.010810f, -0.028775f, + -0.059863f, +0.021873f, -0.005468f, -0.006487f, -0.003824f, -0.018420f, +0.014775f, -0.016760f, -0.001273f, -0.008338f, + +0.021560f, +0.014015f, +0.021056f, -0.023360f, -0.017611f, -0.003652f, +0.009718f, +0.026735f, -0.015173f, -0.017100f, + -0.023117f, +0.010874f, -0.014738f, +0.007141f, +0.006680f, -0.009307f, +0.024614f, -0.003563f, +0.008304f, -0.005208f, + -0.008753f, -0.002542f, +0.003595f, +0.007942f, +0.005775f, +0.002137f, -0.006934f, +0.013885f, -0.012576f, -0.010867f, + -0.002311f, -0.008668f, +0.014730f, -0.000988f, +0.001383f, +0.003736f, -0.004241f, +0.010918f, +0.003796f, -0.004520f, + -0.000989f, -0.003714f, +0.002527f, -0.001951f, -0.004186f, +0.005296f, -0.000588f, +0.006161f, -0.001768f, +0.001399f, + +0.002288f, -0.006056f, -0.000127f, -0.001377f, -0.005459f, -0.000542f, -0.010269f, +0.004704f, -0.003646f, +0.001985f, + +0.000269f, -0.008089f, -0.004638f, -0.007263f, -0.000054f, +0.003325f, +0.004343f, -0.000844f, +0.005318f, -0.000251f, + -0.000022f, +0.004240f, +0.000453f, +0.003439f, -0.000514f, -0.002699f + }, + { + -0.000446f, +0.120440f, -0.014049f, -0.002632f, -0.013834f, -0.036474f, -0.048834f, +0.014829f, -0.034502f, -0.004332f, + +0.003828f, -0.013295f, +0.014497f, -0.004259f, +0.014119f, +0.046080f, +0.004778f, -0.017647f, -0.019912f, -0.020270f, + -0.034335f, +0.016998f, -0.019424f, +0.046940f, -0.000350f, -0.007187f, -0.002976f, -0.022017f, +0.011991f, +0.026022f, + -0.010042f, -0.011777f, +0.009236f, -0.026214f, -0.008509f, +0.010801f, -0.014019f, +0.007363f, -0.008644f, -0.011304f, + -0.004800f, +0.004475f, +0.006550f, +0.014899f, +0.018823f, +0.009798f, -0.006354f, +0.003810f, -0.001097f, -0.003984f, + +0.010197f, +0.002791f, +0.001087f, +0.005007f, -0.001127f, -0.008972f, -0.005937f, -0.004143f, -0.007425f, -0.006322f, + +0.005967f, -0.010333f, +0.007644f, +0.005781f, +0.000965f, -0.006443f, -0.007022f, +0.005973f, -0.003910f, +0.007771f, + +0.009589f, -0.002729f, +0.000704f, +0.007161f, -0.002664f, -0.001023f, +0.002193f, +0.002858f, +0.002868f, +0.000323f, + -0.003983f, +0.006578f, +0.000289f, -0.003605f, +0.000965f, +0.003756f, -0.003504f, -0.002904f, +0.002559f, -0.003556f, + -0.002010f, -0.001951f, -0.000093f, +0.002263f, +0.000390f, -0.001459f + }, + { + +0.015533f, -0.217392f, -0.029264f, +0.039516f, -0.005477f, -0.011817f, +0.065533f, +0.001464f, -0.015145f, -0.023538f, + -0.028276f, -0.006198f, -0.032400f, +0.013709f, -0.024705f, +0.029803f, -0.005442f, -0.055178f, -0.026604f, +0.026836f, + +0.012067f, -0.001128f, -0.007017f, -0.017517f, -0.029885f, +0.000470f, +0.028084f, +0.014413f, -0.013600f, -0.019257f, + -0.002030f, +0.022797f, +0.022735f, -0.010051f, -0.003418f, +0.002729f, +0.015448f, -0.001654f, +0.000443f, +0.001639f, + -0.001268f, -0.009343f, +0.000842f, -0.023260f, -0.011952f, +0.013001f, -0.003874f, -0.012571f, -0.005670f, -0.006264f, + +0.007368f, +0.002857f, -0.005564f, +0.006202f, -0.000236f, -0.006623f, -0.012341f, -0.008381f, +0.008210f, +0.013582f, + -0.008578f, +0.009904f, +0.005580f, -0.001637f, -0.001120f, -0.014548f, -0.002287f, +0.001782f, -0.008710f, -0.003526f, + -0.005416f, +0.000984f, +0.001080f, -0.007568f, +0.000957f, -0.000622f, +0.000077f, -0.002593f, +0.001455f, -0.007941f, + -0.004242f, -0.000045f, -0.002966f, -0.003038f, -0.002868f, +0.005184f, +0.003547f, -0.000916f, +0.002398f, -0.003022f, + +0.000903f, +0.001653f, -0.000354f, -0.002814f, +0.000395f, -0.002002f + } + }, + { + { + -0.003573f, -0.081733f, -0.033613f, -0.048322f, +0.047765f, -0.011505f, -0.004872f, -0.006668f, +0.009166f, +0.008773f, + +0.017553f, -0.022748f, +0.011597f, -0.007788f, -0.044793f, -0.002946f, -0.041352f, -0.015513f, +0.008628f, -0.005137f, + -0.003417f, -0.004172f, +0.011452f, -0.004734f, +0.009196f, -0.001917f, -0.001851f, +0.001243f, +0.000542f, +0.011452f, + +0.015705f, -0.017771f, -0.003296f, +0.018516f, -0.000468f, -0.000935f, -0.004132f, +0.000067f, -0.000902f, -0.016444f, + +0.000638f, +0.006491f, -0.000600f, +0.004425f, +0.000977f, +0.004082f, +0.004180f, -0.023381f, +0.006404f, +0.002569f, + -0.008485f, -0.011973f, +0.001698f, -0.010077f, -0.003704f, +0.010446f, -0.001620f, -0.001600f, -0.001360f, -0.007403f, + -0.001193f, -0.002957f, -0.000488f, +0.003924f, -0.006726f, -0.001584f, +0.006027f, +0.006144f, +0.007628f, -0.001957f, + +0.001880f, +0.004030f, +0.002932f, -0.000348f, +0.000102f, -0.001361f, +0.003151f, -0.001057f, +0.000222f, -0.004455f, + -0.000721f, +0.002124f, +0.001844f, +0.004723f, +0.004218f, +0.000486f, +0.002231f, +0.002131f, -0.000116f, +0.000960f, + +0.001022f, +0.000533f, +0.003638f, +0.001681f, -0.000675f, +0.000127f + }, + { + +0.001325f, +0.258823f, -0.023265f, -0.066995f, -0.050062f, +0.001583f, +0.007162f, +0.011001f, +0.017679f, +0.013444f, + -0.000383f, +0.005400f, -0.007168f, +0.002107f, +0.030082f, -0.021303f, -0.014787f, +0.009969f, -0.010270f, -0.008774f, + -0.008140f, +0.008949f, +0.013683f, +0.001589f, +0.006284f, -0.006116f, +0.001496f, -0.001804f, -0.007914f, +0.006815f, + -0.004879f, -0.001371f, +0.006140f, -0.000221f, -0.009389f, -0.001773f, -0.003034f, +0.009226f, -0.001197f, +0.002465f, + +0.006257f, -0.003219f, -0.000156f, +0.005315f, -0.004608f, -0.007229f, -0.007910f, -0.007853f, +0.003950f, -0.004033f, + +0.002117f, -0.000781f, +0.000469f, -0.001346f, -0.000409f, -0.000068f, -0.006826f, -0.004326f, +0.000202f, -0.004211f, + -0.004835f, +0.007414f, +0.000440f, +0.009932f, +0.000985f, -0.006046f, -0.004355f, -0.001277f, -0.004188f, +0.008457f, + +0.000311f, +0.002304f, -0.007723f, -0.001404f, -0.000116f, -0.004000f, -0.005926f, -0.003495f, -0.000791f, -0.001529f, + +0.007104f, -0.003328f, +0.000034f, -0.006690f, +0.005657f, +0.002708f, +0.000115f, +0.001984f, +0.000280f, +0.000439f, + -0.004128f, +0.001724f, +0.000421f, +0.001923f, -0.001069f, -0.000385f + }, + { + +0.001785f, +0.108612f, -0.081131f, -0.111231f, +0.011833f, +0.001847f, +0.000748f, -0.001536f, +0.010987f, -0.000600f, + +0.003293f, -0.003315f, -0.010173f, -0.010070f, +0.002274f, -0.006817f, -0.001416f, +0.003580f, -0.000532f, -0.006772f, + +0.005847f, -0.022992f, -0.001714f, -0.012367f, +0.017074f, +0.012387f, -0.003752f, -0.014853f, -0.013834f, +0.016053f, + -0.006804f, -0.005026f, +0.004464f, +0.001606f, -0.002830f, -0.013943f, -0.004392f, +0.007239f, +0.006226f, -0.003479f, + +0.007111f, +0.009779f, -0.003280f, -0.001748f, -0.004537f, +0.003237f, +0.012180f, +0.001287f, -0.000203f, +0.010777f, + +0.006613f, +0.005059f, +0.005097f, +0.013998f, +0.007323f, +0.000385f, -0.004334f, -0.001898f, +0.008347f, -0.009771f, + -0.000800f, +0.000770f, +0.001646f, -0.000206f, +0.003864f, -0.000962f, +0.000807f, +0.005538f, -0.003132f, +0.004340f, + +0.001570f, +0.001393f, +0.000773f, +0.000171f, -0.000552f, +0.003152f, -0.001175f, +0.004212f, +0.008854f, -0.002093f, + -0.000404f, +0.001185f, -0.002581f, -0.001292f, -0.003088f, +0.001628f, +0.000077f, +0.001595f, +0.000798f, +0.001512f, + +0.002448f, +0.002498f, -0.000129f, +0.000235f, -0.001331f, +0.002435f + }, + { + -0.001320f, +0.026169f, -0.006234f, -0.013365f, +0.007838f, -0.005023f, -0.004119f, -0.001316f, -0.015499f, -0.006531f, + -0.007196f, +0.012125f, +0.008794f, -0.007501f, -0.004983f, -0.001045f, -0.008534f, +0.031487f, -0.033270f, -0.003853f, + +0.005365f, -0.022586f, +0.000962f, -0.011395f, -0.008865f, -0.006712f, +0.011636f, +0.006953f, -0.009030f, -0.017142f, + +0.001029f, +0.009818f, -0.008089f, +0.008143f, -0.008586f, +0.002942f, -0.004568f, +0.005127f, -0.011579f, +0.011939f, + +0.010797f, -0.012906f, +0.005816f, +0.003487f, -0.000342f, +0.000935f, -0.011898f, +0.004502f, -0.000313f, +0.012895f, + +0.010946f, -0.013571f, +0.007833f, +0.007803f, -0.011327f, +0.000183f, -0.004010f, -0.001010f, -0.008922f, +0.005820f, + +0.004211f, +0.001779f, +0.001608f, -0.000448f, +0.001318f, -0.005604f, +0.004396f, -0.005379f, -0.002523f, -0.000674f, + +0.000661f, -0.000524f, +0.002889f, +0.000787f, +0.002432f, -0.006242f, -0.001116f, +0.000787f, +0.004346f, -0.001130f, + -0.001672f, +0.000179f, +0.002715f, +0.000142f, -0.002718f, -0.001225f, +0.000399f, -0.001765f, -0.001392f, -0.001090f, + -0.000180f, -0.003002f, -0.000128f, -0.002313f, -0.000974f, -0.000921f + }, + { + -0.026569f, +0.002897f, +0.047517f, +0.015956f, -0.015614f, +0.016296f, -0.006972f, +0.028840f, -0.007182f, +0.028224f, + -0.006085f, -0.023276f, +0.004731f, -0.018243f, -0.004767f, -0.023180f, +0.026704f, +0.003335f, +0.016675f, -0.003237f, + -0.007670f, +0.010186f, +0.012429f, +0.004075f, +0.006531f, -0.005076f, +0.012776f, -0.002601f, -0.009714f, -0.011737f, + -0.004722f, +0.007143f, -0.001510f, +0.006030f, -0.016091f, -0.003156f, -0.011550f, -0.000682f, -0.004640f, +0.010333f, + -0.006114f, -0.007617f, -0.003055f, +0.007963f, +0.011570f, -0.003138f, -0.007478f, -0.006880f, +0.013535f, -0.001569f, + +0.009029f, +0.007101f, -0.004633f, -0.007309f, -0.007122f, +0.008654f, +0.002863f, -0.003118f, -0.005377f, -0.002418f, + -0.001214f, -0.001099f, -0.000535f, -0.000784f, -0.000166f, -0.006715f, +0.002057f, -0.004295f, -0.001820f, +0.002056f, + +0.004983f, +0.002565f, +0.009139f, -0.005805f, +0.001448f, -0.002858f, +0.000636f, +0.004393f, -0.000903f, -0.003407f, + -0.004701f, +0.002025f, -0.001598f, +0.002123f, -0.000001f, -0.000174f, +0.002660f, -0.002560f, +0.003635f, -0.000878f, + +0.001074f, +0.000726f, +0.000751f, +0.002078f, +0.000533f, +0.000186f + }, + { + +0.001069f, -0.085750f, +0.075918f, -0.005048f, +0.013694f, -0.002220f, -0.004348f, +0.007877f, -0.004145f, +0.004188f, + +0.005077f, +0.002977f, -0.005913f, +0.013373f, -0.019508f, -0.015649f, +0.011829f, -0.008588f, -0.007899f, -0.013484f, + -0.039278f, -0.026026f, +0.004474f, -0.042905f, +0.031716f, -0.000542f, -0.018453f, -0.002562f, +0.012390f, +0.026115f, + +0.006057f, -0.010971f, -0.001290f, +0.002061f, -0.014363f, +0.010857f, -0.004480f, -0.002023f, +0.023329f, +0.002886f, + +0.000102f, -0.008346f, +0.013612f, -0.001809f, +0.002565f, +0.011109f, -0.002537f, +0.000631f, -0.002949f, +0.015572f, + -0.006125f, +0.007126f, -0.010257f, -0.002577f, -0.005378f, -0.003610f, -0.003097f, +0.000584f, -0.005983f, +0.012886f, + +0.005402f, -0.004684f, -0.003283f, +0.000748f, -0.007821f, +0.006472f, +0.001524f, +0.010605f, +0.000772f, -0.006851f, + -0.000468f, -0.003691f, -0.000247f, +0.007473f, -0.001561f, +0.001220f, -0.002187f, -0.005675f, -0.003228f, -0.002158f, + +0.005769f, -0.004081f, -0.002473f, +0.003575f, -0.007005f, +0.000874f, +0.000366f, +0.002840f, -0.000085f, -0.002130f, + -0.000534f, -0.004214f, +0.001947f, -0.003388f, +0.001976f, +0.001537f + }, + { + -0.029805f, -0.026883f, +0.055853f, +0.065978f, -0.019727f, +0.008894f, +0.001145f, +0.010318f, +0.032826f, -0.007957f, + -0.023149f, +0.006535f, -0.000327f, -0.010631f, +0.024674f, -0.005443f, -0.016352f, -0.005469f, +0.000372f, -0.002550f, + -0.015086f, -0.009734f, +0.002058f, +0.006687f, -0.005374f, +0.020508f, +0.010790f, +0.004183f, +0.004441f, +0.010260f, + -0.001045f, -0.005620f, -0.014370f, -0.002101f, -0.000325f, -0.014970f, +0.004411f, -0.004681f, +0.013042f, -0.000819f, + +0.000792f, -0.000050f, +0.004896f, -0.003677f, +0.009011f, +0.002009f, -0.006840f, +0.002564f, -0.005307f, +0.005096f, + -0.010710f, +0.001513f, +0.000584f, -0.007483f, +0.000070f, -0.001698f, -0.008995f, +0.008781f, +0.012900f, -0.001173f, + -0.005840f, -0.008554f, +0.009403f, +0.008390f, -0.002092f, -0.002557f, -0.000761f, +0.002041f, +0.000374f, -0.000649f, + +0.002804f, +0.001267f, +0.000415f, +0.006803f, +0.003276f, -0.004921f, +0.000101f, +0.000946f, -0.000034f, +0.000963f, + +0.005499f, -0.001436f, +0.000337f, -0.000217f, -0.000215f, -0.000128f, +0.000295f, +0.003823f, +0.000061f, +0.001925f, + -0.000273f, +0.000091f, +0.002243f, -0.003175f, +0.002820f, -0.001711f + }, + { + +0.003763f, -0.065127f, +0.108393f, -0.009194f, +0.009940f, -0.008879f, -0.005875f, +0.000734f, -0.005205f, +0.002855f, + +0.001050f, +0.024859f, -0.008435f, +0.032258f, +0.011343f, -0.000722f, -0.009275f, +0.030237f, -0.013837f, -0.030145f, + -0.007778f, -0.005892f, -0.015662f, +0.017517f, -0.003297f, -0.016538f, +0.020485f, -0.008818f, +0.038873f, -0.031073f, + +0.024264f, +0.004120f, -0.008432f, +0.011442f, +0.004853f, -0.019504f, +0.021036f, -0.011550f, +0.000436f, +0.008508f, + +0.009595f, -0.003323f, +0.008814f, +0.003822f, +0.006095f, +0.007369f, +0.007900f, +0.015896f, -0.018240f, -0.007102f, + +0.000766f, -0.013052f, +0.000258f, +0.001247f, +0.000237f, +0.008171f, +0.007733f, -0.005258f, +0.000549f, -0.008982f, + +0.002593f, -0.007406f, -0.001220f, -0.004258f, +0.008002f, -0.010659f, +0.002889f, +0.003466f, +0.003546f, +0.001093f, + -0.000938f, +0.008998f, -0.007685f, -0.003020f, +0.003282f, +0.003324f, -0.003902f, -0.002400f, -0.000914f, -0.004694f, + -0.004414f, +0.001101f, +0.000480f, -0.002967f, +0.001487f, -0.001895f, -0.003470f, -0.000879f, +0.000037f, +0.001330f, + +0.001761f, +0.000040f, -0.004331f, +0.001492f, +0.002639f, -0.001078f + }, + { + -0.029270f, -0.038847f, +0.035887f, +0.075120f, -0.029438f, -0.007200f, -0.012619f, +0.020210f, -0.000073f, +0.012124f, + -0.008993f, -0.004835f, +0.005688f, -0.007550f, +0.011831f, -0.007079f, +0.040903f, -0.013913f, -0.017832f, +0.021697f, + +0.001257f, -0.007737f, +0.003521f, -0.022371f, +0.016746f, -0.003029f, +0.007882f, +0.000471f, -0.001836f, +0.007143f, + +0.005809f, +0.006592f, +0.011916f, -0.008535f, -0.005241f, -0.005149f, +0.012760f, -0.002724f, +0.001999f, +0.010335f, + +0.013866f, -0.010881f, +0.002737f, -0.002593f, +0.002547f, -0.000363f, +0.005686f, +0.018771f, -0.016996f, +0.004940f, + -0.005883f, +0.001454f, +0.002871f, -0.004533f, -0.000307f, -0.002632f, -0.007129f, -0.002298f, -0.009960f, -0.002767f, + -0.008234f, -0.009450f, +0.001135f, +0.000950f, -0.002143f, +0.001100f, -0.001714f, +0.001212f, -0.004490f, -0.002630f, + +0.004366f, +0.002267f, -0.000849f, +0.005744f, +0.003065f, +0.000618f, -0.002780f, -0.001159f, -0.003211f, +0.003474f, + -0.002613f, +0.004580f, -0.002649f, -0.001947f, -0.005756f, +0.001345f, -0.000018f, +0.000392f, -0.004423f, +0.002813f, + +0.001721f, -0.004745f, +0.001232f, -0.000462f, +0.000749f, -0.002460f + }, + { + -0.000135f, +0.111291f, -0.046999f, -0.022021f, -0.003252f, -0.004750f, +0.030936f, +0.005604f, -0.006536f, -0.000316f, + +0.000814f, -0.023667f, -0.013214f, +0.030520f, -0.009704f, +0.035665f, +0.026361f, -0.023788f, -0.002280f, -0.015218f, + +0.001374f, -0.011169f, +0.006066f, +0.001864f, +0.018760f, -0.010055f, +0.007834f, +0.004759f, +0.021412f, -0.030229f, + +0.000992f, -0.013566f, +0.013616f, -0.001190f, -0.024204f, +0.015446f, +0.006080f, -0.012025f, -0.007765f, +0.003252f, + +0.008054f, -0.005958f, +0.016455f, -0.000974f, -0.015756f, +0.014531f, +0.004041f, -0.001474f, +0.007097f, +0.002829f, + +0.005484f, -0.004250f, -0.008258f, +0.000791f, +0.009061f, -0.000860f, -0.006519f, +0.005965f, -0.004565f, +0.003907f, + -0.004756f, -0.006294f, +0.000501f, -0.001173f, -0.005041f, -0.002157f, -0.000481f, +0.002126f, -0.005769f, +0.000820f, + -0.006184f, +0.004631f, +0.001827f, +0.001613f, +0.003837f, -0.000927f, +0.003304f, +0.000539f, -0.004296f, -0.001295f, + -0.002322f, -0.004752f, +0.002209f, +0.003403f, +0.001756f, +0.004794f, +0.005003f, +0.007721f, +0.003767f, +0.001449f, + +0.002422f, -0.000605f, +0.002821f, -0.000561f, +0.000335f, -0.000358f + }, + { + -0.013478f, +0.100273f, +0.070821f, +0.018209f, -0.013814f, -0.024278f, +0.079866f, -0.020457f, -0.007669f, -0.059648f, + +0.002029f, +0.003142f, +0.007095f, +0.018241f, +0.017298f, +0.003490f, -0.004483f, -0.011010f, +0.020103f, -0.013258f, + -0.003403f, -0.016420f, -0.000697f, +0.000021f, +0.012276f, -0.008629f, -0.019665f, +0.003106f, +0.014059f, -0.011631f, + +0.004507f, +0.007244f, +0.003255f, +0.001312f, +0.007480f, +0.016850f, -0.008566f, +0.017650f, +0.018944f, +0.000506f, + +0.011173f, +0.004332f, -0.016009f, +0.005252f, -0.000878f, +0.014608f, +0.004065f, -0.002395f, +0.001421f, +0.001351f, + -0.012331f, -0.010714f, -0.012339f, +0.009681f, -0.000488f, -0.011228f, -0.005972f, -0.003241f, -0.012652f, -0.010061f, + +0.002401f, -0.003199f, +0.003310f, -0.014864f, -0.000972f, -0.004037f, -0.002726f, +0.003510f, +0.003594f, -0.003015f, + -0.007429f, -0.001194f, -0.003857f, -0.000378f, +0.003123f, -0.002079f, +0.002788f, +0.002902f, -0.004934f, +0.006452f, + -0.003894f, -0.009111f, +0.001008f, -0.003828f, +0.004368f, -0.001702f, +0.005139f, +0.002949f, +0.000520f, -0.000919f, + -0.000759f, +0.004668f, -0.005013f, +0.000796f, -0.002413f, +0.003014f + }, + { + -0.000995f, +0.035189f, -0.048727f, -0.001066f, +0.005145f, +0.016234f, -0.010840f, +0.004490f, -0.000504f, -0.005556f, + -0.025195f, +0.007076f, -0.010769f, -0.003365f, +0.035734f, +0.011821f, -0.024474f, +0.014824f, -0.005958f, -0.000370f, + -0.011656f, +0.011840f, -0.009526f, +0.004284f, -0.015120f, +0.000409f, +0.000546f, -0.019929f, +0.024872f, +0.013221f, + +0.021253f, -0.007297f, +0.005809f, -0.012765f, -0.000465f, +0.012226f, -0.008781f, -0.031851f, +0.014460f, +0.007338f, + +0.009485f, -0.002137f, -0.001521f, +0.009737f, -0.011103f, +0.007166f, -0.007664f, -0.000788f, -0.002524f, -0.011166f, + +0.013556f, +0.007821f, +0.003715f, -0.007414f, +0.002889f, +0.011178f, -0.007271f, -0.004566f, -0.007741f, +0.006851f, + -0.006912f, -0.003923f, -0.003981f, +0.001510f, +0.003198f, -0.006465f, -0.009795f, -0.001153f, -0.002994f, -0.012417f, + +0.000672f, +0.003258f, +0.003642f, -0.007788f, -0.001150f, +0.001597f, +0.001642f, +0.001026f, +0.000516f, +0.000600f, + -0.002345f, +0.000314f, +0.002249f, +0.000630f, -0.003723f, -0.000500f, -0.000160f, -0.002084f, +0.001896f, -0.002065f, + +0.001275f, +0.000101f, +0.001364f, -0.003693f, -0.002379f, +0.001189f + }, + { + -0.011118f, -0.253622f, -0.016353f, +0.014093f, +0.021331f, -0.027796f, +0.058390f, -0.005729f, +0.006352f, -0.005428f, + -0.020252f, +0.034169f, -0.006941f, +0.004112f, -0.029520f, -0.045344f, +0.011143f, -0.006528f, +0.016287f, +0.016790f, + +0.030494f, +0.004005f, +0.023619f, -0.009650f, -0.004597f, -0.005093f, -0.008704f, +0.016943f, -0.005567f, +0.013424f, + -0.011650f, +0.015600f, -0.004227f, +0.001562f, +0.010998f, -0.005726f, +0.013421f, -0.013386f, -0.000073f, -0.004740f, + -0.010189f, -0.012045f, +0.001148f, +0.012311f, +0.003527f, -0.002689f, -0.004276f, +0.010016f, +0.002870f, +0.003690f, + +0.011595f, -0.001135f, +0.010012f, -0.012125f, -0.004371f, -0.003662f, -0.008398f, -0.002067f, -0.009728f, -0.007076f, + +0.010628f, +0.008041f, +0.008950f, -0.002616f, -0.005955f, +0.001344f, -0.005220f, +0.003076f, -0.006737f, -0.001406f, + +0.005078f, -0.005295f, -0.002307f, -0.000455f, -0.006531f, +0.002866f, -0.008647f, -0.000112f, -0.006574f, +0.000287f, + +0.002399f, -0.002804f, +0.002684f, +0.000271f, +0.001383f, -0.002834f, +0.001892f, +0.000882f, +0.006728f, +0.001044f, + -0.000401f, +0.002677f, -0.001450f, +0.000210f, -0.001079f, +0.000211f + }, + { + -0.000424f, +0.132792f, -0.017521f, -0.016671f, +0.000808f, +0.011182f, -0.024495f, +0.000483f, -0.010725f, +0.008726f, + -0.003823f, -0.010735f, +0.000321f, +0.027862f, +0.077612f, +0.021166f, -0.041425f, -0.007251f, +0.014194f, -0.000650f, + -0.025202f, +0.038421f, -0.037178f, +0.032189f, -0.004174f, -0.025424f, -0.006757f, +0.004367f, +0.008035f, -0.003507f, + -0.020770f, -0.014119f, +0.005443f, -0.021312f, +0.005520f, +0.014373f, -0.014815f, +0.002948f, -0.000770f, +0.000238f, + +0.002800f, +0.008320f, +0.007133f, +0.014974f, +0.004079f, -0.003638f, -0.011905f, -0.002804f, +0.004465f, +0.004827f, + +0.006161f, -0.006469f, +0.006714f, +0.002506f, -0.008308f, +0.001393f, +0.002904f, -0.000669f, -0.002339f, +0.000277f, + +0.011181f, -0.012627f, -0.000765f, +0.003092f, +0.003319f, +0.004442f, -0.001641f, +0.003890f, -0.003261f, +0.002507f, + +0.005203f, -0.003789f, +0.000801f, +0.003907f, -0.005286f, +0.000305f, +0.002543f, +0.000680f, -0.003989f, -0.001167f, + +0.000634f, +0.005680f, -0.005050f, -0.005521f, +0.000473f, +0.004176f, -0.003060f, -0.003161f, +0.004925f, -0.003341f, + -0.001589f, +0.001386f, -0.001882f, -0.000990f, +0.000215f, -0.001813f + }, + { + -0.012044f, -0.207752f, -0.019262f, +0.020293f, -0.024489f, -0.030076f, +0.064274f, +0.005907f, -0.006587f, -0.006834f, + -0.019585f, +0.004371f, -0.024566f, +0.008014f, -0.032656f, +0.009310f, +0.012891f, -0.009088f, -0.004543f, +0.015965f, + -0.009087f, -0.014673f, +0.010468f, -0.000022f, -0.008693f, +0.010350f, +0.006297f, -0.002099f, -0.007414f, -0.020775f, + -0.001787f, +0.005867f, +0.012919f, +0.002126f, +0.014226f, -0.005990f, -0.004657f, -0.006167f, +0.019874f, +0.015167f, + +0.004831f, -0.005820f, +0.002726f, -0.019051f, -0.014358f, -0.001201f, -0.011345f, -0.013036f, -0.004678f, -0.004179f, + +0.011373f, +0.004729f, -0.011284f, -0.002462f, -0.000518f, -0.003979f, -0.005616f, -0.000352f, +0.014539f, +0.009811f, + -0.009123f, +0.008232f, +0.004762f, +0.005022f, +0.006368f, -0.003901f, +0.006896f, +0.010178f, -0.005127f, -0.002381f, + -0.005299f, +0.001564f, -0.001814f, +0.000433f, +0.006523f, -0.001517f, -0.000645f, -0.000486f, +0.003991f, -0.006671f, + -0.003248f, +0.002628f, -0.000581f, +0.000134f, -0.001946f, +0.003064f, +0.003284f, +0.000776f, +0.001192f, -0.002815f, + +0.001835f, +0.001498f, +0.002728f, -0.000719f, -0.000440f, +0.000053f + } + }, + { + { + -0.000466f, -0.125731f, -0.007070f, +0.023464f, -0.023260f, -0.008159f, -0.011378f, +0.000350f, +0.015998f, +0.008716f, + -0.000254f, +0.009272f, -0.009642f, -0.011709f, -0.026469f, -0.012563f, -0.035499f, -0.020960f, -0.017087f, +0.002091f, + +0.016799f, -0.017939f, -0.001200f, -0.008981f, +0.029746f, +0.000415f, -0.006214f, -0.004049f, -0.000808f, +0.033251f, + +0.005142f, -0.005748f, -0.009493f, +0.014125f, -0.008631f, +0.002500f, +0.004392f, +0.001132f, -0.005162f, -0.000981f, + -0.003970f, -0.005790f, +0.009000f, +0.005275f, +0.001249f, -0.000221f, +0.003364f, -0.008901f, -0.006345f, +0.000973f, + -0.007962f, -0.010050f, +0.004548f, -0.008790f, -0.000824f, +0.001828f, +0.001629f, -0.006388f, +0.002792f, -0.004975f, + -0.003498f, -0.003392f, +0.005198f, -0.001340f, -0.006409f, +0.004493f, -0.000894f, +0.007836f, +0.007898f, +0.002698f, + -0.002028f, -0.000326f, +0.005351f, +0.000665f, +0.001247f, -0.003040f, +0.005693f, -0.000915f, +0.001997f, -0.004546f, + -0.000498f, +0.005232f, +0.000767f, +0.004504f, +0.002255f, +0.000846f, +0.004860f, -0.001576f, +0.000928f, +0.000251f, + +0.002097f, -0.000845f, +0.005265f, -0.000384f, +0.000142f, +0.000450f + }, + { + -0.005551f, +0.252702f, +0.010507f, -0.153487f, +0.033990f, -0.000045f, +0.010190f, -0.000666f, +0.014739f, +0.010816f, + +0.020538f, -0.021089f, +0.001413f, +0.011067f, +0.005830f, -0.009888f, -0.006479f, -0.016010f, +0.002423f, -0.016785f, + +0.004747f, -0.001244f, +0.022520f, +0.018280f, -0.016806f, +0.004477f, -0.007874f, +0.000004f, +0.015002f, -0.002299f, + -0.010106f, -0.012292f, +0.016362f, -0.008304f, -0.004815f, -0.003829f, +0.003206f, -0.004115f, +0.011189f, -0.001423f, + +0.002680f, +0.003357f, -0.007091f, +0.005160f, -0.003632f, -0.000961f, -0.016560f, -0.002061f, +0.003211f, -0.001857f, + -0.001915f, +0.005134f, -0.001285f, -0.005877f, +0.000484f, -0.005882f, -0.002896f, -0.004947f, +0.007307f, -0.007374f, + -0.002578f, +0.005136f, +0.000795f, +0.001814f, +0.001964f, -0.001386f, -0.007309f, -0.000271f, +0.001557f, +0.005646f, + +0.000861f, +0.001600f, -0.003437f, -0.003289f, -0.001494f, -0.005274f, -0.004031f, -0.004452f, -0.001736f, +0.000692f, + +0.008093f, -0.005139f, +0.001641f, -0.004854f, +0.002973f, -0.001313f, +0.004428f, +0.000570f, +0.003077f, -0.001636f, + -0.004314f, +0.001326f, +0.001240f, +0.000300f, +0.001754f, -0.000729f + }, + { + +0.000634f, -0.014443f, -0.002122f, -0.078482f, -0.036740f, +0.001133f, +0.016370f, -0.005855f, +0.008625f, -0.017511f, + +0.022073f, -0.022728f, +0.010704f, -0.003988f, -0.016217f, -0.002519f, +0.001138f, +0.008082f, -0.007024f, -0.010579f, + -0.001713f, -0.012970f, -0.000315f, -0.020943f, +0.021173f, +0.003286f, +0.008443f, -0.016050f, -0.007697f, +0.011366f, + +0.003219f, -0.010500f, +0.000938f, -0.001236f, -0.007609f, -0.009776f, -0.011848f, +0.018403f, +0.000657f, -0.001229f, + +0.011515f, -0.004075f, +0.006572f, +0.003294f, -0.007726f, +0.002807f, +0.005184f, +0.005688f, +0.010965f, -0.005071f, + +0.013278f, +0.005822f, +0.011175f, +0.004566f, +0.017662f, -0.002586f, -0.002989f, -0.008717f, +0.003018f, -0.000325f, + -0.001376f, -0.002539f, -0.001474f, +0.003604f, +0.003519f, -0.004480f, +0.007262f, +0.002591f, -0.001172f, +0.005280f, + -0.003002f, +0.004150f, -0.001851f, +0.000489f, +0.004129f, -0.002187f, -0.001189f, +0.003651f, +0.003173f, -0.001360f, + -0.000873f, +0.001462f, +0.002044f, -0.004819f, -0.004398f, +0.003275f, +0.001581f, -0.000093f, +0.000863f, -0.000333f, + +0.004799f, +0.000781f, +0.000291f, +0.000181f, -0.000411f, +0.000582f + }, + { + +0.001449f, -0.066164f, +0.057274f, +0.009986f, -0.005861f, -0.007080f, -0.002207f, +0.002128f, -0.014265f, -0.021293f, + -0.006111f, +0.028666f, -0.000122f, +0.002289f, +0.006265f, -0.011253f, -0.019048f, +0.033346f, -0.032256f, -0.005234f, + -0.000959f, -0.013468f, -0.019639f, -0.001361f, -0.005479f, -0.020439f, +0.022856f, +0.009122f, -0.005871f, -0.008458f, + -0.014776f, +0.000945f, +0.008113f, -0.000909f, +0.004047f, +0.013563f, -0.017455f, +0.003132f, -0.002027f, +0.000365f, + +0.012264f, -0.006038f, +0.002779f, +0.000458f, +0.004383f, -0.008070f, +0.001197f, -0.003950f, +0.003682f, +0.014558f, + +0.011123f, -0.011888f, -0.001575f, +0.007306f, -0.006114f, -0.008129f, -0.001715f, -0.000849f, -0.004121f, +0.003897f, + +0.007190f, +0.000850f, -0.005762f, +0.001414f, +0.000808f, -0.006553f, +0.003268f, -0.001367f, +0.002940f, -0.008726f, + +0.002636f, -0.001409f, +0.002544f, +0.002909f, -0.002102f, -0.005385f, +0.002997f, +0.002082f, -0.001035f, +0.000529f, + -0.000461f, -0.002480f, +0.000300f, +0.003861f, -0.004156f, -0.002614f, +0.000475f, -0.000310f, -0.001926f, -0.000501f, + -0.001607f, +0.000182f, +0.000853f, -0.006260f, +0.001684f, -0.003676f + }, + { + +0.031131f, +0.081428f, -0.081883f, -0.010873f, +0.006902f, +0.011456f, +0.014306f, -0.005262f, +0.014844f, +0.008466f, + +0.014511f, -0.009352f, -0.010181f, -0.018360f, -0.017914f, +0.006799f, +0.017541f, -0.019653f, +0.035016f, +0.016263f, + +0.002704f, +0.000304f, -0.003517f, +0.004901f, +0.005664f, +0.006663f, -0.005908f, -0.001325f, -0.013502f, -0.009146f, + +0.009079f, -0.000409f, +0.002155f, -0.000321f, -0.012101f, -0.007678f, -0.004756f, -0.002312f, -0.001413f, +0.003310f, + -0.002327f, -0.004177f, +0.005550f, -0.001626f, +0.006052f, -0.000677f, -0.003194f, -0.001500f, +0.005463f, -0.005411f, + +0.019122f, +0.004328f, -0.011823f, -0.002738f, -0.005432f, +0.006925f, -0.001366f, -0.001958f, -0.004805f, +0.002585f, + -0.002792f, -0.000429f, +0.005687f, -0.008829f, -0.001918f, -0.000310f, -0.003000f, -0.003650f, -0.001245f, -0.001049f, + +0.006688f, +0.004172f, +0.003166f, +0.000831f, -0.005186f, -0.001640f, +0.006680f, +0.001023f, -0.003098f, -0.003014f, + -0.003358f, -0.003009f, +0.006595f, -0.002039f, +0.001339f, +0.001972f, -0.001210f, +0.000397f, -0.000077f, +0.000971f, + -0.000415f, -0.000150f, +0.002389f, +0.000695f, +0.003134f, -0.000501f + }, + { + -0.004639f, +0.019209f, -0.035066f, +0.007517f, +0.019851f, -0.005507f, -0.000902f, -0.001382f, -0.001791f, +0.013878f, + -0.008086f, +0.010793f, -0.006078f, -0.004265f, -0.011763f, +0.008741f, -0.009830f, +0.000823f, -0.010695f, -0.022081f, + -0.035597f, -0.020513f, -0.013737f, -0.018810f, +0.011923f, +0.014659f, -0.005328f, -0.009284f, -0.005478f, +0.046684f, + -0.009035f, +0.006704f, -0.001440f, -0.007880f, -0.008403f, +0.007371f, -0.007746f, +0.009281f, +0.009962f, +0.004351f, + -0.008944f, -0.003049f, +0.007014f, -0.001202f, +0.010589f, +0.005999f, -0.004149f, +0.002544f, -0.003462f, +0.009383f, + -0.002757f, -0.002374f, -0.000410f, -0.003063f, -0.004936f, -0.003391f, -0.003848f, -0.000010f, -0.003239f, +0.008723f, + +0.009500f, -0.001086f, -0.004332f, -0.001861f, -0.005627f, +0.005975f, +0.002708f, +0.004611f, +0.000932f, -0.002760f, + -0.000151f, -0.002237f, +0.001468f, +0.002019f, +0.002292f, -0.000728f, -0.002993f, -0.006861f, -0.001328f, -0.001510f, + +0.007715f, -0.006027f, -0.001929f, +0.001702f, -0.002549f, -0.005616f, +0.004830f, +0.001284f, +0.001260f, -0.003114f, + -0.003902f, +0.000401f, +0.000907f, -0.002406f, -0.000724f, +0.003676f + }, + { + +0.033754f, +0.019182f, -0.031750f, +0.003452f, +0.032885f, +0.003072f, +0.005864f, +0.007524f, +0.024068f, +0.004037f, + -0.002227f, -0.034886f, +0.000907f, +0.015578f, +0.015097f, -0.011424f, -0.010408f, +0.006771f, -0.014069f, -0.004825f, + -0.012585f, +0.006779f, -0.002813f, -0.009250f, +0.018822f, +0.011074f, +0.022618f, -0.011231f, +0.019476f, +0.001954f, + +0.013646f, -0.017988f, -0.009966f, -0.005966f, -0.007953f, -0.000315f, -0.003898f, +0.001456f, +0.008782f, -0.004449f, + +0.002551f, -0.000695f, +0.000033f, +0.009155f, +0.004641f, +0.005544f, -0.003830f, -0.007811f, -0.000388f, +0.002611f, + +0.006349f, -0.009978f, -0.004924f, +0.000146f, -0.003670f, +0.008469f, -0.007200f, +0.006504f, +0.005673f, +0.002676f, + -0.011737f, -0.002620f, +0.004452f, +0.006017f, +0.006376f, -0.003075f, -0.002326f, +0.003423f, -0.002853f, +0.005257f, + -0.003281f, +0.003585f, +0.004725f, +0.000449f, +0.001537f, -0.002265f, +0.000682f, -0.000346f, +0.002383f, +0.001617f, + +0.001334f, +0.000825f, +0.001285f, -0.004273f, +0.000443f, +0.004671f, -0.002984f, +0.003140f, +0.004351f, +0.000042f, + -0.002534f, -0.000411f, +0.001346f, +0.000389f, -0.000274f, -0.000511f + }, + { + -0.005606f, +0.086721f, -0.048725f, +0.001654f, +0.013303f, -0.000273f, -0.009083f, +0.001177f, -0.007869f, -0.002175f, + -0.005511f, +0.019531f, +0.023983f, +0.007285f, +0.000756f, +0.036379f, -0.026669f, +0.010145f, -0.033189f, -0.015824f, + -0.001903f, -0.010462f, -0.006303f, +0.022239f, -0.020287f, +0.007977f, +0.005737f, -0.011950f, +0.017611f, +0.003055f, + -0.005067f, +0.010434f, +0.003687f, +0.004018f, +0.002061f, -0.002344f, -0.001258f, -0.005304f, -0.008317f, +0.009780f, + +0.007101f, +0.000938f, +0.006434f, +0.005541f, +0.006255f, +0.002126f, +0.016071f, +0.002958f, -0.008056f, -0.001606f, + -0.008087f, -0.009263f, +0.004868f, -0.010370f, +0.001495f, +0.007666f, +0.007610f, -0.000982f, -0.001870f, -0.002833f, + -0.008926f, -0.000635f, -0.005246f, +0.002705f, -0.001229f, -0.004603f, +0.001361f, +0.007104f, +0.001519f, +0.000824f, + -0.002992f, +0.000821f, -0.002814f, -0.003417f, +0.001048f, +0.007341f, -0.003767f, -0.000155f, -0.004904f, -0.005135f, + -0.005486f, +0.000577f, -0.000116f, +0.000613f, -0.001843f, +0.001437f, -0.002992f, -0.004627f, +0.001630f, +0.001754f, + +0.000553f, +0.000542f, -0.003363f, +0.001841f, +0.001564f, -0.001229f + }, + { + +0.033490f, -0.006765f, -0.037810f, +0.012394f, +0.021632f, -0.011869f, -0.003561f, +0.003530f, +0.008811f, -0.000771f, + +0.009858f, -0.015902f, -0.012274f, +0.029659f, -0.007983f, +0.034473f, -0.010938f, -0.000612f, -0.018741f, +0.009373f, + +0.012605f, -0.020947f, +0.013535f, -0.011729f, -0.003124f, +0.015649f, -0.011868f, +0.010379f, -0.003778f, +0.003344f, + +0.001687f, +0.006425f, +0.006959f, -0.007595f, +0.001058f, -0.002429f, +0.014301f, -0.011559f, +0.016277f, -0.002393f, + +0.010188f, -0.005803f, +0.000827f, +0.001022f, +0.003980f, +0.001813f, -0.001815f, +0.009581f, -0.004388f, +0.000770f, + -0.000817f, +0.001319f, -0.002574f, -0.005490f, +0.003393f, -0.004041f, -0.000707f, -0.003343f, -0.005835f, -0.013803f, + -0.000458f, -0.003076f, -0.009481f, +0.000519f, -0.005373f, +0.007533f, +0.001067f, -0.002425f, +0.000097f, -0.002178f, + -0.000754f, +0.000672f, +0.004025f, +0.000962f, +0.006358f, -0.004635f, +0.003421f, -0.002291f, +0.000887f, -0.001609f, + -0.000258f, +0.001961f, +0.000152f, -0.003276f, -0.003823f, +0.002341f, -0.000516f, -0.000484f, -0.000184f, -0.000133f, + +0.000229f, -0.002340f, -0.000808f, +0.002413f, -0.003053f, +0.000801f + }, + { + +0.000857f, -0.005759f, +0.057178f, -0.022825f, -0.007007f, -0.011499f, +0.042927f, -0.011027f, +0.006543f, -0.012257f, + -0.004821f, -0.028397f, +0.002481f, +0.015719f, +0.010343f, +0.009572f, +0.040383f, -0.021545f, +0.009590f, -0.022300f, + -0.011068f, -0.006652f, +0.001309f, +0.019804f, +0.016871f, -0.004090f, -0.002773f, +0.007545f, +0.017787f, -0.012773f, + -0.021427f, +0.002816f, +0.006791f, +0.011158f, -0.021727f, -0.002948f, +0.007293f, -0.017090f, +0.000134f, -0.005739f, + +0.004629f, -0.003871f, +0.014828f, -0.000318f, +0.009121f, -0.010676f, +0.011022f, -0.010428f, +0.011231f, +0.001438f, + +0.008647f, -0.005162f, -0.008287f, -0.005196f, -0.002254f, +0.011855f, -0.005316f, +0.003669f, -0.006141f, +0.006841f, + -0.005884f, +0.002327f, -0.008622f, +0.001853f, -0.005564f, +0.001911f, -0.004583f, +0.000387f, +0.001553f, -0.006862f, + -0.002341f, +0.003455f, -0.003930f, +0.002762f, +0.004247f, +0.002067f, -0.000138f, -0.001929f, -0.000611f, -0.003586f, + -0.000737f, -0.000758f, -0.003885f, +0.006756f, +0.003630f, +0.005610f, +0.001277f, +0.007934f, +0.003930f, +0.002306f, + -0.000182f, -0.000844f, +0.003749f, +0.001899f, -0.000367f, -0.000276f + }, + { + +0.015756f, +0.202496f, -0.046292f, -0.006937f, -0.005308f, +0.017654f, +0.000606f, -0.011287f, +0.015754f, -0.039307f, + -0.025350f, +0.000632f, +0.002420f, +0.010670f, +0.023221f, +0.013406f, -0.009630f, -0.024702f, +0.011628f, -0.006029f, + +0.001054f, -0.010706f, -0.003813f, +0.004317f, +0.004587f, -0.003566f, -0.021760f, +0.005730f, +0.012507f, -0.011734f, + +0.003266f, -0.007832f, +0.014517f, +0.001533f, +0.016941f, -0.011531f, +0.013870f, +0.007955f, +0.016894f, +0.007120f, + -0.001041f, +0.003883f, -0.013335f, +0.003707f, +0.004586f, +0.009723f, +0.008731f, -0.005557f, +0.000306f, -0.003232f, + -0.013856f, -0.004988f, -0.008710f, -0.004028f, +0.000954f, -0.007950f, -0.004624f, -0.004783f, -0.016944f, -0.002785f, + -0.004289f, +0.005863f, -0.002693f, -0.006698f, -0.003048f, -0.010286f, -0.003696f, +0.008020f, +0.001740f, -0.002636f, + -0.006052f, -0.000096f, +0.001774f, -0.001150f, -0.003383f, +0.001526f, +0.000648f, +0.003832f, -0.004651f, +0.006702f, + -0.002133f, -0.005660f, -0.007273f, +0.003770f, -0.003444f, +0.003563f, +0.000855f, +0.004402f, -0.000555f, +0.000852f, + -0.000513f, +0.002582f, -0.005351f, +0.003225f, -0.000268f, -0.002014f + }, + { + +0.000459f, -0.059531f, +0.031728f, -0.017425f, +0.019203f, +0.001344f, +0.004375f, +0.003565f, +0.000343f, -0.007046f, + -0.027415f, -0.000400f, -0.010188f, +0.009531f, +0.001392f, +0.022827f, +0.003858f, +0.017728f, -0.021256f, -0.008819f, + -0.004504f, +0.017309f, -0.007174f, +0.018370f, -0.032052f, -0.004813f, +0.006609f, -0.007376f, +0.024918f, +0.006986f, + -0.000440f, +0.009255f, -0.008691f, +0.010881f, +0.010486f, -0.004626f, -0.017144f, -0.002504f, +0.005955f, +0.007355f, + +0.018879f, +0.003162f, -0.002895f, +0.007928f, +0.001962f, -0.010242f, -0.005408f, +0.007324f, -0.002763f, -0.000176f, + +0.012545f, +0.002817f, +0.004094f, -0.012102f, +0.005598f, +0.000418f, +0.001768f, -0.012076f, -0.006773f, +0.004681f, + +0.001595f, -0.010556f, +0.003189f, -0.000964f, +0.003543f, +0.001655f, -0.015394f, -0.002389f, -0.004916f, -0.008560f, + +0.001216f, +0.001365f, +0.005375f, -0.010938f, -0.003323f, +0.007657f, -0.001704f, -0.001561f, +0.005739f, -0.003963f, + -0.003547f, +0.004832f, +0.001345f, -0.003195f, -0.003903f, +0.000337f, +0.001102f, -0.001396f, -0.000095f, -0.000074f, + +0.000194f, +0.002172f, -0.000924f, -0.000393f, -0.004058f, +0.001238f + }, + { + +0.008256f, -0.253050f, +0.004243f, -0.028030f, -0.001671f, +0.025857f, +0.012985f, +0.011478f, -0.017087f, +0.014383f, + -0.014168f, +0.013539f, -0.020065f, +0.003447f, -0.026630f, -0.035319f, +0.003448f, -0.003644f, +0.012934f, +0.019010f, + +0.027529f, +0.004293f, +0.006947f, +0.019595f, -0.017465f, +0.008048f, -0.018151f, -0.002664f, +0.015938f, +0.012417f, + -0.001748f, +0.006829f, -0.009514f, +0.000347f, +0.011734f, -0.003151f, +0.005438f, -0.005063f, -0.010387f, -0.007649f, + +0.003718f, -0.019772f, +0.003129f, +0.011542f, +0.012106f, -0.016698f, +0.000731f, -0.001769f, +0.019663f, -0.001195f, + +0.013572f, +0.007819f, -0.001402f, -0.008097f, +0.001311f, -0.013392f, +0.003805f, -0.015946f, -0.011747f, +0.001346f, + +0.010202f, +0.004968f, +0.003242f, +0.003900f, -0.002008f, -0.003897f, +0.001663f, +0.002944f, -0.007333f, -0.002981f, + +0.001975f, -0.000465f, -0.000940f, -0.001384f, -0.008932f, +0.005973f, -0.000681f, +0.002019f, -0.009431f, +0.000412f, + -0.003206f, +0.000691f, +0.001040f, +0.006346f, -0.000299f, -0.005069f, +0.000124f, +0.000626f, +0.003440f, +0.006846f, + -0.000176f, +0.001428f, +0.001193f, -0.000904f, -0.000266f, -0.001134f + }, + { + +0.000273f, +0.078636f, +0.022373f, -0.025053f, +0.001286f, +0.005855f, -0.017354f, -0.007741f, +0.013481f, -0.006040f, + +0.003702f, -0.009258f, +0.014230f, -0.005433f, +0.116881f, -0.003623f, -0.041405f, -0.003910f, +0.026436f, +0.015024f, + -0.012312f, +0.007192f, -0.012219f, +0.015877f, -0.014794f, +0.002388f, -0.022345f, +0.001985f, +0.014968f, -0.021582f, + -0.010782f, -0.011540f, +0.001094f, -0.009966f, +0.018212f, -0.006524f, -0.010096f, +0.002629f, +0.008374f, +0.001238f, + -0.000722f, +0.007617f, +0.010124f, +0.013616f, -0.005674f, -0.000609f, -0.007462f, -0.007276f, +0.001599f, +0.002496f, + +0.008689f, -0.006327f, +0.004520f, -0.000539f, -0.009164f, +0.010269f, +0.000664f, +0.000186f, -0.001675f, +0.008982f, + +0.008291f, -0.010642f, -0.009801f, +0.005859f, +0.002091f, +0.007718f, -0.001758f, +0.000643f, -0.001466f, -0.002106f, + +0.007283f, +0.001339f, -0.004854f, +0.001993f, -0.001138f, -0.000869f, -0.001606f, +0.001697f, -0.004012f, +0.000882f, + +0.005333f, +0.000401f, -0.003962f, -0.003876f, -0.002097f, +0.001565f, +0.003868f, -0.003236f, +0.000217f, -0.000230f, + -0.004210f, +0.003321f, -0.001249f, -0.002403f, +0.003179f, -0.009035f + }, + { + +0.010918f, -0.187265f, -0.046800f, +0.012151f, -0.018121f, +0.000435f, +0.013562f, +0.018913f, -0.019486f, +0.004714f, + -0.004506f, -0.020189f, -0.011774f, -0.031200f, +0.009339f, +0.007138f, +0.000954f, +0.004252f, +0.009667f, -0.008479f, + +0.017823f, -0.028090f, +0.025225f, -0.004373f, +0.003158f, +0.008016f, +0.000593f, -0.008115f, +0.003408f, -0.009577f, + -0.009827f, -0.013145f, +0.005100f, +0.009808f, +0.022963f, -0.010741f, -0.010244f, +0.006871f, +0.024511f, +0.010035f, + -0.001633f, +0.003588f, -0.009219f, -0.009548f, -0.006825f, -0.015559f, -0.009843f, +0.003400f, -0.008293f, +0.004630f, + +0.005054f, +0.004281f, -0.010944f, -0.005973f, -0.000413f, -0.006698f, +0.000600f, +0.004574f, +0.006713f, +0.003737f, + -0.001594f, +0.005449f, +0.004126f, +0.006412f, +0.002252f, +0.005044f, +0.007942f, +0.009541f, -0.009109f, -0.000575f, + -0.004672f, +0.002742f, +0.002028f, +0.004407f, +0.001875f, -0.005194f, -0.000073f, +0.002163f, -0.000052f, -0.004233f, + -0.004103f, +0.007167f, -0.000966f, -0.003533f, +0.001110f, -0.001013f, +0.004286f, +0.002219f, -0.000863f, -0.000699f, + +0.000767f, -0.000866f, +0.003467f, +0.002362f, +0.000544f, +0.001945f + } + }, + { + { + +0.002779f, -0.034787f, +0.068367f, +0.054749f, -0.018390f, +0.002452f, -0.005483f, +0.006023f, +0.008923f, +0.005565f, + +0.000998f, +0.009690f, +0.004957f, +0.002540f, -0.006828f, +0.003849f, -0.031761f, -0.033772f, -0.033187f, -0.004754f, + +0.014253f, -0.019371f, +0.013276f, -0.005083f, +0.001304f, -0.010803f, +0.012086f, +0.005602f, +0.002272f, +0.019209f, + +0.002284f, +0.004573f, -0.005111f, +0.013399f, -0.012277f, -0.001178f, +0.014240f, +0.004619f, -0.002687f, +0.013572f, + +0.001753f, -0.000768f, +0.000895f, -0.001340f, +0.011024f, -0.003597f, +0.007449f, +0.009827f, -0.007029f, -0.009364f, + -0.011631f, -0.004780f, +0.004563f, -0.000692f, +0.004815f, -0.010118f, -0.004912f, -0.002384f, +0.005766f, +0.000836f, + -0.003067f, -0.003225f, +0.009432f, -0.003987f, -0.002973f, +0.008377f, -0.002308f, +0.002944f, +0.001051f, +0.001487f, + -0.001560f, -0.003405f, +0.003747f, +0.002965f, +0.002566f, -0.004148f, +0.002223f, -0.001638f, +0.005346f, +0.000061f, + +0.002070f, +0.007567f, -0.000464f, +0.001726f, -0.001430f, -0.000130f, +0.004850f, -0.003119f, +0.000181f, +0.002788f, + +0.001634f, -0.004951f, +0.000290f, -0.003784f, -0.000136f, +0.002010f + }, + { + +0.013126f, +0.229410f, -0.012127f, -0.114628f, +0.090216f, +0.011521f, -0.006574f, -0.034168f, +0.002653f, +0.003229f, + +0.018022f, -0.026729f, -0.001323f, +0.003100f, -0.010539f, -0.012578f, -0.008633f, -0.018373f, +0.001637f, -0.016998f, + +0.018152f, +0.002624f, +0.018733f, +0.004590f, -0.023954f, +0.021587f, -0.000315f, -0.011393f, +0.006651f, -0.008398f, + -0.009590f, -0.015016f, +0.017275f, +0.001421f, +0.006946f, +0.008344f, +0.009147f, -0.015118f, -0.006857f, -0.008830f, + +0.000231f, +0.004952f, -0.007700f, +0.000193f, +0.000795f, +0.004414f, -0.004447f, +0.007923f, +0.001669f, -0.004017f, + -0.008095f, -0.004355f, -0.002513f, -0.000212f, +0.001075f, -0.011333f, +0.001951f, -0.001230f, +0.001829f, -0.004132f, + +0.002335f, +0.002400f, +0.000569f, -0.000515f, -0.003910f, +0.000604f, -0.001058f, +0.001631f, -0.000265f, +0.003225f, + -0.001295f, -0.000855f, -0.001369f, -0.003291f, -0.000617f, -0.000440f, +0.001828f, -0.000388f, +0.005298f, +0.001745f, + +0.002315f, -0.004680f, +0.002635f, -0.002599f, +0.000301f, -0.007184f, +0.004890f, +0.000981f, +0.001304f, -0.000202f, + -0.002229f, +0.001151f, -0.000959f, -0.001973f, +0.001551f, +0.000402f + }, + { + +0.000288f, -0.162622f, -0.084476f, +0.028560f, +0.017012f, -0.003575f, +0.012440f, -0.015021f, -0.004354f, -0.015455f, + +0.011252f, -0.036488f, +0.027489f, +0.014645f, +0.000812f, +0.006885f, +0.001368f, -0.002785f, -0.012622f, +0.004942f, + +0.013029f, -0.009399f, -0.008118f, -0.009106f, +0.011266f, -0.021899f, +0.002717f, -0.014860f, -0.009194f, +0.015187f, + +0.028729f, +0.002403f, -0.014188f, -0.012732f, +0.009652f, +0.008343f, +0.002675f, +0.024838f, -0.009946f, -0.004671f, + +0.013591f, -0.004692f, +0.000459f, -0.008250f, -0.000511f, +0.007557f, -0.009936f, -0.003532f, +0.011735f, -0.006544f, + +0.002114f, -0.000634f, +0.010487f, -0.005201f, +0.012927f, -0.000410f, +0.002782f, -0.006662f, -0.003236f, -0.001001f, + -0.000535f, -0.000736f, +0.000318f, +0.000369f, -0.003924f, -0.007391f, +0.002259f, -0.004275f, -0.000952f, +0.004168f, + -0.007180f, +0.003898f, -0.000696f, -0.003853f, +0.002793f, -0.004444f, -0.003303f, -0.001499f, -0.002523f, -0.000460f, + -0.000365f, +0.000821f, +0.001604f, -0.003797f, -0.001164f, +0.002652f, -0.001517f, -0.003509f, -0.002156f, -0.000922f, + +0.003359f, -0.002914f, -0.002265f, -0.000479f, -0.000112f, +0.000631f + }, + { + +0.000647f, -0.106520f, +0.025742f, +0.026254f, -0.003288f, -0.004843f, +0.003005f, +0.006731f, -0.000408f, -0.007004f, + -0.009913f, +0.025657f, -0.002464f, +0.003902f, +0.017903f, -0.007469f, -0.031331f, +0.019332f, -0.019519f, -0.000152f, + +0.006059f, +0.006644f, -0.009326f, +0.008211f, +0.002755f, -0.032794f, +0.007880f, +0.018193f, -0.001009f, -0.006416f, + -0.003274f, -0.005920f, +0.005555f, -0.005588f, -0.001070f, +0.011050f, -0.005265f, +0.016527f, +0.009609f, -0.009340f, + +0.003082f, -0.009549f, -0.002453f, +0.000229f, +0.006115f, +0.001757f, -0.000458f, -0.000511f, +0.007681f, -0.007260f, + +0.002003f, -0.002133f, -0.002448f, -0.004982f, -0.006600f, +0.003428f, +0.001166f, -0.001285f, +0.000587f, -0.000694f, + +0.003284f, +0.001380f, -0.006859f, +0.002891f, +0.001456f, -0.008046f, +0.005792f, +0.002784f, +0.008087f, -0.004339f, + +0.003238f, -0.001730f, +0.002841f, +0.001571f, -0.000485f, -0.000533f, -0.000933f, -0.002476f, -0.002816f, +0.001170f, + +0.002004f, -0.002125f, -0.000332f, +0.004068f, -0.003440f, -0.002642f, +0.001725f, +0.000611f, -0.004228f, -0.000440f, + -0.000496f, +0.001010f, +0.001028f, -0.002135f, +0.004974f, -0.003833f + }, + { + -0.032339f, +0.073068f, -0.012460f, -0.025593f, -0.017569f, +0.003431f, +0.008094f, -0.026695f, -0.010208f, -0.002320f, + +0.029278f, -0.006208f, -0.007655f, -0.010548f, -0.010396f, +0.023114f, +0.018477f, -0.028938f, +0.040739f, +0.039646f, + +0.010267f, +0.000551f, -0.015182f, -0.018647f, -0.001406f, +0.006620f, -0.009372f, +0.010090f, +0.000715f, -0.001398f, + +0.011360f, -0.015149f, -0.001374f, -0.001394f, -0.009512f, +0.000998f, +0.007412f, +0.009608f, +0.009894f, +0.004494f, + +0.006518f, +0.003137f, +0.009441f, -0.006757f, -0.004816f, -0.000452f, +0.001777f, +0.000398f, +0.000316f, -0.006546f, + +0.013469f, +0.005176f, -0.004211f, +0.002444f, +0.001150f, +0.001522f, -0.006408f, +0.002933f, +0.001106f, +0.003566f, + -0.007128f, -0.004782f, +0.006734f, -0.002494f, +0.004184f, +0.000425f, -0.008288f, -0.002713f, -0.003025f, -0.003389f, + +0.002652f, -0.001484f, -0.004106f, +0.002018f, -0.003137f, -0.002498f, +0.006162f, -0.000896f, +0.001431f, +0.004009f, + -0.000126f, -0.003960f, +0.004687f, +0.000446f, +0.002373f, +0.003136f, +0.002390f, +0.001739f, -0.001817f, +0.001493f, + +0.001263f, -0.001676f, -0.003422f, -0.001215f, +0.002887f, +0.000610f + }, + { + +0.000161f, +0.046753f, -0.042440f, -0.003481f, +0.001547f, -0.003964f, +0.001006f, -0.005170f, +0.003875f, +0.019340f, + -0.003822f, +0.018668f, -0.009954f, -0.020352f, -0.011710f, -0.007144f, -0.038271f, -0.010065f, -0.009154f, -0.001139f, + -0.005927f, +0.003230f, -0.000611f, -0.006341f, +0.009010f, +0.016773f, +0.004814f, -0.007061f, -0.019337f, +0.023640f, + -0.022372f, +0.005053f, -0.001236f, -0.009674f, -0.008817f, -0.001858f, -0.015841f, +0.003066f, -0.006773f, -0.007286f, + -0.013093f, -0.003543f, +0.005142f, -0.006734f, +0.002152f, -0.001409f, -0.002914f, +0.001088f, -0.000694f, +0.001029f, + -0.011573f, -0.001619f, +0.004136f, -0.003639f, -0.000316f, -0.000774f, -0.003571f, +0.004885f, -0.001493f, +0.008692f, + +0.016670f, +0.004528f, -0.000800f, +0.001760f, -0.003250f, +0.000338f, -0.003582f, +0.000153f, +0.003703f, +0.000056f, + -0.000395f, -0.001534f, +0.002339f, -0.002129f, -0.001780f, -0.000877f, -0.003557f, -0.003222f, +0.004027f, -0.001778f, + +0.006297f, -0.002251f, -0.001548f, +0.001523f, +0.001379f, -0.005081f, +0.004589f, -0.001233f, +0.000150f, -0.003022f, + -0.004808f, +0.001242f, +0.003581f, +0.000556f, -0.003241f, +0.000748f + }, + { + -0.031616f, +0.004171f, +0.055720f, -0.012970f, -0.001912f, -0.002699f, +0.007151f, +0.004118f, +0.005572f, -0.004886f, + +0.019424f, -0.032444f, +0.009721f, +0.037078f, +0.012639f, -0.001079f, -0.006975f, -0.005031f, -0.007941f, +0.013708f, + -0.006919f, +0.005537f, +0.018062f, +0.004651f, +0.011766f, +0.000413f, +0.022392f, -0.008779f, +0.013065f, -0.007175f, + +0.012082f, -0.021475f, -0.004415f, -0.005830f, -0.006933f, +0.010433f, -0.004565f, -0.008388f, +0.002742f, -0.004192f, + +0.012332f, +0.004180f, +0.000389f, +0.015356f, -0.000701f, +0.003755f, +0.001741f, -0.003059f, +0.011570f, +0.010840f, + +0.007822f, -0.007358f, +0.000593f, +0.001600f, -0.005899f, +0.015758f, +0.002949f, +0.002925f, -0.000809f, +0.001843f, + -0.004935f, +0.002011f, +0.000980f, +0.001887f, +0.006793f, +0.003261f, +0.001009f, +0.000891f, +0.002155f, +0.010542f, + -0.002160f, +0.002119f, -0.001695f, -0.005932f, +0.003848f, +0.001797f, +0.001021f, -0.003126f, -0.001764f, -0.002321f, + -0.000680f, +0.001573f, +0.004128f, -0.002920f, +0.000540f, +0.006964f, -0.005041f, +0.000538f, +0.001881f, -0.001644f, + -0.002068f, +0.001248f, +0.001424f, -0.001598f, -0.000802f, +0.001964f + }, + { + -0.002980f, +0.051164f, -0.106722f, -0.005785f, -0.003325f, +0.004115f, -0.003836f, +0.002517f, -0.012197f, -0.003898f, + -0.010134f, +0.000034f, +0.022549f, +0.014778f, -0.011895f, +0.017548f, -0.023992f, +0.000556f, -0.029735f, -0.003151f, + -0.003804f, -0.012766f, -0.011415f, +0.013859f, -0.038019f, +0.002978f, +0.003042f, -0.036358f, -0.012445f, +0.005333f, + -0.002609f, +0.012468f, +0.000572f, -0.001156f, -0.007183f, +0.000066f, -0.003780f, -0.009213f, -0.022857f, -0.000080f, + -0.004765f, -0.009516f, -0.006484f, +0.003464f, +0.004425f, -0.004231f, +0.016770f, +0.002814f, +0.005005f, +0.007444f, + -0.008127f, -0.014808f, +0.008414f, -0.003531f, -0.004455f, -0.002855f, +0.000448f, -0.003181f, -0.001006f, -0.001415f, + -0.011047f, +0.005857f, +0.001903f, +0.007869f, +0.000165f, +0.001294f, +0.001052f, -0.000636f, -0.004069f, +0.002945f, + -0.002112f, -0.001158f, +0.001347f, -0.000753f, +0.000904f, +0.004755f, -0.004521f, +0.002865f, -0.003278f, -0.002183f, + -0.005286f, -0.001806f, +0.001003f, +0.002520f, +0.000103f, +0.000592f, -0.002543f, -0.003133f, -0.000018f, -0.000358f, + -0.001530f, -0.000260f, -0.002082f, -0.001249f, -0.000173f, +0.001239f + }, + { + -0.032962f, -0.017536f, +0.054289f, -0.018492f, -0.010057f, -0.001358f, +0.000944f, -0.009297f, -0.006956f, -0.005455f, + +0.043093f, +0.008565f, -0.012551f, +0.040225f, -0.008940f, +0.018775f, -0.054045f, -0.019893f, -0.025664f, -0.007817f, + +0.007069f, -0.018699f, +0.013958f, -0.010964f, -0.007038f, +0.014319f, -0.019341f, +0.008906f, -0.017172f, -0.009405f, + -0.008127f, -0.009442f, -0.006507f, -0.004257f, +0.014373f, +0.005118f, +0.010695f, -0.018913f, +0.007727f, -0.015810f, + -0.006707f, -0.009331f, -0.002146f, +0.002063f, +0.001374f, +0.002904f, +0.005185f, +0.006239f, -0.001134f, +0.004225f, + -0.002038f, +0.000498f, -0.000025f, -0.007254f, +0.003126f, -0.001400f, +0.001274f, +0.000016f, +0.002479f, -0.007593f, + +0.002824f, +0.000728f, -0.004618f, +0.003341f, -0.006036f, +0.006501f, -0.000731f, -0.003566f, +0.003556f, +0.002134f, + +0.004238f, -0.001066f, -0.003473f, -0.003398f, +0.004393f, -0.002285f, +0.007782f, -0.000795f, +0.000799f, +0.000896f, + +0.004020f, +0.002287f, -0.001653f, -0.003014f, +0.001580f, +0.004677f, +0.001002f, +0.000396f, +0.000912f, -0.002616f, + -0.000682f, +0.000262f, -0.001027f, +0.002152f, -0.001293f, +0.002694f + }, + { + +0.002235f, -0.094738f, +0.000163f, -0.008835f, +0.011160f, +0.003144f, +0.037546f, -0.036438f, -0.007498f, -0.013921f, + +0.003256f, -0.014615f, -0.001291f, +0.007549f, +0.008166f, -0.021228f, +0.019592f, -0.013473f, +0.018088f, -0.000963f, + -0.003231f, -0.000110f, -0.005221f, +0.017757f, +0.019820f, -0.001119f, +0.012148f, +0.006802f, +0.014735f, +0.006683f, + -0.005742f, +0.024175f, +0.006812f, +0.009214f, -0.008842f, -0.003371f, +0.008822f, -0.011612f, -0.012456f, -0.017973f, + +0.010198f, -0.007393f, +0.009727f, +0.000777f, +0.015733f, -0.006830f, +0.007774f, -0.010228f, +0.005531f, -0.017552f, + -0.003059f, +0.001339f, +0.000982f, -0.003977f, -0.006650f, +0.015393f, +0.001534f, +0.010518f, +0.001066f, +0.003582f, + -0.007849f, +0.003950f, -0.009030f, -0.000990f, -0.000266f, +0.005088f, -0.005387f, +0.001473f, +0.001394f, -0.009861f, + -0.005032f, -0.002296f, -0.006413f, -0.004048f, -0.003470f, +0.002228f, -0.000061f, +0.001439f, +0.003082f, -0.004824f, + -0.005757f, -0.006111f, -0.007283f, +0.004536f, +0.001144f, +0.002302f, -0.004033f, +0.001667f, +0.001442f, +0.001942f, + -0.001166f, -0.000406f, +0.002535f, +0.004140f, +0.000993f, -0.003168f + }, + { + -0.015330f, +0.183692f, -0.042598f, -0.018534f, +0.008643f, +0.006985f, -0.045937f, +0.026815f, +0.081074f, +0.004521f, + -0.031585f, -0.011249f, +0.007178f, +0.018369f, +0.015137f, -0.013525f, -0.014235f, -0.025445f, +0.000303f, -0.007623f, + +0.009782f, +0.000014f, -0.005366f, +0.004132f, -0.008071f, -0.009389f, -0.005871f, +0.011792f, -0.005657f, -0.028522f, + -0.002409f, -0.008389f, +0.014607f, +0.006108f, +0.016969f, -0.014851f, +0.001718f, -0.019006f, +0.000355f, -0.009543f, + -0.003722f, +0.006171f, -0.013999f, +0.008440f, +0.004320f, -0.000042f, -0.014147f, -0.016105f, +0.007576f, -0.001421f, + -0.009172f, -0.000687f, +0.002294f, -0.000274f, +0.004047f, -0.003633f, -0.000089f, -0.000001f, -0.012903f, +0.007291f, + +0.000181f, +0.010706f, +0.004877f, -0.001080f, -0.000311f, -0.001972f, -0.000577f, -0.002234f, -0.005038f, +0.000342f, + -0.003216f, +0.003563f, +0.005463f, -0.002514f, -0.004380f, +0.001522f, +0.001605f, +0.005080f, -0.004904f, +0.004675f, + -0.001612f, -0.000295f, -0.005501f, +0.004514f, -0.006406f, -0.000129f, -0.003112f, +0.001432f, -0.003160f, +0.001071f, + -0.003257f, -0.001152f, -0.003316f, +0.004936f, +0.001243f, -0.002351f + }, + { + +0.001570f, -0.093088f, +0.019595f, -0.012280f, +0.007700f, -0.020111f, -0.003884f, +0.007440f, +0.004461f, +0.001452f, + +0.008372f, +0.020737f, -0.001422f, +0.009625f, -0.014956f, +0.006989f, -0.002478f, +0.014408f, -0.018665f, -0.002157f, + -0.012034f, +0.016346f, +0.000161f, +0.017993f, -0.005104f, +0.010822f, +0.010964f, +0.005403f, +0.027376f, -0.003297f, + +0.004203f, +0.028757f, +0.002286f, +0.016283f, +0.011420f, -0.009283f, -0.008250f, +0.024062f, +0.015640f, +0.010224f, + +0.018421f, +0.003410f, +0.010934f, +0.011475f, +0.002740f, -0.010191f, +0.001332f, +0.022431f, +0.003248f, +0.000616f, + +0.011286f, -0.003057f, +0.002129f, -0.009487f, +0.001309f, -0.007982f, +0.004090f, -0.006008f, -0.005977f, +0.000182f, + +0.005857f, -0.006665f, +0.008795f, +0.008053f, +0.006801f, +0.002061f, -0.009691f, -0.001959f, +0.002252f, +0.001231f, + +0.002412f, +0.001280f, +0.005845f, -0.007001f, -0.005124f, +0.001746f, -0.000935f, +0.003201f, +0.008122f, -0.007590f, + -0.006072f, +0.003211f, +0.001358f, -0.001299f, -0.000779f, +0.002321f, +0.003803f, +0.002632f, +0.000117f, -0.001014f, + +0.003644f, +0.003661f, -0.001206f, +0.004967f, -0.000956f, -0.001924f + }, + { + -0.002170f, -0.208905f, +0.061525f, -0.018328f, -0.020898f, -0.022671f, -0.047474f, +0.012242f, -0.007397f, +0.013651f, + -0.040959f, -0.014857f, -0.014094f, +0.017028f, -0.023281f, -0.018317f, +0.006240f, -0.010914f, +0.005261f, -0.019295f, + +0.004400f, +0.002584f, -0.011122f, +0.014543f, -0.020317f, +0.002102f, -0.024054f, -0.013505f, -0.001595f, -0.000519f, + +0.009590f, -0.000767f, -0.020612f, -0.011376f, +0.008195f, +0.005666f, +0.003168f, -0.001552f, -0.005149f, +0.005382f, + +0.015364f, -0.015019f, +0.002296f, -0.002669f, +0.006958f, -0.005383f, +0.004858f, -0.010491f, +0.011525f, +0.004449f, + +0.010538f, +0.003259f, -0.004183f, -0.012133f, +0.005382f, -0.007703f, +0.009778f, -0.004639f, -0.003485f, +0.004595f, + +0.005729f, -0.002987f, +0.001275f, +0.005320f, -0.004954f, -0.004814f, +0.007993f, +0.007436f, +0.004062f, +0.008883f, + +0.008987f, +0.006848f, -0.000061f, +0.002626f, -0.005863f, +0.009683f, +0.005117f, +0.003719f, -0.003601f, +0.001832f, + -0.007562f, -0.001961f, -0.002064f, +0.006864f, +0.000264f, -0.005180f, -0.001358f, +0.000014f, -0.001312f, +0.002116f, + -0.001858f, +0.001952f, +0.005867f, +0.004866f, +0.002249f, -0.000985f + }, + { + +0.003717f, -0.004608f, -0.029781f, -0.005521f, -0.003705f, -0.009974f, -0.021285f, +0.004005f, +0.022882f, -0.004373f, + +0.004108f, -0.012403f, +0.015462f, -0.037023f, +0.051828f, -0.010967f, +0.001644f, +0.007402f, +0.012384f, -0.004198f, + -0.023648f, +0.003958f, +0.000436f, +0.002651f, -0.031679f, +0.015343f, +0.001699f, +0.007498f, +0.012501f, -0.044819f, + -0.024343f, +0.008234f, +0.024100f, +0.001060f, +0.014911f, -0.004716f, +0.002222f, +0.004165f, +0.004896f, -0.007539f, + -0.012696f, +0.002510f, -0.005269f, -0.001639f, -0.010222f, +0.001150f, +0.001275f, -0.003557f, -0.007022f, -0.007283f, + +0.011971f, +0.006167f, +0.003592f, -0.001347f, -0.002411f, +0.005455f, -0.006392f, +0.002648f, -0.001411f, +0.009149f, + +0.001977f, -0.010948f, -0.005626f, +0.008424f, -0.001735f, +0.002005f, -0.003910f, +0.000825f, +0.000668f, -0.001183f, + +0.004618f, +0.001162f, -0.004849f, +0.000233f, +0.001232f, +0.000048f, -0.003835f, +0.000377f, -0.000537f, +0.006707f, + +0.007806f, +0.002096f, +0.000442f, -0.002167f, -0.000312f, -0.001785f, +0.000116f, -0.002250f, -0.002265f, -0.001380f, + -0.003043f, -0.000177f, -0.001729f, +0.000055f, +0.003822f, -0.007051f + }, + { + -0.008563f, -0.130346f, +0.016786f, +0.003924f, +0.016339f, +0.005727f, -0.035318f, +0.005955f, -0.015946f, -0.000205f, + -0.009639f, -0.030825f, -0.004764f, +0.010088f, +0.037581f, +0.006841f, +0.001748f, -0.015465f, +0.001483f, -0.003301f, + +0.033071f, -0.001256f, +0.054065f, +0.017989f, -0.001337f, -0.012744f, -0.002484f, -0.002996f, +0.006377f, -0.018390f, + -0.037228f, -0.027004f, +0.008698f, +0.017429f, +0.006433f, -0.014915f, +0.005782f, +0.016954f, +0.019800f, +0.002988f, + +0.001183f, +0.011023f, -0.009714f, +0.004885f, -0.001050f, -0.016276f, +0.004968f, +0.021738f, +0.004405f, +0.001587f, + -0.013441f, -0.000454f, -0.006525f, -0.001605f, +0.001151f, -0.007986f, -0.001814f, +0.003689f, +0.003778f, -0.000443f, + -0.004079f, +0.000605f, -0.007378f, +0.000687f, +0.000344f, +0.002556f, +0.007193f, +0.012868f, -0.001856f, +0.002316f, + -0.001594f, +0.004491f, +0.003209f, -0.000186f, -0.003540f, -0.008302f, -0.003522f, +0.003608f, -0.001111f, -0.008072f, + -0.004345f, +0.008729f, -0.000708f, -0.000980f, +0.002526f, -0.000441f, +0.005187f, -0.000566f, -0.004032f, +0.002458f, + +0.005634f, +0.002100f, +0.002801f, +0.001590f, +0.001434f, +0.000811f + } + }, + { + { + -0.001143f, +0.068575f, -0.005898f, +0.048672f, +0.001942f, +0.000487f, -0.005893f, -0.003453f, +0.012261f, -0.007128f, + +0.020831f, -0.009744f, +0.020686f, +0.006728f, -0.018904f, -0.014113f, -0.016245f, -0.030090f, -0.024684f, -0.015735f, + +0.016716f, +0.002956f, -0.011709f, +0.018196f, -0.001015f, -0.001116f, -0.000541f, -0.000476f, +0.008752f, +0.000111f, + +0.016900f, -0.004444f, +0.009528f, -0.002057f, -0.004987f, -0.003335f, +0.002764f, +0.012761f, -0.002289f, +0.011006f, + -0.000668f, +0.004252f, -0.004279f, +0.000500f, +0.012754f, -0.003631f, +0.001771f, +0.011643f, -0.003275f, -0.014367f, + -0.007954f, -0.000084f, -0.000499f, +0.003713f, +0.004314f, -0.007540f, -0.011072f, -0.002441f, +0.003512f, +0.002246f, + -0.000810f, -0.000982f, +0.008841f, -0.005586f, -0.001719f, +0.006043f, +0.000701f, +0.002096f, -0.001565f, -0.000327f, + +0.004353f, -0.005521f, +0.000773f, +0.007451f, -0.002282f, -0.001915f, +0.000502f, -0.002402f, +0.003881f, +0.004121f, + -0.003196f, +0.007759f, -0.000401f, +0.003347f, -0.001283f, +0.001026f, +0.001037f, -0.001209f, -0.000308f, +0.002559f, + -0.000112f, -0.000786f, -0.003310f, -0.002840f, -0.000177f, +0.000467f + }, + { + -0.019514f, +0.150088f, +0.087840f, -0.037265f, -0.001091f, +0.011784f, +0.002981f, -0.040237f, -0.009647f, -0.010542f, + +0.007258f, +0.013813f, -0.004088f, -0.007798f, -0.022093f, +0.002551f, -0.002765f, -0.011901f, -0.001084f, -0.003725f, + +0.003118f, -0.001518f, +0.009865f, -0.001381f, -0.005341f, +0.004032f, +0.010645f, -0.021300f, -0.002241f, +0.000941f, + -0.010021f, -0.002898f, +0.001139f, +0.008990f, -0.000910f, +0.019277f, +0.012249f, -0.008984f, -0.018268f, -0.004129f, + +0.004114f, -0.000847f, +0.004774f, -0.009118f, +0.003723f, -0.000058f, -0.001739f, +0.008627f, +0.006169f, -0.007117f, + -0.002186f, -0.010101f, -0.006553f, -0.001294f, +0.004012f, -0.005970f, -0.003240f, +0.003693f, -0.010121f, -0.000464f, + +0.007261f, +0.001735f, +0.000824f, -0.001624f, -0.006098f, +0.002451f, -0.000348f, +0.000060f, +0.001920f, -0.003100f, + +0.000792f, -0.002497f, -0.000652f, -0.003042f, +0.000847f, -0.000221f, +0.003454f, +0.002646f, +0.001093f, +0.001203f, + -0.000842f, -0.000768f, +0.000606f, -0.001677f, -0.000818f, -0.003155f, +0.001041f, +0.002518f, -0.000730f, +0.000159f, + -0.001433f, -0.000998f, -0.000318f, -0.001044f, +0.002412f, -0.000891f + }, + { + -0.001328f, -0.224486f, -0.018828f, +0.071426f, -0.017968f, +0.009861f, +0.007308f, +0.002954f, -0.028475f, +0.011202f, + -0.000005f, -0.030057f, +0.017213f, +0.005393f, +0.010614f, +0.006406f, +0.000426f, +0.001337f, -0.009842f, +0.013573f, + +0.007971f, +0.002027f, -0.018924f, -0.000539f, -0.004448f, -0.013979f, -0.009871f, -0.003672f, +0.002159f, +0.005183f, + +0.019444f, +0.006694f, -0.005337f, -0.014764f, +0.011891f, +0.009926f, +0.009514f, +0.009010f, -0.007340f, -0.000207f, + +0.008083f, -0.003723f, -0.003094f, -0.001204f, +0.003962f, +0.007598f, -0.014918f, -0.005282f, -0.000789f, +0.005717f, + +0.002018f, +0.000041f, +0.001387f, -0.000502f, +0.002086f, +0.002669f, -0.000345f, +0.001724f, -0.011352f, +0.001573f, + -0.000552f, +0.003530f, +0.000630f, -0.001800f, -0.004333f, -0.002844f, -0.002135f, -0.004752f, -0.000975f, +0.002095f, + -0.002018f, -0.003082f, +0.003170f, -0.002040f, -0.001452f, -0.001800f, +0.000435f, -0.002457f, -0.002082f, -0.000948f, + -0.001543f, +0.002431f, -0.001791f, -0.000936f, +0.001171f, -0.000019f, +0.000105f, -0.003906f, -0.004285f, +0.001234f, + +0.000070f, -0.001079f, -0.002675f, -0.000769f, +0.000318f, +0.000185f + }, + { + -0.000715f, -0.057882f, -0.022096f, +0.029521f, -0.000332f, -0.001627f, +0.003221f, +0.000188f, +0.006593f, +0.000757f, + +0.003193f, +0.015114f, -0.003605f, +0.007292f, +0.003332f, +0.005734f, -0.015620f, -0.007741f, +0.001278f, -0.004893f, + +0.009488f, -0.013542f, +0.009150f, -0.009995f, +0.005477f, -0.008406f, -0.016376f, +0.007576f, +0.012659f, -0.018424f, + +0.018615f, -0.010790f, -0.001054f, +0.000657f, +0.002913f, -0.001626f, +0.015860f, +0.005010f, +0.011295f, -0.003166f, + -0.011501f, +0.005234f, -0.010657f, +0.003711f, -0.000095f, +0.006956f, -0.003357f, -0.002190f, +0.000409f, -0.005929f, + +0.002997f, -0.001631f, -0.003395f, -0.006286f, +0.001037f, +0.002353f, +0.004771f, -0.005593f, +0.001669f, +0.000317f, + -0.001956f, +0.005994f, -0.005967f, +0.000561f, +0.004019f, -0.004858f, +0.001000f, +0.003320f, +0.004438f, +0.005781f, + +0.001857f, +0.000510f, -0.000424f, +0.002946f, +0.001003f, -0.000145f, -0.001641f, -0.005682f, +0.000545f, +0.003388f, + +0.001010f, -0.000268f, -0.002218f, +0.001890f, -0.001822f, -0.003307f, +0.001951f, +0.000476f, -0.004459f, -0.000843f, + -0.000303f, +0.000461f, +0.000339f, -0.001087f, +0.003940f, -0.001706f + }, + { + +0.027734f, -0.010680f, -0.027167f, -0.016215f, +0.003459f, -0.003731f, +0.005124f, -0.015293f, -0.022160f, -0.000010f, + +0.006510f, -0.001900f, -0.004287f, +0.002985f, -0.007554f, +0.001594f, +0.025690f, -0.000397f, +0.021443f, +0.028130f, + +0.010719f, -0.003980f, -0.009312f, -0.006826f, -0.010275f, -0.001280f, -0.009048f, +0.024989f, -0.005887f, -0.008121f, + +0.011006f, -0.013793f, -0.007872f, -0.003405f, +0.004906f, -0.003209f, +0.017967f, +0.007185f, +0.004059f, +0.016960f, + +0.000771f, +0.004536f, +0.003016f, -0.003233f, -0.008576f, +0.001453f, +0.000285f, -0.001302f, -0.001655f, +0.010603f, + -0.000107f, -0.002378f, +0.004938f, -0.001241f, +0.005825f, -0.002283f, -0.000047f, +0.003610f, +0.002614f, -0.004735f, + -0.003340f, -0.002597f, -0.003832f, +0.003048f, +0.003991f, +0.000042f, -0.007351f, -0.001476f, -0.000982f, -0.000645f, + -0.001275f, +0.000315f, -0.002035f, -0.003250f, +0.001445f, -0.004637f, +0.004750f, -0.000317f, +0.001785f, +0.004836f, + -0.001863f, +0.000875f, +0.000582f, +0.003755f, -0.001972f, +0.005717f, +0.000949f, +0.003163f, +0.000455f, -0.000563f, + -0.000430f, -0.000866f, -0.004417f, -0.000208f, +0.002175f, -0.000390f + }, + { + +0.003184f, +0.007806f, +0.003880f, -0.013882f, -0.006110f, +0.003003f, -0.000211f, -0.004711f, +0.006746f, +0.009672f, + +0.006869f, +0.006073f, -0.009043f, -0.012054f, -0.022056f, -0.003790f, -0.016950f, -0.021961f, -0.010519f, -0.006096f, + +0.004609f, -0.004582f, +0.003556f, +0.004551f, -0.000282f, +0.004844f, +0.008621f, -0.000772f, -0.006479f, -0.021205f, + -0.000725f, -0.006573f, +0.008233f, -0.009769f, -0.006219f, +0.000599f, -0.009600f, +0.000234f, -0.007039f, -0.003305f, + -0.009730f, -0.003637f, +0.004155f, -0.008404f, -0.000481f, -0.007459f, +0.011703f, -0.006856f, +0.000304f, -0.003061f, + -0.009816f, +0.001689f, +0.005261f, -0.000090f, -0.003390f, +0.001854f, -0.004803f, +0.004140f, +0.003706f, +0.004458f, + +0.014223f, +0.004497f, +0.000108f, +0.003341f, -0.000305f, -0.004412f, +0.000375f, +0.001595f, +0.002040f, +0.000545f, + -0.002489f, +0.000349f, +0.001684f, -0.004074f, -0.000501f, -0.001557f, -0.003392f, -0.000011f, +0.003076f, +0.001093f, + +0.001408f, -0.000331f, -0.000473f, +0.000561f, +0.001594f, +0.000234f, +0.000731f, -0.002249f, -0.002438f, -0.000365f, + -0.001627f, -0.002075f, +0.003073f, +0.001816f, -0.003343f, -0.001849f + }, + { + +0.022128f, -0.057500f, +0.019618f, -0.005925f, +0.019735f, -0.004215f, +0.004425f, +0.026705f, -0.020653f, -0.015615f, + +0.010703f, +0.001349f, +0.007862f, +0.042323f, -0.003454f, +0.010343f, -0.006430f, -0.019737f, +0.021494f, -0.006835f, + -0.002198f, -0.002578f, +0.025355f, +0.007605f, -0.003318f, +0.005063f, +0.009239f, +0.012728f, -0.000971f, -0.009354f, + +0.007236f, -0.022961f, -0.009368f, +0.008648f, -0.000618f, +0.009778f, -0.011134f, +0.000817f, -0.008140f, +0.000882f, + +0.010699f, +0.010004f, +0.005608f, +0.012291f, -0.002760f, -0.005300f, +0.006362f, +0.001858f, +0.008759f, +0.009600f, + +0.007009f, -0.005996f, +0.002444f, +0.002907f, -0.004485f, +0.005895f, +0.009464f, -0.003403f, +0.002337f, -0.003550f, + -0.000616f, +0.002499f, +0.004847f, +0.000033f, +0.004834f, +0.000400f, +0.000564f, +0.004650f, +0.002753f, +0.005633f, + +0.005759f, -0.002957f, -0.003508f, -0.004110f, +0.004904f, -0.000165f, +0.001206f, -0.000465f, -0.002452f, -0.003893f, + +0.002562f, +0.002141f, -0.000921f, -0.000751f, +0.002201f, +0.002624f, -0.000657f, -0.001010f, -0.000113f, -0.000794f, + -0.000740f, +0.002531f, -0.001086f, +0.000784f, -0.001049f, -0.000874f + }, + { + +0.006384f, -0.064413f, -0.007065f, -0.015080f, -0.003242f, +0.001266f, +0.001807f, -0.005285f, -0.010062f, -0.005209f, + +0.002458f, -0.004954f, +0.000570f, +0.006247f, +0.031468f, -0.009982f, +0.007483f, -0.005818f, -0.014554f, -0.014531f, + -0.025262f, +0.003636f, -0.010449f, +0.001264f, -0.026524f, -0.005455f, -0.011426f, -0.014181f, -0.010075f, +0.003742f, + +0.000594f, -0.001212f, -0.002560f, +0.006268f, -0.002341f, -0.005520f, -0.002508f, -0.011293f, -0.019700f, +0.008351f, + -0.004847f, -0.015274f, -0.007641f, +0.005407f, -0.004617f, +0.001508f, +0.011370f, +0.001722f, +0.010522f, +0.001135f, + -0.004051f, -0.007739f, +0.003837f, -0.003499f, +0.000115f, -0.003199f, -0.005565f, +0.000190f, -0.002832f, -0.001184f, + -0.003476f, +0.003004f, +0.005795f, +0.002622f, +0.001317f, +0.006845f, -0.002268f, -0.003144f, -0.001862f, +0.002533f, + +0.000895f, -0.004549f, +0.004041f, -0.000977f, +0.000309f, +0.003016f, -0.002933f, +0.001218f, -0.003508f, +0.001128f, + -0.000977f, -0.001707f, +0.000382f, -0.000909f, +0.003724f, -0.001081f, -0.003603f, -0.002180f, -0.000487f, -0.001391f, + -0.000252f, -0.000180f, -0.001113f, -0.000863f, -0.000442f, +0.001403f + }, + { + +0.026601f, -0.070384f, +0.009711f, -0.017724f, +0.002638f, +0.008098f, -0.001720f, -0.011152f, -0.013533f, +0.003157f, + +0.038805f, +0.011451f, +0.004871f, +0.013884f, +0.013992f, -0.004630f, -0.058494f, -0.011846f, -0.018006f, -0.010705f, + -0.000699f, -0.000807f, -0.001474f, -0.002898f, -0.000020f, -0.001002f, -0.002807f, +0.006733f, -0.010913f, -0.009805f, + -0.029936f, +0.001567f, -0.007157f, -0.002863f, +0.008752f, +0.012042f, -0.002798f, -0.016984f, +0.004680f, -0.004051f, + -0.020673f, +0.002134f, -0.002971f, -0.001138f, +0.004404f, +0.003253f, +0.005382f, +0.002242f, -0.001118f, +0.001345f, + +0.002085f, +0.000202f, +0.000220f, -0.004549f, +0.005708f, -0.006055f, +0.002249f, -0.004556f, +0.005934f, -0.002622f, + +0.002971f, -0.000743f, -0.001412f, +0.001016f, +0.001560f, -0.004029f, -0.005732f, +0.001099f, +0.002706f, -0.000650f, + +0.005015f, +0.001243f, -0.003916f, +0.001103f, -0.000463f, +0.000173f, +0.003352f, +0.001963f, -0.001570f, +0.005224f, + -0.000898f, +0.001425f, -0.000239f, -0.002052f, +0.004084f, +0.000030f, +0.002038f, -0.000275f, +0.001187f, -0.001534f, + -0.000292f, -0.001351f, -0.003144f, +0.002945f, +0.001854f, +0.000262f + }, + { + -0.004201f, -0.088740f, +0.000268f, -0.018073f, +0.009711f, +0.000881f, +0.019489f, -0.023089f, -0.006320f, +0.003650f, + -0.001914f, -0.009645f, -0.010280f, +0.014329f, -0.005318f, -0.014725f, +0.007101f, +0.001927f, -0.026656f, +0.040479f, + -0.003448f, +0.003178f, +0.000551f, +0.008009f, +0.017888f, -0.000344f, -0.001989f, +0.013825f, +0.009062f, +0.010423f, + +0.004107f, +0.018786f, +0.007249f, -0.002390f, +0.008853f, -0.000330f, -0.004708f, -0.005968f, -0.006606f, -0.006185f, + +0.000572f, -0.000090f, +0.007841f, +0.008641f, -0.004851f, +0.005857f, +0.006427f, -0.000463f, -0.000154f, -0.019273f, + -0.000706f, -0.001019f, -0.003608f, +0.008025f, -0.000869f, +0.004669f, +0.008649f, +0.001301f, +0.008385f, -0.001344f, + -0.001890f, -0.005676f, +0.001169f, -0.003369f, +0.004944f, -0.001734f, -0.007070f, +0.001641f, -0.003067f, -0.002507f, + -0.000383f, -0.004993f, -0.004176f, -0.002882f, -0.007730f, +0.004110f, +0.000987f, -0.002505f, +0.004912f, -0.002637f, + -0.008130f, -0.001395f, -0.007987f, +0.000030f, -0.000085f, +0.000621f, -0.003358f, +0.001835f, +0.000919f, +0.002264f, + -0.002056f, +0.002628f, +0.001291f, +0.001571f, +0.002026f, -0.001453f + }, + { + +0.013697f, +0.136584f, -0.029659f, -0.011855f, -0.006170f, +0.026274f, -0.011679f, +0.048915f, +0.022308f, +0.018499f, + -0.017485f, +0.000308f, +0.026969f, -0.010652f, -0.003446f, +0.003895f, -0.012234f, -0.018757f, -0.009949f, -0.005596f, + +0.008095f, +0.008788f, +0.008967f, -0.009677f, -0.011910f, -0.011424f, -0.009280f, +0.024935f, -0.017242f, -0.023721f, + +0.000876f, +0.009992f, -0.002307f, +0.001078f, +0.028525f, -0.003733f, -0.018951f, -0.014651f, -0.001441f, -0.018460f, + +0.000777f, +0.005166f, -0.006269f, +0.007588f, -0.001297f, -0.000510f, -0.020192f, -0.005266f, +0.004607f, -0.007554f, + +0.001244f, +0.000474f, +0.003902f, +0.002344f, +0.004459f, -0.003528f, -0.005094f, -0.003418f, +0.002445f, +0.000521f, + -0.001651f, +0.010354f, +0.005913f, -0.000884f, -0.000638f, +0.002481f, -0.001073f, -0.008233f, -0.003161f, +0.002267f, + -0.002189f, +0.005328f, -0.002364f, -0.001090f, -0.002552f, +0.001091f, +0.002699f, +0.002258f, -0.003079f, +0.002337f, + +0.001884f, -0.001237f, -0.002571f, -0.002100f, -0.001579f, -0.002674f, -0.002310f, -0.000292f, -0.000071f, -0.000716f, + -0.004123f, -0.001824f, -0.000240f, +0.001222f, +0.002713f, -0.002381f + }, + { + -0.001548f, -0.062638f, +0.001029f, -0.004092f, -0.012280f, -0.010500f, +0.002613f, -0.008326f, +0.013909f, -0.001664f, + +0.022736f, +0.012445f, +0.018618f, -0.015711f, -0.008955f, +0.002334f, -0.001407f, -0.004700f, -0.013177f, +0.013799f, + +0.007391f, +0.003653f, +0.005574f, -0.000913f, +0.015002f, +0.007030f, +0.015033f, +0.006969f, +0.014568f, -0.014898f, + +0.023073f, +0.017756f, +0.008230f, +0.010113f, +0.008017f, -0.012017f, +0.008505f, +0.021037f, +0.007730f, +0.010619f, + +0.004236f, +0.005603f, +0.011795f, +0.005464f, +0.006691f, -0.005660f, -0.000098f, +0.016333f, +0.008388f, -0.008175f, + +0.011015f, +0.008376f, -0.004848f, -0.004745f, -0.005139f, -0.004111f, +0.001281f, -0.000885f, -0.007826f, -0.001710f, + +0.009713f, -0.005349f, +0.008230f, +0.006780f, +0.007221f, -0.003248f, +0.001917f, -0.007969f, +0.005923f, -0.000373f, + +0.000170f, +0.003956f, +0.000511f, -0.001011f, -0.006746f, -0.004406f, +0.006192f, +0.001538f, +0.009791f, -0.010936f, + -0.002326f, +0.005094f, -0.001715f, -0.001878f, -0.000245f, +0.000088f, +0.003844f, +0.003648f, -0.001259f, +0.000295f, + +0.004485f, +0.001568f, +0.001024f, +0.002747f, +0.001174f, -0.002193f + }, + { + -0.005779f, -0.109258f, -0.019697f, +0.011958f, -0.054739f, -0.029975f, -0.040327f, -0.006133f, +0.013302f, -0.014056f, + -0.030199f, -0.012238f, -0.023533f, +0.033846f, +0.011531f, -0.037488f, -0.004735f, +0.001687f, -0.009596f, -0.004338f, + -0.003174f, +0.008041f, -0.004001f, -0.016754f, -0.002372f, -0.003533f, -0.016922f, -0.013669f, -0.003978f, -0.015142f, + +0.008845f, +0.005708f, -0.010469f, -0.009663f, -0.004573f, +0.007956f, +0.016815f, -0.015501f, -0.008446f, +0.020983f, + -0.000510f, -0.005130f, +0.002504f, -0.000245f, -0.004381f, +0.008709f, +0.000152f, +0.001741f, -0.005499f, +0.001631f, + +0.006027f, +0.001673f, -0.000567f, -0.004398f, -0.000565f, +0.003689f, +0.001863f, -0.005364f, +0.010767f, +0.000166f, + -0.001725f, +0.001671f, +0.001010f, +0.001808f, -0.003650f, -0.003525f, +0.005229f, +0.010754f, +0.003604f, +0.005509f, + +0.012599f, +0.000492f, +0.001666f, +0.002693f, +0.001501f, +0.004253f, +0.005416f, +0.004153f, -0.003968f, -0.000306f, + -0.003957f, -0.002615f, -0.005637f, +0.004273f, -0.000842f, +0.000228f, -0.003568f, +0.002151f, -0.001351f, -0.002386f, + +0.001436f, +0.001534f, +0.001585f, +0.004998f, +0.001512f, +0.000891f + }, + { + -0.007193f, -0.031339f, +0.003054f, +0.002446f, -0.009944f, -0.018991f, -0.009511f, +0.001380f, +0.010936f, +0.007623f, + -0.000368f, -0.007947f, +0.006194f, +0.028940f, -0.079654f, +0.031136f, +0.009556f, -0.001371f, -0.005221f, -0.007321f, + -0.023842f, +0.011574f, -0.015454f, -0.000573f, +0.000177f, +0.003169f, +0.007673f, +0.000929f, -0.010848f, -0.020594f, + -0.010323f, -0.000017f, +0.028047f, -0.004673f, +0.011284f, -0.003861f, +0.007580f, -0.000725f, -0.009305f, +0.007393f, + -0.015885f, -0.001906f, -0.006072f, +0.000627f, -0.012014f, +0.000868f, -0.002454f, +0.002148f, -0.011972f, +0.010210f, + -0.005432f, +0.013176f, -0.000764f, -0.001600f, +0.004988f, +0.000381f, -0.006449f, +0.003411f, +0.003314f, +0.002762f, + -0.004295f, -0.003867f, -0.006387f, +0.006288f, +0.002532f, -0.002954f, -0.002762f, +0.000182f, +0.003397f, -0.001296f, + +0.004190f, +0.004455f, -0.006513f, -0.000467f, -0.001436f, -0.001314f, +0.000418f, -0.001065f, +0.000746f, +0.004063f, + +0.006009f, +0.005030f, +0.001862f, -0.000382f, +0.001147f, -0.004963f, -0.001642f, -0.002832f, -0.000198f, -0.001597f, + -0.001219f, -0.002280f, -0.000678f, +0.001662f, +0.000124f, -0.001572f + }, + { + +0.003673f, -0.095424f, -0.002023f, +0.003660f, +0.013735f, -0.009811f, -0.024080f, -0.012281f, -0.010980f, -0.005570f, + -0.015300f, +0.003124f, -0.033142f, +0.017825f, +0.048239f, -0.011691f, +0.009460f, -0.019477f, +0.009031f, +0.000935f, + +0.006196f, +0.030701f, +0.027193f, +0.013346f, +0.004876f, -0.012159f, +0.000851f, -0.002863f, -0.010866f, -0.007417f, + -0.013494f, -0.040949f, +0.014341f, +0.014644f, -0.006701f, -0.007827f, +0.009679f, +0.012091f, +0.005534f, +0.016438f, + -0.009184f, +0.005837f, -0.002699f, +0.008551f, -0.008187f, -0.003834f, +0.000813f, +0.018933f, +0.000316f, -0.005065f, + -0.006034f, -0.000475f, -0.001786f, +0.001887f, -0.007440f, +0.002612f, -0.011106f, +0.009147f, -0.002512f, +0.000468f, + +0.002714f, -0.004311f, -0.003652f, -0.007620f, +0.001499f, +0.004656f, +0.005829f, +0.009886f, +0.003196f, +0.002916f, + -0.004985f, +0.001273f, +0.001043f, -0.002196f, -0.001435f, -0.003963f, -0.004811f, -0.002440f, -0.002479f, +0.000401f, + -0.004845f, +0.004257f, +0.001384f, +0.003732f, -0.000192f, +0.001910f, +0.002470f, -0.000922f, +0.000626f, +0.002270f, + +0.001486f, +0.002280f, +0.002594f, +0.004024f, -0.000309f, +0.000684f + } + }, + { + { + -0.001082f, +0.107383f, +0.008464f, -0.018373f, -0.013470f, +0.008905f, -0.003465f, -0.008446f, -0.004391f, -0.028271f, + +0.006924f, -0.024917f, +0.006164f, +0.001162f, -0.015862f, -0.013203f, -0.011002f, -0.008749f, +0.000951f, +0.008645f, + +0.011120f, -0.010911f, -0.009433f, +0.037765f, +0.011901f, +0.013325f, +0.004245f, -0.005941f, +0.002360f, -0.003736f, + +0.001364f, -0.021687f, -0.003317f, -0.005252f, +0.012865f, +0.002561f, -0.015700f, -0.002599f, -0.007193f, +0.001730f, + -0.010713f, +0.003728f, -0.000297f, -0.001084f, +0.002959f, -0.009747f, -0.004225f, +0.002502f, +0.001246f, -0.008068f, + +0.000884f, +0.001316f, -0.002067f, +0.002786f, +0.001337f, -0.002614f, -0.012298f, -0.007841f, +0.001032f, +0.002827f, + +0.008915f, +0.008823f, +0.007014f, -0.005336f, -0.001839f, +0.002274f, +0.003194f, +0.001743f, -0.004502f, -0.001667f, + +0.003683f, -0.003616f, +0.001222f, +0.006040f, -0.001752f, -0.000801f, -0.002168f, -0.006568f, +0.000892f, +0.002952f, + -0.006307f, +0.004919f, +0.001737f, +0.004566f, -0.000647f, -0.000585f, -0.001252f, +0.000754f, +0.000865f, +0.003157f, + +0.000785f, +0.001334f, -0.000268f, -0.000981f, -0.001871f, +0.000700f + }, + { + +0.023258f, +0.039554f, -0.063653f, -0.035015f, -0.022437f, -0.006544f, -0.001945f, -0.024329f, -0.006283f, -0.012603f, + +0.030405f, +0.050062f, +0.006561f, -0.000582f, -0.013920f, +0.012392f, -0.001509f, -0.010800f, +0.022467f, +0.016408f, + -0.006292f, -0.018805f, -0.010173f, -0.004443f, +0.010591f, +0.007806f, +0.008264f, -0.031961f, +0.000676f, +0.007225f, + -0.004165f, +0.022556f, -0.000642f, -0.005107f, -0.010836f, +0.014392f, +0.017805f, +0.009889f, -0.003385f, +0.000503f, + +0.002118f, +0.003689f, +0.004866f, -0.015292f, +0.001257f, +0.000841f, +0.002361f, +0.001656f, +0.001986f, -0.000719f, + +0.004429f, -0.008111f, -0.008510f, -0.002599f, +0.005878f, +0.000033f, -0.004713f, -0.002412f, -0.006686f, +0.004863f, + +0.006094f, -0.000405f, -0.002131f, -0.007274f, -0.010914f, -0.002636f, +0.000942f, +0.002634f, +0.003104f, -0.000382f, + +0.003806f, -0.006877f, -0.006418f, -0.005535f, +0.002654f, +0.000086f, -0.000829f, +0.001582f, -0.002655f, -0.001908f, + +0.000033f, -0.000542f, -0.000184f, -0.002695f, +0.000339f, +0.000173f, +0.001760f, +0.000996f, -0.003150f, -0.000742f, + -0.001871f, -0.003152f, -0.000017f, +0.001629f, +0.003886f, -0.000267f + }, + { + -0.002277f, -0.155573f, +0.048633f, +0.103840f, +0.004709f, +0.014250f, +0.004905f, -0.006369f, -0.021310f, +0.017196f, + -0.008577f, -0.032650f, -0.003111f, -0.001629f, +0.008651f, -0.001666f, -0.006839f, +0.002029f, +0.007284f, +0.028602f, + +0.015463f, +0.006029f, -0.006166f, +0.009681f, -0.008352f, -0.011766f, -0.009172f, +0.002495f, +0.003843f, -0.007666f, + -0.005862f, +0.001742f, +0.006404f, -0.007418f, +0.012575f, +0.001292f, -0.002029f, +0.005607f, -0.000900f, +0.001845f, + +0.011807f, +0.005508f, -0.003939f, -0.008575f, -0.003577f, +0.002255f, -0.010563f, -0.006784f, -0.004777f, +0.003846f, + -0.001296f, +0.000933f, +0.000336f, +0.002857f, -0.001779f, -0.002697f, -0.003396f, +0.006221f, -0.003199f, +0.004899f, + +0.001062f, +0.002817f, -0.002087f, +0.000071f, -0.001333f, +0.001486f, -0.000169f, -0.005970f, -0.003558f, +0.002843f, + +0.001941f, -0.003275f, +0.002605f, -0.000495f, -0.000754f, +0.003294f, +0.007460f, +0.002648f, +0.000500f, +0.000800f, + -0.000968f, +0.001553f, -0.002835f, +0.001770f, +0.001950f, -0.001075f, +0.001820f, -0.000139f, -0.000442f, +0.001336f, + -0.000761f, +0.001054f, +0.001728f, +0.000760f, -0.001155f, +0.000876f + }, + { + -0.002614f, -0.008750f, +0.009887f, +0.015734f, -0.000818f, -0.000282f, +0.001991f, -0.002617f, -0.003555f, +0.010103f, + +0.010026f, +0.001063f, -0.004257f, -0.002194f, -0.018820f, +0.005825f, -0.001394f, -0.011446f, +0.003282f, -0.003547f, + +0.003009f, -0.012594f, +0.014115f, -0.027053f, -0.005342f, -0.001049f, -0.019575f, -0.011549f, -0.002163f, -0.015616f, + +0.033926f, +0.002172f, +0.001741f, +0.008337f, +0.003079f, +0.002780f, +0.011620f, -0.011340f, -0.001697f, -0.002591f, + -0.003102f, +0.003331f, -0.015854f, +0.006234f, -0.007715f, -0.000115f, -0.005760f, -0.002769f, -0.001356f, -0.002127f, + +0.007204f, -0.001340f, +0.003108f, +0.006627f, +0.005494f, +0.000014f, +0.003512f, -0.002876f, +0.000055f, -0.002379f, + -0.005228f, +0.009594f, +0.000018f, +0.002019f, +0.002347f, -0.005054f, +0.000652f, +0.000972f, +0.000731f, +0.008889f, + +0.004155f, +0.000773f, -0.003070f, -0.000568f, +0.000550f, +0.004934f, +0.001652f, -0.004505f, +0.003375f, +0.001358f, + +0.000159f, +0.007261f, +0.000212f, -0.000880f, -0.001250f, -0.004612f, -0.000710f, +0.000197f, -0.002967f, -0.000895f, + -0.001039f, +0.000125f, +0.001655f, -0.001353f, +0.002406f, -0.000556f + }, + { + -0.018082f, -0.070411f, -0.003224f, -0.006998f, +0.002018f, -0.003132f, +0.006773f, -0.001424f, -0.007300f, +0.009096f, + -0.014182f, -0.001360f, +0.008565f, +0.018984f, -0.006365f, -0.010578f, +0.018752f, +0.009659f, -0.004456f, -0.021502f, + +0.001809f, +0.001669f, -0.008224f, +0.007175f, +0.005711f, +0.006135f, +0.007493f, +0.028798f, -0.009652f, -0.020182f, + -0.007628f, -0.016247f, -0.007387f, -0.008596f, -0.005494f, -0.014711f, +0.006614f, -0.001329f, -0.010842f, +0.001062f, + -0.014890f, +0.002288f, +0.007145f, +0.010494f, +0.005162f, +0.000050f, -0.000002f, +0.003075f, -0.001855f, +0.010174f, + -0.005029f, -0.005076f, +0.003738f, +0.000856f, +0.006814f, -0.000363f, +0.006215f, +0.002360f, +0.000580f, -0.009186f, + -0.004458f, +0.000528f, -0.004453f, +0.004831f, +0.002056f, -0.003765f, -0.001012f, -0.000370f, +0.001859f, +0.004461f, + -0.000588f, +0.001726f, +0.003446f, -0.004305f, -0.000688f, -0.004095f, +0.005330f, -0.000266f, -0.000361f, +0.002557f, + -0.002499f, +0.000443f, -0.000053f, +0.004348f, -0.004175f, +0.001499f, -0.002432f, +0.003527f, +0.003193f, -0.000602f, + -0.001066f, -0.001088f, -0.002523f, -0.001275f, -0.000541f, +0.000028f + }, + { + +0.000170f, -0.004405f, +0.025914f, -0.010818f, -0.006718f, +0.007430f, -0.000159f, -0.007452f, -0.004567f, -0.007126f, + +0.000058f, +0.010675f, -0.008308f, +0.002405f, -0.012085f, -0.004551f, -0.000820f, -0.012647f, +0.001176f, -0.007862f, + +0.002352f, -0.002578f, -0.000790f, -0.010980f, -0.000075f, +0.006891f, -0.006579f, -0.009725f, -0.003750f, -0.038584f, + -0.005651f, -0.006085f, +0.006330f, +0.004393f, +0.008769f, +0.016879f, +0.001949f, +0.005835f, +0.011445f, +0.015331f, + +0.012276f, +0.014849f, +0.014102f, -0.008919f, -0.002770f, -0.006600f, +0.011119f, -0.005190f, +0.004317f, +0.004801f, + -0.005352f, +0.004652f, -0.002191f, -0.002555f, -0.000924f, +0.004203f, +0.000534f, +0.006797f, +0.003661f, +0.000641f, + +0.007940f, -0.000153f, -0.000957f, +0.002301f, -0.001645f, -0.005457f, +0.002535f, +0.003742f, -0.001061f, +0.001111f, + +0.003516f, +0.001952f, +0.002056f, -0.000356f, -0.000297f, -0.003267f, -0.000449f, +0.002397f, +0.000415f, -0.000192f, + +0.000611f, -0.003071f, -0.001745f, -0.001054f, -0.000175f, +0.003796f, +0.001943f, -0.001764f, -0.004495f, -0.002678f, + -0.001070f, -0.002468f, +0.000552f, -0.000883f, -0.002206f, +0.000194f + }, + { + -0.006944f, -0.124001f, +0.015987f, +0.001441f, +0.000171f, -0.010147f, -0.017614f, +0.003140f, -0.015442f, -0.002258f, + +0.014695f, +0.035257f, +0.005466f, +0.005412f, -0.011713f, +0.016213f, +0.009450f, -0.004511f, +0.017653f, -0.003304f, + +0.006742f, -0.009208f, +0.005331f, -0.009876f, -0.014107f, +0.004636f, +0.014145f, +0.026447f, -0.006324f, -0.012914f, + +0.005455f, -0.026767f, -0.011904f, +0.013674f, +0.006274f, +0.010740f, -0.011721f, +0.012808f, +0.002224f, +0.010559f, + +0.009649f, +0.005648f, -0.006445f, -0.005037f, -0.008745f, -0.011347f, +0.001117f, +0.000762f, +0.001106f, -0.001292f, + -0.000315f, -0.005158f, -0.001212f, +0.000023f, -0.002711f, -0.001491f, +0.002249f, -0.009234f, -0.002218f, -0.006619f, + +0.001712f, +0.003584f, +0.005487f, -0.003668f, +0.000270f, -0.002932f, -0.001081f, +0.006714f, +0.004741f, +0.001932f, + +0.000650f, -0.004596f, +0.000976f, +0.002258f, +0.004574f, +0.000183f, -0.000015f, -0.002324f, -0.000619f, -0.003325f, + +0.003684f, +0.001679f, -0.003573f, -0.001101f, +0.003052f, +0.001984f, +0.002129f, -0.000840f, -0.001038f, +0.000985f, + +0.001054f, +0.004769f, -0.001250f, +0.001176f, +0.000700f, -0.002289f + }, + { + +0.001548f, -0.065743f, +0.046074f, +0.011178f, +0.000153f, -0.007384f, +0.004819f, -0.000624f, -0.003539f, -0.002027f, + +0.007857f, -0.008211f, -0.024988f, +0.003278f, +0.054968f, +0.001641f, +0.025051f, +0.004736f, -0.017200f, -0.019781f, + -0.026105f, +0.018071f, -0.007180f, -0.002102f, -0.018235f, -0.003361f, +0.006205f, +0.013703f, +0.002408f, -0.015228f, + -0.001573f, +0.005214f, +0.004609f, +0.012857f, +0.005163f, +0.006529f, +0.007367f, -0.004019f, -0.004913f, +0.013686f, + +0.010043f, -0.000649f, -0.002990f, +0.002064f, -0.008219f, -0.000389f, -0.001606f, -0.004433f, +0.000432f, -0.006221f, + +0.005013f, -0.000062f, +0.003420f, +0.002022f, +0.002821f, +0.003588f, -0.003042f, -0.003768f, +0.000314f, +0.001551f, + +0.003054f, +0.005264f, +0.003185f, -0.002751f, -0.003591f, +0.005216f, +0.000107f, -0.001468f, +0.000858f, +0.002729f, + -0.000168f, -0.005041f, -0.002563f, -0.005832f, +0.002717f, +0.004096f, -0.001732f, +0.000401f, -0.004052f, +0.004238f, + +0.004647f, +0.002590f, +0.000875f, -0.004550f, +0.003278f, +0.001086f, -0.003662f, -0.000844f, +0.001606f, +0.000754f, + +0.000472f, +0.000095f, -0.001858f, -0.001642f, -0.001765f, +0.000309f + }, + { + -0.015020f, -0.133924f, +0.021967f, -0.001632f, -0.012758f, +0.001000f, -0.002270f, +0.009533f, -0.001587f, +0.004538f, + +0.001176f, -0.009422f, +0.014160f, +0.018939f, +0.018345f, -0.025259f, -0.033611f, +0.027841f, +0.007910f, -0.001963f, + -0.009632f, -0.000223f, +0.001665f, +0.007118f, +0.009626f, -0.002728f, +0.004963f, +0.001775f, -0.011242f, -0.001429f, + -0.019661f, +0.011633f, +0.009125f, +0.001613f, -0.004633f, -0.005806f, -0.009642f, -0.009811f, +0.007846f, +0.002476f, + -0.008346f, +0.009151f, +0.003665f, +0.003443f, -0.005227f, -0.007306f, -0.000444f, -0.003091f, -0.004426f, +0.003612f, + +0.003608f, +0.000652f, -0.001043f, -0.003213f, +0.006903f, -0.008294f, +0.001141f, -0.008990f, +0.003420f, -0.003805f, + +0.003979f, +0.002785f, -0.000598f, -0.005755f, -0.003035f, -0.004410f, -0.006131f, -0.000809f, +0.000591f, +0.000069f, + +0.002743f, +0.000847f, +0.000970f, +0.003443f, +0.000033f, -0.001821f, -0.002013f, +0.002279f, -0.001394f, +0.002593f, + -0.003734f, -0.000332f, -0.002098f, -0.003792f, +0.001263f, -0.003154f, +0.000944f, -0.001945f, -0.000705f, +0.000430f, + +0.000536f, -0.002724f, -0.003848f, +0.000322f, -0.000575f, -0.001401f + }, + { + +0.000918f, -0.069912f, +0.004579f, -0.010570f, -0.000508f, -0.035393f, -0.009375f, -0.004558f, +0.006429f, +0.013680f, + +0.005227f, -0.014387f, -0.019091f, +0.016040f, -0.005036f, +0.006588f, +0.005451f, +0.003287f, -0.019357f, +0.016360f, + -0.013156f, +0.012190f, -0.009421f, -0.020347f, -0.008431f, -0.016464f, -0.028947f, -0.003350f, -0.002045f, +0.006407f, + +0.006713f, +0.002581f, -0.009894f, -0.015944f, +0.003830f, +0.003490f, -0.002131f, +0.007790f, +0.009263f, +0.004170f, + +0.002176f, +0.004707f, +0.007393f, +0.005464f, -0.002562f, +0.015997f, +0.015522f, +0.008712f, +0.003246f, -0.010208f, + +0.009694f, +0.000446f, -0.003119f, +0.008009f, -0.008294f, -0.011518f, +0.002412f, -0.002169f, +0.006104f, -0.006072f, + +0.003410f, +0.004651f, +0.004110f, +0.000423f, +0.010584f, +0.003243f, -0.000620f, -0.000512f, -0.002031f, +0.006256f, + +0.004249f, +0.000152f, +0.002742f, +0.007421f, -0.002281f, +0.002252f, +0.001250f, -0.006710f, -0.001679f, -0.000615f, + -0.003846f, +0.004156f, -0.003329f, -0.001354f, -0.003351f, +0.000374f, -0.003635f, +0.001817f, -0.000432f, -0.001136f, + -0.001118f, +0.003967f, -0.000809f, +0.001029f, +0.003375f, -0.001195f + }, + { + -0.015068f, +0.127424f, +0.013053f, -0.001496f, -0.020045f, +0.059216f, +0.042979f, +0.069414f, +0.005468f, +0.003082f, + -0.014244f, -0.009089f, +0.022095f, -0.003648f, +0.000137f, +0.012833f, +0.000784f, -0.002665f, -0.005737f, +0.010836f, + +0.016890f, +0.012993f, +0.014871f, -0.009961f, -0.003397f, -0.002804f, -0.005380f, +0.026377f, -0.003320f, -0.008837f, + +0.001565f, +0.006835f, -0.006023f, -0.000384f, +0.024943f, +0.008713f, -0.011378f, -0.009426f, -0.000559f, -0.015244f, + -0.000503f, +0.002424f, -0.000989f, +0.004703f, -0.003500f, +0.009090f, -0.007997f, +0.008447f, +0.012053f, -0.003792f, + +0.007540f, +0.002003f, +0.002290f, +0.002671f, +0.001539f, -0.006178f, -0.007852f, -0.004591f, -0.004776f, -0.004262f, + +0.002281f, +0.005724f, -0.005424f, -0.010999f, -0.004463f, +0.004793f, +0.000811f, -0.005905f, -0.001933f, +0.003265f, + -0.001692f, +0.002418f, -0.006960f, -0.000441f, -0.003570f, -0.003935f, -0.001250f, -0.001074f, -0.003125f, +0.002332f, + -0.001029f, -0.004360f, -0.000464f, -0.000526f, +0.004251f, +0.001405f, +0.000067f, +0.000787f, +0.001038f, +0.000424f, + -0.001097f, +0.002932f, +0.002333f, -0.001390f, +0.002572f, -0.002022f + }, + { + -0.001800f, -0.031833f, +0.014643f, +0.000345f, -0.009725f, -0.004081f, +0.008143f, -0.015288f, +0.011123f, -0.003091f, + +0.000323f, -0.006242f, -0.009466f, -0.038998f, +0.001199f, +0.001868f, +0.003066f, +0.011673f, +0.004954f, +0.015908f, + +0.009358f, +0.001155f, -0.000125f, -0.018023f, -0.000105f, -0.003988f, -0.002514f, -0.016581f, +0.022586f, +0.018074f, + +0.009521f, -0.011080f, +0.009578f, +0.001063f, -0.014191f, -0.016165f, +0.014324f, +0.009363f, -0.013062f, -0.001064f, + -0.010698f, -0.007156f, -0.011771f, -0.014927f, +0.004079f, +0.003420f, +0.006892f, -0.002083f, -0.014994f, -0.009970f, + +0.009294f, +0.008883f, -0.002650f, -0.007814f, -0.005307f, -0.004232f, +0.001757f, +0.002227f, -0.001098f, +0.001199f, + +0.005784f, -0.007649f, +0.006429f, -0.000663f, +0.002080f, -0.003304f, +0.002367f, -0.009478f, +0.002880f, -0.002828f, + +0.000562f, +0.001495f, -0.004731f, +0.001457f, -0.002942f, -0.005123f, +0.003491f, -0.005480f, +0.002854f, -0.009710f, + -0.002420f, +0.003152f, -0.003278f, -0.002190f, -0.000978f, -0.000578f, +0.004383f, +0.003630f, -0.002514f, -0.002922f, + +0.002862f, +0.002574f, -0.000110f, -0.003114f, +0.001713f, +0.001671f + }, + { + +0.014945f, -0.062272f, -0.012135f, +0.023310f, -0.075375f, -0.035436f, -0.018718f, -0.018159f, +0.002587f, -0.021548f, + -0.005202f, +0.014577f, -0.016665f, +0.049382f, +0.036712f, -0.007739f, +0.025850f, +0.019822f, -0.002407f, -0.003868f, + -0.008684f, +0.015370f, +0.001591f, -0.020114f, +0.012198f, +0.012084f, +0.009411f, +0.002978f, -0.006876f, -0.023133f, + +0.001525f, +0.006706f, -0.001614f, -0.003953f, -0.003631f, +0.002753f, +0.009205f, -0.017186f, -0.009662f, +0.018432f, + -0.008173f, -0.003808f, +0.002513f, -0.004605f, -0.010697f, +0.007883f, +0.010600f, +0.007212f, -0.005739f, +0.002555f, + +0.002245f, -0.000831f, +0.004429f, +0.006039f, +0.004128f, +0.002512f, -0.003496f, -0.007650f, +0.011781f, +0.002301f, + -0.001370f, +0.001319f, -0.000500f, -0.004249f, +0.000698f, +0.006110f, +0.001604f, +0.003245f, -0.008239f, -0.006634f, + +0.003287f, -0.006408f, +0.002217f, +0.002334f, +0.003936f, +0.005206f, -0.000407f, -0.001272f, -0.005551f, -0.001587f, + +0.001117f, +0.000787f, -0.005638f, -0.000415f, -0.004010f, +0.001085f, -0.000728f, +0.001878f, -0.001642f, -0.003662f, + +0.000239f, -0.000575f, -0.003064f, +0.000782f, -0.000135f, +0.002665f + }, + { + +0.006781f, -0.026211f, -0.008556f, +0.003793f, +0.002390f, -0.001908f, +0.001244f, -0.007478f, -0.003358f, +0.002154f, + -0.007530f, -0.000509f, +0.009869f, +0.024208f, -0.127374f, -0.000686f, +0.002862f, +0.007078f, -0.006911f, +0.007302f, + -0.014290f, +0.003616f, -0.025183f, +0.012520f, +0.013153f, -0.002046f, -0.000109f, +0.007818f, -0.002972f, +0.000850f, + +0.009151f, -0.006518f, +0.011730f, -0.021205f, -0.003364f, -0.002442f, +0.005261f, -0.014713f, -0.011251f, +0.012139f, + -0.013033f, -0.002386f, -0.001329f, +0.015023f, -0.005371f, +0.006359f, +0.010234f, +0.004192f, -0.009470f, +0.021679f, + -0.004183f, +0.008054f, -0.001175f, +0.007775f, +0.006217f, -0.008178f, -0.004126f, +0.007181f, +0.001841f, +0.001961f, + -0.000927f, -0.002621f, -0.007996f, +0.001783f, -0.001043f, -0.003355f, -0.000256f, +0.000148f, +0.002030f, +0.000919f, + +0.003162f, +0.005037f, -0.001465f, +0.003043f, -0.000212f, +0.000251f, +0.000578f, -0.002592f, -0.002898f, +0.000479f, + +0.002999f, +0.003414f, -0.000627f, +0.000498f, +0.003872f, -0.002095f, -0.001232f, -0.001051f, +0.000965f, -0.000460f, + +0.004554f, +0.001005f, -0.001012f, +0.000004f, +0.001256f, +0.000850f + }, + { + +0.005290f, -0.084534f, -0.000865f, -0.001444f, -0.005089f, -0.006355f, +0.004791f, -0.002889f, -0.010047f, -0.006756f, + -0.004412f, +0.035385f, -0.017117f, -0.034433f, -0.022663f, -0.023412f, +0.015720f, -0.021722f, +0.008779f, -0.001266f, + -0.028161f, -0.001948f, -0.007757f, -0.005259f, -0.003036f, -0.018355f, +0.005478f, +0.006063f, -0.017315f, +0.005772f, + +0.012308f, -0.036755f, +0.011368f, +0.018435f, +0.000263f, -0.006988f, -0.000141f, -0.010314f, -0.010228f, +0.004533f, + -0.020957f, -0.004527f, -0.005705f, +0.008816f, -0.002763f, +0.012940f, -0.000053f, +0.007578f, -0.010552f, -0.010969f, + -0.002582f, +0.001872f, +0.008869f, +0.007582f, -0.003067f, +0.013847f, -0.004366f, +0.007477f, -0.008237f, -0.000830f, + -0.000400f, -0.005936f, +0.003290f, -0.005170f, -0.003431f, -0.003562f, -0.005514f, +0.002746f, +0.007773f, +0.002839f, + -0.008789f, -0.002944f, -0.001398f, -0.001892f, +0.003137f, +0.002235f, +0.001293f, -0.000719f, -0.005052f, +0.004098f, + -0.000666f, +0.004332f, +0.002461f, +0.003764f, +0.002769f, +0.007934f, +0.003045f, +0.001740f, +0.002038f, -0.001364f, + -0.002210f, -0.000541f, -0.000860f, +0.002127f, +0.000152f, +0.003540f + } + }, + { + { + +0.000046f, +0.083033f, +0.025842f, -0.075043f, +0.035395f, -0.009488f, -0.000099f, +0.002091f, -0.020254f, -0.018686f, + -0.000913f, +0.001390f, -0.017830f, -0.005117f, -0.017992f, +0.001547f, -0.011329f, +0.004178f, -0.007765f, +0.015816f, + +0.013287f, -0.013016f, -0.003396f, +0.011941f, +0.010437f, +0.022828f, +0.005530f, -0.004721f, -0.009915f, +0.016562f, + -0.011699f, -0.011331f, -0.015751f, +0.000223f, +0.014140f, -0.005111f, -0.014816f, -0.004262f, +0.008187f, -0.004453f, + -0.007127f, -0.003042f, -0.005587f, +0.009195f, -0.001565f, -0.008476f, -0.008170f, -0.003534f, +0.005067f, -0.009081f, + +0.002226f, +0.002353f, +0.004085f, +0.004161f, -0.006908f, -0.002222f, -0.001155f, -0.009463f, -0.006454f, +0.004311f, + +0.010260f, +0.009476f, +0.001193f, -0.002744f, -0.000335f, +0.000644f, +0.005365f, +0.000377f, -0.004219f, -0.001516f, + -0.000637f, +0.006860f, -0.004190f, +0.001635f, +0.005319f, -0.005432f, -0.002058f, -0.004184f, +0.003724f, -0.002364f, + -0.001546f, +0.001656f, +0.004468f, +0.002737f, +0.000298f, -0.000726f, -0.000428f, +0.001202f, -0.000820f, +0.001276f, + +0.001474f, +0.000454f, +0.000420f, +0.002198f, -0.002215f, +0.001491f + }, + { + -0.028258f, -0.018252f, +0.047062f, +0.037736f, -0.087978f, -0.010197f, -0.024245f, +0.002587f, +0.003442f, -0.007410f, + +0.011744f, +0.049077f, +0.013960f, +0.008334f, -0.000889f, -0.009898f, -0.003387f, +0.001710f, +0.014142f, +0.013464f, + +0.010323f, -0.022936f, -0.003988f, -0.007681f, +0.018523f, +0.001004f, -0.000200f, -0.019789f, +0.001554f, -0.001022f, + +0.003136f, +0.019370f, +0.002878f, -0.009011f, -0.010162f, +0.007890f, +0.014747f, +0.008704f, +0.002495f, +0.011900f, + +0.001906f, +0.008311f, -0.008058f, -0.012801f, -0.000355f, +0.001283f, +0.006439f, -0.006955f, -0.002006f, +0.013810f, + -0.004641f, -0.002859f, -0.005484f, -0.002293f, +0.001607f, -0.000385f, -0.002926f, -0.003628f, +0.000114f, -0.001375f, + +0.008699f, -0.004876f, +0.001398f, -0.011239f, -0.007453f, -0.006530f, +0.007660f, +0.002466f, +0.001853f, -0.001528f, + +0.002363f, -0.004924f, -0.004393f, -0.003659f, -0.003325f, +0.002431f, -0.002095f, -0.002053f, +0.001324f, +0.000196f, + -0.000168f, -0.000780f, -0.001068f, -0.003392f, +0.002433f, -0.001971f, +0.003091f, -0.001337f, -0.000649f, +0.000753f, + -0.001915f, -0.002892f, -0.001183f, +0.001426f, +0.003079f, -0.000376f + }, + { + +0.009298f, -0.079688f, -0.021397f, +0.100131f, +0.002717f, +0.004763f, +0.007551f, -0.012225f, -0.014527f, +0.009879f, + -0.010429f, -0.024282f, -0.015465f, +0.003521f, -0.000689f, -0.007935f, +0.010666f, +0.000663f, -0.003160f, +0.028928f, + +0.030618f, -0.009544f, +0.000562f, +0.005960f, -0.008770f, -0.003925f, -0.005769f, -0.004529f, +0.004888f, -0.002990f, + -0.019604f, +0.005007f, +0.015595f, +0.003463f, -0.008679f, +0.002493f, +0.001380f, +0.003985f, -0.000389f, +0.001425f, + +0.017266f, +0.001129f, -0.000710f, -0.003732f, -0.009765f, -0.012108f, +0.005301f, -0.006104f, -0.000056f, -0.002730f, + -0.001007f, -0.001109f, +0.005628f, +0.008345f, -0.005137f, -0.002464f, -0.001035f, +0.004880f, +0.001925f, -0.001584f, + +0.005703f, +0.001381f, -0.000119f, -0.003948f, +0.000822f, +0.002984f, -0.004289f, -0.001818f, -0.000692f, -0.000959f, + +0.001944f, +0.000442f, -0.000210f, -0.000534f, +0.000281f, +0.005564f, +0.004429f, -0.000039f, -0.001395f, +0.002364f, + +0.002954f, -0.000527f, -0.002416f, -0.000272f, +0.000983f, +0.001518f, +0.002459f, -0.001310f, +0.002312f, -0.001690f, + +0.002725f, -0.000763f, +0.001496f, -0.000044f, +0.001644f, -0.000681f + }, + { + +0.005159f, +0.012353f, -0.008362f, -0.007345f, +0.014650f, -0.001232f, +0.001265f, +0.003173f, -0.013488f, +0.019052f, + +0.011494f, -0.013045f, +0.002776f, -0.017441f, -0.026110f, +0.016666f, -0.001534f, -0.005748f, -0.004058f, +0.006994f, + -0.000266f, -0.010840f, +0.003877f, -0.018259f, -0.008771f, +0.003327f, -0.016061f, -0.020843f, -0.017051f, +0.003146f, + +0.007063f, +0.022332f, -0.011832f, +0.014852f, +0.001868f, +0.009352f, +0.008295f, -0.005184f, -0.012773f, +0.001002f, + -0.001447f, -0.007050f, -0.008174f, +0.001576f, -0.011336f, +0.003155f, -0.003143f, +0.002671f, -0.001216f, -0.000665f, + +0.008406f, -0.000577f, -0.000052f, +0.005981f, +0.005691f, +0.000592f, -0.005659f, +0.006855f, -0.007423f, -0.000825f, + -0.000492f, +0.005915f, +0.005552f, +0.002527f, -0.003229f, +0.003568f, -0.003592f, -0.000599f, +0.000604f, +0.002400f, + +0.002480f, +0.006278f, -0.006223f, +0.000247f, -0.000291f, +0.003882f, +0.003199f, -0.000877f, -0.000090f, +0.001061f, + -0.001526f, +0.009141f, +0.002125f, -0.005385f, +0.000224f, -0.002584f, -0.001028f, -0.001713f, -0.000153f, -0.003131f, + -0.000147f, +0.001399f, +0.000215f, -0.000802f, +0.000776f, +0.000861f + }, + { + +0.005067f, -0.111573f, +0.000247f, -0.010550f, +0.017401f, -0.001610f, -0.008146f, +0.006221f, +0.002894f, +0.002526f, + -0.026171f, +0.023576f, +0.013677f, +0.012277f, +0.002927f, -0.008628f, +0.004054f, +0.001497f, +0.001565f, -0.019264f, + +0.001525f, +0.010171f, -0.023057f, +0.012495f, +0.020583f, -0.009734f, +0.036690f, -0.003318f, -0.004006f, -0.017798f, + -0.009297f, -0.011576f, -0.009705f, -0.004081f, -0.007813f, -0.009536f, -0.011716f, +0.004402f, -0.007173f, -0.007339f, + -0.016311f, +0.005893f, -0.000292f, +0.008045f, +0.014729f, -0.001415f, +0.002802f, -0.001236f, -0.000116f, +0.004102f, + +0.004835f, -0.004613f, -0.004371f, +0.002835f, +0.003638f, +0.008767f, +0.000460f, +0.003530f, -0.004139f, -0.007202f, + -0.001240f, -0.003019f, +0.001902f, +0.002217f, +0.002496f, -0.009091f, +0.003857f, -0.000082f, +0.003659f, +0.002865f, + -0.000858f, -0.000917f, +0.004869f, -0.002260f, -0.003977f, -0.001958f, +0.002920f, +0.000715f, +0.000023f, +0.000229f, + -0.000320f, -0.002539f, +0.002340f, +0.001031f, -0.001040f, +0.000870f, -0.002987f, +0.002447f, +0.003090f, +0.000239f, + -0.000324f, -0.000562f, -0.002104f, -0.002503f, -0.000774f, -0.000089f + }, + { + -0.002899f, +0.010395f, +0.004974f, +0.001470f, -0.002802f, +0.002258f, +0.002582f, -0.008017f, +0.000968f, -0.007738f, + -0.009583f, +0.015614f, -0.005677f, -0.026839f, -0.017357f, +0.006101f, +0.017279f, +0.004306f, -0.000733f, -0.003061f, + -0.017082f, +0.007571f, +0.014465f, -0.033442f, +0.006385f, +0.010324f, -0.015927f, +0.000923f, -0.001108f, -0.025103f, + -0.007937f, +0.000962f, -0.012142f, +0.005769f, +0.007374f, +0.017532f, +0.001140f, +0.002495f, +0.010145f, +0.011796f, + +0.027314f, +0.012560f, +0.005694f, -0.004270f, -0.007599f, +0.000117f, +0.002284f, +0.003550f, -0.001114f, +0.006226f, + -0.000789f, +0.003170f, -0.004978f, +0.005110f, -0.000215f, -0.002311f, +0.005146f, +0.006430f, +0.004078f, -0.000598f, + +0.002616f, -0.001404f, +0.002022f, -0.002977f, -0.000191f, -0.002289f, +0.002615f, +0.001789f, -0.000427f, -0.000558f, + +0.005004f, +0.004350f, -0.006434f, +0.002918f, +0.000887f, -0.003097f, +0.004270f, +0.002145f, +0.000506f, -0.004592f, + +0.002572f, -0.003450f, -0.005781f, +0.000630f, -0.000236f, +0.003201f, +0.003686f, -0.001871f, -0.005860f, -0.002899f, + -0.000568f, +0.000407f, -0.001109f, -0.003422f, +0.000758f, +0.000943f + }, + { + -0.012443f, -0.131236f, +0.008151f, -0.006995f, +0.018399f, -0.006076f, -0.013231f, -0.028653f, +0.014559f, +0.015554f, + -0.018602f, +0.043755f, +0.015820f, -0.010571f, -0.006300f, -0.001576f, +0.007807f, +0.018852f, -0.004120f, +0.005680f, + +0.009525f, -0.003604f, +0.003784f, -0.016407f, -0.008616f, +0.012553f, +0.019188f, +0.019542f, -0.008932f, -0.005382f, + -0.013696f, -0.007307f, -0.009053f, +0.007192f, +0.002668f, +0.005091f, -0.003978f, +0.011481f, +0.006286f, +0.009235f, + +0.011994f, -0.004294f, -0.000019f, -0.013550f, -0.012677f, +0.004607f, -0.015557f, +0.005544f, -0.000753f, -0.007403f, + +0.008374f, -0.008263f, +0.001571f, -0.001597f, -0.001440f, -0.004863f, -0.001036f, -0.003651f, -0.008925f, -0.002226f, + +0.002793f, -0.000221f, +0.005743f, -0.000543f, +0.002284f, -0.003019f, -0.003154f, +0.002889f, +0.004122f, +0.004317f, + -0.001539f, -0.001571f, -0.000996f, +0.004157f, -0.000785f, +0.003145f, +0.003327f, -0.004593f, -0.001659f, -0.001522f, + +0.002269f, +0.003734f, -0.004321f, +0.000164f, -0.000000f, +0.001895f, +0.003324f, +0.000220f, -0.002488f, +0.002760f, + +0.001438f, +0.000576f, -0.000192f, +0.000518f, +0.001702f, -0.002533f + }, + { + -0.006512f, +0.021521f, -0.000661f, +0.017970f, -0.013045f, -0.006407f, +0.007601f, -0.005650f, +0.009268f, -0.001332f, + -0.008584f, -0.004309f, +0.003683f, -0.004056f, +0.027084f, +0.013063f, +0.005705f, +0.023656f, -0.025540f, -0.016396f, + -0.012966f, +0.008046f, -0.001719f, -0.001939f, -0.016801f, +0.000729f, +0.011499f, +0.020967f, -0.010161f, -0.022971f, + -0.005239f, +0.009747f, +0.010760f, +0.002319f, +0.005237f, +0.013444f, +0.006316f, -0.004692f, +0.007944f, +0.001707f, + +0.006286f, +0.011815f, -0.011023f, +0.010006f, -0.011732f, +0.003704f, -0.007701f, +0.000972f, -0.003715f, -0.004868f, + -0.000489f, +0.007458f, +0.001759f, +0.002791f, +0.006214f, -0.003871f, +0.006437f, -0.011665f, -0.001800f, -0.002882f, + +0.011439f, +0.004375f, -0.006380f, +0.007410f, -0.008360f, +0.004494f, +0.000702f, -0.003050f, +0.004509f, -0.004805f, + +0.000718f, -0.001613f, -0.004056f, -0.003130f, +0.005416f, -0.002243f, +0.000421f, -0.001241f, -0.002588f, +0.004236f, + +0.001746f, +0.002132f, +0.000140f, -0.001661f, +0.002343f, +0.001311f, -0.004089f, +0.000026f, -0.000921f, +0.003993f, + -0.001212f, +0.001421f, -0.001323f, -0.002938f, +0.000033f, -0.002461f + }, + { + -0.002868f, -0.164171f, +0.009671f, +0.008246f, +0.013751f, -0.010118f, -0.007238f, +0.009952f, +0.005800f, +0.013897f, + -0.031182f, -0.000045f, +0.027596f, +0.013100f, -0.000423f, -0.005451f, -0.016236f, +0.017451f, +0.019162f, +0.003314f, + -0.010923f, -0.004008f, +0.002776f, +0.001488f, +0.004869f, -0.002782f, +0.014675f, -0.005399f, -0.004787f, -0.011592f, + -0.000495f, -0.006699f, +0.019803f, -0.003106f, -0.006044f, -0.016630f, +0.002733f, -0.002386f, +0.009312f, -0.010702f, + +0.005783f, +0.007161f, -0.001544f, +0.004619f, -0.007692f, -0.005464f, +0.001553f, -0.010004f, -0.000813f, +0.003184f, + +0.000955f, +0.003749f, -0.001979f, -0.006289f, +0.005912f, +0.000675f, -0.001934f, -0.003401f, -0.003357f, -0.006400f, + +0.005783f, +0.002986f, -0.001052f, -0.005987f, -0.006080f, +0.001793f, -0.003861f, -0.001892f, +0.002671f, +0.001646f, + -0.003157f, +0.002187f, +0.004977f, -0.000740f, +0.002546f, -0.002927f, -0.001048f, +0.003538f, -0.001349f, -0.001166f, + +0.000532f, -0.004134f, +0.000768f, -0.004501f, -0.001100f, -0.000005f, -0.001739f, +0.000693f, -0.002191f, +0.000036f, + +0.002336f, -0.004194f, -0.002682f, -0.002088f, +0.000073f, -0.001631f + }, + { + +0.004170f, -0.067460f, -0.001654f, -0.000211f, -0.007078f, +0.002436f, -0.046155f, -0.009511f, +0.006561f, +0.024745f, + -0.005977f, -0.017947f, -0.030443f, +0.017297f, +0.001272f, +0.030186f, -0.016452f, +0.011040f, +0.006995f, -0.025560f, + +0.008464f, -0.001430f, -0.005601f, -0.006960f, -0.033338f, -0.007932f, -0.030144f, -0.017464f, +0.002391f, -0.001762f, + +0.000337f, +0.002945f, -0.005366f, -0.009492f, -0.011328f, +0.003685f, -0.000313f, -0.000623f, +0.014221f, +0.005823f, + +0.002979f, +0.004722f, +0.005068f, -0.007426f, +0.008323f, +0.010660f, +0.015978f, +0.016986f, -0.013014f, +0.004990f, + +0.006813f, -0.002691f, +0.007126f, -0.007455f, +0.000670f, -0.010716f, -0.001844f, -0.001438f, -0.003203f, +0.002190f, + -0.001376f, +0.007868f, +0.000177f, +0.005498f, +0.007842f, +0.001744f, +0.004733f, -0.001980f, +0.001610f, +0.002311f, + +0.001059f, +0.003151f, -0.000392f, +0.009017f, +0.005314f, -0.005360f, +0.004213f, -0.005427f, -0.004394f, +0.000143f, + -0.003747f, +0.005426f, -0.002838f, +0.000926f, -0.004580f, -0.001583f, +0.000003f, +0.000020f, -0.001192f, -0.000907f, + +0.000549f, +0.001714f, +0.000071f, +0.000163f, +0.002287f, +0.001262f + }, + { + +0.020071f, +0.122850f, -0.019224f, -0.001846f, -0.040515f, +0.053290f, +0.032461f, +0.078940f, -0.003727f, -0.007409f, + +0.010107f, -0.024559f, +0.014916f, +0.011983f, -0.014306f, +0.020294f, +0.000615f, +0.009607f, -0.018852f, +0.024568f, + +0.004318f, +0.021464f, +0.001599f, +0.007892f, -0.019861f, -0.002739f, +0.008264f, +0.013365f, +0.009764f, -0.001484f, + +0.003726f, -0.008602f, -0.008851f, +0.009702f, -0.004557f, +0.004610f, +0.007930f, -0.002363f, -0.006594f, +0.000904f, + -0.002270f, -0.005906f, -0.001344f, +0.003005f, -0.008570f, +0.015202f, +0.000220f, +0.009507f, +0.000538f, +0.011242f, + +0.006752f, -0.000583f, -0.007411f, +0.002062f, -0.000295f, +0.000142f, -0.009107f, -0.002402f, -0.008090f, -0.001855f, + +0.002961f, +0.000629f, -0.009558f, -0.004721f, -0.005654f, +0.003731f, -0.001367f, -0.002956f, +0.002098f, -0.000430f, + -0.000616f, -0.000642f, -0.003770f, +0.000487f, -0.003523f, -0.004254f, -0.002497f, -0.002481f, -0.000736f, +0.002000f, + -0.002953f, -0.002695f, +0.000396f, -0.000575f, +0.005584f, +0.004104f, -0.001674f, +0.000580f, +0.001440f, -0.002599f, + +0.001460f, +0.001934f, +0.002376f, -0.001203f, +0.002176f, -0.000797f + }, + { + +0.005062f, -0.013033f, -0.006641f, -0.002301f, -0.009987f, -0.008906f, +0.014628f, -0.008318f, -0.000707f, +0.008174f, + -0.021571f, -0.005665f, +0.011957f, -0.057307f, -0.004367f, +0.002223f, +0.011635f, -0.002184f, +0.017053f, -0.002602f, + +0.013196f, -0.003537f, +0.004769f, -0.013286f, -0.004706f, -0.008268f, -0.032963f, -0.004046f, +0.030092f, +0.032479f, + -0.013560f, -0.001416f, -0.003810f, +0.012194f, -0.019716f, -0.006142f, +0.019773f, -0.001841f, -0.010482f, +0.000183f, + -0.010534f, -0.010702f, -0.012048f, -0.011779f, +0.001500f, +0.012263f, +0.002225f, -0.013817f, -0.014683f, +0.003894f, + -0.004499f, +0.006265f, +0.001363f, -0.005593f, -0.004433f, -0.009830f, +0.005918f, -0.001894f, +0.006462f, +0.001565f, + +0.004101f, -0.007064f, +0.007914f, -0.002928f, +0.001429f, -0.001264f, -0.005241f, -0.001945f, -0.000387f, -0.005146f, + +0.007071f, -0.003328f, -0.006302f, +0.000789f, -0.002373f, +0.000228f, -0.002399f, -0.003395f, -0.003307f, -0.003451f, + -0.003449f, +0.000685f, -0.002395f, -0.002705f, +0.000511f, -0.000820f, +0.003200f, +0.003491f, -0.000773f, +0.000102f, + -0.002064f, +0.002662f, -0.000470f, -0.001214f, -0.000399f, +0.003902f + }, + { + -0.025438f, -0.034789f, +0.029768f, +0.003155f, -0.074394f, +0.004236f, -0.034217f, -0.004066f, -0.009304f, -0.027188f, + +0.009357f, -0.011992f, +0.013976f, +0.039188f, +0.017340f, -0.010413f, +0.038918f, +0.003263f, -0.000972f, +0.028970f, + -0.024184f, +0.017575f, -0.010360f, -0.013512f, +0.033716f, +0.010259f, +0.015876f, +0.010489f, -0.017826f, -0.014134f, + +0.007053f, +0.004015f, -0.005462f, -0.004754f, -0.015657f, +0.014235f, +0.000609f, -0.013182f, +0.006772f, +0.000270f, + -0.004232f, +0.000793f, -0.006404f, -0.012739f, -0.000961f, -0.001349f, +0.019006f, +0.005383f, +0.003265f, -0.000394f, + -0.000181f, +0.012304f, -0.000579f, +0.005086f, +0.006535f, -0.001209f, -0.004086f, -0.002512f, +0.003987f, +0.007413f, + -0.007523f, +0.005686f, +0.004723f, -0.008441f, -0.002871f, +0.011576f, -0.003679f, +0.000788f, -0.003657f, -0.009676f, + -0.000078f, -0.005791f, +0.004858f, +0.004418f, +0.001344f, +0.002631f, -0.001344f, -0.003029f, +0.000178f, -0.005047f, + +0.001675f, +0.000464f, +0.000969f, -0.004922f, -0.002731f, -0.001671f, +0.001821f, -0.000343f, -0.002037f, +0.000073f, + +0.000646f, +0.000133f, -0.003417f, -0.001837f, +0.001961f, +0.001169f + }, + { + -0.005529f, -0.033938f, +0.013734f, -0.008988f, +0.002555f, +0.009534f, +0.004404f, +0.002827f, -0.019737f, -0.004925f, + -0.008226f, +0.014123f, -0.002710f, -0.064701f, -0.003638f, +0.019007f, +0.017679f, -0.010719f, -0.002463f, +0.010278f, + -0.018847f, -0.003353f, +0.000593f, +0.012522f, +0.019409f, +0.002678f, -0.031794f, +0.014777f, +0.000797f, -0.005300f, + +0.018947f, +0.001140f, -0.004005f, -0.008756f, -0.024392f, +0.010703f, -0.000384f, -0.014234f, +0.002773f, -0.010076f, + +0.008698f, -0.001434f, -0.005706f, +0.018867f, -0.003030f, +0.009349f, +0.009373f, -0.001936f, -0.002945f, +0.017269f, + -0.003728f, +0.007482f, -0.006020f, +0.008045f, +0.010266f, -0.006822f, -0.000669f, +0.002553f, -0.001697f, +0.005631f, + +0.008080f, -0.015330f, -0.003833f, +0.006116f, -0.005656f, +0.000044f, -0.003719f, +0.002428f, +0.002305f, +0.002331f, + -0.000723f, +0.004184f, +0.004120f, +0.001111f, -0.002605f, +0.002300f, -0.001938f, +0.002381f, -0.005286f, +0.002344f, + +0.003105f, +0.001045f, -0.001062f, +0.001078f, +0.000719f, +0.002606f, -0.002568f, +0.001807f, -0.001761f, -0.001525f, + +0.006124f, +0.000699f, +0.002359f, -0.002345f, +0.001333f, +0.000270f + }, + { + -0.018900f, -0.067675f, +0.010546f, -0.009222f, -0.003143f, +0.002858f, +0.001773f, +0.002648f, -0.011085f, +0.011855f, + -0.002550f, +0.022764f, -0.006721f, +0.002000f, -0.083981f, -0.039602f, -0.002291f, +0.001718f, -0.002234f, +0.007779f, + -0.031454f, -0.003499f, -0.008549f, -0.017642f, -0.012391f, +0.002137f, -0.004114f, +0.014266f, -0.017648f, -0.006901f, + +0.006666f, -0.011102f, +0.009072f, +0.007812f, +0.007896f, -0.000228f, -0.000917f, -0.024500f, -0.003007f, +0.004961f, + -0.026576f, +0.002200f, -0.011087f, +0.011435f, +0.003292f, +0.013083f, -0.005402f, +0.009861f, -0.006538f, -0.012582f, + +0.006912f, -0.004428f, +0.008188f, +0.006888f, -0.001603f, +0.004009f, +0.002917f, +0.007808f, -0.007941f, +0.004944f, + -0.002879f, -0.004496f, -0.002876f, +0.001994f, -0.001054f, -0.010243f, -0.000328f, -0.004314f, +0.013023f, -0.004085f, + -0.004110f, -0.009192f, +0.006345f, +0.001788f, -0.001315f, +0.000525f, +0.002507f, +0.001219f, +0.000130f, -0.002638f, + +0.001828f, +0.002956f, +0.004990f, +0.001873f, +0.003404f, +0.005401f, +0.001078f, +0.005038f, -0.000252f, -0.000418f, + -0.002634f, -0.001944f, +0.001349f, +0.001420f, +0.000099f, +0.001713f + } + }, + { + { + +0.002898f, +0.032579f, -0.012817f, -0.068437f, +0.025888f, -0.012050f, -0.005647f, +0.000083f, -0.006437f, +0.001915f, + -0.007458f, +0.017488f, -0.006572f, -0.011574f, -0.004629f, +0.017451f, +0.001453f, +0.016301f, -0.015634f, +0.007946f, + +0.015891f, -0.026199f, -0.012441f, +0.005854f, -0.000960f, +0.020023f, +0.000281f, -0.003923f, +0.002600f, +0.025944f, + -0.000877f, -0.000257f, -0.019527f, -0.006714f, -0.000005f, -0.007208f, +0.006705f, +0.005912f, +0.019020f, +0.013560f, + +0.005239f, -0.007067f, -0.014275f, +0.008652f, -0.003190f, -0.009704f, -0.004025f, -0.002546f, +0.006705f, -0.004215f, + -0.000549f, +0.003684f, +0.005350f, -0.001885f, -0.004263f, +0.007230f, +0.009469f, +0.000817f, -0.007556f, -0.004000f, + +0.001591f, +0.003008f, -0.002421f, -0.007276f, -0.004704f, +0.004873f, +0.007444f, +0.002501f, -0.003791f, -0.009496f, + -0.005431f, +0.006584f, -0.003784f, -0.000629f, +0.006119f, -0.001557f, +0.004696f, +0.000281f, +0.002854f, -0.004686f, + +0.000602f, +0.003255f, +0.004473f, +0.000553f, +0.000137f, +0.000535f, -0.000436f, -0.001908f, -0.003268f, +0.001053f, + -0.000371f, -0.000585f, -0.000515f, +0.002557f, +0.000915f, +0.001589f + }, + { + +0.035248f, +0.028615f, +0.033399f, +0.176972f, +0.029328f, -0.009158f, -0.012324f, +0.005863f, -0.012269f, -0.012504f, + +0.004399f, +0.015602f, -0.007186f, +0.016490f, -0.000019f, -0.023039f, -0.011717f, +0.009709f, +0.002527f, -0.013736f, + +0.028475f, -0.001530f, +0.000900f, +0.001252f, +0.018999f, +0.001059f, -0.002479f, -0.019587f, +0.005939f, -0.001587f, + -0.003497f, +0.011653f, +0.001208f, -0.011718f, -0.009238f, +0.005397f, +0.015274f, +0.012352f, +0.004092f, +0.010128f, + -0.000843f, +0.006527f, -0.008251f, -0.007871f, -0.003487f, +0.003602f, +0.010034f, -0.004513f, -0.010362f, +0.004111f, + +0.001122f, +0.000083f, -0.006172f, -0.004218f, -0.002806f, -0.002465f, -0.002425f, +0.003200f, +0.003755f, -0.005373f, + +0.003352f, -0.003271f, +0.010498f, -0.003067f, +0.001789f, -0.001302f, +0.006136f, -0.002369f, +0.001093f, -0.001845f, + -0.001150f, -0.000506f, +0.002634f, -0.001972f, -0.004699f, +0.002311f, -0.002503f, -0.002358f, +0.006593f, +0.002643f, + -0.001107f, +0.001731f, -0.000144f, -0.001452f, +0.003569f, -0.002445f, +0.002202f, -0.000970f, +0.001781f, +0.004291f, + +0.001894f, -0.000323f, -0.000725f, -0.001631f, -0.002631f, -0.001505f + }, + { + -0.014254f, -0.040197f, +0.018094f, +0.014355f, -0.061851f, -0.005780f, -0.011361f, +0.001359f, +0.002595f, +0.013470f, + -0.000296f, -0.032290f, -0.016971f, +0.020060f, -0.006604f, -0.004216f, +0.010298f, -0.006922f, +0.000318f, +0.001888f, + +0.005313f, -0.004303f, +0.004187f, -0.005954f, -0.011780f, -0.001704f, +0.010239f, +0.001850f, -0.004345f, -0.007999f, + -0.012251f, +0.018783f, +0.022531f, +0.011214f, -0.009821f, +0.003407f, +0.001266f, +0.001575f, +0.003336f, +0.002400f, + +0.007046f, -0.007716f, +0.011133f, -0.002156f, -0.016263f, -0.009514f, +0.006170f, -0.002997f, +0.004135f, +0.002731f, + +0.004191f, +0.001667f, +0.012344f, +0.014047f, -0.000299f, -0.003148f, -0.002064f, +0.003298f, +0.002711f, +0.001620f, + +0.007056f, -0.001111f, -0.001073f, -0.001344f, -0.000443f, -0.001494f, -0.004025f, +0.003630f, +0.001959f, -0.005050f, + +0.002042f, +0.002041f, -0.003415f, -0.003127f, -0.003379f, -0.000614f, -0.000451f, -0.001673f, -0.000267f, +0.000778f, + -0.001403f, -0.002558f, +0.000222f, -0.001011f, -0.000917f, -0.001896f, -0.000459f, -0.003540f, +0.003122f, -0.001030f, + +0.001928f, -0.001162f, +0.000830f, +0.000323f, +0.000213f, -0.005144f + }, + { + -0.004040f, +0.018761f, +0.003638f, -0.018714f, +0.003639f, -0.003622f, -0.001382f, +0.005000f, -0.012744f, +0.007716f, + -0.001336f, -0.015248f, -0.003454f, -0.008511f, -0.011194f, +0.006889f, +0.000304f, +0.015681f, -0.010647f, -0.008285f, + +0.009335f, -0.000162f, +0.011747f, -0.000062f, -0.005804f, +0.012610f, +0.001813f, -0.000290f, -0.013807f, -0.005885f, + -0.010797f, +0.009779f, -0.016748f, +0.008837f, -0.011982f, +0.003229f, +0.011142f, +0.005382f, -0.007976f, -0.006112f, + -0.008258f, -0.008042f, -0.009149f, -0.007799f, -0.015362f, +0.005250f, +0.004173f, +0.008894f, +0.005989f, +0.003727f, + +0.009600f, -0.002687f, -0.005665f, -0.005261f, -0.002553f, +0.000591f, -0.003076f, +0.005736f, -0.003006f, +0.011176f, + +0.010046f, +0.007687f, +0.005497f, +0.002356f, -0.001803f, +0.003054f, -0.005376f, -0.004697f, -0.004833f, -0.001556f, + -0.001142f, +0.004240f, -0.007672f, -0.002468f, -0.000967f, +0.002169f, +0.004750f, +0.002976f, -0.000134f, +0.002088f, + -0.004037f, +0.000021f, -0.001376f, -0.002716f, +0.002315f, +0.000556f, +0.000563f, -0.001143f, +0.000752f, -0.001306f, + -0.000624f, +0.001230f, +0.000576f, -0.001089f, +0.000612f, -0.000260f + }, + { + +0.009065f, -0.098193f, +0.016618f, -0.032870f, -0.007677f, +0.001436f, -0.007423f, +0.004678f, +0.014407f, +0.010164f, + +0.005468f, +0.053251f, +0.014831f, +0.007081f, +0.008442f, -0.007280f, -0.005398f, -0.007441f, +0.010833f, -0.003457f, + +0.011180f, +0.018862f, -0.022600f, -0.004489f, +0.011297f, -0.018975f, +0.024451f, -0.025392f, -0.014415f, -0.004365f, + +0.010598f, +0.002011f, -0.003587f, -0.002555f, -0.008169f, -0.009282f, -0.013276f, +0.002638f, -0.006499f, -0.006875f, + -0.004755f, +0.006495f, -0.002471f, +0.007324f, +0.010996f, -0.007898f, +0.005382f, -0.000992f, -0.006460f, -0.005283f, + +0.005210f, -0.002205f, -0.004654f, -0.002291f, -0.002012f, +0.006490f, -0.004380f, +0.005182f, +0.001960f, +0.001656f, + -0.000641f, -0.004615f, +0.003988f, +0.002796f, +0.006191f, -0.005409f, +0.002092f, -0.000052f, +0.000778f, -0.004804f, + -0.004731f, -0.002772f, +0.002008f, +0.000130f, -0.005108f, -0.002732f, +0.001451f, -0.001826f, -0.001855f, -0.002132f, + -0.000413f, -0.002070f, +0.001244f, -0.001959f, +0.001155f, +0.002941f, -0.004316f, +0.001735f, +0.003846f, +0.001932f, + +0.001559f, +0.001228f, -0.001173f, -0.002761f, -0.000660f, +0.001322f + }, + { + -0.000201f, -0.003252f, -0.026328f, +0.010248f, +0.002700f, -0.002028f, +0.003345f, -0.006325f, +0.010878f, +0.000588f, + -0.015148f, +0.006245f, -0.007315f, +0.009676f, +0.009677f, -0.004836f, +0.018939f, +0.013087f, +0.002079f, +0.002942f, + -0.004586f, +0.018072f, +0.015798f, -0.014842f, +0.017552f, +0.023428f, -0.006628f, +0.010468f, -0.001964f, -0.016267f, + -0.005534f, -0.001651f, -0.014428f, -0.011295f, -0.013059f, -0.001457f, -0.013425f, -0.003939f, +0.003099f, +0.000122f, + +0.013123f, +0.004858f, -0.004689f, +0.000131f, +0.003189f, +0.005854f, +0.000162f, -0.002864f, -0.006892f, +0.003969f, + -0.000473f, +0.004836f, +0.001658f, +0.009435f, +0.003573f, +0.003924f, +0.004425f, -0.002596f, +0.001640f, -0.001497f, + -0.002680f, -0.003292f, +0.003017f, -0.005503f, +0.000298f, -0.001625f, -0.002398f, -0.003165f, -0.000225f, +0.000214f, + +0.000749f, -0.000301f, -0.007183f, +0.005533f, +0.003976f, +0.001506f, +0.004406f, -0.002025f, +0.001763f, -0.003878f, + +0.004226f, -0.000876f, -0.005287f, +0.000681f, -0.002731f, -0.000300f, +0.003980f, -0.000225f, -0.003659f, -0.001548f, + -0.000547f, +0.000130f, -0.000476f, -0.001171f, +0.002283f, +0.001741f + }, + { + +0.031571f, -0.083900f, +0.013026f, -0.021671f, -0.009555f, -0.007657f, -0.015240f, -0.018056f, +0.017106f, +0.001962f, + -0.024512f, +0.027283f, +0.011808f, -0.014544f, -0.002951f, +0.020451f, -0.009183f, -0.011078f, -0.014604f, +0.005953f, + +0.020072f, +0.001727f, +0.000739f, +0.002311f, +0.031429f, +0.015145f, +0.007650f, +0.009586f, +0.002267f, +0.007063f, + -0.004286f, +0.004348f, -0.004399f, +0.003522f, -0.005482f, -0.012738f, -0.008197f, +0.008594f, -0.009008f, -0.009554f, + +0.001569f, -0.012668f, -0.002822f, +0.000463f, -0.004098f, +0.004514f, -0.015788f, -0.000747f, +0.004724f, +0.004179f, + +0.011986f, -0.010398f, +0.000294f, +0.004724f, +0.001217f, -0.003976f, +0.000244f, +0.000329f, -0.008344f, -0.002790f, + +0.000122f, -0.003046f, +0.005269f, +0.000605f, +0.004846f, +0.002523f, -0.000662f, +0.005771f, +0.003938f, -0.000947f, + -0.004260f, -0.000607f, -0.005170f, -0.001030f, -0.003644f, +0.000505f, +0.003764f, -0.003017f, -0.002470f, -0.004702f, + +0.000164f, +0.003856f, -0.002208f, +0.003749f, +0.000014f, +0.001376f, +0.001709f, -0.000483f, -0.002019f, +0.003375f, + -0.000710f, -0.003237f, -0.002554f, +0.000461f, +0.000840f, -0.002494f + }, + { + +0.000112f, +0.070325f, +0.004281f, +0.005657f, -0.015212f, +0.001148f, +0.007523f, -0.007436f, +0.007316f, -0.007399f, + -0.008404f, +0.009405f, +0.015894f, +0.000567f, +0.014126f, +0.014485f, -0.010040f, -0.006641f, -0.016050f, +0.010368f, + +0.004237f, +0.012901f, +0.001859f, +0.003371f, -0.008537f, +0.015103f, +0.006752f, +0.005997f, -0.019243f, -0.019693f, + -0.006314f, -0.003993f, -0.004131f, -0.007157f, -0.006265f, +0.009876f, -0.009225f, -0.020931f, +0.006609f, +0.005601f, + +0.004604f, +0.015883f, -0.011285f, +0.014670f, -0.003391f, +0.001644f, -0.010002f, +0.001949f, +0.002065f, +0.006267f, + +0.000812f, -0.001799f, -0.004356f, -0.001330f, +0.003194f, -0.006966f, +0.005815f, -0.011526f, -0.001178f, -0.009438f, + +0.004382f, -0.004479f, -0.010575f, +0.010122f, -0.007218f, +0.004254f, -0.003256f, -0.001010f, +0.005079f, -0.007881f, + -0.000535f, -0.000586f, -0.000060f, +0.000643f, +0.002547f, -0.004584f, +0.001783f, -0.001524f, -0.005776f, -0.000289f, + -0.003153f, -0.002670f, +0.000683f, +0.001536f, +0.001248f, +0.000667f, -0.001786f, +0.001504f, -0.002074f, +0.002525f, + -0.004347f, -0.000369f, +0.002589f, +0.000463f, +0.000080f, -0.002093f + }, + { + +0.026448f, -0.133584f, +0.025158f, -0.014327f, -0.010610f, -0.008681f, -0.030922f, -0.010903f, -0.009600f, -0.008265f, + -0.006356f, +0.014296f, +0.023817f, +0.013528f, -0.013196f, +0.047383f, +0.011586f, -0.006601f, +0.011519f, +0.004110f, + -0.012795f, -0.002340f, +0.015749f, -0.002706f, -0.002415f, -0.010017f, +0.004443f, -0.005286f, -0.007190f, -0.008567f, + +0.003385f, -0.011140f, +0.017186f, +0.004284f, +0.005015f, -0.010256f, +0.010542f, +0.008584f, +0.013312f, -0.016088f, + +0.004362f, -0.000034f, -0.009853f, +0.004446f, -0.004349f, -0.001822f, +0.001609f, -0.009994f, -0.003046f, -0.004887f, + +0.002584f, +0.005784f, -0.001954f, -0.005563f, +0.010952f, +0.005270f, +0.000603f, +0.001855f, -0.001674f, -0.010872f, + -0.004481f, +0.002654f, +0.004793f, +0.006422f, +0.003293f, +0.010169f, +0.001862f, +0.000490f, +0.005747f, +0.001498f, + -0.003958f, +0.003439f, +0.003645f, -0.001872f, +0.001702f, -0.001654f, +0.002747f, +0.003463f, -0.002381f, -0.000450f, + +0.002010f, -0.002067f, +0.005348f, -0.003120f, -0.000289f, +0.003110f, -0.003234f, -0.000784f, -0.000097f, +0.000274f, + +0.003589f, -0.001604f, -0.000566f, -0.001116f, -0.001688f, -0.001684f + }, + { + -0.006064f, -0.067326f, +0.012364f, +0.000634f, -0.000900f, +0.034063f, -0.022461f, -0.019812f, +0.010672f, +0.010551f, + -0.029260f, -0.012859f, -0.030098f, +0.014237f, +0.002943f, +0.004998f, -0.045861f, +0.005933f, +0.024763f, -0.019022f, + +0.004359f, -0.007232f, -0.018324f, -0.005098f, -0.007940f, +0.013168f, -0.016433f, -0.012742f, -0.001112f, -0.012851f, + -0.007504f, -0.006141f, -0.017487f, -0.009630f, -0.013216f, -0.002371f, -0.006295f, -0.005639f, +0.012981f, -0.006994f, + -0.006503f, +0.003306f, -0.003984f, -0.019709f, +0.006388f, -0.002979f, +0.001276f, +0.011432f, -0.007093f, +0.011605f, + -0.001651f, -0.006555f, +0.003029f, -0.008482f, +0.008013f, +0.002579f, +0.008740f, -0.003004f, -0.008441f, +0.002635f, + -0.007367f, +0.000878f, -0.008045f, -0.000966f, +0.008577f, +0.001369f, -0.000249f, +0.000346f, +0.003207f, -0.003890f, + -0.006632f, +0.000249f, -0.001020f, +0.005277f, +0.005078f, -0.005974f, +0.006296f, +0.000231f, -0.005080f, -0.002543f, + -0.001248f, +0.006836f, -0.000918f, +0.002602f, -0.002579f, -0.001323f, +0.000632f, +0.000403f, -0.000780f, -0.001725f, + -0.001513f, -0.003120f, -0.000253f, -0.000270f, -0.001282f, +0.001044f + }, + { + -0.026194f, +0.072573f, -0.033856f, +0.002255f, -0.041848f, -0.023353f, -0.040674f, +0.048630f, -0.000206f, -0.003118f, + +0.016761f, -0.013540f, -0.003495f, -0.007329f, -0.027736f, +0.009087f, +0.007410f, +0.031677f, -0.005923f, +0.015883f, + -0.006264f, +0.004969f, -0.026796f, +0.008369f, -0.019482f, -0.003007f, +0.016413f, +0.000594f, -0.002008f, +0.006554f, + -0.002012f, -0.022579f, -0.010807f, +0.009639f, -0.017871f, +0.001263f, +0.023456f, +0.011910f, +0.005393f, -0.000333f, + -0.007555f, +0.002500f, +0.003111f, -0.001063f, -0.007625f, +0.013136f, -0.003169f, +0.005115f, -0.001972f, +0.010210f, + +0.001200f, -0.005694f, -0.006616f, +0.003382f, +0.002841f, +0.005855f, -0.007242f, +0.003171f, -0.000734f, -0.000283f, + -0.002439f, -0.000952f, -0.002799f, +0.002757f, -0.004034f, +0.004631f, +0.001144f, -0.000361f, +0.002385f, +0.000960f, + +0.000275f, -0.002123f, +0.001217f, +0.005877f, -0.001007f, -0.004077f, -0.001521f, +0.001257f, +0.000150f, +0.001161f, + -0.002821f, -0.001146f, +0.003725f, +0.002305f, +0.003146f, +0.000686f, -0.005258f, -0.002492f, +0.001288f, -0.003588f, + -0.000382f, +0.000687f, +0.000924f, +0.000408f, +0.002663f, -0.000194f + }, + { + -0.005333f, -0.013961f, +0.006058f, -0.008244f, -0.006553f, -0.002089f, +0.015833f, +0.000534f, +0.001294f, +0.015083f, + -0.026749f, -0.023236f, +0.013265f, -0.044125f, -0.006224f, -0.004086f, +0.020042f, -0.017766f, -0.002643f, -0.022544f, + -0.006801f, -0.025366f, -0.003397f, -0.001923f, -0.004693f, -0.008588f, -0.019055f, +0.024417f, +0.029883f, +0.007153f, + -0.010096f, +0.006203f, -0.014926f, +0.001558f, -0.012403f, +0.003994f, +0.022072f, +0.002079f, -0.004033f, +0.014122f, + +0.002101f, -0.007592f, -0.002507f, +0.002449f, +0.003907f, +0.005226f, -0.011198f, -0.017777f, -0.005850f, +0.017528f, + -0.005843f, -0.002664f, +0.000306f, -0.001851f, +0.002720f, -0.009128f, +0.003896f, +0.000298f, +0.010455f, -0.001401f, + +0.003695f, -0.007571f, +0.008414f, +0.006200f, +0.005619f, -0.002622f, -0.006733f, +0.000355f, -0.001028f, -0.008103f, + +0.004013f, -0.002580f, +0.000861f, +0.003151f, -0.001391f, +0.005796f, -0.003215f, -0.004343f, -0.000696f, -0.001122f, + -0.005309f, +0.001446f, +0.000059f, +0.000263f, +0.002120f, -0.000098f, +0.003159f, +0.002416f, +0.000889f, +0.002787f, + -0.003339f, +0.001324f, -0.000231f, +0.000119f, -0.001042f, +0.004037f + }, + { + +0.029813f, +0.021308f, +0.019922f, +0.017327f, -0.023762f, +0.056590f, -0.008786f, +0.015970f, -0.013899f, -0.013982f, + +0.022262f, -0.009262f, +0.001982f, +0.005517f, -0.003679f, -0.033679f, +0.014489f, -0.015208f, +0.002996f, +0.039557f, + -0.020541f, +0.006996f, -0.002844f, +0.006287f, +0.033331f, +0.006163f, +0.008959f, +0.019999f, +0.004219f, +0.006522f, + +0.013949f, +0.002653f, -0.004288f, -0.006279f, -0.015130f, +0.006864f, +0.008028f, +0.001464f, +0.000716f, -0.001311f, + -0.002444f, +0.007952f, +0.007181f, +0.001661f, +0.004716f, -0.005944f, +0.009543f, +0.003341f, +0.005550f, +0.006752f, + +0.003887f, +0.012829f, -0.001831f, -0.000574f, +0.009093f, +0.002500f, -0.000490f, -0.002974f, -0.004640f, +0.009986f, + -0.003977f, +0.003679f, +0.001180f, -0.003374f, +0.000349f, +0.003417f, -0.005388f, +0.001946f, +0.003314f, -0.001083f, + +0.000590f, -0.003200f, +0.003299f, +0.002926f, +0.001197f, +0.003097f, +0.000511f, -0.001543f, +0.000327f, -0.005199f, + +0.001991f, +0.000767f, +0.003396f, -0.000884f, +0.002550f, -0.002024f, -0.000368f, -0.001001f, +0.001995f, +0.006297f, + +0.003075f, +0.002307f, -0.000839f, -0.000169f, +0.002298f, +0.001661f + }, + { + +0.006619f, -0.035063f, +0.006079f, -0.004825f, -0.002176f, +0.006128f, -0.000716f, +0.008780f, -0.006182f, +0.000807f, + -0.004724f, +0.003277f, +0.001636f, +0.092291f, +0.199568f, -0.001970f, -0.014985f, -0.004706f, +0.014987f, -0.000349f, + -0.007548f, +0.010211f, +0.004299f, -0.009772f, +0.002414f, -0.001544f, -0.044721f, -0.008754f, -0.013429f, -0.018359f, + +0.012034f, +0.004103f, +0.001805f, +0.015064f, -0.010205f, +0.004475f, -0.002353f, -0.016202f, +0.003135f, -0.010728f, + +0.007030f, +0.000472f, +0.002027f, +0.016598f, +0.001442f, +0.019692f, +0.006257f, -0.007956f, -0.009646f, +0.006488f, + -0.001993f, +0.004836f, -0.009632f, +0.006239f, +0.008997f, -0.003903f, +0.002055f, -0.003972f, -0.006850f, +0.005214f, + +0.003880f, -0.006756f, +0.001486f, +0.001366f, -0.005527f, +0.003493f, -0.000827f, +0.001882f, +0.003902f, +0.006950f, + -0.002878f, +0.000555f, +0.001329f, -0.001452f, +0.000258f, +0.004574f, -0.005038f, +0.003768f, +0.000334f, +0.004443f, + +0.003049f, -0.001090f, -0.000202f, +0.000873f, +0.000085f, +0.005740f, -0.001118f, +0.000539f, -0.003141f, -0.004344f, + +0.000180f, -0.002352f, +0.001960f, -0.004105f, +0.000612f, -0.000221f + }, + { + +0.030820f, -0.015704f, -0.012518f, -0.017558f, +0.029422f, +0.026762f, -0.004679f, +0.001497f, -0.013952f, +0.012121f, + -0.001900f, +0.029267f, +0.006595f, -0.011783f, -0.081573f, +0.002779f, -0.012010f, -0.015129f, -0.010497f, +0.000095f, + -0.032652f, -0.002663f, -0.001632f, -0.027158f, -0.017970f, -0.004950f, -0.001082f, +0.028749f, -0.016059f, -0.023869f, + -0.003629f, -0.006145f, +0.003083f, +0.004201f, +0.010101f, -0.004099f, -0.004137f, -0.020921f, -0.001778f, +0.023552f, + -0.001505f, +0.011614f, -0.018616f, +0.011357f, +0.010698f, +0.014719f, -0.005235f, +0.009064f, +0.000797f, +0.001030f, + +0.009024f, -0.007817f, +0.000168f, +0.002301f, +0.002098f, +0.005086f, +0.002434f, +0.002378f, -0.008044f, +0.006506f, + +0.002378f, +0.003367f, +0.002865f, +0.009830f, +0.002702f, -0.011784f, -0.000023f, -0.007643f, +0.001820f, -0.007918f, + +0.005583f, -0.000084f, +0.012775f, +0.002211f, -0.004427f, -0.005924f, +0.000402f, +0.003350f, -0.003234f, -0.005911f, + +0.002308f, +0.000566f, +0.000581f, -0.003306f, -0.000342f, -0.000326f, -0.002686f, +0.001332f, -0.002485f, +0.000176f, + -0.002559f, -0.002798f, +0.001291f, +0.002158f, -0.000438f, -0.002978f + } + }, + { + { + -0.003373f, -0.026072f, +0.027737f, +0.021078f, -0.045470f, +0.003257f, -0.012750f, -0.008346f, +0.006075f, +0.001826f, + -0.011470f, +0.018426f, +0.002870f, -0.006068f, -0.000434f, +0.001287f, -0.004585f, +0.006528f, +0.025006f, -0.007036f, + +0.003309f, -0.019491f, -0.015075f, +0.027205f, -0.009573f, +0.025063f, -0.000355f, -0.003256f, +0.007354f, +0.009847f, + +0.005683f, -0.001836f, -0.019611f, +0.002167f, +0.002947f, -0.020624f, +0.015387f, +0.017162f, +0.009834f, +0.005906f, + +0.003860f, -0.005234f, -0.008793f, +0.006689f, -0.006339f, +0.001925f, -0.011191f, +0.001507f, +0.002117f, -0.004846f, + -0.001797f, +0.003135f, +0.007921f, -0.011396f, +0.006431f, +0.009096f, +0.003500f, +0.005262f, +0.000921f, -0.006382f, + -0.009119f, +0.002763f, -0.001652f, -0.003745f, -0.007893f, +0.006730f, +0.002335f, +0.000377f, -0.001807f, -0.008552f, + +0.001496f, -0.001456f, +0.000920f, -0.002330f, +0.004590f, -0.002962f, +0.005782f, +0.000477f, +0.001411f, -0.004913f, + +0.002419f, +0.002137f, +0.003979f, +0.001898f, -0.002550f, +0.003958f, -0.002966f, -0.002071f, -0.003394f, +0.001729f, + -0.000532f, +0.000282f, -0.002086f, +0.001647f, +0.003347f, +0.000858f + }, + { + -0.040305f, +0.116461f, +0.036514f, +0.209998f, +0.008867f, -0.020062f, +0.022635f, +0.000386f, -0.028635f, +0.009596f, + -0.016591f, -0.001241f, -0.003281f, +0.015694f, -0.005311f, -0.016855f, -0.012717f, +0.008968f, +0.001672f, -0.022145f, + +0.025160f, +0.020838f, -0.013993f, +0.008075f, +0.001051f, +0.011452f, -0.022027f, -0.000013f, +0.008421f, +0.002151f, + -0.015391f, +0.003041f, +0.005248f, -0.007344f, -0.005812f, +0.000651f, +0.010996f, +0.018468f, +0.007461f, +0.007911f, + +0.000080f, +0.004433f, -0.006936f, -0.002119f, -0.009158f, +0.012608f, +0.001858f, -0.003260f, -0.000811f, -0.009325f, + +0.006685f, -0.007757f, -0.001168f, -0.006576f, -0.004813f, +0.005739f, -0.005866f, +0.004440f, +0.006181f, -0.004945f, + -0.007593f, +0.008968f, +0.002117f, +0.001388f, +0.003646f, +0.003841f, -0.002374f, -0.002349f, +0.001043f, +0.004596f, + -0.007428f, -0.000846f, +0.003648f, -0.002548f, -0.000800f, -0.004579f, +0.002468f, -0.002754f, +0.006814f, +0.001600f, + -0.002769f, +0.003143f, +0.000791f, +0.000386f, -0.002288f, +0.004499f, -0.004068f, +0.006142f, -0.001527f, +0.002303f, + +0.001241f, +0.000840f, -0.001718f, +0.002834f, -0.005548f, -0.000595f + }, + { + +0.014201f, -0.000440f, -0.053130f, -0.065916f, +0.014266f, -0.009369f, -0.025501f, +0.018424f, +0.001778f, +0.018579f, + -0.013651f, -0.018519f, -0.022264f, +0.030297f, -0.014813f, +0.012376f, -0.002365f, +0.006126f, -0.009846f, -0.012211f, + +0.020811f, -0.015299f, +0.011683f, -0.013907f, -0.005487f, +0.006036f, +0.009961f, +0.001369f, -0.006124f, -0.005145f, + +0.000002f, +0.007869f, +0.016149f, +0.016847f, +0.002296f, -0.005928f, +0.009135f, +0.003750f, -0.005685f, +0.008169f, + -0.007065f, +0.000892f, +0.002538f, -0.008527f, -0.004574f, +0.001718f, -0.006254f, +0.001810f, -0.003072f, +0.005868f, + +0.000041f, +0.004532f, +0.011061f, +0.015566f, +0.002376f, -0.006510f, -0.003474f, +0.003731f, -0.001799f, +0.008630f, + +0.000681f, +0.002785f, -0.001247f, +0.000318f, -0.001266f, -0.006146f, +0.001896f, +0.001008f, +0.003892f, -0.002346f, + -0.001617f, +0.001632f, -0.006663f, -0.001940f, -0.000784f, -0.002352f, +0.001207f, -0.002690f, +0.000242f, +0.003079f, + -0.003437f, -0.004413f, +0.001584f, -0.003274f, +0.000663f, -0.001294f, -0.002844f, -0.002933f, -0.000035f, +0.002111f, + +0.001982f, -0.000431f, -0.002251f, +0.001171f, +0.000834f, -0.005026f + }, + { + +0.001781f, +0.044265f, -0.019376f, -0.019376f, +0.001258f, -0.000576f, -0.001934f, -0.006368f, -0.000394f, +0.000916f, + +0.009531f, -0.007330f, -0.020044f, -0.006488f, +0.005060f, -0.001126f, -0.000353f, -0.005288f, +0.005738f, -0.003449f, + +0.008016f, +0.016207f, +0.008477f, -0.002055f, -0.004727f, +0.017955f, +0.007904f, +0.012613f, -0.019120f, -0.014279f, + -0.013758f, +0.011008f, -0.006559f, +0.005889f, -0.013741f, -0.007468f, +0.010306f, +0.001641f, -0.003365f, +0.006465f, + -0.012715f, -0.007115f, -0.010812f, -0.006516f, -0.004675f, -0.005980f, +0.008488f, +0.001143f, +0.010137f, +0.011527f, + +0.003503f, -0.011479f, -0.002270f, -0.002909f, -0.008155f, +0.001548f, +0.006279f, -0.002992f, +0.003596f, +0.010433f, + +0.014918f, +0.004314f, +0.002751f, -0.000133f, +0.004714f, -0.000495f, -0.001096f, -0.006609f, -0.005655f, +0.001912f, + +0.002598f, +0.001945f, -0.008501f, -0.002364f, +0.001708f, +0.000124f, +0.004951f, +0.001317f, +0.000395f, +0.003001f, + -0.000943f, -0.003920f, -0.004182f, +0.003447f, +0.000564f, -0.000670f, -0.000817f, +0.002453f, -0.003032f, +0.001000f, + -0.002415f, +0.001206f, +0.003647f, -0.000034f, -0.001889f, -0.001567f + }, + { + -0.020701f, -0.060666f, -0.000839f, -0.046255f, +0.018864f, -0.001763f, +0.004106f, -0.008052f, +0.013819f, -0.010465f, + +0.041384f, +0.025547f, +0.026081f, +0.004553f, +0.017346f, -0.009079f, +0.006912f, -0.030853f, +0.007656f, +0.019643f, + -0.001005f, +0.013751f, -0.002790f, -0.008881f, -0.003269f, -0.014077f, -0.004353f, -0.027967f, +0.004185f, +0.008858f, + -0.002122f, +0.008501f, -0.005681f, -0.003297f, -0.007132f, -0.002219f, -0.006411f, -0.014555f, +0.008991f, -0.014026f, + +0.006050f, +0.002239f, +0.002614f, +0.010890f, -0.001229f, -0.000145f, +0.007620f, -0.001565f, -0.003480f, -0.014800f, + +0.008202f, -0.000945f, +0.006326f, -0.009275f, -0.003752f, +0.004521f, -0.007053f, +0.005924f, +0.003286f, +0.002357f, + +0.001861f, -0.005416f, -0.000014f, +0.000130f, +0.009229f, -0.001211f, +0.000955f, +0.004350f, -0.007341f, -0.001837f, + -0.004264f, -0.001621f, -0.002837f, -0.002016f, -0.002169f, +0.002127f, -0.000874f, -0.002023f, -0.003826f, -0.001254f, + -0.000457f, -0.002212f, +0.000897f, +0.001349f, -0.000239f, +0.000359f, -0.002435f, +0.002425f, +0.001788f, +0.003424f, + +0.003684f, +0.000953f, -0.003932f, -0.001289f, -0.001466f, +0.000787f + }, + { + +0.002791f, -0.039373f, +0.003226f, +0.003728f, +0.002587f, -0.002258f, +0.001450f, -0.008698f, +0.010829f, -0.000591f, + +0.006203f, -0.002592f, +0.001535f, +0.005814f, +0.002506f, -0.008789f, +0.026316f, +0.020423f, -0.019301f, +0.018341f, + +0.001322f, +0.006170f, -0.012531f, +0.030803f, +0.004626f, +0.022645f, -0.005206f, +0.019246f, -0.019457f, -0.017745f, + -0.012831f, +0.001598f, +0.005278f, -0.013810f, -0.011551f, -0.006527f, -0.015637f, +0.004253f, +0.001998f, +0.010100f, + -0.016367f, +0.021647f, -0.010266f, -0.002728f, +0.009580f, -0.001926f, +0.006434f, -0.004441f, -0.003080f, +0.002223f, + -0.004328f, +0.004664f, +0.005561f, +0.009296f, +0.006196f, +0.007362f, -0.000342f, -0.006981f, -0.000369f, +0.003781f, + -0.001673f, -0.001036f, +0.000424f, -0.007932f, +0.004110f, -0.002595f, -0.003479f, -0.004762f, +0.004086f, +0.000525f, + -0.003815f, -0.004232f, +0.002926f, +0.002399f, +0.005099f, +0.000371f, +0.000349f, +0.001311f, +0.004068f, +0.000424f, + -0.002779f, +0.000123f, -0.003043f, +0.000265f, -0.000022f, -0.000770f, +0.003201f, -0.004006f, +0.000533f, -0.001462f, + -0.000406f, -0.000434f, -0.001636f, +0.001161f, +0.001042f, +0.002260f + }, + { + -0.041635f, +0.018181f, -0.022480f, -0.020219f, +0.016876f, -0.010029f, -0.006852f, -0.003638f, -0.009486f, -0.015831f, + +0.017987f, -0.003557f, -0.000737f, +0.009181f, -0.011878f, +0.018715f, -0.003936f, -0.009569f, -0.019761f, +0.003433f, + +0.030048f, -0.010589f, -0.002517f, +0.002505f, +0.051214f, +0.001008f, +0.017319f, -0.006976f, +0.013916f, +0.003604f, + -0.016513f, +0.016019f, +0.005684f, +0.002035f, -0.004263f, -0.019631f, -0.003700f, +0.000413f, -0.009238f, -0.014826f, + -0.001909f, +0.000819f, -0.014224f, +0.009213f, +0.004844f, -0.005749f, -0.007703f, -0.002575f, +0.001294f, +0.013349f, + +0.005345f, -0.009588f, -0.004252f, +0.005998f, +0.002696f, -0.000523f, -0.004040f, +0.003774f, -0.006364f, +0.001032f, + -0.005316f, +0.001099f, +0.005021f, -0.001795f, +0.004080f, +0.007708f, +0.000696f, +0.003393f, +0.001368f, -0.002489f, + -0.001614f, -0.000822f, -0.005228f, +0.000102f, -0.004396f, -0.000215f, -0.000949f, +0.002321f, -0.000887f, -0.007174f, + +0.001737f, +0.000626f, +0.001608f, +0.003730f, -0.000720f, -0.000934f, +0.000554f, +0.001964f, -0.000081f, +0.000297f, + -0.001530f, +0.000108f, -0.004093f, +0.000519f, +0.001515f, -0.003413f + }, + { + +0.005705f, +0.022543f, +0.024256f, -0.015689f, +0.005729f, +0.003987f, -0.002109f, +0.003935f, +0.002009f, -0.007747f, + -0.009548f, +0.019941f, -0.001830f, +0.009730f, +0.008181f, +0.008988f, +0.022337f, -0.017282f, -0.017428f, +0.004759f, + +0.013087f, +0.012237f, +0.015175f, -0.013945f, +0.005570f, +0.014072f, -0.017353f, +0.010156f, -0.024722f, -0.007708f, + +0.017536f, -0.025816f, -0.008244f, -0.014749f, +0.003360f, +0.017958f, -0.018660f, -0.015868f, -0.007280f, +0.014636f, + +0.003622f, -0.002198f, -0.001743f, +0.012665f, +0.003982f, -0.003087f, -0.007368f, +0.000208f, +0.001196f, +0.008677f, + +0.009296f, -0.016040f, +0.000229f, +0.000296f, -0.003844f, +0.001712f, -0.000256f, -0.007790f, +0.001225f, -0.009635f, + +0.002651f, -0.007767f, -0.006318f, +0.006222f, +0.000961f, +0.000768f, -0.004120f, +0.004957f, +0.001694f, -0.002206f, + -0.003289f, -0.001187f, +0.000426f, +0.002883f, -0.000770f, -0.003375f, -0.002132f, -0.000901f, -0.001059f, -0.002430f, + +0.000263f, -0.002942f, +0.000766f, -0.000496f, +0.002333f, +0.000442f, -0.002329f, +0.001325f, +0.000679f, -0.001108f, + -0.002028f, -0.003444f, +0.004673f, -0.000424f, +0.000927f, +0.000744f + }, + { + -0.050001f, -0.039459f, -0.010088f, -0.034530f, +0.044948f, -0.006264f, -0.024922f, -0.017641f, -0.025316f, -0.014234f, + +0.032042f, +0.002240f, +0.016386f, +0.026897f, -0.021872f, +0.022864f, +0.032251f, -0.005697f, -0.004946f, +0.011790f, + -0.016217f, -0.004044f, +0.011090f, -0.002312f, -0.004472f, -0.002357f, -0.001913f, -0.003240f, -0.004803f, -0.004077f, + +0.004126f, +0.012007f, -0.002415f, +0.008357f, +0.005482f, -0.005849f, -0.004723f, +0.012644f, +0.005282f, +0.000234f, + +0.000112f, +0.000097f, -0.014558f, +0.003932f, +0.001734f, -0.013450f, +0.010804f, -0.003204f, -0.014204f, -0.004164f, + +0.009976f, +0.002896f, -0.000176f, -0.002791f, +0.009171f, +0.004659f, -0.000465f, -0.000672f, -0.001977f, -0.009627f, + -0.004465f, +0.004962f, +0.000934f, +0.015954f, +0.003254f, +0.001119f, +0.000843f, -0.000002f, +0.004008f, +0.000675f, + +0.000344f, +0.003625f, +0.003708f, +0.000543f, -0.002568f, +0.003772f, +0.001330f, -0.000771f, -0.004676f, +0.005096f, + -0.003063f, +0.000836f, +0.003838f, +0.001812f, +0.000315f, +0.001883f, -0.002696f, -0.001800f, +0.001065f, -0.000920f, + +0.002596f, +0.000573f, -0.001209f, -0.002797f, -0.000390f, -0.000770f + }, + { + +0.005748f, -0.063657f, +0.000455f, -0.000281f, +0.007427f, -0.006892f, +0.037384f, -0.008578f, -0.016977f, -0.002951f, + -0.021726f, -0.003252f, -0.021523f, -0.002561f, +0.012087f, -0.011674f, -0.043982f, -0.002336f, +0.013774f, -0.002113f, + -0.000235f, +0.007497f, -0.022503f, +0.002592f, -0.000348f, +0.004524f, -0.002820f, -0.016960f, -0.003206f, -0.009506f, + +0.002425f, -0.016389f, -0.028196f, +0.018056f, -0.008606f, -0.019631f, -0.005185f, +0.001534f, +0.005282f, -0.016727f, + +0.009719f, -0.000955f, +0.003182f, -0.011585f, -0.008489f, +0.002126f, +0.001186f, +0.005505f, +0.007910f, +0.002016f, + -0.009922f, +0.002796f, -0.002320f, -0.001697f, +0.008119f, +0.007748f, -0.002016f, +0.005771f, -0.007787f, -0.000945f, + -0.005460f, -0.000503f, -0.000734f, -0.007797f, +0.005573f, +0.005881f, -0.004637f, +0.001846f, -0.002921f, +0.000758f, + -0.004533f, -0.001745f, -0.001315f, +0.000889f, +0.005060f, -0.002864f, +0.004425f, -0.002644f, -0.003198f, -0.000408f, + +0.004107f, +0.003732f, -0.001856f, -0.000714f, +0.002335f, -0.004288f, +0.003392f, -0.001345f, +0.000152f, -0.003365f, + +0.001418f, -0.005521f, -0.000328f, +0.001777f, -0.003502f, +0.001874f + }, + { + +0.032627f, +0.063910f, -0.080475f, -0.030679f, -0.008481f, -0.052312f, -0.007505f, +0.025200f, +0.019512f, +0.013208f, + -0.010385f, -0.001370f, -0.015478f, -0.009758f, +0.009835f, -0.002031f, +0.003731f, +0.036289f, -0.004511f, +0.006633f, + -0.006868f, -0.002967f, -0.019205f, -0.000551f, -0.001654f, -0.011031f, +0.007055f, +0.014891f, -0.028940f, +0.020136f, + -0.012052f, -0.008885f, +0.002697f, +0.003808f, -0.010538f, +0.002788f, +0.008398f, +0.006230f, +0.009915f, -0.002450f, + -0.008646f, +0.012905f, -0.000506f, +0.002364f, -0.004357f, +0.013201f, -0.003833f, -0.002911f, +0.004585f, +0.006711f, + -0.004535f, -0.008360f, +0.005836f, +0.003789f, -0.004531f, +0.002175f, +0.001839f, -0.002434f, +0.006866f, -0.003298f, + -0.004861f, +0.000364f, +0.003984f, +0.004062f, -0.006105f, +0.005258f, +0.000414f, -0.002664f, +0.004582f, -0.001158f, + +0.000437f, +0.000090f, +0.003345f, -0.001451f, +0.000310f, -0.000590f, -0.000762f, +0.001490f, -0.000126f, +0.002556f, + -0.004563f, +0.001432f, +0.003882f, +0.000828f, -0.000215f, -0.001532f, -0.000807f, -0.003824f, +0.000828f, -0.003447f, + -0.003030f, +0.000154f, +0.001730f, +0.003242f, +0.000675f, -0.000573f + }, + { + +0.004146f, -0.004189f, -0.000224f, -0.014485f, -0.000480f, +0.001139f, +0.010259f, -0.000123f, +0.003240f, +0.009621f, + -0.011827f, -0.029556f, -0.016910f, -0.008868f, +0.003027f, -0.022465f, +0.015235f, -0.000901f, +0.011223f, -0.025457f, + -0.018612f, -0.023185f, -0.009107f, -0.022501f, +0.011632f, -0.004261f, -0.010229f, +0.039146f, +0.024645f, -0.003540f, + +0.007338f, -0.001890f, -0.013647f, -0.013531f, +0.002201f, +0.005954f, -0.007401f, +0.007110f, +0.015487f, +0.009549f, + +0.006366f, -0.015239f, -0.003920f, +0.018424f, -0.003683f, +0.002323f, -0.007813f, -0.010131f, -0.003986f, +0.007734f, + -0.003927f, -0.000542f, -0.003012f, +0.000601f, +0.000228f, -0.005355f, +0.004084f, +0.000946f, +0.009294f, -0.005207f, + +0.000741f, +0.004192f, -0.000820f, +0.008058f, +0.006533f, -0.004577f, +0.004527f, -0.005486f, -0.003071f, +0.000648f, + -0.002293f, +0.001666f, -0.000338f, -0.001266f, +0.003301f, +0.005280f, -0.004167f, +0.000971f, -0.003663f, -0.000190f, + -0.003993f, -0.001238f, +0.005467f, -0.003209f, +0.004736f, -0.000644f, -0.001768f, +0.004992f, +0.000321f, +0.003122f, + -0.003045f, +0.001126f, +0.001545f, -0.000442f, -0.001751f, +0.001182f + }, + { + -0.016122f, +0.120275f, -0.022465f, +0.022309f, +0.007732f, +0.012737f, +0.003782f, +0.025340f, -0.006806f, -0.010905f, + +0.009440f, +0.012088f, +0.022004f, -0.038556f, +0.014077f, -0.009376f, -0.021018f, -0.011568f, +0.017376f, +0.002784f, + +0.010490f, -0.001864f, -0.013762f, +0.039046f, -0.011540f, +0.012071f, +0.019996f, +0.007288f, +0.001038f, +0.017987f, + +0.013491f, -0.011431f, +0.002366f, +0.003639f, -0.009955f, +0.003317f, +0.002052f, +0.006544f, -0.009050f, +0.007483f, + +0.004017f, +0.008568f, +0.000376f, +0.016149f, -0.008716f, +0.013460f, -0.008705f, +0.014491f, -0.007087f, +0.011795f, + +0.008276f, -0.002970f, +0.005099f, -0.000401f, +0.005388f, +0.001672f, +0.007164f, -0.000993f, -0.009074f, +0.013236f, + -0.001756f, -0.000741f, +0.000157f, -0.002038f, +0.001003f, -0.002433f, +0.003485f, +0.000034f, +0.003029f, +0.001869f, + -0.000883f, +0.000577f, -0.002644f, +0.004587f, -0.002519f, +0.003673f, -0.000124f, +0.000015f, +0.003103f, -0.007439f, + +0.000778f, +0.002140f, +0.002209f, -0.001168f, +0.004530f, -0.001084f, -0.001499f, +0.002282f, +0.000947f, +0.004239f, + +0.002749f, +0.004764f, +0.000174f, -0.000140f, +0.000520f, +0.000952f + }, + { + -0.007982f, -0.019290f, +0.003205f, +0.008390f, -0.001356f, -0.007039f, +0.008470f, -0.000664f, +0.011155f, -0.005476f, + +0.004864f, -0.000135f, -0.000788f, +0.065342f, +0.207535f, -0.017658f, -0.004473f, -0.008221f, +0.006340f, +0.005352f, + +0.020846f, -0.017696f, +0.010486f, -0.005108f, -0.004468f, -0.026043f, -0.017180f, -0.018450f, -0.025851f, -0.010528f, + -0.004362f, +0.002841f, +0.007890f, +0.010964f, +0.014368f, -0.010433f, -0.011158f, +0.000389f, +0.003098f, -0.017442f, + +0.000786f, -0.001870f, +0.010488f, +0.006832f, -0.003274f, +0.023161f, -0.000218f, +0.000503f, -0.006148f, -0.005156f, + +0.008170f, -0.000378f, +0.010804f, -0.008229f, +0.000636f, -0.000888f, -0.000161f, -0.000441f, -0.013764f, +0.006765f, + -0.003482f, +0.005408f, +0.000615f, -0.005950f, -0.005451f, +0.009112f, +0.000101f, -0.001978f, +0.004624f, +0.003188f, + +0.007073f, -0.003523f, +0.000092f, -0.004004f, +0.004860f, +0.001970f, -0.004163f, -0.001564f, +0.004488f, +0.003035f, + +0.000911f, +0.002268f, -0.002122f, +0.001839f, +0.004331f, +0.002213f, -0.001280f, -0.004412f, +0.002771f, -0.004929f, + -0.003002f, +0.000747f, -0.001247f, -0.002882f, +0.000241f, -0.001632f + }, + { + -0.029652f, +0.074370f, +0.003590f, -0.012669f, +0.008611f, -0.007839f, +0.013520f, +0.003986f, -0.002347f, +0.012983f, + +0.009738f, +0.014807f, +0.006496f, -0.044508f, -0.032595f, +0.012885f, -0.028133f, -0.021413f, -0.003070f, -0.007488f, + -0.010081f, -0.004543f, -0.012965f, -0.016258f, -0.005560f, -0.020664f, +0.005218f, +0.015305f, -0.001053f, -0.015732f, + -0.012834f, +0.006894f, +0.000161f, -0.001152f, +0.008538f, -0.002929f, -0.021564f, +0.004315f, +0.001197f, +0.007809f, + +0.018218f, -0.003601f, -0.010041f, +0.014932f, +0.007698f, +0.008839f, -0.002707f, -0.001333f, -0.001218f, +0.009630f, + +0.006260f, -0.005776f, -0.006020f, +0.005404f, +0.000172f, +0.002903f, +0.007972f, +0.001763f, -0.003855f, +0.000538f, + +0.005815f, +0.002590f, -0.001258f, +0.013094f, +0.001724f, -0.009377f, -0.002095f, -0.001557f, -0.005579f, -0.004454f, + +0.003611f, +0.004770f, +0.004197f, +0.000283f, +0.000847f, -0.005866f, -0.000321f, +0.000553f, -0.003446f, -0.004589f, + +0.001463f, +0.000113f, -0.002207f, -0.001720f, -0.001170f, -0.001113f, +0.000540f, -0.004104f, +0.001163f, -0.000589f, + -0.004173f, +0.000042f, +0.000584f, -0.000333f, -0.000117f, -0.001998f + } + }, + { + { + +0.000567f, -0.078455f, -0.014022f, +0.078781f, -0.001611f, -0.006773f, -0.014416f, -0.007692f, +0.014302f, +0.015974f, + -0.007435f, +0.006048f, +0.002159f, -0.004832f, +0.018453f, +0.017847f, -0.010728f, -0.012347f, +0.023036f, +0.008632f, + +0.013061f, -0.014631f, -0.004423f, +0.035262f, -0.007039f, +0.025193f, +0.004260f, +0.006295f, +0.006132f, -0.008440f, + +0.004089f, +0.017281f, -0.001046f, +0.010408f, +0.009816f, -0.011970f, +0.012617f, +0.002294f, -0.013952f, -0.008363f, + -0.002088f, +0.003846f, -0.008653f, +0.002443f, -0.004687f, +0.000345f, -0.007276f, +0.000336f, -0.005256f, -0.008255f, + -0.006005f, -0.009361f, +0.000331f, -0.007056f, +0.009871f, +0.002034f, -0.001880f, +0.007680f, +0.008914f, -0.000311f, + -0.009230f, +0.003776f, +0.002668f, +0.000217f, -0.007509f, -0.000864f, -0.003580f, -0.000069f, +0.001167f, -0.000737f, + +0.009743f, +0.003371f, +0.000581f, -0.006271f, +0.001075f, -0.004667f, +0.001782f, +0.000619f, +0.003804f, -0.005423f, + +0.000293f, -0.001562f, +0.000353f, +0.003683f, -0.003719f, +0.001412f, -0.003159f, +0.001511f, -0.000707f, +0.001169f, + +0.000406f, +0.001659f, -0.001707f, -0.000388f, +0.000663f, +0.000894f + }, + { + +0.042745f, +0.137323f, -0.055737f, +0.140146f, -0.038142f, -0.012829f, +0.014641f, -0.009713f, -0.015015f, -0.006884f, + -0.048946f, +0.002902f, -0.006265f, -0.001798f, -0.015076f, -0.028108f, -0.001091f, +0.020321f, +0.016859f, -0.003616f, + +0.007975f, +0.010062f, -0.015003f, +0.007419f, -0.002356f, +0.001229f, -0.030731f, -0.003154f, -0.003088f, -0.000723f, + -0.017060f, +0.003761f, +0.002586f, -0.007952f, -0.009157f, -0.002997f, +0.008814f, +0.024324f, +0.011547f, +0.009690f, + -0.003035f, +0.012846f, +0.015562f, +0.009026f, -0.005177f, +0.002307f, -0.009137f, -0.000408f, +0.011597f, -0.008914f, + +0.002528f, -0.004500f, +0.003764f, -0.003456f, +0.003318f, +0.014623f, -0.000241f, -0.004450f, -0.002494f, -0.004414f, + -0.008844f, +0.011497f, +0.001145f, -0.000518f, +0.002947f, +0.003063f, -0.001928f, +0.004825f, +0.000011f, +0.000591f, + -0.008011f, -0.001124f, -0.000439f, -0.003229f, +0.000049f, -0.001387f, +0.009345f, -0.002844f, -0.001382f, -0.004541f, + -0.006584f, +0.001291f, +0.001686f, +0.000444f, -0.003292f, +0.004808f, -0.005713f, +0.003497f, -0.005360f, +0.000382f, + -0.000642f, +0.002292f, +0.000889f, +0.005153f, -0.003348f, -0.001602f + }, + { + -0.010640f, +0.084811f, +0.030523f, -0.114623f, +0.019694f, +0.028707f, -0.006320f, +0.022253f, -0.001132f, +0.024295f, + +0.011366f, +0.005361f, -0.034090f, +0.028470f, -0.013467f, -0.001700f, -0.006720f, +0.021579f, -0.018748f, -0.029874f, + +0.036404f, -0.006823f, +0.008282f, -0.003686f, +0.012413f, +0.028190f, +0.015309f, -0.002169f, -0.011188f, -0.002273f, + -0.001468f, +0.009012f, +0.006366f, +0.005880f, +0.019649f, -0.011547f, -0.005393f, +0.009464f, -0.014939f, -0.012367f, + -0.008044f, -0.000585f, -0.006301f, -0.007363f, -0.002003f, +0.008093f, -0.003234f, -0.000867f, -0.002375f, +0.005070f, + -0.007338f, -0.001900f, -0.003793f, +0.002707f, -0.002224f, +0.001408f, +0.007892f, +0.005177f, -0.004105f, +0.006187f, + -0.004130f, +0.004424f, +0.000030f, -0.001380f, -0.002548f, -0.000379f, +0.005220f, -0.003723f, -0.000709f, -0.002483f, + -0.002196f, -0.002928f, -0.007652f, -0.001427f, +0.002364f, +0.001956f, +0.004841f, -0.000095f, -0.001187f, +0.004001f, + -0.001993f, -0.003449f, +0.002843f, -0.001914f, +0.001180f, +0.000221f, -0.000997f, -0.001072f, -0.000820f, +0.002246f, + +0.003322f, +0.001138f, -0.001753f, -0.000608f, +0.000421f, -0.000497f + }, + { + -0.001146f, +0.069208f, +0.000707f, -0.012934f, +0.010187f, -0.000645f, -0.000291f, -0.005334f, +0.002279f, +0.007200f, + +0.015476f, -0.002289f, -0.010302f, -0.010403f, +0.014865f, -0.009833f, -0.021946f, -0.000046f, +0.031763f, +0.013726f, + +0.005800f, +0.010629f, +0.026888f, +0.000780f, -0.009894f, +0.046780f, +0.042709f, +0.020672f, -0.006682f, +0.002029f, + -0.001446f, +0.006028f, -0.000223f, +0.008749f, -0.016092f, -0.019243f, -0.017058f, -0.011486f, +0.011034f, +0.020760f, + +0.001447f, +0.014779f, -0.003276f, -0.000229f, -0.001743f, -0.007262f, +0.001946f, -0.003624f, +0.003322f, +0.005654f, + -0.000079f, -0.018210f, -0.008613f, +0.002659f, -0.000916f, +0.005581f, +0.013044f, -0.000644f, +0.004629f, +0.005077f, + +0.003449f, -0.004964f, -0.001271f, -0.002680f, +0.008453f, +0.006836f, +0.003819f, -0.000888f, -0.000861f, +0.007736f, + +0.004824f, +0.002761f, -0.008669f, +0.000601f, +0.007362f, +0.002832f, +0.005592f, -0.002464f, +0.001238f, +0.006241f, + +0.000386f, -0.002994f, -0.003703f, +0.001044f, -0.003853f, -0.002901f, -0.001148f, +0.003523f, -0.004981f, +0.000086f, + -0.001803f, +0.002571f, +0.005622f, +0.002632f, -0.000727f, -0.001403f + }, + { + +0.025155f, +0.004468f, +0.016118f, -0.062087f, -0.008844f, +0.000691f, -0.001993f, -0.023413f, -0.008279f, -0.027353f, + +0.023963f, -0.013885f, +0.004857f, +0.006289f, +0.025252f, -0.000230f, +0.005657f, -0.030925f, +0.000750f, +0.006133f, + +0.004652f, +0.020753f, -0.008961f, -0.004879f, +0.018637f, -0.009403f, -0.010350f, -0.014194f, +0.002561f, +0.005638f, + -0.008237f, +0.009435f, -0.000274f, +0.009800f, -0.004362f, -0.007492f, -0.007210f, -0.012065f, +0.032680f, +0.011686f, + +0.015412f, +0.002771f, +0.002345f, +0.008741f, -0.000470f, +0.013727f, +0.007530f, -0.006375f, +0.004679f, -0.005570f, + +0.001516f, -0.005024f, +0.015131f, +0.005178f, +0.001617f, +0.001713f, -0.005894f, +0.003770f, -0.001287f, +0.002229f, + +0.006722f, -0.007315f, -0.007428f, -0.009105f, +0.006179f, +0.004769f, +0.002570f, +0.004300f, -0.001946f, +0.005781f, + -0.000396f, -0.002129f, -0.002063f, +0.002342f, +0.005364f, +0.002596f, -0.006227f, -0.007135f, -0.004883f, -0.001231f, + -0.000064f, +0.002252f, +0.002259f, +0.000784f, -0.000935f, +0.002963f, +0.001559f, +0.004209f, +0.001825f, +0.002119f, + +0.001572f, +0.000765f, -0.003152f, +0.000129f, -0.001183f, -0.000902f + }, + { + +0.000022f, -0.035947f, +0.023888f, -0.005123f, -0.003714f, -0.001504f, -0.000094f, -0.008330f, +0.006845f, +0.001660f, + +0.008502f, -0.005704f, +0.009779f, +0.035774f, +0.011487f, -0.045697f, +0.000492f, +0.002360f, -0.024175f, +0.022926f, + +0.007380f, +0.000900f, -0.016506f, +0.026922f, -0.016617f, +0.002153f, -0.016609f, +0.011128f, -0.022116f, -0.021433f, + -0.017901f, +0.011544f, +0.033825f, +0.013401f, +0.005748f, +0.010677f, -0.003652f, +0.004900f, +0.001949f, +0.009479f, + -0.016302f, +0.024679f, -0.001751f, +0.000787f, +0.003465f, -0.006251f, +0.013360f, +0.001125f, +0.003361f, +0.005652f, + -0.008188f, +0.001644f, +0.005830f, +0.009239f, +0.000922f, -0.001636f, -0.004125f, -0.001787f, +0.006234f, +0.006248f, + +0.000968f, +0.002324f, -0.000158f, -0.002502f, +0.009269f, -0.000281f, +0.000753f, -0.002225f, +0.006581f, -0.002186f, + -0.007846f, -0.005589f, +0.006022f, +0.003241f, +0.005529f, +0.000518f, -0.002481f, +0.002478f, +0.007959f, +0.002878f, + -0.002137f, +0.001121f, +0.000915f, +0.003426f, -0.000385f, -0.000621f, -0.000225f, -0.006815f, +0.002566f, +0.003258f, + +0.003528f, -0.000189f, -0.001567f, +0.000405f, -0.001108f, +0.001228f + }, + { + +0.034975f, +0.120090f, +0.002513f, -0.029772f, -0.013804f, +0.005452f, +0.011316f, -0.012873f, -0.032186f, -0.013810f, + +0.024263f, +0.004812f, +0.002478f, +0.015920f, +0.003021f, +0.014908f, -0.025675f, -0.032950f, -0.023524f, -0.008021f, + +0.022676f, -0.013500f, -0.009004f, -0.022976f, +0.003063f, -0.017200f, +0.014393f, -0.001741f, +0.010572f, -0.006213f, + -0.020220f, +0.012941f, +0.005422f, +0.016068f, +0.009463f, -0.005776f, +0.003483f, +0.001395f, -0.008731f, -0.011506f, + +0.001996f, +0.005885f, -0.015412f, +0.012766f, +0.003912f, -0.010765f, +0.002271f, +0.007812f, +0.004637f, +0.009792f, + -0.003885f, -0.002923f, -0.003710f, -0.004428f, +0.005975f, +0.005800f, -0.001398f, +0.006892f, +0.000162f, +0.006504f, + +0.004116f, +0.003808f, +0.002836f, -0.000160f, +0.002895f, +0.009426f, +0.001559f, -0.002082f, -0.000072f, -0.001185f, + +0.000037f, +0.001156f, -0.001323f, +0.002872f, -0.005768f, -0.004140f, -0.002834f, +0.002672f, +0.000226f, -0.003843f, + +0.004755f, +0.003631f, +0.001268f, +0.002173f, -0.002180f, -0.004521f, -0.001419f, -0.001753f, -0.000487f, +0.003098f, + +0.001168f, +0.003896f, -0.001965f, +0.000354f, +0.000931f, -0.002691f + }, + { + -0.001258f, -0.047092f, -0.002599f, -0.007058f, +0.009199f, -0.000244f, -0.008190f, -0.007759f, -0.004611f, +0.003813f, + -0.006509f, +0.008387f, +0.001785f, +0.037450f, +0.011718f, -0.021220f, +0.009143f, -0.007191f, -0.011554f, -0.016410f, + -0.008274f, +0.005054f, +0.013672f, -0.011965f, -0.012616f, -0.023360f, -0.030087f, +0.015120f, +0.007626f, +0.013092f, + +0.037129f, +0.003230f, +0.008095f, -0.009739f, +0.012253f, +0.003188f, -0.017231f, -0.002647f, -0.007076f, +0.009161f, + -0.003649f, -0.014994f, +0.001888f, +0.008433f, -0.000026f, +0.007953f, +0.002960f, -0.002364f, -0.005317f, -0.001127f, + +0.012569f, -0.008772f, -0.005678f, +0.002622f, -0.000579f, +0.000373f, -0.001294f, -0.003796f, +0.004649f, -0.003712f, + +0.005468f, -0.003315f, +0.000756f, +0.005080f, +0.004680f, +0.006229f, -0.000592f, +0.007735f, +0.008042f, +0.005206f, + -0.000823f, -0.003291f, -0.002514f, +0.002826f, -0.001112f, +0.000514f, +0.003561f, +0.004918f, +0.003905f, +0.002681f, + +0.003548f, -0.003317f, +0.001169f, -0.001764f, +0.001480f, +0.001443f, +0.000136f, +0.003021f, +0.001623f, -0.002168f, + -0.000956f, -0.004886f, +0.000223f, +0.000332f, +0.002745f, +0.001082f + }, + { + +0.065298f, +0.101848f, -0.014203f, -0.066230f, -0.000336f, +0.018271f, -0.004374f, -0.015465f, -0.006061f, -0.001190f, + +0.045663f, +0.021101f, -0.012585f, -0.017230f, -0.033675f, +0.003544f, +0.020354f, -0.012805f, -0.025041f, -0.000477f, + -0.014078f, -0.005426f, +0.003721f, +0.012273f, +0.019058f, +0.014443f, +0.005546f, -0.002608f, -0.004942f, -0.001130f, + +0.013722f, +0.020669f, -0.000940f, +0.008577f, +0.008347f, +0.001896f, -0.016438f, +0.001768f, +0.003574f, +0.011571f, + -0.002964f, -0.003218f, -0.009166f, +0.009698f, +0.000816f, -0.018891f, +0.008721f, -0.003014f, -0.015311f, +0.003239f, + +0.011428f, +0.001337f, +0.012456f, +0.008707f, +0.003765f, -0.006220f, -0.001866f, +0.000180f, -0.002474f, -0.011685f, + -0.008231f, +0.001450f, -0.003845f, +0.010263f, -0.000353f, -0.002089f, -0.002584f, -0.006858f, -0.004302f, -0.004726f, + +0.001575f, +0.003402f, +0.000746f, +0.004647f, +0.000219f, -0.001311f, -0.000979f, +0.000032f, -0.005870f, +0.003975f, + -0.004039f, +0.003509f, +0.000771f, -0.000424f, +0.002725f, +0.002506f, -0.001470f, -0.002965f, +0.000144f, -0.000673f, + +0.000328f, -0.000942f, -0.001546f, -0.001398f, +0.001609f, -0.000195f + }, + { + -0.006985f, -0.041919f, +0.033977f, +0.004181f, +0.012421f, -0.004877f, +0.042294f, -0.000072f, -0.014678f, -0.006268f, + -0.032896f, -0.001089f, -0.017667f, -0.016133f, +0.002254f, -0.004419f, -0.037756f, -0.013928f, +0.005871f, -0.001807f, + +0.008104f, +0.016574f, -0.004716f, +0.020092f, +0.007444f, +0.019087f, +0.011807f, -0.008233f, +0.009508f, -0.000731f, + +0.014530f, +0.003356f, -0.017743f, +0.023918f, +0.006806f, -0.001382f, -0.004752f, +0.000802f, +0.018524f, +0.001293f, + +0.008349f, -0.007312f, +0.007726f, -0.005418f, -0.007884f, +0.009068f, +0.005160f, +0.007179f, +0.011224f, -0.001669f, + -0.008344f, -0.001296f, -0.007805f, +0.000943f, +0.005787f, +0.006084f, +0.002505f, +0.016234f, +0.000881f, -0.000463f, + -0.003120f, +0.002264f, +0.005180f, -0.003223f, +0.003161f, +0.004224f, -0.005565f, -0.002407f, -0.009347f, +0.002207f, + +0.002827f, +0.002738f, -0.004785f, -0.004895f, +0.003644f, -0.003663f, +0.002424f, +0.001403f, +0.004549f, +0.003057f, + +0.004450f, +0.002172f, -0.004311f, -0.005470f, +0.001726f, -0.000541f, +0.004261f, -0.002206f, +0.000766f, -0.002069f, + +0.001076f, -0.002222f, +0.002699f, +0.002210f, -0.004442f, +0.001959f + }, + { + -0.040589f, +0.074499f, +0.019944f, -0.022315f, +0.000428f, +0.040682f, +0.087025f, +0.027556f, +0.021370f, +0.009746f, + -0.017868f, +0.019515f, +0.005085f, +0.012251f, +0.035368f, +0.017038f, +0.010206f, +0.018586f, -0.029489f, -0.011864f, + -0.005660f, +0.022103f, +0.011691f, +0.006667f, +0.008252f, -0.010098f, -0.000816f, +0.022717f, -0.014680f, +0.013365f, + -0.004332f, +0.012326f, -0.000907f, +0.004374f, +0.007022f, -0.002277f, -0.011601f, -0.001345f, +0.002686f, +0.005067f, + -0.000675f, +0.005670f, -0.005804f, +0.002964f, -0.007749f, +0.006043f, -0.006833f, +0.003354f, +0.009278f, +0.002298f, + -0.005270f, -0.009554f, +0.009649f, +0.006689f, -0.009492f, -0.006807f, +0.000848f, -0.002173f, +0.006716f, +0.001755f, + +0.000133f, -0.004694f, +0.000770f, +0.004344f, -0.000597f, +0.007103f, -0.000518f, -0.005922f, +0.000564f, -0.005351f, + -0.000286f, +0.002235f, +0.001632f, -0.003285f, +0.001343f, +0.001684f, +0.003017f, +0.003850f, +0.001067f, -0.000378f, + -0.006584f, +0.000132f, -0.000467f, -0.002844f, -0.000664f, -0.002173f, +0.000760f, -0.000410f, +0.001569f, -0.002839f, + -0.003592f, +0.000202f, +0.003244f, +0.001933f, -0.001125f, -0.001616f + }, + { + -0.003989f, +0.029621f, +0.042213f, -0.012531f, -0.003289f, +0.001854f, +0.016654f, +0.002387f, +0.002632f, +0.000386f, + +0.006732f, -0.005224f, -0.011646f, +0.016611f, -0.014764f, -0.041669f, +0.022039f, +0.007071f, +0.019647f, -0.001562f, + +0.002446f, -0.008960f, -0.018749f, -0.020507f, +0.011329f, -0.002597f, -0.009623f, +0.013037f, +0.002672f, +0.004277f, + +0.016342f, -0.004334f, -0.000674f, -0.010480f, -0.012173f, -0.007718f, -0.018458f, +0.004812f, +0.018674f, +0.007118f, + +0.002902f, -0.010240f, +0.008200f, +0.027690f, -0.000763f, +0.005325f, -0.007188f, -0.002236f, -0.001461f, -0.010165f, + -0.013460f, +0.003882f, +0.002332f, +0.005381f, +0.002431f, -0.011178f, -0.003502f, -0.002385f, +0.001765f, -0.006719f, + +0.003526f, +0.008383f, -0.003674f, +0.001089f, +0.007664f, +0.003412f, +0.011734f, -0.001499f, -0.000600f, +0.003340f, + +0.002408f, +0.006242f, +0.000816f, -0.001177f, +0.002360f, +0.000767f, -0.005091f, +0.003153f, -0.003077f, +0.000052f, + +0.001771f, +0.001162f, +0.003342f, -0.002610f, +0.004351f, -0.004487f, -0.004175f, +0.002887f, -0.004432f, +0.001976f, + +0.001100f, +0.001582f, +0.000038f, -0.002163f, -0.001671f, -0.002651f + }, + { + -0.015431f, +0.140840f, -0.012133f, +0.026533f, +0.012752f, -0.036588f, -0.027067f, +0.024119f, -0.000250f, -0.014700f, + +0.015062f, +0.032842f, +0.022344f, -0.017965f, +0.052357f, +0.024020f, -0.000370f, -0.004523f, +0.009964f, +0.014962f, + +0.023118f, -0.000418f, -0.028581f, +0.009064f, -0.040760f, -0.010760f, +0.005323f, -0.004168f, -0.011648f, +0.018809f, + -0.002929f, -0.012038f, +0.023462f, +0.011745f, -0.001611f, +0.012182f, -0.005913f, -0.001811f, -0.003835f, +0.019058f, + +0.006604f, -0.010231f, -0.013173f, +0.013597f, -0.006443f, +0.017617f, -0.010296f, +0.001375f, -0.019008f, +0.013225f, + +0.006532f, -0.005984f, +0.011321f, -0.002380f, -0.003284f, -0.001052f, +0.003946f, -0.000511f, -0.006765f, +0.011467f, + -0.001016f, +0.000289f, +0.001328f, -0.007194f, -0.003326f, -0.000020f, +0.000254f, -0.008969f, -0.001094f, +0.004688f, + +0.005440f, +0.004581f, -0.002401f, +0.003191f, -0.003045f, +0.003593f, -0.001506f, -0.001107f, +0.003731f, -0.003851f, + +0.001276f, -0.001167f, +0.000024f, +0.000218f, +0.003933f, -0.000565f, +0.000157f, +0.003025f, -0.000302f, +0.000647f, + +0.001562f, +0.005547f, +0.001958f, -0.000621f, -0.001614f, +0.000775f + }, + { + +0.007212f, -0.023992f, -0.012930f, +0.019534f, +0.016253f, +0.011515f, +0.016867f, -0.006941f, +0.008906f, -0.008772f, + +0.002777f, +0.001046f, -0.003473f, -0.078365f, -0.022739f, -0.045413f, +0.014457f, -0.027941f, -0.020230f, +0.011047f, + +0.006975f, -0.038391f, -0.016778f, -0.016118f, -0.005937f, -0.016443f, +0.001454f, -0.000292f, -0.020183f, -0.008326f, + -0.017710f, -0.013728f, -0.006860f, +0.011000f, +0.030206f, -0.002404f, -0.011590f, +0.010047f, +0.008252f, -0.027136f, + -0.017430f, -0.014751f, +0.000906f, -0.003764f, -0.014272f, +0.009201f, -0.006077f, +0.007766f, +0.008751f, +0.006475f, + +0.014503f, -0.002183f, +0.008027f, -0.016952f, -0.000931f, +0.001936f, +0.001493f, +0.004654f, -0.021576f, -0.002669f, + -0.003595f, +0.004916f, +0.005244f, -0.000961f, -0.008445f, +0.001535f, +0.001715f, +0.000291f, -0.000354f, -0.001816f, + +0.010091f, -0.003850f, +0.001595f, -0.003535f, +0.004458f, +0.002675f, -0.003643f, -0.004279f, +0.001306f, +0.002238f, + -0.002209f, +0.001923f, -0.000678f, +0.002649f, +0.005315f, -0.001386f, -0.004652f, -0.003293f, +0.006245f, -0.006155f, + -0.002108f, +0.001619f, -0.003372f, -0.002105f, -0.002347f, -0.002767f + }, + { + +0.010683f, +0.143497f, +0.012330f, +0.000397f, +0.008080f, -0.042482f, -0.005340f, -0.008920f, +0.001859f, +0.015276f, + +0.019256f, -0.004922f, -0.006785f, +0.024311f, +0.057960f, +0.017120f, -0.031647f, -0.024541f, -0.000435f, +0.004493f, + +0.006705f, +0.016207f, -0.004193f, -0.002276f, +0.026553f, +0.007774f, +0.009852f, -0.002260f, -0.018934f, -0.001403f, + +0.007511f, +0.023110f, +0.019687f, +0.004820f, -0.005039f, -0.011981f, -0.015702f, +0.022247f, +0.016931f, +0.007269f, + +0.015467f, -0.009263f, -0.009975f, -0.004447f, -0.006115f, -0.002370f, -0.011027f, -0.018346f, -0.016374f, -0.002887f, + +0.000810f, -0.004438f, +0.002933f, +0.011453f, +0.001367f, +0.009770f, +0.009446f, -0.000612f, -0.006826f, -0.002589f, + +0.009566f, +0.005584f, -0.005375f, +0.002651f, +0.000870f, -0.000040f, -0.001113f, +0.001156f, +0.002564f, +0.003045f, + -0.002048f, -0.003134f, -0.005162f, -0.003897f, +0.000263f, -0.004570f, -0.001452f, -0.002739f, -0.006203f, -0.002025f, + +0.002647f, -0.001709f, -0.002566f, +0.001648f, +0.000277f, +0.000264f, +0.002604f, -0.000738f, +0.001048f, -0.000211f, + +0.000931f, +0.001684f, +0.000134f, -0.001016f, -0.000505f, +0.000826f + } + }, + { + { + +0.001916f, -0.120157f, +0.008225f, +0.054829f, +0.027659f, -0.014513f, -0.004872f, +0.004228f, +0.001738f, +0.002726f, + +0.022034f, -0.014115f, -0.015396f, -0.013743f, +0.040653f, +0.021437f, +0.014356f, -0.033857f, +0.004382f, +0.033850f, + +0.008929f, -0.010487f, -0.012265f, +0.029814f, +0.009501f, +0.005859f, +0.017421f, -0.006914f, +0.013288f, -0.010085f, + +0.021559f, +0.016783f, -0.010780f, +0.019135f, +0.008598f, -0.003810f, -0.002975f, +0.000130f, -0.018440f, +0.002517f, + -0.015276f, +0.000813f, +0.002312f, +0.000483f, -0.005443f, -0.016823f, -0.000751f, +0.010358f, -0.002744f, -0.011235f, + -0.008080f, -0.011586f, +0.002250f, -0.008332f, +0.003767f, +0.007914f, +0.003170f, -0.001539f, +0.008582f, +0.000526f, + -0.005546f, +0.004973f, +0.003186f, +0.001795f, -0.006194f, -0.003627f, -0.004155f, +0.001497f, +0.000099f, +0.004409f, + +0.006739f, +0.002481f, -0.000107f, -0.000617f, -0.000716f, +0.000083f, -0.005309f, +0.006501f, -0.000957f, -0.002616f, + -0.002694f, +0.000579f, +0.000280f, +0.004063f, -0.000729f, -0.000796f, -0.003173f, +0.002251f, -0.000698f, -0.000835f, + +0.002288f, +0.000506f, +0.000495f, -0.000107f, -0.001422f, +0.001205f + }, + { + -0.045767f, +0.082199f, +0.072573f, +0.050805f, +0.022360f, -0.017582f, +0.015538f, -0.019786f, +0.010679f, -0.028563f, + +0.006168f, +0.006427f, -0.032228f, -0.016719f, -0.012083f, -0.030149f, +0.024400f, +0.006799f, +0.016926f, +0.010563f, + -0.000078f, -0.006825f, +0.002744f, -0.000558f, +0.005567f, -0.003073f, -0.027940f, -0.010112f, -0.004467f, +0.005064f, + -0.010630f, +0.002591f, -0.007079f, -0.001268f, -0.008130f, +0.000979f, +0.008131f, +0.019437f, +0.006759f, +0.014579f, + -0.001315f, +0.008162f, +0.020405f, +0.005566f, -0.000398f, -0.006096f, -0.002207f, -0.007979f, +0.010676f, +0.001441f, + +0.000922f, -0.002859f, +0.010989f, -0.000796f, -0.000343f, +0.005224f, +0.007537f, -0.007843f, -0.001693f, -0.001883f, + -0.005251f, +0.001913f, +0.002559f, +0.002314f, -0.005613f, +0.007331f, +0.000670f, +0.007358f, -0.002434f, -0.000535f, + -0.003552f, -0.004269f, -0.001892f, -0.001265f, -0.000547f, +0.003653f, +0.003680f, +0.002425f, -0.007606f, -0.004792f, + -0.003943f, -0.000439f, +0.002755f, -0.002695f, -0.002454f, +0.001726f, -0.001167f, +0.001083f, -0.003211f, -0.001337f, + -0.001708f, +0.002132f, +0.002126f, +0.003261f, -0.000673f, -0.002266f + }, + { + +0.006127f, +0.183323f, -0.047388f, -0.083534f, +0.003003f, +0.014536f, +0.012473f, +0.005068f, +0.013893f, +0.006720f, + -0.007436f, +0.012238f, -0.008229f, +0.007823f, +0.007216f, -0.017490f, -0.007574f, +0.020673f, -0.016695f, -0.008813f, + +0.017134f, +0.007691f, -0.003551f, +0.004343f, +0.033863f, +0.019713f, +0.005794f, -0.003078f, -0.021531f, +0.001003f, + +0.001683f, +0.008030f, +0.001987f, -0.001696f, +0.018805f, -0.000805f, -0.000954f, +0.000688f, -0.009187f, -0.019771f, + +0.002187f, -0.005309f, -0.012335f, -0.002880f, -0.002118f, +0.001117f, +0.001884f, +0.004926f, +0.002002f, -0.009879f, + -0.001389f, -0.004175f, +0.000933f, -0.001812f, -0.001982f, +0.001640f, +0.009573f, +0.002555f, -0.000572f, -0.003006f, + +0.006255f, +0.001975f, +0.000264f, +0.000265f, -0.004373f, -0.000386f, +0.003355f, +0.003607f, -0.010698f, +0.000364f, + +0.004913f, -0.007896f, -0.005243f, -0.003231f, +0.000718f, +0.006373f, -0.002046f, +0.001404f, +0.001620f, +0.001894f, + -0.005539f, +0.001710f, +0.002212f, -0.001156f, +0.002291f, -0.000713f, -0.001027f, +0.000654f, -0.001388f, +0.002392f, + +0.001272f, +0.002404f, +0.001809f, -0.003175f, -0.001557f, +0.002642f + }, + { + +0.000803f, +0.063452f, +0.005278f, +0.000740f, +0.000238f, -0.000892f, -0.002132f, -0.004217f, +0.004752f, +0.005969f, + +0.015349f, -0.015644f, +0.004577f, -0.007984f, +0.024373f, -0.015115f, -0.033214f, -0.012022f, +0.059794f, +0.026493f, + -0.016433f, +0.009041f, +0.049994f, -0.018218f, -0.004712f, +0.032904f, +0.042182f, +0.013546f, -0.009055f, -0.000753f, + +0.026658f, -0.011396f, +0.000095f, +0.009349f, -0.020386f, -0.022812f, -0.010080f, -0.005733f, +0.011149f, +0.008144f, + +0.015363f, +0.012063f, +0.001612f, +0.000083f, -0.000616f, +0.001636f, -0.011149f, +0.001294f, -0.004688f, +0.009295f, + -0.001788f, -0.010603f, -0.017498f, +0.003649f, +0.013078f, -0.002361f, +0.008189f, +0.003197f, +0.002069f, +0.001042f, + -0.001779f, -0.000544f, -0.003659f, +0.000690f, +0.006587f, +0.004359f, +0.001519f, +0.002812f, -0.004221f, +0.009727f, + +0.003075f, +0.001603f, -0.005633f, +0.004175f, +0.005685f, -0.001669f, +0.007463f, -0.002555f, +0.000013f, +0.003456f, + +0.000111f, +0.001884f, -0.003564f, +0.001334f, -0.006728f, -0.001602f, -0.002712f, +0.003541f, -0.002352f, -0.001850f, + -0.000891f, +0.004705f, +0.003209f, +0.001091f, +0.000919f, +0.000999f + }, + { + -0.017979f, +0.094034f, -0.018996f, -0.080108f, +0.018217f, -0.001063f, -0.007319f, -0.007967f, -0.022919f, -0.008610f, + +0.034648f, -0.064124f, -0.002988f, +0.025717f, -0.012239f, +0.038388f, +0.001078f, -0.006276f, -0.001051f, -0.001169f, + -0.002801f, +0.023091f, -0.006807f, -0.004433f, +0.011622f, +0.003710f, -0.008227f, -0.001901f, -0.014145f, -0.004191f, + +0.014453f, +0.005020f, -0.002839f, +0.016828f, -0.018929f, -0.007487f, +0.005500f, -0.000241f, +0.018654f, +0.019380f, + +0.007162f, +0.008882f, -0.009353f, +0.011921f, +0.001546f, +0.016647f, -0.008146f, +0.010626f, +0.002397f, -0.000734f, + +0.002067f, -0.002196f, +0.004221f, +0.009094f, +0.003721f, -0.000697f, -0.001351f, +0.002744f, -0.000946f, -0.001259f, + +0.008675f, -0.013001f, -0.000406f, +0.000358f, -0.007420f, +0.007863f, +0.004412f, -0.002457f, +0.003975f, +0.004753f, + +0.002367f, -0.003084f, +0.000258f, +0.001625f, +0.004572f, +0.003455f, -0.003766f, -0.009921f, -0.002223f, -0.001458f, + -0.004356f, +0.005226f, +0.002469f, -0.001779f, -0.001262f, +0.006076f, +0.001803f, +0.004138f, +0.002431f, -0.001169f, + +0.001215f, +0.000662f, -0.002150f, -0.000708f, +0.002700f, -0.002986f + }, + { + -0.002449f, +0.007566f, -0.009036f, -0.002672f, +0.003169f, -0.003518f, -0.002340f, -0.001828f, +0.003582f, -0.002926f, + +0.009065f, -0.001170f, +0.007222f, -0.002066f, +0.018532f, -0.021493f, +0.008020f, -0.003136f, -0.011815f, +0.018325f, + -0.018255f, +0.014966f, -0.006305f, +0.016441f, -0.023664f, +0.001060f, +0.001594f, -0.012931f, -0.024976f, +0.007938f, + -0.010478f, +0.002029f, +0.023156f, +0.011371f, +0.000386f, +0.016610f, +0.013001f, -0.005345f, +0.003083f, -0.000732f, + +0.013140f, +0.003678f, +0.007057f, -0.002167f, +0.003746f, -0.004780f, +0.010691f, +0.003485f, -0.001973f, +0.006566f, + -0.003930f, +0.000767f, +0.000928f, +0.006571f, +0.007935f, -0.009723f, -0.000434f, -0.000594f, +0.003210f, +0.008505f, + +0.000606f, +0.003654f, +0.001640f, +0.000924f, +0.006317f, -0.006656f, +0.009257f, -0.002810f, +0.002301f, -0.005122f, + -0.000956f, -0.006609f, +0.003153f, +0.003238f, +0.005449f, +0.000196f, +0.000118f, +0.002680f, +0.004765f, +0.003675f, + -0.000766f, +0.002076f, +0.000248f, +0.001515f, +0.000327f, -0.000014f, -0.002763f, -0.003781f, +0.002050f, +0.002505f, + +0.001451f, +0.000445f, +0.000830f, -0.000108f, -0.001813f, +0.000680f + }, + { + -0.009844f, +0.183997f, -0.007835f, -0.049970f, +0.028158f, -0.008024f, +0.005408f, -0.004760f, -0.026396f, -0.000373f, + +0.027293f, -0.018704f, +0.016234f, -0.004752f, +0.019778f, +0.017308f, -0.016946f, -0.039490f, -0.037082f, +0.010522f, + -0.008805f, +0.000741f, -0.011525f, -0.009318f, -0.028313f, -0.001688f, +0.018047f, +0.003207f, -0.008833f, -0.000361f, + -0.006299f, +0.000687f, -0.003061f, +0.014533f, +0.011247f, +0.006789f, -0.011727f, +0.010798f, -0.008690f, -0.000910f, + -0.004860f, +0.004901f, -0.008261f, +0.008054f, +0.006579f, -0.013874f, +0.000549f, +0.016733f, +0.008676f, -0.006816f, + +0.001966f, -0.006266f, -0.001080f, -0.005580f, +0.005686f, +0.002344f, +0.006166f, -0.001106f, +0.007817f, +0.002805f, + +0.005656f, +0.010167f, -0.004816f, +0.002138f, +0.007797f, +0.002555f, -0.000545f, -0.002399f, +0.003946f, -0.003440f, + -0.000693f, +0.003308f, +0.001621f, -0.000312f, -0.005592f, -0.001735f, -0.003877f, +0.000854f, -0.000353f, +0.002443f, + -0.000060f, +0.005051f, -0.000049f, -0.000570f, +0.001747f, -0.003899f, -0.002573f, -0.003064f, -0.002020f, +0.004965f, + +0.001684f, +0.001620f, -0.000188f, +0.002311f, -0.001355f, -0.000415f + }, + { + -0.004353f, -0.033570f, -0.004006f, +0.005012f, +0.000192f, -0.004901f, -0.004935f, -0.005035f, -0.006613f, -0.003987f, + -0.003529f, -0.001641f, +0.011658f, +0.025780f, +0.014319f, +0.008683f, -0.030709f, -0.009019f, -0.030878f, -0.003064f, + -0.005391f, +0.005052f, +0.008064f, -0.018462f, +0.007657f, -0.020628f, -0.020750f, -0.016548f, +0.026360f, +0.020488f, + +0.026354f, -0.011880f, +0.031703f, -0.021054f, +0.018940f, +0.005197f, -0.014373f, -0.013938f, +0.002039f, +0.006070f, + -0.000890f, -0.019090f, +0.011291f, +0.004843f, -0.001538f, +0.005249f, +0.008583f, -0.007700f, -0.006936f, +0.005514f, + +0.005164f, +0.004927f, -0.006641f, -0.000979f, +0.001866f, -0.006139f, +0.002077f, -0.004426f, -0.005459f, +0.003551f, + +0.008608f, +0.001692f, -0.003864f, +0.001658f, +0.007709f, +0.001931f, +0.008335f, +0.000564f, +0.009082f, +0.009453f, + -0.002263f, -0.002849f, -0.002143f, -0.001162f, -0.000921f, +0.001499f, +0.004214f, +0.003063f, +0.003238f, +0.004641f, + +0.001318f, -0.002662f, +0.004527f, -0.002668f, +0.001354f, -0.000664f, +0.001921f, +0.001786f, +0.001970f, -0.002308f, + -0.001154f, +0.000018f, -0.004184f, +0.000653f, +0.003802f, -0.000593f + }, + { + -0.065447f, +0.292990f, -0.045472f, -0.061734f, +0.019237f, +0.014213f, +0.013943f, -0.043522f, +0.037151f, +0.016003f, + -0.001148f, +0.044640f, -0.030681f, -0.030184f, -0.004407f, -0.001586f, -0.004032f, +0.020496f, -0.028263f, -0.022156f, + +0.004288f, -0.004563f, -0.000964f, +0.007412f, +0.010177f, +0.025315f, +0.000086f, +0.002601f, -0.003334f, +0.000536f, + +0.005825f, +0.016467f, +0.000151f, +0.011249f, +0.008537f, +0.003080f, -0.030662f, +0.017638f, +0.007553f, +0.006307f, + -0.004951f, -0.003600f, -0.011535f, +0.016181f, -0.002086f, -0.016902f, +0.007785f, -0.003332f, -0.007985f, +0.007123f, + +0.003432f, -0.001006f, +0.014859f, +0.010771f, +0.000110f, -0.009139f, +0.000103f, -0.001736f, -0.003696f, -0.005165f, + -0.009343f, -0.002000f, +0.004563f, +0.005064f, -0.001469f, -0.002743f, -0.002082f, -0.007447f, -0.004077f, -0.005150f, + -0.000284f, +0.002484f, +0.003675f, +0.004913f, -0.001790f, -0.002235f, -0.001207f, -0.002656f, -0.003216f, -0.000210f, + -0.002449f, +0.007118f, -0.002986f, -0.000723f, +0.006726f, -0.002770f, +0.001983f, -0.001935f, +0.000210f, -0.000970f, + -0.002600f, -0.000495f, -0.000168f, +0.002074f, -0.002475f, -0.000217f + }, + { + +0.009501f, +0.000529f, -0.008106f, -0.006825f, +0.017822f, +0.017804f, -0.002703f, +0.003289f, -0.016800f, -0.006880f, + -0.028242f, -0.019675f, +0.005907f, -0.009475f, +0.000031f, -0.002439f, -0.023133f, -0.011976f, -0.003885f, -0.026533f, + +0.026220f, +0.013952f, +0.018406f, +0.003744f, -0.003755f, +0.033555f, -0.000098f, +0.002046f, -0.006454f, +0.010202f, + +0.023659f, -0.023692f, +0.012347f, +0.028888f, -0.006746f, +0.015409f, -0.005470f, -0.006318f, +0.009579f, +0.007520f, + +0.006777f, -0.006126f, +0.005240f, -0.008843f, -0.006496f, +0.008964f, +0.005090f, +0.005611f, +0.009432f, +0.000296f, + +0.003741f, -0.007074f, -0.012568f, -0.004039f, +0.010495f, +0.004039f, +0.001926f, +0.013646f, +0.004206f, -0.000931f, + -0.000562f, -0.000735f, +0.002555f, +0.006754f, -0.006409f, +0.009101f, -0.002630f, -0.007983f, -0.007066f, -0.003199f, + +0.007386f, +0.003995f, -0.007878f, +0.001792f, -0.000869f, -0.002098f, -0.000574f, +0.001441f, +0.005214f, +0.004502f, + +0.006194f, -0.001132f, -0.003455f, -0.003114f, +0.002195f, +0.000608f, -0.001342f, +0.002045f, +0.000784f, -0.002423f, + -0.002383f, +0.002347f, +0.000537f, +0.001326f, -0.002723f, -0.000075f + }, + { + +0.049399f, -0.017031f, -0.006236f, +0.024172f, -0.000727f, +0.043195f, +0.051799f, +0.046068f, +0.010309f, -0.003214f, + +0.004790f, +0.005020f, +0.014172f, +0.022145f, +0.017766f, +0.021251f, -0.013792f, +0.027389f, -0.026833f, -0.002679f, + -0.013695f, +0.038954f, +0.017129f, +0.000340f, +0.011154f, -0.000296f, +0.003882f, +0.006084f, +0.007010f, -0.015359f, + +0.022055f, +0.015368f, -0.019371f, +0.010511f, +0.007551f, -0.013713f, -0.004202f, +0.001076f, -0.016054f, +0.020257f, + -0.003139f, -0.004527f, +0.004122f, -0.008829f, +0.004749f, -0.000720f, -0.000276f, +0.006325f, +0.005099f, -0.005903f, + +0.004148f, -0.009879f, +0.005503f, +0.001225f, -0.006336f, -0.007178f, +0.005167f, -0.001654f, -0.004500f, +0.007208f, + +0.004870f, -0.006704f, -0.004464f, +0.000924f, +0.004090f, +0.001817f, +0.002230f, -0.003443f, -0.001875f, -0.005910f, + +0.001780f, +0.002646f, -0.000369f, -0.002071f, +0.001915f, +0.001276f, +0.006311f, -0.001518f, +0.002287f, -0.000934f, + -0.001956f, -0.002075f, -0.002307f, -0.002385f, -0.002153f, +0.002959f, -0.000680f, +0.002050f, -0.002916f, -0.001001f, + -0.000086f, -0.000343f, +0.002180f, -0.000084f, +0.002998f, -0.003161f + }, + { + +0.004119f, +0.054014f, +0.008125f, -0.010001f, -0.007656f, +0.013811f, +0.017860f, -0.008988f, +0.013999f, -0.006775f, + +0.013277f, +0.002805f, -0.007896f, +0.006772f, -0.052354f, +0.006562f, -0.012068f, +0.037051f, +0.001655f, -0.019806f, + +0.016989f, +0.019447f, -0.045866f, -0.000913f, -0.018083f, -0.009828f, -0.000691f, +0.017784f, -0.027103f, +0.025424f, + +0.015062f, -0.009420f, -0.004806f, -0.008431f, +0.000783f, -0.013613f, +0.005520f, -0.005204f, +0.009243f, -0.003967f, + -0.001493f, +0.002432f, +0.017218f, +0.018297f, -0.000543f, +0.008609f, -0.005116f, -0.006292f, +0.003060f, -0.014666f, + -0.009539f, +0.003556f, +0.003637f, +0.002669f, -0.002738f, -0.005812f, -0.006568f, -0.011076f, +0.003453f, +0.004910f, + +0.000625f, +0.002602f, -0.000054f, -0.005077f, +0.010854f, +0.003919f, +0.006267f, +0.004229f, -0.000514f, +0.000983f, + +0.005193f, +0.008220f, -0.000667f, -0.001881f, -0.000343f, +0.000421f, -0.000816f, -0.001700f, +0.000044f, -0.002182f, + +0.002330f, -0.001234f, +0.003222f, +0.001792f, -0.000501f, -0.004897f, -0.002170f, +0.000895f, -0.004033f, -0.000037f, + +0.005907f, +0.000381f, -0.001449f, -0.000834f, -0.001044f, -0.002739f + }, + { + +0.046591f, +0.061951f, -0.014144f, +0.005669f, +0.035047f, -0.040569f, -0.021593f, -0.003218f, -0.005428f, +0.039559f, + -0.005745f, +0.016321f, +0.016963f, +0.002906f, +0.036760f, +0.009466f, +0.006855f, +0.030965f, -0.021641f, +0.047086f, + +0.006379f, +0.007408f, -0.031397f, -0.025760f, -0.001609f, -0.002734f, -0.006535f, +0.003178f, -0.021521f, +0.014402f, + -0.004925f, -0.001024f, +0.003828f, +0.016987f, -0.008047f, +0.019689f, -0.006697f, -0.004011f, +0.012617f, +0.000757f, + +0.004967f, -0.018960f, +0.002781f, +0.003505f, +0.003268f, -0.005787f, +0.012640f, -0.006955f, -0.006676f, +0.011621f, + +0.003223f, -0.007699f, +0.008525f, +0.008047f, -0.009728f, -0.001457f, -0.004368f, -0.002956f, -0.000182f, +0.001857f, + +0.001109f, -0.001217f, +0.004299f, -0.002229f, -0.011057f, +0.000078f, +0.000275f, -0.002217f, -0.007371f, +0.005360f, + +0.003301f, +0.001521f, +0.007968f, +0.000361f, -0.002480f, -0.001080f, -0.002378f, +0.004824f, -0.002540f, +0.000424f, + -0.001234f, -0.000652f, -0.001394f, +0.007760f, -0.000549f, -0.001987f, +0.001206f, +0.005854f, -0.001748f, -0.003567f, + +0.004524f, +0.002246f, +0.004924f, -0.000272f, -0.000345f, +0.001243f + }, + { + -0.006401f, -0.054502f, +0.029506f, +0.009015f, +0.012361f, +0.006630f, +0.019938f, -0.000200f, -0.006666f, +0.001470f, + +0.001697f, -0.006488f, -0.010410f, +0.003509f, -0.140299f, -0.015465f, +0.013303f, -0.024859f, -0.019556f, +0.028339f, + -0.026542f, -0.009040f, -0.037257f, +0.008280f, -0.021696f, +0.005717f, -0.025729f, +0.024082f, -0.020780f, -0.012270f, + -0.031933f, +0.000954f, -0.011669f, +0.022867f, +0.011493f, +0.002723f, -0.011730f, +0.011219f, +0.017872f, -0.021678f, + -0.018166f, -0.014514f, -0.001070f, -0.009268f, -0.011924f, +0.012709f, -0.010482f, +0.000841f, +0.016613f, +0.002027f, + +0.027145f, -0.008523f, -0.001274f, -0.004380f, -0.004398f, +0.001542f, +0.005899f, +0.001149f, -0.016648f, -0.007989f, + +0.004418f, -0.002223f, -0.000859f, +0.002757f, -0.000183f, -0.007780f, +0.007030f, -0.002776f, -0.000886f, +0.001706f, + +0.003922f, -0.002013f, +0.006120f, -0.000396f, +0.000928f, -0.001369f, -0.001581f, +0.001734f, +0.000879f, +0.000303f, + -0.003886f, -0.001754f, +0.002233f, +0.002522f, +0.003378f, -0.002518f, -0.003939f, -0.000478f, +0.003535f, -0.003076f, + +0.000247f, -0.001720f, -0.004042f, +0.000438f, -0.002853f, -0.000543f + }, + { + +0.017791f, +0.109493f, +0.032743f, +0.021093f, -0.012588f, -0.033255f, -0.012139f, -0.010339f, +0.007830f, -0.019383f, + +0.048234f, +0.001949f, -0.038820f, -0.009446f, +0.118006f, +0.002809f, -0.029216f, +0.008904f, -0.012302f, -0.003367f, + +0.006005f, +0.012965f, +0.006048f, +0.008497f, +0.021068f, +0.010416f, +0.028977f, +0.000097f, -0.041670f, +0.009305f, + +0.009169f, +0.011800f, +0.010973f, +0.020641f, -0.008995f, -0.017403f, -0.009322f, +0.008737f, +0.037842f, +0.005240f, + +0.005024f, -0.018500f, +0.003311f, -0.011115f, +0.005038f, -0.003171f, -0.004420f, -0.028616f, -0.012269f, -0.014153f, + +0.000850f, +0.004171f, +0.003374f, +0.000988f, +0.008040f, +0.014312f, +0.003242f, -0.003620f, +0.005543f, -0.005086f, + +0.003855f, +0.001801f, -0.000416f, +0.002990f, -0.004611f, +0.011804f, -0.001891f, -0.005171f, +0.004797f, +0.011267f, + -0.006767f, -0.005090f, -0.006967f, +0.002075f, -0.004157f, +0.001774f, -0.005895f, -0.003014f, -0.003088f, -0.003181f, + +0.000052f, +0.002955f, -0.002906f, +0.002196f, -0.001075f, +0.001513f, +0.000458f, +0.003750f, -0.001167f, -0.003441f, + +0.004250f, +0.001478f, +0.000488f, +0.000267f, -0.002819f, +0.002974f + } + }, + { + { + -0.001715f, -0.112406f, +0.014238f, -0.002407f, -0.011472f, -0.004696f, +0.009994f, +0.014985f, -0.011152f, -0.024435f, + +0.000459f, -0.035861f, -0.026023f, -0.002354f, +0.052146f, +0.018258f, +0.028012f, -0.006519f, +0.008704f, +0.050757f, + +0.011719f, -0.035609f, -0.025236f, +0.003503f, +0.000588f, -0.012054f, +0.013773f, -0.004528f, +0.006238f, +0.012514f, + +0.035922f, +0.022293f, -0.009440f, +0.006750f, +0.004779f, -0.003452f, -0.000533f, +0.004849f, -0.009194f, +0.005973f, + -0.011969f, +0.001128f, -0.003012f, -0.010727f, -0.016001f, -0.015093f, +0.004999f, +0.004778f, -0.002083f, +0.000415f, + -0.000372f, -0.014683f, +0.001266f, -0.007830f, -0.006745f, +0.003239f, +0.008018f, -0.004594f, +0.001401f, +0.004836f, + -0.002111f, +0.003442f, +0.001170f, +0.003063f, -0.003050f, -0.001927f, +0.002454f, +0.006465f, +0.000803f, +0.002758f, + -0.000499f, -0.004353f, +0.001763f, +0.004935f, +0.001506f, +0.004396f, -0.004425f, +0.006440f, -0.001129f, +0.001195f, + -0.000282f, +0.002471f, +0.000771f, +0.002114f, +0.000662f, +0.003680f, +0.000380f, +0.003416f, -0.000427f, -0.001882f, + -0.000129f, -0.001066f, +0.001485f, +0.002378f, +0.001399f, +0.002585f + }, + { + +0.049073f, -0.006499f, -0.062564f, -0.020022f, -0.010369f, +0.004583f, +0.026017f, -0.003955f, +0.014324f, -0.010670f, + +0.046873f, +0.003945f, -0.026446f, -0.015033f, -0.002814f, -0.018513f, +0.021454f, +0.012027f, +0.029653f, +0.010101f, + +0.003134f, -0.008034f, +0.009036f, -0.002511f, +0.010239f, +0.004730f, -0.013952f, +0.001364f, +0.002578f, +0.009098f, + +0.009687f, -0.000328f, -0.002825f, +0.006498f, -0.018354f, -0.009796f, +0.002455f, +0.005738f, -0.002575f, +0.008834f, + -0.005039f, +0.007852f, +0.006195f, -0.013070f, -0.005192f, +0.002617f, +0.017259f, -0.001982f, +0.002196f, +0.002277f, + +0.008462f, +0.006758f, +0.014404f, +0.006609f, +0.001232f, -0.012552f, -0.001371f, -0.001604f, +0.006796f, +0.002755f, + -0.007105f, -0.003590f, -0.002458f, -0.000680f, -0.007833f, +0.006588f, +0.002436f, +0.007778f, -0.000409f, +0.000148f, + -0.002181f, -0.000820f, -0.000644f, -0.000161f, +0.001012f, +0.002326f, -0.001697f, -0.000952f, -0.007223f, -0.000324f, + -0.001678f, -0.001474f, +0.002827f, -0.002329f, -0.001122f, +0.001505f, -0.001470f, -0.000102f, -0.000852f, -0.000074f, + -0.000327f, +0.000985f, -0.001904f, +0.001309f, +0.000263f, -0.001792f + }, + { + -0.001732f, +0.269234f, +0.028709f, -0.001651f, +0.039421f, +0.001574f, +0.004177f, -0.018638f, -0.010881f, -0.024881f, + +0.005130f, +0.030794f, -0.004674f, +0.008001f, +0.018184f, -0.022956f, -0.010352f, +0.016163f, -0.003545f, +0.007423f, + +0.007548f, +0.013491f, +0.004856f, +0.006169f, +0.027897f, -0.002991f, -0.006943f, -0.001760f, -0.025021f, +0.003256f, + +0.015674f, -0.003006f, -0.020537f, -0.012983f, +0.010258f, -0.000708f, +0.003340f, +0.001300f, +0.004995f, -0.009072f, + +0.011152f, +0.005257f, -0.006787f, -0.005066f, -0.007706f, -0.007138f, -0.004029f, +0.005782f, +0.010851f, +0.001470f, + +0.002406f, -0.008324f, +0.006663f, +0.002551f, +0.004187f, -0.001563f, +0.004751f, +0.002761f, +0.008312f, -0.002503f, + -0.001369f, -0.003768f, +0.000491f, +0.001386f, -0.001028f, +0.003546f, +0.003382f, +0.003496f, -0.011518f, +0.000941f, + +0.005515f, -0.006793f, -0.000775f, -0.001816f, +0.000888f, +0.004170f, -0.009464f, -0.002694f, +0.001874f, +0.004772f, + +0.000060f, +0.007008f, +0.004017f, -0.001540f, +0.002708f, -0.000437f, -0.001387f, +0.002020f, +0.000406f, +0.000182f, + -0.002708f, -0.000026f, +0.003140f, -0.000397f, +0.000053f, +0.000923f + }, + { + +0.001025f, +0.055196f, +0.005052f, +0.007769f, -0.002801f, +0.002006f, +0.003773f, -0.000278f, +0.002638f, -0.005065f, + +0.006735f, -0.015104f, +0.003606f, -0.008564f, +0.041245f, +0.033725f, +0.002796f, -0.008485f, +0.059910f, +0.028009f, + -0.024280f, -0.006504f, +0.032608f, -0.014902f, -0.009345f, -0.013986f, -0.018809f, -0.016539f, -0.018098f, +0.000785f, + +0.016323f, -0.022069f, -0.006461f, -0.005908f, -0.007011f, +0.008573f, +0.013433f, -0.012498f, -0.005166f, -0.000606f, + +0.011976f, -0.004467f, +0.001418f, +0.015761f, +0.012248f, +0.006519f, -0.009172f, +0.004370f, -0.009074f, +0.004025f, + +0.002555f, -0.000502f, -0.009026f, -0.002869f, +0.007655f, -0.010101f, -0.001692f, +0.003760f, +0.001600f, -0.001342f, + -0.004070f, -0.001200f, -0.002799f, -0.002275f, -0.001675f, -0.001327f, -0.005118f, +0.000902f, -0.006292f, +0.000536f, + -0.000351f, +0.000485f, -0.007626f, +0.000115f, +0.002496f, -0.006552f, +0.001614f, -0.003960f, -0.003651f, -0.000252f, + -0.000114f, +0.005815f, +0.001765f, +0.002404f, -0.005705f, +0.001188f, -0.000502f, +0.001918f, -0.001744f, +0.001063f, + -0.001760f, +0.000899f, +0.000048f, -0.000571f, +0.000234f, +0.002219f + }, + { + -0.002972f, +0.175251f, +0.037588f, -0.095445f, -0.010728f, +0.000227f, -0.001749f, -0.015473f, -0.030114f, -0.023964f, + +0.024995f, -0.049097f, -0.009799f, +0.010300f, -0.022621f, +0.041807f, -0.001235f, -0.013678f, +0.009626f, +0.017432f, + +0.002423f, +0.016786f, -0.004335f, +0.009978f, +0.020061f, +0.017240f, +0.016218f, +0.030563f, -0.004899f, -0.008502f, + +0.018714f, +0.001891f, -0.011550f, +0.011855f, -0.016244f, -0.008820f, +0.020826f, +0.002574f, -0.005397f, +0.010661f, + +0.003117f, +0.009375f, -0.008806f, +0.013263f, -0.005336f, +0.011201f, -0.008248f, +0.008169f, +0.002701f, +0.005462f, + +0.001541f, -0.004685f, +0.000581f, +0.010695f, +0.006026f, -0.004775f, -0.000427f, +0.005432f, -0.001217f, -0.010543f, + +0.009806f, +0.002276f, +0.013269f, +0.001764f, -0.012156f, +0.003885f, -0.001925f, -0.002882f, +0.001981f, -0.000960f, + +0.003469f, +0.002109f, +0.000556f, -0.001206f, -0.000549f, +0.003422f, +0.001431f, -0.004289f, -0.000353f, -0.002263f, + -0.006253f, +0.004261f, +0.000290f, -0.002464f, +0.001704f, +0.003154f, -0.004300f, +0.000855f, +0.003571f, -0.001587f, + -0.001577f, +0.002027f, +0.000578f, -0.001236f, +0.004234f, +0.000349f + }, + { + -0.000346f, +0.041887f, +0.004271f, -0.003607f, +0.000260f, -0.004380f, -0.000137f, +0.002847f, +0.003462f, -0.009888f, + +0.002804f, +0.002651f, +0.002545f, -0.016742f, -0.004034f, -0.014784f, +0.023554f, +0.004746f, -0.001314f, +0.039396f, + -0.015647f, +0.017333f, +0.002043f, +0.014691f, -0.027730f, +0.001782f, -0.003176f, -0.006159f, +0.006084f, +0.043646f, + +0.001762f, -0.024847f, -0.014600f, -0.004250f, +0.000404f, +0.010592f, +0.006499f, +0.000916f, +0.003868f, -0.009653f, + +0.021483f, +0.013787f, +0.014925f, -0.000868f, +0.004420f, -0.009338f, +0.003444f, -0.007747f, -0.016320f, +0.003573f, + +0.001469f, +0.004374f, +0.001271f, -0.002126f, +0.003532f, -0.006458f, +0.004516f, +0.001343f, -0.002838f, +0.001998f, + -0.000819f, +0.003622f, +0.001693f, +0.001936f, +0.005998f, -0.006851f, +0.011510f, -0.000327f, +0.000185f, -0.008638f, + +0.002071f, -0.006016f, -0.003278f, -0.002919f, +0.000912f, +0.002958f, +0.002133f, +0.000211f, +0.001499f, +0.000694f, + -0.001037f, -0.000705f, -0.000528f, +0.001307f, -0.001656f, -0.000876f, -0.000543f, -0.001670f, -0.000568f, -0.001809f, + +0.000150f, +0.001847f, +0.000132f, +0.000017f, +0.000038f, +0.000800f + }, + { + -0.030435f, +0.221015f, +0.063503f, -0.055794f, -0.002680f, -0.018200f, +0.006565f, +0.016268f, +0.000908f, +0.019927f, + +0.027017f, -0.032501f, +0.008650f, -0.028561f, -0.004025f, +0.004026f, -0.009993f, -0.015905f, -0.005149f, +0.015478f, + -0.022374f, +0.001167f, -0.017640f, -0.007223f, -0.008212f, +0.000855f, +0.004205f, -0.000463f, -0.006748f, +0.006595f, + +0.001262f, -0.005216f, -0.014444f, -0.001883f, -0.000640f, +0.000963f, -0.008179f, +0.017819f, -0.000298f, +0.010423f, + -0.000545f, +0.004569f, -0.000287f, +0.005044f, +0.002015f, -0.002942f, +0.002344f, +0.002105f, +0.008534f, -0.005584f, + -0.000545f, -0.007534f, +0.004192f, -0.003810f, +0.004231f, +0.005038f, +0.009806f, -0.003949f, +0.000797f, -0.005343f, + +0.003873f, +0.005516f, -0.006978f, +0.002570f, +0.003759f, -0.003208f, -0.002212f, +0.001345f, +0.004370f, -0.004094f, + -0.003514f, +0.002190f, +0.001178f, -0.001529f, -0.003801f, +0.001074f, -0.003317f, -0.001053f, +0.000251f, +0.003373f, + -0.003687f, +0.003265f, -0.000611f, -0.001899f, +0.001316f, -0.001966f, -0.001138f, -0.001764f, +0.001078f, +0.005139f, + -0.001432f, -0.000347f, +0.001104f, +0.004298f, -0.000087f, +0.000585f + }, + { + +0.001483f, +0.013711f, +0.014023f, +0.007415f, +0.001967f, -0.001615f, +0.001811f, -0.000802f, -0.007885f, -0.001805f, + -0.003230f, -0.004203f, +0.002317f, -0.014975f, -0.011591f, +0.011715f, -0.062395f, -0.047737f, -0.023772f, +0.017527f, + -0.017314f, +0.001978f, +0.022766f, +0.000484f, +0.012637f, +0.003442f, +0.012191f, -0.015599f, +0.008353f, -0.013697f, + +0.007967f, -0.012231f, +0.023128f, -0.014039f, +0.015435f, +0.000599f, -0.000259f, -0.009101f, -0.010943f, +0.006227f, + -0.002045f, -0.015960f, +0.009634f, +0.002084f, +0.002959f, +0.007426f, +0.006280f, -0.007285f, +0.002442f, +0.004029f, + -0.001784f, +0.014170f, +0.000614f, -0.004549f, -0.002319f, -0.016028f, +0.003226f, -0.001969f, -0.007729f, +0.005804f, + +0.011808f, +0.001274f, -0.004745f, +0.003381f, +0.003770f, -0.002789f, +0.003479f, -0.009252f, +0.002260f, +0.003952f, + -0.001220f, +0.002666f, -0.000916f, -0.001878f, -0.001326f, -0.001840f, +0.000863f, +0.001110f, +0.000668f, -0.001359f, + -0.003929f, -0.003874f, +0.003913f, -0.001980f, +0.001268f, -0.003501f, -0.001311f, +0.002298f, +0.003482f, -0.000481f, + +0.000894f, +0.004153f, -0.000555f, -0.001338f, +0.000073f, -0.001848f + }, + { + +0.045932f, +0.505659f, +0.041134f, -0.044142f, -0.014218f, +0.011923f, +0.043044f, -0.013601f, +0.051795f, +0.004112f, + -0.035158f, +0.024999f, -0.002259f, +0.013524f, +0.014967f, +0.007143f, +0.006137f, +0.033578f, -0.016065f, -0.023877f, + +0.001727f, -0.022907f, -0.017737f, +0.002657f, -0.008012f, +0.000998f, -0.005985f, +0.013605f, -0.001796f, -0.000364f, + -0.009363f, -0.009394f, -0.008365f, +0.006967f, +0.003559f, -0.004706f, -0.023358f, +0.031910f, -0.001849f, -0.010805f, + +0.004109f, +0.015357f, -0.006522f, +0.010206f, -0.000312f, -0.013586f, +0.006833f, +0.006472f, -0.000168f, +0.005320f, + +0.000843f, +0.003505f, +0.008503f, +0.004315f, +0.007958f, +0.002679f, +0.005968f, +0.001545f, -0.003572f, -0.002165f, + -0.004837f, +0.002227f, +0.007378f, +0.000051f, +0.000006f, +0.000981f, -0.000710f, -0.000217f, +0.000985f, -0.000860f, + +0.000847f, -0.000696f, -0.001399f, -0.000650f, -0.002357f, -0.001339f, -0.003113f, -0.001687f, +0.002933f, +0.001891f, + -0.003754f, +0.004282f, -0.000177f, -0.002121f, +0.003870f, -0.003378f, +0.001259f, +0.001942f, +0.003796f, +0.000480f, + -0.001059f, +0.002399f, +0.003137f, +0.003992f, -0.003593f, -0.001092f + }, + { + -0.010173f, -0.001218f, +0.002287f, -0.003946f, +0.009191f, -0.001759f, -0.028054f, +0.003052f, +0.003652f, -0.001495f, + +0.002029f, +0.007406f, +0.020889f, -0.012083f, +0.000571f, +0.019918f, +0.010680f, +0.008031f, -0.022647f, -0.026929f, + +0.034118f, +0.007039f, +0.005557f, -0.007016f, -0.013509f, +0.012397f, -0.004674f, +0.012680f, -0.005798f, -0.005685f, + +0.025253f, -0.004529f, +0.021923f, +0.018967f, -0.004479f, +0.005843f, -0.012630f, -0.004901f, -0.002789f, +0.001154f, + +0.010114f, -0.007653f, -0.001293f, -0.013115f, -0.012478f, -0.005002f, -0.005602f, +0.007350f, -0.001120f, -0.008739f, + +0.010570f, -0.000425f, -0.002703f, -0.006562f, +0.005379f, +0.005023f, -0.005142f, +0.004812f, +0.000952f, +0.003508f, + +0.002740f, -0.004565f, +0.002037f, +0.005793f, -0.007076f, +0.012421f, -0.001815f, -0.008840f, -0.005534f, -0.006831f, + +0.003553f, +0.003821f, -0.002670f, +0.005231f, -0.002136f, +0.000856f, -0.000095f, -0.000161f, +0.006582f, +0.004890f, + +0.002269f, -0.004229f, -0.002211f, -0.000297f, +0.001108f, -0.001800f, -0.005803f, +0.000221f, +0.000416f, -0.001170f, + -0.000365f, +0.002169f, -0.001068f, +0.001527f, -0.001094f, -0.001715f + }, + { + -0.056120f, -0.099621f, +0.024836f, +0.019668f, -0.006613f, -0.056240f, -0.042759f, +0.032886f, -0.002483f, -0.015551f, + +0.013937f, -0.014259f, -0.019317f, -0.003867f, -0.016757f, +0.001644f, -0.008818f, +0.015358f, -0.045401f, +0.012249f, + +0.005587f, +0.038061f, -0.002890f, -0.009534f, +0.020778f, +0.023877f, +0.005576f, -0.010449f, +0.014791f, -0.000011f, + +0.022950f, +0.005037f, -0.036839f, -0.008792f, +0.002779f, -0.019149f, -0.004682f, +0.009407f, -0.005668f, +0.016491f, + -0.019586f, -0.008200f, +0.011048f, -0.013657f, +0.003381f, +0.003037f, +0.004966f, +0.003257f, -0.004801f, -0.014080f, + +0.005008f, -0.010164f, -0.001475f, -0.000779f, -0.001878f, -0.008961f, +0.005881f, -0.001400f, -0.004620f, +0.006663f, + +0.004083f, -0.002186f, -0.004840f, +0.002633f, +0.006826f, -0.002018f, -0.002976f, +0.000807f, +0.003485f, -0.001130f, + +0.003293f, +0.001728f, -0.001928f, -0.003183f, +0.004309f, -0.001092f, +0.003805f, -0.000805f, +0.006109f, +0.003887f, + +0.000527f, -0.002299f, -0.003381f, -0.000856f, -0.000441f, +0.006939f, +0.000476f, +0.000703f, -0.001521f, +0.003126f, + +0.003071f, +0.002412f, +0.002869f, -0.000521f, +0.003959f, -0.003571f + }, + { + -0.002567f, +0.066284f, +0.017377f, -0.004615f, -0.013843f, -0.003395f, +0.004562f, -0.010801f, +0.010489f, -0.006917f, + +0.014597f, +0.001743f, -0.012462f, -0.000273f, -0.046008f, +0.019110f, -0.013923f, -0.010849f, -0.043970f, -0.009833f, + +0.025188f, -0.002760f, -0.055004f, +0.000464f, -0.036520f, -0.008240f, -0.008011f, -0.005955f, -0.038598f, +0.002370f, + +0.006969f, -0.014371f, -0.000561f, +0.009098f, +0.009396f, +0.002314f, +0.018109f, -0.020435f, +0.006274f, +0.009497f, + +0.002262f, -0.004347f, +0.013437f, +0.012955f, -0.001176f, +0.005159f, +0.005059f, -0.002522f, +0.010222f, +0.004318f, + +0.000864f, +0.005019f, +0.000228f, -0.004290f, -0.005023f, -0.001497f, +0.002019f, -0.010594f, -0.001133f, +0.000646f, + -0.001722f, -0.001678f, -0.001284f, -0.006494f, +0.002808f, -0.001490f, -0.003291f, -0.000958f, +0.000588f, +0.000249f, + +0.000242f, +0.004980f, -0.000358f, -0.002171f, -0.003249f, -0.002377f, -0.001535f, -0.000342f, +0.000147f, -0.006467f, + -0.003343f, -0.004946f, +0.003014f, +0.002177f, -0.002050f, -0.001706f, +0.000386f, +0.001005f, -0.001716f, +0.002906f, + +0.005678f, -0.000493f, -0.001041f, +0.004236f, +0.001606f, -0.003387f + }, + { + -0.056095f, -0.073067f, +0.018098f, -0.012970f, +0.018293f, +0.027312f, +0.025329f, -0.002086f, -0.007493f, +0.027248f, + -0.019397f, +0.009461f, +0.004019f, -0.025467f, -0.018688f, -0.014895f, -0.014958f, +0.025773f, -0.018570f, +0.029215f, + -0.001879f, +0.020938f, -0.016210f, -0.015965f, +0.019574f, +0.009374f, -0.005293f, +0.001541f, -0.007436f, +0.027070f, + -0.016553f, -0.011846f, +0.000440f, +0.013164f, -0.019009f, +0.013659f, -0.002681f, -0.003260f, +0.011328f, -0.000578f, + +0.009819f, -0.010480f, +0.008639f, +0.003959f, +0.006538f, -0.007514f, +0.020692f, -0.004189f, -0.001589f, +0.003837f, + -0.009960f, -0.009924f, -0.002147f, +0.003738f, -0.007928f, -0.008466f, -0.003593f, +0.004919f, +0.000787f, -0.004069f, + -0.002694f, +0.001533f, +0.005363f, +0.002297f, -0.007773f, -0.003135f, -0.004220f, -0.003060f, -0.009091f, +0.004676f, + +0.000673f, +0.002220f, +0.009310f, +0.005151f, +0.001401f, -0.003522f, -0.002075f, +0.004920f, -0.003647f, +0.002177f, + -0.002500f, -0.001054f, -0.003326f, +0.004699f, -0.002283f, +0.000173f, +0.003231f, +0.002791f, -0.003197f, -0.000089f, + +0.003741f, -0.001754f, +0.002280f, +0.000679f, +0.003073f, +0.001673f + }, + { + +0.007824f, -0.088637f, -0.012820f, -0.004758f, -0.010750f, -0.031999f, -0.003606f, +0.005052f, -0.005138f, -0.000023f, + -0.009941f, +0.003199f, +0.002398f, +0.101042f, +0.014826f, +0.022259f, +0.037875f, -0.000266f, -0.002948f, +0.009588f, + -0.022411f, +0.032193f, -0.018986f, +0.011410f, +0.004520f, +0.014026f, -0.033282f, +0.019306f, -0.012913f, +0.019120f, + -0.004152f, +0.025382f, -0.005066f, +0.010638f, +0.000251f, -0.001639f, -0.024278f, +0.000369f, +0.021926f, +0.004752f, + +0.009947f, -0.006212f, +0.004696f, +0.000586f, -0.005544f, +0.018902f, -0.015948f, -0.016261f, +0.007621f, -0.003677f, + +0.019140f, +0.000996f, +0.004441f, +0.001183f, +0.004259f, -0.000831f, +0.004359f, +0.004564f, -0.009725f, -0.002575f, + +0.006360f, -0.002813f, -0.001014f, +0.005198f, +0.005960f, -0.005358f, +0.001917f, -0.006280f, -0.003320f, -0.001680f, + -0.000891f, -0.002720f, +0.001813f, -0.003064f, +0.000078f, -0.000209f, +0.002191f, +0.006296f, +0.006798f, +0.002710f, + -0.004379f, -0.003586f, -0.000031f, -0.000900f, +0.001659f, +0.003058f, -0.000827f, -0.002579f, +0.005177f, -0.000594f, + -0.001597f, -0.002054f, -0.000612f, +0.005008f, -0.001588f, -0.001277f + }, + { + -0.041496f, +0.043611f, +0.027492f, +0.010045f, +0.012331f, +0.015759f, -0.000337f, -0.028707f, -0.029054f, -0.036205f, + +0.029413f, -0.026283f, -0.049640f, -0.049498f, +0.057493f, +0.001200f, -0.005768f, +0.037018f, -0.002824f, -0.019532f, + +0.023276f, +0.042230f, +0.015257f, -0.003589f, +0.007381f, +0.010419f, +0.025311f, +0.001968f, -0.024264f, +0.004718f, + -0.025836f, -0.014066f, +0.002577f, +0.011993f, -0.012101f, -0.003780f, +0.002212f, -0.001243f, +0.019285f, -0.008618f, + -0.011401f, -0.017152f, +0.020690f, -0.002870f, +0.012269f, +0.014690f, +0.007861f, -0.013986f, +0.004663f, -0.000552f, + +0.006830f, +0.005981f, +0.003470f, +0.000295f, -0.002532f, +0.001236f, +0.000684f, +0.002351f, +0.015197f, +0.000676f, + +0.000415f, +0.001820f, +0.007706f, +0.008834f, -0.001151f, +0.015257f, +0.006100f, -0.005847f, -0.000540f, +0.007488f, + -0.006284f, -0.001539f, +0.001479f, +0.007550f, -0.005966f, +0.001776f, -0.001293f, +0.002479f, +0.000694f, -0.000155f, + -0.000090f, +0.003566f, -0.000194f, +0.002717f, -0.001160f, +0.000147f, -0.001363f, +0.002726f, -0.001971f, -0.002559f, + +0.004734f, +0.001758f, +0.000072f, +0.000839f, -0.002513f, +0.001220f + } + }, + { + { + +0.000686f, -0.026170f, -0.044584f, -0.028456f, -0.002379f, +0.004153f, +0.007436f, +0.004526f, +0.003519f, -0.036379f, + -0.008528f, -0.037436f, -0.009099f, +0.003899f, +0.029816f, +0.033047f, +0.007000f, -0.018593f, +0.029301f, +0.043935f, + +0.004100f, -0.036830f, +0.000009f, -0.013061f, +0.001679f, +0.002527f, -0.000646f, +0.002508f, -0.014179f, +0.025142f, + +0.034542f, -0.001204f, +0.018969f, -0.014165f, +0.007906f, -0.000207f, +0.019766f, -0.015683f, -0.001789f, +0.008999f, + -0.006645f, -0.005705f, -0.001578f, -0.014260f, -0.010289f, -0.016737f, +0.009102f, +0.008324f, -0.009636f, +0.002870f, + -0.004651f, -0.009228f, -0.002842f, -0.012027f, +0.003293f, +0.005994f, +0.002673f, +0.005232f, -0.011189f, +0.009268f, + -0.001217f, -0.005543f, +0.006992f, +0.001792f, -0.001942f, -0.001050f, +0.005246f, +0.002205f, -0.006187f, +0.006987f, + -0.000904f, -0.005250f, +0.002414f, +0.002428f, -0.000057f, +0.005961f, -0.001604f, +0.003192f, -0.000958f, +0.000196f, + +0.004276f, -0.001013f, +0.001298f, +0.001976f, +0.002468f, +0.002289f, +0.001653f, +0.003076f, +0.000058f, -0.000690f, + -0.004419f, +0.000426f, +0.003110f, +0.003249f, +0.001663f, +0.000777f + }, + { + -0.049354f, -0.165838f, +0.136996f, -0.054067f, +0.055355f, +0.005878f, +0.015497f, +0.007679f, +0.002989f, -0.006876f, + +0.056646f, -0.050718f, +0.018032f, -0.006810f, -0.019710f, -0.017678f, +0.005541f, +0.018397f, +0.033459f, +0.002242f, + +0.016854f, -0.011208f, +0.000293f, -0.006218f, +0.024523f, +0.001772f, -0.011073f, -0.008808f, +0.013277f, +0.002543f, + +0.021080f, -0.011893f, +0.013974f, -0.007775f, -0.007807f, -0.018788f, +0.002869f, -0.003979f, +0.005835f, -0.000914f, + -0.007734f, +0.017258f, -0.001670f, -0.006008f, -0.006329f, +0.012324f, +0.007089f, +0.002809f, -0.006596f, +0.002451f, + +0.011387f, +0.008485f, +0.008049f, +0.014093f, -0.005214f, -0.008457f, -0.003137f, -0.001730f, +0.005601f, +0.000199f, + -0.006711f, +0.003091f, -0.013308f, -0.000749f, +0.003070f, +0.001228f, +0.000549f, +0.004447f, -0.000009f, +0.005308f, + -0.002726f, -0.000007f, -0.003207f, -0.001278f, +0.004104f, -0.000257f, -0.001520f, -0.002531f, -0.003249f, -0.002248f, + -0.000312f, +0.001968f, -0.000783f, -0.001648f, +0.001326f, -0.000143f, -0.000094f, -0.001587f, +0.000132f, -0.000675f, + +0.000736f, +0.000004f, -0.002011f, +0.002248f, -0.000783f, +0.000111f + }, + { + -0.002535f, +0.290216f, +0.010991f, +0.040995f, -0.007118f, +0.012761f, -0.000448f, -0.012825f, -0.006751f, -0.036994f, + +0.017257f, +0.036491f, -0.013284f, +0.005997f, +0.014093f, -0.009866f, +0.001488f, -0.005533f, +0.009548f, +0.015214f, + +0.000231f, +0.003590f, +0.011047f, +0.002746f, +0.020257f, -0.011106f, +0.000575f, -0.013949f, +0.002284f, -0.004939f, + +0.007715f, -0.001844f, -0.007285f, -0.018232f, +0.002419f, -0.001562f, -0.005584f, +0.003851f, +0.014800f, +0.005622f, + +0.002229f, +0.003381f, +0.000101f, -0.012400f, -0.006468f, +0.004695f, -0.013463f, +0.001223f, +0.009937f, +0.001048f, + +0.008046f, -0.002646f, +0.007110f, -0.003100f, +0.007316f, -0.004012f, +0.005769f, +0.000763f, +0.012799f, +0.000598f, + -0.005195f, -0.002167f, -0.000846f, -0.000623f, +0.001056f, +0.004437f, +0.003088f, +0.004591f, -0.008564f, -0.001442f, + -0.001665f, -0.001119f, -0.002959f, -0.002973f, +0.003427f, +0.000595f, -0.002803f, -0.002772f, +0.003089f, +0.002916f, + +0.001463f, +0.004675f, +0.003082f, +0.001536f, +0.001091f, -0.001715f, +0.000245f, -0.000165f, +0.001715f, -0.000448f, + -0.000740f, -0.001167f, +0.000231f, +0.001401f, +0.000414f, -0.001105f + }, + { + -0.002921f, +0.044908f, +0.012359f, +0.014877f, -0.006813f, +0.002624f, +0.003805f, +0.006459f, -0.006479f, +0.002089f, + -0.005848f, +0.001581f, -0.013342f, +0.005025f, +0.044646f, +0.021315f, +0.008821f, -0.000781f, +0.059459f, +0.011032f, + -0.004523f, +0.002310f, +0.001240f, +0.007021f, -0.021567f, -0.023746f, -0.028717f, -0.002163f, -0.011356f, +0.008854f, + -0.012964f, -0.020192f, +0.001502f, -0.022845f, +0.002746f, +0.000884f, +0.032072f, -0.018834f, -0.007303f, +0.002751f, + +0.012240f, -0.002471f, -0.004484f, +0.016201f, +0.009656f, -0.003240f, +0.007509f, -0.001910f, -0.004029f, -0.005054f, + +0.009036f, -0.005500f, +0.004451f, -0.005028f, -0.003141f, -0.002488f, -0.002595f, +0.000178f, -0.003084f, +0.002123f, + -0.001094f, -0.001323f, +0.000483f, -0.002441f, -0.006989f, -0.000509f, +0.001872f, +0.000250f, -0.006638f, -0.003713f, + +0.000893f, -0.001309f, -0.003099f, -0.005364f, +0.002656f, -0.003982f, -0.001640f, -0.002492f, -0.002133f, -0.001386f, + +0.000890f, +0.002576f, +0.004270f, -0.001116f, +0.000112f, -0.000814f, +0.000151f, -0.000377f, -0.000483f, +0.002061f, + -0.001731f, +0.000465f, +0.000113f, -0.001129f, +0.001524f, -0.002407f + }, + { + +0.034945f, +0.217215f, -0.048974f, -0.106686f, +0.008585f, +0.006321f, +0.005664f, -0.029917f, -0.000076f, -0.041540f, + -0.015926f, -0.022068f, +0.010940f, +0.003976f, -0.022293f, +0.022251f, +0.031844f, -0.039769f, +0.017079f, +0.030303f, + -0.016286f, +0.027516f, -0.023535f, +0.021307f, +0.004204f, +0.006219f, +0.027619f, +0.026342f, +0.002761f, +0.000418f, + +0.016295f, -0.003628f, -0.001943f, -0.009813f, -0.007901f, +0.006768f, +0.000575f, +0.004912f, -0.002846f, -0.007141f, + +0.011750f, +0.005265f, +0.011839f, -0.000847f, +0.000182f, +0.003593f, -0.004626f, +0.003849f, -0.002076f, +0.015701f, + +0.000281f, -0.011957f, +0.002113f, +0.009207f, +0.011841f, -0.009037f, +0.002887f, -0.000275f, +0.005482f, -0.007837f, + +0.005022f, +0.001499f, +0.009272f, +0.004311f, -0.008692f, +0.003827f, -0.004615f, -0.003037f, +0.002667f, -0.003433f, + +0.001956f, +0.001740f, -0.000320f, +0.002045f, -0.004056f, +0.001487f, +0.002343f, +0.001102f, -0.001298f, -0.000444f, + -0.007497f, +0.000169f, +0.002983f, +0.000052f, -0.000397f, +0.000097f, -0.001851f, +0.001440f, +0.001190f, -0.000908f, + -0.001120f, +0.001101f, -0.000780f, +0.000838f, +0.001607f, +0.001817f + }, + { + +0.002980f, +0.021782f, +0.013738f, -0.001620f, -0.004715f, -0.001985f, -0.001333f, +0.001675f, +0.009671f, -0.001884f, + -0.002883f, -0.004866f, +0.000221f, +0.011037f, -0.048954f, +0.013745f, -0.004613f, +0.014251f, -0.025005f, +0.071098f, + -0.010674f, +0.017627f, -0.002893f, +0.031221f, -0.016701f, -0.024066f, -0.000191f, -0.006609f, +0.001556f, +0.042248f, + -0.004262f, -0.010924f, -0.016386f, -0.007646f, +0.005148f, +0.006146f, +0.001028f, +0.004486f, +0.006947f, -0.004771f, + +0.007058f, +0.013532f, +0.007189f, +0.002272f, +0.010690f, -0.007224f, +0.009872f, -0.015006f, -0.013812f, -0.010716f, + +0.007068f, +0.004660f, +0.011492f, -0.004136f, -0.001303f, -0.004113f, +0.001036f, +0.004924f, -0.007433f, +0.000467f, + +0.002290f, +0.004819f, +0.003090f, -0.000314f, +0.001394f, -0.000405f, +0.011045f, -0.001628f, -0.007026f, +0.001342f, + -0.003042f, -0.004365f, -0.003167f, -0.004974f, -0.000335f, +0.004469f, +0.003032f, -0.002270f, +0.003017f, +0.001721f, + -0.001705f, -0.002120f, +0.003238f, -0.001248f, -0.002037f, -0.002116f, +0.002762f, -0.002600f, -0.001623f, -0.000343f, + +0.000396f, +0.000352f, -0.001709f, +0.001613f, +0.002012f, +0.001203f + }, + { + +0.078215f, +0.199219f, -0.058748f, -0.060550f, +0.007040f, -0.002710f, -0.008418f, +0.005655f, +0.033889f, -0.004018f, + +0.001861f, +0.015753f, -0.007424f, -0.012378f, -0.022228f, -0.000686f, +0.011304f, -0.024114f, +0.028543f, -0.010128f, + -0.010132f, -0.007210f, -0.016835f, -0.029917f, +0.026891f, +0.003223f, -0.006998f, -0.011628f, +0.006286f, +0.007113f, + -0.000218f, -0.004594f, -0.008587f, -0.013353f, +0.000580f, -0.004149f, +0.006498f, +0.011136f, +0.003529f, +0.001423f, + +0.005776f, -0.000518f, +0.005665f, -0.006001f, +0.009916f, +0.004086f, +0.009265f, -0.005366f, +0.005076f, -0.003120f, + -0.000411f, -0.008218f, +0.008908f, +0.000232f, -0.004177f, +0.005327f, +0.014266f, +0.000425f, -0.011749f, +0.000504f, + -0.000560f, -0.000929f, +0.002792f, -0.002514f, -0.000278f, -0.001282f, -0.000168f, +0.003606f, +0.000969f, -0.001495f, + -0.002861f, -0.000456f, +0.000511f, -0.001884f, -0.000183f, -0.002294f, -0.002078f, -0.000021f, -0.000885f, -0.000449f, + +0.001107f, +0.000998f, -0.002468f, +0.000113f, +0.001453f, -0.002362f, -0.001844f, -0.000640f, +0.002578f, +0.002891f, + -0.000961f, +0.000491f, +0.003157f, +0.000782f, +0.001065f, +0.000377f + }, + { + +0.003234f, +0.018094f, +0.005820f, +0.000203f, +0.004441f, +0.001605f, -0.000703f, +0.004492f, -0.008928f, -0.001328f, + +0.000134f, -0.004817f, -0.004409f, -0.003446f, -0.017665f, -0.003397f, -0.048209f, -0.040853f, -0.010700f, +0.023918f, + -0.020632f, -0.005610f, +0.017590f, +0.015404f, -0.008026f, +0.023157f, +0.011989f, -0.020765f, +0.013918f, -0.014877f, + -0.018409f, +0.016629f, -0.015532f, +0.015520f, +0.001425f, +0.000378f, +0.008387f, -0.004228f, -0.014519f, -0.009480f, + +0.004394f, -0.001442f, -0.006005f, +0.013099f, -0.001273f, +0.002574f, -0.002881f, +0.001037f, +0.011262f, -0.008024f, + +0.001097f, +0.013203f, +0.009523f, -0.009367f, -0.005431f, -0.014645f, -0.001546f, +0.002606f, +0.005161f, -0.002953f, + +0.008770f, -0.003466f, +0.003423f, +0.001243f, -0.000776f, +0.001078f, +0.006026f, -0.008934f, -0.001786f, +0.004602f, + -0.000400f, -0.001951f, +0.005472f, -0.000615f, -0.003208f, -0.000450f, -0.000083f, +0.000436f, +0.001508f, -0.003758f, + -0.002697f, -0.004841f, +0.002467f, +0.000378f, -0.001383f, -0.002231f, -0.000894f, +0.003234f, +0.000432f, +0.001075f, + +0.003566f, -0.000197f, +0.002928f, -0.000511f, -0.001489f, -0.001907f + }, + { + -0.006287f, +0.662294f, -0.046053f, -0.072931f, +0.033295f, +0.000050f, +0.046377f, +0.019806f, +0.023684f, -0.013034f, + -0.020295f, +0.010306f, +0.024298f, +0.024931f, +0.017308f, -0.015020f, +0.040771f, +0.013412f, -0.010838f, -0.028343f, + -0.007762f, -0.013780f, -0.010950f, -0.000884f, -0.014117f, -0.002264f, +0.000055f, +0.021149f, -0.012381f, -0.003616f, + -0.009369f, +0.002865f, -0.007837f, -0.012812f, +0.006982f, -0.007060f, +0.006435f, +0.018344f, -0.008476f, -0.002468f, + -0.004818f, +0.010093f, +0.013796f, +0.006985f, +0.001590f, -0.019159f, -0.000960f, +0.017061f, +0.005184f, +0.002309f, + -0.006304f, +0.013236f, +0.002149f, +0.005475f, +0.002050f, +0.015404f, -0.001773f, -0.000040f, -0.002725f, -0.008162f, + +0.001443f, +0.001079f, +0.009337f, +0.002860f, -0.003462f, +0.003875f, -0.004208f, +0.002127f, +0.002300f, -0.002081f, + +0.000741f, +0.000650f, -0.004784f, -0.000092f, -0.002256f, -0.001020f, -0.003915f, +0.000630f, +0.001512f, +0.000867f, + +0.000328f, +0.001955f, +0.000792f, +0.001531f, +0.000743f, -0.000537f, -0.001800f, +0.001405f, +0.004132f, +0.002117f, + -0.000057f, +0.002260f, +0.003129f, +0.003394f, -0.004150f, -0.000204f + }, + { + +0.008444f, +0.033179f, -0.044102f, -0.016401f, +0.024707f, -0.017071f, -0.018616f, -0.006152f, +0.010018f, -0.002200f, + +0.018445f, +0.000896f, +0.016719f, -0.015332f, +0.020959f, +0.015247f, +0.011935f, -0.003252f, -0.017795f, +0.002947f, + +0.002280f, +0.012148f, -0.019085f, +0.009150f, +0.002738f, -0.012413f, -0.006078f, +0.018716f, +0.016815f, -0.016360f, + +0.023111f, -0.005600f, +0.031977f, +0.001760f, +0.007275f, -0.004410f, -0.003267f, -0.003346f, +0.000913f, -0.006158f, + +0.004117f, +0.003598f, -0.013086f, -0.003920f, -0.001987f, -0.007043f, -0.016649f, +0.004114f, -0.003837f, +0.003806f, + +0.005668f, -0.000317f, -0.003405f, +0.004917f, +0.003528f, +0.001527f, -0.001092f, -0.000924f, -0.000486f, +0.002547f, + +0.010308f, -0.003407f, +0.000221f, -0.003895f, +0.004060f, +0.006080f, -0.002780f, -0.006401f, -0.000112f, -0.008729f, + +0.001638f, +0.003124f, +0.002795f, -0.000360f, +0.001213f, -0.000103f, -0.001056f, -0.001097f, +0.006781f, +0.005844f, + -0.001216f, -0.003417f, -0.002381f, +0.003938f, -0.002176f, -0.003561f, -0.003027f, -0.000542f, +0.001837f, -0.003907f, + +0.002910f, -0.000313f, +0.000630f, +0.000055f, -0.001621f, -0.000338f + }, + { + +0.059661f, -0.174120f, -0.064962f, +0.032902f, +0.000281f, -0.093006f, -0.022483f, +0.012090f, +0.005521f, -0.000490f, + +0.001935f, -0.004748f, -0.019927f, -0.021732f, -0.013475f, -0.011397f, -0.017464f, +0.018282f, -0.040716f, +0.009959f, + +0.017336f, +0.020190f, -0.008443f, +0.004917f, +0.015835f, +0.016193f, +0.015164f, -0.010177f, +0.008508f, +0.000567f, + +0.014689f, +0.008802f, -0.028218f, -0.025844f, -0.002263f, -0.009461f, -0.000318f, +0.011185f, +0.006363f, +0.002175f, + -0.019442f, -0.000945f, +0.006382f, -0.001553f, +0.006987f, -0.012689f, +0.017214f, -0.007937f, -0.002984f, -0.010391f, + +0.001292f, -0.009667f, -0.001210f, -0.002793f, +0.002269f, -0.006791f, +0.003723f, -0.007146f, +0.003003f, +0.004144f, + -0.000038f, +0.000281f, -0.004866f, +0.010718f, +0.003190f, -0.002788f, -0.004726f, +0.005968f, -0.001659f, +0.005875f, + +0.003651f, -0.004356f, -0.002165f, +0.000074f, +0.002232f, +0.000827f, +0.001639f, +0.001546f, +0.003435f, +0.005595f, + +0.000091f, -0.000868f, -0.002959f, -0.001678f, +0.001322f, +0.004148f, +0.001993f, +0.000105f, +0.000985f, +0.001308f, + +0.003813f, +0.002899f, +0.002975f, +0.000161f, -0.000621f, -0.001047f + }, + { + -0.000183f, +0.090290f, -0.010319f, +0.004678f, -0.015841f, -0.003556f, -0.007471f, -0.000773f, +0.005179f, -0.012599f, + +0.020556f, +0.006027f, +0.005531f, -0.053147f, +0.001846f, +0.016218f, -0.014019f, -0.009029f, -0.055799f, +0.021415f, + +0.002882f, -0.042575f, -0.031463f, -0.007366f, -0.014179f, -0.005795f, -0.015963f, -0.005683f, -0.012316f, -0.035251f, + +0.017078f, -0.014713f, +0.000977f, +0.002134f, +0.027987f, -0.002699f, -0.002938f, -0.012630f, +0.015379f, +0.002097f, + +0.009774f, -0.005591f, +0.010077f, +0.002020f, +0.008345f, -0.000192f, +0.009606f, -0.011833f, +0.009591f, +0.012974f, + +0.011279f, -0.001280f, +0.005056f, -0.009327f, -0.004699f, -0.002796f, -0.000553f, -0.000608f, -0.008749f, -0.001951f, + -0.000009f, -0.003293f, -0.004141f, +0.009623f, -0.001635f, -0.009630f, -0.000694f, -0.002950f, -0.001148f, +0.006206f, + -0.004581f, -0.000287f, +0.000701f, -0.002520f, -0.001717f, -0.000438f, -0.002664f, +0.002318f, -0.000797f, -0.004191f, + -0.006599f, -0.000383f, -0.001373f, +0.004921f, -0.004945f, +0.003037f, -0.001303f, -0.001959f, +0.002636f, +0.002457f, + +0.003082f, -0.000111f, -0.004709f, +0.007658f, -0.000688f, -0.001999f + }, + { + +0.035528f, -0.186578f, +0.021208f, -0.005840f, +0.014614f, +0.040997f, +0.021507f, -0.011280f, +0.004791f, -0.017636f, + +0.003644f, +0.020401f, -0.012151f, -0.021214f, -0.041234f, -0.005772f, -0.041467f, +0.020464f, +0.014660f, +0.006031f, + +0.004853f, +0.001525f, +0.007679f, -0.002586f, +0.006788f, +0.001396f, -0.005754f, -0.003910f, +0.017896f, +0.014060f, + -0.020291f, -0.010213f, +0.007334f, -0.002387f, +0.004436f, +0.001628f, -0.002815f, +0.012335f, -0.005256f, +0.009821f, + +0.009049f, -0.004619f, +0.011166f, +0.004774f, +0.002434f, +0.002491f, +0.004101f, +0.001059f, -0.002390f, +0.007247f, + -0.013346f, -0.001811f, -0.007239f, -0.011007f, +0.007823f, -0.008596f, -0.004857f, +0.008528f, -0.006531f, -0.001181f, + -0.005473f, +0.006389f, -0.000277f, +0.006749f, +0.000030f, -0.001421f, -0.006480f, -0.004847f, -0.007302f, +0.007601f, + -0.004982f, +0.005522f, +0.003129f, +0.004346f, +0.005088f, -0.003207f, +0.000168f, -0.000054f, -0.003493f, +0.004040f, + -0.006207f, +0.001067f, -0.002040f, -0.000321f, +0.000927f, -0.000123f, +0.002847f, +0.002164f, -0.004520f, +0.004294f, + -0.000008f, +0.000040f, +0.001331f, +0.001588f, +0.001598f, -0.001028f + }, + { + -0.009274f, -0.087405f, +0.007445f, -0.004927f, -0.016637f, -0.030685f, -0.016547f, +0.010273f, +0.000745f, +0.002972f, + -0.022761f, +0.015984f, +0.007294f, -0.032680f, +0.230276f, +0.013263f, +0.010221f, +0.002001f, +0.050952f, -0.061191f, + +0.009270f, +0.021244f, -0.026799f, +0.016260f, +0.026646f, -0.021649f, -0.002767f, +0.006393f, -0.011636f, +0.025596f, + +0.013734f, +0.015173f, -0.010683f, -0.000520f, +0.012529f, -0.016997f, -0.004687f, -0.017007f, +0.020686f, +0.017751f, + -0.004185f, +0.003346f, -0.000705f, +0.003310f, -0.004700f, +0.013845f, -0.004387f, -0.011355f, -0.004030f, +0.000806f, + +0.004209f, +0.013807f, -0.003321f, -0.000074f, +0.005311f, +0.001019f, +0.006476f, -0.002477f, -0.001456f, -0.000879f, + +0.003523f, -0.000391f, -0.000607f, +0.005479f, +0.002193f, +0.003407f, -0.012276f, -0.003689f, -0.000782f, +0.003162f, + -0.003025f, -0.001866f, -0.005379f, -0.003397f, +0.003268f, +0.000149f, +0.005159f, -0.001304f, +0.010848f, +0.002445f, + -0.002962f, -0.000212f, -0.003163f, -0.000879f, -0.000481f, +0.005989f, -0.000158f, -0.003625f, +0.004651f, +0.000581f, + -0.004700f, -0.001610f, +0.003161f, +0.000977f, -0.000199f, -0.000711f + }, + { + +0.049435f, -0.029715f, -0.014712f, +0.018215f, -0.001772f, +0.031982f, -0.018646f, -0.031479f, -0.021131f, -0.006104f, + -0.013476f, -0.033008f, -0.012680f, +0.022995f, -0.053321f, -0.028182f, +0.026986f, +0.024404f, -0.006021f, +0.007970f, + +0.009943f, +0.026914f, +0.010782f, +0.015692f, +0.005831f, +0.011128f, +0.012020f, -0.029857f, +0.017391f, -0.007415f, + -0.021830f, -0.022042f, -0.000370f, -0.011154f, +0.002154f, +0.006953f, +0.008040f, -0.009230f, +0.001287f, +0.016360f, + -0.012204f, -0.015544f, +0.007906f, +0.001968f, +0.009811f, +0.019419f, -0.002883f, +0.003325f, -0.000636f, +0.003641f, + +0.003766f, +0.013657f, -0.002754f, +0.010900f, -0.008563f, +0.001976f, +0.001637f, +0.000852f, +0.011042f, +0.005083f, + -0.001334f, -0.001225f, +0.011854f, +0.001273f, +0.008487f, +0.009329f, +0.008856f, -0.000752f, -0.007075f, -0.002427f, + +0.005919f, -0.003072f, +0.001053f, +0.002147f, -0.005061f, +0.000882f, +0.001154f, +0.002445f, +0.000325f, +0.001017f, + -0.000723f, -0.000384f, +0.004053f, +0.000213f, +0.000688f, -0.000629f, -0.002235f, +0.003841f, -0.000041f, -0.001678f, + +0.001958f, +0.002785f, -0.002179f, -0.000577f, +0.000803f, -0.001100f + } + }, + { + { + -0.001188f, +0.075567f, +0.030522f, -0.033787f, -0.003297f, +0.006425f, +0.002783f, -0.005801f, +0.006994f, -0.055871f, + -0.038536f, +0.002365f, +0.020770f, -0.038378f, -0.013552f, +0.019572f, -0.010368f, -0.019650f, +0.045569f, +0.023669f, + +0.012024f, +0.001861f, +0.032027f, -0.006239f, -0.000838f, +0.018049f, -0.010456f, -0.003168f, -0.020462f, +0.008556f, + +0.011507f, -0.018740f, +0.008867f, -0.030431f, +0.013310f, +0.026174f, +0.035852f, -0.010530f, -0.001597f, +0.004768f, + -0.000578f, -0.001938f, +0.001634f, -0.007221f, +0.014984f, +0.010248f, +0.006205f, -0.008070f, -0.016146f, +0.004614f, + +0.002780f, -0.006113f, +0.002246f, -0.003233f, +0.008071f, +0.006050f, -0.007311f, +0.002562f, -0.008389f, +0.009022f, + +0.003948f, -0.003562f, +0.003736f, -0.003075f, -0.007552f, -0.005895f, -0.004644f, -0.005705f, -0.004414f, +0.010993f, + -0.000242f, -0.008889f, -0.002873f, -0.004221f, -0.006384f, +0.000854f, -0.002942f, +0.002222f, -0.001045f, -0.003423f, + +0.004275f, -0.000876f, -0.000639f, +0.003124f, +0.003912f, +0.000682f, -0.001851f, -0.000917f, -0.001289f, +0.000246f, + -0.002995f, +0.001601f, +0.001742f, +0.000532f, +0.000003f, -0.001120f + }, + { + +0.047273f, -0.302853f, -0.062975f, -0.069689f, +0.035890f, -0.008904f, -0.003214f, -0.002567f, -0.002846f, -0.022879f, + +0.035799f, -0.036129f, +0.019625f, -0.002549f, -0.023038f, -0.031111f, +0.003356f, +0.008892f, +0.015866f, -0.004085f, + -0.000913f, -0.021070f, +0.000001f, -0.002953f, +0.009518f, -0.013305f, -0.013892f, -0.011457f, +0.013592f, +0.006849f, + +0.006863f, -0.008894f, +0.013620f, -0.004628f, +0.006974f, -0.022609f, -0.014394f, -0.016037f, +0.008539f, +0.003414f, + -0.003399f, +0.018457f, +0.007115f, +0.011274f, +0.002411f, +0.011484f, -0.010414f, -0.006866f, -0.016056f, -0.012763f, + +0.008333f, +0.011228f, +0.005210f, +0.008103f, -0.007524f, -0.003231f, -0.000854f, -0.003656f, -0.000162f, +0.000045f, + -0.004872f, +0.010104f, -0.006449f, -0.003437f, +0.000952f, -0.001031f, -0.007015f, +0.000899f, +0.002584f, +0.004178f, + -0.003640f, -0.000101f, -0.003795f, -0.004869f, +0.000042f, -0.000311f, +0.000542f, -0.000345f, -0.000064f, +0.000203f, + +0.001738f, -0.000060f, -0.000363f, +0.003665f, +0.003783f, +0.001553f, +0.002712f, +0.001006f, -0.000093f, -0.001420f, + -0.000785f, -0.000604f, -0.000448f, +0.003136f, -0.001404f, +0.000086f + }, + { + +0.006492f, +0.220010f, -0.052932f, +0.042052f, -0.001894f, +0.003878f, -0.000838f, +0.017339f, +0.020772f, -0.024373f, + +0.014916f, +0.032375f, -0.023135f, +0.025180f, +0.037694f, +0.007309f, +0.023133f, -0.018667f, -0.014719f, +0.003750f, + -0.022339f, -0.020055f, +0.018512f, +0.016548f, -0.003364f, -0.023122f, +0.003359f, -0.004185f, +0.015681f, +0.006759f, + +0.002958f, +0.000862f, +0.004084f, -0.022978f, -0.007267f, +0.009698f, -0.001401f, -0.001346f, +0.010879f, +0.003041f, + +0.012391f, +0.009499f, -0.003279f, -0.007021f, -0.003397f, +0.000627f, -0.004830f, +0.001985f, -0.000926f, +0.003328f, + +0.010077f, +0.005648f, +0.008501f, -0.008719f, +0.006074f, +0.000398f, +0.005734f, -0.001893f, +0.010114f, +0.003108f, + -0.005938f, +0.000102f, +0.001078f, -0.000131f, +0.005771f, +0.003967f, -0.005054f, +0.004183f, -0.004967f, -0.002719f, + -0.003932f, +0.001323f, +0.002921f, +0.000114f, +0.001972f, +0.000417f, +0.004313f, +0.001277f, +0.000075f, +0.001204f, + +0.000841f, +0.000016f, +0.001050f, +0.003459f, -0.000086f, -0.003313f, +0.001847f, +0.000742f, +0.000123f, -0.000489f, + +0.001115f, -0.001147f, -0.000519f, +0.002098f, +0.000163f, -0.001700f + }, + { + +0.003288f, +0.031285f, -0.008272f, +0.011005f, -0.005846f, +0.002487f, +0.000378f, +0.001079f, -0.005353f, +0.001164f, + -0.007240f, +0.013235f, -0.010739f, -0.009656f, +0.000403f, -0.000915f, +0.022398f, -0.005088f, +0.032413f, +0.012383f, + +0.020541f, -0.018235f, -0.015868f, +0.017039f, -0.006759f, -0.014424f, -0.025155f, +0.003028f, -0.003070f, -0.016974f, + -0.028273f, -0.014875f, -0.005630f, -0.018021f, -0.006065f, +0.003958f, +0.028323f, -0.021470f, -0.000484f, +0.002947f, + +0.004624f, -0.008732f, -0.015071f, +0.003492f, +0.001616f, -0.012633f, +0.002292f, -0.002396f, -0.002067f, -0.004640f, + +0.006189f, -0.003564f, +0.012179f, +0.000212f, -0.008722f, -0.002150f, +0.000543f, +0.004505f, +0.001825f, +0.002291f, + +0.005190f, +0.004852f, +0.002499f, +0.001294f, -0.002309f, +0.003616f, +0.007879f, +0.002063f, -0.003753f, +0.002262f, + +0.000419f, -0.002142f, -0.000297f, -0.004922f, +0.003501f, -0.000549f, -0.000012f, -0.000344f, +0.001123f, +0.001745f, + +0.000759f, -0.000784f, +0.003898f, -0.001976f, +0.000155f, -0.001171f, +0.001026f, -0.000673f, -0.000991f, +0.002531f, + -0.000497f, +0.001316f, +0.000166f, -0.001761f, +0.001746f, -0.003649f + }, + { + -0.069636f, +0.148031f, +0.016928f, -0.093360f, +0.007801f, +0.005570f, -0.002595f, -0.011229f, +0.009271f, -0.046935f, + +0.000433f, +0.010414f, +0.022801f, -0.007976f, -0.022657f, +0.007579f, +0.010636f, -0.045615f, +0.008638f, +0.015342f, + -0.025517f, +0.015134f, -0.026616f, -0.007635f, -0.015104f, -0.015353f, +0.012577f, +0.024273f, -0.005670f, -0.010000f, + +0.009923f, -0.004269f, -0.003125f, -0.012271f, -0.001125f, +0.004832f, -0.047624f, -0.017360f, +0.008647f, -0.014790f, + +0.010932f, +0.004623f, +0.021647f, -0.005928f, -0.001109f, +0.002352f, -0.007578f, +0.005040f, -0.004229f, +0.011551f, + +0.003249f, -0.005270f, +0.006451f, +0.006394f, +0.011606f, -0.003630f, +0.003182f, -0.005167f, +0.009042f, -0.005515f, + +0.003396f, -0.002903f, +0.002079f, +0.005161f, -0.002972f, +0.002625f, -0.006226f, -0.002909f, -0.000054f, -0.006262f, + +0.001077f, +0.000197f, -0.001567f, +0.002024f, -0.004916f, +0.001433f, +0.003911f, +0.003345f, -0.002105f, -0.000103f, + -0.002206f, +0.000519f, +0.000936f, -0.000543f, -0.002795f, -0.000630f, -0.000144f, +0.000714f, -0.000187f, +0.000076f, + -0.000414f, -0.000298f, -0.001437f, -0.000440f, -0.001795f, +0.001186f + }, + { + -0.000340f, -0.007689f, +0.001326f, -0.002610f, -0.005163f, -0.000194f, -0.000761f, +0.001089f, +0.011373f, +0.003229f, + -0.005997f, -0.009720f, +0.002914f, -0.003410f, -0.073008f, +0.012474f, -0.033900f, -0.000770f, -0.028449f, +0.065761f, + -0.002036f, +0.013700f, +0.004538f, +0.021634f, -0.031732f, -0.028442f, -0.023113f, -0.032172f, -0.022449f, +0.001095f, + -0.006301f, +0.006364f, +0.011070f, +0.015852f, +0.000755f, -0.000958f, -0.008895f, +0.004817f, +0.018428f, +0.002715f, + -0.001436f, -0.001259f, -0.001222f, +0.000381f, +0.006532f, -0.006886f, +0.010042f, -0.013687f, -0.002199f, +0.000153f, + +0.000025f, -0.000348f, +0.012562f, +0.000980f, -0.001043f, -0.004270f, -0.001715f, -0.000527f, -0.011406f, -0.002018f, + +0.004180f, +0.003848f, +0.001110f, -0.003480f, +0.000240f, -0.003169f, +0.002445f, -0.002104f, -0.003424f, +0.004618f, + +0.000128f, -0.000098f, +0.001216f, -0.000749f, -0.002230f, -0.000287f, +0.002177f, -0.001423f, +0.000060f, -0.002355f, + +0.000217f, +0.000667f, +0.004645f, -0.000137f, +0.002326f, +0.001857f, +0.002525f, -0.003474f, -0.000084f, +0.000295f, + -0.000123f, +0.000211f, -0.000197f, +0.001804f, +0.000893f, +0.000354f + }, + { + -0.119996f, +0.037900f, +0.033136f, -0.064969f, -0.014857f, -0.002205f, -0.003923f, +0.002424f, +0.013158f, -0.019328f, + -0.002359f, +0.055457f, +0.028544f, +0.015508f, -0.029808f, -0.015042f, +0.030251f, +0.008838f, +0.032504f, +0.008801f, + +0.005376f, -0.017867f, +0.004946f, -0.013414f, +0.025062f, -0.007594f, -0.012543f, -0.014568f, +0.016027f, +0.002651f, + -0.005698f, +0.012551f, -0.000681f, -0.015763f, +0.006383f, +0.002045f, +0.005930f, +0.001002f, +0.002721f, -0.005483f, + +0.004541f, +0.005180f, +0.006768f, -0.001114f, +0.015727f, -0.002001f, -0.000990f, -0.005191f, -0.000510f, +0.000492f, + +0.015383f, +0.004247f, +0.009169f, +0.001535f, +0.003031f, +0.002732f, +0.008214f, +0.003913f, -0.009254f, +0.000578f, + -0.000642f, -0.004219f, +0.001914f, -0.003745f, -0.001183f, -0.002744f, -0.001023f, +0.003336f, +0.000090f, -0.000992f, + +0.000141f, +0.001356f, -0.000048f, -0.000555f, +0.001251f, -0.008580f, -0.004578f, +0.000736f, -0.001767f, -0.002409f, + -0.000086f, +0.000424f, +0.000249f, -0.001496f, -0.002346f, -0.001026f, +0.001668f, +0.002288f, +0.003269f, +0.002499f, + +0.000388f, +0.001925f, +0.003285f, -0.001590f, +0.000032f, -0.000822f + }, + { + -0.001143f, -0.012226f, -0.004643f, -0.005751f, +0.000082f, +0.003342f, +0.000509f, +0.011522f, +0.005058f, -0.001379f, + +0.002294f, -0.006784f, -0.014374f, +0.013108f, -0.022786f, +0.007203f, +0.005728f, +0.014916f, +0.031267f, +0.033327f, + -0.003643f, +0.039339f, +0.028327f, -0.026063f, -0.043516f, +0.002659f, -0.020494f, -0.024119f, +0.053806f, +0.014183f, + -0.020996f, +0.009292f, -0.019679f, +0.031074f, +0.013591f, -0.013628f, -0.002287f, +0.016962f, +0.004891f, -0.011639f, + +0.007921f, +0.012662f, -0.004889f, +0.004835f, -0.006279f, -0.011411f, -0.002270f, +0.000605f, -0.000628f, -0.007003f, + -0.001203f, -0.002799f, -0.000664f, -0.010327f, -0.004109f, -0.002694f, +0.005576f, +0.008112f, +0.012515f, -0.002028f, + +0.005101f, -0.004791f, +0.006706f, +0.003391f, +0.000680f, +0.003331f, +0.004016f, -0.007554f, +0.003225f, +0.009572f, + +0.002282f, +0.001410f, +0.008664f, +0.003452f, +0.000444f, -0.000879f, -0.000414f, +0.003190f, +0.003799f, -0.002740f, + -0.000560f, -0.005095f, +0.002561f, +0.001483f, +0.000368f, -0.000645f, -0.002736f, -0.000269f, +0.000263f, +0.001918f, + +0.003127f, -0.002683f, +0.001822f, -0.000775f, -0.001910f, +0.000580f + }, + { + -0.046664f, +0.693915f, +0.040999f, -0.082664f, -0.010479f, -0.006600f, +0.017312f, -0.023838f, -0.005674f, +0.000708f, + +0.001006f, +0.009368f, +0.030186f, +0.023223f, +0.012801f, -0.017088f, +0.028933f, +0.000698f, +0.023466f, -0.013269f, + -0.002578f, +0.007055f, -0.001608f, +0.006562f, +0.001539f, +0.004404f, -0.001521f, +0.012321f, -0.015801f, +0.004588f, + +0.007732f, +0.009641f, -0.000747f, +0.001376f, +0.011661f, -0.002926f, +0.001006f, +0.008091f, +0.006644f, +0.006815f, + -0.007474f, +0.009582f, +0.012037f, +0.001060f, +0.001463f, -0.013710f, -0.006343f, +0.005115f, -0.000802f, +0.005776f, + -0.003535f, +0.009432f, -0.004336f, -0.001691f, -0.003902f, +0.004522f, -0.009195f, +0.002772f, +0.000744f, -0.007274f, + +0.001228f, -0.006543f, +0.005911f, +0.006803f, -0.008240f, -0.001472f, -0.004731f, +0.001349f, -0.000604f, -0.004550f, + +0.001281f, +0.001678f, -0.005195f, +0.002581f, +0.000899f, -0.000842f, -0.003334f, +0.002313f, +0.000385f, +0.000838f, + -0.001038f, -0.000381f, -0.002284f, +0.001353f, +0.001639f, +0.000715f, +0.001780f, +0.002928f, +0.001218f, +0.000375f, + +0.001119f, +0.000181f, -0.000462f, +0.000912f, -0.002765f, +0.002533f + }, + { + -0.006238f, +0.080201f, +0.013587f, -0.028706f, -0.001900f, -0.004732f, +0.017630f, +0.003256f, +0.008679f, +0.002865f, + +0.020862f, -0.009619f, -0.011125f, -0.038291f, +0.008298f, +0.001125f, -0.017094f, -0.011014f, +0.010730f, -0.001407f, + -0.031360f, +0.006285f, -0.016836f, +0.024634f, +0.016789f, -0.008891f, -0.001595f, +0.018508f, +0.024961f, -0.018645f, + +0.004691f, -0.002008f, +0.029550f, -0.011790f, +0.011041f, +0.002612f, +0.006801f, +0.008702f, +0.015044f, +0.012259f, + -0.000410f, -0.000207f, -0.001991f, +0.010137f, +0.016855f, +0.011433f, -0.005045f, +0.005453f, -0.004908f, +0.011055f, + +0.010953f, +0.003544f, +0.000046f, +0.006041f, +0.001784f, -0.002729f, -0.003502f, +0.002129f, +0.006952f, +0.004108f, + +0.012828f, -0.001324f, +0.000111f, -0.004828f, +0.002520f, +0.001249f, +0.000158f, +0.000918f, +0.006748f, -0.002604f, + +0.004094f, +0.003137f, +0.001803f, -0.002376f, -0.000415f, -0.002249f, -0.002080f, +0.000301f, +0.006782f, +0.001601f, + -0.004973f, -0.005589f, -0.002143f, +0.002290f, -0.001465f, -0.000778f, -0.000612f, -0.001207f, +0.001369f, -0.002593f, + +0.004465f, -0.000039f, +0.000439f, -0.000618f, -0.000929f, +0.000316f + }, + { + -0.061968f, -0.220343f, +0.004219f, +0.004002f, +0.002350f, -0.036013f, +0.029520f, +0.023684f, +0.006681f, +0.014196f, + -0.008956f, +0.009329f, +0.008169f, -0.019496f, -0.020923f, -0.008292f, -0.009487f, +0.004690f, -0.040812f, +0.008117f, + -0.004920f, +0.009499f, -0.004405f, -0.004643f, +0.008442f, -0.004150f, -0.000520f, -0.022692f, -0.015750f, +0.003951f, + +0.015957f, +0.021838f, +0.001522f, -0.003678f, +0.013578f, -0.001840f, -0.004456f, +0.009509f, +0.015416f, +0.013825f, + -0.003580f, +0.006976f, +0.002711f, -0.008189f, -0.002987f, -0.020883f, +0.012310f, -0.012009f, +0.000187f, -0.000173f, + +0.005740f, -0.005871f, +0.006372f, +0.008089f, +0.011154f, -0.011002f, -0.000678f, -0.002603f, +0.003757f, -0.001414f, + -0.002995f, +0.002478f, +0.000474f, +0.014277f, +0.001461f, +0.000964f, -0.001404f, +0.002138f, -0.003725f, +0.004483f, + -0.001063f, -0.003019f, +0.000964f, +0.001354f, +0.000353f, +0.000914f, +0.003654f, +0.001796f, +0.000989f, +0.000760f, + -0.004240f, +0.001086f, +0.000970f, -0.000623f, +0.000638f, +0.000578f, -0.000278f, -0.000275f, +0.002239f, +0.000930f, + +0.000655f, -0.000425f, -0.001077f, -0.001796f, -0.002249f, -0.000188f + }, + { + +0.002303f, +0.105350f, -0.003020f, +0.003445f, -0.003998f, +0.006918f, -0.007840f, +0.001159f, +0.010661f, -0.008160f, + +0.011962f, -0.003909f, +0.034684f, -0.017192f, +0.027229f, +0.021421f, -0.018700f, -0.002646f, -0.021127f, +0.031589f, + -0.017737f, -0.021806f, -0.019504f, -0.014615f, +0.004200f, -0.007213f, -0.003904f, +0.015999f, +0.013099f, -0.026416f, + +0.005560f, -0.015709f, +0.000462f, -0.018592f, +0.000833f, -0.017485f, -0.024311f, -0.008087f, +0.017881f, -0.007528f, + +0.000935f, -0.008781f, +0.011339f, -0.000507f, +0.003398f, -0.007619f, +0.001224f, -0.010923f, +0.002984f, +0.010780f, + +0.014491f, -0.002864f, +0.006496f, -0.003330f, -0.000799f, -0.008987f, -0.007956f, -0.002136f, -0.009498f, +0.003304f, + +0.008711f, -0.000558f, -0.005166f, +0.008706f, -0.007947f, -0.010845f, +0.002743f, -0.002513f, +0.001736f, +0.006674f, + -0.006825f, -0.003192f, -0.004068f, -0.007293f, +0.001903f, +0.007267f, -0.000342f, +0.003224f, +0.004001f, +0.001441f, + -0.001119f, +0.000671f, -0.004627f, +0.007374f, -0.002152f, +0.003318f, -0.001749f, -0.003862f, +0.001021f, +0.000285f, + -0.000487f, -0.000543f, -0.004953f, +0.003740f, -0.002304f, +0.000422f + }, + { + +0.009114f, -0.226441f, +0.026045f, -0.010244f, -0.002671f, +0.013474f, +0.002503f, -0.017852f, -0.016160f, -0.051039f, + +0.014409f, +0.032219f, -0.007331f, -0.032789f, -0.025307f, +0.026623f, -0.049113f, +0.005394f, -0.000817f, -0.012521f, + -0.009917f, -0.008656f, +0.021656f, -0.009171f, -0.013411f, -0.003866f, +0.010736f, +0.026520f, +0.018811f, -0.002490f, + -0.017679f, -0.003072f, +0.011560f, +0.002281f, +0.030431f, +0.022117f, +0.008153f, +0.010429f, -0.010482f, +0.024821f, + +0.023584f, +0.001507f, -0.001396f, -0.001113f, +0.000718f, +0.004785f, -0.004906f, -0.004242f, -0.005748f, +0.005165f, + -0.009208f, +0.007967f, -0.002793f, -0.012871f, +0.016304f, -0.003905f, -0.000982f, +0.017133f, +0.000168f, +0.008615f, + +0.000294f, +0.006409f, -0.001314f, +0.006667f, +0.000750f, -0.000745f, -0.001544f, +0.003274f, -0.002389f, +0.009576f, + -0.004816f, -0.000323f, -0.005097f, -0.002492f, +0.002071f, +0.001422f, +0.002439f, -0.002097f, -0.005834f, +0.003702f, + -0.006152f, -0.000142f, -0.001530f, -0.003049f, +0.001821f, +0.000793f, +0.000473f, +0.003831f, -0.001384f, +0.002361f, + +0.000030f, +0.002582f, -0.000379f, -0.001003f, +0.002170f, -0.000680f + }, + { + +0.007955f, -0.087025f, -0.010159f, +0.011287f, +0.008772f, -0.000693f, +0.001089f, +0.019768f, +0.024360f, +0.004867f, + -0.030829f, +0.010743f, +0.001315f, -0.054520f, +0.188336f, +0.012390f, +0.020471f, -0.002083f, +0.064372f, -0.066724f, + -0.004083f, +0.038787f, -0.012780f, +0.017455f, +0.029122f, -0.019346f, +0.010504f, +0.000484f, -0.027382f, +0.011953f, + +0.008982f, +0.005277f, -0.018512f, -0.013083f, +0.010220f, -0.017443f, +0.003557f, -0.013547f, -0.000259f, -0.009617f, + -0.009078f, +0.008776f, -0.006425f, +0.005980f, -0.005519f, +0.006012f, +0.000213f, +0.001447f, -0.003229f, -0.008353f, + +0.002086f, +0.009298f, -0.005550f, -0.005329f, -0.000876f, -0.005311f, +0.000918f, +0.002812f, +0.005866f, -0.000596f, + +0.000914f, +0.003481f, +0.001709f, -0.003844f, -0.000503f, +0.005309f, -0.013918f, +0.000240f, +0.005984f, +0.005363f, + -0.003731f, -0.005663f, -0.005625f, +0.001408f, +0.002465f, -0.002579f, +0.000591f, -0.010909f, +0.003148f, +0.001596f, + +0.000806f, +0.007035f, -0.000514f, -0.003026f, -0.001286f, +0.002857f, -0.002430f, -0.003939f, +0.001958f, +0.002656f, + -0.001058f, -0.002478f, -0.001250f, -0.002074f, -0.000008f, +0.001806f + }, + { + -0.036207f, -0.139168f, -0.021421f, +0.037524f, +0.000989f, +0.002617f, -0.016736f, -0.007470f, +0.001101f, -0.001288f, + +0.007484f, +0.009003f, +0.009959f, -0.031076f, -0.103883f, -0.000236f, +0.012184f, +0.003056f, -0.014790f, -0.015584f, + -0.021990f, +0.000553f, -0.001383f, +0.010369f, -0.006381f, -0.014346f, -0.003700f, -0.030551f, +0.037881f, +0.003119f, + -0.014725f, -0.010099f, +0.001423f, -0.030011f, +0.003997f, +0.016985f, +0.013099f, +0.003003f, +0.000439f, +0.014147f, + +0.009284f, -0.014370f, -0.006054f, -0.003515f, -0.006748f, +0.002279f, -0.009662f, +0.013840f, +0.013762f, +0.003391f, + -0.004019f, +0.015210f, -0.004647f, +0.009686f, -0.010618f, -0.001683f, -0.004041f, -0.008098f, +0.002657f, +0.002973f, + -0.006103f, -0.004377f, +0.003244f, -0.007776f, +0.007454f, +0.002272f, +0.002488f, +0.001822f, -0.007903f, -0.007600f, + +0.009224f, +0.002953f, -0.003242f, -0.006892f, -0.003395f, -0.002605f, -0.002088f, +0.003537f, -0.002010f, +0.002579f, + +0.000768f, -0.004863f, +0.001267f, -0.000126f, +0.001808f, +0.000635f, -0.001648f, +0.003214f, +0.001973f, +0.001674f, + +0.001567f, +0.002794f, -0.003269f, -0.003035f, +0.002392f, +0.000229f + } + }, + { + { + +0.002433f, +0.121055f, -0.013473f, -0.020738f, -0.002822f, +0.001202f, +0.007197f, -0.015797f, -0.002046f, -0.034778f, + -0.033457f, +0.015150f, +0.007008f, -0.037585f, -0.001702f, -0.000168f, -0.003493f, -0.021894f, +0.045062f, -0.006114f, + +0.041928f, +0.030791f, +0.016052f, -0.014826f, -0.004629f, +0.033317f, -0.015254f, +0.000474f, -0.013842f, -0.008272f, + -0.008880f, +0.010426f, -0.000533f, -0.019481f, +0.004940f, +0.030173f, +0.019560f, -0.008106f, +0.008431f, +0.007132f, + +0.001894f, -0.006558f, -0.002160f, -0.002678f, +0.026077f, +0.008484f, +0.002675f, -0.009089f, -0.005517f, -0.001622f, + +0.002529f, -0.001157f, -0.011107f, +0.008386f, +0.004087f, -0.000439f, -0.006121f, +0.004854f, +0.001255f, -0.000158f, + +0.003950f, +0.002739f, -0.003363f, -0.004312f, -0.005418f, -0.000370f, -0.010406f, -0.004184f, -0.002250f, +0.002252f, + +0.002684f, -0.006001f, -0.001954f, -0.005167f, -0.003587f, -0.002153f, -0.001455f, -0.000467f, +0.004630f, -0.005992f, + +0.002167f, +0.002464f, -0.000761f, +0.001531f, +0.004517f, -0.001846f, -0.001686f, +0.000335f, -0.002187f, -0.001267f, + -0.000776f, -0.000038f, +0.001811f, -0.001185f, -0.000493f, -0.000858f + }, + { + -0.045217f, -0.365939f, +0.064879f, -0.047686f, +0.006842f, +0.009902f, -0.021470f, -0.005967f, +0.005556f, +0.013736f, + -0.030353f, +0.010346f, -0.004541f, +0.005144f, -0.003895f, -0.077255f, +0.029512f, +0.021343f, -0.023697f, +0.025590f, + -0.010698f, +0.000764f, -0.025259f, +0.010439f, -0.017585f, +0.011941f, -0.012539f, -0.004251f, +0.007848f, +0.006093f, + -0.005206f, +0.006329f, -0.008845f, +0.010574f, +0.009072f, -0.022961f, -0.024019f, -0.014019f, +0.008762f, +0.015575f, + +0.003352f, +0.013520f, +0.000636f, +0.023022f, +0.000820f, -0.002172f, -0.004719f, -0.020394f, -0.003814f, -0.007610f, + -0.002651f, +0.014272f, +0.001068f, +0.005355f, +0.000218f, -0.000600f, -0.000948f, -0.004902f, -0.010101f, +0.000223f, + +0.002722f, +0.003530f, +0.001231f, -0.004817f, -0.000060f, -0.000742f, -0.005135f, -0.000995f, +0.008642f, -0.003262f, + -0.002448f, +0.000688f, -0.000179f, -0.006023f, -0.005305f, +0.005966f, -0.003777f, +0.001532f, +0.001061f, -0.000028f, + +0.002414f, +0.000266f, +0.000168f, +0.003218f, +0.001268f, +0.001405f, +0.004352f, +0.001768f, -0.000501f, -0.000468f, + -0.000909f, -0.002493f, +0.001364f, +0.001937f, -0.001938f, -0.000231f + }, + { + -0.009344f, +0.088853f, +0.069880f, +0.033132f, -0.001915f, +0.008470f, -0.006395f, +0.028728f, -0.003481f, +0.012660f, + +0.021804f, -0.002812f, -0.022060f, +0.027432f, +0.044472f, +0.015021f, +0.004914f, +0.002478f, -0.026164f, -0.019702f, + -0.007182f, -0.007975f, +0.003596f, +0.028146f, -0.017163f, +0.000450f, -0.015442f, +0.020636f, -0.001104f, +0.017478f, + -0.015870f, +0.016140f, -0.004308f, -0.025607f, -0.007350f, +0.006949f, -0.003047f, -0.001492f, +0.014912f, +0.002744f, + +0.016725f, +0.007264f, -0.009471f, +0.002276f, -0.008863f, -0.007450f, +0.014382f, -0.005188f, -0.003480f, +0.005652f, + +0.000107f, +0.013928f, +0.001569f, -0.000538f, -0.004053f, +0.004655f, +0.007122f, +0.001383f, -0.002596f, +0.006540f, + +0.000720f, -0.000428f, -0.001200f, +0.000555f, +0.008483f, +0.000096f, +0.001091f, -0.003849f, -0.001548f, -0.001563f, + -0.005145f, +0.000641f, +0.002834f, +0.002878f, -0.003243f, +0.003245f, +0.001011f, +0.004602f, -0.000887f, -0.000044f, + +0.000324f, -0.000754f, +0.001286f, +0.002115f, +0.001460f, -0.001754f, -0.000644f, +0.002686f, +0.001991f, -0.001815f, + +0.002432f, -0.002076f, -0.000466f, +0.001717f, -0.000531f, -0.000250f + }, + { + -0.003370f, +0.013786f, +0.008619f, +0.003520f, +0.001654f, +0.000470f, +0.001184f, -0.002847f, -0.003218f, -0.005858f, + -0.000729f, +0.001894f, +0.013829f, -0.028972f, -0.021816f, +0.021297f, +0.023444f, -0.005424f, +0.015097f, +0.004199f, + +0.022442f, -0.021545f, +0.000392f, -0.007632f, -0.010852f, -0.009131f, +0.009921f, -0.018244f, -0.006806f, -0.032562f, + -0.007471f, -0.004256f, -0.026905f, -0.001474f, -0.006495f, +0.015057f, -0.017137f, -0.015003f, +0.024047f, -0.000205f, + -0.007130f, +0.010542f, -0.021235f, +0.007773f, -0.011146f, -0.003874f, -0.008936f, +0.005935f, -0.001854f, -0.008313f, + -0.001512f, +0.006788f, +0.000471f, +0.004808f, -0.007677f, +0.000751f, -0.002537f, +0.005158f, +0.002522f, -0.002033f, + +0.006262f, +0.006388f, -0.000683f, +0.005049f, -0.000867f, +0.001065f, +0.009632f, +0.002616f, -0.003714f, +0.003539f, + +0.000271f, +0.000650f, -0.004480f, -0.001716f, +0.000304f, +0.001820f, +0.002346f, -0.004183f, +0.002359f, +0.001552f, + -0.000339f, +0.003378f, +0.001847f, -0.001962f, +0.000456f, -0.003272f, +0.003017f, -0.001210f, -0.001130f, +0.000978f, + +0.000243f, +0.001856f, +0.001193f, -0.000390f, +0.000128f, -0.002672f + }, + { + +0.096413f, -0.009619f, -0.037930f, -0.065215f, -0.002467f, +0.004987f, -0.013545f, +0.004606f, -0.007153f, -0.013424f, + -0.038605f, +0.028885f, +0.010692f, +0.019035f, -0.003134f, -0.022522f, +0.006030f, -0.031629f, -0.009836f, +0.002995f, + +0.004538f, -0.017715f, +0.008901f, -0.034184f, +0.012831f, -0.017914f, -0.006300f, +0.005298f, +0.008581f, -0.002929f, + +0.012496f, -0.008620f, -0.005299f, -0.007461f, +0.001978f, -0.009953f, -0.059683f, +0.005154f, +0.010456f, -0.032611f, + +0.030136f, -0.006656f, +0.028542f, -0.015816f, +0.004379f, -0.003217f, -0.005237f, +0.000454f, +0.001635f, +0.013341f, + +0.001186f, +0.006959f, +0.002256f, +0.001496f, +0.010410f, -0.006819f, +0.003527f, -0.000804f, +0.005361f, +0.003979f, + -0.004076f, -0.003324f, +0.001457f, +0.002139f, +0.006155f, -0.000467f, -0.005195f, -0.003384f, -0.001762f, -0.002084f, + +0.003309f, -0.002998f, -0.001651f, +0.001883f, -0.002350f, -0.001616f, +0.004086f, -0.001972f, +0.002625f, +0.000914f, + -0.001750f, +0.001001f, -0.000175f, -0.001285f, -0.002023f, -0.001541f, +0.003042f, -0.000334f, -0.001232f, +0.000738f, + +0.000552f, -0.000331f, -0.001975f, -0.001637f, +0.000841f, -0.000765f + }, + { + -0.002893f, +0.002103f, -0.003478f, +0.002068f, -0.007656f, +0.000960f, -0.000023f, +0.000290f, +0.005477f, +0.002166f, + +0.002086f, -0.018356f, +0.005618f, -0.022756f, -0.058210f, +0.011766f, -0.024590f, -0.006755f, -0.012084f, +0.050871f, + -0.001486f, -0.014704f, +0.015350f, +0.012929f, -0.031723f, -0.031321f, -0.003466f, -0.038229f, -0.015214f, -0.027132f, + -0.012781f, +0.016965f, +0.020643f, +0.023409f, -0.003575f, +0.010686f, -0.010597f, -0.008470f, +0.007613f, +0.009043f, + +0.007561f, -0.008351f, -0.006234f, +0.001234f, +0.001596f, +0.000783f, -0.005729f, +0.004186f, +0.003848f, -0.002199f, + -0.002800f, +0.004656f, -0.004014f, +0.003315f, +0.000664f, -0.002241f, -0.004472f, -0.005009f, -0.004494f, -0.001530f, + +0.002008f, -0.001505f, +0.002028f, -0.002023f, -0.000100f, -0.002504f, +0.000398f, +0.003234f, -0.005852f, -0.001031f, + +0.010072f, -0.002002f, -0.002128f, +0.001093f, +0.000851f, -0.003232f, +0.001372f, -0.002237f, -0.000824f, -0.002863f, + +0.001726f, +0.002052f, +0.002841f, +0.001675f, +0.001977f, +0.003294f, -0.000247f, -0.002262f, +0.000961f, +0.000997f, + -0.000366f, -0.002045f, +0.001935f, +0.000357f, +0.001030f, -0.000582f + }, + { + +0.139701f, -0.219260f, -0.052228f, -0.047600f, -0.001152f, -0.009719f, +0.010814f, +0.010890f, -0.029710f, +0.008872f, + -0.012711f, +0.072025f, +0.008137f, +0.021507f, -0.031317f, +0.000475f, +0.009456f, +0.033552f, +0.004637f, +0.021765f, + -0.005172f, -0.022276f, +0.023784f, -0.001378f, +0.007954f, -0.006385f, -0.003079f, -0.018505f, +0.021806f, -0.019627f, + +0.001661f, +0.021690f, -0.007367f, -0.002292f, +0.010823f, +0.002196f, -0.005673f, +0.007359f, +0.003718f, -0.005849f, + +0.004234f, +0.004597f, +0.005638f, +0.002281f, +0.011111f, +0.007285f, -0.021032f, +0.010238f, -0.002670f, -0.003245f, + +0.008344f, +0.009519f, +0.008941f, -0.002534f, +0.006270f, +0.006845f, +0.000878f, +0.005813f, -0.002156f, -0.004585f, + -0.000867f, -0.009430f, +0.010829f, -0.006015f, +0.002353f, -0.000431f, +0.002441f, -0.003822f, +0.001100f, +0.003059f, + -0.000562f, -0.000387f, +0.001353f, -0.000901f, +0.000352f, -0.007968f, -0.001202f, -0.001766f, -0.001589f, -0.003799f, + -0.000299f, -0.001830f, +0.002706f, -0.002378f, -0.005119f, +0.001279f, +0.003890f, +0.002553f, +0.001032f, +0.002273f, + +0.002106f, +0.000736f, +0.002695f, -0.003977f, +0.000915f, -0.000347f + }, + { + -0.002675f, +0.002002f, -0.006820f, -0.006356f, -0.003494f, +0.002467f, +0.003960f, -0.002728f, +0.024194f, -0.004657f, + -0.005451f, +0.004792f, -0.018441f, +0.028766f, -0.046597f, +0.011334f, +0.006117f, +0.033409f, +0.029735f, +0.015435f, + +0.007860f, +0.052319f, +0.011196f, -0.033841f, -0.025540f, -0.020793f, -0.010931f, +0.009051f, +0.032844f, +0.009436f, + +0.015069f, -0.014267f, -0.015512f, +0.029578f, +0.005075f, +0.005895f, +0.000194f, +0.012138f, +0.007683f, -0.003801f, + -0.001344f, +0.001596f, +0.006214f, -0.001032f, +0.001956f, -0.013978f, +0.003448f, -0.011334f, -0.012845f, +0.000852f, + +0.002764f, -0.002133f, -0.011455f, +0.002215f, -0.010707f, +0.005607f, +0.005840f, +0.007024f, +0.009579f, +0.004436f, + -0.003582f, +0.004573f, +0.001902f, -0.001811f, +0.001938f, +0.002704f, +0.000978f, -0.004473f, +0.006210f, +0.007191f, + +0.001178f, +0.004309f, +0.004890f, +0.004305f, +0.001047f, -0.000594f, +0.000080f, +0.003671f, +0.001212f, +0.000928f, + -0.001138f, -0.002137f, +0.001617f, -0.000197f, +0.000374f, -0.001463f, +0.000237f, -0.002541f, +0.002690f, +0.003089f, + -0.000818f, -0.001501f, +0.001066f, -0.002535f, -0.001180f, +0.002449f + }, + { + +0.099595f, +0.608834f, -0.071879f, -0.041209f, -0.016350f, +0.000057f, -0.007132f, -0.014202f, -0.001579f, -0.007666f, + +0.004429f, -0.000809f, +0.022626f, +0.009801f, +0.019326f, +0.007777f, +0.026811f, -0.016541f, +0.023288f, -0.011772f, + -0.006793f, +0.015341f, +0.009513f, +0.006736f, +0.004218f, +0.001180f, -0.003029f, -0.003342f, -0.003045f, -0.006237f, + +0.023581f, +0.008044f, -0.011374f, +0.005754f, +0.010640f, -0.001843f, -0.007581f, +0.009955f, +0.016258f, +0.003549f, + -0.000348f, -0.002658f, +0.008221f, +0.007825f, -0.011497f, -0.003657f, +0.000708f, -0.004953f, -0.008128f, +0.006676f, + +0.015328f, -0.005956f, -0.001554f, -0.002525f, -0.005925f, -0.003981f, -0.001887f, +0.002820f, -0.003340f, -0.001147f, + +0.000590f, -0.004525f, -0.001423f, +0.005724f, -0.009830f, -0.000336f, +0.001064f, -0.005075f, +0.000359f, -0.000137f, + +0.001133f, -0.000824f, -0.003104f, +0.000674f, +0.002489f, -0.006319f, +0.001231f, +0.004196f, -0.000530f, +0.001512f, + -0.003631f, +0.000277f, -0.001648f, +0.000598f, -0.000710f, +0.002167f, +0.003004f, +0.002341f, +0.001634f, -0.001934f, + +0.001623f, +0.000250f, -0.000970f, -0.001314f, -0.000920f, +0.003006f + }, + { + +0.004191f, +0.127155f, -0.017650f, -0.022846f, -0.009972f, +0.021504f, -0.008318f, +0.019605f, -0.011552f, +0.005786f, + -0.001207f, -0.004545f, -0.009870f, -0.022544f, -0.010778f, -0.015302f, -0.009173f, -0.006266f, +0.036817f, -0.036749f, + -0.052821f, +0.004886f, +0.005356f, +0.028371f, +0.006067f, -0.002956f, -0.000032f, +0.013233f, +0.015181f, -0.006864f, + -0.018692f, +0.019957f, +0.011663f, -0.003649f, +0.010896f, -0.000800f, +0.005123f, +0.023601f, -0.011809f, +0.016443f, + +0.001410f, +0.005780f, +0.001340f, +0.016665f, +0.016426f, -0.000840f, +0.013139f, -0.005526f, +0.007988f, +0.011464f, + +0.001691f, +0.001668f, +0.012882f, -0.005728f, -0.001071f, +0.001114f, -0.002968f, -0.001108f, +0.013042f, +0.003265f, + -0.000142f, +0.004117f, +0.005173f, -0.003508f, +0.003953f, -0.003912f, +0.005395f, -0.001022f, +0.004417f, +0.000085f, + +0.007869f, +0.000076f, -0.001274f, -0.002538f, -0.000962f, -0.001492f, -0.000582f, +0.000947f, +0.003610f, -0.000668f, + -0.002254f, -0.006445f, +0.000779f, -0.002098f, +0.003891f, -0.003306f, +0.000558f, -0.001470f, -0.000900f, +0.001676f, + +0.001136f, +0.001127f, -0.000488f, +0.001358f, -0.000624f, -0.001233f + }, + { + +0.063959f, -0.299295f, -0.057032f, -0.003382f, -0.025401f, +0.073342f, -0.002544f, +0.017266f, -0.007645f, +0.020039f, + -0.010114f, +0.021256f, -0.015712f, +0.022763f, -0.034941f, -0.001305f, -0.002070f, -0.003519f, -0.024054f, +0.006334f, + -0.007346f, -0.011219f, +0.013320f, -0.010715f, +0.013933f, -0.014882f, -0.012163f, -0.007255f, -0.022225f, +0.009748f, + +0.014927f, +0.016794f, +0.000612f, +0.009293f, +0.007977f, +0.002622f, -0.000927f, +0.005123f, +0.007940f, +0.017920f, + +0.009870f, -0.007199f, +0.002022f, -0.012250f, -0.003826f, -0.017512f, +0.011895f, -0.005821f, -0.005779f, +0.006513f, + -0.000031f, -0.002874f, +0.004186f, +0.014810f, -0.000180f, -0.000795f, -0.007848f, +0.005362f, +0.006406f, -0.010806f, + -0.003709f, +0.002393f, +0.005026f, +0.006895f, +0.000518f, +0.006964f, -0.004359f, -0.000365f, +0.000021f, +0.003712f, + -0.001490f, +0.000545f, -0.002626f, +0.006397f, -0.003364f, +0.000221f, +0.004182f, -0.002153f, +0.003778f, -0.001033f, + -0.002412f, +0.000772f, +0.001469f, +0.000185f, -0.000758f, -0.000247f, +0.000480f, -0.000483f, +0.002160f, +0.000786f, + -0.001208f, -0.000670f, -0.002154f, -0.001257f, -0.001276f, -0.000659f + }, + { + -0.003639f, +0.093278f, +0.016361f, +0.002656f, +0.007915f, -0.006862f, -0.001654f, +0.005358f, +0.003326f, -0.003225f, + +0.003773f, -0.005914f, +0.036060f, -0.035621f, +0.022327f, +0.005151f, -0.000686f, +0.016159f, -0.006811f, +0.014975f, + -0.027232f, -0.008303f, +0.020865f, -0.012833f, -0.025216f, +0.001746f, +0.008068f, -0.007090f, -0.006877f, +0.009668f, + -0.019655f, +0.009607f, -0.000396f, -0.020459f, -0.006853f, -0.015941f, -0.020490f, +0.006713f, +0.000197f, +0.002969f, + -0.016160f, -0.005846f, +0.014907f, +0.006060f, -0.008195f, +0.004132f, -0.014109f, +0.011588f, -0.001318f, -0.002840f, + +0.010435f, +0.001652f, +0.008880f, -0.007330f, +0.002187f, -0.008081f, -0.015739f, -0.004460f, -0.003015f, +0.001327f, + +0.009670f, -0.001134f, +0.001363f, +0.001012f, -0.009110f, -0.002899f, -0.002119f, -0.000656f, +0.005500f, -0.002822f, + -0.001587f, -0.005009f, -0.002673f, -0.005238f, +0.003725f, +0.002653f, +0.000030f, +0.004224f, +0.004801f, +0.000573f, + -0.000326f, +0.001800f, -0.000849f, +0.002458f, +0.001700f, +0.000440f, -0.000329f, -0.002562f, -0.000216f, -0.000688f, + -0.000429f, -0.000674f, -0.000282f, -0.001627f, -0.000846f, +0.001829f + }, + { + -0.061141f, -0.154771f, +0.043098f, -0.012086f, +0.008883f, -0.029669f, -0.015102f, -0.008298f, +0.007394f, -0.052166f, + +0.025027f, +0.004129f, +0.005813f, -0.028653f, -0.033110f, +0.006225f, -0.000649f, -0.010920f, -0.000019f, +0.011531f, + -0.012746f, -0.014773f, +0.009414f, -0.002854f, -0.014605f, -0.001357f, +0.003487f, +0.026995f, +0.021340f, -0.007457f, + -0.023517f, +0.016591f, +0.017130f, -0.013649f, +0.042546f, +0.024566f, +0.001767f, +0.005244f, +0.001341f, +0.012801f, + +0.023575f, +0.018293f, -0.012885f, +0.004937f, -0.025449f, +0.012827f, +0.000388f, -0.003832f, -0.003645f, +0.000786f, + +0.007230f, -0.001976f, -0.000648f, -0.006079f, +0.004917f, +0.002955f, -0.000297f, +0.011665f, +0.000873f, +0.014560f, + -0.002030f, +0.000359f, +0.004917f, +0.005626f, -0.002416f, +0.001538f, +0.001939f, +0.000879f, +0.004432f, +0.002584f, + -0.002852f, -0.001712f, -0.003021f, -0.001939f, -0.000364f, +0.001333f, +0.001685f, -0.001660f, -0.002360f, +0.001924f, + -0.006576f, -0.000185f, +0.001401f, -0.001638f, +0.000877f, -0.000620f, -0.000140f, +0.000150f, +0.004968f, -0.001492f, + +0.001874f, +0.001646f, +0.000579f, -0.001059f, +0.000477f, +0.001379f + }, + { + -0.005396f, -0.107631f, +0.015827f, +0.013482f, +0.014785f, +0.001825f, +0.016096f, +0.001000f, +0.031002f, -0.004400f, + -0.019081f, +0.008866f, +0.012965f, +0.095299f, -0.055668f, +0.040833f, +0.017112f, -0.007361f, +0.038707f, +0.004023f, + -0.031544f, +0.031128f, -0.017469f, +0.024577f, +0.001729f, +0.005575f, +0.026603f, -0.007132f, -0.026109f, +0.003818f, + +0.013596f, -0.008434f, -0.020254f, +0.001408f, +0.002831f, +0.000369f, -0.022964f, +0.004723f, -0.001693f, -0.022571f, + +0.010633f, -0.011724f, +0.000725f, +0.016880f, -0.004553f, -0.004651f, +0.002616f, +0.002215f, -0.008424f, -0.008893f, + +0.011149f, -0.002697f, +0.000700f, -0.002500f, -0.007369f, -0.001182f, -0.000148f, +0.006523f, +0.005194f, -0.006021f, + +0.007367f, -0.002080f, +0.007461f, -0.010420f, +0.001759f, -0.003611f, -0.001698f, +0.001226f, +0.002686f, +0.001492f, + +0.002198f, -0.008701f, -0.001822f, +0.000258f, -0.001625f, +0.002155f, -0.005272f, -0.002146f, -0.003238f, +0.002013f, + -0.001311f, +0.004442f, +0.001833f, -0.001318f, -0.002095f, +0.001242f, -0.002811f, -0.002759f, +0.002615f, +0.002180f, + +0.002888f, -0.002872f, -0.005173f, -0.000834f, +0.000300f, -0.000271f + }, + { + +0.003207f, -0.186630f, -0.028887f, +0.040167f, +0.003521f, -0.035307f, -0.009164f, +0.011533f, +0.000667f, -0.010377f, + +0.043270f, -0.027696f, +0.021870f, -0.050737f, -0.074583f, +0.011207f, -0.000523f, -0.003509f, -0.029021f, -0.007453f, + -0.011250f, -0.003366f, -0.009792f, +0.022632f, -0.005322f, -0.030848f, +0.011812f, -0.021223f, +0.021147f, -0.004831f, + +0.010424f, -0.004109f, -0.006134f, -0.029806f, -0.013724f, +0.036249f, +0.016551f, -0.006210f, +0.001088f, +0.021888f, + +0.005984f, -0.017735f, -0.001061f, -0.013699f, +0.007240f, -0.013593f, -0.002947f, +0.011560f, +0.020662f, -0.001268f, + +0.000300f, +0.013192f, -0.009847f, +0.004353f, -0.000748f, -0.007181f, -0.012301f, +0.004910f, -0.002601f, +0.008070f, + -0.007505f, -0.008165f, -0.001706f, -0.003849f, +0.006523f, -0.001166f, -0.002508f, +0.003178f, +0.000382f, -0.005977f, + -0.001583f, +0.011794f, -0.004538f, -0.008937f, -0.003113f, -0.007102f, +0.003019f, +0.004670f, -0.005712f, +0.000070f, + +0.003949f, -0.002324f, +0.001739f, -0.000483f, +0.000702f, +0.001751f, -0.000352f, +0.004908f, -0.000453f, +0.004213f, + +0.000109f, +0.002693f, -0.001824f, -0.003973f, +0.001873f, -0.000353f + } + }, + { + { + -0.002255f, +0.087084f, -0.038704f, +0.001192f, +0.015206f, +0.001260f, +0.007085f, -0.008645f, +0.006490f, -0.001134f, + +0.003358f, +0.017498f, +0.002727f, -0.013843f, +0.016106f, +0.007269f, +0.028791f, -0.021759f, +0.025439f, -0.001612f, + +0.046497f, +0.021941f, -0.008326f, -0.036210f, -0.016351f, +0.028458f, +0.002697f, +0.008928f, -0.012538f, -0.021626f, + -0.000712f, +0.040835f, +0.018055f, +0.007951f, +0.008846f, +0.009551f, -0.004374f, -0.004632f, +0.009003f, -0.001176f, + -0.004871f, -0.007466f, +0.007601f, +0.001084f, +0.012991f, -0.008418f, +0.004653f, +0.009232f, +0.004289f, -0.002201f, + -0.004076f, -0.003137f, -0.015376f, +0.003226f, -0.004575f, -0.002925f, -0.002619f, +0.004426f, +0.001221f, -0.005413f, + +0.000564f, +0.001534f, -0.005305f, -0.004783f, -0.002854f, +0.000082f, -0.003656f, +0.004690f, -0.000040f, -0.003300f, + -0.001077f, -0.001880f, +0.004142f, +0.002532f, +0.004384f, +0.001236f, -0.000699f, +0.003130f, +0.007123f, -0.004119f, + +0.002092f, +0.003325f, -0.002169f, -0.000918f, +0.003744f, -0.000128f, -0.001739f, -0.002431f, -0.004242f, -0.002214f, + -0.001260f, -0.002096f, +0.001879f, +0.000122f, -0.000920f, -0.000661f + }, + { + +0.040108f, -0.362267f, -0.026417f, -0.027787f, +0.016967f, +0.000669f, -0.010455f, -0.000178f, -0.000510f, +0.038242f, + +0.009060f, +0.035985f, -0.011885f, +0.015683f, +0.018902f, -0.071172f, +0.006450f, +0.009952f, -0.014686f, +0.018001f, + -0.022807f, -0.011514f, -0.026146f, +0.010631f, -0.023531f, +0.023664f, +0.019778f, +0.011790f, +0.001514f, +0.005510f, + +0.007974f, +0.011358f, -0.023720f, +0.013181f, +0.012028f, -0.015463f, -0.010529f, -0.010790f, +0.015685f, +0.021143f, + +0.002161f, +0.004075f, -0.023058f, +0.008069f, -0.006553f, -0.010575f, +0.002374f, -0.009257f, +0.007648f, +0.001724f, + -0.004160f, -0.001950f, -0.010566f, -0.000968f, -0.003335f, +0.003937f, -0.002577f, -0.008251f, -0.005695f, +0.004592f, + +0.002406f, -0.007992f, -0.005391f, +0.000895f, +0.006363f, +0.000489f, +0.002482f, +0.003657f, +0.006537f, -0.004039f, + +0.000459f, +0.003323f, +0.006341f, +0.000366f, -0.004892f, +0.003307f, -0.004347f, +0.004849f, +0.001778f, -0.001016f, + -0.000571f, +0.001143f, +0.001566f, -0.000519f, -0.003240f, -0.000590f, +0.003952f, -0.000029f, -0.000806f, +0.003372f, + +0.002513f, -0.001679f, +0.001242f, +0.000629f, -0.002743f, -0.000621f + }, + { + +0.010233f, -0.041850f, -0.037912f, +0.046770f, +0.005483f, +0.005751f, -0.010329f, +0.013646f, -0.014651f, +0.008545f, + +0.005308f, +0.001649f, +0.007404f, +0.018115f, +0.022878f, -0.001313f, -0.011614f, +0.012347f, -0.000414f, -0.002952f, + +0.003650f, +0.019506f, +0.029851f, +0.050963f, -0.007518f, -0.004917f, -0.028218f, +0.012326f, -0.025089f, -0.005424f, + -0.029138f, -0.006400f, -0.020494f, -0.023491f, -0.003782f, +0.005425f, -0.007421f, -0.002155f, +0.017105f, -0.004032f, + +0.001635f, +0.001796f, -0.000308f, +0.006645f, -0.010987f, -0.009420f, +0.013899f, -0.001927f, +0.000685f, -0.000228f, + -0.006413f, -0.000294f, -0.008302f, -0.002490f, -0.007029f, +0.005200f, +0.007069f, -0.000373f, -0.011322f, -0.001137f, + +0.002354f, -0.001608f, -0.001932f, +0.000280f, +0.003816f, -0.007026f, +0.004197f, +0.002362f, +0.001101f, -0.002676f, + -0.004841f, +0.000685f, +0.000467f, +0.001074f, -0.005567f, +0.000401f, -0.003032f, +0.000609f, -0.003914f, -0.003022f, + -0.004320f, -0.003929f, +0.000559f, +0.002085f, +0.004522f, +0.002103f, +0.000099f, +0.002490f, +0.003418f, -0.000485f, + +0.001972f, -0.000535f, +0.000276f, -0.000635f, -0.001405f, +0.000269f + }, + { + +0.004401f, -0.001463f, -0.011766f, -0.008092f, -0.006896f, -0.001139f, +0.001028f, -0.006351f, -0.007792f, -0.007768f, + -0.005728f, +0.006842f, +0.033454f, -0.033100f, -0.003929f, +0.021075f, -0.027521f, -0.011691f, +0.024171f, -0.009492f, + -0.002533f, -0.016093f, +0.014288f, -0.019934f, -0.020753f, -0.005788f, +0.008829f, -0.033409f, +0.000535f, -0.006810f, + +0.005776f, -0.020733f, -0.048180f, +0.000110f, -0.003865f, +0.000547f, -0.026862f, -0.017543f, +0.023474f, +0.003753f, + -0.005674f, +0.014987f, -0.011824f, +0.011820f, -0.007691f, +0.004723f, -0.012567f, -0.006922f, -0.003434f, +0.001385f, + -0.008306f, +0.005924f, -0.002299f, +0.002970f, -0.001675f, +0.002183f, -0.004861f, -0.000045f, -0.002759f, -0.007993f, + +0.001466f, -0.001887f, -0.002906f, +0.004890f, -0.004186f, +0.000556f, +0.007792f, +0.002421f, -0.006822f, -0.001427f, + +0.004892f, +0.004773f, -0.004198f, +0.001590f, +0.000895f, -0.001487f, +0.000343f, -0.004211f, +0.001697f, +0.001052f, + -0.000812f, +0.001549f, +0.000518f, -0.001245f, +0.001577f, -0.000823f, +0.002324f, -0.001726f, -0.000340f, +0.001760f, + -0.000690f, +0.001305f, +0.001249f, -0.001518f, -0.000040f, -0.001263f + }, + { + -0.106765f, -0.190532f, +0.056317f, -0.025935f, +0.008970f, -0.002112f, -0.014553f, +0.014761f, -0.019721f, -0.005159f, + -0.014189f, +0.042562f, +0.008408f, +0.018274f, +0.007908f, -0.013497f, -0.016990f, -0.021128f, +0.008771f, -0.002799f, + +0.016855f, -0.008071f, +0.018828f, -0.023176f, +0.031231f, -0.001896f, -0.005833f, -0.003325f, +0.007378f, +0.007299f, + +0.002043f, -0.014795f, +0.000185f, -0.003231f, +0.008367f, -0.005498f, -0.019306f, +0.024706f, +0.001630f, -0.039155f, + +0.017299f, -0.012576f, +0.022249f, -0.008364f, +0.013079f, -0.003267f, -0.007205f, +0.005485f, +0.000885f, +0.006248f, + +0.003387f, +0.003986f, -0.002711f, +0.000044f, +0.004818f, -0.010195f, +0.006580f, +0.005002f, +0.001433f, +0.003712f, + +0.000005f, +0.001228f, +0.004071f, +0.005458f, +0.005869f, -0.005494f, -0.001197f, +0.004500f, +0.003584f, +0.002785f, + +0.006877f, -0.001867f, -0.000494f, -0.000779f, -0.004125f, -0.002469f, +0.001866f, -0.001307f, +0.003936f, +0.001453f, + -0.001675f, -0.000114f, -0.000071f, -0.003273f, -0.000326f, +0.001727f, +0.004048f, +0.001594f, -0.000346f, -0.000757f, + +0.000436f, +0.001345f, -0.000934f, +0.000103f, +0.003239f, -0.001501f + }, + { + +0.001334f, +0.017947f, +0.002045f, +0.012172f, -0.001941f, -0.000276f, +0.000855f, -0.003941f, -0.004149f, +0.002178f, + +0.009169f, -0.018302f, +0.003541f, -0.027545f, -0.044321f, +0.037427f, +0.007704f, +0.008907f, +0.004823f, +0.058873f, + -0.009992f, -0.047621f, -0.028431f, -0.012546f, -0.022620f, -0.018948f, +0.002631f, -0.010561f, +0.006955f, -0.006037f, + +0.002824f, +0.014408f, +0.010789f, +0.012786f, -0.006942f, +0.013453f, -0.007687f, -0.015910f, -0.012811f, +0.004498f, + +0.015074f, -0.011487f, -0.003594f, -0.006958f, -0.011816f, -0.002326f, -0.007613f, +0.011175f, +0.007551f, -0.007667f, + -0.010702f, -0.001778f, -0.011181f, -0.002303f, -0.010083f, -0.006754f, +0.002064f, -0.002756f, +0.002714f, +0.001734f, + -0.004280f, -0.004055f, -0.004286f, -0.007287f, -0.000598f, -0.006606f, +0.000536f, +0.005334f, -0.008704f, -0.004533f, + +0.015270f, +0.003758f, -0.001586f, -0.001199f, -0.002294f, -0.005248f, -0.003369f, -0.002870f, +0.000608f, -0.000830f, + +0.003907f, +0.002318f, +0.000481f, +0.000228f, -0.001398f, +0.001719f, +0.001328f, -0.001087f, +0.001369f, +0.001222f, + -0.000918f, -0.002863f, +0.000177f, -0.001849f, -0.000693f, -0.000778f + }, + { + -0.128047f, -0.470872f, +0.071798f, -0.002606f, +0.016254f, -0.001851f, +0.001335f, -0.010738f, -0.042396f, +0.029240f, + +0.010908f, +0.056075f, -0.027577f, +0.016816f, +0.002149f, -0.000029f, -0.006964f, +0.007228f, -0.029680f, +0.026746f, + -0.001666f, -0.018862f, +0.013581f, -0.007372f, +0.004560f, -0.008676f, -0.000748f, -0.015399f, +0.022521f, -0.012810f, + -0.005049f, +0.011249f, -0.000687f, -0.000937f, +0.009888f, +0.018437f, -0.014785f, -0.009343f, +0.001675f, +0.007074f, + +0.011183f, -0.002100f, +0.002330f, +0.002466f, +0.004241f, -0.003516f, -0.017183f, +0.009977f, -0.012778f, -0.004938f, + +0.001855f, +0.013656f, +0.011518f, -0.009140f, -0.001410f, +0.003657f, -0.001049f, +0.003447f, -0.000487f, -0.004674f, + +0.001438f, -0.002531f, +0.013798f, -0.002890f, +0.011845f, +0.005423f, +0.005098f, -0.003108f, +0.000511f, -0.000918f, + -0.001631f, +0.005961f, +0.003511f, -0.005648f, +0.001196f, +0.000361f, +0.001629f, -0.003972f, +0.001124f, -0.002326f, + -0.002977f, -0.000698f, +0.000048f, -0.003864f, -0.003730f, +0.001925f, +0.001332f, -0.000323f, +0.000560f, +0.001104f, + -0.000133f, -0.003717f, -0.001644f, -0.001759f, +0.003480f, +0.002106f + }, + { + +0.000773f, +0.025730f, +0.004351f, +0.001038f, -0.003319f, -0.000132f, +0.003513f, -0.001876f, +0.034198f, -0.001134f, + -0.006513f, +0.011942f, +0.002578f, +0.038622f, -0.026596f, +0.024126f, -0.036476f, +0.012628f, +0.006984f, +0.003478f, + +0.019042f, +0.016917f, -0.014631f, -0.024358f, -0.000736f, +0.014741f, +0.024604f, +0.026640f, +0.008834f, -0.007160f, + +0.029247f, +0.002006f, +0.002959f, +0.015911f, -0.012927f, +0.012571f, -0.001909f, +0.004339f, +0.001654f, -0.001135f, + -0.001264f, +0.002799f, +0.012437f, +0.000500f, +0.007867f, -0.012293f, -0.006313f, -0.009820f, -0.012366f, -0.007775f, + -0.005874f, -0.000712f, -0.007359f, +0.001319f, -0.000805f, +0.014460f, -0.000160f, +0.000602f, +0.003243f, -0.000769f, + -0.004966f, -0.001302f, -0.009626f, -0.005622f, -0.000873f, -0.002664f, -0.002137f, -0.003362f, +0.001569f, +0.003029f, + -0.004488f, -0.002700f, -0.001527f, -0.001534f, +0.002720f, +0.002442f, -0.000568f, +0.003906f, +0.001788f, +0.001631f, + -0.001267f, -0.000248f, +0.002124f, -0.000791f, -0.001622f, -0.002436f, +0.000409f, -0.001322f, +0.002113f, +0.000810f, + -0.000513f, -0.000216f, +0.001350f, -0.001902f, -0.000258f, +0.003026f + }, + { + -0.138639f, +0.431837f, +0.078122f, +0.000877f, -0.021532f, +0.002148f, -0.012626f, -0.006869f, +0.007194f, -0.021693f, + +0.013394f, +0.013166f, -0.002132f, -0.029148f, -0.010954f, -0.010119f, -0.002605f, -0.024795f, +0.013503f, -0.011459f, + +0.000608f, +0.014847f, +0.011636f, +0.002685f, -0.004258f, -0.010599f, -0.013149f, -0.004111f, -0.008654f, -0.018860f, + +0.019661f, +0.005694f, -0.016448f, -0.000424f, +0.003173f, +0.002237f, -0.001878f, +0.012716f, +0.002166f, -0.006505f, + +0.002917f, -0.008470f, -0.011893f, -0.002363f, -0.008713f, +0.005075f, +0.004964f, -0.011165f, -0.011710f, +0.004065f, + +0.011275f, -0.006628f, +0.002577f, -0.006706f, -0.001962f, +0.006798f, +0.003171f, +0.006964f, -0.001510f, +0.000371f, + +0.001204f, +0.000090f, -0.007038f, +0.000071f, -0.006332f, +0.004869f, +0.009001f, -0.000845f, +0.001415f, -0.000531f, + +0.000414f, -0.000509f, -0.005420f, -0.004180f, -0.000055f, -0.004454f, +0.003690f, +0.004436f, -0.000223f, +0.000021f, + -0.002934f, +0.000217f, +0.000043f, +0.000264f, -0.000219f, +0.001895f, -0.001086f, -0.000619f, +0.002524f, -0.001969f, + -0.001617f, -0.001764f, -0.001870f, -0.001933f, +0.000231f, +0.000957f + }, + { + -0.001616f, +0.154783f, +0.028428f, +0.007946f, +0.002080f, +0.021649f, -0.031545f, +0.013001f, -0.007423f, -0.002969f, + -0.021598f, -0.014014f, -0.019158f, -0.039705f, -0.010092f, -0.014519f, +0.009689f, +0.026796f, -0.011477f, -0.078660f, + -0.035751f, +0.003558f, +0.007714f, +0.029650f, +0.001757f, -0.008166f, -0.007659f, -0.017738f, -0.014503f, -0.018798f, + -0.017438f, +0.018557f, -0.003981f, -0.008805f, -0.000418f, -0.005101f, -0.005284f, +0.004365f, -0.029686f, +0.015866f, + +0.001372f, +0.005122f, +0.000592f, +0.003256f, +0.005384f, -0.008595f, +0.011212f, -0.001518f, +0.004952f, +0.002389f, + -0.004866f, -0.009604f, +0.012321f, -0.008920f, +0.000518f, +0.004557f, -0.009382f, -0.013042f, +0.009547f, +0.008336f, + -0.001708f, +0.005373f, +0.007530f, +0.001537f, +0.011243f, +0.000653f, -0.000889f, -0.005677f, +0.004435f, -0.003610f, + +0.002721f, -0.001848f, -0.000003f, -0.001842f, -0.003896f, +0.002144f, +0.005312f, +0.000747f, +0.000466f, -0.001522f, + +0.001718f, -0.003518f, -0.001997f, -0.005424f, +0.004888f, -0.000123f, +0.001830f, -0.002093f, -0.002983f, -0.000344f, + -0.001614f, +0.000640f, -0.001495f, +0.000163f, +0.001243f, -0.000920f + }, + { + -0.063238f, -0.313998f, +0.079316f, +0.004536f, -0.022939f, +0.064222f, -0.017316f, +0.007666f, -0.031442f, -0.009238f, + -0.005851f, +0.013059f, -0.032470f, +0.042549f, +0.004637f, +0.015289f, +0.000092f, -0.007508f, -0.013149f, -0.000240f, + -0.003651f, +0.007354f, +0.025820f, -0.014087f, +0.003275f, -0.015720f, -0.008756f, +0.011658f, -0.012727f, +0.000206f, + +0.002776f, +0.005795f, -0.011623f, +0.002078f, +0.014923f, +0.022669f, +0.009186f, -0.002432f, -0.012664f, -0.005455f, + -0.007013f, -0.016198f, -0.000688f, -0.012367f, +0.006412f, -0.014681f, +0.008295f, +0.005989f, +0.014568f, +0.013680f, + -0.008565f, -0.003273f, -0.004895f, +0.006967f, +0.003462f, +0.010466f, -0.000074f, +0.000289f, -0.003455f, -0.012762f, + -0.004101f, +0.000406f, -0.000704f, -0.002730f, -0.006374f, +0.003349f, -0.002339f, +0.001885f, +0.000243f, -0.003114f, + -0.006848f, +0.003974f, +0.002604f, +0.006838f, -0.002947f, -0.000752f, +0.002426f, -0.005258f, +0.000003f, -0.000041f, + +0.000408f, -0.001017f, -0.000762f, -0.000902f, -0.000798f, +0.000884f, -0.000380f, -0.001816f, +0.000299f, +0.000590f, + -0.002250f, -0.002519f, -0.001114f, +0.001971f, +0.000385f, -0.002336f + }, + { + +0.005105f, +0.064518f, -0.018905f, -0.002863f, +0.006563f, -0.002488f, +0.004829f, +0.007203f, +0.003791f, -0.001646f, + -0.017011f, -0.019046f, -0.001593f, -0.105160f, -0.024377f, +0.026259f, +0.019805f, -0.003584f, -0.003041f, +0.019603f, + +0.009157f, +0.000970f, +0.048594f, +0.008490f, -0.033512f, -0.002399f, -0.009669f, -0.016070f, -0.012198f, +0.001710f, + -0.029102f, +0.035948f, +0.026366f, -0.015777f, +0.009136f, -0.000204f, +0.005274f, +0.017284f, -0.005519f, +0.002188f, + -0.023660f, -0.007229f, +0.017792f, +0.008161f, -0.017139f, +0.013086f, +0.005719f, +0.017219f, -0.006109f, -0.016267f, + -0.002077f, -0.000873f, +0.003719f, -0.020626f, -0.006155f, -0.002385f, -0.005759f, -0.000931f, +0.002877f, +0.005282f, + +0.005494f, -0.001756f, +0.000511f, -0.006077f, -0.008340f, -0.001657f, -0.002296f, +0.003473f, +0.008351f, -0.001881f, + +0.002735f, -0.002037f, -0.003396f, -0.002840f, +0.005343f, -0.004025f, -0.004557f, +0.001444f, +0.002527f, +0.004740f, + +0.002470f, -0.000358f, +0.001781f, +0.001045f, +0.000016f, -0.000879f, -0.000862f, +0.000756f, -0.000475f, -0.000685f, + +0.001895f, -0.000417f, +0.001844f, +0.000421f, -0.000916f, +0.001738f + }, + { + +0.095573f, +0.037159f, +0.010115f, -0.015980f, +0.039851f, -0.039748f, -0.036540f, -0.000310f, +0.038916f, +0.008089f, + +0.028821f, -0.026759f, -0.010922f, -0.010592f, -0.022130f, +0.010500f, +0.013870f, -0.021604f, -0.006565f, +0.019204f, + -0.005783f, -0.021969f, -0.003781f, +0.005600f, +0.007549f, +0.008597f, -0.017024f, -0.010744f, +0.016895f, +0.025156f, + +0.000954f, +0.021520f, +0.009291f, -0.026224f, +0.025175f, +0.016868f, +0.002495f, +0.008718f, -0.006319f, -0.002720f, + +0.019233f, +0.017985f, -0.010449f, +0.004071f, -0.025482f, +0.004072f, -0.001615f, +0.010729f, +0.017326f, +0.008122f, + -0.000045f, -0.010243f, +0.001461f, -0.013049f, -0.007968f, +0.002366f, +0.002217f, +0.007264f, -0.002406f, +0.011640f, + -0.003736f, -0.004563f, -0.001196f, +0.000277f, -0.006323f, -0.001173f, +0.003452f, +0.005881f, +0.002219f, -0.002039f, + -0.001723f, +0.000788f, +0.002341f, +0.000760f, +0.000327f, +0.002134f, +0.000865f, -0.002316f, +0.001620f, +0.005534f, + -0.002213f, +0.003860f, +0.002719f, +0.002451f, +0.000538f, -0.001046f, +0.002078f, -0.001961f, +0.001455f, -0.001490f, + +0.002905f, -0.000089f, +0.001993f, +0.001294f, +0.002232f, +0.000933f + }, + { + +0.004469f, -0.139209f, -0.016750f, -0.005605f, +0.003238f, +0.002971f, +0.011869f, -0.013133f, +0.011186f, +0.000216f, + +0.000318f, +0.014262f, -0.003122f, +0.010114f, -0.175926f, +0.012754f, +0.012479f, +0.016202f, +0.012905f, +0.045261f, + +0.002463f, +0.018052f, -0.009261f, +0.014106f, -0.005311f, +0.025755f, +0.032107f, +0.001836f, -0.022303f, -0.021040f, + +0.005982f, +0.003806f, -0.015690f, +0.003785f, -0.006588f, +0.020282f, -0.001981f, +0.007611f, +0.004094f, -0.021744f, + +0.008620f, -0.010401f, +0.009199f, +0.018864f, -0.002110f, -0.001015f, -0.005926f, -0.005777f, -0.006140f, -0.004038f, + +0.009643f, -0.005191f, +0.004965f, +0.005363f, +0.000013f, +0.004463f, +0.005401f, +0.002311f, -0.004812f, -0.009511f, + +0.001122f, -0.008911f, +0.004256f, -0.007409f, +0.005530f, +0.002995f, +0.004801f, -0.004557f, -0.004409f, -0.004121f, + +0.006046f, +0.004772f, +0.003573f, -0.001267f, -0.000204f, +0.001969f, -0.004023f, +0.002116f, -0.004199f, -0.002519f, + -0.007318f, +0.000892f, +0.002099f, +0.004244f, +0.002940f, +0.000747f, -0.000865f, -0.001457f, +0.001243f, +0.003005f, + +0.005742f, -0.000176f, -0.003320f, -0.000562f, +0.000286f, -0.001737f + }, + { + +0.037432f, -0.140682f, -0.031964f, +0.027759f, +0.009157f, -0.027875f, +0.004232f, +0.013976f, -0.024806f, -0.016477f, + +0.050699f, -0.039726f, +0.020766f, +0.010645f, -0.000784f, -0.004171f, -0.046363f, -0.033517f, -0.038374f, -0.004279f, + -0.002400f, +0.018763f, +0.002146f, +0.019656f, +0.016899f, -0.012511f, +0.025836f, -0.003130f, +0.004801f, -0.007125f, + +0.023461f, +0.019675f, +0.008895f, -0.012504f, -0.018085f, +0.019394f, +0.019373f, -0.004990f, -0.001146f, +0.015682f, + -0.006313f, -0.002127f, +0.012278f, -0.006076f, +0.017212f, -0.009601f, -0.007114f, +0.001880f, +0.020606f, +0.001427f, + +0.002911f, +0.009197f, -0.010796f, -0.007472f, -0.008506f, +0.003357f, -0.005983f, +0.001587f, -0.003924f, +0.008188f, + -0.003820f, -0.001986f, -0.002508f, -0.003951f, +0.003111f, -0.003079f, -0.005116f, -0.001576f, +0.006520f, -0.000027f, + -0.004383f, +0.009932f, -0.000676f, +0.000151f, +0.000678f, -0.002949f, +0.003809f, +0.003351f, -0.005363f, -0.002469f, + +0.006826f, +0.001663f, +0.001215f, -0.000783f, -0.002573f, -0.001156f, +0.003060f, +0.005452f, -0.003271f, +0.001780f, + +0.000575f, +0.004255f, +0.000729f, -0.000583f, +0.002947f, -0.002733f + } + }, + { + { + +0.000440f, +0.013717f, +0.012986f, +0.035782f, -0.012181f, -0.001245f, +0.006452f, -0.001889f, -0.004908f, -0.008629f, + +0.044858f, -0.002011f, -0.004341f, +0.022582f, +0.021734f, +0.004993f, +0.015411f, -0.000478f, -0.012287f, +0.004099f, + +0.041604f, +0.003069f, +0.000496f, -0.040834f, +0.015040f, +0.011948f, +0.005778f, +0.004137f, -0.017492f, -0.033387f, + +0.014350f, +0.038470f, +0.010100f, +0.006201f, +0.009482f, +0.000813f, +0.001262f, -0.006155f, +0.010836f, +0.003731f, + -0.009550f, -0.010529f, +0.009478f, +0.011704f, -0.005761f, -0.016886f, +0.005347f, +0.017483f, -0.001571f, +0.002083f, + -0.004883f, -0.006997f, -0.010075f, -0.003668f, -0.003772f, +0.003835f, +0.000163f, +0.003864f, -0.000015f, -0.004144f, + -0.004979f, -0.002257f, +0.004630f, -0.005711f, +0.000207f, -0.006901f, +0.002999f, +0.004716f, -0.007581f, +0.003212f, + -0.003554f, +0.000982f, -0.001400f, +0.002902f, +0.008103f, +0.001857f, -0.002756f, +0.005724f, +0.002020f, +0.004043f, + -0.003208f, +0.001312f, -0.001410f, +0.000431f, +0.003883f, -0.000749f, -0.000763f, -0.002192f, -0.004410f, -0.000985f, + -0.002462f, -0.000933f, +0.000406f, -0.000693f, +0.000727f, +0.000753f + }, + { + -0.028363f, -0.327548f, -0.007752f, -0.025987f, +0.026605f, -0.009377f, +0.004631f, +0.015008f, -0.012369f, +0.006165f, + +0.022757f, +0.041083f, +0.000622f, +0.005621f, +0.013260f, -0.029813f, -0.037300f, +0.005472f, +0.013782f, -0.010599f, + +0.009059f, -0.017256f, -0.028028f, -0.024570f, +0.007945f, +0.008751f, +0.026013f, +0.012893f, +0.007758f, +0.005211f, + +0.011154f, -0.002808f, -0.004226f, +0.005819f, -0.016119f, +0.006082f, -0.004915f, -0.010708f, +0.022676f, +0.006104f, + +0.004679f, -0.005333f, -0.008808f, -0.009548f, -0.004015f, -0.009133f, +0.001125f, -0.005622f, +0.002543f, +0.004789f, + +0.001142f, -0.011156f, -0.006879f, -0.002485f, -0.001546f, +0.009874f, -0.008300f, -0.005212f, -0.004640f, +0.003175f, + +0.005828f, -0.013632f, -0.002197f, +0.001704f, +0.006475f, -0.001285f, +0.007241f, +0.000926f, -0.000288f, +0.001012f, + -0.001253f, +0.006888f, +0.001290f, +0.004020f, -0.001464f, -0.000826f, -0.002836f, +0.004340f, -0.000429f, -0.001217f, + -0.000101f, +0.003691f, -0.000652f, -0.002013f, -0.001646f, +0.000246f, +0.000351f, +0.001989f, -0.000533f, +0.004177f, + +0.000757f, +0.000134f, -0.000807f, +0.000032f, +0.000675f, +0.000215f + }, + { + -0.009276f, -0.115991f, +0.031629f, +0.050203f, -0.002302f, -0.002659f, -0.002670f, -0.003953f, +0.005421f, +0.011892f, + +0.016885f, -0.024517f, +0.013774f, +0.019556f, +0.002365f, -0.002197f, -0.005789f, +0.024809f, -0.009738f, +0.014570f, + -0.000019f, +0.015267f, +0.046841f, +0.020741f, +0.004360f, -0.002492f, -0.021858f, -0.005867f, -0.004117f, -0.007806f, + -0.015971f, -0.030113f, -0.020785f, -0.007714f, -0.007101f, -0.003402f, +0.003447f, -0.008823f, +0.006413f, +0.006173f, + -0.002182f, -0.001737f, +0.002367f, +0.003662f, -0.013728f, -0.002761f, +0.006196f, -0.006932f, +0.006595f, -0.003103f, + +0.001776f, -0.007823f, -0.005205f, -0.008546f, +0.003345f, -0.000517f, -0.000405f, +0.005429f, -0.007999f, -0.006965f, + +0.003996f, -0.004048f, +0.003046f, -0.004759f, -0.002384f, -0.000616f, +0.003042f, +0.002287f, -0.000414f, -0.005134f, + -0.000174f, +0.001847f, -0.001547f, -0.000061f, -0.000962f, -0.002374f, -0.001457f, -0.003611f, -0.004398f, -0.000192f, + -0.002910f, -0.004704f, -0.000227f, +0.002271f, +0.004730f, +0.001880f, +0.001323f, +0.000625f, +0.002580f, +0.001497f, + -0.001340f, +0.000428f, +0.001556f, -0.001191f, -0.000611f, -0.000136f + }, + { + -0.004962f, -0.001175f, -0.004682f, -0.014843f, -0.000601f, -0.000224f, -0.001398f, -0.001028f, -0.006780f, -0.015115f, + -0.000709f, +0.005955f, +0.024033f, -0.013132f, +0.037346f, +0.017297f, -0.081576f, +0.015484f, +0.032164f, +0.006301f, + -0.011212f, -0.014827f, +0.011455f, -0.029113f, -0.034439f, +0.032112f, -0.028216f, -0.020485f, +0.004290f, -0.023364f, + +0.034667f, -0.029991f, -0.044394f, -0.002487f, +0.008301f, -0.038885f, +0.005232f, -0.006913f, +0.003049f, +0.012046f, + -0.008135f, +0.015896f, -0.003425f, +0.004990f, -0.005984f, -0.006898f, +0.004385f, -0.011191f, -0.009772f, +0.012769f, + -0.005023f, +0.001656f, -0.001241f, -0.001205f, +0.003299f, +0.001258f, -0.008240f, -0.006475f, +0.006253f, -0.007088f, + +0.003296f, -0.012097f, +0.001262f, +0.004271f, -0.000575f, -0.001608f, +0.006413f, +0.003187f, -0.007290f, -0.002564f, + +0.009656f, -0.001550f, -0.001535f, +0.002459f, +0.002326f, -0.003314f, -0.003795f, -0.000982f, +0.001126f, +0.000332f, + -0.000362f, +0.000097f, +0.002506f, -0.001226f, +0.001972f, +0.000828f, -0.001348f, +0.000703f, -0.002224f, +0.002535f, + +0.000544f, +0.000578f, +0.000223f, -0.000298f, -0.001376f, +0.000463f + }, + { + +0.096553f, -0.363943f, -0.028731f, +0.001540f, -0.002858f, -0.006950f, -0.002966f, -0.001070f, -0.007286f, -0.007130f, + -0.000308f, +0.031810f, -0.005792f, +0.030273f, +0.009668f, -0.004770f, -0.030346f, -0.024675f, +0.018020f, +0.011353f, + -0.002369f, -0.003811f, +0.003152f, +0.014495f, +0.002102f, +0.021902f, -0.008518f, -0.006975f, +0.013240f, +0.003012f, + -0.006683f, -0.011776f, +0.004618f, +0.004740f, -0.013098f, -0.001865f, +0.039604f, +0.000168f, -0.009727f, -0.026244f, + -0.000551f, +0.000526f, -0.004390f, +0.009483f, +0.008214f, -0.012104f, +0.003928f, +0.010629f, -0.010657f, +0.003596f, + +0.006684f, +0.005870f, -0.009072f, +0.000891f, +0.002714f, -0.004231f, +0.006854f, +0.001884f, +0.000266f, +0.002669f, + +0.002030f, +0.001021f, +0.005858f, +0.003247f, +0.001000f, +0.001844f, +0.001875f, -0.002212f, +0.004127f, +0.004458f, + +0.007672f, -0.002111f, +0.003026f, -0.006234f, -0.002185f, +0.000079f, -0.003244f, +0.001946f, +0.000587f, +0.002616f, + -0.000346f, -0.002977f, +0.002327f, -0.002917f, +0.001177f, +0.002660f, +0.000444f, +0.002079f, +0.000934f, +0.000077f, + -0.000492f, +0.001231f, -0.000537f, +0.000418f, +0.002171f, -0.000697f + }, + { + +0.001488f, -0.002856f, +0.023225f, +0.000942f, +0.003276f, -0.000974f, +0.001200f, -0.003821f, -0.011345f, +0.006285f, + +0.007373f, +0.001153f, -0.007131f, +0.027760f, -0.046138f, -0.039911f, +0.061800f, -0.004457f, +0.002090f, +0.053641f, + +0.005380f, -0.029264f, -0.035531f, -0.018187f, -0.020116f, -0.005320f, -0.008953f, -0.002797f, -0.017187f, +0.040737f, + +0.010938f, +0.002853f, -0.010718f, -0.008890f, +0.013445f, +0.004182f, +0.003792f, -0.003324f, -0.014320f, +0.000138f, + +0.013758f, +0.001072f, -0.005259f, -0.015795f, -0.011203f, -0.001495f, -0.007537f, +0.007523f, +0.000148f, -0.008333f, + -0.008165f, -0.002665f, -0.009388f, -0.006416f, -0.005116f, -0.009025f, +0.000335f, -0.002294f, +0.004384f, +0.004909f, + -0.003922f, -0.007287f, -0.002302f, -0.005221f, -0.001592f, -0.005940f, +0.000968f, +0.003083f, -0.006887f, +0.001324f, + +0.009443f, +0.003451f, +0.000127f, -0.000761f, -0.008216f, -0.004444f, -0.002410f, +0.002091f, -0.003281f, +0.000706f, + +0.003156f, +0.004159f, -0.003425f, +0.003093f, -0.001591f, -0.001534f, +0.001579f, +0.000331f, +0.000327f, +0.000958f, + +0.000356f, -0.002306f, -0.002151f, -0.000089f, -0.002295f, +0.001094f + }, + { + +0.088137f, -0.654913f, -0.031764f, +0.036073f, +0.004134f, +0.001976f, -0.006573f, -0.022287f, -0.011797f, +0.006711f, + +0.042691f, +0.005121f, +0.000026f, +0.006746f, +0.005312f, -0.002186f, -0.026409f, +0.017640f, -0.017429f, -0.000037f, + -0.006094f, +0.004978f, -0.001331f, -0.014057f, +0.007122f, -0.004760f, -0.000047f, -0.004851f, +0.005375f, +0.004947f, + -0.016567f, +0.002556f, +0.008732f, +0.002400f, +0.006572f, +0.010430f, -0.011736f, -0.012366f, -0.008963f, +0.018890f, + +0.002458f, +0.001446f, +0.002273f, +0.001606f, +0.003283f, -0.005791f, -0.001571f, -0.007550f, -0.013391f, +0.000672f, + -0.004266f, +0.016888f, +0.004242f, +0.000094f, -0.005556f, +0.003973f, -0.001998f, -0.000927f, +0.007265f, -0.005285f, + +0.003706f, +0.000966f, +0.003757f, +0.005629f, +0.013202f, -0.001804f, +0.003566f, +0.001628f, +0.000741f, -0.000368f, + -0.001700f, +0.007453f, -0.000315f, -0.002470f, -0.000654f, +0.002530f, -0.000014f, +0.000562f, -0.001487f, -0.001177f, + -0.002157f, -0.001565f, -0.002753f, -0.003338f, +0.000425f, +0.000264f, -0.000892f, +0.000914f, +0.000843f, +0.001908f, + -0.004144f, -0.000322f, -0.003473f, +0.000802f, +0.000989f, +0.002485f + }, + { + +0.002539f, +0.004975f, +0.013932f, +0.002862f, -0.005297f, +0.000919f, +0.002764f, +0.008450f, +0.017343f, +0.001062f, + +0.004265f, -0.000190f, +0.012440f, -0.000391f, +0.029154f, +0.016149f, -0.019281f, -0.012578f, -0.000167f, +0.026263f, + +0.001592f, -0.007258f, -0.009141f, -0.016759f, -0.008785f, +0.030416f, +0.020622f, +0.029913f, +0.008834f, +0.024753f, + -0.022432f, +0.007453f, +0.001328f, +0.004630f, -0.008658f, +0.022930f, -0.015666f, +0.008164f, +0.005842f, -0.011917f, + +0.011941f, +0.002847f, +0.006251f, +0.005632f, -0.008687f, -0.001331f, -0.010292f, +0.004519f, -0.016071f, -0.006395f, + -0.010744f, -0.007042f, +0.007256f, -0.013972f, +0.013827f, +0.010039f, +0.000592f, +0.004690f, -0.009018f, +0.002352f, + -0.000737f, -0.006255f, -0.009055f, -0.003676f, -0.004377f, +0.000811f, -0.005262f, -0.001402f, -0.000207f, -0.002240f, + -0.003442f, -0.001776f, -0.000624f, -0.003421f, +0.002187f, +0.002783f, -0.001360f, +0.003706f, -0.000681f, +0.001602f, + +0.003925f, -0.004189f, +0.002913f, +0.000659f, -0.005672f, +0.002693f, -0.002658f, +0.000772f, +0.000071f, -0.000887f, + +0.001756f, +0.000005f, -0.000109f, -0.000183f, -0.001277f, +0.002703f + }, + { + +0.154158f, +0.187149f, -0.071261f, +0.032881f, -0.007274f, -0.000308f, -0.023725f, +0.010054f, -0.006937f, -0.011006f, + +0.020359f, +0.024428f, -0.031337f, -0.019363f, -0.004514f, -0.014685f, -0.031026f, -0.000621f, +0.007018f, -0.015700f, + +0.020383f, +0.000757f, +0.001027f, -0.008993f, -0.000760f, -0.005517f, -0.016157f, +0.002198f, -0.008595f, -0.006675f, + -0.001647f, +0.017130f, -0.018763f, -0.006514f, +0.000799f, +0.014735f, -0.007724f, +0.010392f, +0.001572f, +0.006743f, + -0.002277f, -0.008771f, -0.016642f, -0.008568f, +0.003020f, -0.002787f, -0.002006f, +0.001336f, -0.001026f, +0.000693f, + +0.001143f, -0.002226f, -0.002714f, -0.000726f, -0.000815f, +0.009540f, -0.002535f, +0.009890f, +0.002687f, +0.000869f, + +0.000262f, +0.001820f, -0.008743f, -0.000443f, -0.001434f, +0.004480f, +0.005065f, +0.004233f, -0.001292f, -0.000896f, + +0.000538f, +0.001174f, -0.003856f, -0.004803f, -0.002310f, -0.001828f, +0.002809f, +0.002719f, +0.001761f, -0.003739f, + +0.001533f, -0.000168f, -0.000500f, +0.000124f, +0.003029f, +0.000990f, -0.001691f, -0.001975f, +0.001215f, -0.001016f, + -0.001027f, -0.001684f, -0.000198f, -0.002779f, -0.000289f, -0.000732f + }, + { + -0.001028f, +0.153034f, +0.023282f, +0.022547f, +0.002228f, -0.009103f, -0.020175f, +0.002959f, +0.010508f, -0.014383f, + -0.007136f, -0.011548f, +0.006243f, -0.051146f, -0.001382f, -0.016212f, +0.010086f, +0.007637f, -0.037393f, -0.034640f, + -0.016670f, -0.009115f, +0.020971f, -0.001378f, +0.007343f, -0.001424f, +0.008453f, -0.025017f, -0.011241f, -0.020404f, + -0.003689f, -0.002628f, -0.019857f, +0.012778f, -0.008846f, +0.003104f, -0.020371f, -0.009128f, +0.004587f, +0.004167f, + -0.009244f, +0.009181f, +0.007569f, -0.010908f, -0.003833f, +0.005074f, +0.001376f, +0.008531f, -0.000097f, -0.005675f, + -0.002815f, +0.000475f, +0.006265f, -0.004913f, -0.000443f, -0.001694f, -0.006222f, -0.006138f, +0.003421f, +0.006404f, + -0.002288f, +0.009449f, +0.005944f, -0.000810f, +0.011652f, +0.005514f, -0.002009f, -0.009998f, +0.001519f, +0.000062f, + -0.002392f, +0.004842f, -0.003356f, -0.000187f, -0.006042f, +0.002562f, +0.007181f, +0.002502f, -0.000178f, -0.001279f, + +0.000504f, -0.002839f, -0.003446f, -0.002027f, +0.002228f, +0.000339f, +0.000488f, -0.000695f, -0.001476f, -0.003923f, + -0.000503f, -0.000670f, -0.000286f, +0.000389f, +0.000055f, -0.000613f + }, + { + +0.057748f, -0.333521f, -0.031587f, -0.014596f, +0.025950f, -0.032828f, +0.025406f, +0.015205f, -0.011356f, -0.036932f, + +0.009236f, -0.018224f, -0.026815f, +0.024322f, +0.049077f, +0.004754f, +0.013213f, -0.017098f, +0.001876f, -0.023983f, + +0.012665f, +0.001280f, +0.015587f, -0.000009f, -0.024418f, +0.004185f, -0.001706f, +0.003717f, -0.014940f, -0.008529f, + +0.014255f, -0.005389f, +0.003428f, -0.010724f, +0.005935f, +0.029424f, +0.006777f, +0.006957f, -0.018784f, -0.013959f, + -0.008265f, -0.004385f, +0.001451f, -0.013067f, +0.003490f, -0.005540f, +0.000890f, +0.011418f, +0.011996f, +0.020490f, + -0.006252f, -0.005797f, -0.010993f, -0.002107f, +0.007488f, +0.008197f, +0.008539f, -0.007915f, -0.002774f, -0.002436f, + -0.000191f, -0.004270f, -0.004313f, -0.003721f, -0.002043f, -0.000230f, +0.000654f, -0.002008f, -0.001831f, -0.002327f, + -0.005135f, +0.002091f, +0.005440f, -0.000358f, +0.001037f, +0.000609f, +0.001109f, +0.000452f, -0.003680f, -0.001245f, + +0.000883f, +0.000303f, -0.000048f, -0.005248f, +0.002159f, -0.000992f, -0.000702f, +0.000795f, -0.002501f, -0.000046f, + -0.001496f, -0.003494f, +0.001149f, +0.000968f, +0.000117f, -0.001621f + }, + { + -0.006378f, +0.027100f, +0.010028f, +0.003381f, -0.014089f, +0.021007f, -0.006235f, +0.016794f, -0.001779f, -0.008129f, + -0.013409f, -0.013025f, -0.017656f, -0.093381f, -0.042537f, +0.035853f, +0.046587f, -0.052559f, +0.025549f, +0.024852f, + +0.011289f, -0.026761f, +0.041586f, +0.011209f, -0.003754f, -0.008386f, -0.029567f, -0.009097f, -0.003968f, -0.025947f, + +0.022471f, -0.010497f, +0.031129f, +0.014694f, -0.003731f, +0.001111f, +0.017790f, -0.011408f, +0.010077f, -0.009376f, + -0.007167f, +0.004409f, -0.000562f, +0.008558f, -0.007710f, +0.005674f, +0.019329f, +0.004463f, -0.004359f, -0.009264f, + -0.006100f, +0.001625f, -0.001812f, -0.013216f, -0.006621f, -0.005550f, -0.002982f, +0.001093f, +0.002659f, +0.010407f, + -0.003302f, +0.001923f, -0.001912f, -0.009666f, -0.000309f, -0.006994f, -0.000097f, +0.003339f, +0.006326f, -0.000520f, + +0.004278f, -0.003545f, -0.003933f, -0.002751f, -0.000723f, +0.000938f, -0.002453f, -0.002017f, +0.003779f, +0.003802f, + +0.000117f, -0.000059f, +0.003629f, -0.000012f, -0.000067f, -0.001086f, -0.002235f, +0.001713f, -0.001690f, +0.000211f, + +0.003878f, -0.000842f, +0.001239f, +0.000711f, +0.000801f, -0.000626f + }, + { + -0.089600f, +0.306687f, -0.017096f, +0.007612f, +0.045675f, -0.038564f, -0.006355f, +0.029933f, +0.000219f, +0.042446f, + +0.002053f, -0.026672f, -0.019632f, -0.004795f, -0.017299f, +0.004521f, +0.019568f, -0.017039f, -0.005768f, -0.012187f, + +0.011871f, -0.009507f, -0.012589f, -0.011221f, +0.014876f, +0.009484f, -0.017214f, -0.020477f, +0.025131f, +0.024666f, + +0.006397f, +0.019632f, +0.004971f, -0.019905f, +0.005564f, +0.025799f, +0.009713f, +0.012576f, -0.013900f, -0.008259f, + +0.018152f, +0.010720f, -0.005361f, +0.006254f, -0.007760f, -0.013207f, +0.006412f, +0.008150f, +0.017020f, -0.000353f, + -0.001612f, -0.011806f, -0.001623f, -0.013055f, -0.002368f, -0.001927f, +0.003244f, +0.003900f, +0.004442f, +0.000912f, + -0.001725f, -0.003020f, -0.000405f, -0.003330f, -0.002457f, -0.000546f, +0.000492f, +0.003938f, +0.000268f, +0.000267f, + -0.002550f, +0.003554f, +0.000056f, +0.001741f, +0.001943f, +0.003689f, +0.002167f, -0.004662f, +0.001964f, -0.002291f, + +0.004618f, +0.004022f, +0.000598f, +0.006134f, -0.003258f, -0.001925f, +0.005177f, -0.003562f, +0.001056f, -0.000627f, + +0.001224f, +0.000536f, -0.000030f, +0.003061f, +0.002699f, +0.000764f + }, + { + -0.004528f, -0.149227f, -0.002402f, -0.013304f, +0.000440f, +0.014787f, +0.001922f, -0.008564f, +0.003057f, +0.009095f, + -0.003725f, +0.022371f, -0.005045f, -0.051916f, -0.082711f, +0.008183f, -0.020642f, +0.050447f, +0.008877f, +0.002369f, + +0.017088f, +0.009101f, +0.013351f, +0.010945f, -0.018874f, +0.016468f, -0.004981f, +0.012573f, +0.017804f, -0.032774f, + +0.017778f, -0.003264f, -0.011146f, +0.006943f, -0.001980f, -0.001319f, +0.007936f, +0.006557f, +0.005944f, -0.006777f, + +0.002125f, -0.010433f, +0.011348f, +0.005979f, -0.004669f, +0.012863f, -0.013963f, -0.000734f, -0.002918f, -0.000022f, + -0.002415f, +0.000112f, +0.006584f, +0.002720f, -0.002923f, +0.010993f, +0.008936f, -0.004341f, -0.010313f, +0.001255f, + -0.008966f, -0.003416f, +0.000115f, -0.002586f, -0.000197f, +0.007527f, +0.004528f, -0.006457f, -0.005356f, -0.003729f, + +0.002483f, +0.002497f, +0.006911f, +0.002625f, -0.001363f, -0.002486f, +0.001519f, -0.000311f, -0.002077f, -0.000808f, + -0.005953f, -0.002523f, +0.003798f, +0.006126f, +0.002047f, -0.001568f, -0.000124f, +0.000172f, +0.003238f, +0.000740f, + +0.003369f, +0.000844f, -0.000701f, -0.001147f, +0.000283f, +0.000578f + }, + { + -0.065218f, -0.000121f, -0.033615f, +0.042708f, +0.021220f, -0.027715f, -0.005517f, +0.008265f, -0.017596f, +0.004989f, + -0.010682f, -0.000930f, +0.008690f, +0.003028f, +0.046337f, -0.034086f, -0.036817f, -0.025024f, -0.047419f, +0.009077f, + +0.005039f, +0.008031f, +0.008727f, -0.003437f, +0.035266f, +0.008580f, -0.006749f, +0.017801f, -0.031124f, +0.030220f, + +0.003730f, +0.025939f, +0.011688f, +0.002086f, -0.013394f, +0.007664f, +0.011508f, -0.008701f, +0.009259f, +0.011878f, + -0.022319f, +0.014831f, +0.006191f, +0.002128f, +0.002687f, -0.000518f, -0.001471f, -0.003776f, +0.011374f, +0.004472f, + +0.010686f, +0.001867f, -0.008071f, -0.011070f, -0.003510f, +0.004486f, -0.002559f, -0.003065f, -0.000891f, +0.004792f, + -0.005073f, +0.002350f, -0.004072f, -0.000961f, -0.002099f, +0.002618f, -0.006060f, -0.004480f, +0.010282f, -0.000157f, + -0.001673f, +0.002057f, +0.000885f, +0.005245f, -0.004297f, +0.003601f, +0.003325f, -0.000687f, -0.002684f, -0.002509f, + +0.002882f, +0.003902f, +0.001359f, -0.000534f, -0.001329f, -0.005655f, +0.006933f, +0.001352f, -0.001715f, +0.001157f, + +0.000902f, +0.002838f, +0.002377f, -0.000226f, +0.002457f, -0.001397f + } + }, + { + { + +0.001490f, -0.036543f, -0.018651f, +0.026680f, -0.014126f, +0.004473f, +0.006037f, -0.004775f, -0.001563f, -0.011962f, + +0.043043f, -0.010558f, -0.007322f, +0.022251f, +0.016700f, -0.007056f, -0.002858f, +0.018025f, -0.016875f, -0.040479f, + -0.009633f, -0.009598f, -0.000185f, -0.017888f, +0.052051f, +0.005638f, -0.015817f, -0.012438f, -0.018122f, -0.031023f, + +0.000515f, +0.006713f, -0.007392f, -0.007505f, +0.011799f, +0.011754f, +0.009556f, -0.017062f, -0.010534f, -0.001280f, + -0.008502f, -0.009861f, -0.000502f, +0.004881f, -0.003539f, -0.020424f, -0.009932f, +0.003728f, -0.004404f, +0.012368f, + +0.000825f, -0.004388f, -0.006116f, -0.005268f, +0.001140f, +0.006374f, +0.000076f, +0.007678f, +0.002010f, -0.003218f, + -0.004709f, -0.003108f, +0.011040f, +0.001819f, +0.001986f, -0.008524f, +0.001340f, +0.003211f, -0.007241f, +0.002670f, + -0.004767f, +0.001550f, -0.001486f, -0.002581f, +0.001176f, +0.001121f, -0.004245f, +0.001734f, -0.002698f, +0.001488f, + -0.006649f, -0.001511f, -0.000101f, +0.003546f, +0.003660f, -0.002594f, -0.000100f, +0.000191f, -0.002027f, +0.000150f, + -0.002047f, +0.000664f, +0.002177f, +0.000739f, +0.000726f, +0.000401f + }, + { + +0.015552f, -0.378485f, -0.102404f, -0.067299f, -0.010074f, -0.013440f, -0.002604f, +0.001793f, -0.017852f, -0.022518f, + -0.017950f, +0.024873f, +0.004558f, -0.007847f, -0.003619f, -0.010563f, -0.022249f, +0.004331f, +0.012472f, -0.020506f, + +0.008484f, -0.007507f, -0.018126f, -0.031087f, +0.011728f, -0.004619f, +0.005645f, +0.012223f, +0.010415f, +0.002070f, + +0.005689f, -0.004355f, -0.006872f, -0.001749f, -0.013835f, +0.006277f, +0.000061f, -0.008316f, +0.005133f, -0.020442f, + -0.007850f, -0.001719f, +0.005959f, -0.010599f, -0.004060f, -0.003533f, -0.002536f, -0.015435f, -0.005487f, +0.009717f, + +0.010158f, -0.003179f, +0.000384f, -0.005295f, -0.008569f, +0.013496f, +0.002344f, +0.003017f, +0.002112f, -0.000597f, + +0.002306f, -0.009256f, -0.005284f, -0.005146f, +0.001905f, -0.004983f, +0.004083f, -0.000379f, -0.007336f, +0.000054f, + +0.000168f, +0.005906f, -0.003113f, +0.002449f, -0.000387f, -0.000688f, -0.003634f, -0.001876f, -0.005173f, -0.002529f, + +0.000347f, +0.004073f, -0.002422f, -0.001083f, +0.002266f, +0.001916f, -0.001313f, +0.001131f, -0.000777f, +0.003646f, + -0.000757f, -0.000319f, +0.000131f, +0.001553f, +0.001189f, +0.001064f + }, + { + +0.007522f, -0.144942f, -0.018174f, +0.004985f, -0.033115f, -0.009662f, -0.004489f, -0.001101f, +0.008707f, +0.015920f, + +0.024704f, -0.029257f, -0.000251f, +0.011285f, -0.018610f, -0.005512f, +0.008993f, +0.027445f, -0.024503f, +0.021493f, + +0.001944f, +0.007896f, +0.041314f, -0.003185f, +0.011159f, +0.010022f, -0.014232f, -0.008501f, +0.005764f, +0.012095f, + +0.019009f, -0.012935f, -0.010109f, +0.001820f, -0.001246f, +0.007009f, +0.011315f, -0.008956f, -0.000323f, +0.003821f, + -0.002091f, +0.002615f, -0.008131f, -0.007135f, -0.001931f, -0.002966f, -0.011211f, -0.014177f, +0.000768f, -0.000177f, + +0.003521f, -0.013853f, -0.002258f, -0.002884f, +0.002429f, -0.006246f, -0.004767f, +0.006367f, -0.004168f, -0.007428f, + -0.002224f, -0.004918f, +0.004195f, -0.010085f, -0.004806f, -0.000031f, +0.002522f, +0.004336f, +0.001648f, -0.004197f, + +0.000286f, +0.002509f, +0.000368f, +0.001830f, -0.001519f, -0.003869f, +0.002741f, -0.000167f, -0.001672f, +0.002536f, + +0.001091f, -0.001610f, -0.000777f, -0.001160f, +0.001010f, -0.000331f, -0.001323f, -0.002262f, +0.000755f, +0.001119f, + -0.002234f, -0.000363f, +0.000456f, -0.000254f, +0.000648f, -0.000899f + }, + { + +0.003854f, -0.005241f, -0.013175f, -0.007808f, +0.003148f, +0.000408f, -0.002415f, +0.003183f, +0.000263f, -0.012744f, + +0.001433f, +0.004313f, +0.007752f, +0.003989f, +0.102062f, +0.051866f, -0.070870f, +0.036053f, +0.051680f, +0.034127f, + +0.022203f, -0.004150f, +0.008251f, -0.004006f, -0.019668f, +0.018883f, -0.039495f, +0.007470f, +0.023762f, -0.023604f, + +0.043474f, -0.001595f, -0.012465f, -0.009035f, -0.010784f, -0.021719f, +0.032170f, +0.007994f, +0.003807f, +0.008424f, + -0.005822f, +0.008939f, -0.001193f, +0.010405f, -0.003781f, -0.007847f, +0.015873f, +0.004424f, -0.002354f, +0.015194f, + -0.001625f, -0.003201f, +0.002808f, +0.002961f, +0.003349f, +0.000085f, -0.006784f, -0.003837f, +0.012849f, +0.000854f, + +0.005928f, -0.007897f, +0.003430f, +0.001301f, +0.002018f, -0.001183f, +0.004093f, +0.002773f, -0.003869f, +0.000563f, + +0.007178f, -0.005208f, +0.001732f, +0.003738f, +0.002680f, -0.001855f, -0.001400f, +0.000508f, -0.000781f, -0.001458f, + +0.000588f, -0.000313f, +0.001698f, -0.000793f, +0.001354f, -0.000708f, -0.002268f, +0.002992f, -0.000434f, +0.001110f, + -0.000584f, -0.000402f, +0.000610f, +0.001037f, -0.001852f, +0.000137f + }, + { + -0.067128f, -0.465579f, +0.061759f, +0.005608f, -0.000022f, +0.000399f, +0.006838f, +0.001813f, +0.002215f, -0.001673f, + +0.003948f, +0.015045f, -0.022695f, +0.010291f, -0.001357f, +0.006394f, -0.011750f, -0.044349f, +0.001180f, +0.011157f, + +0.000193f, -0.010938f, -0.016274f, +0.011603f, -0.016720f, +0.020661f, +0.015867f, +0.022511f, +0.033724f, +0.013471f, + -0.021633f, -0.029648f, +0.003135f, +0.011566f, -0.017397f, -0.003380f, +0.046684f, +0.009043f, +0.008059f, -0.018766f, + -0.011714f, -0.005363f, -0.007319f, +0.011482f, +0.006332f, -0.004958f, +0.009601f, +0.010964f, -0.009122f, -0.005417f, + -0.003740f, +0.002609f, -0.007223f, -0.002994f, -0.003428f, -0.005770f, +0.007055f, -0.004647f, -0.002313f, +0.003690f, + -0.002362f, -0.005370f, +0.001026f, +0.000255f, +0.000674f, +0.002573f, +0.000876f, -0.004332f, -0.000332f, +0.000032f, + +0.002557f, -0.005684f, +0.002434f, -0.007306f, +0.001154f, +0.006011f, -0.001279f, +0.004216f, +0.000226f, +0.001694f, + +0.000004f, -0.002571f, +0.004268f, -0.001379f, -0.000789f, +0.000202f, -0.001548f, -0.000281f, +0.001244f, +0.003345f, + +0.000167f, -0.000346f, -0.002797f, -0.001173f, +0.000560f, -0.000297f + }, + { + -0.000574f, -0.031017f, +0.009454f, -0.010840f, -0.002498f, -0.000062f, +0.000526f, -0.000723f, -0.010353f, -0.002803f, + +0.004587f, +0.006964f, -0.012954f, +0.035073f, +0.008731f, -0.012748f, +0.060099f, +0.000682f, -0.002743f, +0.042986f, + +0.005659f, +0.003988f, -0.002731f, -0.014590f, -0.013506f, +0.019642f, +0.003021f, +0.007642f, +0.001523f, +0.056445f, + +0.028378f, -0.011625f, -0.023836f, -0.001185f, +0.008403f, -0.008041f, +0.019030f, +0.025107f, +0.003460f, -0.001023f, + +0.011112f, +0.013143f, +0.002898f, -0.009316f, -0.006720f, -0.001278f, -0.003984f, -0.006134f, -0.020544f, -0.012861f, + +0.001222f, +0.007288f, +0.000109f, +0.001827f, +0.003066f, -0.012256f, -0.002219f, -0.002550f, -0.001679f, +0.001670f, + -0.001533f, +0.002303f, +0.003293f, -0.002649f, +0.001498f, +0.001813f, +0.003326f, +0.000929f, -0.002871f, +0.002058f, + +0.001423f, -0.004070f, -0.001664f, +0.003091f, -0.004938f, +0.001682f, +0.004651f, +0.005459f, -0.000132f, +0.000316f, + -0.000139f, +0.002000f, -0.005189f, +0.001000f, -0.002929f, -0.002889f, +0.001642f, +0.000308f, -0.000839f, +0.001921f, + +0.002101f, -0.002121f, -0.003275f, +0.001881f, -0.001449f, +0.000394f + }, + { + -0.032266f, -0.728063f, +0.039001f, +0.054079f, +0.001359f, -0.000431f, -0.017312f, -0.013230f, +0.015502f, -0.019371f, + +0.003024f, -0.027266f, -0.010564f, -0.003881f, +0.014361f, +0.006221f, -0.033908f, +0.007074f, -0.018362f, -0.020653f, + -0.017588f, -0.000219f, +0.000825f, -0.008154f, +0.008086f, -0.004217f, +0.004431f, -0.005062f, -0.011863f, +0.001413f, + -0.011293f, -0.000307f, +0.002630f, +0.000200f, -0.000961f, +0.001740f, -0.020219f, -0.019026f, -0.018662f, +0.006172f, + -0.005067f, +0.005663f, +0.000157f, -0.000492f, +0.011078f, -0.006580f, -0.002992f, -0.009074f, -0.005886f, +0.004997f, + -0.005910f, +0.004636f, -0.003054f, +0.011848f, -0.001923f, +0.004415f, +0.003685f, -0.000442f, +0.010519f, +0.001207f, + +0.006478f, +0.000255f, +0.001579f, +0.002063f, +0.004468f, -0.009908f, -0.000985f, +0.002278f, +0.001835f, +0.004192f, + -0.002636f, +0.002565f, -0.001147f, +0.002752f, +0.001554f, +0.000893f, +0.002065f, +0.003068f, -0.001678f, -0.000457f, + +0.000045f, +0.000490f, -0.000996f, -0.000919f, +0.001674f, -0.000878f, -0.002665f, -0.000391f, +0.000832f, +0.001644f, + -0.002914f, +0.003956f, -0.000583f, +0.000598f, -0.000912f, -0.001112f + }, + { + -0.000740f, -0.034338f, -0.008842f, +0.000111f, -0.004942f, +0.001034f, -0.001214f, -0.005156f, -0.003495f, -0.004614f, + +0.005968f, -0.003165f, -0.017248f, -0.026256f, +0.046575f, +0.011302f, -0.005139f, -0.002657f, +0.001176f, +0.040530f, + -0.008457f, -0.012067f, -0.004362f, -0.022631f, -0.003285f, +0.023217f, +0.012553f, +0.009948f, -0.020445f, +0.032026f, + -0.027655f, -0.010455f, -0.015766f, -0.002930f, -0.013561f, +0.017069f, -0.008500f, +0.008081f, +0.010308f, +0.001066f, + +0.009170f, +0.001426f, +0.001172f, -0.010373f, -0.019706f, +0.003617f, +0.004187f, +0.012948f, -0.009986f, +0.001924f, + -0.004828f, -0.009962f, +0.006941f, -0.008023f, +0.014825f, +0.001677f, -0.006555f, +0.002641f, -0.010104f, +0.003697f, + +0.002696f, -0.002969f, +0.000287f, +0.000343f, -0.008146f, +0.000044f, -0.000959f, +0.000046f, -0.002633f, -0.001639f, + -0.003473f, -0.003790f, +0.000143f, -0.002909f, -0.001308f, +0.001471f, -0.000495f, +0.003764f, -0.000956f, -0.000102f, + +0.002893f, -0.002593f, +0.003960f, +0.000278f, -0.004684f, +0.004760f, -0.002488f, +0.000357f, +0.000196f, -0.001109f, + +0.001269f, -0.001730f, -0.000848f, +0.000870f, -0.000765f, +0.002826f + }, + { + -0.141774f, -0.064875f, +0.052014f, +0.042377f, -0.008425f, +0.006794f, -0.013825f, +0.006107f, -0.012550f, -0.002393f, + -0.013868f, -0.003845f, +0.002015f, +0.017512f, -0.009116f, -0.016320f, -0.004877f, +0.005508f, +0.003675f, -0.008854f, + +0.013963f, -0.013822f, +0.001920f, -0.009948f, -0.003826f, +0.002598f, -0.001077f, +0.018473f, +0.008935f, +0.001599f, + -0.008009f, +0.017299f, -0.009075f, -0.013506f, -0.013544f, +0.021491f, -0.003994f, -0.004555f, -0.000135f, +0.022452f, + +0.013749f, +0.007017f, -0.007254f, -0.006498f, +0.004796f, +0.003486f, +0.008574f, +0.010752f, +0.008225f, +0.002308f, + -0.011228f, +0.000998f, +0.004567f, +0.010238f, +0.008050f, +0.005841f, -0.005674f, +0.006528f, +0.001437f, -0.002654f, + -0.000322f, +0.004360f, -0.003560f, +0.005091f, +0.002609f, +0.000212f, -0.001356f, +0.005201f, -0.001810f, -0.002978f, + +0.000386f, +0.000602f, -0.000774f, +0.002745f, +0.001859f, -0.000863f, +0.002524f, +0.000165f, -0.000407f, -0.001541f, + +0.004984f, +0.001408f, -0.000131f, +0.000104f, +0.001405f, +0.000048f, -0.001738f, -0.002496f, +0.002553f, +0.002087f, + -0.000331f, -0.002298f, +0.000594f, -0.001263f, +0.001661f, -0.000031f + }, + { + +0.002724f, +0.099670f, -0.042180f, -0.011262f, -0.008584f, -0.002469f, +0.010393f, +0.000714f, +0.011491f, -0.010846f, + +0.008161f, +0.017635f, +0.017529f, -0.029359f, +0.054432f, +0.012873f, +0.015576f, +0.013739f, +0.001630f, +0.018010f, + -0.005513f, -0.007676f, +0.020887f, -0.005733f, +0.016629f, +0.012219f, +0.029112f, -0.002160f, +0.018263f, +0.007881f, + +0.010048f, -0.003186f, -0.012910f, +0.000751f, -0.021142f, -0.000402f, -0.007019f, +0.005920f, +0.004428f, -0.003315f, + -0.014377f, +0.004460f, +0.013567f, -0.007498f, -0.004350f, +0.014707f, +0.000217f, +0.007190f, -0.005803f, -0.007808f, + -0.002052f, +0.002993f, +0.002631f, -0.001486f, +0.001401f, -0.002365f, +0.002143f, +0.002024f, +0.005093f, +0.008879f, + -0.004029f, -0.001626f, -0.002789f, -0.008650f, +0.004912f, +0.002184f, -0.003606f, -0.002733f, +0.006044f, +0.001990f, + -0.006523f, -0.001308f, +0.001239f, +0.008324f, -0.001767f, +0.000944f, +0.005011f, +0.001962f, -0.000038f, +0.000884f, + +0.000095f, -0.002056f, +0.000481f, -0.001540f, -0.003170f, -0.002528f, +0.001096f, +0.000339f, +0.000324f, -0.002253f, + +0.001720f, +0.000867f, -0.000367f, -0.000240f, +0.000863f, +0.000546f + }, + { + -0.049335f, -0.304949f, +0.087068f, -0.053716f, +0.009835f, -0.049000f, +0.028036f, +0.036952f, -0.004523f, -0.032410f, + +0.018595f, -0.001032f, -0.005186f, -0.010896f, +0.029262f, +0.013436f, +0.022618f, -0.007932f, +0.005301f, -0.032899f, + -0.015484f, -0.021765f, -0.003623f, +0.005752f, -0.016521f, +0.006383f, +0.005921f, +0.008670f, -0.009679f, -0.004360f, + +0.012228f, -0.006647f, +0.003113f, -0.020570f, -0.007320f, +0.012184f, -0.000325f, +0.008362f, -0.014359f, -0.005425f, + -0.007917f, -0.001417f, +0.010929f, +0.003057f, +0.017087f, +0.002040f, +0.000102f, +0.011652f, +0.001381f, +0.008855f, + -0.003300f, +0.003350f, -0.000205f, -0.003700f, -0.002683f, -0.003583f, +0.003283f, -0.001511f, +0.004643f, +0.003958f, + +0.008700f, +0.002812f, +0.001034f, -0.004703f, -0.000684f, -0.000648f, -0.001923f, -0.002253f, -0.002085f, -0.001493f, + +0.000779f, +0.001961f, +0.000781f, -0.001991f, +0.000528f, +0.000658f, +0.003164f, +0.001875f, -0.001898f, +0.000523f, + -0.001044f, -0.001388f, +0.001485f, -0.003632f, +0.002269f, -0.002892f, -0.001862f, +0.001037f, -0.002233f, +0.000192f, + -0.000473f, -0.002014f, +0.001085f, -0.001504f, -0.002091f, -0.001108f + }, + { + +0.006491f, -0.020018f, -0.029569f, +0.013315f, -0.020737f, +0.009196f, -0.025093f, +0.012979f, +0.006806f, -0.001067f, + -0.001035f, -0.003120f, -0.006192f, -0.023764f, -0.030949f, +0.002676f, +0.054955f, -0.032237f, +0.019735f, +0.006364f, + -0.015698f, -0.061885f, +0.019872f, -0.000828f, +0.005798f, +0.016195f, -0.001403f, +0.006635f, +0.002183f, -0.018981f, + +0.020949f, -0.039240f, +0.004778f, +0.006990f, -0.003142f, -0.000674f, +0.011265f, -0.003982f, +0.017556f, -0.011138f, + -0.000692f, +0.006897f, -0.006664f, +0.004917f, -0.006844f, -0.003394f, +0.008941f, -0.000471f, +0.001405f, -0.004794f, + -0.000234f, +0.000899f, -0.001134f, +0.001138f, +0.003738f, +0.000220f, -0.004814f, +0.002471f, -0.000462f, -0.001928f, + -0.007922f, +0.004887f, -0.004100f, -0.012486f, +0.000612f, -0.000327f, +0.006222f, +0.000748f, +0.001671f, +0.001147f, + +0.004613f, -0.006393f, -0.000825f, -0.003218f, -0.007784f, +0.002281f, +0.005081f, +0.000432f, -0.000614f, -0.001189f, + -0.001582f, -0.001782f, -0.000503f, -0.002332f, -0.003057f, -0.003792f, -0.004528f, +0.000097f, -0.002558f, -0.001032f, + +0.003399f, +0.000283f, +0.001974f, -0.000755f, +0.000501f, +0.000768f + }, + { + +0.040617f, +0.473019f, +0.008585f, +0.036434f, +0.053918f, +0.027498f, +0.058263f, +0.045043f, -0.019841f, +0.040506f, + +0.017397f, +0.001694f, +0.000004f, -0.003507f, +0.010359f, +0.014151f, +0.001643f, -0.022722f, -0.030094f, -0.024081f, + -0.006798f, -0.018826f, +0.014653f, -0.001704f, +0.003525f, +0.002121f, -0.018648f, -0.023548f, +0.008073f, +0.003875f, + +0.001670f, +0.013724f, +0.015636f, -0.006834f, -0.005519f, +0.020757f, +0.002470f, +0.009263f, -0.007087f, -0.004182f, + +0.011920f, +0.010793f, -0.000071f, +0.010384f, +0.006178f, -0.009365f, -0.002190f, -0.022847f, -0.012858f, -0.013635f, + -0.007388f, -0.015467f, +0.008254f, -0.001273f, +0.008203f, +0.007791f, +0.004526f, -0.003418f, -0.008342f, -0.003466f, + +0.002383f, -0.001731f, +0.001551f, +0.001059f, -0.000555f, -0.006971f, -0.007005f, -0.001537f, -0.002241f, +0.001524f, + -0.005259f, +0.000735f, -0.004400f, -0.002580f, +0.001181f, +0.003909f, +0.002277f, -0.005005f, -0.000239f, -0.005072f, + +0.001654f, +0.000025f, -0.001549f, +0.001957f, -0.001930f, -0.002575f, +0.000715f, -0.002738f, +0.001539f, -0.003409f, + -0.001677f, -0.001352f, -0.001541f, +0.002014f, -0.000295f, -0.001254f + }, + { + +0.003317f, -0.132928f, +0.000903f, -0.011154f, +0.001483f, -0.002953f, -0.017087f, -0.000607f, +0.006278f, +0.013081f, + +0.009324f, +0.031538f, -0.014726f, +0.020458f, +0.088671f, +0.045601f, -0.038899f, +0.021677f, +0.024010f, -0.040746f, + -0.036484f, -0.023664f, -0.025068f, -0.018151f, -0.028947f, -0.006135f, -0.031233f, -0.010575f, +0.007043f, -0.015425f, + +0.023733f, -0.005361f, +0.003268f, +0.007077f, +0.002618f, -0.005717f, +0.002402f, -0.000122f, +0.003330f, +0.003424f, + +0.008736f, -0.003671f, +0.000713f, -0.013052f, -0.003900f, +0.016696f, -0.005932f, +0.011102f, +0.003935f, -0.000803f, + -0.003526f, +0.004902f, +0.004571f, -0.002649f, -0.012804f, +0.000645f, +0.006065f, +0.001252f, -0.004793f, +0.008931f, + -0.003751f, -0.001193f, +0.000198f, -0.004610f, -0.005504f, +0.000289f, +0.000753f, +0.001587f, +0.001623f, -0.003465f, + -0.004018f, -0.007685f, +0.000207f, +0.001090f, +0.001383f, -0.002263f, -0.001331f, -0.001258f, +0.003937f, +0.004702f, + -0.000791f, +0.000671f, +0.002484f, +0.003254f, -0.000210f, -0.001715f, +0.000080f, -0.000043f, +0.004425f, +0.001555f, + +0.001673f, +0.000597f, +0.001404f, -0.000291f, +0.000538f, +0.001686f + }, + { + +0.064501f, +0.162786f, -0.038154f, +0.067782f, +0.042634f, +0.011483f, +0.024196f, +0.013688f, +0.002656f, +0.016277f, + -0.023351f, +0.003003f, +0.011512f, +0.006780f, +0.041301f, -0.013537f, -0.010934f, -0.018638f, -0.041193f, +0.004134f, + -0.001390f, -0.000179f, -0.007508f, -0.012175f, +0.023614f, +0.006242f, -0.011806f, +0.008162f, -0.004855f, +0.039082f, + -0.015074f, +0.013939f, +0.012162f, +0.012437f, -0.010671f, -0.009957f, -0.013322f, -0.008178f, +0.010317f, -0.004585f, + -0.014961f, +0.009504f, +0.005609f, +0.009615f, -0.012025f, -0.001929f, +0.000637f, +0.003939f, +0.002070f, -0.011520f, + +0.005692f, +0.001594f, +0.000836f, +0.001921f, +0.003060f, +0.005155f, -0.000402f, -0.004019f, -0.004983f, -0.001847f, + -0.002723f, +0.007375f, -0.002153f, -0.003129f, -0.004705f, +0.002790f, -0.001791f, +0.001472f, +0.009699f, -0.003214f, + -0.003092f, -0.002697f, -0.003051f, +0.002460f, -0.004964f, +0.003579f, +0.003100f, -0.000896f, -0.001925f, -0.004918f, + -0.002152f, +0.003305f, -0.000303f, +0.001254f, +0.002116f, -0.005202f, +0.004960f, +0.000009f, -0.002276f, +0.000372f, + -0.000202f, -0.001001f, -0.000895f, -0.002197f, +0.002316f, +0.000281f + } + }, + { + { + -0.002409f, -0.043268f, -0.000837f, -0.021804f, +0.021078f, +0.003336f, -0.003907f, +0.003277f, -0.007606f, +0.005754f, + +0.010194f, +0.014534f, +0.004834f, +0.007950f, +0.021007f, -0.050579f, +0.008749f, +0.022643f, +0.002474f, -0.028729f, + -0.050781f, +0.015195f, -0.013374f, +0.001838f, +0.036621f, +0.006772f, -0.006804f, -0.030664f, -0.000145f, -0.023128f, + -0.011420f, -0.011592f, -0.013280f, -0.003781f, +0.012759f, +0.012716f, +0.009518f, -0.008354f, -0.016620f, -0.002016f, + -0.001760f, -0.012975f, -0.004057f, +0.002683f, -0.000801f, -0.011670f, -0.014894f, -0.000940f, -0.002718f, +0.014348f, + +0.008387f, -0.012961f, -0.001499f, -0.006405f, +0.003717f, +0.007951f, +0.001026f, -0.000848f, +0.003860f, -0.004171f, + -0.003834f, +0.003431f, +0.005548f, +0.002119f, +0.004560f, -0.004085f, -0.001168f, +0.001533f, -0.003545f, -0.002541f, + -0.000704f, +0.000100f, -0.000940f, -0.001270f, -0.002161f, -0.001125f, -0.000233f, -0.000080f, -0.003554f, -0.000361f, + -0.004155f, -0.001295f, -0.000608f, +0.004141f, +0.003319f, -0.003329f, -0.000829f, +0.000094f, -0.000541f, -0.000936f, + +0.000345f, +0.000628f, +0.001249f, +0.000947f, +0.000307f, +0.000658f + }, + { + -0.009906f, -0.425455f, -0.009219f, -0.065060f, -0.045708f, +0.005079f, -0.000163f, -0.030680f, +0.017595f, -0.014208f, + -0.039440f, +0.012564f, +0.011949f, -0.011636f, -0.020988f, -0.002910f, -0.017015f, +0.013362f, -0.001871f, -0.008914f, + -0.017215f, +0.011819f, -0.011271f, -0.023385f, +0.003856f, -0.004703f, -0.001470f, +0.010002f, +0.007287f, +0.013816f, + +0.003637f, -0.007833f, -0.001314f, -0.017588f, +0.004656f, -0.002737f, -0.004976f, +0.002363f, -0.000054f, -0.015990f, + -0.007796f, -0.002326f, +0.000564f, -0.002293f, -0.000294f, -0.006573f, -0.011531f, -0.015667f, +0.000684f, +0.003729f, + +0.008746f, +0.004763f, +0.001523f, -0.006869f, -0.004486f, +0.008452f, +0.006240f, +0.000000f, +0.004332f, -0.001337f, + -0.002636f, -0.003341f, -0.005250f, -0.003837f, -0.004148f, -0.000467f, -0.001551f, +0.001676f, -0.005766f, -0.001493f, + +0.003444f, +0.001476f, -0.002542f, +0.002101f, -0.002178f, +0.000795f, -0.002006f, -0.001897f, -0.004073f, -0.001140f, + -0.002966f, +0.002193f, +0.000722f, -0.000951f, +0.001439f, +0.001072f, +0.000769f, +0.000067f, +0.000354f, +0.001471f, + -0.001295f, -0.000528f, +0.001541f, +0.001183f, +0.001681f, +0.000711f + }, + { + -0.005462f, -0.101151f, -0.034630f, -0.046397f, +0.007588f, -0.004295f, -0.009269f, +0.006016f, +0.000657f, +0.003437f, + +0.027697f, -0.004956f, -0.030750f, +0.020033f, -0.011498f, -0.011066f, +0.014803f, +0.004206f, -0.015419f, +0.023839f, + +0.000823f, +0.013036f, +0.030206f, -0.001424f, +0.011023f, +0.013118f, -0.006043f, -0.012298f, +0.002170f, +0.018981f, + +0.008522f, -0.008110f, +0.006997f, -0.008992f, +0.003981f, +0.009357f, +0.003202f, +0.000119f, -0.006075f, -0.009224f, + +0.014713f, +0.003714f, -0.007502f, -0.011637f, -0.002760f, +0.000617f, -0.013728f, -0.008850f, -0.002853f, +0.003309f, + -0.003250f, -0.006519f, -0.000844f, +0.000319f, +0.002326f, -0.011046f, -0.001455f, +0.000908f, -0.003315f, -0.006153f, + -0.005449f, -0.000512f, -0.001603f, -0.004617f, -0.005766f, +0.002409f, -0.000290f, +0.001807f, +0.000967f, +0.002409f, + -0.000522f, +0.000367f, +0.002797f, +0.002144f, -0.002082f, -0.005164f, +0.004716f, +0.000417f, -0.000647f, +0.001376f, + +0.000522f, +0.000738f, -0.001759f, -0.002206f, -0.000009f, -0.000839f, -0.003094f, +0.000629f, -0.000520f, +0.000182f, + -0.000691f, -0.000388f, -0.000607f, -0.000363f, +0.000135f, -0.000451f + }, + { + -0.002664f, -0.029099f, +0.010900f, +0.003282f, -0.004181f, +0.001481f, -0.001428f, +0.001961f, +0.002318f, -0.006184f, + -0.002268f, +0.004781f, -0.009906f, +0.019019f, +0.105888f, +0.001351f, -0.016434f, +0.026064f, +0.059357f, +0.025707f, + +0.012347f, +0.023860f, -0.004299f, +0.001193f, +0.006971f, -0.032871f, +0.000757f, +0.025362f, -0.001665f, -0.002047f, + +0.011338f, +0.019354f, -0.011859f, -0.019849f, -0.013433f, +0.009512f, +0.008298f, +0.022459f, +0.007485f, -0.003692f, + +0.000531f, -0.005783f, +0.002203f, +0.007991f, +0.007351f, +0.000713f, +0.010625f, -0.003041f, +0.006226f, +0.009263f, + -0.000606f, -0.002723f, +0.004210f, +0.004237f, -0.000621f, -0.004127f, -0.004602f, +0.004049f, +0.002298f, +0.005009f, + +0.004825f, +0.002355f, +0.000473f, -0.002144f, +0.004310f, -0.004850f, +0.006829f, +0.000165f, +0.000811f, +0.000266f, + +0.002724f, -0.001852f, +0.002894f, +0.000697f, +0.000817f, +0.001059f, +0.001065f, -0.000069f, -0.000546f, -0.002541f, + +0.001783f, -0.000970f, -0.001334f, +0.001638f, +0.001374f, -0.002654f, +0.000040f, +0.002096f, +0.000850f, -0.000686f, + -0.001290f, +0.000125f, +0.001606f, -0.000593f, +0.000302f, -0.001216f + }, + { + +0.026684f, -0.437979f, -0.055388f, -0.017904f, +0.018503f, +0.007291f, -0.001253f, -0.004771f, +0.018291f, +0.004182f, + +0.017410f, -0.027357f, -0.000233f, -0.000658f, +0.009680f, -0.018093f, +0.001561f, -0.041348f, +0.003299f, +0.007387f, + -0.001270f, +0.017516f, -0.033140f, -0.013388f, +0.001922f, +0.000218f, +0.027747f, +0.053664f, +0.005920f, +0.003678f, + -0.014750f, -0.022877f, +0.006649f, +0.006565f, -0.018447f, +0.000648f, +0.014339f, +0.018671f, +0.017323f, -0.013286f, + -0.007226f, -0.005307f, +0.008458f, -0.006456f, -0.001625f, +0.009949f, +0.009120f, -0.002680f, +0.000151f, -0.002993f, + -0.002966f, -0.006268f, -0.003415f, -0.005846f, +0.001506f, -0.000259f, -0.000644f, -0.004624f, -0.000954f, +0.004511f, + -0.002300f, -0.005805f, +0.000577f, -0.002535f, +0.001416f, +0.000758f, -0.000291f, -0.001519f, -0.002162f, +0.002265f, + -0.000432f, -0.002808f, -0.002353f, -0.002583f, +0.002218f, +0.002993f, +0.002527f, +0.000606f, +0.001391f, +0.000897f, + -0.000016f, -0.001238f, +0.002098f, -0.000363f, +0.001791f, -0.003268f, -0.001766f, +0.000500f, +0.001522f, +0.003116f, + +0.000452f, -0.001946f, -0.002379f, -0.000041f, -0.000822f, +0.000417f + }, + { + -0.001389f, -0.021550f, +0.002172f, -0.015177f, -0.000359f, +0.000319f, +0.000466f, +0.001474f, -0.005473f, -0.001484f, + -0.002180f, +0.000762f, -0.007418f, +0.023905f, +0.075064f, -0.022182f, +0.011133f, +0.002903f, -0.001654f, +0.026774f, + +0.014517f, -0.004375f, +0.020426f, -0.013838f, -0.020935f, +0.020072f, +0.028322f, -0.007384f, +0.028124f, +0.016301f, + +0.021270f, -0.014350f, -0.012324f, +0.011125f, -0.003280f, -0.019702f, +0.024785f, +0.020897f, +0.009689f, +0.000044f, + +0.012424f, +0.005149f, +0.010532f, -0.006643f, -0.006931f, -0.004233f, -0.003576f, -0.009575f, -0.013275f, -0.012330f, + +0.001184f, +0.006804f, +0.005446f, -0.000831f, +0.000993f, -0.001853f, -0.009412f, +0.000881f, -0.007961f, +0.001867f, + +0.000985f, +0.004110f, +0.002699f, -0.001078f, +0.002610f, +0.000619f, +0.002571f, -0.002737f, -0.000806f, +0.003827f, + -0.002239f, -0.002505f, +0.000644f, +0.000475f, -0.001387f, +0.002083f, +0.004282f, +0.003656f, +0.001228f, -0.001470f, + +0.003066f, -0.002014f, -0.002335f, -0.000812f, -0.002912f, -0.001546f, +0.000511f, +0.000693f, -0.000078f, +0.001050f, + +0.001205f, -0.000424f, -0.002319f, -0.000035f, +0.000333f, -0.000696f + }, + { + -0.023276f, -0.611765f, -0.075708f, +0.029662f, +0.043210f, -0.006824f, -0.001197f, -0.022047f, +0.011409f, -0.014189f, + -0.008889f, -0.020879f, -0.000265f, -0.018306f, +0.015260f, -0.005440f, -0.024199f, -0.007253f, +0.002295f, -0.033721f, + -0.003336f, -0.000600f, -0.000785f, -0.004007f, +0.001518f, -0.004970f, +0.005127f, -0.008460f, -0.010995f, -0.003065f, + -0.000746f, +0.010170f, -0.014860f, +0.002925f, +0.008008f, -0.002925f, -0.014759f, -0.013627f, -0.026016f, -0.004479f, + -0.005134f, +0.005865f, -0.001716f, -0.005254f, +0.012841f, +0.006173f, -0.009841f, -0.006101f, +0.000548f, +0.001528f, + -0.005752f, +0.001380f, +0.006929f, -0.003971f, +0.009033f, +0.002502f, +0.006597f, +0.000235f, +0.005602f, +0.006760f, + -0.002180f, +0.001724f, +0.004590f, +0.001493f, -0.001496f, -0.001955f, -0.000605f, -0.000726f, -0.002530f, +0.004362f, + -0.000215f, +0.000617f, +0.001935f, +0.001990f, +0.000898f, -0.000939f, +0.001640f, +0.002738f, -0.000262f, -0.000818f, + +0.001572f, -0.000735f, +0.001710f, -0.000720f, -0.000012f, +0.000097f, -0.003241f, -0.000634f, +0.000322f, -0.000132f, + +0.001136f, +0.002170f, +0.000858f, -0.000265f, -0.000444f, -0.001333f + }, + { + -0.002302f, -0.014503f, -0.019689f, -0.010469f, +0.000880f, -0.000681f, -0.001493f, +0.000615f, -0.012107f, -0.001069f, + -0.003184f, +0.000060f, -0.011956f, -0.023309f, +0.064237f, -0.050436f, +0.015479f, +0.030286f, -0.002215f, +0.001184f, + -0.010984f, +0.012986f, -0.002952f, -0.012744f, +0.004772f, -0.001077f, +0.004852f, +0.041636f, -0.042499f, +0.031905f, + -0.024333f, -0.006079f, -0.026810f, -0.018759f, +0.020464f, +0.003003f, +0.005182f, -0.003737f, +0.010290f, +0.008081f, + +0.012382f, +0.002511f, -0.001763f, -0.019275f, -0.016976f, +0.007840f, +0.006027f, +0.004785f, -0.004800f, +0.004778f, + -0.003893f, -0.005899f, -0.001971f, +0.002722f, +0.006995f, -0.001256f, -0.002578f, -0.001984f, -0.003511f, +0.000638f, + +0.004959f, -0.002009f, -0.000531f, -0.000373f, -0.004082f, -0.004995f, +0.000668f, +0.004121f, -0.005083f, -0.001863f, + -0.002317f, -0.001554f, -0.001793f, +0.000342f, -0.002548f, -0.000036f, +0.000224f, +0.003447f, -0.001896f, +0.001118f, + +0.000834f, -0.000334f, +0.001781f, -0.000029f, +0.001159f, +0.000666f, -0.000408f, -0.001790f, +0.001456f, +0.000294f, + +0.000349f, -0.001343f, -0.001820f, -0.000241f, +0.000547f, +0.001803f + }, + { + +0.103698f, -0.243994f, -0.089203f, +0.007699f, +0.055970f, -0.002233f, +0.000983f, -0.019505f, -0.007726f, +0.014469f, + -0.037414f, -0.019412f, +0.015797f, +0.013351f, -0.000191f, +0.004856f, +0.004672f, +0.004520f, -0.006298f, +0.008605f, + +0.005124f, -0.016803f, -0.000022f, -0.003730f, -0.006005f, +0.008862f, +0.007937f, +0.010427f, +0.010559f, +0.004937f, + +0.004158f, -0.001361f, -0.003817f, -0.006302f, -0.014972f, +0.006357f, +0.005817f, -0.004071f, +0.000331f, +0.015423f, + +0.027111f, +0.000597f, -0.004251f, -0.002129f, -0.004816f, +0.007899f, +0.013425f, +0.006463f, -0.000546f, +0.001687f, + -0.003062f, +0.003395f, +0.003687f, +0.009653f, +0.010427f, -0.003718f, +0.001386f, -0.000615f, +0.001903f, -0.001395f, + +0.004341f, -0.000319f, +0.001533f, +0.000226f, +0.003847f, -0.000387f, -0.000892f, +0.002208f, -0.001663f, -0.003438f, + +0.000370f, +0.002485f, +0.000325f, +0.001142f, +0.005137f, -0.000419f, +0.001364f, -0.000277f, -0.001605f, +0.002174f, + +0.002368f, +0.001313f, -0.000995f, +0.001196f, +0.000697f, -0.001681f, +0.001818f, -0.001202f, -0.000199f, +0.001836f, + +0.000626f, -0.002273f, -0.001337f, +0.001602f, +0.000857f, -0.001807f + }, + { + -0.003943f, +0.034798f, +0.023899f, -0.038661f, +0.004360f, -0.009683f, +0.022942f, -0.001734f, -0.001002f, +0.005445f, + +0.008132f, +0.020271f, +0.006596f, -0.026315f, +0.064534f, -0.005287f, +0.025935f, +0.019195f, +0.025675f, -0.012376f, + -0.001633f, +0.022224f, +0.010530f, +0.001679f, +0.007443f, +0.003351f, +0.033167f, +0.003972f, +0.001118f, +0.014804f, + +0.016865f, -0.002986f, -0.003290f, -0.016058f, -0.005937f, -0.008070f, -0.005556f, +0.006761f, +0.011645f, -0.007975f, + -0.014289f, +0.006719f, +0.006233f, -0.000675f, -0.005054f, +0.012691f, +0.002535f, +0.000780f, -0.006666f, +0.003470f, + -0.001543f, +0.001864f, -0.003262f, +0.004306f, -0.003039f, -0.001135f, +0.002769f, +0.006649f, +0.008216f, -0.002392f, + -0.004220f, +0.001886f, -0.003598f, -0.008969f, +0.000291f, -0.001550f, -0.000334f, +0.003538f, +0.003897f, -0.003456f, + -0.002608f, -0.003318f, +0.003409f, +0.005743f, +0.003248f, +0.000540f, +0.003510f, +0.000036f, +0.000394f, +0.001424f, + -0.000710f, +0.000415f, +0.000638f, +0.000860f, -0.005522f, -0.003438f, +0.001312f, +0.000538f, +0.001408f, -0.001202f, + +0.000898f, +0.001408f, +0.000469f, -0.000352f, -0.000343f, +0.000809f + }, + { + +0.041241f, -0.239305f, -0.049526f, -0.033275f, -0.013919f, +0.033893f, -0.037738f, +0.010255f, +0.011648f, -0.008807f, + -0.001090f, +0.000035f, +0.022528f, -0.011463f, +0.005390f, +0.018350f, +0.019709f, -0.003103f, -0.000288f, -0.015292f, + -0.045097f, +0.005248f, -0.009166f, -0.003489f, +0.000322f, -0.003689f, -0.003808f, +0.014937f, -0.004416f, -0.006222f, + +0.008523f, -0.005376f, -0.002960f, -0.006807f, -0.010251f, -0.005002f, +0.008567f, +0.005300f, -0.018867f, +0.004501f, + +0.001762f, -0.008140f, +0.003684f, +0.011128f, +0.013442f, +0.003935f, -0.002898f, +0.010755f, +0.000173f, +0.000866f, + +0.002185f, +0.008630f, -0.003483f, -0.000360f, -0.004062f, -0.006805f, +0.002052f, +0.000780f, +0.005977f, +0.001185f, + +0.012113f, +0.001699f, +0.003639f, -0.005105f, +0.001267f, -0.000716f, -0.001070f, -0.004472f, -0.000054f, -0.002436f, + +0.000578f, +0.002832f, -0.000569f, -0.001435f, +0.000270f, +0.004193f, +0.000699f, +0.000315f, -0.000532f, -0.000494f, + -0.000426f, -0.002117f, +0.001502f, +0.000299f, -0.002329f, +0.000128f, -0.001692f, +0.000222f, -0.000362f, -0.001301f, + -0.000221f, -0.000556f, -0.001591f, -0.000767f, -0.001567f, -0.000577f + }, + { + -0.005700f, -0.052324f, +0.013349f, +0.003760f, -0.010448f, -0.007867f, -0.011998f, +0.009468f, +0.006310f, +0.006855f, + +0.002886f, -0.009771f, -0.006195f, -0.020492f, -0.055444f, +0.042932f, +0.022178f, -0.003891f, -0.018541f, +0.027447f, + -0.030121f, -0.024559f, +0.017764f, -0.007749f, -0.006398f, -0.003252f, +0.010877f, +0.009569f, +0.004754f, +0.015690f, + -0.012924f, -0.015171f, -0.011123f, +0.006235f, -0.005975f, +0.008526f, -0.007558f, +0.014060f, +0.004730f, -0.001041f, + -0.002326f, +0.006613f, -0.012208f, +0.002567f, -0.002360f, -0.009479f, +0.012571f, +0.002185f, +0.004082f, -0.009246f, + -0.000001f, +0.002851f, -0.000870f, +0.001904f, +0.001928f, -0.000040f, -0.000839f, -0.003443f, +0.003197f, -0.009808f, + +0.001347f, +0.002756f, -0.011074f, -0.003977f, +0.000172f, +0.000261f, +0.003080f, +0.004753f, -0.003129f, +0.003965f, + +0.003586f, -0.005927f, -0.002024f, -0.002214f, -0.005124f, +0.001325f, +0.005035f, +0.000434f, -0.000968f, -0.003009f, + -0.000398f, +0.000268f, -0.004497f, -0.001584f, -0.001877f, -0.002827f, -0.005182f, -0.002272f, -0.000667f, -0.001608f, + +0.002238f, +0.000236f, +0.001664f, -0.000743f, +0.000006f, +0.001671f + }, + { + +0.028170f, +0.443481f, +0.052738f, +0.031704f, +0.055632f, +0.063672f, +0.029775f, +0.018372f, +0.005659f, +0.018960f, + +0.029101f, +0.003610f, -0.003180f, -0.021330f, +0.014566f, +0.031703f, -0.032509f, +0.012358f, -0.024398f, -0.012334f, + -0.025354f, -0.018325f, +0.000090f, +0.000195f, +0.009480f, +0.012885f, -0.025377f, -0.000257f, -0.003982f, -0.002271f, + +0.005461f, +0.010335f, +0.010201f, +0.000367f, +0.003185f, +0.008082f, +0.005677f, +0.000415f, +0.000891f, +0.006122f, + +0.007005f, -0.005470f, +0.011877f, +0.001225f, +0.008733f, -0.006858f, -0.000220f, -0.018515f, -0.023878f, -0.014758f, + -0.002609f, -0.011360f, +0.003181f, +0.010283f, +0.007918f, +0.004053f, +0.005806f, -0.009705f, -0.004782f, -0.003463f, + +0.002897f, +0.000115f, -0.001281f, +0.000835f, -0.000755f, -0.005343f, -0.006076f, -0.002278f, -0.000000f, -0.001994f, + -0.006922f, +0.001349f, -0.002878f, -0.003442f, +0.002670f, +0.001575f, +0.000722f, -0.000275f, -0.000584f, -0.005085f, + -0.000075f, -0.001252f, +0.000990f, -0.000865f, -0.001187f, -0.003914f, -0.001540f, -0.000102f, +0.000988f, -0.002885f, + -0.002941f, -0.000263f, -0.000215f, -0.000022f, -0.000640f, -0.000793f + }, + { + -0.001217f, -0.116855f, -0.003782f, -0.005846f, +0.000236f, -0.010071f, -0.008898f, -0.006162f, +0.006074f, +0.005505f, + +0.017047f, +0.014950f, +0.026071f, -0.019274f, +0.154294f, -0.004877f, +0.013044f, -0.014577f, +0.033255f, -0.040182f, + -0.027412f, -0.030630f, -0.028630f, -0.029247f, -0.010025f, -0.019827f, -0.032227f, -0.006575f, -0.027476f, +0.008436f, + +0.014025f, -0.010689f, +0.018075f, +0.000774f, +0.000277f, -0.006134f, +0.007532f, -0.004415f, -0.000781f, +0.006990f, + +0.010685f, +0.000744f, -0.000265f, -0.018701f, -0.004349f, +0.003526f, +0.020245f, +0.005318f, -0.003034f, -0.000308f, + -0.000346f, +0.007597f, +0.000476f, -0.006589f, -0.003901f, -0.006471f, +0.001665f, +0.000128f, +0.001997f, -0.000133f, + +0.004978f, +0.001759f, -0.001762f, -0.006774f, -0.003215f, -0.000874f, -0.001312f, +0.002896f, -0.000117f, +0.000763f, + -0.004199f, -0.009778f, -0.001714f, +0.001018f, +0.004241f, -0.002157f, -0.003905f, +0.000633f, +0.004194f, +0.002250f, + +0.003043f, -0.000175f, +0.000968f, +0.002218f, -0.000902f, -0.000099f, -0.001442f, +0.000967f, +0.003653f, +0.003335f, + +0.000932f, +0.000160f, -0.000400f, +0.000741f, +0.000359f, +0.001439f + }, + { + -0.035979f, +0.260265f, +0.010535f, +0.058886f, +0.048701f, +0.001147f, +0.008272f, +0.002554f, +0.014733f, +0.007370f, + -0.012025f, +0.006598f, +0.006239f, +0.026456f, +0.004964f, -0.003777f, +0.012387f, -0.017912f, -0.038292f, -0.004655f, + -0.001036f, +0.005620f, +0.003879f, -0.006657f, +0.008235f, +0.000837f, -0.010590f, -0.010832f, +0.020655f, +0.007281f, + +0.010674f, +0.004752f, +0.016985f, +0.001313f, +0.001366f, -0.014922f, -0.008637f, -0.000196f, +0.000057f, -0.014035f, + +0.002898f, -0.014284f, +0.003020f, +0.019202f, -0.010028f, -0.003163f, -0.002958f, +0.004089f, -0.001421f, -0.003024f, + +0.004164f, +0.002340f, -0.000125f, +0.000715f, +0.005169f, +0.002161f, -0.000481f, -0.006521f, -0.002681f, +0.000587f, + +0.000359f, +0.002449f, +0.000809f, -0.006584f, +0.002070f, -0.000682f, +0.000257f, +0.004099f, +0.002668f, -0.002878f, + -0.001649f, -0.002841f, -0.003605f, +0.000185f, -0.001082f, +0.001183f, +0.002821f, -0.000849f, -0.000502f, -0.002005f, + -0.004327f, +0.001486f, -0.001728f, +0.004036f, -0.001348f, +0.000407f, +0.001516f, +0.000128f, -0.001162f, +0.002103f, + -0.000721f, -0.003404f, -0.001847f, +0.000873f, +0.000079f, -0.000331f + } + }, + { + { + +0.002178f, -0.012052f, +0.018461f, -0.028448f, +0.014607f, -0.000363f, -0.003940f, +0.004568f, +0.000569f, +0.000663f, + -0.013744f, +0.022319f, +0.012097f, -0.024065f, +0.005546f, -0.043245f, +0.006952f, +0.012753f, +0.000141f, +0.000399f, + -0.052357f, +0.001493f, -0.020711f, +0.002435f, +0.040137f, +0.020445f, +0.013271f, -0.024544f, +0.006373f, -0.006744f, + +0.001367f, -0.013415f, -0.006043f, +0.011906f, +0.011933f, +0.002301f, -0.000250f, +0.011003f, +0.004173f, +0.003949f, + -0.000420f, -0.009598f, +0.002179f, +0.009611f, +0.003262f, -0.001552f, +0.003867f, +0.007481f, -0.004525f, +0.005883f, + +0.003840f, -0.008903f, +0.004515f, -0.003183f, -0.001411f, +0.000761f, +0.000496f, -0.002233f, +0.003482f, -0.001033f, + +0.002321f, +0.003333f, +0.000181f, +0.002097f, +0.004955f, -0.001619f, -0.000908f, +0.000730f, -0.000256f, -0.001249f, + +0.001367f, +0.000466f, +0.001163f, +0.000605f, -0.003010f, -0.001190f, -0.001307f, +0.000288f, -0.002146f, -0.000607f, + -0.001629f, +0.001496f, +0.000317f, +0.001145f, +0.000541f, -0.002540f, -0.000094f, -0.000250f, -0.000086f, -0.001179f, + +0.001123f, -0.000038f, +0.000062f, +0.000690f, +0.000387f, +0.000234f + }, + { + +0.008567f, -0.289920f, +0.100177f, -0.009776f, -0.004973f, +0.007158f, +0.003418f, -0.020652f, +0.027951f, +0.000907f, + -0.032180f, +0.009064f, +0.008358f, -0.009722f, -0.007937f, +0.005188f, -0.010927f, +0.014627f, -0.006027f, +0.006476f, + -0.005018f, +0.010033f, -0.003022f, -0.002826f, +0.007035f, +0.004673f, +0.003244f, +0.004547f, -0.003974f, +0.002335f, + -0.000507f, -0.006903f, +0.003500f, -0.006949f, +0.002806f, -0.011471f, -0.000578f, +0.005705f, +0.002857f, +0.004302f, + +0.003040f, +0.001395f, +0.003533f, -0.000791f, +0.000950f, -0.003828f, -0.007626f, -0.004985f, +0.005475f, -0.000343f, + +0.002348f, -0.000152f, +0.004333f, +0.001846f, -0.001857f, +0.002185f, -0.000628f, -0.005322f, +0.002420f, -0.001275f, + -0.001549f, +0.001483f, +0.000724f, +0.000832f, -0.001915f, +0.003035f, +0.002355f, +0.003406f, -0.001357f, -0.000372f, + +0.001704f, +0.002010f, -0.000609f, +0.001111f, -0.002661f, +0.001786f, -0.000888f, +0.000499f, +0.000937f, +0.001203f, + -0.002981f, +0.000058f, -0.000341f, -0.000153f, +0.000388f, -0.000260f, +0.000754f, -0.001543f, +0.000139f, +0.000545f, + -0.001056f, -0.000234f, +0.000249f, -0.000318f, +0.000928f, -0.000099f + }, + { + +0.002682f, -0.019565f, +0.035110f, -0.031363f, +0.011324f, -0.000422f, -0.004103f, +0.008655f, -0.006384f, -0.002974f, + +0.026803f, -0.005020f, -0.018519f, +0.043118f, -0.002872f, -0.022928f, -0.008792f, -0.025045f, -0.025400f, +0.005024f, + -0.011282f, +0.009772f, +0.013687f, -0.006254f, -0.001731f, -0.000000f, -0.006854f, +0.000852f, +0.002140f, +0.006090f, + +0.000687f, -0.005073f, +0.011713f, -0.003496f, +0.004647f, +0.002590f, +0.005030f, +0.001703f, -0.004950f, -0.006618f, + +0.012626f, +0.004654f, -0.003221f, -0.002561f, +0.002170f, +0.003521f, -0.001476f, -0.003200f, -0.002567f, +0.004689f, + +0.000482f, -0.000206f, +0.000916f, +0.000499f, +0.004084f, -0.006613f, +0.001251f, -0.002046f, -0.005536f, -0.004439f, + -0.001067f, -0.000428f, -0.004144f, +0.001948f, -0.001151f, +0.000885f, -0.004550f, +0.000441f, -0.000022f, +0.001316f, + -0.000205f, +0.000066f, +0.002525f, +0.000545f, -0.001008f, -0.002478f, +0.003436f, -0.000891f, -0.001573f, +0.000575f, + -0.000377f, +0.001431f, -0.001830f, -0.002534f, -0.000146f, -0.000329f, -0.001321f, +0.001207f, -0.001341f, -0.000065f, + +0.000230f, -0.000896f, -0.001150f, +0.000104f, +0.000779f, +0.000555f + }, + { + +0.002836f, -0.043753f, -0.004679f, +0.008075f, -0.000714f, +0.000394f, -0.000304f, -0.000032f, -0.001593f, -0.002359f, + -0.002116f, +0.004684f, +0.001586f, +0.015029f, +0.054821f, -0.016801f, +0.001676f, -0.000611f, +0.042920f, -0.001047f, + -0.003659f, +0.019109f, -0.011065f, +0.005417f, +0.017577f, -0.018260f, +0.003782f, -0.000708f, -0.009578f, +0.008179f, + -0.009957f, -0.003980f, -0.009302f, -0.004395f, +0.000402f, +0.020801f, -0.015914f, +0.001972f, +0.008079f, -0.000280f, + +0.001994f, -0.010106f, +0.000011f, +0.009866f, +0.005154f, -0.005531f, +0.002585f, -0.004013f, +0.006470f, +0.004540f, + -0.002254f, -0.000296f, +0.000424f, +0.000105f, +0.000289f, -0.002143f, +0.000204f, +0.008278f, -0.003643f, +0.000778f, + +0.001577f, -0.001162f, -0.002766f, -0.001384f, +0.004244f, -0.006294f, +0.003637f, -0.001962f, +0.000974f, -0.001166f, + +0.000717f, -0.001713f, +0.000348f, -0.001132f, -0.000860f, -0.000459f, +0.001168f, -0.000815f, -0.000548f, -0.002493f, + +0.001362f, -0.000343f, -0.001990f, +0.001345f, +0.000304f, -0.002102f, +0.000737f, +0.000155f, +0.000403f, -0.000776f, + -0.001402f, +0.000056f, +0.000806f, -0.001945f, +0.000200f, -0.000615f + }, + { + +0.011501f, -0.306944f, +0.069632f, -0.037924f, -0.006455f, +0.001605f, -0.007381f, -0.010403f, +0.006364f, +0.006221f, + +0.003251f, -0.023547f, +0.014967f, -0.016105f, +0.015379f, -0.003458f, +0.012896f, -0.002221f, +0.015415f, -0.009124f, + -0.007123f, +0.021113f, -0.017713f, -0.012375f, +0.013588f, +0.002373f, +0.013836f, +0.020880f, -0.019175f, +0.004873f, + -0.000751f, -0.003474f, +0.010972f, +0.004685f, -0.008980f, +0.005296f, -0.006436f, +0.008522f, +0.014977f, -0.008113f, + +0.005698f, -0.004787f, +0.009149f, -0.004985f, +0.003103f, +0.002613f, +0.000160f, +0.000322f, +0.000640f, -0.003998f, + +0.004223f, -0.005192f, +0.001976f, -0.000321f, +0.002513f, +0.001563f, -0.004843f, -0.000923f, +0.007530f, +0.004809f, + -0.002051f, -0.004712f, +0.000446f, +0.001269f, +0.004818f, -0.000225f, -0.001471f, +0.001632f, -0.000047f, +0.001034f, + -0.001054f, -0.001321f, -0.001055f, +0.001906f, +0.002136f, +0.001684f, +0.002654f, -0.002014f, +0.000380f, +0.000109f, + +0.000364f, -0.000764f, +0.001497f, -0.000351f, +0.001562f, -0.001671f, -0.000107f, +0.000432f, +0.000802f, +0.001272f, + +0.000063f, -0.000412f, +0.000188f, +0.000817f, -0.000656f, +0.000062f + }, + { + +0.000108f, -0.007908f, +0.004688f, -0.001790f, +0.005209f, -0.001483f, -0.000323f, +0.005546f, -0.002301f, +0.001987f, + +0.001564f, -0.002724f, -0.009804f, +0.002704f, +0.078061f, -0.020533f, +0.001180f, +0.014991f, -0.006867f, +0.010899f, + -0.001203f, -0.022241f, +0.009190f, -0.007871f, +0.018549f, +0.013414f, -0.006277f, -0.012093f, +0.006091f, -0.029183f, + +0.003293f, -0.007052f, +0.003041f, +0.009589f, -0.003878f, -0.019571f, +0.003580f, -0.004445f, -0.000949f, +0.002523f, + +0.004000f, -0.015928f, +0.001810f, -0.002423f, +0.000141f, -0.000048f, +0.002270f, +0.002121f, +0.004943f, +0.003879f, + +0.000715f, -0.000576f, +0.004538f, +0.003618f, +0.000523f, -0.001190f, -0.005235f, +0.005369f, -0.003321f, +0.002018f, + -0.002387f, +0.000820f, +0.000851f, +0.000563f, +0.001970f, -0.003278f, +0.002598f, -0.002423f, -0.002987f, +0.001196f, + -0.002266f, -0.002204f, -0.000075f, +0.000256f, -0.001856f, -0.000250f, +0.001572f, +0.000641f, +0.000279f, -0.002365f, + +0.001306f, -0.001773f, +0.000101f, -0.000619f, -0.000544f, +0.000466f, +0.000176f, -0.000069f, -0.000059f, +0.000960f, + -0.000009f, +0.000761f, -0.000415f, -0.000480f, +0.000655f, -0.000570f + }, + { + +0.061308f, -0.358616f, +0.055074f, +0.003856f, -0.001251f, -0.003877f, +0.005355f, -0.032091f, -0.005225f, +0.008883f, + +0.013687f, -0.002746f, +0.010163f, -0.011706f, +0.006561f, -0.014450f, -0.019605f, -0.008672f, +0.007998f, -0.018842f, + +0.000863f, +0.004871f, +0.005600f, -0.001816f, +0.002415f, -0.002300f, +0.003885f, -0.004258f, -0.000361f, -0.004343f, + -0.002612f, +0.006527f, -0.012062f, +0.001944f, +0.001078f, +0.001520f, -0.004065f, +0.007277f, -0.009110f, -0.009756f, + -0.004022f, +0.009780f, +0.001451f, -0.003775f, +0.005358f, +0.009355f, -0.005511f, +0.002529f, +0.008639f, -0.002152f, + -0.003936f, +0.005202f, +0.005688f, -0.012157f, +0.005560f, +0.000428f, +0.004095f, -0.006046f, -0.002235f, +0.002675f, + -0.002889f, +0.001870f, +0.001870f, -0.001826f, -0.001134f, +0.001016f, -0.000044f, -0.000666f, -0.002412f, +0.001333f, + -0.001830f, -0.000371f, +0.000972f, -0.000073f, -0.000523f, -0.001840f, -0.000047f, -0.000414f, -0.000579f, -0.000427f, + +0.000712f, -0.001493f, +0.001177f, -0.000372f, -0.001050f, +0.001202f, -0.000667f, -0.000729f, -0.000393f, -0.000569f, + +0.001433f, +0.000668f, -0.001134f, -0.001398f, -0.000695f, -0.000392f + }, + { + +0.000755f, +0.017524f, -0.005048f, -0.010109f, +0.002748f, -0.000370f, +0.000855f, +0.002083f, -0.008578f, +0.000500f, + -0.008322f, -0.000943f, +0.010206f, -0.004161f, +0.063996f, -0.026737f, +0.022662f, +0.015657f, -0.008050f, -0.007251f, + +0.000649f, +0.031035f, +0.002020f, +0.005634f, +0.018595f, -0.009543f, -0.014608f, +0.029534f, -0.038063f, +0.033466f, + -0.017634f, +0.015245f, -0.004367f, -0.012855f, +0.017342f, +0.003533f, +0.006869f, -0.011819f, +0.000999f, -0.008190f, + +0.007719f, +0.004603f, +0.000237f, -0.006117f, -0.005760f, +0.005087f, -0.005380f, +0.002461f, -0.002931f, -0.001638f, + -0.006934f, -0.003376f, -0.000471f, +0.000142f, -0.000018f, -0.004128f, -0.001893f, -0.000563f, +0.001316f, +0.000050f, + +0.000833f, -0.001601f, -0.001918f, -0.001373f, -0.002168f, -0.001544f, +0.001546f, +0.002706f, -0.000154f, +0.002215f, + -0.001477f, -0.000512f, -0.000086f, +0.002505f, -0.001332f, +0.000881f, -0.000152f, +0.001038f, -0.003160f, +0.000401f, + -0.002524f, -0.001162f, +0.001280f, +0.001542f, +0.002423f, -0.000618f, +0.001505f, -0.000909f, +0.001320f, -0.000489f, + -0.000799f, -0.000770f, -0.001590f, -0.000974f, -0.000236f, -0.000189f + }, + { + -0.050564f, -0.309953f, +0.058386f, -0.019412f, +0.005357f, +0.004218f, +0.008953f, -0.005008f, -0.002103f, +0.011106f, + -0.017426f, -0.018654f, +0.000305f, +0.005462f, +0.004047f, +0.008705f, +0.010988f, +0.017515f, -0.007358f, +0.005925f, + +0.006907f, +0.000230f, +0.011992f, -0.001255f, -0.004925f, +0.013550f, +0.002229f, +0.000396f, +0.009307f, +0.003985f, + -0.000168f, -0.002783f, +0.000455f, +0.000094f, -0.005561f, -0.001632f, -0.001769f, +0.004011f, +0.004186f, +0.001800f, + +0.016832f, -0.002931f, -0.000134f, +0.001023f, -0.003203f, +0.005067f, +0.005785f, -0.002715f, -0.003507f, +0.006397f, + +0.000813f, -0.000734f, -0.003047f, +0.000234f, +0.004427f, -0.006432f, +0.000748f, -0.001461f, +0.000987f, -0.004525f, + +0.000692f, -0.001889f, +0.002067f, -0.001114f, +0.001667f, +0.001747f, +0.002565f, +0.001330f, +0.000700f, -0.001195f, + -0.001565f, -0.000316f, -0.000801f, -0.000920f, +0.003454f, -0.000778f, +0.000535f, -0.000281f, +0.000940f, +0.002917f, + -0.001702f, -0.000773f, -0.000116f, +0.000554f, +0.000503f, -0.000276f, +0.003633f, -0.000516f, -0.001366f, +0.000677f, + +0.000476f, -0.002445f, -0.001089f, +0.001766f, +0.000191f, -0.000458f + }, + { + +0.005521f, -0.011096f, -0.007666f, -0.024821f, +0.002027f, -0.011020f, +0.021318f, -0.003240f, -0.001544f, +0.003379f, + -0.012256f, -0.000351f, +0.009359f, -0.035129f, +0.020939f, -0.013868f, +0.029695f, +0.011947f, +0.038943f, -0.000163f, + -0.000591f, +0.025737f, +0.004527f, -0.003856f, +0.001154f, -0.003366f, +0.021308f, -0.016023f, -0.021752f, -0.000976f, + +0.003139f, -0.011210f, -0.000162f, -0.008465f, -0.003171f, -0.005746f, -0.009831f, -0.001544f, +0.000278f, -0.007204f, + -0.000695f, +0.011055f, -0.002442f, -0.002001f, -0.002536f, +0.003680f, -0.005244f, -0.002331f, -0.007511f, +0.002973f, + +0.000113f, +0.002392f, -0.002205f, +0.003596f, -0.001853f, -0.001981f, -0.003129f, +0.002133f, +0.005068f, -0.006859f, + -0.003767f, +0.001298f, -0.003295f, -0.006069f, -0.001633f, -0.001725f, +0.001005f, +0.001933f, +0.002422f, -0.002697f, + +0.001861f, -0.001864f, +0.001547f, +0.001964f, +0.001703f, +0.001887f, +0.001336f, -0.001486f, +0.002197f, +0.002312f, + +0.000131f, +0.000658f, +0.000552f, +0.003038f, -0.001333f, -0.001092f, +0.000702f, -0.000049f, +0.001524f, -0.001698f, + -0.000666f, +0.000607f, +0.000025f, -0.000382f, -0.000809f, -0.000062f + }, + { + -0.033735f, -0.202946f, +0.065766f, +0.003585f, -0.005361f, +0.040879f, -0.045668f, +0.011427f, +0.017297f, -0.005980f, + -0.000327f, -0.007312f, +0.018259f, -0.006215f, -0.004434f, +0.007676f, +0.001608f, -0.000996f, +0.015705f, +0.017414f, + -0.020102f, +0.016583f, -0.006714f, -0.003004f, +0.003989f, -0.005608f, -0.016943f, +0.003705f, +0.004125f, -0.005763f, + +0.003675f, -0.003760f, -0.004573f, +0.000833f, -0.008795f, -0.009266f, +0.006317f, +0.003807f, -0.011439f, +0.004710f, + +0.003067f, -0.010179f, -0.000857f, +0.002695f, +0.002436f, -0.000377f, -0.005716f, +0.004109f, -0.002268f, -0.000002f, + -0.002736f, +0.006257f, -0.002217f, +0.002278f, +0.003564f, -0.001686f, +0.001973f, +0.002169f, +0.001678f, -0.004060f, + +0.005385f, -0.002736f, +0.000835f, -0.002326f, +0.004586f, -0.000274f, -0.002661f, -0.004782f, +0.001926f, -0.002303f, + +0.001424f, +0.003991f, -0.000143f, -0.000589f, +0.000039f, +0.001894f, +0.000248f, +0.001061f, +0.001612f, +0.001277f, + -0.000444f, -0.001234f, +0.002176f, +0.001631f, -0.001814f, +0.001642f, -0.000547f, +0.001028f, +0.000142f, -0.000636f, + +0.000303f, -0.000159f, -0.001426f, +0.000477f, -0.000341f, +0.001065f + }, + { + +0.004791f, -0.064656f, -0.005109f, +0.000200f, +0.000530f, +0.004507f, -0.004652f, +0.003064f, +0.002319f, +0.005314f, + +0.006597f, -0.001811f, +0.011237f, -0.020594f, -0.063772f, +0.026430f, -0.001469f, +0.020328f, -0.021509f, +0.004350f, + +0.007937f, +0.008449f, -0.010275f, -0.027567f, -0.005672f, +0.014882f, +0.010660f, +0.010329f, +0.004784f, +0.007473f, + -0.014294f, +0.001906f, +0.003999f, +0.008765f, -0.009826f, +0.005836f, -0.009262f, +0.006551f, -0.001123f, +0.004447f, + -0.006094f, +0.010380f, -0.006443f, -0.002962f, +0.001766f, -0.002817f, +0.010878f, +0.001395f, +0.003029f, -0.000369f, + +0.005241f, -0.001906f, -0.003742f, -0.002125f, +0.000474f, -0.001706f, +0.001089f, -0.002721f, +0.001659f, -0.006755f, + +0.003433f, +0.000536f, -0.006860f, +0.003913f, +0.002660f, -0.000665f, -0.001377f, -0.000072f, -0.004669f, +0.001396f, + +0.001287f, -0.003206f, +0.001116f, +0.001600f, -0.001260f, -0.000693f, -0.000512f, -0.003034f, +0.000006f, +0.000141f, + +0.000665f, -0.001590f, -0.002191f, +0.002700f, +0.000685f, -0.000705f, -0.001936f, -0.000778f, +0.000404f, -0.001147f, + +0.000092f, -0.001480f, +0.000754f, -0.000177f, -0.000202f, +0.001069f + }, + { + -0.083502f, +0.257166f, +0.008855f, -0.016928f, +0.008505f, +0.023732f, -0.000291f, -0.002417f, +0.009865f, +0.016770f, + +0.015826f, +0.000428f, +0.007488f, -0.013827f, -0.005739f, +0.024294f, -0.029300f, +0.019893f, -0.000738f, +0.010957f, + -0.013448f, -0.003881f, +0.007818f, -0.000252f, +0.012677f, +0.034084f, -0.006969f, +0.019839f, -0.001581f, -0.011600f, + -0.002401f, +0.000243f, -0.000310f, -0.001843f, +0.008999f, +0.000526f, -0.003580f, -0.000744f, +0.006084f, +0.003024f, + +0.007545f, -0.000644f, +0.009407f, -0.004424f, +0.008210f, -0.012056f, +0.002318f, +0.001250f, -0.004082f, -0.002693f, + +0.007572f, +0.004054f, +0.004717f, +0.004220f, -0.003060f, -0.005010f, +0.004405f, -0.002721f, +0.000383f, -0.002547f, + +0.000925f, -0.003125f, +0.000476f, +0.000870f, -0.005353f, -0.002499f, -0.000297f, -0.001248f, -0.001775f, -0.000827f, + -0.001378f, +0.001037f, -0.002614f, -0.001109f, +0.001415f, -0.000386f, +0.002582f, +0.002391f, +0.000707f, -0.002780f, + +0.000645f, -0.000625f, +0.001169f, +0.000544f, +0.000835f, -0.002104f, -0.000056f, +0.000198f, +0.000550f, -0.000973f, + -0.000009f, +0.000162f, -0.000279f, +0.000567f, -0.000168f, -0.000208f + }, + { + +0.000054f, -0.104799f, +0.009045f, +0.003323f, +0.004477f, -0.002545f, +0.002959f, -0.002299f, +0.008619f, -0.005620f, + +0.002663f, -0.001755f, +0.007774f, -0.040495f, +0.122681f, -0.020084f, +0.017879f, -0.027421f, +0.024278f, -0.009801f, + -0.004461f, -0.009445f, -0.001432f, -0.015844f, +0.000974f, -0.008336f, -0.002003f, +0.014386f, -0.025949f, +0.002379f, + +0.008369f, -0.008766f, +0.021801f, +0.001108f, -0.008998f, -0.001031f, +0.004327f, -0.010362f, +0.006526f, +0.006412f, + +0.010928f, -0.005243f, -0.004656f, -0.006639f, +0.002779f, -0.005030f, +0.010822f, +0.002606f, -0.004299f, -0.002618f, + +0.000322f, +0.004282f, -0.003759f, -0.003591f, +0.001737f, -0.004879f, +0.003500f, -0.000494f, +0.001005f, -0.002889f, + +0.002564f, -0.001900f, +0.001765f, -0.000044f, -0.000619f, +0.002706f, +0.001316f, -0.002376f, -0.002498f, +0.002824f, + -0.000889f, -0.003759f, +0.003552f, +0.000069f, +0.000469f, +0.000830f, +0.000898f, +0.001494f, +0.001204f, -0.002023f, + +0.000723f, -0.001262f, -0.000142f, +0.001401f, -0.001250f, +0.000549f, -0.001934f, -0.000641f, +0.000078f, +0.000558f, + +0.000393f, -0.000436f, -0.001379f, +0.000660f, -0.000322f, -0.000161f + }, + { + -0.005483f, +0.261057f, -0.024098f, +0.013438f, -0.000260f, -0.047108f, -0.014051f, -0.002762f, +0.004866f, +0.000204f, + +0.008354f, +0.005559f, -0.014488f, +0.011127f, +0.001063f, +0.002106f, +0.017287f, +0.010998f, -0.009752f, +0.004788f, + -0.005504f, -0.000346f, +0.013124f, +0.000951f, -0.000872f, +0.004590f, +0.008444f, -0.012966f, +0.011122f, -0.009093f, + +0.012315f, -0.001547f, +0.002025f, +0.001767f, +0.006428f, -0.007270f, +0.004234f, +0.003883f, +0.005218f, -0.008142f, + +0.006049f, -0.016535f, -0.002428f, +0.016361f, -0.001276f, +0.002839f, +0.001972f, +0.003625f, -0.002661f, -0.006320f, + +0.000427f, +0.002854f, -0.001854f, -0.003848f, -0.001444f, +0.000644f, +0.001411f, -0.003576f, +0.003136f, +0.003244f, + -0.003104f, -0.001122f, +0.002956f, -0.001043f, +0.004871f, -0.000636f, -0.000702f, +0.002103f, +0.002563f, -0.000930f, + -0.000680f, +0.001705f, +0.001749f, +0.001811f, +0.001124f, +0.000248f, -0.000100f, -0.000514f, +0.001566f, +0.000437f, + -0.003057f, +0.001384f, -0.001494f, +0.003813f, -0.001038f, +0.000228f, +0.000638f, +0.001413f, -0.000646f, +0.002344f, + +0.001177f, -0.000328f, -0.000425f, +0.001013f, -0.000003f, -0.001039f + } + }, + { + { + -0.001252f, +0.015087f, -0.003216f, +0.007172f, -0.011113f, +0.002080f, +0.000201f, -0.003833f, +0.002425f, -0.002846f, + -0.008614f, +0.009736f, +0.016326f, -0.004828f, -0.007148f, -0.016755f, -0.001573f, +0.006480f, -0.019113f, +0.003949f, + -0.027741f, -0.011999f, -0.015156f, +0.023168f, +0.018362f, +0.024231f, +0.004110f, -0.015409f, -0.003784f, +0.009952f, + +0.003771f, -0.007407f, -0.005342f, +0.013271f, +0.008925f, -0.003510f, +0.002442f, +0.014134f, +0.004001f, +0.000918f, + +0.002395f, -0.002545f, +0.001100f, +0.003627f, +0.000932f, +0.005779f, +0.005367f, +0.005410f, +0.000244f, -0.003061f, + +0.002969f, -0.000635f, +0.001694f, -0.001941f, -0.002622f, -0.000698f, -0.000586f, +0.002012f, -0.000450f, -0.000308f, + +0.004211f, +0.001294f, -0.000219f, +0.002942f, +0.002634f, -0.003034f, +0.001835f, -0.001691f, +0.000859f, +0.000751f, + +0.000042f, +0.000737f, +0.000389f, +0.000350f, -0.001611f, -0.000184f, -0.001035f, +0.000173f, -0.000214f, -0.002250f, + -0.000024f, +0.001176f, +0.000703f, -0.000194f, -0.000889f, -0.000101f, -0.000660f, -0.000454f, +0.000545f, -0.000788f, + +0.001146f, -0.000458f, -0.000687f, +0.000320f, +0.001265f, -0.000135f + }, + { + -0.002609f, -0.110806f, -0.020799f, +0.022890f, -0.008075f, +0.000764f, -0.003091f, +0.009367f, +0.000849f, -0.000937f, + -0.005012f, -0.006991f, +0.007384f, -0.002178f, -0.008537f, +0.007526f, -0.004412f, +0.005316f, +0.007662f, -0.000402f, + -0.003238f, +0.009167f, -0.000985f, +0.012585f, -0.009463f, +0.009167f, +0.005944f, -0.003479f, +0.002750f, -0.003530f, + +0.000172f, -0.003712f, +0.006463f, -0.003390f, -0.002745f, -0.009180f, +0.005960f, +0.000319f, +0.001210f, +0.006947f, + +0.001895f, +0.004639f, -0.004432f, +0.002763f, -0.001337f, +0.001987f, -0.009095f, +0.003815f, +0.000889f, +0.002467f, + -0.000382f, -0.003747f, +0.001631f, +0.005060f, +0.001407f, -0.001865f, -0.004133f, -0.000835f, +0.000592f, -0.001582f, + -0.001081f, +0.002959f, -0.000381f, -0.001590f, +0.002852f, +0.002199f, +0.003409f, +0.000227f, +0.002676f, -0.000664f, + +0.002108f, +0.000913f, +0.001932f, -0.001401f, +0.000569f, +0.000413f, -0.000565f, -0.000209f, +0.002336f, +0.000202f, + -0.000571f, -0.001077f, +0.000291f, -0.001400f, -0.000022f, -0.000195f, +0.001011f, -0.000659f, -0.000075f, -0.000651f, + -0.000326f, -0.000207f, -0.000009f, +0.000537f, -0.000343f, -0.000075f + }, + { + +0.000239f, +0.036346f, -0.003985f, +0.009143f, -0.012033f, -0.001688f, -0.001138f, +0.004366f, -0.001844f, +0.001533f, + +0.003470f, -0.003668f, +0.009595f, +0.018985f, +0.006627f, -0.016224f, -0.016852f, -0.020028f, -0.017841f, -0.011247f, + -0.003765f, +0.006700f, +0.000884f, +0.005664f, -0.005513f, -0.001109f, -0.007497f, +0.008439f, +0.004058f, -0.001482f, + -0.005394f, +0.003717f, +0.006943f, -0.006150f, +0.004219f, -0.001343f, +0.005528f, +0.003611f, -0.002951f, -0.006146f, + +0.005728f, +0.003067f, +0.000137f, -0.000593f, -0.000464f, +0.003609f, +0.005125f, -0.007384f, +0.000956f, +0.001863f, + +0.003413f, +0.000628f, +0.001450f, +0.001370f, +0.000092f, -0.003072f, -0.002188f, -0.002906f, -0.002158f, -0.002048f, + -0.000841f, -0.001634f, -0.004177f, +0.003832f, -0.001105f, -0.001554f, -0.002456f, -0.000393f, -0.001008f, +0.000278f, + +0.001241f, +0.000032f, +0.000827f, -0.000037f, +0.000224f, +0.000259f, -0.001096f, -0.000591f, -0.001208f, +0.000405f, + +0.000220f, +0.001103f, -0.001345f, -0.001987f, -0.000311f, -0.000130f, +0.000404f, -0.000034f, -0.001047f, -0.000457f, + -0.000564f, -0.000023f, -0.000396f, -0.000279f, +0.000351f, +0.000527f + }, + { + -0.002893f, -0.043871f, +0.004471f, +0.004852f, -0.001024f, +0.000667f, +0.000568f, -0.002535f, -0.002889f, -0.002146f, + +0.002670f, +0.002004f, +0.002102f, +0.005989f, +0.016782f, +0.012595f, +0.014215f, -0.007458f, +0.032676f, -0.000639f, + -0.017304f, +0.012737f, +0.000892f, +0.010385f, -0.006207f, +0.003257f, -0.003685f, -0.004962f, -0.006560f, +0.005913f, + +0.004452f, -0.016261f, -0.021344f, +0.003852f, +0.003645f, +0.006820f, -0.012196f, +0.005614f, +0.003305f, -0.001796f, + -0.002973f, -0.003197f, +0.002239f, +0.006051f, +0.003557f, -0.003690f, +0.000446f, +0.000139f, +0.001425f, +0.002582f, + +0.002261f, -0.002855f, -0.001988f, +0.001306f, -0.000290f, -0.000578f, +0.002708f, +0.002227f, +0.001816f, -0.000732f, + -0.002821f, +0.000533f, -0.001886f, -0.001705f, -0.000132f, -0.001381f, -0.000048f, -0.001509f, +0.001055f, -0.000070f, + -0.000239f, +0.000160f, -0.002593f, -0.000406f, -0.001184f, +0.000173f, -0.000367f, -0.000273f, -0.000953f, -0.001308f, + -0.000276f, +0.000260f, -0.001136f, +0.000422f, -0.000092f, -0.000180f, +0.000387f, -0.000634f, +0.000116f, -0.000474f, + -0.000811f, -0.000407f, -0.000294f, -0.000795f, -0.000188f, -0.000183f + }, + { + -0.035669f, -0.164718f, +0.000755f, -0.043841f, +0.011884f, +0.001623f, -0.004075f, -0.002848f, -0.003134f, +0.003570f, + -0.015227f, -0.000711f, +0.009045f, -0.006390f, +0.002183f, +0.004930f, +0.004686f, +0.016095f, +0.000556f, -0.002819f, + +0.006418f, -0.001683f, +0.000850f, -0.006376f, +0.002798f, +0.011461f, +0.010549f, -0.003153f, -0.004410f, -0.000688f, + -0.000608f, +0.007409f, +0.003728f, +0.000767f, -0.000165f, +0.001887f, +0.001460f, +0.000399f, +0.009282f, -0.002194f, + +0.001876f, +0.002161f, +0.000511f, +0.004470f, +0.003663f, -0.004223f, +0.001951f, +0.001851f, +0.000752f, -0.003719f, + +0.002158f, -0.003117f, +0.001968f, +0.001373f, -0.000013f, -0.001820f, -0.000304f, +0.000262f, +0.003893f, +0.004226f, + -0.001470f, -0.002160f, +0.000675f, +0.003216f, +0.002541f, -0.000934f, +0.000172f, +0.002055f, -0.000047f, +0.001039f, + -0.000672f, -0.000739f, -0.000109f, +0.001760f, +0.001428f, +0.001396f, +0.001019f, -0.000762f, +0.000616f, -0.000317f, + +0.000213f, -0.000331f, +0.000048f, +0.000486f, +0.001443f, -0.001116f, +0.000356f, -0.000044f, +0.000617f, +0.000432f, + +0.000545f, -0.000058f, +0.001034f, +0.000240f, -0.000480f, +0.000561f + }, + { + +0.001960f, +0.001933f, -0.007880f, +0.006362f, -0.000348f, -0.000853f, +0.000914f, +0.003651f, -0.001979f, +0.000179f, + +0.002566f, +0.000394f, -0.005511f, +0.004813f, +0.059592f, -0.010451f, +0.008265f, +0.007398f, -0.005201f, +0.009265f, + -0.007004f, -0.005911f, -0.000447f, -0.011758f, +0.016230f, +0.016386f, -0.022237f, +0.002420f, -0.006890f, -0.022081f, + -0.002721f, -0.003540f, +0.004631f, +0.004955f, -0.001712f, -0.008261f, -0.008748f, -0.009360f, -0.003486f, +0.005285f, + +0.001479f, -0.010373f, -0.004017f, -0.001469f, -0.002687f, +0.000040f, +0.004336f, +0.003500f, +0.003668f, +0.003819f, + +0.000670f, +0.001642f, +0.001279f, +0.003834f, -0.000442f, -0.001764f, +0.000642f, +0.002561f, +0.000332f, +0.000949f, + -0.000757f, -0.001933f, -0.000358f, -0.001838f, +0.001467f, -0.000806f, +0.001484f, -0.001086f, -0.001904f, -0.002535f, + -0.001112f, -0.000875f, -0.000242f, -0.001840f, -0.000909f, +0.001494f, -0.000500f, -0.000949f, +0.000646f, -0.000004f, + -0.001105f, +0.000247f, -0.000402f, -0.000872f, +0.000025f, +0.000271f, +0.000351f, +0.000798f, -0.000270f, +0.000087f, + +0.000375f, +0.000306f, +0.000205f, -0.001061f, +0.000737f, +0.000144f + }, + { + -0.069384f, -0.088555f, -0.025450f, +0.011015f, +0.009506f, -0.001403f, -0.003980f, -0.006828f, -0.019788f, +0.015984f, + +0.002269f, +0.009386f, -0.005467f, +0.007357f, -0.001513f, -0.011634f, -0.023431f, -0.000381f, +0.000511f, +0.000388f, + +0.004499f, -0.004607f, +0.009581f, -0.005667f, -0.002911f, -0.000874f, -0.003150f, +0.004254f, +0.002271f, -0.003024f, + -0.005221f, +0.000560f, -0.001046f, -0.007913f, +0.002077f, +0.004011f, +0.001027f, +0.000546f, -0.002237f, -0.004509f, + -0.007487f, +0.006758f, +0.004387f, -0.001613f, +0.003870f, +0.001172f, +0.002470f, +0.003253f, +0.006741f, -0.002252f, + -0.002907f, -0.000561f, +0.006802f, -0.006558f, +0.001243f, -0.000723f, +0.000729f, -0.002712f, -0.002049f, -0.000715f, + +0.000362f, +0.001604f, -0.000253f, -0.000302f, -0.000369f, +0.000374f, -0.000419f, -0.000941f, +0.001343f, -0.003595f, + +0.000011f, +0.000434f, -0.000796f, +0.000120f, -0.000539f, +0.000368f, -0.000849f, -0.002585f, +0.000033f, +0.001196f, + -0.001831f, -0.000132f, -0.000453f, -0.000830f, +0.000445f, +0.000067f, +0.000562f, -0.000310f, -0.000961f, +0.000149f, + +0.000653f, -0.000730f, -0.000745f, -0.000715f, -0.000475f, -0.000303f + }, + { + +0.001885f, +0.009795f, +0.001229f, -0.002409f, -0.001735f, +0.000354f, +0.001128f, +0.000624f, -0.004072f, -0.001221f, + -0.002894f, -0.001918f, +0.009154f, +0.010463f, +0.032900f, +0.030409f, +0.008799f, -0.011329f, -0.010124f, -0.020016f, + +0.023389f, +0.023661f, -0.004032f, +0.007930f, +0.003996f, +0.009542f, -0.008762f, +0.013222f, -0.014543f, -0.002152f, + +0.011761f, +0.003071f, +0.001703f, -0.002771f, +0.004859f, +0.007685f, +0.002846f, -0.010575f, -0.004953f, -0.001475f, + +0.002690f, +0.004948f, -0.003388f, +0.001671f, -0.000576f, -0.002085f, -0.008936f, +0.002087f, +0.001161f, -0.002310f, + -0.008485f, -0.002488f, -0.001502f, -0.000642f, +0.001447f, -0.007028f, +0.001500f, +0.000494f, -0.000391f, -0.001646f, + -0.000250f, -0.001360f, -0.002664f, -0.000561f, -0.001083f, +0.000183f, -0.000492f, +0.000122f, +0.001131f, +0.001796f, + -0.000688f, -0.000253f, -0.000065f, +0.001549f, -0.000340f, +0.000265f, -0.000368f, +0.000222f, -0.002606f, -0.000486f, + -0.002104f, -0.000121f, +0.000886f, +0.001570f, +0.000744f, +0.000342f, -0.000333f, +0.001002f, +0.000039f, -0.000735f, + +0.000026f, -0.000655f, -0.000375f, -0.001483f, -0.000722f, -0.000317f + }, + { + -0.001398f, -0.287156f, -0.024284f, -0.006410f, +0.009638f, +0.007504f, +0.002538f, +0.002562f, -0.000102f, -0.006720f, + +0.006180f, -0.012397f, -0.003761f, -0.014332f, +0.007201f, +0.012274f, +0.006466f, +0.012143f, -0.007925f, +0.007616f, + +0.004154f, +0.013534f, -0.000915f, +0.001994f, -0.001717f, +0.002814f, +0.009533f, +0.001971f, +0.002767f, +0.003471f, + -0.003355f, +0.000662f, -0.002680f, +0.005324f, -0.004022f, -0.001345f, -0.007502f, +0.002154f, +0.004386f, +0.004810f, + +0.011012f, -0.003817f, +0.000870f, +0.001282f, +0.000722f, +0.000824f, +0.003336f, -0.002458f, -0.000228f, +0.001597f, + +0.002087f, -0.001414f, -0.002354f, +0.003904f, -0.001169f, -0.003528f, -0.000029f, -0.001130f, -0.000168f, -0.000508f, + -0.002783f, -0.000277f, -0.000614f, +0.000900f, +0.001331f, +0.001799f, +0.002985f, -0.000223f, +0.000367f, -0.000127f, + +0.000578f, -0.002827f, -0.000176f, -0.000599f, +0.000440f, +0.001193f, -0.000403f, +0.000289f, +0.000742f, +0.002033f, + -0.001775f, +0.000037f, +0.000757f, -0.001404f, +0.001176f, +0.000982f, +0.001618f, +0.000140f, -0.000842f, +0.000158f, + -0.000151f, -0.001417f, -0.000113f, +0.000012f, +0.000151f, +0.000855f + }, + { + -0.006485f, -0.025973f, -0.004124f, +0.008033f, -0.003028f, -0.006111f, +0.009161f, -0.002287f, +0.000197f, -0.001247f, + -0.010643f, +0.001522f, -0.008185f, -0.009793f, -0.003250f, +0.004381f, +0.020014f, +0.013656f, +0.018731f, +0.009169f, + +0.004980f, +0.023170f, -0.007382f, +0.005027f, -0.004909f, +0.014523f, -0.005119f, -0.016895f, -0.010452f, -0.006347f, + +0.003523f, -0.008212f, -0.005223f, +0.001054f, -0.009840f, -0.003613f, -0.010226f, -0.004918f, -0.001245f, -0.003539f, + -0.000438f, +0.006718f, +0.003547f, -0.007081f, -0.000479f, -0.002243f, -0.004746f, -0.000175f, -0.000189f, -0.004480f, + +0.001048f, -0.002628f, +0.004124f, -0.002946f, -0.000012f, +0.002815f, -0.005805f, +0.002636f, -0.000842f, -0.004383f, + -0.001064f, -0.001505f, -0.000302f, -0.003863f, -0.003401f, -0.000495f, -0.000040f, +0.000098f, +0.001415f, -0.001071f, + +0.001689f, +0.000135f, -0.000092f, +0.001183f, +0.001640f, +0.000432f, +0.002054f, +0.000630f, +0.001480f, +0.001117f, + +0.001756f, +0.000052f, -0.000059f, +0.001478f, -0.000415f, +0.001592f, -0.000275f, -0.000200f, +0.000599f, -0.001081f, + -0.001392f, +0.000006f, -0.000064f, -0.000057f, -0.000118f, -0.000590f + }, + { + +0.025090f, -0.201293f, -0.000988f, +0.006277f, +0.006425f, -0.005305f, -0.000039f, +0.000711f, +0.009397f, -0.005769f, + -0.001961f, +0.002757f, -0.001528f, +0.003362f, +0.005854f, -0.006889f, +0.008557f, -0.001082f, +0.016908f, +0.010033f, + -0.000211f, +0.003697f, -0.002309f, +0.001352f, -0.009656f, -0.000860f, -0.010933f, -0.001511f, +0.002248f, -0.006343f, + -0.000943f, -0.000515f, -0.001661f, -0.002756f, -0.004713f, -0.003654f, +0.002278f, +0.000281f, +0.000624f, -0.003887f, + +0.001208f, -0.006277f, +0.001194f, +0.000364f, -0.000874f, -0.000403f, -0.002870f, -0.000006f, -0.001615f, +0.003379f, + +0.001380f, +0.001757f, -0.002599f, -0.001439f, +0.003595f, +0.002524f, +0.003394f, +0.000905f, -0.000837f, +0.000258f, + -0.000939f, -0.000311f, -0.000368f, -0.000389f, +0.001572f, -0.001748f, -0.002426f, +0.000871f, -0.002182f, -0.002444f, + +0.002835f, +0.001252f, +0.001476f, -0.000139f, +0.000947f, -0.000123f, +0.000071f, +0.001168f, +0.001618f, +0.000830f, + -0.000543f, +0.000909f, +0.000223f, +0.001345f, -0.000142f, +0.001060f, +0.000097f, -0.000372f, +0.000451f, -0.000090f, + -0.000247f, -0.000584f, -0.000281f, +0.000581f, +0.000439f, +0.000625f + }, + { + -0.003454f, -0.065734f, +0.005207f, -0.003682f, -0.000253f, +0.000717f, +0.005409f, -0.000890f, +0.001779f, +0.004638f, + +0.006758f, +0.003725f, -0.002322f, -0.037407f, -0.021318f, +0.012839f, -0.000154f, -0.003260f, -0.010935f, -0.003038f, + +0.016322f, +0.003844f, -0.014519f, -0.022001f, +0.001680f, +0.022301f, +0.008032f, -0.008357f, +0.012897f, -0.000630f, + -0.004409f, +0.007153f, +0.017395f, -0.003789f, -0.001054f, -0.007960f, +0.006036f, +0.001333f, -0.001514f, +0.001616f, + -0.003044f, +0.003333f, +0.002291f, -0.003810f, +0.000300f, +0.000207f, +0.007593f, +0.001935f, +0.001872f, +0.003709f, + +0.003983f, -0.003553f, -0.001779f, -0.000659f, -0.003089f, -0.001473f, +0.001185f, -0.002029f, +0.002000f, -0.002798f, + -0.000658f, -0.000284f, -0.000059f, +0.001566f, +0.000864f, +0.000005f, -0.001734f, -0.002328f, -0.000490f, -0.001666f, + +0.001163f, -0.001409f, -0.000591f, +0.000931f, +0.001094f, -0.001729f, -0.002358f, -0.001159f, -0.000125f, -0.000238f, + +0.001528f, -0.002330f, +0.000021f, +0.000550f, +0.000826f, +0.000444f, -0.000249f, -0.000494f, -0.000485f, -0.000955f, + -0.000568f, -0.000406f, +0.000200f, +0.000718f, -0.000345f, +0.000483f + }, + { + +0.101952f, +0.010906f, -0.006288f, -0.021925f, +0.003011f, -0.022170f, +0.024229f, +0.016045f, +0.004467f, +0.014644f, + +0.006182f, +0.007930f, -0.011807f, +0.013675f, -0.007654f, +0.006675f, -0.007217f, +0.002888f, +0.001257f, +0.012371f, + +0.001650f, -0.000303f, -0.005366f, +0.007600f, +0.006712f, +0.021560f, +0.018939f, +0.004970f, -0.005540f, -0.004667f, + +0.003160f, -0.004382f, -0.005135f, +0.000095f, +0.005070f, -0.003572f, -0.003085f, +0.000141f, +0.006202f, +0.000703f, + +0.009285f, +0.000706f, +0.003482f, +0.003015f, +0.003149f, -0.008074f, -0.001162f, +0.006471f, -0.001407f, +0.004916f, + +0.003134f, +0.011052f, +0.000621f, -0.000665f, -0.004126f, -0.003112f, +0.000231f, +0.001545f, -0.000861f, -0.001200f, + -0.000784f, -0.000637f, +0.000710f, -0.001050f, -0.006191f, -0.000973f, -0.002113f, +0.002024f, -0.002684f, -0.002101f, + +0.002167f, -0.001357f, -0.001665f, +0.001127f, +0.000230f, -0.001451f, +0.002671f, +0.002552f, +0.000157f, +0.000474f, + -0.000573f, +0.000572f, -0.000149f, +0.001517f, +0.000587f, -0.001163f, +0.000489f, -0.000045f, +0.000351f, +0.000123f, + +0.000126f, -0.000508f, -0.000438f, +0.000616f, +0.000048f, -0.000083f + }, + { + +0.000353f, -0.088462f, -0.002842f, -0.000404f, +0.005743f, -0.000310f, +0.004584f, +0.002871f, +0.004698f, -0.003567f, + -0.002869f, -0.015154f, +0.009230f, -0.003437f, +0.060992f, -0.008814f, +0.004323f, +0.001022f, -0.000714f, +0.014767f, + -0.007442f, -0.012539f, +0.007095f, -0.009838f, +0.000163f, -0.006026f, +0.013267f, -0.008562f, +0.007304f, -0.007825f, + -0.004410f, +0.005356f, +0.009724f, +0.003038f, -0.006120f, +0.003758f, -0.000040f, -0.009132f, +0.009038f, +0.007575f, + +0.003885f, -0.001464f, -0.007974f, -0.001824f, +0.004281f, -0.002081f, +0.002426f, +0.000378f, -0.002987f, -0.001922f, + +0.003292f, -0.001881f, +0.001013f, -0.003132f, +0.000256f, +0.001212f, -0.002095f, +0.003665f, +0.000154f, -0.004614f, + +0.001372f, -0.000680f, +0.002547f, +0.000157f, -0.000936f, +0.002407f, +0.000750f, -0.001851f, -0.001547f, +0.000873f, + -0.000733f, -0.000484f, +0.001487f, +0.000725f, +0.000729f, -0.000442f, +0.003136f, +0.001319f, +0.000061f, -0.001044f, + -0.000931f, +0.000147f, -0.000143f, +0.000734f, -0.000808f, -0.000277f, +0.000097f, -0.001636f, +0.000243f, +0.000577f, + -0.000614f, -0.000233f, -0.000607f, -0.000206f, +0.000032f, -0.001296f + }, + { + +0.041458f, +0.151156f, +0.031011f, -0.019178f, -0.016562f, -0.038871f, +0.004207f, -0.010546f, +0.008062f, +0.006296f, + -0.000777f, +0.009160f, -0.015217f, +0.011732f, -0.001561f, +0.008715f, +0.001922f, +0.002801f, -0.006506f, +0.010333f, + +0.006667f, -0.008176f, +0.009325f, -0.003632f, +0.010323f, -0.002369f, +0.014562f, -0.006408f, -0.001239f, -0.003592f, + +0.009455f, -0.000695f, -0.006970f, +0.010373f, +0.001535f, -0.000629f, +0.000371f, +0.003294f, +0.009438f, -0.002343f, + -0.010270f, -0.003313f, +0.000841f, +0.006529f, +0.010025f, +0.001166f, +0.005365f, -0.004758f, -0.001993f, +0.003357f, + -0.003944f, +0.000103f, -0.003915f, -0.001274f, -0.003034f, +0.001802f, +0.000031f, -0.001608f, +0.004122f, -0.000159f, + -0.002835f, +0.003501f, +0.000668f, +0.002575f, +0.000292f, -0.000227f, +0.001452f, +0.001915f, +0.000554f, -0.001414f, + +0.001700f, +0.001917f, +0.002115f, +0.001611f, +0.002202f, -0.000367f, -0.000409f, +0.001190f, +0.000174f, +0.000157f, + -0.002151f, +0.000358f, +0.001882f, +0.000021f, +0.000985f, -0.000320f, +0.000216f, +0.000066f, +0.000539f, +0.001664f, + +0.001234f, +0.000478f, +0.000158f, +0.000300f, -0.000278f, -0.000513f + } + }, + { + { + +0.000631f, +0.021361f, -0.000159f, +0.023536f, -0.003921f, +0.001508f, +0.000702f, -0.005872f, +0.004194f, +0.004573f, + -0.004539f, -0.009018f, +0.004472f, -0.004773f, +0.004024f, +0.006612f, +0.008595f, +0.014722f, -0.021854f, +0.017780f, + +0.000430f, -0.005252f, -0.007239f, +0.014315f, +0.004384f, +0.023225f, -0.002188f, -0.004764f, +0.006786f, +0.009953f, + +0.000638f, -0.000442f, -0.006063f, -0.002604f, -0.001076f, -0.009142f, -0.001049f, +0.006936f, +0.001781f, -0.000275f, + +0.006315f, +0.002247f, -0.002801f, -0.002180f, -0.003693f, +0.003939f, +0.002591f, +0.001335f, -0.000471f, -0.004888f, + +0.001006f, +0.002240f, +0.002882f, -0.002631f, -0.002018f, +0.000412f, -0.002347f, +0.001006f, -0.000909f, -0.000119f, + +0.003029f, -0.001618f, -0.001269f, +0.002169f, +0.000476f, -0.003340f, +0.001882f, -0.001580f, -0.000332f, -0.000460f, + -0.001297f, +0.000062f, -0.001159f, +0.000117f, +0.000872f, +0.001678f, -0.000329f, +0.000582f, +0.000920f, -0.000938f, + +0.000741f, +0.000682f, +0.000486f, +0.000375f, -0.000250f, +0.000507f, -0.000124f, -0.000174f, +0.000567f, -0.000259f, + +0.000597f, -0.000330f, -0.000583f, -0.000346f, +0.000693f, -0.000135f + }, + { + -0.006554f, -0.029139f, +0.013403f, +0.015156f, -0.001181f, +0.002733f, -0.005715f, +0.005818f, -0.008736f, -0.003809f, + +0.004784f, -0.002457f, +0.007656f, +0.001719f, -0.004707f, +0.004940f, -0.005003f, +0.009052f, +0.011205f, +0.005579f, + +0.000246f, +0.010129f, -0.004372f, -0.005629f, -0.008566f, +0.013516f, +0.005390f, -0.006202f, +0.002422f, +0.002306f, + +0.001437f, -0.001234f, +0.008381f, -0.009896f, -0.001341f, -0.001198f, +0.007532f, -0.001671f, -0.004980f, -0.004420f, + -0.001178f, +0.007175f, -0.003901f, +0.003379f, -0.000511f, +0.000986f, -0.008256f, +0.001986f, -0.002849f, +0.004612f, + +0.003502f, -0.002178f, -0.001029f, +0.001803f, +0.002256f, -0.001746f, -0.002061f, +0.001156f, +0.000070f, +0.000966f, + +0.000449f, +0.001491f, -0.001111f, -0.000088f, +0.003727f, +0.000743f, +0.001651f, -0.001505f, +0.001757f, -0.000229f, + +0.000319f, -0.000847f, +0.001046f, -0.001100f, +0.001713f, +0.000180f, -0.000570f, -0.001361f, +0.001272f, -0.000077f, + +0.001218f, -0.000480f, +0.000338f, -0.001128f, +0.001033f, +0.000638f, +0.000325f, -0.000229f, +0.000452f, +0.000366f, + +0.000205f, -0.000047f, -0.000438f, +0.000432f, -0.000628f, -0.000336f + }, + { + -0.001139f, +0.031601f, -0.006240f, +0.050468f, +0.012818f, -0.000100f, -0.002876f, -0.002265f, -0.002594f, -0.000267f, + -0.004235f, -0.007781f, -0.000787f, +0.005202f, +0.011325f, +0.001165f, +0.000049f, +0.002133f, -0.005411f, +0.002946f, + +0.008286f, -0.000219f, -0.007882f, +0.001754f, -0.006583f, -0.002158f, -0.003914f, +0.007313f, +0.005980f, -0.001783f, + -0.007100f, -0.002000f, -0.000942f, -0.003204f, +0.005678f, -0.010190f, -0.000902f, +0.005317f, +0.001843f, -0.006358f, + +0.001153f, +0.003350f, +0.000044f, -0.002302f, -0.000756f, -0.000009f, +0.003277f, -0.004151f, +0.002463f, +0.000477f, + +0.002386f, +0.000924f, +0.002064f, +0.000047f, -0.000235f, -0.001159f, -0.001432f, +0.000799f, +0.002663f, +0.000636f, + +0.000232f, +0.000234f, -0.002318f, +0.001231f, -0.002968f, +0.000164f, +0.000303f, -0.001432f, -0.003058f, -0.000781f, + +0.000032f, -0.001116f, +0.001035f, +0.001501f, +0.001578f, +0.001012f, -0.000707f, +0.000873f, -0.000120f, +0.000960f, + +0.001142f, +0.000392f, -0.001362f, +0.000055f, +0.000319f, -0.001015f, +0.000325f, -0.000200f, -0.001056f, -0.000081f, + -0.000147f, +0.000616f, +0.000140f, -0.000050f, +0.000129f, +0.000526f + }, + { + +0.001177f, -0.040975f, +0.000693f, +0.002093f, -0.000965f, -0.000222f, +0.000412f, -0.002431f, -0.005064f, +0.000097f, + +0.004178f, -0.001963f, -0.002497f, +0.006976f, -0.011023f, -0.026560f, +0.001475f, -0.006399f, +0.007584f, +0.015222f, + -0.007363f, +0.002503f, -0.003983f, +0.001909f, -0.015330f, +0.016821f, +0.005356f, +0.000158f, +0.000933f, -0.002520f, + +0.000231f, -0.006784f, -0.013107f, +0.001979f, -0.003092f, -0.001635f, -0.006671f, +0.005604f, +0.001853f, -0.001317f, + -0.004032f, -0.003587f, -0.003572f, +0.000414f, +0.004345f, -0.002806f, +0.003546f, -0.001337f, -0.001923f, +0.000101f, + +0.000880f, -0.003533f, -0.001025f, +0.002872f, -0.000050f, +0.001239f, +0.002564f, -0.000562f, +0.001581f, -0.000168f, + -0.001475f, +0.000767f, -0.000901f, -0.000238f, +0.000917f, +0.001117f, +0.000258f, -0.002838f, -0.000151f, -0.000622f, + -0.001427f, +0.000387f, -0.000607f, +0.001641f, +0.000377f, +0.000954f, -0.001079f, -0.000571f, +0.000108f, +0.000621f, + -0.000362f, +0.000247f, +0.000070f, +0.000632f, +0.000297f, +0.000642f, +0.000187f, -0.000884f, -0.000750f, -0.000422f, + +0.000160f, -0.000044f, +0.000369f, +0.000011f, -0.000232f, +0.000008f + }, + { + +0.040979f, -0.065364f, +0.006996f, -0.040753f, -0.003544f, +0.002879f, +0.005167f, +0.004927f, -0.008633f, -0.005310f, + -0.005057f, +0.012006f, +0.013922f, -0.002284f, -0.005686f, -0.006705f, -0.009935f, +0.010960f, -0.001970f, -0.002534f, + +0.003523f, -0.008500f, +0.005741f, -0.000296f, -0.004787f, +0.002635f, +0.006899f, -0.005806f, -0.006243f, -0.003798f, + -0.006493f, +0.003721f, -0.003026f, -0.002471f, +0.002263f, +0.000786f, +0.007359f, +0.002362f, +0.004714f, -0.003132f, + -0.004311f, -0.001663f, -0.002869f, +0.003394f, +0.000546f, -0.003878f, +0.005708f, +0.002265f, +0.000538f, -0.002846f, + -0.000399f, -0.001578f, +0.000799f, -0.001972f, -0.001078f, -0.002067f, +0.001531f, -0.002782f, -0.002053f, +0.001760f, + -0.000787f, -0.000979f, +0.000617f, +0.001515f, +0.000343f, -0.001148f, +0.000148f, +0.001014f, -0.000527f, +0.000299f, + +0.001020f, +0.000808f, +0.000869f, +0.000278f, +0.000603f, +0.001699f, +0.000706f, -0.000180f, -0.000429f, -0.001490f, + -0.000668f, +0.000014f, -0.000099f, -0.000323f, +0.000093f, -0.000747f, +0.000715f, -0.000401f, -0.000026f, +0.000133f, + +0.000558f, -0.000284f, +0.000120f, -0.000291f, -0.000259f, +0.000579f + }, + { + -0.000826f, +0.004562f, +0.004455f, +0.004613f, -0.002718f, -0.000247f, +0.000163f, +0.002608f, +0.000124f, +0.001448f, + +0.001174f, +0.002764f, -0.004265f, +0.001013f, +0.032336f, -0.016219f, +0.014624f, +0.003873f, -0.011991f, +0.007180f, + +0.008399f, +0.008129f, +0.000732f, -0.021001f, +0.004429f, +0.020857f, -0.034092f, -0.008120f, -0.005603f, +0.004712f, + +0.017901f, -0.003065f, -0.000642f, -0.003292f, -0.005793f, +0.000895f, +0.001088f, +0.000950f, -0.001805f, +0.000048f, + +0.001109f, -0.005725f, -0.003624f, -0.000463f, -0.000704f, +0.001424f, +0.001437f, -0.002206f, -0.000969f, +0.001880f, + -0.001058f, +0.000213f, +0.000570f, -0.000096f, -0.001553f, +0.000235f, +0.001136f, +0.000653f, -0.000123f, +0.000893f, + -0.000178f, -0.002814f, -0.000255f, -0.001722f, -0.001691f, -0.001995f, +0.001272f, +0.000252f, +0.000782f, -0.001203f, + +0.000797f, +0.002411f, +0.001077f, -0.001309f, -0.000466f, +0.000642f, -0.001069f, -0.000310f, -0.000047f, +0.000257f, + -0.000044f, +0.001785f, +0.000806f, -0.000235f, -0.000468f, -0.000189f, +0.000618f, +0.001160f, -0.000101f, +0.000131f, + +0.000244f, -0.000600f, +0.000564f, -0.000020f, +0.000889f, +0.000377f + }, + { + +0.047506f, +0.111960f, +0.019853f, +0.019490f, -0.009139f, +0.002914f, +0.004713f, +0.013173f, -0.013656f, +0.006643f, + -0.006758f, +0.015686f, -0.001382f, +0.009802f, -0.001966f, -0.007536f, -0.009289f, +0.008301f, +0.002379f, -0.005271f, + -0.002176f, -0.002880f, +0.006381f, -0.010587f, -0.003652f, -0.003510f, -0.002759f, +0.005214f, +0.000271f, -0.001667f, + -0.005257f, +0.001730f, +0.004048f, -0.005472f, +0.000577f, -0.000657f, +0.002115f, +0.000895f, +0.001977f, +0.004924f, + -0.004763f, +0.002682f, -0.002713f, -0.005710f, +0.000214f, -0.003127f, +0.008754f, -0.000391f, +0.001875f, -0.003417f, + -0.001382f, +0.000912f, +0.003626f, -0.003225f, -0.001088f, -0.003806f, -0.000912f, +0.000526f, +0.000460f, +0.000026f, + +0.003533f, +0.001491f, +0.001046f, +0.002258f, -0.000934f, +0.000256f, +0.001616f, +0.000567f, +0.000832f, -0.003255f, + +0.000767f, -0.000201f, -0.001252f, +0.000243f, -0.000118f, +0.001694f, -0.000362f, -0.001905f, +0.000577f, +0.002073f, + -0.000939f, +0.000383f, -0.000468f, -0.001224f, +0.000352f, -0.000382f, +0.000280f, +0.000053f, -0.000221f, +0.000298f, + -0.000141f, -0.000219f, +0.000230f, +0.000050f, +0.000257f, -0.000105f + }, + { + -0.000453f, -0.001761f, +0.007672f, +0.005596f, +0.000891f, +0.001428f, +0.000328f, +0.000957f, -0.002814f, +0.003283f, + +0.003408f, -0.005802f, -0.004166f, +0.004894f, +0.021119f, +0.018246f, -0.001263f, -0.015794f, -0.001761f, -0.024170f, + -0.007519f, -0.005279f, -0.012870f, +0.006113f, +0.000411f, +0.014167f, -0.004092f, +0.012190f, -0.005777f, -0.010690f, + +0.001307f, -0.014655f, +0.002952f, +0.005461f, -0.006357f, -0.003024f, -0.004958f, -0.008264f, +0.003031f, +0.001090f, + -0.000230f, +0.002010f, -0.002782f, -0.000817f, -0.002303f, +0.001571f, -0.005618f, +0.005233f, +0.000119f, +0.000391f, + -0.003709f, -0.000733f, -0.002221f, -0.003033f, +0.003358f, -0.004820f, +0.003277f, +0.002609f, +0.000563f, -0.001764f, + -0.003356f, -0.003883f, -0.001458f, +0.001403f, +0.000203f, -0.000090f, -0.001072f, -0.001953f, -0.001728f, +0.001415f, + +0.000622f, -0.000589f, -0.001222f, +0.001012f, -0.000161f, -0.000833f, -0.001990f, -0.000379f, -0.000895f, +0.000257f, + -0.000356f, +0.000372f, -0.000167f, +0.000091f, -0.001143f, +0.000058f, -0.001044f, +0.000502f, -0.000550f, -0.000284f, + +0.001015f, +0.000021f, +0.000416f, -0.000184f, -0.000513f, -0.000258f + }, + { + +0.037579f, -0.193603f, +0.027441f, +0.013520f, -0.009866f, +0.000176f, -0.004153f, +0.000581f, -0.001421f, -0.011329f, + +0.005950f, -0.007194f, +0.002778f, -0.013479f, -0.005520f, -0.007407f, -0.008157f, -0.006230f, -0.013551f, +0.003002f, + -0.002418f, +0.007909f, -0.008628f, -0.001629f, +0.001768f, +0.001834f, +0.005664f, -0.002945f, +0.000957f, +0.005106f, + -0.004328f, +0.001425f, -0.003623f, +0.006666f, -0.002560f, +0.007055f, -0.004876f, +0.000082f, -0.000549f, +0.002542f, + +0.006909f, -0.005377f, -0.001917f, -0.002319f, +0.001705f, -0.001484f, -0.003037f, -0.002786f, -0.000297f, -0.005651f, + +0.002775f, +0.000583f, -0.001020f, +0.006648f, -0.003365f, -0.002001f, +0.001355f, +0.002692f, +0.002308f, -0.000783f, + -0.003054f, +0.001221f, -0.001122f, -0.000793f, -0.000935f, -0.002025f, -0.000453f, -0.000546f, -0.001430f, -0.000837f, + +0.002023f, -0.000717f, +0.000526f, -0.000745f, -0.000559f, -0.000044f, -0.000808f, +0.000962f, +0.000693f, +0.001158f, + -0.001920f, +0.000623f, +0.001404f, -0.001074f, +0.000649f, -0.000733f, -0.000753f, -0.000660f, -0.000359f, +0.000834f, + +0.000441f, -0.000474f, +0.000165f, -0.000662f, -0.000033f, +0.000709f + }, + { + +0.005367f, -0.020868f, -0.014177f, +0.008040f, -0.007105f, -0.014427f, -0.000378f, +0.002574f, +0.002614f, -0.002024f, + -0.001543f, +0.006935f, +0.002769f, +0.007312f, +0.013994f, +0.014076f, +0.002842f, +0.003229f, -0.001861f, +0.003149f, + +0.002990f, +0.008618f, -0.006728f, +0.015560f, +0.000618f, +0.010750f, -0.009151f, -0.006324f, +0.001051f, -0.010723f, + +0.001446f, -0.000815f, -0.004726f, +0.003195f, -0.003966f, +0.004162f, +0.002802f, +0.003016f, +0.000549f, +0.004120f, + -0.000196f, -0.000597f, +0.005862f, -0.002244f, +0.002670f, -0.000374f, -0.004131f, -0.000123f, +0.002857f, -0.002243f, + +0.001647f, -0.002131f, +0.005007f, -0.004441f, +0.000207f, +0.002577f, -0.006388f, +0.001342f, -0.001001f, +0.000244f, + +0.002437f, -0.000797f, +0.002036f, -0.001608f, -0.002371f, +0.000004f, -0.001213f, -0.001241f, +0.000619f, -0.000062f, + +0.000083f, +0.000530f, +0.000632f, -0.000257f, +0.000193f, -0.000668f, +0.001569f, +0.000520f, -0.000363f, -0.000284f, + +0.001120f, -0.000123f, -0.000884f, +0.000166f, -0.001266f, +0.001194f, -0.000095f, -0.000744f, -0.000427f, -0.000510f, + -0.000245f, +0.000652f, +0.001129f, +0.000288f, +0.000125f, +0.000072f + }, + { + -0.015995f, -0.228278f, +0.013865f, -0.001427f, -0.007200f, -0.028106f, +0.016840f, -0.003688f, -0.003905f, -0.006498f, + +0.009538f, +0.006558f, -0.010387f, -0.000697f, +0.020684f, -0.004495f, +0.009447f, +0.000426f, +0.013689f, +0.001422f, + -0.003799f, -0.001771f, -0.005734f, -0.001075f, -0.007814f, +0.003513f, -0.003215f, +0.006936f, -0.003054f, -0.008347f, + -0.000909f, +0.001628f, +0.000619f, -0.003021f, +0.008652f, +0.008984f, +0.000422f, -0.001258f, +0.003822f, -0.002811f, + +0.002470f, -0.000186f, +0.005657f, +0.000527f, -0.001390f, +0.001989f, -0.000688f, -0.000236f, +0.001896f, +0.004233f, + +0.000965f, -0.000334f, -0.003387f, -0.001149f, +0.001277f, +0.000100f, +0.002160f, -0.000594f, +0.002390f, +0.000772f, + -0.004106f, -0.001095f, -0.001262f, -0.001088f, +0.001394f, +0.000102f, -0.000244f, +0.001111f, -0.001866f, -0.001480f, + +0.000666f, -0.001081f, -0.000082f, -0.002160f, -0.000656f, -0.000557f, +0.000660f, -0.000860f, -0.000805f, +0.000777f, + -0.000612f, +0.000660f, -0.000508f, +0.000478f, +0.000586f, -0.000409f, -0.000097f, +0.000167f, +0.000375f, -0.000657f, + -0.000749f, -0.000497f, +0.000029f, +0.000130f, +0.000133f, +0.000306f + }, + { + +0.001128f, -0.064215f, -0.000831f, -0.001152f, +0.000715f, -0.006049f, -0.001143f, -0.004684f, -0.003105f, -0.002436f, + +0.000122f, +0.001158f, -0.005401f, -0.007521f, +0.019881f, +0.004639f, -0.005120f, -0.006649f, -0.008428f, -0.007810f, + -0.011720f, -0.015454f, -0.007950f, -0.020334f, +0.011817f, +0.014160f, -0.015114f, -0.015760f, +0.006902f, -0.003913f, + +0.011691f, +0.010905f, +0.010796f, -0.008309f, -0.000711f, -0.001784f, +0.015884f, +0.005344f, +0.001296f, -0.000781f, + -0.001470f, +0.000806f, -0.000358f, -0.003000f, +0.003243f, +0.004073f, +0.003823f, -0.003219f, +0.005121f, +0.003943f, + +0.000454f, -0.002146f, -0.001797f, +0.000338f, -0.002359f, -0.001799f, +0.001942f, -0.000110f, +0.003680f, -0.000185f, + -0.001796f, +0.000003f, -0.000128f, -0.001220f, +0.001080f, -0.000249f, -0.001763f, -0.001037f, +0.002338f, -0.001378f, + -0.000206f, -0.001135f, -0.001436f, +0.000074f, +0.001757f, +0.000134f, -0.000476f, -0.000192f, +0.000772f, -0.000736f, + +0.000342f, -0.000859f, +0.001262f, -0.000445f, -0.000727f, -0.000545f, -0.000242f, -0.000485f, -0.000112f, -0.000244f, + -0.000159f, +0.000001f, -0.000112f, +0.000141f, -0.000958f, -0.000120f + }, + { + -0.077811f, -0.244827f, -0.000149f, +0.013592f, +0.020904f, -0.041144f, +0.007104f, +0.015484f, +0.013200f, +0.015031f, + -0.007558f, +0.003175f, -0.014598f, +0.021524f, -0.001590f, -0.004614f, -0.009465f, -0.004226f, -0.004405f, +0.009057f, + +0.004638f, +0.004854f, +0.003724f, +0.007051f, -0.013722f, -0.001833f, +0.007053f, -0.007511f, -0.002149f, +0.000981f, + -0.001645f, -0.009694f, -0.005689f, -0.006588f, -0.003691f, -0.005500f, +0.004273f, +0.005848f, -0.001512f, -0.007340f, + -0.000698f, -0.007603f, +0.003318f, +0.003241f, +0.002258f, -0.002197f, -0.002140f, +0.006246f, +0.002869f, +0.007072f, + -0.001234f, +0.008528f, +0.000773f, -0.005865f, -0.005335f, -0.002231f, -0.002135f, +0.002429f, +0.000261f, +0.001369f, + +0.000370f, -0.001432f, -0.001680f, -0.000898f, -0.001742f, +0.001285f, -0.001440f, +0.003931f, +0.000601f, -0.000568f, + +0.001512f, -0.000484f, -0.001501f, +0.000005f, +0.000011f, -0.001305f, +0.001138f, +0.000057f, -0.000137f, +0.000837f, + +0.000142f, +0.001130f, -0.000954f, +0.001083f, +0.000399f, -0.000188f, +0.001326f, -0.000055f, +0.000175f, -0.000195f, + -0.000343f, -0.000955f, -0.001111f, +0.000415f, -0.000323f, -0.000193f + }, + { + -0.001276f, -0.087759f, -0.005329f, -0.000749f, +0.001817f, -0.000745f, +0.003044f, -0.002693f, +0.001649f, +0.002512f, + +0.004156f, -0.002361f, +0.006640f, -0.019800f, +0.032100f, -0.009676f, -0.007050f, -0.001642f, -0.005801f, +0.024524f, + +0.008524f, -0.005609f, +0.007071f, -0.001600f, +0.011633f, +0.000429f, +0.015935f, -0.013386f, +0.016748f, -0.002055f, + +0.002903f, +0.003333f, -0.006391f, +0.001222f, +0.000209f, +0.000670f, +0.003070f, -0.009904f, +0.002081f, +0.005569f, + +0.000915f, +0.002986f, -0.002108f, -0.000393f, +0.004053f, -0.002288f, -0.000082f, +0.001652f, +0.000954f, -0.000377f, + +0.000300f, -0.003615f, +0.004486f, +0.000753f, +0.003591f, +0.001564f, -0.002565f, +0.003498f, +0.000060f, -0.001712f, + +0.003107f, +0.002740f, +0.002810f, -0.000669f, -0.002057f, -0.000133f, +0.000216f, +0.000688f, -0.001044f, +0.000220f, + +0.001285f, +0.001030f, -0.000140f, -0.000414f, -0.000099f, -0.001593f, +0.001576f, -0.001360f, -0.000758f, -0.000133f, + +0.000509f, +0.001473f, +0.000201f, +0.000641f, -0.000660f, +0.000701f, +0.000916f, -0.001175f, +0.001057f, +0.000265f, + -0.000366f, +0.000162f, -0.000242f, +0.000244f, +0.000270f, -0.000881f + }, + { + -0.057711f, +0.001207f, +0.035056f, -0.001933f, -0.011082f, -0.009915f, +0.028519f, -0.001835f, +0.015924f, +0.011410f, + -0.010572f, +0.003134f, -0.009600f, +0.004862f, -0.007872f, +0.010400f, -0.012294f, -0.010325f, -0.009190f, +0.012665f, + +0.005155f, -0.014240f, +0.006356f, +0.000549f, +0.011248f, -0.009164f, +0.004025f, -0.004699f, -0.001141f, -0.003789f, + +0.001384f, -0.004152f, -0.009310f, +0.008780f, +0.003704f, +0.001303f, +0.000088f, +0.003000f, +0.005942f, +0.001298f, + -0.009248f, +0.001437f, +0.004359f, -0.000874f, +0.004071f, +0.003893f, +0.006408f, -0.003830f, -0.000738f, +0.004900f, + -0.001621f, -0.000368f, -0.004016f, +0.001821f, -0.001163f, +0.000589f, -0.000662f, -0.000721f, +0.003545f, -0.000960f, + -0.002676f, +0.002730f, -0.000989f, +0.001748f, -0.000597f, -0.000966f, +0.000680f, +0.001561f, +0.000857f, -0.001947f, + -0.000422f, -0.000333f, +0.000022f, -0.001005f, +0.000869f, +0.000206f, -0.000681f, +0.000776f, -0.000654f, -0.000265f, + -0.001336f, -0.000617f, +0.001351f, -0.000554f, +0.001223f, -0.000766f, +0.000429f, -0.000128f, -0.000384f, -0.000014f, + -0.000073f, -0.000017f, +0.000229f, +0.000092f, -0.000702f, -0.000045f + } + }, + { + { + -0.000973f, +0.017293f, +0.000352f, -0.001860f, +0.016338f, +0.000010f, +0.003004f, -0.002471f, -0.001330f, +0.005912f, + -0.003827f, -0.004653f, -0.007870f, -0.007764f, +0.005155f, +0.005197f, +0.011032f, +0.004662f, +0.009447f, -0.001661f, + +0.001724f, +0.003240f, -0.008783f, +0.007828f, +0.004879f, +0.018418f, +0.001860f, -0.005210f, +0.004582f, +0.002066f, + -0.000556f, -0.000340f, -0.004555f, -0.004078f, -0.005754f, -0.004611f, +0.002187f, -0.000515f, -0.001459f, -0.001223f, + +0.009161f, +0.004824f, -0.006005f, -0.002966f, -0.003901f, +0.002047f, +0.002166f, -0.001868f, +0.001548f, -0.002010f, + -0.000277f, +0.003032f, -0.000936f, +0.000032f, -0.000637f, -0.000100f, -0.001396f, -0.000412f, -0.001020f, +0.001381f, + +0.000239f, -0.000758f, -0.000129f, +0.001519f, -0.001286f, +0.001081f, -0.001050f, +0.000425f, -0.001035f, -0.000133f, + -0.001302f, +0.000410f, -0.001168f, +0.000010f, +0.000556f, +0.000405f, +0.000855f, +0.000351f, +0.000647f, -0.000512f, + +0.000945f, +0.000581f, -0.000101f, +0.001388f, +0.000040f, +0.000400f, -0.000324f, +0.000297f, -0.000367f, +0.000526f, + -0.000227f, -0.000376f, -0.000210f, -0.000081f, -0.000211f, +0.000190f + }, + { + +0.009763f, +0.004454f, -0.034351f, -0.018608f, +0.016159f, -0.000144f, +0.000234f, -0.005902f, -0.002649f, +0.005296f, + -0.008636f, +0.001683f, +0.005663f, +0.001229f, -0.001300f, -0.003418f, -0.005309f, +0.009072f, +0.006164f, +0.003134f, + +0.001791f, +0.012477f, +0.000292f, -0.011256f, +0.008059f, +0.001602f, +0.000261f, -0.004599f, +0.004050f, +0.005592f, + +0.001246f, -0.006871f, +0.002575f, -0.004830f, +0.000663f, +0.000300f, +0.000570f, -0.000308f, -0.003393f, -0.005693f, + +0.000229f, +0.002155f, +0.002937f, -0.000867f, +0.003095f, -0.004861f, -0.000172f, -0.006154f, -0.001405f, +0.004710f, + +0.003651f, +0.001214f, -0.000083f, -0.000854f, +0.000571f, -0.002675f, +0.003413f, -0.001110f, +0.000114f, +0.002887f, + -0.000772f, +0.001588f, -0.000809f, +0.000189f, +0.001123f, +0.001391f, +0.000226f, +0.000812f, +0.000211f, +0.001036f, + -0.000600f, -0.001631f, -0.000239f, -0.000174f, +0.000726f, -0.000002f, +0.000393f, -0.001519f, +0.000221f, +0.000493f, + +0.000759f, -0.000171f, +0.000310f, -0.000693f, +0.001344f, +0.000431f, -0.000165f, +0.000152f, +0.000384f, +0.000822f, + -0.000046f, +0.000006f, -0.000365f, +0.000418f, -0.000226f, -0.000086f + }, + { + -0.001096f, +0.022313f, -0.004648f, +0.036195f, +0.016938f, +0.000861f, -0.002972f, -0.003099f, -0.001159f, +0.000544f, + -0.005685f, +0.007919f, -0.016394f, +0.008968f, +0.000305f, +0.008267f, +0.000170f, +0.002546f, -0.003156f, +0.011450f, + +0.015241f, -0.005330f, -0.017237f, +0.003558f, +0.000452f, -0.009852f, +0.012480f, -0.003109f, +0.006475f, -0.002289f, + -0.001475f, -0.003500f, -0.006414f, +0.000576f, +0.003587f, -0.005415f, +0.002834f, -0.000711f, -0.001607f, -0.000637f, + +0.003545f, +0.002445f, +0.001064f, -0.004704f, +0.000139f, -0.000935f, +0.001266f, +0.000155f, +0.000030f, +0.000048f, + -0.000040f, +0.001571f, +0.003306f, -0.000390f, -0.000523f, -0.000753f, -0.000540f, +0.000865f, +0.002198f, +0.001500f, + -0.000796f, +0.000698f, -0.000625f, -0.001983f, -0.001337f, -0.000781f, +0.001802f, -0.001302f, -0.002002f, -0.001176f, + -0.000292f, -0.000700f, +0.000623f, +0.002168f, +0.000834f, +0.001414f, +0.000440f, +0.000464f, +0.000328f, +0.000124f, + +0.001609f, -0.000406f, -0.000951f, +0.000342f, +0.000065f, -0.000772f, -0.000494f, +0.000242f, -0.000739f, -0.000295f, + +0.000315f, +0.000686f, -0.000124f, +0.000329f, +0.000039f, -0.000138f + }, + { + +0.001129f, -0.051037f, +0.005440f, +0.002638f, -0.000638f, +0.000794f, -0.001314f, +0.001625f, -0.005840f, +0.003220f, + +0.000222f, -0.004674f, -0.008826f, +0.013927f, -0.024110f, -0.011530f, -0.012142f, +0.026837f, -0.036461f, +0.032834f, + -0.003450f, +0.001357f, +0.000850f, -0.003213f, -0.001174f, +0.003654f, +0.011294f, +0.004884f, +0.001911f, -0.004996f, + -0.001521f, -0.004507f, -0.007145f, +0.000394f, -0.002642f, -0.005366f, +0.008311f, -0.004279f, +0.005295f, -0.001872f, + -0.002038f, -0.004355f, -0.002292f, -0.003412f, +0.004816f, -0.002460f, +0.004662f, -0.000648f, -0.000998f, -0.000883f, + -0.001577f, +0.001020f, -0.002195f, +0.002355f, +0.001704f, +0.002786f, -0.000159f, +0.000117f, +0.000014f, -0.000274f, + -0.000488f, +0.001225f, -0.000264f, +0.000272f, +0.000581f, +0.002108f, +0.001050f, -0.002120f, -0.001619f, +0.000698f, + -0.001430f, -0.000895f, +0.000885f, +0.000677f, +0.000698f, +0.001912f, -0.001119f, -0.000912f, +0.000044f, +0.000663f, + -0.000097f, +0.000478f, -0.000273f, +0.000915f, -0.000038f, +0.000430f, -0.000415f, +0.000052f, -0.000500f, -0.000994f, + +0.000163f, +0.000080f, +0.000454f, +0.000348f, -0.000055f, +0.000100f + }, + { + -0.028478f, +0.008696f, +0.002069f, -0.047326f, +0.014084f, +0.003024f, +0.008180f, +0.000785f, +0.002763f, -0.014122f, + +0.009982f, +0.002187f, +0.011877f, +0.002001f, -0.002959f, -0.008782f, -0.010356f, -0.003530f, -0.000308f, +0.008026f, + -0.004985f, -0.006035f, +0.006968f, -0.004802f, -0.006153f, +0.001570f, +0.000586f, +0.001456f, -0.004596f, -0.006207f, + -0.004321f, +0.000997f, -0.008076f, -0.001141f, +0.004803f, +0.005120f, +0.002410f, +0.003199f, +0.001205f, -0.002583f, + -0.004719f, +0.000482f, +0.001461f, -0.001346f, -0.003129f, +0.002009f, +0.005848f, -0.000235f, +0.000250f, -0.003508f, + -0.004041f, +0.003176f, -0.000849f, -0.002803f, -0.000510f, -0.001715f, +0.001000f, -0.001280f, -0.002865f, -0.000838f, + +0.002052f, -0.001115f, -0.000488f, +0.001463f, -0.000087f, -0.001935f, +0.000138f, -0.000062f, +0.000462f, +0.000450f, + +0.000747f, -0.000739f, +0.001501f, +0.000021f, +0.001406f, +0.000372f, +0.000614f, +0.000631f, -0.001338f, -0.000122f, + -0.001311f, +0.000054f, +0.000537f, -0.000450f, -0.000715f, -0.000086f, -0.000150f, +0.000457f, -0.000936f, +0.000195f, + +0.000055f, -0.000038f, -0.000334f, +0.000082f, -0.000187f, -0.000009f + }, + { + -0.001346f, +0.019723f, -0.000836f, -0.002422f, +0.000419f, -0.001402f, +0.001410f, +0.002104f, -0.001715f, +0.003476f, + -0.000098f, +0.002418f, -0.005293f, +0.003895f, +0.016771f, -0.008781f, -0.007015f, +0.010681f, +0.005818f, -0.003336f, + +0.002709f, +0.008355f, +0.004256f, -0.005528f, -0.010140f, +0.010294f, -0.016610f, -0.009766f, -0.000524f, +0.017874f, + +0.007051f, -0.004353f, -0.004571f, -0.001322f, -0.002126f, +0.004693f, +0.003077f, +0.004233f, -0.002614f, -0.003267f, + +0.003773f, -0.005148f, -0.001282f, -0.000532f, +0.001080f, +0.003930f, -0.002385f, -0.003654f, -0.001653f, +0.003472f, + +0.000307f, -0.001499f, +0.001727f, -0.002549f, -0.000493f, +0.001544f, +0.000097f, -0.000159f, -0.000785f, +0.000290f, + -0.001564f, -0.001262f, -0.000837f, +0.000078f, -0.003199f, -0.001011f, -0.000108f, +0.000327f, +0.001642f, -0.001123f, + +0.000920f, +0.002322f, +0.000988f, +0.000207f, -0.000260f, -0.000227f, +0.000054f, +0.000596f, -0.000221f, -0.000454f, + +0.001537f, +0.000679f, +0.000776f, -0.000647f, -0.000003f, -0.000281f, +0.000516f, +0.000643f, +0.000429f, +0.000074f, + -0.000030f, -0.000195f, -0.000052f, +0.000610f, +0.000385f, +0.000259f + }, + { + -0.008571f, +0.188020f, -0.008568f, +0.031091f, +0.010201f, +0.000318f, +0.000859f, +0.019666f, -0.008434f, -0.001519f, + +0.002451f, +0.011166f, +0.007019f, -0.000628f, -0.002804f, -0.011806f, +0.003709f, +0.002190f, +0.000004f, -0.006312f, + +0.000951f, +0.003666f, -0.006096f, -0.006252f, +0.001642f, -0.002885f, -0.000996f, -0.001704f, +0.002720f, -0.000240f, + -0.006532f, +0.001471f, +0.004781f, +0.000030f, -0.002238f, +0.000023f, +0.001062f, +0.002288f, -0.002375f, +0.005553f, + +0.002617f, -0.004832f, -0.001349f, -0.003629f, -0.001992f, -0.001746f, +0.008741f, -0.006230f, +0.002006f, -0.003751f, + +0.001559f, +0.002556f, -0.003613f, +0.000646f, -0.001215f, -0.001062f, -0.001790f, +0.002349f, +0.000854f, -0.000102f, + +0.003139f, +0.001762f, +0.001587f, +0.001941f, -0.000194f, -0.000385f, +0.001496f, +0.001835f, -0.000888f, -0.000874f, + -0.000870f, -0.000692f, -0.000478f, +0.000016f, +0.000101f, +0.001855f, -0.000356f, -0.000722f, +0.000295f, +0.001069f, + -0.000027f, +0.000813f, +0.000439f, -0.000902f, -0.000732f, -0.000642f, +0.000764f, +0.000379f, -0.001071f, +0.000013f, + +0.000045f, +0.000354f, +0.000511f, -0.000141f, +0.000886f, -0.000690f + }, + { + -0.001736f, +0.005523f, +0.005937f, +0.001971f, +0.002739f, +0.001216f, -0.000302f, -0.002417f, -0.000360f, +0.003120f, + +0.003847f, -0.006112f, -0.005254f, +0.005452f, +0.019622f, -0.020173f, +0.001896f, +0.007850f, -0.005185f, -0.020293f, + -0.008009f, -0.007788f, -0.008812f, +0.010854f, -0.009308f, +0.000172f, +0.016028f, +0.005816f, -0.002416f, -0.011589f, + -0.001844f, -0.007956f, -0.000571f, +0.003916f, -0.006938f, -0.005900f, -0.007300f, -0.005176f, +0.009968f, +0.002648f, + -0.004649f, -0.002446f, +0.002342f, -0.001545f, -0.001979f, -0.002098f, -0.001384f, +0.004999f, -0.001133f, -0.001156f, + -0.001662f, +0.002400f, -0.004285f, -0.000549f, +0.001121f, -0.001074f, +0.000296f, +0.002032f, +0.000042f, -0.000040f, + -0.002156f, -0.003663f, -0.001012f, -0.000212f, +0.001747f, -0.000097f, -0.001179f, -0.001092f, -0.002123f, -0.000483f, + +0.001182f, +0.001618f, -0.001917f, -0.000222f, -0.000051f, -0.000890f, -0.000884f, -0.000500f, -0.000439f, -0.000103f, + +0.000195f, -0.000049f, +0.000153f, -0.000655f, -0.000590f, +0.000256f, -0.000824f, -0.000355f, -0.000573f, +0.000685f, + -0.000068f, +0.000552f, +0.000412f, -0.000135f, -0.000508f, -0.000148f + }, + { + -0.049888f, -0.081645f, +0.005626f, +0.032198f, +0.005603f, -0.004636f, -0.001105f, -0.007612f, +0.001004f, +0.002377f, + -0.000860f, -0.013526f, +0.007968f, -0.002669f, -0.019305f, -0.003603f, -0.005844f, -0.017577f, +0.000785f, -0.007369f, + +0.006901f, -0.002120f, -0.001879f, -0.002643f, +0.002444f, +0.002094f, +0.004077f, +0.000503f, -0.001977f, +0.005059f, + -0.000669f, +0.000715f, -0.006837f, +0.005837f, -0.004752f, +0.007603f, -0.000915f, +0.000041f, -0.001207f, +0.004641f, + -0.002821f, -0.000265f, -0.001505f, -0.001210f, +0.000338f, -0.003379f, +0.000875f, -0.003087f, +0.002604f, -0.009498f, + +0.002756f, +0.000343f, -0.000839f, +0.003474f, -0.001887f, -0.000854f, -0.000479f, +0.003555f, +0.003147f, -0.001730f, + -0.002776f, +0.000470f, +0.001068f, -0.001590f, -0.002674f, -0.000917f, -0.002981f, +0.000690f, -0.001563f, -0.001155f, + +0.001055f, +0.000185f, +0.000331f, +0.000093f, +0.000050f, -0.001017f, +0.000007f, +0.000831f, +0.000786f, +0.000591f, + -0.000482f, +0.000330f, +0.000405f, -0.000374f, +0.000360f, -0.000560f, -0.001699f, -0.000569f, +0.000301f, +0.000722f, + +0.000142f, -0.000242f, -0.000190f, -0.000073f, +0.000068f, +0.000406f + }, + { + -0.002803f, -0.020361f, +0.001513f, -0.015564f, +0.003679f, +0.000142f, -0.018963f, +0.011190f, +0.001410f, -0.003742f, + -0.002071f, +0.001210f, +0.010752f, +0.003973f, +0.026532f, +0.007620f, -0.006805f, +0.009636f, -0.008173f, +0.003691f, + +0.003501f, -0.001057f, +0.003653f, +0.009766f, +0.001978f, +0.008220f, -0.005422f, -0.004007f, +0.002086f, -0.005176f, + -0.005655f, +0.003729f, -0.006433f, +0.008923f, -0.001581f, -0.001692f, +0.011517f, +0.004702f, +0.001975f, +0.002050f, + +0.003565f, -0.002904f, +0.007178f, -0.003788f, +0.002754f, -0.002148f, +0.001493f, -0.003288f, +0.001391f, -0.000241f, + +0.003030f, -0.000247f, +0.003558f, -0.003498f, -0.000410f, -0.002223f, -0.000114f, +0.000402f, -0.002087f, +0.000525f, + +0.002078f, -0.000075f, -0.000786f, +0.000824f, -0.002689f, +0.000504f, -0.000919f, +0.000464f, -0.000745f, +0.000618f, + -0.000916f, +0.001016f, +0.000193f, -0.000024f, -0.000082f, -0.000364f, +0.000185f, +0.000139f, -0.000266f, -0.000479f, + +0.000052f, +0.001113f, -0.000954f, -0.000070f, -0.000896f, -0.000148f, +0.000282f, -0.000248f, -0.000880f, +0.000103f, + +0.000123f, +0.000944f, +0.001277f, -0.000356f, +0.000525f, -0.000143f + }, + { + +0.009682f, -0.238430f, -0.006568f, -0.013793f, -0.008123f, +0.000096f, +0.007677f, -0.006038f, -0.004406f, -0.008444f, + +0.009419f, +0.002497f, -0.000295f, -0.004510f, +0.021770f, -0.008543f, +0.006271f, +0.018505f, +0.002431f, +0.003953f, + -0.002857f, -0.009451f, -0.010249f, +0.002939f, -0.006476f, +0.001385f, -0.001245f, +0.006136f, -0.001289f, -0.001695f, + -0.000550f, +0.001074f, +0.001810f, -0.003727f, +0.012236f, +0.008244f, -0.004901f, +0.001946f, +0.003526f, -0.002041f, + +0.003453f, -0.001644f, +0.003018f, +0.001454f, +0.002131f, +0.000998f, -0.000129f, -0.001386f, +0.003455f, +0.000837f, + +0.001624f, +0.000269f, -0.002125f, +0.001200f, -0.001817f, -0.001699f, -0.000093f, +0.001118f, +0.004267f, -0.000423f, + -0.003848f, -0.001415f, -0.000357f, -0.000530f, +0.001338f, -0.000042f, +0.001868f, -0.002482f, +0.000706f, -0.001604f, + -0.000204f, -0.000683f, -0.001749f, -0.000469f, -0.001092f, -0.001057f, +0.000879f, -0.000867f, -0.000738f, +0.000057f, + -0.000371f, -0.000213f, +0.000183f, +0.000129f, +0.001020f, -0.001070f, +0.000094f, +0.000738f, +0.000042f, -0.000876f, + -0.000333f, -0.000313f, -0.000460f, +0.000112f, +0.000186f, -0.000156f + }, + { + +0.001324f, -0.065339f, +0.004474f, -0.005516f, -0.003283f, -0.002870f, -0.007421f, -0.004432f, +0.008554f, -0.004634f, + -0.004422f, +0.001055f, -0.001431f, +0.007396f, +0.013676f, +0.000638f, -0.007760f, -0.000169f, -0.002555f, -0.012673f, + -0.010242f, -0.022724f, -0.007092f, -0.011509f, +0.004113f, +0.007105f, -0.026385f, -0.007078f, +0.009305f, +0.008630f, + -0.005617f, +0.014559f, -0.006729f, +0.001310f, -0.005919f, +0.008498f, +0.005130f, +0.013817f, +0.004084f, -0.007987f, + +0.002362f, +0.004887f, -0.004542f, +0.001999f, -0.002727f, +0.004622f, +0.002006f, -0.004251f, +0.006119f, +0.002013f, + +0.000648f, -0.000551f, +0.000985f, -0.000696f, -0.001592f, -0.002851f, +0.001958f, +0.000692f, +0.002065f, +0.000215f, + -0.000793f, -0.000676f, -0.001508f, -0.002471f, +0.002710f, -0.000777f, -0.001738f, +0.000692f, +0.000019f, +0.000981f, + +0.000396f, -0.001659f, -0.001667f, +0.000473f, +0.000548f, +0.000988f, +0.000988f, -0.001027f, +0.000343f, -0.000230f, + -0.000560f, +0.000618f, +0.000522f, -0.000667f, -0.000452f, -0.000866f, -0.001011f, -0.000065f, -0.000108f, -0.000909f, + +0.000264f, +0.000113f, -0.000354f, -0.000109f, -0.000513f, -0.000142f + }, + { + +0.022673f, -0.373714f, -0.009900f, +0.000787f, +0.031600f, -0.011753f, -0.004965f, +0.006388f, +0.016903f, -0.003656f, + -0.003702f, +0.003070f, +0.000890f, +0.006249f, +0.003489f, -0.007214f, -0.009668f, +0.004944f, -0.008892f, +0.002053f, + +0.009269f, +0.003200f, +0.006554f, -0.003087f, -0.004379f, -0.006768f, -0.003242f, -0.005920f, -0.000886f, +0.004239f, + -0.005837f, -0.006988f, -0.000558f, -0.009018f, -0.004618f, -0.000498f, +0.000690f, +0.006971f, -0.007279f, -0.006664f, + +0.002403f, -0.013085f, +0.003745f, +0.003581f, -0.004515f, +0.002040f, +0.004104f, -0.000864f, +0.006531f, +0.003953f, + +0.000012f, +0.000679f, +0.003156f, -0.005156f, -0.002966f, +0.000727f, -0.004063f, +0.000487f, -0.000567f, +0.003850f, + -0.000017f, -0.001827f, -0.001141f, -0.001633f, +0.000539f, -0.000262f, -0.000980f, +0.001795f, +0.001469f, +0.000823f, + +0.000070f, -0.000356f, -0.000352f, -0.000417f, +0.000794f, -0.000062f, -0.000074f, -0.001417f, +0.001318f, -0.000212f, + +0.000362f, +0.000134f, -0.000208f, +0.000128f, +0.000425f, +0.000469f, +0.000344f, +0.000429f, +0.000570f, -0.000976f, + -0.001189f, -0.000051f, -0.000622f, -0.000365f, -0.000378f, -0.000069f + }, + { + +0.002352f, -0.084206f, -0.018370f, +0.006025f, -0.001206f, +0.005765f, -0.009887f, +0.001233f, -0.000063f, +0.005906f, + +0.003403f, +0.004337f, +0.002363f, +0.000296f, +0.001308f, +0.001091f, -0.009172f, -0.006848f, +0.002657f, +0.018814f, + +0.003671f, +0.001674f, +0.007495f, +0.004074f, -0.001058f, +0.009945f, -0.001318f, -0.008001f, +0.009480f, +0.011477f, + +0.011904f, -0.008254f, -0.006438f, -0.002200f, +0.006423f, -0.007371f, +0.005342f, -0.002001f, -0.000016f, +0.000273f, + +0.004074f, +0.003913f, +0.001567f, -0.002044f, +0.002993f, -0.006046f, +0.002369f, +0.003117f, +0.003568f, -0.002257f, + +0.000247f, -0.002526f, +0.003920f, -0.000888f, +0.003464f, +0.000751f, -0.001607f, +0.002713f, +0.000303f, +0.001037f, + +0.004483f, +0.001427f, +0.002043f, -0.000026f, -0.000980f, -0.001909f, +0.000422f, +0.000585f, +0.000037f, +0.000365f, + +0.000896f, +0.000440f, -0.001503f, +0.000603f, -0.000397f, -0.000591f, -0.000720f, -0.000757f, -0.001398f, -0.000029f, + +0.002183f, +0.000437f, +0.000136f, +0.000661f, -0.000519f, +0.000312f, -0.000049f, +0.000123f, +0.000442f, +0.000336f, + +0.000350f, +0.000122f, -0.000414f, +0.000320f, +0.000227f, -0.000289f + }, + { + +0.048070f, -0.124361f, +0.003022f, +0.002885f, -0.002167f, +0.007516f, +0.018385f, +0.005566f, +0.013320f, -0.001483f, + +0.005198f, +0.002602f, -0.011035f, +0.004164f, -0.014522f, +0.011422f, -0.005623f, -0.000757f, -0.010522f, +0.004080f, + -0.008987f, +0.005383f, -0.006829f, +0.010129f, -0.002215f, -0.007726f, -0.002009f, -0.000838f, +0.005311f, -0.003898f, + -0.001223f, -0.002654f, -0.009798f, +0.003346f, +0.006477f, +0.001259f, +0.000131f, +0.005089f, +0.000676f, +0.005190f, + -0.004129f, -0.003805f, +0.007151f, -0.004399f, -0.001745f, +0.006336f, +0.002098f, -0.001634f, +0.001339f, -0.000291f, + +0.002872f, -0.000190f, -0.001002f, -0.000335f, -0.000537f, -0.000520f, -0.000853f, +0.002425f, -0.001307f, -0.000330f, + -0.000704f, +0.000680f, +0.001975f, -0.001738f, +0.000084f, -0.001402f, +0.000663f, +0.000872f, +0.000518f, -0.000661f, + -0.001194f, -0.000727f, -0.000181f, -0.001732f, +0.000823f, +0.000444f, -0.000069f, -0.000306f, +0.000299f, -0.001517f, + -0.000088f, -0.000053f, -0.000566f, +0.000278f, +0.001211f, -0.000273f, +0.000061f, -0.000227f, -0.000228f, +0.000011f, + -0.000757f, +0.000227f, +0.000074f, -0.000150f, -0.000755f, +0.000155f + } + }, + { + { + +0.001187f, -0.003202f, -0.018527f, -0.033678f, -0.007379f, -0.000161f, +0.007330f, +0.001660f, -0.006333f, +0.002357f, + -0.007882f, +0.000756f, -0.005939f, -0.005538f, +0.011401f, -0.003452f, -0.003868f, -0.003607f, +0.015925f, -0.002938f, + +0.001504f, +0.004899f, -0.015837f, -0.014167f, -0.016724f, -0.003881f, -0.002751f, -0.002193f, +0.006168f, -0.009803f, + -0.015372f, -0.002942f, -0.006785f, -0.002938f, -0.006081f, -0.002543f, +0.000105f, -0.008130f, -0.005807f, +0.000046f, + +0.006655f, +0.003211f, -0.002759f, +0.002408f, -0.001203f, -0.000500f, +0.001986f, -0.002197f, +0.002884f, +0.003596f, + -0.000331f, -0.001858f, -0.002702f, +0.002318f, +0.002410f, +0.003146f, +0.001362f, +0.000196f, -0.000820f, +0.000494f, + -0.000921f, +0.000019f, -0.000395f, +0.000609f, -0.000078f, +0.003065f, -0.001763f, +0.001436f, +0.000789f, +0.001688f, + -0.000207f, +0.000108f, -0.000062f, +0.000274f, -0.000724f, -0.000668f, +0.000258f, -0.000246f, +0.001099f, +0.000275f, + +0.001065f, +0.000624f, -0.000092f, +0.001821f, -0.000575f, -0.000544f, -0.000646f, +0.000208f, -0.001173f, +0.000089f, + +0.000037f, -0.000451f, -0.000256f, -0.000155f, -0.000339f, +0.000399f + }, + { + -0.007757f, +0.027969f, +0.004724f, -0.034436f, +0.005908f, -0.001564f, +0.000998f, -0.004299f, +0.002790f, +0.005644f, + -0.006651f, +0.007075f, +0.003870f, +0.004148f, -0.008697f, -0.014095f, -0.006400f, +0.007574f, -0.000162f, -0.002671f, + -0.007864f, +0.001578f, +0.005912f, -0.003074f, +0.012284f, +0.005909f, -0.005211f, -0.004863f, +0.010867f, +0.004991f, + -0.005022f, -0.009094f, +0.004726f, +0.002234f, +0.008440f, +0.001418f, -0.004635f, -0.001686f, -0.002616f, -0.002426f, + -0.000417f, +0.000372f, +0.004345f, -0.001054f, +0.004181f, -0.003462f, +0.004021f, -0.005075f, -0.000852f, +0.002537f, + -0.001184f, +0.001346f, +0.001072f, -0.003912f, -0.000916f, -0.001749f, +0.004479f, -0.002283f, -0.000831f, +0.000667f, + -0.002175f, +0.000192f, -0.000721f, +0.000793f, -0.000452f, +0.001047f, -0.000591f, +0.001070f, +0.000090f, -0.000292f, + -0.000692f, -0.000851f, +0.000283f, -0.000097f, -0.000369f, +0.000260f, +0.000746f, -0.000940f, +0.000523f, +0.000125f, + +0.000140f, -0.000127f, +0.000600f, -0.000327f, +0.000717f, -0.000651f, -0.000376f, -0.000274f, +0.000302f, +0.000485f, + -0.000017f, +0.000575f, +0.000098f, +0.000398f, -0.000073f, +0.000122f + }, + { + +0.004862f, +0.051467f, -0.000038f, -0.059997f, -0.047661f, +0.003732f, +0.004369f, +0.006185f, +0.003385f, +0.004908f, + +0.004003f, +0.020579f, -0.007347f, +0.015821f, -0.014782f, -0.004573f, -0.005119f, -0.005901f, -0.003071f, +0.008900f, + +0.007586f, -0.002999f, -0.008113f, +0.008462f, +0.005042f, -0.008360f, +0.012760f, -0.005986f, +0.003455f, -0.001134f, + +0.002775f, +0.007148f, -0.000566f, -0.002196f, +0.005481f, -0.000076f, +0.006168f, +0.000143f, -0.001388f, -0.001467f, + +0.003727f, +0.003638f, +0.002270f, -0.002813f, +0.002637f, -0.000181f, +0.002924f, +0.002862f, +0.000181f, +0.000109f, + +0.001003f, +0.000174f, -0.000752f, -0.002184f, +0.001345f, +0.002619f, +0.001753f, -0.000716f, -0.000220f, -0.000119f, + -0.002471f, +0.000999f, -0.000968f, -0.001431f, +0.000580f, -0.000384f, +0.001804f, +0.000178f, -0.000450f, -0.001686f, + -0.000219f, -0.000189f, +0.000595f, +0.000982f, -0.000487f, +0.001419f, +0.000674f, +0.000349f, +0.000504f, -0.000455f, + +0.000551f, -0.000604f, -0.001048f, +0.000210f, +0.000214f, -0.000230f, -0.000155f, +0.001065f, +0.000065f, +0.000199f, + +0.000066f, -0.000018f, -0.000081f, -0.000004f, -0.000406f, -0.000500f + }, + { + -0.002207f, -0.067160f, -0.005098f, +0.000931f, -0.002571f, +0.002061f, +0.001176f, +0.005398f, -0.002647f, +0.005792f, + +0.003234f, -0.000878f, -0.003541f, +0.013047f, -0.016996f, +0.015675f, -0.008134f, +0.013088f, -0.036938f, +0.021014f, + -0.003107f, +0.005797f, +0.007805f, +0.005046f, +0.009553f, +0.004057f, +0.008050f, -0.002985f, +0.002366f, +0.002726f, + -0.000991f, +0.002263f, -0.001647f, -0.002967f, +0.000588f, +0.001324f, +0.006587f, -0.008156f, +0.004487f, -0.001290f, + +0.002913f, -0.002098f, +0.001099f, -0.001023f, +0.004182f, -0.002976f, +0.001582f, -0.000332f, +0.000275f, +0.000656f, + -0.000634f, +0.002475f, -0.001948f, +0.001162f, +0.000475f, +0.002574f, +0.000260f, +0.000639f, -0.001628f, -0.000056f, + -0.000211f, +0.001556f, +0.001147f, +0.001866f, +0.000018f, +0.000497f, +0.000569f, -0.000986f, -0.000475f, +0.001399f, + -0.000791f, -0.000530f, +0.000351f, -0.000788f, -0.000385f, +0.001065f, -0.000409f, -0.000444f, -0.000606f, -0.000368f, + -0.000644f, +0.000043f, -0.000647f, -0.000091f, -0.001188f, +0.000327f, +0.000196f, +0.000065f, -0.000288f, -0.000496f, + -0.000013f, +0.000022f, +0.000087f, -0.000155f, +0.000129f, +0.000029f + }, + { + +0.002370f, +0.018066f, -0.012417f, -0.060047f, -0.011080f, -0.000393f, -0.000692f, -0.003000f, +0.010921f, -0.000255f, + +0.013079f, -0.009443f, +0.008426f, +0.003281f, +0.012254f, -0.002407f, -0.018790f, -0.007453f, +0.004196f, +0.010023f, + -0.002574f, +0.000365f, +0.003912f, -0.009080f, -0.009856f, -0.005684f, -0.002015f, +0.007412f, -0.001325f, -0.002440f, + -0.001560f, +0.000105f, -0.002846f, +0.000403f, +0.004968f, +0.009756f, -0.002795f, -0.000427f, -0.000587f, -0.007075f, + -0.005832f, +0.000153f, +0.006996f, -0.001822f, -0.003182f, +0.004364f, +0.002636f, -0.006006f, -0.000013f, +0.002219f, + -0.000248f, +0.002845f, -0.000859f, -0.000786f, +0.000685f, +0.000658f, +0.000731f, +0.000140f, -0.000514f, +0.001226f, + +0.001834f, -0.001689f, +0.000428f, +0.000663f, +0.000583f, -0.000656f, -0.001407f, -0.000729f, -0.000406f, -0.001414f, + +0.000678f, -0.000752f, +0.000869f, -0.000960f, +0.000159f, -0.001079f, -0.000516f, -0.000121f, -0.000362f, +0.001057f, + -0.000687f, +0.000735f, +0.000857f, -0.000756f, -0.000539f, -0.000475f, -0.000667f, +0.000609f, -0.000313f, +0.000557f, + -0.000423f, +0.000075f, +0.000094f, +0.000157f, -0.000439f, -0.000317f + }, + { + +0.000737f, +0.032727f, +0.000981f, -0.003429f, +0.001196f, -0.000110f, +0.001082f, +0.001035f, -0.002814f, -0.000262f, + -0.000800f, +0.004193f, -0.003990f, -0.008128f, +0.009258f, -0.011611f, -0.025394f, +0.001647f, -0.001108f, -0.013683f, + -0.009777f, +0.001968f, +0.009518f, +0.009096f, -0.007580f, +0.002677f, +0.020336f, +0.020383f, -0.000989f, +0.014830f, + +0.002252f, -0.007863f, +0.003627f, +0.003251f, -0.004912f, +0.002704f, +0.000560f, +0.002137f, -0.004530f, -0.002953f, + +0.005928f, -0.000554f, +0.004940f, +0.000655f, +0.000978f, +0.004524f, -0.000976f, +0.000155f, +0.001949f, +0.004418f, + -0.000606f, -0.001369f, +0.001529f, -0.001519f, +0.001530f, +0.001994f, -0.000865f, -0.001219f, -0.000819f, -0.000404f, + -0.001101f, +0.000200f, -0.000782f, +0.000876f, -0.001820f, -0.000788f, -0.000560f, -0.000466f, +0.001164f, -0.000472f, + +0.000380f, +0.000440f, -0.000289f, -0.000535f, -0.000103f, +0.000636f, -0.000404f, -0.000088f, -0.000092f, -0.000059f, + +0.001916f, -0.000962f, -0.000165f, -0.000476f, +0.000199f, -0.000320f, -0.000050f, -0.000318f, +0.000055f, -0.000644f, + -0.000164f, +0.000401f, -0.000023f, +0.000243f, -0.000417f, -0.000104f + }, + { + -0.030346f, +0.134082f, -0.002187f, +0.027020f, -0.010595f, -0.001053f, -0.002105f, +0.015737f, -0.004751f, +0.006875f, + +0.006302f, +0.003048f, +0.002625f, -0.003971f, +0.002127f, -0.005172f, +0.001787f, -0.002063f, +0.001161f, +0.001678f, + +0.004341f, +0.000415f, -0.005287f, +0.002507f, +0.005358f, -0.000623f, -0.000365f, -0.005631f, +0.003598f, +0.001495f, + -0.000165f, +0.005659f, +0.004171f, +0.002101f, -0.002126f, -0.001475f, -0.003636f, +0.001617f, +0.000226f, +0.005369f, + +0.002603f, -0.003225f, +0.001436f, -0.004182f, -0.002303f, -0.002081f, +0.002983f, -0.007194f, +0.002159f, -0.004146f, + +0.003107f, +0.003265f, -0.000602f, +0.003172f, +0.001768f, +0.002434f, -0.000859f, +0.003112f, +0.001078f, -0.001174f, + +0.000798f, +0.000339f, +0.000363f, +0.000212f, +0.000368f, +0.000622f, +0.000838f, +0.000324f, -0.000713f, +0.000958f, + -0.000103f, -0.000532f, -0.000847f, -0.000073f, -0.001101f, -0.000052f, -0.000132f, +0.000555f, +0.000899f, +0.000647f, + -0.000096f, +0.000602f, +0.000784f, -0.000234f, -0.000775f, -0.000312f, +0.000170f, -0.000391f, -0.001203f, -0.000134f, + -0.000015f, -0.000325f, +0.000044f, -0.000321f, +0.000861f, -0.000348f + }, + { + +0.000094f, +0.006424f, -0.002427f, -0.002685f, -0.000143f, -0.000594f, -0.001244f, +0.001627f, +0.002195f, +0.000555f, + +0.000437f, -0.004958f, +0.000874f, +0.005058f, +0.012933f, -0.038656f, +0.000337f, +0.016852f, -0.006869f, -0.007737f, + +0.011627f, +0.001481f, -0.005700f, +0.011829f, -0.007781f, -0.007188f, +0.015074f, +0.014136f, +0.005627f, -0.006455f, + -0.000793f, +0.005761f, -0.000594f, +0.000509f, +0.000645f, +0.003043f, -0.004489f, -0.005164f, +0.008323f, +0.005502f, + -0.000377f, -0.000496f, +0.000212f, -0.004304f, -0.000245f, +0.000476f, +0.001152f, +0.005643f, -0.001089f, -0.003612f, + -0.002908f, +0.003365f, -0.001748f, -0.000118f, -0.000364f, -0.000124f, -0.000667f, -0.000286f, -0.000088f, +0.001188f, + +0.000316f, -0.001280f, -0.000958f, +0.000825f, +0.001433f, -0.000606f, -0.000155f, -0.000358f, -0.000525f, +0.000689f, + +0.000065f, +0.001582f, -0.000357f, +0.000386f, +0.000290f, +0.000006f, -0.000365f, +0.000135f, +0.000697f, +0.000331f, + -0.000298f, +0.000451f, +0.000531f, -0.000570f, +0.000279f, +0.000388f, -0.000295f, -0.000328f, -0.000530f, +0.000110f, + -0.001328f, +0.000230f, +0.000041f, +0.000368f, +0.000445f, +0.000288f + }, + { + +0.037299f, +0.002424f, -0.001450f, +0.026346f, -0.015979f, -0.006415f, +0.002118f, -0.007413f, +0.001098f, +0.002424f, + +0.002628f, -0.000334f, +0.019764f, +0.004572f, -0.014916f, +0.006464f, +0.002622f, -0.007694f, +0.014143f, +0.001202f, + +0.007105f, -0.005404f, +0.003940f, -0.000071f, +0.000514f, +0.002364f, +0.001562f, -0.000207f, -0.004686f, +0.000811f, + -0.003319f, -0.004227f, -0.005367f, +0.009229f, -0.005332f, +0.004020f, +0.002345f, +0.000523f, -0.003281f, +0.000086f, + -0.003524f, +0.000953f, -0.002499f, -0.000553f, -0.001262f, -0.003428f, +0.000860f, -0.002314f, +0.003488f, -0.009205f, + +0.003051f, -0.001273f, -0.003049f, -0.000961f, -0.001112f, +0.000894f, -0.000216f, -0.000196f, +0.001581f, -0.000515f, + -0.001562f, +0.000200f, +0.000976f, -0.000485f, -0.002057f, +0.001242f, -0.000985f, +0.000516f, -0.000380f, -0.000662f, + +0.000318f, +0.000406f, +0.000289f, -0.000155f, +0.001037f, +0.000576f, +0.001144f, +0.000193f, +0.000239f, +0.000143f, + -0.000182f, +0.000610f, +0.000219f, -0.000730f, +0.000010f, -0.000022f, -0.000727f, +0.000027f, +0.000560f, +0.000084f, + -0.000566f, -0.000462f, -0.000051f, +0.000506f, +0.000138f, +0.000342f + }, + { + +0.000676f, -0.042817f, -0.020600f, -0.010351f, +0.019446f, +0.013730f, -0.017605f, +0.005559f, -0.007490f, -0.007386f, + -0.004239f, +0.003357f, +0.011369f, -0.003904f, +0.012914f, -0.006353f, -0.013810f, +0.005661f, -0.018950f, -0.021188f, + -0.005948f, -0.006813f, +0.005274f, +0.006072f, -0.006120f, +0.004867f, -0.004075f, -0.004153f, +0.006772f, +0.007051f, + -0.008668f, +0.000551f, -0.009817f, +0.001821f, +0.004793f, +0.002265f, +0.010769f, +0.004165f, +0.000245f, +0.002524f, + +0.003793f, -0.004496f, +0.003616f, -0.008557f, +0.000666f, -0.001827f, +0.002075f, -0.002425f, +0.003278f, +0.000491f, + +0.001015f, +0.000398f, +0.003357f, -0.002845f, +0.000826f, -0.001990f, +0.002027f, +0.001338f, -0.002263f, -0.002180f, + -0.001841f, -0.001694f, -0.000700f, +0.002018f, -0.001967f, +0.001253f, -0.000233f, +0.001734f, -0.000494f, -0.000356f, + -0.000678f, -0.001252f, -0.001077f, -0.000089f, -0.000231f, -0.000668f, -0.001148f, -0.000775f, +0.000045f, +0.000041f, + -0.000295f, +0.001076f, -0.001015f, +0.000090f, -0.000370f, -0.000739f, -0.000145f, +0.000432f, +0.000201f, +0.000583f, + -0.000031f, +0.000583f, +0.000530f, -0.000232f, +0.000375f, -0.000695f + }, + { + -0.007393f, -0.268351f, -0.003347f, -0.006154f, -0.009009f, +0.020645f, -0.003380f, -0.007489f, +0.004113f, -0.004464f, + +0.007436f, -0.002139f, +0.004635f, +0.001737f, +0.003838f, -0.014382f, +0.001470f, +0.014360f, -0.006538f, +0.003801f, + +0.007408f, -0.003057f, -0.006448f, +0.004765f, -0.001241f, +0.004560f, -0.004781f, +0.007255f, +0.004860f, +0.002172f, + +0.004385f, +0.001702f, -0.001312f, -0.000542f, +0.003754f, -0.007142f, -0.007118f, -0.001176f, -0.001570f, -0.002395f, + +0.005340f, -0.002311f, -0.002988f, -0.002092f, -0.000586f, -0.000239f, -0.001399f, -0.003805f, +0.000850f, -0.004452f, + +0.000479f, +0.003781f, -0.000941f, +0.000807f, -0.000294f, +0.000350f, -0.000826f, +0.000781f, +0.001029f, -0.000755f, + -0.001072f, -0.000336f, +0.000747f, +0.000450f, +0.001350f, -0.001100f, +0.001416f, -0.001638f, +0.002184f, -0.000625f, + +0.000464f, -0.000652f, -0.001244f, +0.000637f, -0.001982f, -0.001310f, -0.000171f, -0.000597f, +0.000920f, +0.000081f, + +0.000118f, -0.000096f, +0.000098f, -0.000245f, -0.000151f, -0.000699f, +0.000027f, +0.000411f, +0.000141f, +0.000217f, + +0.000526f, +0.000030f, -0.000301f, +0.000012f, +0.000057f, -0.000314f + }, + { + -0.002560f, -0.058642f, +0.018257f, +0.002580f, +0.000598f, +0.001432f, -0.002759f, -0.006456f, +0.009917f, +0.000645f, + -0.004762f, +0.001598f, -0.001434f, +0.003362f, +0.002276f, -0.002717f, -0.003396f, +0.002334f, +0.004029f, -0.002307f, + -0.001910f, -0.009342f, +0.002880f, -0.001705f, -0.012668f, -0.003457f, -0.017660f, -0.008373f, -0.001047f, +0.006241f, + -0.013944f, +0.004255f, -0.015424f, +0.003449f, -0.005349f, +0.008204f, +0.003050f, +0.013400f, +0.001556f, -0.001846f, + +0.009171f, +0.008014f, -0.004004f, +0.003854f, -0.004199f, -0.001946f, -0.004262f, -0.002271f, +0.005889f, -0.000378f, + +0.002710f, +0.001984f, +0.003916f, -0.002759f, -0.001775f, -0.002848f, +0.001325f, +0.001070f, +0.000791f, -0.001412f, + +0.001740f, -0.000154f, -0.002813f, -0.001397f, +0.002831f, +0.000488f, -0.000082f, +0.001499f, -0.001411f, +0.000737f, + +0.002188f, -0.000355f, -0.000858f, +0.001873f, +0.000574f, +0.000321f, +0.000950f, -0.000639f, +0.000052f, -0.000403f, + -0.000267f, -0.000034f, -0.000281f, -0.000470f, +0.000215f, -0.000679f, -0.000585f, +0.000521f, -0.000056f, -0.000749f, + +0.000990f, +0.000527f, -0.000227f, -0.000020f, +0.000177f, +0.000713f + }, + { + +0.037973f, -0.335646f, -0.000300f, -0.009042f, +0.017104f, -0.006782f, +0.002363f, -0.006789f, -0.005202f, -0.017698f, + -0.007507f, -0.002089f, -0.006617f, -0.007528f, -0.005421f, -0.004634f, -0.004646f, +0.002873f, -0.006079f, +0.004668f, + +0.006256f, +0.006524f, +0.003402f, -0.005950f, +0.000847f, -0.003467f, +0.001202f, -0.000216f, -0.002706f, +0.005279f, + -0.001376f, -0.001550f, +0.004061f, +0.000337f, +0.002236f, +0.002384f, -0.003321f, +0.000938f, -0.007959f, -0.004731f, + +0.007169f, -0.007514f, +0.007416f, +0.003113f, -0.006865f, -0.003087f, -0.000367f, -0.002750f, +0.004620f, -0.001904f, + -0.002185f, -0.001187f, +0.000733f, -0.003992f, -0.002728f, -0.000087f, -0.002455f, -0.000784f, -0.001926f, +0.003056f, + +0.000798f, +0.000077f, +0.000566f, -0.000969f, +0.000177f, -0.000155f, -0.000374f, +0.001158f, +0.001285f, +0.001204f, + -0.000338f, -0.000331f, +0.001091f, -0.000313f, +0.001339f, +0.000900f, +0.000537f, -0.001252f, +0.000525f, -0.000536f, + +0.000279f, +0.000011f, +0.000668f, +0.000512f, +0.000036f, +0.000176f, -0.000183f, +0.000085f, +0.000250f, -0.000877f, + -0.000601f, +0.000093f, -0.000712f, -0.000618f, -0.000089f, +0.000125f + }, + { + -0.002512f, -0.078673f, -0.007571f, +0.006640f, +0.004497f, +0.013430f, -0.011635f, +0.001631f, -0.001705f, -0.006650f, + -0.005667f, +0.000206f, -0.005302f, +0.018025f, +0.032457f, -0.005892f, -0.012831f, -0.003797f, +0.008908f, +0.006230f, + -0.012571f, -0.004462f, +0.006330f, +0.000056f, -0.000474f, +0.014473f, +0.007011f, +0.006606f, -0.002483f, +0.006221f, + +0.007019f, -0.003436f, +0.009323f, +0.002511f, +0.004483f, -0.001593f, +0.008009f, +0.000951f, -0.000483f, -0.004390f, + +0.005435f, +0.005507f, +0.002154f, -0.001552f, +0.002512f, -0.005503f, +0.004622f, +0.001594f, -0.000255f, -0.001978f, + +0.000790f, -0.005125f, -0.000488f, -0.003084f, +0.001993f, -0.001167f, -0.000087f, +0.004259f, +0.001156f, +0.000160f, + +0.002455f, -0.001583f, -0.000290f, +0.000313f, +0.001177f, -0.000392f, +0.001060f, +0.000719f, -0.000597f, -0.000429f, + -0.000604f, +0.000397f, +0.000712f, +0.000397f, -0.000778f, -0.000173f, -0.001416f, -0.000222f, -0.000883f, -0.000577f, + +0.001183f, -0.001084f, -0.000762f, -0.000040f, -0.001012f, -0.000203f, -0.000922f, +0.000280f, -0.000157f, -0.000296f, + +0.000444f, -0.000055f, -0.000574f, +0.000618f, +0.000308f, -0.000354f + }, + { + -0.017620f, -0.210453f, -0.017072f, -0.013864f, +0.003972f, -0.004726f, +0.002532f, +0.001787f, +0.008051f, +0.001035f, + +0.011323f, +0.007732f, -0.011975f, +0.005655f, -0.001362f, +0.003172f, -0.001278f, +0.014742f, -0.005104f, +0.000188f, + -0.002471f, +0.013302f, -0.009880f, +0.010124f, -0.003309f, -0.009715f, -0.006523f, -0.000029f, +0.015522f, -0.001841f, + -0.002506f, +0.000244f, -0.000807f, -0.003542f, -0.005826f, -0.003067f, -0.002112f, +0.000473f, -0.001628f, +0.001400f, + -0.002035f, -0.001853f, +0.006260f, -0.002699f, -0.001546f, +0.002126f, +0.000124f, -0.002408f, +0.000815f, -0.000856f, + +0.003255f, -0.004042f, -0.003235f, -0.001475f, -0.001227f, -0.000958f, -0.001130f, +0.001985f, -0.002034f, +0.002388f, + +0.003680f, +0.001670f, +0.001099f, -0.000737f, +0.001289f, -0.000811f, +0.000796f, -0.000994f, +0.000340f, +0.000357f, + -0.000331f, +0.000453f, -0.000130f, -0.001031f, +0.000779f, +0.000283f, +0.000608f, +0.000836f, +0.001031f, -0.001064f, + +0.001217f, +0.000313f, -0.001273f, +0.000164f, +0.000513f, -0.000116f, +0.000483f, +0.000396f, +0.000267f, +0.000995f, + -0.000503f, +0.000003f, +0.000031f, -0.000215f, -0.000439f, +0.000286f + } + }, + { + { + +0.000417f, -0.037139f, +0.013902f, -0.020689f, -0.022905f, -0.000886f, +0.007081f, +0.002082f, -0.009551f, +0.012125f, + -0.005929f, -0.009166f, -0.010357f, +0.007458f, +0.001593f, +0.002385f, +0.001371f, -0.011728f, +0.017293f, +0.007120f, + -0.003762f, -0.001026f, -0.006422f, -0.020809f, -0.010103f, -0.011854f, +0.002763f, -0.006761f, +0.004527f, -0.017194f, + -0.009956f, -0.002665f, -0.008152f, +0.001850f, -0.008211f, +0.001659f, -0.005685f, -0.005795f, -0.002676f, +0.000743f, + +0.000165f, +0.009616f, -0.003597f, -0.001455f, +0.004187f, -0.000117f, +0.001430f, +0.002694f, -0.002821f, +0.005410f, + +0.001530f, -0.005102f, -0.000275f, +0.001224f, +0.000424f, +0.003502f, +0.001358f, +0.002093f, -0.002072f, -0.000365f, + +0.000727f, -0.001102f, -0.000387f, -0.000226f, +0.001114f, +0.002364f, +0.000073f, +0.000455f, -0.000281f, +0.001544f, + +0.001460f, -0.001982f, +0.001226f, +0.000950f, -0.000820f, -0.000673f, -0.000284f, +0.000319f, +0.000920f, +0.001166f, + -0.000104f, +0.000863f, -0.000381f, +0.001157f, -0.000733f, -0.000369f, -0.000440f, -0.000067f, -0.000673f, -0.000038f, + +0.000160f, -0.000419f, -0.000347f, -0.000416f, -0.000070f, +0.000382f + }, + { + +0.010658f, +0.033874f, -0.007677f, +0.000115f, -0.019925f, -0.003000f, -0.006487f, +0.007604f, -0.000741f, +0.002182f, + +0.002626f, +0.004466f, -0.004665f, +0.007375f, +0.002342f, -0.009126f, -0.012900f, +0.001294f, +0.004124f, -0.008227f, + -0.007952f, -0.002855f, +0.010643f, +0.005759f, -0.001063f, +0.011749f, -0.007454f, +0.005124f, +0.008014f, -0.000135f, + -0.000484f, -0.010344f, +0.005122f, +0.006613f, +0.004580f, +0.004174f, -0.008612f, +0.000026f, -0.003089f, +0.000483f, + -0.000376f, -0.003117f, +0.004405f, -0.000477f, +0.000792f, -0.000784f, +0.004147f, +0.000720f, -0.000376f, +0.000220f, + -0.000569f, +0.000544f, -0.002129f, -0.002801f, +0.000278f, -0.001312f, +0.001321f, -0.001705f, -0.000180f, -0.001524f, + -0.000817f, -0.001080f, +0.001151f, -0.000733f, -0.000274f, +0.001988f, -0.000546f, +0.000089f, +0.000448f, -0.000747f, + +0.000423f, +0.000055f, -0.000063f, -0.000441f, +0.000221f, +0.000665f, +0.000023f, +0.000691f, -0.000658f, +0.000785f, + -0.000836f, +0.000482f, +0.000182f, -0.000609f, +0.000291f, -0.000368f, -0.000001f, -0.000213f, +0.000100f, -0.000111f, + +0.000603f, +0.000156f, +0.000436f, -0.000232f, +0.000088f, +0.000178f + }, + { + -0.008153f, +0.095831f, -0.021118f, -0.100559f, -0.008404f, -0.004598f, +0.005337f, +0.008560f, +0.004044f, +0.009377f, + -0.000884f, +0.013119f, +0.004761f, +0.018191f, -0.013561f, -0.005630f, -0.010481f, -0.015693f, +0.010929f, +0.004423f, + +0.005056f, -0.008707f, +0.000983f, +0.006909f, +0.001489f, -0.006762f, +0.002572f, +0.006208f, -0.002589f, +0.002647f, + +0.004056f, +0.003566f, +0.001690f, -0.000670f, +0.001219f, +0.005906f, +0.001631f, -0.002649f, +0.000008f, -0.000998f, + +0.003887f, -0.000778f, +0.005302f, -0.000442f, -0.000106f, +0.000126f, +0.002958f, +0.001252f, +0.001809f, -0.001069f, + +0.003786f, +0.001817f, -0.003478f, -0.001485f, +0.000040f, +0.003118f, +0.001748f, -0.000333f, -0.000277f, +0.000007f, + -0.002717f, -0.000536f, -0.000679f, -0.000056f, +0.000181f, +0.000811f, +0.000069f, +0.000192f, -0.000205f, -0.001260f, + -0.000029f, -0.000096f, +0.000962f, -0.000065f, -0.000141f, +0.001486f, +0.000557f, -0.000022f, -0.000189f, -0.000038f, + -0.000386f, -0.000197f, -0.000567f, +0.000017f, +0.000236f, +0.000456f, -0.000337f, +0.000918f, +0.000171f, +0.000364f, + -0.000371f, -0.000456f, +0.000161f, +0.000137f, -0.000544f, -0.000027f + }, + { + +0.002608f, -0.062255f, -0.015283f, -0.001437f, +0.000682f, +0.001145f, +0.001846f, +0.001833f, +0.000498f, +0.004092f, + +0.005127f, -0.000760f, +0.000090f, +0.004980f, -0.008916f, +0.004473f, +0.021438f, -0.029977f, -0.002470f, +0.006446f, + -0.003501f, +0.009102f, +0.005340f, +0.012449f, +0.002284f, +0.002038f, +0.003002f, +0.002578f, -0.002479f, -0.001965f, + +0.007019f, +0.003621f, -0.005137f, -0.004608f, +0.005931f, +0.001909f, +0.000171f, -0.008082f, +0.001607f, -0.003938f, + +0.004764f, -0.002285f, -0.001162f, +0.002049f, +0.003722f, -0.000913f, -0.002371f, -0.000201f, -0.000109f, +0.000141f, + +0.002212f, +0.001278f, -0.001168f, +0.000877f, -0.000058f, +0.001747f, +0.001051f, +0.001320f, -0.000892f, -0.001372f, + +0.000732f, -0.000992f, +0.001539f, +0.001201f, +0.001168f, +0.000596f, -0.001945f, +0.001382f, -0.000776f, -0.000668f, + +0.000823f, +0.000103f, -0.001230f, -0.000834f, -0.000218f, +0.000423f, -0.000044f, -0.000407f, -0.000227f, -0.001202f, + -0.000117f, -0.000190f, -0.000446f, -0.000443f, -0.000715f, -0.000254f, +0.000249f, +0.000023f, -0.000103f, +0.000010f, + -0.000287f, +0.000171f, -0.000199f, -0.000189f, +0.000009f, -0.000331f + }, + { + +0.028795f, -0.023407f, -0.011631f, -0.070495f, -0.002435f, -0.002064f, +0.000667f, +0.001783f, +0.001034f, +0.014728f, + +0.001644f, -0.002264f, -0.010333f, +0.003792f, +0.023144f, -0.010272f, -0.010809f, -0.007359f, +0.014958f, -0.001461f, + +0.003941f, -0.000420f, -0.008996f, +0.006342f, -0.011267f, -0.003715f, -0.000730f, -0.001978f, -0.002016f, +0.001341f, + -0.007568f, +0.005109f, +0.001103f, -0.002388f, +0.005673f, +0.007028f, -0.000162f, -0.002704f, +0.000144f, -0.004999f, + -0.002541f, -0.003399f, +0.004769f, -0.000804f, +0.000080f, +0.000501f, +0.001583f, -0.002828f, -0.001760f, +0.004466f, + -0.000897f, +0.001931f, -0.002266f, +0.000020f, +0.000441f, +0.002565f, +0.000522f, +0.000095f, -0.000213f, +0.002147f, + +0.001225f, -0.001173f, +0.000294f, +0.001012f, +0.000173f, -0.000085f, -0.001496f, +0.000482f, -0.000662f, -0.001563f, + +0.000982f, +0.000620f, +0.000418f, -0.001163f, -0.000287f, -0.001068f, -0.000954f, -0.000625f, +0.000737f, +0.000593f, + -0.000177f, +0.000182f, +0.000480f, -0.000916f, +0.000582f, -0.000794f, -0.000688f, +0.000390f, +0.000386f, +0.000459f, + -0.000503f, +0.000014f, +0.000304f, +0.000432f, -0.000358f, -0.000366f + }, + { + +0.000978f, +0.016417f, +0.008579f, +0.002831f, -0.001489f, +0.000202f, +0.000677f, -0.000462f, -0.001575f, -0.003016f, + +0.003461f, +0.004497f, -0.003820f, -0.005118f, +0.001689f, +0.000769f, -0.031538f, -0.008478f, +0.000914f, -0.010378f, + -0.007589f, +0.003747f, -0.001569f, +0.014282f, +0.002568f, -0.012506f, +0.024316f, +0.020987f, +0.009549f, +0.007675f, + -0.002635f, +0.000029f, +0.002957f, +0.002140f, -0.010973f, +0.004545f, -0.001265f, +0.002226f, -0.005831f, +0.002943f, + -0.000427f, -0.001437f, +0.007078f, +0.001488f, +0.000935f, +0.002993f, -0.000300f, +0.002694f, +0.002749f, +0.001968f, + -0.002921f, +0.000665f, +0.002420f, -0.000852f, +0.001928f, +0.001800f, -0.000758f, -0.001773f, +0.001707f, -0.002770f, + -0.000842f, -0.000878f, -0.000042f, +0.001166f, -0.000771f, -0.000709f, -0.000845f, -0.000127f, +0.000214f, +0.000521f, + -0.000511f, +0.000511f, -0.000107f, -0.000846f, -0.000630f, +0.001462f, -0.001174f, -0.000962f, -0.000105f, +0.000728f, + +0.000870f, -0.000334f, -0.000194f, -0.000459f, +0.000444f, -0.000459f, -0.000039f, -0.000387f, +0.000103f, -0.000697f, + -0.000062f, +0.000492f, -0.000076f, -0.000100f, -0.000677f, +0.000376f + }, + { + +0.055329f, -0.022012f, +0.008629f, +0.015740f, +0.012924f, +0.000427f, +0.003810f, +0.001475f, +0.002705f, +0.003262f, + +0.008805f, -0.001052f, -0.000224f, -0.001177f, +0.000139f, +0.005810f, -0.008173f, -0.000750f, +0.002151f, +0.006575f, + +0.003597f, -0.003374f, -0.001232f, +0.004387f, +0.003611f, -0.004644f, -0.000896f, -0.000059f, -0.000593f, -0.001521f, + +0.004294f, +0.001931f, +0.001431f, +0.002367f, -0.003129f, -0.000270f, +0.000141f, -0.002798f, +0.003187f, +0.005127f, + -0.000879f, +0.001235f, -0.001551f, -0.004580f, -0.001598f, +0.000156f, +0.002041f, -0.003822f, -0.000355f, -0.003972f, + +0.005475f, +0.000779f, +0.000867f, +0.002509f, +0.000739f, +0.001111f, +0.001372f, +0.002692f, -0.000093f, -0.000424f, + -0.000858f, +0.000169f, +0.000483f, -0.000692f, +0.000420f, +0.000315f, +0.000929f, +0.000415f, -0.000073f, +0.000633f, + -0.000385f, -0.000219f, -0.001517f, -0.000048f, -0.000666f, -0.000586f, -0.000231f, +0.000512f, +0.001316f, -0.000023f, + -0.000590f, +0.000458f, +0.000749f, -0.000145f, -0.000555f, +0.000100f, -0.000579f, -0.000458f, -0.000066f, -0.000414f, + -0.000492f, -0.000164f, -0.000333f, -0.000059f, +0.000095f, +0.000384f + }, + { + +0.001966f, -0.012274f, +0.009257f, -0.003281f, -0.001275f, -0.001753f, +0.000604f, +0.000850f, +0.002311f, +0.000015f, + -0.001904f, -0.005621f, +0.009054f, +0.006680f, +0.007130f, -0.008166f, +0.002341f, -0.013645f, -0.014542f, +0.023452f, + -0.000129f, -0.002001f, +0.003821f, +0.006484f, -0.005042f, +0.003377f, +0.004025f, +0.011941f, -0.010612f, +0.007510f, + -0.007565f, +0.008590f, +0.000057f, -0.002008f, +0.005537f, +0.005382f, -0.007815f, +0.002828f, +0.000249f, +0.005917f, + +0.002025f, -0.000233f, -0.003063f, +0.000167f, +0.001103f, +0.000198f, -0.001573f, +0.002624f, +0.004740f, -0.007091f, + -0.001911f, +0.001476f, +0.002188f, -0.002095f, -0.000817f, +0.000199f, +0.000093f, -0.001678f, -0.000363f, -0.000793f, + +0.002973f, -0.000199f, -0.002887f, +0.001538f, +0.001359f, -0.000375f, +0.000346f, -0.001126f, -0.000059f, +0.001324f, + -0.000671f, +0.000819f, +0.000145f, +0.000531f, +0.000279f, +0.001098f, -0.000586f, +0.000050f, -0.000357f, -0.000235f, + +0.000487f, +0.000358f, +0.000581f, -0.000164f, +0.000363f, -0.000207f, -0.000774f, +0.000802f, -0.000140f, -0.000559f, + -0.000751f, -0.000070f, -0.000056f, +0.000679f, -0.000139f, +0.000285f + }, + { + -0.005768f, +0.039682f, +0.003054f, -0.004978f, +0.017214f, -0.007196f, +0.004886f, -0.001734f, -0.003412f, -0.006010f, + +0.004340f, +0.013842f, +0.011302f, -0.011849f, -0.002998f, +0.013654f, +0.001752f, +0.006297f, +0.003055f, -0.001276f, + +0.005240f, +0.000652f, +0.001076f, -0.000059f, -0.000424f, +0.003009f, -0.001759f, +0.001793f, -0.000070f, -0.001768f, + -0.002673f, -0.008627f, -0.000690f, +0.007348f, -0.003215f, +0.001569f, +0.003267f, -0.001106f, -0.000478f, -0.003705f, + -0.000406f, -0.000665f, +0.000124f, +0.000338f, -0.003718f, -0.000129f, -0.000201f, -0.002214f, +0.001913f, -0.002480f, + -0.002736f, -0.001413f, -0.001211f, -0.002585f, -0.000255f, +0.000519f, +0.001938f, -0.001985f, +0.001284f, -0.000939f, + +0.000834f, +0.000168f, -0.001205f, +0.000297f, +0.000194f, +0.000540f, +0.000229f, -0.000868f, +0.000202f, +0.000491f, + +0.000093f, -0.000344f, +0.000766f, -0.000951f, -0.000152f, +0.002163f, +0.001233f, -0.000501f, +0.000255f, +0.000614f, + -0.000142f, +0.000105f, +0.000330f, -0.000232f, -0.000541f, +0.000052f, +0.000318f, -0.000010f, +0.000344f, -0.000904f, + +0.000260f, -0.000454f, -0.000054f, +0.000354f, -0.000137f, +0.000385f + }, + { + +0.000542f, -0.066836f, -0.013850f, +0.014562f, +0.015060f, -0.001830f, -0.001504f, +0.000614f, -0.007895f, -0.000868f, + -0.005190f, +0.009569f, +0.008843f, +0.000499f, -0.004517f, -0.002813f, -0.003456f, -0.012134f, -0.012841f, -0.022137f, + +0.003964f, -0.001064f, -0.006903f, -0.002009f, +0.007292f, +0.001348f, -0.021300f, +0.011400f, +0.002177f, +0.007738f, + -0.007137f, -0.004931f, -0.004318f, -0.000800f, +0.001940f, +0.006411f, +0.001123f, +0.001412f, +0.004785f, +0.000118f, + -0.000118f, +0.000712f, +0.001555f, -0.005857f, -0.003939f, +0.002028f, -0.001241f, -0.000549f, +0.002936f, -0.000668f, + -0.000670f, +0.003841f, -0.000635f, -0.000868f, +0.001083f, -0.000012f, +0.000205f, -0.000198f, -0.000148f, -0.002480f, + -0.002533f, -0.001000f, -0.000156f, +0.001169f, -0.001422f, +0.001362f, -0.000186f, +0.000463f, -0.000291f, -0.001555f, + +0.000285f, -0.001238f, -0.001032f, -0.000939f, -0.000219f, -0.000118f, -0.000685f, -0.001068f, +0.000259f, +0.001659f, + -0.000671f, +0.000151f, -0.000820f, +0.000283f, -0.000107f, -0.001011f, +0.000201f, +0.000271f, +0.000552f, +0.000052f, + +0.000579f, +0.000168f, -0.000054f, -0.000028f, -0.000021f, -0.000230f + }, + { + +0.006745f, -0.297007f, +0.003031f, +0.004533f, -0.023128f, +0.024387f, -0.009222f, -0.000300f, +0.000169f, -0.002919f, + +0.004090f, -0.001666f, -0.002712f, +0.015131f, -0.015139f, +0.000853f, -0.003791f, +0.004138f, -0.006062f, -0.003761f, + +0.018909f, -0.001629f, +0.002054f, +0.000058f, -0.003384f, +0.001809f, +0.000057f, +0.004257f, +0.004712f, +0.001839f, + +0.000765f, +0.000286f, +0.000553f, -0.001383f, -0.006215f, -0.000725f, -0.004634f, -0.006510f, +0.001239f, -0.003214f, + +0.003541f, -0.000380f, -0.005452f, +0.001185f, -0.004566f, -0.000636f, -0.001367f, -0.000526f, -0.002324f, -0.003509f, + +0.003079f, +0.002868f, -0.001752f, +0.002192f, -0.000700f, +0.001638f, +0.000324f, +0.000061f, -0.000562f, -0.001325f, + -0.000053f, -0.000634f, +0.001468f, +0.001053f, -0.000487f, +0.000250f, -0.001497f, +0.000670f, +0.000923f, +0.000957f, + -0.000148f, -0.000941f, -0.000671f, +0.000112f, -0.001108f, -0.001116f, -0.001148f, +0.000041f, +0.000521f, +0.000218f, + +0.000349f, -0.000066f, +0.000356f, +0.000035f, -0.000616f, -0.000332f, -0.000579f, +0.000373f, +0.000322f, +0.000503f, + +0.000153f, +0.000073f, -0.000274f, +0.000258f, +0.000236f, -0.000214f + }, + { + +0.002723f, -0.043809f, +0.002951f, +0.014531f, -0.006100f, +0.000617f, -0.000575f, -0.004065f, +0.000623f, +0.006050f, + -0.005680f, +0.005155f, -0.001525f, -0.007395f, -0.000958f, +0.009002f, -0.011027f, +0.010977f, -0.009754f, +0.014999f, + -0.003698f, -0.005106f, +0.002110f, -0.002691f, -0.007390f, -0.004174f, -0.008198f, -0.017266f, +0.007941f, -0.006580f, + -0.002613f, -0.005580f, -0.006308f, -0.004216f, +0.001034f, +0.004239f, +0.005152f, +0.013238f, -0.001334f, +0.003017f, + +0.004812f, +0.010749f, +0.000123f, -0.001486f, -0.000975f, -0.001704f, -0.005297f, +0.000036f, +0.001471f, -0.000187f, + +0.004010f, +0.000458f, +0.005082f, -0.003080f, -0.000229f, -0.003005f, -0.000387f, +0.002260f, -0.000022f, +0.000612f, + +0.001298f, -0.000166f, -0.001553f, +0.000462f, +0.000132f, +0.001322f, -0.000829f, +0.001935f, -0.001418f, +0.000142f, + +0.002380f, -0.000145f, -0.000126f, +0.000679f, +0.000108f, +0.000027f, +0.000428f, -0.000245f, +0.001020f, -0.000784f, + -0.000109f, -0.000178f, -0.000589f, +0.000339f, -0.000017f, -0.000085f, +0.000091f, +0.000066f, +0.000106f, -0.000117f, + +0.000753f, +0.000271f, -0.000578f, +0.000426f, +0.000498f, +0.000310f + }, + { + -0.076065f, -0.175709f, -0.004256f, -0.004919f, -0.000651f, +0.016759f, -0.015012f, +0.005472f, -0.000456f, -0.019795f, + -0.021141f, -0.000023f, -0.003270f, +0.000261f, -0.014571f, +0.000620f, -0.013386f, +0.004857f, +0.007257f, -0.004074f, + +0.009607f, -0.004130f, +0.007476f, -0.004351f, +0.004213f, -0.006494f, +0.001044f, +0.008284f, -0.007255f, +0.006316f, + +0.001552f, +0.003439f, -0.001067f, +0.005000f, -0.000581f, +0.007388f, -0.006881f, -0.001794f, -0.001594f, -0.006386f, + +0.001600f, +0.001819f, +0.002399f, +0.007978f, -0.003759f, -0.006755f, -0.002682f, +0.002675f, +0.001685f, +0.000532f, + -0.003915f, -0.000907f, -0.001004f, -0.004444f, +0.000271f, -0.005186f, +0.000413f, -0.002096f, +0.000273f, +0.001039f, + +0.000821f, +0.000082f, -0.000005f, +0.000085f, +0.000116f, +0.000395f, -0.000856f, +0.001507f, +0.001609f, +0.000457f, + +0.000457f, -0.000445f, +0.000501f, +0.000051f, +0.001274f, -0.000166f, +0.000781f, +0.000402f, -0.000009f, +0.000079f, + -0.000204f, -0.000324f, +0.001183f, +0.000250f, -0.000597f, +0.000968f, -0.000305f, -0.000234f, +0.000061f, -0.000400f, + -0.000337f, -0.000789f, -0.000051f, -0.000565f, +0.000115f, +0.000158f + }, + { + +0.002225f, -0.066716f, -0.016644f, -0.000059f, +0.011543f, +0.005510f, -0.001345f, -0.002649f, +0.001484f, -0.000833f, + -0.008780f, -0.002109f, -0.008016f, -0.018779f, +0.066718f, -0.004659f, -0.002800f, +0.002570f, +0.008183f, -0.005186f, + -0.015648f, -0.003451f, +0.009346f, +0.007236f, -0.003206f, +0.011239f, +0.010122f, +0.012778f, -0.007048f, +0.003671f, + +0.004764f, +0.000325f, +0.011679f, +0.006973f, +0.000004f, +0.001741f, -0.000314f, +0.003683f, -0.000042f, -0.000241f, + +0.005938f, +0.002499f, -0.000224f, +0.002439f, -0.004366f, +0.001556f, +0.003087f, -0.001573f, -0.002806f, +0.002147f, + -0.001926f, -0.003426f, -0.001290f, -0.000199f, -0.001422f, -0.000333f, +0.000249f, +0.002787f, +0.002454f, -0.000568f, + -0.000551f, -0.001410f, +0.000665f, -0.000796f, -0.000686f, +0.003206f, -0.000273f, +0.000308f, -0.000586f, -0.000896f, + -0.000563f, +0.001268f, +0.001687f, -0.000930f, -0.000915f, -0.000607f, +0.000267f, -0.000241f, -0.000496f, -0.000742f, + -0.000292f, -0.000590f, -0.000542f, -0.000828f, -0.000252f, -0.000420f, -0.000498f, -0.000072f, +0.000095f, -0.000528f, + +0.000070f, -0.000536f, +0.000099f, +0.000257f, +0.000043f, -0.000375f + }, + { + -0.018221f, -0.204943f, -0.011791f, -0.024148f, -0.001526f, -0.013854f, -0.004959f, +0.013051f, +0.001021f, +0.002726f, + +0.013390f, -0.000028f, -0.001742f, -0.008734f, +0.015936f, +0.001007f, +0.001364f, +0.001787f, +0.008680f, -0.007696f, + +0.013602f, +0.004100f, -0.007148f, +0.001162f, +0.008110f, -0.011294f, -0.006673f, +0.001257f, +0.009352f, +0.000749f, + +0.001091f, -0.006098f, +0.008237f, -0.001734f, -0.009605f, -0.004725f, +0.000707f, -0.005100f, +0.001100f, -0.002974f, + -0.001416f, +0.004542f, +0.003177f, +0.000386f, +0.000304f, -0.002532f, +0.002913f, -0.001306f, -0.001407f, +0.001365f, + -0.000469f, -0.004537f, -0.000845f, -0.001233f, -0.002153f, -0.001145f, +0.000920f, -0.001666f, +0.000726f, +0.002129f, + +0.003656f, +0.001811f, -0.000170f, +0.000093f, +0.000884f, +0.001263f, -0.000231f, -0.000372f, +0.000480f, -0.001145f, + +0.000924f, +0.000653f, -0.000066f, +0.000548f, -0.000471f, +0.001436f, +0.000385f, +0.000825f, +0.000958f, -0.000561f, + +0.000382f, +0.000747f, -0.000043f, -0.000558f, +0.000335f, +0.000021f, +0.000381f, +0.000190f, +0.000252f, +0.001201f, + -0.000229f, +0.000339f, +0.000147f, -0.000437f, -0.000156f, -0.000131f + } + }, + { + { + -0.002995f, -0.075268f, -0.003420f, +0.013466f, +0.001737f, +0.000870f, +0.000965f, +0.003042f, -0.003428f, +0.015917f, + -0.000665f, -0.009873f, -0.009694f, +0.014518f, +0.012838f, +0.009195f, +0.009399f, -0.005796f, +0.003010f, -0.000703f, + +0.002009f, +0.015670f, +0.011420f, -0.001296f, -0.004973f, -0.013524f, +0.002063f, -0.009055f, -0.002876f, -0.016438f, + -0.003109f, +0.003391f, -0.001893f, -0.000901f, -0.002705f, +0.007380f, -0.002226f, -0.003841f, -0.006568f, -0.001115f, + -0.000318f, +0.007701f, +0.000807f, +0.006101f, +0.004845f, -0.001988f, -0.000283f, +0.001346f, -0.006707f, +0.002975f, + +0.005077f, -0.000972f, -0.000015f, -0.000484f, -0.001296f, +0.000429f, +0.000377f, +0.002649f, -0.003756f, -0.001210f, + +0.001210f, -0.001147f, -0.001020f, +0.000023f, +0.001684f, -0.000288f, -0.001097f, -0.001581f, -0.001251f, +0.001509f, + +0.001298f, -0.002001f, +0.001406f, +0.001292f, -0.000032f, -0.000157f, -0.000001f, -0.000065f, +0.000027f, +0.000554f, + -0.001390f, +0.000189f, -0.000317f, +0.000712f, -0.000809f, -0.000291f, -0.000531f, -0.000216f, -0.000053f, +0.000437f, + +0.000404f, -0.000080f, -0.000328f, -0.000435f, +0.000160f, +0.000537f + }, + { + -0.019113f, -0.011094f, -0.017962f, +0.035001f, +0.005855f, -0.000193f, -0.004455f, +0.004522f, -0.007210f, +0.001242f, + -0.003885f, +0.008554f, +0.009187f, +0.009554f, +0.004687f, -0.003793f, -0.010742f, -0.003724f, +0.004851f, -0.006285f, + -0.007584f, -0.008994f, -0.001849f, +0.001779f, -0.005514f, +0.010502f, -0.002922f, +0.004864f, +0.004472f, -0.001475f, + +0.004534f, -0.005537f, +0.002959f, -0.001119f, -0.001098f, +0.005649f, -0.007379f, -0.001022f, -0.005197f, -0.003533f, + -0.002945f, -0.001724f, +0.000739f, -0.004928f, +0.000706f, +0.000318f, +0.004130f, +0.005134f, +0.002378f, +0.000776f, + -0.000740f, -0.000469f, -0.002092f, -0.000152f, +0.001838f, -0.001852f, +0.001794f, -0.000339f, -0.001702f, -0.002859f, + -0.001144f, -0.000924f, +0.001113f, -0.000383f, +0.000984f, +0.001944f, -0.000466f, +0.000233f, +0.000637f, -0.001414f, + +0.000445f, +0.001244f, +0.000847f, -0.000316f, +0.000097f, -0.000367f, -0.000201f, +0.000911f, -0.001329f, -0.000289f, + -0.000776f, +0.000828f, -0.000279f, -0.000575f, +0.000554f, -0.000509f, -0.000055f, +0.000313f, -0.000099f, -0.000117f, + +0.000458f, -0.000215f, -0.000032f, -0.000239f, +0.000102f, +0.000163f + }, + { + +0.010561f, +0.101631f, -0.037004f, -0.027033f, +0.054884f, -0.003884f, +0.003473f, +0.004047f, +0.000129f, -0.001813f, + -0.012025f, +0.005446f, +0.002617f, +0.027689f, -0.001433f, -0.004544f, -0.014976f, -0.017188f, +0.006732f, -0.006577f, + -0.005174f, -0.007858f, +0.015566f, +0.009318f, +0.008325f, -0.000800f, -0.004480f, +0.002662f, -0.004246f, +0.001923f, + +0.003098f, -0.000024f, +0.001039f, -0.000568f, -0.006356f, -0.001529f, -0.004172f, -0.004185f, +0.000946f, +0.000039f, + -0.001940f, -0.005174f, +0.003623f, -0.001370f, -0.000841f, -0.000663f, -0.000939f, -0.000676f, +0.005227f, +0.001105f, + +0.002769f, +0.000218f, -0.003717f, -0.001111f, -0.000996f, +0.002683f, +0.001062f, -0.000430f, +0.001276f, +0.002742f, + -0.001349f, +0.001288f, +0.001166f, -0.000007f, +0.000280f, +0.000937f, -0.000838f, -0.000762f, -0.000222f, -0.000897f, + +0.000118f, +0.000680f, +0.001143f, +0.000166f, -0.000327f, +0.000707f, +0.000016f, -0.000681f, -0.001225f, -0.000267f, + -0.000307f, +0.000020f, -0.000320f, +0.000073f, +0.000667f, +0.000732f, -0.000547f, +0.000172f, -0.000152f, +0.000201f, + -0.000722f, -0.000634f, +0.000063f, +0.000070f, -0.000079f, +0.000786f + }, + { + -0.003593f, -0.040893f, +0.007710f, -0.000629f, +0.001028f, -0.001057f, -0.001943f, +0.000134f, -0.002120f, -0.000801f, + +0.009536f, +0.002570f, +0.002426f, -0.001832f, -0.023880f, -0.008382f, +0.017885f, -0.014895f, +0.012807f, +0.003623f, + -0.013173f, +0.000119f, +0.004883f, +0.008262f, -0.008487f, -0.002302f, -0.007610f, +0.000389f, -0.002223f, -0.005665f, + +0.004552f, +0.005601f, +0.000844f, -0.006396f, -0.002396f, -0.007472f, -0.005629f, -0.009746f, -0.000666f, -0.005941f, + +0.000274f, -0.004350f, +0.001621f, +0.003540f, +0.001034f, -0.002782f, -0.001249f, +0.000640f, -0.000396f, -0.000904f, + +0.001444f, -0.000903f, -0.001335f, +0.000587f, +0.000158f, +0.002212f, +0.001098f, +0.001260f, +0.000041f, -0.002141f, + -0.000492f, -0.001810f, +0.001199f, -0.000106f, +0.000519f, +0.000923f, -0.001417f, +0.001141f, -0.001190f, -0.001165f, + -0.000067f, -0.000348f, -0.001625f, -0.000406f, -0.000064f, +0.000080f, -0.000495f, -0.000092f, +0.001234f, +0.000087f, + +0.000219f, -0.000370f, +0.000060f, +0.000342f, -0.000005f, +0.000071f, +0.000196f, +0.000057f, +0.000099f, +0.000607f, + -0.000207f, +0.000135f, +0.000269f, +0.000144f, -0.000195f, -0.000295f + }, + { + -0.051955f, -0.131513f, +0.002624f, -0.058790f, -0.003867f, -0.007034f, -0.004605f, -0.004199f, -0.009237f, +0.007636f, + -0.004215f, +0.000909f, -0.013318f, -0.008381f, +0.011427f, -0.001864f, -0.001969f, -0.004091f, +0.023423f, -0.011394f, + -0.003109f, +0.003720f, -0.007017f, +0.012405f, -0.003953f, -0.003527f, -0.008252f, -0.011349f, -0.006130f, -0.000098f, + -0.008336f, +0.002921f, +0.004347f, +0.001399f, +0.002203f, +0.004754f, -0.007403f, -0.007493f, +0.004401f, -0.001870f, + -0.000736f, -0.001822f, +0.003630f, +0.001654f, -0.001887f, -0.002856f, +0.003183f, +0.000124f, -0.002928f, +0.002332f, + -0.000611f, +0.002662f, -0.001966f, -0.001408f, -0.002425f, +0.001100f, +0.001889f, +0.000193f, -0.000037f, +0.000108f, + -0.000757f, +0.000710f, +0.002335f, +0.001521f, +0.000421f, +0.000342f, -0.000810f, +0.000655f, -0.000187f, +0.000243f, + +0.001681f, -0.000273f, +0.000216f, -0.000664f, +0.000760f, -0.000050f, -0.001191f, +0.000475f, +0.000773f, -0.000230f, + -0.000024f, +0.000258f, +0.000596f, -0.000452f, +0.000686f, -0.000481f, -0.000305f, +0.000694f, +0.000122f, +0.000121f, + +0.000320f, +0.000083f, -0.000169f, +0.000574f, +0.000010f, +0.000069f + }, + { + -0.000368f, -0.015221f, -0.007219f, +0.001987f, -0.002706f, +0.000467f, -0.000050f, +0.001273f, +0.000568f, +0.003950f, + +0.008192f, +0.000672f, +0.000988f, -0.007386f, -0.022436f, -0.004927f, -0.007157f, +0.007428f, -0.006126f, +0.003598f, + +0.015842f, -0.000964f, -0.015542f, +0.002444f, -0.003175f, -0.020111f, +0.001753f, +0.008072f, +0.005530f, +0.008004f, + -0.003583f, +0.005662f, +0.005046f, +0.005137f, +0.000352f, +0.009750f, -0.004961f, -0.000589f, -0.005436f, +0.003672f, + -0.004470f, -0.005120f, +0.000971f, -0.001612f, -0.000412f, +0.002753f, +0.003235f, +0.002069f, -0.000751f, -0.000494f, + -0.001546f, +0.002467f, +0.003418f, +0.000767f, +0.001771f, +0.000413f, -0.001318f, -0.000381f, +0.003658f, -0.002553f, + -0.000050f, -0.000194f, +0.000026f, +0.000900f, +0.000082f, +0.001411f, +0.000035f, +0.000605f, -0.000447f, -0.000248f, + -0.000008f, +0.000881f, +0.000473f, -0.000708f, -0.000993f, +0.001164f, -0.001072f, -0.000484f, +0.000206f, +0.001286f, + +0.000258f, +0.000185f, +0.000237f, -0.000022f, +0.000262f, -0.000164f, +0.000623f, -0.000277f, +0.000383f, -0.000176f, + +0.000151f, +0.000155f, -0.000091f, +0.000432f, -0.000095f, +0.000361f + }, + { + -0.056417f, -0.222638f, -0.016158f, -0.008353f, -0.019717f, +0.000915f, -0.002731f, -0.005178f, -0.000571f, -0.012721f, + -0.001917f, -0.002126f, +0.003009f, +0.001781f, +0.002853f, +0.009223f, -0.005379f, -0.001609f, -0.001107f, -0.003693f, + -0.002390f, -0.000392f, -0.004426f, -0.011263f, -0.006606f, -0.004641f, +0.001694f, +0.007871f, -0.001328f, -0.002697f, + +0.005120f, -0.003936f, -0.002043f, +0.000445f, -0.004510f, -0.002494f, +0.001359f, -0.005707f, -0.002709f, +0.007705f, + -0.000888f, -0.001434f, -0.001246f, -0.002557f, +0.001241f, +0.001760f, -0.000449f, -0.004489f, -0.000234f, -0.005291f, + +0.001368f, +0.000299f, +0.002416f, +0.003528f, +0.000434f, +0.000642f, +0.000107f, +0.001932f, +0.001728f, +0.001393f, + -0.000208f, -0.003147f, -0.002487f, -0.000642f, +0.000603f, +0.000289f, +0.000328f, +0.000089f, -0.000234f, -0.000107f, + -0.000880f, -0.000760f, -0.001672f, +0.000110f, -0.000129f, -0.000763f, -0.000778f, +0.000282f, +0.000870f, -0.000317f, + -0.001249f, +0.000044f, +0.000579f, -0.000072f, -0.000467f, -0.000108f, -0.000152f, +0.000448f, +0.001166f, +0.000307f, + -0.000357f, +0.000304f, +0.000101f, -0.000134f, -0.000278f, +0.000412f + }, + { + -0.000080f, -0.022385f, +0.006423f, -0.001780f, +0.004440f, +0.001289f, +0.000563f, -0.001845f, -0.000211f, +0.001088f, + +0.002995f, +0.000546f, +0.007973f, -0.001999f, +0.000868f, +0.011294f, +0.016198f, -0.009012f, -0.013749f, +0.028794f, + -0.009420f, -0.012295f, -0.000893f, +0.001893f, -0.007414f, -0.001699f, -0.019841f, -0.007872f, -0.019751f, -0.001966f, + -0.009995f, +0.005238f, -0.003243f, -0.007917f, -0.007318f, -0.004217f, -0.005171f, +0.005955f, +0.001090f, +0.001198f, + +0.000481f, +0.002688f, -0.004147f, +0.000759f, +0.003482f, +0.002266f, -0.004635f, -0.001090f, +0.003875f, -0.005175f, + +0.001065f, +0.001824f, +0.004058f, -0.000714f, -0.001584f, -0.000403f, +0.001123f, -0.000841f, +0.001845f, -0.000007f, + +0.004352f, +0.001217f, -0.003875f, -0.000351f, -0.000251f, -0.000406f, +0.001302f, -0.001154f, -0.000698f, +0.000752f, + -0.000340f, -0.000304f, +0.000239f, +0.001203f, +0.000229f, +0.001238f, +0.000021f, +0.000187f, -0.000783f, -0.000359f, + +0.000408f, -0.000536f, +0.000379f, -0.000004f, -0.000025f, -0.000141f, -0.000680f, +0.001287f, +0.000281f, +0.000096f, + -0.000101f, -0.000580f, -0.000585f, +0.000036f, -0.000772f, -0.000086f + }, + { + -0.032697f, +0.024421f, +0.024741f, -0.037219f, -0.020884f, -0.007194f, +0.001297f, -0.007501f, -0.005506f, -0.012687f, + +0.002572f, +0.011624f, -0.006528f, -0.019924f, +0.008736f, +0.014758f, +0.002503f, +0.009018f, -0.006796f, -0.009625f, + -0.004054f, -0.000924f, -0.002708f, -0.000880f, +0.000060f, +0.002044f, +0.000197f, +0.002105f, +0.000782f, +0.000077f, + +0.003055f, +0.001885f, +0.005398f, +0.006484f, -0.004545f, +0.006677f, +0.007613f, -0.002614f, +0.002422f, +0.002802f, + +0.003574f, +0.002300f, +0.005108f, +0.005201f, +0.000760f, +0.000927f, +0.002878f, +0.001420f, -0.001155f, -0.002576f, + -0.003063f, -0.002166f, +0.001385f, +0.000749f, +0.000822f, -0.000496f, -0.000503f, -0.001674f, +0.002205f, -0.000165f, + +0.000725f, +0.000640f, -0.001822f, -0.000800f, -0.000055f, -0.000137f, +0.000968f, -0.000074f, -0.000310f, +0.001053f, + +0.000950f, -0.000775f, +0.000018f, -0.001430f, -0.001978f, +0.000384f, +0.000133f, -0.000652f, -0.000244f, -0.000077f, + -0.000379f, -0.000034f, +0.000392f, -0.000103f, -0.000259f, +0.000120f, +0.000345f, +0.000350f, +0.000492f, -0.000634f, + +0.000294f, -0.000515f, -0.000267f, +0.000132f, +0.000430f, +0.000181f + }, + { + -0.001672f, -0.073155f, -0.003502f, +0.028508f, +0.007425f, +0.007476f, +0.020846f, +0.001375f, -0.005602f, +0.003253f, + +0.009000f, +0.014743f, +0.011361f, -0.003222f, -0.006705f, +0.011732f, -0.004455f, -0.017489f, +0.001603f, +0.003327f, + +0.004834f, +0.003780f, +0.000695f, +0.006367f, +0.013452f, -0.000061f, -0.023136f, +0.015401f, +0.007795f, +0.012254f, + -0.005190f, -0.005011f, -0.000727f, -0.001974f, -0.005983f, +0.000008f, -0.010124f, -0.006795f, +0.004050f, +0.000038f, + +0.000210f, +0.001753f, +0.002316f, -0.005268f, -0.003044f, +0.006126f, -0.001430f, -0.003094f, +0.002180f, -0.000091f, + -0.001186f, +0.003083f, -0.002742f, +0.000735f, +0.001847f, +0.000003f, -0.001517f, -0.001116f, +0.001091f, +0.000290f, + +0.001018f, +0.001577f, +0.000305f, -0.000780f, -0.002722f, +0.000271f, -0.002214f, -0.000880f, +0.000610f, -0.000439f, + +0.000297f, -0.000052f, -0.000031f, -0.000423f, +0.000604f, +0.000734f, +0.000341f, -0.000127f, +0.000365f, +0.002265f, + -0.000422f, +0.000028f, -0.000517f, +0.000287f, -0.000000f, -0.000668f, +0.000127f, -0.000296f, +0.000206f, +0.000358f, + +0.001169f, -0.000412f, -0.000637f, -0.000085f, +0.000095f, +0.000210f + }, + { + -0.005743f, -0.333773f, -0.013506f, +0.021276f, -0.003896f, +0.012003f, -0.006036f, -0.000329f, -0.008212f, -0.003769f, + +0.001766f, +0.001171f, +0.001848f, +0.010762f, -0.020090f, +0.003781f, -0.004740f, -0.003047f, -0.004071f, -0.011043f, + +0.011160f, -0.003705f, +0.006349f, +0.002144f, -0.004197f, +0.000042f, -0.002513f, -0.005285f, -0.006046f, -0.004768f, + -0.005723f, -0.006752f, +0.000268f, -0.001835f, -0.007571f, +0.001933f, +0.000355f, -0.002837f, +0.002220f, -0.004170f, + +0.001833f, +0.004535f, -0.000463f, +0.004046f, -0.006204f, -0.002050f, -0.000266f, +0.003016f, +0.000567f, -0.000154f, + +0.003197f, +0.000106f, -0.000104f, +0.003633f, -0.000809f, -0.000724f, -0.000163f, +0.001450f, +0.001494f, +0.000473f, + -0.000760f, -0.001613f, +0.001285f, +0.000345f, -0.001084f, -0.000368f, -0.002351f, +0.001077f, -0.000236f, +0.000263f, + -0.000511f, -0.001117f, -0.000776f, +0.000417f, +0.000449f, +0.000316f, -0.000303f, +0.000318f, +0.000275f, -0.000009f, + -0.000047f, +0.000043f, +0.000689f, +0.000036f, -0.000306f, -0.000447f, -0.000067f, +0.000010f, +0.000144f, +0.000028f, + -0.000663f, +0.000297f, +0.000160f, +0.000304f, +0.000045f, -0.000274f + }, + { + -0.002908f, -0.012995f, +0.036247f, +0.020010f, -0.003589f, +0.000548f, -0.007597f, -0.007488f, -0.005169f, +0.000268f, + -0.009378f, +0.004712f, +0.006515f, +0.008604f, +0.012418f, +0.018334f, -0.002085f, +0.019880f, -0.010069f, +0.019370f, + -0.004085f, -0.004888f, +0.009362f, +0.003144f, +0.011924f, +0.003355f, -0.005510f, -0.013298f, +0.003499f, -0.007925f, + +0.010859f, -0.002408f, +0.000203f, -0.004188f, -0.004793f, +0.001136f, +0.000455f, +0.006309f, +0.004107f, +0.005161f, + -0.000921f, +0.004952f, +0.002731f, +0.000758f, +0.000809f, -0.000268f, -0.000108f, +0.004145f, +0.000023f, -0.000054f, + +0.003026f, -0.002261f, +0.004810f, -0.001085f, +0.001077f, +0.000659f, +0.001271f, +0.001442f, -0.000131f, +0.001289f, + +0.000477f, +0.001283f, +0.000136f, +0.000085f, -0.001532f, -0.000401f, -0.001899f, +0.001188f, -0.001274f, -0.000549f, + +0.001263f, -0.000109f, -0.000530f, -0.000662f, -0.000093f, -0.000319f, -0.000383f, +0.000185f, +0.001779f, +0.000251f, + +0.000467f, -0.000151f, -0.000380f, +0.000204f, +0.000037f, +0.000583f, +0.000332f, -0.000345f, +0.000087f, +0.000329f, + +0.000737f, +0.000154f, -0.000651f, +0.000079f, +0.000226f, +0.000034f + }, + { + +0.077732f, -0.004763f, -0.025311f, +0.027683f, -0.010491f, +0.008647f, -0.001810f, +0.009028f, +0.007631f, -0.002713f, + +0.000435f, +0.017693f, -0.000250f, +0.013796f, +0.000606f, +0.002353f, -0.023364f, -0.006912f, +0.006474f, -0.001810f, + +0.010372f, -0.005705f, +0.011113f, -0.000617f, +0.002389f, -0.007349f, +0.001713f, +0.015367f, -0.003483f, +0.002046f, + +0.007682f, +0.009574f, -0.001242f, +0.003124f, +0.000540f, +0.010811f, +0.001627f, +0.002038f, -0.001941f, -0.004957f, + -0.001598f, +0.002625f, +0.002024f, +0.008438f, +0.001212f, -0.000625f, -0.002614f, +0.002318f, +0.000391f, +0.002057f, + -0.003924f, -0.000993f, -0.002257f, -0.005071f, +0.004607f, -0.001586f, +0.000023f, -0.002334f, -0.000266f, -0.001138f, + -0.001624f, +0.000113f, +0.000323f, +0.000909f, +0.001472f, +0.000917f, -0.001874f, -0.000275f, -0.000374f, +0.000402f, + +0.000640f, -0.001068f, -0.001218f, -0.000200f, +0.000979f, -0.000563f, +0.000630f, -0.000077f, -0.000086f, +0.000213f, + +0.000376f, -0.000502f, -0.000163f, -0.000467f, -0.000833f, +0.000864f, -0.000570f, -0.000797f, -0.000270f, +0.000180f, + +0.000203f, -0.001099f, +0.000209f, +0.000528f, +0.000497f, +0.000359f + }, + { + -0.002486f, -0.038689f, +0.014708f, -0.000512f, +0.003724f, +0.006932f, +0.011617f, +0.004504f, +0.003347f, +0.004246f, + +0.000031f, -0.005065f, -0.010775f, -0.026671f, +0.034336f, -0.005045f, +0.010610f, +0.013139f, +0.008254f, -0.005418f, + -0.006761f, +0.001148f, +0.009236f, +0.007917f, -0.006755f, +0.007302f, +0.003749f, +0.010294f, +0.003607f, +0.001516f, + +0.003604f, -0.002039f, +0.004408f, +0.000494f, -0.007951f, -0.002256f, -0.005183f, +0.001251f, +0.003310f, +0.003268f, + +0.001530f, -0.003508f, -0.004574f, -0.000036f, -0.004350f, -0.001452f, -0.003499f, -0.002317f, -0.000211f, +0.002998f, + -0.000684f, +0.000606f, -0.001401f, +0.000048f, -0.000613f, -0.000558f, -0.001461f, -0.001061f, +0.000208f, -0.002090f, + -0.002611f, -0.000707f, +0.000976f, -0.000817f, -0.001392f, +0.002224f, -0.002114f, -0.000326f, -0.000056f, -0.000088f, + +0.000589f, +0.000504f, +0.000548f, +0.000194f, +0.000092f, -0.000705f, +0.000343f, -0.000783f, +0.000366f, -0.000121f, + -0.000639f, +0.000237f, -0.000086f, -0.000773f, +0.000333f, -0.000029f, -0.000225f, -0.000323f, -0.000039f, -0.000729f, + -0.000376f, -0.000642f, +0.000278f, +0.000063f, -0.000415f, -0.000416f + }, + { + +0.042167f, -0.118793f, -0.009581f, -0.016056f, +0.005768f, -0.014166f, -0.004677f, +0.006725f, -0.003897f, +0.004666f, + +0.015438f, -0.000949f, -0.008111f, -0.012532f, +0.014811f, +0.000410f, -0.010512f, -0.009770f, +0.014945f, +0.001495f, + +0.005930f, -0.001405f, -0.001396f, -0.002260f, +0.012329f, +0.001710f, -0.000144f, -0.006666f, +0.003910f, +0.002250f, + +0.004725f, +0.004705f, +0.010447f, -0.005503f, -0.013078f, -0.005402f, -0.002979f, -0.006754f, +0.007006f, -0.000406f, + -0.001789f, +0.006543f, +0.001576f, -0.000257f, -0.000390f, -0.002838f, +0.005380f, +0.000493f, -0.002328f, +0.001488f, + -0.003293f, -0.004342f, +0.002307f, +0.002008f, +0.001305f, +0.000433f, -0.000079f, -0.002869f, +0.001339f, +0.001292f, + +0.000744f, +0.001096f, -0.001065f, -0.001742f, +0.000056f, +0.001602f, +0.000070f, +0.000084f, +0.000374f, -0.000410f, + +0.001662f, +0.000200f, +0.000836f, +0.002497f, +0.000394f, +0.001164f, -0.000366f, +0.000420f, +0.000213f, -0.000657f, + +0.000294f, +0.000524f, +0.000699f, +0.000057f, +0.000120f, -0.001104f, -0.000473f, -0.000547f, +0.000076f, +0.000666f, + -0.000076f, +0.000762f, +0.000355f, -0.000150f, -0.000259f, -0.000522f + } + }, + { + { + +0.003458f, -0.086758f, -0.006690f, +0.020108f, +0.004724f, -0.001056f, -0.001798f, -0.000868f, +0.008115f, +0.012169f, + -0.001848f, +0.004630f, -0.012530f, +0.002873f, +0.023556f, +0.014609f, -0.000803f, +0.005204f, +0.001696f, -0.022429f, + +0.007318f, +0.020479f, +0.000321f, +0.020155f, -0.015804f, -0.008589f, -0.003681f, -0.001775f, -0.017485f, -0.006429f, + +0.008578f, -0.000644f, +0.000220f, -0.006911f, -0.006067f, +0.006684f, +0.000708f, -0.008233f, +0.000062f, -0.002318f, + +0.001514f, +0.005350f, +0.002159f, +0.004889f, +0.002470f, +0.003750f, -0.001317f, -0.002418f, -0.003490f, -0.001827f, + +0.005614f, +0.001111f, +0.000089f, -0.001357f, +0.000840f, -0.001540f, +0.000489f, +0.000008f, -0.000750f, -0.001187f, + +0.000240f, +0.001626f, -0.003345f, +0.000745f, +0.001588f, -0.001819f, +0.000365f, -0.001670f, +0.000008f, +0.000159f, + +0.000309f, -0.000698f, +0.000759f, +0.000689f, +0.001587f, -0.000277f, -0.000437f, -0.000213f, +0.000233f, +0.000099f, + -0.001615f, -0.000309f, +0.000723f, +0.000438f, -0.000422f, -0.000662f, -0.000168f, -0.000426f, +0.000461f, +0.000302f, + +0.000350f, -0.000419f, -0.000527f, -0.000165f, +0.000203f, +0.000365f + }, + { + +0.022095f, -0.050248f, -0.034219f, +0.040914f, -0.003428f, +0.003293f, -0.002746f, -0.001458f, -0.008755f, +0.002349f, + -0.002197f, +0.010726f, +0.012630f, -0.002342f, +0.008870f, +0.002938f, -0.009683f, +0.000366f, -0.006595f, -0.000277f, + -0.016918f, +0.001418f, -0.007291f, -0.000368f, -0.001076f, +0.003107f, -0.000008f, +0.001056f, +0.007146f, +0.000586f, + -0.006338f, -0.003695f, +0.011125f, -0.003754f, -0.006525f, +0.003087f, -0.000128f, -0.006685f, +0.000154f, -0.007922f, + +0.001317f, +0.003654f, -0.008331f, -0.003292f, +0.000845f, +0.000586f, +0.000541f, +0.003405f, +0.002756f, -0.000132f, + +0.001030f, +0.002143f, -0.000922f, -0.003059f, +0.002196f, -0.001342f, +0.000793f, -0.000329f, -0.000478f, -0.001055f, + -0.001092f, -0.000637f, +0.001008f, +0.000098f, +0.000679f, +0.001190f, +0.000331f, -0.000141f, +0.000702f, -0.000770f, + +0.000386f, +0.000030f, +0.001642f, -0.000687f, -0.000964f, +0.000449f, -0.000511f, -0.000382f, -0.000346f, -0.001328f, + +0.000666f, +0.000642f, -0.000817f, +0.000111f, +0.000499f, -0.000488f, -0.000273f, +0.000598f, +0.000108f, +0.000321f, + -0.000548f, -0.000089f, -0.000133f, -0.000030f, +0.000081f, +0.000238f + }, + { + -0.011540f, +0.068826f, +0.008736f, +0.047143f, +0.004466f, -0.006130f, +0.004649f, -0.002189f, +0.001780f, -0.002604f, + -0.006497f, +0.006328f, -0.009057f, +0.026997f, -0.001430f, -0.008015f, -0.002894f, -0.012777f, +0.000453f, -0.007901f, + -0.000372f, +0.001327f, +0.013275f, -0.009144f, +0.014028f, +0.006438f, -0.007496f, +0.002220f, +0.000256f, -0.003991f, + -0.000088f, +0.008065f, -0.004512f, -0.000317f, -0.004617f, -0.004554f, -0.008222f, +0.004919f, -0.001396f, -0.001956f, + -0.001850f, -0.002420f, +0.000370f, -0.000470f, +0.000912f, -0.004802f, +0.000737f, -0.000495f, +0.003394f, +0.003859f, + -0.001200f, +0.000799f, -0.003442f, -0.001573f, +0.001361f, +0.002876f, -0.000121f, +0.000250f, +0.002013f, +0.000802f, + +0.000339f, +0.000707f, +0.002467f, +0.000717f, -0.000707f, -0.000327f, +0.000195f, -0.001196f, -0.000267f, -0.001160f, + +0.000639f, +0.000532f, -0.000234f, +0.001091f, +0.000441f, +0.000500f, -0.000024f, -0.000008f, -0.002108f, -0.000061f, + -0.000273f, -0.000109f, -0.000183f, +0.000297f, +0.000407f, +0.000131f, +0.000020f, -0.000623f, +0.000388f, -0.000347f, + -0.000246f, -0.000341f, -0.000029f, +0.000068f, +0.000115f, +0.000440f + }, + { + +0.004472f, -0.013345f, -0.018119f, -0.000823f, +0.000446f, -0.000997f, -0.001678f, -0.001841f, +0.000180f, -0.000487f, + +0.007222f, +0.003246f, +0.003903f, +0.013403f, -0.036054f, -0.008885f, -0.007388f, +0.008199f, -0.000312f, +0.011132f, + -0.010258f, +0.001311f, -0.000429f, +0.006151f, -0.000919f, -0.004552f, -0.007894f, +0.005110f, -0.001068f, -0.003961f, + +0.009417f, -0.006629f, +0.003544f, -0.000523f, -0.006266f, -0.007585f, -0.006808f, -0.001889f, -0.005530f, -0.002616f, + -0.001080f, -0.001941f, +0.001525f, +0.000566f, +0.000397f, -0.003183f, +0.001930f, -0.001917f, +0.000012f, +0.000221f, + +0.000551f, -0.002377f, +0.002077f, -0.000027f, -0.000887f, +0.001705f, +0.001681f, +0.000605f, +0.001154f, -0.002338f, + -0.001628f, +0.000614f, -0.000291f, -0.001124f, +0.001300f, +0.000386f, +0.000803f, +0.000027f, -0.001632f, +0.001207f, + -0.001740f, -0.000930f, -0.000670f, +0.000120f, -0.000518f, +0.000003f, -0.000221f, +0.000141f, +0.000655f, +0.000869f, + -0.000068f, -0.000042f, -0.000138f, +0.000805f, +0.000176f, +0.000124f, -0.000172f, +0.000184f, +0.000010f, +0.000400f, + +0.000164f, +0.000166f, +0.000275f, +0.000287f, -0.000119f, -0.000105f + }, + { + +0.056654f, -0.248414f, -0.025365f, -0.043915f, -0.003992f, -0.006391f, -0.007953f, -0.003677f, -0.010777f, +0.000464f, + +0.011075f, -0.006334f, -0.015391f, +0.008779f, -0.000859f, -0.004342f, +0.002004f, -0.015018f, +0.012052f, -0.001557f, + +0.003972f, -0.005272f, +0.008071f, +0.004058f, +0.002145f, -0.016199f, -0.007460f, -0.005168f, -0.005894f, +0.003255f, + -0.005420f, -0.004314f, +0.000774f, +0.006271f, +0.000696f, +0.005159f, -0.016265f, +0.000677f, +0.002297f, -0.003313f, + -0.000490f, +0.003204f, -0.004166f, +0.004777f, -0.001260f, -0.000112f, +0.001981f, +0.000394f, -0.003698f, +0.000852f, + +0.003633f, +0.000876f, -0.001289f, -0.001899f, -0.004219f, +0.001466f, +0.002550f, -0.001083f, +0.001453f, -0.001949f, + +0.000178f, +0.000689f, +0.000897f, +0.000851f, +0.001604f, +0.000020f, -0.000585f, +0.000950f, +0.000282f, -0.000002f, + -0.000126f, +0.000506f, -0.000935f, +0.000525f, +0.000623f, +0.000149f, -0.000282f, +0.000574f, +0.000143f, -0.000541f, + +0.001171f, +0.000795f, -0.000882f, -0.000049f, -0.000054f, +0.000374f, -0.000089f, +0.000234f, +0.000084f, -0.000586f, + +0.000963f, +0.000167f, -0.000387f, +0.000282f, -0.000213f, +0.000202f + }, + { + -0.001257f, -0.030837f, +0.013128f, -0.004376f, -0.002515f, +0.000319f, -0.000034f, +0.001871f, +0.001224f, +0.002022f, + +0.010089f, +0.001464f, -0.005558f, -0.007540f, -0.019108f, -0.006428f, +0.005717f, +0.006868f, -0.001523f, -0.002486f, + +0.007109f, +0.002156f, -0.006195f, +0.004821f, -0.024095f, -0.001787f, -0.006208f, +0.003334f, -0.000913f, +0.018341f, + -0.006840f, +0.006240f, -0.001640f, +0.001833f, +0.004446f, +0.009652f, +0.000593f, -0.000769f, -0.006214f, +0.002431f, + -0.000532f, -0.002962f, -0.002838f, -0.000941f, +0.001228f, +0.001184f, +0.005018f, -0.001029f, -0.001051f, -0.000413f, + +0.000080f, +0.002521f, +0.002059f, +0.000758f, +0.002870f, +0.000365f, -0.003338f, +0.002564f, +0.000992f, -0.002446f, + -0.001359f, +0.001957f, +0.000459f, -0.000773f, -0.000006f, +0.001656f, +0.000508f, +0.000741f, -0.000661f, +0.000896f, + +0.000049f, -0.000757f, +0.001673f, -0.000040f, +0.000236f, -0.000612f, -0.000516f, +0.000577f, -0.000617f, +0.001366f, + +0.000136f, +0.000275f, +0.000066f, +0.000442f, -0.000360f, -0.000099f, +0.000477f, +0.000196f, +0.000765f, -0.000100f, + -0.000392f, +0.000442f, +0.000193f, -0.000138f, -0.000125f, +0.000293f + }, + { + +0.029486f, -0.384550f, -0.005855f, -0.018316f, +0.002108f, +0.001622f, +0.001854f, -0.006069f, -0.000714f, -0.019183f, + -0.005215f, -0.004757f, +0.012779f, +0.001335f, +0.002877f, +0.000085f, +0.009174f, -0.007652f, +0.003177f, -0.008118f, + -0.005588f, +0.000903f, -0.005176f, -0.011397f, -0.011839f, -0.004270f, +0.003610f, +0.008193f, +0.003034f, -0.000106f, + +0.003113f, -0.001595f, -0.003122f, -0.001808f, -0.002751f, -0.004648f, +0.000495f, -0.003116f, -0.001586f, +0.004119f, + +0.000534f, +0.000985f, -0.003335f, -0.002193f, -0.001746f, +0.005530f, -0.006498f, -0.001616f, -0.001084f, -0.000806f, + -0.002920f, +0.001280f, +0.002603f, +0.001920f, +0.002028f, -0.000139f, +0.001555f, +0.001751f, +0.002434f, +0.000884f, + +0.001170f, -0.002773f, -0.003167f, +0.001080f, -0.001329f, +0.001059f, +0.000311f, -0.000403f, +0.000062f, -0.000949f, + -0.000059f, -0.001824f, -0.001183f, +0.000384f, -0.000217f, -0.000414f, -0.000799f, +0.000026f, +0.000356f, -0.000323f, + -0.000718f, +0.000405f, +0.000387f, +0.000368f, -0.000493f, -0.000772f, +0.000589f, -0.000044f, +0.001074f, +0.000455f, + +0.000272f, +0.000230f, +0.000368f, -0.000453f, -0.000005f, +0.000117f + }, + { + -0.002246f, +0.002043f, -0.012119f, +0.005507f, +0.004356f, +0.001439f, -0.002008f, -0.000496f, -0.000264f, +0.000609f, + -0.002959f, +0.003420f, +0.004335f, +0.006917f, -0.006468f, +0.016492f, -0.003470f, +0.001717f, -0.007939f, +0.015624f, + -0.017133f, +0.009575f, -0.014387f, +0.003756f, +0.004491f, -0.015836f, -0.016820f, -0.022265f, -0.002211f, -0.005065f, + -0.006426f, -0.001259f, -0.008744f, -0.000903f, -0.008963f, -0.012005f, +0.000870f, -0.000508f, +0.003322f, +0.001139f, + +0.003786f, -0.003701f, -0.001045f, +0.003851f, -0.003149f, +0.000647f, +0.000119f, -0.004000f, +0.001569f, +0.000377f, + +0.000676f, +0.003130f, -0.000287f, +0.000453f, +0.000380f, -0.002401f, +0.003621f, +0.000942f, +0.000935f, +0.000866f, + +0.002767f, +0.000863f, -0.003205f, -0.001118f, -0.000195f, +0.000035f, +0.000388f, -0.000480f, +0.000185f, -0.001489f, + +0.001011f, -0.001412f, +0.001522f, +0.001153f, +0.000407f, +0.001159f, -0.000348f, +0.000014f, -0.000438f, +0.000183f, + -0.000052f, -0.000828f, +0.000043f, +0.000379f, -0.000051f, +0.000058f, -0.000103f, +0.000501f, -0.000073f, +0.000774f, + -0.000141f, -0.000714f, -0.000191f, -0.000201f, -0.000613f, -0.000253f + }, + { + +0.065067f, -0.013794f, -0.067041f, -0.038840f, -0.006233f, +0.000447f, +0.003151f, -0.011173f, -0.004761f, -0.003343f, + -0.003793f, -0.004105f, -0.002227f, -0.009938f, +0.008963f, -0.001395f, +0.001940f, +0.010790f, -0.008583f, -0.002723f, + -0.005010f, -0.005225f, -0.006531f, +0.001769f, +0.005137f, -0.001146f, +0.001291f, +0.003328f, -0.000436f, +0.000347f, + +0.004028f, +0.008912f, +0.003355f, +0.003568f, -0.003602f, +0.001435f, +0.010138f, +0.004416f, -0.002041f, +0.001058f, + +0.005074f, +0.004230f, +0.007283f, +0.001382f, +0.003839f, -0.001356f, +0.003002f, +0.000141f, -0.000880f, +0.000939f, + -0.002227f, -0.003440f, +0.000021f, +0.002181f, +0.000922f, -0.001005f, -0.004102f, +0.000521f, +0.001111f, +0.000152f, + -0.000038f, +0.001535f, -0.001364f, -0.000224f, -0.001341f, -0.001742f, +0.000514f, +0.001120f, -0.000551f, +0.000639f, + +0.001762f, -0.000297f, -0.001316f, -0.000136f, -0.000896f, -0.001830f, -0.000241f, +0.000480f, -0.000570f, -0.000479f, + +0.000128f, +0.000005f, -0.000027f, -0.000644f, +0.000229f, -0.000389f, +0.000776f, +0.000572f, -0.000615f, +0.000535f, + -0.000246f, -0.000368f, -0.000429f, +0.000352f, +0.000492f, +0.000295f + }, + { + +0.002786f, -0.052853f, -0.002646f, +0.002260f, +0.008593f, +0.014348f, +0.020683f, -0.005162f, +0.000014f, -0.003752f, + +0.014084f, +0.010555f, +0.009338f, +0.006402f, -0.006439f, +0.004781f, -0.005783f, +0.005593f, +0.001977f, -0.000411f, + -0.017724f, +0.018279f, +0.003540f, +0.016537f, +0.015331f, -0.007169f, -0.010560f, +0.000137f, +0.012618f, +0.002097f, + -0.001831f, +0.002761f, -0.002542f, -0.000126f, -0.001907f, +0.001757f, -0.013466f, -0.006359f, +0.000824f, +0.002097f, + -0.000726f, +0.000873f, -0.000999f, -0.003864f, +0.000928f, +0.004871f, +0.000998f, -0.003502f, -0.002187f, +0.001508f, + +0.001023f, +0.003052f, -0.001103f, +0.002189f, -0.002992f, +0.001159f, -0.004277f, +0.000967f, +0.000866f, +0.001243f, + +0.001841f, +0.001447f, +0.000307f, -0.001236f, -0.002299f, -0.001037f, -0.000489f, -0.000341f, -0.000329f, +0.000116f, + -0.000088f, +0.000229f, +0.000564f, -0.000359f, +0.000917f, +0.001066f, -0.001030f, +0.000718f, -0.000118f, +0.001479f, + +0.000175f, -0.000003f, +0.000117f, -0.000122f, -0.000166f, -0.000035f, -0.000694f, +0.000253f, -0.000462f, +0.000891f, + +0.000967f, -0.000118f, -0.000494f, -0.000587f, +0.000384f, +0.000891f + }, + { + +0.005703f, -0.307829f, -0.038576f, -0.004004f, +0.033788f, -0.025020f, +0.022184f, -0.009556f, -0.010706f, -0.000450f, + -0.000245f, +0.008570f, +0.005659f, -0.009140f, -0.014123f, +0.011474f, -0.002748f, -0.001664f, -0.005990f, -0.004159f, + -0.001384f, +0.002166f, +0.002142f, +0.002165f, -0.002397f, +0.000996f, -0.001702f, -0.009495f, -0.005595f, -0.003222f, + -0.003374f, -0.008427f, +0.004066f, -0.007054f, -0.000247f, -0.001558f, -0.002950f, +0.005040f, -0.002743f, +0.001173f, + +0.000539f, +0.001847f, +0.000668f, +0.002127f, -0.003398f, -0.000551f, -0.001078f, +0.003174f, +0.000666f, +0.002121f, + -0.000432f, +0.000378f, +0.001559f, +0.001388f, -0.000835f, -0.002922f, +0.001079f, +0.001664f, +0.000075f, +0.002290f, + -0.000525f, -0.001528f, -0.000031f, +0.001150f, +0.000436f, -0.002309f, -0.001017f, -0.000298f, -0.000542f, +0.000012f, + -0.000539f, -0.000228f, -0.001448f, +0.000548f, +0.000817f, +0.000887f, -0.000123f, -0.000386f, +0.000220f, +0.000316f, + -0.000113f, +0.000426f, +0.000371f, +0.000048f, -0.000124f, -0.000971f, +0.000359f, +0.000192f, +0.000444f, -0.000428f, + -0.000378f, +0.000265f, -0.000079f, +0.000339f, -0.000218f, +0.000127f + }, + { + +0.003213f, +0.028185f, -0.007983f, +0.008620f, +0.008664f, +0.002647f, -0.006540f, -0.009229f, -0.004066f, -0.002579f, + -0.011806f, +0.003474f, +0.001138f, +0.034499f, +0.011886f, -0.001092f, +0.013564f, +0.010059f, +0.004991f, +0.006089f, + -0.003577f, -0.003798f, +0.009933f, +0.002395f, +0.011872f, +0.009891f, -0.013580f, -0.002645f, -0.002552f, -0.006993f, + +0.010981f, -0.002490f, -0.002040f, -0.003405f, -0.003112f, -0.004403f, -0.002856f, +0.005094f, +0.008565f, +0.005685f, + +0.000348f, -0.001135f, +0.004765f, +0.002325f, +0.001124f, -0.002387f, +0.002230f, +0.003032f, -0.000983f, +0.002755f, + +0.000466f, -0.000277f, +0.000684f, +0.002787f, -0.001466f, +0.004973f, -0.000311f, -0.002100f, +0.000437f, +0.001370f, + +0.000823f, +0.001528f, +0.002046f, -0.002344f, -0.001687f, -0.000785f, -0.000765f, +0.000421f, -0.000562f, -0.000045f, + -0.001711f, +0.001141f, +0.000360f, -0.001644f, +0.000038f, +0.000230f, +0.000457f, +0.000014f, +0.001563f, +0.000410f, + +0.000552f, -0.000222f, -0.000517f, +0.000294f, -0.000707f, +0.000579f, +0.000599f, -0.000701f, -0.000184f, +0.000203f, + +0.000405f, +0.000141f, +0.000048f, -0.000432f, +0.000259f, +0.000062f + }, + { + -0.049774f, +0.158774f, -0.006751f, +0.003716f, +0.006378f, -0.000419f, -0.003581f, +0.015551f, +0.002154f, -0.000368f, + +0.010467f, +0.013062f, -0.005600f, +0.029012f, -0.007666f, +0.000699f, -0.010011f, -0.012213f, +0.007123f, -0.002930f, + -0.000262f, -0.002790f, +0.015119f, +0.005245f, -0.009780f, -0.005278f, +0.002034f, +0.011027f, +0.003396f, -0.007380f, + +0.010913f, +0.004824f, +0.003733f, +0.004720f, +0.007308f, -0.001507f, +0.005026f, +0.006230f, -0.008022f, +0.002152f, + -0.004670f, +0.001476f, +0.002327f, +0.005935f, +0.002192f, -0.000024f, -0.002535f, -0.000928f, +0.000977f, +0.004228f, + -0.003547f, -0.000176f, -0.004224f, -0.000095f, +0.000307f, +0.003306f, -0.003594f, -0.001830f, +0.000003f, -0.000057f, + -0.002227f, +0.001467f, -0.001001f, +0.000562f, +0.001017f, +0.000713f, -0.002190f, +0.000114f, -0.001714f, +0.000562f, + +0.001144f, -0.000851f, -0.001517f, +0.000688f, +0.000050f, -0.000357f, +0.000970f, -0.001187f, +0.000297f, +0.001239f, + -0.000698f, -0.000704f, -0.000213f, +0.000058f, -0.001025f, -0.000122f, -0.000208f, -0.000691f, -0.000092f, +0.000267f, + -0.000472f, -0.000713f, +0.000245f, +0.000583f, +0.000112f, +0.000651f + }, + { + +0.002833f, -0.022580f, -0.005014f, +0.008855f, +0.001263f, +0.001849f, +0.013244f, +0.006153f, +0.005796f, -0.002821f, + +0.006327f, -0.011553f, -0.005807f, +0.036800f, -0.060972f, +0.003248f, +0.018780f, +0.008465f, +0.002095f, +0.005893f, + -0.013076f, +0.018187f, -0.001802f, +0.010344f, -0.002227f, +0.002491f, +0.006394f, +0.003947f, +0.003778f, -0.003415f, + +0.004961f, +0.002127f, -0.005012f, -0.000439f, -0.005061f, -0.006619f, +0.000011f, -0.002521f, +0.004862f, -0.000287f, + +0.000230f, -0.000698f, -0.004704f, -0.003577f, -0.000655f, -0.001604f, -0.002245f, -0.004683f, +0.004509f, +0.001640f, + -0.000560f, +0.002572f, -0.002501f, -0.001622f, +0.000351f, -0.000039f, -0.000278f, -0.003006f, -0.000031f, -0.002727f, + -0.001272f, +0.001918f, +0.000513f, -0.001543f, -0.001202f, +0.000598f, -0.000607f, -0.000475f, +0.000521f, -0.000769f, + +0.000879f, +0.000258f, -0.000766f, -0.000032f, +0.001130f, +0.000657f, -0.000690f, +0.000103f, -0.001188f, +0.000324f, + +0.000374f, -0.000513f, +0.000055f, -0.000089f, -0.000616f, +0.000228f, -0.000058f, -0.000323f, -0.000158f, -0.000252f, + -0.000574f, -0.000090f, -0.000220f, +0.000231f, -0.000494f, -0.000296f + }, + { + -0.045036f, +0.000567f, -0.003553f, -0.012887f, -0.003685f, -0.003185f, +0.001616f, +0.002145f, +0.000302f, +0.002280f, + +0.013991f, +0.000061f, -0.007620f, +0.021062f, -0.034713f, +0.000844f, -0.018604f, +0.004955f, +0.015780f, +0.005287f, + -0.008206f, -0.001141f, -0.001495f, +0.001216f, +0.004302f, +0.001052f, +0.009258f, -0.009337f, +0.002309f, +0.000187f, + +0.007584f, +0.009102f, +0.001339f, -0.004982f, -0.010060f, -0.006362f, -0.005227f, -0.001080f, +0.001765f, +0.002911f, + -0.001759f, +0.007134f, -0.000972f, +0.001965f, -0.001482f, +0.000047f, +0.001501f, +0.000074f, -0.001904f, -0.001705f, + -0.002920f, -0.000078f, +0.002058f, +0.001687f, +0.001512f, -0.001339f, -0.000446f, -0.001110f, -0.000466f, +0.001554f, + -0.000333f, +0.001361f, -0.000554f, -0.001737f, -0.000799f, +0.000950f, +0.000299f, +0.000456f, +0.000165f, -0.000296f, + +0.001196f, +0.000879f, +0.000681f, +0.001154f, +0.001179f, +0.000577f, -0.000402f, -0.000156f, -0.000126f, -0.000213f, + +0.000969f, -0.000449f, +0.000656f, +0.000038f, +0.000222f, -0.000217f, -0.000896f, -0.000799f, -0.000327f, +0.000233f, + +0.000333f, +0.000327f, +0.000350f, +0.000282f, -0.000587f, -0.000426f + } + }, + { + { + -0.001021f, -0.035151f, +0.031154f, +0.009273f, +0.000709f, +0.001359f, -0.000323f, -0.000731f, +0.005478f, +0.005102f, + -0.009841f, +0.002629f, -0.009119f, -0.000864f, +0.016410f, +0.006431f, -0.001063f, +0.017091f, +0.005215f, -0.034280f, + -0.003674f, +0.004206f, -0.014855f, -0.000102f, -0.019594f, +0.003558f, -0.000819f, +0.007078f, -0.004555f, +0.002173f, + +0.011563f, +0.006281f, -0.001936f, -0.007630f, -0.002559f, +0.007219f, +0.004145f, -0.005738f, +0.001070f, +0.000230f, + +0.000681f, +0.001078f, -0.000897f, +0.002320f, +0.003719f, +0.004255f, -0.001221f, +0.002095f, +0.003808f, -0.002644f, + +0.002154f, -0.000871f, -0.000965f, -0.002591f, +0.000460f, -0.001166f, -0.000676f, -0.000863f, -0.000427f, -0.002415f, + -0.000985f, +0.003102f, -0.002046f, +0.000896f, +0.001274f, -0.001067f, +0.001424f, +0.000890f, +0.001168f, -0.000020f, + +0.000073f, -0.000187f, +0.000824f, +0.000022f, +0.001477f, +0.000242f, +0.000239f, +0.000188f, -0.000029f, -0.000173f, + -0.000891f, +0.000129f, +0.000738f, +0.000230f, -0.000547f, -0.000340f, +0.000158f, +0.000224f, +0.000634f, -0.000281f, + +0.000053f, -0.000326f, -0.000072f, +0.000053f, -0.000040f, +0.000345f + }, + { + -0.016432f, +0.044654f, +0.076273f, +0.022946f, -0.011185f, +0.002311f, -0.004396f, -0.000445f, -0.002182f, +0.002819f, + -0.008658f, +0.007367f, +0.008538f, -0.007502f, +0.004702f, +0.009812f, +0.000299f, -0.002791f, -0.010308f, +0.007691f, + -0.011973f, +0.012599f, -0.000204f, -0.004332f, -0.001617f, +0.004163f, +0.003913f, -0.000453f, +0.000738f, -0.002875f, + -0.008156f, -0.005445f, +0.003085f, -0.005806f, -0.003535f, +0.000518f, +0.003165f, -0.003741f, +0.009111f, -0.001944f, + -0.002363f, +0.001056f, -0.006096f, -0.000735f, +0.000851f, -0.000000f, -0.002635f, -0.003129f, -0.000346f, +0.000313f, + +0.002653f, +0.003281f, -0.002487f, -0.003549f, +0.001915f, -0.000888f, +0.000340f, -0.002011f, +0.001435f, +0.000241f, + +0.001157f, +0.001148f, +0.001175f, +0.000133f, +0.000116f, +0.001128f, +0.000740f, +0.000050f, +0.001284f, +0.000393f, + +0.000481f, -0.001612f, +0.000312f, -0.000821f, -0.000906f, -0.000028f, -0.000982f, +0.000054f, +0.000292f, -0.000830f, + +0.000313f, +0.000396f, -0.000316f, +0.000589f, +0.000437f, -0.000292f, +0.000125f, +0.000279f, +0.000153f, +0.000501f, + -0.000450f, -0.000100f, -0.000314f, -0.000213f, -0.000077f, -0.000015f + }, + { + +0.009487f, -0.016250f, -0.067291f, +0.051262f, -0.001033f, -0.004451f, +0.001324f, -0.006923f, -0.000282f, +0.004264f, + -0.000284f, +0.007420f, -0.005929f, +0.023360f, -0.003158f, -0.000953f, +0.014155f, -0.006233f, -0.009310f, -0.007803f, + +0.001749f, +0.004372f, +0.013386f, -0.017049f, +0.006120f, +0.003099f, -0.002906f, +0.004431f, -0.000759f, -0.006748f, + -0.002920f, +0.003255f, -0.009567f, +0.000810f, -0.001919f, -0.000472f, -0.003342f, +0.004431f, -0.002177f, -0.000050f, + +0.005263f, +0.001871f, -0.001359f, -0.002832f, +0.002012f, -0.004559f, +0.003407f, +0.002766f, +0.001630f, -0.000664f, + -0.004273f, +0.002433f, -0.002026f, -0.002877f, +0.002424f, +0.004097f, -0.000945f, -0.001546f, +0.000736f, -0.000756f, + -0.000382f, -0.001173f, +0.000611f, +0.000943f, +0.000051f, -0.000346f, +0.000411f, -0.000147f, +0.000173f, -0.001588f, + +0.000080f, +0.000006f, -0.000816f, +0.000037f, -0.000232f, +0.000554f, -0.000079f, +0.000769f, -0.000952f, +0.000216f, + +0.000006f, +0.000586f, -0.000141f, -0.000468f, -0.000138f, -0.000455f, -0.000552f, -0.000643f, +0.000612f, -0.000076f, + +0.000297f, -0.000148f, +0.000190f, +0.000234f, -0.000437f, -0.000537f + }, + { + -0.004026f, +0.018848f, +0.013290f, +0.000010f, +0.001596f, -0.001108f, -0.000561f, +0.000318f, +0.000629f, -0.001611f, + +0.008736f, -0.001319f, -0.002047f, +0.014250f, -0.026634f, +0.001472f, -0.002820f, +0.014867f, -0.004965f, +0.012886f, + -0.005916f, +0.012656f, +0.001439f, +0.002995f, +0.010566f, +0.006110f, +0.004053f, +0.008474f, -0.001383f, -0.004314f, + +0.008541f, -0.008907f, +0.006345f, +0.004292f, -0.002926f, +0.006127f, +0.003368f, +0.003853f, -0.002157f, -0.002349f, + +0.001045f, -0.001431f, +0.001554f, +0.001131f, +0.001597f, -0.000717f, +0.000304f, -0.002573f, +0.000402f, -0.001933f, + +0.000691f, -0.001160f, +0.000285f, -0.001859f, -0.001008f, +0.000437f, -0.000807f, -0.000810f, +0.000168f, -0.001127f, + +0.000144f, +0.001162f, -0.001208f, -0.000218f, +0.001117f, -0.000137f, +0.001664f, +0.001026f, -0.001062f, +0.001196f, + -0.001087f, +0.000030f, +0.000646f, +0.000573f, -0.000674f, +0.000104f, +0.000140f, -0.000266f, -0.000547f, +0.000126f, + -0.000301f, -0.000084f, +0.000117f, +0.001019f, -0.000569f, -0.000153f, +0.000017f, -0.000037f, -0.000281f, +0.000026f, + -0.000010f, +0.000055f, -0.000153f, -0.000105f, -0.000131f, -0.000018f + }, + { + -0.042747f, -0.309007f, +0.046999f, -0.021969f, +0.003538f, -0.001877f, -0.001997f, -0.001239f, -0.003045f, +0.004534f, + +0.007404f, -0.007200f, -0.011017f, +0.003898f, -0.000538f, +0.004180f, -0.001210f, -0.017514f, +0.011194f, -0.000606f, + +0.001870f, -0.002851f, +0.010020f, -0.002495f, +0.010016f, -0.008384f, -0.003383f, +0.007062f, +0.000706f, +0.004375f, + -0.000119f, -0.003019f, -0.001787f, +0.002102f, -0.000081f, +0.003870f, -0.010451f, +0.008884f, -0.001712f, -0.005856f, + +0.003637f, +0.003871f, -0.006297f, +0.003325f, +0.000340f, +0.002025f, +0.001648f, -0.001354f, -0.004186f, +0.000019f, + +0.001610f, +0.001489f, +0.001070f, +0.002346f, -0.001426f, +0.001120f, +0.001993f, -0.000307f, +0.002304f, -0.000518f, + +0.000663f, +0.000838f, +0.000202f, -0.001723f, +0.000583f, +0.000021f, -0.001526f, -0.001126f, -0.001363f, -0.000246f, + -0.001341f, +0.000696f, -0.000036f, +0.000396f, +0.000038f, +0.000854f, +0.001251f, +0.000454f, +0.000503f, -0.000316f, + +0.000830f, +0.001051f, -0.000930f, -0.000176f, -0.000020f, +0.000637f, +0.000553f, +0.000128f, -0.000417f, -0.000355f, + +0.000445f, -0.000645f, -0.000569f, +0.000484f, +0.000131f, +0.000181f + }, + { + +0.000862f, -0.016833f, +0.016473f, -0.004416f, +0.000008f, +0.000475f, +0.000366f, +0.001111f, -0.003293f, -0.001393f, + +0.006736f, -0.001588f, +0.002022f, +0.009676f, +0.001154f, +0.001835f, +0.004493f, +0.011994f, -0.008029f, -0.013021f, + +0.007593f, -0.000227f, -0.012273f, +0.011795f, +0.001837f, +0.012881f, -0.007690f, -0.002064f, -0.008965f, +0.011520f, + -0.005382f, +0.002781f, -0.011965f, -0.004175f, +0.000481f, +0.005176f, -0.000300f, +0.000499f, -0.001256f, +0.002275f, + +0.001613f, -0.000110f, -0.000945f, +0.000604f, +0.001308f, -0.001855f, +0.002172f, +0.001112f, +0.000807f, -0.000762f, + -0.000342f, -0.000573f, -0.000529f, +0.001005f, +0.000960f, -0.000695f, -0.004003f, +0.000652f, -0.001052f, -0.001564f, + -0.001193f, +0.001215f, -0.000113f, -0.000864f, -0.000676f, +0.000644f, +0.000807f, +0.000781f, -0.001285f, +0.001150f, + +0.000723f, -0.001474f, +0.001079f, +0.000745f, +0.001148f, -0.000423f, +0.000014f, +0.000084f, -0.001020f, +0.000069f, + -0.000239f, +0.000505f, -0.000157f, +0.000244f, -0.000122f, -0.000067f, +0.000610f, +0.000214f, +0.000377f, -0.000095f, + -0.000529f, +0.000024f, +0.000005f, -0.000033f, -0.000259f, +0.000114f + }, + { + +0.017844f, -0.414556f, +0.001874f, -0.011060f, -0.000003f, +0.006328f, +0.005688f, -0.001935f, +0.014281f, +0.002919f, + -0.002523f, -0.016576f, +0.000760f, -0.002678f, -0.002507f, -0.011583f, +0.011221f, -0.005499f, +0.004025f, -0.002760f, + +0.003212f, +0.004812f, -0.002499f, +0.002030f, -0.005274f, -0.005451f, +0.005011f, +0.006969f, +0.010240f, +0.006977f, + +0.003273f, +0.000392f, +0.000373f, +0.000898f, -0.002983f, -0.002611f, -0.000303f, +0.000284f, +0.004488f, +0.000549f, + -0.002899f, -0.004330f, -0.001177f, +0.004094f, -0.004521f, +0.002474f, -0.008175f, +0.000382f, +0.002199f, +0.001411f, + -0.001137f, +0.003554f, +0.002165f, -0.002944f, -0.000032f, +0.000108f, +0.001989f, +0.000867f, +0.001095f, +0.000703f, + +0.002198f, -0.000017f, -0.000961f, +0.001551f, -0.000875f, +0.001453f, -0.000710f, -0.001411f, -0.000211f, -0.000943f, + +0.000348f, -0.000077f, -0.000527f, +0.000162f, +0.000659f, -0.000400f, -0.001173f, -0.000064f, +0.000206f, -0.000393f, + -0.000261f, +0.000773f, +0.000311f, +0.000063f, +0.000029f, -0.000095f, +0.000566f, -0.000532f, -0.000184f, +0.000052f, + +0.000482f, -0.000283f, +0.000110f, -0.000431f, +0.000165f, +0.000063f + }, + { + +0.000478f, +0.027919f, +0.001765f, +0.006045f, +0.000442f, -0.000366f, -0.001966f, +0.001801f, +0.001773f, -0.000354f, + -0.001923f, +0.000623f, +0.002807f, +0.003399f, +0.001418f, +0.012290f, -0.015541f, +0.012143f, +0.002848f, -0.001112f, + -0.027709f, +0.011665f, -0.008073f, +0.014646f, +0.014968f, -0.012289f, -0.001945f, -0.007050f, -0.001561f, +0.001290f, + -0.000110f, -0.003648f, -0.011980f, +0.001873f, -0.001167f, -0.010809f, -0.005109f, -0.004436f, +0.000553f, -0.000779f, + +0.002443f, -0.002710f, +0.002191f, +0.000542f, -0.007956f, -0.002282f, +0.001955f, -0.002523f, +0.000449f, -0.000509f, + -0.001700f, +0.002006f, -0.001167f, -0.000188f, -0.000486f, -0.003129f, +0.001574f, -0.000953f, +0.001551f, +0.000220f, + -0.000233f, -0.000155f, -0.002043f, -0.000001f, +0.000017f, -0.000199f, -0.000088f, +0.000707f, +0.000688f, -0.000823f, + +0.001391f, -0.001742f, +0.001465f, +0.000941f, -0.000510f, -0.000188f, -0.000167f, +0.000749f, -0.000254f, -0.000085f, + -0.000744f, -0.000824f, +0.000254f, +0.000174f, -0.000148f, -0.000003f, +0.000143f, -0.000040f, -0.000764f, +0.000372f, + -0.000190f, +0.000141f, +0.000781f, +0.000348f, -0.000272f, -0.000251f + }, + { + -0.083125f, -0.089545f, +0.041181f, -0.018209f, -0.000614f, -0.000103f, +0.006647f, -0.003621f, +0.008020f, +0.003677f, + -0.001882f, -0.001177f, +0.004342f, -0.006987f, -0.006098f, -0.010029f, -0.003883f, +0.009708f, +0.000342f, +0.001603f, + -0.004103f, -0.005052f, -0.001407f, +0.001324f, +0.004147f, +0.001709f, -0.000024f, +0.001610f, -0.002957f, +0.002055f, + +0.002850f, +0.001817f, +0.000672f, +0.004042f, -0.002132f, -0.003599f, +0.007873f, +0.005830f, -0.001045f, +0.000434f, + +0.002420f, -0.001787f, +0.000302f, -0.005229f, -0.003568f, -0.002504f, +0.005628f, -0.001017f, -0.002068f, +0.001190f, + +0.000332f, -0.001115f, -0.000834f, -0.002043f, -0.002965f, -0.000486f, -0.001752f, -0.000367f, +0.000047f, +0.000586f, + -0.000110f, +0.000792f, -0.001633f, -0.000726f, -0.002645f, -0.002393f, +0.000270f, +0.001375f, +0.000429f, +0.001445f, + +0.001605f, -0.000280f, -0.000606f, +0.000825f, -0.000476f, -0.002034f, -0.000125f, +0.000429f, -0.000040f, +0.000550f, + +0.000208f, -0.000779f, -0.000372f, -0.000179f, +0.000662f, -0.000625f, +0.000199f, +0.000310f, -0.000796f, +0.000456f, + +0.000057f, +0.000444f, +0.000315f, +0.000532f, +0.000000f, +0.000304f + }, + { + -0.003192f, -0.006834f, +0.033781f, -0.009293f, +0.003971f, +0.002397f, +0.009481f, -0.008440f, -0.003070f, -0.006760f, + +0.003643f, -0.008623f, -0.003538f, +0.001864f, -0.019531f, -0.000752f, -0.000677f, +0.010745f, +0.015921f, +0.002680f, + -0.014503f, +0.011270f, -0.002603f, +0.016048f, -0.001689f, -0.006355f, +0.004924f, -0.009518f, +0.005161f, +0.000250f, + -0.004215f, +0.008021f, +0.002561f, -0.001262f, -0.000664f, +0.006217f, -0.006716f, -0.005777f, -0.006605f, -0.000856f, + -0.004071f, -0.004521f, +0.000715f, +0.000810f, +0.000406f, -0.002597f, +0.002452f, +0.002187f, -0.000749f, +0.000876f, + +0.000741f, +0.000744f, -0.001814f, +0.001572f, -0.004896f, +0.002052f, -0.001987f, +0.002078f, -0.001007f, -0.001417f, + +0.000571f, -0.000571f, -0.000424f, +0.000368f, -0.000344f, +0.000194f, +0.001244f, +0.000987f, -0.000230f, -0.000808f, + -0.000209f, -0.000198f, +0.000721f, +0.000165f, +0.001357f, +0.001404f, -0.000537f, +0.000780f, -0.000899f, +0.000796f, + -0.000220f, -0.000062f, +0.000216f, -0.000007f, -0.000297f, +0.000262f, -0.000522f, +0.000540f, -0.000546f, +0.000117f, + +0.000364f, +0.000300f, -0.000167f, -0.000675f, -0.000045f, +0.000473f + }, + { + -0.008210f, -0.276835f, +0.010031f, -0.002507f, +0.024499f, -0.014640f, +0.027695f, -0.015995f, -0.004477f, -0.001892f, + -0.008942f, +0.003986f, +0.003039f, -0.004337f, -0.008730f, +0.010432f, -0.004701f, +0.006242f, +0.001461f, +0.003862f, + -0.000309f, +0.000791f, -0.004559f, -0.001081f, -0.001283f, +0.006729f, +0.006851f, -0.003565f, -0.000985f, -0.003158f, + +0.000206f, -0.004658f, +0.005264f, -0.001135f, +0.003972f, -0.003618f, -0.003998f, +0.007085f, -0.003025f, +0.002406f, + +0.002062f, +0.002353f, +0.000102f, -0.001262f, +0.001868f, +0.003404f, -0.003927f, -0.001609f, -0.002017f, +0.000640f, + -0.002575f, -0.001268f, -0.001310f, -0.000187f, -0.002409f, -0.002359f, +0.001196f, -0.000641f, -0.003046f, +0.000637f, + +0.001768f, -0.000117f, -0.001259f, +0.000113f, +0.000073f, -0.001242f, +0.000162f, -0.000337f, -0.000089f, -0.000278f, + -0.000407f, +0.000780f, -0.001266f, +0.000091f, +0.000266f, +0.000532f, +0.000144f, +0.000226f, +0.000299f, +0.000191f, + +0.000033f, +0.000075f, +0.000043f, +0.000475f, -0.000027f, -0.000625f, +0.000270f, +0.000373f, +0.000456f, -0.000159f, + +0.000037f, +0.000095f, -0.000360f, +0.000209f, -0.000261f, +0.000152f + }, + { + -0.002817f, +0.041968f, +0.002990f, +0.000088f, -0.000912f, -0.001304f, -0.001858f, -0.001943f, +0.004060f, +0.002755f, + -0.006701f, -0.004549f, -0.013533f, +0.031122f, +0.022030f, -0.006102f, +0.001448f, -0.004101f, -0.001256f, -0.004665f, + -0.008327f, -0.003161f, +0.004508f, -0.003891f, +0.000955f, +0.006162f, -0.003384f, +0.003865f, -0.002201f, -0.012250f, + +0.006350f, +0.002569f, -0.005684f, -0.003770f, -0.004764f, -0.006399f, -0.005068f, +0.005610f, +0.003071f, -0.002763f, + +0.002753f, +0.001532f, +0.002467f, +0.002878f, +0.003138f, -0.003393f, -0.000112f, -0.000115f, -0.003917f, +0.003021f, + -0.000117f, -0.001643f, -0.002831f, +0.002071f, -0.001770f, +0.004882f, +0.001589f, -0.001508f, +0.000540f, -0.000499f, + +0.001467f, +0.001329f, +0.001579f, -0.001291f, -0.000583f, -0.000860f, -0.000782f, +0.000819f, +0.000465f, +0.000885f, + -0.000760f, +0.000814f, -0.000046f, -0.000969f, +0.000318f, +0.000757f, +0.000679f, -0.000088f, +0.000905f, -0.000064f, + +0.000234f, +0.000114f, -0.000171f, -0.000158f, -0.000906f, -0.000378f, +0.000145f, -0.000723f, -0.000645f, -0.000212f, + +0.000099f, -0.000081f, +0.000103f, -0.000407f, +0.000129f, +0.000068f + }, + { + +0.010162f, +0.218556f, -0.029875f, -0.005793f, +0.004306f, -0.031914f, -0.032049f, +0.012582f, +0.004456f, +0.008851f, + +0.009218f, -0.000939f, -0.003661f, +0.037875f, -0.008428f, +0.008356f, +0.015102f, -0.000128f, +0.001733f, -0.008293f, + -0.005209f, -0.005052f, +0.000876f, -0.009532f, -0.012176f, +0.000676f, +0.003140f, +0.009068f, -0.002526f, -0.016966f, + +0.000245f, +0.003111f, +0.007641f, +0.001020f, +0.006722f, -0.007456f, -0.006472f, +0.007463f, -0.005163f, +0.000175f, + -0.000505f, +0.004045f, -0.002725f, -0.003946f, +0.000038f, +0.002523f, -0.000658f, -0.001397f, +0.002373f, +0.003999f, + -0.003462f, -0.000424f, -0.003007f, +0.004859f, +0.001445f, +0.004742f, -0.001970f, -0.001324f, +0.000626f, +0.000613f, + -0.002228f, +0.001410f, -0.001443f, -0.000773f, +0.000075f, +0.001111f, -0.002135f, -0.000248f, -0.001514f, +0.000346f, + +0.001119f, +0.001572f, -0.000217f, -0.000085f, +0.000088f, -0.000459f, +0.000002f, -0.001754f, +0.000765f, +0.001277f, + -0.000941f, -0.000972f, -0.000236f, +0.000597f, -0.000660f, -0.000075f, +0.000198f, -0.000032f, +0.000108f, -0.000155f, + -0.000352f, +0.000090f, +0.000559f, +0.000011f, -0.000530f, -0.000027f + }, + { + -0.002388f, -0.008793f, +0.012419f, +0.008809f, -0.004471f, -0.006399f, +0.001045f, -0.003884f, +0.004038f, -0.003927f, + +0.000185f, -0.013615f, -0.008860f, +0.048265f, -0.048252f, -0.019540f, +0.003257f, +0.005788f, -0.009281f, +0.009714f, + -0.006103f, +0.010803f, -0.010069f, +0.006598f, -0.005387f, -0.000595f, -0.002294f, -0.001970f, -0.003830f, -0.000659f, + +0.007348f, -0.005579f, -0.006341f, -0.000852f, -0.002391f, +0.004564f, +0.006844f, +0.000660f, +0.004175f, -0.006349f, + -0.001898f, +0.000337f, -0.000888f, -0.002354f, +0.001048f, +0.002422f, +0.002742f, -0.003078f, +0.004473f, +0.000715f, + +0.001338f, +0.002106f, -0.003101f, +0.000046f, +0.002440f, +0.001561f, +0.002435f, -0.001598f, +0.000083f, -0.000103f, + +0.000317f, +0.001940f, +0.001465f, -0.001650f, -0.000709f, +0.000243f, +0.000088f, +0.000252f, +0.001056f, -0.000984f, + +0.000436f, -0.000172f, -0.001071f, -0.000637f, +0.000624f, +0.000601f, -0.001318f, +0.001227f, -0.000637f, +0.000350f, + +0.000737f, -0.000441f, +0.000177f, -0.000115f, -0.000683f, +0.000373f, +0.000209f, +0.000199f, -0.000319f, +0.000009f, + +0.000085f, +0.000324f, -0.000195f, +0.000473f, -0.000244f, -0.000214f + }, + { + +0.028834f, +0.099985f, -0.002873f, -0.005679f, -0.000495f, -0.000255f, +0.006957f, -0.000163f, -0.001393f, -0.004241f, + +0.004221f, +0.001992f, -0.006760f, -0.010990f, -0.074253f, +0.001919f, -0.013468f, +0.002362f, +0.006737f, -0.000452f, + -0.008301f, +0.000247f, -0.001978f, +0.002635f, +0.003103f, -0.003462f, -0.002333f, -0.014294f, +0.005281f, -0.000253f, + -0.000016f, -0.002017f, -0.006433f, -0.003451f, -0.000599f, +0.002950f, +0.001532f, +0.004947f, -0.000294f, +0.000472f, + -0.000564f, -0.000121f, -0.008671f, +0.001770f, +0.003304f, +0.005176f, -0.000283f, -0.003568f, -0.002491f, -0.002020f, + -0.000828f, +0.001696f, -0.002311f, -0.001016f, +0.000727f, -0.002838f, +0.000759f, -0.000185f, -0.002565f, +0.001007f, + -0.001339f, +0.000865f, +0.002300f, +0.000421f, +0.000615f, +0.001542f, -0.000236f, -0.000024f, -0.000611f, -0.000951f, + +0.000347f, +0.000435f, -0.000077f, -0.000251f, -0.000122f, -0.000622f, -0.000538f, -0.000016f, +0.000299f, -0.000562f, + +0.000209f, -0.000990f, -0.000174f, -0.000852f, +0.000229f, +0.000411f, -0.000274f, -0.000089f, -0.000294f, +0.000052f, + -0.000245f, -0.000351f, +0.000105f, +0.000442f, -0.000252f, +0.000167f + } + }, + { + { + -0.001039f, +0.061699f, -0.032324f, +0.001053f, +0.001570f, +0.002327f, -0.001407f, +0.004097f, -0.001822f, -0.000829f, + +0.000548f, -0.009178f, +0.003065f, +0.008565f, -0.005407f, -0.000623f, +0.009748f, +0.012173f, -0.002352f, -0.025430f, + +0.004046f, -0.012267f, -0.003544f, -0.014867f, -0.006739f, +0.015090f, -0.003934f, +0.001144f, +0.004757f, +0.010342f, + -0.009315f, +0.013079f, -0.004526f, -0.003071f, -0.003635f, +0.004334f, +0.001354f, -0.004854f, +0.004319f, +0.002568f, + +0.000987f, -0.000045f, +0.001419f, -0.000590f, +0.004672f, +0.001443f, +0.001548f, +0.000389f, +0.005427f, -0.002556f, + +0.000503f, +0.000146f, -0.001713f, -0.002100f, -0.001482f, +0.001623f, -0.000959f, -0.000994f, -0.001593f, -0.000872f, + -0.001252f, +0.000876f, -0.000893f, +0.001026f, -0.000149f, +0.001169f, -0.000019f, +0.002524f, -0.000260f, +0.000722f, + +0.000041f, +0.000486f, +0.000037f, +0.001021f, +0.000630f, -0.000067f, +0.000634f, +0.000194f, +0.000170f, -0.000580f, + +0.000228f, +0.000230f, +0.000005f, +0.000140f, -0.000625f, -0.000052f, +0.000333f, +0.000312f, -0.000134f, +0.000155f, + -0.000451f, +0.000284f, -0.000220f, +0.000104f, -0.000118f, +0.000306f + }, + { + +0.012637f, +0.242424f, -0.091859f, +0.009160f, +0.009116f, -0.000191f, -0.006097f, +0.006296f, -0.000015f, +0.005261f, + -0.006701f, -0.004057f, -0.001767f, +0.014753f, -0.001265f, +0.002090f, +0.007416f, -0.020441f, +0.005068f, +0.007502f, + -0.008566f, +0.009439f, -0.001668f, -0.000397f, -0.001862f, +0.002930f, -0.000477f, +0.003303f, +0.001263f, -0.007362f, + -0.002716f, -0.003982f, -0.001556f, -0.005791f, +0.004173f, -0.006801f, +0.005927f, -0.003510f, +0.007823f, +0.006680f, + -0.003595f, -0.004939f, -0.000454f, -0.000021f, -0.001114f, +0.002409f, -0.004991f, -0.000712f, +0.000417f, -0.002345f, + +0.001324f, +0.004202f, -0.003034f, +0.000202f, -0.001833f, +0.000735f, -0.000657f, -0.002391f, +0.000960f, -0.000422f, + +0.003118f, -0.000152f, +0.001987f, -0.000619f, +0.000820f, +0.000738f, +0.000105f, +0.001424f, -0.000600f, +0.001648f, + -0.000113f, -0.001644f, +0.000414f, -0.000419f, -0.000652f, -0.000473f, -0.000984f, +0.001348f, -0.000761f, +0.000134f, + -0.000134f, +0.000224f, -0.000054f, +0.000326f, -0.000251f, +0.000695f, -0.000184f, +0.000031f, +0.000312f, +0.000008f, + +0.000206f, -0.000265f, -0.000211f, -0.000366f, -0.000074f, -0.000013f + }, + { + -0.004820f, -0.184847f, +0.071400f, +0.032891f, +0.007128f, +0.005074f, -0.005327f, -0.000266f, -0.000244f, +0.003663f, + +0.000843f, +0.003808f, +0.003877f, +0.011458f, -0.000681f, -0.005250f, +0.013525f, +0.006359f, -0.025071f, +0.001881f, + -0.004238f, +0.006575f, +0.006298f, -0.009063f, +0.012363f, -0.009738f, +0.007209f, -0.000714f, +0.001104f, -0.009453f, + +0.002052f, -0.005804f, -0.006319f, +0.003316f, -0.005248f, -0.001739f, +0.003579f, -0.002282f, +0.000092f, +0.003124f, + +0.002193f, +0.000148f, -0.002870f, -0.001929f, +0.003414f, -0.003445f, +0.003170f, +0.002692f, +0.001138f, -0.001435f, + -0.001711f, +0.000258f, +0.001018f, -0.004645f, +0.004550f, +0.001981f, -0.001551f, +0.000093f, -0.002360f, -0.000354f, + +0.001421f, -0.001455f, -0.001581f, +0.001277f, +0.000926f, +0.000599f, -0.000568f, +0.000382f, -0.000556f, -0.001281f, + -0.000217f, -0.000048f, -0.000423f, -0.000109f, +0.000057f, +0.000133f, -0.000100f, +0.000437f, +0.000038f, -0.000267f, + +0.000055f, +0.000322f, -0.000004f, -0.000601f, +0.000113f, -0.000381f, -0.000510f, -0.000376f, +0.000640f, -0.000031f, + +0.000031f, +0.000096f, -0.000045f, +0.000067f, -0.000507f, -0.000578f + }, + { + +0.002893f, +0.046494f, -0.012065f, +0.000429f, -0.000490f, -0.000167f, -0.000861f, +0.001206f, +0.000665f, -0.000794f, + +0.004238f, -0.000948f, +0.004492f, -0.003481f, +0.003097f, -0.003240f, -0.002757f, +0.014688f, -0.009692f, +0.005764f, + +0.009341f, +0.001876f, -0.001451f, +0.000567f, +0.011552f, +0.008548f, +0.003891f, +0.008627f, -0.000168f, +0.000808f, + -0.004156f, -0.005669f, +0.004819f, +0.000644f, +0.005747f, +0.005112f, +0.004589f, +0.001561f, -0.002012f, -0.001324f, + -0.000210f, +0.001983f, -0.002237f, +0.002415f, -0.000291f, +0.000287f, +0.000426f, +0.000788f, -0.002327f, -0.001433f, + +0.001115f, -0.001868f, -0.000715f, -0.000269f, -0.003140f, +0.001631f, -0.001267f, -0.001257f, -0.000117f, +0.000455f, + -0.000140f, +0.000551f, -0.001420f, +0.000480f, +0.000066f, -0.000301f, +0.001411f, +0.000023f, +0.000599f, -0.000651f, + +0.000539f, +0.000545f, -0.000206f, +0.000221f, +0.000100f, -0.000393f, +0.000420f, -0.000847f, -0.000368f, -0.000348f, + -0.000371f, +0.000762f, +0.000177f, -0.000095f, -0.000336f, +0.000237f, +0.000458f, -0.000498f, -0.000384f, -0.000116f, + +0.000130f, +0.000022f, -0.000440f, -0.000225f, -0.000133f, +0.000025f + }, + { + +0.018170f, -0.336924f, +0.012598f, -0.024417f, +0.003036f, +0.000758f, -0.001395f, -0.003599f, +0.000451f, +0.009895f, + -0.015551f, +0.004652f, -0.003388f, +0.001627f, +0.011097f, +0.000161f, +0.004006f, -0.026483f, +0.011389f, +0.000970f, + +0.000804f, -0.005338f, +0.010956f, -0.001193f, +0.007789f, -0.000815f, -0.003137f, +0.010259f, -0.004778f, +0.005377f, + -0.004280f, +0.002671f, -0.005074f, +0.004917f, +0.000965f, -0.003239f, +0.008560f, -0.003549f, -0.003283f, -0.000268f, + +0.002520f, -0.002115f, -0.001544f, -0.000937f, +0.000046f, +0.004737f, -0.001539f, -0.001208f, -0.000367f, +0.000559f, + -0.001212f, +0.002076f, +0.001163f, +0.002738f, -0.000377f, +0.000614f, +0.001453f, +0.000580f, +0.002400f, +0.001608f, + -0.000499f, +0.000970f, -0.000495f, -0.001077f, -0.000167f, +0.000166f, -0.001921f, -0.000795f, -0.000956f, -0.000185f, + -0.001632f, +0.001166f, +0.001251f, +0.000326f, -0.000756f, +0.000980f, +0.001455f, +0.000061f, +0.000590f, -0.000064f, + +0.000430f, +0.000552f, -0.000648f, -0.000138f, +0.000220f, +0.000153f, +0.001070f, -0.000324f, -0.000628f, +0.000404f, + -0.000506f, -0.000210f, -0.000230f, +0.000366f, +0.000278f, +0.000227f + }, + { + +0.000621f, -0.000172f, -0.004786f, +0.002951f, +0.000395f, +0.000196f, +0.000830f, -0.001361f, -0.004258f, +0.001710f, + +0.004622f, +0.002844f, -0.002580f, +0.003486f, +0.012435f, +0.004563f, -0.005977f, +0.013441f, -0.000276f, -0.010524f, + +0.003676f, -0.000690f, -0.009554f, +0.018404f, +0.001997f, +0.003168f, +0.002133f, -0.000305f, -0.008321f, +0.003104f, + -0.001299f, -0.003573f, -0.006273f, -0.007405f, +0.003015f, -0.001174f, +0.005278f, -0.002519f, +0.000065f, -0.000647f, + +0.004090f, +0.000446f, +0.000121f, -0.002017f, -0.000600f, +0.000760f, -0.001490f, +0.004099f, -0.000037f, +0.001178f, + -0.000303f, -0.001016f, -0.001312f, +0.000426f, +0.000952f, -0.002222f, -0.002784f, -0.000428f, -0.000335f, -0.000671f, + -0.001903f, +0.001414f, -0.000267f, -0.001008f, -0.000304f, +0.000539f, +0.000065f, +0.001859f, -0.001212f, +0.000414f, + +0.000349f, -0.001052f, +0.000397f, +0.001453f, +0.000024f, -0.000740f, +0.000984f, -0.000941f, -0.000160f, -0.001357f, + +0.000619f, +0.000472f, -0.000444f, +0.000377f, -0.000015f, -0.000033f, +0.000593f, +0.000019f, -0.000234f, +0.000343f, + -0.000410f, +0.000109f, -0.000204f, +0.000026f, -0.000517f, -0.000016f + }, + { + -0.066580f, -0.300457f, +0.001690f, +0.007060f, -0.001986f, +0.005321f, +0.001947f, +0.002285f, +0.011548f, +0.007030f, + +0.003256f, -0.013605f, -0.003264f, -0.009484f, -0.005878f, -0.004745f, +0.004313f, -0.004818f, +0.005086f, +0.001375f, + +0.008880f, +0.001053f, +0.000904f, -0.000193f, -0.005950f, +0.000272f, +0.003870f, +0.006451f, +0.009004f, +0.005433f, + +0.006254f, -0.001369f, +0.000407f, +0.000583f, -0.003200f, -0.000528f, +0.002516f, -0.000087f, +0.004782f, -0.004824f, + -0.003444f, -0.002860f, +0.003453f, +0.003545f, -0.007093f, +0.001046f, -0.003948f, -0.000721f, +0.001409f, +0.001086f, + +0.003062f, +0.000359f, +0.002065f, -0.002858f, -0.000702f, +0.000245f, +0.001505f, +0.000336f, +0.000194f, +0.000587f, + +0.001462f, +0.000946f, -0.000296f, +0.000180f, +0.000881f, -0.000495f, -0.000852f, +0.000282f, -0.001333f, +0.000119f, + -0.000106f, +0.000227f, -0.000656f, -0.000201f, +0.000362f, -0.000228f, -0.000590f, -0.000171f, +0.000491f, -0.000299f, + -0.000644f, +0.000153f, +0.000310f, -0.000732f, +0.000910f, +0.000298f, -0.000086f, +0.000217f, -0.000684f, -0.000167f, + +0.000252f, -0.000068f, -0.000254f, -0.000002f, -0.000080f, -0.000008f + }, + { + +0.002161f, +0.014557f, +0.010708f, +0.000681f, -0.000324f, +0.000018f, -0.001518f, -0.000132f, +0.004294f, -0.001328f, + +0.000499f, +0.000284f, +0.004710f, -0.004760f, +0.030721f, -0.005807f, -0.000630f, +0.003491f, +0.008171f, -0.018776f, + +0.002669f, -0.008728f, -0.001575f, +0.001959f, +0.020795f, +0.000726f, -0.012878f, +0.006831f, -0.010415f, +0.003386f, + -0.003334f, +0.002689f, -0.011133f, +0.002693f, -0.003083f, -0.005940f, -0.004343f, -0.004955f, -0.005360f, +0.003465f, + +0.001980f, -0.002079f, +0.002618f, -0.001998f, -0.004853f, -0.003542f, +0.001737f, +0.000119f, -0.001459f, -0.002234f, + +0.000872f, -0.001449f, +0.000431f, -0.000080f, -0.001703f, -0.001159f, +0.000896f, -0.001549f, +0.001067f, -0.001843f, + +0.000478f, -0.000599f, -0.001619f, +0.000215f, +0.000614f, +0.000917f, -0.001438f, +0.001090f, +0.001220f, +0.000235f, + -0.001063f, -0.000651f, +0.001516f, +0.000216f, -0.000554f, -0.000210f, -0.000320f, +0.000194f, -0.000492f, +0.000072f, + -0.000313f, +0.000059f, -0.000326f, +0.000240f, +0.000336f, -0.000239f, +0.000035f, -0.000446f, -0.000171f, -0.000264f, + +0.000037f, +0.000232f, +0.000794f, +0.000145f, +0.000155f, -0.000326f + }, + { + +0.083885f, -0.219985f, -0.035348f, -0.001634f, +0.004458f, -0.002859f, +0.003017f, +0.001221f, +0.005935f, +0.000917f, + +0.005036f, -0.000411f, +0.009879f, -0.014479f, -0.012412f, -0.000308f, -0.007511f, +0.011228f, +0.004497f, -0.007401f, + -0.001663f, -0.001031f, +0.004060f, -0.004895f, +0.003709f, +0.006245f, -0.006576f, +0.004075f, -0.005246f, +0.001612f, + +0.007862f, -0.004903f, +0.002560f, +0.000933f, -0.001258f, +0.000034f, +0.002199f, +0.003708f, +0.002955f, -0.003414f, + -0.000088f, +0.004567f, -0.005100f, -0.006603f, -0.000498f, -0.001244f, +0.001543f, +0.001395f, -0.002395f, +0.000156f, + +0.000186f, -0.000315f, -0.000317f, -0.003666f, -0.003534f, +0.000060f, +0.000426f, -0.000074f, -0.000975f, +0.000573f, + -0.000358f, +0.000864f, -0.000675f, -0.001903f, -0.001299f, -0.000541f, -0.000592f, +0.001016f, +0.001100f, +0.000860f, + +0.000529f, +0.001053f, -0.000611f, +0.000233f, -0.000674f, -0.001028f, -0.000589f, +0.000436f, -0.000513f, +0.000987f, + +0.000131f, -0.000522f, -0.000357f, +0.000016f, -0.000095f, +0.000749f, -0.000426f, +0.000077f, -0.000222f, -0.000200f, + +0.000403f, +0.000333f, +0.000784f, +0.000387f, -0.000054f, +0.000244f + }, + { + +0.002911f, +0.033235f, -0.004451f, -0.002579f, +0.001804f, -0.000751f, +0.005824f, -0.004148f, -0.005834f, -0.002904f, + -0.008011f, -0.001280f, -0.010182f, +0.007886f, -0.022773f, -0.008731f, +0.013142f, -0.006012f, +0.019284f, -0.004688f, + -0.001802f, -0.000500f, +0.000504f, +0.015916f, -0.009692f, +0.000350f, +0.006125f, -0.006257f, -0.000425f, -0.004377f, + +0.004560f, +0.005131f, +0.003604f, -0.004267f, +0.001331f, -0.003227f, +0.000701f, -0.007225f, -0.008647f, +0.001201f, + -0.004308f, -0.003122f, -0.001676f, +0.001183f, +0.001801f, -0.004401f, +0.004024f, +0.001649f, +0.001249f, -0.001262f, + +0.001270f, -0.002723f, -0.000338f, -0.000109f, -0.000533f, -0.000522f, +0.000206f, +0.001181f, +0.000634f, -0.002933f, + -0.000460f, -0.001452f, +0.001048f, +0.000084f, +0.000462f, +0.000775f, +0.000907f, -0.000410f, +0.001334f, -0.001842f, + -0.000057f, -0.000083f, +0.001046f, +0.000632f, +0.000816f, +0.000460f, +0.000339f, +0.000149f, +0.000183f, +0.000153f, + -0.000717f, +0.000596f, -0.000463f, +0.000750f, -0.000730f, +0.000369f, -0.000664f, +0.000255f, +0.000095f, -0.000302f, + +0.000367f, -0.000096f, -0.000204f, -0.000233f, -0.000308f, -0.000183f + }, + { + +0.011319f, -0.272942f, +0.000407f, -0.014047f, -0.000156f, +0.019496f, +0.002251f, -0.012001f, +0.005360f, -0.010485f, + +0.000250f, -0.001875f, -0.004595f, +0.002618f, -0.008107f, +0.009262f, -0.010517f, +0.015485f, +0.006606f, -0.001461f, + +0.001621f, -0.003512f, +0.002448f, -0.006837f, -0.000423f, +0.007476f, +0.004851f, +0.000188f, -0.002516f, -0.000899f, + -0.001819f, -0.000348f, -0.000641f, +0.003999f, -0.002043f, -0.002069f, -0.001854f, +0.007616f, +0.000467f, -0.000490f, + +0.002021f, +0.001613f, +0.000713f, -0.001819f, +0.003211f, +0.000233f, -0.000033f, -0.001381f, -0.002429f, -0.001913f, + -0.002183f, -0.001448f, -0.001996f, +0.002146f, -0.001720f, -0.001733f, +0.001037f, -0.002481f, -0.002119f, +0.000167f, + +0.000541f, +0.000028f, -0.000931f, +0.000186f, -0.000374f, -0.000065f, -0.000541f, +0.000328f, -0.001026f, -0.000386f, + +0.000617f, +0.000601f, -0.001031f, -0.000346f, -0.000102f, +0.000071f, -0.000024f, +0.001105f, +0.000211f, -0.000131f, + +0.000248f, -0.000070f, +0.000012f, +0.000560f, -0.000238f, +0.000144f, -0.000232f, +0.000198f, +0.000351f, +0.000329f, + -0.000087f, -0.000164f, +0.000041f, +0.000050f, +0.000071f, -0.000141f + }, + { + +0.001622f, +0.043357f, -0.002970f, -0.004250f, -0.003476f, +0.000966f, +0.002883f, -0.000199f, +0.005107f, -0.000276f, + -0.003185f, -0.007842f, +0.019077f, -0.011394f, +0.016174f, -0.005691f, +0.003760f, -0.012605f, +0.001842f, -0.010287f, + +0.007327f, -0.015573f, +0.001249f, +0.001508f, +0.002413f, +0.000128f, +0.000257f, +0.000922f, +0.005009f, -0.013919f, + +0.006038f, +0.002351f, -0.005904f, +0.001632f, -0.002498f, -0.004672f, -0.000625f, -0.001111f, +0.001567f, -0.003329f, + +0.003200f, +0.003053f, +0.001819f, +0.001281f, +0.001382f, -0.001131f, -0.000958f, -0.001056f, -0.001545f, +0.000863f, + -0.000007f, -0.000681f, -0.003438f, -0.000735f, +0.003239f, +0.001065f, +0.002002f, -0.000513f, +0.000369f, -0.000625f, + +0.002340f, +0.000597f, +0.000427f, +0.000261f, +0.000186f, -0.001558f, -0.000018f, +0.000676f, +0.000104f, +0.000325f, + +0.000737f, +0.000122f, -0.000973f, +0.000099f, +0.000387f, +0.000555f, +0.000591f, -0.000004f, +0.000402f, +0.000207f, + +0.000262f, -0.000133f, +0.000137f, +0.000045f, -0.000483f, -0.000643f, +0.000407f, -0.000414f, -0.000924f, -0.000237f, + +0.000320f, -0.000228f, -0.000342f, +0.000169f, -0.000180f, +0.000118f + }, + { + +0.023947f, +0.192144f, -0.027057f, -0.010272f, +0.000053f, -0.017815f, -0.029821f, +0.008266f, +0.006571f, -0.003494f, + +0.006914f, -0.007100f, +0.001855f, +0.039285f, -0.015245f, +0.010676f, +0.014902f, +0.008054f, +0.001943f, -0.007484f, + -0.006289f, -0.000759f, -0.001526f, -0.014278f, -0.003958f, -0.003645f, +0.002288f, +0.006218f, -0.004378f, -0.008817f, + -0.005156f, +0.004714f, +0.003551f, +0.004784f, +0.001980f, -0.005350f, -0.003878f, +0.001803f, -0.002163f, -0.006991f, + +0.004486f, +0.001909f, +0.003033f, -0.001929f, -0.002959f, +0.003221f, -0.004127f, +0.001630f, +0.002954f, +0.003886f, + -0.003315f, -0.000830f, -0.000193f, +0.001842f, -0.000536f, +0.002826f, -0.001296f, +0.000512f, +0.000854f, -0.001595f, + +0.001394f, -0.000069f, -0.001731f, -0.000454f, -0.000210f, +0.001460f, -0.000283f, -0.001268f, -0.001103f, -0.000626f, + +0.000669f, +0.001943f, -0.000391f, +0.000488f, +0.000017f, -0.000657f, +0.000269f, -0.001183f, +0.000590f, +0.000009f, + +0.000210f, -0.000371f, -0.000703f, +0.000201f, -0.000450f, +0.000393f, +0.000153f, +0.000463f, -0.000285f, -0.000212f, + +0.000168f, +0.000004f, +0.000443f, -0.000142f, -0.000371f, -0.000187f + }, + { + +0.001595f, -0.001882f, +0.007246f, +0.006047f, -0.008012f, -0.001609f, -0.005746f, -0.003286f, +0.001676f, -0.001107f, + -0.008498f, -0.006443f, -0.010292f, -0.055410f, +0.088452f, -0.025624f, -0.002024f, +0.009976f, -0.011637f, +0.012484f, + -0.004004f, +0.002532f, -0.000532f, +0.005076f, -0.015939f, +0.003973f, -0.001012f, -0.000325f, -0.005450f, +0.001408f, + +0.003342f, -0.006757f, +0.000243f, -0.000318f, -0.001210f, +0.003830f, +0.009966f, +0.002206f, -0.005277f, -0.001356f, + -0.001481f, -0.002022f, -0.001080f, +0.002368f, -0.000215f, +0.003855f, +0.000977f, -0.002382f, +0.001775f, +0.002412f, + +0.002277f, -0.001846f, -0.001115f, +0.001238f, +0.002610f, +0.002615f, +0.001004f, +0.000874f, -0.001649f, +0.001343f, + -0.000392f, -0.000172f, +0.002153f, -0.001337f, -0.000030f, +0.000101f, +0.000707f, -0.000622f, -0.000307f, +0.000643f, + +0.000252f, -0.001000f, +0.000409f, -0.001127f, +0.000077f, -0.000060f, -0.000519f, +0.000881f, +0.000461f, -0.000050f, + +0.000267f, +0.000011f, -0.000237f, +0.000084f, -0.000426f, +0.000483f, +0.000106f, +0.000101f, -0.000254f, -0.000134f, + +0.000031f, +0.000026f, +0.000319f, +0.000143f, +0.000006f, -0.000050f + }, + { + -0.003144f, +0.139956f, -0.004022f, +0.007111f, -0.008603f, -0.007066f, +0.005477f, +0.000748f, -0.000848f, -0.006959f, + +0.004853f, -0.009670f, +0.007022f, -0.037868f, -0.046899f, -0.006608f, +0.006364f, +0.004429f, -0.001989f, -0.003700f, + -0.002147f, +0.003261f, -0.004237f, +0.006028f, -0.001642f, -0.002506f, -0.005548f, -0.005922f, -0.000141f, -0.000112f, + -0.002297f, -0.003988f, -0.008825f, -0.002272f, +0.003240f, +0.006387f, +0.003411f, +0.002094f, -0.000508f, -0.005684f, + +0.002584f, -0.000425f, -0.004711f, +0.000025f, +0.002774f, +0.008215f, -0.003264f, -0.004066f, -0.001923f, -0.000642f, + -0.002781f, +0.001283f, -0.002473f, -0.001029f, -0.000763f, +0.001419f, +0.000377f, -0.000988f, -0.001882f, +0.001711f, + -0.000679f, -0.000428f, +0.001905f, +0.001641f, +0.001626f, +0.001108f, -0.000534f, -0.000205f, -0.000240f, -0.000475f, + +0.000366f, +0.000512f, -0.000521f, -0.000093f, -0.000893f, -0.000692f, +0.000062f, -0.000080f, +0.000827f, -0.000171f, + -0.000155f, -0.001002f, -0.000211f, -0.000416f, -0.000050f, -0.000301f, +0.000437f, -0.000214f, -0.000191f, -0.000079f, + -0.000297f, -0.000423f, +0.000280f, +0.000136f, +0.000444f, -0.000138f + } + }, + { + { + +0.000123f, +0.142952f, +0.026987f, -0.008724f, -0.005549f, +0.002947f, -0.004739f, -0.003582f, -0.007232f, -0.000290f, + +0.000197f, -0.012098f, +0.008867f, +0.002246f, -0.012814f, -0.006526f, -0.002110f, +0.009250f, +0.000040f, -0.017142f, + +0.009997f, -0.001492f, +0.012120f, +0.002629f, +0.002239f, +0.015006f, +0.005111f, +0.004275f, +0.001975f, +0.015864f, + -0.004432f, +0.012370f, -0.002482f, -0.004447f, -0.013023f, -0.005417f, -0.001181f, -0.002326f, +0.004059f, +0.001141f, + +0.000418f, -0.001515f, +0.003651f, +0.001326f, +0.000079f, -0.002058f, +0.000841f, -0.000350f, +0.002207f, -0.005442f, + -0.000650f, +0.000670f, -0.001718f, -0.001684f, -0.001413f, +0.001343f, -0.001959f, -0.001053f, -0.001690f, -0.000030f, + -0.000145f, +0.000569f, +0.000014f, +0.000148f, -0.000458f, +0.001002f, -0.000477f, +0.002702f, -0.000382f, +0.001005f, + +0.000445f, +0.000362f, -0.000621f, +0.000868f, +0.000689f, -0.000140f, +0.001035f, -0.000154f, -0.000574f, -0.000080f, + +0.000522f, +0.000081f, -0.000107f, +0.000263f, +0.000051f, +0.000269f, -0.000213f, -0.000427f, +0.000024f, +0.000753f, + -0.000285f, +0.000438f, -0.000423f, -0.000263f, -0.000094f, +0.000183f + }, + { + -0.016247f, +0.419941f, +0.050334f, -0.015271f, +0.000093f, -0.000938f, -0.004700f, +0.001626f, -0.011155f, +0.002542f, + -0.003192f, -0.008462f, -0.008931f, +0.012403f, -0.005799f, -0.016270f, -0.000700f, -0.003231f, +0.023931f, +0.008740f, + -0.004152f, -0.001551f, -0.009669f, -0.000052f, -0.004729f, +0.004728f, -0.002916f, -0.001404f, +0.001829f, -0.003800f, + +0.003263f, +0.002001f, +0.004536f, -0.003908f, +0.005147f, -0.001101f, +0.009157f, -0.002361f, +0.002592f, +0.002794f, + -0.005125f, -0.004370f, +0.006552f, +0.005554f, -0.002488f, +0.001990f, -0.000366f, +0.005938f, +0.003005f, -0.003137f, + -0.001681f, +0.002070f, -0.002796f, +0.000365f, -0.000555f, +0.002488f, -0.002276f, -0.004422f, +0.000069f, -0.000734f, + +0.002109f, +0.000126f, +0.001852f, -0.001700f, -0.001330f, -0.000670f, +0.000073f, +0.000954f, -0.002038f, +0.001776f, + +0.000646f, -0.001051f, +0.000150f, -0.000152f, +0.000567f, +0.000371f, -0.000598f, +0.000982f, -0.000574f, +0.000530f, + -0.000732f, -0.000311f, -0.000082f, +0.000323f, -0.000494f, +0.000466f, -0.000509f, -0.000009f, +0.000372f, -0.000074f, + +0.000635f, +0.000269f, -0.000332f, -0.000640f, -0.000178f, +0.000221f + }, + { + +0.001022f, -0.319421f, -0.033222f, +0.018208f, +0.005700f, +0.008929f, -0.000630f, +0.001225f, -0.002704f, -0.001917f, + -0.008722f, -0.005792f, +0.000613f, +0.003334f, +0.001974f, -0.003870f, -0.002259f, +0.006924f, -0.015819f, +0.002629f, + -0.017983f, -0.005750f, +0.008875f, -0.005852f, +0.006332f, -0.010650f, +0.002497f, -0.010074f, +0.001805f, +0.000221f, + +0.006379f, -0.012180f, -0.008531f, +0.001622f, -0.008308f, -0.000387f, +0.003327f, -0.005454f, -0.003710f, -0.001746f, + -0.002822f, -0.004991f, -0.000286f, +0.001468f, +0.003754f, +0.000229f, -0.000342f, -0.001663f, +0.001454f, +0.002255f, + +0.001641f, +0.000432f, +0.000793f, -0.004818f, +0.003460f, +0.000698f, -0.001097f, +0.002835f, -0.000356f, -0.000803f, + +0.001107f, +0.000459f, -0.000994f, +0.000743f, +0.000515f, +0.000314f, -0.000739f, +0.000816f, -0.000218f, -0.000077f, + +0.001334f, +0.001295f, +0.000136f, -0.000616f, +0.000439f, +0.000760f, +0.000238f, +0.000198f, +0.000084f, -0.000357f, + -0.000276f, -0.000262f, -0.000029f, +0.000205f, +0.000426f, +0.000008f, +0.000200f, -0.000340f, +0.000313f, -0.000354f, + -0.000638f, +0.000095f, -0.000135f, -0.000217f, -0.000251f, -0.000297f + }, + { + -0.002306f, +0.060494f, +0.000488f, -0.000709f, +0.001396f, +0.000242f, -0.000473f, -0.001273f, -0.000801f, -0.001493f, + +0.004118f, +0.002480f, -0.000543f, -0.003596f, +0.010904f, -0.007774f, -0.011542f, -0.005520f, -0.015523f, +0.002551f, + +0.000623f, -0.005934f, -0.002943f, -0.002254f, +0.004602f, +0.003911f, -0.003264f, +0.004901f, -0.005196f, -0.000634f, + -0.007123f, -0.008488f, -0.000444f, -0.005485f, +0.002485f, +0.000473f, +0.001506f, -0.001863f, -0.002816f, +0.003323f, + +0.000628f, +0.000500f, -0.005392f, +0.000381f, -0.000779f, +0.000413f, +0.000647f, +0.000944f, -0.002780f, +0.000780f, + +0.002962f, -0.002549f, -0.000068f, +0.000942f, -0.000991f, +0.002294f, -0.001634f, -0.001285f, -0.001235f, -0.000449f, + -0.001376f, -0.000853f, +0.000031f, +0.000569f, -0.000721f, -0.000919f, -0.000030f, -0.000248f, +0.000667f, -0.000456f, + +0.001008f, +0.000206f, -0.000956f, +0.000103f, +0.000413f, -0.000177f, +0.000702f, -0.000409f, -0.000167f, -0.000165f, + -0.000204f, +0.000715f, +0.000141f, -0.000119f, +0.000302f, +0.000205f, +0.000313f, +0.000030f, +0.000044f, +0.000232f, + +0.000211f, -0.000068f, -0.000105f, +0.000003f, -0.000353f, -0.000030f + }, + { + +0.009364f, -0.361754f, +0.011426f, -0.019713f, -0.001227f, -0.001155f, -0.000824f, -0.001387f, +0.000305f, +0.009368f, + -0.015138f, +0.009953f, +0.001059f, +0.002343f, +0.008462f, -0.003551f, +0.004815f, -0.036192f, +0.007442f, -0.002992f, + -0.000330f, -0.007804f, +0.000929f, -0.003057f, +0.005476f, +0.002245f, -0.003613f, -0.002501f, -0.011855f, +0.007432f, + -0.008717f, +0.002431f, -0.004484f, +0.004123f, +0.002673f, -0.005496f, +0.015365f, +0.002690f, -0.003311f, -0.000383f, + +0.000799f, -0.004879f, -0.000991f, +0.002638f, -0.000169f, +0.000787f, -0.002613f, +0.001375f, +0.000269f, -0.001404f, + -0.003742f, +0.000636f, +0.000548f, +0.001336f, +0.000438f, +0.000378f, +0.000637f, -0.001900f, -0.000170f, +0.001460f, + -0.001106f, +0.000516f, +0.000648f, -0.000677f, -0.000936f, +0.001365f, -0.000788f, +0.000540f, +0.000463f, +0.000708f, + -0.000566f, +0.000367f, +0.000127f, +0.000017f, -0.000373f, -0.000063f, +0.000318f, +0.000623f, +0.000793f, -0.000132f, + +0.000387f, +0.000184f, -0.000554f, -0.000153f, -0.000185f, -0.000174f, +0.000363f, -0.000538f, -0.000240f, +0.000186f, + -0.000783f, +0.000111f, -0.000037f, +0.000297f, +0.000186f, +0.000203f + }, + { + -0.000699f, +0.001617f, -0.002950f, +0.002968f, +0.000081f, -0.000148f, +0.000106f, -0.003292f, -0.006146f, -0.000966f, + -0.000261f, +0.000020f, -0.011763f, -0.007155f, +0.002060f, -0.000005f, -0.003977f, +0.008145f, -0.012466f, -0.004054f, + +0.024767f, +0.001725f, -0.006057f, +0.024870f, +0.003701f, -0.000548f, +0.003065f, +0.006467f, -0.012194f, +0.002092f, + +0.008365f, +0.001644f, -0.002620f, -0.003790f, +0.006790f, -0.001724f, +0.003177f, -0.004405f, +0.001899f, +0.003329f, + +0.004378f, -0.000831f, -0.000698f, -0.004394f, -0.004116f, -0.000945f, -0.003104f, +0.003222f, -0.000034f, -0.001209f, + -0.001599f, +0.000811f, -0.001350f, -0.001337f, +0.001719f, -0.001001f, -0.000287f, +0.000968f, +0.002010f, +0.001325f, + -0.002343f, +0.000043f, -0.001825f, -0.000957f, +0.000193f, +0.000531f, -0.001375f, +0.001065f, -0.000219f, -0.000205f, + +0.000055f, -0.000227f, +0.000464f, +0.001181f, -0.000172f, -0.000678f, +0.000479f, -0.001137f, +0.000217f, -0.001017f, + -0.000085f, +0.000353f, -0.000255f, +0.000476f, -0.000108f, -0.000581f, +0.000008f, -0.000094f, -0.000656f, +0.000035f, + -0.000251f, -0.000005f, -0.000522f, -0.000096f, -0.000648f, +0.000033f + }, + { + +0.098114f, -0.114412f, -0.027310f, +0.014385f, -0.005241f, +0.000071f, -0.000452f, -0.000001f, +0.001655f, -0.000990f, + +0.003801f, -0.004639f, +0.006556f, -0.000967f, -0.004397f, -0.001533f, +0.001164f, -0.005134f, +0.006894f, +0.000585f, + +0.007743f, -0.001225f, +0.001743f, +0.003040f, +0.002835f, +0.002243f, -0.001199f, +0.000172f, -0.003608f, -0.003458f, + +0.004418f, +0.002230f, +0.002188f, -0.002938f, -0.003439f, -0.000474f, +0.002890f, -0.003913f, +0.001708f, -0.001382f, + -0.000706f, -0.002862f, +0.001629f, +0.005216f, -0.002334f, +0.001967f, -0.000209f, -0.001805f, -0.002241f, -0.000907f, + -0.001432f, -0.003982f, -0.001290f, -0.003400f, +0.000556f, -0.001443f, -0.000651f, -0.000545f, -0.000535f, +0.001059f, + +0.002120f, -0.000288f, -0.000920f, +0.000066f, +0.000164f, -0.001252f, -0.000539f, +0.001533f, -0.000663f, +0.000343f, + -0.000245f, -0.000505f, -0.000829f, +0.000083f, +0.000547f, +0.000476f, +0.000199f, +0.000498f, +0.000374f, -0.000519f, + -0.000680f, -0.000586f, +0.000045f, -0.000646f, +0.000370f, -0.000422f, -0.000116f, +0.000540f, -0.000853f, -0.000536f, + -0.000011f, +0.000169f, -0.000294f, -0.000086f, -0.000146f, -0.000185f + }, + { + -0.000928f, -0.019440f, -0.010863f, -0.002719f, -0.000540f, -0.000191f, -0.000899f, +0.000009f, +0.002275f, -0.000693f, + +0.004231f, +0.006087f, +0.009571f, +0.002759f, +0.034449f, +0.009372f, +0.022566f, -0.004130f, +0.004692f, -0.016477f, + -0.006358f, -0.019801f, -0.011608f, -0.024437f, +0.009797f, +0.004474f, -0.007287f, +0.010368f, -0.011167f, +0.001381f, + -0.005181f, +0.005189f, -0.008330f, +0.002363f, -0.001139f, -0.000491f, +0.001306f, -0.002100f, -0.005958f, +0.001371f, + -0.000367f, +0.000148f, +0.003572f, -0.001904f, -0.001950f, +0.000024f, +0.002486f, +0.002747f, +0.001145f, -0.002506f, + +0.000032f, -0.003468f, -0.000697f, +0.001506f, -0.000519f, -0.000335f, +0.001228f, -0.001863f, +0.000709f, -0.001933f, + +0.003525f, +0.002065f, -0.000113f, +0.000366f, +0.000670f, +0.000041f, -0.002070f, +0.001648f, +0.000622f, -0.000029f, + +0.000370f, -0.000703f, +0.000064f, -0.000366f, -0.000468f, +0.000146f, +0.000228f, +0.000124f, +0.000382f, +0.000913f, + +0.000121f, +0.000748f, -0.000585f, -0.000500f, +0.000594f, -0.000338f, -0.000213f, +0.000648f, +0.000303f, -0.000377f, + +0.000233f, +0.000006f, +0.000539f, +0.000014f, +0.000192f, -0.000093f + }, + { + -0.067216f, -0.353023f, +0.032833f, +0.008466f, +0.006282f, -0.004780f, +0.001871f, +0.000938f, +0.000210f, -0.002899f, + +0.002878f, -0.001344f, +0.011291f, -0.007321f, -0.004555f, +0.001106f, +0.000065f, +0.015910f, -0.001014f, -0.011321f, + +0.000241f, +0.001951f, +0.003215f, -0.009752f, -0.001107f, +0.005516f, -0.006572f, +0.003581f, -0.005606f, +0.001828f, + +0.005766f, -0.007631f, +0.000489f, -0.002626f, -0.004059f, +0.001637f, +0.001296f, -0.002102f, +0.003484f, +0.000628f, + -0.007044f, +0.003507f, +0.000427f, -0.003287f, +0.003240f, -0.000653f, -0.001052f, +0.002847f, -0.002321f, -0.003301f, + -0.001072f, -0.000086f, +0.000981f, +0.001444f, -0.001379f, +0.000248f, +0.000088f, +0.000141f, +0.001273f, +0.001909f, + +0.000703f, +0.001776f, +0.000357f, -0.000000f, +0.000979f, +0.001206f, -0.000603f, +0.000342f, -0.000158f, -0.001018f, + -0.000030f, +0.001169f, -0.000499f, +0.000628f, -0.000012f, -0.000280f, -0.000825f, -0.000073f, -0.001147f, +0.000688f, + +0.000228f, -0.000247f, -0.000331f, +0.000128f, -0.000108f, +0.000691f, -0.000304f, +0.000415f, +0.000112f, -0.000095f, + +0.000516f, -0.000035f, +0.000055f, -0.000091f, -0.000173f, +0.000114f + }, + { + -0.002552f, +0.062496f, +0.015504f, -0.004599f, +0.001462f, +0.000603f, +0.008615f, +0.001405f, -0.001425f, +0.002508f, + -0.004484f, +0.002709f, -0.012803f, +0.002778f, -0.027767f, -0.007299f, +0.017157f, -0.017077f, +0.006777f, -0.009455f, + +0.002569f, -0.000259f, -0.009217f, +0.013887f, -0.001997f, -0.001082f, -0.002789f, +0.000578f, +0.005177f, +0.005553f, + +0.007570f, -0.005271f, -0.000364f, -0.003854f, +0.001178f, -0.002562f, +0.005822f, +0.000541f, -0.001618f, +0.003864f, + +0.000982f, +0.001115f, -0.002085f, -0.001450f, +0.002230f, -0.001203f, +0.001736f, +0.001448f, +0.001538f, -0.001979f, + +0.002808f, -0.003296f, +0.000586f, +0.002055f, +0.000507f, -0.001464f, +0.001548f, +0.000961f, +0.000222f, -0.000775f, + +0.001947f, -0.001289f, +0.000498f, -0.000938f, +0.000151f, +0.000089f, +0.000276f, -0.001273f, +0.000619f, -0.000790f, + +0.000743f, -0.000409f, +0.000134f, +0.000217f, +0.000061f, -0.000176f, +0.000024f, +0.000275f, +0.000210f, +0.000340f, + -0.000136f, +0.000741f, -0.000477f, +0.000363f, -0.000738f, +0.000563f, -0.000773f, +0.000072f, +0.000213f, -0.000193f, + +0.000430f, -0.000171f, +0.000013f, +0.000149f, -0.000184f, -0.000075f + }, + { + -0.011564f, -0.282379f, +0.015674f, -0.017090f, -0.005489f, -0.001808f, -0.024378f, -0.013157f, +0.008955f, -0.005776f, + +0.002190f, -0.003575f, -0.002300f, +0.008156f, -0.007567f, +0.003678f, -0.002392f, +0.023745f, +0.007071f, +0.000099f, + +0.009653f, -0.002714f, +0.001493f, -0.003621f, -0.002485f, -0.003160f, -0.000335f, -0.001164f, +0.000773f, +0.005926f, + +0.000766f, -0.002041f, -0.005685f, +0.001108f, -0.000360f, +0.002243f, -0.000184f, +0.007784f, +0.005853f, +0.004604f, + +0.005029f, +0.003221f, +0.000426f, +0.000301f, +0.001396f, -0.002268f, +0.001198f, +0.000478f, -0.001118f, +0.000181f, + +0.001140f, +0.000391f, -0.000278f, +0.002611f, +0.000523f, -0.000207f, +0.001755f, -0.001366f, -0.000222f, +0.000174f, + -0.000900f, -0.000498f, -0.000794f, +0.000205f, -0.000254f, -0.000090f, -0.000545f, +0.000457f, -0.001796f, -0.000307f, + +0.000309f, -0.000210f, -0.000896f, -0.000232f, +0.000034f, +0.000305f, -0.000100f, +0.000347f, +0.000006f, +0.000190f, + +0.000001f, -0.000063f, -0.000511f, -0.000429f, +0.000223f, +0.000530f, -0.000038f, +0.000383f, +0.000125f, -0.000003f, + -0.000238f, +0.000086f, +0.000692f, +0.000148f, -0.000023f, -0.000081f + }, + { + -0.000435f, +0.037225f, -0.007835f, -0.008322f, -0.004280f, +0.003940f, +0.002490f, -0.001974f, +0.001904f, -0.001453f, + +0.001259f, -0.006546f, -0.004100f, -0.051732f, +0.000459f, -0.004570f, +0.011976f, -0.002376f, +0.001497f, -0.007015f, + +0.007466f, -0.023083f, -0.002438f, -0.006123f, +0.017464f, +0.013780f, +0.000563f, -0.000218f, +0.010169f, -0.007364f, + +0.004893f, -0.001766f, +0.002018f, +0.006877f, +0.006811f, +0.006263f, +0.005463f, -0.001656f, +0.000775f, -0.001155f, + +0.002799f, +0.000104f, -0.002239f, -0.002122f, +0.001906f, +0.001457f, -0.000610f, -0.000075f, -0.000647f, -0.000119f, + +0.001281f, +0.001831f, -0.000689f, -0.000581f, +0.001719f, -0.001889f, -0.000705f, -0.002582f, -0.000197f, +0.001095f, + +0.002939f, +0.000256f, -0.000497f, -0.000231f, +0.001071f, -0.000779f, +0.000215f, +0.000167f, +0.000266f, +0.000533f, + +0.000906f, +0.000563f, -0.000699f, +0.000904f, +0.000811f, -0.000054f, +0.000173f, +0.000238f, +0.000444f, +0.000218f, + +0.000320f, -0.000343f, -0.000354f, -0.000136f, +0.000096f, -0.000064f, +0.000247f, -0.000389f, -0.000451f, +0.000020f, + +0.000271f, -0.000065f, -0.000172f, +0.000325f, -0.000014f, +0.000250f + }, + { + -0.040843f, +0.092334f, -0.018926f, +0.013172f, +0.006240f, +0.011029f, -0.009845f, +0.004877f, +0.004370f, -0.008758f, + -0.001742f, -0.016356f, -0.014593f, +0.024970f, -0.018757f, -0.008193f, +0.002713f, +0.013116f, +0.007796f, -0.000430f, + -0.002486f, -0.000581f, +0.006351f, -0.001840f, +0.006256f, -0.001484f, -0.000331f, -0.000025f, -0.000169f, +0.002694f, + +0.003946f, +0.003991f, -0.002391f, +0.000200f, -0.005841f, -0.004775f, -0.001785f, -0.000369f, -0.001205f, -0.006215f, + +0.000608f, +0.000999f, +0.007103f, -0.000709f, -0.002498f, +0.005167f, -0.003645f, +0.000349f, -0.000879f, +0.004367f, + +0.000628f, +0.002027f, +0.000372f, -0.002074f, -0.003279f, +0.000657f, +0.000014f, +0.002451f, -0.001405f, -0.003676f, + +0.001135f, -0.000384f, -0.000461f, +0.000308f, -0.000234f, +0.002183f, +0.000316f, -0.001129f, -0.000683f, +0.000047f, + +0.000051f, +0.001142f, -0.000250f, -0.000036f, -0.000311f, -0.000302f, +0.000325f, -0.000982f, -0.000114f, -0.000255f, + +0.001127f, -0.000081f, -0.001077f, +0.000171f, +0.000104f, +0.000426f, -0.000279f, +0.000293f, -0.000468f, +0.000073f, + +0.000542f, -0.000041f, +0.000064f, -0.000211f, -0.000096f, +0.000010f + }, + { + -0.001225f, -0.000043f, +0.010986f, +0.005578f, -0.004547f, +0.003995f, -0.004301f, -0.005573f, +0.000850f, +0.001809f, + -0.005234f, -0.002978f, -0.017517f, +0.006827f, +0.183056f, -0.016162f, -0.000092f, +0.017951f, +0.000513f, +0.007562f, + -0.000538f, +0.000357f, -0.000086f, +0.012937f, -0.010330f, +0.004360f, -0.003487f, -0.005610f, +0.003772f, +0.007976f, + +0.003005f, -0.005217f, -0.000395f, -0.000523f, +0.000740f, +0.001953f, +0.002931f, -0.002255f, -0.005108f, -0.001441f, + -0.005039f, +0.000718f, -0.000284f, +0.004498f, +0.000087f, +0.000957f, -0.003898f, -0.003307f, +0.000864f, +0.002010f, + +0.000986f, -0.001598f, +0.001963f, +0.002128f, +0.000710f, +0.000677f, +0.000987f, +0.001292f, -0.001893f, +0.001892f, + -0.001625f, -0.001772f, +0.001640f, -0.001813f, -0.001278f, -0.000637f, -0.000389f, -0.000875f, -0.000425f, +0.001149f, + +0.000932f, -0.000362f, +0.001071f, -0.000993f, -0.000612f, -0.000505f, -0.000124f, +0.000366f, +0.000824f, +0.000068f, + +0.000315f, +0.000835f, -0.000116f, +0.000080f, +0.000116f, +0.000064f, -0.000597f, -0.000138f, -0.000072f, -0.000398f, + -0.000239f, +0.000013f, +0.000458f, -0.000077f, +0.000058f, +0.000056f + }, + { + -0.020146f, +0.131110f, +0.002686f, +0.007301f, -0.008243f, -0.009391f, +0.004518f, -0.003537f, -0.004342f, -0.005797f, + +0.001873f, -0.014729f, +0.009485f, +0.024816f, +0.033745f, +0.003773f, +0.014147f, +0.001394f, +0.002329f, +0.003140f, + +0.006401f, +0.005336f, -0.005198f, +0.002864f, -0.002465f, -0.003468f, -0.012539f, -0.001589f, +0.002177f, -0.004453f, + -0.000433f, +0.002185f, -0.000235f, +0.002219f, +0.001641f, +0.000094f, -0.003317f, +0.001025f, +0.000413f, -0.003131f, + +0.004959f, +0.003193f, -0.001252f, +0.001737f, +0.002860f, +0.004393f, -0.005339f, -0.002798f, -0.000240f, +0.001051f, + -0.003313f, +0.000272f, -0.000008f, +0.001500f, +0.000197f, +0.003103f, +0.002549f, +0.000810f, -0.001747f, +0.000940f, + -0.000310f, -0.000877f, +0.001382f, +0.002436f, +0.001401f, -0.000171f, -0.000384f, +0.001840f, +0.000865f, -0.000660f, + +0.000649f, -0.000394f, -0.000854f, +0.000979f, +0.000055f, +0.000727f, +0.000544f, +0.000283f, +0.001030f, +0.000102f, + -0.000194f, -0.000466f, +0.000451f, -0.000466f, +0.000150f, -0.000018f, +0.000734f, -0.000249f, +0.000226f, -0.000032f, + -0.000323f, -0.000336f, +0.000167f, -0.000199f, +0.000328f, -0.000507f + } + }, + { + { + +0.001585f, +0.124613f, +0.026275f, -0.007861f, +0.001809f, +0.000322f, -0.006680f, -0.002755f, -0.005568f, +0.004644f, + -0.007797f, -0.010054f, +0.005780f, -0.004817f, +0.004759f, -0.009021f, -0.003546f, +0.011993f, -0.006929f, -0.013649f, + +0.013878f, +0.005450f, +0.001756f, +0.003188f, +0.010945f, +0.005974f, +0.016716f, +0.003267f, +0.000388f, +0.008841f, + -0.002999f, +0.015662f, -0.006920f, -0.004696f, -0.009301f, -0.007243f, +0.000673f, -0.008511f, +0.004599f, +0.002256f, + -0.001961f, +0.002294f, +0.000409f, +0.004161f, -0.002338f, -0.002709f, -0.001630f, +0.002636f, -0.002330f, -0.003533f, + -0.000299f, +0.000288f, -0.001496f, +0.000377f, -0.001040f, -0.000538f, -0.002032f, -0.001795f, +0.001325f, -0.001341f, + -0.000619f, +0.000510f, +0.000726f, +0.000403f, +0.000139f, -0.000670f, +0.000750f, +0.000986f, +0.000153f, +0.000693f, + +0.001022f, +0.000257f, -0.000588f, +0.000298f, +0.000941f, -0.000610f, +0.001337f, -0.000049f, -0.000618f, -0.000013f, + +0.000198f, -0.000206f, +0.000721f, -0.000018f, +0.000445f, +0.000025f, -0.000207f, -0.000413f, +0.000164f, +0.000325f, + +0.000586f, -0.000171f, -0.000199f, -0.000294f, -0.000057f, -0.000223f + }, + { + +0.018453f, +0.413372f, +0.000494f, -0.006272f, -0.000116f, -0.002677f, -0.002479f, -0.003819f, -0.007959f, -0.000016f, + +0.007110f, -0.010563f, -0.008829f, +0.003808f, +0.001648f, -0.024649f, -0.004925f, +0.013308f, +0.016816f, -0.000230f, + +0.001610f, -0.012877f, -0.004807f, +0.001273f, +0.001326f, -0.003501f, -0.003963f, +0.001997f, +0.000479f, -0.000005f, + -0.001245f, +0.006968f, +0.001680f, -0.001131f, +0.000163f, +0.003891f, +0.002713f, +0.001024f, +0.001049f, -0.000507f, + -0.003708f, -0.001205f, +0.006845f, +0.001518f, +0.000704f, +0.001153f, +0.001317f, +0.004311f, +0.001733f, -0.000385f, + -0.000759f, -0.000167f, -0.001332f, -0.000329f, +0.000651f, +0.001055f, -0.001589f, -0.001415f, -0.001677f, +0.000345f, + +0.000093f, +0.001040f, +0.000703f, -0.000571f, -0.001452f, -0.000921f, -0.001224f, +0.001092f, -0.000865f, +0.000894f, + +0.000396f, -0.000306f, -0.001045f, +0.000456f, -0.000011f, +0.000069f, +0.000798f, -0.000371f, +0.000193f, -0.000319f, + -0.000428f, -0.000067f, -0.000375f, +0.000517f, -0.000126f, -0.000112f, +0.000099f, -0.000028f, +0.000229f, +0.000033f, + +0.000386f, +0.000282f, -0.000333f, -0.000612f, +0.000033f, +0.000105f + }, + { + +0.000360f, -0.320014f, -0.020574f, -0.006910f, +0.018747f, +0.004227f, +0.000810f, -0.002389f, -0.001501f, -0.004291f, + -0.004735f, -0.001579f, -0.006409f, -0.008846f, -0.000145f, +0.011769f, -0.013403f, +0.010348f, -0.002887f, -0.002547f, + -0.018448f, -0.008650f, -0.002399f, +0.002255f, -0.000496f, +0.000687f, -0.002958f, -0.003894f, -0.006107f, +0.000199f, + +0.003516f, -0.007985f, -0.004835f, -0.005755f, -0.009034f, +0.004356f, +0.001364f, -0.009189f, +0.000285f, -0.001961f, + -0.003442f, -0.003624f, -0.003869f, +0.005416f, +0.003678f, +0.002731f, -0.005796f, -0.000246f, -0.000035f, +0.004788f, + +0.001926f, +0.001169f, -0.000588f, -0.004338f, +0.000125f, +0.002819f, +0.000981f, +0.001299f, +0.001512f, -0.002499f, + +0.000189f, +0.002011f, +0.000338f, -0.000139f, -0.000260f, +0.000599f, +0.000174f, -0.000579f, -0.000124f, +0.000272f, + +0.001738f, +0.001609f, -0.000210f, +0.000053f, +0.001174f, +0.000394f, +0.000276f, +0.000213f, -0.000576f, -0.000234f, + -0.000161f, -0.000295f, +0.000164f, +0.000093f, -0.000083f, +0.000633f, +0.000093f, -0.000545f, +0.000075f, -0.000526f, + -0.000247f, +0.000089f, -0.000104f, -0.000339f, -0.000101f, -0.000126f + }, + { + +0.001878f, +0.050123f, +0.003940f, +0.000507f, +0.000097f, +0.000240f, -0.000247f, -0.001058f, -0.002302f, +0.000302f, + +0.002096f, +0.005077f, -0.004628f, -0.010621f, +0.009649f, -0.006318f, -0.003684f, +0.006797f, -0.025118f, -0.006476f, + +0.003945f, -0.001149f, -0.005935f, -0.000758f, -0.007380f, +0.003198f, -0.004272f, +0.010702f, -0.005817f, -0.001788f, + -0.004961f, -0.004009f, -0.008561f, +0.001296f, -0.003705f, -0.000118f, -0.000880f, -0.000180f, -0.000404f, +0.002548f, + -0.000522f, -0.000268f, -0.002926f, -0.002611f, +0.000007f, +0.001814f, +0.001223f, -0.001937f, -0.000949f, +0.001593f, + +0.000620f, +0.000869f, +0.000614f, -0.000510f, +0.000740f, -0.000509f, -0.000096f, +0.000094f, -0.002891f, -0.000737f, + -0.000455f, -0.001736f, +0.001299f, -0.000527f, -0.000782f, -0.000309f, -0.000023f, +0.000702f, -0.000622f, +0.001106f, + -0.000023f, +0.000113f, -0.001493f, +0.001072f, -0.000036f, +0.000106f, +0.000362f, +0.000151f, -0.000106f, +0.000462f, + -0.000573f, +0.000247f, -0.000064f, +0.000214f, +0.000420f, +0.000128f, +0.000060f, +0.000252f, +0.000291f, -0.000064f, + +0.000331f, -0.000168f, +0.000220f, +0.000074f, -0.000299f, +0.000175f + }, + { + -0.034534f, -0.345404f, +0.041495f, -0.034385f, +0.007162f, +0.001211f, -0.004747f, +0.005884f, -0.007028f, +0.000634f, + +0.007409f, -0.005378f, +0.003556f, -0.000485f, -0.000065f, +0.002055f, +0.006743f, -0.042359f, +0.022384f, -0.010686f, + -0.009894f, +0.004625f, -0.009787f, -0.004937f, +0.004526f, +0.003002f, +0.001157f, -0.011610f, -0.008145f, +0.005877f, + -0.007060f, +0.004862f, -0.001123f, -0.001343f, +0.000121f, -0.004773f, +0.008966f, +0.006820f, -0.002811f, +0.000623f, + -0.002987f, -0.001665f, +0.000668f, +0.001044f, -0.000808f, +0.000001f, -0.000419f, +0.000590f, +0.001407f, -0.004115f, + -0.004107f, +0.001217f, +0.001107f, -0.001270f, +0.002271f, +0.000159f, +0.001130f, -0.002102f, -0.001334f, +0.000219f, + -0.000492f, +0.000613f, +0.000569f, -0.000739f, -0.000795f, +0.000737f, -0.000055f, +0.000233f, +0.001045f, +0.000512f, + -0.000186f, -0.000823f, +0.000326f, -0.000358f, -0.000136f, -0.000287f, -0.000174f, +0.001086f, +0.000837f, -0.000107f, + +0.000391f, -0.000505f, +0.000308f, -0.000252f, -0.000096f, -0.000109f, -0.000100f, -0.000296f, -0.000292f, -0.000083f, + -0.000651f, +0.000229f, -0.000195f, +0.000263f, -0.000012f, +0.000128f + }, + { + +0.000000f, +0.008197f, -0.008120f, -0.001549f, +0.001366f, +0.000154f, +0.000070f, -0.004014f, -0.001971f, -0.000849f, + -0.002699f, +0.000246f, -0.011109f, -0.014788f, +0.000041f, -0.000038f, +0.002712f, +0.002470f, +0.006631f, -0.011420f, + +0.005383f, +0.003971f, +0.010207f, +0.009961f, +0.004261f, +0.004840f, -0.012434f, +0.018723f, -0.010860f, +0.002709f, + +0.005339f, +0.003593f, -0.001089f, -0.007155f, +0.007461f, -0.000228f, +0.000190f, +0.001032f, +0.002869f, -0.000546f, + +0.004802f, +0.000375f, -0.001434f, -0.002939f, -0.004383f, -0.002145f, +0.000324f, -0.001082f, +0.000374f, -0.001972f, + -0.000805f, -0.000106f, +0.001633f, -0.002431f, +0.002144f, -0.001446f, +0.000264f, +0.000723f, +0.002054f, +0.000314f, + -0.001537f, +0.001170f, -0.003265f, -0.000668f, +0.000284f, +0.000298f, -0.000916f, -0.000074f, +0.000867f, -0.000766f, + -0.000099f, +0.000446f, +0.001016f, +0.000167f, +0.000330f, +0.000429f, -0.000753f, -0.000250f, -0.000514f, +0.000063f, + -0.000379f, -0.000313f, +0.000425f, +0.000311f, -0.000327f, -0.000139f, -0.000559f, -0.000361f, -0.000258f, +0.000016f, + -0.000215f, -0.000197f, -0.000351f, -0.000229f, -0.000104f, -0.000147f + }, + { + -0.105303f, +0.027846f, +0.057243f, +0.006262f, +0.010544f, -0.001158f, -0.000350f, +0.003125f, -0.003309f, -0.006996f, + +0.001317f, +0.007265f, +0.002759f, -0.000186f, -0.006237f, +0.007577f, -0.004828f, -0.001880f, +0.004956f, -0.000276f, + +0.002815f, +0.001618f, +0.001565f, +0.002370f, +0.004552f, -0.003314f, +0.000710f, -0.002685f, -0.002094f, -0.005054f, + +0.001917f, +0.009030f, -0.000678f, -0.004156f, -0.000330f, -0.000255f, -0.000904f, -0.002801f, -0.000479f, -0.000197f, + +0.000812f, -0.002468f, -0.000438f, +0.003277f, +0.001988f, -0.000424f, -0.000211f, -0.001856f, -0.005364f, +0.002383f, + -0.003379f, -0.003876f, -0.000620f, -0.003143f, +0.002335f, -0.003836f, -0.000530f, -0.000204f, +0.000395f, +0.000890f, + +0.001971f, -0.000924f, -0.000139f, +0.000206f, -0.000324f, -0.000845f, -0.000959f, +0.001340f, -0.000586f, +0.000527f, + -0.000314f, -0.001329f, -0.000369f, +0.000493f, +0.000384f, +0.000341f, +0.000470f, +0.000712f, +0.000173f, -0.000692f, + -0.000463f, +0.000241f, -0.000483f, -0.000134f, -0.000508f, -0.000022f, -0.000013f, +0.000063f, -0.000423f, -0.000490f, + -0.000097f, +0.000164f, +0.000001f, -0.000172f, -0.000227f, +0.000149f + }, + { + -0.001684f, -0.019988f, -0.011971f, +0.000615f, -0.000164f, +0.000260f, -0.000021f, +0.000784f, -0.000609f, +0.000754f, + +0.002955f, +0.005536f, +0.004423f, -0.002356f, +0.014700f, +0.021891f, +0.025866f, -0.000956f, -0.003925f, +0.000396f, + -0.027457f, -0.006200f, -0.012747f, -0.015178f, +0.008307f, -0.011430f, +0.002878f, +0.001906f, -0.004084f, -0.006918f, + -0.002477f, -0.001283f, +0.000025f, -0.005204f, +0.003666f, -0.003403f, +0.003656f, -0.004730f, -0.002734f, +0.000194f, + +0.000707f, +0.002027f, -0.002185f, +0.001446f, -0.003523f, +0.003893f, +0.001401f, +0.001882f, +0.001419f, -0.002813f, + +0.000744f, -0.002874f, -0.001468f, +0.003499f, -0.000670f, +0.001463f, -0.000519f, -0.001219f, +0.000628f, -0.001731f, + +0.003126f, +0.001190f, +0.002299f, -0.000603f, +0.000186f, -0.000290f, -0.000015f, -0.000110f, +0.000912f, -0.000827f, + +0.001598f, -0.000385f, -0.000922f, -0.000371f, -0.000123f, -0.000659f, +0.001546f, +0.000048f, +0.000585f, +0.000768f, + +0.000373f, +0.000146f, -0.000522f, -0.000189f, +0.000313f, -0.000313f, -0.000088f, +0.001131f, -0.000136f, -0.000158f, + +0.000245f, +0.000085f, +0.000134f, +0.000147f, +0.000206f, +0.000010f + }, + { + +0.037362f, -0.446193f, -0.000069f, +0.005772f, +0.006837f, -0.001605f, +0.001176f, +0.001393f, -0.001992f, -0.000797f, + +0.001284f, -0.001159f, +0.004544f, +0.001798f, -0.005634f, -0.001178f, +0.004214f, +0.004152f, -0.002473f, -0.001387f, + -0.000964f, -0.001090f, -0.001921f, -0.002264f, +0.000790f, +0.001145f, -0.000418f, -0.001188f, +0.001825f, -0.004724f, + +0.002978f, +0.003133f, -0.004425f, -0.003622f, -0.003476f, +0.001811f, -0.000499f, -0.000236f, -0.000999f, +0.002963f, + -0.006172f, +0.001327f, +0.000696f, +0.001785f, +0.001579f, +0.000251f, -0.001695f, +0.002017f, -0.002323f, -0.001294f, + -0.002582f, +0.001322f, -0.000784f, +0.001837f, -0.000822f, +0.000602f, -0.000608f, +0.000344f, +0.000979f, +0.001715f, + +0.001181f, +0.001267f, -0.000440f, +0.001454f, +0.000144f, +0.001316f, +0.000212f, -0.000621f, -0.000011f, -0.001049f, + +0.000250f, +0.000049f, +0.000277f, +0.000293f, +0.000665f, -0.000738f, -0.000809f, -0.000256f, +0.000056f, -0.000307f, + +0.000333f, +0.000037f, -0.000143f, -0.000251f, -0.000175f, -0.000046f, +0.000130f, +0.000222f, +0.000419f, +0.000098f, + +0.000077f, +0.000106f, -0.000102f, -0.000097f, -0.000170f, -0.000158f + }, + { + +0.002073f, +0.070053f, -0.006156f, +0.005188f, +0.001481f, +0.005032f, +0.002152f, +0.000982f, +0.002127f, +0.006668f, + -0.000064f, -0.006588f, -0.000508f, -0.001302f, -0.024037f, -0.000352f, -0.002386f, -0.006957f, -0.009327f, -0.001157f, + +0.006471f, -0.000888f, -0.005910f, +0.010379f, +0.003144f, +0.002468f, -0.009371f, +0.004058f, +0.002162f, +0.009981f, + +0.000344f, -0.001281f, -0.002033f, +0.003911f, -0.003614f, -0.002106f, +0.009625f, -0.000580f, +0.001538f, +0.002360f, + +0.002844f, -0.000724f, -0.001811f, -0.002349f, +0.001785f, +0.004172f, +0.000362f, -0.000557f, +0.002613f, -0.001891f, + +0.001851f, -0.001466f, +0.001206f, +0.000677f, +0.000983f, -0.000849f, +0.001080f, +0.000029f, +0.000381f, +0.000075f, + +0.000451f, -0.000769f, +0.000965f, -0.001191f, -0.000909f, +0.000067f, +0.000293f, -0.000546f, +0.000082f, +0.000094f, + +0.000813f, -0.000710f, -0.000734f, +0.000784f, -0.000629f, +0.000570f, -0.000084f, +0.000132f, -0.000463f, +0.000812f, + +0.000220f, -0.000222f, +0.000381f, -0.000432f, +0.000054f, +0.000125f, -0.000380f, -0.000098f, +0.000212f, +0.000410f, + +0.000048f, +0.000171f, -0.000061f, +0.000198f, -0.000054f, +0.000194f + }, + { + +0.008727f, -0.259163f, -0.009385f, -0.019733f, -0.005082f, -0.003087f, -0.030274f, -0.001495f, -0.005340f, -0.003801f, + +0.003382f, +0.003684f, -0.004031f, +0.004989f, +0.001294f, -0.008146f, +0.017995f, -0.000802f, +0.014220f, -0.000184f, + +0.006503f, +0.001752f, +0.002044f, +0.000399f, -0.004702f, -0.004640f, -0.003823f, -0.001651f, +0.005686f, +0.008210f, + -0.003137f, -0.007593f, -0.004054f, -0.000038f, +0.004736f, -0.000107f, +0.002366f, +0.008954f, +0.002094f, +0.005493f, + +0.005704f, +0.005711f, -0.000332f, +0.002810f, -0.001859f, -0.002687f, +0.000931f, +0.000706f, +0.001582f, +0.000533f, + +0.000609f, -0.000944f, +0.002799f, +0.000255f, +0.001780f, -0.001435f, +0.001381f, -0.000774f, +0.000697f, -0.000075f, + -0.001193f, -0.000114f, +0.000340f, -0.000448f, -0.000110f, -0.000018f, -0.000814f, -0.000059f, -0.001122f, +0.000006f, + -0.000209f, -0.000656f, -0.000661f, +0.000375f, +0.000632f, -0.000033f, +0.000287f, -0.000474f, +0.000251f, +0.000036f, + -0.000213f, +0.000240f, -0.000778f, -0.000463f, +0.000353f, +0.000253f, +0.000275f, +0.000277f, +0.000335f, -0.000104f, + -0.000320f, -0.000054f, +0.000589f, +0.000066f, +0.000112f, +0.000204f + }, + { + -0.000310f, +0.028686f, +0.004547f, -0.013839f, -0.002029f, +0.003528f, -0.003184f, +0.001273f, +0.000507f, -0.002958f, + +0.003691f, -0.005613f, -0.024181f, -0.021349f, -0.008865f, -0.000214f, +0.005556f, +0.006628f, -0.009236f, +0.003433f, + +0.008329f, -0.027913f, +0.005314f, -0.007737f, +0.014268f, +0.012012f, -0.005706f, +0.005402f, +0.005924f, -0.000985f, + +0.003571f, -0.006371f, +0.000987f, +0.010124f, +0.003411f, +0.007648f, +0.005612f, -0.001274f, +0.004437f, +0.001287f, + -0.004115f, -0.001266f, +0.000646f, -0.000496f, +0.002299f, +0.000742f, -0.001678f, -0.001198f, +0.000860f, +0.000793f, + +0.000944f, +0.000081f, +0.002379f, -0.000344f, +0.000163f, -0.002512f, -0.001867f, -0.001981f, -0.000668f, +0.001285f, + +0.003243f, +0.000006f, +0.000297f, -0.000983f, +0.000029f, -0.000372f, +0.000291f, +0.000338f, -0.000380f, +0.001187f, + +0.000562f, +0.000578f, -0.000339f, +0.000321f, +0.000649f, +0.000316f, +0.000586f, +0.000119f, +0.000149f, +0.000319f, + +0.000224f, -0.000200f, -0.000264f, -0.000439f, +0.000061f, -0.000059f, -0.000423f, -0.000383f, -0.000126f, +0.000172f, + +0.000023f, +0.000103f, +0.000092f, +0.000012f, +0.000116f, +0.000258f + }, + { + +0.036915f, -0.009512f, -0.011914f, -0.000598f, -0.001338f, +0.023592f, +0.002919f, -0.002080f, -0.002877f, -0.002008f, + -0.004334f, -0.014268f, +0.011602f, -0.020047f, -0.004280f, -0.003932f, -0.006926f, +0.007339f, +0.004902f, +0.010152f, + -0.006296f, -0.002438f, +0.005274f, +0.006774f, +0.002619f, +0.004614f, -0.004221f, -0.001367f, +0.002784f, -0.000453f, + +0.008845f, -0.000789f, -0.000902f, -0.003006f, -0.004353f, -0.001281f, -0.004259f, +0.002879f, -0.002435f, -0.002088f, + -0.003366f, -0.002173f, +0.006613f, +0.000243f, +0.001379f, -0.000093f, -0.000822f, -0.000606f, -0.000240f, -0.000090f, + +0.005268f, +0.001491f, -0.002569f, -0.000451f, -0.001818f, +0.002125f, -0.001891f, +0.001984f, -0.001110f, -0.001654f, + -0.000677f, -0.000707f, -0.001026f, +0.001411f, -0.000898f, +0.002288f, +0.001041f, -0.001556f, +0.000049f, -0.000018f, + -0.000395f, +0.000552f, -0.000144f, -0.000103f, -0.000690f, +0.000621f, -0.001306f, +0.000540f, -0.000317f, -0.000237f, + +0.000529f, -0.000071f, -0.000599f, -0.000283f, +0.000263f, +0.000096f, -0.000528f, +0.000134f, -0.000089f, +0.000012f, + +0.000493f, -0.000068f, -0.000081f, -0.000237f, +0.000268f, -0.000049f + }, + { + +0.000905f, -0.000615f, +0.005862f, +0.004756f, -0.000902f, +0.000541f, +0.000405f, -0.002385f, +0.001036f, -0.002245f, + -0.001879f, -0.001391f, -0.014876f, +0.064780f, +0.103135f, +0.004309f, +0.002724f, +0.004261f, +0.004838f, -0.005741f, + +0.014921f, -0.003559f, +0.002828f, +0.004613f, +0.000848f, -0.001254f, -0.001345f, -0.000790f, +0.000207f, +0.003629f, + +0.004797f, -0.000609f, -0.002553f, -0.003742f, -0.003361f, -0.000083f, +0.004484f, -0.002579f, -0.004364f, +0.000043f, + -0.008094f, +0.005933f, -0.001523f, +0.003005f, +0.000683f, +0.000634f, -0.005945f, -0.002695f, +0.001003f, +0.003317f, + +0.000691f, -0.001094f, +0.002337f, +0.001073f, +0.000263f, -0.000709f, +0.001992f, -0.000236f, -0.000790f, +0.001313f, + -0.001300f, -0.000706f, +0.001297f, -0.001944f, -0.001302f, +0.000307f, -0.002358f, -0.000098f, +0.000215f, +0.001129f, + +0.000505f, -0.000156f, +0.000281f, -0.000576f, -0.000620f, -0.000247f, -0.000021f, -0.000110f, +0.000102f, +0.000266f, + +0.000719f, +0.000948f, +0.000159f, -0.000015f, +0.000411f, -0.000503f, -0.000894f, -0.000229f, +0.000299f, -0.000359f, + -0.000103f, +0.000039f, +0.000335f, -0.000051f, +0.000180f, +0.000019f + }, + { + +0.031851f, +0.086029f, -0.014072f, -0.000616f, -0.004129f, +0.007288f, -0.011684f, -0.002239f, -0.005223f, -0.005655f, + +0.005794f, -0.004404f, -0.000507f, -0.014480f, +0.099322f, +0.008908f, +0.012540f, -0.009954f, +0.003554f, +0.004091f, + +0.006914f, +0.004891f, -0.004767f, -0.001981f, -0.001372f, -0.004658f, -0.008717f, +0.007932f, -0.005967f, -0.003418f, + -0.001384f, +0.001017f, +0.006346f, -0.000541f, -0.000653f, -0.001277f, -0.004635f, +0.002058f, +0.001850f, +0.000104f, + +0.000643f, +0.005064f, +0.001447f, +0.001707f, +0.002617f, +0.000042f, -0.004422f, +0.000139f, +0.000440f, -0.001472f, + -0.000902f, -0.001785f, +0.003300f, -0.000511f, +0.001353f, +0.003060f, +0.001039f, +0.002455f, -0.001848f, -0.001732f, + +0.001046f, +0.000209f, +0.000941f, +0.001039f, +0.001523f, -0.001206f, -0.000210f, +0.001466f, +0.000957f, -0.000279f, + +0.000107f, -0.000290f, -0.000533f, +0.001429f, -0.000259f, +0.000914f, +0.000131f, +0.000947f, +0.000121f, +0.000603f, + -0.000209f, -0.000282f, -0.000033f, +0.000130f, +0.000265f, +0.000059f, +0.000491f, -0.000155f, +0.000142f, -0.000279f, + -0.000028f, -0.000261f, +0.000030f, -0.000100f, +0.000048f, -0.000363f + } + }, + { + { + -0.000497f, +0.008506f, -0.070354f, -0.005849f, +0.004905f, -0.002152f, -0.003559f, +0.002629f, -0.000037f, +0.004739f, + -0.009322f, -0.002592f, -0.000705f, -0.019499f, +0.017505f, +0.010457f, +0.001361f, +0.000949f, -0.010488f, +0.000458f, + +0.023691f, +0.004460f, -0.002429f, -0.004555f, +0.000648f, -0.009852f, +0.004700f, +0.000599f, -0.006425f, +0.003421f, + -0.005021f, +0.006656f, -0.007520f, +0.006536f, +0.006496f, +0.002227f, +0.005345f, -0.009915f, +0.001635f, -0.000021f, + -0.004353f, +0.001035f, -0.001337f, +0.002119f, -0.002881f, -0.002455f, -0.003093f, +0.000745f, -0.001733f, -0.001135f, + -0.000313f, +0.000766f, +0.000635f, +0.001447f, -0.000324f, +0.000097f, -0.000682f, -0.000596f, +0.002706f, -0.000450f, + -0.001430f, -0.000104f, +0.000682f, -0.000392f, +0.000085f, -0.000258f, +0.000667f, +0.000849f, +0.000210f, -0.000607f, + +0.000055f, +0.000390f, +0.000022f, -0.000170f, +0.000178f, -0.000845f, +0.000740f, -0.000064f, -0.000080f, -0.000084f, + +0.000182f, -0.000198f, +0.000463f, -0.000183f, +0.000422f, -0.000042f, -0.000155f, -0.000200f, +0.000117f, -0.000331f, + +0.000477f, -0.000337f, +0.000170f, +0.000244f, +0.000153f, -0.000190f + }, + { + -0.012304f, +0.285445f, -0.062787f, -0.002972f, +0.002357f, -0.000109f, -0.002491f, +0.002002f, +0.001730f, +0.004030f, + +0.010219f, -0.006096f, -0.006342f, -0.004919f, +0.007119f, -0.003982f, +0.002355f, -0.008682f, -0.005155f, -0.004259f, + -0.003349f, -0.007253f, +0.001966f, +0.005197f, +0.000673f, -0.005704f, -0.000056f, +0.003486f, -0.000031f, -0.000635f, + -0.004704f, +0.003205f, -0.002288f, +0.001156f, +0.001183f, -0.000711f, +0.000355f, +0.002634f, +0.001564f, -0.000342f, + +0.001054f, +0.000664f, +0.002237f, -0.001909f, -0.002687f, -0.002427f, -0.001471f, +0.001343f, +0.001325f, +0.000153f, + +0.001446f, +0.001998f, -0.001357f, -0.000924f, -0.000176f, +0.000135f, +0.000299f, +0.000621f, +0.000362f, +0.000396f, + -0.001541f, +0.000008f, +0.000748f, +0.000067f, -0.001476f, -0.000771f, -0.001924f, +0.000712f, -0.000460f, +0.000113f, + -0.000155f, -0.000379f, -0.000414f, +0.000588f, -0.000591f, -0.000043f, +0.000390f, -0.001023f, +0.000546f, +0.000214f, + -0.000119f, +0.000105f, -0.000014f, +0.000616f, -0.000045f, -0.000099f, +0.000581f, -0.000208f, -0.000051f, -0.000264f, + +0.000016f, +0.000240f, +0.000017f, -0.000352f, +0.000177f, +0.000078f + }, + { + -0.002674f, -0.193308f, +0.070324f, -0.034935f, -0.013867f, -0.004919f, +0.002095f, -0.000422f, +0.001550f, -0.003769f, + +0.000246f, +0.000509f, -0.006882f, -0.002846f, -0.006680f, +0.010585f, -0.006864f, +0.005357f, -0.005246f, +0.001833f, + -0.009270f, -0.000576f, -0.000922f, +0.002951f, -0.001015f, +0.003716f, -0.001006f, +0.004499f, +0.001213f, -0.003333f, + -0.001852f, -0.005249f, -0.004020f, -0.005858f, -0.005817f, +0.001511f, -0.001107f, -0.000837f, +0.004032f, -0.000391f, + -0.000300f, -0.001394f, -0.001897f, +0.002845f, -0.001076f, +0.001494f, -0.004862f, +0.002031f, +0.001875f, +0.001857f, + -0.001973f, +0.000224f, -0.001162f, -0.002980f, +0.000411f, +0.001294f, +0.001043f, +0.001888f, +0.001828f, -0.001959f, + -0.000065f, +0.001014f, -0.000616f, -0.000935f, +0.000469f, +0.000121f, -0.000504f, -0.000604f, -0.000750f, +0.000102f, + +0.001414f, +0.000590f, -0.000183f, -0.000037f, +0.000431f, +0.000430f, +0.000179f, -0.000304f, -0.000225f, +0.000555f, + -0.000247f, -0.000321f, +0.000422f, -0.000143f, -0.000589f, +0.000338f, -0.000059f, -0.000340f, +0.000202f, -0.000604f, + -0.000071f, +0.000053f, -0.000079f, -0.000152f, +0.000227f, +0.000092f + }, + { + -0.000693f, +0.026931f, -0.009738f, +0.000242f, -0.001041f, -0.000556f, +0.000646f, +0.001140f, -0.001550f, +0.000316f, + +0.001285f, +0.004150f, -0.009373f, -0.007476f, +0.015473f, -0.005867f, -0.006160f, +0.008993f, -0.019000f, -0.003487f, + +0.000671f, +0.003487f, +0.000925f, +0.000903f, -0.003431f, +0.008462f, +0.003338f, +0.012668f, -0.004809f, +0.003088f, + -0.000915f, -0.001227f, -0.004965f, +0.005462f, -0.002141f, -0.000966f, -0.001289f, +0.001248f, -0.000325f, +0.001772f, + -0.001402f, -0.001638f, -0.000121f, +0.001210f, +0.001578f, +0.001403f, +0.001072f, +0.000291f, +0.000076f, -0.000571f, + -0.001408f, +0.001307f, +0.000319f, -0.001415f, +0.000081f, -0.001331f, +0.000820f, +0.001445f, -0.002036f, +0.000401f, + +0.000376f, -0.001131f, +0.000961f, -0.000743f, -0.000952f, +0.000362f, +0.000848f, +0.000683f, -0.001011f, +0.001314f, + -0.000420f, +0.000634f, -0.000212f, +0.000701f, -0.000539f, +0.000159f, +0.000418f, +0.000182f, -0.000274f, +0.000347f, + -0.000871f, +0.000108f, -0.000270f, +0.000083f, +0.000031f, -0.000194f, +0.000040f, -0.000068f, +0.000027f, -0.000365f, + +0.000140f, -0.000070f, +0.000136f, +0.000085f, -0.000067f, +0.000258f + }, + { + +0.050777f, -0.293171f, -0.004898f, -0.021263f, +0.005091f, -0.002158f, -0.008296f, +0.003316f, -0.006103f, +0.000455f, + +0.010101f, -0.006270f, +0.005463f, +0.003548f, -0.013792f, -0.011744f, +0.002578f, -0.048138f, +0.010897f, -0.009578f, + -0.005113f, +0.008546f, -0.008185f, -0.004139f, +0.001792f, -0.002615f, +0.001816f, -0.002391f, +0.000283f, +0.006269f, + -0.001436f, +0.003613f, -0.002098f, -0.002882f, -0.000045f, -0.000044f, -0.001734f, +0.000513f, -0.000199f, +0.001004f, + -0.000666f, -0.001829f, +0.000548f, -0.000389f, -0.002322f, -0.000218f, +0.001284f, +0.001204f, +0.000405f, -0.004213f, + -0.003498f, +0.000721f, -0.000024f, -0.002337f, +0.001930f, -0.000773f, -0.000403f, -0.001084f, +0.000044f, -0.000614f, + -0.000766f, +0.000496f, +0.000317f, -0.000282f, -0.000990f, +0.000266f, -0.000051f, -0.000502f, +0.000035f, -0.000704f, + -0.000391f, -0.001036f, +0.000029f, -0.000033f, +0.000008f, -0.000029f, -0.000174f, -0.000021f, +0.000449f, -0.000083f, + +0.000194f, -0.000314f, +0.000375f, -0.000433f, +0.000184f, +0.000274f, +0.000231f, -0.000028f, -0.000332f, -0.000109f, + -0.000380f, +0.000458f, -0.000125f, +0.000094f, -0.000061f, +0.000102f + }, + { + -0.000206f, +0.008921f, -0.009376f, -0.002893f, +0.000013f, +0.000398f, +0.001096f, -0.002217f, +0.002236f, +0.000202f, + -0.003868f, +0.000478f, -0.007984f, -0.001800f, +0.007780f, -0.005080f, -0.002236f, +0.002421f, -0.007369f, -0.029819f, + +0.004203f, +0.002817f, +0.002591f, +0.004733f, +0.001859f, +0.001540f, -0.003900f, +0.026780f, -0.002918f, +0.001280f, + -0.004385f, +0.003107f, -0.001014f, -0.008627f, +0.002969f, -0.004690f, -0.001629f, +0.001264f, +0.002956f, -0.001837f, + +0.001354f, -0.001168f, +0.001275f, -0.000542f, -0.001726f, -0.000089f, +0.000540f, -0.002697f, +0.002005f, +0.001510f, + +0.001184f, -0.000414f, +0.001349f, -0.002211f, +0.000851f, -0.001889f, +0.000198f, -0.000539f, +0.000235f, -0.000852f, + -0.001437f, +0.001768f, -0.001958f, -0.000228f, +0.000657f, +0.000260f, -0.000980f, -0.000069f, +0.001023f, -0.000787f, + -0.000081f, +0.000155f, +0.000434f, +0.000102f, +0.000845f, +0.000035f, -0.001292f, +0.000433f, -0.000457f, -0.000152f, + -0.000106f, -0.000470f, +0.000218f, -0.000116f, -0.000239f, +0.000362f, -0.000578f, -0.000242f, +0.000045f, +0.000075f, + -0.000063f, +0.000124f, -0.000040f, -0.000506f, -0.000073f, +0.000182f + }, + { + +0.091408f, +0.083147f, -0.102340f, -0.009627f, -0.000832f, -0.001898f, +0.000888f, +0.001581f, -0.000605f, -0.001698f, + -0.002375f, +0.001008f, -0.001159f, -0.000211f, -0.012122f, +0.009192f, +0.003769f, -0.002801f, +0.003941f, +0.000910f, + +0.000388f, -0.002928f, -0.005395f, +0.000865f, +0.002115f, -0.006678f, +0.004320f, +0.002843f, +0.003526f, -0.001889f, + -0.000276f, +0.004432f, -0.005827f, -0.004799f, +0.003414f, +0.001153f, +0.001298f, +0.001713f, +0.000126f, -0.000402f, + +0.001644f, -0.003222f, -0.002355f, +0.002343f, -0.000907f, -0.000194f, +0.001266f, -0.001036f, -0.004622f, +0.001736f, + -0.000571f, +0.000299f, +0.001902f, -0.002046f, +0.003158f, -0.004223f, -0.001554f, +0.001054f, +0.000362f, -0.000073f, + +0.001827f, -0.001214f, -0.000214f, +0.000384f, -0.000549f, -0.000440f, -0.001109f, +0.000400f, -0.001073f, -0.000171f, + +0.000063f, -0.000729f, -0.000363f, +0.000363f, +0.000291f, +0.000146f, +0.000501f, +0.000198f, -0.000100f, -0.000320f, + -0.000188f, +0.000750f, +0.000128f, +0.000297f, -0.000285f, +0.000527f, +0.000024f, -0.000165f, -0.000069f, -0.000173f, + +0.000170f, +0.000182f, +0.000218f, +0.000037f, +0.000038f, +0.000534f + }, + { + +0.001089f, +0.007004f, +0.000301f, -0.000225f, -0.000139f, +0.000104f, +0.000527f, +0.000329f, -0.001066f, -0.000853f, + -0.000483f, +0.003071f, +0.001619f, +0.003133f, -0.007072f, -0.021702f, +0.000944f, +0.002854f, -0.007618f, +0.012033f, + -0.000436f, +0.010088f, -0.003215f, -0.005903f, +0.006211f, -0.018874f, -0.003101f, +0.000513f, -0.006259f, -0.006732f, + +0.001448f, -0.003327f, +0.006082f, -0.000777f, +0.002229f, -0.006500f, +0.003546f, -0.000511f, +0.001428f, +0.001592f, + +0.000526f, +0.000416f, -0.003880f, +0.001366f, -0.003219f, +0.003585f, -0.000215f, -0.000832f, +0.002394f, -0.000475f, + +0.000534f, -0.000513f, -0.000346f, +0.002114f, -0.002087f, +0.000202f, -0.000440f, -0.000317f, +0.001355f, +0.000426f, + +0.002003f, -0.001048f, +0.000776f, -0.001661f, +0.000209f, +0.000419f, +0.000741f, -0.001196f, -0.000189f, -0.001571f, + +0.000792f, +0.000149f, -0.000148f, -0.000186f, -0.000035f, -0.000759f, +0.001185f, -0.000189f, +0.000611f, -0.000018f, + -0.000214f, +0.000323f, -0.000035f, +0.000456f, +0.000338f, -0.000446f, -0.000089f, +0.000489f, -0.000414f, +0.000139f, + -0.000051f, -0.000160f, -0.000115f, -0.000060f, +0.000144f, +0.000068f + }, + { + -0.005057f, -0.416340f, +0.073874f, +0.007108f, -0.003215f, -0.000068f, +0.003791f, +0.003687f, +0.000469f, +0.000338f, + +0.002446f, -0.000959f, +0.000296f, -0.000426f, -0.006306f, +0.002583f, -0.003219f, -0.007247f, -0.000458f, +0.005717f, + +0.000860f, -0.001517f, -0.000665f, +0.001072f, +0.004161f, +0.003441f, +0.002038f, -0.000793f, +0.002873f, -0.004158f, + +0.003754f, +0.003981f, -0.001653f, +0.000598f, -0.000842f, +0.000204f, -0.001757f, +0.001158f, -0.003425f, -0.002294f, + -0.010506f, -0.000571f, +0.002186f, +0.001878f, -0.000595f, +0.000638f, -0.001394f, +0.000533f, -0.002004f, -0.000177f, + -0.002807f, +0.000835f, +0.000065f, +0.002806f, -0.000340f, -0.000157f, -0.000889f, -0.000137f, -0.000578f, +0.000343f, + -0.000230f, -0.000234f, -0.000756f, +0.001027f, -0.000356f, +0.000730f, -0.000277f, -0.000619f, +0.000631f, -0.000616f, + +0.000042f, -0.000513f, +0.000064f, +0.000167f, +0.000666f, -0.000348f, +0.000514f, +0.000042f, +0.000430f, -0.000474f, + +0.000091f, -0.000250f, -0.000141f, -0.000116f, -0.000180f, -0.000294f, -0.000264f, -0.000261f, +0.000169f, -0.000195f, + -0.000194f, +0.000177f, -0.000085f, -0.000004f, -0.000240f, +0.000061f + }, + { + -0.001041f, +0.047189f, -0.025051f, +0.002951f, +0.003987f, -0.003295f, -0.009502f, +0.001360f, +0.000944f, +0.004018f, + +0.000797f, -0.001193f, +0.005176f, +0.001601f, -0.010705f, +0.012264f, -0.003548f, -0.006909f, -0.008197f, -0.007736f, + -0.000104f, +0.001593f, -0.009170f, +0.003021f, +0.004650f, +0.004457f, -0.008521f, +0.000486f, -0.001624f, +0.000572f, + -0.003675f, +0.005354f, +0.000278f, +0.003497f, -0.000710f, +0.001402f, +0.007021f, -0.003030f, +0.000386f, +0.000851f, + +0.002444f, -0.001415f, -0.000927f, -0.001344f, +0.000800f, +0.001818f, -0.001379f, -0.001930f, +0.000568f, -0.002459f, + +0.002143f, -0.000592f, +0.001587f, -0.000631f, -0.000081f, -0.000563f, +0.000001f, -0.000334f, +0.000847f, +0.000095f, + -0.000765f, -0.000675f, +0.001031f, -0.000041f, -0.000562f, -0.000506f, +0.000598f, -0.000412f, -0.000218f, -0.000249f, + +0.000573f, -0.000630f, -0.000699f, +0.000842f, -0.000408f, +0.000864f, -0.000320f, +0.000039f, -0.000346f, +0.000476f, + -0.000214f, -0.000037f, +0.000780f, -0.000494f, -0.000010f, +0.000145f, +0.000221f, +0.000315f, +0.000176f, +0.000408f, + -0.000217f, +0.000320f, +0.000183f, +0.000245f, -0.000024f, +0.000190f + }, + { + -0.005748f, -0.183614f, +0.075395f, -0.007765f, -0.003738f, +0.003002f, -0.021591f, +0.000363f, -0.004052f, +0.003246f, + -0.001389f, +0.000132f, -0.000979f, -0.001528f, +0.004301f, -0.003980f, +0.017602f, -0.007882f, +0.003674f, +0.000089f, + +0.007147f, +0.001613f, -0.000075f, +0.000751f, -0.000996f, -0.002368f, -0.002861f, -0.001734f, +0.004067f, +0.003987f, + -0.006072f, -0.001737f, +0.002358f, -0.001874f, +0.005168f, +0.001427f, +0.001532f, +0.000987f, -0.004435f, +0.003097f, + +0.000977f, +0.002152f, +0.000212f, +0.002961f, -0.001470f, -0.002015f, -0.000878f, +0.000285f, +0.001397f, +0.000087f, + +0.000939f, -0.000085f, +0.001912f, -0.001388f, +0.001342f, -0.001179f, +0.000220f, -0.001043f, +0.000433f, +0.000324f, + +0.001128f, +0.001193f, +0.001051f, +0.000155f, +0.000406f, +0.000366f, -0.000169f, +0.000230f, -0.000696f, +0.000069f, + +0.000062f, -0.000029f, -0.000044f, +0.000640f, +0.000420f, -0.000313f, -0.000289f, -0.000815f, +0.000152f, +0.000023f, + -0.000132f, +0.000103f, -0.000484f, +0.000191f, +0.000227f, -0.000046f, -0.000060f, -0.000255f, -0.000154f, -0.000114f, + -0.000128f, -0.000168f, +0.000162f, -0.000070f, +0.000100f, +0.000047f + }, + { + +0.000869f, +0.011068f, -0.005559f, -0.005058f, +0.003790f, +0.002200f, -0.003172f, +0.000880f, -0.000686f, -0.001781f, + +0.002675f, -0.000564f, +0.014339f, +0.021816f, -0.008799f, -0.007099f, -0.002463f, +0.009389f, -0.008409f, -0.004035f, + +0.012366f, -0.011886f, +0.001888f, -0.019257f, -0.003671f, +0.005871f, -0.012288f, +0.000664f, +0.005285f, +0.000973f, + +0.001540f, -0.005414f, -0.003010f, +0.003383f, -0.003141f, +0.001620f, +0.003625f, +0.000706f, +0.003361f, -0.000668f, + -0.005771f, -0.000405f, +0.003307f, -0.000016f, +0.001816f, +0.000717f, -0.000726f, +0.000013f, -0.001285f, -0.001966f, + -0.000823f, -0.001149f, +0.001636f, -0.000276f, +0.000505f, -0.001250f, -0.000169f, -0.000866f, -0.000546f, +0.000235f, + +0.001503f, -0.001047f, +0.000898f, -0.001503f, +0.000090f, +0.000409f, -0.000345f, -0.000281f, -0.001282f, +0.000811f, + +0.000034f, -0.000333f, -0.000089f, +0.000576f, +0.000107f, -0.000021f, +0.000117f, -0.000446f, -0.000034f, -0.000047f, + -0.000187f, -0.000199f, +0.000260f, +0.000020f, +0.000146f, -0.000308f, -0.000506f, -0.000029f, +0.000135f, +0.000004f, + -0.000162f, +0.000170f, +0.000069f, -0.000141f, +0.000109f, +0.000118f + }, + { + -0.019635f, -0.071124f, -0.005288f, -0.011708f, -0.013112f, +0.001754f, -0.004902f, -0.000330f, -0.000252f, -0.000316f, + +0.002692f, -0.010256f, -0.003904f, -0.032996f, +0.002662f, +0.003434f, -0.003026f, -0.000305f, +0.000478f, +0.008564f, + -0.007764f, -0.002626f, +0.002005f, +0.001929f, -0.004424f, +0.002323f, -0.005011f, -0.000901f, +0.000161f, -0.005038f, + +0.003502f, -0.008032f, -0.001860f, +0.001458f, -0.000668f, +0.002977f, -0.002082f, +0.002533f, -0.000818f, +0.002122f, + +0.000808f, -0.003227f, +0.003381f, +0.000869f, +0.003756f, -0.001140f, -0.002482f, -0.001142f, +0.001146f, -0.001530f, + +0.003960f, -0.001565f, -0.003487f, +0.001832f, -0.000103f, +0.003932f, -0.001964f, -0.000048f, -0.002035f, -0.000046f, + +0.000730f, +0.000407f, -0.000539f, +0.001362f, -0.001838f, +0.000813f, -0.000227f, -0.001576f, +0.000515f, +0.000243f, + -0.000638f, +0.000017f, -0.000044f, +0.000446f, -0.000414f, +0.000370f, -0.001081f, +0.000639f, -0.000378f, +0.000024f, + -0.000169f, -0.000179f, +0.000246f, +0.000296f, +0.000092f, -0.000244f, -0.000559f, +0.000286f, +0.000102f, -0.000138f, + +0.000411f, +0.000027f, -0.000118f, -0.000539f, +0.000080f, -0.000176f + }, + { + -0.000161f, -0.004751f, +0.000202f, +0.001969f, -0.001547f, +0.001010f, +0.001853f, -0.000291f, +0.004215f, +0.000268f, + +0.004867f, +0.003486f, -0.007852f, -0.005197f, -0.034657f, -0.013499f, +0.009967f, -0.002274f, +0.002300f, -0.009461f, + +0.003682f, -0.009227f, +0.005628f, +0.000570f, -0.002812f, -0.002182f, -0.002260f, +0.000791f, -0.004767f, -0.003551f, + +0.000736f, +0.002417f, -0.001578f, -0.005701f, -0.000898f, +0.000673f, +0.001933f, -0.000563f, -0.001577f, +0.003277f, + -0.004198f, +0.003195f, -0.001799f, +0.003268f, -0.000664f, +0.000534f, -0.003883f, -0.001019f, +0.001174f, +0.000529f, + +0.000244f, -0.000880f, +0.002077f, +0.000058f, +0.000636f, -0.000814f, +0.000155f, -0.000953f, -0.000702f, +0.001236f, + -0.000532f, -0.000315f, +0.001105f, -0.001311f, -0.000400f, +0.000185f, -0.001210f, +0.001036f, -0.000322f, -0.000681f, + +0.000004f, +0.000645f, +0.000006f, -0.000628f, +0.000436f, +0.000780f, +0.000206f, +0.000175f, -0.000640f, -0.000343f, + +0.000402f, +0.000028f, -0.000105f, +0.000028f, +0.000372f, +0.000056f, -0.000519f, -0.000001f, +0.000297f, -0.000058f, + +0.000181f, -0.000256f, -0.000003f, +0.000102f, +0.000196f, -0.000030f + }, + { + -0.029582f, +0.022097f, -0.000396f, -0.000003f, +0.002748f, +0.004000f, -0.012684f, +0.005169f, -0.000327f, -0.004615f, + +0.003584f, -0.001628f, +0.000432f, -0.020033f, +0.081533f, -0.004452f, +0.005179f, -0.008153f, +0.002716f, +0.000528f, + +0.002006f, +0.002955f, -0.001444f, -0.002175f, +0.002233f, +0.002033f, -0.003070f, +0.007033f, -0.003321f, +0.001388f, + -0.001490f, +0.000685f, +0.004388f, +0.000606f, +0.001002f, -0.000211f, -0.000319f, +0.002337f, +0.002650f, +0.003347f, + +0.000019f, +0.001769f, -0.001969f, +0.001590f, +0.002396f, -0.000916f, -0.001949f, +0.001369f, -0.000018f, -0.001997f, + +0.000669f, -0.002745f, +0.000098f, -0.001608f, +0.000638f, +0.000236f, -0.000813f, +0.002517f, -0.000797f, -0.002279f, + +0.000575f, +0.000729f, +0.000586f, -0.000343f, +0.000159f, -0.000835f, -0.000023f, -0.000486f, +0.000391f, -0.000032f, + -0.000387f, +0.000496f, +0.000018f, +0.000836f, -0.000654f, +0.000000f, -0.000329f, +0.000894f, -0.000571f, +0.000125f, + +0.000347f, +0.000075f, -0.000297f, +0.000119f, +0.000022f, +0.000027f, +0.000225f, -0.000230f, -0.000225f, -0.000283f, + +0.000282f, -0.000067f, +0.000027f, -0.000044f, +0.000196f, -0.000117f + } + }, + { + { + -0.002652f, -0.065558f, -0.011734f, -0.000658f, -0.005829f, -0.001869f, -0.000182f, +0.000527f, +0.005120f, -0.001493f, + -0.004381f, -0.000265f, -0.005697f, -0.003855f, +0.011298f, -0.000088f, +0.009009f, -0.007838f, +0.005609f, +0.000506f, + +0.019178f, -0.003087f, -0.004488f, -0.006450f, +0.001739f, -0.006500f, -0.003696f, -0.000768f, +0.000126f, -0.001883f, + -0.002308f, -0.001684f, +0.001482f, +0.006031f, +0.008475f, +0.003184f, +0.002667f, -0.003985f, -0.002072f, -0.000751f, + -0.000338f, -0.001661f, -0.000943f, +0.001022f, -0.000992f, -0.003483f, -0.002002f, -0.000208f, -0.000152f, -0.001187f, + -0.000404f, +0.000649f, +0.001587f, +0.000186f, -0.000259f, +0.000301f, -0.000069f, +0.000491f, +0.001131f, -0.000753f, + +0.000069f, -0.001051f, -0.000006f, +0.000093f, -0.000248f, -0.000070f, +0.000260f, +0.001110f, +0.000165f, -0.000416f, + -0.000071f, -0.000114f, +0.000518f, -0.000123f, -0.000125f, -0.000244f, -0.000153f, +0.000331f, +0.000364f, -0.000099f, + -0.000060f, -0.000148f, +0.000186f, -0.000148f, -0.000003f, +0.000127f, -0.000176f, -0.000043f, -0.000154f, +0.000008f, + +0.000178f, -0.000119f, +0.000043f, +0.000237f, +0.000188f, +0.000047f + }, + { + +0.004757f, +0.191307f, -0.006897f, -0.004699f, +0.002865f, -0.000330f, +0.002268f, +0.001233f, +0.003877f, +0.001009f, + +0.005018f, -0.001494f, +0.000209f, -0.003782f, +0.004604f, +0.000872f, +0.000627f, -0.002820f, -0.016716f, -0.002985f, + -0.001948f, -0.002145f, +0.000143f, +0.003771f, +0.001486f, -0.002529f, +0.000407f, +0.002949f, -0.000599f, -0.003387f, + -0.001293f, -0.001192f, -0.001468f, +0.000835f, +0.004374f, -0.004066f, -0.000304f, +0.003286f, +0.002955f, +0.001185f, + +0.000751f, +0.002113f, -0.001487f, -0.001235f, -0.001358f, -0.001221f, -0.003465f, +0.000847f, +0.001390f, +0.000667f, + +0.000065f, +0.001790f, -0.001030f, -0.001349f, +0.001084f, -0.000408f, +0.000632f, -0.000386f, +0.000814f, -0.000448f, + -0.000906f, +0.000150f, +0.000357f, -0.000090f, -0.000867f, -0.000975f, -0.000521f, -0.000585f, +0.000010f, -0.000357f, + +0.000231f, -0.000368f, +0.000096f, +0.000232f, -0.000260f, -0.000594f, +0.000030f, -0.000245f, +0.000568f, +0.000113f, + +0.000026f, +0.000044f, +0.000090f, +0.000269f, -0.000087f, +0.000354f, +0.000309f, -0.000386f, -0.000023f, +0.000067f, + +0.000039f, +0.000105f, -0.000089f, -0.000117f, -0.000065f, +0.000062f + }, + { + +0.008422f, -0.030570f, -0.068697f, -0.041163f, -0.010868f, -0.000685f, +0.001510f, +0.000196f, -0.000042f, +0.002684f, + -0.003034f, -0.002699f, -0.003492f, -0.000466f, -0.005825f, +0.003426f, +0.004901f, -0.002338f, -0.002879f, +0.003041f, + -0.002681f, +0.000987f, -0.002465f, +0.002849f, -0.000790f, -0.002560f, +0.001009f, +0.004542f, +0.003464f, -0.002168f, + -0.001679f, -0.002400f, -0.004944f, -0.005254f, -0.003705f, -0.000546f, -0.001896f, +0.004213f, +0.000759f, -0.001178f, + +0.000420f, +0.000802f, -0.000490f, -0.000554f, -0.000520f, +0.000163f, -0.001093f, +0.000808f, +0.001600f, +0.000888f, + -0.001115f, -0.000519f, -0.001735f, +0.000052f, -0.000029f, +0.000584f, +0.000132f, +0.001243f, +0.001150f, -0.000087f, + -0.000470f, -0.001080f, -0.000756f, -0.000244f, +0.000166f, +0.000360f, -0.000769f, -0.000294f, -0.000475f, -0.000556f, + +0.000844f, +0.000059f, +0.000232f, +0.000013f, +0.000276f, +0.000235f, +0.000202f, -0.000331f, +0.000159f, +0.000254f, + -0.000012f, -0.000226f, +0.000051f, +0.000024f, -0.000147f, -0.000213f, -0.000027f, -0.000030f, -0.000051f, -0.000151f, + -0.000140f, -0.000080f, -0.000124f, -0.000054f, +0.000190f, -0.000039f + }, + { + -0.000662f, +0.009136f, +0.003753f, -0.001396f, -0.000478f, -0.000059f, +0.000959f, +0.001644f, -0.001979f, +0.001186f, + +0.002113f, -0.001691f, -0.001635f, -0.004419f, +0.007840f, -0.002912f, -0.003614f, +0.009410f, -0.015589f, -0.001528f, + -0.001215f, -0.000443f, +0.008436f, -0.001697f, +0.002733f, +0.004999f, +0.007290f, +0.004019f, +0.002174f, +0.000375f, + -0.000694f, -0.001013f, -0.001593f, +0.001974f, +0.001042f, -0.001019f, -0.001438f, +0.000832f, +0.000327f, +0.000001f, + -0.000786f, -0.002211f, +0.001528f, +0.000665f, +0.001332f, +0.002938f, +0.000009f, +0.000439f, +0.000025f, -0.000879f, + -0.000741f, -0.000114f, -0.000723f, -0.000386f, -0.000794f, -0.000297f, +0.000816f, +0.000583f, -0.000946f, +0.000293f, + +0.000619f, -0.000533f, -0.000290f, -0.000252f, -0.000480f, +0.000032f, +0.000379f, +0.000283f, +0.000058f, +0.000371f, + +0.000359f, +0.000107f, +0.000943f, -0.000397f, -0.000410f, +0.000221f, +0.000257f, -0.000033f, -0.000220f, -0.000235f, + +0.000012f, -0.000436f, -0.000108f, -0.000099f, -0.000207f, +0.000100f, +0.000086f, -0.000149f, -0.000171f, -0.000237f, + -0.000012f, -0.000014f, -0.000139f, +0.000050f, -0.000004f, +0.000036f + }, + { + -0.051672f, -0.141833f, -0.014933f, -0.013450f, -0.004972f, -0.001994f, -0.005677f, +0.001337f, -0.002480f, +0.001440f, + +0.000626f, +0.003761f, +0.000525f, -0.006116f, -0.012049f, +0.001575f, -0.005767f, -0.027712f, -0.010281f, -0.000224f, + -0.004332f, +0.002329f, -0.002453f, -0.001096f, +0.001373f, -0.002249f, -0.003921f, +0.004041f, +0.001187f, +0.002015f, + +0.004388f, -0.001018f, -0.000074f, -0.000483f, -0.000824f, +0.000080f, -0.003447f, +0.000968f, +0.001715f, -0.000068f, + +0.000484f, -0.000671f, +0.000105f, -0.002270f, -0.001274f, +0.000842f, +0.001235f, -0.000426f, -0.001654f, -0.002732f, + -0.001611f, -0.001363f, +0.000452f, -0.000560f, +0.000054f, -0.000089f, +0.000031f, +0.000466f, -0.001078f, +0.000166f, + -0.000029f, -0.000031f, -0.000177f, -0.000534f, -0.000436f, +0.000081f, -0.000200f, -0.000482f, -0.000211f, -0.000403f, + -0.000446f, -0.000636f, +0.000020f, +0.000075f, -0.000131f, -0.000140f, -0.000002f, -0.000156f, +0.000071f, +0.000040f, + +0.000093f, -0.000060f, +0.000081f, -0.000191f, +0.000207f, +0.000242f, +0.000173f, +0.000155f, -0.000152f, -0.000159f, + -0.000162f, +0.000272f, +0.000121f, +0.000098f, +0.000078f, -0.000092f + }, + { + +0.000492f, +0.004518f, -0.004111f, -0.004243f, -0.000521f, +0.000784f, -0.000164f, +0.000342f, +0.000422f, +0.000272f, + -0.002011f, -0.000638f, -0.003050f, +0.002389f, -0.000485f, -0.000421f, +0.000783f, +0.004959f, -0.001654f, -0.020362f, + -0.014174f, +0.003788f, +0.002919f, +0.001573f, +0.000394f, +0.000849f, +0.010592f, +0.006433f, +0.002710f, +0.001558f, + -0.004395f, -0.001673f, +0.000234f, -0.003328f, -0.003411f, -0.001192f, -0.003037f, -0.001164f, +0.001549f, +0.000067f, + +0.000998f, -0.002274f, +0.001961f, -0.000637f, -0.000191f, +0.000305f, -0.000848f, -0.001025f, +0.001161f, +0.002760f, + +0.001094f, -0.000799f, +0.000818f, -0.001057f, -0.000895f, +0.000152f, -0.001559f, +0.000093f, -0.000797f, -0.001461f, + +0.000442f, -0.000122f, -0.000412f, -0.000514f, +0.000892f, -0.000253f, -0.000294f, -0.000134f, +0.000704f, +0.000171f, + -0.000364f, +0.000023f, -0.000197f, +0.000259f, +0.000152f, -0.000256f, -0.000487f, -0.000087f, -0.000031f, -0.000637f, + +0.000035f, -0.000526f, +0.000218f, -0.000097f, -0.000113f, -0.000024f, -0.000091f, -0.000303f, +0.000072f, +0.000046f, + -0.000074f, +0.000180f, -0.000020f, -0.000424f, -0.000087f, +0.000131f + }, + { + -0.062941f, +0.101190f, +0.042811f, -0.011274f, +0.002850f, -0.000136f, +0.000800f, -0.000164f, -0.000747f, +0.002498f, + -0.002262f, +0.000867f, -0.002919f, -0.002162f, -0.006950f, +0.006362f, +0.002730f, -0.001379f, +0.001813f, +0.001787f, + -0.000024f, -0.001883f, -0.004854f, +0.001478f, -0.000914f, -0.002109f, +0.002082f, +0.001692f, +0.004613f, -0.000456f, + +0.001873f, -0.001491f, -0.003469f, -0.000787f, +0.001547f, -0.000605f, +0.000449f, +0.003900f, +0.001411f, -0.001693f, + -0.001275f, -0.001941f, +0.000823f, +0.000565f, -0.002201f, -0.000309f, +0.001190f, +0.000276f, -0.001576f, +0.000056f, + +0.000627f, +0.000551f, +0.000497f, -0.000685f, +0.000653f, -0.002076f, -0.000517f, +0.000401f, -0.000441f, -0.000391f, + +0.000393f, +0.000590f, -0.000570f, -0.000316f, -0.000046f, -0.000693f, -0.000233f, -0.000673f, -0.000514f, -0.000181f, + -0.000247f, +0.000046f, -0.000160f, -0.000534f, +0.000145f, +0.000242f, +0.000388f, -0.000085f, +0.000059f, -0.000248f, + +0.000051f, +0.000580f, +0.000268f, +0.000028f, +0.000124f, +0.000249f, +0.000053f, -0.000256f, +0.000070f, +0.000106f, + +0.000008f, +0.000043f, +0.000171f, +0.000080f, +0.000215f, +0.000306f + }, + { + +0.001057f, +0.012164f, -0.003599f, -0.001023f, +0.000428f, +0.000846f, +0.001102f, -0.001021f, -0.000099f, -0.000131f, + -0.001275f, +0.000833f, +0.002185f, -0.002521f, -0.009958f, -0.009328f, -0.009235f, +0.006489f, -0.008814f, +0.008319f, + +0.010749f, +0.008054f, +0.002646f, +0.001303f, -0.002535f, -0.012859f, -0.011013f, +0.007903f, -0.002734f, -0.005704f, + -0.001505f, +0.001167f, +0.003898f, +0.001643f, -0.000762f, -0.001185f, -0.000944f, +0.001220f, +0.000269f, +0.002647f, + +0.000186f, -0.000352f, -0.002143f, +0.000018f, -0.000407f, -0.000059f, -0.000343f, -0.001149f, +0.001579f, +0.001333f, + -0.000388f, -0.000730f, +0.001065f, -0.000267f, -0.001217f, -0.000541f, -0.000084f, +0.000408f, +0.001172f, +0.000724f, + +0.000044f, -0.000092f, -0.000448f, -0.000456f, -0.000045f, +0.000495f, -0.000041f, -0.000335f, -0.001006f, -0.000699f, + +0.000272f, +0.000261f, +0.000021f, -0.000412f, -0.000045f, -0.000176f, -0.000106f, +0.000321f, +0.000133f, +0.000032f, + -0.000424f, +0.000228f, +0.000476f, +0.000322f, +0.000156f, -0.000360f, +0.000137f, -0.000138f, -0.000173f, +0.000164f, + -0.000254f, -0.000051f, -0.000054f, -0.000084f, +0.000163f, +0.000134f + }, + { + -0.017843f, -0.277277f, -0.029246f, +0.007513f, +0.002543f, +0.002504f, +0.002716f, +0.002594f, +0.000834f, -0.001892f, + +0.001372f, +0.003337f, +0.001582f, +0.000151f, -0.006302f, +0.000213f, -0.000111f, -0.005050f, -0.001431f, +0.004107f, + +0.000006f, -0.001372f, +0.001448f, +0.001837f, +0.003597f, +0.003266f, +0.000144f, +0.001262f, -0.001422f, -0.000233f, + +0.001150f, +0.002001f, +0.000775f, +0.001899f, -0.000797f, -0.001397f, -0.001214f, +0.001614f, -0.002241f, -0.003786f, + -0.008492f, -0.001747f, +0.002329f, +0.000616f, -0.001400f, -0.000739f, +0.000402f, +0.000572f, -0.001992f, -0.001186f, + -0.000848f, -0.000158f, +0.001384f, +0.000368f, +0.000529f, +0.000234f, -0.000648f, -0.000356f, -0.000213f, +0.000551f, + -0.000990f, -0.000637f, -0.000162f, +0.000402f, +0.000392f, +0.000205f, -0.000433f, -0.000381f, +0.000361f, +0.000063f, + +0.000222f, -0.000372f, -0.000057f, -0.000135f, +0.000018f, +0.000040f, +0.000725f, +0.000160f, +0.000354f, -0.000234f, + -0.000289f, +0.000033f, -0.000128f, +0.000069f, -0.000194f, -0.000157f, -0.000335f, -0.000288f, -0.000141f, -0.000265f, + +0.000003f, +0.000099f, +0.000094f, +0.000020f, -0.000269f, +0.000087f + }, + { + -0.000242f, +0.016097f, +0.000181f, +0.002446f, +0.000548f, -0.000669f, -0.011530f, -0.002241f, +0.000838f, +0.002221f, + +0.001750f, +0.001125f, +0.002358f, -0.000308f, +0.001235f, -0.001189f, -0.003218f, -0.005485f, -0.007430f, -0.007477f, + +0.004092f, -0.004380f, -0.001627f, -0.004924f, +0.003659f, +0.001700f, +0.001391f, -0.006828f, -0.000128f, -0.003388f, + -0.000785f, +0.003727f, +0.000825f, +0.000958f, +0.001047f, +0.002499f, +0.000836f, -0.000817f, -0.001133f, +0.000079f, + +0.001042f, -0.001895f, +0.000777f, +0.000680f, -0.000076f, -0.000799f, -0.001139f, -0.000104f, -0.001860f, -0.000007f, + -0.000547f, +0.000095f, +0.000080f, -0.000033f, +0.000414f, +0.000470f, -0.000520f, -0.000066f, -0.000070f, +0.000121f, + -0.000981f, +0.000002f, +0.000485f, +0.000908f, +0.000045f, -0.000117f, -0.000095f, -0.000529f, -0.000490f, -0.000353f, + +0.000164f, -0.000117f, -0.000213f, -0.000002f, +0.000197f, +0.000300f, +0.000122f, +0.000195f, -0.000228f, +0.000295f, + -0.000006f, +0.000126f, +0.000178f, +0.000106f, -0.000139f, -0.000029f, +0.000348f, +0.000300f, +0.000158f, +0.000046f, + -0.000072f, +0.000238f, +0.000067f, +0.000197f, -0.000012f, -0.000006f + }, + { + +0.004101f, -0.112845f, +0.002408f, +0.001477f, -0.000269f, -0.006105f, -0.005956f, -0.005285f, +0.003003f, -0.002990f, + -0.001074f, -0.002030f, +0.001634f, -0.003112f, +0.005024f, -0.000618f, +0.005337f, -0.000938f, +0.000894f, +0.000541f, + +0.006061f, +0.001092f, -0.000870f, +0.000712f, -0.000527f, -0.001029f, +0.000385f, -0.003350f, +0.005860f, +0.000257f, + -0.003906f, -0.001053f, -0.000604f, +0.001574f, +0.001859f, +0.001432f, +0.003132f, -0.001168f, -0.002092f, -0.000677f, + +0.001384f, +0.000576f, +0.001197f, +0.001455f, +0.000994f, -0.000806f, -0.001817f, +0.000446f, -0.000073f, +0.000417f, + -0.000343f, +0.000657f, +0.000605f, +0.000038f, -0.000553f, +0.000707f, -0.001062f, -0.000400f, -0.000165f, +0.000597f, + +0.001578f, +0.001168f, +0.000053f, +0.001259f, +0.000212f, +0.000078f, +0.000397f, -0.000205f, +0.000174f, -0.000169f, + -0.000013f, +0.000219f, -0.000051f, +0.000231f, -0.000070f, +0.000043f, -0.000623f, -0.000358f, -0.000021f, +0.000093f, + -0.000066f, -0.000035f, -0.000025f, +0.000145f, -0.000021f, -0.000175f, -0.000194f, -0.000243f, -0.000330f, +0.000110f, + -0.000026f, -0.000168f, +0.000014f, +0.000055f, -0.000022f, -0.000016f + }, + { + -0.001324f, -0.001771f, +0.004698f, -0.000106f, +0.001052f, +0.000638f, +0.000121f, +0.000761f, -0.000070f, +0.000399f, + -0.001423f, +0.000910f, +0.002843f, +0.025638f, +0.005683f, -0.006114f, -0.003127f, +0.001241f, -0.000209f, -0.002964f, + -0.001946f, -0.000083f, -0.001492f, -0.010171f, -0.009860f, -0.001550f, -0.006162f, -0.000806f, +0.002442f, +0.001658f, + +0.001041f, +0.000684f, -0.001050f, -0.001341f, -0.000896f, -0.001252f, +0.002552f, +0.000388f, +0.000394f, -0.001561f, + -0.001188f, +0.000166f, +0.001019f, +0.000610f, +0.000871f, +0.000500f, -0.000914f, +0.000334f, -0.001167f, -0.002563f, + -0.000457f, -0.000637f, +0.000583f, -0.000712f, +0.000181f, -0.000442f, +0.000714f, -0.000029f, +0.000316f, +0.000380f, + +0.000073f, -0.000420f, +0.000308f, -0.000023f, -0.000119f, +0.000117f, -0.000440f, -0.000348f, -0.000939f, -0.000095f, + -0.000102f, +0.000042f, +0.000143f, +0.000189f, +0.000044f, -0.000078f, -0.000316f, -0.000172f, -0.000107f, -0.000177f, + -0.000114f, -0.000233f, +0.000318f, +0.000231f, +0.000021f, -0.000060f, -0.000264f, +0.000173f, +0.000127f, -0.000175f, + -0.000071f, +0.000052f, +0.000011f, +0.000069f, +0.000077f, +0.000014f + }, + { + +0.002845f, -0.065287f, -0.023732f, -0.022200f, -0.007847f, -0.012297f, -0.005305f, +0.002231f, +0.001676f, -0.004084f, + +0.003220f, -0.005178f, -0.008444f, -0.026691f, -0.001722f, +0.008115f, +0.002558f, -0.001833f, +0.000496f, -0.002087f, + -0.001124f, -0.001564f, -0.000621f, +0.000446f, -0.003574f, -0.001857f, -0.002666f, +0.002127f, -0.002923f, -0.005029f, + -0.002723f, -0.001201f, -0.003063f, -0.000769f, +0.000048f, +0.003077f, -0.000462f, -0.000849f, -0.000590f, +0.001314f, + +0.002898f, +0.000640f, +0.001085f, +0.002409f, +0.000758f, -0.000693f, -0.000296f, -0.000123f, +0.001392f, -0.000793f, + +0.001655f, -0.002256f, -0.001859f, +0.000126f, +0.000975f, +0.002073f, -0.000983f, -0.000704f, -0.000882f, +0.000979f, + +0.000109f, +0.000137f, -0.000215f, +0.000303f, -0.000631f, -0.000244f, -0.000485f, +0.000096f, -0.000342f, -0.000197f, + +0.000077f, -0.000022f, +0.000159f, -0.000348f, -0.000058f, +0.000233f, -0.000072f, -0.000286f, -0.000230f, +0.000263f, + -0.000406f, +0.000138f, +0.000329f, +0.000059f, -0.000215f, -0.000100f, +0.000144f, +0.000033f, +0.000301f, -0.000060f, + +0.000247f, -0.000008f, -0.000205f, -0.000376f, -0.000296f, -0.000151f + }, + { + -0.000391f, +0.001723f, -0.003340f, -0.000620f, -0.002276f, +0.001882f, +0.000054f, +0.000399f, +0.003838f, +0.000976f, + +0.006455f, +0.001677f, +0.000429f, -0.019253f, -0.061641f, +0.009162f, -0.001269f, +0.000775f, +0.000631f, -0.004857f, + -0.008357f, -0.003566f, +0.003318f, -0.001451f, +0.001086f, -0.001323f, -0.006074f, -0.003014f, +0.000594f, -0.002089f, + -0.001062f, +0.002454f, -0.001349f, -0.002718f, -0.001262f, -0.000243f, +0.002450f, -0.001563f, +0.001313f, +0.001577f, + +0.000464f, -0.001344f, +0.000014f, +0.001118f, +0.000843f, -0.001039f, -0.000637f, -0.000385f, +0.000079f, +0.000542f, + -0.000500f, -0.000121f, +0.000693f, +0.000439f, +0.001167f, -0.000460f, -0.001103f, -0.000139f, -0.000351f, +0.000538f, + -0.000680f, -0.000086f, -0.000017f, -0.000523f, -0.000262f, -0.000098f, +0.000219f, +0.000057f, -0.000176f, -0.000725f, + -0.000027f, +0.000580f, +0.000050f, -0.000149f, +0.000149f, +0.000564f, +0.000452f, +0.000260f, -0.000367f, -0.000268f, + -0.000118f, -0.000175f, -0.000090f, +0.000094f, +0.000163f, +0.000327f, -0.000024f, -0.000107f, +0.000050f, +0.000117f, + -0.000074f, -0.000311f, +0.000038f, +0.000160f, +0.000058f, +0.000007f + }, + { + +0.018019f, -0.026436f, -0.003664f, -0.009753f, -0.003034f, -0.003891f, -0.000290f, +0.003138f, +0.000859f, -0.004236f, + -0.002231f, -0.000733f, -0.001856f, +0.017317f, +0.019255f, +0.002154f, +0.002799f, +0.003480f, -0.001076f, -0.001726f, + +0.002644f, +0.002315f, +0.001849f, -0.004137f, +0.001458f, +0.002082f, +0.000342f, +0.001027f, +0.000808f, +0.001278f, + -0.001691f, -0.001056f, +0.004360f, +0.002134f, +0.001358f, -0.000134f, +0.002067f, +0.001066f, +0.001320f, +0.004152f, + -0.002664f, +0.000277f, +0.000126f, +0.000814f, +0.001185f, -0.000098f, -0.000078f, +0.000029f, +0.000208f, -0.001865f, + +0.000064f, -0.001751f, -0.001901f, -0.000320f, +0.000198f, -0.000724f, +0.000001f, +0.000922f, +0.000196f, -0.000539f, + +0.000007f, +0.000530f, +0.000483f, -0.000276f, -0.000189f, +0.000134f, -0.000002f, -0.000789f, +0.000054f, +0.000312f, + -0.000468f, +0.000847f, -0.000044f, -0.000046f, -0.000162f, -0.000472f, -0.000094f, +0.000702f, -0.000163f, -0.000055f, + +0.000436f, +0.000144f, -0.000303f, -0.000000f, -0.000127f, +0.000070f, -0.000043f, -0.000318f, -0.000356f, -0.000025f, + +0.000173f, +0.000149f, +0.000159f, -0.000018f, -0.000038f, +0.000073f + } + }, + { + { + +0.003839f, -0.065261f, -0.001397f, +0.010974f, -0.003229f, +0.000505f, +0.001134f, -0.001269f, +0.001977f, -0.001223f, + +0.000545f, -0.000098f, +0.000562f, +0.002084f, +0.003528f, -0.005820f, +0.006537f, -0.006117f, +0.010682f, +0.002922f, + +0.013852f, -0.005521f, +0.000696f, -0.000481f, +0.002726f, -0.004085f, -0.000794f, +0.001397f, -0.000613f, -0.001334f, + +0.000997f, -0.004158f, +0.002385f, +0.003358f, +0.005295f, +0.000239f, -0.001428f, -0.002340f, +0.000573f, +0.000057f, + +0.000826f, -0.000593f, +0.000173f, +0.000126f, +0.000171f, -0.001296f, +0.000106f, +0.000609f, -0.000090f, -0.000447f, + +0.000303f, +0.000744f, +0.001355f, -0.000750f, -0.000878f, +0.000189f, -0.000278f, +0.000425f, +0.000414f, -0.000667f, + +0.000761f, -0.000498f, -0.000004f, -0.000081f, -0.000136f, +0.000015f, +0.000178f, +0.000516f, -0.000251f, +0.000089f, + -0.000052f, -0.000320f, +0.000250f, -0.000305f, -0.000030f, +0.000120f, -0.000049f, +0.000276f, +0.000073f, -0.000153f, + +0.000006f, -0.000253f, -0.000053f, +0.000041f, +0.000002f, +0.000030f, -0.000176f, -0.000034f, -0.000138f, +0.000085f, + -0.000100f, -0.000032f, -0.000085f, -0.000000f, +0.000056f, +0.000062f + }, + { + -0.004169f, +0.146469f, -0.019017f, -0.005048f, -0.004639f, -0.001332f, +0.001947f, -0.001046f, +0.000563f, -0.004164f, + +0.001697f, +0.001205f, +0.001766f, -0.001864f, +0.001274f, -0.002257f, +0.000219f, +0.005397f, -0.005972f, -0.000593f, + +0.001808f, +0.000014f, -0.000018f, +0.003355f, +0.001016f, -0.000280f, -0.000568f, +0.000229f, -0.000109f, -0.002298f, + +0.000806f, -0.000483f, -0.001372f, -0.000629f, +0.002336f, -0.005214f, -0.000047f, +0.000618f, +0.000334f, +0.000842f, + -0.000835f, +0.002051f, +0.001458f, +0.000870f, -0.000838f, +0.000485f, -0.002034f, +0.001303f, +0.000076f, +0.000036f, + -0.000818f, -0.000131f, -0.001075f, -0.000245f, +0.001373f, -0.000582f, +0.000115f, -0.000333f, +0.000327f, -0.000471f, + +0.000175f, +0.000240f, -0.000175f, +0.000098f, +0.000093f, -0.000235f, +0.000491f, -0.000368f, -0.000010f, -0.000007f, + +0.000654f, -0.000038f, -0.000026f, +0.000119f, +0.000220f, -0.000594f, +0.000104f, +0.000091f, +0.000125f, -0.000258f, + +0.000085f, +0.000193f, -0.000168f, -0.000180f, -0.000150f, +0.000501f, +0.000086f, -0.000193f, +0.000095f, +0.000131f, + +0.000058f, +0.000055f, -0.000115f, -0.000010f, -0.000111f, +0.000088f + }, + { + -0.013682f, +0.048836f, +0.012006f, -0.019695f, +0.006377f, +0.000656f, -0.000657f, -0.000873f, -0.000935f, +0.003498f, + -0.002164f, +0.001073f, +0.004653f, +0.001490f, -0.003854f, +0.001131f, +0.004111f, +0.001312f, +0.000370f, +0.001046f, + -0.003053f, +0.002683f, -0.003995f, +0.001087f, -0.000443f, -0.002960f, +0.001291f, -0.000062f, +0.000441f, +0.000228f, + +0.003450f, +0.000978f, +0.000107f, +0.000639f, +0.000343f, +0.001329f, +0.000205f, +0.003296f, -0.000126f, -0.000040f, + +0.000379f, +0.001023f, +0.000400f, -0.000524f, +0.000209f, +0.000587f, +0.000158f, +0.000411f, +0.000282f, +0.000734f, + +0.000155f, +0.000249f, -0.000589f, +0.000619f, -0.000023f, +0.000250f, -0.001052f, -0.000184f, +0.000302f, +0.000102f, + -0.000345f, -0.000849f, -0.000272f, +0.000539f, +0.000181f, +0.000379f, -0.000778f, +0.000160f, +0.000022f, -0.000445f, + +0.000236f, -0.000326f, +0.000227f, +0.000004f, +0.000031f, -0.000059f, +0.000323f, -0.000176f, +0.000063f, -0.000049f, + +0.000022f, -0.000218f, -0.000199f, -0.000028f, +0.000015f, -0.000230f, +0.000104f, +0.000119f, +0.000031f, -0.000004f, + -0.000192f, -0.000044f, -0.000072f, +0.000046f, +0.000100f, -0.000120f + }, + { + +0.001069f, +0.005479f, -0.000317f, -0.001837f, -0.000159f, -0.000072f, +0.000067f, +0.000399f, -0.001923f, +0.000829f, + +0.001455f, +0.000261f, +0.001614f, -0.005966f, +0.001005f, -0.000947f, +0.001677f, +0.004962f, -0.009276f, +0.004145f, + -0.001605f, -0.002916f, +0.007253f, +0.000354f, +0.002739f, +0.001128f, +0.002627f, -0.000655f, +0.000595f, -0.002531f, + -0.001399f, +0.001063f, +0.000257f, +0.000646f, +0.000934f, -0.000962f, +0.000871f, +0.000629f, -0.000811f, -0.000650f, + -0.000510f, -0.000689f, +0.001335f, -0.000436f, -0.000682f, +0.000494f, -0.000826f, -0.000004f, +0.000032f, -0.000465f, + -0.000409f, -0.000094f, -0.000463f, -0.000085f, -0.000409f, +0.000389f, +0.000335f, -0.000271f, -0.000100f, +0.000002f, + +0.000058f, -0.000302f, +0.000064f, +0.000191f, -0.000129f, -0.000038f, +0.000077f, -0.000046f, +0.000034f, -0.000040f, + +0.000230f, -0.000115f, +0.000697f, -0.000307f, +0.000024f, -0.000035f, -0.000104f, -0.000065f, +0.000027f, -0.000276f, + +0.000165f, -0.000261f, +0.000119f, -0.000155f, -0.000116f, +0.000161f, +0.000038f, -0.000131f, -0.000062f, +0.000037f, + +0.000031f, -0.000040f, -0.000085f, +0.000086f, -0.000060f, -0.000025f + }, + { + +0.037846f, -0.006540f, -0.008373f, -0.006370f, +0.000845f, +0.001657f, -0.000166f, +0.002310f, -0.001050f, +0.000613f, + -0.006545f, +0.003817f, -0.000487f, -0.003832f, -0.003334f, +0.006412f, -0.000633f, -0.014458f, -0.006114f, +0.005011f, + -0.000226f, +0.000903f, -0.000340f, +0.001694f, +0.001695f, +0.002358f, -0.000205f, +0.003290f, -0.001872f, -0.000767f, + +0.001197f, -0.000779f, +0.002391f, +0.002324f, -0.001448f, -0.000368f, +0.000329f, -0.000602f, +0.000072f, -0.000407f, + +0.000275f, -0.000309f, -0.000148f, +0.000231f, +0.000442f, -0.000296f, +0.000793f, -0.000582f, -0.000602f, +0.000754f, + -0.000192f, -0.001695f, +0.001688f, +0.001101f, -0.000417f, -0.000437f, +0.000469f, +0.000981f, -0.000818f, +0.000231f, + +0.000189f, +0.000168f, -0.000314f, -0.000291f, -0.000036f, -0.000114f, -0.000241f, +0.000230f, -0.000057f, -0.000111f, + +0.000073f, +0.000032f, +0.000225f, -0.000124f, +0.000009f, +0.000059f, +0.000105f, +0.000163f, +0.000005f, -0.000064f, + -0.000034f, -0.000216f, -0.000019f, +0.000090f, +0.000073f, +0.000020f, +0.000144f, +0.000094f, +0.000164f, +0.000036f, + -0.000143f, +0.000081f, -0.000040f, +0.000031f, -0.000042f, -0.000088f + }, + { + +0.000245f, +0.004007f, +0.001995f, -0.001270f, -0.000181f, +0.000424f, -0.000804f, -0.000383f, -0.000898f, +0.001020f, + -0.000532f, +0.000061f, -0.000903f, +0.005530f, -0.002502f, +0.003900f, +0.002643f, +0.004087f, -0.005500f, -0.009557f, + -0.000300f, +0.001210f, -0.002683f, +0.000164f, +0.002182f, -0.004044f, +0.004561f, -0.004301f, -0.002100f, +0.000077f, + -0.001024f, -0.001109f, +0.001255f, +0.001222f, -0.001120f, +0.000863f, -0.001474f, -0.001688f, +0.000458f, -0.000304f, + +0.000459f, -0.001585f, +0.001532f, -0.000745f, +0.000753f, +0.000792f, -0.000773f, -0.000881f, -0.000329f, +0.000929f, + +0.000068f, -0.000657f, +0.000357f, -0.000508f, -0.000529f, +0.001155f, -0.000974f, +0.000124f, -0.000084f, -0.000775f, + +0.000503f, -0.000740f, +0.000472f, -0.000107f, +0.000500f, -0.000144f, +0.000052f, +0.000016f, +0.000314f, +0.000254f, + -0.000166f, +0.000166f, -0.000265f, -0.000010f, -0.000396f, -0.000092f, -0.000023f, -0.000139f, +0.000275f, -0.000362f, + +0.000044f, -0.000113f, +0.000247f, +0.000001f, -0.000038f, +0.000060f, +0.000293f, -0.000111f, +0.000057f, -0.000051f, + -0.000083f, +0.000054f, -0.000012f, -0.000091f, -0.000010f, +0.000067f + }, + { + +0.027632f, +0.141924f, -0.006869f, -0.004110f, +0.001276f, -0.000949f, -0.000060f, +0.000953f, -0.000318f, +0.001271f, + -0.001923f, +0.000593f, -0.002157f, +0.001985f, -0.002886f, +0.002316f, -0.001060f, -0.000498f, +0.001368f, +0.000505f, + -0.000221f, -0.000804f, -0.001623f, +0.001476f, -0.000099f, -0.000200f, -0.000137f, -0.001396f, +0.000600f, -0.000951f, + +0.000827f, -0.002469f, +0.000708f, +0.000859f, +0.001011f, -0.001710f, -0.001656f, +0.000880f, +0.000147f, -0.001153f, + -0.001059f, +0.001086f, +0.001668f, -0.000887f, -0.000427f, +0.000054f, +0.000013f, +0.000506f, +0.000249f, +0.000452f, + +0.000415f, -0.000633f, +0.000292f, +0.000286f, -0.000084f, -0.000697f, +0.000333f, -0.000023f, -0.000084f, -0.000394f, + -0.000498f, +0.000308f, -0.000354f, -0.000179f, +0.000184f, -0.000425f, +0.000205f, -0.000069f, +0.000168f, +0.000089f, + -0.000133f, +0.000080f, -0.000085f, -0.000291f, +0.000064f, -0.000168f, -0.000009f, -0.000035f, +0.000129f, -0.000001f, + +0.000193f, +0.000067f, -0.000063f, -0.000097f, +0.000217f, -0.000220f, -0.000105f, +0.000019f, +0.000193f, +0.000091f, + -0.000145f, +0.000026f, +0.000036f, +0.000049f, +0.000056f, +0.000104f + }, + { + -0.000818f, +0.000326f, -0.002478f, +0.001545f, +0.000003f, +0.000465f, +0.000588f, -0.000849f, +0.000597f, +0.000032f, + -0.000990f, -0.001307f, -0.000467f, +0.000513f, -0.003504f, -0.002989f, -0.006222f, +0.007001f, -0.001592f, +0.003532f, + +0.002756f, -0.000872f, +0.003400f, +0.003197f, +0.001603f, +0.002135f, -0.003942f, +0.009141f, -0.001430f, +0.001320f, + +0.001707f, -0.001123f, +0.000022f, +0.001627f, -0.001198f, +0.001999f, -0.000527f, +0.000577f, -0.001408f, +0.000992f, + -0.000365f, +0.000412f, -0.000744f, +0.000301f, +0.000508f, -0.000629f, -0.000103f, +0.000175f, +0.000654f, -0.000280f, + +0.000107f, -0.000614f, +0.000526f, -0.000703f, +0.000352f, +0.000302f, -0.000507f, -0.000044f, +0.000348f, -0.000122f, + -0.000405f, -0.000248f, +0.000205f, +0.000492f, +0.000001f, +0.000120f, -0.000526f, +0.000238f, +0.000082f, +0.000289f, + +0.000028f, -0.000225f, -0.000109f, -0.000371f, +0.000069f, +0.000285f, -0.000314f, +0.000091f, -0.000077f, +0.000064f, + -0.000214f, +0.000014f, +0.000077f, -0.000069f, +0.000057f, -0.000234f, +0.000095f, -0.000047f, -0.000128f, +0.000002f, + -0.000080f, -0.000042f, +0.000050f, -0.000012f, +0.000063f, +0.000110f + }, + { + +0.027157f, -0.158117f, +0.001380f, +0.000063f, -0.003632f, -0.000401f, -0.001325f, +0.000830f, -0.001525f, -0.002826f, + +0.000587f, +0.003139f, +0.000019f, +0.002991f, +0.001051f, -0.000166f, +0.004952f, +0.000802f, -0.001998f, +0.000791f, + -0.001436f, -0.001691f, +0.001507f, +0.001267f, +0.000477f, +0.001186f, -0.000722f, +0.001830f, +0.000265f, +0.001610f, + -0.001473f, +0.000846f, +0.000979f, -0.000480f, -0.001799f, -0.001017f, -0.002012f, +0.002594f, +0.000844f, -0.000687f, + -0.002231f, +0.003120f, +0.000513f, -0.000659f, +0.000036f, +0.000927f, +0.001225f, +0.000532f, -0.001393f, +0.000130f, + +0.000536f, +0.000657f, +0.001029f, -0.000525f, +0.000699f, +0.000374f, -0.000266f, +0.000316f, +0.000727f, +0.000947f, + -0.000649f, -0.000021f, -0.000163f, +0.000067f, +0.000147f, +0.000021f, -0.000009f, +0.000101f, -0.000003f, +0.000134f, + +0.000632f, +0.000157f, -0.000236f, -0.000323f, +0.000052f, +0.000271f, +0.000131f, -0.000229f, +0.000073f, +0.000106f, + -0.000175f, +0.000024f, -0.000097f, +0.000097f, -0.000071f, +0.000236f, -0.000080f, -0.000103f, -0.000017f, -0.000033f, + +0.000141f, +0.000006f, +0.000024f, +0.000009f, -0.000066f, -0.000012f + }, + { + +0.001020f, +0.003254f, -0.008058f, -0.002846f, -0.004291f, +0.000517f, -0.003582f, -0.000413f, -0.000880f, +0.002395f, + +0.001816f, +0.000338f, -0.000630f, -0.004763f, +0.003451f, -0.001647f, -0.002765f, -0.002001f, -0.004718f, -0.005013f, + +0.006531f, -0.004446f, -0.001369f, -0.003906f, +0.002510f, -0.000950f, +0.001943f, -0.003503f, +0.002092f, -0.001647f, + -0.000855f, -0.001203f, -0.000671f, -0.001257f, +0.000457f, +0.000701f, -0.002280f, +0.000378f, -0.000076f, -0.001608f, + +0.000543f, -0.000103f, +0.000826f, -0.000207f, -0.000821f, -0.000981f, -0.000480f, +0.000692f, -0.002277f, -0.000517f, + -0.000662f, +0.000513f, +0.000361f, +0.000571f, +0.000982f, +0.000872f, -0.000470f, -0.000177f, -0.000227f, +0.000362f, + -0.000246f, +0.000055f, -0.000060f, +0.000374f, +0.000188f, +0.000034f, -0.000262f, -0.000237f, +0.000181f, +0.000330f, + -0.000004f, +0.000109f, +0.000185f, -0.000152f, +0.000047f, -0.000028f, +0.000007f, +0.000117f, -0.000051f, +0.000321f, + -0.000056f, +0.000093f, -0.000093f, +0.000164f, -0.000074f, -0.000087f, +0.000090f, -0.000010f, -0.000005f, -0.000179f, + -0.000074f, -0.000056f, -0.000110f, +0.000106f, -0.000094f, -0.000056f + }, + { + -0.002072f, -0.091008f, +0.002892f, -0.004628f, +0.002823f, -0.000017f, +0.013349f, -0.001578f, +0.002303f, -0.005028f, + +0.000986f, -0.002238f, -0.000565f, -0.002457f, +0.003420f, +0.000438f, +0.000057f, -0.006502f, +0.000293f, -0.000234f, + +0.003494f, -0.001193f, -0.000674f, +0.000579f, -0.000006f, +0.000214f, +0.001707f, -0.003853f, +0.003205f, -0.000354f, + -0.000313f, +0.003450f, +0.000971f, +0.000193f, -0.000774f, +0.000375f, +0.000635f, -0.000736f, +0.001727f, -0.001077f, + +0.000277f, +0.000215f, +0.000900f, +0.001606f, +0.001638f, +0.000985f, -0.000734f, +0.000618f, -0.000234f, +0.000285f, + -0.000544f, +0.000341f, +0.000562f, +0.000353f, -0.000917f, +0.000723f, -0.000256f, -0.000066f, -0.000074f, +0.000119f, + +0.000308f, +0.000146f, -0.000807f, +0.000389f, -0.000399f, -0.000008f, +0.000331f, -0.000019f, +0.000030f, -0.000234f, + -0.000151f, +0.000049f, +0.000069f, -0.000037f, -0.000194f, +0.000094f, -0.000281f, +0.000178f, -0.000119f, +0.000068f, + -0.000033f, +0.000040f, +0.000146f, -0.000036f, -0.000036f, -0.000204f, -0.000017f, -0.000094f, -0.000107f, +0.000205f, + +0.000009f, -0.000010f, +0.000047f, +0.000045f, -0.000079f, +0.000047f + }, + { + +0.001396f, -0.006326f, -0.000455f, +0.003551f, +0.000308f, +0.000098f, +0.001600f, +0.000812f, +0.000395f, -0.000040f, + -0.002840f, -0.001009f, -0.009667f, +0.006910f, +0.007048f, -0.000828f, +0.000198f, -0.000960f, +0.001653f, -0.000343f, + -0.002206f, -0.001014f, -0.000668f, -0.000789f, -0.002519f, +0.000662f, +0.001099f, +0.002432f, +0.003281f, -0.000152f, + +0.001945f, +0.001523f, +0.001763f, -0.001465f, -0.000315f, -0.001837f, +0.000512f, -0.001811f, +0.000518f, -0.000465f, + +0.000484f, -0.000248f, -0.000366f, +0.000271f, -0.000270f, +0.000071f, +0.000576f, +0.000618f, +0.000211f, +0.000069f, + +0.000655f, -0.000243f, -0.000042f, -0.001069f, +0.000270f, -0.000354f, +0.000709f, +0.000241f, +0.000531f, +0.000024f, + -0.000391f, +0.000359f, +0.000170f, +0.000035f, -0.000312f, +0.000140f, -0.000043f, -0.000038f, -0.000072f, +0.000157f, + +0.000034f, +0.000188f, +0.000117f, -0.000114f, +0.000014f, +0.000163f, -0.000167f, +0.000136f, -0.000068f, -0.000143f, + -0.000084f, -0.000237f, +0.000206f, +0.000078f, -0.000014f, +0.000181f, -0.000056f, +0.000179f, -0.000015f, -0.000191f, + -0.000002f, -0.000044f, -0.000037f, +0.000144f, -0.000012f, -0.000030f + }, + { + +0.005058f, -0.033415f, +0.011270f, -0.002712f, -0.000549f, -0.004645f, -0.000126f, +0.002076f, +0.001849f, -0.006186f, + +0.002058f, -0.000169f, +0.007449f, -0.001332f, -0.001547f, +0.002325f, +0.002244f, -0.001255f, +0.002501f, -0.001645f, + +0.002375f, -0.000063f, +0.000732f, +0.002123f, -0.001993f, -0.002178f, +0.000084f, +0.003029f, -0.002168f, -0.001456f, + -0.002622f, +0.000970f, -0.001308f, -0.001837f, -0.001272f, +0.002193f, +0.000189f, -0.001151f, -0.001314f, -0.000652f, + +0.002454f, +0.001624f, -0.001551f, -0.000582f, -0.000030f, -0.000048f, -0.000680f, +0.000246f, +0.000834f, -0.000249f, + +0.001011f, -0.001165f, +0.000138f, -0.000224f, +0.000078f, +0.000299f, +0.000037f, +0.000922f, +0.000155f, +0.000632f, + -0.000057f, +0.000133f, -0.000596f, -0.000299f, -0.000019f, -0.000133f, -0.000435f, +0.000579f, -0.000369f, -0.000108f, + +0.000428f, -0.000060f, -0.000084f, -0.000454f, -0.000040f, +0.000196f, +0.000252f, -0.000139f, -0.000110f, +0.000147f, + -0.000045f, +0.000197f, -0.000055f, -0.000074f, -0.000111f, +0.000173f, +0.000138f, -0.000192f, +0.000095f, -0.000127f, + +0.000052f, -0.000088f, -0.000121f, -0.000058f, -0.000078f, +0.000019f + }, + { + +0.000248f, +0.002328f, -0.004935f, +0.000670f, -0.000652f, +0.001099f, +0.000214f, -0.000499f, +0.002372f, -0.000129f, + +0.003261f, -0.000986f, -0.003459f, +0.026860f, +0.009168f, +0.004359f, -0.010263f, -0.000238f, +0.000397f, -0.001097f, + -0.006501f, -0.000782f, +0.001972f, -0.001199f, +0.000910f, -0.000724f, -0.000072f, +0.001165f, +0.004981f, +0.000064f, + -0.001450f, +0.001120f, -0.001093f, -0.001092f, +0.000786f, +0.000246f, +0.002186f, -0.002356f, +0.000855f, +0.000832f, + +0.000413f, -0.000756f, +0.000631f, -0.000129f, +0.000401f, +0.000775f, +0.000804f, +0.000374f, -0.000207f, +0.000570f, + -0.000440f, +0.000111f, -0.000054f, +0.000322f, +0.001451f, -0.000425f, -0.000744f, +0.000381f, -0.000519f, +0.000590f, + -0.001124f, -0.000225f, -0.000092f, +0.000004f, +0.000124f, +0.000276f, +0.000411f, -0.000176f, -0.000002f, -0.000182f, + +0.000058f, +0.000150f, +0.000119f, +0.000092f, -0.000387f, -0.000034f, +0.000568f, +0.000101f, +0.000143f, +0.000043f, + -0.000261f, -0.000001f, -0.000123f, +0.000021f, +0.000049f, +0.000189f, -0.000021f, -0.000189f, +0.000107f, -0.000005f, + -0.000121f, -0.000182f, +0.000157f, +0.000049f, -0.000085f, +0.000007f + }, + { + -0.004649f, -0.047338f, +0.006990f, -0.005321f, -0.004887f, -0.002004f, +0.004652f, -0.002510f, -0.002215f, -0.000733f, + +0.000272f, -0.001184f, -0.001998f, -0.003038f, -0.017307f, +0.004537f, +0.005744f, +0.000216f, -0.002454f, -0.001704f, + +0.001711f, +0.000396f, +0.001256f, -0.003035f, +0.002630f, +0.000802f, -0.001064f, -0.001939f, -0.002320f, +0.000723f, + -0.000774f, -0.001942f, +0.000338f, +0.000559f, +0.000425f, -0.001663f, +0.000583f, -0.000495f, -0.000423f, +0.001388f, + -0.003269f, -0.000118f, -0.000383f, +0.000298f, +0.001093f, +0.001209f, +0.000303f, -0.000796f, -0.000222f, -0.000737f, + +0.000022f, -0.000866f, +0.000230f, +0.001745f, +0.000225f, -0.000323f, +0.000149f, -0.000166f, -0.000154f, -0.000293f, + +0.000056f, +0.000115f, +0.000162f, +0.000119f, +0.000026f, +0.000086f, -0.000043f, -0.000583f, -0.000120f, +0.000264f, + -0.000349f, +0.000535f, -0.000414f, -0.000103f, -0.000014f, -0.000109f, +0.000012f, +0.000224f, +0.000134f, +0.000034f, + +0.000038f, +0.000063f, -0.000079f, +0.000032f, -0.000148f, +0.000058f, +0.000018f, -0.000285f, +0.000007f, +0.000118f, + -0.000006f, +0.000042f, +0.000083f, -0.000056f, -0.000050f, -0.000003f + } + }, + { + { + -0.001741f, -0.044785f, -0.000431f, +0.003188f, +0.001784f, +0.001020f, -0.000647f, -0.000638f, -0.000164f, +0.001948f, + -0.000840f, -0.001193f, +0.002658f, +0.000278f, +0.000855f, -0.002555f, -0.002276f, +0.001836f, +0.006476f, +0.006087f, + +0.005539f, +0.000927f, +0.002155f, +0.003055f, +0.001139f, +0.000644f, -0.001244f, +0.000262f, +0.000515f, -0.002202f, + -0.001386f, +0.000367f, +0.003927f, -0.000763f, +0.002432f, -0.000678f, -0.000673f, -0.003678f, +0.000700f, +0.000148f, + +0.000784f, +0.000404f, -0.000141f, -0.000736f, +0.000535f, -0.000044f, -0.000554f, -0.000019f, +0.000000f, -0.000833f, + +0.000934f, +0.001257f, +0.000063f, -0.000086f, -0.000484f, -0.000126f, -0.000459f, +0.000041f, +0.000077f, +0.000186f, + +0.000039f, +0.000182f, +0.000186f, -0.000207f, +0.000026f, +0.000187f, +0.000061f, +0.000112f, -0.000038f, +0.000341f, + -0.000175f, -0.000240f, -0.000002f, -0.000226f, -0.000041f, +0.000020f, +0.000058f, +0.000068f, +0.000092f, -0.000058f, + -0.000144f, -0.000083f, +0.000045f, +0.000271f, +0.000118f, -0.000137f, -0.000155f, -0.000157f, +0.000029f, -0.000075f, + -0.000081f, +0.000074f, -0.000100f, -0.000061f, -0.000040f, -0.000031f + }, + { + +0.007179f, +0.094494f, +0.014308f, -0.013822f, -0.003837f, -0.001176f, -0.000112f, -0.001835f, -0.001909f, -0.001318f, + -0.002097f, +0.002147f, +0.000731f, -0.000610f, +0.000538f, -0.003924f, -0.001967f, -0.000902f, +0.007147f, -0.001686f, + +0.001012f, +0.000191f, -0.001068f, +0.000984f, +0.002257f, +0.000328f, -0.000873f, -0.000912f, -0.000087f, -0.000604f, + -0.000361f, +0.000186f, -0.000221f, -0.001078f, -0.001031f, -0.001735f, +0.001735f, -0.001524f, -0.001772f, -0.000017f, + +0.000362f, +0.000965f, +0.002743f, +0.000337f, +0.000098f, -0.000261f, -0.000119f, +0.000096f, -0.000704f, -0.000024f, + -0.000380f, -0.000424f, -0.000095f, +0.000299f, +0.000674f, -0.000080f, -0.000469f, +0.000593f, -0.000141f, -0.000254f, + +0.000561f, +0.000048f, +0.000033f, -0.000071f, +0.000126f, -0.000187f, +0.000007f, +0.000200f, -0.000055f, +0.000199f, + +0.000397f, -0.000095f, +0.000061f, +0.000014f, -0.000154f, -0.000221f, +0.000055f, +0.000131f, -0.000192f, -0.000121f, + +0.000151f, +0.000096f, -0.000142f, -0.000174f, +0.000144f, +0.000159f, -0.000052f, +0.000122f, -0.000006f, +0.000164f, + +0.000047f, -0.000115f, +0.000073f, -0.000053f, -0.000001f, +0.000046f + }, + { + +0.013096f, +0.045993f, -0.011551f, +0.005121f, -0.003019f, +0.001171f, -0.000779f, -0.000495f, -0.000947f, -0.000025f, + -0.001382f, +0.001007f, +0.004086f, -0.000147f, +0.001024f, -0.000738f, +0.002367f, -0.000788f, +0.001253f, +0.001486f, + -0.004479f, +0.000041f, -0.001711f, -0.001233f, -0.000320f, -0.000538f, +0.001435f, +0.000145f, -0.000227f, -0.000365f, + +0.002532f, +0.000635f, +0.003130f, +0.000416f, +0.002464f, -0.001018f, +0.002412f, +0.001386f, -0.000293f, -0.000266f, + -0.000365f, +0.001459f, +0.000446f, +0.000102f, +0.000668f, -0.000683f, +0.000867f, +0.000033f, +0.000417f, +0.001024f, + +0.000203f, -0.000171f, +0.000430f, -0.000225f, -0.000105f, +0.000462f, -0.000477f, -0.000346f, +0.000323f, -0.000139f, + -0.000092f, -0.000036f, +0.000066f, +0.000290f, +0.000106f, +0.000194f, -0.000124f, +0.000038f, +0.000042f, +0.000057f, + +0.000051f, -0.000265f, -0.000033f, +0.000299f, +0.000121f, -0.000017f, +0.000044f, -0.000016f, -0.000083f, -0.000224f, + +0.000013f, -0.000029f, -0.000168f, -0.000022f, +0.000040f, -0.000134f, -0.000028f, -0.000006f, -0.000039f, +0.000016f, + -0.000117f, -0.000057f, +0.000074f, +0.000086f, -0.000039f, -0.000017f + }, + { + -0.000781f, +0.005294f, +0.001256f, -0.000710f, +0.000044f, -0.000651f, -0.000284f, -0.000047f, -0.000599f, -0.000021f, + +0.001314f, -0.000563f, +0.002016f, +0.001979f, -0.010265f, -0.002031f, +0.004504f, -0.000401f, -0.004837f, +0.000547f, + +0.000969f, -0.003794f, +0.003316f, +0.004216f, +0.001532f, -0.000137f, -0.000386f, -0.000133f, +0.000522f, -0.003508f, + -0.001538f, +0.002012f, +0.000978f, +0.000414f, -0.000803f, -0.000489f, +0.002147f, +0.000072f, -0.001163f, -0.001093f, + -0.000012f, +0.000599f, +0.000374f, -0.000384f, -0.001198f, -0.000230f, +0.000336f, -0.000360f, -0.000334f, +0.000047f, + +0.000030f, -0.000433f, +0.000045f, +0.000277f, +0.000150f, -0.000041f, +0.000202f, -0.000594f, +0.000241f, -0.000132f, + -0.000405f, +0.000063f, +0.000325f, +0.000047f, -0.000043f, +0.000087f, +0.000046f, +0.000095f, -0.000040f, +0.000120f, + -0.000232f, -0.000110f, +0.000043f, +0.000189f, +0.000048f, -0.000099f, +0.000036f, +0.000120f, +0.000053f, -0.000096f, + -0.000083f, -0.000006f, +0.000115f, -0.000118f, +0.000028f, +0.000024f, -0.000039f, +0.000021f, +0.000088f, +0.000073f, + -0.000056f, +0.000029f, +0.000123f, +0.000103f, -0.000072f, +0.000064f + }, + { + -0.017977f, +0.062642f, +0.003276f, -0.006835f, +0.001186f, +0.000648f, +0.001142f, +0.000134f, +0.000539f, -0.000911f, + -0.000439f, -0.000438f, -0.000830f, -0.004671f, -0.001120f, +0.005999f, -0.001394f, -0.011363f, -0.002789f, +0.002321f, + +0.000757f, +0.000530f, +0.000181f, +0.000208f, +0.001388f, +0.001228f, +0.002621f, +0.001330f, -0.002377f, -0.001317f, + -0.001201f, +0.000776f, +0.001745f, +0.002798f, -0.001058f, -0.000629f, +0.000178f, -0.002333f, +0.000189f, +0.000102f, + +0.000002f, +0.000316f, -0.001709f, +0.001183f, +0.000150f, -0.000299f, +0.000720f, +0.000443f, -0.001015f, +0.001450f, + -0.000088f, -0.000328f, +0.000704f, +0.000872f, -0.000435f, +0.000070f, +0.000383f, -0.000244f, -0.000543f, +0.000172f, + +0.000002f, +0.000267f, -0.000246f, -0.000328f, +0.000045f, -0.000087f, -0.000161f, +0.000317f, -0.000153f, +0.000041f, + +0.000054f, -0.000086f, -0.000197f, +0.000025f, +0.000099f, +0.000040f, +0.000141f, +0.000315f, -0.000002f, -0.000097f, + -0.000014f, -0.000062f, +0.000049f, +0.000041f, -0.000189f, +0.000075f, +0.000034f, +0.000087f, +0.000124f, -0.000076f, + +0.000037f, -0.000132f, -0.000140f, -0.000001f, -0.000123f, -0.000019f + }, + { + -0.000731f, +0.002680f, +0.004533f, +0.000403f, -0.000564f, -0.000154f, -0.000453f, -0.000028f, -0.000912f, +0.000105f, + -0.000001f, -0.000235f, -0.000189f, +0.000984f, -0.002429f, +0.002606f, +0.001652f, +0.002837f, +0.005157f, -0.011546f, + -0.002233f, -0.001759f, -0.001150f, -0.000861f, +0.001630f, -0.005086f, +0.003539f, -0.005243f, -0.001279f, -0.000414f, + +0.001246f, -0.000033f, +0.000616f, +0.001568f, +0.000007f, +0.000022f, -0.000147f, -0.000761f, +0.000681f, -0.000477f, + +0.000481f, +0.000376f, +0.000059f, -0.000373f, +0.000359f, +0.000499f, -0.000551f, -0.001387f, +0.000051f, -0.000093f, + +0.000410f, -0.000047f, -0.000761f, +0.000224f, -0.000013f, +0.000561f, -0.000234f, -0.000309f, +0.000051f, -0.000265f, + -0.000204f, +0.000020f, +0.000093f, +0.000027f, +0.000253f, +0.000059f, +0.000006f, +0.000102f, +0.000016f, -0.000021f, + +0.000095f, +0.000165f, +0.000109f, +0.000025f, -0.000439f, -0.000065f, +0.000390f, +0.000101f, +0.000142f, -0.000121f, + -0.000192f, +0.000248f, -0.000025f, -0.000059f, +0.000029f, +0.000099f, +0.000223f, -0.000023f, +0.000012f, -0.000061f, + -0.000074f, -0.000093f, +0.000057f, +0.000116f, +0.000008f, -0.000093f + }, + { + +0.004219f, +0.152101f, +0.005273f, -0.000510f, +0.001043f, -0.000167f, -0.000280f, +0.001183f, +0.000221f, -0.002366f, + -0.000504f, +0.000634f, +0.001326f, -0.000336f, +0.000341f, -0.001366f, -0.000884f, +0.000911f, +0.000188f, -0.001057f, + -0.001287f, -0.000646f, +0.000967f, -0.000263f, +0.000266f, -0.000140f, +0.000150f, -0.001875f, -0.001202f, -0.001027f, + +0.000288f, -0.000156f, +0.000183f, +0.001166f, -0.000692f, -0.001754f, +0.000592f, -0.000417f, -0.001560f, +0.000270f, + -0.000564f, +0.001986f, -0.000445f, -0.000631f, +0.000573f, -0.000487f, +0.000231f, -0.000205f, +0.000204f, +0.000358f, + +0.000191f, -0.000916f, -0.000588f, +0.000660f, +0.000214f, +0.000181f, -0.000130f, -0.000114f, +0.000545f, +0.000044f, + -0.000735f, +0.000097f, +0.000082f, -0.000334f, -0.000069f, -0.000090f, +0.000281f, +0.000194f, +0.000047f, +0.000094f, + -0.000090f, -0.000341f, +0.000255f, -0.000012f, -0.000004f, -0.000165f, -0.000005f, +0.000187f, -0.000114f, +0.000219f, + +0.000175f, -0.000146f, +0.000090f, +0.000016f, -0.000122f, -0.000204f, -0.000072f, +0.000196f, +0.000111f, +0.000001f, + -0.000036f, +0.000104f, -0.000028f, -0.000024f, +0.000030f, +0.000036f + }, + { + -0.000700f, -0.004634f, +0.004527f, -0.000632f, +0.000840f, +0.000002f, -0.000075f, +0.000311f, -0.000193f, +0.000354f, + -0.001174f, -0.001459f, -0.000617f, -0.000793f, -0.001680f, -0.004121f, +0.000646f, -0.001675f, +0.003945f, +0.000589f, + -0.000403f, -0.002946f, +0.002251f, +0.001530f, -0.001141f, +0.004410f, +0.001215f, +0.004402f, -0.000244f, +0.002061f, + -0.000484f, -0.000267f, -0.000433f, -0.000079f, -0.001052f, +0.002186f, -0.000167f, -0.000208f, +0.000264f, +0.000640f, + -0.000065f, -0.000462f, -0.000007f, +0.000020f, +0.000223f, -0.000358f, +0.000466f, +0.000418f, -0.000637f, +0.000057f, + +0.000790f, -0.000596f, -0.000233f, +0.000245f, +0.001140f, +0.000246f, -0.000453f, -0.000147f, -0.000363f, +0.000167f, + -0.000052f, +0.000004f, +0.000633f, +0.000605f, -0.000076f, -0.000119f, -0.000428f, +0.000211f, +0.000385f, +0.000364f, + -0.000038f, -0.000177f, -0.000458f, -0.000057f, +0.000310f, +0.000122f, -0.000093f, +0.000161f, +0.000028f, +0.000032f, + +0.000021f, -0.000266f, -0.000002f, -0.000169f, +0.000022f, -0.000083f, +0.000047f, +0.000023f, -0.000020f, -0.000044f, + +0.000077f, -0.000052f, -0.000017f, +0.000016f, -0.000028f, +0.000073f + }, + { + -0.026819f, -0.071304f, -0.008270f, -0.004000f, -0.000684f, +0.000007f, -0.001408f, -0.001227f, -0.002610f, +0.000854f, + +0.000065f, -0.001427f, +0.001464f, +0.000903f, +0.001615f, +0.000794f, +0.004245f, +0.002170f, -0.000688f, -0.001930f, + -0.001470f, -0.000629f, +0.000544f, +0.000630f, +0.000842f, +0.000546f, -0.000751f, +0.001947f, +0.002550f, +0.001128f, + -0.001468f, +0.000676f, +0.000538f, -0.001005f, -0.002265f, +0.000120f, -0.002019f, +0.002248f, +0.000535f, +0.001147f, + -0.000152f, +0.002660f, +0.000164f, +0.000067f, +0.000437f, +0.001520f, +0.000345f, -0.000753f, +0.000218f, -0.000033f, + +0.001203f, +0.000332f, -0.000185f, +0.000748f, -0.000099f, +0.000347f, +0.000020f, +0.000326f, +0.001094f, +0.000302f, + -0.000041f, +0.000237f, -0.000290f, +0.000110f, -0.000393f, -0.000286f, +0.000121f, +0.000515f, -0.000282f, +0.000318f, + +0.000255f, +0.000193f, -0.000083f, -0.000194f, +0.000127f, +0.000248f, -0.000375f, +0.000205f, -0.000189f, +0.000142f, + +0.000065f, -0.000190f, -0.000162f, -0.000116f, +0.000009f, +0.000073f, -0.000045f, +0.000066f, +0.000111f, +0.000112f, + +0.000039f, -0.000048f, -0.000064f, +0.000005f, +0.000028f, -0.000031f + }, + { + -0.001158f, -0.000132f, +0.003906f, -0.014033f, -0.000880f, -0.000408f, +0.003687f, -0.000949f, -0.000576f, +0.001298f, + +0.003105f, -0.001396f, -0.001737f, -0.000096f, +0.003996f, -0.004833f, -0.003147f, -0.002070f, -0.003379f, -0.001076f, + +0.000861f, -0.000500f, -0.000653f, -0.000462f, +0.001313f, -0.000415f, -0.000885f, +0.001072f, +0.000693f, -0.000398f, + -0.001228f, -0.001860f, -0.000925f, -0.000392f, -0.000128f, +0.000719f, -0.001132f, +0.001035f, +0.000483f, -0.000705f, + -0.000188f, +0.001599f, -0.000009f, -0.000690f, -0.000118f, -0.000795f, +0.000216f, -0.000373f, -0.001200f, -0.000735f, + +0.000294f, +0.000224f, +0.000966f, +0.000503f, +0.000266f, -0.000041f, +0.000134f, +0.000040f, -0.000131f, +0.000370f, + +0.000292f, +0.000011f, -0.000347f, -0.000232f, -0.000034f, -0.000254f, -0.000060f, +0.000233f, +0.000517f, +0.000352f, + +0.000022f, +0.000230f, -0.000103f, +0.000118f, -0.000142f, -0.000148f, -0.000100f, -0.000003f, +0.000027f, +0.000062f, + -0.000144f, +0.000072f, +0.000056f, +0.000073f, +0.000097f, +0.000024f, -0.000090f, -0.000043f, -0.000082f, -0.000058f, + +0.000059f, -0.000117f, -0.000036f, +0.000038f, +0.000006f, +0.000083f + }, + { + -0.001760f, -0.077741f, -0.015828f, +0.001445f, +0.003042f, +0.002412f, +0.012859f, -0.003857f, -0.000341f, -0.002450f, + +0.000513f, -0.000596f, -0.001808f, +0.001376f, -0.002216f, -0.000376f, -0.000711f, -0.003001f, +0.002044f, +0.001242f, + +0.000259f, -0.001048f, +0.000674f, +0.000547f, -0.000231f, -0.000006f, +0.000975f, -0.001190f, +0.000636f, +0.000274f, + +0.000552f, +0.003915f, +0.001373f, -0.001410f, -0.001211f, +0.001596f, -0.001605f, +0.000025f, +0.002275f, +0.000375f, + +0.000820f, +0.000304f, +0.000599f, +0.001284f, +0.001232f, +0.000863f, -0.000083f, +0.000511f, +0.000904f, -0.000341f, + +0.000111f, +0.000197f, +0.001017f, -0.000309f, -0.000358f, -0.000410f, -0.000155f, +0.000132f, +0.000450f, +0.000167f, + -0.000450f, +0.000019f, -0.000341f, -0.000531f, +0.000000f, +0.000026f, +0.000037f, +0.000055f, -0.000192f, -0.000132f, + -0.000142f, +0.000012f, +0.000060f, +0.000135f, +0.000017f, +0.000114f, +0.000068f, -0.000178f, -0.000087f, -0.000006f, + -0.000100f, +0.000228f, +0.000031f, -0.000072f, -0.000015f, -0.000003f, +0.000054f, -0.000000f, +0.000060f, -0.000014f, + +0.000049f, +0.000080f, -0.000058f, -0.000034f, +0.000001f, +0.000084f + }, + { + -0.001072f, -0.006721f, +0.003235f, +0.003314f, -0.001852f, +0.000900f, +0.001282f, -0.000383f, +0.000876f, -0.000695f, + -0.002319f, -0.002752f, -0.000894f, -0.007232f, +0.004062f, +0.004240f, +0.001225f, +0.000290f, +0.000767f, +0.002739f, + -0.002906f, -0.005664f, -0.001066f, +0.002551f, +0.002494f, -0.001645f, +0.002059f, +0.001113f, +0.003050f, +0.001014f, + +0.003395f, -0.000709f, +0.000177f, +0.000444f, -0.000579f, -0.000611f, -0.001221f, -0.000301f, +0.000730f, -0.000015f, + +0.000564f, -0.000808f, -0.000746f, +0.000973f, -0.000276f, +0.000364f, +0.000579f, +0.000356f, +0.000525f, +0.001070f, + +0.000227f, -0.000329f, -0.000119f, -0.000266f, +0.000280f, -0.000345f, -0.000199f, +0.000058f, +0.000251f, -0.000386f, + -0.000005f, +0.000290f, -0.000058f, -0.000124f, -0.000441f, +0.000254f, +0.000080f, +0.000026f, +0.000252f, +0.000032f, + +0.000322f, +0.000172f, -0.000097f, -0.000041f, +0.000091f, +0.000194f, +0.000247f, +0.000082f, -0.000147f, -0.000134f, + -0.000097f, -0.000066f, -0.000103f, -0.000098f, +0.000024f, +0.000027f, -0.000076f, -0.000031f, -0.000010f, -0.000075f, + -0.000031f, +0.000012f, +0.000022f, +0.000032f, -0.000056f, +0.000050f + }, + { + -0.005859f, -0.021042f, +0.009810f, +0.010058f, -0.003803f, +0.000974f, +0.002741f, +0.002015f, -0.001526f, -0.002333f, + -0.000371f, +0.002433f, -0.003653f, +0.010967f, +0.003578f, -0.002310f, +0.000393f, +0.000766f, +0.000860f, +0.001211f, + +0.002262f, +0.000650f, +0.001154f, +0.001954f, -0.000753f, -0.000690f, +0.000462f, +0.001030f, -0.001188f, -0.000598f, + -0.000678f, +0.000248f, -0.000385f, -0.001803f, -0.000528f, +0.001095f, +0.000924f, -0.001355f, -0.000941f, +0.000881f, + +0.000445f, +0.000083f, -0.000440f, -0.001445f, -0.000815f, -0.000696f, -0.000076f, -0.000654f, -0.000402f, +0.000084f, + +0.000477f, +0.000210f, +0.000248f, +0.000169f, +0.000265f, +0.000235f, +0.000624f, +0.000545f, +0.000176f, +0.000028f, + +0.000521f, -0.000477f, -0.000370f, -0.000297f, +0.000035f, +0.000061f, -0.000403f, -0.000031f, -0.000023f, +0.000287f, + +0.000062f, -0.000300f, +0.000099f, -0.000242f, -0.000003f, +0.000084f, +0.000175f, +0.000060f, -0.000112f, +0.000039f, + +0.000054f, +0.000043f, -0.000043f, -0.000038f, +0.000018f, +0.000163f, -0.000303f, -0.000122f, -0.000150f, -0.000111f, + -0.000119f, -0.000060f, +0.000058f, +0.000026f, +0.000106f, +0.000083f + }, + { + -0.000107f, -0.001873f, -0.000580f, +0.000018f, +0.000321f, +0.000669f, +0.001552f, -0.000025f, +0.001322f, -0.000429f, + +0.001419f, -0.000243f, -0.005055f, +0.004978f, +0.054047f, -0.000137f, -0.008447f, -0.002313f, +0.000681f, +0.005344f, + -0.005567f, -0.002368f, -0.002828f, +0.003473f, +0.001379f, -0.001816f, +0.001916f, +0.002605f, +0.003187f, +0.001183f, + -0.002659f, -0.000297f, -0.000772f, -0.000797f, +0.000386f, -0.000514f, +0.001230f, -0.001420f, +0.000473f, -0.000199f, + +0.000424f, +0.000573f, +0.000639f, -0.000296f, -0.000224f, +0.000611f, +0.000460f, +0.000831f, +0.000496f, +0.000057f, + -0.000162f, +0.000784f, -0.000215f, -0.000075f, +0.000656f, -0.000347f, -0.000384f, +0.000305f, +0.000051f, -0.000438f, + +0.000049f, +0.000084f, -0.000339f, -0.000046f, +0.000215f, +0.000282f, +0.000020f, -0.000071f, +0.000052f, +0.000301f, + -0.000238f, -0.000148f, +0.000050f, +0.000193f, -0.000238f, +0.000001f, +0.000304f, -0.000080f, +0.000207f, +0.000076f, + +0.000027f, +0.000169f, -0.000121f, -0.000118f, -0.000006f, -0.000041f, -0.000130f, -0.000114f, +0.000147f, -0.000125f, + +0.000054f, +0.000028f, +0.000067f, -0.000034f, +0.000039f, +0.000005f + }, + { + -0.004765f, -0.039106f, -0.008777f, +0.004586f, -0.002714f, +0.003316f, +0.001562f, -0.003118f, -0.001714f, +0.000715f, + +0.001168f, -0.000531f, +0.001122f, -0.007013f, -0.011719f, +0.006526f, +0.003834f, -0.002205f, -0.001904f, +0.000793f, + -0.000908f, +0.000639f, -0.000892f, +0.001095f, +0.001027f, -0.001023f, -0.000219f, -0.000965f, -0.001077f, -0.001115f, + -0.001416f, +0.000541f, -0.001439f, +0.000676f, -0.001628f, -0.001176f, -0.000756f, -0.000172f, +0.000898f, -0.000909f, + -0.000154f, -0.000307f, -0.000555f, +0.000008f, +0.000501f, +0.000977f, +0.000019f, -0.000873f, -0.000363f, +0.000377f, + -0.000739f, +0.000084f, +0.000967f, +0.001775f, -0.000041f, +0.000531f, -0.000462f, -0.000489f, -0.000243f, -0.000096f, + -0.000042f, -0.000193f, -0.000078f, +0.000010f, +0.000326f, -0.000423f, -0.000228f, +0.000003f, -0.000204f, -0.000060f, + +0.000089f, -0.000251f, -0.000438f, +0.000313f, +0.000063f, +0.000047f, +0.000000f, -0.000108f, +0.000381f, -0.000043f, + -0.000253f, +0.000169f, +0.000159f, -0.000098f, +0.000017f, +0.000054f, +0.000033f, -0.000115f, +0.000121f, +0.000029f, + -0.000083f, +0.000012f, +0.000030f, -0.000108f, -0.000008f, +0.000020f + } + }, + { + { + -0.000784f, -0.025572f, +0.007801f, -0.003085f, +0.000486f, -0.000120f, -0.001020f, +0.000438f, -0.000604f, +0.000805f, + -0.003372f, -0.001568f, -0.002434f, -0.004570f, +0.003965f, -0.003849f, -0.005103f, +0.001788f, +0.000469f, +0.002589f, + +0.002673f, -0.000284f, +0.000337f, +0.000218f, -0.001010f, +0.001593f, +0.000224f, -0.000657f, -0.000695f, -0.002249f, + -0.001538f, -0.000544f, +0.000033f, -0.001883f, +0.000533f, -0.000842f, +0.000301f, -0.003446f, +0.001109f, -0.000234f, + +0.000249f, -0.000188f, -0.000480f, -0.000277f, +0.001119f, +0.000369f, -0.000572f, -0.000130f, +0.000195f, -0.000690f, + +0.000075f, +0.000216f, -0.000413f, +0.000494f, -0.000037f, -0.000099f, -0.000414f, -0.000201f, +0.000464f, +0.000332f, + +0.000044f, +0.000446f, +0.000156f, -0.000220f, +0.000071f, -0.000017f, -0.000410f, -0.000074f, -0.000103f, +0.000014f, + -0.000234f, -0.000074f, +0.000070f, -0.000116f, +0.000117f, -0.000054f, -0.000050f, -0.000043f, +0.000032f, -0.000088f, + -0.000074f, +0.000101f, +0.000152f, +0.000216f, +0.000052f, -0.000195f, -0.000082f, -0.000079f, +0.000119f, -0.000078f, + +0.000094f, +0.000055f, +0.000050f, -0.000024f, -0.000081f, +0.000012f + }, + { + -0.006996f, +0.057143f, +0.006871f, -0.006472f, +0.001360f, +0.000787f, +0.000058f, -0.000307f, +0.000828f, +0.001425f, + -0.000187f, +0.002178f, -0.000553f, -0.001016f, +0.000882f, -0.002462f, +0.002230f, -0.000862f, +0.005786f, -0.002257f, + -0.000481f, -0.000073f, -0.001189f, +0.000237f, +0.001412f, -0.000076f, -0.000164f, -0.000316f, +0.001114f, +0.001505f, + -0.000427f, -0.000482f, +0.000949f, +0.000498f, -0.000461f, -0.001159f, +0.000862f, -0.000685f, -0.000917f, -0.000229f, + +0.001397f, +0.000707f, +0.000761f, -0.000130f, +0.000335f, -0.000486f, +0.000496f, -0.000743f, -0.000898f, +0.000138f, + -0.000074f, -0.000025f, +0.000332f, +0.000280f, +0.000256f, -0.000363f, -0.000098f, +0.000508f, -0.000104f, +0.000146f, + +0.000396f, -0.000105f, +0.000355f, +0.000036f, +0.000053f, -0.000062f, -0.000162f, +0.000458f, -0.000008f, -0.000184f, + +0.000173f, -0.000250f, -0.000018f, +0.000000f, -0.000217f, +0.000098f, +0.000076f, +0.000030f, -0.000100f, +0.000036f, + +0.000045f, -0.000096f, +0.000047f, +0.000035f, +0.000055f, -0.000112f, +0.000085f, +0.000064f, -0.000036f, +0.000085f, + -0.000032f, -0.000119f, +0.000117f, -0.000079f, +0.000088f, -0.000028f + }, + { + -0.008038f, +0.052943f, +0.019580f, +0.013208f, -0.000612f, -0.000174f, -0.000301f, -0.000215f, -0.000390f, -0.000760f, + +0.000060f, +0.000101f, +0.001615f, +0.000670f, -0.000915f, -0.004580f, -0.000338f, -0.000788f, -0.000378f, +0.000731f, + -0.005226f, -0.001227f, -0.000860f, +0.000700f, +0.000949f, -0.000584f, +0.000936f, -0.000090f, -0.001192f, -0.000455f, + +0.001324f, +0.000246f, +0.001558f, -0.001429f, +0.002156f, -0.000550f, +0.000739f, -0.000719f, -0.000170f, -0.000112f, + -0.000912f, +0.000458f, +0.000824f, +0.000379f, +0.001036f, +0.000111f, +0.001166f, -0.000136f, +0.000280f, +0.000141f, + -0.000812f, -0.000041f, +0.000872f, -0.000195f, -0.000492f, +0.000170f, +0.000172f, -0.000003f, +0.000271f, -0.000510f, + +0.000380f, +0.000694f, -0.000048f, -0.000330f, -0.000002f, +0.000074f, -0.000021f, -0.000156f, -0.000062f, +0.000055f, + -0.000100f, -0.000189f, +0.000015f, +0.000234f, +0.000007f, -0.000080f, -0.000049f, +0.000084f, -0.000050f, -0.000210f, + -0.000004f, +0.000091f, -0.000020f, -0.000068f, +0.000080f, +0.000051f, -0.000075f, -0.000008f, -0.000022f, -0.000020f, + +0.000040f, -0.000033f, +0.000083f, +0.000010f, -0.000027f, +0.000062f + }, + { + +0.000729f, +0.005057f, -0.000004f, +0.000066f, -0.000005f, -0.000459f, +0.000110f, +0.000680f, -0.000057f, -0.000586f, + +0.000140f, -0.001349f, +0.000972f, -0.000236f, -0.008938f, -0.000208f, +0.001494f, +0.002951f, -0.003130f, -0.002883f, + +0.001527f, -0.001767f, -0.000207f, +0.000711f, +0.000022f, +0.000341f, +0.001733f, -0.000732f, -0.000342f, -0.001448f, + -0.000234f, +0.001852f, -0.000009f, +0.000799f, -0.001372f, -0.000727f, -0.000300f, +0.000139f, +0.000509f, -0.000597f, + +0.000573f, +0.000393f, +0.000257f, +0.000042f, -0.000595f, +0.000314f, -0.000120f, -0.000622f, +0.000155f, +0.000160f, + -0.000116f, +0.000090f, +0.000150f, +0.000154f, +0.000334f, -0.000599f, +0.000103f, -0.000144f, +0.000305f, +0.000113f, + -0.000229f, +0.000256f, -0.000064f, -0.000174f, +0.000003f, +0.000037f, -0.000039f, +0.000222f, -0.000115f, +0.000122f, + -0.000344f, -0.000100f, -0.000128f, +0.000135f, -0.000164f, -0.000058f, +0.000206f, +0.000094f, -0.000113f, -0.000038f, + -0.000087f, +0.000071f, +0.000087f, +0.000032f, +0.000003f, -0.000051f, -0.000066f, +0.000078f, +0.000114f, -0.000010f, + -0.000024f, +0.000061f, +0.000060f, +0.000012f, -0.000022f, +0.000079f + }, + { + +0.001099f, +0.079827f, -0.000383f, -0.006837f, +0.001699f, -0.000473f, -0.000502f, -0.000584f, -0.000181f, -0.000298f, + +0.003575f, -0.001223f, +0.001397f, -0.000333f, -0.000451f, +0.003150f, +0.001080f, -0.008090f, -0.001587f, +0.001828f, + +0.001149f, -0.000332f, -0.002545f, -0.002081f, +0.000682f, -0.000586f, +0.001531f, +0.000442f, -0.001362f, -0.000013f, + -0.000620f, -0.000813f, -0.000501f, +0.001286f, -0.000113f, +0.001294f, -0.000042f, -0.000869f, +0.000767f, -0.000152f, + +0.000204f, +0.000439f, -0.000690f, +0.000757f, -0.000473f, -0.000217f, +0.000112f, +0.000462f, -0.000462f, +0.001084f, + +0.000242f, +0.000217f, +0.000034f, -0.000244f, -0.000747f, +0.000525f, +0.000151f, -0.000771f, -0.000466f, +0.000258f, + -0.000080f, +0.000198f, +0.000116f, -0.000280f, -0.000134f, -0.000007f, -0.000342f, -0.000029f, -0.000280f, -0.000043f, + +0.000029f, -0.000201f, -0.000221f, +0.000271f, +0.000113f, -0.000105f, +0.000059f, +0.000011f, -0.000046f, -0.000099f, + -0.000026f, -0.000053f, +0.000059f, -0.000086f, -0.000191f, +0.000088f, +0.000001f, -0.000005f, -0.000073f, -0.000065f, + +0.000125f, -0.000059f, -0.000096f, +0.000029f, +0.000023f, +0.000072f + }, + { + -0.000021f, -0.001403f, -0.003886f, -0.001099f, -0.000194f, -0.000023f, +0.000140f, +0.000415f, -0.000472f, -0.000436f, + -0.000190f, +0.000220f, -0.000446f, +0.003512f, +0.003761f, -0.002498f, -0.004863f, +0.000377f, -0.003177f, -0.013348f, + +0.004929f, -0.000299f, +0.002784f, -0.002016f, +0.000145f, -0.003258f, +0.002488f, -0.002059f, +0.001338f, +0.001136f, + +0.002243f, -0.000005f, -0.000415f, +0.001322f, +0.000127f, -0.000600f, +0.000319f, +0.000024f, +0.000931f, -0.000643f, + +0.001319f, +0.000342f, +0.000363f, +0.000361f, +0.000054f, +0.000429f, +0.000090f, -0.000501f, +0.000456f, +0.000095f, + +0.000323f, -0.000396f, -0.000403f, +0.000689f, +0.000280f, -0.000010f, -0.000224f, -0.000164f, +0.000209f, +0.000112f, + -0.000256f, +0.000534f, -0.000062f, -0.000545f, -0.000076f, +0.000033f, +0.000101f, +0.000044f, -0.000099f, -0.000082f, + +0.000307f, +0.000149f, +0.000185f, +0.000217f, +0.000008f, -0.000054f, +0.000256f, +0.000122f, -0.000004f, -0.000085f, + -0.000048f, +0.000107f, -0.000151f, -0.000047f, +0.000105f, -0.000008f, +0.000006f, -0.000058f, +0.000009f, -0.000017f, + -0.000032f, -0.000052f, +0.000082f, +0.000042f, -0.000036f, -0.000123f + }, + { + -0.022967f, +0.115758f, +0.003593f, -0.002072f, -0.000203f, -0.000067f, -0.000039f, -0.000613f, -0.001187f, -0.001742f, + -0.000431f, +0.000407f, +0.002229f, -0.001965f, -0.000802f, -0.002302f, -0.000167f, +0.000810f, -0.000729f, -0.000463f, + -0.000380f, +0.000280f, +0.000556f, -0.000629f, +0.000056f, -0.000329f, +0.000722f, -0.001929f, -0.001354f, -0.001170f, + +0.001015f, +0.001665f, +0.000252f, +0.000271f, -0.001314f, -0.000934f, +0.000382f, +0.000061f, -0.000461f, +0.001013f, + -0.000156f, +0.000977f, -0.000528f, +0.000224f, +0.000650f, -0.000004f, -0.000144f, +0.000401f, +0.000216f, -0.000365f, + -0.000019f, -0.000646f, -0.000109f, +0.000523f, +0.000615f, +0.000292f, -0.000220f, +0.000039f, +0.000664f, +0.000072f, + -0.000674f, +0.000133f, +0.000352f, -0.000162f, -0.000219f, -0.000025f, +0.000288f, +0.000138f, +0.000002f, -0.000014f, + -0.000075f, -0.000270f, +0.000206f, +0.000060f, +0.000156f, -0.000033f, -0.000014f, +0.000146f, -0.000026f, +0.000109f, + -0.000104f, -0.000117f, +0.000215f, -0.000007f, -0.000267f, +0.000064f, +0.000024f, +0.000100f, -0.000036f, -0.000056f, + +0.000018f, +0.000043f, +0.000077f, -0.000028f, +0.000014f, +0.000050f + }, + { + +0.000435f, -0.000346f, +0.001023f, -0.001556f, +0.000804f, -0.000109f, +0.000222f, +0.000144f, -0.000807f, +0.000174f, + -0.000883f, -0.000710f, -0.000104f, -0.002824f, -0.002321f, -0.002076f, +0.003524f, -0.000938f, +0.001621f, -0.001118f, + +0.000358f, +0.001731f, +0.000840f, -0.000579f, -0.002047f, +0.002440f, -0.000224f, -0.000807f, -0.000639f, +0.001890f, + -0.000672f, +0.001244f, +0.000535f, -0.000713f, -0.001028f, +0.000858f, +0.000386f, -0.000114f, +0.000197f, +0.000445f, + +0.000125f, -0.000334f, +0.000278f, +0.000215f, +0.000102f, -0.000293f, +0.000573f, +0.000151f, -0.000982f, -0.000287f, + +0.000331f, -0.000193f, -0.000606f, +0.000220f, +0.000576f, -0.000265f, -0.000334f, -0.000154f, -0.000414f, +0.000877f, + +0.000398f, +0.000393f, +0.000561f, +0.000313f, +0.000023f, +0.000179f, +0.000016f, +0.000056f, -0.000002f, -0.000030f, + +0.000161f, +0.000123f, -0.000135f, +0.000071f, +0.000077f, +0.000005f, +0.000147f, +0.000080f, -0.000039f, +0.000039f, + -0.000067f, -0.000221f, +0.000071f, -0.000041f, +0.000120f, -0.000061f, +0.000125f, -0.000033f, +0.000023f, +0.000070f, + +0.000057f, +0.000077f, -0.000015f, +0.000003f, -0.000024f, +0.000024f + }, + { + +0.021497f, -0.016968f, -0.008415f, +0.001035f, -0.001349f, -0.000257f, -0.000410f, -0.001047f, -0.000288f, +0.001934f, + -0.000774f, -0.002291f, +0.000502f, +0.000426f, +0.000633f, +0.000411f, +0.000217f, -0.001314f, -0.000709f, -0.000451f, + -0.000511f, -0.001077f, +0.000562f, +0.000405f, +0.000182f, +0.000179f, +0.000348f, +0.001248f, +0.002055f, +0.000796f, + -0.001244f, -0.000779f, -0.000392f, -0.000022f, -0.000820f, +0.001595f, -0.000053f, +0.000988f, -0.002803f, -0.000200f, + +0.000563f, +0.001335f, -0.000586f, +0.000846f, -0.000532f, +0.000413f, -0.000283f, -0.001442f, +0.000319f, -0.000237f, + +0.000374f, -0.000301f, -0.000382f, +0.000495f, -0.000337f, +0.000054f, -0.000253f, -0.000264f, +0.000279f, -0.000097f, + +0.000453f, +0.000591f, -0.000312f, +0.000226f, -0.000160f, +0.000215f, +0.000347f, +0.000427f, -0.000158f, -0.000020f, + -0.000240f, +0.000089f, +0.000031f, -0.000167f, +0.000178f, -0.000021f, -0.000237f, +0.000437f, +0.000017f, -0.000005f, + +0.000079f, -0.000203f, -0.000108f, -0.000198f, -0.000005f, -0.000029f, -0.000006f, +0.000089f, +0.000113f, +0.000042f, + -0.000127f, -0.000058f, -0.000076f, +0.000084f, -0.000010f, +0.000009f + }, + { + +0.001037f, +0.002351f, +0.007964f, -0.006410f, +0.003154f, +0.003263f, +0.004973f, -0.001213f, -0.000323f, -0.000353f, + +0.000269f, -0.002244f, +0.002057f, +0.000496f, +0.004050f, -0.002878f, -0.002564f, -0.000533f, -0.002930f, -0.001935f, + -0.000496f, +0.001750f, -0.000362f, +0.000298f, +0.001206f, +0.000227f, -0.000234f, +0.000956f, -0.000888f, +0.000934f, + +0.000108f, -0.000525f, -0.000673f, +0.000513f, +0.001032f, +0.001508f, -0.000306f, +0.001172f, +0.000342f, +0.000064f, + -0.000428f, +0.000508f, -0.000288f, -0.000255f, +0.000737f, -0.000930f, +0.000449f, -0.000314f, -0.000443f, -0.000256f, + +0.000702f, -0.000014f, +0.000301f, -0.000422f, -0.000502f, -0.000563f, -0.000156f, -0.000018f, -0.000069f, +0.000125f, + -0.000010f, +0.000282f, -0.000030f, -0.000066f, -0.000063f, -0.000251f, +0.000121f, +0.000383f, +0.000269f, -0.000068f, + +0.000049f, -0.000041f, -0.000297f, +0.000173f, -0.000167f, -0.000012f, -0.000181f, -0.000046f, -0.000044f, -0.000053f, + -0.000131f, +0.000034f, +0.000088f, -0.000027f, +0.000098f, -0.000029f, -0.000056f, +0.000073f, -0.000040f, +0.000087f, + +0.000021f, -0.000001f, +0.000026f, +0.000059f, +0.000041f, +0.000049f + }, + { + +0.005877f, -0.056500f, +0.002816f, +0.006700f, +0.001876f, -0.004413f, -0.002997f, -0.004858f, +0.000613f, +0.000293f, + +0.000169f, +0.000113f, -0.000976f, +0.001524f, -0.001192f, -0.002006f, -0.002870f, -0.002598f, +0.001438f, +0.000335f, + -0.000430f, -0.000021f, -0.000455f, +0.000313f, +0.000303f, +0.000243f, +0.001100f, -0.000613f, +0.000807f, +0.000497f, + -0.000576f, +0.001241f, -0.000497f, -0.000954f, -0.000384f, +0.000436f, -0.001302f, -0.000768f, +0.000202f, +0.000656f, + +0.000573f, -0.000713f, +0.000221f, +0.000143f, +0.000252f, +0.000027f, -0.000791f, +0.000289f, +0.000909f, -0.000418f, + +0.000263f, -0.000010f, +0.000511f, -0.000459f, -0.000100f, -0.000750f, -0.000048f, +0.000530f, +0.000335f, -0.000143f, + -0.000612f, +0.000104f, -0.000012f, -0.000194f, +0.000407f, +0.000070f, -0.000007f, -0.000137f, -0.000192f, -0.000022f, + -0.000035f, +0.000045f, +0.000157f, +0.000191f, -0.000105f, +0.000041f, +0.000107f, -0.000250f, -0.000053f, -0.000028f, + +0.000093f, +0.000172f, -0.000100f, +0.000141f, -0.000030f, +0.000102f, -0.000004f, +0.000057f, +0.000048f, -0.000065f, + +0.000073f, +0.000031f, -0.000126f, +0.000011f, +0.000073f, +0.000033f + }, + { + +0.000691f, -0.009124f, -0.002606f, +0.001524f, -0.000041f, -0.000186f, -0.000166f, -0.000699f, +0.000563f, -0.000398f, + -0.001084f, -0.001493f, +0.002742f, -0.004618f, -0.003227f, +0.002893f, +0.001082f, +0.000297f, -0.001061f, +0.000887f, + -0.000265f, -0.002933f, -0.000525f, +0.000818f, +0.002138f, +0.000524f, +0.000201f, -0.001916f, -0.000013f, +0.000166f, + +0.000370f, -0.001507f, -0.000969f, +0.001975f, -0.000583f, -0.000032f, -0.000426f, +0.000860f, +0.000389f, -0.000039f, + +0.000234f, -0.000379f, +0.000119f, +0.000571f, -0.000471f, +0.000497f, +0.000200f, +0.000196f, -0.000091f, +0.000534f, + -0.000051f, -0.000178f, +0.000412f, -0.000001f, +0.000173f, -0.000217f, -0.000266f, +0.000014f, +0.000508f, -0.000349f, + +0.000467f, +0.000108f, -0.000135f, -0.000188f, -0.000222f, +0.000524f, +0.000107f, +0.000180f, +0.000032f, -0.000099f, + +0.000301f, +0.000095f, -0.000124f, -0.000048f, -0.000065f, +0.000028f, +0.000096f, -0.000149f, -0.000101f, -0.000108f, + -0.000054f, +0.000025f, -0.000129f, -0.000155f, +0.000025f, -0.000080f, -0.000089f, -0.000011f, +0.000060f, -0.000014f, + -0.000022f, +0.000073f, +0.000028f, -0.000076f, -0.000048f, +0.000073f + }, + { + +0.004403f, -0.015490f, -0.002756f, +0.001344f, -0.002619f, +0.003416f, -0.000868f, +0.000433f, -0.001082f, +0.000486f, + -0.000895f, +0.001094f, -0.001390f, +0.009125f, +0.001932f, -0.001869f, +0.001686f, -0.000430f, -0.002353f, +0.001915f, + +0.000550f, -0.000580f, -0.000210f, +0.001131f, -0.000390f, +0.002224f, -0.000320f, +0.000071f, +0.000758f, -0.000025f, + -0.000561f, +0.000216f, +0.001517f, -0.000137f, +0.000295f, +0.001062f, +0.001038f, -0.000656f, +0.000156f, +0.000569f, + -0.000935f, -0.000526f, +0.000708f, -0.000266f, -0.000154f, -0.000528f, +0.000373f, -0.000960f, +0.000056f, -0.000412f, + -0.000124f, +0.000132f, +0.000218f, +0.000655f, -0.000083f, -0.000066f, -0.000195f, -0.000075f, -0.000039f, +0.000118f, + +0.000318f, -0.000395f, -0.000033f, -0.000079f, -0.000118f, +0.000074f, -0.000182f, -0.000107f, +0.000283f, +0.000270f, + -0.000231f, -0.000131f, +0.000283f, -0.000154f, +0.000023f, +0.000092f, +0.000105f, +0.000170f, -0.000012f, +0.000055f, + -0.000167f, +0.000046f, +0.000154f, +0.000011f, -0.000099f, -0.000086f, -0.000334f, +0.000038f, -0.000076f, +0.000012f, + -0.000018f, +0.000003f, +0.000131f, -0.000053f, +0.000079f, -0.000009f + }, + { + +0.000528f, -0.001415f, +0.001135f, -0.000480f, -0.000412f, -0.000509f, -0.000087f, -0.000750f, +0.000432f, -0.002128f, + +0.000498f, -0.000579f, -0.002609f, -0.011920f, +0.018061f, -0.004564f, -0.003033f, +0.000009f, +0.002524f, +0.005250f, + -0.002003f, +0.001230f, -0.001636f, +0.002599f, +0.000410f, +0.000582f, +0.002584f, +0.000746f, -0.002586f, +0.000936f, + -0.000554f, +0.000430f, +0.000600f, -0.000302f, -0.000741f, -0.001023f, +0.000097f, -0.001022f, +0.000747f, -0.000663f, + +0.001108f, +0.000269f, -0.000467f, -0.000482f, -0.000401f, -0.000362f, -0.000085f, -0.000132f, +0.000081f, -0.000456f, + -0.000070f, +0.000516f, -0.000343f, -0.000156f, +0.000292f, -0.000403f, -0.000024f, +0.000498f, +0.000459f, -0.000246f, + +0.000496f, +0.000041f, -0.000165f, -0.000107f, +0.000120f, -0.000196f, -0.000172f, +0.000095f, +0.000089f, +0.000216f, + -0.000179f, +0.000094f, +0.000079f, +0.000144f, -0.000067f, +0.000138f, +0.000002f, +0.000075f, -0.000055f, +0.000003f, + +0.000138f, +0.000011f, +0.000045f, -0.000060f, -0.000107f, -0.000045f, -0.000034f, +0.000084f, +0.000052f, -0.000099f, + +0.000110f, -0.000044f, -0.000076f, +0.000011f, +0.000052f, -0.000062f + }, + { + +0.007737f, -0.014121f, +0.000270f, +0.009152f, -0.000532f, +0.001949f, -0.002082f, -0.001105f, +0.000796f, +0.000654f, + +0.002619f, +0.000382f, -0.000377f, +0.002796f, +0.006061f, +0.003961f, -0.000854f, -0.000490f, -0.000772f, -0.000166f, + -0.002525f, +0.001692f, -0.000463f, +0.001276f, +0.000712f, -0.001381f, +0.001583f, +0.002366f, +0.000284f, -0.001116f, + -0.000657f, +0.000887f, -0.001403f, +0.000404f, -0.001282f, +0.000702f, +0.000579f, +0.000447f, +0.001226f, +0.000277f, + +0.002178f, +0.000358f, -0.000620f, +0.000389f, +0.000478f, -0.000031f, +0.000389f, +0.000345f, +0.000323f, +0.000627f, + -0.000595f, -0.000086f, +0.000260f, +0.000458f, -0.000445f, +0.000212f, -0.000317f, -0.000238f, -0.000613f, -0.000095f, + -0.000005f, -0.000402f, -0.000195f, -0.000031f, +0.000335f, -0.000404f, -0.000031f, +0.000112f, -0.000073f, -0.000008f, + +0.000084f, -0.000080f, -0.000080f, +0.000162f, -0.000057f, +0.000028f, -0.000047f, -0.000059f, +0.000181f, -0.000174f, + -0.000095f, +0.000174f, +0.000057f, -0.000023f, +0.000090f, +0.000093f, +0.000029f, +0.000040f, -0.000009f, -0.000029f, + -0.000012f, -0.000003f, +0.000035f, -0.000016f, +0.000016f, +0.000008f + } + }, + { + { + +0.001334f, -0.007753f, -0.011840f, -0.002263f, +0.000256f, -0.000754f, -0.000088f, +0.000316f, -0.000266f, -0.001733f, + -0.002848f, -0.001427f, -0.003560f, -0.002394f, +0.002613f, -0.002694f, +0.000317f, -0.002351f, -0.001326f, +0.003025f, + +0.001833f, -0.001321f, -0.002479f, -0.002113f, -0.001298f, +0.001282f, +0.002356f, -0.000616f, -0.000758f, -0.001688f, + -0.001629f, -0.000453f, -0.003791f, +0.000910f, -0.000265f, +0.000462f, +0.000105f, -0.001771f, +0.001633f, -0.001135f, + +0.000437f, -0.001156f, +0.000387f, -0.000581f, +0.000971f, +0.000475f, +0.000156f, +0.000595f, +0.000230f, -0.000520f, + -0.000665f, +0.000199f, -0.000278f, +0.000119f, -0.000111f, -0.000145f, +0.000030f, -0.000133f, +0.000914f, -0.000127f, + +0.000051f, +0.000022f, +0.000032f, +0.000021f, -0.000028f, -0.000296f, -0.000283f, +0.000010f, -0.000216f, -0.000185f, + -0.000255f, -0.000019f, +0.000079f, +0.000034f, +0.000025f, +0.000078f, +0.000007f, +0.000026f, -0.000109f, -0.000064f, + -0.000049f, +0.000119f, -0.000019f, -0.000027f, -0.000072f, -0.000065f, +0.000085f, -0.000046f, -0.000003f, +0.000044f, + +0.000129f, -0.000022f, +0.000037f, +0.000045f, +0.000009f, +0.000076f + }, + { + +0.005304f, +0.074682f, -0.018461f, -0.000582f, +0.001260f, +0.000091f, +0.000903f, +0.002273f, +0.001638f, +0.001318f, + +0.001262f, +0.000378f, +0.000282f, -0.000711f, +0.000464f, +0.001425f, +0.002996f, +0.001349f, -0.000543f, -0.000025f, + -0.001018f, +0.000670f, -0.000368f, -0.000718f, +0.000706f, +0.000247f, +0.000574f, +0.000369f, +0.000810f, +0.000540f, + +0.000282f, -0.000028f, +0.001121f, +0.001079f, -0.000489f, -0.001734f, +0.000449f, +0.000363f, +0.000408f, +0.000661f, + +0.001344f, +0.000441f, -0.000816f, -0.000198f, +0.000236f, -0.000203f, +0.000489f, -0.000281f, -0.000199f, -0.000336f, + +0.000034f, +0.000148f, -0.000142f, -0.000087f, +0.000154f, -0.000134f, +0.000025f, -0.000416f, +0.000159f, +0.000151f, + -0.000016f, -0.000106f, +0.000280f, -0.000009f, +0.000245f, +0.000077f, +0.000146f, +0.000115f, -0.000240f, -0.000040f, + +0.000004f, -0.000058f, +0.000143f, -0.000087f, -0.000078f, +0.000207f, -0.000145f, +0.000064f, +0.000200f, -0.000044f, + -0.000025f, -0.000058f, +0.000059f, +0.000011f, -0.000103f, +0.000010f, +0.000126f, -0.000086f, +0.000028f, -0.000005f, + +0.000023f, -0.000016f, -0.000007f, -0.000031f, +0.000041f, -0.000040f + }, + { + +0.004429f, +0.076451f, -0.006205f, +0.006976f, -0.005058f, -0.000151f, +0.000297f, -0.000226f, +0.000290f, +0.000027f, + +0.000786f, +0.000682f, -0.000909f, +0.001815f, -0.001017f, -0.002541f, -0.003012f, +0.000638f, -0.000346f, -0.001462f, + -0.000624f, -0.001197f, -0.000399f, +0.000518f, -0.000077f, -0.001165f, +0.000661f, +0.000985f, +0.000206f, -0.000663f, + -0.001553f, +0.001628f, -0.000531f, -0.000135f, +0.001615f, -0.000082f, -0.000254f, +0.000400f, -0.000780f, +0.000160f, + -0.000745f, -0.000104f, +0.001426f, -0.000335f, +0.000300f, +0.001221f, +0.001158f, -0.000229f, -0.000074f, -0.000494f, + -0.000367f, +0.000418f, +0.000541f, -0.000493f, +0.000463f, -0.000555f, +0.000049f, -0.000195f, +0.000043f, +0.000004f, + +0.000188f, +0.000188f, -0.000053f, -0.000332f, -0.000242f, -0.000013f, -0.000229f, -0.000177f, +0.000005f, -0.000139f, + -0.000243f, -0.000063f, -0.000016f, -0.000066f, +0.000112f, -0.000098f, -0.000045f, -0.000002f, +0.000150f, -0.000050f, + -0.000033f, -0.000040f, -0.000002f, -0.000085f, -0.000001f, +0.000166f, -0.000039f, +0.000073f, +0.000023f, +0.000061f, + +0.000011f, -0.000067f, -0.000009f, -0.000035f, -0.000009f, +0.000027f + }, + { + -0.000885f, +0.005728f, +0.001165f, -0.000029f, -0.000495f, +0.000213f, +0.000078f, +0.000448f, +0.000285f, -0.000336f, + -0.000096f, -0.000418f, +0.000539f, -0.002426f, +0.000213f, -0.002681f, -0.000932f, +0.002836f, -0.000504f, -0.002729f, + +0.001703f, +0.000976f, -0.000892f, +0.000570f, -0.000937f, +0.000121f, +0.004260f, -0.001513f, -0.001365f, +0.002217f, + -0.000811f, -0.000117f, -0.000033f, +0.000913f, -0.000874f, -0.000114f, -0.001255f, +0.000479f, +0.000311f, -0.000295f, + +0.000554f, -0.000193f, +0.000557f, +0.000371f, +0.000090f, +0.000212f, -0.000951f, -0.000235f, +0.000008f, -0.000322f, + +0.000133f, +0.000269f, -0.000337f, +0.000000f, +0.000058f, -0.000618f, +0.000196f, +0.000180f, -0.000079f, +0.000471f, + +0.000114f, -0.000209f, -0.000108f, -0.000030f, -0.000134f, -0.000129f, -0.000000f, +0.000151f, -0.000203f, -0.000056f, + +0.000016f, +0.000110f, +0.000073f, -0.000253f, -0.000001f, -0.000078f, +0.000010f, -0.000025f, -0.000242f, +0.000022f, + +0.000019f, -0.000022f, -0.000026f, +0.000016f, -0.000051f, +0.000058f, -0.000003f, -0.000017f, -0.000042f, -0.000022f, + +0.000054f, -0.000005f, -0.000095f, -0.000071f, +0.000022f, -0.000050f + }, + { + +0.009158f, +0.062902f, +0.002527f, -0.004743f, +0.000216f, -0.000164f, -0.001178f, -0.001082f, +0.000721f, +0.000437f, + +0.000840f, -0.001016f, +0.002398f, +0.000584f, -0.000119f, +0.001497f, -0.002836f, -0.005021f, +0.000900f, +0.000819f, + +0.001514f, -0.000164f, -0.001599f, -0.001076f, +0.000705f, -0.000491f, -0.000115f, +0.000781f, +0.000438f, +0.000021f, + -0.000106f, -0.000906f, -0.000572f, -0.000198f, +0.000672f, +0.002183f, -0.000633f, +0.001162f, +0.000163f, -0.000182f, + +0.001010f, -0.000092f, +0.000661f, -0.000709f, +0.000183f, -0.000409f, -0.000243f, -0.000052f, +0.000061f, +0.000332f, + +0.000217f, +0.000298f, -0.000184f, -0.000382f, +0.000117f, +0.000066f, -0.000130f, -0.000537f, +0.000296f, -0.000110f, + -0.000019f, +0.000397f, +0.000113f, -0.000229f, -0.000134f, -0.000253f, -0.000092f, -0.000133f, -0.000197f, -0.000197f, + +0.000011f, -0.000004f, +0.000125f, +0.000289f, -0.000051f, -0.000052f, -0.000126f, -0.000257f, +0.000060f, -0.000110f, + -0.000022f, -0.000075f, -0.000012f, -0.000155f, +0.000089f, +0.000061f, -0.000090f, +0.000072f, -0.000005f, -0.000003f, + +0.000065f, +0.000033f, +0.000046f, +0.000066f, +0.000078f, +0.000019f + }, + { + +0.000500f, -0.008590f, -0.000997f, -0.000664f, +0.000082f, +0.000196f, +0.000134f, -0.000038f, -0.000442f, -0.000514f, + +0.000355f, +0.000178f, +0.000116f, +0.003629f, +0.011167f, -0.005710f, -0.004163f, -0.001295f, -0.000834f, -0.008892f, + -0.002704f, +0.001411f, +0.001392f, -0.003466f, +0.001288f, +0.001432f, -0.001464f, +0.002449f, -0.001156f, +0.000821f, + +0.001177f, +0.001043f, -0.000519f, -0.000424f, +0.000341f, -0.000252f, -0.000567f, -0.000148f, +0.000517f, +0.000143f, + +0.000120f, +0.000360f, +0.000732f, +0.000657f, -0.000433f, +0.000179f, +0.000333f, +0.000361f, +0.000525f, +0.000270f, + -0.000315f, -0.000391f, -0.000114f, +0.000700f, +0.000174f, -0.000290f, -0.000117f, -0.000053f, +0.000166f, +0.000126f, + -0.000207f, +0.000419f, -0.000153f, -0.000387f, -0.000171f, -0.000156f, +0.000173f, +0.000111f, -0.000038f, +0.000101f, + +0.000261f, -0.000042f, +0.000176f, +0.000128f, +0.000066f, -0.000166f, -0.000076f, -0.000096f, -0.000031f, +0.000067f, + -0.000016f, -0.000087f, +0.000023f, -0.000070f, +0.000098f, -0.000003f, -0.000038f, +0.000007f, -0.000079f, -0.000035f, + +0.000094f, +0.000043f, -0.000019f, -0.000075f, -0.000077f, -0.000024f + }, + { + +0.025753f, +0.064043f, -0.009729f, -0.001034f, +0.000151f, -0.000295f, +0.000233f, -0.001118f, -0.001201f, +0.000226f, + -0.000981f, +0.000199f, +0.000548f, -0.001147f, -0.001485f, -0.001932f, +0.000936f, -0.000977f, +0.000142f, +0.000528f, + +0.001126f, +0.000388f, -0.000726f, +0.000511f, -0.000437f, +0.000219f, -0.000271f, -0.001478f, -0.000271f, -0.000341f, + +0.001063f, +0.000667f, +0.000291f, -0.000394f, -0.001038f, +0.000164f, -0.000508f, +0.000475f, -0.000363f, +0.000746f, + +0.000555f, -0.000150f, +0.000324f, +0.000536f, +0.000050f, +0.000179f, +0.000385f, +0.001008f, -0.000329f, +0.000037f, + +0.000138f, -0.000192f, +0.000561f, -0.000069f, +0.000461f, -0.000019f, -0.000392f, +0.000266f, -0.000073f, -0.000185f, + -0.000187f, +0.000046f, +0.000092f, -0.000026f, -0.000047f, -0.000042f, -0.000238f, +0.000227f, +0.000117f, -0.000242f, + +0.000077f, +0.000165f, -0.000126f, -0.000070f, +0.000042f, +0.000070f, -0.000020f, -0.000012f, +0.000093f, -0.000074f, + -0.000070f, +0.000010f, +0.000030f, -0.000118f, +0.000026f, +0.000050f, -0.000018f, -0.000013f, +0.000024f, +0.000031f, + -0.000071f, -0.000003f, +0.000035f, +0.000051f, +0.000088f, +0.000083f + }, + { + +0.000619f, +0.001377f, -0.004807f, +0.000464f, +0.000037f, +0.000305f, +0.000291f, +0.000014f, -0.000252f, -0.000547f, + +0.000285f, -0.000319f, +0.001111f, +0.000566f, +0.000167f, -0.003353f, -0.000980f, +0.001734f, +0.000306f, -0.000812f, + +0.003744f, +0.002023f, +0.000909f, +0.001551f, -0.000151f, +0.001089f, -0.001902f, -0.000031f, -0.001134f, +0.000790f, + +0.000354f, +0.001523f, +0.001513f, -0.001413f, +0.000380f, -0.000089f, +0.000241f, -0.000095f, -0.000301f, +0.000203f, + +0.000285f, +0.000185f, -0.000413f, +0.000570f, +0.000181f, -0.000206f, -0.000156f, -0.000185f, +0.000156f, -0.000631f, + -0.000309f, -0.000146f, -0.000204f, -0.000224f, -0.000079f, -0.000438f, -0.000660f, -0.000083f, +0.000307f, +0.000392f, + +0.000396f, +0.000216f, +0.000206f, +0.000183f, +0.000136f, +0.000452f, +0.000097f, -0.000141f, -0.000083f, -0.000154f, + +0.000153f, +0.000152f, +0.000106f, -0.000035f, -0.000150f, -0.000005f, +0.000071f, -0.000066f, -0.000087f, -0.000088f, + -0.000026f, +0.000005f, +0.000035f, +0.000131f, +0.000052f, -0.000067f, +0.000047f, -0.000020f, +0.000006f, +0.000013f, + -0.000022f, +0.000123f, -0.000008f, +0.000036f, +0.000023f, +0.000001f + }, + { + -0.013345f, +0.011591f, +0.009666f, +0.001906f, -0.001908f, -0.000902f, +0.000171f, +0.000151f, +0.000619f, -0.000534f, + +0.000430f, +0.001176f, +0.001230f, -0.001838f, +0.000308f, +0.001069f, -0.002715f, -0.000284f, -0.000210f, +0.000092f, + -0.000684f, -0.000484f, +0.000453f, +0.000287f, +0.000789f, -0.000584f, +0.000457f, +0.000992f, +0.001703f, -0.000799f, + -0.000356f, -0.000840f, -0.000191f, -0.000345f, +0.000767f, -0.000589f, +0.001708f, +0.000903f, -0.002773f, -0.001132f, + +0.001301f, -0.001085f, -0.000656f, +0.000065f, -0.000070f, -0.000330f, -0.000709f, -0.001098f, +0.000402f, +0.000384f, + -0.000394f, -0.000392f, +0.000293f, -0.000134f, -0.000121f, -0.000177f, -0.000135f, -0.000343f, -0.000313f, +0.000229f, + +0.000719f, +0.000226f, -0.000007f, +0.000156f, +0.000324f, +0.000515f, +0.000252f, +0.000066f, -0.000054f, -0.000225f, + -0.000033f, +0.000156f, -0.000095f, -0.000294f, -0.000065f, +0.000098f, +0.000201f, +0.000094f, +0.000164f, -0.000076f, + +0.000031f, -0.000039f, -0.000022f, -0.000021f, +0.000102f, +0.000003f, -0.000076f, +0.000016f, +0.000030f, -0.000042f, + -0.000093f, -0.000027f, +0.000024f, +0.000038f, -0.000063f, +0.000042f + }, + { + -0.000808f, +0.008320f, -0.002440f, +0.006085f, +0.000946f, +0.000261f, +0.001660f, +0.001069f, +0.000377f, -0.000530f, + -0.002198f, +0.000320f, +0.001663f, +0.001121f, +0.001054f, -0.001139f, -0.001281f, -0.001860f, -0.004317f, -0.002238f, + +0.001921f, +0.000876f, -0.001049f, -0.000402f, -0.000080f, +0.000627f, +0.000658f, -0.000802f, -0.001111f, +0.001195f, + +0.000219f, -0.000280f, +0.000410f, -0.000811f, +0.000872f, +0.001895f, -0.000080f, -0.000707f, +0.000100f, -0.000458f, + -0.000105f, -0.000690f, -0.000129f, +0.000075f, +0.000342f, -0.000566f, -0.000093f, -0.000322f, +0.000231f, -0.000293f, + +0.000176f, -0.000618f, +0.000032f, -0.000400f, -0.000096f, -0.000105f, -0.000369f, +0.000066f, -0.000218f, -0.000287f, + -0.000099f, +0.000089f, +0.000422f, +0.000272f, +0.000063f, +0.000157f, -0.000081f, +0.000109f, -0.000198f, -0.000257f, + +0.000189f, -0.000106f, -0.000092f, -0.000049f, -0.000050f, +0.000058f, -0.000026f, +0.000033f, -0.000025f, +0.000017f, + +0.000039f, +0.000055f, -0.000026f, -0.000083f, +0.000006f, -0.000057f, +0.000016f, +0.000093f, +0.000007f, +0.000011f, + -0.000079f, +0.000068f, -0.000010f, -0.000012f, -0.000017f, -0.000062f + }, + { + -0.008020f, -0.039874f, +0.013333f, +0.003285f, +0.000289f, +0.003033f, -0.016329f, +0.000544f, -0.001403f, +0.001355f, + +0.000040f, -0.000281f, -0.000029f, -0.002265f, +0.002558f, -0.002534f, -0.003157f, -0.002701f, -0.001040f, +0.001185f, + +0.000630f, -0.000129f, +0.000006f, -0.000462f, +0.000382f, +0.000382f, +0.000134f, +0.000263f, +0.000424f, +0.000115f, + -0.001182f, +0.000072f, +0.000146f, -0.000510f, +0.000077f, -0.000706f, -0.000181f, -0.000992f, -0.000001f, -0.000111f, + -0.001033f, -0.000578f, +0.000687f, -0.000147f, +0.000159f, -0.000291f, -0.000041f, -0.000430f, +0.000178f, +0.000025f, + +0.000062f, +0.000348f, -0.000432f, -0.000101f, +0.000365f, -0.000463f, +0.000362f, +0.000022f, -0.000173f, -0.000074f, + -0.000107f, +0.000010f, +0.000014f, +0.000161f, +0.000298f, +0.000005f, +0.000083f, -0.000062f, -0.000019f, -0.000053f, + -0.000003f, +0.000115f, +0.000201f, -0.000159f, -0.000141f, -0.000128f, -0.000016f, -0.000103f, +0.000058f, -0.000048f, + +0.000193f, -0.000027f, +0.000043f, +0.000112f, -0.000060f, -0.000034f, -0.000118f, +0.000031f, -0.000025f, +0.000088f, + +0.000020f, -0.000038f, -0.000022f, +0.000074f, +0.000038f, -0.000056f + }, + { + -0.000434f, -0.010560f, +0.000917f, -0.000686f, +0.000684f, -0.000548f, +0.000234f, +0.000133f, +0.000149f, -0.000106f, + -0.000990f, -0.001070f, -0.003201f, +0.006164f, -0.005613f, +0.002056f, +0.002078f, -0.001847f, -0.002582f, -0.000571f, + +0.001656f, +0.001295f, -0.001470f, -0.000726f, -0.000590f, +0.002384f, +0.000594f, -0.002653f, -0.000426f, -0.000086f, + -0.001799f, +0.000739f, -0.000503f, +0.001855f, -0.000531f, -0.000136f, -0.000296f, +0.000549f, -0.000555f, -0.000305f, + +0.000205f, +0.000421f, +0.000011f, -0.000077f, -0.000086f, -0.000053f, +0.000624f, +0.000288f, -0.000669f, -0.000192f, + +0.000206f, -0.000069f, +0.000294f, -0.000204f, +0.000196f, +0.000244f, +0.000035f, +0.000579f, +0.000356f, +0.000128f, + +0.000274f, -0.000166f, +0.000189f, -0.000049f, +0.000260f, +0.000206f, +0.000110f, +0.000087f, -0.000053f, -0.000012f, + +0.000065f, -0.000008f, -0.000090f, -0.000111f, -0.000158f, -0.000134f, -0.000128f, -0.000217f, -0.000009f, -0.000012f, + -0.000038f, -0.000041f, +0.000020f, +0.000015f, +0.000043f, -0.000030f, +0.000086f, +0.000095f, +0.000033f, +0.000013f, + -0.000045f, -0.000013f, -0.000004f, -0.000010f, +0.000033f, -0.000068f + }, + { + -0.002315f, -0.001648f, -0.005339f, -0.006079f, +0.000308f, -0.001397f, -0.005273f, +0.001362f, +0.001483f, +0.000593f, + -0.001526f, -0.000105f, +0.004530f, +0.001890f, +0.000164f, +0.000951f, +0.001986f, -0.001161f, -0.002044f, -0.000528f, + +0.000518f, -0.000240f, -0.000459f, +0.000077f, -0.000746f, +0.001093f, +0.000304f, -0.000107f, -0.000848f, +0.000300f, + +0.000108f, -0.000259f, +0.000505f, +0.000850f, +0.000487f, +0.000674f, +0.000104f, -0.000129f, +0.000698f, -0.000087f, + -0.000374f, +0.000319f, -0.000351f, +0.001329f, +0.000133f, +0.000223f, +0.000172f, +0.000281f, +0.000245f, -0.000504f, + -0.000222f, -0.000093f, -0.000512f, +0.000324f, -0.000369f, -0.000183f, -0.000110f, -0.000077f, +0.000217f, +0.000107f, + -0.000192f, -0.000020f, +0.000189f, -0.000291f, -0.000058f, -0.000081f, +0.000148f, +0.000033f, +0.000203f, -0.000018f, + -0.000075f, +0.000170f, +0.000074f, -0.000018f, -0.000136f, +0.000197f, +0.000075f, -0.000019f, +0.000116f, -0.000064f, + -0.000067f, +0.000161f, +0.000117f, +0.000043f, -0.000240f, -0.000161f, +0.000063f, +0.000141f, -0.000003f, +0.000063f, + +0.000020f, +0.000051f, -0.000028f, -0.000085f, -0.000046f, -0.000132f + }, + { + -0.000839f, +0.002325f, +0.000080f, -0.001401f, +0.000055f, -0.000849f, -0.001116f, -0.000227f, -0.000442f, -0.000931f, + -0.000791f, -0.001176f, +0.001304f, -0.001485f, -0.016081f, +0.000533f, -0.000304f, +0.001190f, +0.001349f, +0.001473f, + +0.000567f, +0.000353f, -0.000485f, +0.001436f, +0.000532f, +0.001702f, +0.000854f, +0.000107f, -0.003856f, +0.001165f, + +0.001009f, +0.001395f, -0.000063f, +0.000598f, -0.000342f, -0.000530f, -0.000428f, +0.000135f, -0.000082f, +0.000446f, + +0.000613f, -0.000888f, -0.000153f, -0.000088f, -0.000520f, -0.000332f, +0.000320f, -0.000596f, -0.000228f, -0.000610f, + +0.000032f, -0.000152f, -0.000039f, +0.000086f, +0.000181f, -0.000040f, +0.000234f, +0.000182f, +0.000076f, +0.000514f, + -0.000056f, -0.000403f, +0.000086f, -0.000061f, -0.000113f, -0.000016f, +0.000045f, -0.000091f, -0.000006f, +0.000020f, + -0.000083f, +0.000370f, +0.000066f, +0.000036f, -0.000018f, +0.000110f, +0.000022f, +0.000308f, -0.000107f, -0.000077f, + -0.000023f, -0.000131f, +0.000099f, +0.000014f, +0.000011f, +0.000112f, +0.000070f, +0.000034f, -0.000086f, +0.000058f, + -0.000093f, -0.000131f, -0.000065f, +0.000080f, -0.000009f, -0.000061f + }, + { + -0.005050f, +0.008647f, +0.001695f, +0.002175f, +0.001104f, -0.002890f, -0.002048f, -0.000882f, +0.000948f, +0.001535f, + -0.000365f, +0.002025f, -0.002218f, +0.000708f, +0.011507f, +0.000374f, -0.004569f, +0.003385f, -0.002589f, -0.000669f, + -0.000548f, +0.001065f, +0.000545f, +0.000137f, +0.000859f, -0.000068f, +0.002398f, +0.001266f, -0.000054f, -0.000771f, + -0.000595f, -0.000014f, -0.000292f, -0.001067f, +0.000937f, +0.001077f, +0.001700f, +0.000140f, +0.000510f, +0.000903f, + +0.001002f, +0.000348f, -0.000150f, +0.000513f, +0.000410f, +0.000196f, +0.001217f, +0.000335f, +0.000216f, +0.000032f, + -0.000386f, -0.000128f, -0.000337f, -0.000250f, -0.000302f, -0.000198f, +0.000001f, -0.000140f, -0.000461f, +0.000072f, + -0.000132f, -0.000091f, -0.000058f, +0.000238f, +0.000133f, +0.000061f, +0.000030f, -0.000041f, -0.000083f, +0.000097f, + -0.000000f, +0.000122f, +0.000246f, -0.000285f, -0.000095f, -0.000048f, +0.000090f, +0.000028f, -0.000037f, -0.000087f, + +0.000160f, -0.000028f, +0.000012f, +0.000065f, +0.000002f, +0.000003f, +0.000056f, -0.000062f, -0.000156f, +0.000082f, + +0.000015f, +0.000047f, +0.000036f, +0.000038f, +0.000035f, -0.000062f + } + }, + { + { + -0.000859f, +0.009238f, +0.005591f, +0.000521f, -0.001055f, -0.000420f, +0.000314f, +0.000145f, +0.000133f, -0.001206f, + +0.000445f, +0.000860f, +0.002071f, +0.001420f, -0.001762f, -0.001434f, +0.004912f, -0.001191f, -0.000879f, +0.002460f, + -0.000136f, -0.003493f, -0.000125f, -0.000784f, -0.000978f, +0.000236f, +0.000421f, -0.000372f, +0.000026f, -0.001125f, + -0.000670f, +0.000553f, -0.001433f, +0.002012f, -0.000069f, -0.000348f, +0.000228f, -0.001758f, -0.000210f, -0.001211f, + +0.000492f, -0.000565f, +0.001524f, -0.000398f, +0.000585f, +0.000406f, +0.000369f, +0.000590f, +0.000529f, -0.000197f, + -0.000827f, +0.000180f, -0.000234f, -0.000407f, -0.000015f, +0.000138f, +0.000101f, +0.000065f, +0.000298f, -0.000433f, + +0.000009f, -0.000343f, +0.000131f, +0.000227f, +0.000047f, -0.000103f, +0.000105f, +0.000157f, -0.000233f, +0.000123f, + +0.000012f, -0.000020f, +0.000083f, +0.000108f, -0.000059f, +0.000056f, +0.000026f, +0.000012f, -0.000031f, +0.000068f, + -0.000125f, -0.000056f, -0.000133f, -0.000056f, -0.000026f, +0.000107f, +0.000121f, -0.000035f, +0.000005f, +0.000101f, + +0.000002f, -0.000036f, -0.000036f, +0.000079f, +0.000061f, +0.000051f + }, + { + -0.006875f, +0.113664f, +0.016929f, -0.001482f, +0.001689f, -0.000689f, +0.001401f, +0.001354f, -0.000623f, -0.000064f, + +0.000074f, -0.001145f, +0.000391f, +0.000700f, +0.001716f, +0.003109f, +0.001840f, +0.001093f, -0.000653f, +0.000179f, + -0.000418f, +0.000452f, -0.000203f, -0.000803f, +0.000064f, +0.000347f, +0.000476f, +0.000332f, -0.000470f, -0.000386f, + +0.001321f, +0.000544f, +0.001030f, +0.001091f, +0.000003f, -0.001060f, +0.001019f, +0.000413f, +0.000515f, +0.000394f, + +0.000394f, -0.000017f, -0.000495f, -0.000260f, +0.000138f, +0.000007f, +0.000162f, +0.000521f, -0.000059f, -0.000624f, + +0.000295f, +0.000174f, -0.000258f, -0.000084f, +0.000208f, +0.000031f, -0.000248f, -0.000391f, +0.000128f, -0.000198f, + -0.000237f, -0.000130f, +0.000098f, -0.000093f, +0.000284f, -0.000149f, -0.000075f, -0.000162f, -0.000091f, +0.000229f, + -0.000018f, +0.000031f, +0.000023f, -0.000075f, +0.000140f, -0.000006f, -0.000119f, +0.000071f, +0.000130f, -0.000060f, + -0.000050f, -0.000010f, -0.000009f, -0.000089f, -0.000063f, +0.000161f, -0.000017f, -0.000044f, -0.000021f, -0.000030f, + +0.000087f, +0.000039f, -0.000024f, +0.000016f, -0.000017f, -0.000000f + }, + { + -0.004013f, +0.082676f, +0.000797f, +0.001880f, -0.003681f, +0.000714f, +0.000020f, +0.000118f, +0.000623f, +0.000035f, + -0.001089f, -0.000463f, -0.000924f, +0.001837f, -0.000021f, -0.000482f, -0.002714f, +0.000444f, +0.000327f, -0.000026f, + +0.002062f, -0.000619f, -0.000742f, -0.001274f, -0.000219f, -0.000775f, +0.001080f, +0.000725f, +0.000780f, -0.000054f, + -0.001703f, -0.000055f, -0.001154f, -0.000525f, -0.000203f, +0.000119f, +0.000155f, +0.000842f, +0.000068f, +0.000100f, + -0.000757f, +0.000265f, +0.001079f, -0.000514f, -0.000328f, +0.000972f, +0.000599f, -0.000495f, -0.000302f, -0.000538f, + +0.000118f, +0.000244f, +0.000205f, -0.000306f, +0.001003f, -0.000482f, -0.000239f, +0.000257f, +0.000290f, +0.000019f, + -0.000235f, -0.000249f, +0.000088f, +0.000009f, -0.000252f, -0.000027f, -0.000254f, +0.000094f, -0.000053f, -0.000202f, + -0.000113f, +0.000048f, +0.000041f, -0.000076f, +0.000135f, -0.000082f, +0.000071f, -0.000076f, +0.000155f, -0.000061f, + -0.000122f, -0.000118f, +0.000006f, +0.000024f, -0.000012f, +0.000094f, -0.000006f, +0.000018f, -0.000006f, +0.000059f, + -0.000075f, -0.000001f, -0.000017f, +0.000011f, +0.000016f, -0.000016f + }, + { + +0.000758f, +0.005444f, -0.001330f, -0.000188f, -0.000041f, +0.000349f, -0.000131f, -0.000046f, +0.000060f, -0.000060f, + +0.000494f, +0.000027f, +0.000491f, +0.001539f, +0.009097f, +0.000473f, -0.000749f, +0.001907f, +0.000896f, -0.001878f, + +0.000842f, +0.000267f, +0.001044f, +0.002017f, +0.000260f, +0.001705f, +0.003499f, -0.000393f, +0.000289f, +0.002108f, + -0.001286f, -0.000787f, -0.000597f, +0.000070f, -0.000278f, +0.000538f, +0.000667f, +0.000200f, -0.000368f, -0.000083f, + -0.000116f, -0.000574f, +0.000171f, +0.000535f, +0.000167f, -0.000138f, -0.000756f, +0.000392f, +0.000075f, -0.000453f, + -0.000041f, -0.000467f, -0.000331f, -0.000121f, -0.000022f, -0.000112f, +0.000045f, -0.000118f, +0.000011f, +0.000144f, + -0.000097f, -0.000297f, -0.000074f, -0.000100f, -0.000053f, -0.000019f, -0.000016f, -0.000081f, -0.000187f, +0.000001f, + +0.000212f, +0.000085f, +0.000067f, -0.000192f, +0.000262f, -0.000023f, -0.000095f, -0.000002f, -0.000060f, +0.000047f, + +0.000097f, -0.000049f, -0.000007f, -0.000054f, -0.000024f, +0.000071f, -0.000017f, -0.000044f, -0.000103f, +0.000043f, + +0.000071f, -0.000066f, -0.000081f, -0.000014f, -0.000016f, -0.000062f + }, + { + -0.012567f, +0.029668f, -0.003540f, -0.004273f, +0.000547f, -0.000006f, +0.000098f, +0.000141f, +0.001230f, -0.000683f, + -0.002032f, -0.000512f, +0.000865f, -0.000235f, -0.001160f, +0.000201f, +0.000359f, -0.001655f, -0.000193f, +0.000632f, + +0.000539f, -0.000326f, +0.001021f, +0.001091f, +0.000042f, +0.000081f, -0.000630f, +0.000400f, +0.001347f, +0.000880f, + -0.000248f, -0.000511f, -0.000639f, -0.000422f, -0.000101f, +0.000844f, -0.000678f, +0.000299f, -0.000405f, +0.000132f, + +0.000676f, -0.000505f, +0.000367f, -0.000567f, +0.000367f, -0.000675f, -0.000240f, -0.000268f, -0.000474f, -0.000154f, + -0.000162f, +0.000188f, +0.000198f, -0.000211f, +0.000116f, -0.000149f, +0.000083f, -0.000184f, +0.000327f, -0.000055f, + +0.000324f, +0.000405f, -0.000036f, +0.000045f, +0.000104f, -0.000182f, -0.000057f, +0.000079f, +0.000038f, -0.000059f, + +0.000092f, +0.000065f, +0.000169f, +0.000009f, -0.000149f, +0.000047f, -0.000094f, -0.000095f, +0.000043f, -0.000078f, + +0.000086f, +0.000006f, +0.000017f, -0.000009f, +0.000042f, +0.000003f, +0.000008f, +0.000058f, +0.000059f, +0.000028f, + +0.000033f, +0.000039f, +0.000044f, +0.000019f, -0.000038f, -0.000032f + }, + { + +0.000256f, -0.007825f, +0.003786f, +0.000253f, +0.000152f, +0.000032f, -0.000304f, -0.000078f, -0.000263f, +0.000077f, + +0.000794f, +0.000238f, +0.000040f, +0.001489f, +0.008666f, -0.003043f, +0.000102f, +0.000200f, -0.001957f, -0.003857f, + +0.000504f, -0.000027f, -0.000446f, -0.002383f, +0.002172f, +0.000843f, -0.002552f, +0.001830f, -0.001621f, -0.000059f, + -0.000811f, -0.000563f, +0.000035f, -0.000038f, +0.000382f, +0.000039f, -0.000065f, +0.000167f, +0.000767f, +0.000435f, + -0.000221f, +0.000896f, +0.000236f, -0.000250f, -0.000648f, +0.000043f, +0.000361f, +0.000508f, -0.000207f, -0.000156f, + -0.000253f, -0.000020f, -0.000039f, +0.000285f, -0.000257f, +0.000019f, +0.000288f, +0.000170f, +0.000058f, +0.000039f, + -0.000136f, -0.000031f, +0.000002f, -0.000050f, -0.000073f, -0.000106f, -0.000039f, +0.000048f, +0.000017f, +0.000138f, + +0.000096f, -0.000075f, +0.000123f, -0.000029f, -0.000114f, -0.000131f, -0.000030f, -0.000148f, +0.000040f, +0.000183f, + -0.000065f, -0.000022f, +0.000057f, -0.000078f, +0.000021f, +0.000010f, -0.000001f, +0.000010f, -0.000008f, +0.000006f, + +0.000083f, -0.000034f, -0.000073f, -0.000014f, +0.000010f, +0.000053f + }, + { + -0.017516f, +0.025808f, +0.009796f, +0.000743f, -0.001017f, +0.000106f, -0.000053f, -0.000026f, -0.000148f, +0.001102f, + +0.000199f, +0.000120f, -0.000338f, -0.000055f, -0.000371f, -0.000054f, +0.001123f, -0.000741f, +0.000834f, -0.000285f, + +0.000829f, +0.000092f, -0.000643f, +0.000585f, -0.000167f, -0.000087f, -0.000405f, -0.000355f, +0.000332f, +0.000536f, + +0.000191f, -0.000857f, -0.000192f, -0.000319f, -0.000057f, +0.000761f, -0.000526f, +0.000547f, +0.000020f, +0.000329f, + +0.000571f, -0.000227f, +0.000544f, +0.000730f, -0.000047f, -0.000418f, +0.000484f, +0.000571f, -0.000448f, +0.000396f, + +0.000284f, -0.000118f, +0.000378f, -0.000123f, -0.000126f, -0.000196f, -0.000094f, +0.000159f, -0.000298f, -0.000036f, + +0.000210f, +0.000206f, +0.000067f, -0.000087f, -0.000077f, -0.000140f, -0.000279f, +0.000248f, +0.000161f, -0.000167f, + +0.000162f, +0.000138f, -0.000271f, -0.000048f, -0.000042f, +0.000026f, -0.000028f, -0.000025f, +0.000057f, -0.000100f, + +0.000059f, -0.000001f, -0.000063f, -0.000079f, +0.000195f, -0.000090f, -0.000021f, +0.000019f, +0.000051f, +0.000017f, + -0.000128f, +0.000062f, -0.000020f, +0.000060f, +0.000020f, +0.000006f + }, + { + -0.000159f, -0.001417f, -0.001709f, +0.001439f, +0.000121f, +0.000166f, -0.000149f, +0.000267f, +0.000471f, -0.000005f, + +0.000909f, -0.000045f, +0.000388f, -0.000257f, +0.008103f, +0.005034f, -0.001720f, -0.001130f, -0.000106f, -0.002058f, + +0.001846f, +0.000658f, +0.001225f, -0.000091f, -0.004199f, -0.000048f, -0.002193f, -0.000407f, -0.002019f, +0.000619f, + +0.000373f, +0.000583f, +0.000425f, -0.000948f, +0.000332f, -0.000026f, +0.000103f, -0.000167f, -0.001023f, -0.000188f, + -0.000335f, +0.000205f, -0.000314f, +0.000308f, +0.000030f, -0.000385f, -0.000452f, +0.000036f, +0.000417f, -0.000433f, + -0.000300f, -0.000568f, +0.000218f, -0.000321f, +0.000002f, -0.000167f, -0.000230f, +0.000369f, +0.000390f, -0.000240f, + -0.000007f, -0.000008f, +0.000150f, +0.000076f, +0.000012f, +0.000287f, -0.000048f, -0.000074f, +0.000008f, -0.000084f, + -0.000059f, -0.000036f, +0.000093f, -0.000047f, -0.000158f, +0.000061f, -0.000113f, -0.000143f, -0.000035f, -0.000024f, + +0.000180f, +0.000045f, -0.000060f, +0.000029f, +0.000009f, -0.000004f, -0.000028f, +0.000059f, -0.000008f, -0.000093f, + -0.000011f, +0.000028f, +0.000015f, +0.000052f, -0.000005f, +0.000012f + }, + { + +0.005441f, +0.018446f, -0.006755f, +0.001242f, -0.001224f, -0.000407f, +0.000585f, +0.001355f, -0.000184f, -0.001067f, + +0.001576f, +0.001491f, +0.000069f, -0.003340f, -0.000368f, +0.000161f, -0.000994f, +0.001494f, +0.000327f, +0.000058f, + -0.000363f, +0.000475f, +0.000060f, -0.000502f, +0.000096f, -0.000701f, +0.000128f, -0.000328f, +0.000458f, +0.000008f, + +0.000997f, +0.000512f, +0.000529f, -0.000535f, +0.000138f, -0.001554f, +0.000136f, +0.000611f, -0.000897f, -0.000192f, + +0.001301f, -0.000675f, -0.000619f, -0.000550f, +0.000024f, -0.000289f, +0.000047f, +0.000405f, +0.000103f, -0.000279f, + -0.000363f, +0.000129f, +0.000724f, +0.000020f, -0.000101f, -0.000003f, -0.000120f, -0.000197f, -0.000200f, +0.000099f, + +0.000197f, -0.000118f, +0.000039f, +0.000157f, +0.000373f, +0.000095f, -0.000263f, -0.000127f, -0.000150f, -0.000158f, + +0.000065f, +0.000112f, -0.000100f, -0.000171f, -0.000212f, +0.000225f, +0.000167f, -0.000143f, +0.000052f, +0.000004f, + -0.000021f, +0.000112f, +0.000089f, +0.000123f, +0.000112f, +0.000096f, -0.000087f, -0.000052f, -0.000039f, +0.000041f, + +0.000095f, +0.000008f, +0.000039f, -0.000009f, -0.000002f, +0.000028f + }, + { + +0.000504f, +0.009593f, -0.003974f, +0.007887f, -0.000525f, -0.002458f, +0.000750f, +0.000086f, -0.000240f, +0.000371f, + -0.000860f, +0.001055f, -0.000901f, +0.000467f, +0.002453f, +0.000669f, -0.001688f, -0.001894f, -0.001765f, -0.000078f, + +0.003171f, +0.000012f, -0.001449f, -0.000732f, -0.000097f, +0.000773f, +0.000935f, -0.001082f, -0.000974f, +0.000578f, + +0.000530f, -0.000423f, +0.000535f, -0.000837f, +0.000837f, +0.001216f, -0.000651f, -0.000541f, +0.000479f, -0.000678f, + +0.000040f, -0.000721f, +0.000202f, +0.000388f, +0.000181f, +0.000119f, +0.000015f, +0.000040f, +0.000308f, -0.000456f, + -0.000047f, -0.000395f, -0.000205f, -0.000158f, +0.000424f, +0.000106f, -0.000262f, +0.000112f, -0.000110f, -0.000107f, + +0.000053f, -0.000032f, +0.000221f, -0.000057f, +0.000050f, +0.000204f, -0.000223f, +0.000032f, -0.000126f, -0.000144f, + +0.000075f, +0.000068f, +0.000128f, -0.000101f, -0.000016f, +0.000076f, +0.000044f, +0.000027f, +0.000015f, +0.000068f, + -0.000011f, -0.000007f, -0.000107f, -0.000077f, -0.000020f, +0.000009f, +0.000050f, +0.000002f, -0.000048f, -0.000085f, + -0.000027f, -0.000028f, -0.000039f, +0.000022f, +0.000015f, -0.000036f + }, + { + +0.008173f, -0.021820f, +0.003651f, -0.006115f, -0.003951f, +0.005815f, -0.007016f, +0.003602f, -0.000732f, +0.000560f, + +0.000214f, -0.000482f, +0.000015f, -0.001518f, +0.003331f, -0.003031f, -0.002500f, -0.000419f, -0.000498f, +0.000611f, + +0.001787f, -0.000049f, +0.000583f, -0.000925f, +0.000159f, +0.000279f, -0.000304f, -0.000221f, -0.000108f, -0.000342f, + -0.001186f, +0.000556f, +0.000181f, -0.000603f, +0.000244f, +0.000227f, +0.000388f, -0.000256f, +0.000175f, -0.001751f, + -0.001104f, +0.000353f, +0.000466f, -0.000139f, -0.000017f, -0.000151f, +0.000378f, -0.000708f, -0.000162f, +0.000412f, + +0.000121f, +0.000044f, -0.000303f, +0.000300f, +0.000365f, -0.000223f, +0.000503f, -0.000203f, +0.000051f, +0.000098f, + -0.000014f, +0.000100f, +0.000072f, +0.000105f, +0.000005f, +0.000025f, +0.000092f, +0.000007f, -0.000023f, +0.000087f, + +0.000023f, -0.000045f, +0.000101f, -0.000180f, +0.000041f, -0.000077f, -0.000006f, +0.000034f, +0.000053f, -0.000038f, + +0.000008f, -0.000092f, +0.000061f, -0.000074f, +0.000009f, -0.000092f, -0.000044f, -0.000017f, -0.000022f, +0.000084f, + -0.000059f, +0.000003f, +0.000078f, +0.000014f, -0.000060f, -0.000009f + }, + { + +0.000230f, -0.009636f, +0.001141f, -0.000110f, +0.000267f, -0.000143f, +0.000546f, +0.000005f, +0.000057f, +0.000026f, + +0.000166f, -0.000527f, -0.002935f, +0.007896f, -0.001128f, +0.000987f, -0.000248f, -0.001994f, -0.000533f, +0.001427f, + +0.001745f, +0.001295f, -0.000372f, +0.000013f, +0.000581f, +0.002968f, +0.001709f, -0.001452f, +0.000101f, -0.001536f, + -0.000379f, +0.001136f, +0.000342f, +0.000552f, -0.000567f, -0.000566f, -0.000649f, +0.000603f, +0.000103f, -0.000456f, + +0.000448f, +0.000454f, -0.000425f, -0.000206f, +0.000113f, -0.000245f, +0.000529f, +0.000014f, -0.000701f, -0.000268f, + +0.000154f, -0.000241f, +0.000033f, -0.000211f, +0.000235f, +0.000186f, +0.000056f, +0.000574f, +0.000008f, +0.000044f, + -0.000233f, -0.000153f, +0.000137f, +0.000060f, +0.000065f, -0.000184f, +0.000153f, -0.000149f, +0.000025f, +0.000131f, + -0.000023f, -0.000145f, -0.000147f, -0.000090f, -0.000085f, -0.000058f, -0.000049f, -0.000012f, +0.000075f, +0.000061f, + +0.000009f, -0.000000f, +0.000088f, +0.000060f, +0.000014f, +0.000049f, +0.000087f, +0.000007f, -0.000025f, +0.000035f, + -0.000008f, -0.000031f, -0.000026f, +0.000063f, +0.000049f, -0.000098f + }, + { + +0.000140f, +0.006079f, +0.000181f, -0.002460f, -0.000031f, -0.001807f, -0.003154f, +0.001835f, +0.001250f, +0.000023f, + -0.000440f, +0.000293f, -0.000667f, -0.004871f, -0.000647f, +0.001531f, +0.001452f, +0.000286f, -0.000296f, -0.001624f, + +0.001160f, +0.000224f, +0.000110f, +0.000051f, -0.001484f, -0.000511f, +0.000324f, +0.000286f, -0.000135f, +0.000326f, + -0.000480f, -0.000047f, +0.000329f, +0.000247f, -0.000366f, +0.000233f, +0.000041f, -0.000435f, +0.000023f, -0.000386f, + +0.000031f, +0.000771f, -0.001071f, +0.000748f, -0.000372f, +0.000213f, -0.000458f, +0.000449f, +0.000010f, +0.000003f, + -0.000178f, -0.000193f, -0.000428f, -0.000129f, -0.000132f, -0.000209f, +0.000165f, +0.000246f, +0.000411f, -0.000146f, + -0.000229f, +0.000194f, +0.000403f, -0.000277f, +0.000048f, -0.000036f, +0.000176f, +0.000022f, -0.000141f, -0.000010f, + +0.000213f, +0.000116f, -0.000151f, +0.000034f, -0.000095f, +0.000130f, +0.000062f, -0.000114f, +0.000062f, -0.000060f, + +0.000059f, +0.000053f, -0.000055f, +0.000005f, -0.000106f, +0.000067f, +0.000142f, +0.000107f, +0.000013f, +0.000042f, + +0.000003f, -0.000012f, -0.000127f, -0.000021f, -0.000077f, -0.000089f + }, + { + +0.000491f, +0.002327f, -0.003068f, -0.001254f, +0.000700f, +0.000072f, -0.000293f, +0.000173f, -0.000182f, +0.000282f, + +0.000177f, -0.000058f, +0.000184f, +0.012208f, +0.003394f, +0.000769f, +0.000201f, +0.002247f, +0.001582f, -0.001216f, + -0.000425f, +0.000728f, -0.000036f, +0.000382f, +0.001634f, +0.001586f, -0.000562f, +0.000260f, -0.000438f, +0.001250f, + -0.000348f, +0.000555f, -0.000834f, +0.000051f, +0.000336f, +0.000129f, -0.000234f, +0.000077f, -0.000456f, +0.000389f, + +0.000026f, -0.001118f, -0.000032f, +0.000447f, +0.000122f, +0.000177f, +0.000235f, -0.000014f, +0.000125f, -0.000076f, + +0.000153f, +0.000003f, +0.000184f, +0.000184f, +0.000049f, -0.000079f, +0.000204f, +0.000007f, -0.000226f, +0.000427f, + -0.000442f, -0.000289f, +0.000063f, +0.000037f, -0.000084f, +0.000306f, +0.000108f, -0.000080f, +0.000028f, +0.000054f, + +0.000016f, +0.000254f, -0.000136f, -0.000024f, -0.000058f, +0.000008f, +0.000108f, +0.000040f, +0.000007f, -0.000082f, + -0.000097f, -0.000022f, +0.000068f, +0.000066f, +0.000050f, +0.000053f, +0.000011f, -0.000051f, +0.000017f, +0.000031f, + -0.000150f, -0.000019f, +0.000043f, -0.000000f, -0.000061f, +0.000005f + }, + { + +0.000289f, +0.015173f, -0.003839f, -0.004517f, -0.000604f, -0.002047f, +0.001186f, -0.000317f, +0.000495f, +0.000441f, + -0.004172f, +0.001514f, -0.000467f, -0.003936f, +0.000508f, -0.001122f, -0.002390f, +0.002427f, -0.002444f, +0.000636f, + +0.000185f, +0.000698f, +0.000331f, -0.000618f, +0.000940f, -0.000150f, +0.000947f, -0.000491f, -0.000149f, +0.000475f, + -0.000652f, -0.000451f, -0.000200f, -0.000804f, +0.000878f, +0.000208f, +0.001241f, -0.000448f, +0.000311f, +0.000776f, + -0.000362f, +0.000055f, +0.000541f, +0.000714f, -0.000019f, -0.000004f, +0.000283f, -0.000709f, -0.000528f, +0.000019f, + -0.000331f, +0.000006f, -0.000055f, +0.000216f, -0.000199f, -0.000070f, +0.000078f, -0.000075f, +0.000060f, +0.000235f, + -0.000126f, +0.000061f, +0.000073f, +0.000308f, +0.000065f, +0.000209f, -0.000037f, -0.000061f, -0.000144f, +0.000059f, + -0.000011f, -0.000042f, +0.000085f, -0.000213f, +0.000086f, -0.000044f, +0.000133f, +0.000012f, -0.000075f, +0.000019f, + +0.000082f, -0.000146f, +0.000055f, +0.000062f, -0.000068f, -0.000103f, +0.000012f, -0.000096f, -0.000023f, +0.000052f, + -0.000031f, +0.000028f, -0.000024f, -0.000027f, +0.000042f, -0.000022f + } + }, + { + { + +0.001003f, +0.016549f, +0.001360f, +0.000590f, -0.000599f, -0.000138f, -0.000286f, +0.000023f, +0.000158f, -0.000603f, + +0.001994f, +0.000452f, +0.003645f, +0.001926f, -0.006272f, +0.001344f, +0.001871f, +0.001104f, +0.001742f, -0.000742f, + -0.000571f, +0.000343f, +0.000857f, +0.000040f, -0.000488f, -0.000374f, -0.000850f, +0.000268f, +0.000535f, -0.000365f, + -0.000581f, +0.000405f, +0.002007f, -0.000320f, -0.000289f, -0.000346f, -0.000370f, -0.002064f, -0.001816f, -0.001096f, + +0.000763f, +0.000492f, +0.000153f, +0.000265f, +0.000491f, +0.000431f, -0.000089f, +0.000370f, -0.000146f, +0.000187f, + -0.000036f, -0.000041f, -0.000101f, -0.000257f, +0.000145f, +0.000033f, -0.000338f, +0.000068f, -0.000341f, +0.000075f, + +0.000023f, -0.000058f, +0.000272f, +0.000230f, +0.000064f, +0.000138f, +0.000160f, -0.000118f, +0.000167f, +0.000262f, + +0.000008f, -0.000194f, +0.000034f, +0.000064f, +0.000029f, +0.000009f, -0.000103f, +0.000023f, +0.000106f, +0.000061f, + -0.000140f, -0.000080f, +0.000066f, +0.000119f, +0.000094f, +0.000006f, +0.000007f, -0.000007f, +0.000030f, -0.000006f, + -0.000007f, +0.000003f, -0.000050f, +0.000052f, -0.000004f, -0.000064f + }, + { + +0.009707f, +0.113708f, -0.000805f, -0.001305f, -0.002151f, -0.000155f, +0.000581f, -0.001095f, -0.001610f, -0.000399f, + -0.000299f, -0.000785f, -0.000499f, +0.002095f, +0.002070f, -0.000120f, +0.000230f, +0.000285f, +0.002162f, -0.000217f, + -0.000073f, -0.000475f, -0.000777f, -0.000437f, -0.000092f, +0.001173f, -0.001210f, -0.000066f, -0.000293f, +0.000154f, + +0.000899f, +0.001843f, +0.000167f, -0.000328f, +0.000390f, +0.000134f, +0.000954f, -0.000912f, +0.000419f, -0.000506f, + -0.000287f, +0.000140f, +0.000716f, -0.000011f, +0.000070f, +0.000045f, -0.000102f, +0.000035f, -0.000546f, +0.000047f, + +0.000102f, +0.000186f, +0.000241f, +0.000004f, +0.000223f, -0.000098f, -0.000123f, +0.000036f, -0.000088f, -0.000034f, + +0.000002f, +0.000050f, -0.000124f, +0.000022f, -0.000114f, -0.000183f, -0.000036f, -0.000096f, +0.000199f, +0.000112f, + -0.000039f, -0.000074f, -0.000165f, +0.000052f, +0.000030f, -0.000127f, +0.000076f, -0.000094f, -0.000061f, -0.000054f, + +0.000089f, +0.000019f, -0.000108f, -0.000022f, +0.000132f, -0.000050f, -0.000064f, +0.000118f, -0.000053f, -0.000018f, + +0.000007f, +0.000020f, +0.000057f, +0.000035f, -0.000026f, -0.000000f + }, + { + +0.003454f, +0.061391f, +0.004275f, +0.003763f, +0.003032f, -0.000029f, +0.000424f, -0.000029f, +0.000223f, -0.000660f, + -0.001278f, -0.001341f, -0.000669f, -0.002987f, +0.002527f, +0.000748f, -0.001728f, -0.000576f, +0.000043f, +0.000961f, + -0.000000f, -0.000439f, +0.000216f, -0.002010f, +0.000453f, +0.000509f, +0.000861f, -0.000472f, +0.000396f, +0.000051f, + -0.000714f, -0.001105f, +0.000540f, -0.000099f, -0.001587f, +0.000216f, +0.000226f, +0.001179f, -0.000326f, +0.000039f, + -0.000613f, +0.000444f, +0.000887f, +0.000189f, +0.000211f, +0.000346f, -0.000597f, +0.000107f, -0.000019f, -0.000089f, + +0.000094f, -0.000193f, -0.000057f, +0.000282f, +0.000168f, +0.000147f, -0.000062f, +0.000436f, +0.000118f, -0.000061f, + -0.000122f, +0.000112f, +0.000397f, +0.000000f, -0.000015f, -0.000039f, -0.000029f, -0.000082f, +0.000008f, +0.000082f, + +0.000001f, -0.000050f, +0.000081f, +0.000088f, +0.000100f, -0.000059f, +0.000088f, -0.000040f, -0.000064f, -0.000077f, + -0.000136f, -0.000040f, +0.000057f, +0.000068f, -0.000090f, -0.000013f, -0.000019f, -0.000084f, +0.000025f, -0.000075f, + +0.000001f, +0.000065f, +0.000041f, +0.000033f, +0.000039f, -0.000047f + }, + { + -0.000583f, +0.003263f, +0.000864f, +0.000383f, +0.000471f, -0.000185f, +0.000070f, -0.000237f, -0.000118f, -0.000104f, + +0.000557f, +0.000328f, -0.000551f, +0.000824f, +0.008967f, +0.002790f, -0.002236f, -0.000744f, +0.000453f, -0.000244f, + -0.000685f, +0.000123f, +0.001872f, +0.001003f, +0.001938f, +0.001677f, +0.000859f, +0.001084f, +0.000045f, +0.001979f, + -0.001851f, -0.001864f, +0.001054f, -0.000570f, -0.000583f, -0.000433f, +0.002627f, -0.000482f, -0.000003f, -0.000010f, + -0.000209f, +0.000150f, -0.000277f, +0.000338f, -0.000565f, +0.000169f, -0.000109f, +0.000095f, +0.000306f, +0.000083f, + -0.000434f, -0.000627f, +0.000036f, -0.000141f, +0.000225f, +0.000172f, -0.000269f, -0.000217f, +0.000108f, -0.000128f, + -0.000158f, -0.000203f, -0.000018f, -0.000096f, +0.000078f, +0.000139f, -0.000033f, -0.000189f, +0.000135f, +0.000106f, + -0.000147f, -0.000162f, -0.000007f, +0.000114f, +0.000102f, +0.000057f, +0.000051f, +0.000099f, +0.000157f, -0.000030f, + +0.000039f, +0.000043f, +0.000038f, -0.000038f, +0.000034f, -0.000070f, -0.000058f, +0.000047f, +0.000026f, +0.000065f, + -0.000004f, -0.000004f, +0.000079f, +0.000051f, -0.000032f, +0.000027f + }, + { + +0.009484f, -0.001684f, -0.004088f, -0.002611f, -0.000211f, +0.000287f, +0.000732f, +0.000236f, +0.000391f, -0.001443f, + -0.001129f, +0.000758f, -0.001101f, +0.000285f, -0.001171f, -0.000442f, -0.000479f, -0.000784f, +0.000817f, -0.000028f, + +0.000101f, -0.000163f, +0.000863f, +0.000679f, -0.000806f, +0.000593f, +0.000397f, -0.000249f, +0.001142f, +0.000639f, + -0.000808f, +0.000241f, -0.001120f, +0.000207f, -0.000057f, +0.000312f, -0.001501f, -0.001087f, -0.000239f, +0.000564f, + -0.000432f, -0.000194f, +0.000062f, +0.000267f, -0.000604f, -0.000103f, +0.000129f, -0.000483f, -0.000173f, -0.000256f, + +0.000180f, +0.000151f, +0.000429f, -0.000143f, -0.000232f, -0.000004f, -0.000067f, -0.000232f, -0.000274f, +0.000074f, + +0.000333f, +0.000265f, -0.000026f, +0.000048f, +0.000095f, -0.000004f, -0.000065f, -0.000041f, +0.000024f, +0.000206f, + +0.000017f, -0.000131f, -0.000094f, -0.000085f, -0.000005f, +0.000022f, +0.000062f, +0.000052f, -0.000011f, +0.000020f, + +0.000076f, +0.000112f, +0.000031f, +0.000029f, -0.000098f, -0.000049f, +0.000080f, +0.000002f, -0.000047f, +0.000003f, + +0.000016f, -0.000042f, +0.000002f, -0.000068f, -0.000078f, +0.000006f + }, + { + -0.000646f, -0.000152f, +0.001641f, -0.000463f, +0.000070f, -0.000166f, -0.000059f, -0.000018f, -0.000148f, +0.000417f, + +0.000056f, -0.000163f, -0.000131f, -0.001030f, +0.004321f, -0.000703f, +0.001457f, -0.001242f, +0.001495f, -0.000437f, + -0.001822f, -0.002108f, -0.000312f, +0.000623f, -0.001027f, +0.000479f, -0.001350f, +0.000759f, -0.002058f, -0.002057f, + +0.001179f, -0.000716f, +0.000415f, +0.000634f, +0.001190f, -0.000107f, +0.000484f, +0.001043f, +0.000584f, -0.000203f, + +0.000297f, +0.000863f, -0.000101f, -0.000195f, +0.000047f, +0.000128f, -0.000014f, +0.000295f, -0.000564f, -0.000350f, + +0.000016f, +0.000365f, -0.000257f, -0.000022f, -0.000018f, +0.000078f, +0.000145f, +0.000209f, -0.000043f, +0.000039f, + -0.000122f, -0.000084f, +0.000037f, -0.000011f, -0.000016f, -0.000029f, -0.000055f, -0.000148f, +0.000001f, -0.000033f, + +0.000083f, +0.000227f, +0.000082f, -0.000006f, -0.000076f, +0.000006f, +0.000124f, +0.000094f, +0.000144f, -0.000011f, + -0.000008f, +0.000045f, +0.000002f, -0.000084f, -0.000017f, +0.000032f, +0.000012f, -0.000010f, +0.000024f, +0.000056f, + -0.000034f, -0.000103f, +0.000022f, +0.000057f, +0.000039f, +0.000015f + }, + { + +0.006157f, +0.008677f, -0.001088f, -0.000467f, +0.000094f, +0.000349f, -0.000100f, +0.000442f, +0.000428f, -0.000325f, + +0.000651f, -0.000254f, +0.000173f, +0.000988f, -0.001536f, +0.000716f, +0.000937f, +0.000401f, -0.000003f, -0.001212f, + -0.000353f, +0.000315f, -0.000113f, -0.000227f, +0.000149f, -0.000880f, +0.000180f, -0.000025f, -0.000422f, +0.000056f, + -0.000112f, +0.000081f, -0.000466f, +0.000354f, +0.000416f, +0.000302f, +0.000300f, -0.000238f, -0.000386f, +0.000654f, + +0.000230f, +0.000268f, +0.000285f, +0.000002f, +0.000617f, -0.000737f, +0.000207f, -0.000279f, +0.000323f, +0.000149f, + -0.000125f, -0.000043f, -0.000323f, +0.000043f, -0.000103f, +0.000089f, +0.000229f, +0.000005f, +0.000228f, +0.000164f, + +0.000328f, +0.000049f, +0.000172f, -0.000131f, -0.000120f, -0.000074f, +0.000156f, +0.000050f, +0.000024f, -0.000013f, + +0.000032f, -0.000144f, +0.000008f, +0.000147f, -0.000063f, -0.000067f, +0.000021f, +0.000076f, -0.000023f, +0.000034f, + +0.000062f, -0.000086f, +0.000023f, +0.000060f, -0.000042f, -0.000092f, +0.000117f, +0.000084f, -0.000027f, -0.000084f, + +0.000008f, +0.000078f, -0.000022f, -0.000009f, -0.000035f, -0.000013f + }, + { + -0.000659f, -0.000560f, +0.002251f, +0.000415f, +0.000294f, -0.000226f, -0.000173f, +0.000335f, +0.000404f, +0.000228f, + -0.000085f, -0.000387f, -0.001346f, +0.001979f, +0.011893f, +0.001279f, -0.001687f, -0.004044f, +0.000400f, -0.000522f, + -0.002514f, -0.000374f, +0.000625f, -0.001347f, -0.003867f, -0.000877f, -0.000867f, -0.000861f, -0.001562f, -0.000422f, + +0.000049f, -0.000153f, -0.000583f, -0.000036f, -0.000511f, +0.000360f, +0.000048f, +0.000199f, -0.000814f, -0.000117f, + -0.000347f, -0.000041f, +0.000235f, -0.000217f, -0.000172f, -0.000248f, +0.000435f, -0.000151f, -0.000383f, +0.000059f, + +0.000008f, -0.000529f, +0.000069f, +0.000021f, +0.000234f, +0.000057f, +0.000396f, +0.000448f, -0.000256f, -0.000106f, + +0.000104f, +0.000233f, +0.000242f, +0.000028f, +0.000102f, -0.000135f, -0.000036f, +0.000073f, +0.000076f, -0.000028f, + -0.000011f, -0.000067f, -0.000068f, +0.000017f, -0.000024f, +0.000038f, -0.000021f, +0.000028f, +0.000044f, +0.000095f, + +0.000104f, -0.000087f, -0.000077f, -0.000072f, +0.000019f, +0.000056f, +0.000017f, +0.000087f, -0.000065f, +0.000012f, + +0.000049f, -0.000065f, +0.000016f, -0.000001f, +0.000023f, +0.000010f + }, + { + -0.002308f, +0.008586f, +0.006837f, -0.000021f, -0.000441f, +0.000297f, +0.000141f, +0.000423f, -0.000899f, +0.000851f, + +0.000326f, -0.000515f, -0.000792f, -0.002977f, -0.000741f, -0.000084f, +0.001460f, +0.000753f, +0.000440f, -0.000234f, + +0.000004f, +0.000381f, -0.000465f, -0.000326f, -0.000541f, -0.000119f, +0.000262f, -0.000016f, -0.000046f, +0.000814f, + +0.001203f, +0.001055f, -0.000286f, -0.000522f, -0.000600f, -0.000200f, -0.000896f, -0.000226f, +0.001174f, +0.000678f, + -0.000082f, +0.000736f, -0.000568f, -0.000359f, -0.000145f, +0.000196f, +0.000414f, +0.000781f, -0.000154f, -0.000610f, + -0.000063f, +0.000365f, +0.000063f, +0.000536f, -0.000154f, -0.000004f, -0.000222f, -0.000017f, -0.000120f, +0.000011f, + -0.000083f, -0.000079f, +0.000123f, +0.000064f, -0.000021f, -0.000241f, -0.000116f, -0.000034f, -0.000280f, +0.000013f, + -0.000044f, -0.000010f, -0.000033f, +0.000057f, +0.000027f, +0.000053f, -0.000037f, -0.000036f, -0.000006f, +0.000041f, + -0.000079f, +0.000069f, -0.000002f, +0.000074f, -0.000068f, +0.000001f, +0.000027f, +0.000020f, +0.000061f, +0.000135f, + +0.000020f, -0.000013f, -0.000053f, +0.000027f, +0.000079f, -0.000026f + }, + { + -0.000400f, +0.006138f, +0.002585f, +0.003509f, -0.000845f, +0.000247f, +0.001166f, -0.000513f, -0.000230f, +0.001025f, + +0.000059f, -0.000222f, -0.002036f, +0.001282f, +0.001134f, +0.000795f, -0.001664f, -0.000636f, +0.000741f, +0.001192f, + +0.001068f, -0.000774f, +0.000255f, -0.000172f, +0.000876f, +0.000544f, +0.000111f, +0.000201f, -0.000267f, +0.000197f, + +0.000441f, -0.001338f, +0.001044f, +0.000534f, -0.000127f, +0.000738f, +0.000205f, +0.000556f, +0.000851f, -0.000443f, + -0.000056f, -0.000042f, +0.000429f, -0.000074f, +0.000291f, +0.000896f, -0.000176f, +0.000315f, -0.000301f, -0.000019f, + +0.000254f, +0.000110f, -0.000185f, +0.000153f, -0.000291f, -0.000347f, +0.000047f, +0.000149f, +0.000100f, +0.000244f, + +0.000069f, -0.000125f, -0.000129f, -0.000298f, -0.000061f, -0.000175f, +0.000010f, +0.000196f, +0.000228f, +0.000088f, + -0.000004f, +0.000094f, +0.000000f, -0.000083f, +0.000065f, -0.000062f, -0.000044f, -0.000044f, -0.000080f, -0.000038f, + -0.000112f, -0.000015f, -0.000026f, +0.000013f, +0.000024f, +0.000068f, -0.000004f, -0.000041f, -0.000062f, -0.000029f, + +0.000045f, -0.000029f, +0.000018f, +0.000021f, +0.000074f, +0.000072f + }, + { + -0.007747f, -0.008646f, -0.000044f, -0.002963f, -0.001145f, -0.001322f, +0.008092f, -0.000653f, -0.000840f, +0.000134f, + +0.000379f, -0.000436f, -0.000030f, +0.001769f, -0.000435f, -0.002441f, +0.000059f, +0.000353f, -0.000679f, +0.000722f, + +0.000146f, +0.000484f, +0.001069f, -0.000328f, +0.000171f, -0.000288f, +0.000061f, -0.000948f, -0.000097f, -0.000267f, + +0.000314f, +0.000359f, -0.000158f, -0.000469f, +0.000236f, +0.000103f, +0.000045f, +0.000575f, -0.000154f, -0.001256f, + +0.000223f, +0.000838f, -0.000333f, +0.000038f, -0.000856f, +0.000196f, +0.000182f, +0.000000f, +0.000001f, -0.000052f, + +0.000531f, -0.000051f, +0.000328f, +0.000018f, -0.000044f, -0.000135f, -0.000081f, +0.000231f, +0.000264f, -0.000052f, + -0.000036f, +0.000173f, -0.000012f, -0.000162f, +0.000055f, +0.000067f, -0.000064f, +0.000021f, -0.000069f, +0.000052f, + -0.000038f, -0.000034f, +0.000021f, +0.000163f, +0.000080f, +0.000115f, +0.000013f, -0.000038f, -0.000051f, +0.000032f, + -0.000132f, +0.000041f, -0.000035f, -0.000076f, +0.000059f, +0.000005f, +0.000069f, +0.000016f, +0.000053f, -0.000038f, + -0.000027f, +0.000018f, +0.000038f, -0.000073f, -0.000037f, +0.000047f + }, + { + -0.000051f, -0.007085f, -0.000708f, +0.000526f, -0.000091f, +0.000466f, -0.000411f, -0.000366f, +0.000270f, -0.000192f, + +0.000452f, -0.000929f, +0.002605f, -0.000951f, +0.002057f, -0.000456f, -0.000580f, +0.000098f, +0.001059f, +0.000927f, + +0.000479f, +0.000763f, +0.000283f, +0.001064f, +0.003064f, +0.001316f, +0.000197f, +0.000288f, -0.001794f, -0.000323f, + +0.001386f, -0.000906f, +0.000513f, -0.000594f, +0.000479f, -0.000743f, -0.000538f, +0.000425f, +0.000986f, -0.000010f, + -0.000038f, -0.000065f, -0.000017f, +0.000184f, +0.000238f, -0.000130f, -0.000034f, -0.000219f, -0.000142f, +0.000324f, + +0.000117f, -0.000295f, -0.000141f, +0.000179f, +0.000201f, -0.000064f, -0.000165f, -0.000222f, -0.000253f, -0.000135f, + -0.000172f, +0.000071f, -0.000030f, -0.000152f, -0.000268f, -0.000034f, +0.000157f, -0.000195f, +0.000152f, +0.000125f, + +0.000042f, -0.000030f, -0.000071f, -0.000030f, -0.000034f, +0.000149f, +0.000107f, +0.000022f, +0.000064f, -0.000019f, + -0.000009f, +0.000070f, -0.000084f, -0.000056f, -0.000030f, -0.000042f, -0.000033f, -0.000058f, -0.000034f, +0.000024f, + +0.000013f, +0.000032f, +0.000043f, -0.000000f, -0.000011f, +0.000025f + }, + { + +0.000398f, +0.000771f, +0.004412f, +0.001862f, -0.001596f, +0.000607f, +0.001647f, -0.000204f, -0.000001f, +0.001278f, + +0.000947f, +0.000596f, -0.001231f, -0.004420f, +0.000016f, -0.001012f, +0.000495f, +0.001767f, -0.000526f, +0.000079f, + +0.001246f, -0.000178f, +0.000274f, -0.000023f, -0.000515f, -0.000464f, +0.000693f, +0.000578f, +0.000572f, +0.000654f, + +0.000315f, -0.000091f, +0.000034f, -0.000051f, -0.000427f, +0.000560f, +0.000467f, -0.000586f, +0.000131f, -0.000131f, + -0.000289f, -0.000438f, -0.000335f, -0.000683f, -0.000421f, -0.000527f, -0.000436f, -0.000278f, -0.000282f, -0.000288f, + -0.000003f, +0.000099f, +0.000091f, +0.000254f, +0.000267f, -0.000122f, +0.000371f, +0.000123f, +0.000092f, -0.000300f, + +0.000170f, +0.000039f, +0.000246f, -0.000036f, +0.000100f, -0.000080f, -0.000145f, -0.000024f, -0.000093f, +0.000158f, + +0.000079f, -0.000184f, +0.000004f, +0.000112f, +0.000008f, +0.000091f, -0.000081f, +0.000023f, +0.000027f, +0.000080f, + +0.000086f, -0.000126f, -0.000111f, -0.000004f, +0.000070f, +0.000074f, -0.000139f, -0.000004f, -0.000000f, -0.000079f, + -0.000025f, -0.000053f, +0.000003f, +0.000058f, +0.000011f, +0.000068f + }, + { + -0.000156f, -0.000684f, -0.001024f, +0.000052f, +0.000045f, +0.000707f, +0.000125f, +0.000240f, -0.000252f, +0.000448f, + -0.000106f, +0.000526f, -0.001118f, +0.001366f, +0.028285f, +0.000298f, +0.001219f, +0.000249f, +0.001220f, -0.002074f, + +0.001859f, +0.000071f, +0.000779f, +0.001264f, +0.002229f, +0.000934f, -0.000471f, -0.000604f, +0.002465f, -0.000483f, + -0.000399f, -0.000467f, -0.000290f, -0.000922f, +0.000119f, +0.000031f, -0.000296f, -0.000545f, +0.000108f, -0.000167f, + -0.000690f, +0.000196f, -0.000002f, +0.000483f, +0.000089f, +0.000081f, -0.000107f, +0.000525f, +0.000396f, -0.000050f, + +0.000362f, +0.000375f, +0.000078f, -0.000200f, +0.000067f, -0.000190f, -0.000045f, -0.000034f, -0.000063f, +0.000094f, + -0.000054f, +0.000239f, -0.000157f, -0.000005f, +0.000028f, +0.000154f, -0.000021f, +0.000259f, +0.000024f, +0.000134f, + +0.000109f, -0.000141f, -0.000107f, +0.000072f, -0.000054f, +0.000023f, +0.000017f, -0.000163f, +0.000087f, -0.000053f, + +0.000053f, +0.000160f, -0.000050f, +0.000012f, -0.000060f, -0.000082f, -0.000138f, +0.000032f, +0.000103f, -0.000062f, + -0.000001f, +0.000115f, +0.000004f, -0.000064f, +0.000031f, +0.000017f + }, + { + +0.002517f, +0.006937f, -0.004126f, -0.001446f, -0.000650f, +0.003285f, +0.000913f, -0.000063f, +0.000013f, -0.000651f, + -0.001827f, +0.000786f, +0.000883f, +0.000425f, -0.006411f, -0.000445f, +0.001497f, -0.000774f, +0.000346f, +0.001058f, + -0.000634f, -0.000151f, -0.000098f, +0.000285f, +0.000539f, +0.000067f, -0.001180f, -0.000453f, +0.000543f, +0.000445f, + -0.000158f, -0.000046f, -0.000487f, -0.000375f, -0.000795f, +0.000548f, -0.000009f, -0.000068f, +0.000472f, +0.000429f, + +0.000024f, -0.000031f, +0.000578f, +0.000490f, -0.000142f, -0.000152f, -0.000918f, -0.000454f, -0.000105f, +0.000292f, + -0.000466f, +0.000239f, +0.000545f, +0.000179f, +0.000033f, +0.000133f, -0.000295f, +0.000029f, -0.000067f, +0.000152f, + +0.000068f, -0.000158f, +0.000013f, -0.000066f, +0.000019f, -0.000010f, +0.000000f, -0.000025f, -0.000155f, -0.000020f, + +0.000034f, -0.000259f, -0.000107f, +0.000138f, +0.000184f, +0.000001f, -0.000067f, -0.000000f, +0.000003f, -0.000033f, + -0.000072f, -0.000007f, +0.000078f, +0.000000f, -0.000011f, +0.000008f, +0.000008f, +0.000040f, +0.000080f, -0.000108f, + -0.000052f, -0.000024f, -0.000060f, -0.000012f, +0.000028f, +0.000043f + } + }, + { + { + -0.001314f, +0.011728f, -0.000879f, +0.000016f, +0.000724f, +0.000067f, -0.000202f, -0.000044f, -0.000131f, -0.000142f, + +0.000871f, -0.000354f, +0.000333f, +0.000270f, -0.004773f, +0.000830f, -0.000545f, +0.000581f, +0.001414f, -0.000433f, + +0.000921f, +0.001913f, +0.000251f, -0.000783f, -0.000667f, -0.000646f, -0.000704f, +0.000387f, +0.000874f, -0.000590f, + -0.000797f, +0.000312f, +0.000636f, -0.000601f, -0.000712f, +0.000072f, +0.001003f, -0.001170f, -0.000255f, -0.000182f, + +0.000728f, +0.000316f, -0.000568f, +0.000296f, +0.000394f, +0.000190f, -0.000283f, +0.000576f, -0.000339f, +0.000345f, + +0.000340f, +0.000028f, +0.000325f, +0.000253f, +0.000129f, +0.000053f, -0.000272f, -0.000203f, -0.000070f, +0.000318f, + -0.000100f, +0.000054f, +0.000091f, +0.000056f, +0.000042f, +0.000091f, -0.000073f, -0.000097f, +0.000263f, -0.000032f, + -0.000054f, -0.000046f, +0.000095f, +0.000004f, -0.000021f, +0.000002f, -0.000011f, +0.000074f, +0.000092f, -0.000006f, + +0.000003f, +0.000063f, +0.000084f, +0.000042f, +0.000023f, -0.000076f, -0.000014f, -0.000022f, +0.000017f, -0.000080f, + +0.000054f, -0.000017f, +0.000013f, +0.000010f, -0.000070f, -0.000057f + }, + { + -0.009155f, +0.074733f, -0.005871f, +0.003459f, -0.000183f, -0.000009f, +0.000016f, -0.000871f, -0.000227f, +0.000315f, + +0.000231f, +0.000220f, -0.000502f, +0.000298f, -0.000044f, -0.001872f, -0.000226f, -0.000615f, +0.001350f, +0.000239f, + +0.000311f, -0.000110f, -0.000085f, -0.000047f, -0.000385f, +0.000292f, -0.001494f, -0.000436f, -0.000433f, +0.000033f, + -0.000078f, +0.001088f, -0.000461f, -0.000585f, +0.000101f, -0.000025f, +0.000550f, -0.000921f, -0.000087f, -0.000679f, + +0.000085f, -0.000200f, +0.000085f, -0.000036f, -0.000020f, -0.000306f, -0.000222f, -0.000451f, -0.000256f, +0.000479f, + +0.000041f, +0.000051f, +0.000158f, -0.000240f, -0.000087f, -0.000384f, +0.000089f, +0.000085f, -0.000017f, +0.000265f, + +0.000052f, -0.000122f, -0.000095f, +0.000069f, -0.000201f, +0.000062f, +0.000021f, -0.000021f, +0.000134f, -0.000185f, + -0.000012f, -0.000083f, -0.000105f, +0.000018f, -0.000141f, +0.000048f, +0.000090f, -0.000091f, -0.000001f, -0.000003f, + +0.000078f, -0.000049f, -0.000067f, +0.000034f, +0.000065f, -0.000194f, +0.000078f, +0.000078f, -0.000009f, -0.000012f, + -0.000054f, -0.000003f, +0.000069f, -0.000024f, +0.000008f, -0.000019f + }, + { + -0.001274f, +0.033827f, -0.007787f, +0.003496f, +0.000530f, -0.000634f, +0.000302f, -0.000612f, -0.000192f, -0.000931f, + -0.000270f, -0.000412f, -0.000017f, -0.000894f, +0.003712f, -0.000076f, -0.000074f, +0.000130f, -0.000950f, +0.000435f, + -0.000245f, +0.000075f, +0.000905f, -0.000556f, +0.001158f, +0.000914f, +0.000338f, -0.000686f, -0.000131f, +0.000331f, + +0.000288f, -0.000027f, +0.001148f, +0.000088f, -0.001099f, +0.000591f, -0.000178f, +0.000723f, -0.000230f, -0.000055f, + -0.000014f, +0.000187f, +0.000276f, +0.000213f, -0.000120f, -0.000274f, -0.000499f, +0.000315f, +0.000222f, +0.000174f, + -0.000013f, -0.000069f, +0.000013f, +0.000128f, -0.000133f, +0.000310f, +0.000142f, +0.000077f, -0.000083f, -0.000085f, + +0.000111f, +0.000152f, +0.000233f, -0.000091f, +0.000035f, -0.000106f, +0.000194f, +0.000042f, +0.000127f, +0.000116f, + +0.000036f, -0.000030f, +0.000016f, -0.000006f, +0.000043f, -0.000061f, +0.000002f, -0.000019f, -0.000151f, -0.000003f, + -0.000004f, +0.000058f, +0.000076f, +0.000007f, -0.000064f, -0.000027f, -0.000082f, -0.000052f, +0.000059f, -0.000093f, + +0.000066f, +0.000027f, +0.000065f, -0.000006f, +0.000004f, -0.000035f + }, + { + +0.000759f, +0.001021f, -0.001365f, +0.000506f, +0.000070f, -0.000193f, +0.000306f, -0.000122f, -0.000153f, -0.000051f, + +0.000361f, +0.000132f, -0.000592f, +0.000691f, +0.004401f, -0.000712f, -0.002067f, +0.000051f, +0.000148f, +0.000261f, + -0.000537f, +0.000752f, +0.000299f, -0.000827f, +0.001507f, -0.001318f, -0.002334f, +0.000087f, +0.000896f, +0.002619f, + -0.001448f, -0.000998f, +0.001515f, -0.000435f, -0.000476f, -0.000338f, +0.001345f, -0.000361f, +0.000233f, -0.000361f, + +0.000218f, +0.000589f, -0.000115f, +0.000210f, -0.000636f, +0.000452f, +0.000143f, -0.000030f, +0.000379f, +0.000139f, + -0.000500f, -0.000016f, +0.000136f, -0.000230f, +0.000290f, +0.000072f, -0.000141f, +0.000086f, -0.000021f, -0.000050f, + +0.000052f, +0.000043f, -0.000028f, +0.000012f, +0.000165f, +0.000103f, -0.000025f, -0.000058f, +0.000113f, +0.000025f, + -0.000311f, -0.000045f, +0.000057f, +0.000134f, -0.000046f, +0.000109f, +0.000148f, +0.000052f, +0.000026f, -0.000090f, + -0.000012f, +0.000066f, -0.000011f, +0.000015f, +0.000040f, -0.000046f, -0.000012f, +0.000076f, +0.000044f, -0.000013f, + -0.000024f, +0.000040f, +0.000068f, +0.000020f, -0.000002f, +0.000033f + }, + { + -0.002242f, -0.013632f, +0.002956f, -0.000795f, +0.000607f, -0.000153f, +0.000027f, +0.000262f, +0.000748f, -0.000653f, + +0.000905f, +0.000258f, -0.000074f, +0.000524f, -0.001561f, -0.000260f, +0.000274f, -0.000389f, +0.000119f, -0.000866f, + -0.000185f, +0.000151f, -0.000369f, -0.000252f, +0.000235f, +0.000123f, +0.001016f, +0.000357f, +0.000827f, +0.000338f, + -0.000203f, +0.000840f, -0.000017f, +0.000860f, -0.000032f, +0.000173f, -0.001574f, +0.000415f, +0.000638f, +0.000529f, + -0.000539f, -0.000166f, -0.000053f, +0.000093f, -0.000606f, +0.000347f, +0.000611f, -0.000047f, +0.000186f, -0.000037f, + +0.000514f, -0.000025f, +0.000121f, -0.000004f, -0.000140f, +0.000045f, -0.000186f, -0.000193f, -0.000208f, +0.000065f, + -0.000062f, +0.000021f, +0.000011f, -0.000106f, -0.000005f, +0.000036f, -0.000022f, +0.000020f, -0.000004f, +0.000052f, + -0.000110f, -0.000169f, -0.000064f, +0.000138f, +0.000024f, -0.000027f, +0.000152f, -0.000017f, +0.000020f, +0.000041f, + +0.000056f, +0.000114f, +0.000007f, -0.000047f, -0.000050f, +0.000008f, +0.000022f, -0.000039f, -0.000105f, -0.000036f, + -0.000009f, -0.000042f, -0.000023f, -0.000074f, +0.000011f, +0.000013f + }, + { + -0.000245f, +0.004252f, +0.000840f, -0.001104f, +0.000069f, -0.000063f, +0.000312f, +0.000130f, -0.000078f, -0.000037f, + -0.000336f, -0.000148f, -0.000348f, -0.001297f, +0.006314f, -0.000467f, -0.000579f, -0.000098f, +0.002000f, -0.000303f, + +0.001023f, -0.000465f, +0.002175f, +0.002397f, -0.000896f, +0.002394f, -0.000365f, -0.000122f, -0.000230f, -0.001265f, + +0.000667f, -0.000558f, +0.000161f, +0.000480f, +0.000999f, -0.000413f, +0.000123f, +0.000436f, -0.000001f, -0.000455f, + +0.000650f, +0.000271f, -0.000114f, +0.000164f, +0.000212f, +0.000055f, -0.000157f, +0.000157f, -0.000248f, -0.000007f, + +0.000145f, +0.000182f, -0.000320f, -0.000085f, -0.000028f, -0.000103f, -0.000066f, +0.000117f, -0.000065f, -0.000014f, + -0.000095f, +0.000097f, -0.000131f, -0.000118f, -0.000046f, -0.000021f, +0.000086f, -0.000047f, +0.000113f, -0.000054f, + +0.000145f, +0.000086f, -0.000116f, -0.000021f, +0.000082f, +0.000034f, +0.000096f, +0.000081f, +0.000047f, -0.000103f, + +0.000096f, +0.000014f, +0.000001f, -0.000022f, +0.000036f, +0.000020f, -0.000012f, +0.000004f, +0.000027f, +0.000018f, + -0.000078f, -0.000002f, +0.000089f, +0.000008f, +0.000009f, -0.000028f + }, + { + +0.002021f, +0.012371f, +0.004943f, -0.001976f, +0.000294f, +0.000242f, +0.000031f, -0.000315f, +0.000083f, -0.000435f, + +0.000047f, -0.000801f, +0.000270f, +0.000675f, -0.002542f, -0.001194f, +0.000042f, +0.000040f, -0.000356f, -0.000456f, + -0.000239f, +0.000420f, -0.000182f, -0.000274f, +0.000084f, -0.000597f, +0.000676f, -0.000036f, -0.000161f, -0.000018f, + +0.000090f, +0.000513f, -0.000189f, +0.000528f, +0.000231f, +0.000589f, +0.000249f, +0.000131f, -0.000108f, +0.000201f, + -0.000068f, +0.000312f, +0.000104f, -0.000086f, +0.000719f, -0.000118f, +0.000048f, -0.000311f, +0.000474f, -0.000123f, + -0.000364f, +0.000061f, -0.000147f, -0.000075f, +0.000202f, +0.000122f, +0.000125f, +0.000017f, +0.000234f, +0.000071f, + +0.000075f, -0.000162f, +0.000158f, -0.000017f, +0.000039f, +0.000101f, +0.000145f, -0.000135f, -0.000011f, +0.000091f, + -0.000035f, -0.000170f, +0.000137f, +0.000077f, -0.000058f, +0.000046f, +0.000086f, +0.000024f, +0.000005f, +0.000067f, + -0.000019f, -0.000021f, +0.000066f, +0.000021f, -0.000133f, +0.000054f, +0.000085f, +0.000011f, -0.000042f, -0.000022f, + +0.000086f, -0.000023f, +0.000007f, -0.000021f, +0.000013f, +0.000032f + }, + { + +0.000035f, +0.002503f, +0.000514f, -0.000288f, -0.000061f, -0.000217f, -0.000165f, -0.000017f, +0.000078f, -0.000148f, + -0.000667f, -0.000067f, -0.000816f, +0.001240f, +0.010845f, -0.000989f, -0.000133f, -0.001147f, +0.000326f, +0.000940f, + -0.001801f, +0.000445f, +0.000101f, +0.000064f, -0.000008f, +0.001266f, +0.000241f, -0.000673f, -0.000393f, -0.000761f, + -0.000477f, -0.000386f, -0.000277f, +0.000464f, +0.000428f, +0.000496f, -0.000102f, -0.000166f, +0.000134f, +0.000301f, + -0.000115f, +0.000198f, +0.000245f, -0.000299f, +0.000010f, +0.000299f, +0.000609f, -0.000746f, -0.000476f, +0.000361f, + -0.000065f, -0.000078f, +0.000052f, +0.000222f, +0.000181f, +0.000121f, +0.000281f, +0.000053f, -0.000246f, +0.000146f, + -0.000011f, +0.000259f, +0.000095f, +0.000021f, -0.000007f, -0.000198f, +0.000134f, +0.000107f, +0.000038f, -0.000093f, + +0.000065f, -0.000011f, -0.000075f, +0.000081f, +0.000020f, +0.000017f, +0.000156f, +0.000088f, +0.000012f, +0.000040f, + -0.000081f, -0.000083f, -0.000016f, -0.000012f, +0.000030f, -0.000001f, +0.000063f, -0.000015f, -0.000038f, +0.000087f, + -0.000020f, -0.000017f, -0.000002f, -0.000042f, +0.000028f, -0.000014f + }, + { + +0.004963f, +0.005081f, -0.002134f, -0.000087f, +0.000444f, +0.000456f, -0.000716f, -0.000896f, -0.000292f, +0.001053f, + -0.001415f, -0.001606f, -0.000144f, -0.000030f, +0.000075f, -0.000571f, +0.000263f, -0.000332f, +0.000369f, -0.000169f, + +0.000128f, +0.000185f, +0.000277f, +0.000119f, -0.000519f, -0.000313f, -0.000059f, +0.000325f, -0.000296f, +0.000062f, + +0.000659f, -0.000051f, -0.000648f, -0.000334f, -0.000617f, +0.000848f, +0.000132f, +0.000191f, +0.000769f, +0.000015f, + -0.000300f, +0.000478f, -0.000465f, -0.000001f, -0.000373f, +0.000244f, +0.000100f, +0.000304f, -0.000194f, -0.000448f, + +0.000476f, +0.000136f, -0.000457f, +0.000423f, -0.000188f, -0.000152f, -0.000108f, +0.000038f, -0.000090f, +0.000054f, + -0.000130f, -0.000164f, +0.000043f, -0.000092f, -0.000085f, +0.000094f, +0.000144f, +0.000006f, -0.000069f, +0.000110f, + -0.000100f, -0.000040f, -0.000001f, +0.000079f, +0.000126f, -0.000110f, -0.000020f, -0.000006f, +0.000045f, +0.000018f, + -0.000058f, -0.000021f, -0.000041f, -0.000030f, -0.000108f, -0.000037f, +0.000129f, +0.000061f, +0.000031f, +0.000050f, + -0.000066f, -0.000007f, -0.000076f, +0.000068f, +0.000039f, -0.000021f + }, + { + +0.000595f, +0.002663f, -0.000690f, +0.000425f, -0.000223f, +0.001984f, +0.000553f, -0.000872f, -0.000523f, +0.000046f, + -0.000133f, -0.000199f, -0.001732f, -0.000450f, -0.001886f, -0.000003f, -0.001163f, +0.000777f, +0.001523f, +0.000067f, + +0.000082f, +0.000352f, +0.001814f, +0.000719f, +0.000663f, -0.000349f, -0.000757f, -0.000357f, -0.000523f, +0.000178f, + -0.000055f, -0.000928f, +0.000445f, +0.000551f, -0.000676f, +0.000071f, +0.000491f, +0.000653f, +0.000414f, -0.000246f, + +0.000165f, +0.000014f, +0.000091f, -0.000449f, +0.000225f, +0.000321f, -0.000116f, +0.000165f, -0.000310f, +0.000293f, + +0.000231f, +0.000064f, -0.000009f, -0.000106f, -0.000450f, -0.000153f, +0.000167f, +0.000110f, +0.000121f, +0.000197f, + +0.000002f, -0.000095f, -0.000224f, -0.000138f, -0.000124f, -0.000135f, +0.000172f, +0.000159f, +0.000209f, -0.000079f, + +0.000028f, -0.000010f, -0.000059f, +0.000034f, +0.000060f, -0.000043f, -0.000067f, -0.000050f, -0.000121f, -0.000034f, + -0.000053f, +0.000016f, +0.000052f, +0.000028f, +0.000022f, +0.000005f, -0.000029f, +0.000012f, -0.000032f, +0.000058f, + +0.000025f, +0.000033f, +0.000025f, +0.000003f, +0.000051f, +0.000033f + }, + { + +0.007099f, -0.001117f, -0.006679f, +0.002499f, +0.000990f, -0.000971f, +0.005825f, -0.002270f, -0.000481f, +0.000467f, + -0.000038f, -0.000363f, -0.000015f, +0.001124f, -0.001737f, -0.001075f, +0.001180f, +0.000554f, -0.000437f, +0.000417f, + -0.001724f, +0.000301f, +0.000713f, -0.000274f, -0.000036f, -0.000323f, +0.000054f, -0.001013f, +0.000519f, +0.000026f, + +0.000309f, -0.000081f, -0.000118f, -0.000034f, +0.000025f, -0.000253f, +0.000272f, +0.000346f, +0.000146f, +0.000248f, + +0.000569f, +0.000267f, -0.000589f, +0.000110f, -0.000548f, -0.000023f, -0.000191f, +0.000192f, +0.000120f, -0.000333f, + +0.000256f, -0.000147f, +0.000270f, -0.000295f, -0.000067f, -0.000151f, -0.000206f, +0.000363f, -0.000033f, -0.000089f, + +0.000083f, +0.000125f, -0.000136f, -0.000146f, +0.000047f, -0.000043f, -0.000058f, +0.000006f, +0.000017f, -0.000041f, + -0.000061f, +0.000040f, +0.000031f, +0.000174f, -0.000017f, +0.000128f, -0.000011f, -0.000112f, +0.000008f, +0.000021f, + -0.000083f, +0.000078f, -0.000060f, +0.000051f, -0.000003f, +0.000097f, +0.000013f, +0.000010f, +0.000004f, -0.000055f, + +0.000024f, -0.000021f, -0.000031f, -0.000036f, +0.000028f, +0.000013f + }, + { + -0.000086f, -0.004481f, +0.000617f, -0.000318f, -0.000143f, -0.000002f, -0.000478f, -0.000319f, +0.000572f, +0.000002f, + -0.000296f, -0.001168f, +0.002263f, -0.003994f, -0.001081f, -0.000905f, +0.000237f, +0.001522f, +0.000565f, -0.000880f, + +0.000143f, +0.001058f, +0.000309f, +0.000004f, +0.000608f, -0.000705f, -0.001205f, +0.000491f, -0.001186f, +0.001711f, + +0.000404f, -0.000742f, +0.000091f, -0.000406f, -0.000081f, -0.000327f, -0.000023f, +0.000514f, +0.000377f, +0.000048f, + -0.000284f, -0.000127f, +0.000221f, +0.000092f, +0.000076f, +0.000142f, -0.000119f, -0.000110f, +0.000014f, +0.000273f, + -0.000101f, -0.000222f, +0.000079f, +0.000043f, -0.000097f, -0.000123f, -0.000126f, -0.000393f, -0.000190f, -0.000162f, + +0.000115f, +0.000011f, +0.000011f, -0.000157f, -0.000086f, +0.000177f, +0.000034f, -0.000003f, +0.000138f, +0.000061f, + +0.000071f, +0.000052f, +0.000081f, +0.000081f, -0.000009f, +0.000124f, +0.000066f, -0.000073f, +0.000025f, -0.000070f, + -0.000006f, +0.000058f, -0.000085f, -0.000054f, -0.000009f, -0.000063f, -0.000024f, -0.000008f, +0.000008f, +0.000022f, + +0.000017f, +0.000030f, +0.000037f, -0.000052f, -0.000022f, +0.000053f + }, + { + +0.000612f, -0.002065f, +0.001650f, -0.000913f, -0.001074f, +0.003461f, +0.001992f, -0.001118f, -0.000543f, +0.002144f, + +0.000890f, +0.000064f, +0.001206f, -0.000966f, +0.001768f, -0.000976f, +0.000088f, +0.001424f, -0.000750f, +0.001031f, + +0.000295f, -0.000534f, +0.000062f, +0.000704f, +0.000622f, +0.000297f, -0.000116f, +0.000568f, +0.000554f, -0.000012f, + +0.000030f, -0.000303f, +0.000487f, +0.000373f, -0.000165f, +0.000350f, +0.000604f, +0.000074f, +0.000634f, +0.000006f, + -0.000403f, -0.000460f, +0.000295f, -0.000940f, -0.000129f, -0.000377f, +0.000186f, -0.000348f, +0.000008f, -0.000452f, + +0.000168f, +0.000196f, +0.000062f, +0.000512f, +0.000053f, -0.000047f, +0.000299f, -0.000157f, -0.000123f, -0.000063f, + +0.000105f, -0.000192f, +0.000046f, -0.000119f, -0.000055f, -0.000111f, -0.000100f, +0.000032f, +0.000056f, +0.000048f, + -0.000091f, -0.000125f, +0.000116f, +0.000054f, -0.000009f, +0.000012f, -0.000115f, +0.000142f, +0.000016f, +0.000057f, + -0.000062f, -0.000113f, -0.000019f, +0.000052f, +0.000053f, -0.000038f, -0.000190f, -0.000010f, +0.000005f, -0.000025f, + +0.000003f, -0.000011f, +0.000118f, +0.000027f, +0.000040f, +0.000046f + }, + { + +0.000406f, -0.001450f, -0.000784f, +0.000362f, +0.000198f, +0.000390f, -0.000002f, +0.000485f, -0.000139f, +0.000137f, + -0.000074f, +0.000150f, -0.001030f, -0.010925f, +0.011123f, -0.001174f, +0.000299f, -0.001145f, +0.001350f, +0.000081f, + +0.002455f, +0.000061f, +0.000908f, -0.000214f, -0.000137f, -0.000190f, +0.000147f, +0.000293f, +0.001386f, -0.001597f, + -0.000906f, +0.000241f, +0.000967f, +0.000299f, +0.000069f, +0.000322f, -0.000087f, -0.000315f, +0.000648f, -0.000230f, + -0.000344f, +0.000529f, -0.000106f, +0.000115f, -0.000132f, -0.000304f, -0.000222f, +0.000160f, +0.000295f, -0.000190f, + +0.000320f, +0.000140f, -0.000167f, -0.000194f, +0.000161f, -0.000322f, -0.000022f, +0.000028f, -0.000044f, -0.000098f, + +0.000247f, +0.000161f, -0.000180f, +0.000096f, +0.000146f, -0.000109f, -0.000063f, +0.000258f, +0.000001f, +0.000144f, + +0.000070f, -0.000163f, -0.000078f, +0.000053f, +0.000023f, +0.000035f, -0.000129f, +0.000008f, -0.000003f, +0.000009f, + +0.000126f, +0.000030f, -0.000037f, +0.000014f, -0.000099f, -0.000037f, -0.000085f, +0.000082f, +0.000001f, -0.000006f, + +0.000101f, +0.000073f, -0.000072f, -0.000023f, +0.000039f, -0.000062f + }, + { + -0.002177f, -0.001694f, -0.001290f, +0.003456f, +0.000724f, +0.003709f, -0.000656f, +0.000239f, +0.000253f, -0.000149f, + +0.001988f, +0.001047f, -0.000290f, +0.001444f, -0.002923f, +0.001016f, +0.001482f, -0.001154f, +0.001148f, +0.001374f, + -0.000565f, -0.000115f, -0.000429f, +0.000395f, +0.000064f, +0.000094f, -0.001027f, +0.000076f, +0.000324f, -0.000435f, + +0.000009f, +0.000411f, -0.000027f, -0.000144f, -0.001126f, +0.000539f, -0.000494f, -0.000080f, +0.000356f, +0.000057f, + +0.000268f, -0.000370f, -0.000096f, +0.000272f, +0.000095f, -0.000390f, -0.000699f, +0.000268f, +0.000238f, +0.000182f, + +0.000027f, +0.000264f, +0.000208f, -0.000221f, +0.000038f, -0.000039f, -0.000399f, +0.000243f, -0.000131f, +0.000014f, + -0.000019f, -0.000318f, -0.000060f, -0.000113f, -0.000059f, -0.000130f, +0.000023f, -0.000016f, -0.000058f, -0.000041f, + +0.000057f, -0.000152f, -0.000009f, +0.000161f, +0.000019f, -0.000083f, -0.000096f, +0.000006f, +0.000008f, -0.000060f, + -0.000003f, +0.000067f, +0.000008f, +0.000006f, +0.000062f, +0.000103f, +0.000016f, +0.000086f, +0.000000f, -0.000073f, + -0.000015f, -0.000021f, +0.000001f, +0.000031f, +0.000009f, +0.000011f + } + }, + { + { + +0.000684f, +0.005315f, -0.000710f, +0.000454f, +0.000486f, -0.000110f, +0.000097f, -0.000139f, -0.000371f, +0.000106f, + -0.000568f, +0.000453f, -0.001539f, +0.001115f, -0.002467f, -0.000494f, -0.000074f, +0.000628f, -0.000430f, +0.000081f, + +0.001704f, -0.000571f, -0.001069f, -0.001826f, -0.000345f, -0.000596f, +0.000171f, -0.000215f, +0.000098f, +0.000022f, + -0.000762f, -0.000889f, +0.000073f, +0.000461f, -0.000189f, +0.000367f, +0.000520f, +0.000620f, +0.000735f, -0.000023f, + -0.000054f, +0.000148f, -0.000229f, +0.000305f, -0.000061f, +0.000082f, +0.000361f, +0.000715f, +0.000196f, +0.000187f, + +0.000116f, +0.000085f, +0.000167f, +0.000187f, -0.000349f, +0.000097f, +0.000117f, -0.000046f, +0.000265f, +0.000126f, + -0.000109f, -0.000315f, -0.000174f, +0.000119f, -0.000024f, +0.000026f, -0.000138f, +0.000029f, -0.000003f, -0.000264f, + +0.000064f, +0.000076f, +0.000119f, -0.000007f, +0.000005f, +0.000004f, +0.000064f, +0.000091f, -0.000032f, -0.000034f, + +0.000120f, +0.000002f, -0.000079f, -0.000125f, -0.000111f, +0.000032f, +0.000066f, -0.000019f, -0.000002f, +0.000028f, + +0.000052f, -0.000051f, +0.000031f, -0.000020f, +0.000023f, +0.000050f + }, + { + +0.006428f, +0.050680f, +0.000322f, +0.002705f, +0.001249f, +0.000014f, -0.000190f, +0.001379f, +0.000761f, +0.000320f, + +0.000583f, +0.000124f, -0.000052f, -0.000098f, -0.000680f, -0.000132f, +0.001340f, -0.000229f, -0.000934f, +0.001197f, + +0.000112f, +0.000847f, -0.000296f, +0.000013f, -0.000267f, -0.000586f, -0.000532f, -0.000265f, -0.000311f, -0.000243f, + +0.000047f, +0.000224f, +0.000103f, +0.000397f, -0.000183f, -0.000500f, +0.000166f, -0.000185f, +0.000512f, +0.000032f, + -0.000107f, -0.000454f, -0.000777f, +0.000424f, -0.000525f, -0.000118f, +0.000030f, -0.000084f, +0.000330f, +0.000149f, + +0.000176f, -0.000191f, -0.000387f, -0.000343f, -0.000268f, -0.000266f, -0.000120f, -0.000100f, +0.000045f, +0.000209f, + -0.000271f, -0.000268f, +0.000022f, -0.000037f, +0.000109f, +0.000228f, +0.000031f, -0.000028f, -0.000204f, -0.000107f, + +0.000005f, -0.000008f, +0.000071f, -0.000053f, -0.000017f, +0.000123f, -0.000088f, +0.000053f, +0.000139f, +0.000045f, + -0.000076f, -0.000060f, +0.000019f, -0.000054f, -0.000095f, -0.000020f, +0.000130f, -0.000055f, +0.000030f, -0.000008f, + +0.000001f, -0.000012f, -0.000015f, -0.000022f, +0.000011f, -0.000026f + }, + { + -0.000170f, +0.016323f, +0.006609f, -0.001083f, -0.001984f, -0.000098f, -0.000352f, -0.000528f, -0.000239f, +0.000093f, + +0.000530f, -0.000051f, +0.000532f, +0.001111f, +0.002375f, +0.000175f, +0.000115f, -0.000105f, +0.000477f, -0.000513f, + +0.000167f, +0.000658f, +0.000032f, +0.000854f, +0.000603f, +0.000070f, -0.000305f, +0.000387f, -0.000063f, +0.000525f, + +0.000366f, +0.000312f, -0.000068f, -0.000081f, +0.000494f, +0.000163f, +0.000018f, -0.000102f, +0.000231f, +0.000111f, + +0.000454f, -0.000770f, +0.000125f, +0.000108f, -0.000558f, +0.000254f, +0.000333f, -0.000225f, -0.000052f, -0.000129f, + +0.000238f, +0.000210f, +0.000117f, -0.000006f, -0.000157f, +0.000198f, +0.000069f, -0.000347f, +0.000081f, -0.000030f, + -0.000012f, -0.000045f, -0.000229f, -0.000022f, -0.000056f, -0.000170f, +0.000031f, +0.000024f, +0.000088f, -0.000043f, + +0.000023f, -0.000043f, +0.000003f, -0.000152f, +0.000025f, -0.000026f, -0.000025f, -0.000008f, -0.000066f, +0.000110f, + +0.000034f, +0.000037f, -0.000009f, -0.000066f, +0.000070f, -0.000010f, -0.000027f, +0.000029f, +0.000021f, +0.000022f, + +0.000052f, -0.000055f, -0.000001f, -0.000027f, -0.000007f, -0.000012f + }, + { + -0.000936f, +0.000088f, +0.001964f, -0.000348f, -0.000287f, +0.000325f, +0.000141f, +0.000010f, -0.000305f, +0.000148f, + +0.000006f, +0.000396f, +0.000398f, -0.000676f, +0.002792f, +0.000131f, +0.000034f, +0.000512f, +0.001872f, +0.000090f, + +0.000256f, +0.000415f, -0.000421f, -0.000034f, -0.000425f, +0.000046f, -0.001025f, -0.000623f, +0.000562f, +0.001552f, + +0.000054f, -0.001147f, +0.000496f, -0.000416f, +0.000408f, +0.000187f, -0.000458f, +0.000639f, -0.000070f, -0.000370f, + +0.000348f, -0.000027f, +0.000177f, +0.000200f, +0.000056f, +0.000166f, -0.000066f, +0.000023f, +0.000026f, -0.000169f, + -0.000258f, +0.000277f, -0.000237f, -0.000024f, +0.000058f, -0.000196f, +0.000104f, +0.000211f, -0.000123f, +0.000130f, + +0.000147f, -0.000035f, -0.000004f, +0.000166f, -0.000140f, -0.000108f, +0.000031f, +0.000027f, -0.000104f, -0.000089f, + +0.000057f, +0.000129f, +0.000057f, -0.000009f, +0.000008f, +0.000099f, +0.000021f, -0.000133f, -0.000110f, -0.000003f, + -0.000017f, -0.000013f, -0.000045f, +0.000039f, -0.000015f, +0.000050f, +0.000042f, -0.000019f, -0.000057f, -0.000016f, + +0.000016f, -0.000011f, -0.000100f, -0.000033f, -0.000000f, -0.000039f + }, + { + -0.004282f, -0.007442f, +0.003536f, -0.000637f, +0.000070f, -0.000223f, -0.000220f, +0.000206f, +0.000523f, +0.000261f, + +0.000953f, -0.000712f, +0.000205f, +0.000512f, -0.001009f, -0.000411f, -0.000706f, +0.000136f, +0.000393f, +0.000224f, + +0.000269f, -0.000491f, -0.000514f, +0.000563f, +0.000966f, -0.000192f, +0.000135f, +0.001530f, +0.000855f, +0.000390f, + +0.000443f, +0.000326f, +0.000574f, +0.000324f, -0.000152f, +0.000327f, +0.000329f, +0.001280f, +0.000236f, +0.000403f, + +0.000226f, -0.000348f, -0.000431f, +0.000243f, +0.000238f, -0.000363f, +0.000069f, +0.000371f, -0.000034f, -0.000043f, + +0.000452f, -0.000401f, +0.000097f, +0.000150f, -0.000042f, -0.000104f, -0.000064f, +0.000160f, +0.000091f, +0.000061f, + -0.000120f, -0.000026f, +0.000005f, -0.000094f, +0.000031f, -0.000045f, -0.000119f, +0.000169f, -0.000044f, -0.000090f, + -0.000072f, +0.000038f, +0.000256f, +0.000112f, -0.000123f, +0.000041f, -0.000010f, -0.000091f, +0.000054f, +0.000015f, + -0.000009f, +0.000014f, -0.000032f, -0.000025f, +0.000100f, +0.000022f, -0.000045f, -0.000020f, -0.000010f, +0.000014f, + +0.000002f, +0.000034f, -0.000005f, +0.000043f, +0.000026f, -0.000013f + }, + { + +0.000752f, +0.001995f, -0.002621f, +0.000742f, +0.000171f, +0.000142f, +0.000132f, -0.000131f, -0.000009f, -0.000329f, + +0.000054f, +0.000301f, +0.000175f, +0.002307f, +0.006785f, -0.000539f, -0.000455f, -0.000742f, +0.000112f, +0.001414f, + +0.000569f, +0.000470f, +0.001503f, +0.001341f, +0.001720f, +0.002253f, -0.000118f, -0.000205f, +0.000110f, +0.000236f, + -0.001146f, -0.000065f, -0.000364f, +0.000038f, +0.000119f, -0.000288f, -0.000030f, -0.000475f, -0.000093f, -0.000084f, + +0.000140f, -0.000037f, +0.000156f, +0.000226f, +0.000141f, -0.000322f, +0.000173f, +0.000238f, +0.000085f, +0.000286f, + -0.000146f, -0.000098f, +0.000071f, -0.000183f, -0.000132f, -0.000303f, +0.000100f, -0.000039f, +0.000054f, +0.000055f, + -0.000015f, +0.000096f, -0.000181f, -0.000063f, -0.000116f, -0.000063f, +0.000105f, +0.000143f, +0.000117f, +0.000117f, + +0.000088f, -0.000184f, -0.000138f, -0.000003f, +0.000055f, -0.000074f, -0.000124f, -0.000090f, -0.000092f, +0.000018f, + +0.000080f, -0.000075f, +0.000073f, +0.000086f, +0.000046f, -0.000035f, -0.000008f, +0.000030f, -0.000006f, -0.000028f, + +0.000016f, +0.000100f, -0.000022f, -0.000076f, -0.000026f, +0.000002f + }, + { + -0.003872f, +0.027176f, -0.000406f, -0.001341f, -0.000037f, -0.000088f, -0.000099f, -0.000836f, +0.000018f, +0.000521f, + -0.000420f, -0.000459f, -0.000191f, +0.000581f, -0.002165f, -0.001915f, -0.000284f, -0.000836f, -0.000086f, +0.001084f, + +0.000593f, +0.000214f, -0.000089f, -0.000058f, -0.000020f, +0.000110f, -0.000397f, +0.000413f, +0.000509f, +0.000383f, + +0.000019f, -0.000099f, -0.000070f, +0.000236f, +0.000088f, +0.000302f, +0.000016f, +0.000929f, -0.000024f, -0.000322f, + -0.000162f, +0.000275f, +0.000245f, +0.000532f, +0.000100f, +0.000394f, +0.000210f, +0.000294f, +0.000260f, -0.000071f, + -0.000043f, +0.000246f, +0.000197f, -0.000230f, +0.000138f, -0.000133f, -0.000121f, -0.000000f, -0.000163f, -0.000124f, + -0.000157f, -0.000065f, +0.000094f, +0.000097f, +0.000084f, +0.000011f, -0.000199f, -0.000065f, +0.000116f, -0.000018f, + +0.000018f, +0.000165f, -0.000051f, -0.000221f, +0.000044f, +0.000131f, -0.000014f, +0.000008f, +0.000077f, -0.000049f, + -0.000087f, +0.000071f, -0.000021f, -0.000070f, +0.000057f, +0.000075f, -0.000092f, -0.000036f, +0.000034f, +0.000062f, + -0.000003f, -0.000065f, +0.000046f, +0.000018f, +0.000079f, +0.000029f + }, + { + +0.000669f, +0.000498f, -0.002032f, +0.000150f, -0.000360f, +0.000202f, -0.000066f, -0.000143f, -0.000049f, -0.000317f, + -0.000122f, +0.000647f, +0.000361f, -0.001896f, +0.011427f, -0.000275f, +0.001672f, +0.000740f, -0.000046f, +0.001254f, + +0.001508f, +0.000871f, -0.000762f, +0.001287f, +0.001581f, +0.001344f, +0.000395f, -0.000236f, +0.000149f, -0.000872f, + +0.000608f, +0.000197f, -0.000133f, +0.000588f, +0.000759f, +0.000317f, -0.000028f, -0.000207f, +0.000235f, -0.000361f, + +0.000024f, +0.000208f, +0.000098f, +0.000064f, +0.000143f, +0.000262f, -0.000224f, -0.000497f, +0.000162f, +0.000128f, + -0.000433f, +0.000011f, +0.000023f, -0.000106f, -0.000190f, +0.000123f, +0.000034f, -0.000371f, +0.000177f, +0.000147f, + -0.000056f, +0.000054f, -0.000251f, +0.000131f, -0.000082f, +0.000163f, +0.000117f, -0.000084f, -0.000011f, -0.000021f, + -0.000027f, +0.000020f, +0.000027f, +0.000027f, -0.000077f, +0.000030f, +0.000031f, -0.000051f, -0.000043f, -0.000065f, + -0.000088f, +0.000080f, +0.000078f, +0.000063f, -0.000019f, -0.000041f, -0.000006f, -0.000054f, +0.000046f, -0.000032f, + -0.000039f, +0.000021f, -0.000019f, -0.000009f, +0.000025f, +0.000001f + }, + { + -0.009424f, +0.020441f, +0.002281f, +0.001628f, -0.001197f, -0.000282f, -0.001100f, +0.000062f, +0.000519f, -0.000808f, + -0.000890f, +0.000521f, +0.001489f, +0.000743f, -0.000640f, -0.000845f, -0.001189f, +0.000091f, +0.000269f, +0.000542f, + -0.000174f, +0.000307f, +0.000699f, -0.000484f, -0.000062f, -0.000727f, -0.000113f, +0.000136f, -0.000505f, -0.000019f, + +0.000124f, -0.000632f, -0.000205f, -0.000182f, -0.000386f, +0.000188f, +0.001113f, +0.001017f, -0.000971f, -0.000604f, + +0.000211f, -0.000169f, -0.000321f, -0.000020f, -0.000616f, -0.000235f, +0.000071f, -0.000196f, -0.000084f, +0.000126f, + -0.000023f, -0.000161f, -0.000105f, -0.000077f, +0.000083f, -0.000031f, +0.000064f, -0.000269f, +0.000039f, +0.000120f, + -0.000055f, -0.000056f, +0.000007f, -0.000100f, +0.000305f, +0.000370f, -0.000003f, -0.000079f, +0.000077f, -0.000047f, + -0.000005f, +0.000038f, -0.000045f, -0.000018f, -0.000067f, +0.000002f, +0.000137f, -0.000091f, +0.000045f, +0.000008f, + -0.000006f, -0.000040f, +0.000102f, -0.000006f, +0.000066f, +0.000046f, +0.000070f, -0.000031f, -0.000044f, -0.000064f, + +0.000012f, +0.000008f, +0.000020f, +0.000031f, -0.000050f, +0.000021f + }, + { + -0.000690f, +0.001756f, +0.001419f, -0.000294f, +0.000969f, -0.000559f, -0.000476f, +0.000112f, -0.000082f, -0.001012f, + -0.000182f, +0.000581f, -0.000334f, -0.000886f, -0.002257f, -0.001115f, -0.000397f, +0.001330f, -0.000859f, -0.001540f, + +0.000863f, +0.001151f, +0.001673f, -0.000565f, -0.000310f, -0.000666f, +0.000020f, -0.001009f, -0.000745f, +0.000165f, + -0.000107f, +0.000292f, -0.000610f, -0.000228f, -0.000113f, -0.000064f, +0.000009f, -0.000709f, -0.000197f, +0.000028f, + -0.000223f, -0.000243f, -0.000355f, +0.000068f, -0.000045f, -0.000403f, +0.000045f, +0.000051f, +0.000087f, +0.000025f, + -0.000319f, -0.000122f, -0.000052f, -0.000379f, +0.000222f, +0.000247f, +0.000029f, +0.000053f, -0.000031f, -0.000135f, + -0.000061f, +0.000050f, +0.000011f, +0.000199f, +0.000029f, +0.000102f, +0.000032f, -0.000092f, -0.000202f, -0.000191f, + +0.000056f, -0.000024f, +0.000073f, +0.000066f, -0.000016f, +0.000044f, +0.000063f, +0.000004f, -0.000019f, +0.000069f, + +0.000062f, +0.000042f, -0.000045f, -0.000026f, -0.000044f, -0.000073f, +0.000027f, +0.000018f, +0.000018f, +0.000007f, + -0.000028f, +0.000023f, -0.000016f, -0.000000f, -0.000053f, -0.000044f + }, + { + -0.005602f, +0.009477f, +0.004805f, -0.000488f, +0.000898f, +0.000820f, -0.003045f, +0.000595f, +0.000988f, +0.000011f, + -0.000517f, -0.000025f, -0.000147f, -0.000304f, -0.000758f, -0.000058f, -0.000159f, -0.000583f, -0.000284f, -0.000355f, + -0.000778f, +0.000148f, +0.000012f, -0.000496f, -0.000183f, -0.000029f, +0.000018f, -0.000417f, +0.000177f, -0.000198f, + -0.000595f, -0.000428f, +0.000277f, +0.000413f, -0.000451f, +0.000223f, +0.000501f, -0.000268f, +0.000348f, +0.000236f, + -0.000586f, -0.000358f, +0.000065f, -0.000154f, +0.000232f, -0.000175f, -0.000366f, -0.000059f, -0.000187f, +0.000091f, + -0.000210f, -0.000115f, -0.000152f, -0.000162f, +0.000172f, +0.000195f, +0.000142f, -0.000090f, -0.000283f, +0.000099f, + +0.000122f, -0.000064f, +0.000018f, +0.000173f, -0.000064f, -0.000052f, -0.000017f, +0.000069f, +0.000053f, -0.000059f, + +0.000005f, +0.000091f, -0.000031f, -0.000079f, -0.000070f, -0.000029f, -0.000106f, +0.000056f, +0.000029f, +0.000010f, + +0.000042f, -0.000062f, +0.000025f, +0.000070f, -0.000091f, +0.000033f, -0.000091f, -0.000040f, -0.000051f, +0.000040f, + -0.000004f, -0.000043f, +0.000006f, +0.000069f, -0.000004f, -0.000056f + }, + { + +0.000236f, -0.002978f, -0.000763f, -0.000473f, -0.000324f, -0.000449f, +0.000643f, +0.000147f, -0.000185f, +0.000303f, + -0.000654f, -0.000155f, -0.001265f, -0.002761f, +0.000549f, +0.001685f, -0.000652f, -0.000835f, -0.000604f, -0.000611f, + +0.000933f, +0.001710f, -0.000667f, -0.001224f, -0.000738f, -0.000152f, -0.000745f, -0.000002f, +0.000172f, +0.000018f, + +0.000016f, +0.000843f, -0.000299f, +0.000620f, -0.000921f, +0.000151f, +0.000376f, -0.000205f, -0.000467f, -0.000036f, + +0.000066f, +0.000135f, +0.000162f, -0.000432f, -0.000032f, +0.000147f, +0.000183f, -0.000227f, -0.000169f, -0.000108f, + -0.000365f, +0.000167f, +0.000067f, -0.000244f, -0.000170f, -0.000025f, +0.000198f, +0.000240f, +0.000169f, +0.000054f, + +0.000125f, -0.000182f, +0.000010f, +0.000194f, +0.000256f, -0.000039f, -0.000064f, +0.000112f, +0.000064f, +0.000042f, + -0.000023f, +0.000037f, +0.000033f, -0.000027f, -0.000002f, -0.000116f, -0.000139f, -0.000011f, -0.000003f, +0.000014f, + +0.000027f, -0.000025f, +0.000088f, +0.000065f, +0.000027f, +0.000044f, +0.000084f, +0.000082f, +0.000018f, +0.000010f, + -0.000007f, -0.000040f, -0.000025f, +0.000025f, +0.000005f, -0.000022f + }, + { + -0.000453f, +0.002233f, -0.001187f, -0.003370f, -0.000046f, +0.001272f, -0.001970f, +0.000431f, +0.000078f, +0.001789f, + -0.000449f, -0.000068f, +0.000698f, +0.000554f, +0.001067f, +0.000988f, +0.000895f, -0.000075f, +0.000140f, -0.000697f, + -0.000805f, +0.000203f, -0.000288f, +0.000798f, +0.000536f, +0.000122f, -0.000517f, -0.000076f, -0.000045f, -0.000298f, + -0.000423f, -0.000224f, +0.000222f, +0.000207f, +0.000440f, -0.000132f, +0.000210f, +0.000615f, +0.000096f, -0.000250f, + +0.000336f, -0.000034f, +0.000473f, -0.000229f, +0.000532f, +0.000272f, +0.000305f, +0.000286f, +0.000277f, -0.000309f, + -0.000002f, -0.000141f, -0.000187f, +0.000218f, -0.000493f, -0.000117f, +0.000042f, +0.000005f, +0.000225f, +0.000013f, + -0.000168f, -0.000079f, +0.000025f, -0.000177f, -0.000151f, -0.000038f, +0.000092f, +0.000189f, +0.000035f, -0.000218f, + +0.000075f, +0.000118f, -0.000029f, -0.000099f, +0.000006f, -0.000010f, +0.000024f, +0.000021f, -0.000013f, -0.000059f, + -0.000084f, +0.000098f, +0.000049f, -0.000001f, -0.000113f, -0.000036f, +0.000099f, +0.000083f, +0.000029f, +0.000092f, + +0.000034f, +0.000021f, +0.000001f, -0.000074f, -0.000019f, -0.000098f + }, + { + -0.000640f, +0.000299f, +0.000546f, -0.000229f, +0.000114f, -0.000477f, -0.000012f, +0.000119f, -0.000319f, +0.000354f, + +0.000115f, -0.000142f, +0.000538f, -0.000424f, -0.014313f, +0.000770f, -0.001013f, -0.000485f, +0.000587f, +0.002020f, + -0.000106f, +0.000288f, +0.000566f, -0.001179f, -0.000361f, -0.000559f, -0.000774f, +0.001138f, -0.000905f, -0.000894f, + -0.000078f, +0.000945f, +0.001303f, +0.000825f, +0.000082f, +0.000869f, +0.000312f, +0.000169f, +0.000390f, +0.000022f, + +0.000115f, -0.000156f, -0.000246f, -0.000162f, -0.000060f, -0.000055f, +0.000058f, -0.000467f, -0.000096f, -0.000011f, + -0.000085f, -0.000139f, -0.000093f, +0.000200f, +0.000067f, -0.000053f, +0.000052f, +0.000034f, -0.000104f, -0.000015f, + -0.000102f, -0.000293f, +0.000080f, +0.000052f, +0.000060f, -0.000090f, +0.000173f, -0.000050f, +0.000004f, +0.000070f, + +0.000022f, +0.000107f, -0.000032f, -0.000082f, +0.000060f, -0.000050f, +0.000029f, +0.000152f, -0.000031f, +0.000025f, + -0.000128f, -0.000082f, +0.000083f, +0.000025f, +0.000026f, +0.000085f, +0.000071f, -0.000027f, -0.000052f, +0.000079f, + -0.000033f, -0.000096f, -0.000018f, +0.000041f, -0.000055f, -0.000039f + }, + { + +0.000535f, -0.004818f, +0.001784f, +0.002100f, +0.000791f, -0.002632f, +0.000859f, +0.000432f, -0.000500f, +0.000445f, + +0.002676f, -0.001122f, -0.000570f, -0.001409f, +0.002233f, -0.000979f, -0.000432f, +0.000327f, +0.000261f, +0.000022f, + +0.001573f, +0.000422f, -0.000593f, -0.000527f, +0.000557f, +0.000791f, +0.000622f, +0.000055f, -0.001190f, -0.000579f, + +0.000038f, +0.000049f, +0.000107f, +0.000380f, -0.000256f, +0.000363f, +0.000060f, +0.000105f, +0.000010f, -0.000220f, + -0.000098f, -0.000626f, +0.000107f, +0.000266f, +0.000260f, -0.000087f, +0.000355f, +0.000034f, +0.000126f, -0.000406f, + +0.000542f, -0.000096f, -0.000420f, -0.000176f, -0.000183f, -0.000232f, -0.000015f, +0.000129f, +0.000032f, +0.000089f, + -0.000152f, -0.000034f, +0.000035f, +0.000177f, -0.000077f, -0.000038f, +0.000092f, -0.000014f, -0.000039f, +0.000020f, + +0.000019f, +0.000157f, +0.000060f, -0.000091f, -0.000228f, +0.000000f, +0.000060f, +0.000010f, -0.000060f, +0.000015f, + +0.000090f, +0.000005f, -0.000064f, +0.000054f, +0.000024f, -0.000001f, +0.000035f, -0.000079f, -0.000071f, +0.000077f, + -0.000026f, +0.000048f, +0.000053f, +0.000033f, -0.000021f, -0.000045f + } + }, + { + { + +0.000368f, +0.005727f, +0.000307f, +0.001606f, +0.000154f, -0.000262f, -0.000022f, -0.000204f, -0.000086f, -0.000227f, + -0.000303f, +0.000287f, -0.000170f, +0.002440f, -0.002399f, +0.000913f, +0.001162f, +0.000273f, -0.000798f, -0.000628f, + +0.000822f, -0.001612f, +0.000121f, -0.000537f, +0.000276f, -0.000245f, +0.000330f, -0.000175f, +0.000244f, +0.000374f, + -0.000146f, -0.000905f, -0.000034f, +0.000516f, +0.000312f, +0.000478f, +0.000169f, +0.000738f, +0.000628f, +0.000069f, + -0.000077f, -0.000090f, -0.000064f, -0.000215f, -0.000244f, +0.000038f, +0.000090f, +0.000375f, +0.000111f, +0.000002f, + -0.000095f, -0.000099f, +0.000059f, -0.000078f, -0.000276f, +0.000156f, +0.000127f, +0.000128f, +0.000055f, +0.000025f, + -0.000050f, -0.000393f, -0.000038f, +0.000124f, -0.000167f, -0.000080f, -0.000019f, +0.000020f, -0.000115f, -0.000092f, + +0.000092f, -0.000009f, +0.000069f, -0.000023f, +0.000007f, +0.000042f, +0.000029f, +0.000026f, -0.000046f, -0.000000f, + +0.000077f, -0.000066f, -0.000114f, -0.000079f, -0.000046f, +0.000103f, +0.000041f, -0.000010f, +0.000028f, +0.000064f, + -0.000028f, +0.000004f, +0.000007f, -0.000002f, +0.000062f, +0.000033f + }, + { + -0.005590f, +0.048965f, +0.010437f, +0.003590f, +0.001454f, -0.000471f, -0.000744f, +0.000997f, -0.000227f, -0.000403f, + +0.000246f, -0.000244f, +0.000356f, +0.000581f, -0.000302f, +0.000231f, +0.000741f, -0.000216f, -0.001226f, +0.000254f, + -0.000470f, +0.001115f, -0.000128f, -0.000380f, -0.000182f, +0.000149f, +0.000151f, +0.000095f, -0.000027f, -0.000160f, + +0.000270f, -0.000423f, -0.000101f, +0.000513f, +0.000278f, -0.000208f, +0.000264f, +0.000135f, +0.000504f, -0.000077f, + -0.000325f, -0.000023f, -0.000242f, +0.000386f, -0.000689f, +0.000226f, +0.000140f, +0.000225f, +0.000029f, -0.000026f, + +0.000294f, -0.000337f, -0.000460f, -0.000053f, +0.000059f, -0.000027f, -0.000267f, -0.000131f, -0.000029f, -0.000001f, + -0.000269f, -0.000056f, +0.000071f, -0.000010f, +0.000229f, +0.000106f, -0.000008f, -0.000066f, -0.000169f, +0.000071f, + -0.000003f, +0.000048f, +0.000043f, -0.000018f, +0.000155f, +0.000005f, -0.000071f, +0.000070f, +0.000096f, +0.000002f, + -0.000071f, +0.000006f, -0.000006f, -0.000091f, -0.000044f, +0.000094f, -0.000021f, -0.000039f, +0.000009f, -0.000000f, + +0.000038f, -0.000015f, -0.000047f, +0.000017f, -0.000013f, +0.000002f + }, + { + -0.000160f, +0.009231f, -0.001164f, -0.004206f, -0.001964f, +0.000159f, -0.000336f, +0.000380f, +0.000448f, +0.000510f, + +0.000049f, -0.000269f, +0.000196f, +0.000197f, +0.001311f, +0.000090f, -0.000100f, -0.000030f, +0.001057f, +0.000404f, + +0.000741f, -0.000009f, -0.000410f, +0.000160f, -0.000457f, -0.000653f, -0.000127f, +0.000502f, +0.000288f, +0.000636f, + -0.000032f, -0.000105f, -0.000205f, +0.000152f, +0.000757f, +0.000081f, +0.000095f, -0.000133f, +0.000332f, +0.000115f, + +0.000013f, -0.000648f, +0.000153f, -0.000244f, -0.000401f, +0.000463f, +0.000359f, -0.000168f, -0.000051f, -0.000042f, + +0.000328f, -0.000040f, -0.000200f, -0.000057f, -0.000037f, -0.000110f, -0.000243f, -0.000159f, +0.000279f, +0.000091f, + -0.000192f, -0.000161f, -0.000198f, +0.000097f, -0.000002f, -0.000062f, -0.000037f, +0.000025f, -0.000003f, -0.000078f, + +0.000005f, -0.000026f, +0.000013f, -0.000157f, +0.000037f, -0.000021f, +0.000058f, +0.000007f, +0.000034f, +0.000101f, + -0.000023f, -0.000043f, -0.000076f, -0.000026f, +0.000074f, -0.000023f, +0.000033f, +0.000006f, +0.000011f, +0.000082f, + -0.000002f, -0.000051f, -0.000025f, +0.000012f, +0.000019f, +0.000001f + }, + { + +0.000722f, -0.000884f, -0.001446f, -0.000778f, +0.000109f, +0.000261f, -0.000140f, +0.000100f, +0.000028f, +0.000152f, + +0.000046f, +0.000353f, -0.000029f, -0.002499f, +0.000526f, +0.000792f, +0.002889f, +0.001064f, +0.002997f, +0.000509f, + +0.000288f, -0.000939f, -0.000036f, +0.000848f, -0.001919f, +0.000953f, +0.000507f, -0.000217f, -0.000637f, +0.000102f, + +0.000565f, -0.000807f, +0.000032f, -0.000723f, +0.000535f, +0.000122f, -0.000406f, +0.000294f, -0.000209f, -0.000243f, + +0.000056f, -0.000131f, +0.000030f, +0.000221f, +0.000081f, -0.000233f, -0.000022f, +0.000019f, -0.000314f, -0.000026f, + +0.000251f, +0.000019f, -0.000192f, +0.000187f, +0.000030f, +0.000027f, +0.000185f, -0.000004f, -0.000041f, +0.000078f, + +0.000030f, -0.000153f, -0.000018f, +0.000032f, -0.000162f, -0.000127f, -0.000011f, +0.000004f, -0.000054f, -0.000020f, + +0.000200f, +0.000054f, -0.000018f, -0.000112f, +0.000079f, -0.000020f, -0.000123f, -0.000112f, -0.000024f, +0.000045f, + -0.000001f, -0.000075f, -0.000021f, -0.000010f, -0.000007f, +0.000045f, +0.000004f, -0.000015f, -0.000059f, +0.000035f, + +0.000019f, -0.000074f, -0.000095f, -0.000006f, -0.000036f, -0.000040f + }, + { + +0.006330f, +0.014080f, +0.007341f, -0.000614f, -0.000360f, +0.000079f, +0.000217f, +0.000084f, +0.000311f, +0.000332f, + -0.000035f, -0.000451f, -0.000703f, +0.000637f, -0.000055f, -0.000442f, +0.000082f, +0.000671f, +0.000141f, +0.000500f, + +0.000196f, -0.000617f, -0.000148f, +0.000799f, +0.000121f, -0.000006f, +0.000089f, +0.001407f, +0.000270f, -0.000195f, + +0.000031f, +0.000033f, -0.000131f, -0.000200f, -0.000580f, +0.000154f, +0.000548f, +0.000211f, -0.000154f, +0.000247f, + +0.000418f, +0.000186f, -0.000186f, +0.000396f, +0.000385f, -0.000537f, -0.000200f, +0.000118f, -0.000328f, -0.000160f, + +0.000212f, -0.000421f, +0.000171f, -0.000015f, -0.000062f, +0.000028f, +0.000236f, +0.000217f, +0.000012f, -0.000030f, + -0.000109f, -0.000077f, -0.000097f, -0.000062f, +0.000031f, -0.000106f, -0.000160f, +0.000017f, -0.000141f, +0.000017f, + +0.000030f, +0.000068f, +0.000212f, -0.000099f, -0.000120f, +0.000030f, -0.000113f, +0.000007f, +0.000009f, -0.000046f, + -0.000025f, -0.000014f, -0.000044f, +0.000026f, +0.000057f, +0.000018f, -0.000014f, +0.000004f, +0.000052f, +0.000025f, + +0.000004f, +0.000035f, +0.000023f, +0.000075f, -0.000029f, -0.000016f + }, + { + +0.000049f, -0.000594f, -0.002146f, +0.000465f, +0.000143f, +0.000069f, -0.000162f, -0.000138f, +0.000124f, -0.000011f, + +0.000393f, +0.000246f, -0.000012f, +0.001616f, +0.003326f, -0.000296f, +0.001575f, -0.001279f, -0.000493f, +0.002114f, + +0.000614f, +0.000222f, -0.000590f, -0.000830f, +0.000343f, -0.000125f, -0.001625f, -0.001023f, +0.000251f, +0.001926f, + -0.000731f, +0.000201f, -0.000081f, -0.000562f, -0.000291f, +0.000299f, -0.000019f, -0.000679f, +0.000249f, +0.000140f, + -0.000431f, +0.000053f, +0.000091f, +0.000039f, +0.000083f, -0.000348f, +0.000094f, +0.000227f, +0.000095f, +0.000267f, + -0.000184f, -0.000022f, +0.000170f, +0.000038f, -0.000024f, -0.000274f, +0.000087f, -0.000125f, +0.000082f, +0.000103f, + +0.000027f, +0.000043f, +0.000022f, +0.000057f, -0.000057f, -0.000020f, -0.000028f, +0.000114f, +0.000073f, +0.000079f, + -0.000032f, -0.000100f, -0.000020f, +0.000020f, -0.000053f, -0.000062f, -0.000095f, -0.000091f, -0.000056f, +0.000029f, + -0.000002f, -0.000032f, +0.000053f, +0.000048f, -0.000006f, -0.000038f, -0.000003f, +0.000008f, -0.000022f, -0.000005f, + +0.000065f, +0.000025f, -0.000092f, -0.000045f, -0.000025f, +0.000023f + }, + { + -0.000207f, +0.034850f, +0.000763f, -0.000200f, +0.000011f, -0.000049f, -0.000141f, -0.000065f, +0.000376f, +0.000359f, + -0.000178f, +0.000154f, -0.000030f, +0.001407f, -0.001519f, -0.000803f, +0.000296f, -0.000479f, +0.000370f, +0.000842f, + +0.000537f, -0.000339f, +0.000008f, -0.000148f, -0.000124f, +0.000308f, -0.000757f, +0.000188f, -0.000354f, +0.000373f, + +0.000074f, -0.000303f, -0.000031f, +0.000010f, +0.000157f, -0.000191f, -0.000203f, +0.000762f, +0.000087f, -0.000388f, + -0.000151f, +0.000553f, +0.000024f, -0.000061f, -0.000156f, +0.000184f, +0.000407f, +0.000150f, -0.000005f, +0.000007f, + +0.000032f, +0.000215f, +0.000033f, -0.000110f, -0.000102f, -0.000328f, -0.000079f, +0.000057f, -0.000222f, -0.000110f, + -0.000091f, -0.000087f, +0.000012f, +0.000018f, -0.000050f, -0.000091f, -0.000130f, +0.000111f, +0.000054f, -0.000104f, + +0.000079f, +0.000126f, -0.000112f, -0.000084f, +0.000069f, +0.000051f, -0.000081f, +0.000032f, +0.000038f, -0.000069f, + +0.000005f, +0.000041f, -0.000040f, -0.000044f, +0.000121f, -0.000047f, -0.000067f, +0.000015f, +0.000059f, +0.000026f, + -0.000069f, +0.000013f, -0.000000f, -0.000002f, +0.000040f, -0.000000f + }, + { + +0.000033f, -0.002604f, -0.000505f, +0.000787f, -0.000128f, +0.000219f, -0.000058f, -0.000076f, -0.000024f, +0.000003f, + +0.000372f, +0.000313f, +0.000822f, -0.001664f, +0.009950f, -0.000613f, +0.001177f, -0.000614f, -0.000071f, +0.000019f, + +0.000310f, -0.000236f, -0.000561f, +0.001356f, +0.001315f, +0.001218f, -0.000288f, +0.000417f, +0.000817f, -0.000113f, + +0.000954f, +0.000335f, -0.000490f, +0.000417f, -0.000044f, -0.000051f, +0.000043f, +0.000012f, -0.000058f, -0.000374f, + +0.000013f, +0.000017f, -0.000177f, +0.000070f, -0.000007f, -0.000125f, -0.000348f, +0.000107f, +0.000373f, -0.000007f, + -0.000363f, -0.000217f, +0.000113f, -0.000319f, -0.000212f, -0.000005f, -0.000142f, -0.000245f, +0.000190f, -0.000211f, + -0.000154f, -0.000042f, -0.000163f, +0.000118f, +0.000000f, +0.000198f, -0.000093f, -0.000186f, -0.000055f, +0.000017f, + -0.000106f, -0.000013f, +0.000056f, -0.000031f, -0.000073f, +0.000044f, -0.000088f, -0.000015f, +0.000014f, -0.000023f, + +0.000069f, +0.000075f, +0.000032f, +0.000011f, -0.000058f, -0.000005f, -0.000059f, +0.000011f, +0.000043f, -0.000075f, + +0.000039f, -0.000015f, +0.000004f, +0.000026f, +0.000006f, +0.000012f + }, + { + +0.011710f, +0.040726f, -0.007860f, +0.001920f, +0.000078f, -0.000131f, -0.000676f, +0.000965f, +0.000096f, -0.001017f, + +0.000529f, +0.001414f, +0.000409f, +0.000726f, +0.001753f, -0.000472f, -0.000522f, +0.000278f, -0.000489f, +0.000305f, + +0.000232f, +0.000595f, +0.000586f, +0.000279f, +0.000551f, -0.000435f, +0.000244f, +0.000313f, -0.000838f, -0.000290f, + -0.000183f, -0.000229f, +0.000288f, -0.000044f, -0.000053f, -0.000220f, +0.000130f, +0.000586f, -0.000525f, -0.000359f, + +0.000081f, +0.000125f, -0.000117f, -0.000225f, -0.000300f, -0.000445f, +0.000001f, +0.000161f, +0.000120f, +0.000037f, + -0.000345f, -0.000039f, -0.000008f, -0.000288f, +0.000102f, +0.000142f, +0.000016f, -0.000178f, +0.000216f, +0.000150f, + +0.000004f, +0.000065f, +0.000066f, +0.000013f, +0.000311f, +0.000058f, -0.000174f, -0.000033f, -0.000005f, -0.000103f, + +0.000071f, +0.000013f, -0.000165f, -0.000039f, -0.000141f, +0.000085f, +0.000049f, -0.000105f, +0.000028f, +0.000045f, + -0.000021f, -0.000028f, +0.000105f, +0.000073f, +0.000080f, +0.000062f, -0.000018f, -0.000072f, -0.000025f, -0.000014f, + +0.000062f, +0.000011f, +0.000053f, -0.000040f, -0.000015f, +0.000032f + }, + { + +0.000438f, +0.000668f, -0.000928f, +0.000936f, +0.000677f, -0.001597f, -0.000003f, +0.000178f, +0.000323f, -0.000395f, + +0.000343f, +0.001398f, +0.000149f, -0.000269f, -0.000671f, +0.000341f, -0.000460f, -0.000503f, -0.001115f, +0.000111f, + +0.000727f, -0.001033f, +0.000485f, -0.000507f, +0.000556f, +0.000015f, +0.000504f, -0.000107f, +0.000343f, +0.000472f, + +0.000415f, -0.000049f, -0.000871f, -0.000317f, +0.000095f, -0.000221f, -0.000493f, -0.000753f, -0.000089f, -0.000257f, + -0.000340f, -0.000048f, -0.000061f, +0.000192f, -0.000370f, -0.000270f, -0.000184f, +0.000101f, +0.000047f, -0.000201f, + -0.000272f, -0.000140f, -0.000118f, -0.000004f, +0.000556f, +0.000054f, -0.000174f, +0.000013f, -0.000125f, -0.000043f, + +0.000026f, +0.000037f, +0.000146f, +0.000136f, +0.000103f, +0.000093f, -0.000158f, -0.000138f, -0.000161f, +0.000007f, + +0.000005f, +0.000047f, +0.000161f, -0.000026f, -0.000063f, +0.000029f, +0.000100f, +0.000022f, +0.000043f, +0.000088f, + +0.000013f, -0.000001f, -0.000077f, -0.000015f, -0.000069f, -0.000031f, +0.000054f, -0.000022f, +0.000027f, -0.000052f, + -0.000009f, -0.000027f, -0.000018f, +0.000002f, -0.000065f, -0.000019f + }, + { + +0.003399f, +0.019321f, +0.000578f, -0.004451f, -0.000296f, +0.000795f, -0.002041f, +0.001005f, +0.000615f, -0.000348f, + -0.000229f, +0.000191f, -0.000129f, -0.000061f, +0.000397f, +0.000167f, -0.000296f, -0.000210f, +0.000109f, -0.000804f, + +0.000077f, -0.000312f, -0.000361f, -0.000690f, +0.000330f, +0.000268f, +0.000204f, -0.000236f, -0.000239f, +0.000123f, + -0.000186f, -0.000182f, -0.000072f, -0.000150f, -0.000600f, +0.000232f, +0.000099f, -0.000283f, +0.000504f, -0.000331f, + -0.000752f, -0.000016f, +0.000202f, -0.000132f, +0.000159f, -0.000097f, -0.000194f, -0.000107f, -0.000227f, +0.000263f, + -0.000108f, -0.000009f, -0.000108f, -0.000029f, +0.000066f, +0.000219f, +0.000207f, -0.000330f, -0.000099f, +0.000101f, + +0.000028f, -0.000088f, +0.000080f, +0.000181f, -0.000140f, +0.000018f, -0.000006f, +0.000065f, -0.000026f, +0.000014f, + +0.000044f, +0.000050f, -0.000055f, -0.000115f, -0.000010f, -0.000043f, -0.000050f, +0.000111f, -0.000059f, +0.000020f, + +0.000023f, -0.000052f, +0.000075f, -0.000045f, -0.000049f, -0.000073f, -0.000043f, -0.000030f, -0.000028f, +0.000047f, + -0.000034f, -0.000003f, +0.000035f, +0.000039f, -0.000047f, -0.000029f + }, + { + -0.000373f, -0.002990f, +0.000242f, +0.000567f, -0.000094f, -0.000028f, +0.000887f, -0.000197f, -0.001005f, -0.000043f, + -0.000175f, +0.000255f, -0.000191f, -0.000327f, +0.000998f, +0.001369f, -0.001284f, -0.002315f, -0.000670f, -0.001167f, + +0.000624f, +0.001657f, -0.001152f, -0.001170f, -0.000000f, -0.000242f, -0.000241f, -0.000417f, -0.000284f, -0.001427f, + +0.000625f, +0.000508f, -0.000185f, +0.000516f, -0.000736f, -0.000010f, +0.000294f, -0.000653f, -0.000175f, +0.000045f, + +0.000286f, +0.000067f, -0.000095f, -0.000279f, +0.000092f, +0.000111f, +0.000360f, -0.000126f, -0.000028f, -0.000214f, + -0.000208f, +0.000187f, -0.000047f, -0.000093f, +0.000003f, -0.000001f, +0.000297f, +0.000362f, +0.000010f, +0.000089f, + -0.000046f, -0.000002f, +0.000084f, +0.000281f, +0.000143f, -0.000208f, +0.000051f, -0.000041f, +0.000009f, -0.000005f, + -0.000074f, +0.000053f, -0.000027f, -0.000048f, +0.000042f, -0.000114f, -0.000119f, +0.000037f, -0.000017f, +0.000078f, + +0.000022f, -0.000043f, +0.000080f, +0.000051f, -0.000003f, +0.000074f, +0.000069f, +0.000031f, -0.000017f, +0.000002f, + -0.000007f, -0.000045f, -0.000040f, +0.000055f, +0.000014f, -0.000047f + }, + { + -0.001544f, +0.003171f, +0.000401f, -0.000648f, +0.000305f, -0.002195f, -0.002963f, +0.001609f, +0.000287f, -0.000044f, + -0.001018f, +0.000078f, -0.000387f, -0.000338f, +0.000215f, +0.000416f, +0.000153f, -0.000488f, +0.000288f, -0.001219f, + +0.000173f, +0.000533f, -0.000289f, -0.000041f, -0.000208f, -0.000351f, -0.000197f, -0.000059f, -0.000112f, -0.000207f, + -0.000355f, +0.000097f, -0.000259f, -0.000571f, -0.000066f, -0.000383f, -0.000204f, +0.000087f, -0.000259f, -0.000173f, + +0.000672f, +0.000307f, +0.000565f, +0.000223f, +0.000259f, +0.000517f, -0.000065f, +0.000250f, +0.000166f, -0.000007f, + -0.000179f, -0.000182f, -0.000161f, -0.000102f, -0.000189f, -0.000050f, +0.000097f, +0.000079f, +0.000204f, -0.000129f, + -0.000061f, +0.000047f, +0.000020f, -0.000180f, +0.000054f, +0.000108f, +0.000087f, +0.000118f, -0.000087f, -0.000174f, + +0.000216f, +0.000127f, -0.000144f, -0.000092f, +0.000017f, +0.000008f, +0.000028f, -0.000080f, -0.000037f, -0.000050f, + +0.000062f, +0.000131f, -0.000002f, -0.000031f, -0.000064f, +0.000084f, +0.000137f, +0.000031f, -0.000005f, +0.000054f, + -0.000006f, -0.000003f, -0.000071f, -0.000040f, -0.000032f, -0.000073f + }, + { + +0.000317f, +0.002105f, +0.000409f, +0.000096f, -0.000190f, -0.000360f, -0.000049f, -0.000236f, -0.000420f, +0.000650f, + +0.000180f, -0.000166f, +0.000536f, +0.003499f, -0.006820f, +0.002948f, -0.002610f, +0.000088f, -0.000013f, -0.000284f, + -0.001256f, -0.000400f, +0.000210f, -0.000457f, -0.000368f, -0.001294f, -0.000918f, -0.000014f, -0.000515f, +0.000609f, + +0.000401f, +0.000497f, +0.000146f, -0.000083f, +0.000099f, +0.000229f, +0.000089f, +0.000085f, +0.000015f, +0.000292f, + -0.000008f, -0.000261f, -0.000215f, -0.000029f, +0.000182f, +0.000189f, +0.000082f, -0.000257f, -0.000269f, -0.000003f, + -0.000299f, -0.000014f, +0.000074f, +0.000146f, +0.000010f, +0.000094f, +0.000069f, +0.000019f, -0.000152f, +0.000069f, + -0.000308f, -0.000217f, +0.000044f, -0.000072f, -0.000039f, +0.000098f, +0.000149f, -0.000126f, -0.000004f, +0.000016f, + -0.000033f, +0.000139f, +0.000036f, -0.000057f, +0.000015f, -0.000076f, +0.000135f, -0.000036f, +0.000040f, +0.000001f, + -0.000199f, +0.000021f, +0.000058f, +0.000022f, +0.000082f, +0.000077f, +0.000061f, -0.000091f, +0.000002f, +0.000027f, + -0.000101f, -0.000049f, +0.000061f, +0.000027f, -0.000046f, +0.000034f + }, + { + +0.000519f, -0.003446f, +0.002071f, -0.000910f, -0.001324f, -0.004553f, +0.000435f, +0.000491f, -0.000149f, +0.000692f, + +0.000200f, -0.002034f, +0.000324f, -0.001039f, +0.000840f, -0.001315f, -0.000080f, +0.000164f, -0.000695f, -0.000196f, + +0.001542f, +0.000107f, -0.000039f, -0.000726f, +0.000676f, +0.000677f, +0.000398f, +0.000964f, -0.000442f, -0.000150f, + -0.000023f, -0.000276f, +0.000006f, +0.000320f, +0.000230f, +0.000398f, +0.000344f, +0.000083f, -0.000196f, -0.000130f, + +0.000100f, -0.000079f, +0.000332f, -0.000153f, -0.000071f, +0.000353f, +0.000622f, -0.000191f, -0.000083f, -0.000115f, + +0.000561f, -0.000057f, -0.000253f, +0.000141f, -0.000260f, -0.000065f, +0.000155f, -0.000088f, +0.000134f, +0.000142f, + -0.000022f, +0.000157f, +0.000025f, +0.000205f, -0.000013f, +0.000037f, +0.000079f, +0.000107f, -0.000032f, +0.000005f, + -0.000020f, +0.000133f, +0.000002f, -0.000109f, -0.000122f, +0.000077f, +0.000059f, -0.000033f, -0.000042f, +0.000057f, + +0.000000f, -0.000043f, -0.000009f, +0.000040f, -0.000006f, -0.000061f, +0.000028f, -0.000141f, -0.000005f, +0.000063f, + -0.000042f, +0.000063f, +0.000016f, -0.000003f, -0.000006f, -0.000015f + } + }, + { + { + -0.000621f, +0.010962f, +0.000158f, +0.001124f, -0.000446f, -0.000075f, -0.000381f, +0.000227f, -0.000139f, +0.000066f, + +0.000026f, -0.000229f, +0.001920f, -0.000251f, -0.001364f, +0.000868f, +0.000513f, +0.000197f, +0.001495f, -0.001137f, + +0.000297f, -0.000186f, +0.001435f, +0.000839f, -0.000043f, +0.000030f, -0.000171f, -0.000252f, +0.000653f, +0.000988f, + +0.000109f, -0.000499f, +0.000423f, -0.000628f, +0.000101f, +0.000154f, +0.000162f, +0.000142f, -0.000259f, -0.000478f, + +0.000185f, -0.000087f, +0.000101f, -0.000501f, +0.000143f, -0.000175f, -0.000154f, -0.000211f, +0.000097f, -0.000081f, + +0.000017f, +0.000068f, -0.000029f, +0.000040f, +0.000208f, -0.000140f, -0.000144f, -0.000169f, -0.000062f, +0.000053f, + +0.000115f, +0.000008f, +0.000168f, -0.000003f, -0.000098f, +0.000071f, +0.000008f, -0.000037f, -0.000006f, +0.000165f, + -0.000041f, -0.000054f, -0.000041f, -0.000018f, +0.000029f, +0.000040f, -0.000048f, -0.000002f, +0.000066f, +0.000050f, + -0.000047f, -0.000022f, +0.000070f, +0.000106f, +0.000054f, +0.000005f, -0.000033f, +0.000025f, +0.000016f, -0.000045f, + -0.000046f, +0.000062f, -0.000012f, +0.000023f, -0.000034f, -0.000045f + }, + { + +0.006385f, +0.045511f, +0.001661f, +0.000070f, -0.000466f, -0.000019f, -0.000711f, -0.001856f, -0.001271f, +0.000008f, + -0.000058f, -0.000311f, +0.000746f, +0.000570f, -0.000884f, -0.001229f, -0.000460f, -0.000278f, +0.000661f, -0.000781f, + -0.000698f, +0.000707f, -0.000240f, -0.000590f, +0.000007f, +0.000672f, -0.000760f, -0.000093f, +0.000278f, +0.000155f, + +0.000608f, -0.000270f, -0.000386f, -0.000252f, +0.000307f, +0.000325f, +0.000115f, +0.000170f, -0.000381f, -0.000508f, + -0.000308f, +0.000278f, +0.000304f, +0.000043f, -0.000008f, -0.000028f, -0.000099f, -0.000043f, -0.000625f, +0.000283f, + +0.000131f, -0.000189f, +0.000090f, +0.000292f, +0.000058f, -0.000015f, -0.000123f, +0.000099f, -0.000058f, -0.000081f, + +0.000153f, +0.000050f, +0.000059f, +0.000101f, -0.000010f, -0.000133f, -0.000060f, +0.000073f, +0.000016f, +0.000103f, + -0.000021f, -0.000054f, -0.000050f, +0.000046f, +0.000009f, -0.000094f, +0.000073f, -0.000048f, -0.000062f, -0.000012f, + +0.000078f, -0.000002f, -0.000067f, -0.000002f, +0.000117f, -0.000044f, -0.000102f, +0.000069f, -0.000027f, +0.000017f, + -0.000023f, -0.000001f, +0.000024f, +0.000022f, -0.000010f, +0.000007f + }, + { + +0.000214f, +0.008771f, -0.004188f, -0.002026f, +0.002465f, -0.000160f, +0.000361f, +0.000563f, +0.000154f, -0.000312f, + -0.000722f, -0.000281f, -0.000984f, +0.000082f, +0.000609f, +0.000444f, -0.000530f, +0.000547f, +0.000584f, +0.000161f, + +0.000258f, -0.000554f, -0.000079f, -0.000267f, -0.000670f, -0.000065f, +0.000249f, +0.000544f, -0.000013f, +0.000037f, + -0.000184f, +0.000138f, +0.000468f, -0.000026f, +0.000356f, +0.000020f, -0.000036f, -0.000103f, +0.000510f, -0.000066f, + -0.000483f, +0.000134f, +0.000056f, +0.000076f, +0.000170f, -0.000291f, -0.000343f, +0.000423f, +0.000261f, +0.000401f, + -0.000102f, -0.000342f, -0.000242f, +0.000093f, -0.000088f, -0.000138f, -0.000019f, +0.000199f, +0.000215f, +0.000007f, + -0.000107f, +0.000133f, +0.000165f, +0.000043f, +0.000077f, +0.000085f, +0.000022f, +0.000051f, +0.000013f, +0.000092f, + +0.000041f, -0.000048f, +0.000067f, +0.000005f, -0.000007f, -0.000019f, +0.000084f, -0.000036f, -0.000002f, -0.000054f, + -0.000006f, -0.000042f, +0.000047f, +0.000019f, -0.000096f, -0.000025f, -0.000012f, -0.000050f, +0.000003f, +0.000005f, + +0.000001f, +0.000043f, +0.000026f, +0.000050f, +0.000004f, +0.000012f + }, + { + -0.000476f, -0.003100f, +0.000188f, +0.000247f, +0.000247f, -0.000077f, -0.000100f, -0.000002f, +0.000157f, +0.000115f, + +0.000099f, -0.000099f, -0.000850f, -0.001906f, -0.002344f, +0.003176f, +0.000991f, +0.000883f, +0.001879f, +0.000250f, + +0.000443f, -0.002045f, +0.000235f, +0.000743f, -0.000553f, -0.000318f, +0.000179f, +0.000969f, -0.000744f, -0.001256f, + -0.000227f, +0.001099f, +0.000058f, -0.000827f, -0.000261f, +0.000242f, +0.000228f, -0.000434f, +0.000293f, -0.000048f, + -0.000189f, +0.000087f, +0.000009f, -0.000058f, -0.000212f, -0.000010f, +0.000112f, -0.000018f, -0.000060f, +0.000245f, + +0.000139f, -0.000173f, +0.000233f, +0.000076f, +0.000230f, +0.000212f, -0.000124f, -0.000057f, +0.000167f, -0.000159f, + -0.000117f, -0.000107f, -0.000006f, -0.000072f, +0.000104f, -0.000004f, +0.000013f, -0.000080f, +0.000141f, +0.000068f, + -0.000056f, -0.000173f, -0.000077f, +0.000052f, +0.000051f, -0.000116f, +0.000051f, +0.000110f, +0.000051f, -0.000012f, + -0.000013f, -0.000002f, +0.000032f, -0.000010f, +0.000016f, -0.000065f, -0.000033f, +0.000030f, +0.000070f, +0.000029f, + -0.000009f, -0.000017f, +0.000053f, +0.000038f, -0.000022f, +0.000033f + }, + { + -0.003952f, +0.036933f, -0.002427f, -0.000477f, +0.000492f, +0.000003f, +0.000790f, +0.000048f, -0.000387f, -0.000256f, + +0.000009f, +0.000936f, -0.000667f, -0.000242f, +0.000400f, -0.000166f, +0.000188f, +0.000356f, -0.000280f, +0.000409f, + -0.000394f, -0.000364f, +0.000832f, -0.000823f, -0.000497f, +0.000416f, +0.000499f, -0.000223f, +0.000205f, -0.000252f, + +0.000179f, +0.000290f, -0.000588f, -0.000219f, -0.000354f, -0.000079f, -0.000743f, -0.000988f, +0.000320f, +0.000189f, + -0.000095f, +0.000226f, +0.000162f, +0.000494f, -0.000370f, -0.000118f, +0.000005f, +0.000018f, -0.000067f, -0.000184f, + +0.000068f, +0.000284f, +0.000081f, -0.000198f, -0.000093f, +0.000176f, +0.000146f, -0.000242f, -0.000142f, -0.000115f, + +0.000002f, -0.000187f, -0.000063f, -0.000014f, +0.000018f, -0.000134f, -0.000079f, -0.000201f, -0.000069f, +0.000149f, + +0.000024f, -0.000176f, -0.000116f, -0.000137f, +0.000086f, -0.000010f, +0.000018f, +0.000141f, -0.000107f, -0.000002f, + +0.000053f, +0.000033f, +0.000027f, +0.000021f, -0.000116f, +0.000018f, +0.000023f, -0.000008f, -0.000032f, -0.000034f, + +0.000008f, -0.000042f, +0.000001f, -0.000029f, -0.000048f, +0.000014f + }, + { + -0.000542f, +0.000528f, +0.000678f, -0.000226f, -0.000134f, -0.000106f, -0.000078f, -0.000078f, +0.000364f, +0.000216f, + +0.000150f, -0.000152f, -0.000221f, -0.000506f, -0.001082f, -0.000036f, +0.002458f, -0.000376f, +0.000447f, +0.001531f, + +0.001060f, +0.000687f, -0.000707f, -0.000653f, -0.001783f, -0.001610f, -0.001011f, -0.001292f, -0.000157f, +0.002285f, + -0.000539f, -0.000169f, -0.000128f, +0.000016f, +0.000228f, +0.000388f, +0.000371f, -0.000244f, +0.000502f, -0.000129f, + -0.000126f, +0.000144f, -0.000133f, +0.000211f, +0.000124f, -0.000033f, -0.000002f, -0.000110f, -0.000113f, -0.000029f, + +0.000046f, +0.000241f, -0.000078f, +0.000116f, +0.000051f, +0.000122f, -0.000138f, -0.000146f, +0.000033f, +0.000017f, + +0.000031f, -0.000081f, +0.000182f, +0.000035f, +0.000017f, +0.000033f, -0.000165f, +0.000013f, +0.000050f, -0.000072f, + -0.000076f, +0.000212f, +0.000024f, -0.000043f, +0.000003f, +0.000052f, +0.000124f, +0.000071f, +0.000060f, -0.000061f, + -0.000015f, +0.000079f, -0.000062f, -0.000045f, -0.000027f, +0.000019f, -0.000010f, -0.000009f, -0.000001f, +0.000030f, + -0.000002f, -0.000092f, +0.000011f, +0.000053f, -0.000004f, -0.000006f + }, + { + +0.006696f, +0.025433f, +0.000334f, +0.000749f, -0.000891f, +0.000172f, -0.000081f, +0.000752f, +0.000154f, -0.000245f, + -0.000055f, +0.000448f, -0.000037f, +0.000790f, -0.000748f, +0.000467f, -0.000098f, +0.000303f, +0.000174f, -0.000498f, + -0.000146f, -0.000229f, -0.000033f, -0.000356f, -0.000129f, -0.000108f, -0.000338f, +0.000478f, -0.001046f, -0.000366f, + +0.000224f, -0.000204f, +0.000384f, +0.000166f, +0.000489f, -0.000278f, +0.000079f, +0.000091f, +0.000035f, +0.000010f, + -0.000102f, +0.000318f, -0.000121f, -0.000370f, +0.000214f, -0.000168f, -0.000086f, -0.000367f, +0.000097f, -0.000072f, + -0.000016f, -0.000152f, -0.000100f, +0.000143f, -0.000356f, +0.000050f, +0.000097f, +0.000091f, +0.000151f, +0.000122f, + -0.000007f, -0.000036f, -0.000021f, -0.000062f, -0.000117f, +0.000054f, +0.000163f, +0.000101f, -0.000115f, -0.000004f, + -0.000004f, -0.000190f, +0.000099f, +0.000213f, +0.000017f, -0.000103f, +0.000007f, +0.000060f, -0.000014f, +0.000041f, + +0.000068f, -0.000041f, +0.000051f, +0.000058f, -0.000079f, -0.000081f, +0.000100f, +0.000051f, -0.000010f, -0.000051f, + +0.000014f, +0.000066f, -0.000068f, -0.000024f, -0.000037f, +0.000007f + }, + { + -0.000634f, -0.000596f, +0.002240f, +0.000344f, +0.000215f, -0.000180f, +0.000002f, -0.000276f, +0.000183f, +0.000271f, + -0.000083f, -0.000355f, -0.000722f, -0.000253f, +0.006524f, +0.001625f, -0.001219f, -0.001379f, +0.000057f, -0.001994f, + -0.001138f, -0.000339f, -0.000272f, -0.000377f, +0.001645f, -0.000121f, -0.001109f, +0.000835f, +0.000180f, +0.000256f, + -0.000127f, -0.000203f, -0.000424f, +0.000295f, -0.000696f, +0.000354f, -0.000060f, +0.000288f, -0.000118f, +0.000049f, + -0.000074f, -0.000074f, -0.000012f, -0.000302f, -0.000197f, +0.000007f, +0.000252f, +0.000050f, -0.000323f, +0.000165f, + +0.000171f, -0.000261f, -0.000022f, -0.000050f, +0.000201f, +0.000015f, +0.000049f, +0.000229f, -0.000259f, -0.000305f, + +0.000045f, +0.000067f, +0.000141f, +0.000019f, +0.000029f, -0.000084f, -0.000100f, +0.000001f, -0.000072f, +0.000008f, + -0.000080f, -0.000024f, -0.000025f, -0.000008f, +0.000086f, +0.000018f, -0.000027f, +0.000158f, +0.000101f, +0.000046f, + +0.000090f, -0.000101f, -0.000053f, -0.000086f, -0.000019f, +0.000051f, +0.000033f, +0.000048f, -0.000043f, +0.000042f, + +0.000069f, -0.000057f, +0.000020f, +0.000005f, -0.000004f, -0.000006f + }, + { + -0.011048f, +0.057113f, +0.001622f, +0.002728f, +0.000363f, +0.000178f, +0.000431f, -0.000432f, -0.000689f, +0.000841f, + +0.000209f, -0.000591f, -0.001567f, +0.000284f, +0.002389f, -0.000039f, +0.001213f, -0.000481f, -0.000281f, -0.000106f, + +0.000812f, +0.000342f, +0.000011f, +0.000739f, +0.000192f, +0.000150f, +0.000402f, +0.000391f, -0.000616f, -0.000034f, + +0.000092f, +0.000454f, -0.000139f, -0.000185f, +0.000064f, -0.000386f, -0.000530f, -0.000282f, +0.001058f, +0.000206f, + +0.000194f, +0.000107f, +0.000099f, +0.000121f, -0.000116f, -0.000296f, +0.000548f, +0.000085f, -0.000221f, -0.000099f, + -0.000071f, +0.000012f, -0.000126f, -0.000102f, +0.000173f, -0.000040f, -0.000195f, +0.000138f, +0.000167f, -0.000125f, + +0.000028f, +0.000134f, +0.000078f, +0.000019f, -0.000159f, -0.000249f, +0.000008f, +0.000048f, -0.000107f, +0.000007f, + +0.000015f, -0.000121f, -0.000065f, +0.000055f, +0.000069f, -0.000085f, -0.000117f, +0.000059f, +0.000032f, -0.000006f, + -0.000082f, +0.000036f, -0.000083f, +0.000043f, -0.000078f, -0.000025f, +0.000009f, +0.000040f, +0.000062f, +0.000059f, + +0.000009f, -0.000004f, -0.000031f, -0.000022f, +0.000059f, -0.000007f + }, + { + -0.000171f, -0.001519f, +0.001985f, +0.000210f, -0.000412f, +0.001135f, +0.000668f, -0.000856f, +0.000270f, +0.000487f, + +0.000475f, +0.000008f, -0.000427f, +0.000261f, +0.001261f, +0.000022f, -0.000338f, -0.001547f, +0.001941f, +0.001582f, + -0.000721f, -0.001225f, -0.000092f, +0.000497f, +0.001381f, +0.000306f, +0.000282f, +0.000831f, +0.000208f, +0.000591f, + +0.000503f, -0.001087f, +0.000104f, +0.000246f, -0.000131f, +0.000069f, -0.000114f, +0.000311f, +0.000107f, +0.000086f, + -0.000104f, +0.000246f, -0.000034f, -0.000117f, -0.000104f, +0.000302f, -0.000130f, -0.000007f, -0.000328f, -0.000029f, + +0.000316f, +0.000047f, -0.000040f, +0.000297f, -0.000106f, -0.000286f, -0.000091f, +0.000061f, +0.000075f, +0.000226f, + +0.000039f, -0.000075f, -0.000096f, -0.000121f, -0.000034f, -0.000152f, -0.000044f, +0.000139f, +0.000234f, +0.000142f, + -0.000081f, +0.000089f, +0.000007f, -0.000075f, +0.000043f, -0.000053f, -0.000050f, -0.000028f, -0.000009f, -0.000071f, + -0.000080f, -0.000023f, +0.000018f, +0.000010f, +0.000011f, +0.000061f, -0.000007f, -0.000027f, -0.000012f, -0.000017f, + +0.000034f, +0.000001f, +0.000021f, -0.000002f, +0.000039f, +0.000051f + }, + { + -0.001430f, +0.024775f, -0.001938f, -0.003971f, -0.000201f, +0.002303f, +0.001575f, -0.001009f, -0.000726f, +0.000230f, + -0.000027f, +0.000080f, +0.000580f, +0.000889f, -0.000205f, +0.000427f, +0.000242f, +0.000488f, -0.000096f, -0.000527f, + +0.000295f, -0.000803f, +0.000230f, -0.000388f, +0.000421f, +0.000451f, -0.000188f, -0.000482f, -0.000023f, +0.000391f, + +0.000521f, +0.000077f, -0.000386f, -0.000448f, +0.000022f, -0.000441f, -0.000136f, +0.000446f, -0.000169f, -0.000100f, + +0.000530f, +0.000202f, -0.000189f, -0.000001f, -0.000465f, -0.000063f, +0.000059f, +0.000180f, -0.000129f, -0.000008f, + +0.000184f, +0.000191f, +0.000052f, +0.000018f, -0.000203f, -0.000167f, -0.000048f, -0.000059f, +0.000248f, -0.000155f, + -0.000012f, +0.000033f, -0.000028f, -0.000045f, -0.000033f, +0.000019f, -0.000042f, -0.000014f, -0.000079f, +0.000019f, + +0.000024f, -0.000027f, +0.000017f, +0.000129f, +0.000105f, +0.000047f, +0.000080f, -0.000054f, -0.000077f, -0.000007f, + -0.000061f, +0.000068f, -0.000025f, -0.000041f, +0.000057f, -0.000028f, +0.000086f, -0.000003f, +0.000032f, -0.000047f, + -0.000004f, +0.000036f, -0.000028f, -0.000064f, -0.000010f, +0.000053f + }, + { + +0.000353f, -0.002618f, -0.000011f, +0.000541f, -0.000114f, +0.000221f, -0.000373f, -0.000430f, -0.000798f, -0.000007f, + +0.000246f, -0.000340f, -0.000181f, +0.000993f, -0.000745f, +0.000513f, -0.001044f, -0.001540f, +0.000766f, -0.000422f, + -0.000989f, +0.000554f, +0.000046f, +0.000613f, +0.000542f, -0.001324f, -0.000054f, -0.000740f, -0.000882f, -0.000000f, + +0.000777f, -0.001026f, -0.000052f, -0.000353f, +0.000172f, -0.000462f, +0.000050f, -0.000022f, +0.000431f, +0.000303f, + +0.000124f, -0.000294f, -0.000015f, +0.000348f, +0.000161f, +0.000168f, +0.000027f, -0.000093f, +0.000293f, -0.000009f, + +0.000116f, -0.000191f, -0.000023f, +0.000124f, +0.000184f, -0.000104f, +0.000005f, -0.000351f, -0.000279f, -0.000172f, + +0.000022f, +0.000266f, +0.000035f, -0.000104f, -0.000213f, +0.000008f, +0.000132f, -0.000140f, +0.000008f, +0.000026f, + +0.000038f, +0.000062f, +0.000020f, +0.000054f, +0.000060f, +0.000094f, +0.000086f, +0.000033f, -0.000044f, -0.000004f, + -0.000016f, +0.000035f, -0.000095f, -0.000082f, -0.000022f, -0.000011f, -0.000060f, -0.000056f, -0.000012f, +0.000010f, + -0.000002f, +0.000024f, +0.000025f, -0.000016f, -0.000007f, +0.000026f + }, + { + +0.002371f, -0.004672f, +0.002453f, +0.001896f, +0.000479f, -0.002509f, +0.002409f, +0.000044f, -0.000388f, -0.000253f, + +0.000718f, -0.000016f, +0.000045f, -0.001819f, -0.000150f, -0.000329f, -0.000541f, +0.000254f, -0.000131f, +0.000161f, + +0.000794f, +0.000305f, +0.000016f, -0.000258f, -0.000487f, +0.000385f, +0.000567f, +0.000243f, +0.000241f, -0.000102f, + +0.000103f, +0.000150f, -0.000208f, -0.000808f, +0.000091f, -0.000292f, +0.000203f, -0.000340f, -0.000232f, +0.000584f, + +0.000083f, -0.000158f, -0.000142f, +0.000032f, -0.000473f, -0.000003f, -0.000075f, -0.000421f, -0.000180f, +0.000004f, + -0.000074f, +0.000089f, +0.000010f, +0.000184f, +0.000445f, +0.000141f, +0.000062f, +0.000123f, -0.000231f, -0.000062f, + +0.000196f, -0.000039f, -0.000066f, -0.000048f, +0.000109f, +0.000034f, -0.000104f, -0.000087f, -0.000041f, +0.000150f, + -0.000016f, -0.000070f, -0.000024f, +0.000093f, +0.000019f, +0.000004f, -0.000081f, -0.000018f, +0.000017f, +0.000062f, + +0.000101f, -0.000082f, -0.000057f, +0.000022f, +0.000122f, +0.000071f, -0.000137f, -0.000073f, -0.000038f, -0.000065f, + -0.000039f, -0.000014f, +0.000026f, +0.000070f, +0.000013f, +0.000072f + }, + { + +0.000022f, +0.003232f, -0.001671f, +0.000526f, -0.000243f, +0.000316f, -0.000154f, -0.000176f, +0.000301f, +0.000188f, + +0.000344f, -0.000064f, -0.000958f, +0.001960f, +0.010069f, -0.001807f, -0.002023f, +0.000244f, -0.000058f, -0.000216f, + -0.000390f, -0.000607f, -0.000118f, +0.000782f, -0.000318f, -0.000469f, -0.000171f, -0.000300f, +0.000630f, +0.000384f, + +0.000115f, -0.001083f, -0.000825f, +0.000137f, +0.000111f, -0.000815f, +0.000062f, -0.000095f, -0.000284f, +0.000149f, + -0.000021f, +0.000273f, +0.000041f, +0.000019f, +0.000176f, -0.000033f, -0.000005f, +0.000194f, -0.000140f, -0.000050f, + +0.000164f, +0.000109f, +0.000024f, -0.000096f, -0.000089f, +0.000025f, -0.000052f, -0.000065f, -0.000074f, +0.000047f, + +0.000059f, +0.000185f, -0.000152f, -0.000125f, +0.000017f, +0.000113f, -0.000114f, +0.000158f, +0.000086f, +0.000024f, + -0.000016f, -0.000100f, +0.000008f, +0.000063f, -0.000038f, +0.000057f, -0.000030f, -0.000161f, +0.000072f, -0.000048f, + +0.000091f, +0.000107f, -0.000062f, -0.000010f, -0.000018f, -0.000078f, -0.000071f, +0.000031f, +0.000033f, -0.000068f, + +0.000046f, +0.000107f, +0.000018f, -0.000034f, +0.000058f, +0.000021f + }, + { + -0.000720f, -0.003142f, +0.001107f, -0.001534f, -0.000847f, +0.001990f, -0.001406f, +0.000161f, +0.000177f, +0.000628f, + -0.001086f, +0.000551f, +0.000405f, +0.001910f, -0.003870f, +0.000310f, +0.000765f, +0.000084f, -0.000376f, +0.000586f, + -0.000529f, -0.000277f, +0.000192f, +0.000417f, +0.000273f, -0.000264f, -0.000292f, +0.001669f, +0.000257f, -0.000478f, + +0.000085f, +0.000197f, -0.000313f, -0.000153f, +0.000235f, +0.000056f, -0.000199f, -0.000074f, +0.000142f, +0.000223f, + +0.000018f, +0.000545f, -0.000097f, -0.000380f, -0.000216f, +0.000290f, -0.000187f, +0.000036f, +0.000111f, +0.000267f, + +0.000154f, +0.000304f, +0.000270f, +0.000220f, -0.000006f, -0.000060f, -0.000069f, -0.000153f, +0.000121f, +0.000038f, + +0.000067f, +0.000031f, -0.000134f, -0.000055f, -0.000006f, -0.000030f, -0.000052f, +0.000090f, -0.000025f, +0.000024f, + -0.000041f, -0.000095f, -0.000077f, +0.000139f, +0.000133f, -0.000023f, -0.000067f, -0.000059f, +0.000030f, -0.000019f, + -0.000081f, -0.000014f, +0.000065f, -0.000003f, +0.000036f, +0.000027f, -0.000005f, +0.000041f, +0.000046f, -0.000082f, + -0.000000f, -0.000021f, -0.000022f, -0.000005f, +0.000032f, +0.000039f + } + }, + { + { + +0.000191f, +0.010921f, -0.000497f, +0.000252f, -0.000582f, +0.000144f, -0.000336f, +0.000316f, -0.000117f, +0.000301f, + -0.000402f, +0.000187f, +0.000714f, -0.001152f, +0.000196f, -0.000139f, -0.000339f, +0.000450f, +0.002407f, -0.000790f, + +0.000804f, +0.001194f, +0.000821f, +0.000336f, -0.000144f, -0.000149f, +0.000190f, -0.000153f, +0.000172f, +0.000602f, + +0.000190f, -0.000113f, +0.000481f, -0.000357f, -0.000395f, +0.000036f, +0.000030f, -0.000494f, -0.000548f, -0.000543f, + +0.000092f, -0.000145f, +0.000052f, -0.000138f, +0.000499f, -0.000219f, -0.000244f, -0.000248f, -0.000103f, -0.000110f, + -0.000000f, -0.000048f, -0.000097f, +0.000079f, +0.000069f, -0.000176f, -0.000040f, -0.000255f, +0.000039f, +0.000061f, + +0.000081f, +0.000157f, +0.000118f, +0.000023f, -0.000004f, +0.000061f, -0.000102f, -0.000017f, +0.000103f, +0.000092f, + -0.000063f, -0.000028f, -0.000045f, +0.000036f, +0.000024f, -0.000037f, -0.000056f, +0.000019f, +0.000041f, -0.000012f, + -0.000037f, +0.000025f, +0.000090f, +0.000065f, +0.000016f, -0.000061f, -0.000050f, +0.000009f, +0.000003f, -0.000075f, + +0.000020f, +0.000014f, -0.000005f, +0.000006f, -0.000060f, -0.000027f + }, + { + -0.006133f, +0.029145f, +0.005433f, +0.000148f, -0.000964f, +0.000366f, -0.000427f, -0.001732f, -0.000359f, +0.000702f, + +0.000525f, -0.000027f, +0.000440f, -0.000398f, -0.001222f, -0.000933f, -0.000124f, -0.000258f, +0.000772f, -0.000792f, + -0.000718f, +0.000292f, -0.000085f, -0.000047f, +0.000125f, +0.000202f, -0.000658f, +0.000216f, -0.000084f, -0.000113f, + +0.000123f, +0.000018f, -0.000053f, -0.000150f, +0.000229f, +0.000680f, +0.000320f, +0.000183f, -0.000595f, -0.000332f, + +0.000114f, +0.000289f, +0.000268f, -0.000149f, +0.000003f, -0.000231f, +0.000119f, -0.000251f, -0.000400f, +0.000470f, + -0.000244f, +0.000026f, +0.000369f, +0.000165f, -0.000102f, -0.000041f, +0.000180f, +0.000187f, -0.000077f, -0.000084f, + +0.000219f, -0.000018f, +0.000058f, +0.000128f, -0.000164f, -0.000094f, -0.000041f, +0.000113f, +0.000074f, -0.000008f, + -0.000064f, -0.000078f, +0.000003f, +0.000013f, -0.000115f, +0.000006f, +0.000048f, -0.000087f, -0.000042f, +0.000009f, + +0.000061f, -0.000031f, +0.000010f, +0.000047f, +0.000079f, -0.000121f, +0.000007f, +0.000049f, +0.000000f, +0.000012f, + -0.000036f, +0.000014f, +0.000037f, -0.000022f, +0.000014f, -0.000000f + }, + { + +0.000890f, +0.020136f, +0.006962f, +0.000669f, +0.002199f, -0.000493f, +0.000241f, -0.000105f, -0.000106f, -0.000461f, + -0.000088f, +0.000543f, -0.000504f, -0.000759f, -0.000487f, +0.001449f, +0.000559f, +0.000554f, +0.000225f, +0.000025f, + +0.000076f, -0.000315f, -0.000304f, -0.000115f, -0.000087f, +0.000391f, -0.000064f, -0.000065f, -0.000369f, +0.000491f, + +0.000122f, -0.000132f, +0.000146f, -0.000289f, -0.000077f, -0.000176f, -0.000006f, +0.000068f, +0.000074f, -0.000576f, + -0.000220f, +0.000527f, +0.000149f, +0.000199f, +0.000223f, -0.000613f, -0.000399f, +0.000461f, -0.000050f, +0.000107f, + -0.000004f, +0.000186f, -0.000042f, +0.000011f, -0.000040f, +0.000050f, +0.000116f, +0.000031f, +0.000084f, +0.000009f, + +0.000074f, +0.000172f, +0.000158f, +0.000038f, +0.000096f, -0.000042f, -0.000003f, -0.000036f, +0.000032f, +0.000083f, + -0.000008f, -0.000101f, +0.000031f, +0.000025f, +0.000006f, +0.000027f, +0.000044f, +0.000009f, +0.000004f, -0.000093f, + -0.000000f, +0.000021f, +0.000067f, -0.000027f, -0.000079f, +0.000007f, -0.000056f, -0.000024f, +0.000029f, -0.000032f, + +0.000035f, +0.000036f, +0.000029f, +0.000010f, -0.000008f, +0.000019f + }, + { + +0.000547f, -0.004959f, -0.001480f, +0.000409f, -0.000091f, -0.000211f, -0.000020f, -0.000048f, -0.000063f, +0.000036f, + +0.000062f, -0.000219f, -0.000868f, -0.001034f, -0.004573f, -0.000546f, -0.001174f, +0.000522f, +0.000318f, +0.000214f, + -0.000427f, -0.001801f, +0.000239f, -0.000118f, +0.000057f, -0.001845f, -0.000904f, +0.001427f, -0.000399f, -0.000899f, + -0.000068f, +0.001283f, +0.000220f, -0.000610f, -0.000474f, +0.000143f, -0.000204f, -0.000187f, +0.000299f, -0.000281f, + +0.000039f, +0.000009f, -0.000108f, -0.000225f, -0.000127f, +0.000232f, -0.000080f, +0.000086f, +0.000232f, +0.000130f, + -0.000103f, -0.000067f, +0.000095f, -0.000041f, +0.000226f, -0.000048f, -0.000156f, +0.000094f, +0.000011f, -0.000167f, + -0.000024f, +0.000054f, +0.000003f, -0.000036f, +0.000094f, +0.000004f, +0.000039f, -0.000077f, +0.000078f, +0.000006f, + -0.000153f, -0.000081f, -0.000022f, +0.000075f, -0.000022f, -0.000035f, +0.000144f, +0.000105f, -0.000023f, -0.000049f, + -0.000027f, +0.000036f, +0.000003f, +0.000018f, -0.000000f, -0.000062f, -0.000005f, +0.000051f, +0.000091f, -0.000029f, + +0.000000f, +0.000052f, +0.000078f, +0.000030f, +0.000008f, +0.000040f + }, + { + -0.000935f, +0.045161f, +0.000476f, -0.000970f, -0.000420f, -0.000129f, +0.000625f, +0.000075f, -0.000521f, -0.000480f, + +0.000487f, +0.000394f, -0.000187f, +0.000441f, +0.001047f, +0.000664f, -0.000020f, +0.000211f, +0.000405f, +0.000281f, + -0.000362f, -0.000032f, +0.000831f, -0.001039f, +0.000293f, +0.000245f, +0.000362f, -0.002208f, -0.001286f, +0.000296f, + +0.000659f, +0.000242f, -0.000018f, +0.000125f, +0.000011f, +0.000141f, -0.000715f, -0.000001f, +0.000197f, +0.000053f, + +0.000045f, +0.000071f, -0.000044f, -0.000102f, -0.000436f, +0.000329f, +0.000020f, +0.000023f, +0.000230f, -0.000022f, + +0.000205f, +0.000205f, -0.000125f, -0.000107f, -0.000045f, +0.000178f, -0.000045f, -0.000218f, -0.000086f, -0.000113f, + -0.000032f, -0.000147f, +0.000044f, -0.000068f, -0.000025f, -0.000058f, +0.000020f, -0.000130f, -0.000015f, +0.000069f, + -0.000022f, -0.000165f, -0.000103f, +0.000012f, +0.000072f, -0.000050f, +0.000059f, +0.000068f, -0.000050f, +0.000018f, + +0.000021f, +0.000058f, +0.000050f, -0.000010f, -0.000079f, +0.000032f, +0.000010f, -0.000022f, -0.000062f, -0.000029f, + -0.000013f, -0.000046f, +0.000002f, -0.000050f, +0.000002f, +0.000016f + }, + { + -0.000139f, +0.002463f, +0.000305f, -0.000320f, -0.000149f, -0.000089f, +0.000104f, -0.000153f, +0.000240f, +0.000003f, + -0.000061f, -0.000045f, -0.000474f, -0.001621f, -0.000133f, -0.000756f, +0.000375f, +0.000756f, +0.001912f, +0.000958f, + +0.000310f, +0.000950f, +0.000693f, -0.000654f, -0.002538f, -0.000601f, +0.000066f, -0.000627f, -0.001030f, +0.000605f, + -0.000916f, +0.000012f, -0.000046f, +0.000148f, +0.000258f, -0.000243f, +0.000317f, -0.000096f, +0.000294f, -0.000111f, + +0.000365f, +0.000104f, -0.000013f, +0.000274f, +0.000102f, -0.000064f, -0.000052f, -0.000003f, -0.000012f, -0.000101f, + +0.000106f, +0.000110f, -0.000185f, +0.000055f, -0.000004f, +0.000098f, -0.000132f, -0.000042f, -0.000050f, -0.000078f, + -0.000101f, -0.000051f, +0.000192f, +0.000015f, -0.000022f, +0.000012f, -0.000060f, -0.000011f, +0.000024f, -0.000099f, + +0.000035f, +0.000166f, -0.000071f, -0.000044f, +0.000080f, +0.000050f, +0.000136f, +0.000073f, +0.000025f, -0.000084f, + +0.000040f, +0.000005f, -0.000112f, -0.000049f, +0.000005f, +0.000021f, -0.000011f, +0.000001f, +0.000009f, +0.000009f, + -0.000052f, -0.000034f, +0.000069f, +0.000032f, +0.000006f, -0.000021f + }, + { + -0.011167f, -0.000806f, -0.000532f, +0.001783f, +0.001241f, +0.000135f, +0.000130f, +0.000175f, -0.000623f, -0.000231f, + -0.000189f, +0.000059f, -0.000053f, +0.000314f, -0.000576f, +0.000476f, -0.000279f, +0.000176f, +0.000236f, -0.000372f, + -0.000123f, +0.000254f, +0.000066f, -0.000056f, -0.000006f, +0.000322f, +0.000340f, +0.000184f, -0.000637f, -0.000212f, + +0.000360f, +0.000226f, +0.000280f, -0.000245f, +0.000171f, -0.000369f, -0.000188f, +0.000076f, -0.000006f, +0.000112f, + -0.000129f, -0.000063f, -0.000206f, -0.000188f, +0.000191f, -0.000261f, -0.000498f, -0.000345f, +0.000193f, -0.000132f, + +0.000032f, -0.000028f, +0.000035f, +0.000121f, -0.000090f, +0.000260f, +0.000131f, +0.000008f, +0.000117f, +0.000073f, + -0.000063f, +0.000012f, +0.000017f, -0.000035f, -0.000049f, +0.000134f, +0.000122f, -0.000069f, -0.000138f, +0.000033f, + -0.000067f, -0.000191f, +0.000170f, +0.000123f, -0.000038f, -0.000054f, +0.000017f, +0.000004f, +0.000012f, +0.000055f, + +0.000013f, -0.000010f, +0.000081f, +0.000032f, -0.000130f, +0.000012f, +0.000074f, +0.000012f, -0.000038f, -0.000030f, + +0.000070f, +0.000016f, -0.000034f, -0.000015f, -0.000032f, +0.000011f + }, + { + -0.000110f, +0.001754f, +0.001444f, +0.000572f, -0.000099f, -0.000245f, +0.000082f, -0.000306f, +0.000150f, +0.000050f, + -0.000471f, -0.000304f, -0.000818f, -0.001489f, +0.001809f, -0.002115f, -0.001729f, -0.000333f, -0.000340f, -0.001071f, + +0.000100f, +0.000289f, -0.000395f, -0.000813f, +0.000002f, -0.001102f, -0.000448f, +0.000230f, -0.000017f, +0.000565f, + -0.000526f, -0.000389f, -0.000144f, +0.000181f, -0.000252f, +0.000482f, -0.000125f, +0.000340f, +0.000327f, +0.000369f, + +0.000132f, -0.000188f, +0.000019f, -0.000332f, -0.000333f, +0.000061f, +0.000476f, -0.000159f, -0.000291f, +0.000386f, + +0.000226f, -0.000014f, -0.000026f, +0.000149f, +0.000143f, +0.000077f, +0.000209f, +0.000245f, -0.000287f, -0.000060f, + +0.000132f, +0.000117f, +0.000083f, +0.000030f, -0.000002f, -0.000092f, +0.000016f, +0.000043f, -0.000037f, +0.000020f, + +0.000019f, +0.000028f, -0.000006f, +0.000047f, +0.000074f, -0.000012f, +0.000036f, +0.000113f, +0.000040f, -0.000007f, + -0.000038f, -0.000084f, -0.000025f, -0.000057f, +0.000019f, +0.000028f, +0.000074f, +0.000001f, -0.000025f, +0.000082f, + +0.000010f, -0.000020f, +0.000005f, -0.000019f, -0.000003f, -0.000019f + }, + { + +0.007496f, +0.073055f, -0.001509f, +0.004104f, +0.000938f, +0.000186f, +0.000616f, -0.000744f, -0.000505f, +0.000879f, + -0.000785f, -0.001222f, -0.001037f, +0.000405f, +0.001220f, -0.000376f, +0.000610f, -0.000686f, +0.000201f, +0.000011f, + +0.000604f, -0.000247f, -0.000251f, +0.000141f, -0.000407f, +0.000151f, +0.000198f, +0.000506f, +0.000150f, +0.000449f, + +0.000016f, +0.000013f, -0.000433f, -0.000018f, +0.000239f, -0.000139f, +0.000314f, -0.000450f, +0.000755f, +0.000640f, + +0.000594f, +0.000001f, -0.000102f, +0.000240f, -0.000110f, +0.000253f, +0.000404f, -0.000370f, -0.000231f, -0.000100f, + +0.000060f, -0.000046f, -0.000047f, +0.000050f, +0.000122f, -0.000136f, -0.000197f, -0.000001f, -0.000096f, -0.000163f, + +0.000079f, +0.000051f, +0.000070f, -0.000034f, -0.000268f, -0.000037f, +0.000179f, -0.000002f, -0.000019f, +0.000020f, + -0.000059f, -0.000060f, +0.000046f, +0.000056f, +0.000106f, -0.000184f, -0.000077f, +0.000089f, +0.000014f, -0.000073f, + -0.000019f, +0.000033f, -0.000099f, -0.000011f, -0.000108f, -0.000035f, +0.000049f, +0.000059f, +0.000037f, -0.000003f, + -0.000034f, +0.000003f, -0.000050f, +0.000025f, +0.000024f, -0.000027f + }, + { + +0.000161f, -0.002932f, +0.001081f, -0.001114f, -0.000543f, +0.001501f, -0.000427f, -0.000907f, +0.000013f, -0.000071f, + -0.000147f, -0.000714f, +0.000202f, +0.000455f, +0.001655f, +0.001139f, +0.001350f, +0.000270f, +0.002122f, +0.000142f, + -0.001190f, +0.000040f, +0.000064f, -0.000095f, +0.000669f, -0.000130f, -0.000099f, +0.000329f, +0.000170f, +0.000507f, + +0.000034f, -0.000414f, +0.000618f, +0.000408f, -0.000191f, +0.000209f, +0.000070f, +0.000422f, -0.000248f, +0.000236f, + +0.000139f, +0.000245f, -0.000136f, -0.000130f, +0.000265f, +0.000284f, +0.000116f, -0.000004f, -0.000204f, +0.000249f, + +0.000489f, +0.000106f, -0.000000f, +0.000083f, -0.000337f, -0.000075f, +0.000102f, +0.000046f, +0.000137f, +0.000173f, + -0.000019f, -0.000043f, -0.000157f, -0.000085f, -0.000111f, -0.000115f, +0.000079f, +0.000158f, +0.000187f, -0.000039f, + -0.000049f, +0.000023f, -0.000079f, -0.000029f, +0.000043f, -0.000056f, -0.000097f, -0.000047f, -0.000039f, -0.000089f, + -0.000049f, +0.000007f, +0.000058f, +0.000011f, +0.000034f, +0.000013f, -0.000042f, +0.000007f, -0.000012f, +0.000034f, + -0.000000f, +0.000034f, +0.000022f, -0.000005f, +0.000047f, +0.000030f + }, + { + +0.000038f, +0.025670f, +0.000437f, +0.000694f, +0.000964f, +0.000510f, -0.001779f, -0.001790f, -0.001001f, +0.000422f, + +0.000199f, +0.000295f, +0.000727f, +0.000373f, -0.000733f, +0.000975f, +0.000676f, +0.000729f, +0.000169f, +0.000419f, + -0.000054f, -0.000516f, +0.000136f, -0.000290f, -0.000075f, -0.000138f, -0.000367f, -0.000224f, +0.000288f, +0.000007f, + +0.000008f, -0.000113f, -0.000190f, -0.000269f, +0.000415f, -0.000390f, +0.000110f, +0.000348f, -0.000304f, +0.000275f, + +0.000412f, -0.000126f, -0.000243f, +0.000045f, -0.000292f, -0.000011f, +0.000001f, +0.000171f, -0.000084f, -0.000034f, + +0.000219f, +0.000212f, -0.000023f, -0.000108f, -0.000141f, -0.000243f, -0.000117f, +0.000162f, +0.000165f, -0.000144f, + +0.000046f, +0.000073f, -0.000086f, -0.000115f, +0.000037f, -0.000020f, -0.000027f, -0.000031f, -0.000018f, +0.000011f, + +0.000024f, -0.000003f, +0.000056f, +0.000160f, +0.000032f, +0.000057f, +0.000035f, -0.000130f, -0.000005f, +0.000018f, + -0.000019f, +0.000054f, -0.000061f, +0.000052f, +0.000026f, +0.000060f, +0.000044f, +0.000004f, +0.000039f, -0.000038f, + +0.000023f, +0.000004f, -0.000054f, -0.000033f, +0.000037f, +0.000030f + }, + { + -0.000217f, -0.000853f, +0.001940f, +0.000351f, -0.000018f, -0.000275f, -0.000738f, -0.000213f, -0.000309f, +0.000133f, + +0.000011f, -0.000346f, -0.000275f, -0.001391f, -0.003126f, +0.001757f, +0.000216f, -0.000912f, +0.000455f, +0.000644f, + -0.000268f, +0.000568f, -0.000049f, +0.000168f, -0.000102f, -0.000957f, +0.000024f, -0.000239f, +0.000224f, +0.001442f, + +0.000124f, -0.000545f, -0.000403f, -0.000282f, +0.000431f, -0.000348f, -0.000073f, +0.000234f, +0.000311f, +0.000347f, + -0.000011f, -0.000139f, +0.000236f, +0.000197f, -0.000117f, +0.000071f, -0.000225f, -0.000060f, +0.000346f, +0.000127f, + +0.000202f, -0.000231f, -0.000021f, -0.000074f, -0.000010f, -0.000167f, -0.000159f, -0.000524f, -0.000124f, -0.000133f, + +0.000186f, +0.000106f, -0.000023f, -0.000218f, -0.000151f, +0.000167f, +0.000031f, -0.000067f, -0.000044f, +0.000022f, + +0.000073f, -0.000002f, +0.000047f, +0.000056f, -0.000017f, +0.000081f, +0.000053f, -0.000025f, -0.000014f, -0.000028f, + -0.000008f, +0.000060f, -0.000107f, -0.000091f, -0.000005f, -0.000041f, -0.000047f, -0.000023f, +0.000020f, +0.000007f, + -0.000002f, +0.000033f, +0.000026f, -0.000042f, -0.000012f, +0.000041f + }, + { + -0.000257f, -0.007456f, +0.005324f, +0.000879f, +0.000626f, +0.000377f, +0.002779f, -0.001406f, -0.000639f, +0.000241f, + +0.000614f, +0.000002f, +0.001279f, -0.001897f, -0.000400f, -0.000325f, -0.000384f, +0.000530f, -0.000345f, +0.001074f, + +0.000353f, +0.000201f, -0.000097f, +0.000199f, +0.000094f, +0.000811f, +0.000134f, -0.000120f, +0.000165f, +0.000014f, + +0.000230f, -0.000130f, +0.000051f, -0.000232f, +0.000517f, -0.000102f, +0.000402f, +0.000088f, +0.000032f, +0.000267f, + -0.000251f, -0.000169f, -0.000055f, -0.000242f, -0.000355f, -0.000191f, +0.000028f, -0.000533f, -0.000060f, -0.000139f, + +0.000073f, -0.000009f, -0.000042f, +0.000411f, +0.000259f, +0.000093f, -0.000040f, -0.000010f, -0.000228f, +0.000178f, + +0.000228f, -0.000078f, -0.000068f, -0.000013f, -0.000017f, -0.000028f, -0.000088f, -0.000058f, +0.000046f, +0.000123f, + -0.000139f, -0.000066f, +0.000099f, +0.000097f, -0.000040f, -0.000023f, -0.000040f, +0.000064f, +0.000010f, +0.000053f, + -0.000021f, -0.000102f, +0.000017f, +0.000047f, +0.000064f, -0.000042f, -0.000169f, -0.000031f, -0.000018f, -0.000046f, + -0.000015f, +0.000004f, +0.000085f, +0.000054f, +0.000030f, +0.000055f + }, + { + +0.000121f, +0.002431f, -0.001378f, +0.001121f, -0.000060f, +0.000181f, -0.000042f, +0.000044f, -0.000144f, -0.000382f, + +0.000566f, -0.000010f, -0.000033f, -0.002141f, +0.004210f, -0.001285f, -0.001190f, -0.000425f, +0.000148f, +0.000823f, + +0.000495f, -0.000325f, -0.000255f, +0.000681f, +0.000106f, +0.000280f, -0.000151f, +0.000100f, +0.000106f, -0.000256f, + +0.000489f, -0.000345f, -0.000547f, +0.000292f, -0.000203f, -0.000424f, +0.000044f, -0.000305f, -0.000224f, -0.000201f, + +0.000009f, +0.000313f, +0.000090f, -0.000022f, +0.000087f, -0.000212f, +0.000054f, +0.000254f, +0.000106f, -0.000014f, + +0.000405f, -0.000037f, -0.000168f, -0.000085f, -0.000094f, -0.000092f, -0.000060f, -0.000034f, -0.000004f, +0.000007f, + +0.000283f, +0.000064f, -0.000187f, -0.000053f, +0.000033f, -0.000067f, -0.000142f, +0.000174f, +0.000046f, -0.000012f, + -0.000028f, -0.000084f, +0.000002f, +0.000050f, +0.000009f, +0.000117f, -0.000109f, -0.000020f, +0.000002f, -0.000012f, + +0.000158f, -0.000005f, -0.000045f, -0.000005f, -0.000069f, -0.000065f, -0.000043f, +0.000087f, -0.000011f, -0.000010f, + +0.000105f, +0.000060f, -0.000056f, -0.000023f, +0.000057f, -0.000042f + }, + { + +0.000284f, -0.001294f, +0.000128f, -0.002775f, +0.000260f, +0.004861f, -0.000481f, +0.000220f, -0.000240f, +0.000144f, + -0.000693f, +0.000569f, -0.000252f, +0.000638f, -0.004172f, +0.000711f, +0.000200f, -0.000182f, -0.000045f, +0.000078f, + -0.001018f, -0.000207f, +0.000142f, +0.000661f, -0.000187f, -0.000318f, +0.000124f, +0.001059f, -0.000270f, -0.000432f, + +0.000371f, +0.000420f, -0.000451f, -0.000462f, -0.000142f, +0.000226f, -0.000077f, +0.000130f, +0.000055f, +0.000017f, + -0.000109f, +0.000300f, -0.000548f, -0.000363f, -0.000079f, +0.000048f, -0.000275f, +0.000115f, +0.000223f, +0.000128f, + -0.000054f, +0.000143f, +0.000164f, +0.000083f, +0.000217f, -0.000023f, +0.000010f, +0.000040f, -0.000015f, -0.000121f, + -0.000033f, -0.000036f, -0.000122f, -0.000090f, -0.000009f, -0.000086f, -0.000028f, +0.000011f, -0.000010f, +0.000098f, + -0.000026f, -0.000079f, +0.000046f, +0.000175f, +0.000035f, -0.000097f, -0.000051f, -0.000005f, +0.000062f, -0.000031f, + -0.000030f, +0.000009f, +0.000031f, -0.000019f, +0.000051f, +0.000068f, -0.000021f, +0.000103f, -0.000019f, -0.000072f, + +0.000029f, -0.000049f, -0.000017f, +0.000000f, +0.000011f, +0.000015f + } + }, + { + { + -0.000077f, +0.003609f, +0.003220f, -0.000319f, +0.000223f, +0.000100f, -0.000143f, -0.000117f, +0.000000f, -0.000224f, + -0.000329f, +0.000091f, -0.001023f, -0.000067f, +0.002864f, -0.001933f, +0.000500f, -0.000271f, +0.000612f, +0.000548f, + +0.000887f, +0.000162f, -0.000977f, -0.000548f, +0.000264f, +0.000361f, -0.000014f, -0.000079f, +0.000199f, -0.000719f, + -0.000446f, +0.000473f, -0.000468f, +0.000754f, -0.000103f, +0.000180f, -0.000330f, +0.000469f, +0.000254f, -0.000110f, + -0.000180f, -0.000161f, -0.000039f, +0.000168f, +0.000140f, -0.000014f, +0.000114f, +0.000175f, -0.000164f, -0.000051f, + -0.000284f, -0.000071f, +0.000021f, -0.000222f, -0.000220f, +0.000068f, +0.000095f, +0.000078f, +0.000128f, +0.000048f, + -0.000123f, -0.000098f, -0.000158f, +0.000072f, +0.000020f, -0.000119f, -0.000086f, +0.000064f, -0.000056f, -0.000154f, + +0.000025f, +0.000063f, -0.000019f, +0.000063f, -0.000001f, -0.000011f, +0.000023f, +0.000022f, -0.000070f, -0.000062f, + +0.000034f, -0.000021f, -0.000067f, -0.000125f, -0.000074f, +0.000017f, +0.000056f, -0.000023f, -0.000019f, +0.000050f, + +0.000032f, -0.000038f, +0.000001f, -0.000011f, +0.000036f, +0.000052f + }, + { + +0.005100f, +0.009659f, +0.006781f, +0.004477f, +0.000438f, +0.000092f, -0.000270f, +0.000958f, +0.001097f, +0.000125f, + +0.001046f, +0.000029f, -0.000146f, +0.000021f, -0.001169f, +0.000860f, +0.000673f, -0.000131f, -0.000303f, -0.000635f, + -0.000324f, -0.000133f, +0.000739f, -0.000115f, +0.000208f, -0.000341f, +0.000158f, +0.000586f, -0.000158f, -0.000147f, + -0.000437f, +0.000036f, -0.000080f, +0.000922f, +0.000106f, -0.000042f, +0.000235f, +0.000497f, +0.000268f, +0.000106f, + +0.000294f, -0.000081f, -0.000215f, -0.000115f, -0.000256f, -0.000052f, +0.000342f, +0.000050f, +0.000307f, +0.000002f, + -0.000156f, +0.000016f, -0.000157f, -0.000106f, -0.000067f, -0.000029f, -0.000080f, -0.000072f, -0.000029f, -0.000021f, + -0.000127f, -0.000123f, +0.000076f, +0.000058f, +0.000047f, +0.000128f, +0.000060f, -0.000052f, -0.000109f, -0.000101f, + +0.000025f, +0.000016f, +0.000107f, -0.000069f, +0.000011f, +0.000121f, -0.000102f, +0.000026f, +0.000098f, +0.000016f, + -0.000091f, -0.000026f, +0.000068f, -0.000035f, -0.000082f, +0.000054f, +0.000070f, -0.000066f, +0.000046f, -0.000006f, + +0.000011f, +0.000020f, -0.000017f, -0.000031f, +0.000011f, -0.000016f + }, + { + -0.001405f, +0.034769f, +0.003445f, -0.001748f, -0.002786f, -0.000060f, -0.000219f, -0.000611f, -0.000040f, +0.000394f, + +0.000814f, +0.000410f, +0.001051f, +0.000945f, -0.001250f, +0.001032f, +0.000794f, -0.000364f, +0.000956f, +0.000386f, + +0.000277f, +0.000558f, -0.000709f, +0.000196f, +0.000045f, -0.000319f, -0.000533f, +0.000078f, +0.000428f, +0.000259f, + +0.000348f, -0.000179f, -0.000573f, +0.000162f, +0.000198f, -0.000280f, -0.000031f, -0.000035f, -0.000369f, +0.000044f, + -0.000000f, -0.000166f, +0.000075f, +0.000055f, -0.000362f, +0.000017f, +0.000223f, -0.000033f, -0.000369f, -0.000287f, + +0.000364f, +0.000417f, +0.000137f, -0.000147f, +0.000120f, +0.000105f, -0.000134f, -0.000284f, +0.000054f, +0.000129f, + +0.000107f, -0.000291f, -0.000018f, -0.000009f, -0.000013f, -0.000168f, -0.000084f, -0.000077f, -0.000027f, -0.000069f, + -0.000032f, -0.000065f, -0.000033f, -0.000063f, -0.000027f, +0.000079f, -0.000007f, +0.000034f, +0.000091f, +0.000026f, + -0.000008f, +0.000020f, -0.000038f, -0.000070f, +0.000085f, +0.000007f, -0.000015f, +0.000068f, +0.000015f, +0.000036f, + +0.000011f, -0.000040f, -0.000021f, -0.000021f, +0.000009f, -0.000016f + }, + { + -0.000574f, -0.006177f, +0.001704f, -0.000326f, -0.000221f, +0.000162f, +0.000114f, +0.000013f, -0.000392f, -0.000017f, + +0.000142f, +0.000043f, -0.000290f, -0.000764f, -0.004546f, -0.000650f, -0.000401f, +0.002820f, -0.001331f, -0.000075f, + +0.000637f, -0.000787f, -0.000444f, -0.000759f, -0.000015f, -0.001663f, -0.000299f, +0.000374f, +0.000378f, +0.000618f, + -0.000394f, +0.000311f, -0.000161f, -0.000371f, +0.000157f, -0.000214f, -0.000409f, +0.000221f, -0.000205f, -0.000296f, + -0.000033f, -0.000345f, +0.000104f, +0.000100f, +0.000114f, +0.000003f, -0.000220f, +0.000049f, -0.000013f, -0.000190f, + +0.000162f, +0.000111f, -0.000237f, -0.000018f, -0.000040f, -0.000221f, +0.000160f, +0.000116f, -0.000118f, +0.000082f, + +0.000099f, -0.000021f, -0.000023f, +0.000079f, -0.000145f, -0.000101f, +0.000038f, -0.000012f, -0.000181f, -0.000080f, + +0.000109f, +0.000185f, +0.000001f, -0.000065f, -0.000021f, +0.000101f, -0.000041f, -0.000104f, -0.000096f, -0.000036f, + +0.000017f, -0.000009f, -0.000053f, -0.000007f, -0.000026f, +0.000070f, +0.000044f, -0.000043f, -0.000020f, -0.000022f, + +0.000038f, -0.000001f, -0.000069f, -0.000016f, +0.000014f, -0.000041f + }, + { + +0.006773f, +0.042829f, -0.003922f, -0.002646f, -0.000106f, +0.000034f, +0.000042f, +0.000263f, -0.000124f, +0.000162f, + -0.000343f, -0.000652f, +0.000528f, +0.000339f, +0.001276f, +0.001113f, -0.000409f, +0.000477f, +0.000731f, +0.000231f, + +0.000087f, +0.000173f, -0.000047f, +0.000517f, +0.001058f, -0.000497f, -0.000110f, -0.002357f, -0.000115f, +0.000876f, + +0.000253f, +0.000163f, +0.000353f, +0.000036f, -0.000072f, +0.000220f, +0.000980f, +0.000922f, -0.000295f, -0.000050f, + +0.000647f, +0.000128f, -0.000338f, -0.000341f, +0.000173f, +0.000097f, -0.000248f, -0.000101f, +0.000182f, +0.000322f, + -0.000117f, -0.000331f, -0.000118f, +0.000128f, +0.000105f, -0.000102f, +0.000083f, +0.000202f, +0.000064f, -0.000098f, + -0.000103f, +0.000060f, +0.000012f, -0.000100f, -0.000054f, -0.000008f, -0.000110f, +0.000079f, +0.000026f, -0.000102f, + -0.000042f, +0.000138f, +0.000167f, +0.000059f, -0.000095f, -0.000026f, -0.000043f, -0.000094f, +0.000068f, -0.000041f, + -0.000071f, +0.000038f, -0.000006f, +0.000004f, +0.000089f, +0.000009f, -0.000015f, -0.000002f, +0.000013f, +0.000016f, + -0.000010f, +0.000048f, +0.000014f, +0.000022f, +0.000048f, -0.000017f + }, + { + +0.000471f, -0.000357f, -0.000604f, +0.000384f, +0.000015f, +0.000074f, +0.000012f, -0.000228f, -0.000183f, -0.000071f, + +0.000287f, +0.000181f, +0.000180f, +0.000647f, +0.002355f, -0.000885f, -0.001390f, +0.001386f, +0.000215f, +0.002267f, + +0.000034f, +0.001063f, -0.000915f, -0.000280f, +0.000333f, +0.000216f, -0.000240f, -0.000005f, -0.000650f, -0.000723f, + -0.000419f, +0.000197f, +0.000051f, -0.000674f, -0.000437f, -0.000112f, -0.000142f, -0.000219f, -0.000110f, +0.000290f, + +0.000022f, -0.000127f, +0.000384f, +0.000013f, -0.000198f, +0.000048f, +0.000098f, +0.000227f, +0.000151f, -0.000049f, + -0.000064f, -0.000175f, +0.000158f, +0.000045f, -0.000210f, -0.000114f, -0.000089f, +0.000126f, +0.000038f, -0.000092f, + -0.000010f, -0.000019f, +0.000045f, +0.000029f, -0.000005f, -0.000065f, +0.000110f, +0.000015f, +0.000045f, +0.000085f, + +0.000013f, -0.000100f, -0.000101f, +0.000008f, +0.000040f, -0.000058f, -0.000097f, -0.000114f, -0.000044f, +0.000008f, + +0.000027f, -0.000108f, +0.000007f, +0.000037f, +0.000026f, -0.000043f, +0.000025f, +0.000000f, -0.000020f, -0.000015f, + +0.000012f, +0.000091f, -0.000034f, -0.000075f, +0.000004f, +0.000008f + }, + { + +0.010880f, -0.034645f, +0.002087f, +0.003608f, +0.000346f, -0.000309f, -0.000061f, -0.000311f, -0.000376f, +0.000154f, + -0.000179f, -0.000396f, -0.000006f, -0.000538f, +0.000379f, -0.000419f, -0.000466f, -0.000356f, +0.000534f, +0.000913f, + +0.000524f, +0.000478f, -0.000197f, +0.000305f, +0.000316f, +0.000441f, +0.000060f, -0.000389f, +0.000467f, +0.000138f, + +0.000147f, -0.000103f, +0.000071f, -0.000251f, -0.000428f, -0.000396f, -0.000313f, +0.000963f, -0.000058f, -0.000437f, + -0.000078f, -0.000260f, +0.000039f, +0.000373f, -0.000185f, +0.000043f, -0.000146f, +0.000072f, -0.000028f, +0.000171f, + +0.000121f, +0.000206f, +0.000236f, -0.000092f, +0.000067f, -0.000019f, -0.000108f, -0.000107f, -0.000123f, -0.000198f, + -0.000139f, +0.000042f, +0.000017f, +0.000031f, +0.000065f, -0.000052f, -0.000175f, -0.000098f, +0.000080f, -0.000059f, + -0.000052f, +0.000169f, -0.000023f, -0.000188f, -0.000005f, +0.000086f, -0.000082f, -0.000033f, +0.000068f, -0.000075f, + -0.000017f, +0.000075f, -0.000030f, -0.000067f, +0.000074f, +0.000052f, -0.000107f, -0.000019f, +0.000022f, +0.000059f, + +0.000002f, -0.000045f, +0.000045f, +0.000008f, +0.000033f, -0.000004f + }, + { + +0.000600f, +0.000519f, -0.001859f, +0.000540f, -0.000149f, +0.000173f, +0.000008f, -0.000194f, +0.000004f, -0.000182f, + -0.000072f, +0.000369f, +0.000182f, -0.000567f, -0.001359f, -0.002143f, +0.000514f, +0.001473f, -0.000966f, +0.000344f, + +0.001695f, +0.001178f, -0.000312f, +0.000628f, -0.000346f, +0.000303f, +0.000052f, +0.000058f, +0.000299f, +0.000184f, + -0.000104f, +0.000416f, +0.000275f, -0.000040f, +0.000179f, +0.000350f, -0.000009f, +0.000207f, -0.000078f, +0.000186f, + +0.000280f, -0.000293f, +0.000189f, -0.000123f, -0.000079f, -0.000087f, -0.000244f, -0.000057f, +0.000572f, -0.000008f, + -0.000144f, +0.000169f, +0.000042f, -0.000067f, -0.000291f, +0.000028f, -0.000035f, -0.000114f, +0.000099f, +0.000074f, + -0.000039f, -0.000091f, -0.000091f, +0.000016f, +0.000048f, +0.000159f, -0.000001f, -0.000076f, -0.000045f, +0.000053f, + +0.000008f, +0.000068f, +0.000025f, +0.000019f, -0.000079f, +0.000028f, -0.000017f, -0.000094f, -0.000037f, -0.000070f, + -0.000051f, +0.000101f, +0.000021f, +0.000043f, -0.000011f, -0.000024f, -0.000000f, -0.000041f, +0.000052f, -0.000015f, + -0.000054f, +0.000041f, -0.000014f, +0.000000f, -0.000007f, +0.000007f + }, + { + -0.000535f, +0.078144f, +0.006253f, +0.004030f, -0.000199f, -0.000162f, -0.000071f, +0.000315f, +0.000290f, -0.000954f, + -0.000322f, +0.000558f, +0.000932f, +0.000260f, +0.001180f, -0.000530f, -0.001553f, +0.000351f, +0.000192f, +0.000212f, + -0.000178f, +0.000174f, +0.000711f, -0.001086f, -0.000174f, -0.000125f, -0.000119f, +0.000408f, +0.000009f, +0.000267f, + -0.000352f, -0.000457f, +0.000080f, +0.000401f, -0.000157f, +0.000497f, +0.000182f, +0.000260f, -0.000653f, +0.000387f, + +0.000440f, -0.000474f, +0.000006f, -0.000182f, +0.000004f, +0.000482f, -0.000492f, -0.000351f, +0.000201f, +0.000158f, + -0.000208f, +0.000037f, -0.000085f, -0.000121f, -0.000031f, +0.000103f, +0.000019f, -0.000216f, -0.000244f, +0.000094f, + +0.000148f, +0.000006f, -0.000005f, +0.000017f, +0.000149f, +0.000224f, +0.000049f, -0.000110f, +0.000059f, -0.000040f, + -0.000047f, +0.000091f, -0.000001f, -0.000084f, -0.000063f, +0.000005f, +0.000048f, -0.000047f, -0.000018f, -0.000034f, + +0.000059f, -0.000016f, +0.000056f, +0.000047f, +0.000033f, +0.000059f, +0.000010f, -0.000065f, -0.000041f, -0.000076f, + +0.000007f, +0.000038f, +0.000028f, +0.000008f, -0.000058f, +0.000005f + }, + { + -0.000167f, -0.001751f, -0.000782f, -0.000196f, +0.000821f, -0.001153f, -0.001375f, +0.000357f, -0.000304f, -0.000505f, + -0.000607f, +0.000370f, +0.000697f, +0.000538f, +0.001246f, -0.000271f, +0.002357f, +0.001474f, -0.001407f, -0.001303f, + +0.000747f, +0.001012f, -0.001118f, -0.001221f, +0.000228f, -0.000425f, +0.000104f, -0.000685f, +0.000772f, +0.000123f, + +0.000060f, +0.000490f, -0.000384f, +0.000133f, -0.000046f, -0.000121f, -0.000264f, -0.000490f, -0.000444f, -0.000036f, + -0.000101f, -0.000126f, -0.000332f, +0.000181f, +0.000250f, -0.000338f, +0.000190f, +0.000075f, +0.000218f, +0.000006f, + -0.000199f, -0.000037f, -0.000043f, -0.000171f, +0.000317f, +0.000328f, +0.000046f, -0.000062f, -0.000038f, -0.000166f, + +0.000020f, +0.000095f, +0.000104f, +0.000150f, -0.000016f, +0.000129f, +0.000000f, -0.000128f, -0.000188f, -0.000156f, + +0.000030f, -0.000032f, +0.000049f, +0.000058f, -0.000076f, +0.000033f, +0.000052f, -0.000007f, +0.000007f, +0.000068f, + +0.000038f, +0.000024f, -0.000014f, -0.000032f, -0.000044f, -0.000072f, +0.000015f, +0.000027f, +0.000014f, -0.000010f, + -0.000043f, +0.000022f, -0.000026f, -0.000013f, -0.000042f, -0.000041f + }, + { + +0.001114f, +0.022684f, +0.005198f, +0.000971f, +0.000406f, -0.002543f, -0.004531f, +0.000296f, -0.000030f, +0.000060f, + +0.000266f, +0.000462f, -0.000169f, -0.000638f, +0.000222f, +0.000865f, +0.000027f, +0.000124f, -0.000009f, +0.000522f, + -0.000239f, -0.000258f, -0.000331f, -0.000107f, -0.000741f, -0.000120f, -0.000080f, +0.000047f, +0.000344f, -0.000585f, + -0.000626f, -0.000265f, -0.000077f, +0.000421f, -0.000120f, +0.000089f, +0.000439f, -0.000489f, +0.000149f, -0.000080f, + -0.000759f, -0.000192f, +0.000084f, +0.000146f, +0.000241f, +0.000028f, -0.000051f, -0.000440f, +0.000000f, +0.000132f, + +0.000011f, -0.000031f, -0.000193f, -0.000140f, +0.000216f, +0.000127f, +0.000119f, -0.000086f, -0.000190f, +0.000103f, + +0.000057f, -0.000026f, -0.000008f, +0.000066f, +0.000004f, -0.000032f, +0.000074f, +0.000027f, -0.000011f, +0.000008f, + +0.000052f, +0.000042f, -0.000002f, -0.000087f, -0.000085f, -0.000023f, -0.000100f, +0.000036f, +0.000047f, +0.000011f, + +0.000068f, -0.000063f, +0.000035f, +0.000040f, -0.000053f, -0.000006f, -0.000086f, -0.000020f, -0.000002f, +0.000046f, + +0.000004f, -0.000033f, +0.000007f, +0.000052f, +0.000004f, -0.000045f + }, + { + +0.000198f, +0.001514f, -0.000152f, +0.000158f, -0.000414f, -0.000344f, +0.000156f, -0.000159f, -0.000083f, +0.000128f, + -0.000475f, +0.000349f, -0.000915f, -0.002350f, -0.000118f, +0.001718f, -0.000051f, -0.001303f, -0.001348f, +0.000541f, + +0.001573f, +0.000898f, -0.001381f, -0.000908f, -0.001826f, +0.000971f, +0.000240f, +0.000121f, +0.000963f, -0.000045f, + -0.000464f, +0.000890f, +0.000124f, +0.000312f, +0.000048f, -0.000015f, -0.000103f, -0.000477f, -0.000194f, +0.000051f, + +0.000191f, +0.000256f, +0.000050f, -0.000220f, -0.000328f, +0.000026f, +0.000146f, -0.000100f, +0.000129f, -0.000127f, + -0.000097f, +0.000063f, -0.000058f, -0.000247f, -0.000200f, -0.000077f, +0.000037f, +0.000180f, +0.000294f, +0.000104f, + +0.000092f, -0.000125f, +0.000027f, +0.000058f, +0.000180f, -0.000065f, -0.000019f, +0.000070f, -0.000078f, +0.000022f, + -0.000038f, -0.000034f, -0.000001f, -0.000041f, -0.000072f, -0.000104f, -0.000149f, -0.000015f, +0.000025f, +0.000041f, + +0.000026f, -0.000021f, +0.000067f, +0.000031f, +0.000029f, +0.000050f, +0.000079f, +0.000053f, +0.000025f, -0.000009f, + -0.000011f, -0.000030f, -0.000037f, +0.000013f, +0.000014f, -0.000021f + }, + { + -0.002635f, -0.002299f, +0.004759f, -0.001108f, +0.000147f, +0.000864f, -0.002084f, -0.000804f, +0.000461f, +0.000654f, + -0.000910f, +0.000047f, -0.000364f, +0.001101f, -0.000517f, +0.000615f, +0.000236f, -0.000408f, +0.000113f, -0.000187f, + -0.000314f, +0.000427f, -0.000202f, +0.000257f, +0.000418f, +0.000120f, -0.000310f, -0.000719f, -0.000493f, +0.000015f, + -0.000022f, -0.000291f, +0.000096f, +0.000143f, +0.000138f, -0.000173f, +0.000010f, +0.000396f, +0.000024f, -0.000289f, + +0.000196f, +0.000398f, +0.000158f, +0.000215f, +0.000326f, +0.000395f, +0.000005f, +0.000164f, +0.000284f, -0.000333f, + -0.000019f, -0.000190f, -0.000206f, -0.000036f, -0.000219f, -0.000196f, -0.000026f, -0.000017f, +0.000242f, +0.000131f, + +0.000001f, +0.000036f, -0.000083f, +0.000003f, -0.000143f, +0.000041f, +0.000124f, +0.000099f, +0.000036f, -0.000149f, + +0.000028f, +0.000096f, -0.000001f, -0.000084f, -0.000025f, -0.000040f, +0.000083f, -0.000001f, -0.000044f, -0.000068f, + -0.000059f, +0.000099f, +0.000071f, -0.000008f, -0.000113f, -0.000053f, +0.000113f, +0.000068f, +0.000027f, +0.000068f, + +0.000022f, +0.000026f, -0.000023f, -0.000061f, -0.000017f, -0.000085f + }, + { + -0.000284f, +0.001839f, +0.001399f, +0.000622f, -0.000158f, -0.000339f, -0.000107f, -0.000035f, -0.000357f, -0.000236f, + +0.000134f, +0.000176f, +0.001382f, -0.002719f, -0.009241f, +0.003123f, -0.001089f, -0.000924f, +0.001147f, +0.000527f, + -0.000753f, -0.000201f, -0.000981f, -0.000217f, +0.000324f, -0.000088f, -0.000258f, -0.000070f, -0.000861f, +0.000310f, + +0.000672f, +0.000859f, +0.000231f, +0.000123f, +0.000054f, +0.000374f, +0.000178f, -0.000018f, -0.000243f, -0.000044f, + +0.000278f, -0.000482f, -0.000161f, +0.000190f, -0.000078f, +0.000160f, +0.000083f, -0.000147f, -0.000134f, +0.000098f, + +0.000061f, -0.000313f, -0.000034f, +0.000181f, -0.000003f, -0.000017f, +0.000062f, -0.000059f, -0.000005f, +0.000060f, + -0.000117f, -0.000278f, +0.000017f, -0.000013f, -0.000106f, -0.000025f, +0.000064f, -0.000091f, -0.000062f, -0.000055f, + -0.000031f, +0.000158f, +0.000002f, -0.000046f, +0.000057f, -0.000018f, +0.000045f, +0.000144f, -0.000053f, +0.000028f, + -0.000077f, -0.000126f, +0.000078f, +0.000019f, +0.000024f, +0.000096f, +0.000076f, -0.000023f, -0.000042f, +0.000083f, + -0.000042f, -0.000085f, -0.000020f, +0.000034f, -0.000050f, -0.000034f + }, + { + +0.000689f, -0.001625f, +0.000533f, -0.001349f, +0.000063f, -0.000468f, +0.000674f, +0.000388f, +0.000228f, +0.000104f, + -0.000557f, -0.001091f, -0.000773f, -0.002706f, +0.000680f, -0.000573f, -0.000507f, -0.000607f, +0.000142f, -0.000370f, + +0.000181f, +0.000144f, +0.000271f, -0.000414f, -0.000134f, +0.000982f, +0.000008f, -0.000591f, +0.000330f, -0.000218f, + +0.000342f, +0.000181f, -0.000491f, +0.000154f, +0.000023f, +0.000795f, +0.000334f, -0.000003f, -0.000433f, -0.000295f, + -0.000240f, -0.000143f, -0.000247f, +0.000099f, -0.000001f, +0.000097f, +0.000485f, -0.000013f, -0.000008f, -0.000161f, + -0.000014f, -0.000192f, -0.000296f, -0.000069f, +0.000163f, +0.000009f, +0.000274f, +0.000073f, -0.000114f, -0.000013f, + -0.000077f, +0.000083f, +0.000084f, +0.000133f, -0.000007f, +0.000010f, +0.000076f, -0.000051f, +0.000100f, +0.000040f, + +0.000014f, +0.000136f, +0.000115f, -0.000091f, -0.000182f, -0.000023f, +0.000060f, +0.000050f, +0.000017f, -0.000007f, + +0.000097f, -0.000050f, -0.000058f, +0.000030f, +0.000014f, -0.000007f, -0.000005f, -0.000047f, -0.000100f, +0.000065f, + +0.000009f, +0.000004f, +0.000030f, -0.000002f, -0.000020f, -0.000045f + } + }, + { + { + +0.000409f, -0.005816f, -0.004258f, -0.000036f, -0.000062f, -0.000070f, -0.000146f, -0.000026f, +0.000346f, -0.000203f, + +0.000074f, -0.000481f, -0.000670f, -0.000172f, +0.002292f, -0.000473f, +0.000657f, -0.001613f, -0.001398f, +0.000489f, + +0.001110f, -0.000828f, -0.000689f, -0.000653f, +0.000572f, +0.000810f, +0.000077f, +0.000336f, +0.000315f, -0.000731f, + -0.000897f, +0.000000f, -0.000049f, +0.000875f, -0.000045f, +0.000007f, +0.000132f, +0.000981f, +0.000227f, +0.000116f, + -0.000247f, -0.000069f, +0.000003f, +0.000058f, +0.000002f, -0.000181f, +0.000002f, +0.000197f, -0.000045f, +0.000020f, + -0.000294f, -0.000059f, +0.000081f, -0.000227f, -0.000067f, +0.000190f, +0.000060f, +0.000232f, +0.000016f, -0.000077f, + -0.000113f, -0.000171f, -0.000109f, +0.000068f, -0.000034f, -0.000105f, -0.000004f, +0.000011f, -0.000144f, -0.000058f, + +0.000078f, +0.000049f, -0.000027f, +0.000020f, -0.000028f, +0.000025f, +0.000028f, -0.000030f, -0.000087f, -0.000004f, + +0.000043f, -0.000057f, -0.000083f, -0.000086f, -0.000040f, +0.000072f, +0.000060f, -0.000016f, +0.000005f, +0.000079f, + -0.000039f, -0.000016f, -0.000014f, -0.000005f, +0.000059f, +0.000041f + }, + { + -0.005029f, -0.002707f, +0.001174f, +0.000798f, +0.000178f, +0.000002f, +0.000222f, +0.001403f, +0.000546f, -0.000431f, + +0.000606f, -0.000094f, +0.000015f, +0.001038f, -0.000242f, +0.001295f, +0.000256f, -0.000400f, -0.000410f, -0.000474f, + +0.000197f, -0.000287f, +0.000468f, -0.000455f, +0.000068f, -0.000146f, +0.000426f, +0.000662f, +0.000016f, +0.000065f, + -0.000308f, -0.000013f, -0.000002f, +0.000549f, -0.000292f, -0.000523f, +0.000217f, +0.000791f, +0.000466f, -0.000054f, + +0.000007f, -0.000168f, -0.000025f, +0.000070f, -0.000182f, +0.000171f, +0.000166f, +0.000356f, +0.000310f, -0.000031f, + +0.000041f, -0.000166f, -0.000273f, -0.000041f, +0.000038f, +0.000041f, -0.000244f, -0.000077f, -0.000044f, -0.000011f, + -0.000126f, -0.000019f, +0.000077f, -0.000024f, +0.000133f, +0.000072f, +0.000029f, -0.000086f, -0.000091f, +0.000051f, + +0.000025f, +0.000012f, +0.000056f, -0.000067f, +0.000109f, +0.000015f, -0.000103f, +0.000046f, +0.000052f, +0.000002f, + -0.000069f, -0.000003f, +0.000024f, -0.000064f, -0.000050f, +0.000117f, -0.000017f, -0.000039f, +0.000017f, -0.000003f, + +0.000026f, +0.000007f, -0.000029f, +0.000004f, -0.000006f, -0.000010f + }, + { + +0.000715f, +0.032996f, -0.001619f, -0.000290f, -0.001334f, +0.000201f, -0.000340f, -0.000158f, +0.000299f, +0.000272f, + +0.000396f, +0.000022f, +0.001291f, +0.001380f, -0.001868f, -0.000139f, -0.000145f, -0.000013f, +0.001516f, +0.000213f, + +0.000365f, +0.000731f, -0.000206f, +0.000286f, -0.000279f, -0.000720f, -0.000491f, +0.000153f, +0.000715f, +0.000161f, + +0.000218f, -0.000330f, -0.000203f, +0.000500f, +0.000084f, -0.000440f, -0.000179f, -0.000061f, -0.000014f, +0.000586f, + +0.000097f, -0.000338f, -0.000019f, -0.000004f, -0.000272f, +0.000332f, +0.000005f, -0.000379f, -0.000214f, -0.000102f, + +0.000318f, +0.000066f, +0.000059f, -0.000049f, +0.000124f, -0.000023f, -0.000111f, -0.000064f, +0.000069f, +0.000032f, + -0.000091f, -0.000276f, -0.000040f, -0.000096f, -0.000013f, -0.000070f, -0.000078f, +0.000006f, -0.000027f, -0.000051f, + +0.000016f, -0.000017f, -0.000026f, -0.000039f, +0.000008f, +0.000031f, +0.000011f, -0.000017f, +0.000078f, +0.000053f, + +0.000002f, +0.000002f, -0.000031f, -0.000017f, +0.000090f, +0.000008f, +0.000039f, +0.000053f, -0.000013f, +0.000035f, + -0.000049f, -0.000038f, -0.000031f, +0.000001f, +0.000016f, -0.000023f + }, + { + +0.000262f, -0.005693f, +0.000844f, -0.000769f, -0.000101f, +0.000200f, +0.000106f, +0.000042f, -0.000320f, +0.000011f, + +0.000120f, +0.000352f, +0.000092f, -0.001651f, -0.003207f, +0.001362f, +0.000523f, +0.001262f, -0.002172f, +0.000498f, + +0.000751f, -0.001194f, -0.000491f, -0.000236f, +0.000097f, +0.000616f, +0.001519f, +0.000531f, +0.000085f, +0.000326f, + -0.000535f, +0.000339f, +0.000100f, -0.000010f, +0.000632f, -0.000299f, +0.000347f, +0.000488f, -0.000334f, +0.000061f, + +0.000097f, -0.000368f, +0.000264f, +0.000218f, +0.000138f, +0.000082f, -0.000037f, -0.000052f, -0.000260f, -0.000190f, + +0.000256f, -0.000040f, -0.000055f, +0.000159f, -0.000056f, -0.000075f, +0.000200f, -0.000054f, -0.000095f, +0.000023f, + +0.000051f, -0.000058f, -0.000026f, +0.000007f, -0.000110f, -0.000057f, +0.000020f, -0.000017f, -0.000131f, -0.000023f, + +0.000162f, +0.000099f, -0.000034f, -0.000090f, +0.000029f, +0.000031f, -0.000136f, -0.000085f, -0.000005f, -0.000004f, + +0.000020f, -0.000041f, -0.000032f, -0.000020f, +0.000002f, +0.000058f, +0.000016f, -0.000050f, -0.000055f, -0.000001f, + +0.000034f, -0.000035f, -0.000077f, -0.000012f, -0.000015f, -0.000050f + }, + { + -0.011604f, +0.023544f, +0.001028f, -0.002815f, -0.000735f, +0.000043f, +0.000142f, +0.000328f, -0.000109f, +0.000402f, + -0.000775f, -0.000132f, +0.000297f, -0.000255f, +0.000275f, +0.000305f, -0.000550f, +0.000111f, +0.000083f, +0.000077f, + +0.000070f, +0.000047f, +0.000004f, +0.000866f, +0.000543f, -0.000233f, -0.000192f, -0.000399f, +0.001480f, +0.000510f, + -0.000083f, +0.000091f, +0.000161f, -0.000022f, -0.000075f, +0.000433f, +0.001316f, +0.000013f, -0.000608f, -0.000020f, + +0.000206f, -0.000182f, -0.000189f, +0.000060f, +0.000396f, -0.000121f, -0.000201f, +0.000065f, +0.000172f, +0.000316f, + -0.000389f, -0.000379f, +0.000085f, +0.000112f, -0.000002f, -0.000201f, +0.000071f, +0.000076f, +0.000039f, -0.000035f, + -0.000016f, +0.000033f, -0.000063f, -0.000075f, -0.000005f, +0.000033f, -0.000083f, +0.000067f, -0.000033f, -0.000106f, + -0.000004f, +0.000198f, +0.000176f, -0.000029f, -0.000062f, +0.000025f, -0.000057f, -0.000025f, +0.000053f, -0.000027f, + -0.000052f, -0.000005f, -0.000031f, +0.000036f, +0.000066f, -0.000001f, +0.000001f, +0.000010f, +0.000046f, +0.000030f, + +0.000012f, +0.000041f, +0.000006f, +0.000036f, +0.000013f, -0.000008f + }, + { + +0.000250f, -0.001412f, +0.000479f, +0.000473f, +0.000098f, +0.000067f, -0.000019f, -0.000110f, -0.000166f, -0.000013f, + +0.000295f, +0.000336f, +0.000431f, +0.000982f, +0.001300f, -0.000836f, -0.000473f, +0.000026f, +0.000003f, +0.003887f, + -0.000161f, +0.000185f, -0.002263f, +0.000125f, +0.001489f, +0.000511f, -0.000022f, +0.000303f, +0.000915f, +0.000664f, + -0.000260f, -0.000056f, +0.000131f, -0.000518f, -0.000176f, +0.000192f, -0.000266f, -0.000004f, -0.000023f, +0.000362f, + -0.000141f, -0.000037f, +0.000154f, -0.000211f, -0.000123f, +0.000138f, +0.000100f, +0.000087f, +0.000009f, +0.000056f, + -0.000118f, -0.000126f, +0.000208f, +0.000001f, -0.000161f, -0.000073f, +0.000038f, +0.000194f, +0.000077f, +0.000036f, + +0.000111f, -0.000103f, +0.000005f, -0.000024f, -0.000027f, -0.000013f, +0.000055f, +0.000016f, +0.000066f, +0.000086f, + -0.000072f, -0.000055f, +0.000008f, +0.000026f, -0.000036f, -0.000058f, -0.000128f, -0.000129f, +0.000003f, +0.000046f, + -0.000019f, -0.000045f, +0.000062f, +0.000049f, -0.000011f, -0.000036f, +0.000053f, -0.000006f, -0.000021f, +0.000008f, + +0.000039f, +0.000041f, -0.000079f, -0.000048f, +0.000012f, +0.000023f + }, + { + -0.005647f, -0.060554f, -0.001078f, +0.002771f, -0.000788f, -0.000208f, -0.000366f, -0.000103f, +0.000390f, +0.000066f, + -0.000087f, +0.000051f, +0.000099f, -0.000317f, +0.000689f, -0.000298f, -0.000727f, -0.000281f, +0.000377f, +0.000517f, + +0.000374f, -0.000166f, -0.000324f, +0.000230f, +0.000263f, -0.000046f, -0.000323f, +0.000018f, +0.000256f, +0.000045f, + +0.000214f, -0.000196f, -0.000049f, -0.000150f, -0.000357f, -0.000215f, +0.000183f, +0.000738f, -0.000275f, -0.000447f, + -0.000128f, -0.000150f, +0.000183f, +0.000397f, -0.000291f, +0.000149f, +0.000325f, +0.000135f, -0.000193f, +0.000172f, + +0.000048f, +0.000030f, +0.000049f, -0.000121f, -0.000135f, -0.000159f, -0.000021f, -0.000025f, -0.000157f, -0.000143f, + -0.000047f, +0.000028f, +0.000011f, +0.000039f, +0.000035f, -0.000125f, -0.000121f, +0.000023f, +0.000105f, -0.000035f, + +0.000031f, +0.000152f, -0.000133f, -0.000153f, +0.000019f, +0.000088f, -0.000074f, +0.000004f, +0.000022f, -0.000087f, + +0.000040f, +0.000019f, -0.000083f, -0.000034f, +0.000143f, -0.000022f, -0.000092f, +0.000026f, +0.000059f, +0.000042f, + -0.000047f, +0.000001f, +0.000028f, +0.000012f, +0.000030f, -0.000019f + }, + { + +0.000185f, -0.001320f, -0.000880f, +0.000543f, -0.000078f, +0.000196f, -0.000077f, -0.000238f, -0.000156f, +0.000008f, + +0.000310f, +0.000469f, +0.000422f, +0.000124f, -0.001240f, -0.001440f, +0.000191f, -0.000027f, -0.000399f, +0.001458f, + +0.001325f, +0.000219f, +0.000877f, +0.001902f, +0.000703f, +0.002038f, -0.000039f, -0.000167f, -0.000078f, -0.000060f, + -0.000026f, +0.000726f, +0.000462f, +0.000074f, +0.000213f, +0.000185f, -0.000355f, +0.000080f, -0.000505f, -0.000172f, + +0.000217f, -0.000097f, +0.000339f, +0.000064f, +0.000042f, -0.000056f, -0.000268f, +0.000206f, +0.000563f, -0.000218f, + -0.000160f, +0.000068f, +0.000085f, -0.000272f, -0.000260f, +0.000017f, -0.000149f, -0.000061f, +0.000204f, -0.000124f, + -0.000158f, -0.000198f, -0.000129f, -0.000083f, +0.000003f, +0.000138f, -0.000063f, -0.000028f, +0.000010f, +0.000083f, + -0.000015f, +0.000012f, +0.000016f, -0.000027f, -0.000090f, +0.000065f, -0.000086f, -0.000079f, -0.000008f, -0.000058f, + +0.000009f, +0.000065f, +0.000015f, +0.000049f, -0.000021f, -0.000008f, -0.000057f, +0.000006f, +0.000041f, -0.000071f, + -0.000019f, +0.000016f, +0.000000f, +0.000022f, -0.000012f, +0.000008f + }, + { + -0.008367f, +0.065609f, +0.001349f, +0.002586f, -0.000258f, -0.000297f, -0.000192f, +0.000622f, +0.000022f, -0.001082f, + +0.000583f, +0.001087f, +0.000989f, -0.000080f, +0.001527f, +0.000142f, -0.001374f, +0.000242f, +0.000370f, +0.000450f, + -0.000412f, +0.000045f, +0.000434f, -0.000667f, +0.000348f, -0.000228f, -0.000136f, +0.000395f, -0.000341f, -0.000208f, + -0.000566f, -0.000143f, +0.000331f, +0.000062f, -0.000320f, +0.000494f, -0.000384f, -0.000025f, -0.000999f, +0.000131f, + +0.000487f, -0.000008f, +0.000139f, -0.000301f, +0.000271f, +0.000157f, -0.000491f, +0.000146f, +0.000212f, +0.000185f, + -0.000147f, +0.000159f, -0.000071f, -0.000050f, -0.000045f, +0.000158f, +0.000058f, -0.000128f, -0.000035f, +0.000099f, + +0.000073f, +0.000034f, -0.000021f, +0.000085f, +0.000309f, +0.000113f, -0.000102f, -0.000069f, +0.000027f, -0.000024f, + +0.000016f, +0.000076f, -0.000039f, -0.000095f, -0.000097f, +0.000132f, +0.000033f, -0.000077f, -0.000017f, +0.000029f, + +0.000047f, -0.000001f, +0.000065f, +0.000074f, +0.000045f, +0.000054f, -0.000045f, -0.000078f, -0.000016f, -0.000031f, + +0.000040f, +0.000026f, +0.000047f, -0.000019f, -0.000022f, +0.000027f + }, + { + +0.000024f, +0.001894f, +0.001080f, +0.000748f, +0.000742f, -0.001454f, -0.000215f, +0.000445f, -0.000235f, -0.000114f, + +0.000027f, +0.000521f, -0.000254f, -0.000102f, +0.000522f, -0.001180f, +0.000994f, +0.000114f, -0.002434f, -0.001012f, + +0.000918f, +0.000202f, -0.001216f, -0.000748f, +0.000706f, -0.000021f, +0.000165f, -0.000844f, +0.000614f, -0.000578f, + -0.000025f, +0.000483f, -0.000396f, +0.000202f, +0.000010f, -0.000148f, -0.000263f, -0.000447f, -0.000042f, -0.000114f, + -0.000240f, -0.000155f, -0.000170f, +0.000210f, -0.000083f, -0.000316f, -0.000042f, -0.000006f, +0.000157f, -0.000192f, + -0.000262f, -0.000072f, -0.000119f, +0.000019f, +0.000449f, +0.000146f, -0.000083f, -0.000131f, -0.000095f, -0.000134f, + +0.000050f, +0.000065f, +0.000159f, +0.000090f, +0.000048f, +0.000126f, -0.000062f, -0.000135f, -0.000189f, -0.000010f, + +0.000025f, +0.000026f, +0.000091f, +0.000009f, -0.000062f, +0.000057f, +0.000099f, +0.000008f, +0.000026f, +0.000085f, + +0.000020f, +0.000007f, -0.000039f, -0.000028f, -0.000044f, -0.000021f, +0.000046f, -0.000002f, +0.000016f, -0.000043f, + -0.000020f, -0.000012f, -0.000019f, -0.000007f, -0.000045f, -0.000019f + }, + { + -0.001974f, +0.015606f, +0.001130f, -0.001510f, -0.000279f, -0.000662f, -0.000883f, +0.001020f, -0.000064f, -0.000378f, + +0.000086f, +0.000196f, -0.000438f, -0.000525f, +0.001264f, +0.000650f, -0.000695f, +0.000025f, +0.000187f, +0.000281f, + +0.000287f, -0.000250f, -0.000110f, +0.000042f, -0.000290f, +0.000272f, +0.000212f, +0.000014f, +0.000043f, -0.000292f, + -0.000241f, +0.000257f, +0.000278f, +0.000397f, -0.000350f, +0.000204f, +0.000092f, -0.000502f, +0.000299f, -0.000425f, + -0.000680f, +0.000112f, +0.000149f, +0.000178f, +0.000099f, -0.000096f, +0.000051f, -0.000336f, +0.000127f, +0.000130f, + -0.000172f, -0.000080f, -0.000046f, +0.000026f, +0.000216f, +0.000123f, +0.000142f, -0.000178f, -0.000052f, +0.000095f, + +0.000024f, -0.000025f, +0.000036f, +0.000105f, -0.000029f, -0.000018f, +0.000025f, +0.000025f, -0.000040f, +0.000014f, + +0.000006f, -0.000004f, -0.000055f, -0.000136f, -0.000039f, -0.000020f, -0.000059f, +0.000109f, -0.000004f, -0.000010f, + +0.000026f, -0.000062f, +0.000075f, -0.000041f, -0.000028f, -0.000063f, -0.000045f, -0.000022f, +0.000001f, +0.000041f, + -0.000019f, +0.000001f, +0.000039f, +0.000031f, -0.000029f, -0.000023f + }, + { + -0.000299f, +0.002241f, +0.000335f, +0.000212f, -0.000209f, +0.000033f, +0.000347f, -0.000092f, -0.000229f, -0.000159f, + -0.000358f, +0.000188f, -0.000533f, +0.000840f, +0.004864f, +0.001421f, -0.000491f, -0.001095f, -0.000692f, +0.000220f, + +0.000622f, +0.000759f, -0.001402f, -0.000518f, -0.001073f, +0.000952f, +0.000060f, -0.000288f, +0.000346f, -0.001128f, + -0.000126f, +0.000364f, +0.000535f, +0.000214f, -0.000020f, +0.000244f, +0.000039f, -0.000651f, -0.000116f, -0.000197f, + +0.000227f, +0.000272f, -0.000200f, -0.000205f, -0.000010f, +0.000095f, +0.000251f, -0.000121f, +0.000079f, -0.000259f, + -0.000080f, +0.000136f, -0.000142f, -0.000096f, -0.000047f, +0.000014f, +0.000178f, +0.000371f, +0.000175f, +0.000066f, + -0.000149f, -0.000156f, +0.000033f, +0.000183f, +0.000175f, -0.000147f, +0.000027f, +0.000013f, -0.000021f, -0.000014f, + -0.000047f, +0.000015f, -0.000036f, -0.000044f, -0.000039f, -0.000091f, -0.000113f, +0.000040f, +0.000017f, +0.000053f, + +0.000002f, -0.000050f, +0.000084f, +0.000055f, +0.000014f, +0.000058f, +0.000055f, +0.000022f, -0.000001f, -0.000008f, + -0.000011f, -0.000046f, -0.000039f, +0.000043f, +0.000018f, -0.000029f + }, + { + +0.003935f, +0.004871f, +0.001348f, -0.000581f, -0.000414f, -0.000280f, -0.001906f, +0.000135f, +0.000550f, -0.000116f, + -0.000815f, +0.000150f, +0.000010f, +0.003006f, -0.000288f, +0.000634f, +0.000184f, -0.000276f, +0.000349f, -0.000806f, + +0.000172f, +0.000311f, -0.000314f, -0.000468f, +0.000194f, -0.000286f, -0.000400f, -0.000841f, -0.000760f, -0.000309f, + -0.000232f, +0.000003f, +0.000036f, -0.000155f, -0.000367f, -0.000264f, -0.000053f, +0.000139f, -0.000168f, -0.000344f, + +0.000168f, +0.000285f, -0.000109f, +0.000228f, +0.000114f, +0.000244f, -0.000280f, +0.000401f, +0.000256f, -0.000083f, + -0.000185f, -0.000234f, -0.000173f, -0.000321f, -0.000104f, -0.000111f, +0.000071f, +0.000048f, +0.000216f, -0.000074f, + -0.000032f, +0.000090f, -0.000026f, -0.000016f, -0.000079f, +0.000064f, +0.000133f, +0.000128f, -0.000020f, -0.000121f, + +0.000120f, +0.000050f, -0.000121f, -0.000084f, +0.000026f, -0.000013f, +0.000087f, -0.000047f, -0.000046f, -0.000059f, + +0.000037f, +0.000097f, +0.000007f, -0.000037f, -0.000078f, +0.000038f, +0.000148f, +0.000031f, +0.000014f, +0.000067f, + +0.000016f, +0.000010f, -0.000071f, -0.000036f, -0.000026f, -0.000061f + }, + { + +0.000060f, +0.002822f, +0.000958f, -0.000047f, -0.000116f, -0.000120f, +0.000210f, -0.000215f, -0.000126f, +0.000247f, + -0.000261f, +0.000037f, +0.000841f, +0.004131f, -0.001651f, +0.003653f, +0.000398f, -0.000119f, +0.000428f, -0.000128f, + -0.000671f, -0.000055f, -0.000473f, +0.000201f, +0.000253f, -0.000317f, -0.000002f, -0.000012f, -0.000618f, -0.000047f, + +0.000132f, +0.000472f, +0.000045f, -0.000078f, +0.000453f, +0.000214f, -0.000157f, -0.000175f, -0.000179f, +0.000176f, + +0.000035f, -0.000479f, -0.000093f, +0.000226f, -0.000181f, +0.000212f, -0.000017f, -0.000089f, -0.000176f, +0.000072f, + -0.000214f, -0.000193f, +0.000172f, +0.000196f, +0.000007f, +0.000051f, +0.000072f, -0.000002f, -0.000045f, +0.000047f, + -0.000272f, -0.000183f, +0.000072f, -0.000028f, -0.000125f, +0.000103f, +0.000079f, -0.000117f, -0.000068f, -0.000038f, + -0.000028f, +0.000111f, -0.000025f, -0.000022f, +0.000023f, -0.000090f, +0.000100f, +0.000040f, +0.000018f, -0.000008f, + -0.000140f, -0.000029f, +0.000061f, +0.000012f, +0.000065f, +0.000079f, +0.000062f, -0.000065f, +0.000001f, +0.000042f, + -0.000092f, -0.000049f, +0.000034f, +0.000017f, -0.000053f, +0.000026f + }, + { + -0.001303f, -0.005272f, +0.000080f, -0.000253f, +0.000005f, -0.003269f, +0.000123f, +0.000345f, +0.000289f, +0.000216f, + -0.000130f, +0.000110f, -0.000236f, +0.000814f, +0.004882f, -0.000852f, -0.000046f, +0.000252f, +0.000683f, -0.000054f, + +0.000617f, -0.000073f, -0.000043f, -0.000735f, +0.000271f, +0.001164f, +0.000058f, -0.001328f, -0.000030f, +0.000137f, + +0.000069f, +0.000143f, -0.000225f, +0.000252f, +0.000230f, +0.000537f, -0.000031f, -0.000294f, -0.000267f, -0.000191f, + -0.000292f, -0.000110f, +0.000121f, +0.000226f, -0.000228f, +0.000048f, +0.000467f, -0.000067f, -0.000106f, -0.000148f, + -0.000102f, -0.000229f, -0.000243f, +0.000010f, -0.000031f, -0.000001f, +0.000288f, -0.000032f, -0.000006f, +0.000040f, + -0.000066f, +0.000160f, +0.000065f, +0.000141f, -0.000034f, -0.000009f, +0.000051f, -0.000042f, +0.000015f, -0.000016f, + +0.000026f, +0.000076f, -0.000028f, -0.000125f, -0.000092f, +0.000060f, +0.000059f, -0.000006f, -0.000001f, +0.000018f, + +0.000030f, -0.000060f, -0.000010f, +0.000045f, -0.000009f, -0.000058f, -0.000009f, -0.000089f, -0.000031f, +0.000065f, + -0.000015f, +0.000023f, +0.000025f, -0.000024f, -0.000020f, -0.000020f + } + }, + { + { + -0.000510f, -0.009470f, +0.000918f, -0.000441f, -0.000285f, +0.000012f, -0.000297f, +0.000367f, +0.000131f, +0.000365f, + +0.000169f, -0.000236f, +0.000597f, -0.000829f, +0.000797f, +0.000541f, -0.000784f, -0.000661f, -0.001711f, +0.000469f, + +0.001209f, +0.000261f, +0.001071f, -0.000031f, +0.000772f, -0.000635f, +0.000273f, +0.000105f, +0.000759f, +0.000502f, + -0.000745f, -0.000222f, +0.000785f, -0.000072f, -0.000257f, -0.000053f, +0.000150f, +0.000234f, -0.000705f, +0.000001f, + -0.000128f, +0.000124f, -0.000089f, -0.000070f, -0.000013f, -0.000098f, -0.000447f, -0.000210f, +0.000027f, -0.000234f, + +0.000116f, +0.000063f, -0.000020f, +0.000083f, +0.000327f, -0.000094f, -0.000074f, -0.000025f, -0.000218f, -0.000027f, + +0.000087f, +0.000099f, +0.000181f, -0.000021f, -0.000092f, +0.000159f, -0.000003f, -0.000066f, +0.000024f, +0.000150f, + -0.000026f, -0.000002f, -0.000025f, -0.000077f, +0.000001f, +0.000010f, -0.000029f, -0.000051f, +0.000047f, +0.000034f, + -0.000031f, -0.000007f, +0.000070f, +0.000113f, +0.000050f, -0.000005f, -0.000037f, +0.000018f, +0.000024f, -0.000056f, + -0.000063f, +0.000039f, -0.000006f, +0.000006f, -0.000034f, -0.000046f + }, + { + +0.005441f, -0.011229f, -0.006782f, -0.000063f, -0.000403f, -0.000184f, +0.000084f, -0.000647f, -0.001105f, +0.000486f, + -0.000120f, +0.000063f, +0.000064f, -0.000106f, +0.000664f, -0.000260f, -0.000638f, -0.000478f, +0.000751f, -0.000457f, + +0.000136f, -0.000392f, -0.000248f, -0.000204f, +0.000006f, +0.000358f, -0.000267f, -0.000072f, +0.000712f, +0.000096f, + -0.000043f, -0.000125f, -0.000194f, -0.000492f, -0.000106f, +0.000007f, +0.000253f, +0.000171f, -0.000214f, -0.000403f, + -0.000044f, +0.000262f, +0.000231f, -0.000054f, +0.000304f, +0.000135f, -0.000213f, +0.000010f, -0.000230f, +0.000126f, + +0.000040f, +0.000070f, +0.000160f, +0.000249f, +0.000053f, +0.000036f, -0.000134f, +0.000130f, -0.000067f, +0.000040f, + +0.000168f, +0.000111f, +0.000013f, +0.000032f, +0.000010f, -0.000230f, -0.000046f, +0.000113f, +0.000080f, +0.000131f, + -0.000045f, -0.000082f, -0.000054f, +0.000015f, -0.000016f, -0.000116f, +0.000042f, -0.000064f, -0.000082f, -0.000014f, + +0.000077f, +0.000013f, -0.000054f, +0.000030f, +0.000094f, -0.000054f, -0.000070f, +0.000065f, -0.000034f, +0.000017f, + -0.000011f, -0.000011f, +0.000028f, +0.000031f, -0.000006f, -0.000010f + }, + { + -0.000510f, +0.017772f, +0.006170f, +0.003004f, +0.001758f, -0.000172f, +0.000115f, +0.000517f, +0.000243f, -0.000461f, + -0.000587f, -0.000243f, -0.000497f, +0.000884f, -0.001425f, -0.000442f, -0.000449f, +0.000228f, +0.001093f, -0.000097f, + +0.000188f, +0.000289f, +0.000341f, +0.000198f, -0.000294f, +0.000035f, -0.000035f, -0.000164f, -0.000046f, +0.000031f, + +0.000256f, -0.000183f, +0.000498f, +0.000204f, -0.000487f, -0.000429f, -0.000188f, +0.000252f, +0.000337f, +0.000059f, + +0.000049f, +0.000085f, -0.000073f, +0.000267f, +0.000170f, -0.000123f, -0.000463f, -0.000173f, +0.000365f, +0.000178f, + -0.000197f, -0.000256f, -0.000031f, +0.000145f, -0.000031f, -0.000023f, +0.000192f, +0.000285f, -0.000010f, -0.000139f, + -0.000057f, +0.000180f, +0.000104f, -0.000072f, +0.000060f, +0.000112f, -0.000007f, +0.000074f, -0.000016f, +0.000100f, + +0.000070f, -0.000024f, +0.000023f, +0.000069f, +0.000072f, -0.000055f, +0.000030f, -0.000032f, -0.000033f, -0.000054f, + +0.000021f, -0.000006f, +0.000067f, +0.000047f, -0.000058f, -0.000005f, +0.000010f, -0.000033f, -0.000007f, -0.000041f, + -0.000016f, +0.000036f, +0.000006f, +0.000043f, -0.000014f, +0.000003f + }, + { + +0.000011f, -0.005947f, -0.000096f, +0.000191f, +0.000176f, -0.000185f, +0.000011f, -0.000026f, +0.000033f, +0.000142f, + +0.000047f, -0.000335f, -0.000190f, +0.000768f, -0.002939f, -0.001659f, +0.000895f, +0.000181f, -0.003150f, +0.000733f, + -0.000249f, -0.002108f, -0.000346f, +0.001113f, -0.000484f, +0.001418f, +0.000474f, +0.001659f, -0.000537f, -0.000595f, + -0.000344f, +0.000884f, +0.000368f, +0.000154f, -0.000034f, +0.000194f, +0.000658f, -0.000063f, +0.000238f, +0.000214f, + +0.000034f, -0.000087f, +0.000185f, +0.000032f, -0.000086f, +0.000068f, +0.000399f, -0.000178f, -0.000050f, +0.000176f, + -0.000001f, -0.000157f, +0.000307f, +0.000133f, +0.000145f, +0.000104f, -0.000187f, -0.000092f, +0.000132f, -0.000167f, + -0.000147f, +0.000050f, -0.000012f, -0.000026f, +0.000082f, +0.000021f, -0.000002f, -0.000030f, +0.000128f, +0.000029f, + -0.000102f, -0.000172f, +0.000004f, +0.000018f, +0.000002f, -0.000071f, +0.000025f, +0.000116f, +0.000079f, -0.000004f, + -0.000047f, +0.000015f, +0.000024f, +0.000001f, +0.000019f, -0.000068f, -0.000021f, +0.000029f, +0.000033f, +0.000024f, + -0.000019f, +0.000019f, +0.000064f, +0.000021f, -0.000009f, +0.000035f + }, + { + +0.012865f, -0.007933f, -0.002449f, -0.003101f, +0.000532f, +0.000358f, -0.000033f, +0.000037f, -0.000208f, -0.000103f, + +0.000160f, +0.000484f, -0.000128f, +0.000539f, -0.001057f, -0.000238f, +0.000517f, -0.000735f, -0.000519f, -0.000014f, + -0.000113f, +0.000261f, +0.000255f, -0.000184f, -0.000286f, +0.000210f, -0.000187f, +0.001552f, +0.000091f, -0.000207f, + +0.000101f, -0.000027f, -0.000249f, +0.000419f, -0.000229f, +0.000042f, -0.000007f, -0.000923f, +0.000030f, -0.000152f, + -0.000415f, -0.000149f, +0.000159f, +0.000129f, +0.000056f, +0.000028f, +0.000138f, +0.000203f, +0.000078f, +0.000161f, + -0.000306f, +0.000209f, +0.000227f, -0.000129f, -0.000115f, -0.000055f, -0.000096f, -0.000327f, -0.000161f, -0.000050f, + +0.000136f, -0.000200f, +0.000063f, +0.000026f, -0.000049f, +0.000010f, -0.000016f, -0.000155f, -0.000019f, +0.000049f, + -0.000010f, -0.000055f, -0.000127f, -0.000067f, +0.000103f, +0.000016f, +0.000057f, +0.000095f, -0.000053f, +0.000038f, + +0.000067f, -0.000008f, +0.000046f, +0.000028f, -0.000094f, -0.000009f, +0.000016f, +0.000010f, -0.000024f, -0.000021f, + +0.000007f, -0.000028f, -0.000020f, -0.000034f, -0.000033f, +0.000026f + }, + { + -0.000510f, +0.001064f, +0.002271f, -0.000544f, -0.000038f, -0.000121f, +0.000053f, +0.000120f, +0.000180f, +0.000180f, + -0.000112f, -0.000174f, +0.000071f, -0.000926f, -0.002416f, -0.000463f, +0.002966f, -0.001567f, -0.000311f, +0.005465f, + +0.000095f, -0.000949f, -0.001014f, -0.001028f, +0.000420f, -0.000303f, +0.000076f, +0.000098f, +0.001038f, +0.000957f, + +0.000258f, -0.000359f, +0.000070f, +0.000500f, +0.000193f, +0.000424f, -0.000110f, +0.000358f, +0.000191f, +0.000012f, + +0.000311f, +0.000050f, -0.000219f, +0.000085f, +0.000137f, +0.000134f, -0.000095f, -0.000235f, -0.000155f, +0.000135f, + -0.000028f, +0.000149f, -0.000121f, -0.000100f, +0.000143f, +0.000091f, +0.000075f, -0.000041f, +0.000038f, +0.000082f, + -0.000003f, -0.000095f, +0.000046f, -0.000009f, +0.000028f, +0.000095f, -0.000085f, -0.000049f, -0.000015f, -0.000046f, + -0.000027f, +0.000150f, +0.000071f, -0.000021f, +0.000016f, +0.000059f, +0.000077f, +0.000080f, +0.000048f, -0.000025f, + -0.000044f, +0.000077f, -0.000017f, -0.000064f, -0.000019f, +0.000024f, +0.000017f, -0.000016f, +0.000029f, +0.000022f, + -0.000036f, -0.000078f, +0.000021f, +0.000062f, +0.000019f, -0.000008f + }, + { + -0.002646f, -0.067888f, -0.000235f, +0.001657f, -0.000188f, +0.000131f, -0.000139f, +0.000398f, +0.000684f, -0.000806f, + +0.000261f, +0.000158f, -0.000037f, +0.000491f, -0.000066f, +0.000266f, -0.000354f, +0.000568f, -0.000190f, -0.000735f, + -0.000232f, -0.000356f, +0.000067f, -0.000206f, -0.000002f, -0.000548f, -0.000219f, +0.000454f, -0.000318f, -0.000223f, + +0.000132f, +0.000298f, +0.000161f, +0.000129f, -0.000191f, -0.000144f, +0.000140f, +0.000157f, -0.000023f, -0.000038f, + +0.000151f, -0.000148f, -0.000231f, -0.000036f, -0.000009f, +0.000059f, -0.000112f, -0.000238f, +0.000012f, -0.000084f, + -0.000201f, -0.000042f, -0.000175f, -0.000050f, -0.000153f, +0.000116f, +0.000156f, +0.000020f, +0.000203f, +0.000031f, + +0.000162f, -0.000034f, +0.000020f, -0.000043f, -0.000051f, +0.000058f, +0.000195f, +0.000029f, -0.000099f, +0.000059f, + -0.000012f, -0.000139f, +0.000032f, +0.000147f, -0.000027f, -0.000029f, +0.000021f, +0.000042f, -0.000065f, +0.000072f, + +0.000049f, -0.000063f, +0.000034f, +0.000071f, -0.000061f, -0.000050f, +0.000092f, +0.000025f, -0.000000f, -0.000027f, + +0.000011f, +0.000048f, -0.000037f, -0.000017f, -0.000023f, -0.000007f + }, + { + -0.000565f, +0.000889f, +0.001817f, -0.000020f, +0.000219f, -0.000240f, -0.000076f, -0.000175f, -0.000093f, +0.000233f, + -0.000066f, -0.000396f, +0.000140f, +0.000454f, -0.002129f, +0.000725f, -0.002474f, -0.001790f, +0.000356f, +0.001320f, + -0.001148f, -0.000281f, +0.000372f, +0.000980f, +0.000281f, +0.000770f, +0.000892f, -0.000238f, -0.000347f, -0.000536f, + -0.000195f, -0.000023f, +0.000259f, +0.000177f, -0.000111f, -0.000115f, -0.000090f, +0.000184f, -0.000279f, +0.000112f, + -0.000080f, +0.000123f, +0.000168f, -0.000125f, -0.000100f, +0.000081f, +0.000339f, +0.000212f, -0.000226f, -0.000019f, + +0.000213f, +0.000046f, -0.000068f, +0.000046f, +0.000158f, +0.000049f, +0.000065f, +0.000164f, -0.000119f, -0.000198f, + -0.000045f, +0.000022f, +0.000071f, -0.000108f, -0.000055f, -0.000153f, -0.000021f, +0.000129f, +0.000099f, -0.000025f, + +0.000043f, -0.000040f, -0.000051f, -0.000009f, +0.000070f, +0.000017f, -0.000012f, +0.000115f, +0.000051f, +0.000027f, + +0.000014f, -0.000124f, -0.000042f, -0.000024f, +0.000020f, +0.000026f, +0.000011f, +0.000059f, -0.000047f, +0.000030f, + +0.000034f, -0.000042f, +0.000024f, -0.000005f, -0.000005f, -0.000010f + }, + { + +0.015244f, +0.036921f, -0.005314f, +0.002303f, +0.000499f, +0.000271f, +0.000237f, -0.000147f, -0.000652f, +0.000764f, + +0.000130f, -0.000681f, -0.000865f, +0.000336f, +0.000796f, +0.000794f, +0.000163f, -0.000006f, +0.000173f, +0.000276f, + +0.000406f, -0.000196f, -0.000472f, +0.000578f, -0.000096f, -0.000178f, +0.000637f, -0.000079f, +0.000190f, -0.000296f, + -0.000060f, -0.000093f, +0.000233f, -0.000411f, +0.000136f, +0.000318f, -0.000917f, -0.000397f, +0.000233f, +0.000142f, + +0.000609f, +0.000167f, +0.000377f, +0.000074f, +0.000381f, +0.000001f, +0.000243f, +0.000159f, -0.000423f, +0.000019f, + +0.000290f, +0.000124f, -0.000135f, +0.000198f, -0.000032f, -0.000098f, -0.000084f, +0.000118f, +0.000061f, -0.000200f, + +0.000017f, +0.000092f, +0.000049f, +0.000027f, -0.000078f, -0.000180f, +0.000059f, +0.000037f, -0.000059f, +0.000035f, + +0.000041f, -0.000102f, +0.000012f, +0.000046f, +0.000075f, -0.000032f, -0.000064f, +0.000021f, +0.000019f, -0.000005f, + +0.000001f, -0.000015f, -0.000042f, -0.000023f, -0.000066f, -0.000053f, -0.000017f, +0.000038f, +0.000075f, +0.000048f, + -0.000010f, -0.000010f, -0.000027f, +0.000005f, +0.000053f, -0.000004f + }, + { + -0.000021f, +0.005476f, -0.001241f, +0.001035f, -0.000607f, +0.000787f, +0.001186f, -0.000556f, +0.000231f, +0.000333f, + +0.000187f, -0.000871f, -0.001081f, +0.000747f, +0.000605f, +0.000365f, -0.000904f, -0.000953f, +0.000602f, +0.000406f, + -0.000447f, -0.000970f, -0.000230f, +0.000741f, +0.000846f, +0.000530f, -0.000069f, +0.000131f, -0.000469f, -0.000247f, + +0.000031f, -0.000025f, +0.000236f, +0.000594f, -0.000014f, -0.000036f, +0.000346f, +0.000343f, +0.000384f, +0.000037f, + +0.000015f, +0.000066f, +0.000141f, -0.000218f, -0.000058f, +0.000323f, -0.000189f, -0.000038f, -0.000099f, -0.000149f, + +0.000374f, +0.000098f, -0.000026f, +0.000219f, -0.000162f, -0.000273f, -0.000042f, -0.000045f, +0.000068f, +0.000111f, + -0.000000f, -0.000023f, -0.000070f, -0.000142f, -0.000070f, -0.000165f, +0.000053f, +0.000159f, +0.000200f, +0.000126f, + -0.000043f, +0.000036f, -0.000044f, -0.000062f, +0.000057f, -0.000020f, -0.000039f, -0.000034f, -0.000019f, -0.000065f, + -0.000065f, -0.000015f, +0.000023f, +0.000031f, +0.000031f, +0.000068f, -0.000008f, -0.000022f, -0.000015f, -0.000002f, + +0.000037f, -0.000005f, +0.000024f, -0.000003f, +0.000056f, +0.000043f + }, + { + +0.002119f, +0.007949f, -0.001306f, -0.001389f, -0.000100f, +0.002490f, +0.002238f, -0.000689f, -0.001069f, -0.000382f, + +0.000129f, -0.000023f, +0.000168f, +0.000548f, +0.000896f, +0.000112f, +0.000375f, +0.000182f, +0.000608f, +0.000197f, + +0.000362f, -0.000249f, +0.000261f, +0.000137f, +0.000294f, +0.000186f, +0.000088f, -0.000076f, -0.000373f, +0.000422f, + +0.000739f, +0.000158f, +0.000102f, +0.000088f, +0.000278f, -0.000497f, -0.000272f, +0.000185f, -0.000201f, -0.000017f, + +0.000367f, +0.000324f, -0.000217f, -0.000077f, -0.000263f, -0.000120f, +0.000063f, +0.000233f, +0.000199f, -0.000108f, + -0.000003f, +0.000063f, +0.000244f, -0.000025f, -0.000205f, -0.000116f, -0.000081f, +0.000098f, +0.000233f, -0.000109f, + +0.000023f, +0.000009f, -0.000039f, -0.000078f, +0.000029f, +0.000023f, -0.000087f, -0.000033f, -0.000065f, +0.000014f, + -0.000035f, -0.000043f, +0.000007f, +0.000114f, +0.000081f, +0.000054f, +0.000085f, -0.000041f, -0.000060f, -0.000022f, + -0.000058f, +0.000055f, -0.000023f, -0.000025f, +0.000039f, +0.000014f, +0.000081f, +0.000023f, +0.000015f, -0.000035f, + +0.000003f, +0.000037f, -0.000015f, -0.000062f, +0.000008f, +0.000051f + }, + { + +0.000264f, +0.001628f, +0.000349f, +0.000013f, +0.000200f, +0.000253f, -0.000486f, -0.000273f, -0.000002f, -0.000272f, + -0.000012f, -0.000642f, +0.001108f, -0.000920f, +0.006823f, -0.001280f, -0.000157f, +0.000662f, +0.000896f, -0.000262f, + -0.002307f, +0.000690f, +0.000824f, +0.000789f, +0.000257f, -0.000812f, -0.000021f, -0.000605f, -0.000720f, +0.000059f, + +0.000062f, -0.000649f, -0.000171f, -0.000059f, +0.000249f, +0.000117f, +0.000023f, +0.000192f, +0.000289f, -0.000083f, + +0.000099f, -0.000259f, -0.000001f, +0.000370f, +0.000178f, +0.000088f, -0.000153f, -0.000025f, +0.000194f, +0.000027f, + +0.000202f, -0.000133f, -0.000057f, +0.000115f, +0.000010f, +0.000059f, -0.000117f, -0.000280f, -0.000255f, -0.000072f, + -0.000178f, +0.000092f, +0.000001f, -0.000078f, -0.000180f, +0.000078f, +0.000027f, -0.000085f, +0.000047f, -0.000030f, + +0.000090f, +0.000031f, +0.000019f, +0.000066f, +0.000025f, +0.000092f, +0.000093f, +0.000002f, -0.000016f, -0.000025f, + -0.000026f, +0.000016f, -0.000083f, -0.000055f, -0.000032f, -0.000025f, -0.000074f, -0.000052f, -0.000011f, +0.000002f, + +0.000006f, +0.000024f, +0.000025f, -0.000017f, -0.000004f, +0.000035f + }, + { + -0.003685f, +0.012899f, +0.001319f, +0.001701f, -0.000147f, +0.000212f, +0.001531f, -0.000584f, -0.000247f, -0.000526f, + +0.000832f, -0.000093f, +0.000258f, +0.001919f, +0.000327f, -0.000805f, -0.000364f, +0.000513f, +0.000210f, +0.000173f, + +0.001039f, -0.000151f, +0.000043f, -0.000852f, +0.000032f, +0.000066f, +0.000033f, -0.000162f, +0.000073f, -0.000304f, + -0.000125f, +0.000255f, -0.000202f, -0.000457f, -0.000413f, +0.000400f, +0.000185f, -0.000306f, +0.000001f, +0.000050f, + -0.000195f, -0.000470f, -0.000265f, -0.000227f, -0.000548f, -0.000484f, -0.000178f, -0.000146f, -0.000349f, +0.000203f, + -0.000268f, +0.000234f, +0.000003f, +0.000061f, +0.000327f, +0.000207f, +0.000046f, +0.000055f, -0.000256f, -0.000060f, + +0.000195f, -0.000012f, -0.000037f, +0.000043f, +0.000059f, -0.000069f, -0.000046f, -0.000059f, +0.000010f, +0.000137f, + -0.000036f, -0.000147f, -0.000013f, +0.000080f, +0.000009f, +0.000027f, -0.000048f, +0.000019f, +0.000032f, +0.000065f, + +0.000065f, -0.000093f, -0.000064f, +0.000022f, +0.000114f, +0.000031f, -0.000116f, -0.000074f, -0.000031f, -0.000041f, + -0.000007f, -0.000019f, +0.000040f, +0.000059f, +0.000025f, +0.000087f + }, + { + +0.000118f, +0.003612f, -0.001266f, -0.000085f, +0.000318f, +0.000170f, +0.000286f, +0.000063f, +0.000471f, -0.000186f, + -0.000091f, -0.000371f, -0.000448f, +0.004953f, +0.009447f, +0.001516f, +0.001044f, +0.000422f, -0.000271f, +0.000005f, + +0.000199f, +0.000189f, +0.000767f, +0.000973f, -0.000383f, -0.000165f, +0.000929f, -0.000183f, +0.000294f, -0.000433f, + -0.000351f, -0.000496f, -0.000329f, -0.000264f, -0.000034f, -0.000233f, -0.000477f, -0.000507f, -0.000030f, +0.000037f, + -0.000271f, +0.000286f, +0.000125f, -0.000012f, -0.000014f, -0.000118f, +0.000062f, +0.000199f, +0.000091f, -0.000017f, + -0.000090f, +0.000247f, +0.000105f, -0.000127f, -0.000074f, -0.000008f, -0.000123f, +0.000027f, -0.000001f, -0.000095f, + +0.000168f, +0.000160f, -0.000088f, -0.000135f, +0.000093f, +0.000031f, -0.000128f, +0.000137f, +0.000050f, +0.000034f, + -0.000077f, -0.000123f, -0.000003f, +0.000061f, -0.000019f, +0.000033f, -0.000028f, -0.000128f, +0.000048f, -0.000020f, + +0.000070f, +0.000105f, -0.000060f, -0.000020f, -0.000024f, -0.000093f, -0.000056f, +0.000040f, +0.000035f, -0.000045f, + +0.000042f, +0.000099f, +0.000006f, -0.000038f, +0.000057f, +0.000014f + }, + { + +0.000335f, -0.010967f, +0.001080f, +0.000018f, +0.000236f, -0.000154f, +0.000617f, -0.000179f, +0.000222f, -0.000007f, + +0.001104f, +0.001178f, -0.000238f, +0.000943f, +0.004132f, +0.001499f, +0.000241f, +0.000718f, +0.000716f, -0.000043f, + -0.000425f, -0.000363f, -0.000160f, +0.000288f, +0.000330f, +0.000072f, -0.000359f, -0.000926f, +0.000680f, -0.000013f, + -0.000044f, +0.000275f, +0.000077f, -0.000294f, +0.000087f, -0.000352f, -0.000153f, -0.000310f, +0.000272f, -0.000049f, + -0.000031f, +0.000072f, +0.000239f, -0.000292f, -0.000192f, -0.000078f, -0.000247f, +0.000097f, +0.000153f, +0.000126f, + -0.000193f, -0.000011f, +0.000244f, +0.000172f, +0.000026f, +0.000041f, -0.000063f, -0.000126f, +0.000006f, +0.000002f, + +0.000023f, -0.000039f, -0.000093f, -0.000030f, -0.000127f, -0.000095f, -0.000056f, +0.000007f, -0.000068f, +0.000007f, + +0.000003f, -0.000158f, -0.000095f, +0.000144f, +0.000120f, +0.000012f, -0.000091f, -0.000030f, +0.000042f, -0.000053f, + -0.000097f, +0.000049f, +0.000072f, +0.000003f, +0.000001f, +0.000025f, -0.000020f, +0.000052f, +0.000055f, -0.000054f, + -0.000007f, -0.000038f, -0.000025f, -0.000011f, +0.000001f, +0.000050f + } + }, + { + { + +0.000225f, -0.007398f, +0.001796f, -0.000312f, +0.000283f, +0.000047f, -0.000158f, +0.000426f, +0.000001f, +0.000305f, + -0.000546f, +0.000128f, +0.000548f, -0.001737f, +0.001359f, +0.001480f, -0.000543f, +0.000145f, -0.001382f, +0.000430f, + +0.000550f, +0.000255f, +0.000815f, -0.000758f, +0.000205f, -0.000949f, -0.000453f, -0.000510f, +0.001063f, +0.001017f, + -0.000170f, +0.000188f, +0.000512f, -0.000609f, -0.000214f, +0.000471f, +0.000118f, -0.000405f, -0.000859f, +0.000013f, + -0.000218f, -0.000069f, -0.000209f, +0.000041f, +0.000032f, -0.000007f, -0.000356f, -0.000182f, +0.000069f, -0.000110f, + +0.000320f, +0.000078f, -0.000060f, +0.000182f, +0.000189f, -0.000206f, -0.000023f, -0.000113f, -0.000105f, +0.000059f, + +0.000153f, +0.000205f, +0.000117f, -0.000063f, -0.000056f, +0.000162f, -0.000069f, -0.000017f, +0.000089f, +0.000044f, + -0.000062f, +0.000009f, -0.000030f, -0.000064f, +0.000036f, +0.000005f, -0.000039f, -0.000024f, +0.000048f, -0.000008f, + -0.000018f, +0.000033f, +0.000092f, +0.000089f, +0.000016f, -0.000049f, -0.000041f, +0.000009f, +0.000002f, -0.000065f, + +0.000009f, +0.000025f, +0.000015f, +0.000000f, -0.000054f, -0.000035f + }, + { + -0.005217f, -0.013473f, +0.006871f, -0.001004f, -0.001062f, +0.000352f, -0.000323f, -0.001210f, -0.000791f, +0.000436f, + -0.000276f, +0.000259f, -0.000101f, -0.000220f, +0.000781f, -0.001310f, -0.000734f, +0.000247f, +0.001532f, +0.000252f, + +0.000398f, -0.000001f, -0.000188f, -0.000213f, -0.000225f, -0.000096f, -0.000469f, -0.000012f, +0.000643f, +0.000049f, + -0.000221f, -0.000539f, -0.000569f, -0.000485f, +0.000136f, +0.000250f, -0.000333f, -0.000515f, -0.000596f, -0.000367f, + +0.000068f, +0.000322f, +0.000202f, -0.000139f, +0.000315f, -0.000081f, -0.000171f, -0.000117f, -0.000099f, +0.000181f, + -0.000040f, +0.000240f, +0.000212f, +0.000194f, +0.000060f, +0.000028f, -0.000037f, +0.000212f, -0.000030f, -0.000018f, + +0.000098f, -0.000003f, -0.000015f, -0.000030f, -0.000119f, -0.000155f, +0.000011f, +0.000157f, +0.000072f, +0.000033f, + -0.000054f, -0.000106f, -0.000020f, +0.000020f, -0.000117f, -0.000055f, +0.000053f, -0.000067f, -0.000050f, +0.000004f, + +0.000064f, +0.000003f, -0.000030f, +0.000032f, +0.000054f, -0.000119f, +0.000006f, +0.000038f, -0.000034f, +0.000006f, + -0.000017f, -0.000005f, +0.000026f, +0.000002f, +0.000008f, -0.000017f + }, + { + +0.001333f, -0.001695f, -0.008771f, +0.002746f, +0.001204f, -0.000358f, +0.000052f, +0.000505f, +0.000153f, -0.000734f, + -0.000456f, +0.000052f, -0.000965f, +0.000896f, -0.000494f, +0.000221f, +0.000072f, -0.000120f, +0.000164f, -0.000365f, + +0.000251f, +0.000453f, +0.000350f, +0.000157f, +0.000064f, +0.000905f, +0.000189f, -0.000483f, -0.000863f, -0.000219f, + +0.000489f, +0.000200f, +0.000144f, -0.000393f, -0.000510f, -0.000070f, +0.000062f, +0.000026f, -0.000198f, -0.000175f, + +0.000204f, +0.000067f, -0.000163f, +0.000176f, +0.000018f, -0.000209f, -0.000149f, +0.000058f, +0.000206f, -0.000127f, + -0.000291f, -0.000128f, -0.000031f, +0.000150f, -0.000095f, +0.000064f, +0.000250f, +0.000160f, -0.000009f, -0.000072f, + +0.000128f, +0.000298f, +0.000138f, -0.000066f, +0.000070f, +0.000092f, +0.000042f, +0.000071f, -0.000016f, +0.000062f, + +0.000018f, -0.000031f, +0.000042f, +0.000060f, +0.000029f, -0.000064f, +0.000005f, +0.000010f, -0.000029f, -0.000073f, + +0.000012f, +0.000014f, +0.000063f, -0.000004f, -0.000072f, +0.000018f, -0.000005f, -0.000029f, -0.000001f, -0.000042f, + +0.000044f, +0.000047f, +0.000016f, +0.000015f, -0.000027f, +0.000009f + }, + { + +0.000020f, -0.006424f, -0.000306f, +0.000536f, +0.000088f, -0.000241f, -0.000015f, +0.000075f, +0.000113f, +0.000012f, + -0.000195f, -0.000414f, -0.000159f, -0.000579f, -0.001040f, +0.001221f, -0.001387f, -0.001097f, -0.002736f, +0.000883f, + -0.000854f, -0.001959f, -0.000824f, +0.001436f, -0.000268f, -0.000804f, -0.000666f, +0.001469f, -0.001639f, -0.000083f, + +0.000458f, +0.001089f, +0.000429f, -0.000032f, -0.000282f, +0.000446f, +0.000354f, -0.000137f, +0.000417f, +0.000180f, + +0.000211f, +0.000068f, +0.000077f, -0.000082f, -0.000163f, +0.000016f, +0.000328f, -0.000173f, +0.000068f, +0.000140f, + -0.000090f, -0.000016f, +0.000171f, +0.000032f, +0.000253f, +0.000031f, -0.000203f, +0.000060f, +0.000105f, -0.000124f, + -0.000147f, +0.000085f, -0.000028f, +0.000034f, +0.000161f, +0.000044f, -0.000002f, -0.000012f, +0.000166f, +0.000045f, + -0.000151f, -0.000120f, +0.000070f, +0.000076f, -0.000043f, -0.000025f, +0.000105f, +0.000101f, +0.000003f, -0.000045f, + -0.000061f, +0.000062f, +0.000024f, +0.000015f, -0.000003f, -0.000077f, -0.000003f, +0.000037f, +0.000044f, -0.000008f, + -0.000036f, +0.000039f, +0.000069f, +0.000007f, +0.000007f, +0.000034f + }, + { + -0.009791f, -0.037136f, +0.000148f, -0.002456f, +0.000472f, +0.000335f, -0.000044f, -0.000007f, -0.000156f, +0.000038f, + +0.000654f, -0.000112f, -0.000325f, +0.001280f, -0.000398f, -0.000137f, +0.000003f, -0.001114f, -0.000145f, +0.000024f, + -0.000099f, +0.000235f, +0.000106f, -0.000526f, +0.000077f, -0.000062f, -0.000169f, +0.002313f, -0.000018f, -0.000473f, + +0.000136f, -0.000209f, -0.000129f, +0.000408f, -0.000246f, -0.000061f, -0.000340f, -0.000360f, +0.000392f, +0.000068f, + -0.000207f, +0.000025f, +0.000301f, +0.000040f, -0.000055f, +0.000220f, +0.000309f, +0.000148f, -0.000041f, +0.000213f, + -0.000010f, +0.000243f, +0.000121f, -0.000146f, -0.000073f, +0.000085f, -0.000103f, -0.000228f, -0.000072f, +0.000001f, + +0.000133f, -0.000146f, +0.000165f, +0.000006f, -0.000067f, -0.000046f, -0.000032f, -0.000094f, +0.000082f, +0.000041f, + -0.000076f, -0.000129f, -0.000136f, +0.000030f, +0.000095f, -0.000011f, +0.000064f, +0.000013f, -0.000039f, +0.000046f, + +0.000045f, -0.000017f, +0.000025f, -0.000029f, -0.000071f, +0.000017f, +0.000016f, -0.000001f, -0.000061f, -0.000021f, + +0.000009f, -0.000014f, -0.000012f, -0.000042f, +0.000003f, +0.000020f + }, + { + -0.000246f, +0.001178f, +0.000768f, -0.000525f, -0.000089f, -0.000101f, +0.000146f, +0.000110f, +0.000165f, +0.000045f, + -0.000264f, -0.000302f, -0.000107f, +0.000134f, -0.000603f, +0.000110f, +0.003292f, -0.001104f, +0.000809f, +0.005358f, + -0.000224f, -0.000445f, +0.001033f, -0.000286f, -0.000662f, -0.000098f, +0.000621f, +0.000364f, -0.000246f, -0.000582f, + +0.000386f, +0.000107f, +0.000146f, +0.000583f, +0.000134f, +0.000272f, -0.000109f, +0.000268f, +0.000124f, -0.000178f, + +0.000417f, -0.000080f, -0.000126f, +0.000274f, +0.000170f, +0.000017f, -0.000133f, -0.000175f, -0.000084f, +0.000170f, + +0.000149f, +0.000053f, -0.000326f, -0.000065f, +0.000157f, -0.000007f, -0.000029f, -0.000118f, -0.000022f, +0.000102f, + +0.000030f, -0.000006f, +0.000042f, +0.000022f, +0.000065f, +0.000079f, -0.000058f, -0.000038f, +0.000006f, -0.000027f, + +0.000051f, +0.000111f, +0.000037f, +0.000006f, +0.000073f, +0.000060f, +0.000087f, +0.000081f, +0.000006f, -0.000061f, + -0.000006f, +0.000039f, -0.000039f, -0.000054f, +0.000008f, +0.000023f, -0.000008f, -0.000021f, +0.000022f, -0.000004f, + -0.000057f, -0.000036f, +0.000060f, +0.000042f, +0.000008f, -0.000029f + }, + { + +0.010774f, -0.054038f, -0.003484f, +0.000674f, +0.000023f, +0.000335f, +0.000289f, +0.000136f, +0.000352f, -0.000358f, + +0.000387f, -0.000084f, +0.000054f, +0.000101f, -0.000723f, +0.000132f, -0.000077f, +0.000611f, -0.000292f, -0.000525f, + -0.000449f, -0.000237f, +0.000217f, -0.000016f, -0.000284f, -0.000564f, +0.000408f, +0.000644f, -0.000368f, -0.000264f, + +0.000222f, +0.000158f, +0.000003f, +0.000315f, +0.000063f, +0.000093f, -0.000123f, +0.000098f, +0.000177f, +0.000243f, + +0.000352f, +0.000020f, -0.000060f, -0.000039f, +0.000092f, +0.000039f, -0.000304f, -0.000142f, -0.000042f, -0.000350f, + -0.000149f, +0.000083f, -0.000063f, -0.000010f, +0.000056f, +0.000199f, +0.000118f, +0.000048f, +0.000258f, +0.000056f, + +0.000182f, -0.000001f, +0.000048f, -0.000035f, +0.000014f, +0.000136f, +0.000171f, -0.000015f, -0.000070f, +0.000088f, + -0.000049f, -0.000122f, +0.000124f, +0.000130f, -0.000058f, -0.000049f, +0.000013f, +0.000001f, -0.000048f, +0.000066f, + -0.000019f, -0.000028f, +0.000082f, +0.000059f, -0.000118f, +0.000015f, +0.000076f, -0.000016f, -0.000037f, -0.000028f, + +0.000035f, -0.000001f, -0.000022f, -0.000022f, -0.000025f, +0.000011f + }, + { + -0.000269f, +0.001446f, +0.000262f, -0.000234f, +0.000047f, -0.000226f, +0.000061f, -0.000052f, -0.000059f, +0.000138f, + -0.000244f, -0.000459f, -0.000507f, +0.000609f, -0.001491f, +0.002325f, +0.000569f, +0.000031f, -0.000031f, +0.000083f, + -0.001049f, +0.001240f, -0.001061f, -0.001151f, -0.000219f, -0.000785f, +0.000851f, -0.000307f, -0.000137f, -0.000409f, + -0.000262f, -0.000178f, +0.000185f, +0.000049f, -0.000092f, -0.000103f, +0.000089f, +0.000255f, -0.000003f, +0.000080f, + -0.000103f, +0.000079f, -0.000012f, -0.000032f, -0.000014f, +0.000140f, +0.000374f, -0.000079f, -0.000265f, +0.000133f, + +0.000191f, +0.000155f, -0.000128f, +0.000091f, +0.000142f, +0.000094f, +0.000124f, +0.000225f, -0.000126f, -0.000011f, + +0.000071f, +0.000147f, +0.000080f, -0.000015f, +0.000011f, -0.000181f, +0.000038f, +0.000139f, +0.000059f, -0.000084f, + +0.000072f, -0.000015f, -0.000054f, -0.000003f, +0.000066f, -0.000011f, +0.000048f, +0.000100f, -0.000005f, +0.000019f, + -0.000001f, -0.000096f, -0.000034f, -0.000004f, +0.000045f, +0.000012f, +0.000048f, +0.000016f, -0.000044f, +0.000065f, + +0.000002f, -0.000015f, +0.000011f, -0.000027f, +0.000012f, -0.000008f + }, + { + -0.017487f, +0.000881f, +0.003524f, +0.002022f, -0.000091f, +0.000268f, +0.000307f, -0.000451f, -0.000268f, +0.000960f, + -0.000621f, -0.001129f, -0.000530f, +0.000672f, +0.000317f, +0.001027f, +0.000622f, +0.000329f, +0.000380f, +0.000219f, + +0.000612f, -0.000581f, -0.000375f, +0.001063f, -0.000119f, +0.000039f, +0.000482f, -0.000581f, +0.000284f, +0.000052f, + +0.000085f, -0.000182f, +0.000293f, -0.000154f, +0.000075f, -0.000011f, -0.000490f, +0.000068f, +0.000515f, -0.000038f, + +0.000663f, +0.000134f, +0.000435f, +0.000205f, +0.000315f, +0.000139f, +0.000177f, -0.000250f, -0.000590f, -0.000138f, + +0.000230f, +0.000055f, -0.000112f, +0.000182f, +0.000014f, -0.000141f, -0.000120f, +0.000076f, -0.000015f, -0.000223f, + -0.000017f, +0.000062f, +0.000063f, -0.000079f, -0.000186f, -0.000083f, +0.000095f, -0.000012f, -0.000010f, +0.000026f, + +0.000001f, -0.000096f, +0.000035f, +0.000054f, +0.000124f, -0.000112f, +0.000009f, +0.000087f, +0.000012f, -0.000066f, + +0.000007f, -0.000033f, -0.000059f, -0.000071f, -0.000071f, -0.000056f, +0.000022f, +0.000059f, +0.000048f, +0.000019f, + -0.000035f, -0.000005f, -0.000044f, +0.000024f, +0.000034f, -0.000007f + }, + { + +0.000284f, +0.008835f, +0.000940f, -0.000138f, -0.000658f, +0.001291f, +0.000402f, -0.000747f, +0.000307f, +0.000386f, + +0.000163f, -0.000803f, +0.000061f, +0.001409f, +0.001126f, +0.001320f, -0.000573f, -0.000490f, +0.001454f, +0.000452f, + -0.000181f, +0.000004f, -0.000092f, +0.000286f, +0.000175f, +0.000476f, +0.000156f, +0.000109f, -0.000485f, +0.000500f, + +0.000007f, -0.000021f, +0.000055f, +0.000395f, -0.000074f, +0.000155f, +0.000509f, +0.000298f, +0.000138f, +0.000160f, + +0.000239f, +0.000241f, +0.000133f, -0.000262f, +0.000163f, +0.000331f, +0.000028f, -0.000059f, -0.000096f, +0.000035f, + +0.000427f, +0.000039f, -0.000023f, +0.000003f, -0.000385f, -0.000182f, +0.000052f, +0.000005f, +0.000123f, +0.000063f, + -0.000076f, -0.000008f, -0.000126f, -0.000145f, -0.000113f, -0.000115f, +0.000116f, +0.000153f, +0.000197f, +0.000055f, + -0.000019f, -0.000025f, -0.000081f, -0.000026f, +0.000072f, -0.000031f, -0.000071f, -0.000016f, -0.000023f, -0.000076f, + -0.000031f, +0.000004f, +0.000035f, +0.000036f, +0.000054f, +0.000026f, -0.000043f, -0.000001f, -0.000013f, +0.000035f, + +0.000018f, +0.000024f, +0.000028f, +0.000000f, +0.000061f, +0.000026f + }, + { + -0.001692f, +0.002117f, -0.001466f, -0.000853f, -0.000013f, +0.001316f, +0.000452f, -0.000672f, -0.000533f, +0.000386f, + +0.000053f, -0.000100f, +0.000258f, +0.000505f, +0.000456f, -0.000383f, +0.000698f, +0.000594f, +0.000583f, +0.000232f, + -0.000003f, +0.000160f, +0.000217f, +0.000275f, +0.000326f, +0.000027f, -0.000296f, -0.000206f, -0.000175f, +0.000461f, + +0.000577f, -0.000302f, -0.000154f, -0.000073f, +0.000312f, -0.000805f, -0.000225f, +0.000151f, -0.000291f, +0.000435f, + +0.000380f, +0.000081f, -0.000230f, -0.000133f, -0.000240f, -0.000105f, +0.000016f, +0.000275f, +0.000072f, -0.000208f, + +0.000045f, +0.000041f, +0.000178f, -0.000082f, -0.000174f, -0.000073f, -0.000025f, +0.000226f, +0.000129f, -0.000126f, + +0.000001f, -0.000020f, -0.000045f, -0.000092f, +0.000017f, -0.000006f, -0.000043f, -0.000017f, -0.000005f, +0.000004f, + -0.000023f, -0.000012f, +0.000038f, +0.000139f, +0.000049f, +0.000070f, +0.000053f, -0.000106f, -0.000019f, -0.000011f, + -0.000033f, +0.000056f, -0.000057f, +0.000029f, +0.000016f, +0.000066f, +0.000053f, +0.000032f, +0.000006f, -0.000035f, + +0.000019f, +0.000012f, -0.000037f, -0.000040f, +0.000029f, +0.000026f + }, + { + -0.000067f, +0.001211f, +0.000443f, -0.000276f, +0.000245f, +0.000024f, -0.000583f, -0.000109f, +0.000302f, +0.000119f, + +0.000286f, -0.000467f, +0.000878f, -0.004021f, +0.003002f, -0.001515f, +0.000367f, +0.001458f, +0.000979f, +0.000035f, + -0.001431f, +0.000517f, +0.000738f, +0.000717f, +0.000140f, -0.000772f, -0.000603f, -0.000626f, -0.000645f, +0.000845f, + -0.000201f, -0.000462f, -0.000489f, -0.000134f, +0.000013f, -0.000259f, -0.000038f, +0.000606f, +0.000250f, -0.000014f, + -0.000125f, -0.000289f, +0.000137f, +0.000330f, -0.000000f, -0.000040f, -0.000237f, +0.000041f, +0.000185f, +0.000101f, + +0.000162f, -0.000176f, +0.000019f, +0.000126f, +0.000033f, +0.000096f, -0.000105f, -0.000361f, -0.000167f, -0.000069f, + -0.000008f, +0.000063f, -0.000038f, -0.000158f, -0.000142f, +0.000183f, -0.000014f, +0.000004f, +0.000054f, -0.000030f, + +0.000091f, +0.000004f, +0.000046f, +0.000074f, +0.000003f, +0.000104f, +0.000099f, -0.000023f, -0.000015f, -0.000042f, + -0.000007f, +0.000016f, -0.000105f, -0.000066f, -0.000021f, -0.000046f, -0.000075f, -0.000037f, +0.000003f, +0.000011f, + +0.000013f, +0.000031f, +0.000029f, -0.000040f, -0.000012f, +0.000041f + }, + { + +0.002025f, +0.020677f, +0.002066f, +0.001219f, +0.000135f, +0.000367f, +0.001326f, -0.000790f, -0.000390f, -0.000077f, + +0.000849f, -0.000383f, -0.000212f, +0.000066f, +0.000035f, -0.000826f, -0.000462f, +0.000275f, -0.000116f, +0.000570f, + +0.000328f, -0.000534f, -0.000024f, -0.000339f, +0.000158f, +0.000100f, +0.000096f, +0.000142f, +0.000406f, -0.000045f, + -0.000082f, +0.000096f, -0.000104f, -0.000249f, -0.000303f, +0.000328f, +0.000134f, -0.000053f, +0.000215f, +0.000182f, + -0.000095f, -0.000577f, -0.000044f, -0.000275f, -0.000455f, -0.000380f, +0.000120f, -0.000188f, -0.000231f, +0.000175f, + -0.000113f, +0.000342f, +0.000068f, +0.000232f, +0.000144f, +0.000172f, -0.000051f, -0.000007f, -0.000265f, +0.000118f, + +0.000181f, -0.000099f, -0.000084f, +0.000059f, +0.000050f, -0.000082f, -0.000089f, -0.000086f, +0.000058f, +0.000102f, + -0.000114f, -0.000092f, +0.000094f, +0.000082f, -0.000028f, +0.000001f, -0.000086f, +0.000040f, +0.000030f, +0.000055f, + -0.000024f, -0.000110f, -0.000023f, +0.000042f, +0.000075f, -0.000041f, -0.000145f, -0.000046f, -0.000013f, -0.000042f, + -0.000004f, -0.000011f, +0.000083f, +0.000041f, +0.000032f, +0.000069f + }, + { + +0.000059f, +0.003258f, -0.000925f, +0.000260f, +0.000159f, +0.000043f, +0.000205f, +0.000282f, +0.000252f, -0.000389f, + +0.000077f, -0.000527f, -0.000117f, +0.000711f, +0.001027f, -0.001401f, +0.000528f, +0.000059f, +0.000309f, +0.000752f, + +0.000281f, -0.000164f, +0.000799f, +0.000915f, +0.000136f, +0.000625f, +0.000217f, +0.000024f, +0.000842f, -0.000148f, + +0.000126f, -0.000113f, +0.000229f, +0.000017f, -0.000701f, -0.000156f, -0.000316f, -0.000568f, +0.000080f, -0.000064f, + -0.000183f, +0.000276f, +0.000039f, -0.000235f, -0.000099f, -0.000187f, +0.000130f, +0.000141f, +0.000196f, -0.000083f, + +0.000033f, +0.000153f, -0.000104f, -0.000172f, -0.000112f, -0.000153f, -0.000153f, +0.000005f, -0.000011f, -0.000130f, + +0.000305f, +0.000083f, -0.000095f, -0.000077f, +0.000152f, -0.000061f, -0.000122f, +0.000168f, +0.000042f, +0.000035f, + -0.000079f, -0.000101f, +0.000034f, +0.000053f, +0.000007f, +0.000076f, -0.000093f, -0.000049f, -0.000010f, +0.000007f, + +0.000122f, +0.000045f, -0.000058f, -0.000030f, -0.000058f, -0.000085f, -0.000056f, +0.000066f, -0.000007f, -0.000019f, + +0.000083f, +0.000070f, -0.000032f, -0.000017f, +0.000067f, -0.000029f + }, + { + +0.001820f, -0.010752f, -0.000802f, -0.000895f, +0.000935f, +0.001515f, +0.000648f, -0.000396f, -0.000274f, -0.000253f, + +0.000884f, +0.000389f, -0.000372f, -0.000818f, +0.001176f, +0.001005f, -0.000529f, -0.000182f, +0.000036f, -0.000371f, + -0.000741f, +0.000061f, +0.000042f, +0.000477f, -0.000011f, -0.000086f, +0.000005f, -0.000242f, +0.000665f, -0.000178f, + +0.000067f, +0.000417f, +0.000156f, -0.000366f, -0.000203f, -0.000397f, +0.000290f, +0.000187f, +0.000369f, +0.000173f, + +0.000133f, +0.000083f, +0.000115f, -0.000248f, +0.000158f, -0.000101f, -0.000307f, +0.000243f, +0.000261f, +0.000240f, + +0.000039f, +0.000022f, +0.000145f, +0.000038f, +0.000074f, -0.000031f, -0.000071f, +0.000004f, -0.000046f, -0.000007f, + +0.000001f, -0.000195f, -0.000148f, -0.000068f, -0.000076f, -0.000037f, -0.000059f, -0.000059f, -0.000026f, +0.000037f, + -0.000023f, -0.000138f, -0.000014f, +0.000185f, +0.000071f, -0.000042f, -0.000080f, +0.000005f, +0.000042f, -0.000056f, + -0.000030f, +0.000065f, +0.000027f, -0.000021f, +0.000010f, +0.000056f, -0.000010f, +0.000095f, -0.000006f, -0.000058f, + +0.000011f, -0.000046f, -0.000007f, +0.000021f, +0.000004f, +0.000029f + } + } +}; + +const float fastconvReverberationTimes[CLDFB_NO_CHANNELS_MAX] = +{ + 0.429201f, 0.205110f, 0.202338f, 0.208383f, 0.215664f, 0.236545f, 0.230598f, 0.228400f, 0.227467f, 0.218956f, 0.226083f, 0.220702f, 0.221501f, 0.223471f, 0.223705f, 0.227063f, 0.227899f, 0.223071f, 0.220000f, 0.218583f, 0.220417f, 0.218250f, 0.213250f, 0.210333f, 0.207417f, 0.198750f, 0.196250f, 0.194917f, 0.190333f, 0.184500f, 0.180333f, 0.176167f, 0.176500f, 0.177583f, 0.183583f, 0.195917f, 0.203250f, 0.208417f, 0.214667f, 0.220000f, 0.222917f, 0.230417f, 0.233928f, 0.233647f, 0.236333f, 0.237428f, 0.241629f, 0.241118f, 0.238847f, 0.242384f, 0.246292f, 0.245948f, 0.246100f, 0.245396f, 0.243951f, 0.244123f, 0.239270f, 0.241474f, 0.234824f, 0.253040f, +}; + + +const float fastconvReverberationEneCorrections[CLDFB_NO_CHANNELS_MAX] = +{ + 0.000584f, 0.000210f, 0.000233f, 0.000212f, 0.000257f, 0.001518f, 0.001154f, 0.001097f, 0.001265f, 0.001298f, 0.002320f, 0.002432f, 0.002686f, 0.002702f, 0.002632f, 0.002564f, 0.002732f, 0.002727f, 0.002609f, 0.002524f, 0.003417f, 0.001783f, 0.000987f, 0.000699f, 0.000606f, 0.000536f, 0.000511f, 0.000569f, 0.000600f, 0.000543f, 0.001257f, 0.001209f, 0.000957f, 0.000601f, 0.000274f, 0.000106f, 0.000072f, 0.000051f, 0.000040f, 0.000030f, 0.000024f, 0.000018f, 0.000014f, 0.000013f, 0.000012f, 0.000011f, 0.000009f, 0.000009f, 0.000008f, 0.000008f, 0.000007f, 0.000006f, 0.000005f, 0.000003f, 0.000002f, 0.000002f, 0.000001f, 0.000001f, 0.000000f, 0.000000f, +}; + + +const float parametricReverberationTimes[CLDFB_NO_CHANNELS_MAX] = +{ + 0.345494f, 0.319454f, 0.332961f, 0.360923f, 0.374299f, 0.370777f, 0.358625f, 0.348103f, 0.343109f, 0.331351f, + 0.316502f, 0.304975f, 0.294855f, 0.287549f, 0.279920f, 0.270277f, 0.264042f, 0.256404f, 0.249899f, 0.242040f, + 0.235074f, 0.229647f, 0.223730f, 0.218795f, 0.212599f, 0.207689f, 0.202082f, 0.198094f, 0.193907f, 0.185908f, + 0.182677f, 0.181960f, 0.179788f, 0.179081f, 0.176542f, 0.172328f, 0.171103f, 0.167951f, 0.167974f, 0.169209f, + 0.167340f, 0.165926f, 0.163565f, 0.161558f, 0.158405f, 0.156651f, 0.155351f, 0.153580f, 0.151576f, 0.149963f, + 0.148204f, 0.146446f, 0.144688f, 0.142930f, 0.141172f, 0.139414f, 0.137655f, 0.135897f, 0.134139f, 0.132381f +}; + + +const float parametricReverberationEneCorrections[CLDFB_NO_CHANNELS_MAX] = +{ + 0.191981f, 0.143739f, 0.113528f, 0.093836f, 0.090147f, 0.079961f, 0.066594f, 0.072700f, 0.076491f, 0.082065f, + 0.085265f, 0.093864f, 0.101901f, 0.113728f, 0.117646f, 0.113494f, 0.126125f, 0.126304f, 0.123928f, 0.116067f, + 0.098528f, 0.051482f, 0.029950f, 0.025223f, 0.021143f, 0.019358f, 0.016707f, 0.016227f, 0.018416f, 0.018419f, + 0.017097f, 0.015219f, 0.014214f, 0.009693f, 0.003996f, 0.001613f, 0.000965f, 0.000643f, 0.000498f, 0.000417f, + 0.000304f, 0.000181f, 0.000116f, 0.000113f, 0.000102f, 0.000078f, 0.000064f, 0.000060f, 0.000063f, 0.000062f, + 0.000061f, 0.000052f, 0.000040f, 0.000030f, 0.000014f, 0.000007f, 0.000003f, 0.000001f, 0.000000f, 0.000000f +}; + + +const float parametricEarlyPartEneCorrection[CLDFB_NO_CHANNELS_MAX] = +{ + 0.595541f, 0.684107f, 1.041399f, 0.880102f, 0.726599f, 0.529105f, 0.456758f, 0.383174f, 0.331734f, 0.330565f, + 0.436469f, 0.592478f, 0.767344f, 1.110786f, 1.548546f, 1.946089f, 2.550005f, 3.382855f, 4.235532f, 4.688064f, + 3.328668f, 1.312207f, 0.376543f, 0.176443f, 0.149840f, 0.130307f, 0.137089f, 0.292711f, 0.580265f, 0.733105f, + 0.734631f, 0.765035f, 0.759859f, 0.551234f, 0.257650f, 0.090947f, 0.052208f, 0.054891f, 0.050681f, 0.035657f, + 0.022300f, 0.015935f, 0.012629f, 0.010668f, 0.009082f, 0.007769f, 0.008032f, 0.010972f, 0.014774f, 0.016790f, + 0.016350f, 0.042709f, 0.077337f, 0.066238f, 0.042046f, 0.020017f, 0.007896f, 0.002947f, 0.000932f, 0.000152f +}; + +#undef WMC_TOOL_SKIP + +/* clang-format on */ diff --git a/lib_rend/ivas_rom_binauralRenderer.h b/lib_rend/ivas_rom_binauralRenderer.h new file mode 100644 index 0000000000000000000000000000000000000000..656bc44b8599b785f46c918329a4c42e2669d6e2 --- /dev/null +++ b/lib_rend/ivas_rom_binauralRenderer.h @@ -0,0 +1,85 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "cnst.h" +#include "ivas_cnst.h" + +/*------------------------------------------------------------------------- + * Binaural rendering related ROM tables + *------------------------------------------------------------------------*/ + +/* Binaural rendering data set based on HRIRs */ +extern const float FASTCONV_HRIR_latency_s; +extern float leftHRIRReal_HOA3[BINAURAL_CONVBANDS][HOA3_CHANNELS][BINAURAL_NTAPS_SBA]; +extern float leftHRIRImag_HOA3[BINAURAL_CONVBANDS][HOA3_CHANNELS][BINAURAL_NTAPS_SBA]; +extern float rightHRIRReal_HOA3[BINAURAL_CONVBANDS][HOA3_CHANNELS][BINAURAL_NTAPS_SBA]; +extern float rightHRIRImag_HOA3[BINAURAL_CONVBANDS][HOA3_CHANNELS][BINAURAL_NTAPS_SBA]; +extern float leftHRIRReal_HOA2[BINAURAL_CONVBANDS][HOA2_CHANNELS][BINAURAL_NTAPS_SBA]; +extern float leftHRIRImag_HOA2[BINAURAL_CONVBANDS][HOA2_CHANNELS][BINAURAL_NTAPS_SBA]; +extern float rightHRIRReal_HOA2[BINAURAL_CONVBANDS][HOA2_CHANNELS][BINAURAL_NTAPS_SBA]; +extern float rightHRIRImag_HOA2[BINAURAL_CONVBANDS][HOA2_CHANNELS][BINAURAL_NTAPS_SBA]; +extern float leftHRIRReal_FOA[BINAURAL_CONVBANDS][FOA_CHANNELS][BINAURAL_NTAPS_SBA]; +extern float leftHRIRImag_FOA[BINAURAL_CONVBANDS][FOA_CHANNELS][BINAURAL_NTAPS_SBA]; +extern float rightHRIRReal_FOA[BINAURAL_CONVBANDS][FOA_CHANNELS][BINAURAL_NTAPS_SBA]; +extern float rightHRIRImag_FOA[BINAURAL_CONVBANDS][FOA_CHANNELS][BINAURAL_NTAPS_SBA]; + +extern float leftHRIRReal[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS]; +extern float leftHRIRImag[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS]; +extern float rightHRIRReal[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS]; +extern float rightHRIRImag[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS]; + +extern float FASTCONV_HOA3_latency_s; +extern float FASTCONV_HOA2_latency_s; +extern float FASTCONV_FOA_latency_s; +extern float hrtfShCoeffsRe[BINAURAL_CHANNELS][HRTF_SH_CHANNELS][HRTF_NUM_BINS]; +extern float hrtfShCoeffsIm[BINAURAL_CHANNELS][HRTF_SH_CHANNELS][HRTF_NUM_BINS]; + + +/* Binaural rendering data set based on BRIRs */ +extern const float FASTCONV_BRIR_latency_s; +extern float leftBRIRReal[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS_MAX]; +extern float leftBRIRImag[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS_MAX]; +extern float rightBRIRReal[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS_MAX]; +extern float rightBRIRImag[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS_MAX]; + +/* Reverberation parameters based on BRIRs for fastconv */ +extern float fastconvReverberationTimes[CLDFB_NO_CHANNELS_MAX]; +extern float fastconvReverberationEneCorrections[CLDFB_NO_CHANNELS_MAX]; + +/* Binaural rendering data set based on BRIRs, to be used in a combined manner + * with the above binaural rendering data set based on HRIRs for parametric + * renderer */ +extern const float parametricReverberationTimes[CLDFB_NO_CHANNELS_MAX]; +extern const float parametricReverberationEneCorrections[CLDFB_NO_CHANNELS_MAX]; +extern const float parametricEarlyPartEneCorrection[CLDFB_NO_CHANNELS_MAX]; diff --git a/lib_rend/ivas_rom_binaural_crend_head.c b/lib_rend/ivas_rom_binaural_crend_head.c new file mode 100644 index 0000000000000000000000000000000000000000..b313ffa5344387fcf8ffba232d49973bed34abd6 --- /dev/null +++ b/lib_rend/ivas_rom_binaural_crend_head.c @@ -0,0 +1,7179 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/* clang-format off */ + +/*------------------------------------------------------------------------- + * Binaural rendering related ROM tables + *------------------------------------------------------------------------*/ + +/* Binaural rendering data set based on HRIRs */ +/* Tables generated by scripts/binauralRenderer_interface/generate_cren_ivas_tables.c, see mixer_conv_sofa_to_rom_table_converter_readme.txt */ +/* Can be replaced by your own generated HRIR or BRIR tables */ + + + +#include +#include "ivas_cnst.h" + +/* clang-format off */ + +#define WMC_TOOL_SKIP + + + +/********************** CRendBin_Combined_HRIR **********************/ + +const float CRendBin_Combined_HRIR_latency_s = 0.000020834f; + +/* Sample Rate = 48000 */ + +const int16_t CRendBin_Combined_HRIR_max_num_iterations_48kHz = 1; +const uint16_t CRendBin_Combined_HRIR_num_iterations_48kHz[15][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1} }; +const uint16_t CRendBin_Combined_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS] = {0, 0}; +const uint16_t CRendBin_Combined_HRIR_pIndex_frequency_max_48kHz[15][BINAURAL_CHANNELS][1]={{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}}}; +const uint16_t CRendBin_Combined_HRIR_index_frequency_max_diffuse_48kHz = 0; +const float CRendBin_Combined_HRIR_inv_diffuse_weight_48kHz[15]={0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f}; +const uint16_t *CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const float CRendBin_Combined_HRIR_coeff_re_48kHz[15][BINAURAL_CHANNELS][240]={ + { + {1.101488f, 1.121686f, 1.165024f, 1.224338f, 1.257855f, 1.220486f, 1.149240f, 1.140890f, 1.185728f, 1.128055f, 0.902355f, 0.707875f, 0.788108f, 1.099541f, 1.375119f, 1.484928f, 1.549978f, 1.695559f, 1.876431f, 1.995635f, 2.041427f, 2.028898f, 1.921455f, 1.700966f, 1.448293f, 1.277519f, 1.224020f, 1.244684f, 1.297952f, 1.382592f, 1.515360f, 1.701068f, 1.918656f, 2.122718f, 2.265994f, 2.329628f, 2.329558f, 2.294332f, 2.241762f, 2.173492f, 2.084598f, 1.978110f, 1.871591f, 1.786593f, 1.731800f, 1.700143f, 1.679095f, 1.656899f, 1.622424f, 1.569381f, 1.502234f, 1.432448f, 1.368773f, 1.314020f, 1.268340f, 1.231321f, 1.202278f, 1.180534f, 1.163747f, 1.146145f, 1.121645f, 1.087903f, 1.043613f, 0.983612f, 0.901864f, 0.798972f, 0.683390f, 0.566766f, 0.461005f, 0.376682f, 0.319308f, 0.287365f, 0.275856f, 0.280196f, 0.295624f, 0.315889f, 0.334947f, 0.349113f, 0.357350f, 0.360958f, 0.362742f, 0.364984f, 0.368682f, 0.375343f, 0.387569f, 0.406700f, 0.431922f, 0.462716f, 0.499762f, 0.542220f, 0.586337f, 0.627805f, 0.663761f, 0.692071f, 0.710593f, 0.717887f, + 0.713731f, 0.699041f, 0.675854f, 0.646711f, 0.613681f, 0.578765f, 0.544708f, 0.513648f, 0.485423f, 0.459267f, 0.436523f, 0.419581f, 0.409130f, 0.404828f, 0.407589f, 0.418787f, 0.438090f, 0.464110f, 0.496246f, 0.534436f, 0.578397f, 0.628210f, 0.684323f, 0.746531f, 0.814569f, 0.889456f, 0.972140f, 1.061353f, 1.155269f, 1.254322f, 1.359452f, 1.468434f, 1.577080f, 1.683222f, 1.786114f, 1.882169f, 1.964521f, 2.027143f, 2.066756f, 2.079988f, 2.061244f, 2.005565f, 1.912874f, 1.787215f, 1.631793f, 1.447687f, 1.238656f, 1.013433f, 0.779817f, 0.539619f, 0.293632f, 0.048036f, -0.190045f, -0.420433f, -0.646524f, -0.866314f, -1.074294f, -1.270685f, -1.460857f, -1.646046f, -1.822195f, -1.988192f, -2.148163f, -2.304337f, -2.453363f, -2.591452f, -2.718826f, -2.836782f, -2.942783f, -3.031068f, -3.097979f, -3.144348f, -3.170915f, -3.173977f, -3.149931f, -3.102115f, -3.036603f, -2.952834f, -2.846787f, -2.721688f, -2.584617f, -2.433723f, -2.261283f, -2.067770f, -1.858490f, -1.628464f, -1.366934f, -1.074068f, -0.755851f, -0.407743f, -0.023711f, 0.384421f, 0.796944f, 1.204825f, 1.594892f, 1.931022f, + 2.176602f, 2.317416f, 2.335553f, 2.191195f, 1.867100f, 1.394310f, 0.795503f, 0.073196f, -0.660345f, -1.115477f, -1.048547f, -0.566404f, -0.073872f, 0.126575f, 0.081506f, 0.007169f, -0.000212f, 0.010105f, -0.000437f, -0.007848f, 0.001481f, 0.006032f, -0.001850f, -0.004621f, 0.002044f, 0.003718f, -0.001908f, -0.002879f, 0.001815f, 0.002240f, -0.001726f, -0.001819f, 0.001470f, 0.001293f, -0.001428f, -0.001063f, 0.001166f, 0.000684f, -0.001078f, -0.000479f, 0.000904f, 0.000264f, -0.000723f, -0.000016f, 0.000645f, -0.000071f, -0.000388f, 0.000349f}, + {0.968441f, 0.987234f, 0.869596f, 0.596073f, 0.334483f, 0.171136f, 0.017776f, -0.161778f, -0.245721f, -0.155540f, 0.006522f, 0.093937f, 0.049496f, -0.140506f, -0.468985f, -0.824439f, -1.026403f, -1.016121f, -0.905691f, -0.796722f, -0.670406f, -0.503266f, -0.362411f, -0.307750f, -0.295462f, -0.254770f, -0.185996f, -0.113263f, -0.005954f, 0.176006f, 0.400292f, 0.595777f, 0.744307f, 0.877077f, 0.990030f, 1.022653f, 0.934836f, 0.765351f, 0.591919f, 0.455498f, 0.344908f, 0.238899f, 0.133289f, 0.027739f, -0.086033f, -0.210079f, -0.329871f, -0.429681f, -0.507904f, -0.568659f, -0.608760f, -0.622380f, -0.610718f, -0.579218f, -0.531546f, -0.471669f, -0.405261f, -0.334310f, -0.255734f, -0.168133f, -0.074958f, 0.019479f, 0.110900f, 0.191660f, 0.253073f, 0.292584f, 0.314355f, 0.323012f, 0.320972f, 0.311128f, 0.297794f, 0.284665f, 0.273984f, 0.266907f, 0.262951f, 0.259722f, 0.253926f, 0.242085f, 0.221157f, 0.190535f, 0.153092f, 0.112713f, 0.071225f, 0.028184f, -0.018416f, -0.072225f, -0.136625f, -0.210590f, -0.287552f, -0.358747f, -0.416020f, -0.451958f, -0.460910f, -0.441509f, -0.397130f, -0.334256f, + -0.261823f, -0.190493f, -0.129257f, -0.082184f, -0.049250f, -0.028772f, -0.017399f, -0.009448f, 0.001351f, 0.020052f, 0.051375f, 0.100649f, 0.171779f, 0.264460f, 0.373677f, 0.490520f, 0.602599f, 0.695221f, 0.754355f, 0.769527f, 0.734768f, 0.648370f, 0.512977f, 0.335735f, 0.127409f, -0.099262f, -0.330468f, -0.551239f, -0.746022f, -0.900770f, -1.004813f, -1.051193f, -1.036965f, -0.964527f, -0.841753f, -0.679493f, -0.489227f, -0.282948f, -0.072808f, 0.131140f, 0.321905f, 0.493472f, 0.639377f, 0.754179f, 0.834298f, 0.876384f, 0.876941f, 0.834703f, 0.751683f, 0.631609f, 0.479801f, 0.305136f, 0.119699f, -0.064323f, -0.235835f, -0.383842f, -0.498638f, -0.574816f, -0.611505f, -0.610195f, -0.574481f, -0.511148f, -0.428865f, -0.335564f, -0.238096f, -0.143043f, -0.055734f, 0.021001f, 0.085880f, 0.137914f, 0.176979f, 0.204394f, 0.221855f, 0.230580f, 0.231755f, 0.226643f, 0.215971f, 0.200107f, 0.179730f, 0.155526f, 0.127749f, 0.096849f, 0.063819f, 0.029377f, -0.006197f, -0.042042f, -0.076719f, -0.109157f, -0.138085f, -0.160825f, -0.174403f, -0.177268f, -0.168206f, -0.145199f, -0.107970f, -0.060190f, + -0.006824f, 0.048104f, 0.098363f, 0.134090f, 0.147833f, 0.138301f, 0.104724f, 0.045824f, -0.026274f, -0.078996f, -0.083091f, -0.045128f, -0.003292f, 0.012791f, 0.007249f, 0.000493f, 0.000789f, 0.002389f, 0.001492f, 0.000972f, 0.002319f, 0.003080f, 0.002368f, 0.002183f, 0.003054f, 0.003303f, 0.002617f, 0.002416f, 0.002859f, 0.002736f, 0.002007f, 0.001718f, 0.001826f, 0.001446f, 0.000707f, 0.000373f, 0.000270f, -0.000226f, -0.000879f, -0.001162f, -0.001335f, -0.001802f, -0.002255f, -0.002384f, -0.002506f, -0.002821f, -0.002986f, -0.002896f} + }, + { + {0.968441f, 0.987234f, 0.869596f, 0.596073f, 0.334483f, 0.171136f, 0.017776f, -0.161778f, -0.245721f, -0.155540f, 0.006522f, 0.093937f, 0.049496f, -0.140506f, -0.468985f, -0.824439f, -1.026403f, -1.016121f, -0.905691f, -0.796722f, -0.670406f, -0.503266f, -0.362411f, -0.307750f, -0.295462f, -0.254770f, -0.185996f, -0.113263f, -0.005954f, 0.176006f, 0.400292f, 0.595777f, 0.744307f, 0.877077f, 0.990030f, 1.022653f, 0.934836f, 0.765351f, 0.591919f, 0.455498f, 0.344908f, 0.238899f, 0.133289f, 0.027739f, -0.086033f, -0.210079f, -0.329871f, -0.429681f, -0.507904f, -0.568659f, -0.608760f, -0.622380f, -0.610718f, -0.579218f, -0.531546f, -0.471669f, -0.405261f, -0.334310f, -0.255734f, -0.168133f, -0.074958f, 0.019479f, 0.110900f, 0.191660f, 0.253073f, 0.292584f, 0.314355f, 0.323012f, 0.320972f, 0.311128f, 0.297794f, 0.284665f, 0.273984f, 0.266907f, 0.262951f, 0.259722f, 0.253926f, 0.242085f, 0.221157f, 0.190535f, 0.153092f, 0.112713f, 0.071225f, 0.028184f, -0.018416f, -0.072225f, -0.136625f, -0.210590f, -0.287552f, -0.358747f, -0.416020f, -0.451958f, -0.460910f, -0.441509f, -0.397130f, -0.334256f, + -0.261823f, -0.190493f, -0.129257f, -0.082184f, -0.049250f, -0.028772f, -0.017399f, -0.009448f, 0.001351f, 0.020052f, 0.051375f, 0.100649f, 0.171779f, 0.264460f, 0.373677f, 0.490520f, 0.602599f, 0.695221f, 0.754355f, 0.769527f, 0.734768f, 0.648370f, 0.512977f, 0.335735f, 0.127409f, -0.099262f, -0.330468f, -0.551239f, -0.746022f, -0.900770f, -1.004813f, -1.051193f, -1.036965f, -0.964527f, -0.841753f, -0.679493f, -0.489227f, -0.282948f, -0.072808f, 0.131140f, 0.321905f, 0.493472f, 0.639377f, 0.754179f, 0.834298f, 0.876384f, 0.876941f, 0.834703f, 0.751683f, 0.631609f, 0.479801f, 0.305136f, 0.119699f, -0.064323f, -0.235835f, -0.383842f, -0.498638f, -0.574816f, -0.611505f, -0.610195f, -0.574481f, -0.511148f, -0.428865f, -0.335564f, -0.238096f, -0.143043f, -0.055734f, 0.021001f, 0.085880f, 0.137914f, 0.176979f, 0.204394f, 0.221855f, 0.230580f, 0.231755f, 0.226643f, 0.215971f, 0.200107f, 0.179730f, 0.155526f, 0.127749f, 0.096849f, 0.063819f, 0.029377f, -0.006197f, -0.042042f, -0.076719f, -0.109157f, -0.138085f, -0.160825f, -0.174403f, -0.177268f, -0.168206f, -0.145199f, -0.107970f, -0.060190f, + -0.006824f, 0.048104f, 0.098363f, 0.134090f, 0.147833f, 0.138301f, 0.104724f, 0.045824f, -0.026274f, -0.078996f, -0.083091f, -0.045128f, -0.003292f, 0.012791f, 0.007249f, 0.000493f, 0.000789f, 0.002389f, 0.001492f, 0.000972f, 0.002319f, 0.003080f, 0.002368f, 0.002183f, 0.003054f, 0.003303f, 0.002617f, 0.002416f, 0.002859f, 0.002736f, 0.002007f, 0.001718f, 0.001826f, 0.001446f, 0.000707f, 0.000373f, 0.000270f, -0.000226f, -0.000879f, -0.001162f, -0.001335f, -0.001802f, -0.002255f, -0.002384f, -0.002506f, -0.002821f, -0.002986f, -0.002896f}, + {1.101488f, 1.121686f, 1.165024f, 1.224338f, 1.257855f, 1.220486f, 1.149240f, 1.140890f, 1.185728f, 1.128055f, 0.902355f, 0.707875f, 0.788108f, 1.099541f, 1.375119f, 1.484928f, 1.549978f, 1.695559f, 1.876431f, 1.995635f, 2.041427f, 2.028898f, 1.921455f, 1.700966f, 1.448293f, 1.277519f, 1.224020f, 1.244684f, 1.297952f, 1.382592f, 1.515360f, 1.701068f, 1.918656f, 2.122718f, 2.265994f, 2.329628f, 2.329558f, 2.294332f, 2.241762f, 2.173492f, 2.084598f, 1.978110f, 1.871591f, 1.786593f, 1.731800f, 1.700143f, 1.679095f, 1.656899f, 1.622424f, 1.569381f, 1.502234f, 1.432448f, 1.368773f, 1.314020f, 1.268340f, 1.231321f, 1.202278f, 1.180534f, 1.163747f, 1.146145f, 1.121645f, 1.087903f, 1.043613f, 0.983612f, 0.901864f, 0.798972f, 0.683390f, 0.566766f, 0.461005f, 0.376682f, 0.319308f, 0.287365f, 0.275856f, 0.280196f, 0.295624f, 0.315889f, 0.334947f, 0.349113f, 0.357350f, 0.360958f, 0.362742f, 0.364984f, 0.368682f, 0.375343f, 0.387569f, 0.406700f, 0.431922f, 0.462716f, 0.499762f, 0.542220f, 0.586337f, 0.627805f, 0.663761f, 0.692071f, 0.710593f, 0.717887f, + 0.713731f, 0.699041f, 0.675854f, 0.646711f, 0.613681f, 0.578765f, 0.544708f, 0.513648f, 0.485423f, 0.459267f, 0.436523f, 0.419581f, 0.409130f, 0.404828f, 0.407589f, 0.418787f, 0.438090f, 0.464110f, 0.496246f, 0.534436f, 0.578397f, 0.628210f, 0.684323f, 0.746531f, 0.814569f, 0.889456f, 0.972140f, 1.061353f, 1.155269f, 1.254322f, 1.359452f, 1.468434f, 1.577080f, 1.683222f, 1.786114f, 1.882169f, 1.964521f, 2.027143f, 2.066756f, 2.079988f, 2.061244f, 2.005565f, 1.912874f, 1.787215f, 1.631793f, 1.447687f, 1.238656f, 1.013433f, 0.779817f, 0.539619f, 0.293632f, 0.048036f, -0.190045f, -0.420433f, -0.646524f, -0.866314f, -1.074294f, -1.270685f, -1.460857f, -1.646046f, -1.822195f, -1.988192f, -2.148163f, -2.304337f, -2.453363f, -2.591452f, -2.718826f, -2.836782f, -2.942783f, -3.031068f, -3.097979f, -3.144348f, -3.170915f, -3.173977f, -3.149931f, -3.102115f, -3.036603f, -2.952834f, -2.846787f, -2.721688f, -2.584617f, -2.433723f, -2.261283f, -2.067770f, -1.858490f, -1.628464f, -1.366934f, -1.074068f, -0.755851f, -0.407743f, -0.023711f, 0.384421f, 0.796944f, 1.204825f, 1.594892f, 1.931022f, + 2.176602f, 2.317416f, 2.335553f, 2.191195f, 1.867100f, 1.394310f, 0.795503f, 0.073196f, -0.660345f, -1.115477f, -1.048547f, -0.566404f, -0.073872f, 0.126575f, 0.081506f, 0.007169f, -0.000212f, 0.010105f, -0.000437f, -0.007848f, 0.001481f, 0.006032f, -0.001850f, -0.004621f, 0.002044f, 0.003718f, -0.001908f, -0.002879f, 0.001815f, 0.002240f, -0.001726f, -0.001819f, 0.001470f, 0.001293f, -0.001428f, -0.001063f, 0.001166f, 0.000684f, -0.001078f, -0.000479f, 0.000904f, 0.000264f, -0.000723f, -0.000016f, 0.000645f, -0.000071f, -0.000388f, 0.000349f} + }, + { + {1.038216f, 1.104846f, 1.163927f, 1.102788f, 0.923912f, 0.819249f, 0.926472f, 1.059186f, 0.908605f, 0.521079f, 0.320389f, 0.567071f, 1.017483f, 1.260167f, 1.219416f, 1.154021f, 1.266485f, 1.495235f, 1.659357f, 1.659964f, 1.521679f, 1.331268f, 1.173102f, 1.086498f, 1.062729f, 1.084446f, 1.154530f, 1.278122f, 1.436340f, 1.590950f, 1.702153f, 1.739769f, 1.697847f, 1.603508f, 1.493099f, 1.376523f, 1.241975f, 1.094803f, 0.970109f, 0.902161f, 0.896629f, 0.934468f, 0.987453f, 1.027530f, 1.036809f, 1.016896f, 0.982652f, 0.944071f, 0.898806f, 0.841885f, 0.776112f, 0.710836f, 0.654027f, 0.607313f, 0.567432f, 0.531208f, 0.497948f, 0.466697f, 0.434013f, 0.397715f, 0.361295f, 0.330786f, 0.307633f, 0.288052f, 0.269263f, 0.253095f, 0.242705f, 0.238292f, 0.237335f, 0.237844f, 0.240377f, 0.247162f, 0.259729f, 0.277460f, 0.298273f, 0.320255f, 0.342464f, 0.364784f, 0.387656f, 0.411614f, 0.436401f, 0.460723f, 0.483419f, 0.504828f, 0.526542f, 0.549671f, 0.573590f, 0.596528f, 0.617075f, 0.634482f, 0.647342f, 0.652773f, 0.647722f, 0.630886f, 0.603055f, 0.566478f, + 0.524993f, 0.484080f, 0.449179f, 0.423543f, 0.408382f, 0.404761f, 0.414320f, 0.438121f, 0.475810f, 0.526417f, 0.589717f, 0.666444f, 0.756971f, 0.859702f, 0.971057f, 1.087009f, 1.203748f, 1.316495f, 1.419260f, 1.507289f, 1.578795f, 1.632867f, 1.667033f, 1.679088f, 1.670086f, 1.642553f, 1.596178f, 1.528297f, 1.438394f, 1.328645f, 1.199676f, 1.049815f, 0.880200f, 0.697091f, 0.506741f, 0.310961f, 0.110587f, -0.089623f, -0.283659f, -0.470268f, -0.652095f, -0.829533f, -0.999868f, -1.162742f, -1.321790f, -1.479081f, -1.631784f, -1.776619f, -1.914009f, -2.044530f, -2.163955f, -2.265828f, -2.347346f, -2.408663f, -2.447423f, -2.458570f, -2.440006f, -2.394433f, -2.324575f, -2.230407f, -2.112872f, -1.976957f, -1.828529f, -1.670564f, -1.505122f, -1.337013f, -1.172529f, -1.015633f, -0.868055f, -0.732334f, -0.611993f, -0.508636f, -0.421038f, -0.347478f, -0.287300f, -0.239640f, -0.202007f, -0.171116f, -0.144652f, -0.121529f, -0.100585f, -0.079881f, -0.057816f, -0.034356f, -0.010170f, 0.015158f, 0.042807f, 0.072857f, 0.104483f, 0.137917f, 0.174070f, 0.211993f, 0.249072f, 0.283815f, 0.315644f, 0.341936f, + 0.358772f, 0.364654f, 0.359571f, 0.340892f, 0.305378f, 0.254287f, 0.189565f, 0.107161f, 0.007129f, -0.086814f, -0.133950f, -0.115538f, -0.059105f, -0.011956f, 0.004169f, 0.001902f, -0.000382f, 0.000624f, 0.000524f, -0.000621f, -0.000315f, 0.000592f, 0.000256f, -0.000424f, -0.000092f, 0.000403f, 0.000056f, -0.000345f, -0.000050f, 0.000231f, -0.000053f, -0.000269f, -0.000023f, 0.000132f, -0.000078f, -0.000176f, 0.000015f, 0.000089f, -0.000053f, -0.000079f, 0.000051f, 0.000072f, -0.000010f, 0.000002f, 0.000067f, 0.000056f, 0.000030f, 0.000052f}, + {1.038216f, 1.104846f, 1.163927f, 1.102788f, 0.923912f, 0.819249f, 0.926472f, 1.059186f, 0.908605f, 0.521079f, 0.320389f, 0.567071f, 1.017483f, 1.260167f, 1.219416f, 1.154021f, 1.266485f, 1.495235f, 1.659357f, 1.659964f, 1.521679f, 1.331268f, 1.173102f, 1.086498f, 1.062729f, 1.084446f, 1.154530f, 1.278122f, 1.436340f, 1.590950f, 1.702153f, 1.739769f, 1.697847f, 1.603508f, 1.493099f, 1.376523f, 1.241975f, 1.094803f, 0.970109f, 0.902161f, 0.896629f, 0.934468f, 0.987453f, 1.027530f, 1.036809f, 1.016896f, 0.982652f, 0.944071f, 0.898806f, 0.841885f, 0.776112f, 0.710836f, 0.654027f, 0.607313f, 0.567432f, 0.531208f, 0.497948f, 0.466697f, 0.434013f, 0.397715f, 0.361295f, 0.330786f, 0.307633f, 0.288052f, 0.269263f, 0.253095f, 0.242705f, 0.238292f, 0.237335f, 0.237844f, 0.240377f, 0.247162f, 0.259729f, 0.277460f, 0.298273f, 0.320255f, 0.342464f, 0.364784f, 0.387656f, 0.411614f, 0.436401f, 0.460723f, 0.483419f, 0.504828f, 0.526542f, 0.549671f, 0.573590f, 0.596528f, 0.617075f, 0.634482f, 0.647342f, 0.652773f, 0.647722f, 0.630886f, 0.603055f, 0.566478f, + 0.524993f, 0.484080f, 0.449179f, 0.423543f, 0.408382f, 0.404761f, 0.414320f, 0.438121f, 0.475810f, 0.526417f, 0.589717f, 0.666444f, 0.756971f, 0.859702f, 0.971057f, 1.087009f, 1.203748f, 1.316495f, 1.419260f, 1.507289f, 1.578795f, 1.632867f, 1.667033f, 1.679088f, 1.670086f, 1.642553f, 1.596178f, 1.528297f, 1.438394f, 1.328645f, 1.199676f, 1.049815f, 0.880200f, 0.697091f, 0.506741f, 0.310961f, 0.110587f, -0.089623f, -0.283659f, -0.470268f, -0.652095f, -0.829533f, -0.999868f, -1.162742f, -1.321790f, -1.479081f, -1.631784f, -1.776619f, -1.914009f, -2.044530f, -2.163955f, -2.265828f, -2.347346f, -2.408663f, -2.447423f, -2.458570f, -2.440006f, -2.394433f, -2.324575f, -2.230407f, -2.112872f, -1.976957f, -1.828529f, -1.670564f, -1.505122f, -1.337013f, -1.172529f, -1.015633f, -0.868055f, -0.732334f, -0.611993f, -0.508636f, -0.421038f, -0.347478f, -0.287300f, -0.239640f, -0.202007f, -0.171116f, -0.144652f, -0.121529f, -0.100585f, -0.079881f, -0.057816f, -0.034356f, -0.010170f, 0.015158f, 0.042807f, 0.072857f, 0.104483f, 0.137917f, 0.174070f, 0.211993f, 0.249072f, 0.283815f, 0.315644f, 0.341936f, + 0.358772f, 0.364654f, 0.359571f, 0.340892f, 0.305378f, 0.254287f, 0.189565f, 0.107161f, 0.007129f, -0.086814f, -0.133950f, -0.115538f, -0.059105f, -0.011956f, 0.004169f, 0.001902f, -0.000382f, 0.000624f, 0.000524f, -0.000621f, -0.000315f, 0.000592f, 0.000256f, -0.000424f, -0.000092f, 0.000403f, 0.000056f, -0.000345f, -0.000050f, 0.000231f, -0.000053f, -0.000269f, -0.000023f, 0.000132f, -0.000078f, -0.000176f, 0.000015f, 0.000089f, -0.000053f, -0.000079f, 0.000051f, 0.000072f, -0.000010f, 0.000002f, 0.000067f, 0.000056f, 0.000030f, 0.000052f} + }, + { + {0.984080f, 0.970476f, 1.006906f, 1.104260f, 1.216794f, 1.335635f, 1.464294f, 1.533054f, 1.477510f, 1.373694f, 1.348288f, 1.379970f, 1.341218f, 1.215083f, 1.111544f, 1.076764f, 1.041682f, 0.966496f, 0.893479f, 0.840686f, 0.769350f, 0.677157f, 0.617786f, 0.610740f, 0.620021f, 0.628332f, 0.649967f, 0.668214f, 0.639094f, 0.564000f, 0.493341f, 0.454442f, 0.430784f, 0.411315f, 0.408973f, 0.429006f, 0.460805f, 0.502650f, 0.562459f, 0.634539f, 0.699920f, 0.747237f, 0.776345f, 0.788052f, 0.785425f, 0.779422f, 0.782268f, 0.799652f, 0.833592f, 0.884572f, 0.946592f, 1.007188f, 1.054930f, 1.082330f, 1.083817f, 1.058335f, 1.012691f, 0.956250f, 0.893651f, 0.826213f, 0.756564f, 0.687438f, 0.619177f, 0.552166f, 0.489247f, 0.433687f, 0.387315f, 0.351696f, 0.328352f, 0.317105f, 0.316219f, 0.324077f, 0.339216f, 0.359831f, 0.385071f, 0.416020f, 0.454311f, 0.500915f, 0.557014f, 0.624731f, 0.706142f, 0.802040f, 0.911693f, 1.033446f, 1.165920f, 1.308336f, 1.458725f, 1.612356f, 1.763090f, 1.904749f, 2.029174f, 2.125343f, 2.184253f, 2.203656f, 2.185203f, 2.129319f, + 2.037039f, 1.914643f, 1.771288f, 1.612832f, 1.442204f, 1.264496f, 1.086482f, 0.911185f, 0.737532f, 0.566210f, 0.402309f, 0.251448f, 0.116550f, -0.000376f, -0.096273f, -0.169242f, -0.221428f, -0.257657f, -0.281475f, -0.293927f, -0.295924f, -0.289877f, -0.278242f, -0.261940f, -0.241537f, -0.219109f, -0.197455f, -0.177735f, -0.159025f, -0.140026f, -0.120145f, -0.098893f, -0.075279f, -0.048418f, -0.018567f, 0.012653f, 0.043076f, 0.070995f, 0.095137f, 0.113713f, 0.124275f, 0.125072f, 0.115890f, 0.096669f, 0.065855f, 0.021420f, -0.036755f, -0.106849f, -0.187293f, -0.277135f, -0.373714f, -0.471889f, -0.566991f, -0.657229f, -0.741912f, -0.818969f, -0.886425f, -0.945214f, -0.997930f, -1.045205f, -1.085732f, -1.119527f, -1.148452f, -1.173231f, -1.192402f, -1.204919f, -1.211832f, -1.214558f, -1.212985f, -1.206284f, -1.194921f, -1.180840f, -1.165524f, -1.148636f, -1.129578f, -1.109786f, -1.091431f, -1.073946f, -1.054811f, -1.033994f, -1.013549f, -0.992185f, -0.965310f, -0.931378f, -0.892025f, -0.844815f, -0.783136f, -0.704366f, -0.609651f, -0.494994f, -0.352963f, -0.184110f, 0.004235f, 0.209198f, 0.428300f, 0.646026f, + 0.840500f, 0.999858f, 1.113448f, 1.155053f, 1.100378f, 0.951048f, 0.711125f, 0.363726f, -0.066699f, -0.436902f, -0.559600f, -0.399070f, -0.132866f, 0.029384f, 0.043765f, 0.007950f, -0.001756f, 0.005023f, 0.001749f, -0.004233f, -0.000749f, 0.003458f, 0.000224f, -0.002740f, 0.000175f, 0.002291f, -0.000296f, -0.001833f, 0.000392f, 0.001448f, -0.000493f, -0.001223f, 0.000422f, 0.000882f, -0.000505f, -0.000755f, 0.000403f, 0.000509f, -0.000413f, -0.000382f, 0.000355f, 0.000254f, -0.000271f, -0.000091f, 0.000266f, 0.000059f, -0.000112f, 0.000122f}, + {0.883975f, 0.742747f, 0.483914f, 0.188904f, -0.047459f, -0.209233f, -0.344855f, -0.459879f, -0.499939f, -0.451850f, -0.382284f, -0.347274f, -0.330209f, -0.301172f, -0.273988f, -0.260328f, -0.215778f, -0.082603f, 0.135261f, 0.371525f, 0.553401f, 0.638210f, 0.619076f, 0.521305f, 0.383817f, 0.230837f, 0.070028f, -0.082040f, -0.195461f, -0.256180f, -0.280452f, -0.291260f, -0.295978f, -0.293653f, -0.286459f, -0.272643f, -0.239767f, -0.175784f, -0.082109f, 0.027789f, 0.135803f, 0.222618f, 0.272015f, 0.278079f, 0.246877f, 0.190947f, 0.124821f, 0.063584f, 0.018967f, -0.005841f, -0.015723f, -0.017984f, -0.018340f, -0.020401f, -0.025556f, -0.032860f, -0.040363f, -0.046742f, -0.051655f, -0.055748f, -0.060851f, -0.069127f, -0.081442f, -0.096777f, -0.112463f, -0.123699f, -0.123450f, -0.104852f, -0.064843f, -0.005816f, 0.065155f, 0.137891f, 0.201213f, 0.245836f, 0.266654f, 0.262765f, 0.235893f, 0.188819f, 0.124475f, 0.045794f, -0.043343f, -0.136558f, -0.224279f, -0.294747f, -0.336348f, -0.340593f, -0.304985f, -0.234374f, -0.139779f, -0.035298f, 0.065161f, 0.150165f, 0.211935f, 0.246636f, 0.254039f, 0.236891f, + 0.200185f, 0.150350f, 0.094455f, 0.039464f, -0.008619f, -0.045731f, -0.070400f, -0.083602f, -0.087939f, -0.086661f, -0.082872f, -0.078985f, -0.076432f, -0.075622f, -0.076068f, -0.076524f, -0.075078f, -0.069344f, -0.056965f, -0.036414f, -0.007704f, 0.027321f, 0.065163f, 0.101267f, 0.130992f, 0.150629f, 0.157941f, 0.152138f, 0.133674f, 0.104033f, 0.065396f, 0.020338f, -0.028149f, -0.076464f, -0.120497f, -0.155961f, -0.178741f, -0.185412f, -0.174114f, -0.145315f, -0.101960f, -0.049135f, 0.006550f, 0.058125f, 0.099789f, 0.127948f, 0.141382f, 0.140988f, 0.129340f, 0.109801f, 0.085494f, 0.058877f, 0.031865f, 0.005795f, -0.018626f, -0.040919f, -0.060327f, -0.075887f, -0.086696f, -0.091841f, -0.090471f, -0.082358f, -0.068247f, -0.049554f, -0.028075f, -0.006021f, 0.014334f, 0.031377f, 0.044342f, 0.052977f, 0.057575f, 0.059084f, 0.058543f, 0.056491f, 0.053219f, 0.048980f, 0.043403f, 0.035343f, 0.023794f, 0.008214f, -0.012079f, -0.037401f, -0.066035f, -0.094144f, -0.117200f, -0.129987f, -0.126089f, -0.100443f, -0.053216f, 0.010034f, 0.080385f, 0.145063f, 0.187642f, 0.194442f, 0.161633f, 0.094675f, + 0.005067f, -0.087812f, -0.157659f, -0.183614f, -0.160959f, -0.096474f, -0.003389f, 0.088590f, 0.132728f, 0.101387f, 0.023921f, -0.034469f, -0.038942f, -0.013063f, 0.003237f, 0.001212f, -0.002961f, -0.001216f, 0.000276f, -0.001620f, -0.002467f, -0.000772f, -0.000058f, -0.001118f, -0.001152f, 0.000189f, 0.000633f, 0.000071f, 0.000304f, 0.001243f, 0.001427f, 0.001031f, 0.001189f, 0.001646f, 0.001521f, 0.001094f, 0.001029f, 0.001052f, 0.000696f, 0.000238f, 0.000016f, -0.000186f, -0.000559f, -0.000907f, -0.001097f, -0.001249f, -0.001412f, -0.001512f} + }, + { + {0.883975f, 0.742747f, 0.483914f, 0.188904f, -0.047459f, -0.209233f, -0.344855f, -0.459879f, -0.499939f, -0.451850f, -0.382284f, -0.347274f, -0.330209f, -0.301172f, -0.273988f, -0.260328f, -0.215778f, -0.082603f, 0.135261f, 0.371525f, 0.553401f, 0.638210f, 0.619076f, 0.521305f, 0.383817f, 0.230837f, 0.070028f, -0.082040f, -0.195461f, -0.256180f, -0.280452f, -0.291260f, -0.295978f, -0.293653f, -0.286459f, -0.272643f, -0.239767f, -0.175784f, -0.082109f, 0.027789f, 0.135803f, 0.222618f, 0.272015f, 0.278079f, 0.246877f, 0.190947f, 0.124821f, 0.063584f, 0.018967f, -0.005841f, -0.015723f, -0.017984f, -0.018340f, -0.020401f, -0.025556f, -0.032860f, -0.040363f, -0.046742f, -0.051655f, -0.055748f, -0.060851f, -0.069127f, -0.081442f, -0.096777f, -0.112463f, -0.123699f, -0.123450f, -0.104852f, -0.064843f, -0.005816f, 0.065155f, 0.137891f, 0.201213f, 0.245836f, 0.266654f, 0.262765f, 0.235893f, 0.188819f, 0.124475f, 0.045794f, -0.043343f, -0.136558f, -0.224279f, -0.294747f, -0.336348f, -0.340593f, -0.304985f, -0.234374f, -0.139779f, -0.035298f, 0.065161f, 0.150165f, 0.211935f, 0.246636f, 0.254039f, 0.236891f, + 0.200185f, 0.150350f, 0.094455f, 0.039464f, -0.008619f, -0.045731f, -0.070400f, -0.083602f, -0.087939f, -0.086661f, -0.082872f, -0.078985f, -0.076432f, -0.075622f, -0.076068f, -0.076524f, -0.075078f, -0.069344f, -0.056965f, -0.036414f, -0.007704f, 0.027321f, 0.065163f, 0.101267f, 0.130992f, 0.150629f, 0.157941f, 0.152138f, 0.133674f, 0.104033f, 0.065396f, 0.020338f, -0.028149f, -0.076464f, -0.120497f, -0.155961f, -0.178741f, -0.185412f, -0.174114f, -0.145315f, -0.101960f, -0.049135f, 0.006550f, 0.058125f, 0.099789f, 0.127948f, 0.141382f, 0.140988f, 0.129340f, 0.109801f, 0.085494f, 0.058877f, 0.031865f, 0.005795f, -0.018626f, -0.040919f, -0.060327f, -0.075887f, -0.086696f, -0.091841f, -0.090471f, -0.082358f, -0.068247f, -0.049554f, -0.028075f, -0.006021f, 0.014334f, 0.031377f, 0.044342f, 0.052977f, 0.057575f, 0.059084f, 0.058543f, 0.056491f, 0.053219f, 0.048980f, 0.043403f, 0.035343f, 0.023794f, 0.008214f, -0.012079f, -0.037401f, -0.066035f, -0.094144f, -0.117200f, -0.129987f, -0.126089f, -0.100443f, -0.053216f, 0.010034f, 0.080385f, 0.145063f, 0.187642f, 0.194442f, 0.161633f, 0.094675f, + 0.005067f, -0.087812f, -0.157659f, -0.183614f, -0.160959f, -0.096474f, -0.003389f, 0.088590f, 0.132728f, 0.101387f, 0.023921f, -0.034469f, -0.038942f, -0.013063f, 0.003237f, 0.001212f, -0.002961f, -0.001216f, 0.000276f, -0.001620f, -0.002467f, -0.000772f, -0.000058f, -0.001118f, -0.001152f, 0.000189f, 0.000633f, 0.000071f, 0.000304f, 0.001243f, 0.001427f, 0.001031f, 0.001189f, 0.001646f, 0.001521f, 0.001094f, 0.001029f, 0.001052f, 0.000696f, 0.000238f, 0.000016f, -0.000186f, -0.000559f, -0.000907f, -0.001097f, -0.001249f, -0.001412f, -0.001512f}, + {0.984080f, 0.970476f, 1.006906f, 1.104260f, 1.216794f, 1.335635f, 1.464294f, 1.533054f, 1.477510f, 1.373694f, 1.348288f, 1.379970f, 1.341218f, 1.215083f, 1.111544f, 1.076764f, 1.041682f, 0.966496f, 0.893479f, 0.840686f, 0.769350f, 0.677157f, 0.617786f, 0.610740f, 0.620021f, 0.628332f, 0.649967f, 0.668214f, 0.639094f, 0.564000f, 0.493341f, 0.454442f, 0.430784f, 0.411315f, 0.408973f, 0.429006f, 0.460805f, 0.502650f, 0.562459f, 0.634539f, 0.699920f, 0.747237f, 0.776345f, 0.788052f, 0.785425f, 0.779422f, 0.782268f, 0.799652f, 0.833592f, 0.884572f, 0.946592f, 1.007188f, 1.054930f, 1.082330f, 1.083817f, 1.058335f, 1.012691f, 0.956250f, 0.893651f, 0.826213f, 0.756564f, 0.687438f, 0.619177f, 0.552166f, 0.489247f, 0.433687f, 0.387315f, 0.351696f, 0.328352f, 0.317105f, 0.316219f, 0.324077f, 0.339216f, 0.359831f, 0.385071f, 0.416020f, 0.454311f, 0.500915f, 0.557014f, 0.624731f, 0.706142f, 0.802040f, 0.911693f, 1.033446f, 1.165920f, 1.308336f, 1.458725f, 1.612356f, 1.763090f, 1.904749f, 2.029174f, 2.125343f, 2.184253f, 2.203656f, 2.185203f, 2.129319f, + 2.037039f, 1.914643f, 1.771288f, 1.612832f, 1.442204f, 1.264496f, 1.086482f, 0.911185f, 0.737532f, 0.566210f, 0.402309f, 0.251448f, 0.116550f, -0.000376f, -0.096273f, -0.169242f, -0.221428f, -0.257657f, -0.281475f, -0.293927f, -0.295924f, -0.289877f, -0.278242f, -0.261940f, -0.241537f, -0.219109f, -0.197455f, -0.177735f, -0.159025f, -0.140026f, -0.120145f, -0.098893f, -0.075279f, -0.048418f, -0.018567f, 0.012653f, 0.043076f, 0.070995f, 0.095137f, 0.113713f, 0.124275f, 0.125072f, 0.115890f, 0.096669f, 0.065855f, 0.021420f, -0.036755f, -0.106849f, -0.187293f, -0.277135f, -0.373714f, -0.471889f, -0.566991f, -0.657229f, -0.741912f, -0.818969f, -0.886425f, -0.945214f, -0.997930f, -1.045205f, -1.085732f, -1.119527f, -1.148452f, -1.173231f, -1.192402f, -1.204919f, -1.211832f, -1.214558f, -1.212985f, -1.206284f, -1.194921f, -1.180840f, -1.165524f, -1.148636f, -1.129578f, -1.109786f, -1.091431f, -1.073946f, -1.054811f, -1.033994f, -1.013549f, -0.992185f, -0.965310f, -0.931378f, -0.892025f, -0.844815f, -0.783136f, -0.704366f, -0.609651f, -0.494994f, -0.352963f, -0.184110f, 0.004235f, 0.209198f, 0.428300f, 0.646026f, + 0.840500f, 0.999858f, 1.113448f, 1.155053f, 1.100378f, 0.951048f, 0.711125f, 0.363726f, -0.066699f, -0.436902f, -0.559600f, -0.399070f, -0.132866f, 0.029384f, 0.043765f, 0.007950f, -0.001756f, 0.005023f, 0.001749f, -0.004233f, -0.000749f, 0.003458f, 0.000224f, -0.002740f, 0.000175f, 0.002291f, -0.000296f, -0.001833f, 0.000392f, 0.001448f, -0.000493f, -0.001223f, 0.000422f, 0.000882f, -0.000505f, -0.000755f, 0.000403f, 0.000509f, -0.000413f, -0.000382f, 0.000355f, 0.000254f, -0.000271f, -0.000091f, 0.000266f, 0.000059f, -0.000112f, 0.000122f} + }, + { + {1.063474f, 1.043131f, 1.080672f, 1.214000f, 1.381928f, 1.505441f, 1.571766f, 1.596869f, 1.559288f, 1.443460f, 1.315432f, 1.264794f, 1.275827f, 1.246689f, 1.147952f, 1.067945f, 1.069330f, 1.093255f, 1.060696f, 0.991275f, 0.952308f, 0.947628f, 0.931450f, 0.896088f, 0.875184f, 0.877635f, 0.877306f, 0.862455f, 0.851114f, 0.858664f, 0.880945f, 0.907411f, 0.929244f, 0.938406f, 0.935115f, 0.932668f, 0.945105f, 0.975372f, 1.020051f, 1.076159f, 1.138482f, 1.199314f, 1.255133f, 1.306848f, 1.352586f, 1.387511f, 1.411062f, 1.428044f, 1.442949f, 1.457837f, 1.473867f, 1.490422f, 1.504141f, 1.511326f, 1.509565f, 1.496836f, 1.472407f, 1.438435f, 1.397187f, 1.347911f, 1.289991f, 1.226763f, 1.162058f, 1.095742f, 1.026740f, 0.957251f, 0.889862f, 0.823884f, 0.758601f, 0.697267f, 0.644668f, 0.603523f, 0.575533f, 0.562861f, 0.566399f, 0.584922f, 0.616971f, 0.661507f, 0.716950f, 0.782071f, 0.857272f, 0.942702f, 1.036381f, 1.136549f, 1.244199f, 1.360630f, 1.484022f, 1.610883f, 1.739254f, 1.867675f, 1.991785f, 2.104459f, 2.199314f, 2.272351f, 2.319839f, 2.336536f, + 2.318055f, 2.264616f, 2.180165f, 2.067426f, 1.926830f, 1.761394f, 1.578694f, 1.385256f, 1.182714f, 0.972923f, 0.762994f, 0.560921f, 0.369676f, 0.190476f, 0.028730f, -0.108777f, -0.220619f, -0.309841f, -0.378087f, -0.425236f, -0.453644f, -0.468415f, -0.473457f, -0.470028f, -0.459061f, -0.442865f, -0.424328f, -0.405395f, -0.386539f, -0.367682f, -0.349391f, -0.332184f, -0.314542f, -0.293369f, -0.267138f, -0.236981f, -0.204194f, -0.168837f, -0.131697f, -0.095649f, -0.064007f, -0.038874f, -0.021740f, -0.014608f, -0.020128f, -0.040959f, -0.078587f, -0.132851f, -0.203536f, -0.291705f, -0.397394f, -0.516941f, -0.645343f, -0.780070f, -0.919041f, -1.056337f, -1.184558f, -1.300520f, -1.404186f, -1.493222f, -1.563734f, -1.615600f, -1.652081f, -1.674537f, -1.681849f, -1.674638f, -1.656140f, -1.629030f, -1.594189f, -1.552486f, -1.506033f, -1.457814f, -1.410294f, -1.363968f, -1.318341f, -1.274920f, -1.236490f, -1.202485f, -1.169363f, -1.136833f, -1.107851f, -1.080975f, -1.050211f, -1.014006f, -0.975256f, -0.930779f, -0.871463f, -0.793938f, -0.699614f, -0.581833f, -0.428980f, -0.240611f, -0.024812f, 0.217463f, 0.485342f, 0.758970f, + 1.009742f, 1.222711f, 1.383022f, 1.452948f, 1.397393f, 1.216786f, 0.913966f, 0.463363f, -0.102253f, -0.587837f, -0.741210f, -0.518203f, -0.161231f, 0.049607f, 0.061391f, 0.009945f, -0.002758f, 0.007110f, 0.002413f, -0.005996f, -0.001010f, 0.004903f, 0.000261f, -0.003925f, 0.000280f, 0.003284f, -0.000470f, -0.002645f, 0.000624f, 0.002115f, -0.000763f, -0.001772f, 0.000700f, 0.001304f, -0.000805f, -0.001090f, 0.000689f, 0.000741f, -0.000698f, -0.000535f, 0.000618f, 0.000330f, -0.000506f, -0.000092f, 0.000475f, 0.000007f, -0.000267f, 0.000243f}, + {0.905512f, 0.678641f, 0.311373f, -0.074151f, -0.391473f, -0.617374f, -0.746262f, -0.740996f, -0.564331f, -0.254460f, 0.070978f, 0.303423f, 0.417282f, 0.449447f, 0.432211f, 0.367816f, 0.255977f, 0.119310f, -0.009037f, -0.114250f, -0.203912f, -0.281083f, -0.325135f, -0.311110f, -0.241931f, -0.146174f, -0.046109f, 0.054859f, 0.151966f, 0.226035f, 0.259397f, 0.251854f, 0.213115f, 0.150155f, 0.069211f, -0.018634f, -0.100791f, -0.166658f, -0.205638f, -0.209754f, -0.181909f, -0.135245f, -0.081451f, -0.024331f, 0.034856f, 0.091963f, 0.141052f, 0.175632f, 0.187911f, 0.171589f, 0.127151f, 0.062454f, -0.011149f, -0.081170f, -0.135073f, -0.163849f, -0.165675f, -0.145034f, -0.109098f, -0.065479f, -0.020785f, 0.021411f, 0.060865f, 0.097933f, 0.130852f, 0.155355f, 0.165308f, 0.153592f, 0.114488f, 0.047274f, -0.041250f, -0.136303f, -0.216742f, -0.259900f, -0.249627f, -0.183769f, -0.076421f, 0.046233f, 0.154456f, 0.224564f, 0.245543f, 0.219702f, 0.158367f, 0.076598f, -0.010361f, -0.088906f, -0.147863f, -0.178885f, -0.177527f, -0.145152f, -0.089784f, -0.024237f, 0.037621f, 0.084404f, 0.109576f, 0.112370f, + 0.096930f, 0.070039f, 0.038778f, 0.009027f, -0.015303f, -0.032497f, -0.042624f, -0.046771f, -0.046440f, -0.043125f, -0.037867f, -0.031014f, -0.022391f, -0.011633f, 0.001488f, 0.016579f, 0.032114f, 0.045463f, 0.053594f, 0.054013f, 0.045545f, 0.028883f, 0.006695f, -0.016938f, -0.037553f, -0.051342f, -0.055978f, -0.051160f, -0.038603f, -0.021347f, -0.002781f, 0.014142f, 0.027341f, 0.035751f, 0.039167f, 0.037897f, 0.032496f, 0.023714f, 0.012505f, 0.000000f, -0.012486f, -0.023459f, -0.031401f, -0.035090f, -0.033864f, -0.027773f, -0.017676f, -0.005222f, 0.007471f, 0.018343f, 0.025831f, 0.029082f, 0.028059f, 0.023474f, 0.016464f, 0.008192f, -0.000309f, -0.008120f, -0.014522f, -0.019089f, -0.021594f, -0.021867f, -0.019862f, -0.015729f, -0.009742f, -0.002298f, 0.005904f, 0.013865f, 0.020516f, 0.024843f, 0.025909f, 0.023153f, 0.016760f, 0.007563f, -0.003225f, -0.014006f, -0.022916f, -0.028476f, -0.029983f, -0.027181f, -0.020128f, -0.009670f, 0.002656f, 0.015448f, 0.027375f, 0.036285f, 0.039574f, 0.035702f, 0.024364f, 0.005813f, -0.017861f, -0.040900f, -0.055655f, -0.056646f, -0.041947f, -0.012939f, + 0.023511f, 0.054222f, 0.066227f, 0.054969f, 0.024437f, -0.016387f, -0.051673f, -0.060245f, -0.033060f, 0.009957f, 0.033887f, 0.024885f, 0.002528f, -0.007913f, -0.003871f, 0.001012f, 0.000170f, -0.001482f, -0.000477f, 0.000417f, -0.000514f, -0.001048f, -0.000134f, 0.000401f, -0.000132f, -0.000249f, 0.000462f, 0.000732f, 0.000295f, 0.000193f, 0.000558f, 0.000516f, 0.000036f, -0.000136f, -0.000008f, -0.000166f, -0.000521f, -0.000566f, -0.000402f, -0.000420f, -0.000486f, -0.000304f, -0.000043f, 0.000060f, 0.000153f, 0.000366f, 0.000506f, 0.000491f} + }, + { + {0.905512f, 0.678641f, 0.311373f, -0.074151f, -0.391473f, -0.617374f, -0.746262f, -0.740996f, -0.564331f, -0.254460f, 0.070978f, 0.303423f, 0.417282f, 0.449447f, 0.432211f, 0.367816f, 0.255977f, 0.119310f, -0.009037f, -0.114250f, -0.203912f, -0.281083f, -0.325135f, -0.311110f, -0.241931f, -0.146174f, -0.046109f, 0.054859f, 0.151966f, 0.226035f, 0.259397f, 0.251854f, 0.213115f, 0.150155f, 0.069211f, -0.018634f, -0.100791f, -0.166658f, -0.205638f, -0.209754f, -0.181909f, -0.135245f, -0.081451f, -0.024331f, 0.034856f, 0.091963f, 0.141052f, 0.175632f, 0.187911f, 0.171589f, 0.127151f, 0.062454f, -0.011149f, -0.081170f, -0.135073f, -0.163849f, -0.165675f, -0.145034f, -0.109098f, -0.065479f, -0.020785f, 0.021411f, 0.060865f, 0.097933f, 0.130852f, 0.155355f, 0.165308f, 0.153592f, 0.114488f, 0.047274f, -0.041250f, -0.136303f, -0.216742f, -0.259900f, -0.249627f, -0.183769f, -0.076421f, 0.046233f, 0.154456f, 0.224564f, 0.245543f, 0.219702f, 0.158367f, 0.076598f, -0.010361f, -0.088906f, -0.147863f, -0.178885f, -0.177527f, -0.145152f, -0.089784f, -0.024237f, 0.037621f, 0.084404f, 0.109576f, 0.112370f, + 0.096930f, 0.070039f, 0.038778f, 0.009027f, -0.015303f, -0.032497f, -0.042624f, -0.046771f, -0.046440f, -0.043125f, -0.037867f, -0.031014f, -0.022391f, -0.011633f, 0.001488f, 0.016579f, 0.032114f, 0.045463f, 0.053594f, 0.054013f, 0.045545f, 0.028883f, 0.006695f, -0.016938f, -0.037553f, -0.051342f, -0.055978f, -0.051160f, -0.038603f, -0.021347f, -0.002781f, 0.014142f, 0.027341f, 0.035751f, 0.039167f, 0.037897f, 0.032496f, 0.023714f, 0.012505f, 0.000000f, -0.012486f, -0.023459f, -0.031401f, -0.035090f, -0.033864f, -0.027773f, -0.017676f, -0.005222f, 0.007471f, 0.018343f, 0.025831f, 0.029082f, 0.028059f, 0.023474f, 0.016464f, 0.008192f, -0.000309f, -0.008120f, -0.014522f, -0.019089f, -0.021594f, -0.021867f, -0.019862f, -0.015729f, -0.009742f, -0.002298f, 0.005904f, 0.013865f, 0.020516f, 0.024843f, 0.025909f, 0.023153f, 0.016760f, 0.007563f, -0.003225f, -0.014006f, -0.022916f, -0.028476f, -0.029983f, -0.027181f, -0.020128f, -0.009670f, 0.002656f, 0.015448f, 0.027375f, 0.036285f, 0.039574f, 0.035702f, 0.024364f, 0.005813f, -0.017861f, -0.040900f, -0.055655f, -0.056646f, -0.041947f, -0.012939f, + 0.023511f, 0.054222f, 0.066227f, 0.054969f, 0.024437f, -0.016387f, -0.051673f, -0.060245f, -0.033060f, 0.009957f, 0.033887f, 0.024885f, 0.002528f, -0.007913f, -0.003871f, 0.001012f, 0.000170f, -0.001482f, -0.000477f, 0.000417f, -0.000514f, -0.001048f, -0.000134f, 0.000401f, -0.000132f, -0.000249f, 0.000462f, 0.000732f, 0.000295f, 0.000193f, 0.000558f, 0.000516f, 0.000036f, -0.000136f, -0.000008f, -0.000166f, -0.000521f, -0.000566f, -0.000402f, -0.000420f, -0.000486f, -0.000304f, -0.000043f, 0.000060f, 0.000153f, 0.000366f, 0.000506f, 0.000491f}, + {1.063474f, 1.043131f, 1.080672f, 1.214000f, 1.381928f, 1.505441f, 1.571766f, 1.596869f, 1.559288f, 1.443460f, 1.315432f, 1.264794f, 1.275827f, 1.246689f, 1.147952f, 1.067945f, 1.069330f, 1.093255f, 1.060696f, 0.991275f, 0.952308f, 0.947628f, 0.931450f, 0.896088f, 0.875184f, 0.877635f, 0.877306f, 0.862455f, 0.851114f, 0.858664f, 0.880945f, 0.907411f, 0.929244f, 0.938406f, 0.935115f, 0.932668f, 0.945105f, 0.975372f, 1.020051f, 1.076159f, 1.138482f, 1.199314f, 1.255133f, 1.306848f, 1.352586f, 1.387511f, 1.411062f, 1.428044f, 1.442949f, 1.457837f, 1.473867f, 1.490422f, 1.504141f, 1.511326f, 1.509565f, 1.496836f, 1.472407f, 1.438435f, 1.397187f, 1.347911f, 1.289991f, 1.226763f, 1.162058f, 1.095742f, 1.026740f, 0.957251f, 0.889862f, 0.823884f, 0.758601f, 0.697267f, 0.644668f, 0.603523f, 0.575533f, 0.562861f, 0.566399f, 0.584922f, 0.616971f, 0.661507f, 0.716950f, 0.782071f, 0.857272f, 0.942702f, 1.036381f, 1.136549f, 1.244199f, 1.360630f, 1.484022f, 1.610883f, 1.739254f, 1.867675f, 1.991785f, 2.104459f, 2.199314f, 2.272351f, 2.319839f, 2.336536f, + 2.318055f, 2.264616f, 2.180165f, 2.067426f, 1.926830f, 1.761394f, 1.578694f, 1.385256f, 1.182714f, 0.972923f, 0.762994f, 0.560921f, 0.369676f, 0.190476f, 0.028730f, -0.108777f, -0.220619f, -0.309841f, -0.378087f, -0.425236f, -0.453644f, -0.468415f, -0.473457f, -0.470028f, -0.459061f, -0.442865f, -0.424328f, -0.405395f, -0.386539f, -0.367682f, -0.349391f, -0.332184f, -0.314542f, -0.293369f, -0.267138f, -0.236981f, -0.204194f, -0.168837f, -0.131697f, -0.095649f, -0.064007f, -0.038874f, -0.021740f, -0.014608f, -0.020128f, -0.040959f, -0.078587f, -0.132851f, -0.203536f, -0.291705f, -0.397394f, -0.516941f, -0.645343f, -0.780070f, -0.919041f, -1.056337f, -1.184558f, -1.300520f, -1.404186f, -1.493222f, -1.563734f, -1.615600f, -1.652081f, -1.674537f, -1.681849f, -1.674638f, -1.656140f, -1.629030f, -1.594189f, -1.552486f, -1.506033f, -1.457814f, -1.410294f, -1.363968f, -1.318341f, -1.274920f, -1.236490f, -1.202485f, -1.169363f, -1.136833f, -1.107851f, -1.080975f, -1.050211f, -1.014006f, -0.975256f, -0.930779f, -0.871463f, -0.793938f, -0.699614f, -0.581833f, -0.428980f, -0.240611f, -0.024812f, 0.217463f, 0.485342f, 0.758970f, + 1.009742f, 1.222711f, 1.383022f, 1.452948f, 1.397393f, 1.216786f, 0.913966f, 0.463363f, -0.102253f, -0.587837f, -0.741210f, -0.518203f, -0.161231f, 0.049607f, 0.061391f, 0.009945f, -0.002758f, 0.007110f, 0.002413f, -0.005996f, -0.001010f, 0.004903f, 0.000261f, -0.003925f, 0.000280f, 0.003284f, -0.000470f, -0.002645f, 0.000624f, 0.002115f, -0.000763f, -0.001772f, 0.000700f, 0.001304f, -0.000805f, -0.001090f, 0.000689f, 0.000741f, -0.000698f, -0.000535f, 0.000618f, 0.000330f, -0.000506f, -0.000092f, 0.000475f, 0.000007f, -0.000267f, 0.000243f} + }, + { + {1.090612f, 1.124607f, 1.168203f, 1.251890f, 1.418329f, 1.597546f, 1.655179f, 1.582145f, 1.504210f, 1.475289f, 1.403668f, 1.239120f, 1.093260f, 1.081569f, 1.155447f, 1.196594f, 1.194813f, 1.219751f, 1.274331f, 1.294266f, 1.269910f, 1.263313f, 1.300588f, 1.329007f, 1.297460f, 1.221672f, 1.152041f, 1.117220f, 1.113599f, 1.121528f, 1.121547f, 1.114494f, 1.129257f, 1.193632f, 1.297545f, 1.400895f, 1.475605f, 1.523950f, 1.558278f, 1.581891f, 1.594396f, 1.602121f, 1.615403f, 1.640470f, 1.677097f, 1.720927f, 1.766581f, 1.810296f, 1.849698f, 1.880635f, 1.896590f, 1.893026f, 1.870641f, 1.833225f, 1.784630f, 1.729383f, 1.673762f, 1.623245f, 1.579086f, 1.538579f, 1.497829f, 1.452657f, 1.397429f, 1.325606f, 1.233180f, 1.121272f, 0.995053f, 0.861250f, 0.727628f, 0.603189f, 0.495955f, 0.409941f, 0.345638f, 0.303340f, 0.284212f, 0.287909f, 0.311238f, 0.350209f, 0.402431f, 0.467015f, 0.543153f, 0.629394f, 0.723639f, 0.823272f, 0.925269f, 1.026136f, 1.122298f, 1.211920f, 1.296779f, 1.380918f, 1.466626f, 1.552846f, 1.637734f, 1.720181f, 1.796938f, 1.860399f, + 1.901996f, 1.916706f, 1.901778f, 1.852697f, 1.764610f, 1.638066f, 1.479859f, 1.297511f, 1.096512f, 0.884132f, 0.671480f, 0.468197f, 0.277415f, 0.098866f, -0.065566f, -0.213245f, -0.345768f, -0.467783f, -0.580825f, -0.682112f, -0.769567f, -0.844138f, -0.906188f, -0.953219f, -0.983275f, -0.998322f, -1.002195f, -0.996823f, -0.982433f, -0.960340f, -0.933166f, -0.902260f, -0.866678f, -0.825449f, -0.779784f, -0.732273f, -0.684647f, -0.637476f, -0.591811f, -0.549903f, -0.513900f, -0.484651f, -0.462485f, -0.448846f, -0.446501f, -0.458060f, -0.484778f, -0.527243f, -0.586726f, -0.664534f, -0.759541f, -0.867568f, -0.984007f, -1.105517f, -1.227820f, -1.343849f, -1.446666f, -1.533071f, -1.601920f, -1.650494f, -1.675782f, -1.678279f, -1.660970f, -1.625102f, -1.570297f, -1.498421f, -1.413974f, -1.320639f, -1.220302f, -1.115550f, -1.010636f, -0.909518f, -0.814469f, -0.726777f, -0.647886f, -0.579631f, -0.523222f, -0.477897f, -0.441703f, -0.414045f, -0.395476f, -0.384365f, -0.376980f, -0.371994f, -0.370648f, -0.371074f, -0.367650f, -0.357359f, -0.340112f, -0.311253f, -0.261890f, -0.188496f, -0.093373f, 0.024718f, 0.168335f, 0.328881f, + 0.489510f, 0.639645f, 0.770221f, 0.857680f, 0.874965f, 0.814834f, 0.675130f, 0.433231f, 0.090010f, -0.252149f, -0.424257f, -0.353241f, -0.152103f, -0.001328f, 0.031000f, 0.007695f, -0.002042f, 0.003578f, 0.002256f, -0.003204f, -0.001309f, 0.002742f, 0.000775f, -0.002211f, -0.000307f, 0.001911f, 0.000119f, -0.001567f, 0.000027f, 0.001244f, -0.000202f, -0.001092f, 0.000170f, 0.000778f, -0.000312f, -0.000692f, 0.000244f, 0.000463f, -0.000292f, -0.000352f, 0.000267f, 0.000241f, -0.000201f, -0.000080f, 0.000227f, 0.000070f, -0.000076f, 0.000114f}, + {0.917276f, 0.651543f, 0.241263f, -0.179200f, -0.536810f, -0.786529f, -0.861095f, -0.706896f, -0.361415f, 0.046576f, 0.387107f, 0.602460f, 0.691808f, 0.656249f, 0.487165f, 0.202283f, -0.131443f, -0.423124f, -0.603354f, -0.645005f, -0.551682f, -0.342497f, -0.055403f, 0.244110f, 0.476519f, 0.583184f, 0.550153f, 0.400664f, 0.174562f, -0.080033f, -0.307236f, -0.454647f, -0.492004f, -0.418390f, -0.256044f, -0.044660f, 0.162619f, 0.313362f, 0.377265f, 0.354834f, 0.266128f, 0.135954f, -0.009977f, -0.143596f, -0.238634f, -0.278506f, -0.259780f, -0.190547f, -0.088270f, 0.022745f, 0.117338f, 0.177563f, 0.197090f, 0.179340f, 0.132881f, 0.068619f, -0.001036f, -0.063710f, -0.109881f, -0.134545f, -0.136594f, -0.117710f, -0.082176f, -0.036408f, 0.012762f, 0.059536f, 0.098989f, 0.126240f, 0.136203f, 0.123860f, 0.085609f, 0.022846f, -0.054001f, -0.125717f, -0.170830f, -0.174541f, -0.134647f, -0.062373f, 0.021510f, 0.094181f, 0.139095f, 0.150662f, 0.132927f, 0.094500f, 0.044027f, -0.011484f, -0.065806f, -0.111701f, -0.140080f, -0.141689f, -0.111311f, -0.052311f, 0.021787f, 0.090808f, 0.135451f, 0.144793f, + 0.119617f, 0.070364f, 0.011865f, -0.041957f, -0.081346f, -0.101583f, -0.102258f, -0.086016f, -0.057310f, -0.021283f, 0.016947f, 0.052401f, 0.080081f, 0.095197f, 0.093880f, 0.074223f, 0.037586f, -0.010223f, -0.059028f, -0.096507f, -0.111982f, -0.100221f, -0.063756f, -0.012589f, 0.039076f, 0.077825f, 0.095266f, 0.089753f, 0.065616f, 0.030843f, -0.005738f, -0.036776f, -0.057529f, -0.065952f, -0.062341f, -0.048736f, -0.028162f, -0.004067f, 0.019866f, 0.039922f, 0.052856f, 0.056438f, 0.049836f, 0.033935f, 0.011469f, -0.013398f, -0.035916f, -0.051598f, -0.057074f, -0.050971f, -0.034395f, -0.010676f, 0.015312f, 0.037984f, 0.052292f, 0.055175f, 0.046354f, 0.028123f, 0.004662f, -0.018844f, -0.037452f, -0.047700f, -0.048091f, -0.039003f, -0.022561f, -0.002299f, 0.017721f, 0.033814f, 0.043099f, 0.043847f, 0.035955f, 0.020985f, 0.001707f, -0.018215f, -0.034574f, -0.043678f, -0.043517f, -0.034017f, -0.016874f, 0.004283f, 0.024420f, 0.038946f, 0.045076f, 0.041570f, 0.028591f, 0.008573f, -0.013985f, -0.034323f, -0.048076f, -0.050638f, -0.038773f, -0.014129f, 0.016384f, 0.043822f, 0.059238f, 0.054834f, + 0.028889f, -0.009231f, -0.043019f, -0.058834f, -0.050365f, -0.018436f, 0.024349f, 0.051843f, 0.042557f, 0.005228f, -0.025317f, -0.025348f, -0.006082f, 0.006509f, 0.004601f, -0.000170f, 0.000455f, 0.002497f, 0.001552f, 0.000003f, 0.000353f, 0.000671f, -0.000593f, -0.001643f, -0.001255f, -0.000846f, -0.001219f, -0.001146f, -0.000127f, 0.000663f, 0.000752f, 0.000985f, 0.001528f, 0.001552f, 0.000946f, 0.000436f, 0.000126f, -0.000453f, -0.001159f, -0.001450f, -0.001371f, -0.001268f, -0.001021f, -0.000425f, 0.000257f, 0.000753f, 0.001163f, 0.001494f} + }, + { + {0.917276f, 0.651543f, 0.241263f, -0.179200f, -0.536810f, -0.786529f, -0.861095f, -0.706896f, -0.361415f, 0.046576f, 0.387107f, 0.602460f, 0.691808f, 0.656249f, 0.487165f, 0.202283f, -0.131443f, -0.423124f, -0.603354f, -0.645005f, -0.551682f, -0.342497f, -0.055403f, 0.244110f, 0.476519f, 0.583184f, 0.550153f, 0.400664f, 0.174562f, -0.080033f, -0.307236f, -0.454647f, -0.492004f, -0.418390f, -0.256044f, -0.044660f, 0.162619f, 0.313362f, 0.377265f, 0.354834f, 0.266128f, 0.135954f, -0.009977f, -0.143596f, -0.238634f, -0.278506f, -0.259780f, -0.190547f, -0.088270f, 0.022745f, 0.117338f, 0.177563f, 0.197090f, 0.179340f, 0.132881f, 0.068619f, -0.001036f, -0.063710f, -0.109881f, -0.134545f, -0.136594f, -0.117710f, -0.082176f, -0.036408f, 0.012762f, 0.059536f, 0.098989f, 0.126240f, 0.136203f, 0.123860f, 0.085609f, 0.022846f, -0.054001f, -0.125717f, -0.170830f, -0.174541f, -0.134647f, -0.062373f, 0.021510f, 0.094181f, 0.139095f, 0.150662f, 0.132927f, 0.094500f, 0.044027f, -0.011484f, -0.065806f, -0.111701f, -0.140080f, -0.141689f, -0.111311f, -0.052311f, 0.021787f, 0.090808f, 0.135451f, 0.144793f, + 0.119617f, 0.070364f, 0.011865f, -0.041957f, -0.081346f, -0.101583f, -0.102258f, -0.086016f, -0.057310f, -0.021283f, 0.016947f, 0.052401f, 0.080081f, 0.095197f, 0.093880f, 0.074223f, 0.037586f, -0.010223f, -0.059028f, -0.096507f, -0.111982f, -0.100221f, -0.063756f, -0.012589f, 0.039076f, 0.077825f, 0.095266f, 0.089753f, 0.065616f, 0.030843f, -0.005738f, -0.036776f, -0.057529f, -0.065952f, -0.062341f, -0.048736f, -0.028162f, -0.004067f, 0.019866f, 0.039922f, 0.052856f, 0.056438f, 0.049836f, 0.033935f, 0.011469f, -0.013398f, -0.035916f, -0.051598f, -0.057074f, -0.050971f, -0.034395f, -0.010676f, 0.015312f, 0.037984f, 0.052292f, 0.055175f, 0.046354f, 0.028123f, 0.004662f, -0.018844f, -0.037452f, -0.047700f, -0.048091f, -0.039003f, -0.022561f, -0.002299f, 0.017721f, 0.033814f, 0.043099f, 0.043847f, 0.035955f, 0.020985f, 0.001707f, -0.018215f, -0.034574f, -0.043678f, -0.043517f, -0.034017f, -0.016874f, 0.004283f, 0.024420f, 0.038946f, 0.045076f, 0.041570f, 0.028591f, 0.008573f, -0.013985f, -0.034323f, -0.048076f, -0.050638f, -0.038773f, -0.014129f, 0.016384f, 0.043822f, 0.059238f, 0.054834f, + 0.028889f, -0.009231f, -0.043019f, -0.058834f, -0.050365f, -0.018436f, 0.024349f, 0.051843f, 0.042557f, 0.005228f, -0.025317f, -0.025348f, -0.006082f, 0.006509f, 0.004601f, -0.000170f, 0.000455f, 0.002497f, 0.001552f, 0.000003f, 0.000353f, 0.000671f, -0.000593f, -0.001643f, -0.001255f, -0.000846f, -0.001219f, -0.001146f, -0.000127f, 0.000663f, 0.000752f, 0.000985f, 0.001528f, 0.001552f, 0.000946f, 0.000436f, 0.000126f, -0.000453f, -0.001159f, -0.001450f, -0.001371f, -0.001268f, -0.001021f, -0.000425f, 0.000257f, 0.000753f, 0.001163f, 0.001494f}, + {1.090612f, 1.124607f, 1.168203f, 1.251890f, 1.418329f, 1.597546f, 1.655179f, 1.582145f, 1.504210f, 1.475289f, 1.403668f, 1.239120f, 1.093260f, 1.081569f, 1.155447f, 1.196594f, 1.194813f, 1.219751f, 1.274331f, 1.294266f, 1.269910f, 1.263313f, 1.300588f, 1.329007f, 1.297460f, 1.221672f, 1.152041f, 1.117220f, 1.113599f, 1.121528f, 1.121547f, 1.114494f, 1.129257f, 1.193632f, 1.297545f, 1.400895f, 1.475605f, 1.523950f, 1.558278f, 1.581891f, 1.594396f, 1.602121f, 1.615403f, 1.640470f, 1.677097f, 1.720927f, 1.766581f, 1.810296f, 1.849698f, 1.880635f, 1.896590f, 1.893026f, 1.870641f, 1.833225f, 1.784630f, 1.729383f, 1.673762f, 1.623245f, 1.579086f, 1.538579f, 1.497829f, 1.452657f, 1.397429f, 1.325606f, 1.233180f, 1.121272f, 0.995053f, 0.861250f, 0.727628f, 0.603189f, 0.495955f, 0.409941f, 0.345638f, 0.303340f, 0.284212f, 0.287909f, 0.311238f, 0.350209f, 0.402431f, 0.467015f, 0.543153f, 0.629394f, 0.723639f, 0.823272f, 0.925269f, 1.026136f, 1.122298f, 1.211920f, 1.296779f, 1.380918f, 1.466626f, 1.552846f, 1.637734f, 1.720181f, 1.796938f, 1.860399f, + 1.901996f, 1.916706f, 1.901778f, 1.852697f, 1.764610f, 1.638066f, 1.479859f, 1.297511f, 1.096512f, 0.884132f, 0.671480f, 0.468197f, 0.277415f, 0.098866f, -0.065566f, -0.213245f, -0.345768f, -0.467783f, -0.580825f, -0.682112f, -0.769567f, -0.844138f, -0.906188f, -0.953219f, -0.983275f, -0.998322f, -1.002195f, -0.996823f, -0.982433f, -0.960340f, -0.933166f, -0.902260f, -0.866678f, -0.825449f, -0.779784f, -0.732273f, -0.684647f, -0.637476f, -0.591811f, -0.549903f, -0.513900f, -0.484651f, -0.462485f, -0.448846f, -0.446501f, -0.458060f, -0.484778f, -0.527243f, -0.586726f, -0.664534f, -0.759541f, -0.867568f, -0.984007f, -1.105517f, -1.227820f, -1.343849f, -1.446666f, -1.533071f, -1.601920f, -1.650494f, -1.675782f, -1.678279f, -1.660970f, -1.625102f, -1.570297f, -1.498421f, -1.413974f, -1.320639f, -1.220302f, -1.115550f, -1.010636f, -0.909518f, -0.814469f, -0.726777f, -0.647886f, -0.579631f, -0.523222f, -0.477897f, -0.441703f, -0.414045f, -0.395476f, -0.384365f, -0.376980f, -0.371994f, -0.370648f, -0.371074f, -0.367650f, -0.357359f, -0.340112f, -0.311253f, -0.261890f, -0.188496f, -0.093373f, 0.024718f, 0.168335f, 0.328881f, + 0.489510f, 0.639645f, 0.770221f, 0.857680f, 0.874965f, 0.814834f, 0.675130f, 0.433231f, 0.090010f, -0.252149f, -0.424257f, -0.353241f, -0.152103f, -0.001328f, 0.031000f, 0.007695f, -0.002042f, 0.003578f, 0.002256f, -0.003204f, -0.001309f, 0.002742f, 0.000775f, -0.002211f, -0.000307f, 0.001911f, 0.000119f, -0.001567f, 0.000027f, 0.001244f, -0.000202f, -0.001092f, 0.000170f, 0.000778f, -0.000312f, -0.000692f, 0.000244f, 0.000463f, -0.000292f, -0.000352f, 0.000267f, 0.000241f, -0.000201f, -0.000080f, 0.000227f, 0.000070f, -0.000076f, 0.000114f} + }, + { + {1.112397f, 1.111335f, 1.098541f, 1.066221f, 1.017869f, 0.956090f, 0.875304f, 0.794051f, 0.783469f, 0.912714f, 1.154418f, 1.390208f, 1.523919f, 1.546110f, 1.485727f, 1.366225f, 1.230008f, 1.138792f, 1.115300f, 1.133121f, 1.181544f, 1.281430f, 1.418100f, 1.522549f, 1.547535f, 1.511683f, 1.451956f, 1.387778f, 1.346726f, 1.365986f, 1.445028f, 1.543010f, 1.636980f, 1.737911f, 1.841344f, 1.911123f, 1.925970f, 1.902958f, 1.864891f, 1.818149f, 1.768283f, 1.725885f, 1.690633f, 1.652687f, 1.611399f, 1.574846f, 1.545035f, 1.519441f, 1.500076f, 1.487021f, 1.471806f, 1.449320f, 1.426872f, 1.411941f, 1.401090f, 1.388324f, 1.373527f, 1.356198f, 1.331235f, 1.296699f, 1.257813f, 1.219852f, 1.183552f, 1.148414f, 1.114230f, 1.078765f, 1.038071f, 0.988570f, 0.927224f, 0.852801f, 0.768254f, 0.678135f, 0.583726f, 0.485145f, 0.386694f, 0.294105f, 0.207911f, 0.125603f, 0.048642f, -0.018544f, -0.074526f, -0.120226f, -0.154508f, -0.175796f, -0.186470f, -0.191357f, -0.193244f, -0.192820f, -0.191313f, -0.190742f, -0.192655f, -0.197592f, -0.204686f, -0.211940f, -0.218191f, -0.223996f, + -0.229614f, -0.234043f, -0.237357f, -0.241595f, -0.247842f, -0.254765f, -0.261227f, -0.267732f, -0.274126f, -0.278339f, -0.278541f, -0.274550f, -0.266501f, -0.253999f, -0.237013f, -0.216199f, -0.192291f, -0.166066f, -0.138455f, -0.109952f, -0.080598f, -0.050885f, -0.021663f, 0.007056f, 0.036069f, 0.065697f, 0.095709f, 0.126372f, 0.158482f, 0.192519f, 0.228577f, 0.266713f, 0.306680f, 0.347771f, 0.389146f, 0.429545f, 0.466699f, 0.498178f, 0.522837f, 0.540306f, 0.549440f, 0.548884f, 0.538969f, 0.521289f, 0.496435f, 0.463906f, 0.424432f, 0.380495f, 0.333949f, 0.284714f, 0.232690f, 0.179455f, 0.126660f, 0.073750f, 0.018927f, -0.038141f, -0.096401f, -0.156100f, -0.219366f, -0.287580f, -0.359934f, -0.435593f, -0.515692f, -0.601760f, -0.693176f, -0.787894f, -0.885348f, -0.986812f, -1.092377f, -1.199339f, -1.304999f, -1.409414f, -1.512886f, -1.612037f, -1.701983f, -1.781517f, -1.851454f, -1.908356f, -1.945802f, -1.961831f, -1.958173f, -1.932021f, -1.876786f, -1.791263f, -1.678747f, -1.537128f, -1.360504f, -1.150068f, -0.911518f, -0.643518f, -0.342730f, -0.017884f, 0.315739f, 0.650088f, 0.975129f, 1.264156f, + 1.488607f, 1.636372f, 1.693967f, 1.630407f, 1.428523f, 1.107711f, 0.682977f, 0.150519f, -0.414826f, -0.794658f, -0.785457f, -0.443271f, -0.068780f, 0.093541f, 0.063908f, 0.005868f, -0.000970f, 0.007761f, 0.000201f, -0.006097f, 0.000758f, 0.004704f, -0.001139f, -0.003615f, 0.001333f, 0.002891f, -0.001274f, -0.002236f, 0.001223f, 0.001737f, -0.001161f, -0.001399f, 0.000983f, 0.001007f, -0.000943f, -0.000823f, 0.000756f, 0.000549f, -0.000686f, -0.000398f, 0.000560f, 0.000246f, -0.000432f, -0.000077f, 0.000374f, 0.000016f, -0.000200f, 0.000171f}, + {1.079532f, 0.998235f, 0.850285f, 0.632018f, 0.357346f, 0.123599f, 0.061032f, 0.193395f, 0.396567f, 0.503127f, 0.416351f, 0.150118f, -0.179415f, -0.415063f, -0.477564f, -0.429570f, -0.389527f, -0.407796f, -0.468131f, -0.564318f, -0.698134f, -0.821601f, -0.860464f, -0.802613f, -0.711179f, -0.646626f, -0.616838f, -0.600835f, -0.578635f, -0.531502f, -0.444474f, -0.319603f, -0.174456f, -0.029034f, 0.098083f, 0.192379f, 0.255844f, 0.309193f, 0.371530f, 0.443415f, 0.513712f, 0.573199f, 0.617309f, 0.645288f, 0.661423f, 0.670890f, 0.673012f, 0.663713f, 0.642750f, 0.612720f, 0.573583f, 0.523581f, 0.462385f, 0.389021f, 0.300903f, 0.198899f, 0.089326f, -0.021841f, -0.132388f, -0.239961f, -0.339980f, -0.429136f, -0.506573f, -0.570849f, -0.620035f, -0.654986f, -0.678245f, -0.689440f, -0.685055f, -0.662509f, -0.621947f, -0.565149f, -0.495302f, -0.416936f, -0.333854f, -0.247460f, -0.158080f, -0.067051f, 0.023100f, 0.109595f, 0.190031f, 0.262592f, 0.325631f, 0.377009f, 0.414640f, 0.437919f, 0.447796f, 0.445623f, 0.433020f, 0.412348f, 0.385712f, 0.353870f, 0.317429f, 0.278358f, 0.238872f, 0.199766f, + 0.161294f, 0.124650f, 0.091143f, 0.061005f, 0.034231f, 0.011511f, -0.006807f, -0.021643f, -0.034229f, -0.045190f, -0.055109f, -0.065027f, -0.075849f, -0.087949f, -0.101562f, -0.117035f, -0.134702f, -0.154843f, -0.177496f, -0.202093f, -0.227631f, -0.253106f, -0.277270f, -0.298322f, -0.314656f, -0.325557f, -0.330409f, -0.327905f, -0.316927f, -0.297427f, -0.269514f, -0.232668f, -0.186868f, -0.133498f, -0.074069f, -0.009081f, 0.060877f, 0.133983f, 0.208161f, 0.282088f, 0.354192f, 0.421685f, 0.481644f, 0.532174f, 0.571494f, 0.596761f, 0.604942f, 0.594297f, 0.564069f, 0.513440f, 0.442118f, 0.351723f, 0.245530f, 0.127080f, 0.000223f, -0.129716f, -0.256333f, -0.374029f, -0.478501f, -0.565544f, -0.631076f, -0.672761f, -0.690270f, -0.683689f, -0.653190f, -0.600488f, -0.528942f, -0.441782f, -0.341626f, -0.231834f, -0.116682f, 0.000025f, 0.115102f, 0.224739f, 0.324534f, 0.410755f, 0.480542f, 0.531232f, 0.560568f, 0.567324f, 0.551195f, 0.512675f, 0.453339f, 0.375548f, 0.282095f, 0.176868f, 0.064992f, -0.048667f, -0.159757f, -0.262283f, -0.348547f, -0.412313f, -0.449169f, -0.453477f, -0.420000f, -0.349978f, + -0.250616f, -0.128884f, 0.006377f, 0.136800f, 0.239873f, 0.302094f, 0.314297f, 0.258860f, 0.129198f, -0.029823f, -0.132433f, -0.129413f, -0.059728f, -0.002602f, 0.007785f, -0.003487f, -0.007105f, -0.003815f, -0.004401f, -0.007051f, -0.005952f, -0.003689f, -0.004348f, -0.005493f, -0.004189f, -0.002643f, -0.003012f, -0.003342f, -0.002058f, -0.000889f, -0.000982f, -0.000846f, 0.000322f, 0.001228f, 0.001317f, 0.001678f, 0.002649f, 0.003310f, 0.003474f, 0.003877f, 0.004575f, 0.004982f, 0.005126f, 0.005431f, 0.005798f, 0.005946f, 0.006011f, 0.006127f} + }, + { + {1.079532f, 0.998235f, 0.850285f, 0.632018f, 0.357346f, 0.123599f, 0.061032f, 0.193395f, 0.396567f, 0.503127f, 0.416351f, 0.150118f, -0.179415f, -0.415063f, -0.477564f, -0.429570f, -0.389527f, -0.407796f, -0.468131f, -0.564318f, -0.698134f, -0.821601f, -0.860464f, -0.802613f, -0.711179f, -0.646626f, -0.616838f, -0.600835f, -0.578635f, -0.531502f, -0.444474f, -0.319603f, -0.174456f, -0.029034f, 0.098083f, 0.192379f, 0.255844f, 0.309193f, 0.371530f, 0.443415f, 0.513712f, 0.573199f, 0.617309f, 0.645288f, 0.661423f, 0.670890f, 0.673012f, 0.663713f, 0.642750f, 0.612720f, 0.573583f, 0.523581f, 0.462385f, 0.389021f, 0.300903f, 0.198899f, 0.089326f, -0.021841f, -0.132388f, -0.239961f, -0.339980f, -0.429136f, -0.506573f, -0.570849f, -0.620035f, -0.654986f, -0.678245f, -0.689440f, -0.685055f, -0.662509f, -0.621947f, -0.565149f, -0.495302f, -0.416936f, -0.333854f, -0.247460f, -0.158080f, -0.067051f, 0.023100f, 0.109595f, 0.190031f, 0.262592f, 0.325631f, 0.377009f, 0.414640f, 0.437919f, 0.447796f, 0.445623f, 0.433020f, 0.412348f, 0.385712f, 0.353870f, 0.317429f, 0.278358f, 0.238872f, 0.199766f, + 0.161294f, 0.124650f, 0.091143f, 0.061005f, 0.034231f, 0.011511f, -0.006807f, -0.021643f, -0.034229f, -0.045190f, -0.055109f, -0.065027f, -0.075849f, -0.087949f, -0.101562f, -0.117035f, -0.134702f, -0.154843f, -0.177496f, -0.202093f, -0.227631f, -0.253106f, -0.277270f, -0.298322f, -0.314656f, -0.325557f, -0.330409f, -0.327905f, -0.316927f, -0.297427f, -0.269514f, -0.232668f, -0.186868f, -0.133498f, -0.074069f, -0.009081f, 0.060877f, 0.133983f, 0.208161f, 0.282088f, 0.354192f, 0.421685f, 0.481644f, 0.532174f, 0.571494f, 0.596761f, 0.604942f, 0.594297f, 0.564069f, 0.513440f, 0.442118f, 0.351723f, 0.245530f, 0.127080f, 0.000223f, -0.129716f, -0.256333f, -0.374029f, -0.478501f, -0.565544f, -0.631076f, -0.672761f, -0.690270f, -0.683689f, -0.653190f, -0.600488f, -0.528942f, -0.441782f, -0.341626f, -0.231834f, -0.116682f, 0.000025f, 0.115102f, 0.224739f, 0.324534f, 0.410755f, 0.480542f, 0.531232f, 0.560568f, 0.567324f, 0.551195f, 0.512675f, 0.453339f, 0.375548f, 0.282095f, 0.176868f, 0.064992f, -0.048667f, -0.159757f, -0.262283f, -0.348547f, -0.412313f, -0.449169f, -0.453477f, -0.420000f, -0.349978f, + -0.250616f, -0.128884f, 0.006377f, 0.136800f, 0.239873f, 0.302094f, 0.314297f, 0.258860f, 0.129198f, -0.029823f, -0.132433f, -0.129413f, -0.059728f, -0.002602f, 0.007785f, -0.003487f, -0.007105f, -0.003815f, -0.004401f, -0.007051f, -0.005952f, -0.003689f, -0.004348f, -0.005493f, -0.004189f, -0.002643f, -0.003012f, -0.003342f, -0.002058f, -0.000889f, -0.000982f, -0.000846f, 0.000322f, 0.001228f, 0.001317f, 0.001678f, 0.002649f, 0.003310f, 0.003474f, 0.003877f, 0.004575f, 0.004982f, 0.005126f, 0.005431f, 0.005798f, 0.005946f, 0.006011f, 0.006127f}, + {1.112397f, 1.111335f, 1.098541f, 1.066221f, 1.017869f, 0.956090f, 0.875304f, 0.794051f, 0.783469f, 0.912714f, 1.154418f, 1.390208f, 1.523919f, 1.546110f, 1.485727f, 1.366225f, 1.230008f, 1.138792f, 1.115300f, 1.133121f, 1.181544f, 1.281430f, 1.418100f, 1.522549f, 1.547535f, 1.511683f, 1.451956f, 1.387778f, 1.346726f, 1.365986f, 1.445028f, 1.543010f, 1.636980f, 1.737911f, 1.841344f, 1.911123f, 1.925970f, 1.902958f, 1.864891f, 1.818149f, 1.768283f, 1.725885f, 1.690633f, 1.652687f, 1.611399f, 1.574846f, 1.545035f, 1.519441f, 1.500076f, 1.487021f, 1.471806f, 1.449320f, 1.426872f, 1.411941f, 1.401090f, 1.388324f, 1.373527f, 1.356198f, 1.331235f, 1.296699f, 1.257813f, 1.219852f, 1.183552f, 1.148414f, 1.114230f, 1.078765f, 1.038071f, 0.988570f, 0.927224f, 0.852801f, 0.768254f, 0.678135f, 0.583726f, 0.485145f, 0.386694f, 0.294105f, 0.207911f, 0.125603f, 0.048642f, -0.018544f, -0.074526f, -0.120226f, -0.154508f, -0.175796f, -0.186470f, -0.191357f, -0.193244f, -0.192820f, -0.191313f, -0.190742f, -0.192655f, -0.197592f, -0.204686f, -0.211940f, -0.218191f, -0.223996f, + -0.229614f, -0.234043f, -0.237357f, -0.241595f, -0.247842f, -0.254765f, -0.261227f, -0.267732f, -0.274126f, -0.278339f, -0.278541f, -0.274550f, -0.266501f, -0.253999f, -0.237013f, -0.216199f, -0.192291f, -0.166066f, -0.138455f, -0.109952f, -0.080598f, -0.050885f, -0.021663f, 0.007056f, 0.036069f, 0.065697f, 0.095709f, 0.126372f, 0.158482f, 0.192519f, 0.228577f, 0.266713f, 0.306680f, 0.347771f, 0.389146f, 0.429545f, 0.466699f, 0.498178f, 0.522837f, 0.540306f, 0.549440f, 0.548884f, 0.538969f, 0.521289f, 0.496435f, 0.463906f, 0.424432f, 0.380495f, 0.333949f, 0.284714f, 0.232690f, 0.179455f, 0.126660f, 0.073750f, 0.018927f, -0.038141f, -0.096401f, -0.156100f, -0.219366f, -0.287580f, -0.359934f, -0.435593f, -0.515692f, -0.601760f, -0.693176f, -0.787894f, -0.885348f, -0.986812f, -1.092377f, -1.199339f, -1.304999f, -1.409414f, -1.512886f, -1.612037f, -1.701983f, -1.781517f, -1.851454f, -1.908356f, -1.945802f, -1.961831f, -1.958173f, -1.932021f, -1.876786f, -1.791263f, -1.678747f, -1.537128f, -1.360504f, -1.150068f, -0.911518f, -0.643518f, -0.342730f, -0.017884f, 0.315739f, 0.650088f, 0.975129f, 1.264156f, + 1.488607f, 1.636372f, 1.693967f, 1.630407f, 1.428523f, 1.107711f, 0.682977f, 0.150519f, -0.414826f, -0.794658f, -0.785457f, -0.443271f, -0.068780f, 0.093541f, 0.063908f, 0.005868f, -0.000970f, 0.007761f, 0.000201f, -0.006097f, 0.000758f, 0.004704f, -0.001139f, -0.003615f, 0.001333f, 0.002891f, -0.001274f, -0.002236f, 0.001223f, 0.001737f, -0.001161f, -0.001399f, 0.000983f, 0.001007f, -0.000943f, -0.000823f, 0.000756f, 0.000549f, -0.000686f, -0.000398f, 0.000560f, 0.000246f, -0.000432f, -0.000077f, 0.000374f, 0.000016f, -0.000200f, 0.000171f} + }, + { + {1.075228f, 1.074217f, 1.098140f, 1.181350f, 1.301845f, 1.357285f, 1.275591f, 1.128376f, 1.051750f, 1.070717f, 1.096449f, 1.090338f, 1.120506f, 1.232710f, 1.365528f, 1.439321f, 1.453889f, 1.448913f, 1.426184f, 1.363771f, 1.270441f, 1.179270f, 1.105288f, 1.040796f, 0.980197f, 0.926868f, 0.882359f, 0.842806f, 0.803055f, 0.760151f, 0.717484f, 0.684947f, 0.668443f, 0.661086f, 0.651027f, 0.635243f, 0.620475f, 0.614727f, 0.622795f, 0.645718f, 0.679665f, 0.718175f, 0.758038f, 0.800110f, 0.844051f, 0.886529f, 0.924692f, 0.957013f, 0.980790f, 0.992993f, 0.994090f, 0.988656f, 0.982771f, 0.982211f, 0.991140f, 1.010513f, 1.038521f, 1.072547f, 1.108778f, 1.140961f, 1.163036f, 1.172913f, 1.171176f, 1.157532f, 1.131991f, 1.098142f, 1.061279f, 1.023708f, 0.984783f, 0.944459f, 0.903598f, 0.861374f, 0.815358f, 0.764360f, 0.709449f, 0.652291f, 0.594010f, 0.536028f, 0.481101f, 0.432577f, 0.392126f, 0.358508f, 0.329185f, 0.302679f, 0.278373f, 0.255008f, 0.231647f, 0.210110f, 0.194471f, 0.187914f, 0.191535f, 0.205810f, 0.231239f, 0.267417f, 0.313051f, 0.367052f, + 0.428780f, 0.497528f, 0.572254f, 0.650956f, 0.729921f, 0.804741f, 0.872337f, 0.930763f, 0.977405f, 1.009536f, 1.026754f, 1.030560f, 1.021257f, 0.997590f, 0.959821f, 0.910708f, 0.852633f, 0.785962f, 0.711354f, 0.631836f, 0.551033f, 0.470413f, 0.389791f, 0.309952f, 0.232974f, 0.159655f, 0.088252f, 0.016873f, -0.054104f, -0.123545f, -0.192358f, -0.262428f, -0.333151f, -0.401582f, -0.466079f, -0.527128f, -0.584149f, -0.634249f, -0.675298f, -0.707980f, -0.733621f, -0.751956f, -0.762482f, -0.766603f, -0.766968f, -0.765342f, -0.762185f, -0.758077f, -0.754691f, -0.753935f, -0.756401f, -0.761422f, -0.768926f, -0.780180f, -0.795912f, -0.814860f, -0.835536f, -0.858323f, -0.884145f, -0.912038f, -0.940032f, -0.967764f, -0.996212f, -1.025203f, -1.053082f, -1.078812f, -1.102840f, -1.125506f, -1.145684f, -1.161599f, -1.172538f, -1.178913f, -1.180387f, -1.174972f, -1.161052f, -1.139243f, -1.110357f, -1.072659f, -1.023765f, -0.964129f, -0.895301f, -0.815955f, -0.723787f, -0.620170f, -0.508278f, -0.387981f, -0.257793f, -0.120228f, 0.020407f, 0.163291f, 0.307901f, 0.448205f, 0.576448f, 0.689077f, 0.782089f, 0.845678f, + 0.871365f, 0.858316f, 0.804990f, 0.704160f, 0.556014f, 0.373959f, 0.167059f, -0.061388f, -0.274981f, -0.389171f, -0.341539f, -0.176854f, -0.021227f, 0.039404f, 0.025278f, 0.002978f, 0.000409f, 0.002891f, -0.000311f, -0.002218f, 0.000555f, 0.001691f, -0.000622f, -0.001274f, 0.000673f, 0.001036f, -0.000604f, -0.000793f, 0.000565f, 0.000609f, -0.000540f, -0.000507f, 0.000441f, 0.000341f, -0.000443f, -0.000297f, 0.000346f, 0.000177f, -0.000328f, -0.000127f, 0.000272f, 0.000068f, -0.000213f, 0.000010f, 0.000202f, -0.000020f, -0.000110f, 0.000118f}, + {0.960164f, 0.815843f, 0.531669f, 0.162241f, -0.177975f, -0.386498f, -0.458945f, -0.483857f, -0.540697f, -0.614327f, -0.622418f, -0.516530f, -0.334536f, -0.152125f, -0.004747f, 0.127804f, 0.271853f, 0.415700f, 0.517397f, 0.544153f, 0.497988f, 0.408320f, 0.305313f, 0.199510f, 0.083932f, -0.046923f, -0.183178f, -0.304770f, -0.395308f, -0.446238f, -0.451453f, -0.406776f, -0.317346f, -0.200175f, -0.075711f, 0.041366f, 0.142528f, 0.221292f, 0.272837f, 0.296528f, 0.295977f, 0.276382f, 0.242550f, 0.198393f, 0.146578f, 0.088571f, 0.025674f, -0.040051f, -0.105991f, -0.169238f, -0.225788f, -0.269676f, -0.293768f, -0.292136f, -0.262445f, -0.206810f, -0.130729f, -0.041117f, 0.054787f, 0.149042f, 0.232461f, 0.295490f, 0.330311f, 0.332628f, 0.302198f, 0.242289f, 0.158692f, 0.058771f, -0.048931f, -0.154433f, -0.246059f, -0.311363f, -0.339768f, -0.325985f, -0.272328f, -0.188549f, -0.089389f, 0.009037f, 0.093008f, 0.154155f, 0.190458f, 0.204754f, 0.201895f, 0.186430f, 0.161684f, 0.129742f, 0.091813f, 0.048922f, 0.002809f, -0.043495f, -0.085773f, -0.119474f, -0.141000f, -0.148803f, -0.143583f, -0.127578f, + -0.103627f, -0.074551f, -0.042812f, -0.010339f, 0.021376f, 0.050997f, 0.077158f, 0.098471f, 0.113527f, 0.120939f, 0.119561f, 0.108808f, 0.088872f, 0.060853f, 0.026832f, -0.010246f, -0.046936f, -0.079690f, -0.105211f, -0.120885f, -0.125248f, -0.118175f, -0.100717f, -0.074832f, -0.043111f, -0.008423f, 0.026401f, 0.058658f, 0.085759f, 0.105330f, 0.115404f, 0.114607f, 0.102460f, 0.079827f, 0.049121f, 0.014021f, -0.021124f, -0.052008f, -0.075132f, -0.088436f, -0.091490f, -0.085272f, -0.071781f, -0.053587f, -0.033279f, -0.013025f, 0.005554f, 0.021381f, 0.033930f, 0.043117f, 0.049029f, 0.051772f, 0.051505f, 0.048423f, 0.042645f, 0.034289f, 0.023665f, 0.011301f, -0.002140f, -0.015816f, -0.028671f, -0.039612f, -0.047707f, -0.052177f, -0.052427f, -0.048237f, -0.039850f, -0.027849f, -0.013136f, 0.003001f, 0.019065f, 0.033635f, 0.045427f, 0.053308f, 0.056554f, 0.054950f, 0.048521f, 0.037482f, 0.022572f, 0.005028f, -0.013904f, -0.032933f, -0.050205f, -0.063494f, -0.070939f, -0.070952f, -0.061845f, -0.042817f, -0.015369f, 0.017025f, 0.049963f, 0.077740f, 0.093374f, 0.091532f, 0.071535f, 0.036751f, + -0.006902f, -0.049951f, -0.080077f, -0.088199f, -0.073181f, -0.039187f, 0.006496f, 0.048670f, 0.065160f, 0.045077f, 0.005480f, -0.021584f, -0.021385f, -0.007456f, 0.000767f, 0.000082f, -0.001293f, 0.000161f, 0.001281f, 0.000763f, 0.000790f, 0.001871f, 0.002246f, 0.001673f, 0.001523f, 0.001855f, 0.001581f, 0.000775f, 0.000337f, 0.000178f, -0.000363f, -0.001094f, -0.001446f, -0.001566f, -0.001845f, -0.002088f, -0.001986f, -0.001712f, -0.001491f, -0.001185f, -0.000679f, -0.000134f, 0.000334f, 0.000795f, 0.001259f, 0.001626f, 0.001858f, 0.001978f} + }, + { + {0.960164f, 0.815843f, 0.531669f, 0.162241f, -0.177975f, -0.386498f, -0.458945f, -0.483857f, -0.540697f, -0.614327f, -0.622418f, -0.516530f, -0.334536f, -0.152125f, -0.004747f, 0.127804f, 0.271853f, 0.415700f, 0.517397f, 0.544153f, 0.497988f, 0.408320f, 0.305313f, 0.199510f, 0.083932f, -0.046923f, -0.183178f, -0.304770f, -0.395308f, -0.446238f, -0.451453f, -0.406776f, -0.317346f, -0.200175f, -0.075711f, 0.041366f, 0.142528f, 0.221292f, 0.272837f, 0.296528f, 0.295977f, 0.276382f, 0.242550f, 0.198393f, 0.146578f, 0.088571f, 0.025674f, -0.040051f, -0.105991f, -0.169238f, -0.225788f, -0.269676f, -0.293768f, -0.292136f, -0.262445f, -0.206810f, -0.130729f, -0.041117f, 0.054787f, 0.149042f, 0.232461f, 0.295490f, 0.330311f, 0.332628f, 0.302198f, 0.242289f, 0.158692f, 0.058771f, -0.048931f, -0.154433f, -0.246059f, -0.311363f, -0.339768f, -0.325985f, -0.272328f, -0.188549f, -0.089389f, 0.009037f, 0.093008f, 0.154155f, 0.190458f, 0.204754f, 0.201895f, 0.186430f, 0.161684f, 0.129742f, 0.091813f, 0.048922f, 0.002809f, -0.043495f, -0.085773f, -0.119474f, -0.141000f, -0.148803f, -0.143583f, -0.127578f, + -0.103627f, -0.074551f, -0.042812f, -0.010339f, 0.021376f, 0.050997f, 0.077158f, 0.098471f, 0.113527f, 0.120939f, 0.119561f, 0.108808f, 0.088872f, 0.060853f, 0.026832f, -0.010246f, -0.046936f, -0.079690f, -0.105211f, -0.120885f, -0.125248f, -0.118175f, -0.100717f, -0.074832f, -0.043111f, -0.008423f, 0.026401f, 0.058658f, 0.085759f, 0.105330f, 0.115404f, 0.114607f, 0.102460f, 0.079827f, 0.049121f, 0.014021f, -0.021124f, -0.052008f, -0.075132f, -0.088436f, -0.091490f, -0.085272f, -0.071781f, -0.053587f, -0.033279f, -0.013025f, 0.005554f, 0.021381f, 0.033930f, 0.043117f, 0.049029f, 0.051772f, 0.051505f, 0.048423f, 0.042645f, 0.034289f, 0.023665f, 0.011301f, -0.002140f, -0.015816f, -0.028671f, -0.039612f, -0.047707f, -0.052177f, -0.052427f, -0.048237f, -0.039850f, -0.027849f, -0.013136f, 0.003001f, 0.019065f, 0.033635f, 0.045427f, 0.053308f, 0.056554f, 0.054950f, 0.048521f, 0.037482f, 0.022572f, 0.005028f, -0.013904f, -0.032933f, -0.050205f, -0.063494f, -0.070939f, -0.070952f, -0.061845f, -0.042817f, -0.015369f, 0.017025f, 0.049963f, 0.077740f, 0.093374f, 0.091532f, 0.071535f, 0.036751f, + -0.006902f, -0.049951f, -0.080077f, -0.088199f, -0.073181f, -0.039187f, 0.006496f, 0.048670f, 0.065160f, 0.045077f, 0.005480f, -0.021584f, -0.021385f, -0.007456f, 0.000767f, 0.000082f, -0.001293f, 0.000161f, 0.001281f, 0.000763f, 0.000790f, 0.001871f, 0.002246f, 0.001673f, 0.001523f, 0.001855f, 0.001581f, 0.000775f, 0.000337f, 0.000178f, -0.000363f, -0.001094f, -0.001446f, -0.001566f, -0.001845f, -0.002088f, -0.001986f, -0.001712f, -0.001491f, -0.001185f, -0.000679f, -0.000134f, 0.000334f, 0.000795f, 0.001259f, 0.001626f, 0.001858f, 0.001978f}, + {1.075228f, 1.074217f, 1.098140f, 1.181350f, 1.301845f, 1.357285f, 1.275591f, 1.128376f, 1.051750f, 1.070717f, 1.096449f, 1.090338f, 1.120506f, 1.232710f, 1.365528f, 1.439321f, 1.453889f, 1.448913f, 1.426184f, 1.363771f, 1.270441f, 1.179270f, 1.105288f, 1.040796f, 0.980197f, 0.926868f, 0.882359f, 0.842806f, 0.803055f, 0.760151f, 0.717484f, 0.684947f, 0.668443f, 0.661086f, 0.651027f, 0.635243f, 0.620475f, 0.614727f, 0.622795f, 0.645718f, 0.679665f, 0.718175f, 0.758038f, 0.800110f, 0.844051f, 0.886529f, 0.924692f, 0.957013f, 0.980790f, 0.992993f, 0.994090f, 0.988656f, 0.982771f, 0.982211f, 0.991140f, 1.010513f, 1.038521f, 1.072547f, 1.108778f, 1.140961f, 1.163036f, 1.172913f, 1.171176f, 1.157532f, 1.131991f, 1.098142f, 1.061279f, 1.023708f, 0.984783f, 0.944459f, 0.903598f, 0.861374f, 0.815358f, 0.764360f, 0.709449f, 0.652291f, 0.594010f, 0.536028f, 0.481101f, 0.432577f, 0.392126f, 0.358508f, 0.329185f, 0.302679f, 0.278373f, 0.255008f, 0.231647f, 0.210110f, 0.194471f, 0.187914f, 0.191535f, 0.205810f, 0.231239f, 0.267417f, 0.313051f, 0.367052f, + 0.428780f, 0.497528f, 0.572254f, 0.650956f, 0.729921f, 0.804741f, 0.872337f, 0.930763f, 0.977405f, 1.009536f, 1.026754f, 1.030560f, 1.021257f, 0.997590f, 0.959821f, 0.910708f, 0.852633f, 0.785962f, 0.711354f, 0.631836f, 0.551033f, 0.470413f, 0.389791f, 0.309952f, 0.232974f, 0.159655f, 0.088252f, 0.016873f, -0.054104f, -0.123545f, -0.192358f, -0.262428f, -0.333151f, -0.401582f, -0.466079f, -0.527128f, -0.584149f, -0.634249f, -0.675298f, -0.707980f, -0.733621f, -0.751956f, -0.762482f, -0.766603f, -0.766968f, -0.765342f, -0.762185f, -0.758077f, -0.754691f, -0.753935f, -0.756401f, -0.761422f, -0.768926f, -0.780180f, -0.795912f, -0.814860f, -0.835536f, -0.858323f, -0.884145f, -0.912038f, -0.940032f, -0.967764f, -0.996212f, -1.025203f, -1.053082f, -1.078812f, -1.102840f, -1.125506f, -1.145684f, -1.161599f, -1.172538f, -1.178913f, -1.180387f, -1.174972f, -1.161052f, -1.139243f, -1.110357f, -1.072659f, -1.023765f, -0.964129f, -0.895301f, -0.815955f, -0.723787f, -0.620170f, -0.508278f, -0.387981f, -0.257793f, -0.120228f, 0.020407f, 0.163291f, 0.307901f, 0.448205f, 0.576448f, 0.689077f, 0.782089f, 0.845678f, + 0.871365f, 0.858316f, 0.804990f, 0.704160f, 0.556014f, 0.373959f, 0.167059f, -0.061388f, -0.274981f, -0.389171f, -0.341539f, -0.176854f, -0.021227f, 0.039404f, 0.025278f, 0.002978f, 0.000409f, 0.002891f, -0.000311f, -0.002218f, 0.000555f, 0.001691f, -0.000622f, -0.001274f, 0.000673f, 0.001036f, -0.000604f, -0.000793f, 0.000565f, 0.000609f, -0.000540f, -0.000507f, 0.000441f, 0.000341f, -0.000443f, -0.000297f, 0.000346f, 0.000177f, -0.000328f, -0.000127f, 0.000272f, 0.000068f, -0.000213f, 0.000010f, 0.000202f, -0.000020f, -0.000110f, 0.000118f} + }, + { + {1.021118f, 1.014910f, 1.036512f, 1.109450f, 1.204226f, 1.254141f, 1.223089f, 1.142720f, 1.068123f, 1.016578f, 0.975926f, 0.954919f, 0.983672f, 1.063545f, 1.153044f, 1.213027f, 1.237971f, 1.233999f, 1.196080f, 1.125290f, 1.047108f, 0.990282f, 0.956619f, 0.926662f, 0.887517f, 0.841653f, 0.794073f, 0.744757f, 0.693536f, 0.642684f, 0.592748f, 0.541229f, 0.486646f, 0.430740f, 0.376755f, 0.328893f, 0.293662f, 0.278018f, 0.283983f, 0.306520f, 0.338100f, 0.374086f, 0.412476f, 0.450359f, 0.483567f, 0.509814f, 0.530051f, 0.546442f, 0.560626f, 0.574155f, 0.588962f, 0.606627f, 0.627670f, 0.651329f, 0.675291f, 0.696162f, 0.711078f, 0.718475f, 0.717171f, 0.706200f, 0.686489f, 0.661160f, 0.632776f, 0.601270f, 0.565406f, 0.524818f, 0.479490f, 0.428872f, 0.373329f, 0.315884f, 0.261284f, 0.213734f, 0.176015f, 0.149705f, 0.134833f, 0.129330f, 0.129603f, 0.132071f, 0.134448f, 0.136068f, 0.137347f, 0.139019f, 0.141860f, 0.146786f, 0.154663f, 0.165925f, 0.180699f, 0.199281f, 0.222198f, 0.249879f, 0.282596f, 0.320651f, 0.364436f, 0.414340f, 0.470445f, 0.531869f, + 0.596501f, 0.661789f, 0.725419f, 0.784674f, 0.835991f, 0.876590f, 0.906270f, 0.926283f, 0.936909f, 0.937627f, 0.929116f, 0.912880f, 0.888746f, 0.854774f, 0.810155f, 0.756417f, 0.695219f, 0.626853f, 0.552031f, 0.473598f, 0.394918f, 0.317399f, 0.241080f, 0.167093f, 0.097815f, 0.034452f, -0.023969f, -0.078570f, -0.129051f, -0.175206f, -0.218772f, -0.262100f, -0.305551f, -0.347761f, -0.388005f, -0.426424f, -0.461940f, -0.491922f, -0.514586f, -0.530358f, -0.540303f, -0.544523f, -0.542936f, -0.536632f, -0.527481f, -0.516766f, -0.504935f, -0.492597f, -0.481194f, -0.472371f, -0.466907f, -0.464739f, -0.466171f, -0.472327f, -0.483927f, -0.500294f, -0.520400f, -0.544289f, -0.572382f, -0.603846f, -0.636952f, -0.670869f, -0.705849f, -0.741580f, -0.776574f, -0.809529f, -0.840302f, -0.868901f, -0.894171f, -0.914324f, -0.928590f, -0.937355f, -0.940432f, -0.936302f, -0.923833f, -0.903621f, -0.876334f, -0.840853f, -0.795869f, -0.742277f, -0.681702f, -0.613656f, -0.536857f, -0.452385f, -0.362495f, -0.267339f, -0.166250f, -0.061247f, 0.044313f, 0.149203f, 0.252532f, 0.350093f, 0.436582f, 0.509400f, 0.566085f, 0.600989f, + 0.609355f, 0.591229f, 0.546669f, 0.472573f, 0.370152f, 0.248355f, 0.113420f, -0.032320f, -0.167420f, -0.241605f, -0.216790f, -0.118416f, -0.021888f, 0.019213f, 0.014252f, 0.002063f, 0.000356f, 0.001651f, -0.000178f, -0.001272f, 0.000312f, 0.000978f, -0.000340f, -0.000724f, 0.000386f, 0.000598f, -0.000340f, -0.000457f, 0.000315f, 0.000344f, -0.000311f, -0.000299f, 0.000239f, 0.000188f, -0.000255f, -0.000177f, 0.000187f, 0.000099f, -0.000183f, -0.000075f, 0.000150f, 0.000044f, -0.000112f, 0.000008f, 0.000116f, 0.000000f, -0.000050f, 0.000071f}, + {0.932869f, 0.856258f, 0.680407f, 0.416625f, 0.148250f, -0.023842f, -0.087329f, -0.134616f, -0.244970f, -0.385661f, -0.472057f, -0.492517f, -0.512116f, -0.566410f, -0.616657f, -0.615445f, -0.560005f, -0.465857f, -0.336299f, -0.181373f, -0.031918f, 0.089726f, 0.191616f, 0.288900f, 0.377689f, 0.445599f, 0.491647f, 0.521680f, 0.534170f, 0.520833f, 0.475573f, 0.398359f, 0.296291f, 0.183195f, 0.072397f, -0.031357f, -0.128599f, -0.215418f, -0.282840f, -0.325105f, -0.343724f, -0.344232f, -0.333025f, -0.316310f, -0.298291f, -0.280189f, -0.262083f, -0.243767f, -0.222388f, -0.191534f, -0.144792f, -0.079668f, 0.001605f, 0.092568f, 0.183421f, 0.264250f, 0.329320f, 0.377813f, 0.410523f, 0.426997f, 0.425395f, 0.403296f, 0.358510f, 0.290739f, 0.203333f, 0.103082f, -0.001851f, -0.103927f, -0.197351f, -0.278599f, -0.345998f, -0.398008f, -0.431539f, -0.442137f, -0.426030f, -0.382422f, -0.314691f, -0.230120f, -0.138182f, -0.047827f, 0.034784f, 0.106607f, 0.166405f, 0.213658f, 0.248572f, 0.272118f, 0.285359f, 0.288978f, 0.283693f, 0.270537f, 0.250312f, 0.223174f, 0.189058f, 0.147974f, 0.099746f, 0.044338f, + -0.016931f, -0.080937f, -0.143711f, -0.201320f, -0.249848f, -0.285671f, -0.306377f, -0.311000f, -0.299308f, -0.271640f, -0.229566f, -0.175890f, -0.113809f, -0.046630f, 0.021800f, 0.087296f, 0.146188f, 0.195525f, 0.232719f, 0.255849f, 0.264337f, 0.258789f, 0.240297f, 0.210412f, 0.171477f, 0.126248f, 0.077212f, 0.026681f, -0.022772f, -0.068516f, -0.108321f, -0.140285f, -0.162670f, -0.174396f, -0.175576f, -0.167308f, -0.151206f, -0.129367f, -0.104330f, -0.078497f, -0.053556f, -0.030522f, -0.009982f, 0.007997f, 0.023907f, 0.038407f, 0.051943f, 0.064781f, 0.077079f, 0.088652f, 0.098819f, 0.106630f, 0.111137f, 0.111402f, 0.106532f, 0.095979f, 0.079769f, 0.058428f, 0.032870f, 0.004435f, -0.025130f, -0.053924f, -0.080127f, -0.102059f, -0.118226f, -0.127532f, -0.129459f, -0.124022f, -0.111628f, -0.093061f, -0.069546f, -0.042640f, -0.013957f, 0.014961f, 0.042540f, 0.067210f, 0.087700f, 0.103130f, 0.112745f, 0.115879f, 0.112351f, 0.102521f, 0.086750f, 0.065291f, 0.038932f, 0.009166f, -0.022462f, -0.054340f, -0.083825f, -0.107324f, -0.121750f, -0.124985f, -0.115062f, -0.090926f, -0.054663f, -0.011365f, + 0.033369f, 0.073724f, 0.102131f, 0.111537f, 0.100187f, 0.071073f, 0.027749f, -0.022644f, -0.062293f, -0.069966f, -0.043033f, -0.005541f, 0.014414f, 0.011811f, 0.002483f, -0.000779f, 0.000451f, 0.000500f, -0.000541f, -0.000273f, 0.000562f, 0.000328f, -0.000217f, 0.000101f, 0.000578f, 0.000346f, 0.000033f, 0.000279f, 0.000535f, 0.000325f, 0.000122f, 0.000275f, 0.000385f, 0.000200f, 0.000054f, 0.000128f, 0.000148f, -0.000006f, -0.000113f, -0.000089f, -0.000108f, -0.000221f, -0.000290f, -0.000280f, -0.000300f, -0.000368f, -0.000392f, -0.000365f} + }, + { + {0.932869f, 0.856258f, 0.680407f, 0.416625f, 0.148250f, -0.023842f, -0.087329f, -0.134616f, -0.244970f, -0.385661f, -0.472057f, -0.492517f, -0.512116f, -0.566410f, -0.616657f, -0.615445f, -0.560005f, -0.465857f, -0.336299f, -0.181373f, -0.031918f, 0.089726f, 0.191616f, 0.288900f, 0.377689f, 0.445599f, 0.491647f, 0.521680f, 0.534170f, 0.520833f, 0.475573f, 0.398359f, 0.296291f, 0.183195f, 0.072397f, -0.031357f, -0.128599f, -0.215418f, -0.282840f, -0.325105f, -0.343724f, -0.344232f, -0.333025f, -0.316310f, -0.298291f, -0.280189f, -0.262083f, -0.243767f, -0.222388f, -0.191534f, -0.144792f, -0.079668f, 0.001605f, 0.092568f, 0.183421f, 0.264250f, 0.329320f, 0.377813f, 0.410523f, 0.426997f, 0.425395f, 0.403296f, 0.358510f, 0.290739f, 0.203333f, 0.103082f, -0.001851f, -0.103927f, -0.197351f, -0.278599f, -0.345998f, -0.398008f, -0.431539f, -0.442137f, -0.426030f, -0.382422f, -0.314691f, -0.230120f, -0.138182f, -0.047827f, 0.034784f, 0.106607f, 0.166405f, 0.213658f, 0.248572f, 0.272118f, 0.285359f, 0.288978f, 0.283693f, 0.270537f, 0.250312f, 0.223174f, 0.189058f, 0.147974f, 0.099746f, 0.044338f, + -0.016931f, -0.080937f, -0.143711f, -0.201320f, -0.249848f, -0.285671f, -0.306377f, -0.311000f, -0.299308f, -0.271640f, -0.229566f, -0.175890f, -0.113809f, -0.046630f, 0.021800f, 0.087296f, 0.146188f, 0.195525f, 0.232719f, 0.255849f, 0.264337f, 0.258789f, 0.240297f, 0.210412f, 0.171477f, 0.126248f, 0.077212f, 0.026681f, -0.022772f, -0.068516f, -0.108321f, -0.140285f, -0.162670f, -0.174396f, -0.175576f, -0.167308f, -0.151206f, -0.129367f, -0.104330f, -0.078497f, -0.053556f, -0.030522f, -0.009982f, 0.007997f, 0.023907f, 0.038407f, 0.051943f, 0.064781f, 0.077079f, 0.088652f, 0.098819f, 0.106630f, 0.111137f, 0.111402f, 0.106532f, 0.095979f, 0.079769f, 0.058428f, 0.032870f, 0.004435f, -0.025130f, -0.053924f, -0.080127f, -0.102059f, -0.118226f, -0.127532f, -0.129459f, -0.124022f, -0.111628f, -0.093061f, -0.069546f, -0.042640f, -0.013957f, 0.014961f, 0.042540f, 0.067210f, 0.087700f, 0.103130f, 0.112745f, 0.115879f, 0.112351f, 0.102521f, 0.086750f, 0.065291f, 0.038932f, 0.009166f, -0.022462f, -0.054340f, -0.083825f, -0.107324f, -0.121750f, -0.124985f, -0.115062f, -0.090926f, -0.054663f, -0.011365f, + 0.033369f, 0.073724f, 0.102131f, 0.111537f, 0.100187f, 0.071073f, 0.027749f, -0.022644f, -0.062293f, -0.069966f, -0.043033f, -0.005541f, 0.014414f, 0.011811f, 0.002483f, -0.000779f, 0.000451f, 0.000500f, -0.000541f, -0.000273f, 0.000562f, 0.000328f, -0.000217f, 0.000101f, 0.000578f, 0.000346f, 0.000033f, 0.000279f, 0.000535f, 0.000325f, 0.000122f, 0.000275f, 0.000385f, 0.000200f, 0.000054f, 0.000128f, 0.000148f, -0.000006f, -0.000113f, -0.000089f, -0.000108f, -0.000221f, -0.000290f, -0.000280f, -0.000300f, -0.000368f, -0.000392f, -0.000365f}, + {1.021118f, 1.014910f, 1.036512f, 1.109450f, 1.204226f, 1.254141f, 1.223089f, 1.142720f, 1.068123f, 1.016578f, 0.975926f, 0.954919f, 0.983672f, 1.063545f, 1.153044f, 1.213027f, 1.237971f, 1.233999f, 1.196080f, 1.125290f, 1.047108f, 0.990282f, 0.956619f, 0.926662f, 0.887517f, 0.841653f, 0.794073f, 0.744757f, 0.693536f, 0.642684f, 0.592748f, 0.541229f, 0.486646f, 0.430740f, 0.376755f, 0.328893f, 0.293662f, 0.278018f, 0.283983f, 0.306520f, 0.338100f, 0.374086f, 0.412476f, 0.450359f, 0.483567f, 0.509814f, 0.530051f, 0.546442f, 0.560626f, 0.574155f, 0.588962f, 0.606627f, 0.627670f, 0.651329f, 0.675291f, 0.696162f, 0.711078f, 0.718475f, 0.717171f, 0.706200f, 0.686489f, 0.661160f, 0.632776f, 0.601270f, 0.565406f, 0.524818f, 0.479490f, 0.428872f, 0.373329f, 0.315884f, 0.261284f, 0.213734f, 0.176015f, 0.149705f, 0.134833f, 0.129330f, 0.129603f, 0.132071f, 0.134448f, 0.136068f, 0.137347f, 0.139019f, 0.141860f, 0.146786f, 0.154663f, 0.165925f, 0.180699f, 0.199281f, 0.222198f, 0.249879f, 0.282596f, 0.320651f, 0.364436f, 0.414340f, 0.470445f, 0.531869f, + 0.596501f, 0.661789f, 0.725419f, 0.784674f, 0.835991f, 0.876590f, 0.906270f, 0.926283f, 0.936909f, 0.937627f, 0.929116f, 0.912880f, 0.888746f, 0.854774f, 0.810155f, 0.756417f, 0.695219f, 0.626853f, 0.552031f, 0.473598f, 0.394918f, 0.317399f, 0.241080f, 0.167093f, 0.097815f, 0.034452f, -0.023969f, -0.078570f, -0.129051f, -0.175206f, -0.218772f, -0.262100f, -0.305551f, -0.347761f, -0.388005f, -0.426424f, -0.461940f, -0.491922f, -0.514586f, -0.530358f, -0.540303f, -0.544523f, -0.542936f, -0.536632f, -0.527481f, -0.516766f, -0.504935f, -0.492597f, -0.481194f, -0.472371f, -0.466907f, -0.464739f, -0.466171f, -0.472327f, -0.483927f, -0.500294f, -0.520400f, -0.544289f, -0.572382f, -0.603846f, -0.636952f, -0.670869f, -0.705849f, -0.741580f, -0.776574f, -0.809529f, -0.840302f, -0.868901f, -0.894171f, -0.914324f, -0.928590f, -0.937355f, -0.940432f, -0.936302f, -0.923833f, -0.903621f, -0.876334f, -0.840853f, -0.795869f, -0.742277f, -0.681702f, -0.613656f, -0.536857f, -0.452385f, -0.362495f, -0.267339f, -0.166250f, -0.061247f, 0.044313f, 0.149203f, 0.252532f, 0.350093f, 0.436582f, 0.509400f, 0.566085f, 0.600989f, + 0.609355f, 0.591229f, 0.546669f, 0.472573f, 0.370152f, 0.248355f, 0.113420f, -0.032320f, -0.167420f, -0.241605f, -0.216790f, -0.118416f, -0.021888f, 0.019213f, 0.014252f, 0.002063f, 0.000356f, 0.001651f, -0.000178f, -0.001272f, 0.000312f, 0.000978f, -0.000340f, -0.000724f, 0.000386f, 0.000598f, -0.000340f, -0.000457f, 0.000315f, 0.000344f, -0.000311f, -0.000299f, 0.000239f, 0.000188f, -0.000255f, -0.000177f, 0.000187f, 0.000099f, -0.000183f, -0.000075f, 0.000150f, 0.000044f, -0.000112f, 0.000008f, 0.000116f, 0.000000f, -0.000050f, 0.000071f} + } +}; +const float CRendBin_Combined_HRIR_coeff_im_48kHz[15][BINAURAL_CHANNELS][240]={ + { + {0.021740f, 0.062265f, 0.089497f, 0.079979f, 0.019873f, -0.044423f, -0.038634f, 0.014329f, -0.006309f, -0.113590f, -0.115115f, 0.141366f, 0.508608f, 0.696113f, 0.638660f, 0.530885f, 0.513220f, 0.511265f, 0.413104f, 0.233094f, 0.033856f, -0.178208f, -0.394112f, -0.532465f, -0.516289f, -0.373221f, -0.199312f, -0.054469f, 0.064669f, 0.175334f, 0.270929f, 0.322634f, 0.297348f, 0.180897f, -0.005107f, -0.214019f, -0.406250f, -0.568975f, -0.708995f, -0.834425f, -0.942413f, -1.020169f, -1.058870f, -1.066737f, -1.064744f, -1.070779f, -1.092413f, -1.130543f, -1.180471f, -1.230349f, -1.267218f, -1.286478f, -1.292217f, -1.290295f, -1.284789f, -1.278764f, -1.274804f, -1.275839f, -1.285956f, -1.307719f, -1.339100f, -1.376367f, -1.418521f, -1.464319f, -1.506155f, -1.531614f, -1.530826f, -1.499868f, -1.440010f, -1.357948f, -1.265010f, -1.172182f, -1.086077f, -1.010355f, -0.948076f, -0.900542f, -0.865729f, -0.839379f, -0.816783f, -0.793921f, -0.768744f, -0.741295f, -0.711733f, -0.679567f, -0.645630f, -0.612730f, -0.583124f, -0.557524f, -0.537573f, -0.526798f, -0.527799f, -0.540308f, -0.562652f, -0.593201f, -0.629808f, -0.669386f, + -0.708515f, -0.743933f, -0.773005f, -0.794365f, -0.807476f, -0.811721f, -0.807186f, -0.795749f, -0.779350f, -0.757689f, -0.729622f, -0.695999f, -0.658877f, -0.618992f, -0.576449f, -0.532906f, -0.490747f, -0.450976f, -0.413608f, -0.379004f, -0.347546f, -0.319332f, -0.295027f, -0.275613f, -0.261247f, -0.252274f, -0.250937f, -0.259815f, -0.279334f, -0.309493f, -0.353092f, -0.414158f, -0.493999f, -0.592040f, -0.709860f, -0.850917f, -1.016122f, -1.202501f, -1.406580f, -1.626368f, -1.858539f, -2.095454f, -2.327361f, -2.547430f, -2.752372f, -2.937831f, -3.096805f, -3.225146f, -3.325214f, -3.400274f, -3.448580f, -3.467955f, -3.462820f, -3.440091f, -3.400547f, -3.341377f, -3.265259f, -3.179036f, -3.084322f, -2.977173f, -2.856905f, -2.727864f, -2.591707f, -2.444451f, -2.282751f, -2.108111f, -1.922919f, -1.725836f, -1.513704f, -1.286797f, -1.049763f, -0.806612f, -0.557242f, -0.301864f, -0.046431f, 0.201936f, 0.443240f, 0.681014f, 0.912264f, 1.130667f, 1.338214f, 1.541861f, 1.739858f, 1.924684f, 2.097432f, 2.263703f, 2.417459f, 2.545568f, 2.644263f, 2.712279f, 2.733362f, 2.686342f, 2.565077f, 2.367465f, 2.078112f, 1.688067f, + 1.216823f, 0.689229f, 0.115322f, -0.475183f, -1.011572f, -1.432585f, -1.708631f, -1.762445f, -1.452538f, -0.765837f, 0.007791f, 0.454087f, 0.430600f, 0.177956f, 0.006027f, -0.013234f, 0.008162f, 0.000516f, -0.008800f, 0.001070f, 0.006785f, -0.001814f, -0.005338f, 0.001955f, 0.004159f, -0.001933f, -0.003203f, 0.001947f, 0.002621f, -0.001703f, -0.001961f, 0.001637f, 0.001565f, -0.001450f, -0.001190f, 0.001261f, 0.000818f, -0.001182f, -0.000645f, 0.000918f, 0.000295f, -0.000884f, -0.000203f, 0.000626f, -0.000076f, -0.000552f, 0.000190f, 0.000362f}, + {-0.080378f, -0.311517f, -0.607575f, -0.791939f, -0.801056f, -0.760728f, -0.739137f, -0.646344f, -0.447365f, -0.280582f, -0.279360f, -0.423325f, -0.622662f, -0.804319f, -0.867760f, -0.711139f, -0.374564f, -0.036973f, 0.187009f, 0.339438f, 0.474054f, 0.550709f, 0.537533f, 0.502849f, 0.524124f, 0.586937f, 0.644423f, 0.705382f, 0.790305f, 0.855034f, 0.834070f, 0.729675f, 0.593377f, 0.437006f, 0.224113f, -0.048481f, -0.312373f, -0.491566f, -0.576209f, -0.612643f, -0.640544f, -0.665031f, -0.680052f, -0.687657f, -0.686406f, -0.662500f, -0.605999f, -0.524271f, -0.429884f, -0.325685f, -0.210684f, -0.091141f, 0.023275f, 0.127676f, 0.220049f, 0.297836f, 0.361429f, 0.414922f, 0.459421f, 0.490535f, 0.503997f, 0.498318f, 0.471835f, 0.423949f, 0.360378f, 0.291632f, 0.225381f, 0.164098f, 0.109185f, 0.062781f, 0.025528f, -0.004197f, -0.028936f, -0.051742f, -0.076082f, -0.104578f, -0.138150f, -0.176078f, -0.215537f, -0.251862f, -0.281392f, -0.303940f, -0.321624f, -0.336474f, -0.349673f, -0.360447f, -0.363977f, -0.352405f, -0.319580f, -0.263976f, -0.187632f, -0.095277f, 0.004941f, 0.102546f, 0.187832f, 0.253454f, + 0.294802f, 0.311762f, 0.309781f, 0.297062f, 0.280794f, 0.266708f, 0.259989f, 0.264021f, 0.278984f, 0.303091f, 0.333931f, 0.367038f, 0.394275f, 0.405176f, 0.389668f, 0.339645f, 0.250213f, 0.121655f, -0.039539f, -0.222071f, -0.412200f, -0.595202f, -0.756231f, -0.881758f, -0.961227f, -0.987631f, -0.957056f, -0.868780f, -0.726460f, -0.538670f, -0.317638f, -0.077771f, 0.164807f, 0.393406f, 0.593707f, 0.755810f, 0.873499f, 0.943326f, 0.965432f, 0.943420f, 0.881696f, 0.783870f, 0.654305f, 0.499177f, 0.324930f, 0.137677f, -0.054836f, -0.242668f, -0.415940f, -0.565859f, -0.683493f, -0.760474f, -0.792077f, -0.778024f, -0.720589f, -0.624483f, -0.498476f, -0.354312f, -0.203363f, -0.055601f, 0.079448f, 0.193754f, 0.282950f, 0.345938f, 0.383039f, 0.396039f, 0.388837f, 0.366082f, 0.331570f, 0.288732f, 0.241345f, 0.192568f, 0.144151f, 0.097195f, 0.052704f, 0.011148f, -0.027394f, -0.062510f, -0.093642f, -0.120625f, -0.143214f, -0.160685f, -0.172569f, -0.178917f, -0.179375f, -0.173102f, -0.159797f, -0.139499f, -0.111633f, -0.075980f, -0.034252f, 0.010916f, 0.057404f, 0.101926f, 0.138613f, 0.161970f, + 0.169562f, 0.159632f, 0.129698f, 0.081381f, 0.023065f, -0.036010f, -0.088771f, -0.122396f, -0.117183f, -0.067536f, -0.000965f, 0.039915f, 0.038373f, 0.015920f, 0.001538f, 0.001251f, 0.003701f, 0.002572f, 0.001346f, 0.002248f, 0.002607f, 0.001294f, 0.000524f, 0.000987f, 0.000860f, -0.000262f, -0.000829f, -0.000606f, -0.000896f, -0.001788f, -0.002153f, -0.001988f, -0.002250f, -0.002848f, -0.002957f, -0.002725f, -0.002844f, -0.003107f, -0.002939f, -0.002590f, -0.002528f, -0.002470f, -0.002063f, -0.001626f, -0.001418f, -0.001114f, -0.000569f, -0.000134f} + }, + { + {-0.080378f, -0.311517f, -0.607575f, -0.791939f, -0.801056f, -0.760728f, -0.739137f, -0.646344f, -0.447365f, -0.280582f, -0.279360f, -0.423325f, -0.622662f, -0.804319f, -0.867760f, -0.711139f, -0.374564f, -0.036973f, 0.187009f, 0.339438f, 0.474054f, 0.550709f, 0.537533f, 0.502849f, 0.524124f, 0.586937f, 0.644423f, 0.705382f, 0.790305f, 0.855034f, 0.834070f, 0.729675f, 0.593377f, 0.437006f, 0.224113f, -0.048481f, -0.312373f, -0.491566f, -0.576209f, -0.612643f, -0.640544f, -0.665031f, -0.680052f, -0.687657f, -0.686406f, -0.662500f, -0.605999f, -0.524271f, -0.429884f, -0.325685f, -0.210684f, -0.091141f, 0.023275f, 0.127676f, 0.220049f, 0.297836f, 0.361429f, 0.414922f, 0.459421f, 0.490535f, 0.503997f, 0.498318f, 0.471835f, 0.423949f, 0.360378f, 0.291632f, 0.225381f, 0.164098f, 0.109185f, 0.062781f, 0.025528f, -0.004197f, -0.028936f, -0.051742f, -0.076082f, -0.104578f, -0.138150f, -0.176078f, -0.215537f, -0.251862f, -0.281392f, -0.303940f, -0.321624f, -0.336474f, -0.349673f, -0.360447f, -0.363977f, -0.352405f, -0.319580f, -0.263976f, -0.187632f, -0.095277f, 0.004941f, 0.102546f, 0.187832f, 0.253454f, + 0.294802f, 0.311762f, 0.309781f, 0.297062f, 0.280794f, 0.266708f, 0.259989f, 0.264021f, 0.278984f, 0.303091f, 0.333931f, 0.367038f, 0.394275f, 0.405176f, 0.389668f, 0.339645f, 0.250213f, 0.121655f, -0.039539f, -0.222071f, -0.412200f, -0.595202f, -0.756231f, -0.881758f, -0.961227f, -0.987631f, -0.957056f, -0.868780f, -0.726460f, -0.538670f, -0.317638f, -0.077771f, 0.164807f, 0.393406f, 0.593707f, 0.755810f, 0.873499f, 0.943326f, 0.965432f, 0.943420f, 0.881696f, 0.783870f, 0.654305f, 0.499177f, 0.324930f, 0.137677f, -0.054836f, -0.242668f, -0.415940f, -0.565859f, -0.683493f, -0.760474f, -0.792077f, -0.778024f, -0.720589f, -0.624483f, -0.498476f, -0.354312f, -0.203363f, -0.055601f, 0.079448f, 0.193754f, 0.282950f, 0.345938f, 0.383039f, 0.396039f, 0.388837f, 0.366082f, 0.331570f, 0.288732f, 0.241345f, 0.192568f, 0.144151f, 0.097195f, 0.052704f, 0.011148f, -0.027394f, -0.062510f, -0.093642f, -0.120625f, -0.143214f, -0.160685f, -0.172569f, -0.178917f, -0.179375f, -0.173102f, -0.159797f, -0.139499f, -0.111633f, -0.075980f, -0.034252f, 0.010916f, 0.057404f, 0.101926f, 0.138613f, 0.161970f, + 0.169562f, 0.159632f, 0.129698f, 0.081381f, 0.023065f, -0.036010f, -0.088771f, -0.122396f, -0.117183f, -0.067536f, -0.000965f, 0.039915f, 0.038373f, 0.015920f, 0.001538f, 0.001251f, 0.003701f, 0.002572f, 0.001346f, 0.002248f, 0.002607f, 0.001294f, 0.000524f, 0.000987f, 0.000860f, -0.000262f, -0.000829f, -0.000606f, -0.000896f, -0.001788f, -0.002153f, -0.001988f, -0.002250f, -0.002848f, -0.002957f, -0.002725f, -0.002844f, -0.003107f, -0.002939f, -0.002590f, -0.002528f, -0.002470f, -0.002063f, -0.001626f, -0.001418f, -0.001114f, -0.000569f, -0.000134f}, + {0.021740f, 0.062265f, 0.089497f, 0.079979f, 0.019873f, -0.044423f, -0.038634f, 0.014329f, -0.006309f, -0.113590f, -0.115115f, 0.141366f, 0.508608f, 0.696113f, 0.638660f, 0.530885f, 0.513220f, 0.511265f, 0.413104f, 0.233094f, 0.033856f, -0.178208f, -0.394112f, -0.532465f, -0.516289f, -0.373221f, -0.199312f, -0.054469f, 0.064669f, 0.175334f, 0.270929f, 0.322634f, 0.297348f, 0.180897f, -0.005107f, -0.214019f, -0.406250f, -0.568975f, -0.708995f, -0.834425f, -0.942413f, -1.020169f, -1.058870f, -1.066737f, -1.064744f, -1.070779f, -1.092413f, -1.130543f, -1.180471f, -1.230349f, -1.267218f, -1.286478f, -1.292217f, -1.290295f, -1.284789f, -1.278764f, -1.274804f, -1.275839f, -1.285956f, -1.307719f, -1.339100f, -1.376367f, -1.418521f, -1.464319f, -1.506155f, -1.531614f, -1.530826f, -1.499868f, -1.440010f, -1.357948f, -1.265010f, -1.172182f, -1.086077f, -1.010355f, -0.948076f, -0.900542f, -0.865729f, -0.839379f, -0.816783f, -0.793921f, -0.768744f, -0.741295f, -0.711733f, -0.679567f, -0.645630f, -0.612730f, -0.583124f, -0.557524f, -0.537573f, -0.526798f, -0.527799f, -0.540308f, -0.562652f, -0.593201f, -0.629808f, -0.669386f, + -0.708515f, -0.743933f, -0.773005f, -0.794365f, -0.807476f, -0.811721f, -0.807186f, -0.795749f, -0.779350f, -0.757689f, -0.729622f, -0.695999f, -0.658877f, -0.618992f, -0.576449f, -0.532906f, -0.490747f, -0.450976f, -0.413608f, -0.379004f, -0.347546f, -0.319332f, -0.295027f, -0.275613f, -0.261247f, -0.252274f, -0.250937f, -0.259815f, -0.279334f, -0.309493f, -0.353092f, -0.414158f, -0.493999f, -0.592040f, -0.709860f, -0.850917f, -1.016122f, -1.202501f, -1.406580f, -1.626368f, -1.858539f, -2.095454f, -2.327361f, -2.547430f, -2.752372f, -2.937831f, -3.096805f, -3.225146f, -3.325214f, -3.400274f, -3.448580f, -3.467955f, -3.462820f, -3.440091f, -3.400547f, -3.341377f, -3.265259f, -3.179036f, -3.084322f, -2.977173f, -2.856905f, -2.727864f, -2.591707f, -2.444451f, -2.282751f, -2.108111f, -1.922919f, -1.725836f, -1.513704f, -1.286797f, -1.049763f, -0.806612f, -0.557242f, -0.301864f, -0.046431f, 0.201936f, 0.443240f, 0.681014f, 0.912264f, 1.130667f, 1.338214f, 1.541861f, 1.739858f, 1.924684f, 2.097432f, 2.263703f, 2.417459f, 2.545568f, 2.644263f, 2.712279f, 2.733362f, 2.686342f, 2.565077f, 2.367465f, 2.078112f, 1.688067f, + 1.216823f, 0.689229f, 0.115322f, -0.475183f, -1.011572f, -1.432585f, -1.708631f, -1.762445f, -1.452538f, -0.765837f, 0.007791f, 0.454087f, 0.430600f, 0.177956f, 0.006027f, -0.013234f, 0.008162f, 0.000516f, -0.008800f, 0.001070f, 0.006785f, -0.001814f, -0.005338f, 0.001955f, 0.004159f, -0.001933f, -0.003203f, 0.001947f, 0.002621f, -0.001703f, -0.001961f, 0.001637f, 0.001565f, -0.001450f, -0.001190f, 0.001261f, 0.000818f, -0.001182f, -0.000645f, 0.000918f, 0.000295f, -0.000884f, -0.000203f, 0.000626f, -0.000076f, -0.000552f, 0.000190f, 0.000362f} + }, + { + {0.020843f, 0.021772f, -0.074620f, -0.219246f, -0.250987f, -0.107501f, 0.010495f, -0.117159f, -0.350087f, -0.299453f, 0.133095f, 0.571464f, 0.635503f, 0.397361f, 0.214127f, 0.251024f, 0.351688f, 0.309346f, 0.096268f, -0.170755f, -0.368550f, -0.441001f, -0.403762f, -0.312694f, -0.213644f, -0.118863f, -0.033052f, 0.019339f, 0.006766f, -0.084398f, -0.244267f, -0.442069f, -0.632048f, -0.778310f, -0.879952f, -0.956019f, -1.006298f, -1.007224f, -0.948454f, -0.854412f, -0.765413f, -0.711451f, -0.704679f, -0.740188f, -0.797729f, -0.853597f, -0.897547f, -0.934478f, -0.969795f, -0.999408f, -1.014937f, -1.013415f, -0.999640f, -0.981235f, -0.962830f, -0.944810f, -0.926848f, -0.910262f, -0.894988f, -0.876689f, -0.850723f, -0.818230f, -0.784731f, -0.753005f, -0.720667f, -0.685021f, -0.647235f, -0.610640f, -0.576758f, -0.544244f, -0.511073f, -0.477026f, -0.444129f, -0.414956f, -0.390763f, -0.371204f, -0.355270f, -0.342030f, -0.331009f, -0.322541f, -0.317554f, -0.316405f, -0.318065f, -0.320982f, -0.324817f, -0.330999f, -0.341429f, -0.356903f, -0.377097f, -0.401882f, -0.431767f, -0.466439f, -0.503289f, -0.537982f, -0.566063f, -0.583561f, + -0.587138f, -0.575315f, -0.549603f, -0.513357f, -0.469423f, -0.419580f, -0.365934f, -0.311618f, -0.259754f, -0.212337f, -0.170616f, -0.136551f, -0.113765f, -0.106742f, -0.118986f, -0.152388f, -0.208330f, -0.287999f, -0.390564f, -0.512325f, -0.649221f, -0.799131f, -0.960097f, -1.127778f, -1.297417f, -1.467538f, -1.638728f, -1.809064f, -1.973949f, -2.130414f, -2.277763f, -2.413033f, -2.529737f, -2.623312f, -2.694688f, -2.746001f, -2.775857f, -2.782337f, -2.768361f, -2.739709f, -2.698669f, -2.643816f, -2.575709f, -2.498064f, -2.412212f, -2.314661f, -2.202237f, -2.076018f, -1.937466f, -1.784021f, -1.612358f, -1.423970f, -1.223605f, -1.013553f, -0.793839f, -0.567739f, -0.342670f, -0.124736f, 0.083821f, 0.280550f, 0.459977f, 0.617159f, 0.751201f, 0.862726f, 0.950153f, 1.011333f, 1.047323f, 1.061710f, 1.057110f, 1.035001f, 0.998567f, 0.953069f, 0.903025f, 0.850779f, 0.798188f, 0.748048f, 0.702999f, 0.663889f, 0.630078f, 0.601056f, 0.577007f, 0.557689f, 0.541546f, 0.526776f, 0.512917f, 0.500274f, 0.488072f, 0.474647f, 0.459326f, 0.442142f, 0.421629f, 0.395188f, 0.361846f, 0.322187f, 0.275584f, 0.220730f, + 0.158999f, 0.093656f, 0.025970f, -0.043388f, -0.109763f, -0.167134f, -0.213607f, -0.244943f, -0.243677f, -0.190704f, -0.096080f, -0.005466f, 0.037995f, 0.033141f, 0.012469f, 0.001728f, 0.000979f, 0.000762f, -0.000671f, -0.000492f, 0.000547f, 0.000254f, -0.000496f, -0.000131f, 0.000467f, 0.000134f, -0.000309f, 0.000007f, 0.000336f, 0.000034f, -0.000227f, 0.000024f, 0.000194f, -0.000047f, -0.000184f, 0.000006f, 0.000083f, -0.000088f, -0.000140f, -0.000006f, 0.000018f, -0.000084f, -0.000083f, -0.000003f, -0.000007f, -0.000044f, -0.000017f, 0.000006f}, + {0.020843f, 0.021772f, -0.074620f, -0.219246f, -0.250987f, -0.107501f, 0.010495f, -0.117159f, -0.350087f, -0.299453f, 0.133095f, 0.571464f, 0.635503f, 0.397361f, 0.214127f, 0.251024f, 0.351688f, 0.309346f, 0.096268f, -0.170755f, -0.368550f, -0.441001f, -0.403762f, -0.312694f, -0.213644f, -0.118863f, -0.033052f, 0.019339f, 0.006766f, -0.084398f, -0.244267f, -0.442069f, -0.632048f, -0.778310f, -0.879952f, -0.956019f, -1.006298f, -1.007224f, -0.948454f, -0.854412f, -0.765413f, -0.711451f, -0.704679f, -0.740188f, -0.797729f, -0.853597f, -0.897547f, -0.934478f, -0.969795f, -0.999408f, -1.014937f, -1.013415f, -0.999640f, -0.981235f, -0.962830f, -0.944810f, -0.926848f, -0.910262f, -0.894988f, -0.876689f, -0.850723f, -0.818230f, -0.784731f, -0.753005f, -0.720667f, -0.685021f, -0.647235f, -0.610640f, -0.576758f, -0.544244f, -0.511073f, -0.477026f, -0.444129f, -0.414956f, -0.390763f, -0.371204f, -0.355270f, -0.342030f, -0.331009f, -0.322541f, -0.317554f, -0.316405f, -0.318065f, -0.320982f, -0.324817f, -0.330999f, -0.341429f, -0.356903f, -0.377097f, -0.401882f, -0.431767f, -0.466439f, -0.503289f, -0.537982f, -0.566063f, -0.583561f, + -0.587138f, -0.575315f, -0.549603f, -0.513357f, -0.469423f, -0.419580f, -0.365934f, -0.311618f, -0.259754f, -0.212337f, -0.170616f, -0.136551f, -0.113765f, -0.106742f, -0.118986f, -0.152388f, -0.208330f, -0.287999f, -0.390564f, -0.512325f, -0.649221f, -0.799131f, -0.960097f, -1.127778f, -1.297417f, -1.467538f, -1.638728f, -1.809064f, -1.973949f, -2.130414f, -2.277763f, -2.413033f, -2.529737f, -2.623312f, -2.694688f, -2.746001f, -2.775857f, -2.782337f, -2.768361f, -2.739709f, -2.698669f, -2.643816f, -2.575709f, -2.498064f, -2.412212f, -2.314661f, -2.202237f, -2.076018f, -1.937466f, -1.784021f, -1.612358f, -1.423970f, -1.223605f, -1.013553f, -0.793839f, -0.567739f, -0.342670f, -0.124736f, 0.083821f, 0.280550f, 0.459977f, 0.617159f, 0.751201f, 0.862726f, 0.950153f, 1.011333f, 1.047323f, 1.061710f, 1.057110f, 1.035001f, 0.998567f, 0.953069f, 0.903025f, 0.850779f, 0.798188f, 0.748048f, 0.702999f, 0.663889f, 0.630078f, 0.601056f, 0.577007f, 0.557689f, 0.541546f, 0.526776f, 0.512917f, 0.500274f, 0.488072f, 0.474647f, 0.459326f, 0.442142f, 0.421629f, 0.395188f, 0.361846f, 0.322187f, 0.275584f, 0.220730f, + 0.158999f, 0.093656f, 0.025970f, -0.043388f, -0.109763f, -0.167134f, -0.213607f, -0.244943f, -0.243677f, -0.190704f, -0.096080f, -0.005466f, 0.037995f, 0.033141f, 0.012469f, 0.001728f, 0.000979f, 0.000762f, -0.000671f, -0.000492f, 0.000547f, 0.000254f, -0.000496f, -0.000131f, 0.000467f, 0.000134f, -0.000309f, 0.000007f, 0.000336f, 0.000034f, -0.000227f, 0.000024f, 0.000194f, -0.000047f, -0.000184f, 0.000006f, 0.000083f, -0.000088f, -0.000140f, -0.000006f, 0.000018f, -0.000084f, -0.000083f, -0.000003f, -0.000007f, -0.000044f, -0.000017f, 0.000006f} + }, + { + {0.011569f, 0.065153f, 0.150153f, 0.203635f, 0.205376f, 0.173096f, 0.078721f, -0.099478f, -0.273114f, -0.336729f, -0.337980f, -0.407198f, -0.542930f, -0.623111f, -0.612944f, -0.602716f, -0.639352f, -0.670207f, -0.665746f, -0.663210f, -0.669807f, -0.639016f, -0.563037f, -0.492634f, -0.453350f, -0.425831f, -0.411451f, -0.435590f, -0.481467f, -0.493772f, -0.454614f, -0.397179f, -0.343898f, -0.284417f, -0.214324f, -0.148331f, -0.092876f, -0.042119f, -0.001362f, 0.013895f, 0.000977f, -0.028018f, -0.062315f, -0.094962f, -0.116574f, -0.120585f, -0.110386f, -0.094260f, -0.079595f, -0.075577f, -0.092822f, -0.135978f, -0.201707f, -0.283621f, -0.373297f, -0.458913f, -0.530510f, -0.586050f, -0.628047f, -0.657110f, -0.672676f, -0.676154f, -0.668940f, -0.650025f, -0.618410f, -0.575398f, -0.523084f, -0.463279f, -0.398758f, -0.333031f, -0.268412f, -0.205886f, -0.146127f, -0.088932f, -0.032678f, 0.024059f, 0.081192f, 0.138116f, 0.194573f, 0.249639f, 0.300758f, 0.344246f, 0.376397f, 0.394340f, 0.395940f, 0.378322f, 0.336985f, 0.267596f, 0.167862f, 0.036412f, -0.127823f, -0.321958f, -0.536530f, -0.759956f, -0.984191f, -1.203033f, + -1.407738f, -1.589491f, -1.745039f, -1.875334f, -1.979759f, -2.056311f, -2.106550f, -2.135185f, -2.144138f, -2.131027f, -2.094254f, -2.036298f, -1.961129f, -1.871617f, -1.771308f, -1.666459f, -1.563804f, -1.466752f, -1.375328f, -1.289465f, -1.210671f, -1.140298f, -1.077990f, -1.023002f, -0.975880f, -0.937424f, -0.906552f, -0.880558f, -0.857370f, -0.836543f, -0.818233f, -0.802387f, -0.789314f, -0.780403f, -0.777788f, -0.783208f, -0.797242f, -0.819642f, -0.850299f, -0.889299f, -0.935805f, -0.987623f, -1.042663f, -1.100181f, -1.159526f, -1.218087f, -1.271834f, -1.317746f, -1.354190f, -1.378859f, -1.388441f, -1.381422f, -1.359724f, -1.326229f, -1.282128f, -1.228339f, -1.167951f, -1.104670f, -1.039474f, -0.971238f, -0.900258f, -0.828583f, -0.756941f, -0.684007f, -0.609260f, -0.534389f, -0.461087f, -0.389218f, -0.318074f, -0.248322f, -0.181644f, -0.118710f, -0.058387f, 0.000515f, 0.057409f, 0.111358f, 0.163934f, 0.218134f, 0.274375f, 0.331038f, 0.389352f, 0.453139f, 0.522861f, 0.595488f, 0.671219f, 0.753543f, 0.841415f, 0.929099f, 1.014516f, 1.098177f, 1.173021f, 1.225991f, 1.249730f, 1.240661f, 1.187460f, 1.077175f, + 0.910930f, 0.697192f, 0.435982f, 0.132198f, -0.183809f, -0.475682f, -0.724582f, -0.891658f, -0.880755f, -0.621256f, -0.207028f, 0.126680f, 0.218186f, 0.126237f, 0.023051f, -0.005289f, 0.003972f, 0.002567f, -0.004554f, -0.001212f, 0.003755f, 0.000381f, -0.003113f, 0.000002f, 0.002534f, -0.000198f, -0.001991f, 0.000414f, 0.001690f, -0.000399f, -0.001292f, 0.000483f, 0.001055f, -0.000473f, -0.000835f, 0.000423f, 0.000587f, -0.000458f, -0.000496f, 0.000328f, 0.000259f, -0.000368f, -0.000220f, 0.000227f, 0.000038f, -0.000216f, 0.000017f, 0.000113f}, + {-0.169685f, -0.479052f, -0.687718f, -0.745489f, -0.686580f, -0.594247f, -0.494277f, -0.350304f, -0.167242f, -0.017921f, 0.055447f, 0.093676f, 0.144873f, 0.201507f, 0.248863f, 0.316742f, 0.432390f, 0.556193f, 0.607823f, 0.540609f, 0.367689f, 0.137632f, -0.092198f, -0.276561f, -0.400357f, -0.471390f, -0.492220f, -0.455722f, -0.371284f, -0.272306f, -0.186944f, -0.117169f, -0.053347f, 0.007736f, 0.067806f, 0.134068f, 0.208872f, 0.279806f, 0.327290f, 0.337195f, 0.304321f, 0.232209f, 0.134659f, 0.032521f, -0.055207f, -0.116778f, -0.147170f, -0.148130f, -0.129185f, -0.103778f, -0.082038f, -0.067724f, -0.060382f, -0.057666f, -0.056328f, -0.053688f, -0.048964f, -0.042853f, -0.036531f, -0.031221f, -0.027425f, -0.023816f, -0.017450f, -0.005051f, 0.016360f, 0.048944f, 0.092045f, 0.140182f, 0.183898f, 0.212996f, 0.219429f, 0.199052f, 0.152798f, 0.086601f, 0.009223f, -0.070626f, -0.145890f, -0.211261f, -0.262537f, -0.295616f, -0.305743f, -0.288061f, -0.239616f, -0.161593f, -0.060644f, 0.051193f, 0.158413f, 0.245651f, 0.301519f, 0.320779f, 0.304347f, 0.257927f, 0.190207f, 0.111091f, 0.030284f, -0.043708f, + -0.104254f, -0.147026f, -0.170155f, -0.174264f, -0.162372f, -0.139375f, -0.110912f, -0.082026f, -0.056260f, -0.035389f, -0.019595f, -0.007861f, 0.001522f, 0.010463f, 0.020713f, 0.033631f, 0.049942f, 0.069377f, 0.090322f, 0.109823f, 0.124132f, 0.129578f, 0.123456f, 0.104770f, 0.074585f, 0.035726f, -0.008012f, -0.052580f, -0.094098f, -0.129167f, -0.155076f, -0.169720f, -0.171437f, -0.159175f, -0.132888f, -0.093787f, -0.044490f, 0.010781f, 0.066337f, 0.115819f, 0.153314f, 0.174321f, 0.176622f, 0.160923f, 0.130685f, 0.091034f, 0.047547f, 0.005359f, -0.031604f, -0.061171f, -0.082725f, -0.096493f, -0.103137f, -0.103621f, -0.098835f, -0.089236f, -0.075087f, -0.056903f, -0.035467f, -0.011778f, 0.012643f, 0.035685f, 0.055241f, 0.069703f, 0.077958f, 0.079528f, 0.074957f, 0.065658f, 0.053228f, 0.039180f, 0.025001f, 0.011729f, -0.000451f, -0.011772f, -0.022406f, -0.032763f, -0.043533f, -0.054817f, -0.065772f, -0.075306f, -0.082031f, -0.083268f, -0.075551f, -0.056593f, -0.025842f, 0.016050f, 0.065745f, 0.115218f, 0.153630f, 0.171432f, 0.161627f, 0.120156f, 0.050082f, -0.035140f, -0.116350f, -0.176001f, + -0.199580f, -0.176780f, -0.109811f, -0.018038f, 0.072290f, 0.139214f, 0.162279f, 0.123993f, 0.034014f, -0.055650f, -0.086819f, -0.053222f, -0.004112f, 0.015109f, 0.006552f, -0.002295f, -0.000894f, 0.001475f, -0.000301f, -0.001224f, 0.000780f, 0.001739f, 0.000548f, 0.000335f, 0.001638f, 0.001930f, 0.000993f, 0.000852f, 0.001510f, 0.001347f, 0.000509f, 0.000293f, 0.000490f, 0.000108f, -0.000571f, -0.000767f, -0.000749f, -0.001070f, -0.001443f, -0.001463f, -0.001373f, -0.001433f, -0.001436f, -0.001227f, -0.000969f, -0.000757f, -0.000502f, -0.000175f} + }, + { + {-0.169685f, -0.479052f, -0.687718f, -0.745489f, -0.686580f, -0.594247f, -0.494277f, -0.350304f, -0.167242f, -0.017921f, 0.055447f, 0.093676f, 0.144873f, 0.201507f, 0.248863f, 0.316742f, 0.432390f, 0.556193f, 0.607823f, 0.540609f, 0.367689f, 0.137632f, -0.092198f, -0.276561f, -0.400357f, -0.471390f, -0.492220f, -0.455722f, -0.371284f, -0.272306f, -0.186944f, -0.117169f, -0.053347f, 0.007736f, 0.067806f, 0.134068f, 0.208872f, 0.279806f, 0.327290f, 0.337195f, 0.304321f, 0.232209f, 0.134659f, 0.032521f, -0.055207f, -0.116778f, -0.147170f, -0.148130f, -0.129185f, -0.103778f, -0.082038f, -0.067724f, -0.060382f, -0.057666f, -0.056328f, -0.053688f, -0.048964f, -0.042853f, -0.036531f, -0.031221f, -0.027425f, -0.023816f, -0.017450f, -0.005051f, 0.016360f, 0.048944f, 0.092045f, 0.140182f, 0.183898f, 0.212996f, 0.219429f, 0.199052f, 0.152798f, 0.086601f, 0.009223f, -0.070626f, -0.145890f, -0.211261f, -0.262537f, -0.295616f, -0.305743f, -0.288061f, -0.239616f, -0.161593f, -0.060644f, 0.051193f, 0.158413f, 0.245651f, 0.301519f, 0.320779f, 0.304347f, 0.257927f, 0.190207f, 0.111091f, 0.030284f, -0.043708f, + -0.104254f, -0.147026f, -0.170155f, -0.174264f, -0.162372f, -0.139375f, -0.110912f, -0.082026f, -0.056260f, -0.035389f, -0.019595f, -0.007861f, 0.001522f, 0.010463f, 0.020713f, 0.033631f, 0.049942f, 0.069377f, 0.090322f, 0.109823f, 0.124132f, 0.129578f, 0.123456f, 0.104770f, 0.074585f, 0.035726f, -0.008012f, -0.052580f, -0.094098f, -0.129167f, -0.155076f, -0.169720f, -0.171437f, -0.159175f, -0.132888f, -0.093787f, -0.044490f, 0.010781f, 0.066337f, 0.115819f, 0.153314f, 0.174321f, 0.176622f, 0.160923f, 0.130685f, 0.091034f, 0.047547f, 0.005359f, -0.031604f, -0.061171f, -0.082725f, -0.096493f, -0.103137f, -0.103621f, -0.098835f, -0.089236f, -0.075087f, -0.056903f, -0.035467f, -0.011778f, 0.012643f, 0.035685f, 0.055241f, 0.069703f, 0.077958f, 0.079528f, 0.074957f, 0.065658f, 0.053228f, 0.039180f, 0.025001f, 0.011729f, -0.000451f, -0.011772f, -0.022406f, -0.032763f, -0.043533f, -0.054817f, -0.065772f, -0.075306f, -0.082031f, -0.083268f, -0.075551f, -0.056593f, -0.025842f, 0.016050f, 0.065745f, 0.115218f, 0.153630f, 0.171432f, 0.161627f, 0.120156f, 0.050082f, -0.035140f, -0.116350f, -0.176001f, + -0.199580f, -0.176780f, -0.109811f, -0.018038f, 0.072290f, 0.139214f, 0.162279f, 0.123993f, 0.034014f, -0.055650f, -0.086819f, -0.053222f, -0.004112f, 0.015109f, 0.006552f, -0.002295f, -0.000894f, 0.001475f, -0.000301f, -0.001224f, 0.000780f, 0.001739f, 0.000548f, 0.000335f, 0.001638f, 0.001930f, 0.000993f, 0.000852f, 0.001510f, 0.001347f, 0.000509f, 0.000293f, 0.000490f, 0.000108f, -0.000571f, -0.000767f, -0.000749f, -0.001070f, -0.001443f, -0.001463f, -0.001373f, -0.001433f, -0.001436f, -0.001227f, -0.000969f, -0.000757f, -0.000502f, -0.000175f}, + {0.011569f, 0.065153f, 0.150153f, 0.203635f, 0.205376f, 0.173096f, 0.078721f, -0.099478f, -0.273114f, -0.336729f, -0.337980f, -0.407198f, -0.542930f, -0.623111f, -0.612944f, -0.602716f, -0.639352f, -0.670207f, -0.665746f, -0.663210f, -0.669807f, -0.639016f, -0.563037f, -0.492634f, -0.453350f, -0.425831f, -0.411451f, -0.435590f, -0.481467f, -0.493772f, -0.454614f, -0.397179f, -0.343898f, -0.284417f, -0.214324f, -0.148331f, -0.092876f, -0.042119f, -0.001362f, 0.013895f, 0.000977f, -0.028018f, -0.062315f, -0.094962f, -0.116574f, -0.120585f, -0.110386f, -0.094260f, -0.079595f, -0.075577f, -0.092822f, -0.135978f, -0.201707f, -0.283621f, -0.373297f, -0.458913f, -0.530510f, -0.586050f, -0.628047f, -0.657110f, -0.672676f, -0.676154f, -0.668940f, -0.650025f, -0.618410f, -0.575398f, -0.523084f, -0.463279f, -0.398758f, -0.333031f, -0.268412f, -0.205886f, -0.146127f, -0.088932f, -0.032678f, 0.024059f, 0.081192f, 0.138116f, 0.194573f, 0.249639f, 0.300758f, 0.344246f, 0.376397f, 0.394340f, 0.395940f, 0.378322f, 0.336985f, 0.267596f, 0.167862f, 0.036412f, -0.127823f, -0.321958f, -0.536530f, -0.759956f, -0.984191f, -1.203033f, + -1.407738f, -1.589491f, -1.745039f, -1.875334f, -1.979759f, -2.056311f, -2.106550f, -2.135185f, -2.144138f, -2.131027f, -2.094254f, -2.036298f, -1.961129f, -1.871617f, -1.771308f, -1.666459f, -1.563804f, -1.466752f, -1.375328f, -1.289465f, -1.210671f, -1.140298f, -1.077990f, -1.023002f, -0.975880f, -0.937424f, -0.906552f, -0.880558f, -0.857370f, -0.836543f, -0.818233f, -0.802387f, -0.789314f, -0.780403f, -0.777788f, -0.783208f, -0.797242f, -0.819642f, -0.850299f, -0.889299f, -0.935805f, -0.987623f, -1.042663f, -1.100181f, -1.159526f, -1.218087f, -1.271834f, -1.317746f, -1.354190f, -1.378859f, -1.388441f, -1.381422f, -1.359724f, -1.326229f, -1.282128f, -1.228339f, -1.167951f, -1.104670f, -1.039474f, -0.971238f, -0.900258f, -0.828583f, -0.756941f, -0.684007f, -0.609260f, -0.534389f, -0.461087f, -0.389218f, -0.318074f, -0.248322f, -0.181644f, -0.118710f, -0.058387f, 0.000515f, 0.057409f, 0.111358f, 0.163934f, 0.218134f, 0.274375f, 0.331038f, 0.389352f, 0.453139f, 0.522861f, 0.595488f, 0.671219f, 0.753543f, 0.841415f, 0.929099f, 1.014516f, 1.098177f, 1.173021f, 1.225991f, 1.249730f, 1.240661f, 1.187460f, 1.077175f, + 0.910930f, 0.697192f, 0.435982f, 0.132198f, -0.183809f, -0.475682f, -0.724582f, -0.891658f, -0.880755f, -0.621256f, -0.207028f, 0.126680f, 0.218186f, 0.126237f, 0.023051f, -0.005289f, 0.003972f, 0.002567f, -0.004554f, -0.001212f, 0.003755f, 0.000381f, -0.003113f, 0.000002f, 0.002534f, -0.000198f, -0.001991f, 0.000414f, 0.001690f, -0.000399f, -0.001292f, 0.000483f, 0.001055f, -0.000473f, -0.000835f, 0.000423f, 0.000587f, -0.000458f, -0.000496f, 0.000328f, 0.000259f, -0.000368f, -0.000220f, 0.000227f, 0.000038f, -0.000216f, 0.000017f, 0.000113f} + }, + { + {0.014162f, 0.079119f, 0.192373f, 0.273045f, 0.251924f, 0.149637f, 0.020926f, -0.122502f, -0.278057f, -0.388982f, -0.399742f, -0.356867f, -0.363688f, -0.430590f, -0.461817f, -0.411004f, -0.354648f, -0.367414f, -0.410842f, -0.409099f, -0.367287f, -0.341672f, -0.339623f, -0.322888f, -0.283709f, -0.252116f, -0.238516f, -0.220734f, -0.185306f, -0.144497f, -0.113533f, -0.096567f, -0.091951f, -0.092389f, -0.083826f, -0.057563f, -0.019655f, 0.018077f, 0.048708f, 0.067918f, 0.071323f, 0.059246f, 0.036544f, 0.005242f, -0.035854f, -0.084054f, -0.132500f, -0.177134f, -0.218733f, -0.259382f, -0.301515f, -0.348575f, -0.402779f, -0.463490f, -0.528869f, -0.596495f, -0.662478f, -0.723615f, -0.779891f, -0.831486f, -0.875283f, -0.908241f, -0.931583f, -0.947488f, -0.954629f, -0.951018f, -0.937871f, -0.916524f, -0.884692f, -0.839543f, -0.781782f, -0.714062f, -0.638421f, -0.557458f, -0.475213f, -0.395089f, -0.318909f, -0.248274f, -0.184492f, -0.127606f, -0.077917f, -0.037597f, -0.008569f, 0.009628f, 0.017312f, 0.011628f, -0.011443f, -0.053626f, -0.115452f, -0.199369f, -0.308884f, -0.444843f, -0.604506f, -0.784300f, -0.981549f, -1.192357f, + -1.409125f, -1.622569f, -1.826460f, -2.017987f, -2.192991f, -2.344549f, -2.468303f, -2.565362f, -2.636848f, -2.679384f, -2.689877f, -2.671088f, -2.627835f, -2.561060f, -2.470869f, -2.362808f, -2.245776f, -2.125343f, -2.003654f, -1.884247f, -1.772264f, -1.670297f, -1.577576f, -1.493238f, -1.418065f, -1.353009f, -1.297583f, -1.249988f, -1.208402f, -1.171974f, -1.140140f, -1.111192f, -1.083035f, -1.055899f, -1.032625f, -1.015658f, -1.005579f, -1.003175f, -1.010700f, -1.029943f, -1.060636f, -1.101560f, -1.151968f, -1.211363f, -1.278569f, -1.351093f, -1.425253f, -1.497653f, -1.566149f, -1.627979f, -1.677910f, -1.710781f, -1.724954f, -1.720277f, -1.694168f, -1.643923f, -1.571750f, -1.482954f, -1.380137f, -1.263897f, -1.138026f, -1.008765f, -0.879318f, -0.749674f, -0.621380f, -0.498272f, -0.382754f, -0.274712f, -0.174008f, -0.081729f, 0.000918f, 0.073950f, 0.139119f, 0.198670f, 0.253061f, 0.301763f, 0.347006f, 0.393182f, 0.441347f, 0.489362f, 0.538806f, 0.595052f, 0.658904f, 0.726443f, 0.798707f, 0.881537f, 0.974294f, 1.070091f, 1.167737f, 1.269490f, 1.366474f, 1.441595f, 1.485849f, 1.494333f, 1.449955f, 1.333119f, + 1.143665f, 0.890490f, 0.570130f, 0.186750f, -0.219462f, -0.600083f, -0.930100f, -1.155403f, -1.143394f, -0.798347f, -0.249038f, 0.187134f, 0.296878f, 0.165312f, 0.025951f, -0.009102f, 0.005434f, 0.003510f, -0.006460f, -0.001638f, 0.005342f, 0.000501f, -0.004432f, 0.000038f, 0.003617f, -0.000337f, -0.002882f, 0.000630f, 0.002437f, -0.000642f, -0.001890f, 0.000764f, 0.001542f, -0.000762f, -0.001213f, 0.000714f, 0.000864f, -0.000752f, -0.000696f, 0.000595f, 0.000364f, -0.000627f, -0.000266f, 0.000442f, 0.000006f, -0.000404f, 0.000101f, 0.000251f}, + {-0.227017f, -0.610853f, -0.818539f, -0.827113f, -0.686898f, -0.457087f, -0.160740f, 0.181063f, 0.492006f, 0.663270f, 0.645501f, 0.491623f, 0.296597f, 0.115853f, -0.045972f, -0.190366f, -0.298151f, -0.347926f, -0.342693f, -0.305048f, -0.248107f, -0.163349f, -0.044348f, 0.087150f, 0.193393f, 0.255393f, 0.280153f, 0.274932f, 0.233779f, 0.155052f, 0.055515f, -0.042313f, -0.126031f, -0.190062f, -0.227345f, -0.232206f, -0.205038f, -0.149865f, -0.073744f, 0.009150f, 0.080879f, 0.131334f, 0.161815f, 0.176140f, 0.173876f, 0.153042f, 0.113606f, 0.057194f, -0.011688f, -0.082861f, -0.142578f, -0.179538f, -0.187757f, -0.166078f, -0.118901f, -0.056731f, 0.007389f, 0.063005f, 0.104104f, 0.128523f, 0.137613f, 0.134941f, 0.123116f, 0.101857f, 0.069275f, 0.024158f, -0.032605f, -0.096564f, -0.158344f, -0.204423f, -0.220368f, -0.195089f, -0.125489f, -0.020636f, 0.097710f, 0.200646f, 0.261717f, 0.265867f, 0.214146f, 0.122474f, 0.014892f, -0.085103f, -0.160437f, -0.201917f, -0.207135f, -0.178873f, -0.123758f, -0.051585f, 0.024949f, 0.091673f, 0.136311f, 0.152061f, 0.139120f, 0.103823f, 0.056376f, 0.007840f, + -0.032834f, -0.060514f, -0.073885f, -0.074522f, -0.065753f, -0.051457f, -0.035012f, -0.018814f, -0.004264f, 0.008156f, 0.018669f, 0.027701f, 0.035397f, 0.041400f, 0.044773f, 0.044029f, 0.037643f, 0.024948f, 0.006808f, -0.014330f, -0.034848f, -0.050700f, -0.058465f, -0.056356f, -0.044689f, -0.025767f, -0.003347f, 0.018238f, 0.035205f, 0.045211f, 0.047611f, 0.043172f, 0.033577f, 0.020863f, 0.006937f, -0.006651f, -0.018658f, -0.028044f, -0.033981f, -0.035885f, -0.033444f, -0.026747f, -0.016470f, -0.003905f, 0.009212f, 0.020942f, 0.029423f, 0.033278f, 0.032010f, 0.026116f, 0.016859f, 0.005952f, -0.004786f, -0.013832f, -0.020263f, -0.023725f, -0.024216f, -0.022003f, -0.017612f, -0.011677f, -0.004775f, 0.002521f, 0.009563f, 0.015703f, 0.020359f, 0.022925f, 0.022827f, 0.019784f, 0.013935f, 0.005753f, -0.003874f, -0.013545f, -0.021660f, -0.026897f, -0.028311f, -0.025374f, -0.018350f, -0.008412f, 0.002946f, 0.014306f, 0.024069f, 0.030568f, 0.032809f, 0.030492f, 0.023239f, 0.010889f, -0.005219f, -0.022346f, -0.037579f, -0.047634f, -0.048151f, -0.035867f, -0.012072f, 0.017486f, 0.045290f, 0.062856f, + 0.061692f, 0.038856f, 0.001862f, -0.035283f, -0.059860f, -0.062195f, -0.036787f, 0.007937f, 0.044601f, 0.046634f, 0.017252f, -0.012271f, -0.017935f, -0.006337f, 0.002146f, 0.001029f, -0.001521f, -0.000459f, 0.000817f, -0.000067f, -0.000660f, 0.000353f, 0.000950f, 0.000276f, -0.000030f, 0.000569f, 0.000705f, 0.000053f, -0.000227f, 0.000069f, -0.000002f, -0.000506f, -0.000627f, -0.000349f, -0.000332f, -0.000528f, -0.000394f, -0.000037f, 0.000086f, 0.000082f, 0.000281f, 0.000519f, 0.000524f, 0.000449f, 0.000475f, 0.000435f, 0.000230f, 0.000050f} + }, + { + {-0.227017f, -0.610853f, -0.818539f, -0.827113f, -0.686898f, -0.457087f, -0.160740f, 0.181063f, 0.492006f, 0.663270f, 0.645501f, 0.491623f, 0.296597f, 0.115853f, -0.045972f, -0.190366f, -0.298151f, -0.347926f, -0.342693f, -0.305048f, -0.248107f, -0.163349f, -0.044348f, 0.087150f, 0.193393f, 0.255393f, 0.280153f, 0.274932f, 0.233779f, 0.155052f, 0.055515f, -0.042313f, -0.126031f, -0.190062f, -0.227345f, -0.232206f, -0.205038f, -0.149865f, -0.073744f, 0.009150f, 0.080879f, 0.131334f, 0.161815f, 0.176140f, 0.173876f, 0.153042f, 0.113606f, 0.057194f, -0.011688f, -0.082861f, -0.142578f, -0.179538f, -0.187757f, -0.166078f, -0.118901f, -0.056731f, 0.007389f, 0.063005f, 0.104104f, 0.128523f, 0.137613f, 0.134941f, 0.123116f, 0.101857f, 0.069275f, 0.024158f, -0.032605f, -0.096564f, -0.158344f, -0.204423f, -0.220368f, -0.195089f, -0.125489f, -0.020636f, 0.097710f, 0.200646f, 0.261717f, 0.265867f, 0.214146f, 0.122474f, 0.014892f, -0.085103f, -0.160437f, -0.201917f, -0.207135f, -0.178873f, -0.123758f, -0.051585f, 0.024949f, 0.091673f, 0.136311f, 0.152061f, 0.139120f, 0.103823f, 0.056376f, 0.007840f, + -0.032834f, -0.060514f, -0.073885f, -0.074522f, -0.065753f, -0.051457f, -0.035012f, -0.018814f, -0.004264f, 0.008156f, 0.018669f, 0.027701f, 0.035397f, 0.041400f, 0.044773f, 0.044029f, 0.037643f, 0.024948f, 0.006808f, -0.014330f, -0.034848f, -0.050700f, -0.058465f, -0.056356f, -0.044689f, -0.025767f, -0.003347f, 0.018238f, 0.035205f, 0.045211f, 0.047611f, 0.043172f, 0.033577f, 0.020863f, 0.006937f, -0.006651f, -0.018658f, -0.028044f, -0.033981f, -0.035885f, -0.033444f, -0.026747f, -0.016470f, -0.003905f, 0.009212f, 0.020942f, 0.029423f, 0.033278f, 0.032010f, 0.026116f, 0.016859f, 0.005952f, -0.004786f, -0.013832f, -0.020263f, -0.023725f, -0.024216f, -0.022003f, -0.017612f, -0.011677f, -0.004775f, 0.002521f, 0.009563f, 0.015703f, 0.020359f, 0.022925f, 0.022827f, 0.019784f, 0.013935f, 0.005753f, -0.003874f, -0.013545f, -0.021660f, -0.026897f, -0.028311f, -0.025374f, -0.018350f, -0.008412f, 0.002946f, 0.014306f, 0.024069f, 0.030568f, 0.032809f, 0.030492f, 0.023239f, 0.010889f, -0.005219f, -0.022346f, -0.037579f, -0.047634f, -0.048151f, -0.035867f, -0.012072f, 0.017486f, 0.045290f, 0.062856f, + 0.061692f, 0.038856f, 0.001862f, -0.035283f, -0.059860f, -0.062195f, -0.036787f, 0.007937f, 0.044601f, 0.046634f, 0.017252f, -0.012271f, -0.017935f, -0.006337f, 0.002146f, 0.001029f, -0.001521f, -0.000459f, 0.000817f, -0.000067f, -0.000660f, 0.000353f, 0.000950f, 0.000276f, -0.000030f, 0.000569f, 0.000705f, 0.000053f, -0.000227f, 0.000069f, -0.000002f, -0.000506f, -0.000627f, -0.000349f, -0.000332f, -0.000528f, -0.000394f, -0.000037f, 0.000086f, 0.000082f, 0.000281f, 0.000519f, 0.000524f, 0.000449f, 0.000475f, 0.000435f, 0.000230f, 0.000050f}, + {0.014162f, 0.079119f, 0.192373f, 0.273045f, 0.251924f, 0.149637f, 0.020926f, -0.122502f, -0.278057f, -0.388982f, -0.399742f, -0.356867f, -0.363688f, -0.430590f, -0.461817f, -0.411004f, -0.354648f, -0.367414f, -0.410842f, -0.409099f, -0.367287f, -0.341672f, -0.339623f, -0.322888f, -0.283709f, -0.252116f, -0.238516f, -0.220734f, -0.185306f, -0.144497f, -0.113533f, -0.096567f, -0.091951f, -0.092389f, -0.083826f, -0.057563f, -0.019655f, 0.018077f, 0.048708f, 0.067918f, 0.071323f, 0.059246f, 0.036544f, 0.005242f, -0.035854f, -0.084054f, -0.132500f, -0.177134f, -0.218733f, -0.259382f, -0.301515f, -0.348575f, -0.402779f, -0.463490f, -0.528869f, -0.596495f, -0.662478f, -0.723615f, -0.779891f, -0.831486f, -0.875283f, -0.908241f, -0.931583f, -0.947488f, -0.954629f, -0.951018f, -0.937871f, -0.916524f, -0.884692f, -0.839543f, -0.781782f, -0.714062f, -0.638421f, -0.557458f, -0.475213f, -0.395089f, -0.318909f, -0.248274f, -0.184492f, -0.127606f, -0.077917f, -0.037597f, -0.008569f, 0.009628f, 0.017312f, 0.011628f, -0.011443f, -0.053626f, -0.115452f, -0.199369f, -0.308884f, -0.444843f, -0.604506f, -0.784300f, -0.981549f, -1.192357f, + -1.409125f, -1.622569f, -1.826460f, -2.017987f, -2.192991f, -2.344549f, -2.468303f, -2.565362f, -2.636848f, -2.679384f, -2.689877f, -2.671088f, -2.627835f, -2.561060f, -2.470869f, -2.362808f, -2.245776f, -2.125343f, -2.003654f, -1.884247f, -1.772264f, -1.670297f, -1.577576f, -1.493238f, -1.418065f, -1.353009f, -1.297583f, -1.249988f, -1.208402f, -1.171974f, -1.140140f, -1.111192f, -1.083035f, -1.055899f, -1.032625f, -1.015658f, -1.005579f, -1.003175f, -1.010700f, -1.029943f, -1.060636f, -1.101560f, -1.151968f, -1.211363f, -1.278569f, -1.351093f, -1.425253f, -1.497653f, -1.566149f, -1.627979f, -1.677910f, -1.710781f, -1.724954f, -1.720277f, -1.694168f, -1.643923f, -1.571750f, -1.482954f, -1.380137f, -1.263897f, -1.138026f, -1.008765f, -0.879318f, -0.749674f, -0.621380f, -0.498272f, -0.382754f, -0.274712f, -0.174008f, -0.081729f, 0.000918f, 0.073950f, 0.139119f, 0.198670f, 0.253061f, 0.301763f, 0.347006f, 0.393182f, 0.441347f, 0.489362f, 0.538806f, 0.595052f, 0.658904f, 0.726443f, 0.798707f, 0.881537f, 0.974294f, 1.070091f, 1.167737f, 1.269490f, 1.366474f, 1.441595f, 1.485849f, 1.494333f, 1.449955f, 1.333119f, + 1.143665f, 0.890490f, 0.570130f, 0.186750f, -0.219462f, -0.600083f, -0.930100f, -1.155403f, -1.143394f, -0.798347f, -0.249038f, 0.187134f, 0.296878f, 0.165312f, 0.025951f, -0.009102f, 0.005434f, 0.003510f, -0.006460f, -0.001638f, 0.005342f, 0.000501f, -0.004432f, 0.000038f, 0.003617f, -0.000337f, -0.002882f, 0.000630f, 0.002437f, -0.000642f, -0.001890f, 0.000764f, 0.001542f, -0.000762f, -0.001213f, 0.000714f, 0.000864f, -0.000752f, -0.000696f, 0.000595f, 0.000364f, -0.000627f, -0.000266f, 0.000442f, 0.000006f, -0.000404f, 0.000101f, 0.000251f} + }, + { + {0.042732f, 0.113314f, 0.176202f, 0.252685f, 0.281884f, 0.174262f, -0.028902f, -0.180587f, -0.233986f, -0.287382f, -0.386130f, -0.425463f, -0.325835f, -0.178382f, -0.114461f, -0.125567f, -0.120866f, -0.091304f, -0.099788f, -0.149408f, -0.175401f, -0.160079f, -0.161819f, -0.218211f, -0.289828f, -0.318343f, -0.292465f, -0.240485f, -0.191978f, -0.159418f, -0.133666f, -0.090469f, -0.019098f, 0.054253f, 0.088015f, 0.069071f, 0.020080f, -0.033141f, -0.083529f, -0.132397f, -0.175396f, -0.206306f, -0.226074f, -0.242406f, -0.263892f, -0.296267f, -0.341457f, -0.399032f, -0.469188f, -0.552919f, -0.648193f, -0.748197f, -0.845109f, -0.933962f, -1.011947f, -1.076813f, -1.128569f, -1.171494f, -1.212173f, -1.255672f, -1.304491f, -1.359954f, -1.422038f, -1.487064f, -1.547033f, -1.592617f, -1.616640f, -1.614662f, -1.584205f, -1.525739f, -1.444021f, -1.346192f, -1.237997f, -1.123060f, -1.005499f, -0.890943f, -0.784138f, -0.686938f, -0.599442f, -0.522145f, -0.456501f, -0.404312f, -0.367214f, -0.346412f, -0.342532f, -0.355339f, -0.382875f, -0.421110f, -0.466097f, -0.517365f, -0.578173f, -0.651999f, -0.740613f, -0.846331f, -0.973383f, -1.124324f, + -1.296390f, -1.483783f, -1.682030f, -1.886821f, -2.089453f, -2.277670f, -2.441976f, -2.578074f, -2.682664f, -2.751303f, -2.783009f, -2.783561f, -2.760778f, -2.718619f, -2.658947f, -2.586450f, -2.507126f, -2.422614f, -2.330300f, -2.229205f, -2.122072f, -2.011250f, -1.896456f, -1.778273f, -1.660862f, -1.549002f, -1.444261f, -1.345971f, -1.254532f, -1.171530f, -1.097176f, -1.029833f, -0.968588f, -0.914945f, -0.871217f, -0.838134f, -0.814965f, -0.801436f, -0.798271f, -0.805721f, -0.822625f, -0.847489f, -0.879927f, -0.920297f, -0.968011f, -1.020724f, -1.075381f, -1.129486f, -1.180488f, -1.223986f, -1.253993f, -1.265791f, -1.257367f, -1.227234f, -1.172823f, -1.093165f, -0.991598f, -0.873296f, -0.741394f, -0.598215f, -0.448782f, -0.299472f, -0.153850f, -0.013150f, 0.119688f, 0.239921f, 0.344752f, 0.434094f, 0.507626f, 0.563828f, 0.602225f, 0.624544f, 0.633321f, 0.630521f, 0.617681f, 0.596899f, 0.571519f, 0.545119f, 0.519474f, 0.494984f, 0.473597f, 0.458663f, 0.451052f, 0.449131f, 0.453874f, 0.469249f, 0.496098f, 0.531445f, 0.575166f, 0.629762f, 0.691627f, 0.750864f, 0.800872f, 0.837878f, 0.850653f, 0.823774f, + 0.751946f, 0.637275f, 0.475061f, 0.262253f, 0.017602f, -0.229919f, -0.464480f, -0.657131f, -0.724380f, -0.581353f, -0.268217f, 0.032040f, 0.155663f, 0.110828f, 0.028755f, -0.002038f, 0.003059f, 0.003053f, -0.003352f, -0.001791f, 0.002885f, 0.000944f, -0.002489f, -0.000503f, 0.002099f, 0.000264f, -0.001661f, 0.000033f, 0.001463f, -0.000069f, -0.001127f, 0.000210f, 0.000935f, -0.000257f, -0.000759f, 0.000241f, 0.000524f, -0.000328f, -0.000468f, 0.000216f, 0.000230f, -0.000297f, -0.000215f, 0.000167f, 0.000034f, -0.000183f, 0.000005f, 0.000090f}, + {-0.250909f, -0.661336f, -0.861225f, -0.846916f, -0.664218f, -0.342701f, 0.076872f, 0.488737f, 0.753326f, 0.794678f, 0.644668f, 0.387694f, 0.087110f, -0.222402f, -0.495680f, -0.664775f, -0.675318f, -0.525707f, -0.265768f, 0.036302f, 0.319925f, 0.533105f, 0.627711f, 0.573382f, 0.381856f, 0.110168f, -0.167080f, -0.388791f, -0.515916f, -0.526706f, -0.420116f, -0.223812f, 0.011549f, 0.230567f, 0.386430f, 0.446123f, 0.398575f, 0.263648f, 0.086018f, -0.086830f, -0.222117f, -0.302172f, -0.318170f, -0.270419f, -0.172076f, -0.047006f, 0.077560f, 0.176959f, 0.232529f, 0.235587f, 0.190743f, 0.114082f, 0.026025f, -0.055703f, -0.118661f, -0.155078f, -0.161686f, -0.140558f, -0.098598f, -0.044962f, 0.011333f, 0.062126f, 0.100520f, 0.122077f, 0.125459f, 0.111411f, 0.081471f, 0.037876f, -0.015751f, -0.073456f, -0.125593f, -0.158578f, -0.158714f, -0.119549f, -0.047405f, 0.039448f, 0.117161f, 0.164530f, 0.170112f, 0.135882f, 0.075272f, 0.006299f, -0.055781f, -0.101955f, -0.128540f, -0.134431f, -0.119079f, -0.082497f, -0.027309f, 0.038596f, 0.101279f, 0.143737f, 0.152211f, 0.122702f, 0.063597f, -0.007521f, + -0.071051f, -0.112331f, -0.125169f, -0.111443f, -0.078301f, -0.034928f, 0.009839f, 0.048818f, 0.077025f, 0.091668f, 0.091678f, 0.077234f, 0.049800f, 0.012550f, -0.029326f, -0.068680f, -0.097051f, -0.106411f, -0.092004f, -0.054995f, -0.003302f, 0.050087f, 0.090874f, 0.108187f, 0.098374f, 0.065929f, 0.021166f, -0.023770f, -0.058591f, -0.077199f, -0.078302f, -0.064504f, -0.040631f, -0.012245f, 0.015405f, 0.038112f, 0.053035f, 0.058570f, 0.054242f, 0.040853f, 0.020584f, -0.003249f, -0.026598f, -0.045207f, -0.055424f, -0.055094f, -0.044048f, -0.024168f, 0.000785f, 0.025763f, 0.045560f, 0.056006f, 0.054767f, 0.041927f, 0.020280f, -0.005230f, -0.028930f, -0.045847f, -0.052644f, -0.048279f, -0.034253f, -0.014018f, 0.008118f, 0.027817f, 0.041328f, 0.046258f, 0.042077f, 0.029925f, 0.012195f, -0.007720f, -0.025950f, -0.039008f, -0.044357f, -0.040660f, -0.028307f, -0.009797f, 0.010916f, 0.029525f, 0.041957f, 0.045064f, 0.037975f, 0.022610f, 0.002456f, -0.018582f, -0.036115f, -0.045810f, -0.045173f, -0.034131f, -0.014018f, 0.012025f, 0.037399f, 0.053505f, 0.054220f, 0.038177f, 0.008264f, -0.027360f, + -0.054784f, -0.060832f, -0.042426f, -0.007657f, 0.030216f, 0.055369f, 0.051860f, 0.017076f, -0.025749f, -0.042575f, -0.023699f, 0.005650f, 0.016563f, 0.008110f, -0.000864f, -0.000797f, 0.001703f, 0.000500f, -0.001538f, -0.001141f, -0.000404f, -0.001262f, -0.001848f, -0.000816f, 0.000201f, 0.000154f, 0.000304f, 0.001238f, 0.001720f, 0.001244f, 0.000819f, 0.000784f, 0.000347f, -0.000573f, -0.001141f, -0.001202f, -0.001315f, -0.001446f, -0.001099f, -0.000403f, 0.000147f, 0.000578f, 0.001107f, 0.001494f, 0.001472f, 0.001216f, 0.000888f, 0.000349f} + }, + { + {-0.250909f, -0.661336f, -0.861225f, -0.846916f, -0.664218f, -0.342701f, 0.076872f, 0.488737f, 0.753326f, 0.794678f, 0.644668f, 0.387694f, 0.087110f, -0.222402f, -0.495680f, -0.664775f, -0.675318f, -0.525707f, -0.265768f, 0.036302f, 0.319925f, 0.533105f, 0.627711f, 0.573382f, 0.381856f, 0.110168f, -0.167080f, -0.388791f, -0.515916f, -0.526706f, -0.420116f, -0.223812f, 0.011549f, 0.230567f, 0.386430f, 0.446123f, 0.398575f, 0.263648f, 0.086018f, -0.086830f, -0.222117f, -0.302172f, -0.318170f, -0.270419f, -0.172076f, -0.047006f, 0.077560f, 0.176959f, 0.232529f, 0.235587f, 0.190743f, 0.114082f, 0.026025f, -0.055703f, -0.118661f, -0.155078f, -0.161686f, -0.140558f, -0.098598f, -0.044962f, 0.011333f, 0.062126f, 0.100520f, 0.122077f, 0.125459f, 0.111411f, 0.081471f, 0.037876f, -0.015751f, -0.073456f, -0.125593f, -0.158578f, -0.158714f, -0.119549f, -0.047405f, 0.039448f, 0.117161f, 0.164530f, 0.170112f, 0.135882f, 0.075272f, 0.006299f, -0.055781f, -0.101955f, -0.128540f, -0.134431f, -0.119079f, -0.082497f, -0.027309f, 0.038596f, 0.101279f, 0.143737f, 0.152211f, 0.122702f, 0.063597f, -0.007521f, + -0.071051f, -0.112331f, -0.125169f, -0.111443f, -0.078301f, -0.034928f, 0.009839f, 0.048818f, 0.077025f, 0.091668f, 0.091678f, 0.077234f, 0.049800f, 0.012550f, -0.029326f, -0.068680f, -0.097051f, -0.106411f, -0.092004f, -0.054995f, -0.003302f, 0.050087f, 0.090874f, 0.108187f, 0.098374f, 0.065929f, 0.021166f, -0.023770f, -0.058591f, -0.077199f, -0.078302f, -0.064504f, -0.040631f, -0.012245f, 0.015405f, 0.038112f, 0.053035f, 0.058570f, 0.054242f, 0.040853f, 0.020584f, -0.003249f, -0.026598f, -0.045207f, -0.055424f, -0.055094f, -0.044048f, -0.024168f, 0.000785f, 0.025763f, 0.045560f, 0.056006f, 0.054767f, 0.041927f, 0.020280f, -0.005230f, -0.028930f, -0.045847f, -0.052644f, -0.048279f, -0.034253f, -0.014018f, 0.008118f, 0.027817f, 0.041328f, 0.046258f, 0.042077f, 0.029925f, 0.012195f, -0.007720f, -0.025950f, -0.039008f, -0.044357f, -0.040660f, -0.028307f, -0.009797f, 0.010916f, 0.029525f, 0.041957f, 0.045064f, 0.037975f, 0.022610f, 0.002456f, -0.018582f, -0.036115f, -0.045810f, -0.045173f, -0.034131f, -0.014018f, 0.012025f, 0.037399f, 0.053505f, 0.054220f, 0.038177f, 0.008264f, -0.027360f, + -0.054784f, -0.060832f, -0.042426f, -0.007657f, 0.030216f, 0.055369f, 0.051860f, 0.017076f, -0.025749f, -0.042575f, -0.023699f, 0.005650f, 0.016563f, 0.008110f, -0.000864f, -0.000797f, 0.001703f, 0.000500f, -0.001538f, -0.001141f, -0.000404f, -0.001262f, -0.001848f, -0.000816f, 0.000201f, 0.000154f, 0.000304f, 0.001238f, 0.001720f, 0.001244f, 0.000819f, 0.000784f, 0.000347f, -0.000573f, -0.001141f, -0.001202f, -0.001315f, -0.001446f, -0.001099f, -0.000403f, 0.000147f, 0.000578f, 0.001107f, 0.001494f, 0.001472f, 0.001216f, 0.000888f, 0.000349f}, + {0.042732f, 0.113314f, 0.176202f, 0.252685f, 0.281884f, 0.174262f, -0.028902f, -0.180587f, -0.233986f, -0.287382f, -0.386130f, -0.425463f, -0.325835f, -0.178382f, -0.114461f, -0.125567f, -0.120866f, -0.091304f, -0.099788f, -0.149408f, -0.175401f, -0.160079f, -0.161819f, -0.218211f, -0.289828f, -0.318343f, -0.292465f, -0.240485f, -0.191978f, -0.159418f, -0.133666f, -0.090469f, -0.019098f, 0.054253f, 0.088015f, 0.069071f, 0.020080f, -0.033141f, -0.083529f, -0.132397f, -0.175396f, -0.206306f, -0.226074f, -0.242406f, -0.263892f, -0.296267f, -0.341457f, -0.399032f, -0.469188f, -0.552919f, -0.648193f, -0.748197f, -0.845109f, -0.933962f, -1.011947f, -1.076813f, -1.128569f, -1.171494f, -1.212173f, -1.255672f, -1.304491f, -1.359954f, -1.422038f, -1.487064f, -1.547033f, -1.592617f, -1.616640f, -1.614662f, -1.584205f, -1.525739f, -1.444021f, -1.346192f, -1.237997f, -1.123060f, -1.005499f, -0.890943f, -0.784138f, -0.686938f, -0.599442f, -0.522145f, -0.456501f, -0.404312f, -0.367214f, -0.346412f, -0.342532f, -0.355339f, -0.382875f, -0.421110f, -0.466097f, -0.517365f, -0.578173f, -0.651999f, -0.740613f, -0.846331f, -0.973383f, -1.124324f, + -1.296390f, -1.483783f, -1.682030f, -1.886821f, -2.089453f, -2.277670f, -2.441976f, -2.578074f, -2.682664f, -2.751303f, -2.783009f, -2.783561f, -2.760778f, -2.718619f, -2.658947f, -2.586450f, -2.507126f, -2.422614f, -2.330300f, -2.229205f, -2.122072f, -2.011250f, -1.896456f, -1.778273f, -1.660862f, -1.549002f, -1.444261f, -1.345971f, -1.254532f, -1.171530f, -1.097176f, -1.029833f, -0.968588f, -0.914945f, -0.871217f, -0.838134f, -0.814965f, -0.801436f, -0.798271f, -0.805721f, -0.822625f, -0.847489f, -0.879927f, -0.920297f, -0.968011f, -1.020724f, -1.075381f, -1.129486f, -1.180488f, -1.223986f, -1.253993f, -1.265791f, -1.257367f, -1.227234f, -1.172823f, -1.093165f, -0.991598f, -0.873296f, -0.741394f, -0.598215f, -0.448782f, -0.299472f, -0.153850f, -0.013150f, 0.119688f, 0.239921f, 0.344752f, 0.434094f, 0.507626f, 0.563828f, 0.602225f, 0.624544f, 0.633321f, 0.630521f, 0.617681f, 0.596899f, 0.571519f, 0.545119f, 0.519474f, 0.494984f, 0.473597f, 0.458663f, 0.451052f, 0.449131f, 0.453874f, 0.469249f, 0.496098f, 0.531445f, 0.575166f, 0.629762f, 0.691627f, 0.750864f, 0.800872f, 0.837878f, 0.850653f, 0.823774f, + 0.751946f, 0.637275f, 0.475061f, 0.262253f, 0.017602f, -0.229919f, -0.464480f, -0.657131f, -0.724380f, -0.581353f, -0.268217f, 0.032040f, 0.155663f, 0.110828f, 0.028755f, -0.002038f, 0.003059f, 0.003053f, -0.003352f, -0.001791f, 0.002885f, 0.000944f, -0.002489f, -0.000503f, 0.002099f, 0.000264f, -0.001661f, 0.000033f, 0.001463f, -0.000069f, -0.001127f, 0.000210f, 0.000935f, -0.000257f, -0.000759f, 0.000241f, 0.000524f, -0.000328f, -0.000468f, 0.000216f, 0.000230f, -0.000297f, -0.000215f, 0.000167f, 0.000034f, -0.000183f, 0.000005f, 0.000090f} + }, + { + {-0.008117f, -0.029088f, -0.057048f, -0.081735f, -0.092189f, -0.085100f, -0.046258f, 0.061013f, 0.247665f, 0.439587f, 0.518097f, 0.436893f, 0.258432f, 0.069209f, -0.085972f, -0.179131f, -0.182780f, -0.110632f, -0.018595f, 0.061348f, 0.137561f, 0.195698f, 0.184660f, 0.090981f, -0.029833f, -0.119427f, -0.163497f, -0.160991f, -0.107102f, -0.026915f, 0.027637f, 0.034786f, 0.014084f, -0.027320f, -0.111107f, -0.240023f, -0.378923f, -0.496585f, -0.591277f, -0.668375f, -0.726093f, -0.769534f, -0.811105f, -0.852336f, -0.884973f, -0.908307f, -0.928671f, -0.947596f, -0.965411f, -0.988396f, -1.019242f, -1.049599f, -1.072930f, -1.095057f, -1.123669f, -1.157984f, -1.195511f, -1.238117f, -1.285188f, -1.330071f, -1.368128f, -1.401405f, -1.433429f, -1.465837f, -1.500686f, -1.540528f, -1.585844f, -1.634999f, -1.684816f, -1.729881f, -1.764985f, -1.789120f, -1.803259f, -1.805236f, -1.792176f, -1.766414f, -1.732839f, -1.691843f, -1.640852f, -1.580948f, -1.516199f, -1.448521f, -1.378711f, -1.310591f, -1.249109f, -1.195647f, -1.148671f, -1.107399f, -1.072096f, -1.042222f, -1.016132f, -0.991629f, -0.966575f, -0.940263f, -0.913765f, -0.887830f, + -0.861818f, -0.835753f, -0.811153f, -0.788325f, -0.765201f, -0.740195f, -0.713773f, -0.686076f, -0.655627f, -0.621644f, -0.585391f, -0.548400f, -0.511253f, -0.474595f, -0.439641f, -0.407373f, -0.378310f, -0.352841f, -0.330952f, -0.312187f, -0.296447f, -0.283965f, -0.274268f, -0.266290f, -0.259673f, -0.254827f, -0.251774f, -0.250098f, -0.249925f, -0.251995f, -0.257051f, -0.265902f, -0.279634f, -0.299233f, -0.325552f, -0.359646f, -0.402100f, -0.451970f, -0.507511f, -0.567748f, -0.632019f, -0.698338f, -0.763997f, -0.827724f, -0.889545f, -0.948515f, -1.002452f, -1.050350f, -1.093294f, -1.132284f, -1.166691f, -1.195985f, -1.221676f, -1.245932f, -1.269000f, -1.289688f, -1.308062f, -1.325687f, -1.342928f, -1.357937f, -1.369096f, -1.376762f, -1.381406f, -1.381343f, -1.373935f, -1.358365f, -1.335436f, -1.304589f, -1.262934f, -1.208217f, -1.141032f, -1.062204f, -0.969496f, -0.859997f, -0.734719f, -0.596717f, -0.445375f, -0.277897f, -0.096215f, 0.094002f, 0.291185f, 0.497134f, 0.708325f, 0.916667f, 1.119036f, 1.316063f, 1.501707f, 1.665244f, 1.802397f, 1.911586f, 1.981297f, 1.995663f, 1.949047f, 1.839685f, 1.656456f, 1.391696f, + 1.058526f, 0.675467f, 0.249613f, -0.199264f, -0.619582f, -0.963618f, -1.208061f, -1.294816f, -1.109269f, -0.622127f, -0.037804f, 0.321944f, 0.325104f, 0.139499f, 0.005477f, -0.011392f, 0.006042f, 0.001000f, -0.006817f, 0.000382f, 0.005296f, -0.001059f, -0.004165f, 0.001245f, 0.003241f, -0.001280f, -0.002498f, 0.001306f, 0.002025f, -0.001148f, -0.001520f, 0.001099f, 0.001208f, -0.000964f, -0.000921f, 0.000826f, 0.000648f, -0.000761f, -0.000515f, 0.000575f, 0.000271f, -0.000542f, -0.000203f, 0.000365f, 0.000014f, -0.000310f, 0.000064f, 0.000181f}, + {-0.129981f, -0.372476f, -0.578529f, -0.729243f, -0.764475f, -0.635793f, -0.411234f, -0.258736f, -0.302102f, -0.525369f, -0.805126f, -0.991322f, -0.983991f, -0.803176f, -0.584723f, -0.458600f, -0.436987f, -0.451679f, -0.459616f, -0.451677f, -0.395154f, -0.251867f, -0.050784f, 0.123344f, 0.221870f, 0.269667f, 0.313652f, 0.376737f, 0.462841f, 0.567567f, 0.673170f, 0.754338f, 0.795107f, 0.792591f, 0.752470f, 0.691691f, 0.634947f, 0.595069f, 0.562305f, 0.519235f, 0.458575f, 0.383012f, 0.298227f, 0.211056f, 0.126529f, 0.043347f, -0.042514f, -0.130277f, -0.215859f, -0.298302f, -0.378918f, -0.456881f, -0.530468f, -0.598896f, -0.658825f, -0.703316f, -0.727822f, -0.733246f, -0.721133f, -0.690755f, -0.642644f, -0.580117f, -0.505916f, -0.421525f, -0.330087f, -0.235562f, -0.138750f, -0.037980f, 0.066169f, 0.169625f, 0.267531f, 0.355691f, 0.430568f, 0.490492f, 0.536392f, 0.569778f, 0.590566f, 0.597566f, 0.590084f, 0.568477f, 0.533880f, 0.487697f, 0.431144f, 0.365726f, 0.294260f, 0.220525f, 0.147743f, 0.078228f, 0.014043f, -0.043456f, -0.094326f, -0.138832f, -0.176068f, -0.205120f, -0.226671f, -0.241986f, + -0.251293f, -0.254596f, -0.252994f, -0.247846f, -0.239708f, -0.229246f, -0.218093f, -0.207780f, -0.198730f, -0.190983f, -0.184906f, -0.180621f, -0.177602f, -0.175210f, -0.173034f, -0.170646f, -0.167447f, -0.162637f, -0.155080f, -0.143537f, -0.127170f, -0.105418f, -0.077693f, -0.043897f, -0.004918f, 0.038190f, 0.084983f, 0.134821f, 0.186035f, 0.236843f, 0.286214f, 0.332895f, 0.374623f, 0.409400f, 0.436550f, 0.455532f, 0.464788f, 0.462789f, 0.449137f, 0.423624f, 0.385300f, 0.333570f, 0.269292f, 0.193801f, 0.107779f, 0.012194f, -0.090333f, -0.196122f, -0.301746f, -0.403692f, -0.497310f, -0.577424f, -0.639930f, -0.681870f, -0.700365f, -0.693007f, -0.659496f, -0.601723f, -0.522170f, -0.423547f, -0.310025f, -0.187155f, -0.060052f, 0.067102f, 0.189708f, 0.302691f, 0.402232f, 0.486145f, 0.552331f, 0.598446f, 0.623264f, 0.626838f, 0.609193f, 0.570294f, 0.511336f, 0.434835f, 0.343621f, 0.240782f, 0.130231f, 0.016430f, -0.096110f, -0.202773f, -0.299055f, -0.381032f, -0.445029f, -0.487486f, -0.506123f, -0.500243f, -0.469027f, -0.411517f, -0.329438f, -0.227615f, -0.111000f, 0.014761f, 0.139062f, 0.247906f, + 0.330788f, 0.380428f, 0.386990f, 0.342751f, 0.253257f, 0.133183f, -0.006044f, -0.145689f, -0.238420f, -0.230859f, -0.127035f, -0.005841f, 0.051207f, 0.037489f, 0.006530f, -0.003104f, 0.001464f, 0.002113f, -0.000555f, 0.000795f, 0.003689f, 0.003262f, 0.002035f, 0.003451f, 0.005181f, 0.004704f, 0.004097f, 0.005202f, 0.006175f, 0.005667f, 0.005284f, 0.005991f, 0.006394f, 0.005824f, 0.005470f, 0.005772f, 0.005730f, 0.005088f, 0.004674f, 0.004609f, 0.004237f, 0.003551f, 0.003059f, 0.002698f, 0.002121f, 0.001454f, 0.000907f, 0.000332f} + }, + { + {-0.129981f, -0.372476f, -0.578529f, -0.729243f, -0.764475f, -0.635793f, -0.411234f, -0.258736f, -0.302102f, -0.525369f, -0.805126f, -0.991322f, -0.983991f, -0.803176f, -0.584723f, -0.458600f, -0.436987f, -0.451679f, -0.459616f, -0.451677f, -0.395154f, -0.251867f, -0.050784f, 0.123344f, 0.221870f, 0.269667f, 0.313652f, 0.376737f, 0.462841f, 0.567567f, 0.673170f, 0.754338f, 0.795107f, 0.792591f, 0.752470f, 0.691691f, 0.634947f, 0.595069f, 0.562305f, 0.519235f, 0.458575f, 0.383012f, 0.298227f, 0.211056f, 0.126529f, 0.043347f, -0.042514f, -0.130277f, -0.215859f, -0.298302f, -0.378918f, -0.456881f, -0.530468f, -0.598896f, -0.658825f, -0.703316f, -0.727822f, -0.733246f, -0.721133f, -0.690755f, -0.642644f, -0.580117f, -0.505916f, -0.421525f, -0.330087f, -0.235562f, -0.138750f, -0.037980f, 0.066169f, 0.169625f, 0.267531f, 0.355691f, 0.430568f, 0.490492f, 0.536392f, 0.569778f, 0.590566f, 0.597566f, 0.590084f, 0.568477f, 0.533880f, 0.487697f, 0.431144f, 0.365726f, 0.294260f, 0.220525f, 0.147743f, 0.078228f, 0.014043f, -0.043456f, -0.094326f, -0.138832f, -0.176068f, -0.205120f, -0.226671f, -0.241986f, + -0.251293f, -0.254596f, -0.252994f, -0.247846f, -0.239708f, -0.229246f, -0.218093f, -0.207780f, -0.198730f, -0.190983f, -0.184906f, -0.180621f, -0.177602f, -0.175210f, -0.173034f, -0.170646f, -0.167447f, -0.162637f, -0.155080f, -0.143537f, -0.127170f, -0.105418f, -0.077693f, -0.043897f, -0.004918f, 0.038190f, 0.084983f, 0.134821f, 0.186035f, 0.236843f, 0.286214f, 0.332895f, 0.374623f, 0.409400f, 0.436550f, 0.455532f, 0.464788f, 0.462789f, 0.449137f, 0.423624f, 0.385300f, 0.333570f, 0.269292f, 0.193801f, 0.107779f, 0.012194f, -0.090333f, -0.196122f, -0.301746f, -0.403692f, -0.497310f, -0.577424f, -0.639930f, -0.681870f, -0.700365f, -0.693007f, -0.659496f, -0.601723f, -0.522170f, -0.423547f, -0.310025f, -0.187155f, -0.060052f, 0.067102f, 0.189708f, 0.302691f, 0.402232f, 0.486145f, 0.552331f, 0.598446f, 0.623264f, 0.626838f, 0.609193f, 0.570294f, 0.511336f, 0.434835f, 0.343621f, 0.240782f, 0.130231f, 0.016430f, -0.096110f, -0.202773f, -0.299055f, -0.381032f, -0.445029f, -0.487486f, -0.506123f, -0.500243f, -0.469027f, -0.411517f, -0.329438f, -0.227615f, -0.111000f, 0.014761f, 0.139062f, 0.247906f, + 0.330788f, 0.380428f, 0.386990f, 0.342751f, 0.253257f, 0.133183f, -0.006044f, -0.145689f, -0.238420f, -0.230859f, -0.127035f, -0.005841f, 0.051207f, 0.037489f, 0.006530f, -0.003104f, 0.001464f, 0.002113f, -0.000555f, 0.000795f, 0.003689f, 0.003262f, 0.002035f, 0.003451f, 0.005181f, 0.004704f, 0.004097f, 0.005202f, 0.006175f, 0.005667f, 0.005284f, 0.005991f, 0.006394f, 0.005824f, 0.005470f, 0.005772f, 0.005730f, 0.005088f, 0.004674f, 0.004609f, 0.004237f, 0.003551f, 0.003059f, 0.002698f, 0.002121f, 0.001454f, 0.000907f, 0.000332f}, + {-0.008117f, -0.029088f, -0.057048f, -0.081735f, -0.092189f, -0.085100f, -0.046258f, 0.061013f, 0.247665f, 0.439587f, 0.518097f, 0.436893f, 0.258432f, 0.069209f, -0.085972f, -0.179131f, -0.182780f, -0.110632f, -0.018595f, 0.061348f, 0.137561f, 0.195698f, 0.184660f, 0.090981f, -0.029833f, -0.119427f, -0.163497f, -0.160991f, -0.107102f, -0.026915f, 0.027637f, 0.034786f, 0.014084f, -0.027320f, -0.111107f, -0.240023f, -0.378923f, -0.496585f, -0.591277f, -0.668375f, -0.726093f, -0.769534f, -0.811105f, -0.852336f, -0.884973f, -0.908307f, -0.928671f, -0.947596f, -0.965411f, -0.988396f, -1.019242f, -1.049599f, -1.072930f, -1.095057f, -1.123669f, -1.157984f, -1.195511f, -1.238117f, -1.285188f, -1.330071f, -1.368128f, -1.401405f, -1.433429f, -1.465837f, -1.500686f, -1.540528f, -1.585844f, -1.634999f, -1.684816f, -1.729881f, -1.764985f, -1.789120f, -1.803259f, -1.805236f, -1.792176f, -1.766414f, -1.732839f, -1.691843f, -1.640852f, -1.580948f, -1.516199f, -1.448521f, -1.378711f, -1.310591f, -1.249109f, -1.195647f, -1.148671f, -1.107399f, -1.072096f, -1.042222f, -1.016132f, -0.991629f, -0.966575f, -0.940263f, -0.913765f, -0.887830f, + -0.861818f, -0.835753f, -0.811153f, -0.788325f, -0.765201f, -0.740195f, -0.713773f, -0.686076f, -0.655627f, -0.621644f, -0.585391f, -0.548400f, -0.511253f, -0.474595f, -0.439641f, -0.407373f, -0.378310f, -0.352841f, -0.330952f, -0.312187f, -0.296447f, -0.283965f, -0.274268f, -0.266290f, -0.259673f, -0.254827f, -0.251774f, -0.250098f, -0.249925f, -0.251995f, -0.257051f, -0.265902f, -0.279634f, -0.299233f, -0.325552f, -0.359646f, -0.402100f, -0.451970f, -0.507511f, -0.567748f, -0.632019f, -0.698338f, -0.763997f, -0.827724f, -0.889545f, -0.948515f, -1.002452f, -1.050350f, -1.093294f, -1.132284f, -1.166691f, -1.195985f, -1.221676f, -1.245932f, -1.269000f, -1.289688f, -1.308062f, -1.325687f, -1.342928f, -1.357937f, -1.369096f, -1.376762f, -1.381406f, -1.381343f, -1.373935f, -1.358365f, -1.335436f, -1.304589f, -1.262934f, -1.208217f, -1.141032f, -1.062204f, -0.969496f, -0.859997f, -0.734719f, -0.596717f, -0.445375f, -0.277897f, -0.096215f, 0.094002f, 0.291185f, 0.497134f, 0.708325f, 0.916667f, 1.119036f, 1.316063f, 1.501707f, 1.665244f, 1.802397f, 1.911586f, 1.981297f, 1.995663f, 1.949047f, 1.839685f, 1.656456f, 1.391696f, + 1.058526f, 0.675467f, 0.249613f, -0.199264f, -0.619582f, -0.963618f, -1.208061f, -1.294816f, -1.109269f, -0.622127f, -0.037804f, 0.321944f, 0.325104f, 0.139499f, 0.005477f, -0.011392f, 0.006042f, 0.001000f, -0.006817f, 0.000382f, 0.005296f, -0.001059f, -0.004165f, 0.001245f, 0.003241f, -0.001280f, -0.002498f, 0.001306f, 0.002025f, -0.001148f, -0.001520f, 0.001099f, 0.001208f, -0.000964f, -0.000921f, 0.000826f, 0.000648f, -0.000761f, -0.000515f, 0.000575f, 0.000271f, -0.000542f, -0.000203f, 0.000365f, 0.000014f, -0.000310f, 0.000064f, 0.000181f} + }, + { + {0.008190f, 0.034888f, 0.081874f, 0.116453f, 0.067094f, -0.082555f, -0.227904f, -0.249422f, -0.166350f, -0.098117f, -0.087469f, -0.065513f, 0.001855f, 0.042159f, -0.012688f, -0.131557f, -0.247601f, -0.349249f, -0.457508f, -0.561835f, -0.630448f, -0.658599f, -0.667824f, -0.671646f, -0.668196f, -0.656704f, -0.642420f, -0.629382f, -0.617003f, -0.600360f, -0.572717f, -0.533674f, -0.493429f, -0.462386f, -0.438760f, -0.412139f, -0.375853f, -0.330971f, -0.282717f, -0.238117f, -0.203462f, -0.180067f, -0.164967f, -0.156908f, -0.157974f, -0.169237f, -0.189236f, -0.216716f, -0.250505f, -0.286503f, -0.318305f, -0.341119f, -0.353602f, -0.357480f, -0.357254f, -0.358766f, -0.366736f, -0.384550f, -0.415390f, -0.460458f, -0.516507f, -0.578128f, -0.641870f, -0.705454f, -0.764761f, -0.815673f, -0.858195f, -0.895392f, -0.928966f, -0.958784f, -0.985672f, -1.011344f, -1.035621f, -1.056027f, -1.070215f, -1.077265f, -1.076660f, -1.067391f, -1.048879f, -1.022623f, -0.992247f, -0.961199f, -0.930579f, -0.899824f, -0.868625f, -0.836503f, -0.801127f, -0.759410f, -0.710653f, -0.657040f, -0.601236f, -0.545210f, -0.491176f, -0.441730f, -0.398758f, -0.363349f, + -0.336665f, -0.320266f, -0.316119f, -0.326652f, -0.353697f, -0.396932f, -0.454447f, -0.524739f, -0.606457f, -0.696467f, -0.790534f, -0.886232f, -0.982956f, -1.078838f, -1.170101f, -1.254114f, -1.330746f, -1.399796f, -1.459170f, -1.506984f, -1.544018f, -1.572526f, -1.593450f, -1.606422f, -1.612266f, -1.613693f, -1.612687f, -1.608581f, -1.599998f, -1.587506f, -1.572353f, -1.553391f, -1.527791f, -1.494748f, -1.455923f, -1.412055f, -1.361940f, -1.305585f, -1.245838f, -1.185662f, -1.125860f, -1.066742f, -1.010255f, -0.958897f, -0.913497f, -0.873308f, -0.837820f, -0.807504f, -0.782697f, -0.762352f, -0.744553f, -0.728283f, -0.713809f, -0.700821f, -0.687346f, -0.671620f, -0.653905f, -0.634922f, -0.613574f, -0.588053f, -0.558390f, -0.525864f, -0.490403f, -0.450535f, -0.405710f, -0.356898f, -0.304721f, -0.248343f, -0.186701f, -0.120081f, -0.049746f, 0.023859f, 0.101582f, 0.183602f, 0.268055f, 0.353082f, 0.439140f, 0.527019f, 0.614682f, 0.699065f, 0.779803f, 0.857431f, 0.929095f, 0.990466f, 1.040682f, 1.080471f, 1.106909f, 1.115475f, 1.105390f, 1.077041f, 1.026573f, 0.949561f, 0.847139f, 0.722093f, 0.573442f, 0.402441f, + 0.218506f, 0.031580f, -0.153644f, -0.327407f, -0.469724f, -0.565679f, -0.610055f, -0.583192f, -0.449188f, -0.214263f, 0.027773f, 0.156235f, 0.139393f, 0.057497f, 0.003774f, -0.003113f, 0.002375f, -0.000038f, -0.002481f, 0.000451f, 0.001892f, -0.000644f, -0.001493f, 0.000649f, 0.001158f, -0.000616f, -0.000874f, 0.000622f, 0.000731f, -0.000522f, -0.000530f, 0.000507f, 0.000429f, -0.000443f, -0.000326f, 0.000378f, 0.000213f, -0.000364f, -0.000182f, 0.000267f, 0.000064f, -0.000275f, -0.000058f, 0.000182f, -0.000037f, -0.000172f, 0.000059f, 0.000111f}, + {-0.185552f, -0.533696f, -0.795197f, -0.893542f, -0.804694f, -0.602960f, -0.410567f, -0.289207f, -0.193943f, -0.044154f, 0.172404f, 0.382927f, 0.509981f, 0.545225f, 0.535614f, 0.515453f, 0.471712f, 0.372577f, 0.213012f, 0.026048f, -0.142991f, -0.267749f, -0.350655f, -0.407879f, -0.446665f, -0.457344f, -0.425810f, -0.349287f, -0.237376f, -0.102660f, 0.042599f, 0.181681f, 0.293768f, 0.363653f, 0.388804f, 0.375465f, 0.331172f, 0.263138f, 0.180465f, 0.093512f, 0.010635f, -0.063321f, -0.126103f, -0.177013f, -0.216204f, -0.243567f, -0.258067f, -0.258312f, -0.243240f, -0.211844f, -0.162993f, -0.096687f, -0.016030f, 0.071984f, 0.157709f, 0.231389f, 0.285400f, 0.314867f, 0.316825f, 0.289600f, 0.233632f, 0.152889f, 0.055165f, -0.049222f, -0.149371f, -0.235386f, -0.299246f, -0.334965f, -0.338337f, -0.307007f, -0.241511f, -0.147028f, -0.034470f, 0.080542f, 0.180988f, 0.252633f, 0.287299f, 0.284302f, 0.249915f, 0.194921f, 0.130906f, 0.066951f, 0.008345f, -0.042679f, -0.085530f, -0.120133f, -0.146148f, -0.162494f, -0.167472f, -0.159538f, -0.138348f, -0.105550f, -0.064858f, -0.021185f, 0.020732f, 0.057343f, + 0.086513f, 0.107283f, 0.119553f, 0.123700f, 0.120200f, 0.109487f, 0.092076f, 0.068684f, 0.040301f, 0.008337f, -0.025230f, -0.057916f, -0.086954f, -0.109551f, -0.123233f, -0.126275f, -0.118020f, -0.098962f, -0.070752f, -0.036148f, 0.001325f, 0.037957f, 0.070371f, 0.095805f, 0.112323f, 0.118906f, 0.115335f, 0.102001f, 0.079886f, 0.050640f, 0.016580f, -0.019334f, -0.053532f, -0.082149f, -0.101715f, -0.109891f, -0.105925f, -0.090814f, -0.067155f, -0.038578f, -0.008949f, 0.018297f, 0.040562f, 0.056348f, 0.065287f, 0.067860f, 0.065030f, 0.058014f, 0.048082f, 0.036305f, 0.023471f, 0.010221f, -0.002870f, -0.015342f, -0.026773f, -0.036614f, -0.044221f, -0.049020f, -0.050549f, -0.048442f, -0.042587f, -0.033275f, -0.021107f, -0.006895f, 0.008283f, 0.023113f, 0.036282f, 0.046616f, 0.053077f, 0.054911f, 0.051880f, 0.044235f, 0.032557f, 0.017817f, 0.001348f, -0.015481f, -0.031425f, -0.045128f, -0.055171f, -0.060547f, -0.060691f, -0.055031f, -0.043176f, -0.025610f, -0.003626f, 0.021182f, 0.046431f, 0.068218f, 0.082097f, 0.084759f, 0.074213f, 0.049725f, 0.013674f, -0.027125f, -0.063792f, -0.088620f, + -0.095442f, -0.080235f, -0.045136f, -0.000219f, 0.041813f, 0.070718f, 0.077187f, 0.054136f, 0.008482f, -0.033225f, -0.044133f, -0.024284f, 0.000669f, 0.009571f, 0.005114f, 0.001035f, 0.001842f, 0.002776f, 0.001639f, 0.000950f, 0.001513f, 0.001381f, 0.000219f, -0.000400f, -0.000314f, -0.000719f, -0.001578f, -0.001885f, -0.001710f, -0.001817f, -0.002061f, -0.001831f, -0.001308f, -0.000982f, -0.000701f, -0.000138f, 0.000498f, 0.000915f, 0.001247f, 0.001644f, 0.001936f, 0.001998f, 0.001941f, 0.001829f, 0.001581f, 0.001190f, 0.000735f, 0.000251f} + }, + { + {-0.185552f, -0.533696f, -0.795197f, -0.893542f, -0.804694f, -0.602960f, -0.410567f, -0.289207f, -0.193943f, -0.044154f, 0.172404f, 0.382927f, 0.509981f, 0.545225f, 0.535614f, 0.515453f, 0.471712f, 0.372577f, 0.213012f, 0.026048f, -0.142991f, -0.267749f, -0.350655f, -0.407879f, -0.446665f, -0.457344f, -0.425810f, -0.349287f, -0.237376f, -0.102660f, 0.042599f, 0.181681f, 0.293768f, 0.363653f, 0.388804f, 0.375465f, 0.331172f, 0.263138f, 0.180465f, 0.093512f, 0.010635f, -0.063321f, -0.126103f, -0.177013f, -0.216204f, -0.243567f, -0.258067f, -0.258312f, -0.243240f, -0.211844f, -0.162993f, -0.096687f, -0.016030f, 0.071984f, 0.157709f, 0.231389f, 0.285400f, 0.314867f, 0.316825f, 0.289600f, 0.233632f, 0.152889f, 0.055165f, -0.049222f, -0.149371f, -0.235386f, -0.299246f, -0.334965f, -0.338337f, -0.307007f, -0.241511f, -0.147028f, -0.034470f, 0.080542f, 0.180988f, 0.252633f, 0.287299f, 0.284302f, 0.249915f, 0.194921f, 0.130906f, 0.066951f, 0.008345f, -0.042679f, -0.085530f, -0.120133f, -0.146148f, -0.162494f, -0.167472f, -0.159538f, -0.138348f, -0.105550f, -0.064858f, -0.021185f, 0.020732f, 0.057343f, + 0.086513f, 0.107283f, 0.119553f, 0.123700f, 0.120200f, 0.109487f, 0.092076f, 0.068684f, 0.040301f, 0.008337f, -0.025230f, -0.057916f, -0.086954f, -0.109551f, -0.123233f, -0.126275f, -0.118020f, -0.098962f, -0.070752f, -0.036148f, 0.001325f, 0.037957f, 0.070371f, 0.095805f, 0.112323f, 0.118906f, 0.115335f, 0.102001f, 0.079886f, 0.050640f, 0.016580f, -0.019334f, -0.053532f, -0.082149f, -0.101715f, -0.109891f, -0.105925f, -0.090814f, -0.067155f, -0.038578f, -0.008949f, 0.018297f, 0.040562f, 0.056348f, 0.065287f, 0.067860f, 0.065030f, 0.058014f, 0.048082f, 0.036305f, 0.023471f, 0.010221f, -0.002870f, -0.015342f, -0.026773f, -0.036614f, -0.044221f, -0.049020f, -0.050549f, -0.048442f, -0.042587f, -0.033275f, -0.021107f, -0.006895f, 0.008283f, 0.023113f, 0.036282f, 0.046616f, 0.053077f, 0.054911f, 0.051880f, 0.044235f, 0.032557f, 0.017817f, 0.001348f, -0.015481f, -0.031425f, -0.045128f, -0.055171f, -0.060547f, -0.060691f, -0.055031f, -0.043176f, -0.025610f, -0.003626f, 0.021182f, 0.046431f, 0.068218f, 0.082097f, 0.084759f, 0.074213f, 0.049725f, 0.013674f, -0.027125f, -0.063792f, -0.088620f, + -0.095442f, -0.080235f, -0.045136f, -0.000219f, 0.041813f, 0.070718f, 0.077187f, 0.054136f, 0.008482f, -0.033225f, -0.044133f, -0.024284f, 0.000669f, 0.009571f, 0.005114f, 0.001035f, 0.001842f, 0.002776f, 0.001639f, 0.000950f, 0.001513f, 0.001381f, 0.000219f, -0.000400f, -0.000314f, -0.000719f, -0.001578f, -0.001885f, -0.001710f, -0.001817f, -0.002061f, -0.001831f, -0.001308f, -0.000982f, -0.000701f, -0.000138f, 0.000498f, 0.000915f, 0.001247f, 0.001644f, 0.001936f, 0.001998f, 0.001941f, 0.001829f, 0.001581f, 0.001190f, 0.000735f, 0.000251f}, + {0.008190f, 0.034888f, 0.081874f, 0.116453f, 0.067094f, -0.082555f, -0.227904f, -0.249422f, -0.166350f, -0.098117f, -0.087469f, -0.065513f, 0.001855f, 0.042159f, -0.012688f, -0.131557f, -0.247601f, -0.349249f, -0.457508f, -0.561835f, -0.630448f, -0.658599f, -0.667824f, -0.671646f, -0.668196f, -0.656704f, -0.642420f, -0.629382f, -0.617003f, -0.600360f, -0.572717f, -0.533674f, -0.493429f, -0.462386f, -0.438760f, -0.412139f, -0.375853f, -0.330971f, -0.282717f, -0.238117f, -0.203462f, -0.180067f, -0.164967f, -0.156908f, -0.157974f, -0.169237f, -0.189236f, -0.216716f, -0.250505f, -0.286503f, -0.318305f, -0.341119f, -0.353602f, -0.357480f, -0.357254f, -0.358766f, -0.366736f, -0.384550f, -0.415390f, -0.460458f, -0.516507f, -0.578128f, -0.641870f, -0.705454f, -0.764761f, -0.815673f, -0.858195f, -0.895392f, -0.928966f, -0.958784f, -0.985672f, -1.011344f, -1.035621f, -1.056027f, -1.070215f, -1.077265f, -1.076660f, -1.067391f, -1.048879f, -1.022623f, -0.992247f, -0.961199f, -0.930579f, -0.899824f, -0.868625f, -0.836503f, -0.801127f, -0.759410f, -0.710653f, -0.657040f, -0.601236f, -0.545210f, -0.491176f, -0.441730f, -0.398758f, -0.363349f, + -0.336665f, -0.320266f, -0.316119f, -0.326652f, -0.353697f, -0.396932f, -0.454447f, -0.524739f, -0.606457f, -0.696467f, -0.790534f, -0.886232f, -0.982956f, -1.078838f, -1.170101f, -1.254114f, -1.330746f, -1.399796f, -1.459170f, -1.506984f, -1.544018f, -1.572526f, -1.593450f, -1.606422f, -1.612266f, -1.613693f, -1.612687f, -1.608581f, -1.599998f, -1.587506f, -1.572353f, -1.553391f, -1.527791f, -1.494748f, -1.455923f, -1.412055f, -1.361940f, -1.305585f, -1.245838f, -1.185662f, -1.125860f, -1.066742f, -1.010255f, -0.958897f, -0.913497f, -0.873308f, -0.837820f, -0.807504f, -0.782697f, -0.762352f, -0.744553f, -0.728283f, -0.713809f, -0.700821f, -0.687346f, -0.671620f, -0.653905f, -0.634922f, -0.613574f, -0.588053f, -0.558390f, -0.525864f, -0.490403f, -0.450535f, -0.405710f, -0.356898f, -0.304721f, -0.248343f, -0.186701f, -0.120081f, -0.049746f, 0.023859f, 0.101582f, 0.183602f, 0.268055f, 0.353082f, 0.439140f, 0.527019f, 0.614682f, 0.699065f, 0.779803f, 0.857431f, 0.929095f, 0.990466f, 1.040682f, 1.080471f, 1.106909f, 1.115475f, 1.105390f, 1.077041f, 1.026573f, 0.949561f, 0.847139f, 0.722093f, 0.573442f, 0.402441f, + 0.218506f, 0.031580f, -0.153644f, -0.327407f, -0.469724f, -0.565679f, -0.610055f, -0.583192f, -0.449188f, -0.214263f, 0.027773f, 0.156235f, 0.139393f, 0.057497f, 0.003774f, -0.003113f, 0.002375f, -0.000038f, -0.002481f, 0.000451f, 0.001892f, -0.000644f, -0.001493f, 0.000649f, 0.001158f, -0.000616f, -0.000874f, 0.000622f, 0.000731f, -0.000522f, -0.000530f, 0.000507f, 0.000429f, -0.000443f, -0.000326f, 0.000378f, 0.000213f, -0.000364f, -0.000182f, 0.000267f, 0.000064f, -0.000275f, -0.000058f, 0.000182f, -0.000037f, -0.000172f, 0.000059f, 0.000111f} + }, + { + {0.000548f, 0.016581f, 0.053765f, 0.073281f, 0.025961f, -0.087700f, -0.207119f, -0.273414f, -0.285064f, -0.274298f, -0.250255f, -0.200671f, -0.140017f, -0.114239f, -0.149921f, -0.229225f, -0.323553f, -0.423074f, -0.520572f, -0.593892f, -0.626821f, -0.633223f, -0.641666f, -0.663565f, -0.689675f, -0.710438f, -0.725598f, -0.736662f, -0.742149f, -0.741673f, -0.737421f, -0.729820f, -0.715763f, -0.691715f, -0.655607f, -0.606006f, -0.543295f, -0.472954f, -0.404984f, -0.347908f, -0.304206f, -0.272432f, -0.251856f, -0.242831f, -0.243698f, -0.250172f, -0.258244f, -0.266093f, -0.273123f, -0.278938f, -0.283885f, -0.289531f, -0.298203f, -0.312469f, -0.334435f, -0.364557f, -0.401392f, -0.442943f, -0.487333f, -0.531807f, -0.572843f, -0.608619f, -0.640227f, -0.669360f, -0.695931f, -0.718798f, -0.737129f, -0.749510f, -0.752911f, -0.744271f, -0.722888f, -0.690591f, -0.650434f, -0.606110f, -0.561850f, -0.521475f, -0.486993f, -0.458126f, -0.433048f, -0.409626f, -0.386312f, -0.362259f, -0.336987f, -0.310333f, -0.282627f, -0.254475f, -0.226254f, -0.198128f, -0.170462f, -0.143899f, -0.119124f, -0.096842f, -0.077957f, -0.063776f, -0.056222f, -0.057684f, + -0.070113f, -0.094371f, -0.130791f, -0.179633f, -0.239941f, -0.308585f, -0.381898f, -0.458052f, -0.536571f, -0.616164f, -0.694955f, -0.772624f, -0.850111f, -0.926782f, -0.999760f, -1.066559f, -1.126570f, -1.179184f, -1.222302f, -1.254125f, -1.275290f, -1.287722f, -1.292081f, -1.287917f, -1.276087f, -1.259277f, -1.239681f, -1.217607f, -1.193156f, -1.167869f, -1.143244f, -1.118482f, -1.091357f, -1.060859f, -1.027345f, -0.990451f, -0.948918f, -0.902895f, -0.854755f, -0.806966f, -0.760446f, -0.715619f, -0.673842f, -0.636793f, -0.605072f, -0.578270f, -0.556179f, -0.539266f, -0.527859f, -0.521263f, -0.518112f, -0.517554f, -0.519483f, -0.523339f, -0.527397f, -0.529962f, -0.530623f, -0.529392f, -0.525185f, -0.516374f, -0.502523f, -0.484304f, -0.461738f, -0.433778f, -0.399827f, -0.360530f, -0.316583f, -0.267592f, -0.212873f, -0.152952f, -0.089351f, -0.022879f, 0.046836f, 0.119626f, 0.193722f, 0.267453f, 0.340856f, 0.414052f, 0.485116f, 0.551637f, 0.613347f, 0.670732f, 0.722013f, 0.764382f, 0.797237f, 0.820973f, 0.833604f, 0.832100f, 0.815925f, 0.785566f, 0.739077f, 0.674193f, 0.592209f, 0.495751f, 0.385312f, 0.262580f, + 0.134060f, 0.006641f, -0.116089f, -0.227998f, -0.317292f, -0.375423f, -0.399942f, -0.380080f, -0.295089f, -0.148552f, 0.003715f, 0.088509f, 0.084442f, 0.037741f, 0.004798f, -0.000952f, 0.001504f, 0.000011f, -0.001418f, 0.000239f, 0.001076f, -0.000365f, -0.000858f, 0.000368f, 0.000671f, -0.000340f, -0.000494f, 0.000359f, 0.000427f, -0.000288f, -0.000300f, 0.000287f, 0.000246f, -0.000250f, -0.000191f, 0.000205f, 0.000117f, -0.000209f, -0.000114f, 0.000138f, 0.000031f, -0.000158f, -0.000043f, 0.000092f, -0.000022f, -0.000096f, 0.000027f, 0.000057f}, + {-0.132877f, -0.397611f, -0.632915f, -0.770285f, -0.762715f, -0.657573f, -0.569424f, -0.556718f, -0.559329f, -0.492160f, -0.364513f, -0.254027f, -0.187319f, -0.112359f, 0.013869f, 0.171586f, 0.321788f, 0.450390f, 0.550169f, 0.601920f, 0.599231f, 0.564879f, 0.522168f, 0.469068f, 0.394550f, 0.302090f, 0.202848f, 0.098985f, -0.013558f, -0.133110f, -0.250310f, -0.352539f, -0.427473f, -0.468674f, -0.479833f, -0.468872f, -0.438208f, -0.385801f, -0.314336f, -0.233571f, -0.153994f, -0.082221f, -0.021254f, 0.029103f, 0.071856f, 0.110418f, 0.147141f, 0.184866f, 0.227200f, 0.274979f, 0.323626f, 0.364907f, 0.390119f, 0.392168f, 0.367889f, 0.319988f, 0.255281f, 0.180008f, 0.097315f, 0.008624f, -0.084265f, -0.178270f, -0.268396f, -0.347509f, -0.407904f, -0.443969f, -0.453626f, -0.437976f, -0.400261f, -0.344545f, -0.274131f, -0.190824f, -0.096114f, 0.006594f, 0.110784f, 0.207596f, 0.287902f, 0.344723f, 0.375140f, 0.380738f, 0.366034f, 0.336036f, 0.294883f, 0.246060f, 0.192748f, 0.137428f, 0.081636f, 0.026552f, -0.026567f, -0.076804f, -0.123861f, -0.167467f, -0.206909f, -0.241250f, -0.269252f, -0.288705f, + -0.296573f, -0.290377f, -0.269166f, -0.233229f, -0.183841f, -0.123651f, -0.056479f, 0.013719f, 0.083262f, 0.148262f, 0.204724f, 0.249465f, 0.280399f, 0.296003f, 0.295349f, 0.278768f, 0.247829f, 0.204674f, 0.151948f, 0.093150f, 0.032213f, -0.027384f, -0.082725f, -0.131073f, -0.170143f, -0.198644f, -0.216046f, -0.222008f, -0.216506f, -0.200271f, -0.174654f, -0.141292f, -0.102339f, -0.060692f, -0.019479f, 0.018647f, 0.051612f, 0.077849f, 0.096642f, 0.108377f, 0.114133f, 0.115126f, 0.112602f, 0.107828f, 0.101742f, 0.094680f, 0.086589f, 0.077282f, 0.066381f, 0.053290f, 0.037528f, 0.019026f, -0.001919f, -0.024735f, -0.048435f, -0.071577f, -0.092532f, -0.109764f, -0.121883f, -0.127706f, -0.126482f, -0.118056f, -0.102791f, -0.081468f, -0.055311f, -0.025990f, 0.004604f, 0.034617f, 0.062318f, 0.086086f, 0.104528f, 0.116707f, 0.122180f, 0.120819f, 0.112758f, 0.098561f, 0.079222f, 0.055839f, 0.029513f, 0.001623f, -0.026174f, -0.052450f, -0.076110f, -0.095839f, -0.109976f, -0.117213f, -0.116756f, -0.107640f, -0.088934f, -0.061097f, -0.026291f, 0.012728f, 0.052593f, 0.088103f, 0.113109f, 0.123416f, + 0.117418f, 0.094520f, 0.056280f, 0.009387f, -0.036193f, -0.072454f, -0.092836f, -0.088360f, -0.054153f, -0.003640f, 0.033648f, 0.037891f, 0.018462f, 0.000482f, -0.003500f, -0.000290f, 0.000806f, -0.000263f, -0.000070f, 0.000856f, 0.000579f, -0.000126f, 0.000123f, 0.000593f, 0.000279f, -0.000154f, 0.000040f, 0.000275f, 0.000000f, -0.000274f, -0.000137f, -0.000025f, -0.000233f, -0.000394f, -0.000293f, -0.000233f, -0.000362f, -0.000433f, -0.000345f, -0.000295f, -0.000349f, -0.000351f, -0.000262f, -0.000205f, -0.000205f, -0.000164f, -0.000070f, -0.000011f} + }, + { + {-0.132877f, -0.397611f, -0.632915f, -0.770285f, -0.762715f, -0.657573f, -0.569424f, -0.556718f, -0.559329f, -0.492160f, -0.364513f, -0.254027f, -0.187319f, -0.112359f, 0.013869f, 0.171586f, 0.321788f, 0.450390f, 0.550169f, 0.601920f, 0.599231f, 0.564879f, 0.522168f, 0.469068f, 0.394550f, 0.302090f, 0.202848f, 0.098985f, -0.013558f, -0.133110f, -0.250310f, -0.352539f, -0.427473f, -0.468674f, -0.479833f, -0.468872f, -0.438208f, -0.385801f, -0.314336f, -0.233571f, -0.153994f, -0.082221f, -0.021254f, 0.029103f, 0.071856f, 0.110418f, 0.147141f, 0.184866f, 0.227200f, 0.274979f, 0.323626f, 0.364907f, 0.390119f, 0.392168f, 0.367889f, 0.319988f, 0.255281f, 0.180008f, 0.097315f, 0.008624f, -0.084265f, -0.178270f, -0.268396f, -0.347509f, -0.407904f, -0.443969f, -0.453626f, -0.437976f, -0.400261f, -0.344545f, -0.274131f, -0.190824f, -0.096114f, 0.006594f, 0.110784f, 0.207596f, 0.287902f, 0.344723f, 0.375140f, 0.380738f, 0.366034f, 0.336036f, 0.294883f, 0.246060f, 0.192748f, 0.137428f, 0.081636f, 0.026552f, -0.026567f, -0.076804f, -0.123861f, -0.167467f, -0.206909f, -0.241250f, -0.269252f, -0.288705f, + -0.296573f, -0.290377f, -0.269166f, -0.233229f, -0.183841f, -0.123651f, -0.056479f, 0.013719f, 0.083262f, 0.148262f, 0.204724f, 0.249465f, 0.280399f, 0.296003f, 0.295349f, 0.278768f, 0.247829f, 0.204674f, 0.151948f, 0.093150f, 0.032213f, -0.027384f, -0.082725f, -0.131073f, -0.170143f, -0.198644f, -0.216046f, -0.222008f, -0.216506f, -0.200271f, -0.174654f, -0.141292f, -0.102339f, -0.060692f, -0.019479f, 0.018647f, 0.051612f, 0.077849f, 0.096642f, 0.108377f, 0.114133f, 0.115126f, 0.112602f, 0.107828f, 0.101742f, 0.094680f, 0.086589f, 0.077282f, 0.066381f, 0.053290f, 0.037528f, 0.019026f, -0.001919f, -0.024735f, -0.048435f, -0.071577f, -0.092532f, -0.109764f, -0.121883f, -0.127706f, -0.126482f, -0.118056f, -0.102791f, -0.081468f, -0.055311f, -0.025990f, 0.004604f, 0.034617f, 0.062318f, 0.086086f, 0.104528f, 0.116707f, 0.122180f, 0.120819f, 0.112758f, 0.098561f, 0.079222f, 0.055839f, 0.029513f, 0.001623f, -0.026174f, -0.052450f, -0.076110f, -0.095839f, -0.109976f, -0.117213f, -0.116756f, -0.107640f, -0.088934f, -0.061097f, -0.026291f, 0.012728f, 0.052593f, 0.088103f, 0.113109f, 0.123416f, + 0.117418f, 0.094520f, 0.056280f, 0.009387f, -0.036193f, -0.072454f, -0.092836f, -0.088360f, -0.054153f, -0.003640f, 0.033648f, 0.037891f, 0.018462f, 0.000482f, -0.003500f, -0.000290f, 0.000806f, -0.000263f, -0.000070f, 0.000856f, 0.000579f, -0.000126f, 0.000123f, 0.000593f, 0.000279f, -0.000154f, 0.000040f, 0.000275f, 0.000000f, -0.000274f, -0.000137f, -0.000025f, -0.000233f, -0.000394f, -0.000293f, -0.000233f, -0.000362f, -0.000433f, -0.000345f, -0.000295f, -0.000349f, -0.000351f, -0.000262f, -0.000205f, -0.000205f, -0.000164f, -0.000070f, -0.000011f}, + {0.000548f, 0.016581f, 0.053765f, 0.073281f, 0.025961f, -0.087700f, -0.207119f, -0.273414f, -0.285064f, -0.274298f, -0.250255f, -0.200671f, -0.140017f, -0.114239f, -0.149921f, -0.229225f, -0.323553f, -0.423074f, -0.520572f, -0.593892f, -0.626821f, -0.633223f, -0.641666f, -0.663565f, -0.689675f, -0.710438f, -0.725598f, -0.736662f, -0.742149f, -0.741673f, -0.737421f, -0.729820f, -0.715763f, -0.691715f, -0.655607f, -0.606006f, -0.543295f, -0.472954f, -0.404984f, -0.347908f, -0.304206f, -0.272432f, -0.251856f, -0.242831f, -0.243698f, -0.250172f, -0.258244f, -0.266093f, -0.273123f, -0.278938f, -0.283885f, -0.289531f, -0.298203f, -0.312469f, -0.334435f, -0.364557f, -0.401392f, -0.442943f, -0.487333f, -0.531807f, -0.572843f, -0.608619f, -0.640227f, -0.669360f, -0.695931f, -0.718798f, -0.737129f, -0.749510f, -0.752911f, -0.744271f, -0.722888f, -0.690591f, -0.650434f, -0.606110f, -0.561850f, -0.521475f, -0.486993f, -0.458126f, -0.433048f, -0.409626f, -0.386312f, -0.362259f, -0.336987f, -0.310333f, -0.282627f, -0.254475f, -0.226254f, -0.198128f, -0.170462f, -0.143899f, -0.119124f, -0.096842f, -0.077957f, -0.063776f, -0.056222f, -0.057684f, + -0.070113f, -0.094371f, -0.130791f, -0.179633f, -0.239941f, -0.308585f, -0.381898f, -0.458052f, -0.536571f, -0.616164f, -0.694955f, -0.772624f, -0.850111f, -0.926782f, -0.999760f, -1.066559f, -1.126570f, -1.179184f, -1.222302f, -1.254125f, -1.275290f, -1.287722f, -1.292081f, -1.287917f, -1.276087f, -1.259277f, -1.239681f, -1.217607f, -1.193156f, -1.167869f, -1.143244f, -1.118482f, -1.091357f, -1.060859f, -1.027345f, -0.990451f, -0.948918f, -0.902895f, -0.854755f, -0.806966f, -0.760446f, -0.715619f, -0.673842f, -0.636793f, -0.605072f, -0.578270f, -0.556179f, -0.539266f, -0.527859f, -0.521263f, -0.518112f, -0.517554f, -0.519483f, -0.523339f, -0.527397f, -0.529962f, -0.530623f, -0.529392f, -0.525185f, -0.516374f, -0.502523f, -0.484304f, -0.461738f, -0.433778f, -0.399827f, -0.360530f, -0.316583f, -0.267592f, -0.212873f, -0.152952f, -0.089351f, -0.022879f, 0.046836f, 0.119626f, 0.193722f, 0.267453f, 0.340856f, 0.414052f, 0.485116f, 0.551637f, 0.613347f, 0.670732f, 0.722013f, 0.764382f, 0.797237f, 0.820973f, 0.833604f, 0.832100f, 0.815925f, 0.785566f, 0.739077f, 0.674193f, 0.592209f, 0.495751f, 0.385312f, 0.262580f, + 0.134060f, 0.006641f, -0.116089f, -0.227998f, -0.317292f, -0.375423f, -0.399942f, -0.380080f, -0.295089f, -0.148552f, 0.003715f, 0.088509f, 0.084442f, 0.037741f, 0.004798f, -0.000952f, 0.001504f, 0.000011f, -0.001418f, 0.000239f, 0.001076f, -0.000365f, -0.000858f, 0.000368f, 0.000671f, -0.000340f, -0.000494f, 0.000359f, 0.000427f, -0.000288f, -0.000300f, 0.000287f, 0.000246f, -0.000250f, -0.000191f, 0.000205f, 0.000117f, -0.000209f, -0.000114f, 0.000138f, 0.000031f, -0.000158f, -0.000043f, 0.000092f, -0.000022f, -0.000096f, 0.000027f, 0.000057f} + } +}; +const float *CRendBin_Combined_HRIR_coeff_diffuse_re_48kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const float *CRendBin_Combined_HRIR_coeff_diffuse_im_48kHz[BINAURAL_CHANNELS]={NULL,NULL}; + +/* Sample Rate = 32000 */ + +const int16_t CRendBin_Combined_HRIR_max_num_iterations_32kHz = 1; +const uint16_t CRendBin_Combined_HRIR_num_iterations_32kHz[15][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1} }; +const uint16_t CRendBin_Combined_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS] = {0, 0}; +const uint16_t CRendBin_Combined_HRIR_pIndex_frequency_max_32kHz[15][BINAURAL_CHANNELS][1]={{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}}}; +const uint16_t CRendBin_Combined_HRIR_index_frequency_max_diffuse_32kHz = 0; +const float CRendBin_Combined_HRIR_inv_diffuse_weight_32kHz[15]={0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f}; +const uint16_t *CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const float CRendBin_Combined_HRIR_coeff_re_32kHz[15][BINAURAL_CHANNELS][160]={ + { + {1.274160f, 1.294020f, 1.337410f, 1.397007f, 1.430345f, 1.392644f, 1.321540f, 1.313359f, 1.357865f, 1.299918f, 1.074412f, 0.879944f, 0.959736f, 1.270988f, 1.546758f, 1.656396f, 1.720956f, 1.866458f, 2.047459f, 2.166309f, 2.211621f, 2.199100f, 2.091661f, 1.870665f, 1.617573f, 1.446851f, 1.393188f, 1.413236f, 1.466179f, 1.550859f, 1.683267f, 1.868310f, 2.085674f, 2.289697f, 2.432421f, 2.495403f, 2.495189f, 2.459782f, 2.406497f, 2.337636f, 2.248632f, 2.141773f, 2.034425f, 1.948929f, 1.893998f, 1.861756f, 1.839825f, 1.817228f, 1.782513f, 1.728672f, 1.660650f, 1.590534f, 1.526449f, 1.470717f, 1.424223f, 1.386891f, 1.357216f, 1.334362f, 1.316849f, 1.298879f, 1.273497f, 1.238579f, 1.193651f, 1.133144f, 1.050266f, 0.946198f, 0.830030f, 0.712686f, 0.605579f, 0.520129f, 0.462158f, 0.429220f, 0.416204f, 0.419491f, 0.434223f, 0.453184f, 0.470641f, 0.483821f, 0.491166f, 0.493159f, 0.493315f, 0.494589f, 0.497104f, 0.501870f, 0.512491f, 0.530588f, 0.554259f, 0.582935f, 0.618415f, 0.659661f, 0.701812f, 0.741007f, 0.775413f, 0.802205f, 0.818331f, 0.823262f, + 0.817499f, 0.800855f, 0.774865f, 0.743310f, 0.708492f, 0.671074f, 0.633855f, 0.600330f, 0.569970f, 0.540678f, 0.514469f, 0.494946f, 0.481818f, 0.473694f, 0.472732f, 0.481094f, 0.496964f, 0.518455f, 0.546609f, 0.581486f, 0.621040f, 0.665611f, 0.717402f, 0.775509f, 0.837954f, 0.906864f, 0.984687f, 1.068602f, 1.155523f, 1.247778f, 1.347134f, 1.449104f, 1.549101f, 1.647389f, 1.742972f, 1.829635f, 1.901324f, 1.954515f, 1.984287f, 1.984824f, 1.952760f, 1.885002f, 1.778297f, 1.635195f, 1.462468f, 1.261420f, 1.031242f, 0.781118f, 0.523064f, 0.255971f, -0.024648f, -0.309222f, -0.588359f, -0.870855f, -1.164972f, -1.466926f, -1.790488f, -2.153822f, -2.486393f, -2.616851f, -2.448223f, -2.105871f, -1.817613f, -1.687068f}, + {0.970276f, 0.989255f, 0.871577f, 0.597876f, 0.336366f, 0.173178f, 0.019706f, -0.159984f, -0.243784f, -0.153498f, 0.008399f, 0.095745f, 0.051486f, -0.138486f, -0.467152f, -0.822595f, -1.024373f, -1.014141f, -0.903886f, -0.794827f, -0.668354f, -0.501337f, -0.360612f, -0.305798f, -0.293410f, -0.252892f, -0.184179f, -0.111256f, -0.003926f, 0.177841f, 0.402150f, 0.597826f, 0.746294f, 0.878887f, 0.991944f, 1.024725f, 0.936772f, 0.767161f, 0.593896f, 0.457569f, 0.346793f, 0.240733f, 0.135325f, 0.029786f, -0.084188f, -0.208198f, -0.327790f, -0.427675f, -0.506080f, -0.566715f, -0.606654f, -0.620426f, -0.608890f, -0.577204f, -0.529440f, -0.469766f, -0.403401f, -0.332230f, -0.253653f, -0.166268f, -0.073041f, 0.021610f, 0.112939f, 0.193509f, 0.255064f, 0.294744f, 0.316342f, 0.324872f, 0.323044f, 0.313291f, 0.299731f, 0.286569f, 0.276133f, 0.269047f, 0.264854f, 0.261697f, 0.256138f, 0.244182f, 0.223051f, 0.192601f, 0.155342f, 0.114760f, 0.073144f, 0.030352f, -0.016156f, -0.070224f, -0.134644f, -0.208324f, -0.285309f, -0.356772f, -0.413944f, -0.449609f, -0.458703f, -0.439528f, -0.394930f, -0.331849f, + -0.259659f, -0.188462f, -0.126919f, -0.079747f, -0.047119f, -0.026644f, -0.014920f, -0.007007f, 0.003477f, 0.022326f, 0.053985f, 0.103077f, 0.173949f, 0.266925f, 0.376398f, 0.492936f, 0.604875f, 0.697909f, 0.757166f, 0.771956f, 0.737231f, 0.651307f, 0.515864f, 0.338233f, 0.130148f, -0.096058f, -0.327499f, -0.548579f, -0.742907f, -0.897278f, -1.001720f, -1.048233f, -1.033356f, -0.960708f, -0.838436f, -0.676033f, -0.484975f, -0.278710f, -0.069071f, 0.135392f, 0.327026f, 0.498327f, 0.643893f, 0.759696f, 0.840685f, 0.882278f, 0.882920f, 0.842334f, 0.760127f, 0.639470f, 0.488681f, 0.316680f, 0.131973f, -0.052258f, -0.220428f, -0.364266f, -0.478726f, -0.543965f, -0.528700f, -0.427785f, -0.288213f, -0.179234f, -0.133783f, -0.129365f} + }, + { + {0.970276f, 0.989255f, 0.871577f, 0.597876f, 0.336366f, 0.173178f, 0.019706f, -0.159984f, -0.243784f, -0.153498f, 0.008399f, 0.095745f, 0.051486f, -0.138486f, -0.467152f, -0.822595f, -1.024373f, -1.014141f, -0.903886f, -0.794827f, -0.668354f, -0.501337f, -0.360612f, -0.305798f, -0.293410f, -0.252892f, -0.184179f, -0.111256f, -0.003926f, 0.177841f, 0.402150f, 0.597826f, 0.746294f, 0.878887f, 0.991944f, 1.024725f, 0.936772f, 0.767161f, 0.593896f, 0.457569f, 0.346793f, 0.240733f, 0.135325f, 0.029786f, -0.084188f, -0.208198f, -0.327790f, -0.427675f, -0.506080f, -0.566715f, -0.606654f, -0.620426f, -0.608890f, -0.577204f, -0.529440f, -0.469766f, -0.403401f, -0.332230f, -0.253653f, -0.166268f, -0.073041f, 0.021610f, 0.112939f, 0.193509f, 0.255064f, 0.294744f, 0.316342f, 0.324872f, 0.323044f, 0.313291f, 0.299731f, 0.286569f, 0.276133f, 0.269047f, 0.264854f, 0.261697f, 0.256138f, 0.244182f, 0.223051f, 0.192601f, 0.155342f, 0.114760f, 0.073144f, 0.030352f, -0.016156f, -0.070224f, -0.134644f, -0.208324f, -0.285309f, -0.356772f, -0.413944f, -0.449609f, -0.458703f, -0.439528f, -0.394930f, -0.331849f, + -0.259659f, -0.188462f, -0.126919f, -0.079747f, -0.047119f, -0.026644f, -0.014920f, -0.007007f, 0.003477f, 0.022326f, 0.053985f, 0.103077f, 0.173949f, 0.266925f, 0.376398f, 0.492936f, 0.604875f, 0.697909f, 0.757166f, 0.771956f, 0.737231f, 0.651307f, 0.515864f, 0.338233f, 0.130148f, -0.096058f, -0.327499f, -0.548579f, -0.742907f, -0.897278f, -1.001720f, -1.048233f, -1.033356f, -0.960708f, -0.838436f, -0.676033f, -0.484975f, -0.278710f, -0.069071f, 0.135392f, 0.327026f, 0.498327f, 0.643893f, 0.759696f, 0.840685f, 0.882278f, 0.882920f, 0.842334f, 0.760127f, 0.639470f, 0.488681f, 0.316680f, 0.131973f, -0.052258f, -0.220428f, -0.364266f, -0.478726f, -0.543965f, -0.528700f, -0.427785f, -0.288213f, -0.179234f, -0.133783f, -0.129365f}, + {1.274160f, 1.294020f, 1.337410f, 1.397007f, 1.430345f, 1.392644f, 1.321540f, 1.313359f, 1.357865f, 1.299918f, 1.074412f, 0.879944f, 0.959736f, 1.270988f, 1.546758f, 1.656396f, 1.720956f, 1.866458f, 2.047459f, 2.166309f, 2.211621f, 2.199100f, 2.091661f, 1.870665f, 1.617573f, 1.446851f, 1.393188f, 1.413236f, 1.466179f, 1.550859f, 1.683267f, 1.868310f, 2.085674f, 2.289697f, 2.432421f, 2.495403f, 2.495189f, 2.459782f, 2.406497f, 2.337636f, 2.248632f, 2.141773f, 2.034425f, 1.948929f, 1.893998f, 1.861756f, 1.839825f, 1.817228f, 1.782513f, 1.728672f, 1.660650f, 1.590534f, 1.526449f, 1.470717f, 1.424223f, 1.386891f, 1.357216f, 1.334362f, 1.316849f, 1.298879f, 1.273497f, 1.238579f, 1.193651f, 1.133144f, 1.050266f, 0.946198f, 0.830030f, 0.712686f, 0.605579f, 0.520129f, 0.462158f, 0.429220f, 0.416204f, 0.419491f, 0.434223f, 0.453184f, 0.470641f, 0.483821f, 0.491166f, 0.493159f, 0.493315f, 0.494589f, 0.497104f, 0.501870f, 0.512491f, 0.530588f, 0.554259f, 0.582935f, 0.618415f, 0.659661f, 0.701812f, 0.741007f, 0.775413f, 0.802205f, 0.818331f, 0.823262f, + 0.817499f, 0.800855f, 0.774865f, 0.743310f, 0.708492f, 0.671074f, 0.633855f, 0.600330f, 0.569970f, 0.540678f, 0.514469f, 0.494946f, 0.481818f, 0.473694f, 0.472732f, 0.481094f, 0.496964f, 0.518455f, 0.546609f, 0.581486f, 0.621040f, 0.665611f, 0.717402f, 0.775509f, 0.837954f, 0.906864f, 0.984687f, 1.068602f, 1.155523f, 1.247778f, 1.347134f, 1.449104f, 1.549101f, 1.647389f, 1.742972f, 1.829635f, 1.901324f, 1.954515f, 1.984287f, 1.984824f, 1.952760f, 1.885002f, 1.778297f, 1.635195f, 1.462468f, 1.261420f, 1.031242f, 0.781118f, 0.523064f, 0.255971f, -0.024648f, -0.309222f, -0.588359f, -0.870855f, -1.164972f, -1.466926f, -1.790488f, -2.153822f, -2.486393f, -2.616851f, -2.448223f, -2.105871f, -1.817613f, -1.687068f} + }, + { + {1.085267f, 1.152261f, 1.211254f, 1.149749f, 0.971009f, 0.866642f, 0.973613f, 1.106024f, 0.955689f, 0.568331f, 0.367265f, 0.613757f, 1.064472f, 1.307157f, 1.265967f, 1.200519f, 1.313280f, 1.541852f, 1.705537f, 1.706229f, 1.568164f, 1.377410f, 1.218876f, 1.132463f, 1.108780f, 1.130031f, 1.199863f, 1.323700f, 1.481829f, 1.635911f, 1.747006f, 1.784852f, 1.742653f, 1.647793f, 1.537415f, 1.420984f, 1.285988f, 1.138370f, 1.013812f, 0.945860f, 0.939755f, 0.977271f, 1.030441f, 1.070328f, 1.078971f, 1.058884f, 1.024800f, 0.985828f, 0.939938f, 0.882986f, 0.817274f, 0.751424f, 0.694070f, 0.647432f, 0.607447f, 0.570514f, 0.536843f, 0.505711f, 0.472714f, 0.435641f, 0.398968f, 0.368542f, 0.344855f, 0.324511f, 0.305620f, 0.289416f, 0.278288f, 0.273203f, 0.272251f, 0.272533f, 0.274178f, 0.280435f, 0.293045f, 0.310308f, 0.330160f, 0.351786f, 0.373986f, 0.395582f, 0.417508f, 0.441271f, 0.465902f, 0.489267f, 0.511114f, 0.532441f, 0.553769f, 0.575766f, 0.598998f, 0.621885f, 0.641757f, 0.657943f, 0.670310f, 0.675616f, 0.669581f, 0.651537f, 0.623393f, 0.586505f, + 0.543751f, 0.501741f, 0.466651f, 0.440414f, 0.423767f, 0.419239f, 0.428634f, 0.451471f, 0.487558f, 0.537488f, 0.600521f, 0.675890f, 0.764826f, 0.867101f, 0.977943f, 1.092168f, 1.207453f, 1.319899f, 1.421773f, 1.507786f, 1.578085f, 1.631894f, 1.664687f, 1.674570f, 1.664682f, 1.636762f, 1.588484f, 1.518454f, 1.428003f, 1.317560f, 1.186183f, 1.034404f, 0.864540f, 0.680250f, 0.487109f, 0.289870f, 0.089451f, -0.112563f, -0.309528f, -0.496881f, -0.678674f, -0.858573f, -1.031550f, -1.194122f, -1.353146f, -1.513379f, -1.667664f, -1.810571f, -1.947846f, -2.081093f, -2.199345f, -2.296286f, -2.376795f, -2.438015f, -2.467707f, -2.466689f, -2.437081f, -2.336441f, -2.091727f, -1.697365f, -1.271170f, -0.969067f, -0.847236f, -0.833407f}, + {1.085267f, 1.152261f, 1.211254f, 1.149749f, 0.971009f, 0.866642f, 0.973613f, 1.106024f, 0.955689f, 0.568331f, 0.367265f, 0.613757f, 1.064472f, 1.307157f, 1.265967f, 1.200519f, 1.313280f, 1.541852f, 1.705537f, 1.706229f, 1.568164f, 1.377410f, 1.218876f, 1.132463f, 1.108780f, 1.130031f, 1.199863f, 1.323700f, 1.481829f, 1.635911f, 1.747006f, 1.784852f, 1.742653f, 1.647793f, 1.537415f, 1.420984f, 1.285988f, 1.138370f, 1.013812f, 0.945860f, 0.939755f, 0.977271f, 1.030441f, 1.070328f, 1.078971f, 1.058884f, 1.024800f, 0.985828f, 0.939938f, 0.882986f, 0.817274f, 0.751424f, 0.694070f, 0.647432f, 0.607447f, 0.570514f, 0.536843f, 0.505711f, 0.472714f, 0.435641f, 0.398968f, 0.368542f, 0.344855f, 0.324511f, 0.305620f, 0.289416f, 0.278288f, 0.273203f, 0.272251f, 0.272533f, 0.274178f, 0.280435f, 0.293045f, 0.310308f, 0.330160f, 0.351786f, 0.373986f, 0.395582f, 0.417508f, 0.441271f, 0.465902f, 0.489267f, 0.511114f, 0.532441f, 0.553769f, 0.575766f, 0.598998f, 0.621885f, 0.641757f, 0.657943f, 0.670310f, 0.675616f, 0.669581f, 0.651537f, 0.623393f, 0.586505f, + 0.543751f, 0.501741f, 0.466651f, 0.440414f, 0.423767f, 0.419239f, 0.428634f, 0.451471f, 0.487558f, 0.537488f, 0.600521f, 0.675890f, 0.764826f, 0.867101f, 0.977943f, 1.092168f, 1.207453f, 1.319899f, 1.421773f, 1.507786f, 1.578085f, 1.631894f, 1.664687f, 1.674570f, 1.664682f, 1.636762f, 1.588484f, 1.518454f, 1.428003f, 1.317560f, 1.186183f, 1.034404f, 0.864540f, 0.680250f, 0.487109f, 0.289870f, 0.089451f, -0.112563f, -0.309528f, -0.496881f, -0.678674f, -0.858573f, -1.031550f, -1.194122f, -1.353146f, -1.513379f, -1.667664f, -1.810571f, -1.947846f, -2.081093f, -2.199345f, -2.296286f, -2.376795f, -2.438015f, -2.467707f, -2.466689f, -2.437081f, -2.336441f, -2.091727f, -1.697365f, -1.271170f, -0.969067f, -0.847236f, -0.833407f} + }, + { + {1.063637f, 1.049948f, 1.086384f, 1.183797f, 1.296273f, 1.415018f, 1.543693f, 1.612469f, 1.556818f, 1.452907f, 1.427515f, 1.459162f, 1.420264f, 1.294044f, 1.190504f, 1.155630f, 1.120377f, 1.045118f, 0.972069f, 0.919124f, 0.847607f, 0.755348f, 0.695900f, 0.688650f, 0.697752f, 0.705992f, 0.727492f, 0.745497f, 0.716209f, 0.641022f, 0.570166f, 0.531001f, 0.507183f, 0.487583f, 0.484983f, 0.504740f, 0.536379f, 0.578041f, 0.637538f, 0.709342f, 0.774552f, 0.821621f, 0.850375f, 0.861813f, 0.858985f, 0.852665f, 0.855130f, 0.872248f, 0.905940f, 0.956533f, 1.018160f, 1.078485f, 1.125914f, 1.152867f, 1.153957f, 1.128181f, 1.082146f, 1.025211f, 0.962215f, 0.894440f, 0.824318f, 0.754663f, 0.686000f, 0.618588f, 0.555115f, 0.499006f, 0.452213f, 0.416110f, 0.392138f, 0.380331f, 0.378985f, 0.386260f, 0.400712f, 0.420754f, 0.445470f, 0.475732f, 0.513289f, 0.559298f, 0.614782f, 0.681710f, 0.762351f, 0.857613f, 0.966535f, 1.087403f, 1.219077f, 1.360788f, 1.510315f, 1.662975f, 1.812873f, 1.953724f, 2.077144f, 2.172270f, 2.230289f, 2.248747f, 2.229143f, 2.172148f, + 2.078893f, 1.955382f, 1.810735f, 1.651097f, 1.479367f, 1.300345f, 1.120903f, 0.944335f, 0.769404f, 0.596549f, 0.431085f, 0.278829f, 0.142420f, 0.023726f, -0.073876f, -0.148420f, -0.202406f, -0.240652f, -0.266342f, -0.280625f, -0.284772f, -0.281007f, -0.271464f, -0.257350f, -0.239505f, -0.219653f, -0.200403f, -0.183348f, -0.167670f, -0.151607f, -0.134585f, -0.116624f, -0.096605f, -0.073157f, -0.046830f, -0.019722f, 0.006408f, 0.030219f, 0.049849f, 0.063222f, 0.068554f, 0.064149f, 0.048963f, 0.023015f, -0.014445f, -0.065932f, -0.132497f, -0.211661f, -0.301246f, -0.401651f, -0.510888f, -0.622490f, -0.732373f, -0.841490f, -0.948993f, -1.053059f, -1.159075f, -1.265357f, -1.332750f, -1.299989f, -1.156448f, -0.976901f, -0.852061f, -0.803729f}, + {0.884083f, 0.742870f, 0.484034f, 0.189010f, -0.047347f, -0.209107f, -0.344738f, -0.459774f, -0.499823f, -0.451724f, -0.382172f, -0.347168f, -0.330087f, -0.301047f, -0.273879f, -0.260219f, -0.215653f, -0.082482f, 0.135367f, 0.371639f, 0.553528f, 0.638327f, 0.619182f, 0.521423f, 0.383944f, 0.230950f, 0.070136f, -0.081916f, -0.195335f, -0.256069f, -0.280341f, -0.291132f, -0.295855f, -0.293544f, -0.286342f, -0.272513f, -0.239647f, -0.175676f, -0.081987f, 0.027920f, 0.135920f, 0.222729f, 0.272143f, 0.278209f, 0.246991f, 0.191063f, 0.124955f, 0.063713f, 0.019080f, -0.005719f, -0.015586f, -0.017859f, -0.018227f, -0.020272f, -0.025418f, -0.032738f, -0.040246f, -0.046606f, -0.051516f, -0.055628f, -0.060728f, -0.068985f, -0.081305f, -0.096657f, -0.112333f, -0.123552f, -0.123315f, -0.104730f, -0.064704f, -0.005665f, 0.065287f, 0.138018f, 0.201361f, 0.245987f, 0.266784f, 0.262900f, 0.236050f, 0.188970f, 0.124607f, 0.045940f, -0.043179f, -0.136409f, -0.224142f, -0.294589f, -0.336178f, -0.340444f, -0.304841f, -0.234204f, -0.139606f, -0.035148f, 0.065318f, 0.150348f, 0.212111f, 0.246790f, 0.254210f, 0.237086f, + 0.200362f, 0.150513f, 0.094645f, 0.039670f, -0.008438f, -0.045554f, -0.070189f, -0.083386f, -0.087751f, -0.086464f, -0.082639f, -0.078760f, -0.076232f, -0.075397f, -0.075811f, -0.076287f, -0.074859f, -0.069085f, -0.056682f, -0.036162f, -0.007454f, 0.027621f, 0.065474f, 0.101542f, 0.131285f, 0.150979f, 0.158284f, 0.152450f, 0.134029f, 0.104444f, 0.065783f, 0.020707f, -0.027709f, -0.075976f, -0.120047f, -0.155502f, -0.178183f, -0.184820f, -0.173566f, -0.144714f, -0.101232f, -0.048394f, 0.007260f, 0.058957f, 0.100774f, 0.128927f, 0.142378f, 0.142213f, 0.130754f, 0.111206f, 0.087043f, 0.060849f, 0.034081f, 0.008064f, -0.015849f, -0.037361f, -0.056513f, -0.070516f, -0.073401f, -0.061979f, -0.041900f, -0.024640f, -0.017159f, -0.016562f} + }, + { + {0.884083f, 0.742870f, 0.484034f, 0.189010f, -0.047347f, -0.209107f, -0.344738f, -0.459774f, -0.499823f, -0.451724f, -0.382172f, -0.347168f, -0.330087f, -0.301047f, -0.273879f, -0.260219f, -0.215653f, -0.082482f, 0.135367f, 0.371639f, 0.553528f, 0.638327f, 0.619182f, 0.521423f, 0.383944f, 0.230950f, 0.070136f, -0.081916f, -0.195335f, -0.256069f, -0.280341f, -0.291132f, -0.295855f, -0.293544f, -0.286342f, -0.272513f, -0.239647f, -0.175676f, -0.081987f, 0.027920f, 0.135920f, 0.222729f, 0.272143f, 0.278209f, 0.246991f, 0.191063f, 0.124955f, 0.063713f, 0.019080f, -0.005719f, -0.015586f, -0.017859f, -0.018227f, -0.020272f, -0.025418f, -0.032738f, -0.040246f, -0.046606f, -0.051516f, -0.055628f, -0.060728f, -0.068985f, -0.081305f, -0.096657f, -0.112333f, -0.123552f, -0.123315f, -0.104730f, -0.064704f, -0.005665f, 0.065287f, 0.138018f, 0.201361f, 0.245987f, 0.266784f, 0.262900f, 0.236050f, 0.188970f, 0.124607f, 0.045940f, -0.043179f, -0.136409f, -0.224142f, -0.294589f, -0.336178f, -0.340444f, -0.304841f, -0.234204f, -0.139606f, -0.035148f, 0.065318f, 0.150348f, 0.212111f, 0.246790f, 0.254210f, 0.237086f, + 0.200362f, 0.150513f, 0.094645f, 0.039670f, -0.008438f, -0.045554f, -0.070189f, -0.083386f, -0.087751f, -0.086464f, -0.082639f, -0.078760f, -0.076232f, -0.075397f, -0.075811f, -0.076287f, -0.074859f, -0.069085f, -0.056682f, -0.036162f, -0.007454f, 0.027621f, 0.065474f, 0.101542f, 0.131285f, 0.150979f, 0.158284f, 0.152450f, 0.134029f, 0.104444f, 0.065783f, 0.020707f, -0.027709f, -0.075976f, -0.120047f, -0.155502f, -0.178183f, -0.184820f, -0.173566f, -0.144714f, -0.101232f, -0.048394f, 0.007260f, 0.058957f, 0.100774f, 0.128927f, 0.142378f, 0.142213f, 0.130754f, 0.111206f, 0.087043f, 0.060849f, 0.034081f, 0.008064f, -0.015849f, -0.037361f, -0.056513f, -0.070516f, -0.073401f, -0.061979f, -0.041900f, -0.024640f, -0.017159f, -0.016562f}, + {1.063637f, 1.049948f, 1.086384f, 1.183797f, 1.296273f, 1.415018f, 1.543693f, 1.612469f, 1.556818f, 1.452907f, 1.427515f, 1.459162f, 1.420264f, 1.294044f, 1.190504f, 1.155630f, 1.120377f, 1.045118f, 0.972069f, 0.919124f, 0.847607f, 0.755348f, 0.695900f, 0.688650f, 0.697752f, 0.705992f, 0.727492f, 0.745497f, 0.716209f, 0.641022f, 0.570166f, 0.531001f, 0.507183f, 0.487583f, 0.484983f, 0.504740f, 0.536379f, 0.578041f, 0.637538f, 0.709342f, 0.774552f, 0.821621f, 0.850375f, 0.861813f, 0.858985f, 0.852665f, 0.855130f, 0.872248f, 0.905940f, 0.956533f, 1.018160f, 1.078485f, 1.125914f, 1.152867f, 1.153957f, 1.128181f, 1.082146f, 1.025211f, 0.962215f, 0.894440f, 0.824318f, 0.754663f, 0.686000f, 0.618588f, 0.555115f, 0.499006f, 0.452213f, 0.416110f, 0.392138f, 0.380331f, 0.378985f, 0.386260f, 0.400712f, 0.420754f, 0.445470f, 0.475732f, 0.513289f, 0.559298f, 0.614782f, 0.681710f, 0.762351f, 0.857613f, 0.966535f, 1.087403f, 1.219077f, 1.360788f, 1.510315f, 1.662975f, 1.812873f, 1.953724f, 2.077144f, 2.172270f, 2.230289f, 2.248747f, 2.229143f, 2.172148f, + 2.078893f, 1.955382f, 1.810735f, 1.651097f, 1.479367f, 1.300345f, 1.120903f, 0.944335f, 0.769404f, 0.596549f, 0.431085f, 0.278829f, 0.142420f, 0.023726f, -0.073876f, -0.148420f, -0.202406f, -0.240652f, -0.266342f, -0.280625f, -0.284772f, -0.281007f, -0.271464f, -0.257350f, -0.239505f, -0.219653f, -0.200403f, -0.183348f, -0.167670f, -0.151607f, -0.134585f, -0.116624f, -0.096605f, -0.073157f, -0.046830f, -0.019722f, 0.006408f, 0.030219f, 0.049849f, 0.063222f, 0.068554f, 0.064149f, 0.048963f, 0.023015f, -0.014445f, -0.065932f, -0.132497f, -0.211661f, -0.301246f, -0.401651f, -0.510888f, -0.622490f, -0.732373f, -0.841490f, -0.948993f, -1.053059f, -1.159075f, -1.265357f, -1.332750f, -1.299989f, -1.156448f, -0.976901f, -0.852061f, -0.803729f} + }, + { + {1.162181f, 1.141798f, 1.179331f, 1.312669f, 1.480555f, 1.604003f, 1.670306f, 1.695382f, 1.657718f, 1.541807f, 1.413737f, 1.363031f, 1.373945f, 1.344708f, 1.245904f, 1.165785f, 1.167020f, 1.190832f, 1.158172f, 1.088594f, 1.049454f, 1.044643f, 1.028324f, 0.992763f, 0.971665f, 0.973963f, 0.973448f, 0.958360f, 0.946807f, 0.954173f, 0.976219f, 1.002416f, 1.024019f, 1.032959f, 1.029383f, 1.026640f, 1.038825f, 1.068822f, 1.113169f, 1.168957f, 1.230999f, 1.291508f, 1.346952f, 1.398324f, 1.443741f, 1.478287f, 1.501426f, 1.518040f, 1.532576f, 1.547027f, 1.562611f, 1.578765f, 1.592058f, 1.598749f, 1.596511f, 1.583342f, 1.558420f, 1.523901f, 1.482143f, 1.432374f, 1.373890f, 1.310066f, 1.244815f, 1.177941f, 1.108302f, 1.038172f, 0.970189f, 0.903576f, 0.837584f, 0.775562f, 0.722310f, 0.680443f, 0.651673f, 0.638265f, 0.641074f, 0.658779f, 0.689980f, 0.733722f, 0.788343f, 0.852546f, 0.926831f, 1.011394f, 1.104140f, 1.203288f, 1.309951f, 1.425422f, 1.547756f, 1.673494f, 1.800797f, 1.928139f, 2.051052f, 2.162499f, 2.256187f, 2.328001f, 2.374142f, 2.389503f, + 2.369730f, 2.314896f, 2.228939f, 2.114741f, 1.972694f, 1.805661f, 1.621289f, 1.426246f, 1.222051f, 1.010434f, 0.798653f, 0.594793f, 0.401641f, 0.220362f, 0.056562f, -0.082970f, -0.197029f, -0.288612f, -0.359153f, -0.408639f, -0.439636f, -0.457088f, -0.464729f, -0.464047f, -0.456113f, -0.442968f, -0.427436f, -0.411786f, -0.396493f, -0.381143f, -0.366415f, -0.353190f, -0.339754f, -0.322693f, -0.300816f, -0.275555f, -0.247788f, -0.217400f, -0.185761f, -0.155837f, -0.130316f, -0.111467f, -0.101559f, -0.102274f, -0.115577f, -0.144891f, -0.192498f, -0.257270f, -0.338656f, -0.439477f, -0.560090f, -0.695118f, -0.840907f, -0.998289f, -1.164095f, -1.332994f, -1.508120f, -1.680480f, -1.788383f, -1.743468f, -1.535858f, -1.279623f, -1.106724f, -1.043498f}, + {0.905588f, 0.678721f, 0.311452f, -0.074075f, -0.391395f, -0.617293f, -0.746184f, -0.740920f, -0.564252f, -0.254379f, 0.071055f, 0.303498f, 0.417361f, 0.449527f, 0.432288f, 0.367893f, 0.256058f, 0.119389f, -0.008961f, -0.114172f, -0.203831f, -0.281005f, -0.325060f, -0.311031f, -0.241850f, -0.146096f, -0.046032f, 0.054939f, 0.152046f, 0.226111f, 0.259475f, 0.251935f, 0.213195f, 0.150231f, 0.069290f, -0.018553f, -0.100712f, -0.166582f, -0.205558f, -0.209673f, -0.181832f, -0.135168f, -0.081370f, -0.024250f, 0.034933f, 0.092041f, 0.141134f, 0.175712f, 0.187987f, 0.171668f, 0.127233f, 0.062532f, -0.011072f, -0.081089f, -0.134991f, -0.163771f, -0.165597f, -0.144952f, -0.109017f, -0.065402f, -0.020706f, 0.021494f, 0.060945f, 0.098011f, 0.130933f, 0.155438f, 0.165387f, 0.153670f, 0.114571f, 0.047357f, -0.041172f, -0.136224f, -0.216658f, -0.259817f, -0.249548f, -0.183688f, -0.076336f, 0.046314f, 0.154535f, 0.224647f, 0.245627f, 0.219783f, 0.158447f, 0.076683f, -0.010276f, -0.088825f, -0.147781f, -0.178799f, -0.177443f, -0.145071f, -0.089700f, -0.024150f, 0.037705f, 0.084486f, 0.109662f, 0.112458f, + 0.097013f, 0.070123f, 0.038867f, 0.009115f, -0.015219f, -0.032411f, -0.042533f, -0.046682f, -0.046354f, -0.043035f, -0.037774f, -0.030925f, -0.022303f, -0.011540f, 0.001583f, 0.016669f, 0.032205f, 0.045559f, 0.053690f, 0.054105f, 0.045640f, 0.028983f, 0.006793f, -0.016842f, -0.037453f, -0.051237f, -0.055876f, -0.051059f, -0.038496f, -0.021237f, -0.002673f, 0.014251f, 0.027456f, 0.035870f, 0.039284f, 0.038016f, 0.032623f, 0.023845f, 0.012634f, 0.000134f, -0.012341f, -0.023309f, -0.031253f, -0.034934f, -0.033690f, -0.027594f, -0.017500f, -0.005027f, 0.007694f, 0.018568f, 0.026056f, 0.029352f, 0.028366f, 0.023762f, 0.016767f, 0.008566f, -0.000041f, -0.007969f, -0.013188f, -0.013852f, -0.010529f, -0.006339f, -0.004049f, -0.003641f} + }, + { + {0.905588f, 0.678721f, 0.311452f, -0.074075f, -0.391395f, -0.617293f, -0.746184f, -0.740920f, -0.564252f, -0.254379f, 0.071055f, 0.303498f, 0.417361f, 0.449527f, 0.432288f, 0.367893f, 0.256058f, 0.119389f, -0.008961f, -0.114172f, -0.203831f, -0.281005f, -0.325060f, -0.311031f, -0.241850f, -0.146096f, -0.046032f, 0.054939f, 0.152046f, 0.226111f, 0.259475f, 0.251935f, 0.213195f, 0.150231f, 0.069290f, -0.018553f, -0.100712f, -0.166582f, -0.205558f, -0.209673f, -0.181832f, -0.135168f, -0.081370f, -0.024250f, 0.034933f, 0.092041f, 0.141134f, 0.175712f, 0.187987f, 0.171668f, 0.127233f, 0.062532f, -0.011072f, -0.081089f, -0.134991f, -0.163771f, -0.165597f, -0.144952f, -0.109017f, -0.065402f, -0.020706f, 0.021494f, 0.060945f, 0.098011f, 0.130933f, 0.155438f, 0.165387f, 0.153670f, 0.114571f, 0.047357f, -0.041172f, -0.136224f, -0.216658f, -0.259817f, -0.249548f, -0.183688f, -0.076336f, 0.046314f, 0.154535f, 0.224647f, 0.245627f, 0.219783f, 0.158447f, 0.076683f, -0.010276f, -0.088825f, -0.147781f, -0.178799f, -0.177443f, -0.145071f, -0.089700f, -0.024150f, 0.037705f, 0.084486f, 0.109662f, 0.112458f, + 0.097013f, 0.070123f, 0.038867f, 0.009115f, -0.015219f, -0.032411f, -0.042533f, -0.046682f, -0.046354f, -0.043035f, -0.037774f, -0.030925f, -0.022303f, -0.011540f, 0.001583f, 0.016669f, 0.032205f, 0.045559f, 0.053690f, 0.054105f, 0.045640f, 0.028983f, 0.006793f, -0.016842f, -0.037453f, -0.051237f, -0.055876f, -0.051059f, -0.038496f, -0.021237f, -0.002673f, 0.014251f, 0.027456f, 0.035870f, 0.039284f, 0.038016f, 0.032623f, 0.023845f, 0.012634f, 0.000134f, -0.012341f, -0.023309f, -0.031253f, -0.034934f, -0.033690f, -0.027594f, -0.017500f, -0.005027f, 0.007694f, 0.018568f, 0.026056f, 0.029352f, 0.028366f, 0.023762f, 0.016767f, 0.008566f, -0.000041f, -0.007969f, -0.013188f, -0.013852f, -0.010529f, -0.006339f, -0.004049f, -0.003641f}, + {1.162181f, 1.141798f, 1.179331f, 1.312669f, 1.480555f, 1.604003f, 1.670306f, 1.695382f, 1.657718f, 1.541807f, 1.413737f, 1.363031f, 1.373945f, 1.344708f, 1.245904f, 1.165785f, 1.167020f, 1.190832f, 1.158172f, 1.088594f, 1.049454f, 1.044643f, 1.028324f, 0.992763f, 0.971665f, 0.973963f, 0.973448f, 0.958360f, 0.946807f, 0.954173f, 0.976219f, 1.002416f, 1.024019f, 1.032959f, 1.029383f, 1.026640f, 1.038825f, 1.068822f, 1.113169f, 1.168957f, 1.230999f, 1.291508f, 1.346952f, 1.398324f, 1.443741f, 1.478287f, 1.501426f, 1.518040f, 1.532576f, 1.547027f, 1.562611f, 1.578765f, 1.592058f, 1.598749f, 1.596511f, 1.583342f, 1.558420f, 1.523901f, 1.482143f, 1.432374f, 1.373890f, 1.310066f, 1.244815f, 1.177941f, 1.108302f, 1.038172f, 0.970189f, 0.903576f, 0.837584f, 0.775562f, 0.722310f, 0.680443f, 0.651673f, 0.638265f, 0.641074f, 0.658779f, 0.689980f, 0.733722f, 0.788343f, 0.852546f, 0.926831f, 1.011394f, 1.104140f, 1.203288f, 1.309951f, 1.425422f, 1.547756f, 1.673494f, 1.800797f, 1.928139f, 2.051052f, 2.162499f, 2.256187f, 2.328001f, 2.374142f, 2.389503f, + 2.369730f, 2.314896f, 2.228939f, 2.114741f, 1.972694f, 1.805661f, 1.621289f, 1.426246f, 1.222051f, 1.010434f, 0.798653f, 0.594793f, 0.401641f, 0.220362f, 0.056562f, -0.082970f, -0.197029f, -0.288612f, -0.359153f, -0.408639f, -0.439636f, -0.457088f, -0.464729f, -0.464047f, -0.456113f, -0.442968f, -0.427436f, -0.411786f, -0.396493f, -0.381143f, -0.366415f, -0.353190f, -0.339754f, -0.322693f, -0.300816f, -0.275555f, -0.247788f, -0.217400f, -0.185761f, -0.155837f, -0.130316f, -0.111467f, -0.101559f, -0.102274f, -0.115577f, -0.144891f, -0.192498f, -0.257270f, -0.338656f, -0.439477f, -0.560090f, -0.695118f, -0.840907f, -0.998289f, -1.164095f, -1.332994f, -1.508120f, -1.680480f, -1.788383f, -1.743468f, -1.535858f, -1.279623f, -1.106724f, -1.043498f} + }, + { + {1.159622f, 1.193691f, 1.237258f, 1.320849f, 1.487298f, 1.666553f, 1.724102f, 1.650966f, 1.573042f, 1.544114f, 1.472362f, 1.307714f, 1.161858f, 1.150104f, 1.223815f, 1.264871f, 1.263073f, 1.287888f, 1.342278f, 1.362131f, 1.337721f, 1.330944f, 1.368021f, 1.396360f, 1.364710f, 1.288691f, 1.218865f, 1.183954f, 1.180171f, 1.187830f, 1.187661f, 1.180495f, 1.195032f, 1.259113f, 1.362844f, 1.466040f, 1.540461f, 1.588501f, 1.622646f, 1.646051f, 1.658212f, 1.665631f, 1.678718f, 1.703510f, 1.739748f, 1.783278f, 1.828707f, 1.872076f, 1.911060f, 1.941699f, 1.957382f, 1.953400f, 1.930581f, 1.892863f, 1.843933f, 1.788203f, 1.732141f, 1.681303f, 1.636732f, 1.595689f, 1.554498f, 1.508967f, 1.453241f, 1.380844f, 1.287974f, 1.175649f, 1.048847f, 0.914443f, 0.780366f, 0.655432f, 0.547534f, 0.460905f, 0.396117f, 0.353230f, 0.333368f, 0.336440f, 0.359235f, 0.397509f, 0.448944f, 0.512890f, 0.588417f, 0.673852f, 0.767268f, 0.866240f, 0.967523f, 1.067477f, 1.162781f, 1.251696f, 1.335718f, 1.418848f, 1.503672f, 1.589111f, 1.673021f, 1.754375f, 1.830218f, 1.892793f, + 1.933260f, 1.946807f, 1.930919f, 1.880810f, 1.791440f, 1.663674f, 1.504434f, 1.320882f, 1.118452f, 0.904794f, 0.690996f, 0.486304f, 0.293952f, 0.114062f, -0.051677f, -0.200995f, -0.335215f, -0.458659f, -0.573224f, -0.676398f, -0.765669f, -0.841798f, -0.905649f, -0.954822f, -0.986818f, -1.003613f, -1.009628f, -1.006662f, -0.994352f, -0.974281f, -0.949658f, -0.921427f, -0.888107f, -0.849284f, -0.806653f, -0.762102f, -0.716996f, -0.672764f, -0.630702f, -0.592073f, -0.558976f, -0.533407f, -0.515537f, -0.505563f, -0.506735f, -0.523053f, -0.554958f, -0.601619f, -0.665696f, -0.750024f, -0.851507f, -0.964704f, -1.088238f, -1.219977f, -1.351507f, -1.477464f, -1.598506f, -1.692749f, -1.695051f, -1.547196f, -1.283387f, -1.029223f, -0.886823f, -0.846926f}, + {0.917530f, 0.651778f, 0.241502f, -0.178942f, -0.536560f, -0.786296f, -0.860850f, -0.706638f, -0.361171f, 0.046809f, 0.387357f, 0.602717f, 0.692047f, 0.656485f, 0.487419f, 0.202537f, -0.131209f, -0.422884f, -0.603096f, -0.644757f, -0.551449f, -0.342251f, -0.055144f, 0.244353f, 0.476752f, 0.583435f, 0.550410f, 0.400902f, 0.174798f, -0.079777f, -0.306983f, -0.454414f, -0.491763f, -0.418131f, -0.255796f, -0.044428f, 0.162865f, 0.313621f, 0.377506f, 0.355066f, 0.266380f, 0.136211f, -0.009740f, -0.143360f, -0.238377f, -0.278253f, -0.259547f, -0.190305f, -0.088010f, 0.022991f, 0.117569f, 0.177810f, 0.197350f, 0.179580f, 0.133113f, 0.068872f, -0.000779f, -0.063476f, -0.109645f, -0.134287f, -0.136342f, -0.117479f, -0.081934f, -0.036147f, 0.013007f, 0.059765f, 0.099237f, 0.126500f, 0.136441f, 0.124091f, 0.085864f, 0.023102f, -0.053770f, -0.125481f, -0.170570f, -0.174290f, -0.134420f, -0.062132f, 0.021772f, 0.094424f, 0.139321f, 0.150911f, 0.133188f, 0.094735f, 0.044256f, -0.011227f, -0.065550f, -0.111473f, -0.139846f, -0.141427f, -0.111062f, -0.052088f, 0.022029f, 0.091072f, 0.135690f, 0.145016f, + 0.119868f, 0.070626f, 0.012094f, -0.041731f, -0.081087f, -0.101328f, -0.102037f, -0.085784f, -0.057045f, -0.021038f, 0.017163f, 0.052643f, 0.080347f, 0.095430f, 0.094095f, 0.074476f, 0.037848f, -0.010003f, -0.058809f, -0.096245f, -0.111730f, -0.100012f, -0.063528f, -0.012321f, 0.039313f, 0.078026f, 0.095507f, 0.090021f, 0.065833f, 0.031042f, -0.005483f, -0.036519f, -0.057334f, -0.065748f, -0.062075f, -0.048499f, -0.027988f, -0.003851f, 0.020134f, 0.040124f, 0.053012f, 0.056670f, 0.050087f, 0.034085f, 0.011613f, -0.013157f, -0.035718f, -0.051525f, -0.056944f, -0.050760f, -0.034341f, -0.010740f, 0.015371f, 0.037961f, 0.051881f, 0.054631f, 0.045371f, 0.025148f, 0.000589f, -0.016591f, -0.019315f, -0.012675f, -0.006967f, -0.005603f} + }, + { + {0.917530f, 0.651778f, 0.241502f, -0.178942f, -0.536560f, -0.786296f, -0.860850f, -0.706638f, -0.361171f, 0.046809f, 0.387357f, 0.602717f, 0.692047f, 0.656485f, 0.487419f, 0.202537f, -0.131209f, -0.422884f, -0.603096f, -0.644757f, -0.551449f, -0.342251f, -0.055144f, 0.244353f, 0.476752f, 0.583435f, 0.550410f, 0.400902f, 0.174798f, -0.079777f, -0.306983f, -0.454414f, -0.491763f, -0.418131f, -0.255796f, -0.044428f, 0.162865f, 0.313621f, 0.377506f, 0.355066f, 0.266380f, 0.136211f, -0.009740f, -0.143360f, -0.238377f, -0.278253f, -0.259547f, -0.190305f, -0.088010f, 0.022991f, 0.117569f, 0.177810f, 0.197350f, 0.179580f, 0.133113f, 0.068872f, -0.000779f, -0.063476f, -0.109645f, -0.134287f, -0.136342f, -0.117479f, -0.081934f, -0.036147f, 0.013007f, 0.059765f, 0.099237f, 0.126500f, 0.136441f, 0.124091f, 0.085864f, 0.023102f, -0.053770f, -0.125481f, -0.170570f, -0.174290f, -0.134420f, -0.062132f, 0.021772f, 0.094424f, 0.139321f, 0.150911f, 0.133188f, 0.094735f, 0.044256f, -0.011227f, -0.065550f, -0.111473f, -0.139846f, -0.141427f, -0.111062f, -0.052088f, 0.022029f, 0.091072f, 0.135690f, 0.145016f, + 0.119868f, 0.070626f, 0.012094f, -0.041731f, -0.081087f, -0.101328f, -0.102037f, -0.085784f, -0.057045f, -0.021038f, 0.017163f, 0.052643f, 0.080347f, 0.095430f, 0.094095f, 0.074476f, 0.037848f, -0.010003f, -0.058809f, -0.096245f, -0.111730f, -0.100012f, -0.063528f, -0.012321f, 0.039313f, 0.078026f, 0.095507f, 0.090021f, 0.065833f, 0.031042f, -0.005483f, -0.036519f, -0.057334f, -0.065748f, -0.062075f, -0.048499f, -0.027988f, -0.003851f, 0.020134f, 0.040124f, 0.053012f, 0.056670f, 0.050087f, 0.034085f, 0.011613f, -0.013157f, -0.035718f, -0.051525f, -0.056944f, -0.050760f, -0.034341f, -0.010740f, 0.015371f, 0.037961f, 0.051881f, 0.054631f, 0.045371f, 0.025148f, 0.000589f, -0.016591f, -0.019315f, -0.012675f, -0.006967f, -0.005603f}, + {1.159622f, 1.193691f, 1.237258f, 1.320849f, 1.487298f, 1.666553f, 1.724102f, 1.650966f, 1.573042f, 1.544114f, 1.472362f, 1.307714f, 1.161858f, 1.150104f, 1.223815f, 1.264871f, 1.263073f, 1.287888f, 1.342278f, 1.362131f, 1.337721f, 1.330944f, 1.368021f, 1.396360f, 1.364710f, 1.288691f, 1.218865f, 1.183954f, 1.180171f, 1.187830f, 1.187661f, 1.180495f, 1.195032f, 1.259113f, 1.362844f, 1.466040f, 1.540461f, 1.588501f, 1.622646f, 1.646051f, 1.658212f, 1.665631f, 1.678718f, 1.703510f, 1.739748f, 1.783278f, 1.828707f, 1.872076f, 1.911060f, 1.941699f, 1.957382f, 1.953400f, 1.930581f, 1.892863f, 1.843933f, 1.788203f, 1.732141f, 1.681303f, 1.636732f, 1.595689f, 1.554498f, 1.508967f, 1.453241f, 1.380844f, 1.287974f, 1.175649f, 1.048847f, 0.914443f, 0.780366f, 0.655432f, 0.547534f, 0.460905f, 0.396117f, 0.353230f, 0.333368f, 0.336440f, 0.359235f, 0.397509f, 0.448944f, 0.512890f, 0.588417f, 0.673852f, 0.767268f, 0.866240f, 0.967523f, 1.067477f, 1.162781f, 1.251696f, 1.335718f, 1.418848f, 1.503672f, 1.589111f, 1.673021f, 1.754375f, 1.830218f, 1.892793f, + 1.933260f, 1.946807f, 1.930919f, 1.880810f, 1.791440f, 1.663674f, 1.504434f, 1.320882f, 1.118452f, 0.904794f, 0.690996f, 0.486304f, 0.293952f, 0.114062f, -0.051677f, -0.200995f, -0.335215f, -0.458659f, -0.573224f, -0.676398f, -0.765669f, -0.841798f, -0.905649f, -0.954822f, -0.986818f, -1.003613f, -1.009628f, -1.006662f, -0.994352f, -0.974281f, -0.949658f, -0.921427f, -0.888107f, -0.849284f, -0.806653f, -0.762102f, -0.716996f, -0.672764f, -0.630702f, -0.592073f, -0.558976f, -0.533407f, -0.515537f, -0.505563f, -0.506735f, -0.523053f, -0.554958f, -0.601619f, -0.665696f, -0.750024f, -0.851507f, -0.964704f, -1.088238f, -1.219977f, -1.351507f, -1.477464f, -1.598506f, -1.692749f, -1.695051f, -1.547196f, -1.283387f, -1.029223f, -0.886823f, -0.846926f} + }, + { + {1.204534f, 1.203210f, 1.190459f, 1.158364f, 1.109879f, 1.047847f, 0.967182f, 0.886071f, 0.875240f, 1.004287f, 1.246157f, 1.481970f, 1.615355f, 1.637426f, 1.577214f, 1.457598f, 1.321024f, 1.229774f, 1.206408f, 1.223980f, 1.272061f, 1.371986f, 1.508691f, 1.612777f, 1.637477f, 1.601706f, 1.541886f, 1.477270f, 1.436013f, 1.455349f, 1.534155f, 1.631670f, 1.725521f, 1.826471f, 1.929526f, 1.998858f, 2.013654f, 1.990557f, 1.951995f, 1.904864f, 1.854980f, 1.812358f, 1.776533f, 1.738280f, 1.696957f, 1.660023f, 1.629610f, 1.603794f, 1.584323f, 1.570732f, 1.554937f, 1.532291f, 1.509613f, 1.494021f, 1.482648f, 1.469744f, 1.454557f, 1.436482f, 1.411078f, 1.376370f, 1.336916f, 1.298175f, 1.261515f, 1.226108f, 1.191183f, 1.154956f, 1.113954f, 1.064034f, 1.001800f, 0.926672f, 0.841820f, 0.751089f, 0.655693f, 0.556482f, 0.457666f, 0.364250f, 0.277024f, 0.194155f, 0.116696f, 0.048473f, -0.008535f, -0.054762f, -0.089740f, -0.112245f, -0.123899f, -0.129341f, -0.132173f, -0.133099f, -0.132513f, -0.132606f, -0.135739f, -0.142102f, -0.150075f, -0.158190f, -0.165938f, -0.173194f, + -0.179698f, -0.185269f, -0.190331f, -0.196010f, -0.203236f, -0.211655f, -0.220071f, -0.228003f, -0.235580f, -0.241688f, -0.244000f, -0.241462f, -0.234924f, -0.224740f, -0.209975f, -0.190727f, -0.168794f, -0.145304f, -0.120014f, -0.093330f, -0.066541f, -0.039964f, -0.013201f, 0.013257f, 0.038995f, 0.065097f, 0.092403f, 0.120117f, 0.148133f, 0.178226f, 0.211116f, 0.245318f, 0.280246f, 0.316864f, 0.354258f, 0.389361f, 0.420350f, 0.446556f, 0.465866f, 0.476164f, 0.477674f, 0.470479f, 0.452941f, 0.425418f, 0.390777f, 0.349073f, 0.298093f, 0.240144f, 0.179989f, 0.116389f, 0.045546f, -0.029475f, -0.104553f, -0.184802f, -0.276288f, -0.377633f, -0.495071f, -0.645493f, -0.815390f, -0.936731f, -0.946277f, -0.861930f, -0.763516f, -0.709030f}, + {1.086199f, 1.004862f, 0.856920f, 0.638693f, 0.364003f, 0.130220f, 0.067679f, 0.200071f, 0.403211f, 0.509750f, 0.423010f, 0.156791f, -0.172783f, -0.408435f, -0.470895f, -0.422906f, -0.382903f, -0.401158f, -0.461457f, -0.557666f, -0.691515f, -0.814952f, -0.853789f, -0.795975f, -0.704559f, -0.639966f, -0.610169f, -0.594209f, -0.572008f, -0.524834f, -0.437816f, -0.312986f, -0.167818f, -0.022362f, 0.104727f, 0.198993f, 0.262493f, 0.315863f, 0.378159f, 0.450032f, 0.520371f, 0.579860f, 0.623926f, 0.651912f, 0.668089f, 0.677538f, 0.679621f, 0.670347f, 0.649417f, 0.619352f, 0.580188f, 0.530227f, 0.469047f, 0.395638f, 0.307512f, 0.205554f, 0.095977f, -0.015238f, -0.125770f, -0.233301f, -0.333345f, -0.422540f, -0.499945f, -0.564191f, -0.613419f, -0.648393f, -0.671605f, -0.682790f, -0.678457f, -0.655912f, -0.615299f, -0.558515f, -0.488718f, -0.410330f, -0.327205f, -0.240846f, -0.151506f, -0.060435f, 0.029743f, 0.116185f, 0.196603f, 0.269218f, 0.332259f, 0.383578f, 0.421216f, 0.444550f, 0.454402f, 0.452174f, 0.439605f, 0.418976f, 0.392290f, 0.360410f, 0.324023f, 0.284973f, 0.245420f, 0.206302f, + 0.167896f, 0.131240f, 0.097662f, 0.067544f, 0.040831f, 0.018067f, -0.000312f, -0.015097f, -0.027643f, -0.038677f, -0.048631f, -0.058475f, -0.069291f, -0.081482f, -0.095092f, -0.110486f, -0.128190f, -0.148421f, -0.171029f, -0.195562f, -0.221182f, -0.246725f, -0.270807f, -0.291832f, -0.308285f, -0.319211f, -0.323959f, -0.321487f, -0.310646f, -0.291111f, -0.263101f, -0.226361f, -0.180686f, -0.127219f, -0.067738f, -0.002935f, 0.066945f, 0.140199f, 0.214330f, 0.288003f, 0.360118f, 0.427762f, 0.487507f, 0.537747f, 0.577193f, 0.602502f, 0.610203f, 0.599283f, 0.569254f, 0.518270f, 0.446010f, 0.355357f, 0.248976f, 0.128708f, -0.000380f, -0.132271f, -0.265471f, -0.391680f, -0.476715f, -0.476959f, -0.392112f, -0.282972f, -0.214100f, -0.193429f} + }, + { + {1.086199f, 1.004862f, 0.856920f, 0.638693f, 0.364003f, 0.130220f, 0.067679f, 0.200071f, 0.403211f, 0.509750f, 0.423010f, 0.156791f, -0.172783f, -0.408435f, -0.470895f, -0.422906f, -0.382903f, -0.401158f, -0.461457f, -0.557666f, -0.691515f, -0.814952f, -0.853789f, -0.795975f, -0.704559f, -0.639966f, -0.610169f, -0.594209f, -0.572008f, -0.524834f, -0.437816f, -0.312986f, -0.167818f, -0.022362f, 0.104727f, 0.198993f, 0.262493f, 0.315863f, 0.378159f, 0.450032f, 0.520371f, 0.579860f, 0.623926f, 0.651912f, 0.668089f, 0.677538f, 0.679621f, 0.670347f, 0.649417f, 0.619352f, 0.580188f, 0.530227f, 0.469047f, 0.395638f, 0.307512f, 0.205554f, 0.095977f, -0.015238f, -0.125770f, -0.233301f, -0.333345f, -0.422540f, -0.499945f, -0.564191f, -0.613419f, -0.648393f, -0.671605f, -0.682790f, -0.678457f, -0.655912f, -0.615299f, -0.558515f, -0.488718f, -0.410330f, -0.327205f, -0.240846f, -0.151506f, -0.060435f, 0.029743f, 0.116185f, 0.196603f, 0.269218f, 0.332259f, 0.383578f, 0.421216f, 0.444550f, 0.454402f, 0.452174f, 0.439605f, 0.418976f, 0.392290f, 0.360410f, 0.324023f, 0.284973f, 0.245420f, 0.206302f, + 0.167896f, 0.131240f, 0.097662f, 0.067544f, 0.040831f, 0.018067f, -0.000312f, -0.015097f, -0.027643f, -0.038677f, -0.048631f, -0.058475f, -0.069291f, -0.081482f, -0.095092f, -0.110486f, -0.128190f, -0.148421f, -0.171029f, -0.195562f, -0.221182f, -0.246725f, -0.270807f, -0.291832f, -0.308285f, -0.319211f, -0.323959f, -0.321487f, -0.310646f, -0.291111f, -0.263101f, -0.226361f, -0.180686f, -0.127219f, -0.067738f, -0.002935f, 0.066945f, 0.140199f, 0.214330f, 0.288003f, 0.360118f, 0.427762f, 0.487507f, 0.537747f, 0.577193f, 0.602502f, 0.610203f, 0.599283f, 0.569254f, 0.518270f, 0.446010f, 0.355357f, 0.248976f, 0.128708f, -0.000380f, -0.132271f, -0.265471f, -0.391680f, -0.476715f, -0.476959f, -0.392112f, -0.282972f, -0.214100f, -0.193429f}, + {1.204534f, 1.203210f, 1.190459f, 1.158364f, 1.109879f, 1.047847f, 0.967182f, 0.886071f, 0.875240f, 1.004287f, 1.246157f, 1.481970f, 1.615355f, 1.637426f, 1.577214f, 1.457598f, 1.321024f, 1.229774f, 1.206408f, 1.223980f, 1.272061f, 1.371986f, 1.508691f, 1.612777f, 1.637477f, 1.601706f, 1.541886f, 1.477270f, 1.436013f, 1.455349f, 1.534155f, 1.631670f, 1.725521f, 1.826471f, 1.929526f, 1.998858f, 2.013654f, 1.990557f, 1.951995f, 1.904864f, 1.854980f, 1.812358f, 1.776533f, 1.738280f, 1.696957f, 1.660023f, 1.629610f, 1.603794f, 1.584323f, 1.570732f, 1.554937f, 1.532291f, 1.509613f, 1.494021f, 1.482648f, 1.469744f, 1.454557f, 1.436482f, 1.411078f, 1.376370f, 1.336916f, 1.298175f, 1.261515f, 1.226108f, 1.191183f, 1.154956f, 1.113954f, 1.064034f, 1.001800f, 0.926672f, 0.841820f, 0.751089f, 0.655693f, 0.556482f, 0.457666f, 0.364250f, 0.277024f, 0.194155f, 0.116696f, 0.048473f, -0.008535f, -0.054762f, -0.089740f, -0.112245f, -0.123899f, -0.129341f, -0.132173f, -0.133099f, -0.132513f, -0.132606f, -0.135739f, -0.142102f, -0.150075f, -0.158190f, -0.165938f, -0.173194f, + -0.179698f, -0.185269f, -0.190331f, -0.196010f, -0.203236f, -0.211655f, -0.220071f, -0.228003f, -0.235580f, -0.241688f, -0.244000f, -0.241462f, -0.234924f, -0.224740f, -0.209975f, -0.190727f, -0.168794f, -0.145304f, -0.120014f, -0.093330f, -0.066541f, -0.039964f, -0.013201f, 0.013257f, 0.038995f, 0.065097f, 0.092403f, 0.120117f, 0.148133f, 0.178226f, 0.211116f, 0.245318f, 0.280246f, 0.316864f, 0.354258f, 0.389361f, 0.420350f, 0.446556f, 0.465866f, 0.476164f, 0.477674f, 0.470479f, 0.452941f, 0.425418f, 0.390777f, 0.349073f, 0.298093f, 0.240144f, 0.179989f, 0.116389f, 0.045546f, -0.029475f, -0.104553f, -0.184802f, -0.276288f, -0.377633f, -0.495071f, -0.645493f, -0.815390f, -0.936731f, -0.946277f, -0.861930f, -0.763516f, -0.709030f} + }, + { + {1.136670f, 1.135642f, 1.159558f, 1.242764f, 1.363234f, 1.418639f, 1.336924f, 1.189682f, 1.113008f, 1.131924f, 1.157617f, 1.151455f, 1.181552f, 1.293689f, 1.426449f, 1.500166f, 1.514642f, 1.509585f, 1.486776f, 1.424261f, 1.330820f, 1.239551f, 1.165466f, 1.100846f, 1.040119f, 0.986673f, 0.942034f, 0.902330f, 0.862433f, 0.819391f, 0.776566f, 0.743854f, 0.727187f, 0.719668f, 0.709421f, 0.693441f, 0.678491f, 0.672553f, 0.680404f, 0.703111f, 0.736854f, 0.775141f, 0.814760f, 0.856596f, 0.900306f, 0.942530f, 0.980421f, 1.012484f, 1.035999f, 1.047912f, 1.048713f, 1.042995f, 1.036815f, 1.035930f, 1.044536f, 1.063597f, 1.091269f, 1.124936f, 1.160818f, 1.192654f, 1.214352f, 1.223836f, 1.221719f, 1.207688f, 1.181727f, 1.147450f, 1.110173f, 1.072170f, 1.032778f, 0.991992f, 0.950676f, 0.907968f, 0.861440f, 0.809940f, 0.754528f, 0.696829f, 0.637989f, 0.579463f, 0.523977f, 0.474852f, 0.433794f, 0.399580f, 0.369634f, 0.342464f, 0.317497f, 0.293477f, 0.269419f, 0.247151f, 0.230793f, 0.223510f, 0.226350f, 0.239825f, 0.264468f, 0.299833f, 0.344597f, 0.397722f, + 0.458584f, 0.526418f, 0.600176f, 0.677918f, 0.755919f, 0.829709f, 0.896231f, 0.953601f, 0.999158f, 1.030126f, 1.046156f, 1.048788f, 1.038255f, 1.013274f, 0.974186f, 0.923755f, 0.864275f, 0.796121f, 0.720041f, 0.639023f, 0.556603f, 0.474308f, 0.392028f, 0.310457f, 0.231609f, 0.156391f, 0.083091f, 0.009683f, -0.063465f, -0.135078f, -0.206105f, -0.278586f, -0.351844f, -0.422799f, -0.489943f, -0.553901f, -0.613917f, -0.667023f, -0.711334f, -0.747585f, -0.776837f, -0.798893f, -0.813586f, -0.822199f, -0.827084f, -0.830337f, -0.832774f, -0.834571f, -0.837262f, -0.843529f, -0.854126f, -0.867669f, -0.884714f, -0.908029f, -0.937931f, -0.973595f, -1.017808f, -1.066008f, -1.087268f, -1.038917f, -0.917834f, -0.780429f, -0.689733f, -0.656403f}, + {0.960640f, 0.816300f, 0.532130f, 0.162721f, -0.177503f, -0.386043f, -0.458478f, -0.483376f, -0.540231f, -0.613871f, -0.621946f, -0.516051f, -0.334075f, -0.151666f, -0.004270f, 0.128279f, 0.272309f, 0.416162f, 0.517877f, 0.544624f, 0.498443f, 0.408788f, 0.305793f, 0.199974f, 0.084387f, -0.046450f, -0.182699f, -0.304310f, -0.394850f, -0.445761f, -0.450978f, -0.406320f, -0.316884f, -0.199695f, -0.075242f, 0.041820f, 0.142995f, 0.221772f, 0.273300f, 0.296982f, 0.296450f, 0.276859f, 0.243007f, 0.198850f, 0.147055f, 0.089044f, 0.026127f, -0.039590f, -0.105511f, -0.168772f, -0.225337f, -0.269209f, -0.293289f, -0.291676f, -0.261993f, -0.206338f, -0.130253f, -0.040664f, 0.055241f, 0.149519f, 0.232931f, 0.295939f, 0.330770f, 0.333107f, 0.302661f, 0.242736f, 0.159157f, 0.059248f, -0.048476f, -0.153986f, -0.245588f, -0.310890f, -0.339319f, -0.325534f, -0.271853f, -0.188083f, -0.088946f, 0.009493f, 0.093484f, 0.154613f, 0.190898f, 0.205217f, 0.202369f, 0.186878f, 0.162125f, 0.130210f, 0.092281f, 0.049362f, 0.003253f, -0.043024f, -0.085315f, -0.119041f, -0.140550f, -0.148332f, -0.143136f, -0.127149f, + -0.103171f, -0.074084f, -0.042377f, -0.009910f, 0.021838f, 0.051455f, 0.077582f, 0.098903f, 0.113990f, 0.121384f, 0.119975f, 0.109245f, 0.089333f, 0.061281f, 0.027240f, -0.009804f, -0.046484f, -0.079281f, -0.104807f, -0.120441f, -0.124813f, -0.117785f, -0.100313f, -0.074391f, -0.042701f, -0.008052f, 0.026806f, 0.059088f, 0.086138f, 0.105684f, 0.115807f, 0.115012f, 0.102800f, 0.080165f, 0.049512f, 0.014383f, -0.020831f, -0.051690f, -0.074772f, -0.088141f, -0.091258f, -0.084989f, -0.071486f, -0.053399f, -0.033132f, -0.012815f, 0.005713f, 0.021390f, 0.033926f, 0.043146f, 0.048887f, 0.051423f, 0.051133f, 0.047899f, 0.041642f, 0.032825f, 0.021467f, 0.007161f, -0.008032f, -0.018531f, -0.020230f, -0.015601f, -0.010789f, -0.008773f} + }, + { + {0.960640f, 0.816300f, 0.532130f, 0.162721f, -0.177503f, -0.386043f, -0.458478f, -0.483376f, -0.540231f, -0.613871f, -0.621946f, -0.516051f, -0.334075f, -0.151666f, -0.004270f, 0.128279f, 0.272309f, 0.416162f, 0.517877f, 0.544624f, 0.498443f, 0.408788f, 0.305793f, 0.199974f, 0.084387f, -0.046450f, -0.182699f, -0.304310f, -0.394850f, -0.445761f, -0.450978f, -0.406320f, -0.316884f, -0.199695f, -0.075242f, 0.041820f, 0.142995f, 0.221772f, 0.273300f, 0.296982f, 0.296450f, 0.276859f, 0.243007f, 0.198850f, 0.147055f, 0.089044f, 0.026127f, -0.039590f, -0.105511f, -0.168772f, -0.225337f, -0.269209f, -0.293289f, -0.291676f, -0.261993f, -0.206338f, -0.130253f, -0.040664f, 0.055241f, 0.149519f, 0.232931f, 0.295939f, 0.330770f, 0.333107f, 0.302661f, 0.242736f, 0.159157f, 0.059248f, -0.048476f, -0.153986f, -0.245588f, -0.310890f, -0.339319f, -0.325534f, -0.271853f, -0.188083f, -0.088946f, 0.009493f, 0.093484f, 0.154613f, 0.190898f, 0.205217f, 0.202369f, 0.186878f, 0.162125f, 0.130210f, 0.092281f, 0.049362f, 0.003253f, -0.043024f, -0.085315f, -0.119041f, -0.140550f, -0.148332f, -0.143136f, -0.127149f, + -0.103171f, -0.074084f, -0.042377f, -0.009910f, 0.021838f, 0.051455f, 0.077582f, 0.098903f, 0.113990f, 0.121384f, 0.119975f, 0.109245f, 0.089333f, 0.061281f, 0.027240f, -0.009804f, -0.046484f, -0.079281f, -0.104807f, -0.120441f, -0.124813f, -0.117785f, -0.100313f, -0.074391f, -0.042701f, -0.008052f, 0.026806f, 0.059088f, 0.086138f, 0.105684f, 0.115807f, 0.115012f, 0.102800f, 0.080165f, 0.049512f, 0.014383f, -0.020831f, -0.051690f, -0.074772f, -0.088141f, -0.091258f, -0.084989f, -0.071486f, -0.053399f, -0.033132f, -0.012815f, 0.005713f, 0.021390f, 0.033926f, 0.043146f, 0.048887f, 0.051423f, 0.051133f, 0.047899f, 0.041642f, 0.032825f, 0.021467f, 0.007161f, -0.008032f, -0.018531f, -0.020230f, -0.015601f, -0.010789f, -0.008773f}, + {1.136670f, 1.135642f, 1.159558f, 1.242764f, 1.363234f, 1.418639f, 1.336924f, 1.189682f, 1.113008f, 1.131924f, 1.157617f, 1.151455f, 1.181552f, 1.293689f, 1.426449f, 1.500166f, 1.514642f, 1.509585f, 1.486776f, 1.424261f, 1.330820f, 1.239551f, 1.165466f, 1.100846f, 1.040119f, 0.986673f, 0.942034f, 0.902330f, 0.862433f, 0.819391f, 0.776566f, 0.743854f, 0.727187f, 0.719668f, 0.709421f, 0.693441f, 0.678491f, 0.672553f, 0.680404f, 0.703111f, 0.736854f, 0.775141f, 0.814760f, 0.856596f, 0.900306f, 0.942530f, 0.980421f, 1.012484f, 1.035999f, 1.047912f, 1.048713f, 1.042995f, 1.036815f, 1.035930f, 1.044536f, 1.063597f, 1.091269f, 1.124936f, 1.160818f, 1.192654f, 1.214352f, 1.223836f, 1.221719f, 1.207688f, 1.181727f, 1.147450f, 1.110173f, 1.072170f, 1.032778f, 0.991992f, 0.950676f, 0.907968f, 0.861440f, 0.809940f, 0.754528f, 0.696829f, 0.637989f, 0.579463f, 0.523977f, 0.474852f, 0.433794f, 0.399580f, 0.369634f, 0.342464f, 0.317497f, 0.293477f, 0.269419f, 0.247151f, 0.230793f, 0.223510f, 0.226350f, 0.239825f, 0.264468f, 0.299833f, 0.344597f, 0.397722f, + 0.458584f, 0.526418f, 0.600176f, 0.677918f, 0.755919f, 0.829709f, 0.896231f, 0.953601f, 0.999158f, 1.030126f, 1.046156f, 1.048788f, 1.038255f, 1.013274f, 0.974186f, 0.923755f, 0.864275f, 0.796121f, 0.720041f, 0.639023f, 0.556603f, 0.474308f, 0.392028f, 0.310457f, 0.231609f, 0.156391f, 0.083091f, 0.009683f, -0.063465f, -0.135078f, -0.206105f, -0.278586f, -0.351844f, -0.422799f, -0.489943f, -0.553901f, -0.613917f, -0.667023f, -0.711334f, -0.747585f, -0.776837f, -0.798893f, -0.813586f, -0.822199f, -0.827084f, -0.830337f, -0.832774f, -0.834571f, -0.837262f, -0.843529f, -0.854126f, -0.867669f, -0.884714f, -0.908029f, -0.937931f, -0.973595f, -1.017808f, -1.066008f, -1.087268f, -1.038917f, -0.917834f, -0.780429f, -0.689733f, -0.656403f} + }, + { + {1.068324f, 1.062066f, 1.083672f, 1.156642f, 1.251383f, 1.301241f, 1.270195f, 1.189834f, 1.115171f, 1.063568f, 1.022919f, 1.001888f, 1.030552f, 1.110370f, 1.199864f, 1.259787f, 1.284625f, 1.280603f, 1.242659f, 1.171775f, 1.093479f, 1.036606f, 1.002891f, 0.972808f, 0.933548f, 0.887633f, 0.839967f, 0.790500f, 0.739167f, 0.688251f, 0.638192f, 0.586505f, 0.531813f, 0.475822f, 0.421676f, 0.373637f, 0.338297f, 0.322536f, 0.328305f, 0.350663f, 0.382129f, 0.417959f, 0.456126f, 0.493831f, 0.526907f, 0.552956f, 0.572952f, 0.589166f, 0.603191f, 0.616479f, 0.631032f, 0.648516f, 0.669363f, 0.692743f, 0.716446f, 0.737125f, 0.751798f, 0.758883f, 0.757319f, 0.746131f, 0.726128f, 0.700462f, 0.671814f, 0.640056f, 0.603849f, 0.562908f, 0.517307f, 0.466388f, 0.410454f, 0.352646f, 0.297752f, 0.249844f, 0.211692f, 0.185011f, 0.169810f, 0.163886f, 0.163694f, 0.165778f, 0.167776f, 0.168909f, 0.169698f, 0.170965f, 0.173362f, 0.177738f, 0.185104f, 0.195926f, 0.210178f, 0.228154f, 0.250538f, 0.277725f, 0.309833f, 0.347232f, 0.390456f, 0.439791f, 0.495196f, 0.555920f, + 0.619949f, 0.684571f, 0.747409f, 0.805924f, 0.856574f, 0.896391f, 0.925191f, 0.944416f, 0.954283f, 0.954087f, 0.944612f, 0.927526f, 0.902506f, 0.867475f, 0.821809f, 0.767132f, 0.704886f, 0.635309f, 0.559349f, 0.479847f, 0.399919f, 0.321030f, 0.243461f, 0.168221f, 0.097457f, 0.032552f, -0.027272f, -0.083379f, -0.135625f, -0.183518f, -0.228709f, -0.273886f, -0.319427f, -0.363620f, -0.405822f, -0.446545f, -0.484543f, -0.516852f, -0.541980f, -0.560664f, -0.573598f, -0.580683f, -0.582341f, -0.579795f, -0.574373f, -0.567446f, -0.560136f, -0.552846f, -0.546452f, -0.543218f, -0.544596f, -0.549853f, -0.559220f, -0.575373f, -0.599427f, -0.630547f, -0.671011f, -0.720096f, -0.756779f, -0.745171f, -0.674094f, -0.580065f, -0.512363f, -0.485247f}, + {0.934518f, 0.857858f, 0.682018f, 0.418282f, 0.149886f, -0.022248f, -0.085705f, -0.132956f, -0.243348f, -0.384067f, -0.470420f, -0.490862f, -0.510507f, -0.564810f, -0.615008f, -0.613799f, -0.558408f, -0.464246f, -0.334644f, -0.179741f, -0.030327f, 0.091349f, 0.193272f, 0.290516f, 0.379280f, 0.447234f, 0.493298f, 0.523281f, 0.535766f, 0.522478f, 0.477212f, 0.399948f, 0.297897f, 0.184846f, 0.074020f, -0.029775f, -0.126981f, -0.213768f, -0.281234f, -0.323523f, -0.342095f, -0.342589f, -0.331435f, -0.314724f, -0.296652f, -0.278561f, -0.260507f, -0.242171f, -0.220746f, -0.189924f, -0.143224f, -0.078060f, 0.003244f, 0.094157f, 0.184987f, 0.265868f, 0.330948f, 0.379383f, 0.412093f, 0.428623f, 0.427005f, 0.404850f, 0.360089f, 0.292366f, 0.204920f, 0.104626f, -0.000261f, -0.102308f, -0.195788f, -0.277059f, -0.344399f, -0.396403f, -0.430000f, -0.440595f, -0.424427f, -0.380841f, -0.313172f, -0.228570f, -0.136582f, -0.046276f, 0.036288f, 0.108164f, 0.167991f, 0.215177f, 0.250068f, 0.273681f, 0.286922f, 0.290465f, 0.285187f, 0.272099f, 0.251841f, 0.224631f, 0.190554f, 0.149524f, 0.101233f, 0.045772f, + -0.015434f, -0.079411f, -0.142271f, -0.199904f, -0.248354f, -0.284186f, -0.304987f, -0.309598f, -0.297829f, -0.270211f, -0.228225f, -0.174500f, -0.112362f, -0.045271f, 0.023093f, 0.088668f, 0.147582f, 0.196800f, 0.233966f, 0.257190f, 0.265649f, 0.259970f, 0.241494f, 0.211697f, 0.172676f, 0.127321f, 0.078348f, 0.027873f, -0.021726f, -0.067568f, -0.107275f, -0.139243f, -0.161825f, -0.173602f, -0.174673f, -0.166498f, -0.150627f, -0.128782f, -0.103666f, -0.078044f, -0.053346f, -0.030259f, -0.009734f, 0.007887f, 0.023557f, 0.038115f, 0.051436f, 0.063720f, 0.075766f, 0.087264f, 0.096795f, 0.103721f, 0.107784f, 0.107330f, 0.100689f, 0.088113f, 0.069180f, 0.041288f, 0.006332f, -0.023956f, -0.037070f, -0.033441f, -0.024607f, -0.019448f} + }, + { + {0.934518f, 0.857858f, 0.682018f, 0.418282f, 0.149886f, -0.022248f, -0.085705f, -0.132956f, -0.243348f, -0.384067f, -0.470420f, -0.490862f, -0.510507f, -0.564810f, -0.615008f, -0.613799f, -0.558408f, -0.464246f, -0.334644f, -0.179741f, -0.030327f, 0.091349f, 0.193272f, 0.290516f, 0.379280f, 0.447234f, 0.493298f, 0.523281f, 0.535766f, 0.522478f, 0.477212f, 0.399948f, 0.297897f, 0.184846f, 0.074020f, -0.029775f, -0.126981f, -0.213768f, -0.281234f, -0.323523f, -0.342095f, -0.342589f, -0.331435f, -0.314724f, -0.296652f, -0.278561f, -0.260507f, -0.242171f, -0.220746f, -0.189924f, -0.143224f, -0.078060f, 0.003244f, 0.094157f, 0.184987f, 0.265868f, 0.330948f, 0.379383f, 0.412093f, 0.428623f, 0.427005f, 0.404850f, 0.360089f, 0.292366f, 0.204920f, 0.104626f, -0.000261f, -0.102308f, -0.195788f, -0.277059f, -0.344399f, -0.396403f, -0.430000f, -0.440595f, -0.424427f, -0.380841f, -0.313172f, -0.228570f, -0.136582f, -0.046276f, 0.036288f, 0.108164f, 0.167991f, 0.215177f, 0.250068f, 0.273681f, 0.286922f, 0.290465f, 0.285187f, 0.272099f, 0.251841f, 0.224631f, 0.190554f, 0.149524f, 0.101233f, 0.045772f, + -0.015434f, -0.079411f, -0.142271f, -0.199904f, -0.248354f, -0.284186f, -0.304987f, -0.309598f, -0.297829f, -0.270211f, -0.228225f, -0.174500f, -0.112362f, -0.045271f, 0.023093f, 0.088668f, 0.147582f, 0.196800f, 0.233966f, 0.257190f, 0.265649f, 0.259970f, 0.241494f, 0.211697f, 0.172676f, 0.127321f, 0.078348f, 0.027873f, -0.021726f, -0.067568f, -0.107275f, -0.139243f, -0.161825f, -0.173602f, -0.174673f, -0.166498f, -0.150627f, -0.128782f, -0.103666f, -0.078044f, -0.053346f, -0.030259f, -0.009734f, 0.007887f, 0.023557f, 0.038115f, 0.051436f, 0.063720f, 0.075766f, 0.087264f, 0.096795f, 0.103721f, 0.107784f, 0.107330f, 0.100689f, 0.088113f, 0.069180f, 0.041288f, 0.006332f, -0.023956f, -0.037070f, -0.033441f, -0.024607f, -0.019448f}, + {1.068324f, 1.062066f, 1.083672f, 1.156642f, 1.251383f, 1.301241f, 1.270195f, 1.189834f, 1.115171f, 1.063568f, 1.022919f, 1.001888f, 1.030552f, 1.110370f, 1.199864f, 1.259787f, 1.284625f, 1.280603f, 1.242659f, 1.171775f, 1.093479f, 1.036606f, 1.002891f, 0.972808f, 0.933548f, 0.887633f, 0.839967f, 0.790500f, 0.739167f, 0.688251f, 0.638192f, 0.586505f, 0.531813f, 0.475822f, 0.421676f, 0.373637f, 0.338297f, 0.322536f, 0.328305f, 0.350663f, 0.382129f, 0.417959f, 0.456126f, 0.493831f, 0.526907f, 0.552956f, 0.572952f, 0.589166f, 0.603191f, 0.616479f, 0.631032f, 0.648516f, 0.669363f, 0.692743f, 0.716446f, 0.737125f, 0.751798f, 0.758883f, 0.757319f, 0.746131f, 0.726128f, 0.700462f, 0.671814f, 0.640056f, 0.603849f, 0.562908f, 0.517307f, 0.466388f, 0.410454f, 0.352646f, 0.297752f, 0.249844f, 0.211692f, 0.185011f, 0.169810f, 0.163886f, 0.163694f, 0.165778f, 0.167776f, 0.168909f, 0.169698f, 0.170965f, 0.173362f, 0.177738f, 0.185104f, 0.195926f, 0.210178f, 0.228154f, 0.250538f, 0.277725f, 0.309833f, 0.347232f, 0.390456f, 0.439791f, 0.495196f, 0.555920f, + 0.619949f, 0.684571f, 0.747409f, 0.805924f, 0.856574f, 0.896391f, 0.925191f, 0.944416f, 0.954283f, 0.954087f, 0.944612f, 0.927526f, 0.902506f, 0.867475f, 0.821809f, 0.767132f, 0.704886f, 0.635309f, 0.559349f, 0.479847f, 0.399919f, 0.321030f, 0.243461f, 0.168221f, 0.097457f, 0.032552f, -0.027272f, -0.083379f, -0.135625f, -0.183518f, -0.228709f, -0.273886f, -0.319427f, -0.363620f, -0.405822f, -0.446545f, -0.484543f, -0.516852f, -0.541980f, -0.560664f, -0.573598f, -0.580683f, -0.582341f, -0.579795f, -0.574373f, -0.567446f, -0.560136f, -0.552846f, -0.546452f, -0.543218f, -0.544596f, -0.549853f, -0.559220f, -0.575373f, -0.599427f, -0.630547f, -0.671011f, -0.720096f, -0.756779f, -0.745171f, -0.674094f, -0.580065f, -0.512363f, -0.485247f} + } +}; +const float CRendBin_Combined_HRIR_coeff_im_32kHz[15][BINAURAL_CHANNELS][160]={ + { + {0.022597f, 0.065202f, 0.094800f, 0.087222f, 0.028863f, -0.033215f, -0.025115f, 0.029670f, 0.010871f, -0.094080f, -0.093395f, 0.164837f, 0.534054f, 0.723953f, 0.668586f, 0.562550f, 0.547018f, 0.547467f, 0.451265f, 0.273050f, 0.076100f, -0.133607f, -0.347652f, -0.484095f, -0.465506f, -0.320173f, -0.144456f, 0.002459f, 0.124086f, 0.236901f, 0.334318f, 0.388275f, 0.365496f, 0.251083f, 0.066984f, -0.139501f, -0.329262f, -0.490031f, -0.628003f, -0.750861f, -0.856460f, -0.932287f, -0.968749f, -0.973950f, -0.969671f, -0.973735f, -0.992918f, -1.028350f, -1.076088f, -1.123879f, -1.158091f, -1.174678f, -1.178288f, -1.174093f, -1.165759f, -1.157129f, -1.151037f, -1.149567f, -1.156736f, -1.175982f, -1.205151f, -1.239655f, -1.278806f, -1.322162f, -1.361620f, -1.384066f, -1.380279f, -1.346908f, -1.284430f, -1.199139f, -1.103249f, -1.007963f, -0.918939f, -0.839828f, -0.774659f, -0.724527f, -0.686467f, -0.656634f, -0.631187f, -0.605488f, -0.576739f, -0.545772f, -0.513340f, -0.478002f, -0.440201f, -0.403792f, -0.371197f, -0.342018f, -0.317969f, -0.303696f, -0.301471f, -0.309948f, -0.328028f, -0.355049f, -0.388060f, -0.423148f, + -0.457901f, -0.489672f, -0.514648f, -0.531085f, -0.539738f, -0.540079f, -0.530837f, -0.514091f, -0.493133f, -0.467135f, -0.433667f, -0.394405f, -0.352537f, -0.307676f, -0.258996f, -0.209516f, -0.162264f, -0.116664f, -0.072404f, -0.031550f, 0.005591f, 0.040704f, 0.072658f, 0.098740f, 0.119709f, 0.136856f, 0.146623f, 0.145056f, 0.133481f, 0.112977f, 0.078684f, 0.025978f, -0.044059f, -0.130730f, -0.238118f, -0.369115f, -0.521997f, -0.694951f, -0.886933f, -1.093940f, -1.310375f, -1.531202f, -1.748254f, -1.951169f, -2.135588f, -2.301024f, -2.440136f, -2.544008f, -2.616201f, -2.664228f, -2.682466f, -2.663745f, -2.617014f, -2.550432f, -2.454397f, -2.322601f, -2.151953f, -1.890105f, -1.449852f, -0.850895f, -0.291398f, 0.021597f, 0.081084f, 0.031473f}, + {-0.080276f, -0.311417f, -0.607640f, -0.791927f, -0.800857f, -0.760608f, -0.739148f, -0.646209f, -0.447092f, -0.280447f, -0.279295f, -0.423068f, -0.622336f, -0.804161f, -0.867594f, -0.710767f, -0.374205f, -0.036779f, 0.187292f, 0.339906f, 0.474434f, 0.550962f, 0.537943f, 0.503393f, 0.524522f, 0.587272f, 0.644960f, 0.705979f, 0.790728f, 0.855477f, 0.834725f, 0.730307f, 0.593843f, 0.437574f, 0.224869f, -0.047825f, -0.311841f, -0.490861f, -0.575373f, -0.611964f, -0.639917f, -0.664189f, -0.679158f, -0.686945f, -0.685661f, -0.661531f, -0.605064f, -0.523507f, -0.428999f, -0.324606f, -0.209719f, -0.090298f, 0.024311f, 0.128844f, 0.221046f, 0.298789f, 0.362618f, 0.416158f, 0.460462f, 0.491627f, 0.505331f, 0.499605f, 0.472944f, 0.425203f, 0.361839f, 0.292961f, 0.226591f, 0.165529f, 0.110752f, 0.064158f, 0.026873f, -0.002586f, -0.027283f, -0.050301f, -0.074568f, -0.102794f, -0.136426f, -0.174543f, -0.213824f, -0.249920f, -0.279603f, -0.302272f, -0.319692f, -0.334393f, -0.347809f, -0.358600f, -0.361817f, -0.350205f, -0.317616f, -0.261906f, -0.185247f, -0.092969f, 0.007045f, 0.104879f, 0.190432f, 0.255872f, + 0.297100f, 0.314390f, 0.312581f, 0.299610f, 0.283349f, 0.269653f, 0.262979f, 0.266740f, 0.281862f, 0.306365f, 0.337110f, 0.369991f, 0.397544f, 0.408784f, 0.393056f, 0.342920f, 0.253936f, 0.125604f, -0.035892f, -0.218368f, -0.407961f, -0.590892f, -0.752239f, -0.877499f, -0.956409f, -0.982915f, -0.952586f, -0.863813f, -0.720987f, -0.533454f, -0.312498f, -0.071910f, 0.171049f, 0.399293f, 0.599797f, 0.762809f, 0.880702f, 0.950183f, 0.972884f, 0.951927f, 0.890214f, 0.792224f, 0.663786f, 0.509824f, 0.335460f, 0.148522f, -0.042097f, -0.228597f, -0.401857f, -0.550339f, -0.664707f, -0.739759f, -0.770184f, -0.751394f, -0.686776f, -0.584706f, -0.445967f, -0.269185f, -0.078301f, 0.070423f, 0.128885f, 0.103757f, 0.049358f, 0.011607f} + }, + { + {-0.080276f, -0.311417f, -0.607640f, -0.791927f, -0.800857f, -0.760608f, -0.739148f, -0.646209f, -0.447092f, -0.280447f, -0.279295f, -0.423068f, -0.622336f, -0.804161f, -0.867594f, -0.710767f, -0.374205f, -0.036779f, 0.187292f, 0.339906f, 0.474434f, 0.550962f, 0.537943f, 0.503393f, 0.524522f, 0.587272f, 0.644960f, 0.705979f, 0.790728f, 0.855477f, 0.834725f, 0.730307f, 0.593843f, 0.437574f, 0.224869f, -0.047825f, -0.311841f, -0.490861f, -0.575373f, -0.611964f, -0.639917f, -0.664189f, -0.679158f, -0.686945f, -0.685661f, -0.661531f, -0.605064f, -0.523507f, -0.428999f, -0.324606f, -0.209719f, -0.090298f, 0.024311f, 0.128844f, 0.221046f, 0.298789f, 0.362618f, 0.416158f, 0.460462f, 0.491627f, 0.505331f, 0.499605f, 0.472944f, 0.425203f, 0.361839f, 0.292961f, 0.226591f, 0.165529f, 0.110752f, 0.064158f, 0.026873f, -0.002586f, -0.027283f, -0.050301f, -0.074568f, -0.102794f, -0.136426f, -0.174543f, -0.213824f, -0.249920f, -0.279603f, -0.302272f, -0.319692f, -0.334393f, -0.347809f, -0.358600f, -0.361817f, -0.350205f, -0.317616f, -0.261906f, -0.185247f, -0.092969f, 0.007045f, 0.104879f, 0.190432f, 0.255872f, + 0.297100f, 0.314390f, 0.312581f, 0.299610f, 0.283349f, 0.269653f, 0.262979f, 0.266740f, 0.281862f, 0.306365f, 0.337110f, 0.369991f, 0.397544f, 0.408784f, 0.393056f, 0.342920f, 0.253936f, 0.125604f, -0.035892f, -0.218368f, -0.407961f, -0.590892f, -0.752239f, -0.877499f, -0.956409f, -0.982915f, -0.952586f, -0.863813f, -0.720987f, -0.533454f, -0.312498f, -0.071910f, 0.171049f, 0.399293f, 0.599797f, 0.762809f, 0.880702f, 0.950183f, 0.972884f, 0.951927f, 0.890214f, 0.792224f, 0.663786f, 0.509824f, 0.335460f, 0.148522f, -0.042097f, -0.228597f, -0.401857f, -0.550339f, -0.664707f, -0.739759f, -0.770184f, -0.751394f, -0.686776f, -0.584706f, -0.445967f, -0.269185f, -0.078301f, 0.070423f, 0.128885f, 0.103757f, 0.049358f, 0.011607f}, + {0.022597f, 0.065202f, 0.094800f, 0.087222f, 0.028863f, -0.033215f, -0.025115f, 0.029670f, 0.010871f, -0.094080f, -0.093395f, 0.164837f, 0.534054f, 0.723953f, 0.668586f, 0.562550f, 0.547018f, 0.547467f, 0.451265f, 0.273050f, 0.076100f, -0.133607f, -0.347652f, -0.484095f, -0.465506f, -0.320173f, -0.144456f, 0.002459f, 0.124086f, 0.236901f, 0.334318f, 0.388275f, 0.365496f, 0.251083f, 0.066984f, -0.139501f, -0.329262f, -0.490031f, -0.628003f, -0.750861f, -0.856460f, -0.932287f, -0.968749f, -0.973950f, -0.969671f, -0.973735f, -0.992918f, -1.028350f, -1.076088f, -1.123879f, -1.158091f, -1.174678f, -1.178288f, -1.174093f, -1.165759f, -1.157129f, -1.151037f, -1.149567f, -1.156736f, -1.175982f, -1.205151f, -1.239655f, -1.278806f, -1.322162f, -1.361620f, -1.384066f, -1.380279f, -1.346908f, -1.284430f, -1.199139f, -1.103249f, -1.007963f, -0.918939f, -0.839828f, -0.774659f, -0.724527f, -0.686467f, -0.656634f, -0.631187f, -0.605488f, -0.576739f, -0.545772f, -0.513340f, -0.478002f, -0.440201f, -0.403792f, -0.371197f, -0.342018f, -0.317969f, -0.303696f, -0.301471f, -0.309948f, -0.328028f, -0.355049f, -0.388060f, -0.423148f, + -0.457901f, -0.489672f, -0.514648f, -0.531085f, -0.539738f, -0.540079f, -0.530837f, -0.514091f, -0.493133f, -0.467135f, -0.433667f, -0.394405f, -0.352537f, -0.307676f, -0.258996f, -0.209516f, -0.162264f, -0.116664f, -0.072404f, -0.031550f, 0.005591f, 0.040704f, 0.072658f, 0.098740f, 0.119709f, 0.136856f, 0.146623f, 0.145056f, 0.133481f, 0.112977f, 0.078684f, 0.025978f, -0.044059f, -0.130730f, -0.238118f, -0.369115f, -0.521997f, -0.694951f, -0.886933f, -1.093940f, -1.310375f, -1.531202f, -1.748254f, -1.951169f, -2.135588f, -2.301024f, -2.440136f, -2.544008f, -2.616201f, -2.664228f, -2.682466f, -2.663745f, -2.617014f, -2.550432f, -2.454397f, -2.322601f, -2.151953f, -1.890105f, -1.449852f, -0.850895f, -0.291398f, 0.021597f, 0.081084f, 0.031473f} + }, + { + {0.021336f, 0.022839f, -0.073302f, -0.217195f, -0.247984f, -0.104075f, 0.014239f, -0.112545f, -0.344615f, -0.293672f, 0.139315f, 0.578646f, 0.643404f, 0.405511f, 0.222872f, 0.260763f, 0.361987f, 0.319901f, 0.107580f, -0.158487f, -0.355870f, -0.427989f, -0.389853f, -0.297927f, -0.198578f, -0.103336f, -0.016535f, 0.036571f, 0.024244f, -0.066294f, -0.225146f, -0.422394f, -0.612111f, -0.757578f, -0.858245f, -0.933908f, -0.983839f, -0.983826f, -0.924185f, -0.829851f, -0.740362f, -0.685366f, -0.677873f, -0.713138f, -0.770012f, -0.824820f, -0.868218f, -0.904879f, -0.939349f, -0.967949f, -0.983081f, -0.981192f, -0.966416f, -0.947112f, -0.928422f, -0.909876f, -0.890814f, -0.873490f, -0.857977f, -0.838957f, -0.811865f, -0.778815f, -0.745042f, -0.712396f, -0.678987f, -0.642950f, -0.604773f, -0.567091f, -0.532266f, -0.499479f, -0.465735f, -0.430492f, -0.396831f, -0.367428f, -0.342441f, -0.321661f, -0.305164f, -0.291646f, -0.279605f, -0.269981f, -0.264614f, -0.263048f, -0.263497f, -0.265405f, -0.268988f, -0.274537f, -0.283634f, -0.298307f, -0.318291f, -0.342181f, -0.370706f, -0.404808f, -0.441384f, -0.474914f, -0.501713f, -0.518854f, + -0.521982f, -0.508767f, -0.481950f, -0.445493f, -0.400843f, -0.349459f, -0.294957f, -0.240473f, -0.187566f, -0.138571f, -0.096275f, -0.061952f, -0.037779f, -0.029269f, -0.041199f, -0.074110f, -0.128361f, -0.206759f, -0.309186f, -0.430094f, -0.565083f, -0.714033f, -0.874899f, -1.041263f, -1.208909f, -1.378424f, -1.549363f, -1.717858f, -1.880821f, -2.037000f, -2.183716f, -2.316614f, -2.431612f, -2.525085f, -2.595175f, -2.643617f, -2.672077f, -2.678363f, -2.662123f, -2.630131f, -2.587965f, -2.532325f, -2.460515f, -2.378974f, -2.291916f, -2.192016f, -2.073566f, -1.942343f, -1.801293f, -1.641629f, -1.459200f, -1.262257f, -1.053445f, -0.825148f, -0.579571f, -0.325028f, -0.046466f, 0.276154f, 0.595944f, 0.788105f, 0.756992f, 0.541774f, 0.282133f, 0.080550f}, + {0.021336f, 0.022839f, -0.073302f, -0.217195f, -0.247984f, -0.104075f, 0.014239f, -0.112545f, -0.344615f, -0.293672f, 0.139315f, 0.578646f, 0.643404f, 0.405511f, 0.222872f, 0.260763f, 0.361987f, 0.319901f, 0.107580f, -0.158487f, -0.355870f, -0.427989f, -0.389853f, -0.297927f, -0.198578f, -0.103336f, -0.016535f, 0.036571f, 0.024244f, -0.066294f, -0.225146f, -0.422394f, -0.612111f, -0.757578f, -0.858245f, -0.933908f, -0.983839f, -0.983826f, -0.924185f, -0.829851f, -0.740362f, -0.685366f, -0.677873f, -0.713138f, -0.770012f, -0.824820f, -0.868218f, -0.904879f, -0.939349f, -0.967949f, -0.983081f, -0.981192f, -0.966416f, -0.947112f, -0.928422f, -0.909876f, -0.890814f, -0.873490f, -0.857977f, -0.838957f, -0.811865f, -0.778815f, -0.745042f, -0.712396f, -0.678987f, -0.642950f, -0.604773f, -0.567091f, -0.532266f, -0.499479f, -0.465735f, -0.430492f, -0.396831f, -0.367428f, -0.342441f, -0.321661f, -0.305164f, -0.291646f, -0.279605f, -0.269981f, -0.264614f, -0.263048f, -0.263497f, -0.265405f, -0.268988f, -0.274537f, -0.283634f, -0.298307f, -0.318291f, -0.342181f, -0.370706f, -0.404808f, -0.441384f, -0.474914f, -0.501713f, -0.518854f, + -0.521982f, -0.508767f, -0.481950f, -0.445493f, -0.400843f, -0.349459f, -0.294957f, -0.240473f, -0.187566f, -0.138571f, -0.096275f, -0.061952f, -0.037779f, -0.029269f, -0.041199f, -0.074110f, -0.128361f, -0.206759f, -0.309186f, -0.430094f, -0.565083f, -0.714033f, -0.874899f, -1.041263f, -1.208909f, -1.378424f, -1.549363f, -1.717858f, -1.880821f, -2.037000f, -2.183716f, -2.316614f, -2.431612f, -2.525085f, -2.595175f, -2.643617f, -2.672077f, -2.678363f, -2.662123f, -2.630131f, -2.587965f, -2.532325f, -2.460515f, -2.378974f, -2.291916f, -2.192016f, -2.073566f, -1.942343f, -1.801293f, -1.641629f, -1.459200f, -1.262257f, -1.053445f, -0.825148f, -0.579571f, -0.325028f, -0.046466f, 0.276154f, 0.595944f, 0.788105f, 0.756992f, 0.541774f, 0.282133f, 0.080550f} + }, + { + {0.012018f, 0.066586f, 0.152639f, 0.207071f, 0.209717f, 0.178456f, 0.085121f, -0.092155f, -0.264863f, -0.327430f, -0.327666f, -0.395977f, -0.530744f, -0.609862f, -0.598708f, -0.587572f, -0.623204f, -0.652992f, -0.647573f, -0.644111f, -0.649663f, -0.617816f, -0.540898f, -0.469537f, -0.429175f, -0.400620f, -0.385308f, -0.408445f, -0.453223f, -0.464516f, -0.424417f, -0.365930f, -0.311545f, -0.251073f, -0.180010f, -0.112919f, -0.056366f, -0.004630f, 0.037141f, 0.053534f, 0.041699f, 0.013687f, -0.019541f, -0.051027f, -0.071574f, -0.074580f, -0.063254f, -0.045955f, -0.030239f, -0.025174f, -0.041237f, -0.083221f, -0.147899f, -0.228711f, -0.317157f, -0.401610f, -0.472141f, -0.526510f, -0.567243f, -0.595153f, -0.609617f, -0.611851f, -0.603354f, -0.583289f, -0.550511f, -0.506187f, -0.452584f, -0.391616f, -0.325856f, -0.258757f, -0.192849f, -0.129124f, -0.068038f, -0.009425f, 0.048121f, 0.106115f, 0.164670f, 0.223043f, 0.280807f, 0.337215f, 0.389845f, 0.434804f, 0.468298f, 0.487689f, 0.490882f, 0.474753f, 0.434821f, 0.367002f, 0.268928f, 0.138992f, -0.023741f, -0.216176f, -0.429032f, -0.650898f, -0.873502f, -1.090516f, + -1.293455f, -1.473572f, -1.627329f, -1.755674f, -1.858280f, -1.933078f, -1.981344f, -2.007913f, -2.014974f, -1.999942f, -1.960994f, -1.900865f, -1.823692f, -1.732040f, -1.629346f, -1.522206f, -1.417380f, -1.317914f, -1.223887f, -1.135589f, -1.054380f, -0.981265f, -0.916122f, -0.858499f, -0.808619f, -0.767042f, -0.733071f, -0.704146f, -0.677737f, -0.653344f, -0.631604f, -0.612382f, -0.595471f, -0.582461f, -0.575952f, -0.577320f, -0.586697f, -0.604312f, -0.630361f, -0.664275f, -0.705000f, -0.751057f, -0.800298f, -0.851098f, -0.903010f, -0.954211f, -0.999996f, -1.036419f, -1.062657f, -1.076833f, -1.073963f, -1.051969f, -1.014117f, -0.961872f, -0.892965f, -0.807931f, -0.703595f, -0.557881f, -0.349467f, -0.110075f, 0.071803f, 0.131434f, 0.094014f, 0.030195f}, + {-0.169676f, -0.479045f, -0.687725f, -0.745490f, -0.686566f, -0.594240f, -0.494282f, -0.350297f, -0.167225f, -0.017915f, 0.055446f, 0.093690f, 0.144892f, 0.201511f, 0.248867f, 0.316763f, 0.432409f, 0.556198f, 0.607835f, 0.540635f, 0.367708f, 0.137640f, -0.092179f, -0.276530f, -0.400339f, -0.471378f, -0.492192f, -0.455690f, -0.371267f, -0.272288f, -0.186910f, -0.117137f, -0.053329f, 0.007761f, 0.067846f, 0.134100f, 0.208892f, 0.279839f, 0.327334f, 0.337226f, 0.304345f, 0.232251f, 0.134706f, 0.032552f, -0.055175f, -0.116728f, -0.147122f, -0.148098f, -0.129145f, -0.103722f, -0.081991f, -0.067689f, -0.060332f, -0.057605f, -0.056281f, -0.053648f, -0.048905f, -0.042789f, -0.036484f, -0.031173f, -0.027357f, -0.023751f, -0.017402f, -0.004993f, 0.016436f, 0.049010f, 0.092097f, 0.140251f, 0.183980f, 0.213061f, 0.219488f, 0.199132f, 0.152883f, 0.086666f, 0.009291f, -0.070535f, -0.145803f, -0.211193f, -0.262456f, -0.295515f, -0.305654f, -0.287987f, -0.239522f, -0.161484f, -0.060555f, 0.051276f, 0.158521f, 0.245765f, 0.301610f, 0.320874f, 0.304470f, 0.258046f, 0.190303f, 0.111202f, 0.030420f, -0.043586f, + -0.104149f, -0.146895f, -0.170006f, -0.174138f, -0.162254f, -0.139224f, -0.110752f, -0.081894f, -0.056123f, -0.035216f, -0.019427f, -0.007720f, 0.001684f, 0.010659f, 0.020891f, 0.033788f, 0.050134f, 0.069595f, 0.090510f, 0.110004f, 0.124360f, 0.129820f, 0.123661f, 0.104987f, 0.074856f, 0.035992f, -0.007782f, -0.052315f, -0.093778f, -0.128870f, -0.154804f, -0.169387f, -0.171057f, -0.158834f, -0.132551f, -0.093363f, -0.044033f, 0.011189f, 0.066780f, 0.116375f, 0.153882f, 0.174846f, 0.177241f, 0.161682f, 0.131436f, 0.091780f, 0.048485f, 0.006475f, -0.030495f, -0.059949f, -0.081115f, -0.094605f, -0.101136f, -0.101084f, -0.095319f, -0.084867f, -0.069049f, -0.046151f, -0.018205f, 0.006293f, 0.017960f, 0.015621f, 0.007434f, 0.001653f} + }, + { + {-0.169676f, -0.479045f, -0.687725f, -0.745490f, -0.686566f, -0.594240f, -0.494282f, -0.350297f, -0.167225f, -0.017915f, 0.055446f, 0.093690f, 0.144892f, 0.201511f, 0.248867f, 0.316763f, 0.432409f, 0.556198f, 0.607835f, 0.540635f, 0.367708f, 0.137640f, -0.092179f, -0.276530f, -0.400339f, -0.471378f, -0.492192f, -0.455690f, -0.371267f, -0.272288f, -0.186910f, -0.117137f, -0.053329f, 0.007761f, 0.067846f, 0.134100f, 0.208892f, 0.279839f, 0.327334f, 0.337226f, 0.304345f, 0.232251f, 0.134706f, 0.032552f, -0.055175f, -0.116728f, -0.147122f, -0.148098f, -0.129145f, -0.103722f, -0.081991f, -0.067689f, -0.060332f, -0.057605f, -0.056281f, -0.053648f, -0.048905f, -0.042789f, -0.036484f, -0.031173f, -0.027357f, -0.023751f, -0.017402f, -0.004993f, 0.016436f, 0.049010f, 0.092097f, 0.140251f, 0.183980f, 0.213061f, 0.219488f, 0.199132f, 0.152883f, 0.086666f, 0.009291f, -0.070535f, -0.145803f, -0.211193f, -0.262456f, -0.295515f, -0.305654f, -0.287987f, -0.239522f, -0.161484f, -0.060555f, 0.051276f, 0.158521f, 0.245765f, 0.301610f, 0.320874f, 0.304470f, 0.258046f, 0.190303f, 0.111202f, 0.030420f, -0.043586f, + -0.104149f, -0.146895f, -0.170006f, -0.174138f, -0.162254f, -0.139224f, -0.110752f, -0.081894f, -0.056123f, -0.035216f, -0.019427f, -0.007720f, 0.001684f, 0.010659f, 0.020891f, 0.033788f, 0.050134f, 0.069595f, 0.090510f, 0.110004f, 0.124360f, 0.129820f, 0.123661f, 0.104987f, 0.074856f, 0.035992f, -0.007782f, -0.052315f, -0.093778f, -0.128870f, -0.154804f, -0.169387f, -0.171057f, -0.158834f, -0.132551f, -0.093363f, -0.044033f, 0.011189f, 0.066780f, 0.116375f, 0.153882f, 0.174846f, 0.177241f, 0.161682f, 0.131436f, 0.091780f, 0.048485f, 0.006475f, -0.030495f, -0.059949f, -0.081115f, -0.094605f, -0.101136f, -0.101084f, -0.095319f, -0.084867f, -0.069049f, -0.046151f, -0.018205f, 0.006293f, 0.017960f, 0.015621f, 0.007434f, 0.001653f}, + {0.012018f, 0.066586f, 0.152639f, 0.207071f, 0.209717f, 0.178456f, 0.085121f, -0.092155f, -0.264863f, -0.327430f, -0.327666f, -0.395977f, -0.530744f, -0.609862f, -0.598708f, -0.587572f, -0.623204f, -0.652992f, -0.647573f, -0.644111f, -0.649663f, -0.617816f, -0.540898f, -0.469537f, -0.429175f, -0.400620f, -0.385308f, -0.408445f, -0.453223f, -0.464516f, -0.424417f, -0.365930f, -0.311545f, -0.251073f, -0.180010f, -0.112919f, -0.056366f, -0.004630f, 0.037141f, 0.053534f, 0.041699f, 0.013687f, -0.019541f, -0.051027f, -0.071574f, -0.074580f, -0.063254f, -0.045955f, -0.030239f, -0.025174f, -0.041237f, -0.083221f, -0.147899f, -0.228711f, -0.317157f, -0.401610f, -0.472141f, -0.526510f, -0.567243f, -0.595153f, -0.609617f, -0.611851f, -0.603354f, -0.583289f, -0.550511f, -0.506187f, -0.452584f, -0.391616f, -0.325856f, -0.258757f, -0.192849f, -0.129124f, -0.068038f, -0.009425f, 0.048121f, 0.106115f, 0.164670f, 0.223043f, 0.280807f, 0.337215f, 0.389845f, 0.434804f, 0.468298f, 0.487689f, 0.490882f, 0.474753f, 0.434821f, 0.367002f, 0.268928f, 0.138992f, -0.023741f, -0.216176f, -0.429032f, -0.650898f, -0.873502f, -1.090516f, + -1.293455f, -1.473572f, -1.627329f, -1.755674f, -1.858280f, -1.933078f, -1.981344f, -2.007913f, -2.014974f, -1.999942f, -1.960994f, -1.900865f, -1.823692f, -1.732040f, -1.629346f, -1.522206f, -1.417380f, -1.317914f, -1.223887f, -1.135589f, -1.054380f, -0.981265f, -0.916122f, -0.858499f, -0.808619f, -0.767042f, -0.733071f, -0.704146f, -0.677737f, -0.653344f, -0.631604f, -0.612382f, -0.595471f, -0.582461f, -0.575952f, -0.577320f, -0.586697f, -0.604312f, -0.630361f, -0.664275f, -0.705000f, -0.751057f, -0.800298f, -0.851098f, -0.903010f, -0.954211f, -0.999996f, -1.036419f, -1.062657f, -1.076833f, -1.073963f, -1.051969f, -1.014117f, -0.961872f, -0.892965f, -0.807931f, -0.703595f, -0.557881f, -0.349467f, -0.110075f, 0.071803f, 0.131434f, 0.094014f, 0.030195f} + }, + { + {0.014752f, 0.080926f, 0.195425f, 0.277300f, 0.257363f, 0.156308f, 0.028839f, -0.113396f, -0.267755f, -0.377434f, -0.386960f, -0.342896f, -0.348502f, -0.414148f, -0.444149f, -0.392144f, -0.334551f, -0.346055f, -0.388264f, -0.385314f, -0.342243f, -0.315364f, -0.312098f, -0.294136f, -0.253677f, -0.220820f, -0.205998f, -0.186961f, -0.150236f, -0.108165f, -0.075965f, -0.057714f, -0.051787f, -0.050962f, -0.041140f, -0.013561f, 0.025666f, 0.064669f, 0.096591f, 0.117146f, 0.121878f, 0.111088f, 0.089713f, 0.059784f, 0.020022f, -0.026868f, -0.073943f, -0.117183f, -0.157438f, -0.196739f, -0.237459f, -0.283107f, -0.335948f, -0.395266f, -0.459191f, -0.525388f, -0.589979f, -0.649670f, -0.704454f, -0.754602f, -0.796966f, -0.828420f, -0.850237f, -0.864670f, -0.870324f, -0.865150f, -0.850447f, -0.827593f, -0.794208f, -0.747439f, -0.688089f, -0.618815f, -0.541545f, -0.458906f, -0.375037f, -0.293293f, -0.215404f, -0.143040f, -0.077588f, -0.019000f, 0.032484f, 0.074585f, 0.105344f, 0.125342f, 0.134906f, 0.131058f, 0.109800f, 0.069531f, 0.009669f, -0.072345f, -0.179941f, -0.313863f, -0.471475f, -0.649282f, -0.844479f, -1.053119f, + -1.267745f, -1.479091f, -1.680773f, -1.869994f, -2.042752f, -2.192065f, -2.313426f, -2.408035f, -2.477146f, -2.517248f, -2.525139f, -2.503743f, -2.457948f, -2.388501f, -2.295477f, -2.184628f, -2.064830f, -1.941431f, -1.816649f, -1.694232f, -1.579181f, -1.473891f, -1.377781f, -1.290140f, -1.211493f, -1.142683f, -1.083511f, -1.032207f, -0.986607f, -0.945898f, -0.909860f, -0.876620f, -0.843723f, -0.811646f, -0.783525f, -0.761406f, -0.745602f, -0.737373f, -0.739078f, -0.751862f, -0.775439f, -0.809243f, -0.852230f, -0.903080f, -0.961061f, -1.024309f, -1.088143f, -1.148390f, -1.204010f, -1.252283f, -1.285794f, -1.299183f, -1.292421f, -1.262728f, -1.203108f, -1.111036f, -0.979245f, -0.776277f, -0.476453f, -0.132899f, 0.122319f, 0.197804f, 0.136024f, 0.042576f}, + {-0.227014f, -0.610850f, -0.818539f, -0.827111f, -0.686892f, -0.457083f, -0.160737f, 0.181068f, 0.492015f, 0.663276f, 0.645507f, 0.491632f, 0.296608f, 0.115861f, -0.045963f, -0.190352f, -0.298137f, -0.347915f, -0.342680f, -0.305031f, -0.248092f, -0.163336f, -0.044330f, 0.087170f, 0.193410f, 0.255410f, 0.280175f, 0.274955f, 0.233799f, 0.155072f, 0.055541f, -0.042288f, -0.126009f, -0.190037f, -0.227316f, -0.232179f, -0.205012f, -0.149836f, -0.073712f, 0.009179f, 0.080908f, 0.131368f, 0.161850f, 0.176172f, 0.173910f, 0.153080f, 0.113644f, 0.057229f, -0.011649f, -0.082819f, -0.142538f, -0.179500f, -0.187713f, -0.166032f, -0.118858f, -0.056688f, 0.007437f, 0.063054f, 0.104150f, 0.128571f, 0.137667f, 0.134993f, 0.123166f, 0.101911f, 0.069333f, 0.024214f, -0.032551f, -0.096504f, -0.158282f, -0.204364f, -0.220307f, -0.195023f, -0.125423f, -0.020573f, 0.097777f, 0.200718f, 0.261787f, 0.265935f, 0.214220f, 0.122551f, 0.014966f, -0.085028f, -0.160356f, -0.201834f, -0.207055f, -0.178791f, -0.123669f, -0.051497f, 0.025035f, 0.091764f, 0.136407f, 0.152155f, 0.139214f, 0.103923f, 0.056479f, 0.007941f, + -0.032731f, -0.060404f, -0.073774f, -0.074412f, -0.065640f, -0.051337f, -0.034892f, -0.018694f, -0.004139f, 0.008287f, 0.018799f, 0.027833f, 0.035535f, 0.041544f, 0.044915f, 0.044175f, 0.037797f, 0.025105f, 0.006966f, -0.014167f, -0.034676f, -0.050526f, -0.058290f, -0.056172f, -0.044497f, -0.025572f, -0.003149f, 0.018446f, 0.035422f, 0.045432f, 0.047837f, 0.043411f, 0.033825f, 0.021117f, 0.007200f, -0.006372f, -0.018366f, -0.027745f, -0.033669f, -0.035551f, -0.033093f, -0.026384f, -0.016086f, -0.003488f, 0.009653f, 0.021402f, 0.029923f, 0.033831f, 0.032600f, 0.026745f, 0.017574f, 0.006768f, -0.003896f, -0.012818f, -0.019007f, -0.022208f, -0.022305f, -0.018895f, -0.012232f, -0.004535f, 0.000825f, 0.002230f, 0.001220f, 0.000243f} + }, + { + {-0.227014f, -0.610850f, -0.818539f, -0.827111f, -0.686892f, -0.457083f, -0.160737f, 0.181068f, 0.492015f, 0.663276f, 0.645507f, 0.491632f, 0.296608f, 0.115861f, -0.045963f, -0.190352f, -0.298137f, -0.347915f, -0.342680f, -0.305031f, -0.248092f, -0.163336f, -0.044330f, 0.087170f, 0.193410f, 0.255410f, 0.280175f, 0.274955f, 0.233799f, 0.155072f, 0.055541f, -0.042288f, -0.126009f, -0.190037f, -0.227316f, -0.232179f, -0.205012f, -0.149836f, -0.073712f, 0.009179f, 0.080908f, 0.131368f, 0.161850f, 0.176172f, 0.173910f, 0.153080f, 0.113644f, 0.057229f, -0.011649f, -0.082819f, -0.142538f, -0.179500f, -0.187713f, -0.166032f, -0.118858f, -0.056688f, 0.007437f, 0.063054f, 0.104150f, 0.128571f, 0.137667f, 0.134993f, 0.123166f, 0.101911f, 0.069333f, 0.024214f, -0.032551f, -0.096504f, -0.158282f, -0.204364f, -0.220307f, -0.195023f, -0.125423f, -0.020573f, 0.097777f, 0.200718f, 0.261787f, 0.265935f, 0.214220f, 0.122551f, 0.014966f, -0.085028f, -0.160356f, -0.201834f, -0.207055f, -0.178791f, -0.123669f, -0.051497f, 0.025035f, 0.091764f, 0.136407f, 0.152155f, 0.139214f, 0.103923f, 0.056479f, 0.007941f, + -0.032731f, -0.060404f, -0.073774f, -0.074412f, -0.065640f, -0.051337f, -0.034892f, -0.018694f, -0.004139f, 0.008287f, 0.018799f, 0.027833f, 0.035535f, 0.041544f, 0.044915f, 0.044175f, 0.037797f, 0.025105f, 0.006966f, -0.014167f, -0.034676f, -0.050526f, -0.058290f, -0.056172f, -0.044497f, -0.025572f, -0.003149f, 0.018446f, 0.035422f, 0.045432f, 0.047837f, 0.043411f, 0.033825f, 0.021117f, 0.007200f, -0.006372f, -0.018366f, -0.027745f, -0.033669f, -0.035551f, -0.033093f, -0.026384f, -0.016086f, -0.003488f, 0.009653f, 0.021402f, 0.029923f, 0.033831f, 0.032600f, 0.026745f, 0.017574f, 0.006768f, -0.003896f, -0.012818f, -0.019007f, -0.022208f, -0.022305f, -0.018895f, -0.012232f, -0.004535f, 0.000825f, 0.002230f, 0.001220f, 0.000243f}, + {0.014752f, 0.080926f, 0.195425f, 0.277300f, 0.257363f, 0.156308f, 0.028839f, -0.113396f, -0.267755f, -0.377434f, -0.386960f, -0.342896f, -0.348502f, -0.414148f, -0.444149f, -0.392144f, -0.334551f, -0.346055f, -0.388264f, -0.385314f, -0.342243f, -0.315364f, -0.312098f, -0.294136f, -0.253677f, -0.220820f, -0.205998f, -0.186961f, -0.150236f, -0.108165f, -0.075965f, -0.057714f, -0.051787f, -0.050962f, -0.041140f, -0.013561f, 0.025666f, 0.064669f, 0.096591f, 0.117146f, 0.121878f, 0.111088f, 0.089713f, 0.059784f, 0.020022f, -0.026868f, -0.073943f, -0.117183f, -0.157438f, -0.196739f, -0.237459f, -0.283107f, -0.335948f, -0.395266f, -0.459191f, -0.525388f, -0.589979f, -0.649670f, -0.704454f, -0.754602f, -0.796966f, -0.828420f, -0.850237f, -0.864670f, -0.870324f, -0.865150f, -0.850447f, -0.827593f, -0.794208f, -0.747439f, -0.688089f, -0.618815f, -0.541545f, -0.458906f, -0.375037f, -0.293293f, -0.215404f, -0.143040f, -0.077588f, -0.019000f, 0.032484f, 0.074585f, 0.105344f, 0.125342f, 0.134906f, 0.131058f, 0.109800f, 0.069531f, 0.009669f, -0.072345f, -0.179941f, -0.313863f, -0.471475f, -0.649282f, -0.844479f, -1.053119f, + -1.267745f, -1.479091f, -1.680773f, -1.869994f, -2.042752f, -2.192065f, -2.313426f, -2.408035f, -2.477146f, -2.517248f, -2.525139f, -2.503743f, -2.457948f, -2.388501f, -2.295477f, -2.184628f, -2.064830f, -1.941431f, -1.816649f, -1.694232f, -1.579181f, -1.473891f, -1.377781f, -1.290140f, -1.211493f, -1.142683f, -1.083511f, -1.032207f, -0.986607f, -0.945898f, -0.909860f, -0.876620f, -0.843723f, -0.811646f, -0.783525f, -0.761406f, -0.745602f, -0.737373f, -0.739078f, -0.751862f, -0.775439f, -0.809243f, -0.852230f, -0.903080f, -0.961061f, -1.024309f, -1.088143f, -1.148390f, -1.204010f, -1.252283f, -1.285794f, -1.299183f, -1.292421f, -1.262728f, -1.203108f, -1.111036f, -0.979245f, -0.776277f, -0.476453f, -0.132899f, 0.122319f, 0.197804f, 0.136024f, 0.042576f} + }, + { + {0.043211f, 0.114663f, 0.178350f, 0.255737f, 0.285888f, 0.179104f, -0.023247f, -0.173997f, -0.226462f, -0.279044f, -0.376950f, -0.415326f, -0.314791f, -0.166534f, -0.101737f, -0.111875f, -0.106297f, -0.075928f, -0.083496f, -0.132151f, -0.157295f, -0.141147f, -0.141935f, -0.197377f, -0.268166f, -0.295822f, -0.268965f, -0.216058f, -0.166730f, -0.133269f, -0.106523f, -0.062428f, 0.009773f, 0.084069f, 0.118826f, 0.100756f, 0.052619f, 0.000385f, -0.049019f, -0.097030f, -0.139136f, -0.169026f, -0.187831f, -0.203308f, -0.223852f, -0.255186f, -0.299437f, -0.356144f, -0.425306f, -0.507990f, -0.602347f, -0.701452f, -0.797320f, -0.885133f, -0.962214f, -1.026134f, -1.076805f, -1.118706f, -1.158479f, -1.200974f, -1.248680f, -1.303141f, -1.364299f, -1.428256f, -1.487099f, -1.531700f, -1.554756f, -1.551648f, -1.520065f, -1.460625f, -1.377882f, -1.278869f, -1.169561f, -1.053641f, -0.934981f, -0.819203f, -0.711302f, -0.613088f, -0.524413f, -0.445870f, -0.379143f, -0.325887f, -0.287530f, -0.265472f, -0.260511f, -0.272174f, -0.298377f, -0.335361f, -0.379247f, -0.429275f, -0.488690f, -0.561273f, -0.648741f, -0.753109f, -0.878725f, -1.028425f, + -1.199267f, -1.385196f, -1.581978f, -1.785517f, -1.986815f, -2.173455f, -2.336281f, -2.471087f, -2.574200f, -2.641158f, -2.671370f, -2.670549f, -2.646120f, -2.602190f, -2.540998f, -2.466998f, -2.385837f, -2.299472f, -2.205584f, -2.102795f, -1.993617f, -1.880860f, -1.764387f, -1.644251f, -1.524566f, -1.410674f, -1.304067f, -1.203483f, -1.109515f, -1.024333f, -0.947806f, -0.877724f, -0.813643f, -0.757572f, -0.711183f, -0.674763f, -0.648343f, -0.631942f, -0.625338f, -0.628602f, -0.641609f, -0.662782f, -0.690486f, -0.725337f, -0.767997f, -0.815397f, -0.862958f, -0.909125f, -0.952637f, -0.987183f, -1.004998f, -1.003395f, -0.980880f, -0.931098f, -0.849216f, -0.736166f, -0.582560f, -0.362530f, -0.077132f, 0.196027f, 0.339834f, 0.309726f, 0.180471f, 0.053468f}, + {-0.250917f, -0.661339f, -0.861207f, -0.846902f, -0.664218f, -0.342690f, 0.076900f, 0.488755f, 0.753334f, 0.794704f, 0.644706f, 0.387716f, 0.087130f, -0.222361f, -0.495635f, -0.664747f, -0.675285f, -0.525652f, -0.265718f, 0.036337f, 0.319974f, 0.533170f, 0.627765f, 0.573427f, 0.381921f, 0.110243f, -0.167021f, -0.388733f, -0.515836f, -0.526623f, -0.420050f, -0.223739f, 0.011644f, 0.230655f, 0.386504f, 0.446212f, 0.398682f, 0.263741f, 0.086103f, -0.086723f, -0.222001f, -0.302073f, -0.318070f, -0.270296f, -0.171952f, -0.046899f, 0.077676f, 0.177097f, 0.232660f, 0.235704f, 0.190877f, 0.114233f, 0.026162f, -0.055573f, -0.118508f, -0.154916f, -0.161542f, -0.140412f, -0.098426f, -0.044790f, 0.011487f, 0.062292f, 0.100710f, 0.122257f, 0.125625f, 0.111599f, 0.081676f, 0.038064f, -0.015568f, -0.073246f, -0.125374f, -0.158379f, -0.158510f, -0.119317f, -0.047174f, 0.039659f, 0.117388f, 0.164783f, 0.170354f, 0.136110f, 0.075525f, 0.006572f, -0.055527f, -0.101705f, -0.128258f, -0.134141f, -0.118811f, -0.082220f, -0.026999f, 0.038902f, 0.101566f, 0.144045f, 0.152550f, 0.123025f, 0.063907f, -0.007177f, + -0.070685f, -0.111988f, -0.124827f, -0.111060f, -0.077909f, -0.034563f, 0.010220f, 0.049241f, 0.077443f, 0.092064f, 0.092106f, 0.077698f, 0.050246f, 0.012985f, -0.028844f, -0.068172f, -0.096572f, -0.105925f, -0.091461f, -0.054444f, -0.002780f, 0.050639f, 0.091484f, 0.108787f, 0.098953f, 0.066563f, 0.021850f, -0.023112f, -0.057935f, -0.076466f, -0.077535f, -0.063771f, -0.039868f, -0.011391f, 0.016269f, 0.038948f, 0.053942f, 0.059572f, 0.055230f, 0.041838f, 0.021689f, -0.002057f, -0.025436f, -0.043993f, -0.054036f, -0.053641f, -0.042616f, -0.022580f, 0.002601f, 0.027618f, 0.047483f, 0.058276f, 0.057322f, 0.044558f, 0.023331f, -0.001451f, -0.024710f, -0.039879f, -0.040348f, -0.026668f, -0.009522f, -0.000100f, 0.000909f, 0.000035f} + }, + { + {-0.250917f, -0.661339f, -0.861207f, -0.846902f, -0.664218f, -0.342690f, 0.076900f, 0.488755f, 0.753334f, 0.794704f, 0.644706f, 0.387716f, 0.087130f, -0.222361f, -0.495635f, -0.664747f, -0.675285f, -0.525652f, -0.265718f, 0.036337f, 0.319974f, 0.533170f, 0.627765f, 0.573427f, 0.381921f, 0.110243f, -0.167021f, -0.388733f, -0.515836f, -0.526623f, -0.420050f, -0.223739f, 0.011644f, 0.230655f, 0.386504f, 0.446212f, 0.398682f, 0.263741f, 0.086103f, -0.086723f, -0.222001f, -0.302073f, -0.318070f, -0.270296f, -0.171952f, -0.046899f, 0.077676f, 0.177097f, 0.232660f, 0.235704f, 0.190877f, 0.114233f, 0.026162f, -0.055573f, -0.118508f, -0.154916f, -0.161542f, -0.140412f, -0.098426f, -0.044790f, 0.011487f, 0.062292f, 0.100710f, 0.122257f, 0.125625f, 0.111599f, 0.081676f, 0.038064f, -0.015568f, -0.073246f, -0.125374f, -0.158379f, -0.158510f, -0.119317f, -0.047174f, 0.039659f, 0.117388f, 0.164783f, 0.170354f, 0.136110f, 0.075525f, 0.006572f, -0.055527f, -0.101705f, -0.128258f, -0.134141f, -0.118811f, -0.082220f, -0.026999f, 0.038902f, 0.101566f, 0.144045f, 0.152550f, 0.123025f, 0.063907f, -0.007177f, + -0.070685f, -0.111988f, -0.124827f, -0.111060f, -0.077909f, -0.034563f, 0.010220f, 0.049241f, 0.077443f, 0.092064f, 0.092106f, 0.077698f, 0.050246f, 0.012985f, -0.028844f, -0.068172f, -0.096572f, -0.105925f, -0.091461f, -0.054444f, -0.002780f, 0.050639f, 0.091484f, 0.108787f, 0.098953f, 0.066563f, 0.021850f, -0.023112f, -0.057935f, -0.076466f, -0.077535f, -0.063771f, -0.039868f, -0.011391f, 0.016269f, 0.038948f, 0.053942f, 0.059572f, 0.055230f, 0.041838f, 0.021689f, -0.002057f, -0.025436f, -0.043993f, -0.054036f, -0.053641f, -0.042616f, -0.022580f, 0.002601f, 0.027618f, 0.047483f, 0.058276f, 0.057322f, 0.044558f, 0.023331f, -0.001451f, -0.024710f, -0.039879f, -0.040348f, -0.026668f, -0.009522f, -0.000100f, 0.000909f, 0.000035f}, + {0.043211f, 0.114663f, 0.178350f, 0.255737f, 0.285888f, 0.179104f, -0.023247f, -0.173997f, -0.226462f, -0.279044f, -0.376950f, -0.415326f, -0.314791f, -0.166534f, -0.101737f, -0.111875f, -0.106297f, -0.075928f, -0.083496f, -0.132151f, -0.157295f, -0.141147f, -0.141935f, -0.197377f, -0.268166f, -0.295822f, -0.268965f, -0.216058f, -0.166730f, -0.133269f, -0.106523f, -0.062428f, 0.009773f, 0.084069f, 0.118826f, 0.100756f, 0.052619f, 0.000385f, -0.049019f, -0.097030f, -0.139136f, -0.169026f, -0.187831f, -0.203308f, -0.223852f, -0.255186f, -0.299437f, -0.356144f, -0.425306f, -0.507990f, -0.602347f, -0.701452f, -0.797320f, -0.885133f, -0.962214f, -1.026134f, -1.076805f, -1.118706f, -1.158479f, -1.200974f, -1.248680f, -1.303141f, -1.364299f, -1.428256f, -1.487099f, -1.531700f, -1.554756f, -1.551648f, -1.520065f, -1.460625f, -1.377882f, -1.278869f, -1.169561f, -1.053641f, -0.934981f, -0.819203f, -0.711302f, -0.613088f, -0.524413f, -0.445870f, -0.379143f, -0.325887f, -0.287530f, -0.265472f, -0.260511f, -0.272174f, -0.298377f, -0.335361f, -0.379247f, -0.429275f, -0.488690f, -0.561273f, -0.648741f, -0.753109f, -0.878725f, -1.028425f, + -1.199267f, -1.385196f, -1.581978f, -1.785517f, -1.986815f, -2.173455f, -2.336281f, -2.471087f, -2.574200f, -2.641158f, -2.671370f, -2.670549f, -2.646120f, -2.602190f, -2.540998f, -2.466998f, -2.385837f, -2.299472f, -2.205584f, -2.102795f, -1.993617f, -1.880860f, -1.764387f, -1.644251f, -1.524566f, -1.410674f, -1.304067f, -1.203483f, -1.109515f, -1.024333f, -0.947806f, -0.877724f, -0.813643f, -0.757572f, -0.711183f, -0.674763f, -0.648343f, -0.631942f, -0.625338f, -0.628602f, -0.641609f, -0.662782f, -0.690486f, -0.725337f, -0.767997f, -0.815397f, -0.862958f, -0.909125f, -0.952637f, -0.987183f, -1.004998f, -1.003395f, -0.980880f, -0.931098f, -0.849216f, -0.736166f, -0.582560f, -0.362530f, -0.077132f, 0.196027f, 0.339834f, 0.309726f, 0.180471f, 0.053468f} + }, + { + {-0.007685f, -0.027507f, -0.054095f, -0.077744f, -0.087310f, -0.078964f, -0.038795f, 0.069420f, 0.257031f, 0.450295f, 0.530050f, 0.449733f, 0.272335f, 0.084500f, -0.069538f, -0.161822f, -0.164288f, -0.090752f, 0.002325f, 0.083182f, 0.160693f, 0.220174f, 0.210093f, 0.117413f, -0.002015f, -0.090343f, -0.133503f, -0.129881f, -0.074554f, 0.006798f, 0.062262f, 0.070660f, 0.051397f, 0.011062f, -0.071757f, -0.199300f, -0.336804f, -0.453472f, -0.547094f, -0.622722f, -0.679122f, -0.721601f, -0.761966f, -0.801674f, -0.833087f, -0.855441f, -0.874451f, -0.891846f, -0.908530f, -0.930458f, -0.959812f, -0.988680f, -1.010943f, -1.031888f, -1.058899f, -1.091801f, -1.128278f, -1.169543f, -1.214950f, -1.258511f, -1.295477f, -1.327242f, -1.357589f, -1.388759f, -1.422413f, -1.460583f, -1.504259f, -1.552224f, -1.600690f, -1.643955f, -1.677490f, -1.700431f, -1.713026f, -1.713123f, -1.698577f, -1.671550f, -1.636224f, -1.593323f, -1.540916f, -1.479604f, -1.412906f, -1.343349f, -1.272152f, -1.202419f, -1.138827f, -1.083544f, -1.035142f, -0.992009f, -0.954485f, -0.922860f, -0.895223f, -0.868589f, -0.841261f, -0.813242f, -0.784990f, -0.756664f, + -0.728377f, -0.700591f, -0.673949f, -0.648504f, -0.623136f, -0.596307f, -0.567494f, -0.537004f, -0.504339f, -0.468321f, -0.429292f, -0.389390f, -0.350011f, -0.310984f, -0.272863f, -0.237613f, -0.206211f, -0.177918f, -0.152490f, -0.130688f, -0.112365f, -0.096494f, -0.082923f, -0.071818f, -0.062192f, -0.053302f, -0.046074f, -0.041079f, -0.037253f, -0.034551f, -0.035132f, -0.040283f, -0.049461f, -0.063497f, -0.084978f, -0.114685f, -0.151385f, -0.194815f, -0.244968f, -0.299672f, -0.356620f, -0.415455f, -0.474774f, -0.531119f, -0.583532f, -0.633601f, -0.679431f, -0.716947f, -0.747534f, -0.775310f, -0.798076f, -0.811775f, -0.820314f, -0.828412f, -0.831431f, -0.825479f, -0.812449f, -0.774419f, -0.665729f, -0.468389f, -0.242150f, -0.078143f, -0.008766f, 0.002106f}, + {-0.129968f, -0.372393f, -0.578340f, -0.729002f, -0.764205f, -0.635435f, -0.410779f, -0.258243f, -0.301569f, -0.524734f, -0.804408f, -0.990576f, -0.983187f, -0.802264f, -0.583745f, -0.457595f, -0.435905f, -0.450492f, -0.458378f, -0.450407f, -0.393789f, -0.250404f, -0.049285f, 0.124891f, 0.223524f, 0.271404f, 0.315417f, 0.378570f, 0.464787f, 0.569578f, 0.675212f, 0.756468f, 0.797347f, 0.794880f, 0.754800f, 0.694127f, 0.637483f, 0.597643f, 0.564937f, 0.521985f, 0.461410f, 0.385881f, 0.301177f, 0.214129f, 0.129669f, 0.046526f, -0.039231f, -0.126876f, -0.212405f, -0.294795f, -0.375289f, -0.453145f, -0.526688f, -0.595041f, -0.654835f, -0.699235f, -0.723697f, -0.729022f, -0.716770f, -0.686317f, -0.638153f, -0.575500f, -0.501166f, -0.416714f, -0.325202f, -0.230531f, -0.133598f, -0.032773f, 0.071477f, 0.175093f, 0.273102f, 0.361324f, 0.436332f, 0.496419f, 0.542408f, 0.575872f, 0.596821f, 0.603979f, 0.596576f, 0.575075f, 0.540663f, 0.494625f, 0.438152f, 0.372876f, 0.301611f, 0.228007f, 0.155318f, 0.085985f, 0.022006f, -0.035375f, -0.086123f, -0.130408f, -0.167443f, -0.196380f, -0.217766f, -0.232828f, + -0.241945f, -0.245120f, -0.243300f, -0.237878f, -0.229559f, -0.218937f, -0.207509f, -0.196911f, -0.187682f, -0.179723f, -0.173313f, -0.168740f, -0.165527f, -0.162849f, -0.160290f, -0.157612f, -0.154177f, -0.148993f, -0.141009f, -0.129167f, -0.112488f, -0.090258f, -0.062070f, -0.027942f, 0.011466f, 0.055164f, 0.102457f, 0.152703f, 0.204508f, 0.256025f, 0.305953f, 0.353184f, 0.395721f, 0.431341f, 0.459153f, 0.478929f, 0.489277f, 0.488292f, 0.475516f, 0.451198f, 0.414350f, 0.363901f, 0.300928f, 0.227294f, 0.143319f, 0.049531f, -0.050798f, -0.153561f, -0.256130f, -0.355063f, -0.444423f, -0.519082f, -0.576123f, -0.611242f, -0.619307f, -0.598890f, -0.546613f, -0.447912f, -0.293914f, -0.116818f, 0.014790f, 0.058050f, 0.038715f, 0.010517f} + }, + { + {-0.129968f, -0.372393f, -0.578340f, -0.729002f, -0.764205f, -0.635435f, -0.410779f, -0.258243f, -0.301569f, -0.524734f, -0.804408f, -0.990576f, -0.983187f, -0.802264f, -0.583745f, -0.457595f, -0.435905f, -0.450492f, -0.458378f, -0.450407f, -0.393789f, -0.250404f, -0.049285f, 0.124891f, 0.223524f, 0.271404f, 0.315417f, 0.378570f, 0.464787f, 0.569578f, 0.675212f, 0.756468f, 0.797347f, 0.794880f, 0.754800f, 0.694127f, 0.637483f, 0.597643f, 0.564937f, 0.521985f, 0.461410f, 0.385881f, 0.301177f, 0.214129f, 0.129669f, 0.046526f, -0.039231f, -0.126876f, -0.212405f, -0.294795f, -0.375289f, -0.453145f, -0.526688f, -0.595041f, -0.654835f, -0.699235f, -0.723697f, -0.729022f, -0.716770f, -0.686317f, -0.638153f, -0.575500f, -0.501166f, -0.416714f, -0.325202f, -0.230531f, -0.133598f, -0.032773f, 0.071477f, 0.175093f, 0.273102f, 0.361324f, 0.436332f, 0.496419f, 0.542408f, 0.575872f, 0.596821f, 0.603979f, 0.596576f, 0.575075f, 0.540663f, 0.494625f, 0.438152f, 0.372876f, 0.301611f, 0.228007f, 0.155318f, 0.085985f, 0.022006f, -0.035375f, -0.086123f, -0.130408f, -0.167443f, -0.196380f, -0.217766f, -0.232828f, + -0.241945f, -0.245120f, -0.243300f, -0.237878f, -0.229559f, -0.218937f, -0.207509f, -0.196911f, -0.187682f, -0.179723f, -0.173313f, -0.168740f, -0.165527f, -0.162849f, -0.160290f, -0.157612f, -0.154177f, -0.148993f, -0.141009f, -0.129167f, -0.112488f, -0.090258f, -0.062070f, -0.027942f, 0.011466f, 0.055164f, 0.102457f, 0.152703f, 0.204508f, 0.256025f, 0.305953f, 0.353184f, 0.395721f, 0.431341f, 0.459153f, 0.478929f, 0.489277f, 0.488292f, 0.475516f, 0.451198f, 0.414350f, 0.363901f, 0.300928f, 0.227294f, 0.143319f, 0.049531f, -0.050798f, -0.153561f, -0.256130f, -0.355063f, -0.444423f, -0.519082f, -0.576123f, -0.611242f, -0.619307f, -0.598890f, -0.546613f, -0.447912f, -0.293914f, -0.116818f, 0.014790f, 0.058050f, 0.038715f, 0.010517f}, + {-0.007685f, -0.027507f, -0.054095f, -0.077744f, -0.087310f, -0.078964f, -0.038795f, 0.069420f, 0.257031f, 0.450295f, 0.530050f, 0.449733f, 0.272335f, 0.084500f, -0.069538f, -0.161822f, -0.164288f, -0.090752f, 0.002325f, 0.083182f, 0.160693f, 0.220174f, 0.210093f, 0.117413f, -0.002015f, -0.090343f, -0.133503f, -0.129881f, -0.074554f, 0.006798f, 0.062262f, 0.070660f, 0.051397f, 0.011062f, -0.071757f, -0.199300f, -0.336804f, -0.453472f, -0.547094f, -0.622722f, -0.679122f, -0.721601f, -0.761966f, -0.801674f, -0.833087f, -0.855441f, -0.874451f, -0.891846f, -0.908530f, -0.930458f, -0.959812f, -0.988680f, -1.010943f, -1.031888f, -1.058899f, -1.091801f, -1.128278f, -1.169543f, -1.214950f, -1.258511f, -1.295477f, -1.327242f, -1.357589f, -1.388759f, -1.422413f, -1.460583f, -1.504259f, -1.552224f, -1.600690f, -1.643955f, -1.677490f, -1.700431f, -1.713026f, -1.713123f, -1.698577f, -1.671550f, -1.636224f, -1.593323f, -1.540916f, -1.479604f, -1.412906f, -1.343349f, -1.272152f, -1.202419f, -1.138827f, -1.083544f, -1.035142f, -0.992009f, -0.954485f, -0.922860f, -0.895223f, -0.868589f, -0.841261f, -0.813242f, -0.784990f, -0.756664f, + -0.728377f, -0.700591f, -0.673949f, -0.648504f, -0.623136f, -0.596307f, -0.567494f, -0.537004f, -0.504339f, -0.468321f, -0.429292f, -0.389390f, -0.350011f, -0.310984f, -0.272863f, -0.237613f, -0.206211f, -0.177918f, -0.152490f, -0.130688f, -0.112365f, -0.096494f, -0.082923f, -0.071818f, -0.062192f, -0.053302f, -0.046074f, -0.041079f, -0.037253f, -0.034551f, -0.035132f, -0.040283f, -0.049461f, -0.063497f, -0.084978f, -0.114685f, -0.151385f, -0.194815f, -0.244968f, -0.299672f, -0.356620f, -0.415455f, -0.474774f, -0.531119f, -0.583532f, -0.633601f, -0.679431f, -0.716947f, -0.747534f, -0.775310f, -0.798076f, -0.811775f, -0.820314f, -0.828412f, -0.831431f, -0.825479f, -0.812449f, -0.774419f, -0.665729f, -0.468389f, -0.242150f, -0.078143f, -0.008766f, 0.002106f} + }, + { + {0.008569f, 0.036036f, 0.083803f, 0.119148f, 0.070548f, -0.078326f, -0.222894f, -0.243650f, -0.159814f, -0.090800f, -0.079375f, -0.056656f, 0.011482f, 0.052573f, -0.001498f, -0.119602f, -0.234866f, -0.335723f, -0.443207f, -0.546764f, -0.614586f, -0.641944f, -0.650393f, -0.653434f, -0.649185f, -0.636897f, -0.621833f, -0.608002f, -0.594814f, -0.577373f, -0.548943f, -0.509093f, -0.468031f, -0.436187f, -0.411762f, -0.384320f, -0.347210f, -0.301521f, -0.252453f, -0.207016f, -0.171531f, -0.147319f, -0.131387f, -0.122478f, -0.122706f, -0.133139f, -0.152285f, -0.178903f, -0.211845f, -0.246994f, -0.277923f, -0.299862f, -0.311486f, -0.314495f, -0.313374f, -0.313999f, -0.321093f, -0.338012f, -0.367937f, -0.412103f, -0.467256f, -0.527953f, -0.590760f, -0.653426f, -0.711811f, -0.761768f, -0.803336f, -0.839595f, -0.872213f, -0.901047f, -0.926960f, -0.951668f, -0.974952f, -0.994343f, -1.007533f, -1.013586f, -1.011948f, -1.001634f, -0.982097f, -0.954803f, -0.923350f, -0.891226f, -0.859546f, -0.827704f, -0.795383f, -0.762152f, -0.725674f, -0.682815f, -0.632889f, -0.578128f, -0.521168f, -0.463936f, -0.408686f, -0.358044f, -0.313851f, -0.277169f, + -0.249216f, -0.231562f, -0.226114f, -0.235302f, -0.261018f, -0.302923f, -0.359045f, -0.427912f, -0.508230f, -0.596814f, -0.689382f, -0.783568f, -0.878803f, -0.973138f, -1.062782f, -1.145182f, -1.220206f, -1.287561f, -1.345176f, -1.391256f, -1.426524f, -1.453153f, -1.472158f, -1.483234f, -1.487105f, -1.486427f, -1.483303f, -1.477082f, -1.466245f, -1.451366f, -1.433837f, -1.412447f, -1.384210f, -1.348415f, -1.306852f, -1.260094f, -1.206810f, -1.147202f, -1.084167f, -1.020388f, -0.956644f, -0.893519f, -0.832832f, -0.776711f, -0.726155f, -0.680677f, -0.639318f, -0.602179f, -0.570035f, -0.541815f, -0.514590f, -0.487168f, -0.460379f, -0.432551f, -0.399491f, -0.358843f, -0.305118f, -0.220990f, -0.093402f, 0.051282f, 0.149376f, 0.158777f, 0.102510f, 0.032573f}, + {-0.185559f, -0.533696f, -0.795174f, -0.893521f, -0.804685f, -0.602937f, -0.410524f, -0.289172f, -0.193916f, -0.044106f, 0.172466f, 0.382975f, 0.510029f, 0.545297f, 0.535692f, 0.515516f, 0.471783f, 0.372671f, 0.213104f, 0.026128f, -0.142895f, -0.267633f, -0.350549f, -0.407779f, -0.446543f, -0.457210f, -0.425690f, -0.349165f, -0.237230f, -0.102509f, 0.042736f, 0.181828f, 0.293938f, 0.363819f, 0.388959f, 0.375638f, 0.331364f, 0.263320f, 0.180641f, 0.093713f, 0.010848f, -0.063123f, -0.125901f, -0.176786f, -0.215972f, -0.243350f, -0.257838f, -0.258058f, -0.242990f, -0.211605f, -0.162734f, -0.096408f, -0.015762f, 0.072248f, 0.157999f, 0.231691f, 0.285687f, 0.315159f, 0.317146f, 0.289924f, 0.233942f, 0.153214f, 0.055517f, -0.048876f, -0.149035f, -0.235026f, -0.298865f, -0.334596f, -0.337970f, -0.306610f, -0.241101f, -0.146635f, -0.034068f, 0.080977f, 0.181425f, 0.253055f, 0.287741f, 0.284775f, 0.250380f, 0.195377f, 0.131392f, 0.067461f, 0.008841f, -0.042182f, -0.084996f, -0.119586f, -0.145618f, -0.161950f, -0.166889f, -0.158953f, -0.137777f, -0.104952f, -0.064224f, -0.020560f, 0.021350f, 0.058000f, + 0.087198f, 0.107952f, 0.120229f, 0.124423f, 0.120940f, 0.110209f, 0.092820f, 0.069478f, 0.041098f, 0.009121f, -0.024406f, -0.057046f, -0.086092f, -0.108691f, -0.122317f, -0.125322f, -0.117083f, -0.098008f, -0.069732f, -0.035104f, 0.002352f, 0.039025f, 0.071510f, 0.096953f, 0.113464f, 0.120114f, 0.116611f, 0.103273f, 0.081173f, 0.052018f, 0.018016f, -0.017906f, -0.052056f, -0.080561f, -0.100082f, -0.108258f, -0.104200f, -0.088962f, -0.065272f, -0.036665f, -0.006887f, 0.020495f, 0.042788f, 0.058666f, 0.067823f, 0.070539f, 0.067767f, 0.060956f, 0.051331f, 0.039723f, 0.027058f, 0.014228f, 0.001590f, -0.010580f, -0.021471f, -0.030400f, -0.037058f, -0.039808f, -0.035582f, -0.024114f, -0.010855f, -0.002418f, 0.000057f, 0.000072f} + }, + { + {-0.185559f, -0.533696f, -0.795174f, -0.893521f, -0.804685f, -0.602937f, -0.410524f, -0.289172f, -0.193916f, -0.044106f, 0.172466f, 0.382975f, 0.510029f, 0.545297f, 0.535692f, 0.515516f, 0.471783f, 0.372671f, 0.213104f, 0.026128f, -0.142895f, -0.267633f, -0.350549f, -0.407779f, -0.446543f, -0.457210f, -0.425690f, -0.349165f, -0.237230f, -0.102509f, 0.042736f, 0.181828f, 0.293938f, 0.363819f, 0.388959f, 0.375638f, 0.331364f, 0.263320f, 0.180641f, 0.093713f, 0.010848f, -0.063123f, -0.125901f, -0.176786f, -0.215972f, -0.243350f, -0.257838f, -0.258058f, -0.242990f, -0.211605f, -0.162734f, -0.096408f, -0.015762f, 0.072248f, 0.157999f, 0.231691f, 0.285687f, 0.315159f, 0.317146f, 0.289924f, 0.233942f, 0.153214f, 0.055517f, -0.048876f, -0.149035f, -0.235026f, -0.298865f, -0.334596f, -0.337970f, -0.306610f, -0.241101f, -0.146635f, -0.034068f, 0.080977f, 0.181425f, 0.253055f, 0.287741f, 0.284775f, 0.250380f, 0.195377f, 0.131392f, 0.067461f, 0.008841f, -0.042182f, -0.084996f, -0.119586f, -0.145618f, -0.161950f, -0.166889f, -0.158953f, -0.137777f, -0.104952f, -0.064224f, -0.020560f, 0.021350f, 0.058000f, + 0.087198f, 0.107952f, 0.120229f, 0.124423f, 0.120940f, 0.110209f, 0.092820f, 0.069478f, 0.041098f, 0.009121f, -0.024406f, -0.057046f, -0.086092f, -0.108691f, -0.122317f, -0.125322f, -0.117083f, -0.098008f, -0.069732f, -0.035104f, 0.002352f, 0.039025f, 0.071510f, 0.096953f, 0.113464f, 0.120114f, 0.116611f, 0.103273f, 0.081173f, 0.052018f, 0.018016f, -0.017906f, -0.052056f, -0.080561f, -0.100082f, -0.108258f, -0.104200f, -0.088962f, -0.065272f, -0.036665f, -0.006887f, 0.020495f, 0.042788f, 0.058666f, 0.067823f, 0.070539f, 0.067767f, 0.060956f, 0.051331f, 0.039723f, 0.027058f, 0.014228f, 0.001590f, -0.010580f, -0.021471f, -0.030400f, -0.037058f, -0.039808f, -0.035582f, -0.024114f, -0.010855f, -0.002418f, 0.000057f, 0.000072f}, + {0.008569f, 0.036036f, 0.083803f, 0.119148f, 0.070548f, -0.078326f, -0.222894f, -0.243650f, -0.159814f, -0.090800f, -0.079375f, -0.056656f, 0.011482f, 0.052573f, -0.001498f, -0.119602f, -0.234866f, -0.335723f, -0.443207f, -0.546764f, -0.614586f, -0.641944f, -0.650393f, -0.653434f, -0.649185f, -0.636897f, -0.621833f, -0.608002f, -0.594814f, -0.577373f, -0.548943f, -0.509093f, -0.468031f, -0.436187f, -0.411762f, -0.384320f, -0.347210f, -0.301521f, -0.252453f, -0.207016f, -0.171531f, -0.147319f, -0.131387f, -0.122478f, -0.122706f, -0.133139f, -0.152285f, -0.178903f, -0.211845f, -0.246994f, -0.277923f, -0.299862f, -0.311486f, -0.314495f, -0.313374f, -0.313999f, -0.321093f, -0.338012f, -0.367937f, -0.412103f, -0.467256f, -0.527953f, -0.590760f, -0.653426f, -0.711811f, -0.761768f, -0.803336f, -0.839595f, -0.872213f, -0.901047f, -0.926960f, -0.951668f, -0.974952f, -0.994343f, -1.007533f, -1.013586f, -1.011948f, -1.001634f, -0.982097f, -0.954803f, -0.923350f, -0.891226f, -0.859546f, -0.827704f, -0.795383f, -0.762152f, -0.725674f, -0.682815f, -0.632889f, -0.578128f, -0.521168f, -0.463936f, -0.408686f, -0.358044f, -0.313851f, -0.277169f, + -0.249216f, -0.231562f, -0.226114f, -0.235302f, -0.261018f, -0.302923f, -0.359045f, -0.427912f, -0.508230f, -0.596814f, -0.689382f, -0.783568f, -0.878803f, -0.973138f, -1.062782f, -1.145182f, -1.220206f, -1.287561f, -1.345176f, -1.391256f, -1.426524f, -1.453153f, -1.472158f, -1.483234f, -1.487105f, -1.486427f, -1.483303f, -1.477082f, -1.466245f, -1.451366f, -1.433837f, -1.412447f, -1.384210f, -1.348415f, -1.306852f, -1.260094f, -1.206810f, -1.147202f, -1.084167f, -1.020388f, -0.956644f, -0.893519f, -0.832832f, -0.776711f, -0.726155f, -0.680677f, -0.639318f, -0.602179f, -0.570035f, -0.541815f, -0.514590f, -0.487168f, -0.460379f, -0.432551f, -0.399491f, -0.358843f, -0.305118f, -0.220990f, -0.093402f, 0.051282f, 0.149376f, 0.158777f, 0.102510f, 0.032573f} + }, + { + {0.000818f, 0.017444f, 0.055261f, 0.075350f, 0.028576f, -0.084474f, -0.203267f, -0.269006f, -0.280096f, -0.268702f, -0.244047f, -0.193916f, -0.132682f, -0.106266f, -0.141353f, -0.220111f, -0.313836f, -0.412717f, -0.509637f, -0.582401f, -0.614704f, -0.620470f, -0.628348f, -0.649673f, -0.675138f, -0.695278f, -0.709877f, -0.720342f, -0.725172f, -0.724086f, -0.719270f, -0.711043f, -0.696324f, -0.671680f, -0.634992f, -0.584739f, -0.521369f, -0.450440f, -0.381867f, -0.324115f, -0.279763f, -0.247402f, -0.226194f, -0.216476f, -0.216704f, -0.222582f, -0.229987f, -0.237137f, -0.243538f, -0.248735f, -0.252984f, -0.257930f, -0.265977f, -0.279595f, -0.300835f, -0.330262f, -0.366467f, -0.407332f, -0.450975f, -0.494762f, -0.535151f, -0.570200f, -0.601049f, -0.629499f, -0.655394f, -0.677493f, -0.695060f, -0.706757f, -0.709441f, -0.699998f, -0.677852f, -0.644857f, -0.603934f, -0.558778f, -0.513757f, -0.472656f, -0.437355f, -0.407636f, -0.381795f, -0.357605f, -0.333418f, -0.308502f, -0.282455f, -0.254976f, -0.226350f, -0.197326f, -0.168302f, -0.139286f, -0.110657f, -0.083214f, -0.057592f, -0.034344f, -0.014464f, 0.000612f, 0.009079f, 0.008658f, + -0.002748f, -0.026081f, -0.061503f, -0.109231f, -0.168492f, -0.236158f, -0.308371f, -0.383343f, -0.460785f, -0.539319f, -0.616894f, -0.693318f, -0.769682f, -0.845181f, -0.916820f, -0.982312f, -1.041125f, -1.092420f, -1.134068f, -1.164515f, -1.184365f, -1.195293f, -1.198046f, -1.192412f, -1.179094f, -1.160558f, -1.139207f, -1.115521f, -1.089332f, -1.062057f, -1.035496f, -1.008900f, -0.979692f, -0.946885f, -0.911190f, -0.872108f, -0.828013f, -0.779273f, -0.728569f, -0.678022f, -0.628266f, -0.580141f, -0.535147f, -0.494398f, -0.458425f, -0.427379f, -0.400841f, -0.378568f, -0.361181f, -0.348470f, -0.338233f, -0.328932f, -0.321152f, -0.313945f, -0.303478f, -0.287185f, -0.261552f, -0.213238f, -0.127665f, -0.018184f, 0.068083f, 0.092632f, 0.064838f, 0.021246f}, + {-0.132893f, -0.397605f, -0.632845f, -0.770213f, -0.762671f, -0.657487f, -0.569283f, -0.556594f, -0.559219f, -0.491993f, -0.364307f, -0.253849f, -0.187137f, -0.112112f, 0.014136f, 0.171821f, 0.322049f, 0.450715f, 0.550492f, 0.602217f, 0.599573f, 0.565276f, 0.522546f, 0.469434f, 0.394977f, 0.302555f, 0.203283f, 0.099429f, -0.013047f, -0.132581f, -0.249813f, -0.352012f, -0.426880f, -0.468084f, -0.479268f, -0.468257f, -0.437536f, -0.385150f, -0.313695f, -0.232864f, -0.153248f, -0.081508f, -0.020528f, 0.029902f, 0.072671f, 0.111201f, 0.147960f, 0.185756f, 0.228084f, 0.275839f, 0.324544f, 0.365884f, 0.391073f, 0.393116f, 0.368911f, 0.321050f, 0.256310f, 0.181056f, 0.098444f, 0.009769f, -0.083153f, -0.177113f, -0.267162f, -0.346282f, -0.406698f, -0.442695f, -0.452288f, -0.436663f, -0.398947f, -0.343145f, -0.272690f, -0.189417f, -0.094678f, 0.008122f, 0.112328f, 0.209109f, 0.289473f, 0.346381f, 0.376791f, 0.382372f, 0.367753f, 0.337827f, 0.296648f, 0.247834f, 0.194626f, 0.139355f, 0.083528f, 0.028486f, -0.024521f, -0.074738f, -0.121823f, -0.165351f, -0.204687f, -0.239035f, -0.267045f, -0.286388f, + -0.294167f, -0.287997f, -0.266762f, -0.230689f, -0.181240f, -0.121082f, -0.053843f, 0.016500f, 0.086073f, 0.151052f, 0.207628f, 0.252510f, 0.283443f, 0.299057f, 0.298561f, 0.282101f, 0.251143f, 0.208046f, 0.155513f, 0.096805f, 0.035848f, -0.023629f, -0.078756f, -0.127050f, -0.166116f, -0.194424f, -0.211611f, -0.217549f, -0.211988f, -0.195487f, -0.169671f, -0.136297f, -0.097197f, -0.055217f, -0.013832f, 0.024328f, 0.057561f, 0.084189f, 0.103126f, 0.114971f, 0.121155f, 0.122583f, 0.120200f, 0.115693f, 0.110234f, 0.103651f, 0.095767f, 0.087016f, 0.077007f, 0.064469f, 0.049153f, 0.031743f, 0.012078f, -0.009949f, -0.032469f, -0.053467f, -0.072429f, -0.086119f, -0.086097f, -0.067552f, -0.038975f, -0.015688f, -0.004466f, -0.000879f} + }, + { + {-0.132893f, -0.397605f, -0.632845f, -0.770213f, -0.762671f, -0.657487f, -0.569283f, -0.556594f, -0.559219f, -0.491993f, -0.364307f, -0.253849f, -0.187137f, -0.112112f, 0.014136f, 0.171821f, 0.322049f, 0.450715f, 0.550492f, 0.602217f, 0.599573f, 0.565276f, 0.522546f, 0.469434f, 0.394977f, 0.302555f, 0.203283f, 0.099429f, -0.013047f, -0.132581f, -0.249813f, -0.352012f, -0.426880f, -0.468084f, -0.479268f, -0.468257f, -0.437536f, -0.385150f, -0.313695f, -0.232864f, -0.153248f, -0.081508f, -0.020528f, 0.029902f, 0.072671f, 0.111201f, 0.147960f, 0.185756f, 0.228084f, 0.275839f, 0.324544f, 0.365884f, 0.391073f, 0.393116f, 0.368911f, 0.321050f, 0.256310f, 0.181056f, 0.098444f, 0.009769f, -0.083153f, -0.177113f, -0.267162f, -0.346282f, -0.406698f, -0.442695f, -0.452288f, -0.436663f, -0.398947f, -0.343145f, -0.272690f, -0.189417f, -0.094678f, 0.008122f, 0.112328f, 0.209109f, 0.289473f, 0.346381f, 0.376791f, 0.382372f, 0.367753f, 0.337827f, 0.296648f, 0.247834f, 0.194626f, 0.139355f, 0.083528f, 0.028486f, -0.024521f, -0.074738f, -0.121823f, -0.165351f, -0.204687f, -0.239035f, -0.267045f, -0.286388f, + -0.294167f, -0.287997f, -0.266762f, -0.230689f, -0.181240f, -0.121082f, -0.053843f, 0.016500f, 0.086073f, 0.151052f, 0.207628f, 0.252510f, 0.283443f, 0.299057f, 0.298561f, 0.282101f, 0.251143f, 0.208046f, 0.155513f, 0.096805f, 0.035848f, -0.023629f, -0.078756f, -0.127050f, -0.166116f, -0.194424f, -0.211611f, -0.217549f, -0.211988f, -0.195487f, -0.169671f, -0.136297f, -0.097197f, -0.055217f, -0.013832f, 0.024328f, 0.057561f, 0.084189f, 0.103126f, 0.114971f, 0.121155f, 0.122583f, 0.120200f, 0.115693f, 0.110234f, 0.103651f, 0.095767f, 0.087016f, 0.077007f, 0.064469f, 0.049153f, 0.031743f, 0.012078f, -0.009949f, -0.032469f, -0.053467f, -0.072429f, -0.086119f, -0.086097f, -0.067552f, -0.038975f, -0.015688f, -0.004466f, -0.000879f}, + {0.000818f, 0.017444f, 0.055261f, 0.075350f, 0.028576f, -0.084474f, -0.203267f, -0.269006f, -0.280096f, -0.268702f, -0.244047f, -0.193916f, -0.132682f, -0.106266f, -0.141353f, -0.220111f, -0.313836f, -0.412717f, -0.509637f, -0.582401f, -0.614704f, -0.620470f, -0.628348f, -0.649673f, -0.675138f, -0.695278f, -0.709877f, -0.720342f, -0.725172f, -0.724086f, -0.719270f, -0.711043f, -0.696324f, -0.671680f, -0.634992f, -0.584739f, -0.521369f, -0.450440f, -0.381867f, -0.324115f, -0.279763f, -0.247402f, -0.226194f, -0.216476f, -0.216704f, -0.222582f, -0.229987f, -0.237137f, -0.243538f, -0.248735f, -0.252984f, -0.257930f, -0.265977f, -0.279595f, -0.300835f, -0.330262f, -0.366467f, -0.407332f, -0.450975f, -0.494762f, -0.535151f, -0.570200f, -0.601049f, -0.629499f, -0.655394f, -0.677493f, -0.695060f, -0.706757f, -0.709441f, -0.699998f, -0.677852f, -0.644857f, -0.603934f, -0.558778f, -0.513757f, -0.472656f, -0.437355f, -0.407636f, -0.381795f, -0.357605f, -0.333418f, -0.308502f, -0.282455f, -0.254976f, -0.226350f, -0.197326f, -0.168302f, -0.139286f, -0.110657f, -0.083214f, -0.057592f, -0.034344f, -0.014464f, 0.000612f, 0.009079f, 0.008658f, + -0.002748f, -0.026081f, -0.061503f, -0.109231f, -0.168492f, -0.236158f, -0.308371f, -0.383343f, -0.460785f, -0.539319f, -0.616894f, -0.693318f, -0.769682f, -0.845181f, -0.916820f, -0.982312f, -1.041125f, -1.092420f, -1.134068f, -1.164515f, -1.184365f, -1.195293f, -1.198046f, -1.192412f, -1.179094f, -1.160558f, -1.139207f, -1.115521f, -1.089332f, -1.062057f, -1.035496f, -1.008900f, -0.979692f, -0.946885f, -0.911190f, -0.872108f, -0.828013f, -0.779273f, -0.728569f, -0.678022f, -0.628266f, -0.580141f, -0.535147f, -0.494398f, -0.458425f, -0.427379f, -0.400841f, -0.378568f, -0.361181f, -0.348470f, -0.338233f, -0.328932f, -0.321152f, -0.313945f, -0.303478f, -0.287185f, -0.261552f, -0.213238f, -0.127665f, -0.018184f, 0.068083f, 0.092632f, 0.064838f, 0.021246f} + } +}; +const float *CRendBin_Combined_HRIR_coeff_diffuse_re_32kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const float *CRendBin_Combined_HRIR_coeff_diffuse_im_32kHz[BINAURAL_CHANNELS]={NULL,NULL}; + +/* Sample Rate = 16000 */ + +const int16_t CRendBin_Combined_HRIR_max_num_iterations_16kHz = 1; +const uint16_t CRendBin_Combined_HRIR_num_iterations_16kHz[15][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1} }; +const uint16_t CRendBin_Combined_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS] = {0, 0}; +const uint16_t CRendBin_Combined_HRIR_pIndex_frequency_max_16kHz[15][BINAURAL_CHANNELS][1]={{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}}}; +const uint16_t CRendBin_Combined_HRIR_index_frequency_max_diffuse_16kHz = 0; +const float CRendBin_Combined_HRIR_inv_diffuse_weight_16kHz[15]={0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f}; +const uint16_t *CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const float CRendBin_Combined_HRIR_coeff_re_16kHz[15][BINAURAL_CHANNELS][80]={ + { + { 1.239183f, 1.256884f, 1.300573f, 1.362041f, 1.394364f, 1.354510f, 1.284249f, 1.277360f, 1.319933f, 1.260104f, 1.035831f, 0.841818f, 0.918943f, 1.228789f, 1.505938f, 1.615001f, 1.676409f, 1.821102f, 2.003314f, 2.120456f, 2.162423f, 2.149697f, 2.042953f, 1.819108f, 1.562774f, 1.392343f, 1.338502f, 1.354661f, 1.404734f, 1.489962f, 1.620994f, 1.801308f, 2.016368f, 2.220843f, 2.360726f, 2.418417f, 2.416549f, 2.381039f, 2.323273f, 2.248889f, 2.158818f, 2.050759f, 1.937222f, 1.846306f, 1.790643f, 1.755504f, 1.725726f, 1.698099f, 1.662521f, 1.603450f, 1.526080f, 1.451493f, 1.385684f, 1.321724f, 1.264611f, 1.223329f, 1.190008f, 1.155210f, 1.126054f, 1.104272f, 1.071790f, 1.020334f, 0.962879f, 0.897728f, 0.801926f, 0.675382f, 0.545582f, 0.420598f, 0.290433f, 0.173783f, 0.099765f, 0.050651f, -0.006501f, -0.051832f, -0.062025f, -0.095855f, -0.220501f, -0.379318f, -0.456547f, -0.451019f}, + { 0.976240f, 0.994260f, 0.876770f, 0.603987f, 0.342097f, 0.178057f, 0.025122f, -0.153833f, -0.238337f, -0.148669f, 0.014037f, 0.101818f, 0.056629f, -0.133626f, -0.461333f, -0.816719f, -1.019518f, -1.009183f, -0.897964f, -0.789252f, -0.663741f, -0.496239f, -0.354698f, -0.300607f, -0.288976f, -0.247649f, -0.178409f, -0.106503f, 0.000399f, 0.183189f, 0.407624f, 0.602115f, 0.750568f, 0.884249f, 0.996966f, 1.028551f, 0.941028f, 0.772393f, 0.598310f, 0.460945f, 0.351012f, 0.245637f, 0.138980f, 0.032720f, -0.080090f, -0.203879f, -0.325054f, -0.425206f, -0.502279f, -0.563310f, -0.605020f, -0.618514f, -0.605694f, -0.575144f, -0.529166f, -0.468635f, -0.401310f, -0.332120f, -0.255156f, -0.166385f, -0.072884f, 0.018825f, 0.108885f, 0.191215f, 0.251825f, 0.287375f, 0.308166f, 0.318458f, 0.313465f, 0.297736f, 0.283754f, 0.271359f, 0.252697f, 0.235107f, 0.229934f, 0.221035f, 0.178105f, 0.103282f, 0.033631f, -0.002717f} + }, + { + { 0.976240f, 0.994260f, 0.876770f, 0.603987f, 0.342097f, 0.178057f, 0.025122f, -0.153833f, -0.238337f, -0.148669f, 0.014037f, 0.101818f, 0.056629f, -0.133626f, -0.461333f, -0.816719f, -1.019518f, -1.009183f, -0.897964f, -0.789252f, -0.663741f, -0.496239f, -0.354698f, -0.300607f, -0.288976f, -0.247649f, -0.178409f, -0.106503f, 0.000399f, 0.183189f, 0.407624f, 0.602115f, 0.750568f, 0.884249f, 0.996966f, 1.028551f, 0.941028f, 0.772393f, 0.598310f, 0.460945f, 0.351012f, 0.245637f, 0.138980f, 0.032720f, -0.080090f, -0.203879f, -0.325054f, -0.425206f, -0.502279f, -0.563310f, -0.605020f, -0.618514f, -0.605694f, -0.575144f, -0.529166f, -0.468635f, -0.401310f, -0.332120f, -0.255156f, -0.166385f, -0.072884f, 0.018825f, 0.108885f, 0.191215f, 0.251825f, 0.287375f, 0.308166f, 0.318458f, 0.313465f, 0.297736f, 0.283754f, 0.271359f, 0.252697f, 0.235107f, 0.229934f, 0.221035f, 0.178105f, 0.103282f, 0.033631f, -0.002717f}, + { 1.239183f, 1.256884f, 1.300573f, 1.362041f, 1.394364f, 1.354510f, 1.284249f, 1.277360f, 1.319933f, 1.260104f, 1.035831f, 0.841818f, 0.918943f, 1.228789f, 1.505938f, 1.615001f, 1.676409f, 1.821102f, 2.003314f, 2.120456f, 2.162423f, 2.149697f, 2.042953f, 1.819108f, 1.562774f, 1.392343f, 1.338502f, 1.354661f, 1.404734f, 1.489962f, 1.620994f, 1.801308f, 2.016368f, 2.220843f, 2.360726f, 2.418417f, 2.416549f, 2.381039f, 2.323273f, 2.248889f, 2.158818f, 2.050759f, 1.937222f, 1.846306f, 1.790643f, 1.755504f, 1.725726f, 1.698099f, 1.662521f, 1.603450f, 1.526080f, 1.451493f, 1.385684f, 1.321724f, 1.264611f, 1.223329f, 1.190008f, 1.155210f, 1.126054f, 1.104272f, 1.071790f, 1.020334f, 0.962879f, 0.897728f, 0.801926f, 0.675382f, 0.545582f, 0.420598f, 0.290433f, 0.173783f, 0.099765f, 0.050651f, -0.006501f, -0.051832f, -0.062025f, -0.095855f, -0.220501f, -0.379318f, -0.456547f, -0.451019f} + }, + { + { 1.122002f, 1.187509f, 1.246713f, 1.186481f, 1.007012f, 0.901165f, 1.008728f, 1.141977f, 0.990263f, 0.601633f, 0.401412f, 0.648122f, 1.096958f, 1.338723f, 1.298435f, 1.232461f, 1.343043f, 1.571111f, 1.735520f, 1.734892f, 1.594568f, 1.403703f, 1.245465f, 1.156974f, 1.131157f, 1.152575f, 1.222042f, 1.343151f, 1.499436f, 1.653765f, 1.763643f, 1.798287f, 1.754626f, 1.659827f, 1.547259f, 1.427359f, 1.291280f, 1.143229f, 1.015463f, 0.943988f, 0.937070f, 0.973335f, 1.022309f, 1.058798f, 1.066678f, 1.044204f, 1.005034f, 0.962902f, 0.915965f, 0.855193f, 0.783640f, 0.714878f, 0.655748f, 0.603582f, 0.557141f, 0.517413f, 0.480665f, 0.442018f, 0.402043f, 0.361971f, 0.320178f, 0.279891f, 0.248672f, 0.224537f, 0.197411f, 0.168385f, 0.148883f, 0.138139f, 0.123963f, 0.107044f, 0.098600f, 0.095015f, 0.084669f, 0.075757f, 0.080895f, 0.078392f, 0.031664f, -0.052589f, -0.126934f, -0.162192f}, + { 1.122002f, 1.187509f, 1.246713f, 1.186481f, 1.007012f, 0.901165f, 1.008728f, 1.141977f, 0.990263f, 0.601633f, 0.401412f, 0.648122f, 1.096958f, 1.338723f, 1.298435f, 1.232461f, 1.343043f, 1.571111f, 1.735520f, 1.734892f, 1.594568f, 1.403703f, 1.245465f, 1.156974f, 1.131157f, 1.152575f, 1.222042f, 1.343151f, 1.499436f, 1.653765f, 1.763643f, 1.798287f, 1.754626f, 1.659827f, 1.547259f, 1.427359f, 1.291280f, 1.143229f, 1.015463f, 0.943988f, 0.937070f, 0.973335f, 1.022309f, 1.058798f, 1.066678f, 1.044204f, 1.005034f, 0.962902f, 0.915965f, 0.855193f, 0.783640f, 0.714878f, 0.655748f, 0.603582f, 0.557141f, 0.517413f, 0.480665f, 0.442018f, 0.402043f, 0.361971f, 0.320178f, 0.279891f, 0.248672f, 0.224537f, 0.197411f, 0.168385f, 0.148883f, 0.138139f, 0.123963f, 0.107044f, 0.098600f, 0.095015f, 0.084669f, 0.075757f, 0.080895f, 0.078392f, 0.031664f, -0.052589f, -0.126934f, -0.162192f} + }, + { + { 1.032458f, 1.019232f, 1.055503f, 1.152346f, 1.264895f, 1.383916f, 1.512110f, 1.580287f, 1.524747f, 1.420851f, 1.394704f, 1.425779f, 1.386971f, 1.260446f, 1.155939f, 1.120555f, 1.085289f, 1.009371f, 0.935215f, 0.881823f, 0.810096f, 0.716819f, 0.656194f, 0.648528f, 0.657128f, 0.664016f, 0.684330f, 0.701881f, 0.671714f, 0.594887f, 0.522873f, 0.483118f, 0.457983f, 0.436517f, 0.432787f, 0.451700f, 0.481548f, 0.521185f, 0.579543f, 0.650119f, 0.713051f, 0.757998f, 0.785521f, 0.795209f, 0.789636f, 0.781137f, 0.782151f, 0.796868f, 0.827388f, 0.875753f, 0.935530f, 0.992686f, 1.036578f, 1.061213f, 1.059833f, 1.030025f, 0.980163f, 0.920722f, 0.854362f, 0.781629f, 0.707493f, 0.634976f, 0.561728f, 0.488448f, 0.420947f, 0.361366f, 0.308394f, 0.265774f, 0.238195f, 0.221960f, 0.212568f, 0.214004f, 0.226821f, 0.241055f, 0.257494f, 0.292604f, 0.336204f, 0.334653f, 0.260903f, 0.178438f}, + { 0.889328f, 0.746996f, 0.488378f, 0.194430f, -0.042359f, -0.205117f, -0.340122f, -0.454284f, -0.495140f, -0.447770f, -0.377268f, -0.341727f, -0.325720f, -0.297022f, -0.268715f, -0.254946f, -0.211569f, -0.078288f, 0.140726f, 0.376638f, 0.557395f, 0.642762f, 0.624635f, 0.526071f, 0.387689f, 0.235666f, 0.075552f, -0.077664f, -0.191603f, -0.251078f, -0.275106f, -0.287280f, -0.292024f, -0.288334f, -0.281437f, -0.269025f, -0.235621f, -0.170355f, -0.077550f, 0.031117f, 0.140203f, 0.228000f, 0.275992f, 0.281213f, 0.251542f, 0.196072f, 0.128119f, 0.066628f, 0.023837f, -0.001236f, -0.013179f, -0.014941f, -0.013424f, -0.016640f, -0.023836f, -0.029784f, -0.035699f, -0.044247f, -0.050866f, -0.052722f, -0.056962f, -0.068512f, -0.081828f, -0.094138f, -0.110312f, -0.126037f, -0.125656f, -0.103544f, -0.066475f, -0.013511f, 0.059218f, 0.135030f, 0.189944f, 0.225062f, 0.249597f, 0.241962f, 0.175370f, 0.075689f, 0.002323f, -0.024232f} + }, + { + { 0.889328f, 0.746996f, 0.488378f, 0.194430f, -0.042359f, -0.205117f, -0.340122f, -0.454284f, -0.495140f, -0.447770f, -0.377268f, -0.341727f, -0.325720f, -0.297022f, -0.268715f, -0.254946f, -0.211569f, -0.078288f, 0.140726f, 0.376638f, 0.557395f, 0.642762f, 0.624635f, 0.526071f, 0.387689f, 0.235666f, 0.075552f, -0.077664f, -0.191603f, -0.251078f, -0.275106f, -0.287280f, -0.292024f, -0.288334f, -0.281437f, -0.269025f, -0.235621f, -0.170355f, -0.077550f, 0.031117f, 0.140203f, 0.228000f, 0.275992f, 0.281213f, 0.251542f, 0.196072f, 0.128119f, 0.066628f, 0.023837f, -0.001236f, -0.013179f, -0.014941f, -0.013424f, -0.016640f, -0.023836f, -0.029784f, -0.035699f, -0.044247f, -0.050866f, -0.052722f, -0.056962f, -0.068512f, -0.081828f, -0.094138f, -0.110312f, -0.126037f, -0.125656f, -0.103544f, -0.066475f, -0.013511f, 0.059218f, 0.135030f, 0.189944f, 0.225062f, 0.249597f, 0.241962f, 0.175370f, 0.075689f, 0.002323f, -0.024232f}, + { 1.032458f, 1.019232f, 1.055503f, 1.152346f, 1.264895f, 1.383916f, 1.512110f, 1.580287f, 1.524747f, 1.420851f, 1.394704f, 1.425779f, 1.386971f, 1.260446f, 1.155939f, 1.120555f, 1.085289f, 1.009371f, 0.935215f, 0.881823f, 0.810096f, 0.716819f, 0.656194f, 0.648528f, 0.657128f, 0.664016f, 0.684330f, 0.701881f, 0.671714f, 0.594887f, 0.522873f, 0.483118f, 0.457983f, 0.436517f, 0.432787f, 0.451700f, 0.481548f, 0.521185f, 0.579543f, 0.650119f, 0.713051f, 0.757998f, 0.785521f, 0.795209f, 0.789636f, 0.781137f, 0.782151f, 0.796868f, 0.827388f, 0.875753f, 0.935530f, 0.992686f, 1.036578f, 1.061213f, 1.059833f, 1.030025f, 0.980163f, 0.920722f, 0.854362f, 0.781629f, 0.707493f, 0.634976f, 0.561728f, 0.488448f, 0.420947f, 0.361366f, 0.308394f, 0.265774f, 0.238195f, 0.221960f, 0.212568f, 0.214004f, 0.226821f, 0.241055f, 0.257494f, 0.292604f, 0.336204f, 0.334653f, 0.260903f, 0.178438f} + }, + { + { 1.158112f, 1.137057f, 1.174613f, 1.308407f, 1.475864f, 1.598510f, 1.664862f, 1.690093f, 1.651597f, 1.534827f, 1.406784f, 1.355852f, 1.365578f, 1.335480f, 1.236605f, 1.155816f, 1.155572f, 1.178545f, 1.145617f, 1.074884f, 1.034046f, 1.028410f, 1.011514f, 0.974296f, 0.951351f, 0.952791f, 0.951270f, 0.934033f, 0.920539f, 0.926929f, 0.947425f, 0.971010f, 0.990610f, 0.998330f, 0.992556f, 0.986782f, 0.996893f, 1.025270f, 1.066679f, 1.119066f, 1.178909f, 1.237203f, 1.288894f, 1.336531f, 1.379512f, 1.411025f, 1.429533f, 1.442089f, 1.453763f, 1.464108f, 1.474121f, 1.485855f, 1.495586f, 1.496799f, 1.487971f, 1.469903f, 1.440331f, 1.398591f, 1.349095f, 1.293717f, 1.228938f, 1.155645f, 1.081269f, 1.007672f, 0.929250f, 0.846598f, 0.767662f, 0.692536f, 0.613816f, 0.534651f, 0.467779f, 0.414464f, 0.365611f, 0.326004f, 0.311159f, 0.311495f, 0.285175f, 0.203678f, 0.091850f, 0.011559f}, + { 0.901656f, 0.675975f, 0.308472f, -0.078196f, -0.395054f, -0.619898f, -0.749461f, -0.745121f, -0.567593f, -0.256959f, 0.067459f, 0.299340f, 0.414342f, 0.446852f, 0.428396f, 0.363898f, 0.253318f, 0.116508f, -0.013083f, -0.117898f, -0.206372f, -0.284180f, -0.329308f, -0.314412f, -0.244304f, -0.149614f, -0.050276f, 0.051936f, 0.149545f, 0.222247f, 0.255380f, 0.249297f, 0.210511f, 0.146069f, 0.065487f, -0.020890f, -0.103702f, -0.170940f, -0.208945f, -0.211820f, -0.185220f, -0.139572f, -0.084250f, -0.026357f, 0.031102f, 0.087784f, 0.138807f, 0.173470f, 0.183734f, 0.167784f, 0.125449f, 0.059969f, -0.015648f, -0.084348f, -0.136303f, -0.166828f, -0.170290f, -0.147307f, -0.109984f, -0.069086f, -0.025167f, 0.020371f, 0.060146f, 0.093657f, 0.127308f, 0.156007f, 0.164553f, 0.148834f, 0.112994f, 0.050508f, -0.042163f, -0.140492f, -0.212717f, -0.251404f, -0.249732f, -0.178192f, -0.041065f, 0.077068f, 0.097809f, 0.059914f} + }, + { + { 0.901656f, 0.675975f, 0.308472f, -0.078196f, -0.395054f, -0.619898f, -0.749461f, -0.745121f, -0.567593f, -0.256959f, 0.067459f, 0.299340f, 0.414342f, 0.446852f, 0.428396f, 0.363898f, 0.253318f, 0.116508f, -0.013083f, -0.117898f, -0.206372f, -0.284180f, -0.329308f, -0.314412f, -0.244304f, -0.149614f, -0.050276f, 0.051936f, 0.149545f, 0.222247f, 0.255380f, 0.249297f, 0.210511f, 0.146069f, 0.065487f, -0.020890f, -0.103702f, -0.170940f, -0.208945f, -0.211820f, -0.185220f, -0.139572f, -0.084250f, -0.026357f, 0.031102f, 0.087784f, 0.138807f, 0.173470f, 0.183734f, 0.167784f, 0.125449f, 0.059969f, -0.015648f, -0.084348f, -0.136303f, -0.166828f, -0.170290f, -0.147307f, -0.109984f, -0.069086f, -0.025167f, 0.020371f, 0.060146f, 0.093657f, 0.127308f, 0.156007f, 0.164553f, 0.148834f, 0.112994f, 0.050508f, -0.042163f, -0.140492f, -0.212717f, -0.251404f, -0.249732f, -0.178192f, -0.041065f, 0.077068f, 0.097809f, 0.059914f}, + { 1.158112f, 1.137057f, 1.174613f, 1.308407f, 1.475864f, 1.598510f, 1.664862f, 1.690093f, 1.651597f, 1.534827f, 1.406784f, 1.355852f, 1.365578f, 1.335480f, 1.236605f, 1.155816f, 1.155572f, 1.178545f, 1.145617f, 1.074884f, 1.034046f, 1.028410f, 1.011514f, 0.974296f, 0.951351f, 0.952791f, 0.951270f, 0.934033f, 0.920539f, 0.926929f, 0.947425f, 0.971010f, 0.990610f, 0.998330f, 0.992556f, 0.986782f, 0.996893f, 1.025270f, 1.066679f, 1.119066f, 1.178909f, 1.237203f, 1.288894f, 1.336531f, 1.379512f, 1.411025f, 1.429533f, 1.442089f, 1.453763f, 1.464108f, 1.474121f, 1.485855f, 1.495586f, 1.496799f, 1.487971f, 1.469903f, 1.440331f, 1.398591f, 1.349095f, 1.293717f, 1.228938f, 1.155645f, 1.081269f, 1.007672f, 0.929250f, 0.846598f, 0.767662f, 0.692536f, 0.613816f, 0.534651f, 0.467779f, 0.414464f, 0.365611f, 0.326004f, 0.311159f, 0.311495f, 0.285175f, 0.203678f, 0.091850f, 0.011559f} + }, + { + { 1.235520f, 1.267745f, 1.311533f, 1.396643f, 1.562142f, 1.739490f, 1.797650f, 1.725448f, 1.645715f, 1.615047f, 1.544151f, 1.379627f, 1.231268f, 1.218112f, 1.292699f, 1.332906f, 1.328133f, 1.351971f, 1.406972f, 1.424922f, 1.397315f, 1.389969f, 1.427081f, 1.452470f, 1.417648f, 1.341339f, 1.270667f, 1.231859f, 1.225126f, 1.232539f, 1.230373f, 1.218536f, 1.230471f, 1.294017f, 1.394390f, 1.492369f, 1.564549f, 1.611356f, 1.640653f, 1.658539f, 1.668696f, 1.673718f, 1.680425f, 1.699615f, 1.733804f, 1.773278f, 1.810830f, 1.848659f, 1.885086f, 1.909496f, 1.915897f, 1.906449f, 1.879898f, 1.833243f, 1.773732f, 1.712413f, 1.650523f, 1.587448f, 1.531042f, 1.483778f, 1.433378f, 1.371553f, 1.302603f, 1.222332f, 1.114931f, 0.981061f, 0.839087f, 0.693154f, 0.535784f, 0.381622f, 0.254990f, 0.148531f, 0.043270f, -0.043620f, -0.091644f, -0.138174f, -0.231231f, -0.338131f, -0.386098f, -0.378792f}, + { 0.914782f, 0.650055f, 0.239576f, -0.181854f, -0.539073f, -0.787899f, -0.863032f, -0.709618f, -0.363410f, 0.045228f, 0.384901f, 0.599773f, 0.690085f, 0.654823f, 0.484709f, 0.199734f, -0.132928f, -0.424723f, -0.606004f, -0.647328f, -0.552997f, -0.344341f, -0.058161f, 0.242078f, 0.475279f, 0.581052f, 0.547396f, 0.398952f, 0.173288f, -0.082456f, -0.309870f, -0.456050f, -0.493427f, -0.421065f, -0.258435f, -0.045804f, 0.160944f, 0.310519f, 0.375222f, 0.353858f, 0.264124f, 0.133068f, -0.011592f, -0.144525f, -0.241005f, -0.281276f, -0.260926f, -0.191571f, -0.090994f, 0.020279f, 0.116661f, 0.176292f, 0.194091f, 0.177389f, 0.132627f, 0.066960f, -0.004147f, -0.064907f, -0.109797f, -0.136697f, -0.139536f, -0.117862f, -0.081864f, -0.039087f, 0.010472f, 0.060857f, 0.099437f, 0.123178f, 0.135545f, 0.127536f, 0.086281f, 0.020181f, -0.050211f, -0.116826f, -0.168642f, -0.170590f, -0.104626f, -0.017451f, 0.025994f, 0.025448f} + }, + { + { 0.914782f, 0.650055f, 0.239576f, -0.181854f, -0.539073f, -0.787899f, -0.863032f, -0.709618f, -0.363410f, 0.045228f, 0.384901f, 0.599773f, 0.690085f, 0.654823f, 0.484709f, 0.199734f, -0.132928f, -0.424723f, -0.606004f, -0.647328f, -0.552997f, -0.344341f, -0.058161f, 0.242078f, 0.475279f, 0.581052f, 0.547396f, 0.398952f, 0.173288f, -0.082456f, -0.309870f, -0.456050f, -0.493427f, -0.421065f, -0.258435f, -0.045804f, 0.160944f, 0.310519f, 0.375222f, 0.353858f, 0.264124f, 0.133068f, -0.011592f, -0.144525f, -0.241005f, -0.281276f, -0.260926f, -0.191571f, -0.090994f, 0.020279f, 0.116661f, 0.176292f, 0.194091f, 0.177389f, 0.132627f, 0.066960f, -0.004147f, -0.064907f, -0.109797f, -0.136697f, -0.139536f, -0.117862f, -0.081864f, -0.039087f, 0.010472f, 0.060857f, 0.099437f, 0.123178f, 0.135545f, 0.127536f, 0.086281f, 0.020181f, -0.050211f, -0.116826f, -0.168642f, -0.170590f, -0.104626f, -0.017451f, 0.025994f, 0.025448f}, + { 1.235520f, 1.267745f, 1.311533f, 1.396643f, 1.562142f, 1.739490f, 1.797650f, 1.725448f, 1.645715f, 1.615047f, 1.544151f, 1.379627f, 1.231268f, 1.218112f, 1.292699f, 1.332906f, 1.328133f, 1.351971f, 1.406972f, 1.424922f, 1.397315f, 1.389969f, 1.427081f, 1.452470f, 1.417648f, 1.341339f, 1.270667f, 1.231859f, 1.225126f, 1.232539f, 1.230373f, 1.218536f, 1.230471f, 1.294017f, 1.394390f, 1.492369f, 1.564549f, 1.611356f, 1.640653f, 1.658539f, 1.668696f, 1.673718f, 1.680425f, 1.699615f, 1.733804f, 1.773278f, 1.810830f, 1.848659f, 1.885086f, 1.909496f, 1.915897f, 1.906449f, 1.879898f, 1.833243f, 1.773732f, 1.712413f, 1.650523f, 1.587448f, 1.531042f, 1.483778f, 1.433378f, 1.371553f, 1.302603f, 1.222332f, 1.114931f, 0.981061f, 0.839087f, 0.693154f, 0.535784f, 0.381622f, 0.254990f, 0.148531f, 0.043270f, -0.043620f, -0.091644f, -0.138174f, -0.231231f, -0.338131f, -0.386098f, -0.378792f} + }, + { + { 1.300965f, 1.294750f, 1.282817f, 1.255178f, 1.204577f, 1.137923f, 1.059580f, 0.981805f, 0.966983f, 1.092308f, 1.337634f, 1.575073f, 1.703047f, 1.722782f, 1.666581f, 1.546456f, 1.403671f, 1.311746f, 1.292222f, 1.306949f, 1.348731f, 1.449654f, 1.589237f, 1.688195f, 1.707228f, 1.673858f, 1.615172f, 1.543456f, 1.497797f, 1.520390f, 1.597903f, 1.686893f, 1.778063f, 1.882324f, 1.981161f, 2.041271f, 2.055297f, 2.034562f, 1.988601f, 1.932387f, 1.883493f, 1.841147f, 1.794770f, 1.748405f, 1.709284f, 1.669343f, 1.625551f, 1.593305f, 1.576244f, 1.555177f, 1.523771f, 1.496823f, 1.475255f, 1.446578f, 1.418163f, 1.403084f, 1.385586f, 1.347706f, 1.304713f, 1.269256f, 1.221100f, 1.154593f, 1.100549f, 1.063945f, 1.009439f, 0.935611f, 0.877621f, 0.821786f, 0.720980f, 0.594304f, 0.491179f, 0.378481f, 0.204744f, 0.026392f, -0.103932f, -0.295951f, -0.642665f, -0.968133f, -1.033163f, -0.924785f}, + { 1.056881f, 0.977664f, 0.829309f, 0.609050f, 0.335194f, 0.103305f, 0.039580f, 0.170337f, 0.375031f, 0.482951f, 0.394424f, 0.127225f, -0.200288f, -0.435291f, -0.499884f, -0.452044f, -0.409762f, -0.428220f, -0.490681f, -0.586139f, -0.717818f, -0.842320f, -0.883008f, -0.823590f, -0.730446f, -0.667660f, -0.639081f, -0.620834f, -0.597634f, -0.552777f, -0.466079f, -0.338552f, -0.193325f, -0.050363f, 0.077475f, 0.174494f, 0.237020f, 0.288121f, 0.352285f, 0.426567f, 0.494946f, 0.552824f, 0.599792f, 0.629446f, 0.642872f, 0.651801f, 0.657595f, 0.648892f, 0.624781f, 0.595680f, 0.560679f, 0.509928f, 0.445668f, 0.375032f, 0.291050f, 0.186825f, 0.074986f, -0.031392f, -0.138355f, -0.249537f, -0.350061f, -0.432142f, -0.507157f, -0.576005f, -0.622512f, -0.647800f, -0.670394f, -0.686010f, -0.673194f, -0.637570f, -0.598466f, -0.542641f, -0.451741f, -0.353357f, -0.271891f, -0.162755f, 0.010957f, 0.173137f, 0.221085f, 0.187717f} + }, + { + { 1.056881f, 0.977664f, 0.829309f, 0.609050f, 0.335194f, 0.103305f, 0.039580f, 0.170337f, 0.375031f, 0.482951f, 0.394424f, 0.127225f, -0.200288f, -0.435291f, -0.499884f, -0.452044f, -0.409762f, -0.428220f, -0.490681f, -0.586139f, -0.717818f, -0.842320f, -0.883008f, -0.823590f, -0.730446f, -0.667660f, -0.639081f, -0.620834f, -0.597634f, -0.552777f, -0.466079f, -0.338552f, -0.193325f, -0.050363f, 0.077475f, 0.174494f, 0.237020f, 0.288121f, 0.352285f, 0.426567f, 0.494946f, 0.552824f, 0.599792f, 0.629446f, 0.642872f, 0.651801f, 0.657595f, 0.648892f, 0.624781f, 0.595680f, 0.560679f, 0.509928f, 0.445668f, 0.375032f, 0.291050f, 0.186825f, 0.074986f, -0.031392f, -0.138355f, -0.249537f, -0.350061f, -0.432142f, -0.507157f, -0.576005f, -0.622512f, -0.647800f, -0.670394f, -0.686010f, -0.673194f, -0.637570f, -0.598466f, -0.542641f, -0.451741f, -0.353357f, -0.271891f, -0.162755f, 0.010957f, 0.173137f, 0.221085f, 0.187717f}, + { 1.300965f, 1.294750f, 1.282817f, 1.255178f, 1.204577f, 1.137923f, 1.059580f, 0.981805f, 0.966983f, 1.092308f, 1.337634f, 1.575073f, 1.703047f, 1.722782f, 1.666581f, 1.546456f, 1.403671f, 1.311746f, 1.292222f, 1.306949f, 1.348731f, 1.449654f, 1.589237f, 1.688195f, 1.707228f, 1.673858f, 1.615172f, 1.543456f, 1.497797f, 1.520390f, 1.597903f, 1.686893f, 1.778063f, 1.882324f, 1.981161f, 2.041271f, 2.055297f, 2.034562f, 1.988601f, 1.932387f, 1.883493f, 1.841147f, 1.794770f, 1.748405f, 1.709284f, 1.669343f, 1.625551f, 1.593305f, 1.576244f, 1.555177f, 1.523771f, 1.496823f, 1.475255f, 1.446578f, 1.418163f, 1.403084f, 1.385586f, 1.347706f, 1.304713f, 1.269256f, 1.221100f, 1.154593f, 1.100549f, 1.063945f, 1.009439f, 0.935611f, 0.877621f, 0.821786f, 0.720980f, 0.594304f, 0.491179f, 0.378481f, 0.204744f, 0.026392f, -0.103932f, -0.295951f, -0.642665f, -0.968133f, -1.033163f, -0.924785f} + }, + { + { 1.199748f, 1.195187f, 1.219693f, 1.306113f, 1.425047f, 1.477111f, 1.397070f, 1.252223f, 1.172655f, 1.188882f, 1.217061f, 1.212048f, 1.238227f, 1.348679f, 1.484315f, 1.557633f, 1.567620f, 1.562073f, 1.542003f, 1.477405f, 1.379422f, 1.288860f, 1.216806f, 1.148467f, 1.083662f, 1.031921f, 0.988049f, 0.943225f, 0.900165f, 0.859424f, 0.815628f, 0.776796f, 0.758198f, 0.753004f, 0.739708f, 0.717133f, 0.701610f, 0.697315f, 0.699875f, 0.716105f, 0.750519f, 0.788979f, 0.821105f, 0.857164f, 0.902405f, 0.942513f, 0.970953f, 0.998437f, 1.023655f, 1.030364f, 1.020180f, 1.011394f, 1.006072f, 0.996138f, 0.992784f, 1.010311f, 1.036592f, 1.056629f, 1.080188f, 1.111608f, 1.127724f, 1.118163f, 1.103894f, 1.089439f, 1.050792f, 0.990760f, 0.941697f, 0.900735f, 0.836298f, 0.760105f, 0.706490f, 0.651720f, 0.554145f, 0.447475f, 0.372905f, 0.259179f, 0.022580f, -0.250587f, -0.394385f, -0.405028f}, + { 0.954653f, 0.811443f, 0.527050f, 0.156554f, -0.183229f, -0.390764f, -0.463838f, -0.489615f, -0.545649f, -0.618563f, -0.627603f, -0.522242f, -0.339179f, -0.156441f, -0.010199f, 0.122255f, 0.267483f, 0.411203f, 0.511742f, 0.538871f, 0.493820f, 0.403566f, 0.299556f, 0.194567f, 0.079866f, -0.051976f, -0.188907f, -0.309334f, -0.399390f, -0.451587f, -0.457014f, -0.410966f, -0.321563f, -0.205765f, -0.080962f, 0.037500f, 0.138072f, 0.215566f, 0.268025f, 0.292898f, 0.291211f, 0.270674f, 0.238281f, 0.194880f, 0.141481f, 0.083085f, 0.022016f, -0.043580f, -0.111370f, -0.174259f, -0.228801f, -0.273350f, -0.299289f, -0.296400f, -0.264810f, -0.210717f, -0.136124f, -0.044272f, 0.053064f, 0.144902f, 0.227652f, 0.293924f, 0.329277f, 0.328445f, 0.298807f, 0.243094f, 0.158591f, 0.055206f, -0.049168f, -0.149592f, -0.244281f, -0.312080f, -0.331894f, -0.311981f, -0.264235f, -0.173081f, -0.039856f, 0.070126f, 0.093737f, 0.064463f} + }, + { + { 0.954653f, 0.811443f, 0.527050f, 0.156554f, -0.183229f, -0.390764f, -0.463838f, -0.489615f, -0.545649f, -0.618563f, -0.627603f, -0.522242f, -0.339179f, -0.156441f, -0.010199f, 0.122255f, 0.267483f, 0.411203f, 0.511742f, 0.538871f, 0.493820f, 0.403566f, 0.299556f, 0.194567f, 0.079866f, -0.051976f, -0.188907f, -0.309334f, -0.399390f, -0.451587f, -0.457014f, -0.410966f, -0.321563f, -0.205765f, -0.080962f, 0.037500f, 0.138072f, 0.215566f, 0.268025f, 0.292898f, 0.291211f, 0.270674f, 0.238281f, 0.194880f, 0.141481f, 0.083085f, 0.022016f, -0.043580f, -0.111370f, -0.174259f, -0.228801f, -0.273350f, -0.299289f, -0.296400f, -0.264810f, -0.210717f, -0.136124f, -0.044272f, 0.053064f, 0.144902f, 0.227652f, 0.293924f, 0.329277f, 0.328445f, 0.298807f, 0.243094f, 0.158591f, 0.055206f, -0.049168f, -0.149592f, -0.244281f, -0.312080f, -0.331894f, -0.311981f, -0.264235f, -0.173081f, -0.039856f, 0.070126f, 0.093737f, 0.064463f}, + { 1.199748f, 1.195187f, 1.219693f, 1.306113f, 1.425047f, 1.477111f, 1.397070f, 1.252223f, 1.172655f, 1.188882f, 1.217061f, 1.212048f, 1.238227f, 1.348679f, 1.484315f, 1.557633f, 1.567620f, 1.562073f, 1.542003f, 1.477405f, 1.379422f, 1.288860f, 1.216806f, 1.148467f, 1.083662f, 1.031921f, 0.988049f, 0.943225f, 0.900165f, 0.859424f, 0.815628f, 0.776796f, 0.758198f, 0.753004f, 0.739708f, 0.717133f, 0.701610f, 0.697315f, 0.699875f, 0.716105f, 0.750519f, 0.788979f, 0.821105f, 0.857164f, 0.902405f, 0.942513f, 0.970953f, 0.998437f, 1.023655f, 1.030364f, 1.020180f, 1.011394f, 1.006072f, 0.996138f, 0.992784f, 1.010311f, 1.036592f, 1.056629f, 1.080188f, 1.111608f, 1.127724f, 1.118163f, 1.103894f, 1.089439f, 1.050792f, 0.990760f, 0.941697f, 0.900735f, 0.836298f, 0.760105f, 0.706490f, 0.651720f, 0.554145f, 0.447475f, 0.372905f, 0.259179f, 0.022580f, -0.250587f, -0.394385f, -0.405028f} + }, + { + { 1.095196f, 1.087659f, 1.109446f, 1.183526f, 1.277660f, 1.326248f, 1.295715f, 1.216113f, 1.140298f, 1.087599f, 1.047695f, 1.026918f, 1.054001f, 1.133020f, 1.223338f, 1.282899f, 1.305886f, 1.301427f, 1.264195f, 1.192277f, 1.112040f, 1.055091f, 1.021765f, 0.989986f, 0.948874f, 0.903167f, 0.855360f, 0.803610f, 0.750668f, 0.700093f, 0.649182f, 0.594756f, 0.538805f, 0.483071f, 0.427223f, 0.376166f, 0.339951f, 0.324096f, 0.327235f, 0.346493f, 0.377413f, 0.412489f, 0.447089f, 0.481805f, 0.514503f, 0.538815f, 0.554366f, 0.567855f, 0.581390f, 0.591629f, 0.600978f, 0.616082f, 0.635914f, 0.654604f, 0.672499f, 0.691101f, 0.703654f, 0.704072f, 0.696257f, 0.683064f, 0.659027f, 0.624315f, 0.589073f, 0.554838f, 0.511458f, 0.458475f, 0.405848f, 0.350815f, 0.282369f, 0.208212f, 0.145223f, 0.088601f, 0.027005f, -0.024496f, -0.052219f, -0.086724f, -0.160473f, -0.239945f, -0.266704f, -0.251269f}, + { 0.923781f, 0.848774f, 0.672610f, 0.407285f, 0.139533f, -0.031128f, -0.095513f, -0.144050f, -0.253242f, -0.392890f, -0.480646f, -0.501871f, -0.519927f, -0.573731f, -0.625609f, -0.624544f, -0.567395f, -0.473405f, -0.345515f, -0.190062f, -0.038979f, 0.081850f, 0.182290f, 0.280740f, 0.370828f, 0.437344f, 0.482403f, 0.514120f, 0.527356f, 0.512218f, 0.466630f, 0.391413f, 0.289373f, 0.174311f, 0.063977f, -0.037733f, -0.135747f, -0.224401f, -0.290520f, -0.330999f, -0.351174f, -0.353060f, -0.339776f, -0.321845f, -0.306033f, -0.288531f, -0.267741f, -0.249068f, -0.230297f, -0.198972f, -0.149214f, -0.084819f, -0.006186f, 0.086559f, 0.180387f, 0.259264f, 0.322166f, 0.373929f, 0.409115f, 0.422408f, 0.419773f, 0.402555f, 0.359218f, 0.287224f, 0.200865f, 0.107257f, 0.002147f, -0.104650f, -0.193281f, -0.265652f, -0.335513f, -0.391102f, -0.411622f, -0.408716f, -0.397569f, -0.345739f, -0.220230f, -0.069285f, 0.021400f, 0.041382f} + }, + { + { 0.923781f, 0.848774f, 0.672610f, 0.407285f, 0.139533f, -0.031128f, -0.095513f, -0.144050f, -0.253242f, -0.392890f, -0.480646f, -0.501871f, -0.519927f, -0.573731f, -0.625609f, -0.624544f, -0.567395f, -0.473405f, -0.345515f, -0.190062f, -0.038979f, 0.081850f, 0.182290f, 0.280740f, 0.370828f, 0.437344f, 0.482403f, 0.514120f, 0.527356f, 0.512218f, 0.466630f, 0.391413f, 0.289373f, 0.174311f, 0.063977f, -0.037733f, -0.135747f, -0.224401f, -0.290520f, -0.330999f, -0.351174f, -0.353060f, -0.339776f, -0.321845f, -0.306033f, -0.288531f, -0.267741f, -0.249068f, -0.230297f, -0.198972f, -0.149214f, -0.084819f, -0.006186f, 0.086559f, 0.180387f, 0.259264f, 0.322166f, 0.373929f, 0.409115f, 0.422408f, 0.419773f, 0.402555f, 0.359218f, 0.287224f, 0.200865f, 0.107257f, 0.002147f, -0.104650f, -0.193281f, -0.265652f, -0.335513f, -0.391102f, -0.411622f, -0.408716f, -0.397569f, -0.345739f, -0.220230f, -0.069285f, 0.021400f, 0.041382f}, + { 1.095196f, 1.087659f, 1.109446f, 1.183526f, 1.277660f, 1.326248f, 1.295715f, 1.216113f, 1.140298f, 1.087599f, 1.047695f, 1.026918f, 1.054001f, 1.133020f, 1.223338f, 1.282899f, 1.305886f, 1.301427f, 1.264195f, 1.192277f, 1.112040f, 1.055091f, 1.021765f, 0.989986f, 0.948874f, 0.903167f, 0.855360f, 0.803610f, 0.750668f, 0.700093f, 0.649182f, 0.594756f, 0.538805f, 0.483071f, 0.427223f, 0.376166f, 0.339951f, 0.324096f, 0.327235f, 0.346493f, 0.377413f, 0.412489f, 0.447089f, 0.481805f, 0.514503f, 0.538815f, 0.554366f, 0.567855f, 0.581390f, 0.591629f, 0.600978f, 0.616082f, 0.635914f, 0.654604f, 0.672499f, 0.691101f, 0.703654f, 0.704072f, 0.696257f, 0.683064f, 0.659027f, 0.624315f, 0.589073f, 0.554838f, 0.511458f, 0.458475f, 0.405848f, 0.350815f, 0.282369f, 0.208212f, 0.145223f, 0.088601f, 0.027005f, -0.024496f, -0.052219f, -0.086724f, -0.160473f, -0.239945f, -0.266704f, -0.251269f} + } +}; +const float CRendBin_Combined_HRIR_coeff_im_16kHz[15][BINAURAL_CHANNELS][80]={ + { + { 0.022378f, 0.066864f, 0.100220f, 0.093715f, 0.035070f, -0.024338f, -0.012768f, 0.042367f, 0.023721f, -0.077890f, -0.074274f, 0.183759f, 0.553809f, 0.747512f, 0.694343f, 0.587820f, 0.573964f, 0.578407f, 0.483568f, 0.304887f, 0.110523f, -0.095311f, -0.308826f, -0.445379f, -0.423336f, -0.274568f, -0.099040f, 0.048443f, 0.174236f, 0.289760f, 0.386501f, 0.441979f, 0.423813f, 0.311166f, 0.126234f, -0.077587f, -0.262644f, -0.422706f, -0.561257f, -0.680234f, -0.781458f, -0.857623f, -0.893951f, -0.894126f, -0.886249f, -0.891524f, -0.909393f, -0.938889f, -0.984242f, -1.033780f, -1.065068f, -1.075220f, -1.078048f, -1.075622f, -1.062402f, -1.047450f, -1.042480f, -1.042105f, -1.042212f, -1.056085f, -1.088475f, -1.122510f, -1.152405f, -1.192513f, -1.237398f, -1.256660f, -1.241724f, -1.209120f, -1.154430f, -1.061585f, -0.953719f, -0.867433f, -0.789453f, -0.695255f, -0.622912f, -0.610275f, -0.589097f, -0.460324f, -0.251406f, -0.070859f}, + { -0.080681f, -0.311575f, -0.606702f, -0.791121f, -0.800787f, -0.759923f, -0.737510f, -0.645040f, -0.446445f, -0.278883f, -0.277043f, -0.421529f, -0.620997f, -0.801710f, -0.864807f, -0.708809f, -0.372056f, -0.033461f, 0.190558f, 0.342379f, 0.477503f, 0.555106f, 0.541666f, 0.506512f, 0.528602f, 0.592193f, 0.649163f, 0.709906f, 0.795888f, 0.861129f, 0.839487f, 0.735222f, 0.600129f, 0.443934f, 0.230326f, -0.041733f, -0.304398f, -0.483776f, -0.569025f, -0.604499f, -0.631290f, -0.656305f, -0.671663f, -0.677909f, -0.675805f, -0.652694f, -0.596100f, -0.512689f, -0.417832f, -0.314565f, -0.198891f, -0.077460f, 0.036945f, 0.140466f, 0.234222f, 0.313941f, 0.376985f, 0.429901f, 0.476606f, 0.509493f, 0.521856f, 0.516234f, 0.492881f, 0.446350f, 0.381165f, 0.313562f, 0.251474f, 0.190729f, 0.133710f, 0.090238f, 0.058310f, 0.027284f, -0.000482f, -0.017253f, -0.035696f, -0.074905f, -0.120974f, -0.134483f, -0.099419f, -0.035389f} + }, + { + { -0.080681f, -0.311575f, -0.606702f, -0.791121f, -0.800787f, -0.759923f, -0.737510f, -0.645040f, -0.446445f, -0.278883f, -0.277043f, -0.421529f, -0.620997f, -0.801710f, -0.864807f, -0.708809f, -0.372056f, -0.033461f, 0.190558f, 0.342379f, 0.477503f, 0.555106f, 0.541666f, 0.506512f, 0.528602f, 0.592193f, 0.649163f, 0.709906f, 0.795888f, 0.861129f, 0.839487f, 0.735222f, 0.600129f, 0.443934f, 0.230326f, -0.041733f, -0.304398f, -0.483776f, -0.569025f, -0.604499f, -0.631290f, -0.656305f, -0.671663f, -0.677909f, -0.675805f, -0.652694f, -0.596100f, -0.512689f, -0.417832f, -0.314565f, -0.198891f, -0.077460f, 0.036945f, 0.140466f, 0.234222f, 0.313941f, 0.376985f, 0.429901f, 0.476606f, 0.509493f, 0.521856f, 0.516234f, 0.492881f, 0.446350f, 0.381165f, 0.313562f, 0.251474f, 0.190729f, 0.133710f, 0.090238f, 0.058310f, 0.027284f, -0.000482f, -0.017253f, -0.035696f, -0.074905f, -0.120974f, -0.134483f, -0.099419f, -0.035389f}, + { 0.022378f, 0.066864f, 0.100220f, 0.093715f, 0.035070f, -0.024338f, -0.012768f, 0.042367f, 0.023721f, -0.077890f, -0.074274f, 0.183759f, 0.553809f, 0.747512f, 0.694343f, 0.587820f, 0.573964f, 0.578407f, 0.483568f, 0.304887f, 0.110523f, -0.095311f, -0.308826f, -0.445379f, -0.423336f, -0.274568f, -0.099040f, 0.048443f, 0.174236f, 0.289760f, 0.386501f, 0.441979f, 0.423813f, 0.311166f, 0.126234f, -0.077587f, -0.262644f, -0.422706f, -0.561257f, -0.680234f, -0.781458f, -0.857623f, -0.893951f, -0.894126f, -0.886249f, -0.891524f, -0.909393f, -0.938889f, -0.984242f, -1.033780f, -1.065068f, -1.075220f, -1.078048f, -1.075622f, -1.062402f, -1.047450f, -1.042480f, -1.042105f, -1.042212f, -1.056085f, -1.088475f, -1.122510f, -1.152405f, -1.192513f, -1.237398f, -1.256660f, -1.241724f, -1.209120f, -1.154430f, -1.061585f, -0.953719f, -0.867433f, -0.789453f, -0.695255f, -0.622912f, -0.610275f, -0.589097f, -0.460324f, -0.251406f, -0.070859f} + }, + { + { 0.021476f, 0.024861f, -0.068116f, -0.210706f, -0.241100f, -0.094748f, 0.026510f, -0.099482f, -0.330829f, -0.276985f, 0.158539f, 0.598292f, 0.664270f, 0.429569f, 0.248929f, 0.287073f, 0.390113f, 0.351295f, 0.140379f, -0.125369f, -0.320323f, -0.389331f, -0.350352f, -0.257811f, -0.155492f, -0.057513f, 0.029687f, 0.083907f, 0.074937f, -0.013414f, -0.172122f, -0.367613f, -0.553803f, -0.697739f, -0.798279f, -0.871482f, -0.917974f, -0.917107f, -0.857095f, -0.759630f, -0.667061f, -0.611822f, -0.603464f, -0.635057f, -0.689467f, -0.744489f, -0.786319f, -0.818993f, -0.851830f, -0.880879f, -0.893605f, -0.887722f, -0.872310f, -0.853424f, -0.831447f, -0.809294f, -0.790708f, -0.773489f, -0.753887f, -0.732134f, -0.706732f, -0.673217f, -0.634788f, -0.600942f, -0.570621f, -0.533372f, -0.490462f, -0.454214f, -0.424442f, -0.389736f, -0.352307f, -0.323871f, -0.299518f, -0.268423f, -0.245492f, -0.252120f, -0.267604f, -0.242741f, -0.162571f, -0.055414f}, + { 0.021476f, 0.024861f, -0.068116f, -0.210706f, -0.241100f, -0.094748f, 0.026510f, -0.099482f, -0.330829f, -0.276985f, 0.158539f, 0.598292f, 0.664270f, 0.429569f, 0.248929f, 0.287073f, 0.390113f, 0.351295f, 0.140379f, -0.125369f, -0.320323f, -0.389331f, -0.350352f, -0.257811f, -0.155492f, -0.057513f, 0.029687f, 0.083907f, 0.074937f, -0.013414f, -0.172122f, -0.367613f, -0.553803f, -0.697739f, -0.798279f, -0.871482f, -0.917974f, -0.917107f, -0.857095f, -0.759630f, -0.667061f, -0.611822f, -0.603464f, -0.635057f, -0.689467f, -0.744489f, -0.786319f, -0.818993f, -0.851830f, -0.880879f, -0.893605f, -0.887722f, -0.872310f, -0.853424f, -0.831447f, -0.809294f, -0.790708f, -0.773489f, -0.753887f, -0.732134f, -0.706732f, -0.673217f, -0.634788f, -0.600942f, -0.570621f, -0.533372f, -0.490462f, -0.454214f, -0.424442f, -0.389736f, -0.352307f, -0.323871f, -0.299518f, -0.268423f, -0.245492f, -0.252120f, -0.267604f, -0.242741f, -0.162571f, -0.055414f} + }, + { + { 0.012550f, 0.067634f, 0.153766f, 0.208915f, 0.212582f, 0.181638f, 0.088456f, -0.087931f, -0.259740f, -0.322157f, -0.322103f, -0.389409f, -0.523465f, -0.602542f, -0.590922f, -0.578743f, -0.613891f, -0.643676f, -0.637605f, -0.633153f, -0.638458f, -0.606573f, -0.528838f, -0.456632f, -0.416245f, -0.387548f, -0.371313f, -0.393834f, -0.438762f, -0.449766f, -0.408723f, -0.349918f, -0.295796f, -0.234874f, -0.162960f, -0.095890f, -0.039645f, 0.012676f, 0.055074f, 0.071089f, 0.058963f, 0.031594f, -0.001372f, -0.033590f, -0.054377f, -0.056813f, -0.045737f, -0.029510f, -0.013991f, -0.008625f, -0.025610f, -0.068996f, -0.133912f, -0.214970f, -0.305196f, -0.391408f, -0.462418f, -0.517985f, -0.561601f, -0.591744f, -0.607334f, -0.612344f, -0.608226f, -0.591190f, -0.561003f, -0.522128f, -0.475155f, -0.418857f, -0.358993f, -0.302348f, -0.247114f, -0.192269f, -0.145964f, -0.109859f, -0.073493f, -0.044166f, -0.054356f, -0.104447f, -0.126755f, -0.059336f}, + { -0.170186f, -0.479342f, -0.686815f, -0.744803f, -0.686817f, -0.593855f, -0.492851f, -0.349481f, -0.167107f, -0.016808f, 0.057296f, 0.094634f, 0.145504f, 0.203344f, 0.251038f, 0.317878f, 0.433639f, 0.558726f, 0.610245f, 0.542010f, 0.369670f, 0.140805f, -0.089577f, -0.274767f, -0.397554f, -0.467654f, -0.489404f, -0.453378f, -0.367597f, -0.268088f, -0.183887f, -0.114096f, -0.048744f, 0.012366f, 0.071213f, 0.138060f, 0.214392f, 0.284810f, 0.331220f, 0.342296f, 0.310739f, 0.237599f, 0.139351f, 0.038916f, -0.047914f, -0.110918f, -0.141407f, -0.140257f, -0.121022f, -0.097260f, -0.074818f, -0.058184f, -0.051302f, -0.050167f, -0.047162f, -0.042256f, -0.038820f, -0.033860f, -0.024785f, -0.017581f, -0.015893f, -0.012525f, -0.002230f, 0.011304f, 0.029908f, 0.063841f, 0.112146f, 0.160147f, 0.200633f, 0.233829f, 0.246965f, 0.224183f, 0.174767f, 0.118281f, 0.049361f, -0.041130f, -0.119607f, -0.135637f, -0.090349f, -0.028741f} + }, + { + { -0.170186f, -0.479342f, -0.686815f, -0.744803f, -0.686817f, -0.593855f, -0.492851f, -0.349481f, -0.167107f, -0.016808f, 0.057296f, 0.094634f, 0.145504f, 0.203344f, 0.251038f, 0.317878f, 0.433639f, 0.558726f, 0.610245f, 0.542010f, 0.369670f, 0.140805f, -0.089577f, -0.274767f, -0.397554f, -0.467654f, -0.489404f, -0.453378f, -0.367597f, -0.268088f, -0.183887f, -0.114096f, -0.048744f, 0.012366f, 0.071213f, 0.138060f, 0.214392f, 0.284810f, 0.331220f, 0.342296f, 0.310739f, 0.237599f, 0.139351f, 0.038916f, -0.047914f, -0.110918f, -0.141407f, -0.140257f, -0.121022f, -0.097260f, -0.074818f, -0.058184f, -0.051302f, -0.050167f, -0.047162f, -0.042256f, -0.038820f, -0.033860f, -0.024785f, -0.017581f, -0.015893f, -0.012525f, -0.002230f, 0.011304f, 0.029908f, 0.063841f, 0.112146f, 0.160147f, 0.200633f, 0.233829f, 0.246965f, 0.224183f, 0.174767f, 0.118281f, 0.049361f, -0.041130f, -0.119607f, -0.135637f, -0.090349f, -0.028741f}, + { 0.012550f, 0.067634f, 0.153766f, 0.208915f, 0.212582f, 0.181638f, 0.088456f, -0.087931f, -0.259740f, -0.322157f, -0.322103f, -0.389409f, -0.523465f, -0.602542f, -0.590922f, -0.578743f, -0.613891f, -0.643676f, -0.637605f, -0.633153f, -0.638458f, -0.606573f, -0.528838f, -0.456632f, -0.416245f, -0.387548f, -0.371313f, -0.393834f, -0.438762f, -0.449766f, -0.408723f, -0.349918f, -0.295796f, -0.234874f, -0.162960f, -0.095890f, -0.039645f, 0.012676f, 0.055074f, 0.071089f, 0.058963f, 0.031594f, -0.001372f, -0.033590f, -0.054377f, -0.056813f, -0.045737f, -0.029510f, -0.013991f, -0.008625f, -0.025610f, -0.068996f, -0.133912f, -0.214970f, -0.305196f, -0.391408f, -0.462418f, -0.517985f, -0.561601f, -0.591744f, -0.607334f, -0.612344f, -0.608226f, -0.591190f, -0.561003f, -0.522128f, -0.475155f, -0.418857f, -0.358993f, -0.302348f, -0.247114f, -0.192269f, -0.145964f, -0.109859f, -0.073493f, -0.044166f, -0.054356f, -0.104447f, -0.126755f, -0.059336f} + }, + { + { 0.015207f, 0.082976f, 0.199626f, 0.282859f, 0.263873f, 0.164643f, 0.039240f, -0.101852f, -0.255135f, -0.362796f, -0.370418f, -0.325378f, -0.329716f, -0.393214f, -0.421530f, -0.368644f, -0.309548f, -0.318855f, -0.359634f, -0.355814f, -0.310990f, -0.281959f, -0.277523f, -0.258612f, -0.216166f, -0.181301f, -0.165545f, -0.145397f, -0.106504f, -0.062660f, -0.029709f, -0.010119f, -0.001929f, 0.000359f, 0.010822f, 0.040007f, 0.081478f, 0.121574f, 0.154115f, 0.176543f, 0.183358f, 0.173258f, 0.152571f, 0.124730f, 0.086728f, 0.040116f, -0.006130f, -0.047172f, -0.086178f, -0.125612f, -0.165320f, -0.208844f, -0.261164f, -0.321029f, -0.383783f, -0.448219f, -0.513294f, -0.573993f, -0.627582f, -0.676780f, -0.721051f, -0.754143f, -0.775079f, -0.790142f, -0.799884f, -0.797462f, -0.782973f, -0.763866f, -0.738491f, -0.696980f, -0.640957f, -0.582720f, -0.523012f, -0.453255f, -0.384196f, -0.344834f, -0.339145f, -0.323832f, -0.245458f, -0.092605f}, + { -0.226452f, -0.610474f, -0.819401f, -0.827692f, -0.686438f, -0.457267f, -0.161985f, 0.180520f, 0.492244f, 0.662493f, 0.643987f, 0.491123f, 0.296483f, 0.114481f, -0.047643f, -0.190865f, -0.298744f, -0.349852f, -0.344425f, -0.305636f, -0.249293f, -0.165753f, -0.046077f, 0.086344f, 0.191530f, 0.252611f, 0.278443f, 0.273750f, 0.231193f, 0.152001f, 0.053787f, -0.044048f, -0.129347f, -0.193281f, -0.229191f, -0.234673f, -0.209049f, -0.153181f, -0.075871f, 0.005780f, 0.076238f, 0.127944f, 0.159180f, 0.171718f, 0.168690f, 0.149525f, 0.110173f, 0.051594f, -0.017343f, -0.086655f, -0.147164f, -0.186425f, -0.193841f, -0.170433f, -0.125073f, -0.065012f, 0.000827f, 0.057616f, 0.095796f, 0.118697f, 0.130362f, 0.127750f, 0.111905f, 0.090197f, 0.060794f, 0.013835f, -0.047969f, -0.110704f, -0.169346f, -0.220565f, -0.242402f, -0.213355f, -0.142698f, -0.050054f, 0.062130f, 0.172554f, 0.213346f, 0.146844f, 0.042880f, -0.001215f} + }, + { + { -0.226452f, -0.610474f, -0.819401f, -0.827692f, -0.686438f, -0.457267f, -0.161985f, 0.180520f, 0.492244f, 0.662493f, 0.643987f, 0.491123f, 0.296483f, 0.114481f, -0.047643f, -0.190865f, -0.298744f, -0.349852f, -0.344425f, -0.305636f, -0.249293f, -0.165753f, -0.046077f, 0.086344f, 0.191530f, 0.252611f, 0.278443f, 0.273750f, 0.231193f, 0.152001f, 0.053787f, -0.044048f, -0.129347f, -0.193281f, -0.229191f, -0.234673f, -0.209049f, -0.153181f, -0.075871f, 0.005780f, 0.076238f, 0.127944f, 0.159180f, 0.171718f, 0.168690f, 0.149525f, 0.110173f, 0.051594f, -0.017343f, -0.086655f, -0.147164f, -0.186425f, -0.193841f, -0.170433f, -0.125073f, -0.065012f, 0.000827f, 0.057616f, 0.095796f, 0.118697f, 0.130362f, 0.127750f, 0.111905f, 0.090197f, 0.060794f, 0.013835f, -0.047969f, -0.110704f, -0.169346f, -0.220565f, -0.242402f, -0.213355f, -0.142698f, -0.050054f, 0.062130f, 0.172554f, 0.213346f, 0.146844f, 0.042880f, -0.001215f}, + { 0.015207f, 0.082976f, 0.199626f, 0.282859f, 0.263873f, 0.164643f, 0.039240f, -0.101852f, -0.255135f, -0.362796f, -0.370418f, -0.325378f, -0.329716f, -0.393214f, -0.421530f, -0.368644f, -0.309548f, -0.318855f, -0.359634f, -0.355814f, -0.310990f, -0.281959f, -0.277523f, -0.258612f, -0.216166f, -0.181301f, -0.165545f, -0.145397f, -0.106504f, -0.062660f, -0.029709f, -0.010119f, -0.001929f, 0.000359f, 0.010822f, 0.040007f, 0.081478f, 0.121574f, 0.154115f, 0.176543f, 0.183358f, 0.173258f, 0.152571f, 0.124730f, 0.086728f, 0.040116f, -0.006130f, -0.047172f, -0.086178f, -0.125612f, -0.165320f, -0.208844f, -0.261164f, -0.321029f, -0.383783f, -0.448219f, -0.513294f, -0.573993f, -0.627582f, -0.676780f, -0.721051f, -0.754143f, -0.775079f, -0.790142f, -0.799884f, -0.797462f, -0.782973f, -0.763866f, -0.738491f, -0.696980f, -0.640957f, -0.582720f, -0.523012f, -0.453255f, -0.384196f, -0.344834f, -0.339145f, -0.323832f, -0.245458f, -0.092605f} + }, + { + { 0.043874f, 0.118615f, 0.187170f, 0.267150f, 0.298762f, 0.195948f, -0.001786f, -0.150558f, -0.201169f, -0.249208f, -0.342968f, -0.379815f, -0.276823f, -0.123637f, -0.055321f, -0.064144f, -0.055372f, -0.019931f, -0.024681f, -0.071956f, -0.093125f, -0.072032f, -0.070681f, -0.124387f, -0.190477f, -0.213583f, -0.185140f, -0.129878f, -0.075285f, -0.037892f, -0.009897f, 0.037383f, 0.115172f, 0.192625f, 0.228584f, 0.214650f, 0.172116f, 0.122202f, 0.074293f, 0.031381f, -0.005454f, -0.033813f, -0.050480f, -0.060008f, -0.075967f, -0.106394f, -0.147540f, -0.197695f, -0.263287f, -0.345414f, -0.435440f, -0.527778f, -0.621378f, -0.708615f, -0.779992f, -0.837472f, -0.887412f, -0.928280f, -0.960992f, -0.998110f, -1.046834f, -1.099343f, -1.152347f, -1.213052f, -1.274952f, -1.316249f, -1.330774f, -1.328349f, -1.302567f, -1.238211f, -1.148431f, -1.058310f, -0.960029f, -0.838091f, -0.721675f, -0.643318f, -0.563976f, -0.420296f, -0.230992f, -0.067404f}, + { -0.250425f, -0.660993f, -0.861916f, -0.847354f, -0.663762f, -0.342769f, 0.075917f, 0.488389f, 0.753654f, 0.794167f, 0.643546f, 0.387442f, 0.087205f, -0.223353f, -0.496873f, -0.664962f, -0.675562f, -0.527061f, -0.266948f, 0.036108f, 0.319252f, 0.531415f, 0.626600f, 0.573077f, 0.380686f, 0.108230f, -0.168101f, -0.389333f, -0.517617f, -0.528794f, -0.421069f, -0.224730f, 0.009319f, 0.228421f, 0.385471f, 0.444687f, 0.395852f, 0.261516f, 0.084932f, -0.088913f, -0.225266f, -0.304256f, -0.319554f, -0.273259f, -0.175564f, -0.049060f, 0.075661f, 0.173276f, 0.228789f, 0.233471f, 0.188067f, 0.109495f, 0.022104f, -0.058067f, -0.122426f, -0.160617f, -0.165769f, -0.143482f, -0.103837f, -0.051510f, 0.007014f, 0.058136f, 0.093287f, 0.114398f, 0.120649f, 0.105501f, 0.071425f, 0.028778f, -0.021679f, -0.082945f, -0.140051f, -0.169785f, -0.167405f, -0.136951f, -0.070323f, 0.025342f, 0.097572f, 0.097658f, 0.048524f, 0.010072f} + }, + { + { -0.250425f, -0.660993f, -0.861916f, -0.847354f, -0.663762f, -0.342769f, 0.075917f, 0.488389f, 0.753654f, 0.794167f, 0.643546f, 0.387442f, 0.087205f, -0.223353f, -0.496873f, -0.664962f, -0.675562f, -0.527061f, -0.266948f, 0.036108f, 0.319252f, 0.531415f, 0.626600f, 0.573077f, 0.380686f, 0.108230f, -0.168101f, -0.389333f, -0.517617f, -0.528794f, -0.421069f, -0.224730f, 0.009319f, 0.228421f, 0.385471f, 0.444687f, 0.395852f, 0.261516f, 0.084932f, -0.088913f, -0.225266f, -0.304256f, -0.319554f, -0.273259f, -0.175564f, -0.049060f, 0.075661f, 0.173276f, 0.228789f, 0.233471f, 0.188067f, 0.109495f, 0.022104f, -0.058067f, -0.122426f, -0.160617f, -0.165769f, -0.143482f, -0.103837f, -0.051510f, 0.007014f, 0.058136f, 0.093287f, 0.114398f, 0.120649f, 0.105501f, 0.071425f, 0.028778f, -0.021679f, -0.082945f, -0.140051f, -0.169785f, -0.167405f, -0.136951f, -0.070323f, 0.025342f, 0.097572f, 0.097658f, 0.048524f, 0.010072f}, + { 0.043874f, 0.118615f, 0.187170f, 0.267150f, 0.298762f, 0.195948f, -0.001786f, -0.150558f, -0.201169f, -0.249208f, -0.342968f, -0.379815f, -0.276823f, -0.123637f, -0.055321f, -0.064144f, -0.055372f, -0.019931f, -0.024681f, -0.071956f, -0.093125f, -0.072032f, -0.070681f, -0.124387f, -0.190477f, -0.213583f, -0.185140f, -0.129878f, -0.075285f, -0.037892f, -0.009897f, 0.037383f, 0.115172f, 0.192625f, 0.228584f, 0.214650f, 0.172116f, 0.122202f, 0.074293f, 0.031381f, -0.005454f, -0.033813f, -0.050480f, -0.060008f, -0.075967f, -0.106394f, -0.147540f, -0.197695f, -0.263287f, -0.345414f, -0.435440f, -0.527778f, -0.621378f, -0.708615f, -0.779992f, -0.837472f, -0.887412f, -0.928280f, -0.960992f, -0.998110f, -1.046834f, -1.099343f, -1.152347f, -1.213052f, -1.274952f, -1.316249f, -1.330774f, -1.328349f, -1.302567f, -1.238211f, -1.148431f, -1.058310f, -0.960029f, -0.838091f, -0.721675f, -0.643318f, -0.563976f, -0.420296f, -0.230992f, -0.067404f} + }, + { + { -0.008249f, -0.023875f, -0.041979f, -0.063309f, -0.073640f, -0.059262f, -0.011284f, 0.097582f, 0.285477f, 0.486324f, 0.572624f, 0.491726f, 0.316227f, 0.137033f, -0.012156f, -0.105624f, -0.104202f, -0.021615f, 0.074402f, 0.154222f, 0.237747f, 0.305961f, 0.296964f, 0.204183f, 0.092769f, 0.012136f, -0.031471f, -0.026266f, 0.038678f, 0.126072f, 0.180148f, 0.192426f, 0.183756f, 0.147374f, 0.063045f, -0.057919f, -0.184667f, -0.299635f, -0.393907f, -0.460136f, -0.506533f, -0.549402f, -0.588487f, -0.616178f, -0.639266f, -0.663562f, -0.678297f, -0.681604f, -0.692468f, -0.716955f, -0.738071f, -0.751671f, -0.771237f, -0.794008f, -0.808030f, -0.825704f, -0.862898f, -0.903459f, -0.930585f, -0.960504f, -1.001446f, -1.027630f, -1.034152f, -1.055212f, -1.095329f, -1.119803f, -1.134174f, -1.178290f, -1.233939f, -1.250091f, -1.249470f, -1.280087f, -1.296222f, -1.243131f, -1.194568f, -1.207898f, -1.128089f, -0.791051f, -0.344783f, -0.068924f}, + { -0.129176f, -0.372355f, -0.580936f, -0.731519f, -0.765299f, -0.638093f, -0.415763f, -0.262408f, -0.304775f, -0.530180f, -0.811605f, -0.996409f, -0.988773f, -0.810534f, -0.593000f, -0.465223f, -0.444154f, -0.461572f, -0.469589f, -0.460057f, -0.404974f, -0.264243f, -0.062429f, 0.112893f, 0.209151f, 0.254875f, 0.300256f, 0.363823f, 0.447014f, 0.550411f, 0.657817f, 0.738504f, 0.775995f, 0.773071f, 0.734806f, 0.672431f, 0.612396f, 0.573088f, 0.541817f, 0.496000f, 0.432424f, 0.358322f, 0.274224f, 0.183255f, 0.096563f, 0.015492f, -0.070928f, -0.163303f, -0.249973f, -0.330065f, -0.412884f, -0.495910f, -0.569287f, -0.635706f, -0.699812f, -0.749341f, -0.772273f, -0.776809f, -0.771105f, -0.745172f, -0.694274f, -0.633019f, -0.567658f, -0.486467f, -0.391507f, -0.301919f, -0.216594f, -0.116973f, -0.009649f, 0.082575f, 0.165971f, 0.256392f, 0.331306f, 0.367070f, 0.395334f, 0.440161f, 0.436284f, 0.315312f, 0.139811f, 0.028354f} + }, + { + { -0.129176f, -0.372355f, -0.580936f, -0.731519f, -0.765299f, -0.638093f, -0.415763f, -0.262408f, -0.304775f, -0.530180f, -0.811605f, -0.996409f, -0.988773f, -0.810534f, -0.593000f, -0.465223f, -0.444154f, -0.461572f, -0.469589f, -0.460057f, -0.404974f, -0.264243f, -0.062429f, 0.112893f, 0.209151f, 0.254875f, 0.300256f, 0.363823f, 0.447014f, 0.550411f, 0.657817f, 0.738504f, 0.775995f, 0.773071f, 0.734806f, 0.672431f, 0.612396f, 0.573088f, 0.541817f, 0.496000f, 0.432424f, 0.358322f, 0.274224f, 0.183255f, 0.096563f, 0.015492f, -0.070928f, -0.163303f, -0.249973f, -0.330065f, -0.412884f, -0.495910f, -0.569287f, -0.635706f, -0.699812f, -0.749341f, -0.772273f, -0.776809f, -0.771105f, -0.745172f, -0.694274f, -0.633019f, -0.567658f, -0.486467f, -0.391507f, -0.301919f, -0.216594f, -0.116973f, -0.009649f, 0.082575f, 0.165971f, 0.256392f, 0.331306f, 0.367070f, 0.395334f, 0.440161f, 0.436284f, 0.315312f, 0.139811f, 0.028354f}, + { -0.008249f, -0.023875f, -0.041979f, -0.063309f, -0.073640f, -0.059262f, -0.011284f, 0.097582f, 0.285477f, 0.486324f, 0.572624f, 0.491726f, 0.316227f, 0.137033f, -0.012156f, -0.105624f, -0.104202f, -0.021615f, 0.074402f, 0.154222f, 0.237747f, 0.305961f, 0.296964f, 0.204183f, 0.092769f, 0.012136f, -0.031471f, -0.026266f, 0.038678f, 0.126072f, 0.180148f, 0.192426f, 0.183756f, 0.147374f, 0.063045f, -0.057919f, -0.184667f, -0.299635f, -0.393907f, -0.460136f, -0.506533f, -0.549402f, -0.588487f, -0.616178f, -0.639266f, -0.663562f, -0.678297f, -0.681604f, -0.692468f, -0.716955f, -0.738071f, -0.751671f, -0.771237f, -0.794008f, -0.808030f, -0.825704f, -0.862898f, -0.903459f, -0.930585f, -0.960504f, -1.001446f, -1.027630f, -1.034152f, -1.055212f, -1.095329f, -1.119803f, -1.134174f, -1.178290f, -1.233939f, -1.250091f, -1.249470f, -1.280087f, -1.296222f, -1.243131f, -1.194568f, -1.207898f, -1.128089f, -0.791051f, -0.344783f, -0.068924f} + }, + { + { 0.008075f, 0.038401f, 0.092119f, 0.128962f, 0.079637f, -0.065053f, -0.204165f, -0.224635f, -0.140768f, -0.066458f, -0.050504f, -0.028394f, 0.040936f, 0.088066f, 0.037282f, -0.081872f, -0.194521f, -0.289072f, -0.394663f, -0.499173f, -0.562874f, -0.584190f, -0.592102f, -0.595436f, -0.585667f, -0.568122f, -0.553640f, -0.538921f, -0.519114f, -0.497646f, -0.470495f, -0.428155f, -0.379841f, -0.345508f, -0.322485f, -0.290690f, -0.246286f, -0.199763f, -0.151541f, -0.099834f, -0.057672f, -0.034172f, -0.017802f, -0.000878f, 0.004292f, -0.008040f, -0.024761f, -0.042033f, -0.071452f, -0.109073f, -0.134965f, -0.146883f, -0.157322f, -0.162505f, -0.153258f, -0.144070f, -0.152591f, -0.170264f, -0.188683f, -0.224375f, -0.283614f, -0.342228f, -0.390085f, -0.447088f, -0.512027f, -0.555207f, -0.578613f, -0.614251f, -0.655544f, -0.670096f, -0.675523f, -0.709585f, -0.743735f, -0.735534f, -0.731747f, -0.782838f, -0.795910f, -0.638017f, -0.353740f, -0.100737f}, + { -0.185046f, -0.533405f, -0.796105f, -0.894228f, -0.804452f, -0.603356f, -0.412000f, -0.290027f, -0.194076f, -0.045276f, 0.170549f, 0.381975f, 0.509347f, 0.543373f, 0.533437f, 0.514324f, 0.470452f, 0.370026f, 0.210592f, 0.024650f, -0.144992f, -0.270937f, -0.353268f, -0.409676f, -0.449497f, -0.461092f, -0.428614f, -0.351647f, -0.241101f, -0.106882f, 0.039551f, 0.178574f, 0.289123f, 0.359025f, 0.385395f, 0.371418f, 0.325610f, 0.258144f, 0.176512f, 0.088334f, 0.004181f, -0.068701f, -0.130850f, -0.183510f, -0.223524f, -0.249431f, -0.263934f, -0.266307f, -0.251421f, -0.218401f, -0.170386f, -0.106369f, -0.025129f, 0.064373f, 0.148277f, 0.219795f, 0.275208f, 0.305623f, 0.304678f, 0.275767f, 0.221954f, 0.141085f, 0.039338f, -0.065853f, -0.163340f, -0.251323f, -0.320332f, -0.355470f, -0.356285f, -0.330135f, -0.270928f, -0.173746f, -0.060564f, 0.042406f, 0.135600f, 0.213726f, 0.231029f, 0.159392f, 0.057068f, 0.005821f} + }, + { + { -0.185046f, -0.533405f, -0.796105f, -0.894228f, -0.804452f, -0.603356f, -0.412000f, -0.290027f, -0.194076f, -0.045276f, 0.170549f, 0.381975f, 0.509347f, 0.543373f, 0.533437f, 0.514324f, 0.470452f, 0.370026f, 0.210592f, 0.024650f, -0.144992f, -0.270937f, -0.353268f, -0.409676f, -0.449497f, -0.461092f, -0.428614f, -0.351647f, -0.241101f, -0.106882f, 0.039551f, 0.178574f, 0.289123f, 0.359025f, 0.385395f, 0.371418f, 0.325610f, 0.258144f, 0.176512f, 0.088334f, 0.004181f, -0.068701f, -0.130850f, -0.183510f, -0.223524f, -0.249431f, -0.263934f, -0.266307f, -0.251421f, -0.218401f, -0.170386f, -0.106369f, -0.025129f, 0.064373f, 0.148277f, 0.219795f, 0.275208f, 0.305623f, 0.304678f, 0.275767f, 0.221954f, 0.141085f, 0.039338f, -0.065853f, -0.163340f, -0.251323f, -0.320332f, -0.355470f, -0.356285f, -0.330135f, -0.270928f, -0.173746f, -0.060564f, 0.042406f, 0.135600f, 0.213726f, 0.231029f, 0.159392f, 0.057068f, 0.005821f}, + { 0.008075f, 0.038401f, 0.092119f, 0.128962f, 0.079637f, -0.065053f, -0.204165f, -0.224635f, -0.140768f, -0.066458f, -0.050504f, -0.028394f, 0.040936f, 0.088066f, 0.037282f, -0.081872f, -0.194521f, -0.289072f, -0.394663f, -0.499173f, -0.562874f, -0.584190f, -0.592102f, -0.595436f, -0.585667f, -0.568122f, -0.553640f, -0.538921f, -0.519114f, -0.497646f, -0.470495f, -0.428155f, -0.379841f, -0.345508f, -0.322485f, -0.290690f, -0.246286f, -0.199763f, -0.151541f, -0.099834f, -0.057672f, -0.034172f, -0.017802f, -0.000878f, 0.004292f, -0.008040f, -0.024761f, -0.042033f, -0.071452f, -0.109073f, -0.134965f, -0.146883f, -0.157322f, -0.162505f, -0.153258f, -0.144070f, -0.152591f, -0.170264f, -0.188683f, -0.224375f, -0.283614f, -0.342228f, -0.390085f, -0.447088f, -0.512027f, -0.555207f, -0.578613f, -0.614251f, -0.655544f, -0.670096f, -0.675523f, -0.709585f, -0.743735f, -0.735534f, -0.731747f, -0.782838f, -0.795910f, -0.638017f, -0.353740f, -0.100737f} + }, + { + { 0.000904f, 0.019079f, 0.059553f, 0.080705f, 0.034196f, -0.076830f, -0.193142f, -0.258252f, -0.268806f, -0.254990f, -0.228184f, -0.177744f, -0.115561f, -0.086453f, -0.119832f, -0.198441f, -0.290706f, -0.386796f, -0.482507f, -0.555089f, -0.585391f, -0.588459f, -0.595614f, -0.616524f, -0.639482f, -0.657203f, -0.671485f, -0.681113f, -0.683039f, -0.679975f, -0.675099f, -0.665460f, -0.647607f, -0.621543f, -0.584847f, -0.532515f, -0.465996f, -0.394252f, -0.325482f, -0.264963f, -0.217691f, -0.185088f, -0.163233f, -0.150126f, -0.147912f, -0.154002f, -0.160060f, -0.163355f, -0.168022f, -0.173673f, -0.175655f, -0.176533f, -0.183744f, -0.197756f, -0.215649f, -0.241146f, -0.277541f, -0.318350f, -0.357489f, -0.397941f, -0.439603f, -0.473662f, -0.498885f, -0.525211f, -0.553450f, -0.573005f, -0.584023f, -0.595757f, -0.601812f, -0.587350f, -0.558307f, -0.529550f, -0.493088f, -0.438500f, -0.389008f, -0.365560f, -0.332967f, -0.244399f, -0.123587f, -0.032071f}, + { -0.132162f, -0.397236f, -0.634303f, -0.771385f, -0.762505f, -0.658311f, -0.571695f, -0.558140f, -0.559785f, -0.494070f, -0.367521f, -0.255768f, -0.188621f, -0.115450f, 0.010262f, 0.169458f, 0.319455f, 0.446157f, 0.546073f, 0.599271f, 0.595696f, 0.559582f, 0.517646f, 0.465704f, 0.389674f, 0.295832f, 0.197897f, 0.094666f, -0.019874f, -0.140220f, -0.255773f, -0.358086f, -0.435284f, -0.476549f, -0.485983f, -0.475938f, -0.447530f, -0.394402f, -0.321446f, -0.242452f, -0.164819f, -0.091592f, -0.029697f, 0.018115f, 0.059537f, 0.100122f, 0.136881f, 0.171477f, 0.213363f, 0.263443f, 0.310946f, 0.348805f, 0.374651f, 0.378869f, 0.352030f, 0.300800f, 0.237909f, 0.164126f, 0.077292f, -0.014164f, -0.104092f, -0.197998f, -0.293956f, -0.374701f, -0.431205f, -0.469564f, -0.486835f, -0.470926f, -0.428871f, -0.379532f, -0.318676f, -0.231739f, -0.133210f, -0.045037f, 0.047998f, 0.159994f, 0.240253f, 0.223460f, 0.130155f, 0.037254f} + }, + { + { -0.132162f, -0.397236f, -0.634303f, -0.771385f, -0.762505f, -0.658311f, -0.571695f, -0.558140f, -0.559785f, -0.494070f, -0.367521f, -0.255768f, -0.188621f, -0.115450f, 0.010262f, 0.169458f, 0.319455f, 0.446157f, 0.546073f, 0.599271f, 0.595696f, 0.559582f, 0.517646f, 0.465704f, 0.389674f, 0.295832f, 0.197897f, 0.094666f, -0.019874f, -0.140220f, -0.255773f, -0.358086f, -0.435284f, -0.476549f, -0.485983f, -0.475938f, -0.447530f, -0.394402f, -0.321446f, -0.242452f, -0.164819f, -0.091592f, -0.029697f, 0.018115f, 0.059537f, 0.100122f, 0.136881f, 0.171477f, 0.213363f, 0.263443f, 0.310946f, 0.348805f, 0.374651f, 0.378869f, 0.352030f, 0.300800f, 0.237909f, 0.164126f, 0.077292f, -0.014164f, -0.104092f, -0.197998f, -0.293956f, -0.374701f, -0.431205f, -0.469564f, -0.486835f, -0.470926f, -0.428871f, -0.379532f, -0.318676f, -0.231739f, -0.133210f, -0.045037f, 0.047998f, 0.159994f, 0.240253f, 0.223460f, 0.130155f, 0.037254f}, + { 0.000904f, 0.019079f, 0.059553f, 0.080705f, 0.034196f, -0.076830f, -0.193142f, -0.258252f, -0.268806f, -0.254990f, -0.228184f, -0.177744f, -0.115561f, -0.086453f, -0.119832f, -0.198441f, -0.290706f, -0.386796f, -0.482507f, -0.555089f, -0.585391f, -0.588459f, -0.595614f, -0.616524f, -0.639482f, -0.657203f, -0.671485f, -0.681113f, -0.683039f, -0.679975f, -0.675099f, -0.665460f, -0.647607f, -0.621543f, -0.584847f, -0.532515f, -0.465996f, -0.394252f, -0.325482f, -0.264963f, -0.217691f, -0.185088f, -0.163233f, -0.150126f, -0.147912f, -0.154002f, -0.160060f, -0.163355f, -0.168022f, -0.173673f, -0.175655f, -0.176533f, -0.183744f, -0.197756f, -0.215649f, -0.241146f, -0.277541f, -0.318350f, -0.357489f, -0.397941f, -0.439603f, -0.473662f, -0.498885f, -0.525211f, -0.553450f, -0.573005f, -0.584023f, -0.595757f, -0.601812f, -0.587350f, -0.558307f, -0.529550f, -0.493088f, -0.438500f, -0.389008f, -0.365560f, -0.332967f, -0.244399f, -0.123587f, -0.032071f} + } +}; +const float *CRendBin_Combined_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const float *CRendBin_Combined_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; + + + + +/********************** CRendBin_FOA_HRIR **********************/ + +const float CRendBin_FOA_HRIR_latency_s = 0.000020834f; + +/* Sample Rate = 48000 */ + +const int16_t CRendBin_FOA_HRIR_max_num_iterations_48kHz = 1; +const uint16_t CRendBin_FOA_HRIR_num_iterations_48kHz[4][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1} }; +const uint16_t CRendBin_FOA_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS] = {0, 0}; +const uint16_t CRendBin_FOA_HRIR_pIndex_frequency_max_48kHz[4][BINAURAL_CHANNELS][1]={{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}}}; +const uint16_t CRendBin_FOA_HRIR_index_frequency_max_diffuse_48kHz = 0; +const float CRendBin_FOA_HRIR_inv_diffuse_weight_48kHz[4]={0.000000f, 0.000000f, 0.000000f, 0.000000f}; +const uint16_t *CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const float CRendBin_FOA_HRIR_coeff_re_48kHz[4][BINAURAL_CHANNELS][240]={ + { + {0.966218f, 0.733332f, 0.371154f, 0.013886f, -0.255271f, -0.429740f, -0.543550f, -0.621345f, -0.659916f, -0.644001f, -0.568080f, -0.442479f, -0.285885f, -0.117060f, 0.048289f, 0.198155f, 0.325513f, 0.429363f, 0.513050f, 0.580002f, 0.630568f, 0.663334f, 0.679201f, 0.682684f, 0.678369f, 0.667227f, 0.647704f, 0.619700f, 0.585896f, 0.549425f, 0.511893f, 0.474018f, 0.436790f, 0.401079f, 0.366792f, 0.333238f, 0.300207f, 0.268253f, 0.237980f, 0.209327f, 0.181631f, 0.154220f, 0.126862f, 0.099653f, 0.072728f, 0.046213f, 0.020311f, -0.004833f, -0.029303f, -0.053269f, -0.076722f, -0.099506f, -0.121536f, -0.142793f, -0.163190f, -0.182595f, -0.200971f, -0.218400f, -0.234976f, -0.250747f, -0.265719f, -0.279920f, -0.293435f, -0.306316f, -0.318471f, -0.329791f, -0.340363f, -0.350414f, -0.360064f, -0.369343f, -0.378409f, -0.387487f, -0.396622f, -0.405768f, -0.415062f, -0.424742f, -0.434871f, -0.445428f, -0.456546f, -0.468369f, -0.480767f, -0.493503f, -0.506517f, -0.519763f, -0.532917f, -0.545542f, -0.557444f, -0.568682f, -0.579373f, -0.589605f, -0.599351f, -0.608366f, -0.616332f, -0.623173f, -0.629056f, -0.634137f, + -0.638497f, -0.642283f, -0.645662f, -0.648684f, -0.651369f, -0.653856f, -0.656358f, -0.659052f, -0.662067f, -0.665441f, -0.669082f, -0.672962f, -0.677320f, -0.682427f, -0.688193f, -0.694213f, -0.700145f, -0.705838f, -0.711215f, -0.716271f, -0.721089f, -0.725695f, -0.730008f, -0.734025f, -0.737880f, -0.741661f, -0.745353f, -0.748949f, -0.752427f, -0.755642f, -0.758483f, -0.761036f, -0.763409f, -0.765535f, -0.767317f, -0.768797f, -0.770037f, -0.771055f, -0.771976f, -0.773014f, -0.774208f, -0.775426f, -0.776630f, -0.777879f, -0.779146f, -0.780393f, -0.781721f, -0.783183f, -0.784625f, -0.785917f, -0.787109f, -0.788195f, -0.789049f, -0.789723f, -0.790445f, -0.791250f, -0.791985f, -0.792673f, -0.793450f, -0.794206f, -0.794720f, -0.795007f, -0.795162f, -0.795109f, -0.794841f, -0.794586f, -0.794452f, -0.794311f, -0.794201f, -0.794328f, -0.794586f, -0.794650f, -0.794553f, -0.794548f, -0.794548f, -0.794345f, -0.794130f, -0.794134f, -0.794153f, -0.793993f, -0.793868f, -0.793862f, -0.793701f, -0.793441f, -0.793538f, -0.793995f, -0.794422f, -0.794952f, -0.795989f, -0.797227f, -0.798155f, -0.799084f, -0.800408f, -0.801603f, -0.802279f, -0.803069f, + -0.804253f, -0.805010f, -0.805191f, -0.805803f, -0.806764f, -0.806769f, -0.806120f, -0.806405f, -0.806891f, -0.805335f, -0.802611f, -0.801532f, -0.801187f, -0.798575f, -0.795591f, -0.796825f, -0.800459f, -0.800016f, -0.795129f, -0.790229f, -0.782215f, -0.762867f, -0.737407f, -0.726767f, -0.742649f, -0.769892f, -0.782797f, -0.773088f, -0.754154f, -0.741924f, -0.738734f, -0.735957f, -0.729899f, -0.733260f, -0.765228f, -0.825366f, -0.883849f, -0.908419f, -0.898347f, -0.880383f, -0.873387f, -0.871922f, -0.866468f, -0.862326f, -0.868453f, -0.880014f, -0.885448f, -0.884194f}, + {0.966218f, 0.733332f, 0.371154f, 0.013886f, -0.255271f, -0.429740f, -0.543550f, -0.621345f, -0.659916f, -0.644001f, -0.568080f, -0.442479f, -0.285885f, -0.117060f, 0.048289f, 0.198155f, 0.325513f, 0.429363f, 0.513050f, 0.580002f, 0.630568f, 0.663334f, 0.679201f, 0.682684f, 0.678369f, 0.667227f, 0.647704f, 0.619700f, 0.585896f, 0.549425f, 0.511893f, 0.474018f, 0.436790f, 0.401079f, 0.366792f, 0.333238f, 0.300207f, 0.268253f, 0.237980f, 0.209327f, 0.181631f, 0.154220f, 0.126862f, 0.099653f, 0.072728f, 0.046213f, 0.020311f, -0.004833f, -0.029303f, -0.053269f, -0.076722f, -0.099506f, -0.121536f, -0.142793f, -0.163190f, -0.182595f, -0.200971f, -0.218400f, -0.234976f, -0.250747f, -0.265719f, -0.279920f, -0.293435f, -0.306316f, -0.318471f, -0.329791f, -0.340363f, -0.350414f, -0.360064f, -0.369343f, -0.378409f, -0.387487f, -0.396622f, -0.405768f, -0.415062f, -0.424742f, -0.434871f, -0.445428f, -0.456546f, -0.468369f, -0.480767f, -0.493503f, -0.506517f, -0.519763f, -0.532917f, -0.545542f, -0.557444f, -0.568682f, -0.579373f, -0.589605f, -0.599351f, -0.608366f, -0.616332f, -0.623173f, -0.629056f, -0.634137f, + -0.638497f, -0.642283f, -0.645662f, -0.648684f, -0.651369f, -0.653856f, -0.656358f, -0.659052f, -0.662067f, -0.665441f, -0.669082f, -0.672962f, -0.677320f, -0.682427f, -0.688193f, -0.694213f, -0.700145f, -0.705838f, -0.711215f, -0.716271f, -0.721089f, -0.725695f, -0.730008f, -0.734025f, -0.737880f, -0.741661f, -0.745353f, -0.748949f, -0.752427f, -0.755642f, -0.758483f, -0.761036f, -0.763409f, -0.765535f, -0.767317f, -0.768797f, -0.770037f, -0.771055f, -0.771976f, -0.773014f, -0.774208f, -0.775426f, -0.776630f, -0.777879f, -0.779146f, -0.780393f, -0.781721f, -0.783183f, -0.784625f, -0.785917f, -0.787109f, -0.788195f, -0.789049f, -0.789723f, -0.790445f, -0.791250f, -0.791985f, -0.792673f, -0.793450f, -0.794206f, -0.794720f, -0.795007f, -0.795162f, -0.795109f, -0.794841f, -0.794586f, -0.794452f, -0.794311f, -0.794201f, -0.794328f, -0.794586f, -0.794650f, -0.794553f, -0.794548f, -0.794548f, -0.794345f, -0.794130f, -0.794134f, -0.794153f, -0.793993f, -0.793868f, -0.793862f, -0.793701f, -0.793441f, -0.793538f, -0.793995f, -0.794422f, -0.794952f, -0.795989f, -0.797227f, -0.798155f, -0.799084f, -0.800408f, -0.801603f, -0.802279f, -0.803069f, + -0.804253f, -0.805010f, -0.805191f, -0.805803f, -0.806764f, -0.806769f, -0.806120f, -0.806405f, -0.806891f, -0.805335f, -0.802611f, -0.801532f, -0.801187f, -0.798575f, -0.795591f, -0.796825f, -0.800459f, -0.800016f, -0.795129f, -0.790229f, -0.782215f, -0.762867f, -0.737407f, -0.726767f, -0.742649f, -0.769892f, -0.782797f, -0.773088f, -0.754154f, -0.741924f, -0.738734f, -0.735957f, -0.729899f, -0.733260f, -0.765228f, -0.825366f, -0.883849f, -0.908419f, -0.898347f, -0.880383f, -0.873387f, -0.871922f, -0.866468f, -0.862326f, -0.868453f, -0.880014f, -0.885448f, -0.884194f} + }, + { + {0.069530f, 0.352738f, 0.714280f, 0.885288f, 0.713446f, 0.249298f, -0.318649f, -0.806052f, -1.124658f, -1.273893f, -1.286408f, -1.194906f, -1.028517f, -0.813598f, -0.570832f, -0.316123f, -0.064436f, 0.170206f, 0.377639f, 0.553010f, 0.696908f, 0.814493f, 0.911484f, 0.989435f, 1.046484f, 1.082848f, 1.103173f, 1.113184f, 1.116310f, 1.113920f, 1.106470f, 1.093611f, 1.074757f, 1.050402f, 1.022191f, 0.991595f, 0.959051f, 0.924074f, 0.885689f, 0.843261f, 0.797446f, 0.750023f, 0.702554f, 0.655685f, 0.609659f, 0.564706f, 0.520834f, 0.477976f, 0.436490f, 0.396954f, 0.359480f, 0.323618f, 0.288809f, 0.254673f, 0.221164f, 0.188708f, 0.157916f, 0.129070f, 0.102244f, 0.077759f, 0.055883f, 0.036223f, 0.018124f, 0.001473f, -0.013588f, -0.027502f, -0.041003f, -0.054210f, -0.066807f, -0.078910f, -0.090976f, -0.103076f, -0.114988f, -0.126900f, -0.139348f, -0.152546f, -0.166308f, -0.180589f, -0.195635f, -0.211564f, -0.228146f, -0.245089f, -0.262373f, -0.280192f, -0.298603f, -0.317350f, -0.336088f, -0.354672f, -0.373219f, -0.392122f, -0.412082f, -0.433737f, -0.456989f, -0.480976f, -0.504974f, -0.528975f, + -0.553152f, -0.577124f, -0.600047f, -0.621125f, -0.639881f, -0.656290f, -0.670723f, -0.683391f, -0.693803f, -0.701164f, -0.705315f, -0.706891f, -0.706661f, -0.705140f, -0.702740f, -0.699905f, -0.697104f, -0.694822f, -0.693380f, -0.692694f, -0.692541f, -0.693119f, -0.694952f, -0.698257f, -0.702754f, -0.707981f, -0.713393f, -0.718373f, -0.722645f, -0.726500f, -0.730288f, -0.733956f, -0.737383f, -0.740707f, -0.744006f, -0.747044f, -0.749626f, -0.751802f, -0.753644f, -0.755218f, -0.756809f, -0.758751f, -0.761058f, -0.763556f, -0.766202f, -0.768999f, -0.771906f, -0.775076f, -0.778852f, -0.783366f, -0.788481f, -0.794119f, -0.800196f, -0.806401f, -0.812542f, -0.818875f, -0.825636f, -0.832649f, -0.839808f, -0.847342f, -0.855190f, -0.862784f, -0.869788f, -0.876325f, -0.882332f, -0.887508f, -0.891946f, -0.895972f, -0.899482f, -0.902212f, -0.904315f, -0.905931f, -0.906830f, -0.907099f, -0.907371f, -0.907866f, -0.908254f, -0.908692f, -0.909708f, -0.910961f, -0.911524f, -0.911241f, -0.910472f, -0.909066f, -0.906977f, -0.904953f, -0.903361f, -0.901613f, -0.899703f, -0.898494f, -0.897842f, -0.896702f, -0.895299f, -0.894642f, -0.894316f, -0.893517f, + -0.893003f, -0.893248f, -0.893094f, -0.892684f, -0.893769f, -0.895229f, -0.894416f, -0.893811f, -0.897241f, -0.900009f, -0.896265f, -0.894143f, -0.903468f, -0.910502f, -0.893479f, -0.864358f, -0.859282f, -0.881749f, -0.897594f, -0.897013f, -0.910837f, -0.943680f, -0.945397f, -0.885614f, -0.810842f, -0.785450f, -0.810782f, -0.840026f, -0.841958f, -0.818240f, -0.787351f, -0.773027f, -0.771807f, -0.719767f, -0.550609f, -0.313730f, -0.167709f, -0.207926f, -0.353731f, -0.457636f, -0.477010f, -0.476826f, -0.500626f, -0.512220f, -0.460719f, -0.349140f, -0.228045f, -0.152067f}, + {-0.069530f, -0.352738f, -0.714280f, -0.885288f, -0.713446f, -0.249298f, 0.318649f, 0.806052f, 1.124658f, 1.273893f, 1.286408f, 1.194906f, 1.028517f, 0.813598f, 0.570832f, 0.316123f, 0.064436f, -0.170206f, -0.377639f, -0.553010f, -0.696908f, -0.814493f, -0.911484f, -0.989435f, -1.046484f, -1.082848f, -1.103173f, -1.113184f, -1.116310f, -1.113920f, -1.106470f, -1.093611f, -1.074757f, -1.050402f, -1.022191f, -0.991595f, -0.959051f, -0.924074f, -0.885689f, -0.843261f, -0.797446f, -0.750023f, -0.702554f, -0.655685f, -0.609659f, -0.564706f, -0.520834f, -0.477976f, -0.436490f, -0.396954f, -0.359480f, -0.323618f, -0.288809f, -0.254673f, -0.221164f, -0.188708f, -0.157916f, -0.129070f, -0.102244f, -0.077759f, -0.055883f, -0.036223f, -0.018124f, -0.001473f, 0.013588f, 0.027502f, 0.041003f, 0.054210f, 0.066807f, 0.078910f, 0.090976f, 0.103076f, 0.114988f, 0.126900f, 0.139348f, 0.152546f, 0.166308f, 0.180589f, 0.195635f, 0.211564f, 0.228146f, 0.245089f, 0.262373f, 0.280192f, 0.298603f, 0.317350f, 0.336088f, 0.354672f, 0.373219f, 0.392122f, 0.412082f, 0.433737f, 0.456989f, 0.480976f, 0.504974f, 0.528975f, + 0.553152f, 0.577124f, 0.600047f, 0.621125f, 0.639881f, 0.656290f, 0.670723f, 0.683391f, 0.693803f, 0.701164f, 0.705315f, 0.706891f, 0.706661f, 0.705140f, 0.702740f, 0.699905f, 0.697104f, 0.694822f, 0.693380f, 0.692694f, 0.692541f, 0.693119f, 0.694952f, 0.698257f, 0.702754f, 0.707981f, 0.713393f, 0.718373f, 0.722645f, 0.726500f, 0.730288f, 0.733956f, 0.737383f, 0.740707f, 0.744006f, 0.747044f, 0.749626f, 0.751802f, 0.753644f, 0.755218f, 0.756809f, 0.758751f, 0.761058f, 0.763556f, 0.766202f, 0.768999f, 0.771906f, 0.775076f, 0.778852f, 0.783366f, 0.788481f, 0.794119f, 0.800196f, 0.806401f, 0.812542f, 0.818875f, 0.825636f, 0.832649f, 0.839808f, 0.847342f, 0.855190f, 0.862784f, 0.869788f, 0.876325f, 0.882332f, 0.887508f, 0.891946f, 0.895972f, 0.899482f, 0.902212f, 0.904315f, 0.905931f, 0.906830f, 0.907099f, 0.907371f, 0.907866f, 0.908254f, 0.908692f, 0.909708f, 0.910961f, 0.911524f, 0.911241f, 0.910472f, 0.909066f, 0.906977f, 0.904953f, 0.903361f, 0.901613f, 0.899703f, 0.898494f, 0.897842f, 0.896702f, 0.895299f, 0.894642f, 0.894316f, 0.893517f, + 0.893003f, 0.893248f, 0.893094f, 0.892684f, 0.893769f, 0.895229f, 0.894416f, 0.893811f, 0.897241f, 0.900009f, 0.896265f, 0.894143f, 0.903468f, 0.910502f, 0.893479f, 0.864358f, 0.859282f, 0.881749f, 0.897594f, 0.897013f, 0.910837f, 0.943680f, 0.945397f, 0.885614f, 0.810842f, 0.785450f, 0.810782f, 0.840026f, 0.841958f, 0.818240f, 0.787351f, 0.773027f, 0.771807f, 0.719767f, 0.550609f, 0.313730f, 0.167709f, 0.207926f, 0.353731f, 0.457636f, 0.477010f, 0.476826f, 0.500626f, 0.512220f, 0.460719f, 0.349140f, 0.228045f, 0.152067f} + }, + { + {0.111800f, 0.092661f, 0.019679f, -0.084828f, -0.131610f, -0.075720f, 0.020947f, 0.070804f, 0.057095f, 0.017174f, -0.024764f, -0.063473f, -0.081887f, -0.063680f, -0.026483f, -0.005095f, -0.004637f, 0.001937f, 0.032512f, 0.076614f, 0.117317f, 0.150397f, 0.176796f, 0.192008f, 0.191179f, 0.177643f, 0.160955f, 0.148604f, 0.140863f, 0.132054f, 0.116684f, 0.094872f, 0.071200f, 0.049422f, 0.031033f, 0.018196f, 0.014048f, 0.019156f, 0.030249f, 0.043163f, 0.055421f, 0.066053f, 0.074723f, 0.081336f, 0.085615f, 0.087194f, 0.086271f, 0.083351f, 0.078080f, 0.069159f, 0.055488f, 0.036660f, 0.012659f, -0.016143f, -0.049048f, -0.085606f, -0.125572f, -0.168143f, -0.212165f, -0.257142f, -0.302871f, -0.348257f, -0.391847f, -0.433166f, -0.472058f, -0.507229f, -0.537018f, -0.560983f, -0.579257f, -0.591157f, -0.595846f, -0.593435f, -0.584148f, -0.567609f, -0.544156f, -0.515516f, -0.482987f, -0.446431f, -0.406289f, -0.365128f, -0.325668f, -0.288357f, -0.252382f, -0.218489f, -0.189259f, -0.166273f, -0.148047f, -0.131878f, -0.117566f, -0.107866f, -0.104589f, -0.105701f, -0.107613f, -0.109110f, -0.111389f, -0.115264f, + -0.120183f, -0.125324f, -0.129915f, -0.132847f, -0.133281f, -0.131381f, -0.127775f, -0.122673f, -0.115742f, -0.106161f, -0.092976f, -0.076359f, -0.058245f, -0.040715f, -0.024211f, -0.008209f, 0.007258f, 0.021783f, 0.035256f, 0.047287f, 0.056855f, 0.063257f, 0.066479f, 0.066398f, 0.062795f, 0.056194f, 0.047396f, 0.036403f, 0.022988f, 0.007826f, -0.008088f, -0.024369f, -0.040627f, -0.056023f, -0.070170f, -0.083234f, -0.094733f, -0.103775f, -0.110653f, -0.116618f, -0.122314f, -0.128068f, -0.134857f, -0.143057f, -0.151192f, -0.157728f, -0.162866f, -0.167154f, -0.170084f, -0.171405f, -0.171850f, -0.171588f, -0.169994f, -0.167442f, -0.165063f, -0.162823f, -0.160119f, -0.157592f, -0.156017f, -0.154586f, -0.152457f, -0.150257f, -0.148223f, -0.145186f, -0.140883f, -0.136504f, -0.132024f, -0.126153f, -0.119172f, -0.112453f, -0.105722f, -0.098322f, -0.091699f, -0.087128f, -0.083245f, -0.079038f, -0.075972f, -0.074448f, -0.072364f, -0.069148f, -0.066198f, -0.062479f, -0.055594f, -0.046807f, -0.038577f, -0.029196f, -0.016675f, -0.003950f, 0.006731f, 0.018542f, 0.032724f, 0.044915f, 0.054264f, 0.065298f, 0.077171f, 0.084883f, + 0.091733f, 0.103322f, 0.113002f, 0.114742f, 0.120485f, 0.137595f, 0.147068f, 0.139282f, 0.143207f, 0.172839f, 0.184844f, 0.156538f, 0.155945f, 0.236396f, 0.307519f, 0.240925f, 0.079148f, -0.007414f, 0.032856f, 0.086859f, 0.091724f, 0.123044f, 0.215138f, 0.257298f, 0.162344f, 0.014559f, -0.050405f, -0.023988f, 0.006360f, -0.000879f, -0.010258f, 0.021849f, 0.100940f, 0.184008f, 0.193280f, 0.089909f, -0.050182f, -0.095653f, -0.016073f, 0.083366f, 0.106152f, 0.075547f, 0.065316f, 0.083957f, 0.084840f, 0.051826f, 0.014987f, -0.002403f}, + {0.111800f, 0.092661f, 0.019679f, -0.084828f, -0.131610f, -0.075720f, 0.020947f, 0.070804f, 0.057095f, 0.017174f, -0.024764f, -0.063473f, -0.081887f, -0.063680f, -0.026483f, -0.005095f, -0.004637f, 0.001937f, 0.032512f, 0.076614f, 0.117317f, 0.150397f, 0.176796f, 0.192008f, 0.191179f, 0.177643f, 0.160955f, 0.148604f, 0.140863f, 0.132054f, 0.116684f, 0.094872f, 0.071200f, 0.049422f, 0.031033f, 0.018196f, 0.014048f, 0.019156f, 0.030249f, 0.043163f, 0.055421f, 0.066053f, 0.074723f, 0.081336f, 0.085615f, 0.087194f, 0.086271f, 0.083351f, 0.078080f, 0.069159f, 0.055488f, 0.036660f, 0.012659f, -0.016143f, -0.049048f, -0.085606f, -0.125572f, -0.168143f, -0.212165f, -0.257142f, -0.302871f, -0.348257f, -0.391847f, -0.433166f, -0.472058f, -0.507229f, -0.537018f, -0.560983f, -0.579257f, -0.591157f, -0.595846f, -0.593435f, -0.584148f, -0.567609f, -0.544156f, -0.515516f, -0.482987f, -0.446431f, -0.406289f, -0.365128f, -0.325668f, -0.288357f, -0.252382f, -0.218489f, -0.189259f, -0.166273f, -0.148047f, -0.131878f, -0.117566f, -0.107866f, -0.104589f, -0.105701f, -0.107613f, -0.109110f, -0.111389f, -0.115264f, + -0.120183f, -0.125324f, -0.129915f, -0.132847f, -0.133281f, -0.131381f, -0.127775f, -0.122673f, -0.115742f, -0.106161f, -0.092976f, -0.076359f, -0.058245f, -0.040715f, -0.024211f, -0.008209f, 0.007258f, 0.021783f, 0.035256f, 0.047287f, 0.056855f, 0.063257f, 0.066479f, 0.066398f, 0.062795f, 0.056194f, 0.047396f, 0.036403f, 0.022988f, 0.007826f, -0.008088f, -0.024369f, -0.040627f, -0.056023f, -0.070170f, -0.083234f, -0.094733f, -0.103775f, -0.110653f, -0.116618f, -0.122314f, -0.128068f, -0.134857f, -0.143057f, -0.151192f, -0.157728f, -0.162866f, -0.167154f, -0.170084f, -0.171405f, -0.171850f, -0.171588f, -0.169994f, -0.167442f, -0.165063f, -0.162823f, -0.160119f, -0.157592f, -0.156017f, -0.154586f, -0.152457f, -0.150257f, -0.148223f, -0.145186f, -0.140883f, -0.136504f, -0.132024f, -0.126153f, -0.119172f, -0.112453f, -0.105722f, -0.098322f, -0.091699f, -0.087128f, -0.083245f, -0.079038f, -0.075972f, -0.074448f, -0.072364f, -0.069148f, -0.066198f, -0.062479f, -0.055594f, -0.046807f, -0.038577f, -0.029196f, -0.016675f, -0.003950f, 0.006731f, 0.018542f, 0.032724f, 0.044915f, 0.054264f, 0.065298f, 0.077171f, 0.084883f, + 0.091733f, 0.103322f, 0.113002f, 0.114742f, 0.120485f, 0.137595f, 0.147068f, 0.139282f, 0.143207f, 0.172839f, 0.184844f, 0.156538f, 0.155945f, 0.236396f, 0.307519f, 0.240925f, 0.079148f, -0.007414f, 0.032856f, 0.086859f, 0.091724f, 0.123044f, 0.215138f, 0.257298f, 0.162344f, 0.014559f, -0.050405f, -0.023988f, 0.006360f, -0.000879f, -0.010258f, 0.021849f, 0.100940f, 0.184008f, 0.193280f, 0.089909f, -0.050182f, -0.095653f, -0.016073f, 0.083366f, 0.106152f, 0.075547f, 0.065316f, 0.083957f, 0.084840f, 0.051826f, 0.014987f, -0.002403f} + }, + { + {0.059457f, 0.085936f, 0.085241f, 0.027833f, -0.043944f, -0.063521f, -0.019521f, 0.033320f, 0.036813f, -0.016068f, -0.088274f, -0.140585f, -0.158479f, -0.151114f, -0.137138f, -0.128832f, -0.122444f, -0.103537f, -0.063178f, -0.006147f, 0.056899f, 0.119000f, 0.175976f, 0.223007f, 0.258809f, 0.290082f, 0.325544f, 0.366060f, 0.404748f, 0.435940f, 0.459659f, 0.477057f, 0.485768f, 0.481949f, 0.464583f, 0.435511f, 0.396430f, 0.348217f, 0.293152f, 0.235872f, 0.181156f, 0.131462f, 0.086995f, 0.047291f, 0.011925f, -0.019860f, -0.049234f, -0.077087f, -0.103305f, -0.126782f, -0.146073f, -0.160114f, -0.168584f, -0.172163f, -0.172742f, -0.172926f, -0.174658f, -0.178393f, -0.183847f, -0.190894f, -0.199120f, -0.207336f, -0.214617f, -0.221287f, -0.227964f, -0.234364f, -0.240080f, -0.245597f, -0.251299f, -0.256363f, -0.259991f, -0.262809f, -0.265586f, -0.267476f, -0.267095f, -0.264473f, -0.260252f, -0.253718f, -0.243511f, -0.229851f, -0.214251f, -0.197126f, -0.177462f, -0.155123f, -0.131960f, -0.110023f, -0.089716f, -0.070352f, -0.051528f, -0.033035f, -0.014169f, 0.005575f, 0.025309f, 0.043447f, 0.059669f, 0.074999f, + 0.089633f, 0.101857f, 0.109868f, 0.113881f, 0.115686f, 0.116439f, 0.115296f, 0.110050f, 0.099149f, 0.083422f, 0.065582f, 0.047620f, 0.029031f, 0.008119f, -0.015408f, -0.039719f, -0.062334f, -0.081886f, -0.098915f, -0.115347f, -0.132714f, -0.150577f, -0.167011f, -0.180529f, -0.191095f, -0.199667f, -0.207607f, -0.216183f, -0.225727f, -0.235418f, -0.244418f, -0.252854f, -0.261300f, -0.270058f, -0.279398f, -0.289700f, -0.300910f, -0.312505f, -0.324199f, -0.335987f, -0.347581f, -0.358572f, -0.368949f, -0.378735f, -0.387465f, -0.394661f, -0.400258f, -0.404073f, -0.405616f, -0.404811f, -0.402129f, -0.397863f, -0.392175f, -0.385744f, -0.379333f, -0.373003f, -0.366685f, -0.360900f, -0.356011f, -0.351700f, -0.347985f, -0.345621f, -0.344803f, -0.344833f, -0.345464f, -0.347028f, -0.349093f, -0.350709f, -0.351891f, -0.353267f, -0.354902f, -0.356927f, -0.360197f, -0.364876f, -0.369876f, -0.374777f, -0.380264f, -0.386061f, -0.390973f, -0.395145f, -0.399381f, -0.402703f, -0.403726f, -0.403187f, -0.401906f, -0.398520f, -0.392428f, -0.385687f, -0.379088f, -0.370803f, -0.361132f, -0.352826f, -0.345523f, -0.336817f, -0.328347f, -0.322499f, + -0.316073f, -0.307037f, -0.300969f, -0.299317f, -0.292838f, -0.280644f, -0.277266f, -0.283217f, -0.276239f, -0.255690f, -0.255875f, -0.279115f, -0.268071f, -0.203008f, -0.169784f, -0.245698f, -0.365333f, -0.404529f, -0.361687f, -0.334923f, -0.343079f, -0.311549f, -0.240812f, -0.239266f, -0.346481f, -0.455499f, -0.471686f, -0.438424f, -0.438562f, -0.467601f, -0.476962f, -0.461364f, -0.428614f, -0.352244f, -0.233087f, -0.153489f, -0.187619f, -0.290385f, -0.350672f, -0.336184f, -0.314805f, -0.337205f, -0.368617f, -0.359721f, -0.333879f, -0.360020f, -0.453502f, -0.541952f}, + {0.059457f, 0.085936f, 0.085241f, 0.027833f, -0.043944f, -0.063521f, -0.019521f, 0.033320f, 0.036813f, -0.016068f, -0.088274f, -0.140585f, -0.158479f, -0.151114f, -0.137138f, -0.128832f, -0.122444f, -0.103537f, -0.063178f, -0.006147f, 0.056899f, 0.119000f, 0.175976f, 0.223007f, 0.258809f, 0.290082f, 0.325544f, 0.366060f, 0.404748f, 0.435940f, 0.459659f, 0.477057f, 0.485768f, 0.481949f, 0.464583f, 0.435511f, 0.396430f, 0.348217f, 0.293152f, 0.235872f, 0.181156f, 0.131462f, 0.086995f, 0.047291f, 0.011925f, -0.019860f, -0.049234f, -0.077087f, -0.103305f, -0.126782f, -0.146073f, -0.160114f, -0.168584f, -0.172163f, -0.172742f, -0.172926f, -0.174658f, -0.178393f, -0.183847f, -0.190894f, -0.199120f, -0.207336f, -0.214617f, -0.221287f, -0.227964f, -0.234364f, -0.240080f, -0.245597f, -0.251299f, -0.256363f, -0.259991f, -0.262809f, -0.265586f, -0.267476f, -0.267095f, -0.264473f, -0.260252f, -0.253718f, -0.243511f, -0.229851f, -0.214251f, -0.197126f, -0.177462f, -0.155123f, -0.131960f, -0.110023f, -0.089716f, -0.070352f, -0.051528f, -0.033035f, -0.014169f, 0.005575f, 0.025309f, 0.043447f, 0.059669f, 0.074999f, + 0.089633f, 0.101857f, 0.109868f, 0.113881f, 0.115686f, 0.116439f, 0.115296f, 0.110050f, 0.099149f, 0.083422f, 0.065582f, 0.047620f, 0.029031f, 0.008119f, -0.015408f, -0.039719f, -0.062334f, -0.081886f, -0.098915f, -0.115347f, -0.132714f, -0.150577f, -0.167011f, -0.180529f, -0.191095f, -0.199667f, -0.207607f, -0.216183f, -0.225727f, -0.235418f, -0.244418f, -0.252854f, -0.261300f, -0.270058f, -0.279398f, -0.289700f, -0.300910f, -0.312505f, -0.324199f, -0.335987f, -0.347581f, -0.358572f, -0.368949f, -0.378735f, -0.387465f, -0.394661f, -0.400258f, -0.404073f, -0.405616f, -0.404811f, -0.402129f, -0.397863f, -0.392175f, -0.385744f, -0.379333f, -0.373003f, -0.366685f, -0.360900f, -0.356011f, -0.351700f, -0.347985f, -0.345621f, -0.344803f, -0.344833f, -0.345464f, -0.347028f, -0.349093f, -0.350709f, -0.351891f, -0.353267f, -0.354902f, -0.356927f, -0.360197f, -0.364876f, -0.369876f, -0.374777f, -0.380264f, -0.386061f, -0.390973f, -0.395145f, -0.399381f, -0.402703f, -0.403726f, -0.403187f, -0.401906f, -0.398520f, -0.392428f, -0.385687f, -0.379088f, -0.370803f, -0.361132f, -0.352826f, -0.345523f, -0.336817f, -0.328347f, -0.322499f, + -0.316073f, -0.307037f, -0.300969f, -0.299317f, -0.292838f, -0.280644f, -0.277266f, -0.283217f, -0.276239f, -0.255690f, -0.255875f, -0.279115f, -0.268071f, -0.203008f, -0.169784f, -0.245698f, -0.365333f, -0.404529f, -0.361687f, -0.334923f, -0.343079f, -0.311549f, -0.240812f, -0.239266f, -0.346481f, -0.455499f, -0.471686f, -0.438424f, -0.438562f, -0.467601f, -0.476962f, -0.461364f, -0.428614f, -0.352244f, -0.233087f, -0.153489f, -0.187619f, -0.290385f, -0.350672f, -0.336184f, -0.314805f, -0.337205f, -0.368617f, -0.359721f, -0.333879f, -0.360020f, -0.453502f, -0.541952f} + } +}; +const float CRendBin_FOA_HRIR_coeff_im_48kHz[4][BINAURAL_CHANNELS][240]={ + { + {-0.232642f, -0.619757f, -0.819335f, -0.824328f, -0.706584f, -0.546612f, -0.382357f, -0.211011f, -0.022767f, 0.174826f, 0.359188f, 0.508148f, 0.609626f, 0.661324f, 0.667146f, 0.635245f, 0.576667f, 0.502394f, 0.419701f, 0.331090f, 0.237324f, 0.141387f, 0.048569f, -0.037525f, -0.117560f, -0.193955f, -0.266698f, -0.333052f, -0.390834f, -0.440313f, -0.482842f, -0.519219f, -0.550026f, -0.576478f, -0.599941f, -0.620936f, -0.639198f, -0.654639f, -0.667907f, -0.679984f, -0.691454f, -0.702244f, -0.711985f, -0.720441f, -0.727553f, -0.733292f, -0.737699f, -0.740994f, -0.743411f, -0.744954f, -0.745498f, -0.745034f, -0.743668f, -0.741462f, -0.738438f, -0.734723f, -0.730530f, -0.726026f, -0.721284f, -0.716333f, -0.711223f, -0.706042f, -0.700845f, -0.695593f, -0.690269f, -0.685041f, -0.680161f, -0.675721f, -0.671676f, -0.668072f, -0.665011f, -0.662423f, -0.660150f, -0.658206f, -0.656688f, -0.655503f, -0.654437f, -0.653421f, -0.652408f, -0.651126f, -0.649247f, -0.646675f, -0.643399f, -0.639213f, -0.633903f, -0.627573f, -0.620560f, -0.613122f, -0.605346f, -0.597201f, -0.588552f, -0.579312f, -0.569672f, -0.560020f, -0.550630f, -0.541590f, + -0.532994f, -0.524947f, -0.517448f, -0.510454f, -0.504037f, -0.498304f, -0.493261f, -0.488818f, -0.484835f, -0.481127f, -0.477591f, -0.474316f, -0.471348f, -0.468385f, -0.464947f, -0.460801f, -0.456039f, -0.450823f, -0.445293f, -0.439599f, -0.433815f, -0.427903f, -0.421886f, -0.415901f, -0.410010f, -0.404135f, -0.398211f, -0.392213f, -0.386062f, -0.379728f, -0.373352f, -0.367079f, -0.360861f, -0.354623f, -0.348453f, -0.342474f, -0.336717f, -0.331241f, -0.326150f, -0.321375f, -0.316703f, -0.312055f, -0.307501f, -0.303027f, -0.298575f, -0.294194f, -0.289903f, -0.285550f, -0.281022f, -0.276422f, -0.271827f, -0.267178f, -0.262535f, -0.258098f, -0.253864f, -0.249627f, -0.245362f, -0.241189f, -0.237022f, -0.232677f, -0.228229f, -0.223866f, -0.219586f, -0.215378f, -0.211424f, -0.207793f, -0.204299f, -0.200877f, -0.197662f, -0.194546f, -0.191240f, -0.187807f, -0.184548f, -0.181425f, -0.178221f, -0.175084f, -0.172235f, -0.169471f, -0.166568f, -0.163737f, -0.161128f, -0.158515f, -0.155899f, -0.153649f, -0.151723f, -0.149662f, -0.147483f, -0.145537f, -0.143560f, -0.141061f, -0.138329f, -0.135814f, -0.133105f, -0.129813f, -0.126525f, -0.123593f, + -0.120298f, -0.116424f, -0.112883f, -0.109720f, -0.105787f, -0.101273f, -0.097619f, -0.094331f, -0.089558f, -0.084187f, -0.080833f, -0.078688f, -0.074889f, -0.070753f, -0.069809f, -0.069830f, -0.064961f, -0.055837f, -0.048252f, -0.041884f, -0.032181f, -0.025073f, -0.035481f, -0.064601f, -0.090757f, -0.092450f, -0.073213f, -0.055377f, -0.054369f, -0.066563f, -0.079976f, -0.091134f, -0.109543f, -0.143769f, -0.182405f, -0.196180f, -0.167685f, -0.114625f, -0.072411f, -0.055952f, -0.051237f, -0.043408f, -0.036029f, -0.036627f, -0.038865f, -0.031657f, -0.016835f, -0.004448f}, + {-0.232642f, -0.619757f, -0.819335f, -0.824328f, -0.706584f, -0.546612f, -0.382357f, -0.211011f, -0.022767f, 0.174826f, 0.359188f, 0.508148f, 0.609626f, 0.661324f, 0.667146f, 0.635245f, 0.576667f, 0.502394f, 0.419701f, 0.331090f, 0.237324f, 0.141387f, 0.048569f, -0.037525f, -0.117560f, -0.193955f, -0.266698f, -0.333052f, -0.390834f, -0.440313f, -0.482842f, -0.519219f, -0.550026f, -0.576478f, -0.599941f, -0.620936f, -0.639198f, -0.654639f, -0.667907f, -0.679984f, -0.691454f, -0.702244f, -0.711985f, -0.720441f, -0.727553f, -0.733292f, -0.737699f, -0.740994f, -0.743411f, -0.744954f, -0.745498f, -0.745034f, -0.743668f, -0.741462f, -0.738438f, -0.734723f, -0.730530f, -0.726026f, -0.721284f, -0.716333f, -0.711223f, -0.706042f, -0.700845f, -0.695593f, -0.690269f, -0.685041f, -0.680161f, -0.675721f, -0.671676f, -0.668072f, -0.665011f, -0.662423f, -0.660150f, -0.658206f, -0.656688f, -0.655503f, -0.654437f, -0.653421f, -0.652408f, -0.651126f, -0.649247f, -0.646675f, -0.643399f, -0.639213f, -0.633903f, -0.627573f, -0.620560f, -0.613122f, -0.605346f, -0.597201f, -0.588552f, -0.579312f, -0.569672f, -0.560020f, -0.550630f, -0.541590f, + -0.532994f, -0.524947f, -0.517448f, -0.510454f, -0.504037f, -0.498304f, -0.493261f, -0.488818f, -0.484835f, -0.481127f, -0.477591f, -0.474316f, -0.471348f, -0.468385f, -0.464947f, -0.460801f, -0.456039f, -0.450823f, -0.445293f, -0.439599f, -0.433815f, -0.427903f, -0.421886f, -0.415901f, -0.410010f, -0.404135f, -0.398211f, -0.392213f, -0.386062f, -0.379728f, -0.373352f, -0.367079f, -0.360861f, -0.354623f, -0.348453f, -0.342474f, -0.336717f, -0.331241f, -0.326150f, -0.321375f, -0.316703f, -0.312055f, -0.307501f, -0.303027f, -0.298575f, -0.294194f, -0.289903f, -0.285550f, -0.281022f, -0.276422f, -0.271827f, -0.267178f, -0.262535f, -0.258098f, -0.253864f, -0.249627f, -0.245362f, -0.241189f, -0.237022f, -0.232677f, -0.228229f, -0.223866f, -0.219586f, -0.215378f, -0.211424f, -0.207793f, -0.204299f, -0.200877f, -0.197662f, -0.194546f, -0.191240f, -0.187807f, -0.184548f, -0.181425f, -0.178221f, -0.175084f, -0.172235f, -0.169471f, -0.166568f, -0.163737f, -0.161128f, -0.158515f, -0.155899f, -0.153649f, -0.151723f, -0.149662f, -0.147483f, -0.145537f, -0.143560f, -0.141061f, -0.138329f, -0.135814f, -0.133105f, -0.129813f, -0.126525f, -0.123593f, + -0.120298f, -0.116424f, -0.112883f, -0.109720f, -0.105787f, -0.101273f, -0.097619f, -0.094331f, -0.089558f, -0.084187f, -0.080833f, -0.078688f, -0.074889f, -0.070753f, -0.069809f, -0.069830f, -0.064961f, -0.055837f, -0.048252f, -0.041884f, -0.032181f, -0.025073f, -0.035481f, -0.064601f, -0.090757f, -0.092450f, -0.073213f, -0.055377f, -0.054369f, -0.066563f, -0.079976f, -0.091134f, -0.109543f, -0.143769f, -0.182405f, -0.196180f, -0.167685f, -0.114625f, -0.072411f, -0.055952f, -0.051237f, -0.043408f, -0.036029f, -0.036627f, -0.038865f, -0.031657f, -0.016835f, -0.004448f} + }, + { + {0.140382f, 0.284796f, 0.113059f, -0.341301f, -0.862015f, -1.204634f, -1.248279f, -1.029758f, -0.664763f, -0.256066f, 0.137783f, 0.487211f, 0.775946f, 0.997771f, 1.153436f, 1.245420f, 1.277398f, 1.256961f, 1.195620f, 1.106451f, 1.001768f, 0.890131f, 0.774183f, 0.653473f, 0.530185f, 0.410173f, 0.298320f, 0.195312f, 0.099336f, 0.008646f, -0.078032f, -0.161428f, -0.241062f, -0.315649f, -0.384630f, -0.448733f, -0.509170f, -0.566793f, -0.621581f, -0.672385f, -0.717596f, -0.756520f, -0.789753f, -0.818228f, -0.842538f, -0.863181f, -0.880623f, -0.894965f, -0.906175f, -0.914704f, -0.921413f, -0.926918f, -0.931340f, -0.934448f, -0.935793f, -0.935022f, -0.932267f, -0.927970f, -0.922378f, -0.915726f, -0.908718f, -0.902136f, -0.896106f, -0.890432f, -0.885422f, -0.881597f, -0.878827f, -0.876579f, -0.874831f, -0.873952f, -0.873913f, -0.874370f, -0.875375f, -0.877274f, -0.880013f, -0.883133f, -0.886386f, -0.889857f, -0.893495f, -0.896943f, -0.899891f, -0.902370f, -0.904567f, -0.906469f, -0.907798f, -0.908330f, -0.908151f, -0.907581f, -0.906978f, -0.906626f, -0.906487f, -0.905858f, -0.903647f, -0.899249f, -0.892899f, -0.884927f, + -0.875053f, -0.862712f, -0.847727f, -0.830455f, -0.811563f, -0.791782f, -0.771500f, -0.750522f, -0.728617f, -0.706326f, -0.684815f, -0.664994f, -0.647154f, -0.631330f, -0.617578f, -0.605915f, -0.596270f, -0.588409f, -0.581848f, -0.576120f, -0.571189f, -0.567244f, -0.564062f, -0.560956f, -0.557300f, -0.552749f, -0.547149f, -0.540696f, -0.533982f, -0.527464f, -0.521067f, -0.514596f, -0.508155f, -0.501839f, -0.495465f, -0.488925f, -0.482422f, -0.476181f, -0.470299f, -0.464951f, -0.460286f, -0.456131f, -0.452168f, -0.448311f, -0.444625f, -0.441111f, -0.437847f, -0.435012f, -0.432529f, -0.430047f, -0.427337f, -0.424316f, -0.420805f, -0.416729f, -0.412382f, -0.407980f, -0.403285f, -0.398067f, -0.392448f, -0.386360f, -0.379335f, -0.371209f, -0.362359f, -0.353002f, -0.343026f, -0.332618f, -0.322186f, -0.311707f, -0.300948f, -0.290105f, -0.279460f, -0.268914f, -0.258530f, -0.248800f, -0.239810f, -0.231038f, -0.222364f, -0.214099f, -0.205871f, -0.196868f, -0.187179f, -0.177547f, -0.168128f, -0.158861f, -0.150296f, -0.142677f, -0.135313f, -0.127959f, -0.121270f, -0.115110f, -0.108460f, -0.101467f, -0.095154f, -0.089193f, -0.082636f, -0.076028f, + -0.070002f, -0.063579f, -0.056514f, -0.050189f, -0.043975f, -0.035661f, -0.026929f, -0.020905f, -0.014065f, -0.001634f, 0.010286f, 0.014441f, 0.021776f, 0.046877f, 0.075043f, 0.076336f, 0.055881f, 0.051243f, 0.071963f, 0.088061f, 0.093592f, 0.127625f, 0.202698f, 0.263860f, 0.260005f, 0.216330f, 0.195773f, 0.220955f, 0.268761f, 0.311828f, 0.337692f, 0.357947f, 0.413641f, 0.524316f, 0.615425f, 0.563270f, 0.351718f, 0.123833f, 0.026612f, 0.054001f, 0.097163f, 0.102905f, 0.112567f, 0.165999f, 0.234599f, 0.256682f, 0.199112f, 0.074735f}, + {-0.140382f, -0.284796f, -0.113059f, 0.341301f, 0.862015f, 1.204634f, 1.248279f, 1.029758f, 0.664763f, 0.256066f, -0.137783f, -0.487211f, -0.775946f, -0.997771f, -1.153436f, -1.245420f, -1.277398f, -1.256961f, -1.195620f, -1.106451f, -1.001768f, -0.890131f, -0.774183f, -0.653473f, -0.530185f, -0.410173f, -0.298320f, -0.195312f, -0.099336f, -0.008646f, 0.078032f, 0.161428f, 0.241062f, 0.315649f, 0.384630f, 0.448733f, 0.509170f, 0.566793f, 0.621581f, 0.672385f, 0.717596f, 0.756520f, 0.789753f, 0.818228f, 0.842538f, 0.863181f, 0.880623f, 0.894965f, 0.906175f, 0.914704f, 0.921413f, 0.926918f, 0.931340f, 0.934448f, 0.935793f, 0.935022f, 0.932267f, 0.927970f, 0.922378f, 0.915726f, 0.908718f, 0.902136f, 0.896106f, 0.890432f, 0.885422f, 0.881597f, 0.878827f, 0.876579f, 0.874831f, 0.873952f, 0.873913f, 0.874370f, 0.875375f, 0.877274f, 0.880013f, 0.883133f, 0.886386f, 0.889857f, 0.893495f, 0.896943f, 0.899891f, 0.902370f, 0.904567f, 0.906469f, 0.907798f, 0.908330f, 0.908151f, 0.907581f, 0.906978f, 0.906626f, 0.906487f, 0.905858f, 0.903647f, 0.899249f, 0.892899f, 0.884927f, + 0.875053f, 0.862712f, 0.847727f, 0.830455f, 0.811563f, 0.791782f, 0.771500f, 0.750522f, 0.728617f, 0.706326f, 0.684815f, 0.664994f, 0.647154f, 0.631330f, 0.617578f, 0.605915f, 0.596270f, 0.588409f, 0.581848f, 0.576120f, 0.571189f, 0.567244f, 0.564062f, 0.560956f, 0.557300f, 0.552749f, 0.547149f, 0.540696f, 0.533982f, 0.527464f, 0.521067f, 0.514596f, 0.508155f, 0.501839f, 0.495465f, 0.488925f, 0.482422f, 0.476181f, 0.470299f, 0.464951f, 0.460286f, 0.456131f, 0.452168f, 0.448311f, 0.444625f, 0.441111f, 0.437847f, 0.435012f, 0.432529f, 0.430047f, 0.427337f, 0.424316f, 0.420805f, 0.416729f, 0.412382f, 0.407980f, 0.403285f, 0.398067f, 0.392448f, 0.386360f, 0.379335f, 0.371209f, 0.362359f, 0.353002f, 0.343026f, 0.332618f, 0.322186f, 0.311707f, 0.300948f, 0.290105f, 0.279460f, 0.268914f, 0.258530f, 0.248800f, 0.239810f, 0.231038f, 0.222364f, 0.214099f, 0.205871f, 0.196868f, 0.187179f, 0.177547f, 0.168128f, 0.158861f, 0.150296f, 0.142677f, 0.135313f, 0.127959f, 0.121270f, 0.115110f, 0.108460f, 0.101467f, 0.095154f, 0.089193f, 0.082636f, 0.076028f, + 0.070002f, 0.063579f, 0.056514f, 0.050189f, 0.043975f, 0.035661f, 0.026929f, 0.020905f, 0.014065f, 0.001634f, -0.010286f, -0.014441f, -0.021776f, -0.046877f, -0.075043f, -0.076336f, -0.055881f, -0.051243f, -0.071963f, -0.088061f, -0.093592f, -0.127625f, -0.202698f, -0.263860f, -0.260005f, -0.216330f, -0.195773f, -0.220955f, -0.268761f, -0.311828f, -0.337692f, -0.357947f, -0.413641f, -0.524316f, -0.615425f, -0.563270f, -0.351718f, -0.123833f, -0.026612f, -0.054001f, -0.097163f, -0.102905f, -0.112567f, -0.165999f, -0.234599f, -0.256682f, -0.199112f, -0.074735f} + }, + { + {-0.025709f, -0.087852f, -0.139072f, -0.114670f, -0.010581f, 0.083762f, 0.089935f, 0.027679f, -0.033031f, -0.059926f, -0.060733f, -0.038043f, 0.008721f, 0.055627f, 0.072784f, 0.065756f, 0.067013f, 0.089127f, 0.112190f, 0.115989f, 0.101255f, 0.076571f, 0.043604f, 0.002504f, -0.039568f, -0.072838f, -0.093984f, -0.107885f, -0.122174f, -0.140465f, -0.159571f, -0.173362f, -0.178912f, -0.177313f, -0.169818f, -0.156888f, -0.141159f, -0.127823f, -0.120897f, -0.120944f, -0.126572f, -0.136377f, -0.149380f, -0.165024f, -0.183014f, -0.202776f, -0.223635f, -0.245715f, -0.269757f, -0.295840f, -0.323002f, -0.349990f, -0.375616f, -0.398737f, -0.418610f, -0.434862f, -0.446808f, -0.453571f, -0.454971f, -0.451233f, -0.441889f, -0.426235f, -0.404594f, -0.377728f, -0.345446f, -0.307343f, -0.264342f, -0.217973f, -0.168839f, -0.117241f, -0.064423f, -0.011833f, 0.039787f, 0.089385f, 0.134986f, 0.175305f, 0.210590f, 0.240697f, 0.263879f, 0.278867f, 0.286867f, 0.289982f, 0.288504f, 0.281317f, 0.268764f, 0.253745f, 0.239176f, 0.224979f, 0.208874f, 0.190415f, 0.172740f, 0.159261f, 0.149978f, 0.142540f, 0.135820f, 0.130669f, + 0.128026f, 0.128135f, 0.131114f, 0.136745f, 0.143982f, 0.151658f, 0.159406f, 0.167441f, 0.175977f, 0.184865f, 0.192984f, 0.198243f, 0.199231f, 0.196556f, 0.191632f, 0.184859f, 0.175906f, 0.164788f, 0.151549f, 0.135833f, 0.117715f, 0.098073f, 0.077678f, 0.056957f, 0.036748f, 0.018014f, 0.000872f, -0.014868f, -0.028575f, -0.039388f, -0.047290f, -0.052543f, -0.054987f, -0.054782f, -0.052664f, -0.048888f, -0.043302f, -0.036732f, -0.030687f, -0.025659f, -0.021283f, -0.017577f, -0.014246f, -0.009715f, -0.002804f, 0.005660f, 0.014470f, 0.023743f, 0.033647f, 0.043359f, 0.052494f, 0.061578f, 0.070378f, 0.077923f, 0.084389f, 0.090692f, 0.096591f, 0.101528f, 0.106380f, 0.112094f, 0.118037f, 0.123692f, 0.129929f, 0.136925f, 0.143401f, 0.149129f, 0.155244f, 0.161468f, 0.166321f, 0.169947f, 0.173303f, 0.175561f, 0.175884f, 0.175902f, 0.177023f, 0.178070f, 0.178540f, 0.180407f, 0.184301f, 0.188503f, 0.193141f, 0.199909f, 0.207375f, 0.212779f, 0.217314f, 0.222988f, 0.227302f, 0.227989f, 0.228035f, 0.229199f, 0.227725f, 0.222579f, 0.218340f, 0.215242f, 0.208655f, 0.200648f, + 0.196609f, 0.191792f, 0.180454f, 0.171665f, 0.171997f, 0.166224f, 0.145987f, 0.134797f, 0.144064f, 0.138339f, 0.100138f, 0.083322f, 0.120723f, 0.129214f, 0.021665f, -0.123541f, -0.144768f, -0.034350f, 0.057753f, 0.060616f, 0.056870f, 0.089515f, 0.067490f, -0.060009f, -0.181042f, -0.173043f, -0.072960f, -0.000831f, 0.008317f, 0.010713f, 0.046903f, 0.097902f, 0.114688f, 0.055575f, -0.066337f, -0.157373f, -0.122700f, 0.009537f, 0.105443f, 0.088390f, 0.020247f, -0.007578f, 0.004660f, 0.000024f, -0.033101f, -0.055003f, -0.043748f, -0.015207f}, + {-0.025709f, -0.087852f, -0.139072f, -0.114670f, -0.010581f, 0.083762f, 0.089935f, 0.027679f, -0.033031f, -0.059926f, -0.060733f, -0.038043f, 0.008721f, 0.055627f, 0.072784f, 0.065756f, 0.067013f, 0.089127f, 0.112190f, 0.115989f, 0.101255f, 0.076571f, 0.043604f, 0.002504f, -0.039568f, -0.072838f, -0.093984f, -0.107885f, -0.122174f, -0.140465f, -0.159571f, -0.173362f, -0.178912f, -0.177313f, -0.169818f, -0.156888f, -0.141159f, -0.127823f, -0.120897f, -0.120944f, -0.126572f, -0.136377f, -0.149380f, -0.165024f, -0.183014f, -0.202776f, -0.223635f, -0.245715f, -0.269757f, -0.295840f, -0.323002f, -0.349990f, -0.375616f, -0.398737f, -0.418610f, -0.434862f, -0.446808f, -0.453571f, -0.454971f, -0.451233f, -0.441889f, -0.426235f, -0.404594f, -0.377728f, -0.345446f, -0.307343f, -0.264342f, -0.217973f, -0.168839f, -0.117241f, -0.064423f, -0.011833f, 0.039787f, 0.089385f, 0.134986f, 0.175305f, 0.210590f, 0.240697f, 0.263879f, 0.278867f, 0.286867f, 0.289982f, 0.288504f, 0.281317f, 0.268764f, 0.253745f, 0.239176f, 0.224979f, 0.208874f, 0.190415f, 0.172740f, 0.159261f, 0.149978f, 0.142540f, 0.135820f, 0.130669f, + 0.128026f, 0.128135f, 0.131114f, 0.136745f, 0.143982f, 0.151658f, 0.159406f, 0.167441f, 0.175977f, 0.184865f, 0.192984f, 0.198243f, 0.199231f, 0.196556f, 0.191632f, 0.184859f, 0.175906f, 0.164788f, 0.151549f, 0.135833f, 0.117715f, 0.098073f, 0.077678f, 0.056957f, 0.036748f, 0.018014f, 0.000872f, -0.014868f, -0.028575f, -0.039388f, -0.047290f, -0.052543f, -0.054987f, -0.054782f, -0.052664f, -0.048888f, -0.043302f, -0.036732f, -0.030687f, -0.025659f, -0.021283f, -0.017577f, -0.014246f, -0.009715f, -0.002804f, 0.005660f, 0.014470f, 0.023743f, 0.033647f, 0.043359f, 0.052494f, 0.061578f, 0.070378f, 0.077923f, 0.084389f, 0.090692f, 0.096591f, 0.101528f, 0.106380f, 0.112094f, 0.118037f, 0.123692f, 0.129929f, 0.136925f, 0.143401f, 0.149129f, 0.155244f, 0.161468f, 0.166321f, 0.169947f, 0.173303f, 0.175561f, 0.175884f, 0.175902f, 0.177023f, 0.178070f, 0.178540f, 0.180407f, 0.184301f, 0.188503f, 0.193141f, 0.199909f, 0.207375f, 0.212779f, 0.217314f, 0.222988f, 0.227302f, 0.227989f, 0.228035f, 0.229199f, 0.227725f, 0.222579f, 0.218340f, 0.215242f, 0.208655f, 0.200648f, + 0.196609f, 0.191792f, 0.180454f, 0.171665f, 0.171997f, 0.166224f, 0.145987f, 0.134797f, 0.144064f, 0.138339f, 0.100138f, 0.083322f, 0.120723f, 0.129214f, 0.021665f, -0.123541f, -0.144768f, -0.034350f, 0.057753f, 0.060616f, 0.056870f, 0.089515f, 0.067490f, -0.060009f, -0.181042f, -0.173043f, -0.072960f, -0.000831f, 0.008317f, 0.010713f, 0.046903f, 0.097902f, 0.114688f, 0.055575f, -0.066337f, -0.157373f, -0.122700f, 0.009537f, 0.105443f, 0.088390f, 0.020247f, -0.007578f, 0.004660f, 0.000024f, -0.033101f, -0.055003f, -0.043748f, -0.015207f} + }, + { + {0.004301f, -0.013476f, -0.069855f, -0.112233f, -0.090233f, -0.023427f, 0.018901f, -0.004024f, -0.066053f, -0.110415f, -0.105009f, -0.058395f, 0.001235f, 0.050922f, 0.084875f, 0.113445f, 0.150612f, 0.198514f, 0.245067f, 0.276957f, 0.290295f, 0.287473f, 0.270798f, 0.244182f, 0.215808f, 0.191987f, 0.169678f, 0.140040f, 0.098790f, 0.049069f, -0.005223f, -0.064266f, -0.129212f, -0.197710f, -0.264893f, -0.327191f, -0.382959f, -0.430138f, -0.465663f, -0.487872f, -0.498285f, -0.500319f, -0.496901f, -0.489765f, -0.480177f, -0.469238f, -0.457371f, -0.444016f, -0.428168f, -0.409285f, -0.387825f, -0.365159f, -0.343191f, -0.324015f, -0.309255f, -0.299101f, -0.292156f, -0.286670f, -0.281620f, -0.276311f, -0.269794f, -0.261628f, -0.252562f, -0.243448f, -0.234059f, -0.223904f, -0.213327f, -0.202652f, -0.191162f, -0.178231f, -0.164569f, -0.150934f, -0.136555f, -0.120347f, -0.102808f, -0.085100f, -0.067101f, -0.048163f, -0.029184f, -0.012044f, 0.002742f, 0.016047f, 0.027774f, 0.036175f, 0.040005f, 0.040094f, 0.038140f, 0.034953f, 0.030572f, 0.025196f, 0.018816f, 0.010402f, -0.001256f, -0.015920f, -0.032251f, -0.049947f, + -0.070292f, -0.094062f, -0.119898f, -0.145560f, -0.170281f, -0.195266f, -0.222067f, -0.250644f, -0.278790f, -0.303633f, -0.324109f, -0.341676f, -0.358158f, -0.373323f, -0.385151f, -0.392113f, -0.394639f, -0.394771f, -0.394738f, -0.395368f, -0.395476f, -0.393190f, -0.388016f, -0.381245f, -0.374662f, -0.369480f, -0.366096f, -0.363936f, -0.361729f, -0.358693f, -0.355247f, -0.352152f, -0.349560f, -0.347298f, -0.345265f, -0.343082f, -0.340057f, -0.335871f, -0.330643f, -0.324295f, -0.316590f, -0.307660f, -0.297736f, -0.286624f, -0.274141f, -0.260611f, -0.246376f, -0.231487f, -0.216324f, -0.201731f, -0.188250f, -0.176027f, -0.165469f, -0.156991f, -0.150296f, -0.144906f, -0.140952f, -0.138536f, -0.137112f, -0.136366f, -0.136669f, -0.137907f, -0.139122f, -0.139867f, -0.140476f, -0.140741f, -0.139998f, -0.138538f, -0.137285f, -0.136389f, -0.135636f, -0.135341f, -0.135341f, -0.134436f, -0.132129f, -0.129168f, -0.125552f, -0.120298f, -0.113600f, -0.106478f, -0.098431f, -0.088467f, -0.077617f, -0.067238f, -0.056573f, -0.045203f, -0.035126f, -0.027288f, -0.019916f, -0.012845f, -0.008413f, -0.006290f, -0.003787f, -0.001744f, -0.002475f, -0.003553f, + -0.002665f, -0.004018f, -0.009329f, -0.011340f, -0.008882f, -0.013592f, -0.026133f, -0.028495f, -0.020197f, -0.028759f, -0.055232f, -0.055789f, -0.023439f, -0.031660f, -0.124564f, -0.217122f, -0.200917f, -0.107754f, -0.056107f, -0.066073f, -0.058846f, -0.027906f, -0.061373f, -0.169830f, -0.234929f, -0.183494f, -0.092827f, -0.059029f, -0.063888f, -0.041976f, 0.009389f, 0.060627f, 0.114330f, 0.163356f, 0.148189f, 0.037885f, -0.089951f, -0.129600f, -0.082891f, -0.043468f, -0.059765f, -0.084990f, -0.070715f, -0.045983f, -0.067518f, -0.125030f, -0.140466f, -0.062947f}, + {0.004301f, -0.013476f, -0.069855f, -0.112233f, -0.090233f, -0.023427f, 0.018901f, -0.004024f, -0.066053f, -0.110415f, -0.105009f, -0.058395f, 0.001235f, 0.050922f, 0.084875f, 0.113445f, 0.150612f, 0.198514f, 0.245067f, 0.276957f, 0.290295f, 0.287473f, 0.270798f, 0.244182f, 0.215808f, 0.191987f, 0.169678f, 0.140040f, 0.098790f, 0.049069f, -0.005223f, -0.064266f, -0.129212f, -0.197710f, -0.264893f, -0.327191f, -0.382959f, -0.430138f, -0.465663f, -0.487872f, -0.498285f, -0.500319f, -0.496901f, -0.489765f, -0.480177f, -0.469238f, -0.457371f, -0.444016f, -0.428168f, -0.409285f, -0.387825f, -0.365159f, -0.343191f, -0.324015f, -0.309255f, -0.299101f, -0.292156f, -0.286670f, -0.281620f, -0.276311f, -0.269794f, -0.261628f, -0.252562f, -0.243448f, -0.234059f, -0.223904f, -0.213327f, -0.202652f, -0.191162f, -0.178231f, -0.164569f, -0.150934f, -0.136555f, -0.120347f, -0.102808f, -0.085100f, -0.067101f, -0.048163f, -0.029184f, -0.012044f, 0.002742f, 0.016047f, 0.027774f, 0.036175f, 0.040005f, 0.040094f, 0.038140f, 0.034953f, 0.030572f, 0.025196f, 0.018816f, 0.010402f, -0.001256f, -0.015920f, -0.032251f, -0.049947f, + -0.070292f, -0.094062f, -0.119898f, -0.145560f, -0.170281f, -0.195266f, -0.222067f, -0.250644f, -0.278790f, -0.303633f, -0.324109f, -0.341676f, -0.358158f, -0.373323f, -0.385151f, -0.392113f, -0.394639f, -0.394771f, -0.394738f, -0.395368f, -0.395476f, -0.393190f, -0.388016f, -0.381245f, -0.374662f, -0.369480f, -0.366096f, -0.363936f, -0.361729f, -0.358693f, -0.355247f, -0.352152f, -0.349560f, -0.347298f, -0.345265f, -0.343082f, -0.340057f, -0.335871f, -0.330643f, -0.324295f, -0.316590f, -0.307660f, -0.297736f, -0.286624f, -0.274141f, -0.260611f, -0.246376f, -0.231487f, -0.216324f, -0.201731f, -0.188250f, -0.176027f, -0.165469f, -0.156991f, -0.150296f, -0.144906f, -0.140952f, -0.138536f, -0.137112f, -0.136366f, -0.136669f, -0.137907f, -0.139122f, -0.139867f, -0.140476f, -0.140741f, -0.139998f, -0.138538f, -0.137285f, -0.136389f, -0.135636f, -0.135341f, -0.135341f, -0.134436f, -0.132129f, -0.129168f, -0.125552f, -0.120298f, -0.113600f, -0.106478f, -0.098431f, -0.088467f, -0.077617f, -0.067238f, -0.056573f, -0.045203f, -0.035126f, -0.027288f, -0.019916f, -0.012845f, -0.008413f, -0.006290f, -0.003787f, -0.001744f, -0.002475f, -0.003553f, + -0.002665f, -0.004018f, -0.009329f, -0.011340f, -0.008882f, -0.013592f, -0.026133f, -0.028495f, -0.020197f, -0.028759f, -0.055232f, -0.055789f, -0.023439f, -0.031660f, -0.124564f, -0.217122f, -0.200917f, -0.107754f, -0.056107f, -0.066073f, -0.058846f, -0.027906f, -0.061373f, -0.169830f, -0.234929f, -0.183494f, -0.092827f, -0.059029f, -0.063888f, -0.041976f, 0.009389f, 0.060627f, 0.114330f, 0.163356f, 0.148189f, 0.037885f, -0.089951f, -0.129600f, -0.082891f, -0.043468f, -0.059765f, -0.084990f, -0.070715f, -0.045983f, -0.067518f, -0.125030f, -0.140466f, -0.062947f} + } +}; +const float *CRendBin_FOA_HRIR_coeff_diffuse_re_48kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const float *CRendBin_FOA_HRIR_coeff_diffuse_im_48kHz[BINAURAL_CHANNELS]={NULL,NULL}; + +/* Sample Rate = 32000 */ + +const int16_t CRendBin_FOA_HRIR_max_num_iterations_32kHz = 1; +const uint16_t CRendBin_FOA_HRIR_num_iterations_32kHz[4][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1} }; +const uint16_t CRendBin_FOA_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS] = {0, 0}; +const uint16_t CRendBin_FOA_HRIR_pIndex_frequency_max_32kHz[4][BINAURAL_CHANNELS][1]={{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}}}; +const uint16_t CRendBin_FOA_HRIR_index_frequency_max_diffuse_32kHz = 0; +const float CRendBin_FOA_HRIR_inv_diffuse_weight_32kHz[4]={0.000000f, 0.000000f, 0.000000f, 0.000000f}; +const uint16_t *CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const float CRendBin_FOA_HRIR_coeff_re_32kHz[4][BINAURAL_CHANNELS][160]={ + { + {1.009979f, 0.777112f, 0.414923f, 0.057622f, -0.211538f, -0.386004f, -0.499848f, -0.577684f, -0.616265f, -0.600367f, -0.524501f, -0.398947f, -0.242372f, -0.073587f, 0.091690f, 0.241505f, 0.368831f, 0.472616f, 0.556219f, 0.623114f, 0.673631f, 0.706309f, 0.722082f, 0.725502f, 0.721116f, 0.709865f, 0.690241f, 0.662164f, 0.628264f, 0.591665f, 0.554026f, 0.516064f, 0.478714f, 0.442859f, 0.408459f, 0.374798f, 0.341619f, 0.309511f, 0.279115f, 0.250331f, 0.222462f, 0.194888f, 0.167394f, 0.140026f, 0.112906f, 0.086220f, 0.060166f, 0.034831f, 0.010148f, -0.013999f, -0.037628f, -0.060633f, -0.082892f, -0.104342f, -0.124944f, -0.144600f, -0.163218f, -0.180856f, -0.197673f, -0.213722f, -0.228947f, -0.243382f, -0.257175f, -0.270358f, -0.282781f, -0.294366f, -0.305254f, -0.315630f, -0.325566f, -0.335147f, -0.344568f, -0.353990f, -0.363436f, -0.372929f, -0.382614f, -0.392659f, -0.403132f, -0.414084f, -0.425629f, -0.437840f, -0.450624f, -0.463808f, -0.477282f, -0.490945f, -0.504537f, -0.517665f, -0.530059f, -0.541752f, -0.552944f, -0.563732f, -0.574004f, -0.583524f, -0.592061f, -0.599512f, -0.605962f, -0.611610f, + -0.616618f, -0.621070f, -0.625065f, -0.628734f, -0.632150f, -0.635359f, -0.638542f, -0.641977f, -0.645810f, -0.649971f, -0.654375f, -0.659108f, -0.664378f, -0.670346f, -0.676981f, -0.683983f, -0.690928f, -0.697577f, -0.703957f, -0.710141f, -0.716086f, -0.721769f, -0.727253f, -0.732564f, -0.737680f, -0.742698f, -0.747770f, -0.752853f, -0.757757f, -0.762422f, -0.766902f, -0.771169f, -0.775186f, -0.779046f, -0.782792f, -0.786271f, -0.789448f, -0.792589f, -0.795895f, -0.799306f, -0.802854f, -0.806744f, -0.810903f, -0.815048f, -0.819301f, -0.824043f, -0.829159f, -0.834320f, -0.839804f, -0.845960f, -0.852309f, -0.858549f, -0.865591f, -0.873918f, -0.882709f, -0.892835f, -0.906137f, -0.914609f, -0.894289f, -0.824242f, -0.716694f, -0.616066f, -0.558379f, -0.540483f}, + {1.009979f, 0.777112f, 0.414923f, 0.057622f, -0.211538f, -0.386004f, -0.499848f, -0.577684f, -0.616265f, -0.600367f, -0.524501f, -0.398947f, -0.242372f, -0.073587f, 0.091690f, 0.241505f, 0.368831f, 0.472616f, 0.556219f, 0.623114f, 0.673631f, 0.706309f, 0.722082f, 0.725502f, 0.721116f, 0.709865f, 0.690241f, 0.662164f, 0.628264f, 0.591665f, 0.554026f, 0.516064f, 0.478714f, 0.442859f, 0.408459f, 0.374798f, 0.341619f, 0.309511f, 0.279115f, 0.250331f, 0.222462f, 0.194888f, 0.167394f, 0.140026f, 0.112906f, 0.086220f, 0.060166f, 0.034831f, 0.010148f, -0.013999f, -0.037628f, -0.060633f, -0.082892f, -0.104342f, -0.124944f, -0.144600f, -0.163218f, -0.180856f, -0.197673f, -0.213722f, -0.228947f, -0.243382f, -0.257175f, -0.270358f, -0.282781f, -0.294366f, -0.305254f, -0.315630f, -0.325566f, -0.335147f, -0.344568f, -0.353990f, -0.363436f, -0.372929f, -0.382614f, -0.392659f, -0.403132f, -0.414084f, -0.425629f, -0.437840f, -0.450624f, -0.463808f, -0.477282f, -0.490945f, -0.504537f, -0.517665f, -0.530059f, -0.541752f, -0.552944f, -0.563732f, -0.574004f, -0.583524f, -0.592061f, -0.599512f, -0.605962f, -0.611610f, + -0.616618f, -0.621070f, -0.625065f, -0.628734f, -0.632150f, -0.635359f, -0.638542f, -0.641977f, -0.645810f, -0.649971f, -0.654375f, -0.659108f, -0.664378f, -0.670346f, -0.676981f, -0.683983f, -0.690928f, -0.697577f, -0.703957f, -0.710141f, -0.716086f, -0.721769f, -0.727253f, -0.732564f, -0.737680f, -0.742698f, -0.747770f, -0.752853f, -0.757757f, -0.762422f, -0.766902f, -0.771169f, -0.775186f, -0.779046f, -0.782792f, -0.786271f, -0.789448f, -0.792589f, -0.795895f, -0.799306f, -0.802854f, -0.806744f, -0.810903f, -0.815048f, -0.819301f, -0.824043f, -0.829159f, -0.834320f, -0.839804f, -0.845960f, -0.852309f, -0.858549f, -0.865591f, -0.873918f, -0.882709f, -0.892835f, -0.906137f, -0.914609f, -0.894289f, -0.824242f, -0.716694f, -0.616066f, -0.558379f, -0.540483f} + }, + { + {0.126193f, 0.409379f, 0.770915f, 0.941927f, 0.770060f, 0.305875f, -0.262088f, -0.749508f, -1.068164f, -1.217448f, -1.229991f, -1.138532f, -0.972214f, -0.757355f, -0.514633f, -0.259993f, -0.008395f, 0.226177f, 0.433546f, 0.608821f, 0.752615f, 0.870118f, 0.967021f, 1.044852f, 1.101784f, 1.138051f, 1.158261f, 1.168128f, 1.171126f, 1.168620f, 1.161027f, 1.148005f, 1.129009f, 1.104516f, 1.076132f, 1.045356f, 1.012656f, 0.977512f, 0.938926f, 0.896304f, 0.850314f, 0.802692f, 0.754998f, 0.707919f, 0.661694f, 0.616510f, 0.572388f, 0.529305f, 0.487590f, 0.447788f, 0.410045f, 0.373936f, 0.338864f, 0.304430f, 0.270631f, 0.237903f, 0.206810f, 0.177634f, 0.150497f, 0.125709f, 0.103489f, 0.083471f, 0.065037f, 0.048044f, 0.032597f, 0.018295f, 0.004431f, -0.009163f, -0.022189f, -0.034707f, -0.047174f, -0.059713f, -0.072094f, -0.084452f, -0.097346f, -0.111038f, -0.125310f, -0.140074f, -0.155621f, -0.172102f, -0.189235f, -0.206705f, -0.224555f, -0.242985f, -0.261989f, -0.281321f, -0.300697f, -0.319952f, -0.339143f, -0.358700f, -0.379378f, -0.401765f, -0.425720f, -0.450446f, -0.475248f, -0.500046f, + -0.525001f, -0.549812f, -0.573628f, -0.595576f, -0.615206f, -0.632568f, -0.647989f, -0.661616f, -0.673019f, -0.681460f, -0.686704f, -0.689348f, -0.690254f, -0.689954f, -0.688764f, -0.687137f, -0.685645f, -0.684742f, -0.684652f, -0.685353f, -0.686715f, -0.688850f, -0.692213f, -0.697136f, -0.703389f, -0.710382f, -0.717558f, -0.724449f, -0.730762f, -0.736643f, -0.742509f, -0.748462f, -0.754275f, -0.759964f, -0.765773f, -0.771574f, -0.776977f, -0.781995f, -0.786951f, -0.791913f, -0.796914f, -0.802402f, -0.808694f, -0.815443f, -0.822369f, -0.829834f, -0.838049f, -0.846765f, -0.856294f, -0.867454f, -0.880120f, -0.893624f, -0.908541f, -0.925665f, -0.944278f, -0.965081f, -0.991098f, -1.015883f, -1.012611f, -0.952141f, -0.840918f, -0.727278f, -0.656859f, -0.632381f}, + {-0.126193f, -0.409379f, -0.770915f, -0.941927f, -0.770060f, -0.305875f, 0.262088f, 0.749508f, 1.068164f, 1.217448f, 1.229991f, 1.138532f, 0.972214f, 0.757355f, 0.514633f, 0.259993f, 0.008395f, -0.226177f, -0.433546f, -0.608821f, -0.752615f, -0.870118f, -0.967021f, -1.044852f, -1.101784f, -1.138051f, -1.158261f, -1.168128f, -1.171126f, -1.168620f, -1.161027f, -1.148005f, -1.129009f, -1.104516f, -1.076132f, -1.045356f, -1.012656f, -0.977512f, -0.938926f, -0.896304f, -0.850314f, -0.802692f, -0.754998f, -0.707919f, -0.661694f, -0.616510f, -0.572388f, -0.529305f, -0.487590f, -0.447788f, -0.410045f, -0.373936f, -0.338864f, -0.304430f, -0.270631f, -0.237903f, -0.206810f, -0.177634f, -0.150497f, -0.125709f, -0.103489f, -0.083471f, -0.065037f, -0.048044f, -0.032597f, -0.018295f, -0.004431f, 0.009163f, 0.022189f, 0.034707f, 0.047174f, 0.059713f, 0.072094f, 0.084452f, 0.097346f, 0.111038f, 0.125310f, 0.140074f, 0.155621f, 0.172102f, 0.189235f, 0.206705f, 0.224555f, 0.242985f, 0.261989f, 0.281321f, 0.300697f, 0.319952f, 0.339143f, 0.358700f, 0.379378f, 0.401765f, 0.425720f, 0.450446f, 0.475248f, 0.500046f, + 0.525001f, 0.549812f, 0.573628f, 0.595576f, 0.615206f, 0.632568f, 0.647989f, 0.661616f, 0.673019f, 0.681460f, 0.686704f, 0.689348f, 0.690254f, 0.689954f, 0.688764f, 0.687137f, 0.685645f, 0.684742f, 0.684652f, 0.685353f, 0.686715f, 0.688850f, 0.692213f, 0.697136f, 0.703389f, 0.710382f, 0.717558f, 0.724449f, 0.730762f, 0.736643f, 0.742509f, 0.748462f, 0.754275f, 0.759964f, 0.765773f, 0.771574f, 0.776977f, 0.781995f, 0.786951f, 0.791913f, 0.796914f, 0.802402f, 0.808694f, 0.815443f, 0.822369f, 0.829834f, 0.838049f, 0.846765f, 0.856294f, 0.867454f, 0.880120f, 0.893624f, 0.908541f, 0.925665f, 0.944278f, 0.965081f, 0.991098f, 1.015883f, 1.012611f, 0.952141f, 0.840918f, 0.727278f, 0.656859f, 0.632381f} + }, + { + {0.100473f, 0.081403f, 0.008408f, -0.096160f, -0.142910f, -0.086957f, 0.009676f, 0.059490f, 0.045841f, 0.005967f, -0.036022f, -0.074745f, -0.093081f, -0.074850f, -0.037707f, -0.016301f, -0.015759f, -0.009186f, 0.021343f, 0.065496f, 0.106277f, 0.139333f, 0.165707f, 0.180998f, 0.180229f, 0.166656f, 0.149972f, 0.137718f, 0.130014f, 0.121165f, 0.105833f, 0.084123f, 0.060463f, 0.038655f, 0.020340f, 0.007598f, 0.003439f, 0.008540f, 0.019735f, 0.032727f, 0.044961f, 0.055618f, 0.064410f, 0.071075f, 0.075329f, 0.076972f, 0.076175f, 0.073282f, 0.067999f, 0.059179f, 0.045627f, 0.026803f, 0.002818f, -0.025852f, -0.058657f, -0.095222f, -0.135136f, -0.177554f, -0.221503f, -0.266485f, -0.312117f, -0.357344f, -0.400888f, -0.442195f, -0.480948f, -0.515968f, -0.545732f, -0.569651f, -0.587751f, -0.599520f, -0.604194f, -0.601692f, -0.592207f, -0.575564f, -0.552090f, -0.523307f, -0.490573f, -0.453940f, -0.413752f, -0.372396f, -0.332738f, -0.295372f, -0.259306f, -0.225175f, -0.195768f, -0.172732f, -0.154358f, -0.137922f, -0.123460f, -0.113695f, -0.110203f, -0.111037f, -0.112826f, -0.114219f, -0.116218f, -0.119819f, + -0.124632f, -0.129608f, -0.133861f, -0.136539f, -0.136862f, -0.134717f, -0.130731f, -0.125401f, -0.118326f, -0.108409f, -0.094822f, -0.077996f, -0.059675f, -0.041714f, -0.024804f, -0.008597f, 0.007173f, 0.022215f, 0.036085f, 0.048349f, 0.058347f, 0.065338f, 0.068946f, 0.069169f, 0.066144f, 0.060186f, 0.051779f, 0.041215f, 0.028539f, 0.014060f, -0.001423f, -0.017088f, -0.032440f, -0.047116f, -0.060725f, -0.072923f, -0.083344f, -0.091603f, -0.097740f, -0.102516f, -0.106948f, -0.111785f, -0.117487f, -0.124080f, -0.130710f, -0.136046f, -0.139531f, -0.141637f, -0.142666f, -0.142187f, -0.140003f, -0.136622f, -0.132265f, -0.126492f, -0.119386f, -0.111731f, -0.102678f, -0.088388f, -0.065422f, -0.036215f, -0.009683f, 0.005414f, 0.008111f, 0.005632f}, + {0.100473f, 0.081403f, 0.008408f, -0.096160f, -0.142910f, -0.086957f, 0.009676f, 0.059490f, 0.045841f, 0.005967f, -0.036022f, -0.074745f, -0.093081f, -0.074850f, -0.037707f, -0.016301f, -0.015759f, -0.009186f, 0.021343f, 0.065496f, 0.106277f, 0.139333f, 0.165707f, 0.180998f, 0.180229f, 0.166656f, 0.149972f, 0.137718f, 0.130014f, 0.121165f, 0.105833f, 0.084123f, 0.060463f, 0.038655f, 0.020340f, 0.007598f, 0.003439f, 0.008540f, 0.019735f, 0.032727f, 0.044961f, 0.055618f, 0.064410f, 0.071075f, 0.075329f, 0.076972f, 0.076175f, 0.073282f, 0.067999f, 0.059179f, 0.045627f, 0.026803f, 0.002818f, -0.025852f, -0.058657f, -0.095222f, -0.135136f, -0.177554f, -0.221503f, -0.266485f, -0.312117f, -0.357344f, -0.400888f, -0.442195f, -0.480948f, -0.515968f, -0.545732f, -0.569651f, -0.587751f, -0.599520f, -0.604194f, -0.601692f, -0.592207f, -0.575564f, -0.552090f, -0.523307f, -0.490573f, -0.453940f, -0.413752f, -0.372396f, -0.332738f, -0.295372f, -0.259306f, -0.225175f, -0.195768f, -0.172732f, -0.154358f, -0.137922f, -0.123460f, -0.113695f, -0.110203f, -0.111037f, -0.112826f, -0.114219f, -0.116218f, -0.119819f, + -0.124632f, -0.129608f, -0.133861f, -0.136539f, -0.136862f, -0.134717f, -0.130731f, -0.125401f, -0.118326f, -0.108409f, -0.094822f, -0.077996f, -0.059675f, -0.041714f, -0.024804f, -0.008597f, 0.007173f, 0.022215f, 0.036085f, 0.048349f, 0.058347f, 0.065338f, 0.068946f, 0.069169f, 0.066144f, 0.060186f, 0.051779f, 0.041215f, 0.028539f, 0.014060f, -0.001423f, -0.017088f, -0.032440f, -0.047116f, -0.060725f, -0.072923f, -0.083344f, -0.091603f, -0.097740f, -0.102516f, -0.106948f, -0.111785f, -0.117487f, -0.124080f, -0.130710f, -0.136046f, -0.139531f, -0.141637f, -0.142666f, -0.142187f, -0.140003f, -0.136622f, -0.132265f, -0.126492f, -0.119386f, -0.111731f, -0.102678f, -0.088388f, -0.065422f, -0.036215f, -0.009683f, 0.005414f, 0.008111f, 0.005632f} + }, + { + {0.084126f, 0.110632f, 0.109927f, 0.052485f, -0.019287f, -0.038848f, 0.005122f, 0.057928f, 0.061429f, 0.008547f, -0.063703f, -0.116047f, -0.133935f, -0.126590f, -0.112671f, -0.104392f, -0.098006f, -0.079140f, -0.038844f, 0.018165f, 0.081196f, 0.143237f, 0.200149f, 0.247159f, 0.282929f, 0.314126f, 0.349526f, 0.390018f, 0.428654f, 0.459758f, 0.483418f, 0.500784f, 0.509421f, 0.505506f, 0.488086f, 0.458967f, 0.419791f, 0.371480f, 0.316363f, 0.259016f, 0.204186f, 0.154396f, 0.109872f, 0.070078f, 0.034584f, 0.002707f, -0.026736f, -0.054704f, -0.081058f, -0.104625f, -0.124002f, -0.138182f, -0.146792f, -0.150463f, -0.151151f, -0.151495f, -0.153367f, -0.157201f, -0.162792f, -0.170016f, -0.178380f, -0.186711f, -0.194159f, -0.201018f, -0.207832f, -0.214370f, -0.220282f, -0.225993f, -0.231839f, -0.237070f, -0.240921f, -0.243936f, -0.246870f, -0.248962f, -0.248825f, -0.246404f, -0.242360f, -0.236067f, -0.226121f, -0.212667f, -0.197275f, -0.180428f, -0.161038f, -0.138916f, -0.116002f, -0.094379f, -0.074355f, -0.055230f, -0.036702f, -0.018555f, 0.000018f, 0.019490f, 0.038874f, 0.056640f, 0.072553f, 0.087565f, + 0.101794f, 0.113622f, 0.121301f, 0.124936f, 0.126283f, 0.126618f, 0.125103f, 0.119406f, 0.107998f, 0.091827f, 0.073557f, 0.055064f, 0.035918f, 0.014525f, -0.009510f, -0.034439f, -0.057660f, -0.077747f, -0.095384f, -0.112527f, -0.130553f, -0.149032f, -0.166196f, -0.180522f, -0.191817f, -0.201118f, -0.209934f, -0.219423f, -0.229793f, -0.240368f, -0.250415f, -0.259888f, -0.269297f, -0.279146f, -0.289735f, -0.301233f, -0.313608f, -0.326568f, -0.339762f, -0.352968f, -0.366026f, -0.378749f, -0.390962f, -0.402499f, -0.413143f, -0.422598f, -0.430524f, -0.436635f, -0.440820f, -0.443116f, -0.443609f, -0.442643f, -0.440995f, -0.439351f, -0.437985f, -0.437691f, -0.439475f, -0.440249f, -0.429869f, -0.398587f, -0.350485f, -0.304484f, -0.277094f, -0.267957f}, + {0.084126f, 0.110632f, 0.109927f, 0.052485f, -0.019287f, -0.038848f, 0.005122f, 0.057928f, 0.061429f, 0.008547f, -0.063703f, -0.116047f, -0.133935f, -0.126590f, -0.112671f, -0.104392f, -0.098006f, -0.079140f, -0.038844f, 0.018165f, 0.081196f, 0.143237f, 0.200149f, 0.247159f, 0.282929f, 0.314126f, 0.349526f, 0.390018f, 0.428654f, 0.459758f, 0.483418f, 0.500784f, 0.509421f, 0.505506f, 0.488086f, 0.458967f, 0.419791f, 0.371480f, 0.316363f, 0.259016f, 0.204186f, 0.154396f, 0.109872f, 0.070078f, 0.034584f, 0.002707f, -0.026736f, -0.054704f, -0.081058f, -0.104625f, -0.124002f, -0.138182f, -0.146792f, -0.150463f, -0.151151f, -0.151495f, -0.153367f, -0.157201f, -0.162792f, -0.170016f, -0.178380f, -0.186711f, -0.194159f, -0.201018f, -0.207832f, -0.214370f, -0.220282f, -0.225993f, -0.231839f, -0.237070f, -0.240921f, -0.243936f, -0.246870f, -0.248962f, -0.248825f, -0.246404f, -0.242360f, -0.236067f, -0.226121f, -0.212667f, -0.197275f, -0.180428f, -0.161038f, -0.138916f, -0.116002f, -0.094379f, -0.074355f, -0.055230f, -0.036702f, -0.018555f, 0.000018f, 0.019490f, 0.038874f, 0.056640f, 0.072553f, 0.087565f, + 0.101794f, 0.113622f, 0.121301f, 0.124936f, 0.126283f, 0.126618f, 0.125103f, 0.119406f, 0.107998f, 0.091827f, 0.073557f, 0.055064f, 0.035918f, 0.014525f, -0.009510f, -0.034439f, -0.057660f, -0.077747f, -0.095384f, -0.112527f, -0.130553f, -0.149032f, -0.166196f, -0.180522f, -0.191817f, -0.201118f, -0.209934f, -0.219423f, -0.229793f, -0.240368f, -0.250415f, -0.259888f, -0.269297f, -0.279146f, -0.289735f, -0.301233f, -0.313608f, -0.326568f, -0.339762f, -0.352968f, -0.366026f, -0.378749f, -0.390962f, -0.402499f, -0.413143f, -0.422598f, -0.430524f, -0.436635f, -0.440820f, -0.443116f, -0.443609f, -0.442643f, -0.440995f, -0.439351f, -0.437985f, -0.437691f, -0.439475f, -0.440249f, -0.429869f, -0.398587f, -0.350485f, -0.304484f, -0.277094f, -0.267957f} + } +}; +const float CRendBin_FOA_HRIR_coeff_im_32kHz[4][BINAURAL_CHANNELS][160]={ + { + {-0.232358f, -0.618932f, -0.817988f, -0.822429f, -0.704120f, -0.543614f, -0.378833f, -0.206926f, -0.018121f, 0.180000f, 0.364897f, 0.514426f, 0.616459f, 0.668682f, 0.675051f, 0.643723f, 0.585693f, 0.511949f, 0.429816f, 0.341780f, 0.248555f, 0.153155f, 0.060910f, -0.024611f, -0.104107f, -0.179953f, -0.252112f, -0.317896f, -0.375138f, -0.424053f, -0.465990f, -0.501801f, -0.532062f, -0.557932f, -0.580799f, -0.601232f, -0.618935f, -0.633778f, -0.646448f, -0.657961f, -0.668856f, -0.679034f, -0.688176f, -0.696064f, -0.702581f, -0.707694f, -0.711504f, -0.714221f, -0.716020f, -0.716930f, -0.716876f, -0.715816f, -0.713811f, -0.710965f, -0.707339f, -0.703007f, -0.698153f, -0.693006f, -0.687652f, -0.682057f, -0.676269f, -0.670441f, -0.664614f, -0.658690f, -0.652674f, -0.646792f, -0.641260f, -0.636117f, -0.631369f, -0.627101f, -0.623357f, -0.620039f, -0.617052f, -0.614426f, -0.612191f, -0.610248f, -0.608457f, -0.606735f, -0.604964f, -0.602902f, -0.600284f, -0.596973f, -0.592896f, -0.587908f, -0.581839f, -0.574727f, -0.566872f, -0.558610f, -0.550047f, -0.541068f, -0.531535f, -0.521448f, -0.510981f, -0.500437f, -0.490122f, -0.480207f, + -0.470732f, -0.461729f, -0.453265f, -0.445358f, -0.437994f, -0.431236f, -0.425185f, -0.419778f, -0.414766f, -0.409960f, -0.405367f, -0.401056f, -0.396961f, -0.392823f, -0.388266f, -0.382991f, -0.376987f, -0.370509f, -0.363780f, -0.356832f, -0.349674f, -0.342400f, -0.335071f, -0.327671f, -0.320250f, -0.312889f, -0.305495f, -0.297875f, -0.290005f, -0.282015f, -0.273947f, -0.265780f, -0.257599f, -0.249466f, -0.241282f, -0.233043f, -0.224988f, -0.217256f, -0.209671f, -0.202109f, -0.194641f, -0.187154f, -0.179346f, -0.171265f, -0.163191f, -0.154940f, -0.146069f, -0.136661f, -0.126931f, -0.116365f, -0.104453f, -0.091629f, -0.077926f, -0.061879f, -0.042494f, -0.019328f, 0.013280f, 0.066673f, 0.141327f, 0.209865f, 0.231108f, 0.189731f, 0.112424f, 0.035208f}, + {-0.232358f, -0.618932f, -0.817988f, -0.822429f, -0.704120f, -0.543614f, -0.378833f, -0.206926f, -0.018121f, 0.180000f, 0.364897f, 0.514426f, 0.616459f, 0.668682f, 0.675051f, 0.643723f, 0.585693f, 0.511949f, 0.429816f, 0.341780f, 0.248555f, 0.153155f, 0.060910f, -0.024611f, -0.104107f, -0.179953f, -0.252112f, -0.317896f, -0.375138f, -0.424053f, -0.465990f, -0.501801f, -0.532062f, -0.557932f, -0.580799f, -0.601232f, -0.618935f, -0.633778f, -0.646448f, -0.657961f, -0.668856f, -0.679034f, -0.688176f, -0.696064f, -0.702581f, -0.707694f, -0.711504f, -0.714221f, -0.716020f, -0.716930f, -0.716876f, -0.715816f, -0.713811f, -0.710965f, -0.707339f, -0.703007f, -0.698153f, -0.693006f, -0.687652f, -0.682057f, -0.676269f, -0.670441f, -0.664614f, -0.658690f, -0.652674f, -0.646792f, -0.641260f, -0.636117f, -0.631369f, -0.627101f, -0.623357f, -0.620039f, -0.617052f, -0.614426f, -0.612191f, -0.610248f, -0.608457f, -0.606735f, -0.604964f, -0.602902f, -0.600284f, -0.596973f, -0.592896f, -0.587908f, -0.581839f, -0.574727f, -0.566872f, -0.558610f, -0.550047f, -0.541068f, -0.531535f, -0.521448f, -0.510981f, -0.500437f, -0.490122f, -0.480207f, + -0.470732f, -0.461729f, -0.453265f, -0.445358f, -0.437994f, -0.431236f, -0.425185f, -0.419778f, -0.414766f, -0.409960f, -0.405367f, -0.401056f, -0.396961f, -0.392823f, -0.388266f, -0.382991f, -0.376987f, -0.370509f, -0.363780f, -0.356832f, -0.349674f, -0.342400f, -0.335071f, -0.327671f, -0.320250f, -0.312889f, -0.305495f, -0.297875f, -0.290005f, -0.282015f, -0.273947f, -0.265780f, -0.257599f, -0.249466f, -0.241282f, -0.233043f, -0.224988f, -0.217256f, -0.209671f, -0.202109f, -0.194641f, -0.187154f, -0.179346f, -0.171265f, -0.163191f, -0.154940f, -0.146069f, -0.136661f, -0.126931f, -0.116365f, -0.104453f, -0.091629f, -0.077926f, -0.061879f, -0.042494f, -0.019328f, 0.013280f, 0.066673f, 0.141327f, 0.209865f, 0.231108f, 0.189731f, 0.112424f, 0.035208f} + }, + { + {0.140725f, 0.285846f, 0.114832f, -0.338829f, -0.858853f, -1.200757f, -1.243681f, -1.024467f, -0.658777f, -0.249357f, 0.145208f, 0.495328f, 0.784769f, 1.007322f, 1.163699f, 1.256377f, 1.289073f, 1.269367f, 1.208734f, 1.120266f, 1.016312f, 0.905408f, 0.790167f, 0.670170f, 0.547622f, 0.428343f, 0.317200f, 0.214919f, 0.119693f, 0.029734f, -0.056227f, -0.138879f, -0.217755f, -0.291611f, -0.359863f, -0.423205f, -0.482880f, -0.539767f, -0.593809f, -0.643836f, -0.688282f, -0.726462f, -0.758927f, -0.786612f, -0.810154f, -0.830039f, -0.846690f, -0.860232f, -0.870666f, -0.878418f, -0.884314f, -0.889009f, -0.892646f, -0.894952f, -0.895464f, -0.893873f, -0.890318f, -0.885190f, -0.878745f, -0.871264f, -0.863433f, -0.855991f, -0.849090f, -0.842574f, -0.836712f, -0.831995f, -0.828338f, -0.825230f, -0.822595f, -0.820794f, -0.819852f, -0.819422f, -0.819501f, -0.820450f, -0.822267f, -0.824464f, -0.826748f, -0.829242f, -0.831935f, -0.834417f, -0.836352f, -0.837828f, -0.839046f, -0.839930f, -0.840203f, -0.839703f, -0.838501f, -0.836856f, -0.835153f, -0.833735f, -0.832516f, -0.830749f, -0.827395f, -0.821885f, -0.814387f, -0.805210f, + -0.794148f, -0.780636f, -0.764422f, -0.745876f, -0.725740f, -0.704713f, -0.683108f, -0.660784f, -0.637569f, -0.613932f, -0.590994f, -0.569749f, -0.550511f, -0.533220f, -0.517926f, -0.504746f, -0.493587f, -0.484110f, -0.475879f, -0.468521f, -0.461919f, -0.456181f, -0.451182f, -0.446293f, -0.440761f, -0.434205f, -0.426610f, -0.418162f, -0.409301f, -0.400521f, -0.391893f, -0.383127f, -0.374182f, -0.365278f, -0.356340f, -0.347069f, -0.337579f, -0.328306f, -0.319353f, -0.310619f, -0.302285f, -0.294430f, -0.286564f, -0.278288f, -0.269879f, -0.261530f, -0.252867f, -0.243819f, -0.234732f, -0.225124f, -0.213896f, -0.200946f, -0.186484f, -0.169123f, -0.147421f, -0.120998f, -0.084260f, -0.023064f, 0.068036f, 0.162002f, 0.209461f, 0.185183f, 0.113708f, 0.036109f}, + {-0.140725f, -0.285846f, -0.114832f, 0.338829f, 0.858853f, 1.200757f, 1.243681f, 1.024467f, 0.658777f, 0.249357f, -0.145208f, -0.495328f, -0.784769f, -1.007322f, -1.163699f, -1.256377f, -1.289073f, -1.269367f, -1.208734f, -1.120266f, -1.016312f, -0.905408f, -0.790167f, -0.670170f, -0.547622f, -0.428343f, -0.317200f, -0.214919f, -0.119693f, -0.029734f, 0.056227f, 0.138879f, 0.217755f, 0.291611f, 0.359863f, 0.423205f, 0.482880f, 0.539767f, 0.593809f, 0.643836f, 0.688282f, 0.726462f, 0.758927f, 0.786612f, 0.810154f, 0.830039f, 0.846690f, 0.860232f, 0.870666f, 0.878418f, 0.884314f, 0.889009f, 0.892646f, 0.894952f, 0.895464f, 0.893873f, 0.890318f, 0.885190f, 0.878745f, 0.871264f, 0.863433f, 0.855991f, 0.849090f, 0.842574f, 0.836712f, 0.831995f, 0.828338f, 0.825230f, 0.822595f, 0.820794f, 0.819852f, 0.819422f, 0.819501f, 0.820450f, 0.822267f, 0.824464f, 0.826748f, 0.829242f, 0.831935f, 0.834417f, 0.836352f, 0.837828f, 0.839046f, 0.839930f, 0.840203f, 0.839703f, 0.838501f, 0.836856f, 0.835153f, 0.833735f, 0.832516f, 0.830749f, 0.827395f, 0.821885f, 0.814387f, 0.805210f, + 0.794148f, 0.780636f, 0.764422f, 0.745876f, 0.725740f, 0.704713f, 0.683108f, 0.660784f, 0.637569f, 0.613932f, 0.590994f, 0.569749f, 0.550511f, 0.533220f, 0.517926f, 0.504746f, 0.493587f, 0.484110f, 0.475879f, 0.468521f, 0.461919f, 0.456181f, 0.451182f, 0.446293f, 0.440761f, 0.434205f, 0.426610f, 0.418162f, 0.409301f, 0.400521f, 0.391893f, 0.383127f, 0.374182f, 0.365278f, 0.356340f, 0.347069f, 0.337579f, 0.328306f, 0.319353f, 0.310619f, 0.302285f, 0.294430f, 0.286564f, 0.278288f, 0.269879f, 0.261530f, 0.252867f, 0.243819f, 0.234732f, 0.225124f, 0.213896f, 0.200946f, 0.186484f, 0.169123f, 0.147421f, 0.120998f, 0.084260f, 0.023064f, -0.068036f, -0.162002f, -0.209461f, -0.185183f, -0.113708f, -0.036109f} + }, + { + {-0.025748f, -0.088043f, -0.139476f, -0.115197f, -0.011193f, 0.082969f, 0.088942f, 0.026588f, -0.034225f, -0.061322f, -0.062307f, -0.039701f, 0.006935f, 0.053627f, 0.070634f, 0.063527f, 0.064625f, 0.086525f, 0.109466f, 0.113177f, 0.098256f, 0.073370f, 0.040304f, -0.000903f, -0.043184f, -0.076634f, -0.097864f, -0.111901f, -0.126411f, -0.144854f, -0.164041f, -0.178000f, -0.183770f, -0.182295f, -0.174892f, -0.162161f, -0.146640f, -0.133405f, -0.126594f, -0.126862f, -0.132675f, -0.142567f, -0.155716f, -0.171595f, -0.189741f, -0.209590f, -0.230631f, -0.252944f, -0.277113f, -0.303296f, -0.330673f, -0.357881f, -0.383611f, -0.406858f, -0.426972f, -0.443418f, -0.455456f, -0.462382f, -0.464036f, -0.460461f, -0.451211f, -0.435760f, -0.414371f, -0.387638f, -0.355468f, -0.317605f, -0.274841f, -0.228581f, -0.179590f, -0.128261f, -0.075652f, -0.023161f, 0.028274f, 0.077590f, 0.123014f, 0.163229f, 0.198282f, 0.228110f, 0.251149f, 0.266010f, 0.273735f, 0.276588f, 0.274993f, 0.267638f, 0.254778f, 0.239529f, 0.224852f, 0.210436f, 0.194008f, 0.175358f, 0.157564f, 0.143811f, 0.134209f, 0.126617f, 0.119747f, 0.114269f, + 0.111331f, 0.111312f, 0.114089f, 0.119358f, 0.126337f, 0.133893f, 0.141375f, 0.149029f, 0.157354f, 0.166105f, 0.173888f, 0.178773f, 0.179595f, 0.176738f, 0.171416f, 0.164301f, 0.155212f, 0.143845f, 0.130161f, 0.114157f, 0.095909f, 0.075932f, 0.055076f, 0.034130f, 0.013765f, -0.005393f, -0.022978f, -0.038882f, -0.052804f, -0.064120f, -0.072409f, -0.077779f, -0.080530f, -0.080874f, -0.079051f, -0.075375f, -0.070202f, -0.064178f, -0.058307f, -0.053393f, -0.049529f, -0.046287f, -0.042980f, -0.038600f, -0.032246f, -0.024048f, -0.015064f, -0.005957f, 0.003498f, 0.013364f, 0.023023f, 0.032130f, 0.041053f, 0.049833f, 0.057916f, 0.065747f, 0.075176f, 0.086297f, 0.094235f, 0.091380f, 0.074398f, 0.048616f, 0.024108f, 0.006730f}, + {-0.025748f, -0.088043f, -0.139476f, -0.115197f, -0.011193f, 0.082969f, 0.088942f, 0.026588f, -0.034225f, -0.061322f, -0.062307f, -0.039701f, 0.006935f, 0.053627f, 0.070634f, 0.063527f, 0.064625f, 0.086525f, 0.109466f, 0.113177f, 0.098256f, 0.073370f, 0.040304f, -0.000903f, -0.043184f, -0.076634f, -0.097864f, -0.111901f, -0.126411f, -0.144854f, -0.164041f, -0.178000f, -0.183770f, -0.182295f, -0.174892f, -0.162161f, -0.146640f, -0.133405f, -0.126594f, -0.126862f, -0.132675f, -0.142567f, -0.155716f, -0.171595f, -0.189741f, -0.209590f, -0.230631f, -0.252944f, -0.277113f, -0.303296f, -0.330673f, -0.357881f, -0.383611f, -0.406858f, -0.426972f, -0.443418f, -0.455456f, -0.462382f, -0.464036f, -0.460461f, -0.451211f, -0.435760f, -0.414371f, -0.387638f, -0.355468f, -0.317605f, -0.274841f, -0.228581f, -0.179590f, -0.128261f, -0.075652f, -0.023161f, 0.028274f, 0.077590f, 0.123014f, 0.163229f, 0.198282f, 0.228110f, 0.251149f, 0.266010f, 0.273735f, 0.276588f, 0.274993f, 0.267638f, 0.254778f, 0.239529f, 0.224852f, 0.210436f, 0.194008f, 0.175358f, 0.157564f, 0.143811f, 0.134209f, 0.126617f, 0.119747f, 0.114269f, + 0.111331f, 0.111312f, 0.114089f, 0.119358f, 0.126337f, 0.133893f, 0.141375f, 0.149029f, 0.157354f, 0.166105f, 0.173888f, 0.178773f, 0.179595f, 0.176738f, 0.171416f, 0.164301f, 0.155212f, 0.143845f, 0.130161f, 0.114157f, 0.095909f, 0.075932f, 0.055076f, 0.034130f, 0.013765f, -0.005393f, -0.022978f, -0.038882f, -0.052804f, -0.064120f, -0.072409f, -0.077779f, -0.080530f, -0.080874f, -0.079051f, -0.075375f, -0.070202f, -0.064178f, -0.058307f, -0.053393f, -0.049529f, -0.046287f, -0.042980f, -0.038600f, -0.032246f, -0.024048f, -0.015064f, -0.005957f, 0.003498f, 0.013364f, 0.023023f, 0.032130f, 0.041053f, 0.049833f, 0.057916f, 0.065747f, 0.075176f, 0.086297f, 0.094235f, 0.091380f, 0.074398f, 0.048616f, 0.024108f, 0.006730f} + }, + { + {0.004469f, -0.013004f, -0.069105f, -0.111166f, -0.088832f, -0.021733f, 0.020879f, -0.001719f, -0.063420f, -0.107499f, -0.101798f, -0.054848f, 0.005100f, 0.055067f, 0.089328f, 0.118238f, 0.155712f, 0.203896f, 0.250771f, 0.283001f, 0.296634f, 0.294104f, 0.277764f, 0.251482f, 0.223398f, 0.199881f, 0.177918f, 0.148605f, 0.107643f, 0.058242f, 0.004301f, -0.054426f, -0.119079f, -0.187240f, -0.254072f, -0.316062f, -0.371526f, -0.418353f, -0.453530f, -0.475436f, -0.485529f, -0.487199f, -0.483439f, -0.475999f, -0.466072f, -0.454762f, -0.442562f, -0.428896f, -0.412688f, -0.393430f, -0.371644f, -0.348652f, -0.326306f, -0.306758f, -0.291674f, -0.281173f, -0.273835f, -0.267982f, -0.262603f, -0.256924f, -0.250004f, -0.241478f, -0.232071f, -0.222562f, -0.212764f, -0.202253f, -0.191316f, -0.180223f, -0.168324f, -0.155035f, -0.140988f, -0.126915f, -0.112130f, -0.095556f, -0.077601f, -0.059440f, -0.041038f, -0.021717f, -0.002289f, 0.015312f, 0.030501f, 0.044216f, 0.056422f, 0.065288f, 0.069528f, 0.070062f, 0.068614f, 0.065893f, 0.061937f, 0.057048f, 0.051195f, 0.043250f, 0.032044f, 0.017911f, 0.002122f, -0.015098f, + -0.034951f, -0.058147f, -0.083429f, -0.108599f, -0.132778f, -0.157148f, -0.183384f, -0.211440f, -0.238983f, -0.263177f, -0.283075f, -0.300073f, -0.315887f, -0.330370f, -0.341598f, -0.347926f, -0.349714f, -0.349134f, -0.348462f, -0.348374f, -0.347673f, -0.344642f, -0.338765f, -0.331173f, -0.323708f, -0.317734f, -0.313552f, -0.310449f, -0.307281f, -0.303381f, -0.299002f, -0.294820f, -0.291172f, -0.287927f, -0.284777f, -0.281331f, -0.277114f, -0.271760f, -0.265156f, -0.257312f, -0.248203f, -0.237804f, -0.226127f, -0.213169f, -0.198913f, -0.183401f, -0.166800f, -0.149450f, -0.131791f, -0.114224f, -0.097167f, -0.081134f, -0.066331f, -0.052328f, -0.038637f, -0.024717f, -0.007855f, 0.017147f, 0.051304f, 0.083630f, 0.096079f, 0.080803f, 0.048580f, 0.015325f}, + {0.004469f, -0.013004f, -0.069105f, -0.111166f, -0.088832f, -0.021733f, 0.020879f, -0.001719f, -0.063420f, -0.107499f, -0.101798f, -0.054848f, 0.005100f, 0.055067f, 0.089328f, 0.118238f, 0.155712f, 0.203896f, 0.250771f, 0.283001f, 0.296634f, 0.294104f, 0.277764f, 0.251482f, 0.223398f, 0.199881f, 0.177918f, 0.148605f, 0.107643f, 0.058242f, 0.004301f, -0.054426f, -0.119079f, -0.187240f, -0.254072f, -0.316062f, -0.371526f, -0.418353f, -0.453530f, -0.475436f, -0.485529f, -0.487199f, -0.483439f, -0.475999f, -0.466072f, -0.454762f, -0.442562f, -0.428896f, -0.412688f, -0.393430f, -0.371644f, -0.348652f, -0.326306f, -0.306758f, -0.291674f, -0.281173f, -0.273835f, -0.267982f, -0.262603f, -0.256924f, -0.250004f, -0.241478f, -0.232071f, -0.222562f, -0.212764f, -0.202253f, -0.191316f, -0.180223f, -0.168324f, -0.155035f, -0.140988f, -0.126915f, -0.112130f, -0.095556f, -0.077601f, -0.059440f, -0.041038f, -0.021717f, -0.002289f, 0.015312f, 0.030501f, 0.044216f, 0.056422f, 0.065288f, 0.069528f, 0.070062f, 0.068614f, 0.065893f, 0.061937f, 0.057048f, 0.051195f, 0.043250f, 0.032044f, 0.017911f, 0.002122f, -0.015098f, + -0.034951f, -0.058147f, -0.083429f, -0.108599f, -0.132778f, -0.157148f, -0.183384f, -0.211440f, -0.238983f, -0.263177f, -0.283075f, -0.300073f, -0.315887f, -0.330370f, -0.341598f, -0.347926f, -0.349714f, -0.349134f, -0.348462f, -0.348374f, -0.347673f, -0.344642f, -0.338765f, -0.331173f, -0.323708f, -0.317734f, -0.313552f, -0.310449f, -0.307281f, -0.303381f, -0.299002f, -0.294820f, -0.291172f, -0.287927f, -0.284777f, -0.281331f, -0.277114f, -0.271760f, -0.265156f, -0.257312f, -0.248203f, -0.237804f, -0.226127f, -0.213169f, -0.198913f, -0.183401f, -0.166800f, -0.149450f, -0.131791f, -0.114224f, -0.097167f, -0.081134f, -0.066331f, -0.052328f, -0.038637f, -0.024717f, -0.007855f, 0.017147f, 0.051304f, 0.083630f, 0.096079f, 0.080803f, 0.048580f, 0.015325f} + } +}; +const float *CRendBin_FOA_HRIR_coeff_diffuse_re_32kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const float *CRendBin_FOA_HRIR_coeff_diffuse_im_32kHz[BINAURAL_CHANNELS]={NULL,NULL}; + +/* Sample Rate = 16000 */ + +const int16_t CRendBin_FOA_HRIR_max_num_iterations_16kHz = 1; +const uint16_t CRendBin_FOA_HRIR_num_iterations_16kHz[4][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1} }; +const uint16_t CRendBin_FOA_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS] = {0, 0}; +const uint16_t CRendBin_FOA_HRIR_pIndex_frequency_max_16kHz[4][BINAURAL_CHANNELS][1]={{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}}}; +const uint16_t CRendBin_FOA_HRIR_index_frequency_max_diffuse_16kHz = 0; +const float CRendBin_FOA_HRIR_inv_diffuse_weight_16kHz[4]={0.000000f, 0.000000f, 0.000000f, 0.000000f}; +const uint16_t *CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const float CRendBin_FOA_HRIR_coeff_re_16kHz[4][BINAURAL_CHANNELS][80]={ + { + { 1.066299f, 0.831753f, 0.469820f, 0.113997f, -0.155945f, -0.332046f, -0.445167f, -0.521969f, -0.562027f, -0.547501f, -0.470580f, -0.344643f, -0.190080f, -0.022238f, 0.144217f, 0.293618f, 0.418613f, 0.521970f, 0.606614f, 0.672232f, 0.720345f, 0.753099f, 0.769493f, 0.770796f, 0.764174f, 0.753391f, 0.733696f, 0.702773f, 0.667010f, 0.631061f, 0.592423f, 0.551074f, 0.512366f, 0.477047f, 0.440550f, 0.403206f, 0.369206f, 0.337153f, 0.303479f, 0.270983f, 0.242735f, 0.214328f, 0.182386f, 0.151528f, 0.124233f, 0.095401f, 0.063829f, 0.035419f, 0.010359f, -0.017668f, -0.047701f, -0.073299f, -0.096723f, -0.124198f, -0.151868f, -0.173748f, -0.195138f, -0.221363f, -0.245696f, -0.264016f, -0.284769f, -0.310840f, -0.332497f, -0.348925f, -0.371386f, -0.398406f, -0.417735f, -0.434354f, -0.462032f, -0.492418f, -0.512100f, -0.536134f, -0.579084f, -0.619428f, -0.648156f, -0.709398f, -0.814740f, -0.869114f, -0.792023f, -0.672661f}, + { 1.066299f, 0.831753f, 0.469820f, 0.113997f, -0.155945f, -0.332046f, -0.445167f, -0.521969f, -0.562027f, -0.547501f, -0.470580f, -0.344643f, -0.190080f, -0.022238f, 0.144217f, 0.293618f, 0.418613f, 0.521970f, 0.606614f, 0.672232f, 0.720345f, 0.753099f, 0.769493f, 0.770796f, 0.764174f, 0.753391f, 0.733696f, 0.702773f, 0.667010f, 0.631061f, 0.592423f, 0.551074f, 0.512366f, 0.477047f, 0.440550f, 0.403206f, 0.369206f, 0.337153f, 0.303479f, 0.270983f, 0.242735f, 0.214328f, 0.182386f, 0.151528f, 0.124233f, 0.095401f, 0.063829f, 0.035419f, 0.010359f, -0.017668f, -0.047701f, -0.073299f, -0.096723f, -0.124198f, -0.151868f, -0.173748f, -0.195138f, -0.221363f, -0.245696f, -0.264016f, -0.284769f, -0.310840f, -0.332497f, -0.348925f, -0.371386f, -0.398406f, -0.417735f, -0.434354f, -0.462032f, -0.492418f, -0.512100f, -0.536134f, -0.579084f, -0.619428f, -0.648156f, -0.709398f, -0.814740f, -0.869114f, -0.792023f, -0.672661f} + }, + { + { 0.198789f, 0.479449f, 0.841384f, 1.014645f, 0.841631f, 0.375013f, -0.191824f, -0.677633f, -0.998453f, -1.149750f, -1.160640f, -1.068514f, -0.905139f, -0.691625f, -0.447031f, -0.192888f, 0.055312f, 0.289339f, 0.498414f, 0.671927f, 0.812235f, 0.929986f, 1.028010f, 1.102848f, 1.156570f, 1.193717f, 1.214057f, 1.219865f, 1.220241f, 1.218942f, 1.210137f, 1.192271f, 1.171448f, 1.148056f, 1.116865f, 1.080826f, 1.047158f, 1.012474f, 0.969360f, 0.921459f, 0.875238f, 0.826839f, 0.772906f, 0.720924f, 0.674871f, 0.627049f, 0.575132f, 0.527820f, 0.486114f, 0.441193f, 0.394366f, 0.354847f, 0.318787f, 0.276146f, 0.232314f, 0.196874f, 0.162640f, 0.121555f, 0.083765f, 0.056442f, 0.027308f, -0.009054f, -0.038581f, -0.059134f, -0.087738f, -0.123968f, -0.149625f, -0.170423f, -0.207343f, -0.249859f, -0.276408f, -0.306618f, -0.365081f, -0.423301f, -0.461101f, -0.538219f, -0.693008f, -0.822733f, -0.808512f, -0.718004f}, + { -0.198789f, -0.479449f, -0.841384f, -1.014645f, -0.841631f, -0.375013f, 0.191824f, 0.677633f, 0.998453f, 1.149750f, 1.160640f, 1.068514f, 0.905139f, 0.691625f, 0.447031f, 0.192888f, -0.055312f, -0.289339f, -0.498414f, -0.671927f, -0.812235f, -0.929986f, -1.028010f, -1.102848f, -1.156570f, -1.193717f, -1.214057f, -1.219865f, -1.220241f, -1.218942f, -1.210137f, -1.192271f, -1.171448f, -1.148056f, -1.116865f, -1.080826f, -1.047158f, -1.012474f, -0.969360f, -0.921459f, -0.875238f, -0.826839f, -0.772906f, -0.720924f, -0.674871f, -0.627049f, -0.575132f, -0.527820f, -0.486114f, -0.441193f, -0.394366f, -0.354847f, -0.318787f, -0.276146f, -0.232314f, -0.196874f, -0.162640f, -0.121555f, -0.083765f, -0.056442f, -0.027308f, 0.009054f, 0.038581f, 0.059134f, 0.087738f, 0.123968f, 0.149625f, 0.170423f, 0.207343f, 0.249859f, 0.276408f, 0.306618f, 0.365081f, 0.423301f, 0.461101f, 0.538219f, 0.693008f, 0.822733f, 0.808512f, 0.718004f} + }, + { + { 0.103651f, 0.085763f, 0.012539f, -0.093163f, -0.139453f, -0.082442f, 0.013534f, 0.062431f, 0.049641f, 0.010543f, -0.032439f, -0.071721f, -0.088915f, -0.070311f, -0.034358f, -0.013054f, -0.011243f, -0.004768f, 0.024546f, 0.069095f, 0.111091f, 0.143571f, 0.168893f, 0.185054f, 0.185266f, 0.170698f, 0.153302f, 0.142305f, 0.135188f, 0.125048f, 0.109492f, 0.089281f, 0.065694f, 0.042479f, 0.024528f, 0.013336f, 0.008677f, 0.012472f, 0.024654f, 0.039032f, 0.050209f, 0.059898f, 0.070266f, 0.077933f, 0.080669f, 0.081921f, 0.083181f, 0.080706f, 0.073626f, 0.065218f, 0.054022f, 0.034879f, 0.009091f, -0.018174f, -0.048558f, -0.086265f, -0.127620f, -0.167472f, -0.209212f, -0.256149f, -0.302368f, -0.343698f, -0.385541f, -0.429466f, -0.467232f, -0.496747f, -0.525598f, -0.552414f, -0.566656f, -0.570548f, -0.575284f, -0.574945f, -0.555162f, -0.525091f, -0.502518f, -0.469417f, -0.387422f, -0.261252f, -0.144788f, -0.082088f}, + { 0.103651f, 0.085763f, 0.012539f, -0.093163f, -0.139453f, -0.082442f, 0.013534f, 0.062431f, 0.049641f, 0.010543f, -0.032439f, -0.071721f, -0.088915f, -0.070311f, -0.034358f, -0.013054f, -0.011243f, -0.004768f, 0.024546f, 0.069095f, 0.111091f, 0.143571f, 0.168893f, 0.185054f, 0.185266f, 0.170698f, 0.153302f, 0.142305f, 0.135188f, 0.125048f, 0.109492f, 0.089281f, 0.065694f, 0.042479f, 0.024528f, 0.013336f, 0.008677f, 0.012472f, 0.024654f, 0.039032f, 0.050209f, 0.059898f, 0.070266f, 0.077933f, 0.080669f, 0.081921f, 0.083181f, 0.080706f, 0.073626f, 0.065218f, 0.054022f, 0.034879f, 0.009091f, -0.018174f, -0.048558f, -0.086265f, -0.127620f, -0.167472f, -0.209212f, -0.256149f, -0.302368f, -0.343698f, -0.385541f, -0.429466f, -0.467232f, -0.496747f, -0.525598f, -0.552414f, -0.566656f, -0.570548f, -0.575284f, -0.574945f, -0.555162f, -0.525091f, -0.502518f, -0.469417f, -0.387422f, -0.261252f, -0.144788f, -0.082088f} + }, + { + { 0.083483f, 0.110085f, 0.109339f, 0.051764f, -0.020010f, -0.039528f, 0.004322f, 0.056971f, 0.060463f, 0.007557f, -0.064887f, -0.117401f, -0.135318f, -0.128075f, -0.114412f, -0.106312f, -0.099989f, -0.081312f, -0.041326f, 0.015498f, 0.078415f, 0.140173f, 0.196734f, 0.243546f, 0.279130f, 0.309950f, 0.344966f, 0.385237f, 0.423595f, 0.454230f, 0.477480f, 0.494581f, 0.502830f, 0.498359f, 0.480501f, 0.451053f, 0.411362f, 0.362412f, 0.306822f, 0.249052f, 0.193565f, 0.143055f, 0.098009f, 0.057666f, 0.021358f, -0.011323f, -0.041360f, -0.070040f, -0.097383f, -0.121846f, -0.141922f, -0.157021f, -0.166819f, -0.171494f, -0.173029f, -0.174559f, -0.177852f, -0.182824f, -0.189469f, -0.198225f, -0.208300f, -0.217936f, -0.226727f, -0.235597f, -0.244500f, -0.252545f, -0.260216f, -0.268673f, -0.277131f, -0.284050f, -0.290328f, -0.297485f, -0.303758f, -0.307256f, -0.311324f, -0.317826f, -0.314403f, -0.281644f, -0.222084f, -0.172483f}, + { 0.083483f, 0.110085f, 0.109339f, 0.051764f, -0.020010f, -0.039528f, 0.004322f, 0.056971f, 0.060463f, 0.007557f, -0.064887f, -0.117401f, -0.135318f, -0.128075f, -0.114412f, -0.106312f, -0.099989f, -0.081312f, -0.041326f, 0.015498f, 0.078415f, 0.140173f, 0.196734f, 0.243546f, 0.279130f, 0.309950f, 0.344966f, 0.385237f, 0.423595f, 0.454230f, 0.477480f, 0.494581f, 0.502830f, 0.498359f, 0.480501f, 0.451053f, 0.411362f, 0.362412f, 0.306822f, 0.249052f, 0.193565f, 0.143055f, 0.098009f, 0.057666f, 0.021358f, -0.011323f, -0.041360f, -0.070040f, -0.097383f, -0.121846f, -0.141922f, -0.157021f, -0.166819f, -0.171494f, -0.173029f, -0.174559f, -0.177852f, -0.182824f, -0.189469f, -0.198225f, -0.208300f, -0.217936f, -0.226727f, -0.235597f, -0.244500f, -0.252545f, -0.260216f, -0.268673f, -0.277131f, -0.284050f, -0.290328f, -0.297485f, -0.303758f, -0.307256f, -0.311324f, -0.317826f, -0.314403f, -0.281644f, -0.222084f, -0.172483f} + } +}; +const float CRendBin_FOA_HRIR_coeff_im_16kHz[4][BINAURAL_CHANNELS][80]={ + { + { -0.232163f, -0.616528f, -0.811918f, -0.814798f, -0.695968f, -0.532619f, -0.364404f, -0.191506f, -0.001808f, 0.199692f, 0.387587f, 0.537698f, 0.641196f, 0.697162f, 0.705949f, 0.675021f, 0.619155f, 0.549292f, 0.468934f, 0.381382f, 0.291066f, 0.199434f, 0.108353f, 0.023680f, -0.052215f, -0.124647f, -0.196123f, -0.260439f, -0.313530f, -0.359586f, -0.401100f, -0.434616f, -0.460396f, -0.484091f, -0.506500f, -0.523681f, -0.536851f, -0.550232f, -0.562059f, -0.569337f, -0.575950f, -0.585287f, -0.592832f, -0.595580f, -0.598359f, -0.603032f, -0.604124f, -0.600994f, -0.599842f, -0.600349f, -0.596133f, -0.588817f, -0.584797f, -0.581075f, -0.571581f, -0.560976f, -0.555050f, -0.547876f, -0.534759f, -0.523342f, -0.517217f, -0.507305f, -0.491703f, -0.480933f, -0.474754f, -0.461397f, -0.443990f, -0.435549f, -0.429457f, -0.411877f, -0.393966f, -0.389373f, -0.379526f, -0.350778f, -0.331174f, -0.325571f, -0.264083f, -0.109094f, 0.034816f, 0.040644f}, + { -0.232163f, -0.616528f, -0.811918f, -0.814798f, -0.695968f, -0.532619f, -0.364404f, -0.191506f, -0.001808f, 0.199692f, 0.387587f, 0.537698f, 0.641196f, 0.697162f, 0.705949f, 0.675021f, 0.619155f, 0.549292f, 0.468934f, 0.381382f, 0.291066f, 0.199434f, 0.108353f, 0.023680f, -0.052215f, -0.124647f, -0.196123f, -0.260439f, -0.313530f, -0.359586f, -0.401100f, -0.434616f, -0.460396f, -0.484091f, -0.506500f, -0.523681f, -0.536851f, -0.550232f, -0.562059f, -0.569337f, -0.575950f, -0.585287f, -0.592832f, -0.595580f, -0.598359f, -0.603032f, -0.604124f, -0.600994f, -0.599842f, -0.600349f, -0.596133f, -0.588817f, -0.584797f, -0.581075f, -0.571581f, -0.560976f, -0.555050f, -0.547876f, -0.534759f, -0.523342f, -0.517217f, -0.507305f, -0.491703f, -0.480933f, -0.474754f, -0.461397f, -0.443990f, -0.435549f, -0.429457f, -0.411877f, -0.393966f, -0.389373f, -0.379526f, -0.350778f, -0.331174f, -0.325571f, -0.264083f, -0.109094f, 0.034816f, 0.040644f} + }, + { + { 0.140804f, 0.288820f, 0.122901f, -0.328836f, -0.848509f, -1.186567f, -1.224746f, -1.004466f, -0.637872f, -0.223802f, 0.174851f, 0.525416f, 0.816608f, 1.044355f, 1.203947f, 1.296780f, 1.332269f, 1.317962f, 1.259572f, 1.171367f, 1.071313f, 0.965637f, 0.851706f, 0.732493f, 0.614874f, 0.500288f, 0.389707f, 0.289113f, 0.199637f, 0.113528f, 0.027703f, -0.052051f, -0.124690f, -0.195739f, -0.263851f, -0.322890f, -0.376254f, -0.431439f, -0.484825f, -0.529101f, -0.567623f, -0.605089f, -0.635842f, -0.656446f, -0.674899f, -0.694758f, -0.708108f, -0.713529f, -0.720098f, -0.728010f, -0.728543f, -0.724531f, -0.725793f, -0.727741f, -0.720454f, -0.710172f, -0.705821f, -0.698895f, -0.681963f, -0.666550f, -0.659346f, -0.647466f, -0.627275f, -0.614491f, -0.610170f, -0.596698f, -0.576958f, -0.570455f, -0.569107f, -0.551386f, -0.531742f, -0.532880f, -0.530696f, -0.501217f, -0.483082f, -0.497277f, -0.457348f, -0.288094f, -0.085091f, 0.000003f}, + { -0.140804f, -0.288820f, -0.122901f, 0.328836f, 0.848509f, 1.186567f, 1.224746f, 1.004466f, 0.637872f, 0.223802f, -0.174851f, -0.525416f, -0.816608f, -1.044355f, -1.203947f, -1.296780f, -1.332269f, -1.317962f, -1.259572f, -1.171367f, -1.071313f, -0.965637f, -0.851706f, -0.732493f, -0.614874f, -0.500288f, -0.389707f, -0.289113f, -0.199637f, -0.113528f, -0.027703f, 0.052051f, 0.124690f, 0.195739f, 0.263851f, 0.322890f, 0.376254f, 0.431439f, 0.484825f, 0.529101f, 0.567623f, 0.605089f, 0.635842f, 0.656446f, 0.674899f, 0.694758f, 0.708108f, 0.713529f, 0.720098f, 0.728010f, 0.728543f, 0.724531f, 0.725793f, 0.727741f, 0.720454f, 0.710172f, 0.705821f, 0.698895f, 0.681963f, 0.666550f, 0.659346f, 0.647466f, 0.627275f, 0.614491f, 0.610170f, 0.596698f, 0.576958f, 0.570455f, 0.569107f, 0.551386f, 0.531742f, 0.532880f, 0.530696f, 0.501217f, 0.483082f, 0.497277f, 0.457348f, 0.288094f, 0.085091f, -0.000003f} + }, + { + { -0.025177f, -0.087633f, -0.140274f, -0.115695f, -0.010636f, 0.082920f, 0.087853f, 0.026212f, -0.033798f, -0.061874f, -0.063579f, -0.039952f, 0.007102f, 0.052570f, 0.069283f, 0.063355f, 0.064400f, 0.084995f, 0.108122f, 0.112992f, 0.097520f, 0.071428f, 0.039020f, -0.001236f, -0.044527f, -0.078904f, -0.099083f, -0.112548f, -0.128423f, -0.147364f, -0.165244f, -0.179148f, -0.186479f, -0.184966f, -0.176189f, -0.164004f, -0.150041f, -0.136188f, -0.128157f, -0.129591f, -0.136736f, -0.145463f, -0.157784f, -0.175387f, -0.194418f, -0.212665f, -0.233498f, -0.257959f, -0.282364f, -0.306702f, -0.334694f, -0.364260f, -0.389417f, -0.410847f, -0.432554f, -0.451286f, -0.461837f, -0.467316f, -0.471644f, -0.469923f, -0.458220f, -0.442113f, -0.424518f, -0.398733f, -0.363110f, -0.325903f, -0.288018f, -0.241039f, -0.187411f, -0.138730f, -0.091862f, -0.035017f, 0.023593f, 0.067423f, 0.108501f, 0.170368f, 0.233774f, 0.244228f, 0.178383f, 0.063811f}, + { -0.025177f, -0.087633f, -0.140274f, -0.115695f, -0.010636f, 0.082920f, 0.087853f, 0.026212f, -0.033798f, -0.061874f, -0.063579f, -0.039952f, 0.007102f, 0.052570f, 0.069283f, 0.063355f, 0.064400f, 0.084995f, 0.108122f, 0.112992f, 0.097520f, 0.071428f, 0.039020f, -0.001236f, -0.044527f, -0.078904f, -0.099083f, -0.112548f, -0.128423f, -0.147364f, -0.165244f, -0.179148f, -0.186479f, -0.184966f, -0.176189f, -0.164004f, -0.150041f, -0.136188f, -0.128157f, -0.129591f, -0.136736f, -0.145463f, -0.157784f, -0.175387f, -0.194418f, -0.212665f, -0.233498f, -0.257959f, -0.282364f, -0.306702f, -0.334694f, -0.364260f, -0.389417f, -0.410847f, -0.432554f, -0.451286f, -0.461837f, -0.467316f, -0.471644f, -0.469923f, -0.458220f, -0.442113f, -0.424518f, -0.398733f, -0.363110f, -0.325903f, -0.288018f, -0.241039f, -0.187411f, -0.138730f, -0.091862f, -0.035017f, 0.023593f, 0.067423f, 0.108501f, 0.170368f, 0.233774f, 0.244228f, 0.178383f, 0.063811f} + }, + { + { 0.004703f, -0.012419f, -0.068264f, -0.109935f, -0.087140f, -0.019730f, 0.023154f, 0.000984f, -0.060278f, -0.104075f, -0.098075f, -0.050669f, 0.009688f, 0.059915f, 0.094514f, 0.123898f, 0.161742f, 0.210179f, 0.257436f, 0.290142f, 0.304107f, 0.301838f, 0.285923f, 0.260106f, 0.232315f, 0.209084f, 0.187584f, 0.158711f, 0.118014f, 0.068935f, 0.015486f, -0.042837f, -0.107244f, -0.175037f, -0.241360f, -0.302992f, -0.358214f, -0.404621f, -0.439290f, -0.460886f, -0.470726f, -0.471924f, -0.467673f, -0.459973f, -0.449766f, -0.437936f, -0.425279f, -0.411399f, -0.394870f, -0.375052f, -0.352862f, -0.329697f, -0.306974f, -0.286835f, -0.271419f, -0.260782f, -0.252993f, -0.246525f, -0.240909f, -0.235119f, -0.227642f, -0.218477f, -0.208956f, -0.199340f, -0.188795f, -0.177591f, -0.166699f, -0.155414f, -0.142302f, -0.128106f, -0.114274f, -0.099433f, -0.081705f, -0.063092f, -0.044843f, -0.019680f, 0.019853f, 0.060923f, 0.070962f, 0.031790f}, + { 0.004703f, -0.012419f, -0.068264f, -0.109935f, -0.087140f, -0.019730f, 0.023154f, 0.000984f, -0.060278f, -0.104075f, -0.098075f, -0.050669f, 0.009688f, 0.059915f, 0.094514f, 0.123898f, 0.161742f, 0.210179f, 0.257436f, 0.290142f, 0.304107f, 0.301838f, 0.285923f, 0.260106f, 0.232315f, 0.209084f, 0.187584f, 0.158711f, 0.118014f, 0.068935f, 0.015486f, -0.042837f, -0.107244f, -0.175037f, -0.241360f, -0.302992f, -0.358214f, -0.404621f, -0.439290f, -0.460886f, -0.470726f, -0.471924f, -0.467673f, -0.459973f, -0.449766f, -0.437936f, -0.425279f, -0.411399f, -0.394870f, -0.375052f, -0.352862f, -0.329697f, -0.306974f, -0.286835f, -0.271419f, -0.260782f, -0.252993f, -0.246525f, -0.240909f, -0.235119f, -0.227642f, -0.218477f, -0.208956f, -0.199340f, -0.188795f, -0.177591f, -0.166699f, -0.155414f, -0.142302f, -0.128106f, -0.114274f, -0.099433f, -0.081705f, -0.063092f, -0.044843f, -0.019680f, 0.019853f, 0.060923f, 0.070962f, 0.031790f} + } +}; +const float *CRendBin_FOA_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const float *CRendBin_FOA_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; + + + +/********************** CRendBin_HOA2_HRIR **********************/ + +const float CRendBin_HOA2_HRIR_latency_s = 0.000020834f; + +/* Sample Rate = 48000 */ + +const int16_t CRendBin_HOA2_HRIR_max_num_iterations_48kHz = 1; +const uint16_t CRendBin_HOA2_HRIR_num_iterations_48kHz[9][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1} }; +const uint16_t CRendBin_HOA2_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS] = {0, 0}; +const uint16_t CRendBin_HOA2_HRIR_pIndex_frequency_max_48kHz[9][BINAURAL_CHANNELS][1]={{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}}}; +const uint16_t CRendBin_HOA2_HRIR_index_frequency_max_diffuse_48kHz = 0; +const float CRendBin_HOA2_HRIR_inv_diffuse_weight_48kHz[9]={0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f}; +const uint16_t *CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const float CRendBin_HOA2_HRIR_coeff_re_48kHz[9][BINAURAL_CHANNELS][240]={ + { + {0.955467f, 0.635681f, 0.166653f, -0.248686f, -0.508651f, -0.626077f, -0.650285f, -0.604530f, -0.488417f, -0.308510f, -0.090053f, 0.133390f, 0.331939f, 0.484574f, 0.581273f, 0.623235f, 0.619217f, 0.579562f, 0.512138f, 0.422298f, 0.315745f, 0.200824f, 0.086720f, -0.021278f, -0.123379f, -0.220908f, -0.311538f, -0.390400f, -0.454756f, -0.505495f, -0.544554f, -0.573087f, -0.592353f, -0.604514f, -0.611652f, -0.614839f, -0.614702f, -0.612258f, -0.608712f, -0.604725f, -0.600146f, -0.594359f, -0.586798f, -0.577264f, -0.565860f, -0.552745f, -0.538040f, -0.521885f, -0.504388f, -0.485535f, -0.465319f, -0.443966f, -0.421881f, -0.399382f, -0.376688f, -0.354132f, -0.332145f, -0.310934f, -0.290358f, -0.270218f, -0.250519f, -0.231307f, -0.212442f, -0.193768f, -0.175388f, -0.157519f, -0.140147f, -0.123115f, -0.106462f, -0.090326f, -0.074575f, -0.058912f, -0.043292f, -0.027843f, -0.012429f, 0.003258f, 0.019199f, 0.035158f, 0.051271f, 0.067966f, 0.085226f, 0.102477f, 0.119366f, 0.136149f, 0.153084f, 0.169846f, 0.185867f, 0.201051f, 0.215857f, 0.230656f, 0.245156f, 0.258620f, 0.270655f, 0.281594f, 0.291923f, 0.301545f, + 0.309937f, 0.316968f, 0.323239f, 0.329553f, 0.336281f, 0.343277f, 0.350289f, 0.357415f, 0.365174f, 0.374055f, 0.384018f, 0.394584f, 0.405384f, 0.416401f, 0.427714f, 0.439268f, 0.450898f, 0.462356f, 0.473320f, 0.483570f, 0.493122f, 0.502098f, 0.510577f, 0.518647f, 0.526423f, 0.533949f, 0.541211f, 0.548278f, 0.555224f, 0.561949f, 0.568280f, 0.574177f, 0.579652f, 0.584611f, 0.589021f, 0.593080f, 0.597009f, 0.600857f, 0.604651f, 0.608500f, 0.612417f, 0.616274f, 0.620049f, 0.623888f, 0.627902f, 0.632129f, 0.636648f, 0.641474f, 0.646442f, 0.651406f, 0.656384f, 0.661348f, 0.666127f, 0.670667f, 0.675091f, 0.679372f, 0.683315f, 0.686889f, 0.690210f, 0.693196f, 0.695655f, 0.697621f, 0.699235f, 0.700467f, 0.701329f, 0.702091f, 0.702934f, 0.703776f, 0.704674f, 0.705900f, 0.707411f, 0.708825f, 0.710050f, 0.711305f, 0.712526f, 0.713461f, 0.714246f, 0.715152f, 0.716020f, 0.716635f, 0.717247f, 0.718065f, 0.718834f, 0.719533f, 0.720673f, 0.722398f, 0.724272f, 0.726300f, 0.728964f, 0.732074f, 0.734989f, 0.737890f, 0.741305f, 0.744740f, 0.747549f, 0.750362f, + 0.753763f, 0.756792f, 0.758849f, 0.761249f, 0.764561f, 0.766959f, 0.767817f, 0.769595f, 0.772990f, 0.774514f, 0.772907f, 0.772944f, 0.777562f, 0.781372f, 0.778511f, 0.772279f, 0.769953f, 0.772161f, 0.774253f, 0.773522f, 0.767718f, 0.752282f, 0.729193f, 0.714109f, 0.722150f, 0.746693f, 0.763324f, 0.757243f, 0.738026f, 0.724006f, 0.720101f, 0.717852f, 0.714019f, 0.720891f, 0.753307f, 0.807040f, 0.856442f, 0.878090f, 0.873417f, 0.862096f, 0.856572f, 0.853129f, 0.847435f, 0.844863f, 0.848629f, 0.849468f, 0.838876f, 0.825576f}, + {0.955467f, 0.635681f, 0.166653f, -0.248686f, -0.508651f, -0.626077f, -0.650285f, -0.604530f, -0.488417f, -0.308510f, -0.090053f, 0.133390f, 0.331939f, 0.484574f, 0.581273f, 0.623235f, 0.619217f, 0.579562f, 0.512138f, 0.422298f, 0.315745f, 0.200824f, 0.086720f, -0.021278f, -0.123379f, -0.220908f, -0.311538f, -0.390400f, -0.454756f, -0.505495f, -0.544554f, -0.573087f, -0.592353f, -0.604514f, -0.611652f, -0.614839f, -0.614702f, -0.612258f, -0.608712f, -0.604725f, -0.600146f, -0.594359f, -0.586798f, -0.577264f, -0.565860f, -0.552745f, -0.538040f, -0.521885f, -0.504388f, -0.485535f, -0.465319f, -0.443966f, -0.421881f, -0.399382f, -0.376688f, -0.354132f, -0.332145f, -0.310934f, -0.290358f, -0.270218f, -0.250519f, -0.231307f, -0.212442f, -0.193768f, -0.175388f, -0.157519f, -0.140147f, -0.123115f, -0.106462f, -0.090326f, -0.074575f, -0.058912f, -0.043292f, -0.027843f, -0.012429f, 0.003258f, 0.019199f, 0.035158f, 0.051271f, 0.067966f, 0.085226f, 0.102477f, 0.119366f, 0.136149f, 0.153084f, 0.169846f, 0.185867f, 0.201051f, 0.215857f, 0.230656f, 0.245156f, 0.258620f, 0.270655f, 0.281594f, 0.291923f, 0.301545f, + 0.309937f, 0.316968f, 0.323239f, 0.329553f, 0.336281f, 0.343277f, 0.350289f, 0.357415f, 0.365174f, 0.374055f, 0.384018f, 0.394584f, 0.405384f, 0.416401f, 0.427714f, 0.439268f, 0.450898f, 0.462356f, 0.473320f, 0.483570f, 0.493122f, 0.502098f, 0.510577f, 0.518647f, 0.526423f, 0.533949f, 0.541211f, 0.548278f, 0.555224f, 0.561949f, 0.568280f, 0.574177f, 0.579652f, 0.584611f, 0.589021f, 0.593080f, 0.597009f, 0.600857f, 0.604651f, 0.608500f, 0.612417f, 0.616274f, 0.620049f, 0.623888f, 0.627902f, 0.632129f, 0.636648f, 0.641474f, 0.646442f, 0.651406f, 0.656384f, 0.661348f, 0.666127f, 0.670667f, 0.675091f, 0.679372f, 0.683315f, 0.686889f, 0.690210f, 0.693196f, 0.695655f, 0.697621f, 0.699235f, 0.700467f, 0.701329f, 0.702091f, 0.702934f, 0.703776f, 0.704674f, 0.705900f, 0.707411f, 0.708825f, 0.710050f, 0.711305f, 0.712526f, 0.713461f, 0.714246f, 0.715152f, 0.716020f, 0.716635f, 0.717247f, 0.718065f, 0.718834f, 0.719533f, 0.720673f, 0.722398f, 0.724272f, 0.726300f, 0.728964f, 0.732074f, 0.734989f, 0.737890f, 0.741305f, 0.744740f, 0.747549f, 0.750362f, + 0.753763f, 0.756792f, 0.758849f, 0.761249f, 0.764561f, 0.766959f, 0.767817f, 0.769595f, 0.772990f, 0.774514f, 0.772907f, 0.772944f, 0.777562f, 0.781372f, 0.778511f, 0.772279f, 0.769953f, 0.772161f, 0.774253f, 0.773522f, 0.767718f, 0.752282f, 0.729193f, 0.714109f, 0.722150f, 0.746693f, 0.763324f, 0.757243f, 0.738026f, 0.724006f, 0.720101f, 0.717852f, 0.714019f, 0.720891f, 0.753307f, 0.807040f, 0.856442f, 0.878090f, 0.873417f, 0.862096f, 0.856572f, 0.853129f, 0.847435f, 0.844863f, 0.848629f, 0.849468f, 0.838876f, 0.825576f} + }, + { + {0.097314f, 0.414173f, 0.747626f, 0.754590f, 0.330783f, -0.326705f, -0.901613f, -1.190599f, -1.185056f, -0.986921f, -0.692990f, -0.354873f, -0.002249f, 0.335288f, 0.631311f, 0.869888f, 1.042481f, 1.143077f, 1.170924f, 1.135842f, 1.056300f, 0.949835f, 0.825366f, 0.685238f, 0.533253f, 0.378103f, 0.228763f, 0.089252f, -0.040641f, -0.161495f, -0.272981f, -0.375031f, -0.468133f, -0.552605f, -0.628716f, -0.697354f, -0.759761f, -0.816645f, -0.867878f, -0.912811f, -0.950646f, -0.980831f, -1.003432f, -1.019091f, -1.028553f, -1.032320f, -1.030690f, -1.023992f, -1.012844f, -0.998265f, -0.981431f, -0.963113f, -0.943286f, -0.921325f, -0.896613f, -0.869049f, -0.839024f, -0.807064f, -0.773676f, -0.739520f, -0.705375f, -0.671722f, -0.638603f, -0.606135f, -0.574805f, -0.544984f, -0.516534f, -0.489311f, -0.463725f, -0.440280f, -0.418894f, -0.399253f, -0.381525f, -0.365999f, -0.352195f, -0.339137f, -0.326488f, -0.314596f, -0.303283f, -0.291474f, -0.278425f, -0.264548f, -0.250445f, -0.235726f, -0.219500f, -0.201656f, -0.182949f, -0.163967f, -0.144609f, -0.124484f, -0.103249f, -0.080535f, -0.055987f, -0.029425f, -0.000739f, 0.030319f, + 0.063929f, 0.099772f, 0.136966f, 0.174386f, 0.211037f, 0.246212f, 0.279379f, 0.309898f, 0.336976f, 0.360053f, 0.379082f, 0.394265f, 0.405690f, 0.413493f, 0.418257f, 0.421046f, 0.423069f, 0.425261f, 0.427920f, 0.430738f, 0.433463f, 0.436544f, 0.440906f, 0.447174f, 0.455301f, 0.464713f, 0.474496f, 0.483726f, 0.492054f, 0.499849f, 0.507562f, 0.515203f, 0.522591f, 0.529726f, 0.536646f, 0.543230f, 0.549348f, 0.554966f, 0.560050f, 0.564644f, 0.569000f, 0.573385f, 0.577839f, 0.582298f, 0.586765f, 0.591237f, 0.595738f, 0.600532f, 0.606012f, 0.612378f, 0.619693f, 0.628054f, 0.637369f, 0.647229f, 0.657409f, 0.668130f, 0.679533f, 0.691385f, 0.703604f, 0.716403f, 0.729644f, 0.742723f, 0.755282f, 0.767338f, 0.778713f, 0.789114f, 0.798667f, 0.807637f, 0.815884f, 0.823219f, 0.829774f, 0.835517f, 0.840126f, 0.843797f, 0.847226f, 0.850573f, 0.853543f, 0.856458f, 0.859889f, 0.863411f, 0.866099f, 0.867816f, 0.868779f, 0.868745f, 0.867866f, 0.867084f, 0.866670f, 0.865984f, 0.865256f, 0.865448f, 0.866168f, 0.866282f, 0.866234f, 0.866993f, 0.867839f, 0.868126f, + 0.868997f, 0.870630f, 0.871367f, 0.871898f, 0.874706f, 0.877884f, 0.877771f, 0.878026f, 0.884032f, 0.889476f, 0.886115f, 0.884433f, 0.898714f, 0.912808f, 0.896260f, 0.858730f, 0.845640f, 0.869140f, 0.891869f, 0.896006f, 0.911910f, 0.948673f, 0.954899f, 0.894533f, 0.814533f, 0.786292f, 0.814134f, 0.846554f, 0.848304f, 0.823226f, 0.793405f, 0.782599f, 0.785720f, 0.738162f, 0.572339f, 0.335226f, 0.185068f, 0.220164f, 0.362443f, 0.464261f, 0.482183f, 0.481394f, 0.504881f, 0.514608f, 0.459824f, 0.346966f, 0.228758f, 0.156688f}, + {-0.097314f, -0.414173f, -0.747626f, -0.754590f, -0.330783f, 0.326705f, 0.901613f, 1.190599f, 1.185056f, 0.986921f, 0.692990f, 0.354873f, 0.002249f, -0.335288f, -0.631311f, -0.869888f, -1.042481f, -1.143077f, -1.170924f, -1.135842f, -1.056300f, -0.949835f, -0.825366f, -0.685238f, -0.533253f, -0.378103f, -0.228763f, -0.089252f, 0.040641f, 0.161495f, 0.272981f, 0.375031f, 0.468133f, 0.552605f, 0.628716f, 0.697354f, 0.759761f, 0.816645f, 0.867878f, 0.912811f, 0.950646f, 0.980831f, 1.003432f, 1.019091f, 1.028553f, 1.032320f, 1.030690f, 1.023992f, 1.012844f, 0.998265f, 0.981431f, 0.963113f, 0.943286f, 0.921325f, 0.896613f, 0.869049f, 0.839024f, 0.807064f, 0.773676f, 0.739520f, 0.705375f, 0.671722f, 0.638603f, 0.606135f, 0.574805f, 0.544984f, 0.516534f, 0.489311f, 0.463725f, 0.440280f, 0.418894f, 0.399253f, 0.381525f, 0.365999f, 0.352195f, 0.339137f, 0.326488f, 0.314596f, 0.303283f, 0.291474f, 0.278425f, 0.264548f, 0.250445f, 0.235726f, 0.219500f, 0.201656f, 0.182949f, 0.163967f, 0.144609f, 0.124484f, 0.103249f, 0.080535f, 0.055987f, 0.029425f, 0.000739f, -0.030319f, + -0.063929f, -0.099772f, -0.136966f, -0.174386f, -0.211037f, -0.246212f, -0.279379f, -0.309898f, -0.336976f, -0.360053f, -0.379082f, -0.394265f, -0.405690f, -0.413493f, -0.418257f, -0.421046f, -0.423069f, -0.425261f, -0.427920f, -0.430738f, -0.433463f, -0.436544f, -0.440906f, -0.447174f, -0.455301f, -0.464713f, -0.474496f, -0.483726f, -0.492054f, -0.499849f, -0.507562f, -0.515203f, -0.522591f, -0.529726f, -0.536646f, -0.543230f, -0.549348f, -0.554966f, -0.560050f, -0.564644f, -0.569000f, -0.573385f, -0.577839f, -0.582298f, -0.586765f, -0.591237f, -0.595738f, -0.600532f, -0.606012f, -0.612378f, -0.619693f, -0.628054f, -0.637369f, -0.647229f, -0.657409f, -0.668130f, -0.679533f, -0.691385f, -0.703604f, -0.716403f, -0.729644f, -0.742723f, -0.755282f, -0.767338f, -0.778713f, -0.789114f, -0.798667f, -0.807637f, -0.815884f, -0.823219f, -0.829774f, -0.835517f, -0.840126f, -0.843797f, -0.847226f, -0.850573f, -0.853543f, -0.856458f, -0.859889f, -0.863411f, -0.866099f, -0.867816f, -0.868779f, -0.868745f, -0.867866f, -0.867084f, -0.866670f, -0.865984f, -0.865256f, -0.865448f, -0.866168f, -0.866282f, -0.866234f, -0.866993f, -0.867839f, -0.868126f, + -0.868997f, -0.870630f, -0.871367f, -0.871898f, -0.874706f, -0.877884f, -0.877771f, -0.878026f, -0.884032f, -0.889476f, -0.886115f, -0.884433f, -0.898714f, -0.912808f, -0.896260f, -0.858730f, -0.845640f, -0.869140f, -0.891869f, -0.896006f, -0.911910f, -0.948673f, -0.954899f, -0.894533f, -0.814533f, -0.786292f, -0.814134f, -0.846554f, -0.848304f, -0.823226f, -0.793405f, -0.782599f, -0.785720f, -0.738162f, -0.572339f, -0.335226f, -0.185068f, -0.220164f, -0.362443f, -0.464261f, -0.482183f, -0.481394f, -0.504881f, -0.514608f, -0.459824f, -0.346966f, -0.228758f, -0.156688f} + }, + { + {0.116713f, 0.072126f, -0.020631f, -0.112176f, -0.120235f, -0.031894f, 0.067439f, 0.091659f, 0.039310f, -0.034445f, -0.085235f, -0.095294f, -0.062685f, -0.007339f, 0.035234f, 0.050997f, 0.062562f, 0.092595f, 0.130453f, 0.149870f, 0.142288f, 0.116439f, 0.078486f, 0.030060f, -0.020701f, -0.060937f, -0.085675f, -0.101228f, -0.116230f, -0.133115f, -0.147632f, -0.154014f, -0.150236f, -0.138833f, -0.123518f, -0.107035f, -0.092734f, -0.085340f, -0.087853f, -0.099007f, -0.115280f, -0.134212f, -0.154704f, -0.175585f, -0.195498f, -0.213771f, -0.230537f, -0.246204f, -0.261004f, -0.274518f, -0.285368f, -0.291759f, -0.292561f, -0.287601f, -0.276917f, -0.260193f, -0.237217f, -0.208432f, -0.174533f, -0.135701f, -0.091811f, -0.043233f, 0.009243f, 0.065150f, 0.124187f, 0.185310f, 0.246775f, 0.307108f, 0.365223f, 0.419659f, 0.468551f, 0.510367f, 0.543904f, 0.567857f, 0.581410f, 0.585089f, 0.579988f, 0.566359f, 0.544196f, 0.515148f, 0.482355f, 0.447851f, 0.411415f, 0.372943f, 0.334830f, 0.300327f, 0.269892f, 0.241113f, 0.212758f, 0.187086f, 0.166978f, 0.152277f, 0.140516f, 0.130249f, 0.122026f, 0.116711f, + 0.114395f, 0.114642f, 0.116582f, 0.118903f, 0.120560f, 0.121397f, 0.121803f, 0.122096f, 0.122081f, 0.120568f, 0.115639f, 0.106376f, 0.094049f, 0.080746f, 0.067280f, 0.053238f, 0.038276f, 0.022433f, 0.005947f, -0.010351f, -0.025082f, -0.037294f, -0.046681f, -0.052842f, -0.055367f, -0.054587f, -0.051101f, -0.044816f, -0.035505f, -0.023804f, -0.010663f, 0.003451f, 0.018016f, 0.032133f, 0.045369f, 0.057764f, 0.068693f, 0.077173f, 0.083414f, 0.088574f, 0.093316f, 0.098141f, 0.104298f, 0.112463f, 0.121400f, 0.129615f, 0.137158f, 0.144434f, 0.150888f, 0.156189f, 0.160875f, 0.164864f, 0.167274f, 0.168212f, 0.168642f, 0.168568f, 0.167544f, 0.166341f, 0.165856f, 0.165449f, 0.164412f, 0.163410f, 0.162696f, 0.161164f, 0.158594f, 0.156177f, 0.153901f, 0.150467f, 0.146055f, 0.141871f, 0.137505f, 0.132216f, 0.127455f, 0.124584f, 0.122335f, 0.119725f, 0.118247f, 0.118393f, 0.118126f, 0.116848f, 0.115875f, 0.114029f, 0.108671f, 0.100879f, 0.093121f, 0.083708f, 0.070519f, 0.056452f, 0.043960f, 0.029990f, 0.013203f, -0.001963f, -0.014381f, -0.028555f, -0.043767f, -0.054771f, + -0.064616f, -0.079267f, -0.092295f, -0.096950f, -0.104863f, -0.124550f, -0.137426f, -0.132020f, -0.136512f, -0.167601f, -0.183275f, -0.156719f, -0.153305f, -0.232829f, -0.312161f, -0.256735f, -0.095012f, 0.003970f, -0.025692f, -0.079935f, -0.088484f, -0.118715f, -0.210193f, -0.259911f, -0.175437f, -0.030063f, 0.040705f, 0.019139f, -0.011331f, -0.004889f, 0.006382f, -0.022770f, -0.100066f, -0.183271f, -0.195497f, -0.097381f, 0.039125f, 0.086187f, 0.011399f, -0.085034f, -0.108289f, -0.079208f, -0.069267f, -0.087019f, -0.087070f, -0.054365f, -0.019140f, -0.003388f}, + {0.116713f, 0.072126f, -0.020631f, -0.112176f, -0.120235f, -0.031894f, 0.067439f, 0.091659f, 0.039310f, -0.034445f, -0.085235f, -0.095294f, -0.062685f, -0.007339f, 0.035234f, 0.050997f, 0.062562f, 0.092595f, 0.130453f, 0.149870f, 0.142288f, 0.116439f, 0.078486f, 0.030060f, -0.020701f, -0.060937f, -0.085675f, -0.101228f, -0.116230f, -0.133115f, -0.147632f, -0.154014f, -0.150236f, -0.138833f, -0.123518f, -0.107035f, -0.092734f, -0.085340f, -0.087853f, -0.099007f, -0.115280f, -0.134212f, -0.154704f, -0.175585f, -0.195498f, -0.213771f, -0.230537f, -0.246204f, -0.261004f, -0.274518f, -0.285368f, -0.291759f, -0.292561f, -0.287601f, -0.276917f, -0.260193f, -0.237217f, -0.208432f, -0.174533f, -0.135701f, -0.091811f, -0.043233f, 0.009243f, 0.065150f, 0.124187f, 0.185310f, 0.246775f, 0.307108f, 0.365223f, 0.419659f, 0.468551f, 0.510367f, 0.543904f, 0.567857f, 0.581410f, 0.585089f, 0.579988f, 0.566359f, 0.544196f, 0.515148f, 0.482355f, 0.447851f, 0.411415f, 0.372943f, 0.334830f, 0.300327f, 0.269892f, 0.241113f, 0.212758f, 0.187086f, 0.166978f, 0.152277f, 0.140516f, 0.130249f, 0.122026f, 0.116711f, + 0.114395f, 0.114642f, 0.116582f, 0.118903f, 0.120560f, 0.121397f, 0.121803f, 0.122096f, 0.122081f, 0.120568f, 0.115639f, 0.106376f, 0.094049f, 0.080746f, 0.067280f, 0.053238f, 0.038276f, 0.022433f, 0.005947f, -0.010351f, -0.025082f, -0.037294f, -0.046681f, -0.052842f, -0.055367f, -0.054587f, -0.051101f, -0.044816f, -0.035505f, -0.023804f, -0.010663f, 0.003451f, 0.018016f, 0.032133f, 0.045369f, 0.057764f, 0.068693f, 0.077173f, 0.083414f, 0.088574f, 0.093316f, 0.098141f, 0.104298f, 0.112463f, 0.121400f, 0.129615f, 0.137158f, 0.144434f, 0.150888f, 0.156189f, 0.160875f, 0.164864f, 0.167274f, 0.168212f, 0.168642f, 0.168568f, 0.167544f, 0.166341f, 0.165856f, 0.165449f, 0.164412f, 0.163410f, 0.162696f, 0.161164f, 0.158594f, 0.156177f, 0.153901f, 0.150467f, 0.146055f, 0.141871f, 0.137505f, 0.132216f, 0.127455f, 0.124584f, 0.122335f, 0.119725f, 0.118247f, 0.118393f, 0.118126f, 0.116848f, 0.115875f, 0.114029f, 0.108671f, 0.100879f, 0.093121f, 0.083708f, 0.070519f, 0.056452f, 0.043960f, 0.029990f, 0.013203f, -0.001963f, -0.014381f, -0.028555f, -0.043767f, -0.054771f, + -0.064616f, -0.079267f, -0.092295f, -0.096950f, -0.104863f, -0.124550f, -0.137426f, -0.132020f, -0.136512f, -0.167601f, -0.183275f, -0.156719f, -0.153305f, -0.232829f, -0.312161f, -0.256735f, -0.095012f, 0.003970f, -0.025692f, -0.079935f, -0.088484f, -0.118715f, -0.210193f, -0.259911f, -0.175437f, -0.030063f, 0.040705f, 0.019139f, -0.011331f, -0.004889f, 0.006382f, -0.022770f, -0.100066f, -0.183271f, -0.195497f, -0.097381f, 0.039125f, 0.086187f, 0.011399f, -0.085034f, -0.108289f, -0.079208f, -0.069267f, -0.087019f, -0.087070f, -0.054365f, -0.019140f, -0.003388f} + }, + { + {0.057716f, 0.076756f, 0.058868f, -0.013782f, -0.079436f, -0.074073f, -0.016187f, 0.017124f, -0.018250f, -0.093448f, -0.149405f, -0.153777f, -0.115034f, -0.060844f, -0.011733f, 0.031700f, 0.082185f, 0.146750f, 0.215597f, 0.270817f, 0.301494f, 0.306907f, 0.290675f, 0.258743f, 0.219989f, 0.180823f, 0.138641f, 0.085701f, 0.019654f, -0.054132f, -0.130307f, -0.208118f, -0.286879f, -0.361597f, -0.426062f, -0.477609f, -0.516371f, -0.541854f, -0.552928f, -0.550365f, -0.537270f, -0.517036f, -0.491948f, -0.463535f, -0.433204f, -0.402160f, -0.370923f, -0.339116f, -0.306013f, -0.271593f, -0.237008f, -0.204076f, -0.174628f, -0.150090f, -0.130726f, -0.115027f, -0.100582f, -0.085793f, -0.070243f, -0.053770f, -0.036295f, -0.018447f, -0.001151f, 0.015432f, 0.031657f, 0.047424f, 0.062600f, 0.078005f, 0.094600f, 0.112028f, 0.129305f, 0.146558f, 0.164522f, 0.182587f, 0.199005f, 0.212998f, 0.224982f, 0.234524f, 0.239833f, 0.239930f, 0.235886f, 0.228926f, 0.218536f, 0.203779f, 0.185737f, 0.167006f, 0.148890f, 0.130591f, 0.111280f, 0.091321f, 0.070885f, 0.048967f, 0.024866f, -0.000541f, -0.026100f, -0.051960f, + -0.078659f, -0.105381f, -0.130303f, -0.152361f, -0.171822f, -0.189236f, -0.204261f, -0.215422f, -0.221132f, -0.221347f, -0.217950f, -0.212885f, -0.206158f, -0.196258f, -0.182255f, -0.164983f, -0.146569f, -0.129160f, -0.113464f, -0.098109f, -0.081029f, -0.061799f, -0.042161f, -0.024344f, -0.009539f, 0.002365f, 0.012635f, 0.023134f, 0.034939f, 0.047539f, 0.059892f, 0.071761f, 0.083571f, 0.095796f, 0.109100f, 0.124264f, 0.141372f, 0.159700f, 0.178598f, 0.197760f, 0.216729f, 0.235064f, 0.252852f, 0.270238f, 0.286751f, 0.301767f, 0.315065f, 0.326358f, 0.335078f, 0.341096f, 0.344846f, 0.346536f, 0.346164f, 0.344265f, 0.341562f, 0.338166f, 0.334119f, 0.330115f, 0.326715f, 0.323760f, 0.321440f, 0.320712f, 0.321901f, 0.324294f, 0.327593f, 0.332127f, 0.337417f, 0.342367f, 0.346858f, 0.351462f, 0.356178f, 0.361075f, 0.367067f, 0.374444f, 0.382147f, 0.389740f, 0.397992f, 0.406725f, 0.414722f, 0.422146f, 0.429946f, 0.437160f, 0.442159f, 0.445488f, 0.447970f, 0.448137f, 0.445126f, 0.440944f, 0.436547f, 0.430064f, 0.421619f, 0.414105f, 0.407405f, 0.399002f, 0.390437f, 0.384435f, + 0.377920f, 0.368392f, 0.361461f, 0.359383f, 0.352793f, 0.339519f, 0.334298f, 0.339584f, 0.332793f, 0.310207f, 0.306283f, 0.327892f, 0.317434f, 0.246418f, 0.196934f, 0.258692f, 0.381164f, 0.436129f, 0.404093f, 0.376464f, 0.381882f, 0.351261f, 0.276746f, 0.261983f, 0.357657f, 0.468349f, 0.494143f, 0.465205f, 0.461850f, 0.487233f, 0.497133f, 0.484317f, 0.455264f, 0.383620f, 0.267215f, 0.184416f, 0.211056f, 0.308507f, 0.369236f, 0.358171f, 0.338304f, 0.358938f, 0.388546f, 0.381045f, 0.357053f, 0.377955f, 0.457097f, 0.532101f}, + {0.057716f, 0.076756f, 0.058868f, -0.013782f, -0.079436f, -0.074073f, -0.016187f, 0.017124f, -0.018250f, -0.093448f, -0.149405f, -0.153777f, -0.115034f, -0.060844f, -0.011733f, 0.031700f, 0.082185f, 0.146750f, 0.215597f, 0.270817f, 0.301494f, 0.306907f, 0.290675f, 0.258743f, 0.219989f, 0.180823f, 0.138641f, 0.085701f, 0.019654f, -0.054132f, -0.130307f, -0.208118f, -0.286879f, -0.361597f, -0.426062f, -0.477609f, -0.516371f, -0.541854f, -0.552928f, -0.550365f, -0.537270f, -0.517036f, -0.491948f, -0.463535f, -0.433204f, -0.402160f, -0.370923f, -0.339116f, -0.306013f, -0.271593f, -0.237008f, -0.204076f, -0.174628f, -0.150090f, -0.130726f, -0.115027f, -0.100582f, -0.085793f, -0.070243f, -0.053770f, -0.036295f, -0.018447f, -0.001151f, 0.015432f, 0.031657f, 0.047424f, 0.062600f, 0.078005f, 0.094600f, 0.112028f, 0.129305f, 0.146558f, 0.164522f, 0.182587f, 0.199005f, 0.212998f, 0.224982f, 0.234524f, 0.239833f, 0.239930f, 0.235886f, 0.228926f, 0.218536f, 0.203779f, 0.185737f, 0.167006f, 0.148890f, 0.130591f, 0.111280f, 0.091321f, 0.070885f, 0.048967f, 0.024866f, -0.000541f, -0.026100f, -0.051960f, + -0.078659f, -0.105381f, -0.130303f, -0.152361f, -0.171822f, -0.189236f, -0.204261f, -0.215422f, -0.221132f, -0.221347f, -0.217950f, -0.212885f, -0.206158f, -0.196258f, -0.182255f, -0.164983f, -0.146569f, -0.129160f, -0.113464f, -0.098109f, -0.081029f, -0.061799f, -0.042161f, -0.024344f, -0.009539f, 0.002365f, 0.012635f, 0.023134f, 0.034939f, 0.047539f, 0.059892f, 0.071761f, 0.083571f, 0.095796f, 0.109100f, 0.124264f, 0.141372f, 0.159700f, 0.178598f, 0.197760f, 0.216729f, 0.235064f, 0.252852f, 0.270238f, 0.286751f, 0.301767f, 0.315065f, 0.326358f, 0.335078f, 0.341096f, 0.344846f, 0.346536f, 0.346164f, 0.344265f, 0.341562f, 0.338166f, 0.334119f, 0.330115f, 0.326715f, 0.323760f, 0.321440f, 0.320712f, 0.321901f, 0.324294f, 0.327593f, 0.332127f, 0.337417f, 0.342367f, 0.346858f, 0.351462f, 0.356178f, 0.361075f, 0.367067f, 0.374444f, 0.382147f, 0.389740f, 0.397992f, 0.406725f, 0.414722f, 0.422146f, 0.429946f, 0.437160f, 0.442159f, 0.445488f, 0.447970f, 0.448137f, 0.445126f, 0.440944f, 0.436547f, 0.430064f, 0.421619f, 0.414105f, 0.407405f, 0.399002f, 0.390437f, 0.384435f, + 0.377920f, 0.368392f, 0.361461f, 0.359383f, 0.352793f, 0.339519f, 0.334298f, 0.339584f, 0.332793f, 0.310207f, 0.306283f, 0.327892f, 0.317434f, 0.246418f, 0.196934f, 0.258692f, 0.381164f, 0.436129f, 0.404093f, 0.376464f, 0.381882f, 0.351261f, 0.276746f, 0.261983f, 0.357657f, 0.468349f, 0.494143f, 0.465205f, 0.461850f, 0.487233f, 0.497133f, 0.484317f, 0.455264f, 0.383620f, 0.267215f, 0.184416f, 0.211056f, 0.308507f, 0.369236f, 0.358171f, 0.338304f, 0.358938f, 0.388546f, 0.381045f, 0.357053f, 0.377955f, 0.457097f, 0.532101f} + }, + { + {0.022217f, 0.015375f, 0.018397f, 0.035300f, 0.046690f, 0.037732f, 0.022017f, 0.019869f, 0.019459f, -0.017327f, -0.102816f, -0.194710f, -0.234177f, -0.204599f, -0.138417f, -0.071733f, -0.010515f, 0.056797f, 0.132305f, 0.206318f, 0.271841f, 0.327874f, 0.371103f, 0.395052f, 0.398096f, 0.384964f, 0.359169f, 0.319562f, 0.265403f, 0.199868f, 0.126987f, 0.048878f, -0.032648f, -0.114915f, -0.195782f, -0.273182f, -0.342322f, -0.396309f, -0.431191f, -0.448778f, -0.453935f, -0.450961f, -0.442889f, -0.431917f, -0.419114f, -0.404570f, -0.388255f, -0.370115f, -0.349678f, -0.326644f, -0.301721f, -0.276201f, -0.251220f, -0.227989f, -0.207822f, -0.191043f, -0.176530f, -0.162962f, -0.149778f, -0.136591f, -0.122722f, -0.107799f, -0.091935f, -0.075014f, -0.056648f, -0.036913f, -0.016138f, 0.005944f, 0.029814f, 0.055061f, 0.080836f, 0.107214f, 0.134806f, 0.163054f, 0.190286f, 0.215551f, 0.238967f, 0.259885f, 0.276238f, 0.286705f, 0.292383f, 0.294992f, 0.294208f, 0.288458f, 0.278037f, 0.265391f, 0.251792f, 0.235652f, 0.215265f, 0.191614f, 0.166954f, 0.141873f, 0.115571f, 0.088358f, 0.062140f, 0.038532f, + 0.017724f, -0.000836f, -0.017500f, -0.032211f, -0.044805f, -0.055481f, -0.064916f, -0.073629f, -0.081559f, -0.088826f, -0.096406f, -0.105164f, -0.114511f, -0.122871f, -0.129287f, -0.134060f, -0.138257f, -0.143042f, -0.148807f, -0.154441f, -0.158070f, -0.158906f, -0.157915f, -0.156673f, -0.156277f, -0.157153f, -0.158912f, -0.160379f, -0.160516f, -0.159249f, -0.156964f, -0.153673f, -0.149149f, -0.143200f, -0.135383f, -0.125140f, -0.112610f, -0.098657f, -0.084044f, -0.069283f, -0.055081f, -0.042021f, -0.030039f, -0.019014f, -0.009440f, -0.001841f, 0.003841f, 0.007710f, 0.009630f, 0.009945f, 0.009536f, 0.008864f, 0.007876f, 0.006845f, 0.006260f, 0.006131f, 0.006419f, 0.007674f, 0.010369f, 0.014373f, 0.019846f, 0.027504f, 0.037346f, 0.048440f, 0.060307f, 0.073056f, 0.086098f, 0.098456f, 0.110125f, 0.121485f, 0.132067f, 0.141513f, 0.150626f, 0.159945f, 0.168818f, 0.177104f, 0.185774f, 0.194992f, 0.203954f, 0.212873f, 0.222383f, 0.231384f, 0.238515f, 0.244594f, 0.250498f, 0.254857f, 0.256981f, 0.258841f, 0.261200f, 0.262096f, 0.261400f, 0.261397f, 0.261615f, 0.259828f, 0.257747f, 0.257682f, + 0.256474f, 0.252253f, 0.250769f, 0.253635f, 0.251629f, 0.243566f, 0.243777f, 0.253044f, 0.249024f, 0.229975f, 0.229614f, 0.251308f, 0.237376f, 0.164020f, 0.115660f, 0.179182f, 0.302935f, 0.361288f, 0.332595f, 0.300984f, 0.297187f, 0.266515f, 0.205485f, 0.199320f, 0.282776f, 0.373785f, 0.395770f, 0.375092f, 0.369258f, 0.379275f, 0.378846f, 0.358644f, 0.304226f, 0.203779f, 0.113276f, 0.133067f, 0.271506f, 0.405312f, 0.429713f, 0.382366f, 0.361258f, 0.383739f, 0.398504f, 0.388066f, 0.377952f, 0.369700f, 0.341555f, 0.307263f}, + {-0.022217f, -0.015375f, -0.018397f, -0.035300f, -0.046690f, -0.037732f, -0.022017f, -0.019869f, -0.019459f, 0.017327f, 0.102816f, 0.194710f, 0.234177f, 0.204599f, 0.138417f, 0.071733f, 0.010515f, -0.056797f, -0.132305f, -0.206318f, -0.271841f, -0.327874f, -0.371103f, -0.395052f, -0.398096f, -0.384964f, -0.359169f, -0.319562f, -0.265403f, -0.199868f, -0.126987f, -0.048878f, 0.032648f, 0.114915f, 0.195782f, 0.273182f, 0.342322f, 0.396309f, 0.431191f, 0.448778f, 0.453935f, 0.450961f, 0.442889f, 0.431917f, 0.419114f, 0.404570f, 0.388255f, 0.370115f, 0.349678f, 0.326644f, 0.301721f, 0.276201f, 0.251220f, 0.227989f, 0.207822f, 0.191043f, 0.176530f, 0.162962f, 0.149778f, 0.136591f, 0.122722f, 0.107799f, 0.091935f, 0.075014f, 0.056648f, 0.036913f, 0.016138f, -0.005944f, -0.029814f, -0.055061f, -0.080836f, -0.107214f, -0.134806f, -0.163054f, -0.190286f, -0.215551f, -0.238967f, -0.259885f, -0.276238f, -0.286705f, -0.292383f, -0.294992f, -0.294208f, -0.288458f, -0.278037f, -0.265391f, -0.251792f, -0.235652f, -0.215265f, -0.191614f, -0.166954f, -0.141873f, -0.115571f, -0.088358f, -0.062140f, -0.038532f, + -0.017724f, 0.000836f, 0.017500f, 0.032211f, 0.044805f, 0.055481f, 0.064916f, 0.073629f, 0.081559f, 0.088826f, 0.096406f, 0.105164f, 0.114511f, 0.122871f, 0.129287f, 0.134060f, 0.138257f, 0.143042f, 0.148807f, 0.154441f, 0.158070f, 0.158906f, 0.157915f, 0.156673f, 0.156277f, 0.157153f, 0.158912f, 0.160379f, 0.160516f, 0.159249f, 0.156964f, 0.153673f, 0.149149f, 0.143200f, 0.135383f, 0.125140f, 0.112610f, 0.098657f, 0.084044f, 0.069283f, 0.055081f, 0.042021f, 0.030039f, 0.019014f, 0.009440f, 0.001841f, -0.003841f, -0.007710f, -0.009630f, -0.009945f, -0.009536f, -0.008864f, -0.007876f, -0.006845f, -0.006260f, -0.006131f, -0.006419f, -0.007674f, -0.010369f, -0.014373f, -0.019846f, -0.027504f, -0.037346f, -0.048440f, -0.060307f, -0.073056f, -0.086098f, -0.098456f, -0.110125f, -0.121485f, -0.132067f, -0.141513f, -0.150626f, -0.159945f, -0.168818f, -0.177104f, -0.185774f, -0.194992f, -0.203954f, -0.212873f, -0.222383f, -0.231384f, -0.238515f, -0.244594f, -0.250498f, -0.254857f, -0.256981f, -0.258841f, -0.261200f, -0.262096f, -0.261400f, -0.261397f, -0.261615f, -0.259828f, -0.257747f, -0.257682f, + -0.256474f, -0.252253f, -0.250769f, -0.253635f, -0.251629f, -0.243566f, -0.243777f, -0.253044f, -0.249024f, -0.229975f, -0.229614f, -0.251308f, -0.237376f, -0.164020f, -0.115660f, -0.179182f, -0.302935f, -0.361288f, -0.332595f, -0.300984f, -0.297187f, -0.266515f, -0.205485f, -0.199320f, -0.282776f, -0.373785f, -0.395770f, -0.375092f, -0.369258f, -0.379275f, -0.378846f, -0.358644f, -0.304226f, -0.203779f, -0.113276f, -0.133067f, -0.271506f, -0.405312f, -0.429713f, -0.382366f, -0.361258f, -0.383739f, -0.398504f, -0.388066f, -0.377952f, -0.369700f, -0.341555f, -0.307263f} + }, + { + {0.003437f, -0.012198f, -0.001203f, 0.021097f, -0.002466f, -0.043512f, 0.000962f, 0.131262f, 0.193341f, 0.073245f, -0.141155f, -0.268143f, -0.241794f, -0.140847f, -0.054105f, 0.002619f, 0.050716f, 0.099528f, 0.145239f, 0.181794f, 0.200756f, 0.196431f, 0.173654f, 0.142090f, 0.107331f, 0.073891f, 0.048716f, 0.034602f, 0.027293f, 0.024058f, 0.027766f, 0.038832f, 0.050743f, 0.057603f, 0.060423f, 0.063103f, 0.066372f, 0.067205f, 0.061224f, 0.045463f, 0.021062f, -0.007194f, -0.035078f, -0.061177f, -0.084943f, -0.105741f, -0.124709f, -0.144522f, -0.166406f, -0.189512f, -0.213041f, -0.236632f, -0.259187f, -0.279363f, -0.296402f, -0.308917f, -0.314459f, -0.311746f, -0.301536f, -0.284320f, -0.259412f, -0.227155f, -0.189434f, -0.147199f, -0.099925f, -0.048097f, 0.006127f, 0.061017f, 0.115797f, 0.169006f, 0.218343f, 0.262025f, 0.298749f, 0.326845f, 0.345052f, 0.353588f, 0.353173f, 0.343709f, 0.325096f, 0.298746f, 0.267135f, 0.231913f, 0.193115f, 0.150515f, 0.105513f, 0.060953f, 0.018598f, -0.022322f, -0.063041f, -0.102759f, -0.139669f, -0.173357f, -0.204275f, -0.231780f, -0.254700f, -0.272996f, + -0.286913f, -0.295377f, -0.297011f, -0.291997f, -0.281495f, -0.266021f, -0.245380f, -0.219470f, -0.188934f, -0.156137f, -0.125122f, -0.098779f, -0.076246f, -0.054735f, -0.033488f, -0.014413f, 0.000330f, 0.009800f, 0.014374f, 0.015862f, 0.016591f, 0.017377f, 0.017391f, 0.016313f, 0.015068f, 0.014452f, 0.014844f, 0.017137f, 0.022089f, 0.029075f, 0.037043f, 0.045911f, 0.055611f, 0.064990f, 0.073012f, 0.079676f, 0.084818f, 0.087704f, 0.088459f, 0.088069f, 0.086787f, 0.084427f, 0.081841f, 0.080001f, 0.078313f, 0.075848f, 0.073092f, 0.070651f, 0.067838f, 0.064177f, 0.060367f, 0.056565f, 0.051968f, 0.046818f, 0.042330f, 0.038426f, 0.034201f, 0.030169f, 0.027300f, 0.024914f, 0.022225f, 0.020280f, 0.019900f, 0.019979f, 0.019917f, 0.020854f, 0.022870f, 0.024349f, 0.025106f, 0.026471f, 0.028137f, 0.028929f, 0.029895f, 0.032523f, 0.035592f, 0.037737f, 0.040348f, 0.044286f, 0.047546f, 0.049185f, 0.050714f, 0.051542f, 0.048951f, 0.043598f, 0.038299f, 0.031936f, 0.022010f, 0.010903f, 0.001637f, -0.008334f, -0.021151f, -0.033005f, -0.042008f, -0.052364f, -0.064471f, -0.073163f, + -0.079941f, -0.090963f, -0.101864f, -0.105166f, -0.109415f, -0.124289f, -0.135694f, -0.130563f, -0.130580f, -0.154548f, -0.170385f, -0.149105f, -0.139181f, -0.196892f, -0.261751f, -0.216013f, -0.071571f, 0.026285f, 0.005174f, -0.050751f, -0.064299f, -0.081628f, -0.152957f, -0.210051f, -0.161120f, -0.036845f, 0.049592f, 0.047608f, 0.003439f, -0.026155f, -0.042297f, -0.092917f, -0.208966f, -0.338758f, -0.363990f, -0.229119f, -0.040285f, 0.032605f, -0.046756f, -0.151981f, -0.170066f, -0.127443f, -0.110599f, -0.135320f, -0.151985f, -0.135982f, -0.110796f, -0.098463f}, + {-0.003437f, 0.012198f, 0.001203f, -0.021097f, 0.002466f, 0.043512f, -0.000962f, -0.131262f, -0.193341f, -0.073245f, 0.141155f, 0.268143f, 0.241794f, 0.140847f, 0.054105f, -0.002619f, -0.050716f, -0.099528f, -0.145239f, -0.181794f, -0.200756f, -0.196431f, -0.173654f, -0.142090f, -0.107331f, -0.073891f, -0.048716f, -0.034602f, -0.027293f, -0.024058f, -0.027766f, -0.038832f, -0.050743f, -0.057603f, -0.060423f, -0.063103f, -0.066372f, -0.067205f, -0.061224f, -0.045463f, -0.021062f, 0.007194f, 0.035078f, 0.061177f, 0.084943f, 0.105741f, 0.124709f, 0.144522f, 0.166406f, 0.189512f, 0.213041f, 0.236632f, 0.259187f, 0.279363f, 0.296402f, 0.308917f, 0.314459f, 0.311746f, 0.301536f, 0.284320f, 0.259412f, 0.227155f, 0.189434f, 0.147199f, 0.099925f, 0.048097f, -0.006127f, -0.061017f, -0.115797f, -0.169006f, -0.218343f, -0.262025f, -0.298749f, -0.326845f, -0.345052f, -0.353588f, -0.353173f, -0.343709f, -0.325096f, -0.298746f, -0.267135f, -0.231913f, -0.193115f, -0.150515f, -0.105513f, -0.060953f, -0.018598f, 0.022322f, 0.063041f, 0.102759f, 0.139669f, 0.173357f, 0.204275f, 0.231780f, 0.254700f, 0.272996f, + 0.286913f, 0.295377f, 0.297011f, 0.291997f, 0.281495f, 0.266021f, 0.245380f, 0.219470f, 0.188934f, 0.156137f, 0.125122f, 0.098779f, 0.076246f, 0.054735f, 0.033488f, 0.014413f, -0.000330f, -0.009800f, -0.014374f, -0.015862f, -0.016591f, -0.017377f, -0.017391f, -0.016313f, -0.015068f, -0.014452f, -0.014844f, -0.017137f, -0.022089f, -0.029075f, -0.037043f, -0.045911f, -0.055611f, -0.064990f, -0.073012f, -0.079676f, -0.084818f, -0.087704f, -0.088459f, -0.088069f, -0.086787f, -0.084427f, -0.081841f, -0.080001f, -0.078313f, -0.075848f, -0.073092f, -0.070651f, -0.067838f, -0.064177f, -0.060367f, -0.056565f, -0.051968f, -0.046818f, -0.042330f, -0.038426f, -0.034201f, -0.030169f, -0.027300f, -0.024914f, -0.022225f, -0.020280f, -0.019900f, -0.019979f, -0.019917f, -0.020854f, -0.022870f, -0.024349f, -0.025106f, -0.026471f, -0.028137f, -0.028929f, -0.029895f, -0.032523f, -0.035592f, -0.037737f, -0.040348f, -0.044286f, -0.047546f, -0.049185f, -0.050714f, -0.051542f, -0.048951f, -0.043598f, -0.038299f, -0.031936f, -0.022010f, -0.010903f, -0.001637f, 0.008334f, 0.021151f, 0.033005f, 0.042008f, 0.052364f, 0.064471f, 0.073163f, + 0.079941f, 0.090963f, 0.101864f, 0.105166f, 0.109415f, 0.124289f, 0.135694f, 0.130563f, 0.130580f, 0.154548f, 0.170385f, 0.149105f, 0.139181f, 0.196892f, 0.261751f, 0.216013f, 0.071571f, -0.026285f, -0.005174f, 0.050751f, 0.064299f, 0.081628f, 0.152957f, 0.210051f, 0.161120f, 0.036845f, -0.049592f, -0.047608f, -0.003439f, 0.026155f, 0.042297f, 0.092917f, 0.208966f, 0.338758f, 0.363990f, 0.229119f, 0.040285f, -0.032605f, 0.046756f, 0.151981f, 0.170066f, 0.127443f, 0.110599f, 0.135320f, 0.151985f, 0.135982f, 0.110796f, 0.098463f} + }, + { + {-0.013125f, -0.012286f, -0.029270f, -0.061330f, -0.081694f, -0.084134f, -0.091685f, -0.102795f, -0.065219f, 0.061788f, 0.237540f, 0.366702f, 0.391070f, 0.329203f, 0.231539f, 0.128665f, 0.030035f, -0.055797f, -0.120914f, -0.167779f, -0.204453f, -0.233321f, -0.251764f, -0.259124f, -0.256054f, -0.240951f, -0.214156f, -0.184034f, -0.162756f, -0.155363f, -0.156163f, -0.155957f, -0.150073f, -0.139152f, -0.125066f, -0.108295f, -0.088604f, -0.066285f, -0.041833f, -0.015371f, 0.012408f, 0.039073f, 0.061555f, 0.078734f, 0.092119f, 0.103815f, 0.114599f, 0.124104f, 0.131882f, 0.137736f, 0.141533f, 0.143131f, 0.142328f, 0.138733f, 0.131953f, 0.122040f, 0.109684f, 0.095975f, 0.082044f, 0.068749f, 0.056557f, 0.045720f, 0.036579f, 0.029561f, 0.024955f, 0.022883f, 0.023595f, 0.027669f, 0.035746f, 0.048030f, 0.064154f, 0.083701f, 0.106779f, 0.133727f, 0.164258f, 0.197388f, 0.232365f, 0.269041f, 0.306917f, 0.344448f, 0.379910f, 0.412508f, 0.441996f, 0.467563f, 0.487862f, 0.502016f, 0.509982f, 0.512033f, 0.508380f, 0.499122f, 0.483934f, 0.461848f, 0.432088f, 0.395456f, 0.354502f, 0.311899f, + 0.268761f, 0.224882f, 0.180662f, 0.138577f, 0.102422f, 0.074928f, 0.056036f, 0.043532f, 0.035361f, 0.031276f, 0.032342f, 0.039114f, 0.050516f, 0.064273f, 0.078040f, 0.090120f, 0.099605f, 0.106269f, 0.110292f, 0.111800f, 0.110505f, 0.105782f, 0.097125f, 0.084634f, 0.069175f, 0.052019f, 0.034230f, 0.016325f, -0.001585f, -0.019467f, -0.037208f, -0.054624f, -0.071625f, -0.088455f, -0.105611f, -0.123311f, -0.141167f, -0.158623f, -0.175578f, -0.192349f, -0.209294f, -0.226791f, -0.245271f, -0.264788f, -0.284670f, -0.303913f, -0.321795f, -0.337907f, -0.351875f, -0.363338f, -0.372063f, -0.377966f, -0.381198f, -0.382224f, -0.381582f, -0.379626f, -0.376697f, -0.373288f, -0.369744f, -0.366057f, -0.362215f, -0.358447f, -0.354924f, -0.351586f, -0.348440f, -0.345609f, -0.342984f, -0.340226f, -0.337164f, -0.333840f, -0.330365f, -0.327079f, -0.324467f, -0.322570f, -0.320900f, -0.319189f, -0.317555f, -0.315784f, -0.313305f, -0.309987f, -0.306067f, -0.301378f, -0.295609f, -0.289009f, -0.281841f, -0.273722f, -0.264499f, -0.254839f, -0.245040f, -0.234614f, -0.223819f, -0.213828f, -0.204802f, -0.195896f, -0.187327f, -0.179883f, + -0.172843f, -0.165369f, -0.158571f, -0.152828f, -0.145851f, -0.137397f, -0.131226f, -0.127613f, -0.121187f, -0.112221f, -0.109209f, -0.111868f, -0.106951f, -0.093814f, -0.094519f, -0.118779f, -0.140589f, -0.136582f, -0.124286f, -0.127257f, -0.127194f, -0.098697f, -0.071650f, -0.098895f, -0.168848f, -0.212657f, -0.201109f, -0.174379f, -0.169160f, -0.176945f, -0.183912f, -0.189724f, -0.175821f, -0.122967f, -0.075644f, -0.113343f, -0.231230f, -0.325873f, -0.333768f, -0.305146f, -0.299949f, -0.300130f, -0.283939f, -0.290832f, -0.324013f, -0.278523f, -0.090004f, 0.105839f}, + {-0.013125f, -0.012286f, -0.029270f, -0.061330f, -0.081694f, -0.084134f, -0.091685f, -0.102795f, -0.065219f, 0.061788f, 0.237540f, 0.366702f, 0.391070f, 0.329203f, 0.231539f, 0.128665f, 0.030035f, -0.055797f, -0.120914f, -0.167779f, -0.204453f, -0.233321f, -0.251764f, -0.259124f, -0.256054f, -0.240951f, -0.214156f, -0.184034f, -0.162756f, -0.155363f, -0.156163f, -0.155957f, -0.150073f, -0.139152f, -0.125066f, -0.108295f, -0.088604f, -0.066285f, -0.041833f, -0.015371f, 0.012408f, 0.039073f, 0.061555f, 0.078734f, 0.092119f, 0.103815f, 0.114599f, 0.124104f, 0.131882f, 0.137736f, 0.141533f, 0.143131f, 0.142328f, 0.138733f, 0.131953f, 0.122040f, 0.109684f, 0.095975f, 0.082044f, 0.068749f, 0.056557f, 0.045720f, 0.036579f, 0.029561f, 0.024955f, 0.022883f, 0.023595f, 0.027669f, 0.035746f, 0.048030f, 0.064154f, 0.083701f, 0.106779f, 0.133727f, 0.164258f, 0.197388f, 0.232365f, 0.269041f, 0.306917f, 0.344448f, 0.379910f, 0.412508f, 0.441996f, 0.467563f, 0.487862f, 0.502016f, 0.509982f, 0.512033f, 0.508380f, 0.499122f, 0.483934f, 0.461848f, 0.432088f, 0.395456f, 0.354502f, 0.311899f, + 0.268761f, 0.224882f, 0.180662f, 0.138577f, 0.102422f, 0.074928f, 0.056036f, 0.043532f, 0.035361f, 0.031276f, 0.032342f, 0.039114f, 0.050516f, 0.064273f, 0.078040f, 0.090120f, 0.099605f, 0.106269f, 0.110292f, 0.111800f, 0.110505f, 0.105782f, 0.097125f, 0.084634f, 0.069175f, 0.052019f, 0.034230f, 0.016325f, -0.001585f, -0.019467f, -0.037208f, -0.054624f, -0.071625f, -0.088455f, -0.105611f, -0.123311f, -0.141167f, -0.158623f, -0.175578f, -0.192349f, -0.209294f, -0.226791f, -0.245271f, -0.264788f, -0.284670f, -0.303913f, -0.321795f, -0.337907f, -0.351875f, -0.363338f, -0.372063f, -0.377966f, -0.381198f, -0.382224f, -0.381582f, -0.379626f, -0.376697f, -0.373288f, -0.369744f, -0.366057f, -0.362215f, -0.358447f, -0.354924f, -0.351586f, -0.348440f, -0.345609f, -0.342984f, -0.340226f, -0.337164f, -0.333840f, -0.330365f, -0.327079f, -0.324467f, -0.322570f, -0.320900f, -0.319189f, -0.317555f, -0.315784f, -0.313305f, -0.309987f, -0.306067f, -0.301378f, -0.295609f, -0.289009f, -0.281841f, -0.273722f, -0.264499f, -0.254839f, -0.245040f, -0.234614f, -0.223819f, -0.213828f, -0.204802f, -0.195896f, -0.187327f, -0.179883f, + -0.172843f, -0.165369f, -0.158571f, -0.152828f, -0.145851f, -0.137397f, -0.131226f, -0.127613f, -0.121187f, -0.112221f, -0.109209f, -0.111868f, -0.106951f, -0.093814f, -0.094519f, -0.118779f, -0.140589f, -0.136582f, -0.124286f, -0.127257f, -0.127194f, -0.098697f, -0.071650f, -0.098895f, -0.168848f, -0.212657f, -0.201109f, -0.174379f, -0.169160f, -0.176945f, -0.183912f, -0.189724f, -0.175821f, -0.122967f, -0.075644f, -0.113343f, -0.231230f, -0.325873f, -0.333768f, -0.305146f, -0.299949f, -0.300130f, -0.283939f, -0.290832f, -0.324013f, -0.278523f, -0.090004f, 0.105839f} + }, + { + {0.050610f, -0.021351f, -0.100660f, -0.104774f, -0.001476f, 0.148669f, 0.225308f, 0.152954f, -0.017164f, -0.150555f, -0.164165f, -0.095774f, -0.032833f, -0.010556f, -0.007376f, -0.005342f, -0.006979f, -0.005520f, 0.015106f, 0.047669f, 0.063520f, 0.053315f, 0.039601f, 0.043141f, 0.059336f, 0.074668f, 0.086926f, 0.099752f, 0.110453f, 0.112472f, 0.103586f, 0.087024f, 0.068584f, 0.053729f, 0.043401f, 0.032419f, 0.014740f, -0.010636f, -0.040573f, -0.071513f, -0.100005f, -0.122661f, -0.138393f, -0.148847f, -0.155444f, -0.158100f, -0.157286f, -0.154654f, -0.151141f, -0.146642f, -0.141589f, -0.136794f, -0.132018f, -0.126472f, -0.120197f, -0.113478f, -0.105693f, -0.096136f, -0.085272f, -0.074193f, -0.063578f, -0.053837f, -0.045575f, -0.039450f, -0.035848f, -0.034577f, -0.034666f, -0.035080f, -0.035819f, -0.037340f, -0.038869f, -0.038729f, -0.036395f, -0.032558f, -0.026954f, -0.017828f, -0.003894f, 0.014663f, 0.037307f, 0.063972f, 0.094584f, 0.128616f, 0.164960f, 0.201947f, 0.238243f, 0.273778f, 0.308471f, 0.340250f, 0.366585f, 0.388241f, 0.408822f, 0.429564f, 0.446929f, 0.456648f, 0.458222f, 0.454015f, + 0.445283f, 0.430644f, 0.408172f, 0.378082f, 0.342964f, 0.305191f, 0.264513f, 0.219134f, 0.169076f, 0.117258f, 0.067008f, 0.019484f, -0.026357f, -0.072188f, -0.118578f, -0.163875f, -0.204958f, -0.239778f, -0.268783f, -0.293465f, -0.314413f, -0.331340f, -0.343971f, -0.352262f, -0.356602f, -0.358148f, -0.358147f, -0.356868f, -0.354035f, -0.349981f, -0.345415f, -0.340428f, -0.334505f, -0.326935f, -0.316753f, -0.303400f, -0.288003f, -0.272824f, -0.259031f, -0.246114f, -0.233327f, -0.220114f, -0.205519f, -0.189122f, -0.172346f, -0.157167f, -0.143959f, -0.132013f, -0.121111f, -0.111003f, -0.100614f, -0.089445f, -0.078639f, -0.069419f, -0.061736f, -0.055228f, -0.049885f, -0.045103f, -0.039720f, -0.033390f, -0.026593f, -0.019544f, -0.012457f, -0.006080f, -0.000606f, 0.004882f, 0.010838f, 0.016694f, 0.022579f, 0.029413f, 0.036726f, 0.042841f, 0.047462f, 0.051547f, 0.054909f, 0.056743f, 0.057750f, 0.058983f, 0.059835f, 0.059730f, 0.059790f, 0.060557f, 0.060792f, 0.060463f, 0.061464f, 0.063958f, 0.066147f, 0.068356f, 0.072542f, 0.077895f, 0.082279f, 0.086766f, 0.093073f, 0.099166f, 0.103431f, 0.108681f, + 0.115924f, 0.120958f, 0.123369f, 0.129092f, 0.137670f, 0.140558f, 0.138996f, 0.145136f, 0.157044f, 0.157137f, 0.147369f, 0.154619f, 0.181695f, 0.189239f, 0.157222f, 0.128976f, 0.151684f, 0.202074f, 0.221839f, 0.206540f, 0.201774f, 0.218344f, 0.212651f, 0.164038f, 0.118748f, 0.127617f, 0.174253f, 0.199599f, 0.180895f, 0.151327f, 0.140967f, 0.129460f, 0.078567f, -0.000953f, -0.044718f, -0.008185f, 0.074463f, 0.126113f, 0.114079f, 0.078761f, 0.073555f, 0.099683f, 0.115917f, 0.100920f, 0.084812f, 0.112488f, 0.184986f, 0.249040f}, + {0.050610f, -0.021351f, -0.100660f, -0.104774f, -0.001476f, 0.148669f, 0.225308f, 0.152954f, -0.017164f, -0.150555f, -0.164165f, -0.095774f, -0.032833f, -0.010556f, -0.007376f, -0.005342f, -0.006979f, -0.005520f, 0.015106f, 0.047669f, 0.063520f, 0.053315f, 0.039601f, 0.043141f, 0.059336f, 0.074668f, 0.086926f, 0.099752f, 0.110453f, 0.112472f, 0.103586f, 0.087024f, 0.068584f, 0.053729f, 0.043401f, 0.032419f, 0.014740f, -0.010636f, -0.040573f, -0.071513f, -0.100005f, -0.122661f, -0.138393f, -0.148847f, -0.155444f, -0.158100f, -0.157286f, -0.154654f, -0.151141f, -0.146642f, -0.141589f, -0.136794f, -0.132018f, -0.126472f, -0.120197f, -0.113478f, -0.105693f, -0.096136f, -0.085272f, -0.074193f, -0.063578f, -0.053837f, -0.045575f, -0.039450f, -0.035848f, -0.034577f, -0.034666f, -0.035080f, -0.035819f, -0.037340f, -0.038869f, -0.038729f, -0.036395f, -0.032558f, -0.026954f, -0.017828f, -0.003894f, 0.014663f, 0.037307f, 0.063972f, 0.094584f, 0.128616f, 0.164960f, 0.201947f, 0.238243f, 0.273778f, 0.308471f, 0.340250f, 0.366585f, 0.388241f, 0.408822f, 0.429564f, 0.446929f, 0.456648f, 0.458222f, 0.454015f, + 0.445283f, 0.430644f, 0.408172f, 0.378082f, 0.342964f, 0.305191f, 0.264513f, 0.219134f, 0.169076f, 0.117258f, 0.067008f, 0.019484f, -0.026357f, -0.072188f, -0.118578f, -0.163875f, -0.204958f, -0.239778f, -0.268783f, -0.293465f, -0.314413f, -0.331340f, -0.343971f, -0.352262f, -0.356602f, -0.358148f, -0.358147f, -0.356868f, -0.354035f, -0.349981f, -0.345415f, -0.340428f, -0.334505f, -0.326935f, -0.316753f, -0.303400f, -0.288003f, -0.272824f, -0.259031f, -0.246114f, -0.233327f, -0.220114f, -0.205519f, -0.189122f, -0.172346f, -0.157167f, -0.143959f, -0.132013f, -0.121111f, -0.111003f, -0.100614f, -0.089445f, -0.078639f, -0.069419f, -0.061736f, -0.055228f, -0.049885f, -0.045103f, -0.039720f, -0.033390f, -0.026593f, -0.019544f, -0.012457f, -0.006080f, -0.000606f, 0.004882f, 0.010838f, 0.016694f, 0.022579f, 0.029413f, 0.036726f, 0.042841f, 0.047462f, 0.051547f, 0.054909f, 0.056743f, 0.057750f, 0.058983f, 0.059835f, 0.059730f, 0.059790f, 0.060557f, 0.060792f, 0.060463f, 0.061464f, 0.063958f, 0.066147f, 0.068356f, 0.072542f, 0.077895f, 0.082279f, 0.086766f, 0.093073f, 0.099166f, 0.103431f, 0.108681f, + 0.115924f, 0.120958f, 0.123369f, 0.129092f, 0.137670f, 0.140558f, 0.138996f, 0.145136f, 0.157044f, 0.157137f, 0.147369f, 0.154619f, 0.181695f, 0.189239f, 0.157222f, 0.128976f, 0.151684f, 0.202074f, 0.221839f, 0.206540f, 0.201774f, 0.218344f, 0.212651f, 0.164038f, 0.118748f, 0.127617f, 0.174253f, 0.199599f, 0.180895f, 0.151327f, 0.140967f, 0.129460f, 0.078567f, -0.000953f, -0.044718f, -0.008185f, 0.074463f, 0.126113f, 0.114079f, 0.078761f, 0.073555f, 0.099683f, 0.115917f, 0.100920f, 0.084812f, 0.112488f, 0.184986f, 0.249040f} + }, + { + {-0.007259f, 0.065962f, 0.096309f, 0.006203f, -0.159743f, -0.308935f, -0.381128f, -0.338419f, -0.157384f, 0.121690f, 0.390091f, 0.561354f, 0.636734f, 0.654536f, 0.616285f, 0.502886f, 0.333745f, 0.163082f, 0.024174f, -0.091879f, -0.205022f, -0.317570f, -0.417716f, -0.495244f, -0.549209f, -0.586773f, -0.616327f, -0.639690f, -0.652018f, -0.649196f, -0.631826f, -0.601837f, -0.559630f, -0.505851f, -0.442897f, -0.373591f, -0.300236f, -0.225238f, -0.151321f, -0.081172f, -0.017263f, 0.039030f, 0.088587f, 0.133536f, 0.174581f, 0.210389f, 0.239635f, 0.262423f, 0.279828f, 0.293433f, 0.305269f, 0.316863f, 0.328072f, 0.337528f, 0.344140f, 0.347611f, 0.347874f, 0.344828f, 0.338652f, 0.329942f, 0.319435f, 0.307658f, 0.294798f, 0.280926f, 0.266291f, 0.251209f, 0.235746f, 0.219931f, 0.204222f, 0.189273f, 0.175236f, 0.161855f, 0.149231f, 0.137841f, 0.127719f, 0.118342f, 0.109578f, 0.102141f, 0.096648f, 0.092633f, 0.088918f, 0.084709f, 0.079908f, 0.074514f, 0.068253f, 0.061036f, 0.053526f, 0.046953f, 0.042328f, 0.039859f, 0.039087f, 0.039576f, 0.041346f, 0.044345f, 0.047321f, 0.047623f, + 0.042687f, 0.031837f, 0.016339f, -0.002376f, -0.024180f, -0.049770f, -0.078870f, -0.109212f, -0.137584f, -0.161947f, -0.182317f, -0.199471f, -0.213209f, -0.222271f, -0.225693f, -0.223821f, -0.218155f, -0.210460f, -0.201796f, -0.192062f, -0.180645f, -0.167638f, -0.154215f, -0.141821f, -0.131276f, -0.122438f, -0.114188f, -0.104943f, -0.093887f, -0.081673f, -0.069541f, -0.058028f, -0.046937f, -0.035989f, -0.024863f, -0.013051f, -0.000327f, 0.012968f, 0.026458f, 0.040102f, 0.053835f, 0.067424f, 0.080870f, 0.094376f, 0.107841f, 0.120849f, 0.133049f, 0.144070f, 0.153324f, 0.160345f, 0.165072f, 0.167561f, 0.167875f, 0.166359f, 0.163402f, 0.158903f, 0.152585f, 0.144627f, 0.135297f, 0.124447f, 0.112145f, 0.099225f, 0.086451f, 0.073867f, 0.061586f, 0.050227f, 0.039978f, 0.030333f, 0.021214f, 0.013255f, 0.006789f, 0.001699f, -0.001887f, -0.003958f, -0.005254f, -0.006402f, -0.007235f, -0.007883f, -0.009180f, -0.011060f, -0.012189f, -0.011989f, -0.011177f, -0.009936f, -0.007788f, -0.005316f, -0.003617f, -0.002436f, -0.001133f, -0.000357f, -0.000436f, -0.000049f, 0.001324f, 0.002343f, 0.002892f, 0.004473f, + 0.006454f, 0.006882f, 0.007116f, 0.009391f, 0.011036f, 0.009231f, 0.008488f, 0.012900f, 0.016080f, 0.012730f, 0.012822f, 0.025048f, 0.034679f, 0.024410f, 0.011274f, 0.029631f, 0.076704f, 0.110326f, 0.108291f, 0.095726f, 0.100643f, 0.113980f, 0.112557f, 0.097168f, 0.087042f, 0.092041f, 0.107251f, 0.124685f, 0.138049f, 0.143937f, 0.145917f, 0.147885f, 0.136336f, 0.082786f, -0.018275f, -0.118932f, -0.151821f, -0.107798f, -0.055208f, -0.053504f, -0.072264f, -0.048152f, -0.003743f, -0.018576f, -0.062348f, 0.027201f, 0.312207f, 0.589094f}, + {-0.007259f, 0.065962f, 0.096309f, 0.006203f, -0.159743f, -0.308935f, -0.381128f, -0.338419f, -0.157384f, 0.121690f, 0.390091f, 0.561354f, 0.636734f, 0.654536f, 0.616285f, 0.502886f, 0.333745f, 0.163082f, 0.024174f, -0.091879f, -0.205022f, -0.317570f, -0.417716f, -0.495244f, -0.549209f, -0.586773f, -0.616327f, -0.639690f, -0.652018f, -0.649196f, -0.631826f, -0.601837f, -0.559630f, -0.505851f, -0.442897f, -0.373591f, -0.300236f, -0.225238f, -0.151321f, -0.081172f, -0.017263f, 0.039030f, 0.088587f, 0.133536f, 0.174581f, 0.210389f, 0.239635f, 0.262423f, 0.279828f, 0.293433f, 0.305269f, 0.316863f, 0.328072f, 0.337528f, 0.344140f, 0.347611f, 0.347874f, 0.344828f, 0.338652f, 0.329942f, 0.319435f, 0.307658f, 0.294798f, 0.280926f, 0.266291f, 0.251209f, 0.235746f, 0.219931f, 0.204222f, 0.189273f, 0.175236f, 0.161855f, 0.149231f, 0.137841f, 0.127719f, 0.118342f, 0.109578f, 0.102141f, 0.096648f, 0.092633f, 0.088918f, 0.084709f, 0.079908f, 0.074514f, 0.068253f, 0.061036f, 0.053526f, 0.046953f, 0.042328f, 0.039859f, 0.039087f, 0.039576f, 0.041346f, 0.044345f, 0.047321f, 0.047623f, + 0.042687f, 0.031837f, 0.016339f, -0.002376f, -0.024180f, -0.049770f, -0.078870f, -0.109212f, -0.137584f, -0.161947f, -0.182317f, -0.199471f, -0.213209f, -0.222271f, -0.225693f, -0.223821f, -0.218155f, -0.210460f, -0.201796f, -0.192062f, -0.180645f, -0.167638f, -0.154215f, -0.141821f, -0.131276f, -0.122438f, -0.114188f, -0.104943f, -0.093887f, -0.081673f, -0.069541f, -0.058028f, -0.046937f, -0.035989f, -0.024863f, -0.013051f, -0.000327f, 0.012968f, 0.026458f, 0.040102f, 0.053835f, 0.067424f, 0.080870f, 0.094376f, 0.107841f, 0.120849f, 0.133049f, 0.144070f, 0.153324f, 0.160345f, 0.165072f, 0.167561f, 0.167875f, 0.166359f, 0.163402f, 0.158903f, 0.152585f, 0.144627f, 0.135297f, 0.124447f, 0.112145f, 0.099225f, 0.086451f, 0.073867f, 0.061586f, 0.050227f, 0.039978f, 0.030333f, 0.021214f, 0.013255f, 0.006789f, 0.001699f, -0.001887f, -0.003958f, -0.005254f, -0.006402f, -0.007235f, -0.007883f, -0.009180f, -0.011060f, -0.012189f, -0.011989f, -0.011177f, -0.009936f, -0.007788f, -0.005316f, -0.003617f, -0.002436f, -0.001133f, -0.000357f, -0.000436f, -0.000049f, 0.001324f, 0.002343f, 0.002892f, 0.004473f, + 0.006454f, 0.006882f, 0.007116f, 0.009391f, 0.011036f, 0.009231f, 0.008488f, 0.012900f, 0.016080f, 0.012730f, 0.012822f, 0.025048f, 0.034679f, 0.024410f, 0.011274f, 0.029631f, 0.076704f, 0.110326f, 0.108291f, 0.095726f, 0.100643f, 0.113980f, 0.112557f, 0.097168f, 0.087042f, 0.092041f, 0.107251f, 0.124685f, 0.138049f, 0.143937f, 0.145917f, 0.147885f, 0.136336f, 0.082786f, -0.018275f, -0.118932f, -0.151821f, -0.107798f, -0.055208f, -0.053504f, -0.072264f, -0.048152f, -0.003743f, -0.018576f, -0.062348f, 0.027201f, 0.312207f, 0.589094f} + } +}; +const float CRendBin_HOA2_HRIR_coeff_im_48kHz[9][BINAURAL_CHANNELS][240]={ + { + {-0.279578f, -0.717721f, -0.877611f, -0.774906f, -0.535062f, -0.269989f, -0.021067f, 0.209874f, 0.413226f, 0.563225f, 0.637276f, 0.629373f, 0.548884f, 0.414833f, 0.250811f, 0.079096f, -0.084627f, -0.232375f, -0.360791f, -0.467119f, -0.547631f, -0.599855f, -0.625984f, -0.632346f, -0.624188f, -0.602062f, -0.564595f, -0.513530f, -0.454080f, -0.391123f, -0.327168f, -0.263808f, -0.202953f, -0.145944f, -0.092780f, -0.042980f, 0.003472f, 0.046452f, 0.086451f, 0.124553f, 0.161794f, 0.198667f, 0.235068f, 0.270617f, 0.305017f, 0.338134f, 0.369878f, 0.400174f, 0.429020f, 0.456378f, 0.482018f, 0.505631f, 0.527097f, 0.546486f, 0.563827f, 0.579121f, 0.592594f, 0.604726f, 0.615911f, 0.626238f, 0.635705f, 0.644462f, 0.652664f, 0.660229f, 0.667010f, 0.673113f, 0.678788f, 0.684082f, 0.688924f, 0.693472f, 0.698001f, 0.702510f, 0.706806f, 0.710936f, 0.715101f, 0.719195f, 0.722909f, 0.726269f, 0.729530f, 0.732512f, 0.734617f, 0.735606f, 0.735863f, 0.735678f, 0.734755f, 0.732698f, 0.729673f, 0.726255f, 0.722712f, 0.718664f, 0.713561f, 0.707417f, 0.700900f, 0.694611f, 0.688481f, 0.682146f, + 0.675755f, 0.670059f, 0.665672f, 0.662528f, 0.660105f, 0.658010f, 0.656294f, 0.655275f, 0.655042f, 0.655135f, 0.654860f, 0.653870f, 0.652278f, 0.650245f, 0.647706f, 0.644488f, 0.640451f, 0.635518f, 0.629758f, 0.623449f, 0.616889f, 0.610232f, 0.603544f, 0.596898f, 0.590297f, 0.583682f, 0.577056f, 0.570442f, 0.563736f, 0.556801f, 0.549678f, 0.542492f, 0.535279f, 0.528093f, 0.521154f, 0.514648f, 0.508527f, 0.502690f, 0.497140f, 0.491836f, 0.486633f, 0.481501f, 0.476572f, 0.471906f, 0.467418f, 0.463039f, 0.458686f, 0.454164f, 0.449331f, 0.444241f, 0.438935f, 0.433317f, 0.427381f, 0.421288f, 0.415067f, 0.408572f, 0.401819f, 0.394993f, 0.388100f, 0.381032f, 0.373904f, 0.366955f, 0.360223f, 0.353709f, 0.347609f, 0.342029f, 0.336786f, 0.331780f, 0.327133f, 0.322727f, 0.318173f, 0.313407f, 0.308724f, 0.304155f, 0.299488f, 0.294851f, 0.290528f, 0.286392f, 0.282213f, 0.278211f, 0.274620f, 0.271203f, 0.267853f, 0.264940f, 0.262515f, 0.260046f, 0.257391f, 0.254933f, 0.252512f, 0.249509f, 0.246067f, 0.242749f, 0.239216f, 0.234883f, 0.230316f, 0.226146f, + 0.221603f, 0.216109f, 0.210802f, 0.206272f, 0.200974f, 0.194324f, 0.188446f, 0.183987f, 0.178038f, 0.169726f, 0.163182f, 0.160324f, 0.155860f, 0.145447f, 0.133826f, 0.127980f, 0.126532f, 0.122924f, 0.114883f, 0.103866f, 0.090500f, 0.079053f, 0.080753f, 0.100935f, 0.125261f, 0.130967f, 0.113407f, 0.091776f, 0.085866f, 0.095550f, 0.107946f, 0.118310f, 0.135431f, 0.165381f, 0.195627f, 0.202054f, 0.174034f, 0.127848f, 0.089951f, 0.070123f, 0.058538f, 0.046398f, 0.036783f, 0.032164f, 0.024778f, 0.009249f, -0.004637f, -0.004463f}, + {-0.279578f, -0.717721f, -0.877611f, -0.774906f, -0.535062f, -0.269989f, -0.021067f, 0.209874f, 0.413226f, 0.563225f, 0.637276f, 0.629373f, 0.548884f, 0.414833f, 0.250811f, 0.079096f, -0.084627f, -0.232375f, -0.360791f, -0.467119f, -0.547631f, -0.599855f, -0.625984f, -0.632346f, -0.624188f, -0.602062f, -0.564595f, -0.513530f, -0.454080f, -0.391123f, -0.327168f, -0.263808f, -0.202953f, -0.145944f, -0.092780f, -0.042980f, 0.003472f, 0.046452f, 0.086451f, 0.124553f, 0.161794f, 0.198667f, 0.235068f, 0.270617f, 0.305017f, 0.338134f, 0.369878f, 0.400174f, 0.429020f, 0.456378f, 0.482018f, 0.505631f, 0.527097f, 0.546486f, 0.563827f, 0.579121f, 0.592594f, 0.604726f, 0.615911f, 0.626238f, 0.635705f, 0.644462f, 0.652664f, 0.660229f, 0.667010f, 0.673113f, 0.678788f, 0.684082f, 0.688924f, 0.693472f, 0.698001f, 0.702510f, 0.706806f, 0.710936f, 0.715101f, 0.719195f, 0.722909f, 0.726269f, 0.729530f, 0.732512f, 0.734617f, 0.735606f, 0.735863f, 0.735678f, 0.734755f, 0.732698f, 0.729673f, 0.726255f, 0.722712f, 0.718664f, 0.713561f, 0.707417f, 0.700900f, 0.694611f, 0.688481f, 0.682146f, + 0.675755f, 0.670059f, 0.665672f, 0.662528f, 0.660105f, 0.658010f, 0.656294f, 0.655275f, 0.655042f, 0.655135f, 0.654860f, 0.653870f, 0.652278f, 0.650245f, 0.647706f, 0.644488f, 0.640451f, 0.635518f, 0.629758f, 0.623449f, 0.616889f, 0.610232f, 0.603544f, 0.596898f, 0.590297f, 0.583682f, 0.577056f, 0.570442f, 0.563736f, 0.556801f, 0.549678f, 0.542492f, 0.535279f, 0.528093f, 0.521154f, 0.514648f, 0.508527f, 0.502690f, 0.497140f, 0.491836f, 0.486633f, 0.481501f, 0.476572f, 0.471906f, 0.467418f, 0.463039f, 0.458686f, 0.454164f, 0.449331f, 0.444241f, 0.438935f, 0.433317f, 0.427381f, 0.421288f, 0.415067f, 0.408572f, 0.401819f, 0.394993f, 0.388100f, 0.381032f, 0.373904f, 0.366955f, 0.360223f, 0.353709f, 0.347609f, 0.342029f, 0.336786f, 0.331780f, 0.327133f, 0.322727f, 0.318173f, 0.313407f, 0.308724f, 0.304155f, 0.299488f, 0.294851f, 0.290528f, 0.286392f, 0.282213f, 0.278211f, 0.274620f, 0.271203f, 0.267853f, 0.264940f, 0.262515f, 0.260046f, 0.257391f, 0.254933f, 0.252512f, 0.249509f, 0.246067f, 0.242749f, 0.239216f, 0.234883f, 0.230316f, 0.226146f, + 0.221603f, 0.216109f, 0.210802f, 0.206272f, 0.200974f, 0.194324f, 0.188446f, 0.183987f, 0.178038f, 0.169726f, 0.163182f, 0.160324f, 0.155860f, 0.145447f, 0.133826f, 0.127980f, 0.126532f, 0.122924f, 0.114883f, 0.103866f, 0.090500f, 0.079053f, 0.080753f, 0.100935f, 0.125261f, 0.130967f, 0.113407f, 0.091776f, 0.085866f, 0.095550f, 0.107946f, 0.118310f, 0.135431f, 0.165381f, 0.195627f, 0.202054f, 0.174034f, 0.127848f, 0.089951f, 0.070123f, 0.058538f, 0.046398f, 0.036783f, 0.032164f, 0.024778f, 0.009249f, -0.004637f, -0.004463f} + }, + { + {0.138076f, 0.232898f, -0.059293f, -0.612224f, -1.079196f, -1.174106f, -0.864429f, -0.332847f, 0.203546f, 0.626268f, 0.915930f, 1.086338f, 1.145817f, 1.101913f, 0.971577f, 0.776715f, 0.537327f, 0.273208f, 0.007437f, -0.237576f, -0.448750f, -0.625455f, -0.772863f, -0.892799f, -0.982209f, -1.039402f, -1.068583f, -1.077066f, -1.070181f, -1.050445f, -1.019817f, -0.980553f, -0.934407f, -0.882631f, -0.826646f, -0.767793f, -0.706548f, -0.642564f, -0.575417f, -0.505095f, -0.432158f, -0.357731f, -0.283190f, -0.209614f, -0.137562f, -0.067329f, 0.000718f, 0.066025f, 0.127937f, 0.186022f, 0.240454f, 0.292036f, 0.341688f, 0.389810f, 0.436063f, 0.479708f, 0.520133f, 0.557017f, 0.590135f, 0.619320f, 0.644743f, 0.666931f, 0.686264f, 0.702737f, 0.716446f, 0.727930f, 0.737674f, 0.745631f, 0.751724f, 0.756469f, 0.760579f, 0.764261f, 0.767563f, 0.771136f, 0.775889f, 0.781953f, 0.788798f, 0.796429f, 0.805575f, 0.816463f, 0.828227f, 0.840053f, 0.852209f, 0.865317f, 0.879077f, 0.892490f, 0.905078f, 0.917237f, 0.929509f, 0.942079f, 0.954921f, 0.967923f, 0.980775f, 0.993059f, 1.004433f, 1.014471f, + 1.022368f, 1.027077f, 1.027777f, 1.024171f, 1.016419f, 1.004875f, 0.989829f, 0.971522f, 0.950481f, 0.927664f, 0.904094f, 0.880496f, 0.857481f, 0.835889f, 0.816673f, 0.800449f, 0.787227f, 0.776425f, 0.767212f, 0.759123f, 0.752399f, 0.747484f, 0.744215f, 0.741719f, 0.738940f, 0.735065f, 0.729726f, 0.723226f, 0.716367f, 0.709723f, 0.703224f, 0.696593f, 0.689822f, 0.683015f, 0.676123f, 0.669098f, 0.662044f, 0.655092f, 0.648381f, 0.642144f, 0.636550f, 0.631509f, 0.626846f, 0.622532f, 0.618608f, 0.615118f, 0.612225f, 0.610115f, 0.608697f, 0.607677f, 0.606831f, 0.605900f, 0.604476f, 0.602385f, 0.599878f, 0.597091f, 0.593736f, 0.589617f, 0.584851f, 0.579299f, 0.572456f, 0.564168f, 0.554769f, 0.544430f, 0.533113f, 0.521100f, 0.508789f, 0.496142f, 0.483005f, 0.469593f, 0.456081f, 0.442365f, 0.428689f, 0.415677f, 0.403373f, 0.391276f, 0.379404f, 0.368075f, 0.356787f, 0.344691f, 0.331928f, 0.319178f, 0.306569f, 0.294254f, 0.282956f, 0.272791f, 0.262941f, 0.253310f, 0.244606f, 0.236417f, 0.227600f, 0.218521f, 0.210224f, 0.202126f, 0.193377f, 0.184872f, + 0.177026f, 0.168429f, 0.159251f, 0.151477f, 0.143811f, 0.133179f, 0.122218f, 0.115290f, 0.107467f, 0.092035f, 0.077002f, 0.072747f, 0.065602f, 0.034483f, -0.005140f, -0.013392f, 0.010536f, 0.022405f, 0.003341f, -0.016208f, -0.024400f, -0.060491f, -0.141552f, -0.211147f, -0.211352f, -0.166013f, -0.144212f, -0.172423f, -0.224227f, -0.268380f, -0.293530f, -0.314223f, -0.372350f, -0.487543f, -0.585910f, -0.542642f, -0.338207f, -0.113721f, -0.017641f, -0.045890f, -0.089863f, -0.096510f, -0.108175f, -0.164168f, -0.233196f, -0.252807f, -0.193549f, -0.071985f}, + {-0.138076f, -0.232898f, 0.059293f, 0.612224f, 1.079196f, 1.174106f, 0.864429f, 0.332847f, -0.203546f, -0.626268f, -0.915930f, -1.086338f, -1.145817f, -1.101913f, -0.971577f, -0.776715f, -0.537327f, -0.273208f, -0.007437f, 0.237576f, 0.448750f, 0.625455f, 0.772863f, 0.892799f, 0.982209f, 1.039402f, 1.068583f, 1.077066f, 1.070181f, 1.050445f, 1.019817f, 0.980553f, 0.934407f, 0.882631f, 0.826646f, 0.767793f, 0.706548f, 0.642564f, 0.575417f, 0.505095f, 0.432158f, 0.357731f, 0.283190f, 0.209614f, 0.137562f, 0.067329f, -0.000718f, -0.066025f, -0.127937f, -0.186022f, -0.240454f, -0.292036f, -0.341688f, -0.389810f, -0.436063f, -0.479708f, -0.520133f, -0.557017f, -0.590135f, -0.619320f, -0.644743f, -0.666931f, -0.686264f, -0.702737f, -0.716446f, -0.727930f, -0.737674f, -0.745631f, -0.751724f, -0.756469f, -0.760579f, -0.764261f, -0.767563f, -0.771136f, -0.775889f, -0.781953f, -0.788798f, -0.796429f, -0.805575f, -0.816463f, -0.828227f, -0.840053f, -0.852209f, -0.865317f, -0.879077f, -0.892490f, -0.905078f, -0.917237f, -0.929509f, -0.942079f, -0.954921f, -0.967923f, -0.980775f, -0.993059f, -1.004433f, -1.014471f, + -1.022368f, -1.027077f, -1.027777f, -1.024171f, -1.016419f, -1.004875f, -0.989829f, -0.971522f, -0.950481f, -0.927664f, -0.904094f, -0.880496f, -0.857481f, -0.835889f, -0.816673f, -0.800449f, -0.787227f, -0.776425f, -0.767212f, -0.759123f, -0.752399f, -0.747484f, -0.744215f, -0.741719f, -0.738940f, -0.735065f, -0.729726f, -0.723226f, -0.716367f, -0.709723f, -0.703224f, -0.696593f, -0.689822f, -0.683015f, -0.676123f, -0.669098f, -0.662044f, -0.655092f, -0.648381f, -0.642144f, -0.636550f, -0.631509f, -0.626846f, -0.622532f, -0.618608f, -0.615118f, -0.612225f, -0.610115f, -0.608697f, -0.607677f, -0.606831f, -0.605900f, -0.604476f, -0.602385f, -0.599878f, -0.597091f, -0.593736f, -0.589617f, -0.584851f, -0.579299f, -0.572456f, -0.564168f, -0.554769f, -0.544430f, -0.533113f, -0.521100f, -0.508789f, -0.496142f, -0.483005f, -0.469593f, -0.456081f, -0.442365f, -0.428689f, -0.415677f, -0.403373f, -0.391276f, -0.379404f, -0.368075f, -0.356787f, -0.344691f, -0.331928f, -0.319178f, -0.306569f, -0.294254f, -0.282956f, -0.272791f, -0.262941f, -0.253310f, -0.244606f, -0.236417f, -0.227600f, -0.218521f, -0.210224f, -0.202126f, -0.193377f, -0.184872f, + -0.177026f, -0.168429f, -0.159251f, -0.151477f, -0.143811f, -0.133179f, -0.122218f, -0.115290f, -0.107467f, -0.092035f, -0.077002f, -0.072747f, -0.065602f, -0.034483f, 0.005140f, 0.013392f, -0.010536f, -0.022405f, -0.003341f, 0.016208f, 0.024400f, 0.060491f, 0.141552f, 0.211147f, 0.211352f, 0.166013f, 0.144212f, 0.172423f, 0.224227f, 0.268380f, 0.293530f, 0.314223f, 0.372350f, 0.487543f, 0.585910f, 0.542642f, 0.338207f, 0.113721f, 0.017641f, 0.045890f, 0.089863f, 0.096510f, 0.108175f, 0.164168f, 0.233196f, 0.252807f, 0.193549f, 0.071985f} + }, + { + {-0.037543f, -0.106298f, -0.132530f, -0.073451f, 0.040855f, 0.110624f, 0.077156f, -0.013882f, -0.078578f, -0.081147f, -0.036444f, 0.028042f, 0.082921f, 0.101725f, 0.085482f, 0.065260f, 0.061559f, 0.057998f, 0.029356f, -0.022782f, -0.077787f, -0.123346f, -0.158215f, -0.178489f, -0.178126f, -0.160401f, -0.137683f, -0.119363f, -0.104942f, -0.088255f, -0.065195f, -0.037559f, -0.011105f, 0.009311f, 0.021969f, 0.026322f, 0.021717f, 0.009661f, -0.004873f, -0.016525f, -0.022987f, -0.024411f, -0.021007f, -0.012643f, 0.000208f, 0.016512f, 0.035490f, 0.057006f, 0.081545f, 0.110024f, 0.143089f, 0.180306f, 0.220287f, 0.261700f, 0.303801f, 0.345902f, 0.386845f, 0.425449f, 0.461174f, 0.493797f, 0.522610f, 0.546536f, 0.564888f, 0.577273f, 0.582799f, 0.580231f, 0.568985f, 0.549222f, 0.521000f, 0.484211f, 0.439353f, 0.387577f, 0.330111f, 0.268508f, 0.205168f, 0.142536f, 0.081907f, 0.024074f, -0.029079f, -0.075065f, -0.113125f, -0.144667f, -0.170681f, -0.189953f, -0.201133f, -0.205765f, -0.207348f, -0.207284f, -0.203651f, -0.194832f, -0.182670f, -0.170621f, -0.160017f, -0.149783f, -0.139015f, -0.128209f, + -0.118405f, -0.110532f, -0.105361f, -0.103080f, -0.102998f, -0.104199f, -0.106317f, -0.109616f, -0.114814f, -0.122543f, -0.132141f, -0.141277f, -0.147750f, -0.151340f, -0.153125f, -0.153636f, -0.152546f, -0.149354f, -0.143412f, -0.133993f, -0.121078f, -0.105467f, -0.087876f, -0.068787f, -0.049126f, -0.029929f, -0.011465f, 0.006234f, 0.022384f, 0.036020f, 0.046948f, 0.055235f, 0.060646f, 0.063321f, 0.063920f, 0.062627f, 0.059315f, 0.054877f, 0.050886f, 0.047979f, 0.046017f, 0.045215f, 0.045354f, 0.044782f, 0.042070f, 0.037698f, 0.032628f, 0.026663f, 0.019561f, 0.011982f, 0.004168f, -0.004450f, -0.013603f, -0.022173f, -0.030039f, -0.037798f, -0.045029f, -0.051093f, -0.056790f, -0.063043f, -0.069298f, -0.075124f, -0.081416f, -0.088384f, -0.094829f, -0.100596f, -0.106885f, -0.113537f, -0.119188f, -0.124015f, -0.128908f, -0.132920f, -0.135078f, -0.136917f, -0.139850f, -0.142734f, -0.145054f, -0.148801f, -0.154723f, -0.161242f, -0.168600f, -0.178599f, -0.189814f, -0.199312f, -0.208105f, -0.218177f, -0.226967f, -0.231947f, -0.235940f, -0.240788f, -0.242709f, -0.240449f, -0.238584f, -0.237547f, -0.232614f, -0.225682f, + -0.222453f, -0.218439f, -0.207392f, -0.198145f, -0.198203f, -0.192708f, -0.171847f, -0.158579f, -0.166585f, -0.161468f, -0.122471f, -0.101708f, -0.137293f, -0.150514f, -0.047189f, 0.105121f, 0.141538f, 0.038879f, -0.058972f, -0.070125f, -0.067759f, -0.100256f, -0.083756f, 0.038302f, 0.163436f, 0.166050f, 0.072134f, -0.001083f, -0.012004f, -0.012920f, -0.047149f, -0.098550f, -0.117690f, -0.061872f, 0.057074f, 0.148338f, 0.118443f, -0.008074f, -0.102218f, -0.087453f, -0.021704f, 0.005998f, -0.005131f, 0.000032f, 0.032495f, 0.053140f, 0.041387f, 0.014100f}, + {-0.037543f, -0.106298f, -0.132530f, -0.073451f, 0.040855f, 0.110624f, 0.077156f, -0.013882f, -0.078578f, -0.081147f, -0.036444f, 0.028042f, 0.082921f, 0.101725f, 0.085482f, 0.065260f, 0.061559f, 0.057998f, 0.029356f, -0.022782f, -0.077787f, -0.123346f, -0.158215f, -0.178489f, -0.178126f, -0.160401f, -0.137683f, -0.119363f, -0.104942f, -0.088255f, -0.065195f, -0.037559f, -0.011105f, 0.009311f, 0.021969f, 0.026322f, 0.021717f, 0.009661f, -0.004873f, -0.016525f, -0.022987f, -0.024411f, -0.021007f, -0.012643f, 0.000208f, 0.016512f, 0.035490f, 0.057006f, 0.081545f, 0.110024f, 0.143089f, 0.180306f, 0.220287f, 0.261700f, 0.303801f, 0.345902f, 0.386845f, 0.425449f, 0.461174f, 0.493797f, 0.522610f, 0.546536f, 0.564888f, 0.577273f, 0.582799f, 0.580231f, 0.568985f, 0.549222f, 0.521000f, 0.484211f, 0.439353f, 0.387577f, 0.330111f, 0.268508f, 0.205168f, 0.142536f, 0.081907f, 0.024074f, -0.029079f, -0.075065f, -0.113125f, -0.144667f, -0.170681f, -0.189953f, -0.201133f, -0.205765f, -0.207348f, -0.207284f, -0.203651f, -0.194832f, -0.182670f, -0.170621f, -0.160017f, -0.149783f, -0.139015f, -0.128209f, + -0.118405f, -0.110532f, -0.105361f, -0.103080f, -0.102998f, -0.104199f, -0.106317f, -0.109616f, -0.114814f, -0.122543f, -0.132141f, -0.141277f, -0.147750f, -0.151340f, -0.153125f, -0.153636f, -0.152546f, -0.149354f, -0.143412f, -0.133993f, -0.121078f, -0.105467f, -0.087876f, -0.068787f, -0.049126f, -0.029929f, -0.011465f, 0.006234f, 0.022384f, 0.036020f, 0.046948f, 0.055235f, 0.060646f, 0.063321f, 0.063920f, 0.062627f, 0.059315f, 0.054877f, 0.050886f, 0.047979f, 0.046017f, 0.045215f, 0.045354f, 0.044782f, 0.042070f, 0.037698f, 0.032628f, 0.026663f, 0.019561f, 0.011982f, 0.004168f, -0.004450f, -0.013603f, -0.022173f, -0.030039f, -0.037798f, -0.045029f, -0.051093f, -0.056790f, -0.063043f, -0.069298f, -0.075124f, -0.081416f, -0.088384f, -0.094829f, -0.100596f, -0.106885f, -0.113537f, -0.119188f, -0.124015f, -0.128908f, -0.132920f, -0.135078f, -0.136917f, -0.139850f, -0.142734f, -0.145054f, -0.148801f, -0.154723f, -0.161242f, -0.168600f, -0.178599f, -0.189814f, -0.199312f, -0.208105f, -0.218177f, -0.226967f, -0.231947f, -0.235940f, -0.240788f, -0.242709f, -0.240449f, -0.238584f, -0.237547f, -0.232614f, -0.225682f, + -0.222453f, -0.218439f, -0.207392f, -0.198145f, -0.198203f, -0.192708f, -0.171847f, -0.158579f, -0.166585f, -0.161468f, -0.122471f, -0.101708f, -0.137293f, -0.150514f, -0.047189f, 0.105121f, 0.141538f, 0.038879f, -0.058972f, -0.070125f, -0.067759f, -0.100256f, -0.083756f, 0.038302f, 0.163436f, 0.166050f, 0.072134f, -0.001083f, -0.012004f, -0.012920f, -0.047149f, -0.098550f, -0.117690f, -0.061872f, 0.057074f, 0.148338f, 0.118443f, -0.008074f, -0.102218f, -0.087453f, -0.021704f, 0.005998f, -0.005131f, 0.000032f, 0.032495f, 0.053140f, 0.041387f, 0.014100f} + }, + { + {-0.001106f, -0.029336f, -0.088077f, -0.114632f, -0.068558f, 0.003679f, 0.023786f, -0.022926f, -0.076983f, -0.077263f, -0.017663f, 0.063789f, 0.127856f, 0.160626f, 0.172314f, 0.179408f, 0.185660f, 0.178469f, 0.143908f, 0.081866f, 0.004191f, -0.076672f, -0.152185f, -0.216145f, -0.266904f, -0.310241f, -0.353459f, -0.395898f, -0.429566f, -0.448814f, -0.454423f, -0.447805f, -0.426583f, -0.388419f, -0.335647f, -0.273327f, -0.204930f, -0.132418f, -0.058962f, 0.011028f, 0.074401f, 0.130338f, 0.179186f, 0.221323f, 0.257177f, 0.287606f, 0.313805f, 0.336653f, 0.356005f, 0.370794f, 0.380013f, 0.383528f, 0.382178f, 0.377769f, 0.372920f, 0.369927f, 0.369378f, 0.370338f, 0.371805f, 0.373185f, 0.373702f, 0.372612f, 0.370075f, 0.366792f, 0.362926f, 0.358356f, 0.353579f, 0.349053f, 0.343991f, 0.337160f, 0.328527f, 0.318673f, 0.306976f, 0.292001f, 0.273582f, 0.252844f, 0.230152f, 0.204754f, 0.176888f, 0.148599f, 0.121626f, 0.095786f, 0.070566f, 0.047273f, 0.028034f, 0.013069f, 0.000532f, -0.010938f, -0.021026f, -0.029352f, -0.036545f, -0.042848f, -0.047044f, -0.047912f, -0.045699f, -0.041015f, + -0.033180f, -0.020912f, -0.004151f, 0.015844f, 0.037990f, 0.062328f, 0.089567f, 0.119856f, 0.151790f, 0.182876f, 0.211529f, 0.238379f, 0.264991f, 0.291575f, 0.316519f, 0.337842f, 0.354699f, 0.367998f, 0.379918f, 0.392155f, 0.404219f, 0.413945f, 0.419814f, 0.422264f, 0.423013f, 0.423999f, 0.426644f, 0.431049f, 0.435919f, 0.439985f, 0.443271f, 0.446555f, 0.450297f, 0.454641f, 0.459593f, 0.464544f, 0.468334f, 0.470226f, 0.470176f, 0.468166f, 0.464117f, 0.458340f, 0.451170f, 0.442355f, 0.431549f, 0.418970f, 0.404970f, 0.389655f, 0.373457f, 0.357280f, 0.341693f, 0.326836f, 0.313170f, 0.301285f, 0.291120f, 0.282416f, 0.275493f, 0.270594f, 0.267224f, 0.265075f, 0.264513f, 0.265346f, 0.266418f, 0.267094f, 0.267617f, 0.267704f, 0.266552f, 0.264373f, 0.262126f, 0.260015f, 0.257862f, 0.256090f, 0.254673f, 0.252424f, 0.248786f, 0.244534f, 0.239712f, 0.233258f, 0.225288f, 0.216847f, 0.207365f, 0.195576f, 0.182346f, 0.169120f, 0.155183f, 0.140015f, 0.125688f, 0.113431f, 0.101547f, 0.089772f, 0.080598f, 0.073961f, 0.067095f, 0.060688f, 0.057289f, 0.054588f, + 0.049873f, 0.047292f, 0.049167f, 0.048148f, 0.042023f, 0.042578f, 0.052039f, 0.052105f, 0.039829f, 0.042979f, 0.066307f, 0.065764f, 0.028206f, 0.026431f, 0.116043f, 0.221103f, 0.223358f, 0.136204f, 0.075662f, 0.075938f, 0.065554f, 0.030357f, 0.054492f, 0.158858f, 0.232985f, 0.194413f, 0.106812f, 0.067102f, 0.067912f, 0.048003f, 0.000150f, -0.049393f, -0.102920f, -0.154412f, -0.145923f, -0.043235f, 0.082041f, 0.125246f, 0.083044f, 0.044160f, 0.057384f, 0.079976f, 0.065854f, 0.041133f, 0.057617f, 0.106489f, 0.119625f, 0.053552f}, + {-0.001106f, -0.029336f, -0.088077f, -0.114632f, -0.068558f, 0.003679f, 0.023786f, -0.022926f, -0.076983f, -0.077263f, -0.017663f, 0.063789f, 0.127856f, 0.160626f, 0.172314f, 0.179408f, 0.185660f, 0.178469f, 0.143908f, 0.081866f, 0.004191f, -0.076672f, -0.152185f, -0.216145f, -0.266904f, -0.310241f, -0.353459f, -0.395898f, -0.429566f, -0.448814f, -0.454423f, -0.447805f, -0.426583f, -0.388419f, -0.335647f, -0.273327f, -0.204930f, -0.132418f, -0.058962f, 0.011028f, 0.074401f, 0.130338f, 0.179186f, 0.221323f, 0.257177f, 0.287606f, 0.313805f, 0.336653f, 0.356005f, 0.370794f, 0.380013f, 0.383528f, 0.382178f, 0.377769f, 0.372920f, 0.369927f, 0.369378f, 0.370338f, 0.371805f, 0.373185f, 0.373702f, 0.372612f, 0.370075f, 0.366792f, 0.362926f, 0.358356f, 0.353579f, 0.349053f, 0.343991f, 0.337160f, 0.328527f, 0.318673f, 0.306976f, 0.292001f, 0.273582f, 0.252844f, 0.230152f, 0.204754f, 0.176888f, 0.148599f, 0.121626f, 0.095786f, 0.070566f, 0.047273f, 0.028034f, 0.013069f, 0.000532f, -0.010938f, -0.021026f, -0.029352f, -0.036545f, -0.042848f, -0.047044f, -0.047912f, -0.045699f, -0.041015f, + -0.033180f, -0.020912f, -0.004151f, 0.015844f, 0.037990f, 0.062328f, 0.089567f, 0.119856f, 0.151790f, 0.182876f, 0.211529f, 0.238379f, 0.264991f, 0.291575f, 0.316519f, 0.337842f, 0.354699f, 0.367998f, 0.379918f, 0.392155f, 0.404219f, 0.413945f, 0.419814f, 0.422264f, 0.423013f, 0.423999f, 0.426644f, 0.431049f, 0.435919f, 0.439985f, 0.443271f, 0.446555f, 0.450297f, 0.454641f, 0.459593f, 0.464544f, 0.468334f, 0.470226f, 0.470176f, 0.468166f, 0.464117f, 0.458340f, 0.451170f, 0.442355f, 0.431549f, 0.418970f, 0.404970f, 0.389655f, 0.373457f, 0.357280f, 0.341693f, 0.326836f, 0.313170f, 0.301285f, 0.291120f, 0.282416f, 0.275493f, 0.270594f, 0.267224f, 0.265075f, 0.264513f, 0.265346f, 0.266418f, 0.267094f, 0.267617f, 0.267704f, 0.266552f, 0.264373f, 0.262126f, 0.260015f, 0.257862f, 0.256090f, 0.254673f, 0.252424f, 0.248786f, 0.244534f, 0.239712f, 0.233258f, 0.225288f, 0.216847f, 0.207365f, 0.195576f, 0.182346f, 0.169120f, 0.155183f, 0.140015f, 0.125688f, 0.113431f, 0.101547f, 0.089772f, 0.080598f, 0.073961f, 0.067095f, 0.060688f, 0.057289f, 0.054588f, + 0.049873f, 0.047292f, 0.049167f, 0.048148f, 0.042023f, 0.042578f, 0.052039f, 0.052105f, 0.039829f, 0.042979f, 0.066307f, 0.065764f, 0.028206f, 0.026431f, 0.116043f, 0.221103f, 0.223358f, 0.136204f, 0.075662f, 0.075938f, 0.065554f, 0.030357f, 0.054492f, 0.158858f, 0.232985f, 0.194413f, 0.106812f, 0.067102f, 0.067912f, 0.048003f, 0.000150f, -0.049393f, -0.102920f, -0.154412f, -0.145923f, -0.043235f, 0.082041f, 0.125246f, 0.083044f, 0.044160f, 0.057384f, 0.079976f, 0.065854f, 0.041133f, 0.057617f, 0.106489f, 0.119625f, 0.053552f} + }, + { + {-0.003789f, -0.003563f, 0.005390f, 0.004253f, -0.016392f, -0.039478f, -0.046987f, -0.050995f, -0.077966f, -0.121934f, -0.135164f, -0.078389f, 0.031562f, 0.138714f, 0.205564f, 0.238423f, 0.259289f, 0.272913f, 0.269301f, 0.243849f, 0.201082f, 0.144127f, 0.072703f, -0.009192f, -0.092622f, -0.171911f, -0.247325f, -0.318739f, -0.382003f, -0.432956f, -0.470676f, -0.495269f, -0.505851f, -0.501895f, -0.483566f, -0.449894f, -0.399742f, -0.335951f, -0.266183f, -0.198350f, -0.136588f, -0.081779f, -0.033568f, 0.009088f, 0.047647f, 0.083109f, 0.115870f, 0.146272f, 0.174342f, 0.199243f, 0.219907f, 0.235988f, 0.247660f, 0.255290f, 0.260042f, 0.263953f, 0.268571f, 0.274114f, 0.280349f, 0.287365f, 0.295056f, 0.302862f, 0.310459f, 0.317888f, 0.324842f, 0.330747f, 0.335542f, 0.339373f, 0.341625f, 0.341355f, 0.338531f, 0.333589f, 0.325911f, 0.314093f, 0.297767f, 0.277788f, 0.254435f, 0.226961f, 0.195597f, 0.162625f, 0.130256f, 0.098385f, 0.065891f, 0.033566f, 0.003825f, -0.022571f, -0.047471f, -0.072174f, -0.095089f, -0.113849f, -0.128315f, -0.139798f, -0.148327f, -0.152538f, -0.151922f, -0.147693f, + -0.141449f, -0.134009f, -0.125542f, -0.116170f, -0.106339f, -0.096745f, -0.087767f, -0.079178f, -0.070833f, -0.063188f, -0.056416f, -0.049448f, -0.040822f, -0.030317f, -0.019055f, -0.008311f, 0.001362f, 0.010417f, 0.020238f, 0.032100f, 0.045698f, 0.059224f, 0.071090f, 0.081057f, 0.089857f, 0.098613f, 0.108519f, 0.120125f, 0.132885f, 0.145947f, 0.159099f, 0.172520f, 0.186195f, 0.200063f, 0.214027f, 0.227406f, 0.239060f, 0.248310f, 0.255115f, 0.259453f, 0.261381f, 0.261468f, 0.260276f, 0.257747f, 0.253798f, 0.248995f, 0.243998f, 0.239084f, 0.234733f, 0.231749f, 0.230386f, 0.230266f, 0.231313f, 0.233779f, 0.237497f, 0.242150f, 0.247940f, 0.255021f, 0.262901f, 0.271206f, 0.280071f, 0.289077f, 0.297036f, 0.303388f, 0.308430f, 0.311992f, 0.313524f, 0.313400f, 0.312461f, 0.310668f, 0.307845f, 0.304798f, 0.302098f, 0.299086f, 0.295438f, 0.291960f, 0.288762f, 0.284855f, 0.280127f, 0.275167f, 0.269236f, 0.261328f, 0.252490f, 0.244013f, 0.235006f, 0.224872f, 0.215456f, 0.207625f, 0.199481f, 0.190596f, 0.183143f, 0.177022f, 0.169991f, 0.163109f, 0.158683f, 0.154359f, + 0.148010f, 0.143942f, 0.143859f, 0.140381f, 0.132047f, 0.130317f, 0.136071f, 0.131329f, 0.114971f, 0.114353f, 0.131726f, 0.123744f, 0.081739f, 0.079871f, 0.169779f, 0.273251f, 0.274171f, 0.185331f, 0.118375f, 0.110316f, 0.100500f, 0.075041f, 0.100840f, 0.188865f, 0.245753f, 0.209825f, 0.136354f, 0.098537f, 0.089245f, 0.068116f, 0.030138f, -0.014604f, -0.058375f, -0.058884f, 0.036565f, 0.189080f, 0.269087f, 0.211524f, 0.102010f, 0.054393f, 0.068058f, 0.069962f, 0.039279f, 0.011969f, -0.001065f, -0.019914f, -0.036169f, -0.019550f}, + {0.003789f, 0.003563f, -0.005390f, -0.004253f, 0.016392f, 0.039478f, 0.046987f, 0.050995f, 0.077966f, 0.121934f, 0.135164f, 0.078389f, -0.031562f, -0.138714f, -0.205564f, -0.238423f, -0.259289f, -0.272913f, -0.269301f, -0.243849f, -0.201082f, -0.144127f, -0.072703f, 0.009192f, 0.092622f, 0.171911f, 0.247325f, 0.318739f, 0.382003f, 0.432956f, 0.470676f, 0.495269f, 0.505851f, 0.501895f, 0.483566f, 0.449894f, 0.399742f, 0.335951f, 0.266183f, 0.198350f, 0.136588f, 0.081779f, 0.033568f, -0.009088f, -0.047647f, -0.083109f, -0.115870f, -0.146272f, -0.174342f, -0.199243f, -0.219907f, -0.235988f, -0.247660f, -0.255290f, -0.260042f, -0.263953f, -0.268571f, -0.274114f, -0.280349f, -0.287365f, -0.295056f, -0.302862f, -0.310459f, -0.317888f, -0.324842f, -0.330747f, -0.335542f, -0.339373f, -0.341625f, -0.341355f, -0.338531f, -0.333589f, -0.325911f, -0.314093f, -0.297767f, -0.277788f, -0.254435f, -0.226961f, -0.195597f, -0.162625f, -0.130256f, -0.098385f, -0.065891f, -0.033566f, -0.003825f, 0.022571f, 0.047471f, 0.072174f, 0.095089f, 0.113849f, 0.128315f, 0.139798f, 0.148327f, 0.152538f, 0.151922f, 0.147693f, + 0.141449f, 0.134009f, 0.125542f, 0.116170f, 0.106339f, 0.096745f, 0.087767f, 0.079178f, 0.070833f, 0.063188f, 0.056416f, 0.049448f, 0.040822f, 0.030317f, 0.019055f, 0.008311f, -0.001362f, -0.010417f, -0.020238f, -0.032100f, -0.045698f, -0.059224f, -0.071090f, -0.081057f, -0.089857f, -0.098613f, -0.108519f, -0.120125f, -0.132885f, -0.145947f, -0.159099f, -0.172520f, -0.186195f, -0.200063f, -0.214027f, -0.227406f, -0.239060f, -0.248310f, -0.255115f, -0.259453f, -0.261381f, -0.261468f, -0.260276f, -0.257747f, -0.253798f, -0.248995f, -0.243998f, -0.239084f, -0.234733f, -0.231749f, -0.230386f, -0.230266f, -0.231313f, -0.233779f, -0.237497f, -0.242150f, -0.247940f, -0.255021f, -0.262901f, -0.271206f, -0.280071f, -0.289077f, -0.297036f, -0.303388f, -0.308430f, -0.311992f, -0.313524f, -0.313400f, -0.312461f, -0.310668f, -0.307845f, -0.304798f, -0.302098f, -0.299086f, -0.295438f, -0.291960f, -0.288762f, -0.284855f, -0.280127f, -0.275167f, -0.269236f, -0.261328f, -0.252490f, -0.244013f, -0.235006f, -0.224872f, -0.215456f, -0.207625f, -0.199481f, -0.190596f, -0.183143f, -0.177022f, -0.169991f, -0.163109f, -0.158683f, -0.154359f, + -0.148010f, -0.143942f, -0.143859f, -0.140381f, -0.132047f, -0.130317f, -0.136071f, -0.131329f, -0.114971f, -0.114353f, -0.131726f, -0.123744f, -0.081739f, -0.079871f, -0.169779f, -0.273251f, -0.274171f, -0.185331f, -0.118375f, -0.110316f, -0.100500f, -0.075041f, -0.100840f, -0.188865f, -0.245753f, -0.209825f, -0.136354f, -0.098537f, -0.089245f, -0.068116f, -0.030138f, 0.014604f, 0.058375f, 0.058884f, -0.036565f, -0.189080f, -0.269087f, -0.211524f, -0.102010f, -0.054393f, -0.068058f, -0.069962f, -0.039279f, -0.011969f, 0.001065f, 0.019914f, 0.036169f, 0.019550f} + }, + { + {-0.006846f, -0.000152f, 0.019374f, 0.004568f, -0.021442f, 0.016645f, 0.094894f, 0.078760f, -0.081254f, -0.243610f, -0.240659f, -0.079782f, 0.093230f, 0.178154f, 0.191226f, 0.185348f, 0.178503f, 0.163321f, 0.134365f, 0.090634f, 0.035061f, -0.021392f, -0.066568f, -0.096797f, -0.113194f, -0.115470f, -0.106244f, -0.093474f, -0.082246f, -0.071041f, -0.059987f, -0.054977f, -0.059639f, -0.069988f, -0.080582f, -0.091156f, -0.105014f, -0.124424f, -0.148446f, -0.172697f, -0.191456f, -0.201829f, -0.205066f, -0.203411f, -0.198122f, -0.190935f, -0.184076f, -0.177679f, -0.169636f, -0.158353f, -0.143485f, -0.124415f, -0.100358f, -0.071388f, -0.037625f, 0.001321f, 0.044603f, 0.089548f, 0.134068f, 0.177680f, 0.219330f, 0.256720f, 0.288657f, 0.315550f, 0.336880f, 0.350608f, 0.355516f, 0.351864f, 0.339573f, 0.317907f, 0.287002f, 0.247963f, 0.201779f, 0.149696f, 0.094063f, 0.037338f, -0.019185f, -0.074517f, -0.126620f, -0.173157f, -0.213261f, -0.247652f, -0.276903f, -0.300055f, -0.315444f, -0.323001f, -0.324860f, -0.322914f, -0.316675f, -0.304809f, -0.287684f, -0.266683f, -0.242026f, -0.213279f, -0.181142f, -0.146760f, + -0.110142f, -0.071145f, -0.031211f, 0.007509f, 0.043988f, 0.078081f, 0.109247f, 0.136169f, 0.156829f, 0.169152f, 0.173118f, 0.171933f, 0.169302f, 0.165775f, 0.159289f, 0.148635f, 0.134827f, 0.119999f, 0.106488f, 0.096001f, 0.088379f, 0.082075f, 0.076456f, 0.072384f, 0.070438f, 0.070288f, 0.071753f, 0.074612f, 0.077583f, 0.079232f, 0.079389f, 0.078235f, 0.075055f, 0.069328f, 0.061745f, 0.052996f, 0.043060f, 0.032476f, 0.022488f, 0.013477f, 0.005059f, -0.002387f, -0.008316f, -0.013571f, -0.019235f, -0.024853f, -0.029688f, -0.034327f, -0.039294f, -0.043859f, -0.047636f, -0.051298f, -0.054721f, -0.056837f, -0.057796f, -0.058696f, -0.059300f, -0.058729f, -0.057642f, -0.056982f, -0.055954f, -0.053837f, -0.051823f, -0.050759f, -0.049643f, -0.048234f, -0.047974f, -0.049006f, -0.049803f, -0.050341f, -0.051811f, -0.053521f, -0.054180f, -0.055033f, -0.057656f, -0.060879f, -0.063704f, -0.067950f, -0.074626f, -0.081990f, -0.089761f, -0.099845f, -0.111314f, -0.121038f, -0.129556f, -0.139256f, -0.148166f, -0.153341f, -0.157148f, -0.162167f, -0.165226f, -0.164304f, -0.163483f, -0.164081f, -0.161527f, -0.156368f, + -0.154318f, -0.152643f, -0.144643f, -0.136635f, -0.137086f, -0.134879f, -0.118831f, -0.106512f, -0.113435f, -0.113117f, -0.082437f, -0.060570f, -0.086167f, -0.101264f, -0.021545f, 0.106592f, 0.140238f, 0.045381f, -0.056517f, -0.078374f, -0.074532f, -0.103109f, -0.107473f, -0.023777f, 0.086175f, 0.108098f, 0.028080f, -0.068297f, -0.117080f, -0.133674f, -0.164582f, -0.217773f, -0.236408f, -0.146856f, 0.037683f, 0.182002f, 0.158627f, 0.006930f, -0.106384f, -0.089821f, -0.015786f, 0.009329f, -0.016630f, -0.027747f, -0.002433f, 0.022946f, 0.022944f, 0.008213f}, + {0.006846f, 0.000152f, -0.019374f, -0.004568f, 0.021442f, -0.016645f, -0.094894f, -0.078760f, 0.081254f, 0.243610f, 0.240659f, 0.079782f, -0.093230f, -0.178154f, -0.191226f, -0.185348f, -0.178503f, -0.163321f, -0.134365f, -0.090634f, -0.035061f, 0.021392f, 0.066568f, 0.096797f, 0.113194f, 0.115470f, 0.106244f, 0.093474f, 0.082246f, 0.071041f, 0.059987f, 0.054977f, 0.059639f, 0.069988f, 0.080582f, 0.091156f, 0.105014f, 0.124424f, 0.148446f, 0.172697f, 0.191456f, 0.201829f, 0.205066f, 0.203411f, 0.198122f, 0.190935f, 0.184076f, 0.177679f, 0.169636f, 0.158353f, 0.143485f, 0.124415f, 0.100358f, 0.071388f, 0.037625f, -0.001321f, -0.044603f, -0.089548f, -0.134068f, -0.177680f, -0.219330f, -0.256720f, -0.288657f, -0.315550f, -0.336880f, -0.350608f, -0.355516f, -0.351864f, -0.339573f, -0.317907f, -0.287002f, -0.247963f, -0.201779f, -0.149696f, -0.094063f, -0.037338f, 0.019185f, 0.074517f, 0.126620f, 0.173157f, 0.213261f, 0.247652f, 0.276903f, 0.300055f, 0.315444f, 0.323001f, 0.324860f, 0.322914f, 0.316675f, 0.304809f, 0.287684f, 0.266683f, 0.242026f, 0.213279f, 0.181142f, 0.146760f, + 0.110142f, 0.071145f, 0.031211f, -0.007509f, -0.043988f, -0.078081f, -0.109247f, -0.136169f, -0.156829f, -0.169152f, -0.173118f, -0.171933f, -0.169302f, -0.165775f, -0.159289f, -0.148635f, -0.134827f, -0.119999f, -0.106488f, -0.096001f, -0.088379f, -0.082075f, -0.076456f, -0.072384f, -0.070438f, -0.070288f, -0.071753f, -0.074612f, -0.077583f, -0.079232f, -0.079389f, -0.078235f, -0.075055f, -0.069328f, -0.061745f, -0.052996f, -0.043060f, -0.032476f, -0.022488f, -0.013477f, -0.005059f, 0.002387f, 0.008316f, 0.013571f, 0.019235f, 0.024853f, 0.029688f, 0.034327f, 0.039294f, 0.043859f, 0.047636f, 0.051298f, 0.054721f, 0.056837f, 0.057796f, 0.058696f, 0.059300f, 0.058729f, 0.057642f, 0.056982f, 0.055954f, 0.053837f, 0.051823f, 0.050759f, 0.049643f, 0.048234f, 0.047974f, 0.049006f, 0.049803f, 0.050341f, 0.051811f, 0.053521f, 0.054180f, 0.055033f, 0.057656f, 0.060879f, 0.063704f, 0.067950f, 0.074626f, 0.081990f, 0.089761f, 0.099845f, 0.111314f, 0.121038f, 0.129556f, 0.139256f, 0.148166f, 0.153341f, 0.157148f, 0.162167f, 0.165226f, 0.164304f, 0.163483f, 0.164081f, 0.161527f, 0.156368f, + 0.154318f, 0.152643f, 0.144643f, 0.136635f, 0.137086f, 0.134879f, 0.118831f, 0.106512f, 0.113435f, 0.113117f, 0.082437f, 0.060570f, 0.086167f, 0.101264f, 0.021545f, -0.106592f, -0.140238f, -0.045381f, 0.056517f, 0.078374f, 0.074532f, 0.103109f, 0.107473f, 0.023777f, -0.086175f, -0.108098f, -0.028080f, 0.068297f, 0.117080f, 0.133674f, 0.164582f, 0.217773f, 0.236408f, 0.146856f, -0.037683f, -0.182002f, -0.158627f, -0.006930f, 0.106384f, 0.089821f, 0.015786f, -0.009329f, 0.016630f, 0.027747f, 0.002433f, -0.022946f, -0.022944f, -0.008213f} + }, + { + {-0.001420f, -0.012065f, -0.026492f, -0.020203f, 0.009739f, 0.039421f, 0.066264f, 0.123513f, 0.219923f, 0.294024f, 0.266235f, 0.127758f, -0.051262f, -0.196504f, -0.284732f, -0.327956f, -0.337211f, -0.317958f, -0.281436f, -0.240577f, -0.198997f, -0.153781f, -0.105052f, -0.056036f, -0.008353f, 0.035683f, 0.069060f, 0.085305f, 0.087456f, 0.087200f, 0.094464f, 0.110361f, 0.130021f, 0.149198f, 0.166810f, 0.183045f, 0.197421f, 0.209077f, 0.217550f, 0.222212f, 0.221593f, 0.214614f, 0.202528f, 0.188537f, 0.175138f, 0.162537f, 0.149700f, 0.136000f, 0.121499f, 0.106417f, 0.090943f, 0.075268f, 0.059568f, 0.044160f, 0.029790f, 0.017578f, 0.008567f, 0.003340f, 0.001927f, 0.003952f, 0.008947f, 0.016627f, 0.026844f, 0.039331f, 0.053686f, 0.069631f, 0.087084f, 0.105849f, 0.125258f, 0.144267f, 0.162023f, 0.178236f, 0.192755f, 0.204836f, 0.213266f, 0.217287f, 0.216843f, 0.211652f, 0.200710f, 0.183257f, 0.159710f, 0.131033f, 0.097576f, 0.059269f, 0.016690f, -0.028770f, -0.075739f, -0.123333f, -0.170970f, -0.218285f, -0.265068f, -0.310574f, -0.352756f, -0.388810f, -0.416934f, -0.437347f, + -0.451255f, -0.458880f, -0.458839f, -0.449713f, -0.432204f, -0.409619f, -0.386020f, -0.363800f, -0.342969f, -0.322690f, -0.303273f, -0.286626f, -0.275007f, -0.269641f, -0.270390f, -0.276241f, -0.285888f, -0.298144f, -0.312255f, -0.327971f, -0.345199f, -0.363508f, -0.381893f, -0.399002f, -0.413686f, -0.425507f, -0.434753f, -0.441996f, -0.447655f, -0.451917f, -0.454880f, -0.456722f, -0.457797f, -0.458478f, -0.458752f, -0.458121f, -0.456157f, -0.453025f, -0.449242f, -0.445115f, -0.440663f, -0.435765f, -0.429977f, -0.422410f, -0.412255f, -0.399353f, -0.384044f, -0.366690f, -0.347614f, -0.327259f, -0.306182f, -0.285019f, -0.264467f, -0.245070f, -0.227032f, -0.210404f, -0.195308f, -0.181726f, -0.169332f, -0.157853f, -0.147307f, -0.137689f, -0.128750f, -0.120299f, -0.112312f, -0.104627f, -0.096937f, -0.089190f, -0.081612f, -0.074406f, -0.067751f, -0.061796f, -0.056271f, -0.050527f, -0.044251f, -0.037633f, -0.030645f, -0.022940f, -0.014604f, -0.006131f, 0.002380f, 0.011084f, 0.019647f, 0.027656f, 0.035299f, 0.042653f, 0.049064f, 0.054179f, 0.058475f, 0.061913f, 0.063651f, 0.063792f, 0.063468f, 0.062805f, 0.061111f, 0.058940f, + 0.057196f, 0.055040f, 0.051853f, 0.049240f, 0.047435f, 0.043389f, 0.036776f, 0.032043f, 0.029194f, 0.021482f, 0.009242f, 0.002996f, 0.002545f, -0.009347f, -0.036379f, -0.052805f, -0.041320f, -0.024358f, -0.027246f, -0.034686f, -0.024798f, -0.022626f, -0.064861f, -0.125246f, -0.137627f, -0.092121f, -0.047334f, -0.041987f, -0.054463f, -0.057870f, -0.053789f, -0.041072f, -0.015593f, -0.013176f, -0.080518f, -0.182863f, -0.217493f, -0.150387f, -0.062968f, -0.026715f, -0.015171f, 0.011874f, 0.031103f, 0.034503f, 0.089489f, 0.214435f, 0.272951f, 0.129518f}, + {-0.001420f, -0.012065f, -0.026492f, -0.020203f, 0.009739f, 0.039421f, 0.066264f, 0.123513f, 0.219923f, 0.294024f, 0.266235f, 0.127758f, -0.051262f, -0.196504f, -0.284732f, -0.327956f, -0.337211f, -0.317958f, -0.281436f, -0.240577f, -0.198997f, -0.153781f, -0.105052f, -0.056036f, -0.008353f, 0.035683f, 0.069060f, 0.085305f, 0.087456f, 0.087200f, 0.094464f, 0.110361f, 0.130021f, 0.149198f, 0.166810f, 0.183045f, 0.197421f, 0.209077f, 0.217550f, 0.222212f, 0.221593f, 0.214614f, 0.202528f, 0.188537f, 0.175138f, 0.162537f, 0.149700f, 0.136000f, 0.121499f, 0.106417f, 0.090943f, 0.075268f, 0.059568f, 0.044160f, 0.029790f, 0.017578f, 0.008567f, 0.003340f, 0.001927f, 0.003952f, 0.008947f, 0.016627f, 0.026844f, 0.039331f, 0.053686f, 0.069631f, 0.087084f, 0.105849f, 0.125258f, 0.144267f, 0.162023f, 0.178236f, 0.192755f, 0.204836f, 0.213266f, 0.217287f, 0.216843f, 0.211652f, 0.200710f, 0.183257f, 0.159710f, 0.131033f, 0.097576f, 0.059269f, 0.016690f, -0.028770f, -0.075739f, -0.123333f, -0.170970f, -0.218285f, -0.265068f, -0.310574f, -0.352756f, -0.388810f, -0.416934f, -0.437347f, + -0.451255f, -0.458880f, -0.458839f, -0.449713f, -0.432204f, -0.409619f, -0.386020f, -0.363800f, -0.342969f, -0.322690f, -0.303273f, -0.286626f, -0.275007f, -0.269641f, -0.270390f, -0.276241f, -0.285888f, -0.298144f, -0.312255f, -0.327971f, -0.345199f, -0.363508f, -0.381893f, -0.399002f, -0.413686f, -0.425507f, -0.434753f, -0.441996f, -0.447655f, -0.451917f, -0.454880f, -0.456722f, -0.457797f, -0.458478f, -0.458752f, -0.458121f, -0.456157f, -0.453025f, -0.449242f, -0.445115f, -0.440663f, -0.435765f, -0.429977f, -0.422410f, -0.412255f, -0.399353f, -0.384044f, -0.366690f, -0.347614f, -0.327259f, -0.306182f, -0.285019f, -0.264467f, -0.245070f, -0.227032f, -0.210404f, -0.195308f, -0.181726f, -0.169332f, -0.157853f, -0.147307f, -0.137689f, -0.128750f, -0.120299f, -0.112312f, -0.104627f, -0.096937f, -0.089190f, -0.081612f, -0.074406f, -0.067751f, -0.061796f, -0.056271f, -0.050527f, -0.044251f, -0.037633f, -0.030645f, -0.022940f, -0.014604f, -0.006131f, 0.002380f, 0.011084f, 0.019647f, 0.027656f, 0.035299f, 0.042653f, 0.049064f, 0.054179f, 0.058475f, 0.061913f, 0.063651f, 0.063792f, 0.063468f, 0.062805f, 0.061111f, 0.058940f, + 0.057196f, 0.055040f, 0.051853f, 0.049240f, 0.047435f, 0.043389f, 0.036776f, 0.032043f, 0.029194f, 0.021482f, 0.009242f, 0.002996f, 0.002545f, -0.009347f, -0.036379f, -0.052805f, -0.041320f, -0.024358f, -0.027246f, -0.034686f, -0.024798f, -0.022626f, -0.064861f, -0.125246f, -0.137627f, -0.092121f, -0.047334f, -0.041987f, -0.054463f, -0.057870f, -0.053789f, -0.041072f, -0.015593f, -0.013176f, -0.080518f, -0.182863f, -0.217493f, -0.150387f, -0.062968f, -0.026715f, -0.015171f, 0.011874f, 0.031103f, 0.034503f, 0.089489f, 0.214435f, 0.272951f, 0.129518f} + }, + { + {-0.038036f, -0.074902f, -0.024728f, 0.087455f, 0.171578f, 0.138660f, -0.013344f, -0.177067f, -0.224993f, -0.133475f, 0.000768f, 0.073679f, 0.073125f, 0.051799f, 0.042554f, 0.040258f, 0.042095f, 0.055917f, 0.071808f, 0.065859f, 0.038024f, 0.016554f, 0.018640f, 0.030709f, 0.033652f, 0.026271f, 0.015742f, 0.001748f, -0.019927f, -0.047556f, -0.074394f, -0.094749f, -0.106738f, -0.113212f, -0.120520f, -0.132744f, -0.147313f, -0.158256f, -0.161754f, -0.156711f, -0.143250f, -0.123457f, -0.101193f, -0.079047f, -0.057237f, -0.036057f, -0.016869f, -0.000173f, 0.014829f, 0.028457f, 0.040426f, 0.051286f, 0.062027f, 0.072634f, 0.082611f, 0.092229f, 0.101796f, 0.110497f, 0.117155f, 0.121469f, 0.123745f, 0.124154f, 0.122894f, 0.120542f, 0.118067f, 0.116669f, 0.117188f, 0.119429f, 0.122852f, 0.127992f, 0.135991f, 0.146706f, 0.158839f, 0.172086f, 0.187416f, 0.204930f, 0.223054f, 0.240129f, 0.255405f, 0.268314f, 0.277870f, 0.282894f, 0.282322f, 0.275749f, 0.263854f, 0.247296f, 0.225295f, 0.197079f, 0.164656f, 0.131544f, 0.098081f, 0.060564f, 0.016252f, -0.032884f, -0.082704f, -0.131427f, + -0.180130f, -0.229646f, -0.278328f, -0.323025f, -0.361917f, -0.395929f, -0.426764f, -0.453823f, -0.474235f, -0.486045f, -0.490258f, -0.489520f, -0.485692f, -0.478679f, -0.466693f, -0.447817f, -0.422153f, -0.392219f, -0.360719f, -0.328559f, -0.295468f, -0.261492f, -0.227219f, -0.193485f, -0.161356f, -0.131578f, -0.103829f, -0.077323f, -0.051994f, -0.028199f, -0.005636f, 0.016498f, 0.038710f, 0.061118f, 0.083300f, 0.103747f, 0.120694f, 0.134062f, 0.145495f, 0.156353f, 0.166955f, 0.177434f, 0.187498f, 0.195642f, 0.200481f, 0.202621f, 0.203729f, 0.204510f, 0.205051f, 0.205904f, 0.207126f, 0.207456f, 0.205955f, 0.203314f, 0.200582f, 0.198064f, 0.196146f, 0.195517f, 0.195977f, 0.196494f, 0.196550f, 0.196111f, 0.194868f, 0.192897f, 0.191150f, 0.190037f, 0.188817f, 0.187238f, 0.185888f, 0.184302f, 0.181068f, 0.176285f, 0.171411f, 0.166717f, 0.161536f, 0.156496f, 0.152668f, 0.149485f, 0.146174f, 0.143623f, 0.142412f, 0.141376f, 0.140226f, 0.140504f, 0.142241f, 0.143471f, 0.144125f, 0.145942f, 0.148225f, 0.148788f, 0.148461f, 0.149129f, 0.149237f, 0.147094f, 0.145098f, 0.144601f, + 0.142172f, 0.137100f, 0.134404f, 0.134101f, 0.129092f, 0.120268f, 0.117850f, 0.120259f, 0.112981f, 0.098190f, 0.097531f, 0.110374f, 0.103615f, 0.067766f, 0.046475f, 0.073314f, 0.111894f, 0.105684f, 0.062494f, 0.035374f, 0.034378f, 0.017735f, -0.027142f, -0.052915f, -0.024407f, 0.022722f, 0.028116f, -0.013868f, -0.055362f, -0.066124f, -0.069119f, -0.094576f, -0.122680f, -0.100213f, -0.014486f, 0.075343f, 0.099155f, 0.055635f, 0.009056f, 0.009599f, 0.040799f, 0.054429f, 0.037946f, 0.027022f, 0.053523f, 0.098025f, 0.105408f, 0.046190f}, + {-0.038036f, -0.074902f, -0.024728f, 0.087455f, 0.171578f, 0.138660f, -0.013344f, -0.177067f, -0.224993f, -0.133475f, 0.000768f, 0.073679f, 0.073125f, 0.051799f, 0.042554f, 0.040258f, 0.042095f, 0.055917f, 0.071808f, 0.065859f, 0.038024f, 0.016554f, 0.018640f, 0.030709f, 0.033652f, 0.026271f, 0.015742f, 0.001748f, -0.019927f, -0.047556f, -0.074394f, -0.094749f, -0.106738f, -0.113212f, -0.120520f, -0.132744f, -0.147313f, -0.158256f, -0.161754f, -0.156711f, -0.143250f, -0.123457f, -0.101193f, -0.079047f, -0.057237f, -0.036057f, -0.016869f, -0.000173f, 0.014829f, 0.028457f, 0.040426f, 0.051286f, 0.062027f, 0.072634f, 0.082611f, 0.092229f, 0.101796f, 0.110497f, 0.117155f, 0.121469f, 0.123745f, 0.124154f, 0.122894f, 0.120542f, 0.118067f, 0.116669f, 0.117188f, 0.119429f, 0.122852f, 0.127992f, 0.135991f, 0.146706f, 0.158839f, 0.172086f, 0.187416f, 0.204930f, 0.223054f, 0.240129f, 0.255405f, 0.268314f, 0.277870f, 0.282894f, 0.282322f, 0.275749f, 0.263854f, 0.247296f, 0.225295f, 0.197079f, 0.164656f, 0.131544f, 0.098081f, 0.060564f, 0.016252f, -0.032884f, -0.082704f, -0.131427f, + -0.180130f, -0.229646f, -0.278328f, -0.323025f, -0.361917f, -0.395929f, -0.426764f, -0.453823f, -0.474235f, -0.486045f, -0.490258f, -0.489520f, -0.485692f, -0.478679f, -0.466693f, -0.447817f, -0.422153f, -0.392219f, -0.360719f, -0.328559f, -0.295468f, -0.261492f, -0.227219f, -0.193485f, -0.161356f, -0.131578f, -0.103829f, -0.077323f, -0.051994f, -0.028199f, -0.005636f, 0.016498f, 0.038710f, 0.061118f, 0.083300f, 0.103747f, 0.120694f, 0.134062f, 0.145495f, 0.156353f, 0.166955f, 0.177434f, 0.187498f, 0.195642f, 0.200481f, 0.202621f, 0.203729f, 0.204510f, 0.205051f, 0.205904f, 0.207126f, 0.207456f, 0.205955f, 0.203314f, 0.200582f, 0.198064f, 0.196146f, 0.195517f, 0.195977f, 0.196494f, 0.196550f, 0.196111f, 0.194868f, 0.192897f, 0.191150f, 0.190037f, 0.188817f, 0.187238f, 0.185888f, 0.184302f, 0.181068f, 0.176285f, 0.171411f, 0.166717f, 0.161536f, 0.156496f, 0.152668f, 0.149485f, 0.146174f, 0.143623f, 0.142412f, 0.141376f, 0.140226f, 0.140504f, 0.142241f, 0.143471f, 0.144125f, 0.145942f, 0.148225f, 0.148788f, 0.148461f, 0.149129f, 0.149237f, 0.147094f, 0.145098f, 0.144601f, + 0.142172f, 0.137100f, 0.134404f, 0.134101f, 0.129092f, 0.120268f, 0.117850f, 0.120259f, 0.112981f, 0.098190f, 0.097531f, 0.110374f, 0.103615f, 0.067766f, 0.046475f, 0.073314f, 0.111894f, 0.105684f, 0.062494f, 0.035374f, 0.034378f, 0.017735f, -0.027142f, -0.052915f, -0.024407f, 0.022722f, 0.028116f, -0.013868f, -0.055362f, -0.066124f, -0.069119f, -0.094576f, -0.122680f, -0.100213f, -0.014486f, 0.075343f, 0.099155f, 0.055635f, 0.009056f, 0.009599f, 0.040799f, 0.054429f, 0.037946f, 0.027022f, 0.053523f, 0.098025f, 0.105408f, 0.046190f} + }, + { + {0.027441f, 0.021679f, -0.082621f, -0.191948f, -0.202084f, -0.094108f, 0.096974f, 0.326618f, 0.521978f, 0.590057f, 0.497559f, 0.307017f, 0.099764f, -0.101988f, -0.307232f, -0.491820f, -0.609355f, -0.649595f, -0.646886f, -0.633907f, -0.612951f, -0.571444f, -0.505172f, -0.422223f, -0.334883f, -0.251121f, -0.170169f, -0.086087f, 0.003629f, 0.095234f, 0.184031f, 0.268139f, 0.346272f, 0.415753f, 0.474124f, 0.520403f, 0.554178f, 0.575097f, 0.583394f, 0.580090f, 0.567158f, 0.547787f, 0.525101f, 0.500036f, 0.471584f, 0.439385f, 0.404951f, 0.370416f, 0.337380f, 0.306853f, 0.278873f, 0.252040f, 0.224475f, 0.195404f, 0.165334f, 0.135006f, 0.104920f, 0.075648f, 0.047947f, 0.022412f, -0.000792f, -0.021853f, -0.040983f, -0.058167f, -0.073292f, -0.086448f, -0.097776f, -0.107101f, -0.114171f, -0.119257f, -0.122970f, -0.125515f, -0.126712f, -0.126774f, -0.126359f, -0.125690f, -0.124305f, -0.122054f, -0.119813f, -0.118756f, -0.119207f, -0.120613f, -0.122402f, -0.124386f, -0.126292f, -0.127367f, -0.126798f, -0.124468f, -0.121185f, -0.118139f, -0.116167f, -0.115553f, -0.116624f, -0.120458f, -0.128545f, -0.141294f, + -0.156980f, -0.172648f, -0.186184f, -0.197243f, -0.206090f, -0.211880f, -0.212427f, -0.205830f, -0.192230f, -0.173709f, -0.152371f, -0.128816f, -0.102692f, -0.074344f, -0.045427f, -0.018045f, 0.006404f, 0.027767f, 0.046885f, 0.064600f, 0.080777f, 0.094441f, 0.104938f, 0.112698f, 0.118996f, 0.125328f, 0.132751f, 0.141144f, 0.149168f, 0.155522f, 0.160126f, 0.163757f, 0.166992f, 0.170045f, 0.173074f, 0.175948f, 0.178087f, 0.179025f, 0.178790f, 0.177467f, 0.174929f, 0.171183f, 0.166401f, 0.160453f, 0.152932f, 0.143629f, 0.132548f, 0.119638f, 0.105028f, 0.089256f, 0.072911f, 0.056388f, 0.040116f, 0.024480f, 0.009419f, -0.005258f, -0.019264f, -0.032140f, -0.043833f, -0.054222f, -0.062625f, -0.068570f, -0.072428f, -0.074596f, -0.074922f, -0.073532f, -0.071151f, -0.068045f, -0.063754f, -0.058200f, -0.051948f, -0.045349f, -0.038611f, -0.032407f, -0.027221f, -0.022662f, -0.018431f, -0.014899f, -0.011798f, -0.007903f, -0.002918f, 0.002034f, 0.006392f, 0.010574f, 0.014257f, 0.016609f, 0.018102f, 0.019736f, 0.021213f, 0.022181f, 0.023713f, 0.026265f, 0.028470f, 0.029930f, 0.032014f, 0.034470f, + 0.035580f, 0.036329f, 0.038845f, 0.041238f, 0.041102f, 0.042047f, 0.047533f, 0.052212f, 0.051464f, 0.053228f, 0.064060f, 0.071678f, 0.064058f, 0.058056f, 0.078804f, 0.113563f, 0.120945f, 0.090397f, 0.057586f, 0.050567f, 0.053941f, 0.042361f, 0.020875f, 0.011317f, 0.018428f, 0.028794f, 0.030929f, 0.021922f, 0.003208f, -0.020240f, -0.044523f, -0.076714f, -0.128079f, -0.186110f, -0.204814f, -0.146629f, -0.038156f, 0.042081f, 0.052437f, 0.040839f, 0.071199f, 0.121547f, 0.126005f, 0.113437f, 0.196100f, 0.367783f, 0.422586f, 0.192647f}, + {0.027441f, 0.021679f, -0.082621f, -0.191948f, -0.202084f, -0.094108f, 0.096974f, 0.326618f, 0.521978f, 0.590057f, 0.497559f, 0.307017f, 0.099764f, -0.101988f, -0.307232f, -0.491820f, -0.609355f, -0.649595f, -0.646886f, -0.633907f, -0.612951f, -0.571444f, -0.505172f, -0.422223f, -0.334883f, -0.251121f, -0.170169f, -0.086087f, 0.003629f, 0.095234f, 0.184031f, 0.268139f, 0.346272f, 0.415753f, 0.474124f, 0.520403f, 0.554178f, 0.575097f, 0.583394f, 0.580090f, 0.567158f, 0.547787f, 0.525101f, 0.500036f, 0.471584f, 0.439385f, 0.404951f, 0.370416f, 0.337380f, 0.306853f, 0.278873f, 0.252040f, 0.224475f, 0.195404f, 0.165334f, 0.135006f, 0.104920f, 0.075648f, 0.047947f, 0.022412f, -0.000792f, -0.021853f, -0.040983f, -0.058167f, -0.073292f, -0.086448f, -0.097776f, -0.107101f, -0.114171f, -0.119257f, -0.122970f, -0.125515f, -0.126712f, -0.126774f, -0.126359f, -0.125690f, -0.124305f, -0.122054f, -0.119813f, -0.118756f, -0.119207f, -0.120613f, -0.122402f, -0.124386f, -0.126292f, -0.127367f, -0.126798f, -0.124468f, -0.121185f, -0.118139f, -0.116167f, -0.115553f, -0.116624f, -0.120458f, -0.128545f, -0.141294f, + -0.156980f, -0.172648f, -0.186184f, -0.197243f, -0.206090f, -0.211880f, -0.212427f, -0.205830f, -0.192230f, -0.173709f, -0.152371f, -0.128816f, -0.102692f, -0.074344f, -0.045427f, -0.018045f, 0.006404f, 0.027767f, 0.046885f, 0.064600f, 0.080777f, 0.094441f, 0.104938f, 0.112698f, 0.118996f, 0.125328f, 0.132751f, 0.141144f, 0.149168f, 0.155522f, 0.160126f, 0.163757f, 0.166992f, 0.170045f, 0.173074f, 0.175948f, 0.178087f, 0.179025f, 0.178790f, 0.177467f, 0.174929f, 0.171183f, 0.166401f, 0.160453f, 0.152932f, 0.143629f, 0.132548f, 0.119638f, 0.105028f, 0.089256f, 0.072911f, 0.056388f, 0.040116f, 0.024480f, 0.009419f, -0.005258f, -0.019264f, -0.032140f, -0.043833f, -0.054222f, -0.062625f, -0.068570f, -0.072428f, -0.074596f, -0.074922f, -0.073532f, -0.071151f, -0.068045f, -0.063754f, -0.058200f, -0.051948f, -0.045349f, -0.038611f, -0.032407f, -0.027221f, -0.022662f, -0.018431f, -0.014899f, -0.011798f, -0.007903f, -0.002918f, 0.002034f, 0.006392f, 0.010574f, 0.014257f, 0.016609f, 0.018102f, 0.019736f, 0.021213f, 0.022181f, 0.023713f, 0.026265f, 0.028470f, 0.029930f, 0.032014f, 0.034470f, + 0.035580f, 0.036329f, 0.038845f, 0.041238f, 0.041102f, 0.042047f, 0.047533f, 0.052212f, 0.051464f, 0.053228f, 0.064060f, 0.071678f, 0.064058f, 0.058056f, 0.078804f, 0.113563f, 0.120945f, 0.090397f, 0.057586f, 0.050567f, 0.053941f, 0.042361f, 0.020875f, 0.011317f, 0.018428f, 0.028794f, 0.030929f, 0.021922f, 0.003208f, -0.020240f, -0.044523f, -0.076714f, -0.128079f, -0.186110f, -0.204814f, -0.146629f, -0.038156f, 0.042081f, 0.052437f, 0.040839f, 0.071199f, 0.121547f, 0.126005f, 0.113437f, 0.196100f, 0.367783f, 0.422586f, 0.192647f} + } +}; +const float *CRendBin_HOA2_HRIR_coeff_diffuse_re_48kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const float *CRendBin_HOA2_HRIR_coeff_diffuse_im_48kHz[BINAURAL_CHANNELS]={NULL,NULL}; + +/* Sample Rate = 32000 */ + +const int16_t CRendBin_HOA2_HRIR_max_num_iterations_32kHz = 1; +const uint16_t CRendBin_HOA2_HRIR_num_iterations_32kHz[9][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1} }; +const uint16_t CRendBin_HOA2_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS] = {0, 0}; +const uint16_t CRendBin_HOA2_HRIR_pIndex_frequency_max_32kHz[9][BINAURAL_CHANNELS][1]={{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}}}; +const uint16_t CRendBin_HOA2_HRIR_index_frequency_max_diffuse_32kHz = 0; +const float CRendBin_HOA2_HRIR_inv_diffuse_weight_32kHz[9]={0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f}; +const uint16_t *CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const float CRendBin_HOA2_HRIR_coeff_re_32kHz[9][BINAURAL_CHANNELS][160]={ + { + {0.897602f, 0.577826f, 0.108806f, -0.306523f, -0.566468f, -0.683867f, -0.708050f, -0.662267f, -0.546112f, -0.366162f, -0.147663f, 0.075830f, 0.274439f, 0.427135f, 0.523893f, 0.565927f, 0.561989f, 0.522411f, 0.455067f, 0.365320f, 0.258865f, 0.144039f, 0.030037f, -0.077847f, -0.179832f, -0.277247f, -0.367752f, -0.446478f, -0.510700f, -0.561304f, -0.600215f, -0.628591f, -0.647703f, -0.659706f, -0.666671f, -0.669681f, -0.669369f, -0.666740f, -0.662997f, -0.658812f, -0.654035f, -0.648036f, -0.640253f, -0.630498f, -0.618870f, -0.605516f, -0.590564f, -0.574163f, -0.556413f, -0.537291f, -0.516802f, -0.495178f, -0.472808f, -0.450009f, -0.427015f, -0.404157f, -0.381849f, -0.360307f, -0.339403f, -0.318926f, -0.298870f, -0.279294f, -0.260068f, -0.241018f, -0.222243f, -0.203976f, -0.186205f, -0.168754f, -0.151665f, -0.135094f, -0.118902f, -0.102773f, -0.086674f, -0.070750f, -0.054844f, -0.038640f, -0.022176f, -0.005693f, 0.010967f, 0.028233f, 0.046067f, 0.063897f, 0.081395f, 0.098808f, 0.116372f, 0.133779f, 0.150477f, 0.166354f, 0.181854f, 0.197372f, 0.212626f, 0.226853f, 0.239657f, 0.251401f, 0.262567f, 0.273031f, + 0.282281f, 0.290215f, 0.297417f, 0.304666f, 0.312357f, 0.320369f, 0.328416f, 0.336584f, 0.345432f, 0.355456f, 0.366574f, 0.378314f, 0.390352f, 0.402657f, 0.415266f, 0.428155f, 0.441199f, 0.454112f, 0.466543f, 0.478326f, 0.489500f, 0.500130f, 0.510290f, 0.520137f, 0.529784f, 0.539205f, 0.548418f, 0.557568f, 0.566687f, 0.575611f, 0.584243f, 0.592610f, 0.600634f, 0.608188f, 0.615368f, 0.622392f, 0.629357f, 0.636344f, 0.643544f, 0.651019f, 0.658638f, 0.666412f, 0.674501f, 0.682889f, 0.691585f, 0.700932f, 0.711138f, 0.721918f, 0.733181f, 0.745327f, 0.758323f, 0.771744f, 0.786076f, 0.802163f, 0.819709f, 0.839320f, 0.863573f, 0.887678f, 0.889456f, 0.843076f, 0.751715f, 0.655369f, 0.594023f, 0.571927f}, + {0.897602f, 0.577826f, 0.108806f, -0.306523f, -0.566468f, -0.683867f, -0.708050f, -0.662267f, -0.546112f, -0.366162f, -0.147663f, 0.075830f, 0.274439f, 0.427135f, 0.523893f, 0.565927f, 0.561989f, 0.522411f, 0.455067f, 0.365320f, 0.258865f, 0.144039f, 0.030037f, -0.077847f, -0.179832f, -0.277247f, -0.367752f, -0.446478f, -0.510700f, -0.561304f, -0.600215f, -0.628591f, -0.647703f, -0.659706f, -0.666671f, -0.669681f, -0.669369f, -0.666740f, -0.662997f, -0.658812f, -0.654035f, -0.648036f, -0.640253f, -0.630498f, -0.618870f, -0.605516f, -0.590564f, -0.574163f, -0.556413f, -0.537291f, -0.516802f, -0.495178f, -0.472808f, -0.450009f, -0.427015f, -0.404157f, -0.381849f, -0.360307f, -0.339403f, -0.318926f, -0.298870f, -0.279294f, -0.260068f, -0.241018f, -0.222243f, -0.203976f, -0.186205f, -0.168754f, -0.151665f, -0.135094f, -0.118902f, -0.102773f, -0.086674f, -0.070750f, -0.054844f, -0.038640f, -0.022176f, -0.005693f, 0.010967f, 0.028233f, 0.046067f, 0.063897f, 0.081395f, 0.098808f, 0.116372f, 0.133779f, 0.150477f, 0.166354f, 0.181854f, 0.197372f, 0.212626f, 0.226853f, 0.239657f, 0.251401f, 0.262567f, 0.273031f, + 0.282281f, 0.290215f, 0.297417f, 0.304666f, 0.312357f, 0.320369f, 0.328416f, 0.336584f, 0.345432f, 0.355456f, 0.366574f, 0.378314f, 0.390352f, 0.402657f, 0.415266f, 0.428155f, 0.441199f, 0.454112f, 0.466543f, 0.478326f, 0.489500f, 0.500130f, 0.510290f, 0.520137f, 0.529784f, 0.539205f, 0.548418f, 0.557568f, 0.566687f, 0.575611f, 0.584243f, 0.592610f, 0.600634f, 0.608188f, 0.615368f, 0.622392f, 0.629357f, 0.636344f, 0.643544f, 0.651019f, 0.658638f, 0.666412f, 0.674501f, 0.682889f, 0.691585f, 0.700932f, 0.711138f, 0.721918f, 0.733181f, 0.745327f, 0.758323f, 0.771744f, 0.786076f, 0.802163f, 0.819709f, 0.839320f, 0.863573f, 0.887678f, 0.889456f, 0.843076f, 0.751715f, 0.655369f, 0.594023f, 0.571927f} + }, + { + {0.025194f, 0.342112f, 0.675564f, 0.682494f, 0.258733f, -0.398681f, -0.973589f, -1.262576f, -1.256946f, -1.058731f, -0.764793f, -0.426634f, -0.073890f, 0.263727f, 0.559774f, 0.798438f, 0.971176f, 1.071852f, 1.099750f, 1.064803f, 0.985420f, 0.879037f, 0.754656f, 0.614706f, 0.462886f, 0.307828f, 0.158623f, 0.019325f, -0.110401f, -0.231143f, -0.342445f, -0.444256f, -0.537190f, -0.621517f, -0.697392f, -0.765776f, -0.828007f, -0.884703f, -0.935654f, -0.980323f, -1.017968f, -1.047912f, -1.070192f, -1.085582f, -1.094827f, -1.098295f, -1.096314f, -1.089341f, -1.077935f, -1.062999f, -1.045792f, -1.027186f, -1.007049f, -0.984675f, -0.959577f, -0.931701f, -0.901301f, -0.868883f, -0.835096f, -0.800590f, -0.766000f, -0.731849f, -0.698317f, -0.665445f, -0.633597f, -0.603249f, -0.574361f, -0.546664f, -0.520494f, -0.496496f, -0.474634f, -0.454436f, -0.436061f, -0.419958f, -0.405621f, -0.391915f, -0.378565f, -0.366066f, -0.354142f, -0.341591f, -0.327794f, -0.313265f, -0.298453f, -0.282899f, -0.265880f, -0.247319f, -0.227788f, -0.207881f, -0.187683f, -0.166750f, -0.144562f, -0.120841f, -0.095390f, -0.067900f, -0.038125f, -0.005978f, + 0.028618f, 0.065539f, 0.103963f, 0.142557f, 0.180312f, 0.216742f, 0.251282f, 0.283074f, 0.311414f, 0.335949f, 0.356498f, 0.373081f, 0.385974f, 0.395461f, 0.401900f, 0.406261f, 0.410013f, 0.414134f, 0.418648f, 0.423274f, 0.428046f, 0.433325f, 0.439768f, 0.448163f, 0.458716f, 0.470631f, 0.482794f, 0.494578f, 0.505783f, 0.516446f, 0.526959f, 0.537714f, 0.548520f, 0.558994f, 0.569308f, 0.579744f, 0.589954f, 0.599564f, 0.608906f, 0.618335f, 0.627675f, 0.637031f, 0.647025f, 0.657685f, 0.668438f, 0.679464f, 0.691511f, 0.704568f, 0.718501f, 0.734270f, 0.752608f, 0.772902f, 0.795176f, 0.820738f, 0.849727f, 0.882515f, 0.922967f, 0.969024f, 0.996502f, 0.969523f, 0.881689f, 0.774824f, 0.699914f, 0.669918f}, + {-0.025194f, -0.342112f, -0.675564f, -0.682494f, -0.258733f, 0.398681f, 0.973589f, 1.262576f, 1.256946f, 1.058731f, 0.764793f, 0.426634f, 0.073890f, -0.263727f, -0.559774f, -0.798438f, -0.971176f, -1.071852f, -1.099750f, -1.064803f, -0.985420f, -0.879037f, -0.754656f, -0.614706f, -0.462886f, -0.307828f, -0.158623f, -0.019325f, 0.110401f, 0.231143f, 0.342445f, 0.444256f, 0.537190f, 0.621517f, 0.697392f, 0.765776f, 0.828007f, 0.884703f, 0.935654f, 0.980323f, 1.017968f, 1.047912f, 1.070192f, 1.085582f, 1.094827f, 1.098295f, 1.096314f, 1.089341f, 1.077935f, 1.062999f, 1.045792f, 1.027186f, 1.007049f, 0.984675f, 0.959577f, 0.931701f, 0.901301f, 0.868883f, 0.835096f, 0.800590f, 0.766000f, 0.731849f, 0.698317f, 0.665445f, 0.633597f, 0.603249f, 0.574361f, 0.546664f, 0.520494f, 0.496496f, 0.474634f, 0.454436f, 0.436061f, 0.419958f, 0.405621f, 0.391915f, 0.378565f, 0.366066f, 0.354142f, 0.341591f, 0.327794f, 0.313265f, 0.298453f, 0.282899f, 0.265880f, 0.247319f, 0.227788f, 0.207881f, 0.187683f, 0.166750f, 0.144562f, 0.120841f, 0.095390f, 0.067900f, 0.038125f, 0.005978f, + -0.028618f, -0.065539f, -0.103963f, -0.142557f, -0.180312f, -0.216742f, -0.251282f, -0.283074f, -0.311414f, -0.335949f, -0.356498f, -0.373081f, -0.385974f, -0.395461f, -0.401900f, -0.406261f, -0.410013f, -0.414134f, -0.418648f, -0.423274f, -0.428046f, -0.433325f, -0.439768f, -0.448163f, -0.458716f, -0.470631f, -0.482794f, -0.494578f, -0.505783f, -0.516446f, -0.526959f, -0.537714f, -0.548520f, -0.558994f, -0.569308f, -0.579744f, -0.589954f, -0.599564f, -0.608906f, -0.618335f, -0.627675f, -0.637031f, -0.647025f, -0.657685f, -0.668438f, -0.679464f, -0.691511f, -0.704568f, -0.718501f, -0.734270f, -0.752608f, -0.772902f, -0.795176f, -0.820738f, -0.849727f, -0.882515f, -0.922967f, -0.969024f, -0.996502f, -0.969523f, -0.881689f, -0.774824f, -0.699914f, -0.669918f} + }, + { + {0.123783f, 0.079142f, -0.013604f, -0.105100f, -0.113185f, -0.024894f, 0.074468f, 0.098724f, 0.046327f, -0.027465f, -0.078213f, -0.088258f, -0.055710f, -0.000383f, 0.042236f, 0.057986f, 0.069486f, 0.099522f, 0.137420f, 0.156798f, 0.149156f, 0.123327f, 0.085399f, 0.036913f, -0.013895f, -0.054098f, -0.078834f, -0.094462f, -0.109491f, -0.126339f, -0.140883f, -0.147343f, -0.143570f, -0.132138f, -0.116877f, -0.100467f, -0.086153f, -0.078747f, -0.081336f, -0.092548f, -0.108797f, -0.127742f, -0.148326f, -0.169245f, -0.189131f, -0.207447f, -0.224308f, -0.239991f, -0.254774f, -0.268361f, -0.279300f, -0.285688f, -0.286493f, -0.281631f, -0.271021f, -0.254283f, -0.231338f, -0.202668f, -0.168822f, -0.129974f, -0.086151f, -0.037693f, 0.014755f, 0.070664f, 0.129601f, 0.190610f, 0.252066f, 0.312376f, 0.370362f, 0.424702f, 0.473595f, 0.515352f, 0.548741f, 0.572621f, 0.586173f, 0.589753f, 0.584497f, 0.570819f, 0.548637f, 0.519448f, 0.486508f, 0.451975f, 0.415486f, 0.376839f, 0.338596f, 0.304072f, 0.273539f, 0.244560f, 0.216101f, 0.190399f, 0.170141f, 0.155231f, 0.143391f, 0.133067f, 0.124640f, 0.119123f, + 0.116745f, 0.116888f, 0.118578f, 0.120715f, 0.122313f, 0.122982f, 0.123106f, 0.123239f, 0.123145f, 0.121392f, 0.116164f, 0.106765f, 0.094311f, 0.080694f, 0.066929f, 0.052762f, 0.037599f, 0.021374f, 0.004602f, -0.011834f, -0.026863f, -0.039513f, -0.049167f, -0.055515f, -0.058454f, -0.058150f, -0.054920f, -0.048913f, -0.040142f, -0.028937f, -0.016071f, -0.002374f, 0.011525f, 0.025132f, 0.038028f, 0.049816f, 0.059954f, 0.067900f, 0.073662f, 0.077971f, 0.081798f, 0.086018f, 0.091452f, 0.098460f, 0.106332f, 0.113772f, 0.120190f, 0.125901f, 0.131052f, 0.135199f, 0.138076f, 0.139868f, 0.140465f, 0.139339f, 0.136539f, 0.132830f, 0.127801f, 0.118282f, 0.100330f, 0.074236f, 0.047165f, 0.028710f, 0.022439f, 0.022954f}, + {0.123783f, 0.079142f, -0.013604f, -0.105100f, -0.113185f, -0.024894f, 0.074468f, 0.098724f, 0.046327f, -0.027465f, -0.078213f, -0.088258f, -0.055710f, -0.000383f, 0.042236f, 0.057986f, 0.069486f, 0.099522f, 0.137420f, 0.156798f, 0.149156f, 0.123327f, 0.085399f, 0.036913f, -0.013895f, -0.054098f, -0.078834f, -0.094462f, -0.109491f, -0.126339f, -0.140883f, -0.147343f, -0.143570f, -0.132138f, -0.116877f, -0.100467f, -0.086153f, -0.078747f, -0.081336f, -0.092548f, -0.108797f, -0.127742f, -0.148326f, -0.169245f, -0.189131f, -0.207447f, -0.224308f, -0.239991f, -0.254774f, -0.268361f, -0.279300f, -0.285688f, -0.286493f, -0.281631f, -0.271021f, -0.254283f, -0.231338f, -0.202668f, -0.168822f, -0.129974f, -0.086151f, -0.037693f, 0.014755f, 0.070664f, 0.129601f, 0.190610f, 0.252066f, 0.312376f, 0.370362f, 0.424702f, 0.473595f, 0.515352f, 0.548741f, 0.572621f, 0.586173f, 0.589753f, 0.584497f, 0.570819f, 0.548637f, 0.519448f, 0.486508f, 0.451975f, 0.415486f, 0.376839f, 0.338596f, 0.304072f, 0.273539f, 0.244560f, 0.216101f, 0.190399f, 0.170141f, 0.155231f, 0.143391f, 0.133067f, 0.124640f, 0.119123f, + 0.116745f, 0.116888f, 0.118578f, 0.120715f, 0.122313f, 0.122982f, 0.123106f, 0.123239f, 0.123145f, 0.121392f, 0.116164f, 0.106765f, 0.094311f, 0.080694f, 0.066929f, 0.052762f, 0.037599f, 0.021374f, 0.004602f, -0.011834f, -0.026863f, -0.039513f, -0.049167f, -0.055515f, -0.058454f, -0.058150f, -0.054920f, -0.048913f, -0.040142f, -0.028937f, -0.016071f, -0.002374f, 0.011525f, 0.025132f, 0.038028f, 0.049816f, 0.059954f, 0.067900f, 0.073662f, 0.077971f, 0.081798f, 0.086018f, 0.091452f, 0.098460f, 0.106332f, 0.113772f, 0.120190f, 0.125901f, 0.131052f, 0.135199f, 0.138076f, 0.139868f, 0.140465f, 0.139339f, 0.136539f, 0.132830f, 0.127801f, 0.118282f, 0.100330f, 0.074236f, 0.047165f, 0.028710f, 0.022439f, 0.022954f} + }, + { + {0.022041f, 0.041073f, 0.023192f, -0.049439f, -0.115087f, -0.109721f, -0.051812f, -0.018474f, -0.053835f, -0.129015f, -0.184936f, -0.189273f, -0.150509f, -0.096286f, -0.047125f, -0.003652f, 0.046865f, 0.111479f, 0.180387f, 0.235653f, 0.266376f, 0.271854f, 0.255690f, 0.223813f, 0.185119f, 0.146033f, 0.103929f, 0.051053f, -0.014916f, -0.088609f, -0.164699f, -0.242434f, -0.321099f, -0.395711f, -0.460083f, -0.511538f, -0.550187f, -0.575553f, -0.586525f, -0.583852f, -0.570627f, -0.550265f, -0.525062f, -0.496520f, -0.466042f, -0.434860f, -0.403494f, -0.371536f, -0.338271f, -0.303703f, -0.268969f, -0.235863f, -0.206239f, -0.181539f, -0.162004f, -0.146110f, -0.131475f, -0.116507f, -0.100761f, -0.084071f, -0.066392f, -0.048344f, -0.030824f, -0.014005f, 0.002442f, 0.018433f, 0.033863f, 0.049525f, 0.066361f, 0.084044f, 0.101603f, 0.119134f, 0.137365f, 0.155718f, 0.172448f, 0.186743f, 0.199023f, 0.208891f, 0.214543f, 0.214968f, 0.211256f, 0.204664f, 0.194649f, 0.180250f, 0.162586f, 0.144266f, 0.126558f, 0.108656f, 0.089774f, 0.070272f, 0.050282f, 0.028810f, 0.005195f, -0.019706f, -0.044775f, -0.070130f, + -0.096279f, -0.122442f, -0.146818f, -0.168301f, -0.187141f, -0.203936f, -0.218346f, -0.228848f, -0.233859f, -0.233385f, -0.229288f, -0.223466f, -0.215952f, -0.205276f, -0.190468f, -0.172326f, -0.153023f, -0.134730f, -0.118099f, -0.101742f, -0.083649f, -0.063397f, -0.042664f, -0.023688f, -0.007718f, 0.005386f, 0.016948f, 0.028798f, 0.041965f, 0.055994f, 0.069887f, 0.083350f, 0.096784f, 0.110737f, 0.125898f, 0.142980f, 0.162069f, 0.182529f, 0.203711f, 0.225239f, 0.246691f, 0.267725f, 0.288408f, 0.308817f, 0.328558f, 0.347128f, 0.364265f, 0.379624f, 0.392789f, 0.403810f, 0.413056f, 0.420712f, 0.427179f, 0.433354f, 0.439897f, 0.447590f, 0.458254f, 0.470968f, 0.475795f, 0.458226f, 0.416144f, 0.367510f, 0.333844f, 0.320329f}, + {0.022041f, 0.041073f, 0.023192f, -0.049439f, -0.115087f, -0.109721f, -0.051812f, -0.018474f, -0.053835f, -0.129015f, -0.184936f, -0.189273f, -0.150509f, -0.096286f, -0.047125f, -0.003652f, 0.046865f, 0.111479f, 0.180387f, 0.235653f, 0.266376f, 0.271854f, 0.255690f, 0.223813f, 0.185119f, 0.146033f, 0.103929f, 0.051053f, -0.014916f, -0.088609f, -0.164699f, -0.242434f, -0.321099f, -0.395711f, -0.460083f, -0.511538f, -0.550187f, -0.575553f, -0.586525f, -0.583852f, -0.570627f, -0.550265f, -0.525062f, -0.496520f, -0.466042f, -0.434860f, -0.403494f, -0.371536f, -0.338271f, -0.303703f, -0.268969f, -0.235863f, -0.206239f, -0.181539f, -0.162004f, -0.146110f, -0.131475f, -0.116507f, -0.100761f, -0.084071f, -0.066392f, -0.048344f, -0.030824f, -0.014005f, 0.002442f, 0.018433f, 0.033863f, 0.049525f, 0.066361f, 0.084044f, 0.101603f, 0.119134f, 0.137365f, 0.155718f, 0.172448f, 0.186743f, 0.199023f, 0.208891f, 0.214543f, 0.214968f, 0.211256f, 0.204664f, 0.194649f, 0.180250f, 0.162586f, 0.144266f, 0.126558f, 0.108656f, 0.089774f, 0.070272f, 0.050282f, 0.028810f, 0.005195f, -0.019706f, -0.044775f, -0.070130f, + -0.096279f, -0.122442f, -0.146818f, -0.168301f, -0.187141f, -0.203936f, -0.218346f, -0.228848f, -0.233859f, -0.233385f, -0.229288f, -0.223466f, -0.215952f, -0.205276f, -0.190468f, -0.172326f, -0.153023f, -0.134730f, -0.118099f, -0.101742f, -0.083649f, -0.063397f, -0.042664f, -0.023688f, -0.007718f, 0.005386f, 0.016948f, 0.028798f, 0.041965f, 0.055994f, 0.069887f, 0.083350f, 0.096784f, 0.110737f, 0.125898f, 0.142980f, 0.162069f, 0.182529f, 0.203711f, 0.225239f, 0.246691f, 0.267725f, 0.288408f, 0.308817f, 0.328558f, 0.347128f, 0.364265f, 0.379624f, 0.392789f, 0.403810f, 0.413056f, 0.420712f, 0.427179f, 0.433354f, 0.439897f, 0.447590f, 0.458254f, 0.470968f, 0.475795f, 0.458226f, 0.416144f, 0.367510f, 0.333844f, 0.320329f} + }, + { + {-0.005214f, -0.012035f, -0.009014f, 0.007877f, 0.019283f, 0.010352f, -0.005363f, -0.007510f, -0.007889f, -0.044647f, -0.130133f, -0.222011f, -0.261436f, -0.231829f, -0.165637f, -0.098922f, -0.037652f, 0.029690f, 0.105217f, 0.179277f, 0.244858f, 0.300922f, 0.344183f, 0.368195f, 0.371300f, 0.358203f, 0.332456f, 0.292925f, 0.238828f, 0.173336f, 0.100520f, 0.022498f, -0.058965f, -0.141179f, -0.221961f, -0.299269f, -0.368344f, -0.422261f, -0.457042f, -0.474532f, -0.479617f, -0.476556f, -0.468368f, -0.457295f, -0.444411f, -0.429759f, -0.413316f, -0.395072f, -0.374540f, -0.351376f, -0.326316f, -0.300687f, -0.275591f, -0.252211f, -0.231900f, -0.215002f, -0.200352f, -0.186616f, -0.173280f, -0.159962f, -0.145930f, -0.130822f, -0.114800f, -0.097728f, -0.079173f, -0.059239f, -0.038296f, -0.016038f, 0.008048f, 0.033506f, 0.059464f, 0.086049f, 0.113882f, 0.142353f, 0.169789f, 0.195294f, 0.218976f, 0.240131f, 0.256716f, 0.267460f, 0.273427f, 0.276291f, 0.275776f, 0.270341f, 0.260230f, 0.247866f, 0.234578f, 0.218792f, 0.198739f, 0.175404f, 0.151105f, 0.126417f, 0.100478f, 0.073625f, 0.047824f, 0.024650f, + 0.004240f, -0.013904f, -0.030088f, -0.044324f, -0.056473f, -0.066662f, -0.075552f, -0.083740f, -0.091164f, -0.097859f, -0.104823f, -0.112999f, -0.121758f, -0.129448f, -0.135168f, -0.139283f, -0.142788f, -0.146790f, -0.151766f, -0.156646f, -0.159449f, -0.159367f, -0.157478f, -0.155349f, -0.153958f, -0.153759f, -0.154479f, -0.154881f, -0.153809f, -0.151277f, -0.147765f, -0.143164f, -0.137159f, -0.129701f, -0.120395f, -0.108503f, -0.094137f, -0.078348f, -0.061862f, -0.044971f, -0.028452f, -0.013082f, 0.001363f, 0.015222f, 0.027814f, 0.038476f, 0.047586f, 0.055404f, 0.061486f, 0.066217f, 0.071000f, 0.076305f, 0.081762f, 0.088199f, 0.096942f, 0.108135f, 0.123108f, 0.145741f, 0.175423f, 0.200807f, 0.208485f, 0.197997f, 0.181833f, 0.171727f}, + {0.005214f, 0.012035f, 0.009014f, -0.007877f, -0.019283f, -0.010352f, 0.005363f, 0.007510f, 0.007889f, 0.044647f, 0.130133f, 0.222011f, 0.261436f, 0.231829f, 0.165637f, 0.098922f, 0.037652f, -0.029690f, -0.105217f, -0.179277f, -0.244858f, -0.300922f, -0.344183f, -0.368195f, -0.371300f, -0.358203f, -0.332456f, -0.292925f, -0.238828f, -0.173336f, -0.100520f, -0.022498f, 0.058965f, 0.141179f, 0.221961f, 0.299269f, 0.368344f, 0.422261f, 0.457042f, 0.474532f, 0.479617f, 0.476556f, 0.468368f, 0.457295f, 0.444411f, 0.429759f, 0.413316f, 0.395072f, 0.374540f, 0.351376f, 0.326316f, 0.300687f, 0.275591f, 0.252211f, 0.231900f, 0.215002f, 0.200352f, 0.186616f, 0.173280f, 0.159962f, 0.145930f, 0.130822f, 0.114800f, 0.097728f, 0.079173f, 0.059239f, 0.038296f, 0.016038f, -0.008048f, -0.033506f, -0.059464f, -0.086049f, -0.113882f, -0.142353f, -0.169789f, -0.195294f, -0.218976f, -0.240131f, -0.256716f, -0.267460f, -0.273427f, -0.276291f, -0.275776f, -0.270341f, -0.260230f, -0.247866f, -0.234578f, -0.218792f, -0.198739f, -0.175404f, -0.151105f, -0.126417f, -0.100478f, -0.073625f, -0.047824f, -0.024650f, + -0.004240f, 0.013904f, 0.030088f, 0.044324f, 0.056473f, 0.066662f, 0.075552f, 0.083740f, 0.091164f, 0.097859f, 0.104823f, 0.112999f, 0.121758f, 0.129448f, 0.135168f, 0.139283f, 0.142788f, 0.146790f, 0.151766f, 0.156646f, 0.159449f, 0.159367f, 0.157478f, 0.155349f, 0.153958f, 0.153759f, 0.154479f, 0.154881f, 0.153809f, 0.151277f, 0.147765f, 0.143164f, 0.137159f, 0.129701f, 0.120395f, 0.108503f, 0.094137f, 0.078348f, 0.061862f, 0.044971f, 0.028452f, 0.013082f, -0.001363f, -0.015222f, -0.027814f, -0.038476f, -0.047586f, -0.055404f, -0.061486f, -0.066217f, -0.071000f, -0.076305f, -0.081762f, -0.088199f, -0.096942f, -0.108135f, -0.123108f, -0.145741f, -0.175423f, -0.200807f, -0.208485f, -0.197997f, -0.181833f, -0.171727f} + }, + { + {0.008681f, -0.007006f, 0.004000f, 0.026347f, 0.002760f, -0.038331f, 0.006171f, 0.136506f, 0.198542f, 0.078413f, -0.135945f, -0.262918f, -0.236625f, -0.135691f, -0.048903f, 0.007812f, 0.055850f, 0.104669f, 0.150421f, 0.186943f, 0.205853f, 0.201553f, 0.178803f, 0.147187f, 0.112390f, 0.078987f, 0.053819f, 0.039640f, 0.032313f, 0.029119f, 0.032808f, 0.043807f, 0.055721f, 0.062616f, 0.065392f, 0.068013f, 0.071303f, 0.072155f, 0.066110f, 0.050305f, 0.025937f, -0.002323f, -0.030282f, -0.056406f, -0.080135f, -0.100964f, -0.120011f, -0.139825f, -0.161681f, -0.184845f, -0.208443f, -0.232018f, -0.254562f, -0.274818f, -0.291910f, -0.304396f, -0.309955f, -0.307333f, -0.297155f, -0.279908f, -0.255047f, -0.222884f, -0.185171f, -0.142916f, -0.095718f, -0.043976f, 0.010261f, 0.065148f, 0.119827f, 0.172971f, 0.222331f, 0.265979f, 0.302588f, 0.330642f, 0.348872f, 0.357338f, 0.356806f, 0.347327f, 0.328721f, 0.302266f, 0.270550f, 0.235332f, 0.196512f, 0.153780f, 0.108694f, 0.064148f, 0.021732f, -0.019338f, -0.060114f, -0.099823f, -0.136838f, -0.170677f, -0.201625f, -0.229144f, -0.252213f, -0.270647f, + -0.284574f, -0.293091f, -0.294909f, -0.290009f, -0.279511f, -0.264143f, -0.243706f, -0.217880f, -0.187362f, -0.154731f, -0.123924f, -0.097637f, -0.075158f, -0.053870f, -0.032820f, -0.013784f, 0.000845f, 0.010043f, 0.014447f, 0.015892f, 0.016428f, 0.016909f, 0.016785f, 0.015629f, 0.014101f, 0.013167f, 0.013445f, 0.015591f, 0.020168f, 0.026843f, 0.034697f, 0.043310f, 0.052551f, 0.061637f, 0.069506f, 0.075771f, 0.080384f, 0.082989f, 0.083492f, 0.082527f, 0.080660f, 0.077997f, 0.074980f, 0.072358f, 0.070026f, 0.067161f, 0.063681f, 0.060202f, 0.056641f, 0.052323f, 0.047305f, 0.042095f, 0.036453f, 0.029989f, 0.023331f, 0.017095f, 0.010304f, 0.001573f, -0.008448f, -0.017114f, -0.022058f, -0.022784f, -0.020762f, -0.018652f}, + {-0.008681f, 0.007006f, -0.004000f, -0.026347f, -0.002760f, 0.038331f, -0.006171f, -0.136506f, -0.198542f, -0.078413f, 0.135945f, 0.262918f, 0.236625f, 0.135691f, 0.048903f, -0.007812f, -0.055850f, -0.104669f, -0.150421f, -0.186943f, -0.205853f, -0.201553f, -0.178803f, -0.147187f, -0.112390f, -0.078987f, -0.053819f, -0.039640f, -0.032313f, -0.029119f, -0.032808f, -0.043807f, -0.055721f, -0.062616f, -0.065392f, -0.068013f, -0.071303f, -0.072155f, -0.066110f, -0.050305f, -0.025937f, 0.002323f, 0.030282f, 0.056406f, 0.080135f, 0.100964f, 0.120011f, 0.139825f, 0.161681f, 0.184845f, 0.208443f, 0.232018f, 0.254562f, 0.274818f, 0.291910f, 0.304396f, 0.309955f, 0.307333f, 0.297155f, 0.279908f, 0.255047f, 0.222884f, 0.185171f, 0.142916f, 0.095718f, 0.043976f, -0.010261f, -0.065148f, -0.119827f, -0.172971f, -0.222331f, -0.265979f, -0.302588f, -0.330642f, -0.348872f, -0.357338f, -0.356806f, -0.347327f, -0.328721f, -0.302266f, -0.270550f, -0.235332f, -0.196512f, -0.153780f, -0.108694f, -0.064148f, -0.021732f, 0.019338f, 0.060114f, 0.099823f, 0.136838f, 0.170677f, 0.201625f, 0.229144f, 0.252213f, 0.270647f, + 0.284574f, 0.293091f, 0.294909f, 0.290009f, 0.279511f, 0.264143f, 0.243706f, 0.217880f, 0.187362f, 0.154731f, 0.123924f, 0.097637f, 0.075158f, 0.053870f, 0.032820f, 0.013784f, -0.000845f, -0.010043f, -0.014447f, -0.015892f, -0.016428f, -0.016909f, -0.016785f, -0.015629f, -0.014101f, -0.013167f, -0.013445f, -0.015591f, -0.020168f, -0.026843f, -0.034697f, -0.043310f, -0.052551f, -0.061637f, -0.069506f, -0.075771f, -0.080384f, -0.082989f, -0.083492f, -0.082527f, -0.080660f, -0.077997f, -0.074980f, -0.072358f, -0.070026f, -0.067161f, -0.063681f, -0.060202f, -0.056641f, -0.052323f, -0.047305f, -0.042095f, -0.036453f, -0.029989f, -0.023331f, -0.017095f, -0.010304f, -0.001573f, 0.008448f, 0.017114f, 0.022058f, 0.022784f, 0.020762f, 0.018652f} + }, + { + {0.010401f, 0.011253f, -0.005738f, -0.037817f, -0.058181f, -0.060618f, -0.068188f, -0.079320f, -0.041748f, 0.085251f, 0.260974f, 0.390110f, 0.414471f, 0.352584f, 0.254882f, 0.151981f, 0.053337f, -0.032528f, -0.097690f, -0.144583f, -0.181281f, -0.210195f, -0.228688f, -0.236078f, -0.233043f, -0.217999f, -0.191257f, -0.161169f, -0.139941f, -0.132615f, -0.133470f, -0.133307f, -0.127486f, -0.116641f, -0.102612f, -0.085894f, -0.066281f, -0.044043f, -0.019652f, 0.006743f, 0.034431f, 0.061010f, 0.083425f, 0.100521f, 0.113804f, 0.125411f, 0.136119f, 0.145525f, 0.153189f, 0.158951f, 0.162658f, 0.164140f, 0.163216f, 0.159523f, 0.152636f, 0.142591f, 0.130108f, 0.116292f, 0.102235f, 0.088793f, 0.076467f, 0.065511f, 0.056223f, 0.049044f, 0.044299f, 0.042089f, 0.042633f, 0.046534f, 0.054462f, 0.066587f, 0.082521f, 0.101885f, 0.124801f, 0.151564f, 0.181885f, 0.214821f, 0.249618f, 0.286081f, 0.323727f, 0.361053f, 0.396309f, 0.428665f, 0.457905f, 0.483250f, 0.503314f, 0.517194f, 0.524894f, 0.526702f, 0.522777f, 0.513215f, 0.497742f, 0.475384f, 0.445311f, 0.408344f, 0.367083f, 0.324169f, + 0.280673f, 0.236428f, 0.191872f, 0.149429f, 0.112868f, 0.084975f, 0.065708f, 0.052790f, 0.044161f, 0.039640f, 0.040280f, 0.046572f, 0.057462f, 0.070737f, 0.084014f, 0.095537f, 0.104450f, 0.110574f, 0.114025f, 0.114888f, 0.112953f, 0.107615f, 0.098282f, 0.085047f, 0.068865f, 0.050993f, 0.032402f, 0.013636f, -0.005100f, -0.023831f, -0.042533f, -0.060949f, -0.078915f, -0.096773f, -0.115088f, -0.133965f, -0.152974f, -0.171700f, -0.190072f, -0.208255f, -0.226621f, -0.245729f, -0.265976f, -0.287239f, -0.308946f, -0.330305f, -0.350469f, -0.368845f, -0.385301f, -0.399717f, -0.411580f, -0.420680f, -0.427727f, -0.433416f, -0.437771f, -0.441680f, -0.446803f, -0.450047f, -0.439787f, -0.404903f, -0.350495f, -0.298509f, -0.267685f, -0.257452f}, + {0.010401f, 0.011253f, -0.005738f, -0.037817f, -0.058181f, -0.060618f, -0.068188f, -0.079320f, -0.041748f, 0.085251f, 0.260974f, 0.390110f, 0.414471f, 0.352584f, 0.254882f, 0.151981f, 0.053337f, -0.032528f, -0.097690f, -0.144583f, -0.181281f, -0.210195f, -0.228688f, -0.236078f, -0.233043f, -0.217999f, -0.191257f, -0.161169f, -0.139941f, -0.132615f, -0.133470f, -0.133307f, -0.127486f, -0.116641f, -0.102612f, -0.085894f, -0.066281f, -0.044043f, -0.019652f, 0.006743f, 0.034431f, 0.061010f, 0.083425f, 0.100521f, 0.113804f, 0.125411f, 0.136119f, 0.145525f, 0.153189f, 0.158951f, 0.162658f, 0.164140f, 0.163216f, 0.159523f, 0.152636f, 0.142591f, 0.130108f, 0.116292f, 0.102235f, 0.088793f, 0.076467f, 0.065511f, 0.056223f, 0.049044f, 0.044299f, 0.042089f, 0.042633f, 0.046534f, 0.054462f, 0.066587f, 0.082521f, 0.101885f, 0.124801f, 0.151564f, 0.181885f, 0.214821f, 0.249618f, 0.286081f, 0.323727f, 0.361053f, 0.396309f, 0.428665f, 0.457905f, 0.483250f, 0.503314f, 0.517194f, 0.524894f, 0.526702f, 0.522777f, 0.513215f, 0.497742f, 0.475384f, 0.445311f, 0.408344f, 0.367083f, 0.324169f, + 0.280673f, 0.236428f, 0.191872f, 0.149429f, 0.112868f, 0.084975f, 0.065708f, 0.052790f, 0.044161f, 0.039640f, 0.040280f, 0.046572f, 0.057462f, 0.070737f, 0.084014f, 0.095537f, 0.104450f, 0.110574f, 0.114025f, 0.114888f, 0.112953f, 0.107615f, 0.098282f, 0.085047f, 0.068865f, 0.050993f, 0.032402f, 0.013636f, -0.005100f, -0.023831f, -0.042533f, -0.060949f, -0.078915f, -0.096773f, -0.115088f, -0.133965f, -0.152974f, -0.171700f, -0.190072f, -0.208255f, -0.226621f, -0.245729f, -0.265976f, -0.287239f, -0.308946f, -0.330305f, -0.350469f, -0.368845f, -0.385301f, -0.399717f, -0.411580f, -0.420680f, -0.427727f, -0.433416f, -0.437771f, -0.441680f, -0.446803f, -0.450047f, -0.439787f, -0.404903f, -0.350495f, -0.298509f, -0.267685f, -0.257452f} + }, + { + {0.036665f, -0.035275f, -0.114586f, -0.118718f, -0.015407f, 0.134760f, 0.211391f, 0.139028f, -0.031067f, -0.164438f, -0.178059f, -0.109666f, -0.046695f, -0.024403f, -0.021231f, -0.019183f, -0.020786f, -0.019318f, 0.001305f, 0.033895f, 0.049781f, 0.039580f, 0.025871f, 0.029449f, 0.045676f, 0.061011f, 0.073286f, 0.086158f, 0.096886f, 0.098911f, 0.090055f, 0.073542f, 0.055125f, 0.040281f, 0.029997f, 0.019065f, 0.001405f, -0.023950f, -0.053831f, -0.084724f, -0.113197f, -0.135819f, -0.151486f, -0.161898f, -0.168472f, -0.171078f, -0.170195f, -0.167525f, -0.163981f, -0.159417f, -0.154294f, -0.149463f, -0.144644f, -0.139019f, -0.132677f, -0.125920f, -0.118076f, -0.108431f, -0.097501f, -0.086377f, -0.075686f, -0.065850f, -0.057526f, -0.051345f, -0.047649f, -0.046281f, -0.046306f, -0.046648f, -0.047277f, -0.048699f, -0.050162f, -0.049930f, -0.047471f, -0.043537f, -0.037855f, -0.028614f, -0.014546f, 0.004109f, 0.026848f, 0.053650f, 0.084403f, 0.118539f, 0.154999f, 0.192146f, 0.228589f, 0.264237f, 0.299074f, 0.331034f, 0.357520f, 0.379308f, 0.400066f, 0.421005f, 0.438529f, 0.448405f, 0.450190f, 0.446198f, + 0.437637f, 0.423191f, 0.400965f, 0.371104f, 0.336181f, 0.298645f, 0.258247f, 0.213115f, 0.163286f, 0.111757f, 0.061822f, 0.014570f, -0.030995f, -0.076478f, -0.122515f, -0.167505f, -0.208248f, -0.242655f, -0.271265f, -0.295587f, -0.316112f, -0.332553f, -0.344736f, -0.352592f, -0.356405f, -0.357380f, -0.356859f, -0.355036f, -0.351548f, -0.346820f, -0.341632f, -0.335951f, -0.329211f, -0.320835f, -0.309876f, -0.295618f, -0.279195f, -0.263025f, -0.248221f, -0.234100f, -0.220000f, -0.205518f, -0.189543f, -0.171498f, -0.152987f, -0.136079f, -0.120874f, -0.106575f, -0.093232f, -0.080535f, -0.067000f, -0.052177f, -0.037476f, -0.023661f, -0.010075f, 0.003625f, 0.018537f, 0.038226f, 0.063691f, 0.087121f, 0.097456f, 0.092996f, 0.082823f, 0.076118f}, + {0.036665f, -0.035275f, -0.114586f, -0.118718f, -0.015407f, 0.134760f, 0.211391f, 0.139028f, -0.031067f, -0.164438f, -0.178059f, -0.109666f, -0.046695f, -0.024403f, -0.021231f, -0.019183f, -0.020786f, -0.019318f, 0.001305f, 0.033895f, 0.049781f, 0.039580f, 0.025871f, 0.029449f, 0.045676f, 0.061011f, 0.073286f, 0.086158f, 0.096886f, 0.098911f, 0.090055f, 0.073542f, 0.055125f, 0.040281f, 0.029997f, 0.019065f, 0.001405f, -0.023950f, -0.053831f, -0.084724f, -0.113197f, -0.135819f, -0.151486f, -0.161898f, -0.168472f, -0.171078f, -0.170195f, -0.167525f, -0.163981f, -0.159417f, -0.154294f, -0.149463f, -0.144644f, -0.139019f, -0.132677f, -0.125920f, -0.118076f, -0.108431f, -0.097501f, -0.086377f, -0.075686f, -0.065850f, -0.057526f, -0.051345f, -0.047649f, -0.046281f, -0.046306f, -0.046648f, -0.047277f, -0.048699f, -0.050162f, -0.049930f, -0.047471f, -0.043537f, -0.037855f, -0.028614f, -0.014546f, 0.004109f, 0.026848f, 0.053650f, 0.084403f, 0.118539f, 0.154999f, 0.192146f, 0.228589f, 0.264237f, 0.299074f, 0.331034f, 0.357520f, 0.379308f, 0.400066f, 0.421005f, 0.438529f, 0.448405f, 0.450190f, 0.446198f, + 0.437637f, 0.423191f, 0.400965f, 0.371104f, 0.336181f, 0.298645f, 0.258247f, 0.213115f, 0.163286f, 0.111757f, 0.061822f, 0.014570f, -0.030995f, -0.076478f, -0.122515f, -0.167505f, -0.208248f, -0.242655f, -0.271265f, -0.295587f, -0.316112f, -0.332553f, -0.344736f, -0.352592f, -0.356405f, -0.357380f, -0.356859f, -0.355036f, -0.351548f, -0.346820f, -0.341632f, -0.335951f, -0.329211f, -0.320835f, -0.309876f, -0.295618f, -0.279195f, -0.263025f, -0.248221f, -0.234100f, -0.220000f, -0.205518f, -0.189543f, -0.171498f, -0.152987f, -0.136079f, -0.120874f, -0.106575f, -0.093232f, -0.080535f, -0.067000f, -0.052177f, -0.037476f, -0.023661f, -0.010075f, 0.003625f, 0.018537f, 0.038226f, 0.063691f, 0.087121f, 0.097456f, 0.092996f, 0.082823f, 0.076118f} + }, + { + {-0.008953f, 0.064232f, 0.094587f, 0.004517f, -0.161443f, -0.310666f, -0.382836f, -0.340098f, -0.159090f, 0.119965f, 0.388400f, 0.559679f, 0.635026f, 0.652824f, 0.614612f, 0.501215f, 0.332040f, 0.161390f, 0.022521f, -0.093546f, -0.206716f, -0.319236f, -0.419351f, -0.496904f, -0.550885f, -0.588411f, -0.617946f, -0.641341f, -0.653668f, -0.650802f, -0.633429f, -0.603472f, -0.561247f, -0.507426f, -0.444484f, -0.375202f, -0.301814f, -0.226782f, -0.152889f, -0.082752f, -0.018798f, 0.037516f, 0.087042f, 0.131996f, 0.173092f, 0.208904f, 0.238119f, 0.260931f, 0.278385f, 0.291978f, 0.303791f, 0.315427f, 0.326675f, 0.336106f, 0.342711f, 0.346235f, 0.346522f, 0.343445f, 0.337281f, 0.328630f, 0.318130f, 0.306322f, 0.293494f, 0.279679f, 0.265033f, 0.249931f, 0.234518f, 0.218749f, 0.203017f, 0.188064f, 0.174092f, 0.160740f, 0.148084f, 0.136713f, 0.126662f, 0.117293f, 0.108500f, 0.101106f, 0.095680f, 0.091654f, 0.087922f, 0.083778f, 0.079032f, 0.073611f, 0.067353f, 0.060218f, 0.052743f, 0.046136f, 0.041541f, 0.039159f, 0.038398f, 0.038857f, 0.040687f, 0.043768f, 0.046732f, 0.047020f, + 0.042169f, 0.031387f, 0.015858f, -0.002845f, -0.024544f, -0.050092f, -0.079230f, -0.109526f, -0.137786f, -0.162138f, -0.182539f, -0.199609f, -0.213243f, -0.222324f, -0.225756f, -0.223768f, -0.218019f, -0.210365f, -0.201676f, -0.191803f, -0.180339f, -0.167382f, -0.153889f, -0.141348f, -0.130799f, -0.122005f, -0.113636f, -0.104260f, -0.093244f, -0.081045f, -0.068752f, -0.057146f, -0.046134f, -0.035156f, -0.023843f, -0.012002f, 0.000616f, 0.014000f, 0.027669f, 0.041253f, 0.054871f, 0.068605f, 0.082172f, 0.095499f, 0.108853f, 0.122030f, 0.134208f, 0.144885f, 0.154018f, 0.161135f, 0.165524f, 0.167382f, 0.167449f, 0.165627f, 0.161493f, 0.155562f, 0.147668f, 0.134574f, 0.112712f, 0.084430f, 0.058667f, 0.043534f, 0.039424f, 0.040242f}, + {-0.008953f, 0.064232f, 0.094587f, 0.004517f, -0.161443f, -0.310666f, -0.382836f, -0.340098f, -0.159090f, 0.119965f, 0.388400f, 0.559679f, 0.635026f, 0.652824f, 0.614612f, 0.501215f, 0.332040f, 0.161390f, 0.022521f, -0.093546f, -0.206716f, -0.319236f, -0.419351f, -0.496904f, -0.550885f, -0.588411f, -0.617946f, -0.641341f, -0.653668f, -0.650802f, -0.633429f, -0.603472f, -0.561247f, -0.507426f, -0.444484f, -0.375202f, -0.301814f, -0.226782f, -0.152889f, -0.082752f, -0.018798f, 0.037516f, 0.087042f, 0.131996f, 0.173092f, 0.208904f, 0.238119f, 0.260931f, 0.278385f, 0.291978f, 0.303791f, 0.315427f, 0.326675f, 0.336106f, 0.342711f, 0.346235f, 0.346522f, 0.343445f, 0.337281f, 0.328630f, 0.318130f, 0.306322f, 0.293494f, 0.279679f, 0.265033f, 0.249931f, 0.234518f, 0.218749f, 0.203017f, 0.188064f, 0.174092f, 0.160740f, 0.148084f, 0.136713f, 0.126662f, 0.117293f, 0.108500f, 0.101106f, 0.095680f, 0.091654f, 0.087922f, 0.083778f, 0.079032f, 0.073611f, 0.067353f, 0.060218f, 0.052743f, 0.046136f, 0.041541f, 0.039159f, 0.038398f, 0.038857f, 0.040687f, 0.043768f, 0.046732f, 0.047020f, + 0.042169f, 0.031387f, 0.015858f, -0.002845f, -0.024544f, -0.050092f, -0.079230f, -0.109526f, -0.137786f, -0.162138f, -0.182539f, -0.199609f, -0.213243f, -0.222324f, -0.225756f, -0.223768f, -0.218019f, -0.210365f, -0.201676f, -0.191803f, -0.180339f, -0.167382f, -0.153889f, -0.141348f, -0.130799f, -0.122005f, -0.113636f, -0.104260f, -0.093244f, -0.081045f, -0.068752f, -0.057146f, -0.046134f, -0.035156f, -0.023843f, -0.012002f, 0.000616f, 0.014000f, 0.027669f, 0.041253f, 0.054871f, 0.068605f, 0.082172f, 0.095499f, 0.108853f, 0.122030f, 0.134208f, 0.144885f, 0.154018f, 0.161135f, 0.165524f, 0.167382f, 0.167449f, 0.165627f, 0.161493f, 0.155562f, 0.147668f, 0.134574f, 0.112712f, 0.084430f, 0.058667f, 0.043534f, 0.039424f, 0.040242f} + } +}; +const float CRendBin_HOA2_HRIR_coeff_im_32kHz[9][BINAURAL_CHANNELS][160]={ + { + {-0.279937f, -0.718806f, -0.879425f, -0.777443f, -0.538320f, -0.273976f, -0.025783f, 0.204435f, 0.407063f, 0.556330f, 0.629651f, 0.621025f, 0.539807f, 0.405020f, 0.240268f, 0.067825f, -0.096633f, -0.245120f, -0.374269f, -0.481330f, -0.562584f, -0.615551f, -0.642416f, -0.649519f, -0.642111f, -0.620732f, -0.584007f, -0.533693f, -0.475001f, -0.412795f, -0.349591f, -0.286993f, -0.226903f, -0.170652f, -0.118251f, -0.069223f, -0.023545f, 0.018667f, 0.057892f, 0.095208f, 0.131668f, 0.167761f, 0.203372f, 0.238124f, 0.271732f, 0.304055f, 0.334993f, 0.364479f, 0.392521f, 0.419068f, 0.443884f, 0.466673f, 0.487320f, 0.505877f, 0.522377f, 0.536834f, 0.549468f, 0.560746f, 0.571072f, 0.580544f, 0.589150f, 0.597030f, 0.604353f, 0.611043f, 0.616937f, 0.622138f, 0.626912f, 0.631307f, 0.635234f, 0.638853f, 0.642459f, 0.646040f, 0.649387f, 0.652562f, 0.655777f, 0.658908f, 0.661640f, 0.664015f, 0.666294f, 0.668275f, 0.669360f, 0.669333f, 0.668569f, 0.667339f, 0.665357f, 0.662247f, 0.658157f, 0.653645f, 0.649002f, 0.643858f, 0.637637f, 0.630346f, 0.622683f, 0.615246f, 0.607937f, 0.600397f, + 0.592808f, 0.585902f, 0.580266f, 0.575856f, 0.572174f, 0.568794f, 0.565750f, 0.563397f, 0.561829f, 0.560549f, 0.558858f, 0.556454f, 0.553437f, 0.549923f, 0.545870f, 0.541143f, 0.535568f, 0.529029f, 0.521642f, 0.513706f, 0.505466f, 0.497055f, 0.488604f, 0.480183f, 0.471722f, 0.463177f, 0.454619f, 0.446034f, 0.437240f, 0.428157f, 0.418884f, 0.409461f, 0.399865f, 0.390252f, 0.380863f, 0.371747f, 0.362849f, 0.354203f, 0.345760f, 0.337306f, 0.328769f, 0.320260f, 0.311738f, 0.303082f, 0.294401f, 0.285697f, 0.276522f, 0.266569f, 0.256016f, 0.244725f, 0.232076f, 0.218041f, 0.202877f, 0.185600f, 0.164906f, 0.140260f, 0.107084f, 0.053389f, -0.026623f, -0.111560f, -0.159294f, -0.146202f, -0.091208f, -0.029119f}, + {-0.279937f, -0.718806f, -0.879425f, -0.777443f, -0.538320f, -0.273976f, -0.025783f, 0.204435f, 0.407063f, 0.556330f, 0.629651f, 0.621025f, 0.539807f, 0.405020f, 0.240268f, 0.067825f, -0.096633f, -0.245120f, -0.374269f, -0.481330f, -0.562584f, -0.615551f, -0.642416f, -0.649519f, -0.642111f, -0.620732f, -0.584007f, -0.533693f, -0.475001f, -0.412795f, -0.349591f, -0.286993f, -0.226903f, -0.170652f, -0.118251f, -0.069223f, -0.023545f, 0.018667f, 0.057892f, 0.095208f, 0.131668f, 0.167761f, 0.203372f, 0.238124f, 0.271732f, 0.304055f, 0.334993f, 0.364479f, 0.392521f, 0.419068f, 0.443884f, 0.466673f, 0.487320f, 0.505877f, 0.522377f, 0.536834f, 0.549468f, 0.560746f, 0.571072f, 0.580544f, 0.589150f, 0.597030f, 0.604353f, 0.611043f, 0.616937f, 0.622138f, 0.626912f, 0.631307f, 0.635234f, 0.638853f, 0.642459f, 0.646040f, 0.649387f, 0.652562f, 0.655777f, 0.658908f, 0.661640f, 0.664015f, 0.666294f, 0.668275f, 0.669360f, 0.669333f, 0.668569f, 0.667339f, 0.665357f, 0.662247f, 0.658157f, 0.653645f, 0.649002f, 0.643858f, 0.637637f, 0.630346f, 0.622683f, 0.615246f, 0.607937f, 0.600397f, + 0.592808f, 0.585902f, 0.580266f, 0.575856f, 0.572174f, 0.568794f, 0.565750f, 0.563397f, 0.561829f, 0.560549f, 0.558858f, 0.556454f, 0.553437f, 0.549923f, 0.545870f, 0.541143f, 0.535568f, 0.529029f, 0.521642f, 0.513706f, 0.505466f, 0.497055f, 0.488604f, 0.480183f, 0.471722f, 0.463177f, 0.454619f, 0.446034f, 0.437240f, 0.428157f, 0.418884f, 0.409461f, 0.399865f, 0.390252f, 0.380863f, 0.371747f, 0.362849f, 0.354203f, 0.345760f, 0.337306f, 0.328769f, 0.320260f, 0.311738f, 0.303082f, 0.294401f, 0.285697f, 0.276522f, 0.266569f, 0.256016f, 0.244725f, 0.232076f, 0.218041f, 0.202877f, 0.185600f, 0.164906f, 0.140260f, 0.107084f, 0.053389f, -0.026623f, -0.111560f, -0.159294f, -0.146202f, -0.091208f, -0.029119f} + }, + { + {0.137655f, 0.231573f, -0.061569f, -0.615380f, -1.083201f, -1.179039f, -0.870305f, -0.339584f, 0.195943f, 0.617719f, 0.906453f, 1.076009f, 1.134598f, 1.089734f, 0.958490f, 0.762775f, 0.522469f, 0.257386f, -0.009275f, -0.255153f, -0.467276f, -0.644940f, -0.793225f, -0.914050f, -1.004432f, -1.062573f, -1.092628f, -1.102031f, -1.096136f, -1.077334f, -1.047589f, -1.009280f, -0.964133f, -0.913278f, -0.858195f, -0.800334f, -0.740087f, -0.677018f, -0.610805f, -0.541506f, -0.469560f, -0.396052f, -0.322485f, -0.249955f, -0.178885f, -0.109588f, -0.042559f, 0.021688f, 0.082623f, 0.139743f, 0.193113f, 0.243630f, 0.292304f, 0.339419f, 0.384570f, 0.427151f, 0.466585f, 0.502409f, 0.534395f, 0.562517f, 0.586922f, 0.607994f, 0.626173f, 0.641582f, 0.654228f, 0.664541f, 0.673117f, 0.679999f, 0.684972f, 0.688494f, 0.691429f, 0.694010f, 0.696123f, 0.698431f, 0.702002f, 0.706919f, 0.712502f, 0.718834f, 0.726783f, 0.736462f, 0.746890f, 0.757392f, 0.768323f, 0.780141f, 0.792495f, 0.804563f, 0.815877f, 0.826652f, 0.837457f, 0.848656f, 0.860155f, 0.871670f, 0.883000f, 0.893877f, 0.903812f, 0.912257f, + 0.918585f, 0.921831f, 0.920971f, 0.915668f, 0.906299f, 0.893208f, 0.876460f, 0.856357f, 0.833641f, 0.809154f, 0.783725f, 0.758238f, 0.733466f, 0.710044f, 0.688800f, 0.670590f, 0.655493f, 0.642657f, 0.631241f, 0.621055f, 0.612285f, 0.605091f, 0.599433f, 0.594697f, 0.589631f, 0.583188f, 0.575258f, 0.566315f, 0.556840f, 0.547295f, 0.537964f, 0.528587f, 0.518763f, 0.508660f, 0.498613f, 0.488388f, 0.477700f, 0.466959f, 0.456614f, 0.446483f, 0.436467f, 0.426959f, 0.417879f, 0.408578f, 0.399091f, 0.390055f, 0.381339f, 0.372396f, 0.363526f, 0.354887f, 0.345302f, 0.333890f, 0.320994f, 0.305859f, 0.286532f, 0.262266f, 0.228831f, 0.171282f, 0.076774f, -0.036269f, -0.117427f, -0.129893f, -0.087208f, -0.028616f}, + {-0.137655f, -0.231573f, 0.061569f, 0.615380f, 1.083201f, 1.179039f, 0.870305f, 0.339584f, -0.195943f, -0.617719f, -0.906453f, -1.076009f, -1.134598f, -1.089734f, -0.958490f, -0.762775f, -0.522469f, -0.257386f, 0.009275f, 0.255153f, 0.467276f, 0.644940f, 0.793225f, 0.914050f, 1.004432f, 1.062573f, 1.092628f, 1.102031f, 1.096136f, 1.077334f, 1.047589f, 1.009280f, 0.964133f, 0.913278f, 0.858195f, 0.800334f, 0.740087f, 0.677018f, 0.610805f, 0.541506f, 0.469560f, 0.396052f, 0.322485f, 0.249955f, 0.178885f, 0.109588f, 0.042559f, -0.021688f, -0.082623f, -0.139743f, -0.193113f, -0.243630f, -0.292304f, -0.339419f, -0.384570f, -0.427151f, -0.466585f, -0.502409f, -0.534395f, -0.562517f, -0.586922f, -0.607994f, -0.626173f, -0.641582f, -0.654228f, -0.664541f, -0.673117f, -0.679999f, -0.684972f, -0.688494f, -0.691429f, -0.694010f, -0.696123f, -0.698431f, -0.702002f, -0.706919f, -0.712502f, -0.718834f, -0.726783f, -0.736462f, -0.746890f, -0.757392f, -0.768323f, -0.780141f, -0.792495f, -0.804563f, -0.815877f, -0.826652f, -0.837457f, -0.848656f, -0.860155f, -0.871670f, -0.883000f, -0.893877f, -0.903812f, -0.912257f, + -0.918585f, -0.921831f, -0.920971f, -0.915668f, -0.906299f, -0.893208f, -0.876460f, -0.856357f, -0.833641f, -0.809154f, -0.783725f, -0.758238f, -0.733466f, -0.710044f, -0.688800f, -0.670590f, -0.655493f, -0.642657f, -0.631241f, -0.621055f, -0.612285f, -0.605091f, -0.599433f, -0.594697f, -0.589631f, -0.583188f, -0.575258f, -0.566315f, -0.556840f, -0.547295f, -0.537964f, -0.528587f, -0.518763f, -0.508660f, -0.498613f, -0.488388f, -0.477700f, -0.466959f, -0.456614f, -0.446483f, -0.436467f, -0.426959f, -0.417879f, -0.408578f, -0.399091f, -0.390055f, -0.381339f, -0.372396f, -0.363526f, -0.354887f, -0.345302f, -0.333890f, -0.320994f, -0.305859f, -0.286532f, -0.262266f, -0.228831f, -0.171282f, -0.076774f, 0.036269f, 0.117427f, 0.129893f, 0.087208f, 0.028616f} + }, + { + {-0.037524f, -0.106181f, -0.132266f, -0.073112f, 0.041237f, 0.111128f, 0.077796f, -0.013186f, -0.077825f, -0.080256f, -0.035434f, 0.029096f, 0.084053f, 0.103004f, 0.086859f, 0.066675f, 0.063076f, 0.059663f, 0.031095f, -0.020998f, -0.075878f, -0.121299f, -0.156113f, -0.176326f, -0.175820f, -0.157975f, -0.135214f, -0.116812f, -0.102238f, -0.085453f, -0.062353f, -0.034609f, -0.008002f, 0.012488f, 0.025194f, 0.029679f, 0.025216f, 0.013215f, -0.001254f, -0.012755f, -0.019093f, -0.020474f, -0.016980f, -0.008454f, 0.004498f, 0.020843f, 0.039938f, 0.061615f, 0.086231f, 0.114761f, 0.147970f, 0.185336f, 0.225373f, 0.266858f, 0.309124f, 0.351354f, 0.392341f, 0.431045f, 0.466945f, 0.499672f, 0.528530f, 0.552586f, 0.571112f, 0.583575f, 0.589158f, 0.586750f, 0.575666f, 0.555960f, 0.527818f, 0.491213f, 0.446493f, 0.394762f, 0.337410f, 0.276002f, 0.212771f, 0.150186f, 0.089707f, 0.032067f, -0.021005f, -0.066929f, -0.104805f, -0.136170f, -0.162127f, -0.181305f, -0.192276f, -0.196759f, -0.198297f, -0.198100f, -0.194244f, -0.185310f, -0.173099f, -0.160874f, -0.150052f, -0.139737f, -0.128898f, -0.117875f, + -0.107875f, -0.099948f, -0.094668f, -0.092141f, -0.091897f, -0.093057f, -0.095016f, -0.098057f, -0.103137f, -0.110818f, -0.120204f, -0.129091f, -0.135491f, -0.139004f, -0.140529f, -0.140823f, -0.139694f, -0.136376f, -0.130141f, -0.120557f, -0.107620f, -0.091821f, -0.073930f, -0.054741f, -0.035051f, -0.015600f, 0.003138f, 0.020870f, 0.037083f, 0.051025f, 0.062165f, 0.070424f, 0.075956f, 0.078959f, 0.079669f, 0.078304f, 0.075176f, 0.071037f, 0.067021f, 0.064014f, 0.062283f, 0.061670f, 0.061603f, 0.060906f, 0.058404f, 0.053985f, 0.048455f, 0.042281f, 0.035195f, 0.027085f, 0.018350f, 0.009174f, -0.000669f, -0.010994f, -0.021132f, -0.031283f, -0.043062f, -0.057197f, -0.070252f, -0.074970f, -0.065974f, -0.045809f, -0.023709f, -0.006772f}, + {-0.037524f, -0.106181f, -0.132266f, -0.073112f, 0.041237f, 0.111128f, 0.077796f, -0.013186f, -0.077825f, -0.080256f, -0.035434f, 0.029096f, 0.084053f, 0.103004f, 0.086859f, 0.066675f, 0.063076f, 0.059663f, 0.031095f, -0.020998f, -0.075878f, -0.121299f, -0.156113f, -0.176326f, -0.175820f, -0.157975f, -0.135214f, -0.116812f, -0.102238f, -0.085453f, -0.062353f, -0.034609f, -0.008002f, 0.012488f, 0.025194f, 0.029679f, 0.025216f, 0.013215f, -0.001254f, -0.012755f, -0.019093f, -0.020474f, -0.016980f, -0.008454f, 0.004498f, 0.020843f, 0.039938f, 0.061615f, 0.086231f, 0.114761f, 0.147970f, 0.185336f, 0.225373f, 0.266858f, 0.309124f, 0.351354f, 0.392341f, 0.431045f, 0.466945f, 0.499672f, 0.528530f, 0.552586f, 0.571112f, 0.583575f, 0.589158f, 0.586750f, 0.575666f, 0.555960f, 0.527818f, 0.491213f, 0.446493f, 0.394762f, 0.337410f, 0.276002f, 0.212771f, 0.150186f, 0.089707f, 0.032067f, -0.021005f, -0.066929f, -0.104805f, -0.136170f, -0.162127f, -0.181305f, -0.192276f, -0.196759f, -0.198297f, -0.198100f, -0.194244f, -0.185310f, -0.173099f, -0.160874f, -0.150052f, -0.139737f, -0.128898f, -0.117875f, + -0.107875f, -0.099948f, -0.094668f, -0.092141f, -0.091897f, -0.093057f, -0.095016f, -0.098057f, -0.103137f, -0.110818f, -0.120204f, -0.129091f, -0.135491f, -0.139004f, -0.140529f, -0.140823f, -0.139694f, -0.136376f, -0.130141f, -0.120557f, -0.107620f, -0.091821f, -0.073930f, -0.054741f, -0.035051f, -0.015600f, 0.003138f, 0.020870f, 0.037083f, 0.051025f, 0.062165f, 0.070424f, 0.075956f, 0.078959f, 0.079669f, 0.078304f, 0.075176f, 0.071037f, 0.067021f, 0.064014f, 0.062283f, 0.061670f, 0.061603f, 0.060906f, 0.058404f, 0.053985f, 0.048455f, 0.042281f, 0.035195f, 0.027085f, 0.018350f, 0.009174f, -0.000669f, -0.010994f, -0.021132f, -0.031283f, -0.043062f, -0.057197f, -0.070252f, -0.074970f, -0.065974f, -0.045809f, -0.023709f, -0.006772f} + }, + { + {-0.001333f, -0.030005f, -0.089178f, -0.116179f, -0.070558f, 0.001241f, 0.020913f, -0.026250f, -0.080759f, -0.081475f, -0.022314f, 0.058682f, 0.122300f, 0.154634f, 0.165876f, 0.172510f, 0.178315f, 0.170686f, 0.135671f, 0.073168f, -0.004954f, -0.086261f, -0.162235f, -0.226658f, -0.277864f, -0.321652f, -0.365340f, -0.408241f, -0.442359f, -0.462069f, -0.468153f, -0.461999f, -0.441233f, -0.403541f, -0.351250f, -0.289395f, -0.221463f, -0.149435f, -0.076464f, -0.006943f, 0.055954f, 0.111395f, 0.159755f, 0.201416f, 0.236781f, 0.266704f, 0.292410f, 0.314773f, 0.333620f, 0.347895f, 0.356616f, 0.359633f, 0.357762f, 0.352831f, 0.347475f, 0.343968f, 0.342881f, 0.343312f, 0.344262f, 0.345108f, 0.345073f, 0.343446f, 0.340377f, 0.336539f, 0.332107f, 0.326988f, 0.321660f, 0.316556f, 0.310916f, 0.303524f, 0.294315f, 0.283862f, 0.271573f, 0.256019f, 0.236997f, 0.215638f, 0.192339f, 0.166339f, 0.137841f, 0.108908f, 0.081311f, 0.054840f, 0.028956f, 0.004999f, -0.014887f, -0.030518f, -0.043751f, -0.055909f, -0.066672f, -0.075704f, -0.083627f, -0.090643f, -0.095550f, -0.097168f, -0.095719f, -0.091778f, + -0.084700f, -0.073230f, -0.057268f, -0.038056f, -0.016721f, 0.006768f, 0.033168f, 0.062626f, 0.093687f, 0.123868f, 0.151635f, 0.177592f, 0.203260f, 0.228881f, 0.252880f, 0.273234f, 0.289066f, 0.301335f, 0.312237f, 0.323412f, 0.334360f, 0.342975f, 0.347732f, 0.349006f, 0.348534f, 0.348309f, 0.349721f, 0.352813f, 0.356335f, 0.359060f, 0.360956f, 0.362759f, 0.364992f, 0.367821f, 0.371174f, 0.374427f, 0.376493f, 0.376627f, 0.374696f, 0.370693f, 0.364611f, 0.356723f, 0.347263f, 0.336013f, 0.322697f, 0.307449f, 0.290502f, 0.272009f, 0.252471f, 0.232612f, 0.212802f, 0.193266f, 0.174453f, 0.156397f, 0.138549f, 0.120439f, 0.099951f, 0.070805f, 0.027885f, -0.020982f, -0.054876f, -0.058831f, -0.039154f, -0.012828f}, + {-0.001333f, -0.030005f, -0.089178f, -0.116179f, -0.070558f, 0.001241f, 0.020913f, -0.026250f, -0.080759f, -0.081475f, -0.022314f, 0.058682f, 0.122300f, 0.154634f, 0.165876f, 0.172510f, 0.178315f, 0.170686f, 0.135671f, 0.073168f, -0.004954f, -0.086261f, -0.162235f, -0.226658f, -0.277864f, -0.321652f, -0.365340f, -0.408241f, -0.442359f, -0.462069f, -0.468153f, -0.461999f, -0.441233f, -0.403541f, -0.351250f, -0.289395f, -0.221463f, -0.149435f, -0.076464f, -0.006943f, 0.055954f, 0.111395f, 0.159755f, 0.201416f, 0.236781f, 0.266704f, 0.292410f, 0.314773f, 0.333620f, 0.347895f, 0.356616f, 0.359633f, 0.357762f, 0.352831f, 0.347475f, 0.343968f, 0.342881f, 0.343312f, 0.344262f, 0.345108f, 0.345073f, 0.343446f, 0.340377f, 0.336539f, 0.332107f, 0.326988f, 0.321660f, 0.316556f, 0.310916f, 0.303524f, 0.294315f, 0.283862f, 0.271573f, 0.256019f, 0.236997f, 0.215638f, 0.192339f, 0.166339f, 0.137841f, 0.108908f, 0.081311f, 0.054840f, 0.028956f, 0.004999f, -0.014887f, -0.030518f, -0.043751f, -0.055909f, -0.066672f, -0.075704f, -0.083627f, -0.090643f, -0.095550f, -0.097168f, -0.095719f, -0.091778f, + -0.084700f, -0.073230f, -0.057268f, -0.038056f, -0.016721f, 0.006768f, 0.033168f, 0.062626f, 0.093687f, 0.123868f, 0.151635f, 0.177592f, 0.203260f, 0.228881f, 0.252880f, 0.273234f, 0.289066f, 0.301335f, 0.312237f, 0.323412f, 0.334360f, 0.342975f, 0.347732f, 0.349006f, 0.348534f, 0.348309f, 0.349721f, 0.352813f, 0.356335f, 0.359060f, 0.360956f, 0.362759f, 0.364992f, 0.367821f, 0.371174f, 0.374427f, 0.376493f, 0.376627f, 0.374696f, 0.370693f, 0.364611f, 0.356723f, 0.347263f, 0.336013f, 0.322697f, 0.307449f, 0.290502f, 0.272009f, 0.252471f, 0.232612f, 0.212802f, 0.193266f, 0.174453f, 0.156397f, 0.138549f, 0.120439f, 0.099951f, 0.070805f, 0.027885f, -0.020982f, -0.054876f, -0.058831f, -0.039154f, -0.012828f} + }, + { + {-0.003949f, -0.004065f, 0.004529f, 0.003058f, -0.017910f, -0.041346f, -0.049210f, -0.053546f, -0.080846f, -0.125171f, -0.138752f, -0.082301f, 0.027313f, 0.134102f, 0.200608f, 0.233142f, 0.253660f, 0.266920f, 0.262970f, 0.237188f, 0.194063f, 0.136745f, 0.064986f, -0.017247f, -0.101044f, -0.180693f, -0.256442f, -0.328205f, -0.391843f, -0.443152f, -0.481210f, -0.506165f, -0.517126f, -0.513522f, -0.495538f, -0.462242f, -0.412470f, -0.349030f, -0.279619f, -0.212173f, -0.150791f, -0.096336f, -0.048496f, -0.006238f, 0.031944f, 0.067046f, 0.099419f, 0.129417f, 0.157110f, 0.181639f, 0.201899f, 0.217571f, 0.228864f, 0.236108f, 0.240440f, 0.243939f, 0.248173f, 0.253310f, 0.259111f, 0.265714f, 0.273010f, 0.280389f, 0.287541f, 0.294554f, 0.301097f, 0.306552f, 0.310894f, 0.314304f, 0.316123f, 0.315383f, 0.312099f, 0.306725f, 0.298589f, 0.286282f, 0.269490f, 0.249062f, 0.225223f, 0.197242f, 0.165404f, 0.131961f, 0.099076f, 0.066683f, 0.033703f, 0.000877f, -0.029410f, -0.056340f, -0.081745f, -0.106984f, -0.130473f, -0.149782f, -0.164778f, -0.176837f, -0.185968f, -0.190743f, -0.190692f, -0.187082f, + -0.181465f, -0.174611f, -0.166752f, -0.158044f, -0.148865f, -0.139889f, -0.131570f, -0.123691f, -0.116025f, -0.109038f, -0.102988f, -0.096774f, -0.088859f, -0.079067f, -0.068595f, -0.058652f, -0.049731f, -0.041459f, -0.032502f, -0.021490f, -0.008698f, 0.003957f, 0.014879f, 0.023943f, 0.031863f, 0.039641f, 0.048517f, 0.059156f, 0.070934f, 0.082892f, 0.094921f, 0.107290f, 0.119849f, 0.132466f, 0.145202f, 0.157413f, 0.167770f, 0.175597f, 0.181049f, 0.184050f, 0.184444f, 0.182904f, 0.180196f, 0.176079f, 0.170279f, 0.163603f, 0.156847f, 0.149956f, 0.143323f, 0.138140f, 0.134607f, 0.131865f, 0.130015f, 0.129755f, 0.130428f, 0.131261f, 0.132652f, 0.131757f, 0.119661f, 0.090367f, 0.051746f, 0.020184f, 0.004349f, 0.000237f}, + {0.003949f, 0.004065f, -0.004529f, -0.003058f, 0.017910f, 0.041346f, 0.049210f, 0.053546f, 0.080846f, 0.125171f, 0.138752f, 0.082301f, -0.027313f, -0.134102f, -0.200608f, -0.233142f, -0.253660f, -0.266920f, -0.262970f, -0.237188f, -0.194063f, -0.136745f, -0.064986f, 0.017247f, 0.101044f, 0.180693f, 0.256442f, 0.328205f, 0.391843f, 0.443152f, 0.481210f, 0.506165f, 0.517126f, 0.513522f, 0.495538f, 0.462242f, 0.412470f, 0.349030f, 0.279619f, 0.212173f, 0.150791f, 0.096336f, 0.048496f, 0.006238f, -0.031944f, -0.067046f, -0.099419f, -0.129417f, -0.157110f, -0.181639f, -0.201899f, -0.217571f, -0.228864f, -0.236108f, -0.240440f, -0.243939f, -0.248173f, -0.253310f, -0.259111f, -0.265714f, -0.273010f, -0.280389f, -0.287541f, -0.294554f, -0.301097f, -0.306552f, -0.310894f, -0.314304f, -0.316123f, -0.315383f, -0.312099f, -0.306725f, -0.298589f, -0.286282f, -0.269490f, -0.249062f, -0.225223f, -0.197242f, -0.165404f, -0.131961f, -0.099076f, -0.066683f, -0.033703f, -0.000877f, 0.029410f, 0.056340f, 0.081745f, 0.106984f, 0.130473f, 0.149782f, 0.164778f, 0.176837f, 0.185968f, 0.190743f, 0.190692f, 0.187082f, + 0.181465f, 0.174611f, 0.166752f, 0.158044f, 0.148865f, 0.139889f, 0.131570f, 0.123691f, 0.116025f, 0.109038f, 0.102988f, 0.096774f, 0.088859f, 0.079067f, 0.068595f, 0.058652f, 0.049731f, 0.041459f, 0.032502f, 0.021490f, 0.008698f, -0.003957f, -0.014879f, -0.023943f, -0.031863f, -0.039641f, -0.048517f, -0.059156f, -0.070934f, -0.082892f, -0.094921f, -0.107290f, -0.119849f, -0.132466f, -0.145202f, -0.157413f, -0.167770f, -0.175597f, -0.181049f, -0.184050f, -0.184444f, -0.182904f, -0.180196f, -0.176079f, -0.170279f, -0.163603f, -0.156847f, -0.149956f, -0.143323f, -0.138140f, -0.134607f, -0.131865f, -0.130015f, -0.129755f, -0.130428f, -0.131261f, -0.132652f, -0.131757f, -0.119661f, -0.090367f, -0.051746f, -0.020184f, -0.004349f, -0.000237f} + }, + { + {-0.006838f, -0.000073f, 0.019569f, 0.004812f, -0.021179f, 0.017001f, 0.095357f, 0.079254f, -0.080727f, -0.242975f, -0.239933f, -0.079038f, 0.094027f, 0.179068f, 0.192210f, 0.186347f, 0.179576f, 0.164512f, 0.135604f, 0.091894f, 0.036418f, -0.019928f, -0.065074f, -0.095268f, -0.111552f, -0.113737f, -0.104494f, -0.091666f, -0.080317f, -0.069042f, -0.057974f, -0.052882f, -0.057423f, -0.067725f, -0.078296f, -0.088767f, -0.102514f, -0.121895f, -0.145878f, -0.170008f, -0.188674f, -0.199029f, -0.202203f, -0.200419f, -0.195060f, -0.187856f, -0.180908f, -0.174383f, -0.166293f, -0.154984f, -0.140002f, -0.120815f, -0.096730f, -0.067714f, -0.033820f, 0.005223f, 0.048523f, 0.093540f, 0.138202f, 0.181886f, 0.223555f, 0.261046f, 0.293122f, 0.320062f, 0.341424f, 0.355281f, 0.360314f, 0.356691f, 0.344454f, 0.322937f, 0.292135f, 0.253115f, 0.207016f, 0.155091f, 0.099534f, 0.042831f, -0.013572f, -0.068750f, -0.120804f, -0.167303f, -0.207256f, -0.241508f, -0.270731f, -0.293815f, -0.309031f, -0.316475f, -0.318315f, -0.316263f, -0.309841f, -0.297894f, -0.280743f, -0.259596f, -0.234760f, -0.205963f, -0.173776f, -0.139211f, + -0.102436f, -0.063409f, -0.023388f, 0.015541f, 0.052145f, 0.086261f, 0.117562f, 0.144705f, 0.165452f, 0.177810f, 0.181963f, 0.180989f, 0.178411f, 0.174952f, 0.168699f, 0.158230f, 0.144450f, 0.129742f, 0.116497f, 0.106152f, 0.098556f, 0.092438f, 0.087095f, 0.083117f, 0.081219f, 0.081325f, 0.083051f, 0.085959f, 0.089030f, 0.090997f, 0.091374f, 0.090241f, 0.087241f, 0.081872f, 0.074446f, 0.065721f, 0.056063f, 0.045844f, 0.035939f, 0.026995f, 0.018956f, 0.011839f, 0.005924f, 0.000823f, -0.004378f, -0.009757f, -0.014627f, -0.018984f, -0.023457f, -0.027936f, -0.031769f, -0.035015f, -0.038036f, -0.040342f, -0.041399f, -0.041932f, -0.042717f, -0.042585f, -0.039224f, -0.031819f, -0.021956f, -0.012357f, -0.005285f, -0.001296f}, + {0.006838f, 0.000073f, -0.019569f, -0.004812f, 0.021179f, -0.017001f, -0.095357f, -0.079254f, 0.080727f, 0.242975f, 0.239933f, 0.079038f, -0.094027f, -0.179068f, -0.192210f, -0.186347f, -0.179576f, -0.164512f, -0.135604f, -0.091894f, -0.036418f, 0.019928f, 0.065074f, 0.095268f, 0.111552f, 0.113737f, 0.104494f, 0.091666f, 0.080317f, 0.069042f, 0.057974f, 0.052882f, 0.057423f, 0.067725f, 0.078296f, 0.088767f, 0.102514f, 0.121895f, 0.145878f, 0.170008f, 0.188674f, 0.199029f, 0.202203f, 0.200419f, 0.195060f, 0.187856f, 0.180908f, 0.174383f, 0.166293f, 0.154984f, 0.140002f, 0.120815f, 0.096730f, 0.067714f, 0.033820f, -0.005223f, -0.048523f, -0.093540f, -0.138202f, -0.181886f, -0.223555f, -0.261046f, -0.293122f, -0.320062f, -0.341424f, -0.355281f, -0.360314f, -0.356691f, -0.344454f, -0.322937f, -0.292135f, -0.253115f, -0.207016f, -0.155091f, -0.099534f, -0.042831f, 0.013572f, 0.068750f, 0.120804f, 0.167303f, 0.207256f, 0.241508f, 0.270731f, 0.293815f, 0.309031f, 0.316475f, 0.318315f, 0.316263f, 0.309841f, 0.297894f, 0.280743f, 0.259596f, 0.234760f, 0.205963f, 0.173776f, 0.139211f, + 0.102436f, 0.063409f, 0.023388f, -0.015541f, -0.052145f, -0.086261f, -0.117562f, -0.144705f, -0.165452f, -0.177810f, -0.181963f, -0.180989f, -0.178411f, -0.174952f, -0.168699f, -0.158230f, -0.144450f, -0.129742f, -0.116497f, -0.106152f, -0.098556f, -0.092438f, -0.087095f, -0.083117f, -0.081219f, -0.081325f, -0.083051f, -0.085959f, -0.089030f, -0.090997f, -0.091374f, -0.090241f, -0.087241f, -0.081872f, -0.074446f, -0.065721f, -0.056063f, -0.045844f, -0.035939f, -0.026995f, -0.018956f, -0.011839f, -0.005924f, -0.000823f, 0.004378f, 0.009757f, 0.014627f, 0.018984f, 0.023457f, 0.027936f, 0.031769f, 0.035015f, 0.038036f, 0.040342f, 0.041399f, 0.041932f, 0.042717f, 0.042585f, 0.039224f, 0.031819f, 0.021956f, 0.012357f, 0.005285f, 0.001296f} + }, + { + {-0.001268f, -0.011623f, -0.025773f, -0.019189f, 0.011057f, 0.041023f, 0.068146f, 0.125696f, 0.222407f, 0.296789f, 0.269284f, 0.131113f, -0.047610f, -0.192572f, -0.280508f, -0.323423f, -0.332386f, -0.312852f, -0.276029f, -0.234862f, -0.192992f, -0.147490f, -0.098453f, -0.049129f, -0.001158f, 0.043170f, 0.076863f, 0.093414f, 0.095853f, 0.095899f, 0.103483f, 0.119683f, 0.139635f, 0.159125f, 0.177059f, 0.193595f, 0.208271f, 0.220249f, 0.229045f, 0.234009f, 0.233700f, 0.227053f, 0.215289f, 0.201603f, 0.188525f, 0.176263f, 0.163748f, 0.150359f, 0.136192f, 0.121455f, 0.106303f, 0.090949f, 0.075597f, 0.060536f, 0.046491f, 0.034613f, 0.025962f, 0.021084f, 0.020003f, 0.022378f, 0.027742f, 0.035774f, 0.046332f, 0.059186f, 0.073920f, 0.090220f, 0.108028f, 0.127179f, 0.146973f, 0.166342f, 0.184471f, 0.201087f, 0.215996f, 0.228448f, 0.237272f, 0.241711f, 0.241663f, 0.236858f, 0.226335f, 0.209312f, 0.186169f, 0.157898f, 0.124884f, 0.087019f, 0.044857f, -0.000171f, -0.046674f, -0.093813f, -0.141018f, -0.187871f, -0.234164f, -0.279203f, -0.320929f, -0.356487f, -0.384099f, -0.404029f, + -0.417450f, -0.424542f, -0.423967f, -0.414337f, -0.396303f, -0.373146f, -0.348990f, -0.326237f, -0.304833f, -0.283944f, -0.263944f, -0.246725f, -0.234478f, -0.228461f, -0.228593f, -0.233819f, -0.242777f, -0.254337f, -0.267790f, -0.282812f, -0.299281f, -0.316843f, -0.334511f, -0.350840f, -0.364685f, -0.375697f, -0.384143f, -0.390499f, -0.395225f, -0.398596f, -0.400645f, -0.401464f, -0.401489f, -0.401163f, -0.400362f, -0.398530f, -0.395360f, -0.391048f, -0.385958f, -0.380382f, -0.374495f, -0.368144f, -0.360693f, -0.351302f, -0.339340f, -0.324513f, -0.306932f, -0.287105f, -0.265519f, -0.242294f, -0.217711f, -0.192689f, -0.167920f, -0.143119f, -0.118052f, -0.092771f, -0.064621f, -0.027534f, 0.019774f, 0.064488f, 0.085852f, 0.075236f, 0.045270f, 0.014113f}, + {-0.001268f, -0.011623f, -0.025773f, -0.019189f, 0.011057f, 0.041023f, 0.068146f, 0.125696f, 0.222407f, 0.296789f, 0.269284f, 0.131113f, -0.047610f, -0.192572f, -0.280508f, -0.323423f, -0.332386f, -0.312852f, -0.276029f, -0.234862f, -0.192992f, -0.147490f, -0.098453f, -0.049129f, -0.001158f, 0.043170f, 0.076863f, 0.093414f, 0.095853f, 0.095899f, 0.103483f, 0.119683f, 0.139635f, 0.159125f, 0.177059f, 0.193595f, 0.208271f, 0.220249f, 0.229045f, 0.234009f, 0.233700f, 0.227053f, 0.215289f, 0.201603f, 0.188525f, 0.176263f, 0.163748f, 0.150359f, 0.136192f, 0.121455f, 0.106303f, 0.090949f, 0.075597f, 0.060536f, 0.046491f, 0.034613f, 0.025962f, 0.021084f, 0.020003f, 0.022378f, 0.027742f, 0.035774f, 0.046332f, 0.059186f, 0.073920f, 0.090220f, 0.108028f, 0.127179f, 0.146973f, 0.166342f, 0.184471f, 0.201087f, 0.215996f, 0.228448f, 0.237272f, 0.241711f, 0.241663f, 0.236858f, 0.226335f, 0.209312f, 0.186169f, 0.157898f, 0.124884f, 0.087019f, 0.044857f, -0.000171f, -0.046674f, -0.093813f, -0.141018f, -0.187871f, -0.234164f, -0.279203f, -0.320929f, -0.356487f, -0.384099f, -0.404029f, + -0.417450f, -0.424542f, -0.423967f, -0.414337f, -0.396303f, -0.373146f, -0.348990f, -0.326237f, -0.304833f, -0.283944f, -0.263944f, -0.246725f, -0.234478f, -0.228461f, -0.228593f, -0.233819f, -0.242777f, -0.254337f, -0.267790f, -0.282812f, -0.299281f, -0.316843f, -0.334511f, -0.350840f, -0.364685f, -0.375697f, -0.384143f, -0.390499f, -0.395225f, -0.398596f, -0.400645f, -0.401464f, -0.401489f, -0.401163f, -0.400362f, -0.398530f, -0.395360f, -0.391048f, -0.385958f, -0.380382f, -0.374495f, -0.368144f, -0.360693f, -0.351302f, -0.339340f, -0.324513f, -0.306932f, -0.287105f, -0.265519f, -0.242294f, -0.217711f, -0.192689f, -0.167920f, -0.143119f, -0.118052f, -0.092771f, -0.064621f, -0.027534f, 0.019774f, 0.064488f, 0.085852f, 0.075236f, 0.045270f, 0.014113f} + }, + { + {-0.038110f, -0.075146f, -0.025161f, 0.086861f, 0.170835f, 0.137738f, -0.014451f, -0.178329f, -0.226409f, -0.135078f, -0.001014f, 0.071747f, 0.071029f, 0.049512f, 0.040096f, 0.037651f, 0.039313f, 0.052944f, 0.068671f, 0.062568f, 0.034549f, 0.012890f, 0.014819f, 0.026726f, 0.029476f, 0.021912f, 0.011228f, -0.002938f, -0.024811f, -0.052618f, -0.079613f, -0.100151f, -0.112340f, -0.118985f, -0.126456f, -0.138876f, -0.153643f, -0.164753f, -0.168424f, -0.163586f, -0.150319f, -0.130693f, -0.108614f, -0.086681f, -0.065059f, -0.044049f, -0.025062f, -0.008581f, 0.006237f, 0.019687f, 0.031442f, 0.042086f, 0.052645f, 0.063061f, 0.072813f, 0.082218f, 0.091601f, 0.100095f, 0.106517f, 0.110624f, 0.112708f, 0.112893f, 0.111393f, 0.108835f, 0.106157f, 0.104517f, 0.104794f, 0.106828f, 0.110032f, 0.114914f, 0.122673f, 0.133176f, 0.145069f, 0.158047f, 0.173137f, 0.190427f, 0.208289f, 0.225087f, 0.240122f, 0.252791f, 0.262062f, 0.266804f, 0.265987f, 0.259150f, 0.246951f, 0.230107f, 0.207850f, 0.179343f, 0.146598f, 0.113197f, 0.079461f, 0.041623f, -0.003026f, -0.052458f, -0.102576f, -0.151651f, + -0.200702f, -0.250524f, -0.299538f, -0.344617f, -0.383867f, -0.418204f, -0.449410f, -0.476879f, -0.497661f, -0.509826f, -0.514454f, -0.514151f, -0.510709f, -0.504091f, -0.492568f, -0.474151f, -0.448897f, -0.419410f, -0.388422f, -0.356746f, -0.324102f, -0.290635f, -0.256925f, -0.223703f, -0.192072f, -0.162880f, -0.135745f, -0.109787f, -0.085028f, -0.061904f, -0.040007f, -0.018473f, 0.003074f, 0.024714f, 0.046173f, 0.065944f, 0.082103f, 0.094598f, 0.105239f, 0.115311f, 0.124969f, 0.134460f, 0.143642f, 0.150842f, 0.154541f, 0.155566f, 0.155668f, 0.155273f, 0.154440f, 0.154045f, 0.154074f, 0.152898f, 0.149782f, 0.145794f, 0.141598f, 0.137270f, 0.133687f, 0.129549f, 0.118095f, 0.093347f, 0.059954f, 0.030500f, 0.012452f, 0.003233f}, + {-0.038110f, -0.075146f, -0.025161f, 0.086861f, 0.170835f, 0.137738f, -0.014451f, -0.178329f, -0.226409f, -0.135078f, -0.001014f, 0.071747f, 0.071029f, 0.049512f, 0.040096f, 0.037651f, 0.039313f, 0.052944f, 0.068671f, 0.062568f, 0.034549f, 0.012890f, 0.014819f, 0.026726f, 0.029476f, 0.021912f, 0.011228f, -0.002938f, -0.024811f, -0.052618f, -0.079613f, -0.100151f, -0.112340f, -0.118985f, -0.126456f, -0.138876f, -0.153643f, -0.164753f, -0.168424f, -0.163586f, -0.150319f, -0.130693f, -0.108614f, -0.086681f, -0.065059f, -0.044049f, -0.025062f, -0.008581f, 0.006237f, 0.019687f, 0.031442f, 0.042086f, 0.052645f, 0.063061f, 0.072813f, 0.082218f, 0.091601f, 0.100095f, 0.106517f, 0.110624f, 0.112708f, 0.112893f, 0.111393f, 0.108835f, 0.106157f, 0.104517f, 0.104794f, 0.106828f, 0.110032f, 0.114914f, 0.122673f, 0.133176f, 0.145069f, 0.158047f, 0.173137f, 0.190427f, 0.208289f, 0.225087f, 0.240122f, 0.252791f, 0.262062f, 0.266804f, 0.265987f, 0.259150f, 0.246951f, 0.230107f, 0.207850f, 0.179343f, 0.146598f, 0.113197f, 0.079461f, 0.041623f, -0.003026f, -0.052458f, -0.102576f, -0.151651f, + -0.200702f, -0.250524f, -0.299538f, -0.344617f, -0.383867f, -0.418204f, -0.449410f, -0.476879f, -0.497661f, -0.509826f, -0.514454f, -0.514151f, -0.510709f, -0.504091f, -0.492568f, -0.474151f, -0.448897f, -0.419410f, -0.388422f, -0.356746f, -0.324102f, -0.290635f, -0.256925f, -0.223703f, -0.192072f, -0.162880f, -0.135745f, -0.109787f, -0.085028f, -0.061904f, -0.040007f, -0.018473f, 0.003074f, 0.024714f, 0.046173f, 0.065944f, 0.082103f, 0.094598f, 0.105239f, 0.115311f, 0.124969f, 0.134460f, 0.143642f, 0.150842f, 0.154541f, 0.155566f, 0.155668f, 0.155273f, 0.154440f, 0.154045f, 0.154074f, 0.152898f, 0.149782f, 0.145794f, 0.141598f, 0.137270f, 0.133687f, 0.129549f, 0.118095f, 0.093347f, 0.059954f, 0.030500f, 0.012452f, 0.003233f} + }, + { + {0.027412f, 0.021630f, -0.082657f, -0.192018f, -0.202211f, -0.094239f, 0.096849f, 0.326445f, 0.521758f, 0.589844f, 0.497341f, 0.306742f, 0.099455f, -0.102283f, -0.307547f, -0.492196f, -0.609749f, -0.649976f, -0.647303f, -0.634380f, -0.613427f, -0.571915f, -0.505693f, -0.422791f, -0.335442f, -0.251686f, -0.170793f, -0.086744f, 0.002987f, 0.094569f, 0.183305f, 0.267395f, 0.345542f, 0.414985f, 0.473298f, 0.519576f, 0.553356f, 0.574222f, 0.582473f, 0.579178f, 0.566240f, 0.546806f, 0.524087f, 0.499039f, 0.470563f, 0.438298f, 0.403850f, 0.369330f, 0.336252f, 0.305665f, 0.277686f, 0.250860f, 0.223237f, 0.194118f, 0.164061f, 0.133725f, 0.103572f, 0.074268f, 0.046587f, 0.021025f, -0.002250f, -0.023323f, -0.042436f, -0.059666f, -0.074855f, -0.088006f, -0.099327f, -0.108715f, -0.115836f, -0.120903f, -0.124625f, -0.127245f, -0.128473f, -0.128509f, -0.128126f, -0.127534f, -0.126157f, -0.123884f, -0.121697f, -0.120709f, -0.121149f, -0.122545f, -0.124406f, -0.126443f, -0.128321f, -0.129408f, -0.128923f, -0.126622f, -0.123305f, -0.120296f, -0.118410f, -0.117799f, -0.118840f, -0.122736f, -0.130899f, -0.143626f, + -0.159298f, -0.175051f, -0.188642f, -0.199660f, -0.208519f, -0.214407f, -0.214978f, -0.208332f, -0.194776f, -0.176354f, -0.155006f, -0.131408f, -0.105361f, -0.077096f, -0.048137f, -0.020733f, 0.003611f, 0.024921f, 0.044105f, 0.061808f, 0.077866f, 0.091518f, 0.102092f, 0.109797f, 0.115978f, 0.122346f, 0.129837f, 0.138130f, 0.146061f, 0.152497f, 0.157139f, 0.160632f, 0.163819f, 0.166991f, 0.170004f, 0.172717f, 0.174872f, 0.175941f, 0.175619f, 0.174137f, 0.171689f, 0.168049f, 0.163091f, 0.157009f, 0.149642f, 0.140361f, 0.128990f, 0.115985f, 0.101537f, 0.085578f, 0.068755f, 0.052109f, 0.035768f, 0.019324f, 0.003160f, -0.012450f, -0.028834f, -0.046486f, -0.060943f, -0.064580f, -0.054322f, -0.035670f, -0.017673f, -0.004951f}, + {0.027412f, 0.021630f, -0.082657f, -0.192018f, -0.202211f, -0.094239f, 0.096849f, 0.326445f, 0.521758f, 0.589844f, 0.497341f, 0.306742f, 0.099455f, -0.102283f, -0.307547f, -0.492196f, -0.609749f, -0.649976f, -0.647303f, -0.634380f, -0.613427f, -0.571915f, -0.505693f, -0.422791f, -0.335442f, -0.251686f, -0.170793f, -0.086744f, 0.002987f, 0.094569f, 0.183305f, 0.267395f, 0.345542f, 0.414985f, 0.473298f, 0.519576f, 0.553356f, 0.574222f, 0.582473f, 0.579178f, 0.566240f, 0.546806f, 0.524087f, 0.499039f, 0.470563f, 0.438298f, 0.403850f, 0.369330f, 0.336252f, 0.305665f, 0.277686f, 0.250860f, 0.223237f, 0.194118f, 0.164061f, 0.133725f, 0.103572f, 0.074268f, 0.046587f, 0.021025f, -0.002250f, -0.023323f, -0.042436f, -0.059666f, -0.074855f, -0.088006f, -0.099327f, -0.108715f, -0.115836f, -0.120903f, -0.124625f, -0.127245f, -0.128473f, -0.128509f, -0.128126f, -0.127534f, -0.126157f, -0.123884f, -0.121697f, -0.120709f, -0.121149f, -0.122545f, -0.124406f, -0.126443f, -0.128321f, -0.129408f, -0.128923f, -0.126622f, -0.123305f, -0.120296f, -0.118410f, -0.117799f, -0.118840f, -0.122736f, -0.130899f, -0.143626f, + -0.159298f, -0.175051f, -0.188642f, -0.199660f, -0.208519f, -0.214407f, -0.214978f, -0.208332f, -0.194776f, -0.176354f, -0.155006f, -0.131408f, -0.105361f, -0.077096f, -0.048137f, -0.020733f, 0.003611f, 0.024921f, 0.044105f, 0.061808f, 0.077866f, 0.091518f, 0.102092f, 0.109797f, 0.115978f, 0.122346f, 0.129837f, 0.138130f, 0.146061f, 0.152497f, 0.157139f, 0.160632f, 0.163819f, 0.166991f, 0.170004f, 0.172717f, 0.174872f, 0.175941f, 0.175619f, 0.174137f, 0.171689f, 0.168049f, 0.163091f, 0.157009f, 0.149642f, 0.140361f, 0.128990f, 0.115985f, 0.101537f, 0.085578f, 0.068755f, 0.052109f, 0.035768f, 0.019324f, 0.003160f, -0.012450f, -0.028834f, -0.046486f, -0.060943f, -0.064580f, -0.054322f, -0.035670f, -0.017673f, -0.004951f} + } +}; +const float *CRendBin_HOA2_HRIR_coeff_diffuse_re_32kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const float *CRendBin_HOA2_HRIR_coeff_diffuse_im_32kHz[BINAURAL_CHANNELS]={NULL,NULL}; + +/* Sample Rate = 16000 */ + +const int16_t CRendBin_HOA2_HRIR_max_num_iterations_16kHz = 1; +const uint16_t CRendBin_HOA2_HRIR_num_iterations_16kHz[9][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1} }; +const uint16_t CRendBin_HOA2_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS] = {0, 0}; +const uint16_t CRendBin_HOA2_HRIR_pIndex_frequency_max_16kHz[9][BINAURAL_CHANNELS][1]={{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}}}; +const uint16_t CRendBin_HOA2_HRIR_index_frequency_max_diffuse_16kHz = 0; +const float CRendBin_HOA2_HRIR_inv_diffuse_weight_16kHz[9]={0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f}; +const uint16_t *CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const float CRendBin_HOA2_HRIR_coeff_re_16kHz[9][BINAURAL_CHANNELS][80]={ + { + { 0.854113f, 0.536451f, 0.067092f, -0.350133f, -0.609131f, -0.724504f, -0.749647f, -0.705240f, -0.587299f, -0.405686f, -0.188603f, 0.034290f, 0.235326f, 0.389114f, 0.484257f, 0.526650f, 0.525509f, 0.486339f, 0.417501f, 0.329156f, 0.225561f, 0.110464f, -0.004565f, -0.110029f, -0.209397f, -0.307633f, -0.398358f, -0.473786f, -0.535896f, -0.587622f, -0.625653f, -0.650087f, -0.667773f, -0.680841f, -0.685616f, -0.684346f, -0.683354f, -0.681293f, -0.673940f, -0.665480f, -0.660678f, -0.654254f, -0.641454f, -0.627762f, -0.616498f, -0.601208f, -0.579959f, -0.560224f, -0.542768f, -0.519685f, -0.491848f, -0.467631f, -0.444806f, -0.415518f, -0.384419f, -0.359637f, -0.335182f, -0.304116f, -0.274642f, -0.252517f, -0.227297f, -0.194558f, -0.166484f, -0.145123f, -0.116152f, -0.080136f, -0.053083f, -0.030604f, 0.005387f, 0.046361f, 0.073460f, 0.102702f, 0.155814f, 0.209408f, 0.244378f, 0.309617f, 0.442675f, 0.565949f, 0.579052f, 0.523768f}, + { 0.854113f, 0.536451f, 0.067092f, -0.350133f, -0.609131f, -0.724504f, -0.749647f, -0.705240f, -0.587299f, -0.405686f, -0.188603f, 0.034290f, 0.235326f, 0.389114f, 0.484257f, 0.526650f, 0.525509f, 0.486339f, 0.417501f, 0.329156f, 0.225561f, 0.110464f, -0.004565f, -0.110029f, -0.209397f, -0.307633f, -0.398358f, -0.473786f, -0.535896f, -0.587622f, -0.625653f, -0.650087f, -0.667773f, -0.680841f, -0.685616f, -0.684346f, -0.683354f, -0.681293f, -0.673940f, -0.665480f, -0.660678f, -0.654254f, -0.641454f, -0.627762f, -0.616498f, -0.601208f, -0.579959f, -0.560224f, -0.542768f, -0.519685f, -0.491848f, -0.467631f, -0.444806f, -0.415518f, -0.384419f, -0.359637f, -0.335182f, -0.304116f, -0.274642f, -0.252517f, -0.227297f, -0.194558f, -0.166484f, -0.145123f, -0.116152f, -0.080136f, -0.053083f, -0.030604f, 0.005387f, 0.046361f, 0.073460f, 0.102702f, 0.155814f, 0.209408f, 0.244378f, 0.309617f, 0.442675f, 0.565949f, 0.579052f, 0.523768f} + }, + { + { -0.012443f, 0.306951f, 0.640002f, 0.644701f, 0.222035f, -0.433014f, -1.009059f, -1.299682f, -1.291983f, -1.091837f, -0.799579f, -0.462162f, -0.106609f, 0.232265f, 0.526384f, 0.765415f, 0.941389f, 1.042514f, 1.068606f, 1.035233f, 0.959157f, 0.852416f, 0.726756f, 0.589559f, 0.440759f, 0.284682f, 0.135118f, -0.000404f, -0.127707f, -0.249843f, -0.360240f, -0.457524f, -0.548845f, -0.634531f, -0.707989f, -0.771448f, -0.832955f, -0.890467f, -0.937355f, -0.977102f, -1.014815f, -1.044459f, -1.061037f, -1.071895f, -1.081707f, -1.083157f, -1.073972f, -1.063175f, -1.052317f, -1.033040f, -1.007384f, -0.985836f, -0.965459f, -0.935829f, -0.901362f, -0.871368f, -0.838870f, -0.795666f, -0.751917f, -0.715707f, -0.675655f, -0.626445f, -0.582556f, -0.547393f, -0.504423f, -0.453551f, -0.413720f, -0.380963f, -0.333822f, -0.281188f, -0.246458f, -0.212864f, -0.152864f, -0.091358f, -0.055541f, 0.008028f, 0.159750f, 0.338247f, 0.427051f, 0.426619f}, + { 0.012443f, -0.306951f, -0.640002f, -0.644701f, -0.222035f, 0.433014f, 1.009059f, 1.299682f, 1.291983f, 1.091837f, 0.799579f, 0.462162f, 0.106609f, -0.232265f, -0.526384f, -0.765415f, -0.941389f, -1.042514f, -1.068606f, -1.035233f, -0.959157f, -0.852416f, -0.726756f, -0.589559f, -0.440759f, -0.284682f, -0.135118f, 0.000404f, 0.127707f, 0.249843f, 0.360240f, 0.457524f, 0.548845f, 0.634531f, 0.707989f, 0.771448f, 0.832955f, 0.890467f, 0.937355f, 0.977102f, 1.014815f, 1.044459f, 1.061037f, 1.071895f, 1.081707f, 1.083157f, 1.073972f, 1.063175f, 1.052317f, 1.033040f, 1.007384f, 0.985836f, 0.965459f, 0.935829f, 0.901362f, 0.871368f, 0.838870f, 0.795666f, 0.751917f, 0.715707f, 0.675655f, 0.626445f, 0.582556f, 0.547393f, 0.504423f, 0.453551f, 0.413720f, 0.380963f, 0.333822f, 0.281188f, 0.246458f, 0.212864f, 0.152864f, 0.091358f, 0.055541f, -0.008028f, -0.159750f, -0.338247f, -0.427051f, -0.426619f} + }, + { + { 0.106040f, 0.060914f, -0.031732f, -0.122748f, -0.131004f, -0.043133f, 0.056519f, 0.081183f, 0.028467f, -0.045616f, -0.095920f, -0.105685f, -0.073558f, -0.018343f, 0.024819f, 0.040683f, 0.051725f, 0.081855f, 0.120329f, 0.139638f, 0.131573f, 0.106054f, 0.068663f, 0.019936f, -0.031186f, -0.070885f, -0.095191f, -0.111198f, -0.126364f, -0.142556f, -0.156831f, -0.163750f, -0.159885f, -0.147705f, -0.132376f, -0.116427f, -0.101758f, -0.093589f, -0.096321f, -0.107910f, -0.123532f, -0.141780f, -0.162704f, -0.183821f, -0.202825f, -0.220588f, -0.237945f, -0.253555f, -0.267240f, -0.280492f, -0.292011f, -0.297968f, -0.297520f, -0.292601f, -0.282562f, -0.264953f, -0.240677f, -0.212280f, -0.178881f, -0.138637f, -0.093494f, -0.045703f, 0.006560f, 0.064510f, 0.124631f, 0.184450f, 0.246159f, 0.309391f, 0.368198f, 0.420383f, 0.470265f, 0.516543f, 0.549526f, 0.568203f, 0.584977f, 0.598750f, 0.576096f, 0.483726f, 0.343185f, 0.235289f}, + { 0.106040f, 0.060914f, -0.031732f, -0.122748f, -0.131004f, -0.043133f, 0.056519f, 0.081183f, 0.028467f, -0.045616f, -0.095920f, -0.105685f, -0.073558f, -0.018343f, 0.024819f, 0.040683f, 0.051725f, 0.081855f, 0.120329f, 0.139638f, 0.131573f, 0.106054f, 0.068663f, 0.019936f, -0.031186f, -0.070885f, -0.095191f, -0.111198f, -0.126364f, -0.142556f, -0.156831f, -0.163750f, -0.159885f, -0.147705f, -0.132376f, -0.116427f, -0.101758f, -0.093589f, -0.096321f, -0.107910f, -0.123532f, -0.141780f, -0.162704f, -0.183821f, -0.202825f, -0.220588f, -0.237945f, -0.253555f, -0.267240f, -0.280492f, -0.292011f, -0.297968f, -0.297520f, -0.292601f, -0.282562f, -0.264953f, -0.240677f, -0.212280f, -0.178881f, -0.138637f, -0.093494f, -0.045703f, 0.006560f, 0.064510f, 0.124631f, 0.184450f, 0.246159f, 0.309391f, 0.368198f, 0.420383f, 0.470265f, 0.516543f, 0.549526f, 0.568203f, 0.584977f, 0.598750f, 0.576096f, 0.483726f, 0.343185f, 0.235289f} + }, + { + { 0.025607f, 0.045038f, 0.027103f, -0.045868f, -0.111319f, -0.105551f, -0.047795f, -0.014679f, -0.049667f, -0.124496f, -0.180635f, -0.185029f, -0.145752f, -0.091265f, -0.042340f, 0.001278f, 0.052398f, 0.117166f, 0.185884f, 0.241515f, 0.272871f, 0.278398f, 0.262158f, 0.230861f, 0.192777f, 0.153660f, 0.111660f, 0.059556f, -0.005878f, -0.079629f, -0.155374f, -0.232190f, -0.310424f, -0.385049f, -0.448791f, -0.499238f, -0.537567f, -0.562808f, -0.572842f, -0.569135f, -0.555677f, -0.534949f, -0.508499f, -0.478959f, -0.448272f, -0.416372f, -0.383474f, -0.350600f, -0.317045f, -0.281295f, -0.244792f, -0.210869f, -0.180716f, -0.154266f, -0.132786f, -0.116138f, -0.100516f, -0.083127f, -0.065324f, -0.047830f, -0.028398f, -0.007151f, 0.012489f, 0.030425f, 0.049855f, 0.069959f, 0.087587f, 0.105253f, 0.127127f, 0.150063f, 0.170135f, 0.192124f, 0.219421f, 0.244672f, 0.266012f, 0.295860f, 0.330524f, 0.332753f, 0.281342f, 0.221813f}, + { 0.025607f, 0.045038f, 0.027103f, -0.045868f, -0.111319f, -0.105551f, -0.047795f, -0.014679f, -0.049667f, -0.124496f, -0.180635f, -0.185029f, -0.145752f, -0.091265f, -0.042340f, 0.001278f, 0.052398f, 0.117166f, 0.185884f, 0.241515f, 0.272871f, 0.278398f, 0.262158f, 0.230861f, 0.192777f, 0.153660f, 0.111660f, 0.059556f, -0.005878f, -0.079629f, -0.155374f, -0.232190f, -0.310424f, -0.385049f, -0.448791f, -0.499238f, -0.537567f, -0.562808f, -0.572842f, -0.569135f, -0.555677f, -0.534949f, -0.508499f, -0.478959f, -0.448272f, -0.416372f, -0.383474f, -0.350600f, -0.317045f, -0.281295f, -0.244792f, -0.210869f, -0.180716f, -0.154266f, -0.132786f, -0.116138f, -0.100516f, -0.083127f, -0.065324f, -0.047830f, -0.028398f, -0.007151f, 0.012489f, 0.030425f, 0.049855f, 0.069959f, 0.087587f, 0.105253f, 0.127127f, 0.150063f, 0.170135f, 0.192124f, 0.219421f, 0.244672f, 0.266012f, 0.295860f, 0.330524f, 0.332753f, 0.281342f, 0.221813f} + }, + { + { 0.000686f, -0.005679f, -0.002736f, 0.013737f, 0.025339f, 0.016835f, 0.000897f, -0.001565f, -0.001575f, -0.037994f, -0.123814f, -0.215847f, -0.254773f, -0.224963f, -0.159158f, -0.092400f, -0.030561f, 0.036822f, 0.111977f, 0.186298f, 0.252449f, 0.308392f, 0.351372f, 0.375856f, 0.379463f, 0.366110f, 0.340246f, 0.301367f, 0.247642f, 0.181811f, 0.109110f, 0.031862f, -0.049402f, -0.131957f, -0.212350f, -0.288831f, -0.357898f, -0.412063f, -0.446158f, -0.462855f, -0.468107f, -0.465087f, -0.455925f, -0.444179f, -0.431579f, -0.416646f, -0.398983f, -0.380257f, -0.360020f, -0.336141f, -0.309688f, -0.283814f, -0.258868f, -0.234234f, -0.212458f, -0.195547f, -0.180677f, -0.165064f, -0.150310f, -0.137125f, -0.122189f, -0.104504f, -0.087232f, -0.070209f, -0.049591f, -0.026301f, -0.004365f, 0.018481f, 0.046634f, 0.076352f, 0.103125f, 0.132539f, 0.168518f, 0.202438f, 0.232093f, 0.272054f, 0.318122f, 0.326574f, 0.271717f, 0.205315f}, + { -0.000686f, 0.005679f, 0.002736f, -0.013737f, -0.025339f, -0.016835f, -0.000897f, 0.001565f, 0.001575f, 0.037994f, 0.123814f, 0.215847f, 0.254773f, 0.224963f, 0.159158f, 0.092400f, 0.030561f, -0.036822f, -0.111977f, -0.186298f, -0.252449f, -0.308392f, -0.351372f, -0.375856f, -0.379463f, -0.366110f, -0.340246f, -0.301367f, -0.247642f, -0.181811f, -0.109110f, -0.031862f, 0.049402f, 0.131957f, 0.212350f, 0.288831f, 0.357898f, 0.412063f, 0.446158f, 0.462855f, 0.468107f, 0.465087f, 0.455925f, 0.444179f, 0.431579f, 0.416646f, 0.398983f, 0.380257f, 0.360020f, 0.336141f, 0.309688f, 0.283814f, 0.258868f, 0.234234f, 0.212458f, 0.195547f, 0.180677f, 0.165064f, 0.150310f, 0.137125f, 0.122189f, 0.104504f, 0.087232f, 0.070209f, 0.049591f, 0.026301f, 0.004365f, -0.018481f, -0.046634f, -0.076352f, -0.103125f, -0.132539f, -0.168518f, -0.202438f, -0.232093f, -0.272054f, -0.318122f, -0.326574f, -0.271717f, -0.205315f} + }, + { + { 0.007904f, -0.008429f, 0.002701f, 0.025666f, 0.001826f, -0.039845f, 0.005012f, 0.135846f, 0.197408f, 0.076852f, -0.136969f, -0.263642f, -0.237977f, -0.137254f, -0.049823f, 0.006941f, 0.054280f, 0.103144f, 0.149549f, 0.185848f, 0.204085f, 0.200088f, 0.177900f, 0.145801f, 0.110457f, 0.077582f, 0.052788f, 0.037914f, 0.030252f, 0.027742f, 0.031540f, 0.041709f, 0.053562f, 0.061202f, 0.063767f, 0.065527f, 0.069061f, 0.070600f, 0.064006f, 0.047422f, 0.023594f, -0.004162f, -0.032992f, -0.059696f, -0.082643f, -0.103277f, -0.123459f, -0.143553f, -0.164480f, -0.187877f, -0.212785f, -0.236261f, -0.257871f, -0.278890f, -0.297353f, -0.309320f, -0.314125f, -0.312895f, -0.304021f, -0.285839f, -0.260655f, -0.230623f, -0.194026f, -0.150485f, -0.103758f, -0.055096f, -0.001701f, 0.054669f, 0.107407f, 0.155932f, 0.204710f, 0.249689f, 0.280936f, 0.300421f, 0.318178f, 0.326332f, 0.297895f, 0.222216f, 0.128176f, 0.064416f}, + { -0.007904f, 0.008429f, -0.002701f, -0.025666f, -0.001826f, 0.039845f, -0.005012f, -0.135846f, -0.197408f, -0.076852f, 0.136969f, 0.263642f, 0.237977f, 0.137254f, 0.049823f, -0.006941f, -0.054280f, -0.103144f, -0.149549f, -0.185848f, -0.204085f, -0.200088f, -0.177900f, -0.145801f, -0.110457f, -0.077582f, -0.052788f, -0.037914f, -0.030252f, -0.027742f, -0.031540f, -0.041709f, -0.053562f, -0.061202f, -0.063767f, -0.065527f, -0.069061f, -0.070600f, -0.064006f, -0.047422f, -0.023594f, 0.004162f, 0.032992f, 0.059696f, 0.082643f, 0.103277f, 0.123459f, 0.143553f, 0.164480f, 0.187877f, 0.212785f, 0.236261f, 0.257871f, 0.278890f, 0.297353f, 0.309320f, 0.314125f, 0.312895f, 0.304021f, 0.285839f, 0.260655f, 0.230623f, 0.194026f, 0.150485f, 0.103758f, 0.055096f, 0.001701f, -0.054669f, -0.107407f, -0.155932f, -0.204710f, -0.249689f, -0.280936f, -0.300421f, -0.318178f, -0.326332f, -0.297895f, -0.222216f, -0.128176f, -0.064416f} + }, + { + { -0.012716f, -0.011283f, -0.028399f, -0.061054f, -0.081205f, -0.083144f, -0.091074f, -0.102690f, -0.064724f, 0.062608f, 0.237783f, 0.366599f, 0.391473f, 0.329692f, 0.231326f, 0.128318f, 0.030222f, -0.055798f, -0.121650f, -0.168422f, -0.204629f, -0.233962f, -0.253078f, -0.260136f, -0.256765f, -0.242370f, -0.216094f, -0.185514f, -0.164188f, -0.157679f, -0.158772f, -0.158039f, -0.152420f, -0.142465f, -0.128405f, -0.111148f, -0.092065f, -0.070678f, -0.045979f, -0.019198f, 0.007643f, 0.033532f, 0.056493f, 0.073700f, 0.085876f, 0.097069f, 0.108478f, 0.117609f, 0.124012f, 0.129735f, 0.134173f, 0.134912f, 0.132726f, 0.129439f, 0.123146f, 0.111851f, 0.098311f, 0.085383f, 0.071577f, 0.056410f, 0.043514f, 0.033919f, 0.024302f, 0.015077f, 0.010656f, 0.010232f, 0.009612f, 0.011570f, 0.021452f, 0.035720f, 0.049452f, 0.068352f, 0.096786f, 0.126020f, 0.154079f, 0.197033f, 0.251253f, 0.270031f, 0.223100f, 0.160302f}, + { -0.012716f, -0.011283f, -0.028399f, -0.061054f, -0.081205f, -0.083144f, -0.091074f, -0.102690f, -0.064724f, 0.062608f, 0.237783f, 0.366599f, 0.391473f, 0.329692f, 0.231326f, 0.128318f, 0.030222f, -0.055798f, -0.121650f, -0.168422f, -0.204629f, -0.233962f, -0.253078f, -0.260136f, -0.256765f, -0.242370f, -0.216094f, -0.185514f, -0.164188f, -0.157679f, -0.158772f, -0.158039f, -0.152420f, -0.142465f, -0.128405f, -0.111148f, -0.092065f, -0.070678f, -0.045979f, -0.019198f, 0.007643f, 0.033532f, 0.056493f, 0.073700f, 0.085876f, 0.097069f, 0.108478f, 0.117609f, 0.124012f, 0.129735f, 0.134173f, 0.134912f, 0.132726f, 0.129439f, 0.123146f, 0.111851f, 0.098311f, 0.085383f, 0.071577f, 0.056410f, 0.043514f, 0.033919f, 0.024302f, 0.015077f, 0.010656f, 0.010232f, 0.009612f, 0.011570f, 0.021452f, 0.035720f, 0.049452f, 0.068352f, 0.096786f, 0.126020f, 0.154079f, 0.197033f, 0.251253f, 0.270031f, 0.223100f, 0.160302f} + }, + { + { 0.035859f, -0.035357f, -0.114806f, -0.119629f, -0.016035f, 0.134784f, 0.211022f, 0.138101f, -0.031463f, -0.164348f, -0.178566f, -0.110510f, -0.046828f, -0.024291f, -0.021836f, -0.019841f, -0.020649f, -0.019218f, 0.000673f, 0.033520f, 0.050179f, 0.039650f, 0.025311f, 0.029447f, 0.046313f, 0.061065f, 0.072923f, 0.086604f, 0.097738f, 0.098999f, 0.090037f, 0.074499f, 0.056179f, 0.040502f, 0.030491f, 0.020585f, 0.002674f, -0.023442f, -0.052639f, -0.082588f, -0.111653f, -0.134805f, -0.149388f, -0.159077f, -0.166519f, -0.169259f, -0.166952f, -0.163907f, -0.161378f, -0.156387f, -0.149606f, -0.144842f, -0.140986f, -0.134223f, -0.126134f, -0.119925f, -0.112707f, -0.101068f, -0.088476f, -0.078329f, -0.067520f, -0.054684f, -0.044956f, -0.039968f, -0.034783f, -0.029180f, -0.028179f, -0.029379f, -0.025982f, -0.021388f, -0.022077f, -0.020755f, -0.008615f, 0.005112f, 0.013009f, 0.034539f, 0.085352f, 0.136291f, 0.147338f, 0.130821f}, + { 0.035859f, -0.035357f, -0.114806f, -0.119629f, -0.016035f, 0.134784f, 0.211022f, 0.138101f, -0.031463f, -0.164348f, -0.178566f, -0.110510f, -0.046828f, -0.024291f, -0.021836f, -0.019841f, -0.020649f, -0.019218f, 0.000673f, 0.033520f, 0.050179f, 0.039650f, 0.025311f, 0.029447f, 0.046313f, 0.061065f, 0.072923f, 0.086604f, 0.097738f, 0.098999f, 0.090037f, 0.074499f, 0.056179f, 0.040502f, 0.030491f, 0.020585f, 0.002674f, -0.023442f, -0.052639f, -0.082588f, -0.111653f, -0.134805f, -0.149388f, -0.159077f, -0.166519f, -0.169259f, -0.166952f, -0.163907f, -0.161378f, -0.156387f, -0.149606f, -0.144842f, -0.140986f, -0.134223f, -0.126134f, -0.119925f, -0.112707f, -0.101068f, -0.088476f, -0.078329f, -0.067520f, -0.054684f, -0.044956f, -0.039968f, -0.034783f, -0.029180f, -0.028179f, -0.029379f, -0.025982f, -0.021388f, -0.022077f, -0.020755f, -0.008615f, 0.005112f, 0.013009f, 0.034539f, 0.085352f, 0.136291f, 0.147338f, 0.130821f} + }, + { + { -0.000277f, 0.072507f, 0.102938f, 0.013249f, -0.152871f, -0.302455f, -0.374408f, -0.331367f, -0.150657f, 0.128128f, 0.396891f, 0.568348f, 0.643297f, 0.660957f, 0.623136f, 0.509757f, 0.340137f, 0.169505f, 0.031029f, -0.085194f, -0.198795f, -0.311141f, -0.410925f, -0.488800f, -0.543139f, -0.580355f, -0.609683f, -0.633539f, -0.646097f, -0.642831f, -0.625426f, -0.596020f, -0.553861f, -0.499612f, -0.436850f, -0.368148f, -0.294645f, -0.219235f, -0.145750f, -0.076151f, -0.011910f, 0.044644f, 0.093543f, 0.138070f, 0.179584f, 0.215412f, 0.243810f, 0.266366f, 0.284297f, 0.297593f, 0.308450f, 0.320041f, 0.331716f, 0.340456f, 0.346032f, 0.349732f, 0.350243f, 0.345998f, 0.338804f, 0.330510f, 0.319816f, 0.306267f, 0.292468f, 0.279073f, 0.263490f, 0.245910f, 0.229601f, 0.214043f, 0.196022f, 0.177471f, 0.162554f, 0.148486f, 0.130576f, 0.113131f, 0.101342f, 0.086559f, 0.056990f, 0.019982f, -0.005018f, -0.012955f}, + { -0.000277f, 0.072507f, 0.102938f, 0.013249f, -0.152871f, -0.302455f, -0.374408f, -0.331367f, -0.150657f, 0.128128f, 0.396891f, 0.568348f, 0.643297f, 0.660957f, 0.623136f, 0.509757f, 0.340137f, 0.169505f, 0.031029f, -0.085194f, -0.198795f, -0.311141f, -0.410925f, -0.488800f, -0.543139f, -0.580355f, -0.609683f, -0.633539f, -0.646097f, -0.642831f, -0.625426f, -0.596020f, -0.553861f, -0.499612f, -0.436850f, -0.368148f, -0.294645f, -0.219235f, -0.145750f, -0.076151f, -0.011910f, 0.044644f, 0.093543f, 0.138070f, 0.179584f, 0.215412f, 0.243810f, 0.266366f, 0.284297f, 0.297593f, 0.308450f, 0.320041f, 0.331716f, 0.340456f, 0.346032f, 0.349732f, 0.350243f, 0.345998f, 0.338804f, 0.330510f, 0.319816f, 0.306267f, 0.292468f, 0.279073f, 0.263490f, 0.245910f, 0.229601f, 0.214043f, 0.196022f, 0.177471f, 0.162554f, 0.148486f, 0.130576f, 0.113131f, 0.101342f, 0.086559f, 0.056990f, 0.019982f, -0.005018f, -0.012955f} + } +}; +const float CRendBin_HOA2_HRIR_coeff_im_16kHz[9][BINAURAL_CHANNELS][80]={ + { + { -0.279849f, -0.720835f, -0.885416f, -0.784738f, -0.545597f, -0.284166f, -0.039642f, 0.189992f, 0.392178f, 0.537862f, 0.608064f, 0.599378f, 0.517014f, 0.378190f, 0.211052f, 0.038799f, -0.127672f, -0.280366f, -0.411081f, -0.518033f, -0.602220f, -0.659249f, -0.686892f, -0.694308f, -0.690691f, -0.672923f, -0.636337f, -0.587078f, -0.532859f, -0.473554f, -0.410112f, -0.349570f, -0.294359f, -0.240124f, -0.187465f, -0.141656f, -0.100915f, -0.059776f, -0.020698f, 0.012198f, 0.044049f, 0.079925f, 0.114533f, 0.143760f, 0.173471f, 0.206190f, 0.234826f, 0.257923f, 0.283113f, 0.310262f, 0.331082f, 0.346996f, 0.366076f, 0.384865f, 0.395359f, 0.402963f, 0.415413f, 0.425799f, 0.427896f, 0.431174f, 0.440886f, 0.445771f, 0.442548f, 0.444490f, 0.452426f, 0.451179f, 0.443114f, 0.445296f, 0.451405f, 0.442876f, 0.431564f, 0.437517f, 0.441102f, 0.420868f, 0.408764f, 0.426165f, 0.404391f, 0.275313f, 0.105567f, 0.014714f}, + { -0.279849f, -0.720835f, -0.885416f, -0.784738f, -0.545597f, -0.284166f, -0.039642f, 0.189992f, 0.392178f, 0.537862f, 0.608064f, 0.599378f, 0.517014f, 0.378190f, 0.211052f, 0.038799f, -0.127672f, -0.280366f, -0.411081f, -0.518033f, -0.602220f, -0.659249f, -0.686892f, -0.694308f, -0.690691f, -0.672923f, -0.636337f, -0.587078f, -0.532859f, -0.473554f, -0.410112f, -0.349570f, -0.294359f, -0.240124f, -0.187465f, -0.141656f, -0.100915f, -0.059776f, -0.020698f, 0.012198f, 0.044049f, 0.079925f, 0.114533f, 0.143760f, 0.173471f, 0.206190f, 0.234826f, 0.257923f, 0.283113f, 0.310262f, 0.331082f, 0.346996f, 0.366076f, 0.384865f, 0.395359f, 0.402963f, 0.415413f, 0.425799f, 0.427896f, 0.431174f, 0.440886f, 0.445771f, 0.442548f, 0.444490f, 0.452426f, 0.451179f, 0.443114f, 0.445296f, 0.451405f, 0.442876f, 0.431564f, 0.437517f, 0.441102f, 0.420868f, 0.408764f, 0.426165f, 0.404391f, 0.275313f, 0.105567f, 0.014714f} + }, + { + { 0.137891f, 0.229594f, -0.067928f, -0.623005f, -1.090538f, -1.189519f, -0.884822f, -0.354524f, 0.180758f, 0.598608f, 0.883947f, 1.053700f, 1.111227f, 1.061907f, 0.928126f, 0.732907f, 0.490534f, 0.220795f, -0.047441f, -0.292902f, -0.508160f, -0.690313f, -0.839240f, -0.960125f, -1.054642f, -1.116743f, -1.146677f, -1.156988f, -1.156022f, -1.140346f, -1.110014f, -1.073762f, -1.034019f, -0.985244f, -0.929519f, -0.875052f, -0.820278f, -0.758166f, -0.691738f, -0.627222f, -0.560364f, -0.486773f, -0.413937f, -0.347468f, -0.280644f, -0.210486f, -0.145643f, -0.088457f, -0.030518f, 0.027797f, 0.077074f, 0.119974f, 0.167213f, 0.215231f, 0.254026f, 0.289039f, 0.328776f, 0.364400f, 0.387539f, 0.408919f, 0.435376f, 0.454122f, 0.460897f, 0.471406f, 0.487696f, 0.492222f, 0.486983f, 0.492364f, 0.502301f, 0.494577f, 0.481913f, 0.489869f, 0.498275f, 0.479752f, 0.470075f, 0.504969f, 0.517158f, 0.412306f, 0.223203f, 0.061484f}, + { -0.137891f, -0.229594f, 0.067928f, 0.623005f, 1.090538f, 1.189519f, 0.884822f, 0.354524f, -0.180758f, -0.598608f, -0.883947f, -1.053700f, -1.111227f, -1.061907f, -0.928126f, -0.732907f, -0.490534f, -0.220795f, 0.047441f, 0.292902f, 0.508160f, 0.690313f, 0.839240f, 0.960125f, 1.054642f, 1.116743f, 1.146677f, 1.156988f, 1.156022f, 1.140346f, 1.110014f, 1.073762f, 1.034019f, 0.985244f, 0.929519f, 0.875052f, 0.820278f, 0.758166f, 0.691738f, 0.627222f, 0.560364f, 0.486773f, 0.413937f, 0.347468f, 0.280644f, 0.210486f, 0.145643f, 0.088457f, 0.030518f, -0.027797f, -0.077074f, -0.119974f, -0.167213f, -0.215231f, -0.254026f, -0.289039f, -0.328776f, -0.364400f, -0.387539f, -0.408919f, -0.435376f, -0.454122f, -0.460897f, -0.471406f, -0.487696f, -0.492222f, -0.486983f, -0.492364f, -0.502301f, -0.494577f, -0.481913f, -0.489869f, -0.498275f, -0.479752f, -0.470075f, -0.504969f, -0.517158f, -0.412306f, -0.223203f, -0.061484f} + }, + { + { -0.037944f, -0.106904f, -0.132860f, -0.074197f, 0.039345f, 0.109112f, 0.075839f, -0.015806f, -0.081154f, -0.083561f, -0.038813f, 0.024921f, 0.079316f, 0.098387f, 0.081988f, 0.060932f, 0.056952f, 0.053685f, 0.024659f, -0.028315f, -0.083387f, -0.128710f, -0.164189f, -0.185222f, -0.184737f, -0.166916f, -0.145003f, -0.127294f, -0.112613f, -0.096040f, -0.073923f, -0.046696f, -0.019918f, 0.000121f, 0.011773f, 0.015947f, 0.011639f, -0.001080f, -0.016599f, -0.028201f, -0.034495f, -0.036865f, -0.034339f, -0.025728f, -0.012939f, 0.002163f, 0.020448f, 0.042341f, 0.066491f, 0.093562f, 0.126180f, 0.163808f, 0.202979f, 0.242843f, 0.284779f, 0.327198f, 0.366815f, 0.403787f, 0.439636f, 0.472316f, 0.499155f, 0.521398f, 0.540138f, 0.552065f, 0.554704f, 0.550353f, 0.539674f, 0.518421f, 0.485659f, 0.446647f, 0.402248f, 0.346247f, 0.279546f, 0.213387f, 0.148100f, 0.064032f, -0.046179f, -0.142400f, -0.158189f, -0.068950f}, + { -0.037944f, -0.106904f, -0.132860f, -0.074197f, 0.039345f, 0.109112f, 0.075839f, -0.015806f, -0.081154f, -0.083561f, -0.038813f, 0.024921f, 0.079316f, 0.098387f, 0.081988f, 0.060932f, 0.056952f, 0.053685f, 0.024659f, -0.028315f, -0.083387f, -0.128710f, -0.164189f, -0.185222f, -0.184737f, -0.166916f, -0.145003f, -0.127294f, -0.112613f, -0.096040f, -0.073923f, -0.046696f, -0.019918f, 0.000121f, 0.011773f, 0.015947f, 0.011639f, -0.001080f, -0.016599f, -0.028201f, -0.034495f, -0.036865f, -0.034339f, -0.025728f, -0.012939f, 0.002163f, 0.020448f, 0.042341f, 0.066491f, 0.093562f, 0.126180f, 0.163808f, 0.202979f, 0.242843f, 0.284779f, 0.327198f, 0.366815f, 0.403787f, 0.439636f, 0.472316f, 0.499155f, 0.521398f, 0.540138f, 0.552065f, 0.554704f, 0.550353f, 0.539674f, 0.518421f, 0.485659f, 0.446647f, 0.402248f, 0.346247f, 0.279546f, 0.213387f, 0.148100f, 0.064032f, -0.046179f, -0.142400f, -0.158189f, -0.068950f} + }, + { + { -0.001343f, -0.030465f, -0.090431f, -0.117729f, -0.072159f, -0.000959f, 0.017976f, -0.029349f, -0.083995f, -0.085435f, -0.026909f, 0.054025f, 0.117372f, 0.148897f, 0.159644f, 0.166262f, 0.171633f, 0.163163f, 0.127809f, 0.065274f, -0.013456f, -0.095573f, -0.171737f, -0.236275f, -0.288250f, -0.332759f, -0.376516f, -0.419675f, -0.454690f, -0.474981f, -0.481065f, -0.475362f, -0.455565f, -0.418282f, -0.365992f, -0.304811f, -0.237851f, -0.166048f, -0.093163f, -0.024547f, 0.037453f, 0.092832f, 0.140930f, 0.181479f, 0.216098f, 0.246070f, 0.271249f, 0.292345f, 0.310665f, 0.325008f, 0.332856f, 0.334536f, 0.332397f, 0.327422f, 0.320787f, 0.315984f, 0.314890f, 0.314985f, 0.314210f, 0.313937f, 0.314092f, 0.311588f, 0.306338f, 0.301707f, 0.297473f, 0.290554f, 0.282600f, 0.277168f, 0.271223f, 0.260355f, 0.248072f, 0.237680f, 0.222743f, 0.199693f, 0.176748f, 0.151965f, 0.102492f, 0.025265f, -0.032061f, -0.023375f}, + { -0.001343f, -0.030465f, -0.090431f, -0.117729f, -0.072159f, -0.000959f, 0.017976f, -0.029349f, -0.083995f, -0.085435f, -0.026909f, 0.054025f, 0.117372f, 0.148897f, 0.159644f, 0.166262f, 0.171633f, 0.163163f, 0.127809f, 0.065274f, -0.013456f, -0.095573f, -0.171737f, -0.236275f, -0.288250f, -0.332759f, -0.376516f, -0.419675f, -0.454690f, -0.474981f, -0.481065f, -0.475362f, -0.455565f, -0.418282f, -0.365992f, -0.304811f, -0.237851f, -0.166048f, -0.093163f, -0.024547f, 0.037453f, 0.092832f, 0.140930f, 0.181479f, 0.216098f, 0.246070f, 0.271249f, 0.292345f, 0.310665f, 0.325008f, 0.332856f, 0.334536f, 0.332397f, 0.327422f, 0.320787f, 0.315984f, 0.314890f, 0.314985f, 0.314210f, 0.313937f, 0.314092f, 0.311588f, 0.306338f, 0.301707f, 0.297473f, 0.290554f, 0.282600f, 0.277168f, 0.271223f, 0.260355f, 0.248072f, 0.237680f, 0.222743f, 0.199693f, 0.176748f, 0.151965f, 0.102492f, 0.025265f, -0.032061f, -0.023375f} + }, + { + { -0.003822f, -0.004182f, 0.003769f, 0.002231f, -0.018518f, -0.042371f, -0.050814f, -0.055060f, -0.082241f, -0.127129f, -0.141168f, -0.084513f, 0.025067f, 0.131195f, 0.197402f, 0.230196f, 0.250490f, 0.263052f, 0.258983f, 0.233443f, 0.189892f, 0.131909f, 0.060205f, -0.021879f, -0.106291f, -0.186505f, -0.262057f, -0.333838f, -0.398243f, -0.449958f, -0.487738f, -0.512937f, -0.524754f, -0.521358f, -0.503097f, -0.470311f, -0.421405f, -0.357963f, -0.288378f, -0.221718f, -0.161127f, -0.106483f, -0.058681f, -0.017466f, 0.020089f, 0.055500f, 0.087512f, 0.116263f, 0.143565f, 0.168412f, 0.187881f, 0.202191f, 0.213370f, 0.220775f, 0.223797f, 0.225934f, 0.230320f, 0.235230f, 0.239129f, 0.244505f, 0.252120f, 0.258553f, 0.263155f, 0.269212f, 0.275974f, 0.279247f, 0.280325f, 0.283134f, 0.284382f, 0.279208f, 0.271780f, 0.265915f, 0.254057f, 0.231999f, 0.209308f, 0.183649f, 0.128013f, 0.038161f, -0.030805f, -0.024799f}, + { 0.003822f, 0.004182f, -0.003769f, -0.002231f, 0.018518f, 0.042371f, 0.050814f, 0.055060f, 0.082241f, 0.127129f, 0.141168f, 0.084513f, -0.025067f, -0.131195f, -0.197402f, -0.230196f, -0.250490f, -0.263052f, -0.258983f, -0.233443f, -0.189892f, -0.131909f, -0.060205f, 0.021879f, 0.106291f, 0.186505f, 0.262057f, 0.333838f, 0.398243f, 0.449958f, 0.487738f, 0.512937f, 0.524754f, 0.521358f, 0.503097f, 0.470311f, 0.421405f, 0.357963f, 0.288378f, 0.221718f, 0.161127f, 0.106483f, 0.058681f, 0.017466f, -0.020089f, -0.055500f, -0.087512f, -0.116263f, -0.143565f, -0.168412f, -0.187881f, -0.202191f, -0.213370f, -0.220775f, -0.223797f, -0.225934f, -0.230320f, -0.235230f, -0.239129f, -0.244505f, -0.252120f, -0.258553f, -0.263155f, -0.269212f, -0.275974f, -0.279247f, -0.280325f, -0.283134f, -0.284382f, -0.279208f, -0.271780f, -0.265915f, -0.254057f, -0.231999f, -0.209308f, -0.183649f, -0.128013f, -0.038161f, 0.030805f, 0.024799f} + }, + { + { -0.007141f, -0.000269f, 0.020053f, 0.005151f, -0.021397f, 0.017134f, 0.096077f, 0.079602f, -0.080798f, -0.242492f, -0.239038f, -0.078682f, 0.094173f, 0.179901f, 0.193223f, 0.186734f, 0.180011f, 0.165677f, 0.136686f, 0.092362f, 0.037203f, -0.018468f, -0.063954f, -0.094649f, -0.110368f, -0.112031f, -0.103341f, -0.090810f, -0.078704f, -0.067141f, -0.056765f, -0.051692f, -0.055372f, -0.065676f, -0.076978f, -0.087145f, -0.100035f, -0.119731f, -0.144366f, -0.167862f, -0.185792f, -0.196760f, -0.200382f, -0.197667f, -0.191812f, -0.185459f, -0.178637f, -0.170957f, -0.162715f, -0.152400f, -0.137119f, -0.116662f, -0.092858f, -0.064845f, -0.030146f, 0.010135f, 0.052660f, 0.096829f, 0.142849f, 0.187559f, 0.227910f, 0.264896f, 0.298909f, 0.326420f, 0.345843f, 0.359746f, 0.367295f, 0.363369f, 0.348300f, 0.327585f, 0.299800f, 0.258398f, 0.207127f, 0.156648f, 0.103405f, 0.032624f, -0.049949f, -0.107648f, -0.105316f, -0.043186f}, + { 0.007141f, 0.000269f, -0.020053f, -0.005151f, 0.021397f, -0.017134f, -0.096077f, -0.079602f, 0.080798f, 0.242492f, 0.239038f, 0.078682f, -0.094173f, -0.179901f, -0.193223f, -0.186734f, -0.180011f, -0.165677f, -0.136686f, -0.092362f, -0.037203f, 0.018468f, 0.063954f, 0.094649f, 0.110368f, 0.112031f, 0.103341f, 0.090810f, 0.078704f, 0.067141f, 0.056765f, 0.051692f, 0.055372f, 0.065676f, 0.076978f, 0.087145f, 0.100035f, 0.119731f, 0.144366f, 0.167862f, 0.185792f, 0.196760f, 0.200382f, 0.197667f, 0.191812f, 0.185459f, 0.178637f, 0.170957f, 0.162715f, 0.152400f, 0.137119f, 0.116662f, 0.092858f, 0.064845f, 0.030146f, -0.010135f, -0.052660f, -0.096829f, -0.142849f, -0.187559f, -0.227910f, -0.264896f, -0.298909f, -0.326420f, -0.345843f, -0.359746f, -0.367295f, -0.363369f, -0.348300f, -0.327585f, -0.299800f, -0.258398f, -0.207127f, -0.156648f, -0.103405f, -0.032624f, 0.049949f, 0.107648f, 0.105316f, 0.043186f} + }, + { + { -0.001068f, -0.011669f, -0.026585f, -0.020015f, 0.010585f, 0.040078f, 0.066520f, 0.124261f, 0.221193f, 0.294911f, 0.266885f, 0.129051f, -0.049656f, -0.195409f, -0.283656f, -0.326169f, -0.335364f, -0.316666f, -0.279923f, -0.238383f, -0.197010f, -0.152299f, -0.103120f, -0.053556f, -0.006327f, 0.037345f, 0.071350f, 0.087916f, 0.089422f, 0.089013f, 0.097000f, 0.112917f, 0.131823f, 0.151104f, 0.169420f, 0.185327f, 0.198942f, 0.210964f, 0.219989f, 0.223967f, 0.222689f, 0.216294f, 0.204468f, 0.189464f, 0.175607f, 0.163713f, 0.150702f, 0.135728f, 0.121043f, 0.106637f, 0.090424f, 0.073312f, 0.057730f, 0.042745f, 0.026954f, 0.013259f, 0.004619f, -0.000739f, -0.004364f, -0.003750f, 0.001700f, 0.008264f, 0.015354f, 0.026579f, 0.041079f, 0.054236f, 0.067442f, 0.085032f, 0.103334f, 0.116515f, 0.128381f, 0.142875f, 0.152038f, 0.151164f, 0.149997f, 0.145519f, 0.107611f, 0.028941f, -0.034761f, -0.026006f}, + { -0.001068f, -0.011669f, -0.026585f, -0.020015f, 0.010585f, 0.040078f, 0.066520f, 0.124261f, 0.221193f, 0.294911f, 0.266885f, 0.129051f, -0.049656f, -0.195409f, -0.283656f, -0.326169f, -0.335364f, -0.316666f, -0.279923f, -0.238383f, -0.197010f, -0.152299f, -0.103120f, -0.053556f, -0.006327f, 0.037345f, 0.071350f, 0.087916f, 0.089422f, 0.089013f, 0.097000f, 0.112917f, 0.131823f, 0.151104f, 0.169420f, 0.185327f, 0.198942f, 0.210964f, 0.219989f, 0.223967f, 0.222689f, 0.216294f, 0.204468f, 0.189464f, 0.175607f, 0.163713f, 0.150702f, 0.135728f, 0.121043f, 0.106637f, 0.090424f, 0.073312f, 0.057730f, 0.042745f, 0.026954f, 0.013259f, 0.004619f, -0.000739f, -0.004364f, -0.003750f, 0.001700f, 0.008264f, 0.015354f, 0.026579f, 0.041079f, 0.054236f, 0.067442f, 0.085032f, 0.103334f, 0.116515f, 0.128381f, 0.142875f, 0.152038f, 0.151164f, 0.149997f, 0.145519f, 0.107611f, 0.028941f, -0.034761f, -0.026006f} + }, + { + { -0.037828f, -0.075096f, -0.025986f, 0.086083f, 0.170568f, 0.136964f, -0.015998f, -0.179579f, -0.227305f, -0.136711f, -0.003232f, 0.070010f, 0.069408f, 0.046996f, 0.037246f, 0.035376f, 0.036858f, 0.049531f, 0.065210f, 0.059663f, 0.031146f, 0.008574f, 0.010733f, 0.023060f, 0.025014f, 0.016687f, 0.006465f, -0.007530f, -0.030444f, -0.058769f, -0.085159f, -0.105870f, -0.119253f, -0.126108f, -0.132952f, -0.145953f, -0.161950f, -0.172937f, -0.176110f, -0.172287f, -0.160154f, -0.140096f, -0.117814f, -0.097309f, -0.076591f, -0.054926f, -0.036201f, -0.021493f, -0.007233f, 0.006947f, 0.017810f, 0.026450f, 0.036880f, 0.047880f, 0.055961f, 0.063286f, 0.072990f, 0.081618f, 0.085458f, 0.087597f, 0.090387f, 0.089833f, 0.084714f, 0.080517f, 0.078723f, 0.074845f, 0.070311f, 0.071284f, 0.075074f, 0.075104f, 0.076588f, 0.086990f, 0.097901f, 0.100583f, 0.107487f, 0.127031f, 0.132157f, 0.094602f, 0.037294f, 0.005325f}, + { -0.037828f, -0.075096f, -0.025986f, 0.086083f, 0.170568f, 0.136964f, -0.015998f, -0.179579f, -0.227305f, -0.136711f, -0.003232f, 0.070010f, 0.069408f, 0.046996f, 0.037246f, 0.035376f, 0.036858f, 0.049531f, 0.065210f, 0.059663f, 0.031146f, 0.008574f, 0.010733f, 0.023060f, 0.025014f, 0.016687f, 0.006465f, -0.007530f, -0.030444f, -0.058769f, -0.085159f, -0.105870f, -0.119253f, -0.126108f, -0.132952f, -0.145953f, -0.161950f, -0.172937f, -0.176110f, -0.172287f, -0.160154f, -0.140096f, -0.117814f, -0.097309f, -0.076591f, -0.054926f, -0.036201f, -0.021493f, -0.007233f, 0.006947f, 0.017810f, 0.026450f, 0.036880f, 0.047880f, 0.055961f, 0.063286f, 0.072990f, 0.081618f, 0.085458f, 0.087597f, 0.090387f, 0.089833f, 0.084714f, 0.080517f, 0.078723f, 0.074845f, 0.070311f, 0.071284f, 0.075074f, 0.075104f, 0.076588f, 0.086990f, 0.097901f, 0.100583f, 0.107487f, 0.127031f, 0.132157f, 0.094602f, 0.037294f, 0.005325f} + }, + { + { 0.027301f, 0.021738f, -0.081975f, -0.191273f, -0.201656f, -0.093313f, 0.098293f, 0.327814f, 0.523024f, 0.591610f, 0.499519f, 0.308744f, 0.101488f, -0.099663f, -0.304655f, -0.489528f, -0.606885f, -0.646492f, -0.643705f, -0.630992f, -0.609667f, -0.567561f, -0.501376f, -0.418604f, -0.330719f, -0.246456f, -0.165722f, -0.081663f, 0.008736f, 0.100691f, 0.189194f, 0.273485f, 0.352379f, 0.422027f, 0.480102f, 0.526801f, 0.561345f, 0.582237f, 0.590324f, 0.587683f, 0.575450f, 0.555880f, 0.533158f, 0.508979f, 0.481080f, 0.448562f, 0.414355f, 0.380878f, 0.348188f, 0.317304f, 0.289889f, 0.264214f, 0.236745f, 0.207390f, 0.178284f, 0.149119f, 0.118860f, 0.089518f, 0.063222f, 0.038738f, 0.015103f, -0.005639f, -0.022904f, -0.039298f, -0.055077f, -0.067305f, -0.076311f, -0.085345f, -0.093266f, -0.096501f, -0.097512f, -0.100870f, -0.103292f, -0.100064f, -0.097365f, -0.102461f, -0.105454f, -0.089136f, -0.054435f, -0.017187f}, + { 0.027301f, 0.021738f, -0.081975f, -0.191273f, -0.201656f, -0.093313f, 0.098293f, 0.327814f, 0.523024f, 0.591610f, 0.499519f, 0.308744f, 0.101488f, -0.099663f, -0.304655f, -0.489528f, -0.606885f, -0.646492f, -0.643705f, -0.630992f, -0.609667f, -0.567561f, -0.501376f, -0.418604f, -0.330719f, -0.246456f, -0.165722f, -0.081663f, 0.008736f, 0.100691f, 0.189194f, 0.273485f, 0.352379f, 0.422027f, 0.480102f, 0.526801f, 0.561345f, 0.582237f, 0.590324f, 0.587683f, 0.575450f, 0.555880f, 0.533158f, 0.508979f, 0.481080f, 0.448562f, 0.414355f, 0.380878f, 0.348188f, 0.317304f, 0.289889f, 0.264214f, 0.236745f, 0.207390f, 0.178284f, 0.149119f, 0.118860f, 0.089518f, 0.063222f, 0.038738f, 0.015103f, -0.005639f, -0.022904f, -0.039298f, -0.055077f, -0.067305f, -0.076311f, -0.085345f, -0.093266f, -0.096501f, -0.097512f, -0.100870f, -0.103292f, -0.100064f, -0.097365f, -0.102461f, -0.105454f, -0.089136f, -0.054435f, -0.017187f} + } +}; +const float *CRendBin_HOA2_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const float *CRendBin_HOA2_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; + + + +/********************** CRendBin_HOA3_HRIR **********************/ + +const float CRendBin_HOA3_HRIR_latency_s = 0.000020834f; + +/* Sample Rate = 48000 */ + +const int16_t CRendBin_HOA3_HRIR_max_num_iterations_48kHz = 1; +const uint16_t CRendBin_HOA3_HRIR_num_iterations_48kHz[16][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1} }; +const uint16_t CRendBin_HOA3_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS] = {0, 0}; +const uint16_t CRendBin_HOA3_HRIR_pIndex_frequency_max_48kHz[16][BINAURAL_CHANNELS][1]={{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}}}; +const uint16_t CRendBin_HOA3_HRIR_index_frequency_max_diffuse_48kHz = 0; +const float CRendBin_HOA3_HRIR_inv_diffuse_weight_48kHz[16]={0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f}; +const uint16_t *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const float CRendBin_HOA3_HRIR_coeff_re_48kHz[16][BINAURAL_CHANNELS][240]={ + { + {0.975460f, 0.823508f, 0.578722f, 0.311394f, 0.071393f, -0.117298f, -0.265803f, -0.406443f, -0.536876f, -0.603591f, -0.568995f, -0.446021f, -0.232011f, 0.098533f, 0.446049f, 0.539124f, 0.219489f, -0.255318f, -0.399037f, -0.041354f, 0.472264f, 0.693368f, 0.533266f, 0.219305f, -0.059008f, -0.291241f, -0.505715f, -0.670083f, -0.755827f, -0.790827f, -0.808813f, -0.807132f, -0.777516f, -0.733727f, -0.690346f, -0.645074f, -0.594162f, -0.543258f, -0.496359f, -0.450603f, -0.404959f, -0.361817f, -0.320310f, -0.277796f, -0.235759f, -0.196817f, -0.159540f, -0.122007f, -0.085990f, -0.053099f, -0.021484f, 0.010278f, 0.040672f, 0.068775f, 0.095789f, 0.121856f, 0.145524f, 0.166807f, 0.187076f, 0.206251f, 0.223418f, 0.239269f, 0.254992f, 0.270072f, 0.283633f, 0.296367f, 0.309129f, 0.321380f, 0.332609f, 0.343518f, 0.354653f, 0.365577f, 0.376080f, 0.386687f, 0.397603f, 0.408487f, 0.419268f, 0.430118f, 0.440990f, 0.451887f, 0.462914f, 0.473622f, 0.483318f, 0.492236f, 0.501131f, 0.509707f, 0.516930f, 0.522835f, 0.528471f, 0.534052f, 0.538627f, 0.541575f, 0.543261f, 0.544286f, 0.544970f, 0.545324f, + 0.544992f, 0.543702f, 0.542083f, 0.541321f, 0.541767f, 0.542678f, 0.543474f, 0.544468f, 0.546285f, 0.549302f, 0.553570f, 0.558668f, 0.563836f, 0.568775f, 0.574014f, 0.580118f, 0.586957f, 0.594005f, 0.600840f, 0.607125f, 0.612700f, 0.617868f, 0.623088f, 0.628356f, 0.633282f, 0.637656f, 0.641523f, 0.644919f, 0.647931f, 0.650762f, 0.653419f, 0.655595f, 0.657072f, 0.657932f, 0.658320f, 0.658353f, 0.658263f, 0.658277f, 0.658369f, 0.658425f, 0.658492f, 0.658661f, 0.658936f, 0.659454f, 0.660549f, 0.662412f, 0.664935f, 0.667968f, 0.671455f, 0.675277f, 0.679269f, 0.683383f, 0.687622f, 0.691852f, 0.695884f, 0.699596f, 0.702892f, 0.705658f, 0.707869f, 0.709572f, 0.710785f, 0.711543f, 0.711953f, 0.712094f, 0.711995f, 0.711765f, 0.711575f, 0.711499f, 0.711595f, 0.712021f, 0.712800f, 0.713666f, 0.714410f, 0.715098f, 0.715743f, 0.716167f, 0.716376f, 0.716567f, 0.716703f, 0.716617f, 0.716501f, 0.716656f, 0.716977f, 0.717361f, 0.718171f, 0.719629f, 0.721375f, 0.723265f, 0.725713f, 0.728693f, 0.731584f, 0.734403f, 0.737690f, 0.741092f, 0.743862f, 0.746530f, + 0.749856f, 0.752896f, 0.754767f, 0.756924f, 0.760408f, 0.763073f, 0.763626f, 0.765163f, 0.769439f, 0.771950f, 0.769853f, 0.769580f, 0.776657f, 0.782626f, 0.774831f, 0.756861f, 0.745683f, 0.748813f, 0.757334f, 0.761317f, 0.758260f, 0.746087f, 0.724051f, 0.704063f, 0.704633f, 0.725907f, 0.744126f, 0.739878f, 0.720948f, 0.707668f, 0.705590f, 0.705432f, 0.704944f, 0.716791f, 0.751654f, 0.801379f, 0.844163f, 0.864649f, 0.865574f, 0.859719f, 0.854548f, 0.849005f, 0.842929f, 0.840816f, 0.842745f, 0.839787f, 0.826402f, 0.812303f}, + {0.975460f, 0.823508f, 0.578722f, 0.311394f, 0.071393f, -0.117298f, -0.265803f, -0.406443f, -0.536876f, -0.603591f, -0.568995f, -0.446021f, -0.232011f, 0.098533f, 0.446049f, 0.539124f, 0.219489f, -0.255318f, -0.399037f, -0.041354f, 0.472264f, 0.693368f, 0.533266f, 0.219305f, -0.059008f, -0.291241f, -0.505715f, -0.670083f, -0.755827f, -0.790827f, -0.808813f, -0.807132f, -0.777516f, -0.733727f, -0.690346f, -0.645074f, -0.594162f, -0.543258f, -0.496359f, -0.450603f, -0.404959f, -0.361817f, -0.320310f, -0.277796f, -0.235759f, -0.196817f, -0.159540f, -0.122007f, -0.085990f, -0.053099f, -0.021484f, 0.010278f, 0.040672f, 0.068775f, 0.095789f, 0.121856f, 0.145524f, 0.166807f, 0.187076f, 0.206251f, 0.223418f, 0.239269f, 0.254992f, 0.270072f, 0.283633f, 0.296367f, 0.309129f, 0.321380f, 0.332609f, 0.343518f, 0.354653f, 0.365577f, 0.376080f, 0.386687f, 0.397603f, 0.408487f, 0.419268f, 0.430118f, 0.440990f, 0.451887f, 0.462914f, 0.473622f, 0.483318f, 0.492236f, 0.501131f, 0.509707f, 0.516930f, 0.522835f, 0.528471f, 0.534052f, 0.538627f, 0.541575f, 0.543261f, 0.544286f, 0.544970f, 0.545324f, + 0.544992f, 0.543702f, 0.542083f, 0.541321f, 0.541767f, 0.542678f, 0.543474f, 0.544468f, 0.546285f, 0.549302f, 0.553570f, 0.558668f, 0.563836f, 0.568775f, 0.574014f, 0.580118f, 0.586957f, 0.594005f, 0.600840f, 0.607125f, 0.612700f, 0.617868f, 0.623088f, 0.628356f, 0.633282f, 0.637656f, 0.641523f, 0.644919f, 0.647931f, 0.650762f, 0.653419f, 0.655595f, 0.657072f, 0.657932f, 0.658320f, 0.658353f, 0.658263f, 0.658277f, 0.658369f, 0.658425f, 0.658492f, 0.658661f, 0.658936f, 0.659454f, 0.660549f, 0.662412f, 0.664935f, 0.667968f, 0.671455f, 0.675277f, 0.679269f, 0.683383f, 0.687622f, 0.691852f, 0.695884f, 0.699596f, 0.702892f, 0.705658f, 0.707869f, 0.709572f, 0.710785f, 0.711543f, 0.711953f, 0.712094f, 0.711995f, 0.711765f, 0.711575f, 0.711499f, 0.711595f, 0.712021f, 0.712800f, 0.713666f, 0.714410f, 0.715098f, 0.715743f, 0.716167f, 0.716376f, 0.716567f, 0.716703f, 0.716617f, 0.716501f, 0.716656f, 0.716977f, 0.717361f, 0.718171f, 0.719629f, 0.721375f, 0.723265f, 0.725713f, 0.728693f, 0.731584f, 0.734403f, 0.737690f, 0.741092f, 0.743862f, 0.746530f, + 0.749856f, 0.752896f, 0.754767f, 0.756924f, 0.760408f, 0.763073f, 0.763626f, 0.765163f, 0.769439f, 0.771950f, 0.769853f, 0.769580f, 0.776657f, 0.782626f, 0.774831f, 0.756861f, 0.745683f, 0.748813f, 0.757334f, 0.761317f, 0.758260f, 0.746087f, 0.724051f, 0.704063f, 0.704633f, 0.725907f, 0.744126f, 0.739878f, 0.720948f, 0.707668f, 0.705590f, 0.705432f, 0.704944f, 0.716791f, 0.751654f, 0.801379f, 0.844163f, 0.864649f, 0.865574f, 0.859719f, 0.854548f, 0.849005f, 0.842929f, 0.840816f, 0.842745f, 0.839787f, 0.826402f, 0.812303f} + }, + { + {0.073227f, 0.301823f, 0.659487f, 0.955673f, 1.013690f, 0.793634f, 0.374105f, -0.142456f, -0.636566f, -0.963913f, -1.063402f, -1.003613f, -0.793969f, -0.284345f, 0.500040f, 1.037338f, 0.731315f, -0.256929f, -0.976234f, -0.710231f, 0.228481f, 0.963086f, 1.064126f, 0.788617f, 0.498005f, 0.250379f, -0.019938f, -0.265502f, -0.411395f, -0.490847f, -0.571594f, -0.649046f, -0.690175f, -0.706288f, -0.723736f, -0.737713f, -0.735526f, -0.724667f, -0.712804f, -0.692713f, -0.661167f, -0.626102f, -0.589545f, -0.546090f, -0.498002f, -0.452447f, -0.407806f, -0.359001f, -0.309737f, -0.266056f, -0.225762f, -0.184774f, -0.145070f, -0.108495f, -0.071916f, -0.033988f, 0.002132f, 0.035682f, 0.069246f, 0.102139f, 0.131153f, 0.156988f, 0.182356f, 0.205965f, 0.225206f, 0.241562f, 0.257404f, 0.271324f, 0.281570f, 0.289838f, 0.297808f, 0.304325f, 0.308777f, 0.312991f, 0.318081f, 0.323338f, 0.328814f, 0.335493f, 0.343315f, 0.351924f, 0.361990f, 0.373445f, 0.384675f, 0.395327f, 0.406987f, 0.419758f, 0.431579f, 0.441848f, 0.452193f, 0.463217f, 0.473985f, 0.484732f, 0.496782f, 0.510255f, 0.524670f, 0.540714f, + 0.558946f, 0.578263f, 0.597653f, 0.617532f, 0.637778f, 0.656691f, 0.673126f, 0.687434f, 0.699645f, 0.708958f, 0.715168f, 0.718470f, 0.718323f, 0.714568f, 0.708854f, 0.703133f, 0.697784f, 0.692574f, 0.687835f, 0.683584f, 0.679336f, 0.675668f, 0.674108f, 0.674971f, 0.677066f, 0.679457f, 0.681721f, 0.683072f, 0.683153f, 0.682996f, 0.683558f, 0.684336f, 0.684660f, 0.684936f, 0.685504f, 0.685877f, 0.685935f, 0.686278f, 0.686908f, 0.687209f, 0.687279f, 0.687704f, 0.688320f, 0.688672f, 0.689087f, 0.689985f, 0.691034f, 0.692103f, 0.693870f, 0.696717f, 0.700287f, 0.704592f, 0.710078f, 0.716487f, 0.723147f, 0.730171f, 0.737961f, 0.746101f, 0.754088f, 0.762266f, 0.770876f, 0.779330f, 0.787325f, 0.795322f, 0.803321f, 0.810685f, 0.817438f, 0.824131f, 0.830559f, 0.836142f, 0.841071f, 0.845643f, 0.849388f, 0.852128f, 0.854615f, 0.857157f, 0.859203f, 0.860848f, 0.862840f, 0.864890f, 0.866029f, 0.866351f, 0.866455f, 0.866032f, 0.864930f, 0.864120f, 0.863977f, 0.863628f, 0.863131f, 0.863615f, 0.864728f, 0.865122f, 0.865257f, 0.866254f, 0.867273f, 0.867579f, + 0.868533f, 0.870222f, 0.870634f, 0.870784f, 0.873682f, 0.876733f, 0.875499f, 0.874870f, 0.881460f, 0.887147f, 0.882040f, 0.879821f, 0.897958f, 0.915002f, 0.891682f, 0.839628f, 0.817204f, 0.843673f, 0.874820f, 0.884019f, 0.901906f, 0.940936f, 0.947666f, 0.883159f, 0.797756f, 0.768151f, 0.798253f, 0.832623f, 0.835284f, 0.812421f, 0.787095f, 0.782104f, 0.791333f, 0.748682f, 0.584396f, 0.345257f, 0.192332f, 0.226244f, 0.368019f, 0.468300f, 0.484212f, 0.482396f, 0.505439f, 0.513973f, 0.457796f, 0.345461f, 0.230189f, 0.161014f}, + {-0.073227f, -0.301823f, -0.659487f, -0.955673f, -1.013690f, -0.793634f, -0.374105f, 0.142456f, 0.636566f, 0.963913f, 1.063402f, 1.003613f, 0.793969f, 0.284345f, -0.500040f, -1.037338f, -0.731315f, 0.256929f, 0.976234f, 0.710231f, -0.228481f, -0.963086f, -1.064126f, -0.788617f, -0.498005f, -0.250379f, 0.019938f, 0.265502f, 0.411395f, 0.490847f, 0.571594f, 0.649046f, 0.690175f, 0.706288f, 0.723736f, 0.737713f, 0.735526f, 0.724667f, 0.712804f, 0.692713f, 0.661167f, 0.626102f, 0.589545f, 0.546090f, 0.498002f, 0.452447f, 0.407806f, 0.359001f, 0.309737f, 0.266056f, 0.225762f, 0.184774f, 0.145070f, 0.108495f, 0.071916f, 0.033988f, -0.002132f, -0.035682f, -0.069246f, -0.102139f, -0.131153f, -0.156988f, -0.182356f, -0.205965f, -0.225206f, -0.241562f, -0.257404f, -0.271324f, -0.281570f, -0.289838f, -0.297808f, -0.304325f, -0.308777f, -0.312991f, -0.318081f, -0.323338f, -0.328814f, -0.335493f, -0.343315f, -0.351924f, -0.361990f, -0.373445f, -0.384675f, -0.395327f, -0.406987f, -0.419758f, -0.431579f, -0.441848f, -0.452193f, -0.463217f, -0.473985f, -0.484732f, -0.496782f, -0.510255f, -0.524670f, -0.540714f, + -0.558946f, -0.578263f, -0.597653f, -0.617532f, -0.637778f, -0.656691f, -0.673126f, -0.687434f, -0.699645f, -0.708958f, -0.715168f, -0.718470f, -0.718323f, -0.714568f, -0.708854f, -0.703133f, -0.697784f, -0.692574f, -0.687835f, -0.683584f, -0.679336f, -0.675668f, -0.674108f, -0.674971f, -0.677066f, -0.679457f, -0.681721f, -0.683072f, -0.683153f, -0.682996f, -0.683558f, -0.684336f, -0.684660f, -0.684936f, -0.685504f, -0.685877f, -0.685935f, -0.686278f, -0.686908f, -0.687209f, -0.687279f, -0.687704f, -0.688320f, -0.688672f, -0.689087f, -0.689985f, -0.691034f, -0.692103f, -0.693870f, -0.696717f, -0.700287f, -0.704592f, -0.710078f, -0.716487f, -0.723147f, -0.730171f, -0.737961f, -0.746101f, -0.754088f, -0.762266f, -0.770876f, -0.779330f, -0.787325f, -0.795322f, -0.803321f, -0.810685f, -0.817438f, -0.824131f, -0.830559f, -0.836142f, -0.841071f, -0.845643f, -0.849388f, -0.852128f, -0.854615f, -0.857157f, -0.859203f, -0.860848f, -0.862840f, -0.864890f, -0.866029f, -0.866351f, -0.866455f, -0.866032f, -0.864930f, -0.864120f, -0.863977f, -0.863628f, -0.863131f, -0.863615f, -0.864728f, -0.865122f, -0.865257f, -0.866254f, -0.867273f, -0.867579f, + -0.868533f, -0.870222f, -0.870634f, -0.870784f, -0.873682f, -0.876733f, -0.875499f, -0.874870f, -0.881460f, -0.887147f, -0.882040f, -0.879821f, -0.897958f, -0.915002f, -0.891682f, -0.839628f, -0.817204f, -0.843673f, -0.874820f, -0.884019f, -0.901906f, -0.940936f, -0.947666f, -0.883159f, -0.797756f, -0.768151f, -0.798253f, -0.832623f, -0.835284f, -0.812421f, -0.787095f, -0.782104f, -0.791333f, -0.748682f, -0.584396f, -0.345257f, -0.192332f, -0.226244f, -0.368019f, -0.468300f, -0.484212f, -0.482396f, -0.505439f, -0.513973f, -0.457796f, -0.345461f, -0.230189f, -0.161014f} + }, + { + {0.113201f, 0.111255f, 0.062496f, -0.036435f, -0.115479f, -0.108810f, -0.030648f, 0.049302f, 0.081380f, 0.064091f, 0.017171f, -0.040018f, -0.081158f, -0.072117f, -0.003900f, 0.074532f, 0.085464f, 0.008934f, -0.074247f, -0.059957f, 0.058118f, 0.176907f, 0.199559f, 0.129266f, 0.036145f, -0.031274f, -0.072728f, -0.101353f, -0.120897f, -0.133619f, -0.144152f, -0.151623f, -0.151014f, -0.142713f, -0.132576f, -0.124993f, -0.122480f, -0.128384f, -0.143590f, -0.163192f, -0.181024f, -0.195180f, -0.206462f, -0.214744f, -0.219693f, -0.222384f, -0.223825f, -0.223517f, -0.220501f, -0.214073f, -0.202961f, -0.185599f, -0.161639f, -0.131885f, -0.096760f, -0.056217f, -0.010994f, 0.037427f, 0.088132f, 0.140996f, 0.195587f, 0.250830f, 0.305827f, 0.360100f, 0.412716f, 0.461882f, 0.505735f, 0.543017f, 0.572658f, 0.593353f, 0.604059f, 0.604476f, 0.594671f, 0.574892f, 0.546245f, 0.510837f, 0.470526f, 0.426227f, 0.379201f, 0.332145f, 0.287708f, 0.246390f, 0.207286f, 0.170835f, 0.139340f, 0.114215f, 0.093949f, 0.075976f, 0.060036f, 0.048360f, 0.042554f, 0.041557f, 0.043175f, 0.046486f, 0.051934f, 0.059907f, + 0.070097f, 0.081683f, 0.093339f, 0.103485f, 0.111132f, 0.116280f, 0.119264f, 0.120059f, 0.118158f, 0.112647f, 0.102730f, 0.088852f, 0.072929f, 0.056776f, 0.040720f, 0.024308f, 0.007601f, -0.008889f, -0.024661f, -0.038942f, -0.050666f, -0.059218f, -0.064521f, -0.066366f, -0.064544f, -0.059537f, -0.052086f, -0.042363f, -0.030480f, -0.017295f, -0.003822f, 0.009499f, 0.022278f, 0.033878f, 0.044118f, 0.053185f, 0.060622f, 0.065726f, 0.068967f, 0.071661f, 0.074575f, 0.078214f, 0.083614f, 0.091159f, 0.099538f, 0.107386f, 0.114815f, 0.122154f, 0.128784f, 0.134356f, 0.139373f, 0.143742f, 0.146631f, 0.148142f, 0.149165f, 0.149684f, 0.149308f, 0.148792f, 0.148973f, 0.149269f, 0.149092f, 0.149111f, 0.149527f, 0.149268f, 0.148148f, 0.147256f, 0.146477f, 0.144536f, 0.141617f, 0.138828f, 0.135709f, 0.131550f, 0.127734f, 0.125499f, 0.123615f, 0.121214f, 0.119758f, 0.119680f, 0.119076f, 0.117474f, 0.116107f, 0.113750f, 0.107932f, 0.099801f, 0.091667f, 0.081824f, 0.068369f, 0.054219f, 0.041640f, 0.027646f, 0.011112f, -0.003667f, -0.015819f, -0.029675f, -0.044315f, -0.054790f, + -0.064326f, -0.078448f, -0.090599f, -0.094677f, -0.102373f, -0.121236f, -0.132668f, -0.126597f, -0.131229f, -0.161295f, -0.174763f, -0.147871f, -0.146506f, -0.225759f, -0.299779f, -0.239299f, -0.079199f, 0.013784f, -0.018892f, -0.072010f, -0.080447f, -0.112933f, -0.204539f, -0.250865f, -0.164556f, -0.022383f, 0.043514f, 0.019856f, -0.010446f, -0.004334f, 0.005958f, -0.023233f, -0.099252f, -0.180595f, -0.191231f, -0.093061f, 0.041294f, 0.085841f, 0.010948f, -0.083414f, -0.105347f, -0.076840f, -0.067493f, -0.084603f, -0.084004f, -0.051805f, -0.017571f, -0.002347f}, + {0.113201f, 0.111255f, 0.062496f, -0.036435f, -0.115479f, -0.108810f, -0.030648f, 0.049302f, 0.081380f, 0.064091f, 0.017171f, -0.040018f, -0.081158f, -0.072117f, -0.003900f, 0.074532f, 0.085464f, 0.008934f, -0.074247f, -0.059957f, 0.058118f, 0.176907f, 0.199559f, 0.129266f, 0.036145f, -0.031274f, -0.072728f, -0.101353f, -0.120897f, -0.133619f, -0.144152f, -0.151623f, -0.151014f, -0.142713f, -0.132576f, -0.124993f, -0.122480f, -0.128384f, -0.143590f, -0.163192f, -0.181024f, -0.195180f, -0.206462f, -0.214744f, -0.219693f, -0.222384f, -0.223825f, -0.223517f, -0.220501f, -0.214073f, -0.202961f, -0.185599f, -0.161639f, -0.131885f, -0.096760f, -0.056217f, -0.010994f, 0.037427f, 0.088132f, 0.140996f, 0.195587f, 0.250830f, 0.305827f, 0.360100f, 0.412716f, 0.461882f, 0.505735f, 0.543017f, 0.572658f, 0.593353f, 0.604059f, 0.604476f, 0.594671f, 0.574892f, 0.546245f, 0.510837f, 0.470526f, 0.426227f, 0.379201f, 0.332145f, 0.287708f, 0.246390f, 0.207286f, 0.170835f, 0.139340f, 0.114215f, 0.093949f, 0.075976f, 0.060036f, 0.048360f, 0.042554f, 0.041557f, 0.043175f, 0.046486f, 0.051934f, 0.059907f, + 0.070097f, 0.081683f, 0.093339f, 0.103485f, 0.111132f, 0.116280f, 0.119264f, 0.120059f, 0.118158f, 0.112647f, 0.102730f, 0.088852f, 0.072929f, 0.056776f, 0.040720f, 0.024308f, 0.007601f, -0.008889f, -0.024661f, -0.038942f, -0.050666f, -0.059218f, -0.064521f, -0.066366f, -0.064544f, -0.059537f, -0.052086f, -0.042363f, -0.030480f, -0.017295f, -0.003822f, 0.009499f, 0.022278f, 0.033878f, 0.044118f, 0.053185f, 0.060622f, 0.065726f, 0.068967f, 0.071661f, 0.074575f, 0.078214f, 0.083614f, 0.091159f, 0.099538f, 0.107386f, 0.114815f, 0.122154f, 0.128784f, 0.134356f, 0.139373f, 0.143742f, 0.146631f, 0.148142f, 0.149165f, 0.149684f, 0.149308f, 0.148792f, 0.148973f, 0.149269f, 0.149092f, 0.149111f, 0.149527f, 0.149268f, 0.148148f, 0.147256f, 0.146477f, 0.144536f, 0.141617f, 0.138828f, 0.135709f, 0.131550f, 0.127734f, 0.125499f, 0.123615f, 0.121214f, 0.119758f, 0.119680f, 0.119076f, 0.117474f, 0.116107f, 0.113750f, 0.107932f, 0.099801f, 0.091667f, 0.081824f, 0.068369f, 0.054219f, 0.041640f, 0.027646f, 0.011112f, -0.003667f, -0.015819f, -0.029675f, -0.044315f, -0.054790f, + -0.064326f, -0.078448f, -0.090599f, -0.094677f, -0.102373f, -0.121236f, -0.132668f, -0.126597f, -0.131229f, -0.161295f, -0.174763f, -0.147871f, -0.146506f, -0.225759f, -0.299779f, -0.239299f, -0.079199f, 0.013784f, -0.018892f, -0.072010f, -0.080447f, -0.112933f, -0.204539f, -0.250865f, -0.164556f, -0.022383f, 0.043514f, 0.019856f, -0.010446f, -0.004334f, 0.005958f, -0.023233f, -0.099252f, -0.180595f, -0.191231f, -0.093061f, 0.041294f, 0.085841f, 0.010948f, -0.083414f, -0.105347f, -0.076840f, -0.067493f, -0.084603f, -0.084004f, -0.051805f, -0.017571f, -0.002347f} + }, + { + {0.054055f, 0.080144f, 0.095193f, 0.063102f, -0.005644f, -0.052793f, -0.033146f, 0.026919f, 0.054914f, 0.016920f, -0.052950f, -0.110724f, -0.143661f, -0.134100f, -0.045681f, 0.095928f, 0.160690f, 0.047402f, -0.151768f, -0.216602f, -0.050846f, 0.209112f, 0.366520f, 0.368777f, 0.294144f, 0.206763f, 0.103814f, -0.023703f, -0.154443f, -0.267781f, -0.365935f, -0.454372f, -0.526514f, -0.574683f, -0.599022f, -0.601726f, -0.583803f, -0.549027f, -0.503573f, -0.451857f, -0.396930f, -0.342314f, -0.289887f, -0.238831f, -0.188998f, -0.142181f, -0.098840f, -0.057157f, -0.016442f, 0.021589f, 0.055280f, 0.083963f, 0.106624f, 0.122561f, 0.133456f, 0.142639f, 0.152376f, 0.163270f, 0.175500f, 0.188983f, 0.202812f, 0.215870f, 0.227814f, 0.238821f, 0.248889f, 0.258049f, 0.266875f, 0.276085f, 0.285672f, 0.294836f, 0.302892f, 0.309831f, 0.315582f, 0.319103f, 0.319043f, 0.315165f, 0.308042f, 0.297413f, 0.282312f, 0.263067f, 0.241504f, 0.218613f, 0.193711f, 0.166772f, 0.139868f, 0.115038f, 0.092093f, 0.069831f, 0.048202f, 0.027768f, 0.007904f, -0.012801f, -0.034642f, -0.056589f, -0.077960f, -0.099200f, + -0.120729f, -0.141741f, -0.160599f, -0.176129f, -0.188274f, -0.197469f, -0.203521f, -0.205315f, -0.201874f, -0.193589f, -0.181986f, -0.168217f, -0.152170f, -0.133210f, -0.111470f, -0.088281f, -0.065547f, -0.044626f, -0.025388f, -0.006381f, 0.013678f, 0.034496f, 0.054455f, 0.072021f, 0.086678f, 0.098972f, 0.110224f, 0.121865f, 0.134429f, 0.147294f, 0.159646f, 0.171334f, 0.182686f, 0.194160f, 0.206441f, 0.220224f, 0.235532f, 0.251719f, 0.268159f, 0.284460f, 0.300193f, 0.315099f, 0.329380f, 0.343193f, 0.356104f, 0.367475f, 0.376942f, 0.384199f, 0.388905f, 0.391168f, 0.391540f, 0.390411f, 0.388001f, 0.384777f, 0.381131f, 0.376983f, 0.372381f, 0.367930f, 0.364049f, 0.360653f, 0.358088f, 0.357239f, 0.358255f, 0.360393f, 0.363365f, 0.367396f, 0.371992f, 0.376223f, 0.380072f, 0.384061f, 0.388180f, 0.392520f, 0.397869f, 0.404370f, 0.411044f, 0.417566f, 0.424627f, 0.431988f, 0.438611f, 0.444798f, 0.451419f, 0.457489f, 0.461517f, 0.464027f, 0.465670f, 0.465002f, 0.461321f, 0.456568f, 0.451550f, 0.444528f, 0.435774f, 0.428002f, 0.420951f, 0.412298f, 0.403657f, 0.397481f, + 0.390665f, 0.381040f, 0.374155f, 0.371854f, 0.364940f, 0.351783f, 0.346842f, 0.351883f, 0.344736f, 0.322593f, 0.319327f, 0.340524f, 0.329255f, 0.258906f, 0.211144f, 0.273202f, 0.394219f, 0.448480f, 0.417577f, 0.391001f, 0.396218f, 0.365475f, 0.291216f, 0.274724f, 0.365856f, 0.472436f, 0.497448f, 0.469302f, 0.464924f, 0.487653f, 0.496252f, 0.484901f, 0.459066f, 0.391143f, 0.277817f, 0.195678f, 0.219900f, 0.314264f, 0.374360f, 0.364906f, 0.345945f, 0.365513f, 0.393896f, 0.386513f, 0.362639f, 0.381476f, 0.456585f, 0.528305f}, + {0.054055f, 0.080144f, 0.095193f, 0.063102f, -0.005644f, -0.052793f, -0.033146f, 0.026919f, 0.054914f, 0.016920f, -0.052950f, -0.110724f, -0.143661f, -0.134100f, -0.045681f, 0.095928f, 0.160690f, 0.047402f, -0.151768f, -0.216602f, -0.050846f, 0.209112f, 0.366520f, 0.368777f, 0.294144f, 0.206763f, 0.103814f, -0.023703f, -0.154443f, -0.267781f, -0.365935f, -0.454372f, -0.526514f, -0.574683f, -0.599022f, -0.601726f, -0.583803f, -0.549027f, -0.503573f, -0.451857f, -0.396930f, -0.342314f, -0.289887f, -0.238831f, -0.188998f, -0.142181f, -0.098840f, -0.057157f, -0.016442f, 0.021589f, 0.055280f, 0.083963f, 0.106624f, 0.122561f, 0.133456f, 0.142639f, 0.152376f, 0.163270f, 0.175500f, 0.188983f, 0.202812f, 0.215870f, 0.227814f, 0.238821f, 0.248889f, 0.258049f, 0.266875f, 0.276085f, 0.285672f, 0.294836f, 0.302892f, 0.309831f, 0.315582f, 0.319103f, 0.319043f, 0.315165f, 0.308042f, 0.297413f, 0.282312f, 0.263067f, 0.241504f, 0.218613f, 0.193711f, 0.166772f, 0.139868f, 0.115038f, 0.092093f, 0.069831f, 0.048202f, 0.027768f, 0.007904f, -0.012801f, -0.034642f, -0.056589f, -0.077960f, -0.099200f, + -0.120729f, -0.141741f, -0.160599f, -0.176129f, -0.188274f, -0.197469f, -0.203521f, -0.205315f, -0.201874f, -0.193589f, -0.181986f, -0.168217f, -0.152170f, -0.133210f, -0.111470f, -0.088281f, -0.065547f, -0.044626f, -0.025388f, -0.006381f, 0.013678f, 0.034496f, 0.054455f, 0.072021f, 0.086678f, 0.098972f, 0.110224f, 0.121865f, 0.134429f, 0.147294f, 0.159646f, 0.171334f, 0.182686f, 0.194160f, 0.206441f, 0.220224f, 0.235532f, 0.251719f, 0.268159f, 0.284460f, 0.300193f, 0.315099f, 0.329380f, 0.343193f, 0.356104f, 0.367475f, 0.376942f, 0.384199f, 0.388905f, 0.391168f, 0.391540f, 0.390411f, 0.388001f, 0.384777f, 0.381131f, 0.376983f, 0.372381f, 0.367930f, 0.364049f, 0.360653f, 0.358088f, 0.357239f, 0.358255f, 0.360393f, 0.363365f, 0.367396f, 0.371992f, 0.376223f, 0.380072f, 0.384061f, 0.388180f, 0.392520f, 0.397869f, 0.404370f, 0.411044f, 0.417566f, 0.424627f, 0.431988f, 0.438611f, 0.444798f, 0.451419f, 0.457489f, 0.461517f, 0.464027f, 0.465670f, 0.465002f, 0.461321f, 0.456568f, 0.451550f, 0.444528f, 0.435774f, 0.428002f, 0.420951f, 0.412298f, 0.403657f, 0.397481f, + 0.390665f, 0.381040f, 0.374155f, 0.371854f, 0.364940f, 0.351783f, 0.346842f, 0.351883f, 0.344736f, 0.322593f, 0.319327f, 0.340524f, 0.329255f, 0.258906f, 0.211144f, 0.273202f, 0.394219f, 0.448480f, 0.417577f, 0.391001f, 0.396218f, 0.365475f, 0.291216f, 0.274724f, 0.365856f, 0.472436f, 0.497448f, 0.469302f, 0.464924f, 0.487653f, 0.496252f, 0.484901f, 0.459066f, 0.391143f, 0.277817f, 0.195678f, 0.219900f, 0.314264f, 0.374360f, 0.364906f, 0.345945f, 0.365513f, 0.393896f, 0.386513f, 0.362639f, 0.381476f, 0.456585f, 0.528305f} + }, + { + {0.017978f, 0.007378f, 0.003418f, 0.018456f, 0.041119f, 0.049699f, 0.045284f, 0.053666f, 0.084664f, 0.105401f, 0.067063f, -0.046619f, -0.190974f, -0.265169f, -0.173793f, 0.058765f, 0.244978f, 0.189686f, -0.078447f, -0.301201f, -0.263931f, -0.016751f, 0.224527f, 0.329934f, 0.329708f, 0.288913f, 0.216901f, 0.107803f, -0.012593f, -0.114794f, -0.198221f, -0.272534f, -0.334167f, -0.377176f, -0.406071f, -0.424824f, -0.427385f, -0.407924f, -0.370647f, -0.324637f, -0.276593f, -0.230996f, -0.190824f, -0.155968f, -0.124589f, -0.095978f, -0.069693f, -0.043868f, -0.017228f, 0.008963f, 0.032944f, 0.054527f, 0.073798f, 0.090002f, 0.103058f, 0.114400f, 0.125425f, 0.136553f, 0.148113f, 0.160641f, 0.174135f, 0.188230f, 0.203013f, 0.218608f, 0.234347f, 0.249425f, 0.264041f, 0.278849f, 0.293615f, 0.307424f, 0.320009f, 0.331840f, 0.342789f, 0.351655f, 0.357399f, 0.360118f, 0.360077f, 0.356398f, 0.347903f, 0.335144f, 0.320169f, 0.303908f, 0.285237f, 0.263508f, 0.240490f, 0.218250f, 0.196115f, 0.171654f, 0.144348f, 0.116453f, 0.090117f, 0.065280f, 0.040995f, 0.017579f, -0.003437f, -0.020932f, + -0.035118f, -0.047019f, -0.057328f, -0.065776f, -0.071630f, -0.074772f, -0.075997f, -0.076290f, -0.076370f, -0.076995f, -0.078917f, -0.082069f, -0.085393f, -0.087934f, -0.089781f, -0.091750f, -0.094623f, -0.098708f, -0.103476f, -0.107500f, -0.109441f, -0.109318f, -0.108409f, -0.108026f, -0.108758f, -0.110515f, -0.112612f, -0.114027f, -0.114146f, -0.113106f, -0.111149f, -0.108063f, -0.103456f, -0.097000f, -0.088276f, -0.077056f, -0.063885f, -0.049838f, -0.035764f, -0.022273f, -0.010091f, 0.000305f, 0.008995f, 0.015941f, 0.020499f, 0.022137f, 0.021019f, 0.017496f, 0.011856f, 0.004888f, -0.002191f, -0.008658f, -0.014359f, -0.019010f, -0.022276f, -0.024240f, -0.024935f, -0.023872f, -0.020695f, -0.015538f, -0.008189f, 0.002002f, 0.014912f, 0.029556f, 0.045382f, 0.062300f, 0.079546f, 0.096100f, 0.111896f, 0.127148f, 0.141252f, 0.153795f, 0.165494f, 0.176815f, 0.187180f, 0.196581f, 0.206032f, 0.215728f, 0.224988f, 0.234090f, 0.243604f, 0.252464f, 0.259543f, 0.265839f, 0.272231f, 0.277374f, 0.280682f, 0.284095f, 0.288228f, 0.291051f, 0.292390f, 0.294354f, 0.296334f, 0.296199f, 0.295740f, 0.297143f, + 0.297187f, 0.294165f, 0.293865f, 0.297697f, 0.296410f, 0.289007f, 0.289718f, 0.298972f, 0.294490f, 0.274911f, 0.273741f, 0.293559f, 0.276485f, 0.199476f, 0.147802f, 0.208854f, 0.331440f, 0.389914f, 0.361504f, 0.329091f, 0.323542f, 0.290902f, 0.227246f, 0.217065f, 0.296479f, 0.385838f, 0.408311f, 0.387215f, 0.378506f, 0.385103f, 0.382955f, 0.362880f, 0.310127f, 0.213082f, 0.126049f, 0.145716f, 0.279676f, 0.409157f, 0.433671f, 0.389293f, 0.369545f, 0.390925f, 0.404683f, 0.394197f, 0.383439f, 0.373704f, 0.344838f, 0.310855f}, + {-0.017978f, -0.007378f, -0.003418f, -0.018456f, -0.041119f, -0.049699f, -0.045284f, -0.053666f, -0.084664f, -0.105401f, -0.067063f, 0.046619f, 0.190974f, 0.265169f, 0.173793f, -0.058765f, -0.244978f, -0.189686f, 0.078447f, 0.301201f, 0.263931f, 0.016751f, -0.224527f, -0.329934f, -0.329708f, -0.288913f, -0.216901f, -0.107803f, 0.012593f, 0.114794f, 0.198221f, 0.272534f, 0.334167f, 0.377176f, 0.406071f, 0.424824f, 0.427385f, 0.407924f, 0.370647f, 0.324637f, 0.276593f, 0.230996f, 0.190824f, 0.155968f, 0.124589f, 0.095978f, 0.069693f, 0.043868f, 0.017228f, -0.008963f, -0.032944f, -0.054527f, -0.073798f, -0.090002f, -0.103058f, -0.114400f, -0.125425f, -0.136553f, -0.148113f, -0.160641f, -0.174135f, -0.188230f, -0.203013f, -0.218608f, -0.234347f, -0.249425f, -0.264041f, -0.278849f, -0.293615f, -0.307424f, -0.320009f, -0.331840f, -0.342789f, -0.351655f, -0.357399f, -0.360118f, -0.360077f, -0.356398f, -0.347903f, -0.335144f, -0.320169f, -0.303908f, -0.285237f, -0.263508f, -0.240490f, -0.218250f, -0.196115f, -0.171654f, -0.144348f, -0.116453f, -0.090117f, -0.065280f, -0.040995f, -0.017579f, 0.003437f, 0.020932f, + 0.035118f, 0.047019f, 0.057328f, 0.065776f, 0.071630f, 0.074772f, 0.075997f, 0.076290f, 0.076370f, 0.076995f, 0.078917f, 0.082069f, 0.085393f, 0.087934f, 0.089781f, 0.091750f, 0.094623f, 0.098708f, 0.103476f, 0.107500f, 0.109441f, 0.109318f, 0.108409f, 0.108026f, 0.108758f, 0.110515f, 0.112612f, 0.114027f, 0.114146f, 0.113106f, 0.111149f, 0.108063f, 0.103456f, 0.097000f, 0.088276f, 0.077056f, 0.063885f, 0.049838f, 0.035764f, 0.022273f, 0.010091f, -0.000305f, -0.008995f, -0.015941f, -0.020499f, -0.022137f, -0.021019f, -0.017496f, -0.011856f, -0.004888f, 0.002191f, 0.008658f, 0.014359f, 0.019010f, 0.022276f, 0.024240f, 0.024935f, 0.023872f, 0.020695f, 0.015538f, 0.008189f, -0.002002f, -0.014912f, -0.029556f, -0.045382f, -0.062300f, -0.079546f, -0.096100f, -0.111896f, -0.127148f, -0.141252f, -0.153795f, -0.165494f, -0.176815f, -0.187180f, -0.196581f, -0.206032f, -0.215728f, -0.224988f, -0.234090f, -0.243604f, -0.252464f, -0.259543f, -0.265839f, -0.272231f, -0.277374f, -0.280682f, -0.284095f, -0.288228f, -0.291051f, -0.292390f, -0.294354f, -0.296334f, -0.296199f, -0.295740f, -0.297143f, + -0.297187f, -0.294165f, -0.293865f, -0.297697f, -0.296410f, -0.289007f, -0.289718f, -0.298972f, -0.294490f, -0.274911f, -0.273741f, -0.293559f, -0.276485f, -0.199476f, -0.147802f, -0.208854f, -0.331440f, -0.389914f, -0.361504f, -0.329091f, -0.323542f, -0.290902f, -0.227246f, -0.217065f, -0.296479f, -0.385838f, -0.408311f, -0.387215f, -0.378506f, -0.385103f, -0.382955f, -0.362880f, -0.310127f, -0.213082f, -0.126049f, -0.145716f, -0.279676f, -0.409157f, -0.433671f, -0.389293f, -0.369545f, -0.390925f, -0.404683f, -0.394197f, -0.383439f, -0.373704f, -0.344838f, -0.310855f} + }, + { + {0.027544f, -0.017341f, -0.023513f, 0.026515f, 0.039947f, -0.034516f, -0.096596f, -0.020772f, 0.151935f, 0.242778f, 0.149801f, -0.044033f, -0.181114f, -0.177468f, -0.055862f, 0.090745f, 0.145910f, 0.053909f, -0.102523f, -0.163455f, -0.067881f, 0.078061f, 0.138424f, 0.098143f, 0.036791f, 0.006996f, 0.000119f, 0.002369f, 0.021565f, 0.059784f, 0.101198f, 0.132385f, 0.151843f, 0.159909f, 0.156211f, 0.145023f, 0.130647f, 0.110287f, 0.079835f, 0.042474f, 0.005390f, -0.027255f, -0.053608f, -0.071675f, -0.081807f, -0.087931f, -0.093657f, -0.099808f, -0.106220f, -0.112687f, -0.117932f, -0.120493f, -0.120521f, -0.118539f, -0.113168f, -0.102044f, -0.084258f, -0.060368f, -0.030901f, 0.003748f, 0.042511f, 0.083811f, 0.126393f, 0.169523f, 0.212498f, 0.254135f, 0.292796f, 0.326898f, 0.355155f, 0.376131f, 0.388053f, 0.389497f, 0.379942f, 0.359534f, 0.328997f, 0.289934f, 0.244331f, 0.193634f, 0.139228f, 0.083598f, 0.029408f, -0.022692f, -0.073695f, -0.123339f, -0.169305f, -0.209948f, -0.246184f, -0.279689f, -0.310546f, -0.337815f, -0.361405f, -0.381914f, -0.399020f, -0.411385f, -0.418144f, -0.419390f, + -0.415008f, -0.404128f, -0.386279f, -0.362312f, -0.333530f, -0.300394f, -0.262664f, -0.220761f, -0.176830f, -0.134417f, -0.096541f, -0.063537f, -0.033190f, -0.003613f, 0.024357f, 0.048059f, 0.065620f, 0.077181f, 0.084404f, 0.089492f, 0.093981f, 0.097804f, 0.099996f, 0.100408f, 0.100059f, 0.100044f, 0.101037f, 0.103570f, 0.107641f, 0.112334f, 0.116752f, 0.120810f, 0.124401f, 0.126672f, 0.126908f, 0.125168f, 0.121503f, 0.115724f, 0.108269f, 0.100065f, 0.091446f, 0.082435f, 0.073719f, 0.065954f, 0.058708f, 0.051452f, 0.044644f, 0.038636f, 0.032761f, 0.026588f, 0.020600f, 0.014885f, 0.008899f, 0.002909f, -0.002242f, -0.006808f, -0.011545f, -0.016005f, -0.019451f, -0.022427f, -0.025359f, -0.027161f, -0.027123f, -0.026184f, -0.024787f, -0.022001f, -0.017911f, -0.013971f, -0.010312f, -0.005846f, -0.000945f, 0.003364f, 0.007981f, 0.014043f, 0.020341f, 0.025721f, 0.031421f, 0.038054f, 0.043780f, 0.047857f, 0.051586f, 0.054231f, 0.053369f, 0.049784f, 0.045976f, 0.040764f, 0.032016f, 0.022151f, 0.013836f, 0.004597f, -0.007321f, -0.018275f, -0.026778f, -0.036758f, -0.048211f, -0.056341f, + -0.062971f, -0.073642f, -0.083668f, -0.086428f, -0.090734f, -0.105031f, -0.114994f, -0.109424f, -0.110454f, -0.134392f, -0.148541f, -0.127696f, -0.121882f, -0.181720f, -0.241824f, -0.189799f, -0.046739f, 0.042939f, 0.016342f, -0.039119f, -0.052732f, -0.073996f, -0.147151f, -0.199696f, -0.145744f, -0.023298f, 0.056543f, 0.050437f, 0.006574f, -0.021832f, -0.037988f, -0.088616f, -0.203471f, -0.330990f, -0.353783f, -0.218264f, -0.032140f, 0.036633f, -0.044084f, -0.147160f, -0.163258f, -0.121115f, -0.105238f, -0.129326f, -0.144788f, -0.128572f, -0.103746f, -0.091528f}, + {-0.027544f, 0.017341f, 0.023513f, -0.026515f, -0.039947f, 0.034516f, 0.096596f, 0.020772f, -0.151935f, -0.242778f, -0.149801f, 0.044033f, 0.181114f, 0.177468f, 0.055862f, -0.090745f, -0.145910f, -0.053909f, 0.102523f, 0.163455f, 0.067881f, -0.078061f, -0.138424f, -0.098143f, -0.036791f, -0.006996f, -0.000119f, -0.002369f, -0.021565f, -0.059784f, -0.101198f, -0.132385f, -0.151843f, -0.159909f, -0.156211f, -0.145023f, -0.130647f, -0.110287f, -0.079835f, -0.042474f, -0.005390f, 0.027255f, 0.053608f, 0.071675f, 0.081807f, 0.087931f, 0.093657f, 0.099808f, 0.106220f, 0.112687f, 0.117932f, 0.120493f, 0.120521f, 0.118539f, 0.113168f, 0.102044f, 0.084258f, 0.060368f, 0.030901f, -0.003748f, -0.042511f, -0.083811f, -0.126393f, -0.169523f, -0.212498f, -0.254135f, -0.292796f, -0.326898f, -0.355155f, -0.376131f, -0.388053f, -0.389497f, -0.379942f, -0.359534f, -0.328997f, -0.289934f, -0.244331f, -0.193634f, -0.139228f, -0.083598f, -0.029408f, 0.022692f, 0.073695f, 0.123339f, 0.169305f, 0.209948f, 0.246184f, 0.279689f, 0.310546f, 0.337815f, 0.361405f, 0.381914f, 0.399020f, 0.411385f, 0.418144f, 0.419390f, + 0.415008f, 0.404128f, 0.386279f, 0.362312f, 0.333530f, 0.300394f, 0.262664f, 0.220761f, 0.176830f, 0.134417f, 0.096541f, 0.063537f, 0.033190f, 0.003613f, -0.024357f, -0.048059f, -0.065620f, -0.077181f, -0.084404f, -0.089492f, -0.093981f, -0.097804f, -0.099996f, -0.100408f, -0.100059f, -0.100044f, -0.101037f, -0.103570f, -0.107641f, -0.112334f, -0.116752f, -0.120810f, -0.124401f, -0.126672f, -0.126908f, -0.125168f, -0.121503f, -0.115724f, -0.108269f, -0.100065f, -0.091446f, -0.082435f, -0.073719f, -0.065954f, -0.058708f, -0.051452f, -0.044644f, -0.038636f, -0.032761f, -0.026588f, -0.020600f, -0.014885f, -0.008899f, -0.002909f, 0.002242f, 0.006808f, 0.011545f, 0.016005f, 0.019451f, 0.022427f, 0.025359f, 0.027161f, 0.027123f, 0.026184f, 0.024787f, 0.022001f, 0.017911f, 0.013971f, 0.010312f, 0.005846f, 0.000945f, -0.003364f, -0.007981f, -0.014043f, -0.020341f, -0.025721f, -0.031421f, -0.038054f, -0.043780f, -0.047857f, -0.051586f, -0.054231f, -0.053369f, -0.049784f, -0.045976f, -0.040764f, -0.032016f, -0.022151f, -0.013836f, -0.004597f, 0.007321f, 0.018275f, 0.026778f, 0.036758f, 0.048211f, 0.056341f, + 0.062971f, 0.073642f, 0.083668f, 0.086428f, 0.090734f, 0.105031f, 0.114994f, 0.109424f, 0.110454f, 0.134392f, 0.148541f, 0.127696f, 0.121882f, 0.181720f, 0.241824f, 0.189799f, 0.046739f, -0.042939f, -0.016342f, 0.039119f, 0.052732f, 0.073996f, 0.147151f, 0.199696f, 0.145744f, 0.023298f, -0.056543f, -0.050437f, -0.006574f, 0.021832f, 0.037988f, 0.088616f, 0.203471f, 0.330990f, 0.353783f, 0.218264f, 0.032140f, -0.036633f, 0.044084f, 0.147160f, 0.163258f, 0.121115f, 0.105238f, 0.129326f, 0.144788f, 0.128572f, 0.103746f, 0.091528f} + }, + { + {-0.011223f, 0.003687f, -0.000414f, -0.031357f, -0.057663f, -0.067766f, -0.096325f, -0.163726f, -0.224966f, -0.208955f, -0.081157f, 0.143478f, 0.387596f, 0.486520f, 0.284836f, -0.140976f, -0.441017f, -0.327075f, 0.074175f, 0.349898f, 0.280575f, 0.038443f, -0.108886f, -0.113839f, -0.086300f, -0.070325f, -0.024649f, 0.049306f, 0.092524f, 0.083781f, 0.061156f, 0.054148f, 0.055920f, 0.058263f, 0.066644f, 0.080523f, 0.090464f, 0.094364f, 0.097422f, 0.100540f, 0.101437f, 0.100572f, 0.097579f, 0.089393f, 0.076799f, 0.064921f, 0.054954f, 0.043366f, 0.029470f, 0.015923f, 0.002488f, -0.013502f, -0.031896f, -0.050733f, -0.070213f, -0.091008f, -0.111378f, -0.129544f, -0.145955f, -0.160863f, -0.172868f, -0.181246f, -0.186438f, -0.187665f, -0.183178f, -0.172712f, -0.156892f, -0.135107f, -0.106648f, -0.072711f, -0.034981f, 0.006334f, 0.051208f, 0.098168f, 0.145386f, 0.191890f, 0.236833f, 0.278964f, 0.317170f, 0.350442f, 0.377669f, 0.398477f, 0.413442f, 0.422594f, 0.424961f, 0.420296f, 0.409675f, 0.393798f, 0.372388f, 0.345493f, 0.313465f, 0.275611f, 0.231027f, 0.180958f, 0.128479f, 0.075813f, + 0.023515f, -0.027844f, -0.076427f, -0.119258f, -0.152932f, -0.175194f, -0.186637f, -0.189934f, -0.186882f, -0.177217f, -0.160537f, -0.138059f, -0.112219f, -0.085735f, -0.061204f, -0.040465f, -0.024039f, -0.011686f, -0.003299f, 0.001080f, 0.001404f, -0.002708f, -0.011712f, -0.025056f, -0.041001f, -0.057813f, -0.074544f, -0.090766f, -0.106414f, -0.121885f, -0.137514f, -0.153038f, -0.168182f, -0.183440f, -0.199575f, -0.216690f, -0.234361f, -0.252307f, -0.270421f, -0.288580f, -0.306905f, -0.325883f, -0.345856f, -0.366553f, -0.387191f, -0.406764f, -0.424298f, -0.439192f, -0.451304f, -0.460581f, -0.466844f, -0.470145f, -0.470993f, -0.469950f, -0.467318f, -0.463413f, -0.458793f, -0.453934f, -0.448965f, -0.443919f, -0.438978f, -0.434313f, -0.429938f, -0.425843f, -0.422067f, -0.418527f, -0.414975f, -0.411168f, -0.406936f, -0.402186f, -0.397105f, -0.392257f, -0.388096f, -0.384459f, -0.380881f, -0.377213f, -0.373462f, -0.369262f, -0.364132f, -0.358049f, -0.351167f, -0.343304f, -0.334329f, -0.324576f, -0.314218f, -0.302915f, -0.290682f, -0.278196f, -0.265680f, -0.252744f, -0.239783f, -0.227924f, -0.217230f, -0.206891f, -0.197140f, -0.188670f, + -0.180713f, -0.172459f, -0.165010f, -0.158739f, -0.151375f, -0.142611f, -0.136204f, -0.132665f, -0.126667f, -0.118002f, -0.114967f, -0.118021f, -0.114254f, -0.101693f, -0.101321f, -0.124560f, -0.148010f, -0.147590f, -0.137378f, -0.139760f, -0.138747f, -0.110154f, -0.081767f, -0.105233f, -0.171870f, -0.215991f, -0.207009f, -0.181245f, -0.174445f, -0.180343f, -0.186444f, -0.191819f, -0.178097f, -0.127153f, -0.082373f, -0.120177f, -0.235388f, -0.328199f, -0.337442f, -0.311065f, -0.306275f, -0.305983f, -0.290025f, -0.296380f, -0.327277f, -0.281376f, -0.097597f, 0.092327f}, + {-0.011223f, 0.003687f, -0.000414f, -0.031357f, -0.057663f, -0.067766f, -0.096325f, -0.163726f, -0.224966f, -0.208955f, -0.081157f, 0.143478f, 0.387596f, 0.486520f, 0.284836f, -0.140976f, -0.441017f, -0.327075f, 0.074175f, 0.349898f, 0.280575f, 0.038443f, -0.108886f, -0.113839f, -0.086300f, -0.070325f, -0.024649f, 0.049306f, 0.092524f, 0.083781f, 0.061156f, 0.054148f, 0.055920f, 0.058263f, 0.066644f, 0.080523f, 0.090464f, 0.094364f, 0.097422f, 0.100540f, 0.101437f, 0.100572f, 0.097579f, 0.089393f, 0.076799f, 0.064921f, 0.054954f, 0.043366f, 0.029470f, 0.015923f, 0.002488f, -0.013502f, -0.031896f, -0.050733f, -0.070213f, -0.091008f, -0.111378f, -0.129544f, -0.145955f, -0.160863f, -0.172868f, -0.181246f, -0.186438f, -0.187665f, -0.183178f, -0.172712f, -0.156892f, -0.135107f, -0.106648f, -0.072711f, -0.034981f, 0.006334f, 0.051208f, 0.098168f, 0.145386f, 0.191890f, 0.236833f, 0.278964f, 0.317170f, 0.350442f, 0.377669f, 0.398477f, 0.413442f, 0.422594f, 0.424961f, 0.420296f, 0.409675f, 0.393798f, 0.372388f, 0.345493f, 0.313465f, 0.275611f, 0.231027f, 0.180958f, 0.128479f, 0.075813f, + 0.023515f, -0.027844f, -0.076427f, -0.119258f, -0.152932f, -0.175194f, -0.186637f, -0.189934f, -0.186882f, -0.177217f, -0.160537f, -0.138059f, -0.112219f, -0.085735f, -0.061204f, -0.040465f, -0.024039f, -0.011686f, -0.003299f, 0.001080f, 0.001404f, -0.002708f, -0.011712f, -0.025056f, -0.041001f, -0.057813f, -0.074544f, -0.090766f, -0.106414f, -0.121885f, -0.137514f, -0.153038f, -0.168182f, -0.183440f, -0.199575f, -0.216690f, -0.234361f, -0.252307f, -0.270421f, -0.288580f, -0.306905f, -0.325883f, -0.345856f, -0.366553f, -0.387191f, -0.406764f, -0.424298f, -0.439192f, -0.451304f, -0.460581f, -0.466844f, -0.470145f, -0.470993f, -0.469950f, -0.467318f, -0.463413f, -0.458793f, -0.453934f, -0.448965f, -0.443919f, -0.438978f, -0.434313f, -0.429938f, -0.425843f, -0.422067f, -0.418527f, -0.414975f, -0.411168f, -0.406936f, -0.402186f, -0.397105f, -0.392257f, -0.388096f, -0.384459f, -0.380881f, -0.377213f, -0.373462f, -0.369262f, -0.364132f, -0.358049f, -0.351167f, -0.343304f, -0.334329f, -0.324576f, -0.314218f, -0.302915f, -0.290682f, -0.278196f, -0.265680f, -0.252744f, -0.239783f, -0.227924f, -0.217230f, -0.206891f, -0.197140f, -0.188670f, + -0.180713f, -0.172459f, -0.165010f, -0.158739f, -0.151375f, -0.142611f, -0.136204f, -0.132665f, -0.126667f, -0.118002f, -0.114967f, -0.118021f, -0.114254f, -0.101693f, -0.101321f, -0.124560f, -0.148010f, -0.147590f, -0.137378f, -0.139760f, -0.138747f, -0.110154f, -0.081767f, -0.105233f, -0.171870f, -0.215991f, -0.207009f, -0.181245f, -0.174445f, -0.180343f, -0.186444f, -0.191819f, -0.178097f, -0.127153f, -0.082373f, -0.120177f, -0.235388f, -0.328199f, -0.337442f, -0.311065f, -0.306275f, -0.305983f, -0.290025f, -0.296380f, -0.327277f, -0.281376f, -0.097597f, 0.092327f} + }, + { + {0.054589f, -0.001637f, -0.079543f, -0.135743f, -0.131804f, -0.043458f, 0.104068f, 0.217533f, 0.204070f, 0.074239f, -0.060507f, -0.108806f, -0.081689f, -0.039379f, -0.004993f, 0.029597f, 0.049473f, 0.026070f, -0.027204f, -0.057970f, -0.040922f, -0.005408f, 0.012701f, 0.016342f, 0.029669f, 0.058829f, 0.089715f, 0.111195f, 0.121951f, 0.120092f, 0.101652f, 0.069740f, 0.035273f, 0.006521f, -0.017134f, -0.040773f, -0.067733f, -0.098260f, -0.130202f, -0.159125f, -0.179923f, -0.190245f, -0.191892f, -0.188409f, -0.182228f, -0.174485f, -0.166098f, -0.157672f, -0.148951f, -0.139390f, -0.129028f, -0.118145f, -0.106568f, -0.094035f, -0.080835f, -0.067363f, -0.053428f, -0.038739f, -0.023875f, -0.010097f, 0.001710f, 0.011389f, 0.018876f, 0.023826f, 0.026232f, 0.027134f, 0.028095f, 0.029852f, 0.032050f, 0.034619f, 0.038653f, 0.045252f, 0.054228f, 0.064975f, 0.078084f, 0.094927f, 0.115972f, 0.140559f, 0.168055f, 0.198238f, 0.230625f, 0.264146f, 0.297428f, 0.329230f, 0.359002f, 0.386873f, 0.412350f, 0.433497f, 0.448864f, 0.459882f, 0.469349f, 0.477249f, 0.480035f, 0.474609f, 0.461344f, 0.442380f, + 0.418375f, 0.388058f, 0.350422f, 0.306536f, 0.259028f, 0.209804f, 0.158634f, 0.104592f, 0.048670f, -0.006109f, -0.057348f, -0.105165f, -0.151294f, -0.197048f, -0.242030f, -0.284064f, -0.320505f, -0.350300f, -0.374580f, -0.394966f, -0.411917f, -0.425031f, -0.434070f, -0.439211f, -0.441124f, -0.441102f, -0.440376f, -0.439189f, -0.437206f, -0.434556f, -0.431640f, -0.428284f, -0.423789f, -0.417348f, -0.408064f, -0.395487f, -0.380583f, -0.365150f, -0.349938f, -0.334311f, -0.317544f, -0.299138f, -0.278349f, -0.255141f, -0.231262f, -0.208784f, -0.188088f, -0.168556f, -0.150109f, -0.132628f, -0.115237f, -0.097788f, -0.081784f, -0.068578f, -0.057918f, -0.049072f, -0.041700f, -0.034982f, -0.027605f, -0.019168f, -0.010254f, -0.001254f, 0.007586f, 0.015692f, 0.023079f, 0.030753f, 0.039150f, 0.047677f, 0.056423f, 0.066196f, 0.076374f, 0.085165f, 0.092238f, 0.098541f, 0.103858f, 0.107357f, 0.109771f, 0.112187f, 0.113992f, 0.114589f, 0.115084f, 0.115986f, 0.116053f, 0.115391f, 0.116090f, 0.118375f, 0.120418f, 0.122613f, 0.127014f, 0.132736f, 0.137519f, 0.142486f, 0.149375f, 0.155994f, 0.160690f, 0.166504f, + 0.174416f, 0.179864f, 0.182512f, 0.188824f, 0.198165f, 0.201158f, 0.199276f, 0.205855f, 0.218574f, 0.217938f, 0.206203f, 0.213074f, 0.240900f, 0.244438f, 0.200317f, 0.158123f, 0.174531f, 0.227413f, 0.251412f, 0.237058f, 0.230785f, 0.244489f, 0.233509f, 0.178591f, 0.130638f, 0.141894f, 0.191497f, 0.216461f, 0.195657f, 0.165578f, 0.156193f, 0.145395f, 0.095257f, 0.017498f, -0.024939f, 0.010288f, 0.089729f, 0.139320f, 0.127786f, 0.093936f, 0.089116f, 0.114421f, 0.129992f, 0.115341f, 0.099739f, 0.126419f, 0.196125f, 0.257597f}, + {0.054589f, -0.001637f, -0.079543f, -0.135743f, -0.131804f, -0.043458f, 0.104068f, 0.217533f, 0.204070f, 0.074239f, -0.060507f, -0.108806f, -0.081689f, -0.039379f, -0.004993f, 0.029597f, 0.049473f, 0.026070f, -0.027204f, -0.057970f, -0.040922f, -0.005408f, 0.012701f, 0.016342f, 0.029669f, 0.058829f, 0.089715f, 0.111195f, 0.121951f, 0.120092f, 0.101652f, 0.069740f, 0.035273f, 0.006521f, -0.017134f, -0.040773f, -0.067733f, -0.098260f, -0.130202f, -0.159125f, -0.179923f, -0.190245f, -0.191892f, -0.188409f, -0.182228f, -0.174485f, -0.166098f, -0.157672f, -0.148951f, -0.139390f, -0.129028f, -0.118145f, -0.106568f, -0.094035f, -0.080835f, -0.067363f, -0.053428f, -0.038739f, -0.023875f, -0.010097f, 0.001710f, 0.011389f, 0.018876f, 0.023826f, 0.026232f, 0.027134f, 0.028095f, 0.029852f, 0.032050f, 0.034619f, 0.038653f, 0.045252f, 0.054228f, 0.064975f, 0.078084f, 0.094927f, 0.115972f, 0.140559f, 0.168055f, 0.198238f, 0.230625f, 0.264146f, 0.297428f, 0.329230f, 0.359002f, 0.386873f, 0.412350f, 0.433497f, 0.448864f, 0.459882f, 0.469349f, 0.477249f, 0.480035f, 0.474609f, 0.461344f, 0.442380f, + 0.418375f, 0.388058f, 0.350422f, 0.306536f, 0.259028f, 0.209804f, 0.158634f, 0.104592f, 0.048670f, -0.006109f, -0.057348f, -0.105165f, -0.151294f, -0.197048f, -0.242030f, -0.284064f, -0.320505f, -0.350300f, -0.374580f, -0.394966f, -0.411917f, -0.425031f, -0.434070f, -0.439211f, -0.441124f, -0.441102f, -0.440376f, -0.439189f, -0.437206f, -0.434556f, -0.431640f, -0.428284f, -0.423789f, -0.417348f, -0.408064f, -0.395487f, -0.380583f, -0.365150f, -0.349938f, -0.334311f, -0.317544f, -0.299138f, -0.278349f, -0.255141f, -0.231262f, -0.208784f, -0.188088f, -0.168556f, -0.150109f, -0.132628f, -0.115237f, -0.097788f, -0.081784f, -0.068578f, -0.057918f, -0.049072f, -0.041700f, -0.034982f, -0.027605f, -0.019168f, -0.010254f, -0.001254f, 0.007586f, 0.015692f, 0.023079f, 0.030753f, 0.039150f, 0.047677f, 0.056423f, 0.066196f, 0.076374f, 0.085165f, 0.092238f, 0.098541f, 0.103858f, 0.107357f, 0.109771f, 0.112187f, 0.113992f, 0.114589f, 0.115084f, 0.115986f, 0.116053f, 0.115391f, 0.116090f, 0.118375f, 0.120418f, 0.122613f, 0.127014f, 0.132736f, 0.137519f, 0.142486f, 0.149375f, 0.155994f, 0.160690f, 0.166504f, + 0.174416f, 0.179864f, 0.182512f, 0.188824f, 0.198165f, 0.201158f, 0.199276f, 0.205855f, 0.218574f, 0.217938f, 0.206203f, 0.213074f, 0.240900f, 0.244438f, 0.200317f, 0.158123f, 0.174531f, 0.227413f, 0.251412f, 0.237058f, 0.230785f, 0.244489f, 0.233509f, 0.178591f, 0.130638f, 0.141894f, 0.191497f, 0.216461f, 0.195657f, 0.165578f, 0.156193f, 0.145395f, 0.095257f, 0.017498f, -0.024939f, 0.010288f, 0.089729f, 0.139320f, 0.127786f, 0.093936f, 0.089116f, 0.114421f, 0.129992f, 0.115341f, 0.099739f, 0.126419f, 0.196125f, 0.257597f} + }, + { + {-0.026157f, 0.068639f, 0.138852f, 0.116633f, 0.040871f, -0.066112f, -0.241888f, -0.457026f, -0.568605f, -0.471298f, -0.196549f, 0.181955f, 0.589203f, 0.816657f, 0.568697f, -0.134981f, -0.747445f, -0.685246f, -0.015441f, 0.605050f, 0.693322f, 0.391281f, 0.106693f, -0.011722f, -0.080268f, -0.174474f, -0.247103f, -0.273141f, -0.292930f, -0.320883f, -0.325188f, -0.295283f, -0.254575f, -0.212925f, -0.160163f, -0.098014f, -0.039915f, 0.010923f, 0.057040f, 0.092984f, 0.114618f, 0.128942f, 0.142270f, 0.151647f, 0.154912f, 0.155718f, 0.154665f, 0.148180f, 0.137772f, 0.129391f, 0.124178f, 0.118997f, 0.113394f, 0.108290f, 0.101692f, 0.091970f, 0.080942f, 0.069580f, 0.055904f, 0.039705f, 0.023561f, 0.007840f, -0.009525f, -0.028172f, -0.045799f, -0.062600f, -0.080032f, -0.096800f, -0.110687f, -0.122210f, -0.132699f, -0.141465f, -0.147899f, -0.153417f, -0.159057f, -0.164064f, -0.168042f, -0.171581f, -0.174482f, -0.176315f, -0.178283f, -0.181779f, -0.186166f, -0.190389f, -0.194992f, -0.200352f, -0.204977f, -0.207427f, -0.207840f, -0.206456f, -0.202971f, -0.197962f, -0.192616f, -0.187178f, -0.182088f, -0.179900f, + -0.183369f, -0.192384f, -0.205113f, -0.221034f, -0.240727f, -0.263826f, -0.288814f, -0.313701f, -0.336107f, -0.354222f, -0.368133f, -0.378639f, -0.385041f, -0.385850f, -0.381086f, -0.372078f, -0.359829f, -0.345156f, -0.329222f, -0.312415f, -0.294047f, -0.274257f, -0.254754f, -0.236913f, -0.220646f, -0.205336f, -0.190177f, -0.173810f, -0.155586f, -0.136859f, -0.119423f, -0.103382f, -0.087912f, -0.072828f, -0.057948f, -0.042443f, -0.026135f, -0.010040f, 0.005293f, 0.020416f, 0.035572f, 0.050402f, 0.065217f, 0.080748f, 0.096694f, 0.112113f, 0.126763f, 0.140626f, 0.152945f, 0.163087f, 0.171376f, 0.178108f, 0.182919f, 0.185770f, 0.187134f, 0.186908f, 0.184596f, 0.180511f, 0.175333f, 0.168990f, 0.161399f, 0.153419f, 0.145682f, 0.137689f, 0.129219f, 0.121085f, 0.113576f, 0.105961f, 0.098227f, 0.091437f, 0.086015f, 0.081580f, 0.078300f, 0.076492f, 0.075448f, 0.074428f, 0.073773f, 0.073571f, 0.072898f, 0.071705f, 0.071330f, 0.072161f, 0.073161f, 0.074179f, 0.076012f, 0.078167f, 0.079475f, 0.080318f, 0.081495f, 0.082291f, 0.082316f, 0.082970f, 0.084730f, 0.086114f, 0.087018f, 0.088948f, + 0.091133f, 0.091673f, 0.092125f, 0.094480f, 0.095720f, 0.093481f, 0.092767f, 0.096810f, 0.098287f, 0.092965f, 0.091911f, 0.101679f, 0.104826f, 0.086445f, 0.069405f, 0.089245f, 0.138069f, 0.169948f, 0.164683f, 0.150204f, 0.153627f, 0.164399f, 0.160775f, 0.145233f, 0.135702f, 0.139942f, 0.153308f, 0.169163f, 0.181118f, 0.185093f, 0.185347f, 0.187089f, 0.176933f, 0.125522f, 0.026481f, -0.073387f, -0.108076f, -0.068160f, -0.019136f, -0.018020f, -0.035753f, -0.012095f, 0.030752f, 0.016593f, -0.024770f, 0.062804f, 0.338438f, 0.605650f}, + {-0.026157f, 0.068639f, 0.138852f, 0.116633f, 0.040871f, -0.066112f, -0.241888f, -0.457026f, -0.568605f, -0.471298f, -0.196549f, 0.181955f, 0.589203f, 0.816657f, 0.568697f, -0.134981f, -0.747445f, -0.685246f, -0.015441f, 0.605050f, 0.693322f, 0.391281f, 0.106693f, -0.011722f, -0.080268f, -0.174474f, -0.247103f, -0.273141f, -0.292930f, -0.320883f, -0.325188f, -0.295283f, -0.254575f, -0.212925f, -0.160163f, -0.098014f, -0.039915f, 0.010923f, 0.057040f, 0.092984f, 0.114618f, 0.128942f, 0.142270f, 0.151647f, 0.154912f, 0.155718f, 0.154665f, 0.148180f, 0.137772f, 0.129391f, 0.124178f, 0.118997f, 0.113394f, 0.108290f, 0.101692f, 0.091970f, 0.080942f, 0.069580f, 0.055904f, 0.039705f, 0.023561f, 0.007840f, -0.009525f, -0.028172f, -0.045799f, -0.062600f, -0.080032f, -0.096800f, -0.110687f, -0.122210f, -0.132699f, -0.141465f, -0.147899f, -0.153417f, -0.159057f, -0.164064f, -0.168042f, -0.171581f, -0.174482f, -0.176315f, -0.178283f, -0.181779f, -0.186166f, -0.190389f, -0.194992f, -0.200352f, -0.204977f, -0.207427f, -0.207840f, -0.206456f, -0.202971f, -0.197962f, -0.192616f, -0.187178f, -0.182088f, -0.179900f, + -0.183369f, -0.192384f, -0.205113f, -0.221034f, -0.240727f, -0.263826f, -0.288814f, -0.313701f, -0.336107f, -0.354222f, -0.368133f, -0.378639f, -0.385041f, -0.385850f, -0.381086f, -0.372078f, -0.359829f, -0.345156f, -0.329222f, -0.312415f, -0.294047f, -0.274257f, -0.254754f, -0.236913f, -0.220646f, -0.205336f, -0.190177f, -0.173810f, -0.155586f, -0.136859f, -0.119423f, -0.103382f, -0.087912f, -0.072828f, -0.057948f, -0.042443f, -0.026135f, -0.010040f, 0.005293f, 0.020416f, 0.035572f, 0.050402f, 0.065217f, 0.080748f, 0.096694f, 0.112113f, 0.126763f, 0.140626f, 0.152945f, 0.163087f, 0.171376f, 0.178108f, 0.182919f, 0.185770f, 0.187134f, 0.186908f, 0.184596f, 0.180511f, 0.175333f, 0.168990f, 0.161399f, 0.153419f, 0.145682f, 0.137689f, 0.129219f, 0.121085f, 0.113576f, 0.105961f, 0.098227f, 0.091437f, 0.086015f, 0.081580f, 0.078300f, 0.076492f, 0.075448f, 0.074428f, 0.073773f, 0.073571f, 0.072898f, 0.071705f, 0.071330f, 0.072161f, 0.073161f, 0.074179f, 0.076012f, 0.078167f, 0.079475f, 0.080318f, 0.081495f, 0.082291f, 0.082316f, 0.082970f, 0.084730f, 0.086114f, 0.087018f, 0.088948f, + 0.091133f, 0.091673f, 0.092125f, 0.094480f, 0.095720f, 0.093481f, 0.092767f, 0.096810f, 0.098287f, 0.092965f, 0.091911f, 0.101679f, 0.104826f, 0.086445f, 0.069405f, 0.089245f, 0.138069f, 0.169948f, 0.164683f, 0.150204f, 0.153627f, 0.164399f, 0.160775f, 0.145233f, 0.135702f, 0.139942f, 0.153308f, 0.169163f, 0.181118f, 0.185093f, 0.185347f, 0.187089f, 0.176933f, 0.125522f, 0.026481f, -0.073387f, -0.108076f, -0.068160f, -0.019136f, -0.018020f, -0.035753f, -0.012095f, 0.030752f, 0.016593f, -0.024770f, 0.062804f, 0.338438f, 0.605650f} + }, + { + {-0.007369f, -0.009113f, -0.001099f, 0.022658f, 0.070924f, 0.152318f, 0.232129f, 0.241139f, 0.159597f, 0.019376f, -0.191743f, -0.478726f, -0.641786f, -0.366448f, 0.302362f, 0.784726f, 0.561501f, -0.152339f, -0.632004f, -0.504209f, -0.082826f, 0.166508f, 0.170061f, 0.132434f, 0.150576f, 0.156677f, 0.112765f, 0.064809f, 0.038940f, 0.011560f, -0.026185f, -0.052670f, -0.058435f, -0.055297f, -0.050368f, -0.042168f, -0.033153f, -0.026070f, -0.017664f, -0.007165f, -0.000019f, 0.002560f, 0.006005f, 0.011682f, 0.014961f, 0.014711f, 0.014629f, 0.015662f, 0.015718f, 0.015511f, 0.017772f, 0.022545f, 0.028288f, 0.035048f, 0.042950f, 0.050476f, 0.056636f, 0.061995f, 0.066457f, 0.069051f, 0.070123f, 0.070862f, 0.071035f, 0.069703f, 0.067216f, 0.064295f, 0.060502f, 0.055392f, 0.049663f, 0.043845f, 0.037475f, 0.030360f, 0.022950f, 0.015014f, 0.005606f, -0.005567f, -0.018119f, -0.031952f, -0.046962f, -0.062497f, -0.078234f, -0.094671f, -0.111772f, -0.128161f, -0.142543f, -0.154931f, -0.165841f, -0.175123f, -0.182010f, -0.185649f, -0.185515f, -0.181851f, -0.175561f, -0.167354f, -0.157511f, -0.146709f, + -0.136223f, -0.126946f, -0.118986f, -0.112528f, -0.108273f, -0.106653f, -0.107197f, -0.108900f, -0.110998f, -0.113479f, -0.117023f, -0.122152f, -0.128391f, -0.134603f, -0.140110f, -0.145050f, -0.149794f, -0.154521f, -0.159112f, -0.163000f, -0.165438f, -0.166306f, -0.166315f, -0.166210f, -0.166147f, -0.165802f, -0.164520f, -0.161506f, -0.156473f, -0.149994f, -0.142735f, -0.134670f, -0.125420f, -0.114771f, -0.102543f, -0.088669f, -0.073713f, -0.058625f, -0.043867f, -0.029420f, -0.015423f, -0.002012f, 0.011080f, 0.023915f, 0.035810f, 0.046102f, 0.054869f, 0.062393f, 0.068774f, 0.074464f, 0.080241f, 0.086360f, 0.092594f, 0.098983f, 0.105615f, 0.112093f, 0.118168f, 0.124284f, 0.130714f, 0.137142f, 0.143655f, 0.150871f, 0.158659f, 0.166225f, 0.173522f, 0.180945f, 0.187978f, 0.193921f, 0.199247f, 0.204493f, 0.209025f, 0.212545f, 0.216101f, 0.220182f, 0.223965f, 0.227482f, 0.231885f, 0.237074f, 0.242015f, 0.247127f, 0.253052f, 0.258300f, 0.261689f, 0.264868f, 0.268891f, 0.271822f, 0.273082f, 0.275283f, 0.278781f, 0.280657f, 0.281124f, 0.283268f, 0.285951f, 0.286133f, 0.286398f, 0.289463f, + 0.290488f, 0.287311f, 0.288136f, 0.294374f, 0.292805f, 0.282671f, 0.284319f, 0.297926f, 0.292144f, 0.265659f, 0.265620f, 0.295582f, 0.275872f, 0.176874f, 0.118624f, 0.219351f, 0.399705f, 0.477971f, 0.424361f, 0.364658f, 0.350250f, 0.304253f, 0.215924f, 0.205638f, 0.330161f, 0.473519f, 0.512784f, 0.473603f, 0.445373f, 0.445924f, 0.442945f, 0.420484f, 0.362318f, 0.253795f, 0.151402f, 0.158962f, 0.280224f, 0.386924f, 0.389886f, 0.347680f, 0.344603f, 0.363776f, 0.360809f, 0.360105f, 0.372309f, 0.308063f, 0.110063f, -0.088473f}, + {0.007369f, 0.009113f, 0.001099f, -0.022658f, -0.070924f, -0.152318f, -0.232129f, -0.241139f, -0.159597f, -0.019376f, 0.191743f, 0.478726f, 0.641786f, 0.366448f, -0.302362f, -0.784726f, -0.561501f, 0.152339f, 0.632004f, 0.504209f, 0.082826f, -0.166508f, -0.170061f, -0.132434f, -0.150576f, -0.156677f, -0.112765f, -0.064809f, -0.038940f, -0.011560f, 0.026185f, 0.052670f, 0.058435f, 0.055297f, 0.050368f, 0.042168f, 0.033153f, 0.026070f, 0.017664f, 0.007165f, 0.000019f, -0.002560f, -0.006005f, -0.011682f, -0.014961f, -0.014711f, -0.014629f, -0.015662f, -0.015718f, -0.015511f, -0.017772f, -0.022545f, -0.028288f, -0.035048f, -0.042950f, -0.050476f, -0.056636f, -0.061995f, -0.066457f, -0.069051f, -0.070123f, -0.070862f, -0.071035f, -0.069703f, -0.067216f, -0.064295f, -0.060502f, -0.055392f, -0.049663f, -0.043845f, -0.037475f, -0.030360f, -0.022950f, -0.015014f, -0.005606f, 0.005567f, 0.018119f, 0.031952f, 0.046962f, 0.062497f, 0.078234f, 0.094671f, 0.111772f, 0.128161f, 0.142543f, 0.154931f, 0.165841f, 0.175123f, 0.182010f, 0.185649f, 0.185515f, 0.181851f, 0.175561f, 0.167354f, 0.157511f, 0.146709f, + 0.136223f, 0.126946f, 0.118986f, 0.112528f, 0.108273f, 0.106653f, 0.107197f, 0.108900f, 0.110998f, 0.113479f, 0.117023f, 0.122152f, 0.128391f, 0.134603f, 0.140110f, 0.145050f, 0.149794f, 0.154521f, 0.159112f, 0.163000f, 0.165438f, 0.166306f, 0.166315f, 0.166210f, 0.166147f, 0.165802f, 0.164520f, 0.161506f, 0.156473f, 0.149994f, 0.142735f, 0.134670f, 0.125420f, 0.114771f, 0.102543f, 0.088669f, 0.073713f, 0.058625f, 0.043867f, 0.029420f, 0.015423f, 0.002012f, -0.011080f, -0.023915f, -0.035810f, -0.046102f, -0.054869f, -0.062393f, -0.068774f, -0.074464f, -0.080241f, -0.086360f, -0.092594f, -0.098983f, -0.105615f, -0.112093f, -0.118168f, -0.124284f, -0.130714f, -0.137142f, -0.143655f, -0.150871f, -0.158659f, -0.166225f, -0.173522f, -0.180945f, -0.187978f, -0.193921f, -0.199247f, -0.204493f, -0.209025f, -0.212545f, -0.216101f, -0.220182f, -0.223965f, -0.227482f, -0.231885f, -0.237074f, -0.242015f, -0.247127f, -0.253052f, -0.258300f, -0.261689f, -0.264868f, -0.268891f, -0.271822f, -0.273082f, -0.275283f, -0.278781f, -0.280657f, -0.281124f, -0.283268f, -0.285951f, -0.286133f, -0.286398f, -0.289463f, + -0.290488f, -0.287311f, -0.288136f, -0.294374f, -0.292805f, -0.282671f, -0.284319f, -0.297926f, -0.292144f, -0.265659f, -0.265620f, -0.295582f, -0.275872f, -0.176874f, -0.118624f, -0.219351f, -0.399705f, -0.477971f, -0.424361f, -0.364658f, -0.350250f, -0.304253f, -0.215924f, -0.205638f, -0.330161f, -0.473519f, -0.512784f, -0.473603f, -0.445373f, -0.445924f, -0.442945f, -0.420484f, -0.362318f, -0.253795f, -0.151402f, -0.158962f, -0.280224f, -0.386924f, -0.389886f, -0.347680f, -0.344603f, -0.363776f, -0.360809f, -0.360105f, -0.372309f, -0.308063f, -0.110063f, 0.088473f} + }, + { + {-0.002688f, 0.005432f, 0.012718f, 0.008286f, -0.018981f, -0.066947f, -0.093651f, -0.039678f, 0.084418f, 0.167639f, 0.115873f, -0.019344f, -0.096903f, -0.063275f, 0.000491f, 0.014385f, -0.000484f, 0.009731f, 0.035483f, 0.032840f, 0.004036f, -0.010890f, -0.002359f, 0.000339f, -0.017379f, -0.034722f, -0.031174f, -0.012598f, 0.004762f, 0.015141f, 0.020393f, 0.020069f, 0.012230f, -0.002097f, -0.019459f, -0.036054f, -0.048695f, -0.056607f, -0.062102f, -0.067345f, -0.071275f, -0.071399f, -0.067330f, -0.060925f, -0.054215f, -0.048750f, -0.045891f, -0.046130f, -0.048390f, -0.050799f, -0.051951f, -0.051168f, -0.048155f, -0.042971f, -0.036130f, -0.028335f, -0.020063f, -0.011496f, -0.002777f, 0.005857f, 0.014252f, 0.022441f, 0.030314f, 0.037365f, 0.043111f, 0.047651f, 0.051375f, 0.054291f, 0.056203f, 0.057437f, 0.058706f, 0.060226f, 0.061657f, 0.063036f, 0.065132f, 0.068679f, 0.073849f, 0.080769f, 0.090037f, 0.102333f, 0.117751f, 0.135818f, 0.156080f, 0.178486f, 0.203206f, 0.230031f, 0.257901f, 0.285243f, 0.310971f, 0.334898f, 0.356785f, 0.375158f, 0.387601f, 0.392296f, 0.388904f, 0.377910f, + 0.359590f, 0.333993f, 0.301815f, 0.264974f, 0.226129f, 0.187410f, 0.149597f, 0.112764f, 0.077779f, 0.046673f, 0.021036f, 0.000235f, -0.018297f, -0.036907f, -0.055957f, -0.073988f, -0.089329f, -0.101608f, -0.111952f, -0.121846f, -0.131868f, -0.141542f, -0.150198f, -0.157697f, -0.164481f, -0.171286f, -0.178744f, -0.186942f, -0.195343f, -0.203302f, -0.210537f, -0.217024f, -0.222694f, -0.227441f, -0.231177f, -0.233784f, -0.235253f, -0.235915f, -0.236263f, -0.236534f, -0.236669f, -0.236547f, -0.236024f, -0.235038f, -0.233954f, -0.233475f, -0.233944f, -0.235111f, -0.236668f, -0.238427f, -0.239938f, -0.240742f, -0.241159f, -0.242072f, -0.243807f, -0.245955f, -0.248133f, -0.250080f, -0.251134f, -0.250524f, -0.248011f, -0.243591f, -0.237000f, -0.228096f, -0.217152f, -0.204269f, -0.189244f, -0.172334f, -0.154244f, -0.135283f, -0.115616f, -0.096165f, -0.077963f, -0.060968f, -0.044792f, -0.029876f, -0.016585f, -0.004235f, 0.007671f, 0.018639f, 0.028667f, 0.038632f, 0.048378f, 0.056858f, 0.064590f, 0.073057f, 0.081754f, 0.089292f, 0.096631f, 0.105231f, 0.113645f, 0.120294f, 0.126811f, 0.134121f, 0.139781f, 0.143768f, + 0.149981f, 0.157487f, 0.160603f, 0.162003f, 0.170584f, 0.181780f, 0.181900f, 0.177636f, 0.189907f, 0.209624f, 0.204280f, 0.186664f, 0.216719f, 0.295365f, 0.323582f, 0.234869f, 0.109824f, 0.071288f, 0.113232f, 0.138910f, 0.132778f, 0.165020f, 0.231457f, 0.229499f, 0.127086f, 0.030054f, 0.024335f, 0.057848f, 0.047811f, 0.011116f, 0.005056f, 0.015613f, 0.000201f, -0.011538f, 0.040879f, 0.133184f, 0.174164f, 0.133872f, 0.077041f, 0.063200f, 0.079294f, 0.086196f, 0.077456f, 0.068117f, 0.062643f, 0.057750f, 0.055152f, 0.055779f}, + {0.002688f, -0.005432f, -0.012718f, -0.008286f, 0.018981f, 0.066947f, 0.093651f, 0.039678f, -0.084418f, -0.167639f, -0.115873f, 0.019344f, 0.096903f, 0.063275f, -0.000491f, -0.014385f, 0.000484f, -0.009731f, -0.035483f, -0.032840f, -0.004036f, 0.010890f, 0.002359f, -0.000339f, 0.017379f, 0.034722f, 0.031174f, 0.012598f, -0.004762f, -0.015141f, -0.020393f, -0.020069f, -0.012230f, 0.002097f, 0.019459f, 0.036054f, 0.048695f, 0.056607f, 0.062102f, 0.067345f, 0.071275f, 0.071399f, 0.067330f, 0.060925f, 0.054215f, 0.048750f, 0.045891f, 0.046130f, 0.048390f, 0.050799f, 0.051951f, 0.051168f, 0.048155f, 0.042971f, 0.036130f, 0.028335f, 0.020063f, 0.011496f, 0.002777f, -0.005857f, -0.014252f, -0.022441f, -0.030314f, -0.037365f, -0.043111f, -0.047651f, -0.051375f, -0.054291f, -0.056203f, -0.057437f, -0.058706f, -0.060226f, -0.061657f, -0.063036f, -0.065132f, -0.068679f, -0.073849f, -0.080769f, -0.090037f, -0.102333f, -0.117751f, -0.135818f, -0.156080f, -0.178486f, -0.203206f, -0.230031f, -0.257901f, -0.285243f, -0.310971f, -0.334898f, -0.356785f, -0.375158f, -0.387601f, -0.392296f, -0.388904f, -0.377910f, + -0.359590f, -0.333993f, -0.301815f, -0.264974f, -0.226129f, -0.187410f, -0.149597f, -0.112764f, -0.077779f, -0.046673f, -0.021036f, -0.000235f, 0.018297f, 0.036907f, 0.055957f, 0.073988f, 0.089329f, 0.101608f, 0.111952f, 0.121846f, 0.131868f, 0.141542f, 0.150198f, 0.157697f, 0.164481f, 0.171286f, 0.178744f, 0.186942f, 0.195343f, 0.203302f, 0.210537f, 0.217024f, 0.222694f, 0.227441f, 0.231177f, 0.233784f, 0.235253f, 0.235915f, 0.236263f, 0.236534f, 0.236669f, 0.236547f, 0.236024f, 0.235038f, 0.233954f, 0.233475f, 0.233944f, 0.235111f, 0.236668f, 0.238427f, 0.239938f, 0.240742f, 0.241159f, 0.242072f, 0.243807f, 0.245955f, 0.248133f, 0.250080f, 0.251134f, 0.250524f, 0.248011f, 0.243591f, 0.237000f, 0.228096f, 0.217152f, 0.204269f, 0.189244f, 0.172334f, 0.154244f, 0.135283f, 0.115616f, 0.096165f, 0.077963f, 0.060968f, 0.044792f, 0.029876f, 0.016585f, 0.004235f, -0.007671f, -0.018639f, -0.028667f, -0.038632f, -0.048378f, -0.056858f, -0.064590f, -0.073057f, -0.081754f, -0.089292f, -0.096631f, -0.105231f, -0.113645f, -0.120294f, -0.126811f, -0.134121f, -0.139781f, -0.143768f, + -0.149981f, -0.157487f, -0.160603f, -0.162003f, -0.170584f, -0.181780f, -0.181900f, -0.177636f, -0.189907f, -0.209624f, -0.204280f, -0.186664f, -0.216719f, -0.295365f, -0.323582f, -0.234869f, -0.109824f, -0.071288f, -0.113232f, -0.138910f, -0.132778f, -0.165020f, -0.231457f, -0.229499f, -0.127086f, -0.030054f, -0.024335f, -0.057848f, -0.047811f, -0.011116f, -0.005056f, -0.015613f, -0.000201f, 0.011538f, -0.040879f, -0.133184f, -0.174164f, -0.133872f, -0.077041f, -0.063200f, -0.079294f, -0.086196f, -0.077456f, -0.068117f, -0.062643f, -0.057750f, -0.055152f, -0.055779f} + }, + { + {-0.031395f, -0.017549f, 0.012545f, 0.027085f, -0.001298f, -0.019483f, 0.059019f, 0.208286f, 0.263492f, 0.087514f, -0.255313f, -0.510902f, -0.435627f, -0.033493f, 0.386939f, 0.463824f, 0.150130f, -0.224282f, -0.317692f, -0.133994f, 0.063533f, 0.108717f, 0.062538f, 0.027810f, 0.001853f, -0.049162f, -0.095299f, -0.093148f, -0.061382f, -0.047017f, -0.057265f, -0.066961f, -0.063290f, -0.049263f, -0.023679f, 0.015474f, 0.059281f, 0.096124f, 0.123579f, 0.144087f, 0.157932f, 0.165971f, 0.171378f, 0.175091f, 0.175299f, 0.172128f, 0.167569f, 0.161483f, 0.152440f, 0.141016f, 0.128172f, 0.112226f, 0.090989f, 0.065073f, 0.036626f, 0.006936f, -0.022810f, -0.050769f, -0.076246f, -0.100391f, -0.124040f, -0.146496f, -0.166945f, -0.185227f, -0.200710f, -0.211804f, -0.216957f, -0.215246f, -0.206186f, -0.189818f, -0.166688f, -0.137158f, -0.101286f, -0.059912f, -0.015051f, 0.031417f, 0.078741f, 0.126363f, 0.172683f, 0.215583f, 0.253881f, 0.287628f, 0.317019f, 0.341528f, 0.360300f, 0.373071f, 0.380303f, 0.382359f, 0.378941f, 0.369492f, 0.353667f, 0.331025f, 0.300798f, 0.262671f, 0.217574f, 0.167114f, + 0.112510f, 0.054898f, -0.003462f, -0.059139f, -0.109030f, -0.151676f, -0.187106f, -0.215626f, -0.236627f, -0.248501f, -0.250097f, -0.242458f, -0.228671f, -0.211714f, -0.192851f, -0.172157f, -0.149779f, -0.126242f, -0.102213f, -0.078565f, -0.056361f, -0.036419f, -0.019092f, -0.004417f, 0.008006f, 0.019186f, 0.030126f, 0.040878f, 0.050508f, 0.057885f, 0.062245f, 0.063363f, 0.061684f, 0.058047f, 0.052884f, 0.045898f, 0.036639f, 0.025030f, 0.011292f, -0.004121f, -0.020506f, -0.037329f, -0.054568f, -0.072173f, -0.089494f, -0.105753f, -0.120651f, -0.134025f, -0.145470f, -0.154818f, -0.162347f, -0.168112f, -0.171794f, -0.173503f, -0.173945f, -0.173633f, -0.172788f, -0.171982f, -0.171913f, -0.172586f, -0.173607f, -0.174969f, -0.176759f, -0.178632f, -0.180379f, -0.182333f, -0.184562f, -0.186478f, -0.187751f, -0.188632f, -0.189123f, -0.188994f, -0.188640f, -0.188675f, -0.188837f, -0.188578f, -0.188189f, -0.188042f, -0.187510f, -0.185863f, -0.183172f, -0.179315f, -0.173560f, -0.165995f, -0.157668f, -0.148777f, -0.138701f, -0.127933f, -0.117657f, -0.107677f, -0.097244f, -0.087142f, -0.078362f, -0.070096f, -0.061614f, -0.054068f, + -0.047958f, -0.041708f, -0.035013f, -0.029793f, -0.025876f, -0.020687f, -0.014884f, -0.012039f, -0.011329f, -0.008255f, -0.004063f, -0.005183f, -0.011321f, -0.014544f, -0.013137f, -0.015356f, -0.025141f, -0.034687f, -0.036741f, -0.035196f, -0.036780f, -0.038630f, -0.031709f, -0.015609f, -0.004294f, -0.011898f, -0.032698f, -0.044235f, -0.036962f, -0.028397f, -0.032322f, -0.028167f, 0.009611f, 0.057777f, 0.058012f, -0.006611f, -0.081631f, -0.103618f, -0.068370f, -0.022195f, -0.005259f, -0.017573f, -0.028765f, -0.015361f, 0.003597f, -0.022097f, -0.107014f, -0.188977f}, + {0.031395f, 0.017549f, -0.012545f, -0.027085f, 0.001298f, 0.019483f, -0.059019f, -0.208286f, -0.263492f, -0.087514f, 0.255313f, 0.510902f, 0.435627f, 0.033493f, -0.386939f, -0.463824f, -0.150130f, 0.224282f, 0.317692f, 0.133994f, -0.063533f, -0.108717f, -0.062538f, -0.027810f, -0.001853f, 0.049162f, 0.095299f, 0.093148f, 0.061382f, 0.047017f, 0.057265f, 0.066961f, 0.063290f, 0.049263f, 0.023679f, -0.015474f, -0.059281f, -0.096124f, -0.123579f, -0.144087f, -0.157932f, -0.165971f, -0.171378f, -0.175091f, -0.175299f, -0.172128f, -0.167569f, -0.161483f, -0.152440f, -0.141016f, -0.128172f, -0.112226f, -0.090989f, -0.065073f, -0.036626f, -0.006936f, 0.022810f, 0.050769f, 0.076246f, 0.100391f, 0.124040f, 0.146496f, 0.166945f, 0.185227f, 0.200710f, 0.211804f, 0.216957f, 0.215246f, 0.206186f, 0.189818f, 0.166688f, 0.137158f, 0.101286f, 0.059912f, 0.015051f, -0.031417f, -0.078741f, -0.126363f, -0.172683f, -0.215583f, -0.253881f, -0.287628f, -0.317019f, -0.341528f, -0.360300f, -0.373071f, -0.380303f, -0.382359f, -0.378941f, -0.369492f, -0.353667f, -0.331025f, -0.300798f, -0.262671f, -0.217574f, -0.167114f, + -0.112510f, -0.054898f, 0.003462f, 0.059139f, 0.109030f, 0.151676f, 0.187106f, 0.215626f, 0.236627f, 0.248501f, 0.250097f, 0.242458f, 0.228671f, 0.211714f, 0.192851f, 0.172157f, 0.149779f, 0.126242f, 0.102213f, 0.078565f, 0.056361f, 0.036419f, 0.019092f, 0.004417f, -0.008006f, -0.019186f, -0.030126f, -0.040878f, -0.050508f, -0.057885f, -0.062245f, -0.063363f, -0.061684f, -0.058047f, -0.052884f, -0.045898f, -0.036639f, -0.025030f, -0.011292f, 0.004121f, 0.020506f, 0.037329f, 0.054568f, 0.072173f, 0.089494f, 0.105753f, 0.120651f, 0.134025f, 0.145470f, 0.154818f, 0.162347f, 0.168112f, 0.171794f, 0.173503f, 0.173945f, 0.173633f, 0.172788f, 0.171982f, 0.171913f, 0.172586f, 0.173607f, 0.174969f, 0.176759f, 0.178632f, 0.180379f, 0.182333f, 0.184562f, 0.186478f, 0.187751f, 0.188632f, 0.189123f, 0.188994f, 0.188640f, 0.188675f, 0.188837f, 0.188578f, 0.188189f, 0.188042f, 0.187510f, 0.185863f, 0.183172f, 0.179315f, 0.173560f, 0.165995f, 0.157668f, 0.148777f, 0.138701f, 0.127933f, 0.117657f, 0.107677f, 0.097244f, 0.087142f, 0.078362f, 0.070096f, 0.061614f, 0.054068f, + 0.047958f, 0.041708f, 0.035013f, 0.029793f, 0.025876f, 0.020687f, 0.014884f, 0.012039f, 0.011329f, 0.008255f, 0.004063f, 0.005183f, 0.011321f, 0.014544f, 0.013137f, 0.015356f, 0.025141f, 0.034687f, 0.036741f, 0.035196f, 0.036780f, 0.038630f, 0.031709f, 0.015609f, 0.004294f, 0.011898f, 0.032698f, 0.044235f, 0.036962f, 0.028397f, 0.032322f, 0.028167f, -0.009611f, -0.057777f, -0.058012f, 0.006611f, 0.081631f, 0.103618f, 0.068370f, 0.022195f, 0.005259f, 0.017573f, 0.028765f, 0.015361f, -0.003597f, 0.022097f, 0.107014f, 0.188977f} + }, + { + {-0.019502f, -0.024108f, -0.023741f, -0.009796f, 0.015547f, 0.040200f, 0.049418f, 0.030039f, -0.022935f, -0.089805f, -0.122188f, -0.081481f, 0.009195f, 0.073870f, 0.061521f, -0.001319f, -0.051768f, -0.064073f, -0.056806f, -0.044490f, -0.019688f, 0.017657f, 0.047591f, 0.057938f, 0.061200f, 0.071250f, 0.079820f, 0.068542f, 0.033537f, -0.011849f, -0.051126f, -0.073885f, -0.077564f, -0.068013f, -0.056218f, -0.049942f, -0.048764f, -0.047509f, -0.042223f, -0.032636f, -0.021389f, -0.011717f, -0.004812f, 0.000602f, 0.006040f, 0.011907f, 0.018434f, 0.026017f, 0.034094f, 0.041240f, 0.046701f, 0.050589f, 0.052772f, 0.052796f, 0.050455f, 0.045432f, 0.037083f, 0.025409f, 0.011341f, -0.004349f, -0.021366f, -0.039047f, -0.056623f, -0.074233f, -0.092292f, -0.110264f, -0.127486f, -0.144411f, -0.161405f, -0.177189f, -0.189933f, -0.198872f, -0.203514f, -0.202567f, -0.195078f, -0.181502f, -0.162623f, -0.138623f, -0.110014f, -0.078167f, -0.044145f, -0.008062f, 0.029925f, 0.068792f, 0.107070f, 0.143639f, 0.178228f, 0.211182f, 0.242095f, 0.268826f, 0.288929f, 0.301918f, 0.308848f, 0.309956f, 0.304163f, 0.290661f, + 0.269776f, 0.242758f, 0.211892f, 0.180019f, 0.148692f, 0.117379f, 0.085253f, 0.053049f, 0.022899f, -0.002684f, -0.021788f, -0.034534f, -0.043357f, -0.050497f, -0.055571f, -0.056701f, -0.053111f, -0.045412f, -0.034615f, -0.022156f, -0.009575f, 0.002997f, 0.016842f, 0.032605f, 0.049621f, 0.067258f, 0.085130f, 0.102158f, 0.117320f, 0.130988f, 0.143895f, 0.155582f, 0.165326f, 0.173298f, 0.179406f, 0.182544f, 0.182218f, 0.179194f, 0.173800f, 0.165487f, 0.154409f, 0.141300f, 0.125879f, 0.107494f, 0.086830f, 0.064946f, 0.041711f, 0.017064f, -0.007788f, -0.032117f, -0.056536f, -0.080769f, -0.103025f, -0.122613f, -0.140519f, -0.156975f, -0.171383f, -0.184548f, -0.197943f, -0.211256f, -0.223337f, -0.234237f, -0.243922f, -0.251152f, -0.255800f, -0.259609f, -0.263111f, -0.265127f, -0.266052f, -0.267563f, -0.268996f, -0.268445f, -0.266765f, -0.265908f, -0.265057f, -0.262930f, -0.261168f, -0.261121f, -0.261008f, -0.259822f, -0.259144f, -0.258514f, -0.255135f, -0.249662f, -0.245226f, -0.240818f, -0.233602f, -0.225815f, -0.220718f, -0.215649f, -0.207922f, -0.201220f, -0.197675f, -0.192842f, -0.185897f, -0.182258f, + -0.180668f, -0.174392f, -0.167600f, -0.168651f, -0.169029f, -0.157694f, -0.148968f, -0.158093f, -0.162902f, -0.141194f, -0.125772f, -0.150997f, -0.167269f, -0.107757f, -0.029434f, -0.064168f, -0.214163f, -0.327492f, -0.315349f, -0.260318f, -0.248751f, -0.230395f, -0.140550f, -0.051921f, -0.083798f, -0.221304f, -0.333518f, -0.342531f, -0.290265f, -0.249776f, -0.232606f, -0.189157f, -0.077884f, 0.062184f, 0.117635f, 0.018087f, -0.157652f, -0.249383f, -0.198595f, -0.105435f, -0.085189f, -0.130387f, -0.154588f, -0.124714f, -0.094023f, -0.119576f, -0.192526f, -0.253906f}, + {-0.019502f, -0.024108f, -0.023741f, -0.009796f, 0.015547f, 0.040200f, 0.049418f, 0.030039f, -0.022935f, -0.089805f, -0.122188f, -0.081481f, 0.009195f, 0.073870f, 0.061521f, -0.001319f, -0.051768f, -0.064073f, -0.056806f, -0.044490f, -0.019688f, 0.017657f, 0.047591f, 0.057938f, 0.061200f, 0.071250f, 0.079820f, 0.068542f, 0.033537f, -0.011849f, -0.051126f, -0.073885f, -0.077564f, -0.068013f, -0.056218f, -0.049942f, -0.048764f, -0.047509f, -0.042223f, -0.032636f, -0.021389f, -0.011717f, -0.004812f, 0.000602f, 0.006040f, 0.011907f, 0.018434f, 0.026017f, 0.034094f, 0.041240f, 0.046701f, 0.050589f, 0.052772f, 0.052796f, 0.050455f, 0.045432f, 0.037083f, 0.025409f, 0.011341f, -0.004349f, -0.021366f, -0.039047f, -0.056623f, -0.074233f, -0.092292f, -0.110264f, -0.127486f, -0.144411f, -0.161405f, -0.177189f, -0.189933f, -0.198872f, -0.203514f, -0.202567f, -0.195078f, -0.181502f, -0.162623f, -0.138623f, -0.110014f, -0.078167f, -0.044145f, -0.008062f, 0.029925f, 0.068792f, 0.107070f, 0.143639f, 0.178228f, 0.211182f, 0.242095f, 0.268826f, 0.288929f, 0.301918f, 0.308848f, 0.309956f, 0.304163f, 0.290661f, + 0.269776f, 0.242758f, 0.211892f, 0.180019f, 0.148692f, 0.117379f, 0.085253f, 0.053049f, 0.022899f, -0.002684f, -0.021788f, -0.034534f, -0.043357f, -0.050497f, -0.055571f, -0.056701f, -0.053111f, -0.045412f, -0.034615f, -0.022156f, -0.009575f, 0.002997f, 0.016842f, 0.032605f, 0.049621f, 0.067258f, 0.085130f, 0.102158f, 0.117320f, 0.130988f, 0.143895f, 0.155582f, 0.165326f, 0.173298f, 0.179406f, 0.182544f, 0.182218f, 0.179194f, 0.173800f, 0.165487f, 0.154409f, 0.141300f, 0.125879f, 0.107494f, 0.086830f, 0.064946f, 0.041711f, 0.017064f, -0.007788f, -0.032117f, -0.056536f, -0.080769f, -0.103025f, -0.122613f, -0.140519f, -0.156975f, -0.171383f, -0.184548f, -0.197943f, -0.211256f, -0.223337f, -0.234237f, -0.243922f, -0.251152f, -0.255800f, -0.259609f, -0.263111f, -0.265127f, -0.266052f, -0.267563f, -0.268996f, -0.268445f, -0.266765f, -0.265908f, -0.265057f, -0.262930f, -0.261168f, -0.261121f, -0.261008f, -0.259822f, -0.259144f, -0.258514f, -0.255135f, -0.249662f, -0.245226f, -0.240818f, -0.233602f, -0.225815f, -0.220718f, -0.215649f, -0.207922f, -0.201220f, -0.197675f, -0.192842f, -0.185897f, -0.182258f, + -0.180668f, -0.174392f, -0.167600f, -0.168651f, -0.169029f, -0.157694f, -0.148968f, -0.158093f, -0.162902f, -0.141194f, -0.125772f, -0.150997f, -0.167269f, -0.107757f, -0.029434f, -0.064168f, -0.214163f, -0.327492f, -0.315349f, -0.260318f, -0.248751f, -0.230395f, -0.140550f, -0.051921f, -0.083798f, -0.221304f, -0.333518f, -0.342531f, -0.290265f, -0.249776f, -0.232606f, -0.189157f, -0.077884f, 0.062184f, 0.117635f, 0.018087f, -0.157652f, -0.249383f, -0.198595f, -0.105435f, -0.085189f, -0.130387f, -0.154588f, -0.124714f, -0.094023f, -0.119576f, -0.192526f, -0.253906f} + }, + { + {-0.020459f, -0.024226f, -0.007319f, 0.032932f, 0.070261f, 0.086507f, 0.075862f, 0.020380f, -0.084294f, -0.176022f, -0.160990f, -0.027778f, 0.117310f, 0.158297f, 0.084734f, -0.019435f, -0.070381f, -0.045836f, 0.018199f, 0.061503f, 0.043846f, -0.020982f, -0.078254f, -0.087465f, -0.055763f, -0.014491f, 0.018486f, 0.043047f, 0.061052f, 0.072989f, 0.082705f, 0.092874f, 0.099131f, 0.096147f, 0.085745f, 0.073416f, 0.060647f, 0.045821f, 0.029788f, 0.016090f, 0.007003f, 0.002079f, -0.000428f, -0.002439f, -0.005629f, -0.011124f, -0.019711f, -0.031936f, -0.047212f, -0.063304f, -0.077628f, -0.088759f, -0.096303f, -0.100279f, -0.101461f, -0.101586f, -0.102290f, -0.104165f, -0.107222f, -0.111679f, -0.117799f, -0.125379f, -0.133735f, -0.141832f, -0.148297f, -0.151761f, -0.151415f, -0.147006f, -0.138423f, -0.125892f, -0.110520f, -0.093878f, -0.076767f, -0.059088f, -0.041213f, -0.024578f, -0.010198f, 0.002580f, 0.014740f, 0.025521f, 0.033050f, 0.036977f, 0.039052f, 0.040734f, 0.041611f, 0.041098f, 0.040698f, 0.043240f, 0.050015f, 0.059556f, 0.069410f, 0.078511f, 0.087586f, 0.097736f, 0.109169f, 0.121258f, + 0.133264f, 0.144615f, 0.154849f, 0.163981f, 0.173051f, 0.183709f, 0.196801f, 0.211503f, 0.226081f, 0.239369f, 0.251298f, 0.262094f, 0.271304f, 0.277782f, 0.280558f, 0.279527f, 0.275234f, 0.268056f, 0.257727f, 0.243568f, 0.225141f, 0.202779f, 0.177630f, 0.151117f, 0.124165f, 0.096863f, 0.068855f, 0.040060f, 0.011112f, -0.016739f, -0.042197f, -0.064683f, -0.084716f, -0.103488f, -0.121850f, -0.139509f, -0.155119f, -0.167247f, -0.175419f, -0.180319f, -0.183098f, -0.184680f, -0.185579f, -0.185807f, -0.184744f, -0.181522f, -0.175876f, -0.168297f, -0.159258f, -0.148806f, -0.137132f, -0.124962f, -0.113038f, -0.101619f, -0.090702f, -0.080308f, -0.070353f, -0.060612f, -0.050949f, -0.041416f, -0.032282f, -0.024135f, -0.017602f, -0.012726f, -0.009002f, -0.006124f, -0.004067f, -0.002466f, -0.000761f, 0.000957f, 0.002161f, 0.002971f, 0.004124f, 0.006037f, 0.008815f, 0.012852f, 0.018515f, 0.025647f, 0.034053f, 0.043642f, 0.053522f, 0.062187f, 0.069139f, 0.074948f, 0.079527f, 0.082208f, 0.083470f, 0.084404f, 0.084728f, 0.083626f, 0.081696f, 0.079585f, 0.076316f, 0.071580f, 0.067155f, 0.063445f, + 0.058415f, 0.052516f, 0.049067f, 0.047225f, 0.042514f, 0.036817f, 0.036645f, 0.038671f, 0.032655f, 0.022831f, 0.024748f, 0.033033f, 0.020825f, -0.012684f, -0.026595f, 0.002934f, 0.039449f, 0.037888f, 0.011764f, 0.003902f, 0.012957f, 0.004264f, -0.017371f, -0.007040f, 0.042603f, 0.080439f, 0.072238f, 0.048300f, 0.049597f, 0.067279f, 0.069762f, 0.058815f, 0.056785f, 0.054038f, 0.014698f, -0.061189f, -0.119777f, -0.117042f, -0.074421f, -0.044738f, -0.040786f, -0.033880f, -0.015908f, -0.014212f, -0.029787f, -0.010524f, 0.073048f, 0.159587f}, + {-0.020459f, -0.024226f, -0.007319f, 0.032932f, 0.070261f, 0.086507f, 0.075862f, 0.020380f, -0.084294f, -0.176022f, -0.160990f, -0.027778f, 0.117310f, 0.158297f, 0.084734f, -0.019435f, -0.070381f, -0.045836f, 0.018199f, 0.061503f, 0.043846f, -0.020982f, -0.078254f, -0.087465f, -0.055763f, -0.014491f, 0.018486f, 0.043047f, 0.061052f, 0.072989f, 0.082705f, 0.092874f, 0.099131f, 0.096147f, 0.085745f, 0.073416f, 0.060647f, 0.045821f, 0.029788f, 0.016090f, 0.007003f, 0.002079f, -0.000428f, -0.002439f, -0.005629f, -0.011124f, -0.019711f, -0.031936f, -0.047212f, -0.063304f, -0.077628f, -0.088759f, -0.096303f, -0.100279f, -0.101461f, -0.101586f, -0.102290f, -0.104165f, -0.107222f, -0.111679f, -0.117799f, -0.125379f, -0.133735f, -0.141832f, -0.148297f, -0.151761f, -0.151415f, -0.147006f, -0.138423f, -0.125892f, -0.110520f, -0.093878f, -0.076767f, -0.059088f, -0.041213f, -0.024578f, -0.010198f, 0.002580f, 0.014740f, 0.025521f, 0.033050f, 0.036977f, 0.039052f, 0.040734f, 0.041611f, 0.041098f, 0.040698f, 0.043240f, 0.050015f, 0.059556f, 0.069410f, 0.078511f, 0.087586f, 0.097736f, 0.109169f, 0.121258f, + 0.133264f, 0.144615f, 0.154849f, 0.163981f, 0.173051f, 0.183709f, 0.196801f, 0.211503f, 0.226081f, 0.239369f, 0.251298f, 0.262094f, 0.271304f, 0.277782f, 0.280558f, 0.279527f, 0.275234f, 0.268056f, 0.257727f, 0.243568f, 0.225141f, 0.202779f, 0.177630f, 0.151117f, 0.124165f, 0.096863f, 0.068855f, 0.040060f, 0.011112f, -0.016739f, -0.042197f, -0.064683f, -0.084716f, -0.103488f, -0.121850f, -0.139509f, -0.155119f, -0.167247f, -0.175419f, -0.180319f, -0.183098f, -0.184680f, -0.185579f, -0.185807f, -0.184744f, -0.181522f, -0.175876f, -0.168297f, -0.159258f, -0.148806f, -0.137132f, -0.124962f, -0.113038f, -0.101619f, -0.090702f, -0.080308f, -0.070353f, -0.060612f, -0.050949f, -0.041416f, -0.032282f, -0.024135f, -0.017602f, -0.012726f, -0.009002f, -0.006124f, -0.004067f, -0.002466f, -0.000761f, 0.000957f, 0.002161f, 0.002971f, 0.004124f, 0.006037f, 0.008815f, 0.012852f, 0.018515f, 0.025647f, 0.034053f, 0.043642f, 0.053522f, 0.062187f, 0.069139f, 0.074948f, 0.079527f, 0.082208f, 0.083470f, 0.084404f, 0.084728f, 0.083626f, 0.081696f, 0.079585f, 0.076316f, 0.071580f, 0.067155f, 0.063445f, + 0.058415f, 0.052516f, 0.049067f, 0.047225f, 0.042514f, 0.036817f, 0.036645f, 0.038671f, 0.032655f, 0.022831f, 0.024748f, 0.033033f, 0.020825f, -0.012684f, -0.026595f, 0.002934f, 0.039449f, 0.037888f, 0.011764f, 0.003902f, 0.012957f, 0.004264f, -0.017371f, -0.007040f, 0.042603f, 0.080439f, 0.072238f, 0.048300f, 0.049597f, 0.067279f, 0.069762f, 0.058815f, 0.056785f, 0.054038f, 0.014698f, -0.061189f, -0.119777f, -0.117042f, -0.074421f, -0.044738f, -0.040786f, -0.033880f, -0.015908f, -0.014212f, -0.029787f, -0.010524f, 0.073048f, 0.159587f} + }, + { + {0.019230f, 0.005435f, -0.001670f, -0.001294f, -0.010487f, -0.014461f, 0.030667f, 0.113202f, 0.129777f, 0.000014f, -0.192920f, -0.252233f, -0.092604f, 0.136952f, 0.210772f, 0.080821f, -0.088991f, -0.135389f, -0.068588f, -0.005284f, 0.003323f, 0.008914f, 0.058759f, 0.125754f, 0.159400f, 0.154680f, 0.140967f, 0.131350f, 0.112781f, 0.074083f, 0.020441f, -0.036433f, -0.087254f, -0.125241f, -0.147468f, -0.156986f, -0.158982f, -0.155710f, -0.147485f, -0.135704f, -0.122237f, -0.108291f, -0.095850f, -0.087923f, -0.085775f, -0.087690f, -0.091184f, -0.094666f, -0.096753f, -0.096083f, -0.092338f, -0.086137f, -0.077823f, -0.067513f, -0.056131f, -0.045302f, -0.036332f, -0.029950f, -0.026691f, -0.026859f, -0.030291f, -0.036478f, -0.044739f, -0.054291f, -0.064399f, -0.074432f, -0.083671f, -0.091357f, -0.096998f, -0.100237f, -0.100391f, -0.096616f, -0.088516f, -0.076165f, -0.059741f, -0.039630f, -0.016638f, 0.008301f, 0.034252f, 0.059947f, 0.084149f, 0.106719f, 0.128442f, 0.149556f, 0.169460f, 0.188009f, 0.205788f, 0.222968f, 0.239578f, 0.257255f, 0.278793f, 0.304945f, 0.333017f, 0.359631f, 0.383799f, 0.406350f, + 0.427076f, 0.443453f, 0.452044f, 0.450717f, 0.439522f, 0.419637f, 0.391822f, 0.356313f, 0.314014f, 0.266992f, 0.217371f, 0.166115f, 0.113115f, 0.058318f, 0.002811f, -0.051061f, -0.100914f, -0.145969f, -0.187244f, -0.225959f, -0.262069f, -0.294432f, -0.321896f, -0.344122f, -0.361927f, -0.376984f, -0.390730f, -0.403348f, -0.414010f, -0.421940f, -0.426962f, -0.429318f, -0.429290f, -0.426748f, -0.420950f, -0.411152f, -0.397449f, -0.380556f, -0.360910f, -0.338489f, -0.313239f, -0.285005f, -0.253467f, -0.218939f, -0.182850f, -0.146776f, -0.111419f, -0.076975f, -0.043728f, -0.011673f, 0.019551f, 0.049686f, 0.077567f, 0.102298f, 0.124067f, 0.143556f, 0.161395f, 0.178368f, 0.195283f, 0.212309f, 0.228806f, 0.243707f, 0.255881f, 0.264647f, 0.270268f, 0.273474f, 0.274516f, 0.273393f, 0.270618f, 0.266694f, 0.261220f, 0.253687f, 0.244636f, 0.234924f, 0.224646f, 0.213843f, 0.203253f, 0.193378f, 0.183911f, 0.174737f, 0.166068f, 0.157360f, 0.147829f, 0.137984f, 0.128785f, 0.119872f, 0.110662f, 0.102037f, 0.094727f, 0.087797f, 0.080834f, 0.075139f, 0.070900f, 0.066532f, 0.062189f, 0.059562f, + 0.057528f, 0.053708f, 0.049943f, 0.048889f, 0.046992f, 0.040524f, 0.035070f, 0.036201f, 0.036089f, 0.026789f, 0.019854f, 0.028515f, 0.036415f, 0.016301f, -0.020707f, -0.031384f, -0.002200f, 0.032420f, 0.043959f, 0.043313f, 0.045513f, 0.041021f, 0.025268f, 0.020977f, 0.042917f, 0.069031f, 0.074200f, 0.068229f, 0.074435f, 0.093211f, 0.111764f, 0.127851f, 0.138412f, 0.126789f, 0.090350f, 0.062570f, 0.076196f, 0.116262f, 0.139539f, 0.132391f, 0.119607f, 0.119984f, 0.124718f, 0.125718f, 0.138639f, 0.182077f, 0.246020f, 0.293881f}, + {0.019230f, 0.005435f, -0.001670f, -0.001294f, -0.010487f, -0.014461f, 0.030667f, 0.113202f, 0.129777f, 0.000014f, -0.192920f, -0.252233f, -0.092604f, 0.136952f, 0.210772f, 0.080821f, -0.088991f, -0.135389f, -0.068588f, -0.005284f, 0.003323f, 0.008914f, 0.058759f, 0.125754f, 0.159400f, 0.154680f, 0.140967f, 0.131350f, 0.112781f, 0.074083f, 0.020441f, -0.036433f, -0.087254f, -0.125241f, -0.147468f, -0.156986f, -0.158982f, -0.155710f, -0.147485f, -0.135704f, -0.122237f, -0.108291f, -0.095850f, -0.087923f, -0.085775f, -0.087690f, -0.091184f, -0.094666f, -0.096753f, -0.096083f, -0.092338f, -0.086137f, -0.077823f, -0.067513f, -0.056131f, -0.045302f, -0.036332f, -0.029950f, -0.026691f, -0.026859f, -0.030291f, -0.036478f, -0.044739f, -0.054291f, -0.064399f, -0.074432f, -0.083671f, -0.091357f, -0.096998f, -0.100237f, -0.100391f, -0.096616f, -0.088516f, -0.076165f, -0.059741f, -0.039630f, -0.016638f, 0.008301f, 0.034252f, 0.059947f, 0.084149f, 0.106719f, 0.128442f, 0.149556f, 0.169460f, 0.188009f, 0.205788f, 0.222968f, 0.239578f, 0.257255f, 0.278793f, 0.304945f, 0.333017f, 0.359631f, 0.383799f, 0.406350f, + 0.427076f, 0.443453f, 0.452044f, 0.450717f, 0.439522f, 0.419637f, 0.391822f, 0.356313f, 0.314014f, 0.266992f, 0.217371f, 0.166115f, 0.113115f, 0.058318f, 0.002811f, -0.051061f, -0.100914f, -0.145969f, -0.187244f, -0.225959f, -0.262069f, -0.294432f, -0.321896f, -0.344122f, -0.361927f, -0.376984f, -0.390730f, -0.403348f, -0.414010f, -0.421940f, -0.426962f, -0.429318f, -0.429290f, -0.426748f, -0.420950f, -0.411152f, -0.397449f, -0.380556f, -0.360910f, -0.338489f, -0.313239f, -0.285005f, -0.253467f, -0.218939f, -0.182850f, -0.146776f, -0.111419f, -0.076975f, -0.043728f, -0.011673f, 0.019551f, 0.049686f, 0.077567f, 0.102298f, 0.124067f, 0.143556f, 0.161395f, 0.178368f, 0.195283f, 0.212309f, 0.228806f, 0.243707f, 0.255881f, 0.264647f, 0.270268f, 0.273474f, 0.274516f, 0.273393f, 0.270618f, 0.266694f, 0.261220f, 0.253687f, 0.244636f, 0.234924f, 0.224646f, 0.213843f, 0.203253f, 0.193378f, 0.183911f, 0.174737f, 0.166068f, 0.157360f, 0.147829f, 0.137984f, 0.128785f, 0.119872f, 0.110662f, 0.102037f, 0.094727f, 0.087797f, 0.080834f, 0.075139f, 0.070900f, 0.066532f, 0.062189f, 0.059562f, + 0.057528f, 0.053708f, 0.049943f, 0.048889f, 0.046992f, 0.040524f, 0.035070f, 0.036201f, 0.036089f, 0.026789f, 0.019854f, 0.028515f, 0.036415f, 0.016301f, -0.020707f, -0.031384f, -0.002200f, 0.032420f, 0.043959f, 0.043313f, 0.045513f, 0.041021f, 0.025268f, 0.020977f, 0.042917f, 0.069031f, 0.074200f, 0.068229f, 0.074435f, 0.093211f, 0.111764f, 0.127851f, 0.138412f, 0.126789f, 0.090350f, 0.062570f, 0.076196f, 0.116262f, 0.139539f, 0.132391f, 0.119607f, 0.119984f, 0.124718f, 0.125718f, 0.138639f, 0.182077f, 0.246020f, 0.293881f} + }, + { + {-0.004423f, -0.003680f, -0.002575f, -0.001704f, -0.003298f, -0.009990f, -0.016789f, -0.009381f, 0.013931f, 0.019772f, -0.029696f, -0.105359f, -0.108022f, 0.013139f, 0.158404f, 0.164232f, 0.005487f, -0.155136f, -0.155733f, -0.019301f, 0.099136f, 0.104894f, 0.038243f, -0.019329f, -0.038505f, -0.031569f, -0.007440f, 0.030512f, 0.068864f, 0.092556f, 0.099631f, 0.096497f, 0.087824f, 0.077833f, 0.072061f, 0.071039f, 0.067981f, 0.056527f, 0.036499f, 0.011015f, -0.016897f, -0.043579f, -0.064988f, -0.079286f, -0.087153f, -0.089777f, -0.088480f, -0.085494f, -0.082997f, -0.081746f, -0.081767f, -0.083418f, -0.086783f, -0.090960f, -0.094751f, -0.097418f, -0.098548f, -0.098108f, -0.096834f, -0.095829f, -0.095756f, -0.096938f, -0.099845f, -0.104733f, -0.111080f, -0.118033f, -0.125180f, -0.132437f, -0.139508f, -0.145970f, -0.151644f, -0.156453f, -0.160072f, -0.162123f, -0.162733f, -0.162527f, -0.161866f, -0.160437f, -0.157991f, -0.155238f, -0.153188f, -0.151562f, -0.148788f, -0.143986f, -0.138030f, -0.131928f, -0.124917f, -0.115172f, -0.102129f, -0.087299f, -0.072817f, -0.059768f, -0.048018f, -0.037364f, -0.028595f, -0.023189f, + -0.021839f, -0.023601f, -0.026896f, -0.031210f, -0.037395f, -0.046314f, -0.057460f, -0.068846f, -0.078064f, -0.083668f, -0.085857f, -0.085916f, -0.084872f, -0.082672f, -0.078518f, -0.071816f, -0.062803f, -0.052472f, -0.041961f, -0.031940f, -0.022440f, -0.013098f, -0.003491f, 0.006606f, 0.017075f, 0.027610f, 0.038115f, 0.048801f, 0.059796f, 0.070835f, 0.081425f, 0.091108f, 0.099513f, 0.106449f, 0.112073f, 0.116786f, 0.120921f, 0.124710f, 0.128466f, 0.132563f, 0.137299f, 0.142939f, 0.149802f, 0.158143f, 0.168056f, 0.179520f, 0.192346f, 0.206065f, 0.220068f, 0.233786f, 0.246615f, 0.257930f, 0.267420f, 0.275131f, 0.280999f, 0.284712f, 0.286146f, 0.285449f, 0.282583f, 0.277328f, 0.269804f, 0.260438f, 0.249489f, 0.237152f, 0.223959f, 0.210474f, 0.196856f, 0.183212f, 0.169971f, 0.157536f, 0.146111f, 0.136111f, 0.127934f, 0.121231f, 0.115268f, 0.109883f, 0.105097f, 0.100223f, 0.094576f, 0.088506f, 0.082554f, 0.076446f, 0.069926f, 0.063313f, 0.056344f, 0.048087f, 0.038644f, 0.028934f, 0.018687f, 0.007186f, -0.004414f, -0.014506f, -0.023733f, -0.033085f, -0.041408f, -0.048241f, + -0.055610f, -0.063517f, -0.069118f, -0.073690f, -0.081987f, -0.091437f, -0.094480f, -0.095028f, -0.104280f, -0.115905f, -0.112025f, -0.101605f, -0.115283f, -0.144765f, -0.134628f, -0.067980f, -0.010744f, -0.020992f, -0.061710f, -0.068485f, -0.059208f, -0.090471f, -0.135033f, -0.106671f, -0.005182f, 0.066546f, 0.051133f, 0.009516f, 0.011923f, 0.041853f, 0.055633f, 0.061571f, 0.078429f, 0.074336f, 0.017492f, -0.049276f, -0.053327f, 0.006541f, 0.062892f, 0.074902f, 0.066734f, 0.070182f, 0.080188f, 0.084197f, 0.098518f, 0.148064f, 0.224120f, 0.282366f}, + {-0.004423f, -0.003680f, -0.002575f, -0.001704f, -0.003298f, -0.009990f, -0.016789f, -0.009381f, 0.013931f, 0.019772f, -0.029696f, -0.105359f, -0.108022f, 0.013139f, 0.158404f, 0.164232f, 0.005487f, -0.155136f, -0.155733f, -0.019301f, 0.099136f, 0.104894f, 0.038243f, -0.019329f, -0.038505f, -0.031569f, -0.007440f, 0.030512f, 0.068864f, 0.092556f, 0.099631f, 0.096497f, 0.087824f, 0.077833f, 0.072061f, 0.071039f, 0.067981f, 0.056527f, 0.036499f, 0.011015f, -0.016897f, -0.043579f, -0.064988f, -0.079286f, -0.087153f, -0.089777f, -0.088480f, -0.085494f, -0.082997f, -0.081746f, -0.081767f, -0.083418f, -0.086783f, -0.090960f, -0.094751f, -0.097418f, -0.098548f, -0.098108f, -0.096834f, -0.095829f, -0.095756f, -0.096938f, -0.099845f, -0.104733f, -0.111080f, -0.118033f, -0.125180f, -0.132437f, -0.139508f, -0.145970f, -0.151644f, -0.156453f, -0.160072f, -0.162123f, -0.162733f, -0.162527f, -0.161866f, -0.160437f, -0.157991f, -0.155238f, -0.153188f, -0.151562f, -0.148788f, -0.143986f, -0.138030f, -0.131928f, -0.124917f, -0.115172f, -0.102129f, -0.087299f, -0.072817f, -0.059768f, -0.048018f, -0.037364f, -0.028595f, -0.023189f, + -0.021839f, -0.023601f, -0.026896f, -0.031210f, -0.037395f, -0.046314f, -0.057460f, -0.068846f, -0.078064f, -0.083668f, -0.085857f, -0.085916f, -0.084872f, -0.082672f, -0.078518f, -0.071816f, -0.062803f, -0.052472f, -0.041961f, -0.031940f, -0.022440f, -0.013098f, -0.003491f, 0.006606f, 0.017075f, 0.027610f, 0.038115f, 0.048801f, 0.059796f, 0.070835f, 0.081425f, 0.091108f, 0.099513f, 0.106449f, 0.112073f, 0.116786f, 0.120921f, 0.124710f, 0.128466f, 0.132563f, 0.137299f, 0.142939f, 0.149802f, 0.158143f, 0.168056f, 0.179520f, 0.192346f, 0.206065f, 0.220068f, 0.233786f, 0.246615f, 0.257930f, 0.267420f, 0.275131f, 0.280999f, 0.284712f, 0.286146f, 0.285449f, 0.282583f, 0.277328f, 0.269804f, 0.260438f, 0.249489f, 0.237152f, 0.223959f, 0.210474f, 0.196856f, 0.183212f, 0.169971f, 0.157536f, 0.146111f, 0.136111f, 0.127934f, 0.121231f, 0.115268f, 0.109883f, 0.105097f, 0.100223f, 0.094576f, 0.088506f, 0.082554f, 0.076446f, 0.069926f, 0.063313f, 0.056344f, 0.048087f, 0.038644f, 0.028934f, 0.018687f, 0.007186f, -0.004414f, -0.014506f, -0.023733f, -0.033085f, -0.041408f, -0.048241f, + -0.055610f, -0.063517f, -0.069118f, -0.073690f, -0.081987f, -0.091437f, -0.094480f, -0.095028f, -0.104280f, -0.115905f, -0.112025f, -0.101605f, -0.115283f, -0.144765f, -0.134628f, -0.067980f, -0.010744f, -0.020992f, -0.061710f, -0.068485f, -0.059208f, -0.090471f, -0.135033f, -0.106671f, -0.005182f, 0.066546f, 0.051133f, 0.009516f, 0.011923f, 0.041853f, 0.055633f, 0.061571f, 0.078429f, 0.074336f, 0.017492f, -0.049276f, -0.053327f, 0.006541f, 0.062892f, 0.074902f, 0.066734f, 0.070182f, 0.080188f, 0.084197f, 0.098518f, 0.148064f, 0.224120f, 0.282366f} + } +}; +const float CRendBin_HOA3_HRIR_coeff_im_48kHz[16][BINAURAL_CHANNELS][240]={ + { + {-0.176883f, -0.484101f, -0.681502f, -0.759839f, -0.743260f, -0.671712f, -0.583362f, -0.478304f, -0.318825f, -0.095272f, 0.143578f, 0.354065f, 0.522400f, 0.573653f, 0.367199f, -0.078420f, -0.434443f, -0.343870f, 0.124508f, 0.486226f, 0.372821f, -0.092766f, -0.525036f, -0.722391f, -0.754199f, -0.724386f, -0.637689f, -0.485195f, -0.312888f, -0.164002f, -0.032292f, 0.097628f, 0.214974f, 0.307441f, 0.382911f, 0.451049f, 0.508993f, 0.554173f, 0.591982f, 0.625936f, 0.654364f, 0.677958f, 0.699685f, 0.718618f, 0.732355f, 0.742627f, 0.751969f, 0.759034f, 0.762320f, 0.763889f, 0.765445f, 0.765427f, 0.762747f, 0.758848f, 0.754374f, 0.748173f, 0.740408f, 0.732723f, 0.725282f, 0.717124f, 0.708777f, 0.701375f, 0.694353f, 0.686709f, 0.679081f, 0.672366f, 0.665974f, 0.659245f, 0.652813f, 0.647208f, 0.641839f, 0.636297f, 0.631020f, 0.626150f, 0.621184f, 0.615916f, 0.610540f, 0.605002f, 0.599137f, 0.592942f, 0.586130f, 0.578295f, 0.569816f, 0.561467f, 0.553030f, 0.543661f, 0.533605f, 0.523989f, 0.514958f, 0.505546f, 0.495406f, 0.485340f, 0.476136f, 0.467922f, 0.460482f, 0.453537f, + 0.447032f, 0.441566f, 0.437916f, 0.435874f, 0.434316f, 0.432632f, 0.431274f, 0.430811f, 0.431194f, 0.431966f, 0.432511f, 0.432256f, 0.431201f, 0.430003f, 0.429097f, 0.428076f, 0.426269f, 0.423428f, 0.419640f, 0.415127f, 0.410339f, 0.405686f, 0.401048f, 0.395985f, 0.390391f, 0.384517f, 0.378555f, 0.372595f, 0.366765f, 0.361032f, 0.355147f, 0.349030f, 0.342953f, 0.337206f, 0.331908f, 0.327170f, 0.323068f, 0.319457f, 0.316138f, 0.313128f, 0.310528f, 0.308327f, 0.306547f, 0.305321f, 0.304600f, 0.304043f, 0.303340f, 0.302393f, 0.301119f, 0.299399f, 0.297227f, 0.294657f, 0.291623f, 0.288018f, 0.283862f, 0.279239f, 0.274219f, 0.268923f, 0.263528f, 0.258150f, 0.252868f, 0.247800f, 0.243031f, 0.238568f, 0.234457f, 0.230786f, 0.227529f, 0.224597f, 0.221967f, 0.219543f, 0.217037f, 0.214279f, 0.211416f, 0.208572f, 0.205658f, 0.202707f, 0.199947f, 0.197400f, 0.194917f, 0.192647f, 0.190846f, 0.189375f, 0.188016f, 0.186967f, 0.186341f, 0.185707f, 0.184804f, 0.183946f, 0.183129f, 0.181782f, 0.179880f, 0.177983f, 0.175907f, 0.173014f, 0.169749f, 0.166885f, + 0.163721f, 0.159457f, 0.155288f, 0.152176f, 0.148348f, 0.142651f, 0.137657f, 0.134832f, 0.130418f, 0.122200f, 0.115519f, 0.114151f, 0.110369f, 0.095566f, 0.077072f, 0.070974f, 0.079309f, 0.087709f, 0.085554f, 0.075310f, 0.062218f, 0.049806f, 0.047081f, 0.063318f, 0.089933f, 0.102721f, 0.090827f, 0.071653f, 0.068003f, 0.080960f, 0.096237f, 0.109049f, 0.128470f, 0.157990f, 0.183447f, 0.185496f, 0.159930f, 0.121484f, 0.088399f, 0.066734f, 0.051403f, 0.038568f, 0.029965f, 0.024659f, 0.015630f, 0.000683f, -0.009979f, -0.006119f}, + {-0.176883f, -0.484101f, -0.681502f, -0.759839f, -0.743260f, -0.671712f, -0.583362f, -0.478304f, -0.318825f, -0.095272f, 0.143578f, 0.354065f, 0.522400f, 0.573653f, 0.367199f, -0.078420f, -0.434443f, -0.343870f, 0.124508f, 0.486226f, 0.372821f, -0.092766f, -0.525036f, -0.722391f, -0.754199f, -0.724386f, -0.637689f, -0.485195f, -0.312888f, -0.164002f, -0.032292f, 0.097628f, 0.214974f, 0.307441f, 0.382911f, 0.451049f, 0.508993f, 0.554173f, 0.591982f, 0.625936f, 0.654364f, 0.677958f, 0.699685f, 0.718618f, 0.732355f, 0.742627f, 0.751969f, 0.759034f, 0.762320f, 0.763889f, 0.765445f, 0.765427f, 0.762747f, 0.758848f, 0.754374f, 0.748173f, 0.740408f, 0.732723f, 0.725282f, 0.717124f, 0.708777f, 0.701375f, 0.694353f, 0.686709f, 0.679081f, 0.672366f, 0.665974f, 0.659245f, 0.652813f, 0.647208f, 0.641839f, 0.636297f, 0.631020f, 0.626150f, 0.621184f, 0.615916f, 0.610540f, 0.605002f, 0.599137f, 0.592942f, 0.586130f, 0.578295f, 0.569816f, 0.561467f, 0.553030f, 0.543661f, 0.533605f, 0.523989f, 0.514958f, 0.505546f, 0.495406f, 0.485340f, 0.476136f, 0.467922f, 0.460482f, 0.453537f, + 0.447032f, 0.441566f, 0.437916f, 0.435874f, 0.434316f, 0.432632f, 0.431274f, 0.430811f, 0.431194f, 0.431966f, 0.432511f, 0.432256f, 0.431201f, 0.430003f, 0.429097f, 0.428076f, 0.426269f, 0.423428f, 0.419640f, 0.415127f, 0.410339f, 0.405686f, 0.401048f, 0.395985f, 0.390391f, 0.384517f, 0.378555f, 0.372595f, 0.366765f, 0.361032f, 0.355147f, 0.349030f, 0.342953f, 0.337206f, 0.331908f, 0.327170f, 0.323068f, 0.319457f, 0.316138f, 0.313128f, 0.310528f, 0.308327f, 0.306547f, 0.305321f, 0.304600f, 0.304043f, 0.303340f, 0.302393f, 0.301119f, 0.299399f, 0.297227f, 0.294657f, 0.291623f, 0.288018f, 0.283862f, 0.279239f, 0.274219f, 0.268923f, 0.263528f, 0.258150f, 0.252868f, 0.247800f, 0.243031f, 0.238568f, 0.234457f, 0.230786f, 0.227529f, 0.224597f, 0.221967f, 0.219543f, 0.217037f, 0.214279f, 0.211416f, 0.208572f, 0.205658f, 0.202707f, 0.199947f, 0.197400f, 0.194917f, 0.192647f, 0.190846f, 0.189375f, 0.188016f, 0.186967f, 0.186341f, 0.185707f, 0.184804f, 0.183946f, 0.183129f, 0.181782f, 0.179880f, 0.177983f, 0.175907f, 0.173014f, 0.169749f, 0.166885f, + 0.163721f, 0.159457f, 0.155288f, 0.152176f, 0.148348f, 0.142651f, 0.137657f, 0.134832f, 0.130418f, 0.122200f, 0.115519f, 0.114151f, 0.110369f, 0.095566f, 0.077072f, 0.070974f, 0.079309f, 0.087709f, 0.085554f, 0.075310f, 0.062218f, 0.049806f, 0.047081f, 0.063318f, 0.089933f, 0.102721f, 0.090827f, 0.071653f, 0.068003f, 0.080960f, 0.096237f, 0.109049f, 0.128470f, 0.157990f, 0.183447f, 0.185496f, 0.159930f, 0.121484f, 0.088399f, 0.066734f, 0.051403f, 0.038568f, 0.029965f, 0.024659f, 0.015630f, 0.000683f, -0.009979f, -0.006119f} + }, + { + {0.139811f, 0.337680f, 0.309928f, 0.007865f, -0.460052f, -0.904017f, -1.187273f, -1.245347f, -1.047341f, -0.642813f, -0.178251f, 0.255482f, 0.696327f, 1.065155f, 0.997728f, 0.263824f, -0.669296f, -0.911797f, -0.169209f, 0.827247f, 1.142336f, 0.643160f, -0.071883f, -0.512664f, -0.694340f, -0.796456f, -0.832000f, -0.752642f, -0.618206f, -0.514447f, -0.432971f, -0.329732f, -0.215270f, -0.120320f, -0.037944f, 0.050458f, 0.138590f, 0.216448f, 0.291141f, 0.367466f, 0.437249f, 0.497434f, 0.554267f, 0.607280f, 0.650114f, 0.684871f, 0.717859f, 0.746604f, 0.765897f, 0.779257f, 0.792413f, 0.803890f, 0.811171f, 0.817031f, 0.823086f, 0.826132f, 0.825083f, 0.822817f, 0.819425f, 0.812156f, 0.801947f, 0.792033f, 0.781683f, 0.768517f, 0.754237f, 0.741632f, 0.729521f, 0.716105f, 0.703200f, 0.692765f, 0.683590f, 0.674714f, 0.667761f, 0.663634f, 0.661007f, 0.659222f, 0.658950f, 0.659915f, 0.661194f, 0.662882f, 0.664859f, 0.665785f, 0.665416f, 0.665313f, 0.665679f, 0.664686f, 0.662061f, 0.659813f, 0.658729f, 0.657658f, 0.656469f, 0.656268f, 0.656891f, 0.657238f, 0.657303f, 0.657243f, + 0.655771f, 0.651744f, 0.645638f, 0.637693f, 0.626755f, 0.612363f, 0.595752f, 0.577822f, 0.558363f, 0.537653f, 0.516647f, 0.495719f, 0.475297f, 0.457049f, 0.442419f, 0.430883f, 0.421223f, 0.413188f, 0.406700f, 0.401222f, 0.396933f, 0.394659f, 0.393933f, 0.392945f, 0.390662f, 0.387246f, 0.382789f, 0.377529f, 0.372623f, 0.368899f, 0.365629f, 0.361963f, 0.358320f, 0.355195f, 0.352156f, 0.348998f, 0.346276f, 0.344053f, 0.341722f, 0.339344f, 0.337548f, 0.336220f, 0.334859f, 0.333734f, 0.333307f, 0.333272f, 0.333372f, 0.334113f, 0.335707f, 0.337542f, 0.339297f, 0.341219f, 0.343021f, 0.344012f, 0.344285f, 0.344318f, 0.343803f, 0.342252f, 0.340023f, 0.337478f, 0.334140f, 0.329736f, 0.324809f, 0.319534f, 0.313397f, 0.306449f, 0.299331f, 0.291965f, 0.283816f, 0.275134f, 0.266430f, 0.257468f, 0.248114f, 0.239081f, 0.230677f, 0.222271f, 0.213733f, 0.205671f, 0.197839f, 0.189344f, 0.180405f, 0.171906f, 0.163769f, 0.155721f, 0.148459f, 0.142253f, 0.136125f, 0.129829f, 0.124280f, 0.119189f, 0.113229f, 0.106765f, 0.101047f, 0.095433f, 0.088960f, 0.082699f, + 0.077090f, 0.070452f, 0.063164f, 0.057658f, 0.052165f, 0.042986f, 0.033716f, 0.029705f, 0.024528f, 0.010022f, -0.003487f, -0.003563f, -0.008281f, -0.044222f, -0.091161f, -0.097337f, -0.059345f, -0.032430f, -0.044938f, -0.063814f, -0.071121f, -0.106555f, -0.189396f, -0.259807f, -0.255503f, -0.202390f, -0.174583f, -0.199128f, -0.246722f, -0.285440f, -0.305850f, -0.323862f, -0.381849f, -0.499832f, -0.602701f, -0.562505f, -0.358033f, -0.132175f, -0.035515f, -0.063390f, -0.105690f, -0.109852f, -0.119592f, -0.173771f, -0.239521f, -0.254709f, -0.192460f, -0.071071f}, + {-0.139811f, -0.337680f, -0.309928f, -0.007865f, 0.460052f, 0.904017f, 1.187273f, 1.245347f, 1.047341f, 0.642813f, 0.178251f, -0.255482f, -0.696327f, -1.065155f, -0.997728f, -0.263824f, 0.669296f, 0.911797f, 0.169209f, -0.827247f, -1.142336f, -0.643160f, 0.071883f, 0.512664f, 0.694340f, 0.796456f, 0.832000f, 0.752642f, 0.618206f, 0.514447f, 0.432971f, 0.329732f, 0.215270f, 0.120320f, 0.037944f, -0.050458f, -0.138590f, -0.216448f, -0.291141f, -0.367466f, -0.437249f, -0.497434f, -0.554267f, -0.607280f, -0.650114f, -0.684871f, -0.717859f, -0.746604f, -0.765897f, -0.779257f, -0.792413f, -0.803890f, -0.811171f, -0.817031f, -0.823086f, -0.826132f, -0.825083f, -0.822817f, -0.819425f, -0.812156f, -0.801947f, -0.792033f, -0.781683f, -0.768517f, -0.754237f, -0.741632f, -0.729521f, -0.716105f, -0.703200f, -0.692765f, -0.683590f, -0.674714f, -0.667761f, -0.663634f, -0.661007f, -0.659222f, -0.658950f, -0.659915f, -0.661194f, -0.662882f, -0.664859f, -0.665785f, -0.665416f, -0.665313f, -0.665679f, -0.664686f, -0.662061f, -0.659813f, -0.658729f, -0.657658f, -0.656469f, -0.656268f, -0.656891f, -0.657238f, -0.657303f, -0.657243f, + -0.655771f, -0.651744f, -0.645638f, -0.637693f, -0.626755f, -0.612363f, -0.595752f, -0.577822f, -0.558363f, -0.537653f, -0.516647f, -0.495719f, -0.475297f, -0.457049f, -0.442419f, -0.430883f, -0.421223f, -0.413188f, -0.406700f, -0.401222f, -0.396933f, -0.394659f, -0.393933f, -0.392945f, -0.390662f, -0.387246f, -0.382789f, -0.377529f, -0.372623f, -0.368899f, -0.365629f, -0.361963f, -0.358320f, -0.355195f, -0.352156f, -0.348998f, -0.346276f, -0.344053f, -0.341722f, -0.339344f, -0.337548f, -0.336220f, -0.334859f, -0.333734f, -0.333307f, -0.333272f, -0.333372f, -0.334113f, -0.335707f, -0.337542f, -0.339297f, -0.341219f, -0.343021f, -0.344012f, -0.344285f, -0.344318f, -0.343803f, -0.342252f, -0.340023f, -0.337478f, -0.334140f, -0.329736f, -0.324809f, -0.319534f, -0.313397f, -0.306449f, -0.299331f, -0.291965f, -0.283816f, -0.275134f, -0.266430f, -0.257468f, -0.248114f, -0.239081f, -0.230677f, -0.222271f, -0.213733f, -0.205671f, -0.197839f, -0.189344f, -0.180405f, -0.171906f, -0.163769f, -0.155721f, -0.148459f, -0.142253f, -0.136125f, -0.129829f, -0.124280f, -0.119189f, -0.113229f, -0.106765f, -0.101047f, -0.095433f, -0.088960f, -0.082699f, + -0.077090f, -0.070452f, -0.063164f, -0.057658f, -0.052165f, -0.042986f, -0.033716f, -0.029705f, -0.024528f, -0.010022f, 0.003487f, 0.003563f, 0.008281f, 0.044222f, 0.091161f, 0.097337f, 0.059345f, 0.032430f, 0.044938f, 0.063814f, 0.071121f, 0.106555f, 0.189396f, 0.259807f, 0.255503f, 0.202390f, 0.174583f, 0.199128f, 0.246722f, 0.285440f, 0.305850f, 0.323862f, 0.381849f, 0.499832f, 0.602701f, 0.562505f, 0.358033f, 0.132175f, 0.035515f, 0.063390f, 0.105690f, 0.109852f, 0.119592f, 0.173771f, 0.239521f, 0.254709f, 0.192460f, 0.071071f} + }, + { + {-0.016781f, -0.068243f, -0.130746f, -0.141416f, -0.067559f, 0.038187f, 0.093997f, 0.073178f, 0.011465f, -0.045861f, -0.075899f, -0.068574f, -0.019327f, 0.052634f, 0.094768f, 0.060753f, -0.027027f, -0.077305f, -0.023530f, 0.088252f, 0.138743f, 0.067072f, -0.068421f, -0.168551f, -0.195815f, -0.179551f, -0.154143f, -0.128577f, -0.102726f, -0.079391f, -0.057784f, -0.033774f, -0.009097f, 0.009560f, 0.019329f, 0.021904f, 0.018986f, 0.013454f, 0.011658f, 0.018744f, 0.033844f, 0.053207f, 0.075186f, 0.099543f, 0.125114f, 0.150979f, 0.177911f, 0.206990f, 0.238370f, 0.272065f, 0.308056f, 0.345140f, 0.381215f, 0.414936f, 0.445808f, 0.472862f, 0.494658f, 0.510583f, 0.520909f, 0.525555f, 0.523765f, 0.515041f, 0.499435f, 0.476740f, 0.446232f, 0.407570f, 0.361399f, 0.308775f, 0.250601f, 0.188053f, 0.122990f, 0.057485f, -0.006595f, -0.067182f, -0.121979f, -0.169504f, -0.209530f, -0.241819f, -0.265268f, -0.279334f, -0.285567f, -0.286357f, -0.282397f, -0.272798f, -0.257898f, -0.240486f, -0.223313f, -0.206272f, -0.187317f, -0.165922f, -0.144335f, -0.125136f, -0.108811f, -0.094377f, -0.081395f, -0.070507f, + -0.062659f, -0.058663f, -0.058998f, -0.063313f, -0.070418f, -0.079177f, -0.089168f, -0.100422f, -0.112928f, -0.126214f, -0.138846f, -0.148727f, -0.154652f, -0.157196f, -0.157495f, -0.155734f, -0.151422f, -0.144279f, -0.134159f, -0.120888f, -0.104827f, -0.086912f, -0.067889f, -0.048281f, -0.029015f, -0.011094f, 0.005181f, 0.019751f, 0.031977f, 0.041217f, 0.047615f, 0.051560f, 0.053135f, 0.052694f, 0.050946f, 0.048096f, 0.044101f, 0.039876f, 0.036856f, 0.035478f, 0.035381f, 0.036484f, 0.038318f, 0.039253f, 0.038058f, 0.035282f, 0.031776f, 0.027264f, 0.021518f, 0.015211f, 0.008590f, 0.001128f, -0.006896f, -0.014429f, -0.021357f, -0.028208f, -0.034548f, -0.039784f, -0.044670f, -0.050039f, -0.055371f, -0.060341f, -0.065860f, -0.072126f, -0.078038f, -0.083530f, -0.089755f, -0.096500f, -0.102463f, -0.107840f, -0.113445f, -0.118322f, -0.121541f, -0.124548f, -0.128590f, -0.132518f, -0.135868f, -0.140523f, -0.147120f, -0.154177f, -0.162021f, -0.172330f, -0.183624f, -0.193140f, -0.201940f, -0.211830f, -0.220237f, -0.224852f, -0.228495f, -0.232832f, -0.234204f, -0.231610f, -0.229485f, -0.228034f, -0.222763f, -0.215763f, + -0.212373f, -0.207950f, -0.196785f, -0.187807f, -0.187735f, -0.181688f, -0.161030f, -0.148748f, -0.156874f, -0.151004f, -0.112810f, -0.094549f, -0.130495f, -0.140613f, -0.036068f, 0.110983f, 0.139885f, 0.034927f, -0.060252f, -0.070101f, -0.069384f, -0.102012f, -0.083008f, 0.039303f, 0.160141f, 0.158502f, 0.064730f, -0.005748f, -0.015098f, -0.015700f, -0.048894f, -0.098403f, -0.116107f, -0.060059f, 0.057678f, 0.146655f, 0.115290f, -0.010018f, -0.101454f, -0.085603f, -0.021018f, 0.005687f, -0.004967f, 0.000661f, 0.032397f, 0.052112f, 0.040359f, 0.013723f}, + {-0.016781f, -0.068243f, -0.130746f, -0.141416f, -0.067559f, 0.038187f, 0.093997f, 0.073178f, 0.011465f, -0.045861f, -0.075899f, -0.068574f, -0.019327f, 0.052634f, 0.094768f, 0.060753f, -0.027027f, -0.077305f, -0.023530f, 0.088252f, 0.138743f, 0.067072f, -0.068421f, -0.168551f, -0.195815f, -0.179551f, -0.154143f, -0.128577f, -0.102726f, -0.079391f, -0.057784f, -0.033774f, -0.009097f, 0.009560f, 0.019329f, 0.021904f, 0.018986f, 0.013454f, 0.011658f, 0.018744f, 0.033844f, 0.053207f, 0.075186f, 0.099543f, 0.125114f, 0.150979f, 0.177911f, 0.206990f, 0.238370f, 0.272065f, 0.308056f, 0.345140f, 0.381215f, 0.414936f, 0.445808f, 0.472862f, 0.494658f, 0.510583f, 0.520909f, 0.525555f, 0.523765f, 0.515041f, 0.499435f, 0.476740f, 0.446232f, 0.407570f, 0.361399f, 0.308775f, 0.250601f, 0.188053f, 0.122990f, 0.057485f, -0.006595f, -0.067182f, -0.121979f, -0.169504f, -0.209530f, -0.241819f, -0.265268f, -0.279334f, -0.285567f, -0.286357f, -0.282397f, -0.272798f, -0.257898f, -0.240486f, -0.223313f, -0.206272f, -0.187317f, -0.165922f, -0.144335f, -0.125136f, -0.108811f, -0.094377f, -0.081395f, -0.070507f, + -0.062659f, -0.058663f, -0.058998f, -0.063313f, -0.070418f, -0.079177f, -0.089168f, -0.100422f, -0.112928f, -0.126214f, -0.138846f, -0.148727f, -0.154652f, -0.157196f, -0.157495f, -0.155734f, -0.151422f, -0.144279f, -0.134159f, -0.120888f, -0.104827f, -0.086912f, -0.067889f, -0.048281f, -0.029015f, -0.011094f, 0.005181f, 0.019751f, 0.031977f, 0.041217f, 0.047615f, 0.051560f, 0.053135f, 0.052694f, 0.050946f, 0.048096f, 0.044101f, 0.039876f, 0.036856f, 0.035478f, 0.035381f, 0.036484f, 0.038318f, 0.039253f, 0.038058f, 0.035282f, 0.031776f, 0.027264f, 0.021518f, 0.015211f, 0.008590f, 0.001128f, -0.006896f, -0.014429f, -0.021357f, -0.028208f, -0.034548f, -0.039784f, -0.044670f, -0.050039f, -0.055371f, -0.060341f, -0.065860f, -0.072126f, -0.078038f, -0.083530f, -0.089755f, -0.096500f, -0.102463f, -0.107840f, -0.113445f, -0.118322f, -0.121541f, -0.124548f, -0.128590f, -0.132518f, -0.135868f, -0.140523f, -0.147120f, -0.154177f, -0.162021f, -0.172330f, -0.183624f, -0.193140f, -0.201940f, -0.211830f, -0.220237f, -0.224852f, -0.228495f, -0.232832f, -0.234204f, -0.231610f, -0.229485f, -0.228034f, -0.222763f, -0.215763f, + -0.212373f, -0.207950f, -0.196785f, -0.187807f, -0.187735f, -0.181688f, -0.161030f, -0.148748f, -0.156874f, -0.151004f, -0.112810f, -0.094549f, -0.130495f, -0.140613f, -0.036068f, 0.110983f, 0.139885f, 0.034927f, -0.060252f, -0.070101f, -0.069384f, -0.102012f, -0.083008f, 0.039303f, 0.160141f, 0.158502f, 0.064730f, -0.005748f, -0.015098f, -0.015700f, -0.048894f, -0.098403f, -0.116107f, -0.060059f, 0.057678f, 0.146655f, 0.115290f, -0.010018f, -0.101454f, -0.085603f, -0.021018f, 0.005687f, -0.004967f, 0.000661f, 0.032397f, 0.052112f, 0.040359f, 0.013723f} + }, + { + {0.006419f, -0.000380f, -0.044417f, -0.097071f, -0.106348f, -0.055854f, 0.004864f, 0.009382f, -0.047117f, -0.104090f, -0.111791f, -0.074420f, -0.009073f, 0.081673f, 0.159525f, 0.135409f, -0.015787f, -0.158879f, -0.117328f, 0.102390f, 0.292403f, 0.276855f, 0.089234f, -0.117191f, -0.257832f, -0.352481f, -0.428424f, -0.472227f, -0.470382f, -0.436585f, -0.386629f, -0.319685f, -0.232981f, -0.133703f, -0.030900f, 0.070632f, 0.166068f, 0.249726f, 0.319333f, 0.375582f, 0.418982f, 0.450841f, 0.474355f, 0.491560f, 0.502057f, 0.506326f, 0.506785f, 0.504408f, 0.497667f, 0.485632f, 0.469281f, 0.449749f, 0.428169f, 0.407143f, 0.389707f, 0.376669f, 0.366612f, 0.357997f, 0.349801f, 0.340868f, 0.330294f, 0.318219f, 0.305334f, 0.291955f, 0.278163f, 0.264312f, 0.250670f, 0.236749f, 0.221537f, 0.204458f, 0.185733f, 0.165583f, 0.143517f, 0.119055f, 0.092907f, 0.066472f, 0.040271f, 0.014131f, -0.011039f, -0.033282f, -0.051808f, -0.067531f, -0.080714f, -0.089863f, -0.094019f, -0.094607f, -0.093686f, -0.091642f, -0.087952f, -0.083101f, -0.078109f, -0.072686f, -0.065387f, -0.055476f, -0.043458f, -0.029662f, + -0.013257f, 0.006916f, 0.031000f, 0.057968f, 0.086658f, 0.116744f, 0.148568f, 0.181979f, 0.215566f, 0.247404f, 0.276573f, 0.303534f, 0.328908f, 0.352272f, 0.372331f, 0.388025f, 0.399465f, 0.408063f, 0.415676f, 0.423147f, 0.429593f, 0.433431f, 0.434049f, 0.432310f, 0.429814f, 0.428057f, 0.427836f, 0.428809f, 0.429787f, 0.429913f, 0.429361f, 0.428784f, 0.428608f, 0.429050f, 0.430098f, 0.431131f, 0.431113f, 0.429393f, 0.425893f, 0.420648f, 0.413761f, 0.405616f, 0.396473f, 0.386033f, 0.373928f, 0.360298f, 0.345527f, 0.329947f, 0.314161f, 0.299015f, 0.284997f, 0.272196f, 0.260812f, 0.251021f, 0.242599f, 0.235398f, 0.229778f, 0.225921f, 0.223433f, 0.222164f, 0.222404f, 0.223783f, 0.225163f, 0.226017f, 0.226580f, 0.226598f, 0.225440f, 0.223398f, 0.221323f, 0.219343f, 0.217296f, 0.215536f, 0.213959f, 0.211506f, 0.207783f, 0.203519f, 0.198702f, 0.192425f, 0.184911f, 0.177078f, 0.168256f, 0.157265f, 0.144949f, 0.132581f, 0.119457f, 0.105218f, 0.091890f, 0.080542f, 0.069569f, 0.058845f, 0.050696f, 0.044902f, 0.038873f, 0.033407f, 0.030820f, 0.028752f, + 0.024794f, 0.023084f, 0.025581f, 0.025045f, 0.019741f, 0.021233f, 0.031130f, 0.031471f, 0.020092f, 0.024258f, 0.047646f, 0.046851f, 0.010282f, 0.010120f, 0.099751f, 0.203325f, 0.205161f, 0.119406f, 0.059799f, 0.059279f, 0.047887f, 0.012235f, 0.034847f, 0.136400f, 0.209510f, 0.173631f, 0.089751f, 0.051420f, 0.052166f, 0.034003f, -0.009700f, -0.054980f, -0.105932f, -0.156941f, -0.150251f, -0.050937f, 0.072024f, 0.116139f, 0.076669f, 0.039024f, 0.051258f, 0.072987f, 0.059581f, 0.035660f, 0.051333f, 0.098827f, 0.112731f, 0.050734f}, + {0.006419f, -0.000380f, -0.044417f, -0.097071f, -0.106348f, -0.055854f, 0.004864f, 0.009382f, -0.047117f, -0.104090f, -0.111791f, -0.074420f, -0.009073f, 0.081673f, 0.159525f, 0.135409f, -0.015787f, -0.158879f, -0.117328f, 0.102390f, 0.292403f, 0.276855f, 0.089234f, -0.117191f, -0.257832f, -0.352481f, -0.428424f, -0.472227f, -0.470382f, -0.436585f, -0.386629f, -0.319685f, -0.232981f, -0.133703f, -0.030900f, 0.070632f, 0.166068f, 0.249726f, 0.319333f, 0.375582f, 0.418982f, 0.450841f, 0.474355f, 0.491560f, 0.502057f, 0.506326f, 0.506785f, 0.504408f, 0.497667f, 0.485632f, 0.469281f, 0.449749f, 0.428169f, 0.407143f, 0.389707f, 0.376669f, 0.366612f, 0.357997f, 0.349801f, 0.340868f, 0.330294f, 0.318219f, 0.305334f, 0.291955f, 0.278163f, 0.264312f, 0.250670f, 0.236749f, 0.221537f, 0.204458f, 0.185733f, 0.165583f, 0.143517f, 0.119055f, 0.092907f, 0.066472f, 0.040271f, 0.014131f, -0.011039f, -0.033282f, -0.051808f, -0.067531f, -0.080714f, -0.089863f, -0.094019f, -0.094607f, -0.093686f, -0.091642f, -0.087952f, -0.083101f, -0.078109f, -0.072686f, -0.065387f, -0.055476f, -0.043458f, -0.029662f, + -0.013257f, 0.006916f, 0.031000f, 0.057968f, 0.086658f, 0.116744f, 0.148568f, 0.181979f, 0.215566f, 0.247404f, 0.276573f, 0.303534f, 0.328908f, 0.352272f, 0.372331f, 0.388025f, 0.399465f, 0.408063f, 0.415676f, 0.423147f, 0.429593f, 0.433431f, 0.434049f, 0.432310f, 0.429814f, 0.428057f, 0.427836f, 0.428809f, 0.429787f, 0.429913f, 0.429361f, 0.428784f, 0.428608f, 0.429050f, 0.430098f, 0.431131f, 0.431113f, 0.429393f, 0.425893f, 0.420648f, 0.413761f, 0.405616f, 0.396473f, 0.386033f, 0.373928f, 0.360298f, 0.345527f, 0.329947f, 0.314161f, 0.299015f, 0.284997f, 0.272196f, 0.260812f, 0.251021f, 0.242599f, 0.235398f, 0.229778f, 0.225921f, 0.223433f, 0.222164f, 0.222404f, 0.223783f, 0.225163f, 0.226017f, 0.226580f, 0.226598f, 0.225440f, 0.223398f, 0.221323f, 0.219343f, 0.217296f, 0.215536f, 0.213959f, 0.211506f, 0.207783f, 0.203519f, 0.198702f, 0.192425f, 0.184911f, 0.177078f, 0.168256f, 0.157265f, 0.144949f, 0.132581f, 0.119457f, 0.105218f, 0.091890f, 0.080542f, 0.069569f, 0.058845f, 0.050696f, 0.044902f, 0.038873f, 0.033407f, 0.030820f, 0.028752f, + 0.024794f, 0.023084f, 0.025581f, 0.025045f, 0.019741f, 0.021233f, 0.031130f, 0.031471f, 0.020092f, 0.024258f, 0.047646f, 0.046851f, 0.010282f, 0.010120f, 0.099751f, 0.203325f, 0.205161f, 0.119406f, 0.059799f, 0.059279f, 0.047887f, 0.012235f, 0.034847f, 0.136400f, 0.209510f, 0.173631f, 0.089751f, 0.051420f, 0.052166f, 0.034003f, -0.009700f, -0.054980f, -0.105932f, -0.156941f, -0.150251f, -0.050937f, 0.072024f, 0.116139f, 0.076669f, 0.039024f, 0.051258f, 0.072987f, 0.059581f, 0.035660f, 0.051333f, 0.098827f, 0.112731f, 0.050734f} + }, + { + {-0.004145f, -0.003666f, 0.011472f, 0.025737f, 0.020888f, 0.002681f, -0.005708f, -0.001729f, -0.016346f, -0.075712f, -0.160203f, -0.207765f, -0.152869f, 0.017357f, 0.211441f, 0.262841f, 0.087261f, -0.176895f, -0.266228f, -0.075175f, 0.219293f, 0.361347f, 0.282230f, 0.104299f, -0.053635f, -0.176306f, -0.281631f, -0.353803f, -0.373719f, -0.355618f, -0.322626f, -0.277765f, -0.217383f, -0.148569f, -0.078599f, -0.004588f, 0.075448f, 0.153048f, 0.217527f, 0.265298f, 0.297854f, 0.317827f, 0.329255f, 0.336467f, 0.341363f, 0.344354f, 0.346614f, 0.348711f, 0.348971f, 0.345749f, 0.339625f, 0.331802f, 0.322488f, 0.312203f, 0.302613f, 0.294865f, 0.288630f, 0.283324f, 0.278784f, 0.274543f, 0.269837f, 0.264413f, 0.258247f, 0.250753f, 0.241341f, 0.230387f, 0.218578f, 0.205635f, 0.190698f, 0.173676f, 0.155193f, 0.135271f, 0.113074f, 0.088233f, 0.061586f, 0.034088f, 0.005671f, -0.023848f, -0.053155f, -0.080091f, -0.104054f, -0.126354f, -0.147577f, -0.166135f, -0.180635f, -0.192361f, -0.203590f, -0.214103f, -0.221263f, -0.223474f, -0.221824f, -0.217974f, -0.211925f, -0.202660f, -0.190084f, -0.175511f, + -0.160523f, -0.145801f, -0.131012f, -0.115698f, -0.100234f, -0.085751f, -0.073156f, -0.062624f, -0.054028f, -0.047150f, -0.041205f, -0.034932f, -0.027678f, -0.019998f, -0.012848f, -0.006575f, -0.000758f, 0.005551f, 0.013454f, 0.023353f, 0.034257f, 0.044468f, 0.053061f, 0.060377f, 0.067374f, 0.075053f, 0.084164f, 0.094773f, 0.106230f, 0.117963f, 0.129996f, 0.142510f, 0.155380f, 0.168334f, 0.180912f, 0.192154f, 0.200956f, 0.206850f, 0.209945f, 0.210369f, 0.208393f, 0.204697f, 0.199808f, 0.193700f, 0.186516f, 0.179137f, 0.172540f, 0.167322f, 0.164156f, 0.163805f, 0.166348f, 0.171193f, 0.177950f, 0.186502f, 0.196457f, 0.207441f, 0.219566f, 0.232839f, 0.246720f, 0.260848f, 0.275255f, 0.289353f, 0.301890f, 0.312265f, 0.320652f, 0.326802f, 0.330234f, 0.331393f, 0.331081f, 0.329265f, 0.325882f, 0.321843f, 0.317809f, 0.313301f, 0.308200f, 0.303376f, 0.298948f, 0.294010f, 0.288493f, 0.282922f, 0.276566f, 0.268585f, 0.260096f, 0.252244f, 0.244001f, 0.234745f, 0.226212f, 0.219060f, 0.211305f, 0.202525f, 0.194820f, 0.188050f, 0.180130f, 0.172258f, 0.166654f, 0.160911f, + 0.153056f, 0.147449f, 0.145612f, 0.140126f, 0.129723f, 0.125834f, 0.129084f, 0.121600f, 0.102649f, 0.099485f, 0.113861f, 0.102603f, 0.058029f, 0.054997f, 0.145041f, 0.249571f, 0.251898f, 0.163725f, 0.095922f, 0.086161f, 0.074951f, 0.048383f, 0.072896f, 0.160524f, 0.219423f, 0.186863f, 0.115135f, 0.076735f, 0.067205f, 0.048319f, 0.014202f, -0.026677f, -0.067100f, -0.065851f, 0.027911f, 0.176276f, 0.254369f, 0.199913f, 0.095255f, 0.049417f, 0.061851f, 0.063067f, 0.033342f, 0.006788f, -0.006173f, -0.024075f, -0.038289f, -0.020048f}, + {0.004145f, 0.003666f, -0.011472f, -0.025737f, -0.020888f, -0.002681f, 0.005708f, 0.001729f, 0.016346f, 0.075712f, 0.160203f, 0.207765f, 0.152869f, -0.017357f, -0.211441f, -0.262841f, -0.087261f, 0.176895f, 0.266228f, 0.075175f, -0.219293f, -0.361347f, -0.282230f, -0.104299f, 0.053635f, 0.176306f, 0.281631f, 0.353803f, 0.373719f, 0.355618f, 0.322626f, 0.277765f, 0.217383f, 0.148569f, 0.078599f, 0.004588f, -0.075448f, -0.153048f, -0.217527f, -0.265298f, -0.297854f, -0.317827f, -0.329255f, -0.336467f, -0.341363f, -0.344354f, -0.346614f, -0.348711f, -0.348971f, -0.345749f, -0.339625f, -0.331802f, -0.322488f, -0.312203f, -0.302613f, -0.294865f, -0.288630f, -0.283324f, -0.278784f, -0.274543f, -0.269837f, -0.264413f, -0.258247f, -0.250753f, -0.241341f, -0.230387f, -0.218578f, -0.205635f, -0.190698f, -0.173676f, -0.155193f, -0.135271f, -0.113074f, -0.088233f, -0.061586f, -0.034088f, -0.005671f, 0.023848f, 0.053155f, 0.080091f, 0.104054f, 0.126354f, 0.147577f, 0.166135f, 0.180635f, 0.192361f, 0.203590f, 0.214103f, 0.221263f, 0.223474f, 0.221824f, 0.217974f, 0.211925f, 0.202660f, 0.190084f, 0.175511f, + 0.160523f, 0.145801f, 0.131012f, 0.115698f, 0.100234f, 0.085751f, 0.073156f, 0.062624f, 0.054028f, 0.047150f, 0.041205f, 0.034932f, 0.027678f, 0.019998f, 0.012848f, 0.006575f, 0.000758f, -0.005551f, -0.013454f, -0.023353f, -0.034257f, -0.044468f, -0.053061f, -0.060377f, -0.067374f, -0.075053f, -0.084164f, -0.094773f, -0.106230f, -0.117963f, -0.129996f, -0.142510f, -0.155380f, -0.168334f, -0.180912f, -0.192154f, -0.200956f, -0.206850f, -0.209945f, -0.210369f, -0.208393f, -0.204697f, -0.199808f, -0.193700f, -0.186516f, -0.179137f, -0.172540f, -0.167322f, -0.164156f, -0.163805f, -0.166348f, -0.171193f, -0.177950f, -0.186502f, -0.196457f, -0.207441f, -0.219566f, -0.232839f, -0.246720f, -0.260848f, -0.275255f, -0.289353f, -0.301890f, -0.312265f, -0.320652f, -0.326802f, -0.330234f, -0.331393f, -0.331081f, -0.329265f, -0.325882f, -0.321843f, -0.317809f, -0.313301f, -0.308200f, -0.303376f, -0.298948f, -0.294010f, -0.288493f, -0.282922f, -0.276566f, -0.268585f, -0.260096f, -0.252244f, -0.244001f, -0.234745f, -0.226212f, -0.219060f, -0.211305f, -0.202525f, -0.194820f, -0.188050f, -0.180130f, -0.172258f, -0.166654f, -0.160911f, + -0.153056f, -0.147449f, -0.145612f, -0.140126f, -0.129723f, -0.125834f, -0.129084f, -0.121600f, -0.102649f, -0.099485f, -0.113861f, -0.102603f, -0.058029f, -0.054997f, -0.145041f, -0.249571f, -0.251898f, -0.163725f, -0.095922f, -0.086161f, -0.074951f, -0.048383f, -0.072896f, -0.160524f, -0.219423f, -0.186863f, -0.115135f, -0.076735f, -0.067205f, -0.048319f, -0.014202f, 0.026677f, 0.067100f, 0.065851f, -0.027911f, -0.176276f, -0.254369f, -0.199913f, -0.095255f, -0.049417f, -0.061851f, -0.063067f, -0.033342f, -0.006788f, 0.006173f, 0.024075f, 0.038289f, 0.020048f} + }, + { + {-0.021669f, -0.023685f, 0.023828f, 0.034018f, -0.023524f, -0.049286f, 0.040503f, 0.161875f, 0.150811f, -0.019734f, -0.197676f, -0.229030f, -0.106401f, 0.062770f, 0.162365f, 0.129952f, -0.007762f, -0.128175f, -0.106139f, 0.044971f, 0.173666f, 0.163889f, 0.058328f, -0.023611f, -0.033294f, -0.007600f, 0.017864f, 0.044155f, 0.072516f, 0.086941f, 0.077826f, 0.052501f, 0.019845f, -0.016546f, -0.051887f, -0.081943f, -0.109000f, -0.136036f, -0.158638f, -0.169848f, -0.168532f, -0.157762f, -0.140048f, -0.118475f, -0.097856f, -0.081023f, -0.066814f, -0.053083f, -0.038732f, -0.022657f, -0.003922f, 0.016835f, 0.038572f, 0.061908f, 0.087943f, 0.115804f, 0.143100f, 0.168000f, 0.189456f, 0.206191f, 0.216814f, 0.220647f, 0.217699f, 0.207967f, 0.191048f, 0.166404f, 0.133914f, 0.094053f, 0.047458f, -0.005253f, -0.062902f, -0.123378f, -0.184188f, -0.242930f, -0.297204f, -0.344947f, -0.385106f, -0.417196f, -0.440297f, -0.453766f, -0.458836f, -0.457795f, -0.451309f, -0.438205f, -0.418365f, -0.394081f, -0.367688f, -0.339298f, -0.307922f, -0.273643f, -0.237339f, -0.199024f, -0.157916f, -0.114031f, -0.068508f, -0.022295f, + 0.024378f, 0.070864f, 0.115420f, 0.156302f, 0.192913f, 0.225272f, 0.252645f, 0.273162f, 0.284913f, 0.287670f, 0.283774f, 0.276781f, 0.268540f, 0.257900f, 0.242812f, 0.223195f, 0.201277f, 0.179871f, 0.160911f, 0.144831f, 0.130605f, 0.116910f, 0.103678f, 0.091983f, 0.082527f, 0.075057f, 0.068993f, 0.063538f, 0.057488f, 0.050008f, 0.041284f, 0.031626f, 0.020682f, 0.008290f, -0.004841f, -0.017983f, -0.030869f, -0.042934f, -0.053314f, -0.061863f, -0.068957f, -0.074456f, -0.078162f, -0.080807f, -0.083164f, -0.084941f, -0.085810f, -0.086426f, -0.087233f, -0.087667f, -0.087431f, -0.086993f, -0.086222f, -0.084410f, -0.081830f, -0.079316f, -0.076543f, -0.072767f, -0.068486f, -0.064301f, -0.059443f, -0.053446f, -0.047480f, -0.042320f, -0.037216f, -0.032146f, -0.028420f, -0.026114f, -0.023941f, -0.021979f, -0.021258f, -0.021151f, -0.020625f, -0.020834f, -0.023040f, -0.026119f, -0.029262f, -0.034092f, -0.041349f, -0.049446f, -0.058245f, -0.069370f, -0.081739f, -0.092511f, -0.102306f, -0.113154f, -0.123020f, -0.129316f, -0.134387f, -0.140442f, -0.144425f, -0.144702f, -0.145130f, -0.146612f, -0.144890f, -0.140872f, + -0.139791f, -0.138608f, -0.131360f, -0.124680f, -0.126031f, -0.124079f, -0.109182f, -0.099237f, -0.107590f, -0.107222f, -0.078014f, -0.060004f, -0.087081f, -0.098386f, -0.015611f, 0.107616f, 0.131899f, 0.033279f, -0.065099f, -0.084123f, -0.081752f, -0.110294f, -0.109745f, -0.022550f, 0.083650f, 0.098982f, 0.017454f, -0.075044f, -0.120096f, -0.135564f, -0.165934f, -0.217688f, -0.234747f, -0.144650f, 0.038500f, 0.179477f, 0.153231f, 0.002298f, -0.107319f, -0.088405f, -0.015190f, 0.008703f, -0.016573f, -0.026527f, -0.001403f, 0.023135f, 0.022859f, 0.008202f}, + {0.021669f, 0.023685f, -0.023828f, -0.034018f, 0.023524f, 0.049286f, -0.040503f, -0.161875f, -0.150811f, 0.019734f, 0.197676f, 0.229030f, 0.106401f, -0.062770f, -0.162365f, -0.129952f, 0.007762f, 0.128175f, 0.106139f, -0.044971f, -0.173666f, -0.163889f, -0.058328f, 0.023611f, 0.033294f, 0.007600f, -0.017864f, -0.044155f, -0.072516f, -0.086941f, -0.077826f, -0.052501f, -0.019845f, 0.016546f, 0.051887f, 0.081943f, 0.109000f, 0.136036f, 0.158638f, 0.169848f, 0.168532f, 0.157762f, 0.140048f, 0.118475f, 0.097856f, 0.081023f, 0.066814f, 0.053083f, 0.038732f, 0.022657f, 0.003922f, -0.016835f, -0.038572f, -0.061908f, -0.087943f, -0.115804f, -0.143100f, -0.168000f, -0.189456f, -0.206191f, -0.216814f, -0.220647f, -0.217699f, -0.207967f, -0.191048f, -0.166404f, -0.133914f, -0.094053f, -0.047458f, 0.005253f, 0.062902f, 0.123378f, 0.184188f, 0.242930f, 0.297204f, 0.344947f, 0.385106f, 0.417196f, 0.440297f, 0.453766f, 0.458836f, 0.457795f, 0.451309f, 0.438205f, 0.418365f, 0.394081f, 0.367688f, 0.339298f, 0.307922f, 0.273643f, 0.237339f, 0.199024f, 0.157916f, 0.114031f, 0.068508f, 0.022295f, + -0.024378f, -0.070864f, -0.115420f, -0.156302f, -0.192913f, -0.225272f, -0.252645f, -0.273162f, -0.284913f, -0.287670f, -0.283774f, -0.276781f, -0.268540f, -0.257900f, -0.242812f, -0.223195f, -0.201277f, -0.179871f, -0.160911f, -0.144831f, -0.130605f, -0.116910f, -0.103678f, -0.091983f, -0.082527f, -0.075057f, -0.068993f, -0.063538f, -0.057488f, -0.050008f, -0.041284f, -0.031626f, -0.020682f, -0.008290f, 0.004841f, 0.017983f, 0.030869f, 0.042934f, 0.053314f, 0.061863f, 0.068957f, 0.074456f, 0.078162f, 0.080807f, 0.083164f, 0.084941f, 0.085810f, 0.086426f, 0.087233f, 0.087667f, 0.087431f, 0.086993f, 0.086222f, 0.084410f, 0.081830f, 0.079316f, 0.076543f, 0.072767f, 0.068486f, 0.064301f, 0.059443f, 0.053446f, 0.047480f, 0.042320f, 0.037216f, 0.032146f, 0.028420f, 0.026114f, 0.023941f, 0.021979f, 0.021258f, 0.021151f, 0.020625f, 0.020834f, 0.023040f, 0.026119f, 0.029262f, 0.034092f, 0.041349f, 0.049446f, 0.058245f, 0.069370f, 0.081739f, 0.092511f, 0.102306f, 0.113154f, 0.123020f, 0.129316f, 0.134387f, 0.140442f, 0.144425f, 0.144702f, 0.145130f, 0.146612f, 0.144890f, 0.140872f, + 0.139791f, 0.138608f, 0.131360f, 0.124680f, 0.126031f, 0.124079f, 0.109182f, 0.099237f, 0.107590f, 0.107222f, 0.078014f, 0.060004f, 0.087081f, 0.098386f, 0.015611f, -0.107616f, -0.131899f, -0.033279f, 0.065099f, 0.084123f, 0.081752f, 0.110294f, 0.109745f, 0.022550f, -0.083650f, -0.098982f, -0.017454f, 0.075044f, 0.120096f, 0.135564f, 0.165934f, 0.217688f, 0.234747f, 0.144650f, -0.038500f, -0.179477f, -0.153231f, -0.002298f, 0.107319f, 0.088405f, 0.015190f, -0.008703f, 0.016573f, 0.026527f, 0.001403f, -0.023135f, -0.022859f, -0.008202f} + }, + { + {0.003490f, -0.006226f, -0.035846f, -0.051515f, -0.041640f, -0.036076f, -0.045949f, -0.026763f, 0.066247f, 0.214586f, 0.349145f, 0.387379f, 0.248996f, -0.075217f, -0.411222f, -0.465190f, -0.135467f, 0.290951f, 0.408104f, 0.149776f, -0.165632f, -0.250425f, -0.140194f, -0.027408f, 0.020877f, 0.060945f, 0.105649f, 0.105114f, 0.053903f, 0.006713f, -0.005167f, -0.000920f, 0.000082f, 0.001162f, 0.003555f, -0.001284f, -0.014085f, -0.027073f, -0.038241f, -0.050923f, -0.065125f, -0.079722f, -0.096066f, -0.112906f, -0.125552f, -0.133576f, -0.141406f, -0.150172f, -0.156901f, -0.161372f, -0.166117f, -0.170690f, -0.172431f, -0.171130f, -0.167726f, -0.160965f, -0.149498f, -0.134444f, -0.116933f, -0.096204f, -0.071970f, -0.045391f, -0.016742f, 0.014649f, 0.047943f, 0.081229f, 0.113842f, 0.145533f, 0.174464f, 0.198570f, 0.217592f, 0.231713f, 0.239760f, 0.240421f, 0.233709f, 0.220058f, 0.199450f, 0.172046f, 0.138437f, 0.099252f, 0.055563f, 0.009024f, -0.039375f, -0.089650f, -0.141184f, -0.192202f, -0.241534f, -0.289259f, -0.335192f, -0.378497f, -0.418885f, -0.456107f, -0.488166f, -0.512093f, -0.526677f, -0.532781f, + -0.531064f, -0.520888f, -0.501308f, -0.472277f, -0.435515f, -0.394864f, -0.354737f, -0.317425f, -0.282773f, -0.250772f, -0.223195f, -0.202435f, -0.189950f, -0.186050f, -0.189968f, -0.199904f, -0.213864f, -0.230597f, -0.249442f, -0.269776f, -0.291088f, -0.312839f, -0.333762f, -0.352022f, -0.366526f, -0.377502f, -0.385752f, -0.392049f, -0.397160f, -0.401566f, -0.405131f, -0.407696f, -0.409744f, -0.411829f, -0.413700f, -0.414630f, -0.414284f, -0.412722f, -0.409992f, -0.406200f, -0.401590f, -0.396097f, -0.389065f, -0.379621f, -0.367177f, -0.351595f, -0.333246f, -0.312889f, -0.291241f, -0.268764f, -0.245990f, -0.223712f, -0.202570f, -0.182754f, -0.164339f, -0.147556f, -0.132499f, -0.118902f, -0.106443f, -0.095030f, -0.084602f, -0.074944f, -0.065829f, -0.057130f, -0.048678f, -0.040225f, -0.031636f, -0.022960f, -0.014347f, -0.006068f, 0.001494f, 0.008244f, 0.014668f, 0.021396f, 0.028573f, 0.036064f, 0.044011f, 0.052627f, 0.061660f, 0.070662f, 0.079560f, 0.088346f, 0.096620f, 0.104093f, 0.110970f, 0.117205f, 0.122169f, 0.125646f, 0.128091f, 0.129387f, 0.128805f, 0.126607f, 0.123922f, 0.120854f, 0.116797f, 0.112354f, + 0.108374f, 0.103999f, 0.098631f, 0.093863f, 0.089953f, 0.083871f, 0.075164f, 0.068279f, 0.063593f, 0.054484f, 0.040704f, 0.032538f, 0.030791f, 0.018823f, -0.008680f, -0.027757f, -0.019659f, -0.003550f, -0.004449f, -0.010080f, -0.000027f, 0.002567f, -0.038050f, -0.098261f, -0.113993f, -0.072907f, -0.029749f, -0.023328f, -0.035246f, -0.040054f, -0.038086f, -0.027498f, -0.004695f, -0.004589f, -0.071780f, -0.172134f, -0.206569f, -0.142510f, -0.058281f, -0.022574f, -0.010410f, 0.016164f, 0.034763f, 0.038405f, 0.092021f, 0.212278f, 0.267090f, 0.126265f}, + {0.003490f, -0.006226f, -0.035846f, -0.051515f, -0.041640f, -0.036076f, -0.045949f, -0.026763f, 0.066247f, 0.214586f, 0.349145f, 0.387379f, 0.248996f, -0.075217f, -0.411222f, -0.465190f, -0.135467f, 0.290951f, 0.408104f, 0.149776f, -0.165632f, -0.250425f, -0.140194f, -0.027408f, 0.020877f, 0.060945f, 0.105649f, 0.105114f, 0.053903f, 0.006713f, -0.005167f, -0.000920f, 0.000082f, 0.001162f, 0.003555f, -0.001284f, -0.014085f, -0.027073f, -0.038241f, -0.050923f, -0.065125f, -0.079722f, -0.096066f, -0.112906f, -0.125552f, -0.133576f, -0.141406f, -0.150172f, -0.156901f, -0.161372f, -0.166117f, -0.170690f, -0.172431f, -0.171130f, -0.167726f, -0.160965f, -0.149498f, -0.134444f, -0.116933f, -0.096204f, -0.071970f, -0.045391f, -0.016742f, 0.014649f, 0.047943f, 0.081229f, 0.113842f, 0.145533f, 0.174464f, 0.198570f, 0.217592f, 0.231713f, 0.239760f, 0.240421f, 0.233709f, 0.220058f, 0.199450f, 0.172046f, 0.138437f, 0.099252f, 0.055563f, 0.009024f, -0.039375f, -0.089650f, -0.141184f, -0.192202f, -0.241534f, -0.289259f, -0.335192f, -0.378497f, -0.418885f, -0.456107f, -0.488166f, -0.512093f, -0.526677f, -0.532781f, + -0.531064f, -0.520888f, -0.501308f, -0.472277f, -0.435515f, -0.394864f, -0.354737f, -0.317425f, -0.282773f, -0.250772f, -0.223195f, -0.202435f, -0.189950f, -0.186050f, -0.189968f, -0.199904f, -0.213864f, -0.230597f, -0.249442f, -0.269776f, -0.291088f, -0.312839f, -0.333762f, -0.352022f, -0.366526f, -0.377502f, -0.385752f, -0.392049f, -0.397160f, -0.401566f, -0.405131f, -0.407696f, -0.409744f, -0.411829f, -0.413700f, -0.414630f, -0.414284f, -0.412722f, -0.409992f, -0.406200f, -0.401590f, -0.396097f, -0.389065f, -0.379621f, -0.367177f, -0.351595f, -0.333246f, -0.312889f, -0.291241f, -0.268764f, -0.245990f, -0.223712f, -0.202570f, -0.182754f, -0.164339f, -0.147556f, -0.132499f, -0.118902f, -0.106443f, -0.095030f, -0.084602f, -0.074944f, -0.065829f, -0.057130f, -0.048678f, -0.040225f, -0.031636f, -0.022960f, -0.014347f, -0.006068f, 0.001494f, 0.008244f, 0.014668f, 0.021396f, 0.028573f, 0.036064f, 0.044011f, 0.052627f, 0.061660f, 0.070662f, 0.079560f, 0.088346f, 0.096620f, 0.104093f, 0.110970f, 0.117205f, 0.122169f, 0.125646f, 0.128091f, 0.129387f, 0.128805f, 0.126607f, 0.123922f, 0.120854f, 0.116797f, 0.112354f, + 0.108374f, 0.103999f, 0.098631f, 0.093863f, 0.089953f, 0.083871f, 0.075164f, 0.068279f, 0.063593f, 0.054484f, 0.040704f, 0.032538f, 0.030791f, 0.018823f, -0.008680f, -0.027757f, -0.019659f, -0.003550f, -0.004449f, -0.010080f, -0.000027f, 0.002567f, -0.038050f, -0.098261f, -0.113993f, -0.072907f, -0.029749f, -0.023328f, -0.035246f, -0.040054f, -0.038086f, -0.027498f, -0.004695f, -0.004589f, -0.071780f, -0.172134f, -0.206569f, -0.142510f, -0.058281f, -0.022574f, -0.010410f, 0.016164f, 0.034763f, 0.038405f, 0.092021f, 0.212278f, 0.267090f, 0.126265f} + }, + { + {-0.035472f, -0.081798f, -0.071269f, -0.002255f, 0.102860f, 0.192934f, 0.195307f, 0.077888f, -0.089815f, -0.183178f, -0.148660f, -0.050318f, 0.021927f, 0.047034f, 0.051279f, 0.039696f, 0.000788f, -0.043082f, -0.046115f, -0.002300f, 0.043120f, 0.054272f, 0.044462f, 0.043697f, 0.054210f, 0.056230f, 0.039591f, 0.010104f, -0.026057f, -0.066929f, -0.106323f, -0.133976f, -0.146070f, -0.148720f, -0.149808f, -0.151671f, -0.151914f, -0.146987f, -0.133736f, -0.110668f, -0.079889f, -0.046679f, -0.015936f, 0.010534f, 0.033170f, 0.052610f, 0.069360f, 0.084349f, 0.098446f, 0.111692f, 0.123760f, 0.134762f, 0.144930f, 0.153971f, 0.161484f, 0.167609f, 0.172556f, 0.175798f, 0.176488f, 0.174543f, 0.170771f, 0.166009f, 0.160711f, 0.155506f, 0.151631f, 0.150263f, 0.151447f, 0.154253f, 0.158209f, 0.163925f, 0.171822f, 0.181027f, 0.190414f, 0.200062f, 0.210583f, 0.221416f, 0.230907f, 0.237799f, 0.241620f, 0.241826f, 0.237494f, 0.227842f, 0.212650f, 0.192367f, 0.167818f, 0.139250f, 0.105981f, 0.068046f, 0.027691f, -0.012582f, -0.053404f, -0.097965f, -0.147589f, -0.199683f, -0.250713f, -0.299600f, + -0.347211f, -0.393568f, -0.436641f, -0.473794f, -0.504000f, -0.528334f, -0.547986f, -0.562129f, -0.568657f, -0.567015f, -0.559255f, -0.548048f, -0.534395f, -0.517300f, -0.494938f, -0.466303f, -0.432494f, -0.396273f, -0.359899f, -0.323754f, -0.287306f, -0.250581f, -0.214271f, -0.179261f, -0.146467f, -0.116331f, -0.088268f, -0.061282f, -0.035046f, -0.009658f, 0.015292f, 0.040570f, 0.066577f, 0.093272f, 0.120122f, 0.145742f, 0.168648f, 0.188835f, 0.207643f, 0.226003f, 0.243897f, 0.261131f, 0.277062f, 0.290013f, 0.298689f, 0.303838f, 0.307126f, 0.309188f, 0.310081f, 0.310329f, 0.309928f, 0.307653f, 0.302863f, 0.296760f, 0.290865f, 0.285707f, 0.281670f, 0.279350f, 0.278412f, 0.277635f, 0.276342f, 0.274531f, 0.272081f, 0.269199f, 0.266771f, 0.265042f, 0.263139f, 0.260717f, 0.258256f, 0.255195f, 0.250108f, 0.243164f, 0.235906f, 0.228645f, 0.220748f, 0.212913f, 0.206270f, 0.200266f, 0.194120f, 0.188745f, 0.184754f, 0.181033f, 0.177428f, 0.175609f, 0.175577f, 0.175232f, 0.174471f, 0.175053f, 0.176162f, 0.175457f, 0.173795f, 0.173114f, 0.171744f, 0.167956f, 0.164332f, 0.162227f, + 0.157916f, 0.150729f, 0.146110f, 0.143936f, 0.136426f, 0.124657f, 0.119818f, 0.119996f, 0.109141f, 0.089750f, 0.085717f, 0.095940f, 0.083230f, 0.037463f, 0.009372f, 0.039437f, 0.088203f, 0.089602f, 0.047152f, 0.017437f, 0.014054f, -0.004805f, -0.050861f, -0.073779f, -0.038800f, 0.013222f, 0.018847f, -0.024526f, -0.065147f, -0.073405f, -0.074806f, -0.099582f, -0.126782f, -0.104109f, -0.020258f, 0.067040f, 0.090571f, 0.049397f, 0.005260f, 0.006347f, 0.036806f, 0.050161f, 0.034434f, 0.024218f, 0.050191f, 0.093391f, 0.100755f, 0.044175f}, + {-0.035472f, -0.081798f, -0.071269f, -0.002255f, 0.102860f, 0.192934f, 0.195307f, 0.077888f, -0.089815f, -0.183178f, -0.148660f, -0.050318f, 0.021927f, 0.047034f, 0.051279f, 0.039696f, 0.000788f, -0.043082f, -0.046115f, -0.002300f, 0.043120f, 0.054272f, 0.044462f, 0.043697f, 0.054210f, 0.056230f, 0.039591f, 0.010104f, -0.026057f, -0.066929f, -0.106323f, -0.133976f, -0.146070f, -0.148720f, -0.149808f, -0.151671f, -0.151914f, -0.146987f, -0.133736f, -0.110668f, -0.079889f, -0.046679f, -0.015936f, 0.010534f, 0.033170f, 0.052610f, 0.069360f, 0.084349f, 0.098446f, 0.111692f, 0.123760f, 0.134762f, 0.144930f, 0.153971f, 0.161484f, 0.167609f, 0.172556f, 0.175798f, 0.176488f, 0.174543f, 0.170771f, 0.166009f, 0.160711f, 0.155506f, 0.151631f, 0.150263f, 0.151447f, 0.154253f, 0.158209f, 0.163925f, 0.171822f, 0.181027f, 0.190414f, 0.200062f, 0.210583f, 0.221416f, 0.230907f, 0.237799f, 0.241620f, 0.241826f, 0.237494f, 0.227842f, 0.212650f, 0.192367f, 0.167818f, 0.139250f, 0.105981f, 0.068046f, 0.027691f, -0.012582f, -0.053404f, -0.097965f, -0.147589f, -0.199683f, -0.250713f, -0.299600f, + -0.347211f, -0.393568f, -0.436641f, -0.473794f, -0.504000f, -0.528334f, -0.547986f, -0.562129f, -0.568657f, -0.567015f, -0.559255f, -0.548048f, -0.534395f, -0.517300f, -0.494938f, -0.466303f, -0.432494f, -0.396273f, -0.359899f, -0.323754f, -0.287306f, -0.250581f, -0.214271f, -0.179261f, -0.146467f, -0.116331f, -0.088268f, -0.061282f, -0.035046f, -0.009658f, 0.015292f, 0.040570f, 0.066577f, 0.093272f, 0.120122f, 0.145742f, 0.168648f, 0.188835f, 0.207643f, 0.226003f, 0.243897f, 0.261131f, 0.277062f, 0.290013f, 0.298689f, 0.303838f, 0.307126f, 0.309188f, 0.310081f, 0.310329f, 0.309928f, 0.307653f, 0.302863f, 0.296760f, 0.290865f, 0.285707f, 0.281670f, 0.279350f, 0.278412f, 0.277635f, 0.276342f, 0.274531f, 0.272081f, 0.269199f, 0.266771f, 0.265042f, 0.263139f, 0.260717f, 0.258256f, 0.255195f, 0.250108f, 0.243164f, 0.235906f, 0.228645f, 0.220748f, 0.212913f, 0.206270f, 0.200266f, 0.194120f, 0.188745f, 0.184754f, 0.181033f, 0.177428f, 0.175609f, 0.175577f, 0.175232f, 0.174471f, 0.175053f, 0.176162f, 0.175457f, 0.173795f, 0.173114f, 0.171744f, 0.167956f, 0.164332f, 0.162227f, + 0.157916f, 0.150729f, 0.146110f, 0.143936f, 0.136426f, 0.124657f, 0.119818f, 0.119996f, 0.109141f, 0.089750f, 0.085717f, 0.095940f, 0.083230f, 0.037463f, 0.009372f, 0.039437f, 0.088203f, 0.089602f, 0.047152f, 0.017437f, 0.014054f, -0.004805f, -0.050861f, -0.073779f, -0.038800f, 0.013222f, 0.018847f, -0.024526f, -0.065147f, -0.073405f, -0.074806f, -0.099582f, -0.126782f, -0.104109f, -0.020258f, 0.067040f, 0.090571f, 0.049397f, 0.005260f, 0.006347f, 0.036806f, 0.050161f, 0.034434f, 0.024218f, 0.050191f, 0.093391f, 0.100755f, 0.044175f} + }, + { + {0.042678f, 0.061622f, -0.028196f, -0.143885f, -0.224072f, -0.284508f, -0.302731f, -0.182658f, 0.099504f, 0.420275f, 0.638704f, 0.687316f, 0.489750f, -0.015410f, -0.622302f, -0.830198f, -0.349626f, 0.436547f, 0.802596f, 0.482187f, -0.101825f, -0.430320f, -0.436453f, -0.363990f, -0.342331f, -0.313261f, -0.238930f, -0.165973f, -0.115181f, -0.053004f, 0.030022f, 0.103505f, 0.154387f, 0.196765f, 0.232985f, 0.250719f, 0.249480f, 0.238127f, 0.217259f, 0.185995f, 0.153039f, 0.125445f, 0.099295f, 0.070881f, 0.043774f, 0.019636f, -0.004691f, -0.028215f, -0.045888f, -0.058070f, -0.069863f, -0.082739f, -0.095207f, -0.108273f, -0.123140f, -0.137644f, -0.150201f, -0.162441f, -0.174694f, -0.184462f, -0.191311f, -0.197478f, -0.202881f, -0.205254f, -0.204820f, -0.203437f, -0.200391f, -0.193986f, -0.185403f, -0.176781f, -0.167901f, -0.158151f, -0.148852f, -0.140977f, -0.133478f, -0.125631f, -0.118126f, -0.111133f, -0.104255f, -0.098270f, -0.094045f, -0.090471f, -0.086049f, -0.081094f, -0.076093f, -0.069893f, -0.061614f, -0.052313f, -0.043250f, -0.034722f, -0.027423f, -0.022573f, -0.020398f, -0.020777f, -0.024856f, -0.033392f, + -0.044257f, -0.054140f, -0.061819f, -0.067591f, -0.070708f, -0.069377f, -0.062218f, -0.048572f, -0.028734f, -0.004500f, 0.022107f, 0.050743f, 0.081816f, 0.114155f, 0.145494f, 0.174558f, 0.201036f, 0.224549f, 0.245211f, 0.263919f, 0.280758f, 0.294514f, 0.304706f, 0.312583f, 0.319626f, 0.326612f, 0.334080f, 0.341832f, 0.348235f, 0.351861f, 0.353358f, 0.354260f, 0.354991f, 0.355418f, 0.355888f, 0.356297f, 0.355581f, 0.353292f, 0.350219f, 0.346812f, 0.342664f, 0.337795f, 0.332648f, 0.326745f, 0.319058f, 0.309473f, 0.298401f, 0.285643f, 0.271046f, 0.255382f, 0.239371f, 0.222910f, 0.206045f, 0.189388f, 0.173090f, 0.156857f, 0.141104f, 0.126636f, 0.113452f, 0.101318f, 0.090789f, 0.082249f, 0.074992f, 0.068538f, 0.063491f, 0.060061f, 0.057439f, 0.055455f, 0.054981f, 0.056161f, 0.058110f, 0.060472f, 0.063342f, 0.066055f, 0.067915f, 0.069371f, 0.070847f, 0.071784f, 0.072212f, 0.073343f, 0.075403f, 0.077120f, 0.078098f, 0.079147f, 0.080031f, 0.079753f, 0.078802f, 0.078270f, 0.077725f, 0.076661f, 0.076178f, 0.076704f, 0.076726f, 0.075852f, 0.075519f, 0.075400f, + 0.073798f, 0.071864f, 0.071587f, 0.070807f, 0.067455f, 0.065540f, 0.067863f, 0.068385f, 0.063450f, 0.062038f, 0.069276f, 0.071356f, 0.058960f, 0.053379f, 0.078818f, 0.116438f, 0.121889f, 0.088110f, 0.054333f, 0.047493f, 0.050192f, 0.038198f, 0.017981f, 0.009829f, 0.016479f, 0.025304f, 0.026670f, 0.017667f, -0.001131f, -0.024314f, -0.047086f, -0.077035f, -0.126851f, -0.184821f, -0.205141f, -0.150219f, -0.045456f, 0.033147f, 0.045118f, 0.036078f, 0.066884f, 0.116177f, 0.121086f, 0.109949f, 0.190572f, 0.356239f, 0.408472f, 0.186052f}, + {0.042678f, 0.061622f, -0.028196f, -0.143885f, -0.224072f, -0.284508f, -0.302731f, -0.182658f, 0.099504f, 0.420275f, 0.638704f, 0.687316f, 0.489750f, -0.015410f, -0.622302f, -0.830198f, -0.349626f, 0.436547f, 0.802596f, 0.482187f, -0.101825f, -0.430320f, -0.436453f, -0.363990f, -0.342331f, -0.313261f, -0.238930f, -0.165973f, -0.115181f, -0.053004f, 0.030022f, 0.103505f, 0.154387f, 0.196765f, 0.232985f, 0.250719f, 0.249480f, 0.238127f, 0.217259f, 0.185995f, 0.153039f, 0.125445f, 0.099295f, 0.070881f, 0.043774f, 0.019636f, -0.004691f, -0.028215f, -0.045888f, -0.058070f, -0.069863f, -0.082739f, -0.095207f, -0.108273f, -0.123140f, -0.137644f, -0.150201f, -0.162441f, -0.174694f, -0.184462f, -0.191311f, -0.197478f, -0.202881f, -0.205254f, -0.204820f, -0.203437f, -0.200391f, -0.193986f, -0.185403f, -0.176781f, -0.167901f, -0.158151f, -0.148852f, -0.140977f, -0.133478f, -0.125631f, -0.118126f, -0.111133f, -0.104255f, -0.098270f, -0.094045f, -0.090471f, -0.086049f, -0.081094f, -0.076093f, -0.069893f, -0.061614f, -0.052313f, -0.043250f, -0.034722f, -0.027423f, -0.022573f, -0.020398f, -0.020777f, -0.024856f, -0.033392f, + -0.044257f, -0.054140f, -0.061819f, -0.067591f, -0.070708f, -0.069377f, -0.062218f, -0.048572f, -0.028734f, -0.004500f, 0.022107f, 0.050743f, 0.081816f, 0.114155f, 0.145494f, 0.174558f, 0.201036f, 0.224549f, 0.245211f, 0.263919f, 0.280758f, 0.294514f, 0.304706f, 0.312583f, 0.319626f, 0.326612f, 0.334080f, 0.341832f, 0.348235f, 0.351861f, 0.353358f, 0.354260f, 0.354991f, 0.355418f, 0.355888f, 0.356297f, 0.355581f, 0.353292f, 0.350219f, 0.346812f, 0.342664f, 0.337795f, 0.332648f, 0.326745f, 0.319058f, 0.309473f, 0.298401f, 0.285643f, 0.271046f, 0.255382f, 0.239371f, 0.222910f, 0.206045f, 0.189388f, 0.173090f, 0.156857f, 0.141104f, 0.126636f, 0.113452f, 0.101318f, 0.090789f, 0.082249f, 0.074992f, 0.068538f, 0.063491f, 0.060061f, 0.057439f, 0.055455f, 0.054981f, 0.056161f, 0.058110f, 0.060472f, 0.063342f, 0.066055f, 0.067915f, 0.069371f, 0.070847f, 0.071784f, 0.072212f, 0.073343f, 0.075403f, 0.077120f, 0.078098f, 0.079147f, 0.080031f, 0.079753f, 0.078802f, 0.078270f, 0.077725f, 0.076661f, 0.076178f, 0.076704f, 0.076726f, 0.075852f, 0.075519f, 0.075400f, + 0.073798f, 0.071864f, 0.071587f, 0.070807f, 0.067455f, 0.065540f, 0.067863f, 0.068385f, 0.063450f, 0.062038f, 0.069276f, 0.071356f, 0.058960f, 0.053379f, 0.078818f, 0.116438f, 0.121889f, 0.088110f, 0.054333f, 0.047493f, 0.050192f, 0.038198f, 0.017981f, 0.009829f, 0.016479f, 0.025304f, 0.026670f, 0.017667f, -0.001131f, -0.024314f, -0.047086f, -0.077035f, -0.126851f, -0.184821f, -0.205141f, -0.150219f, -0.045456f, 0.033147f, 0.045118f, 0.036078f, 0.066884f, 0.116177f, 0.121086f, 0.109949f, 0.190572f, 0.356239f, 0.408472f, 0.186052f} + }, + { + {0.005237f, 0.021703f, 0.045977f, 0.071806f, 0.092952f, 0.081260f, -0.003190f, -0.145310f, -0.275966f, -0.362527f, -0.395227f, -0.264156f, 0.150047f, 0.651732f, 0.736748f, 0.178493f, -0.546265f, -0.726461f, -0.253335f, 0.307326f, 0.460253f, 0.280757f, 0.110658f, 0.068622f, 0.044595f, -0.021458f, -0.074721f, -0.084225f, -0.083528f, -0.089857f, -0.082326f, -0.054179f, -0.024468f, -0.003872f, 0.012161f, 0.024961f, 0.032523f, 0.038120f, 0.043734f, 0.045226f, 0.042031f, 0.040072f, 0.040964f, 0.039871f, 0.035748f, 0.033014f, 0.032973f, 0.032945f, 0.032894f, 0.035106f, 0.038930f, 0.041809f, 0.043292f, 0.043813f, 0.042340f, 0.038269f, 0.032751f, 0.026426f, 0.018771f, 0.010266f, 0.002197f, -0.005598f, -0.014102f, -0.022944f, -0.031212f, -0.039210f, -0.047434f, -0.055236f, -0.062092f, -0.068591f, -0.075131f, -0.081310f, -0.087184f, -0.093424f, -0.099923f, -0.105783f, -0.110523f, -0.114008f, -0.115743f, -0.115455f, -0.113562f, -0.110039f, -0.103812f, -0.094238f, -0.082140f, -0.068646f, -0.053906f, -0.037508f, -0.019400f, -0.000138f, 0.019150f, 0.037116f, 0.052952f, 0.066525f, 0.077559f, 0.085419f, + 0.090024f, 0.092137f, 0.092407f, 0.090931f, 0.088051f, 0.084846f, 0.082459f, 0.081306f, 0.081002f, 0.080874f, 0.080752f, 0.081399f, 0.083837f, 0.088256f, 0.093970f, 0.100339f, 0.107259f, 0.114966f, 0.123841f, 0.134136f, 0.145461f, 0.156869f, 0.167780f, 0.178468f, 0.189584f, 0.201647f, 0.214894f, 0.228991f, 0.243006f, 0.256233f, 0.268833f, 0.281258f, 0.293527f, 0.305381f, 0.316502f, 0.326245f, 0.333893f, 0.339409f, 0.343323f, 0.345920f, 0.347256f, 0.347629f, 0.347192f, 0.345526f, 0.342384f, 0.338359f, 0.334213f, 0.330257f, 0.326814f, 0.324352f, 0.322779f, 0.321501f, 0.320285f, 0.319177f, 0.317892f, 0.316244f, 0.314676f, 0.313474f, 0.312258f, 0.310891f, 0.309761f, 0.308650f, 0.306736f, 0.303971f, 0.300919f, 0.297365f, 0.292823f, 0.287889f, 0.283309f, 0.278653f, 0.273613f, 0.269123f, 0.265633f, 0.262210f, 0.258582f, 0.255670f, 0.253312f, 0.250271f, 0.246652f, 0.243183f, 0.238876f, 0.232859f, 0.226812f, 0.222000f, 0.216739f, 0.210266f, 0.204891f, 0.201099f, 0.196094f, 0.189759f, 0.185117f, 0.181542f, 0.175943f, 0.170100f, 0.166931f, 0.162845f, + 0.155378f, 0.150889f, 0.151178f, 0.145769f, 0.133595f, 0.131101f, 0.138699f, 0.131114f, 0.107876f, 0.107399f, 0.131831f, 0.121095f, 0.065160f, 0.067368f, 0.195312f, 0.334380f, 0.321328f, 0.179544f, 0.074250f, 0.062451f, 0.055156f, 0.024988f, 0.064983f, 0.195879f, 0.284344f, 0.231376f, 0.110090f, 0.037519f, 0.019981f, -0.000182f, -0.041027f, -0.092433f, -0.145801f, -0.157474f, -0.070642f, 0.074676f, 0.146071f, 0.088851f, 0.000113f, -0.023302f, -0.011566f, -0.029134f, -0.060776f, -0.081612f, -0.140841f, -0.254957f, -0.296521f, -0.136956f}, + {-0.005237f, -0.021703f, -0.045977f, -0.071806f, -0.092952f, -0.081260f, 0.003190f, 0.145310f, 0.275966f, 0.362527f, 0.395227f, 0.264156f, -0.150047f, -0.651732f, -0.736748f, -0.178493f, 0.546265f, 0.726461f, 0.253335f, -0.307326f, -0.460253f, -0.280757f, -0.110658f, -0.068622f, -0.044595f, 0.021458f, 0.074721f, 0.084225f, 0.083528f, 0.089857f, 0.082326f, 0.054179f, 0.024468f, 0.003872f, -0.012161f, -0.024961f, -0.032523f, -0.038120f, -0.043734f, -0.045226f, -0.042031f, -0.040072f, -0.040964f, -0.039871f, -0.035748f, -0.033014f, -0.032973f, -0.032945f, -0.032894f, -0.035106f, -0.038930f, -0.041809f, -0.043292f, -0.043813f, -0.042340f, -0.038269f, -0.032751f, -0.026426f, -0.018771f, -0.010266f, -0.002197f, 0.005598f, 0.014102f, 0.022944f, 0.031212f, 0.039210f, 0.047434f, 0.055236f, 0.062092f, 0.068591f, 0.075131f, 0.081310f, 0.087184f, 0.093424f, 0.099923f, 0.105783f, 0.110523f, 0.114008f, 0.115743f, 0.115455f, 0.113562f, 0.110039f, 0.103812f, 0.094238f, 0.082140f, 0.068646f, 0.053906f, 0.037508f, 0.019400f, 0.000138f, -0.019150f, -0.037116f, -0.052952f, -0.066525f, -0.077559f, -0.085419f, + -0.090024f, -0.092137f, -0.092407f, -0.090931f, -0.088051f, -0.084846f, -0.082459f, -0.081306f, -0.081002f, -0.080874f, -0.080752f, -0.081399f, -0.083837f, -0.088256f, -0.093970f, -0.100339f, -0.107259f, -0.114966f, -0.123841f, -0.134136f, -0.145461f, -0.156869f, -0.167780f, -0.178468f, -0.189584f, -0.201647f, -0.214894f, -0.228991f, -0.243006f, -0.256233f, -0.268833f, -0.281258f, -0.293527f, -0.305381f, -0.316502f, -0.326245f, -0.333893f, -0.339409f, -0.343323f, -0.345920f, -0.347256f, -0.347629f, -0.347192f, -0.345526f, -0.342384f, -0.338359f, -0.334213f, -0.330257f, -0.326814f, -0.324352f, -0.322779f, -0.321501f, -0.320285f, -0.319177f, -0.317892f, -0.316244f, -0.314676f, -0.313474f, -0.312258f, -0.310891f, -0.309761f, -0.308650f, -0.306736f, -0.303971f, -0.300919f, -0.297365f, -0.292823f, -0.287889f, -0.283309f, -0.278653f, -0.273613f, -0.269123f, -0.265633f, -0.262210f, -0.258582f, -0.255670f, -0.253312f, -0.250271f, -0.246652f, -0.243183f, -0.238876f, -0.232859f, -0.226812f, -0.222000f, -0.216739f, -0.210266f, -0.204891f, -0.201099f, -0.196094f, -0.189759f, -0.185117f, -0.181542f, -0.175943f, -0.170100f, -0.166931f, -0.162845f, + -0.155378f, -0.150889f, -0.151178f, -0.145769f, -0.133595f, -0.131101f, -0.138699f, -0.131114f, -0.107876f, -0.107399f, -0.131831f, -0.121095f, -0.065160f, -0.067368f, -0.195312f, -0.334380f, -0.321328f, -0.179544f, -0.074250f, -0.062451f, -0.055156f, -0.024988f, -0.064983f, -0.195879f, -0.284344f, -0.231376f, -0.110090f, -0.037519f, -0.019981f, 0.000182f, 0.041027f, 0.092433f, 0.145801f, 0.157474f, 0.070642f, -0.074676f, -0.146071f, -0.088851f, -0.000113f, 0.023302f, 0.011566f, 0.029134f, 0.060776f, 0.081612f, 0.140841f, 0.254957f, 0.296521f, 0.136956f} + }, + { + {0.003290f, 0.004457f, -0.005528f, -0.024503f, -0.040658f, -0.025318f, 0.044206f, 0.129212f, 0.134877f, 0.022060f, -0.113425f, -0.138652f, -0.048257f, 0.038579f, 0.043176f, 0.010064f, 0.006812f, 0.021760f, 0.008859f, -0.024480f, -0.035157f, -0.018780f, -0.010069f, -0.021483f, -0.027992f, -0.012071f, 0.011813f, 0.022917f, 0.019094f, 0.008846f, -0.003933f, -0.019076f, -0.033862f, -0.044037f, -0.047229f, -0.043365f, -0.034518f, -0.024371f, -0.015194f, -0.005790f, 0.005807f, 0.018765f, 0.030239f, 0.038382f, 0.043045f, 0.044775f, 0.044750f, 0.045028f, 0.047510f, 0.052757f, 0.060176f, 0.068888f, 0.078026f, 0.086682f, 0.094135f, 0.100148f, 0.104865f, 0.108434f, 0.110857f, 0.112171f, 0.112552f, 0.112064f, 0.110518f, 0.107865f, 0.104605f, 0.101407f, 0.098467f, 0.095713f, 0.093491f, 0.092393f, 0.092459f, 0.093229f, 0.094672f, 0.097391f, 0.101744f, 0.107363f, 0.113784f, 0.120958f, 0.128800f, 0.136599f, 0.143271f, 0.148034f, 0.150614f, 0.150845f, 0.148141f, 0.141385f, 0.129494f, 0.112216f, 0.090156f, 0.063735f, 0.032399f, -0.004651f, -0.046969f, -0.092530f, -0.138942f, -0.184556f, + -0.228255f, -0.268567f, -0.303451f, -0.331114f, -0.351060f, -0.364229f, -0.371919f, -0.374505f, -0.371598f, -0.363669f, -0.353079f, -0.342887f, -0.334569f, -0.327154f, -0.318566f, -0.307656f, -0.295101f, -0.282663f, -0.271630f, -0.261889f, -0.252419f, -0.242495f, -0.232267f, -0.222371f, -0.213326f, -0.205197f, -0.197481f, -0.189342f, -0.180196f, -0.170060f, -0.159249f, -0.147949f, -0.136227f, -0.124196f, -0.111996f, -0.099831f, -0.088089f, -0.077140f, -0.066975f, -0.057295f, -0.047872f, -0.038650f, -0.029694f, -0.021309f, -0.013879f, -0.007297f, -0.000899f, 0.005873f, 0.013174f, 0.021158f, 0.029939f, 0.039052f, 0.047778f, 0.056179f, 0.065084f, 0.075097f, 0.086363f, 0.099143f, 0.113686f, 0.129646f, 0.146404f, 0.163684f, 0.181241f, 0.198487f, 0.214981f, 0.230647f, 0.245100f, 0.257590f, 0.267839f, 0.275939f, 0.281514f, 0.284182f, 0.284595f, 0.283723f, 0.281609f, 0.278146f, 0.274139f, 0.270221f, 0.265944f, 0.261144f, 0.256555f, 0.252147f, 0.247009f, 0.241520f, 0.236982f, 0.232888f, 0.227759f, 0.222258f, 0.217750f, 0.212978f, 0.206361f, 0.199432f, 0.193539f, 0.186770f, 0.178678f, 0.172413f, + 0.167586f, 0.159508f, 0.149897f, 0.145822f, 0.143645f, 0.132268f, 0.117259f, 0.115520f, 0.119222f, 0.102510f, 0.076298f, 0.083698f, 0.113656f, 0.084809f, -0.030790f, -0.132140f, -0.115897f, -0.025563f, 0.020739f, 0.007588f, 0.010784f, 0.033761f, -0.006155f, -0.114325f, -0.177032f, -0.130405f, -0.055807f, -0.044287f, -0.066534f, -0.052950f, -0.016133f, -0.003723f, 0.004837f, 0.055791f, 0.115431f, 0.104274f, 0.022364f, -0.044182f, -0.042903f, -0.010534f, 0.000271f, -0.011501f, -0.020234f, -0.019218f, -0.016156f, -0.012286f, -0.006242f, -0.001442f}, + {-0.003290f, -0.004457f, 0.005528f, 0.024503f, 0.040658f, 0.025318f, -0.044206f, -0.129212f, -0.134877f, -0.022060f, 0.113425f, 0.138652f, 0.048257f, -0.038579f, -0.043176f, -0.010064f, -0.006812f, -0.021760f, -0.008859f, 0.024480f, 0.035157f, 0.018780f, 0.010069f, 0.021483f, 0.027992f, 0.012071f, -0.011813f, -0.022917f, -0.019094f, -0.008846f, 0.003933f, 0.019076f, 0.033862f, 0.044037f, 0.047229f, 0.043365f, 0.034518f, 0.024371f, 0.015194f, 0.005790f, -0.005807f, -0.018765f, -0.030239f, -0.038382f, -0.043045f, -0.044775f, -0.044750f, -0.045028f, -0.047510f, -0.052757f, -0.060176f, -0.068888f, -0.078026f, -0.086682f, -0.094135f, -0.100148f, -0.104865f, -0.108434f, -0.110857f, -0.112171f, -0.112552f, -0.112064f, -0.110518f, -0.107865f, -0.104605f, -0.101407f, -0.098467f, -0.095713f, -0.093491f, -0.092393f, -0.092459f, -0.093229f, -0.094672f, -0.097391f, -0.101744f, -0.107363f, -0.113784f, -0.120958f, -0.128800f, -0.136599f, -0.143271f, -0.148034f, -0.150614f, -0.150845f, -0.148141f, -0.141385f, -0.129494f, -0.112216f, -0.090156f, -0.063735f, -0.032399f, 0.004651f, 0.046969f, 0.092530f, 0.138942f, 0.184556f, + 0.228255f, 0.268567f, 0.303451f, 0.331114f, 0.351060f, 0.364229f, 0.371919f, 0.374505f, 0.371598f, 0.363669f, 0.353079f, 0.342887f, 0.334569f, 0.327154f, 0.318566f, 0.307656f, 0.295101f, 0.282663f, 0.271630f, 0.261889f, 0.252419f, 0.242495f, 0.232267f, 0.222371f, 0.213326f, 0.205197f, 0.197481f, 0.189342f, 0.180196f, 0.170060f, 0.159249f, 0.147949f, 0.136227f, 0.124196f, 0.111996f, 0.099831f, 0.088089f, 0.077140f, 0.066975f, 0.057295f, 0.047872f, 0.038650f, 0.029694f, 0.021309f, 0.013879f, 0.007297f, 0.000899f, -0.005873f, -0.013174f, -0.021158f, -0.029939f, -0.039052f, -0.047778f, -0.056179f, -0.065084f, -0.075097f, -0.086363f, -0.099143f, -0.113686f, -0.129646f, -0.146404f, -0.163684f, -0.181241f, -0.198487f, -0.214981f, -0.230647f, -0.245100f, -0.257590f, -0.267839f, -0.275939f, -0.281514f, -0.284182f, -0.284595f, -0.283723f, -0.281609f, -0.278146f, -0.274139f, -0.270221f, -0.265944f, -0.261144f, -0.256555f, -0.252147f, -0.247009f, -0.241520f, -0.236982f, -0.232888f, -0.227759f, -0.222258f, -0.217750f, -0.212978f, -0.206361f, -0.199432f, -0.193539f, -0.186770f, -0.178678f, -0.172413f, + -0.167586f, -0.159508f, -0.149897f, -0.145822f, -0.143645f, -0.132268f, -0.117259f, -0.115520f, -0.119222f, -0.102510f, -0.076298f, -0.083698f, -0.113656f, -0.084809f, 0.030790f, 0.132140f, 0.115897f, 0.025563f, -0.020739f, -0.007588f, -0.010784f, -0.033761f, 0.006155f, 0.114325f, 0.177032f, 0.130405f, 0.055807f, 0.044287f, 0.066534f, 0.052950f, 0.016133f, 0.003723f, -0.004837f, -0.055791f, -0.115431f, -0.104274f, -0.022364f, 0.044182f, 0.042903f, 0.010534f, -0.000271f, 0.011501f, 0.020234f, 0.019218f, 0.016156f, 0.012286f, 0.006242f, 0.001442f} + }, + { + {0.011164f, 0.032836f, 0.036645f, 0.010266f, -0.002453f, 0.048984f, 0.112171f, 0.055369f, -0.161208f, -0.386598f, -0.393418f, -0.096523f, 0.327126f, 0.541470f, 0.342730f, -0.107176f, -0.401047f, -0.302387f, 0.016123f, 0.212089f, 0.167723f, 0.036742f, -0.030253f, -0.044201f, -0.062205f, -0.067661f, -0.027021f, 0.029533f, 0.052252f, 0.045066f, 0.045409f, 0.066031f, 0.094060f, 0.121955f, 0.148648f, 0.165808f, 0.164983f, 0.149562f, 0.128033f, 0.103839f, 0.078146f, 0.053697f, 0.031162f, 0.008320f, -0.015066f, -0.036973f, -0.057449f, -0.078140f, -0.098645f, -0.117711f, -0.136293f, -0.155534f, -0.173582f, -0.187426f, -0.195978f, -0.199282f, -0.197030f, -0.189763f, -0.179374f, -0.166925f, -0.151599f, -0.132527f, -0.109872f, -0.083662f, -0.053273f, -0.018574f, 0.019487f, 0.059494f, 0.099905f, 0.139081f, 0.175756f, 0.209103f, 0.237873f, 0.260210f, 0.274934f, 0.282259f, 0.282639f, 0.275632f, 0.260647f, 0.238307f, 0.210293f, 0.177967f, 0.141703f, 0.101603f, 0.058418f, 0.013424f, -0.032487f, -0.079182f, -0.126657f, -0.174435f, -0.221816f, -0.268160f, -0.312343f, -0.352314f, -0.385884f, -0.411766f, + -0.429215f, -0.436998f, -0.433649f, -0.418961f, -0.394679f, -0.363490f, -0.327514f, -0.287649f, -0.244197f, -0.198315f, -0.152926f, -0.111682f, -0.076694f, -0.047638f, -0.023186f, -0.002688f, 0.013718f, 0.025795f, 0.033396f, 0.036453f, 0.035301f, 0.030767f, 0.023826f, 0.015431f, 0.006538f, -0.002356f, -0.011778f, -0.022870f, -0.036327f, -0.051958f, -0.068973f, -0.086308f, -0.103002f, -0.118765f, -0.133990f, -0.148972f, -0.163394f, -0.176630f, -0.188097f, -0.197282f, -0.203969f, -0.208402f, -0.210775f, -0.210752f, -0.207996f, -0.202785f, -0.195626f, -0.186736f, -0.176426f, -0.165358f, -0.153969f, -0.142280f, -0.130641f, -0.119870f, -0.110421f, -0.102206f, -0.095291f, -0.089829f, -0.085360f, -0.081117f, -0.076882f, -0.072735f, -0.068397f, -0.063649f, -0.058777f, -0.053866f, -0.048414f, -0.042214f, -0.035732f, -0.029221f, -0.022534f, -0.015932f, -0.009843f, -0.003888f, 0.002599f, 0.009436f, 0.016248f, 0.023570f, 0.031998f, 0.041152f, 0.050592f, 0.060497f, 0.070490f, 0.079404f, 0.086950f, 0.093796f, 0.099686f, 0.103660f, 0.106051f, 0.107861f, 0.108670f, 0.107687f, 0.105806f, 0.104009f, 0.101428f, 0.097536f, + 0.093765f, 0.090589f, 0.086306f, 0.080851f, 0.076442f, 0.072650f, 0.066432f, 0.058555f, 0.053047f, 0.048898f, 0.040819f, 0.029903f, 0.023605f, 0.022728f, 0.019228f, 0.010531f, 0.005076f, 0.008678f, 0.015334f, 0.017655f, 0.018434f, 0.024584f, 0.033609f, 0.033286f, 0.017113f, -0.002988f, -0.006746f, 0.008393f, 0.021799f, 0.020507f, 0.021478f, 0.041101f, 0.054308f, 0.019430f, -0.054565f, -0.102615f, -0.079454f, -0.013054f, 0.033272f, 0.030133f, -0.000759f, -0.021432f, -0.017817f, -0.013999f, -0.044719f, -0.101574f, -0.121223f, -0.055701f}, + {-0.011164f, -0.032836f, -0.036645f, -0.010266f, 0.002453f, -0.048984f, -0.112171f, -0.055369f, 0.161208f, 0.386598f, 0.393418f, 0.096523f, -0.327126f, -0.541470f, -0.342730f, 0.107176f, 0.401047f, 0.302387f, -0.016123f, -0.212089f, -0.167723f, -0.036742f, 0.030253f, 0.044201f, 0.062205f, 0.067661f, 0.027021f, -0.029533f, -0.052252f, -0.045066f, -0.045409f, -0.066031f, -0.094060f, -0.121955f, -0.148648f, -0.165808f, -0.164983f, -0.149562f, -0.128033f, -0.103839f, -0.078146f, -0.053697f, -0.031162f, -0.008320f, 0.015066f, 0.036973f, 0.057449f, 0.078140f, 0.098645f, 0.117711f, 0.136293f, 0.155534f, 0.173582f, 0.187426f, 0.195978f, 0.199282f, 0.197030f, 0.189763f, 0.179374f, 0.166925f, 0.151599f, 0.132527f, 0.109872f, 0.083662f, 0.053273f, 0.018574f, -0.019487f, -0.059494f, -0.099905f, -0.139081f, -0.175756f, -0.209103f, -0.237873f, -0.260210f, -0.274934f, -0.282259f, -0.282639f, -0.275632f, -0.260647f, -0.238307f, -0.210293f, -0.177967f, -0.141703f, -0.101603f, -0.058418f, -0.013424f, 0.032487f, 0.079182f, 0.126657f, 0.174435f, 0.221816f, 0.268160f, 0.312343f, 0.352314f, 0.385884f, 0.411766f, + 0.429215f, 0.436998f, 0.433649f, 0.418961f, 0.394679f, 0.363490f, 0.327514f, 0.287649f, 0.244197f, 0.198315f, 0.152926f, 0.111682f, 0.076694f, 0.047638f, 0.023186f, 0.002688f, -0.013718f, -0.025795f, -0.033396f, -0.036453f, -0.035301f, -0.030767f, -0.023826f, -0.015431f, -0.006538f, 0.002356f, 0.011778f, 0.022870f, 0.036327f, 0.051958f, 0.068973f, 0.086308f, 0.103002f, 0.118765f, 0.133990f, 0.148972f, 0.163394f, 0.176630f, 0.188097f, 0.197282f, 0.203969f, 0.208402f, 0.210775f, 0.210752f, 0.207996f, 0.202785f, 0.195626f, 0.186736f, 0.176426f, 0.165358f, 0.153969f, 0.142280f, 0.130641f, 0.119870f, 0.110421f, 0.102206f, 0.095291f, 0.089829f, 0.085360f, 0.081117f, 0.076882f, 0.072735f, 0.068397f, 0.063649f, 0.058777f, 0.053866f, 0.048414f, 0.042214f, 0.035732f, 0.029221f, 0.022534f, 0.015932f, 0.009843f, 0.003888f, -0.002599f, -0.009436f, -0.016248f, -0.023570f, -0.031998f, -0.041152f, -0.050592f, -0.060497f, -0.070490f, -0.079404f, -0.086950f, -0.093796f, -0.099686f, -0.103660f, -0.106051f, -0.107861f, -0.108670f, -0.107687f, -0.105806f, -0.104009f, -0.101428f, -0.097536f, + -0.093765f, -0.090589f, -0.086306f, -0.080851f, -0.076442f, -0.072650f, -0.066432f, -0.058555f, -0.053047f, -0.048898f, -0.040819f, -0.029903f, -0.023605f, -0.022728f, -0.019228f, -0.010531f, -0.005076f, -0.008678f, -0.015334f, -0.017655f, -0.018434f, -0.024584f, -0.033609f, -0.033286f, -0.017113f, 0.002988f, 0.006746f, -0.008393f, -0.021799f, -0.020507f, -0.021478f, -0.041101f, -0.054308f, -0.019430f, 0.054565f, 0.102615f, 0.079454f, 0.013054f, -0.033272f, -0.030133f, 0.000759f, 0.021432f, 0.017817f, 0.013999f, 0.044719f, 0.101574f, 0.121223f, 0.055701f} + }, + { + {-0.000057f, 0.004618f, 0.017682f, 0.031128f, 0.031889f, 0.012604f, -0.024428f, -0.067381f, -0.092044f, -0.068699f, 0.006663f, 0.086585f, 0.103494f, 0.041969f, -0.038554f, -0.069591f, -0.044517f, -0.004822f, 0.023300f, 0.046137f, 0.066610f, 0.069547f, 0.049468f, 0.024226f, 0.008422f, -0.007184f, -0.037346f, -0.077238f, -0.107144f, -0.113458f, -0.096785f, -0.066490f, -0.035038f, -0.013153f, -0.003730f, -0.000878f, 0.003116f, 0.011034f, 0.020563f, 0.027847f, 0.030544f, 0.029277f, 0.026700f, 0.024711f, 0.023212f, 0.021560f, 0.019500f, 0.016290f, 0.010748f, 0.002681f, -0.007062f, -0.017978f, -0.030113f, -0.043238f, -0.056960f, -0.071085f, -0.084942f, -0.097195f, -0.106968f, -0.114229f, -0.118841f, -0.120501f, -0.119614f, -0.116789f, -0.111677f, -0.103680f, -0.093172f, -0.080489f, -0.064566f, -0.044178f, -0.019643f, 0.008060f, 0.038626f, 0.071500f, 0.104878f, 0.136913f, 0.166805f, 0.193866f, 0.216842f, 0.234966f, 0.248504f, 0.257609f, 0.261575f, 0.259590f, 0.251591f, 0.238272f, 0.220487f, 0.198276f, 0.170561f, 0.136698f, 0.098189f, 0.057682f, 0.016496f, -0.025495f, -0.067816f, -0.108621f, + -0.145658f, -0.176870f, -0.200772f, -0.217529f, -0.228950f, -0.236396f, -0.239262f, -0.236051f, -0.226084f, -0.210128f, -0.190544f, -0.170619f, -0.152249f, -0.134448f, -0.115361f, -0.095074f, -0.075354f, -0.057740f, -0.043170f, -0.032135f, -0.023928f, -0.016976f, -0.010829f, -0.006589f, -0.005154f, -0.006616f, -0.011291f, -0.019411f, -0.030043f, -0.042074f, -0.055747f, -0.071687f, -0.089493f, -0.108727f, -0.129821f, -0.152682f, -0.176004f, -0.198998f, -0.221985f, -0.244760f, -0.266417f, -0.286912f, -0.306659f, -0.324871f, -0.340388f, -0.353362f, -0.364168f, -0.372020f, -0.376464f, -0.378404f, -0.378114f, -0.374521f, -0.367666f, -0.359313f, -0.350349f, -0.340361f, -0.329902f, -0.320119f, -0.310406f, -0.299314f, -0.286923f, -0.273822f, -0.259542f, -0.244326f, -0.229980f, -0.217077f, -0.204279f, -0.191540f, -0.180261f, -0.169869f, -0.158554f, -0.147117f, -0.137572f, -0.129135f, -0.120174f, -0.111850f, -0.105358f, -0.098801f, -0.090788f, -0.082858f, -0.075269f, -0.065930f, -0.055595f, -0.047479f, -0.040967f, -0.033205f, -0.025890f, -0.022124f, -0.019442f, -0.014783f, -0.011252f, -0.011244f, -0.010626f, -0.007763f, -0.007496f, -0.009654f, + -0.008162f, -0.005566f, -0.009317f, -0.013253f, -0.007832f, -0.004274f, -0.015488f, -0.023533f, -0.010153f, -0.002382f, -0.027502f, -0.045274f, -0.009521f, 0.021910f, -0.048635f, -0.183515f, -0.228104f, -0.131244f, -0.015609f, 0.018983f, 0.026755f, 0.075115f, 0.100455f, 0.016691f, -0.118628f, -0.165113f, -0.084096f, 0.032836f, 0.098202f, 0.116964f, 0.144314f, 0.200805f, 0.235092f, 0.168366f, -0.003252f, -0.162099f, -0.176037f, -0.055350f, 0.054849f, 0.051827f, -0.015974f, -0.043441f, -0.012571f, 0.007826f, -0.027403f, -0.083452f, -0.095889f, -0.042074f}, + {-0.000057f, 0.004618f, 0.017682f, 0.031128f, 0.031889f, 0.012604f, -0.024428f, -0.067381f, -0.092044f, -0.068699f, 0.006663f, 0.086585f, 0.103494f, 0.041969f, -0.038554f, -0.069591f, -0.044517f, -0.004822f, 0.023300f, 0.046137f, 0.066610f, 0.069547f, 0.049468f, 0.024226f, 0.008422f, -0.007184f, -0.037346f, -0.077238f, -0.107144f, -0.113458f, -0.096785f, -0.066490f, -0.035038f, -0.013153f, -0.003730f, -0.000878f, 0.003116f, 0.011034f, 0.020563f, 0.027847f, 0.030544f, 0.029277f, 0.026700f, 0.024711f, 0.023212f, 0.021560f, 0.019500f, 0.016290f, 0.010748f, 0.002681f, -0.007062f, -0.017978f, -0.030113f, -0.043238f, -0.056960f, -0.071085f, -0.084942f, -0.097195f, -0.106968f, -0.114229f, -0.118841f, -0.120501f, -0.119614f, -0.116789f, -0.111677f, -0.103680f, -0.093172f, -0.080489f, -0.064566f, -0.044178f, -0.019643f, 0.008060f, 0.038626f, 0.071500f, 0.104878f, 0.136913f, 0.166805f, 0.193866f, 0.216842f, 0.234966f, 0.248504f, 0.257609f, 0.261575f, 0.259590f, 0.251591f, 0.238272f, 0.220487f, 0.198276f, 0.170561f, 0.136698f, 0.098189f, 0.057682f, 0.016496f, -0.025495f, -0.067816f, -0.108621f, + -0.145658f, -0.176870f, -0.200772f, -0.217529f, -0.228950f, -0.236396f, -0.239262f, -0.236051f, -0.226084f, -0.210128f, -0.190544f, -0.170619f, -0.152249f, -0.134448f, -0.115361f, -0.095074f, -0.075354f, -0.057740f, -0.043170f, -0.032135f, -0.023928f, -0.016976f, -0.010829f, -0.006589f, -0.005154f, -0.006616f, -0.011291f, -0.019411f, -0.030043f, -0.042074f, -0.055747f, -0.071687f, -0.089493f, -0.108727f, -0.129821f, -0.152682f, -0.176004f, -0.198998f, -0.221985f, -0.244760f, -0.266417f, -0.286912f, -0.306659f, -0.324871f, -0.340388f, -0.353362f, -0.364168f, -0.372020f, -0.376464f, -0.378404f, -0.378114f, -0.374521f, -0.367666f, -0.359313f, -0.350349f, -0.340361f, -0.329902f, -0.320119f, -0.310406f, -0.299314f, -0.286923f, -0.273822f, -0.259542f, -0.244326f, -0.229980f, -0.217077f, -0.204279f, -0.191540f, -0.180261f, -0.169869f, -0.158554f, -0.147117f, -0.137572f, -0.129135f, -0.120174f, -0.111850f, -0.105358f, -0.098801f, -0.090788f, -0.082858f, -0.075269f, -0.065930f, -0.055595f, -0.047479f, -0.040967f, -0.033205f, -0.025890f, -0.022124f, -0.019442f, -0.014783f, -0.011252f, -0.011244f, -0.010626f, -0.007763f, -0.007496f, -0.009654f, + -0.008162f, -0.005566f, -0.009317f, -0.013253f, -0.007832f, -0.004274f, -0.015488f, -0.023533f, -0.010153f, -0.002382f, -0.027502f, -0.045274f, -0.009521f, 0.021910f, -0.048635f, -0.183515f, -0.228104f, -0.131244f, -0.015609f, 0.018983f, 0.026755f, 0.075115f, 0.100455f, 0.016691f, -0.118628f, -0.165113f, -0.084096f, 0.032836f, 0.098202f, 0.116964f, 0.144314f, 0.200805f, 0.235092f, 0.168366f, -0.003252f, -0.162099f, -0.176037f, -0.055350f, 0.054849f, 0.051827f, -0.015974f, -0.043441f, -0.012571f, 0.007826f, -0.027403f, -0.083452f, -0.095889f, -0.042074f} + }, + { + {0.003286f, 0.020663f, 0.047015f, 0.053514f, 0.027668f, -0.018005f, -0.074845f, -0.129718f, -0.133764f, -0.040778f, 0.107952f, 0.192417f, 0.138911f, 0.002813f, -0.096900f, -0.097211f, -0.027296f, 0.041753f, 0.055973f, 0.009638f, -0.053234f, -0.074730f, -0.036276f, 0.028003f, 0.073968f, 0.088912f, 0.085590f, 0.075178f, 0.060843f, 0.045753f, 0.031933f, 0.015643f, -0.006543f, -0.030509f, -0.049634f, -0.063067f, -0.073747f, -0.081798f, -0.084797f, -0.082534f, -0.077869f, -0.073890f, -0.072300f, -0.073599f, -0.077378f, -0.082705f, -0.088483f, -0.093078f, -0.094258f, -0.090539f, -0.082362f, -0.071359f, -0.059106f, -0.047102f, -0.036931f, -0.029407f, -0.023973f, -0.019544f, -0.015494f, -0.011431f, -0.006598f, 0.000010f, 0.009248f, 0.021699f, 0.037488f, 0.055980f, 0.076003f, 0.096419f, 0.116146f, 0.133812f, 0.148176f, 0.159051f, 0.167129f, 0.172618f, 0.174876f, 0.173820f, 0.170796f, 0.167101f, 0.162315f, 0.155354f, 0.146888f, 0.139280f, 0.133952f, 0.130225f, 0.127363f, 0.126470f, 0.129155f, 0.134873f, 0.140780f, 0.144329f, 0.145336f, 0.145342f, 0.145533f, 0.145667f, 0.144745f, 0.142112f, + 0.137732f, 0.131877f, 0.125120f, 0.118473f, 0.112800f, 0.107738f, 0.101543f, 0.092388f, 0.079744f, 0.064329f, 0.046886f, 0.027329f, 0.005126f, -0.019726f, -0.046309f, -0.073397f, -0.100300f, -0.127038f, -0.153757f, -0.180066f, -0.204868f, -0.226760f, -0.244721f, -0.258627f, -0.269120f, -0.276888f, -0.282007f, -0.283898f, -0.281834f, -0.275598f, -0.265873f, -0.254057f, -0.241477f, -0.228516f, -0.214415f, -0.197989f, -0.178738f, -0.157442f, -0.135714f, -0.114934f, -0.095604f, -0.077515f, -0.060115f, -0.042690f, -0.024757f, -0.006617f, 0.010792f, 0.026792f, 0.041319f, 0.054297f, 0.065248f, 0.073855f, 0.080421f, 0.085476f, 0.089337f, 0.092227f, 0.094391f, 0.095900f, 0.096594f, 0.096231f, 0.094555f, 0.091499f, 0.087561f, 0.083596f, 0.080064f, 0.076942f, 0.074384f, 0.072705f, 0.071678f, 0.070768f, 0.070120f, 0.070423f, 0.071853f, 0.074033f, 0.076789f, 0.079999f, 0.083058f, 0.085305f, 0.086394f, 0.085686f, 0.082340f, 0.076614f, 0.069777f, 0.062351f, 0.054034f, 0.045374f, 0.037457f, 0.030035f, 0.022223f, 0.014513f, 0.007727f, 0.001194f, -0.005463f, -0.010784f, -0.014329f, -0.017958f, + -0.021688f, -0.022941f, -0.022426f, -0.024089f, -0.026735f, -0.025120f, -0.021928f, -0.025401f, -0.031768f, -0.028507f, -0.020527f, -0.027990f, -0.046743f, -0.042080f, -0.003396f, 0.027264f, 0.013170f, -0.020073f, -0.025760f, -0.008495f, -0.005552f, -0.014133f, 0.003435f, 0.044906f, 0.059066f, 0.024448f, -0.015911f, -0.021124f, -0.009130f, -0.017009f, -0.041372f, -0.056366f, -0.066541f, -0.097055f, -0.137463f, -0.138780f, -0.079675f, -0.003607f, 0.033428f, 0.030812f, 0.028961f, 0.041471f, 0.044399f, 0.035401f, 0.052169f, 0.103505f, 0.125865f, 0.058885f}, + {0.003286f, 0.020663f, 0.047015f, 0.053514f, 0.027668f, -0.018005f, -0.074845f, -0.129718f, -0.133764f, -0.040778f, 0.107952f, 0.192417f, 0.138911f, 0.002813f, -0.096900f, -0.097211f, -0.027296f, 0.041753f, 0.055973f, 0.009638f, -0.053234f, -0.074730f, -0.036276f, 0.028003f, 0.073968f, 0.088912f, 0.085590f, 0.075178f, 0.060843f, 0.045753f, 0.031933f, 0.015643f, -0.006543f, -0.030509f, -0.049634f, -0.063067f, -0.073747f, -0.081798f, -0.084797f, -0.082534f, -0.077869f, -0.073890f, -0.072300f, -0.073599f, -0.077378f, -0.082705f, -0.088483f, -0.093078f, -0.094258f, -0.090539f, -0.082362f, -0.071359f, -0.059106f, -0.047102f, -0.036931f, -0.029407f, -0.023973f, -0.019544f, -0.015494f, -0.011431f, -0.006598f, 0.000010f, 0.009248f, 0.021699f, 0.037488f, 0.055980f, 0.076003f, 0.096419f, 0.116146f, 0.133812f, 0.148176f, 0.159051f, 0.167129f, 0.172618f, 0.174876f, 0.173820f, 0.170796f, 0.167101f, 0.162315f, 0.155354f, 0.146888f, 0.139280f, 0.133952f, 0.130225f, 0.127363f, 0.126470f, 0.129155f, 0.134873f, 0.140780f, 0.144329f, 0.145336f, 0.145342f, 0.145533f, 0.145667f, 0.144745f, 0.142112f, + 0.137732f, 0.131877f, 0.125120f, 0.118473f, 0.112800f, 0.107738f, 0.101543f, 0.092388f, 0.079744f, 0.064329f, 0.046886f, 0.027329f, 0.005126f, -0.019726f, -0.046309f, -0.073397f, -0.100300f, -0.127038f, -0.153757f, -0.180066f, -0.204868f, -0.226760f, -0.244721f, -0.258627f, -0.269120f, -0.276888f, -0.282007f, -0.283898f, -0.281834f, -0.275598f, -0.265873f, -0.254057f, -0.241477f, -0.228516f, -0.214415f, -0.197989f, -0.178738f, -0.157442f, -0.135714f, -0.114934f, -0.095604f, -0.077515f, -0.060115f, -0.042690f, -0.024757f, -0.006617f, 0.010792f, 0.026792f, 0.041319f, 0.054297f, 0.065248f, 0.073855f, 0.080421f, 0.085476f, 0.089337f, 0.092227f, 0.094391f, 0.095900f, 0.096594f, 0.096231f, 0.094555f, 0.091499f, 0.087561f, 0.083596f, 0.080064f, 0.076942f, 0.074384f, 0.072705f, 0.071678f, 0.070768f, 0.070120f, 0.070423f, 0.071853f, 0.074033f, 0.076789f, 0.079999f, 0.083058f, 0.085305f, 0.086394f, 0.085686f, 0.082340f, 0.076614f, 0.069777f, 0.062351f, 0.054034f, 0.045374f, 0.037457f, 0.030035f, 0.022223f, 0.014513f, 0.007727f, 0.001194f, -0.005463f, -0.010784f, -0.014329f, -0.017958f, + -0.021688f, -0.022941f, -0.022426f, -0.024089f, -0.026735f, -0.025120f, -0.021928f, -0.025401f, -0.031768f, -0.028507f, -0.020527f, -0.027990f, -0.046743f, -0.042080f, -0.003396f, 0.027264f, 0.013170f, -0.020073f, -0.025760f, -0.008495f, -0.005552f, -0.014133f, 0.003435f, 0.044906f, 0.059066f, 0.024448f, -0.015911f, -0.021124f, -0.009130f, -0.017009f, -0.041372f, -0.056366f, -0.066541f, -0.097055f, -0.137463f, -0.138780f, -0.079675f, -0.003607f, 0.033428f, 0.030812f, 0.028961f, 0.041471f, 0.044399f, 0.035401f, 0.052169f, 0.103505f, 0.125865f, 0.058885f} + }, + { + {-0.008208f, -0.013688f, -0.006252f, -0.003509f, -0.000109f, 0.028292f, 0.061055f, 0.024138f, -0.104438f, -0.212259f, -0.151442f, 0.066373f, 0.240645f, 0.196077f, -0.011619f, -0.162771f, -0.129256f, 0.005131f, 0.087028f, 0.080806f, 0.064102f, 0.086674f, 0.110230f, 0.085283f, 0.023202f, -0.032808f, -0.069022f, -0.103127f, -0.145227f, -0.184194f, -0.205940f, -0.206303f, -0.187706f, -0.155585f, -0.118331f, -0.083351f, -0.052728f, -0.025564f, -0.002289f, 0.015831f, 0.028630f, 0.036097f, 0.037847f, 0.035268f, 0.032049f, 0.031340f, 0.033967f, 0.039715f, 0.048284f, 0.058597f, 0.068960f, 0.078321f, 0.086272f, 0.091981f, 0.094350f, 0.093104f, 0.088896f, 0.082572f, 0.074997f, 0.067252f, 0.060472f, 0.055558f, 0.053169f, 0.053701f, 0.057297f, 0.064029f, 0.073926f, 0.086744f, 0.102064f, 0.119670f, 0.139384f, 0.160516f, 0.181938f, 0.202628f, 0.221700f, 0.238171f, 0.251219f, 0.260419f, 0.265483f, 0.266392f, 0.264039f, 0.259842f, 0.254367f, 0.247216f, 0.238440f, 0.228874f, 0.218946f, 0.208612f, 0.198629f, 0.190002f, 0.181465f, 0.169225f, 0.150296f, 0.124983f, 0.095177f, 0.061211f, + 0.021451f, -0.025424f, -0.078440f, -0.134573f, -0.190595f, -0.244573f, -0.295574f, -0.342341f, -0.383017f, -0.416353f, -0.442566f, -0.462633f, -0.476956f, -0.484792f, -0.484883f, -0.476795f, -0.461886f, -0.442644f, -0.420810f, -0.396369f, -0.368491f, -0.337007f, -0.302883f, -0.267801f, -0.233394f, -0.200316f, -0.167839f, -0.134651f, -0.100107f, -0.064503f, -0.028445f, 0.007706f, 0.044017f, 0.080865f, 0.118334f, 0.155669f, 0.191736f, 0.225992f, 0.258520f, 0.289333f, 0.318229f, 0.344969f, 0.368855f, 0.388566f, 0.403168f, 0.412970f, 0.418830f, 0.421249f, 0.420617f, 0.417464f, 0.411799f, 0.403018f, 0.391082f, 0.377094f, 0.362346f, 0.347502f, 0.332870f, 0.318542f, 0.303993f, 0.288174f, 0.270212f, 0.249812f, 0.227373f, 0.204002f, 0.180881f, 0.158425f, 0.136570f, 0.115633f, 0.095977f, 0.077237f, 0.059024f, 0.041966f, 0.026915f, 0.013775f, 0.002182f, -0.007580f, -0.015397f, -0.021975f, -0.027835f, -0.032904f, -0.037503f, -0.042152f, -0.046265f, -0.048885f, -0.050394f, -0.051562f, -0.051807f, -0.050532f, -0.048722f, -0.047061f, -0.044541f, -0.040961f, -0.037883f, -0.035465f, -0.032172f, -0.028676f, + -0.027034f, -0.025811f, -0.022482f, -0.019608f, -0.020221f, -0.019720f, -0.013487f, -0.008119f, -0.010233f, -0.010395f, 0.001311f, 0.010757f, -0.000943f, -0.017589f, -0.002503f, 0.044026f, 0.079204f, 0.078273f, 0.062973f, 0.057328f, 0.054722f, 0.047981f, 0.053572f, 0.079412f, 0.100675f, 0.095962f, 0.081490f, 0.082712f, 0.095429f, 0.100415f, 0.094405f, 0.081773f, 0.057784f, 0.027126f, 0.018211f, 0.048214f, 0.088778f, 0.097349f, 0.072951f, 0.051550f, 0.052834f, 0.062422f, 0.067011f, 0.076631f, 0.100316f, 0.119769f, 0.103439f, 0.041360f}, + {-0.008208f, -0.013688f, -0.006252f, -0.003509f, -0.000109f, 0.028292f, 0.061055f, 0.024138f, -0.104438f, -0.212259f, -0.151442f, 0.066373f, 0.240645f, 0.196077f, -0.011619f, -0.162771f, -0.129256f, 0.005131f, 0.087028f, 0.080806f, 0.064102f, 0.086674f, 0.110230f, 0.085283f, 0.023202f, -0.032808f, -0.069022f, -0.103127f, -0.145227f, -0.184194f, -0.205940f, -0.206303f, -0.187706f, -0.155585f, -0.118331f, -0.083351f, -0.052728f, -0.025564f, -0.002289f, 0.015831f, 0.028630f, 0.036097f, 0.037847f, 0.035268f, 0.032049f, 0.031340f, 0.033967f, 0.039715f, 0.048284f, 0.058597f, 0.068960f, 0.078321f, 0.086272f, 0.091981f, 0.094350f, 0.093104f, 0.088896f, 0.082572f, 0.074997f, 0.067252f, 0.060472f, 0.055558f, 0.053169f, 0.053701f, 0.057297f, 0.064029f, 0.073926f, 0.086744f, 0.102064f, 0.119670f, 0.139384f, 0.160516f, 0.181938f, 0.202628f, 0.221700f, 0.238171f, 0.251219f, 0.260419f, 0.265483f, 0.266392f, 0.264039f, 0.259842f, 0.254367f, 0.247216f, 0.238440f, 0.228874f, 0.218946f, 0.208612f, 0.198629f, 0.190002f, 0.181465f, 0.169225f, 0.150296f, 0.124983f, 0.095177f, 0.061211f, + 0.021451f, -0.025424f, -0.078440f, -0.134573f, -0.190595f, -0.244573f, -0.295574f, -0.342341f, -0.383017f, -0.416353f, -0.442566f, -0.462633f, -0.476956f, -0.484792f, -0.484883f, -0.476795f, -0.461886f, -0.442644f, -0.420810f, -0.396369f, -0.368491f, -0.337007f, -0.302883f, -0.267801f, -0.233394f, -0.200316f, -0.167839f, -0.134651f, -0.100107f, -0.064503f, -0.028445f, 0.007706f, 0.044017f, 0.080865f, 0.118334f, 0.155669f, 0.191736f, 0.225992f, 0.258520f, 0.289333f, 0.318229f, 0.344969f, 0.368855f, 0.388566f, 0.403168f, 0.412970f, 0.418830f, 0.421249f, 0.420617f, 0.417464f, 0.411799f, 0.403018f, 0.391082f, 0.377094f, 0.362346f, 0.347502f, 0.332870f, 0.318542f, 0.303993f, 0.288174f, 0.270212f, 0.249812f, 0.227373f, 0.204002f, 0.180881f, 0.158425f, 0.136570f, 0.115633f, 0.095977f, 0.077237f, 0.059024f, 0.041966f, 0.026915f, 0.013775f, 0.002182f, -0.007580f, -0.015397f, -0.021975f, -0.027835f, -0.032904f, -0.037503f, -0.042152f, -0.046265f, -0.048885f, -0.050394f, -0.051562f, -0.051807f, -0.050532f, -0.048722f, -0.047061f, -0.044541f, -0.040961f, -0.037883f, -0.035465f, -0.032172f, -0.028676f, + -0.027034f, -0.025811f, -0.022482f, -0.019608f, -0.020221f, -0.019720f, -0.013487f, -0.008119f, -0.010233f, -0.010395f, 0.001311f, 0.010757f, -0.000943f, -0.017589f, -0.002503f, 0.044026f, 0.079204f, 0.078273f, 0.062973f, 0.057328f, 0.054722f, 0.047981f, 0.053572f, 0.079412f, 0.100675f, 0.095962f, 0.081490f, 0.082712f, 0.095429f, 0.100415f, 0.094405f, 0.081773f, 0.057784f, 0.027126f, 0.018211f, 0.048214f, 0.088778f, 0.097349f, 0.072951f, 0.051550f, 0.052834f, 0.062422f, 0.067011f, 0.076631f, 0.100316f, 0.119769f, 0.103439f, 0.041360f} + }, + { + {0.000219f, 0.000300f, -0.000470f, -0.002728f, -0.006703f, -0.008428f, -0.000706f, 0.012589f, 0.007717f, -0.030161f, -0.063150f, -0.022389f, 0.092419f, 0.167025f, 0.089527f, -0.089858f, -0.186663f, -0.096473f, 0.078276f, 0.157986f, 0.092888f, -0.015711f, -0.064513f, -0.046259f, -0.006048f, 0.029868f, 0.057048f, 0.067711f, 0.054805f, 0.025907f, -0.004867f, -0.030693f, -0.050327f, -0.062834f, -0.070993f, -0.082208f, -0.100409f, -0.121588f, -0.139387f, -0.150407f, -0.153184f, -0.147055f, -0.133768f, -0.117152f, -0.100383f, -0.085266f, -0.073367f, -0.065601f, -0.061218f, -0.058786f, -0.057561f, -0.056982f, -0.055899f, -0.053334f, -0.049279f, -0.044299f, -0.039109f, -0.034702f, -0.031969f, -0.031001f, -0.031321f, -0.032558f, -0.034285f, -0.035576f, -0.035504f, -0.033868f, -0.030920f, -0.026684f, -0.021019f, -0.014048f, -0.006042f, 0.002921f, 0.012786f, 0.023091f, 0.033121f, 0.042601f, 0.051888f, 0.061215f, 0.070060f, 0.077878f, 0.085314f, 0.093797f, 0.103649f, 0.113550f, 0.122419f, 0.130931f, 0.140271f, 0.149926f, 0.157672f, 0.161652f, 0.161819f, 0.159329f, 0.155027f, 0.148727f, 0.139965f, 0.129315f, + 0.118619f, 0.109608f, 0.102489f, 0.096346f, 0.090816f, 0.087026f, 0.086861f, 0.091494f, 0.100455f, 0.111859f, 0.123631f, 0.134788f, 0.145673f, 0.157015f, 0.168875f, 0.180410f, 0.190453f, 0.198281f, 0.203996f, 0.208295f, 0.211928f, 0.215320f, 0.218485f, 0.221142f, 0.222973f, 0.223938f, 0.224257f, 0.223992f, 0.222832f, 0.220406f, 0.216624f, 0.211660f, 0.205873f, 0.199818f, 0.194086f, 0.189011f, 0.184682f, 0.181185f, 0.178623f, 0.176955f, 0.176031f, 0.175702f, 0.175731f, 0.175711f, 0.175153f, 0.173544f, 0.170305f, 0.164929f, 0.157174f, 0.146976f, 0.134373f, 0.119682f, 0.103470f, 0.086119f, 0.067710f, 0.048467f, 0.028881f, 0.009271f, -0.010260f, -0.029330f, -0.047315f, -0.063863f, -0.078855f, -0.091983f, -0.102963f, -0.111948f, -0.119186f, -0.124595f, -0.128116f, -0.130005f, -0.130481f, -0.129750f, -0.128536f, -0.127737f, -0.127523f, -0.127680f, -0.128531f, -0.130397f, -0.132664f, -0.134604f, -0.136451f, -0.138583f, -0.140708f, -0.142803f, -0.145415f, -0.148218f, -0.150086f, -0.150982f, -0.151526f, -0.150868f, -0.147786f, -0.143240f, -0.138700f, -0.133465f, -0.126931f, -0.120761f, + -0.115292f, -0.108172f, -0.099972f, -0.094325f, -0.089251f, -0.078635f, -0.065607f, -0.059298f, -0.054658f, -0.037602f, -0.015717f, -0.011967f, -0.016342f, 0.013157f, 0.076563f, 0.108377f, 0.069685f, 0.015195f, 0.011815f, 0.037173f, 0.033724f, 0.024026f, 0.075469f, 0.166990f, 0.196872f, 0.134676f, 0.067436f, 0.066393f, 0.096537f, 0.098834f, 0.080944f, 0.071627f, 0.053354f, 0.007270f, -0.023186f, 0.015389f, 0.096957f, 0.143102f, 0.126994f, 0.094569f, 0.086781f, 0.093942f, 0.095842f, 0.101364f, 0.124293f, 0.145641f, 0.126044f, 0.050604f}, + {0.000219f, 0.000300f, -0.000470f, -0.002728f, -0.006703f, -0.008428f, -0.000706f, 0.012589f, 0.007717f, -0.030161f, -0.063150f, -0.022389f, 0.092419f, 0.167025f, 0.089527f, -0.089858f, -0.186663f, -0.096473f, 0.078276f, 0.157986f, 0.092888f, -0.015711f, -0.064513f, -0.046259f, -0.006048f, 0.029868f, 0.057048f, 0.067711f, 0.054805f, 0.025907f, -0.004867f, -0.030693f, -0.050327f, -0.062834f, -0.070993f, -0.082208f, -0.100409f, -0.121588f, -0.139387f, -0.150407f, -0.153184f, -0.147055f, -0.133768f, -0.117152f, -0.100383f, -0.085266f, -0.073367f, -0.065601f, -0.061218f, -0.058786f, -0.057561f, -0.056982f, -0.055899f, -0.053334f, -0.049279f, -0.044299f, -0.039109f, -0.034702f, -0.031969f, -0.031001f, -0.031321f, -0.032558f, -0.034285f, -0.035576f, -0.035504f, -0.033868f, -0.030920f, -0.026684f, -0.021019f, -0.014048f, -0.006042f, 0.002921f, 0.012786f, 0.023091f, 0.033121f, 0.042601f, 0.051888f, 0.061215f, 0.070060f, 0.077878f, 0.085314f, 0.093797f, 0.103649f, 0.113550f, 0.122419f, 0.130931f, 0.140271f, 0.149926f, 0.157672f, 0.161652f, 0.161819f, 0.159329f, 0.155027f, 0.148727f, 0.139965f, 0.129315f, + 0.118619f, 0.109608f, 0.102489f, 0.096346f, 0.090816f, 0.087026f, 0.086861f, 0.091494f, 0.100455f, 0.111859f, 0.123631f, 0.134788f, 0.145673f, 0.157015f, 0.168875f, 0.180410f, 0.190453f, 0.198281f, 0.203996f, 0.208295f, 0.211928f, 0.215320f, 0.218485f, 0.221142f, 0.222973f, 0.223938f, 0.224257f, 0.223992f, 0.222832f, 0.220406f, 0.216624f, 0.211660f, 0.205873f, 0.199818f, 0.194086f, 0.189011f, 0.184682f, 0.181185f, 0.178623f, 0.176955f, 0.176031f, 0.175702f, 0.175731f, 0.175711f, 0.175153f, 0.173544f, 0.170305f, 0.164929f, 0.157174f, 0.146976f, 0.134373f, 0.119682f, 0.103470f, 0.086119f, 0.067710f, 0.048467f, 0.028881f, 0.009271f, -0.010260f, -0.029330f, -0.047315f, -0.063863f, -0.078855f, -0.091983f, -0.102963f, -0.111948f, -0.119186f, -0.124595f, -0.128116f, -0.130005f, -0.130481f, -0.129750f, -0.128536f, -0.127737f, -0.127523f, -0.127680f, -0.128531f, -0.130397f, -0.132664f, -0.134604f, -0.136451f, -0.138583f, -0.140708f, -0.142803f, -0.145415f, -0.148218f, -0.150086f, -0.150982f, -0.151526f, -0.150868f, -0.147786f, -0.143240f, -0.138700f, -0.133465f, -0.126931f, -0.120761f, + -0.115292f, -0.108172f, -0.099972f, -0.094325f, -0.089251f, -0.078635f, -0.065607f, -0.059298f, -0.054658f, -0.037602f, -0.015717f, -0.011967f, -0.016342f, 0.013157f, 0.076563f, 0.108377f, 0.069685f, 0.015195f, 0.011815f, 0.037173f, 0.033724f, 0.024026f, 0.075469f, 0.166990f, 0.196872f, 0.134676f, 0.067436f, 0.066393f, 0.096537f, 0.098834f, 0.080944f, 0.071627f, 0.053354f, 0.007270f, -0.023186f, 0.015389f, 0.096957f, 0.143102f, 0.126994f, 0.094569f, 0.086781f, 0.093942f, 0.095842f, 0.101364f, 0.124293f, 0.145641f, 0.126044f, 0.050604f} + } +}; +const float *CRendBin_HOA3_HRIR_coeff_diffuse_re_48kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const float *CRendBin_HOA3_HRIR_coeff_diffuse_im_48kHz[BINAURAL_CHANNELS]={NULL,NULL}; + +/* Sample Rate = 32000 */ + +const int16_t CRendBin_HOA3_HRIR_max_num_iterations_32kHz = 1; +const uint16_t CRendBin_HOA3_HRIR_num_iterations_32kHz[16][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1} }; +const uint16_t CRendBin_HOA3_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS] = {0, 0}; +const uint16_t CRendBin_HOA3_HRIR_pIndex_frequency_max_32kHz[16][BINAURAL_CHANNELS][1]={{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}}}; +const uint16_t CRendBin_HOA3_HRIR_index_frequency_max_diffuse_32kHz = 0; +const float CRendBin_HOA3_HRIR_inv_diffuse_weight_32kHz[16]={0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f}; +const uint16_t *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const float CRendBin_HOA3_HRIR_coeff_re_32kHz[16][BINAURAL_CHANNELS][160]={ + { + {0.931532f, 0.779586f, 0.534806f, 0.267486f, 0.027500f, -0.161171f, -0.309658f, -0.450275f, -0.580679f, -0.647362f, -0.612734f, -0.489723f, -0.275668f, 0.054919f, 0.402480f, 0.495609f, 0.176032f, -0.298719f, -0.442377f, -0.084625f, 0.429064f, 0.650237f, 0.490213f, 0.176336f, -0.101893f, -0.334041f, -0.548421f, -0.712689f, -0.798336f, -0.833235f, -0.851109f, -0.849315f, -0.819587f, -0.775679f, -0.732168f, -0.686769f, -0.635729f, -0.584686f, -0.537641f, -0.491741f, -0.445951f, -0.402650f, -0.360980f, -0.318308f, -0.276103f, -0.236981f, -0.199525f, -0.161814f, -0.125607f, -0.092516f, -0.060704f, -0.028744f, 0.001865f, 0.030189f, 0.057418f, 0.083709f, 0.107616f, 0.129141f, 0.149647f, 0.169072f, 0.186505f, 0.202619f, 0.218604f, 0.233964f, 0.247817f, 0.260837f, 0.273890f, 0.286455f, 0.298003f, 0.309223f, 0.320684f, 0.331955f, 0.342805f, 0.353754f, 0.365034f, 0.376301f, 0.387457f, 0.398686f, 0.409965f, 0.421281f, 0.432717f, 0.443847f, 0.453997f, 0.463372f, 0.472714f, 0.481764f, 0.489489f, 0.495891f, 0.502022f, 0.508134f, 0.513263f, 0.516755f, 0.518993f, 0.520614f, 0.521907f, 0.522857f, + 0.523146f, 0.522523f, 0.521573f, 0.521473f, 0.522622f, 0.524278f, 0.525810f, 0.527544f, 0.530160f, 0.534008f, 0.539089f, 0.545026f, 0.551103f, 0.556966f, 0.563115f, 0.570181f, 0.578053f, 0.586133f, 0.593998f, 0.601393f, 0.608145f, 0.614471f, 0.620875f, 0.627436f, 0.633702f, 0.639394f, 0.644645f, 0.649553f, 0.654100f, 0.658455f, 0.662756f, 0.666713f, 0.669967f, 0.672628f, 0.675002f, 0.677150f, 0.679153f, 0.681355f, 0.683893f, 0.686498f, 0.689096f, 0.692014f, 0.695373f, 0.699038f, 0.703324f, 0.708802f, 0.715349f, 0.722435f, 0.730226f, 0.739134f, 0.748704f, 0.758497f, 0.769323f, 0.781691f, 0.794631f, 0.808625f, 0.825667f, 0.839224f, 0.827293f, 0.769028f, 0.673613f, 0.581351f, 0.526749f, 0.508903f}, + {0.931532f, 0.779586f, 0.534806f, 0.267486f, 0.027500f, -0.161171f, -0.309658f, -0.450275f, -0.580679f, -0.647362f, -0.612734f, -0.489723f, -0.275668f, 0.054919f, 0.402480f, 0.495609f, 0.176032f, -0.298719f, -0.442377f, -0.084625f, 0.429064f, 0.650237f, 0.490213f, 0.176336f, -0.101893f, -0.334041f, -0.548421f, -0.712689f, -0.798336f, -0.833235f, -0.851109f, -0.849315f, -0.819587f, -0.775679f, -0.732168f, -0.686769f, -0.635729f, -0.584686f, -0.537641f, -0.491741f, -0.445951f, -0.402650f, -0.360980f, -0.318308f, -0.276103f, -0.236981f, -0.199525f, -0.161814f, -0.125607f, -0.092516f, -0.060704f, -0.028744f, 0.001865f, 0.030189f, 0.057418f, 0.083709f, 0.107616f, 0.129141f, 0.149647f, 0.169072f, 0.186505f, 0.202619f, 0.218604f, 0.233964f, 0.247817f, 0.260837f, 0.273890f, 0.286455f, 0.298003f, 0.309223f, 0.320684f, 0.331955f, 0.342805f, 0.353754f, 0.365034f, 0.376301f, 0.387457f, 0.398686f, 0.409965f, 0.421281f, 0.432717f, 0.443847f, 0.453997f, 0.463372f, 0.472714f, 0.481764f, 0.489489f, 0.495891f, 0.502022f, 0.508134f, 0.513263f, 0.516755f, 0.518993f, 0.520614f, 0.521907f, 0.522857f, + 0.523146f, 0.522523f, 0.521573f, 0.521473f, 0.522622f, 0.524278f, 0.525810f, 0.527544f, 0.530160f, 0.534008f, 0.539089f, 0.545026f, 0.551103f, 0.556966f, 0.563115f, 0.570181f, 0.578053f, 0.586133f, 0.593998f, 0.601393f, 0.608145f, 0.614471f, 0.620875f, 0.627436f, 0.633702f, 0.639394f, 0.644645f, 0.649553f, 0.654100f, 0.658455f, 0.662756f, 0.666713f, 0.669967f, 0.672628f, 0.675002f, 0.677150f, 0.679153f, 0.681355f, 0.683893f, 0.686498f, 0.689096f, 0.692014f, 0.695373f, 0.699038f, 0.703324f, 0.708802f, 0.715349f, 0.722435f, 0.730226f, 0.739134f, 0.748704f, 0.758497f, 0.769323f, 0.781691f, 0.794631f, 0.808625f, 0.825667f, 0.839224f, 0.827293f, 0.769028f, 0.673613f, 0.581351f, 0.526749f, 0.508903f} + }, + { + {0.025824f, 0.254482f, 0.612140f, 0.908281f, 0.966338f, 0.746349f, 0.326804f, -0.189774f, -0.683810f, -1.011094f, -1.110601f, -1.050792f, -0.841050f, -0.331373f, 0.453002f, 0.990359f, 0.684451f, -0.303752f, -1.023046f, -0.756945f, 0.181886f, 0.916524f, 1.017605f, 0.742230f, 0.451730f, 0.204139f, -0.066098f, -0.311503f, -0.457293f, -0.536699f, -0.617322f, -0.694602f, -0.735639f, -0.751680f, -0.768963f, -0.782765f, -0.780489f, -0.769523f, -0.757459f, -0.737198f, -0.705559f, -0.670342f, -0.633558f, -0.589942f, -0.541742f, -0.495987f, -0.451106f, -0.402147f, -0.352739f, -0.308813f, -0.268274f, -0.227132f, -0.187240f, -0.150381f, -0.113561f, -0.075466f, -0.039106f, -0.005245f, 0.028554f, 0.061642f, 0.090951f, 0.117114f, 0.142717f, 0.166563f, 0.186151f, 0.202842f, 0.218927f, 0.233139f, 0.243777f, 0.252381f, 0.260617f, 0.267492f, 0.272370f, 0.276920f, 0.282318f, 0.288000f, 0.293924f, 0.300949f, 0.309137f, 0.318235f, 0.328763f, 0.340586f, 0.352257f, 0.363455f, 0.375587f, 0.388768f, 0.401116f, 0.411976f, 0.422808f, 0.434307f, 0.445690f, 0.457064f, 0.469628f, 0.483664f, 0.498780f, 0.515481f, + 0.534276f, 0.554263f, 0.574434f, 0.595002f, 0.615889f, 0.635594f, 0.652882f, 0.667922f, 0.680882f, 0.691118f, 0.698246f, 0.702348f, 0.703094f, 0.700394f, 0.695668f, 0.690852f, 0.686570f, 0.682549f, 0.678880f, 0.675687f, 0.672709f, 0.670365f, 0.669993f, 0.672124f, 0.675718f, 0.679580f, 0.683205f, 0.686101f, 0.687934f, 0.689429f, 0.691608f, 0.694284f, 0.696649f, 0.698823f, 0.701383f, 0.704096f, 0.706544f, 0.709152f, 0.712317f, 0.715522f, 0.718443f, 0.721714f, 0.725654f, 0.729661f, 0.733628f, 0.738335f, 0.743905f, 0.749740f, 0.756281f, 0.764683f, 0.774778f, 0.785838f, 0.798756f, 0.814520f, 0.832066f, 0.851590f, 0.875921f, 0.899332f, 0.897448f, 0.844156f, 0.745650f, 0.645128f, 0.582813f, 0.561026f}, + {-0.025824f, -0.254482f, -0.612140f, -0.908281f, -0.966338f, -0.746349f, -0.326804f, 0.189774f, 0.683810f, 1.011094f, 1.110601f, 1.050792f, 0.841050f, 0.331373f, -0.453002f, -0.990359f, -0.684451f, 0.303752f, 1.023046f, 0.756945f, -0.181886f, -0.916524f, -1.017605f, -0.742230f, -0.451730f, -0.204139f, 0.066098f, 0.311503f, 0.457293f, 0.536699f, 0.617322f, 0.694602f, 0.735639f, 0.751680f, 0.768963f, 0.782765f, 0.780489f, 0.769523f, 0.757459f, 0.737198f, 0.705559f, 0.670342f, 0.633558f, 0.589942f, 0.541742f, 0.495987f, 0.451106f, 0.402147f, 0.352739f, 0.308813f, 0.268274f, 0.227132f, 0.187240f, 0.150381f, 0.113561f, 0.075466f, 0.039106f, 0.005245f, -0.028554f, -0.061642f, -0.090951f, -0.117114f, -0.142717f, -0.166563f, -0.186151f, -0.202842f, -0.218927f, -0.233139f, -0.243777f, -0.252381f, -0.260617f, -0.267492f, -0.272370f, -0.276920f, -0.282318f, -0.288000f, -0.293924f, -0.300949f, -0.309137f, -0.318235f, -0.328763f, -0.340586f, -0.352257f, -0.363455f, -0.375587f, -0.388768f, -0.401116f, -0.411976f, -0.422808f, -0.434307f, -0.445690f, -0.457064f, -0.469628f, -0.483664f, -0.498780f, -0.515481f, + -0.534276f, -0.554263f, -0.574434f, -0.595002f, -0.615889f, -0.635594f, -0.652882f, -0.667922f, -0.680882f, -0.691118f, -0.698246f, -0.702348f, -0.703094f, -0.700394f, -0.695668f, -0.690852f, -0.686570f, -0.682549f, -0.678880f, -0.675687f, -0.672709f, -0.670365f, -0.669993f, -0.672124f, -0.675718f, -0.679580f, -0.683205f, -0.686101f, -0.687934f, -0.689429f, -0.691608f, -0.694284f, -0.696649f, -0.698823f, -0.701383f, -0.704096f, -0.706544f, -0.709152f, -0.712317f, -0.715522f, -0.718443f, -0.721714f, -0.725654f, -0.729661f, -0.733628f, -0.738335f, -0.743905f, -0.749740f, -0.756281f, -0.764683f, -0.774778f, -0.785838f, -0.798756f, -0.814520f, -0.832066f, -0.851590f, -0.875921f, -0.899332f, -0.897448f, -0.844156f, -0.745650f, -0.645128f, -0.582813f, -0.561026f} + }, + { + {0.119957f, 0.117962f, 0.069212f, -0.029675f, -0.108741f, -0.102118f, -0.023931f, 0.056050f, 0.088085f, 0.070763f, 0.023879f, -0.033299f, -0.074494f, -0.065471f, 0.002786f, 0.081205f, 0.092077f, 0.015549f, -0.067599f, -0.053344f, 0.064674f, 0.183481f, 0.206152f, 0.135803f, 0.042639f, -0.024752f, -0.066208f, -0.094901f, -0.114472f, -0.127164f, -0.137723f, -0.145267f, -0.144666f, -0.136342f, -0.126255f, -0.118741f, -0.116220f, -0.122116f, -0.137393f, -0.157052f, -0.174865f, -0.189037f, -0.200404f, -0.208724f, -0.213653f, -0.216386f, -0.217918f, -0.217629f, -0.214601f, -0.208243f, -0.197216f, -0.179855f, -0.155904f, -0.126242f, -0.091188f, -0.050638f, -0.005448f, 0.042864f, 0.093516f, 0.146388f, 0.200914f, 0.256043f, 0.311008f, 0.365277f, 0.417798f, 0.466855f, 0.510693f, 0.547948f, 0.577466f, 0.598067f, 0.608767f, 0.609124f, 0.599179f, 0.579326f, 0.550670f, 0.515166f, 0.474707f, 0.430356f, 0.383305f, 0.336114f, 0.291535f, 0.250182f, 0.211022f, 0.174404f, 0.142783f, 0.117629f, 0.097265f, 0.079103f, 0.063058f, 0.051346f, 0.045393f, 0.044197f, 0.045733f, 0.048982f, 0.054235f, 0.062014f, + 0.072137f, 0.083617f, 0.095036f, 0.105002f, 0.112583f, 0.117569f, 0.120284f, 0.120922f, 0.118935f, 0.113194f, 0.102993f, 0.088978f, 0.072927f, 0.056475f, 0.040135f, 0.023595f, 0.006691f, -0.010161f, -0.026205f, -0.040628f, -0.052638f, -0.061602f, -0.067163f, -0.069194f, -0.067764f, -0.063204f, -0.056002f, -0.046549f, -0.035172f, -0.022453f, -0.009246f, 0.003678f, 0.015836f, 0.026957f, 0.036871f, 0.045370f, 0.052074f, 0.056677f, 0.059467f, 0.061374f, 0.063445f, 0.066522f, 0.071251f, 0.077736f, 0.085143f, 0.092280f, 0.098682f, 0.104606f, 0.110061f, 0.114592f, 0.117985f, 0.120397f, 0.121682f, 0.121377f, 0.119567f, 0.116933f, 0.113144f, 0.105492f, 0.090436f, 0.067892f, 0.043890f, 0.027049f, 0.020974f, 0.021165f}, + {0.119957f, 0.117962f, 0.069212f, -0.029675f, -0.108741f, -0.102118f, -0.023931f, 0.056050f, 0.088085f, 0.070763f, 0.023879f, -0.033299f, -0.074494f, -0.065471f, 0.002786f, 0.081205f, 0.092077f, 0.015549f, -0.067599f, -0.053344f, 0.064674f, 0.183481f, 0.206152f, 0.135803f, 0.042639f, -0.024752f, -0.066208f, -0.094901f, -0.114472f, -0.127164f, -0.137723f, -0.145267f, -0.144666f, -0.136342f, -0.126255f, -0.118741f, -0.116220f, -0.122116f, -0.137393f, -0.157052f, -0.174865f, -0.189037f, -0.200404f, -0.208724f, -0.213653f, -0.216386f, -0.217918f, -0.217629f, -0.214601f, -0.208243f, -0.197216f, -0.179855f, -0.155904f, -0.126242f, -0.091188f, -0.050638f, -0.005448f, 0.042864f, 0.093516f, 0.146388f, 0.200914f, 0.256043f, 0.311008f, 0.365277f, 0.417798f, 0.466855f, 0.510693f, 0.547948f, 0.577466f, 0.598067f, 0.608767f, 0.609124f, 0.599179f, 0.579326f, 0.550670f, 0.515166f, 0.474707f, 0.430356f, 0.383305f, 0.336114f, 0.291535f, 0.250182f, 0.211022f, 0.174404f, 0.142783f, 0.117629f, 0.097265f, 0.079103f, 0.063058f, 0.051346f, 0.045393f, 0.044197f, 0.045733f, 0.048982f, 0.054235f, 0.062014f, + 0.072137f, 0.083617f, 0.095036f, 0.105002f, 0.112583f, 0.117569f, 0.120284f, 0.120922f, 0.118935f, 0.113194f, 0.102993f, 0.088978f, 0.072927f, 0.056475f, 0.040135f, 0.023595f, 0.006691f, -0.010161f, -0.026205f, -0.040628f, -0.052638f, -0.061602f, -0.067163f, -0.069194f, -0.067764f, -0.063204f, -0.056002f, -0.046549f, -0.035172f, -0.022453f, -0.009246f, 0.003678f, 0.015836f, 0.026957f, 0.036871f, 0.045370f, 0.052074f, 0.056677f, 0.059467f, 0.061374f, 0.063445f, 0.066522f, 0.071251f, 0.077736f, 0.085143f, 0.092280f, 0.098682f, 0.104606f, 0.110061f, 0.114592f, 0.117985f, 0.120397f, 0.121682f, 0.121377f, 0.119567f, 0.116933f, 0.113144f, 0.105492f, 0.090436f, 0.067892f, 0.043890f, 0.027049f, 0.020974f, 0.021165f} + }, + { + {0.021954f, 0.048037f, 0.063092f, 0.031017f, -0.037723f, -0.084868f, -0.065201f, -0.005112f, 0.022895f, -0.015083f, -0.084921f, -0.142665f, -0.175582f, -0.165991f, -0.077530f, 0.064116f, 0.128907f, 0.015662f, -0.183455f, -0.248246f, -0.082450f, 0.177565f, 0.335035f, 0.337341f, 0.262762f, 0.175451f, 0.072571f, -0.054887f, -0.185560f, -0.298815f, -0.396893f, -0.485261f, -0.557320f, -0.605394f, -0.629649f, -0.632272f, -0.614250f, -0.579369f, -0.533822f, -0.482010f, -0.426968f, -0.372237f, -0.319708f, -0.268539f, -0.218575f, -0.171634f, -0.128178f, -0.086363f, -0.045502f, -0.007338f, 0.026484f, 0.055319f, 0.078139f, 0.094220f, 0.105266f, 0.114621f, 0.124529f, 0.135582f, 0.147984f, 0.161659f, 0.175672f, 0.188906f, 0.201046f, 0.212265f, 0.222531f, 0.231889f, 0.240937f, 0.250378f, 0.260180f, 0.269567f, 0.277872f, 0.285061f, 0.291048f, 0.294821f, 0.295039f, 0.291430f, 0.284567f, 0.274225f, 0.259431f, 0.240476f, 0.219205f, 0.196639f, 0.172071f, 0.145449f, 0.118875f, 0.094409f, 0.071829f, 0.049916f, 0.028662f, 0.008634f, -0.010832f, -0.031148f, -0.052563f, -0.074059f, -0.094995f, -0.115796f, + -0.136840f, -0.157354f, -0.175731f, -0.190760f, -0.202356f, -0.211001f, -0.216517f, -0.217735f, -0.213675f, -0.204779f, -0.192568f, -0.178136f, -0.161391f, -0.141749f, -0.119310f, -0.095356f, -0.071835f, -0.050142f, -0.030092f, -0.010201f, 0.010750f, 0.032456f, 0.053367f, 0.071957f, 0.087636f, 0.100966f, 0.113346f, 0.126179f, 0.139929f, 0.154026f, 0.167726f, 0.180816f, 0.193572f, 0.206537f, 0.220447f, 0.235905f, 0.252915f, 0.270947f, 0.289388f, 0.307739f, 0.325599f, 0.342846f, 0.359653f, 0.376064f, 0.391737f, 0.406191f, 0.418988f, 0.429712f, 0.438219f, 0.444820f, 0.449911f, 0.453835f, 0.457284f, 0.461020f, 0.465212f, 0.470429f, 0.478257f, 0.486742f, 0.485064f, 0.459936f, 0.412181f, 0.361516f, 0.328482f, 0.316016f}, + {0.021954f, 0.048037f, 0.063092f, 0.031017f, -0.037723f, -0.084868f, -0.065201f, -0.005112f, 0.022895f, -0.015083f, -0.084921f, -0.142665f, -0.175582f, -0.165991f, -0.077530f, 0.064116f, 0.128907f, 0.015662f, -0.183455f, -0.248246f, -0.082450f, 0.177565f, 0.335035f, 0.337341f, 0.262762f, 0.175451f, 0.072571f, -0.054887f, -0.185560f, -0.298815f, -0.396893f, -0.485261f, -0.557320f, -0.605394f, -0.629649f, -0.632272f, -0.614250f, -0.579369f, -0.533822f, -0.482010f, -0.426968f, -0.372237f, -0.319708f, -0.268539f, -0.218575f, -0.171634f, -0.128178f, -0.086363f, -0.045502f, -0.007338f, 0.026484f, 0.055319f, 0.078139f, 0.094220f, 0.105266f, 0.114621f, 0.124529f, 0.135582f, 0.147984f, 0.161659f, 0.175672f, 0.188906f, 0.201046f, 0.212265f, 0.222531f, 0.231889f, 0.240937f, 0.250378f, 0.260180f, 0.269567f, 0.277872f, 0.285061f, 0.291048f, 0.294821f, 0.295039f, 0.291430f, 0.284567f, 0.274225f, 0.259431f, 0.240476f, 0.219205f, 0.196639f, 0.172071f, 0.145449f, 0.118875f, 0.094409f, 0.071829f, 0.049916f, 0.028662f, 0.008634f, -0.010832f, -0.031148f, -0.052563f, -0.074059f, -0.094995f, -0.115796f, + -0.136840f, -0.157354f, -0.175731f, -0.190760f, -0.202356f, -0.211001f, -0.216517f, -0.217735f, -0.213675f, -0.204779f, -0.192568f, -0.178136f, -0.161391f, -0.141749f, -0.119310f, -0.095356f, -0.071835f, -0.050142f, -0.030092f, -0.010201f, 0.010750f, 0.032456f, 0.053367f, 0.071957f, 0.087636f, 0.100966f, 0.113346f, 0.126179f, 0.139929f, 0.154026f, 0.167726f, 0.180816f, 0.193572f, 0.206537f, 0.220447f, 0.235905f, 0.252915f, 0.270947f, 0.289388f, 0.307739f, 0.325599f, 0.342846f, 0.359653f, 0.376064f, 0.391737f, 0.406191f, 0.418988f, 0.429712f, 0.438219f, 0.444820f, 0.449911f, 0.453835f, 0.457284f, 0.461020f, 0.465212f, 0.470429f, 0.478257f, 0.486742f, 0.485064f, 0.459936f, 0.412181f, 0.361516f, 0.328482f, 0.316016f} + }, + { + {-0.007503f, -0.018071f, -0.022034f, -0.007019f, 0.015663f, 0.024279f, 0.019856f, 0.028228f, 0.059265f, 0.080034f, 0.041688f, -0.071985f, -0.216288f, -0.290455f, -0.199084f, 0.033503f, 0.219776f, 0.164507f, -0.103621f, -0.326326f, -0.288993f, -0.041795f, 0.199504f, 0.304980f, 0.304814f, 0.264038f, 0.192066f, 0.083050f, -0.037289f, -0.139466f, -0.222831f, -0.297054f, -0.358635f, -0.401608f, -0.430419f, -0.449077f, -0.451590f, -0.432074f, -0.394694f, -0.348591f, -0.300496f, -0.254823f, -0.214532f, -0.179585f, -0.148147f, -0.119436f, -0.093021f, -0.067108f, -0.040394f, -0.014078f, 0.010038f, 0.031708f, 0.051075f, 0.067427f, 0.080619f, 0.092054f, 0.103201f, 0.114496f, 0.126191f, 0.138824f, 0.152470f, 0.166746f, 0.181664f, 0.197385f, 0.213306f, 0.228573f, 0.243329f, 0.258289f, 0.273266f, 0.287270f, 0.300006f, 0.312023f, 0.323208f, 0.332273f, 0.338187f, 0.341130f, 0.341345f, 0.337872f, 0.329576f, 0.317081f, 0.302379f, 0.286336f, 0.267902f, 0.246477f, 0.223744f, 0.201743f, 0.179892f, 0.155773f, 0.128766f, 0.101142f, 0.075145f, 0.050682f, 0.026716f, 0.003617f, -0.017003f, -0.034092f, + -0.047931f, -0.059456f, -0.069308f, -0.077317f, -0.082784f, -0.085477f, -0.086182f, -0.086000f, -0.085634f, -0.085723f, -0.087061f, -0.089692f, -0.092489f, -0.094395f, -0.095590f, -0.096974f, -0.099214f, -0.102553f, -0.106591f, -0.109940f, -0.111114f, -0.110117f, -0.108385f, -0.107202f, -0.106996f, -0.107734f, -0.108885f, -0.109325f, -0.108294f, -0.106062f, -0.102988f, -0.098685f, -0.092663f, -0.084794f, -0.074707f, -0.061933f, -0.047004f, -0.031245f, -0.015438f, 0.000083f, 0.014483f, 0.027034f, 0.038033f, 0.047706f, 0.055152f, 0.059661f, 0.061803f, 0.062109f, 0.060454f, 0.057667f, 0.055600f, 0.054965f, 0.055463f, 0.057980f, 0.063846f, 0.072975f, 0.086512f, 0.108858f, 0.140638f, 0.171127f, 0.185558f, 0.180720f, 0.167370f, 0.157904f}, + {0.007503f, 0.018071f, 0.022034f, 0.007019f, -0.015663f, -0.024279f, -0.019856f, -0.028228f, -0.059265f, -0.080034f, -0.041688f, 0.071985f, 0.216288f, 0.290455f, 0.199084f, -0.033503f, -0.219776f, -0.164507f, 0.103621f, 0.326326f, 0.288993f, 0.041795f, -0.199504f, -0.304980f, -0.304814f, -0.264038f, -0.192066f, -0.083050f, 0.037289f, 0.139466f, 0.222831f, 0.297054f, 0.358635f, 0.401608f, 0.430419f, 0.449077f, 0.451590f, 0.432074f, 0.394694f, 0.348591f, 0.300496f, 0.254823f, 0.214532f, 0.179585f, 0.148147f, 0.119436f, 0.093021f, 0.067108f, 0.040394f, 0.014078f, -0.010038f, -0.031708f, -0.051075f, -0.067427f, -0.080619f, -0.092054f, -0.103201f, -0.114496f, -0.126191f, -0.138824f, -0.152470f, -0.166746f, -0.181664f, -0.197385f, -0.213306f, -0.228573f, -0.243329f, -0.258289f, -0.273266f, -0.287270f, -0.300006f, -0.312023f, -0.323208f, -0.332273f, -0.338187f, -0.341130f, -0.341345f, -0.337872f, -0.329576f, -0.317081f, -0.302379f, -0.286336f, -0.267902f, -0.246477f, -0.223744f, -0.201743f, -0.179892f, -0.155773f, -0.128766f, -0.101142f, -0.075145f, -0.050682f, -0.026716f, -0.003617f, 0.017003f, 0.034092f, + 0.047931f, 0.059456f, 0.069308f, 0.077317f, 0.082784f, 0.085477f, 0.086182f, 0.086000f, 0.085634f, 0.085723f, 0.087061f, 0.089692f, 0.092489f, 0.094395f, 0.095590f, 0.096974f, 0.099214f, 0.102553f, 0.106591f, 0.109940f, 0.111114f, 0.110117f, 0.108385f, 0.107202f, 0.106996f, 0.107734f, 0.108885f, 0.109325f, 0.108294f, 0.106062f, 0.102988f, 0.098685f, 0.092663f, 0.084794f, 0.074707f, 0.061933f, 0.047004f, 0.031245f, 0.015438f, -0.000083f, -0.014483f, -0.027034f, -0.038033f, -0.047706f, -0.055152f, -0.059661f, -0.061803f, -0.062109f, -0.060454f, -0.057667f, -0.055600f, -0.054965f, -0.055463f, -0.057980f, -0.063846f, -0.072975f, -0.086512f, -0.108858f, -0.140638f, -0.171127f, -0.185558f, -0.180720f, -0.167370f, -0.157904f} + }, + { + {0.033462f, -0.011452f, -0.017620f, 0.032435f, 0.045854f, -0.028637f, -0.090702f, -0.014859f, 0.157822f, 0.248642f, 0.155687f, -0.038140f, -0.175256f, -0.171621f, -0.049992f, 0.096608f, 0.151735f, 0.059734f, -0.096679f, -0.157632f, -0.062095f, 0.083857f, 0.144231f, 0.103916f, 0.042535f, 0.012755f, 0.005878f, 0.008085f, 0.027262f, 0.065497f, 0.106896f, 0.138036f, 0.157486f, 0.165566f, 0.161837f, 0.150604f, 0.136230f, 0.115874f, 0.085377f, 0.047978f, 0.010903f, -0.021750f, -0.048159f, -0.066253f, -0.076374f, -0.082524f, -0.088309f, -0.094475f, -0.100881f, -0.107392f, -0.112694f, -0.115260f, -0.115292f, -0.113369f, -0.108048f, -0.096922f, -0.079156f, -0.055336f, -0.025908f, 0.008746f, 0.047468f, 0.088692f, 0.131249f, 0.174377f, 0.217290f, 0.258854f, 0.297502f, 0.331588f, 0.359765f, 0.380676f, 0.392592f, 0.393999f, 0.384351f, 0.363891f, 0.333348f, 0.294223f, 0.248522f, 0.197787f, 0.143366f, 0.087648f, 0.033362f, -0.018763f, -0.069801f, -0.119555f, -0.165608f, -0.206270f, -0.242567f, -0.276200f, -0.307129f, -0.334420f, -0.358104f, -0.378747f, -0.395911f, -0.408313f, -0.415200f, -0.416578f, + -0.412241f, -0.401426f, -0.383736f, -0.359890f, -0.331149f, -0.298118f, -0.260569f, -0.218772f, -0.174893f, -0.132630f, -0.094946f, -0.062032f, -0.031764f, -0.002387f, 0.025391f, 0.049012f, 0.066448f, 0.077765f, 0.084806f, 0.089808f, 0.094109f, 0.097653f, 0.099678f, 0.099974f, 0.099364f, 0.099047f, 0.099882f, 0.102244f, 0.105972f, 0.110354f, 0.114607f, 0.118404f, 0.121573f, 0.123531f, 0.123564f, 0.121439f, 0.117280f, 0.111181f, 0.103433f, 0.094690f, 0.085509f, 0.076144f, 0.066975f, 0.058481f, 0.050601f, 0.042886f, 0.035360f, 0.028387f, 0.021756f, 0.014870f, 0.007725f, 0.000696f, -0.006360f, -0.013704f, -0.020901f, -0.027694f, -0.035063f, -0.043655f, -0.051368f, -0.054456f, -0.051542f, -0.045299f, -0.039709f, -0.036841f}, + {-0.033462f, 0.011452f, 0.017620f, -0.032435f, -0.045854f, 0.028637f, 0.090702f, 0.014859f, -0.157822f, -0.248642f, -0.155687f, 0.038140f, 0.175256f, 0.171621f, 0.049992f, -0.096608f, -0.151735f, -0.059734f, 0.096679f, 0.157632f, 0.062095f, -0.083857f, -0.144231f, -0.103916f, -0.042535f, -0.012755f, -0.005878f, -0.008085f, -0.027262f, -0.065497f, -0.106896f, -0.138036f, -0.157486f, -0.165566f, -0.161837f, -0.150604f, -0.136230f, -0.115874f, -0.085377f, -0.047978f, -0.010903f, 0.021750f, 0.048159f, 0.066253f, 0.076374f, 0.082524f, 0.088309f, 0.094475f, 0.100881f, 0.107392f, 0.112694f, 0.115260f, 0.115292f, 0.113369f, 0.108048f, 0.096922f, 0.079156f, 0.055336f, 0.025908f, -0.008746f, -0.047468f, -0.088692f, -0.131249f, -0.174377f, -0.217290f, -0.258854f, -0.297502f, -0.331588f, -0.359765f, -0.380676f, -0.392592f, -0.393999f, -0.384351f, -0.363891f, -0.333348f, -0.294223f, -0.248522f, -0.197787f, -0.143366f, -0.087648f, -0.033362f, 0.018763f, 0.069801f, 0.119555f, 0.165608f, 0.206270f, 0.242567f, 0.276200f, 0.307129f, 0.334420f, 0.358104f, 0.378747f, 0.395911f, 0.408313f, 0.415200f, 0.416578f, + 0.412241f, 0.401426f, 0.383736f, 0.359890f, 0.331149f, 0.298118f, 0.260569f, 0.218772f, 0.174893f, 0.132630f, 0.094946f, 0.062032f, 0.031764f, 0.002387f, -0.025391f, -0.049012f, -0.066448f, -0.077765f, -0.084806f, -0.089808f, -0.094109f, -0.097653f, -0.099678f, -0.099974f, -0.099364f, -0.099047f, -0.099882f, -0.102244f, -0.105972f, -0.110354f, -0.114607f, -0.118404f, -0.121573f, -0.123531f, -0.123564f, -0.121439f, -0.117280f, -0.111181f, -0.103433f, -0.094690f, -0.085509f, -0.076144f, -0.066975f, -0.058481f, -0.050601f, -0.042886f, -0.035360f, -0.028387f, -0.021756f, -0.014870f, -0.007725f, -0.000696f, 0.006360f, 0.013704f, 0.020901f, 0.027694f, 0.035063f, 0.043655f, 0.051368f, 0.054456f, 0.051542f, 0.045299f, 0.039709f, 0.036841f} + }, + { + {0.007632f, 0.022548f, 0.018442f, -0.012511f, -0.038820f, -0.048924f, -0.077495f, -0.144911f, -0.206158f, -0.190155f, -0.062376f, 0.162240f, 0.406347f, 0.505256f, 0.303545f, -0.122289f, -0.422346f, -0.308428f, 0.092789f, 0.368487f, 0.299142f, 0.056978f, -0.090390f, -0.095371f, -0.067860f, -0.051927f, -0.006294f, 0.067628f, 0.110810f, 0.102017f, 0.079345f, 0.072300f, 0.074025f, 0.076311f, 0.084642f, 0.098477f, 0.108362f, 0.112197f, 0.115201f, 0.118268f, 0.119098f, 0.118162f, 0.115112f, 0.106864f, 0.094193f, 0.082239f, 0.072210f, 0.060549f, 0.046565f, 0.032938f, 0.019433f, 0.003358f, -0.015133f, -0.034053f, -0.053613f, -0.074508f, -0.094983f, -0.113236f, -0.129739f, -0.144761f, -0.156877f, -0.165350f, -0.170649f, -0.172003f, -0.167632f, -0.157270f, -0.141575f, -0.119930f, -0.091592f, -0.057772f, -0.020186f, 0.020979f, 0.065725f, 0.112552f, 0.159607f, 0.205951f, 0.250757f, 0.292733f, 0.330757f, 0.363863f, 0.390939f, 0.411566f, 0.426332f, 0.435310f, 0.437507f, 0.432635f, 0.421800f, 0.405738f, 0.384132f, 0.357002f, 0.324746f, 0.286692f, 0.241881f, 0.191549f, 0.138830f, 0.085942f, + 0.033379f, -0.018269f, -0.067107f, -0.110190f, -0.144170f, -0.166746f, -0.178462f, -0.182052f, -0.179351f, -0.170023f, -0.153643f, -0.131509f, -0.106065f, -0.079941f, -0.055749f, -0.035417f, -0.019431f, -0.007467f, 0.000527f, 0.004427f, 0.004267f, -0.000272f, -0.009744f, -0.023644f, -0.040120f, -0.057414f, -0.074708f, -0.091572f, -0.107804f, -0.123837f, -0.140150f, -0.156409f, -0.172204f, -0.188141f, -0.205108f, -0.223061f, -0.241479f, -0.260269f, -0.279397f, -0.298518f, -0.317733f, -0.337794f, -0.359009f, -0.380830f, -0.402589f, -0.423591f, -0.442671f, -0.458932f, -0.472565f, -0.483822f, -0.492080f, -0.497195f, -0.500388f, -0.502373f, -0.502625f, -0.501972f, -0.501991f, -0.497827f, -0.475773f, -0.426176f, -0.359349f, -0.301285f, -0.269949f, -0.260941f}, + {0.007632f, 0.022548f, 0.018442f, -0.012511f, -0.038820f, -0.048924f, -0.077495f, -0.144911f, -0.206158f, -0.190155f, -0.062376f, 0.162240f, 0.406347f, 0.505256f, 0.303545f, -0.122289f, -0.422346f, -0.308428f, 0.092789f, 0.368487f, 0.299142f, 0.056978f, -0.090390f, -0.095371f, -0.067860f, -0.051927f, -0.006294f, 0.067628f, 0.110810f, 0.102017f, 0.079345f, 0.072300f, 0.074025f, 0.076311f, 0.084642f, 0.098477f, 0.108362f, 0.112197f, 0.115201f, 0.118268f, 0.119098f, 0.118162f, 0.115112f, 0.106864f, 0.094193f, 0.082239f, 0.072210f, 0.060549f, 0.046565f, 0.032938f, 0.019433f, 0.003358f, -0.015133f, -0.034053f, -0.053613f, -0.074508f, -0.094983f, -0.113236f, -0.129739f, -0.144761f, -0.156877f, -0.165350f, -0.170649f, -0.172003f, -0.167632f, -0.157270f, -0.141575f, -0.119930f, -0.091592f, -0.057772f, -0.020186f, 0.020979f, 0.065725f, 0.112552f, 0.159607f, 0.205951f, 0.250757f, 0.292733f, 0.330757f, 0.363863f, 0.390939f, 0.411566f, 0.426332f, 0.435310f, 0.437507f, 0.432635f, 0.421800f, 0.405738f, 0.384132f, 0.357002f, 0.324746f, 0.286692f, 0.241881f, 0.191549f, 0.138830f, 0.085942f, + 0.033379f, -0.018269f, -0.067107f, -0.110190f, -0.144170f, -0.166746f, -0.178462f, -0.182052f, -0.179351f, -0.170023f, -0.153643f, -0.131509f, -0.106065f, -0.079941f, -0.055749f, -0.035417f, -0.019431f, -0.007467f, 0.000527f, 0.004427f, 0.004267f, -0.000272f, -0.009744f, -0.023644f, -0.040120f, -0.057414f, -0.074708f, -0.091572f, -0.107804f, -0.123837f, -0.140150f, -0.156409f, -0.172204f, -0.188141f, -0.205108f, -0.223061f, -0.241479f, -0.260269f, -0.279397f, -0.298518f, -0.317733f, -0.337794f, -0.359009f, -0.380830f, -0.402589f, -0.423591f, -0.442671f, -0.458932f, -0.472565f, -0.483822f, -0.492080f, -0.497195f, -0.500388f, -0.502373f, -0.502625f, -0.501972f, -0.501991f, -0.497827f, -0.475773f, -0.426176f, -0.359349f, -0.301285f, -0.269949f, -0.260941f} + }, + { + {0.034883f, -0.021304f, -0.099217f, -0.155447f, -0.151489f, -0.063105f, 0.084405f, 0.197852f, 0.184427f, 0.054626f, -0.080140f, -0.128439f, -0.101272f, -0.058942f, -0.024576f, 0.010034f, 0.029966f, 0.006574f, -0.046713f, -0.077438f, -0.060336f, -0.024821f, -0.006710f, -0.003011f, 0.010365f, 0.039520f, 0.070428f, 0.091979f, 0.102773f, 0.100912f, 0.082516f, 0.050679f, 0.016240f, -0.012503f, -0.036094f, -0.059657f, -0.086598f, -0.117101f, -0.148959f, -0.177814f, -0.198595f, -0.208869f, -0.210421f, -0.206878f, -0.200675f, -0.192862f, -0.184372f, -0.175896f, -0.167141f, -0.157485f, -0.147021f, -0.136095f, -0.124463f, -0.111814f, -0.098518f, -0.085003f, -0.070987f, -0.056168f, -0.041216f, -0.027385f, -0.015470f, -0.005652f, 0.001916f, 0.006935f, 0.009478f, 0.010521f, 0.011559f, 0.013411f, 0.015772f, 0.018478f, 0.022594f, 0.029321f, 0.038477f, 0.049356f, 0.062563f, 0.079569f, 0.100807f, 0.125523f, 0.153141f, 0.183523f, 0.216110f, 0.249764f, 0.283204f, 0.315238f, 0.345212f, 0.373228f, 0.398907f, 0.420315f, 0.435885f, 0.447075f, 0.456792f, 0.464976f, 0.467972f, 0.462757f, 0.449794f, 0.431130f, + 0.407351f, 0.377300f, 0.340016f, 0.296447f, 0.249195f, 0.200303f, 0.149534f, 0.095828f, 0.040211f, -0.014159f, -0.064951f, -0.112404f, -0.158156f, -0.203415f, -0.247903f, -0.289526f, -0.325496f, -0.354702f, -0.378437f, -0.398339f, -0.414695f, -0.427120f, -0.435547f, -0.440095f, -0.441262f, -0.440437f, -0.439004f, -0.437067f, -0.434155f, -0.430566f, -0.426801f, -0.422476f, -0.416824f, -0.409269f, -0.398920f, -0.385068f, -0.368719f, -0.351923f, -0.335312f, -0.317982f, -0.299378f, -0.279225f, -0.256508f, -0.230974f, -0.204681f, -0.179810f, -0.156306f, -0.133463f, -0.111629f, -0.090540f, -0.068716f, -0.046148f, -0.024726f, -0.005073f, 0.013889f, 0.032797f, 0.053548f, 0.080840f, 0.114841f, 0.143935f, 0.153768f, 0.143890f, 0.127871f, 0.117999f}, + {0.034883f, -0.021304f, -0.099217f, -0.155447f, -0.151489f, -0.063105f, 0.084405f, 0.197852f, 0.184427f, 0.054626f, -0.080140f, -0.128439f, -0.101272f, -0.058942f, -0.024576f, 0.010034f, 0.029966f, 0.006574f, -0.046713f, -0.077438f, -0.060336f, -0.024821f, -0.006710f, -0.003011f, 0.010365f, 0.039520f, 0.070428f, 0.091979f, 0.102773f, 0.100912f, 0.082516f, 0.050679f, 0.016240f, -0.012503f, -0.036094f, -0.059657f, -0.086598f, -0.117101f, -0.148959f, -0.177814f, -0.198595f, -0.208869f, -0.210421f, -0.206878f, -0.200675f, -0.192862f, -0.184372f, -0.175896f, -0.167141f, -0.157485f, -0.147021f, -0.136095f, -0.124463f, -0.111814f, -0.098518f, -0.085003f, -0.070987f, -0.056168f, -0.041216f, -0.027385f, -0.015470f, -0.005652f, 0.001916f, 0.006935f, 0.009478f, 0.010521f, 0.011559f, 0.013411f, 0.015772f, 0.018478f, 0.022594f, 0.029321f, 0.038477f, 0.049356f, 0.062563f, 0.079569f, 0.100807f, 0.125523f, 0.153141f, 0.183523f, 0.216110f, 0.249764f, 0.283204f, 0.315238f, 0.345212f, 0.373228f, 0.398907f, 0.420315f, 0.435885f, 0.447075f, 0.456792f, 0.464976f, 0.467972f, 0.462757f, 0.449794f, 0.431130f, + 0.407351f, 0.377300f, 0.340016f, 0.296447f, 0.249195f, 0.200303f, 0.149534f, 0.095828f, 0.040211f, -0.014159f, -0.064951f, -0.112404f, -0.158156f, -0.203415f, -0.247903f, -0.289526f, -0.325496f, -0.354702f, -0.378437f, -0.398339f, -0.414695f, -0.427120f, -0.435547f, -0.440095f, -0.441262f, -0.440437f, -0.439004f, -0.437067f, -0.434155f, -0.430566f, -0.426801f, -0.422476f, -0.416824f, -0.409269f, -0.398920f, -0.385068f, -0.368719f, -0.351923f, -0.335312f, -0.317982f, -0.299378f, -0.279225f, -0.256508f, -0.230974f, -0.204681f, -0.179810f, -0.156306f, -0.133463f, -0.111629f, -0.090540f, -0.068716f, -0.046148f, -0.024726f, -0.005073f, 0.013889f, 0.032797f, 0.053548f, 0.080840f, 0.114841f, 0.143935f, 0.153768f, 0.143890f, 0.127871f, 0.117999f} + }, + { + {-0.042332f, 0.052414f, 0.122641f, 0.100474f, 0.024695f, -0.082326f, -0.258062f, -0.473154f, -0.584763f, -0.487474f, -0.212666f, 0.165870f, 0.573082f, 0.800546f, 0.552655f, -0.151008f, -0.763503f, -0.701266f, -0.031392f, 0.589097f, 0.677353f, 0.375374f, 0.090848f, -0.027580f, -0.096120f, -0.190245f, -0.262825f, -0.288880f, -0.308636f, -0.336497f, -0.340771f, -0.310877f, -0.270106f, -0.228364f, -0.175587f, -0.113432f, -0.055244f, -0.004323f, 0.041799f, 0.077774f, 0.099516f, 0.113909f, 0.127241f, 0.136680f, 0.140063f, 0.140919f, 0.139881f, 0.133490f, 0.123199f, 0.114854f, 0.109677f, 0.104617f, 0.099122f, 0.094046f, 0.087514f, 0.077934f, 0.066999f, 0.055668f, 0.042091f, 0.026045f, 0.009978f, -0.005697f, -0.022928f, -0.041423f, -0.058984f, -0.075713f, -0.092979f, -0.109604f, -0.123430f, -0.134844f, -0.145145f, -0.153781f, -0.160146f, -0.165514f, -0.170954f, -0.175845f, -0.179731f, -0.183079f, -0.185777f, -0.187503f, -0.189345f, -0.192612f, -0.196803f, -0.200916f, -0.205347f, -0.210450f, -0.214889f, -0.217212f, -0.217402f, -0.215743f, -0.212081f, -0.206912f, -0.201289f, -0.195569f, -0.190303f, -0.187905f, + -0.191048f, -0.199781f, -0.212320f, -0.227968f, -0.247295f, -0.270114f, -0.294879f, -0.319422f, -0.341430f, -0.359264f, -0.372895f, -0.382982f, -0.388966f, -0.389475f, -0.384356f, -0.374855f, -0.362171f, -0.347161f, -0.330773f, -0.313405f, -0.294581f, -0.274385f, -0.254316f, -0.235851f, -0.219093f, -0.203275f, -0.187422f, -0.170370f, -0.151593f, -0.132216f, -0.113950f, -0.097152f, -0.081024f, -0.065106f, -0.049246f, -0.032888f, -0.015757f, 0.001405f, 0.017892f, 0.034016f, 0.050243f, 0.066435f, 0.082630f, 0.099397f, 0.116782f, 0.133961f, 0.150320f, 0.165818f, 0.180145f, 0.192646f, 0.203207f, 0.212303f, 0.220145f, 0.226503f, 0.231386f, 0.235453f, 0.239190f, 0.240731f, 0.234694f, 0.216060f, 0.187439f, 0.159993f, 0.143657f, 0.138274f}, + {-0.042332f, 0.052414f, 0.122641f, 0.100474f, 0.024695f, -0.082326f, -0.258062f, -0.473154f, -0.584763f, -0.487474f, -0.212666f, 0.165870f, 0.573082f, 0.800546f, 0.552655f, -0.151008f, -0.763503f, -0.701266f, -0.031392f, 0.589097f, 0.677353f, 0.375374f, 0.090848f, -0.027580f, -0.096120f, -0.190245f, -0.262825f, -0.288880f, -0.308636f, -0.336497f, -0.340771f, -0.310877f, -0.270106f, -0.228364f, -0.175587f, -0.113432f, -0.055244f, -0.004323f, 0.041799f, 0.077774f, 0.099516f, 0.113909f, 0.127241f, 0.136680f, 0.140063f, 0.140919f, 0.139881f, 0.133490f, 0.123199f, 0.114854f, 0.109677f, 0.104617f, 0.099122f, 0.094046f, 0.087514f, 0.077934f, 0.066999f, 0.055668f, 0.042091f, 0.026045f, 0.009978f, -0.005697f, -0.022928f, -0.041423f, -0.058984f, -0.075713f, -0.092979f, -0.109604f, -0.123430f, -0.134844f, -0.145145f, -0.153781f, -0.160146f, -0.165514f, -0.170954f, -0.175845f, -0.179731f, -0.183079f, -0.185777f, -0.187503f, -0.189345f, -0.192612f, -0.196803f, -0.200916f, -0.205347f, -0.210450f, -0.214889f, -0.217212f, -0.217402f, -0.215743f, -0.212081f, -0.206912f, -0.201289f, -0.195569f, -0.190303f, -0.187905f, + -0.191048f, -0.199781f, -0.212320f, -0.227968f, -0.247295f, -0.270114f, -0.294879f, -0.319422f, -0.341430f, -0.359264f, -0.372895f, -0.382982f, -0.388966f, -0.389475f, -0.384356f, -0.374855f, -0.362171f, -0.347161f, -0.330773f, -0.313405f, -0.294581f, -0.274385f, -0.254316f, -0.235851f, -0.219093f, -0.203275f, -0.187422f, -0.170370f, -0.151593f, -0.132216f, -0.113950f, -0.097152f, -0.081024f, -0.065106f, -0.049246f, -0.032888f, -0.015757f, 0.001405f, 0.017892f, 0.034016f, 0.050243f, 0.066435f, 0.082630f, 0.099397f, 0.116782f, 0.133961f, 0.150320f, 0.165818f, 0.180145f, 0.192646f, 0.203207f, 0.212303f, 0.220145f, 0.226503f, 0.231386f, 0.235453f, 0.239190f, 0.240731f, 0.234694f, 0.216060f, 0.187439f, 0.159993f, 0.143657f, 0.138274f} + }, + { + {-0.038707f, -0.040443f, -0.032425f, -0.008667f, 0.039610f, 0.121021f, 0.200841f, 0.209863f, 0.128343f, -0.011854f, -0.222956f, -0.509917f, -0.672944f, -0.397576f, 0.271260f, 0.753657f, 0.530475f, -0.183327f, -0.662957f, -0.535116f, -0.113682f, 0.135696f, 0.139296f, 0.101726f, 0.119927f, 0.126081f, 0.082228f, 0.034341f, 0.008539f, -0.018778f, -0.056453f, -0.082857f, -0.088546f, -0.085336f, -0.080321f, -0.072030f, -0.062931f, -0.055762f, -0.047257f, -0.036657f, -0.029416f, -0.026737f, -0.023178f, -0.017390f, -0.014005f, -0.014139f, -0.014094f, -0.012938f, -0.012763f, -0.012836f, -0.010434f, -0.005527f, 0.000352f, 0.007263f, 0.015320f, 0.022993f, 0.029308f, 0.034837f, 0.039468f, 0.042226f, 0.043473f, 0.044401f, 0.044758f, 0.043609f, 0.041320f, 0.038608f, 0.035016f, 0.030111f, 0.024605f, 0.019016f, 0.012867f, 0.005983f, -0.001177f, -0.008863f, -0.018026f, -0.028938f, -0.041213f, -0.054772f, -0.069509f, -0.084750f, -0.100179f, -0.116316f, -0.133109f, -0.149167f, -0.163209f, -0.175265f, -0.185829f, -0.194738f, -0.201250f, -0.204518f, -0.203992f, -0.199910f, -0.193205f, -0.184582f, -0.174292f, -0.163022f, + -0.152075f, -0.142325f, -0.133856f, -0.126875f, -0.122103f, -0.119943f, -0.119907f, -0.121022f, -0.122534f, -0.124394f, -0.127276f, -0.131743f, -0.137311f, -0.142802f, -0.147553f, -0.151741f, -0.155707f, -0.159595f, -0.163318f, -0.166341f, -0.167867f, -0.167752f, -0.166759f, -0.165644f, -0.164497f, -0.162993f, -0.160544f, -0.156329f, -0.149991f, -0.142138f, -0.133494f, -0.123973f, -0.113132f, -0.100831f, -0.086925f, -0.071241f, -0.054316f, -0.037204f, -0.020348f, -0.003592f, 0.012893f, 0.028859f, 0.044680f, 0.060561f, 0.075703f, 0.089381f, 0.101902f, 0.113636f, 0.124499f, 0.135054f, 0.146443f, 0.158891f, 0.172084f, 0.186647f, 0.203232f, 0.221745f, 0.243776f, 0.271628f, 0.299956f, 0.313432f, 0.301412f, 0.272461f, 0.246103f, 0.233169f}, + {0.038707f, 0.040443f, 0.032425f, 0.008667f, -0.039610f, -0.121021f, -0.200841f, -0.209863f, -0.128343f, 0.011854f, 0.222956f, 0.509917f, 0.672944f, 0.397576f, -0.271260f, -0.753657f, -0.530475f, 0.183327f, 0.662957f, 0.535116f, 0.113682f, -0.135696f, -0.139296f, -0.101726f, -0.119927f, -0.126081f, -0.082228f, -0.034341f, -0.008539f, 0.018778f, 0.056453f, 0.082857f, 0.088546f, 0.085336f, 0.080321f, 0.072030f, 0.062931f, 0.055762f, 0.047257f, 0.036657f, 0.029416f, 0.026737f, 0.023178f, 0.017390f, 0.014005f, 0.014139f, 0.014094f, 0.012938f, 0.012763f, 0.012836f, 0.010434f, 0.005527f, -0.000352f, -0.007263f, -0.015320f, -0.022993f, -0.029308f, -0.034837f, -0.039468f, -0.042226f, -0.043473f, -0.044401f, -0.044758f, -0.043609f, -0.041320f, -0.038608f, -0.035016f, -0.030111f, -0.024605f, -0.019016f, -0.012867f, -0.005983f, 0.001177f, 0.008863f, 0.018026f, 0.028938f, 0.041213f, 0.054772f, 0.069509f, 0.084750f, 0.100179f, 0.116316f, 0.133109f, 0.149167f, 0.163209f, 0.175265f, 0.185829f, 0.194738f, 0.201250f, 0.204518f, 0.203992f, 0.199910f, 0.193205f, 0.184582f, 0.174292f, 0.163022f, + 0.152075f, 0.142325f, 0.133856f, 0.126875f, 0.122103f, 0.119943f, 0.119907f, 0.121022f, 0.122534f, 0.124394f, 0.127276f, 0.131743f, 0.137311f, 0.142802f, 0.147553f, 0.151741f, 0.155707f, 0.159595f, 0.163318f, 0.166341f, 0.167867f, 0.167752f, 0.166759f, 0.165644f, 0.164497f, 0.162993f, 0.160544f, 0.156329f, 0.149991f, 0.142138f, 0.133494f, 0.123973f, 0.113132f, 0.100831f, 0.086925f, 0.071241f, 0.054316f, 0.037204f, 0.020348f, 0.003592f, -0.012893f, -0.028859f, -0.044680f, -0.060561f, -0.075703f, -0.089381f, -0.101902f, -0.113636f, -0.124499f, -0.135054f, -0.146443f, -0.158891f, -0.172084f, -0.186647f, -0.203232f, -0.221745f, -0.243776f, -0.271628f, -0.299956f, -0.313432f, -0.301412f, -0.272461f, -0.246103f, -0.233169f} + }, + { + {-0.011441f, -0.003265f, 0.004011f, -0.000472f, -0.027714f, -0.075629f, -0.102363f, -0.048427f, 0.075716f, 0.158973f, 0.107163f, -0.028068f, -0.105566f, -0.071921f, -0.008203f, 0.005703f, -0.009101f, 0.001108f, 0.026819f, 0.024213f, -0.004533f, -0.019483f, -0.010977f, -0.008220f, -0.025895f, -0.043275f, -0.039729f, -0.021081f, -0.003698f, 0.006641f, 0.011920f, 0.011671f, 0.003832f, -0.010526f, -0.027836f, -0.044363f, -0.057022f, -0.064947f, -0.070367f, -0.075558f, -0.079517f, -0.079629f, -0.075472f, -0.069036f, -0.062356f, -0.056849f, -0.053900f, -0.054130f, -0.056410f, -0.058748f, -0.059818f, -0.059044f, -0.056030f, -0.050751f, -0.043844f, -0.036068f, -0.027766f, -0.019090f, -0.010327f, -0.001711f, 0.006749f, 0.015049f, 0.022944f, 0.029990f, 0.035833f, 0.040478f, 0.044205f, 0.047143f, 0.049179f, 0.050500f, 0.051764f, 0.053342f, 0.054913f, 0.056356f, 0.058453f, 0.062098f, 0.067413f, 0.074374f, 0.083664f, 0.096097f, 0.111651f, 0.129744f, 0.150062f, 0.172637f, 0.197477f, 0.224325f, 0.252295f, 0.279828f, 0.305655f, 0.329617f, 0.351655f, 0.370228f, 0.382750f, 0.387511f, 0.384321f, 0.373523f, + 0.355270f, 0.329788f, 0.297855f, 0.261198f, 0.222427f, 0.183885f, 0.146353f, 0.109686f, 0.074803f, 0.043946f, 0.018611f, -0.002035f, -0.020413f, -0.038698f, -0.057436f, -0.075307f, -0.090415f, -0.102296f, -0.112325f, -0.122030f, -0.131716f, -0.140923f, -0.149260f, -0.156505f, -0.162826f, -0.169104f, -0.176221f, -0.184054f, -0.191847f, -0.199220f, -0.206057f, -0.212014f, -0.216913f, -0.221002f, -0.224224f, -0.226071f, -0.226577f, -0.226473f, -0.226101f, -0.225292f, -0.224225f, -0.223145f, -0.221549f, -0.219033f, -0.216406f, -0.214610f, -0.213404f, -0.212354f, -0.211792f, -0.211513f, -0.210235f, -0.207593f, -0.204699f, -0.201857f, -0.198207f, -0.193847f, -0.188118f, -0.174986f, -0.146065f, -0.102134f, -0.057750f, -0.029670f, -0.021689f, -0.023453f}, + {0.011441f, 0.003265f, -0.004011f, 0.000472f, 0.027714f, 0.075629f, 0.102363f, 0.048427f, -0.075716f, -0.158973f, -0.107163f, 0.028068f, 0.105566f, 0.071921f, 0.008203f, -0.005703f, 0.009101f, -0.001108f, -0.026819f, -0.024213f, 0.004533f, 0.019483f, 0.010977f, 0.008220f, 0.025895f, 0.043275f, 0.039729f, 0.021081f, 0.003698f, -0.006641f, -0.011920f, -0.011671f, -0.003832f, 0.010526f, 0.027836f, 0.044363f, 0.057022f, 0.064947f, 0.070367f, 0.075558f, 0.079517f, 0.079629f, 0.075472f, 0.069036f, 0.062356f, 0.056849f, 0.053900f, 0.054130f, 0.056410f, 0.058748f, 0.059818f, 0.059044f, 0.056030f, 0.050751f, 0.043844f, 0.036068f, 0.027766f, 0.019090f, 0.010327f, 0.001711f, -0.006749f, -0.015049f, -0.022944f, -0.029990f, -0.035833f, -0.040478f, -0.044205f, -0.047143f, -0.049179f, -0.050500f, -0.051764f, -0.053342f, -0.054913f, -0.056356f, -0.058453f, -0.062098f, -0.067413f, -0.074374f, -0.083664f, -0.096097f, -0.111651f, -0.129744f, -0.150062f, -0.172637f, -0.197477f, -0.224325f, -0.252295f, -0.279828f, -0.305655f, -0.329617f, -0.351655f, -0.370228f, -0.382750f, -0.387511f, -0.384321f, -0.373523f, + -0.355270f, -0.329788f, -0.297855f, -0.261198f, -0.222427f, -0.183885f, -0.146353f, -0.109686f, -0.074803f, -0.043946f, -0.018611f, 0.002035f, 0.020413f, 0.038698f, 0.057436f, 0.075307f, 0.090415f, 0.102296f, 0.112325f, 0.122030f, 0.131716f, 0.140923f, 0.149260f, 0.156505f, 0.162826f, 0.169104f, 0.176221f, 0.184054f, 0.191847f, 0.199220f, 0.206057f, 0.212014f, 0.216913f, 0.221002f, 0.224224f, 0.226071f, 0.226577f, 0.226473f, 0.226101f, 0.225292f, 0.224225f, 0.223145f, 0.221549f, 0.219033f, 0.216406f, 0.214610f, 0.213404f, 0.212354f, 0.211792f, 0.211513f, 0.210235f, 0.207593f, 0.204699f, 0.201857f, 0.198207f, 0.193847f, 0.188118f, 0.174986f, 0.146065f, 0.102134f, 0.057750f, 0.029670f, 0.021689f, 0.023453f} + }, + { + {-0.022899f, -0.009050f, 0.021042f, 0.035577f, 0.007193f, -0.010991f, 0.067505f, 0.216765f, 0.271970f, 0.095990f, -0.246846f, -0.502443f, -0.427170f, -0.025043f, 0.395378f, 0.472255f, 0.158557f, -0.215865f, -0.309289f, -0.125601f, 0.071920f, 0.117090f, 0.070896f, 0.036158f, 0.010191f, -0.040842f, -0.086996f, -0.084856f, -0.053104f, -0.038760f, -0.049026f, -0.058734f, -0.055081f, -0.041078f, -0.015513f, 0.023625f, 0.067409f, 0.104226f, 0.131662f, 0.152151f, 0.165968f, 0.173980f, 0.179366f, 0.183056f, 0.183232f, 0.180032f, 0.175450f, 0.169336f, 0.160257f, 0.148803f, 0.135933f, 0.119953f, 0.098677f, 0.072731f, 0.044254f, 0.014523f, -0.015264f, -0.043256f, -0.068768f, -0.092960f, -0.116651f, -0.139142f, -0.159634f, -0.177968f, -0.193495f, -0.204628f, -0.209832f, -0.208176f, -0.199162f, -0.182839f, -0.159769f, -0.130297f, -0.094474f, -0.053153f, -0.008358f, 0.038048f, 0.085319f, 0.132878f, 0.179125f, 0.221960f, 0.260199f, 0.293872f, 0.323183f, 0.347625f, 0.366329f, 0.379015f, 0.386161f, 0.388145f, 0.384647f, 0.375101f, 0.359186f, 0.336465f, 0.306144f, 0.267908f, 0.222716f, 0.172166f, + 0.117452f, 0.059721f, 0.001259f, -0.054522f, -0.104542f, -0.147316f, -0.182857f, -0.211501f, -0.232650f, -0.244662f, -0.246382f, -0.238892f, -0.225272f, -0.208463f, -0.189745f, -0.169228f, -0.147036f, -0.123663f, -0.099806f, -0.076368f, -0.054370f, -0.034613f, -0.017496f, -0.003066f, 0.009127f, 0.020090f, 0.030773f, 0.041240f, 0.050609f, 0.057724f, 0.061768f, 0.062553f, 0.060572f, 0.056607f, 0.051053f, 0.043676f, 0.034051f, 0.022022f, 0.007797f, -0.008087f, -0.024935f, -0.042312f, -0.060172f, -0.078368f, -0.096310f, -0.113326f, -0.129046f, -0.143214f, -0.155555f, -0.166012f, -0.174718f, -0.181676f, -0.186839f, -0.190425f, -0.192896f, -0.195026f, -0.197709f, -0.199950f, -0.196779f, -0.182409f, -0.157947f, -0.133337f, -0.118252f, -0.113142f}, + {0.022899f, 0.009050f, -0.021042f, -0.035577f, -0.007193f, 0.010991f, -0.067505f, -0.216765f, -0.271970f, -0.095990f, 0.246846f, 0.502443f, 0.427170f, 0.025043f, -0.395378f, -0.472255f, -0.158557f, 0.215865f, 0.309289f, 0.125601f, -0.071920f, -0.117090f, -0.070896f, -0.036158f, -0.010191f, 0.040842f, 0.086996f, 0.084856f, 0.053104f, 0.038760f, 0.049026f, 0.058734f, 0.055081f, 0.041078f, 0.015513f, -0.023625f, -0.067409f, -0.104226f, -0.131662f, -0.152151f, -0.165968f, -0.173980f, -0.179366f, -0.183056f, -0.183232f, -0.180032f, -0.175450f, -0.169336f, -0.160257f, -0.148803f, -0.135933f, -0.119953f, -0.098677f, -0.072731f, -0.044254f, -0.014523f, 0.015264f, 0.043256f, 0.068768f, 0.092960f, 0.116651f, 0.139142f, 0.159634f, 0.177968f, 0.193495f, 0.204628f, 0.209832f, 0.208176f, 0.199162f, 0.182839f, 0.159769f, 0.130297f, 0.094474f, 0.053153f, 0.008358f, -0.038048f, -0.085319f, -0.132878f, -0.179125f, -0.221960f, -0.260199f, -0.293872f, -0.323183f, -0.347625f, -0.366329f, -0.379015f, -0.386161f, -0.388145f, -0.384647f, -0.375101f, -0.359186f, -0.336465f, -0.306144f, -0.267908f, -0.222716f, -0.172166f, + -0.117452f, -0.059721f, -0.001259f, 0.054522f, 0.104542f, 0.147316f, 0.182857f, 0.211501f, 0.232650f, 0.244662f, 0.246382f, 0.238892f, 0.225272f, 0.208463f, 0.189745f, 0.169228f, 0.147036f, 0.123663f, 0.099806f, 0.076368f, 0.054370f, 0.034613f, 0.017496f, 0.003066f, -0.009127f, -0.020090f, -0.030773f, -0.041240f, -0.050609f, -0.057724f, -0.061768f, -0.062553f, -0.060572f, -0.056607f, -0.051053f, -0.043676f, -0.034051f, -0.022022f, -0.007797f, 0.008087f, 0.024935f, 0.042312f, 0.060172f, 0.078368f, 0.096310f, 0.113326f, 0.129046f, 0.143214f, 0.155555f, 0.166012f, 0.174718f, 0.181676f, 0.186839f, 0.190425f, 0.192896f, 0.195026f, 0.197709f, 0.199950f, 0.196779f, 0.182409f, 0.157947f, 0.133337f, 0.118252f, 0.113142f} + }, + { + {0.003690f, -0.000917f, -0.000552f, 0.013387f, 0.038725f, 0.063371f, 0.072581f, 0.053190f, 0.000206f, -0.066676f, -0.099074f, -0.058384f, 0.032276f, 0.096933f, 0.084562f, 0.021700f, -0.028770f, -0.041099f, -0.033861f, -0.021573f, 0.003202f, 0.040516f, 0.070416f, 0.080729f, 0.083957f, 0.093969f, 0.102499f, 0.091181f, 0.056136f, 0.010704f, -0.028621f, -0.051424f, -0.055151f, -0.045654f, -0.033912f, -0.027688f, -0.026567f, -0.025373f, -0.020147f, -0.010619f, 0.000563f, 0.010165f, 0.017004f, 0.022350f, 0.027713f, 0.033503f, 0.039956f, 0.047461f, 0.055453f, 0.062514f, 0.067893f, 0.071692f, 0.073779f, 0.073710f, 0.071278f, 0.066153f, 0.057699f, 0.045923f, 0.031751f, 0.015946f, -0.001187f, -0.018979f, -0.036673f, -0.054412f, -0.072597f, -0.090693f, -0.108050f, -0.125117f, -0.142249f, -0.158172f, -0.171068f, -0.180164f, -0.184957f, -0.184167f, -0.176848f, -0.163444f, -0.144732f, -0.120910f, -0.092493f, -0.060834f, -0.026998f, 0.008883f, 0.046658f, 0.085319f, 0.123386f, 0.159725f, 0.194080f, 0.226805f, 0.257478f, 0.283950f, 0.303794f, 0.316528f, 0.323183f, 0.324000f, 0.317919f, 0.304128f, + 0.282929f, 0.255584f, 0.224397f, 0.192192f, 0.160506f, 0.128826f, 0.096337f, 0.063750f, 0.033188f, 0.007192f, -0.012327f, -0.025520f, -0.034813f, -0.042423f, -0.047979f, -0.049630f, -0.046581f, -0.039422f, -0.029192f, -0.017343f, -0.005387f, 0.006553f, 0.019724f, 0.034769f, 0.051053f, 0.067938f, 0.085001f, 0.101175f, 0.115466f, 0.128221f, 0.140146f, 0.150803f, 0.159486f, 0.166332f, 0.171227f, 0.173096f, 0.171443f, 0.166998f, 0.160073f, 0.150144f, 0.137357f, 0.122400f, 0.104972f, 0.084444f, 0.061488f, 0.037087f, 0.011069f, -0.016587f, -0.044718f, -0.072768f, -0.101412f, -0.130304f, -0.157895f, -0.183977f, -0.209630f, -0.235539f, -0.263242f, -0.293940f, -0.320304f, -0.325486f, -0.300786f, -0.260681f, -0.229360f, -0.216143f}, + {0.003690f, -0.000917f, -0.000552f, 0.013387f, 0.038725f, 0.063371f, 0.072581f, 0.053190f, 0.000206f, -0.066676f, -0.099074f, -0.058384f, 0.032276f, 0.096933f, 0.084562f, 0.021700f, -0.028770f, -0.041099f, -0.033861f, -0.021573f, 0.003202f, 0.040516f, 0.070416f, 0.080729f, 0.083957f, 0.093969f, 0.102499f, 0.091181f, 0.056136f, 0.010704f, -0.028621f, -0.051424f, -0.055151f, -0.045654f, -0.033912f, -0.027688f, -0.026567f, -0.025373f, -0.020147f, -0.010619f, 0.000563f, 0.010165f, 0.017004f, 0.022350f, 0.027713f, 0.033503f, 0.039956f, 0.047461f, 0.055453f, 0.062514f, 0.067893f, 0.071692f, 0.073779f, 0.073710f, 0.071278f, 0.066153f, 0.057699f, 0.045923f, 0.031751f, 0.015946f, -0.001187f, -0.018979f, -0.036673f, -0.054412f, -0.072597f, -0.090693f, -0.108050f, -0.125117f, -0.142249f, -0.158172f, -0.171068f, -0.180164f, -0.184957f, -0.184167f, -0.176848f, -0.163444f, -0.144732f, -0.120910f, -0.092493f, -0.060834f, -0.026998f, 0.008883f, 0.046658f, 0.085319f, 0.123386f, 0.159725f, 0.194080f, 0.226805f, 0.257478f, 0.283950f, 0.303794f, 0.316528f, 0.323183f, 0.324000f, 0.317919f, 0.304128f, + 0.282929f, 0.255584f, 0.224397f, 0.192192f, 0.160506f, 0.128826f, 0.096337f, 0.063750f, 0.033188f, 0.007192f, -0.012327f, -0.025520f, -0.034813f, -0.042423f, -0.047979f, -0.049630f, -0.046581f, -0.039422f, -0.029192f, -0.017343f, -0.005387f, 0.006553f, 0.019724f, 0.034769f, 0.051053f, 0.067938f, 0.085001f, 0.101175f, 0.115466f, 0.128221f, 0.140146f, 0.150803f, 0.159486f, 0.166332f, 0.171227f, 0.173096f, 0.171443f, 0.166998f, 0.160073f, 0.150144f, 0.137357f, 0.122400f, 0.104972f, 0.084444f, 0.061488f, 0.037087f, 0.011069f, -0.016587f, -0.044718f, -0.072768f, -0.101412f, -0.130304f, -0.157895f, -0.183977f, -0.209630f, -0.235539f, -0.263242f, -0.293940f, -0.320304f, -0.325486f, -0.300786f, -0.260681f, -0.229360f, -0.216143f} + }, + { + {-0.023394f, -0.027147f, -0.010242f, 0.029995f, 0.067330f, 0.083589f, 0.072936f, 0.017445f, -0.087218f, -0.178937f, -0.163916f, -0.030708f, 0.114394f, 0.155385f, 0.081810f, -0.022358f, -0.073288f, -0.048744f, 0.015279f, 0.058591f, 0.040948f, -0.023886f, -0.081166f, -0.090364f, -0.058651f, -0.017390f, 0.015585f, 0.040163f, 0.058174f, 0.070098f, 0.079819f, 0.090006f, 0.096263f, 0.093268f, 0.082877f, 0.070565f, 0.057790f, 0.042958f, 0.026941f, 0.013256f, 0.004160f, -0.000764f, -0.003251f, -0.005255f, -0.008455f, -0.013944f, -0.022509f, -0.034733f, -0.050017f, -0.066095f, -0.080399f, -0.091534f, -0.099083f, -0.103038f, -0.104204f, -0.104337f, -0.105038f, -0.106888f, -0.109935f, -0.114401f, -0.120510f, -0.128064f, -0.136416f, -0.144519f, -0.150965f, -0.154404f, -0.154060f, -0.149652f, -0.141043f, -0.128490f, -0.113124f, -0.096475f, -0.079332f, -0.061637f, -0.043769f, -0.027117f, -0.012702f, 0.000084f, 0.012241f, 0.023050f, 0.030612f, 0.034541f, 0.036620f, 0.038340f, 0.039247f, 0.038732f, 0.038347f, 0.040934f, 0.047732f, 0.057272f, 0.067154f, 0.076305f, 0.085395f, 0.095550f, 0.107026f, 0.119165f, + 0.131180f, 0.142546f, 0.152838f, 0.162016f, 0.171094f, 0.181783f, 0.194944f, 0.209687f, 0.224276f, 0.237616f, 0.249622f, 0.260452f, 0.269684f, 0.276238f, 0.279096f, 0.278096f, 0.273844f, 0.266767f, 0.256520f, 0.242394f, 0.224039f, 0.201801f, 0.176733f, 0.150267f, 0.123426f, 0.096270f, 0.068346f, 0.039626f, 0.010838f, -0.016846f, -0.042211f, -0.064572f, -0.084386f, -0.102969f, -0.121208f, -0.138666f, -0.153987f, -0.165894f, -0.173880f, -0.178463f, -0.180864f, -0.182167f, -0.182758f, -0.182496f, -0.180928f, -0.177304f, -0.171116f, -0.162770f, -0.153009f, -0.141866f, -0.129175f, -0.115724f, -0.102570f, -0.089658f, -0.076512f, -0.063365f, -0.049691f, -0.033149f, -0.013162f, 0.005394f, 0.015746f, 0.016554f, 0.012768f, 0.009775f}, + {-0.023394f, -0.027147f, -0.010242f, 0.029995f, 0.067330f, 0.083589f, 0.072936f, 0.017445f, -0.087218f, -0.178937f, -0.163916f, -0.030708f, 0.114394f, 0.155385f, 0.081810f, -0.022358f, -0.073288f, -0.048744f, 0.015279f, 0.058591f, 0.040948f, -0.023886f, -0.081166f, -0.090364f, -0.058651f, -0.017390f, 0.015585f, 0.040163f, 0.058174f, 0.070098f, 0.079819f, 0.090006f, 0.096263f, 0.093268f, 0.082877f, 0.070565f, 0.057790f, 0.042958f, 0.026941f, 0.013256f, 0.004160f, -0.000764f, -0.003251f, -0.005255f, -0.008455f, -0.013944f, -0.022509f, -0.034733f, -0.050017f, -0.066095f, -0.080399f, -0.091534f, -0.099083f, -0.103038f, -0.104204f, -0.104337f, -0.105038f, -0.106888f, -0.109935f, -0.114401f, -0.120510f, -0.128064f, -0.136416f, -0.144519f, -0.150965f, -0.154404f, -0.154060f, -0.149652f, -0.141043f, -0.128490f, -0.113124f, -0.096475f, -0.079332f, -0.061637f, -0.043769f, -0.027117f, -0.012702f, 0.000084f, 0.012241f, 0.023050f, 0.030612f, 0.034541f, 0.036620f, 0.038340f, 0.039247f, 0.038732f, 0.038347f, 0.040934f, 0.047732f, 0.057272f, 0.067154f, 0.076305f, 0.085395f, 0.095550f, 0.107026f, 0.119165f, + 0.131180f, 0.142546f, 0.152838f, 0.162016f, 0.171094f, 0.181783f, 0.194944f, 0.209687f, 0.224276f, 0.237616f, 0.249622f, 0.260452f, 0.269684f, 0.276238f, 0.279096f, 0.278096f, 0.273844f, 0.266767f, 0.256520f, 0.242394f, 0.224039f, 0.201801f, 0.176733f, 0.150267f, 0.123426f, 0.096270f, 0.068346f, 0.039626f, 0.010838f, -0.016846f, -0.042211f, -0.064572f, -0.084386f, -0.102969f, -0.121208f, -0.138666f, -0.153987f, -0.165894f, -0.173880f, -0.178463f, -0.180864f, -0.182167f, -0.182758f, -0.182496f, -0.180928f, -0.177304f, -0.171116f, -0.162770f, -0.153009f, -0.141866f, -0.129175f, -0.115724f, -0.102570f, -0.089658f, -0.076512f, -0.063365f, -0.049691f, -0.033149f, -0.013162f, 0.005394f, 0.015746f, 0.016554f, 0.012768f, 0.009775f} + }, + { + {0.002536f, -0.011235f, -0.018343f, -0.017987f, -0.027166f, -0.031117f, 0.014002f, 0.096526f, 0.113126f, -0.016617f, -0.209563f, -0.268875f, -0.109214f, 0.120357f, 0.194165f, 0.064228f, -0.105548f, -0.151938f, -0.085143f, -0.021811f, -0.013168f, -0.007575f, 0.042273f, 0.109306f, 0.142985f, 0.138265f, 0.124567f, 0.114998f, 0.096455f, 0.057758f, 0.004146f, -0.052677f, -0.103477f, -0.141457f, -0.163639f, -0.173107f, -0.175086f, -0.171796f, -0.163515f, -0.151686f, -0.138206f, -0.124227f, -0.111720f, -0.103751f, -0.101586f, -0.103453f, -0.106877f, -0.110322f, -0.112385f, -0.111649f, -0.107834f, -0.101601f, -0.093248f, -0.082860f, -0.071411f, -0.060549f, -0.051523f, -0.045052f, -0.041731f, -0.041860f, -0.045219f, -0.051310f, -0.059514f, -0.069016f, -0.079031f, -0.088966f, -0.098149f, -0.105768f, -0.111299f, -0.114442f, -0.114537f, -0.110675f, -0.102450f, -0.090007f, -0.073514f, -0.053290f, -0.030165f, -0.005135f, 0.020901f, 0.046733f, 0.071073f, 0.093736f, 0.115568f, 0.136842f, 0.156886f, 0.175538f, 0.193455f, 0.210815f, 0.227567f, 0.245363f, 0.267074f, 0.293421f, 0.321639f, 0.348399f, 0.372776f, 0.395534f, + 0.416417f, 0.432977f, 0.441812f, 0.440703f, 0.429686f, 0.410030f, 0.382492f, 0.347214f, 0.305126f, 0.258387f, 0.209075f, 0.158069f, 0.105330f, 0.050877f, -0.004290f, -0.057880f, -0.107405f, -0.152051f, -0.192952f, -0.231334f, -0.267030f, -0.298914f, -0.325959f, -0.347776f, -0.365058f, -0.379559f, -0.392822f, -0.404916f, -0.414926f, -0.422209f, -0.426647f, -0.428320f, -0.427480f, -0.424173f, -0.417634f, -0.406929f, -0.392213f, -0.374383f, -0.353748f, -0.330107f, -0.303575f, -0.274126f, -0.241197f, -0.204995f, -0.167220f, -0.129445f, -0.092017f, -0.055184f, -0.019543f, 0.015178f, 0.049744f, 0.083605f, 0.115480f, 0.145267f, 0.173490f, 0.200772f, 0.229618f, 0.261633f, 0.288462f, 0.292554f, 0.266148f, 0.224956f, 0.193266f, 0.179939f}, + {0.002536f, -0.011235f, -0.018343f, -0.017987f, -0.027166f, -0.031117f, 0.014002f, 0.096526f, 0.113126f, -0.016617f, -0.209563f, -0.268875f, -0.109214f, 0.120357f, 0.194165f, 0.064228f, -0.105548f, -0.151938f, -0.085143f, -0.021811f, -0.013168f, -0.007575f, 0.042273f, 0.109306f, 0.142985f, 0.138265f, 0.124567f, 0.114998f, 0.096455f, 0.057758f, 0.004146f, -0.052677f, -0.103477f, -0.141457f, -0.163639f, -0.173107f, -0.175086f, -0.171796f, -0.163515f, -0.151686f, -0.138206f, -0.124227f, -0.111720f, -0.103751f, -0.101586f, -0.103453f, -0.106877f, -0.110322f, -0.112385f, -0.111649f, -0.107834f, -0.101601f, -0.093248f, -0.082860f, -0.071411f, -0.060549f, -0.051523f, -0.045052f, -0.041731f, -0.041860f, -0.045219f, -0.051310f, -0.059514f, -0.069016f, -0.079031f, -0.088966f, -0.098149f, -0.105768f, -0.111299f, -0.114442f, -0.114537f, -0.110675f, -0.102450f, -0.090007f, -0.073514f, -0.053290f, -0.030165f, -0.005135f, 0.020901f, 0.046733f, 0.071073f, 0.093736f, 0.115568f, 0.136842f, 0.156886f, 0.175538f, 0.193455f, 0.210815f, 0.227567f, 0.245363f, 0.267074f, 0.293421f, 0.321639f, 0.348399f, 0.372776f, 0.395534f, + 0.416417f, 0.432977f, 0.441812f, 0.440703f, 0.429686f, 0.410030f, 0.382492f, 0.347214f, 0.305126f, 0.258387f, 0.209075f, 0.158069f, 0.105330f, 0.050877f, -0.004290f, -0.057880f, -0.107405f, -0.152051f, -0.192952f, -0.231334f, -0.267030f, -0.298914f, -0.325959f, -0.347776f, -0.365058f, -0.379559f, -0.392822f, -0.404916f, -0.414926f, -0.422209f, -0.426647f, -0.428320f, -0.427480f, -0.424173f, -0.417634f, -0.406929f, -0.392213f, -0.374383f, -0.353748f, -0.330107f, -0.303575f, -0.274126f, -0.241197f, -0.204995f, -0.167220f, -0.129445f, -0.092017f, -0.055184f, -0.019543f, 0.015178f, 0.049744f, 0.083605f, 0.115480f, 0.145267f, 0.173490f, 0.200772f, 0.229618f, 0.261633f, 0.288462f, 0.292554f, 0.266148f, 0.224956f, 0.193266f, 0.179939f} + }, + { + {-0.007328f, -0.006633f, -0.005516f, -0.004599f, -0.006212f, -0.012944f, -0.019712f, -0.012267f, 0.011010f, 0.016826f, -0.032596f, -0.108239f, -0.110945f, 0.010212f, 0.155530f, 0.161358f, 0.002569f, -0.158036f, -0.158582f, -0.022168f, 0.096234f, 0.102029f, 0.035418f, -0.022187f, -0.041382f, -0.034394f, -0.010242f, 0.027669f, 0.066023f, 0.089774f, 0.096851f, 0.093676f, 0.085029f, 0.075093f, 0.069304f, 0.068251f, 0.065239f, 0.053828f, 0.033768f, 0.008271f, -0.019582f, -0.046238f, -0.067687f, -0.081975f, -0.089777f, -0.092397f, -0.091138f, -0.088118f, -0.085559f, -0.084325f, -0.084372f, -0.085968f, -0.089285f, -0.093494f, -0.097292f, -0.099890f, -0.100991f, -0.100590f, -0.099298f, -0.098219f, -0.098141f, -0.099359f, -0.102222f, -0.107041f, -0.113405f, -0.120380f, -0.127461f, -0.134664f, -0.141768f, -0.148230f, -0.153822f, -0.158600f, -0.162259f, -0.164282f, -0.164806f, -0.164594f, -0.163969f, -0.162482f, -0.159958f, -0.157223f, -0.155192f, -0.153484f, -0.150650f, -0.145885f, -0.139922f, -0.133722f, -0.126676f, -0.116974f, -0.103893f, -0.088961f, -0.074475f, -0.061464f, -0.049642f, -0.038896f, -0.030151f, -0.024762f, + -0.023313f, -0.025007f, -0.028346f, -0.032647f, -0.038714f, -0.047598f, -0.058798f, -0.070133f, -0.079232f, -0.084838f, -0.087074f, -0.087043f, -0.085895f, -0.083734f, -0.079604f, -0.072780f, -0.063696f, -0.053433f, -0.042909f, -0.032749f, -0.023224f, -0.013965f, -0.004302f, 0.005932f, 0.016369f, 0.026824f, 0.037430f, 0.048223f, 0.059127f, 0.070106f, 0.080829f, 0.090562f, 0.098820f, 0.105730f, 0.111496f, 0.116170f, 0.120110f, 0.123911f, 0.127778f, 0.131714f, 0.136211f, 0.141890f, 0.148771f, 0.156783f, 0.166411f, 0.177897f, 0.190546f, 0.203691f, 0.217322f, 0.230936f, 0.243185f, 0.253500f, 0.262398f, 0.269552f, 0.273836f, 0.275598f, 0.275116f, 0.267347f, 0.243149f, 0.200413f, 0.151683f, 0.115625f, 0.100371f, 0.098325f}, + {-0.007328f, -0.006633f, -0.005516f, -0.004599f, -0.006212f, -0.012944f, -0.019712f, -0.012267f, 0.011010f, 0.016826f, -0.032596f, -0.108239f, -0.110945f, 0.010212f, 0.155530f, 0.161358f, 0.002569f, -0.158036f, -0.158582f, -0.022168f, 0.096234f, 0.102029f, 0.035418f, -0.022187f, -0.041382f, -0.034394f, -0.010242f, 0.027669f, 0.066023f, 0.089774f, 0.096851f, 0.093676f, 0.085029f, 0.075093f, 0.069304f, 0.068251f, 0.065239f, 0.053828f, 0.033768f, 0.008271f, -0.019582f, -0.046238f, -0.067687f, -0.081975f, -0.089777f, -0.092397f, -0.091138f, -0.088118f, -0.085559f, -0.084325f, -0.084372f, -0.085968f, -0.089285f, -0.093494f, -0.097292f, -0.099890f, -0.100991f, -0.100590f, -0.099298f, -0.098219f, -0.098141f, -0.099359f, -0.102222f, -0.107041f, -0.113405f, -0.120380f, -0.127461f, -0.134664f, -0.141768f, -0.148230f, -0.153822f, -0.158600f, -0.162259f, -0.164282f, -0.164806f, -0.164594f, -0.163969f, -0.162482f, -0.159958f, -0.157223f, -0.155192f, -0.153484f, -0.150650f, -0.145885f, -0.139922f, -0.133722f, -0.126676f, -0.116974f, -0.103893f, -0.088961f, -0.074475f, -0.061464f, -0.049642f, -0.038896f, -0.030151f, -0.024762f, + -0.023313f, -0.025007f, -0.028346f, -0.032647f, -0.038714f, -0.047598f, -0.058798f, -0.070133f, -0.079232f, -0.084838f, -0.087074f, -0.087043f, -0.085895f, -0.083734f, -0.079604f, -0.072780f, -0.063696f, -0.053433f, -0.042909f, -0.032749f, -0.023224f, -0.013965f, -0.004302f, 0.005932f, 0.016369f, 0.026824f, 0.037430f, 0.048223f, 0.059127f, 0.070106f, 0.080829f, 0.090562f, 0.098820f, 0.105730f, 0.111496f, 0.116170f, 0.120110f, 0.123911f, 0.127778f, 0.131714f, 0.136211f, 0.141890f, 0.148771f, 0.156783f, 0.166411f, 0.177897f, 0.190546f, 0.203691f, 0.217322f, 0.230936f, 0.243185f, 0.253500f, 0.262398f, 0.269552f, 0.273836f, 0.275598f, 0.275116f, 0.267347f, 0.243149f, 0.200413f, 0.151683f, 0.115625f, 0.100371f, 0.098325f} + } +}; +const float CRendBin_HOA3_HRIR_coeff_im_32kHz[16][BINAURAL_CHANNELS][160]={ + { + {-0.177155f, -0.484920f, -0.682869f, -0.761752f, -0.745718f, -0.674718f, -0.586917f, -0.482404f, -0.323473f, -0.100471f, 0.137830f, 0.347770f, 0.515555f, 0.566254f, 0.359251f, -0.086918f, -0.443496f, -0.353479f, 0.114347f, 0.475511f, 0.361546f, -0.104600f, -0.537424f, -0.735340f, -0.767713f, -0.738461f, -0.652325f, -0.500399f, -0.328661f, -0.180340f, -0.049198f, 0.080145f, 0.196917f, 0.288813f, 0.363706f, 0.431260f, 0.488625f, 0.533226f, 0.570447f, 0.603809f, 0.631651f, 0.654656f, 0.675784f, 0.694117f, 0.707260f, 0.716931f, 0.725662f, 0.732120f, 0.734801f, 0.735754f, 0.736687f, 0.736053f, 0.732755f, 0.728224f, 0.723115f, 0.716287f, 0.707887f, 0.699554f, 0.691466f, 0.682668f, 0.673667f, 0.665599f, 0.657918f, 0.649616f, 0.641313f, 0.633915f, 0.626849f, 0.619441f, 0.612311f, 0.606005f, 0.599945f, 0.593699f, 0.587698f, 0.582110f, 0.576431f, 0.570429f, 0.564305f, 0.558028f, 0.551423f, 0.544461f, 0.536876f, 0.528280f, 0.519027f, 0.509876f, 0.500638f, 0.490479f, 0.479610f, 0.469155f, 0.459295f, 0.449057f, 0.438057f, 0.427113f, 0.417049f, 0.407963f, 0.399612f, 0.391749f, + 0.384343f, 0.377949f, 0.373333f, 0.370329f, 0.367819f, 0.365141f, 0.362755f, 0.361280f, 0.360647f, 0.360347f, 0.359797f, 0.358471f, 0.356317f, 0.353956f, 0.351882f, 0.349712f, 0.346702f, 0.342595f, 0.337552f, 0.331788f, 0.325668f, 0.319629f, 0.313630f, 0.307181f, 0.300093f, 0.292690f, 0.285228f, 0.277698f, 0.270172f, 0.262734f, 0.255155f, 0.247216f, 0.239186f, 0.231499f, 0.224227f, 0.217314f, 0.210913f, 0.205028f, 0.199309f, 0.193614f, 0.188221f, 0.183218f, 0.178349f, 0.173647f, 0.169348f, 0.165068f, 0.160062f, 0.154266f, 0.147958f, 0.140640f, 0.131659f, 0.121348f, 0.109799f, 0.095537f, 0.077450f, 0.055356f, 0.024498f, -0.025904f, -0.097692f, -0.166710f, -0.194224f, -0.163866f, -0.098435f, -0.031004f}, + {-0.177155f, -0.484920f, -0.682869f, -0.761752f, -0.745718f, -0.674718f, -0.586917f, -0.482404f, -0.323473f, -0.100471f, 0.137830f, 0.347770f, 0.515555f, 0.566254f, 0.359251f, -0.086918f, -0.443496f, -0.353479f, 0.114347f, 0.475511f, 0.361546f, -0.104600f, -0.537424f, -0.735340f, -0.767713f, -0.738461f, -0.652325f, -0.500399f, -0.328661f, -0.180340f, -0.049198f, 0.080145f, 0.196917f, 0.288813f, 0.363706f, 0.431260f, 0.488625f, 0.533226f, 0.570447f, 0.603809f, 0.631651f, 0.654656f, 0.675784f, 0.694117f, 0.707260f, 0.716931f, 0.725662f, 0.732120f, 0.734801f, 0.735754f, 0.736687f, 0.736053f, 0.732755f, 0.728224f, 0.723115f, 0.716287f, 0.707887f, 0.699554f, 0.691466f, 0.682668f, 0.673667f, 0.665599f, 0.657918f, 0.649616f, 0.641313f, 0.633915f, 0.626849f, 0.619441f, 0.612311f, 0.606005f, 0.599945f, 0.593699f, 0.587698f, 0.582110f, 0.576431f, 0.570429f, 0.564305f, 0.558028f, 0.551423f, 0.544461f, 0.536876f, 0.528280f, 0.519027f, 0.509876f, 0.500638f, 0.490479f, 0.479610f, 0.469155f, 0.459295f, 0.449057f, 0.438057f, 0.427113f, 0.417049f, 0.407963f, 0.399612f, 0.391749f, + 0.384343f, 0.377949f, 0.373333f, 0.370329f, 0.367819f, 0.365141f, 0.362755f, 0.361280f, 0.360647f, 0.360347f, 0.359797f, 0.358471f, 0.356317f, 0.353956f, 0.351882f, 0.349712f, 0.346702f, 0.342595f, 0.337552f, 0.331788f, 0.325668f, 0.319629f, 0.313630f, 0.307181f, 0.300093f, 0.292690f, 0.285228f, 0.277698f, 0.270172f, 0.262734f, 0.255155f, 0.247216f, 0.239186f, 0.231499f, 0.224227f, 0.217314f, 0.210913f, 0.205028f, 0.199309f, 0.193614f, 0.188221f, 0.183218f, 0.178349f, 0.173647f, 0.169348f, 0.165068f, 0.160062f, 0.154266f, 0.147958f, 0.140640f, 0.131659f, 0.121348f, 0.109799f, 0.095537f, 0.077450f, 0.055356f, 0.024498f, -0.025904f, -0.097692f, -0.166710f, -0.194224f, -0.163866f, -0.098435f, -0.031004f} + }, + { + {0.139549f, 0.336827f, 0.308435f, 0.005808f, -0.462640f, -0.907220f, -1.191107f, -1.249724f, -1.052267f, -0.648374f, -0.184425f, 0.248777f, 0.689047f, 1.057228f, 0.989213f, 0.254777f, -0.678946f, -0.922096f, -0.180074f, 0.815838f, 1.130295f, 0.630480f, -0.085113f, -0.526462f, -0.708792f, -0.811530f, -0.847619f, -0.768858f, -0.635090f, -0.531932f, -0.451007f, -0.348401f, -0.234607f, -0.140241f, -0.058435f, 0.029303f, 0.116774f, 0.194059f, 0.268152f, 0.343788f, 0.412925f, 0.472537f, 0.528731f, 0.581041f, 0.623246f, 0.657416f, 0.689726f, 0.717764f, 0.736441f, 0.749186f, 0.761628f, 0.772404f, 0.779073f, 0.784280f, 0.789592f, 0.791949f, 0.790280f, 0.787315f, 0.783161f, 0.775216f, 0.764362f, 0.753702f, 0.742584f, 0.728749f, 0.713786f, 0.700391f, 0.687515f, 0.673424f, 0.659785f, 0.648526f, 0.638593f, 0.629023f, 0.621278f, 0.616302f, 0.612923f, 0.610405f, 0.609282f, 0.609387f, 0.609910f, 0.610809f, 0.611881f, 0.611943f, 0.610799f, 0.609839f, 0.609254f, 0.607395f, 0.603956f, 0.600774f, 0.598705f, 0.596760f, 0.594697f, 0.593483f, 0.593097f, 0.592548f, 0.591657f, 0.590509f, + 0.588008f, 0.583041f, 0.575878f, 0.566779f, 0.554791f, 0.539385f, 0.521605f, 0.502464f, 0.481918f, 0.460090f, 0.437796f, 0.415604f, 0.394034f, 0.374531f, 0.358494f, 0.345637f, 0.334728f, 0.325270f, 0.317257f, 0.310383f, 0.304694f, 0.300804f, 0.298429f, 0.295932f, 0.292037f, 0.286783f, 0.280539f, 0.273591f, 0.266789f, 0.260976f, 0.255734f, 0.250105f, 0.244196f, 0.238683f, 0.233398f, 0.227855f, 0.222384f, 0.217379f, 0.212359f, 0.206958f, 0.201751f, 0.197057f, 0.192250f, 0.187098f, 0.182271f, 0.177860f, 0.173126f, 0.168131f, 0.163596f, 0.158984f, 0.153008f, 0.145729f, 0.137439f, 0.126380f, 0.110802f, 0.090574f, 0.060909f, 0.008923f, -0.070270f, -0.152060f, -0.192269f, -0.168828f, -0.103696f, -0.033024f}, + {-0.139549f, -0.336827f, -0.308435f, -0.005808f, 0.462640f, 0.907220f, 1.191107f, 1.249724f, 1.052267f, 0.648374f, 0.184425f, -0.248777f, -0.689047f, -1.057228f, -0.989213f, -0.254777f, 0.678946f, 0.922096f, 0.180074f, -0.815838f, -1.130295f, -0.630480f, 0.085113f, 0.526462f, 0.708792f, 0.811530f, 0.847619f, 0.768858f, 0.635090f, 0.531932f, 0.451007f, 0.348401f, 0.234607f, 0.140241f, 0.058435f, -0.029303f, -0.116774f, -0.194059f, -0.268152f, -0.343788f, -0.412925f, -0.472537f, -0.528731f, -0.581041f, -0.623246f, -0.657416f, -0.689726f, -0.717764f, -0.736441f, -0.749186f, -0.761628f, -0.772404f, -0.779073f, -0.784280f, -0.789592f, -0.791949f, -0.790280f, -0.787315f, -0.783161f, -0.775216f, -0.764362f, -0.753702f, -0.742584f, -0.728749f, -0.713786f, -0.700391f, -0.687515f, -0.673424f, -0.659785f, -0.648526f, -0.638593f, -0.629023f, -0.621278f, -0.616302f, -0.612923f, -0.610405f, -0.609282f, -0.609387f, -0.609910f, -0.610809f, -0.611881f, -0.611943f, -0.610799f, -0.609839f, -0.609254f, -0.607395f, -0.603956f, -0.600774f, -0.598705f, -0.596760f, -0.594697f, -0.593483f, -0.593097f, -0.592548f, -0.591657f, -0.590509f, + -0.588008f, -0.583041f, -0.575878f, -0.566779f, -0.554791f, -0.539385f, -0.521605f, -0.502464f, -0.481918f, -0.460090f, -0.437796f, -0.415604f, -0.394034f, -0.374531f, -0.358494f, -0.345637f, -0.334728f, -0.325270f, -0.317257f, -0.310383f, -0.304694f, -0.300804f, -0.298429f, -0.295932f, -0.292037f, -0.286783f, -0.280539f, -0.273591f, -0.266789f, -0.260976f, -0.255734f, -0.250105f, -0.244196f, -0.238683f, -0.233398f, -0.227855f, -0.222384f, -0.217379f, -0.212359f, -0.206958f, -0.201751f, -0.197057f, -0.192250f, -0.187098f, -0.182271f, -0.177860f, -0.173126f, -0.168131f, -0.163596f, -0.158984f, -0.153008f, -0.145729f, -0.137439f, -0.126380f, -0.110802f, -0.090574f, -0.060909f, -0.008923f, 0.070270f, 0.152060f, 0.192269f, 0.168828f, 0.103696f, 0.033024f} + }, + { + {-0.016760f, -0.068127f, -0.130493f, -0.141089f, -0.067185f, 0.038675f, 0.094614f, 0.073852f, 0.012198f, -0.044998f, -0.074922f, -0.067552f, -0.018229f, 0.053871f, 0.096099f, 0.062126f, -0.025556f, -0.075695f, -0.021847f, 0.089982f, 0.140592f, 0.069052f, -0.066385f, -0.166455f, -0.193584f, -0.177205f, -0.151753f, -0.126106f, -0.100111f, -0.076682f, -0.055033f, -0.030919f, -0.006099f, 0.012632f, 0.022449f, 0.025150f, 0.022366f, 0.016890f, 0.015159f, 0.022388f, 0.037604f, 0.057012f, 0.079078f, 0.103587f, 0.129254f, 0.155163f, 0.182207f, 0.211436f, 0.242891f, 0.276638f, 0.312764f, 0.349989f, 0.386121f, 0.419912f, 0.450938f, 0.478114f, 0.499957f, 0.515976f, 0.526465f, 0.531211f, 0.529467f, 0.520866f, 0.505422f, 0.482804f, 0.452352f, 0.413839f, 0.367819f, 0.315251f, 0.257155f, 0.194777f, 0.129844f, 0.064384f, 0.000411f, -0.059995f, -0.114688f, -0.162166f, -0.202053f, -0.234163f, -0.257536f, -0.271541f, -0.277603f, -0.278229f, -0.274214f, -0.264528f, -0.249435f, -0.231884f, -0.214667f, -0.197504f, -0.178344f, -0.156843f, -0.135208f, -0.115847f, -0.099323f, -0.084813f, -0.071766f, -0.060680f, + -0.052653f, -0.048607f, -0.048842f, -0.052934f, -0.059893f, -0.068614f, -0.078462f, -0.089482f, -0.101882f, -0.115125f, -0.127566f, -0.137225f, -0.143085f, -0.145562f, -0.145628f, -0.143674f, -0.139331f, -0.132079f, -0.121698f, -0.108283f, -0.092209f, -0.074130f, -0.054844f, -0.035153f, -0.015868f, 0.002272f, 0.018784f, 0.033372f, 0.045644f, 0.055147f, 0.061721f, 0.065625f, 0.067291f, 0.067129f, 0.065460f, 0.062524f, 0.058672f, 0.054690f, 0.051618f, 0.050121f, 0.050200f, 0.051436f, 0.053045f, 0.053826f, 0.052774f, 0.049901f, 0.045925f, 0.041164f, 0.035363f, 0.028499f, 0.020965f, 0.012908f, 0.004149f, -0.005086f, -0.014196f, -0.023368f, -0.034007f, -0.046830f, -0.059022f, -0.064250f, -0.057433f, -0.040349f, -0.021042f, -0.006032f}, + {-0.016760f, -0.068127f, -0.130493f, -0.141089f, -0.067185f, 0.038675f, 0.094614f, 0.073852f, 0.012198f, -0.044998f, -0.074922f, -0.067552f, -0.018229f, 0.053871f, 0.096099f, 0.062126f, -0.025556f, -0.075695f, -0.021847f, 0.089982f, 0.140592f, 0.069052f, -0.066385f, -0.166455f, -0.193584f, -0.177205f, -0.151753f, -0.126106f, -0.100111f, -0.076682f, -0.055033f, -0.030919f, -0.006099f, 0.012632f, 0.022449f, 0.025150f, 0.022366f, 0.016890f, 0.015159f, 0.022388f, 0.037604f, 0.057012f, 0.079078f, 0.103587f, 0.129254f, 0.155163f, 0.182207f, 0.211436f, 0.242891f, 0.276638f, 0.312764f, 0.349989f, 0.386121f, 0.419912f, 0.450938f, 0.478114f, 0.499957f, 0.515976f, 0.526465f, 0.531211f, 0.529467f, 0.520866f, 0.505422f, 0.482804f, 0.452352f, 0.413839f, 0.367819f, 0.315251f, 0.257155f, 0.194777f, 0.129844f, 0.064384f, 0.000411f, -0.059995f, -0.114688f, -0.162166f, -0.202053f, -0.234163f, -0.257536f, -0.271541f, -0.277603f, -0.278229f, -0.274214f, -0.264528f, -0.249435f, -0.231884f, -0.214667f, -0.197504f, -0.178344f, -0.156843f, -0.135208f, -0.115847f, -0.099323f, -0.084813f, -0.071766f, -0.060680f, + -0.052653f, -0.048607f, -0.048842f, -0.052934f, -0.059893f, -0.068614f, -0.078462f, -0.089482f, -0.101882f, -0.115125f, -0.127566f, -0.137225f, -0.143085f, -0.145562f, -0.145628f, -0.143674f, -0.139331f, -0.132079f, -0.121698f, -0.108283f, -0.092209f, -0.074130f, -0.054844f, -0.035153f, -0.015868f, 0.002272f, 0.018784f, 0.033372f, 0.045644f, 0.055147f, 0.061721f, 0.065625f, 0.067291f, 0.067129f, 0.065460f, 0.062524f, 0.058672f, 0.054690f, 0.051618f, 0.050121f, 0.050200f, 0.051436f, 0.053045f, 0.053826f, 0.052774f, 0.049901f, 0.045925f, 0.041164f, 0.035363f, 0.028499f, 0.020965f, 0.012908f, 0.004149f, -0.005086f, -0.014196f, -0.023368f, -0.034007f, -0.046830f, -0.059022f, -0.064250f, -0.057433f, -0.040349f, -0.021042f, -0.006032f} + }, + { + {0.006216f, -0.000979f, -0.045405f, -0.098459f, -0.108142f, -0.058042f, 0.002286f, 0.006399f, -0.050505f, -0.107869f, -0.115965f, -0.079002f, -0.014058f, 0.076297f, 0.153748f, 0.129221f, -0.022377f, -0.165863f, -0.124719f, 0.094586f, 0.284198f, 0.268252f, 0.080217f, -0.126623f, -0.267666f, -0.362720f, -0.439083f, -0.483302f, -0.481861f, -0.448478f, -0.398948f, -0.332421f, -0.246125f, -0.147271f, -0.044899f, 0.056214f, 0.151234f, 0.234458f, 0.303629f, 0.359457f, 0.402431f, 0.433847f, 0.456921f, 0.473698f, 0.483757f, 0.487573f, 0.487588f, 0.484776f, 0.477584f, 0.465086f, 0.448287f, 0.428309f, 0.406263f, 0.384767f, 0.366877f, 0.353378f, 0.342840f, 0.333747f, 0.325088f, 0.315678f, 0.304608f, 0.292048f, 0.278687f, 0.264811f, 0.250511f, 0.236166f, 0.222031f, 0.207593f, 0.191859f, 0.174275f, 0.155036f, 0.134348f, 0.111748f, 0.086766f, 0.060081f, 0.033085f, 0.006337f, -0.020341f, -0.046077f, -0.068901f, -0.087990f, -0.104276f, -0.118054f, -0.127804f, -0.132542f, -0.133724f, -0.133430f, -0.132008f, -0.128923f, -0.124704f, -0.120371f, -0.115592f, -0.108930f, -0.099692f, -0.088366f, -0.075241f, + -0.059512f, -0.040057f, -0.016699f, 0.009565f, 0.037530f, 0.066848f, 0.097910f, 0.130575f, 0.163378f, 0.194394f, 0.222759f, 0.248920f, 0.273442f, 0.295928f, 0.315131f, 0.329956f, 0.340466f, 0.348121f, 0.354815f, 0.361328f, 0.366754f, 0.369576f, 0.369190f, 0.366386f, 0.362766f, 0.359901f, 0.358565f, 0.358337f, 0.358068f, 0.356967f, 0.355150f, 0.353203f, 0.351625f, 0.350678f, 0.350257f, 0.349702f, 0.348075f, 0.344733f, 0.339480f, 0.332348f, 0.323551f, 0.313435f, 0.302117f, 0.289340f, 0.274852f, 0.258681f, 0.241042f, 0.222363f, 0.203342f, 0.184581f, 0.166338f, 0.148863f, 0.132320f, 0.116204f, 0.099819f, 0.082819f, 0.062865f, 0.033748f, -0.008051f, -0.052501f, -0.078525f, -0.073596f, -0.046585f, -0.015014f}, + {0.006216f, -0.000979f, -0.045405f, -0.098459f, -0.108142f, -0.058042f, 0.002286f, 0.006399f, -0.050505f, -0.107869f, -0.115965f, -0.079002f, -0.014058f, 0.076297f, 0.153748f, 0.129221f, -0.022377f, -0.165863f, -0.124719f, 0.094586f, 0.284198f, 0.268252f, 0.080217f, -0.126623f, -0.267666f, -0.362720f, -0.439083f, -0.483302f, -0.481861f, -0.448478f, -0.398948f, -0.332421f, -0.246125f, -0.147271f, -0.044899f, 0.056214f, 0.151234f, 0.234458f, 0.303629f, 0.359457f, 0.402431f, 0.433847f, 0.456921f, 0.473698f, 0.483757f, 0.487573f, 0.487588f, 0.484776f, 0.477584f, 0.465086f, 0.448287f, 0.428309f, 0.406263f, 0.384767f, 0.366877f, 0.353378f, 0.342840f, 0.333747f, 0.325088f, 0.315678f, 0.304608f, 0.292048f, 0.278687f, 0.264811f, 0.250511f, 0.236166f, 0.222031f, 0.207593f, 0.191859f, 0.174275f, 0.155036f, 0.134348f, 0.111748f, 0.086766f, 0.060081f, 0.033085f, 0.006337f, -0.020341f, -0.046077f, -0.068901f, -0.087990f, -0.104276f, -0.118054f, -0.127804f, -0.132542f, -0.133724f, -0.133430f, -0.132008f, -0.128923f, -0.124704f, -0.120371f, -0.115592f, -0.108930f, -0.099692f, -0.088366f, -0.075241f, + -0.059512f, -0.040057f, -0.016699f, 0.009565f, 0.037530f, 0.066848f, 0.097910f, 0.130575f, 0.163378f, 0.194394f, 0.222759f, 0.248920f, 0.273442f, 0.295928f, 0.315131f, 0.329956f, 0.340466f, 0.348121f, 0.354815f, 0.361328f, 0.366754f, 0.369576f, 0.369190f, 0.366386f, 0.362766f, 0.359901f, 0.358565f, 0.358337f, 0.358068f, 0.356967f, 0.355150f, 0.353203f, 0.351625f, 0.350678f, 0.350257f, 0.349702f, 0.348075f, 0.344733f, 0.339480f, 0.332348f, 0.323551f, 0.313435f, 0.302117f, 0.289340f, 0.274852f, 0.258681f, 0.241042f, 0.222363f, 0.203342f, 0.184581f, 0.166338f, 0.148863f, 0.132320f, 0.116204f, 0.099819f, 0.082819f, 0.062865f, 0.033748f, -0.008051f, -0.052501f, -0.078525f, -0.073596f, -0.046585f, -0.015014f} + }, + { + {-0.004287f, -0.004125f, 0.010669f, 0.024630f, 0.019494f, 0.000957f, -0.007771f, -0.004086f, -0.018999f, -0.078706f, -0.163526f, -0.211376f, -0.156788f, 0.013090f, 0.206855f, 0.257968f, 0.082065f, -0.182440f, -0.272081f, -0.081322f, 0.212807f, 0.354516f, 0.275100f, 0.096863f, -0.061422f, -0.184431f, -0.290052f, -0.362546f, -0.382821f, -0.365049f, -0.332356f, -0.287833f, -0.227815f, -0.159321f, -0.089659f, -0.016005f, 0.063671f, 0.140956f, 0.205111f, 0.252511f, 0.284711f, 0.304370f, 0.315455f, 0.322285f, 0.326832f, 0.329503f, 0.331399f, 0.333108f, 0.333026f, 0.329471f, 0.322961f, 0.314750f, 0.305096f, 0.294458f, 0.284464f, 0.276331f, 0.269753f, 0.264070f, 0.259113f, 0.254491f, 0.249431f, 0.243603f, 0.237011f, 0.229139f, 0.219355f, 0.207972f, 0.195732f, 0.182410f, 0.167075f, 0.149600f, 0.130686f, 0.110376f, 0.087751f, 0.062438f, 0.035361f, 0.007458f, -0.021421f, -0.051426f, -0.081166f, -0.108532f, -0.132991f, -0.155787f, -0.177450f, -0.196472f, -0.211501f, -0.223729f, -0.235413f, -0.246432f, -0.254147f, -0.256866f, -0.255699f, -0.252400f, -0.246930f, -0.238183f, -0.226128f, -0.212153f, + -0.197762f, -0.183576f, -0.169356f, -0.154687f, -0.139838f, -0.125919f, -0.113952f, -0.104109f, -0.096147f, -0.089874f, -0.084624f, -0.079081f, -0.072485f, -0.065470f, -0.059088f, -0.053584f, -0.048459f, -0.042892f, -0.035834f, -0.026742f, -0.016583f, -0.007210f, 0.000460f, 0.006925f, 0.013101f, 0.019829f, 0.027937f, 0.037640f, 0.048171f, 0.058820f, 0.069767f, 0.081298f, 0.093098f, 0.104818f, 0.116218f, 0.126365f, 0.133907f, 0.138397f, 0.140204f, 0.139366f, 0.135883f, 0.130589f, 0.124266f, 0.116642f, 0.107629f, 0.098425f, 0.090176f, 0.083055f, 0.077635f, 0.075176f, 0.075705f, 0.078026f, 0.081969f, 0.088024f, 0.095261f, 0.102733f, 0.111115f, 0.118029f, 0.114164f, 0.091680f, 0.056373f, 0.024417f, 0.006512f, 0.000770f}, + {0.004287f, 0.004125f, -0.010669f, -0.024630f, -0.019494f, -0.000957f, 0.007771f, 0.004086f, 0.018999f, 0.078706f, 0.163526f, 0.211376f, 0.156788f, -0.013090f, -0.206855f, -0.257968f, -0.082065f, 0.182440f, 0.272081f, 0.081322f, -0.212807f, -0.354516f, -0.275100f, -0.096863f, 0.061422f, 0.184431f, 0.290052f, 0.362546f, 0.382821f, 0.365049f, 0.332356f, 0.287833f, 0.227815f, 0.159321f, 0.089659f, 0.016005f, -0.063671f, -0.140956f, -0.205111f, -0.252511f, -0.284711f, -0.304370f, -0.315455f, -0.322285f, -0.326832f, -0.329503f, -0.331399f, -0.333108f, -0.333026f, -0.329471f, -0.322961f, -0.314750f, -0.305096f, -0.294458f, -0.284464f, -0.276331f, -0.269753f, -0.264070f, -0.259113f, -0.254491f, -0.249431f, -0.243603f, -0.237011f, -0.229139f, -0.219355f, -0.207972f, -0.195732f, -0.182410f, -0.167075f, -0.149600f, -0.130686f, -0.110376f, -0.087751f, -0.062438f, -0.035361f, -0.007458f, 0.021421f, 0.051426f, 0.081166f, 0.108532f, 0.132991f, 0.155787f, 0.177450f, 0.196472f, 0.211501f, 0.223729f, 0.235413f, 0.246432f, 0.254147f, 0.256866f, 0.255699f, 0.252400f, 0.246930f, 0.238183f, 0.226128f, 0.212153f, + 0.197762f, 0.183576f, 0.169356f, 0.154687f, 0.139838f, 0.125919f, 0.113952f, 0.104109f, 0.096147f, 0.089874f, 0.084624f, 0.079081f, 0.072485f, 0.065470f, 0.059088f, 0.053584f, 0.048459f, 0.042892f, 0.035834f, 0.026742f, 0.016583f, 0.007210f, -0.000460f, -0.006925f, -0.013101f, -0.019829f, -0.027937f, -0.037640f, -0.048171f, -0.058820f, -0.069767f, -0.081298f, -0.093098f, -0.104818f, -0.116218f, -0.126365f, -0.133907f, -0.138397f, -0.140204f, -0.139366f, -0.135883f, -0.130589f, -0.124266f, -0.116642f, -0.107629f, -0.098425f, -0.090176f, -0.083055f, -0.077635f, -0.075176f, -0.075705f, -0.078026f, -0.081969f, -0.088024f, -0.095261f, -0.102733f, -0.111115f, -0.118029f, -0.114164f, -0.091680f, -0.056373f, -0.024417f, -0.006512f, -0.000770f} + }, + { + {-0.021647f, -0.023586f, 0.024030f, 0.034286f, -0.023210f, -0.048883f, 0.041004f, 0.162430f, 0.151420f, -0.019026f, -0.196878f, -0.228185f, -0.105491f, 0.063785f, 0.163457f, 0.131089f, -0.006547f, -0.126856f, -0.104754f, 0.046404f, 0.175190f, 0.165514f, 0.060007f, -0.021876f, -0.031457f, -0.005672f, 0.019840f, 0.046199f, 0.074668f, 0.089172f, 0.080103f, 0.054860f, 0.022313f, -0.014010f, -0.049302f, -0.079262f, -0.106213f, -0.133194f, -0.155736f, -0.166838f, -0.165427f, -0.154608f, -0.136822f, -0.115133f, -0.094431f, -0.077550f, -0.063253f, -0.049405f, -0.034984f, -0.018856f, -0.000016f, 0.020853f, 0.042649f, 0.066048f, 0.092202f, 0.120165f, 0.147513f, 0.172493f, 0.194076f, 0.210899f, 0.221573f, 0.225505f, 0.222686f, 0.213027f, 0.196166f, 0.171640f, 0.139274f, 0.099475f, 0.052952f, 0.000374f, -0.057162f, -0.117584f, -0.178302f, -0.236900f, -0.291078f, -0.338764f, -0.378809f, -0.410753f, -0.433773f, -0.447178f, -0.452109f, -0.450928f, -0.444375f, -0.431188f, -0.411190f, -0.386779f, -0.360327f, -0.331827f, -0.300282f, -0.265894f, -0.229528f, -0.191072f, -0.149793f, -0.105819f, -0.060219f, -0.013836f, + 0.033000f, 0.079560f, 0.124221f, 0.165296f, 0.202053f, 0.234481f, 0.261993f, 0.282718f, 0.294593f, 0.297426f, 0.293710f, 0.286928f, 0.278788f, 0.268248f, 0.253380f, 0.233961f, 0.212129f, 0.190864f, 0.172155f, 0.156250f, 0.142108f, 0.128607f, 0.115645f, 0.104097f, 0.094743f, 0.087526f, 0.081734f, 0.076398f, 0.070494f, 0.063326f, 0.054855f, 0.045303f, 0.034575f, 0.022541f, 0.009630f, -0.003393f, -0.015973f, -0.027652f, -0.037849f, -0.046228f, -0.052913f, -0.058025f, -0.061573f, -0.063948f, -0.065787f, -0.067201f, -0.067897f, -0.068076f, -0.068265f, -0.068365f, -0.067848f, -0.066716f, -0.065221f, -0.063029f, -0.059813f, -0.056114f, -0.052102f, -0.046012f, -0.035782f, -0.022435f, -0.010202f, -0.002684f, 0.000040f, 0.000220f}, + {0.021647f, 0.023586f, -0.024030f, -0.034286f, 0.023210f, 0.048883f, -0.041004f, -0.162430f, -0.151420f, 0.019026f, 0.196878f, 0.228185f, 0.105491f, -0.063785f, -0.163457f, -0.131089f, 0.006547f, 0.126856f, 0.104754f, -0.046404f, -0.175190f, -0.165514f, -0.060007f, 0.021876f, 0.031457f, 0.005672f, -0.019840f, -0.046199f, -0.074668f, -0.089172f, -0.080103f, -0.054860f, -0.022313f, 0.014010f, 0.049302f, 0.079262f, 0.106213f, 0.133194f, 0.155736f, 0.166838f, 0.165427f, 0.154608f, 0.136822f, 0.115133f, 0.094431f, 0.077550f, 0.063253f, 0.049405f, 0.034984f, 0.018856f, 0.000016f, -0.020853f, -0.042649f, -0.066048f, -0.092202f, -0.120165f, -0.147513f, -0.172493f, -0.194076f, -0.210899f, -0.221573f, -0.225505f, -0.222686f, -0.213027f, -0.196166f, -0.171640f, -0.139274f, -0.099475f, -0.052952f, -0.000374f, 0.057162f, 0.117584f, 0.178302f, 0.236900f, 0.291078f, 0.338764f, 0.378809f, 0.410753f, 0.433773f, 0.447178f, 0.452109f, 0.450928f, 0.444375f, 0.431188f, 0.411190f, 0.386779f, 0.360327f, 0.331827f, 0.300282f, 0.265894f, 0.229528f, 0.191072f, 0.149793f, 0.105819f, 0.060219f, 0.013836f, + -0.033000f, -0.079560f, -0.124221f, -0.165296f, -0.202053f, -0.234481f, -0.261993f, -0.282718f, -0.294593f, -0.297426f, -0.293710f, -0.286928f, -0.278788f, -0.268248f, -0.253380f, -0.233961f, -0.212129f, -0.190864f, -0.172155f, -0.156250f, -0.142108f, -0.128607f, -0.115645f, -0.104097f, -0.094743f, -0.087526f, -0.081734f, -0.076398f, -0.070494f, -0.063326f, -0.054855f, -0.045303f, -0.034575f, -0.022541f, -0.009630f, 0.003393f, 0.015973f, 0.027652f, 0.037849f, 0.046228f, 0.052913f, 0.058025f, 0.061573f, 0.063948f, 0.065787f, 0.067201f, 0.067897f, 0.068076f, 0.068265f, 0.068365f, 0.067848f, 0.066716f, 0.065221f, 0.063029f, 0.059813f, 0.056114f, 0.052102f, 0.046012f, 0.035782f, 0.022435f, 0.010202f, 0.002684f, -0.000040f, -0.000220f} + }, + { + {0.003609f, -0.005875f, -0.035270f, -0.050705f, -0.040591f, -0.034798f, -0.044444f, -0.025022f, 0.068226f, 0.216792f, 0.351580f, 0.390054f, 0.251908f, -0.072078f, -0.407851f, -0.461577f, -0.131618f, 0.295028f, 0.412417f, 0.154332f, -0.160841f, -0.245404f, -0.134932f, -0.021902f, 0.026617f, 0.066919f, 0.111869f, 0.111579f, 0.060602f, 0.013650f, 0.002021f, 0.006513f, 0.007751f, 0.009075f, 0.011723f, 0.007129f, -0.005433f, -0.018170f, -0.029080f, -0.041517f, -0.055476f, -0.069814f, -0.085898f, -0.102492f, -0.114887f, -0.122644f, -0.130213f, -0.138731f, -0.145200f, -0.149398f, -0.153881f, -0.158200f, -0.159672f, -0.158092f, -0.154425f, -0.147404f, -0.135655f, -0.120319f, -0.102543f, -0.081543f, -0.057017f, -0.030152f, -0.001234f, 0.030441f, 0.064037f, 0.097610f, 0.130500f, 0.162490f, 0.191732f, 0.216128f, 0.235437f, 0.249873f, 0.258237f, 0.259193f, 0.252784f, 0.239464f, 0.219178f, 0.192076f, 0.158787f, 0.119949f, 0.076587f, 0.030361f, -0.017694f, -0.067610f, -0.118812f, -0.169500f, -0.218464f, -0.265819f, -0.311413f, -0.354364f, -0.394359f, -0.431201f, -0.462908f, -0.486452f, -0.500620f, -0.506335f, + -0.504246f, -0.493652f, -0.473634f, -0.444204f, -0.407040f, -0.365932f, -0.325349f, -0.287620f, -0.252527f, -0.220028f, -0.191976f, -0.170773f, -0.157796f, -0.153357f, -0.156778f, -0.166233f, -0.179639f, -0.195792f, -0.214111f, -0.233906f, -0.254592f, -0.275719f, -0.296074f, -0.313716f, -0.327512f, -0.337813f, -0.345431f, -0.351001f, -0.355309f, -0.358974f, -0.361805f, -0.363501f, -0.364630f, -0.365878f, -0.366858f, -0.366727f, -0.365312f, -0.362755f, -0.358891f, -0.353770f, -0.347869f, -0.341110f, -0.332548f, -0.321368f, -0.307255f, -0.289895f, -0.269324f, -0.246517f, -0.222440f, -0.197100f, -0.170673f, -0.144380f, -0.118840f, -0.093149f, -0.066936f, -0.040482f, -0.010543f, 0.029314f, 0.077898f, 0.118098f, 0.127883f, 0.102368f, 0.059162f, 0.018211f}, + {0.003609f, -0.005875f, -0.035270f, -0.050705f, -0.040591f, -0.034798f, -0.044444f, -0.025022f, 0.068226f, 0.216792f, 0.351580f, 0.390054f, 0.251908f, -0.072078f, -0.407851f, -0.461577f, -0.131618f, 0.295028f, 0.412417f, 0.154332f, -0.160841f, -0.245404f, -0.134932f, -0.021902f, 0.026617f, 0.066919f, 0.111869f, 0.111579f, 0.060602f, 0.013650f, 0.002021f, 0.006513f, 0.007751f, 0.009075f, 0.011723f, 0.007129f, -0.005433f, -0.018170f, -0.029080f, -0.041517f, -0.055476f, -0.069814f, -0.085898f, -0.102492f, -0.114887f, -0.122644f, -0.130213f, -0.138731f, -0.145200f, -0.149398f, -0.153881f, -0.158200f, -0.159672f, -0.158092f, -0.154425f, -0.147404f, -0.135655f, -0.120319f, -0.102543f, -0.081543f, -0.057017f, -0.030152f, -0.001234f, 0.030441f, 0.064037f, 0.097610f, 0.130500f, 0.162490f, 0.191732f, 0.216128f, 0.235437f, 0.249873f, 0.258237f, 0.259193f, 0.252784f, 0.239464f, 0.219178f, 0.192076f, 0.158787f, 0.119949f, 0.076587f, 0.030361f, -0.017694f, -0.067610f, -0.118812f, -0.169500f, -0.218464f, -0.265819f, -0.311413f, -0.354364f, -0.394359f, -0.431201f, -0.462908f, -0.486452f, -0.500620f, -0.506335f, + -0.504246f, -0.493652f, -0.473634f, -0.444204f, -0.407040f, -0.365932f, -0.325349f, -0.287620f, -0.252527f, -0.220028f, -0.191976f, -0.170773f, -0.157796f, -0.153357f, -0.156778f, -0.166233f, -0.179639f, -0.195792f, -0.214111f, -0.233906f, -0.254592f, -0.275719f, -0.296074f, -0.313716f, -0.327512f, -0.337813f, -0.345431f, -0.351001f, -0.355309f, -0.358974f, -0.361805f, -0.363501f, -0.364630f, -0.365878f, -0.366858f, -0.366727f, -0.365312f, -0.362755f, -0.358891f, -0.353770f, -0.347869f, -0.341110f, -0.332548f, -0.321368f, -0.307255f, -0.289895f, -0.269324f, -0.246517f, -0.222440f, -0.197100f, -0.170673f, -0.144380f, -0.118840f, -0.093149f, -0.066936f, -0.040482f, -0.010543f, 0.029314f, 0.077898f, 0.118098f, 0.127883f, 0.102368f, 0.059162f, 0.018211f} + }, + { + {-0.035571f, -0.082138f, -0.071881f, -0.003092f, 0.101819f, 0.191638f, 0.193745f, 0.076115f, -0.091802f, -0.185433f, -0.151170f, -0.053032f, 0.018984f, 0.043815f, 0.047820f, 0.036034f, -0.003122f, -0.047268f, -0.050528f, -0.006921f, 0.038234f, 0.049115f, 0.039088f, 0.038101f, 0.048336f, 0.050095f, 0.033245f, 0.003517f, -0.032931f, -0.074051f, -0.113659f, -0.141573f, -0.153955f, -0.156842f, -0.158152f, -0.160297f, -0.160824f, -0.156125f, -0.143114f, -0.120343f, -0.089839f, -0.056855f, -0.026374f, -0.000211f, 0.022161f, 0.041369f, 0.057834f, 0.072513f, 0.086354f, 0.099354f, 0.111114f, 0.121809f, 0.131727f, 0.140502f, 0.147687f, 0.153512f, 0.158207f, 0.161156f, 0.161507f, 0.159270f, 0.155236f, 0.150152f, 0.144509f, 0.139018f, 0.134862f, 0.133145f, 0.133984f, 0.136505f, 0.140154f, 0.145498f, 0.153052f, 0.161967f, 0.171013f, 0.180271f, 0.190456f, 0.200982f, 0.210096f, 0.216588f, 0.220074f, 0.219946f, 0.215202f, 0.205145f, 0.189615f, 0.168961f, 0.143969f, 0.114996f, 0.081374f, 0.043024f, 0.002201f, -0.038478f, -0.079680f, -0.124703f, -0.174812f, -0.227318f, -0.278767f, -0.328165f, + -0.376275f, -0.423057f, -0.466602f, -0.504310f, -0.535025f, -0.559812f, -0.579998f, -0.594737f, -0.601786f, -0.600642f, -0.593485f, -0.582907f, -0.569794f, -0.553260f, -0.531574f, -0.503599f, -0.470364f, -0.434785f, -0.399160f, -0.363704f, -0.327884f, -0.291902f, -0.256412f, -0.222128f, -0.190043f, -0.160765f, -0.133592f, -0.107383f, -0.081970f, -0.057569f, -0.033581f, -0.009158f, 0.015876f, 0.041442f, 0.067251f, 0.091897f, 0.113638f, 0.132541f, 0.150206f, 0.167416f, 0.183901f, 0.199680f, 0.214328f, 0.225868f, 0.232832f, 0.236330f, 0.238118f, 0.238385f, 0.237189f, 0.235549f, 0.233292f, 0.228644f, 0.221316f, 0.213017f, 0.204613f, 0.196295f, 0.189029f, 0.180265f, 0.160578f, 0.123113f, 0.075941f, 0.036564f, 0.013988f, 0.003474f}, + {-0.035571f, -0.082138f, -0.071881f, -0.003092f, 0.101819f, 0.191638f, 0.193745f, 0.076115f, -0.091802f, -0.185433f, -0.151170f, -0.053032f, 0.018984f, 0.043815f, 0.047820f, 0.036034f, -0.003122f, -0.047268f, -0.050528f, -0.006921f, 0.038234f, 0.049115f, 0.039088f, 0.038101f, 0.048336f, 0.050095f, 0.033245f, 0.003517f, -0.032931f, -0.074051f, -0.113659f, -0.141573f, -0.153955f, -0.156842f, -0.158152f, -0.160297f, -0.160824f, -0.156125f, -0.143114f, -0.120343f, -0.089839f, -0.056855f, -0.026374f, -0.000211f, 0.022161f, 0.041369f, 0.057834f, 0.072513f, 0.086354f, 0.099354f, 0.111114f, 0.121809f, 0.131727f, 0.140502f, 0.147687f, 0.153512f, 0.158207f, 0.161156f, 0.161507f, 0.159270f, 0.155236f, 0.150152f, 0.144509f, 0.139018f, 0.134862f, 0.133145f, 0.133984f, 0.136505f, 0.140154f, 0.145498f, 0.153052f, 0.161967f, 0.171013f, 0.180271f, 0.190456f, 0.200982f, 0.210096f, 0.216588f, 0.220074f, 0.219946f, 0.215202f, 0.205145f, 0.189615f, 0.168961f, 0.143969f, 0.114996f, 0.081374f, 0.043024f, 0.002201f, -0.038478f, -0.079680f, -0.124703f, -0.174812f, -0.227318f, -0.278767f, -0.328165f, + -0.376275f, -0.423057f, -0.466602f, -0.504310f, -0.535025f, -0.559812f, -0.579998f, -0.594737f, -0.601786f, -0.600642f, -0.593485f, -0.582907f, -0.569794f, -0.553260f, -0.531574f, -0.503599f, -0.470364f, -0.434785f, -0.399160f, -0.363704f, -0.327884f, -0.291902f, -0.256412f, -0.222128f, -0.190043f, -0.160765f, -0.133592f, -0.107383f, -0.081970f, -0.057569f, -0.033581f, -0.009158f, 0.015876f, 0.041442f, 0.067251f, 0.091897f, 0.113638f, 0.132541f, 0.150206f, 0.167416f, 0.183901f, 0.199680f, 0.214328f, 0.225868f, 0.232832f, 0.236330f, 0.238118f, 0.238385f, 0.237189f, 0.235549f, 0.233292f, 0.228644f, 0.221316f, 0.213017f, 0.204613f, 0.196295f, 0.189029f, 0.180265f, 0.160578f, 0.123113f, 0.075941f, 0.036564f, 0.013988f, 0.003474f} + }, + { + {0.042551f, 0.061299f, -0.028672f, -0.144580f, -0.225015f, -0.285627f, -0.304011f, -0.184177f, 0.097749f, 0.418361f, 0.636609f, 0.684969f, 0.487187f, -0.018125f, -0.625221f, -0.833372f, -0.352995f, 0.433022f, 0.798844f, 0.478184f, -0.106003f, -0.434667f, -0.441046f, -0.368821f, -0.347324f, -0.318444f, -0.244373f, -0.171635f, -0.121000f, -0.059037f, 0.023724f, 0.097010f, 0.147728f, 0.189866f, 0.225827f, 0.243381f, 0.241962f, 0.230347f, 0.209235f, 0.177802f, 0.144642f, 0.116772f, 0.090397f, 0.061815f, 0.034477f, 0.010059f, -0.014474f, -0.038175f, -0.056107f, -0.068563f, -0.080545f, -0.093619f, -0.106370f, -0.119695f, -0.134742f, -0.149473f, -0.162326f, -0.174807f, -0.187244f, -0.197268f, -0.204420f, -0.210807f, -0.216408f, -0.219069f, -0.218931f, -0.217754f, -0.214932f, -0.208841f, -0.200539f, -0.192118f, -0.183496f, -0.174075f, -0.165039f, -0.157372f, -0.150168f, -0.142655f, -0.135395f, -0.128631f, -0.122082f, -0.116426f, -0.112435f, -0.109121f, -0.105059f, -0.100419f, -0.095650f, -0.089752f, -0.081852f, -0.072848f, -0.064030f, -0.055849f, -0.048935f, -0.044367f, -0.042466f, -0.043236f, -0.047696f, -0.056506f, + -0.067688f, -0.077997f, -0.086044f, -0.092096f, -0.095584f, -0.094704f, -0.087898f, -0.074555f, -0.055146f, -0.031374f, -0.005109f, 0.023181f, 0.053769f, 0.085647f, 0.116644f, 0.145301f, 0.171246f, 0.194304f, 0.214606f, 0.232833f, 0.249102f, 0.262412f, 0.272200f, 0.279515f, 0.285963f, 0.292502f, 0.299498f, 0.306603f, 0.312397f, 0.315556f, 0.316484f, 0.316658f, 0.316768f, 0.316676f, 0.316453f, 0.316057f, 0.314697f, 0.311795f, 0.307878f, 0.303586f, 0.298738f, 0.293100f, 0.286921f, 0.280025f, 0.271517f, 0.260915f, 0.248546f, 0.234604f, 0.218918f, 0.201792f, 0.184003f, 0.165897f, 0.147257f, 0.128036f, 0.108579f, 0.088849f, 0.067408f, 0.041787f, 0.011933f, -0.015821f, -0.031241f, -0.029810f, -0.017985f, -0.005466f}, + {0.042551f, 0.061299f, -0.028672f, -0.144580f, -0.225015f, -0.285627f, -0.304011f, -0.184177f, 0.097749f, 0.418361f, 0.636609f, 0.684969f, 0.487187f, -0.018125f, -0.625221f, -0.833372f, -0.352995f, 0.433022f, 0.798844f, 0.478184f, -0.106003f, -0.434667f, -0.441046f, -0.368821f, -0.347324f, -0.318444f, -0.244373f, -0.171635f, -0.121000f, -0.059037f, 0.023724f, 0.097010f, 0.147728f, 0.189866f, 0.225827f, 0.243381f, 0.241962f, 0.230347f, 0.209235f, 0.177802f, 0.144642f, 0.116772f, 0.090397f, 0.061815f, 0.034477f, 0.010059f, -0.014474f, -0.038175f, -0.056107f, -0.068563f, -0.080545f, -0.093619f, -0.106370f, -0.119695f, -0.134742f, -0.149473f, -0.162326f, -0.174807f, -0.187244f, -0.197268f, -0.204420f, -0.210807f, -0.216408f, -0.219069f, -0.218931f, -0.217754f, -0.214932f, -0.208841f, -0.200539f, -0.192118f, -0.183496f, -0.174075f, -0.165039f, -0.157372f, -0.150168f, -0.142655f, -0.135395f, -0.128631f, -0.122082f, -0.116426f, -0.112435f, -0.109121f, -0.105059f, -0.100419f, -0.095650f, -0.089752f, -0.081852f, -0.072848f, -0.064030f, -0.055849f, -0.048935f, -0.044367f, -0.042466f, -0.043236f, -0.047696f, -0.056506f, + -0.067688f, -0.077997f, -0.086044f, -0.092096f, -0.095584f, -0.094704f, -0.087898f, -0.074555f, -0.055146f, -0.031374f, -0.005109f, 0.023181f, 0.053769f, 0.085647f, 0.116644f, 0.145301f, 0.171246f, 0.194304f, 0.214606f, 0.232833f, 0.249102f, 0.262412f, 0.272200f, 0.279515f, 0.285963f, 0.292502f, 0.299498f, 0.306603f, 0.312397f, 0.315556f, 0.316484f, 0.316658f, 0.316768f, 0.316676f, 0.316453f, 0.316057f, 0.314697f, 0.311795f, 0.307878f, 0.303586f, 0.298738f, 0.293100f, 0.286921f, 0.280025f, 0.271517f, 0.260915f, 0.248546f, 0.234604f, 0.218918f, 0.201792f, 0.184003f, 0.165897f, 0.147257f, 0.128036f, 0.108579f, 0.088849f, 0.067408f, 0.041787f, 0.011933f, -0.015821f, -0.031241f, -0.029810f, -0.017985f, -0.005466f} + }, + { + {0.005047f, 0.021126f, 0.045009f, 0.070453f, 0.091218f, 0.079137f, -0.005705f, -0.148208f, -0.279248f, -0.366201f, -0.399292f, -0.268604f, 0.145211f, 0.646500f, 0.731126f, 0.172486f, -0.552664f, -0.733258f, -0.260523f, 0.299749f, 0.452278f, 0.272382f, 0.101891f, 0.059461f, 0.035030f, -0.031425f, -0.085084f, -0.094988f, -0.094701f, -0.101435f, -0.094303f, -0.066565f, -0.037269f, -0.017081f, -0.001454f, 0.010929f, 0.018070f, 0.023255f, 0.028455f, 0.029520f, 0.025899f, 0.023522f, 0.023990f, 0.022461f, 0.017906f, 0.014746f, 0.014269f, 0.013796f, 0.013307f, 0.015082f, 0.018457f, 0.020882f, 0.021919f, 0.021991f, 0.020056f, 0.015522f, 0.009547f, 0.002759f, -0.005372f, -0.014351f, -0.022889f, -0.031164f, -0.040159f, -0.049486f, -0.058237f, -0.066734f, -0.075464f, -0.083764f, -0.091121f, -0.098138f, -0.105200f, -0.111892f, -0.118289f, -0.125068f, -0.132105f, -0.138497f, -0.143784f, -0.147831f, -0.150121f, -0.150387f, -0.149069f, -0.146131f, -0.140481f, -0.131487f, -0.119994f, -0.107110f, -0.092969f, -0.077185f, -0.059714f, -0.041087f, -0.022428f, -0.005113f, 0.010051f, 0.022960f, 0.033330f, 0.040497f, + 0.044394f, 0.045809f, 0.045372f, 0.043155f, 0.039528f, 0.035586f, 0.032440f, 0.030494f, 0.029398f, 0.028485f, 0.027544f, 0.027340f, 0.028936f, 0.032511f, 0.037335f, 0.042789f, 0.048810f, 0.055598f, 0.063500f, 0.072809f, 0.083162f, 0.093560f, 0.103403f, 0.113024f, 0.123077f, 0.134014f, 0.146084f, 0.159017f, 0.171851f, 0.183812f, 0.195106f, 0.206245f, 0.217176f, 0.227589f, 0.237250f, 0.245546f, 0.251644f, 0.255500f, 0.257760f, 0.258677f, 0.258173f, 0.256605f, 0.254245f, 0.250550f, 0.245153f, 0.238801f, 0.232311f, 0.225757f, 0.219429f, 0.214026f, 0.209321f, 0.204392f, 0.199161f, 0.193782f, 0.187372f, 0.179378f, 0.169453f, 0.152758f, 0.120530f, 0.072470f, 0.024676f, -0.003666f, -0.009454f, -0.003869f}, + {-0.005047f, -0.021126f, -0.045009f, -0.070453f, -0.091218f, -0.079137f, 0.005705f, 0.148208f, 0.279248f, 0.366201f, 0.399292f, 0.268604f, -0.145211f, -0.646500f, -0.731126f, -0.172486f, 0.552664f, 0.733258f, 0.260523f, -0.299749f, -0.452278f, -0.272382f, -0.101891f, -0.059461f, -0.035030f, 0.031425f, 0.085084f, 0.094988f, 0.094701f, 0.101435f, 0.094303f, 0.066565f, 0.037269f, 0.017081f, 0.001454f, -0.010929f, -0.018070f, -0.023255f, -0.028455f, -0.029520f, -0.025899f, -0.023522f, -0.023990f, -0.022461f, -0.017906f, -0.014746f, -0.014269f, -0.013796f, -0.013307f, -0.015082f, -0.018457f, -0.020882f, -0.021919f, -0.021991f, -0.020056f, -0.015522f, -0.009547f, -0.002759f, 0.005372f, 0.014351f, 0.022889f, 0.031164f, 0.040159f, 0.049486f, 0.058237f, 0.066734f, 0.075464f, 0.083764f, 0.091121f, 0.098138f, 0.105200f, 0.111892f, 0.118289f, 0.125068f, 0.132105f, 0.138497f, 0.143784f, 0.147831f, 0.150121f, 0.150387f, 0.149069f, 0.146131f, 0.140481f, 0.131487f, 0.119994f, 0.107110f, 0.092969f, 0.077185f, 0.059714f, 0.041087f, 0.022428f, 0.005113f, -0.010051f, -0.022960f, -0.033330f, -0.040497f, + -0.044394f, -0.045809f, -0.045372f, -0.043155f, -0.039528f, -0.035586f, -0.032440f, -0.030494f, -0.029398f, -0.028485f, -0.027544f, -0.027340f, -0.028936f, -0.032511f, -0.037335f, -0.042789f, -0.048810f, -0.055598f, -0.063500f, -0.072809f, -0.083162f, -0.093560f, -0.103403f, -0.113024f, -0.123077f, -0.134014f, -0.146084f, -0.159017f, -0.171851f, -0.183812f, -0.195106f, -0.206245f, -0.217176f, -0.227589f, -0.237250f, -0.245546f, -0.251644f, -0.255500f, -0.257760f, -0.258677f, -0.258173f, -0.256605f, -0.254245f, -0.250550f, -0.245153f, -0.238801f, -0.232311f, -0.225757f, -0.219429f, -0.214026f, -0.209321f, -0.204392f, -0.199161f, -0.193782f, -0.187372f, -0.179378f, -0.169453f, -0.152758f, -0.120530f, -0.072470f, -0.024676f, 0.003666f, 0.009454f, 0.003869f} + }, + { + {0.003264f, 0.004318f, -0.005829f, -0.024893f, -0.041105f, -0.025902f, 0.043471f, 0.128408f, 0.134001f, 0.021030f, -0.114589f, -0.139872f, -0.049571f, 0.037102f, 0.041588f, 0.008422f, 0.005052f, 0.019837f, 0.006847f, -0.026552f, -0.037371f, -0.021147f, -0.012506f, -0.023997f, -0.030666f, -0.014881f, 0.008946f, 0.019948f, 0.015955f, 0.005594f, -0.007241f, -0.022512f, -0.037468f, -0.047732f, -0.050991f, -0.047280f, -0.038592f, -0.028517f, -0.019426f, -0.010194f, 0.001263f, 0.014159f, 0.025520f, 0.033481f, 0.038027f, 0.039692f, 0.039526f, 0.039623f, 0.042009f, 0.047181f, 0.054431f, 0.062973f, 0.072033f, 0.080590f, 0.087853f, 0.093716f, 0.098363f, 0.101802f, 0.104025f, 0.105212f, 0.105518f, 0.104869f, 0.103123f, 0.100365f, 0.097014f, 0.093624f, 0.090496f, 0.087654f, 0.085314f, 0.084000f, 0.083899f, 0.084586f, 0.085875f, 0.088367f, 0.092576f, 0.098106f, 0.104335f, 0.111281f, 0.119002f, 0.126690f, 0.133135f, 0.137682f, 0.140158f, 0.140242f, 0.137283f, 0.130334f, 0.118340f, 0.100873f, 0.078543f, 0.051954f, 0.020504f, -0.016782f, -0.059370f, -0.105077f, -0.151633f, -0.197526f, + -0.241483f, -0.281925f, -0.316997f, -0.344975f, -0.365154f, -0.378455f, -0.386389f, -0.389309f, -0.386608f, -0.378830f, -0.368544f, -0.358689f, -0.350553f, -0.343331f, -0.335103f, -0.324515f, -0.312129f, -0.299944f, -0.289316f, -0.279871f, -0.270574f, -0.260978f, -0.251183f, -0.241549f, -0.232707f, -0.224985f, -0.217706f, -0.209798f, -0.200910f, -0.191257f, -0.180862f, -0.169770f, -0.158385f, -0.146895f, -0.135062f, -0.123099f, -0.111787f, -0.101401f, -0.091527f, -0.082057f, -0.073151f, -0.064454f, -0.055670f, -0.047503f, -0.040626f, -0.034415f, -0.027978f, -0.021363f, -0.014489f, -0.006443f, 0.002867f, 0.012203f, 0.021232f, 0.031102f, 0.042272f, 0.054913f, 0.071608f, 0.094348f, 0.116599f, 0.123809f, 0.106728f, 0.072105f, 0.036517f, 0.010336f}, + {-0.003264f, -0.004318f, 0.005829f, 0.024893f, 0.041105f, 0.025902f, -0.043471f, -0.128408f, -0.134001f, -0.021030f, 0.114589f, 0.139872f, 0.049571f, -0.037102f, -0.041588f, -0.008422f, -0.005052f, -0.019837f, -0.006847f, 0.026552f, 0.037371f, 0.021147f, 0.012506f, 0.023997f, 0.030666f, 0.014881f, -0.008946f, -0.019948f, -0.015955f, -0.005594f, 0.007241f, 0.022512f, 0.037468f, 0.047732f, 0.050991f, 0.047280f, 0.038592f, 0.028517f, 0.019426f, 0.010194f, -0.001263f, -0.014159f, -0.025520f, -0.033481f, -0.038027f, -0.039692f, -0.039526f, -0.039623f, -0.042009f, -0.047181f, -0.054431f, -0.062973f, -0.072033f, -0.080590f, -0.087853f, -0.093716f, -0.098363f, -0.101802f, -0.104025f, -0.105212f, -0.105518f, -0.104869f, -0.103123f, -0.100365f, -0.097014f, -0.093624f, -0.090496f, -0.087654f, -0.085314f, -0.084000f, -0.083899f, -0.084586f, -0.085875f, -0.088367f, -0.092576f, -0.098106f, -0.104335f, -0.111281f, -0.119002f, -0.126690f, -0.133135f, -0.137682f, -0.140158f, -0.140242f, -0.137283f, -0.130334f, -0.118340f, -0.100873f, -0.078543f, -0.051954f, -0.020504f, 0.016782f, 0.059370f, 0.105077f, 0.151633f, 0.197526f, + 0.241483f, 0.281925f, 0.316997f, 0.344975f, 0.365154f, 0.378455f, 0.386389f, 0.389309f, 0.386608f, 0.378830f, 0.368544f, 0.358689f, 0.350553f, 0.343331f, 0.335103f, 0.324515f, 0.312129f, 0.299944f, 0.289316f, 0.279871f, 0.270574f, 0.260978f, 0.251183f, 0.241549f, 0.232707f, 0.224985f, 0.217706f, 0.209798f, 0.200910f, 0.191257f, 0.180862f, 0.169770f, 0.158385f, 0.146895f, 0.135062f, 0.123099f, 0.111787f, 0.101401f, 0.091527f, 0.082057f, 0.073151f, 0.064454f, 0.055670f, 0.047503f, 0.040626f, 0.034415f, 0.027978f, 0.021363f, 0.014489f, 0.006443f, -0.002867f, -0.012203f, -0.021232f, -0.031102f, -0.042272f, -0.054913f, -0.071608f, -0.094348f, -0.116599f, -0.123809f, -0.106728f, -0.072105f, -0.036517f, -0.010336f} + }, + { + {0.011217f, 0.032990f, 0.036897f, 0.010621f, -0.001993f, 0.049544f, 0.112830f, 0.056133f, -0.160339f, -0.385630f, -0.392350f, -0.095349f, 0.328404f, 0.542847f, 0.344208f, -0.105590f, -0.399358f, -0.300598f, 0.018016f, 0.214090f, 0.169827f, 0.038946f, -0.027942f, -0.041781f, -0.059684f, -0.065038f, -0.024287f, 0.032375f, 0.055196f, 0.048115f, 0.048570f, 0.069300f, 0.097432f, 0.125436f, 0.152243f, 0.169511f, 0.168791f, 0.153482f, 0.132068f, 0.107982f, 0.082397f, 0.058065f, 0.035645f, 0.012912f, -0.010363f, -0.032150f, -0.052509f, -0.073090f, -0.093478f, -0.112421f, -0.130887f, -0.150015f, -0.167940f, -0.181658f, -0.190093f, -0.193280f, -0.190900f, -0.183505f, -0.172998f, -0.160425f, -0.144966f, -0.125766f, -0.102989f, -0.076649f, -0.046121f, -0.011292f, 0.026894f, 0.067039f, 0.107592f, 0.146900f, 0.183708f, 0.217201f, 0.246116f, 0.268588f, 0.283453f, 0.290932f, 0.291460f, 0.284592f, 0.269758f, 0.247580f, 0.219717f, 0.187538f, 0.151436f, 0.111504f, 0.068474f, 0.023637f, -0.022098f, -0.068620f, -0.115935f, -0.163543f, -0.210736f, -0.256901f, -0.300916f, -0.340700f, -0.374071f, -0.399767f, + -0.417035f, -0.424614f, -0.421054f, -0.406173f, -0.381691f, -0.350278f, -0.314081f, -0.274012f, -0.230338f, -0.184210f, -0.138589f, -0.097123f, -0.061885f, -0.032563f, -0.007863f, 0.012882f, 0.029569f, 0.041935f, 0.049803f, 0.053141f, 0.052307f, 0.048088f, 0.041442f, 0.033372f, 0.024841f, 0.016293f, 0.007207f, -0.003502f, -0.016548f, -0.031791f, -0.048410f, -0.065287f, -0.081508f, -0.096823f, -0.111564f, -0.125991f, -0.139856f, -0.152551f, -0.163405f, -0.171901f, -0.177907f, -0.181647f, -0.183211f, -0.182296f, -0.178654f, -0.172490f, -0.164191f, -0.154059f, -0.142478f, -0.129944f, -0.116760f, -0.103091f, -0.089272f, -0.075716f, -0.062663f, -0.050022f, -0.036539f, -0.019395f, 0.002713f, 0.024763f, 0.036870f, 0.033747f, 0.020633f, 0.006443f}, + {-0.011217f, -0.032990f, -0.036897f, -0.010621f, 0.001993f, -0.049544f, -0.112830f, -0.056133f, 0.160339f, 0.385630f, 0.392350f, 0.095349f, -0.328404f, -0.542847f, -0.344208f, 0.105590f, 0.399358f, 0.300598f, -0.018016f, -0.214090f, -0.169827f, -0.038946f, 0.027942f, 0.041781f, 0.059684f, 0.065038f, 0.024287f, -0.032375f, -0.055196f, -0.048115f, -0.048570f, -0.069300f, -0.097432f, -0.125436f, -0.152243f, -0.169511f, -0.168791f, -0.153482f, -0.132068f, -0.107982f, -0.082397f, -0.058065f, -0.035645f, -0.012912f, 0.010363f, 0.032150f, 0.052509f, 0.073090f, 0.093478f, 0.112421f, 0.130887f, 0.150015f, 0.167940f, 0.181658f, 0.190093f, 0.193280f, 0.190900f, 0.183505f, 0.172998f, 0.160425f, 0.144966f, 0.125766f, 0.102989f, 0.076649f, 0.046121f, 0.011292f, -0.026894f, -0.067039f, -0.107592f, -0.146900f, -0.183708f, -0.217201f, -0.246116f, -0.268588f, -0.283453f, -0.290932f, -0.291460f, -0.284592f, -0.269758f, -0.247580f, -0.219717f, -0.187538f, -0.151436f, -0.111504f, -0.068474f, -0.023637f, 0.022098f, 0.068620f, 0.115935f, 0.163543f, 0.210736f, 0.256901f, 0.300916f, 0.340700f, 0.374071f, 0.399767f, + 0.417035f, 0.424614f, 0.421054f, 0.406173f, 0.381691f, 0.350278f, 0.314081f, 0.274012f, 0.230338f, 0.184210f, 0.138589f, 0.097123f, 0.061885f, 0.032563f, 0.007863f, -0.012882f, -0.029569f, -0.041935f, -0.049803f, -0.053141f, -0.052307f, -0.048088f, -0.041442f, -0.033372f, -0.024841f, -0.016293f, -0.007207f, 0.003502f, 0.016548f, 0.031791f, 0.048410f, 0.065287f, 0.081508f, 0.096823f, 0.111564f, 0.125991f, 0.139856f, 0.152551f, 0.163405f, 0.171901f, 0.177907f, 0.181647f, 0.183211f, 0.182296f, 0.178654f, 0.172490f, 0.164191f, 0.154059f, 0.142478f, 0.129944f, 0.116760f, 0.103091f, 0.089272f, 0.075716f, 0.062663f, 0.050022f, 0.036539f, 0.019395f, -0.002713f, -0.024763f, -0.036870f, -0.033747f, -0.020633f, -0.006443f} + }, + { + {0.000083f, 0.005036f, 0.018377f, 0.032102f, 0.033143f, 0.014136f, -0.022619f, -0.065291f, -0.089673f, -0.066050f, 0.009591f, 0.089794f, 0.106985f, 0.045740f, -0.034502f, -0.065255f, -0.039897f, 0.000078f, 0.028484f, 0.051608f, 0.072366f, 0.075587f, 0.055795f, 0.030842f, 0.015327f, 0.000007f, -0.029864f, -0.069463f, -0.099077f, -0.105101f, -0.088131f, -0.057540f, -0.025793f, -0.003611f, 0.006114f, 0.009267f, 0.013559f, 0.021781f, 0.031617f, 0.039206f, 0.042208f, 0.041252f, 0.038988f, 0.037309f, 0.036122f, 0.034790f, 0.033050f, 0.030156f, 0.024935f, 0.017196f, 0.007780f, -0.002812f, -0.014616f, -0.027403f, -0.040792f, -0.054583f, -0.068097f, -0.080003f, -0.089434f, -0.096351f, -0.100606f, -0.101910f, -0.100671f, -0.097487f, -0.092005f, -0.083641f, -0.072770f, -0.059711f, -0.043405f, -0.022639f, 0.002276f, 0.030372f, 0.061335f, 0.094600f, 0.128377f, 0.160824f, 0.191129f, 0.218597f, 0.241992f, 0.260549f, 0.274515f, 0.284048f, 0.288459f, 0.286928f, 0.279376f, 0.266510f, 0.249197f, 0.227462f, 0.200216f, 0.166835f, 0.128828f, 0.088822f, 0.048134f, 0.006659f, -0.035128f, -0.075405f, + -0.111911f, -0.142566f, -0.165901f, -0.182096f, -0.192944f, -0.199789f, -0.202049f, -0.198236f, -0.187646f, -0.171039f, -0.150806f, -0.130229f, -0.111175f, -0.092669f, -0.072879f, -0.051877f, -0.031403f, -0.013020f, 0.002318f, 0.014147f, 0.023189f, 0.030986f, 0.037985f, 0.043116f, 0.045482f, 0.044959f, 0.041243f, 0.034134f, 0.024551f, 0.013580f, 0.001006f, -0.013772f, -0.030379f, -0.048389f, -0.068202f, -0.089706f, -0.111625f, -0.133172f, -0.154629f, -0.175780f, -0.195743f, -0.214472f, -0.232333f, -0.248520f, -0.261904f, -0.272627f, -0.280980f, -0.286143f, -0.287719f, -0.286566f, -0.282756f, -0.275181f, -0.263986f, -0.250601f, -0.235353f, -0.217748f, -0.196795f, -0.167237f, -0.121073f, -0.061155f, -0.008179f, 0.017190f, 0.016197f, 0.005515f}, + {0.000083f, 0.005036f, 0.018377f, 0.032102f, 0.033143f, 0.014136f, -0.022619f, -0.065291f, -0.089673f, -0.066050f, 0.009591f, 0.089794f, 0.106985f, 0.045740f, -0.034502f, -0.065255f, -0.039897f, 0.000078f, 0.028484f, 0.051608f, 0.072366f, 0.075587f, 0.055795f, 0.030842f, 0.015327f, 0.000007f, -0.029864f, -0.069463f, -0.099077f, -0.105101f, -0.088131f, -0.057540f, -0.025793f, -0.003611f, 0.006114f, 0.009267f, 0.013559f, 0.021781f, 0.031617f, 0.039206f, 0.042208f, 0.041252f, 0.038988f, 0.037309f, 0.036122f, 0.034790f, 0.033050f, 0.030156f, 0.024935f, 0.017196f, 0.007780f, -0.002812f, -0.014616f, -0.027403f, -0.040792f, -0.054583f, -0.068097f, -0.080003f, -0.089434f, -0.096351f, -0.100606f, -0.101910f, -0.100671f, -0.097487f, -0.092005f, -0.083641f, -0.072770f, -0.059711f, -0.043405f, -0.022639f, 0.002276f, 0.030372f, 0.061335f, 0.094600f, 0.128377f, 0.160824f, 0.191129f, 0.218597f, 0.241992f, 0.260549f, 0.274515f, 0.284048f, 0.288459f, 0.286928f, 0.279376f, 0.266510f, 0.249197f, 0.227462f, 0.200216f, 0.166835f, 0.128828f, 0.088822f, 0.048134f, 0.006659f, -0.035128f, -0.075405f, + -0.111911f, -0.142566f, -0.165901f, -0.182096f, -0.192944f, -0.199789f, -0.202049f, -0.198236f, -0.187646f, -0.171039f, -0.150806f, -0.130229f, -0.111175f, -0.092669f, -0.072879f, -0.051877f, -0.031403f, -0.013020f, 0.002318f, 0.014147f, 0.023189f, 0.030986f, 0.037985f, 0.043116f, 0.045482f, 0.044959f, 0.041243f, 0.034134f, 0.024551f, 0.013580f, 0.001006f, -0.013772f, -0.030379f, -0.048389f, -0.068202f, -0.089706f, -0.111625f, -0.133172f, -0.154629f, -0.175780f, -0.195743f, -0.214472f, -0.232333f, -0.248520f, -0.261904f, -0.272627f, -0.280980f, -0.286143f, -0.287719f, -0.286566f, -0.282756f, -0.275181f, -0.263986f, -0.250601f, -0.235353f, -0.217748f, -0.196795f, -0.167237f, -0.121073f, -0.061155f, -0.008179f, 0.017190f, 0.016197f, 0.005515f} + }, + { + {0.003277f, 0.020620f, 0.046924f, 0.053396f, 0.027529f, -0.018184f, -0.075068f, -0.129965f, -0.134034f, -0.041093f, 0.107597f, 0.192042f, 0.138507f, 0.002361f, -0.097386f, -0.097716f, -0.027837f, 0.041165f, 0.055356f, 0.009000f, -0.053914f, -0.075455f, -0.037025f, 0.027229f, 0.073147f, 0.088050f, 0.084707f, 0.074263f, 0.059879f, 0.044753f, 0.030913f, 0.014584f, -0.007652f, -0.031648f, -0.050796f, -0.064274f, -0.075002f, -0.083080f, -0.086106f, -0.083894f, -0.079273f, -0.075317f, -0.073762f, -0.075115f, -0.078933f, -0.084283f, -0.090103f, -0.094754f, -0.095967f, -0.092275f, -0.084148f, -0.073198f, -0.060975f, -0.049003f, -0.038889f, -0.031415f, -0.026007f, -0.021619f, -0.017630f, -0.013612f, -0.008806f, -0.002247f, 0.006927f, 0.019339f, 0.035096f, 0.053529f, 0.073490f, 0.093872f, 0.113559f, 0.131158f, 0.145463f, 0.156306f, 0.164334f, 0.169750f, 0.171955f, 0.170864f, 0.167779f, 0.164008f, 0.159174f, 0.152172f, 0.143633f, 0.135949f, 0.130577f, 0.126799f, 0.123854f, 0.122887f, 0.125529f, 0.131183f, 0.136998f, 0.140478f, 0.141438f, 0.141364f, 0.141457f, 0.141528f, 0.140550f, 0.137820f, + 0.133341f, 0.127425f, 0.120598f, 0.113838f, 0.108067f, 0.102944f, 0.096659f, 0.087377f, 0.074639f, 0.059155f, 0.041597f, 0.021904f, -0.000390f, -0.025326f, -0.052050f, -0.079280f, -0.106273f, -0.133120f, -0.160007f, -0.186459f, -0.211358f, -0.233392f, -0.251545f, -0.265595f, -0.276202f, -0.284154f, -0.289485f, -0.291522f, -0.289603f, -0.283599f, -0.274102f, -0.262440f, -0.250053f, -0.237377f, -0.223517f, -0.207267f, -0.188278f, -0.167320f, -0.145844f, -0.125284f, -0.106307f, -0.088608f, -0.071476f, -0.054349f, -0.036881f, -0.019173f, -0.002062f, 0.013514f, 0.027449f, 0.039974f, 0.050573f, 0.058579f, 0.064464f, 0.069138f, 0.072610f, 0.074870f, 0.076796f, 0.077682f, 0.073281f, 0.059949f, 0.040437f, 0.022196f, 0.009962f, 0.002764f}, + {0.003277f, 0.020620f, 0.046924f, 0.053396f, 0.027529f, -0.018184f, -0.075068f, -0.129965f, -0.134034f, -0.041093f, 0.107597f, 0.192042f, 0.138507f, 0.002361f, -0.097386f, -0.097716f, -0.027837f, 0.041165f, 0.055356f, 0.009000f, -0.053914f, -0.075455f, -0.037025f, 0.027229f, 0.073147f, 0.088050f, 0.084707f, 0.074263f, 0.059879f, 0.044753f, 0.030913f, 0.014584f, -0.007652f, -0.031648f, -0.050796f, -0.064274f, -0.075002f, -0.083080f, -0.086106f, -0.083894f, -0.079273f, -0.075317f, -0.073762f, -0.075115f, -0.078933f, -0.084283f, -0.090103f, -0.094754f, -0.095967f, -0.092275f, -0.084148f, -0.073198f, -0.060975f, -0.049003f, -0.038889f, -0.031415f, -0.026007f, -0.021619f, -0.017630f, -0.013612f, -0.008806f, -0.002247f, 0.006927f, 0.019339f, 0.035096f, 0.053529f, 0.073490f, 0.093872f, 0.113559f, 0.131158f, 0.145463f, 0.156306f, 0.164334f, 0.169750f, 0.171955f, 0.170864f, 0.167779f, 0.164008f, 0.159174f, 0.152172f, 0.143633f, 0.135949f, 0.130577f, 0.126799f, 0.123854f, 0.122887f, 0.125529f, 0.131183f, 0.136998f, 0.140478f, 0.141438f, 0.141364f, 0.141457f, 0.141528f, 0.140550f, 0.137820f, + 0.133341f, 0.127425f, 0.120598f, 0.113838f, 0.108067f, 0.102944f, 0.096659f, 0.087377f, 0.074639f, 0.059155f, 0.041597f, 0.021904f, -0.000390f, -0.025326f, -0.052050f, -0.079280f, -0.106273f, -0.133120f, -0.160007f, -0.186459f, -0.211358f, -0.233392f, -0.251545f, -0.265595f, -0.276202f, -0.284154f, -0.289485f, -0.291522f, -0.289603f, -0.283599f, -0.274102f, -0.262440f, -0.250053f, -0.237377f, -0.223517f, -0.207267f, -0.188278f, -0.167320f, -0.145844f, -0.125284f, -0.106307f, -0.088608f, -0.071476f, -0.054349f, -0.036881f, -0.019173f, -0.002062f, 0.013514f, 0.027449f, 0.039974f, 0.050573f, 0.058579f, 0.064464f, 0.069138f, 0.072610f, 0.074870f, 0.076796f, 0.077682f, 0.073281f, 0.059949f, 0.040437f, 0.022196f, 0.009962f, 0.002764f} + }, + { + {-0.008293f, -0.013970f, -0.006751f, -0.004194f, -0.000967f, 0.027228f, 0.059778f, 0.022682f, -0.106073f, -0.214108f, -0.153498f, 0.064143f, 0.238226f, 0.193438f, -0.014455f, -0.165780f, -0.132467f, 0.001700f, 0.083408f, 0.077007f, 0.060090f, 0.082445f, 0.105818f, 0.080684f, 0.018380f, -0.037842f, -0.074236f, -0.108541f, -0.150869f, -0.190041f, -0.211970f, -0.212547f, -0.194180f, -0.162258f, -0.125194f, -0.090440f, -0.060047f, -0.033077f, -0.010004f, 0.007878f, 0.020452f, 0.027724f, 0.029258f, 0.026432f, 0.022993f, 0.022085f, 0.024478f, 0.029976f, 0.038329f, 0.048433f, 0.058546f, 0.067656f, 0.075393f, 0.080877f, 0.082981f, 0.081487f, 0.077061f, 0.070494f, 0.062643f, 0.054653f, 0.047646f, 0.042468f, 0.039796f, 0.040085f, 0.043440f, 0.049885f, 0.059496f, 0.072069f, 0.087127f, 0.104428f, 0.123856f, 0.144734f, 0.165869f, 0.186238f, 0.205023f, 0.221226f, 0.233959f, 0.242827f, 0.247601f, 0.248219f, 0.245523f, 0.240985f, 0.235213f, 0.227742f, 0.218596f, 0.208683f, 0.198442f, 0.187753f, 0.177376f, 0.168395f, 0.159521f, 0.146885f, 0.127542f, 0.101864f, 0.071685f, 0.037282f, + -0.002911f, -0.050169f, -0.103604f, -0.160216f, -0.216687f, -0.271079f, -0.322554f, -0.369840f, -0.410986f, -0.444781f, -0.471531f, -0.492157f, -0.506979f, -0.515336f, -0.516033f, -0.508542f, -0.494176f, -0.475536f, -0.454382f, -0.430583f, -0.403314f, -0.372531f, -0.339168f, -0.304785f, -0.271079f, -0.238824f, -0.207195f, -0.174785f, -0.141074f, -0.106436f, -0.071329f, -0.036073f, -0.000775f, 0.034934f, 0.071321f, 0.107583f, 0.142393f, 0.175297f, 0.206552f, 0.236016f, 0.263322f, 0.288426f, 0.310739f, 0.328664f, 0.341198f, 0.348940f, 0.352697f, 0.352598f, 0.349143f, 0.343169f, 0.334326f, 0.321627f, 0.305401f, 0.286727f, 0.265938f, 0.243372f, 0.218307f, 0.184517f, 0.133522f, 0.069279f, 0.013554f, -0.013422f, -0.013865f, -0.004732f}, + {-0.008293f, -0.013970f, -0.006751f, -0.004194f, -0.000967f, 0.027228f, 0.059778f, 0.022682f, -0.106073f, -0.214108f, -0.153498f, 0.064143f, 0.238226f, 0.193438f, -0.014455f, -0.165780f, -0.132467f, 0.001700f, 0.083408f, 0.077007f, 0.060090f, 0.082445f, 0.105818f, 0.080684f, 0.018380f, -0.037842f, -0.074236f, -0.108541f, -0.150869f, -0.190041f, -0.211970f, -0.212547f, -0.194180f, -0.162258f, -0.125194f, -0.090440f, -0.060047f, -0.033077f, -0.010004f, 0.007878f, 0.020452f, 0.027724f, 0.029258f, 0.026432f, 0.022993f, 0.022085f, 0.024478f, 0.029976f, 0.038329f, 0.048433f, 0.058546f, 0.067656f, 0.075393f, 0.080877f, 0.082981f, 0.081487f, 0.077061f, 0.070494f, 0.062643f, 0.054653f, 0.047646f, 0.042468f, 0.039796f, 0.040085f, 0.043440f, 0.049885f, 0.059496f, 0.072069f, 0.087127f, 0.104428f, 0.123856f, 0.144734f, 0.165869f, 0.186238f, 0.205023f, 0.221226f, 0.233959f, 0.242827f, 0.247601f, 0.248219f, 0.245523f, 0.240985f, 0.235213f, 0.227742f, 0.218596f, 0.208683f, 0.198442f, 0.187753f, 0.177376f, 0.168395f, 0.159521f, 0.146885f, 0.127542f, 0.101864f, 0.071685f, 0.037282f, + -0.002911f, -0.050169f, -0.103604f, -0.160216f, -0.216687f, -0.271079f, -0.322554f, -0.369840f, -0.410986f, -0.444781f, -0.471531f, -0.492157f, -0.506979f, -0.515336f, -0.516033f, -0.508542f, -0.494176f, -0.475536f, -0.454382f, -0.430583f, -0.403314f, -0.372531f, -0.339168f, -0.304785f, -0.271079f, -0.238824f, -0.207195f, -0.174785f, -0.141074f, -0.106436f, -0.071329f, -0.036073f, -0.000775f, 0.034934f, 0.071321f, 0.107583f, 0.142393f, 0.175297f, 0.206552f, 0.236016f, 0.263322f, 0.288426f, 0.310739f, 0.328664f, 0.341198f, 0.348940f, 0.352697f, 0.352598f, 0.349143f, 0.343169f, 0.334326f, 0.321627f, 0.305401f, 0.286727f, 0.265938f, 0.243372f, 0.218307f, 0.184517f, 0.133522f, 0.069279f, 0.013554f, -0.013422f, -0.013865f, -0.004732f} + }, + { + {0.000177f, 0.000226f, -0.000534f, -0.002844f, -0.006900f, -0.008636f, -0.000913f, 0.012312f, 0.007372f, -0.030503f, -0.063506f, -0.022827f, 0.091931f, 0.166548f, 0.089015f, -0.090455f, -0.187289f, -0.097089f, 0.077605f, 0.157235f, 0.092127f, -0.016472f, -0.065347f, -0.047160f, -0.006944f, 0.028956f, 0.056051f, 0.066667f, 0.053772f, 0.024836f, -0.006025f, -0.031877f, -0.051501f, -0.064067f, -0.072308f, -0.083529f, -0.101732f, -0.122988f, -0.140854f, -0.151866f, -0.154661f, -0.148621f, -0.135381f, -0.118751f, -0.102023f, -0.086997f, -0.075122f, -0.067345f, -0.063027f, -0.060678f, -0.059457f, -0.058879f, -0.057880f, -0.055382f, -0.051316f, -0.046358f, -0.041263f, -0.036901f, -0.034150f, -0.033230f, -0.033646f, -0.034904f, -0.036618f, -0.037981f, -0.037996f, -0.036359f, -0.033414f, -0.029270f, -0.023673f, -0.016686f, -0.008707f, 0.000153f, 0.009974f, 0.020300f, 0.030277f, 0.039653f, 0.048922f, 0.058264f, 0.067028f, 0.074752f, 0.082196f, 0.090675f, 0.100423f, 0.110252f, 0.119144f, 0.127625f, 0.136849f, 0.146460f, 0.154233f, 0.158150f, 0.158200f, 0.155698f, 0.151413f, 0.145018f, 0.136153f, 0.125516f, + 0.114815f, 0.105682f, 0.098486f, 0.092374f, 0.086804f, 0.082876f, 0.082667f, 0.087334f, 0.096215f, 0.107481f, 0.119244f, 0.130421f, 0.141184f, 0.152404f, 0.164286f, 0.175808f, 0.185694f, 0.193429f, 0.199183f, 0.203422f, 0.206875f, 0.210212f, 0.213414f, 0.215952f, 0.217594f, 0.218544f, 0.218872f, 0.218422f, 0.217083f, 0.214671f, 0.210839f, 0.205624f, 0.199681f, 0.193644f, 0.187770f, 0.182378f, 0.177914f, 0.174397f, 0.171558f, 0.169503f, 0.168445f, 0.167984f, 0.167536f, 0.167028f, 0.166265f, 0.164275f, 0.160229f, 0.154156f, 0.145927f, 0.134776f, 0.120686f, 0.104691f, 0.087066f, 0.067093f, 0.045071f, 0.021659f, -0.005316f, -0.038739f, -0.073888f, -0.096316f, -0.093511f, -0.068230f, -0.036309f, -0.010540f}, + {0.000177f, 0.000226f, -0.000534f, -0.002844f, -0.006900f, -0.008636f, -0.000913f, 0.012312f, 0.007372f, -0.030503f, -0.063506f, -0.022827f, 0.091931f, 0.166548f, 0.089015f, -0.090455f, -0.187289f, -0.097089f, 0.077605f, 0.157235f, 0.092127f, -0.016472f, -0.065347f, -0.047160f, -0.006944f, 0.028956f, 0.056051f, 0.066667f, 0.053772f, 0.024836f, -0.006025f, -0.031877f, -0.051501f, -0.064067f, -0.072308f, -0.083529f, -0.101732f, -0.122988f, -0.140854f, -0.151866f, -0.154661f, -0.148621f, -0.135381f, -0.118751f, -0.102023f, -0.086997f, -0.075122f, -0.067345f, -0.063027f, -0.060678f, -0.059457f, -0.058879f, -0.057880f, -0.055382f, -0.051316f, -0.046358f, -0.041263f, -0.036901f, -0.034150f, -0.033230f, -0.033646f, -0.034904f, -0.036618f, -0.037981f, -0.037996f, -0.036359f, -0.033414f, -0.029270f, -0.023673f, -0.016686f, -0.008707f, 0.000153f, 0.009974f, 0.020300f, 0.030277f, 0.039653f, 0.048922f, 0.058264f, 0.067028f, 0.074752f, 0.082196f, 0.090675f, 0.100423f, 0.110252f, 0.119144f, 0.127625f, 0.136849f, 0.146460f, 0.154233f, 0.158150f, 0.158200f, 0.155698f, 0.151413f, 0.145018f, 0.136153f, 0.125516f, + 0.114815f, 0.105682f, 0.098486f, 0.092374f, 0.086804f, 0.082876f, 0.082667f, 0.087334f, 0.096215f, 0.107481f, 0.119244f, 0.130421f, 0.141184f, 0.152404f, 0.164286f, 0.175808f, 0.185694f, 0.193429f, 0.199183f, 0.203422f, 0.206875f, 0.210212f, 0.213414f, 0.215952f, 0.217594f, 0.218544f, 0.218872f, 0.218422f, 0.217083f, 0.214671f, 0.210839f, 0.205624f, 0.199681f, 0.193644f, 0.187770f, 0.182378f, 0.177914f, 0.174397f, 0.171558f, 0.169503f, 0.168445f, 0.167984f, 0.167536f, 0.167028f, 0.166265f, 0.164275f, 0.160229f, 0.154156f, 0.145927f, 0.134776f, 0.120686f, 0.104691f, 0.087066f, 0.067093f, 0.045071f, 0.021659f, -0.005316f, -0.038739f, -0.073888f, -0.096316f, -0.093511f, -0.068230f, -0.036309f, -0.010540f} + } +}; +const float *CRendBin_HOA3_HRIR_coeff_diffuse_re_32kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const float *CRendBin_HOA3_HRIR_coeff_diffuse_im_32kHz[BINAURAL_CHANNELS]={NULL,NULL}; + +/* Sample Rate = 16000 */ + +const int16_t CRendBin_HOA3_HRIR_max_num_iterations_16kHz = 1; +const uint16_t CRendBin_HOA3_HRIR_num_iterations_16kHz[16][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1} }; +const uint16_t CRendBin_HOA3_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS] = {0, 0}; +const uint16_t CRendBin_HOA3_HRIR_pIndex_frequency_max_16kHz[16][BINAURAL_CHANNELS][1]={{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}}}; +const uint16_t CRendBin_HOA3_HRIR_index_frequency_max_diffuse_16kHz = 0; +const float CRendBin_HOA3_HRIR_inv_diffuse_weight_16kHz[16]={0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f}; +const uint16_t *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const float CRendBin_HOA3_HRIR_coeff_re_16kHz[16][BINAURAL_CHANNELS][80]={ + { + { 0.883857f, 0.733415f, 0.488407f, 0.219765f, -0.019522f, -0.206727f, -0.355857f, -0.497398f, -0.626479f, -0.691928f, -0.658239f, -0.535571f, -0.319712f, 0.011730f, 0.358242f, 0.451741f, 0.134258f, -0.340096f, -0.484683f, -0.125786f, 0.390069f, 0.611189f, 0.450608f, 0.138633f, -0.137573f, -0.370128f, -0.584446f, -0.746152f, -0.830104f, -0.865577f, -0.882556f, -0.877705f, -0.846732f, -0.803300f, -0.757904f, -0.709171f, -0.657369f, -0.606374f, -0.556373f, -0.507104f, -0.460955f, -0.416905f, -0.371212f, -0.325363f, -0.282989f, -0.241932f, -0.199475f, -0.158957f, -0.122405f, -0.085805f, -0.048176f, -0.013848f, 0.017815f, 0.051603f, 0.085261f, 0.113579f, 0.139998f, 0.169326f, 0.196673f, 0.218159f, 0.240616f, 0.267320f, 0.290455f, 0.308757f, 0.331756f, 0.358830f, 0.379533f, 0.397779f, 0.425526f, 0.455662f, 0.476389f, 0.501029f, 0.542486f, 0.581357f, 0.609875f, 0.668286f, 0.765750f, 0.813077f, 0.736556f, 0.621909f}, + { 0.883857f, 0.733415f, 0.488407f, 0.219765f, -0.019522f, -0.206727f, -0.355857f, -0.497398f, -0.626479f, -0.691928f, -0.658239f, -0.535571f, -0.319712f, 0.011730f, 0.358242f, 0.451741f, 0.134258f, -0.340096f, -0.484683f, -0.125786f, 0.390069f, 0.611189f, 0.450608f, 0.138633f, -0.137573f, -0.370128f, -0.584446f, -0.746152f, -0.830104f, -0.865577f, -0.882556f, -0.877705f, -0.846732f, -0.803300f, -0.757904f, -0.709171f, -0.657369f, -0.606374f, -0.556373f, -0.507104f, -0.460955f, -0.416905f, -0.371212f, -0.325363f, -0.282989f, -0.241932f, -0.199475f, -0.158957f, -0.122405f, -0.085805f, -0.048176f, -0.013848f, 0.017815f, 0.051603f, 0.085261f, 0.113579f, 0.139998f, 0.169326f, 0.196673f, 0.218159f, 0.240616f, 0.267320f, 0.290455f, 0.308757f, 0.331756f, 0.358830f, 0.379533f, 0.397779f, 0.425526f, 0.455662f, 0.476389f, 0.501029f, 0.542486f, 0.581357f, 0.609875f, 0.668286f, 0.765750f, 0.813077f, 0.736556f, 0.621909f} + }, + { + { -0.027320f, 0.203042f, 0.560441f, 0.855080f, 0.913923f, 0.695595f, 0.275320f, -0.242317f, -0.734864f, -1.060751f, -1.161327f, -1.101927f, -0.890150f, -0.379506f, 0.403667f, 0.941418f, 0.637872f, -0.349883f, -1.070253f, -0.802884f, 0.138395f, 0.872965f, 0.973380f, 0.700130f, 0.411920f, 0.163851f, -0.106361f, -0.348889f, -0.492759f, -0.572846f, -0.652509f, -0.726343f, -0.765973f, -0.782601f, -0.797805f, -0.807837f, -0.804710f, -0.793867f, -0.778506f, -0.754424f, -0.722406f, -0.686425f, -0.645124f, -0.597900f, -0.549560f, -0.501709f, -0.451184f, -0.399036f, -0.349319f, -0.301514f, -0.254382f, -0.210559f, -0.169586f, -0.126625f, -0.082489f, -0.042121f, -0.003063f, 0.039580f, 0.081194f, 0.116558f, 0.151377f, 0.189529f, 0.223338f, 0.250399f, 0.280134f, 0.312833f, 0.337748f, 0.358162f, 0.386893f, 0.417232f, 0.436207f, 0.457643f, 0.496886f, 0.534086f, 0.559077f, 0.615495f, 0.720955f, 0.788091f, 0.733920f, 0.633048f}, + { 0.027320f, -0.203042f, -0.560441f, -0.855080f, -0.913923f, -0.695595f, -0.275320f, 0.242317f, 0.734864f, 1.060751f, 1.161327f, 1.101927f, 0.890150f, 0.379506f, -0.403667f, -0.941418f, -0.637872f, 0.349883f, 1.070253f, 0.802884f, -0.138395f, -0.872965f, -0.973380f, -0.700130f, -0.411920f, -0.163851f, 0.106361f, 0.348889f, 0.492759f, 0.572846f, 0.652509f, 0.726343f, 0.765973f, 0.782601f, 0.797805f, 0.807837f, 0.804710f, 0.793867f, 0.778506f, 0.754424f, 0.722406f, 0.686425f, 0.645124f, 0.597900f, 0.549560f, 0.501709f, 0.451184f, 0.399036f, 0.349319f, 0.301514f, 0.254382f, 0.210559f, 0.169586f, 0.126625f, 0.082489f, 0.042121f, 0.003063f, -0.039580f, -0.081194f, -0.116558f, -0.151377f, -0.189529f, -0.223338f, -0.250399f, -0.280134f, -0.312833f, -0.337748f, -0.358162f, -0.386893f, -0.417232f, -0.436207f, -0.457643f, -0.496886f, -0.534086f, -0.559077f, -0.615495f, -0.720955f, -0.788091f, -0.733920f, -0.633048f} + }, + { + { 0.118436f, 0.115238f, 0.066724f, -0.031005f, -0.110536f, -0.104982f, -0.026119f, 0.054803f, 0.085973f, 0.067873f, 0.022013f, -0.034585f, -0.076928f, -0.068265f, 0.001219f, 0.079759f, 0.089362f, 0.012958f, -0.068933f, -0.055059f, 0.061752f, 0.181176f, 0.204944f, 0.133740f, 0.039616f, -0.026727f, -0.067425f, -0.097358f, -0.117479f, -0.128816f, -0.139106f, -0.148124f, -0.147540f, -0.137735f, -0.127967f, -0.121964f, -0.118868f, -0.123376f, -0.139592f, -0.160579f, -0.177238f, -0.190353f, -0.203239f, -0.212479f, -0.215771f, -0.218017f, -0.221530f, -0.221546f, -0.216582f, -0.210524f, -0.201753f, -0.183921f, -0.158000f, -0.129614f, -0.096841f, -0.054949f, -0.008121f, 0.037786f, 0.086428f, 0.141514f, 0.196865f, 0.248309f, 0.301857f, 0.359085f, 0.410915f, 0.454764f, 0.498103f, 0.538709f, 0.564751f, 0.577927f, 0.589323f, 0.592448f, 0.572721f, 0.540242f, 0.513516f, 0.474346f, 0.385659f, 0.255970f, 0.141241f, 0.082055f}, + { 0.118436f, 0.115238f, 0.066724f, -0.031005f, -0.110536f, -0.104982f, -0.026119f, 0.054803f, 0.085973f, 0.067873f, 0.022013f, -0.034585f, -0.076928f, -0.068265f, 0.001219f, 0.079759f, 0.089362f, 0.012958f, -0.068933f, -0.055059f, 0.061752f, 0.181176f, 0.204944f, 0.133740f, 0.039616f, -0.026727f, -0.067425f, -0.097358f, -0.117479f, -0.128816f, -0.139106f, -0.148124f, -0.147540f, -0.137735f, -0.127967f, -0.121964f, -0.118868f, -0.123376f, -0.139592f, -0.160579f, -0.177238f, -0.190353f, -0.203239f, -0.212479f, -0.215771f, -0.218017f, -0.221530f, -0.221546f, -0.216582f, -0.210524f, -0.201753f, -0.183921f, -0.158000f, -0.129614f, -0.096841f, -0.054949f, -0.008121f, 0.037786f, 0.086428f, 0.141514f, 0.196865f, 0.248309f, 0.301857f, 0.359085f, 0.410915f, 0.454764f, 0.498103f, 0.538709f, 0.564751f, 0.577927f, 0.589323f, 0.592448f, 0.572721f, 0.540242f, 0.513516f, 0.474346f, 0.385659f, 0.255970f, 0.141241f, 0.082055f} + }, + { + { 0.032265f, 0.058092f, 0.073219f, 0.041427f, -0.027377f, -0.074710f, -0.054839f, 0.005525f, 0.033420f, -0.004645f, -0.074163f, -0.131671f, -0.164722f, -0.155087f, -0.066220f, 0.075605f, 0.140276f, 0.027223f, -0.171436f, -0.236113f, -0.070379f, 0.189981f, 0.347922f, 0.350289f, 0.275749f, 0.188927f, 0.086500f, -0.040928f, -0.171421f, -0.284063f, -0.381731f, -0.470062f, -0.541769f, -0.589134f, -0.613034f, -0.615565f, -0.596996f, -0.561345f, -0.515497f, -0.463484f, -0.407689f, -0.352161f, -0.299365f, -0.247826f, -0.196903f, -0.149167f, -0.105444f, -0.063031f, -0.021015f, 0.017920f, 0.052064f, 0.081783f, 0.105940f, 0.122756f, 0.134246f, 0.144836f, 0.156248f, 0.167997f, 0.181050f, 0.196383f, 0.212049f, 0.225943f, 0.239050f, 0.252450f, 0.264499f, 0.274458f, 0.284930f, 0.297257f, 0.308914f, 0.318683f, 0.329107f, 0.340350f, 0.347916f, 0.350893f, 0.354868f, 0.358797f, 0.345304f, 0.296893f, 0.224114f, 0.168317f}, + { 0.032265f, 0.058092f, 0.073219f, 0.041427f, -0.027377f, -0.074710f, -0.054839f, 0.005525f, 0.033420f, -0.004645f, -0.074163f, -0.131671f, -0.164722f, -0.155087f, -0.066220f, 0.075605f, 0.140276f, 0.027223f, -0.171436f, -0.236113f, -0.070379f, 0.189981f, 0.347922f, 0.350289f, 0.275749f, 0.188927f, 0.086500f, -0.040928f, -0.171421f, -0.284063f, -0.381731f, -0.470062f, -0.541769f, -0.589134f, -0.613034f, -0.615565f, -0.596996f, -0.561345f, -0.515497f, -0.463484f, -0.407689f, -0.352161f, -0.299365f, -0.247826f, -0.196903f, -0.149167f, -0.105444f, -0.063031f, -0.021015f, 0.017920f, 0.052064f, 0.081783f, 0.105940f, 0.122756f, 0.134246f, 0.144836f, 0.156248f, 0.167997f, 0.181050f, 0.196383f, 0.212049f, 0.225943f, 0.239050f, 0.252450f, 0.264499f, 0.274458f, 0.284930f, 0.297257f, 0.308914f, 0.318683f, 0.329107f, 0.340350f, 0.347916f, 0.350893f, 0.354868f, 0.358797f, 0.345304f, 0.296893f, 0.224114f, 0.168317f} + }, + { + { 0.011552f, 0.000565f, -0.003312f, 0.012114f, 0.034643f, 0.042894f, 0.038718f, 0.047434f, 0.078185f, 0.098700f, 0.060730f, -0.052718f, -0.197397f, -0.271665f, -0.179838f, 0.052824f, 0.238687f, 0.183493f, -0.084160f, -0.306954f, -0.270000f, -0.022547f, 0.219181f, 0.324412f, 0.323963f, 0.283599f, 0.211949f, 0.102569f, -0.017904f, -0.119553f, -0.202749f, -0.277404f, -0.338929f, -0.381318f, -0.410145f, -0.429239f, -0.431485f, -0.411399f, -0.374227f, -0.328491f, -0.279921f, -0.233766f, -0.193863f, -0.159140f, -0.127047f, -0.098014f, -0.072129f, -0.046232f, -0.018734f, 0.007677f, 0.031175f, 0.053092f, 0.073299f, 0.089460f, 0.102015f, 0.113996f, 0.125945f, 0.136708f, 0.147823f, 0.161322f, 0.175607f, 0.188937f, 0.203404f, 0.220320f, 0.236539f, 0.250298f, 0.264790f, 0.281291f, 0.295883f, 0.307388f, 0.320088f, 0.334110f, 0.343177f, 0.346983f, 0.353477f, 0.359929f, 0.343271f, 0.284042f, 0.198067f, 0.133818f}, + { -0.011552f, -0.000565f, 0.003312f, -0.012114f, -0.034643f, -0.042894f, -0.038718f, -0.047434f, -0.078185f, -0.098700f, -0.060730f, 0.052718f, 0.197397f, 0.271665f, 0.179838f, -0.052824f, -0.238687f, -0.183493f, 0.084160f, 0.306954f, 0.270000f, 0.022547f, -0.219181f, -0.324412f, -0.323963f, -0.283599f, -0.211949f, -0.102569f, 0.017904f, 0.119553f, 0.202749f, 0.277404f, 0.338929f, 0.381318f, 0.410145f, 0.429239f, 0.431485f, 0.411399f, 0.374227f, 0.328491f, 0.279921f, 0.233766f, 0.193863f, 0.159140f, 0.127047f, 0.098014f, 0.072129f, 0.046232f, 0.018734f, -0.007677f, -0.031175f, -0.053092f, -0.073299f, -0.089460f, -0.102015f, -0.113996f, -0.125945f, -0.136708f, -0.147823f, -0.161322f, -0.175607f, -0.188937f, -0.203404f, -0.220320f, -0.236539f, -0.250298f, -0.264790f, -0.281291f, -0.295883f, -0.307388f, -0.320088f, -0.334110f, -0.343177f, -0.346983f, -0.353477f, -0.359929f, -0.343271f, -0.284042f, -0.198067f, -0.133818f} + }, + { + { 0.051162f, 0.004630f, -0.001227f, 0.050366f, 0.063139f, -0.012808f, -0.073989f, 0.003079f, 0.174556f, 0.264299f, 0.172675f, -0.020436f, -0.159153f, -0.156052f, -0.032841f, 0.113831f, 0.167176f, 0.075277f, -0.079544f, -0.141124f, -0.047299f, 0.099392f, 0.161108f, 0.119504f, 0.056727f, 0.028236f, 0.022203f, 0.022582f, 0.040897f, 0.080790f, 0.122332f, 0.151311f, 0.170587f, 0.180438f, 0.176020f, 0.162553f, 0.148761f, 0.129984f, 0.097918f, 0.058507f, 0.022731f, -0.008873f, -0.037674f, -0.057264f, -0.065527f, -0.071491f, -0.080334f, -0.087226f, -0.091495f, -0.098993f, -0.107772f, -0.110111f, -0.108138f, -0.108645f, -0.106898f, -0.094525f, -0.075444f, -0.055728f, -0.029601f, 0.007217f, 0.045808f, 0.081023f, 0.120922f, 0.166769f, 0.206984f, 0.240262f, 0.277196f, 0.313665f, 0.334528f, 0.343916f, 0.355052f, 0.356025f, 0.328945f, 0.289951f, 0.257626f, 0.201059f, 0.086037f, -0.044980f, -0.115572f, -0.123491f}, + { -0.051162f, -0.004630f, 0.001227f, -0.050366f, -0.063139f, 0.012808f, 0.073989f, -0.003079f, -0.174556f, -0.264299f, -0.172675f, 0.020436f, 0.159153f, 0.156052f, 0.032841f, -0.113831f, -0.167176f, -0.075277f, 0.079544f, 0.141124f, 0.047299f, -0.099392f, -0.161108f, -0.119504f, -0.056727f, -0.028236f, -0.022203f, -0.022582f, -0.040897f, -0.080790f, -0.122332f, -0.151311f, -0.170587f, -0.180438f, -0.176020f, -0.162553f, -0.148761f, -0.129984f, -0.097918f, -0.058507f, -0.022731f, 0.008873f, 0.037674f, 0.057264f, 0.065527f, 0.071491f, 0.080334f, 0.087226f, 0.091495f, 0.098993f, 0.107772f, 0.110111f, 0.108138f, 0.108645f, 0.106898f, 0.094525f, 0.075444f, 0.055728f, 0.029601f, -0.007217f, -0.045808f, -0.081023f, -0.120922f, -0.166769f, -0.206984f, -0.240262f, -0.277196f, -0.313665f, -0.334528f, -0.343916f, -0.355052f, -0.356025f, -0.328945f, -0.289951f, -0.257626f, -0.201059f, -0.086037f, 0.044980f, 0.115572f, 0.123491f} + }, + { + { -0.001314f, 0.013986f, 0.009786f, -0.021568f, -0.047753f, -0.057550f, -0.086395f, -0.154169f, -0.215190f, -0.199014f, -0.071655f, 0.152694f, 0.397084f, 0.495990f, 0.293761f, -0.132217f, -0.431993f, -0.318278f, 0.082383f, 0.358067f, 0.288935f, 0.046365f, -0.101534f, -0.106415f, -0.078828f, -0.063480f, -0.018297f, 0.055798f, 0.098862f, 0.089346f, 0.066346f, 0.059485f, 0.060855f, 0.062340f, 0.070487f, 0.084437f, 0.093707f, 0.096733f, 0.099690f, 0.102715f, 0.102674f, 0.100995f, 0.097996f, 0.089458f, 0.075691f, 0.063124f, 0.053174f, 0.040888f, 0.025646f, 0.011582f, -0.001922f, -0.019025f, -0.038853f, -0.058009f, -0.077789f, -0.100164f, -0.121936f, -0.140242f, -0.157366f, -0.174332f, -0.187554f, -0.195964f, -0.202516f, -0.206222f, -0.202547f, -0.192157f, -0.178650f, -0.159543f, -0.131095f, -0.097600f, -0.063527f, -0.024200f, 0.022505f, 0.067763f, 0.110169f, 0.162198f, 0.215318f, 0.224924f, 0.168949f, 0.102011f}, + { -0.001314f, 0.013986f, 0.009786f, -0.021568f, -0.047753f, -0.057550f, -0.086395f, -0.154169f, -0.215190f, -0.199014f, -0.071655f, 0.152694f, 0.397084f, 0.495990f, 0.293761f, -0.132217f, -0.431993f, -0.318278f, 0.082383f, 0.358067f, 0.288935f, 0.046365f, -0.101534f, -0.106415f, -0.078828f, -0.063480f, -0.018297f, 0.055798f, 0.098862f, 0.089346f, 0.066346f, 0.059485f, 0.060855f, 0.062340f, 0.070487f, 0.084437f, 0.093707f, 0.096733f, 0.099690f, 0.102715f, 0.102674f, 0.100995f, 0.097996f, 0.089458f, 0.075691f, 0.063124f, 0.053174f, 0.040888f, 0.025646f, 0.011582f, -0.001922f, -0.019025f, -0.038853f, -0.058009f, -0.077789f, -0.100164f, -0.121936f, -0.140242f, -0.157366f, -0.174332f, -0.187554f, -0.195964f, -0.202516f, -0.206222f, -0.202547f, -0.192157f, -0.178650f, -0.159543f, -0.131095f, -0.097600f, -0.063527f, -0.024200f, 0.022505f, 0.067763f, 0.110169f, 0.162198f, 0.215318f, 0.224924f, 0.168949f, 0.102011f} + }, + { + { 0.042103f, -0.013452f, -0.091487f, -0.148327f, -0.144124f, -0.055175f, 0.091983f, 0.204935f, 0.191965f, 0.062580f, -0.072721f, -0.121327f, -0.093551f, -0.051022f, -0.017300f, 0.017247f, 0.037857f, 0.014410f, -0.039540f, -0.070060f, -0.052305f, -0.017107f, 0.000424f, 0.004587f, 0.018491f, 0.047099f, 0.077608f, 0.099837f, 0.110945f, 0.108370f, 0.089842f, 0.058821f, 0.024413f, -0.005114f, -0.028508f, -0.051222f, -0.078453f, -0.109684f, -0.140991f, -0.169087f, -0.190473f, -0.201281f, -0.201941f, -0.197857f, -0.192519f, -0.184895f, -0.175234f, -0.166555f, -0.158810f, -0.148859f, -0.137050f, -0.126350f, -0.115695f, -0.102138f, -0.087471f, -0.074652f, -0.061324f, -0.044873f, -0.028707f, -0.015999f, -0.004116f, 0.008155f, 0.016586f, 0.020249f, 0.023972f, 0.028420f, 0.029801f, 0.030588f, 0.036368f, 0.043745f, 0.047696f, 0.055248f, 0.072784f, 0.090791f, 0.104872f, 0.134221f, 0.185880f, 0.221150f, 0.203371f, 0.163391f}, + { 0.042103f, -0.013452f, -0.091487f, -0.148327f, -0.144124f, -0.055175f, 0.091983f, 0.204935f, 0.191965f, 0.062580f, -0.072721f, -0.121327f, -0.093551f, -0.051022f, -0.017300f, 0.017247f, 0.037857f, 0.014410f, -0.039540f, -0.070060f, -0.052305f, -0.017107f, 0.000424f, 0.004587f, 0.018491f, 0.047099f, 0.077608f, 0.099837f, 0.110945f, 0.108370f, 0.089842f, 0.058821f, 0.024413f, -0.005114f, -0.028508f, -0.051222f, -0.078453f, -0.109684f, -0.140991f, -0.169087f, -0.190473f, -0.201281f, -0.201941f, -0.197857f, -0.192519f, -0.184895f, -0.175234f, -0.166555f, -0.158810f, -0.148859f, -0.137050f, -0.126350f, -0.115695f, -0.102138f, -0.087471f, -0.074652f, -0.061324f, -0.044873f, -0.028707f, -0.015999f, -0.004116f, 0.008155f, 0.016586f, 0.020249f, 0.023972f, 0.028420f, 0.029801f, 0.030588f, 0.036368f, 0.043745f, 0.047696f, 0.055248f, 0.072784f, 0.090791f, 0.104872f, 0.134221f, 0.185880f, 0.221150f, 0.203371f, 0.163391f} + }, + { + { -0.017545f, 0.076968f, 0.147238f, 0.125289f, 0.049414f, -0.057820f, -0.233434f, -0.448356f, -0.560146f, -0.463019f, -0.188026f, 0.190602f, 0.597571f, 0.824948f, 0.577274f, -0.126396f, -0.739164f, -0.676925f, -0.006837f, 0.613537f, 0.701525f, 0.399638f, 0.115282f, -0.003365f, -0.072131f, -0.166089f, -0.238583f, -0.264945f, -0.284852f, -0.312500f, -0.316805f, -0.287275f, -0.246557f, -0.204600f, -0.151995f, -0.090222f, -0.031983f, 0.019104f, 0.064902f, 0.100523f, 0.122410f, 0.136855f, 0.149719f, 0.158877f, 0.162462f, 0.163196f, 0.161570f, 0.155005f, 0.144910f, 0.136207f, 0.130365f, 0.125254f, 0.119853f, 0.114133f, 0.106910f, 0.097381f, 0.086310f, 0.074005f, 0.059767f, 0.043801f, 0.027185f, 0.010169f, -0.007656f, -0.026211f, -0.045001f, -0.063487f, -0.081298f, -0.098501f, -0.114708f, -0.128404f, -0.139398f, -0.150144f, -0.161200f, -0.169677f, -0.177286f, -0.191238f, -0.207043f, -0.202388f, -0.166936f, -0.129206f}, + { -0.017545f, 0.076968f, 0.147238f, 0.125289f, 0.049414f, -0.057820f, -0.233434f, -0.448356f, -0.560146f, -0.463019f, -0.188026f, 0.190602f, 0.597571f, 0.824948f, 0.577274f, -0.126396f, -0.739164f, -0.676925f, -0.006837f, 0.613537f, 0.701525f, 0.399638f, 0.115282f, -0.003365f, -0.072131f, -0.166089f, -0.238583f, -0.264945f, -0.284852f, -0.312500f, -0.316805f, -0.287275f, -0.246557f, -0.204600f, -0.151995f, -0.090222f, -0.031983f, 0.019104f, 0.064902f, 0.100523f, 0.122410f, 0.136855f, 0.149719f, 0.158877f, 0.162462f, 0.163196f, 0.161570f, 0.155005f, 0.144910f, 0.136207f, 0.130365f, 0.125254f, 0.119853f, 0.114133f, 0.106910f, 0.097381f, 0.086310f, 0.074005f, 0.059767f, 0.043801f, 0.027185f, 0.010169f, -0.007656f, -0.026211f, -0.045001f, -0.063487f, -0.081298f, -0.098501f, -0.114708f, -0.128404f, -0.139398f, -0.150144f, -0.161200f, -0.169677f, -0.177286f, -0.191238f, -0.207043f, -0.202388f, -0.166936f, -0.129206f} + }, + { + { -0.006941f, -0.009137f, -0.001025f, 0.023181f, 0.071280f, 0.152288f, 0.232381f, 0.241767f, 0.159918f, 0.019441f, -0.191250f, -0.477987f, -0.641445f, -0.366185f, 0.303140f, 0.785583f, 0.561935f, -0.151779f, -0.630912f, -0.503217f, -0.082209f, 0.167454f, 0.171480f, 0.133590f, 0.151479f, 0.158082f, 0.114516f, 0.066176f, 0.040238f, 0.013478f, -0.024102f, -0.051025f, -0.056634f, -0.052834f, -0.047949f, -0.040161f, -0.030751f, -0.023050f, -0.014898f, -0.004699f, 0.003065f, 0.006126f, 0.009138f, 0.014713f, 0.018779f, 0.018792f, 0.018156f, 0.019353f, 0.020281f, 0.020049f, 0.021722f, 0.026967f, 0.033551f, 0.039947f, 0.047332f, 0.055643f, 0.062465f, 0.067092f, 0.071222f, 0.074871f, 0.076231f, 0.075857f, 0.075991f, 0.075860f, 0.073017f, 0.068571f, 0.065118f, 0.061079f, 0.053861f, 0.045973f, 0.040311f, 0.033378f, 0.022033f, 0.010850f, 0.001847f, -0.014432f, -0.042350f, -0.064916f, -0.064261f, -0.051262f}, + { 0.006941f, 0.009137f, 0.001025f, -0.023181f, -0.071280f, -0.152288f, -0.232381f, -0.241767f, -0.159918f, -0.019441f, 0.191250f, 0.477987f, 0.641445f, 0.366185f, -0.303140f, -0.785583f, -0.561935f, 0.151779f, 0.630912f, 0.503217f, 0.082209f, -0.167454f, -0.171480f, -0.133590f, -0.151479f, -0.158082f, -0.114516f, -0.066176f, -0.040238f, -0.013478f, 0.024102f, 0.051025f, 0.056634f, 0.052834f, 0.047949f, 0.040161f, 0.030751f, 0.023050f, 0.014898f, 0.004699f, -0.003065f, -0.006126f, -0.009138f, -0.014713f, -0.018779f, -0.018792f, -0.018156f, -0.019353f, -0.020281f, -0.020049f, -0.021722f, -0.026967f, -0.033551f, -0.039947f, -0.047332f, -0.055643f, -0.062465f, -0.067092f, -0.071222f, -0.074871f, -0.076231f, -0.075857f, -0.075991f, -0.075860f, -0.073017f, -0.068571f, -0.065118f, -0.061079f, -0.053861f, -0.045973f, -0.040311f, -0.033378f, -0.022033f, -0.010850f, -0.001847f, 0.014432f, 0.042350f, 0.064916f, 0.064261f, 0.051262f} + }, + { + { -0.009108f, -0.000638f, 0.006579f, 0.001811f, -0.025320f, -0.072975f, -0.099878f, -0.046177f, 0.078173f, 0.161617f, 0.109552f, -0.025830f, -0.103052f, -0.069323f, -0.005915f, 0.007950f, -0.006548f, 0.003625f, 0.029014f, 0.026490f, -0.001964f, -0.017075f, -0.008856f, -0.005898f, -0.023342f, -0.040994f, -0.037654f, -0.018706f, -0.001195f, 0.008790f, 0.013986f, 0.014099f, 0.006255f, -0.008494f, -0.025735f, -0.041885f, -0.054703f, -0.062996f, -0.068182f, -0.073039f, -0.077308f, -0.077697f, -0.073146f, -0.066479f, -0.060233f, -0.054842f, -0.051364f, -0.051522f, -0.054305f, -0.056526f, -0.056981f, -0.056335f, -0.053803f, -0.048110f, -0.040567f, -0.033134f, -0.025166f, -0.015716f, -0.006373f, 0.001714f, 0.010176f, 0.019674f, 0.028014f, 0.034461f, 0.040938f, 0.047298f, 0.051293f, 0.053861f, 0.057721f, 0.061503f, 0.062963f, 0.065308f, 0.071389f, 0.076861f, 0.080196f, 0.090996f, 0.112659f, 0.126656f, 0.115757f, 0.095245f}, + { 0.009108f, 0.000638f, -0.006579f, -0.001811f, 0.025320f, 0.072975f, 0.099878f, 0.046177f, -0.078173f, -0.161617f, -0.109552f, 0.025830f, 0.103052f, 0.069323f, 0.005915f, -0.007950f, 0.006548f, -0.003625f, -0.029014f, -0.026490f, 0.001964f, 0.017075f, 0.008856f, 0.005898f, 0.023342f, 0.040994f, 0.037654f, 0.018706f, 0.001195f, -0.008790f, -0.013986f, -0.014099f, -0.006255f, 0.008494f, 0.025735f, 0.041885f, 0.054703f, 0.062996f, 0.068182f, 0.073039f, 0.077308f, 0.077697f, 0.073146f, 0.066479f, 0.060233f, 0.054842f, 0.051364f, 0.051522f, 0.054305f, 0.056526f, 0.056981f, 0.056335f, 0.053803f, 0.048110f, 0.040567f, 0.033134f, 0.025166f, 0.015716f, 0.006373f, -0.001714f, -0.010176f, -0.019674f, -0.028014f, -0.034461f, -0.040938f, -0.047298f, -0.051293f, -0.053861f, -0.057721f, -0.061503f, -0.062963f, -0.065308f, -0.071389f, -0.076861f, -0.080196f, -0.090996f, -0.112659f, -0.126656f, -0.115757f, -0.095245f} + }, + { + { -0.036299f, -0.021576f, 0.008339f, 0.022024f, -0.006026f, -0.023441f, 0.054545f, 0.203109f, 0.258935f, 0.083497f, -0.260111f, -0.516144f, -0.440053f, -0.037701f, 0.381792f, 0.458565f, 0.145761f, -0.228806f, -0.323180f, -0.139235f, 0.059116f, 0.103770f, 0.056741f, 0.022598f, -0.002741f, -0.054614f, -0.101353f, -0.098354f, -0.066298f, -0.053021f, -0.063515f, -0.072217f, -0.068674f, -0.055829f, -0.030066f, 0.010072f, 0.053291f, 0.089027f, 0.117100f, 0.138411f, 0.151225f, 0.158410f, 0.164831f, 0.168991f, 0.167807f, 0.164211f, 0.160954f, 0.154801f, 0.144154f, 0.132890f, 0.121469f, 0.104824f, 0.081993f, 0.056942f, 0.029818f, -0.001262f, -0.032295f, -0.058604f, -0.083127f, -0.109320f, -0.133549f, -0.153530f, -0.173701f, -0.194504f, -0.209278f, -0.217046f, -0.222920f, -0.223700f, -0.211596f, -0.190929f, -0.169788f, -0.141148f, -0.097122f, -0.049726f, -0.007241f, 0.050044f, 0.129214f, 0.183903f, 0.170356f, 0.125994f}, + { 0.036299f, 0.021576f, -0.008339f, -0.022024f, 0.006026f, 0.023441f, -0.054545f, -0.203109f, -0.258935f, -0.083497f, 0.260111f, 0.516144f, 0.440053f, 0.037701f, -0.381792f, -0.458565f, -0.145761f, 0.228806f, 0.323180f, 0.139235f, -0.059116f, -0.103770f, -0.056741f, -0.022598f, 0.002741f, 0.054614f, 0.101353f, 0.098354f, 0.066298f, 0.053021f, 0.063515f, 0.072217f, 0.068674f, 0.055829f, 0.030066f, -0.010072f, -0.053291f, -0.089027f, -0.117100f, -0.138411f, -0.151225f, -0.158410f, -0.164831f, -0.168991f, -0.167807f, -0.164211f, -0.160954f, -0.154801f, -0.144154f, -0.132890f, -0.121469f, -0.104824f, -0.081993f, -0.056942f, -0.029818f, 0.001262f, 0.032295f, 0.058604f, 0.083127f, 0.109320f, 0.133549f, 0.153530f, 0.173701f, 0.194504f, 0.209278f, 0.217046f, 0.222920f, 0.223700f, 0.211596f, 0.190929f, 0.169788f, 0.141148f, 0.097122f, 0.049726f, 0.007241f, -0.050044f, -0.129214f, -0.183903f, -0.170356f, -0.125994f} + }, + { + { -0.025047f, -0.028754f, -0.028569f, -0.015495f, 0.010196f, 0.035640f, 0.044337f, 0.024249f, -0.028081f, -0.094389f, -0.127559f, -0.087289f, 0.004235f, 0.069146f, 0.055857f, -0.007075f, -0.056597f, -0.069039f, -0.062730f, -0.050133f, -0.024468f, 0.012365f, 0.041470f, 0.052445f, 0.056366f, 0.065583f, 0.073587f, 0.063210f, 0.028539f, -0.017899f, -0.057371f, -0.079077f, -0.082830f, -0.074407f, -0.062370f, -0.055041f, -0.054380f, -0.054159f, -0.048181f, -0.037707f, -0.027394f, -0.018485f, -0.010478f, -0.004506f, -0.000331f, 0.005219f, 0.013155f, 0.020828f, 0.027469f, 0.034894f, 0.041923f, 0.045338f, 0.046128f, 0.047149f, 0.046350f, 0.040257f, 0.030844f, 0.020980f, 0.008220f, -0.009083f, -0.026461f, -0.041430f, -0.058137f, -0.077722f, -0.094897f, -0.109097f, -0.126050f, -0.144888f, -0.158763f, -0.169239f, -0.182316f, -0.191952f, -0.188522f, -0.178697f, -0.171250f, -0.150620f, -0.097096f, -0.027594f, 0.019215f, 0.033651f}, + { -0.025047f, -0.028754f, -0.028569f, -0.015495f, 0.010196f, 0.035640f, 0.044337f, 0.024249f, -0.028081f, -0.094389f, -0.127559f, -0.087289f, 0.004235f, 0.069146f, 0.055857f, -0.007075f, -0.056597f, -0.069039f, -0.062730f, -0.050133f, -0.024468f, 0.012365f, 0.041470f, 0.052445f, 0.056366f, 0.065583f, 0.073587f, 0.063210f, 0.028539f, -0.017899f, -0.057371f, -0.079077f, -0.082830f, -0.074407f, -0.062370f, -0.055041f, -0.054380f, -0.054159f, -0.048181f, -0.037707f, -0.027394f, -0.018485f, -0.010478f, -0.004506f, -0.000331f, 0.005219f, 0.013155f, 0.020828f, 0.027469f, 0.034894f, 0.041923f, 0.045338f, 0.046128f, 0.047149f, 0.046350f, 0.040257f, 0.030844f, 0.020980f, 0.008220f, -0.009083f, -0.026461f, -0.041430f, -0.058137f, -0.077722f, -0.094897f, -0.109097f, -0.126050f, -0.144888f, -0.158763f, -0.169239f, -0.182316f, -0.191952f, -0.188522f, -0.178697f, -0.171250f, -0.150620f, -0.097096f, -0.027594f, 0.019215f, 0.033651f} + }, + { + { -0.033005f, -0.036257f, -0.019445f, 0.020321f, 0.057860f, 0.074577f, 0.063661f, 0.007800f, -0.096480f, -0.187851f, -0.173226f, -0.040226f, 0.105389f, 0.146569f, 0.072525f, -0.031645f, -0.081998f, -0.057456f, 0.006102f, 0.049635f, 0.032558f, -0.032467f, -0.090130f, -0.098890f, -0.066699f, -0.025791f, 0.006963f, 0.032157f, 0.050494f, 0.061958f, 0.071686f, 0.082610f, 0.088992f, 0.085509f, 0.075402f, 0.063868f, 0.050996f, 0.035750f, 0.020313f, 0.007358f, -0.002044f, -0.007197f, -0.008819f, -0.010228f, -0.013890f, -0.019307f, -0.026762f, -0.038606f, -0.054410f, -0.070003f, -0.083022f, -0.094042f, -0.102024f, -0.104979f, -0.104775f, -0.105066f, -0.105910f, -0.106145f, -0.107843f, -0.112681f, -0.118356f, -0.123577f, -0.130694f, -0.139213f, -0.144218f, -0.144444f, -0.143029f, -0.138673f, -0.126828f, -0.109819f, -0.093429f, -0.075360f, -0.051148f, -0.026508f, -0.006566f, 0.019079f, 0.058133f, 0.091618f, 0.096195f, 0.083166f}, + { -0.033005f, -0.036257f, -0.019445f, 0.020321f, 0.057860f, 0.074577f, 0.063661f, 0.007800f, -0.096480f, -0.187851f, -0.173226f, -0.040226f, 0.105389f, 0.146569f, 0.072525f, -0.031645f, -0.081998f, -0.057456f, 0.006102f, 0.049635f, 0.032558f, -0.032467f, -0.090130f, -0.098890f, -0.066699f, -0.025791f, 0.006963f, 0.032157f, 0.050494f, 0.061958f, 0.071686f, 0.082610f, 0.088992f, 0.085509f, 0.075402f, 0.063868f, 0.050996f, 0.035750f, 0.020313f, 0.007358f, -0.002044f, -0.007197f, -0.008819f, -0.010228f, -0.013890f, -0.019307f, -0.026762f, -0.038606f, -0.054410f, -0.070003f, -0.083022f, -0.094042f, -0.102024f, -0.104979f, -0.104775f, -0.105066f, -0.105910f, -0.106145f, -0.107843f, -0.112681f, -0.118356f, -0.123577f, -0.130694f, -0.139213f, -0.144218f, -0.144444f, -0.143029f, -0.138673f, -0.126828f, -0.109819f, -0.093429f, -0.075360f, -0.051148f, -0.026508f, -0.006566f, 0.019079f, 0.058133f, 0.091618f, 0.096195f, 0.083166f} + }, + { + { 0.001244f, -0.011714f, -0.018975f, -0.019388f, -0.028242f, -0.031454f, 0.013230f, 0.095142f, 0.112352f, -0.016836f, -0.210437f, -0.270105f, -0.109627f, 0.120234f, 0.193261f, 0.063294f, -0.105565f, -0.151978f, -0.085969f, -0.022310f, -0.012774f, -0.007520f, 0.041667f, 0.109371f, 0.143796f, 0.138462f, 0.124355f, 0.115741f, 0.097689f, 0.058191f, 0.004528f, -0.051150f, -0.101799f, -0.140639f, -0.162437f, -0.170701f, -0.172906f, -0.170378f, -0.161243f, -0.148300f, -0.135406f, -0.121911f, -0.108101f, -0.099258f, -0.097962f, -0.099850f, -0.101590f, -0.104536f, -0.107601f, -0.106247f, -0.100485f, -0.094225f, -0.086781f, -0.074970f, -0.061475f, -0.051088f, -0.042559f, -0.033713f, -0.028432f, -0.029468f, -0.032466f, -0.035073f, -0.041591f, -0.052187f, -0.060305f, -0.065417f, -0.073316f, -0.081610f, -0.082466f, -0.078897f, -0.077999f, -0.072670f, -0.053724f, -0.030703f, -0.011855f, 0.021724f, 0.084005f, 0.142124f, 0.153989f, 0.135267f}, + { 0.001244f, -0.011714f, -0.018975f, -0.019388f, -0.028242f, -0.031454f, 0.013230f, 0.095142f, 0.112352f, -0.016836f, -0.210437f, -0.270105f, -0.109627f, 0.120234f, 0.193261f, 0.063294f, -0.105565f, -0.151978f, -0.085969f, -0.022310f, -0.012774f, -0.007520f, 0.041667f, 0.109371f, 0.143796f, 0.138462f, 0.124355f, 0.115741f, 0.097689f, 0.058191f, 0.004528f, -0.051150f, -0.101799f, -0.140639f, -0.162437f, -0.170701f, -0.172906f, -0.170378f, -0.161243f, -0.148300f, -0.135406f, -0.121911f, -0.108101f, -0.099258f, -0.097962f, -0.099850f, -0.101590f, -0.104536f, -0.107601f, -0.106247f, -0.100485f, -0.094225f, -0.086781f, -0.074970f, -0.061475f, -0.051088f, -0.042559f, -0.033713f, -0.028432f, -0.029468f, -0.032466f, -0.035073f, -0.041591f, -0.052187f, -0.060305f, -0.065417f, -0.073316f, -0.081610f, -0.082466f, -0.078897f, -0.077999f, -0.072670f, -0.053724f, -0.030703f, -0.011855f, 0.021724f, 0.084005f, 0.142124f, 0.153989f, 0.135267f} + }, + { + { -0.013036f, -0.012005f, -0.010946f, -0.010336f, -0.011806f, -0.018223f, -0.025154f, -0.017942f, 0.005606f, 0.011671f, -0.037994f, -0.113752f, -0.116094f, 0.005214f, 0.150250f, 0.156107f, -0.002268f, -0.162837f, -0.163654f, -0.027056f, 0.091762f, 0.097477f, 0.030660f, -0.026612f, -0.045438f, -0.038626f, -0.014564f, 0.023807f, 0.062441f, 0.085957f, 0.093102f, 0.090477f, 0.081990f, 0.071815f, 0.066281f, 0.065817f, 0.062838f, 0.051246f, 0.031641f, 0.006718f, -0.021218f, -0.047928f, -0.068727f, -0.082506f, -0.090476f, -0.092952f, -0.090869f, -0.087450f, -0.085084f, -0.083439f, -0.082526f, -0.083859f, -0.087311f, -0.090779f, -0.093524f, -0.095999f, -0.097064f, -0.095528f, -0.093135f, -0.092047f, -0.091608f, -0.091215f, -0.092962f, -0.097813f, -0.103266f, -0.108015f, -0.113964f, -0.121091f, -0.126325f, -0.129603f, -0.133962f, -0.138229f, -0.137962f, -0.134611f, -0.133515f, -0.130971f, -0.114570f, -0.080508f, -0.041940f, -0.017332f}, + { -0.013036f, -0.012005f, -0.010946f, -0.010336f, -0.011806f, -0.018223f, -0.025154f, -0.017942f, 0.005606f, 0.011671f, -0.037994f, -0.113752f, -0.116094f, 0.005214f, 0.150250f, 0.156107f, -0.002268f, -0.162837f, -0.163654f, -0.027056f, 0.091762f, 0.097477f, 0.030660f, -0.026612f, -0.045438f, -0.038626f, -0.014564f, 0.023807f, 0.062441f, 0.085957f, 0.093102f, 0.090477f, 0.081990f, 0.071815f, 0.066281f, 0.065817f, 0.062838f, 0.051246f, 0.031641f, 0.006718f, -0.021218f, -0.047928f, -0.068727f, -0.082506f, -0.090476f, -0.092952f, -0.090869f, -0.087450f, -0.085084f, -0.083439f, -0.082526f, -0.083859f, -0.087311f, -0.090779f, -0.093524f, -0.095999f, -0.097064f, -0.095528f, -0.093135f, -0.092047f, -0.091608f, -0.091215f, -0.092962f, -0.097813f, -0.103266f, -0.108015f, -0.113964f, -0.121091f, -0.126325f, -0.129603f, -0.133962f, -0.138229f, -0.137962f, -0.134611f, -0.133515f, -0.130971f, -0.114570f, -0.080508f, -0.041940f, -0.017332f} + } +}; +const float CRendBin_HOA3_HRIR_coeff_im_16kHz[16][BINAURAL_CHANNELS][80]={ + { + { -0.177326f, -0.487059f, -0.688283f, -0.768556f, -0.752979f, -0.684514f, -0.599780f, -0.496150f, -0.338007f, -0.118021f, 0.117601f, 0.327026f, 0.493513f, 0.540869f, 0.331702f, -0.114816f, -0.473318f, -0.386772f, 0.079465f, 0.440207f, 0.323651f, -0.145870f, -0.579736f, -0.778395f, -0.813983f, -0.787794f, -0.702264f, -0.551636f, -0.383614f, -0.237862f, -0.107087f, 0.020217f, 0.132968f, 0.222907f, 0.297407f, 0.362059f, 0.415348f, 0.458635f, 0.495122f, 0.524689f, 0.548673f, 0.570929f, 0.590645f, 0.604357f, 0.614127f, 0.623417f, 0.629725f, 0.630908f, 0.630925f, 0.631539f, 0.628735f, 0.622443f, 0.617331f, 0.612036f, 0.601631f, 0.589119f, 0.579764f, 0.569621f, 0.554496f, 0.540418f, 0.531134f, 0.519368f, 0.502799f, 0.490106f, 0.481669f, 0.467444f, 0.449557f, 0.439167f, 0.430774f, 0.412237f, 0.393245f, 0.385818f, 0.373300f, 0.343565f, 0.321957f, 0.311994f, 0.249042f, 0.099998f, -0.035738f, -0.039462f}, + { -0.177326f, -0.487059f, -0.688283f, -0.768556f, -0.752979f, -0.684514f, -0.599780f, -0.496150f, -0.338007f, -0.118021f, 0.117601f, 0.327026f, 0.493513f, 0.540869f, 0.331702f, -0.114816f, -0.473318f, -0.386772f, 0.079465f, 0.440207f, 0.323651f, -0.145870f, -0.579736f, -0.778395f, -0.813983f, -0.787794f, -0.702264f, -0.551636f, -0.383614f, -0.237862f, -0.107087f, 0.020217f, 0.132968f, 0.222907f, 0.297407f, 0.362059f, 0.415348f, 0.458635f, 0.495122f, 0.524689f, 0.548673f, 0.570929f, 0.590645f, 0.604357f, 0.614127f, 0.623417f, 0.629725f, 0.630908f, 0.630925f, 0.631539f, 0.628735f, 0.622443f, 0.617331f, 0.612036f, 0.601631f, 0.589119f, 0.579764f, 0.569621f, 0.554496f, 0.540418f, 0.531134f, 0.519368f, 0.502799f, 0.490106f, 0.481669f, 0.467444f, 0.449557f, 0.439167f, 0.430774f, 0.412237f, 0.393245f, 0.385818f, 0.373300f, 0.343565f, 0.321957f, 0.311994f, 0.249042f, 0.099998f, -0.035738f, -0.039462f} + }, + { + { 0.139379f, 0.334475f, 0.302418f, -0.001740f, -0.470657f, -0.918060f, -1.205378f, -1.264950f, -1.068335f, -0.667808f, -0.206855f, 0.225808f, 0.664665f, 1.029106f, 0.958676f, 0.223895f, -0.711948f, -0.958987f, -0.218731f, 0.776762f, 1.088344f, 0.584741f, -0.131994f, -0.574116f, -0.760032f, -0.866210f, -0.902940f, -0.825573f, -0.695964f, -0.595691f, -0.515122f, -0.414746f, -0.305467f, -0.213289f, -0.131852f, -0.047320f, 0.035561f, 0.111395f, 0.184753f, 0.256163f, 0.320948f, 0.379770f, 0.434479f, 0.481617f, 0.520017f, 0.553844f, 0.583536f, 0.605648f, 0.621334f, 0.633823f, 0.642170f, 0.646572f, 0.651242f, 0.655765f, 0.655221f, 0.651172f, 0.648535f, 0.643768f, 0.631801f, 0.617925f, 0.606967f, 0.592474f, 0.571477f, 0.552782f, 0.538082f, 0.517509f, 0.492647f, 0.475480f, 0.461290f, 0.437183f, 0.413126f, 0.403158f, 0.390400f, 0.360546f, 0.340803f, 0.339290f, 0.288776f, 0.145051f, -0.000376f, -0.026236f}, + { -0.139379f, -0.334475f, -0.302418f, 0.001740f, 0.470657f, 0.918060f, 1.205378f, 1.264950f, 1.068335f, 0.667808f, 0.206855f, -0.225808f, -0.664665f, -1.029106f, -0.958676f, -0.223895f, 0.711948f, 0.958987f, 0.218731f, -0.776762f, -1.088344f, -0.584741f, 0.131994f, 0.574116f, 0.760032f, 0.866210f, 0.902940f, 0.825573f, 0.695964f, 0.595691f, 0.515122f, 0.414746f, 0.305467f, 0.213289f, 0.131852f, 0.047320f, -0.035561f, -0.111395f, -0.184753f, -0.256163f, -0.320948f, -0.379770f, -0.434479f, -0.481617f, -0.520017f, -0.553844f, -0.583536f, -0.605648f, -0.621334f, -0.633823f, -0.642170f, -0.646572f, -0.651242f, -0.655765f, -0.655221f, -0.651172f, -0.648535f, -0.643768f, -0.631801f, -0.617925f, -0.606967f, -0.592474f, -0.571477f, -0.552782f, -0.538082f, -0.517509f, -0.492647f, -0.475480f, -0.461290f, -0.437183f, -0.413126f, -0.403158f, -0.390400f, -0.360546f, -0.340803f, -0.339290f, -0.288776f, -0.145051f, 0.000376f, 0.026236f} + }, + { + { -0.017355f, -0.068585f, -0.129748f, -0.140677f, -0.067873f, 0.038579f, 0.095547f, 0.074031f, 0.011534f, -0.044693f, -0.073913f, -0.067610f, -0.018737f, 0.054581f, 0.097078f, 0.061877f, -0.025775f, -0.074615f, -0.020989f, 0.089634f, 0.140779f, 0.070434f, -0.065703f, -0.166766f, -0.192897f, -0.175608f, -0.151255f, -0.126215f, -0.098863f, -0.074963f, -0.054673f, -0.030640f, -0.004266f, 0.014389f, 0.022782f, 0.026012f, 0.024773f, 0.018634f, 0.015637f, 0.024021f, 0.040551f, 0.058741f, 0.079941f, 0.106170f, 0.132694f, 0.156946f, 0.183756f, 0.215131f, 0.246786f, 0.278634f, 0.315363f, 0.354946f, 0.390462f, 0.422391f, 0.455016f, 0.484479f, 0.504790f, 0.519338f, 0.532532f, 0.539137f, 0.534904f, 0.525663f, 0.514081f, 0.492430f, 0.458525f, 0.420763f, 0.379757f, 0.326532f, 0.263903f, 0.204445f, 0.145530f, 0.075927f, 0.005235f, -0.048914f, -0.098551f, -0.166600f, -0.231941f, -0.240292f, -0.172726f, -0.060996f}, + { -0.017355f, -0.068585f, -0.129748f, -0.140677f, -0.067873f, 0.038579f, 0.095547f, 0.074031f, 0.011534f, -0.044693f, -0.073913f, -0.067610f, -0.018737f, 0.054581f, 0.097078f, 0.061877f, -0.025775f, -0.074615f, -0.020989f, 0.089634f, 0.140779f, 0.070434f, -0.065703f, -0.166766f, -0.192897f, -0.175608f, -0.151255f, -0.126215f, -0.098863f, -0.074963f, -0.054673f, -0.030640f, -0.004266f, 0.014389f, 0.022782f, 0.026012f, 0.024773f, 0.018634f, 0.015637f, 0.024021f, 0.040551f, 0.058741f, 0.079941f, 0.106170f, 0.132694f, 0.156946f, 0.183756f, 0.215131f, 0.246786f, 0.278634f, 0.315363f, 0.354946f, 0.390462f, 0.422391f, 0.455016f, 0.484479f, 0.504790f, 0.519338f, 0.532532f, 0.539137f, 0.534904f, 0.525663f, 0.514081f, 0.492430f, 0.458525f, 0.420763f, 0.379757f, 0.326532f, 0.263903f, 0.204445f, 0.145530f, 0.075927f, 0.005235f, -0.048914f, -0.098551f, -0.166600f, -0.231941f, -0.240292f, -0.172726f, -0.060996f} + }, + { + { 0.005973f, -0.001416f, -0.045800f, -0.099150f, -0.109299f, -0.059292f, 0.001039f, 0.004764f, -0.052550f, -0.109926f, -0.118088f, -0.081582f, -0.016964f, 0.073434f, 0.150725f, 0.125706f, -0.026114f, -0.169539f, -0.128661f, 0.090155f, 0.279655f, 0.263749f, 0.075346f, -0.131939f, -0.272993f, -0.368065f, -0.444884f, -0.489466f, -0.487957f, -0.454682f, -0.405665f, -0.339390f, -0.252979f, -0.154344f, -0.052502f, 0.048489f, 0.143632f, 0.226516f, 0.295187f, 0.351028f, 0.394089f, 0.425052f, 0.447704f, 0.464623f, 0.474693f, 0.477963f, 0.477681f, 0.475121f, 0.467826f, 0.454724f, 0.437798f, 0.418152f, 0.395857f, 0.373745f, 0.355940f, 0.342815f, 0.331856f, 0.322189f, 0.313867f, 0.304823f, 0.293125f, 0.280092f, 0.267362f, 0.253770f, 0.238552f, 0.223882f, 0.210719f, 0.196308f, 0.179088f, 0.161285f, 0.143372f, 0.121745f, 0.095725f, 0.069936f, 0.044076f, 0.008055f, -0.042005f, -0.085674f, -0.088660f, -0.037890f}, + { 0.005973f, -0.001416f, -0.045800f, -0.099150f, -0.109299f, -0.059292f, 0.001039f, 0.004764f, -0.052550f, -0.109926f, -0.118088f, -0.081582f, -0.016964f, 0.073434f, 0.150725f, 0.125706f, -0.026114f, -0.169539f, -0.128661f, 0.090155f, 0.279655f, 0.263749f, 0.075346f, -0.131939f, -0.272993f, -0.368065f, -0.444884f, -0.489466f, -0.487957f, -0.454682f, -0.405665f, -0.339390f, -0.252979f, -0.154344f, -0.052502f, 0.048489f, 0.143632f, 0.226516f, 0.295187f, 0.351028f, 0.394089f, 0.425052f, 0.447704f, 0.464623f, 0.474693f, 0.477963f, 0.477681f, 0.475121f, 0.467826f, 0.454724f, 0.437798f, 0.418152f, 0.395857f, 0.373745f, 0.355940f, 0.342815f, 0.331856f, 0.322189f, 0.313867f, 0.304823f, 0.293125f, 0.280092f, 0.267362f, 0.253770f, 0.238552f, 0.223882f, 0.210719f, 0.196308f, 0.179088f, 0.161285f, 0.143372f, 0.121745f, 0.095725f, 0.069936f, 0.044076f, 0.008055f, -0.042005f, -0.085674f, -0.088660f, -0.037890f} + }, + { + { -0.004434f, -0.004101f, 0.011236f, 0.025203f, 0.019806f, 0.001597f, -0.006647f, -0.003102f, -0.018186f, -0.077431f, -0.161881f, -0.209978f, -0.155425f, 0.015003f, 0.208989f, 0.259800f, 0.084031f, -0.179896f, -0.269483f, -0.079015f, 0.215424f, 0.357678f, 0.278152f, 0.099699f, -0.058114f, -0.180673f, -0.286537f, -0.359113f, -0.378791f, -0.360714f, -0.328350f, -0.283730f, -0.223043f, -0.154424f, -0.085113f, -0.011153f, 0.069195f, 0.146411f, 0.210268f, 0.258185f, 0.290989f, 0.310397f, 0.321311f, 0.328850f, 0.333862f, 0.336132f, 0.338054f, 0.340622f, 0.340800f, 0.336748f, 0.330523f, 0.323257f, 0.313600f, 0.302440f, 0.293034f, 0.285845f, 0.278952f, 0.272797f, 0.268758f, 0.264967f, 0.259214f, 0.253039f, 0.247703f, 0.240380f, 0.229389f, 0.217820f, 0.207144f, 0.193744f, 0.176271f, 0.158660f, 0.141444f, 0.119286f, 0.091743f, 0.065323f, 0.038472f, -0.002614f, -0.061009f, -0.109488f, -0.108302f, -0.045399f}, + { 0.004434f, 0.004101f, -0.011236f, -0.025203f, -0.019806f, -0.001597f, 0.006647f, 0.003102f, 0.018186f, 0.077431f, 0.161881f, 0.209978f, 0.155425f, -0.015003f, -0.208989f, -0.259800f, -0.084031f, 0.179896f, 0.269483f, 0.079015f, -0.215424f, -0.357678f, -0.278152f, -0.099699f, 0.058114f, 0.180673f, 0.286537f, 0.359113f, 0.378791f, 0.360714f, 0.328350f, 0.283730f, 0.223043f, 0.154424f, 0.085113f, 0.011153f, -0.069195f, -0.146411f, -0.210268f, -0.258185f, -0.290989f, -0.310397f, -0.321311f, -0.328850f, -0.333862f, -0.336132f, -0.338054f, -0.340622f, -0.340800f, -0.336748f, -0.330523f, -0.323257f, -0.313600f, -0.302440f, -0.293034f, -0.285845f, -0.278952f, -0.272797f, -0.268758f, -0.264967f, -0.259214f, -0.253039f, -0.247703f, -0.240380f, -0.229389f, -0.217820f, -0.207144f, -0.193744f, -0.176271f, -0.158660f, -0.141444f, -0.119286f, -0.091743f, -0.065323f, -0.038472f, 0.002614f, 0.061009f, 0.109488f, 0.108302f, 0.045399f} + }, + { + { -0.022223f, -0.023532f, 0.026143f, 0.036395f, -0.022129f, -0.046557f, 0.045156f, 0.166015f, 0.154331f, -0.014356f, -0.190818f, -0.223106f, -0.100545f, 0.070829f, 0.171310f, 0.137761f, 0.000653f, -0.117443f, -0.095181f, 0.054848f, 0.184857f, 0.177260f, 0.071288f, -0.011410f, -0.019128f, 0.008364f, 0.032900f, 0.058999f, 0.089829f, 0.105464f, 0.095113f, 0.070357f, 0.040449f, 0.004549f, -0.032060f, -0.060672f, -0.084976f, -0.112282f, -0.135857f, -0.144728f, -0.140958f, -0.131144f, -0.113768f, -0.089047f, -0.066562f, -0.051180f, -0.036343f, -0.018844f, -0.003461f, 0.010980f, 0.031603f, 0.056462f, 0.078228f, 0.100182f, 0.129600f, 0.161531f, 0.187796f, 0.212133f, 0.238638f, 0.258971f, 0.267587f, 0.272407f, 0.276295f, 0.269169f, 0.249535f, 0.228442f, 0.204681f, 0.165734f, 0.116242f, 0.071322f, 0.024434f, -0.038282f, -0.101208f, -0.144017f, -0.186203f, -0.247657f, -0.284781f, -0.238696f, -0.131685f, -0.036438f}, + { 0.022223f, 0.023532f, -0.026143f, -0.036395f, 0.022129f, 0.046557f, -0.045156f, -0.166015f, -0.154331f, 0.014356f, 0.190818f, 0.223106f, 0.100545f, -0.070829f, -0.171310f, -0.137761f, -0.000653f, 0.117443f, 0.095181f, -0.054848f, -0.184857f, -0.177260f, -0.071288f, 0.011410f, 0.019128f, -0.008364f, -0.032900f, -0.058999f, -0.089829f, -0.105464f, -0.095113f, -0.070357f, -0.040449f, -0.004549f, 0.032060f, 0.060672f, 0.084976f, 0.112282f, 0.135857f, 0.144728f, 0.140958f, 0.131144f, 0.113768f, 0.089047f, 0.066562f, 0.051180f, 0.036343f, 0.018844f, 0.003461f, -0.010980f, -0.031603f, -0.056462f, -0.078228f, -0.100182f, -0.129600f, -0.161531f, -0.187796f, -0.212133f, -0.238638f, -0.258971f, -0.267587f, -0.272407f, -0.276295f, -0.269169f, -0.249535f, -0.228442f, -0.204681f, -0.165734f, -0.116242f, -0.071322f, -0.024434f, 0.038282f, 0.101208f, 0.144017f, 0.186203f, 0.247657f, 0.284781f, 0.238696f, 0.131685f, 0.036438f} + }, + { + { 0.003862f, -0.005550f, -0.035219f, -0.050424f, -0.039835f, -0.034124f, -0.043985f, -0.024194f, 0.069437f, 0.217796f, 0.352478f, 0.391419f, 0.253518f, -0.070759f, -0.406493f, -0.459708f, -0.129673f, 0.296657f, 0.414245f, 0.156646f, -0.158625f, -0.243467f, -0.132649f, -0.019223f, 0.029037f, 0.069156f, 0.114565f, 0.114517f, 0.063159f, 0.016167f, 0.005053f, 0.009585f, 0.010376f, 0.011826f, 0.014968f, 0.010184f, -0.002825f, -0.015268f, -0.025795f, -0.038657f, -0.052993f, -0.066906f, -0.082812f, -0.100047f, -0.112689f, -0.119957f, -0.127651f, -0.136984f, -0.143527f, -0.147285f, -0.152286f, -0.157533f, -0.158902f, -0.157091f, -0.154423f, -0.148374f, -0.136396f, -0.121265f, -0.105059f, -0.085015f, -0.060285f, -0.034399f, -0.007734f, 0.023017f, 0.056440f, 0.087696f, 0.117449f, 0.148415f, 0.176241f, 0.195804f, 0.210603f, 0.223157f, 0.225976f, 0.215951f, 0.201691f, 0.178640f, 0.121187f, 0.030102f, -0.036777f, -0.026855f}, + { 0.003862f, -0.005550f, -0.035219f, -0.050424f, -0.039835f, -0.034124f, -0.043985f, -0.024194f, 0.069437f, 0.217796f, 0.352478f, 0.391419f, 0.253518f, -0.070759f, -0.406493f, -0.459708f, -0.129673f, 0.296657f, 0.414245f, 0.156646f, -0.158625f, -0.243467f, -0.132649f, -0.019223f, 0.029037f, 0.069156f, 0.114565f, 0.114517f, 0.063159f, 0.016167f, 0.005053f, 0.009585f, 0.010376f, 0.011826f, 0.014968f, 0.010184f, -0.002825f, -0.015268f, -0.025795f, -0.038657f, -0.052993f, -0.066906f, -0.082812f, -0.100047f, -0.112689f, -0.119957f, -0.127651f, -0.136984f, -0.143527f, -0.147285f, -0.152286f, -0.157533f, -0.158902f, -0.157091f, -0.154423f, -0.148374f, -0.136396f, -0.121265f, -0.105059f, -0.085015f, -0.060285f, -0.034399f, -0.007734f, 0.023017f, 0.056440f, 0.087696f, 0.117449f, 0.148415f, 0.176241f, 0.195804f, 0.210603f, 0.223157f, 0.225976f, 0.215951f, 0.201691f, 0.178640f, 0.121187f, 0.030102f, -0.036777f, -0.026855f} + }, + { + { -0.035270f, -0.081929f, -0.072328f, -0.003387f, 0.102081f, 0.191567f, 0.193107f, 0.075847f, -0.091649f, -0.185816f, -0.151954f, -0.053283f, 0.018945f, 0.043102f, 0.046927f, 0.035757f, -0.003446f, -0.048321f, -0.051509f, -0.007303f, 0.037527f, 0.047720f, 0.038011f, 0.037503f, 0.047149f, 0.048355f, 0.032027f, 0.002560f, -0.034692f, -0.076149f, -0.115107f, -0.143065f, -0.156385f, -0.159333f, -0.159978f, -0.162529f, -0.164023f, -0.159091f, -0.145532f, -0.123554f, -0.093928f, -0.060439f, -0.029679f, -0.004678f, 0.017022f, 0.036928f, 0.053244f, 0.066453f, 0.079933f, 0.093680f, 0.104712f, 0.113731f, 0.123664f, 0.133021f, 0.138757f, 0.142838f, 0.147926f, 0.150992f, 0.149042f, 0.145156f, 0.141793f, 0.135931f, 0.127005f, 0.120124f, 0.116637f, 0.112583f, 0.108976f, 0.110492f, 0.114119f, 0.114315f, 0.115877f, 0.124115f, 0.130358f, 0.128184f, 0.129646f, 0.137654f, 0.122241f, 0.064040f, 0.002466f, -0.010057f}, + { -0.035270f, -0.081929f, -0.072328f, -0.003387f, 0.102081f, 0.191567f, 0.193107f, 0.075847f, -0.091649f, -0.185816f, -0.151954f, -0.053283f, 0.018945f, 0.043102f, 0.046927f, 0.035757f, -0.003446f, -0.048321f, -0.051509f, -0.007303f, 0.037527f, 0.047720f, 0.038011f, 0.037503f, 0.047149f, 0.048355f, 0.032027f, 0.002560f, -0.034692f, -0.076149f, -0.115107f, -0.143065f, -0.156385f, -0.159333f, -0.159978f, -0.162529f, -0.164023f, -0.159091f, -0.145532f, -0.123554f, -0.093928f, -0.060439f, -0.029679f, -0.004678f, 0.017022f, 0.036928f, 0.053244f, 0.066453f, 0.079933f, 0.093680f, 0.104712f, 0.113731f, 0.123664f, 0.133021f, 0.138757f, 0.142838f, 0.147926f, 0.150992f, 0.149042f, 0.145156f, 0.141793f, 0.135931f, 0.127005f, 0.120124f, 0.116637f, 0.112583f, 0.108976f, 0.110492f, 0.114119f, 0.114315f, 0.115877f, 0.124115f, 0.130358f, 0.128184f, 0.129646f, 0.137654f, 0.122241f, 0.064040f, 0.002466f, -0.010057f} + }, + { + { 0.042625f, 0.061776f, -0.027586f, -0.143182f, -0.223451f, -0.283569f, -0.301376f, -0.181308f, 0.100838f, 0.422023f, 0.640790f, 0.689329f, 0.491852f, -0.012830f, -0.619485f, -0.827479f, -0.346691f, 0.439982f, 0.806159f, 0.485676f, -0.097985f, -0.426002f, -0.432106f, -0.359643f, -0.337508f, -0.308023f, -0.233735f, -0.160655f, -0.109291f, -0.046792f, 0.036163f, 0.109928f, 0.161438f, 0.204028f, 0.240207f, 0.258404f, 0.257802f, 0.246553f, 0.225745f, 0.195126f, 0.162764f, 0.135196f, 0.109277f, 0.081673f, 0.055076f, 0.030942f, 0.007082f, -0.015502f, -0.032778f, -0.044893f, -0.055922f, -0.067781f, -0.079963f, -0.092783f, -0.106544f, -0.120012f, -0.132352f, -0.144019f, -0.154792f, -0.163557f, -0.170153f, -0.175219f, -0.178738f, -0.180172f, -0.179230f, -0.175923f, -0.170545f, -0.163212f, -0.153389f, -0.141450f, -0.129644f, -0.118625f, -0.105868f, -0.091562f, -0.079757f, -0.066681f, -0.038738f, 0.003573f, 0.031128f, 0.017989f}, + { 0.042625f, 0.061776f, -0.027586f, -0.143182f, -0.223451f, -0.283569f, -0.301376f, -0.181308f, 0.100838f, 0.422023f, 0.640790f, 0.689329f, 0.491852f, -0.012830f, -0.619485f, -0.827479f, -0.346691f, 0.439982f, 0.806159f, 0.485676f, -0.097985f, -0.426002f, -0.432106f, -0.359643f, -0.337508f, -0.308023f, -0.233735f, -0.160655f, -0.109291f, -0.046792f, 0.036163f, 0.109928f, 0.161438f, 0.204028f, 0.240207f, 0.258404f, 0.257802f, 0.246553f, 0.225745f, 0.195126f, 0.162764f, 0.135196f, 0.109277f, 0.081673f, 0.055076f, 0.030942f, 0.007082f, -0.015502f, -0.032778f, -0.044893f, -0.055922f, -0.067781f, -0.079963f, -0.092783f, -0.106544f, -0.120012f, -0.132352f, -0.144019f, -0.154792f, -0.163557f, -0.170153f, -0.175219f, -0.178738f, -0.180172f, -0.179230f, -0.175923f, -0.170545f, -0.163212f, -0.153389f, -0.141450f, -0.129644f, -0.118625f, -0.105868f, -0.091562f, -0.079757f, -0.066681f, -0.038738f, 0.003573f, 0.031128f, 0.017989f} + }, + { + { 0.004986f, 0.021455f, 0.046135f, 0.071785f, 0.092466f, 0.080954f, -0.003158f, -0.145617f, -0.276633f, -0.362866f, -0.395355f, -0.264738f, 0.149265f, 0.651373f, 0.736434f, 0.177675f, -0.547090f, -0.726833f, -0.253845f, 0.306337f, 0.459460f, 0.280374f, 0.109965f, 0.067554f, 0.043904f, -0.021849f, -0.075554f, -0.085260f, -0.084048f, -0.090241f, -0.083218f, -0.055049f, -0.024749f, -0.004212f, 0.011330f, 0.024407f, 0.032551f, 0.037896f, 0.043132f, 0.045153f, 0.042454f, 0.040083f, 0.040807f, 0.040467f, 0.036682f, 0.033444f, 0.033537f, 0.034430f, 0.034508f, 0.036228f, 0.040565f, 0.044452f, 0.045834f, 0.046017f, 0.045496f, 0.042430f, 0.036603f, 0.030268f, 0.024047f, 0.016450f, 0.007946f, 0.000698f, -0.005855f, -0.013972f, -0.022632f, -0.029204f, -0.034902f, -0.042227f, -0.049092f, -0.052708f, -0.056008f, -0.061987f, -0.066609f, -0.066985f, -0.069150f, -0.074874f, -0.070084f, -0.044292f, -0.013242f, -0.000130f}, + { -0.004986f, -0.021455f, -0.046135f, -0.071785f, -0.092466f, -0.080954f, 0.003158f, 0.145617f, 0.276633f, 0.362866f, 0.395355f, 0.264738f, -0.149265f, -0.651373f, -0.736434f, -0.177675f, 0.547090f, 0.726833f, 0.253845f, -0.306337f, -0.459460f, -0.280374f, -0.109965f, -0.067554f, -0.043904f, 0.021849f, 0.075554f, 0.085260f, 0.084048f, 0.090241f, 0.083218f, 0.055049f, 0.024749f, 0.004212f, -0.011330f, -0.024407f, -0.032551f, -0.037896f, -0.043132f, -0.045153f, -0.042454f, -0.040083f, -0.040807f, -0.040467f, -0.036682f, -0.033444f, -0.033537f, -0.034430f, -0.034508f, -0.036228f, -0.040565f, -0.044452f, -0.045834f, -0.046017f, -0.045496f, -0.042430f, -0.036603f, -0.030268f, -0.024047f, -0.016450f, -0.007946f, -0.000698f, 0.005855f, 0.013972f, 0.022632f, 0.029204f, 0.034902f, 0.042227f, 0.049092f, 0.052708f, 0.056008f, 0.061987f, 0.066609f, 0.066985f, 0.069150f, 0.074874f, 0.070084f, 0.044292f, 0.013242f, 0.000130f} + }, + { + { 0.003402f, 0.004407f, -0.006051f, -0.025050f, -0.041008f, -0.025966f, 0.043136f, 0.128240f, 0.134022f, 0.020795f, -0.115019f, -0.140061f, -0.049669f, 0.036681f, 0.041074f, 0.008186f, 0.004784f, 0.019218f, 0.006249f, -0.026881f, -0.037864f, -0.021977f, -0.013202f, -0.024484f, -0.031445f, -0.015937f, 0.008115f, 0.019221f, 0.014829f, 0.004287f, -0.008269f, -0.023585f, -0.039009f, -0.049334f, -0.052310f, -0.048822f, -0.040627f, -0.030481f, -0.021172f, -0.012355f, -0.001360f, 0.011724f, 0.023165f, 0.030522f, 0.034690f, 0.036621f, 0.036317f, 0.035645f, 0.037782f, 0.043224f, 0.050040f, 0.057691f, 0.066656f, 0.075380f, 0.081835f, 0.086743f, 0.091441f, 0.094789f, 0.095756f, 0.095987f, 0.096430f, 0.095207f, 0.091675f, 0.088019f, 0.084731f, 0.079935f, 0.074369f, 0.070712f, 0.067983f, 0.063773f, 0.060332f, 0.060178f, 0.059510f, 0.055794f, 0.055006f, 0.058300f, 0.051108f, 0.024257f, -0.003223f, -0.006390f}, + { -0.003402f, -0.004407f, 0.006051f, 0.025050f, 0.041008f, 0.025966f, -0.043136f, -0.128240f, -0.134022f, -0.020795f, 0.115019f, 0.140061f, 0.049669f, -0.036681f, -0.041074f, -0.008186f, -0.004784f, -0.019218f, -0.006249f, 0.026881f, 0.037864f, 0.021977f, 0.013202f, 0.024484f, 0.031445f, 0.015937f, -0.008115f, -0.019221f, -0.014829f, -0.004287f, 0.008269f, 0.023585f, 0.039009f, 0.049334f, 0.052310f, 0.048822f, 0.040627f, 0.030481f, 0.021172f, 0.012355f, 0.001360f, -0.011724f, -0.023165f, -0.030522f, -0.034690f, -0.036621f, -0.036317f, -0.035645f, -0.037782f, -0.043224f, -0.050040f, -0.057691f, -0.066656f, -0.075380f, -0.081835f, -0.086743f, -0.091441f, -0.094789f, -0.095756f, -0.095987f, -0.096430f, -0.095207f, -0.091675f, -0.088019f, -0.084731f, -0.079935f, -0.074369f, -0.070712f, -0.067983f, -0.063773f, -0.060332f, -0.060178f, -0.059510f, -0.055794f, -0.055006f, -0.058300f, -0.051108f, -0.024257f, 0.003223f, 0.006390f} + }, + { + { 0.011580f, 0.033110f, 0.035997f, 0.009825f, -0.002131f, 0.048826f, 0.111220f, 0.054933f, -0.161075f, -0.387225f, -0.394599f, -0.096964f, 0.326957f, 0.540354f, 0.341380f, -0.107676f, -0.401640f, -0.303987f, 0.014646f, 0.211430f, 0.166588f, 0.034676f, -0.031854f, -0.045160f, -0.063992f, -0.070171f, -0.028788f, 0.028095f, 0.049715f, 0.042124f, 0.043372f, 0.063906f, 0.090684f, 0.118564f, 0.146170f, 0.162760f, 0.160684f, 0.145656f, 0.124864f, 0.099606f, 0.072825f, 0.049131f, 0.026964f, 0.002608f, -0.021547f, -0.042454f, -0.063121f, -0.085674f, -0.106502f, -0.124513f, -0.144021f, -0.165318f, -0.183168f, -0.196174f, -0.206536f, -0.211896f, -0.208932f, -0.201414f, -0.193839f, -0.183228f, -0.166803f, -0.148575f, -0.129851f, -0.105037f, -0.073501f, -0.041507f, -0.008652f, 0.030592f, 0.071399f, 0.104577f, 0.134417f, 0.167669f, 0.193709f, 0.202800f, 0.208008f, 0.214079f, 0.187614f, 0.107244f, 0.021441f, -0.005911f}, + { -0.011580f, -0.033110f, -0.035997f, -0.009825f, 0.002131f, -0.048826f, -0.111220f, -0.054933f, 0.161075f, 0.387225f, 0.394599f, 0.096964f, -0.326957f, -0.540354f, -0.341380f, 0.107676f, 0.401640f, 0.303987f, -0.014646f, -0.211430f, -0.166588f, -0.034676f, 0.031854f, 0.045160f, 0.063992f, 0.070171f, 0.028788f, -0.028095f, -0.049715f, -0.042124f, -0.043372f, -0.063906f, -0.090684f, -0.118564f, -0.146170f, -0.162760f, -0.160684f, -0.145656f, -0.124864f, -0.099606f, -0.072825f, -0.049131f, -0.026964f, -0.002608f, 0.021547f, 0.042454f, 0.063121f, 0.085674f, 0.106502f, 0.124513f, 0.144021f, 0.165318f, 0.183168f, 0.196174f, 0.206536f, 0.211896f, 0.208932f, 0.201414f, 0.193839f, 0.183228f, 0.166803f, 0.148575f, 0.129851f, 0.105037f, 0.073501f, 0.041507f, 0.008652f, -0.030592f, -0.071399f, -0.104577f, -0.134417f, -0.167669f, -0.193709f, -0.202800f, -0.208008f, -0.214079f, -0.187614f, -0.107244f, -0.021441f, 0.005911f} + }, + { + { 0.000353f, 0.004850f, 0.016938f, 0.030564f, 0.032073f, 0.012264f, -0.025611f, -0.068068f, -0.092183f, -0.069650f, 0.005117f, 0.085764f, 0.102915f, 0.040391f, -0.040399f, -0.070602f, -0.045658f, -0.007020f, 0.021199f, 0.044834f, 0.064788f, 0.066750f, 0.047115f, 0.022488f, 0.005813f, -0.010554f, -0.039993f, -0.079586f, -0.110633f, -0.117382f, -0.099825f, -0.069651f, -0.039484f, -0.017639f, -0.007327f, -0.005072f, -0.002356f, 0.005931f, 0.016176f, 0.022381f, 0.023972f, 0.023436f, 0.021218f, 0.017720f, 0.015438f, 0.014768f, 0.012536f, 0.007496f, 0.001618f, -0.005392f, -0.015987f, -0.028902f, -0.040848f, -0.053077f, -0.068452f, -0.084551f, -0.097679f, -0.109499f, -0.121805f, -0.130797f, -0.134202f, -0.136272f, -0.138859f, -0.137270f, -0.130628f, -0.124399f, -0.118371f, -0.106102f, -0.088590f, -0.072164f, -0.053226f, -0.024390f, 0.007484f, 0.032334f, 0.059271f, 0.098873f, 0.130378f, 0.121254f, 0.074924f, 0.023150f}, + { 0.000353f, 0.004850f, 0.016938f, 0.030564f, 0.032073f, 0.012264f, -0.025611f, -0.068068f, -0.092183f, -0.069650f, 0.005117f, 0.085764f, 0.102915f, 0.040391f, -0.040399f, -0.070602f, -0.045658f, -0.007020f, 0.021199f, 0.044834f, 0.064788f, 0.066750f, 0.047115f, 0.022488f, 0.005813f, -0.010554f, -0.039993f, -0.079586f, -0.110633f, -0.117382f, -0.099825f, -0.069651f, -0.039484f, -0.017639f, -0.007327f, -0.005072f, -0.002356f, 0.005931f, 0.016176f, 0.022381f, 0.023972f, 0.023436f, 0.021218f, 0.017720f, 0.015438f, 0.014768f, 0.012536f, 0.007496f, 0.001618f, -0.005392f, -0.015987f, -0.028902f, -0.040848f, -0.053077f, -0.068452f, -0.084551f, -0.097679f, -0.109499f, -0.121805f, -0.130797f, -0.134202f, -0.136272f, -0.138859f, -0.137270f, -0.130628f, -0.124399f, -0.118371f, -0.106102f, -0.088590f, -0.072164f, -0.053226f, -0.024390f, 0.007484f, 0.032334f, 0.059271f, 0.098873f, 0.130378f, 0.121254f, 0.074924f, 0.023150f} + }, + { + { 0.003395f, 0.020426f, 0.045976f, 0.052329f, 0.026661f, -0.019555f, -0.077123f, -0.131965f, -0.135946f, -0.043667f, 0.104469f, 0.189095f, 0.135481f, -0.001437f, -0.101563f, -0.101652f, -0.032058f, 0.036129f, 0.050140f, 0.004006f, -0.059414f, -0.081736f, -0.043298f, 0.021078f, 0.066283f, 0.080513f, 0.077331f, 0.066832f, 0.051569f, 0.035939f, 0.022351f, 0.005726f, -0.017489f, -0.041778f, -0.060670f, -0.074727f, -0.086452f, -0.094598f, -0.097466f, -0.096127f, -0.092430f, -0.088340f, -0.086838f, -0.089337f, -0.093915f, -0.098990f, -0.105183f, -0.111202f, -0.112934f, -0.108926f, -0.101596f, -0.092150f, -0.080152f, -0.067970f, -0.059163f, -0.053214f, -0.047722f, -0.043425f, -0.041320f, -0.038708f, -0.033546f, -0.027639f, -0.020974f, -0.009681f, 0.006590f, 0.023443f, 0.040235f, 0.060007f, 0.080112f, 0.094580f, 0.105031f, 0.116178f, 0.123880f, 0.123088f, 0.120984f, 0.122633f, 0.112565f, 0.076090f, 0.030569f, 0.005103f}, + { 0.003395f, 0.020426f, 0.045976f, 0.052329f, 0.026661f, -0.019555f, -0.077123f, -0.131965f, -0.135946f, -0.043667f, 0.104469f, 0.189095f, 0.135481f, -0.001437f, -0.101563f, -0.101652f, -0.032058f, 0.036129f, 0.050140f, 0.004006f, -0.059414f, -0.081736f, -0.043298f, 0.021078f, 0.066283f, 0.080513f, 0.077331f, 0.066832f, 0.051569f, 0.035939f, 0.022351f, 0.005726f, -0.017489f, -0.041778f, -0.060670f, -0.074727f, -0.086452f, -0.094598f, -0.097466f, -0.096127f, -0.092430f, -0.088340f, -0.086838f, -0.089337f, -0.093915f, -0.098990f, -0.105183f, -0.111202f, -0.112934f, -0.108926f, -0.101596f, -0.092150f, -0.080152f, -0.067970f, -0.059163f, -0.053214f, -0.047722f, -0.043425f, -0.041320f, -0.038708f, -0.033546f, -0.027639f, -0.020974f, -0.009681f, 0.006590f, 0.023443f, 0.040235f, 0.060007f, 0.080112f, 0.094580f, 0.105031f, 0.116178f, 0.123880f, 0.123088f, 0.120984f, 0.122633f, 0.112565f, 0.076090f, 0.030569f, 0.005103f} + }, + { + { -0.008000f, -0.013983f, -0.007789f, -0.005223f, -0.001470f, 0.026111f, 0.057750f, 0.020944f, -0.107461f, -0.216369f, -0.156456f, 0.061682f, 0.235845f, 0.190009f, -0.018294f, -0.169020f, -0.135958f, -0.002906f, 0.078713f, 0.072889f, 0.055366f, 0.076663f, 0.100261f, 0.075548f, 0.012307f, -0.044797f, -0.080708f, -0.114873f, -0.158404f, -0.198177f, -0.219465f, -0.220285f, -0.203282f, -0.171611f, -0.133886f, -0.099826f, -0.070822f, -0.043728f, -0.020140f, -0.003424f, 0.007885f, 0.015626f, 0.017347f, 0.012913f, 0.008483f, 0.008293f, 0.010362f, 0.013895f, 0.021659f, 0.032566f, 0.041674f, 0.048599f, 0.056239f, 0.062372f, 0.062643f, 0.058926f, 0.054923f, 0.048525f, 0.037890f, 0.027863f, 0.021734f, 0.015808f, 0.009301f, 0.007997f, 0.012479f, 0.016621f, 0.021242f, 0.032989f, 0.048955f, 0.061284f, 0.074399f, 0.095752f, 0.116342f, 0.126272f, 0.137340f, 0.157260f, 0.157611f, 0.110681f, 0.043883f, 0.006629f}, + { -0.008000f, -0.013983f, -0.007789f, -0.005223f, -0.001470f, 0.026111f, 0.057750f, 0.020944f, -0.107461f, -0.216369f, -0.156456f, 0.061682f, 0.235845f, 0.190009f, -0.018294f, -0.169020f, -0.135958f, -0.002906f, 0.078713f, 0.072889f, 0.055366f, 0.076663f, 0.100261f, 0.075548f, 0.012307f, -0.044797f, -0.080708f, -0.114873f, -0.158404f, -0.198177f, -0.219465f, -0.220285f, -0.203282f, -0.171611f, -0.133886f, -0.099826f, -0.070822f, -0.043728f, -0.020140f, -0.003424f, 0.007885f, 0.015626f, 0.017347f, 0.012913f, 0.008483f, 0.008293f, 0.010362f, 0.013895f, 0.021659f, 0.032566f, 0.041674f, 0.048599f, 0.056239f, 0.062372f, 0.062643f, 0.058926f, 0.054923f, 0.048525f, 0.037890f, 0.027863f, 0.021734f, 0.015808f, 0.009301f, 0.007997f, 0.012479f, 0.016621f, 0.021242f, 0.032989f, 0.048955f, 0.061284f, 0.074399f, 0.095752f, 0.116342f, 0.126272f, 0.137340f, 0.157260f, 0.157611f, 0.110681f, 0.043883f, 0.006629f} + }, + { + { 0.000244f, 0.000061f, -0.001224f, -0.003636f, -0.007582f, -0.009677f, -0.002431f, 0.010807f, 0.005905f, -0.032432f, -0.065824f, -0.025045f, 0.089641f, 0.163727f, 0.085925f, -0.093404f, -0.190444f, -0.100797f, 0.073761f, 0.153524f, 0.088072f, -0.021053f, -0.069934f, -0.051675f, -0.011931f, 0.023520f, 0.050716f, 0.061297f, 0.047832f, 0.018566f, -0.012127f, -0.038159f, -0.058406f, -0.071156f, -0.079212f, -0.090778f, -0.109603f, -0.130885f, -0.148610f, -0.160134f, -0.163490f, -0.157326f, -0.144051f, -0.128082f, -0.111790f, -0.096521f, -0.084775f, -0.077767f, -0.073706f, -0.071042f, -0.070160f, -0.070401f, -0.069434f, -0.066612f, -0.063128f, -0.058957f, -0.053631f, -0.049011f, -0.047099f, -0.046826f, -0.046713f, -0.047859f, -0.050655f, -0.052377f, -0.051505f, -0.049975f, -0.048302f, -0.043964f, -0.036939f, -0.030309f, -0.023615f, -0.013271f, -0.000672f, 0.009320f, 0.019077f, 0.036301f, 0.058484f, 0.069611f, 0.056538f, 0.021593f}, + { 0.000244f, 0.000061f, -0.001224f, -0.003636f, -0.007582f, -0.009677f, -0.002431f, 0.010807f, 0.005905f, -0.032432f, -0.065824f, -0.025045f, 0.089641f, 0.163727f, 0.085925f, -0.093404f, -0.190444f, -0.100797f, 0.073761f, 0.153524f, 0.088072f, -0.021053f, -0.069934f, -0.051675f, -0.011931f, 0.023520f, 0.050716f, 0.061297f, 0.047832f, 0.018566f, -0.012127f, -0.038159f, -0.058406f, -0.071156f, -0.079212f, -0.090778f, -0.109603f, -0.130885f, -0.148610f, -0.160134f, -0.163490f, -0.157326f, -0.144051f, -0.128082f, -0.111790f, -0.096521f, -0.084775f, -0.077767f, -0.073706f, -0.071042f, -0.070160f, -0.070401f, -0.069434f, -0.066612f, -0.063128f, -0.058957f, -0.053631f, -0.049011f, -0.047099f, -0.046826f, -0.046713f, -0.047859f, -0.050655f, -0.052377f, -0.051505f, -0.049975f, -0.048302f, -0.043964f, -0.036939f, -0.030309f, -0.023615f, -0.013271f, -0.000672f, 0.009320f, 0.019077f, 0.036301f, 0.058484f, 0.069611f, 0.056538f, 0.021593f} + } +}; +const float *CRendBin_HOA3_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const float *CRendBin_HOA3_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; + + + +/********************** CRendBin_Combined_BRIR **********************/ + +const float CRendBin_Combined_BRIR_latency_s = 0.000145834f; + +/* Sample Rate = 48000 */ + +const int16_t CRendBin_Combined_BRIR_max_num_iterations_48kHz = 22; +const uint16_t CRendBin_Combined_BRIR_num_iterations_48kHz[15][BINAURAL_CHANNELS]={{22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22} }; +const uint16_t CRendBin_Combined_BRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS] = {40, 40}; +const uint16_t CRendBin_Combined_BRIR_pIndex_frequency_max_48kHz[15][BINAURAL_CHANNELS][22]={{{116, 118, 117, 121, 112, 119, 121, 131, 134, 131, 137, 127, 134, 135, 134, 135, 129, 139, 135, 130, 128, 240},{116, 118, 117, 121, 112, 119, 121, 131, 134, 131, 137, 127, 134, 135, 134, 135, 129, 139, 135, 130, 128, 240}},{{122, 106, 121, 114, 121, 123, 119, 126, 123, 126, 127, 130, 128, 136, 132, 131, 129, 141, 137, 131, 129, 240},{122, 106, 121, 114, 121, 123, 119, 126, 123, 126, 127, 130, 128, 136, 132, 131, 129, 141, 137, 131, 129, 240}},{{118, 104, 116, 104, 123, 123, 122, 125, 130, 128, 132, 135, 131, 132, 131, 132, 135, 137, 144, 129, 129, 240},{118, 104, 116, 104, 123, 123, 122, 125, 130, 128, 132, 135, 131, 132, 131, 132, 135, 137, 144, 129, 129, 240}},{{102, 117, 116, 121, 117, 114, 115, 125, 126, 124, 125, 142, 133, 124, 129, 132, 134, 137, 143, 125, 125, 240},{102, 117, 116, 121, 117, 114, 115, 125, 126, 124, 125, 142, 133, 124, 129, 132, 134, 137, 143, 125, 125, 240}},{{116, 115, 117, 120, 121, 119, 125, 129, 123, 129, 124, 127, 128, 143, 133, 131, 136, 141, 158, 127, 131, 240},{116, 115, 117, 120, 121, 119, 125, 129, 123, 129, 124, 127, 128, 143, 133, 131, 136, 141, 158, 127, 131, 240}},{{112, 106, 118, 123, 115, 120, 129, 123, 130, 127, 130, 130, 131, 131, 131, 135, 134, 153, 138, 132, 127, 240},{112, 106, 118, 123, 115, 120, 129, 123, 130, 127, 130, 130, 131, 131, 131, 135, 134, 153, 138, 132, 127, 240}},{{107, 112, 111, 120, 115, 125, 122, 123, 132, 123, 133, 138, 125, 134, 130, 131, 135, 137, 136, 127, 121, 240},{107, 112, 111, 120, 115, 125, 122, 123, 132, 123, 133, 138, 125, 134, 130, 131, 135, 137, 136, 127, 121, 240}},{{111, 113, 132, 115, 121, 123, 121, 127, 135, 128, 129, 128, 133, 130, 133, 138, 134, 137, 152, 138, 124, 240},{111, 113, 132, 115, 121, 123, 121, 127, 135, 128, 129, 128, 133, 130, 133, 138, 134, 137, 152, 138, 124, 240}},{{114, 104, 114, 117, 125, 127, 123, 129, 123, 127, 144, 131, 138, 132, 129, 129, 132, 134, 136, 127, 121, 240},{114, 104, 114, 117, 125, 127, 123, 129, 123, 127, 144, 131, 138, 132, 129, 129, 132, 134, 136, 127, 121, 240}},{{100, 102, 112, 118, 115, 116, 118, 116, 121, 124, 125, 121, 125, 130, 127, 132, 133, 134, 134, 129, 132, 240},{100, 102, 112, 118, 115, 116, 118, 116, 121, 124, 125, 121, 125, 130, 127, 132, 133, 134, 134, 129, 132, 240}},{{106, 93, 103, 108, 124, 111, 114, 115, 120, 121, 119, 123, 131, 130, 132, 132, 132, 131, 140, 129, 131, 240},{106, 93, 103, 108, 124, 111, 114, 115, 120, 121, 119, 123, 131, 130, 132, 132, 132, 131, 140, 129, 131, 240}},{{108, 101, 115, 115, 115, 110, 121, 124, 124, 120, 122, 129, 124, 128, 125, 132, 135, 133, 138, 160, 119, 240},{108, 101, 115, 115, 115, 110, 121, 124, 124, 120, 122, 129, 124, 128, 125, 132, 135, 133, 138, 160, 119, 240}},{{112, 106, 114, 110, 128, 117, 120, 126, 124, 128, 126, 132, 129, 127, 133, 134, 136, 133, 154, 197, 129, 240},{112, 106, 114, 110, 128, 117, 120, 126, 124, 128, 126, 132, 129, 127, 133, 134, 136, 133, 154, 197, 129, 240}},{{102, 107, 111, 116, 116, 120, 118, 115, 120, 119, 128, 131, 131, 130, 128, 126, 126, 132, 145, 136, 133, 240},{102, 107, 111, 116, 116, 120, 118, 115, 120, 119, 128, 131, 131, 130, 128, 126, 126, 132, 145, 136, 133, 240}},{{111, 117, 106, 120, 123, 121, 125, 125, 130, 125, 123, 123, 127, 131, 125, 131, 135, 134, 148, 134, 132, 240},{111, 117, 106, 120, 123, 121, 125, 125, 130, 125, 123, 123, 127, 131, 125, 131, 135, 134, 148, 134, 132, 240}}}; +const uint16_t CRendBin_Combined_BRIR_index_frequency_max_diffuse_48kHz = 98; +const float CRendBin_Combined_BRIR_inv_diffuse_weight_48kHz[15]={0.224183f, 0.227455f, 0.241830f, 0.207155f, 0.218087f, 0.222942f, 0.232158f, 0.248203f, 0.249262f, 0.261591f, 0.246276f, 0.279163f, 0.285701f, 0.262541f, 0.271844f}; +const uint16_t CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS][40]={{47, 47, 47, 47, 47, 47, 51, 51, 58, 58, 58, 65, 65, 65, 65, 65, 72, 72, 72, 74, 74, 77, 77, 79, 81, 81, 81, 81, 87, 87, 87, 87, 87, 87, 91, 91, 93, 93, 93, 98},{47, 47, 47, 47, 47, 47, 51, 51, 58, 58, 58, 65, 65, 65, 65, 65, 72, 72, 72, 74, 74, 77, 77, 79, 81, 81, 81, 81, 87, 87, 87, 87, 87, 87, 91, 91, 93, 93, 93, 98}}; +const float CRendBin_Combined_BRIR_coeff_re_48kHz[15][BINAURAL_CHANNELS][2955]={ + { + {-0.009093f, 0.009357f, -0.003453f, 0.000012f, 0.008747f, -0.004985f, 0.003413f, -0.000634f, 0.001224f, -0.005937f, -0.012436f, -0.002558f, 0.004885f, -0.003188f, 0.002971f, 0.004317f, 0.003658f, -0.002726f, 0.002070f, -0.007687f, -0.001416f, 0.001935f, 0.003177f, -0.000251f, -0.000183f, 0.000966f, 0.001890f, -0.006432f, -0.005361f, 0.002269f, 0.004446f, -0.002213f, 0.004654f, 0.008920f, -0.011982f, 0.001718f, -0.005741f, -0.003864f, 0.002657f, -0.001469f, 0.007339f, -0.002261f, 0.006608f, 0.003502f, 0.001066f, -0.000452f, 0.003522f, 0.000236f, -0.000743f, -0.003707f, 0.010716f, -0.007427f, -0.002282f, 0.003802f, 0.004147f, -0.000158f, -0.003653f, 0.002094f, -0.004039f, 0.004196f, 0.000776f, 0.001549f, -0.000111f, -0.001391f, -0.001353f, 0.005598f, -0.014358f, 0.003399f, -0.001873f, -0.008279f, -0.001439f, 0.007045f, 0.003361f, 0.004391f, -0.006305f, 0.005087f, -0.002217f, 0.003215f, 0.001901f, 0.002512f, -0.002684f, 0.001092f, 0.003738f, -0.002456f, -0.005636f, 0.002331f, -0.005235f, 0.001052f, 0.003778f, 0.000046f, -0.001918f, -0.002121f, 0.000983f, 0.002093f, -0.000885f, 0.002506f, + 0.000072f, 0.001810f, 0.001468f, -0.000633f, -0.000400f, 0.000722f, -0.000855f, -0.000439f, -0.000674f, 0.000736f, -0.001170f, 0.000615f, -0.001693f, -0.000356f, -0.001593f, -0.000167f, -0.000536f, -0.001693f, -0.000430f, 0.000869f, -0.016548f, 0.013099f, -0.006110f, 0.003024f, 0.002545f, 0.000530f, -0.003448f, -0.000153f, -0.009247f, -0.011535f, 0.003315f, -0.002100f, 0.003770f, 0.003820f, 0.010643f, -0.008458f, 0.001381f, 0.007304f, 0.007055f, -0.006833f, -0.007323f, -0.003795f, -0.006343f, 0.000756f, -0.002040f, -0.004870f, -0.003752f, 0.000195f, -0.011680f, -0.011100f, -0.002255f, 0.002419f, -0.000896f, 0.001112f, -0.001224f, 0.002740f, -0.006075f, 0.007338f, -0.002398f, 0.004255f, -0.000762f, 0.003059f, -0.005530f, 0.002101f, 0.004053f, 0.004914f, 0.002178f, 0.001088f, 0.001822f, -0.001847f, -0.004563f, 0.009718f, 0.007337f, 0.003204f, -0.003443f, 0.012008f, 0.008134f, -0.003185f, 0.007655f, -0.000423f, -0.005762f, -0.001269f, -0.002000f, -0.005077f, 0.003548f, 0.004120f, 0.002022f, -0.003855f, 0.008485f, -0.005344f, 0.005024f, 0.007247f, -0.001229f, 0.000911f, -0.010281f, -0.004429f, + -0.011074f, 0.001827f, 0.005457f, -0.005184f, -0.001478f, 0.002281f, -0.004939f, -0.001227f, 0.002601f, -0.000101f, 0.001903f, -0.000963f, -0.002567f, -0.007177f, -0.003478f, -0.001127f, -0.001641f, -0.000406f, -0.000022f, 0.000663f, -0.000778f, -0.001037f, -0.002571f, -0.001026f, 0.000215f, 0.000803f, 0.000720f, -0.001278f, -0.000114f, 0.000175f, 0.000535f, -0.000117f, 0.000549f, 0.000069f, 0.000886f, 0.000094f, -0.001187f, -0.001996f, -0.002159f, 0.000001f, -0.001221f, -0.001584f, 0.000446f, 0.014016f, 0.006425f, -0.005359f, 0.002405f, 0.001850f, 0.022319f, -0.006555f, 0.006402f, 0.010902f, -0.002095f, 0.009925f, 0.004039f, 0.006766f, -0.008829f, -0.003238f, -0.010349f, -0.004751f, 0.006972f, -0.000161f, -0.004927f, 0.001222f, -0.007261f, -0.000524f, -0.004758f, 0.006675f, -0.002917f, -0.000866f, -0.002631f, 0.003572f, 0.001537f, 0.000128f, -0.000865f, 0.002945f, -0.010921f, -0.008350f, 0.003731f, 0.001053f, -0.001082f, -0.005474f, 0.012960f, 0.003783f, -0.001700f, 0.004347f, 0.005112f, 0.000067f, 0.002512f, 0.001279f, -0.006453f, 0.005877f, -0.007677f, -0.005716f, 0.006812f, -0.008090f, + 0.006993f, 0.003218f, -0.006206f, 0.010649f, 0.005668f, 0.004133f, -0.002939f, 0.009660f, 0.002181f, -0.001241f, -0.002847f, 0.002993f, 0.001057f, -0.001603f, -0.011385f, -0.001565f, -0.002282f, 0.003532f, -0.006724f, 0.009045f, -0.003204f, 0.007427f, -0.007772f, 0.000337f, -0.000894f, 0.009233f, -0.004361f, -0.002925f, 0.001575f, 0.003488f, -0.000206f, 0.001881f, -0.001494f, -0.008342f, -0.001040f, -0.000510f, -0.000534f, -0.001062f, -0.000260f, 0.000129f, -0.001250f, -0.001530f, -0.001832f, -0.001890f, 0.000054f, -0.000683f, -0.000057f, 0.001245f, -0.001510f, 0.000996f, 0.001024f, 0.002591f, -0.003097f, 0.002064f, 0.000803f, 0.001625f, -0.000282f, 0.002410f, 0.000776f, -0.001022f, -0.001925f, -0.000436f, -0.000968f, 0.023325f, -0.019306f, -0.016942f, -0.005439f, 0.017868f, -0.002462f, -0.009634f, 0.012241f, -0.008104f, 0.005797f, -0.000413f, -0.013267f, -0.009008f, 0.011237f, -0.007228f, 0.005580f, -0.007543f, 0.007434f, -0.003262f, -0.002029f, -0.000807f, -0.007304f, 0.003910f, 0.005393f, -0.007325f, 0.001832f, -0.003702f, 0.001545f, 0.003411f, -0.001050f, 0.004873f, 0.001485f, 0.003997f, + 0.006281f, -0.007979f, -0.005878f, 0.007304f, 0.000399f, 0.005685f, 0.005521f, -0.005039f, -0.007557f, -0.002961f, 0.001340f, 0.010043f, -0.010754f, 0.004517f, -0.012012f, -0.014604f, -0.003423f, -0.008320f, -0.001375f, -0.009869f, -0.018881f, -0.009944f, 0.008808f, 0.008277f, 0.005352f, -0.006220f, 0.018133f, -0.005491f, 0.003081f, -0.009929f, -0.009417f, 0.002570f, 0.000024f, -0.000836f, -0.011895f, -0.003811f, -0.000660f, -0.002326f, -0.002293f, -0.006335f, -0.005144f, 0.001409f, -0.001630f, -0.003435f, 0.000421f, -0.006134f, 0.001131f, 0.003632f, 0.006207f, 0.003542f, -0.005212f, 0.005585f, -0.003592f, -0.000254f, 0.006173f, 0.002704f, 0.000919f, -0.001927f, 0.003182f, 0.003724f, 0.002853f, 0.000722f, -0.001581f, 0.000634f, 0.004389f, 0.002350f, 0.002829f, 0.001301f, -0.001639f, 0.002440f, 0.000455f, -0.000174f, 0.000668f, -0.001151f, 0.000416f, 0.000739f, -0.001306f, 0.002502f, 0.003576f, 0.004317f, -0.000284f, -0.000226f, 0.000603f, -0.002627f, 0.003921f, -0.000167f, 0.002439f, -0.000508f, 0.029790f, -0.009842f, 0.013902f, -0.003772f, 0.018702f, -0.003686f, -0.002977f, 0.003132f, + 0.003710f, -0.003211f, -0.021663f, 0.002097f, -0.002175f, -0.005768f, -0.000428f, -0.001053f, 0.007575f, -0.002481f, 0.018260f, -0.002442f, 0.001965f, -0.001328f, 0.010280f, -0.002051f, 0.003472f, -0.008595f, -0.000446f, -0.005904f, -0.006278f, -0.001760f, -0.001909f, 0.000078f, 0.006534f, -0.011787f, -0.003635f, 0.004008f, -0.001515f, 0.008164f, 0.001712f, -0.002058f, -0.005580f, -0.005368f, -0.005921f, -0.010776f, 0.003886f, 0.004581f, 0.003849f, -0.018788f, -0.002952f, 0.013285f, 0.007260f, -0.002999f, -0.000788f, -0.005808f, -0.013110f, -0.013676f, 0.013454f, -0.004205f, -0.009379f, -0.005110f, 0.007211f, 0.005925f, 0.000467f, 0.006641f, 0.002531f, 0.006423f, -0.003376f, -0.013407f, -0.004790f, -0.006033f, -0.007063f, 0.009888f, 0.006315f, -0.001088f, 0.010780f, 0.016463f, -0.004137f, 0.006981f, -0.006579f, -0.000806f, -0.000109f, 0.007173f, -0.000773f, 0.001801f, 0.001419f, 0.002230f, 0.005473f, -0.005651f, 0.004245f, -0.002935f, 0.000241f, -0.003598f, 0.000405f, 0.001902f, 0.003837f, 0.002941f, -0.000289f, 0.001056f, 0.000049f, -0.000439f, 0.001885f, -0.005330f, -0.000951f, -0.004254f, + 0.000783f, -0.000763f, -0.000882f, -0.001862f, -0.001319f, -0.002219f, 0.002179f, 0.001122f, -0.044640f, 0.024578f, 0.008968f, -0.002035f, -0.001961f, 0.000146f, -0.006776f, -0.012418f, -0.002677f, 0.006108f, 0.018934f, 0.012733f, -0.017209f, -0.003263f, -0.010228f, 0.007041f, -0.000849f, -0.023249f, -0.006842f, 0.014321f, 0.008855f, 0.004920f, 0.012144f, 0.007375f, -0.001209f, -0.001495f, 0.003609f, -0.008824f, -0.005206f, 0.002081f, 0.010599f, -0.004410f, -0.008856f, -0.012822f, -0.006446f, 0.006469f, 0.020852f, 0.001493f, -0.003611f, 0.004461f, -0.004254f, -0.015388f, 0.001188f, -0.010848f, -0.008535f, -0.010120f, 0.006377f, -0.000572f, -0.014431f, 0.002752f, 0.005525f, 0.005708f, -0.015616f, -0.008641f, -0.005789f, -0.003843f, -0.001664f, -0.005745f, -0.002756f, -0.007440f, -0.015155f, -0.001734f, -0.012864f, -0.015458f, -0.009559f, -0.002702f, 0.002716f, -0.009187f, -0.013573f, 0.004052f, 0.010970f, -0.000537f, -0.001964f, -0.001263f, 0.007992f, -0.011854f, 0.008926f, 0.014062f, 0.013680f, 0.010778f, 0.018384f, 0.000263f, -0.007515f, 0.004972f, 0.000865f, -0.001910f, -0.001665f, 0.000051f, + -0.004143f, 0.006098f, 0.000355f, 0.000488f, -0.003686f, -0.000994f, 0.002039f, 0.002320f, -0.002129f, -0.001951f, 0.001203f, 0.006291f, -0.000773f, 0.002412f, 0.002154f, 0.005383f, -0.004299f, 0.000310f, -0.000049f, -0.004794f, 0.000773f, 0.000705f, 0.004133f, 0.000483f, 0.000886f, 0.003550f, 0.002265f, -0.005983f, 0.002297f, -0.002121f, 0.001952f, -0.018436f, 0.007010f, -0.009100f, -0.001536f, 0.002449f, 0.005495f, -0.000728f, 0.009596f, 0.000270f, -0.001880f, -0.025882f, 0.012058f, -0.004784f, -0.005461f, 0.009329f, -0.014975f, -0.020625f, 0.008476f, -0.007210f, -0.009636f, -0.003032f, 0.018696f, 0.011751f, -0.006774f, -0.004002f, 0.008726f, -0.002562f, -0.000880f, 0.002531f, 0.008519f, 0.015559f, 0.009946f, 0.012592f, -0.001877f, -0.000528f, 0.000359f, -0.008271f, 0.002170f, -0.003478f, 0.021215f, -0.016166f, -0.009319f, -0.008546f, -0.007956f, 0.005102f, 0.002926f, 0.007590f, -0.001203f, -0.010679f, -0.014253f, -0.004132f, -0.017758f, -0.024815f, -0.004920f, 0.000677f, 0.019342f, 0.003826f, -0.015229f, -0.003924f, 0.014516f, -0.006128f, 0.004904f, 0.004351f, 0.008175f, -0.011492f, + -0.017167f, -0.007626f, -0.008707f, 0.027802f, 0.003168f, -0.008923f, 0.006115f, 0.004632f, -0.001987f, 0.003496f, 0.006426f, -0.000781f, 0.012407f, -0.016352f, -0.014570f, 0.004738f, -0.006694f, 0.014812f, -0.006787f, -0.000395f, 0.008041f, -0.002460f, 0.007133f, -0.000444f, -0.000290f, -0.000504f, -0.002336f, -0.000275f, 0.006427f, 0.002344f, 0.006247f, 0.003451f, 0.003154f, 0.000202f, -0.002190f, -0.001028f, 0.002660f, -0.000830f, 0.000859f, -0.001285f, 0.004510f, -0.003695f, 0.002659f, -0.003314f, 0.004550f, -0.004294f, 0.000488f, -0.000437f, -0.000378f, 0.003158f, 0.004297f, -0.004494f, 0.003209f, 0.001692f, -0.001413f, 0.006530f, 0.015738f, 0.004848f, -0.001499f, 0.010820f, -0.002271f, -0.013880f, -0.002738f, -0.001394f, 0.013303f, -0.007799f, -0.002015f, -0.004304f, 0.001985f, -0.004358f, 0.000635f, 0.004235f, 0.006176f, 0.009030f, 0.005826f, 0.002742f, 0.023469f, 0.009163f, 0.007576f, -0.001182f, -0.018879f, 0.001056f, -0.015763f, 0.004578f, -0.010757f, 0.002411f, -0.000172f, 0.005842f, 0.028904f, 0.008101f, -0.004743f, 0.010302f, -0.008456f, 0.008753f, -0.005334f, 0.015015f, + -0.008521f, -0.000255f, -0.011645f, 0.006769f, 0.011330f, -0.013723f, 0.027150f, -0.006901f, 0.001789f, -0.004392f, -0.007578f, 0.002759f, -0.008429f, -0.023649f, 0.003772f, -0.006067f, -0.001500f, -0.014674f, 0.003248f, -0.005309f, -0.024350f, -0.011118f, -0.006936f, -0.021534f, 0.011936f, 0.030608f, 0.037116f, -0.035716f, -0.027328f, -0.015217f, 0.001328f, 0.008689f, -0.011150f, 0.004922f, -0.012629f, 0.003114f, 0.017041f, 0.026401f, -0.018473f, 0.029583f, 0.009362f, 0.003328f, 0.004910f, 0.005218f, -0.006758f, 0.010055f, 0.009244f, 0.011222f, 0.008578f, 0.003518f, 0.013087f, -0.000087f, 0.004000f, -0.000390f, -0.000189f, 0.007035f, -0.002272f, -0.008820f, -0.002503f, 0.005534f, 0.004248f, 0.001651f, -0.000220f, -0.000691f, -0.000895f, 0.005580f, 0.004420f, 0.001880f, -0.005254f, 0.001162f, 0.001288f, -0.000046f, 0.005955f, 0.002525f, 0.003644f, -0.000159f, 0.004421f, 0.002508f, 0.004472f, 0.006260f, 0.006518f, 0.000295f, 0.000107f, -0.003478f, 0.007204f, 0.006436f, -0.000909f, -0.002150f, 0.000595f, 0.004603f, -0.001873f, 0.013170f, -0.025585f, 0.036484f, 0.000490f, 0.021254f, + 0.007512f, -0.007821f, -0.008090f, 0.019678f, -0.012038f, 0.012336f, 0.015245f, -0.002264f, -0.011217f, 0.000363f, 0.015775f, 0.008799f, 0.007964f, 0.006925f, -0.001733f, 0.002337f, 0.005102f, 0.020129f, 0.014051f, -0.011134f, -0.009596f, -0.001906f, -0.005017f, -0.002503f, -0.011000f, -0.007377f, 0.009926f, 0.017728f, 0.004282f, 0.026867f, -0.007877f, 0.029403f, 0.001034f, 0.013719f, 0.032341f, 0.022888f, 0.007100f, 0.006436f, 0.014441f, -0.003464f, -0.013518f, -0.000319f, 0.013568f, -0.008247f, -0.015466f, 0.000325f, -0.002732f, 0.029612f, 0.023657f, -0.000539f, 0.033418f, -0.003241f, 0.017810f, 0.009343f, 0.014013f, -0.002117f, -0.011989f, 0.014908f, -0.003396f, 0.017482f, 0.011784f, 0.037214f, -0.021291f, -0.003837f, -0.042636f, 0.008759f, -0.021146f, -0.003060f, 0.019104f, -0.008208f, 0.007637f, -0.003704f, 0.022392f, -0.006213f, -0.016219f, -0.001415f, -0.005759f, 0.006597f, -0.001387f, 0.010818f, 0.012572f, 0.003220f, -0.003775f, 0.010049f, -0.002634f, 0.004236f, -0.000321f, -0.006995f, 0.004295f, 0.004583f, 0.008624f, 0.004492f, 0.009707f, 0.004332f, -0.000568f, 0.000212f, + -0.003502f, -0.000059f, 0.009503f, -0.003710f, -0.007839f, 0.004116f, -0.000922f, 0.001297f, 0.007706f, 0.001681f, 0.001593f, 0.003223f, 0.004989f, -0.001861f, -0.001383f, 0.003435f, 0.006163f, 0.010409f, 0.009295f, -0.000154f, 0.004195f, -0.000041f, -0.000856f, 0.004478f, 0.006414f, 0.005775f, -0.003665f, -0.000020f, -0.001469f, 0.007704f, 0.001097f, -0.001569f, 0.000934f, -0.024552f, -0.018036f, 0.008784f, -0.014588f, 0.008267f, -0.008828f, 0.002357f, 0.022468f, -0.003896f, -0.021338f, 0.005692f, -0.009009f, 0.021635f, -0.022804f, -0.015929f, 0.009165f, 0.010390f, 0.015753f, 0.000494f, -0.001668f, 0.010157f, -0.006324f, -0.015611f, 0.009548f, -0.006463f, -0.012510f, 0.003641f, 0.012027f, -0.008978f, 0.022708f, 0.009170f, -0.000957f, 0.002923f, 0.011049f, 0.004816f, -0.039128f, 0.015859f, -0.004142f, -0.004195f, -0.006882f, 0.020665f, -0.000037f, 0.022011f, 0.000756f, 0.001864f, 0.002260f, -0.005905f, -0.002550f, 0.010662f, -0.012671f, 0.002900f, 0.035255f, 0.003060f, 0.025872f, 0.001965f, -0.005497f, -0.002910f, -0.017751f, -0.036503f, -0.026753f, 0.012011f, 0.016527f, -0.007261f, + 0.027691f, 0.011887f, -0.020133f, -0.011641f, 0.025335f, 0.018124f, 0.016724f, 0.005166f, -0.008057f, 0.000204f, -0.001607f, -0.015725f, -0.005055f, -0.009202f, -0.043097f, -0.018465f, -0.001207f, 0.028785f, 0.006199f, -0.006678f, 0.002873f, 0.024716f, -0.006359f, 0.001247f, -0.000079f, 0.006261f, -0.008351f, -0.003894f, -0.006302f, -0.003485f, -0.002383f, 0.005950f, -0.000531f, -0.001057f, -0.000621f, 0.004668f, 0.003476f, 0.007279f, -0.005393f, -0.008021f, 0.002640f, -0.008485f, -0.004962f, 0.001100f, 0.002822f, 0.001023f, -0.001764f, 0.008932f, -0.004423f, -0.002607f, -0.010568f, 0.003960f, -0.009586f, 0.007395f, 0.002948f, 0.004931f, -0.008171f, 0.000768f, -0.001663f, 0.003905f, -0.004852f, 0.003065f, -0.004379f, 0.004979f, -0.009061f, 0.000398f, -0.010574f, 0.011377f, 0.010704f, 0.023178f, 0.008746f, 0.007682f, 0.026630f, 0.022243f, 0.018543f, 0.000602f, 0.006817f, 0.001308f, -0.004482f, -0.005361f, 0.004252f, -0.002273f, -0.016173f, 0.003364f, 0.015595f, -0.000333f, -0.004672f, 0.004715f, -0.039324f, 0.012890f, -0.015748f, 0.009572f, 0.013137f, 0.011826f, -0.014856f, 0.007778f, + -0.001657f, -0.000476f, 0.023062f, 0.016816f, 0.000088f, 0.008939f, 0.006587f, -0.003294f, -0.013393f, 0.003085f, 0.011185f, 0.000080f, 0.016388f, 0.004813f, 0.014811f, 0.029339f, 0.001398f, 0.011763f, 0.012481f, 0.015673f, -0.000806f, -0.010252f, 0.025327f, -0.009984f, 0.020421f, -0.024344f, -0.020055f, 0.027788f, -0.001540f, 0.009103f, 0.016319f, 0.024235f, 0.031365f, 0.013164f, 0.004202f, -0.015496f, 0.006801f, -0.003265f, -0.028293f, 0.023789f, 0.014762f, -0.023162f, -0.001490f, 0.001328f, -0.028995f, 0.009601f, 0.022840f, 0.013463f, -0.000311f, 0.008723f, 0.006167f, -0.013550f, 0.025011f, 0.002314f, -0.005038f, 0.012852f, 0.024739f, 0.009665f, -0.001109f, -0.008777f, -0.006920f, -0.003075f, 0.004142f, 0.006918f, 0.010163f, 0.003260f, 0.001673f, 0.003120f, 0.011895f, 0.010632f, 0.013236f, -0.000259f, -0.001512f, 0.005210f, 0.011320f, -0.000044f, 0.000962f, -0.002373f, 0.005178f, 0.000857f, -0.001413f, -0.004391f, 0.002629f, -0.008311f, -0.014783f, -0.000749f, 0.008154f, -0.000290f, 0.005738f, -0.007079f, 0.004385f, 0.000243f, 0.004993f, 0.000722f, -0.004063f, 0.003264f, + -0.002777f, -0.002240f, -0.001037f, -0.008956f, 0.006200f, -0.003339f, 0.002505f, 0.004866f, 0.000148f, -0.001335f, -0.004229f, -0.005820f, -0.001313f, -0.064905f, -0.040358f, 0.013209f, 0.013829f, 0.026697f, 0.044132f, -0.012127f, -0.006897f, -0.014033f, -0.013015f, -0.016558f, -0.017756f, 0.001466f, 0.007120f, 0.005609f, 0.027838f, 0.001241f, 0.027315f, -0.001354f, 0.009394f, 0.012673f, 0.009704f, 0.020363f, 0.014483f, 0.001059f, 0.017894f, -0.000192f, -0.002136f, -0.010280f, 0.012099f, -0.001593f, -0.026693f, -0.023027f, 0.014459f, -0.003300f, 0.031788f, 0.019039f, 0.020432f, 0.007617f, -0.040047f, 0.009694f, 0.025137f, -0.003810f, 0.007291f, -0.006080f, 0.004962f, 0.031664f, -0.001134f, 0.026548f, 0.044123f, 0.002541f, -0.016705f, -0.000413f, 0.000425f, -0.027658f, 0.037446f, 0.017924f, -0.005019f, -0.002075f, 0.027118f, 0.012866f, -0.032960f, -0.026741f, 0.010520f, -0.011601f, 0.015693f, 0.011422f, 0.004941f, -0.012970f, -0.023431f, -0.001066f, 0.005880f, 0.004457f, 0.025257f, -0.033926f, 0.004923f, -0.002270f, -0.028847f, -0.013684f, -0.029012f, 0.025343f, -0.008648f, 0.035018f, + -0.027547f, 0.002610f, -0.013282f, 0.019925f, 0.008599f, -0.008544f, -0.001710f, 0.018370f, 0.001098f, 0.005778f, -0.010652f, -0.005580f, -0.009017f, 0.016298f, 0.008014f, 0.000005f, 0.004269f, 0.004936f, -0.014927f, 0.001077f, -0.004241f, 0.005291f, 0.003055f, -0.003144f, -0.015255f, -0.005226f, -0.011283f, 0.013494f, -0.010036f, 0.002265f, -0.002739f, 0.013368f, -0.002866f, -0.002236f, -0.004785f, -0.008188f, -0.000549f, -0.005400f, 0.005226f, 0.014752f, 0.012713f, -0.000800f, -0.013439f, 0.017093f, 0.046032f, -0.054794f, -0.015331f, -0.026713f, -0.001126f, 0.008684f, 0.001450f, 0.036733f, -0.037912f, 0.017922f, -0.005176f, 0.007318f, -0.004590f, 0.020169f, -0.011123f, -0.018777f, -0.001568f, -0.005476f, 0.014262f, -0.001193f, 0.009644f, 0.021366f, -0.004444f, -0.016025f, -0.002139f, 0.024028f, -0.014136f, 0.005722f, 0.005413f, 0.000945f, -0.002176f, 0.023862f, -0.000895f, -0.006168f, -0.039862f, 0.012816f, -0.009857f, -0.025193f, -0.021900f, -0.005832f, -0.024277f, -0.014324f, -0.021080f, 0.009993f, -0.024879f, 0.024822f, -0.022833f, 0.015384f, -0.011792f, 0.030095f, -0.029155f, -0.016960f, + -0.004380f, 0.017430f, 0.007197f, 0.000132f, -0.011990f, -0.023916f, 0.002444f, 0.009324f, 0.034138f, 0.017874f, 0.007464f, -0.019534f, 0.011628f, -0.017331f, -0.019507f, 0.017018f, -0.018936f, 0.009012f, 0.022133f, 0.018430f, -0.004899f, -0.007071f, -0.015933f, 0.026588f, 0.002625f, 0.025445f, 0.041189f, -0.008079f, -0.021577f, -0.009671f, -0.007167f, -0.014855f, 0.006542f, -0.024641f, 0.010749f, 0.008005f, 0.007424f, 0.019442f, -0.013733f, 0.000696f, -0.002477f, 0.004910f, 0.017736f, 0.000490f, 0.013955f, -0.005078f, -0.000302f, 0.001722f, -0.007862f, -0.002851f, 0.008398f, 0.004393f, -0.011249f, -0.014766f, -0.006970f, 0.006476f, 0.005872f, -0.006503f, 0.021092f, 0.006139f, -0.015352f, 0.007728f, 0.011294f, 0.028037f, 0.022845f, 0.012760f, 0.004772f, 0.002682f, -0.011734f, -0.009255f, -0.000338f, -0.009375f, 0.001826f, -0.005447f, -0.017151f, 0.009472f, -0.005636f, -0.002419f, 0.002098f, 0.009343f, 0.000289f, -0.007943f, 0.029788f, 0.041520f, -0.045380f, 0.032131f, 0.022176f, 0.000420f, 0.015762f, 0.055412f, -0.016501f, -0.016850f, 0.004602f, 0.015825f, 0.022574f, 0.006991f, + -0.022626f, 0.024100f, -0.009835f, 0.048887f, -0.002033f, -0.008865f, 0.015312f, 0.012348f, 0.012166f, -0.001210f, 0.045807f, -0.039335f, 0.008707f, -0.001377f, 0.012050f, -0.016799f, -0.032908f, 0.015341f, 0.011901f, 0.012391f, -0.011990f, -0.009236f, 0.038173f, 0.013924f, 0.048158f, 0.003805f, -0.018806f, -0.002605f, 0.010141f, -0.004912f, 0.050020f, -0.007045f, 0.026906f, -0.005578f, 0.044807f, 0.015946f, 0.011561f, -0.011700f, -0.003280f, 0.024415f, -0.000249f, 0.026191f, 0.019542f, 0.023072f, -0.032212f, 0.004414f, 0.021787f, 0.026422f, 0.019491f, 0.014859f, 0.035705f, 0.044062f, -0.034808f, -0.004717f, 0.067220f, -0.016960f, -0.019111f, 0.043344f, 0.058567f, 0.000502f, -0.001305f, -0.032693f, -0.027105f, -0.002343f, 0.029061f, -0.004960f, -0.006319f, 0.000751f, -0.002984f, -0.008860f, -0.023556f, -0.008939f, -0.002432f, -0.014115f, 0.000228f, 0.013255f, -0.008422f, 0.017119f, -0.018588f, 0.015026f, -0.004319f, 0.013017f, -0.014099f, -0.000119f, 0.009390f, 0.005338f, 0.016548f, -0.003613f, -0.009750f, -0.004574f, 0.004469f, 0.015183f, 0.004009f, -0.006178f, 0.021093f, -0.007320f, + 0.010822f, 0.010956f, -0.002616f, -0.002968f, -0.005545f, 0.031203f, -0.012213f, 0.003547f, 0.007484f, 0.011278f, -0.006355f, -0.021104f, -0.012542f, -0.004104f, 0.023392f, 0.011105f, -0.002389f, 0.000925f, 0.007955f, -0.002048f, -0.000280f, 0.007984f, 0.003941f, 0.001668f, -0.000340f, 0.018615f, 0.041915f, -0.002587f, 0.013050f, -0.035855f, 0.034085f, -0.018185f, -0.011258f, -0.031389f, -0.020417f, 0.064293f, 0.000813f, -0.045302f, -0.020286f, -0.001367f, 0.000081f, -0.005996f, 0.049624f, 0.023208f, -0.004361f, -0.020786f, -0.002098f, 0.013060f, -0.006290f, 0.066225f, 0.013943f, 0.029109f, 0.009896f, -0.014938f, -0.037665f, 0.008805f, -0.000591f, 0.005862f, -0.029232f, -0.003093f, -0.019804f, 0.022325f, -0.000049f, 0.003652f, 0.022998f, -0.021006f, -0.015584f, 0.004566f, 0.000818f, 0.006879f, -0.032303f, -0.025228f, -0.055204f, -0.028777f, 0.002147f, -0.031415f, 0.003988f, -0.022797f, -0.013882f, 0.040829f, 0.012602f, -0.019866f, 0.011985f, 0.004628f, -0.000423f, 0.039282f, -0.006995f, 0.047589f, 0.017937f, -0.020485f, -0.058369f, 0.010128f, 0.008972f, 0.032174f, -0.017684f, -0.041731f, + -0.015177f, 0.012102f, 0.001764f, -0.009953f, -0.030360f, -0.009645f, -0.042773f, -0.048350f, 0.014768f, -0.002687f, 0.049196f, -0.015844f, -0.030552f, -0.026238f, -0.002791f, 0.035039f, -0.002271f, 0.012915f, 0.022088f, 0.017228f, -0.008090f, 0.011436f, 0.014959f, 0.005152f, 0.015331f, 0.015483f, -0.011373f, -0.001561f, 0.021624f, -0.004345f, 0.002634f, 0.021020f, -0.004437f, 0.012490f, -0.015960f, 0.006099f, 0.011589f, -0.007036f, 0.006724f, 0.006956f, -0.014971f, 0.019290f, -0.018670f, 0.009355f, 0.009149f, 0.015332f, -0.004306f, -0.010448f, 0.019988f, -0.002653f, 0.014632f, -0.021831f, -0.011204f, -0.016011f, -0.014106f, 0.002105f, -0.011728f, 0.008406f, 0.000562f, 0.003561f, -0.022526f, 0.002490f, -0.006828f, 0.030597f, -0.032992f, -0.001584f, 0.051234f, -0.010509f, 0.015475f, 0.005703f, 0.007173f, -0.047189f, 0.039991f, -0.003535f, -0.037651f, -0.021927f, 0.020452f, -0.005312f, 0.010474f, 0.000138f, -0.015327f, -0.011410f, 0.007340f, -0.011432f, -0.002267f, -0.000310f, -0.054748f, -0.014093f, -0.036546f, 0.008540f, 0.013657f, 0.000010f, -0.015811f, 0.006896f, -0.007305f, 0.022005f, + -0.048382f, 0.003613f, 0.009023f, 0.028304f, -0.020783f, 0.026392f, -0.020463f, 0.016913f, 0.004940f, 0.020605f, -0.031410f, 0.010099f, -0.015306f, -0.033604f, 0.022561f, -0.027132f, -0.054668f, 0.008430f, -0.004666f, 0.043828f, -0.020487f, 0.006411f, 0.020505f, 0.029188f, 0.033191f, 0.003845f, -0.010684f, -0.020249f, 0.001170f, 0.015894f, 0.022038f, -0.042670f, 0.048701f, -0.000044f, -0.032009f, -0.023989f, -0.042761f, 0.017958f, 0.011034f, 0.017567f, 0.008146f, 0.046240f, -0.015778f, 0.050227f, -0.026550f, 0.012020f, -0.010475f, -0.022842f, -0.068997f, 0.039581f, 0.008046f, -0.018095f, -0.046666f, -0.002400f, 0.009290f, -0.003696f, 0.017811f, -0.012383f, -0.014637f, -0.002106f, 0.007896f, -0.012902f, -0.012542f, -0.008018f, -0.001905f, 0.007666f, -0.003571f, -0.003855f, -0.018178f, 0.014249f, 0.000977f, -0.009888f, 0.009107f, -0.007075f, 0.014983f, -0.004110f, 0.007766f, 0.009944f, 0.018389f, -0.005793f, 0.016750f, 0.002170f, 0.001449f, -0.017128f, -0.013198f, 0.004653f, 0.007134f, 0.002796f, 0.001481f, -0.003017f, -0.010903f, -0.005979f, -0.004880f, -0.012123f, -0.005187f, 0.022236f, + -0.010375f, -0.012046f, 0.007364f, -0.026903f, 0.000463f, -0.006774f, -0.040861f, -0.000101f, 0.022625f, -0.008911f, -0.044268f, -0.006999f, -0.064720f, 0.031437f, -0.071535f, 0.042793f, -0.049447f, -0.043128f, 0.012348f, 0.037136f, 0.027728f, -0.024544f, 0.026013f, 0.046704f, 0.008320f, 0.007027f, 0.011002f, 0.004265f, -0.027463f, 0.033519f, -0.056135f, -0.034830f, 0.003173f, -0.003418f, -0.003588f, -0.007405f, -0.013979f, 0.007558f, 0.051693f, 0.013428f, 0.007193f, 0.004906f, -0.024311f, 0.030076f, -0.005423f, -0.051933f, -0.008006f, 0.001185f, 0.001117f, -0.035504f, -0.025137f, 0.027443f, -0.008925f, 0.047044f, 0.008706f, 0.000110f, -0.038233f, -0.020875f, 0.014078f, 0.006148f, -0.010434f, 0.040329f, -0.031866f, -0.019263f, -0.001406f, -0.002264f, 0.037964f, 0.003184f, 0.044412f, 0.000111f, -0.036330f, 0.009145f, -0.030978f, 0.023694f, -0.004370f, 0.032252f, 0.060776f, -0.093463f, 0.031853f, 0.013075f, 0.017109f, 0.035552f, 0.008754f, -0.042789f, -0.009992f, -0.003759f, -0.007798f, 0.022076f, -0.043991f, 0.004316f, -0.011550f, -0.006105f, -0.030327f, -0.016120f, -0.045861f, 0.005274f, + -0.002932f, 0.004895f, 0.012574f, -0.018416f, -0.003415f, 0.022446f, -0.013758f, 0.004563f, -0.007688f, -0.022380f, 0.010434f, 0.013854f, -0.015894f, -0.001452f, -0.025079f, -0.001247f, -0.036256f, 0.013235f, 0.008808f, -0.004280f, 0.003793f, -0.008892f, 0.001432f, 0.007606f, -0.005894f, -0.006503f, 0.020568f, 0.025520f, -0.005783f, 0.008643f, 0.003964f, 0.026199f, 0.011414f, -0.032365f, 0.004209f, 0.019017f, -0.010778f, 0.019219f, 0.005970f, 0.008417f, 0.076525f, 0.066123f, -0.018987f, -0.025646f, -0.001568f, -0.050395f, 0.029348f, -0.002924f, 0.011040f, 0.003868f, -0.025504f, 0.076345f, -0.032877f, -0.134797f, -0.019775f, 0.026845f, -0.090768f, -0.015592f, 0.028336f, -0.076890f, 0.010609f, 0.049985f, -0.035378f, 0.049866f, -0.047981f, 0.042836f, 0.053146f, -0.034027f, 0.014434f, -0.004948f, 0.001100f, -0.014442f, -0.021104f, -0.003927f, 0.032691f, -0.021152f, -0.035188f, -0.019237f, -0.028346f, -0.003041f, -0.022262f, -0.003675f, 0.011678f, -0.005330f, 0.031931f, -0.028269f, -0.034726f, 0.027586f, -0.036729f, -0.054458f, -0.069821f, -0.024353f, -0.001711f, 0.013527f, 0.038828f, -0.016282f, + 0.017377f, 0.018174f, -0.012848f, -0.006056f, 0.064015f, -0.042399f, -0.001683f, 0.043808f, 0.013549f, 0.034439f, -0.008663f, 0.012531f, 0.048598f, 0.024972f, -0.002688f, -0.005970f, -0.030026f, 0.012259f, 0.048888f, -0.045533f, 0.034570f, -0.045059f, 0.013104f, 0.063629f, 0.014641f, -0.035792f, 0.036167f, 0.005721f, -0.022880f, -0.017867f, 0.043776f, 0.014394f, 0.018868f, -0.002664f, 0.003291f, 0.011994f, 0.014347f, -0.001327f, -0.004409f, 0.018614f, 0.016236f, 0.003409f, -0.021667f, 0.023819f, 0.002933f, -0.008234f, 0.005850f, 0.008159f, -0.015776f, -0.004190f, 0.012150f, 0.002342f, 0.020246f, -0.025012f, 0.037615f, 0.029149f, -0.005183f, -0.023852f, -0.009692f, 0.025081f, 0.028674f, 0.046261f, -0.001430f, 0.008910f, 0.007570f, 0.025366f, -0.038591f, -0.020583f, 0.038716f, 0.024227f, 0.002625f, -0.006248f, 0.003327f, 0.010707f, -0.020200f, -0.015846f, -0.013588f, 0.002842f, 0.012347f, -0.006228f, -0.000051f, 0.020115f, -0.021484f, -0.015235f, 0.067707f, 0.046008f, -0.064473f, -0.012697f, 0.058355f, -0.017249f, -0.035470f, -0.024944f, -0.035591f, -0.020860f, 0.058915f, 0.036068f, + -0.004308f, 0.026942f, -0.005981f, 0.032756f, -0.019958f, -0.010937f, 0.065418f, -0.026686f, 0.012161f, -0.018446f, -0.006613f, -0.000376f, 0.018196f, 0.053252f, 0.020800f, -0.035489f, -0.010092f, -0.001296f, -0.005005f, 0.030126f, 0.004408f, 0.053613f, -0.015268f, 0.009555f, -0.005061f, 0.015898f, -0.044210f, 0.027181f, -0.040744f, 0.028237f, -0.001738f, 0.041281f, -0.010229f, 0.030699f, -0.013545f, 0.009904f, 0.017872f, -0.017326f, 0.018505f, 0.041668f, 0.052073f, -0.026996f, 0.053351f, 0.022572f, 0.063210f, -0.017680f, 0.012305f, -0.002012f, -0.007248f, -0.011703f, -0.003853f, -0.020453f, -0.102366f, -0.064438f, -0.019438f, -0.000991f, 0.015089f, 0.007552f, 0.024266f, 0.039038f, -0.056095f, -0.002893f, -0.022350f, 0.085959f, -0.005477f, -0.025809f, -0.006923f, -0.074914f, -0.062353f, 0.094967f, 0.039060f, 0.021427f, -0.014054f, 0.029919f, 0.003019f, -0.068600f, 0.014643f, 0.004901f, -0.025607f, -0.026640f, 0.004921f, 0.000601f, 0.007931f, -0.014201f, -0.006715f, -0.033527f, -0.027911f, 0.012281f, 0.015643f, 0.013242f, 0.010706f, -0.017366f, -0.025114f, -0.015545f, -0.032675f, 0.021251f, + 0.007874f, -0.059147f, -0.006330f, -0.017063f, -0.003393f, 0.029122f, -0.026590f, -0.038252f, -0.007706f, 0.024884f, 0.009130f, -0.026547f, 0.016649f, 0.034352f, -0.062980f, -0.017095f, 0.023516f, -0.001109f, -0.004029f, -0.012138f, -0.001735f, 0.011134f, 0.019928f, 0.004504f, -0.007963f, 0.050811f, -0.073927f, 0.069237f, -0.020439f, -0.020914f, 0.017699f, 0.032128f, -0.057924f, -0.011756f, 0.000846f, 0.011342f, 0.002944f, -0.001850f, 0.028809f, -0.017781f, 0.003557f, 0.015018f, 0.016706f, 0.023949f, 0.019838f, 0.006462f, -0.031849f, -0.006611f, 0.042954f, -0.042104f, -0.035958f, 0.044436f, 0.015104f, 0.031322f, 0.048688f, 0.075473f, -0.017319f, -0.048413f, 0.063914f, -0.026129f, -0.010956f, 0.066505f, 0.020841f, -0.024773f, -0.069806f, -0.046265f, -0.007131f, -0.026007f, 0.032644f, 0.065522f, 0.033598f, -0.022870f, 0.067467f, 0.022449f, -0.024608f, 0.018352f, 0.075312f, 0.021533f, 0.014506f, -0.016212f, -0.060535f, -0.081424f, -0.064582f, -0.004958f, 0.048790f, 0.014641f, 0.030796f, 0.115326f, 0.056896f, -0.069527f, -0.046705f, 0.030367f, -0.095896f, -0.044339f, 0.082554f, 0.029202f, + -0.106530f, -0.089167f, -0.041275f, -0.068348f, -0.063982f, -0.038587f, 0.057886f, -0.016832f, -0.012191f, 0.150840f, 0.025374f, -0.043864f, -0.012098f, -0.047372f, 0.080301f, -0.017300f, 0.017419f, 0.005182f, 0.001121f, -0.044380f, -0.017043f, -0.003842f, -0.022316f, 0.004903f, 0.017204f, 0.038931f, 0.005093f, -0.027155f, -0.001183f, -0.000560f, -0.017665f, 0.007701f, 0.011387f, 0.012887f, -0.034888f, 0.008507f, -0.032320f, 0.005162f, 0.016925f, -0.002370f, 0.025750f, -0.006726f, -0.001709f, 0.025600f, -0.005371f, 0.014089f, 0.028919f, -0.010343f, 0.008604f, 0.019461f, 0.021740f, 0.017356f, 0.003573f, 0.003940f, 0.015125f, -0.016530f, -0.006164f, 0.009856f, 0.028580f, -0.103351f, 0.071450f, 0.030622f, 0.023055f, 0.028664f, -0.011176f, 0.035193f, 0.028874f, 0.041274f, -0.007956f, 0.056636f, -0.035758f, 0.042940f, -0.015794f, -0.033051f, -0.010581f, -0.054157f, 0.005487f, -0.019946f, 0.018975f, -0.013814f, -0.021076f, 0.051769f, -0.059732f, 0.038350f, -0.002194f, -0.026057f, -0.010564f, 0.022882f, 0.025819f, 0.018672f, 0.048922f, 0.039478f, -0.028609f, -0.006033f, -0.025618f, 0.021963f, + -0.022731f, 0.017110f, 0.023460f, 0.010730f, 0.013075f, 0.008700f, -0.014199f, 0.054104f, -0.005288f, 0.016021f, 0.005195f, 0.024887f, 0.013631f, -0.064894f, 0.003970f, -0.038854f, 0.009651f, 0.028529f, -0.005548f, -0.027532f, -0.025406f, 0.060319f, -0.064083f, -0.051705f, 0.094521f, -0.040347f, 0.024321f, 0.009350f, 0.030175f, -0.014377f, 0.015659f, -0.066040f, 0.004241f, 0.064000f, -0.034596f, -0.025972f, 0.054946f, -0.003837f, -0.046090f, -0.033972f, 0.020068f, -0.018020f, -0.010946f, 0.034203f, -0.025555f, 0.008474f, 0.042380f, -0.048144f, 0.002860f, 0.028101f, -0.015915f, -0.009617f, -0.012874f, 0.017281f, 0.004471f, 0.006950f, -0.006633f, 0.009802f, 0.007084f, -0.009489f, 0.000412f, 0.001673f, 0.025144f, 0.012809f, -0.024204f, 0.029187f, 0.006981f, -0.014889f, 0.008199f, 0.008908f, -0.002976f, -0.008717f, 0.020608f, 0.000025f, 0.006726f, 0.002620f, 0.026745f, -0.012574f, -0.010529f, 0.016448f, -0.024659f, 0.030616f, -0.002641f, -0.017284f, -0.003194f, -0.001834f, 0.003337f, -0.000330f, -0.012113f, -0.001741f, 0.015603f, 0.032804f, -0.060728f, -0.247440f, -0.266964f, -0.009373f, + -0.152999f, 0.136082f, 0.491099f, 0.214250f, 0.296300f, 0.374162f, -0.140874f, -0.099518f, -0.039432f, -0.335401f, -0.234506f, -0.075788f, -0.367831f, -0.160096f, -0.032443f, -0.150136f, 0.036191f, 0.345953f, 0.314286f, 0.340132f, 0.440719f, 0.265742f, -0.023546f, 0.099373f, -0.098396f, -0.391457f, -0.212567f, -0.157138f, -0.325270f, -0.222848f, 0.012765f, -0.250289f, -0.082199f, 0.055725f, -0.250154f, -0.128048f, 0.187708f, 0.073094f, 0.203540f, 0.506634f, 0.411855f, 0.333199f, 0.599070f, 0.435013f, -0.007100f, 0.062911f, -0.111641f, -0.536124f, -0.512556f, -0.528650f, -0.823762f, -0.557788f, -0.344723f, -0.337332f, 0.004290f, 0.267937f, 0.301636f, 0.422757f, 0.639735f, 0.592167f, 0.499866f, 0.493642f, 0.282719f, 0.099655f, 0.015906f, -0.030029f, -0.223960f, -0.385477f, -0.473491f, -0.506858f, -0.684593f, -0.568956f, -0.438846f, -0.214529f, 0.229665f, 0.677771f, 0.631170f, 0.691713f, 0.485037f, 0.059447f, -0.065749f, -0.207268f, -0.285190f, -0.192637f, -0.094550f, -0.095223f, -0.042199f, -0.043528f, -0.069386f, 0.000769f, 0.010108f, 0.050653f, 0.157730f, 0.143380f, 0.105595f, 0.145263f, + -0.013673f, -0.093455f, -0.012573f, -0.109789f, -0.095175f, 0.059193f, 0.063877f, 0.014978f, 0.014640f, -0.167476f, -0.428838f, -0.405934f, -0.345853f, -0.260419f, 0.126834f, 0.391364f, 0.478427f, 0.604473f, 0.541737f, 0.334285f, 0.231952f, 0.082443f, -0.096313f, -0.201737f, -0.240818f, -0.312155f, -0.383224f, -0.432066f, -0.504758f, -0.448724f, -0.155351f, 0.110437f, 0.259758f, 0.336945f, 0.366055f, 0.274733f, 0.190447f, 0.095387f, -0.003870f, -0.011298f, 0.046171f, 0.073964f, 0.080819f, 0.087884f, 0.072513f, 0.005335f, -0.062352f, -0.133103f, -0.237092f, -0.228699f, -0.186267f, -0.155753f, -0.087364f, -0.013190f, 0.043910f, 0.062959f, 0.066431f, 0.041791f, 0.026004f, 0.037812f, 0.060081f, 0.084366f, 0.114700f, 0.136351f, 0.131398f, 0.095680f, 0.047714f, -0.010570f, -0.053639f, -0.070819f, -0.094044f, -0.117777f, -0.116368f, -0.090168f, -0.068798f, -0.049685f, -0.037634f, -0.022670f, 0.004563f, 0.040293f, 0.060239f, 0.055420f, 0.051638f, 0.044296f, 0.025907f, 0.021948f, 0.018517f, 0.007794f, 0.016103f, 0.032527f, 0.030579f, 0.027152f, 0.027979f, 0.006233f, -0.020024f, -0.037287f, + -0.062881f, -0.075621f, -0.063897f, -0.049148f, -0.035477f, -0.005117f, 0.014548f, 0.020899f, 0.027328f, 0.020490f, 0.008036f, 0.008750f, 0.019930f, 0.024352f, 0.037876f, 0.041461f, 0.035193f, 0.028640f, 0.011212f, -0.012704f, -0.033126f, -0.044366f, -0.047763f, -0.042241f, -0.028241f, -0.010037f, 0.006465f, 0.014136f, 0.015423f, 0.011579f, 0.008794f, 0.008063f, 0.008134f, 0.007167f, 0.005495f, 0.002511f, -0.000251f, -0.002134f, -0.003068f, -0.002913f, -0.002223f, -0.001145f, -0.000476f}, + {-0.014413f, 0.007078f, -0.016398f, 0.003284f, 0.001257f, 0.001089f, -0.011168f, -0.003924f, 0.003153f, -0.002406f, 0.003722f, 0.005905f, 0.003594f, -0.000097f, 0.004673f, -0.012640f, 0.000371f, -0.000441f, -0.000248f, 0.007028f, 0.010675f, -0.011076f, -0.002432f, -0.006699f, -0.002135f, 0.004012f, 0.007347f, 0.001229f, 0.001872f, -0.002693f, -0.003559f, -0.002905f, -0.002185f, -0.005019f, 0.002837f, -0.005060f, -0.003381f, 0.005857f, -0.004895f, 0.004216f, 0.000757f, -0.012519f, -0.004190f, -0.006880f, -0.001592f, 0.005380f, -0.003647f, -0.001057f, -0.003585f, -0.003737f, -0.002574f, 0.005259f, 0.008003f, 0.001503f, 0.004480f, 0.003545f, -0.004144f, -0.007950f, 0.004358f, 0.003570f, -0.001677f, -0.006837f, -0.005667f, 0.005216f, 0.001118f, 0.003910f, 0.001916f, -0.010533f, -0.003419f, -0.003898f, 0.005903f, 0.002395f, -0.010559f, 0.002832f, -0.005563f, -0.001710f, -0.000481f, -0.003820f, 0.003104f, -0.003483f, 0.000887f, 0.004089f, 0.004260f, 0.002605f, 0.002960f, 0.001920f, -0.000265f, 0.002048f, 0.002557f, 0.000267f, -0.001990f, 0.002869f, 0.000662f, 0.000054f, -0.000763f, -0.001877f, + 0.000990f, 0.001819f, 0.000399f, 0.001496f, -0.000490f, -0.000945f, 0.000054f, -0.001467f, 0.001645f, -0.000251f, 0.001931f, -0.000334f, 0.000437f, -0.000157f, 0.001801f, 0.000928f, -0.000012f, -0.000704f, 0.001170f, -0.000796f, -0.020558f, 0.013402f, -0.009891f, 0.001231f, -0.001427f, -0.003852f, 0.010238f, -0.009237f, -0.006185f, -0.000126f, 0.010828f, -0.004185f, -0.000753f, -0.001295f, 0.008936f, -0.005584f, -0.014643f, -0.003344f, -0.007590f, -0.010265f, 0.000258f, -0.000923f, 0.001558f, 0.005755f, 0.009547f, 0.005915f, 0.000814f, 0.014673f, 0.005636f, 0.000389f, 0.010424f, 0.010951f, -0.001011f, -0.006070f, 0.000298f, 0.004778f, 0.003783f, -0.000194f, -0.002258f, -0.008692f, -0.007696f, -0.003826f, 0.008334f, 0.003397f, 0.014445f, 0.008145f, -0.000782f, 0.004773f, 0.005806f, 0.001882f, -0.009193f, 0.009703f, -0.004025f, 0.005025f, -0.000526f, 0.003003f, -0.010937f, -0.001825f, -0.003572f, 0.003720f, -0.003436f, -0.004177f, 0.011133f, -0.000877f, -0.008604f, 0.003249f, -0.006582f, 0.005167f, -0.003775f, 0.008354f, 0.007141f, 0.008009f, 0.002586f, -0.007901f, 0.004152f, -0.001277f, + 0.004090f, -0.003471f, 0.001063f, 0.011009f, -0.004426f, 0.005301f, 0.007153f, -0.001185f, 0.000296f, -0.000421f, -0.001479f, -0.003038f, 0.001692f, -0.000261f, 0.002623f, -0.000145f, 0.002089f, 0.000059f, 0.000029f, 0.001518f, 0.002546f, 0.001046f, 0.002437f, 0.002810f, -0.000707f, -0.002189f, 0.003597f, 0.000334f, -0.000267f, 0.000216f, 0.002129f, -0.000691f, -0.002227f, 0.001020f, -0.000662f, 0.000523f, -0.000086f, 0.002185f, 0.000568f, 0.001157f, 0.000574f, -0.001960f, 0.004112f, 0.004616f, 0.000263f, -0.003950f, 0.004312f, 0.001697f, 0.001327f, 0.002052f, -0.016141f, 0.005263f, -0.010276f, 0.001731f, 0.003366f, 0.003529f, -0.004700f, 0.008605f, 0.001390f, -0.003164f, -0.001454f, 0.010038f, 0.007222f, -0.004351f, -0.005584f, -0.004594f, 0.003905f, 0.007122f, -0.004274f, -0.004692f, 0.001416f, -0.018324f, -0.000020f, -0.007817f, -0.003065f, -0.007777f, -0.010180f, -0.001251f, 0.009312f, 0.002562f, -0.008291f, -0.002206f, 0.007976f, 0.002407f, -0.005078f, 0.008998f, -0.003891f, -0.012549f, -0.003713f, 0.007045f, -0.003086f, 0.008335f, 0.015964f, 0.012886f, 0.001812f, -0.000182f, + 0.004534f, -0.001961f, -0.009375f, 0.000092f, 0.003576f, -0.006745f, 0.005711f, -0.013370f, -0.001966f, 0.000820f, -0.005639f, -0.004375f, 0.005855f, 0.011636f, -0.009091f, -0.009545f, 0.005961f, 0.005946f, 0.011006f, 0.003519f, -0.006365f, 0.008744f, 0.007602f, -0.002537f, 0.008473f, -0.009347f, 0.009490f, 0.002271f, 0.006448f, 0.001273f, -0.004975f, -0.002901f, -0.000864f, 0.002057f, 0.000246f, -0.004614f, 0.001630f, 0.000022f, -0.002634f, -0.002231f, 0.000673f, -0.000710f, 0.002114f, 0.000089f, 0.003491f, -0.002522f, -0.001761f, -0.000161f, 0.000500f, 0.002940f, -0.001448f, -0.003007f, 0.001414f, 0.000073f, -0.000562f, 0.001985f, -0.000392f, 0.001187f, -0.001272f, 0.001195f, 0.001874f, 0.000193f, 0.002995f, 0.027504f, -0.010731f, -0.004744f, -0.001797f, 0.019821f, -0.002009f, 0.014983f, -0.010951f, 0.013199f, -0.013129f, -0.011522f, 0.002729f, 0.006234f, -0.007765f, -0.001931f, 0.003916f, -0.001043f, 0.005117f, -0.008004f, 0.009169f, 0.003298f, -0.009901f, -0.000405f, 0.003928f, 0.003061f, 0.001732f, 0.018647f, 0.014854f, 0.011617f, -0.000033f, 0.007531f, 0.000677f, 0.002152f, + 0.005562f, -0.017264f, -0.002666f, 0.010476f, 0.006805f, 0.008126f, -0.000224f, -0.003082f, 0.003774f, -0.000706f, 0.021035f, -0.003216f, 0.003522f, 0.002089f, 0.001000f, -0.006257f, 0.012603f, -0.001461f, 0.013105f, -0.007261f, -0.007618f, 0.005419f, -0.005085f, -0.017557f, -0.008107f, 0.003508f, -0.001694f, -0.012564f, 0.003472f, 0.000015f, 0.016292f, 0.001409f, 0.001388f, -0.005009f, 0.005913f, 0.006006f, -0.001367f, -0.000971f, 0.014308f, 0.010519f, 0.010438f, -0.006930f, -0.009867f, -0.008606f, -0.016837f, 0.001383f, -0.011928f, -0.004034f, 0.000723f, -0.006502f, -0.007432f, -0.004140f, -0.000864f, -0.002540f, 0.003929f, 0.007366f, -0.001408f, -0.000866f, -0.003341f, 0.001699f, -0.002427f, -0.002781f, 0.001155f, 0.002013f, 0.000005f, 0.002597f, -0.001546f, 0.000086f, -0.001494f, -0.000994f, -0.000827f, 0.001512f, -0.000934f, -0.000915f, -0.000568f, -0.002393f, -0.002744f, 0.000164f, -0.000326f, -0.003288f, 0.002769f, 0.002800f, 0.003381f, -0.000064f, -0.002405f, -0.001390f, 0.002652f, 0.000710f, 0.020386f, -0.015901f, -0.000264f, -0.016639f, -0.010883f, -0.006398f, 0.014696f, 0.008677f, + -0.020129f, -0.027575f, -0.010525f, 0.009914f, 0.007097f, -0.004019f, 0.009637f, 0.000226f, -0.002217f, 0.001213f, -0.014426f, 0.004520f, -0.001774f, 0.001348f, 0.004751f, 0.001117f, 0.000095f, 0.006251f, 0.005521f, -0.009551f, -0.009504f, 0.011150f, -0.003341f, -0.005292f, 0.006901f, -0.018826f, 0.004671f, 0.004087f, -0.017313f, 0.006486f, 0.018234f, 0.011081f, 0.012566f, 0.002674f, 0.007006f, 0.017295f, 0.003383f, 0.003402f, -0.019528f, 0.010528f, 0.015007f, 0.012276f, 0.002499f, 0.012469f, -0.013864f, 0.013949f, -0.003979f, -0.013670f, -0.021100f, -0.000078f, -0.013359f, -0.010781f, -0.004508f, -0.012833f, -0.032157f, 0.001535f, 0.001860f, -0.000950f, 0.005210f, 0.016040f, 0.006162f, 0.006550f, 0.004424f, -0.011419f, 0.001874f, 0.005537f, 0.004821f, 0.004236f, 0.004889f, -0.011722f, -0.003330f, -0.014811f, -0.006554f, -0.000940f, 0.003681f, -0.005329f, 0.005505f, 0.001200f, 0.001138f, -0.003607f, -0.000399f, -0.001850f, 0.000240f, -0.002011f, 0.002214f, 0.000786f, 0.001731f, -0.000411f, -0.002513f, -0.002141f, -0.002026f, 0.002435f, 0.001702f, 0.000136f, -0.000824f, -0.001927f, + -0.002008f, -0.002040f, -0.006498f, 0.001156f, 0.001183f, -0.004964f, -0.002422f, -0.001712f, -0.043658f, 0.021565f, 0.002816f, -0.016936f, 0.004167f, -0.001825f, -0.004972f, -0.003424f, -0.009582f, 0.005208f, -0.004896f, 0.001057f, 0.006332f, 0.005850f, 0.018967f, -0.007612f, -0.018060f, 0.009886f, -0.022911f, -0.009850f, 0.003774f, 0.003198f, 0.002645f, 0.007473f, 0.009235f, 0.007973f, -0.000140f, 0.010539f, 0.000710f, -0.004129f, 0.013969f, 0.008681f, -0.004224f, 0.008335f, -0.014400f, 0.027293f, 0.001052f, 0.005112f, -0.002535f, -0.023355f, -0.004031f, -0.008666f, -0.008177f, 0.003674f, 0.019519f, 0.000595f, 0.000836f, -0.002471f, -0.005363f, -0.012583f, 0.004013f, -0.002038f, 0.006999f, -0.015867f, 0.005385f, 0.008525f, 0.003747f, -0.011741f, -0.004172f, 0.003157f, 0.001536f, 0.009603f, 0.001890f, 0.033185f, -0.009445f, -0.014068f, -0.016040f, -0.004800f, 0.000348f, 0.011887f, -0.015979f, -0.002014f, -0.006846f, 0.007369f, -0.023337f, -0.000952f, -0.006319f, -0.009709f, 0.002913f, -0.002768f, 0.006370f, -0.000759f, 0.011700f, 0.007481f, -0.000033f, 0.002564f, 0.000905f, 0.001555f, + 0.013564f, 0.001716f, 0.009698f, 0.003606f, -0.002455f, 0.000341f, 0.000344f, 0.002898f, -0.001790f, 0.001539f, -0.000527f, 0.004209f, 0.000752f, -0.002966f, -0.004472f, 0.003719f, -0.001729f, -0.005206f, -0.002355f, -0.002680f, -0.001248f, -0.001505f, -0.000114f, 0.006702f, 0.000097f, 0.001980f, 0.000778f, 0.002792f, -0.002620f, -0.001312f, -0.004816f, -0.005334f, 0.020007f, -0.006085f, -0.004445f, 0.004512f, 0.006090f, -0.015664f, -0.015805f, -0.014437f, -0.013552f, -0.022338f, 0.014503f, -0.012967f, 0.004256f, 0.005741f, 0.020795f, -0.003145f, -0.004624f, 0.016335f, 0.003984f, 0.003618f, -0.018631f, -0.012129f, 0.009541f, 0.004278f, 0.007638f, 0.011350f, -0.019642f, 0.000463f, 0.008747f, 0.019229f, 0.000057f, 0.002034f, -0.002610f, 0.000251f, -0.012732f, -0.002222f, -0.003788f, -0.023910f, -0.001691f, 0.007615f, -0.013611f, 0.006168f, -0.014829f, 0.000147f, -0.010185f, -0.001913f, -0.003010f, 0.001593f, 0.019716f, -0.005449f, 0.000501f, 0.010207f, -0.005339f, 0.006071f, -0.015920f, -0.028578f, -0.015409f, -0.008510f, -0.003842f, 0.003286f, 0.019450f, -0.008820f, 0.005387f, 0.004894f, + -0.013594f, 0.004885f, -0.010417f, -0.003535f, 0.007264f, 0.019705f, -0.002767f, -0.000839f, 0.006453f, -0.000237f, -0.018086f, -0.017130f, -0.007051f, 0.017502f, -0.001865f, -0.025745f, 0.002051f, -0.016848f, -0.007346f, -0.003343f, -0.001590f, 0.005957f, -0.006351f, -0.001793f, 0.006670f, -0.001634f, 0.007796f, 0.006757f, 0.004959f, -0.002888f, 0.007638f, -0.006433f, -0.004770f, -0.004503f, 0.001329f, -0.000583f, -0.001219f, -0.001381f, -0.001073f, -0.002108f, 0.001683f, -0.000419f, 0.004993f, -0.003131f, -0.001902f, 0.002194f, -0.002676f, -0.001518f, -0.007295f, -0.008892f, -0.000602f, 0.000895f, 0.004661f, 0.000776f, 0.002892f, 0.000387f, 0.019056f, 0.020014f, -0.006343f, 0.001715f, 0.020993f, -0.021684f, -0.019328f, 0.016040f, -0.004054f, 0.002061f, 0.014526f, -0.003055f, -0.004203f, 0.014541f, -0.027392f, 0.011447f, -0.001413f, 0.004463f, 0.013056f, 0.013518f, -0.015427f, 0.002749f, -0.021127f, 0.006303f, -0.006497f, -0.002376f, -0.014767f, -0.000879f, -0.021084f, 0.001892f, -0.018304f, 0.012547f, -0.006558f, 0.002272f, 0.022378f, 0.010353f, 0.009901f, -0.018155f, 0.003106f, 0.020824f, + -0.005172f, -0.029880f, 0.015754f, -0.003749f, 0.002691f, -0.005969f, -0.014027f, 0.019553f, 0.006841f, 0.015915f, 0.003773f, 0.002216f, -0.013451f, -0.017257f, 0.005945f, 0.007932f, 0.008370f, 0.011317f, 0.026100f, -0.000968f, -0.020671f, -0.013386f, 0.015609f, -0.002373f, -0.017810f, -0.004702f, -0.001337f, -0.004868f, -0.022479f, 0.000275f, 0.002773f, 0.005476f, -0.008320f, 0.012737f, -0.000929f, 0.001349f, 0.017941f, 0.009254f, 0.018687f, -0.018723f, -0.008093f, 0.003389f, -0.010551f, 0.008448f, 0.004922f, 0.005157f, -0.001086f, -0.002418f, -0.001876f, -0.000330f, -0.007669f, 0.009361f, -0.003766f, 0.005729f, -0.001851f, 0.006681f, -0.003014f, -0.003362f, 0.000075f, 0.003830f, -0.003660f, -0.000152f, -0.001178f, -0.003729f, -0.002224f, 0.001682f, -0.004441f, -0.001290f, -0.009024f, -0.006771f, 0.003281f, 0.005961f, 0.002726f, 0.002712f, -0.001292f, -0.000715f, -0.004445f, -0.000655f, 0.004055f, -0.005780f, -0.001231f, 0.002667f, -0.001582f, 0.004675f, 0.004107f, -0.003232f, -0.001740f, 0.004184f, 0.002458f, -0.002169f, -0.000145f, 0.015299f, -0.018647f, 0.021817f, -0.004925f, 0.023078f, + -0.018868f, 0.017081f, 0.001867f, -0.001813f, 0.028744f, -0.015030f, 0.001707f, -0.014588f, -0.004359f, 0.043824f, 0.021138f, 0.009302f, 0.006328f, 0.012462f, -0.007018f, -0.000061f, -0.037068f, 0.006881f, -0.001562f, -0.016025f, 0.017753f, 0.013329f, -0.000570f, 0.003165f, -0.021428f, 0.018870f, -0.010016f, 0.020041f, 0.013114f, 0.010702f, -0.015380f, -0.002700f, -0.012934f, 0.019245f, 0.004414f, -0.007003f, 0.034087f, 0.016307f, -0.003865f, 0.001796f, -0.028273f, 0.004803f, 0.001293f, 0.022449f, -0.010100f, -0.028731f, -0.004963f, -0.007945f, -0.005606f, -0.040609f, -0.020261f, -0.043253f, -0.022059f, -0.015452f, 0.005073f, -0.010867f, 0.020406f, 0.002559f, -0.023377f, 0.014106f, -0.015647f, 0.022104f, -0.019714f, -0.015955f, 0.011490f, 0.019693f, 0.019362f, 0.000082f, -0.018198f, -0.014487f, 0.008868f, -0.011877f, 0.000424f, -0.005987f, 0.007298f, -0.008143f, -0.012031f, 0.021196f, 0.009793f, 0.002921f, -0.003397f, 0.008009f, 0.004485f, 0.009852f, -0.000951f, 0.006684f, 0.002326f, 0.011063f, 0.000186f, -0.000481f, 0.000591f, -0.005394f, 0.000160f, 0.002860f, 0.001320f, 0.001252f, + 0.000260f, 0.008537f, 0.003858f, -0.006660f, 0.000707f, 0.003910f, -0.002157f, -0.002511f, -0.001660f, 0.000564f, 0.001583f, 0.004330f, -0.001112f, 0.002972f, 0.004927f, -0.000974f, -0.005082f, -0.000382f, -0.005537f, -0.002351f, -0.005117f, -0.003203f, 0.004359f, 0.000370f, -0.002882f, 0.002906f, 0.001564f, 0.006099f, -0.003597f, -0.001793f, -0.005477f, 0.002421f, 0.001193f, -0.026325f, -0.031353f, -0.020606f, -0.002520f, 0.000111f, -0.003616f, 0.008097f, 0.012050f, 0.008528f, 0.000514f, 0.004815f, -0.009597f, 0.007161f, -0.020015f, -0.028104f, 0.001418f, 0.022469f, 0.004362f, -0.007207f, 0.018080f, 0.010916f, 0.017517f, 0.029135f, 0.004234f, -0.008315f, -0.017716f, -0.014079f, 0.008880f, -0.016214f, -0.011087f, 0.004830f, -0.012727f, -0.028673f, -0.015487f, -0.001093f, -0.002870f, 0.007348f, -0.006047f, 0.016694f, 0.005217f, 0.006658f, 0.022902f, -0.003064f, 0.003176f, 0.005713f, -0.017343f, 0.021597f, 0.003991f, -0.018964f, -0.031365f, 0.008641f, 0.003389f, -0.022644f, 0.025048f, 0.016452f, -0.020957f, 0.007803f, 0.021140f, 0.012131f, 0.006052f, 0.017654f, -0.007309f, -0.006372f, + 0.001822f, -0.008947f, -0.014653f, 0.026517f, -0.022637f, -0.002044f, 0.010219f, 0.002765f, 0.040906f, -0.034510f, 0.011221f, -0.003937f, 0.000363f, 0.011836f, 0.000984f, 0.002966f, -0.008899f, 0.005893f, -0.020265f, -0.043543f, -0.001955f, 0.000016f, -0.022139f, -0.013857f, -0.002632f, 0.008892f, 0.007797f, 0.003666f, 0.002392f, -0.006786f, 0.000301f, -0.009728f, -0.004661f, -0.001433f, -0.005447f, -0.008711f, 0.003705f, -0.001198f, 0.002108f, -0.004181f, -0.002951f, 0.002761f, -0.007039f, -0.015513f, -0.005101f, 0.001659f, -0.003843f, -0.014935f, -0.008138f, 0.007011f, 0.004929f, 0.003631f, -0.002558f, -0.005378f, -0.006918f, -0.000794f, -0.003219f, -0.008218f, -0.006780f, -0.009791f, -0.004908f, -0.006412f, -0.006506f, 0.000388f, -0.001204f, 0.003412f, -0.002236f, 0.003328f, -0.001873f, 0.005791f, -0.007676f, -0.020695f, 0.018420f, -0.037499f, -0.026622f, 0.019926f, -0.000838f, -0.034138f, 0.017649f, -0.019925f, 0.038855f, 0.007874f, -0.050961f, -0.006375f, 0.004711f, -0.012772f, 0.003908f, 0.009018f, 0.018179f, 0.015635f, -0.029586f, -0.001172f, 0.002830f, -0.006019f, -0.027115f, -0.004069f, + -0.005588f, -0.009197f, -0.008240f, -0.000255f, 0.002055f, 0.023265f, 0.025375f, -0.007709f, 0.013682f, 0.011933f, 0.011553f, 0.025400f, 0.000350f, 0.006946f, -0.029058f, -0.009837f, 0.010273f, -0.005587f, 0.014063f, 0.034827f, 0.005124f, -0.030162f, -0.067591f, 0.000024f, -0.020831f, 0.019380f, -0.012770f, -0.006700f, -0.013278f, -0.036331f, 0.015900f, 0.049018f, 0.002862f, 0.012995f, -0.038300f, 0.008133f, -0.004345f, -0.017042f, 0.004394f, 0.018938f, 0.009732f, 0.015326f, -0.016499f, 0.024451f, 0.014202f, -0.028012f, -0.041955f, -0.002442f, -0.031907f, -0.029606f, -0.019032f, -0.021762f, 0.002856f, 0.039574f, 0.015091f, 0.001699f, -0.005270f, 0.025579f, -0.012907f, -0.018593f, -0.003035f, 0.004210f, -0.002981f, 0.004937f, 0.003911f, 0.000510f, 0.003958f, 0.009975f, 0.003547f, -0.000759f, 0.000706f, -0.003458f, -0.003746f, 0.010466f, -0.003094f, 0.010308f, 0.000227f, -0.005355f, 0.001212f, -0.002667f, -0.004242f, 0.012413f, -0.002935f, 0.006868f, -0.014879f, -0.001570f, 0.007209f, 0.000264f, 0.002940f, 0.012696f, -0.009301f, 0.011637f, -0.001159f, 0.001609f, 0.003441f, -0.003441f, + 0.008616f, 0.001619f, 0.000490f, 0.001889f, 0.000398f, 0.004317f, 0.011097f, -0.004264f, 0.003874f, 0.004755f, 0.004291f, 0.005311f, -0.001774f, -0.073766f, -0.046589f, 0.033403f, 0.026896f, 0.043767f, -0.000183f, 0.017224f, 0.004252f, 0.013792f, -0.000580f, 0.008882f, -0.019430f, -0.023303f, -0.014465f, -0.020867f, -0.013461f, -0.014879f, 0.017804f, 0.042065f, 0.009181f, -0.051418f, -0.012219f, 0.008963f, -0.013657f, 0.012509f, -0.029380f, -0.002421f, -0.001001f, 0.001664f, 0.014311f, 0.010810f, 0.002006f, -0.003584f, -0.006567f, 0.011911f, 0.023237f, -0.018677f, -0.028903f, 0.019176f, 0.009152f, 0.025167f, 0.011513f, 0.036609f, -0.025364f, -0.008957f, 0.023407f, 0.034901f, 0.030372f, 0.017924f, 0.008547f, -0.007556f, 0.002299f, -0.004465f, 0.000130f, 0.012053f, -0.045677f, 0.024489f, -0.003604f, 0.006588f, -0.003023f, 0.034617f, -0.010587f, -0.000584f, -0.007610f, 0.021925f, 0.018672f, -0.039039f, 0.027953f, -0.033221f, -0.001679f, -0.016885f, -0.016675f, 0.015060f, 0.002765f, -0.051750f, -0.004581f, -0.004156f, -0.009536f, -0.006097f, -0.001215f, -0.006679f, 0.026845f, 0.002557f, + 0.025680f, -0.008206f, 0.030366f, 0.014240f, -0.015682f, 0.006595f, -0.003916f, 0.001656f, 0.001975f, 0.002775f, 0.004099f, 0.001475f, -0.005881f, -0.009816f, 0.015111f, 0.006605f, 0.012405f, 0.003366f, -0.007367f, 0.014172f, 0.000567f, 0.000654f, 0.010767f, -0.030230f, -0.013959f, -0.013488f, 0.004246f, -0.000504f, -0.020457f, 0.000789f, 0.003454f, -0.001045f, -0.003829f, -0.000152f, 0.007054f, -0.007585f, -0.000282f, 0.008058f, 0.004088f, 0.009842f, -0.008664f, -0.004357f, 0.002500f, 0.010686f, 0.040873f, -0.045597f, -0.001105f, -0.025943f, -0.073072f, -0.008693f, -0.027005f, -0.057691f, 0.011461f, -0.000433f, -0.011256f, 0.003562f, 0.030917f, -0.002065f, -0.032793f, 0.011174f, 0.001268f, -0.010583f, -0.007930f, -0.005900f, 0.001602f, 0.035630f, -0.008064f, -0.001377f, 0.016154f, 0.011915f, -0.005191f, 0.017220f, 0.015765f, -0.007686f, -0.007548f, -0.014404f, 0.019811f, -0.004812f, -0.034250f, 0.005158f, -0.002315f, 0.011687f, 0.044767f, -0.029980f, -0.048033f, -0.030329f, -0.014062f, 0.006569f, 0.015962f, 0.008441f, 0.034068f, 0.016981f, -0.024087f, -0.013951f, -0.032838f, 0.028325f, + 0.017427f, 0.003090f, 0.005987f, -0.018885f, 0.001942f, -0.019978f, 0.034348f, 0.033672f, 0.002369f, -0.015793f, -0.008781f, 0.003259f, 0.031267f, 0.062406f, 0.038414f, -0.005988f, -0.013994f, 0.000789f, 0.019853f, 0.008560f, 0.018322f, 0.025240f, -0.025111f, -0.001245f, -0.048399f, -0.032674f, -0.031111f, -0.020900f, 0.012978f, 0.029618f, 0.020373f, 0.003154f, -0.005945f, -0.002860f, -0.026954f, -0.033930f, -0.008574f, -0.018064f, -0.016991f, 0.003809f, -0.003462f, -0.004407f, 0.000158f, 0.001008f, 0.007708f, -0.008703f, 0.017277f, -0.017665f, 0.007407f, -0.022463f, -0.007524f, -0.000126f, 0.004124f, -0.000757f, 0.003915f, 0.008482f, -0.006094f, 0.000916f, 0.020536f, 0.025005f, 0.030194f, 0.016489f, 0.018907f, 0.008470f, 0.003583f, 0.001312f, 0.000518f, 0.001041f, -0.005304f, -0.016422f, -0.016008f, -0.002759f, 0.012410f, -0.000120f, 0.001899f, -0.006787f, -0.004763f, 0.001804f, 0.015190f, 0.009476f, 0.018132f, 0.014574f, 0.012993f, 0.015663f, -0.035637f, -0.004174f, -0.018448f, 0.026852f, -0.029608f, 0.005760f, 0.002615f, 0.052502f, -0.032449f, -0.009494f, -0.033376f, -0.007204f, + -0.032968f, -0.027698f, -0.019992f, 0.010362f, -0.035465f, -0.025718f, -0.038567f, -0.009834f, -0.005799f, -0.011787f, -0.017428f, -0.042975f, 0.011241f, -0.030372f, 0.012284f, -0.031867f, 0.039299f, 0.006070f, 0.017613f, -0.007569f, -0.037074f, 0.019877f, 0.011496f, -0.012461f, 0.019846f, 0.027789f, -0.015017f, -0.039927f, -0.021398f, 0.053556f, -0.022884f, -0.001730f, 0.001373f, -0.009067f, 0.011762f, 0.034716f, 0.006149f, 0.014775f, -0.011184f, 0.024840f, 0.000338f, 0.019570f, 0.005949f, 0.006653f, -0.000618f, 0.002019f, 0.042439f, 0.012881f, 0.101620f, -0.062024f, 0.039590f, 0.055709f, -0.014733f, 0.001280f, 0.028710f, -0.020810f, -0.006121f, 0.046643f, 0.018452f, -0.007769f, 0.024727f, -0.010590f, -0.045188f, -0.033405f, 0.011306f, 0.001818f, -0.060371f, -0.016793f, -0.006204f, -0.031340f, 0.016066f, 0.009389f, -0.020413f, -0.016690f, -0.012347f, 0.001758f, 0.005506f, 0.012762f, -0.010642f, 0.001491f, 0.007403f, -0.003355f, -0.013472f, 0.003682f, 0.002752f, 0.004206f, 0.012481f, 0.002210f, -0.007714f, 0.000989f, 0.014461f, 0.012855f, 0.006186f, -0.014461f, -0.000401f, 0.026502f, + -0.007668f, -0.005649f, 0.014632f, -0.014471f, -0.025065f, -0.007174f, 0.001255f, -0.003312f, -0.012931f, -0.004012f, -0.000899f, -0.014213f, -0.003066f, 0.001424f, -0.004066f, -0.014764f, -0.024338f, 0.009088f, 0.025840f, 0.009294f, -0.000714f, 0.000814f, -0.005054f, -0.015526f, -0.012493f, 0.056435f, 0.063078f, 0.000804f, 0.045509f, 0.045327f, -0.002599f, 0.020369f, -0.045773f, -0.014227f, 0.040372f, 0.003790f, 0.039860f, 0.055829f, 0.045954f, -0.009307f, 0.029959f, -0.046876f, -0.073098f, -0.031299f, -0.027396f, 0.017549f, 0.000049f, 0.018780f, 0.020288f, 0.043960f, 0.033988f, 0.011836f, -0.034896f, -0.004272f, 0.034737f, 0.011170f, -0.017168f, 0.022369f, 0.047927f, -0.005438f, 0.016628f, -0.039207f, 0.018672f, -0.030959f, -0.008471f, -0.019669f, -0.040713f, 0.024875f, 0.002726f, 0.012112f, 0.048549f, -0.026346f, -0.029661f, 0.017511f, 0.050309f, -0.039651f, -0.026590f, 0.016334f, -0.012881f, 0.071137f, 0.052606f, -0.050147f, -0.019012f, -0.039657f, 0.002025f, 0.043373f, -0.020258f, -0.030232f, -0.013862f, 0.002597f, 0.010351f, -0.036179f, 0.008534f, 0.072494f, 0.005141f, -0.048600f, + -0.074209f, 0.059703f, -0.071591f, -0.060086f, -0.035226f, -0.030778f, -0.051839f, 0.013703f, 0.012985f, 0.083001f, 0.020632f, 0.036407f, -0.018526f, 0.039597f, -0.005032f, -0.017167f, 0.014831f, 0.001645f, -0.004018f, 0.040604f, 0.005006f, 0.020676f, 0.025771f, 0.013848f, 0.030935f, -0.009065f, 0.008214f, -0.006964f, -0.002730f, -0.006931f, -0.026399f, -0.019593f, -0.021836f, 0.024697f, 0.008673f, 0.021967f, 0.027267f, -0.006305f, 0.016254f, 0.035412f, 0.012621f, -0.011770f, 0.018174f, 0.021151f, 0.007134f, -0.005274f, -0.026084f, -0.023473f, 0.022903f, 0.009527f, 0.015166f, 0.030206f, 0.067419f, 0.028833f, 0.016851f, 0.012161f, 0.018932f, -0.010365f, -0.002460f, 0.033828f, -0.022129f, -0.027066f, -0.005459f, 0.012866f, -0.011797f, 0.012195f, 0.007243f, -0.065744f, -0.037990f, -0.049363f, 0.013398f, 0.027864f, 0.009946f, 0.042612f, 0.038220f, 0.053972f, 0.016874f, 0.058914f, 0.026369f, 0.038145f, -0.018402f, -0.006991f, -0.018499f, -0.044816f, -0.032242f, -0.069505f, -0.041285f, -0.013077f, -0.040562f, 0.009350f, -0.001427f, -0.000692f, 0.016846f, 0.014107f, 0.006494f, 0.034211f, + -0.008352f, -0.027638f, 0.040619f, 0.004151f, -0.053418f, -0.022674f, -0.005659f, -0.063925f, -0.048720f, -0.047034f, 0.004513f, 0.023407f, 0.006337f, -0.024243f, -0.003015f, 0.027387f, 0.016666f, 0.064553f, 0.012033f, -0.085642f, -0.028635f, -0.014378f, 0.013825f, 0.013983f, -0.009845f, -0.022308f, 0.031973f, -0.047160f, -0.008811f, -0.037688f, 0.029029f, -0.074605f, -0.046558f, -0.060720f, -0.049249f, 0.002970f, -0.027776f, -0.020823f, -0.049435f, 0.025514f, 0.088794f, -0.001636f, 0.057378f, -0.031181f, 0.014036f, -0.041480f, -0.000231f, 0.063962f, 0.015006f, -0.029187f, 0.003265f, 0.025082f, -0.042829f, -0.065432f, -0.035748f, 0.017683f, -0.051613f, 0.022894f, -0.000913f, -0.000640f, 0.032867f, 0.018053f, -0.009005f, 0.039161f, 0.037977f, 0.031484f, -0.010295f, -0.009692f, -0.006931f, 0.000416f, 0.026353f, 0.020021f, 0.013161f, 0.001590f, 0.027455f, 0.016314f, 0.003960f, 0.004596f, 0.020221f, -0.007595f, -0.007391f, 0.015304f, -0.021756f, 0.020331f, -0.018970f, -0.017241f, -0.022277f, 0.039341f, 0.023382f, 0.036668f, 0.012546f, 0.014526f, 0.002647f, 0.003636f, 0.016851f, -0.025530f, + -0.043546f, 0.004571f, 0.011414f, 0.011968f, 0.015752f, -0.002787f, -0.017288f, 0.049492f, 0.020382f, 0.049929f, -0.080855f, 0.035428f, 0.061142f, -0.005668f, 0.070384f, -0.036930f, -0.106848f, -0.055138f, -0.000547f, -0.010413f, 0.012010f, -0.038079f, 0.037187f, 0.052581f, -0.046914f, 0.041826f, -0.025625f, -0.031292f, -0.074585f, -0.030235f, -0.042795f, -0.028075f, -0.034202f, 0.034013f, 0.005184f, -0.066685f, -0.085621f, 0.065095f, 0.014802f, 0.023535f, -0.019916f, 0.005505f, -0.023078f, 0.000931f, 0.019838f, 0.030217f, 0.027226f, 0.072871f, 0.002453f, -0.051739f, 0.070492f, -0.007121f, -0.018165f, -0.032342f, 0.029814f, -0.057554f, -0.038768f, 0.033189f, -0.030001f, -0.044747f, -0.056486f, -0.049235f, -0.010490f, 0.006981f, 0.005462f, -0.014953f, 0.061117f, 0.052304f, -0.004917f, -0.029248f, -0.050931f, -0.058194f, 0.014545f, 0.012727f, -0.011434f, -0.005340f, 0.083847f, 0.006035f, -0.024354f, 0.036578f, 0.017467f, -0.054809f, 0.044007f, 0.080113f, -0.087323f, 0.141609f, 0.037807f, 0.041177f, 0.015556f, 0.041471f, -0.011135f, -0.086766f, 0.059794f, 0.005508f, -0.010759f, 0.062476f, + -0.073544f, 0.013320f, 0.013011f, 0.000016f, -0.007046f, 0.003534f, -0.005680f, -0.019909f, 0.010929f, 0.022216f, -0.018070f, -0.001880f, -0.026762f, -0.030314f, 0.039960f, -0.008385f, -0.019532f, 0.009609f, -0.010632f, -0.024020f, -0.044338f, -0.009740f, -0.015049f, 0.039311f, -0.037202f, -0.003296f, 0.045778f, -0.009219f, 0.036585f, -0.012587f, -0.031949f, 0.017111f, -0.006427f, -0.014711f, 0.018946f, 0.004964f, 0.050407f, -0.006243f, -0.000771f, 0.032864f, 0.100920f, 0.044152f, 0.002064f, -0.034200f, 0.048062f, -0.001118f, 0.003213f, -0.023532f, 0.043845f, -0.051513f, 0.037100f, 0.035593f, 0.037585f, 0.017984f, -0.014121f, 0.049844f, 0.062683f, -0.013168f, 0.025764f, -0.039344f, 0.063082f, 0.026684f, 0.020976f, -0.040708f, -0.088450f, 0.017249f, -0.027231f, -0.020500f, -0.035984f, -0.045465f, 0.027106f, 0.011900f, -0.022080f, 0.004709f, 0.001986f, -0.024184f, -0.107995f, -0.007072f, -0.023024f, -0.011408f, -0.001771f, 0.075676f, 0.051798f, -0.025698f, 0.019493f, -0.050438f, 0.005500f, 0.037131f, -0.057322f, -0.053456f, -0.043736f, 0.068455f, -0.049547f, 0.013950f, 0.055173f, -0.074859f, + -0.069286f, 0.063366f, 0.050616f, 0.053130f, 0.071396f, 0.026058f, -0.091548f, 0.020248f, 0.026959f, -0.008473f, 0.149277f, -0.015839f, -0.022826f, -0.067897f, -0.058433f, 0.029710f, -0.053862f, 0.034661f, 0.012140f, 0.039254f, 0.081751f, -0.052905f, -0.035874f, 0.099214f, -0.060747f, -0.067424f, 0.043731f, -0.086723f, 0.062712f, -0.066047f, 0.014904f, 0.022141f, -0.047568f, 0.019282f, -0.055210f, 0.037962f, 0.070344f, -0.003318f, 0.012184f, 0.014015f, 0.002589f, -0.021955f, -0.020292f, -0.005064f, 0.020391f, -0.009543f, 0.013761f, -0.014747f, -0.043642f, 0.018245f, 0.003871f, 0.029208f, 0.014729f, 0.025442f, -0.008808f, -0.009124f, -0.043241f, 0.029898f, -0.005794f, -0.040003f, 0.009301f, 0.080877f, 0.022584f, -0.021279f, 0.024018f, 0.043319f, -0.021605f, 0.004286f, 0.033728f, -0.017384f, 0.033648f, 0.010866f, -0.010345f, -0.052866f, 0.009074f, -0.020539f, -0.001061f, 0.064716f, -0.029595f, 0.002900f, 0.012835f, 0.008947f, -0.018428f, 0.021552f, 0.074087f, 0.005396f, -0.064771f, 0.090390f, 0.021328f, -0.006959f, 0.064226f, 0.031363f, 0.051809f, 0.018779f, -0.079047f, -0.018103f, + -0.030048f, 0.035926f, 0.090387f, -0.058695f, 0.013961f, -0.028649f, 0.039846f, 0.045741f, -0.062259f, 0.050430f, -0.050142f, -0.045375f, 0.021894f, 0.041341f, 0.001096f, 0.013105f, 0.032230f, -0.050734f, 0.043289f, 0.002528f, 0.052991f, -0.010444f, -0.014835f, 0.016574f, 0.078808f, -0.036600f, 0.063553f, -0.031994f, 0.012304f, 0.015863f, 0.063523f, -0.004699f, -0.004794f, 0.021148f, 0.096080f, 0.005443f, -0.076202f, -0.007073f, -0.091610f, 0.053721f, -0.000401f, 0.148256f, 0.031350f, -0.044555f, -0.013824f, 0.032043f, -0.033594f, 0.051455f, 0.096784f, 0.065717f, 0.000891f, 0.027381f, 0.041607f, -0.005755f, -0.045875f, -0.007185f, -0.010867f, -0.156708f, 0.096545f, 0.071484f, 0.066279f, 0.015162f, -0.068020f, -0.021176f, 0.050311f, 0.025361f, 0.043749f, 0.022880f, -0.149703f, -0.054333f, 0.091037f, 0.024161f, 0.029018f, 0.077843f, -0.056431f, -0.002875f, -0.008421f, 0.043618f, 0.010731f, -0.005496f, -0.012739f, 0.034130f, -0.009813f, -0.041805f, 0.019607f, -0.020751f, -0.023910f, 0.019994f, 0.030403f, -0.024038f, -0.007752f, -0.001982f, 0.023867f, -0.032463f, 0.024825f, -0.028823f, + 0.012467f, -0.048984f, -0.049495f, 0.047336f, 0.005732f, 0.003093f, -0.006184f, -0.036522f, -0.011439f, 0.031288f, 0.002931f, 0.009830f, 0.053537f, -0.009595f, -0.041624f, -0.005180f, -0.023891f, 0.017228f, 0.019704f, -0.020791f, -0.017130f, 0.020096f, 0.044271f, 0.055425f, -0.002300f, 0.058733f, -0.036234f, 0.059773f, -0.054603f, 0.009285f, 0.028586f, -0.027995f, 0.004016f, 0.011320f, -0.014948f, -0.029215f, -0.055278f, 0.084289f, -0.018900f, -0.016459f, -0.028128f, -0.004581f, -0.011652f, 0.027505f, -0.056674f, -0.016172f, -0.035503f, 0.012322f, -0.035701f, 0.034359f, -0.000334f, 0.017802f, -0.039382f, -0.071355f, 0.003256f, -0.052092f, -0.054773f, 0.024973f, -0.042059f, -0.035236f, 0.068997f, -0.025345f, -0.040606f, 0.005441f, -0.041760f, 0.019785f, 0.025921f, -0.007323f, -0.034167f, -0.009610f, 0.019577f, 0.017739f, -0.015675f, -0.001134f, 0.060732f, -0.010525f, -0.037895f, -0.047446f, -0.007151f, -0.020586f, -0.072249f, 0.067904f, 0.023048f, -0.082232f, 0.050563f, -0.003266f, -0.034977f, 0.159333f, 0.089148f, 0.073608f, 0.038479f, 0.022784f, -0.038098f, 0.006348f, 0.017091f, 0.019209f, + 0.006710f, 0.070077f, 0.015170f, -0.020131f, -0.034708f, -0.140047f, 0.028229f, 0.019014f, -0.001164f, -0.026878f, -0.053442f, -0.009894f, -0.034618f, -0.029954f, -0.002723f, 0.044992f, -0.030970f, 0.077409f, 0.010704f, -0.014686f, -0.005952f, -0.005886f, 0.005526f, 0.032974f, -0.013146f, 0.008782f, 0.022054f, 0.008520f, 0.003724f, 0.018385f, -0.029303f, 0.014663f, 0.004491f, 0.045673f, -0.016303f, -0.010461f, -0.013070f, -0.010570f, -0.036392f, -0.018634f, 0.012272f, -0.038142f, 0.028291f, -0.007059f, -0.019368f, 0.027598f, 0.016218f, 0.023361f, -0.009212f, -0.002665f, 0.002162f, 0.005175f, -0.025464f, 0.013819f, 0.000903f, -0.000244f, -0.003095f, 0.017002f, 0.008048f, -0.073295f, 0.122376f, 0.015164f, 0.039776f, 0.021460f, -0.030962f, 0.022353f, 0.034118f, 0.008132f, -0.004012f, -0.030192f, -0.005691f, 0.007890f, -0.014368f, -0.011038f, 0.004674f, 0.013306f, 0.035271f, -0.025248f, 0.014563f, 0.000967f, 0.028060f, -0.010564f, 0.005185f, 0.008913f, -0.033238f, 0.026163f, 0.003854f, 0.006113f, 0.009108f, 0.009361f, -0.021225f, 0.021658f, -0.018356f, 0.004051f, 0.020757f, -0.012035f, + 0.020345f, -0.009465f, 0.025763f, 0.019842f, 0.011382f, -0.032988f, 0.023868f, 0.017971f, 0.014359f, 0.040013f, -0.039369f, -0.003900f, -0.000777f, -0.008777f, 0.011498f, -0.020618f, -0.032679f, 0.021639f, 0.024622f, 0.012057f, -0.003493f, 0.004820f, -0.003873f, 0.012524f, -0.011717f, 0.004788f, -0.024358f, 0.021316f, -0.037596f, 0.034626f, 0.019206f, -0.012295f, -0.000910f, 0.014083f, 0.000654f, 0.012571f, -0.000119f, 0.000979f, -0.001628f, -0.013125f, 0.017654f, 0.023931f, -0.021926f, -0.005461f, 0.004144f, 0.013051f, -0.010155f, -0.010783f, 0.002493f, 0.003951f, -0.002805f, 0.001937f, -0.008273f, 0.002479f, 0.009716f, -0.008350f, 0.001808f, 0.005402f, -0.008451f, 0.006432f, 0.008486f, -0.001331f, -0.003160f, -0.004723f, 0.001401f, 0.017725f, -0.007181f, 0.001832f, -0.017248f, 0.000474f, 0.018515f, -0.013855f, 0.013715f, -0.007018f, 0.000787f, 0.030591f, -0.005730f, 0.000059f, -0.000917f, -0.010172f, 0.015878f, 0.006036f, 0.006687f, 0.006034f, -0.005324f, 0.003586f, 0.017447f, -0.005733f, 0.011821f, -0.008430f, -0.001531f, 0.023549f, -0.098236f, -0.228574f, -0.036704f, 0.133555f, + 0.121180f, 0.298747f, 0.155881f, -0.080540f, -0.024915f, -0.165594f, -0.281142f, -0.019486f, -0.127889f, -0.017873f, 0.204472f, 0.087337f, 0.157916f, 0.242707f, -0.028484f, -0.035630f, -0.123564f, -0.209759f, -0.166980f, -0.010799f, -0.062907f, -0.023783f, 0.173953f, 0.055209f, 0.113054f, 0.205911f, 0.033463f, -0.000867f, 0.021037f, -0.125286f, -0.189952f, 0.032571f, -0.196283f, -0.128226f, 0.043199f, -0.019715f, 0.031552f, 0.252241f, 0.028628f, 0.096703f, 0.205640f, -0.041025f, 0.006064f, 0.045940f, -0.198894f, -0.165567f, -0.059021f, -0.225959f, -0.087874f, 0.028826f, 0.041451f, 0.155680f, 0.218869f, 0.156312f, 0.109940f, 0.096150f, -0.036891f, -0.132327f, -0.109086f, -0.163606f, -0.172336f, -0.073648f, -0.043962f, 0.001215f, 0.143915f, 0.172230f, 0.053500f, 0.134606f, 0.038836f, -0.042509f, 0.027901f, -0.093675f, -0.130764f, -0.025413f, -0.060971f, -0.040418f, 0.073057f, -0.002616f, 0.050814f, 0.091514f, -0.025516f, -0.001888f, -0.000440f, -0.046135f, -0.014695f, -0.003049f, -0.035146f, 0.038862f, 0.013574f, -0.008857f, 0.062781f, 0.020341f, -0.009534f, 0.060956f, -0.021828f, -0.064945f, + 0.000806f, -0.099302f, -0.070133f, 0.021712f, -0.066704f, 0.014377f, 0.076208f, 0.056608f, 0.104054f, 0.114276f, 0.041012f, 0.040572f, -0.005316f, -0.093760f, -0.131948f, -0.134947f, -0.141785f, -0.089476f, -0.007318f, 0.045621f, 0.096986f, 0.169722f, 0.181201f, 0.151249f, 0.117545f, -0.006725f, -0.111652f, -0.158876f, -0.204182f, -0.207300f, -0.111363f, -0.033024f, 0.086301f, 0.184252f, 0.165885f, 0.100802f, 0.073714f, 0.022102f, -0.016128f, -0.024435f, -0.073975f, -0.084277f, -0.064334f, -0.052776f, -0.038828f, -0.007289f, 0.007141f, 0.031155f, 0.044969f, 0.047224f, 0.044306f, 0.041279f, 0.019895f, 0.001500f, -0.016027f, -0.023973f, -0.035554f, -0.034327f, -0.026423f, -0.013966f, -0.006020f, 0.006553f, 0.011273f, 0.016281f, 0.012833f, 0.011110f, 0.008848f, 0.008733f, 0.002494f, 0.002317f, 0.001898f, 0.000788f, -0.004221f, -0.001229f, -0.006334f, -0.012221f, -0.013283f, -0.012597f, -0.011935f, -0.000495f, 0.001885f, 0.006730f, 0.014221f, 0.017456f, 0.016270f, 0.014737f, 0.004964f, -0.001634f, -0.010073f, -0.015324f, -0.017356f, -0.013108f, -0.009409f, -0.003419f, 0.002670f, 0.007956f, + 0.008734f, 0.010012f, 0.007830f, 0.005363f, 0.002708f, -0.000058f, -0.003891f, -0.002906f, -0.004157f, -0.003304f, -0.002606f, -0.002612f, -0.001274f, 0.000560f, -0.002128f, -0.001271f, -0.000276f, 0.001100f, 0.002595f, 0.002581f, 0.002739f, 0.004468f, 0.002880f, 0.001534f, -0.000136f, -0.002095f, -0.003504f, -0.003484f, -0.003938f, -0.002791f, -0.001602f, -0.000358f, 0.000830f, 0.001864f, 0.001881f, 0.001989f, 0.001631f, 0.001113f, 0.000282f, -0.000081f, -0.000545f, -0.000782f, -0.000868f} + }, + { + {-0.008179f, 0.008688f, 0.002212f, -0.004646f, -0.002042f, -0.010413f, -0.002752f, 0.008817f, -0.004587f, -0.003324f, 0.002749f, -0.001310f, -0.000282f, 0.000613f, -0.002748f, -0.002187f, 0.010671f, 0.005229f, -0.001246f, 0.000583f, -0.001533f, -0.003108f, 0.001510f, 0.003862f, 0.005892f, -0.001427f, 0.002282f, 0.002766f, -0.009359f, -0.002816f, 0.000026f, -0.001798f, 0.005812f, 0.000595f, -0.001936f, 0.005263f, -0.003916f, 0.001826f, 0.008100f, -0.004397f, 0.000553f, 0.001152f, 0.006158f, -0.002284f, 0.008478f, -0.011891f, -0.004328f, 0.005280f, -0.002335f, -0.010066f, 0.000762f, 0.002112f, 0.003410f, 0.003545f, -0.001064f, -0.004293f, 0.000407f, -0.003889f, -0.002665f, 0.001257f, 0.005050f, 0.004698f, -0.006731f, 0.006024f, -0.007369f, 0.006682f, 0.000404f, 0.005869f, -0.002231f, -0.004724f, -0.002101f, 0.003971f, -0.000729f, -0.000911f, -0.001150f, 0.005471f, -0.005795f, 0.003066f, 0.001441f, 0.001526f, 0.001864f, 0.004392f, 0.001397f, -0.002706f, -0.003125f, -0.001663f, 0.002365f, -0.000437f, -0.002292f, 0.000516f, -0.002770f, -0.000542f, -0.000184f, -0.002768f, -0.001127f, -0.001526f, + 0.000383f, 0.001608f, -0.001911f, -0.001302f, 0.000801f, -0.000314f, -0.002737f, 0.000052f, 0.001501f, -0.000987f, -0.000134f, 0.000643f, -0.000251f, 0.001159f, 0.000785f, 0.000165f, -0.002070f, -0.000607f, 0.000078f, -0.000852f, 0.000057f, -0.000140f, -0.001452f, 0.000906f, -0.002461f, -0.000395f, -0.028491f, 0.009336f, -0.010365f, -0.004138f, -0.008489f, -0.008715f, 0.004933f, -0.002916f, -0.007363f, -0.003961f, 0.009981f, 0.014843f, -0.008139f, -0.003037f, -0.000736f, -0.010712f, -0.010069f, 0.000741f, -0.001031f, 0.006524f, 0.002188f, 0.004856f, -0.004304f, -0.002697f, -0.005572f, 0.001553f, 0.009573f, 0.004151f, 0.001848f, -0.006194f, 0.004672f, 0.001405f, 0.002853f, -0.004048f, 0.000340f, 0.001405f, 0.002137f, -0.005495f, -0.004028f, 0.001489f, -0.007587f, -0.007750f, 0.003302f, 0.005858f, -0.006617f, -0.003332f, -0.002563f, 0.000463f, 0.005833f, 0.004706f, 0.002022f, 0.000877f, 0.015114f, 0.005931f, -0.004800f, 0.005880f, 0.004177f, -0.004217f, 0.007129f, -0.002677f, -0.001815f, -0.000052f, -0.003139f, 0.006341f, -0.003600f, 0.001656f, 0.003807f, 0.003056f, -0.005679f, 0.002214f, + 0.001032f, 0.001131f, -0.002002f, -0.002818f, -0.001202f, 0.008862f, 0.000566f, -0.002645f, -0.001929f, 0.002080f, -0.008013f, 0.001532f, 0.004729f, -0.000324f, 0.003052f, -0.001774f, -0.002906f, 0.001915f, 0.001730f, -0.000760f, 0.002964f, 0.001526f, -0.000884f, 0.002108f, 0.002194f, 0.003702f, 0.000453f, -0.000004f, -0.000295f, -0.001137f, -0.001614f, -0.000178f, -0.000317f, -0.001008f, 0.001061f, -0.000372f, 0.003648f, 0.021610f, 0.008577f, -0.001572f, 0.000919f, 0.004904f, 0.002533f, -0.001528f, -0.009429f, 0.000241f, 0.008246f, -0.008587f, -0.001017f, -0.016061f, 0.004135f, 0.006453f, 0.000370f, -0.003873f, 0.011631f, 0.008160f, -0.007601f, 0.003580f, 0.000378f, -0.006672f, 0.010372f, 0.005691f, -0.000745f, 0.004152f, 0.009879f, -0.003147f, -0.002120f, 0.000601f, -0.000006f, 0.000174f, 0.002323f, 0.012148f, 0.002394f, 0.001758f, -0.019810f, -0.001109f, 0.000833f, 0.002294f, -0.009001f, 0.002003f, -0.007274f, -0.005598f, -0.007690f, -0.005047f, -0.000022f, 0.002227f, -0.004726f, 0.004590f, -0.011412f, -0.006583f, -0.000761f, -0.000218f, 0.003570f, -0.004614f, -0.001128f, -0.004185f, + 0.002395f, 0.006074f, -0.003785f, 0.000591f, -0.003287f, -0.000655f, 0.009454f, 0.007390f, -0.003079f, 0.006921f, -0.003421f, -0.006033f, -0.007519f, -0.000632f, -0.000764f, -0.005096f, 0.004466f, -0.000872f, 0.001222f, -0.000631f, -0.001728f, 0.000266f, -0.001144f, -0.004148f, -0.000332f, -0.006565f, 0.000659f, -0.003273f, -0.002162f, -0.005529f, 0.006249f, -0.002018f, 0.002081f, 0.004241f, 0.001636f, -0.002280f, -0.000587f, -0.002552f, -0.000257f, 0.001007f, -0.002509f, 0.002428f, -0.000283f, 0.000191f, 0.000283f, -0.000978f, 0.001396f, 0.000771f, 0.000385f, 0.000100f, 0.003495f, 0.001630f, -0.001234f, -0.002525f, -0.002303f, 0.002070f, 0.002825f, -0.000102f, 0.000658f, 0.002722f, 0.000360f, 0.034068f, -0.015020f, 0.002677f, -0.001386f, -0.006447f, 0.005299f, 0.009453f, -0.006362f, 0.010173f, -0.000703f, 0.010860f, 0.002913f, 0.003746f, -0.004875f, 0.006097f, 0.002274f, 0.006246f, -0.013594f, 0.007074f, -0.008094f, 0.002355f, -0.006819f, 0.008308f, -0.002441f, 0.008370f, -0.005135f, 0.002996f, -0.003413f, -0.000874f, -0.000512f, -0.000994f, 0.003208f, 0.017541f, 0.000646f, 0.005054f, + -0.005029f, -0.008329f, 0.000210f, 0.000023f, 0.000211f, 0.002555f, -0.005814f, 0.011459f, -0.000872f, 0.009585f, 0.000542f, -0.004339f, -0.005452f, -0.014717f, 0.007029f, 0.004615f, -0.006953f, 0.000625f, 0.005709f, 0.002970f, -0.017119f, 0.010008f, -0.000707f, 0.007075f, -0.010336f, -0.011120f, -0.005466f, -0.010835f, -0.002098f, 0.012230f, 0.002439f, -0.004875f, 0.000605f, 0.006858f, -0.002486f, -0.005752f, -0.003050f, -0.006434f, 0.004375f, -0.009684f, -0.001814f, -0.007463f, -0.002931f, -0.000172f, 0.008081f, 0.003723f, 0.000770f, 0.002426f, 0.010179f, 0.005280f, 0.001133f, 0.003632f, -0.003042f, -0.001287f, 0.000563f, 0.000051f, 0.001521f, 0.000723f, -0.001903f, 0.000870f, 0.003512f, -0.000393f, 0.000660f, 0.001217f, -0.001882f, -0.002520f, 0.002158f, -0.002989f, 0.003260f, 0.001860f, 0.003011f, -0.000067f, -0.001324f, 0.001785f, 0.002980f, 0.000670f, -0.001414f, 0.000873f, -0.000214f, 0.008858f, -0.021062f, 0.004192f, -0.006700f, -0.019248f, -0.014861f, 0.007772f, 0.008669f, 0.011447f, -0.005796f, -0.003045f, 0.007845f, 0.003714f, 0.011767f, 0.003785f, -0.001417f, 0.001138f, + 0.007475f, 0.014675f, -0.003873f, 0.004225f, -0.000278f, 0.011878f, 0.002651f, -0.000802f, -0.002497f, -0.009190f, -0.013968f, 0.000081f, -0.002096f, 0.004100f, -0.000889f, 0.003198f, 0.002325f, 0.000780f, 0.000784f, 0.002696f, -0.004842f, 0.000467f, 0.006487f, 0.010253f, -0.005158f, 0.001164f, -0.004559f, -0.005988f, 0.008411f, -0.006601f, -0.016402f, -0.006464f, -0.004287f, 0.007770f, 0.000537f, 0.008579f, 0.007778f, -0.004240f, 0.000230f, -0.006814f, -0.001061f, -0.002955f, 0.009991f, -0.012790f, -0.000493f, 0.004241f, -0.013615f, -0.015233f, 0.000107f, 0.004642f, 0.009486f, -0.006752f, -0.016191f, 0.008337f, -0.014951f, 0.017282f, 0.009659f, 0.002807f, 0.007253f, -0.000219f, -0.007272f, 0.021984f, -0.002143f, 0.010619f, -0.000547f, 0.015366f, 0.010452f, 0.005593f, -0.001713f, -0.003043f, -0.005314f, -0.001943f, 0.002183f, 0.000521f, 0.004110f, -0.004393f, 0.002503f, -0.002350f, -0.001730f, -0.001671f, -0.001935f, 0.002057f, -0.001264f, -0.000071f, -0.003422f, -0.000182f, 0.001856f, 0.003685f, -0.003895f, -0.004597f, 0.000481f, 0.001992f, -0.000195f, 0.002401f, -0.001531f, 0.000258f, + -0.001958f, -0.000604f, 0.001088f, 0.002270f, 0.002643f, 0.001661f, -0.002396f, -0.003356f, -0.046246f, 0.009721f, 0.002508f, -0.023148f, -0.029252f, -0.004572f, -0.022547f, 0.018619f, 0.005449f, -0.013533f, 0.001018f, -0.006215f, 0.002216f, -0.009191f, 0.001360f, -0.000379f, 0.000272f, 0.013169f, -0.004488f, -0.002881f, -0.005264f, -0.004635f, -0.012110f, -0.008076f, 0.012480f, -0.004932f, 0.007953f, -0.006705f, 0.003536f, 0.000360f, 0.007203f, -0.007009f, 0.005496f, -0.007042f, 0.003305f, -0.002601f, -0.004323f, 0.004607f, -0.011307f, 0.004562f, -0.005674f, -0.001948f, -0.008172f, 0.020309f, 0.009765f, 0.017826f, -0.007364f, 0.007606f, 0.006171f, -0.003356f, 0.003319f, -0.008217f, 0.009055f, 0.019532f, 0.015497f, -0.010519f, -0.002682f, 0.004693f, -0.007548f, -0.005037f, -0.013349f, -0.025162f, -0.008407f, 0.013136f, 0.004851f, -0.006094f, 0.002752f, 0.001485f, -0.006714f, -0.011872f, -0.011953f, 0.008784f, 0.001193f, -0.018455f, 0.002169f, 0.001950f, -0.000720f, -0.001238f, 0.006367f, 0.013647f, -0.001180f, 0.000138f, 0.002085f, 0.000140f, -0.003350f, -0.012151f, 0.004273f, 0.004300f, + 0.002733f, 0.005901f, 0.003684f, -0.005113f, 0.001561f, -0.003163f, 0.000892f, -0.002652f, -0.000925f, -0.002951f, 0.000287f, 0.000848f, -0.000165f, -0.002095f, -0.001973f, -0.000510f, 0.001168f, 0.000076f, 0.004734f, 0.001766f, 0.004433f, 0.004718f, 0.005160f, -0.005780f, -0.005806f, -0.002109f, 0.004758f, -0.001397f, 0.001883f, -0.001626f, 0.002726f, 0.002778f, 0.001917f, -0.002743f, -0.001413f, -0.018292f, -0.007686f, -0.004837f, 0.013626f, -0.003741f, 0.003158f, -0.014280f, -0.014884f, 0.000626f, 0.004191f, -0.008763f, -0.005052f, -0.008230f, 0.016734f, 0.003605f, -0.005726f, -0.012382f, -0.012197f, -0.011950f, -0.003376f, 0.005588f, 0.016818f, 0.005379f, 0.009473f, -0.007688f, 0.017920f, 0.010174f, 0.003244f, 0.000101f, 0.018437f, -0.010913f, 0.001701f, 0.005760f, 0.012467f, -0.020365f, -0.010366f, 0.008742f, 0.003515f, -0.002897f, 0.021081f, -0.009332f, 0.005940f, 0.012644f, 0.003930f, 0.002046f, 0.009281f, 0.003688f, 0.004609f, 0.004647f, 0.002002f, 0.005370f, -0.000326f, 0.007956f, -0.001878f, 0.019645f, -0.014360f, 0.016150f, 0.012905f, -0.011340f, 0.012783f, 0.002269f, + 0.010867f, 0.010901f, -0.024130f, -0.000732f, -0.000962f, -0.007361f, 0.003868f, -0.006650f, 0.006700f, -0.002836f, 0.015400f, -0.001772f, 0.002432f, 0.006215f, 0.004340f, 0.006012f, -0.009797f, -0.003388f, -0.010010f, -0.009386f, -0.005309f, 0.014846f, 0.002255f, -0.004851f, 0.004439f, 0.004027f, 0.001930f, -0.002610f, 0.001587f, -0.001873f, 0.005921f, 0.002144f, 0.001904f, -0.002937f, 0.001852f, -0.005696f, -0.000478f, 0.006437f, 0.003441f, -0.001144f, 0.002214f, 0.002226f, -0.001777f, 0.002666f, 0.001902f, 0.006243f, 0.003540f, -0.003605f, -0.001340f, -0.002173f, 0.001993f, -0.005709f, 0.001708f, 0.003013f, 0.001956f, -0.000917f, -0.000217f, -0.000583f, 0.024119f, -0.006457f, -0.003811f, -0.005996f, 0.017163f, 0.008973f, 0.001783f, 0.006499f, -0.011704f, 0.025681f, 0.008478f, -0.002109f, 0.009670f, 0.012362f, -0.021078f, -0.001491f, 0.004929f, 0.002377f, -0.000075f, 0.017710f, -0.008601f, -0.010892f, 0.024445f, 0.003613f, -0.001780f, -0.002526f, 0.012757f, 0.000888f, -0.001897f, -0.002497f, -0.005982f, 0.006285f, -0.003721f, 0.008413f, 0.005956f, -0.015530f, -0.014652f, 0.001730f, + 0.028878f, -0.000448f, 0.005873f, -0.017939f, 0.008778f, 0.011763f, -0.007403f, 0.008691f, 0.010900f, -0.018194f, -0.011059f, -0.002387f, -0.023181f, -0.012411f, -0.013842f, 0.003945f, -0.004755f, -0.005261f, -0.002558f, 0.016163f, -0.022347f, 0.009739f, 0.004843f, -0.007377f, 0.013627f, -0.008863f, 0.001303f, -0.018897f, -0.000399f, 0.011203f, 0.010188f, 0.021209f, -0.025236f, -0.006418f, -0.028015f, -0.006163f, -0.000571f, -0.006820f, 0.003140f, -0.001528f, 0.025485f, 0.019625f, 0.011200f, -0.012850f, 0.000651f, 0.004719f, 0.012423f, 0.015119f, -0.000349f, -0.000109f, -0.002175f, 0.000145f, 0.008696f, -0.000606f, -0.000749f, -0.000538f, 0.000160f, 0.000247f, 0.001062f, 0.003336f, -0.003583f, -0.001327f, 0.003644f, 0.000406f, 0.003369f, -0.000323f, 0.000384f, -0.003139f, 0.004625f, 0.002633f, 0.000074f, 0.004119f, -0.002182f, -0.000498f, 0.004067f, 0.000861f, -0.000672f, -0.005250f, -0.000314f, 0.000899f, 0.000758f, -0.002028f, 0.005218f, 0.008456f, -0.001553f, -0.000487f, -0.003882f, 0.002626f, 0.016334f, -0.018678f, 0.000448f, -0.011511f, 0.031537f, -0.013564f, -0.007854f, 0.027310f, + 0.020559f, 0.003673f, -0.038475f, -0.009510f, 0.017477f, 0.001263f, -0.001992f, -0.005623f, -0.003169f, -0.003155f, 0.002529f, 0.005768f, 0.005266f, 0.004982f, 0.033806f, -0.007253f, -0.005073f, -0.000140f, 0.004288f, -0.010289f, 0.005823f, 0.003437f, -0.001412f, -0.011308f, -0.007146f, 0.012095f, 0.012987f, 0.024690f, 0.006212f, -0.010399f, 0.006139f, -0.000488f, 0.006225f, 0.000295f, 0.013652f, -0.011661f, -0.017286f, -0.017840f, 0.011431f, -0.005208f, 0.002279f, 0.004433f, -0.006456f, -0.001343f, 0.029366f, 0.009904f, -0.025027f, 0.017530f, 0.005519f, 0.029702f, -0.015673f, -0.014821f, 0.008510f, 0.015907f, 0.010980f, 0.006017f, -0.002880f, 0.000759f, 0.007558f, -0.009916f, -0.002923f, 0.000137f, 0.012560f, -0.009381f, 0.025361f, -0.001107f, -0.000473f, -0.013365f, -0.014978f, 0.028952f, 0.008543f, -0.024107f, -0.005716f, 0.019896f, 0.013814f, 0.002584f, 0.004929f, -0.012370f, 0.003697f, 0.003048f, 0.003805f, 0.002031f, 0.004238f, -0.005794f, -0.006915f, 0.000715f, -0.000317f, -0.005806f, -0.001970f, 0.005027f, 0.005020f, -0.007699f, 0.001881f, -0.000195f, 0.003172f, 0.004310f, + -0.001352f, -0.001502f, -0.001948f, 0.002850f, 0.008866f, -0.006670f, 0.004843f, -0.000601f, 0.000125f, -0.003984f, -0.000980f, -0.003011f, -0.002007f, 0.004115f, -0.001575f, -0.002676f, -0.005909f, -0.000379f, -0.003383f, -0.022633f, -0.019190f, -0.007409f, 0.007143f, 0.007330f, 0.035175f, 0.034149f, -0.003867f, 0.002841f, 0.001604f, 0.000348f, -0.000290f, -0.006953f, -0.022764f, -0.017446f, -0.008961f, 0.008181f, -0.006281f, -0.019801f, -0.005541f, 0.003865f, -0.001383f, -0.030403f, -0.008871f, 0.006836f, -0.003028f, 0.002972f, 0.002195f, 0.009248f, 0.013512f, 0.002257f, -0.009640f, 0.009981f, 0.010400f, 0.007334f, -0.000317f, 0.013444f, -0.026650f, 0.009044f, -0.023603f, 0.029611f, -0.020866f, 0.008152f, -0.022145f, -0.003603f, -0.024752f, -0.013044f, -0.015394f, -0.016667f, 0.011573f, -0.014646f, -0.002760f, 0.005268f, -0.000103f, -0.007767f, -0.005573f, -0.002491f, -0.024212f, 0.000885f, 0.001672f, 0.012140f, -0.037845f, 0.000984f, -0.000905f, 0.017781f, 0.021346f, -0.014351f, -0.008792f, 0.000895f, 0.016416f, -0.031270f, 0.020171f, -0.014011f, -0.009254f, 0.001624f, -0.030445f, -0.001488f, + -0.002400f, -0.004686f, -0.005390f, -0.003725f, 0.030667f, 0.012569f, 0.006351f, -0.007243f, -0.006815f, -0.007583f, 0.001017f, 0.007596f, -0.012201f, -0.000251f, -0.002079f, -0.003216f, 0.001690f, 0.009125f, -0.003318f, -0.005714f, 0.005773f, 0.003593f, -0.000073f, 0.006434f, 0.003484f, 0.005405f, -0.003191f, -0.004033f, 0.007746f, -0.005481f, 0.002028f, -0.007211f, -0.001350f, 0.000410f, -0.001437f, -0.002684f, -0.006398f, -0.007005f, -0.007473f, 0.001903f, -0.000366f, -0.001556f, -0.005376f, -0.005043f, -0.002051f, -0.002620f, 0.001738f, 0.007735f, -0.001994f, 0.005941f, -0.017754f, -0.046699f, -0.018493f, -0.008681f, 0.008446f, 0.012937f, -0.015143f, -0.005581f, -0.019115f, -0.016853f, 0.009281f, -0.014780f, 0.015741f, 0.006541f, 0.011381f, -0.001623f, -0.014982f, 0.026860f, 0.010841f, 0.015136f, -0.018788f, 0.008288f, 0.003731f, -0.027546f, 0.017409f, 0.010474f, 0.001269f, -0.018702f, -0.007025f, 0.009500f, 0.010135f, -0.000282f, 0.003657f, 0.013621f, -0.012937f, -0.009586f, 0.016098f, -0.031456f, -0.030929f, -0.040820f, -0.008962f, 0.013295f, -0.035723f, -0.029884f, -0.017974f, 0.000711f, + 0.013165f, 0.004230f, 0.003876f, 0.000720f, -0.010176f, -0.014254f, -0.033724f, 0.018005f, 0.005284f, 0.041235f, -0.009617f, 0.001156f, -0.025255f, -0.030403f, 0.004098f, 0.019745f, 0.001582f, -0.019169f, 0.012916f, 0.005195f, 0.028286f, 0.002801f, 0.003758f, -0.013541f, -0.002350f, 0.011931f, -0.027296f, -0.051392f, -0.014106f, -0.012818f, 0.003006f, 0.013537f, -0.024393f, -0.012451f, 0.008271f, -0.008592f, -0.001759f, 0.008053f, -0.004520f, -0.004127f, 0.010828f, 0.002613f, -0.000709f, 0.005220f, 0.008469f, 0.009182f, 0.002002f, -0.006160f, -0.016103f, -0.001500f, -0.009728f, 0.002702f, 0.002062f, 0.002085f, 0.007031f, -0.005867f, 0.006415f, 0.008418f, 0.005894f, 0.004759f, 0.004984f, -0.012131f, -0.010840f, -0.004217f, -0.009300f, 0.001051f, 0.002991f, 0.003199f, 0.011625f, -0.002687f, 0.007488f, 0.004417f, -0.004511f, -0.002497f, -0.006688f, -0.009424f, -0.002286f, -0.012414f, -0.003752f, -0.002819f, -0.043962f, -0.033782f, -0.015550f, 0.023214f, -0.002036f, 0.039749f, 0.007837f, -0.003426f, -0.022324f, 0.007957f, 0.040921f, -0.042840f, -0.038614f, -0.012727f, -0.006446f, -0.026856f, + 0.025433f, 0.007485f, 0.013761f, 0.016511f, -0.026967f, -0.003180f, 0.010760f, -0.016939f, 0.031715f, 0.000491f, 0.007094f, -0.009222f, 0.007787f, -0.020966f, -0.012031f, -0.007191f, 0.011886f, 0.005696f, 0.019248f, -0.031627f, 0.002770f, -0.000221f, -0.023652f, 0.025772f, -0.015465f, -0.037635f, 0.007370f, 0.013591f, 0.002664f, -0.011227f, -0.002814f, -0.015663f, 0.002507f, 0.012851f, 0.005372f, -0.025720f, 0.009996f, -0.005847f, -0.028682f, -0.016880f, -0.035221f, 0.000801f, -0.005567f, -0.000916f, 0.004458f, 0.021569f, 0.026682f, 0.022299f, -0.011503f, -0.019417f, 0.006318f, -0.004930f, -0.003384f, -0.015007f, 0.027758f, 0.023046f, -0.005062f, 0.042815f, -0.027419f, 0.014284f, 0.026873f, 0.029071f, 0.000664f, 0.018486f, -0.012082f, -0.004706f, -0.024085f, -0.010129f, 0.014202f, -0.004867f, -0.018793f, 0.011652f, -0.010826f, 0.012243f, -0.005594f, -0.012726f, 0.006517f, -0.002511f, -0.007428f, -0.005538f, 0.004744f, -0.006180f, 0.004119f, 0.008648f, -0.009210f, 0.011724f, -0.001579f, -0.006338f, 0.004216f, 0.001436f, 0.000609f, -0.005260f, 0.006691f, -0.010367f, 0.003403f, 0.003952f, + 0.000290f, -0.006906f, -0.000877f, -0.004081f, 0.005142f, 0.009723f, 0.020818f, 0.010682f, 0.016598f, -0.000797f, -0.000304f, 0.008668f, -0.010839f, 0.002941f, -0.014657f, -0.005827f, 0.003040f, -0.000145f, 0.016073f, -0.038074f, 0.004843f, 0.000463f, -0.024067f, 0.003526f, -0.053561f, -0.046323f, -0.011076f, -0.000390f, 0.002015f, -0.001150f, -0.019032f, -0.000650f, -0.005431f, 0.017155f, 0.003360f, -0.001062f, 0.003233f, -0.040459f, 0.014010f, 0.007572f, 0.022483f, 0.009344f, 0.009747f, 0.026415f, 0.013161f, 0.003843f, 0.066049f, 0.014149f, 0.025420f, 0.035064f, 0.001651f, 0.024737f, 0.006205f, -0.013699f, 0.016058f, 0.001162f, 0.007737f, -0.013416f, 0.001014f, -0.008695f, 0.005612f, -0.008667f, 0.018586f, 0.002265f, -0.011547f, -0.014416f, 0.001999f, -0.039156f, 0.022787f, 0.015396f, -0.001987f, -0.003520f, 0.008962f, -0.010387f, -0.008633f, -0.012826f, -0.015510f, 0.012984f, -0.012371f, 0.021436f, 0.024919f, 0.024442f, 0.025974f, -0.005994f, -0.039335f, 0.000662f, 0.016618f, 0.039717f, -0.009196f, -0.001426f, 0.018810f, 0.027751f, 0.040844f, -0.005257f, 0.018000f, -0.012046f, + -0.006993f, -0.032769f, -0.025576f, -0.011143f, -0.011601f, -0.009330f, 0.006862f, 0.001465f, -0.014059f, 0.015981f, 0.010069f, 0.012569f, 0.022469f, 0.009033f, 0.008431f, -0.002631f, 0.000042f, -0.003274f, -0.006412f, 0.000241f, 0.004068f, 0.000071f, 0.011867f, 0.009522f, 0.005811f, -0.000623f, -0.009700f, 0.000619f, -0.006960f, -0.007678f, 0.004966f, 0.006066f, 0.001824f, -0.012053f, -0.002705f, -0.017554f, -0.004266f, 0.005808f, 0.008746f, -0.005584f, 0.007276f, -0.010008f, -0.011684f, -0.005864f, -0.007035f, 0.006574f, 0.003412f, -0.010241f, -0.007057f, 0.008074f, 0.031643f, 0.041274f, -0.031886f, -0.033337f, -0.043821f, 0.038254f, -0.004713f, -0.016321f, 0.012890f, 0.012458f, 0.035788f, 0.029736f, 0.001407f, 0.032664f, 0.046672f, 0.012900f, -0.024582f, 0.022110f, -0.022787f, -0.012965f, -0.005121f, -0.016066f, -0.019204f, 0.009218f, -0.009934f, -0.009755f, -0.023060f, 0.050912f, 0.005949f, -0.027807f, -0.000477f, -0.004159f, 0.022547f, 0.023883f, 0.009140f, -0.016449f, 0.024086f, -0.007098f, 0.014697f, -0.047430f, 0.002020f, 0.019112f, -0.020608f, 0.006333f, -0.022355f, -0.018287f, + 0.048089f, 0.019739f, 0.014202f, -0.003806f, -0.043427f, -0.010861f, 0.012013f, 0.008851f, 0.006526f, -0.010608f, 0.033779f, -0.024463f, 0.018579f, -0.011715f, 0.012145f, 0.013442f, 0.026674f, 0.036208f, -0.042965f, -0.001530f, 0.021439f, 0.010205f, 0.030308f, 0.029381f, -0.042847f, -0.000306f, -0.012172f, -0.022409f, -0.001814f, -0.023418f, 0.009024f, 0.017177f, -0.009009f, 0.031467f, -0.007623f, -0.019501f, -0.023582f, 0.019418f, 0.022352f, 0.022244f, -0.006691f, 0.003502f, -0.001774f, -0.033386f, -0.032327f, -0.030351f, 0.018040f, 0.008842f, 0.005436f, 0.014400f, -0.001474f, -0.008805f, 0.021999f, 0.002604f, -0.000643f, 0.013282f, 0.021287f, 0.012689f, 0.001137f, 0.001883f, -0.006973f, 0.012732f, 0.006081f, 0.027355f, -0.003155f, 0.002848f, 0.019050f, 0.015357f, 0.004911f, -0.003316f, 0.011970f, -0.000948f, -0.003165f, 0.021464f, -0.018222f, 0.000382f, 0.013009f, 0.000511f, -0.004675f, -0.007208f, -0.003972f, -0.000625f, 0.014070f, 0.002180f, 0.000435f, 0.015586f, 0.011167f, -0.011028f, 0.016780f, -0.001383f, 0.032549f, 0.064858f, 0.002771f, -0.031026f, 0.008760f, -0.020763f, + 0.013429f, -0.018055f, -0.019410f, 0.058862f, -0.044694f, 0.073911f, 0.045326f, -0.010952f, 0.014950f, 0.035697f, 0.005235f, -0.055788f, 0.021962f, -0.045186f, 0.010823f, 0.003995f, -0.022224f, 0.000929f, -0.002953f, 0.032230f, -0.016045f, -0.001644f, -0.001144f, -0.009843f, 0.068255f, -0.003942f, -0.010134f, 0.008756f, 0.023066f, -0.023254f, -0.048926f, 0.038675f, -0.006072f, -0.002987f, 0.044243f, -0.025973f, -0.007049f, -0.030919f, 0.008396f, -0.021618f, 0.025055f, 0.022951f, 0.047094f, -0.013489f, 0.013271f, 0.031338f, -0.044363f, 0.005427f, -0.028209f, -0.044829f, -0.057102f, -0.030157f, -0.061751f, -0.069667f, -0.009576f, 0.004474f, -0.032600f, -0.035298f, 0.022014f, -0.002509f, -0.019603f, -0.038054f, 0.027611f, -0.020348f, 0.007325f, 0.034447f, -0.064820f, -0.018804f, -0.011756f, 0.028811f, 0.077943f, -0.036836f, 0.002460f, -0.023401f, -0.034301f, 0.016683f, -0.041085f, 0.033216f, 0.058157f, -0.016581f, -0.026863f, -0.028752f, -0.007031f, -0.006918f, 0.000773f, 0.018748f, 0.014048f, -0.015323f, 0.015572f, -0.001984f, 0.012300f, 0.000635f, -0.013834f, -0.004069f, 0.017212f, -0.028243f, + 0.013468f, -0.014833f, 0.004120f, -0.012092f, -0.004387f, -0.017037f, 0.004102f, -0.016380f, -0.025101f, -0.012270f, 0.006239f, -0.018889f, 0.000201f, 0.005597f, 0.028035f, -0.016137f, -0.009131f, 0.009054f, 0.011699f, -0.020152f, -0.012269f, 0.005625f, -0.005201f, -0.010785f, 0.019650f, 0.003317f, -0.014913f, 0.013465f, 0.004098f, -0.023523f, 0.004108f, -0.018883f, 0.020963f, -0.009331f, -0.030075f, -0.044512f, -0.033763f, 0.037531f, -0.030571f, 0.015214f, 0.035713f, 0.015324f, 0.022958f, -0.042428f, 0.061214f, 0.038562f, 0.033414f, -0.024503f, 0.043886f, -0.004708f, 0.029042f, 0.019144f, 0.006503f, 0.015903f, 0.021332f, 0.013062f, -0.007090f, -0.010797f, -0.009703f, 0.004524f, -0.029404f, -0.034632f, 0.019601f, 0.008745f, 0.011399f, -0.028462f, 0.007839f, 0.008817f, 0.021452f, 0.032020f, 0.048037f, -0.026986f, 0.007310f, 0.068395f, 0.014771f, 0.007449f, 0.006645f, -0.013944f, 0.005055f, 0.068113f, 0.019765f, 0.044168f, 0.012593f, -0.046981f, -0.019588f, -0.034173f, 0.098747f, 0.040248f, -0.038119f, -0.023754f, -0.033997f, 0.005901f, -0.022300f, -0.053486f, 0.012345f, -0.040467f, + 0.060468f, -0.004086f, -0.050015f, 0.066034f, 0.053427f, 0.007790f, -0.014504f, 0.009184f, -0.030439f, 0.040752f, 0.072508f, -0.019212f, 0.034394f, 0.081253f, -0.012751f, -0.012995f, -0.009225f, 0.049557f, -0.003579f, -0.027037f, -0.025580f, -0.025805f, -0.000432f, -0.002987f, -0.022669f, 0.002034f, -0.009503f, 0.025108f, 0.006206f, -0.023679f, -0.015065f, -0.026998f, -0.002951f, 0.003963f, -0.004424f, -0.018828f, -0.021263f, -0.014873f, 0.013346f, 0.022704f, 0.003522f, -0.023108f, -0.003386f, 0.029996f, 0.000246f, 0.027520f, 0.014338f, -0.014983f, -0.001350f, -0.023407f, 0.023298f, 0.010712f, -0.030520f, -0.057180f, 0.005306f, -0.003395f, -0.017404f, 0.019221f, -0.000122f, -0.009693f, -0.008158f, 0.006245f, 0.001595f, -0.001917f, 0.016979f, -0.046512f, 0.018833f, -0.006143f, 0.046648f, -0.096758f, -0.066318f, 0.038670f, 0.018621f, 0.014175f, 0.032846f, -0.032823f, -0.042915f, -0.023476f, -0.035307f, 0.020378f, -0.037904f, 0.011420f, 0.025556f, 0.041899f, 0.001608f, 0.035166f, 0.020528f, 0.006036f, -0.010904f, -0.036165f, -0.025524f, 0.021564f, -0.044395f, 0.023017f, 0.005451f, 0.038308f, + 0.029187f, -0.013894f, -0.055320f, -0.035774f, -0.003166f, -0.002453f, -0.014496f, 0.038324f, -0.066929f, -0.004877f, 0.002519f, -0.069949f, -0.001189f, -0.008326f, -0.005444f, 0.007854f, 0.041307f, -0.039760f, -0.110311f, 0.041572f, 0.045166f, 0.027172f, 0.086308f, -0.070597f, -0.008968f, 0.048208f, 0.036752f, -0.044181f, -0.020561f, -0.011940f, 0.067992f, 0.013703f, 0.064899f, -0.093375f, 0.013783f, -0.111454f, -0.066856f, -0.064467f, 0.076945f, 0.024695f, -0.049480f, 0.045462f, 0.005359f, -0.043138f, 0.044307f, -0.064703f, -0.068206f, 0.010552f, -0.070846f, 0.021389f, -0.121072f, 0.018843f, 0.038277f, -0.051251f, 0.056777f, -0.025382f, -0.013641f, 0.038281f, -0.013063f, -0.010082f, -0.027002f, -0.001635f, 0.008948f, 0.021265f, -0.002488f, 0.019785f, 0.038206f, -0.028417f, -0.003152f, -0.022529f, 0.013587f, -0.014605f, -0.003992f, 0.008660f, 0.004673f, 0.005440f, -0.005073f, 0.039675f, -0.013102f, 0.003497f, 0.016789f, -0.034432f, -0.030628f, -0.033428f, -0.015781f, -0.056511f, -0.026168f, -0.020476f, 0.048856f, 0.009984f, 0.043463f, 0.019052f, 0.008694f, 0.020083f, 0.013686f, 0.002062f, + 0.016363f, 0.003785f, 0.033993f, 0.083726f, 0.030940f, -0.030055f, -0.019657f, 0.011519f, -0.021348f, -0.025003f, -0.003043f, 0.038948f, -0.006845f, 0.007255f, -0.041524f, -0.008598f, 0.057165f, -0.041797f, 0.031582f, 0.074748f, 0.037297f, -0.003189f, -0.014361f, -0.024594f, -0.047909f, -0.035164f, 0.041101f, -0.023474f, 0.038558f, 0.027868f, 0.013163f, 0.001832f, 0.014985f, -0.011911f, -0.060920f, -0.021079f, 0.043394f, 0.034499f, 0.036046f, -0.038449f, 0.066278f, -0.017066f, 0.025700f, -0.049047f, 0.044834f, 0.077403f, -0.015687f, -0.027522f, -0.002975f, 0.002877f, -0.017324f, 0.016947f, 0.033717f, -0.063437f, 0.041546f, 0.040466f, -0.010022f, 0.046906f, 0.024714f, 0.020270f, -0.029850f, 0.006189f, 0.041791f, -0.088469f, -0.078967f, -0.032786f, 0.020756f, -0.040696f, -0.119963f, 0.050272f, 0.032747f, -0.015486f, -0.020471f, 0.000972f, -0.007171f, -0.040985f, -0.110214f, -0.006596f, 0.078022f, 0.019040f, -0.014050f, -0.009283f, 0.016739f, 0.064082f, 0.050837f, -0.075072f, -0.031152f, 0.050207f, -0.010766f, -0.020080f, -0.086057f, -0.004941f, 0.046976f, 0.015729f, -0.013383f, 0.029126f, + -0.010958f, 0.003146f, -0.032517f, -0.005237f, 0.019530f, 0.029635f, -0.016954f, -0.006001f, 0.005924f, 0.017175f, -0.010744f, 0.010607f, 0.001247f, -0.020912f, 0.012460f, 0.036032f, 0.006029f, 0.010823f, 0.006564f, 0.016322f, -0.017078f, -0.029593f, 0.002744f, 0.032209f, -0.026452f, 0.011634f, -0.009031f, 0.002986f, -0.025656f, -0.049047f, -0.026874f, 0.018425f, 0.059705f, -0.005993f, 0.028142f, -0.039500f, -0.017527f, -0.026664f, 0.016460f, 0.011762f, 0.018789f, -0.013384f, -0.020579f, -0.001314f, 0.004238f, 0.004737f, -0.009296f, -0.002038f, 0.040748f, 0.054012f, 0.001203f, -0.060901f, 0.080646f, -0.022658f, -0.056303f, 0.050448f, -0.008104f, -0.030632f, 0.038989f, 0.010435f, -0.008164f, 0.032890f, -0.045099f, 0.042770f, -0.015286f, 0.001436f, -0.013116f, -0.011204f, -0.062872f, 0.024894f, -0.024002f, 0.009903f, -0.025207f, -0.002080f, -0.018793f, 0.018002f, -0.011011f, 0.067945f, 0.012004f, 0.044450f, -0.017298f, 0.011115f, 0.028096f, -0.011933f, 0.019417f, -0.003852f, 0.033936f, -0.001706f, -0.011410f, 0.053657f, -0.047950f, 0.026751f, 0.036666f, -0.021525f, 0.041500f, -0.025410f, + -0.001041f, 0.021353f, -0.016247f, 0.048788f, 0.043680f, 0.009083f, 0.072694f, -0.044806f, -0.102662f, -0.017279f, -0.063480f, -0.041997f, 0.149912f, -0.003820f, 0.045988f, -0.006999f, -0.063280f, -0.001630f, 0.062978f, 0.089197f, 0.054225f, 0.089851f, -0.048343f, -0.014460f, -0.021667f, -0.051302f, 0.034011f, -0.014405f, -0.031674f, -0.003308f, -0.062271f, -0.113803f, 0.028638f, 0.040064f, -0.033690f, 0.022682f, -0.007094f, -0.033950f, 0.036230f, 0.026688f, -0.013272f, 0.037332f, -0.013726f, -0.033333f, 0.017118f, -0.016552f, 0.044263f, 0.004164f, 0.003304f, 0.025008f, 0.008338f, -0.028204f, -0.011832f, 0.014515f, -0.009292f, 0.027556f, -0.038441f, 0.024803f, -0.040304f, -0.010268f, 0.010048f, -0.028608f, 0.018256f, 0.001148f, -0.042937f, -0.006960f, 0.002770f, -0.011534f, -0.000106f, -0.008029f, -0.031501f, 0.012894f, 0.009451f, -0.005021f, 0.031635f, 0.048484f, -0.026427f, -0.037831f, -0.002415f, -0.018051f, 0.052468f, 0.053864f, -0.031746f, -0.020130f, -0.006607f, -0.026716f, 0.000565f, 0.009459f, 0.045293f, -0.048590f, 0.057422f, -0.035329f, 0.007552f, -0.000534f, 0.005593f, -0.044867f, + -0.007281f, -0.040624f, -0.033664f, -0.000307f, -0.013513f, -0.030755f, -0.012498f, 0.021812f, -0.026293f, 0.020066f, -0.012629f, 0.061752f, -0.029192f, 0.018142f, 0.003385f, -0.015894f, -0.050314f, -0.018752f, 0.037654f, 0.006434f, -0.012824f, 0.049419f, -0.037266f, -0.037688f, -0.005453f, 0.047166f, -0.043674f, -0.006504f, 0.008124f, 0.012469f, -0.048594f, 0.014061f, 0.016381f, -0.017699f, -0.050795f, 0.000446f, -0.039525f, 0.016129f, 0.008541f, 0.014556f, -0.077443f, -0.033416f, 0.043601f, 0.118113f, -0.054051f, -0.007890f, 0.009193f, -0.020493f, -0.033846f, -0.001138f, 0.098708f, 0.022350f, -0.010453f, -0.009187f, -0.026541f, -0.006568f, -0.020406f, 0.037944f, 0.001666f, -0.025018f, -0.026694f, 0.000893f, 0.017425f, -0.039991f, 0.030504f, 0.008653f, 0.033288f, 0.000853f, 0.042433f, 0.017481f, -0.030141f, 0.039669f, 0.038003f, 0.094360f, 0.029880f, 0.006870f, 0.009475f, -0.035131f, 0.011286f, 0.030538f, 0.031784f, 0.010589f, -0.002510f, 0.000744f, -0.004127f, 0.011481f, 0.013099f, -0.003623f, 0.017004f, -0.004927f, -0.002017f, 0.032287f, 0.013681f, 0.005157f, -0.010039f, 0.009228f, + 0.024575f, 0.025633f, 0.029772f, 0.010417f, 0.010793f, -0.017285f, -0.000341f, -0.001448f, 0.005285f, 0.016487f, -0.000903f, -0.013901f, 0.015193f, -0.014545f, 0.012612f, -0.001086f, 0.014923f, 0.001802f, -0.012597f, -0.003906f, 0.000832f, 0.003004f, 0.007344f, -0.002258f, 0.005215f, 0.003624f, -0.000366f, -0.075507f, 0.099918f, 0.013667f, 0.022624f, 0.023863f, -0.023275f, -0.026794f, 0.000794f, -0.010416f, 0.014065f, 0.032819f, -0.046469f, 0.015181f, -0.009938f, 0.011894f, 0.011090f, 0.007701f, 0.026206f, 0.020510f, -0.019925f, 0.018428f, 0.015951f, -0.016151f, -0.027837f, 0.008320f, -0.010005f, -0.023060f, 0.013538f, 0.011152f, -0.002141f, -0.015116f, 0.000220f, -0.011051f, -0.005520f, 0.000940f, 0.005750f, 0.010416f, -0.020893f, -0.003189f, 0.016341f, -0.007506f, 0.014640f, 0.002732f, 0.010498f, 0.021628f, 0.006202f, -0.022308f, 0.002092f, 0.020636f, -0.012011f, -0.001193f, 0.009814f, -0.035395f, -0.002387f, -0.008831f, -0.033142f, 0.045390f, -0.011822f, -0.002002f, 0.026746f, 0.004531f, -0.020560f, 0.007915f, -0.019666f, -0.004013f, 0.014755f, -0.018283f, -0.006846f, 0.033543f, + -0.035992f, 0.003729f, 0.002936f, 0.012138f, -0.016154f, 0.010737f, -0.005733f, 0.010004f, -0.013906f, 0.000556f, -0.003585f, 0.033807f, -0.015759f, -0.001601f, 0.008536f, -0.017191f, -0.001953f, 0.023388f, -0.005261f, 0.015055f, -0.010636f, -0.009784f, 0.001434f, 0.009029f, -0.009259f, 0.017244f, -0.000445f, -0.003849f, -0.004093f, -0.005524f, -0.005779f, 0.014707f, -0.012913f, 0.014398f, 0.007566f, -0.019052f, 0.004230f, -0.001976f, -0.001968f, 0.011151f, -0.016175f, -0.006402f, 0.001959f, -0.010587f, 0.010618f, -0.010886f, -0.001957f, 0.017864f, 0.002850f, -0.003385f, 0.007782f, -0.009024f, -0.007535f, -0.004393f, 0.008313f, 0.014903f, -0.004998f, -0.004325f, 0.001235f, -0.012890f, 0.023407f, -0.099192f, -0.201738f, -0.026057f, 0.126480f, 0.097224f, 0.279321f, 0.134339f, -0.065228f, -0.057007f, -0.132565f, -0.232114f, -0.029420f, -0.090047f, -0.028001f, 0.163723f, 0.104348f, 0.111381f, 0.213140f, -0.007567f, -0.047278f, -0.080522f, -0.210946f, -0.116495f, -0.037526f, -0.039278f, 0.005795f, 0.095897f, 0.074273f, 0.078819f, 0.148753f, 0.086984f, -0.054783f, 0.079243f, -0.083425f, -0.194590f, + 0.024825f, -0.130630f, -0.181672f, 0.070738f, -0.015654f, -0.033750f, 0.223255f, 0.073057f, 0.059309f, 0.192379f, -0.020714f, -0.037961f, 0.058533f, -0.129091f, -0.160325f, -0.043208f, -0.137288f, -0.122756f, 0.025949f, 0.026485f, 0.055407f, 0.167830f, 0.148686f, 0.089996f, 0.106634f, 0.020532f, -0.084180f, -0.090712f, -0.112195f, -0.154250f, -0.072021f, -0.039230f, -0.052422f, 0.046484f, 0.148497f, 0.096867f, 0.095739f, 0.078634f, -0.055554f, -0.000712f, 0.015632f, -0.127326f, -0.052485f, -0.031994f, -0.037284f, 0.058242f, 0.029820f, -0.007426f, 0.047671f, -0.011182f, -0.009967f, 0.008047f, -0.034359f, -0.025994f, 0.016908f, -0.021377f, 0.034544f, 0.043378f, -0.016247f, 0.023471f, 0.044292f, -0.025959f, 0.029003f, 0.014413f, -0.086625f, 0.015218f, -0.028142f, -0.094132f, 0.001426f, -0.053804f, -0.048080f, 0.068282f, 0.073998f, 0.071370f, 0.132439f, 0.042129f, 0.042140f, 0.044825f, -0.057982f, -0.115758f, -0.129160f, -0.165421f, -0.123189f, -0.037237f, 0.021551f, 0.100178f, 0.166144f, 0.184020f, 0.143771f, 0.104710f, 0.020689f, -0.097559f, -0.146832f, -0.179351f, -0.166598f, -0.086420f, + -0.005499f, 0.046962f, 0.119345f, 0.110106f, 0.060161f, 0.060414f, 0.023516f, -0.001699f, -0.000347f, -0.018642f, -0.036494f, -0.030270f, -0.037845f, -0.045867f, -0.033640f, -0.024959f, -0.006438f, 0.012844f, 0.031098f, 0.037445f, 0.040544f, 0.035028f, 0.024657f, 0.012553f, -0.000066f, -0.020320f, -0.033856f, -0.031004f, -0.021706f, -0.015118f, -0.011828f, -0.003166f, 0.004313f, 0.014832f, 0.017327f, 0.011533f, 0.010932f, 0.009496f, 0.003914f, 0.005426f, 0.004862f, -0.005781f, -0.007533f, -0.003689f, -0.007172f, -0.006488f, -0.009633f, -0.013004f, -0.006275f, 0.000556f, 0.001292f, 0.006738f, 0.010489f, 0.010657f, 0.012987f, 0.009702f, 0.003548f, -0.001337f, -0.006569f, -0.009259f, -0.009139f, -0.008370f, -0.007669f, -0.003814f, 0.001566f, 0.004153f, 0.003927f, 0.003760f, 0.003350f, 0.003325f, 0.003011f, 0.001067f, 0.000237f, 0.000815f, 0.000590f, 0.000306f, -0.000314f, -0.001851f, -0.002497f, -0.004072f, -0.005493f, -0.004383f, -0.002301f, 0.000386f, 0.002765f, 0.004003f, 0.005075f, 0.005279f, 0.003527f, 0.002153f, 0.001084f, -0.002080f, -0.003428f, -0.003195f, -0.003263f, -0.002818f, + -0.001793f, -0.001461f, -0.000116f, 0.000923f, 0.001244f, 0.001607f, 0.001700f, 0.001091f, 0.000561f, 0.000080f, -0.000439f, -0.000702f}, + {-0.001955f, 0.005019f, 0.008681f, -0.006470f, -0.005597f, -0.008659f, 0.007860f, 0.003921f, 0.000693f, 0.011622f, -0.001153f, -0.000137f, -0.003544f, -0.002866f, 0.002529f, -0.003098f, -0.006044f, 0.003414f, 0.000991f, 0.009708f, 0.013264f, -0.003443f, -0.007791f, -0.009600f, -0.000597f, -0.005486f, -0.005287f, -0.003625f, -0.000730f, -0.007646f, 0.007379f, -0.002733f, -0.002884f, -0.005055f, -0.003725f, 0.001421f, 0.008290f, -0.000855f, -0.002382f, 0.002510f, -0.008128f, 0.006112f, -0.005067f, -0.018238f, 0.009058f, 0.006022f, 0.010061f, 0.010435f, 0.001994f, 0.005499f, -0.005436f, 0.001555f, 0.007911f, 0.000624f, -0.000086f, -0.001895f, -0.001040f, 0.004248f, -0.003844f, -0.002773f, 0.000208f, 0.004039f, -0.003336f, -0.004158f, -0.006092f, 0.007818f, 0.003111f, 0.000972f, -0.001892f, -0.007806f, -0.000260f, 0.005849f, 0.003638f, -0.001105f, -0.001469f, 0.005859f, -0.000700f, -0.000420f, -0.002538f, -0.002400f, -0.003561f, -0.004220f, 0.000275f, 0.000901f, 0.002021f, -0.004343f, -0.001712f, 0.002429f, -0.003003f, 0.002621f, 0.000718f, 0.001180f, -0.001115f, -0.000062f, 0.000580f, 0.001283f, + 0.000333f, -0.000497f, 0.000812f, -0.000545f, -0.001474f, -0.000474f, -0.002449f, 0.001644f, 0.000854f, -0.000694f, 0.000048f, -0.001104f, 0.001482f, 0.001522f, 0.000502f, 0.000160f, 0.000584f, 0.000546f, -0.001517f, 0.000065f, -0.000285f, -0.000364f, -0.000585f, -0.000198f, 0.000874f, 0.000266f, -0.027330f, 0.014303f, -0.001318f, 0.000436f, 0.004993f, 0.007024f, -0.010165f, -0.001266f, -0.001803f, 0.005847f, 0.002240f, -0.006208f, 0.019486f, -0.002056f, -0.001180f, 0.008688f, 0.007134f, 0.002354f, 0.004958f, 0.015914f, -0.007837f, 0.000530f, -0.003983f, 0.001622f, -0.004865f, 0.000429f, 0.000521f, 0.001819f, -0.008794f, 0.000792f, -0.002093f, -0.003283f, -0.000354f, 0.005578f, -0.003031f, 0.005189f, 0.007527f, -0.012908f, 0.001769f, -0.005226f, -0.001407f, -0.007933f, 0.004000f, -0.004693f, -0.000788f, -0.002634f, -0.008074f, 0.003132f, -0.005410f, 0.003731f, 0.002054f, -0.003968f, -0.005872f, 0.000227f, 0.005497f, 0.004158f, 0.009971f, 0.004638f, -0.004279f, -0.012177f, -0.000799f, 0.002195f, 0.015428f, -0.004737f, -0.002319f, -0.000129f, -0.002983f, -0.007989f, -0.003811f, -0.007435f, + -0.000988f, 0.006245f, -0.001384f, 0.007427f, 0.004776f, 0.003859f, 0.005381f, 0.001010f, -0.009618f, -0.002209f, -0.006183f, -0.003899f, -0.010683f, -0.000319f, -0.003032f, 0.001487f, 0.002920f, 0.001312f, -0.001576f, -0.002135f, 0.000384f, 0.002872f, -0.002396f, -0.000619f, 0.000084f, -0.000827f, -0.000208f, -0.000943f, 0.001152f, -0.003635f, -0.001247f, -0.000824f, 0.000126f, -0.000313f, -0.000667f, 0.000056f, -0.005404f, 0.019789f, 0.010229f, -0.003421f, -0.008236f, 0.011246f, -0.013543f, -0.002416f, 0.007232f, -0.005703f, -0.004170f, -0.005940f, 0.012998f, -0.004842f, 0.003880f, 0.000911f, 0.003830f, 0.017825f, -0.018303f, 0.005191f, 0.008870f, -0.006234f, -0.016956f, -0.008939f, -0.001346f, 0.000848f, -0.002578f, -0.003233f, 0.006821f, 0.010007f, -0.001043f, -0.007440f, 0.000345f, -0.009373f, 0.002531f, -0.005962f, 0.003037f, 0.010702f, 0.003797f, -0.011162f, -0.000490f, 0.000467f, 0.016129f, 0.002852f, 0.007974f, -0.002551f, 0.003427f, 0.002661f, -0.019937f, 0.000120f, 0.009158f, 0.004136f, 0.010265f, -0.009458f, -0.005885f, -0.009417f, 0.002311f, 0.005725f, -0.002078f, 0.001825f, + 0.000320f, -0.004818f, 0.001567f, -0.003665f, 0.002953f, 0.002785f, -0.000868f, 0.004650f, 0.000804f, -0.000899f, 0.001945f, 0.011561f, 0.001968f, 0.005950f, 0.007456f, 0.004049f, -0.000007f, -0.000358f, -0.011205f, -0.000198f, 0.011546f, 0.003973f, 0.005015f, -0.000397f, -0.001003f, 0.007208f, -0.005706f, 0.000441f, -0.000697f, 0.003582f, 0.001803f, -0.000132f, -0.004979f, 0.000628f, -0.002612f, -0.000873f, 0.000621f, -0.001699f, -0.001323f, 0.001001f, -0.000334f, 0.003643f, 0.001403f, 0.003318f, 0.001477f, 0.000908f, 0.001691f, -0.001556f, -0.002086f, 0.000074f, 0.000026f, 0.004191f, 0.002468f, 0.000495f, 0.001310f, 0.003979f, -0.000888f, 0.000270f, 0.001090f, 0.001672f, -0.000044f, 0.041102f, -0.010752f, -0.003957f, -0.006364f, 0.008324f, 0.005514f, 0.013918f, 0.005452f, -0.002175f, 0.006605f, -0.000403f, 0.007400f, 0.002804f, 0.010330f, 0.000114f, 0.008649f, 0.011304f, -0.012777f, 0.002164f, 0.003149f, 0.002006f, 0.001870f, 0.002723f, -0.007650f, -0.000123f, -0.008791f, -0.001356f, -0.000441f, -0.014784f, -0.010105f, 0.003574f, -0.000193f, -0.000617f, 0.005714f, 0.005630f, + -0.003119f, -0.012756f, 0.003663f, 0.011312f, 0.007381f, 0.010545f, -0.003002f, 0.005656f, 0.010425f, -0.017685f, 0.005443f, 0.007641f, -0.008830f, 0.010789f, -0.007717f, -0.001686f, 0.000936f, 0.002053f, -0.005996f, 0.005057f, -0.001686f, -0.002073f, -0.006235f, -0.005063f, 0.005954f, 0.006041f, 0.002617f, 0.005947f, 0.009235f, 0.005060f, 0.012895f, -0.002826f, -0.014832f, 0.014130f, 0.002170f, 0.006897f, 0.002801f, -0.002496f, 0.003557f, 0.002637f, 0.000465f, 0.009681f, -0.003137f, 0.009553f, -0.013961f, -0.003240f, 0.001632f, 0.004219f, 0.000781f, -0.007609f, -0.003642f, 0.001196f, 0.000273f, -0.000856f, 0.000303f, 0.002862f, -0.003867f, -0.002166f, -0.002254f, -0.002746f, 0.001414f, -0.000865f, -0.001189f, -0.002244f, -0.001764f, 0.004144f, -0.001170f, -0.001429f, -0.000225f, -0.001516f, -0.001386f, 0.002088f, -0.001015f, 0.002235f, -0.000654f, 0.000148f, 0.001598f, -0.000542f, 0.000039f, 0.018482f, -0.020742f, 0.014159f, 0.003162f, 0.014495f, 0.003523f, -0.007819f, 0.002854f, 0.011222f, -0.012925f, -0.002555f, 0.001718f, -0.014588f, -0.002718f, -0.011158f, -0.006759f, -0.008066f, + -0.008891f, 0.004096f, -0.013942f, -0.008555f, -0.011067f, -0.002642f, 0.011096f, 0.004162f, -0.013358f, -0.005048f, -0.013982f, -0.003272f, 0.003299f, 0.020605f, -0.016202f, 0.006964f, -0.003974f, -0.005776f, -0.012026f, 0.000809f, 0.002285f, 0.013296f, 0.007062f, 0.001882f, -0.010889f, -0.019009f, -0.000087f, 0.005881f, 0.015313f, 0.005510f, 0.005044f, -0.010940f, 0.004270f, 0.009714f, 0.000926f, 0.001714f, -0.005789f, -0.005691f, -0.001809f, 0.005755f, 0.001180f, -0.003600f, 0.000308f, -0.012049f, -0.001567f, -0.010115f, 0.006722f, -0.001930f, 0.006720f, -0.009903f, -0.008402f, -0.013726f, -0.001430f, -0.008739f, -0.003679f, 0.003827f, -0.013374f, -0.005604f, 0.001754f, 0.007726f, -0.016105f, 0.009761f, -0.007481f, -0.007973f, -0.008473f, -0.006978f, 0.005082f, -0.004604f, 0.002454f, 0.003073f, -0.004139f, 0.000883f, 0.003574f, 0.002897f, 0.000357f, -0.003603f, -0.000398f, -0.001593f, -0.004193f, -0.000502f, 0.003413f, 0.002190f, -0.001986f, 0.003233f, -0.002358f, -0.001652f, -0.000305f, 0.001286f, -0.003083f, 0.000506f, -0.000224f, 0.002493f, 0.001909f, 0.003932f, -0.002768f, 0.001152f, + -0.000495f, -0.000964f, 0.001306f, -0.003095f, -0.001021f, 0.002017f, 0.001092f, -0.001290f, -0.050901f, 0.008238f, 0.005839f, -0.014671f, -0.003249f, -0.000030f, 0.000532f, -0.002782f, -0.004866f, -0.003729f, -0.015117f, 0.011687f, -0.007315f, 0.001646f, -0.012592f, -0.004443f, 0.018250f, 0.016566f, -0.010471f, -0.006286f, 0.000536f, -0.000251f, -0.008596f, -0.009991f, -0.007109f, 0.001236f, 0.000784f, 0.000348f, -0.001035f, 0.004298f, -0.012429f, 0.003927f, 0.000422f, -0.021878f, -0.002640f, -0.006513f, 0.010016f, 0.014694f, 0.002278f, -0.002530f, 0.000688f, -0.012799f, -0.016107f, 0.008679f, 0.015903f, 0.017779f, -0.004801f, 0.003286f, 0.010321f, 0.010726f, -0.005551f, 0.009900f, 0.016016f, -0.000616f, 0.013477f, 0.011505f, -0.013486f, 0.004466f, 0.000748f, 0.014535f, -0.008907f, -0.009396f, 0.008306f, 0.011035f, -0.003412f, 0.001046f, -0.015897f, 0.011229f, -0.008912f, 0.011851f, -0.019764f, 0.002211f, 0.004645f, 0.009483f, 0.000598f, -0.008184f, -0.016873f, -0.010244f, 0.014100f, -0.013904f, -0.000710f, 0.001662f, 0.007580f, -0.004150f, -0.003044f, 0.006037f, -0.011305f, -0.009713f, + 0.003957f, 0.002764f, -0.000882f, 0.008131f, -0.003795f, 0.001998f, 0.002010f, 0.002243f, 0.002976f, 0.000748f, -0.003206f, 0.002047f, 0.004078f, -0.001629f, 0.000503f, -0.000746f, -0.002168f, 0.001789f, -0.005284f, -0.000639f, -0.005694f, -0.000976f, -0.001143f, -0.001734f, -0.002966f, 0.001266f, -0.001753f, 0.000025f, -0.004454f, 0.001849f, -0.000884f, 0.001623f, 0.001681f, 0.000772f, 0.000638f, -0.019625f, 0.007107f, -0.017330f, 0.022182f, 0.021335f, 0.000764f, -0.028643f, 0.012020f, 0.001740f, -0.005248f, 0.019950f, 0.000201f, -0.017025f, -0.001706f, 0.021678f, -0.026940f, 0.000963f, -0.006652f, -0.021248f, -0.005821f, 0.000495f, -0.004085f, -0.010831f, 0.006417f, -0.008954f, 0.007487f, -0.007612f, -0.014347f, 0.007818f, -0.000960f, 0.011187f, -0.021421f, 0.008896f, 0.017076f, -0.006713f, 0.001517f, 0.017147f, 0.025047f, -0.006526f, -0.004965f, -0.020901f, 0.001354f, -0.017226f, -0.001288f, -0.011961f, 0.000726f, 0.001790f, 0.010197f, 0.004926f, 0.009331f, -0.006542f, 0.001822f, 0.005802f, -0.000962f, 0.023101f, -0.015138f, -0.007444f, 0.030396f, 0.030495f, -0.005867f, -0.001822f, + -0.018943f, -0.009656f, 0.001105f, -0.005198f, -0.012491f, 0.018455f, 0.005796f, -0.004689f, 0.027079f, 0.005316f, -0.012789f, -0.000264f, -0.024601f, -0.012317f, -0.013886f, -0.011930f, -0.003146f, -0.019225f, -0.013800f, 0.008050f, 0.007502f, -0.001330f, 0.004486f, -0.005643f, 0.006614f, -0.004217f, -0.006176f, 0.001181f, -0.008954f, -0.004071f, 0.011835f, 0.001022f, 0.005973f, -0.003038f, 0.001346f, 0.000981f, 0.002894f, 0.002619f, -0.000359f, -0.000149f, -0.005632f, 0.000017f, 0.001389f, 0.001018f, -0.001475f, -0.001558f, 0.004063f, 0.001245f, -0.000678f, 0.000220f, -0.000837f, 0.000212f, 0.002326f, 0.001443f, -0.000622f, -0.002106f, 0.000761f, -0.001371f, 0.024368f, -0.006577f, -0.000352f, 0.016764f, -0.004100f, 0.009885f, -0.005535f, -0.021424f, -0.001462f, -0.000033f, -0.004469f, -0.012713f, -0.014204f, 0.007303f, -0.011270f, 0.019727f, -0.006163f, -0.014395f, 0.012153f, 0.024777f, -0.006256f, 0.006915f, -0.006764f, 0.014301f, 0.000225f, -0.030208f, 0.010651f, 0.016721f, 0.001577f, -0.005059f, -0.017641f, 0.014678f, 0.009747f, 0.009442f, 0.001830f, 0.005942f, 0.019589f, -0.013928f, + 0.002356f, 0.003826f, -0.011060f, -0.021236f, 0.020099f, 0.011214f, 0.037495f, -0.001941f, 0.016480f, -0.005551f, -0.011925f, 0.001984f, -0.001960f, -0.000557f, -0.003477f, -0.012274f, 0.026887f, 0.000604f, 0.001993f, 0.003802f, -0.003884f, 0.022196f, 0.002704f, 0.018581f, 0.007647f, 0.003110f, 0.019766f, -0.009402f, -0.022415f, -0.004423f, 0.003997f, 0.002862f, -0.009345f, 0.010874f, -0.006727f, -0.031217f, 0.002697f, 0.006178f, -0.017361f, 0.008010f, -0.001918f, 0.003346f, -0.000088f, -0.007104f, -0.007963f, -0.000055f, 0.002821f, 0.009499f, -0.000994f, 0.002649f, -0.003811f, -0.002750f, 0.004167f, 0.002803f, -0.000679f, 0.002890f, -0.003315f, -0.000383f, 0.000078f, -0.004297f, -0.006302f, 0.003821f, -0.007001f, -0.001796f, -0.003136f, -0.006016f, -0.001812f, -0.000820f, -0.002373f, 0.002592f, -0.001172f, -0.002544f, -0.000897f, 0.011449f, 0.004347f, 0.004357f, -0.002469f, 0.001621f, -0.003744f, -0.004682f, -0.001687f, -0.001627f, 0.001837f, -0.003104f, 0.005392f, -0.007211f, -0.002427f, 0.001525f, 0.019647f, -0.032985f, 0.005238f, 0.014548f, 0.021738f, -0.023151f, -0.003462f, 0.015428f, + 0.010716f, 0.013141f, 0.002203f, 0.027916f, 0.005061f, 0.011478f, -0.003634f, 0.001495f, 0.011444f, 0.006186f, 0.013234f, 0.000891f, -0.018708f, -0.027265f, 0.014231f, 0.006782f, -0.005295f, 0.003012f, 0.007946f, -0.025526f, 0.000103f, -0.016175f, 0.007352f, -0.001051f, 0.016484f, -0.005508f, 0.007292f, -0.004022f, 0.004174f, 0.002088f, -0.000834f, 0.009169f, 0.012361f, 0.004286f, 0.007106f, -0.020051f, 0.008094f, -0.003692f, -0.034760f, -0.023204f, 0.005774f, -0.025487f, -0.001866f, 0.020707f, -0.015376f, 0.041327f, 0.014889f, -0.008564f, 0.022414f, 0.000853f, -0.007502f, -0.016965f, -0.016722f, -0.023266f, -0.003706f, 0.013270f, -0.016618f, -0.002262f, 0.014844f, 0.006618f, 0.008332f, 0.030212f, 0.003639f, 0.019675f, 0.000035f, 0.003684f, -0.032778f, 0.008823f, 0.002344f, -0.029956f, -0.028259f, 0.016011f, -0.010849f, 0.001658f, 0.008436f, -0.005084f, -0.007766f, 0.001480f, -0.001813f, -0.002277f, 0.001607f, -0.005562f, 0.004675f, -0.004071f, 0.000959f, -0.009636f, 0.004993f, 0.001324f, 0.001969f, -0.000764f, 0.011482f, -0.009646f, 0.000708f, -0.002892f, -0.002438f, 0.002076f, + 0.002271f, 0.002969f, 0.005477f, 0.009034f, 0.005654f, -0.006259f, 0.001356f, -0.001034f, 0.008382f, -0.003075f, 0.005376f, -0.008969f, -0.006691f, -0.005295f, -0.004301f, -0.000871f, -0.000563f, 0.004012f, 0.004951f, -0.017171f, -0.000556f, 0.010723f, -0.000190f, 0.007513f, -0.017589f, 0.013597f, -0.001116f, 0.003926f, 0.012668f, -0.023728f, -0.016324f, 0.004258f, -0.000360f, 0.012953f, 0.026771f, -0.002533f, 0.006647f, 0.028751f, -0.010734f, -0.019559f, -0.001160f, 0.021053f, -0.004610f, -0.024339f, 0.001911f, 0.008932f, -0.004815f, -0.007642f, -0.001827f, 0.031188f, -0.005987f, 0.026842f, 0.020265f, 0.024488f, 0.001311f, 0.001969f, 0.014286f, 0.004777f, -0.005016f, 0.005023f, -0.019458f, 0.014609f, 0.024520f, 0.015387f, 0.002067f, 0.013680f, -0.010817f, 0.010500f, -0.010525f, 0.015369f, -0.013925f, 0.000241f, -0.001151f, -0.001107f, 0.043646f, -0.006563f, -0.002487f, -0.003830f, 0.006027f, 0.012023f, 0.022960f, 0.026242f, -0.014399f, 0.006271f, 0.026100f, -0.014684f, -0.018249f, 0.010929f, -0.007971f, 0.011269f, 0.049864f, -0.023604f, 0.003334f, 0.004647f, -0.013040f, 0.005605f, + 0.016250f, 0.011400f, 0.001312f, -0.010246f, -0.024626f, 0.011627f, -0.010764f, 0.013455f, -0.009281f, 0.001874f, -0.012213f, -0.002692f, -0.020400f, 0.001719f, -0.006505f, -0.007220f, -0.002575f, 0.002450f, 0.005101f, 0.010078f, 0.004232f, -0.005810f, -0.001490f, 0.010275f, -0.006117f, -0.005354f, 0.000686f, 0.000710f, -0.009311f, -0.000140f, -0.004718f, -0.002319f, -0.001789f, -0.001682f, 0.003518f, 0.002210f, 0.007252f, -0.004682f, -0.004720f, 0.000545f, -0.005645f, 0.002611f, 0.011415f, -0.005748f, -0.006159f, -0.011409f, 0.005794f, -0.002893f, -0.007796f, -0.002802f, -0.016831f, -0.026578f, -0.020449f, -0.027658f, -0.010612f, 0.003214f, 0.022295f, 0.016561f, 0.006035f, 0.023504f, 0.007105f, 0.014401f, 0.013223f, -0.006236f, 0.020357f, 0.022110f, 0.015594f, -0.029574f, -0.016584f, -0.017076f, 0.006530f, -0.011735f, 0.000875f, 0.008583f, -0.008582f, -0.020821f, 0.013599f, -0.009799f, 0.004853f, 0.004647f, 0.021415f, -0.022146f, 0.034695f, -0.034086f, 0.035439f, 0.000074f, 0.017793f, -0.017024f, 0.006277f, -0.038108f, -0.021289f, -0.018456f, 0.016889f, 0.007938f, 0.024475f, -0.002261f, + -0.000075f, -0.012239f, -0.030669f, 0.020211f, -0.016746f, -0.008524f, 0.014600f, 0.034987f, 0.033674f, 0.015985f, -0.002245f, -0.022588f, 0.013402f, -0.034789f, -0.002727f, -0.019663f, 0.011269f, 0.037969f, -0.036247f, 0.013432f, 0.016813f, -0.022313f, -0.002245f, -0.003622f, 0.012624f, -0.014711f, -0.021532f, 0.004516f, -0.008723f, -0.031368f, 0.016023f, -0.002883f, -0.029713f, 0.022293f, 0.029132f, -0.009366f, 0.000952f, 0.004375f, -0.012585f, 0.019201f, 0.008744f, -0.005096f, -0.004749f, -0.012161f, -0.007139f, 0.015468f, 0.008662f, 0.008950f, -0.000703f, -0.013411f, -0.004171f, -0.004359f, -0.015262f, -0.002945f, 0.004524f, -0.000614f, -0.004508f, -0.001076f, -0.010901f, 0.001735f, -0.003745f, 0.007704f, 0.004050f, 0.001867f, -0.012631f, 0.010712f, 0.000904f, -0.005095f, -0.003240f, -0.001720f, -0.000693f, 0.006511f, -0.004702f, -0.001571f, 0.004650f, 0.013132f, 0.006345f, 0.004147f, -0.007795f, 0.010568f, -0.025133f, -0.029404f, -0.008057f, 0.019524f, -0.022436f, 0.015414f, -0.030950f, -0.005241f, -0.011691f, -0.010678f, -0.024467f, -0.001865f, -0.008915f, -0.014559f, 0.012284f, -0.016261f, + 0.018233f, 0.004133f, 0.014317f, -0.021598f, -0.040718f, -0.003056f, 0.008817f, -0.016838f, -0.012245f, 0.007075f, 0.005703f, -0.019753f, -0.009200f, 0.028972f, 0.014237f, -0.003409f, 0.015998f, 0.041452f, 0.001806f, 0.005574f, 0.004555f, -0.002756f, -0.000331f, 0.006422f, 0.005847f, -0.031211f, -0.011140f, -0.038218f, -0.011856f, -0.035617f, -0.016625f, 0.002327f, 0.042382f, 0.019992f, -0.020472f, -0.024068f, 0.016010f, 0.033574f, 0.021326f, -0.014488f, 0.025783f, -0.009322f, -0.001592f, -0.044209f, -0.012934f, -0.005375f, -0.005180f, -0.030120f, -0.048538f, 0.016033f, 0.000199f, -0.035372f, 0.009416f, 0.056292f, 0.007599f, 0.006703f, -0.035020f, -0.002807f, -0.000213f, 0.008198f, -0.039366f, 0.036998f, 0.006079f, 0.010493f, 0.020540f, 0.008199f, 0.022254f, -0.001306f, 0.010596f, -0.008246f, -0.016897f, -0.013926f, 0.007828f, -0.011148f, -0.003382f, -0.015021f, 0.005429f, 0.012952f, 0.000495f, 0.010969f, 0.001440f, -0.003883f, 0.000059f, -0.008477f, 0.006389f, 0.006719f, 0.001370f, 0.001532f, -0.005798f, -0.002092f, 0.003591f, 0.009580f, 0.006909f, -0.007733f, -0.002667f, -0.002974f, + -0.018337f, -0.025353f, -0.018733f, -0.005838f, -0.002186f, 0.003355f, -0.004238f, -0.006922f, -0.007713f, 0.000352f, -0.005119f, -0.006494f, -0.011360f, -0.005897f, 0.018727f, -0.011136f, -0.009919f, -0.002557f, 0.022898f, -0.033934f, -0.006735f, 0.008409f, -0.016214f, 0.039630f, -0.032271f, -0.033197f, -0.026987f, 0.038343f, 0.017226f, -0.021810f, -0.019696f, -0.013011f, -0.003954f, -0.011696f, -0.012120f, 0.002145f, 0.014403f, 0.037901f, -0.003990f, 0.016308f, 0.014132f, 0.013845f, -0.024959f, -0.031078f, -0.022374f, 0.026590f, -0.004408f, 0.032250f, 0.010762f, -0.003253f, -0.043576f, -0.035360f, -0.003549f, 0.003190f, -0.025221f, -0.015572f, -0.011780f, -0.011878f, -0.057220f, -0.012169f, -0.013881f, -0.020372f, -0.009999f, -0.013219f, -0.026200f, 0.018809f, 0.035904f, 0.020200f, 0.001108f, 0.021445f, 0.026990f, -0.009260f, 0.008635f, 0.007159f, 0.002774f, -0.000789f, -0.006728f, 0.019183f, 0.007710f, 0.031950f, -0.007237f, 0.003465f, 0.011384f, 0.062602f, -0.000626f, 0.033446f, 0.041973f, -0.003293f, -0.036395f, 0.003509f, 0.036465f, 0.005712f, -0.030984f, -0.027483f, -0.035534f, 0.023625f, + -0.029012f, -0.007511f, 0.041794f, -0.017543f, -0.027845f, 0.009026f, -0.007565f, 0.001211f, 0.011480f, -0.017100f, -0.007772f, 0.003886f, -0.005148f, -0.007525f, -0.001500f, 0.003619f, 0.020908f, -0.001528f, -0.010744f, -0.008881f, -0.000024f, -0.007578f, -0.006515f, -0.005402f, -0.010445f, -0.004533f, 0.004003f, -0.004556f, -0.000961f, -0.013818f, 0.003704f, -0.000894f, 0.002908f, 0.014745f, 0.008948f, -0.007942f, 0.003902f, 0.003589f, -0.012593f, -0.018695f, 0.007158f, 0.008172f, 0.001073f, -0.019104f, -0.021233f, -0.002835f, -0.014857f, -0.004308f, -0.002235f, -0.018843f, 0.034811f, 0.025273f, -0.059301f, 0.018379f, 0.023183f, -0.010657f, 0.016741f, 0.055714f, 0.004261f, 0.012160f, -0.019923f, 0.012679f, -0.021039f, -0.013521f, -0.011379f, 0.003816f, 0.014056f, 0.019863f, -0.003256f, 0.008019f, -0.006467f, -0.003719f, -0.011189f, 0.014553f, 0.052512f, -0.017552f, -0.017431f, 0.018690f, 0.012991f, 0.001642f, -0.038851f, 0.024668f, -0.031055f, 0.017333f, 0.021681f, 0.002196f, 0.005213f, -0.006605f, 0.035987f, 0.027289f, -0.000077f, 0.018279f, -0.014961f, 0.023117f, 0.003509f, 0.026141f, + 0.038126f, -0.001093f, 0.009366f, -0.005260f, -0.014614f, -0.001211f, 0.016382f, 0.018713f, -0.037225f, -0.022585f, 0.008210f, 0.039770f, -0.019799f, 0.026329f, 0.017354f, 0.004950f, -0.043317f, 0.005007f, 0.006248f, -0.051353f, 0.029718f, -0.028826f, -0.034483f, -0.064937f, 0.015324f, 0.039105f, -0.018236f, -0.036307f, 0.007046f, 0.043370f, 0.027325f, 0.004685f, -0.006133f, 0.000455f, 0.014902f, -0.013471f, 0.020033f, 0.033298f, 0.031404f, -0.002494f, 0.013037f, 0.032955f, -0.005687f, -0.000566f, -0.004147f, 0.028371f, -0.004695f, 0.006896f, -0.013831f, 0.007140f, -0.008711f, 0.001010f, -0.000119f, -0.002319f, -0.006978f, 0.006164f, 0.016253f, 0.005592f, 0.004235f, -0.015218f, 0.003317f, -0.015700f, 0.004206f, 0.024615f, -0.009530f, 0.000353f, 0.002693f, -0.011717f, -0.015812f, -0.017560f, -0.004554f, 0.011140f, -0.005732f, 0.003003f, -0.011199f, -0.001056f, -0.000178f, -0.032451f, -0.008928f, -0.001325f, 0.006243f, 0.008358f, -0.007347f, 0.011613f, 0.005503f, 0.006258f, -0.010244f, -0.009322f, -0.006457f, 0.003022f, 0.014971f, 0.041173f, 0.030002f, -0.009644f, -0.078848f, 0.009861f, + 0.040283f, 0.019494f, 0.009186f, -0.034299f, 0.000341f, -0.023522f, 0.006145f, -0.001804f, 0.007139f, 0.012466f, 0.017204f, 0.007611f, -0.042601f, 0.025504f, -0.005445f, 0.008072f, 0.033345f, 0.013122f, 0.006697f, -0.011244f, 0.041231f, -0.000950f, 0.040987f, -0.048618f, -0.013866f, 0.016141f, -0.028042f, -0.024252f, 0.002308f, -0.005993f, -0.021820f, 0.003085f, 0.036295f, -0.000734f, 0.002953f, -0.018321f, -0.038456f, -0.024442f, -0.010569f, 0.016616f, -0.003712f, 0.004198f, -0.018612f, -0.020456f, -0.009652f, 0.031477f, -0.020770f, 0.018303f, 0.012616f, 0.010480f, 0.004058f, -0.031722f, -0.045215f, -0.003324f, 0.031262f, -0.037657f, 0.018987f, -0.032370f, 0.021129f, -0.034076f, -0.001133f, -0.033593f, 0.048809f, -0.043597f, -0.025660f, 0.011761f, 0.008537f, 0.022471f, 0.019005f, -0.011013f, -0.005446f, -0.011085f, 0.006618f, -0.000094f, 0.029367f, -0.035299f, -0.013493f, -0.045468f, 0.024347f, -0.015915f, 0.002440f, -0.001537f, 0.013165f, -0.009770f, 0.005344f, -0.018382f, -0.027879f, 0.018722f, -0.014090f, 0.000849f, 0.005375f, 0.024746f, 0.010394f, -0.017109f, 0.004408f, -0.005533f, + -0.021859f, -0.003773f, 0.005954f, 0.007502f, -0.019693f, -0.009539f, 0.023158f, -0.001880f, -0.018255f, -0.007891f, 0.027066f, -0.030547f, -0.009830f, 0.006756f, -0.006513f, 0.011477f, -0.001635f, -0.013167f, -0.017644f, -0.005414f, -0.007521f, -0.005232f, -0.005330f, 0.005505f, -0.000728f, 0.011990f, -0.011431f, 0.006885f, 0.002925f, -0.004987f, 0.012256f, -0.067783f, -0.009660f, 0.020216f, 0.004895f, -0.016194f, -0.024242f, 0.002182f, -0.023052f, -0.002195f, -0.035562f, 0.033174f, -0.013366f, 0.020748f, -0.046227f, -0.026225f, -0.001048f, 0.056502f, -0.046385f, -0.004068f, -0.036335f, -0.028873f, -0.008921f, 0.035385f, -0.008360f, 0.015679f, 0.016452f, -0.018860f, -0.040318f, 0.056570f, 0.024505f, -0.032444f, 0.006128f, 0.004115f, 0.015464f, -0.031567f, 0.028103f, -0.002548f, -0.059376f, 0.006216f, 0.011677f, 0.015228f, -0.049237f, -0.011788f, 0.006000f, 0.043177f, 0.008033f, 0.024043f, -0.063484f, -0.038507f, 0.019213f, -0.000030f, 0.041097f, -0.011096f, -0.007186f, 0.003139f, 0.020778f, 0.019212f, 0.007119f, -0.080488f, 0.022443f, -0.009385f, 0.018182f, 0.042878f, -0.013808f, -0.003824f, + -0.049261f, 0.015900f, 0.021913f, -0.025779f, -0.015566f, 0.044386f, 0.069821f, 0.018336f, 0.011152f, -0.019843f, -0.008505f, -0.038274f, 0.002637f, 0.000481f, -0.047557f, 0.017247f, -0.001723f, -0.013823f, -0.003913f, 0.022259f, -0.018418f, -0.012181f, -0.002433f, -0.005040f, -0.002034f, 0.019666f, -0.008813f, 0.000423f, 0.010964f, 0.004537f, 0.015206f, 0.013141f, 0.009604f, 0.007067f, 0.018255f, 0.021846f, -0.029556f, 0.009323f, -0.018601f, 0.014485f, 0.001766f, -0.018416f, -0.012932f, -0.007132f, -0.006534f, -0.012055f, 0.010780f, -0.006113f, -0.012410f, 0.020140f, -0.003618f, -0.006295f, 0.010989f, 0.020749f, -0.000535f, -0.007351f, 0.005234f, 0.019373f, 0.020470f, 0.013271f, -0.007352f, 0.003612f, 0.003388f, 0.017454f, 0.010143f, -0.057210f, -0.037111f, -0.012194f, 0.000294f, -0.032203f, 0.027179f, -0.067771f, 0.004237f, -0.041259f, 0.022769f, -0.014734f, -0.045960f, -0.003251f, -0.011731f, -0.015614f, -0.052476f, -0.038057f, 0.012039f, 0.042968f, -0.027365f, 0.052831f, -0.043381f, -0.028222f, 0.010370f, -0.003450f, 0.024460f, -0.013845f, -0.014570f, -0.020612f, -0.005138f, -0.072058f, + -0.020127f, 0.002969f, -0.002314f, -0.011301f, -0.027854f, 0.023750f, -0.024554f, 0.039795f, -0.011226f, -0.004010f, -0.026777f, -0.024587f, -0.047468f, -0.020185f, 0.018673f, 0.008193f, -0.002079f, 0.004024f, -0.016536f, -0.012267f, -0.021562f, -0.017945f, 0.010674f, 0.015189f, 0.007563f, -0.041115f, 0.048807f, 0.007332f, -0.020034f, 0.039231f, 0.028244f, 0.046594f, -0.007933f, 0.027521f, -0.061974f, -0.033112f, -0.058523f, 0.061101f, -0.018737f, -0.041278f, -0.039765f, -0.085122f, -0.035243f, 0.060237f, -0.003224f, -0.029374f, 0.022421f, -0.057851f, -0.038542f, 0.015488f, -0.002802f, -0.048156f, -0.047145f, 0.000186f, -0.026835f, 0.008096f, 0.010836f, -0.035635f, 0.036073f, -0.020913f, -0.031202f, 0.003506f, -0.018267f, 0.051409f, -0.018952f, 0.023503f, 0.004202f, 0.031532f, -0.015122f, -0.008289f, 0.003521f, -0.013330f, 0.000029f, -0.028833f, -0.021830f, -0.004999f, 0.012842f, 0.001286f, 0.021006f, 0.008952f, 0.015712f, -0.012587f, 0.000424f, -0.025035f, -0.005808f, -0.008609f, 0.008177f, 0.025195f, 0.011803f, 0.010497f, 0.012168f, 0.010797f, 0.003181f, -0.032869f, -0.009491f, -0.022509f, + -0.005313f, 0.004483f, 0.015933f, 0.075588f, 0.096592f, -0.008538f, -0.042142f, -0.009556f, -0.015618f, -0.042502f, 0.019063f, 0.001827f, -0.030756f, 0.092445f, 0.032324f, -0.021092f, -0.063195f, -0.005033f, 0.015795f, 0.017434f, 0.019079f, 0.044614f, -0.012218f, -0.020999f, 0.021032f, -0.078936f, -0.052844f, -0.020069f, -0.005340f, 0.009301f, -0.042177f, -0.038091f, 0.041322f, 0.033366f, -0.024723f, -0.047424f, 0.030922f, 0.001707f, 0.054290f, -0.043124f, -0.009799f, -0.014154f, -0.002456f, -0.033893f, -0.051492f, 0.044340f, -0.031843f, -0.019406f, -0.039315f, -0.007967f, 0.026358f, 0.025446f, -0.015732f, 0.004364f, 0.004804f, 0.033731f, 0.050437f, 0.037934f, -0.064201f, -0.029990f, -0.038026f, -0.008599f, 0.022129f, 0.009011f, -0.043867f, -0.062291f, 0.053786f, 0.004403f, -0.052452f, -0.086249f, 0.044121f, -0.010338f, 0.023781f, 0.022916f, 0.023244f, 0.004133f, 0.017170f, -0.033239f, -0.012927f, 0.024614f, 0.004349f, -0.014975f, 0.009792f, -0.002995f, -0.046226f, 0.024444f, -0.058711f, -0.002723f, -0.002845f, -0.009102f, -0.021078f, -0.007066f, 0.025857f, -0.000614f, -0.005899f, 0.014421f, + -0.018992f, 0.058397f, -0.004521f, 0.006307f, -0.004259f, 0.001758f, 0.014248f, 0.000316f, 0.013718f, -0.027984f, 0.006288f, -0.004122f, -0.020427f, 0.003334f, 0.009689f, 0.020322f, -0.009687f, 0.006602f, -0.048830f, -0.014658f, -0.002771f, -0.024229f, 0.021615f, -0.001606f, -0.006004f, -0.012396f, -0.020213f, -0.028276f, -0.041710f, 0.013952f, -0.004321f, 0.031834f, 0.035976f, 0.024407f, -0.024790f, -0.032819f, -0.043610f, -0.014858f, 0.039684f, 0.034001f, 0.005373f, 0.016678f, -0.014178f, -0.023566f, -0.019309f, 0.001517f, 0.005519f, -0.018174f, 0.008595f, 0.033732f, 0.041789f, -0.051754f, -0.043391f, 0.123456f, -0.009899f, -0.012067f, -0.018467f, -0.038961f, -0.004189f, 0.044539f, 0.071628f, -0.032962f, -0.019846f, -0.007268f, -0.032497f, -0.008115f, -0.018291f, 0.028435f, -0.029356f, 0.032547f, 0.015600f, -0.011197f, -0.040968f, -0.003032f, -0.016829f, 0.061583f, -0.033767f, -0.000856f, 0.000185f, -0.006172f, 0.027955f, -0.017786f, -0.002241f, 0.012775f, -0.008347f, -0.060203f, 0.030781f, -0.027494f, -0.031690f, -0.007366f, -0.033803f, -0.019746f, -0.061492f, 0.058878f, 0.002818f, -0.039327f, + -0.072064f, 0.041955f, -0.042457f, -0.041650f, 0.000687f, -0.032464f, 0.014738f, 0.026565f, 0.082230f, -0.023442f, 0.032286f, -0.007020f, -0.039552f, -0.033846f, -0.009703f, 0.123386f, -0.108784f, -0.008101f, 0.113582f, -0.103917f, -0.039207f, 0.058310f, -0.008458f, -0.047049f, 0.109863f, -0.054459f, -0.022380f, 0.050188f, 0.012675f, 0.021313f, -0.032322f, 0.036178f, 0.051349f, 0.023776f, -0.012878f, -0.003570f, 0.051869f, -0.007741f, 0.029770f, -0.000923f, 0.020848f, -0.029809f, -0.003630f, 0.013388f, 0.008542f, 0.005457f, 0.001606f, 0.001853f, 0.021735f, -0.010130f, 0.005797f, 0.007703f, 0.007523f, -0.046697f, -0.018858f, 0.014593f, -0.039061f, 0.011550f, 0.022713f, -0.016917f, -0.017256f, -0.013838f, 0.009686f, -0.019344f, 0.022792f, 0.018765f, -0.002193f, 0.010731f, -0.013681f, -0.028314f, -0.026958f, 0.053881f, 0.010092f, 0.033474f, 0.007288f, 0.006326f, 0.021787f, -0.018858f, -0.004019f, 0.034014f, -0.020082f, -0.047300f, 0.035544f, -0.005122f, 0.020947f, -0.005821f, -0.013502f, -0.013741f, 0.057643f, -0.074989f, 0.066083f, -0.012042f, -0.042120f, 0.035235f, 0.011950f, -0.007308f, + 0.006867f, 0.004233f, -0.008678f, 0.012443f, -0.015015f, -0.019239f, -0.009129f, -0.026405f, -0.022133f, -0.049029f, -0.019194f, 0.040994f, 0.038577f, -0.060802f, 0.019454f, 0.031306f, 0.026083f, -0.010977f, -0.060088f, -0.006009f, -0.030091f, -0.070190f, 0.043187f, 0.110775f, -0.064636f, -0.007563f, 0.078475f, -0.023119f, -0.028926f, 0.063659f, 0.047043f, 0.022920f, -0.026638f, -0.052443f, 0.016585f, -0.021743f, -0.033446f, 0.115881f, 0.085042f, -0.070930f, -0.052466f, 0.062294f, -0.115486f, -0.041023f, -0.033218f, -0.020443f, 0.079533f, 0.052718f, 0.034378f, 0.037897f, -0.135571f, -0.047695f, 0.127782f, 0.073813f, 0.014514f, -0.034937f, 0.043548f, -0.045891f, -0.092354f, -0.061722f, 0.043965f, -0.034071f, -0.007924f, 0.051250f, 0.095370f, -0.012222f, -0.054879f, 0.006306f, 0.037257f, -0.066172f, -0.025017f, 0.067603f, 0.060656f, 0.060878f, 0.041977f, -0.012915f, -0.039743f, -0.020004f, 0.051430f, 0.014426f, 0.021202f, -0.010688f, 0.005125f, 0.023106f, 0.001350f, -0.010123f, -0.011856f, -0.015576f, 0.010867f, 0.007750f, 0.049282f, 0.013368f, -0.010648f, -0.020609f, 0.004184f, 0.001831f, + -0.008110f, -0.018182f, 0.004209f, 0.038042f, -0.041905f, -0.013000f, 0.036450f, -0.009185f, -0.001736f, 0.024040f, -0.010234f, 0.017606f, 0.006955f, 0.020795f, -0.042380f, -0.006659f, 0.007965f, 0.046691f, 0.010677f, 0.022031f, 0.018994f, 0.010241f, -0.009898f, 0.014942f, 0.021627f, -0.026016f, 0.011690f, -0.114552f, 0.049030f, 0.000197f, -0.012086f, 0.058148f, -0.010344f, -0.044518f, 0.021811f, 0.019904f, 0.056802f, 0.032082f, -0.031352f, 0.001335f, 0.008426f, 0.038875f, 0.008663f, -0.045433f, -0.002170f, -0.002890f, 0.008764f, -0.042272f, -0.046218f, 0.066033f, -0.024355f, -0.069650f, 0.035222f, 0.061286f, -0.035106f, -0.012063f, 0.003570f, 0.041937f, -0.050843f, -0.066405f, 0.017664f, 0.055597f, -0.012605f, -0.024068f, -0.014313f, -0.013864f, 0.023789f, 0.010113f, 0.013998f, 0.140555f, 0.007248f, -0.018223f, 0.001381f, 0.004199f, 0.075493f, 0.002189f, -0.027587f, 0.016922f, -0.060011f, -0.035116f, 0.014839f, 0.000105f, 0.064766f, 0.051693f, -0.034175f, -0.010013f, -0.032351f, 0.001334f, 0.022818f, 0.005780f, 0.006647f, 0.023283f, -0.017468f, -0.069367f, 0.016976f, 0.046578f, + -0.022744f, 0.041097f, -0.064755f, 0.030046f, 0.018647f, -0.056293f, 0.008925f, 0.001007f, -0.025208f, 0.002473f, -0.011199f, 0.027845f, 0.026523f, -0.047150f, -0.029772f, 0.062740f, -0.048699f, 0.023041f, -0.005263f, -0.018472f, 0.012995f, -0.001908f, -0.029011f, 0.016037f, 0.008919f, 0.011484f, -0.001716f, -0.004795f, 0.002275f, 0.008713f, -0.011615f, -0.010182f, 0.007658f, 0.006156f, -0.006843f, -0.000470f, 0.012981f, 0.023443f, -0.014778f, -0.009385f, 0.002039f, -0.004100f, 0.007222f, -0.005699f, -0.004128f, 0.005528f, -0.001285f, 0.014176f, -0.005469f, 0.007075f, -0.019243f, 0.011214f, -0.013766f, 0.011860f, 0.019468f, -0.001641f, -0.000733f, 0.003062f, -0.024804f, 0.019466f, 0.039302f, -0.073742f, -0.242543f, -0.287021f, -0.025813f, -0.199068f, 0.078198f, 0.485279f, 0.261055f, 0.394142f, 0.415395f, -0.045177f, -0.119719f, 0.035481f, -0.302566f, -0.369870f, -0.114275f, -0.407163f, -0.326848f, 0.082859f, -0.235113f, -0.064100f, 0.468651f, 0.169634f, 0.331332f, 0.572377f, 0.340683f, 0.152341f, 0.115971f, 0.040531f, -0.254998f, -0.317498f, -0.104756f, -0.433629f, -0.433884f, 0.057130f, + -0.324475f, -0.266350f, 0.160073f, -0.273095f, -0.280757f, 0.211875f, 0.086105f, -0.038818f, 0.500318f, 0.468430f, 0.299161f, 0.635101f, 0.598584f, 0.204407f, 0.238254f, 0.185600f, -0.301393f, -0.302228f, -0.382071f, -0.756605f, -0.892977f, -0.642365f, -0.639396f, -0.471757f, 0.016163f, 0.043461f, 0.311409f, 0.538353f, 0.663702f, 0.604598f, 0.701783f, 0.601156f, 0.354636f, 0.238298f, 0.079407f, -0.118694f, -0.266361f, -0.379122f, -0.325612f, -0.472333f, -0.528834f, -0.438760f, -0.512748f, -0.384927f, 0.060994f, 0.123170f, 0.298767f, 0.599055f, 0.477186f, 0.367561f, 0.277988f, 0.109289f, -0.090821f, -0.074366f, -0.150196f, -0.188203f, -0.143533f, -0.163540f, -0.157760f, -0.067510f, -0.063844f, 0.003331f, 0.097503f, 0.069097f, 0.136880f, 0.164148f, 0.028701f, 0.119000f, 0.114612f, -0.032054f, 0.038132f, 0.026520f, -0.087121f, 0.003486f, 0.028263f, -0.101148f, -0.110114f, -0.154096f, -0.316325f, -0.354034f, -0.275142f, -0.263315f, -0.086157f, 0.128809f, 0.232825f, 0.378380f, 0.571416f, 0.616519f, 0.572107f, 0.400467f, 0.122356f, -0.129657f, -0.276495f, -0.413281f, -0.509580f, -0.501681f, + -0.391499f, -0.269366f, -0.127788f, -0.039782f, 0.016131f, 0.045868f, 0.116435f, 0.191442f, 0.197952f, 0.183226f, 0.188654f, 0.133623f, 0.120819f, 0.103966f, 0.042284f, 0.008921f, 0.026081f, 0.022028f, 0.013842f, 0.008328f, -0.024186f, -0.065027f, -0.098640f, -0.142233f, -0.180395f, -0.180843f, -0.145537f, -0.111815f, -0.058720f, 0.009760f, 0.061085f, 0.089162f, 0.103775f, 0.091302f, 0.080947f, 0.088441f, 0.085691f, 0.068540f, 0.058678f, 0.048447f, 0.033314f, 0.017205f, 0.000952f, -0.032790f, -0.060462f, -0.066895f, -0.062758f, -0.057149f, -0.053309f, -0.049425f, -0.036711f, -0.013331f, 0.001364f, -0.004970f, -0.016263f, -0.009157f, 0.001259f, 0.007314f, 0.014391f, 0.016688f, 0.022852f, 0.036347f, 0.049537f, 0.048620f, 0.050086f, 0.044194f, 0.028590f, 0.017274f, 0.010009f, -0.003909f, -0.016409f, -0.025412f, -0.045445f, -0.063015f, -0.069153f, -0.071937f, -0.062177f, -0.039726f, -0.010530f, 0.022189f, 0.051452f, 0.065260f, 0.063719f, 0.049769f, 0.032942f, 0.016221f, 0.000861f, -0.008160f, -0.012887f, -0.013630f, -0.011919f, -0.011509f, -0.011268f, -0.010205f, -0.007969f, -0.006186f, + -0.003704f, -0.001284f, 0.000374f, 0.001833f, 0.002580f, 0.002457f, 0.001876f, 0.000938f, 0.000259f, -0.000066f, -0.000117f, -0.000096f} + }, + { + {-0.016487f, -0.019659f, 0.010316f, 0.000747f, 0.015493f, 0.005699f, 0.006919f, 0.004487f, 0.006376f, -0.000046f, -0.000062f, -0.003328f, -0.009927f, -0.005682f, 0.002816f, -0.000374f, -0.001719f, -0.001069f, 0.005492f, 0.004292f, 0.000197f, 0.004954f, -0.004377f, -0.011324f, 0.003784f, -0.002541f, 0.001419f, -0.005716f, 0.004717f, -0.004658f, -0.002257f, -0.001770f, 0.008342f, -0.001817f, 0.000040f, -0.003309f, -0.000812f, -0.009151f, 0.003253f, -0.001453f, 0.005135f, -0.004292f, 0.000719f, -0.001968f, -0.007315f, 0.002474f, -0.000616f, -0.001899f, 0.003435f, 0.006230f, -0.001146f, -0.003639f, -0.010760f, 0.001103f, -0.006349f, 0.003115f, 0.000227f, -0.004081f, -0.000051f, -0.001688f, -0.001403f, -0.007738f, 0.005195f, -0.006849f, 0.003962f, -0.002627f, -0.004532f, -0.003844f, -0.008247f, 0.004721f, 0.000541f, 0.002409f, 0.005143f, -0.005249f, -0.008463f, 0.005610f, -0.008107f, 0.000383f, -0.005367f, 0.001866f, -0.004130f, 0.003849f, -0.002036f, 0.002090f, -0.003551f, 0.000782f, -0.001592f, 0.002318f, -0.001649f, -0.001808f, -0.001765f, -0.001646f, -0.003179f, 0.000598f, 0.000908f, -0.000449f, + -0.002485f, 0.001913f, -0.001854f, 0.000398f, -0.001208f, -0.002112f, -0.000730f, -0.000675f, -0.000266f, -0.000367f, -0.000235f, -0.001720f, -0.000907f, 0.000409f, -0.001016f, -0.000462f, -0.000504f, -0.001174f, -0.000308f, -0.000843f, -0.001121f, -0.000942f, -0.029345f, -0.000378f, -0.003951f, 0.007643f, 0.000081f, 0.002907f, -0.002487f, 0.003776f, 0.000680f, 0.003299f, -0.003455f, 0.018853f, -0.004179f, -0.002708f, -0.008185f, 0.002673f, -0.009869f, -0.003190f, 0.000664f, -0.004806f, -0.000136f, 0.006896f, 0.003902f, 0.002598f, 0.004601f, 0.006701f, -0.008275f, -0.003166f, -0.000233f, 0.004250f, -0.007814f, 0.007516f, -0.006552f, -0.003296f, 0.005968f, -0.001173f, 0.001320f, -0.004833f, 0.005506f, 0.005820f, 0.006191f, -0.009650f, -0.003018f, 0.010387f, -0.000218f, -0.001586f, -0.002413f, 0.011329f, 0.007317f, 0.008762f, 0.000077f, -0.002066f, -0.002706f, -0.000635f, -0.000319f, 0.001279f, 0.003311f, -0.010975f, -0.001075f, -0.005115f, -0.006567f, -0.000855f, 0.001782f, -0.005695f, 0.001433f, -0.004353f, -0.001682f, -0.001761f, -0.000223f, 0.003796f, 0.003425f, -0.001987f, -0.001391f, -0.002486f, + -0.008992f, -0.002107f, -0.005611f, 0.000148f, -0.007373f, 0.001975f, 0.000024f, 0.007358f, -0.002634f, 0.001012f, -0.006473f, 0.000557f, 0.000801f, -0.002973f, -0.003155f, 0.003126f, 0.000007f, 0.000833f, -0.000393f, 0.002195f, -0.000671f, 0.000913f, -0.000467f, -0.000504f, 0.002564f, 0.001223f, 0.001016f, 0.000413f, -0.000391f, 0.001585f, 0.009854f, 0.011688f, -0.008301f, 0.000956f, -0.007095f, 0.010701f, 0.001881f, -0.004566f, -0.006434f, -0.005702f, -0.001277f, 0.001268f, 0.002759f, 0.014270f, -0.008654f, -0.001462f, -0.003502f, 0.005529f, -0.016159f, -0.001983f, 0.010126f, -0.000387f, 0.008491f, 0.003699f, 0.006788f, 0.007074f, 0.003011f, -0.001509f, -0.007648f, 0.002381f, -0.002221f, 0.000851f, 0.011857f, 0.002911f, 0.010157f, -0.005504f, -0.002922f, 0.000677f, -0.013932f, 0.001511f, 0.010209f, -0.003142f, 0.000847f, -0.008744f, 0.006406f, -0.000252f, 0.002780f, -0.010329f, 0.005898f, -0.006973f, -0.003948f, -0.007279f, -0.008545f, 0.004749f, 0.001529f, -0.002838f, -0.004434f, -0.004187f, -0.003122f, -0.002147f, 0.004649f, -0.004834f, -0.008682f, -0.013293f, 0.012079f, 0.009258f, + 0.000383f, -0.013298f, 0.003885f, -0.006432f, 0.005073f, -0.004379f, 0.000821f, -0.008188f, -0.005216f, -0.010634f, -0.004887f, -0.001574f, 0.010158f, 0.006027f, -0.011603f, 0.004878f, 0.000130f, -0.001097f, 0.004895f, -0.000779f, 0.003860f, 0.008071f, 0.000301f, 0.001626f, 0.005289f, 0.001024f, 0.000955f, 0.005260f, -0.001070f, -0.000236f, 0.000282f, 0.000604f, 0.001009f, 0.001238f, -0.001324f, 0.001461f, -0.001250f, 0.000303f, 0.000135f, 0.001283f, 0.000185f, 0.003299f, 0.002828f, 0.000123f, -0.000298f, 0.003235f, 0.001562f, -0.002586f, 0.000339f, 0.001111f, 0.049764f, -0.018523f, 0.022277f, -0.017755f, 0.001489f, 0.005264f, 0.005203f, -0.014663f, -0.005002f, -0.004946f, -0.024532f, -0.000166f, 0.001262f, -0.008861f, -0.001463f, -0.000139f, 0.017482f, 0.003205f, -0.012253f, 0.008889f, 0.009705f, 0.002141f, 0.017723f, -0.013238f, -0.004867f, -0.007091f, 0.003715f, 0.014191f, -0.001067f, 0.000863f, 0.005257f, -0.002578f, 0.006322f, 0.002837f, 0.016218f, -0.002487f, 0.006336f, -0.010681f, 0.009680f, -0.007490f, 0.010812f, -0.000229f, -0.011376f, -0.001738f, 0.016351f, -0.000759f, + 0.011052f, 0.006620f, 0.010628f, 0.000915f, -0.008472f, -0.006899f, 0.000143f, -0.005137f, 0.008720f, 0.005770f, -0.008696f, 0.001162f, -0.006801f, 0.011522f, -0.003175f, 0.009237f, 0.011037f, 0.001906f, 0.011379f, -0.000558f, -0.005563f, -0.001913f, -0.007080f, 0.000292f, 0.014964f, -0.009432f, -0.009655f, -0.003670f, 0.004228f, -0.006618f, -0.004109f, 0.002876f, 0.007176f, -0.003019f, 0.002620f, -0.014567f, 0.003554f, 0.000918f, -0.001065f, 0.005067f, 0.000299f, 0.001346f, 0.003436f, -0.000467f, -0.001905f, 0.001543f, -0.003372f, 0.001028f, -0.001418f, 0.000399f, 0.000613f, -0.000539f, -0.001188f, -0.002929f, -0.000251f, -0.002336f, -0.001465f, -0.000998f, -0.004862f, -0.041355f, 0.004661f, -0.012096f, -0.008612f, -0.013279f, -0.016113f, 0.006517f, 0.014642f, -0.002078f, 0.005770f, 0.002409f, 0.007581f, 0.001799f, 0.000673f, 0.004606f, -0.008760f, 0.020710f, -0.000943f, -0.011893f, 0.013653f, -0.004034f, 0.005871f, -0.013423f, -0.008283f, -0.009484f, 0.004281f, 0.002613f, 0.010715f, 0.000414f, -0.006441f, 0.001197f, -0.005736f, -0.006366f, -0.007025f, -0.002402f, -0.009832f, -0.004968f, + 0.009426f, -0.008565f, -0.000475f, -0.006685f, -0.010441f, -0.004636f, 0.001463f, 0.003466f, 0.006853f, -0.005253f, -0.004746f, 0.006709f, 0.001298f, 0.002568f, 0.001901f, 0.004177f, 0.006367f, -0.010060f, -0.003252f, -0.000966f, -0.014055f, 0.003822f, -0.000862f, 0.008369f, -0.008184f, -0.006301f, -0.007641f, 0.001393f, 0.008940f, 0.006863f, 0.015666f, 0.010469f, -0.009463f, 0.003944f, -0.004215f, 0.007391f, 0.004735f, -0.010339f, 0.007616f, 0.002051f, -0.011383f, 0.001520f, -0.001965f, 0.001021f, -0.002028f, -0.007837f, 0.001574f, -0.005617f, -0.005803f, 0.002202f, -0.003133f, 0.001389f, 0.004355f, -0.002810f, -0.003642f, -0.003906f, -0.005735f, -0.001078f, 0.004655f, -0.001188f, 0.004837f, 0.000048f, 0.003310f, 0.002167f, 0.001785f, -0.002098f, -0.000695f, 0.000807f, -0.001916f, -0.002288f, 0.000668f, -0.002213f, -0.000721f, 0.000592f, -0.003994f, 0.002304f, -0.001982f, -0.000732f, 0.000605f, -0.000164f, 0.000459f, 0.001312f, -0.001708f, 0.001160f, 0.002898f, -0.052614f, 0.014691f, -0.015559f, -0.012927f, -0.009250f, 0.001976f, -0.002560f, 0.031303f, 0.003250f, 0.007642f, -0.003282f, + 0.000320f, -0.012594f, 0.012892f, 0.003889f, -0.001646f, 0.002731f, 0.016772f, -0.008118f, -0.002662f, 0.004004f, 0.001353f, 0.008496f, -0.007035f, -0.003079f, 0.009347f, 0.003533f, 0.008627f, 0.001182f, -0.008731f, -0.005680f, 0.005246f, -0.000699f, -0.002829f, -0.005411f, -0.003016f, -0.000199f, 0.015910f, 0.004133f, -0.002634f, 0.000496f, 0.001368f, -0.004600f, 0.011521f, 0.008824f, -0.002489f, -0.011723f, 0.003183f, -0.006132f, 0.010973f, 0.008522f, -0.008182f, 0.003433f, -0.010655f, -0.009524f, -0.008307f, -0.010528f, -0.003488f, 0.002512f, -0.006222f, 0.000684f, -0.006893f, -0.005862f, 0.012601f, 0.008036f, -0.010304f, -0.014037f, 0.001795f, 0.012231f, -0.009126f, -0.006773f, 0.010410f, 0.008179f, 0.011846f, -0.007366f, -0.000130f, 0.003434f, 0.005002f, 0.013228f, 0.003736f, -0.001573f, -0.000305f, -0.009398f, -0.001235f, -0.000035f, -0.007986f, 0.000735f, -0.002212f, -0.003600f, 0.000360f, -0.000971f, 0.004237f, -0.000835f, -0.001374f, 0.002050f, -0.001025f, -0.003278f, -0.002041f, 0.000847f, 0.003463f, -0.001431f, -0.001017f, 0.000228f, -0.000604f, 0.006260f, 0.001310f, 0.008078f, + -0.005421f, 0.001563f, 0.000615f, -0.003190f, 0.000125f, -0.000151f, -0.004054f, 0.001203f, -0.000610f, -0.004591f, -0.004170f, -0.002167f, -0.003977f, -0.003078f, 0.001314f, -0.001969f, -0.027811f, -0.002758f, 0.004680f, 0.013523f, -0.002638f, -0.007088f, 0.003167f, 0.019873f, -0.025033f, 0.005802f, -0.005084f, -0.004648f, -0.011272f, 0.006771f, -0.020063f, -0.013058f, 0.006891f, -0.010488f, 0.006338f, 0.028576f, -0.005063f, 0.011550f, -0.013445f, 0.013800f, -0.003593f, 0.004116f, -0.012061f, 0.005628f, 0.003415f, -0.006460f, 0.002833f, -0.001303f, -0.006209f, -0.000413f, 0.007840f, 0.012303f, -0.009643f, -0.015364f, -0.012185f, -0.011278f, 0.001451f, 0.009023f, 0.023887f, -0.000272f, 0.016082f, 0.016811f, -0.015650f, 0.012027f, -0.023013f, -0.008407f, 0.001443f, -0.010228f, -0.009549f, 0.006383f, -0.022289f, -0.004398f, 0.015482f, -0.006682f, -0.005845f, 0.002051f, -0.006823f, 0.006340f, -0.006771f, 0.010874f, 0.014020f, -0.003885f, 0.004342f, 0.000589f, -0.014242f, 0.001229f, -0.009227f, -0.006338f, -0.011260f, 0.006396f, 0.004860f, -0.010784f, 0.000845f, 0.008048f, 0.007443f, 0.009533f, + 0.009785f, -0.001494f, -0.009372f, 0.007747f, 0.004012f, 0.004644f, 0.002489f, 0.005606f, -0.000677f, -0.000173f, 0.000776f, 0.002313f, 0.002666f, -0.003812f, -0.001225f, -0.003073f, -0.002102f, 0.004505f, 0.003805f, 0.004349f, -0.007929f, 0.001624f, -0.001043f, -0.003232f, -0.003866f, 0.004076f, -0.002574f, -0.004288f, 0.001024f, 0.001034f, -0.001488f, 0.009594f, 0.003106f, -0.001865f, -0.002196f, -0.004435f, -0.001311f, 0.003931f, 0.005881f, 0.001514f, -0.000072f, 0.006018f, 0.065835f, -0.003256f, -0.026135f, -0.003335f, -0.001214f, 0.002429f, 0.008233f, 0.003320f, -0.003090f, -0.002772f, -0.013195f, -0.006282f, 0.007289f, 0.016040f, -0.013264f, -0.008363f, 0.010684f, 0.000814f, -0.003936f, 0.004249f, -0.001117f, -0.015333f, -0.015621f, 0.021117f, -0.002037f, -0.001400f, -0.003600f, 0.010824f, -0.000905f, 0.001099f, 0.006862f, -0.011645f, 0.012245f, 0.005074f, 0.001947f, 0.004656f, 0.012241f, -0.029620f, -0.013298f, -0.007235f, 0.027202f, 0.003481f, 0.001986f, -0.008431f, -0.009303f, 0.008124f, -0.001282f, 0.009426f, -0.003420f, -0.018937f, 0.001976f, 0.002279f, -0.002914f, 0.009156f, + 0.004075f, 0.002438f, 0.015062f, 0.036806f, -0.002964f, -0.003141f, 0.013980f, 0.004236f, -0.004399f, 0.009611f, 0.028617f, -0.003244f, 0.005439f, 0.010354f, 0.008297f, 0.007433f, 0.007573f, 0.008494f, 0.006521f, -0.007601f, 0.011394f, 0.020422f, -0.004771f, 0.007816f, 0.000069f, -0.002599f, -0.014192f, 0.008800f, 0.003298f, -0.001176f, 0.004243f, 0.004883f, 0.001129f, 0.000545f, -0.004810f, -0.005508f, -0.002202f, -0.010949f, -0.004896f, -0.007427f, 0.009455f, 0.004631f, 0.003570f, -0.001562f, -0.001469f, 0.000538f, -0.006321f, -0.000007f, 0.002271f, -0.008698f, 0.007571f, -0.003802f, 0.001316f, -0.002674f, 0.000378f, 0.002863f, 0.003423f, -0.006781f, -0.006727f, -0.005591f, 0.000718f, -0.001172f, -0.001892f, -0.000533f, 0.004656f, -0.001257f, 0.000455f, -0.002796f, -0.005983f, -0.003260f, -0.000197f, 0.013293f, 0.014802f, -0.018878f, -0.005489f, -0.016025f, 0.015847f, 0.029711f, -0.014249f, -0.003345f, -0.016347f, -0.007101f, -0.019778f, 0.014083f, -0.012084f, -0.004906f, -0.001304f, 0.000141f, -0.007891f, -0.009677f, 0.017710f, -0.016096f, -0.005980f, 0.001847f, 0.012072f, 0.012933f, + -0.018593f, -0.005446f, 0.007101f, -0.015951f, 0.009031f, -0.012650f, -0.005198f, 0.004681f, 0.000334f, -0.006912f, -0.001968f, 0.003834f, 0.020694f, 0.002584f, 0.004640f, 0.000027f, -0.017774f, 0.019395f, -0.009549f, -0.014502f, 0.011578f, -0.010329f, -0.011765f, 0.015298f, -0.006957f, 0.001985f, -0.003429f, 0.002084f, 0.020016f, -0.003400f, 0.004444f, -0.017513f, -0.001435f, 0.020467f, 0.004511f, 0.020280f, 0.017269f, -0.005664f, -0.004498f, -0.023502f, 0.003553f, -0.003914f, 0.015545f, 0.019173f, -0.011063f, 0.004811f, -0.034656f, -0.009411f, 0.011389f, -0.011901f, 0.017852f, 0.001256f, 0.003798f, -0.006295f, -0.001417f, -0.008242f, 0.001390f, -0.005663f, 0.012576f, 0.012504f, -0.000648f, 0.004299f, -0.000276f, 0.007095f, 0.002951f, 0.005158f, 0.010607f, -0.003157f, -0.012123f, 0.005589f, 0.002647f, 0.007693f, -0.002081f, 0.008159f, -0.001750f, -0.002741f, 0.001941f, -0.004797f, -0.003335f, 0.000900f, -0.008561f, 0.002437f, -0.003048f, 0.007575f, 0.003135f, -0.000475f, -0.001704f, -0.004868f, -0.007611f, -0.000520f, 0.000905f, 0.003128f, -0.002869f, 0.001763f, -0.007172f, -0.000010f, + 0.000305f, -0.003639f, 0.004611f, 0.000566f, -0.000012f, 0.002103f, -0.002434f, 0.000462f, -0.000083f, 0.011855f, -0.015229f, 0.005124f, -0.014245f, -0.001613f, -0.019218f, 0.031395f, -0.009328f, 0.002075f, -0.010000f, -0.028762f, 0.016478f, 0.005730f, -0.021482f, 0.013196f, -0.009713f, -0.007167f, 0.007427f, 0.029716f, -0.014928f, 0.028705f, -0.000630f, -0.020282f, 0.000787f, 0.006660f, -0.017853f, 0.019578f, -0.010364f, 0.014481f, 0.031550f, 0.003032f, -0.014826f, -0.004192f, -0.001743f, 0.007188f, -0.012617f, -0.006917f, -0.001752f, 0.015523f, -0.005618f, -0.006315f, -0.020748f, -0.000759f, -0.024519f, -0.004566f, 0.027671f, -0.006275f, 0.015736f, 0.001445f, 0.004162f, -0.036386f, 0.000452f, -0.023300f, 0.018684f, 0.032509f, 0.010002f, 0.008134f, 0.001981f, 0.004834f, -0.019028f, 0.006649f, 0.010108f, -0.008501f, -0.002403f, -0.007539f, -0.004810f, 0.014637f, 0.000303f, 0.017763f, 0.054517f, 0.019889f, 0.005417f, -0.018768f, -0.017439f, -0.011318f, 0.010695f, -0.018582f, -0.001635f, -0.001720f, 0.003775f, 0.010468f, -0.010198f, -0.001946f, 0.010123f, 0.011112f, 0.002275f, 0.001876f, + 0.007557f, 0.009568f, 0.007991f, -0.000112f, -0.001791f, -0.001820f, 0.000831f, -0.003981f, -0.004960f, 0.004328f, -0.002514f, 0.006739f, -0.008279f, -0.002631f, 0.005706f, 0.004847f, -0.000502f, 0.004380f, -0.004266f, 0.001993f, 0.003000f, 0.004069f, -0.004681f, -0.004602f, 0.006464f, 0.004620f, 0.003626f, -0.001674f, -0.003266f, 0.001568f, -0.009214f, -0.002417f, 0.001472f, -0.004904f, 0.002237f, -0.003401f, -0.002399f, 0.001050f, 0.000744f, -0.000768f, -0.001829f, -0.006107f, 0.057718f, -0.030134f, -0.000119f, -0.014606f, -0.028201f, -0.037873f, 0.011411f, -0.011652f, 0.012039f, -0.035809f, 0.007877f, 0.013742f, 0.012422f, -0.014630f, -0.032832f, -0.025696f, -0.021479f, 0.000983f, -0.012212f, -0.023774f, -0.016164f, -0.007872f, -0.019311f, -0.013255f, 0.003980f, 0.025918f, -0.000038f, 0.004269f, -0.000292f, -0.021547f, 0.014273f, -0.001362f, 0.004599f, -0.004302f, -0.014113f, 0.013156f, -0.017749f, -0.024969f, 0.023506f, -0.024344f, 0.005487f, 0.000413f, -0.034484f, -0.020283f, 0.014220f, 0.000009f, 0.017361f, -0.010556f, -0.036677f, 0.000482f, 0.001795f, 0.014509f, 0.015320f, 0.035385f, + -0.019651f, -0.070972f, -0.024562f, -0.023793f, 0.016501f, -0.046022f, -0.015313f, -0.007152f, -0.042296f, -0.013623f, -0.000275f, -0.007513f, -0.007573f, 0.009966f, -0.011087f, -0.000385f, -0.010376f, 0.010684f, -0.024704f, 0.009702f, 0.020645f, -0.024817f, -0.012363f, 0.013176f, 0.010292f, 0.009101f, -0.025628f, 0.006836f, 0.000744f, -0.003040f, 0.014258f, -0.002835f, 0.011801f, 0.010692f, -0.001823f, 0.003772f, 0.002622f, -0.002496f, -0.008244f, 0.014889f, -0.004240f, -0.009363f, 0.000742f, 0.000255f, 0.008053f, 0.003357f, 0.000456f, 0.003032f, -0.007083f, -0.007024f, 0.001296f, 0.003353f, 0.005001f, 0.008820f, -0.000519f, 0.004393f, -0.000374f, 0.003963f, -0.008315f, -0.003134f, -0.005633f, -0.004917f, -0.000480f, -0.000521f, 0.003662f, -0.009252f, -0.004060f, -0.006751f, -0.004820f, -0.009717f, -0.012320f, -0.010672f, -0.000763f, -0.000340f, 0.001849f, -0.006290f, -0.008499f, -0.033016f, 0.013078f, 0.016328f, -0.005426f, -0.006363f, -0.016435f, -0.018173f, 0.042006f, 0.015281f, -0.039129f, 0.013547f, -0.021291f, -0.002050f, -0.019332f, -0.040263f, 0.011888f, -0.020997f, -0.008702f, 0.001637f, + 0.001263f, -0.010279f, -0.033949f, -0.021145f, 0.016802f, -0.020914f, -0.000467f, -0.018511f, -0.028213f, -0.011084f, 0.031584f, 0.004985f, 0.005736f, -0.027493f, -0.009054f, -0.005686f, -0.003424f, 0.011075f, 0.013950f, 0.017696f, 0.022171f, -0.010825f, 0.012578f, 0.004248f, -0.012523f, 0.007710f, -0.021163f, -0.018706f, -0.015882f, 0.006834f, -0.018370f, 0.000788f, -0.027721f, -0.024620f, -0.012397f, 0.028852f, 0.022867f, 0.021891f, 0.024536f, -0.022483f, 0.030690f, 0.000884f, 0.014287f, 0.041708f, -0.008323f, -0.007836f, 0.007100f, -0.020281f, 0.008601f, -0.009602f, -0.025714f, 0.003255f, 0.021568f, -0.025278f, -0.017603f, -0.003223f, 0.023168f, -0.019250f, 0.002511f, 0.006891f, 0.014071f, 0.003292f, -0.005348f, -0.013185f, 0.003840f, 0.009575f, -0.005006f, 0.001077f, -0.006387f, 0.001991f, -0.006050f, 0.002393f, 0.000772f, 0.003424f, -0.002074f, 0.002308f, 0.004982f, 0.011617f, -0.001148f, -0.000447f, 0.001323f, 0.005302f, -0.008405f, -0.003849f, -0.009287f, -0.002907f, -0.001805f, -0.011265f, 0.002447f, 0.009801f, -0.000540f, -0.013390f, -0.001876f, -0.001427f, -0.011086f, -0.013127f, + -0.018454f, -0.008047f, 0.007577f, 0.000923f, 0.005470f, -0.003109f, -0.003011f, -0.007027f, -0.000613f, -0.016818f, -0.002634f, 0.009632f, 0.016143f, -0.001097f, 0.005126f, -0.009685f, 0.001586f, -0.005893f, 0.008465f, 0.003246f, -0.015815f, -0.036873f, 0.042165f, -0.032952f, 0.043663f, 0.024439f, 0.016624f, 0.009346f, 0.017149f, 0.018636f, 0.017220f, 0.046934f, -0.016445f, 0.003308f, -0.003152f, -0.008101f, -0.001442f, 0.005818f, -0.004378f, 0.009029f, -0.003064f, 0.014680f, 0.012296f, -0.002644f, -0.008151f, -0.046783f, -0.016689f, -0.033934f, -0.001590f, 0.017891f, 0.018025f, 0.005742f, 0.009171f, 0.013489f, 0.011119f, 0.013075f, 0.033480f, 0.049977f, 0.033501f, 0.006764f, -0.006386f, -0.009653f, -0.014379f, 0.017488f, 0.017777f, 0.019971f, -0.014884f, -0.011701f, -0.018454f, -0.003041f, 0.024319f, 0.000239f, 0.029148f, -0.017693f, 0.015596f, 0.009421f, 0.026154f, -0.054743f, -0.039245f, -0.016052f, -0.022043f, -0.022504f, 0.006718f, -0.009183f, 0.034421f, 0.010235f, -0.038458f, -0.003161f, 0.062131f, -0.020952f, 0.019350f, -0.009387f, 0.025511f, -0.011894f, -0.007812f, 0.000926f, + -0.010597f, -0.013861f, -0.001039f, 0.010462f, 0.015340f, 0.010736f, -0.004080f, 0.012107f, -0.003261f, 0.005610f, -0.015883f, -0.010765f, 0.010106f, 0.006472f, -0.015971f, -0.006922f, -0.006807f, -0.002115f, 0.003912f, -0.004170f, -0.007857f, 0.003621f, 0.000658f, 0.002634f, -0.001305f, -0.004475f, 0.007018f, 0.002337f, -0.004064f, 0.009388f, -0.001366f, 0.002784f, -0.001803f, 0.011070f, -0.009438f, 0.009864f, 0.004254f, -0.009202f, 0.006043f, 0.000365f, 0.001568f, -0.009593f, -0.028180f, 0.010578f, 0.000176f, 0.002075f, -0.003292f, 0.010755f, -0.002670f, -0.004974f, 0.003357f, 0.008413f, 0.006872f, -0.004109f, 0.008537f, -0.026818f, -0.013343f, 0.022539f, 0.009937f, 0.016671f, 0.043205f, 0.003850f, 0.028921f, 0.042216f, 0.029357f, -0.018860f, -0.042613f, -0.001271f, -0.019485f, 0.046287f, 0.013421f, 0.036201f, -0.005009f, -0.019141f, -0.006982f, -0.020901f, 0.008448f, -0.016042f, 0.002082f, -0.017887f, 0.009523f, -0.013021f, -0.005437f, -0.028828f, -0.028632f, -0.002674f, -0.041070f, 0.022729f, 0.015640f, -0.012142f, 0.021185f, -0.009856f, 0.008294f, 0.023655f, -0.025946f, -0.033941f, + 0.006151f, -0.007271f, 0.057367f, 0.024526f, -0.062802f, -0.016788f, -0.017783f, -0.032249f, -0.034279f, -0.070040f, 0.012432f, -0.024975f, -0.006545f, 0.010260f, 0.002593f, 0.014653f, -0.002755f, -0.008116f, -0.053203f, 0.006528f, -0.024179f, 0.006740f, 0.031227f, 0.006773f, 0.020940f, -0.031509f, -0.042093f, 0.008717f, 0.026103f, 0.017784f, 0.009802f, 0.016910f, 0.027130f, 0.034163f, 0.034901f, -0.030814f, -0.018693f, -0.022134f, -0.016005f, -0.025873f, 0.036808f, 0.021816f, 0.020742f, 0.005914f, 0.015854f, 0.013839f, -0.001325f, 0.019490f, -0.029702f, -0.010193f, -0.003578f, 0.002688f, -0.006462f, -0.020783f, 0.001157f, -0.003996f, 0.002690f, 0.007101f, 0.021460f, 0.001470f, 0.010009f, 0.010370f, 0.001551f, 0.010998f, 0.000289f, -0.006192f, 0.001243f, -0.015839f, -0.006636f, 0.008931f, 0.012326f, 0.004136f, 0.002185f, -0.019414f, -0.002007f, 0.001033f, -0.009595f, -0.006233f, 0.002823f, 0.006688f, -0.018241f, -0.019693f, -0.009267f, 0.007178f, 0.005696f, 0.010626f, 0.002317f, -0.006001f, 0.004355f, -0.020346f, -0.018618f, 0.076054f, 0.050246f, 0.069783f, 0.004561f, -0.013791f, + -0.047348f, -0.013943f, 0.007964f, 0.011032f, -0.011260f, -0.036586f, -0.013200f, 0.060294f, 0.024954f, -0.008303f, 0.018493f, -0.001329f, -0.022104f, -0.006437f, -0.014411f, 0.041117f, -0.003121f, 0.002440f, 0.017771f, 0.001194f, 0.020162f, -0.000182f, 0.028525f, -0.026187f, 0.032862f, 0.006673f, -0.015248f, -0.009224f, -0.016894f, 0.029658f, -0.041020f, -0.044315f, 0.028081f, 0.046395f, 0.002216f, 0.032033f, 0.044064f, -0.049549f, 0.016540f, 0.010150f, -0.002681f, -0.000432f, 0.007402f, -0.018588f, 0.034607f, -0.020959f, -0.016631f, 0.013981f, 0.001803f, -0.003732f, -0.007997f, -0.010319f, 0.005029f, -0.032728f, -0.009763f, 0.026383f, -0.032257f, -0.007429f, -0.021774f, 0.000830f, 0.065410f, -0.020524f, 0.004247f, 0.017500f, 0.000368f, -0.015041f, -0.040785f, 0.039902f, 0.018657f, -0.082230f, 0.020426f, 0.020705f, 0.015350f, -0.018434f, -0.008543f, 0.042016f, 0.001933f, 0.003102f, 0.010819f, -0.029214f, 0.001166f, 0.018599f, -0.007548f, 0.010750f, -0.002289f, -0.009492f, -0.024314f, 0.003718f, -0.003156f, 0.022585f, -0.002057f, -0.000957f, -0.016177f, 0.017893f, -0.005973f, -0.006216f, + -0.025664f, -0.012922f, 0.009086f, -0.016552f, 0.001416f, -0.008158f, 0.010332f, -0.009692f, -0.020636f, 0.010449f, -0.022233f, -0.006110f, -0.010079f, 0.001040f, 0.001405f, -0.008367f, 0.022257f, -0.002751f, 0.029995f, 0.018264f, -0.002962f, 0.003141f, 0.019211f, -0.013289f, 0.003484f, 0.002271f, 0.018442f, -0.016656f, -0.009817f, 0.000846f, -0.033964f, -0.081399f, 0.072416f, 0.043166f, 0.022960f, 0.016146f, 0.035775f, -0.082143f, 0.033728f, 0.037932f, 0.016247f, -0.052587f, 0.029263f, 0.053161f, 0.024643f, 0.058619f, 0.021386f, 0.001002f, -0.002323f, -0.001839f, -0.009981f, 0.024838f, 0.041653f, 0.039667f, 0.013871f, -0.012190f, -0.020685f, 0.004945f, -0.018832f, -0.022055f, 0.023205f, 0.015952f, 0.004422f, -0.022104f, -0.021501f, -0.004728f, -0.018692f, 0.009534f, 0.047872f, -0.008514f, -0.015473f, 0.016153f, 0.008679f, 0.014179f, 0.016721f, -0.003666f, -0.009657f, 0.038456f, 0.025450f, 0.012570f, 0.016976f, -0.003104f, -0.038217f, 0.008862f, 0.025449f, 0.003294f, -0.028444f, 0.038062f, 0.009930f, 0.052947f, 0.001969f, 0.047597f, 0.005093f, -0.015606f, -0.005065f, 0.011414f, + 0.067765f, -0.008564f, 0.024360f, 0.016695f, 0.032020f, 0.016770f, 0.000151f, -0.002060f, 0.020891f, 0.096412f, 0.004514f, 0.038679f, -0.032684f, -0.024415f, 0.012252f, 0.015158f, 0.018797f, 0.007727f, 0.003089f, -0.047387f, -0.018741f, -0.049688f, 0.002716f, -0.008536f, -0.016407f, -0.013897f, -0.005519f, -0.020965f, 0.002639f, -0.002178f, -0.022035f, 0.015757f, -0.025664f, -0.012473f, -0.023171f, -0.015851f, -0.001518f, 0.002547f, -0.018533f, -0.021519f, 0.005181f, 0.013673f, 0.015980f, -0.003255f, -0.006107f, -0.027684f, -0.036178f, 0.003614f, 0.004436f, -0.016498f, 0.032941f, 0.031865f, 0.047168f, 0.016538f, -0.010365f, 0.006441f, 0.014580f, 0.017848f, 0.021442f, 0.003160f, -0.022333f, 0.005635f, 0.028665f, 0.014672f, 0.001496f, 0.011463f, -0.053035f, 0.058165f, -0.000864f, 0.051481f, 0.001295f, 0.003504f, -0.046703f, -0.014357f, -0.020995f, 0.035714f, 0.009120f, 0.015833f, 0.009477f, -0.035880f, 0.003596f, 0.002882f, -0.031466f, -0.045109f, -0.046045f, 0.015615f, -0.017083f, 0.041992f, 0.002473f, -0.013323f, -0.010840f, 0.009053f, -0.016195f, 0.002704f, 0.012378f, -0.017677f, + 0.009994f, 0.014142f, 0.004900f, 0.004029f, 0.031840f, 0.053382f, -0.010380f, -0.000452f, 0.026917f, 0.021937f, 0.032227f, -0.023883f, -0.009254f, 0.009637f, -0.031859f, 0.003065f, 0.002880f, -0.042499f, 0.054813f, -0.002752f, 0.027724f, 0.023756f, 0.016839f, -0.032371f, 0.003188f, 0.027496f, -0.022312f, 0.049002f, 0.013633f, -0.018065f, 0.040759f, 0.030495f, 0.021521f, -0.068494f, -0.013759f, 0.013470f, -0.023168f, 0.003527f, -0.037944f, -0.009709f, -0.057592f, -0.016707f, -0.008636f, -0.016145f, -0.063828f, -0.006625f, -0.017268f, 0.096024f, -0.013631f, 0.019382f, -0.009652f, 0.015171f, -0.007836f, -0.015943f, 0.010652f, -0.013416f, -0.001771f, -0.007339f, 0.026124f, 0.009025f, 0.011648f, -0.041830f, -0.036881f, -0.028050f, -0.011261f, 0.007072f, -0.051940f, -0.008707f, -0.003885f, 0.003612f, 0.019459f, 0.014169f, -0.001222f, 0.019955f, -0.017939f, 0.000091f, 0.001466f, -0.030427f, -0.041183f, 0.007856f, -0.011770f, -0.038912f, -0.010176f, -0.018525f, 0.003043f, -0.041601f, -0.004279f, -0.018386f, 0.024776f, 0.000005f, -0.017146f, -0.006823f, 0.008046f, 0.009204f, -0.003466f, 0.018172f, + -0.018333f, -0.012145f, 0.024614f, 0.022533f, 0.040811f, -0.013944f, -0.002999f, -0.005787f, 0.010933f, 0.029041f, 0.025400f, 0.018685f, -0.015139f, 0.011337f, 0.031944f, 0.030790f, 0.013064f, -0.039193f, -0.045299f, 0.018833f, -0.006978f, 0.013371f, -0.009034f, 0.036802f, -0.028982f, -0.006714f, -0.010550f, 0.031981f, -0.025550f, 0.056744f, 0.070033f, 0.071378f, 0.003624f, -0.014309f, 0.010913f, -0.010297f, 0.016868f, -0.003990f, -0.001214f, -0.022091f, -0.058824f, -0.020239f, -0.056366f, 0.030935f, 0.029181f, -0.035162f, -0.026424f, -0.035252f, -0.016835f, -0.005889f, 0.074967f, -0.000046f, -0.039429f, -0.042464f, -0.003283f, 0.052024f, 0.024539f, -0.107126f, -0.022431f, -0.019727f, 0.013203f, 0.038949f, -0.046871f, -0.015570f, -0.028215f, 0.011095f, -0.063675f, 0.030326f, -0.011242f, -0.002396f, 0.016722f, 0.001618f, -0.031555f, 0.061134f, -0.006958f, 0.028572f, 0.065771f, 0.135328f, 0.081024f, -0.002979f, 0.045205f, 0.068530f, 0.088695f, 0.095919f, 0.027020f, 0.058369f, 0.016279f, -0.000230f, 0.035747f, -0.029680f, 0.059099f, 0.024629f, -0.026681f, -0.090152f, -0.065538f, 0.007449f, + -0.026025f, -0.019298f, -0.017119f, -0.010898f, -0.011601f, -0.037743f, -0.024682f, 0.000343f, -0.006313f, -0.003041f, -0.012182f, -0.004286f, -0.019748f, 0.022728f, -0.040237f, -0.017255f, 0.010893f, 0.006264f, 0.002993f, -0.011277f, -0.012968f, -0.008047f, 0.007429f, -0.007368f, 0.019881f, -0.025058f, -0.030669f, -0.031236f, -0.019144f, 0.021924f, 0.025246f, -0.010723f, -0.005016f, 0.008321f, -0.005437f, 0.041682f, 0.008768f, 0.002687f, 0.033754f, 0.020387f, 0.019106f, 0.047460f, 0.031434f, 0.035432f, 0.010924f, 0.016502f, 0.039622f, 0.014360f, 0.030672f, -0.029720f, 0.016102f, -0.014001f, -0.030893f, 0.034621f, -0.044637f, 0.073519f, -0.009169f, -0.014074f, 0.000944f, 0.058430f, -0.039778f, -0.007468f, -0.002124f, 0.000272f, 0.020989f, -0.015791f, 0.030454f, 0.010162f, -0.006183f, 0.006605f, 0.003169f, 0.023663f, -0.074523f, -0.023964f, -0.002625f, 0.007259f, -0.007684f, -0.054645f, 0.044010f, -0.003073f, 0.005731f, 0.015434f, -0.035589f, -0.016714f, -0.082138f, 0.021021f, -0.019488f, 0.015010f, 0.059431f, -0.017077f, 0.012222f, -0.008402f, 0.028186f, -0.049572f, -0.065657f, 0.056529f, + -0.005669f, 0.004180f, 0.009413f, 0.056839f, 0.041692f, 0.049219f, -0.001138f, -0.067693f, 0.039433f, 0.017850f, -0.016075f, -0.024478f, 0.037697f, -0.007765f, 0.047740f, 0.078556f, 0.061473f, 0.009669f, 0.005149f, 0.057710f, -0.011780f, 0.017119f, 0.047976f, -0.033696f, 0.055516f, 0.033215f, 0.019672f, -0.040297f, -0.019644f, -0.053482f, -0.001703f, 0.017106f, 0.078093f, 0.032020f, -0.072807f, -0.007666f, 0.046863f, -0.007866f, 0.022760f, 0.030496f, -0.051636f, -0.013746f, 0.025078f, 0.005045f, 0.013995f, -0.023547f, 0.016666f, 0.027308f, 0.003644f, -0.000660f, 0.041493f, 0.006833f, -0.008965f, -0.011889f, 0.013783f, -0.004793f, 0.022326f, 0.002374f, 0.016916f, 0.018038f, -0.002869f, -0.021099f, 0.040934f, -0.007078f, -0.012469f, -0.003859f, -0.027665f, -0.029155f, -0.018224f, -0.020597f, 0.013405f, 0.022918f, -0.024190f, -0.022151f, 0.005005f, 0.035039f, -0.052338f, -0.014093f, 0.020472f, -0.007605f, 0.000343f, -0.008550f, -0.005444f, -0.039164f, -0.000273f, -0.011502f, 0.010736f, 0.001446f, 0.006586f, -0.001052f, 0.003603f, -0.009411f, 0.016384f, 0.007721f, -0.004323f, -0.009224f, + 0.006949f, 0.000812f, -0.002926f, -0.102741f, 0.023543f, -0.017005f, -0.004027f, 0.080231f, 0.034495f, -0.025157f, -0.019473f, -0.000305f, -0.051889f, -0.063582f, 0.005387f, 0.000550f, -0.035764f, 0.037960f, 0.004615f, -0.036702f, 0.023208f, 0.069006f, -0.009231f, -0.039771f, 0.024988f, -0.023426f, -0.025502f, 0.012868f, 0.056072f, -0.018264f, 0.008229f, 0.015354f, -0.017266f, -0.041748f, -0.027358f, 0.055331f, 0.019499f, -0.054595f, 0.046707f, 0.018285f, -0.037374f, -0.019576f, 0.076903f, -0.025036f, -0.058974f, -0.030349f, 0.102207f, -0.100910f, -0.046729f, 0.059820f, -0.027065f, -0.032480f, -0.096098f, 0.074945f, -0.061523f, 0.021992f, 0.003222f, -0.011591f, -0.108523f, -0.032135f, 0.092936f, 0.058535f, -0.073412f, -0.020166f, -0.031776f, -0.015105f, 0.015086f, 0.020120f, 0.024218f, -0.128300f, 0.070175f, 0.053719f, 0.056477f, 0.000810f, 0.029581f, -0.062818f, -0.055751f, 0.109683f, 0.045069f, 0.012085f, 0.044232f, -0.059155f, 0.011932f, -0.026219f, 0.028275f, -0.016039f, 0.077056f, -0.031484f, -0.026730f, 0.010594f, 0.009344f, -0.029227f, 0.017589f, 0.008371f, 0.006609f, -0.005594f, + 0.003955f, 0.006094f, 0.006325f, -0.007323f, -0.004112f, 0.016019f, 0.000986f, -0.008672f, 0.033759f, 0.009811f, -0.029901f, 0.003174f, 0.028968f, 0.007405f, -0.028437f, 0.038092f, 0.068705f, -0.033887f, -0.039294f, -0.010827f, -0.008814f, 0.023132f, 0.050354f, 0.015072f, -0.046480f, -0.015677f, -0.006707f, 0.006754f, 0.014218f, -0.008022f, 0.020637f, -0.015057f, -0.001716f, 0.011827f, -0.019864f, -0.084890f, 0.014546f, 0.105676f, 0.032932f, 0.011211f, 0.002749f, 0.007800f, 0.045235f, 0.061977f, -0.014360f, 0.011451f, 0.015920f, -0.010857f, 0.037327f, -0.019921f, -0.005457f, -0.015118f, 0.028642f, 0.021213f, -0.011913f, 0.019488f, -0.028381f, -0.023178f, 0.028601f, -0.018662f, 0.031445f, -0.021243f, -0.009507f, -0.000799f, 0.017120f, -0.001264f, 0.012700f, 0.005019f, 0.032029f, -0.023214f, -0.004758f, 0.000376f, -0.012957f, 0.030882f, 0.026804f, -0.022464f, -0.008056f, -0.013881f, 0.006992f, -0.028927f, 0.015350f, 0.008667f, 0.014079f, -0.011679f, -0.008863f, 0.035175f, -0.042657f, -0.007553f, 0.017789f, -0.011735f, -0.007878f, 0.018302f, -0.052388f, 0.012410f, -0.019055f, 0.002921f, + -0.018661f, 0.044973f, -0.014851f, -0.019718f, 0.018407f, -0.010465f, -0.029755f, 0.057252f, -0.001729f, 0.005683f, -0.012981f, -0.022329f, -0.026214f, 0.028786f, -0.032702f, -0.015901f, 0.033003f, -0.045432f, -0.019839f, 0.005639f, -0.004377f, 0.005358f, -0.000844f, 0.006263f, 0.020012f, -0.007430f, 0.007766f, -0.009413f, 0.021010f, 0.011396f, -0.001024f, 0.001610f, 0.012754f, -0.011493f, 0.009238f, 0.001348f, 0.010175f, -0.004829f, 0.015883f, -0.008327f, 0.004189f, -0.014095f, -0.012133f, -0.019190f, 0.003440f, 0.000953f, 0.006259f, -0.009482f, 0.021176f, -0.007184f, -0.003759f, 0.018098f, 0.015996f, 0.008477f, -0.007580f, -0.012397f, 0.010892f, 0.014415f, 0.009036f, 0.006150f, -0.000283f, 0.013025f, 0.014187f, 0.006181f, 0.012041f, 0.001471f, -0.009484f, -0.000560f, 0.027806f, -0.078766f, -0.222881f, -0.183096f, 0.097003f, 0.027909f, 0.221817f, 0.396187f, 0.058970f, 0.124989f, 0.045574f, -0.315787f, -0.099749f, -0.214194f, -0.258827f, 0.007385f, 0.041511f, -0.107928f, 0.156700f, 0.204987f, 0.115160f, 0.326866f, 0.188615f, -0.041956f, -0.077401f, -0.151555f, -0.294972f, -0.232998f, + -0.068531f, -0.207767f, -0.028793f, 0.179395f, 0.030120f, 0.041805f, 0.271284f, 0.138361f, 0.085733f, 0.282713f, 0.043734f, -0.077985f, 0.110693f, -0.147995f, -0.293031f, -0.122669f, -0.247196f, -0.309583f, -0.004330f, -0.064631f, -0.081297f, 0.206225f, 0.227448f, 0.144625f, 0.343071f, 0.276658f, 0.130714f, 0.118034f, 0.068547f, -0.229108f, -0.210548f, -0.266904f, -0.352188f, -0.282568f, -0.119014f, -0.081923f, 0.007449f, 0.202574f, 0.246576f, 0.257858f, 0.247433f, 0.229054f, 0.049088f, 0.004218f, -0.038686f, -0.174673f, -0.191117f, -0.110626f, -0.200408f, -0.084475f, 0.017728f, -0.043834f, 0.100905f, 0.181115f, 0.055623f, 0.076477f, 0.034271f, -0.049534f, -0.030634f, -0.075793f, -0.098298f, -0.011922f, 0.027937f, 0.000685f, 0.081492f, 0.074912f, 0.008745f, 0.072103f, 0.000250f, -0.091495f, 0.080882f, 0.024171f, -0.081046f, 0.057000f, -0.059974f, -0.122271f, 0.056013f, -0.087067f, -0.215049f, 0.003226f, -0.094546f, -0.062868f, 0.213583f, 0.096355f, 0.101666f, 0.305073f, 0.202613f, 0.112099f, 0.133470f, -0.033472f, -0.192769f, -0.245569f, -0.332876f, -0.368773f, -0.233630f, -0.149725f, + -0.025589f, 0.139843f, 0.312398f, 0.344267f, 0.319715f, 0.332304f, 0.178061f, 0.007648f, -0.084785f, -0.219722f, -0.280258f, -0.182138f, -0.202495f, -0.162070f, -0.032505f, 0.005109f, 0.021393f, 0.078365f, 0.067351f, 0.057841f, 0.104741f, 0.103386f, 0.088057f, 0.102795f, 0.071908f, 0.022892f, -0.008239f, -0.046474f, -0.102257f, -0.113680f, -0.095060f, -0.101783f, -0.074604f, -0.040918f, -0.005836f, 0.030108f, 0.076044f, 0.082254f, 0.076179f, 0.069149f, 0.048776f, 0.017886f, 0.001523f, -0.006888f, -0.029151f, -0.030213f, -0.018243f, -0.022897f, -0.026586f, -0.018826f, -0.029239f, -0.026496f, 0.000461f, 0.002563f, 0.000206f, 0.009942f, 0.004742f, 0.005512f, 0.022852f, 0.023169f, 0.025318f, 0.029101f, 0.015654f, 0.004398f, 0.000986f, -0.008758f, -0.018285f, -0.023681f, -0.026647f, -0.027485f, -0.019415f, -0.008994f, -0.000583f, 0.007448f, 0.015774f, 0.016516f, 0.017612f, 0.017277f, 0.009381f, 0.000331f, -0.001767f, -0.007226f, -0.008463f, -0.006208f, -0.001942f, 0.001610f, 0.004828f, 0.005114f, 0.003933f, 0.000857f, -0.004074f, -0.007610f, -0.008363f, -0.009062f, -0.008766f, -0.006687f, + -0.002614f, 0.003339f, 0.007396f, 0.008558f, 0.010246f, 0.010955f, 0.008545f, 0.005875f, 0.002737f, -0.001285f, -0.003912f, -0.005533f, -0.006673f, -0.006140f, -0.004502f, -0.003017f, -0.001164f, 0.000721f, 0.001849f, 0.002426f}, + {-0.019615f, -0.023891f, 0.012167f, -0.004311f, 0.010651f, -0.005174f, -0.005291f, -0.010646f, 0.002607f, 0.002350f, -0.000400f, 0.000250f, -0.001122f, -0.008126f, -0.000873f, -0.004615f, -0.005314f, -0.005037f, -0.000116f, 0.000691f, -0.000329f, -0.000849f, 0.004148f, -0.001056f, -0.012328f, 0.007794f, 0.003918f, -0.004155f, 0.001320f, -0.000048f, 0.000213f, 0.001815f, 0.008058f, -0.004374f, 0.000552f, -0.013992f, 0.007089f, 0.001454f, 0.003245f, 0.004931f, 0.007978f, -0.004347f, -0.003278f, -0.001529f, -0.006992f, 0.000635f, -0.000984f, 0.006180f, -0.003207f, -0.000352f, -0.003342f, -0.003855f, 0.007525f, -0.005545f, -0.002632f, 0.000764f, -0.005011f, 0.004317f, -0.000108f, -0.002328f, 0.004686f, 0.008509f, 0.000612f, -0.000265f, -0.001103f, 0.007282f, -0.007093f, 0.000125f, -0.001038f, 0.003839f, -0.001683f, -0.003228f, 0.007938f, -0.000080f, 0.001742f, -0.002123f, 0.001715f, 0.004281f, -0.003300f, -0.004678f, 0.000326f, 0.004181f, 0.007012f, -0.003063f, -0.002026f, 0.001760f, 0.000462f, 0.001113f, -0.003090f, -0.000971f, 0.001983f, -0.000375f, 0.001420f, -0.002460f, -0.000693f, -0.001499f, + -0.002078f, -0.001519f, -0.001368f, 0.001151f, 0.000285f, -0.001050f, 0.001196f, 0.000808f, -0.000903f, -0.000262f, -0.000154f, -0.001316f, -0.002355f, -0.000643f, 0.000093f, 0.000549f, 0.001419f, -0.000140f, 0.000951f, 0.000539f, -0.001060f, 0.001017f, -0.028553f, 0.004886f, 0.003403f, 0.010046f, -0.003902f, 0.003065f, 0.011671f, -0.004481f, 0.003207f, -0.007036f, -0.010348f, 0.003826f, -0.007038f, -0.008025f, -0.008064f, 0.002467f, 0.003103f, -0.013758f, 0.008126f, 0.005409f, -0.002329f, -0.005015f, 0.003243f, -0.001219f, -0.003125f, 0.001035f, 0.004587f, 0.003419f, 0.007316f, 0.001448f, -0.002210f, 0.007556f, -0.003769f, 0.016436f, 0.003704f, 0.010143f, 0.003905f, 0.008905f, 0.003957f, 0.006152f, 0.003316f, 0.000775f, 0.000349f, 0.012453f, 0.002113f, -0.001944f, 0.000829f, 0.006600f, 0.004859f, 0.000763f, -0.000549f, -0.002500f, 0.001388f, 0.015188f, 0.004346f, 0.007049f, -0.007310f, -0.003710f, -0.007710f, -0.004822f, -0.007485f, 0.005680f, 0.003554f, -0.004728f, -0.003407f, 0.003429f, -0.003567f, 0.003821f, -0.001679f, -0.001075f, -0.005179f, -0.008672f, 0.003759f, -0.014122f, + -0.002005f, -0.002967f, -0.003591f, 0.000833f, -0.003313f, 0.000728f, 0.005340f, 0.002651f, -0.003642f, 0.000726f, -0.002890f, -0.006111f, -0.001004f, 0.003030f, -0.000308f, -0.004701f, 0.001730f, 0.000944f, 0.001806f, 0.003337f, 0.000122f, 0.000530f, -0.002250f, -0.001286f, -0.000337f, 0.000036f, 0.001169f, -0.002506f, -0.002214f, 0.000241f, 0.015928f, 0.022006f, -0.006950f, 0.005801f, -0.011170f, -0.000742f, 0.000499f, 0.028162f, -0.003055f, -0.007639f, -0.012364f, 0.000130f, 0.007968f, 0.012871f, -0.003095f, -0.017249f, -0.005076f, -0.006672f, -0.004827f, 0.005657f, -0.001412f, 0.010724f, 0.001055f, -0.006305f, -0.013985f, 0.003996f, -0.001454f, 0.003061f, -0.001826f, 0.001410f, 0.006618f, 0.002334f, -0.017555f, 0.001943f, 0.011034f, 0.005354f, 0.001218f, 0.002528f, -0.002954f, 0.007604f, -0.010445f, -0.001155f, 0.008327f, -0.006005f, -0.000158f, 0.013635f, -0.006528f, -0.000803f, -0.004832f, 0.008330f, -0.009080f, -0.006772f, 0.003968f, -0.009403f, -0.004721f, 0.011885f, 0.006917f, -0.010910f, -0.004128f, -0.001769f, -0.002831f, -0.005057f, 0.003704f, -0.004363f, 0.004272f, -0.000286f, + 0.000499f, 0.001787f, 0.008925f, -0.001188f, 0.012365f, 0.006320f, -0.009780f, -0.004587f, -0.004856f, 0.007369f, 0.002081f, -0.000662f, -0.004026f, 0.009920f, 0.003720f, -0.000343f, -0.000379f, -0.002674f, -0.002474f, 0.002835f, 0.000999f, 0.003161f, 0.007699f, 0.002700f, -0.000586f, 0.000359f, 0.000473f, 0.002394f, -0.000684f, 0.000815f, 0.003596f, 0.000661f, 0.004489f, -0.000001f, 0.001485f, 0.002224f, 0.002689f, 0.000867f, 0.001644f, 0.001912f, 0.001541f, 0.002517f, -0.000980f, 0.000667f, 0.001671f, 0.002580f, -0.000397f, -0.002239f, -0.002612f, 0.000446f, 0.052911f, -0.019509f, 0.010762f, -0.014894f, -0.001516f, 0.000553f, -0.001050f, -0.007885f, 0.004370f, 0.006109f, 0.001520f, -0.005731f, -0.012209f, -0.000438f, 0.007529f, 0.005338f, -0.005342f, -0.009206f, -0.000697f, 0.008276f, 0.015132f, -0.008124f, -0.001046f, -0.006131f, -0.013154f, 0.001489f, -0.006592f, 0.004018f, -0.004866f, 0.010280f, -0.017977f, 0.012181f, -0.000746f, -0.010728f, 0.002669f, 0.004524f, -0.001216f, -0.005681f, 0.000408f, 0.014105f, -0.000475f, 0.002323f, -0.001936f, 0.005398f, 0.002547f, -0.003332f, + -0.005237f, -0.011598f, 0.007579f, -0.002432f, -0.003351f, 0.004453f, 0.000141f, -0.019497f, 0.015040f, -0.020986f, -0.012043f, -0.014867f, 0.003267f, -0.001754f, 0.008971f, -0.004879f, 0.004803f, -0.008959f, 0.004369f, -0.002356f, -0.003590f, -0.009885f, 0.006112f, 0.006928f, 0.011946f, -0.002908f, -0.001067f, 0.003198f, -0.003539f, -0.002154f, 0.002358f, 0.006843f, -0.009016f, 0.004469f, 0.006601f, 0.007229f, -0.011442f, -0.009439f, 0.004021f, -0.005913f, 0.003079f, -0.000130f, -0.000614f, 0.000980f, 0.001526f, -0.000524f, 0.002797f, -0.003390f, 0.001711f, -0.001079f, 0.006814f, 0.000362f, 0.001731f, 0.001476f, 0.000513f, -0.002694f, -0.000147f, 0.000616f, -0.000727f, -0.041714f, 0.004256f, 0.000444f, -0.003540f, -0.006432f, 0.007302f, -0.005656f, 0.004860f, -0.001495f, -0.000069f, 0.006748f, 0.008784f, -0.005396f, 0.006471f, -0.001881f, -0.003562f, -0.011697f, -0.000569f, -0.015806f, -0.011604f, 0.013925f, 0.004972f, -0.005382f, -0.001964f, -0.001624f, 0.009666f, 0.005107f, -0.004961f, 0.008817f, 0.005867f, 0.003465f, 0.003055f, 0.003761f, 0.006716f, 0.005787f, 0.005707f, 0.015576f, + 0.014014f, 0.006066f, 0.001562f, -0.009654f, 0.010778f, -0.014351f, 0.002852f, -0.003983f, 0.011675f, -0.008770f, -0.011425f, 0.019682f, -0.004566f, -0.010508f, -0.009380f, 0.014657f, 0.008997f, 0.000565f, 0.007537f, 0.010649f, 0.004887f, 0.017205f, -0.001010f, -0.002681f, 0.009761f, 0.005990f, 0.000587f, 0.000418f, -0.008922f, 0.005392f, 0.005588f, 0.013899f, 0.005658f, 0.008668f, -0.005314f, -0.007090f, -0.015122f, -0.003443f, -0.008173f, -0.006475f, -0.006880f, 0.007683f, -0.000257f, 0.000626f, -0.004419f, -0.005091f, -0.001410f, -0.004474f, 0.001414f, -0.003002f, -0.005003f, 0.002096f, -0.000479f, 0.000226f, -0.004681f, -0.000646f, 0.000210f, -0.005874f, -0.000795f, -0.001369f, 0.000411f, -0.002617f, -0.003055f, -0.001864f, -0.001122f, 0.000147f, -0.000969f, 0.000978f, -0.001365f, 0.001695f, 0.000417f, 0.001504f, 0.003265f, -0.000702f, 0.003448f, 0.000747f, 0.002273f, -0.001526f, 0.000724f, -0.002916f, -0.001079f, -0.000452f, -0.003543f, -0.001056f, -0.001728f, -0.055382f, 0.015137f, -0.011652f, -0.017333f, -0.017136f, 0.010985f, -0.012663f, 0.009729f, -0.015963f, 0.009127f, 0.007827f, + 0.004895f, -0.016816f, 0.011885f, 0.000010f, 0.007280f, -0.013895f, 0.008076f, 0.016912f, 0.012977f, 0.000679f, -0.005765f, 0.002565f, -0.003392f, -0.017782f, -0.003432f, -0.008433f, 0.004333f, -0.011104f, 0.009937f, 0.009753f, -0.003554f, -0.000202f, 0.013592f, -0.002717f, 0.009290f, -0.007087f, -0.011449f, 0.006294f, 0.000010f, 0.006505f, 0.016670f, 0.010233f, -0.000402f, -0.028477f, -0.013545f, -0.003768f, 0.004195f, -0.004198f, 0.016015f, -0.024712f, 0.008103f, 0.003600f, -0.000040f, 0.008032f, -0.003018f, 0.012324f, -0.025922f, -0.011982f, 0.010337f, -0.026049f, -0.004658f, 0.012473f, 0.004601f, -0.005587f, -0.017308f, 0.006721f, 0.011516f, 0.008511f, -0.002918f, -0.018166f, -0.001375f, 0.000354f, -0.001876f, -0.000767f, -0.008791f, 0.004294f, -0.014189f, 0.009069f, 0.001455f, -0.008328f, 0.001898f, -0.010061f, 0.000989f, -0.012076f, -0.003233f, 0.004523f, 0.004739f, 0.000615f, -0.000976f, -0.004022f, -0.002989f, 0.001073f, -0.007017f, 0.006030f, 0.000652f, -0.003281f, 0.000228f, -0.006021f, -0.004713f, 0.001604f, -0.002361f, 0.003594f, -0.003080f, -0.001619f, -0.001949f, -0.002151f, + -0.004016f, -0.000499f, -0.002152f, -0.000724f, 0.001381f, -0.000771f, -0.001701f, 0.001763f, -0.000566f, -0.001416f, -0.001467f, -0.003526f, -0.002422f, 0.000711f, 0.002175f, -0.000355f, -0.026151f, 0.002817f, 0.004350f, 0.020478f, -0.019354f, 0.022363f, 0.006328f, -0.001804f, -0.005268f, -0.002411f, 0.002059f, -0.016351f, -0.003149f, 0.005244f, -0.005392f, -0.009594f, -0.002614f, 0.015474f, -0.016002f, -0.003471f, 0.015985f, 0.000079f, -0.006372f, 0.005654f, -0.007813f, 0.011790f, 0.005151f, -0.000141f, 0.005863f, -0.006828f, -0.010796f, -0.000759f, 0.000791f, 0.008826f, -0.018911f, -0.010168f, -0.008366f, -0.005820f, -0.005629f, -0.005709f, 0.002796f, 0.000939f, 0.001533f, -0.014074f, -0.014506f, -0.011473f, 0.000379f, -0.018083f, -0.010036f, 0.010853f, -0.007371f, 0.002409f, 0.001113f, -0.000327f, 0.004481f, 0.006444f, 0.006082f, 0.007293f, 0.010634f, -0.001874f, 0.011507f, -0.000726f, 0.005796f, -0.000952f, -0.007465f, -0.000426f, -0.012012f, 0.007407f, -0.014052f, 0.013088f, -0.015676f, -0.000225f, -0.016169f, 0.001543f, -0.016248f, -0.015563f, 0.007318f, 0.021462f, 0.006418f, -0.013818f, + 0.009810f, 0.000014f, -0.006172f, -0.003636f, -0.006466f, 0.008546f, 0.007292f, 0.010507f, 0.001828f, 0.008196f, -0.006973f, -0.000727f, 0.007952f, 0.000960f, 0.002411f, 0.001598f, -0.003965f, 0.004822f, -0.000503f, 0.001807f, 0.007036f, 0.002101f, -0.001840f, -0.004228f, -0.002024f, 0.002949f, 0.002829f, 0.002335f, 0.000748f, -0.003291f, 0.000181f, -0.000687f, -0.007520f, 0.007247f, 0.000758f, 0.002661f, 0.000261f, -0.001752f, -0.003604f, 0.002560f, -0.003674f, -0.001704f, 0.072327f, 0.000499f, -0.021341f, 0.002933f, -0.011761f, 0.028616f, -0.005126f, 0.007789f, 0.001737f, 0.001039f, -0.025858f, -0.013419f, 0.013738f, 0.012052f, -0.020461f, -0.003887f, -0.001002f, 0.017504f, 0.008390f, 0.006440f, 0.017119f, 0.002399f, 0.000751f, 0.014849f, -0.005717f, -0.023509f, 0.003023f, 0.017353f, 0.010078f, -0.007057f, -0.000053f, 0.011996f, 0.007121f, 0.003026f, -0.001070f, -0.013341f, 0.005910f, -0.014479f, 0.000992f, -0.026951f, 0.006559f, 0.007847f, -0.002572f, -0.012588f, 0.016470f, 0.008538f, -0.003923f, 0.012793f, 0.005633f, -0.011417f, 0.019852f, 0.001846f, -0.007617f, 0.004369f, + 0.020363f, 0.002900f, -0.000968f, -0.017685f, -0.010553f, 0.002098f, 0.006614f, 0.023365f, -0.008251f, -0.009725f, 0.001616f, 0.012605f, -0.008798f, -0.010604f, -0.001368f, 0.016897f, 0.011887f, -0.004620f, -0.013671f, -0.001018f, 0.014596f, -0.006312f, 0.030795f, 0.006487f, 0.004217f, -0.016314f, 0.013120f, 0.000503f, -0.003912f, -0.008444f, 0.000342f, -0.004855f, 0.000376f, 0.019012f, 0.008349f, 0.006730f, 0.003226f, 0.001929f, -0.000146f, -0.001560f, 0.001321f, 0.003586f, 0.006501f, 0.000779f, 0.000782f, 0.002266f, -0.005769f, -0.000181f, 0.001815f, -0.001486f, 0.005587f, -0.004595f, -0.000607f, -0.002399f, 0.001900f, 0.009975f, 0.003020f, -0.003495f, -0.001260f, 0.002160f, 0.000374f, 0.003143f, -0.001164f, -0.004709f, 0.003590f, 0.003389f, -0.003974f, -0.001218f, 0.008542f, 0.002816f, 0.004139f, 0.016500f, 0.008810f, -0.025746f, -0.002590f, -0.012969f, 0.026060f, -0.009648f, 0.012186f, 0.002419f, 0.016341f, 0.006521f, 0.002481f, -0.001230f, 0.006674f, -0.007320f, -0.010974f, -0.030461f, -0.022566f, 0.007593f, 0.020185f, 0.027133f, -0.009891f, -0.013079f, -0.011565f, 0.006150f, + -0.006321f, -0.001254f, -0.001052f, 0.003766f, 0.004152f, 0.018169f, -0.009576f, 0.001828f, 0.004476f, 0.008947f, -0.008695f, -0.006337f, -0.014370f, -0.009614f, -0.010015f, -0.016991f, -0.043469f, -0.000357f, -0.005811f, -0.018537f, 0.004207f, -0.001953f, -0.023578f, 0.008083f, -0.019996f, 0.005293f, -0.002428f, -0.001472f, 0.010146f, 0.013317f, -0.000383f, -0.019330f, 0.005735f, -0.012064f, -0.013523f, 0.018962f, 0.016944f, 0.019103f, -0.006190f, 0.003258f, 0.002489f, -0.009453f, 0.001472f, -0.004435f, 0.029595f, -0.004687f, -0.003083f, -0.002725f, -0.000249f, -0.017872f, -0.022436f, 0.005545f, -0.001681f, -0.001441f, 0.005013f, 0.032462f, -0.004033f, -0.014871f, -0.006426f, 0.017158f, -0.002525f, -0.005250f, -0.004932f, -0.000101f, -0.013796f, 0.003571f, -0.002707f, 0.002821f, -0.007009f, 0.000563f, -0.008802f, -0.000477f, -0.000635f, 0.003797f, -0.003746f, -0.001525f, -0.005421f, 0.007479f, 0.000366f, -0.005013f, 0.001083f, 0.002665f, -0.005758f, 0.001729f, 0.002128f, 0.009098f, -0.001939f, 0.002326f, 0.006130f, 0.004146f, -0.003339f, 0.004031f, -0.006824f, -0.010653f, 0.001211f, 0.001342f, + -0.004265f, -0.009904f, -0.002222f, -0.002215f, 0.008911f, 0.003657f, 0.005931f, -0.000737f, 0.007432f, 0.008454f, -0.028427f, 0.010528f, 0.003493f, 0.030065f, -0.020196f, -0.011434f, -0.006692f, 0.016061f, -0.015292f, -0.014700f, 0.013317f, 0.008964f, -0.015467f, -0.015610f, -0.015273f, -0.034221f, 0.022503f, 0.021116f, 0.022405f, -0.009620f, 0.007106f, 0.022220f, -0.032148f, 0.000060f, 0.021158f, 0.019601f, 0.008922f, -0.000035f, -0.010266f, 0.002168f, -0.004924f, -0.027827f, 0.003570f, 0.007643f, 0.004129f, 0.018480f, -0.016233f, 0.001767f, -0.030375f, -0.003848f, 0.006058f, -0.016701f, 0.006510f, 0.005145f, 0.013655f, 0.016643f, 0.023189f, -0.004724f, -0.009035f, -0.027925f, -0.019887f, 0.008625f, 0.041091f, -0.012728f, -0.001654f, -0.018910f, -0.009968f, -0.015003f, 0.008896f, 0.009095f, -0.003101f, 0.001347f, -0.029979f, -0.003960f, 0.020384f, -0.016227f, -0.014010f, 0.012061f, -0.005364f, 0.017646f, 0.004422f, -0.012967f, 0.002148f, -0.019591f, -0.005588f, -0.005176f, 0.037846f, -0.003786f, -0.011009f, 0.008272f, 0.007770f, -0.003326f, -0.006373f, -0.001938f, -0.005112f, -0.007034f, + -0.006487f, -0.005015f, 0.002710f, 0.002925f, 0.006148f, -0.001586f, -0.000040f, -0.003658f, 0.003747f, 0.000940f, -0.009643f, 0.002577f, -0.000033f, -0.001071f, 0.003560f, -0.000239f, -0.005242f, -0.005263f, -0.012478f, 0.004153f, -0.003891f, 0.003673f, 0.004839f, -0.005922f, 0.002745f, 0.001679f, -0.001204f, 0.004722f, 0.000071f, 0.013549f, 0.001957f, -0.002499f, 0.000375f, -0.003984f, -0.000660f, 0.002328f, 0.000435f, -0.001223f, 0.001155f, -0.005349f, 0.004297f, -0.017469f, 0.041130f, -0.019949f, -0.010163f, -0.000603f, -0.001134f, -0.028828f, 0.002090f, -0.021171f, 0.015680f, -0.039980f, -0.005635f, -0.012632f, 0.013948f, -0.013607f, -0.013685f, -0.033790f, 0.023149f, -0.013760f, 0.009651f, -0.010716f, 0.007089f, 0.018338f, -0.012919f, -0.022074f, -0.007254f, 0.015494f, 0.031912f, 0.010410f, 0.013505f, 0.001802f, -0.031647f, -0.016846f, -0.016943f, -0.008608f, 0.005831f, 0.029151f, 0.012719f, 0.017076f, 0.016052f, -0.004188f, -0.006475f, -0.009493f, -0.026398f, 0.001682f, -0.018340f, 0.029099f, -0.012931f, 0.020114f, 0.004532f, -0.010173f, 0.006942f, -0.006696f, -0.008761f, -0.015493f, + 0.023999f, 0.006441f, 0.040354f, 0.009001f, -0.042834f, -0.010527f, 0.014121f, 0.011445f, 0.006607f, -0.002214f, 0.004127f, 0.045352f, 0.022878f, -0.007409f, 0.005166f, -0.011933f, 0.033018f, -0.001035f, -0.000968f, 0.012947f, -0.028491f, -0.012220f, -0.009476f, -0.030602f, -0.036180f, 0.007456f, 0.013351f, -0.003202f, -0.017662f, -0.004497f, -0.005399f, -0.013918f, 0.000549f, -0.002676f, -0.010854f, 0.011330f, 0.017399f, -0.003543f, -0.002182f, -0.002374f, -0.006370f, 0.005096f, 0.001480f, -0.001746f, -0.003113f, -0.002774f, -0.001681f, 0.005820f, -0.002955f, -0.007845f, -0.001624f, -0.000199f, 0.002917f, 0.001793f, -0.004568f, 0.012248f, -0.003615f, 0.007512f, -0.001077f, 0.006302f, 0.003579f, -0.001769f, -0.007850f, -0.007698f, 0.003069f, -0.001966f, -0.012036f, -0.004383f, -0.002678f, 0.004735f, 0.001533f, -0.000756f, 0.003854f, 0.005860f, 0.002320f, -0.003227f, -0.004705f, -0.024941f, 0.014911f, 0.033325f, -0.003281f, -0.001458f, -0.000773f, 0.030968f, 0.009597f, 0.007408f, 0.005294f, 0.003640f, 0.005271f, -0.012234f, 0.002274f, -0.038419f, 0.005509f, -0.018532f, 0.016037f, 0.039228f, + -0.005104f, 0.002823f, -0.030980f, 0.041351f, 0.020073f, 0.017544f, -0.005157f, -0.022804f, 0.002738f, -0.007812f, 0.021001f, 0.015015f, -0.018818f, 0.000954f, 0.011081f, 0.007780f, -0.014565f, -0.012988f, 0.060642f, -0.014122f, -0.010570f, 0.012723f, -0.015438f, -0.011322f, 0.019286f, 0.018825f, 0.000750f, 0.007201f, 0.006871f, -0.023542f, -0.011672f, -0.001075f, 0.008002f, 0.020473f, 0.005085f, 0.004774f, -0.026506f, -0.002586f, 0.007830f, -0.036271f, 0.007942f, -0.010153f, -0.003646f, -0.006764f, 0.010653f, -0.010857f, -0.019634f, -0.021096f, -0.033226f, 0.004103f, -0.013459f, -0.006593f, 0.021302f, -0.007320f, 0.006922f, -0.037603f, -0.000055f, 0.034427f, 0.008094f, -0.017553f, -0.010360f, 0.020863f, 0.010774f, -0.023127f, 0.012934f, -0.016785f, -0.012820f, -0.005613f, -0.003198f, 0.007702f, -0.002201f, 0.001217f, -0.003532f, -0.004731f, 0.002810f, 0.004033f, -0.005820f, 0.004826f, 0.015284f, 0.002205f, -0.002047f, 0.006362f, 0.009676f, -0.004273f, 0.006599f, -0.004474f, -0.005877f, 0.001478f, 0.004407f, 0.012475f, 0.003392f, -0.001440f, 0.004663f, -0.002139f, 0.006594f, -0.003910f, + 0.006068f, -0.004803f, 0.002057f, 0.005059f, 0.001602f, -0.009005f, -0.004929f, 0.015833f, -0.006752f, -0.013121f, 0.006411f, 0.003096f, 0.004799f, -0.003667f, 0.020669f, 0.005722f, -0.004708f, -0.002686f, 0.005227f, -0.002322f, -0.019136f, -0.019215f, 0.045801f, -0.027359f, 0.007179f, -0.017478f, 0.053991f, 0.011495f, 0.010015f, -0.017219f, -0.020369f, 0.001994f, 0.015454f, -0.016516f, -0.026336f, -0.015652f, -0.038314f, -0.014922f, -0.022478f, -0.000018f, -0.051507f, 0.003632f, 0.027969f, 0.017215f, 0.022868f, -0.015913f, 0.005997f, 0.024799f, -0.002827f, 0.017986f, 0.006728f, 0.028020f, -0.014004f, 0.023370f, 0.018621f, 0.013293f, 0.030398f, -0.016986f, 0.018127f, -0.009278f, -0.010745f, -0.007155f, 0.006758f, -0.058844f, -0.018772f, -0.036575f, 0.042392f, -0.026681f, -0.030076f, -0.006444f, 0.023942f, 0.000668f, -0.010720f, 0.033304f, -0.011858f, -0.010564f, -0.024127f, -0.059531f, 0.002935f, 0.005525f, 0.024855f, -0.024970f, 0.000119f, -0.015231f, -0.020034f, 0.031819f, -0.006384f, 0.015929f, -0.034576f, -0.033726f, -0.020981f, 0.026511f, -0.002694f, -0.016840f, -0.017801f, -0.000746f, + -0.029325f, -0.020087f, 0.002889f, -0.012359f, -0.021866f, 0.032248f, -0.044296f, -0.042293f, 0.011075f, 0.000121f, 0.018686f, 0.002079f, -0.002015f, -0.013694f, -0.012012f, 0.001908f, -0.020942f, -0.008526f, 0.017872f, 0.002289f, 0.003072f, -0.010452f, 0.010581f, 0.003828f, -0.011444f, 0.005260f, -0.008486f, -0.001849f, -0.008706f, 0.007454f, -0.011587f, -0.003032f, 0.007876f, 0.015225f, 0.001702f, 0.000485f, -0.016746f, -0.005217f, -0.001171f, 0.002266f, -0.002501f, 0.014059f, -0.000633f, -0.005638f, 0.009063f, -0.010812f, -0.009794f, 0.005785f, 0.012951f, -0.003889f, -0.009291f, -0.012781f, 0.009942f, 0.007796f, 0.016050f, -0.021998f, -0.000018f, 0.029800f, 0.004034f, -0.008849f, 0.015450f, -0.023986f, 0.048133f, 0.030242f, -0.000144f, -0.021836f, -0.024680f, 0.010466f, -0.006107f, -0.002141f, -0.001162f, 0.043879f, -0.021342f, 0.000909f, -0.014799f, 0.016208f, -0.027042f, -0.024845f, -0.048915f, 0.011464f, -0.019781f, -0.027506f, -0.003199f, -0.046586f, -0.022756f, 0.013254f, 0.010126f, -0.006326f, 0.024478f, 0.002341f, 0.029636f, -0.012932f, -0.040399f, -0.006100f, -0.029543f, -0.005605f, + -0.008735f, -0.038858f, 0.005292f, 0.031769f, -0.089077f, 0.011367f, 0.000433f, 0.022201f, -0.004216f, -0.027737f, -0.052761f, 0.021174f, -0.006278f, 0.019790f, 0.012052f, -0.006408f, 0.031156f, -0.038414f, 0.054162f, -0.013481f, 0.030327f, 0.062959f, 0.025428f, 0.044808f, 0.017859f, 0.011787f, -0.005848f, 0.023418f, -0.008429f, -0.024434f, -0.032705f, -0.021259f, -0.000832f, 0.018592f, -0.002757f, -0.014372f, -0.020181f, -0.018288f, 0.025207f, -0.011073f, -0.008682f, 0.022364f, 0.004373f, 0.016848f, -0.001428f, -0.002417f, -0.006471f, 0.003979f, 0.008781f, -0.011405f, -0.001523f, -0.027935f, -0.019855f, 0.013759f, -0.006467f, -0.000690f, -0.003725f, -0.000513f, -0.010312f, -0.016717f, 0.012496f, -0.010057f, 0.016134f, -0.016082f, -0.007027f, -0.001775f, -0.010900f, -0.005664f, 0.008330f, 0.003307f, 0.019509f, -0.004793f, -0.011001f, 0.007223f, -0.022406f, 0.000389f, 0.003202f, -0.003538f, 0.001911f, -0.002533f, 0.011664f, 0.016192f, 0.003193f, -0.000569f, -0.007372f, -0.013527f, -0.006111f, 0.000789f, 0.026956f, 0.013289f, -0.012909f, 0.075165f, 0.061233f, 0.055161f, -0.012695f, 0.000027f, + -0.047030f, 0.034957f, 0.043410f, 0.014681f, 0.041933f, 0.016658f, 0.014195f, 0.014627f, -0.007515f, 0.005684f, 0.011542f, -0.010850f, -0.045299f, -0.027588f, -0.001755f, -0.030179f, -0.035090f, -0.082364f, 0.017988f, 0.014062f, 0.021358f, -0.015895f, -0.005696f, -0.011095f, 0.000509f, -0.025873f, -0.000806f, -0.019755f, 0.022696f, 0.018781f, -0.011809f, -0.016112f, -0.043421f, 0.072854f, -0.022867f, 0.014243f, -0.000091f, 0.004523f, 0.011597f, -0.030372f, 0.036359f, -0.018554f, 0.012393f, 0.007972f, -0.027267f, -0.028239f, -0.005245f, -0.002652f, 0.016868f, 0.076877f, -0.006487f, 0.011258f, 0.002512f, 0.023039f, 0.016505f, 0.017107f, -0.013656f, -0.004278f, 0.006631f, -0.037472f, 0.007541f, -0.032103f, -0.050939f, 0.017512f, 0.001590f, 0.003804f, -0.037296f, -0.089818f, 0.038718f, 0.040222f, 0.027865f, -0.051050f, 0.048353f, 0.051151f, 0.019001f, 0.014660f, 0.000443f, -0.015063f, -0.033846f, 0.025068f, -0.023850f, 0.001279f, 0.000414f, -0.013699f, 0.010217f, -0.024574f, -0.002542f, -0.005028f, 0.012024f, -0.007019f, -0.011193f, -0.015386f, 0.023146f, -0.012981f, -0.005515f, 0.005742f, + -0.020800f, 0.011269f, 0.009468f, -0.007502f, -0.007279f, 0.001715f, -0.019318f, 0.017563f, -0.006479f, -0.005145f, -0.001611f, 0.001194f, 0.013183f, -0.010708f, -0.024422f, 0.006941f, -0.013610f, -0.004561f, -0.013948f, -0.012719f, 0.001920f, -0.010360f, -0.004574f, -0.009684f, 0.031388f, -0.014281f, -0.025484f, 0.003642f, -0.009139f, -0.001012f, -0.043991f, -0.087954f, 0.073270f, 0.011913f, 0.013131f, -0.029195f, -0.020980f, -0.093581f, 0.026066f, 0.067196f, 0.020707f, -0.059208f, -0.029553f, 0.009805f, -0.022961f, -0.014507f, 0.027624f, -0.030742f, 0.017411f, 0.015567f, 0.012889f, -0.034241f, 0.012440f, 0.010817f, -0.016002f, -0.032034f, -0.018498f, -0.012229f, -0.008192f, -0.030550f, -0.026354f, -0.014405f, -0.031536f, 0.025147f, -0.011689f, -0.040711f, -0.013984f, 0.025247f, -0.005055f, -0.028179f, -0.015475f, -0.014299f, 0.000028f, -0.022302f, -0.013428f, -0.037066f, -0.035255f, 0.015234f, -0.012466f, 0.046621f, 0.030650f, 0.003154f, 0.027839f, -0.040444f, 0.026372f, -0.038383f, 0.032507f, -0.005387f, 0.016679f, -0.017030f, 0.057669f, -0.014192f, 0.032339f, -0.008088f, 0.047448f, 0.019229f, + 0.011616f, -0.048712f, 0.053101f, 0.042591f, 0.018565f, 0.019874f, -0.038037f, -0.007121f, 0.015681f, 0.026202f, -0.006682f, 0.006442f, -0.042037f, 0.027170f, 0.046252f, -0.000865f, -0.033008f, -0.001779f, -0.021812f, -0.018576f, 0.009096f, 0.000039f, -0.009089f, 0.010819f, -0.024096f, -0.005534f, 0.000963f, 0.007012f, -0.016614f, -0.022708f, 0.008813f, -0.010994f, -0.021551f, -0.038557f, -0.002833f, 0.012138f, -0.003220f, -0.019357f, -0.023494f, -0.007091f, 0.014942f, -0.016039f, 0.006188f, 0.008776f, 0.002421f, 0.006479f, -0.002020f, -0.010287f, -0.008808f, -0.002813f, 0.010756f, 0.003723f, -0.004235f, -0.014424f, 0.019841f, -0.012765f, -0.011305f, -0.009298f, 0.003927f, 0.023225f, -0.015731f, 0.022867f, 0.019145f, -0.007595f, 0.006913f, 0.012204f, -0.062660f, 0.050735f, -0.007528f, 0.023600f, -0.035176f, -0.012335f, -0.009781f, -0.009228f, -0.009249f, 0.029075f, -0.000462f, -0.026693f, 0.019050f, 0.002156f, 0.013379f, 0.024445f, 0.024695f, 0.000018f, -0.023812f, 0.090916f, -0.026624f, 0.069611f, -0.000747f, 0.002914f, -0.041456f, -0.018898f, 0.005406f, 0.033034f, 0.015743f, -0.012477f, + 0.026897f, 0.004444f, -0.040046f, 0.005208f, 0.004480f, 0.038684f, -0.002666f, 0.022655f, -0.030639f, -0.001246f, 0.025867f, 0.012203f, 0.021461f, 0.058773f, 0.046923f, -0.008733f, 0.023790f, -0.004981f, 0.046070f, -0.039088f, 0.030418f, 0.011601f, -0.002800f, 0.027112f, -0.016000f, 0.072310f, -0.013755f, 0.034325f, -0.027789f, -0.024962f, 0.000166f, 0.077127f, 0.024459f, -0.073853f, 0.063404f, -0.002451f, 0.021555f, -0.055939f, 0.017598f, 0.005192f, -0.110789f, 0.044959f, 0.082816f, 0.031107f, -0.036091f, -0.023168f, 0.015954f, 0.081698f, 0.046004f, 0.062033f, -0.023969f, -0.031653f, -0.028990f, 0.012273f, 0.016118f, -0.003810f, -0.032601f, -0.014998f, 0.038153f, 0.006089f, 0.007901f, -0.014408f, 0.016981f, -0.005487f, 0.007158f, -0.009282f, -0.011648f, -0.013452f, 0.022628f, 0.038914f, 0.037420f, 0.007900f, 0.019385f, 0.035721f, 0.023119f, 0.024962f, 0.033946f, 0.019108f, 0.032369f, 0.024755f, 0.008140f, -0.051395f, -0.010977f, -0.024374f, 0.013106f, 0.028908f, -0.034921f, -0.012672f, 0.038769f, 0.021264f, 0.003430f, -0.009889f, 0.032640f, -0.027007f, 0.004994f, 0.034372f, + 0.026291f, 0.014775f, 0.017271f, 0.020807f, 0.011209f, 0.003969f, -0.003427f, 0.004921f, 0.001798f, 0.017800f, 0.021088f, 0.013685f, -0.017350f, -0.008767f, -0.030346f, 0.037255f, 0.005210f, 0.024687f, -0.020828f, 0.049936f, -0.018216f, 0.023096f, 0.007205f, 0.010132f, 0.006766f, 0.004100f, -0.053267f, -0.030779f, -0.000312f, 0.004494f, 0.035325f, 0.029459f, -0.043617f, 0.004141f, -0.024350f, -0.021717f, 0.009883f, 0.002430f, -0.015441f, 0.017559f, 0.068745f, -0.046253f, -0.004432f, 0.106257f, -0.065558f, 0.007454f, 0.037208f, -0.019659f, -0.016479f, 0.021909f, 0.034279f, -0.038377f, 0.018011f, -0.069494f, -0.008319f, 0.103389f, 0.003684f, 0.029233f, -0.011808f, 0.056489f, 0.055982f, -0.015760f, -0.001854f, -0.026901f, 0.005676f, -0.019887f, -0.051361f, -0.032470f, -0.061122f, -0.044451f, 0.066092f, 0.026943f, 0.018897f, 0.089143f, -0.064119f, -0.037378f, 0.010426f, 0.033424f, -0.025772f, 0.016281f, -0.027551f, 0.049400f, 0.028659f, 0.017138f, 0.035313f, 0.129355f, -0.031558f, -0.010048f, -0.037046f, -0.041549f, -0.003588f, 0.054456f, -0.043513f, -0.005426f, 0.037817f, 0.041669f, + 0.048307f, 0.028832f, -0.034171f, 0.008692f, -0.019310f, -0.003795f, 0.027774f, 0.009484f, -0.003363f, 0.021697f, -0.040083f, 0.002864f, -0.000207f, 0.010879f, -0.009705f, -0.009787f, 0.022928f, -0.008486f, -0.006822f, 0.026693f, 0.032927f, 0.027413f, 0.010962f, 0.011872f, 0.021384f, 0.007078f, 0.000760f, 0.015934f, 0.000573f, -0.008354f, 0.005794f, 0.000308f, -0.003388f, -0.043521f, 0.009657f, 0.029017f, 0.045379f, -0.010197f, -0.014239f, -0.014668f, 0.022538f, 0.027374f, -0.060953f, 0.007847f, -0.027790f, -0.003098f, 0.002166f, 0.004620f, 0.016310f, 0.012960f, 0.010595f, -0.014834f, -0.031250f, 0.025569f, -0.007537f, 0.058384f, -0.053023f, 0.013405f, -0.003811f, -0.017008f, -0.015413f, -0.007663f, 0.017924f, 0.011021f, 0.012194f, -0.002811f, 0.032698f, 0.005719f, -0.042669f, -0.033647f, -0.004583f, -0.019774f, -0.024508f, 0.005600f, 0.027073f, -0.003800f, -0.006059f, -0.039167f, 0.019370f, -0.006288f, 0.040164f, -0.013640f, -0.076990f, 0.009427f, -0.022756f, -0.011625f, 0.000221f, -0.062532f, -0.032780f, -0.053719f, 0.001081f, -0.003919f, -0.014957f, -0.071120f, -0.028804f, -0.006230f, + 0.037298f, 0.041085f, 0.003425f, 0.003124f, 0.020148f, 0.004533f, -0.048735f, 0.042823f, 0.058463f, -0.025341f, 0.008953f, -0.025395f, 0.010669f, -0.000231f, 0.044580f, -0.049922f, -0.036066f, -0.114150f, -0.040344f, 0.028730f, 0.046129f, 0.032678f, 0.029833f, -0.028159f, -0.009189f, 0.022722f, 0.021993f, 0.049479f, 0.023630f, 0.021107f, 0.038270f, 0.009581f, -0.041854f, -0.045045f, -0.060868f, 0.025416f, -0.038853f, 0.003354f, -0.034051f, -0.052782f, -0.079723f, 0.011250f, -0.022992f, -0.025064f, 0.007261f, 0.007447f, -0.002890f, -0.011607f, 0.001800f, 0.026215f, 0.018409f, 0.006635f, -0.010033f, 0.018917f, 0.043086f, -0.009604f, -0.023334f, -0.019386f, 0.021209f, -0.011338f, -0.009506f, -0.038466f, -0.036928f, -0.028669f, -0.063208f, -0.003664f, 0.000318f, -0.025530f, 0.011373f, 0.016953f, 0.012639f, 0.031391f, 0.008874f, 0.037075f, 0.002588f, 0.010067f, 0.041224f, -0.020217f, -0.000977f, 0.005929f, -0.000191f, -0.028741f, -0.000906f, -0.005735f, 0.049651f, -0.003416f, -0.020399f, 0.015247f, 0.006325f, 0.014219f, 0.031866f, -0.005742f, -0.000346f, 0.017935f, 0.008308f, 0.000773f, + -0.002232f, -0.009970f, 0.010678f, -0.091511f, 0.038234f, -0.027427f, 0.003283f, 0.064828f, 0.054236f, -0.021687f, -0.009253f, 0.033317f, -0.020993f, -0.022095f, -0.018424f, 0.004347f, -0.006440f, -0.002606f, 0.007606f, -0.007314f, 0.031856f, 0.076163f, -0.032399f, -0.059968f, 0.059538f, -0.046501f, -0.012692f, 0.000255f, 0.074335f, 0.005569f, -0.022747f, 0.021735f, 0.020573f, -0.078180f, -0.023132f, 0.012648f, -0.003247f, -0.037252f, -0.003017f, 0.014420f, -0.114763f, -0.053232f, 0.056489f, -0.056744f, -0.063147f, -0.039087f, 0.046077f, -0.060417f, -0.094455f, 0.094590f, -0.028196f, -0.059600f, -0.003738f, 0.036792f, -0.036609f, -0.063956f, -0.001888f, 0.028752f, -0.003602f, -0.082202f, 0.018962f, -0.001445f, -0.037021f, 0.085933f, 0.080847f, -0.006390f, -0.033360f, -0.064181f, 0.098624f, 0.013550f, 0.017167f, 0.033954f, -0.024649f, -0.096198f, 0.042921f, 0.073174f, 0.058409f, -0.036554f, 0.020876f, 0.079857f, 0.046169f, -0.055568f, -0.012545f, -0.043625f, 0.019199f, 0.011838f, 0.050051f, 0.049571f, -0.060137f, -0.002225f, -0.006594f, 0.008824f, -0.023585f, 0.023871f, -0.015569f, 0.013773f, + 0.012231f, 0.010047f, -0.017192f, 0.012977f, -0.025530f, 0.041546f, -0.021455f, -0.010742f, 0.026175f, 0.023020f, -0.024372f, 0.003752f, -0.011541f, -0.028137f, -0.015304f, 0.011211f, 0.021841f, 0.013471f, -0.022986f, 0.012692f, -0.014874f, -0.034960f, 0.001458f, 0.006208f, -0.005854f, -0.002893f, 0.023518f, 0.001482f, 0.002383f, 0.011171f, -0.003459f, 0.006010f, -0.037680f, 0.028112f, 0.010060f, -0.095256f, 0.009690f, 0.088451f, 0.047825f, 0.011779f, -0.001872f, -0.016826f, 0.022434f, -0.032123f, 0.073298f, -0.006338f, 0.018989f, 0.026666f, -0.026236f, 0.000312f, -0.003976f, -0.028893f, -0.000875f, 0.010026f, 0.040772f, -0.000822f, -0.026547f, 0.012142f, 0.032653f, -0.006201f, 0.052203f, -0.041813f, 0.007819f, 0.011277f, 0.013046f, 0.045270f, -0.025942f, 0.003389f, -0.002521f, -0.060591f, 0.007722f, -0.020251f, -0.033544f, 0.013360f, -0.013263f, 0.046454f, 0.033134f, -0.025356f, -0.054559f, 0.024889f, 0.004384f, 0.010122f, 0.029206f, 0.064736f, -0.011975f, 0.012908f, -0.027385f, 0.036884f, 0.026016f, 0.027416f, -0.032006f, 0.042343f, -0.015599f, -0.019393f, -0.038451f, -0.003994f, + -0.015701f, 0.055023f, -0.042317f, 0.002384f, 0.012928f, -0.013302f, -0.026151f, 0.077087f, -0.004221f, 0.017839f, -0.007953f, 0.008768f, -0.007276f, 0.021194f, -0.003523f, -0.010054f, -0.007059f, -0.008916f, 0.025175f, 0.017480f, 0.023656f, 0.013037f, 0.007054f, -0.017313f, 0.017302f, 0.000871f, 0.009292f, 0.008048f, 0.021220f, -0.003637f, 0.000106f, 0.002993f, 0.006349f, 0.006715f, 0.015656f, -0.014031f, 0.009640f, 0.008452f, 0.007384f, 0.006218f, 0.004928f, 0.015448f, 0.005545f, -0.021460f, 0.012088f, 0.014034f, 0.014607f, 0.006126f, 0.015744f, 0.004009f, -0.001613f, 0.008764f, 0.004741f, 0.011284f, -0.001526f, -0.010912f, 0.002022f, 0.015825f, -0.008816f, 0.006309f, 0.000311f, 0.017284f, 0.015432f, 0.005730f, 0.010701f, 0.016057f, 0.007218f, 0.012961f, 0.031087f, -0.082695f, -0.232030f, -0.220640f, 0.095871f, 0.009357f, 0.212097f, 0.449256f, 0.098392f, 0.181029f, 0.096615f, -0.333341f, -0.149148f, -0.224214f, -0.329144f, -0.022140f, 0.038939f, -0.155588f, 0.138249f, 0.235021f, 0.144015f, 0.404792f, 0.248549f, 0.002185f, -0.037401f, -0.143370f, -0.357559f, -0.289815f, + -0.124772f, -0.274540f, -0.080907f, 0.156780f, 0.046708f, 0.039592f, 0.370947f, 0.142954f, 0.090416f, 0.343124f, 0.016334f, -0.017490f, 0.158333f, -0.078955f, -0.282910f, -0.137167f, -0.282695f, -0.413228f, -0.045664f, -0.187813f, -0.153088f, 0.132061f, 0.256530f, 0.118451f, 0.453226f, 0.360823f, 0.209461f, 0.273977f, 0.093034f, -0.134598f, -0.206975f, -0.276303f, -0.442070f, -0.354739f, -0.237738f, -0.202889f, -0.062913f, 0.153777f, 0.234084f, 0.260496f, 0.350639f, 0.294851f, 0.138458f, 0.050062f, 0.076166f, -0.118621f, -0.181250f, -0.129116f, -0.270886f, -0.204272f, -0.034924f, -0.122081f, 0.048535f, 0.198146f, 0.071120f, 0.100940f, 0.144370f, 0.014994f, 0.008854f, -0.035498f, -0.135583f, -0.071504f, 0.001376f, -0.054618f, 0.042169f, 0.057135f, -0.023120f, 0.072545f, 0.062961f, -0.098763f, 0.075457f, 0.087312f, -0.061628f, 0.142572f, 0.022074f, -0.141200f, 0.098737f, -0.077672f, -0.274756f, -0.045941f, -0.166881f, -0.203450f, 0.125576f, 0.015367f, 0.032157f, 0.264148f, 0.168471f, 0.186712f, 0.301159f, 0.220816f, 0.073625f, 0.031118f, -0.209293f, -0.381608f, -0.378839f, -0.380747f, + -0.359242f, -0.219944f, 0.011548f, 0.206084f, 0.303757f, 0.415214f, 0.386475f, 0.364231f, 0.287825f, 0.048169f, -0.131971f, -0.145671f, -0.305095f, -0.378605f, -0.227073f, -0.204458f, -0.113248f, 0.020250f, 0.054952f, 0.065048f, 0.130243f, 0.113237f, 0.107356f, 0.150626f, 0.125301f, 0.078332f, 0.069206f, 0.014352f, -0.043603f, -0.078146f, -0.094470f, -0.128222f, -0.107662f, -0.085684f, -0.066661f, -0.021990f, 0.022493f, 0.038735f, 0.055992f, 0.065360f, 0.063329f, 0.048301f, 0.038980f, 0.016986f, -0.001333f, -0.008517f, -0.008879f, -0.017315f, -0.013423f, -0.008928f, -0.010153f, -0.010016f, -0.002573f, -0.013925f, -0.016034f, -0.015779f, -0.024451f, -0.027399f, -0.016100f, -0.013751f, 0.007691f, 0.033190f, 0.044303f, 0.045071f, 0.042654f, 0.027796f, 0.020283f, 0.007478f, -0.012682f, -0.033416f, -0.039858f, -0.043462f, -0.038998f, -0.029076f, -0.013268f, 0.001813f, 0.018754f, 0.029477f, 0.030982f, 0.025919f, 0.019412f, 0.007199f, -0.002088f, -0.009524f, -0.013893f, -0.015213f, -0.009683f, -0.005101f, 0.001758f, 0.006569f, 0.010371f, 0.009973f, 0.006672f, -0.001165f, -0.006585f, -0.011091f, + -0.012325f, -0.011015f, -0.007172f, -0.003485f, 0.002128f, 0.005744f, 0.008102f, 0.009010f, 0.008620f, 0.006185f, 0.004208f, 0.002009f, 0.000038f, -0.001753f, -0.002551f, -0.003144f, -0.002776f, -0.002032f, -0.001253f, -0.000919f} + }, + { + {-0.009393f, -0.003611f, 0.002191f, -0.001743f, -0.005411f, -0.000392f, 0.012535f, -0.006434f, 0.001463f, -0.002713f, -0.000141f, -0.004793f, 0.009021f, -0.004679f, -0.004987f, -0.005633f, 0.010749f, -0.006390f, -0.001673f, -0.003019f, 0.003023f, 0.004964f, 0.006290f, -0.008873f, -0.000022f, 0.008498f, 0.003758f, 0.001457f, -0.000470f, -0.001059f, 0.003836f, 0.008665f, 0.002089f, -0.011120f, -0.005737f, -0.005981f, 0.009709f, -0.000990f, 0.007407f, -0.004653f, 0.003431f, 0.009722f, -0.004739f, -0.007313f, 0.002597f, -0.002732f, -0.000495f, -0.006542f, -0.002649f, -0.004887f, 0.001856f, -0.008872f, -0.002935f, -0.002264f, -0.000290f, 0.012027f, -0.003928f, -0.001797f, -0.000434f, -0.003139f, -0.001251f, -0.001123f, 0.007269f, 0.003777f, 0.004455f, -0.006237f, 0.004580f, 0.004832f, -0.004265f, 0.002008f, 0.002850f, -0.003202f, -0.004375f, 0.005127f, -0.007667f, 0.005429f, 0.003264f, 0.001451f, -0.007106f, -0.002441f, 0.002641f, -0.000607f, -0.001481f, -0.001894f, -0.000173f, -0.003786f, -0.004430f, -0.000657f, -0.000735f, 0.000556f, -0.001671f, 0.000063f, 0.002614f, -0.000073f, 0.000969f, 0.000402f, + 0.000510f, 0.000057f, -0.000523f, -0.001887f, -0.001165f, 0.001343f, -0.000609f, 0.000107f, -0.000190f, -0.005832f, 0.006313f, 0.000801f, -0.002624f, -0.003958f, -0.001031f, -0.001979f, 0.000076f, -0.004921f, -0.003764f, 0.002892f, -0.000721f, -0.001851f, -0.008648f, -0.001239f, 0.008173f, -0.005402f, -0.001300f, 0.006168f, -0.003456f, -0.006478f, -0.004924f, 0.004226f, 0.000101f, -0.000578f, -0.001193f, -0.006210f, 0.002175f, -0.002733f, -0.001409f, 0.007148f, -0.003837f, -0.009550f, -0.002801f, 0.000590f, 0.002940f, 0.002581f, 0.000886f, -0.007242f, -0.001624f, -0.008835f, -0.008019f, -0.002122f, 0.008524f, -0.001411f, -0.016672f, -0.000699f, 0.005694f, 0.004947f, -0.003396f, 0.003345f, 0.003656f, 0.000389f, 0.005033f, -0.008961f, -0.006324f, -0.000796f, 0.002672f, 0.000464f, 0.001919f, -0.000920f, 0.002412f, 0.002190f, 0.003535f, -0.000475f, 0.002199f, 0.002092f, -0.001631f, 0.003506f, -0.000806f, -0.008741f, -0.007152f, -0.004619f, -0.003666f, -0.003900f, 0.001249f, -0.001955f, 0.006857f, 0.005676f, -0.000996f, -0.002671f, -0.002323f, -0.001215f, 0.002089f, 0.003261f, 0.000447f, -0.001834f, + 0.000385f, 0.000496f, -0.001823f, 0.002465f, 0.000052f, -0.000512f, -0.000895f, -0.000158f, -0.001350f, 0.001015f, -0.000241f, 0.000230f, -0.001571f, 0.001003f, -0.000980f, 0.000057f, 0.000039f, 0.000709f, -0.000241f, -0.000717f, -0.000285f, -0.001461f, -0.000565f, 0.000200f, -0.000722f, 0.000175f, -0.000468f, -0.001327f, 0.007578f, 0.004198f, 0.011392f, 0.000677f, -0.002342f, -0.001504f, 0.008036f, -0.002305f, 0.004273f, -0.007529f, -0.000874f, -0.000294f, 0.004181f, 0.002870f, 0.007202f, 0.005029f, -0.003829f, -0.007438f, -0.006077f, 0.003995f, -0.002639f, 0.005494f, 0.003437f, 0.000642f, -0.000447f, 0.004548f, 0.003194f, -0.003494f, 0.003752f, -0.008008f, -0.001183f, -0.007433f, -0.006354f, -0.008923f, 0.002486f, 0.004910f, -0.001018f, 0.006874f, -0.005518f, 0.006358f, -0.013197f, 0.004925f, 0.002151f, 0.009581f, 0.002760f, 0.003365f, 0.005151f, -0.000355f, -0.003426f, 0.003502f, 0.008385f, 0.002757f, 0.004022f, -0.001491f, -0.000227f, -0.012130f, -0.000875f, 0.001785f, 0.002236f, -0.001888f, 0.006330f, 0.011905f, -0.004098f, -0.008788f, 0.005695f, 0.001147f, -0.006206f, -0.000230f, + -0.002914f, -0.006311f, 0.000691f, 0.008524f, 0.002099f, 0.003015f, 0.001393f, -0.001060f, 0.003226f, 0.001897f, -0.000235f, 0.002711f, 0.000116f, -0.000925f, -0.000702f, -0.001774f, 0.001617f, -0.002542f, -0.000359f, 0.003879f, -0.000932f, -0.000236f, 0.001480f, -0.001092f, 0.002686f, -0.003977f, -0.001779f, -0.000086f, -0.001584f, -0.001819f, 0.000355f, -0.001087f, 0.001266f, 0.002796f, -0.001158f, 0.001513f, 0.000398f, 0.000023f, -0.000005f, 0.000258f, -0.003352f, -0.001007f, -0.000791f, 0.000495f, 0.002684f, 0.001452f, 0.004234f, 0.006219f, 0.005978f, -0.005968f, 0.009171f, -0.003386f, -0.006251f, -0.009188f, 0.002015f, -0.012122f, -0.000850f, 0.001163f, 0.003230f, -0.007762f, 0.004860f, -0.000210f, 0.001004f, 0.003128f, 0.001873f, 0.002635f, -0.010461f, -0.000779f, -0.002448f, -0.006841f, 0.003846f, 0.001907f, 0.001447f, 0.005717f, 0.020300f, -0.001585f, 0.000941f, 0.002829f, 0.004934f, 0.001918f, -0.016860f, 0.003401f, -0.002894f, -0.002001f, 0.009063f, 0.000193f, 0.004453f, 0.006542f, -0.008377f, -0.004688f, -0.002499f, -0.008094f, -0.017308f, 0.000737f, -0.006598f, -0.001111f, + -0.001617f, -0.000428f, -0.004106f, -0.008487f, 0.002268f, -0.008124f, -0.002679f, 0.001742f, -0.009099f, 0.009220f, 0.003082f, 0.002571f, -0.003898f, -0.000759f, -0.001597f, 0.001778f, -0.003023f, 0.004701f, -0.007493f, 0.002377f, 0.011063f, 0.009205f, -0.003375f, 0.004648f, -0.004544f, 0.001932f, -0.008485f, -0.000343f, 0.005057f, 0.005927f, 0.005223f, -0.000991f, 0.009844f, 0.000846f, 0.004848f, 0.004391f, -0.000319f, 0.002011f, 0.000942f, 0.000308f, -0.001835f, 0.000938f, 0.001407f, -0.000667f, 0.000026f, -0.001191f, -0.002896f, -0.000493f, 0.001722f, -0.001533f, 0.003871f, -0.001179f, -0.002249f, -0.001848f, 0.001254f, -0.001071f, 0.001601f, -0.000402f, -0.001857f, 0.000945f, -0.000635f, 0.002015f, 0.001099f, 0.001157f, 0.000666f, -0.003672f, -0.001023f, 0.000426f, 0.001372f, -0.000009f, 0.000124f, -0.001031f, 0.013690f, -0.017265f, 0.000777f, -0.010616f, 0.005497f, 0.007910f, 0.009637f, -0.001448f, -0.009070f, 0.000272f, 0.009495f, 0.002055f, 0.001852f, -0.007068f, -0.000908f, -0.012406f, 0.016585f, -0.000840f, -0.012690f, 0.013827f, 0.003499f, 0.004125f, -0.000853f, -0.004937f, + -0.001580f, -0.006532f, -0.006434f, 0.005133f, 0.007278f, -0.001437f, 0.006870f, -0.005587f, -0.003466f, 0.000037f, 0.009571f, 0.009052f, -0.002481f, -0.005045f, 0.007463f, 0.004768f, 0.000745f, 0.006314f, 0.001545f, -0.007339f, 0.007812f, 0.004880f, -0.000531f, -0.002526f, 0.002195f, -0.007914f, 0.021235f, -0.001060f, -0.000704f, 0.015821f, -0.001381f, -0.009619f, -0.005184f, -0.001103f, 0.003902f, -0.009998f, 0.006924f, 0.002112f, 0.000295f, -0.009074f, -0.007621f, -0.016066f, -0.001364f, 0.007552f, 0.003798f, 0.009150f, -0.004990f, -0.003536f, 0.019140f, -0.005259f, 0.003252f, -0.002610f, -0.007843f, 0.000651f, 0.003555f, -0.008210f, -0.014568f, 0.000653f, -0.008958f, -0.009062f, -0.004384f, 0.004795f, 0.000493f, -0.001332f, -0.005527f, -0.001873f, 0.000712f, -0.002049f, -0.001486f, 0.001542f, 0.005285f, 0.000779f, 0.001386f, -0.003644f, -0.001808f, -0.000338f, 0.000041f, -0.005160f, -0.003737f, -0.003259f, -0.000117f, 0.001305f, 0.000590f, -0.001650f, 0.000209f, -0.000287f, -0.000443f, -0.002685f, -0.000917f, -0.000349f, -0.000957f, -0.001384f, -0.001807f, -0.018305f, -0.000300f, -0.007757f, + -0.008759f, 0.002523f, -0.010501f, 0.000189f, 0.007017f, 0.003771f, 0.014809f, -0.024973f, 0.015868f, -0.002756f, 0.006883f, -0.004874f, -0.003662f, -0.013179f, 0.011539f, 0.010155f, 0.002482f, -0.011729f, -0.000740f, -0.006834f, -0.000902f, 0.011979f, 0.008322f, 0.001737f, 0.011427f, -0.000283f, 0.000494f, 0.001011f, -0.000500f, -0.008187f, 0.017134f, -0.001850f, 0.000064f, 0.019899f, -0.013016f, 0.004665f, -0.006259f, -0.001426f, 0.006232f, -0.002859f, -0.010287f, 0.019148f, 0.014929f, -0.000667f, 0.004784f, 0.007953f, 0.020724f, -0.002822f, -0.003846f, -0.011422f, 0.001887f, 0.003830f, -0.012046f, -0.012874f, -0.011306f, 0.013324f, 0.000219f, -0.005640f, 0.009151f, 0.006450f, 0.000035f, -0.003314f, 0.002924f, -0.007378f, -0.001936f, -0.008018f, -0.001856f, 0.007358f, -0.014680f, 0.003353f, -0.003141f, -0.010218f, 0.006128f, 0.009638f, 0.004092f, 0.010041f, 0.008728f, -0.007537f, -0.011967f, -0.006035f, 0.005192f, -0.004782f, -0.009208f, 0.005860f, 0.009963f, -0.007349f, 0.001204f, 0.002063f, 0.001084f, -0.006869f, 0.003931f, -0.003097f, -0.002428f, -0.004432f, -0.002310f, -0.003485f, + -0.000363f, -0.000448f, 0.001298f, 0.002038f, -0.001742f, -0.001558f, -0.000682f, -0.002781f, -0.001596f, -0.000798f, -0.001093f, 0.002088f, 0.002693f, 0.000629f, 0.003969f, -0.003618f, 0.002743f, -0.003132f, -0.001389f, 0.002809f, 0.013757f, 0.014593f, 0.002474f, -0.012453f, -0.001655f, -0.011824f, 0.005026f, 0.031348f, 0.007789f, 0.021743f, 0.008033f, 0.000344f, -0.020150f, -0.004897f, 0.003400f, 0.019647f, -0.008588f, -0.004240f, -0.007469f, 0.001951f, 0.015808f, -0.011445f, 0.007777f, 0.013693f, 0.003100f, 0.005087f, -0.008838f, 0.016904f, -0.003532f, 0.021994f, -0.000133f, -0.006625f, -0.020493f, 0.002598f, 0.000151f, 0.024610f, -0.007327f, -0.001920f, 0.015634f, 0.000195f, 0.002138f, -0.004976f, -0.016006f, 0.001806f, 0.009342f, -0.011468f, -0.009027f, 0.002489f, -0.019208f, 0.010670f, 0.010790f, -0.003169f, -0.001172f, 0.005527f, 0.011004f, -0.000839f, -0.006636f, -0.000168f, 0.016123f, -0.001960f, -0.002379f, -0.005976f, 0.020851f, 0.021113f, 0.001513f, -0.003723f, 0.003368f, -0.000807f, 0.005574f, 0.009809f, -0.000708f, 0.014128f, -0.005371f, -0.007703f, -0.011263f, 0.003935f, + -0.000833f, -0.017186f, -0.012365f, -0.007079f, 0.013691f, -0.003880f, -0.006259f, -0.001657f, 0.000110f, -0.005764f, -0.008745f, -0.003011f, -0.002486f, -0.005185f, 0.000977f, -0.003214f, -0.002797f, 0.002890f, -0.005509f, -0.005696f, 0.001943f, 0.004755f, -0.002682f, -0.003629f, -0.002703f, -0.004763f, -0.002210f, 0.001626f, -0.001554f, 0.000946f, 0.002700f, -0.000744f, -0.001307f, -0.004181f, 0.002566f, 0.000292f, -0.013875f, 0.013904f, 0.010561f, 0.000743f, -0.009231f, -0.010359f, -0.004552f, -0.020500f, 0.023635f, 0.017755f, -0.003901f, 0.006528f, 0.002063f, -0.003980f, 0.017904f, -0.001526f, -0.008438f, 0.026531f, -0.028916f, 0.007364f, 0.012349f, -0.000185f, -0.011870f, 0.012599f, 0.001885f, 0.018256f, -0.007172f, -0.002059f, 0.004815f, 0.007241f, 0.001164f, -0.002595f, 0.026611f, 0.011424f, -0.012275f, -0.018514f, 0.012743f, -0.018521f, -0.005425f, -0.021311f, -0.002826f, 0.031681f, 0.012923f, 0.015269f, 0.000036f, -0.016947f, -0.002881f, -0.008328f, -0.003737f, 0.023670f, -0.003777f, -0.026279f, -0.002188f, 0.005047f, -0.016734f, -0.002858f, 0.010671f, 0.008361f, -0.011271f, -0.005945f, + 0.011404f, 0.015093f, -0.004485f, 0.015727f, 0.000212f, 0.003883f, 0.005852f, 0.001246f, 0.006147f, 0.009395f, 0.009117f, 0.008842f, -0.004771f, -0.019096f, -0.021056f, 0.005137f, -0.004284f, 0.014911f, -0.002753f, 0.017713f, 0.005962f, 0.008188f, -0.009552f, -0.008565f, 0.006285f, -0.000429f, 0.001237f, 0.001563f, 0.000728f, -0.008617f, -0.003964f, -0.001419f, -0.007136f, -0.000310f, -0.006138f, 0.000993f, -0.003492f, 0.002522f, -0.000915f, 0.004444f, -0.000058f, 0.002386f, 0.000746f, -0.002390f, -0.002047f, -0.002843f, 0.005578f, 0.000543f, -0.001717f, 0.001685f, 0.002862f, 0.002330f, 0.000501f, -0.004271f, -0.011693f, -0.006707f, 0.000002f, -0.005741f, -0.000181f, -0.001040f, -0.001164f, 0.006900f, -0.001183f, 0.011381f, -0.001783f, 0.010597f, -0.022091f, 0.007511f, 0.005891f, 0.002901f, -0.014572f, -0.012237f, -0.015503f, 0.011549f, 0.005861f, -0.011162f, -0.011146f, 0.014597f, 0.004539f, -0.001495f, -0.009431f, -0.015378f, -0.006460f, 0.005826f, -0.009962f, 0.000845f, -0.018411f, -0.005375f, 0.001801f, 0.005890f, 0.011509f, -0.002221f, 0.007227f, 0.009991f, -0.010834f, -0.025471f, + 0.016985f, 0.000477f, -0.004333f, 0.016163f, -0.002890f, 0.000336f, -0.011457f, 0.014165f, -0.009610f, -0.012084f, -0.004953f, 0.011555f, 0.017666f, 0.014820f, 0.004345f, 0.002728f, -0.032183f, 0.014135f, -0.002304f, 0.005757f, -0.011368f, -0.002404f, -0.012680f, -0.004599f, -0.003399f, -0.016672f, -0.008619f, -0.007025f, -0.009337f, 0.016617f, -0.005842f, 0.021710f, -0.003024f, -0.001566f, 0.013433f, 0.015443f, 0.026181f, 0.017898f, -0.000763f, -0.008943f, -0.001407f, -0.000286f, -0.013146f, 0.002894f, -0.008631f, -0.014308f, 0.026762f, -0.017577f, -0.018729f, -0.002981f, 0.009805f, 0.001179f, 0.002870f, 0.001036f, 0.011089f, -0.000470f, 0.002833f, 0.003772f, -0.004723f, 0.000388f, 0.006708f, -0.004181f, 0.002591f, 0.004778f, 0.003822f, 0.008510f, 0.001670f, -0.000113f, 0.004526f, 0.000613f, -0.001923f, 0.003008f, 0.004694f, 0.001735f, -0.000287f, 0.001297f, 0.000524f, 0.009910f, 0.000546f, 0.008024f, 0.005218f, 0.001017f, 0.008389f, 0.009285f, 0.000685f, -0.000487f, 0.001017f, 0.001103f, 0.000892f, -0.001031f, -0.001400f, 0.002193f, 0.000274f, -0.005603f, -0.008175f, -0.033492f, + 0.007835f, -0.022940f, -0.013594f, 0.022377f, 0.017478f, -0.038288f, -0.035081f, 0.001544f, 0.015461f, -0.008639f, 0.009671f, -0.012406f, -0.001093f, -0.022082f, -0.005523f, -0.019901f, -0.001116f, -0.005197f, 0.000982f, 0.008125f, 0.006708f, 0.012951f, -0.001235f, -0.010406f, 0.009671f, -0.012476f, -0.004813f, 0.004460f, 0.001136f, 0.006881f, 0.013701f, -0.001816f, 0.002008f, 0.003424f, -0.005112f, -0.001073f, -0.019283f, -0.022867f, -0.022160f, 0.000370f, -0.022297f, 0.007923f, 0.003282f, -0.008586f, -0.010212f, -0.004176f, -0.003463f, -0.001596f, -0.013162f, -0.020912f, -0.000914f, 0.034096f, 0.018887f, -0.004415f, -0.019881f, -0.020481f, 0.023573f, -0.021528f, -0.006942f, -0.003551f, -0.014329f, -0.010736f, -0.014613f, -0.017075f, -0.023965f, -0.032439f, -0.004453f, -0.004947f, -0.004409f, 0.011318f, 0.010645f, 0.003056f, 0.009356f, -0.007108f, -0.008858f, 0.030638f, 0.013067f, -0.007760f, -0.022112f, 0.007257f, -0.012995f, -0.015366f, 0.000164f, 0.025743f, -0.004839f, 0.000099f, 0.017698f, -0.001662f, -0.011454f, 0.000802f, 0.004367f, -0.000056f, -0.004578f, -0.004302f, 0.000061f, 0.004597f, + 0.002284f, 0.003168f, 0.001947f, 0.008988f, -0.002373f, 0.004968f, -0.012373f, 0.006096f, 0.003214f, -0.001964f, 0.002835f, -0.002348f, 0.004786f, -0.001984f, -0.003489f, -0.001819f, 0.004358f, 0.003913f, 0.000641f, 0.005141f, -0.006963f, 0.007418f, -0.003395f, -0.004020f, 0.000736f, 0.001898f, -0.028107f, 0.002841f, 0.013680f, 0.014871f, 0.013787f, 0.005609f, 0.027509f, -0.011349f, -0.020581f, -0.005668f, 0.003252f, -0.004478f, 0.008541f, 0.018142f, 0.037084f, 0.023134f, 0.013405f, 0.017028f, -0.014741f, -0.028009f, -0.009781f, -0.021088f, 0.023150f, 0.004898f, -0.005262f, -0.017196f, 0.026319f, 0.022443f, -0.008783f, -0.002137f, -0.000423f, -0.014250f, -0.011818f, -0.021216f, 0.005862f, 0.006689f, 0.011517f, -0.020096f, 0.001497f, 0.005118f, -0.009226f, -0.019552f, 0.000273f, 0.010593f, 0.014362f, 0.001978f, -0.037602f, -0.013842f, -0.018694f, 0.007130f, 0.021971f, -0.000535f, -0.021215f, 0.004463f, -0.020484f, 0.010669f, -0.005177f, 0.001254f, -0.014601f, 0.029558f, 0.023511f, -0.008004f, -0.007220f, -0.017931f, -0.001424f, 0.023501f, 0.005289f, 0.029005f, 0.028278f, 0.023192f, + 0.013746f, 0.004295f, -0.019256f, -0.011196f, -0.025543f, 0.028653f, 0.029188f, -0.002940f, -0.022573f, 0.013822f, 0.033954f, -0.001008f, 0.004190f, -0.008830f, -0.000933f, -0.022987f, 0.003444f, -0.018257f, 0.012010f, 0.003669f, 0.016948f, 0.016378f, 0.009127f, 0.000818f, 0.001438f, 0.009896f, 0.003779f, -0.003054f, -0.006959f, -0.002865f, -0.010581f, 0.001234f, 0.008147f, -0.007548f, -0.003935f, -0.008555f, 0.005760f, -0.002408f, 0.012327f, -0.012326f, 0.003160f, -0.001025f, 0.011757f, -0.006312f, 0.003918f, 0.006490f, 0.001338f, -0.001020f, 0.000487f, 0.001442f, -0.005326f, -0.002810f, 0.007103f, 0.008051f, -0.019282f, -0.005472f, 0.012667f, 0.022691f, -0.025521f, -0.030825f, -0.026737f, 0.027631f, -0.012667f, 0.018184f, -0.001142f, -0.000552f, 0.044991f, -0.006393f, 0.002518f, -0.021159f, -0.032490f, 0.007036f, -0.005573f, 0.007672f, 0.004712f, -0.003398f, -0.018949f, 0.004262f, 0.005916f, 0.002313f, -0.017934f, 0.010454f, 0.007393f, 0.032579f, -0.016263f, 0.001423f, 0.017443f, 0.017826f, -0.000107f, 0.018006f, -0.005597f, -0.000123f, 0.016042f, 0.013371f, 0.002996f, -0.008252f, + -0.027738f, -0.021307f, 0.014976f, -0.001342f, -0.006977f, -0.006254f, 0.003194f, 0.035240f, -0.003040f, -0.013549f, 0.017603f, -0.009804f, 0.016597f, 0.003250f, 0.051355f, -0.011187f, -0.002480f, -0.001105f, 0.006955f, 0.016825f, -0.004274f, -0.007071f, 0.010807f, -0.025482f, 0.019173f, 0.035692f, 0.010085f, -0.008722f, 0.019698f, -0.008838f, -0.001870f, 0.040486f, -0.024771f, 0.008148f, 0.015529f, -0.008024f, 0.033805f, 0.007227f, 0.006646f, -0.014351f, -0.020696f, 0.002468f, 0.008272f, -0.022458f, 0.020967f, -0.001117f, 0.004724f, -0.000983f, 0.005567f, 0.018945f, -0.005333f, 0.019116f, 0.008830f, 0.005540f, 0.010511f, 0.008921f, -0.006658f, 0.011612f, 0.011110f, -0.011576f, 0.003164f, 0.007614f, 0.015429f, 0.002653f, 0.003897f, 0.006893f, 0.008714f, 0.013194f, 0.000699f, -0.000732f, -0.001636f, 0.008627f, 0.007589f, -0.010325f, -0.000918f, 0.005260f, 0.008441f, 0.005957f, -0.006186f, 0.012433f, -0.001155f, 0.003451f, 0.000912f, 0.010011f, 0.005005f, 0.003947f, 0.004657f, 0.006487f, 0.004800f, -0.002493f, -0.001567f, 0.001538f, 0.010277f, 0.002009f, 0.001059f, -0.001544f, + 0.001402f, 0.003253f, 0.004098f, 0.000763f, 0.004818f, 0.005633f, 0.009477f, -0.025653f, -0.007013f, 0.018289f, -0.008189f, -0.013194f, -0.011669f, -0.012052f, 0.002739f, 0.018370f, -0.001775f, -0.039461f, 0.000548f, -0.029892f, 0.012317f, 0.013432f, 0.000793f, 0.006557f, -0.012776f, -0.001314f, 0.016668f, -0.037808f, 0.010287f, -0.007952f, 0.021899f, 0.015148f, 0.010177f, 0.002054f, -0.014632f, -0.034108f, -0.001229f, -0.029768f, 0.019252f, 0.000629f, -0.008482f, 0.032122f, 0.017101f, -0.012292f, -0.009407f, -0.006242f, -0.004192f, -0.008505f, -0.016443f, 0.003449f, 0.005574f, 0.046271f, -0.000873f, -0.032475f, 0.000662f, 0.022780f, 0.002344f, -0.016556f, 0.011367f, -0.025159f, 0.017740f, -0.010438f, 0.012001f, -0.014518f, 0.007585f, -0.025758f, 0.069405f, 0.002916f, 0.048185f, -0.004281f, -0.012265f, 0.012625f, -0.014559f, -0.014742f, 0.027200f, 0.026009f, -0.021764f, -0.059472f, 0.057660f, -0.019682f, -0.014816f, -0.007206f, -0.007199f, 0.007791f, -0.004438f, 0.004656f, 0.025316f, 0.006111f, -0.019020f, -0.015806f, -0.011198f, 0.007540f, -0.011731f, -0.001624f, 0.012239f, -0.030827f, + -0.001827f, 0.002131f, -0.004008f, -0.008958f, 0.004344f, -0.006320f, 0.017777f, -0.006589f, 0.008405f, -0.007472f, -0.004612f, 0.000482f, -0.006960f, 0.004616f, 0.004930f, -0.003207f, 0.005179f, -0.007196f, 0.004471f, -0.001893f, 0.000396f, -0.003242f, 0.001056f, -0.012964f, -0.008514f, -0.001860f, -0.004297f, -0.010638f, -0.013056f, -0.007949f, -0.002412f, -0.005675f, -0.000159f, -0.009482f, 0.001043f, -0.008443f, -0.001342f, -0.010988f, 0.006936f, -0.006165f, -0.003613f, -0.003194f, -0.029172f, -0.010259f, -0.008761f, -0.025067f, -0.044249f, -0.010812f, 0.000866f, -0.023442f, 0.011702f, -0.009949f, 0.019912f, -0.016879f, -0.006952f, -0.024113f, 0.057971f, 0.049030f, -0.010804f, 0.011037f, 0.033756f, -0.035187f, 0.035982f, -0.014771f, -0.014752f, 0.013030f, 0.004903f, 0.006240f, -0.005091f, -0.007669f, 0.001188f, 0.011706f, 0.010197f, -0.015592f, 0.018175f, -0.016813f, -0.027965f, 0.020531f, 0.018169f, -0.023346f, -0.028935f, -0.033577f, -0.004739f, -0.005486f, 0.009622f, -0.021901f, -0.027354f, -0.013987f, 0.046319f, 0.016224f, 0.015895f, -0.019674f, 0.017996f, 0.024349f, -0.018735f, 0.045384f, + 0.008621f, -0.016139f, -0.021036f, 0.012198f, -0.017633f, -0.038679f, 0.009649f, -0.000377f, 0.001083f, 0.021242f, 0.019939f, -0.016970f, 0.003452f, -0.049603f, -0.005953f, -0.019533f, 0.041315f, 0.002501f, 0.006015f, -0.023908f, 0.019661f, -0.042145f, -0.004907f, 0.016541f, 0.004981f, -0.004553f, -0.004590f, 0.005143f, -0.001722f, 0.004784f, -0.006082f, 0.001208f, 0.003731f, 0.010055f, 0.002725f, 0.003214f, -0.002058f, 0.005969f, -0.005952f, 0.001923f, 0.018967f, -0.003679f, 0.001086f, -0.005994f, 0.008590f, 0.003880f, -0.000751f, 0.009797f, -0.010068f, -0.009810f, 0.010897f, -0.008955f, -0.003062f, -0.008210f, 0.004768f, -0.012001f, -0.005144f, -0.003931f, 0.009881f, 0.009613f, -0.015136f, 0.002390f, 0.008148f, -0.005336f, -0.017097f, -0.008433f, 0.013141f, -0.003993f, -0.001909f, -0.008369f, -0.021449f, 0.027250f, 0.028721f, 0.025984f, 0.017549f, -0.000198f, 0.023816f, 0.021581f, 0.003650f, -0.004063f, 0.009628f, 0.000081f, -0.024190f, -0.002870f, 0.009256f, -0.018939f, 0.027125f, -0.028213f, 0.022660f, 0.024622f, -0.007020f, -0.005547f, 0.010499f, 0.032848f, 0.024673f, -0.029682f, + -0.006410f, -0.007945f, -0.002295f, 0.007417f, -0.013771f, -0.014504f, 0.032301f, 0.000802f, 0.046355f, -0.030227f, -0.028575f, 0.023286f, -0.015346f, 0.008391f, -0.018069f, 0.015540f, 0.017846f, 0.011702f, -0.007153f, -0.026567f, 0.002731f, 0.008818f, -0.021979f, -0.040583f, -0.001292f, 0.003685f, -0.023834f, 0.043817f, -0.004885f, -0.012438f, 0.058353f, 0.054834f, 0.005602f, -0.007636f, -0.001917f, -0.011719f, 0.013336f, -0.028776f, 0.027095f, 0.003551f, -0.015503f, 0.032555f, 0.005371f, 0.006587f, -0.009143f, -0.017703f, -0.043582f, 0.009583f, -0.014739f, -0.007230f, 0.020336f, 0.008158f, -0.009433f, -0.028606f, -0.007733f, -0.032573f, 0.014085f, 0.029257f, -0.003955f, -0.022142f, -0.015278f, -0.022083f, 0.000440f, 0.011858f, 0.014433f, -0.003041f, -0.015416f, -0.008167f, -0.008313f, 0.002020f, -0.004518f, -0.007531f, 0.006507f, -0.001222f, -0.004387f, 0.007660f, -0.017423f, 0.004997f, 0.004804f, 0.027240f, 0.002722f, -0.006111f, -0.013716f, 0.011976f, -0.014333f, -0.001975f, 0.010484f, -0.019460f, 0.018353f, 0.003794f, -0.000491f, 0.003629f, 0.012518f, -0.006244f, -0.018855f, 0.000373f, + -0.005381f, -0.002505f, 0.018740f, 0.017465f, -0.001915f, 0.005362f, -0.048007f, -0.111261f, 0.037363f, 0.035404f, -0.012394f, 0.007944f, -0.026749f, 0.048084f, 0.030773f, -0.027182f, 0.007814f, 0.006585f, 0.000745f, -0.012205f, -0.008779f, -0.057358f, 0.024338f, 0.028393f, -0.006494f, 0.000033f, -0.003163f, 0.019124f, -0.014339f, 0.036450f, 0.010844f, -0.043216f, -0.024463f, 0.054995f, 0.036127f, -0.035757f, -0.008368f, -0.012678f, -0.021872f, 0.003476f, -0.008702f, 0.007888f, 0.071437f, 0.019512f, 0.074846f, 0.042779f, 0.048256f, 0.043983f, 0.086200f, -0.005595f, -0.007939f, 0.020664f, -0.006029f, -0.072201f, 0.058640f, -0.025323f, 0.033653f, -0.047706f, -0.037926f, -0.071282f, 0.014227f, -0.006510f, -0.023893f, 0.017467f, -0.033476f, 0.000188f, -0.047848f, -0.047787f, 0.013482f, 0.028008f, -0.038821f, -0.010252f, -0.026898f, -0.037371f, -0.041974f, -0.030137f, 0.023050f, -0.018179f, -0.052421f, 0.075436f, 0.047294f, 0.076057f, -0.009863f, -0.016303f, -0.015070f, -0.026763f, -0.043048f, -0.002702f, -0.009416f, -0.032564f, -0.010831f, 0.009654f, -0.023050f, -0.020786f, 0.002466f, -0.003363f, + -0.010241f, -0.008401f, 0.018811f, 0.020032f, 0.000688f, 0.005094f, 0.014268f, 0.017859f, 0.003681f, -0.001443f, -0.002685f, 0.008426f, -0.003511f, 0.002145f, -0.003226f, -0.012483f, -0.000284f, 0.011877f, -0.012259f, 0.016206f, 0.020467f, 0.008670f, 0.000716f, 0.003379f, 0.002205f, -0.013572f, 0.001170f, 0.007794f, -0.006958f, 0.000142f, -0.003156f, 0.002267f, -0.004813f, 0.001848f, 0.007637f, -0.010398f, -0.008838f, 0.016459f, 0.006742f, -0.002052f, 0.002544f, -0.009109f, -0.040522f, -0.106264f, 0.046029f, 0.054984f, -0.024880f, -0.010832f, -0.002751f, 0.062264f, 0.002018f, 0.013324f, 0.013147f, -0.014628f, 0.012386f, 0.029013f, -0.005800f, -0.027877f, 0.006966f, 0.052963f, -0.028048f, -0.017542f, 0.011615f, -0.007377f, 0.039651f, -0.009908f, 0.017881f, -0.020412f, -0.024525f, -0.024488f, 0.025994f, -0.007806f, 0.023076f, 0.026911f, -0.006937f, 0.003563f, 0.000174f, -0.021948f, 0.007292f, -0.019906f, 0.023536f, 0.057648f, 0.094656f, -0.001156f, -0.002694f, -0.040057f, 0.021662f, 0.030995f, -0.000927f, 0.034807f, 0.049749f, 0.020941f, 0.028290f, -0.043619f, -0.026200f, 0.036274f, + 0.094574f, -0.017306f, -0.055512f, 0.014165f, -0.018452f, -0.000985f, 0.025642f, 0.000498f, -0.025320f, -0.012094f, -0.013068f, -0.064306f, -0.026884f, 0.000436f, 0.010672f, 0.022448f, -0.003694f, -0.024720f, -0.014247f, 0.006082f, -0.010028f, -0.024826f, 0.025596f, 0.061894f, 0.026772f, 0.033346f, 0.003413f, -0.008436f, -0.050331f, -0.011118f, 0.014294f, 0.011145f, -0.011274f, 0.028563f, -0.008077f, 0.015989f, -0.035232f, 0.002053f, -0.012153f, -0.010130f, 0.000333f, 0.009790f, 0.009580f, -0.009930f, -0.019172f, 0.018558f, -0.007275f, 0.015249f, 0.001362f, -0.003841f, 0.001250f, 0.003278f, 0.014096f, 0.000474f, -0.002246f, -0.007290f, -0.008085f, 0.012147f, 0.004017f, 0.011195f, -0.023980f, 0.016690f, 0.009638f, 0.004543f, -0.008697f, -0.003176f, 0.017403f, -0.002096f, 0.000677f, -0.013419f, 0.001245f, -0.020589f, -0.004362f, 0.005958f, 0.017439f, 0.008659f, 0.015403f, 0.003547f, -0.002628f, -0.015069f, 0.033965f, 0.011424f, 0.017906f, 0.007133f, 0.051094f, -0.015844f, -0.006169f, -0.019802f, 0.012018f, -0.012229f, 0.011405f, 0.057920f, 0.011618f, -0.060987f, -0.014715f, -0.017666f, + -0.052119f, 0.033430f, 0.015914f, -0.005888f, 0.007603f, 0.003430f, -0.023291f, -0.000050f, -0.001464f, -0.023170f, -0.006797f, 0.050549f, 0.074271f, 0.035102f, -0.025631f, -0.040684f, 0.019463f, 0.033997f, 0.003970f, 0.027224f, -0.018667f, -0.012918f, 0.028001f, 0.008929f, 0.000573f, -0.062031f, -0.080874f, -0.002488f, -0.047223f, -0.027391f, 0.017132f, 0.067949f, 0.014879f, 0.003495f, -0.019479f, -0.023339f, -0.033814f, -0.029772f, 0.005742f, 0.020574f, -0.007082f, -0.033572f, -0.054068f, 0.021667f, 0.001597f, -0.030091f, -0.050389f, -0.034133f, -0.055483f, -0.100330f, -0.060442f, -0.008961f, -0.011858f, 0.120838f, -0.014599f, -0.004452f, 0.069731f, 0.008231f, 0.004085f, 0.041915f, -0.024810f, -0.061001f, -0.070820f, -0.010962f, -0.033831f, -0.037583f, -0.039849f, -0.043736f, 0.008732f, 0.039601f, 0.062995f, 0.037379f, 0.007886f, 0.004124f, -0.015975f, 0.032463f, 0.006864f, -0.009805f, -0.040334f, 0.008385f, 0.029668f, -0.001403f, 0.000069f, -0.014520f, 0.008325f, 0.016384f, 0.027153f, 0.007629f, 0.011659f, 0.010364f, 0.013688f, 0.016758f, 0.017660f, -0.004895f, 0.013493f, 0.002731f, + -0.009077f, -0.021188f, -0.025075f, 0.002581f, 0.006306f, -0.025246f, -0.012098f, -0.024284f, 0.008233f, 0.012523f, 0.019606f, 0.028315f, 0.048104f, 0.035563f, 0.036773f, 0.021685f, 0.014571f, -0.008718f, 0.004229f, 0.000190f, -0.021894f, -0.034285f, -0.025374f, -0.033190f, -0.020705f, -0.028843f, 0.038163f, -0.054153f, 0.013678f, 0.008595f, -0.023579f, -0.075945f, 0.051670f, 0.015329f, -0.004878f, -0.076901f, 0.020468f, 0.011921f, -0.040595f, 0.006776f, 0.035625f, 0.021874f, 0.010380f, -0.034825f, -0.007087f, -0.013010f, 0.006144f, -0.013125f, 0.003232f, -0.026984f, -0.038775f, 0.042518f, -0.029370f, 0.064623f, -0.039873f, -0.036149f, -0.024459f, -0.045438f, 0.004006f, -0.000907f, 0.067923f, -0.050356f, -0.053055f, 0.027323f, 0.017499f, -0.043975f, -0.058415f, -0.006526f, -0.032911f, 0.037816f, 0.008075f, -0.048424f, 0.031413f, -0.008316f, -0.074353f, 0.048769f, -0.033159f, 0.031809f, -0.055319f, -0.013607f, -0.001531f, -0.023336f, -0.009530f, 0.006301f, 0.069849f, -0.018928f, -0.006529f, -0.020157f, 0.019954f, -0.033142f, 0.025865f, 0.054492f, -0.003349f, 0.054789f, 0.043106f, -0.006646f, + 0.087968f, -0.005248f, 0.010175f, -0.002683f, 0.024837f, 0.088578f, -0.007286f, -0.024626f, -0.094788f, 0.073329f, 0.026200f, 0.062591f, 0.021345f, -0.049345f, 0.021931f, 0.013982f, 0.009043f, -0.043822f, 0.024997f, 0.005028f, 0.007223f, -0.023601f, -0.006847f, 0.029852f, 0.025654f, 0.001045f, -0.003077f, -0.003147f, -0.003430f, 0.007243f, 0.018806f, -0.038506f, -0.011330f, -0.005409f, 0.006149f, -0.007944f, 0.008550f, 0.008195f, 0.012133f, -0.009059f, -0.020403f, 0.031632f, 0.049670f, 0.017304f, -0.025453f, -0.021955f, -0.009395f, -0.007536f, 0.013464f, 0.006683f, -0.004947f, -0.031432f, -0.022442f, -0.025476f, -0.002466f, 0.024293f, 0.010726f, 0.020478f, 0.007870f, -0.034249f, -0.006110f, 0.014917f, 0.033286f, 0.020784f, -0.013949f, -0.010495f, -0.007996f, 0.004775f, 0.005807f, -0.000725f, -0.001989f, -0.006540f, 0.052331f, -0.100001f, 0.004133f, -0.112581f, -0.037533f, -0.018877f, 0.034646f, 0.104533f, 0.088883f, 0.032931f, 0.052595f, -0.033690f, -0.028351f, 0.005343f, -0.007403f, 0.024428f, 0.007931f, -0.023268f, 0.035251f, 0.051790f, 0.043072f, 0.032285f, 0.027321f, -0.000586f, + 0.005099f, -0.017228f, 0.049006f, 0.023040f, -0.009059f, -0.029761f, 0.010321f, 0.020285f, -0.005050f, 0.064063f, 0.066881f, -0.038247f, -0.028230f, 0.001702f, 0.052014f, 0.032544f, 0.008553f, 0.006621f, -0.012108f, -0.023063f, 0.013147f, 0.079840f, -0.031973f, -0.039120f, -0.042616f, 0.041842f, 0.017234f, -0.023595f, -0.036828f, -0.059163f, -0.070118f, 0.007976f, 0.015666f, 0.012952f, -0.015277f, -0.004955f, -0.019118f, 0.014134f, -0.055884f, -0.091970f, -0.041331f, -0.006186f, -0.015446f, -0.035774f, 0.046379f, 0.077347f, -0.017117f, 0.040015f, 0.085370f, 0.055774f, 0.019955f, -0.058493f, 0.009718f, 0.010790f, -0.051731f, -0.028500f, -0.008082f, -0.041138f, 0.045371f, 0.064564f, -0.003672f, -0.014626f, -0.007765f, -0.018552f, -0.010286f, -0.026065f, -0.025590f, -0.009264f, -0.012625f, 0.009470f, -0.005602f, -0.006921f, 0.012834f, -0.038833f, -0.004578f, 0.003414f, 0.039799f, -0.040378f, -0.006459f, -0.009044f, 0.007667f, -0.025637f, -0.008940f, 0.008094f, -0.014007f, -0.023683f, -0.003795f, -0.001626f, -0.023292f, 0.027776f, -0.037661f, -0.004053f, -0.013823f, 0.008596f, -0.003897f, -0.010915f, + -0.021957f, 0.000930f, 0.011182f, -0.007657f, 0.005267f, -0.063779f, 0.051430f, -0.006535f, 0.044187f, 0.026803f, 0.001018f, 0.029303f, -0.012858f, -0.003294f, 0.025234f, 0.030929f, 0.004765f, 0.000156f, -0.001017f, -0.028163f, -0.018296f, 0.007526f, -0.039256f, 0.001054f, -0.014760f, 0.000950f, -0.033285f, 0.005669f, 0.001853f, -0.030288f, 0.025284f, 0.010748f, 0.017112f, -0.038038f, -0.010270f, 0.007163f, -0.001997f, 0.002745f, 0.021812f, 0.004819f, 0.006106f, -0.004376f, -0.008436f, -0.005966f, -0.003127f, 0.014072f, -0.006378f, -0.024293f, 0.019664f, -0.033402f, -0.010492f, -0.011467f, 0.003999f, -0.016357f, -0.019375f, 0.025414f, -0.003247f, -0.025516f, 0.015583f, -0.035581f, 0.028490f, 0.008852f, 0.001338f, 0.029335f, 0.032659f, 0.004523f, 0.009304f, -0.024539f, 0.031680f, -0.015520f, -0.021680f, -0.001886f, 0.004683f, 0.059881f, -0.026921f, -0.044251f, 0.037895f, -0.014438f, 0.037865f, -0.006430f, 0.002483f, -0.016577f, 0.022933f, -0.038460f, -0.031891f, -0.012645f, 0.015064f, 0.008979f, -0.002330f, 0.018403f, -0.022864f, -0.023156f, -0.015367f, 0.005449f, 0.006691f, 0.001348f, + -0.000994f, -0.007020f, 0.003969f, -0.031943f, 0.006466f, 0.006488f, -0.007697f, -0.002980f, 0.009628f, -0.005146f, -0.013641f, 0.016482f, -0.008240f, 0.002013f, -0.000700f, -0.004212f, 0.011146f, 0.004790f, -0.011573f, -0.001359f, -0.002749f, -0.010388f, -0.002228f, -0.003872f, -0.021254f, 0.006448f, 0.012989f, 0.010337f, -0.009647f, 0.009646f, -0.015506f, -0.004890f, 0.000390f, -0.010093f, 0.031719f, -0.013324f, -0.165749f, -0.316541f, -0.112348f, -0.247743f, -0.282386f, 0.069776f, -0.009076f, 0.095418f, 0.367178f, 0.398052f, 0.281204f, 0.400884f, 0.329564f, 0.109705f, 0.115716f, 0.085733f, -0.220535f, -0.227111f, -0.126154f, -0.220447f, -0.238340f, -0.079546f, -0.069957f, -0.200833f, -0.151217f, -0.024182f, -0.089426f, -0.109461f, -0.026897f, -0.083679f, -0.148353f, -0.084302f, 0.028107f, -0.059274f, -0.073171f, 0.087816f, -0.014479f, -0.082335f, 0.075753f, 0.139987f, -0.031941f, 0.035286f, 0.216692f, 0.030191f, -0.069024f, 0.143946f, 0.125765f, -0.123990f, 0.071567f, 0.158598f, -0.049009f, 0.017661f, 0.274500f, 0.209541f, 0.105717f, 0.385436f, 0.429057f, 0.219574f, 0.395169f, 0.510208f, + 0.320332f, 0.302275f, 0.419512f, 0.269859f, 0.171763f, 0.190193f, 0.099098f, -0.114944f, -0.222735f, -0.302167f, -0.516029f, -0.627920f, -0.711975f, -0.805134f, -0.793935f, -0.860520f, -0.768777f, -0.570581f, -0.570605f, -0.449749f, -0.040175f, -0.023079f, 0.011780f, 0.322858f, 0.255042f, 0.085092f, 0.169290f, 0.251902f, 0.093331f, 0.112500f, 0.255737f, 0.186280f, 0.038064f, 0.153537f, 0.216513f, 0.093181f, 0.116693f, 0.266328f, 0.099806f, -0.042059f, 0.122823f, 0.086002f, -0.058888f, 0.116013f, 0.257226f, 0.121192f, 0.189640f, 0.410488f, 0.341370f, 0.323507f, 0.482073f, 0.445259f, 0.306887f, 0.266898f, 0.239240f, 0.089639f, -0.003540f, 0.012859f, -0.050384f, -0.160259f, -0.159609f, -0.183231f, -0.313753f, -0.350936f, -0.336497f, -0.377425f, -0.452919f, -0.396673f, -0.383529f, -0.409111f, -0.316843f, -0.214172f, -0.167653f, -0.105619f, 0.003808f, 0.042392f, 0.035478f, 0.058890f, 0.064649f, 0.033182f, 0.030276f, 0.059382f, 0.051335f, 0.034940f, 0.042030f, 0.049155f, 0.037211f, 0.048372f, 0.074016f, 0.081475f, 0.078305f, 0.091354f, 0.096935f, 0.080220f, 0.091982f, 0.084629f, + 0.052786f, 0.027218f, 0.011784f, -0.000740f, -0.010546f, -0.007754f, -0.007884f, -0.015521f, -0.016698f, -0.006231f, 0.007547f, 0.026962f, 0.038547f, 0.046521f, 0.048299f, 0.043324f, 0.043302f, 0.053653f, 0.051998f, 0.050318f, 0.058087f, 0.055003f, 0.040897f, 0.042497f, 0.040543f, 0.024668f, 0.020157f, 0.024769f, 0.011501f, -0.001319f, -0.004005f, -0.017909f, -0.037855f, -0.040677f, -0.046097f, -0.064018f, -0.071136f, -0.066714f, -0.076121f, -0.081518f, -0.072414f, -0.071566f, -0.074669f, -0.065624f, -0.052803f, -0.050114f, -0.042927f, -0.030458f, -0.030326f, -0.029478f, -0.022296f, -0.014951f, -0.011272f, -0.001026f, 0.008164f, 0.011320f, 0.015603f, 0.025839f, 0.035257f, 0.040661f, 0.047946f, 0.048425f, 0.043437f, 0.037703f, 0.034087f, 0.030710f, 0.026461f, 0.021767f, 0.017134f, 0.013122f, 0.009867f, 0.009183f, 0.008321f, 0.006305f, 0.005285f, 0.004357f, 0.002371f, 0.001046f, 0.000191f, -0.000671f, -0.001368f, -0.001619f}, + {-0.008214f, 0.006698f, 0.007177f, -0.003505f, 0.007203f, -0.004454f, -0.001025f, 0.009607f, -0.004027f, 0.004534f, 0.002744f, -0.010794f, -0.004901f, 0.007987f, -0.003199f, -0.001604f, 0.005007f, 0.003288f, 0.003551f, 0.000901f, 0.012342f, 0.002051f, -0.003245f, 0.002713f, -0.004343f, 0.007616f, -0.002268f, -0.004293f, -0.001891f, -0.010110f, -0.003455f, -0.007466f, 0.002374f, -0.000196f, 0.002665f, -0.003034f, 0.004160f, 0.001919f, -0.000511f, 0.001218f, 0.000627f, 0.000901f, 0.001310f, -0.005382f, 0.013214f, 0.001885f, -0.004880f, 0.009753f, -0.002410f, -0.008553f, -0.009345f, 0.008997f, -0.001852f, -0.000798f, 0.005955f, 0.000602f, -0.001608f, 0.004620f, -0.000550f, 0.002646f, 0.000738f, 0.003382f, -0.001846f, 0.003689f, -0.001741f, 0.004397f, 0.006449f, 0.003459f, -0.003884f, -0.004017f, -0.001983f, 0.001674f, -0.004146f, 0.002821f, -0.002057f, 0.003520f, 0.004638f, -0.005880f, -0.003319f, 0.004993f, 0.001467f, -0.001674f, 0.007772f, 0.004455f, 0.003690f, -0.000462f, 0.002021f, -0.000230f, 0.001006f, -0.000976f, 0.001153f, 0.000389f, 0.000530f, -0.001848f, 0.002861f, 0.000876f, + 0.000174f, -0.000575f, 0.001144f, 0.001818f, -0.001024f, 0.001963f, -0.000146f, 0.008419f, 0.001589f, 0.001850f, 0.007055f, 0.000002f, 0.005071f, 0.002364f, -0.000661f, 0.000460f, -0.005651f, 0.002518f, 0.000373f, 0.008654f, 0.003022f, 0.002779f, 0.000321f, 0.002496f, 0.009522f, -0.009143f, 0.005056f, 0.001265f, -0.006044f, -0.002766f, -0.003770f, -0.001301f, -0.003501f, 0.002339f, 0.011013f, 0.006881f, 0.008211f, 0.006481f, 0.011231f, 0.008135f, -0.010300f, -0.018672f, -0.002408f, 0.000781f, -0.004585f, 0.009702f, -0.000467f, 0.014576f, -0.006898f, -0.006960f, 0.006274f, 0.000256f, 0.000478f, 0.005716f, -0.010759f, 0.002661f, -0.007716f, 0.010061f, 0.005937f, -0.000127f, 0.015378f, 0.000597f, -0.001516f, -0.002000f, -0.002748f, -0.003915f, 0.007263f, 0.003812f, -0.003793f, -0.001320f, -0.010772f, -0.004810f, -0.001453f, 0.011166f, 0.007651f, 0.001289f, 0.005633f, 0.000124f, 0.006002f, -0.000077f, 0.002466f, -0.006533f, -0.004189f, 0.001483f, 0.000813f, -0.000423f, -0.003292f, 0.002940f, 0.003532f, -0.000989f, -0.003379f, -0.000696f, 0.003563f, -0.000648f, 0.001889f, -0.001799f, + -0.001014f, -0.001436f, 0.001126f, -0.001268f, 0.000190f, -0.000167f, 0.001799f, -0.001587f, 0.001738f, 0.002630f, -0.001294f, 0.000559f, 0.000213f, -0.000141f, 0.003254f, -0.001133f, 0.000822f, -0.001304f, 0.001292f, 0.000871f, 0.000553f, -0.000468f, 0.002863f, -0.000228f, 0.000143f, 0.001131f, 0.003223f, 0.006842f, 0.015447f, 0.004595f, 0.000761f, 0.000568f, 0.004413f, 0.004129f, 0.001001f, 0.002519f, 0.003562f, -0.000143f, -0.000242f, 0.004488f, 0.017464f, 0.005911f, 0.013643f, -0.007589f, -0.006191f, -0.002447f, -0.008066f, -0.009438f, -0.003729f, 0.007158f, -0.011685f, -0.001543f, -0.001304f, -0.018402f, 0.003803f, -0.018590f, -0.006133f, -0.002383f, 0.004525f, 0.000170f, 0.003983f, -0.003539f, -0.000101f, -0.012505f, 0.004724f, -0.004069f, -0.006964f, 0.001448f, 0.003634f, -0.000469f, 0.001012f, 0.005520f, 0.009656f, -0.015990f, 0.004494f, 0.001219f, -0.004677f, -0.005006f, -0.000957f, 0.002355f, -0.002073f, -0.009563f, -0.002200f, 0.002772f, 0.005135f, -0.000530f, 0.012109f, 0.001201f, 0.000614f, 0.005059f, -0.007628f, 0.011535f, 0.003708f, 0.006915f, 0.003094f, 0.005812f, + -0.001118f, -0.000933f, 0.003437f, 0.002130f, -0.001523f, -0.003287f, -0.002727f, -0.005531f, -0.000097f, -0.007474f, 0.000570f, 0.004606f, -0.000339f, -0.003089f, -0.005925f, 0.005476f, -0.003130f, 0.002320f, 0.000862f, -0.000776f, -0.005639f, 0.000644f, -0.000492f, 0.001569f, -0.001699f, -0.001477f, 0.000524f, -0.001660f, -0.003088f, -0.001504f, -0.001272f, -0.000129f, -0.002025f, -0.000171f, -0.001140f, 0.002862f, -0.000470f, -0.001260f, -0.000459f, 0.001617f, -0.000550f, -0.002229f, -0.002568f, 0.002962f, 0.000067f, 0.000442f, -0.001619f, 0.009095f, 0.009946f, -0.000390f, 0.010981f, 0.000624f, -0.001505f, 0.001286f, 0.000861f, -0.002117f, -0.000168f, -0.007780f, -0.004459f, 0.006816f, 0.008043f, -0.009551f, -0.002317f, 0.003873f, -0.006375f, -0.018211f, 0.004464f, 0.006642f, 0.007837f, -0.004236f, -0.004858f, -0.006537f, 0.009849f, 0.011215f, 0.001889f, 0.004385f, -0.008905f, -0.007242f, 0.008340f, 0.003102f, -0.006684f, 0.011580f, -0.011718f, 0.001873f, 0.001076f, 0.010854f, 0.003976f, -0.002486f, 0.001745f, -0.003855f, 0.005959f, -0.014318f, -0.004257f, -0.020598f, -0.008995f, 0.010324f, + -0.000901f, 0.015869f, -0.002204f, -0.013378f, 0.008396f, 0.001784f, -0.005470f, -0.000702f, 0.000619f, -0.005458f, 0.003509f, 0.009477f, 0.010729f, 0.000226f, 0.005115f, -0.000563f, 0.012213f, -0.006300f, 0.005268f, -0.001219f, -0.000238f, 0.000330f, 0.004213f, -0.001321f, 0.015290f, 0.001471f, 0.001366f, -0.002432f, 0.009001f, 0.003026f, -0.003063f, -0.006505f, 0.000121f, 0.006108f, 0.002115f, 0.001753f, -0.004016f, -0.000263f, 0.001223f, -0.000669f, -0.001078f, -0.001153f, -0.002150f, 0.001617f, 0.000129f, 0.000680f, 0.001293f, 0.003184f, -0.001277f, -0.003392f, 0.003680f, -0.001038f, 0.000361f, 0.000026f, -0.000443f, -0.000479f, 0.001459f, 0.001295f, 0.001783f, -0.000688f, 0.001664f, -0.000086f, 0.000963f, 0.001615f, -0.000383f, 0.000168f, 0.001414f, 0.002104f, 0.001173f, 0.001313f, 0.000432f, 0.000127f, 0.011045f, -0.015381f, -0.002261f, -0.010477f, -0.010870f, 0.003678f, 0.001923f, 0.022002f, 0.001003f, 0.007998f, -0.018649f, -0.004583f, 0.003937f, -0.009769f, 0.006205f, 0.001695f, 0.001422f, 0.005249f, 0.006114f, 0.014382f, 0.006333f, -0.002457f, 0.004461f, -0.007402f, + 0.001975f, 0.005711f, -0.000539f, 0.001062f, 0.006312f, 0.008181f, 0.019979f, 0.003781f, -0.003127f, -0.013917f, -0.000714f, 0.010299f, -0.016424f, 0.001652f, -0.001329f, 0.004972f, -0.008297f, -0.009773f, 0.017291f, -0.011278f, 0.003467f, -0.000846f, -0.011036f, 0.025030f, 0.006376f, 0.013057f, 0.006991f, 0.014292f, -0.002771f, -0.005571f, 0.009085f, -0.008619f, 0.006959f, -0.006896f, 0.003737f, 0.009813f, 0.005386f, -0.004596f, -0.000867f, 0.004949f, -0.008909f, -0.006650f, 0.000409f, -0.001175f, 0.014794f, -0.008320f, -0.014042f, -0.002218f, 0.007636f, 0.012420f, -0.007884f, -0.013315f, -0.003002f, 0.018212f, 0.002320f, -0.000144f, -0.006657f, 0.000768f, -0.000486f, 0.005536f, 0.005720f, -0.000498f, 0.002684f, 0.002992f, -0.009043f, -0.002188f, 0.002982f, -0.000565f, 0.005126f, 0.001956f, 0.000428f, -0.003915f, -0.000494f, -0.000643f, 0.001910f, -0.000733f, 0.005357f, -0.001186f, -0.000659f, -0.002832f, 0.000510f, -0.003547f, 0.000063f, -0.000503f, 0.001269f, 0.003051f, 0.000019f, 0.002534f, -0.000261f, -0.003336f, -0.000730f, 0.000184f, 0.001745f, -0.005772f, 0.006783f, -0.023996f, + 0.013755f, 0.004116f, -0.005294f, 0.007432f, -0.019599f, -0.016331f, 0.002227f, -0.008009f, 0.018735f, 0.016667f, 0.017696f, -0.011642f, 0.006935f, 0.000371f, 0.017638f, 0.001353f, 0.012495f, 0.005082f, -0.005163f, -0.015682f, -0.014234f, 0.004684f, -0.018997f, -0.000171f, -0.004425f, -0.009155f, -0.012664f, -0.007370f, 0.000191f, 0.015470f, 0.000134f, 0.006105f, -0.021753f, -0.012073f, -0.002247f, -0.013565f, 0.001025f, 0.013821f, -0.014749f, 0.006243f, -0.000114f, -0.004943f, -0.001312f, -0.003053f, 0.015148f, 0.008221f, 0.007580f, -0.003495f, -0.004534f, 0.020899f, -0.006225f, -0.005541f, -0.017072f, 0.012633f, -0.024262f, 0.003454f, -0.007945f, 0.003923f, 0.008688f, -0.005732f, -0.012929f, -0.007899f, 0.000931f, 0.017752f, -0.008816f, -0.001825f, -0.011400f, -0.009091f, 0.005742f, 0.006248f, 0.013966f, -0.016150f, -0.000097f, -0.008496f, -0.005651f, 0.003538f, -0.006401f, -0.012660f, -0.007270f, -0.001008f, 0.011734f, 0.012044f, 0.004152f, 0.000759f, 0.001761f, 0.005559f, 0.000484f, 0.000962f, 0.002490f, -0.003258f, 0.000363f, 0.005053f, -0.001461f, 0.000698f, 0.006039f, -0.001368f, + -0.000216f, 0.001081f, 0.004396f, 0.000086f, 0.000691f, 0.001712f, 0.000753f, 0.003799f, -0.004345f, -0.004700f, -0.000321f, -0.001642f, 0.000050f, 0.002799f, -0.001175f, 0.005073f, 0.003303f, -0.022331f, 0.006164f, 0.002211f, 0.003906f, -0.030800f, 0.027795f, 0.000706f, -0.000464f, -0.000409f, -0.009900f, 0.003387f, 0.000502f, 0.010037f, -0.008522f, 0.011237f, 0.003317f, -0.006781f, -0.011764f, -0.014764f, 0.007623f, 0.001457f, -0.001141f, 0.001157f, -0.008446f, 0.009415f, 0.007080f, 0.017260f, 0.010327f, 0.006905f, 0.009597f, -0.002102f, -0.009309f, -0.006952f, 0.000712f, -0.004848f, 0.007551f, -0.008232f, -0.012513f, -0.013747f, 0.000953f, -0.018854f, 0.008805f, 0.010060f, -0.011212f, 0.011704f, -0.013570f, 0.007009f, -0.020085f, 0.002848f, -0.003584f, 0.001602f, -0.005246f, -0.000182f, -0.018677f, -0.003029f, -0.006346f, -0.011813f, -0.003074f, -0.009203f, 0.003091f, -0.008283f, -0.004715f, -0.011943f, 0.005455f, -0.011416f, -0.000723f, 0.018604f, -0.003027f, 0.000666f, 0.006127f, -0.003998f, -0.018654f, -0.021310f, -0.003449f, -0.014867f, 0.000864f, -0.003976f, 0.014093f, 0.001128f, + 0.005380f, -0.014004f, 0.001370f, -0.003077f, -0.002443f, 0.010305f, 0.002651f, -0.001112f, -0.005433f, 0.002875f, 0.004083f, 0.001535f, 0.005502f, -0.000127f, 0.003126f, -0.001515f, -0.000432f, 0.000892f, 0.001064f, 0.002012f, -0.000391f, 0.006018f, -0.001559f, -0.004970f, 0.002204f, 0.000017f, 0.001654f, 0.002042f, 0.001390f, -0.000654f, -0.002473f, 0.001587f, -0.004441f, 0.001846f, 0.009127f, 0.006329f, -0.019005f, -0.000412f, 0.003617f, -0.017678f, -0.020153f, 0.011329f, -0.019781f, 0.004081f, 0.013517f, -0.009481f, -0.022765f, -0.009629f, 0.000743f, 0.015367f, -0.005951f, 0.026947f, -0.001641f, -0.001889f, -0.015230f, -0.010743f, -0.001623f, 0.005621f, 0.001704f, -0.005296f, -0.004441f, -0.001027f, -0.005562f, -0.011232f, 0.009626f, -0.009269f, -0.005627f, 0.010252f, 0.003159f, -0.015944f, -0.017016f, -0.015604f, 0.013867f, -0.014498f, -0.015710f, 0.026151f, -0.016099f, 0.011661f, -0.002094f, 0.007213f, -0.023221f, 0.010915f, 0.001516f, -0.003600f, -0.000980f, -0.004367f, 0.007730f, 0.005740f, 0.022210f, -0.005364f, -0.004024f, 0.010654f, 0.021465f, 0.006049f, 0.004451f, -0.009901f, + -0.006510f, -0.017377f, -0.003582f, -0.000261f, -0.000040f, 0.012913f, -0.003864f, 0.006991f, 0.022451f, -0.003248f, -0.000681f, -0.002419f, -0.000304f, -0.022500f, -0.025792f, 0.001504f, 0.017239f, 0.000396f, -0.034285f, 0.009180f, -0.011922f, 0.005966f, -0.021367f, -0.013193f, -0.003234f, 0.000806f, -0.007760f, 0.003644f, 0.008053f, -0.000788f, -0.000960f, -0.000575f, -0.003580f, 0.003721f, -0.004099f, 0.003704f, 0.000617f, 0.001326f, -0.003571f, -0.002339f, -0.005025f, 0.002558f, 0.000450f, -0.001422f, -0.004824f, -0.000924f, -0.001401f, -0.002984f, -0.003557f, 0.002373f, -0.004056f, -0.001427f, 0.003573f, 0.001210f, -0.001941f, -0.000151f, 0.000153f, -0.005101f, 0.000601f, -0.003180f, -0.004182f, -0.000303f, -0.001074f, 0.009495f, -0.001609f, 0.011248f, -0.001733f, -0.004783f, -0.006905f, 0.009541f, 0.005886f, -0.005338f, 0.004329f, 0.009709f, -0.005112f, -0.033098f, -0.014406f, -0.006509f, -0.003695f, 0.014757f, -0.025949f, -0.019054f, 0.015902f, 0.009857f, 0.040040f, 0.011277f, 0.009220f, 0.010999f, 0.005065f, -0.007193f, 0.000787f, -0.007576f, 0.012746f, 0.000557f, 0.012867f, 0.000375f, + -0.000382f, -0.017598f, 0.009103f, -0.011944f, 0.009245f, -0.001849f, 0.009697f, 0.003831f, 0.013022f, -0.020362f, 0.002364f, -0.014131f, 0.016958f, 0.001020f, -0.017052f, 0.022498f, 0.016634f, 0.010678f, -0.010222f, -0.034306f, 0.009859f, -0.003739f, -0.004268f, 0.016788f, -0.001636f, 0.007763f, 0.016230f, -0.003601f, -0.020609f, -0.000183f, 0.009231f, 0.006000f, -0.005539f, -0.002304f, -0.015106f, 0.005603f, 0.002061f, 0.003185f, -0.002271f, 0.002130f, 0.012992f, -0.008104f, 0.005928f, -0.002147f, -0.000495f, 0.023400f, -0.006291f, 0.010743f, 0.007722f, -0.007393f, -0.008233f, 0.002906f, 0.001766f, -0.003955f, 0.001973f, -0.004118f, 0.003773f, -0.003681f, 0.008914f, 0.000792f, 0.008523f, 0.001617f, -0.000216f, 0.010708f, 0.003809f, -0.003200f, 0.003016f, -0.002538f, -0.003343f, 0.001532f, 0.004274f, -0.004083f, 0.002727f, -0.002121f, -0.004164f, -0.000217f, 0.004265f, -0.001990f, -0.004636f, 0.001399f, -0.002166f, -0.007212f, 0.003112f, -0.000011f, -0.003666f, -0.002199f, -0.001203f, -0.004100f, -0.000335f, 0.005283f, 0.007638f, -0.007252f, 0.000989f, 0.008455f, -0.009527f, -0.037429f, + 0.007543f, 0.009007f, 0.037767f, -0.008016f, -0.006162f, 0.017833f, 0.023438f, -0.038414f, -0.021948f, 0.020876f, -0.010958f, 0.000632f, 0.008517f, -0.024491f, -0.053571f, -0.021071f, 0.030335f, 0.024112f, 0.020387f, -0.006279f, 0.011399f, -0.006307f, 0.010492f, -0.011209f, 0.003649f, -0.027050f, 0.006544f, -0.009583f, 0.013767f, 0.013395f, 0.000402f, -0.012796f, 0.012529f, 0.007890f, 0.021683f, -0.002301f, -0.013571f, -0.006771f, -0.034339f, -0.017568f, 0.008335f, -0.002339f, -0.023025f, 0.015538f, 0.021289f, -0.030313f, 0.029203f, -0.002837f, -0.003292f, 0.018367f, 0.003715f, 0.017365f, -0.002361f, 0.006185f, -0.006698f, -0.003577f, 0.008736f, 0.034936f, -0.012726f, 0.022230f, -0.001950f, 0.002045f, 0.008299f, 0.019354f, -0.018007f, 0.002046f, 0.028334f, 0.008440f, -0.013111f, 0.007536f, 0.011138f, 0.002585f, 0.022246f, 0.016100f, 0.027986f, -0.002578f, 0.007962f, -0.000294f, 0.000886f, -0.015651f, -0.010933f, -0.012451f, -0.006112f, -0.000063f, -0.002707f, -0.005060f, -0.004546f, 0.008350f, 0.012042f, 0.005531f, -0.006358f, 0.009741f, -0.002951f, -0.001596f, -0.005968f, -0.004739f, + 0.006061f, 0.002018f, -0.002345f, 0.000368f, -0.006614f, -0.005542f, -0.006511f, 0.000126f, -0.003688f, 0.005681f, 0.003385f, -0.002428f, 0.002407f, 0.006659f, -0.004195f, 0.003061f, 0.003774f, -0.003563f, -0.003340f, -0.003791f, -0.000744f, -0.001083f, 0.004019f, -0.001401f, 0.000567f, -0.001740f, -0.024348f, -0.006209f, 0.025112f, 0.015955f, 0.018930f, -0.012289f, -0.006207f, -0.001974f, -0.002660f, 0.026909f, 0.003465f, -0.027680f, -0.012354f, -0.008462f, 0.017743f, 0.003470f, 0.003806f, 0.015087f, 0.033003f, -0.048808f, 0.032353f, -0.006426f, -0.005798f, -0.012614f, 0.009609f, 0.009964f, 0.019001f, 0.002964f, 0.018106f, -0.001875f, -0.004870f, 0.005632f, -0.003063f, 0.009270f, 0.016642f, 0.001980f, -0.001289f, 0.021931f, -0.016339f, -0.003026f, 0.005316f, -0.001906f, 0.019291f, -0.022812f, 0.002042f, -0.019520f, 0.003136f, -0.020695f, -0.002964f, 0.000643f, 0.011309f, 0.028039f, -0.016400f, -0.009008f, -0.017002f, -0.000984f, -0.024831f, -0.016101f, -0.016345f, 0.011004f, 0.020196f, 0.000262f, 0.040062f, -0.025431f, 0.035793f, -0.025269f, -0.005969f, 0.011069f, 0.008093f, 0.035543f, + 0.020421f, -0.026607f, 0.013843f, -0.011153f, -0.036859f, -0.000920f, -0.023393f, 0.029403f, 0.044594f, 0.028428f, -0.005621f, -0.015818f, -0.005905f, 0.024994f, -0.003795f, 0.013030f, 0.001434f, 0.005779f, 0.008745f, 0.002801f, 0.003432f, 0.002955f, -0.010986f, 0.007579f, 0.000047f, 0.003202f, -0.004296f, -0.003588f, -0.010437f, -0.005786f, -0.003655f, 0.006365f, -0.003263f, 0.004269f, 0.005285f, -0.002032f, -0.001418f, 0.000149f, 0.006030f, 0.003896f, 0.002174f, 0.011429f, -0.000271f, 0.011941f, -0.010713f, -0.004679f, 0.007579f, 0.007406f, -0.004545f, 0.002538f, -0.003831f, -0.007748f, 0.000812f, -0.002747f, -0.025451f, -0.016354f, -0.000642f, 0.030624f, -0.006098f, 0.013457f, 0.028429f, -0.024351f, 0.010256f, -0.038846f, 0.023179f, -0.023911f, -0.011810f, 0.037261f, 0.012494f, 0.040184f, -0.017483f, 0.000072f, -0.018521f, 0.011475f, 0.051565f, 0.013103f, 0.017320f, -0.026377f, -0.005265f, 0.001086f, 0.019689f, 0.017406f, 0.032906f, -0.027175f, -0.009627f, -0.029555f, -0.025153f, 0.001642f, 0.001776f, 0.017172f, -0.017252f, 0.011961f, -0.040107f, 0.024777f, 0.018706f, 0.008793f, + -0.007022f, -0.004932f, 0.002321f, 0.011639f, 0.003651f, 0.003122f, -0.000476f, 0.026882f, 0.022949f, 0.009817f, 0.001807f, -0.020738f, -0.020480f, 0.055709f, 0.001797f, 0.006760f, 0.030902f, 0.013578f, -0.009102f, -0.006810f, 0.019559f, 0.040050f, -0.029461f, -0.012383f, -0.033165f, -0.030794f, 0.039129f, 0.017403f, 0.000137f, -0.007966f, 0.012795f, 0.029735f, 0.018859f, 0.030687f, 0.008373f, -0.014035f, 0.022142f, -0.016238f, -0.041252f, 0.011895f, 0.001209f, 0.000460f, -0.000159f, 0.016943f, 0.029414f, -0.006281f, 0.015450f, 0.017235f, 0.015634f, 0.001644f, 0.003273f, 0.015074f, -0.000057f, -0.004984f, -0.003603f, -0.006674f, 0.014705f, -0.008943f, -0.002742f, 0.003505f, 0.008191f, 0.000962f, -0.001639f, 0.015709f, 0.003089f, -0.003658f, 0.011779f, 0.015010f, 0.006789f, -0.006652f, -0.000313f, -0.003139f, 0.004454f, -0.000137f, -0.000195f, -0.000708f, -0.003771f, 0.005036f, 0.001806f, 0.001060f, 0.004943f, 0.006519f, -0.001447f, -0.007703f, -0.003111f, -0.001246f, 0.008775f, 0.002877f, -0.006551f, 0.001953f, 0.003395f, 0.009361f, 0.004059f, -0.000814f, 0.008760f, 0.000142f, + 0.004517f, -0.003669f, -0.000121f, -0.000345f, 0.001515f, -0.001276f, 0.012138f, -0.026092f, -0.019467f, -0.007639f, -0.024251f, 0.027332f, -0.003055f, -0.006974f, -0.023084f, -0.003854f, -0.021487f, -0.053304f, 0.009290f, -0.006577f, -0.016779f, 0.012033f, -0.028229f, -0.001734f, -0.015409f, -0.042748f, -0.009748f, -0.018562f, -0.020199f, 0.034116f, -0.009097f, -0.012363f, -0.006167f, -0.000827f, -0.008621f, -0.012107f, -0.001893f, 0.008960f, 0.028942f, 0.021724f, -0.000783f, -0.001740f, -0.048451f, 0.002901f, 0.006666f, 0.019814f, -0.011154f, -0.010149f, 0.073616f, -0.012717f, -0.035927f, -0.035033f, 0.030558f, -0.020525f, 0.008853f, -0.041517f, 0.010355f, -0.011721f, -0.022116f, -0.019270f, -0.047064f, 0.007457f, 0.013584f, 0.033386f, 0.009916f, -0.018270f, 0.026465f, 0.002992f, 0.024901f, 0.027470f, 0.079609f, 0.021190f, 0.005593f, -0.031085f, -0.034591f, -0.009479f, 0.003772f, -0.004590f, -0.031296f, 0.013918f, 0.036471f, 0.008228f, 0.025967f, 0.039914f, 0.036021f, -0.015452f, -0.028681f, -0.019869f, 0.002624f, 0.006162f, -0.003433f, -0.030753f, 0.005983f, -0.025060f, 0.007690f, -0.011261f, + 0.001720f, -0.013959f, 0.009102f, -0.002535f, 0.005827f, 0.000476f, -0.005749f, -0.014286f, -0.003115f, -0.000634f, 0.008308f, 0.011074f, 0.009085f, 0.012800f, 0.000864f, 0.010898f, 0.019705f, 0.000139f, 0.003827f, 0.010684f, 0.003921f, -0.010279f, -0.005557f, -0.017271f, -0.004884f, 0.009781f, 0.005858f, 0.000862f, -0.002120f, 0.006034f, 0.003729f, -0.003992f, -0.007786f, -0.015206f, 0.002055f, 0.001880f, -0.001990f, -0.005301f, -0.001001f, -0.005700f, 0.002973f, -0.010731f, -0.032188f, -0.013961f, -0.005036f, 0.009848f, -0.011805f, 0.019045f, -0.009982f, -0.013212f, 0.037043f, 0.019234f, 0.042134f, 0.000483f, -0.012315f, -0.016707f, 0.044677f, -0.038477f, -0.014393f, 0.052153f, -0.031555f, 0.010385f, 0.010813f, 0.013495f, 0.003015f, 0.029287f, -0.009206f, 0.026353f, -0.010068f, 0.005726f, 0.006257f, -0.013629f, 0.019562f, -0.029770f, -0.020747f, -0.019336f, -0.008921f, -0.026468f, -0.048748f, -0.008916f, -0.014637f, 0.007696f, -0.012605f, -0.064754f, 0.017931f, 0.040595f, -0.002404f, -0.008698f, 0.063557f, -0.078856f, -0.017111f, 0.043908f, -0.010831f, 0.034063f, -0.025115f, -0.015602f, + 0.011784f, -0.075260f, 0.024275f, -0.025661f, 0.037557f, 0.027587f, -0.040042f, 0.078883f, 0.011596f, 0.004139f, -0.004097f, 0.031055f, -0.057160f, 0.023333f, -0.002736f, -0.009114f, 0.015257f, -0.036960f, 0.052203f, 0.047383f, -0.087702f, 0.012549f, -0.017494f, -0.082323f, -0.014212f, -0.036780f, 0.020205f, 0.005144f, 0.014219f, -0.033268f, 0.051593f, -0.005106f, -0.013902f, 0.023803f, -0.001031f, 0.016894f, -0.003649f, 0.026701f, 0.000607f, 0.013285f, 0.004117f, -0.001231f, -0.002882f, 0.014901f, -0.010860f, -0.012212f, 0.000235f, -0.014337f, 0.021351f, -0.004731f, -0.011118f, 0.001088f, 0.009808f, 0.004663f, 0.010117f, 0.003871f, 0.024780f, 0.005810f, -0.013522f, 0.025657f, -0.013985f, 0.014565f, 0.022121f, -0.006255f, 0.004951f, 0.015467f, -0.010731f, 0.000811f, -0.013987f, 0.015121f, 0.002170f, 0.048046f, -0.021901f, -0.062580f, -0.062786f, 0.004691f, 0.007494f, -0.027753f, 0.016062f, -0.035048f, 0.010909f, -0.016032f, 0.031916f, 0.040953f, 0.001091f, 0.039614f, 0.036023f, -0.020425f, -0.000762f, -0.026055f, -0.006726f, -0.006315f, 0.013757f, -0.002790f, -0.004228f, -0.004581f, + -0.042023f, -0.063430f, -0.025646f, 0.032717f, 0.025246f, -0.027360f, -0.031431f, 0.017959f, 0.018207f, -0.041339f, 0.020485f, -0.027587f, -0.005336f, 0.031545f, 0.043904f, 0.000070f, -0.026401f, 0.016659f, 0.003132f, 0.027273f, 0.004537f, 0.022720f, 0.023468f, -0.006926f, -0.090756f, 0.010028f, 0.002149f, 0.036402f, -0.013561f, 0.037130f, 0.036805f, -0.024994f, -0.122894f, -0.016674f, 0.004805f, -0.014959f, 0.073564f, 0.077190f, 0.053784f, 0.076700f, -0.020114f, 0.035952f, -0.030561f, 0.051193f, 0.035820f, -0.060796f, 0.076333f, -0.079356f, -0.067620f, -0.063754f, 0.019991f, 0.047594f, 0.039595f, 0.013143f, -0.049844f, 0.045617f, 0.006179f, -0.016663f, -0.021461f, 0.002498f, 0.043060f, -0.033683f, -0.013600f, 0.065890f, 0.012016f, 0.030018f, 0.005594f, 0.003002f, 0.016081f, -0.025186f, 0.013253f, -0.010422f, 0.000306f, 0.006555f, -0.006581f, -0.013164f, -0.008734f, -0.011554f, -0.025308f, 0.005399f, 0.023078f, -0.004871f, 0.023600f, 0.018202f, -0.015453f, -0.012309f, -0.011514f, 0.014470f, 0.009019f, -0.030876f, -0.017966f, 0.001339f, 0.001280f, -0.004830f, 0.003844f, 0.019813f, + -0.000717f, 0.015691f, 0.001427f, -0.012117f, 0.007610f, 0.026276f, -0.048731f, -0.091932f, 0.019162f, 0.033696f, -0.005080f, 0.046373f, 0.017676f, -0.058049f, -0.014750f, 0.012163f, 0.014107f, 0.015789f, -0.011844f, 0.026687f, 0.002144f, -0.017428f, -0.008066f, 0.009405f, 0.038039f, 0.049668f, 0.037511f, 0.059595f, -0.057600f, -0.016106f, -0.015056f, -0.058930f, -0.014243f, 0.009953f, 0.002843f, 0.006381f, -0.023576f, -0.026664f, 0.029727f, 0.066987f, -0.031942f, 0.034499f, -0.022847f, 0.008850f, -0.021086f, -0.003753f, -0.052514f, -0.019232f, -0.003165f, -0.072686f, -0.042580f, -0.071142f, -0.060101f, 0.039536f, 0.093394f, 0.074496f, 0.001999f, -0.004880f, 0.000055f, -0.017014f, -0.032382f, -0.113664f, -0.038134f, -0.016470f, 0.009054f, 0.004662f, -0.040251f, -0.028182f, 0.014505f, 0.049738f, 0.029574f, 0.015894f, 0.032438f, 0.055803f, 0.021710f, -0.056273f, 0.042671f, -0.033420f, -0.017622f, 0.033008f, 0.074547f, 0.015874f, 0.095644f, -0.023095f, -0.099923f, -0.011768f, -0.032419f, -0.061366f, 0.091939f, 0.025904f, 0.029742f, -0.000445f, -0.008458f, 0.026404f, 0.021759f, 0.001003f, + -0.003996f, -0.016282f, -0.003494f, -0.005040f, 0.024921f, 0.030129f, 0.036072f, -0.004433f, -0.001624f, -0.001774f, -0.001608f, 0.023509f, -0.010520f, -0.008309f, -0.014296f, -0.011309f, 0.013230f, -0.003113f, -0.000748f, 0.003688f, 0.008312f, 0.013656f, 0.016999f, -0.002778f, -0.010633f, -0.018377f, 0.008661f, 0.003005f, 0.008138f, 0.022119f, 0.019362f, -0.010383f, 0.004603f, 0.009744f, -0.017877f, -0.005777f, -0.004418f, -0.017222f, -0.008151f, -0.001155f, 0.014817f, -0.024764f, -0.038813f, -0.063759f, 0.039940f, -0.005925f, -0.038390f, 0.018964f, 0.042336f, 0.036694f, -0.074540f, -0.064361f, 0.016429f, -0.029753f, 0.007944f, 0.036872f, -0.019617f, -0.014399f, 0.060773f, 0.016691f, -0.008151f, -0.018974f, -0.016898f, 0.022973f, -0.013339f, -0.002404f, -0.001514f, -0.024363f, -0.009252f, -0.040719f, -0.054292f, 0.019739f, 0.030044f, -0.034202f, 0.025445f, 0.017479f, -0.011647f, -0.023655f, 0.003936f, 0.043371f, 0.025084f, 0.008013f, -0.042904f, -0.048027f, -0.023271f, 0.013287f, 0.054293f, -0.040261f, -0.021197f, -0.018174f, 0.032521f, 0.087313f, 0.023293f, -0.084917f, -0.018679f, -0.009781f, + 0.043977f, 0.001225f, 0.022895f, -0.010885f, -0.019958f, -0.018630f, -0.047980f, 0.045177f, 0.047855f, 0.019421f, 0.050581f, -0.015531f, 0.032797f, -0.014856f, -0.036098f, -0.039989f, -0.042759f, 0.007828f, -0.080264f, 0.084638f, -0.003736f, -0.031830f, -0.046309f, -0.037863f, -0.002344f, -0.024716f, -0.007306f, -0.044084f, -0.027134f, -0.078506f, -0.021678f, -0.051649f, 0.019352f, -0.018200f, 0.015556f, 0.017872f, 0.019147f, -0.012792f, 0.043736f, -0.009662f, 0.031744f, 0.001386f, 0.007811f, -0.002240f, 0.013935f, -0.006509f, -0.017217f, 0.003795f, 0.005225f, 0.016420f, -0.025818f, -0.008885f, 0.006949f, -0.025468f, 0.000299f, 0.009630f, -0.031871f, -0.013840f, 0.007877f, -0.004248f, -0.024374f, -0.037788f, -0.022624f, 0.014086f, -0.007032f, 0.017649f, 0.004395f, 0.000884f, 0.025965f, 0.001997f, 0.022354f, 0.008794f, 0.013994f, 0.051932f, 0.031162f, -0.014338f, 0.008047f, -0.017872f, 0.000877f, -0.008373f, 0.065366f, 0.049078f, 0.018798f, 0.009746f, 0.030789f, 0.027908f, -0.044279f, -0.063834f, 0.021788f, 0.049968f, 0.071450f, 0.000455f, -0.015945f, -0.044545f, -0.026179f, 0.030055f, + -0.000833f, -0.038019f, -0.076754f, -0.076706f, 0.016197f, -0.023027f, 0.043072f, -0.088382f, -0.029200f, 0.017251f, 0.012742f, 0.016888f, -0.027981f, 0.012900f, -0.002370f, -0.016554f, -0.003292f, -0.041441f, 0.038292f, 0.047299f, 0.035107f, -0.055811f, -0.029871f, -0.001264f, 0.018949f, 0.028182f, 0.030084f, 0.024213f, -0.006324f, -0.003888f, -0.007577f, 0.040079f, 0.110902f, 0.070158f, -0.057761f, -0.056684f, -0.036129f, -0.073049f, 0.086194f, 0.046122f, -0.026733f, -0.075769f, -0.072756f, 0.082876f, 0.050865f, 0.011246f, 0.063628f, -0.065945f, -0.007340f, 0.004283f, -0.017064f, 0.006641f, -0.024670f, -0.066692f, 0.016578f, -0.050921f, 0.068332f, 0.064871f, -0.024731f, -0.011263f, 0.000691f, 0.007654f, 0.072713f, 0.074710f, -0.118127f, -0.065593f, -0.038007f, 0.015159f, 0.033100f, 0.032388f, -0.045819f, -0.048755f, -0.058033f, -0.006858f, 0.060013f, 0.001666f, 0.011876f, -0.013376f, -0.064192f, 0.015121f, -0.026971f, -0.033190f, 0.014555f, 0.112648f, 0.037867f, -0.020643f, -0.028863f, -0.026517f, -0.022308f, 0.029879f, 0.034961f, 0.040950f, -0.007395f, 0.026576f, -0.039832f, 0.010027f, + 0.014383f, 0.018524f, -0.014410f, 0.008169f, 0.033090f, -0.008169f, -0.009519f, -0.005107f, 0.032656f, 0.021752f, 0.050904f, 0.013317f, -0.018271f, -0.013243f, 0.018777f, 0.063554f, 0.051232f, 0.011193f, -0.037959f, -0.046047f, -0.015116f, -0.010694f, 0.010889f, 0.004998f, -0.018827f, -0.023132f, 0.043477f, -0.070976f, 0.061940f, 0.091320f, 0.099098f, -0.111641f, 0.020553f, -0.003468f, -0.009561f, 0.047314f, -0.020141f, -0.033150f, 0.032761f, 0.016699f, 0.067915f, -0.006918f, -0.053742f, 0.001627f, -0.024518f, 0.040118f, -0.061757f, -0.021872f, -0.029020f, -0.041155f, 0.056401f, -0.041246f, -0.005858f, 0.038841f, 0.022551f, -0.013691f, -0.021575f, -0.057803f, 0.007472f, 0.076148f, 0.046375f, -0.003272f, 0.022644f, -0.017175f, 0.062195f, -0.041922f, 0.028727f, -0.023138f, 0.038632f, 0.064211f, -0.014273f, -0.041704f, 0.020583f, -0.056875f, 0.094196f, 0.011051f, -0.050007f, -0.017116f, -0.078016f, 0.009951f, 0.111712f, -0.020343f, -0.065756f, -0.045914f, 0.068479f, 0.020462f, -0.035987f, -0.001823f, 0.017630f, 0.038442f, 0.094115f, -0.076796f, 0.034186f, 0.077181f, -0.011726f, -0.091195f, + -0.088357f, -0.051699f, 0.154651f, -0.113197f, 0.038310f, -0.119219f, -0.057367f, 0.249089f, 0.023892f, -0.108574f, -0.104412f, -0.120256f, 0.151658f, 0.019580f, -0.028765f, -0.120493f, -0.029030f, 0.037710f, 0.122705f, -0.043972f, 0.013275f, -0.053055f, 0.018159f, 0.074628f, 0.045387f, -0.066666f, 0.031392f, 0.012300f, 0.028800f, 0.025732f, -0.067866f, 0.002384f, -0.016198f, -0.025568f, 0.013309f, -0.024788f, -0.050073f, 0.019242f, -0.014863f, 0.065061f, 0.009530f, -0.059687f, -0.068412f, -0.021640f, 0.001744f, 0.052494f, 0.039247f, 0.009328f, -0.032024f, 0.013611f, -0.001489f, -0.025221f, 0.001642f, 0.033492f, 0.029143f, 0.007403f, -0.050508f, 0.012736f, 0.019429f, 0.032087f, 0.028121f, 0.020731f, -0.009996f, -0.032464f, -0.012538f, -0.007551f, -0.010350f, 0.015763f, -0.026718f, -0.007204f, -0.009649f, -0.012479f, 0.040620f, -0.104876f, 0.018449f, -0.094223f, 0.041685f, 0.044637f, 0.088100f, 0.039022f, 0.020245f, 0.023087f, -0.027388f, -0.067259f, -0.046772f, -0.044152f, 0.018928f, 0.011019f, -0.011422f, 0.040302f, 0.062144f, -0.027739f, -0.038961f, 0.043171f, 0.007712f, -0.057401f, + -0.013172f, 0.026061f, -0.047350f, -0.008332f, 0.010510f, 0.024167f, 0.012899f, 0.034162f, 0.058536f, 0.010368f, -0.037266f, -0.004274f, 0.011307f, -0.029596f, -0.013210f, 0.027383f, -0.020742f, -0.037484f, 0.052216f, -0.012559f, -0.012892f, -0.020736f, -0.020476f, 0.033855f, 0.008652f, 0.007760f, 0.045068f, -0.021496f, -0.034758f, -0.001991f, 0.003384f, -0.014728f, 0.011550f, -0.002423f, -0.012358f, -0.002214f, -0.043841f, 0.009812f, 0.008625f, -0.007437f, 0.023674f, 0.015991f, 0.008296f, 0.010598f, -0.045282f, 0.053681f, -0.020062f, -0.019388f, 0.016470f, -0.049047f, 0.016009f, -0.036725f, 0.004310f, -0.029049f, 0.009477f, 0.012846f, 0.019898f, 0.001799f, 0.017653f, 0.026605f, -0.010230f, -0.005975f, 0.014774f, -0.000877f, -0.009319f, 0.008124f, 0.001909f, -0.006102f, -0.009377f, -0.008521f, -0.005619f, 0.019213f, -0.018317f, 0.018637f, 0.001310f, 0.005068f, 0.009343f, 0.005567f, 0.013594f, -0.000734f, -0.000339f, -0.008271f, -0.001800f, -0.011408f, 0.023102f, 0.001713f, -0.010317f, -0.016860f, -0.005488f, 0.008960f, -0.016468f, 0.021892f, -0.010594f, -0.027769f, 0.001610f, 0.011798f, + -0.001581f, -0.000801f, 0.002882f, -0.013127f, -0.007925f, -0.048981f, 0.078628f, -0.004286f, 0.044421f, -0.040706f, 0.004808f, -0.007539f, 0.013888f, 0.012536f, 0.023710f, -0.012421f, 0.017392f, -0.011151f, 0.009487f, -0.001967f, 0.007460f, 0.018807f, -0.002571f, 0.029281f, -0.012067f, 0.022072f, 0.000951f, -0.001154f, -0.008559f, 0.014058f, -0.011584f, 0.012679f, -0.007811f, 0.000692f, -0.006518f, 0.006847f, -0.005363f, 0.016562f, -0.005458f, -0.011962f, 0.026662f, -0.018805f, 0.013834f, 0.011107f, 0.003913f, 0.012822f, -0.016704f, -0.011652f, 0.012117f, 0.011333f, -0.007476f, -0.001755f, 0.012936f, -0.001387f, -0.018565f, 0.007864f, -0.009544f, 0.009229f, 0.012554f, 0.005815f, 0.004152f, 0.003932f, -0.019966f, 0.009443f, 0.005339f, -0.006170f, 0.007001f, -0.009505f, 0.004282f, -0.004836f, -0.001123f, -0.002700f, 0.006667f, 0.013077f, -0.018640f, 0.016224f, -0.003476f, -0.006702f, 0.009225f, -0.013031f, 0.005853f, 0.008819f, -0.002453f, -0.004865f, 0.006084f, -0.002731f, 0.003481f, -0.001944f, -0.006782f, -0.001232f, 0.006822f, -0.002090f, 0.002498f, -0.001673f, -0.005036f, 0.002891f, + 0.002618f, 0.004745f, -0.007201f, 0.005373f, -0.000709f, -0.003110f, 0.006380f, -0.007613f, 0.011313f, 0.005647f, -0.004557f, 0.011547f, -0.001136f, -0.004882f, 0.000236f, -0.004878f, 0.006808f, -0.007939f, 0.007843f, 0.003032f, 0.004114f, 0.001805f, -0.004877f, 0.003670f, 0.001586f, 0.000690f, 0.000504f, 0.000096f, -0.002121f, 0.001892f, -0.005088f, 0.005679f, 0.002135f, -0.005784f, 0.019568f, -0.066506f, -0.207193f, -0.030512f, 0.100569f, 0.051980f, 0.244495f, 0.045411f, 0.052551f, 0.033019f, -0.065897f, -0.092855f, -0.066122f, -0.119017f, -0.102235f, -0.058069f, -0.023797f, 0.067980f, 0.185695f, 0.147200f, 0.126859f, 0.072014f, -0.057159f, -0.093103f, -0.068433f, -0.128275f, -0.121397f, -0.037350f, -0.017040f, -0.028465f, 0.047065f, 0.073461f, 0.048688f, 0.089613f, 0.069372f, 0.021074f, 0.063812f, 0.012846f, -0.009484f, 0.005715f, -0.038463f, -0.101380f, -0.086031f, -0.073290f, -0.102589f, -0.043154f, 0.029977f, 0.020413f, 0.065706f, 0.074189f, 0.065026f, 0.066529f, 0.068158f, 0.042985f, 0.042243f, 0.004416f, -0.037847f, -0.070942f, -0.048271f, -0.066799f, -0.087993f, -0.043569f, + -0.040356f, -0.033104f, 0.012485f, 0.033163f, 0.031980f, 0.061994f, 0.077798f, 0.037394f, 0.054857f, 0.046566f, -0.012953f, 0.005198f, 0.021084f, -0.026065f, -0.023346f, -0.041678f, -0.074449f, -0.075031f, -0.059336f, -0.061743f, -0.012015f, 0.025649f, 0.017341f, 0.048768f, 0.073563f, 0.057713f, 0.053598f, 0.054776f, 0.036794f, 0.011867f, 0.003559f, -0.017261f, -0.031933f, -0.034663f, -0.051187f, -0.065126f, -0.068944f, -0.059687f, -0.053265f, -0.030725f, 0.007004f, 0.033484f, 0.077224f, 0.101741f, 0.089629f, 0.073953f, 0.063093f, 0.036177f, 0.007752f, -0.031686f, -0.064642f, -0.088631f, -0.092447f, -0.102369f, -0.075146f, -0.031669f, -0.007792f, 0.021155f, 0.060964f, 0.078228f, 0.084859f, 0.086950f, 0.073096f, 0.030664f, -0.002060f, -0.022776f, -0.049376f, -0.064751f, -0.060363f, -0.054082f, -0.038583f, -0.016164f, 0.002173f, 0.021164f, 0.028002f, 0.021071f, 0.023656f, 0.018333f, 0.012928f, 0.009613f, 0.010454f, 0.003037f, 0.003591f, -0.001313f, -0.005058f, -0.006736f, -0.005455f, -0.008649f, -0.009603f, -0.010971f, -0.009258f, -0.009177f, -0.007149f, -0.005247f, 0.000776f, 0.003325f, + 0.006263f, 0.008615f, 0.011742f, 0.010932f, 0.010220f, 0.007746f, 0.006361f, 0.003092f, -0.000415f, -0.004211f, -0.005981f, -0.008723f, -0.010005f, -0.010274f, -0.008481f, -0.008491f, -0.005082f, -0.001777f, 0.001992f, 0.004698f, 0.007817f, 0.007767f, 0.008667f, 0.008481f, 0.008822f, 0.007830f, 0.004259f, -0.001577f, -0.004413f, -0.007544f, -0.008861f, -0.008220f, -0.006475f, -0.006436f, -0.004328f, -0.003244f, -0.000860f, 0.001439f, 0.004124f, 0.005925f, 0.007967f, 0.007781f, 0.006881f, 0.004685f, 0.002195f, -0.000391f, -0.001788f, -0.003967f, -0.005449f, -0.006504f, -0.006288f, -0.005392f, -0.002930f, -0.000960f, 0.001419f, 0.003040f, 0.003989f, 0.004085f, 0.003471f, 0.002029f, 0.001687f, 0.000893f, 0.000351f, -0.000496f, -0.000973f, -0.001431f, -0.001460f, -0.001512f, -0.001200f, -0.000940f, -0.000515f, -0.000295f, -0.000029f, 0.000044f, 0.000248f, 0.000258f, 0.000300f, 0.000187f, 0.000174f, 0.000142f, 0.000133f, 0.000138f} + }, + { + {-0.006635f, 0.004994f, 0.003140f, -0.006549f, -0.001159f, 0.008330f, 0.002469f, 0.002044f, 0.004597f, -0.001107f, 0.001255f, -0.002190f, -0.008730f, -0.003452f, -0.000434f, -0.001948f, 0.002509f, -0.002726f, -0.000845f, -0.007419f, -0.000007f, 0.001247f, -0.005216f, -0.001165f, -0.006585f, -0.002375f, -0.002094f, -0.008009f, -0.003657f, 0.002505f, 0.003483f, 0.008904f, 0.005300f, 0.011383f, -0.001233f, -0.001902f, 0.001680f, -0.003982f, 0.009937f, 0.000542f, 0.004699f, 0.007828f, 0.001389f, -0.003236f, 0.003230f, -0.004257f, -0.005586f, -0.001459f, -0.002411f, -0.003153f, -0.010325f, -0.003402f, 0.000057f, 0.001552f, 0.003091f, 0.000799f, 0.005262f, -0.005930f, 0.004644f, -0.000108f, 0.001163f, 0.003207f, -0.004070f, -0.009209f, -0.003927f, 0.003814f, 0.005721f, 0.004253f, 0.000377f, 0.004335f, 0.003361f, 0.005923f, 0.003031f, 0.002509f, -0.003951f, 0.000225f, -0.000627f, -0.000884f, -0.003360f, -0.004263f, -0.001786f, -0.001056f, -0.000361f, -0.003311f, 0.000048f, 0.000367f, 0.001279f, 0.000204f, 0.002337f, -0.001348f, 0.001077f, -0.002114f, -0.003020f, 0.001408f, -0.000419f, -0.000178f, + 0.002142f, 0.001376f, 0.001881f, 0.000026f, 0.000205f, -0.001871f, 0.001076f, 0.000217f, 0.000651f, -0.000373f, 0.002898f, -0.000731f, 0.000185f, -0.001352f, -0.000973f, -0.001508f, 0.001250f, -0.001062f, -0.002589f, -0.001660f, -0.004699f, 0.004645f, -0.007275f, -0.004436f, 0.011954f, -0.001831f, 0.010579f, -0.005274f, 0.001112f, 0.005278f, 0.002401f, 0.000437f, -0.006948f, -0.009896f, -0.010326f, 0.001213f, 0.000361f, -0.002859f, 0.001508f, -0.009132f, 0.018463f, 0.002167f, -0.010123f, 0.002809f, -0.005258f, -0.005739f, 0.005574f, 0.007878f, -0.000021f, 0.001842f, 0.003815f, -0.000475f, 0.000135f, 0.006204f, -0.003258f, -0.001406f, 0.000461f, 0.011224f, -0.000126f, -0.001215f, -0.004113f, -0.006492f, 0.003526f, -0.001536f, -0.006659f, -0.002964f, -0.008036f, 0.001178f, -0.007280f, 0.000253f, -0.005490f, -0.001759f, -0.004817f, -0.010137f, -0.004096f, -0.000557f, 0.009745f, 0.001505f, -0.002698f, 0.005346f, 0.008931f, 0.001418f, -0.011941f, 0.005627f, 0.000062f, 0.002333f, 0.004048f, -0.002716f, 0.007723f, -0.003723f, -0.006718f, -0.007019f, -0.012484f, 0.001258f, -0.004201f, -0.004383f, + -0.005575f, -0.005856f, -0.000252f, -0.006396f, 0.002143f, -0.000933f, -0.003588f, -0.001285f, -0.004065f, 0.000166f, -0.000093f, -0.004685f, -0.001891f, 0.002008f, -0.000605f, 0.000384f, 0.001158f, 0.000522f, 0.000904f, 0.000679f, -0.001207f, -0.004192f, -0.000682f, -0.001528f, 0.001287f, -0.000474f, 0.000589f, -0.000746f, 0.000120f, 0.000004f, -0.000841f, -0.002609f, -0.002117f, -0.000296f, -0.000888f, -0.000966f, -0.000781f, -0.001942f, -0.000661f, -0.009052f, 0.015615f, -0.003697f, -0.013828f, 0.001254f, 0.004979f, 0.000625f, 0.004606f, 0.003782f, -0.010902f, 0.004146f, -0.002384f, -0.000269f, 0.000657f, -0.001849f, 0.008683f, -0.002438f, -0.005294f, -0.000303f, 0.006986f, 0.004442f, 0.002730f, 0.004160f, 0.016637f, 0.004510f, -0.005415f, 0.007591f, -0.006656f, 0.002451f, -0.005326f, 0.015609f, 0.002632f, -0.004856f, -0.002800f, -0.004870f, -0.001519f, 0.010408f, -0.007947f, -0.006729f, -0.001870f, 0.008645f, 0.005095f, -0.007688f, 0.002451f, 0.001926f, -0.004360f, 0.000381f, -0.016579f, 0.005747f, -0.003638f, -0.003062f, -0.010424f, 0.016306f, 0.001140f, -0.008284f, -0.006387f, -0.008129f, + 0.000870f, -0.001648f, 0.001138f, 0.000084f, -0.009460f, 0.012929f, -0.006994f, -0.006501f, 0.005303f, 0.001496f, 0.005271f, -0.003467f, -0.000515f, -0.007753f, 0.000956f, 0.001842f, -0.009763f, -0.007348f, 0.000978f, -0.006853f, 0.002764f, -0.006119f, -0.001516f, -0.001644f, 0.004703f, -0.007940f, -0.008118f, -0.001600f, -0.001076f, -0.001888f, -0.000285f, -0.003500f, -0.000658f, -0.002520f, -0.001907f, -0.001598f, -0.002348f, -0.003053f, -0.000021f, -0.004136f, 0.001392f, -0.002713f, 0.000259f, 0.000368f, -0.000747f, -0.001500f, 0.000056f, -0.001029f, 0.002466f, -0.000240f, -0.001566f, -0.000018f, -0.002981f, -0.000551f, -0.001714f, 0.000249f, 0.000731f, -0.002155f, -0.002518f, -0.000628f, 0.013471f, 0.000487f, 0.002967f, -0.011011f, 0.003476f, 0.006445f, 0.004714f, -0.000388f, -0.005496f, 0.014490f, 0.002567f, -0.002790f, 0.006973f, 0.005730f, -0.006678f, 0.008915f, -0.005880f, 0.014649f, 0.002120f, 0.013085f, -0.001365f, 0.002383f, -0.005045f, -0.014625f, 0.001643f, 0.000395f, 0.000554f, -0.002449f, 0.003076f, 0.007867f, -0.001905f, -0.007460f, -0.004960f, -0.010650f, -0.002931f, -0.005192f, + -0.005645f, 0.001093f, 0.003743f, 0.005944f, -0.006875f, 0.004931f, -0.004591f, -0.005640f, -0.000743f, 0.005046f, 0.000958f, 0.001337f, -0.010718f, -0.010255f, -0.001937f, -0.002959f, -0.007832f, 0.017248f, 0.007976f, -0.000962f, 0.003326f, 0.007007f, -0.017257f, -0.008617f, 0.011611f, -0.006333f, 0.010891f, 0.002597f, -0.002246f, -0.011464f, -0.008542f, 0.013924f, 0.007321f, 0.013175f, -0.013682f, -0.000811f, -0.009487f, -0.000617f, 0.003387f, -0.004920f, 0.001620f, 0.001160f, -0.008520f, 0.007808f, 0.000862f, 0.001310f, -0.001388f, -0.015033f, 0.001650f, -0.003501f, -0.004780f, -0.004596f, -0.000922f, 0.002801f, -0.002451f, 0.001340f, -0.005349f, -0.000966f, -0.002456f, 0.003582f, -0.000668f, -0.000241f, -0.001746f, 0.000296f, -0.001826f, 0.001343f, -0.003032f, -0.001266f, 0.000979f, -0.000677f, -0.000208f, -0.000005f, -0.000045f, 0.001592f, 0.000852f, -0.000060f, -0.002141f, -0.002005f, -0.002322f, 0.002177f, 0.000873f, 0.003087f, 0.001484f, -0.001071f, 0.001255f, -0.022600f, 0.001169f, -0.002931f, 0.006078f, -0.013689f, 0.004334f, -0.004639f, 0.022778f, -0.006085f, -0.011857f, -0.004360f, + -0.009952f, 0.003058f, 0.008432f, -0.002735f, 0.015909f, 0.001600f, -0.004744f, 0.003810f, 0.001906f, 0.004120f, -0.005690f, -0.001029f, 0.005896f, 0.009327f, 0.003666f, -0.001902f, 0.004453f, -0.008393f, -0.002648f, 0.011738f, 0.008376f, 0.013789f, 0.009768f, -0.000266f, -0.007075f, -0.014777f, 0.010134f, -0.001646f, -0.010795f, 0.005548f, -0.002884f, -0.016547f, 0.000388f, -0.013800f, -0.001137f, 0.012414f, -0.002158f, -0.009291f, -0.004309f, 0.011855f, -0.010349f, -0.016893f, 0.017070f, -0.003256f, -0.004207f, 0.003982f, 0.002126f, 0.001999f, 0.004069f, 0.004097f, 0.002230f, -0.012454f, -0.004769f, 0.009575f, -0.001345f, -0.003711f, 0.002856f, 0.016457f, -0.008406f, -0.009172f, -0.004225f, 0.006727f, 0.003381f, -0.014877f, -0.006652f, -0.005130f, -0.006528f, 0.004864f, -0.000929f, -0.001141f, -0.005571f, -0.004393f, -0.011803f, -0.006780f, 0.002787f, 0.000376f, 0.001821f, -0.000486f, 0.006916f, 0.007198f, 0.001213f, 0.002624f, -0.003669f, 0.000822f, 0.000298f, 0.002940f, -0.004508f, -0.002045f, 0.000507f, 0.000103f, 0.002034f, -0.000087f, -0.002582f, 0.002592f, 0.000915f, -0.004944f, + -0.001016f, 0.001437f, 0.000839f, 0.000851f, -0.001290f, 0.000666f, -0.002459f, -0.002366f, -0.002107f, 0.001267f, -0.001109f, -0.001201f, -0.000412f, -0.019921f, -0.000553f, 0.005160f, 0.018921f, 0.019555f, -0.006475f, 0.009670f, -0.012796f, 0.004031f, 0.008243f, 0.012512f, -0.003817f, 0.018833f, -0.003699f, 0.015953f, -0.008925f, 0.013343f, -0.006907f, -0.022562f, -0.005223f, 0.005459f, -0.007870f, 0.008516f, -0.004986f, -0.005529f, 0.002295f, -0.024721f, -0.008078f, -0.000653f, -0.004405f, -0.001625f, -0.012011f, -0.004252f, -0.004371f, 0.003759f, 0.024923f, 0.014291f, -0.014703f, 0.007815f, 0.019905f, 0.004816f, -0.007161f, 0.004840f, -0.005419f, -0.006122f, 0.014294f, 0.009881f, -0.010161f, -0.001506f, 0.010155f, 0.021336f, -0.007045f, 0.011534f, 0.031783f, 0.013572f, -0.014830f, 0.005784f, 0.003586f, -0.017937f, 0.002542f, -0.014851f, 0.006445f, -0.016170f, -0.003891f, 0.000505f, 0.007456f, -0.010609f, -0.003005f, -0.005340f, -0.009611f, 0.012118f, 0.010437f, -0.000737f, -0.007072f, 0.001742f, 0.001768f, 0.001579f, 0.002860f, 0.008961f, 0.001692f, -0.012289f, -0.000307f, 0.014579f, + 0.000378f, 0.003151f, 0.002889f, 0.004309f, -0.004675f, -0.002302f, -0.007463f, -0.003302f, -0.006871f, -0.000724f, 0.003984f, -0.001045f, -0.003914f, 0.002000f, -0.000838f, 0.000690f, -0.002142f, -0.001602f, 0.002694f, -0.000369f, 0.006518f, 0.001443f, -0.001439f, 0.003300f, -0.000116f, -0.001711f, -0.002506f, -0.003512f, 0.001435f, -0.001940f, -0.000921f, 0.001543f, -0.000186f, 0.002899f, 0.000168f, -0.004197f, 0.008671f, -0.004334f, -0.020043f, 0.004601f, -0.016104f, 0.002577f, -0.005347f, 0.020780f, -0.010577f, 0.002913f, 0.005456f, 0.002040f, 0.007535f, -0.003081f, 0.022753f, 0.001761f, -0.014781f, -0.002772f, -0.010903f, -0.001771f, -0.003558f, -0.010220f, -0.012814f, -0.003313f, -0.008258f, -0.003923f, 0.014553f, 0.005388f, -0.012330f, 0.004776f, -0.014723f, -0.002818f, 0.010686f, -0.020106f, -0.017737f, 0.010053f, 0.009458f, 0.004877f, -0.000621f, -0.012227f, 0.004812f, -0.006049f, -0.011536f, -0.005360f, 0.000601f, 0.003606f, 0.019041f, -0.007558f, -0.002182f, 0.000967f, 0.008864f, 0.004639f, -0.006632f, -0.008568f, -0.015315f, -0.004711f, -0.003417f, -0.008456f, -0.009836f, 0.006201f, + 0.012707f, -0.000111f, -0.008174f, 0.014055f, 0.002680f, -0.007013f, 0.001701f, -0.002116f, -0.001865f, -0.004912f, -0.002783f, 0.009103f, -0.007316f, -0.010973f, -0.006329f, 0.005658f, -0.008479f, 0.014851f, 0.006642f, -0.002523f, -0.006156f, -0.006998f, 0.004201f, 0.009201f, 0.018939f, -0.005546f, 0.009674f, 0.000261f, -0.000073f, 0.000976f, 0.003009f, -0.003560f, 0.000049f, 0.002280f, 0.003955f, -0.002571f, 0.002756f, -0.002219f, 0.009158f, 0.003444f, 0.006876f, 0.000014f, 0.004660f, -0.000320f, 0.004131f, -0.000899f, -0.000421f, 0.004792f, 0.001800f, 0.000518f, 0.002536f, 0.000498f, 0.004765f, -0.003641f, 0.001083f, 0.003209f, 0.004375f, 0.003732f, -0.001515f, -0.004967f, -0.000125f, 0.002990f, 0.000620f, 0.000475f, 0.003921f, 0.010331f, 0.019738f, -0.014773f, -0.000546f, 0.013432f, -0.006472f, -0.009692f, 0.012349f, -0.019561f, -0.001224f, 0.003581f, -0.002571f, -0.007316f, -0.008628f, -0.004165f, 0.003351f, -0.001078f, 0.009322f, 0.004681f, -0.003157f, -0.007471f, -0.005462f, 0.015362f, 0.000573f, -0.018845f, 0.008744f, -0.011932f, -0.011696f, 0.007122f, 0.013524f, 0.013788f, + 0.010458f, -0.000362f, 0.007058f, 0.004794f, 0.006662f, -0.006196f, -0.000341f, -0.005589f, -0.013576f, 0.005669f, -0.003526f, -0.000769f, -0.003017f, 0.001292f, -0.002268f, 0.014939f, 0.027813f, 0.004561f, -0.004857f, -0.000107f, -0.019917f, 0.019277f, -0.013590f, -0.008824f, -0.013079f, -0.016012f, 0.027035f, 0.001458f, -0.015072f, -0.005470f, 0.018646f, 0.009609f, -0.014184f, -0.010599f, 0.021377f, 0.001711f, 0.002182f, 0.027660f, -0.013249f, 0.007587f, -0.009958f, -0.027484f, 0.012880f, 0.013211f, 0.002181f, -0.015872f, -0.002254f, -0.003457f, 0.003255f, -0.006895f, 0.010030f, 0.006182f, -0.021748f, 0.009212f, 0.010382f, 0.013257f, 0.002270f, -0.011624f, 0.019400f, 0.003286f, -0.001747f, -0.001501f, -0.006534f, -0.006859f, -0.002481f, 0.001221f, 0.005844f, -0.000022f, 0.000459f, -0.000632f, -0.005241f, 0.002191f, 0.002335f, 0.001031f, -0.002414f, -0.001445f, 0.003907f, 0.001399f, 0.004453f, -0.002923f, 0.001037f, -0.006811f, 0.000756f, 0.006424f, -0.008629f, 0.001193f, -0.006764f, 0.007856f, -0.003288f, -0.000182f, -0.005270f, -0.000032f, 0.004532f, -0.000542f, 0.006186f, 0.000021f, + -0.001775f, 0.004487f, 0.009478f, 0.012081f, 0.022300f, 0.020432f, -0.000699f, 0.017438f, 0.007898f, 0.017780f, 0.017182f, -0.028263f, 0.010392f, -0.009067f, -0.012163f, -0.008840f, -0.002569f, -0.017980f, -0.003680f, 0.004543f, -0.015360f, -0.031643f, 0.007376f, -0.002116f, -0.028500f, -0.020882f, -0.018631f, -0.010352f, 0.001134f, -0.005254f, 0.006910f, -0.003656f, 0.011490f, 0.022311f, -0.012589f, 0.007670f, -0.004879f, -0.010043f, -0.007282f, 0.001477f, -0.002060f, -0.000795f, 0.016649f, -0.000560f, 0.016782f, 0.021717f, 0.006571f, 0.009420f, 0.014415f, -0.001749f, 0.003016f, -0.021198f, 0.020055f, -0.017266f, -0.005996f, -0.005418f, 0.001891f, -0.004685f, -0.016467f, -0.014500f, -0.031931f, 0.029169f, -0.032620f, -0.031622f, 0.005496f, 0.030584f, 0.010938f, -0.003815f, -0.007532f, 0.014132f, -0.015244f, 0.017646f, -0.004986f, 0.002351f, 0.001938f, -0.011509f, 0.012342f, -0.013619f, -0.011093f, -0.001198f, 0.004532f, -0.013005f, -0.001938f, 0.007167f, -0.000925f, -0.003483f, 0.009518f, -0.006100f, -0.011668f, -0.002605f, 0.006067f, -0.007706f, -0.004451f, -0.005243f, -0.001078f, 0.003658f, + -0.002417f, 0.001170f, -0.001844f, -0.004183f, 0.001334f, -0.002655f, 0.002842f, -0.002781f, 0.004065f, -0.001096f, 0.007490f, -0.000965f, 0.002964f, 0.004118f, -0.002451f, -0.004901f, -0.000418f, -0.001135f, -0.000186f, -0.001455f, 0.003537f, 0.000263f, 0.004542f, -0.003889f, 0.001671f, -0.008440f, 0.000484f, 0.000450f, -0.003027f, 0.002428f, 0.013195f, 0.017217f, 0.017215f, 0.018742f, 0.044324f, 0.019852f, 0.025296f, -0.012644f, 0.041025f, -0.023574f, 0.001045f, 0.008965f, -0.000270f, -0.015564f, 0.005053f, -0.004374f, -0.035127f, 0.013181f, -0.008905f, 0.003662f, -0.003359f, -0.011715f, -0.000051f, 0.010320f, -0.014225f, -0.007452f, -0.002276f, 0.008137f, -0.021447f, 0.013440f, 0.005048f, -0.019705f, -0.001595f, 0.007882f, -0.017818f, 0.006543f, -0.021355f, 0.009718f, -0.001884f, -0.007003f, -0.000883f, -0.014027f, 0.017837f, 0.021027f, -0.020209f, -0.011637f, 0.009094f, -0.007299f, 0.005578f, 0.004981f, 0.001309f, 0.000557f, 0.024352f, -0.006277f, -0.016350f, 0.014983f, -0.000663f, -0.012964f, -0.010822f, -0.020399f, 0.003871f, 0.005399f, 0.010099f, 0.009601f, -0.009403f, -0.015883f, + 0.008780f, 0.004270f, 0.030462f, 0.003076f, -0.003811f, 0.000630f, 0.002009f, -0.009142f, -0.004054f, -0.011426f, 0.012465f, 0.007073f, 0.008110f, -0.002541f, -0.019517f, -0.017922f, -0.005847f, -0.001734f, -0.007023f, -0.012472f, 0.003447f, -0.005552f, 0.008029f, 0.001255f, -0.001321f, 0.004841f, 0.005173f, 0.008095f, 0.007727f, 0.006069f, -0.000063f, -0.002032f, 0.002192f, 0.005378f, 0.004280f, -0.002657f, -0.002356f, -0.001745f, 0.001409f, -0.000201f, -0.001541f, -0.000090f, -0.009602f, 0.000989f, 0.006262f, 0.004613f, -0.007480f, -0.005574f, 0.010715f, 0.005541f, 0.010627f, 0.004001f, -0.007770f, 0.007180f, -0.001899f, -0.006080f, 0.001145f, -0.008592f, -0.004606f, -0.002347f, 0.003214f, -0.001896f, -0.023970f, -0.026941f, 0.044997f, 0.031380f, 0.040228f, 0.002582f, -0.025791f, 0.009108f, 0.021003f, 0.014954f, -0.006567f, -0.016316f, -0.004788f, -0.005991f, -0.007906f, -0.014047f, -0.005622f, -0.011797f, 0.030006f, 0.004804f, 0.004971f, 0.000237f, 0.001767f, 0.003194f, -0.011067f, 0.019857f, 0.011227f, -0.001176f, 0.007238f, -0.002820f, 0.020451f, 0.003773f, -0.001788f, -0.033418f, + -0.002452f, 0.002107f, 0.003207f, -0.006254f, 0.004204f, -0.015827f, 0.027156f, 0.021984f, 0.021236f, 0.018520f, -0.014533f, -0.020151f, 0.015493f, 0.004773f, 0.007589f, -0.001320f, -0.023439f, -0.016967f, 0.001384f, -0.013226f, 0.000185f, -0.011107f, -0.004806f, 0.014085f, 0.004511f, -0.010042f, 0.003629f, -0.025935f, 0.000827f, -0.043975f, -0.022318f, -0.041547f, 0.035917f, 0.032350f, 0.034555f, 0.041845f, 0.020296f, -0.006912f, -0.018520f, -0.005619f, -0.000990f, 0.006018f, 0.033181f, -0.010934f, -0.025142f, 0.019222f, -0.015986f, 0.008380f, -0.003629f, -0.003610f, 0.007815f, -0.007451f, -0.013577f, -0.003839f, -0.016726f, -0.003543f, -0.015035f, -0.003451f, 0.002159f, -0.001315f, -0.001772f, -0.004080f, -0.005215f, -0.010397f, -0.000110f, 0.005484f, 0.000902f, -0.005226f, 0.001883f, 0.009119f, -0.001177f, 0.006105f, 0.003386f, 0.003623f, 0.002607f, -0.012016f, 0.010595f, -0.004630f, -0.003770f, 0.007103f, 0.002493f, 0.007851f, 0.000853f, -0.009991f, -0.001808f, 0.000251f, 0.001800f, -0.006099f, 0.000344f, -0.000398f, -0.015954f, -0.021468f, 0.018934f, 0.024567f, -0.012064f, 0.022809f, + 0.003219f, -0.009684f, 0.009174f, -0.033057f, -0.010255f, 0.009326f, -0.010531f, -0.020272f, -0.038208f, 0.018774f, -0.016418f, 0.004421f, 0.024753f, 0.005942f, 0.028863f, 0.022080f, 0.012553f, 0.004740f, -0.017042f, -0.005000f, -0.008921f, 0.001563f, 0.016074f, 0.008380f, 0.003320f, 0.013724f, 0.039240f, -0.002048f, -0.033372f, -0.014653f, 0.005394f, 0.008014f, -0.001910f, 0.000829f, 0.003161f, -0.014235f, 0.000878f, -0.031411f, 0.007066f, -0.032860f, -0.011982f, -0.025446f, 0.012529f, -0.012694f, -0.020879f, 0.031862f, 0.008936f, 0.002598f, -0.014340f, -0.019114f, 0.004773f, 0.007576f, 0.002807f, 0.010382f, -0.016292f, 0.035820f, -0.043494f, 0.011314f, -0.018130f, -0.026400f, -0.014793f, 0.022797f, 0.006868f, -0.024749f, 0.017482f, -0.019709f, 0.048307f, -0.004504f, -0.005306f, -0.023501f, 0.002809f, -0.031351f, -0.016823f, 0.041823f, -0.016842f, -0.018995f, -0.012409f, 0.012505f, 0.001565f, 0.017727f, 0.008830f, 0.009267f, 0.012914f, 0.007022f, -0.001194f, 0.001333f, 0.006155f, 0.002639f, -0.003426f, 0.010382f, -0.003271f, -0.003620f, -0.007837f, -0.007030f, -0.003169f, 0.003831f, + -0.006174f, 0.000453f, 0.003000f, -0.002544f, 0.002614f, 0.000485f, 0.010232f, 0.005369f, -0.000029f, -0.002092f, 0.000001f, -0.000747f, 0.006106f, -0.005446f, 0.005536f, -0.001538f, 0.002439f, 0.008585f, -0.002740f, 0.000450f, -0.001208f, -0.004320f, 0.010491f, -0.001479f, 0.008178f, 0.045589f, 0.046908f, 0.044251f, 0.009560f, -0.011681f, -0.007228f, -0.028269f, 0.023222f, 0.000824f, 0.013688f, -0.008358f, 0.004502f, -0.010246f, -0.007843f, -0.016287f, 0.009028f, -0.016965f, 0.028245f, -0.073182f, -0.021198f, 0.000667f, -0.022034f, 0.015900f, -0.022653f, 0.004831f, -0.008660f, 0.023200f, 0.004257f, 0.022337f, 0.001763f, -0.005103f, -0.000203f, 0.008262f, -0.025535f, -0.018321f, -0.019828f, -0.002695f, 0.025157f, -0.049187f, 0.017267f, 0.043022f, 0.005427f, -0.031426f, -0.001089f, -0.026449f, -0.025325f, 0.017771f, -0.003185f, -0.021587f, 0.012223f, 0.001929f, -0.007943f, -0.012146f, 0.007171f, 0.017952f, 0.010983f, -0.025101f, -0.018263f, 0.014543f, 0.021893f, -0.017640f, -0.023316f, 0.011679f, 0.024509f, -0.029515f, -0.000879f, -0.026340f, -0.036158f, 0.043292f, -0.007045f, 0.006777f, + -0.007960f, 0.026870f, -0.006172f, 0.006655f, -0.014247f, 0.023382f, 0.013054f, 0.021518f, 0.024899f, -0.024582f, -0.027107f, -0.011005f, -0.005087f, -0.016265f, -0.040857f, 0.004608f, 0.002362f, 0.000066f, -0.002890f, -0.006568f, -0.005387f, 0.011860f, -0.000909f, -0.005001f, 0.010999f, -0.011913f, -0.006258f, 0.004530f, 0.021475f, -0.006409f, -0.006476f, 0.001117f, -0.002584f, 0.007447f, -0.002472f, -0.001125f, -0.003651f, -0.005941f, -0.014893f, -0.021467f, 0.003912f, -0.001470f, -0.016299f, -0.008151f, 0.004412f, -0.005669f, -0.018486f, -0.010301f, -0.001160f, -0.003198f, 0.001567f, 0.005312f, 0.002297f, -0.000014f, 0.015305f, 0.005281f, 0.024043f, -0.007683f, 0.000043f, -0.034336f, -0.015586f, -0.007315f, -0.028988f, -0.041992f, -0.007209f, -0.013535f, 0.041050f, 0.012844f, 0.060661f, 0.011561f, -0.016412f, 0.008652f, 0.012154f, -0.048201f, 0.003600f, 0.043705f, 0.028095f, -0.027777f, 0.004718f, 0.022215f, -0.038500f, -0.005567f, -0.018862f, 0.017446f, -0.014579f, 0.011752f, 0.003496f, -0.007022f, 0.002966f, 0.000650f, -0.011806f, 0.014147f, -0.025871f, -0.009683f, -0.010628f, -0.032785f, + -0.006198f, -0.003669f, 0.001380f, 0.003162f, -0.008295f, -0.009814f, 0.062014f, 0.019150f, -0.022904f, -0.042543f, -0.014845f, 0.005141f, 0.045066f, -0.009970f, -0.004899f, -0.023969f, -0.005735f, -0.016647f, 0.037109f, -0.028737f, 0.033200f, 0.041734f, -0.040577f, 0.028095f, 0.011195f, -0.016857f, -0.014801f, 0.010759f, 0.020043f, -0.089693f, -0.011130f, 0.000552f, -0.011574f, 0.024536f, -0.011394f, -0.066869f, -0.025472f, -0.018993f, -0.029723f, -0.029076f, 0.006060f, 0.006520f, -0.016502f, -0.014678f, -0.027358f, 0.003591f, -0.009651f, 0.003091f, -0.011446f, -0.013607f, -0.015411f, 0.004420f, -0.002501f, 0.010524f, -0.013236f, 0.007528f, -0.000953f, -0.013651f, -0.029107f, -0.006807f, -0.000986f, 0.010347f, -0.003441f, -0.039070f, 0.008913f, 0.019946f, 0.008475f, -0.000210f, -0.013168f, 0.014836f, -0.001216f, -0.003892f, -0.023238f, -0.003406f, -0.007512f, 0.020583f, -0.002256f, 0.003901f, 0.000900f, 0.004996f, 0.013411f, -0.008485f, 0.001546f, 0.001386f, -0.003599f, 0.001805f, 0.006240f, -0.027716f, -0.023634f, -0.008590f, -0.018950f, -0.013059f, -0.004663f, -0.011795f, -0.014943f, -0.014455f, + -0.003522f, -0.003502f, -0.005954f, -0.010448f, -0.004007f, -0.007186f, -0.001262f, -0.003467f, -0.012777f, 0.010302f, 0.060142f, -0.001741f, -0.070021f, -0.039139f, -0.043319f, -0.008059f, -0.023944f, -0.000940f, -0.035541f, 0.058431f, 0.034733f, -0.006172f, 0.045940f, 0.001437f, 0.049528f, 0.011955f, -0.028527f, -0.038855f, -0.024513f, -0.031330f, -0.014007f, 0.007773f, 0.021378f, -0.006867f, 0.007018f, -0.025862f, 0.004466f, -0.037351f, -0.003363f, -0.002051f, 0.012883f, -0.013972f, 0.060009f, 0.007839f, -0.001552f, 0.039902f, -0.015453f, -0.028140f, -0.016562f, 0.024495f, -0.001868f, -0.015937f, 0.006679f, -0.000127f, 0.051029f, 0.012694f, 0.000140f, -0.019712f, -0.030828f, -0.077731f, 0.005019f, -0.061733f, 0.031297f, 0.106152f, -0.075823f, -0.016121f, 0.017149f, -0.012968f, -0.013383f, -0.021148f, 0.017705f, -0.021711f, -0.073360f, -0.019397f, -0.073154f, -0.015204f, -0.002191f, -0.045742f, -0.006547f, -0.065867f, 0.028559f, -0.006518f, -0.041894f, 0.102918f, 0.007912f, 0.042035f, 0.035076f, 0.056839f, -0.034920f, -0.002214f, -0.021096f, -0.007471f, -0.014314f, 0.027074f, 0.017007f, 0.024342f, + -0.050086f, -0.009914f, -0.027311f, -0.034991f, -0.029559f, -0.017902f, -0.004084f, 0.019697f, 0.016014f, 0.011360f, 0.014120f, -0.003817f, 0.004441f, 0.028138f, -0.005362f, 0.027850f, 0.007957f, -0.023825f, -0.006793f, 0.008791f, -0.010620f, -0.003875f, 0.032294f, 0.000741f, -0.010131f, 0.036663f, -0.017127f, -0.002311f, -0.030255f, -0.007057f, -0.021206f, 0.016005f, -0.016293f, -0.006869f, -0.006396f, 0.006299f, -0.007429f, 0.014505f, 0.000006f, 0.014997f, 0.003753f, -0.005219f, -0.010522f, -0.013804f, -0.010859f, -0.021091f, -0.122602f, -0.012117f, -0.030775f, -0.033768f, 0.045690f, 0.036386f, -0.042473f, -0.033431f, 0.085483f, -0.008859f, 0.028251f, 0.005110f, -0.003662f, -0.009033f, -0.008444f, -0.026778f, 0.000464f, 0.010518f, 0.015943f, 0.010977f, 0.031059f, -0.023064f, 0.000194f, -0.022460f, -0.013044f, 0.010116f, 0.043747f, 0.028351f, 0.038720f, 0.034765f, -0.006868f, 0.013041f, 0.021194f, 0.000772f, -0.034061f, -0.005622f, 0.049027f, -0.007918f, -0.068159f, -0.029655f, 0.008324f, -0.057699f, -0.024502f, -0.059149f, -0.040378f, -0.036702f, 0.056067f, 0.038538f, -0.011274f, 0.038570f, + 0.015304f, 0.054117f, 0.036625f, 0.017877f, -0.093258f, -0.020290f, 0.004949f, -0.081913f, -0.059707f, -0.022520f, -0.015356f, -0.096065f, 0.021560f, 0.054179f, 0.072433f, 0.086615f, -0.028211f, -0.055348f, 0.000079f, -0.055850f, -0.041342f, -0.077820f, -0.086582f, -0.060990f, -0.051258f, 0.058467f, 0.003199f, 0.012254f, -0.052153f, -0.054750f, -0.048996f, -0.004351f, 0.076460f, 0.096802f, 0.003179f, -0.034725f, -0.026534f, -0.038236f, -0.100432f, -0.044584f, -0.044433f, -0.011903f, -0.003343f, -0.022409f, 0.026943f, 0.000369f, -0.007417f, -0.035541f, -0.046505f, -0.024117f, -0.026057f, -0.041031f, -0.008819f, -0.010169f, -0.003697f, -0.010764f, -0.018639f, 0.025431f, 0.015801f, -0.002287f, -0.022558f, 0.016863f, 0.027665f, 0.002369f, -0.023165f, -0.012029f, 0.019444f, 0.005510f, -0.004941f, -0.022229f, 0.019421f, -0.004283f, -0.007074f, 0.002464f, 0.015137f, 0.004070f, -0.004023f, 0.002564f, 0.011808f, 0.002167f, -0.039126f, -0.093276f, 0.035109f, 0.003584f, -0.063734f, 0.057834f, 0.028258f, 0.017246f, -0.014594f, -0.057005f, -0.014994f, 0.000868f, 0.053878f, 0.071959f, 0.003435f, 0.018899f, + 0.003894f, 0.001517f, -0.004237f, 0.009089f, -0.031247f, 0.101676f, 0.023797f, -0.034172f, -0.034254f, -0.015617f, 0.003720f, 0.049335f, -0.025027f, -0.008317f, -0.000781f, 0.024619f, -0.025113f, 0.012636f, 0.000926f, -0.006362f, -0.085363f, -0.027209f, 0.026353f, 0.043134f, 0.014805f, -0.010137f, -0.025161f, -0.056538f, -0.006856f, 0.008437f, -0.014027f, 0.000285f, -0.015321f, -0.036682f, 0.035516f, -0.009048f, 0.012230f, -0.039168f, -0.008806f, 0.097799f, 0.006670f, -0.011590f, 0.010775f, 0.012190f, 0.008560f, 0.048929f, -0.018902f, -0.023080f, 0.036260f, -0.004835f, 0.021209f, 0.013056f, 0.031508f, -0.013081f, -0.037328f, 0.017903f, -0.017618f, 0.002305f, 0.138446f, 0.133395f, 0.059485f, -0.012524f, -0.007594f, 0.016377f, 0.062351f, 0.028603f, -0.019481f, -0.002639f, -0.009039f, -0.036112f, -0.038526f, 0.020214f, 0.009688f, 0.004866f, 0.030779f, -0.004701f, -0.018318f, 0.018239f, 0.007186f, 0.027164f, -0.040935f, -0.033209f, -0.041584f, 0.005630f, -0.019099f, 0.001859f, -0.008941f, 0.014355f, 0.015735f, 0.033878f, 0.019129f, -0.036790f, -0.027604f, 0.012692f, -0.023162f, -0.013141f, + 0.002019f, 0.011486f, -0.015845f, -0.036173f, -0.004801f, 0.000900f, -0.003899f, 0.015565f, 0.003427f, -0.029241f, 0.008106f, 0.046451f, 0.052942f, 0.039756f, 0.045061f, 0.032537f, 0.040558f, -0.011461f, -0.003373f, 0.015731f, -0.005335f, 0.015495f, 0.013733f, 0.020924f, 0.038530f, 0.068995f, 0.009966f, -0.071298f, -0.018142f, 0.016682f, 0.011561f, -0.016582f, 0.055219f, 0.027705f, 0.022012f, -0.017341f, 0.064499f, -0.003191f, 0.002470f, -0.016493f, 0.034843f, 0.023087f, -0.047786f, -0.070551f, -0.018944f, 0.012508f, 0.005095f, -0.013043f, -0.064375f, -0.005986f, 0.024369f, 0.005830f, -0.020966f, -0.008516f, -0.018605f, -0.024605f, 0.016441f, 0.019146f, -0.040848f, -0.046455f, -0.015236f, -0.057759f, 0.016936f, 0.051646f, -0.043726f, 0.049666f, -0.021988f, -0.026592f, -0.049197f, -0.069557f, -0.077770f, -0.074087f, -0.037301f, 0.000488f, 0.029424f, 0.013590f, 0.029313f, -0.038845f, -0.086823f, -0.034160f, -0.083395f, -0.147701f, -0.055326f, 0.119949f, 0.205716f, 0.120431f, -0.048982f, -0.039770f, -0.180609f, -0.162705f, 0.114742f, 0.020383f, 0.150364f, 0.155067f, 0.161865f, 0.054671f, + -0.062805f, -0.078930f, -0.087477f, -0.100893f, -0.013455f, 0.101793f, 0.172407f, 0.055389f, 0.019134f, -0.007112f, -0.083927f, -0.124343f, -0.082950f, 0.017067f, 0.119533f, 0.055919f, 0.077938f, 0.063054f, 0.024291f, -0.044035f, -0.048320f, 0.002977f, -0.026108f, 0.010463f, 0.059309f, 0.062220f, 0.046695f, 0.009898f, 0.024545f, 0.001876f, -0.037385f, 0.009239f, 0.017504f, -0.005166f, 0.008315f, -0.010130f, 0.085443f, 0.049674f, 0.054802f, 0.033138f, -0.027249f, -0.072693f, -0.102809f, 0.016874f, 0.038178f, 0.071726f, 0.072836f, 0.092588f, 0.046295f, -0.066423f, -0.082568f, -0.101473f, -0.016248f, 0.001148f, 0.057593f, 0.033371f, 0.019485f, 0.031440f, -0.049310f, -0.150294f, -0.099561f, -0.092080f, -0.019321f, 0.013517f, 0.037131f, -0.007841f, -0.018294f, -0.033339f, -0.039362f, -0.006618f, 0.014239f, -0.046543f, 0.065155f, 0.031277f, 0.057868f, -0.127223f, 0.028854f, 0.017144f, -0.039087f, 0.028451f, -0.029225f, -0.014515f, -0.008689f, -0.018268f, 0.054830f, 0.100840f, -0.029263f, 0.020179f, -0.013992f, 0.024065f, 0.051404f, -0.015833f, -0.009283f, -0.028089f, 0.014840f, -0.017886f, + -0.055583f, 0.040487f, 0.068751f, -0.009212f, -0.035842f, -0.033120f, -0.072211f, -0.020099f, 0.054935f, 0.037051f, 0.019215f, -0.079838f, -0.046111f, -0.034928f, 0.070588f, 0.060965f, 0.053753f, -0.155701f, -0.103374f, -0.012797f, 0.077006f, 0.163960f, 0.000789f, -0.197646f, -0.072380f, 0.006376f, 0.066729f, -0.005663f, 0.036702f, 0.027399f, -0.086070f, -0.038002f, -0.023684f, -0.051955f, 0.003759f, -0.097346f, 0.015374f, 0.038208f, -0.117178f, -0.075376f, -0.036415f, -0.015269f, 0.130078f, -0.001019f, -0.199188f, 0.018915f, 0.028288f, 0.030196f, 0.078741f, 0.036388f, -0.084982f, 0.004042f, -0.003074f, 0.170340f, 0.120545f, -0.100270f, 0.091367f, -0.053569f, 0.036478f, 0.093958f, 0.034086f, -0.051943f, 0.047539f, -0.020924f, 0.012371f, 0.032424f, -0.003272f, -0.035249f, 0.064749f, -0.041736f, 0.047521f, -0.022391f, 0.025678f, -0.007995f, 0.052155f, -0.018405f, 0.041039f, -0.071343f, -0.012038f, -0.001056f, -0.009104f, 0.022657f, 0.044465f, -0.045426f, 0.091421f, -0.035905f, -0.031151f, -0.062389f, 0.045767f, 0.095655f, 0.019178f, -0.126501f, 0.010445f, -0.028615f, 0.061636f, 0.029998f, + 0.027923f, -0.050973f, -0.003261f, -0.032528f, 0.030825f, -0.013377f, -0.020033f, -0.007639f, 0.041717f, -0.010211f, -0.025299f, -0.031475f, 0.023766f, 0.003442f, 0.022660f, -0.014189f, 0.000818f, -0.024280f, -0.001541f, -0.005311f, 0.011643f, 0.003333f, 0.025656f, -0.005588f, -0.007465f, -0.026902f, 0.018298f, 0.006266f, 0.016293f, -0.000091f, -0.015327f, -0.020046f, 0.006036f, 0.004636f, 0.013884f, 0.044069f, -0.105119f, 0.014973f, -0.077171f, 0.014116f, 0.065609f, 0.058008f, 0.019033f, -0.037536f, 0.007577f, -0.022288f, -0.005475f, -0.027667f, -0.020423f, 0.014274f, 0.003886f, -0.040296f, -0.004592f, 0.021024f, -0.004429f, 0.002406f, 0.007655f, -0.025693f, -0.025431f, -0.000631f, 0.016918f, 0.002275f, -0.040961f, 0.003456f, 0.021091f, 0.006641f, 0.004945f, 0.042942f, -0.004673f, -0.011408f, 0.015438f, 0.016461f, -0.028966f, -0.032151f, 0.023920f, 0.004649f, -0.024655f, 0.016624f, 0.007244f, 0.008069f, -0.017231f, 0.006994f, 0.019507f, 0.002375f, -0.024270f, 0.033032f, -0.003950f, -0.036974f, 0.001176f, 0.028980f, 0.009088f, -0.024189f, 0.022094f, 0.007327f, -0.033697f, 0.013906f, + 0.001800f, 0.034493f, -0.031177f, 0.002838f, 0.023812f, -0.054678f, 0.001812f, 0.023643f, -0.000843f, 0.016394f, -0.009029f, -0.034996f, 0.004717f, -0.037033f, 0.034853f, 0.017984f, 0.009876f, -0.013747f, -0.014451f, 0.028760f, -0.024697f, 0.025666f, 0.028239f, -0.040259f, -0.013002f, 0.001747f, 0.031263f, 0.000511f, -0.018006f, 0.011574f, -0.021823f, -0.001292f, 0.003249f, 0.018436f, 0.001338f, 0.003049f, -0.011237f, 0.019186f, -0.006335f, -0.022347f, 0.020423f, -0.009015f, 0.008856f, -0.005051f, 0.014752f, 0.018542f, -0.021190f, 0.003737f, -0.011442f, 0.005027f, -0.011627f, 0.041211f, -0.011555f, -0.023102f, 0.018680f, -0.010401f, -0.003405f, -0.011751f, 0.012249f, 0.011225f, -0.016564f, 0.009330f, 0.016327f, -0.008394f, 0.001186f, -0.022994f, -0.052385f, 0.084997f, 0.011721f, 0.038266f, -0.033526f, 0.014430f, -0.007510f, 0.010008f, 0.009015f, -0.014542f, 0.005426f, 0.015345f, -0.009299f, 0.033738f, 0.001238f, 0.000843f, 0.011279f, 0.010863f, -0.001552f, -0.008922f, 0.014239f, -0.002501f, -0.010310f, -0.002303f, 0.014312f, -0.015987f, 0.003097f, 0.006895f, -0.020308f, 0.024816f, + -0.005243f, -0.012285f, 0.038191f, -0.016045f, -0.022890f, 0.017451f, 0.009525f, -0.010824f, 0.016440f, 0.013141f, -0.004864f, -0.005613f, -0.003213f, 0.004813f, 0.009375f, 0.005419f, -0.000271f, -0.006833f, 0.019598f, -0.021282f, 0.018786f, 0.002778f, -0.002507f, 0.005110f, 0.005828f, 0.005974f, 0.000676f, -0.018959f, 0.005091f, 0.015998f, -0.011692f, -0.000238f, -0.000158f, 0.012144f, -0.001409f, -0.004971f, 0.018456f, -0.009642f, 0.009838f, -0.019473f, -0.007298f, 0.018512f, -0.017935f, 0.017792f, -0.004813f, 0.011655f, 0.014291f, -0.016565f, -0.005713f, 0.020105f, -0.017081f, -0.001070f, 0.001987f, 0.005957f, 0.001375f, -0.002489f, 0.000613f, 0.001335f, 0.009229f, -0.008173f, 0.001930f, 0.005787f, -0.000732f, -0.004317f, 0.000911f, 0.003323f, -0.000939f, 0.001023f, -0.003665f, 0.004036f, 0.005710f, -0.010391f, -0.001753f, 0.017478f, -0.008679f, 0.004859f, -0.001429f, 0.009882f, 0.002727f, -0.005753f, 0.001005f, -0.001285f, -0.006005f, -0.004269f, 0.020706f, -0.003732f, -0.004904f, 0.002796f, 0.002198f, -0.001811f, 0.004303f, 0.008395f, 0.000149f, 0.002044f, 0.000673f, -0.002019f, + 0.001162f, 0.002331f, -0.004093f, 0.002577f, -0.000381f, 0.019954f, -0.070373f, -0.225064f, -0.011432f, 0.121352f, 0.054469f, 0.258473f, 0.022063f, 0.054625f, 0.002292f, -0.075306f, -0.094912f, -0.064242f, -0.115671f, -0.080878f, -0.050892f, 0.001904f, 0.088338f, 0.174069f, 0.128060f, 0.111519f, 0.036302f, -0.060503f, -0.088972f, -0.079914f, -0.094283f, -0.104481f, -0.042387f, -0.019970f, -0.009145f, 0.051105f, 0.067711f, 0.051156f, 0.094663f, 0.061218f, 0.022663f, 0.063615f, 0.001468f, -0.027513f, -0.018270f, -0.056942f, -0.116974f, -0.071002f, -0.068491f, -0.069720f, 0.003628f, 0.032621f, 0.022456f, 0.086051f, 0.070459f, 0.048681f, 0.069299f, 0.073824f, 0.020864f, 0.022208f, -0.007881f, -0.063384f, -0.088276f, -0.067327f, -0.088480f, -0.062788f, -0.021998f, -0.015452f, 0.005420f, 0.048275f, 0.037667f, 0.034143f, 0.067967f, 0.056329f, 0.041286f, 0.070350f, 0.019210f, -0.014291f, -0.002948f, -0.028063f, -0.061070f, -0.035365f, -0.077249f, -0.097455f, -0.057571f, -0.048438f, -0.021149f, 0.056775f, 0.076404f, 0.071429f, 0.082199f, 0.067816f, 0.038425f, 0.037228f, 0.017929f, -0.007827f, + -0.020979f, -0.039119f, -0.058074f, -0.057943f, -0.065720f, -0.068796f, -0.059024f, -0.019960f, -0.007039f, 0.023333f, 0.059195f, 0.066128f, 0.065209f, 0.076425f, 0.060595f, 0.045583f, 0.037708f, 0.012548f, -0.029570f, -0.052383f, -0.085656f, -0.109115f, -0.102402f, -0.080945f, -0.040908f, 0.010492f, 0.054739f, 0.075431f, 0.086543f, 0.090466f, 0.077824f, 0.055237f, 0.027995f, -0.017806f, -0.044430f, -0.058453f, -0.068110f, -0.059359f, -0.044917f, -0.030761f, -0.012914f, 0.014449f, 0.018809f, 0.025950f, 0.029540f, 0.026545f, 0.020874f, 0.016927f, 0.011163f, 0.010075f, 0.004267f, -0.003214f, -0.005838f, -0.005665f, -0.009316f, -0.009925f, -0.013213f, -0.015159f, -0.017098f, -0.013455f, -0.010576f, -0.005470f, -0.000607f, 0.008694f, 0.014142f, 0.016874f, 0.016602f, 0.018668f, 0.016393f, 0.012069f, 0.005088f, -0.002405f, -0.010129f, -0.012578f, -0.014859f, -0.014723f, -0.016372f, -0.014375f, -0.010401f, -0.002729f, 0.002113f, 0.006229f, 0.009658f, 0.012162f, 0.011731f, 0.012770f, 0.011793f, 0.009942f, 0.005895f, 0.001816f, -0.004814f, -0.009107f, -0.012698f, -0.012655f, -0.012119f, -0.009931f, + -0.007027f, -0.001748f, 0.001115f, 0.003704f, 0.006062f, 0.008423f, 0.009276f, 0.009239f, 0.007089f, 0.005394f, 0.002595f, 0.000304f, -0.002385f, -0.004254f, -0.006780f, -0.007349f, -0.007774f, -0.006604f, -0.005133f, -0.002077f, 0.000411f, 0.003399f, 0.005040f, 0.005509f, 0.004606f, 0.004260f, 0.003551f, 0.003122f, 0.001708f, 0.000352f, -0.001368f, -0.002520f, -0.003857f, -0.004211f, -0.004138f, -0.003008f, -0.001787f, -0.000332f, 0.000377f, 0.001244f, 0.001570f, 0.001887f, 0.001717f, 0.001462f, 0.001009f, 0.000753f, 0.000293f, 0.000017f, -0.000263f, -0.000346f, -0.000407f, -0.000421f, -0.000399f}, + {-0.005259f, 0.001130f, 0.005927f, -0.000636f, 0.000436f, -0.009048f, -0.004603f, 0.001217f, 0.011753f, -0.007751f, 0.002373f, -0.012419f, 0.012537f, 0.000730f, 0.004530f, -0.001556f, 0.001901f, -0.002476f, -0.004441f, -0.010809f, 0.004432f, -0.010836f, -0.005117f, -0.006157f, 0.005995f, 0.004745f, 0.002236f, 0.004950f, 0.009427f, 0.000526f, -0.008741f, 0.005591f, 0.000833f, -0.000501f, 0.004566f, -0.001812f, -0.003229f, -0.012732f, 0.001959f, -0.003713f, 0.002674f, 0.005218f, -0.006949f, -0.002821f, 0.006154f, 0.001872f, 0.000652f, -0.006525f, 0.016142f, 0.009695f, 0.001502f, 0.007767f, 0.006368f, 0.006178f, -0.014921f, 0.000843f, -0.001526f, -0.004010f, 0.003554f, 0.002381f, -0.002464f, -0.002850f, -0.000880f, -0.004518f, 0.004296f, -0.001753f, 0.008552f, -0.000395f, -0.002287f, -0.004173f, -0.007635f, -0.001456f, 0.005736f, -0.000326f, 0.001251f, 0.006772f, 0.001790f, 0.007845f, -0.000237f, 0.001128f, -0.000896f, 0.008440f, 0.007478f, 0.007563f, 0.001583f, -0.000080f, 0.003317f, -0.000241f, 0.000971f, 0.000091f, 0.000307f, -0.000706f, -0.002442f, -0.002075f, -0.000516f, -0.002367f, + 0.001012f, 0.001092f, -0.001057f, 0.002426f, -0.001062f, -0.000796f, -0.000590f, 0.000954f, 0.000209f, 0.002161f, 0.000116f, -0.000039f, 0.000103f, 0.002824f, 0.001347f, -0.000291f, -0.000855f, 0.000063f, -0.000484f, 0.001559f, 0.000736f, 0.003012f, 0.000678f, 0.003836f, 0.013427f, -0.006546f, 0.004471f, -0.003737f, -0.005848f, -0.002419f, -0.004054f, 0.007317f, -0.006084f, -0.011288f, -0.002893f, 0.002935f, -0.009400f, -0.005702f, 0.010583f, 0.018279f, -0.003101f, 0.006967f, -0.006293f, -0.006644f, -0.000306f, 0.001897f, -0.000818f, -0.000223f, 0.006785f, -0.011645f, 0.003778f, -0.000892f, -0.002442f, -0.009824f, 0.000844f, 0.000192f, 0.005508f, 0.001613f, -0.007665f, 0.010063f, -0.008046f, 0.009387f, -0.001064f, 0.001670f, 0.003829f, -0.001149f, -0.004720f, 0.007329f, 0.001809f, 0.009806f, 0.001497f, -0.008727f, 0.015746f, 0.012476f, -0.004366f, -0.001329f, -0.003034f, -0.010990f, -0.005919f, -0.001848f, -0.001884f, 0.004374f, -0.006024f, 0.000439f, 0.004318f, -0.000027f, -0.000164f, -0.000745f, -0.001033f, -0.006023f, 0.009524f, 0.000261f, -0.000204f, -0.003048f, -0.001059f, -0.008782f, + -0.007766f, 0.002526f, 0.006359f, -0.000845f, -0.001645f, -0.000051f, -0.000062f, -0.004520f, 0.008537f, 0.001124f, 0.002828f, -0.002262f, 0.002333f, 0.001420f, -0.000349f, -0.000196f, -0.000369f, 0.000076f, 0.002028f, -0.001163f, 0.001287f, 0.001329f, -0.000258f, -0.000385f, 0.001066f, 0.002242f, 0.002045f, -0.001498f, 0.000573f, 0.000663f, -0.001119f, -0.000675f, 0.003212f, -0.000490f, -0.000149f, -0.002553f, -0.002301f, -0.003900f, -0.001421f, -0.013960f, 0.017321f, -0.003705f, -0.001969f, 0.012391f, -0.004762f, 0.006417f, 0.027469f, -0.003233f, 0.000877f, -0.010431f, -0.008409f, -0.013009f, 0.007632f, -0.005342f, 0.003759f, 0.007251f, -0.008167f, -0.006975f, -0.005093f, 0.000641f, 0.002761f, -0.010106f, -0.003921f, 0.004489f, 0.003868f, -0.003978f, -0.001593f, 0.006255f, -0.006345f, 0.001049f, -0.003122f, -0.001108f, -0.004398f, 0.003854f, -0.004030f, 0.001739f, 0.003701f, -0.001628f, 0.011585f, 0.000536f, -0.001501f, -0.008468f, 0.001079f, 0.012371f, 0.001765f, 0.004210f, -0.011213f, -0.016049f, -0.005787f, -0.013800f, -0.012170f, -0.000271f, -0.005216f, -0.000430f, -0.014776f, 0.012745f, + -0.013675f, 0.002071f, 0.009481f, -0.008452f, -0.014291f, -0.010160f, -0.002949f, 0.009587f, 0.008528f, 0.012813f, -0.007444f, -0.006541f, -0.005215f, -0.004471f, 0.009300f, 0.002432f, -0.003748f, -0.001988f, 0.004464f, 0.005058f, 0.001591f, 0.002364f, 0.003275f, -0.000635f, -0.005236f, -0.000802f, -0.003440f, 0.001393f, 0.000536f, 0.001231f, 0.001136f, 0.000346f, 0.002310f, 0.000366f, 0.002682f, 0.000328f, -0.001875f, 0.002725f, -0.002986f, -0.001927f, 0.000707f, -0.000732f, 0.002749f, -0.001540f, -0.001126f, -0.000453f, 0.000445f, -0.000965f, -0.001750f, 0.001784f, -0.000486f, 0.001338f, -0.001461f, -0.001410f, -0.001746f, -0.002050f, -0.001243f, -0.001857f, 0.002891f, -0.002395f, 0.014933f, 0.001545f, -0.006017f, 0.000841f, -0.004983f, -0.001113f, 0.010445f, 0.017534f, -0.006009f, -0.006141f, -0.015928f, 0.002011f, 0.003981f, 0.009052f, -0.006018f, 0.009762f, 0.001529f, 0.015035f, -0.012084f, 0.001932f, -0.022804f, -0.002511f, 0.002702f, -0.005570f, -0.005147f, -0.002014f, 0.008374f, -0.006879f, -0.012002f, 0.003397f, -0.017599f, -0.003833f, -0.008468f, 0.003875f, -0.001898f, 0.005944f, + 0.000754f, -0.013399f, -0.014500f, 0.000396f, 0.007678f, 0.014326f, -0.002876f, -0.005831f, 0.011968f, -0.013234f, -0.007230f, 0.006386f, 0.005672f, 0.009482f, -0.009084f, 0.000337f, 0.003633f, -0.005710f, -0.001958f, 0.005600f, -0.008250f, 0.010702f, -0.004691f, -0.001991f, -0.011456f, -0.009493f, 0.004551f, -0.000024f, 0.000180f, -0.001615f, -0.007046f, 0.006628f, -0.004443f, 0.008243f, -0.000180f, -0.010906f, -0.011480f, 0.004185f, -0.005793f, 0.002043f, -0.016327f, -0.015555f, -0.002522f, 0.014639f, 0.000063f, -0.003020f, 0.000688f, 0.002109f, 0.001522f, -0.000673f, 0.002295f, -0.007635f, 0.001382f, 0.001286f, 0.002272f, 0.002937f, 0.003219f, 0.001717f, -0.004325f, 0.000309f, 0.003729f, 0.001738f, 0.000971f, -0.002137f, -0.002662f, 0.000602f, -0.000055f, -0.000883f, 0.003495f, -0.000077f, -0.000298f, -0.002467f, 0.004372f, 0.003640f, -0.000270f, 0.000311f, -0.002232f, 0.001265f, 0.001325f, 0.000604f, 0.000143f, 0.001445f, -0.002026f, -0.001053f, 0.008842f, -0.024451f, 0.005539f, -0.010683f, 0.008839f, 0.010118f, -0.011618f, -0.021450f, 0.002890f, -0.002959f, 0.013412f, -0.008232f, + 0.019472f, -0.008356f, 0.012846f, -0.016136f, -0.006052f, 0.006587f, 0.009522f, 0.002591f, -0.000182f, -0.009940f, -0.001406f, -0.007844f, -0.009786f, 0.005255f, -0.008369f, 0.003122f, 0.001779f, 0.003872f, -0.004809f, 0.009006f, -0.001828f, 0.007737f, -0.001888f, -0.015123f, -0.002624f, -0.004910f, 0.001399f, 0.014889f, 0.000826f, -0.001396f, -0.000900f, -0.006183f, 0.005069f, -0.005835f, 0.007798f, 0.008463f, 0.002992f, 0.003192f, 0.014988f, -0.003844f, -0.002850f, -0.012190f, 0.008488f, 0.007492f, 0.001478f, 0.001855f, 0.001470f, 0.000533f, 0.004302f, 0.009106f, 0.006031f, 0.003412f, 0.003234f, -0.002442f, 0.011885f, 0.003999f, -0.002595f, -0.009321f, 0.004566f, -0.002835f, 0.017409f, 0.009857f, 0.002095f, -0.008175f, -0.003136f, 0.013266f, -0.005308f, 0.001662f, 0.007625f, -0.004395f, -0.005498f, -0.010692f, 0.001227f, 0.003794f, -0.000959f, 0.005019f, -0.004272f, -0.001638f, -0.003357f, 0.003662f, -0.000444f, -0.001257f, -0.005210f, 0.001146f, 0.001181f, 0.002981f, 0.003479f, -0.001290f, 0.000471f, 0.003909f, -0.000433f, 0.003969f, -0.000410f, 0.001155f, 0.005813f, 0.001167f, + 0.005977f, -0.000525f, -0.001467f, -0.000443f, -0.000667f, 0.000147f, 0.000298f, -0.004665f, 0.001573f, 0.003635f, 0.000248f, 0.001434f, -0.001250f, -0.031380f, -0.017055f, 0.006284f, -0.006146f, 0.012599f, 0.012564f, 0.018980f, 0.007836f, 0.007670f, 0.004661f, -0.022872f, -0.005143f, -0.003176f, 0.002021f, -0.002304f, 0.007082f, 0.005039f, -0.008819f, -0.007031f, 0.005837f, 0.011116f, 0.014005f, 0.012092f, 0.015912f, -0.008755f, -0.008764f, -0.011606f, 0.012258f, -0.007126f, 0.010120f, -0.002586f, -0.000572f, -0.010869f, -0.006549f, -0.006223f, 0.009185f, 0.011364f, 0.001961f, 0.011361f, 0.016231f, -0.006481f, 0.004067f, 0.019093f, -0.009659f, 0.006190f, 0.006428f, 0.000705f, 0.014312f, 0.018399f, 0.013944f, 0.031919f, 0.005876f, -0.004543f, -0.005969f, -0.005483f, -0.000405f, 0.005611f, 0.009622f, -0.001775f, -0.003189f, -0.003386f, -0.008619f, 0.003586f, 0.004561f, 0.008268f, -0.019997f, -0.002742f, 0.004975f, 0.013218f, 0.009154f, -0.017030f, -0.012682f, 0.003213f, 0.003115f, 0.013794f, -0.012221f, 0.000764f, -0.001300f, 0.001459f, -0.017361f, -0.004680f, -0.006029f, -0.004198f, + -0.007180f, -0.002986f, 0.000469f, 0.006638f, -0.000090f, 0.000375f, 0.002511f, 0.003177f, -0.006682f, -0.001041f, 0.000415f, 0.000031f, 0.002280f, -0.002274f, -0.004396f, -0.002922f, -0.003376f, 0.004706f, -0.004600f, -0.002170f, -0.005283f, 0.001313f, -0.001197f, 0.003351f, -0.004844f, 0.002009f, -0.001696f, 0.001975f, 0.001699f, 0.000349f, 0.004043f, -0.003906f, 0.001950f, 0.002283f, 0.000604f, 0.004823f, 0.007554f, 0.015136f, -0.001974f, 0.003081f, 0.012941f, 0.019002f, 0.010698f, -0.021003f, 0.000059f, -0.022345f, -0.015846f, -0.009607f, -0.001864f, -0.013680f, 0.016305f, 0.006018f, 0.009649f, -0.027795f, -0.001999f, 0.018153f, 0.009236f, -0.008169f, -0.011683f, -0.007150f, 0.007081f, -0.021270f, -0.001243f, -0.013676f, 0.020910f, -0.002774f, -0.006117f, 0.002210f, -0.000749f, -0.003605f, 0.003690f, -0.005546f, 0.009710f, 0.006887f, 0.013958f, -0.001055f, 0.000712f, 0.021525f, -0.006818f, 0.014401f, -0.002343f, -0.002556f, 0.037954f, 0.004500f, -0.004070f, -0.008593f, -0.029360f, 0.003073f, -0.030091f, -0.005087f, 0.031683f, -0.008964f, -0.006160f, -0.022041f, -0.006458f, 0.000760f, + -0.011837f, 0.006341f, -0.001152f, -0.016161f, 0.017144f, 0.006111f, 0.005581f, 0.004694f, -0.011942f, 0.013073f, -0.020467f, 0.005894f, 0.007858f, 0.000838f, -0.002713f, -0.008309f, -0.006511f, -0.008463f, -0.002710f, 0.006771f, 0.008743f, -0.002233f, -0.007159f, -0.004263f, 0.009746f, 0.003975f, 0.018659f, -0.000354f, 0.001404f, 0.007571f, -0.000779f, -0.003465f, -0.002589f, -0.002386f, -0.002064f, -0.003106f, 0.002188f, -0.003543f, -0.000140f, 0.003777f, 0.001392f, 0.003851f, 0.003741f, 0.002980f, 0.000330f, 0.005603f, 0.004067f, 0.002400f, 0.001722f, 0.001676f, -0.005895f, -0.005028f, 0.004262f, 0.000578f, -0.003641f, 0.000615f, -0.004140f, 0.001163f, 0.004703f, 0.001689f, -0.000810f, 0.001701f, 0.004029f, 0.000874f, -0.003295f, 0.001592f, 0.012259f, -0.025044f, 0.010640f, -0.008908f, -0.012719f, -0.012129f, 0.009363f, 0.011997f, 0.006947f, 0.020884f, 0.015377f, 0.003022f, 0.006208f, -0.016567f, 0.003227f, 0.007301f, 0.016171f, 0.003042f, -0.007922f, 0.005840f, 0.007496f, -0.014860f, 0.002044f, -0.015239f, 0.011698f, 0.010654f, 0.013743f, -0.013573f, 0.008121f, 0.014729f, + -0.006815f, 0.003721f, 0.019584f, -0.000713f, -0.012296f, -0.009812f, 0.004285f, -0.003366f, -0.012494f, -0.005204f, 0.000131f, 0.002783f, 0.006627f, -0.008646f, 0.013641f, 0.008248f, -0.003242f, 0.016481f, -0.002146f, 0.006185f, 0.021643f, -0.023211f, 0.042546f, -0.019731f, 0.005766f, 0.012755f, -0.004546f, -0.002481f, 0.005304f, 0.028781f, -0.001669f, -0.004100f, -0.000955f, -0.006959f, 0.013941f, 0.015643f, -0.005132f, 0.006636f, 0.005505f, 0.005035f, 0.009547f, 0.012300f, 0.000933f, 0.013310f, 0.002802f, -0.011610f, -0.017811f, 0.004142f, 0.001659f, 0.008036f, 0.003384f, 0.026643f, -0.002783f, 0.014842f, 0.011958f, -0.008375f, -0.015317f, -0.001874f, 0.001646f, 0.003866f, -0.004217f, 0.006794f, 0.003158f, -0.006648f, -0.001876f, -0.006349f, -0.002384f, 0.003823f, -0.002091f, 0.005683f, -0.001535f, 0.001989f, 0.001403f, -0.002754f, 0.002980f, 0.003422f, -0.005392f, 0.003498f, 0.002306f, 0.001044f, 0.001190f, -0.000254f, 0.000961f, 0.006331f, 0.001924f, -0.002332f, 0.001090f, 0.001698f, 0.003101f, 0.003881f, -0.001274f, -0.004481f, -0.001342f, -0.003920f, -0.002962f, 0.004680f, + 0.004289f, 0.005517f, 0.014153f, 0.018640f, 0.011456f, -0.019845f, 0.037986f, -0.011974f, 0.007190f, -0.027905f, 0.011068f, -0.024682f, 0.019085f, 0.001955f, -0.005319f, -0.013978f, 0.018043f, 0.002391f, 0.011507f, 0.011872f, 0.006090f, -0.020798f, 0.010607f, -0.012601f, -0.002317f, 0.009342f, 0.010181f, 0.002342f, -0.003873f, -0.020843f, 0.002892f, 0.019139f, 0.002135f, 0.012378f, 0.013874f, -0.021766f, 0.011966f, -0.011085f, -0.010914f, 0.016001f, 0.017762f, 0.009193f, 0.009995f, 0.002732f, 0.009582f, -0.022438f, -0.009993f, -0.007194f, 0.000645f, 0.023804f, 0.011448f, 0.009404f, -0.001760f, 0.010437f, -0.000531f, 0.026218f, 0.009700f, 0.009912f, 0.004022f, -0.001520f, -0.038854f, 0.014354f, 0.009195f, -0.003653f, -0.002745f, -0.029077f, 0.000276f, -0.011152f, 0.006944f, 0.025213f, -0.004237f, -0.014526f, 0.029478f, -0.001383f, 0.016651f, -0.009886f, 0.000108f, -0.018450f, -0.001696f, 0.000290f, -0.031842f, -0.009537f, -0.005489f, -0.014388f, -0.006639f, -0.002883f, 0.002012f, 0.015891f, 0.001184f, -0.000445f, -0.003078f, -0.008294f, -0.001320f, 0.001412f, -0.003023f, 0.001072f, + 0.000396f, 0.004213f, -0.007467f, -0.003003f, -0.000996f, -0.006940f, 0.000378f, -0.004520f, -0.002810f, -0.002310f, -0.005556f, -0.002918f, 0.006521f, -0.002235f, 0.001165f, -0.001836f, 0.007069f, -0.000372f, 0.003205f, -0.004642f, -0.010337f, -0.003190f, -0.000448f, 0.004418f, 0.001868f, 0.006315f, -0.000422f, -0.002067f, 0.005411f, -0.006645f, 0.007895f, -0.000215f, 0.024871f, -0.021450f, 0.003112f, 0.009039f, 0.011244f, -0.037220f, 0.024682f, 0.006890f, -0.026467f, -0.016928f, 0.014421f, 0.033144f, -0.011690f, -0.006036f, -0.022917f, 0.047457f, 0.018424f, 0.002945f, 0.007893f, -0.024935f, -0.016154f, -0.001057f, 0.002057f, 0.024613f, 0.005327f, 0.018973f, 0.021326f, -0.000939f, 0.001311f, 0.014856f, -0.003930f, -0.015861f, -0.015173f, -0.003864f, 0.021114f, -0.011420f, 0.026714f, -0.012403f, 0.039235f, 0.017449f, 0.031643f, -0.008578f, 0.005110f, 0.025399f, -0.019786f, 0.011838f, 0.011454f, 0.010772f, -0.011335f, 0.013525f, 0.003266f, 0.004312f, 0.011540f, 0.024155f, 0.020304f, -0.020613f, -0.004829f, 0.010613f, -0.020112f, -0.012774f, -0.005316f, -0.041147f, 0.011006f, -0.020340f, + -0.012758f, 0.003968f, -0.005105f, 0.014085f, 0.026223f, 0.016811f, 0.010601f, -0.014163f, -0.003350f, -0.000860f, -0.027841f, 0.005090f, 0.002364f, 0.034416f, 0.007406f, 0.007744f, -0.007458f, 0.026592f, -0.000238f, -0.000758f, 0.000082f, -0.008646f, -0.003953f, 0.001121f, -0.001584f, -0.009368f, 0.000870f, -0.002404f, 0.001701f, -0.011172f, -0.012123f, -0.003972f, 0.009679f, -0.001592f, 0.003776f, 0.003680f, 0.003000f, -0.000776f, -0.002552f, -0.003326f, -0.006706f, -0.011192f, 0.003873f, 0.000617f, -0.002723f, -0.013222f, 0.009794f, 0.006693f, 0.003810f, -0.001055f, 0.000862f, -0.004469f, 0.003367f, -0.002333f, -0.004319f, 0.001611f, 0.005706f, 0.003487f, -0.003447f, -0.000786f, -0.001361f, 0.004246f, -0.029639f, -0.043744f, 0.023676f, -0.017809f, 0.019414f, 0.006353f, 0.009402f, 0.011497f, -0.029384f, -0.053466f, 0.004743f, 0.007739f, 0.030138f, -0.029703f, -0.032564f, 0.028114f, -0.011220f, 0.012790f, -0.006136f, 0.006697f, 0.004465f, 0.007415f, -0.014828f, 0.007168f, -0.002132f, -0.004644f, 0.018581f, 0.006938f, -0.002665f, -0.024122f, -0.003287f, -0.000690f, -0.004438f, -0.001151f, + -0.013049f, -0.031997f, -0.014216f, 0.023488f, -0.009999f, 0.011582f, -0.018134f, 0.013439f, 0.006930f, -0.000241f, -0.009129f, -0.039688f, 0.021945f, 0.021297f, 0.027388f, -0.019151f, -0.008112f, 0.037219f, 0.032901f, 0.015199f, 0.007078f, 0.021035f, 0.007745f, 0.018901f, -0.010139f, 0.016418f, -0.031374f, -0.001994f, 0.008763f, -0.008170f, 0.037353f, 0.001456f, 0.020429f, -0.012177f, -0.020064f, 0.043163f, -0.000719f, 0.017134f, -0.005703f, 0.000611f, -0.050757f, -0.004273f, 0.010808f, -0.019590f, 0.023926f, 0.018139f, 0.004478f, -0.010387f, -0.038661f, -0.000825f, -0.007854f, 0.009638f, 0.011760f, 0.001963f, -0.004698f, 0.009098f, 0.000415f, 0.004470f, -0.002445f, -0.011696f, -0.004266f, -0.010680f, 0.018722f, 0.005742f, -0.000369f, -0.000389f, 0.002353f, 0.017285f, -0.002978f, -0.004141f, 0.002681f, -0.001356f, 0.000230f, 0.007754f, 0.004242f, 0.006970f, -0.004980f, -0.000653f, -0.007984f, 0.001555f, 0.000141f, 0.007299f, 0.007309f, -0.008089f, 0.013062f, 0.013266f, -0.010344f, 0.000808f, 0.001716f, -0.001501f, -0.021933f, -0.028734f, -0.008343f, -0.006731f, -0.049204f, -0.046156f, + -0.012093f, 0.000224f, 0.034741f, 0.028260f, 0.027969f, -0.010817f, -0.004497f, -0.007002f, 0.029864f, 0.012832f, -0.012531f, -0.002217f, -0.009977f, 0.021599f, 0.016764f, -0.012469f, -0.017461f, -0.016026f, -0.032733f, 0.013670f, 0.000912f, 0.000927f, 0.007144f, -0.004896f, 0.012412f, 0.046031f, -0.026204f, 0.013878f, 0.002746f, -0.017744f, -0.010162f, -0.021067f, 0.007986f, -0.009364f, -0.010586f, 0.023834f, 0.002926f, -0.007952f, 0.024065f, -0.003275f, -0.010628f, 0.008374f, 0.017557f, -0.009668f, 0.018868f, 0.033893f, 0.032688f, -0.022347f, -0.000314f, 0.008165f, 0.018419f, -0.028300f, -0.005900f, -0.007817f, 0.035256f, 0.015024f, -0.003806f, -0.021448f, -0.023804f, -0.021162f, 0.031839f, 0.026368f, -0.050454f, -0.042094f, -0.031927f, -0.022486f, 0.007606f, -0.020281f, 0.012307f, 0.003358f, 0.004999f, -0.040589f, -0.013017f, 0.036687f, 0.028293f, -0.012298f, -0.026053f, 0.025342f, 0.013274f, -0.003056f, 0.000412f, -0.003240f, -0.006185f, 0.014400f, -0.012933f, 0.003147f, 0.002203f, -0.000545f, -0.009350f, -0.017051f, 0.003280f, 0.013842f, -0.001372f, 0.001514f, -0.005969f, 0.013145f, + 0.014383f, 0.001406f, -0.001925f, 0.004843f, -0.000533f, 0.005809f, 0.006259f, 0.009054f, -0.012192f, -0.001186f, 0.004438f, -0.000015f, -0.007576f, 0.002012f, 0.015241f, 0.014189f, -0.005437f, 0.010869f, -0.016693f, 0.004159f, -0.005405f, -0.004644f, -0.006704f, -0.010434f, 0.003876f, 0.040742f, 0.032126f, 0.019962f, 0.003159f, -0.026509f, -0.013736f, -0.004043f, 0.011001f, 0.016951f, -0.023446f, 0.006179f, 0.001534f, -0.020029f, -0.009433f, 0.016245f, -0.011869f, 0.012922f, 0.005610f, 0.015186f, -0.018686f, -0.000026f, -0.041815f, 0.006326f, -0.052908f, 0.021842f, 0.021612f, -0.020536f, 0.024393f, 0.029043f, 0.000923f, 0.008296f, -0.034089f, 0.020184f, 0.002080f, -0.014145f, 0.018586f, -0.004340f, 0.000334f, -0.000301f, 0.002337f, 0.035723f, -0.003964f, -0.000032f, 0.043864f, -0.000419f, -0.020163f, -0.057840f, -0.047518f, 0.052899f, 0.032989f, 0.013048f, 0.013368f, -0.022107f, -0.044532f, -0.021888f, 0.007117f, -0.017109f, 0.034922f, -0.001852f, 0.004688f, 0.037635f, -0.007668f, -0.011670f, -0.008405f, -0.023681f, -0.040195f, -0.031943f, 0.091025f, -0.044166f, -0.019952f, 0.026117f, + -0.046021f, -0.033166f, 0.033052f, 0.046292f, 0.015297f, -0.008403f, 0.054504f, 0.026320f, -0.043750f, -0.015179f, -0.024408f, -0.023842f, 0.049560f, 0.003601f, -0.032921f, -0.022766f, -0.025610f, 0.007245f, -0.005236f, 0.015116f, -0.000309f, -0.007593f, -0.011978f, 0.001133f, 0.013766f, -0.007354f, 0.006397f, -0.007163f, 0.006891f, 0.006233f, 0.019149f, -0.007411f, -0.002715f, 0.016397f, 0.001373f, 0.008393f, 0.008597f, 0.011711f, 0.002263f, -0.006808f, -0.003768f, -0.001725f, -0.002669f, 0.007193f, -0.002148f, -0.007627f, 0.015458f, 0.015933f, -0.008698f, 0.004091f, -0.009913f, 0.003655f, 0.003812f, 0.009850f, -0.002412f, -0.000933f, -0.004856f, 0.004716f, 0.011073f, -0.037375f, -0.027590f, -0.019260f, -0.034205f, -0.003102f, 0.032366f, -0.002369f, 0.006641f, 0.015920f, 0.010562f, -0.027539f, -0.013341f, -0.022763f, -0.012195f, 0.029144f, -0.008929f, -0.003203f, -0.004018f, 0.017663f, 0.017618f, 0.052615f, 0.008368f, 0.038725f, -0.002282f, 0.013054f, -0.021123f, -0.015916f, 0.013868f, -0.026878f, -0.029875f, 0.000957f, 0.009391f, -0.015346f, 0.012243f, -0.017963f, 0.005459f, -0.047229f, + 0.026337f, 0.014725f, 0.021539f, 0.002664f, -0.019210f, -0.039575f, -0.014122f, -0.003549f, 0.032594f, -0.024861f, -0.014717f, 0.009087f, 0.074560f, -0.020635f, 0.075797f, -0.046530f, 0.018351f, -0.017171f, 0.033254f, -0.013217f, 0.057506f, -0.054124f, 0.082362f, -0.007814f, 0.016928f, 0.035630f, -0.061104f, 0.054445f, -0.065265f, 0.044016f, -0.106338f, 0.057618f, -0.054672f, 0.048411f, -0.071321f, 0.062664f, 0.002096f, 0.040611f, 0.017573f, -0.033273f, 0.028905f, -0.023832f, 0.072029f, -0.032840f, 0.011844f, -0.043011f, 0.011624f, -0.002903f, 0.007879f, -0.015398f, 0.019980f, -0.019767f, 0.014148f, -0.007019f, 0.004546f, 0.006041f, 0.006345f, 0.008322f, -0.004925f, -0.011382f, -0.009240f, -0.010907f, -0.025024f, 0.014420f, 0.003678f, -0.017206f, -0.008018f, -0.005217f, 0.011107f, -0.019150f, 0.018162f, -0.014674f, 0.003599f, -0.007879f, 0.008819f, 0.002931f, -0.000201f, 0.027595f, -0.024501f, 0.014922f, -0.023674f, 0.035596f, -0.006808f, 0.034776f, -0.013742f, 0.010846f, 0.015694f, 0.005242f, 0.005391f, -0.000053f, 0.016632f, -0.024889f, 0.027231f, -0.018984f, 0.017910f, -0.004050f, + 0.000107f, -0.007211f, 0.000251f, 0.001473f, -0.007056f, 0.003307f, 0.006509f, 0.003191f, -0.032772f, -0.029697f, 0.034486f, 0.059506f, -0.049361f, 0.075444f, -0.004411f, -0.000052f, -0.002928f, 0.013065f, -0.022487f, -0.016547f, -0.033675f, -0.007569f, 0.001056f, 0.000031f, -0.000199f, 0.029627f, 0.005058f, 0.032485f, 0.031821f, -0.020299f, 0.011697f, 0.067801f, 0.022147f, 0.014486f, 0.010158f, -0.058896f, 0.002980f, -0.009586f, -0.007394f, -0.054019f, -0.011434f, 0.030971f, 0.008745f, 0.010267f, 0.015583f, 0.039251f, 0.010237f, -0.012173f, -0.004043f, -0.003435f, 0.014725f, -0.026794f, -0.016473f, 0.040529f, 0.025169f, 0.018846f, 0.031353f, 0.023120f, -0.013666f, -0.006899f, -0.046804f, -0.020609f, 0.019028f, 0.014964f, 0.035328f, -0.025520f, -0.012689f, -0.008988f, 0.025971f, 0.015148f, 0.023316f, 0.009571f, -0.018464f, -0.017195f, 0.058426f, -0.017927f, -0.056767f, 0.013068f, 0.041073f, 0.028087f, -0.000741f, -0.004969f, 0.005080f, 0.009350f, 0.005816f, 0.052128f, -0.062843f, -0.053733f, 0.006254f, 0.021139f, -0.027038f, -0.014020f, 0.004591f, -0.021350f, 0.010104f, -0.010464f, + -0.002663f, 0.005553f, -0.004060f, -0.014363f, 0.000553f, 0.011831f, -0.007626f, 0.000067f, -0.020785f, -0.003691f, -0.018284f, 0.013413f, -0.005797f, 0.012298f, -0.007431f, 0.007668f, 0.003233f, 0.010373f, 0.016321f, -0.016570f, -0.007388f, -0.004979f, 0.012875f, -0.008061f, -0.014906f, -0.027414f, -0.000068f, -0.010981f, -0.004060f, 0.004116f, 0.002766f, 0.000735f, 0.005402f, 0.008921f, -0.001733f, 0.027566f, 0.003441f, -0.002255f, -0.021336f, 0.003658f, -0.003901f, -0.001246f, 0.005254f, -0.022434f, -0.011394f, -0.023171f, -0.119457f, 0.032969f, -0.014586f, -0.007616f, 0.029261f, -0.020277f, 0.031401f, -0.004266f, -0.051789f, -0.009471f, 0.004994f, 0.018136f, 0.023075f, 0.005346f, -0.036714f, 0.036266f, -0.014278f, -0.003334f, -0.022578f, -0.010168f, 0.019424f, -0.003922f, 0.017323f, 0.029238f, -0.006816f, -0.037827f, 0.008346f, 0.041450f, -0.038661f, 0.014180f, 0.032160f, -0.005885f, -0.025586f, -0.047693f, -0.032202f, 0.033599f, 0.086137f, -0.026561f, -0.034417f, 0.097070f, -0.006384f, -0.014004f, 0.069841f, 0.040664f, 0.034684f, 0.028037f, 0.011478f, -0.020565f, 0.035464f, 0.033047f, + 0.022747f, 0.010531f, -0.064289f, 0.040116f, 0.035487f, -0.067852f, -0.039264f, -0.024389f, -0.019031f, -0.018703f, 0.073996f, 0.036947f, -0.042355f, 0.039555f, -0.015697f, -0.039589f, 0.017210f, 0.020127f, -0.017514f, -0.016783f, -0.062120f, 0.006976f, 0.010582f, 0.045413f, 0.021735f, 0.005618f, 0.037954f, -0.030181f, 0.078539f, -0.083514f, -0.097439f, 0.068774f, -0.042064f, -0.002608f, 0.048222f, -0.030397f, -0.020938f, -0.006014f, -0.005759f, 0.006001f, 0.029582f, 0.014535f, -0.024248f, -0.001483f, 0.011514f, -0.002894f, 0.016434f, -0.000647f, 0.009083f, 0.001782f, -0.012871f, 0.006910f, 0.026258f, 0.018095f, -0.001151f, 0.003524f, 0.017560f, -0.002816f, -0.002091f, 0.004464f, 0.040676f, 0.020887f, -0.006530f, 0.008905f, -0.036066f, -0.001566f, 0.009528f, -0.016598f, -0.022354f, 0.021117f, -0.009656f, -0.000607f, 0.021712f, -0.018814f, 0.008366f, -0.003197f, -0.005368f, 0.026947f, -0.015198f, -0.003612f, -0.031593f, -0.129774f, 0.040139f, 0.073469f, -0.045267f, -0.009300f, -0.035163f, 0.075581f, 0.050892f, 0.032000f, -0.005842f, -0.026225f, 0.005593f, 0.030549f, 0.014330f, -0.012976f, + -0.002709f, 0.041731f, -0.002559f, -0.015183f, -0.055548f, -0.026285f, 0.047190f, 0.027463f, -0.029473f, 0.023884f, -0.021291f, -0.006679f, 0.014285f, 0.013358f, -0.012753f, 0.008668f, -0.048669f, 0.014106f, 0.066228f, -0.008276f, -0.012685f, -0.064790f, -0.038826f, 0.031595f, -0.051009f, -0.027706f, 0.011899f, 0.013127f, -0.015647f, 0.042640f, 0.040334f, -0.041240f, 0.015624f, 0.023144f, 0.066741f, 0.061067f, -0.009451f, 0.020045f, -0.001436f, 0.069802f, 0.030486f, 0.028367f, 0.066239f, -0.029393f, -0.042958f, -0.022006f, -0.055045f, 0.046682f, 0.022169f, 0.022856f, 0.012294f, 0.079149f, -0.052142f, -0.012124f, 0.033960f, -0.018572f, 0.037667f, -0.001715f, 0.004588f, 0.017533f, -0.045498f, -0.069207f, 0.008939f, 0.013444f, 0.076436f, 0.058099f, 0.001612f, -0.056138f, -0.008679f, -0.061324f, -0.000142f, -0.001840f, -0.017036f, -0.015634f, 0.008556f, -0.005203f, -0.004406f, -0.015471f, -0.009909f, -0.013728f, -0.008031f, 0.002238f, -0.016230f, -0.014911f, -0.002277f, 0.015450f, 0.008058f, -0.019852f, 0.018381f, -0.009998f, 0.033920f, -0.010423f, -0.029717f, -0.010858f, 0.015152f, -0.009163f, + -0.022481f, 0.026096f, -0.005347f, -0.023550f, -0.036421f, 0.005814f, -0.005647f, 0.004466f, 0.008356f, -0.013931f, -0.011793f, -0.031934f, -0.006871f, -0.008309f, 0.002517f, 0.006124f, 0.012086f, 0.010446f, -0.024188f, 0.000290f, -0.030663f, -0.011128f, 0.003361f, 0.003486f, 0.030125f, 0.051249f, 0.044726f, 0.046081f, 0.059337f, -0.034281f, 0.046719f, -0.091535f, -0.040045f, 0.034530f, 0.008140f, 0.066707f, 0.030410f, 0.056874f, -0.024872f, 0.007451f, -0.049534f, 0.033470f, 0.055317f, 0.050304f, 0.004992f, 0.035625f, -0.087919f, -0.057291f, 0.054432f, 0.015782f, -0.054834f, -0.028380f, 0.006605f, 0.080455f, 0.024783f, -0.032885f, -0.041464f, 0.008098f, -0.012173f, 0.049442f, 0.053395f, -0.005395f, -0.008799f, 0.010515f, -0.015285f, 0.063973f, 0.018307f, -0.015315f, 0.012795f, -0.030618f, -0.018223f, -0.143712f, -0.048938f, 0.025478f, -0.022595f, -0.021612f, -0.000840f, -0.026027f, -0.026082f, 0.065693f, 0.043892f, -0.033271f, 0.059870f, 0.124292f, 0.025424f, 0.088497f, 0.012089f, 0.017889f, 0.064844f, 0.042824f, -0.035190f, -0.039838f, -0.070083f, -0.043574f, -0.004777f, -0.069086f, + 0.025375f, -0.008424f, -0.066968f, -0.048011f, -0.047977f, -0.060159f, -0.036640f, -0.024250f, -0.032139f, 0.009324f, 0.056763f, 0.069442f, 0.036461f, -0.007359f, -0.050951f, -0.006596f, 0.001769f, 0.004197f, -0.024932f, -0.004548f, -0.016910f, 0.013463f, 0.019377f, 0.002042f, 0.014129f, -0.000591f, -0.010083f, 0.016499f, -0.018182f, 0.002134f, 0.015587f, 0.033937f, 0.004449f, -0.000455f, 0.022742f, 0.009588f, 0.061394f, -0.015589f, -0.050405f, -0.002731f, 0.033595f, 0.005890f, -0.013912f, -0.015436f, -0.041048f, -0.038715f, -0.022124f, -0.015503f, -0.007386f, -0.023305f, -0.033738f, -0.035723f, -0.019798f, -0.003030f, 0.004591f, 0.046958f, 0.033770f, -0.012797f, 0.054493f, 0.097313f, 0.067095f, 0.047309f, 0.029295f, 0.018475f, -0.024350f, -0.015692f, -0.024313f, -0.021847f, -0.006087f, -0.001753f, 0.056217f, -0.006760f, 0.047669f, -0.031770f, 0.012290f, -0.107535f, 0.029573f, -0.016809f, 0.054426f, -0.014233f, -0.064547f, 0.063782f, -0.024738f, 0.009299f, 0.036061f, 0.026838f, 0.058341f, -0.009535f, 0.008419f, -0.011752f, 0.066594f, -0.014808f, 0.012206f, 0.046218f, -0.054422f, 0.045568f, + -0.014017f, 0.027670f, 0.044198f, -0.012571f, 0.009528f, 0.006957f, 0.004115f, -0.014949f, 0.019432f, 0.018815f, -0.008359f, -0.026797f, -0.005318f, -0.031149f, -0.010488f, -0.006338f, 0.024612f, -0.013372f, -0.049218f, -0.032597f, 0.050905f, 0.051462f, -0.049551f, -0.041586f, 0.061049f, 0.071874f, -0.028418f, -0.007618f, 0.051644f, 0.001666f, 0.026344f, 0.037490f, -0.088031f, -0.026320f, -0.006411f, 0.084423f, 0.007320f, -0.006455f, -0.083910f, 0.016149f, 0.032317f, 0.021072f, 0.002503f, 0.022045f, 0.008165f, 0.011180f, 0.105921f, -0.003673f, 0.005112f, 0.062238f, -0.038004f, 0.041221f, 0.007309f, 0.031009f, 0.020002f, -0.048663f, -0.016404f, 0.057018f, 0.037527f, 0.021605f, -0.014106f, 0.019683f, 0.009536f, -0.000404f, 0.007141f, 0.014243f, -0.007469f, 0.024646f, -0.016951f, -0.004796f, 0.025341f, 0.014896f, 0.004749f, -0.054516f, 0.004382f, 0.026383f, -0.020818f, 0.009167f, -0.048572f, -0.030849f, 0.033295f, 0.016058f, 0.027295f, 0.023869f, -0.019631f, -0.053032f, -0.015154f, 0.017708f, 0.045430f, 0.027558f, -0.007281f, -0.010460f, -0.016558f, 0.037433f, -0.001151f, -0.007909f, + -0.015847f, 0.019691f, 0.008009f, -0.008547f, -0.038717f, -0.024553f, 0.023837f, 0.023865f, 0.016848f, -0.026687f, -0.037371f, 0.018218f, 0.048443f, 0.022407f, 0.002977f, -0.024840f, -0.006251f, 0.011007f, -0.000929f, 0.000532f, 0.002438f, -0.006451f, -0.011575f, 0.003653f, 0.012376f, 0.003478f, 0.001841f, 0.005732f, 0.001521f, 0.001330f, 0.002253f, 0.006039f, 0.000675f, -0.000534f, 0.004651f, 0.061629f, -0.104142f, -0.007097f, -0.088108f, -0.081625f, 0.020605f, 0.017350f, 0.015026f, 0.002176f, 0.077805f, 0.044440f, 0.100151f, 0.109698f, -0.012015f, -0.053737f, 0.011478f, -0.014481f, -0.009984f, 0.023896f, 0.010632f, -0.008622f, -0.050417f, -0.054992f, 0.059787f, 0.027794f, -0.006790f, 0.009334f, 0.009726f, 0.005669f, 0.011012f, -0.005468f, -0.014314f, -0.081363f, 0.001782f, 0.046979f, -0.013734f, -0.062675f, -0.020635f, 0.051774f, -0.095757f, -0.032757f, 0.060516f, 0.036806f, 0.072271f, -0.001924f, 0.005251f, -0.066499f, -0.067337f, -0.084633f, 0.071374f, 0.101270f, -0.133184f, -0.066190f, -0.006994f, 0.067792f, -0.052854f, -0.008443f, 0.122087f, 0.049842f, 0.030948f, 0.080999f, + 0.059028f, 0.088905f, -0.032082f, 0.088399f, -0.013475f, -0.069029f, -0.101816f, -0.023687f, 0.038943f, -0.080448f, -0.015834f, 0.017537f, -0.017067f, -0.028209f, 0.017149f, 0.015756f, -0.055508f, 0.041513f, 0.020162f, 0.060243f, -0.014514f, -0.058646f, 0.073316f, 0.015030f, -0.066953f, 0.000573f, -0.015626f, 0.028081f, -0.029680f, -0.030182f, -0.015661f, -0.002902f, -0.001038f, -0.022825f, -0.027970f, 0.021887f, -0.029181f, -0.000020f, -0.028842f, 0.016052f, 0.027259f, 0.004548f, 0.040789f, 0.028300f, -0.041237f, -0.015075f, -0.000060f, -0.036772f, 0.006124f, -0.005999f, 0.014637f, -0.009483f, 0.012895f, 0.036059f, 0.000026f, 0.007201f, -0.025163f, 0.038780f, 0.024409f, -0.026911f, -0.008065f, 0.027762f, 0.025737f, -0.003481f, -0.039652f, -0.004807f, -0.077039f, 0.059743f, -0.004824f, 0.018422f, 0.023260f, 0.022529f, 0.000953f, -0.025820f, 0.042436f, 0.010805f, 0.040968f, -0.008548f, -0.086217f, -0.007632f, 0.025176f, -0.028201f, -0.031425f, -0.019155f, -0.028950f, 0.035433f, -0.008831f, -0.030506f, -0.001529f, 0.032980f, -0.043815f, 0.031066f, -0.015061f, 0.016637f, -0.043159f, -0.010580f, + 0.017798f, -0.003490f, -0.003781f, 0.005592f, 0.024567f, -0.004073f, -0.003719f, -0.030070f, 0.015333f, -0.008076f, 0.005104f, 0.009627f, 0.003420f, 0.022723f, -0.032660f, -0.024872f, 0.034689f, 0.029966f, -0.041069f, 0.019958f, -0.033144f, 0.038765f, -0.032015f, 0.014786f, 0.010182f, -0.027048f, 0.060763f, 0.006148f, -0.067097f, 0.031303f, 0.008394f, -0.051813f, 0.029465f, -0.018851f, 0.031366f, -0.044882f, 0.023417f, -0.047557f, 0.022203f, 0.034312f, -0.030566f, 0.017953f, -0.032493f, 0.001427f, 0.001358f, 0.003415f, -0.021265f, 0.000709f, 0.016644f, -0.000625f, -0.029306f, 0.022601f, -0.018266f, -0.039491f, 0.017400f, -0.017366f, 0.008925f, 0.018831f, -0.013820f, -0.008204f, 0.003592f, -0.002305f, 0.012289f, -0.006002f, -0.004131f, 0.011045f, 0.013906f, 0.004900f, -0.013460f, -0.007875f, 0.013439f, 0.008208f, -0.030791f, 0.028673f, -0.003807f, -0.010284f, 0.004216f, -0.001896f, 0.006966f, 0.015536f, -0.003494f, 0.029134f, -0.008241f, -0.012192f, -0.013777f, -0.005299f, 0.003033f, -0.013279f, 0.003892f, -0.004282f, -0.005287f, 0.003824f, 0.004920f, -0.005312f, 0.000131f, -0.001244f, + -0.005761f, 0.006252f, 0.004221f, -0.006288f, 0.018271f, 0.037254f, -0.018987f, -0.208069f, -0.375351f, -0.124866f, -0.290934f, -0.287832f, 0.154824f, 0.032072f, 0.215376f, 0.486779f, 0.438626f, 0.359595f, 0.439263f, 0.268738f, 0.059980f, 0.084416f, -0.062618f, -0.326346f, -0.322506f, -0.241415f, -0.313367f, -0.214957f, -0.044578f, -0.145142f, -0.200130f, -0.086984f, -0.025095f, -0.104131f, -0.049552f, -0.002201f, -0.052072f, -0.092704f, 0.019376f, 0.079762f, -0.027152f, 0.110756f, 0.165610f, 0.003898f, 0.031917f, 0.223886f, 0.110985f, 0.001185f, 0.209898f, 0.171514f, -0.040335f, 0.081127f, 0.195973f, -0.003918f, 0.015978f, 0.276492f, 0.148553f, 0.061616f, 0.334494f, 0.368487f, 0.181235f, 0.349327f, 0.434586f, 0.113804f, 0.058290f, 0.176829f, -0.070841f, -0.210514f, -0.122800f, -0.273866f, -0.485533f, -0.484625f, -0.550011f, -0.732593f, -0.737774f, -0.708088f, -0.724375f, -0.648288f, -0.555758f, -0.445343f, -0.291859f, -0.148722f, 0.071358f, 0.319638f, 0.421728f, 0.514534f, 0.697112f, 0.612889f, 0.547912f, 0.611954f, 0.451737f, 0.210618f, 0.247761f, 0.279865f, 0.103175f, 0.134692f, + 0.280421f, 0.137298f, 0.025453f, 0.119881f, 0.107960f, -0.062617f, -0.000800f, 0.074640f, -0.112292f, -0.143249f, 0.031500f, -0.029387f, -0.047300f, 0.155767f, 0.133752f, 0.012915f, 0.121515f, 0.176477f, 0.030325f, -0.014498f, 0.009072f, -0.183017f, -0.330024f, -0.344864f, -0.439622f, -0.553237f, -0.524176f, -0.469175f, -0.427392f, -0.381368f, -0.280130f, -0.265922f, -0.290288f, -0.194747f, -0.064058f, 0.016634f, 0.070921f, 0.189049f, 0.226895f, 0.256630f, 0.460748f, 0.536986f, 0.496419f, 0.457752f, 0.364811f, 0.230637f, 0.197717f, 0.168021f, 0.102990f, 0.073302f, 0.067900f, 0.026853f, -0.006088f, -0.009228f, -0.019282f, -0.040472f, -0.049963f, -0.041191f, -0.056468f, -0.077643f, -0.074078f, -0.071966f, -0.081459f, -0.082517f, -0.070093f, -0.073771f, -0.068933f, -0.052965f, -0.051126f, -0.054110f, -0.044933f, -0.037111f, -0.035877f, -0.025313f, -0.013576f, -0.009643f, -0.009392f, -0.012899f, -0.013360f, -0.014404f, -0.014888f, -0.012094f, -0.010812f, -0.020667f, -0.032106f, -0.041018f, -0.047219f, -0.050682f, -0.041895f, -0.033450f, -0.032674f, -0.027008f, -0.016057f, -0.012021f, 0.001971f, 0.022736f, + 0.033679f, 0.037027f, 0.048534f, 0.054749f, 0.052446f, 0.058851f, 0.067198f, 0.061452f, 0.061824f, 0.069568f, 0.067815f, 0.064862f, 0.066520f, 0.056487f, 0.040233f, 0.029421f, 0.019618f, 0.005329f, -0.006525f, -0.014046f, -0.024639f, -0.035032f, -0.037513f, -0.038343f, -0.040702f, -0.037578f, -0.036277f, -0.039767f, -0.038639f, -0.036482f, -0.034055f, -0.030026f, -0.025974f, -0.021330f, -0.016894f, -0.013094f, -0.007651f, -0.003968f, -0.001825f, 0.000549f, 0.002646f, 0.003161f, 0.004014f, 0.004906f, 0.005357f, 0.005426f, 0.005701f, 0.005725f, 0.005435f, 0.005114f, 0.005026f, 0.004931f, 0.004839f} + }, + { + {-0.015802f, 0.001738f, 0.010386f, 0.003546f, 0.006765f, -0.009889f, -0.005424f, 0.000440f, -0.001760f, 0.002642f, 0.008223f, -0.019803f, -0.000149f, 0.006503f, 0.003898f, 0.005993f, -0.005743f, -0.008006f, 0.008641f, -0.000150f, 0.002400f, 0.005390f, 0.007147f, 0.002637f, 0.001481f, 0.006437f, -0.000965f, -0.002065f, -0.005579f, 0.002995f, -0.001581f, -0.000908f, -0.002905f, 0.003700f, 0.009403f, 0.000038f, -0.001973f, 0.004432f, -0.006042f, -0.009015f, -0.005000f, -0.001827f, -0.005865f, 0.000527f, -0.001370f, 0.003787f, -0.003667f, 0.001053f, -0.007335f, -0.000702f, -0.006036f, -0.000285f, -0.002775f, -0.002373f, 0.003043f, -0.003468f, -0.000374f, 0.004956f, -0.002625f, 0.005910f, 0.007135f, 0.000525f, 0.009651f, -0.004942f, -0.000353f, 0.004632f, -0.001697f, 0.003128f, 0.004373f, 0.002383f, -0.005113f, 0.002012f, 0.002304f, 0.001646f, 0.000285f, -0.004245f, 0.005619f, -0.001513f, 0.002671f, -0.000918f, -0.001197f, 0.000367f, -0.005903f, -0.000473f, -0.004593f, -0.002116f, -0.000230f, -0.000783f, -0.000186f, -0.000441f, -0.002484f, 0.002935f, 0.000310f, 0.000833f, 0.000173f, 0.001646f, + -0.001028f, 0.002077f, -0.000185f, 0.000895f, -0.000371f, -0.000879f, 0.001127f, 0.000132f, -0.000380f, -0.000006f, 0.001604f, 0.000372f, -0.000323f, 0.001033f, 0.000493f, -0.000189f, 0.026367f, -0.007320f, 0.002632f, -0.005630f, -0.000368f, -0.002296f, 0.003126f, 0.002136f, 0.009107f, 0.002863f, 0.001676f, 0.003582f, -0.002079f, -0.018059f, -0.017273f, -0.005336f, 0.002422f, 0.005410f, -0.004308f, 0.001082f, -0.005548f, -0.001924f, 0.000384f, 0.003168f, -0.007607f, -0.008302f, -0.002382f, -0.000447f, 0.004625f, 0.001577f, -0.001787f, -0.005969f, 0.001167f, -0.003249f, 0.000268f, 0.004328f, -0.006048f, 0.003039f, 0.005557f, -0.004178f, -0.011184f, -0.002858f, 0.004197f, -0.000585f, 0.003426f, -0.000465f, 0.002979f, -0.000438f, 0.003264f, 0.000703f, -0.010432f, 0.002159f, 0.004403f, -0.001577f, 0.003015f, 0.000581f, -0.000514f, -0.001999f, 0.000202f, -0.006115f, -0.000457f, -0.001615f, -0.007734f, -0.001233f, -0.000150f, 0.007042f, -0.006783f, 0.011527f, 0.013402f, 0.010559f, -0.004442f, -0.002037f, -0.002320f, 0.005164f, -0.001830f, -0.002784f, 0.003272f, -0.007447f, -0.006752f, 0.000926f, + 0.006174f, -0.000101f, -0.002977f, -0.006650f, -0.003878f, -0.005049f, -0.002608f, -0.004652f, 0.001874f, -0.002750f, -0.000656f, -0.002890f, -0.001460f, 0.000255f, 0.001687f, 0.000225f, 0.001733f, -0.001005f, 0.000229f, 0.001381f, 0.000784f, 0.001109f, 0.001140f, 0.000697f, -0.001139f, 0.001385f, -0.024788f, -0.000160f, -0.003823f, 0.001713f, -0.000858f, -0.012831f, -0.002458f, -0.002706f, 0.004007f, 0.006241f, -0.008597f, 0.006867f, -0.002194f, 0.004733f, 0.004741f, -0.002578f, 0.010312f, 0.000633f, 0.000448f, -0.001788f, 0.001782f, -0.002558f, 0.001893f, -0.002874f, 0.000372f, -0.006737f, 0.000711f, 0.007441f, -0.000015f, 0.003139f, 0.007814f, -0.007691f, -0.008131f, 0.003396f, -0.003704f, 0.006274f, -0.006356f, -0.001903f, -0.013269f, -0.010204f, -0.008876f, 0.003876f, 0.001118f, 0.004722f, -0.004838f, -0.003415f, -0.001027f, 0.008327f, -0.009226f, 0.003812f, 0.001576f, 0.000698f, 0.004634f, -0.003196f, -0.004246f, -0.005521f, 0.003349f, 0.001815f, -0.008172f, -0.008953f, -0.010466f, -0.000287f, -0.002278f, 0.003416f, -0.000513f, -0.001952f, 0.000937f, 0.001422f, 0.004625f, -0.012447f, + 0.001500f, 0.007119f, 0.010489f, 0.010837f, 0.008893f, -0.001554f, -0.006638f, 0.009717f, 0.002913f, 0.001904f, -0.004890f, 0.002824f, 0.001952f, 0.000320f, -0.001252f, -0.002843f, -0.000477f, 0.003341f, -0.002617f, -0.004213f, -0.001789f, -0.001798f, 0.000657f, -0.000328f, -0.001091f, 0.002918f, 0.000170f, 0.003719f, -0.000405f, 0.001091f, 0.002407f, 0.002349f, 0.001744f, 0.001341f, -0.001538f, -0.001601f, -0.000597f, 0.001494f, -0.000354f, 0.001460f, -0.001075f, 0.002532f, 0.002025f, -0.002144f, 0.000057f, 0.000206f, -0.003632f, 0.002722f, -0.014674f, 0.008792f, -0.007870f, 0.010515f, 0.013750f, 0.008500f, -0.000348f, 0.003945f, 0.000755f, 0.011228f, -0.006425f, -0.006449f, 0.003080f, -0.001931f, 0.004485f, 0.008598f, -0.012754f, 0.003804f, 0.011082f, 0.005128f, -0.001011f, -0.000283f, 0.001171f, -0.005432f, -0.000279f, -0.005142f, -0.007105f, -0.001993f, 0.010487f, -0.004199f, 0.004766f, -0.003893f, -0.006726f, 0.012607f, -0.011355f, 0.008402f, 0.009195f, 0.001671f, 0.005755f, -0.008452f, -0.002464f, -0.003461f, -0.002813f, 0.005778f, 0.001599f, -0.009075f, 0.001242f, -0.001048f, + 0.001479f, -0.002106f, 0.002994f, 0.002885f, 0.010451f, -0.011341f, 0.005162f, 0.004053f, -0.001336f, 0.004025f, 0.000965f, 0.006371f, 0.005924f, 0.003702f, -0.003819f, 0.005038f, 0.009012f, -0.000421f, 0.005191f, -0.004095f, 0.010723f, 0.011104f, 0.012176f, -0.003753f, -0.008902f, 0.002613f, -0.001432f, 0.004233f, 0.002969f, -0.000237f, -0.000881f, -0.012608f, -0.003474f, -0.003070f, -0.001209f, -0.002736f, -0.003954f, 0.004076f, 0.001407f, 0.001158f, 0.004771f, -0.000486f, 0.004826f, 0.003004f, 0.001405f, -0.000897f, 0.000638f, -0.001296f, -0.002355f, 0.001308f, 0.000143f, 0.002262f, -0.000975f, 0.000401f, -0.000402f, -0.001841f, 0.002515f, -0.000294f, -0.002607f, 0.000776f, 0.001989f, 0.000071f, -0.003323f, 0.000577f, -0.001669f, 0.004043f, 0.002854f, 0.002896f, -0.000595f, 0.000763f, 0.002167f, 0.000057f, 0.000993f, 0.001979f, 0.000990f, 0.020285f, -0.001885f, -0.006361f, 0.019292f, -0.007647f, 0.008654f, -0.004659f, -0.018475f, 0.003279f, -0.005329f, 0.000573f, 0.022103f, -0.008576f, -0.010493f, 0.000842f, 0.011611f, -0.018717f, -0.006962f, 0.014034f, -0.004952f, 0.004533f, + 0.006621f, -0.005010f, 0.006024f, -0.003916f, -0.006498f, 0.001305f, -0.001842f, -0.002273f, -0.002415f, 0.007827f, -0.006286f, 0.015240f, 0.003783f, 0.000334f, -0.008753f, -0.002585f, 0.009300f, -0.010682f, 0.002260f, 0.003713f, -0.001684f, -0.014896f, 0.010182f, 0.002724f, 0.002493f, 0.001336f, -0.002070f, 0.007709f, -0.004583f, 0.010536f, 0.005973f, -0.004072f, -0.018184f, 0.008103f, 0.004859f, -0.000431f, -0.005161f, 0.004410f, 0.011714f, 0.011935f, -0.001320f, 0.007071f, -0.010726f, 0.007810f, -0.001911f, -0.003670f, 0.004621f, 0.009243f, -0.006486f, 0.009151f, 0.001620f, -0.003826f, -0.003236f, 0.007473f, -0.006245f, 0.017703f, -0.009108f, 0.007349f, -0.006125f, 0.001624f, -0.005475f, 0.007107f, -0.006356f, 0.000354f, 0.004012f, -0.001185f, 0.000755f, -0.005418f, -0.001879f, -0.000708f, 0.000012f, 0.001535f, -0.002392f, 0.003114f, -0.000324f, -0.002091f, 0.003106f, -0.006217f, -0.006341f, -0.003560f, 0.000089f, -0.000568f, -0.001283f, 0.000234f, -0.004330f, 0.005334f, 0.000324f, -0.000292f, 0.003684f, -0.002979f, -0.000630f, 0.004229f, 0.001777f, 0.001523f, 0.006542f, 0.005844f, + 0.018883f, 0.002334f, -0.004992f, -0.024558f, 0.007358f, 0.013647f, 0.008098f, 0.005225f, -0.002232f, 0.006854f, 0.026351f, -0.003408f, 0.012086f, 0.001016f, 0.006687f, 0.002429f, 0.000318f, 0.005134f, -0.002386f, -0.011518f, -0.003333f, -0.008611f, -0.002356f, -0.012070f, 0.004124f, 0.000162f, 0.013755f, 0.002541f, -0.006635f, 0.004413f, -0.002134f, -0.003590f, 0.008760f, 0.003015f, 0.006508f, 0.003706f, -0.004010f, -0.015714f, 0.000804f, 0.008844f, -0.000772f, -0.003164f, 0.003898f, -0.008390f, -0.003643f, -0.014651f, -0.018071f, 0.009102f, 0.010186f, 0.007892f, -0.002684f, -0.003124f, -0.000014f, -0.000483f, 0.005140f, -0.001093f, 0.005644f, 0.005011f, -0.000318f, 0.005171f, -0.005122f, 0.001264f, -0.002770f, 0.002997f, 0.003751f, 0.016657f, -0.000093f, 0.013599f, -0.005311f, -0.014341f, -0.001421f, -0.002087f, -0.005520f, 0.011119f, -0.001034f, 0.004499f, 0.000922f, -0.008226f, -0.009814f, -0.003584f, -0.002172f, 0.000923f, 0.009842f, 0.003116f, 0.000948f, 0.004059f, 0.006565f, -0.002974f, 0.004926f, -0.000746f, 0.004179f, 0.002542f, 0.000981f, 0.005798f, -0.000739f, 0.003326f, + 0.001894f, 0.001646f, -0.001177f, -0.001723f, -0.003561f, -0.001728f, 0.003408f, 0.005229f, -0.001415f, 0.000316f, -0.003109f, -0.000591f, 0.000134f, -0.003160f, 0.002069f, -0.005811f, 0.000148f, -0.000438f, -0.000085f, 0.003469f, 0.003725f, -0.000575f, 0.008774f, -0.021633f, -0.000713f, 0.022017f, 0.030281f, -0.012595f, 0.003401f, 0.004793f, -0.010520f, -0.006156f, 0.001192f, -0.008796f, -0.009143f, 0.021175f, 0.002968f, -0.014088f, -0.002237f, -0.009207f, -0.005223f, 0.013756f, -0.004328f, -0.006149f, 0.012522f, 0.007692f, 0.012653f, -0.005413f, 0.002614f, 0.012295f, 0.000557f, -0.007457f, 0.003394f, -0.001123f, 0.001555f, -0.015679f, -0.010636f, 0.004616f, -0.001095f, 0.003663f, -0.014372f, 0.006696f, 0.005280f, 0.003303f, -0.025346f, -0.014915f, -0.006411f, -0.003237f, 0.003624f, -0.011160f, -0.007401f, 0.002415f, 0.019459f, 0.012737f, 0.006905f, -0.003519f, -0.002114f, -0.007428f, 0.005635f, -0.002209f, -0.014363f, -0.011069f, -0.001310f, -0.000302f, 0.020388f, 0.011203f, -0.010068f, -0.011352f, 0.014103f, 0.002734f, -0.008472f, 0.000004f, 0.012659f, 0.004712f, 0.000397f, -0.016532f, + 0.018139f, -0.006459f, 0.012101f, 0.015759f, 0.016694f, 0.001394f, -0.006131f, -0.005086f, 0.008589f, 0.009734f, -0.008563f, 0.006819f, 0.009334f, 0.006494f, -0.002818f, -0.002293f, 0.001343f, 0.005569f, 0.004656f, -0.005004f, -0.007595f, -0.007259f, 0.003568f, -0.003531f, -0.002238f, -0.005069f, -0.000967f, -0.003661f, 0.001865f, -0.003039f, 0.002220f, 0.001642f, -0.000555f, -0.000092f, 0.004109f, -0.003078f, -0.006047f, -0.001198f, 0.005608f, -0.003467f, -0.002982f, -0.003288f, -0.002247f, -0.000506f, -0.000095f, -0.003867f, -0.000085f, -0.002847f, -0.001303f, 0.000922f, 0.003761f, -0.002571f, -0.000081f, -0.000916f, -0.001631f, 0.003339f, 0.004070f, -0.005957f, 0.008885f, -0.011556f, 0.013007f, -0.001291f, -0.003630f, 0.006874f, -0.013307f, 0.004423f, 0.007116f, 0.001356f, 0.004947f, 0.006147f, -0.003660f, 0.014500f, -0.006950f, -0.024994f, -0.014898f, -0.003368f, 0.000895f, -0.005368f, -0.010720f, -0.011729f, -0.007977f, 0.024368f, -0.006868f, -0.002023f, 0.003453f, -0.005177f, 0.002843f, 0.019974f, -0.009732f, 0.009432f, -0.006335f, -0.012994f, 0.011483f, 0.008255f, 0.005258f, 0.017891f, + 0.000331f, 0.008377f, -0.000858f, 0.002054f, -0.000775f, -0.006001f, 0.003893f, -0.001462f, 0.012958f, 0.002511f, -0.009045f, -0.002402f, -0.002658f, -0.000708f, -0.014699f, 0.005789f, -0.014492f, 0.003415f, 0.019343f, -0.012749f, -0.024330f, 0.005541f, 0.003299f, 0.011037f, -0.004983f, -0.000316f, 0.011292f, -0.007095f, 0.005503f, 0.008283f, 0.002288f, -0.005180f, 0.011150f, 0.002330f, 0.014337f, 0.002969f, -0.008999f, -0.008559f, 0.009297f, 0.015646f, 0.005476f, -0.000233f, -0.012997f, -0.002702f, -0.004217f, 0.009248f, 0.002310f, -0.017765f, 0.002732f, 0.004609f, 0.001248f, 0.001709f, 0.006825f, -0.003189f, 0.002854f, -0.004905f, 0.002982f, 0.002685f, 0.002176f, 0.003544f, 0.001541f, 0.002319f, 0.002153f, -0.004163f, 0.001296f, -0.001320f, -0.000679f, 0.003935f, 0.001648f, 0.002162f, 0.004485f, -0.001442f, -0.014219f, 0.001311f, -0.000978f, 0.000987f, -0.001314f, -0.000927f, 0.003937f, 0.002552f, -0.002307f, -0.002736f, -0.019322f, 0.044613f, -0.010411f, 0.020045f, 0.001892f, 0.008369f, 0.006060f, -0.000116f, -0.024994f, 0.021276f, -0.031161f, 0.010085f, 0.007485f, 0.028091f, + -0.013162f, 0.012655f, -0.019822f, 0.012944f, -0.006408f, -0.021363f, -0.010226f, 0.005019f, 0.005477f, 0.007791f, 0.003977f, 0.011208f, 0.007355f, 0.016995f, -0.005267f, -0.013944f, -0.012547f, 0.004875f, -0.000146f, -0.006898f, 0.011388f, 0.004951f, -0.002330f, 0.006769f, 0.014096f, -0.001319f, 0.003651f, -0.002127f, 0.006972f, 0.004078f, -0.018037f, -0.007871f, -0.023634f, -0.005467f, -0.004010f, -0.000573f, 0.011352f, 0.010073f, 0.001508f, -0.006556f, -0.000125f, -0.003585f, -0.005609f, 0.003126f, 0.033264f, 0.002960f, -0.000723f, 0.010539f, -0.000791f, 0.012080f, -0.005194f, 0.000119f, -0.007891f, 0.033328f, 0.007875f, -0.013758f, -0.015689f, -0.010532f, 0.001316f, -0.000747f, -0.021329f, 0.001157f, 0.004411f, 0.001429f, 0.023295f, -0.006075f, 0.003435f, -0.014469f, -0.004723f, -0.039262f, -0.006775f, 0.002009f, 0.001509f, -0.015101f, 0.003954f, -0.007276f, 0.004932f, 0.002258f, -0.007122f, -0.000903f, 0.005169f, 0.007943f, 0.014827f, 0.003879f, -0.005378f, -0.005094f, -0.011905f, -0.004654f, 0.001134f, 0.001968f, -0.006839f, -0.002643f, 0.006478f, 0.002273f, -0.001762f, -0.001665f, + -0.005060f, -0.004766f, -0.002281f, 0.001339f, -0.009902f, -0.007041f, 0.001883f, 0.003953f, 0.000068f, -0.002578f, 0.002491f, 0.008119f, 0.001393f, 0.000636f, -0.000653f, -0.003582f, 0.000281f, -0.011633f, 0.004948f, 0.002690f, 0.023343f, 0.002026f, 0.019434f, 0.011799f, 0.019058f, 0.006396f, -0.019269f, 0.018916f, -0.012328f, 0.032720f, -0.021132f, -0.006244f, -0.029233f, -0.006165f, -0.003094f, 0.013013f, -0.013594f, 0.019090f, 0.015395f, -0.009256f, 0.001092f, 0.021826f, 0.030716f, -0.009776f, 0.000782f, -0.004005f, 0.009632f, 0.000150f, -0.003586f, 0.004457f, 0.008422f, -0.014634f, 0.011042f, 0.002101f, 0.012659f, 0.004832f, 0.001936f, -0.024994f, -0.004035f, 0.029004f, -0.003468f, 0.009707f, 0.022237f, 0.006417f, -0.001725f, -0.007761f, -0.010240f, -0.006134f, 0.001020f, -0.009534f, -0.005718f, 0.016812f, 0.015546f, 0.004878f, 0.025816f, 0.017150f, -0.005403f, -0.002575f, 0.003538f, 0.005983f, -0.007886f, -0.020577f, 0.026847f, 0.011818f, -0.005505f, 0.024566f, 0.025693f, 0.028628f, 0.012421f, 0.004318f, -0.010377f, 0.000723f, -0.014523f, -0.011654f, -0.007412f, -0.028717f, + 0.011537f, -0.003641f, 0.024497f, -0.005811f, -0.019242f, -0.003625f, 0.001849f, -0.002856f, -0.025668f, 0.004105f, 0.006851f, 0.011690f, 0.012377f, -0.008672f, 0.003984f, -0.005919f, -0.016692f, 0.003287f, 0.006466f, -0.001277f, -0.004935f, -0.012592f, 0.013214f, 0.007471f, -0.011777f, -0.013359f, -0.007486f, 0.007682f, -0.001360f, -0.003787f, 0.003575f, -0.005929f, 0.003707f, -0.001512f, 0.002287f, 0.005795f, -0.008517f, -0.003954f, 0.003822f, -0.001795f, 0.000159f, 0.017140f, 0.005612f, 0.001167f, -0.001154f, 0.004093f, -0.005685f, -0.003208f, -0.000544f, 0.005633f, -0.003537f, 0.025648f, 0.001586f, 0.004754f, -0.003764f, 0.002197f, -0.003206f, -0.038655f, 0.004563f, -0.000287f, -0.006893f, -0.002800f, -0.018971f, 0.021938f, 0.022476f, 0.025145f, -0.040587f, 0.013220f, 0.008474f, 0.001115f, 0.040162f, 0.016560f, -0.019881f, -0.002225f, 0.039650f, 0.004777f, 0.007126f, 0.008185f, -0.011570f, 0.006720f, 0.008222f, 0.024693f, 0.012537f, -0.018684f, -0.030862f, 0.011815f, 0.007390f, -0.015466f, -0.002873f, 0.001627f, -0.018954f, 0.002291f, 0.023265f, 0.010012f, 0.013065f, 0.018982f, + 0.030590f, 0.003019f, 0.026949f, 0.005448f, -0.010625f, -0.001419f, -0.015864f, -0.008194f, 0.006715f, 0.009247f, 0.007021f, 0.013662f, -0.019088f, -0.008506f, 0.034327f, -0.002390f, -0.007319f, -0.019007f, 0.016303f, 0.014880f, 0.005147f, 0.006308f, -0.000223f, 0.009606f, -0.014863f, 0.024636f, -0.012294f, -0.014449f, -0.011864f, -0.008021f, 0.033227f, 0.009108f, 0.006950f, -0.035954f, -0.019821f, -0.029528f, 0.002196f, -0.003019f, -0.002908f, -0.028003f, -0.039093f, -0.000972f, 0.017605f, -0.009508f, 0.005034f, -0.002421f, -0.002658f, 0.009972f, -0.013605f, -0.005685f, -0.006194f, 0.012014f, 0.001987f, -0.008574f, -0.000123f, -0.001258f, -0.000207f, -0.003990f, -0.008191f, 0.002192f, 0.013094f, -0.006219f, -0.004288f, -0.008235f, -0.003808f, -0.005721f, -0.002875f, 0.005885f, -0.001923f, 0.009215f, -0.002982f, -0.001797f, -0.005186f, -0.003679f, 0.013762f, -0.001250f, -0.000922f, -0.006336f, -0.001042f, 0.008308f, 0.002229f, -0.009825f, 0.002263f, 0.000952f, 0.002909f, 0.036219f, 0.042601f, -0.010864f, 0.011992f, -0.003068f, -0.012415f, 0.002502f, -0.028485f, -0.017576f, -0.001225f, -0.005698f, + 0.057120f, -0.025646f, 0.007339f, -0.036229f, -0.005299f, 0.022188f, -0.009275f, -0.020143f, -0.021155f, -0.007698f, 0.008764f, 0.011332f, -0.001390f, -0.001763f, -0.023783f, 0.005671f, 0.016697f, 0.008474f, 0.010248f, 0.003107f, 0.003756f, -0.013842f, -0.004523f, 0.009382f, 0.003449f, 0.000038f, 0.001082f, -0.016708f, 0.007501f, -0.017586f, -0.002832f, -0.000404f, 0.005163f, -0.019534f, -0.001989f, 0.009666f, 0.014092f, -0.022267f, -0.011682f, 0.039705f, -0.015205f, -0.031196f, 0.026295f, -0.025371f, -0.007989f, -0.011194f, -0.004539f, -0.019466f, -0.013515f, -0.004046f, -0.019641f, -0.028019f, 0.045294f, 0.025031f, 0.020201f, 0.013859f, -0.017559f, -0.006820f, -0.011836f, 0.012774f, -0.021282f, 0.015151f, -0.011346f, 0.006546f, 0.015193f, 0.009945f, 0.003101f, -0.028858f, 0.028358f, -0.034485f, -0.009038f, -0.033431f, -0.013571f, 0.022098f, -0.001259f, 0.012560f, 0.025361f, 0.008108f, -0.002551f, 0.004987f, -0.008829f, 0.000542f, -0.002677f, -0.009533f, 0.011468f, -0.003934f, -0.005278f, 0.013135f, 0.006963f, -0.003429f, 0.000919f, 0.000645f, 0.002108f, -0.005859f, 0.005728f, 0.001835f, + 0.003100f, -0.007021f, 0.004847f, -0.003241f, 0.012439f, -0.005522f, 0.008800f, -0.002622f, -0.004305f, 0.013187f, -0.008773f, -0.003797f, -0.007846f, 0.005332f, 0.013041f, 0.006029f, -0.003685f, 0.006179f, -0.005222f, 0.006311f, 0.009086f, -0.009804f, -0.023649f, -0.001513f, 0.060113f, -0.026521f, 0.026301f, -0.053191f, 0.015002f, -0.033713f, -0.006076f, 0.019232f, -0.001394f, 0.012423f, 0.020156f, 0.016111f, -0.023023f, 0.017657f, 0.003893f, 0.013117f, -0.004707f, 0.018097f, 0.016852f, -0.003398f, 0.003785f, 0.010972f, 0.012417f, -0.016935f, -0.005576f, -0.024810f, -0.002777f, 0.022307f, 0.000920f, -0.010268f, 0.002605f, 0.008387f, 0.001877f, -0.008897f, -0.017520f, 0.004756f, -0.011737f, 0.011757f, -0.011068f, 0.042765f, -0.003654f, -0.022939f, -0.025775f, 0.006091f, -0.013998f, 0.013600f, -0.028945f, -0.022723f, -0.029410f, 0.007046f, -0.024785f, -0.005794f, -0.035718f, 0.025975f, 0.005630f, 0.017541f, 0.011040f, -0.038702f, 0.003324f, -0.003282f, -0.014230f, -0.021544f, -0.005609f, -0.018318f, -0.023012f, -0.012689f, 0.011162f, 0.015580f, 0.022729f, -0.012719f, 0.003471f, 0.009890f, + -0.032338f, 0.015191f, -0.022047f, -0.001851f, 0.018779f, 0.008033f, 0.007794f, 0.003613f, 0.038217f, -0.021511f, -0.007622f, -0.008072f, 0.010282f, -0.032129f, 0.002912f, -0.002441f, 0.000030f, 0.021160f, 0.012531f, 0.010557f, 0.004100f, -0.007694f, 0.001628f, -0.003726f, 0.015606f, -0.005706f, -0.001620f, -0.008419f, 0.017652f, 0.007114f, -0.005722f, 0.004928f, -0.014976f, 0.010730f, 0.005731f, 0.008480f, 0.001692f, -0.002884f, 0.010061f, 0.017815f, 0.006363f, -0.008391f, -0.011346f, -0.004602f, 0.004831f, -0.011749f, -0.002357f, -0.017961f, -0.012864f, -0.006960f, 0.000362f, -0.009794f, 0.007667f, -0.007677f, 0.018181f, -0.013842f, 0.000093f, 0.000113f, -0.049970f, -0.014517f, 0.055882f, 0.049444f, 0.027737f, -0.024049f, 0.024437f, 0.036967f, -0.024615f, 0.032651f, -0.026489f, 0.030145f, 0.007024f, -0.002091f, 0.009855f, -0.000713f, 0.015797f, -0.023932f, -0.006892f, -0.010829f, 0.012004f, -0.022690f, -0.020445f, 0.031772f, -0.003180f, -0.006689f, 0.002893f, -0.030813f, -0.000800f, 0.049431f, 0.026866f, 0.005578f, -0.000589f, 0.010496f, 0.046696f, 0.019935f, 0.000593f, 0.007846f, + -0.013079f, -0.005604f, -0.011277f, 0.020073f, -0.010555f, 0.013395f, 0.002407f, 0.023987f, -0.028598f, -0.000635f, -0.001844f, 0.000698f, -0.008159f, 0.013374f, 0.021444f, -0.005119f, -0.006275f, 0.021745f, 0.002362f, 0.002669f, 0.049209f, 0.007732f, 0.000533f, -0.022641f, 0.009844f, -0.016848f, 0.022712f, -0.026456f, -0.023556f, 0.003559f, -0.023208f, -0.024686f, -0.037797f, 0.010062f, -0.012712f, 0.019403f, -0.006528f, 0.010938f, -0.055143f, 0.011183f, -0.018749f, -0.033385f, 0.017231f, 0.023009f, 0.011914f, 0.007105f, 0.004036f, 0.009640f, 0.014558f, -0.007140f, -0.008664f, -0.010147f, -0.000799f, -0.011126f, 0.006804f, 0.001439f, -0.016034f, -0.010999f, 0.008969f, 0.005408f, 0.000578f, 0.016234f, -0.005825f, -0.001715f, -0.013083f, -0.002758f, -0.000052f, 0.006721f, 0.004124f, -0.010889f, -0.006792f, -0.003020f, -0.013252f, -0.002489f, -0.012454f, 0.004946f, 0.003203f, 0.014622f, 0.009841f, -0.001043f, -0.006058f, -0.000012f, -0.000039f, -0.004180f, -0.001042f, -0.015291f, -0.002859f, 0.006258f, 0.006650f, 0.001934f, -0.002718f, 0.014729f, 0.002314f, 0.041847f, -0.063742f, 0.027114f, + 0.028246f, -0.045234f, -0.004389f, -0.038720f, -0.012615f, -0.034732f, -0.015582f, 0.040301f, -0.013462f, -0.002663f, -0.027911f, -0.005193f, 0.006704f, -0.041459f, -0.001391f, 0.026929f, -0.051294f, 0.002164f, -0.034952f, -0.018721f, 0.000934f, 0.004068f, -0.023075f, -0.018442f, -0.019301f, -0.005353f, -0.016565f, -0.000804f, 0.009160f, -0.004788f, 0.013287f, -0.024857f, -0.015814f, 0.033860f, -0.015500f, 0.018467f, -0.019774f, 0.019203f, 0.017521f, 0.003240f, 0.004825f, 0.017909f, 0.001038f, 0.025401f, 0.031983f, -0.005703f, 0.004906f, 0.047510f, 0.003003f, 0.024557f, -0.001509f, -0.018500f, -0.037035f, 0.006549f, 0.026049f, -0.040782f, 0.000733f, -0.023857f, -0.012501f, -0.052968f, 0.023208f, 0.035451f, -0.009001f, 0.017239f, -0.008442f, 0.038530f, 0.042490f, -0.003095f, -0.041712f, -0.040399f, 0.058236f, -0.044909f, 0.017115f, 0.007013f, 0.006208f, 0.043748f, -0.018322f, 0.071080f, -0.001009f, -0.015735f, -0.018273f, -0.012451f, 0.011487f, -0.004120f, -0.005232f, -0.000112f, 0.018445f, -0.004220f, -0.011330f, 0.015644f, -0.005359f, 0.008053f, -0.013910f, -0.008162f, 0.013542f, 0.001363f, + 0.020156f, -0.006266f, 0.008670f, -0.014379f, -0.004048f, -0.019799f, 0.004322f, 0.008547f, 0.010144f, 0.002282f, 0.010415f, 0.001325f, -0.002993f, 0.011260f, -0.016909f, 0.011639f, -0.014321f, -0.004811f, 0.008928f, -0.017421f, -0.004347f, -0.009845f, -0.029689f, -0.007636f, 0.002098f, 0.011138f, -0.014434f, -0.007233f, -0.012681f, -0.003814f, 0.003257f, 0.022765f, 0.011749f, 0.069519f, 0.078340f, -0.004609f, -0.059067f, 0.058369f, -0.064580f, 0.009124f, 0.027392f, 0.006812f, -0.006913f, -0.029773f, 0.033554f, -0.014994f, -0.012029f, -0.030315f, -0.017658f, -0.009429f, -0.037889f, -0.020807f, -0.016943f, -0.009437f, -0.006239f, 0.026345f, -0.000402f, 0.022780f, 0.000150f, -0.009784f, -0.033202f, -0.036303f, -0.009205f, -0.001278f, -0.000515f, -0.005468f, -0.013619f, -0.015651f, 0.017361f, 0.041924f, -0.022783f, 0.014479f, -0.014241f, -0.014579f, 0.016594f, -0.016155f, -0.026314f, 0.058844f, -0.006536f, 0.005473f, 0.002838f, -0.032771f, -0.007272f, -0.006816f, 0.016598f, -0.042351f, -0.018845f, 0.044959f, 0.007159f, -0.019000f, 0.024331f, 0.045697f, -0.026009f, -0.032040f, 0.016625f, -0.027145f, + 0.000373f, -0.050879f, 0.016385f, 0.043433f, -0.004508f, 0.022700f, 0.013124f, 0.007678f, 0.049640f, 0.015704f, -0.000301f, 0.028769f, -0.004244f, -0.003872f, 0.017461f, 0.018907f, -0.072190f, 0.006699f, -0.031447f, 0.025608f, -0.001268f, 0.001092f, 0.017841f, -0.005312f, -0.006983f, -0.009368f, 0.009562f, 0.003802f, -0.007152f, 0.009754f, -0.010419f, 0.001173f, -0.005580f, -0.013787f, 0.006295f, -0.006836f, 0.015478f, 0.008707f, -0.000360f, 0.000211f, 0.004175f, -0.003993f, 0.009119f, 0.004670f, 0.002779f, 0.003918f, -0.002720f, 0.003567f, -0.006343f, -0.011931f, -0.006745f, -0.002980f, 0.001551f, -0.015561f, 0.012681f, 0.008762f, 0.000520f, 0.004840f, -0.010680f, 0.014907f, 0.001675f, -0.008583f, 0.005228f, 0.006535f, -0.018968f, -0.003723f, 0.001760f, -0.001335f, 0.000136f, 0.003617f, -0.003216f, 0.002950f, -0.094753f, -0.066198f, 0.028426f, -0.027721f, -0.026090f, -0.080516f, -0.022829f, 0.017869f, 0.007276f, -0.015396f, -0.044517f, -0.000003f, 0.023441f, -0.001094f, 0.003688f, 0.024264f, 0.042644f, -0.035903f, 0.096339f, -0.024066f, -0.031210f, -0.009099f, -0.004795f, 0.001014f, + -0.037311f, 0.001446f, -0.006084f, 0.020808f, -0.012211f, 0.029210f, -0.011266f, -0.023784f, 0.010578f, 0.012383f, -0.021171f, 0.024329f, -0.072350f, 0.001159f, -0.005250f, 0.029689f, 0.035783f, -0.024920f, 0.033408f, -0.012024f, 0.009973f, -0.015118f, -0.004677f, -0.009077f, 0.026848f, -0.002943f, 0.035163f, 0.054590f, -0.046432f, -0.012575f, 0.025937f, -0.031110f, 0.019755f, -0.035420f, -0.019280f, -0.017350f, -0.020504f, -0.036172f, -0.018268f, 0.017679f, 0.014549f, 0.028735f, 0.037130f, 0.027122f, -0.043735f, 0.006090f, 0.008757f, 0.011093f, 0.009508f, 0.028862f, -0.013305f, -0.029408f, 0.017701f, -0.007255f, -0.022861f, 0.005107f, -0.039561f, -0.016065f, -0.034392f, 0.003727f, 0.021142f, -0.012202f, 0.020340f, 0.011147f, -0.000649f, -0.007069f, -0.000045f, -0.030622f, -0.011145f, 0.010828f, 0.005724f, 0.007309f, 0.002690f, 0.004000f, 0.003316f, 0.010178f, 0.003155f, -0.020413f, -0.002405f, 0.003640f, -0.001589f, 0.005891f, -0.009066f, -0.008278f, -0.019929f, 0.005733f, 0.018590f, -0.020058f, -0.013935f, 0.011019f, -0.004704f, -0.020484f, 0.014291f, -0.009749f, -0.007906f, 0.012975f, + -0.000467f, -0.003481f, -0.005938f, -0.008868f, -0.011951f, -0.012711f, -0.002945f, -0.010761f, -0.006235f, -0.005347f, 0.009443f, -0.000221f, 0.000098f, 0.014259f, -0.018865f, -0.063980f, 0.049956f, -0.082171f, 0.059370f, -0.007451f, -0.036202f, -0.030800f, -0.034428f, -0.023066f, -0.017684f, 0.002686f, 0.043807f, -0.002576f, -0.034904f, 0.039019f, 0.055040f, -0.082059f, -0.021146f, 0.006654f, -0.005855f, -0.012077f, -0.003141f, -0.010653f, -0.013723f, -0.023263f, 0.031793f, -0.009952f, -0.021998f, -0.038632f, -0.038191f, 0.039469f, 0.011102f, -0.006259f, -0.003233f, 0.000842f, -0.007606f, -0.009725f, 0.009568f, -0.033925f, 0.019971f, 0.040290f, 0.030556f, 0.019172f, 0.038790f, 0.044659f, -0.024165f, 0.010110f, -0.035249f, 0.040019f, -0.021402f, -0.005725f, 0.000852f, -0.056560f, 0.019669f, 0.047884f, 0.009109f, -0.018683f, -0.014683f, 0.062363f, -0.023748f, -0.025942f, 0.018389f, -0.062224f, -0.006265f, -0.030534f, 0.002442f, -0.060847f, 0.026801f, 0.011337f, 0.026294f, -0.099157f, -0.084483f, 0.014619f, -0.028799f, -0.019447f, -0.011280f, -0.066228f, 0.023244f, -0.038916f, -0.041976f, 0.033102f, + -0.027877f, -0.016546f, 0.015005f, -0.006436f, -0.011914f, -0.001850f, -0.002475f, 0.014540f, -0.031808f, -0.015018f, -0.030644f, 0.000601f, -0.012812f, 0.006911f, -0.003391f, -0.024624f, -0.009137f, 0.009361f, -0.000460f, 0.002309f, 0.007897f, -0.027047f, 0.004698f, -0.034411f, 0.017258f, 0.005751f, -0.024126f, 0.008512f, -0.028917f, -0.006057f, -0.009823f, 0.002687f, 0.017168f, -0.011475f, 0.017728f, -0.008412f, 0.029337f, -0.012481f, 0.018892f, -0.009488f, -0.001900f, -0.000543f, -0.002191f, 0.006058f, -0.001673f, 0.000320f, -0.001067f, -0.006071f, 0.001299f, 0.010396f, -0.001577f, -0.004066f, -0.002267f, 0.003494f, -0.002324f, -0.003549f, -0.001439f, -0.001576f, 0.002128f, -0.001591f, 0.000036f, -0.001422f, -0.002178f, -0.001338f, 0.003197f, 0.000068f, -0.003407f, -0.000011f, 0.001033f, -0.004548f, 0.004061f, 0.071937f, -0.103917f, 0.102506f, 0.028966f, -0.005097f, 0.006972f, -0.076733f, 0.013902f, 0.033740f, -0.014845f, 0.087115f, -0.026897f, 0.036806f, -0.032852f, 0.096143f, -0.005143f, -0.014698f, -0.038980f, -0.015200f, 0.012635f, -0.011375f, 0.037990f, 0.029239f, -0.012021f, 0.001128f, + -0.040063f, 0.013148f, 0.037589f, 0.038233f, -0.044945f, 0.016624f, -0.010232f, 0.040940f, -0.013184f, 0.026099f, -0.027323f, -0.021593f, -0.059438f, 0.002403f, -0.038297f, -0.055544f, 0.074986f, -0.035524f, -0.008504f, -0.016127f, -0.020156f, 0.008872f, 0.004598f, 0.025617f, -0.014580f, 0.040165f, 0.002145f, 0.074121f, 0.027268f, 0.082211f, 0.069355f, -0.008605f, 0.045771f, 0.034832f, -0.014334f, 0.041249f, 0.056320f, -0.026473f, -0.059878f, 0.031551f, 0.019597f, 0.046018f, 0.022553f, -0.006186f, -0.002436f, -0.063588f, -0.007756f, -0.019804f, -0.024409f, 0.081066f, -0.011344f, -0.002433f, 0.100676f, 0.067075f, 0.035045f, 0.044311f, 0.021676f, 0.001427f, 0.009827f, 0.058009f, -0.001178f, -0.017102f, 0.015746f, 0.048519f, 0.021613f, 0.027024f, 0.012179f, 0.033130f, -0.003772f, 0.008494f, 0.010970f, 0.022775f, 0.006343f, 0.004702f, 0.002402f, 0.001305f, 0.017665f, 0.028026f, 0.010580f, 0.037512f, 0.000867f, 0.022621f, 0.021890f, 0.042497f, -0.002630f, 0.028664f, 0.024707f, 0.004329f, 0.020529f, -0.000103f, 0.003040f, -0.008771f, 0.007325f, 0.010882f, 0.004085f, 0.005013f, + -0.000359f, -0.006541f, -0.000703f, 0.009000f, -0.007392f, 0.004323f, 0.018005f, -0.005641f, 0.035140f, 0.002781f, 0.007851f, -0.003814f, -0.016729f, 0.009028f, -0.006617f, 0.010377f, 0.031562f, -0.071732f, 0.137032f, -0.018891f, -0.015457f, -0.009048f, 0.099683f, -0.061631f, 0.049938f, -0.067469f, 0.063486f, 0.012519f, -0.012509f, 0.001251f, 0.037175f, -0.016405f, 0.034675f, -0.016558f, -0.000352f, 0.069704f, 0.021487f, -0.018418f, -0.000281f, 0.017034f, 0.013766f, -0.068531f, 0.018161f, -0.025296f, -0.006159f, -0.036386f, 0.034700f, 0.032414f, 0.005172f, 0.015063f, 0.058605f, -0.020012f, -0.093161f, 0.021695f, 0.061103f, -0.024269f, -0.061224f, 0.015661f, 0.043788f, 0.014159f, 0.000107f, -0.074068f, -0.035147f, -0.044135f, 0.040879f, 0.015882f, 0.042117f, -0.089077f, 0.005737f, -0.016995f, -0.097598f, -0.026019f, 0.014455f, 0.043538f, 0.061614f, -0.033454f, 0.115012f, 0.021649f, 0.002091f, -0.024425f, -0.046281f, -0.032826f, 0.021770f, -0.054005f, 0.108456f, -0.035445f, 0.004569f, 0.063341f, -0.042107f, 0.038345f, -0.041118f, -0.024414f, 0.090025f, -0.046317f, 0.059084f, 0.053531f, + 0.019894f, 0.023932f, -0.077715f, -0.010161f, -0.003936f, -0.028089f, 0.036822f, 0.032217f, 0.013589f, 0.009204f, 0.035861f, -0.009377f, 0.014112f, -0.005195f, 0.010857f, -0.016252f, 0.012861f, -0.003572f, 0.010906f, 0.007351f, 0.002585f, -0.027501f, -0.004316f, 0.002677f, -0.009298f, -0.004122f, 0.019175f, 0.009505f, 0.031469f, -0.015187f, 0.006828f, -0.052151f, -0.042699f, -0.007249f, -0.002350f, 0.029395f, 0.023179f, -0.015587f, -0.010399f, -0.041886f, 0.000199f, 0.012955f, -0.006236f, -0.001190f, 0.010126f, -0.014000f, 0.009570f, -0.031257f, 0.002131f, -0.011298f, -0.011324f, 0.018622f, -0.080556f, 0.046167f, 0.029591f, 0.046174f, -0.018257f, -0.012978f, 0.018784f, 0.000236f, 0.005443f, 0.001822f, 0.009242f, 0.002271f, -0.012553f, 0.059680f, -0.013767f, -0.040998f, 0.017515f, -0.000996f, -0.036036f, 0.012678f, 0.008505f, 0.024671f, -0.016547f, -0.027300f, 0.029580f, -0.023596f, -0.003089f, -0.006982f, 0.024307f, -0.041607f, 0.014370f, -0.025790f, 0.021267f, -0.036650f, 0.013194f, -0.012252f, 0.006465f, 0.080525f, -0.055197f, 0.010543f, 0.017851f, -0.049829f, 0.018242f, 0.023040f, + -0.036819f, -0.007655f, -0.014014f, 0.066971f, 0.005779f, -0.077367f, 0.046489f, -0.062534f, 0.011523f, 0.032433f, -0.029891f, 0.037091f, -0.044695f, -0.036937f, 0.051038f, -0.008622f, 0.021775f, -0.076237f, 0.014431f, 0.016518f, -0.003904f, -0.011736f, -0.000490f, 0.030981f, 0.001314f, -0.101402f, 0.061592f, -0.006364f, 0.023747f, -0.026621f, -0.030864f, 0.096745f, -0.002427f, -0.061843f, 0.005509f, 0.031255f, 0.007289f, -0.094032f, 0.003498f, 0.087256f, -0.015819f, -0.040342f, 0.009709f, 0.042216f, -0.005482f, 0.000156f, -0.007274f, -0.004351f, 0.006192f, -0.015255f, -0.008766f, 0.028667f, -0.012288f, -0.000773f, -0.016704f, 0.016819f, 0.025729f, -0.004577f, -0.003685f, 0.027091f, 0.009028f, -0.018598f, -0.004270f, 0.011681f, 0.007973f, -0.015796f, 0.008639f, 0.018646f, -0.015382f, 0.004017f, 0.004835f, 0.012024f, -0.028775f, 0.001860f, 0.018323f, 0.006871f, -0.019995f, 0.001161f, 0.014454f, 0.002383f, -0.014790f, -0.010070f, 0.016202f, 0.039205f, -0.012203f, -0.198398f, -0.423307f, -0.168271f, -0.318447f, -0.388075f, 0.138854f, -0.000553f, 0.142394f, 0.538658f, 0.470555f, 0.268128f, + 0.515540f, 0.287902f, 0.033416f, 0.178789f, 0.110398f, -0.193643f, -0.136570f, -0.039551f, -0.214746f, -0.259921f, -0.085872f, -0.131157f, -0.205542f, -0.050971f, -0.008443f, -0.262005f, -0.180229f, -0.026558f, -0.158883f, -0.205990f, -0.059396f, -0.100656f, -0.224008f, -0.042321f, 0.023775f, -0.125269f, -0.095298f, 0.095947f, -0.033350f, -0.134414f, 0.029253f, 0.090373f, -0.065872f, 0.055724f, 0.197802f, -0.028115f, -0.051695f, 0.195725f, 0.104895f, -0.047881f, 0.324555f, 0.440811f, 0.274714f, 0.464765f, 0.694879f, 0.534678f, 0.508895f, 0.743240f, 0.644465f, 0.474518f, 0.582054f, 0.529168f, 0.336954f, 0.298123f, 0.160860f, -0.054461f, -0.231062f, -0.414142f, -0.588667f, -0.700718f, -0.878768f, -0.938995f, -0.990182f, -1.121921f, -1.121094f, -0.847153f, -0.866839f, -0.789403f, -0.355041f, -0.274584f, -0.267005f, 0.119558f, 0.227515f, 0.005674f, 0.237084f, 0.328666f, 0.113066f, 0.157067f, 0.308308f, 0.230596f, 0.134632f, 0.217821f, 0.269543f, 0.114987f, 0.168108f, 0.334262f, 0.199134f, 0.131334f, 0.308125f, 0.231228f, 0.093851f, 0.200477f, 0.228965f, 0.030042f, 0.118605f, 0.275397f, + 0.158232f, 0.189650f, 0.387962f, 0.364968f, 0.384597f, 0.497744f, 0.501260f, 0.402188f, 0.380469f, 0.324789f, 0.198584f, 0.143325f, 0.076552f, -0.011330f, -0.077597f, -0.211394f, -0.288994f, -0.390849f, -0.520948f, -0.580180f, -0.655585f, -0.763252f, -0.726835f, -0.652822f, -0.576501f, -0.421463f, -0.276197f, -0.146358f, -0.053780f, 0.023031f, 0.048535f, 0.059312f, 0.076451f, 0.081013f, 0.068576f, 0.073246f, 0.080931f, 0.078565f, 0.088071f, 0.113809f, 0.127776f, 0.136701f, 0.152342f, 0.157104f, 0.159309f, 0.167451f, 0.154887f, 0.133191f, 0.099813f, 0.062287f, 0.039627f, 0.011153f, -0.007331f, -0.012760f, -0.019022f, -0.027166f, -0.026654f, -0.022870f, -0.012641f, 0.001513f, 0.016367f, 0.033221f, 0.039017f, 0.042384f, 0.049451f, 0.052960f, 0.052641f, 0.055243f, 0.061005f, 0.058159f, 0.052577f, 0.058617f, 0.052196f, 0.038486f, 0.047405f, 0.048927f, 0.033212f, 0.033507f, 0.029055f, 0.007902f, 0.002252f, -0.000392f, -0.022378f, -0.037020f, -0.042496f, -0.053921f, -0.065511f, -0.068008f, -0.072703f, -0.083698f, -0.085527f, -0.084631f, -0.090764f, -0.095345f, -0.091080f, -0.089181f, + -0.090831f, -0.081983f, -0.070125f, -0.063483f, -0.052002f, -0.032453f, -0.018297f, -0.006254f, 0.011146f, 0.026582f, 0.034293f, 0.041721f, 0.051656f, 0.054324f, 0.052843f, 0.054245f, 0.052521f, 0.047022f, 0.043334f, 0.039931f, 0.034641f, 0.029526f, 0.025677f, 0.020871f, 0.016023f, 0.012755f, 0.010332f, 0.007537f, 0.005696f, 0.003946f, 0.002247f, 0.001195f, 0.000566f, 0.000019f, -0.000229f}, + {-0.013293f, 0.000433f, 0.010653f, 0.007331f, 0.007378f, 0.004654f, 0.002960f, -0.004136f, 0.000209f, -0.004715f, 0.011396f, 0.006986f, 0.002775f, 0.001683f, 0.001689f, -0.000101f, -0.003538f, 0.005611f, 0.007858f, 0.007541f, 0.004649f, -0.005678f, -0.008189f, -0.008988f, -0.008512f, -0.000868f, 0.004527f, -0.008788f, 0.007414f, -0.001745f, 0.012920f, -0.002116f, 0.008229f, 0.000135f, -0.010614f, 0.003079f, -0.001316f, 0.008656f, 0.000654f, -0.000985f, -0.004296f, -0.007284f, 0.000717f, 0.004149f, -0.009310f, -0.012788f, 0.009007f, -0.007399f, -0.006779f, -0.006434f, 0.005103f, -0.005072f, 0.002206f, -0.002257f, -0.000571f, -0.007526f, -0.002217f, -0.005115f, -0.007440f, 0.002489f, 0.005884f, -0.002145f, -0.008190f, -0.001594f, -0.001621f, -0.004125f, -0.007071f, -0.000534f, -0.005740f, -0.006818f, -0.001173f, 0.000488f, 0.001672f, -0.002301f, 0.001068f, -0.001251f, -0.009581f, -0.002114f, 0.001253f, -0.002651f, -0.002411f, -0.003013f, 0.003151f, -0.003683f, 0.003242f, -0.000252f, 0.000615f, 0.001231f, -0.002294f, 0.002330f, 0.000087f, -0.001281f, 0.000641f, -0.000625f, -0.001938f, 0.000334f, + 0.001569f, -0.001026f, -0.000809f, -0.000089f, 0.002494f, 0.001101f, 0.000409f, 0.000378f, 0.001377f, 0.000888f, 0.001588f, 0.000432f, 0.002025f, -0.001632f, -0.000651f, -0.000739f, 0.025061f, -0.008840f, -0.005811f, -0.007887f, -0.005441f, 0.000527f, -0.016876f, 0.002780f, -0.008406f, -0.016516f, -0.003583f, 0.014051f, -0.010212f, 0.002696f, -0.001266f, 0.004679f, 0.007058f, 0.007571f, 0.012253f, -0.002692f, -0.007132f, 0.003091f, 0.002904f, -0.005712f, -0.000891f, -0.003875f, -0.002563f, 0.001466f, -0.006543f, -0.004093f, -0.001016f, -0.008192f, -0.009636f, 0.004837f, 0.007312f, -0.004429f, -0.011064f, -0.001972f, -0.002656f, 0.001510f, 0.008794f, 0.000543f, -0.003759f, -0.000634f, 0.011799f, 0.001439f, -0.007355f, -0.007052f, 0.002991f, 0.002209f, 0.009397f, 0.005345f, -0.000710f, -0.009094f, 0.000418f, -0.000572f, 0.007694f, -0.008372f, -0.002890f, 0.004542f, 0.008954f, -0.002587f, 0.000710f, -0.006888f, -0.003943f, 0.004165f, 0.000165f, 0.000852f, 0.002359f, -0.002698f, 0.003195f, 0.000944f, 0.003930f, 0.002448f, 0.001457f, 0.015698f, 0.004715f, -0.000674f, -0.002225f, -0.004665f, + 0.006639f, 0.004157f, 0.007183f, 0.005166f, 0.001721f, 0.001908f, -0.001633f, 0.001419f, -0.003057f, -0.003170f, -0.002528f, 0.000803f, -0.001229f, -0.000793f, -0.000593f, 0.002516f, 0.000302f, 0.003296f, 0.000193f, -0.001071f, -0.000537f, -0.000337f, -0.000583f, 0.001063f, 0.000653f, 0.001324f, -0.018416f, -0.004308f, -0.008677f, 0.008469f, 0.002165f, 0.000231f, 0.006034f, -0.003537f, -0.014227f, -0.007489f, 0.009505f, -0.000489f, 0.009792f, -0.000696f, -0.005490f, 0.010847f, 0.004099f, 0.023742f, -0.004427f, 0.010325f, 0.001540f, -0.011142f, 0.002852f, -0.009460f, 0.006184f, 0.002206f, 0.002457f, -0.010111f, 0.005115f, -0.001738f, -0.003542f, 0.004191f, 0.016185f, 0.006031f, -0.000049f, -0.012925f, 0.011278f, -0.002339f, 0.000095f, 0.007976f, -0.011739f, -0.002176f, 0.008174f, -0.004793f, -0.004158f, -0.013274f, -0.014479f, -0.001079f, 0.008846f, 0.005206f, -0.005779f, -0.000136f, 0.005781f, 0.007205f, 0.002909f, -0.001451f, -0.002749f, -0.012722f, 0.006045f, 0.015879f, 0.007262f, -0.004552f, -0.002186f, 0.005039f, 0.007617f, -0.000576f, -0.002311f, 0.001906f, -0.010438f, -0.001927f, + -0.007299f, -0.003419f, -0.000628f, -0.004500f, 0.012137f, 0.010549f, -0.003094f, 0.005300f, 0.003965f, -0.002005f, -0.007086f, 0.001692f, -0.005473f, -0.002084f, 0.001686f, -0.007118f, -0.001467f, 0.000718f, -0.002015f, 0.002031f, 0.003104f, -0.004555f, -0.001580f, -0.000301f, 0.000363f, -0.003576f, 0.000999f, -0.001656f, 0.002748f, -0.003173f, 0.003031f, -0.002173f, 0.000772f, 0.000482f, -0.001492f, 0.001193f, 0.000587f, -0.001163f, 0.001100f, 0.001159f, 0.001262f, -0.002363f, -0.001049f, 0.000037f, -0.003277f, 0.000424f, 0.002031f, -0.000676f, -0.013759f, 0.015593f, -0.013242f, 0.014249f, -0.000027f, -0.011171f, -0.026493f, -0.010367f, -0.007529f, 0.004094f, 0.014049f, 0.011024f, -0.003252f, -0.002026f, -0.003135f, -0.007517f, -0.002091f, -0.008461f, 0.003048f, 0.003271f, 0.005392f, 0.008885f, 0.005307f, 0.016891f, 0.000162f, 0.003507f, -0.005799f, -0.001262f, -0.003891f, 0.006285f, 0.001976f, -0.007680f, -0.011174f, 0.000589f, -0.007990f, 0.001142f, 0.007784f, -0.012644f, 0.009115f, -0.021359f, -0.005796f, -0.015810f, 0.002850f, -0.000850f, 0.000397f, -0.006114f, -0.008296f, 0.003115f, + 0.007749f, 0.005596f, 0.002148f, -0.012671f, 0.004045f, -0.008707f, -0.003231f, -0.002398f, -0.017318f, -0.006670f, 0.005372f, 0.006901f, -0.000455f, -0.011874f, 0.002218f, 0.004720f, -0.002177f, -0.002234f, 0.001594f, 0.010631f, 0.003913f, -0.002187f, -0.003206f, 0.002011f, -0.024730f, 0.001959f, 0.006465f, 0.006093f, 0.017692f, 0.002600f, -0.009676f, 0.011190f, -0.003699f, 0.001832f, 0.004032f, 0.003825f, -0.002380f, -0.008021f, 0.000620f, 0.004991f, 0.004755f, 0.007630f, -0.002181f, -0.002268f, 0.001459f, -0.001247f, -0.000787f, 0.001361f, -0.001969f, 0.000875f, 0.001863f, -0.000851f, -0.003853f, -0.002899f, -0.000005f, 0.000644f, 0.001202f, -0.001747f, 0.003942f, -0.001807f, -0.000948f, 0.002619f, 0.003002f, -0.000662f, -0.004289f, -0.002162f, 0.001912f, -0.002082f, -0.001067f, -0.001198f, 0.001095f, 0.003626f, -0.000502f, 0.000879f, 0.003743f, 0.017786f, -0.004510f, 0.000257f, 0.011738f, -0.006050f, -0.005645f, 0.017543f, -0.013354f, -0.031621f, -0.020742f, -0.012227f, 0.019012f, 0.008084f, 0.002646f, -0.018319f, 0.019402f, -0.008366f, 0.005452f, -0.005024f, 0.007633f, 0.009325f, + -0.000749f, 0.000231f, -0.000152f, -0.003161f, -0.010002f, -0.008096f, -0.002440f, 0.001042f, 0.008825f, 0.004975f, 0.013774f, 0.006551f, -0.005974f, -0.003218f, 0.012265f, -0.008829f, 0.015045f, -0.012031f, 0.003260f, 0.006574f, 0.004289f, -0.009763f, 0.013269f, -0.001314f, 0.014256f, 0.018720f, 0.002909f, -0.007515f, -0.007224f, 0.007897f, -0.008976f, -0.019076f, -0.004870f, 0.003969f, -0.012181f, 0.006943f, 0.005704f, -0.004093f, -0.007554f, -0.003280f, -0.002858f, 0.003628f, -0.001417f, -0.010764f, -0.004029f, 0.018479f, 0.014947f, 0.007972f, -0.022005f, -0.021718f, -0.011779f, 0.020749f, 0.010608f, -0.001682f, 0.002970f, -0.010310f, 0.013216f, -0.000644f, -0.010144f, -0.003607f, 0.001441f, -0.001066f, -0.005042f, -0.000806f, -0.003974f, -0.002208f, 0.003978f, 0.005676f, -0.003270f, -0.000120f, 0.000605f, 0.000903f, 0.000919f, -0.005761f, 0.006649f, -0.000518f, -0.006411f, -0.003915f, -0.000802f, -0.002090f, 0.000217f, -0.000540f, -0.000708f, -0.000746f, 0.001664f, 0.000259f, -0.002891f, -0.000261f, 0.001269f, -0.000798f, -0.004548f, -0.003238f, -0.004233f, -0.001590f, 0.003274f, 0.009116f, + 0.013329f, -0.000535f, 0.005258f, -0.020469f, -0.006782f, 0.003577f, 0.007263f, -0.025432f, -0.002646f, 0.011228f, -0.007530f, -0.016478f, 0.010579f, -0.019198f, -0.014040f, -0.007494f, 0.001884f, -0.006847f, -0.004601f, -0.000436f, 0.014599f, -0.012052f, 0.003382f, -0.003690f, -0.004909f, -0.010115f, -0.002666f, -0.014855f, -0.004304f, -0.000254f, 0.003051f, -0.010330f, -0.002044f, -0.006447f, 0.001132f, -0.003196f, -0.004494f, 0.002954f, 0.012033f, 0.003205f, -0.006009f, 0.006086f, -0.008886f, -0.002060f, 0.003641f, -0.003257f, 0.006078f, -0.001739f, -0.000500f, -0.041553f, 0.002937f, -0.014278f, 0.007230f, 0.006230f, 0.009385f, -0.022784f, -0.023278f, 0.003356f, 0.000979f, 0.005668f, 0.000312f, 0.012686f, -0.004909f, 0.006985f, 0.008565f, -0.003813f, 0.019767f, -0.005941f, -0.012621f, -0.002526f, -0.010423f, -0.000170f, -0.020770f, 0.000507f, 0.010493f, 0.005047f, 0.015756f, -0.004128f, -0.004132f, 0.007095f, -0.008118f, 0.002156f, 0.005218f, 0.010281f, -0.005266f, 0.005985f, -0.008063f, 0.001826f, 0.000453f, 0.001289f, -0.003913f, -0.001719f, -0.002888f, 0.003422f, -0.003626f, -0.005750f, + -0.000005f, -0.002605f, -0.003608f, -0.001130f, -0.002805f, -0.001065f, -0.001726f, 0.001913f, -0.002813f, 0.001900f, -0.005789f, -0.000419f, -0.003427f, -0.001286f, 0.000568f, 0.000607f, -0.000743f, -0.002605f, 0.000348f, -0.001867f, 0.000970f, 0.000317f, 0.016155f, -0.032607f, 0.008716f, 0.001386f, 0.009033f, 0.013121f, 0.002359f, -0.012645f, -0.027793f, 0.001982f, -0.011253f, 0.021098f, -0.008617f, 0.004361f, 0.001502f, 0.004518f, 0.015879f, -0.007014f, -0.000524f, -0.007366f, -0.004199f, 0.004177f, -0.004056f, 0.014954f, 0.011078f, 0.003216f, -0.003214f, 0.000235f, 0.009947f, -0.000997f, 0.004775f, -0.000195f, -0.008293f, 0.007322f, -0.002174f, -0.006130f, 0.008770f, 0.014998f, -0.000019f, 0.005894f, 0.000985f, -0.009873f, -0.006253f, 0.018211f, -0.008839f, 0.008742f, 0.013157f, -0.017489f, 0.012445f, 0.006757f, 0.006280f, -0.007725f, 0.012760f, 0.003766f, -0.002300f, 0.016491f, 0.000524f, -0.000128f, -0.007781f, -0.004307f, -0.000096f, -0.007107f, -0.017654f, -0.004543f, 0.017846f, 0.013611f, 0.014663f, -0.001564f, -0.015664f, 0.006546f, 0.018718f, -0.003424f, -0.013431f, -0.000589f, + -0.009523f, -0.002321f, -0.001673f, 0.014755f, -0.001516f, 0.007627f, -0.002042f, 0.000788f, -0.010448f, 0.002841f, -0.001898f, 0.004166f, 0.003891f, -0.006999f, 0.004707f, -0.011141f, 0.000981f, 0.004181f, 0.000165f, -0.002777f, -0.000327f, 0.002368f, -0.007941f, -0.001303f, -0.007484f, 0.002429f, -0.004786f, -0.002776f, -0.004645f, -0.007383f, -0.005118f, -0.001774f, 0.000940f, -0.002146f, -0.000337f, 0.002553f, 0.000642f, -0.001799f, -0.001558f, -0.002081f, 0.004160f, 0.000329f, 0.001397f, 0.002991f, 0.001574f, 0.002166f, -0.001179f, 0.003891f, -0.000731f, 0.000296f, 0.001362f, -0.001231f, -0.002206f, 0.001190f, 0.003712f, -0.015506f, -0.004594f, -0.024982f, -0.007326f, -0.014503f, -0.017098f, -0.016212f, -0.005763f, 0.021744f, 0.023661f, 0.032614f, 0.007268f, -0.012484f, -0.007696f, 0.026990f, -0.000134f, -0.006331f, 0.020667f, -0.002199f, 0.000869f, -0.032374f, 0.014592f, 0.008104f, -0.021617f, 0.029874f, -0.004202f, 0.013403f, -0.003667f, 0.006992f, 0.013258f, -0.000004f, 0.023466f, 0.008979f, 0.006632f, -0.002755f, -0.008372f, 0.002222f, 0.014201f, -0.003853f, 0.004191f, 0.006637f, + 0.018820f, -0.000915f, -0.005747f, 0.012125f, -0.014321f, -0.009005f, 0.006419f, 0.020784f, -0.009268f, -0.011188f, -0.003562f, 0.017124f, 0.000116f, 0.002397f, -0.006449f, -0.002959f, 0.006114f, 0.009020f, 0.000761f, -0.007428f, -0.023765f, 0.002788f, 0.006950f, 0.022561f, 0.006524f, -0.001847f, 0.017308f, 0.030976f, -0.006424f, 0.010837f, 0.007277f, 0.012821f, -0.002539f, -0.010923f, 0.006350f, -0.025723f, -0.007027f, -0.003918f, -0.008376f, -0.005217f, 0.013345f, 0.004600f, -0.016676f, -0.009838f, 0.000438f, -0.005452f, -0.000631f, -0.012750f, -0.000423f, -0.004379f, -0.003244f, -0.001767f, 0.001244f, -0.003563f, -0.000920f, -0.001744f, 0.002694f, -0.001013f, 0.002469f, -0.003493f, -0.000136f, 0.000527f, 0.001128f, 0.005156f, 0.000126f, -0.001991f, 0.004794f, 0.007040f, -0.000592f, -0.004332f, -0.002758f, -0.006099f, -0.005353f, 0.007313f, -0.001268f, 0.001970f, 0.002659f, 0.002588f, 0.002401f, -0.005615f, 0.002722f, -0.002041f, -0.028519f, 0.039304f, -0.020211f, 0.008719f, -0.001727f, -0.013912f, 0.029899f, 0.006836f, 0.003482f, -0.032145f, 0.008014f, -0.012982f, -0.014770f, 0.003274f, + -0.014422f, 0.015860f, 0.009502f, -0.002981f, 0.002975f, -0.008081f, -0.003785f, -0.011857f, -0.007706f, -0.014187f, -0.021743f, -0.005567f, -0.015291f, -0.004310f, 0.007923f, -0.006351f, -0.008349f, 0.016738f, 0.010436f, 0.016800f, -0.014257f, -0.001858f, -0.003069f, -0.015661f, -0.000104f, -0.008459f, -0.038546f, 0.003071f, 0.000436f, -0.006204f, 0.013030f, -0.001672f, 0.014402f, 0.012132f, 0.004327f, 0.022751f, 0.020241f, -0.020528f, -0.005804f, -0.000120f, -0.001004f, 0.006914f, 0.002500f, 0.019295f, -0.004440f, 0.030991f, -0.000299f, -0.018745f, -0.015230f, 0.002098f, 0.005389f, 0.006101f, 0.022482f, 0.005674f, 0.005434f, 0.021075f, 0.028207f, 0.000862f, -0.017724f, -0.016846f, -0.001826f, -0.005857f, -0.004296f, 0.036468f, 0.002375f, -0.017016f, 0.011686f, -0.014939f, 0.013718f, 0.001993f, -0.003167f, -0.004691f, -0.011501f, 0.002808f, 0.003452f, -0.001987f, 0.003020f, 0.005880f, 0.003184f, 0.003901f, -0.001923f, -0.001892f, 0.000134f, -0.002387f, -0.002007f, 0.003835f, 0.001371f, 0.002621f, 0.003441f, 0.006253f, 0.000094f, -0.003438f, 0.005855f, 0.003146f, 0.000901f, 0.001056f, + -0.001558f, 0.000581f, -0.000522f, 0.006213f, 0.009956f, -0.005889f, 0.004595f, -0.001572f, 0.003964f, 0.000192f, 0.000607f, 0.008376f, -0.000760f, 0.000478f, 0.000442f, 0.006809f, 0.004455f, 0.004879f, 0.003148f, 0.000509f, 0.023531f, 0.001612f, 0.015794f, -0.017720f, 0.007629f, 0.001189f, -0.001501f, 0.010350f, 0.024902f, -0.007144f, -0.002478f, 0.022889f, -0.030761f, -0.017261f, -0.013543f, -0.035240f, 0.006685f, -0.011336f, -0.005126f, 0.003969f, -0.024087f, 0.025945f, 0.019557f, 0.027572f, 0.012289f, -0.017560f, 0.001447f, 0.000863f, 0.020621f, -0.004099f, -0.000861f, -0.001064f, -0.013112f, 0.000781f, -0.007789f, 0.011375f, -0.013898f, -0.005449f, -0.004813f, -0.006193f, -0.016244f, 0.007285f, -0.023735f, -0.003866f, -0.001847f, 0.014519f, 0.008570f, 0.001694f, 0.000068f, -0.004405f, 0.001538f, -0.000057f, 0.012095f, 0.002558f, 0.003378f, -0.002251f, -0.037045f, -0.017433f, 0.004096f, 0.014986f, 0.018142f, -0.029179f, 0.019151f, 0.005435f, -0.011547f, 0.002476f, 0.006082f, -0.007152f, 0.027810f, -0.000050f, 0.005199f, -0.006913f, -0.039145f, -0.013689f, -0.017914f, -0.004945f, + 0.000559f, -0.011143f, 0.005455f, 0.007971f, -0.008157f, -0.002007f, 0.024920f, 0.000368f, 0.012627f, -0.015718f, 0.001800f, -0.000600f, 0.014287f, 0.012390f, 0.009046f, -0.003831f, 0.002847f, 0.010100f, 0.006226f, -0.000832f, 0.010904f, 0.010333f, 0.011588f, 0.001140f, 0.004345f, 0.003629f, 0.001787f, -0.001912f, -0.001615f, 0.009719f, 0.001795f, -0.005745f, 0.000796f, -0.001190f, 0.005466f, -0.004304f, 0.001668f, 0.004851f, -0.004211f, 0.007771f, 0.002745f, -0.001565f, 0.000592f, -0.007536f, 0.005125f, 0.004802f, -0.000933f, -0.002039f, -0.004425f, -0.006344f, 0.001618f, 0.036389f, 0.006005f, 0.014858f, -0.021523f, -0.019458f, 0.011578f, 0.019010f, 0.002438f, -0.006384f, 0.034924f, 0.011167f, 0.000373f, -0.009352f, 0.007783f, -0.002433f, -0.003608f, -0.001035f, -0.005737f, 0.001877f, -0.011316f, -0.027252f, 0.009289f, 0.003089f, 0.008610f, 0.002994f, 0.015512f, 0.004920f, -0.016240f, -0.033228f, 0.001092f, 0.002772f, -0.002474f, -0.029043f, -0.014087f, -0.004142f, 0.008426f, -0.006131f, 0.003498f, -0.025367f, 0.001463f, -0.005457f, 0.000378f, 0.002842f, 0.007329f, -0.002493f, + -0.023913f, -0.021916f, -0.013617f, 0.009594f, 0.007098f, -0.005639f, -0.004801f, -0.038405f, -0.021682f, -0.000506f, -0.037516f, 0.034996f, -0.035411f, -0.009507f, -0.022859f, 0.037515f, 0.012140f, -0.025956f, 0.013390f, -0.002767f, 0.014274f, -0.022072f, -0.007208f, 0.001254f, 0.015340f, -0.020938f, -0.008294f, -0.006932f, -0.021386f, 0.001815f, 0.014519f, -0.002419f, -0.003777f, 0.026099f, -0.040722f, 0.032498f, -0.005162f, 0.007092f, -0.018268f, 0.013237f, -0.001895f, 0.010606f, -0.009186f, 0.000818f, 0.008352f, 0.009187f, -0.002390f, -0.004186f, 0.000217f, 0.001209f, 0.001239f, -0.002712f, 0.010246f, 0.010884f, 0.007632f, 0.002248f, 0.007732f, -0.000419f, 0.009467f, -0.003131f, 0.001866f, -0.000101f, -0.003352f, -0.003284f, 0.000795f, -0.007378f, -0.009148f, -0.002392f, -0.000430f, 0.009726f, -0.000423f, -0.001230f, -0.002433f, -0.006182f, 0.004715f, -0.001771f, -0.003257f, -0.002017f, 0.004991f, -0.000707f, -0.010410f, -0.001090f, 0.003877f, 0.001215f, -0.000878f, 0.032126f, 0.069926f, -0.009071f, -0.021415f, -0.020060f, -0.017659f, -0.025488f, 0.004562f, -0.043594f, -0.000081f, -0.033644f, + -0.015374f, 0.010720f, 0.021595f, 0.012472f, -0.014956f, -0.001837f, 0.020562f, -0.001134f, 0.023686f, -0.013677f, -0.013750f, -0.012159f, 0.011340f, -0.007930f, -0.010352f, 0.003990f, -0.012472f, -0.012791f, 0.016169f, 0.037658f, 0.014443f, 0.016241f, 0.007411f, -0.021801f, -0.004900f, -0.017649f, -0.016577f, -0.002456f, -0.002737f, -0.013824f, -0.022173f, -0.044970f, -0.003898f, -0.016185f, 0.006182f, -0.008127f, 0.017261f, 0.015921f, 0.009242f, 0.016652f, 0.011894f, -0.001520f, 0.031987f, 0.045380f, 0.011135f, -0.052671f, 0.011106f, -0.009261f, -0.030630f, 0.004529f, 0.015481f, 0.007733f, 0.001692f, 0.014745f, -0.000525f, -0.024987f, 0.001887f, 0.012159f, -0.024907f, -0.013054f, -0.023313f, -0.043656f, 0.034879f, 0.004988f, -0.002205f, 0.024316f, 0.019176f, 0.001559f, 0.001758f, 0.024034f, -0.032010f, -0.013874f, 0.004010f, 0.017788f, 0.015213f, 0.022805f, 0.016656f, -0.013123f, -0.007350f, -0.002726f, -0.004742f, -0.001697f, -0.002835f, -0.006247f, -0.008081f, -0.012929f, -0.012856f, -0.009252f, -0.004654f, -0.001176f, 0.006963f, -0.003333f, -0.002263f, -0.014842f, -0.009891f, 0.001817f, + 0.008363f, 0.005715f, 0.003710f, 0.003446f, 0.002712f, -0.001863f, -0.007257f, -0.003487f, -0.004352f, -0.004018f, 0.001962f, -0.008042f, 0.002193f, -0.005656f, 0.006781f, -0.000439f, -0.001694f, -0.005401f, 0.005703f, -0.004943f, -0.001160f, 0.010760f, -0.003821f, -0.000045f, 0.051666f, -0.037686f, 0.044709f, -0.003397f, -0.004987f, -0.022270f, -0.008001f, -0.022125f, -0.018721f, 0.024017f, -0.020731f, 0.012565f, 0.053571f, 0.020095f, -0.007521f, -0.023709f, -0.019792f, 0.024043f, -0.019031f, -0.032538f, -0.013150f, 0.003671f, 0.003521f, -0.037196f, 0.003050f, -0.011078f, 0.019953f, -0.011550f, -0.000149f, 0.004641f, 0.056355f, -0.013238f, -0.017461f, 0.027432f, -0.021188f, 0.032893f, -0.018644f, 0.024161f, 0.004430f, -0.016962f, -0.015350f, 0.030589f, -0.038708f, 0.030097f, -0.016434f, 0.003334f, -0.008930f, 0.016565f, -0.013093f, -0.006641f, -0.000085f, -0.011789f, 0.057516f, -0.016142f, 0.039395f, 0.015371f, 0.018315f, -0.000016f, 0.015195f, 0.025240f, 0.028455f, -0.007432f, -0.026690f, 0.000394f, 0.023583f, 0.009557f, -0.003657f, -0.033912f, 0.046132f, -0.009323f, -0.029745f, -0.008142f, + -0.018059f, 0.014517f, 0.020190f, 0.001028f, 0.033533f, -0.008711f, 0.017434f, -0.037345f, -0.006157f, -0.039866f, -0.011997f, -0.014451f, -0.000421f, 0.002438f, -0.007235f, 0.014520f, 0.005198f, -0.010613f, -0.017947f, -0.013491f, -0.003462f, -0.001514f, -0.008736f, -0.001794f, -0.002757f, 0.011514f, -0.002831f, 0.000671f, -0.003765f, -0.017171f, -0.004714f, -0.006795f, 0.002671f, -0.002713f, -0.009201f, -0.014987f, 0.006561f, -0.010080f, 0.005294f, 0.006896f, -0.010043f, -0.025825f, -0.005636f, -0.003918f, -0.006353f, -0.009124f, 0.001647f, -0.004192f, 0.003389f, 0.003187f, -0.011206f, -0.001398f, -0.011277f, 0.011152f, 0.007382f, -0.006114f, 0.003604f, -0.010285f, -0.058291f, -0.024929f, 0.035636f, -0.007130f, -0.014704f, 0.041445f, 0.003901f, -0.021624f, 0.015668f, 0.022542f, 0.019089f, 0.002946f, -0.035895f, -0.014839f, 0.005395f, 0.005253f, 0.018646f, 0.012358f, 0.021042f, -0.018324f, -0.014525f, 0.007070f, -0.005046f, 0.017295f, -0.033756f, -0.005713f, -0.036508f, -0.011787f, 0.006518f, -0.005026f, -0.004653f, 0.038975f, 0.008042f, -0.028885f, -0.004460f, 0.002323f, -0.029594f, -0.003996f, + 0.001370f, 0.017748f, 0.044740f, -0.015897f, 0.014904f, -0.025005f, 0.003688f, -0.014707f, -0.019029f, 0.018280f, 0.039113f, -0.031053f, 0.002917f, 0.034932f, -0.015858f, -0.003210f, -0.013198f, 0.022872f, 0.005421f, -0.028373f, -0.000445f, -0.009902f, -0.009314f, -0.002806f, -0.014051f, 0.021175f, -0.050304f, 0.010656f, 0.004099f, -0.021087f, 0.028012f, 0.043152f, 0.030334f, 0.082179f, 0.024800f, -0.021038f, -0.029295f, -0.024086f, -0.013292f, 0.030195f, -0.011003f, 0.041919f, 0.003716f, 0.051039f, -0.060741f, -0.038827f, 0.018123f, -0.009909f, -0.006411f, 0.024514f, -0.016653f, -0.001825f, 0.025870f, 0.011655f, 0.019149f, 0.028564f, 0.022110f, -0.004758f, 0.008933f, -0.017358f, 0.000463f, -0.000597f, -0.012403f, -0.013307f, 0.008749f, -0.018362f, -0.001750f, 0.027985f, 0.002364f, -0.016562f, -0.021938f, 0.004144f, -0.027521f, -0.009959f, 0.029219f, 0.015394f, -0.005009f, -0.006620f, 0.005462f, -0.005330f, -0.009487f, 0.002109f, -0.006987f, -0.010319f, -0.002013f, -0.014214f, 0.009937f, 0.008976f, 0.009502f, -0.005178f, -0.004063f, 0.006397f, 0.014802f, 0.040494f, -0.096082f, -0.004158f, + 0.054229f, -0.073075f, -0.003664f, 0.013962f, -0.075483f, 0.033294f, 0.008811f, 0.059869f, -0.006367f, 0.020937f, 0.017404f, -0.066448f, -0.055093f, -0.021654f, -0.005656f, -0.033427f, -0.041044f, -0.021862f, 0.037247f, 0.026030f, 0.022427f, 0.002096f, 0.003883f, 0.011548f, 0.001976f, -0.048328f, -0.018325f, -0.061945f, -0.020044f, 0.034124f, 0.009893f, 0.022949f, 0.077129f, 0.019829f, 0.028924f, -0.001543f, 0.015147f, 0.067927f, 0.050961f, 0.013994f, 0.033312f, 0.030596f, 0.067732f, 0.055633f, -0.074558f, 0.046157f, -0.004509f, 0.044162f, 0.044903f, 0.018554f, 0.081390f, 0.071923f, -0.040150f, 0.035448f, -0.000856f, 0.033772f, -0.060066f, 0.005537f, 0.006122f, 0.001953f, -0.013846f, 0.037578f, 0.040658f, -0.039975f, -0.013762f, -0.023589f, 0.014088f, -0.033178f, -0.041187f, 0.038157f, 0.065210f, 0.023787f, 0.067878f, -0.019908f, 0.092349f, 0.090482f, 0.025055f, 0.047335f, -0.014198f, -0.024068f, 0.021024f, 0.020804f, 0.009876f, 0.006971f, 0.005249f, 0.011995f, -0.013238f, -0.023638f, -0.017080f, -0.044188f, -0.046412f, -0.018828f, 0.021166f, -0.000807f, 0.018626f, 0.003119f, + 0.011219f, 0.027784f, 0.034015f, -0.011330f, 0.015429f, -0.001865f, -0.014520f, -0.011980f, -0.010417f, -0.029154f, -0.013646f, 0.000266f, -0.025363f, -0.009068f, -0.022863f, -0.012658f, 0.004547f, 0.031307f, -0.015179f, 0.011150f, 0.008566f, -0.005509f, 0.017068f, 0.009978f, 0.012951f, 0.000198f, 0.022770f, 0.014653f, 0.009735f, -0.009413f, -0.014330f, -0.006170f, -0.030909f, 0.044090f, 0.079629f, -0.011257f, -0.109566f, -0.035225f, 0.010791f, -0.008865f, -0.018459f, -0.024308f, 0.000034f, -0.062810f, -0.037793f, -0.052208f, -0.008694f, -0.015487f, 0.016989f, -0.037362f, -0.010949f, 0.009661f, 0.017060f, -0.000754f, 0.019019f, 0.037427f, 0.007522f, 0.054141f, -0.035359f, 0.012805f, 0.001921f, 0.051635f, 0.013365f, -0.010507f, -0.052595f, 0.034463f, -0.009265f, 0.047076f, -0.040050f, -0.031926f, -0.030391f, -0.016396f, -0.048458f, -0.006956f, -0.008561f, -0.045721f, 0.024802f, 0.051375f, -0.025203f, 0.007346f, -0.067308f, 0.064218f, -0.020528f, -0.035458f, 0.029313f, 0.025460f, -0.038527f, 0.003037f, -0.024050f, 0.008136f, -0.017633f, 0.080470f, -0.003067f, -0.007241f, -0.019979f, 0.142286f, + 0.003600f, -0.019670f, 0.061071f, 0.048729f, -0.051833f, 0.040134f, -0.063489f, -0.035608f, -0.066334f, 0.050369f, -0.045635f, 0.024140f, 0.034882f, 0.027423f, -0.058772f, 0.073908f, -0.013340f, -0.097570f, -0.110827f, -0.044040f, -0.013571f, -0.032561f, 0.025940f, 0.025110f, 0.043975f, 0.006829f, 0.003945f, -0.033344f, 0.033275f, 0.051620f, 0.076392f, 0.019692f, -0.021698f, 0.007018f, 0.065051f, 0.010395f, -0.035637f, -0.009284f, 0.069434f, 0.015448f, -0.040749f, -0.011062f, 0.034391f, 0.019299f, 0.031348f, 0.020485f, 0.044089f, -0.000109f, 0.024338f, 0.008078f, 0.031295f, 0.014199f, 0.049617f, 0.015895f, 0.031459f, -0.006628f, 0.010075f, 0.001796f, -0.003373f, 0.012611f, -0.004067f, 0.016514f, 0.031091f, 0.004099f, 0.018209f, 0.001693f, 0.023583f, -0.053116f, -0.011827f, 0.039939f, 0.003653f, -0.030775f, -0.146883f, 0.010485f, 0.094376f, -0.057040f, -0.038053f, 0.075796f, -0.055171f, -0.003584f, -0.015686f, 0.072753f, -0.124969f, 0.069849f, 0.041434f, -0.035258f, 0.013021f, 0.068243f, 0.048705f, -0.023890f, 0.027861f, 0.012526f, -0.019060f, 0.032101f, -0.000715f, 0.019468f, + 0.029511f, -0.012586f, 0.007111f, -0.003173f, 0.014062f, -0.018065f, -0.014584f, -0.001139f, 0.025322f, -0.074071f, -0.036705f, 0.036874f, -0.008351f, -0.049100f, -0.058052f, 0.010076f, 0.072165f, -0.031290f, -0.046154f, 0.035534f, 0.053821f, -0.011742f, 0.013509f, -0.009476f, 0.050128f, -0.027197f, 0.075178f, -0.010124f, 0.000107f, 0.041266f, 0.000837f, 0.009545f, -0.053462f, 0.084017f, -0.043441f, -0.052514f, 0.039826f, -0.055607f, -0.018448f, 0.009481f, 0.027717f, 0.077646f, -0.027576f, 0.048448f, -0.009909f, 0.025407f, -0.131438f, -0.100398f, -0.018519f, -0.039075f, 0.019998f, 0.018258f, 0.049813f, -0.007765f, -0.010528f, 0.059612f, -0.065230f, -0.001322f, 0.041597f, 0.041287f, -0.015239f, 0.045993f, 0.005699f, -0.009629f, -0.000316f, -0.010031f, 0.043834f, -0.024248f, -0.002587f, 0.042972f, 0.009745f, -0.009539f, 0.016784f, -0.021085f, 0.005388f, -0.001436f, 0.000636f, 0.017493f, 0.007996f, -0.024124f, -0.005670f, 0.007741f, -0.019032f, -0.027558f, -0.000490f, 0.020538f, 0.035605f, -0.029928f, 0.034783f, 0.012182f, -0.035013f, 0.029176f, 0.032986f, -0.016428f, -0.039652f, 0.036600f, + -0.018194f, 0.006975f, 0.019860f, -0.019627f, -0.052483f, 0.017404f, 0.013910f, -0.028658f, -0.027545f, 0.002348f, 0.019605f, -0.022651f, 0.008318f, -0.009783f, -0.048148f, -0.022148f, 0.036772f, -0.060257f, 0.060671f, -0.051183f, -0.064419f, 0.037749f, -0.030723f, -0.020490f, 0.038541f, -0.027505f, 0.032321f, -0.021453f, 0.015458f, 0.074335f, -0.064992f, -0.003954f, -0.009264f, 0.062740f, 0.009146f, 0.006628f, -0.058109f, -0.054494f, -0.018883f, -0.015373f, -0.007835f, -0.017052f, 0.011685f, 0.003996f, -0.005275f, 0.009938f, 0.014029f, 0.007135f, 0.011056f, -0.010604f, 0.029700f, -0.018033f, 0.028450f, -0.051605f, 0.002597f, -0.041659f, -0.054266f, -0.031671f, 0.073875f, -0.030758f, -0.031440f, -0.023151f, 0.017545f, -0.013811f, 0.033285f, 0.048187f, -0.049020f, 0.045317f, 0.008707f, -0.068004f, -0.033720f, 0.142942f, 0.074468f, -0.106986f, -0.019565f, 0.069239f, -0.033996f, -0.038556f, 0.028279f, -0.033216f, -0.073750f, 0.054254f, 0.025109f, -0.100488f, 0.042418f, 0.052105f, -0.058831f, -0.038525f, 0.061178f, -0.014008f, -0.044765f, 0.011179f, 0.030717f, -0.072601f, 0.014614f, 0.013755f, + 0.021819f, -0.055234f, -0.015975f, -0.004094f, -0.017265f, -0.003094f, 0.004328f, 0.006992f, -0.033603f, 0.006159f, 0.051288f, 0.018288f, 0.003862f, 0.017424f, -0.000216f, -0.007657f, -0.027148f, -0.007891f, -0.014393f, -0.019706f, -0.046971f, 0.013430f, -0.026522f, -0.006833f, 0.059139f, -0.051002f, -0.033132f, 0.043802f, -0.030480f, -0.010612f, -0.012809f, 0.020122f, -0.033071f, -0.011561f, 0.054588f, 0.029247f, -0.025632f, 0.030999f, 0.017685f, -0.021755f, -0.013544f, 0.074065f, -0.057895f, -0.044857f, 0.078802f, 0.000270f, -0.061590f, 0.009249f, 0.039165f, -0.036200f, -0.077073f, 0.052632f, 0.007159f, -0.085587f, 0.015591f, 0.024780f, -0.062265f, -0.000656f, 0.043083f, -0.011090f, -0.027263f, 0.022972f, 0.018483f, -0.042687f, -0.003626f, 0.032733f, -0.023917f, -0.030574f, 0.021985f, 0.001985f, 0.088777f, 0.125972f, -0.051134f, 0.141095f, -0.011734f, -0.039268f, -0.030556f, -0.048441f, -0.004623f, 0.023303f, 0.082931f, 0.002403f, 0.025111f, -0.021675f, -0.072683f, 0.000910f, 0.001996f, 0.047047f, 0.008364f, -0.054896f, 0.100595f, -0.043683f, 0.018233f, 0.045088f, -0.051163f, -0.041386f, + -0.072728f, -0.031959f, 0.043773f, 0.055041f, 0.067765f, -0.026263f, -0.168352f, 0.036764f, 0.086757f, 0.111794f, 0.095664f, -0.001889f, -0.048766f, -0.059856f, 0.019482f, 0.056821f, -0.037309f, -0.019709f, -0.149313f, -0.091382f, 0.078988f, 0.133902f, 0.026710f, -0.004093f, -0.033454f, -0.059166f, -0.014635f, 0.036855f, -0.052877f, 0.019976f, -0.008276f, 0.084511f, -0.004532f, 0.032722f, -0.166969f, -0.021494f, 0.001123f, 0.101609f, 0.078118f, -0.002530f, -0.050683f, -0.014108f, 0.120400f, 0.054463f, -0.143383f, -0.176825f, -0.069879f, 0.035086f, 0.272962f, 0.029233f, -0.048578f, 0.037361f, -0.074339f, 0.194263f, 0.058399f, -0.155316f, -0.097959f, -0.019664f, 0.136401f, 0.020305f, -0.058278f, -0.053374f, -0.050109f, 0.038822f, 0.072933f, 0.036796f, -0.080790f, -0.006914f, -0.028496f, 0.065515f, -0.008236f, 0.039527f, -0.015099f, -0.017021f, -0.054000f, 0.020364f, -0.017339f, -0.005864f, 0.039966f, -0.064819f, 0.036604f, -0.009960f, -0.011037f, 0.000095f, 0.028641f, 0.063903f, 0.031180f, 0.004184f, -0.013879f, 0.013414f, -0.001797f, 0.025869f, 0.007306f, 0.028572f, 0.005866f, 0.007137f, + -0.033771f, 0.014975f, 0.015822f, 0.011581f, -0.001090f, 0.009524f, 0.004703f, 0.028354f, 0.032953f, 0.026455f, 0.002418f, -0.018701f, -0.028744f, 0.008104f, 0.012743f, -0.016575f, 0.013974f, -0.023037f, 0.058415f, -0.067342f, 0.002098f, -0.027114f, 0.015567f, -0.041726f, 0.039150f, 0.010778f, -0.022178f, -0.042099f, -0.020626f, -0.008035f, 0.012285f, -0.057448f, 0.013288f, -0.028176f, -0.010883f, -0.045010f, -0.021096f, 0.036344f, -0.038255f, -0.013638f, -0.005189f, 0.017713f, 0.012136f, -0.015028f, 0.020730f, -0.032993f, -0.002509f, 0.000296f, 0.017774f, -0.021658f, 0.031375f, 0.023216f, -0.023642f, -0.027642f, -0.010381f, 0.044323f, -0.031856f, 0.013909f, 0.033178f, 0.007232f, -0.032024f, -0.012463f, 0.014027f, -0.020347f, 0.015182f, 0.001320f, 0.007448f, -0.029878f, 0.006448f, -0.024330f, -0.000842f, 0.022318f, 0.028600f, 0.021932f, -0.016193f, 0.020914f, 0.002904f, -0.026601f, -0.003678f, -0.000240f, 0.031830f, -0.008845f, 0.006919f, 0.027274f, -0.005652f, -0.035936f, 0.050226f, -0.020475f, 0.029831f, 0.021490f, 0.005382f, 0.006804f, -0.020810f, -0.026078f, 0.034713f, 0.005133f, + 0.030582f, 0.009021f, 0.016806f, 0.008283f, -0.000644f, -0.001706f, -0.026153f, 0.002880f, 0.007395f, 0.009224f, 0.010779f, -0.003383f, 0.012506f, 0.001981f, -0.001274f, 0.003234f, 0.001869f, 0.012479f, -0.003130f, 0.009702f, -0.011840f, -0.003229f, 0.000310f, 0.000836f, -0.006519f, -0.004021f, 0.023702f, 0.014588f, -0.003653f, -0.016888f, -0.018608f, -0.007183f, -0.007312f, 0.021223f, 0.002484f, -0.006632f, -0.013794f, -0.007463f, 0.002348f, -0.011943f, 0.025005f, 0.002074f, -0.009656f, 0.003983f, -0.000105f, -0.004708f, 0.007331f, -0.007473f, 0.021782f, -0.020397f, 0.015084f, -0.019867f, -0.054606f, 0.101291f, 0.008928f, 0.005261f, -0.041333f, 0.023275f, -0.003754f, 0.026373f, 0.020024f, 0.030915f, 0.003148f, 0.007663f, -0.017851f, 0.004770f, 0.028302f, -0.003091f, 0.015354f, -0.002774f, 0.004689f, 0.006041f, 0.011308f, -0.012405f, 0.021356f, -0.015029f, 0.001702f, -0.002662f, 0.007056f, -0.002220f, 0.004069f, 0.016175f, 0.017775f, -0.009010f, 0.007687f, 0.003235f, -0.004320f, -0.008044f, 0.023770f, -0.007680f, 0.004812f, -0.007128f, 0.012301f, -0.000363f, -0.011797f, 0.023886f, + -0.015299f, -0.005487f, 0.006139f, -0.011657f, -0.007151f, -0.003817f, 0.000737f, -0.004638f, 0.000148f, -0.002603f, -0.006507f, 0.007932f, -0.015816f, 0.009531f, 0.006403f, -0.005605f, 0.010068f, -0.008117f, 0.011974f, -0.006571f, 0.002110f, 0.002119f, -0.007587f, 0.011765f, -0.000215f, 0.001409f, -0.004025f, 0.015939f, -0.019461f, 0.020250f, -0.014749f, 0.002203f, 0.003321f, -0.000826f, 0.003588f, -0.003526f, 0.011668f, -0.011404f, 0.000595f, 0.009957f, -0.012493f, 0.007472f, 0.006771f, -0.002056f, 0.001331f, 0.006720f, 0.003125f, -0.003473f, 0.004456f, 0.001021f, -0.001758f, 0.000717f, 0.003893f, 0.000240f, -0.005350f, 0.001169f, 0.001948f, -0.002891f, 0.005786f, -0.001549f, 0.004726f, -0.003391f, 0.000640f, 0.003623f, -0.002687f, 0.000388f, 0.002496f, -0.004077f, 0.006368f, -0.000866f, 0.003069f, -0.001081f, 0.006715f, -0.002676f, 0.000666f, 0.006201f, -0.005805f, 0.007211f, -0.004455f, 0.002993f, -0.004575f, 0.007073f, -0.001255f, 0.019449f, -0.092700f, -0.230811f, 0.035894f, 0.175833f, 0.163356f, 0.283393f, -0.072311f, -0.075823f, -0.192923f, -0.263388f, -0.054305f, 0.095298f, + 0.101945f, 0.192024f, 0.104295f, 0.008271f, -0.049856f, -0.133994f, -0.095290f, -0.016413f, -0.014922f, 0.047806f, 0.044297f, 0.025659f, 0.016338f, 0.012925f, -0.007082f, -0.032886f, -0.002572f, 0.038098f, 0.000271f, 0.008059f, -0.002202f, -0.028476f, -0.021869f, -0.048467f, -0.047567f, 0.021615f, 0.019864f, 0.044155f, 0.067027f, 0.050305f, 0.024513f, 0.008942f, -0.072428f, -0.051138f, -0.039653f, -0.039626f, -0.044314f, 0.009311f, 0.028188f, 0.049154f, 0.062658f, 0.051947f, 0.011258f, -0.006056f, -0.041643f, -0.042386f, -0.025287f, -0.012217f, 0.004020f, 0.007078f, 0.014005f, 0.001324f, -0.013643f, 0.004696f, -0.021743f, 0.011406f, 0.018365f, 0.002209f, 0.036826f, 0.044699f, 0.013729f, -0.008374f, -0.049135f, -0.064523f, -0.026096f, -0.011818f, -0.007615f, 0.032986f, 0.025397f, -0.006591f, 0.028811f, 0.031477f, 0.017466f, 0.021786f, -0.012084f, -0.023174f, -0.018820f, -0.026678f, -0.021367f, -0.003827f, -0.020519f, -0.007948f, 0.001013f, 0.016514f, 0.023038f, 0.033507f, 0.028708f, 0.026695f, 0.020981f, -0.010822f, -0.025131f, -0.041843f, -0.051872f, -0.029969f, -0.022585f, 0.003066f, + 0.024554f, 0.036528f, 0.042037f, 0.033495f, 0.030572f, 0.019958f, -0.026277f, -0.046472f, -0.042249f, -0.020427f, -0.006173f, -0.001730f, 0.003006f, 0.018006f, 0.015541f, 0.007701f, 0.003414f, 0.014780f, 0.008110f, 0.012891f, 0.003372f, -0.019324f, -0.021625f, -0.013895f, -0.005864f, 0.006953f, 0.004580f, -0.006837f, -0.004183f, 0.006940f, 0.003304f, 0.003158f, 0.008746f, 0.014615f, 0.006349f, 0.000643f, -0.007362f, -0.007932f, -0.007131f, -0.008100f, -0.011198f, -0.007933f, -0.000840f, 0.006616f, 0.008465f, 0.011794f, 0.012030f, 0.007163f, -0.000620f, -0.005099f, -0.007062f, -0.005913f, -0.006158f, -0.004034f, -0.003257f, -0.000538f, 0.002771f, 0.004977f, 0.003519f, 0.002611f, 0.001592f, 0.002657f, 0.001215f, -0.000728f, -0.004679f, -0.003913f, -0.001699f, 0.001768f, 0.001984f, 0.000962f, -0.002012f, -0.001206f, -0.000540f, 0.000267f, 0.000000f, 0.001409f, 0.001784f, 0.001194f, -0.000917f, -0.000374f, 0.000156f, 0.001117f, 0.000420f, -0.000294f, -0.001483f, -0.001484f, -0.001668f, -0.000346f, 0.000428f, 0.000642f, -0.000055f, 0.000736f, 0.001315f, 0.002168f, 0.001130f, 0.000007f, + -0.001454f, -0.001607f, -0.001675f, -0.000721f, -0.000382f, 0.000006f, 0.000221f, 0.001077f, 0.000745f, 0.000498f, -0.000116f, -0.000016f, -0.000201f, -0.000059f, -0.000154f, 0.000205f, 0.000009f, -0.000194f, -0.000556f, -0.000217f, -0.000075f, 0.000191f, 0.000010f, 0.000074f, -0.000038f, 0.000064f, 0.000024f, 0.000152f, 0.000066f, 0.000093f, 0.000018f, 0.000018f, -0.000053f, -0.000073f, -0.000088f} + }, + { + {-0.010865f, -0.000140f, 0.002388f, 0.001813f, 0.007766f, 0.001027f, -0.000944f, -0.004995f, 0.011409f, 0.007051f, 0.000378f, -0.001398f, 0.011333f, 0.003853f, -0.003612f, -0.009926f, 0.006346f, -0.002854f, 0.004929f, -0.009447f, 0.000616f, -0.002254f, -0.007018f, -0.001898f, -0.003529f, -0.001302f, 0.000544f, 0.000052f, -0.005116f, -0.003139f, -0.000809f, -0.000981f, -0.003180f, 0.003416f, -0.000323f, -0.003403f, 0.006079f, -0.010099f, -0.004788f, 0.004829f, -0.006063f, 0.000841f, -0.003762f, -0.005542f, 0.003776f, 0.003429f, -0.002973f, 0.003798f, 0.007314f, 0.004120f, -0.003789f, -0.004433f, 0.000801f, 0.001441f, -0.004468f, 0.004847f, 0.008065f, -0.006873f, -0.002196f, 0.003972f, 0.002971f, -0.001635f, -0.002103f, -0.003355f, 0.004445f, 0.001356f, -0.005324f, 0.006060f, 0.002950f, -0.004971f, -0.003730f, 0.006372f, -0.004805f, -0.006137f, -0.011571f, -0.010057f, 0.005476f, 0.006338f, 0.000507f, 0.002784f, -0.001100f, 0.002280f, -0.004287f, 0.006501f, -0.000543f, 0.003010f, -0.002982f, 0.001680f, -0.002717f, -0.002117f, 0.000098f, 0.004166f, -0.000924f, -0.001059f, -0.001870f, 0.000622f, + -0.001414f, 0.000289f, 0.000482f, -0.000859f, -0.001019f, 0.000134f, -0.000063f, -0.000337f, -0.001118f, 0.000564f, -0.000418f, 0.014501f, -0.001406f, -0.002944f, -0.005953f, 0.009277f, -0.004956f, -0.000542f, -0.007559f, -0.008068f, -0.010140f, -0.004780f, 0.007933f, -0.008236f, -0.003084f, -0.002908f, 0.002744f, -0.002063f, -0.011294f, 0.005865f, 0.002818f, 0.021922f, -0.002249f, 0.010247f, -0.002056f, -0.000560f, -0.001002f, 0.001116f, -0.004634f, 0.008478f, -0.002239f, -0.001731f, -0.005135f, -0.000959f, -0.001841f, 0.013146f, 0.002438f, -0.001353f, -0.012346f, -0.001283f, -0.002380f, 0.003702f, -0.007848f, -0.002193f, 0.002117f, 0.001747f, -0.002175f, -0.001347f, -0.004878f, -0.001858f, -0.005862f, -0.002661f, 0.011364f, -0.003371f, 0.003595f, 0.006321f, -0.001540f, -0.006205f, -0.008112f, 0.002079f, 0.001900f, 0.002422f, 0.005037f, 0.005946f, 0.004917f, 0.002816f, -0.002255f, -0.002214f, -0.002609f, -0.011445f, -0.002732f, -0.001191f, 0.005528f, 0.004684f, -0.002822f, -0.000308f, 0.006072f, -0.006365f, 0.002496f, 0.000149f, -0.001582f, -0.003697f, -0.005582f, -0.000102f, 0.003323f, 0.003325f, + 0.003540f, -0.001514f, 0.001456f, -0.001358f, 0.000298f, 0.004941f, 0.002020f, 0.000349f, 0.000046f, -0.000797f, -0.000116f, 0.000280f, 0.000994f, -0.000671f, -0.000692f, 0.002120f, 0.001110f, 0.002159f, 0.002259f, 0.000422f, 0.001258f, -0.000365f, 0.000368f, 0.000121f, -0.001004f, -0.002599f, -0.000459f, -0.019172f, -0.004633f, -0.000324f, -0.004052f, -0.002794f, 0.006792f, -0.013453f, -0.011265f, -0.006576f, -0.004364f, 0.001975f, 0.015238f, -0.003246f, 0.000021f, 0.001876f, -0.010832f, -0.002800f, -0.009038f, -0.001360f, 0.016135f, -0.001196f, -0.007772f, -0.005043f, 0.000254f, 0.003326f, 0.003274f, -0.004468f, -0.020320f, -0.009708f, -0.002675f, -0.007821f, 0.000775f, 0.000412f, 0.008301f, -0.005283f, 0.007379f, 0.001831f, -0.003721f, -0.010870f, -0.009088f, 0.012675f, -0.010391f, 0.006982f, 0.002081f, -0.006654f, -0.002459f, -0.005938f, -0.004241f, 0.005990f, -0.011165f, 0.005841f, 0.002022f, -0.000138f, 0.001931f, 0.000828f, -0.001067f, 0.000292f, -0.005632f, -0.007753f, 0.000611f, -0.002334f, -0.005704f, -0.002285f, -0.008848f, 0.010388f, 0.007137f, 0.001830f, 0.008523f, 0.001046f, + -0.003550f, 0.010554f, -0.005497f, -0.003440f, -0.003520f, 0.008042f, -0.007761f, 0.003516f, 0.005678f, 0.000356f, 0.003538f, 0.008754f, 0.003247f, -0.000223f, 0.000608f, 0.001897f, 0.001505f, -0.001677f, -0.000988f, 0.000150f, -0.000392f, 0.002838f, 0.001416f, 0.002998f, 0.002256f, 0.000884f, -0.002613f, -0.003092f, 0.001947f, -0.000072f, -0.000123f, 0.002900f, -0.001940f, -0.001554f, 0.000009f, 0.000724f, 0.000996f, -0.000247f, -0.003161f, 0.002712f, 0.000774f, -0.002361f, -0.013081f, 0.015700f, 0.017832f, 0.004781f, 0.004688f, -0.005291f, 0.008239f, 0.004061f, -0.010657f, 0.003150f, 0.006623f, -0.012700f, -0.011111f, 0.010892f, -0.009753f, -0.001530f, -0.006337f, 0.010981f, 0.002286f, -0.001404f, -0.004231f, -0.000213f, -0.007345f, 0.006563f, -0.003737f, 0.003925f, -0.001875f, -0.000183f, 0.007091f, 0.002720f, 0.000877f, -0.002922f, 0.006944f, 0.004381f, 0.001968f, -0.000727f, 0.007187f, -0.000688f, 0.001197f, -0.004739f, 0.008790f, 0.001895f, 0.003418f, 0.006428f, -0.018092f, -0.005939f, -0.003686f, -0.006533f, -0.006396f, 0.001716f, 0.009863f, -0.004426f, -0.002823f, -0.005585f, + -0.002606f, 0.002064f, 0.004252f, -0.012449f, -0.000897f, 0.004220f, 0.000348f, -0.001073f, 0.005212f, 0.003404f, -0.011735f, -0.003331f, -0.002677f, 0.007076f, -0.007775f, 0.010034f, 0.010791f, 0.005646f, 0.002099f, -0.005193f, -0.000432f, 0.000789f, 0.007158f, -0.002050f, 0.000716f, 0.000795f, 0.000942f, 0.010736f, 0.001015f, 0.011447f, 0.004088f, 0.000082f, -0.005696f, -0.003244f, 0.004552f, -0.001054f, -0.000182f, 0.000375f, 0.000106f, 0.000969f, 0.004632f, 0.001290f, 0.001698f, 0.000102f, 0.001631f, -0.003926f, -0.000513f, 0.001133f, 0.001342f, -0.001067f, -0.000810f, -0.000057f, 0.001334f, -0.001226f, -0.001044f, 0.001526f, 0.001346f, 0.002830f, 0.001146f, 0.002613f, -0.001807f, 0.000133f, 0.000108f, -0.001143f, 0.002334f, 0.003592f, 0.019992f, -0.003616f, -0.000200f, 0.007350f, 0.004793f, 0.003602f, 0.006802f, 0.017759f, -0.004845f, -0.001547f, -0.016948f, 0.000412f, -0.014549f, -0.018499f, 0.000755f, 0.007986f, -0.023893f, 0.008214f, 0.007943f, 0.004372f, -0.007187f, -0.005689f, -0.007845f, -0.002946f, 0.000562f, 0.000573f, 0.007730f, 0.010143f, -0.001277f, -0.009854f, + -0.005914f, 0.007523f, -0.010553f, -0.005242f, -0.008901f, 0.002006f, -0.014451f, 0.007317f, 0.001264f, -0.000926f, 0.002456f, -0.000411f, -0.003216f, 0.000070f, 0.009493f, -0.010765f, 0.013226f, -0.009898f, -0.001039f, 0.002470f, -0.006479f, -0.005343f, 0.005254f, 0.002577f, -0.001963f, -0.005011f, 0.009909f, 0.004129f, -0.006688f, -0.013612f, 0.001716f, 0.003207f, 0.008127f, -0.000287f, -0.003400f, 0.000733f, 0.004371f, -0.003211f, 0.019136f, -0.006318f, -0.002948f, -0.013513f, -0.008838f, 0.021471f, 0.008845f, -0.004726f, -0.001082f, -0.007419f, -0.008197f, -0.000634f, 0.003130f, 0.000601f, -0.003900f, 0.004657f, 0.002699f, 0.006442f, -0.000526f, -0.004614f, 0.002026f, 0.000215f, -0.001962f, 0.001899f, 0.001967f, -0.000466f, 0.000995f, 0.002555f, 0.000999f, -0.000584f, -0.001762f, 0.001078f, 0.000831f, -0.001779f, 0.003692f, 0.002985f, 0.001135f, -0.001741f, -0.004342f, 0.000333f, -0.000179f, -0.000167f, 0.002175f, -0.002227f, 0.001637f, 0.002375f, 0.000753f, -0.001357f, 0.005584f, 0.012920f, -0.017020f, -0.010015f, 0.012078f, -0.008873f, -0.009452f, -0.010392f, -0.012437f, 0.009112f, + -0.003066f, -0.000276f, -0.002782f, 0.000568f, -0.013849f, -0.002690f, 0.006488f, 0.007075f, 0.001690f, -0.007274f, -0.010605f, -0.008794f, -0.011196f, 0.002383f, 0.013582f, 0.001906f, 0.004464f, 0.004710f, 0.004599f, -0.007834f, 0.008409f, 0.005256f, -0.005831f, -0.004687f, -0.018192f, 0.002901f, 0.004185f, -0.014283f, -0.001040f, 0.004504f, -0.002598f, 0.001860f, -0.001198f, -0.015333f, 0.013209f, -0.014279f, 0.011391f, 0.000690f, 0.005788f, -0.016084f, -0.008947f, -0.014395f, -0.011317f, 0.002187f, -0.003975f, -0.005065f, -0.006339f, 0.000031f, 0.007296f, -0.013317f, -0.000137f, 0.003962f, -0.004234f, -0.014859f, -0.009260f, -0.003054f, 0.002904f, 0.007317f, 0.003238f, -0.012229f, 0.013215f, -0.004163f, -0.002779f, 0.013113f, -0.017027f, -0.005568f, -0.003325f, -0.002997f, 0.020573f, -0.007411f, -0.000263f, -0.007694f, -0.006340f, 0.003778f, 0.002907f, -0.000416f, 0.002279f, -0.001587f, -0.002804f, 0.003874f, 0.000138f, 0.001609f, 0.001723f, 0.004994f, -0.001855f, 0.001484f, 0.001185f, 0.000382f, 0.001383f, -0.005595f, 0.007423f, 0.006700f, -0.002189f, -0.001114f, 0.001129f, -0.000931f, + 0.001343f, 0.000246f, -0.000431f, -0.002677f, 0.001746f, -0.001370f, 0.000728f, 0.006514f, 0.004223f, 0.003511f, -0.002588f, 0.004652f, 0.001928f, -0.001848f, 0.002187f, 0.000727f, 0.001639f, 0.000550f, 0.026277f, -0.023674f, -0.012541f, -0.015814f, 0.011197f, 0.004137f, -0.008142f, 0.005191f, -0.000259f, 0.015582f, 0.000854f, 0.000028f, -0.015294f, 0.010572f, 0.017215f, 0.018069f, 0.014998f, -0.008570f, -0.001430f, 0.002206f, -0.009814f, -0.006752f, 0.002404f, 0.000968f, -0.014081f, -0.006964f, -0.006014f, 0.006684f, -0.001192f, -0.010664f, -0.004983f, 0.003334f, 0.008242f, 0.000907f, -0.003057f, 0.000006f, -0.007540f, -0.000335f, -0.000596f, 0.001015f, -0.016084f, 0.009189f, 0.010844f, 0.002142f, 0.005526f, 0.006419f, -0.013046f, 0.018362f, 0.016513f, 0.002968f, -0.011628f, 0.006499f, -0.004198f, -0.017175f, -0.004470f, -0.005482f, -0.000385f, 0.000961f, -0.000444f, -0.010406f, -0.009335f, -0.021305f, -0.017809f, 0.000173f, 0.010610f, -0.009795f, 0.004406f, 0.001318f, -0.006678f, -0.017363f, -0.001826f, 0.010050f, -0.006819f, 0.009015f, 0.017747f, 0.005370f, -0.007479f, 0.010247f, + -0.000141f, -0.001132f, 0.004781f, 0.007969f, -0.000799f, -0.001439f, 0.002125f, 0.005132f, -0.002955f, -0.011671f, 0.000578f, -0.000366f, 0.001141f, 0.001407f, 0.003805f, 0.008478f, -0.003143f, -0.001532f, 0.006342f, 0.005808f, 0.001166f, 0.000814f, -0.004228f, 0.008173f, 0.000837f, -0.000586f, 0.004832f, 0.001507f, 0.001707f, 0.000800f, 0.004350f, 0.003915f, 0.004327f, 0.007218f, 0.000492f, 0.004294f, 0.000530f, 0.004785f, 0.002210f, 0.002700f, 0.001794f, 0.004528f, 0.003945f, 0.003242f, -0.025246f, 0.002584f, -0.009475f, -0.033791f, -0.026012f, 0.006407f, 0.000164f, -0.005892f, 0.005933f, 0.016137f, -0.002653f, 0.009638f, 0.008537f, 0.004925f, -0.002657f, -0.008856f, 0.007096f, -0.007555f, 0.000835f, -0.006500f, 0.010069f, 0.018462f, -0.016745f, -0.004887f, 0.000971f, 0.006657f, 0.001738f, -0.005279f, -0.003093f, -0.006299f, -0.000541f, -0.007777f, 0.009745f, 0.002070f, -0.011785f, 0.012963f, -0.013138f, -0.004274f, 0.015965f, 0.014028f, 0.011856f, -0.013695f, -0.008982f, -0.012281f, 0.014075f, 0.019052f, -0.000336f, -0.004069f, 0.015142f, -0.022480f, 0.002704f, 0.005891f, + -0.002209f, -0.018911f, 0.016871f, 0.005817f, 0.008553f, 0.015766f, 0.000801f, -0.022802f, 0.005914f, 0.009195f, -0.005849f, -0.001811f, 0.015598f, -0.016334f, -0.015253f, -0.013257f, 0.001551f, 0.020026f, 0.010861f, -0.003043f, 0.023042f, -0.030840f, -0.011362f, 0.000224f, 0.014738f, 0.006738f, -0.004472f, -0.024547f, -0.003842f, -0.009937f, 0.002686f, 0.009131f, 0.023748f, 0.003901f, -0.006745f, 0.002959f, -0.004078f, -0.001741f, -0.007893f, -0.000125f, -0.006508f, 0.002058f, 0.006460f, 0.003512f, 0.005945f, 0.006575f, 0.002117f, 0.001276f, 0.000029f, 0.001024f, -0.003283f, -0.003586f, 0.000285f, 0.006934f, 0.002668f, -0.001053f, 0.001244f, 0.002678f, 0.005699f, 0.000575f, -0.001926f, 0.000784f, -0.001880f, 0.004399f, -0.008515f, -0.005353f, -0.003771f, 0.005127f, 0.004598f, -0.007650f, 0.001654f, -0.027200f, 0.027307f, 0.011044f, -0.000761f, -0.002877f, 0.002212f, 0.004615f, 0.014752f, -0.002908f, 0.001548f, -0.004840f, -0.003519f, 0.008283f, 0.004226f, 0.009632f, 0.004189f, 0.005524f, -0.018607f, -0.007765f, 0.030980f, 0.003057f, 0.009145f, 0.012965f, 0.004812f, -0.010620f, + -0.019623f, 0.005993f, -0.008239f, 0.000645f, 0.006782f, -0.009813f, -0.011524f, 0.013842f, 0.016263f, -0.008609f, -0.006142f, 0.012576f, -0.015653f, 0.006726f, -0.012068f, 0.005302f, -0.011682f, 0.016737f, 0.002256f, -0.002321f, 0.005832f, 0.028821f, 0.007887f, 0.011108f, -0.003354f, 0.001377f, 0.004839f, 0.021258f, -0.001941f, 0.030508f, 0.000820f, 0.014444f, -0.000619f, 0.027529f, 0.009689f, 0.020519f, 0.015556f, -0.003577f, -0.009335f, -0.002595f, -0.010651f, -0.011756f, 0.016106f, -0.003377f, -0.006421f, 0.002406f, 0.000145f, -0.008393f, -0.004127f, 0.002413f, 0.007159f, 0.001895f, -0.013949f, -0.013845f, -0.007225f, -0.014134f, -0.000458f, -0.000412f, -0.004210f, 0.003767f, -0.000366f, 0.005582f, -0.000924f, -0.005835f, 0.001094f, -0.002533f, -0.010648f, -0.006781f, 0.001427f, 0.014010f, -0.006038f, 0.005112f, -0.001677f, -0.000273f, 0.006472f, -0.005035f, 0.002149f, 0.003088f, -0.003665f, -0.002571f, -0.001839f, -0.004167f, 0.001920f, -0.005180f, -0.006666f, -0.002639f, -0.007215f, 0.008836f, -0.002583f, 0.000421f, -0.000834f, -0.000659f, 0.000887f, -0.003095f, 0.001265f, 0.002140f, + 0.001109f, 0.003524f, 0.004796f, 0.000729f, 0.003564f, -0.002832f, -0.007779f, 0.001410f, -0.002185f, 0.003107f, -0.003203f, 0.031936f, -0.008191f, -0.000123f, -0.039017f, -0.001237f, 0.021080f, -0.010803f, 0.018334f, -0.024757f, 0.003760f, 0.002660f, -0.000582f, -0.032880f, -0.001353f, -0.054891f, 0.002731f, -0.005913f, -0.022925f, -0.003863f, 0.003218f, -0.011922f, 0.002221f, 0.014075f, 0.002263f, -0.012443f, 0.002462f, -0.003743f, 0.012326f, -0.013390f, 0.000904f, 0.017813f, 0.004091f, 0.001623f, -0.002523f, 0.013690f, -0.008601f, 0.001581f, 0.000052f, 0.010546f, 0.002113f, -0.018416f, -0.009793f, -0.012941f, 0.015462f, -0.034635f, 0.016943f, 0.014016f, 0.011995f, 0.006811f, 0.002690f, -0.015066f, 0.010949f, -0.022391f, -0.005250f, -0.004573f, -0.004588f, -0.000828f, 0.001519f, 0.007416f, -0.017262f, -0.006643f, 0.029357f, 0.012439f, -0.010586f, -0.012233f, 0.003270f, -0.004979f, 0.009007f, -0.005774f, -0.001722f, -0.009295f, 0.026622f, 0.013699f, -0.009028f, 0.001843f, -0.013437f, 0.003318f, -0.010126f, -0.003343f, 0.010615f, 0.010018f, -0.002992f, 0.019556f, -0.007536f, 0.009798f, + -0.012619f, 0.013714f, 0.002045f, -0.007677f, -0.010619f, -0.015712f, 0.004098f, -0.001556f, 0.007311f, -0.001843f, -0.004641f, 0.003114f, 0.003030f, 0.005009f, 0.003937f, 0.009076f, -0.000286f, 0.003054f, -0.006806f, 0.005740f, -0.004874f, -0.002276f, -0.003647f, -0.000529f, -0.008685f, -0.001300f, 0.003453f, 0.008088f, -0.007463f, -0.003420f, -0.005385f, 0.005615f, 0.004201f, -0.003262f, -0.000650f, -0.005626f, 0.004517f, 0.000745f, 0.020072f, 0.020284f, 0.011734f, 0.010472f, -0.010005f, 0.011661f, 0.019490f, -0.014641f, -0.000621f, -0.037855f, 0.021537f, 0.014680f, -0.005484f, 0.008664f, -0.002535f, 0.002936f, 0.013367f, -0.008539f, 0.020968f, -0.019084f, 0.001726f, 0.023653f, 0.010285f, 0.001384f, 0.018207f, -0.006554f, 0.008304f, 0.004756f, 0.009703f, 0.016144f, -0.009693f, -0.002011f, 0.029794f, 0.014885f, -0.000768f, 0.004063f, -0.020377f, 0.027459f, -0.023288f, -0.001522f, 0.023984f, 0.007421f, 0.025830f, -0.016343f, 0.004043f, -0.001110f, -0.006469f, 0.003426f, -0.025185f, -0.017636f, 0.023504f, -0.011819f, -0.005183f, -0.008040f, -0.026778f, 0.018882f, -0.006408f, -0.004461f, + -0.011935f, 0.011601f, 0.026958f, -0.021395f, -0.004474f, 0.018222f, -0.020186f, -0.008789f, 0.016188f, 0.022729f, -0.037761f, -0.010072f, -0.003359f, 0.016026f, -0.000701f, 0.018723f, -0.004688f, -0.013769f, 0.000780f, 0.009956f, 0.024166f, 0.012231f, -0.016467f, -0.000873f, 0.011821f, -0.024245f, -0.014967f, -0.004657f, -0.012543f, -0.012631f, -0.001620f, 0.011482f, -0.011009f, 0.002679f, 0.011845f, 0.003320f, 0.002012f, 0.008371f, -0.002208f, 0.005389f, 0.005073f, 0.005103f, 0.002801f, -0.000957f, -0.007430f, -0.002486f, -0.002164f, -0.006646f, -0.003138f, 0.001036f, 0.000725f, -0.000991f, 0.000910f, 0.007341f, -0.006177f, -0.001950f, -0.004620f, 0.003526f, 0.003317f, -0.001428f, -0.005136f, -0.011072f, 0.005465f, 0.004237f, 0.007084f, 0.001986f, 0.001639f, -0.000769f, -0.007006f, 0.002794f, -0.002885f, -0.003136f, -0.002119f, 0.001923f, -0.001355f, 0.019681f, 0.041719f, 0.008057f, -0.024685f, -0.008801f, 0.008177f, -0.054747f, 0.001709f, 0.000329f, -0.008591f, -0.002690f, 0.025265f, -0.041315f, 0.009063f, 0.019313f, -0.015219f, 0.017118f, 0.031903f, 0.007920f, -0.029534f, 0.007993f, + -0.007460f, -0.000529f, -0.028954f, -0.008728f, 0.026349f, -0.002954f, 0.024155f, -0.006356f, -0.008516f, 0.003971f, -0.020510f, -0.011496f, -0.014777f, -0.010914f, -0.008096f, 0.019757f, -0.021854f, 0.003564f, 0.038056f, 0.025744f, 0.008544f, -0.038713f, 0.006388f, 0.025437f, 0.010583f, 0.001536f, -0.013870f, -0.016794f, -0.041409f, -0.028541f, 0.005848f, -0.014109f, -0.014198f, -0.000785f, 0.017604f, 0.012544f, -0.012499f, 0.000575f, 0.025070f, -0.009645f, -0.004325f, 0.001177f, 0.032976f, 0.001293f, -0.001737f, 0.016845f, 0.005187f, -0.037574f, 0.010471f, 0.010934f, -0.000265f, -0.031108f, 0.013063f, 0.018287f, -0.013777f, -0.009724f, -0.025630f, 0.006844f, -0.009466f, 0.009714f, 0.004768f, -0.005972f, -0.010919f, 0.007096f, 0.003142f, 0.010934f, -0.005511f, 0.017028f, 0.005911f, -0.011605f, 0.001306f, -0.000557f, -0.016097f, 0.000348f, 0.001199f, -0.000007f, -0.000426f, -0.008386f, -0.007399f, -0.003349f, -0.000305f, 0.010696f, 0.003429f, 0.005616f, 0.008516f, -0.003890f, -0.005223f, 0.004141f, -0.008441f, -0.007417f, -0.000425f, -0.000367f, 0.002484f, -0.002421f, 0.001769f, 0.005287f, + 0.005460f, 0.000742f, -0.003429f, -0.000750f, -0.000562f, -0.000894f, -0.000066f, -0.001341f, 0.000533f, -0.000145f, 0.007115f, -0.004125f, -0.005350f, 0.013257f, 0.009315f, -0.001236f, 0.003520f, -0.005941f, 0.002535f, 0.000186f, -0.002506f, -0.012602f, 0.042830f, 0.002079f, -0.008985f, -0.000882f, 0.018773f, -0.009476f, 0.004971f, -0.004923f, 0.004221f, 0.016060f, -0.030077f, 0.031195f, 0.035374f, 0.009754f, 0.014815f, -0.012359f, 0.019946f, 0.046668f, 0.001260f, -0.005651f, -0.008908f, 0.019712f, -0.007338f, -0.011629f, -0.004214f, 0.006819f, -0.023629f, 0.010138f, -0.020840f, 0.023295f, 0.005115f, 0.023461f, -0.015125f, 0.021362f, 0.006206f, 0.028043f, 0.004459f, 0.005701f, -0.010358f, 0.017369f, 0.004192f, -0.005846f, 0.025204f, -0.010161f, -0.018336f, 0.035716f, 0.028471f, 0.010351f, 0.026901f, 0.039106f, 0.047480f, -0.015080f, -0.015165f, -0.017076f, 0.005755f, -0.022149f, 0.025636f, -0.003439f, -0.002566f, -0.036913f, 0.008317f, 0.041376f, 0.042181f, -0.001875f, -0.005752f, -0.029321f, 0.000261f, 0.027392f, -0.014300f, -0.017463f, 0.015435f, 0.002227f, -0.015256f, 0.005123f, + -0.002635f, -0.009423f, -0.002264f, -0.008112f, -0.000502f, 0.015808f, 0.011739f, -0.003480f, 0.002688f, -0.004090f, -0.016187f, -0.021080f, -0.004064f, 0.010187f, 0.004039f, 0.014507f, -0.003134f, -0.014076f, -0.003961f, 0.015054f, -0.007336f, 0.008480f, 0.013892f, -0.014342f, -0.003923f, -0.001577f, 0.003438f, -0.000963f, 0.009229f, 0.006678f, 0.003241f, -0.014288f, 0.003422f, 0.007523f, 0.002197f, 0.002980f, 0.004950f, -0.012695f, -0.005984f, -0.000179f, -0.000782f, -0.006822f, -0.016373f, -0.005449f, 0.001297f, 0.008231f, 0.001722f, -0.006836f, -0.007883f, 0.002918f, -0.056092f, -0.039087f, 0.021112f, 0.008410f, -0.029225f, 0.003409f, 0.013460f, -0.026638f, -0.016602f, -0.011295f, 0.032553f, 0.014759f, 0.010669f, -0.009897f, -0.007473f, -0.007802f, -0.019651f, -0.026410f, -0.046697f, 0.024856f, 0.021410f, -0.009668f, 0.053583f, 0.025872f, 0.051470f, 0.035364f, 0.003686f, -0.016031f, 0.013957f, 0.006594f, 0.023654f, 0.026999f, 0.029920f, -0.003921f, -0.004742f, 0.012882f, -0.012880f, -0.002773f, -0.011295f, -0.021736f, -0.035780f, -0.010255f, 0.037364f, -0.008837f, -0.014268f, -0.020585f, + 0.015153f, 0.022645f, 0.015348f, 0.001767f, 0.022228f, 0.042688f, -0.024801f, -0.011243f, -0.018974f, -0.013832f, -0.040352f, -0.009704f, 0.010829f, -0.018304f, -0.014038f, -0.046761f, -0.066480f, 0.007622f, -0.043624f, -0.069182f, -0.049738f, -0.020871f, 0.045486f, 0.015812f, 0.027968f, 0.020839f, -0.045768f, -0.019289f, 0.004540f, 0.023471f, -0.022462f, -0.027032f, -0.025825f, -0.007964f, 0.014329f, -0.015445f, -0.057149f, -0.036088f, -0.007745f, -0.011465f, -0.003591f, -0.008338f, 0.033154f, 0.029962f, 0.031398f, 0.031654f, 0.011039f, -0.000054f, 0.012402f, 0.003506f, -0.000397f, 0.009496f, -0.025403f, -0.009849f, 0.011896f, 0.015420f, -0.000089f, -0.008280f, -0.008782f, 0.004008f, -0.013532f, -0.020402f, 0.019549f, -0.015161f, -0.007132f, 0.001873f, -0.017255f, -0.016724f, -0.029887f, -0.011764f, -0.006515f, 0.002326f, 0.026180f, -0.006413f, -0.003106f, -0.007948f, 0.013696f, -0.006732f, 0.001397f, 0.012555f, 0.001709f, -0.008658f, 0.006425f, 0.012509f, -0.006889f, -0.001757f, 0.000338f, -0.004219f, 0.007648f, -0.106329f, -0.015787f, 0.035607f, -0.035498f, 0.016099f, -0.013186f, -0.057178f, + -0.017099f, 0.063493f, 0.079633f, -0.040624f, 0.002503f, -0.013272f, -0.063080f, -0.049957f, -0.047222f, -0.050388f, -0.026510f, -0.032519f, -0.001762f, 0.012115f, -0.007958f, 0.014244f, 0.013104f, -0.019966f, -0.004783f, -0.027812f, 0.013126f, -0.044427f, -0.040061f, 0.010959f, 0.008036f, -0.011295f, -0.014094f, 0.036842f, -0.009585f, 0.050730f, 0.011896f, 0.047108f, -0.030217f, 0.021148f, 0.013903f, 0.056829f, 0.030663f, 0.020655f, 0.006206f, 0.009557f, -0.005733f, 0.017495f, 0.023806f, -0.016890f, -0.024294f, 0.040121f, -0.004560f, -0.047802f, -0.093060f, -0.111791f, -0.080606f, 0.014623f, 0.000657f, -0.104026f, 0.034942f, 0.019006f, 0.027094f, -0.034752f, 0.005309f, 0.013469f, 0.005430f, 0.055040f, 0.055708f, 0.110967f, 0.037223f, -0.057495f, -0.074517f, -0.045143f, -0.040861f, -0.047000f, -0.042109f, -0.000406f, 0.024110f, 0.032624f, -0.019651f, 0.042606f, -0.034970f, -0.048621f, -0.038042f, -0.024609f, -0.018718f, -0.037760f, 0.024939f, -0.001621f, 0.023870f, 0.018947f, 0.003262f, 0.041864f, -0.020847f, -0.008278f, -0.040068f, 0.014729f, 0.022151f, -0.002341f, -0.003169f, 0.013329f, + -0.038492f, 0.002478f, -0.013424f, 0.008490f, -0.018346f, -0.025717f, 0.016626f, 0.000261f, -0.010733f, -0.003212f, 0.019453f, -0.013973f, 0.010232f, -0.012937f, 0.011591f, 0.010785f, -0.005165f, -0.012838f, 0.009072f, 0.010584f, -0.028392f, 0.012972f, -0.007015f, -0.007455f, -0.008540f, 0.007170f, -0.019135f, -0.008759f, 0.060236f, -0.016116f, -0.113824f, -0.032520f, 0.093697f, -0.012961f, 0.020889f, 0.013381f, 0.017482f, 0.032855f, 0.026854f, 0.009422f, -0.018594f, -0.006845f, 0.004625f, -0.020202f, -0.004751f, 0.034490f, -0.030854f, -0.018272f, -0.030936f, -0.007316f, 0.005265f, 0.004056f, 0.008127f, 0.016202f, -0.023556f, 0.021057f, 0.051240f, -0.000797f, -0.030018f, 0.002877f, -0.019672f, -0.006601f, 0.030348f, -0.031938f, 0.003541f, 0.010328f, 0.037117f, 0.054096f, -0.034384f, -0.019353f, 0.020767f, 0.003100f, 0.005772f, 0.006492f, -0.022867f, -0.057831f, -0.010519f, -0.026771f, 0.052698f, -0.100076f, -0.066141f, -0.026872f, -0.011109f, 0.029299f, 0.005891f, -0.035110f, -0.006166f, -0.040487f, -0.044295f, -0.015442f, -0.032099f, 0.006169f, 0.025930f, 0.121015f, 0.022110f, -0.017556f, + -0.077889f, -0.063430f, 0.018652f, -0.001559f, -0.073158f, 0.039742f, 0.038814f, -0.073700f, -0.001712f, 0.019710f, 0.021067f, 0.080367f, 0.034756f, 0.017147f, -0.079361f, -0.040275f, -0.054889f, 0.050080f, -0.005394f, -0.015783f, -0.009237f, 0.015967f, 0.051907f, 0.044917f, -0.023837f, -0.046369f, -0.068946f, 0.017130f, 0.040053f, -0.013775f, -0.007500f, 0.036216f, 0.019907f, 0.031642f, 0.007366f, 0.011628f, -0.026906f, -0.007332f, -0.013011f, 0.014009f, 0.013484f, -0.003140f, -0.006685f, -0.003372f, 0.018341f, 0.021819f, -0.031669f, 0.018585f, 0.013035f, 0.026267f, -0.017096f, -0.010842f, 0.015466f, 0.006300f, -0.023117f, -0.001736f, 0.025689f, 0.005617f, -0.020212f, -0.006627f, 0.002671f, -0.038723f, -0.133883f, 0.020337f, 0.022029f, -0.003406f, -0.001092f, -0.009337f, -0.037767f, 0.016305f, -0.007476f, 0.069893f, -0.069966f, -0.013458f, 0.073606f, -0.002310f, -0.047973f, -0.005002f, 0.043860f, 0.053071f, 0.033025f, -0.008335f, 0.038300f, -0.027155f, 0.026210f, -0.010435f, -0.008606f, -0.023368f, 0.041852f, 0.028772f, -0.025625f, -0.011278f, -0.002877f, 0.042390f, -0.002901f, 0.005374f, + -0.025593f, 0.028875f, 0.019119f, -0.029710f, 0.056636f, 0.003445f, -0.049052f, 0.045151f, -0.053376f, -0.027734f, 0.050493f, -0.104717f, -0.066357f, 0.058388f, -0.035508f, 0.043527f, -0.066004f, 0.015874f, 0.025559f, -0.035897f, 0.002394f, -0.001971f, -0.068152f, -0.015115f, 0.072389f, 0.076295f, -0.084755f, -0.027536f, 0.027163f, -0.067820f, 0.089765f, 0.089831f, 0.013732f, -0.126317f, -0.065791f, 0.136247f, -0.070478f, -0.013327f, 0.110761f, -0.063459f, -0.130367f, -0.028542f, 0.119687f, -0.024598f, -0.085592f, -0.020334f, -0.157095f, -0.006260f, 0.129144f, -0.045719f, -0.126774f, -0.012020f, -0.034843f, -0.016246f, 0.039116f, -0.003566f, -0.000429f, -0.045591f, -0.029396f, -0.013849f, 0.052309f, -0.064023f, 0.004293f, 0.011454f, -0.019270f, 0.003317f, 0.062067f, -0.037978f, -0.047912f, -0.005451f, 0.018291f, 0.039295f, -0.014097f, 0.020305f, 0.030272f, 0.004409f, -0.043135f, -0.022541f, 0.002135f, -0.034196f, -0.016010f, 0.068594f, -0.024336f, -0.064762f, -0.016518f, 0.039522f, 0.017036f, -0.003865f, 0.009686f, -0.058431f, -0.033196f, 0.046506f, 0.068356f, 0.009315f, -0.048686f, -0.023161f, + 0.003296f, 0.018981f, 0.034837f, 0.004674f, -0.019098f, -0.074060f, -0.069886f, -0.001558f, -0.088229f, -0.025833f, -0.037505f, -0.035145f, -0.026656f, 0.057729f, -0.006278f, -0.018034f, -0.024219f, 0.011587f, -0.030996f, -0.073268f, 0.057051f, 0.018354f, 0.049280f, 0.015854f, 0.050961f, -0.019845f, -0.031494f, 0.011743f, -0.053302f, 0.041858f, -0.048280f, -0.009750f, 0.031809f, -0.036158f, -0.007741f, -0.021763f, -0.058461f, 0.009301f, -0.044146f, -0.031348f, -0.038524f, -0.028026f, -0.017620f, -0.038675f, 0.006900f, 0.043986f, -0.029414f, -0.009931f, 0.005353f, 0.040595f, -0.018262f, 0.014744f, -0.041081f, 0.067261f, 0.020848f, 0.029175f, 0.018254f, 0.064552f, -0.003776f, -0.074588f, 0.016566f, 0.027903f, -0.020917f, 0.000365f, 0.039554f, -0.051679f, -0.051891f, -0.060067f, 0.052384f, 0.016167f, -0.074688f, 0.029732f, -0.049310f, -0.008980f, -0.069708f, 0.031487f, 0.049448f, 0.010909f, -0.077224f, 0.044006f, 0.035762f, -0.009180f, -0.067892f, 0.018987f, -0.040989f, -0.013336f, -0.003008f, -0.020033f, 0.033545f, -0.029641f, -0.055095f, 0.028017f, -0.012360f, 0.023809f, -0.000389f, -0.001359f, + -0.000453f, -0.014239f, -0.017237f, 0.012337f, 0.049013f, -0.005272f, -0.069511f, -0.018484f, 0.028748f, -0.033576f, -0.014760f, 0.034038f, -0.012712f, -0.004054f, -0.027916f, 0.055162f, 0.031791f, -0.015304f, 0.024284f, -0.003599f, 0.010797f, 0.044914f, -0.008218f, -0.037902f, 0.015938f, 0.025985f, -0.020188f, 0.032608f, -0.005393f, 0.020433f, 0.002012f, -0.013578f, 0.026297f, 0.039482f, -0.022416f, -0.039874f, 0.015654f, 0.025883f, -0.020372f, -0.003199f, 0.022932f, 0.008925f, -0.015958f, -0.015972f, 0.020309f, 0.065400f, 0.123130f, -0.030003f, 0.060919f, 0.011605f, -0.029440f, -0.055476f, -0.032428f, 0.071473f, -0.023797f, 0.013011f, 0.027600f, -0.007582f, 0.065921f, -0.010070f, 0.051685f, 0.053941f, -0.066866f, 0.033992f, -0.017681f, 0.001270f, 0.024211f, 0.019925f, -0.002490f, 0.010468f, 0.019570f, 0.066089f, 0.068127f, 0.052351f, -0.038782f, -0.013531f, -0.091018f, -0.003112f, 0.021274f, 0.040620f, 0.009285f, -0.075531f, 0.032761f, -0.045491f, 0.058154f, -0.053049f, -0.036981f, 0.003416f, -0.044213f, -0.007952f, -0.025578f, 0.089364f, -0.049180f, -0.024415f, -0.094189f, -0.031004f, + -0.049496f, 0.132427f, 0.080655f, -0.028400f, -0.089578f, -0.096358f, -0.057102f, 0.065666f, 0.086152f, 0.043304f, 0.012650f, -0.115551f, -0.053517f, 0.037423f, 0.032266f, 0.004587f, 0.041611f, -0.024313f, -0.075825f, 0.035449f, -0.128607f, 0.139430f, -0.013093f, -0.090836f, 0.210366f, 0.029744f, 0.073213f, 0.125655f, -0.208829f, -0.150900f, 0.041707f, -0.012837f, 0.031964f, 0.045299f, -0.130516f, -0.010107f, 0.026409f, 0.002187f, 0.109442f, 0.007322f, -0.057198f, -0.006423f, 0.058878f, -0.034564f, 0.025783f, 0.029773f, 0.001308f, -0.024363f, 0.028873f, -0.076461f, 0.058155f, -0.015277f, -0.024073f, 0.032310f, 0.008872f, 0.001890f, 0.034534f, -0.008563f, 0.020759f, -0.004652f, 0.013394f, -0.010364f, -0.039742f, 0.023798f, 0.017080f, 0.022484f, -0.000023f, 0.000251f, 0.015924f, 0.008312f, 0.006326f, 0.046064f, 0.051876f, 0.002553f, 0.034089f, -0.032224f, 0.005069f, -0.021293f, 0.039405f, 0.035316f, 0.005808f, -0.010698f, -0.023206f, -0.055517f, -0.024010f, 0.004386f, -0.054830f, 0.036883f, -0.077410f, 0.047707f, -0.031948f, 0.078371f, -0.035554f, -0.003752f, 0.044548f, 0.007855f, + 0.003757f, -0.020321f, -0.017687f, 0.001960f, -0.030231f, 0.033040f, -0.004038f, 0.035097f, -0.027755f, -0.027246f, 0.009066f, 0.001333f, -0.028148f, 0.017573f, -0.003721f, 0.015338f, -0.008784f, -0.007589f, 0.014489f, -0.014049f, -0.001352f, 0.010940f, -0.005914f, -0.006703f, 0.055466f, -0.003828f, -0.018872f, -0.009968f, 0.026213f, -0.002402f, -0.030567f, 0.016124f, 0.032346f, 0.006616f, 0.000535f, -0.019249f, 0.006598f, -0.015575f, 0.014683f, 0.039647f, -0.014318f, 0.018166f, -0.015195f, -0.004380f, -0.016625f, -0.007656f, 0.010164f, 0.012892f, -0.023424f, 0.014039f, 0.003847f, -0.002839f, -0.023434f, 0.004081f, 0.008105f, -0.017027f, 0.024551f, 0.020987f, -0.042116f, 0.010814f, -0.038691f, -0.043460f, 0.029653f, -0.015370f, 0.035878f, 0.019893f, 0.000747f, 0.018732f, -0.006149f, -0.022311f, -0.005747f, 0.001547f, 0.024863f, -0.011175f, 0.007346f, 0.010619f, -0.014904f, -0.002409f, 0.008358f, -0.004139f, -0.003220f, 0.014864f, -0.000598f, 0.005870f, -0.012481f, 0.005309f, -0.001690f, -0.012122f, 0.023049f, 0.002377f, 0.018717f, -0.009057f, 0.015273f, -0.007558f, 0.000604f, -0.012025f, + 0.010021f, -0.005644f, 0.022751f, -0.006870f, 0.021471f, -0.022239f, 0.004451f, 0.001908f, -0.005337f, 0.001221f, 0.002171f, 0.017969f, -0.001386f, -0.020119f, 0.012986f, -0.011112f, 0.001545f, 0.013006f, -0.013432f, 0.022371f, -0.045642f, 0.095849f, 0.017940f, 0.023413f, -0.012393f, 0.008604f, -0.002979f, 0.018015f, 0.005553f, 0.040749f, 0.002629f, -0.022382f, 0.013292f, -0.014666f, 0.006125f, 0.008206f, -0.018968f, 0.000820f, 0.004351f, -0.020478f, 0.018331f, 0.004576f, -0.008513f, 0.024721f, -0.009078f, 0.009664f, -0.007792f, 0.004462f, 0.004573f, 0.002100f, -0.003303f, -0.007538f, -0.003570f, 0.003309f, 0.000447f, -0.004326f, -0.012277f, 0.008863f, -0.008298f, 0.004334f, 0.007788f, -0.008461f, 0.001598f, -0.007915f, 0.002060f, -0.012452f, -0.020058f, 0.020373f, -0.011194f, -0.005503f, 0.008566f, 0.003833f, -0.003662f, 0.002158f, 0.017516f, -0.019657f, 0.008281f, -0.007522f, 0.015158f, -0.016552f, 0.009171f, 0.004405f, -0.003028f, 0.003397f, 0.000248f, 0.000035f, 0.007353f, -0.010540f, 0.005697f, 0.004942f, -0.002939f, -0.001205f, 0.013244f, -0.002251f, 0.004428f, -0.015715f, + 0.020808f, -0.016429f, -0.000373f, 0.010276f, -0.009571f, 0.006951f, 0.002218f, 0.002326f, -0.009999f, 0.007775f, 0.008179f, -0.005414f, 0.003168f, 0.003918f, -0.007155f, 0.002271f, 0.003349f, -0.001733f, 0.007173f, 0.000113f, -0.000274f, -0.000996f, 0.006430f, 0.004827f, -0.004257f, 0.005467f, -0.003030f, 0.002328f, 0.002774f, -0.000935f, 0.008030f, -0.003890f, -0.000040f, 0.004963f, -0.006526f, 0.000285f, -0.000749f, -0.004779f, 0.000549f, 0.004411f, -0.001468f, -0.004059f, 0.008007f, -0.005416f, 0.001132f, 0.018165f, -0.085325f, -0.211813f, 0.045752f, 0.176142f, 0.119061f, 0.248441f, -0.081261f, -0.069451f, -0.142942f, -0.228432f, -0.022590f, 0.071215f, 0.093846f, 0.122512f, 0.061743f, 0.006791f, -0.020044f, -0.052945f, -0.075560f, -0.011424f, -0.020200f, 0.007462f, 0.017317f, -0.000873f, 0.004332f, 0.009162f, 0.004025f, 0.029946f, 0.035494f, 0.022109f, -0.004104f, 0.004139f, -0.026320f, -0.055122f, -0.058814f, -0.028786f, -0.038589f, 0.031791f, 0.058486f, 0.062155f, 0.068155f, 0.037417f, -0.011070f, -0.026886f, -0.050164f, -0.052905f, -0.036837f, -0.020656f, -0.002426f, 0.013419f, + 0.025667f, 0.027654f, 0.023173f, 0.020058f, -0.003483f, 0.005430f, -0.005967f, 0.002707f, -0.004498f, -0.002681f, -0.001643f, -0.018717f, -0.019729f, -0.014194f, -0.029711f, 0.000101f, -0.005639f, 0.003800f, 0.050395f, 0.066527f, 0.022383f, 0.022591f, -0.018284f, -0.036457f, -0.025304f, -0.043912f, -0.035380f, 0.012526f, -0.003088f, -0.021246f, 0.016337f, 0.017637f, 0.020884f, 0.049827f, 0.020648f, 0.021906f, 0.005378f, -0.026699f, -0.026451f, -0.021521f, -0.023634f, -0.029768f, -0.025546f, -0.015096f, 0.004649f, 0.033318f, 0.050024f, 0.046986f, 0.018964f, 0.009573f, -0.012258f, -0.022599f, -0.020461f, -0.022394f, -0.026029f, -0.011777f, -0.010862f, -0.000779f, 0.008726f, 0.006848f, 0.020157f, 0.026923f, 0.019351f, 0.013339f, 0.004618f, -0.001572f, -0.012735f, -0.013008f, -0.020513f, -0.022919f, -0.018148f, -0.016031f, -0.004116f, 0.017345f, 0.025706f, 0.027855f, 0.024611f, 0.010175f, 0.004547f, -0.012228f, -0.019634f, -0.010323f, -0.014508f, -0.019578f, -0.014920f, 0.002872f, 0.013423f, 0.012751f, 0.007099f, 0.008180f, 0.007266f, 0.005720f, 0.001691f, -0.001207f, -0.002027f, -0.005043f, + -0.006661f, -0.006024f, -0.007180f, -0.008322f, -0.004492f, 0.003975f, 0.006968f, 0.009008f, 0.007508f, 0.005505f, 0.001877f, 0.000251f, -0.002197f, -0.003133f, -0.004060f, -0.004411f, -0.005010f, -0.002847f, -0.001115f, 0.001794f, 0.002917f, 0.002928f, 0.002497f, 0.002274f, 0.000469f, 0.000075f, -0.000544f, 0.000361f, 0.000342f, 0.001172f, -0.001653f, -0.002936f, -0.002564f, -0.001400f, -0.001317f, 0.000626f, 0.001798f, 0.002369f, 0.001399f, -0.000753f, -0.001000f, 0.001380f, 0.002198f, 0.001888f, -0.000591f, -0.002317f, -0.002728f, -0.000981f, -0.000071f, 0.000510f, -0.000317f, -0.000506f, -0.000662f, 0.000171f, 0.000655f, 0.001602f, 0.001247f, 0.001221f, 0.000850f, 0.000241f, -0.000803f, -0.001177f, -0.001590f, -0.001340f, -0.001388f, -0.000811f, 0.000289f, 0.001465f, 0.001407f, 0.001348f, 0.000809f, 0.000564f, 0.000339f, -0.000205f, -0.001098f, -0.001007f, -0.000821f, -0.000444f, -0.000162f, 0.000229f, 0.000008f, 0.000038f, 0.000144f, 0.000389f, 0.000446f, 0.000376f, 0.000074f, -0.000104f, -0.000205f, -0.000158f, -0.000098f, -0.000042f, -0.000048f}, + {-0.012004f, 0.001487f, 0.003775f, 0.003656f, 0.018818f, 0.005091f, 0.003952f, -0.005613f, 0.000693f, -0.009588f, 0.002214f, 0.008749f, -0.004481f, 0.000389f, -0.001882f, -0.004734f, -0.007604f, 0.005819f, -0.012700f, -0.006426f, -0.006388f, 0.006841f, 0.007500f, 0.003936f, 0.001773f, 0.005421f, 0.004473f, 0.008974f, -0.003157f, 0.003122f, 0.005573f, 0.001158f, 0.001817f, -0.006598f, -0.002858f, -0.002777f, -0.002500f, 0.006057f, -0.011683f, 0.001919f, -0.004066f, 0.012184f, 0.000264f, -0.002230f, -0.003092f, -0.005066f, -0.001705f, -0.005286f, -0.015400f, -0.004896f, -0.003038f, -0.002514f, -0.003476f, 0.001559f, -0.002909f, -0.000755f, -0.001018f, 0.005352f, 0.002380f, -0.000727f, 0.003411f, -0.003043f, 0.006572f, -0.004356f, -0.007184f, 0.006882f, 0.007220f, -0.003164f, -0.006901f, 0.000628f, 0.003737f, 0.002810f, 0.003244f, -0.003287f, 0.000012f, 0.002625f, 0.003557f, 0.001533f, -0.001014f, 0.000406f, 0.004427f, 0.008553f, 0.004129f, -0.001095f, -0.000133f, -0.002070f, -0.002182f, 0.001759f, -0.002864f, 0.001708f, 0.002090f, -0.000868f, -0.000310f, 0.000901f, 0.000794f, -0.000901f, + 0.000685f, 0.000453f, -0.003974f, 0.000587f, 0.000277f, 0.001185f, 0.000671f, -0.001548f, 0.001395f, 0.001087f, -0.000133f, 0.017010f, -0.003232f, -0.001674f, 0.001789f, 0.004664f, -0.012607f, 0.007784f, -0.014957f, -0.000714f, -0.007262f, -0.001103f, -0.004814f, -0.001167f, -0.001204f, 0.007455f, -0.006361f, 0.008078f, -0.008507f, -0.009287f, 0.003877f, 0.012369f, -0.014671f, -0.004103f, -0.007118f, 0.000063f, -0.003723f, 0.003915f, 0.005205f, 0.002614f, 0.005303f, -0.008540f, 0.000268f, 0.011893f, 0.004645f, 0.001481f, -0.008704f, -0.012412f, -0.007489f, 0.001860f, -0.006373f, -0.003612f, 0.002375f, 0.007998f, -0.007285f, -0.007172f, 0.002849f, -0.005254f, 0.009185f, 0.003054f, -0.000993f, 0.006470f, 0.006136f, -0.000045f, 0.010328f, 0.005094f, 0.003204f, 0.002711f, 0.006755f, 0.010669f, -0.007095f, 0.002010f, 0.002897f, -0.007565f, 0.000624f, 0.006078f, -0.002425f, 0.015425f, -0.004821f, -0.004140f, -0.003266f, 0.005664f, 0.007821f, -0.010065f, -0.004132f, 0.002693f, -0.001868f, 0.002425f, 0.000921f, -0.004432f, 0.001912f, 0.000901f, -0.003287f, -0.005353f, 0.002140f, 0.001452f, + 0.004825f, 0.000372f, 0.001453f, 0.002200f, -0.000270f, -0.001634f, 0.003521f, 0.000175f, -0.000068f, 0.003041f, -0.001725f, 0.001453f, 0.004053f, -0.000385f, -0.000944f, 0.000739f, -0.000670f, 0.001230f, -0.002574f, -0.000828f, -0.001230f, 0.000127f, -0.000441f, 0.001569f, 0.000111f, -0.001614f, 0.000010f, -0.021880f, -0.003523f, -0.004859f, -0.003880f, -0.001937f, -0.002657f, 0.011676f, 0.013953f, -0.003158f, 0.011389f, 0.004360f, -0.006261f, 0.002986f, -0.009500f, 0.001703f, 0.002037f, -0.012778f, -0.001873f, 0.002012f, 0.002259f, 0.008877f, -0.001683f, 0.007714f, -0.005133f, -0.009797f, -0.010347f, -0.002944f, -0.005225f, -0.007842f, 0.008161f, -0.003169f, -0.001554f, -0.001403f, 0.001720f, 0.004454f, -0.012540f, 0.000071f, 0.001772f, -0.005931f, 0.014987f, 0.001194f, -0.003673f, -0.003222f, 0.016001f, -0.001120f, 0.002049f, 0.009476f, 0.000299f, 0.005801f, 0.002268f, 0.000558f, 0.008838f, -0.000027f, -0.006153f, 0.007941f, 0.004265f, 0.005110f, 0.007194f, 0.002397f, -0.005809f, 0.004174f, 0.005906f, 0.005743f, 0.008852f, 0.000079f, -0.008164f, -0.006515f, 0.010378f, 0.014445f, + -0.013143f, 0.002670f, -0.003466f, -0.002293f, 0.003038f, 0.005533f, 0.005302f, -0.004182f, -0.001676f, -0.004040f, -0.006771f, -0.005907f, -0.002163f, -0.003745f, -0.005818f, 0.001358f, -0.001576f, 0.002243f, 0.001900f, -0.001784f, 0.001063f, 0.000386f, -0.004725f, 0.001629f, -0.003190f, -0.005728f, 0.000400f, -0.001669f, -0.002406f, -0.002557f, -0.000722f, 0.001071f, -0.000863f, 0.001689f, -0.001094f, -0.001914f, -0.002658f, -0.002437f, -0.001049f, 0.000472f, 0.001915f, -0.003706f, -0.016129f, 0.017185f, 0.015920f, 0.012002f, -0.008377f, 0.009382f, 0.016941f, -0.004264f, 0.013238f, 0.004982f, 0.001986f, -0.002064f, 0.014597f, 0.006900f, -0.003421f, -0.010472f, 0.006070f, -0.004340f, -0.005602f, 0.005914f, 0.006983f, 0.003064f, -0.010398f, 0.001687f, 0.009332f, -0.004554f, 0.003163f, -0.020448f, 0.002944f, -0.001645f, 0.009850f, 0.002410f, -0.004244f, -0.006165f, 0.012607f, -0.010853f, 0.000878f, -0.008765f, 0.001024f, -0.002684f, 0.007042f, -0.001467f, -0.002297f, -0.010740f, -0.002578f, -0.001893f, 0.013338f, 0.000667f, -0.012202f, -0.000449f, -0.000674f, 0.004174f, 0.006378f, -0.005426f, + 0.000024f, -0.006924f, 0.007394f, -0.001618f, 0.008937f, -0.004818f, 0.013305f, 0.006613f, -0.014684f, 0.015565f, -0.002243f, -0.010745f, 0.001831f, 0.014225f, 0.002889f, 0.002195f, -0.011500f, -0.000744f, -0.004455f, -0.006208f, -0.006024f, 0.000555f, 0.005423f, 0.007010f, 0.003806f, 0.003836f, -0.004488f, 0.003388f, -0.003890f, -0.000432f, -0.000208f, -0.001785f, -0.000747f, 0.004060f, -0.006393f, 0.001756f, -0.000624f, 0.000577f, 0.002149f, 0.001765f, -0.000172f, 0.002799f, 0.000305f, -0.004190f, -0.004557f, 0.002700f, 0.001234f, -0.000160f, -0.003009f, -0.000571f, 0.000727f, -0.000381f, -0.001315f, -0.002906f, 0.001851f, -0.000021f, -0.001828f, 0.002066f, -0.001217f, -0.000771f, -0.002343f, -0.001406f, -0.000884f, -0.002930f, 0.002085f, 0.001699f, 0.018711f, -0.006245f, -0.013294f, -0.000556f, -0.020011f, 0.000120f, -0.017174f, -0.005880f, 0.012055f, -0.012215f, -0.013488f, 0.004225f, 0.001280f, 0.001363f, -0.003047f, -0.004328f, -0.009721f, 0.006820f, -0.019164f, -0.005801f, 0.002109f, 0.012113f, 0.000856f, 0.012287f, 0.004471f, 0.026830f, 0.010377f, -0.000141f, 0.001328f, 0.012852f, + -0.002883f, -0.003665f, -0.002234f, 0.002248f, -0.008258f, -0.004039f, -0.014028f, -0.000851f, -0.006360f, -0.003765f, 0.017629f, 0.000426f, 0.011089f, -0.004237f, 0.004616f, -0.000960f, 0.006681f, -0.002039f, 0.006231f, -0.005859f, -0.007273f, -0.001053f, 0.002263f, -0.007359f, -0.007341f, 0.000807f, 0.004023f, 0.008265f, -0.001006f, -0.003651f, -0.001489f, 0.007850f, 0.013300f, 0.000869f, -0.008779f, -0.012651f, 0.000352f, 0.003661f, 0.001510f, 0.017611f, -0.010777f, -0.000448f, 0.007991f, -0.002744f, -0.008998f, 0.012456f, 0.005811f, 0.002333f, -0.005919f, -0.006427f, -0.010765f, -0.004139f, -0.000996f, -0.005526f, -0.002664f, -0.004766f, 0.001115f, 0.001421f, 0.002917f, 0.000501f, 0.000993f, -0.005951f, -0.002975f, -0.006390f, -0.002089f, -0.001737f, -0.004799f, -0.003015f, 0.001904f, -0.000426f, -0.001918f, -0.000411f, 0.001813f, -0.003940f, 0.002246f, -0.002797f, -0.000143f, -0.001073f, -0.002042f, -0.000627f, 0.000144f, 0.002008f, -0.002688f, -0.004131f, 0.003632f, 0.002219f, 0.001183f, 0.016624f, -0.012710f, -0.002567f, 0.001089f, -0.000965f, -0.000441f, -0.010464f, -0.008042f, -0.001110f, + 0.006995f, 0.002553f, 0.002830f, 0.002952f, 0.007351f, -0.001482f, 0.006727f, 0.005443f, -0.017223f, -0.006612f, -0.020219f, 0.005273f, -0.007097f, 0.010211f, -0.006526f, -0.008929f, -0.006521f, 0.005313f, -0.013461f, -0.011211f, 0.015728f, -0.008556f, 0.017050f, -0.004012f, 0.005158f, -0.005982f, -0.011416f, 0.012630f, -0.009676f, -0.010905f, -0.001052f, -0.005930f, -0.012778f, -0.009869f, -0.016123f, 0.000670f, 0.010433f, 0.005983f, -0.006240f, 0.017955f, 0.006626f, -0.006601f, -0.008300f, -0.012995f, 0.000610f, -0.004874f, -0.009045f, -0.004590f, -0.003811f, -0.006410f, 0.003465f, 0.014355f, -0.000824f, 0.000931f, -0.009685f, 0.004557f, 0.004911f, -0.008482f, -0.006674f, 0.003417f, 0.017512f, 0.006939f, -0.004285f, -0.002336f, -0.003621f, -0.018009f, -0.014108f, -0.011967f, 0.012547f, 0.013251f, -0.001879f, -0.006241f, 0.005861f, -0.003998f, 0.005153f, -0.002687f, 0.002470f, 0.000370f, 0.000319f, -0.005878f, 0.003963f, -0.003461f, -0.002391f, -0.000971f, 0.003555f, 0.002564f, -0.000285f, -0.004929f, 0.003157f, -0.000773f, 0.002337f, -0.001717f, -0.001016f, -0.004369f, -0.001809f, -0.000235f, + -0.000457f, 0.000752f, 0.000906f, -0.000633f, 0.000808f, -0.003654f, 0.001681f, 0.000259f, 0.000597f, -0.001386f, 0.004510f, 0.002717f, -0.000105f, -0.001854f, 0.000521f, -0.002823f, 0.005095f, 0.001041f, 0.023646f, -0.004697f, -0.000231f, -0.004096f, 0.015325f, 0.014525f, 0.004891f, -0.024696f, -0.004265f, -0.029954f, 0.017441f, 0.007270f, 0.000307f, 0.030574f, 0.014360f, -0.002873f, -0.013963f, 0.012506f, -0.006080f, 0.002980f, 0.004120f, 0.001836f, 0.009892f, -0.009115f, 0.017042f, 0.006396f, 0.001494f, -0.005373f, -0.008946f, 0.011528f, 0.009666f, -0.002050f, 0.006222f, -0.014815f, 0.002568f, -0.019730f, 0.007803f, 0.000957f, 0.009807f, -0.016225f, 0.003154f, -0.005395f, 0.003371f, 0.018153f, 0.015318f, 0.000592f, 0.004301f, -0.011508f, 0.014760f, 0.000288f, 0.031619f, 0.033485f, -0.004648f, -0.009101f, -0.009345f, -0.007409f, -0.019679f, -0.005580f, -0.025643f, 0.001415f, -0.002316f, -0.001541f, -0.005379f, 0.008820f, 0.014861f, 0.023462f, 0.021731f, 0.016764f, -0.027949f, -0.019918f, -0.001058f, 0.001279f, 0.028932f, -0.020620f, 0.015457f, -0.001204f, -0.006072f, -0.003113f, + -0.000904f, -0.005874f, -0.016321f, -0.010654f, -0.003230f, 0.004618f, 0.001323f, -0.000505f, -0.004591f, 0.002447f, -0.005910f, -0.000649f, -0.003232f, 0.006087f, 0.006702f, -0.001756f, -0.001505f, 0.006342f, 0.004709f, 0.000741f, -0.001149f, 0.002276f, 0.000217f, 0.000887f, -0.001455f, 0.002700f, -0.000416f, -0.001697f, -0.002795f, 0.000741f, 0.002557f, 0.004049f, 0.008686f, 0.006851f, -0.003573f, 0.000769f, -0.006524f, -0.001256f, 0.002619f, -0.000578f, -0.001460f, 0.000114f, 0.001081f, 0.001383f, -0.008773f, 0.016957f, 0.003526f, -0.012792f, -0.007132f, 0.031975f, 0.031454f, 0.035255f, -0.003619f, -0.001652f, -0.006168f, 0.005800f, 0.017189f, 0.019775f, 0.005655f, -0.008722f, -0.017178f, -0.034834f, 0.010156f, -0.020674f, -0.004624f, -0.002252f, -0.004561f, 0.002182f, -0.001154f, -0.006522f, -0.000881f, -0.020259f, -0.008078f, 0.001051f, -0.003831f, -0.022622f, -0.009585f, 0.001768f, 0.016218f, -0.004769f, 0.000367f, -0.018042f, -0.006136f, 0.000062f, 0.011746f, -0.007412f, 0.007185f, -0.020147f, -0.005663f, 0.004497f, 0.007492f, -0.005633f, 0.026756f, -0.005672f, -0.003494f, -0.014136f, + -0.004700f, 0.010655f, 0.003593f, -0.001383f, 0.013921f, 0.019243f, 0.022547f, -0.004146f, -0.011412f, -0.013004f, 0.000101f, 0.002522f, 0.005229f, -0.009277f, 0.007222f, 0.009475f, 0.008031f, 0.007748f, 0.022557f, 0.015109f, 0.010038f, -0.001379f, 0.005019f, -0.022699f, -0.004295f, 0.002207f, 0.011467f, 0.018081f, -0.003529f, -0.010473f, 0.003148f, 0.006112f, -0.005337f, 0.009180f, 0.007442f, 0.009937f, 0.001506f, 0.004246f, -0.000544f, -0.000980f, -0.007377f, 0.005545f, -0.002345f, 0.003580f, 0.003287f, 0.000880f, 0.005307f, 0.000290f, 0.008578f, 0.005911f, 0.003854f, 0.002250f, 0.002380f, -0.000167f, -0.001162f, 0.000510f, -0.003648f, -0.000448f, -0.004548f, -0.007443f, -0.002928f, 0.001305f, 0.001227f, 0.002954f, -0.001524f, 0.001874f, -0.003020f, 0.001160f, 0.003792f, -0.000365f, 0.000653f, -0.032862f, 0.040851f, -0.001168f, 0.005988f, 0.022335f, 0.000377f, -0.007856f, 0.001153f, -0.039889f, -0.024284f, -0.011418f, 0.006353f, -0.007869f, 0.004537f, -0.018660f, 0.012891f, -0.006527f, -0.000192f, 0.024591f, -0.024010f, -0.015973f, 0.023002f, -0.007228f, -0.033754f, 0.002381f, + -0.020821f, 0.004288f, -0.001751f, 0.012626f, 0.005418f, 0.006361f, 0.002546f, -0.004082f, 0.014969f, -0.001679f, 0.019239f, 0.011770f, -0.006878f, -0.011565f, -0.010866f, 0.005240f, -0.005356f, 0.005274f, 0.003697f, 0.011339f, 0.003279f, -0.021292f, 0.001225f, 0.007235f, -0.007393f, 0.000906f, -0.014718f, -0.003259f, 0.001260f, 0.000963f, 0.033677f, -0.005884f, 0.023918f, 0.028675f, -0.007926f, 0.015355f, -0.004761f, -0.000834f, -0.015992f, 0.010141f, 0.024341f, 0.017056f, 0.003743f, 0.006713f, 0.015068f, -0.000971f, 0.012479f, -0.005080f, -0.007048f, -0.012148f, 0.006586f, 0.031178f, 0.006917f, -0.004005f, 0.002419f, -0.021882f, -0.007466f, 0.000551f, 0.020566f, 0.015080f, 0.006443f, 0.013396f, -0.003896f, 0.013161f, -0.000204f, 0.008296f, 0.000974f, -0.000596f, -0.001649f, 0.009195f, -0.001047f, -0.005717f, -0.003621f, -0.002241f, -0.001474f, -0.002270f, -0.004681f, 0.006663f, -0.004356f, -0.005661f, -0.001736f, -0.007451f, -0.005244f, -0.006349f, -0.003758f, -0.004412f, -0.005829f, 0.002018f, 0.001265f, 0.002525f, 0.001970f, -0.003330f, -0.001853f, -0.005840f, -0.007809f, -0.000622f, + -0.004382f, 0.002602f, -0.002143f, 0.000742f, 0.003695f, 0.004046f, 0.002650f, 0.006891f, -0.001907f, -0.000512f, 0.005094f, 0.039224f, 0.005738f, 0.009809f, -0.009232f, -0.004659f, 0.026649f, -0.017528f, -0.004024f, -0.034532f, 0.032421f, 0.016961f, 0.002366f, -0.011702f, -0.032601f, 0.003348f, -0.008651f, 0.004045f, -0.036561f, 0.013101f, 0.019359f, -0.021214f, -0.005056f, 0.003234f, 0.002282f, 0.007131f, 0.021008f, 0.025871f, 0.000113f, 0.000003f, 0.004868f, 0.001046f, -0.015618f, -0.017835f, -0.011828f, -0.023522f, -0.011574f, 0.020164f, 0.009388f, -0.007448f, -0.009927f, -0.006518f, -0.041424f, 0.009080f, 0.009987f, -0.019332f, 0.031793f, 0.001216f, 0.023721f, -0.008454f, 0.015397f, -0.004992f, -0.020473f, 0.001933f, 0.018902f, -0.010325f, 0.010390f, 0.012205f, 0.033766f, 0.009434f, 0.010630f, 0.032433f, 0.018487f, 0.012342f, -0.044715f, 0.009360f, 0.006877f, 0.008779f, 0.000941f, -0.018157f, 0.032460f, -0.023989f, 0.018527f, 0.019492f, -0.029159f, -0.006272f, 0.039964f, -0.035466f, 0.006063f, -0.008226f, -0.003825f, -0.012702f, 0.015573f, -0.006549f, -0.013256f, -0.011222f, + 0.006975f, 0.015236f, -0.014087f, 0.017677f, -0.014540f, -0.006240f, 0.019982f, 0.007489f, -0.001633f, -0.008646f, -0.009333f, -0.000110f, -0.003697f, -0.015044f, -0.001737f, -0.003083f, -0.004247f, -0.001225f, 0.012004f, -0.000856f, -0.011058f, 0.001194f, 0.004689f, 0.011624f, 0.007169f, 0.009278f, -0.003651f, 0.004989f, -0.006601f, 0.000518f, -0.002244f, 0.004988f, 0.009530f, -0.006838f, 0.004384f, 0.004720f, -0.000513f, -0.005879f, 0.003271f, 0.002791f, -0.020452f, -0.030900f, -0.013571f, -0.012834f, -0.041514f, 0.028446f, 0.004542f, 0.030360f, 0.001834f, 0.004481f, -0.014297f, -0.007356f, 0.014842f, -0.000966f, 0.015344f, -0.014970f, -0.004715f, 0.002884f, -0.006728f, -0.012220f, 0.018278f, -0.018340f, 0.021753f, -0.007395f, 0.007160f, -0.004489f, -0.014568f, -0.013018f, 0.006437f, -0.004596f, -0.000040f, 0.011338f, 0.043426f, 0.003301f, -0.005416f, -0.014417f, 0.006353f, 0.035153f, -0.006299f, -0.005507f, -0.020215f, -0.006819f, 0.003063f, -0.019037f, -0.006892f, -0.027248f, 0.017820f, -0.033403f, -0.060656f, -0.006137f, 0.002109f, 0.029242f, -0.029855f, 0.028090f, 0.018308f, -0.014007f, + -0.028171f, -0.004274f, 0.004841f, 0.008554f, 0.001210f, 0.017873f, -0.011574f, -0.004128f, -0.059826f, -0.007746f, 0.062173f, 0.006346f, -0.010212f, -0.007946f, -0.031922f, 0.024459f, -0.010111f, -0.008838f, -0.007709f, -0.004330f, -0.013684f, -0.020388f, 0.006443f, 0.012244f, -0.000370f, 0.009420f, -0.017213f, -0.031625f, -0.000890f, -0.016501f, -0.004560f, 0.000935f, -0.016389f, 0.004231f, -0.011870f, -0.021074f, -0.015570f, -0.007356f, 0.007216f, 0.010187f, -0.001559f, -0.024987f, -0.006032f, 0.001987f, -0.012175f, -0.005179f, -0.000739f, -0.011237f, -0.006494f, 0.003502f, -0.000177f, -0.008746f, -0.003302f, 0.004591f, 0.001900f, -0.011749f, -0.004472f, 0.000670f, 0.011560f, 0.012824f, 0.003706f, -0.003347f, -0.004150f, -0.001056f, 0.008735f, -0.001389f, -0.000424f, 0.001078f, 0.003554f, -0.009766f, 0.009899f, -0.001659f, 0.006820f, 0.001127f, -0.006776f, 0.028725f, 0.025658f, -0.008323f, -0.010613f, -0.002644f, -0.041404f, 0.027140f, -0.026206f, -0.021646f, -0.016782f, 0.010141f, 0.004097f, 0.025143f, 0.003003f, -0.013937f, -0.016258f, -0.016861f, 0.012935f, -0.006574f, -0.009059f, 0.022950f, + 0.025706f, 0.008626f, -0.017436f, 0.021128f, 0.034230f, -0.013270f, -0.007582f, 0.029533f, 0.007568f, 0.005766f, -0.019430f, -0.000220f, 0.028171f, -0.041848f, 0.028620f, -0.006441f, 0.003829f, 0.016991f, 0.020696f, -0.000385f, 0.010314f, -0.019839f, -0.016073f, 0.010561f, 0.039415f, 0.010348f, 0.009581f, 0.014709f, -0.019957f, 0.003944f, 0.017478f, 0.009889f, -0.003320f, 0.013849f, 0.008732f, -0.023929f, 0.019197f, -0.023335f, 0.005159f, 0.016594f, -0.018359f, 0.013673f, -0.022395f, -0.009198f, 0.004072f, 0.000518f, 0.014275f, -0.009468f, 0.012243f, -0.009682f, 0.001707f, 0.004255f, -0.004189f, -0.009509f, -0.018104f, 0.048005f, 0.005147f, 0.014147f, -0.021090f, -0.049685f, 0.034794f, -0.033906f, -0.014563f, -0.000585f, -0.007768f, -0.005439f, -0.002941f, -0.014278f, 0.008621f, 0.006539f, 0.003713f, -0.013247f, 0.015823f, 0.011723f, -0.005313f, -0.005905f, 0.004661f, -0.004948f, 0.004391f, -0.004998f, 0.016800f, 0.005665f, 0.001571f, 0.011384f, 0.012578f, -0.007836f, 0.000080f, 0.005464f, 0.008750f, 0.003003f, 0.004197f, -0.008494f, -0.010345f, 0.007754f, 0.010865f, 0.015076f, + -0.002141f, -0.014888f, -0.001989f, 0.000734f, 0.007089f, -0.022601f, 0.008331f, -0.007954f, -0.003176f, 0.004488f, 0.005200f, -0.006070f, 0.007687f, -0.000011f, 0.006123f, -0.004179f, 0.014549f, 0.004332f, 0.006080f, -0.002716f, 0.008291f, -0.027357f, 0.028617f, -0.010759f, -0.028638f, -0.037071f, -0.010500f, -0.003910f, 0.021509f, -0.032646f, -0.005409f, -0.003969f, 0.016902f, 0.032132f, 0.026559f, 0.016499f, 0.002361f, -0.008419f, -0.005171f, -0.003461f, 0.022531f, 0.018522f, -0.004582f, 0.002816f, -0.005139f, 0.014485f, -0.035490f, 0.020928f, 0.011418f, 0.016355f, 0.005407f, 0.003670f, 0.030233f, -0.012122f, -0.026090f, 0.000015f, -0.008719f, 0.001647f, -0.036117f, -0.020008f, -0.002309f, 0.029903f, -0.020487f, -0.006534f, 0.004741f, -0.001333f, 0.000673f, 0.029391f, 0.011683f, -0.004697f, 0.002402f, 0.014321f, 0.009334f, 0.034265f, -0.010315f, 0.015589f, 0.017291f, 0.009237f, -0.005775f, 0.005512f, -0.037631f, 0.015885f, -0.007205f, 0.001586f, -0.008797f, -0.020712f, -0.027897f, 0.005518f, -0.013417f, -0.037717f, 0.008815f, -0.032064f, -0.023727f, -0.005641f, -0.048396f, -0.029305f, + 0.006990f, 0.020437f, -0.024286f, 0.005077f, 0.001689f, 0.055230f, 0.052269f, 0.049427f, -0.001738f, 0.002666f, -0.026303f, -0.015838f, 0.020432f, -0.011301f, -0.007587f, 0.003299f, -0.006888f, 0.011498f, -0.014516f, -0.007213f, -0.000793f, 0.004290f, -0.008839f, 0.010532f, 0.010428f, 0.000360f, -0.004863f, 0.002826f, 0.010175f, -0.008614f, -0.011505f, -0.002990f, 0.009114f, -0.012880f, 0.021275f, 0.012286f, -0.001310f, 0.009668f, -0.003771f, -0.009080f, -0.014556f, -0.007847f, -0.012952f, -0.006962f, 0.007049f, 0.001174f, 0.021440f, -0.005201f, -0.007311f, -0.003436f, -0.049101f, -0.054294f, 0.031894f, 0.028630f, 0.009438f, 0.031043f, 0.052168f, 0.014653f, -0.020243f, 0.016661f, -0.008215f, -0.015054f, 0.023719f, 0.001467f, -0.021721f, 0.012918f, 0.017003f, 0.003724f, 0.005819f, 0.001054f, 0.002412f, 0.047740f, -0.001285f, 0.010014f, 0.004224f, 0.029524f, 0.001506f, 0.047352f, -0.000473f, -0.021224f, 0.037841f, 0.007520f, -0.017090f, -0.006218f, 0.019922f, -0.004448f, -0.000598f, 0.015515f, -0.029200f, 0.028627f, -0.006347f, -0.042595f, -0.012093f, 0.003882f, -0.042550f, -0.005017f, + -0.004656f, 0.018333f, 0.017751f, 0.031556f, -0.022556f, 0.004585f, 0.004835f, 0.006349f, 0.013376f, -0.020543f, -0.023071f, 0.011707f, -0.000786f, 0.024059f, 0.019565f, 0.005843f, 0.050609f, -0.008746f, -0.008024f, -0.035014f, 0.051650f, 0.008896f, 0.035780f, 0.021764f, -0.058069f, 0.008031f, 0.005070f, 0.035207f, -0.019006f, 0.014856f, 0.000141f, -0.015662f, -0.002094f, -0.012709f, 0.028407f, -0.055027f, -0.006827f, -0.004197f, 0.000053f, 0.002210f, 0.008637f, 0.013134f, -0.000352f, 0.025013f, -0.001141f, -0.003889f, -0.008263f, -0.005523f, 0.001494f, -0.009063f, 0.002844f, -0.002671f, 0.007503f, 0.005081f, -0.002729f, 0.001841f, -0.003078f, -0.015547f, -0.000938f, 0.000490f, 0.003770f, -0.015874f, 0.008256f, -0.003485f, 0.008684f, 0.006655f, 0.012316f, -0.012913f, 0.014414f, -0.008147f, 0.004617f, 0.010179f, 0.009396f, -0.003518f, 0.000296f, -0.005975f, 0.008153f, -0.000762f, 0.003973f, -0.000468f, -0.001694f, 0.020808f, 0.011833f, 0.000025f, 0.009806f, 0.002655f, 0.010205f, 0.001976f, 0.032021f, -0.067412f, 0.040142f, 0.040830f, -0.017321f, 0.009751f, 0.005747f, 0.011089f, + 0.000363f, 0.032510f, -0.023581f, -0.005059f, -0.025301f, -0.000163f, -0.014262f, 0.002333f, 0.006908f, -0.036974f, 0.016740f, 0.040262f, -0.027589f, -0.026480f, -0.026989f, 0.053588f, -0.023308f, -0.013109f, 0.005072f, -0.018314f, -0.055401f, 0.009789f, 0.040379f, -0.055284f, -0.024968f, 0.019141f, 0.029775f, 0.008081f, -0.008313f, 0.012832f, -0.019525f, -0.009177f, -0.000923f, 0.027410f, -0.037535f, -0.029917f, 0.021353f, 0.034417f, 0.013656f, -0.042978f, -0.013806f, 0.001076f, -0.001882f, -0.007466f, 0.022560f, -0.006665f, 0.033997f, -0.027575f, -0.005897f, -0.000047f, -0.031452f, 0.020013f, -0.036631f, -0.025279f, 0.011855f, -0.016440f, 0.035859f, 0.051667f, 0.030622f, -0.034186f, 0.018243f, -0.010062f, -0.010105f, -0.024137f, -0.007368f, -0.039332f, 0.030211f, 0.022117f, 0.010847f, 0.001167f, -0.018446f, -0.010457f, 0.012311f, -0.041065f, 0.033289f, -0.007852f, -0.005480f, 0.017313f, 0.003258f, 0.015763f, -0.004300f, -0.002507f, -0.013840f, -0.004080f, 0.001522f, 0.002770f, -0.010808f, -0.003898f, -0.005047f, -0.003995f, 0.018818f, 0.001938f, -0.000094f, -0.008952f, 0.007779f, 0.007362f, + -0.006389f, 0.004045f, 0.008754f, 0.001852f, 0.014589f, -0.005199f, -0.009871f, 0.002010f, -0.016239f, 0.008444f, 0.006389f, 0.002050f, -0.000262f, 0.006479f, -0.001146f, 0.010631f, 0.003697f, 0.007539f, -0.012776f, -0.004035f, 0.012423f, 0.000568f, 0.005222f, 0.006108f, -0.011884f, 0.001649f, 0.012528f, 0.039293f, 0.065426f, -0.000361f, -0.049342f, 0.010585f, -0.058897f, 0.010216f, 0.026903f, 0.012707f, 0.003663f, 0.035585f, 0.026336f, -0.001475f, -0.005305f, -0.048666f, -0.026186f, 0.000837f, -0.022728f, 0.066190f, -0.011952f, -0.014866f, -0.028426f, 0.003674f, 0.024954f, 0.017507f, -0.000802f, 0.012894f, 0.019462f, -0.029189f, 0.010134f, 0.056815f, 0.020179f, -0.038786f, -0.027327f, 0.018535f, -0.019137f, -0.002503f, 0.013916f, -0.008496f, -0.032007f, -0.007540f, 0.004004f, 0.054151f, -0.011585f, 0.012134f, -0.014265f, -0.043514f, 0.007749f, 0.054939f, -0.014628f, -0.032714f, 0.009690f, -0.019978f, 0.013534f, -0.011353f, -0.013252f, 0.037809f, -0.009508f, -0.004147f, 0.018554f, -0.032304f, 0.011851f, 0.040012f, -0.016353f, 0.003586f, -0.023216f, 0.070244f, -0.012598f, 0.008521f, + 0.022905f, -0.016112f, -0.003734f, -0.018544f, 0.010000f, -0.020975f, -0.017665f, -0.016508f, 0.027031f, -0.036260f, 0.005541f, -0.005216f, -0.010669f, 0.028505f, 0.000844f, -0.009490f, -0.011814f, 0.001667f, 0.010855f, 0.008458f, -0.015995f, -0.002762f, 0.000968f, -0.004335f, -0.019834f, -0.011880f, -0.003401f, 0.004980f, 0.001877f, 0.001818f, 0.003081f, 0.016557f, -0.016233f, 0.017399f, 0.003683f, 0.005174f, 0.001452f, 0.013843f, -0.007424f, 0.022600f, -0.004608f, -0.000133f, 0.017487f, 0.022710f, -0.011435f, 0.014925f, -0.007005f, 0.005153f, -0.012688f, 0.011597f, 0.009927f, -0.019176f, -0.000584f, -0.007532f, -0.002258f, -0.009467f, 0.007437f, -0.011701f, 0.011185f, -0.002125f, -0.003843f, -0.019434f, -0.108522f, -0.038283f, -0.002365f, 0.034152f, -0.018538f, -0.054511f, -0.020795f, -0.008323f, 0.026097f, 0.006506f, -0.007637f, -0.027154f, 0.027851f, 0.049796f, -0.023198f, 0.037551f, 0.009102f, -0.072233f, 0.026385f, 0.033339f, -0.012254f, -0.029598f, -0.005895f, 0.043896f, 0.046833f, -0.004294f, -0.036253f, 0.002125f, -0.004514f, -0.005011f, -0.030286f, 0.007008f, 0.013200f, -0.047751f, + 0.032278f, 0.027428f, -0.033841f, 0.005826f, -0.037916f, 0.012913f, 0.091195f, -0.082225f, 0.084281f, 0.037965f, 0.003400f, 0.051454f, 0.025323f, -0.053346f, 0.031431f, -0.040197f, -0.009364f, 0.043195f, 0.001614f, 0.012135f, -0.022682f, -0.039147f, 0.117625f, -0.028071f, 0.001283f, 0.046182f, -0.022893f, 0.008750f, 0.003130f, 0.028413f, 0.066077f, 0.062870f, 0.059387f, 0.003411f, -0.001594f, -0.009935f, 0.002611f, -0.016473f, 0.004063f, 0.050443f, -0.013872f, -0.017912f, 0.004644f, 0.006719f, 0.029033f, 0.034024f, 0.009354f, 0.009329f, 0.023954f, 0.010069f, -0.019061f, 0.005788f, -0.010045f, -0.027861f, -0.012821f, 0.014209f, -0.021220f, -0.030214f, -0.023172f, -0.001323f, 0.002300f, -0.017435f, 0.008364f, 0.019148f, 0.002575f, -0.006550f, -0.001605f, -0.022137f, 0.025473f, -0.004071f, -0.006101f, 0.017695f, -0.015291f, 0.011954f, -0.011562f, -0.009135f, 0.030053f, -0.000348f, -0.023106f, 0.028684f, -0.018218f, 0.017206f, 0.007707f, -0.011568f, 0.008247f, -0.004204f, 0.020597f, -0.009862f, 0.006883f, 0.000835f, 0.001290f, -0.002434f, 0.021944f, -0.011707f, -0.003108f, -0.001808f, + 0.003508f, -0.003435f, 0.009291f, 0.017017f, 0.027637f, -0.007359f, -0.079804f, 0.036189f, -0.057985f, 0.081446f, 0.009587f, -0.070921f, 0.015956f, 0.000574f, 0.033249f, 0.015639f, -0.017181f, 0.060240f, 0.014697f, 0.002997f, 0.040248f, -0.032264f, -0.044787f, 0.001389f, 0.023426f, 0.081192f, -0.011445f, 0.000128f, -0.008520f, 0.058486f, 0.006375f, -0.046613f, -0.027499f, 0.008714f, -0.005148f, 0.025833f, -0.045204f, 0.021618f, 0.007387f, 0.013285f, -0.004030f, -0.017777f, 0.010304f, 0.018058f, 0.000202f, 0.054299f, -0.087725f, 0.007548f, -0.030927f, -0.019362f, -0.011299f, -0.064290f, -0.093206f, -0.096641f, -0.070130f, 0.007305f, 0.000383f, -0.056121f, -0.000425f, -0.010350f, 0.006066f, -0.034891f, -0.089790f, 0.088355f, -0.001553f, -0.013238f, 0.018069f, -0.087982f, -0.005996f, -0.022040f, 0.016520f, 0.025610f, 0.120617f, 0.089675f, -0.010035f, -0.001301f, -0.002801f, 0.023482f, 0.036502f, 0.021913f, 0.016679f, -0.003593f, -0.014515f, -0.085652f, 0.016185f, -0.001992f, -0.033269f, -0.015177f, 0.055859f, -0.008090f, -0.010130f, 0.026387f, -0.002206f, 0.028963f, -0.011316f, 0.014410f, + -0.001580f, -0.006380f, 0.020694f, 0.024936f, -0.011455f, 0.003256f, 0.011229f, -0.005012f, 0.005323f, 0.001001f, -0.000256f, 0.016910f, -0.007256f, -0.009074f, 0.014308f, -0.016975f, 0.022118f, -0.000451f, 0.011991f, 0.018045f, -0.009171f, 0.004217f, 0.016067f, -0.004192f, -0.010465f, -0.004246f, 0.001859f, -0.003271f, 0.004442f, -0.022081f, -0.001318f, -0.017573f, 0.018160f, 0.002313f, 0.012249f, 0.008248f, -0.002528f, 0.000144f, -0.001123f, 0.007860f, 0.011338f, 0.008836f, -0.001358f, -0.010966f, -0.001559f, -0.022988f, 0.109432f, -0.104860f, 0.017721f, -0.020362f, 0.003849f, 0.044079f, -0.032520f, 0.010868f, 0.001470f, -0.113433f, 0.002594f, -0.012902f, 0.005283f, 0.012893f, -0.050806f, -0.019058f, -0.083967f, -0.021782f, -0.004311f, 0.004384f, -0.031927f, -0.024024f, -0.036710f, -0.015404f, 0.035960f, 0.007692f, 0.072865f, 0.017702f, -0.024964f, -0.026134f, 0.044675f, -0.050169f, 0.085742f, -0.067394f, 0.019316f, -0.054414f, 0.000861f, 0.051524f, -0.094234f, 0.088323f, 0.015372f, 0.010022f, -0.064799f, -0.013116f, -0.012511f, -0.000213f, 0.030696f, 0.030690f, 0.038705f, -0.074730f, + -0.002161f, -0.029524f, -0.025668f, -0.028913f, -0.040453f, -0.028018f, 0.001116f, 0.042438f, -0.045871f, 0.012032f, -0.084214f, -0.028327f, 0.020922f, 0.024739f, 0.004234f, -0.095729f, -0.051972f, -0.034282f, -0.048952f, -0.040551f, 0.003068f, -0.032010f, 0.050481f, 0.014972f, 0.025133f, -0.017903f, -0.026656f, 0.084856f, -0.028885f, 0.022594f, -0.017450f, 0.006330f, 0.063615f, 0.008262f, 0.011207f, -0.036125f, 0.035995f, 0.020795f, -0.015376f, 0.033429f, -0.025691f, 0.008983f, -0.009763f, 0.022516f, 0.004211f, -0.007966f, 0.012024f, 0.028753f, -0.010330f, 0.008960f, 0.009965f, 0.008352f, -0.003847f, 0.007469f, -0.004557f, 0.019591f, -0.007027f, 0.002936f, 0.018480f, -0.004320f, -0.007788f, 0.005415f, 0.007744f, -0.013435f, -0.003325f, -0.036579f, 0.022200f, 0.015008f, -0.000330f, -0.020515f, -0.008682f, 0.001311f, 0.007075f, 0.027070f, -0.005025f, -0.008061f, 0.009083f, 0.006547f, -0.004686f, 0.027328f, 0.004717f, -0.034588f, 0.008303f, 0.033017f, -0.004396f, 0.047069f, -0.088952f, 0.135338f, -0.102066f, -0.010861f, -0.061624f, 0.012002f, 0.001223f, -0.037319f, -0.052723f, 0.061424f, + 0.041263f, 0.019196f, -0.026961f, 0.027019f, 0.008332f, 0.057978f, -0.046097f, -0.030551f, 0.036028f, 0.060270f, -0.077195f, 0.030964f, -0.002869f, 0.036467f, -0.027905f, 0.010525f, -0.034284f, 0.006822f, -0.064131f, 0.020781f, 0.068539f, -0.002524f, -0.005389f, 0.085075f, 0.014748f, -0.039587f, -0.083450f, 0.071020f, -0.037782f, 0.031887f, -0.030701f, 0.084939f, 0.037485f, -0.009641f, 0.008653f, -0.049595f, 0.006483f, 0.020931f, -0.023926f, 0.023514f, -0.103209f, 0.040168f, 0.093419f, 0.072828f, -0.040570f, -0.042295f, -0.042303f, 0.047030f, 0.003738f, -0.015303f, 0.003744f, 0.120472f, -0.059009f, -0.027812f, 0.046690f, -0.040531f, -0.109120f, 0.046017f, 0.024314f, -0.078240f, 0.043666f, 0.075177f, 0.066537f, -0.020659f, -0.029837f, -0.053470f, 0.028451f, -0.033120f, -0.021063f, 0.048117f, 0.032922f, 0.014662f, 0.042449f, 0.023669f, -0.016500f, -0.015636f, -0.054898f, 0.012491f, -0.023092f, 0.018693f, -0.020377f, 0.038812f, 0.026972f, 0.005661f, -0.007395f, 0.036883f, -0.020389f, -0.003204f, 0.004755f, 0.013960f, 0.008575f, 0.016861f, 0.015723f, 0.000958f, -0.009031f, -0.005673f, + 0.013193f, 0.006652f, 0.005275f, 0.001488f, 0.020798f, 0.067054f, -0.002085f, -0.005667f, 0.010023f, -0.023763f, 0.008252f, 0.023910f, -0.034788f, 0.014933f, 0.017913f, -0.013658f, -0.009794f, 0.015481f, 0.008860f, -0.020414f, -0.087355f, 0.046698f, -0.005087f, 0.012198f, -0.031996f, 0.027989f, 0.000620f, 0.015360f, 0.004683f, 0.005103f, -0.018176f, 0.013937f, 0.047328f, -0.060360f, 0.051931f, -0.008851f, -0.031846f, 0.010683f, -0.021653f, 0.014060f, -0.022184f, -0.018250f, 0.015384f, -0.048149f, -0.004916f, 0.064147f, -0.092587f, 0.026129f, 0.004441f, -0.015495f, -0.028443f, -0.033672f, -0.021876f, 0.067303f, -0.055402f, -0.007939f, 0.021778f, -0.056313f, 0.014314f, 0.030909f, 0.020698f, 0.010584f, 0.009766f, -0.031768f, 0.025038f, -0.082843f, 0.001188f, 0.072529f, -0.030301f, -0.008151f, -0.016246f, -0.020462f, -0.000550f, -0.058638f, 0.031109f, 0.023564f, -0.048453f, 0.045490f, 0.012704f, -0.055272f, 0.022770f, -0.010734f, 0.040129f, 0.034947f, -0.051370f, 0.017953f, 0.057147f, -0.053793f, 0.030144f, -0.038307f, 0.030210f, 0.034931f, -0.054571f, 0.030758f, -0.003893f, -0.028952f, + 0.041728f, 0.002188f, -0.065638f, 0.020185f, 0.029287f, 0.008815f, -0.018204f, 0.003177f, 0.049876f, -0.023041f, -0.046487f, 0.049550f, -0.002008f, 0.003745f, -0.002061f, -0.006265f, 0.030596f, -0.022776f, -0.010795f, 0.021550f, 0.008383f, -0.005340f, -0.022187f, 0.032872f, -0.012366f, -0.021608f, 0.001939f, 0.017272f, -0.010176f, -0.008040f, -0.004985f, 0.025657f, -0.019890f, -0.010440f, 0.002032f, 0.013898f, -0.012179f, 0.009946f, -0.000288f, 0.025424f, -0.015931f, 0.003966f, 0.002356f, 0.002431f, 0.022584f, 0.042331f, -0.018146f, -0.200754f, -0.439449f, -0.174350f, -0.292154f, -0.397812f, 0.150044f, 0.053210f, 0.129529f, 0.591163f, 0.492418f, 0.324493f, 0.507599f, 0.344816f, 0.040809f, 0.085462f, 0.061784f, -0.271376f, -0.175212f, -0.120858f, -0.310388f, -0.316814f, -0.088063f, -0.088990f, -0.197105f, -0.059206f, -0.042892f, -0.237326f, -0.204135f, -0.066779f, -0.112591f, -0.224195f, -0.055195f, -0.038203f, -0.175765f, -0.020993f, 0.121196f, -0.053571f, -0.043352f, 0.179185f, 0.109703f, -0.074134f, 0.158707f, 0.262176f, 0.028673f, 0.147165f, 0.321962f, 0.157086f, 0.080856f, 0.347345f, + 0.253800f, 0.188584f, 0.421923f, 0.571023f, 0.451561f, 0.524531f, 0.679936f, 0.443795f, 0.290278f, 0.380919f, 0.245207f, -0.069125f, -0.017477f, -0.169917f, -0.420215f, -0.593843f, -0.638789f, -0.854841f, -0.972349f, -1.032287f, -0.998641f, -0.959743f, -0.954220f, -0.797126f, -0.610280f, -0.572733f, -0.374029f, 0.029195f, 0.157704f, 0.204749f, 0.621712f, 0.610123f, 0.420615f, 0.619913f, 0.568121f, 0.307968f, 0.299266f, 0.395139f, 0.238773f, 0.112048f, 0.276193f, 0.281807f, 0.126256f, 0.227581f, 0.343869f, 0.227805f, 0.135343f, 0.292481f, 0.242140f, 0.048157f, 0.148094f, 0.214930f, 0.023466f, 0.040260f, 0.235332f, 0.143718f, 0.077084f, 0.249581f, 0.247388f, 0.089970f, 0.197006f, 0.170045f, -0.045004f, -0.124127f, -0.128665f, -0.295443f, -0.399886f, -0.394816f, -0.455679f, -0.502212f, -0.520811f, -0.509820f, -0.523007f, -0.581491f, -0.601585f, -0.575513f, -0.641987f, -0.549727f, -0.374703f, -0.286653f, -0.098090f, 0.165130f, 0.346344f, 0.507586f, 0.655448f, 0.666595f, 0.570826f, 0.518631f, 0.426143f, 0.322839f, 0.260449f, 0.219412f, 0.177545f, 0.139301f, 0.126527f, 0.117637f, + 0.087651f, 0.074576f, 0.066816f, 0.036630f, 0.001759f, -0.018027f, -0.049105f, -0.082996f, -0.104521f, -0.109999f, -0.120887f, -0.116783f, -0.095938f, -0.072418f, -0.053507f, -0.029930f, -0.015011f, -0.003327f, 0.010826f, 0.020482f, 0.020041f, 0.021091f, 0.013651f, 0.001534f, -0.004894f, -0.010768f, -0.022531f, -0.027531f, -0.030317f, -0.038503f, -0.039836f, -0.035311f, -0.042144f, -0.046870f, -0.041780f, -0.045381f, -0.052037f, -0.048520f, -0.057960f, -0.069327f, -0.065817f, -0.066081f, -0.070087f, -0.061295f, -0.052855f, -0.046691f, -0.033070f, -0.015934f, -0.006258f, 0.004827f, 0.020511f, 0.033794f, 0.045581f, 0.058572f, 0.068961f, 0.073316f, 0.078386f, 0.084033f, 0.086441f, 0.088297f, 0.090468f, 0.087365f, 0.080754f, 0.071791f, 0.060073f, 0.046473f, 0.029254f, 0.012017f, -0.004083f, -0.020560f, -0.031439f, -0.036136f, -0.037839f, -0.037081f, -0.032674f, -0.029042f, -0.027257f, -0.024233f, -0.021536f, -0.020404f, -0.018828f, -0.016763f, -0.015244f, -0.014030f, -0.012304f, -0.010521f, -0.009087f, -0.007645f, -0.006164f, -0.004997f, -0.004249f, -0.003704f, -0.003293f} + }, + { + {-0.007426f, 0.004516f, 0.007236f, -0.002557f, 0.006430f, -0.001050f, 0.006787f, 0.003412f, -0.001497f, -0.002664f, 0.006875f, 0.000577f, 0.001368f, -0.007824f, -0.001257f, -0.000567f, -0.000353f, 0.010687f, 0.005220f, -0.000394f, -0.008025f, -0.005837f, -0.003454f, 0.000975f, -0.000187f, 0.002312f, 0.004912f, 0.001493f, 0.001810f, -0.008099f, -0.001249f, -0.007883f, 0.000314f, -0.004361f, 0.005157f, 0.005148f, -0.002057f, -0.004255f, 0.005392f, 0.001152f, -0.002026f, -0.007288f, -0.000991f, -0.004675f, 0.001306f, 0.004452f, -0.007392f, -0.003610f, -0.001237f, -0.002894f, 0.018863f, 0.004492f, 0.010889f, 0.000791f, 0.003572f, -0.000084f, -0.005452f, -0.005059f, -0.006436f, 0.003039f, -0.005310f, 0.003818f, 0.000119f, 0.004662f, 0.004770f, 0.011582f, 0.003495f, -0.000962f, -0.000587f, -0.006881f, 0.011219f, 0.010321f, 0.001806f, 0.003182f, 0.002924f, 0.003194f, -0.000653f, -0.005760f, 0.001716f, 0.003331f, -0.002163f, 0.000964f, -0.001772f, -0.005263f, 0.002506f, -0.004390f, -0.002981f, -0.001367f, 0.000351f, -0.001964f, -0.002131f, -0.002501f, -0.000054f, -0.000137f, -0.000393f, 0.000507f, + -0.000878f, 0.001677f, -0.000932f, -0.001563f, -0.000151f, 0.002104f, 0.000792f, -0.000859f, -0.002823f, -0.000830f, 0.002615f, 0.000179f, 0.001181f, 0.001038f, 0.000735f, 0.026110f, -0.006126f, -0.005412f, -0.002076f, -0.005121f, 0.001237f, -0.012352f, 0.001007f, 0.002510f, 0.000670f, 0.008465f, 0.001004f, -0.001697f, -0.007403f, 0.004809f, -0.010452f, -0.009002f, 0.003305f, -0.004367f, -0.002071f, -0.001520f, 0.001788f, 0.007116f, 0.009716f, 0.000773f, -0.001463f, 0.011549f, 0.004186f, -0.000623f, 0.000457f, -0.004656f, 0.000183f, 0.012674f, 0.000043f, -0.005822f, -0.004709f, -0.001316f, 0.004322f, -0.005796f, -0.007166f, -0.007309f, -0.005983f, 0.005812f, -0.005626f, 0.002205f, -0.006844f, 0.002472f, 0.008368f, 0.000595f, 0.005957f, -0.002466f, -0.004661f, -0.002273f, 0.004144f, -0.000198f, 0.006393f, 0.009349f, 0.001399f, -0.002760f, -0.004773f, -0.000188f, -0.000675f, 0.000480f, 0.000332f, -0.008142f, -0.000830f, -0.003776f, -0.004134f, 0.004028f, 0.000878f, 0.002605f, 0.003054f, -0.009696f, -0.005401f, 0.004100f, -0.001789f, 0.007266f, 0.001346f, 0.006131f, -0.001205f, -0.001489f, + -0.001641f, -0.003472f, -0.000791f, -0.003829f, -0.001527f, 0.000173f, 0.005722f, -0.001309f, -0.000090f, -0.000921f, 0.001839f, 0.000014f, 0.002230f, 0.000503f, -0.000441f, -0.001368f, 0.001804f, -0.002724f, 0.000052f, 0.000214f, -0.001547f, 0.001378f, 0.001712f, -0.002287f, 0.000830f, -0.001092f, 0.001056f, 0.001059f, 0.000034f, 0.001749f, 0.000221f, -0.000795f, -0.018343f, -0.008927f, -0.003765f, -0.012463f, -0.004168f, -0.011954f, 0.003820f, -0.000839f, -0.007360f, -0.008523f, -0.001073f, -0.006921f, 0.000056f, 0.006176f, -0.000219f, -0.010649f, -0.003811f, 0.000391f, -0.004029f, -0.003296f, 0.003375f, 0.010482f, 0.013365f, -0.001887f, -0.003283f, 0.007611f, 0.008617f, -0.002385f, -0.001721f, -0.001441f, -0.005701f, 0.002036f, 0.002961f, -0.005109f, -0.003775f, -0.001012f, 0.005293f, 0.011448f, 0.000959f, -0.003548f, 0.000231f, -0.005425f, -0.001860f, -0.008761f, -0.004007f, -0.003759f, -0.013997f, -0.001281f, -0.006231f, -0.004250f, -0.015389f, 0.009924f, -0.006573f, -0.005796f, 0.003001f, -0.000740f, -0.000901f, 0.002277f, -0.012749f, -0.003138f, -0.004426f, -0.000795f, -0.007267f, -0.000790f, + -0.003305f, 0.003673f, 0.004728f, -0.003989f, -0.002031f, -0.005966f, 0.002422f, -0.000691f, -0.001044f, 0.000256f, -0.009382f, 0.000011f, -0.008458f, 0.001572f, -0.000365f, -0.002495f, 0.002786f, 0.010796f, 0.005255f, -0.002241f, 0.000798f, -0.001603f, -0.003880f, 0.000651f, 0.001860f, -0.001819f, -0.000070f, -0.002311f, 0.000295f, -0.000807f, -0.002955f, 0.001528f, 0.001454f, -0.003105f, -0.001342f, 0.001160f, -0.001181f, 0.000707f, -0.001960f, -0.001456f, -0.001550f, -0.002883f, -0.003166f, -0.000011f, 0.001093f, -0.001481f, -0.001821f, 0.000249f, -0.000740f, -0.000180f, -0.000878f, 0.000230f, -0.000399f, -0.000891f, -0.002573f, 0.001755f, -0.000759f, -0.001096f, -0.001132f, -0.002123f, -0.000144f, 0.000502f, -0.001737f, 0.000330f, 0.000360f, 0.000342f, -0.001370f, 0.000641f, -0.034542f, -0.002821f, -0.017081f, 0.015146f, -0.008947f, 0.027345f, -0.017668f, 0.017206f, -0.015674f, -0.001024f, -0.000344f, -0.012079f, 0.009216f, 0.000260f, -0.004585f, 0.002731f, -0.004030f, -0.001648f, -0.011803f, -0.000182f, -0.008937f, 0.006913f, 0.002318f, 0.008481f, -0.005138f, 0.012688f, 0.011350f, -0.011202f, + 0.003007f, -0.009531f, 0.009953f, 0.000039f, -0.007179f, 0.000539f, -0.001127f, -0.000413f, 0.007263f, 0.001040f, -0.011137f, 0.004496f, 0.007775f, -0.000563f, 0.009204f, -0.004384f, 0.007476f, -0.011438f, -0.005951f, 0.007450f, -0.006710f, 0.001865f, 0.009911f, -0.009185f, 0.014715f, 0.005860f, -0.014847f, 0.003552f, -0.014312f, 0.005074f, 0.007724f, 0.005320f, 0.007428f, 0.010917f, 0.003516f, -0.001351f, -0.001056f, 0.000720f, 0.003283f, 0.007853f, -0.002894f, 0.014842f, 0.002695f, 0.010174f, 0.005336f, 0.002963f, 0.000540f, 0.010215f, 0.001649f, 0.002548f, -0.006041f, -0.007942f, 0.003865f, 0.005528f, 0.000402f, 0.008798f, -0.001239f, -0.000041f, -0.001825f, 0.010448f, 0.002944f, -0.003687f, 0.002155f, 0.001817f, 0.001291f, 0.003593f, 0.000332f, 0.006529f, -0.001232f, 0.002283f, 0.001007f, 0.002533f, -0.001863f, 0.001294f, 0.000387f, 0.000207f, 0.000347f, -0.002144f, -0.002223f, 0.000890f, -0.002686f, -0.001017f, -0.002896f, 0.001772f, -0.000283f, -0.000791f, -0.001107f, 0.022863f, 0.000240f, -0.006077f, -0.001965f, -0.008368f, -0.010021f, 0.016730f, -0.003116f, -0.002300f, + 0.015354f, -0.001061f, -0.002838f, 0.006864f, 0.011970f, 0.003508f, 0.005998f, -0.000180f, -0.012844f, -0.003307f, 0.009837f, -0.014634f, -0.014514f, -0.005355f, 0.003306f, -0.010281f, -0.006152f, 0.000334f, -0.001357f, 0.010353f, -0.003842f, -0.002115f, 0.010883f, 0.015127f, -0.012898f, 0.003527f, -0.003000f, 0.005602f, 0.001594f, -0.005638f, -0.001159f, 0.006369f, 0.009661f, -0.002437f, -0.013403f, -0.002906f, -0.001096f, -0.003430f, -0.006643f, 0.001113f, -0.000765f, 0.002594f, -0.001769f, 0.002012f, 0.012704f, -0.009193f, 0.001296f, -0.006969f, -0.005673f, -0.009629f, -0.002860f, -0.005505f, -0.013417f, -0.000345f, 0.001007f, -0.005116f, -0.000956f, -0.005423f, 0.005287f, 0.006702f, -0.000956f, 0.002095f, -0.004788f, -0.001207f, 0.016374f, -0.002014f, -0.006690f, -0.021989f, -0.010011f, -0.000148f, -0.007498f, 0.005252f, -0.002084f, 0.002049f, 0.000034f, -0.004304f, -0.000783f, 0.006591f, -0.005391f, 0.001412f, -0.001484f, 0.000773f, 0.000062f, -0.004488f, -0.003386f, -0.001804f, -0.003534f, -0.000567f, -0.005624f, -0.001032f, -0.003175f, 0.000777f, -0.002207f, -0.000582f, -0.003023f, -0.003138f, + -0.003208f, -0.000678f, -0.000322f, 0.001314f, 0.000853f, -0.000289f, 0.000939f, 0.000909f, -0.000163f, 0.003320f, 0.002752f, 0.000116f, 0.001631f, -0.001146f, -0.001718f, 0.000551f, 0.029234f, 0.032885f, 0.006051f, -0.012306f, 0.007293f, 0.012817f, 0.012849f, 0.007149f, 0.009642f, 0.004189f, 0.015950f, -0.001884f, -0.002242f, -0.006848f, 0.009915f, -0.006200f, -0.014526f, -0.019895f, 0.002007f, -0.009661f, -0.008372f, 0.006726f, -0.002323f, -0.005457f, 0.016296f, -0.001412f, 0.020307f, -0.000004f, -0.008379f, -0.005777f, 0.006963f, 0.004574f, -0.004302f, -0.016494f, 0.023228f, 0.013362f, -0.000114f, 0.012518f, 0.007352f, 0.008069f, -0.007948f, 0.009139f, 0.004521f, 0.001677f, -0.003084f, -0.004391f, -0.010601f, -0.014806f, 0.003886f, 0.006879f, -0.011628f, 0.004380f, 0.009592f, 0.014481f, 0.003643f, 0.013066f, 0.005913f, 0.011107f, -0.016829f, 0.004752f, 0.001293f, 0.003158f, 0.000185f, -0.001307f, 0.006814f, 0.006234f, 0.005993f, 0.008883f, -0.003220f, 0.004232f, 0.002370f, 0.012856f, 0.015715f, -0.008221f, -0.009675f, 0.001274f, -0.004081f, -0.008626f, 0.003325f, 0.008678f, + -0.005681f, 0.003594f, -0.016177f, -0.011857f, 0.002472f, -0.008225f, -0.004034f, -0.002751f, -0.007477f, -0.000108f, -0.000328f, 0.000790f, -0.000404f, 0.003041f, 0.003526f, -0.000375f, 0.001668f, 0.000533f, 0.002612f, 0.002904f, -0.000191f, 0.000112f, -0.000424f, 0.003191f, 0.001440f, 0.001717f, 0.003849f, -0.000810f, -0.002315f, 0.002975f, -0.001117f, -0.000107f, 0.004452f, 0.002798f, 0.004201f, 0.005980f, 0.000711f, 0.002637f, 0.001399f, 0.003938f, 0.000833f, 0.001623f, 0.001967f, 0.027011f, 0.008492f, 0.011895f, -0.009976f, 0.003867f, -0.024585f, 0.001265f, -0.017782f, 0.013365f, 0.008955f, -0.007511f, 0.011221f, 0.006373f, -0.012068f, -0.003020f, 0.017270f, -0.000607f, 0.011868f, -0.003309f, 0.002326f, 0.013798f, -0.017279f, -0.001359f, 0.002742f, 0.005026f, 0.001075f, 0.005535f, 0.000648f, 0.016751f, -0.007855f, -0.004846f, -0.005148f, 0.012664f, 0.001532f, -0.005979f, 0.007622f, 0.021375f, -0.015020f, 0.002628f, 0.002796f, -0.001313f, 0.008551f, -0.004338f, 0.016257f, 0.005484f, 0.004050f, -0.013409f, -0.001416f, -0.003560f, 0.007490f, 0.005693f, 0.008096f, -0.009209f, + -0.006099f, 0.007783f, -0.016141f, -0.008992f, 0.003552f, 0.017261f, 0.010373f, 0.015266f, -0.016739f, -0.005271f, -0.017011f, -0.004382f, 0.005039f, -0.001442f, -0.016058f, 0.002097f, -0.009878f, -0.000137f, -0.017566f, -0.021168f, -0.008743f, -0.015278f, 0.000778f, 0.005408f, 0.002945f, -0.006531f, 0.008347f, 0.013577f, 0.003708f, 0.004013f, 0.007705f, -0.002446f, -0.013115f, -0.000785f, -0.009055f, 0.004693f, 0.001386f, -0.000868f, 0.002320f, 0.001226f, -0.009640f, -0.004864f, -0.002818f, 0.004794f, 0.000584f, -0.003333f, -0.001254f, -0.000279f, -0.001503f, 0.000802f, -0.002051f, -0.000873f, 0.000561f, 0.004370f, 0.000995f, 0.001429f, 0.000874f, -0.000834f, 0.001174f, 0.002926f, 0.001389f, 0.003803f, 0.001019f, 0.001978f, 0.000111f, 0.003017f, -0.004784f, 0.002983f, -0.031629f, -0.028495f, -0.020421f, 0.006583f, 0.006664f, 0.024158f, -0.010289f, 0.022956f, -0.009005f, -0.037175f, -0.003072f, -0.003222f, -0.014225f, -0.023963f, -0.008587f, -0.000274f, -0.014675f, 0.000126f, -0.022717f, 0.001933f, -0.023963f, 0.014120f, -0.005844f, 0.010354f, -0.004500f, -0.000182f, -0.007278f, -0.008495f, + 0.015205f, 0.003178f, -0.004111f, 0.017209f, 0.002144f, 0.002972f, 0.006069f, 0.015854f, 0.013956f, 0.010696f, 0.000503f, -0.018246f, -0.001692f, 0.009115f, 0.002928f, 0.011563f, -0.005199f, 0.005281f, -0.026909f, 0.008812f, 0.016597f, -0.020326f, 0.012325f, 0.004457f, 0.019588f, 0.015037f, 0.000175f, -0.004893f, -0.000271f, 0.013363f, 0.006683f, -0.017106f, -0.013896f, -0.023739f, -0.011403f, -0.015868f, -0.003457f, -0.019685f, -0.004053f, -0.006470f, 0.020452f, -0.009259f, 0.010198f, -0.005059f, -0.002785f, -0.006413f, -0.013837f, -0.007301f, -0.004328f, -0.004477f, 0.012938f, -0.038163f, -0.008002f, 0.018123f, 0.000993f, 0.003626f, 0.009770f, 0.018348f, -0.011233f, 0.002351f, 0.004989f, -0.000667f, -0.000011f, -0.002484f, 0.005134f, 0.007691f, -0.003125f, 0.000786f, -0.000575f, 0.008571f, -0.002956f, -0.000079f, 0.008614f, 0.001901f, 0.003135f, 0.004084f, 0.004128f, -0.001222f, 0.000867f, -0.002094f, -0.003129f, -0.001694f, -0.005666f, 0.001853f, 0.003975f, 0.002808f, 0.001688f, -0.007406f, 0.000188f, -0.000835f, -0.000197f, -0.003379f, 0.002265f, 0.003566f, -0.001672f, -0.000193f, + 0.004174f, 0.004440f, -0.004469f, -0.042560f, 0.031860f, -0.009558f, 0.018654f, 0.010654f, -0.001225f, -0.028316f, 0.021497f, 0.002518f, -0.002377f, 0.013386f, 0.009382f, -0.011983f, -0.000644f, 0.023151f, 0.007394f, -0.011168f, 0.016326f, -0.009680f, -0.007833f, -0.005569f, 0.004935f, -0.000395f, -0.003512f, 0.001763f, 0.006747f, 0.005915f, 0.006169f, -0.017927f, 0.010309f, -0.014987f, 0.019230f, -0.012771f, 0.019138f, 0.005764f, 0.001423f, -0.019753f, -0.019967f, -0.007021f, -0.006950f, 0.022234f, 0.005998f, 0.017667f, 0.007200f, -0.016847f, 0.000178f, -0.004277f, 0.007372f, -0.000130f, 0.006439f, -0.002617f, -0.011399f, -0.007002f, 0.011125f, 0.028286f, 0.020381f, 0.001740f, 0.006714f, -0.002704f, -0.004491f, 0.014201f, 0.011989f, -0.005934f, 0.017851f, 0.025177f, 0.035635f, 0.000137f, -0.021118f, -0.025553f, 0.008252f, 0.003876f, -0.001478f, 0.005620f, -0.000305f, -0.008633f, -0.001357f, 0.021145f, -0.004396f, -0.010181f, 0.038398f, 0.009148f, -0.006988f, 0.010758f, -0.000150f, -0.001065f, -0.001637f, -0.006816f, -0.001282f, 0.011146f, 0.005453f, -0.004451f, -0.006086f, 0.007617f, + 0.006307f, -0.001208f, 0.015371f, 0.003900f, 0.002583f, 0.001056f, 0.006691f, 0.002069f, 0.006247f, 0.003921f, 0.001941f, 0.000675f, 0.007975f, 0.003987f, 0.004081f, 0.000591f, 0.007918f, -0.001696f, 0.002885f, 0.004307f, 0.003078f, -0.001281f, 0.008895f, 0.009974f, 0.002927f, -0.002307f, 0.010710f, 0.000280f, -0.005412f, -0.001450f, 0.007751f, -0.000120f, -0.000955f, -0.002246f, -0.001728f, -0.000127f, 0.001838f, 0.004694f, 0.007187f, 0.002079f, 0.007603f, -0.002285f, 0.019542f, -0.028581f, 0.024062f, 0.009891f, -0.019502f, 0.045695f, 0.006894f, -0.023334f, 0.005437f, 0.012723f, 0.001256f, 0.009188f, 0.032838f, -0.031372f, 0.020522f, -0.012691f, 0.018214f, -0.006927f, 0.003939f, -0.029063f, 0.005008f, -0.003161f, 0.011754f, -0.011146f, 0.001705f, 0.002223f, 0.000389f, -0.017067f, 0.016459f, 0.001715f, -0.001680f, 0.007705f, -0.003169f, 0.007590f, -0.003959f, 0.023066f, 0.018316f, 0.022831f, 0.022836f, -0.003687f, 0.008055f, 0.009836f, 0.001127f, -0.011951f, 0.016195f, -0.019068f, 0.006012f, 0.018887f, -0.011108f, 0.010002f, -0.020980f, 0.006736f, -0.001703f, -0.005035f, + -0.001683f, 0.001609f, 0.006670f, 0.006272f, 0.022392f, -0.014601f, -0.000559f, 0.014713f, 0.031849f, -0.028106f, 0.007360f, -0.006914f, 0.009796f, -0.005178f, 0.046453f, -0.028504f, 0.010336f, -0.015890f, -0.008634f, 0.004124f, 0.005019f, 0.002551f, -0.040300f, -0.021351f, 0.033629f, 0.018322f, -0.003492f, -0.018095f, -0.020744f, -0.008304f, 0.007667f, -0.022520f, -0.012095f, 0.011079f, 0.006400f, -0.000461f, -0.000442f, -0.015761f, 0.003150f, -0.004586f, -0.005734f, 0.007214f, -0.003666f, -0.004861f, -0.001644f, -0.013788f, 0.004890f, -0.003571f, -0.004470f, -0.005014f, 0.006488f, -0.006650f, 0.007861f, -0.001196f, -0.001756f, 0.002624f, 0.002915f, 0.009902f, -0.009994f, -0.002170f, -0.007557f, -0.001652f, 0.005151f, 0.003759f, 0.013187f, -0.004251f, 0.007360f, 0.001613f, -0.004568f, -0.003111f, -0.001105f, 0.004916f, -0.000593f, 0.002521f, 0.021446f, -0.028081f, -0.005914f, 0.039846f, -0.011889f, -0.000742f, 0.021376f, 0.005060f, 0.013214f, -0.029643f, 0.028550f, 0.001908f, 0.002188f, -0.007487f, -0.017806f, -0.002409f, -0.002705f, -0.019085f, -0.011486f, 0.021269f, -0.006685f, 0.004124f, + -0.010356f, -0.046608f, 0.015859f, 0.002169f, -0.014350f, 0.008958f, 0.018135f, -0.001647f, 0.002061f, -0.003604f, 0.004609f, 0.012293f, 0.003963f, 0.019724f, 0.013542f, 0.003124f, 0.017270f, -0.013820f, -0.013589f, -0.019402f, 0.007410f, 0.011279f, 0.003334f, -0.030802f, 0.008810f, -0.026314f, 0.038246f, -0.009016f, 0.013634f, 0.032612f, -0.012776f, 0.020734f, 0.005230f, 0.022570f, 0.009138f, -0.010840f, -0.033377f, -0.023969f, -0.018646f, -0.002544f, -0.019576f, -0.003889f, -0.017106f, -0.011112f, 0.033694f, 0.007323f, -0.014281f, -0.012699f, 0.006844f, 0.012526f, -0.002865f, 0.004911f, -0.061098f, 0.024648f, 0.004223f, -0.019588f, -0.024058f, -0.006260f, -0.040336f, 0.004391f, 0.020131f, 0.002249f, -0.017303f, 0.010753f, 0.009090f, -0.014234f, 0.007191f, 0.004275f, -0.003509f, 0.000503f, -0.009086f, 0.002431f, 0.003222f, 0.002393f, -0.011858f, -0.006491f, 0.004938f, -0.007434f, 0.001765f, -0.004481f, -0.002834f, 0.002893f, 0.010078f, -0.012702f, 0.004478f, 0.009913f, -0.011807f, -0.011140f, 0.001513f, -0.010224f, 0.002397f, -0.006785f, 0.007107f, 0.003840f, -0.011831f, 0.006666f, + -0.007760f, -0.005040f, 0.008225f, 0.001907f, 0.018465f, 0.005715f, 0.000000f, -0.001151f, 0.001472f, -0.004829f, 0.002070f, 0.013675f, -0.037469f, -0.046020f, 0.028291f, -0.022451f, -0.026167f, -0.007271f, 0.017880f, 0.036470f, -0.023494f, 0.002225f, 0.017545f, -0.004901f, -0.007180f, 0.009590f, 0.006379f, 0.027476f, 0.009430f, -0.025891f, -0.000665f, -0.013004f, -0.000570f, -0.015282f, -0.020160f, 0.003416f, 0.020841f, -0.001246f, 0.009484f, -0.016752f, 0.005328f, 0.020532f, 0.016057f, 0.002632f, 0.001943f, 0.012922f, 0.012366f, 0.007911f, 0.018894f, -0.023228f, 0.026072f, 0.018755f, 0.006676f, -0.019162f, 0.001768f, 0.015192f, -0.015000f, 0.017609f, -0.011840f, 0.019912f, -0.004908f, 0.025924f, -0.040039f, 0.043092f, 0.010388f, 0.040648f, 0.002945f, -0.008334f, -0.002488f, 0.014820f, 0.001294f, -0.033534f, 0.001655f, -0.002182f, -0.034686f, 0.011276f, 0.025213f, -0.033023f, 0.028019f, -0.029049f, 0.009443f, 0.011491f, 0.006396f, -0.036407f, -0.017347f, -0.017776f, 0.003850f, 0.002916f, -0.021064f, -0.031157f, 0.006442f, -0.027383f, 0.019121f, -0.013126f, -0.006914f, 0.009661f, + -0.016896f, -0.013087f, -0.017344f, -0.007081f, -0.009537f, 0.000729f, -0.013813f, -0.010340f, -0.012578f, -0.018865f, -0.008986f, -0.003800f, -0.004021f, -0.004638f, -0.005275f, -0.003518f, -0.008796f, -0.009754f, 0.006862f, -0.011711f, -0.006198f, -0.002869f, 0.009468f, -0.004302f, 0.000574f, -0.015010f, -0.010683f, -0.004775f, -0.000012f, -0.003272f, -0.012711f, -0.001617f, -0.000841f, 0.010735f, 0.007067f, -0.008365f, -0.007747f, 0.001911f, -0.004010f, 0.007971f, -0.004085f, 0.004361f, -0.007758f, -0.021850f, 0.032094f, 0.006151f, 0.020989f, 0.020315f, 0.005428f, -0.016416f, 0.003142f, 0.054426f, -0.038106f, 0.008653f, -0.007018f, -0.021026f, 0.000846f, 0.006934f, 0.008476f, -0.000697f, -0.000237f, -0.011246f, -0.016210f, -0.025102f, -0.012827f, 0.018182f, -0.015985f, -0.025226f, 0.013893f, -0.009333f, 0.005115f, -0.003736f, 0.010726f, -0.011009f, 0.022995f, -0.008883f, 0.002190f, -0.000997f, 0.002136f, 0.021032f, 0.006990f, -0.010458f, 0.011144f, -0.009614f, 0.017303f, -0.011080f, 0.006915f, -0.025702f, -0.018739f, -0.013997f, 0.004103f, -0.013093f, -0.022295f, 0.008767f, 0.016013f, 0.004284f, + -0.011988f, 0.007031f, 0.011235f, 0.012586f, 0.034975f, 0.048140f, 0.065827f, -0.007205f, 0.010271f, 0.015498f, 0.009083f, 0.008466f, 0.010369f, -0.013963f, 0.025978f, -0.004136f, 0.033997f, 0.041826f, 0.030760f, 0.012152f, 0.017216f, 0.005432f, 0.058880f, 0.016605f, -0.011046f, -0.009756f, -0.008621f, -0.003766f, -0.004017f, 0.002777f, -0.004926f, -0.011398f, 0.009685f, -0.017837f, 0.005006f, -0.004286f, 0.005299f, -0.009017f, -0.007138f, -0.005756f, 0.013226f, -0.013340f, -0.012726f, -0.001211f, 0.005361f, -0.006853f, -0.016277f, -0.005631f, 0.000776f, -0.007930f, 0.008460f, 0.016074f, -0.009447f, -0.001292f, 0.003340f, -0.001861f, 0.005367f, 0.009261f, -0.004532f, -0.011464f, -0.001960f, 0.005286f, -0.005581f, 0.014611f, 0.017546f, 0.010605f, -0.005104f, -0.012064f, -0.001602f, 0.017109f, 0.001950f, -0.000603f, 0.007698f, 0.002310f, -0.000154f, -0.003000f, 0.004318f, 0.004285f, -0.011651f, -0.008625f, -0.000449f, 0.066041f, 0.052878f, -0.023009f, -0.010566f, -0.027455f, 0.015865f, 0.007737f, 0.032359f, -0.005677f, -0.013978f, -0.006324f, -0.020926f, 0.004731f, 0.000832f, 0.030500f, + -0.011390f, 0.011372f, -0.041017f, 0.022615f, -0.003186f, 0.015914f, -0.000164f, 0.014418f, 0.002500f, -0.023373f, -0.012017f, -0.020055f, -0.015176f, 0.016870f, 0.040748f, 0.017714f, -0.004789f, -0.012639f, -0.000497f, -0.003443f, 0.010209f, 0.013729f, -0.025966f, -0.000541f, -0.009010f, -0.008738f, -0.028195f, -0.021857f, -0.045731f, 0.000809f, -0.002227f, 0.016471f, -0.013653f, 0.029321f, -0.022224f, -0.009862f, 0.058853f, 0.058156f, -0.040161f, 0.008945f, 0.033843f, -0.019635f, -0.009253f, 0.017310f, -0.006389f, -0.024654f, 0.065469f, -0.016329f, -0.099197f, 0.032984f, -0.001167f, -0.051251f, 0.039281f, 0.041751f, -0.014713f, 0.029211f, 0.037333f, -0.017653f, 0.001435f, 0.023533f, -0.025445f, 0.010638f, 0.020645f, -0.036684f, -0.004903f, -0.012146f, 0.002133f, -0.013474f, 0.000347f, 0.005060f, -0.015334f, 0.012406f, -0.017799f, -0.008341f, 0.008894f, 0.017619f, -0.010046f, 0.000936f, 0.003716f, -0.002737f, 0.006183f, -0.013004f, 0.019194f, -0.009745f, 0.020266f, 0.019387f, -0.000291f, 0.000932f, 0.013387f, -0.009736f, 0.003050f, -0.000593f, 0.016735f, -0.012462f, 0.010226f, 0.002984f, + -0.038541f, 0.007422f, -0.004625f, -0.007351f, 0.002314f, -0.001160f, 0.004368f, -0.021940f, 0.003215f, -0.005763f, -0.019080f, 0.003250f, 0.033385f, -0.031230f, 0.010502f, 0.018130f, -0.026356f, -0.000178f, 0.014991f, -0.023973f, -0.011532f, 0.005336f, 0.012281f, 0.022639f, 0.011354f, -0.017068f, -0.002626f, 0.016923f, -0.017993f, 0.019354f, -0.008650f, -0.023211f, 0.022120f, 0.011752f, 0.011320f, -0.005325f, -0.005403f, -0.007811f, -0.000574f, 0.018718f, -0.036771f, 0.019207f, -0.000204f, 0.031803f, -0.019094f, 0.000699f, -0.023883f, 0.011282f, -0.039231f, 0.005031f, 0.002342f, -0.015201f, -0.011429f, 0.007014f, -0.026233f, -0.045672f, 0.028619f, -0.001974f, 0.009000f, -0.026762f, 0.017353f, -0.003815f, 0.018605f, 0.019952f, 0.010160f, -0.018697f, 0.016531f, -0.008649f, -0.003671f, -0.035171f, 0.005716f, -0.024857f, -0.027372f, -0.040153f, -0.016173f, 0.007139f, 0.011863f, -0.041467f, -0.020240f, 0.002878f, -0.014512f, -0.055898f, -0.044261f, -0.045460f, -0.009003f, -0.026935f, 0.024953f, 0.034984f, 0.009969f, -0.033454f, -0.038961f, -0.045458f, -0.003776f, -0.002810f, 0.025661f, -0.021635f, + -0.037880f, -0.018283f, -0.025058f, 0.009296f, 0.000987f, 0.009686f, 0.005095f, -0.012090f, 0.003232f, 0.009956f, -0.009436f, -0.003621f, -0.007922f, -0.004735f, -0.005594f, -0.011735f, -0.000090f, 0.015759f, 0.000997f, 0.004987f, 0.004915f, -0.002101f, 0.011902f, -0.006893f, 0.018141f, 0.016387f, -0.005795f, -0.013706f, -0.000246f, -0.004937f, -0.007500f, -0.008426f, -0.007493f, 0.013277f, 0.001012f, 0.012537f, -0.012076f, -0.013064f, -0.002044f, 0.007149f, -0.021329f, 0.004274f, 0.002616f, -0.015405f, 0.003913f, -0.012586f, -0.028020f, 0.018064f, -0.006379f, 0.002714f, -0.004318f, 0.003520f, -0.014148f, -0.003253f, -0.001048f, -0.029713f, 0.049285f, 0.054843f, -0.014040f, 0.036739f, -0.011297f, -0.015384f, -0.015219f, 0.035738f, -0.032407f, -0.008004f, -0.015734f, 0.057092f, 0.001608f, 0.020432f, 0.007038f, -0.006125f, 0.028297f, 0.015436f, 0.023084f, 0.006736f, -0.004178f, -0.010825f, 0.022093f, -0.004474f, -0.022624f, 0.026931f, -0.001214f, 0.023490f, -0.027513f, 0.018150f, 0.006270f, -0.028262f, -0.021672f, 0.049517f, 0.032218f, -0.003825f, 0.017617f, 0.014313f, -0.032343f, -0.021703f, + 0.010190f, 0.007290f, 0.021972f, 0.002031f, 0.004544f, 0.007966f, 0.026916f, 0.010462f, 0.006658f, -0.027945f, 0.074823f, 0.049680f, 0.005478f, -0.034593f, 0.016507f, -0.012172f, 0.009065f, -0.008543f, 0.015815f, -0.011878f, 0.002267f, 0.040646f, -0.028992f, -0.014695f, -0.038866f, 0.009948f, -0.010753f, -0.007633f, 0.035069f, 0.010256f, 0.004254f, 0.002175f, -0.014785f, -0.029681f, 0.020619f, -0.000933f, 0.000200f, 0.021477f, 0.022007f, -0.002696f, -0.016548f, -0.019896f, 0.036318f, -0.004757f, -0.002336f, -0.008067f, 0.027267f, -0.003190f, -0.019392f, 0.011596f, 0.010013f, 0.016203f, 0.007648f, 0.005064f, 0.025207f, -0.006214f, -0.009455f, 0.007824f, -0.000814f, -0.000013f, 0.002057f, 0.010603f, -0.006727f, -0.001128f, -0.008524f, 0.001674f, 0.012057f, -0.006775f, 0.002741f, 0.014219f, -0.005562f, 0.002162f, 0.010997f, -0.000364f, -0.003165f, -0.024806f, 0.015242f, -0.014406f, 0.009954f, -0.016993f, -0.003579f, 0.005179f, -0.010080f, -0.005183f, 0.022423f, 0.015138f, 0.001840f, -0.004752f, 0.020970f, 0.002916f, 0.009982f, 0.008042f, 0.004672f, -0.005103f, 0.009007f, 0.003457f, + 0.008919f, -0.018425f, -0.039551f, 0.101616f, -0.114687f, -0.013517f, -0.060517f, 0.073628f, 0.019595f, 0.012768f, -0.029058f, 0.006661f, -0.023776f, 0.065953f, -0.011996f, -0.004495f, 0.006488f, -0.003519f, -0.026193f, 0.009669f, 0.014745f, 0.019803f, -0.044999f, -0.023680f, -0.023326f, 0.008966f, -0.013843f, -0.012232f, -0.001750f, -0.000607f, 0.029012f, -0.015318f, 0.001134f, 0.021981f, -0.003085f, -0.029654f, 0.003382f, 0.023157f, -0.003123f, -0.046633f, 0.034403f, 0.004025f, 0.000298f, -0.000216f, -0.019962f, 0.015189f, -0.086352f, -0.060177f, -0.008734f, -0.021627f, 0.003550f, 0.006462f, -0.040640f, 0.063219f, -0.025450f, 0.087138f, -0.012682f, -0.030644f, 0.029509f, 0.004905f, 0.026295f, 0.040315f, 0.012440f, -0.041576f, -0.011877f, 0.046572f, 0.107885f, 0.003534f, -0.028059f, 0.045066f, 0.003529f, 0.053168f, 0.008234f, 0.072000f, -0.018972f, -0.002924f, -0.002322f, 0.016796f, 0.002107f, 0.027656f, 0.050250f, 0.002984f, -0.011091f, -0.009049f, 0.015744f, -0.013759f, -0.006298f, 0.033041f, 0.023765f, 0.003627f, -0.006566f, -0.012467f, -0.014391f, -0.008564f, -0.011781f, 0.023830f, + -0.015142f, -0.010262f, 0.011397f, 0.004251f, -0.004935f, 0.010679f, 0.011735f, -0.006745f, 0.010005f, 0.016937f, -0.009175f, 0.001127f, -0.024401f, 0.030304f, -0.000568f, 0.024375f, 0.001196f, -0.025396f, -0.000266f, 0.002646f, 0.006246f, 0.002730f, -0.000443f, -0.021816f, -0.020663f, -0.001209f, -0.012211f, 0.016117f, 0.005448f, -0.007447f, -0.001202f, 0.012685f, 0.002135f, -0.007305f, 0.000257f, 0.009199f, -0.000365f, -0.004412f, -0.001399f, 0.004995f, 0.149667f, 0.046811f, 0.017024f, -0.004173f, -0.015495f, -0.020895f, 0.049215f, 0.045171f, -0.050932f, 0.031050f, 0.023700f, 0.005769f, -0.015015f, -0.026851f, -0.069653f, -0.025847f, 0.022965f, 0.007751f, -0.022048f, 0.042825f, -0.013243f, 0.017599f, 0.017490f, -0.009802f, -0.009405f, 0.044670f, 0.001682f, -0.016401f, 0.028138f, -0.023659f, 0.054797f, -0.026179f, -0.015652f, -0.002529f, 0.021680f, 0.011662f, 0.055411f, -0.016466f, -0.032337f, -0.011254f, 0.015017f, 0.004190f, 0.029917f, 0.008496f, 0.003078f, -0.011546f, 0.024200f, 0.103486f, 0.044304f, -0.037892f, 0.033555f, -0.019680f, -0.030810f, 0.025841f, -0.000662f, 0.007827f, + -0.001609f, 0.018731f, -0.026855f, -0.041130f, -0.109667f, -0.028579f, 0.039724f, -0.014146f, -0.037370f, 0.016926f, -0.008390f, 0.016860f, -0.043699f, -0.038256f, -0.017818f, 0.016994f, 0.017948f, 0.052939f, 0.009635f, -0.003301f, -0.040738f, -0.057795f, -0.006863f, -0.025768f, 0.005447f, 0.021381f, -0.027370f, -0.028118f, -0.005771f, -0.035079f, -0.058853f, -0.019293f, -0.015370f, -0.031260f, -0.007019f, 0.017991f, -0.016161f, -0.008317f, -0.018635f, -0.004022f, -0.041824f, -0.026470f, -0.026503f, 0.001176f, 0.004279f, 0.015673f, -0.023230f, 0.013700f, -0.031456f, 0.001751f, -0.018369f, -0.002008f, 0.010233f, -0.009407f, 0.015337f, -0.041417f, -0.007930f, 0.014680f, 0.006337f, 0.013531f, -0.004945f, -0.010995f, 0.020870f, -0.003635f, -0.003891f, 0.014737f, -0.020541f, -0.016186f, -0.002706f, 0.004372f, -0.027370f, -0.012771f, -0.014735f, -0.008025f, -0.001972f, 0.000065f, 0.002758f, -0.012096f, 0.001660f, -0.003428f, -0.024085f, 0.032339f, -0.027229f, 0.090330f, 0.075689f, 0.035103f, -0.021617f, -0.032721f, 0.053886f, 0.046150f, -0.062106f, -0.013097f, -0.038339f, 0.052113f, -0.009668f, -0.075462f, + -0.033339f, 0.026070f, 0.046086f, -0.087123f, 0.034009f, -0.060490f, 0.021480f, -0.035943f, -0.009871f, 0.041090f, -0.014744f, 0.005799f, 0.025889f, 0.054956f, -0.037033f, -0.061457f, 0.012930f, -0.005318f, 0.005919f, 0.056370f, 0.013615f, 0.041945f, -0.054512f, -0.010433f, 0.016540f, -0.048492f, 0.077707f, -0.009642f, 0.046273f, -0.007044f, -0.011746f, 0.038078f, 0.037813f, -0.022634f, 0.085649f, -0.020688f, -0.038327f, 0.041229f, 0.073485f, 0.003774f, 0.012711f, 0.003171f, 0.031998f, -0.035339f, 0.025521f, 0.112243f, 0.051080f, -0.003922f, 0.048467f, 0.060237f, -0.045653f, -0.138202f, 0.009702f, 0.082746f, 0.093208f, 0.025345f, -0.009792f, -0.040959f, 0.048040f, 0.103434f, 0.047715f, 0.024977f, -0.102402f, 0.018876f, -0.058318f, -0.036183f, -0.090364f, 0.075912f, 0.015883f, -0.026557f, -0.036366f, 0.026527f, -0.026471f, 0.014256f, 0.009545f, 0.013279f, -0.033901f, -0.007303f, -0.004794f, 0.017528f, -0.012103f, 0.014799f, 0.012458f, -0.015333f, -0.010429f, 0.020661f, 0.000281f, 0.022205f, -0.010129f, 0.008159f, -0.015282f, 0.007799f, 0.041626f, 0.007832f, 0.007334f, -0.005479f, + -0.045971f, -0.023080f, -0.028592f, 0.014902f, 0.075967f, 0.072037f, 0.064667f, -0.005169f, -0.047962f, -0.044957f, -0.021887f, 0.030244f, 0.033317f, -0.002553f, -0.016258f, -0.024309f, -0.035831f, 0.009324f, 0.019301f, 0.016453f, 0.015006f, 0.012110f, -0.000171f, 0.001234f, -0.006839f, 0.007028f, -0.009898f, 0.006784f, -0.002623f, -0.001455f, -0.000356f, 0.008819f, 0.002077f, 0.003799f, 0.000581f, 0.004180f, -0.007511f, 0.000820f, -0.003524f, -0.001132f, 0.063614f, -0.124830f, 0.095929f, 0.020196f, -0.057020f, 0.001150f, 0.053818f, -0.035229f, 0.001889f, 0.029994f, -0.036891f, 0.003513f, -0.033113f, -0.020930f, 0.035767f, -0.030058f, -0.016902f, -0.063500f, 0.028011f, 0.062342f, 0.017815f, -0.027588f, -0.046984f, -0.007267f, 0.035947f, 0.019546f, -0.040081f, -0.000786f, 0.049088f, -0.006167f, 0.003678f, -0.016344f, -0.011572f, 0.114759f, -0.054602f, -0.013762f, -0.012425f, 0.019494f, 0.053516f, -0.056285f, -0.031405f, 0.075570f, -0.008584f, -0.004606f, -0.089850f, -0.074313f, 0.031491f, 0.050875f, 0.027972f, -0.092122f, 0.063567f, -0.001500f, -0.013867f, 0.013413f, -0.065764f, -0.018120f, + -0.008321f, -0.032553f, 0.059622f, -0.046210f, -0.025531f, -0.049707f, -0.028585f, -0.065598f, 0.020041f, -0.102653f, -0.028618f, 0.012171f, -0.050981f, 0.012755f, 0.028656f, 0.012602f, -0.000559f, -0.018334f, -0.036794f, 0.054484f, -0.011645f, -0.005174f, -0.019408f, 0.033006f, 0.066132f, 0.009967f, -0.089008f, 0.007919f, -0.039574f, 0.005990f, 0.008385f, -0.016237f, 0.006349f, -0.026677f, -0.008899f, -0.002248f, -0.020115f, 0.000381f, -0.005686f, 0.015664f, 0.014068f, -0.004902f, 0.007134f, 0.029148f, -0.013084f, -0.010523f, 0.029919f, -0.021719f, 0.019889f, -0.010575f, -0.009976f, 0.002133f, -0.012611f, -0.006213f, 0.018236f, -0.035487f, 0.010737f, 0.008231f, 0.013197f, 0.025237f, -0.017771f, 0.002923f, 0.019006f, 0.006772f, -0.006403f, -0.016854f, -0.003267f, -0.004184f, 0.000496f, -0.017300f, 0.005195f, -0.003161f, -0.006959f, 0.004064f, 0.002306f, -0.008114f, 0.018222f, -0.007916f, -0.005522f, 0.000289f, 0.004817f, -0.000827f, -0.072158f, 0.043534f, -0.001489f, 0.056399f, -0.011813f, 0.058351f, 0.007154f, -0.007581f, 0.025966f, 0.067742f, 0.032302f, 0.017297f, 0.013357f, 0.008585f, + 0.026478f, -0.034224f, -0.002992f, -0.025677f, -0.027127f, 0.041667f, 0.025726f, 0.015916f, -0.012256f, -0.010534f, -0.005204f, 0.043603f, 0.006417f, -0.019352f, -0.031831f, -0.001465f, -0.007748f, 0.032804f, 0.004700f, 0.027438f, 0.051260f, -0.014377f, -0.130925f, 0.008576f, 0.105837f, 0.011076f, -0.078191f, -0.010082f, 0.029661f, 0.023556f, 0.041364f, 0.037920f, -0.003445f, -0.024630f, -0.025607f, 0.033197f, -0.020546f, 0.003719f, 0.011248f, -0.135630f, -0.023893f, -0.026076f, 0.021153f, 0.106609f, -0.002345f, 0.008569f, -0.025143f, 0.007253f, 0.021574f, 0.044732f, 0.022940f, -0.026423f, -0.014331f, -0.065842f, -0.004428f, 0.045286f, -0.020419f, -0.009387f, 0.016221f, 0.046010f, 0.036816f, -0.009899f, -0.047277f, 0.000310f, 0.016614f, 0.005244f, -0.031586f, 0.003880f, 0.003285f, -0.002315f, -0.027351f, -0.034767f, 0.029729f, 0.024883f, -0.001769f, -0.005385f, -0.026784f, 0.020902f, 0.008092f, 0.004826f, 0.007569f, 0.006731f, 0.011534f, 0.000879f, -0.029645f, 0.016385f, 0.000259f, -0.001701f, 0.001119f, 0.007874f, 0.003136f, -0.003804f, -0.000611f, 0.001283f, -0.010118f, -0.005484f, + -0.040829f, 0.006499f, 0.027870f, -0.019820f, 0.009576f, -0.032405f, 0.017781f, 0.008692f, -0.005431f, -0.008814f, -0.003874f, -0.002993f, 0.003265f, -0.006944f, 0.036741f, -0.004257f, -0.214156f, -0.402827f, -0.161882f, -0.272646f, -0.313345f, 0.194859f, 0.068127f, 0.179035f, 0.538384f, 0.352388f, 0.284362f, 0.426149f, 0.212754f, 0.013740f, 0.168554f, 0.041965f, -0.170537f, -0.119844f, -0.135900f, -0.312287f, -0.253663f, -0.109629f, -0.227143f, -0.250339f, -0.103490f, -0.154091f, -0.258458f, -0.133611f, 0.020000f, -0.162577f, -0.148758f, 0.032787f, -0.032221f, -0.148263f, 0.166110f, 0.108395f, -0.124507f, 0.123184f, 0.186948f, 0.028284f, 0.106885f, 0.375582f, 0.178387f, 0.112558f, 0.441859f, 0.309564f, 0.179259f, 0.435521f, 0.583930f, 0.361452f, 0.523618f, 0.678156f, 0.484649f, 0.321342f, 0.423645f, 0.222930f, -0.215796f, -0.142208f, -0.285043f, -0.664176f, -0.665913f, -0.674587f, -1.018160f, -1.005461f, -1.010098f, -1.052381f, -0.993443f, -0.966495f, -0.760751f, -0.609067f, -0.460508f, -0.189890f, 0.055865f, 0.147591f, 0.375974f, 0.653035f, 0.553406f, 0.741734f, 1.054866f, 0.886555f, + 0.828103f, 1.008114f, 0.746946f, 0.383038f, 0.415220f, 0.389454f, 0.146237f, 0.103970f, 0.209133f, 0.077221f, -0.018260f, 0.069894f, 0.024973f, -0.145449f, -0.129841f, -0.078441f, -0.259877f, -0.298737f, -0.130258f, -0.227317f, -0.312722f, -0.129378f, -0.083017f, -0.170659f, -0.002384f, 0.054884f, -0.056258f, -0.008643f, -0.041490f, -0.238885f, -0.343840f, -0.385701f, -0.481432f, -0.567123f, -0.508762f, -0.465376f, -0.433067f, -0.325365f, -0.206941f, -0.147657f, -0.026661f, 0.114648f, 0.178700f, 0.258603f, 0.426338f, 0.517826f, 0.604353f, 0.647246f, 0.613623f, 0.546554f, 0.418498f, 0.285765f, 0.159905f, 0.022140f, -0.026779f, -0.046326f, -0.074896f, -0.084970f, -0.086127f, -0.100419f, -0.106070f, -0.096441f, -0.086389f, -0.096665f, -0.103215f, -0.099209f, -0.103718f, -0.114163f, -0.109789f, -0.105546f, -0.083311f, -0.056224f, -0.044627f, -0.028670f, 0.001584f, 0.012625f, 0.026688f, 0.056312f, 0.074129f, 0.076971f, 0.075731f, 0.059527f, 0.039774f, 0.023354f, -0.000754f, -0.022135f, -0.033457f, -0.054036f, -0.069369f, -0.075058f, -0.088108f, -0.092490f, -0.084404f, -0.079318f, -0.074181f, -0.062027f, + -0.054229f, -0.043394f, -0.031618f, -0.023236f, -0.011390f, -0.001080f, 0.012101f, 0.020233f, 0.028637f, 0.037675f, 0.047257f, 0.053323f, 0.063115f, 0.073659f, 0.081293f, 0.085400f, 0.088470f, 0.090378f, 0.089132f, 0.086749f, 0.086000f, 0.078153f, 0.068147f, 0.055339f, 0.040841f, 0.026235f, 0.011060f, -0.005600f, -0.019500f, -0.034242f, -0.046454f, -0.058826f, -0.069790f, -0.080921f, -0.085320f, -0.088236f, -0.087486f, -0.080721f, -0.073414f, -0.064516f, -0.050470f, -0.036774f, -0.023837f, -0.008621f, 0.004514f, 0.013188f, 0.020987f, 0.026573f, 0.027162f, 0.025468f, 0.024166f, 0.020895f, 0.016501f, 0.013421f, 0.011578f, 0.009249f, 0.007454f, 0.006435f, 0.005667f, 0.004713f, 0.004350f, 0.004393f}, + {-0.012880f, -0.001138f, 0.012170f, -0.010762f, 0.004232f, -0.018169f, 0.000238f, -0.006540f, 0.007376f, -0.006101f, 0.001715f, -0.004119f, -0.007578f, -0.001903f, -0.000683f, 0.005590f, 0.006971f, -0.006515f, -0.011415f, 0.006062f, 0.002090f, 0.004256f, 0.002571f, 0.004804f, -0.006599f, -0.004925f, 0.001228f, -0.001206f, 0.006012f, 0.004364f, -0.005040f, -0.001033f, 0.004589f, 0.008507f, 0.005234f, 0.000126f, -0.006596f, 0.003625f, -0.001106f, -0.003468f, 0.004692f, 0.002079f, -0.006059f, -0.005032f, -0.004105f, 0.003466f, -0.005937f, -0.003144f, 0.005036f, 0.001996f, -0.000158f, -0.006178f, 0.002319f, -0.005303f, -0.013820f, 0.001432f, -0.004693f, -0.008865f, 0.004120f, -0.002476f, -0.002535f, -0.002997f, 0.000208f, 0.006872f, 0.004116f, 0.002361f, 0.003118f, 0.005205f, -0.010412f, 0.005498f, -0.004135f, -0.003935f, -0.002294f, 0.003529f, 0.000674f, 0.007385f, 0.010656f, 0.004227f, 0.000832f, 0.001279f, -0.000152f, 0.006879f, -0.002871f, -0.000176f, 0.003334f, 0.000311f, -0.002815f, -0.002815f, 0.000971f, -0.000004f, -0.003180f, -0.001522f, 0.001001f, -0.000089f, -0.000421f, -0.001191f, + -0.001575f, 0.001137f, 0.000682f, 0.001226f, -0.000470f, 0.000481f, -0.000327f, -0.002870f, -0.001142f, 0.001428f, 0.002356f, -0.001245f, -0.001569f, 0.000619f, 0.001491f, 0.027652f, -0.002342f, 0.005062f, 0.006081f, -0.002842f, 0.002862f, 0.011009f, -0.008599f, -0.001531f, 0.003145f, -0.004285f, -0.000847f, 0.008083f, -0.002620f, -0.001837f, -0.000566f, 0.003125f, -0.001551f, 0.003885f, -0.002739f, -0.002703f, -0.001242f, -0.006294f, -0.010727f, -0.002035f, -0.003443f, -0.001453f, 0.006314f, -0.011375f, 0.013963f, 0.000069f, 0.000242f, 0.000464f, 0.002636f, -0.000353f, -0.005368f, 0.000828f, 0.004304f, 0.010521f, 0.000526f, -0.000094f, -0.001605f, -0.003571f, 0.007007f, 0.003309f, -0.002558f, 0.003847f, -0.006977f, 0.001172f, 0.002229f, -0.005300f, -0.018141f, -0.005699f, -0.000452f, -0.001087f, -0.000862f, -0.001617f, -0.002309f, -0.001336f, -0.003447f, 0.004425f, 0.013371f, 0.007555f, 0.000588f, -0.000045f, -0.000355f, 0.004652f, -0.002731f, -0.012212f, -0.000419f, -0.006371f, 0.003999f, -0.007226f, 0.004078f, -0.017615f, -0.000106f, -0.002528f, 0.005979f, 0.009565f, -0.001465f, -0.002306f, + 0.001444f, -0.000064f, 0.005159f, 0.001868f, 0.000867f, 0.006956f, -0.005140f, -0.000703f, 0.000891f, 0.002473f, 0.000016f, 0.002522f, 0.000146f, 0.001606f, 0.000749f, -0.000362f, 0.000526f, -0.000652f, -0.000070f, 0.001442f, 0.002224f, 0.000241f, -0.000603f, -0.000891f, 0.000298f, -0.000409f, 0.001263f, 0.000875f, 0.000619f, -0.000439f, 0.000239f, 0.000821f, -0.024368f, -0.023497f, -0.008849f, -0.003489f, -0.003361f, 0.000010f, 0.005932f, 0.001407f, 0.004817f, -0.011040f, 0.005447f, 0.006862f, 0.006634f, 0.007777f, -0.006033f, 0.001663f, 0.018321f, -0.011348f, -0.000407f, -0.008088f, -0.011718f, -0.001414f, -0.000838f, 0.010142f, -0.004931f, 0.001055f, -0.008754f, 0.005595f, 0.003498f, 0.004389f, -0.019616f, 0.003010f, -0.003591f, -0.006893f, -0.001856f, -0.000111f, -0.014554f, -0.009437f, -0.008129f, -0.000670f, 0.012153f, 0.004201f, 0.004023f, 0.005825f, -0.005442f, 0.003422f, -0.004883f, 0.010377f, 0.015989f, -0.001515f, -0.001473f, 0.004530f, 0.001117f, 0.004118f, 0.008984f, -0.004234f, 0.009295f, -0.001473f, -0.000288f, 0.005483f, 0.007528f, -0.002869f, -0.010880f, -0.010027f, + 0.003864f, -0.001387f, -0.001870f, -0.004430f, 0.004937f, -0.008353f, 0.003096f, 0.006227f, 0.010553f, -0.006157f, 0.010119f, 0.006588f, 0.003290f, 0.005036f, 0.001221f, -0.001735f, -0.006817f, 0.004828f, -0.003208f, -0.006388f, -0.008042f, 0.003313f, -0.002651f, 0.004826f, 0.000852f, -0.003121f, -0.003753f, -0.001939f, 0.001600f, -0.002009f, -0.000707f, -0.002576f, -0.001127f, -0.000179f, 0.002474f, 0.001274f, -0.000079f, 0.001410f, 0.004876f, -0.000497f, 0.000015f, 0.002821f, -0.001538f, 0.000774f, -0.001072f, -0.000862f, 0.001404f, 0.002021f, 0.002065f, 0.001291f, -0.000028f, -0.000670f, 0.001524f, 0.000694f, 0.003340f, 0.003967f, -0.003181f, -0.000361f, 0.001758f, 0.000518f, -0.001811f, 0.000572f, 0.002286f, 0.001956f, -0.001037f, 0.000242f, 0.001287f, -0.001164f, -0.026577f, 0.011592f, -0.011862f, 0.021469f, -0.019867f, 0.015723f, 0.008048f, -0.008216f, -0.010285f, -0.005699f, 0.004149f, 0.003744f, -0.005523f, 0.012687f, -0.004474f, -0.012001f, -0.002393f, 0.013119f, 0.009019f, -0.013144f, 0.002183f, -0.001592f, -0.013762f, -0.005668f, -0.008826f, -0.002018f, -0.010518f, -0.002754f, + -0.004344f, -0.014531f, -0.005128f, 0.007471f, 0.010708f, -0.001990f, -0.012429f, -0.002468f, 0.008945f, -0.002663f, 0.000390f, 0.000666f, 0.000282f, -0.012375f, -0.000286f, -0.001427f, -0.003071f, -0.000522f, 0.002281f, -0.008845f, 0.005173f, -0.009474f, -0.000123f, -0.000003f, 0.000284f, 0.007138f, 0.000233f, -0.003227f, 0.002971f, 0.004968f, 0.011781f, 0.005402f, 0.002745f, -0.003325f, -0.007167f, -0.006773f, -0.002759f, -0.007403f, -0.005277f, 0.004463f, 0.007741f, -0.005571f, -0.009349f, -0.006390f, 0.003078f, 0.001714f, -0.008764f, -0.002971f, 0.001188f, -0.007370f, -0.003335f, 0.001095f, 0.002364f, 0.003087f, -0.003350f, -0.004044f, -0.005565f, 0.000280f, -0.000608f, -0.002100f, 0.001829f, -0.001793f, -0.000558f, -0.004238f, -0.000882f, -0.001379f, 0.003862f, 0.001934f, -0.001462f, 0.001924f, -0.000151f, 0.000656f, -0.001768f, 0.000285f, -0.001020f, -0.000021f, -0.001460f, -0.002799f, 0.002138f, -0.000129f, -0.002666f, -0.001644f, -0.000194f, -0.002434f, -0.002841f, 0.002753f, -0.001641f, 0.032546f, 0.012931f, -0.002210f, 0.007356f, -0.005263f, 0.018233f, 0.007692f, 0.032864f, 0.000596f, + -0.031846f, 0.008135f, 0.019278f, -0.011501f, 0.003361f, 0.013263f, -0.010234f, 0.009346f, -0.008300f, -0.001821f, -0.010229f, -0.009749f, -0.003096f, 0.002680f, -0.001075f, 0.004385f, -0.004394f, 0.014082f, -0.008450f, 0.003965f, 0.002586f, 0.009155f, -0.016833f, -0.008788f, -0.006646f, -0.002009f, -0.005969f, 0.001566f, 0.010250f, 0.007307f, 0.016288f, -0.002406f, -0.001224f, -0.009309f, -0.003067f, 0.010269f, -0.010053f, 0.008478f, -0.009405f, -0.003968f, 0.014952f, 0.021589f, 0.015477f, 0.002699f, -0.011411f, 0.007977f, 0.005932f, -0.006090f, 0.012572f, -0.008321f, 0.002474f, 0.001967f, -0.022992f, -0.000222f, -0.021795f, -0.008792f, 0.003468f, -0.005787f, -0.010406f, -0.008905f, 0.001812f, 0.014945f, 0.003729f, -0.006139f, -0.007605f, -0.006712f, 0.001502f, 0.002404f, 0.007156f, -0.011362f, -0.010215f, 0.000674f, -0.001973f, 0.000655f, -0.002938f, -0.001710f, -0.001826f, -0.001006f, 0.003394f, 0.000852f, 0.001558f, -0.001503f, -0.002360f, -0.002331f, 0.000670f, 0.005943f, 0.001992f, 0.004311f, 0.001383f, -0.006875f, 0.005163f, 0.002292f, 0.000944f, 0.000977f, 0.002987f, -0.000713f, + 0.002576f, 0.000476f, -0.000059f, -0.002165f, -0.001571f, -0.002981f, 0.000876f, 0.002816f, -0.000544f, -0.001434f, -0.001599f, -0.009747f, -0.001086f, -0.001223f, 0.000337f, -0.001563f, 0.020098f, 0.040819f, -0.017938f, -0.013363f, -0.003701f, -0.004931f, 0.014156f, -0.013751f, -0.024941f, -0.008734f, 0.001625f, -0.006211f, 0.007019f, 0.003240f, 0.012262f, 0.005053f, -0.005066f, 0.017665f, 0.016575f, -0.007828f, 0.001102f, -0.011622f, -0.002061f, 0.000491f, -0.007181f, -0.001515f, 0.012344f, 0.017725f, 0.000608f, 0.002795f, 0.007243f, 0.004555f, 0.002767f, 0.001074f, -0.006870f, -0.012988f, 0.001373f, -0.018618f, 0.000561f, 0.004090f, -0.005990f, 0.007100f, -0.004783f, -0.010365f, -0.000901f, 0.009783f, 0.004295f, -0.004613f, 0.030059f, -0.000248f, 0.009628f, -0.018116f, -0.004104f, 0.012156f, -0.005873f, -0.013458f, 0.007721f, -0.015744f, -0.014071f, 0.003016f, 0.017011f, -0.014170f, -0.007974f, -0.004306f, 0.000611f, -0.006511f, -0.006416f, 0.022914f, 0.013403f, -0.002263f, 0.001188f, -0.011040f, -0.007883f, -0.004594f, 0.006843f, 0.008952f, 0.000703f, 0.007141f, 0.004635f, -0.001661f, + 0.006700f, -0.006425f, 0.022955f, 0.012881f, 0.002447f, 0.000557f, 0.002033f, -0.004079f, -0.001581f, -0.004062f, -0.004183f, -0.000309f, -0.000239f, -0.003920f, 0.001902f, -0.005821f, -0.001784f, 0.004202f, -0.001663f, 0.004310f, 0.002484f, 0.004066f, 0.000096f, 0.002746f, 0.003276f, 0.002851f, 0.000497f, 0.004858f, 0.001583f, 0.000508f, -0.003736f, 0.000171f, -0.001433f, -0.000250f, 0.000174f, 0.001621f, -0.000321f, 0.001458f, -0.003561f, -0.000349f, 0.001378f, 0.001735f, 0.002647f, 0.016316f, -0.028958f, -0.003804f, -0.021725f, -0.012323f, -0.019672f, -0.004924f, -0.002937f, -0.002860f, -0.007503f, 0.008951f, -0.027765f, 0.014445f, -0.009406f, 0.008641f, 0.003821f, 0.011750f, 0.000748f, 0.004949f, -0.011138f, -0.004637f, 0.005298f, -0.011057f, -0.008027f, 0.013828f, 0.003870f, 0.006338f, 0.005594f, -0.001263f, 0.003775f, 0.020525f, -0.007217f, 0.002106f, -0.009100f, 0.016538f, -0.009810f, -0.036267f, 0.011365f, 0.005882f, 0.015417f, 0.008440f, 0.021212f, -0.014110f, -0.005566f, 0.012910f, -0.005211f, -0.012038f, -0.005676f, 0.006798f, -0.017609f, 0.017654f, -0.000526f, 0.011825f, + -0.014854f, -0.006388f, -0.005337f, -0.016026f, -0.003209f, -0.012704f, -0.005781f, 0.001547f, 0.018742f, 0.015198f, -0.001606f, -0.022694f, -0.012951f, -0.004029f, 0.018205f, 0.015170f, 0.011003f, 0.010283f, -0.006333f, -0.026291f, -0.006687f, -0.000587f, 0.006288f, -0.008173f, -0.002518f, 0.013738f, -0.002504f, 0.016205f, 0.000287f, 0.011287f, 0.004330f, 0.000728f, -0.004005f, -0.000230f, 0.006120f, 0.001809f, -0.002729f, 0.000750f, -0.007235f, -0.001055f, -0.000342f, -0.009586f, -0.005784f, -0.006053f, -0.002976f, 0.002138f, -0.003860f, 0.001792f, -0.005202f, -0.000478f, -0.001471f, -0.002652f, 0.004360f, 0.002287f, -0.000834f, -0.006448f, -0.002514f, 0.002876f, 0.004437f, 0.000294f, -0.006413f, -0.003212f, 0.001537f, 0.003565f, 0.000989f, 0.001841f, 0.000558f, -0.003199f, -0.038034f, -0.045963f, -0.025935f, 0.018984f, 0.001610f, -0.008502f, -0.009670f, -0.014619f, -0.001470f, 0.005086f, -0.025603f, -0.002358f, 0.016316f, -0.009816f, -0.006966f, 0.018231f, 0.004858f, -0.011845f, 0.004658f, -0.011457f, 0.026980f, -0.008573f, -0.006308f, 0.008816f, -0.013901f, -0.008650f, -0.008118f, 0.004673f, + -0.009628f, -0.003513f, 0.004588f, 0.003376f, -0.031494f, 0.014251f, 0.013844f, -0.008963f, 0.024535f, 0.009535f, 0.002417f, 0.023590f, 0.013470f, 0.004331f, 0.003370f, 0.025499f, -0.002442f, -0.004174f, -0.001624f, 0.015732f, 0.008801f, -0.022818f, 0.008990f, 0.007359f, -0.000086f, -0.012073f, -0.036992f, 0.016529f, -0.002358f, -0.008958f, -0.023170f, -0.012945f, 0.014365f, -0.002849f, -0.006693f, -0.015296f, -0.030076f, 0.003246f, -0.004097f, -0.015806f, -0.006661f, -0.028305f, -0.004479f, -0.006201f, -0.005314f, -0.001009f, 0.010304f, 0.022107f, 0.009463f, -0.007105f, -0.015579f, 0.006295f, 0.001174f, 0.009357f, 0.005823f, -0.003306f, 0.006750f, 0.002665f, -0.000647f, -0.008254f, 0.000855f, -0.013579f, -0.000753f, -0.002801f, 0.002367f, -0.005100f, 0.006598f, 0.004090f, -0.001454f, -0.000892f, -0.001247f, 0.001186f, -0.003064f, -0.000557f, 0.003822f, -0.001236f, -0.001308f, 0.007392f, -0.002747f, -0.001576f, 0.005796f, -0.004153f, 0.003525f, -0.011301f, -0.007456f, -0.003989f, -0.006087f, -0.000359f, -0.006050f, -0.007872f, -0.006018f, -0.001454f, -0.001211f, 0.003016f, -0.000245f, -0.004704f, + 0.002927f, 0.001353f, -0.002610f, -0.039542f, 0.031626f, 0.001673f, 0.016119f, -0.003006f, -0.001413f, 0.002873f, 0.017428f, 0.001622f, -0.002263f, -0.023938f, 0.008401f, -0.002730f, -0.018483f, 0.004696f, -0.012099f, -0.009366f, 0.034099f, 0.009593f, 0.010457f, -0.007495f, 0.012178f, 0.014649f, 0.014225f, -0.008413f, 0.012417f, 0.006344f, -0.014430f, 0.009243f, -0.014031f, -0.004963f, 0.008899f, 0.004103f, -0.001481f, -0.007897f, -0.007324f, 0.022586f, -0.006636f, -0.010116f, -0.006409f, 0.004503f, 0.004921f, -0.010998f, -0.018342f, -0.001478f, -0.019676f, -0.002466f, -0.017738f, -0.006838f, -0.004214f, 0.003341f, -0.009038f, -0.015499f, 0.019393f, -0.008164f, -0.021353f, 0.013511f, 0.022800f, -0.011183f, -0.007294f, 0.011389f, 0.008388f, 0.022449f, 0.014631f, 0.002142f, -0.000198f, -0.023374f, 0.005634f, 0.022114f, 0.017931f, -0.015959f, 0.017100f, 0.018331f, -0.012327f, -0.034647f, -0.011091f, -0.031050f, 0.005236f, 0.017576f, 0.008984f, 0.001992f, -0.009230f, -0.012655f, -0.001344f, 0.001475f, 0.005418f, -0.002979f, 0.010165f, -0.004690f, -0.003504f, 0.003807f, 0.010766f, -0.015916f, + -0.002033f, -0.002155f, -0.004741f, -0.000047f, 0.004373f, -0.001043f, -0.000427f, -0.002647f, -0.000240f, -0.002674f, 0.000954f, -0.000363f, -0.000264f, 0.001341f, 0.005672f, -0.005015f, -0.002709f, 0.003038f, 0.003680f, 0.011608f, -0.001058f, 0.004759f, 0.004738f, -0.005228f, 0.004296f, 0.001730f, -0.004321f, 0.000991f, 0.001841f, 0.001225f, 0.004889f, 0.010107f, 0.002303f, -0.003612f, 0.006994f, -0.002309f, -0.003720f, 0.000422f, -0.006542f, -0.002995f, -0.000348f, 0.000199f, 0.007435f, -0.063019f, 0.029978f, 0.008385f, -0.003104f, 0.042261f, -0.002651f, 0.021321f, -0.019101f, -0.004583f, 0.003201f, 0.000127f, 0.024098f, 0.015275f, -0.033064f, 0.020416f, 0.001408f, 0.012203f, -0.029796f, -0.001299f, 0.016992f, -0.029249f, 0.036278f, 0.009727f, -0.000534f, -0.013153f, 0.002033f, 0.015634f, -0.026259f, 0.002267f, 0.006527f, 0.004477f, -0.016247f, -0.006106f, 0.015092f, 0.008479f, -0.001783f, 0.002124f, -0.010736f, -0.018259f, 0.007350f, -0.030770f, -0.001415f, 0.043731f, 0.042688f, -0.013857f, 0.005164f, -0.002032f, 0.012115f, 0.030677f, 0.002449f, 0.014592f, 0.004750f, -0.016353f, + -0.001365f, -0.003254f, -0.046675f, -0.021179f, 0.028650f, 0.001160f, 0.008731f, -0.011410f, -0.003004f, 0.010067f, 0.013794f, -0.001446f, 0.035693f, 0.000338f, 0.027808f, 0.003301f, 0.005746f, 0.003469f, -0.018450f, -0.023176f, 0.028164f, 0.006373f, -0.014918f, 0.020360f, -0.016985f, 0.001336f, 0.017237f, 0.002627f, -0.004603f, 0.007904f, -0.007620f, -0.007367f, 0.008554f, 0.011738f, 0.000701f, -0.016212f, -0.007857f, -0.017452f, -0.006313f, 0.004061f, 0.005405f, 0.002576f, -0.006826f, -0.003342f, -0.012561f, 0.008748f, -0.000298f, -0.005229f, -0.002420f, 0.003551f, 0.001939f, 0.010894f, 0.009808f, 0.006223f, 0.006328f, 0.001969f, 0.007764f, -0.005533f, 0.003499f, 0.004011f, 0.003911f, -0.004867f, 0.007849f, 0.003973f, -0.001321f, -0.001685f, -0.002209f, -0.002224f, -0.003774f, -0.008980f, -0.002659f, -0.000381f, -0.003637f, -0.006644f, 0.021061f, -0.045817f, 0.018415f, 0.028863f, -0.003987f, 0.008579f, 0.013001f, -0.007017f, -0.004423f, 0.017802f, -0.006694f, 0.027017f, -0.025712f, 0.014044f, 0.033442f, -0.035836f, 0.001475f, -0.017058f, 0.021138f, 0.008882f, 0.017539f, -0.018153f, + -0.014123f, -0.000241f, 0.045201f, 0.000485f, 0.022890f, -0.010175f, 0.001426f, -0.003150f, -0.003968f, -0.020092f, -0.000727f, -0.005672f, 0.009251f, -0.009001f, -0.012952f, -0.010976f, -0.000773f, -0.003861f, 0.020463f, 0.003453f, -0.011221f, -0.010291f, -0.010323f, -0.003863f, -0.004882f, 0.033244f, 0.001520f, 0.016663f, 0.001217f, -0.008069f, -0.007215f, 0.027631f, 0.020745f, -0.008049f, -0.026018f, 0.014664f, 0.010222f, -0.057610f, 0.003428f, 0.032383f, 0.031749f, 0.007302f, 0.025268f, -0.034795f, 0.056972f, 0.004905f, 0.010984f, 0.011165f, 0.027234f, -0.002218f, -0.024218f, -0.007486f, -0.028629f, 0.032610f, -0.014347f, -0.009787f, 0.028653f, -0.000953f, -0.011108f, -0.008786f, -0.021342f, 0.020235f, -0.034908f, -0.005247f, 0.003502f, -0.000963f, 0.005120f, -0.007375f, -0.014902f, -0.009684f, 0.004815f, 0.003743f, -0.006964f, 0.001712f, -0.006632f, -0.007428f, -0.005246f, 0.006323f, 0.003522f, -0.008421f, 0.007895f, 0.001452f, -0.009942f, 0.004461f, -0.001684f, -0.003675f, -0.007540f, -0.008873f, 0.001833f, 0.004132f, 0.018312f, -0.008072f, 0.010921f, 0.001193f, -0.003437f, -0.001430f, + -0.001955f, -0.004909f, 0.002961f, -0.000643f, -0.005213f, -0.001940f, -0.003549f, 0.001326f, 0.003877f, 0.002833f, -0.007457f, 0.017622f, -0.033920f, -0.027107f, 0.024352f, 0.020505f, 0.049982f, -0.017551f, -0.013146f, -0.008826f, 0.009469f, -0.021122f, -0.002497f, 0.008357f, -0.001435f, 0.026897f, 0.017338f, -0.021423f, 0.001995f, 0.006349f, 0.015555f, -0.024408f, 0.025748f, -0.000373f, 0.011433f, -0.004281f, -0.011680f, -0.025608f, 0.009106f, -0.004391f, -0.010787f, 0.005219f, -0.015714f, -0.015262f, -0.003401f, 0.008103f, 0.031176f, -0.046306f, -0.028016f, -0.024954f, -0.028062f, -0.007920f, 0.032323f, -0.019052f, -0.000859f, 0.031839f, -0.004645f, -0.014297f, -0.027546f, -0.007401f, -0.011859f, -0.056975f, -0.044237f, -0.012453f, 0.010012f, -0.005412f, 0.009981f, -0.012632f, -0.009118f, 0.027108f, 0.016359f, -0.028479f, -0.014718f, -0.031879f, -0.012680f, 0.002643f, 0.012771f, -0.005692f, 0.003420f, -0.027201f, -0.021783f, -0.019861f, -0.000560f, 0.004669f, 0.001716f, -0.025746f, 0.000841f, 0.034674f, 0.014952f, 0.039578f, -0.031166f, 0.048366f, 0.004278f, -0.030048f, -0.005002f, 0.001398f, + 0.008482f, -0.005036f, 0.013163f, -0.018375f, 0.008723f, -0.016276f, 0.007678f, 0.011131f, -0.003513f, 0.024762f, -0.002075f, 0.005845f, -0.006683f, -0.008944f, -0.005051f, 0.000717f, 0.005592f, -0.009466f, -0.001690f, 0.003178f, -0.002111f, 0.009513f, -0.002853f, -0.004763f, -0.015993f, 0.007068f, 0.001022f, 0.008367f, 0.003557f, -0.005366f, -0.015048f, 0.004849f, -0.019236f, 0.004879f, -0.004999f, -0.000802f, 0.002053f, -0.004144f, 0.001524f, 0.003021f, 0.013371f, 0.005221f, -0.005773f, -0.024395f, 0.004710f, -0.002650f, 0.056310f, 0.006169f, 0.027140f, -0.023441f, -0.015904f, -0.005745f, -0.026462f, -0.016811f, -0.025555f, -0.011889f, -0.016542f, 0.030551f, 0.007726f, 0.007721f, 0.031524f, -0.000825f, -0.001736f, 0.014228f, 0.028380f, 0.044280f, 0.032440f, -0.006641f, -0.011941f, -0.050971f, 0.014131f, 0.015987f, 0.006307f, -0.031785f, 0.036845f, 0.014663f, 0.021690f, -0.006025f, 0.002144f, 0.020889f, 0.046015f, 0.044711f, 0.025891f, 0.005410f, 0.047848f, 0.001238f, -0.014132f, 0.015496f, 0.029069f, 0.023517f, 0.043062f, 0.022684f, 0.001091f, 0.005168f, -0.025776f, 0.011234f, + -0.064619f, -0.011105f, -0.006363f, 0.014356f, 0.051050f, 0.028637f, 0.007658f, 0.036980f, -0.026706f, -0.024360f, 0.005393f, -0.062864f, -0.014860f, 0.002587f, 0.012224f, 0.014554f, 0.016795f, -0.003787f, 0.027764f, 0.003445f, 0.014446f, 0.050935f, -0.031187f, -0.016319f, -0.008485f, 0.009699f, -0.005789f, -0.048095f, -0.008896f, 0.032776f, -0.002190f, 0.041571f, -0.022126f, 0.001128f, 0.017407f, -0.004047f, 0.005032f, -0.017378f, -0.008294f, -0.013499f, -0.008777f, -0.014977f, -0.012056f, 0.003222f, 0.002785f, -0.030029f, -0.013718f, -0.016937f, -0.004293f, 0.005485f, 0.009290f, -0.013423f, -0.000329f, 0.003960f, -0.020874f, 0.003085f, -0.008257f, -0.013888f, -0.007010f, 0.001011f, 0.005398f, -0.009555f, -0.002157f, -0.014584f, -0.000904f, -0.003973f, -0.004472f, -0.010669f, -0.015292f, 0.003838f, 0.005405f, -0.008571f, -0.005650f, -0.006325f, -0.004464f, 0.002707f, 0.010526f, 0.002780f, 0.003518f, -0.003387f, -0.043401f, -0.013694f, 0.007865f, 0.032775f, 0.060233f, -0.024248f, 0.001044f, 0.009931f, -0.011067f, 0.055815f, 0.009885f, -0.027542f, 0.048916f, -0.010123f, -0.016433f, 0.034990f, + -0.031795f, -0.018622f, 0.002126f, 0.003033f, 0.004351f, 0.022903f, 0.012262f, 0.018579f, -0.005708f, 0.009836f, 0.028044f, 0.001671f, 0.019119f, 0.003467f, 0.000729f, 0.030952f, -0.040490f, -0.014760f, -0.013736f, 0.026931f, -0.020644f, -0.005417f, -0.012165f, 0.026667f, -0.011346f, 0.059390f, 0.043469f, -0.040564f, 0.019841f, -0.048731f, 0.006982f, 0.017518f, 0.009469f, 0.010451f, -0.062028f, -0.012108f, -0.059822f, 0.007860f, 0.004935f, 0.007217f, -0.009448f, -0.010925f, 0.028614f, -0.051746f, 0.017768f, -0.022456f, -0.097314f, -0.036528f, -0.031850f, 0.015925f, -0.014175f, 0.014713f, 0.048709f, 0.051832f, 0.029417f, 0.027224f, 0.025362f, 0.007277f, -0.038695f, 0.040529f, 0.000070f, -0.045051f, -0.035766f, -0.056594f, -0.074824f, -0.038699f, -0.007575f, 0.059737f, 0.021574f, 0.003531f, 0.022928f, -0.018398f, -0.000430f, 0.011395f, 0.009563f, -0.004939f, 0.008767f, 0.002711f, 0.006079f, 0.002383f, -0.018509f, 0.014800f, 0.009904f, 0.007202f, 0.002961f, -0.009803f, 0.005239f, -0.014513f, -0.005149f, -0.022473f, 0.018585f, 0.013907f, -0.003092f, 0.001887f, 0.014861f, 0.023492f, + -0.010660f, -0.023209f, -0.007023f, 0.018629f, -0.004201f, -0.013920f, 0.020031f, -0.001892f, -0.011697f, 0.013689f, 0.005512f, 0.000745f, -0.003496f, -0.000677f, -0.009954f, 0.006600f, -0.006377f, -0.003013f, 0.015403f, -0.076942f, -0.035626f, -0.026571f, 0.014492f, -0.058642f, 0.021325f, -0.034967f, 0.050341f, -0.058317f, -0.074003f, -0.015858f, -0.010454f, 0.058448f, 0.028686f, 0.026155f, -0.014691f, 0.007006f, -0.035737f, -0.028716f, 0.006990f, 0.012429f, -0.046132f, -0.042936f, -0.029994f, -0.003636f, 0.023667f, 0.017064f, -0.032305f, -0.040882f, -0.023555f, -0.024048f, -0.055441f, -0.031958f, 0.024951f, -0.015298f, -0.000066f, -0.007451f, 0.018396f, 0.028967f, -0.007261f, -0.083248f, 0.035538f, 0.070053f, 0.026350f, -0.001293f, -0.083448f, -0.019741f, 0.036868f, -0.010174f, 0.093949f, -0.009739f, -0.075150f, 0.012723f, -0.012394f, 0.006522f, 0.002409f, -0.014821f, 0.020598f, 0.025375f, -0.079296f, -0.020976f, 0.004707f, 0.028503f, -0.014462f, -0.040268f, 0.036481f, 0.003931f, -0.026669f, -0.079045f, -0.091706f, -0.047064f, -0.005541f, 0.007123f, 0.074078f, 0.104491f, 0.054013f, 0.041211f, + 0.018203f, -0.060039f, 0.022416f, 0.000113f, -0.031214f, -0.008676f, -0.099146f, -0.020535f, -0.000268f, 0.001202f, 0.003905f, 0.043872f, 0.016696f, 0.013416f, -0.017462f, -0.005247f, 0.038125f, -0.025226f, -0.000015f, -0.001082f, 0.007724f, -0.018585f, -0.030978f, -0.034622f, 0.016012f, -0.015876f, -0.005290f, 0.021087f, 0.001191f, 0.003862f, -0.026330f, 0.009608f, 0.009125f, 0.005197f, -0.021575f, -0.010606f, -0.014041f, -0.022598f, 0.003612f, -0.012871f, 0.025449f, 0.010359f, -0.016507f, 0.003834f, -0.005776f, 0.017820f, -0.022878f, -0.002481f, -0.000469f, 0.012854f, 0.011590f, 0.006275f, 0.013902f, 0.000434f, 0.007894f, 0.006485f, 0.140147f, 0.128707f, -0.054188f, 0.066789f, 0.059232f, -0.016582f, -0.009896f, -0.030676f, -0.016492f, -0.036073f, -0.025247f, 0.106748f, -0.005670f, 0.062192f, 0.000897f, 0.003038f, 0.000977f, -0.042116f, 0.010203f, 0.008724f, -0.092410f, 0.013783f, 0.022591f, -0.048723f, -0.010004f, -0.015036f, -0.006457f, 0.013678f, -0.002570f, 0.002796f, 0.040975f, 0.016502f, -0.019637f, 0.012532f, 0.065215f, 0.001035f, 0.030178f, -0.001649f, 0.024677f, -0.035888f, + -0.043031f, -0.024283f, -0.079196f, 0.021194f, 0.009167f, -0.035385f, -0.096265f, -0.063150f, -0.089967f, 0.065670f, -0.046559f, 0.010173f, 0.016605f, 0.014844f, 0.012879f, 0.070067f, -0.067159f, 0.000290f, -0.037474f, 0.074164f, -0.166238f, 0.034073f, 0.013274f, 0.053179f, 0.048918f, 0.000123f, -0.014945f, -0.025628f, -0.006920f, -0.048552f, 0.036015f, 0.098008f, -0.006989f, 0.020115f, 0.062465f, -0.043415f, 0.025137f, 0.030045f, -0.053963f, -0.037958f, -0.100511f, 0.083556f, -0.015675f, -0.073923f, 0.050096f, -0.012578f, 0.032961f, -0.002454f, 0.028678f, 0.004563f, -0.020983f, 0.034460f, 0.033941f, 0.005167f, 0.019776f, 0.031308f, 0.019524f, -0.021453f, -0.008311f, -0.020964f, -0.008333f, 0.026332f, 0.051743f, -0.002503f, -0.008530f, -0.002372f, 0.033583f, -0.051829f, 0.030487f, -0.014286f, 0.069824f, 0.013334f, -0.039994f, -0.008654f, 0.031591f, -0.016327f, -0.020446f, -0.016404f, -0.011323f, -0.016132f, 0.017910f, 0.011598f, 0.045209f, -0.037126f, 0.003512f, -0.004538f, 0.025351f, 0.001285f, -0.001779f, 0.014034f, 0.018771f, 0.013149f, 0.030086f, 0.003353f, 0.034527f, 0.018610f, + -0.000465f, -0.048559f, -0.046046f, 0.056963f, -0.115981f, 0.079999f, -0.047833f, -0.033407f, -0.021031f, 0.007313f, -0.033591f, -0.026116f, 0.036358f, -0.011134f, -0.079348f, 0.027404f, -0.004883f, 0.014076f, -0.017891f, 0.070566f, -0.057579f, 0.002487f, 0.029240f, -0.019941f, 0.022135f, -0.046923f, 0.003823f, -0.040369f, -0.020517f, 0.043989f, 0.005591f, 0.017653f, -0.025023f, 0.042526f, -0.012292f, -0.019783f, 0.016235f, -0.025973f, -0.021719f, -0.013859f, -0.014381f, -0.043822f, -0.058820f, -0.016310f, 0.032541f, 0.000559f, -0.018470f, -0.058620f, 0.002182f, -0.046325f, -0.003173f, 0.018715f, -0.045968f, -0.011254f, 0.033678f, 0.034327f, 0.024792f, -0.056905f, -0.027072f, 0.039284f, 0.012652f, -0.001066f, 0.031664f, -0.186855f, -0.043388f, -0.020813f, -0.085065f, 0.008380f, 0.023152f, -0.004964f, 0.015478f, 0.040084f, -0.023305f, -0.039716f, 0.009906f, -0.036062f, -0.011162f, 0.038900f, 0.061447f, -0.023409f, -0.074761f, -0.044962f, 0.004534f, -0.039762f, 0.005902f, -0.030858f, -0.029447f, 0.007732f, -0.060036f, 0.000674f, -0.037624f, -0.011487f, -0.020813f, 0.008309f, 0.014660f, -0.005980f, + -0.037420f, 0.008114f, -0.002927f, -0.023407f, 0.028417f, -0.001301f, -0.027765f, -0.009474f, -0.007694f, -0.010384f, -0.019465f, 0.010128f, -0.017858f, 0.014012f, 0.018932f, -0.007833f, 0.001583f, -0.011620f, -0.026523f, -0.036649f, 0.005794f, 0.004713f, 0.016162f, -0.042423f, 0.008081f, -0.000330f, -0.028119f, 0.020859f, -0.012161f, 0.014878f, 0.033463f, -0.076936f, 0.014563f, 0.010615f, 0.021267f, -0.012945f, -0.008847f, 0.025149f, -0.002685f, 0.001862f, 0.125758f, -0.015673f, -0.034483f, 0.004988f, -0.013710f, 0.062388f, 0.011981f, -0.005078f, 0.059334f, 0.060088f, 0.019963f, 0.023348f, 0.033150f, -0.073689f, -0.040548f, 0.061401f, -0.008080f, -0.060485f, -0.030386f, -0.027389f, 0.042073f, 0.022493f, -0.021948f, -0.087442f, 0.027528f, 0.013824f, 0.011927f, 0.014450f, -0.010246f, 0.008951f, -0.065341f, 0.058768f, 0.041090f, 0.021703f, -0.032572f, -0.027902f, 0.000203f, 0.029422f, -0.006097f, 0.030586f, 0.013657f, -0.069236f, -0.030466f, 0.010949f, -0.069373f, 0.004132f, 0.013668f, -0.061341f, -0.086067f, -0.012116f, 0.026432f, -0.050255f, -0.104571f, -0.045983f, -0.027109f, 0.068080f, + -0.041006f, 0.076824f, -0.015463f, 0.003574f, 0.033239f, 0.004455f, -0.117179f, -0.007886f, 0.005326f, 0.054873f, -0.104224f, -0.144696f, 0.010918f, -0.009508f, -0.091731f, 0.051947f, 0.024975f, -0.003551f, 0.000180f, 0.085009f, -0.121320f, 0.099862f, 0.021652f, 0.013256f, 0.041073f, -0.043990f, -0.039185f, -0.007757f, 0.019466f, -0.025101f, -0.001242f, 0.051166f, -0.042896f, -0.035046f, 0.046025f, -0.025867f, -0.012148f, 0.018844f, 0.013178f, -0.051100f, 0.026613f, -0.017257f, -0.003923f, 0.017790f, 0.018413f, -0.054453f, -0.008073f, -0.042403f, 0.024368f, 0.032587f, 0.002969f, -0.070028f, 0.050229f, -0.012358f, -0.000274f, 0.029579f, -0.006643f, -0.025724f, -0.003706f, 0.039147f, -0.058578f, 0.040304f, 0.003154f, -0.004860f, 0.015902f, 0.007461f, -0.036228f, 0.016760f, 0.000846f, 0.001271f, -0.047462f, 0.032874f, -0.030684f, 0.036309f, 0.006617f, -0.044965f, 0.004806f, 0.004998f, -0.011558f, 0.020493f, 0.004933f, 0.057323f, 0.021493f, 0.137062f, -0.059580f, -0.062048f, -0.026636f, -0.003759f, 0.130057f, -0.019560f, 0.107450f, -0.077668f, -0.031481f, 0.044796f, -0.084596f, -0.028677f, + -0.079697f, 0.011673f, 0.077981f, -0.110516f, -0.041572f, -0.010552f, 0.031622f, -0.002070f, 0.010621f, 0.029151f, -0.009267f, -0.070434f, -0.065572f, 0.002116f, 0.043646f, 0.120400f, -0.028559f, 0.031871f, -0.036547f, 0.058908f, 0.000432f, 0.005961f, -0.018416f, -0.072756f, 0.000750f, 0.065094f, -0.012993f, -0.004898f, -0.026317f, -0.063573f, 0.080746f, 0.030362f, 0.053317f, 0.072620f, -0.005279f, 0.003339f, 0.044045f, -0.118589f, 0.038975f, -0.060348f, 0.137545f, -0.014098f, 0.012021f, 0.019958f, -0.042309f, -0.041943f, 0.012295f, -0.060141f, 0.086637f, -0.052572f, -0.066812f, -0.066776f, 0.090652f, 0.030421f, 0.051795f, -0.012804f, 0.051732f, 0.053330f, -0.057083f, -0.016866f, -0.053081f, -0.027956f, 0.094494f, 0.067289f, 0.007251f, 0.017785f, -0.147502f, 0.099019f, 0.129396f, 0.014196f, -0.012335f, -0.025801f, -0.079994f, 0.112362f, -0.008360f, 0.006775f, -0.024053f, 0.002399f, -0.051180f, 0.105124f, -0.027097f, 0.050791f, 0.006458f, -0.019271f, -0.007972f, 0.101240f, -0.058235f, 0.049452f, 0.014972f, -0.044196f, 0.004185f, -0.014788f, 0.026340f, 0.007269f, 0.039524f, -0.018067f, + 0.002501f, 0.006960f, -0.002316f, 0.040142f, 0.068319f, -0.022459f, -0.005429f, 0.007204f, 0.036681f, 0.010209f, -0.055824f, -0.037004f, 0.074072f, 0.013997f, 0.035356f, -0.075323f, -0.091443f, 0.081913f, 0.053003f, 0.025018f, -0.008283f, -0.070160f, -0.003427f, 0.062270f, 0.018299f, 0.002719f, -0.006810f, -0.012353f, 0.010708f, 0.008379f, 0.013019f, -0.010341f, 0.006826f, 0.013364f, 0.008729f, -0.005787f, 0.001912f, 0.002554f, 0.012907f, 0.032804f, 0.012263f, -0.103432f, 0.070724f, -0.073582f, 0.008932f, -0.033945f, 0.027313f, -0.002929f, 0.038926f, -0.006346f, -0.033611f, 0.057859f, -0.020302f, -0.008220f, 0.008979f, -0.024454f, -0.021068f, 0.066776f, -0.015701f, -0.009338f, -0.007735f, -0.003596f, 0.030814f, -0.023582f, 0.007357f, -0.017314f, 0.015464f, -0.015152f, -0.011251f, -0.036099f, 0.052654f, -0.032641f, 0.017581f, 0.008191f, 0.036553f, -0.041101f, 0.009339f, -0.016962f, 0.041463f, 0.005154f, 0.003498f, 0.032371f, 0.009956f, -0.054395f, -0.007762f, -0.009574f, 0.015284f, 0.023383f, 0.020066f, -0.049512f, 0.021337f, -0.037493f, 0.026563f, -0.021528f, 0.005880f, -0.012512f, + 0.026250f, -0.010522f, 0.007833f, -0.055411f, 0.013331f, 0.026342f, -0.024886f, 0.024615f, 0.003765f, 0.008788f, 0.015947f, -0.022611f, 0.038405f, 0.014581f, -0.001759f, -0.012415f, 0.018875f, -0.012046f, 0.034909f, -0.029357f, -0.008204f, -0.027976f, 0.036158f, -0.035850f, 0.032896f, -0.029980f, 0.039922f, -0.034089f, 0.021165f, -0.033628f, 0.029514f, -0.002809f, 0.003513f, -0.010127f, 0.002079f, -0.006324f, -0.004578f, -0.010750f, 0.017796f, 0.006181f, -0.001817f, 0.005070f, -0.004688f, -0.009910f, 0.017915f, 0.002053f, 0.007183f, -0.011829f, 0.001321f, 0.016670f, -0.019318f, -0.005524f, 0.012260f, -0.000409f, -0.005285f, -0.013540f, 0.032073f, -0.010630f, -0.015115f, 0.007453f, 0.003551f, -0.005717f, 0.004087f, -0.002557f, 0.003814f, -0.006116f, 0.005278f, -0.010043f, 0.016187f, -0.013567f, 0.018563f, 0.006934f, -0.012484f, 0.003864f, -0.001870f, 0.001126f, -0.000759f, 0.007607f, 0.000866f, -0.006074f, 0.005342f, -0.006560f, -0.042902f, 0.087155f, 0.007417f, 0.011096f, -0.034640f, -0.025477f, -0.055092f, 0.037190f, -0.015352f, -0.011132f, -0.023863f, -0.000798f, -0.021261f, -0.002522f, + -0.002688f, 0.009851f, 0.010996f, -0.001566f, -0.002435f, -0.015570f, 0.014772f, 0.013817f, -0.012894f, 0.006272f, -0.029442f, 0.011916f, 0.005876f, -0.005050f, -0.004468f, -0.009743f, 0.009541f, 0.002200f, -0.020935f, -0.005533f, -0.006055f, -0.017353f, 0.028788f, 0.003131f, -0.018194f, 0.002925f, -0.007060f, 0.025102f, -0.008549f, -0.011558f, 0.004961f, -0.014781f, 0.029272f, 0.000963f, -0.016005f, 0.004739f, -0.006455f, 0.014382f, -0.018273f, -0.003525f, 0.006181f, -0.006561f, 0.012925f, -0.007172f, 0.003825f, 0.005933f, -0.016472f, 0.002444f, 0.016601f, -0.025079f, -0.001540f, 0.007769f, -0.023275f, 0.042735f, -0.038870f, 0.019582f, 0.007166f, -0.022148f, 0.044173f, -0.029854f, 0.007189f, 0.005745f, -0.018517f, 0.014646f, -0.007497f, -0.014255f, 0.014170f, -0.017007f, 0.011259f, -0.007749f, -0.005688f, 0.012784f, -0.010419f, 0.004193f, -0.004155f, -0.000006f, 0.002589f, -0.005640f, 0.002825f, -0.000197f, -0.005503f, 0.012092f, -0.010071f, 0.009042f, 0.000453f, -0.008256f, 0.008312f, -0.014657f, -0.001303f, 0.004010f, -0.002310f, -0.001922f, 0.002209f, -0.007567f, 0.009537f, -0.004661f, + -0.003223f, 0.001113f, 0.001103f, -0.005882f, -0.000781f, -0.003354f, 0.003381f, 0.004833f, -0.006633f, 0.006007f, -0.006326f, -0.001150f, 0.006369f, -0.004561f, 0.020326f, -0.093165f, -0.215099f, 0.056463f, 0.199122f, 0.168365f, 0.225899f, -0.111336f, -0.144306f, -0.216992f, -0.221810f, 0.015291f, 0.165377f, 0.182626f, 0.200018f, 0.066563f, -0.043527f, -0.158641f, -0.262725f, -0.143886f, 0.066830f, 0.103600f, 0.175215f, 0.132881f, 0.036282f, -0.023475f, -0.055354f, -0.131533f, -0.085281f, -0.081068f, -0.014885f, 0.069426f, 0.106296f, 0.056047f, 0.070957f, 0.035989f, -0.040003f, -0.006143f, -0.085528f, -0.118932f, -0.020388f, -0.027658f, 0.020971f, 0.112410f, 0.064688f, 0.055859f, 0.016442f, -0.041947f, -0.043342f, -0.037202f, -0.061676f, -0.016025f, 0.002699f, 0.026570f, 0.032218f, 0.053844f, 0.015276f, -0.001757f, -0.027160f, -0.049874f, -0.004321f, 0.018143f, 0.018436f, 0.031639f, -0.008081f, -0.024970f, -0.012103f, -0.025000f, -0.019783f, 0.005506f, 0.014115f, 0.040498f, 0.034158f, 0.032841f, 0.001837f, -0.017394f, -0.065618f, -0.060797f, -0.024901f, 0.004063f, 0.050587f, 0.054486f, + 0.022349f, 0.023198f, -0.002645f, -0.043652f, -0.026887f, -0.002998f, -0.010343f, 0.002521f, 0.004538f, 0.010706f, 0.008724f, -0.005493f, -0.014384f, 0.008634f, 0.013123f, 0.011008f, 0.011176f, -0.000849f, -0.008327f, -0.004951f, -0.022334f, -0.008977f, -0.012370f, -0.020741f, 0.012283f, 0.030570f, 0.035347f, 0.011927f, 0.012681f, -0.006716f, -0.008400f, -0.031570f, -0.047290f, -0.018007f, 0.005284f, 0.014934f, 0.018210f, 0.038882f, 0.035859f, 0.017635f, -0.014392f, -0.030089f, -0.034277f, -0.031785f, -0.023774f, -0.001415f, 0.028561f, 0.044605f, 0.035083f, 0.010406f, -0.016889f, -0.019931f, -0.020225f, -0.011450f, -0.007812f, -0.008550f, 0.008559f, 0.020526f, 0.014841f, 0.003427f, -0.002790f, -0.001390f, -0.005385f, -0.005769f, -0.008586f, -0.003532f, 0.004727f, 0.004256f, 0.002339f, 0.002940f, 0.002247f, 0.002110f, -0.004439f, -0.005427f, -0.001756f, 0.002491f, 0.001829f, 0.000758f, 0.000756f, 0.000907f, -0.001770f, -0.001317f, -0.000732f, 0.000439f, 0.000475f, 0.001337f, 0.001139f, 0.000854f, -0.000422f, -0.001517f, -0.002711f, -0.000236f, 0.000459f, 0.000239f, 0.000700f, 0.001878f, + 0.000570f, 0.000583f, 0.001526f, 0.000201f, -0.004208f, -0.003277f, -0.001071f, 0.000912f, 0.001799f, 0.002770f, 0.000916f, 0.000322f, -0.000187f, -0.000070f, -0.001111f, -0.000935f, -0.000574f, -0.000282f, -0.000920f, -0.000136f, 0.000082f, 0.000868f, 0.001243f, 0.001462f, 0.000720f, 0.000634f, -0.000499f, -0.001233f, -0.002141f, -0.001412f, -0.000781f, 0.000413f, 0.001553f, 0.002372f, 0.001548f, 0.000318f, -0.000811f, -0.001022f, -0.001568f, -0.001160f, -0.000120f, 0.000657f, 0.000612f, 0.000582f, 0.000172f, 0.000106f, -0.000084f, 0.000004f, -0.000126f, -0.000104f, -0.000146f, 0.000013f, -0.000038f, -0.000061f, -0.000141f, 0.000009f, 0.000076f, 0.000085f, 0.000045f, 0.000069f, -0.000012f, -0.000032f} + }, + { + {-0.010247f, -0.009027f, 0.011393f, -0.002243f, 0.009110f, 0.002711f, 0.013514f, -0.003060f, -0.006886f, -0.004717f, 0.008282f, 0.000304f, -0.002923f, -0.000721f, 0.009355f, -0.002397f, 0.001752f, 0.003336f, -0.006177f, -0.004673f, -0.001971f, 0.001791f, -0.006415f, 0.001725f, 0.001376f, -0.007426f, -0.002382f, -0.004412f, 0.000690f, -0.003202f, 0.001255f, 0.012318f, 0.006328f, -0.003501f, 0.000633f, -0.005734f, 0.004510f, -0.001485f, 0.007281f, -0.014931f, -0.001602f, 0.002400f, -0.005298f, 0.001040f, 0.007318f, 0.005632f, -0.006716f, -0.004918f, -0.005392f, -0.000930f, -0.004267f, -0.002106f, -0.006558f, 0.002597f, -0.000551f, -0.007547f, -0.003922f, -0.002999f, -0.000359f, 0.001653f, -0.001642f, -0.000711f, 0.003302f, 0.001379f, -0.003580f, 0.001968f, 0.008143f, -0.004089f, -0.001061f, -0.008654f, -0.003316f, -0.000598f, 0.003629f, -0.003612f, 0.001063f, 0.001555f, 0.001224f, 0.002901f, -0.006740f, -0.000145f, -0.003797f, 0.003282f, -0.002429f, -0.006428f, -0.001846f, -0.000123f, -0.000108f, -0.002794f, -0.003024f, 0.003250f, -0.001427f, -0.000503f, 0.001175f, 0.001933f, 0.000089f, -0.000345f, + 0.000360f, 0.001183f, 0.000072f, -0.000640f, 0.001444f, 0.000343f, -0.001264f, -0.001072f, 0.001347f, -0.000397f, 0.000485f, -0.000781f, 0.001214f, -0.001042f, -0.000737f, -0.000102f, -0.000253f, 0.000515f, 0.013969f, -0.005309f, 0.004503f, 0.011671f, -0.009580f, -0.010794f, -0.001640f, -0.002741f, -0.000191f, 0.005916f, 0.003268f, -0.014982f, 0.002271f, -0.008621f, -0.011840f, -0.000819f, 0.004259f, 0.004613f, -0.003904f, -0.000558f, -0.001321f, 0.006353f, -0.001391f, 0.005215f, -0.002527f, 0.000556f, 0.001094f, 0.001548f, -0.007523f, 0.003082f, 0.005706f, -0.002761f, 0.007290f, -0.004128f, -0.000866f, -0.009244f, 0.006468f, 0.001595f, -0.002493f, -0.007179f, -0.007128f, -0.003258f, -0.002479f, 0.003518f, -0.000846f, 0.003031f, 0.002980f, -0.006370f, 0.003871f, -0.008540f, 0.002970f, 0.004900f, 0.009306f, 0.008984f, -0.007852f, 0.003814f, -0.000570f, -0.002100f, 0.005416f, -0.004230f, -0.005073f, -0.003802f, 0.004401f, 0.002191f, 0.005758f, -0.005839f, 0.008708f, -0.002886f, -0.000522f, 0.002611f, 0.001378f, 0.005119f, -0.003980f, 0.007309f, 0.009190f, 0.016187f, 0.007450f, 0.005128f, + -0.009662f, -0.001782f, -0.006335f, -0.004552f, 0.005810f, -0.000801f, 0.007197f, 0.002950f, -0.000665f, -0.001481f, -0.001351f, 0.004181f, -0.003274f, 0.003330f, 0.003879f, -0.003153f, 0.001809f, 0.001431f, 0.000331f, 0.002379f, -0.001575f, -0.000460f, -0.003233f, -0.000186f, 0.000175f, 0.001622f, -0.017281f, -0.018590f, 0.002013f, -0.001615f, 0.004303f, 0.004007f, 0.012120f, 0.005427f, 0.005741f, 0.002858f, -0.006066f, 0.002206f, 0.015340f, -0.010408f, -0.001245f, 0.000380f, 0.012299f, 0.007354f, 0.001641f, 0.005397f, -0.001064f, 0.004147f, 0.005626f, 0.012597f, 0.006953f, 0.007032f, 0.003751f, 0.002960f, 0.006109f, 0.002148f, -0.008924f, 0.005338f, 0.007233f, -0.002694f, 0.005240f, 0.006920f, -0.002518f, 0.002115f, 0.008691f, 0.003146f, -0.002179f, 0.003057f, 0.008874f, -0.000548f, -0.000162f, -0.001852f, 0.002391f, 0.008287f, -0.002536f, -0.004813f, 0.002362f, -0.002991f, 0.004370f, 0.005169f, -0.006292f, 0.001251f, -0.004083f, 0.000235f, 0.002501f, 0.006960f, 0.005750f, -0.014921f, -0.000081f, 0.007174f, -0.003824f, -0.006272f, 0.000787f, 0.001046f, 0.007260f, -0.000701f, + -0.015867f, -0.007009f, 0.005084f, -0.004491f, 0.007416f, -0.002164f, 0.000003f, 0.001801f, 0.009314f, 0.005772f, 0.003931f, -0.004905f, 0.007647f, -0.001013f, 0.004673f, 0.002218f, 0.000901f, 0.001515f, 0.001574f, -0.000214f, -0.001254f, 0.000934f, -0.000688f, -0.003933f, -0.001650f, -0.001674f, -0.000508f, -0.000981f, -0.000033f, -0.001256f, -0.002793f, 0.001283f, 0.000570f, -0.001509f, 0.000301f, 0.002514f, 0.001898f, 0.000805f, -0.000381f, -0.000539f, -0.000286f, -0.000240f, 0.002466f, -0.000031f, -0.031155f, 0.004520f, 0.003368f, 0.014727f, -0.000426f, 0.011527f, 0.005989f, 0.003032f, -0.018194f, 0.000152f, -0.000136f, -0.014102f, 0.002425f, 0.010759f, 0.002170f, -0.000084f, -0.001193f, -0.005556f, -0.006357f, 0.003022f, 0.004350f, -0.000387f, 0.002955f, 0.003385f, 0.012935f, 0.001578f, 0.005817f, 0.006078f, -0.006545f, 0.001559f, -0.001421f, -0.001740f, -0.000696f, 0.004815f, -0.000567f, -0.003097f, -0.004960f, -0.002962f, 0.001804f, -0.008995f, -0.006300f, 0.003936f, -0.007073f, 0.002467f, -0.011723f, -0.014139f, -0.003465f, 0.017706f, -0.004487f, -0.000944f, 0.010563f, 0.003577f, + 0.000938f, 0.011210f, -0.001403f, 0.001333f, -0.001237f, 0.003349f, 0.007320f, -0.002709f, -0.010941f, 0.007189f, -0.006304f, -0.012254f, -0.004738f, -0.003369f, 0.000166f, 0.004618f, 0.013542f, 0.000170f, 0.000049f, -0.005151f, -0.000311f, 0.007960f, -0.003542f, -0.004002f, 0.009718f, -0.007978f, -0.000428f, 0.004432f, -0.009553f, -0.001840f, -0.003184f, -0.003229f, 0.001285f, -0.005155f, -0.007153f, 0.000516f, 0.004764f, -0.002059f, -0.002970f, -0.004107f, -0.004004f, -0.000531f, 0.003249f, 0.001425f, -0.000203f, -0.001180f, -0.003063f, 0.000206f, -0.000880f, -0.003953f, -0.005665f, -0.004976f, 0.000154f, -0.000601f, 0.002604f, -0.003866f, 0.000041f, -0.000531f, 0.002125f, -0.000270f, 0.001048f, -0.001138f, 0.000238f, 0.000640f, -0.001761f, 0.027692f, 0.000740f, -0.001867f, -0.010742f, -0.006258f, 0.014535f, -0.006132f, 0.011311f, 0.009700f, -0.011386f, -0.002009f, 0.008443f, -0.006463f, -0.003196f, -0.003119f, -0.004231f, 0.001663f, 0.002929f, 0.000343f, 0.005218f, -0.002633f, 0.000687f, 0.001841f, -0.002409f, -0.005463f, -0.005653f, -0.006404f, 0.000344f, 0.007063f, 0.003010f, -0.006327f, + 0.000427f, 0.002671f, 0.013697f, -0.004291f, 0.012249f, -0.011473f, 0.004970f, 0.008742f, -0.006031f, -0.003789f, -0.011644f, 0.005242f, -0.000246f, -0.008272f, 0.007877f, -0.010211f, 0.011107f, -0.000809f, 0.015775f, 0.003460f, 0.001612f, 0.003649f, 0.006501f, 0.003334f, -0.005256f, 0.007644f, -0.001575f, -0.008574f, -0.013213f, -0.003770f, 0.005447f, -0.006771f, -0.004369f, 0.004906f, -0.007434f, 0.014160f, -0.013927f, -0.000278f, 0.009139f, -0.008105f, -0.003235f, -0.014714f, -0.001185f, -0.005898f, -0.003278f, -0.004573f, 0.012448f, 0.004712f, 0.001183f, 0.000291f, 0.010729f, 0.000843f, -0.001022f, 0.008443f, 0.007047f, 0.006271f, 0.013354f, -0.003104f, 0.001223f, -0.004025f, 0.003711f, 0.004192f, 0.000817f, 0.001055f, -0.002356f, -0.000336f, -0.003299f, -0.001851f, 0.000228f, 0.000967f, 0.002054f, -0.001312f, -0.000552f, 0.004062f, 0.001926f, -0.001875f, 0.008252f, -0.000719f, -0.002155f, -0.003689f, -0.002322f, 0.002783f, -0.002944f, 0.000011f, -0.000429f, -0.003204f, 0.001208f, 0.000608f, -0.000876f, 0.001823f, 0.002118f, -0.002513f, 0.002201f, 0.003678f, 0.013379f, 0.023736f, + -0.007025f, -0.010434f, 0.002664f, -0.004301f, 0.006503f, 0.021600f, 0.000074f, -0.005058f, 0.006819f, 0.003659f, 0.006360f, 0.003821f, -0.011849f, 0.000371f, -0.010579f, 0.005798f, 0.005040f, 0.003031f, 0.019764f, -0.001018f, 0.014724f, -0.000459f, -0.000409f, 0.004425f, -0.000167f, 0.015475f, 0.002015f, 0.009717f, -0.003656f, 0.013188f, -0.006017f, 0.006998f, 0.026235f, -0.004371f, -0.006667f, 0.018446f, 0.003865f, 0.011990f, -0.000326f, -0.011594f, 0.003561f, -0.006722f, 0.007912f, -0.013955f, -0.001881f, -0.007292f, 0.007804f, -0.001258f, 0.001593f, 0.014228f, -0.006974f, -0.014469f, 0.004013f, -0.001325f, -0.000693f, 0.011553f, 0.002238f, 0.001572f, -0.005259f, -0.009550f, -0.010039f, -0.003442f, -0.008288f, -0.006346f, 0.008573f, -0.004408f, -0.000818f, -0.003226f, 0.001010f, -0.000047f, 0.007660f, 0.004698f, -0.008763f, -0.012750f, -0.002952f, 0.000312f, 0.003500f, -0.003545f, -0.003093f, 0.010307f, 0.005949f, 0.005029f, 0.001531f, -0.008569f, -0.003893f, 0.004488f, 0.000225f, -0.002895f, 0.003735f, -0.001266f, 0.002292f, -0.002853f, 0.000258f, -0.001678f, -0.004770f, -0.005805f, + -0.001472f, -0.005148f, 0.001382f, -0.000850f, 0.000546f, 0.003359f, -0.000868f, -0.002808f, 0.004310f, 0.000816f, 0.002773f, 0.001489f, 0.000331f, -0.001684f, 0.002169f, -0.000630f, -0.000414f, -0.000260f, -0.000390f, 0.000081f, -0.000797f, 0.001082f, 0.002779f, -0.003408f, 0.000982f, -0.004000f, 0.000692f, -0.001991f, 0.004980f, 0.032495f, -0.017324f, 0.011291f, 0.000271f, 0.005479f, -0.008069f, -0.006353f, -0.003774f, 0.006935f, 0.008968f, 0.001776f, -0.005197f, -0.009665f, 0.004782f, 0.008867f, -0.001952f, 0.002671f, -0.005020f, 0.009683f, 0.003461f, -0.018667f, -0.006268f, 0.005795f, -0.001271f, -0.008027f, -0.000564f, 0.008259f, -0.006373f, 0.002698f, -0.012227f, 0.006863f, 0.015021f, -0.006458f, 0.015899f, 0.000389f, -0.003132f, 0.010566f, -0.000665f, 0.000671f, 0.009495f, -0.021102f, 0.002940f, 0.006195f, 0.008704f, 0.005869f, 0.006752f, -0.009553f, -0.007500f, -0.000481f, 0.003126f, -0.010332f, 0.003148f, 0.009744f, 0.008664f, 0.003141f, 0.026902f, -0.008693f, -0.003625f, -0.012427f, -0.005489f, -0.008197f, -0.011519f, 0.013831f, 0.005600f, 0.013506f, -0.002368f, -0.021989f, + 0.012482f, -0.007855f, 0.006751f, 0.006122f, 0.002810f, 0.003627f, -0.017497f, 0.020304f, 0.004217f, -0.009616f, -0.016804f, -0.010514f, -0.010624f, 0.001312f, 0.008200f, -0.007846f, 0.000387f, 0.005062f, 0.004180f, -0.000128f, -0.003857f, 0.000714f, -0.000629f, 0.003093f, 0.003170f, 0.003563f, 0.002302f, 0.002311f, 0.000998f, -0.006151f, -0.005680f, 0.000131f, -0.002268f, 0.001839f, 0.002170f, -0.002928f, 0.003631f, -0.001080f, 0.001138f, 0.003113f, 0.001103f, 0.002388f, 0.000448f, -0.006530f, -0.000748f, -0.000212f, 0.001951f, 0.001537f, 0.000465f, -0.001574f, -0.002041f, 0.003338f, -0.001333f, 0.008309f, 0.001131f, 0.003523f, -0.038766f, -0.032573f, -0.029999f, 0.007169f, 0.006636f, 0.002932f, 0.001759f, -0.001784f, -0.001970f, 0.001198f, -0.004787f, -0.010645f, -0.007267f, -0.018923f, -0.008128f, -0.008990f, 0.011939f, -0.014459f, -0.006166f, -0.008022f, 0.002895f, 0.000545f, -0.003444f, 0.004703f, -0.000881f, -0.015032f, 0.000096f, 0.014509f, 0.002237f, -0.013371f, -0.011736f, 0.005680f, -0.004499f, 0.012234f, 0.008758f, -0.012616f, 0.013235f, 0.020601f, -0.016545f, -0.017008f, + -0.008872f, 0.006748f, 0.016506f, -0.011095f, -0.011426f, 0.006450f, -0.006417f, 0.001615f, -0.001097f, -0.001114f, -0.018024f, 0.003886f, 0.011603f, -0.005376f, 0.006829f, -0.008817f, -0.010477f, -0.010474f, -0.004925f, -0.018303f, 0.032397f, -0.006420f, -0.001716f, 0.005937f, 0.003920f, 0.007163f, 0.004798f, 0.010325f, 0.005000f, 0.009010f, 0.020230f, -0.025178f, 0.018316f, -0.005739f, -0.004400f, -0.000526f, -0.028038f, -0.000954f, 0.009178f, 0.001140f, 0.001584f, 0.008310f, 0.003377f, -0.000358f, 0.005203f, -0.009286f, 0.011622f, -0.003686f, -0.006022f, 0.006400f, -0.003476f, -0.003218f, 0.001618f, 0.005287f, -0.003334f, -0.005704f, 0.002540f, 0.005140f, 0.000674f, -0.001712f, -0.004784f, -0.002556f, 0.001219f, -0.007113f, -0.004486f, -0.002260f, 0.004054f, -0.001346f, 0.000769f, 0.004271f, 0.000572f, -0.007086f, -0.001183f, -0.005984f, -0.005113f, -0.004965f, -0.002760f, -0.005521f, 0.005483f, -0.001413f, 0.000850f, 0.010986f, -0.001596f, -0.002907f, -0.002349f, 0.006098f, 0.001980f, -0.001642f, -0.001588f, -0.038496f, 0.029529f, 0.007827f, 0.006452f, -0.007126f, 0.028910f, -0.004548f, + 0.013636f, -0.000045f, 0.012274f, -0.017202f, 0.006837f, 0.006734f, 0.002666f, -0.008474f, 0.025754f, -0.006990f, 0.007880f, 0.005895f, 0.026734f, -0.018034f, -0.001123f, 0.007396f, -0.004589f, -0.013246f, 0.008030f, -0.012465f, 0.003274f, 0.003364f, -0.014533f, 0.005607f, 0.001262f, 0.000687f, 0.029425f, 0.018304f, -0.002385f, -0.012066f, -0.009311f, 0.006494f, -0.001482f, -0.017665f, 0.005080f, -0.001613f, 0.005273f, 0.013188f, 0.019617f, -0.013481f, 0.013373f, 0.006572f, -0.008704f, 0.006266f, 0.005210f, -0.013952f, -0.007398f, -0.008782f, 0.014088f, -0.015205f, -0.012725f, -0.034735f, -0.025267f, 0.006936f, -0.004649f, -0.005087f, -0.013221f, -0.026985f, 0.010436f, 0.001958f, -0.000664f, 0.013050f, 0.011347f, 0.015715f, 0.009540f, 0.003707f, -0.000312f, 0.002405f, 0.018044f, -0.013354f, 0.024660f, -0.009148f, -0.006791f, -0.022529f, 0.003733f, -0.004256f, -0.011246f, -0.002171f, 0.002900f, -0.005785f, 0.006701f, -0.002864f, 0.000468f, -0.002916f, -0.000701f, -0.002532f, -0.000347f, 0.003875f, 0.006620f, 0.000340f, 0.005506f, -0.006152f, -0.004034f, -0.003212f, 0.002426f, 0.004419f, + -0.005864f, -0.002485f, -0.002609f, 0.000694f, -0.003162f, 0.002538f, -0.000373f, 0.002177f, 0.004299f, -0.000150f, -0.006236f, 0.008960f, 0.009079f, 0.003449f, 0.000327f, -0.004195f, 0.000024f, -0.002302f, -0.000678f, -0.000515f, 0.010036f, -0.046895f, 0.042711f, 0.030582f, -0.012967f, -0.011003f, 0.011278f, -0.000247f, 0.000709f, 0.020199f, 0.014196f, 0.000246f, -0.003375f, 0.007924f, -0.005125f, -0.003326f, 0.005453f, -0.009564f, 0.011223f, 0.007578f, -0.009961f, 0.012121f, -0.001685f, 0.003012f, -0.001250f, -0.020865f, -0.001485f, 0.014581f, 0.015137f, 0.005723f, 0.006291f, 0.007948f, -0.009895f, -0.012440f, 0.004883f, 0.008950f, -0.000725f, -0.005018f, -0.010876f, 0.004030f, -0.003427f, 0.012836f, 0.015190f, -0.002084f, 0.017563f, -0.009660f, 0.019611f, 0.010458f, 0.023706f, 0.001387f, 0.003179f, -0.007269f, -0.010153f, -0.002210f, 0.018119f, 0.029780f, 0.001497f, 0.022616f, -0.010229f, -0.022376f, 0.002621f, 0.007972f, -0.019584f, 0.019726f, -0.006961f, 0.006750f, -0.042749f, -0.018592f, -0.000596f, -0.010539f, 0.007896f, 0.013687f, 0.029150f, 0.005798f, -0.000095f, -0.014775f, + -0.025922f, 0.006269f, 0.000791f, -0.021831f, 0.008500f, 0.004313f, -0.015821f, -0.004746f, 0.003401f, 0.016646f, 0.000080f, 0.004796f, 0.004895f, 0.008514f, 0.006966f, -0.014713f, 0.004818f, -0.000594f, -0.003158f, -0.000024f, -0.001007f, -0.002645f, 0.005817f, 0.005445f, -0.006289f, -0.002808f, -0.000379f, 0.003791f, -0.002590f, 0.005552f, 0.000587f, 0.003952f, 0.003538f, -0.005022f, 0.003240f, 0.003963f, 0.010795f, 0.000669f, 0.006045f, 0.006597f, 0.001427f, 0.007803f, 0.002672f, 0.003860f, 0.001590f, 0.000687f, 0.002669f, 0.009225f, -0.004368f, -0.009158f, 0.001874f, 0.010701f, -0.018852f, 0.030304f, -0.014095f, 0.002982f, 0.022445f, 0.023280f, -0.002551f, -0.014550f, -0.008185f, -0.008062f, 0.000997f, -0.018583f, -0.014947f, 0.014217f, 0.002964f, 0.008882f, 0.010916f, 0.013119f, -0.006992f, 0.008260f, -0.004200f, 0.010036f, 0.043984f, 0.009837f, -0.022408f, 0.020262f, 0.023265f, 0.000343f, -0.004797f, 0.000571f, -0.012743f, -0.017122f, -0.009429f, 0.023865f, 0.015657f, 0.012909f, 0.020046f, 0.003546f, -0.004447f, -0.010288f, -0.027385f, 0.011615f, 0.013136f, 0.007092f, + -0.005069f, -0.003959f, -0.010022f, 0.003020f, 0.020724f, 0.014217f, -0.025630f, 0.015685f, -0.021752f, 0.021339f, 0.003803f, 0.007579f, 0.008937f, -0.004335f, -0.012699f, -0.004239f, 0.007946f, 0.037415f, -0.006977f, 0.018369f, -0.009378f, -0.017853f, 0.019281f, 0.017556f, 0.003681f, 0.003528f, 0.017385f, 0.005780f, 0.000130f, -0.002717f, -0.012609f, -0.004218f, -0.018059f, 0.004870f, -0.014243f, -0.007262f, 0.025997f, -0.002042f, -0.000253f, -0.000076f, 0.011449f, -0.004674f, 0.002711f, 0.007630f, 0.011521f, 0.012944f, 0.010278f, 0.003827f, 0.004909f, 0.005598f, 0.010316f, -0.002349f, -0.010107f, 0.012240f, 0.004044f, 0.006488f, 0.006729f, -0.000254f, -0.001978f, 0.000223f, -0.006741f, 0.002948f, 0.011074f, 0.000794f, 0.000457f, -0.003131f, -0.005636f, 0.009597f, 0.009806f, 0.001559f, 0.018241f, -0.002966f, 0.007212f, 0.014277f, -0.000216f, 0.003566f, -0.003325f, -0.006229f, 0.000337f, 0.002677f, 0.004165f, 0.010141f, 0.003439f, 0.007465f, 0.001738f, 0.001384f, 0.009871f, -0.002325f, 0.000875f, 0.007944f, 0.001320f, 0.002074f, 0.000427f, 0.003411f, 0.000011f, 0.004863f, + -0.001109f, 0.003494f, 0.000432f, 0.015716f, -0.008128f, 0.015983f, 0.020428f, -0.023700f, 0.015739f, 0.009092f, -0.005859f, 0.001377f, 0.010767f, -0.009958f, -0.021011f, 0.031226f, 0.006587f, 0.005924f, 0.005663f, 0.018519f, 0.005220f, -0.018755f, 0.019775f, -0.026864f, -0.031540f, 0.002746f, 0.003550f, -0.017331f, -0.005898f, -0.051263f, -0.036516f, -0.027337f, -0.009475f, -0.028116f, -0.014093f, 0.010663f, -0.025529f, 0.017743f, 0.016044f, -0.020565f, 0.026300f, 0.014204f, -0.005483f, -0.002640f, -0.014045f, 0.000639f, -0.024859f, 0.053946f, 0.015451f, 0.008458f, -0.027217f, 0.006620f, -0.008631f, 0.035816f, -0.007523f, -0.000847f, -0.032961f, 0.032014f, 0.001784f, 0.012604f, 0.010000f, 0.018728f, 0.010183f, -0.007108f, 0.010295f, -0.015767f, 0.015748f, -0.005696f, 0.009114f, -0.025298f, 0.057226f, 0.008949f, -0.027133f, 0.014668f, 0.016409f, 0.013332f, 0.019182f, 0.016925f, -0.026392f, 0.020889f, -0.000965f, 0.016893f, -0.013591f, 0.005176f, -0.033864f, 0.014274f, 0.014077f, 0.004463f, -0.008504f, -0.025011f, -0.002134f, 0.017550f, -0.022929f, -0.002791f, -0.003166f, 0.000174f, + 0.006331f, 0.005497f, -0.005590f, 0.010022f, -0.001113f, -0.004446f, 0.007122f, 0.006236f, -0.007587f, -0.005319f, -0.015228f, -0.000563f, -0.014219f, 0.008553f, 0.001682f, 0.001750f, 0.010102f, 0.016921f, 0.009849f, 0.008186f, 0.004613f, -0.005453f, -0.002952f, 0.000611f, -0.011304f, -0.008333f, -0.003121f, -0.003087f, 0.005062f, 0.013910f, 0.003532f, 0.008997f, -0.002649f, 0.000361f, 0.003519f, 0.000134f, 0.002871f, 0.010729f, -0.041771f, 0.011577f, -0.005815f, -0.004165f, 0.024627f, -0.004661f, -0.004321f, 0.002288f, 0.022040f, -0.005880f, 0.012813f, -0.010928f, -0.012848f, -0.016409f, -0.020756f, 0.035768f, 0.018613f, 0.012903f, -0.011367f, -0.032982f, -0.040422f, 0.019299f, 0.013287f, -0.014429f, 0.009521f, -0.009844f, 0.000873f, 0.035592f, 0.015513f, -0.010241f, 0.019178f, -0.006620f, 0.009913f, -0.012014f, 0.012007f, -0.026491f, -0.038846f, -0.015182f, -0.017371f, -0.003058f, 0.045290f, -0.037048f, 0.021280f, 0.012153f, 0.009199f, -0.008279f, 0.017786f, 0.007856f, -0.035527f, -0.045219f, -0.016119f, -0.020688f, 0.051003f, 0.036904f, -0.012434f, -0.022893f, -0.001961f, -0.023490f, + -0.004999f, 0.037057f, 0.034370f, 0.019415f, -0.030428f, 0.006443f, -0.023780f, 0.037152f, 0.017645f, -0.004057f, 0.000076f, 0.012431f, -0.022069f, 0.004834f, 0.032830f, 0.017745f, -0.029793f, 0.032200f, -0.016540f, 0.019197f, 0.051262f, 0.019473f, -0.012124f, -0.015308f, 0.043869f, 0.004729f, -0.002714f, -0.020060f, 0.007701f, -0.009516f, 0.002792f, -0.005984f, -0.001066f, -0.001414f, -0.021898f, 0.002648f, -0.002748f, -0.006347f, 0.009596f, -0.001809f, -0.007756f, 0.001283f, -0.004615f, 0.001105f, -0.005721f, -0.008631f, 0.007571f, -0.009556f, -0.006047f, 0.004363f, 0.011416f, -0.000681f, 0.008066f, 0.006538f, -0.001512f, -0.000146f, -0.010985f, 0.001397f, 0.003740f, -0.009426f, 0.012514f, 0.006055f, -0.007594f, -0.005224f, -0.005288f, -0.002480f, -0.012239f, 0.007155f, 0.011689f, 0.000428f, -0.009088f, -0.005415f, 0.006111f, -0.002757f, 0.005887f, 0.008107f, 0.000679f, 0.002927f, 0.000115f, -0.000029f, -0.033663f, -0.013525f, 0.054882f, 0.025110f, 0.031391f, 0.007238f, -0.046617f, 0.013678f, -0.037926f, 0.024022f, 0.068735f, 0.024078f, 0.042920f, -0.020128f, 0.012001f, 0.019640f, + -0.002637f, 0.004656f, -0.018327f, 0.003976f, 0.026696f, 0.000885f, -0.007815f, -0.025154f, 0.012993f, 0.009609f, -0.025616f, 0.012525f, -0.010069f, 0.018632f, 0.026839f, 0.028566f, 0.034532f, 0.002974f, -0.027755f, 0.006813f, 0.016027f, -0.000853f, 0.047215f, 0.003658f, -0.055451f, -0.034995f, 0.015073f, -0.014515f, -0.065344f, 0.001807f, 0.027069f, 0.009649f, 0.002347f, -0.006440f, 0.033580f, -0.027361f, -0.033800f, -0.006967f, -0.012457f, -0.032910f, -0.002350f, 0.001823f, -0.019406f, -0.028413f, -0.017624f, 0.000828f, 0.003477f, -0.040802f, 0.011463f, -0.017330f, 0.009228f, 0.045927f, -0.006909f, -0.016701f, 0.031821f, -0.006177f, 0.026398f, -0.026082f, 0.016845f, 0.000596f, -0.030125f, -0.033545f, 0.058990f, 0.005254f, 0.007472f, 0.002280f, -0.000513f, 0.059173f, 0.048215f, 0.014878f, -0.005072f, 0.022873f, -0.012053f, 0.007450f, 0.013375f, -0.003123f, 0.017760f, 0.007349f, 0.004757f, -0.027746f, 0.015598f, 0.008147f, -0.002121f, 0.001933f, -0.009808f, 0.007297f, 0.020474f, -0.004026f, -0.007445f, -0.012234f, -0.013371f, 0.012139f, 0.014343f, 0.000274f, -0.000548f, -0.012061f, + -0.012989f, 0.001677f, -0.018389f, 0.001991f, -0.006536f, 0.018095f, 0.006009f, 0.000271f, -0.012378f, -0.021081f, -0.005312f, -0.010504f, -0.014480f, 0.007452f, 0.007637f, 0.015444f, 0.005668f, 0.001823f, 0.017557f, -0.002688f, 0.047166f, 0.006370f, -0.063920f, -0.028771f, 0.040135f, -0.057159f, 0.032935f, -0.054084f, 0.004723f, -0.008421f, -0.078294f, -0.010104f, 0.035697f, 0.072593f, 0.023362f, -0.010267f, 0.017888f, -0.027510f, -0.008975f, -0.062879f, -0.003178f, -0.042639f, -0.005836f, -0.009165f, -0.029284f, -0.031220f, -0.010094f, 0.018277f, -0.028122f, 0.019826f, 0.036487f, -0.037039f, 0.013862f, 0.012218f, 0.006759f, -0.039443f, -0.005682f, -0.000230f, -0.041140f, 0.011000f, 0.053256f, -0.003847f, -0.076385f, 0.027351f, -0.045981f, -0.118215f, 0.033774f, -0.048805f, -0.060480f, 0.003386f, -0.027476f, 0.008587f, 0.021332f, -0.011535f, 0.031581f, -0.025931f, 0.027642f, -0.021382f, -0.052557f, 0.000420f, 0.038329f, 0.036444f, -0.068410f, 0.010223f, -0.007801f, -0.051157f, -0.013270f, -0.012617f, 0.089612f, 0.044592f, 0.052754f, 0.023897f, 0.023200f, 0.055242f, 0.079732f, -0.018049f, + -0.037101f, -0.040946f, 0.007660f, -0.050890f, -0.015200f, 0.026386f, 0.043299f, 0.006033f, 0.004367f, 0.037191f, -0.008127f, -0.021106f, -0.028219f, 0.022391f, 0.025904f, 0.024942f, 0.006326f, 0.028606f, 0.012379f, -0.017609f, -0.003396f, -0.017068f, 0.026632f, 0.004154f, -0.002540f, -0.029374f, 0.009408f, 0.023390f, 0.003102f, 0.000344f, 0.023470f, -0.018423f, -0.011714f, 0.012573f, 0.001834f, -0.009377f, -0.017092f, -0.005782f, 0.027545f, -0.001468f, -0.059214f, -0.005728f, -0.000918f, -0.013884f, -0.011088f, -0.015992f, -0.009105f, 0.012809f, 0.012234f, 0.006703f, 0.004721f, -0.010074f, -0.001170f, -0.012379f, 0.103806f, 0.112206f, -0.065831f, -0.026084f, 0.050126f, -0.022722f, 0.020246f, -0.031260f, 0.009395f, -0.032124f, -0.060101f, 0.081942f, 0.012005f, 0.025715f, 0.021138f, 0.007645f, 0.010830f, 0.002426f, 0.016677f, 0.020321f, -0.058132f, -0.048037f, -0.041963f, -0.039749f, -0.029653f, -0.018805f, -0.015448f, -0.031280f, -0.017592f, -0.026529f, 0.030165f, 0.022776f, 0.011658f, -0.014673f, 0.006208f, -0.061693f, -0.030843f, 0.016636f, -0.055866f, -0.005300f, 0.027349f, 0.048184f, + 0.007191f, 0.009219f, -0.020561f, -0.036298f, -0.042517f, 0.034082f, -0.004519f, 0.033730f, -0.119410f, 0.007280f, -0.013778f, 0.013564f, 0.073207f, 0.008768f, 0.012321f, 0.008026f, -0.021284f, -0.024851f, 0.000797f, -0.005104f, -0.066979f, 0.014143f, -0.024485f, 0.059926f, 0.004143f, -0.066232f, -0.089645f, -0.056077f, -0.011206f, -0.063356f, -0.061609f, -0.038632f, 0.043669f, -0.011621f, -0.042391f, -0.057689f, 0.048037f, -0.006538f, 0.028475f, -0.032647f, 0.017519f, 0.046829f, -0.031251f, -0.045917f, -0.018989f, -0.023935f, 0.049521f, 0.009947f, -0.021554f, 0.018982f, 0.014603f, 0.042488f, 0.026788f, 0.011988f, -0.038081f, -0.038606f, -0.008272f, 0.003889f, -0.009902f, 0.006289f, 0.026566f, -0.006411f, -0.002146f, -0.019971f, -0.014088f, -0.011212f, -0.020039f, -0.004490f, 0.008318f, 0.011427f, 0.062491f, 0.003418f, -0.015613f, -0.005748f, 0.008388f, 0.018705f, -0.001108f, 0.030056f, 0.012969f, 0.070468f, 0.011052f, -0.001465f, 0.002591f, 0.012088f, 0.003501f, -0.003358f, -0.020419f, -0.031353f, 0.116230f, -0.068400f, 0.043722f, 0.082198f, -0.040356f, 0.011166f, 0.065527f, -0.084293f, + 0.002728f, 0.008875f, 0.040142f, -0.094453f, 0.004608f, 0.005838f, 0.030275f, -0.041484f, -0.000101f, 0.016357f, -0.055887f, 0.007757f, -0.004829f, -0.010790f, 0.029791f, -0.009597f, -0.008980f, 0.012409f, -0.007891f, -0.009847f, 0.029194f, -0.028328f, 0.007573f, -0.011927f, 0.006965f, -0.018298f, -0.010568f, -0.022217f, -0.000358f, 0.003820f, 0.057726f, 0.019002f, 0.027702f, -0.006316f, -0.000019f, 0.042880f, -0.002518f, -0.016777f, 0.023585f, 0.017495f, -0.020206f, -0.057059f, 0.051231f, -0.056866f, 0.008538f, 0.026732f, 0.034894f, -0.055960f, 0.058665f, 0.095060f, -0.052895f, -0.097354f, 0.129086f, 0.045529f, -0.064843f, 0.029298f, -0.062456f, -0.076969f, -0.038952f, -0.014348f, -0.080802f, 0.064473f, -0.112350f, 0.033190f, 0.052494f, -0.044617f, -0.149957f, 0.140792f, -0.025329f, -0.036690f, 0.093240f, -0.094037f, 0.047636f, 0.079955f, -0.024878f, -0.022314f, 0.024100f, 0.027274f, -0.015895f, 0.009651f, 0.007388f, 0.025158f, -0.013408f, -0.009534f, 0.027611f, -0.000347f, 0.005504f, -0.003293f, 0.004458f, 0.022505f, 0.015949f, -0.003363f, -0.021254f, 0.033114f, 0.035172f, -0.007097f, + -0.031979f, -0.003558f, 0.014345f, 0.003053f, 0.021272f, -0.000148f, 0.018477f, 0.007997f, 0.027544f, 0.020857f, 0.022964f, -0.035864f, 0.008127f, -0.000935f, 0.000403f, -0.000105f, -0.022801f, -0.038712f, 0.055223f, -0.009328f, -0.053162f, 0.018693f, 0.011508f, 0.005211f, -0.009722f, -0.036190f, -0.028081f, 0.065155f, -0.042608f, -0.034034f, -0.068144f, -0.031270f, 0.040858f, 0.031738f, -0.018014f, -0.022551f, 0.021871f, 0.054067f, -0.022921f, 0.040833f, 0.048892f, -0.034345f, -0.004728f, 0.029909f, -0.007466f, -0.000001f, -0.009596f, 0.002739f, -0.049474f, 0.013756f, -0.010789f, 0.001811f, 0.012213f, -0.009876f, 0.010497f, -0.020510f, -0.041393f, -0.019588f, -0.072249f, 0.009181f, 0.000090f, -0.010708f, 0.013698f, 0.007014f, -0.004472f, -0.016422f, 0.029398f, 0.046146f, -0.048131f, 0.070849f, -0.007716f, 0.009540f, 0.010518f, 0.062633f, 0.028968f, 0.045853f, -0.057161f, -0.014157f, -0.010499f, 0.081610f, -0.075805f, -0.025912f, 0.037473f, -0.002665f, -0.087575f, 0.006026f, -0.017840f, -0.014954f, 0.040399f, 0.044030f, 0.003378f, -0.032929f, 0.071285f, -0.029845f, 0.118686f, 0.001624f, + -0.054631f, -0.000017f, -0.009237f, -0.062100f, 0.119248f, 0.023955f, -0.017434f, -0.140765f, -0.070060f, 0.039718f, -0.051522f, -0.046611f, 0.055457f, -0.206372f, 0.005522f, 0.040716f, 0.030185f, -0.016661f, 0.058372f, -0.035485f, -0.004284f, 0.000305f, 0.030561f, -0.008559f, 0.006505f, 0.041166f, -0.002543f, -0.010347f, -0.012690f, -0.014775f, -0.000323f, 0.004636f, -0.002410f, -0.006209f, 0.026912f, -0.037203f, -0.008017f, 0.004442f, 0.006543f, -0.022285f, -0.037383f, -0.009589f, -0.011245f, -0.005392f, -0.002810f, 0.007306f, -0.041508f, 0.003216f, 0.032068f, -0.019775f, 0.024598f, 0.018598f, -0.017906f, 0.001130f, -0.013022f, 0.005273f, 0.009252f, -0.019519f, 0.055140f, -0.026632f, -0.024237f, -0.031753f, -0.028803f, -0.014385f, 0.025889f, 0.035353f, 0.021324f, 0.088799f, -0.017828f, 0.019662f, -0.009178f, -0.046719f, 0.022494f, -0.029984f, -0.017199f, 0.017859f, 0.039461f, -0.042863f, 0.045559f, 0.004743f, -0.002978f, 0.093640f, -0.019787f, -0.011025f, 0.069949f, -0.045698f, 0.061711f, 0.026369f, -0.015454f, 0.024334f, 0.025600f, 0.057657f, 0.059827f, 0.017045f, -0.049815f, 0.102282f, + -0.103836f, 0.002949f, 0.093158f, -0.051043f, 0.020082f, -0.011660f, -0.012873f, -0.109250f, 0.073123f, 0.019023f, 0.032057f, 0.034126f, -0.023319f, -0.054627f, -0.041435f, -0.033479f, 0.004409f, 0.102830f, -0.000050f, 0.080555f, -0.027717f, -0.062850f, 0.002666f, 0.022831f, -0.052000f, 0.082693f, 0.033048f, 0.040404f, 0.081342f, 0.052726f, -0.088671f, 0.033073f, -0.126850f, -0.156159f, 0.002449f, 0.130692f, 0.081411f, 0.010180f, -0.093595f, -0.331777f, -0.061764f, 0.102047f, 0.116234f, 0.165526f, -0.009290f, -0.210834f, -0.119566f, -0.110016f, 0.167369f, 0.128215f, -0.024104f, -0.084469f, -0.050098f, -0.102632f, -0.013957f, 0.131384f, -0.013698f, 0.030465f, 0.021079f, -0.021950f, -0.048660f, 0.071466f, -0.030081f, 0.039731f, 0.028415f, -0.003042f, -0.067644f, 0.091129f, -0.037033f, -0.017563f, 0.025489f, 0.023438f, -0.050488f, 0.000549f, -0.016520f, -0.018937f, 0.005284f, -0.002032f, 0.035582f, -0.065633f, 0.033610f, -0.078929f, -0.013497f, -0.013335f, 0.092501f, 0.002589f, 0.024309f, -0.057292f, 0.028764f, -0.021638f, 0.040241f, 0.049317f, -0.025049f, -0.056934f, 0.019328f, 0.014607f, + 0.046725f, 0.039417f, -0.010629f, -0.015546f, -0.008046f, 0.032408f, 0.005087f, 0.032660f, 0.013574f, -0.081110f, 0.068363f, -0.050960f, -0.008691f, -0.032964f, 0.031863f, -0.037050f, -0.001421f, -0.003812f, -0.009912f, 0.007711f, 0.035111f, -0.036824f, 0.016420f, 0.002969f, -0.008356f, 0.000580f, 0.024833f, -0.031138f, -0.008331f, -0.004522f, 0.051380f, -0.051775f, 0.013960f, -0.022675f, 0.034132f, -0.037804f, -0.010530f, 0.012992f, -0.007088f, 0.007194f, -0.024228f, -0.004324f, 0.022385f, -0.006725f, 0.008810f, 0.007012f, 0.004898f, 0.027669f, -0.025374f, 0.017348f, 0.020246f, 0.024686f, -0.003183f, -0.057374f, 0.007640f, 0.006778f, 0.023656f, 0.021292f, -0.003871f, 0.005674f, -0.009351f, -0.026123f, -0.004124f, 0.011895f, -0.004594f, 0.034766f, -0.028029f, -0.009456f, -0.056247f, 0.016820f, 0.006454f, -0.009007f, 0.012987f, 0.010950f, -0.000465f, -0.029322f, 0.009464f, 0.028450f, -0.005198f, -0.004276f, 0.011592f, -0.011644f, 0.021700f, -0.013283f, 0.004002f, -0.026966f, 0.013084f, 0.004930f, -0.003873f, -0.007494f, 0.015939f, -0.007594f, -0.010863f, -0.016347f, 0.017319f, -0.000856f, + -0.008067f, -0.003800f, 0.017253f, -0.006843f, 0.007872f, -0.009521f, -0.005180f, -0.001080f, 0.001052f, -0.000385f, -0.008801f, 0.000796f, 0.000751f, -0.008023f, 0.008441f, -0.007634f, 0.022470f, 0.003247f, 0.003438f, -0.030700f, 0.009097f, -0.000873f, -0.011635f, 0.013522f, 0.026331f, -0.018989f, -0.003675f, -0.001006f, -0.012909f, 0.020152f, -0.002838f, 0.002607f, -0.012914f, 0.006730f, -0.002294f, 0.002173f, -0.008010f, 0.007850f, -0.007987f, -0.046315f, 0.112296f, 0.030612f, 0.027750f, -0.014850f, -0.035945f, -0.034586f, 0.009824f, 0.021803f, 0.003446f, -0.001281f, -0.000114f, -0.016405f, -0.002978f, 0.007885f, -0.004341f, 0.003395f, -0.001748f, -0.016435f, -0.000847f, 0.008139f, 0.012836f, -0.011440f, 0.003160f, 0.008216f, -0.016368f, 0.026879f, -0.016310f, -0.014244f, -0.014136f, 0.003671f, 0.007874f, 0.012469f, -0.013598f, 0.017397f, -0.025056f, 0.016609f, 0.014833f, -0.011045f, -0.001123f, -0.000805f, -0.002864f, 0.012942f, -0.013924f, 0.004058f, -0.004437f, -0.018048f, 0.025582f, -0.014291f, -0.000461f, -0.010591f, -0.003285f, 0.017808f, -0.023237f, 0.009457f, 0.006475f, -0.010174f, + 0.008573f, -0.019861f, 0.005786f, 0.008242f, -0.014716f, 0.000339f, 0.007951f, -0.013654f, 0.013722f, -0.018843f, 0.005256f, 0.019274f, -0.028207f, 0.008107f, -0.010758f, 0.001929f, 0.011126f, -0.008453f, -0.004287f, 0.001975f, 0.002451f, -0.001709f, 0.007964f, -0.006053f, -0.005169f, 0.003848f, -0.004618f, 0.002515f, -0.001758f, 0.003313f, 0.003164f, -0.004583f, 0.002320f, -0.000888f, 0.004137f, -0.003787f, -0.001026f, 0.002744f, 0.000122f, -0.002200f, -0.006532f, 0.004132f, 0.004385f, -0.001006f, -0.004507f, 0.004305f, -0.000193f, -0.002063f, 0.004488f, -0.009374f, -0.001871f, 0.005262f, -0.006714f, 0.009781f, -0.005985f, 0.000434f, 0.016299f, -0.004759f, 0.011749f, -0.006691f, -0.000624f, 0.012912f, -0.009044f, -0.003445f, 0.016848f, -0.086763f, -0.203585f, 0.057642f, 0.199321f, 0.137083f, 0.216741f, -0.120648f, -0.128423f, -0.175122f, -0.202719f, 0.004368f, 0.156435f, 0.161620f, 0.168737f, 0.033138f, -0.055740f, -0.110621f, -0.158778f, -0.134574f, 0.010499f, 0.104567f, 0.124031f, 0.111601f, 0.026714f, -0.030820f, -0.019244f, -0.087116f, -0.097442f, -0.041099f, -0.002642f, 0.037502f, + 0.082192f, 0.040157f, 0.029821f, 0.041176f, -0.020542f, -0.048864f, -0.007992f, -0.078129f, -0.036647f, 0.000874f, 0.012414f, 0.059569f, 0.069356f, 0.006167f, -0.010498f, -0.006502f, -0.051166f, -0.013853f, -0.000710f, -0.010636f, 0.017723f, 0.034278f, -0.007301f, -0.002707f, -0.013444f, -0.021386f, 0.004394f, 0.002124f, -0.002331f, 0.038675f, 0.026180f, 0.009680f, -0.000981f, -0.036456f, -0.052718f, -0.041685f, 0.003014f, 0.039246f, 0.033690f, 0.044215f, 0.006017f, 0.001156f, 0.010058f, -0.054861f, -0.031226f, -0.025795f, -0.004688f, 0.042105f, 0.009524f, 0.014129f, 0.039280f, -0.022664f, -0.032974f, -0.007673f, -0.005627f, 0.012180f, 0.014163f, 0.004432f, 0.007909f, 0.003465f, -0.020240f, -0.020974f, -0.005112f, -0.000004f, 0.015089f, 0.021832f, 0.007168f, -0.003082f, -0.004735f, -0.006210f, 0.005475f, -0.006124f, -0.025737f, -0.004039f, 0.006076f, 0.011932f, 0.025640f, 0.006245f, -0.005308f, -0.012316f, -0.021070f, -0.004609f, 0.002133f, 0.006873f, 0.012066f, 0.015065f, 0.011874f, -0.006080f, -0.018255f, -0.019249f, -0.016790f, -0.001924f, 0.008370f, 0.009260f, 0.024772f, 0.025426f, + 0.012403f, -0.005488f, -0.031250f, -0.033061f, -0.015317f, -0.011587f, 0.011690f, 0.030864f, 0.022879f, 0.009890f, 0.000135f, -0.002457f, -0.004019f, -0.009442f, -0.015520f, -0.014931f, -0.006369f, 0.002190f, 0.006470f, 0.010351f, 0.015042f, 0.014342f, 0.005500f, -0.005569f, -0.012064f, -0.013063f, -0.009696f, -0.003674f, 0.001990f, 0.004618f, 0.004563f, 0.005541f, 0.006380f, 0.004904f, 0.000138f, -0.003747f, -0.006477f, -0.005286f, -0.001929f, 0.001114f, 0.002570f, 0.000444f, -0.000286f, 0.000454f, 0.000666f, 0.001907f, 0.002026f, -0.000068f, -0.002136f, -0.000890f, 0.001664f, 0.000426f, -0.001911f, -0.001569f, -0.000259f, -0.001295f, -0.002131f, -0.000341f, 0.003857f, 0.005222f, 0.001622f, -0.001284f, -0.001952f, -0.001390f, -0.000883f, -0.001504f, -0.002097f, -0.000826f, 0.001474f, 0.002369f, 0.001335f, 0.001086f, 0.001304f, 0.000246f, -0.000836f, -0.001765f, -0.001801f, -0.001266f, -0.000422f, 0.000868f, 0.001458f, 0.001067f, 0.000868f, 0.000435f, -0.000235f, -0.000882f, -0.001221f, -0.000930f, 0.000030f, 0.000634f, 0.000707f, 0.000523f, 0.000157f, -0.000332f, -0.000734f, -0.000520f, + 0.000079f, 0.000364f, 0.000390f, 0.000377f, 0.000165f, -0.000192f, -0.000340f, -0.000213f, -0.000100f, -0.000026f, 0.000056f, 0.000077f, 0.000054f, 0.000025f, -0.000010f, -0.000039f}, + {-0.008210f, -0.005458f, 0.002284f, -0.002113f, -0.002598f, -0.004007f, 0.000965f, 0.007921f, -0.002555f, 0.000017f, 0.000804f, 0.013573f, -0.000274f, 0.002586f, -0.005594f, -0.003900f, -0.001393f, -0.003675f, -0.003934f, -0.003707f, -0.002510f, -0.003524f, -0.004632f, 0.003875f, 0.006456f, -0.003568f, 0.000982f, 0.000243f, -0.007330f, 0.000187f, -0.000163f, -0.005223f, 0.009814f, -0.005037f, 0.005581f, 0.002105f, -0.001504f, -0.005655f, -0.005201f, 0.005024f, -0.002624f, -0.001927f, -0.007750f, -0.002002f, -0.000716f, -0.003685f, 0.010354f, -0.002289f, -0.000646f, 0.004297f, -0.000750f, -0.008655f, -0.004426f, -0.007635f, -0.005101f, 0.011768f, -0.003309f, 0.013090f, -0.000047f, -0.000578f, -0.002372f, 0.001493f, 0.000560f, -0.007840f, -0.008309f, 0.006020f, 0.000700f, 0.004080f, -0.000547f, 0.004757f, 0.002955f, -0.007603f, -0.000038f, 0.002476f, 0.004091f, -0.000055f, 0.003456f, 0.006225f, -0.008343f, 0.002160f, 0.002164f, -0.004230f, 0.000015f, 0.001853f, 0.006015f, 0.003901f, -0.004163f, -0.001316f, -0.000209f, 0.001352f, 0.001927f, 0.001398f, 0.001590f, -0.001154f, 0.000838f, -0.002332f, + -0.001435f, -0.000093f, 0.003078f, 0.001283f, -0.000066f, -0.000282f, -0.002045f, 0.001151f, -0.000132f, -0.000774f, -0.000149f, 0.001015f, 0.000487f, 0.000708f, 0.001999f, -0.000727f, 0.000897f, 0.002294f, 0.017836f, -0.001499f, -0.002267f, -0.004694f, -0.009907f, -0.012198f, -0.011170f, 0.001135f, 0.009765f, 0.003355f, 0.013070f, 0.004428f, -0.006079f, 0.001494f, -0.015780f, -0.013378f, 0.006068f, -0.004764f, 0.008590f, -0.000913f, -0.007070f, -0.003570f, 0.017159f, 0.003755f, 0.007195f, -0.000432f, 0.005485f, -0.002675f, -0.002225f, 0.003318f, -0.002483f, -0.007640f, -0.000660f, 0.002660f, -0.000983f, -0.000553f, 0.010876f, 0.006693f, -0.011909f, 0.000170f, -0.007593f, 0.012340f, 0.007251f, 0.000420f, -0.004524f, -0.004644f, 0.005620f, 0.003093f, 0.009178f, -0.008721f, 0.014631f, 0.017980f, -0.005086f, 0.017515f, -0.000130f, 0.009132f, 0.005633f, -0.003358f, 0.002948f, 0.014019f, -0.001757f, -0.009629f, 0.008054f, 0.002533f, -0.000211f, -0.001196f, -0.001783f, 0.000504f, 0.008134f, -0.005395f, 0.002887f, 0.002109f, 0.004256f, -0.006932f, 0.007661f, 0.001698f, -0.000793f, 0.002356f, + 0.001023f, 0.000653f, -0.000438f, 0.001654f, 0.004457f, -0.003323f, 0.001732f, 0.001109f, 0.001811f, -0.003043f, 0.000098f, -0.004821f, 0.000709f, 0.002112f, -0.002839f, -0.001848f, 0.000514f, 0.001197f, 0.001421f, 0.000321f, 0.001284f, -0.000110f, -0.000091f, 0.002765f, -0.000388f, 0.000613f, -0.015497f, -0.012108f, 0.003863f, -0.006837f, 0.004952f, -0.008555f, -0.012169f, -0.011246f, 0.001618f, -0.008390f, 0.007764f, 0.005701f, -0.010791f, -0.002188f, 0.004458f, 0.001078f, 0.005473f, -0.003152f, 0.005662f, 0.006958f, -0.009570f, 0.003121f, 0.003218f, -0.007684f, 0.004593f, 0.000837f, -0.009062f, 0.006809f, 0.006581f, -0.003200f, 0.007187f, 0.001065f, 0.005877f, 0.005311f, 0.002260f, -0.003388f, -0.000794f, -0.010890f, -0.003236f, -0.005394f, 0.005815f, 0.006099f, 0.002452f, -0.017473f, 0.003407f, 0.007416f, -0.003895f, 0.012349f, -0.010003f, -0.013320f, 0.001083f, -0.003928f, 0.004338f, -0.009502f, 0.017457f, -0.000882f, -0.005751f, 0.001735f, 0.000286f, 0.009932f, -0.000495f, -0.005747f, -0.000314f, -0.003894f, -0.005273f, -0.006740f, 0.003254f, -0.012206f, 0.001328f, 0.000471f, + 0.003665f, 0.008195f, 0.002763f, 0.005837f, 0.009083f, -0.006142f, -0.001013f, 0.002031f, -0.007633f, 0.005283f, -0.002552f, 0.004504f, 0.003656f, -0.002375f, -0.001746f, 0.006619f, -0.002067f, -0.006014f, 0.000931f, -0.000632f, -0.000148f, -0.003245f, 0.004889f, -0.003707f, 0.001908f, 0.001804f, 0.002532f, -0.000958f, -0.000922f, 0.000291f, -0.001769f, 0.000720f, -0.001186f, 0.000111f, -0.000705f, -0.001823f, 0.002439f, -0.000934f, 0.000599f, -0.000336f, 0.000232f, 0.000019f, 0.000509f, -0.003111f, -0.037147f, -0.000533f, -0.004469f, 0.026302f, 0.000649f, 0.001660f, 0.005668f, -0.003580f, 0.013282f, 0.003335f, -0.014055f, -0.007521f, -0.016503f, 0.003018f, -0.001096f, -0.005615f, -0.004732f, -0.005997f, -0.003808f, 0.020480f, -0.009328f, -0.004563f, -0.005258f, -0.015475f, -0.000608f, -0.003745f, 0.005363f, 0.007790f, -0.002472f, -0.000031f, 0.004596f, -0.004694f, -0.001250f, -0.001956f, -0.005582f, 0.006308f, 0.012621f, -0.001433f, -0.002033f, 0.010013f, -0.013107f, 0.008616f, -0.010456f, -0.021111f, -0.013380f, -0.021025f, -0.003167f, -0.011956f, -0.008036f, 0.002297f, 0.008467f, 0.004349f, + 0.006066f, -0.003034f, 0.007348f, -0.008884f, -0.001972f, 0.007731f, 0.000022f, 0.010705f, -0.004379f, 0.003360f, -0.007391f, -0.005537f, 0.005578f, -0.012804f, 0.003514f, 0.009777f, -0.012510f, 0.001411f, -0.003269f, -0.005717f, -0.008185f, -0.007315f, -0.002405f, -0.003142f, 0.002053f, 0.009168f, -0.004300f, 0.002976f, -0.007501f, -0.007944f, -0.006284f, 0.003235f, 0.004381f, 0.001304f, -0.001923f, -0.002190f, -0.003322f, 0.002047f, -0.002806f, -0.002366f, -0.001091f, -0.002181f, -0.000226f, 0.000636f, -0.004032f, -0.000770f, -0.000418f, -0.002921f, -0.000733f, -0.001197f, 0.000088f, -0.000335f, -0.005537f, 0.000894f, 0.002435f, -0.000857f, -0.002136f, -0.000016f, 0.003555f, 0.002015f, -0.001289f, -0.003732f, 0.002212f, -0.000269f, -0.001225f, 0.023859f, 0.000177f, -0.013286f, -0.012763f, -0.004369f, -0.009302f, -0.003583f, -0.006988f, 0.001833f, 0.001179f, -0.010510f, -0.006162f, -0.011546f, 0.021929f, 0.009294f, 0.002051f, -0.001237f, 0.011908f, -0.017722f, -0.000246f, -0.000374f, -0.011166f, -0.014915f, 0.013387f, 0.000270f, 0.009563f, -0.014964f, -0.006507f, -0.005216f, 0.005239f, -0.000537f, + 0.006433f, -0.010326f, 0.003161f, 0.004220f, -0.011128f, -0.010754f, -0.009677f, 0.002319f, -0.003158f, -0.003015f, 0.009483f, -0.002774f, 0.001091f, 0.000166f, -0.001817f, -0.010676f, -0.006456f, -0.001236f, -0.015982f, -0.010483f, -0.008396f, 0.004454f, 0.003120f, 0.006401f, -0.001532f, 0.002796f, -0.000128f, -0.001649f, 0.007513f, -0.005800f, 0.013049f, 0.001814f, 0.003989f, -0.001722f, -0.004236f, 0.005162f, 0.004076f, 0.010254f, -0.003042f, 0.001596f, 0.006325f, -0.003716f, 0.000185f, -0.013572f, 0.006447f, -0.010452f, 0.006674f, -0.007730f, -0.007446f, -0.014637f, -0.002791f, 0.003691f, 0.001666f, -0.002481f, 0.003472f, 0.001462f, 0.006748f, 0.001073f, -0.001964f, 0.005833f, 0.003265f, -0.005227f, 0.001344f, -0.004255f, 0.004668f, -0.001880f, 0.000849f, -0.001184f, -0.000458f, -0.003760f, -0.000066f, 0.000184f, 0.000780f, -0.002219f, 0.001820f, -0.003169f, 0.001311f, -0.000605f, -0.001491f, -0.002817f, 0.000800f, -0.001906f, 0.004020f, 0.001072f, -0.000974f, -0.001774f, -0.001515f, 0.003019f, 0.002124f, 0.002882f, 0.000376f, 0.000273f, 0.001606f, -0.003353f, 0.028271f, 0.026769f, + 0.020010f, -0.006614f, 0.007403f, 0.010184f, 0.006023f, 0.005798f, -0.009781f, -0.008522f, -0.012839f, 0.011643f, -0.012041f, -0.001384f, -0.008732f, 0.015410f, -0.016869f, -0.012564f, -0.006222f, -0.002633f, -0.009247f, -0.013947f, 0.004107f, 0.000842f, 0.000918f, -0.016934f, -0.009295f, 0.004551f, 0.003662f, 0.004937f, -0.004530f, -0.006670f, 0.000624f, 0.005222f, 0.006632f, -0.004699f, 0.006310f, -0.008948f, -0.002319f, -0.022043f, 0.008195f, 0.002759f, -0.003735f, -0.004104f, -0.016252f, -0.007370f, 0.002129f, -0.003871f, -0.022859f, 0.012462f, 0.005174f, 0.000058f, -0.006128f, -0.004730f, -0.009640f, 0.003046f, -0.003385f, 0.006686f, -0.001388f, -0.003219f, -0.012987f, -0.002449f, -0.001259f, -0.007114f, 0.014366f, -0.010317f, 0.000237f, 0.008569f, -0.003532f, -0.011165f, -0.006277f, 0.009725f, 0.014033f, 0.006983f, -0.001038f, -0.000354f, 0.007437f, -0.015034f, 0.006177f, -0.001540f, -0.000709f, 0.000758f, 0.003276f, -0.000812f, -0.000608f, 0.000812f, -0.002934f, -0.009060f, -0.002445f, -0.002734f, 0.002793f, 0.001995f, 0.001067f, -0.003480f, -0.001843f, -0.004028f, -0.005016f, -0.001204f, + -0.000184f, 0.006064f, 0.000576f, 0.000867f, 0.000748f, -0.002051f, -0.001217f, 0.002815f, -0.003160f, -0.000447f, 0.001084f, 0.001778f, -0.003777f, 0.000091f, -0.000339f, 0.002264f, -0.002718f, -0.000604f, -0.001606f, -0.002592f, -0.005809f, -0.002623f, -0.000292f, -0.002483f, -0.000007f, 0.000340f, -0.000294f, -0.003163f, -0.001282f, 0.034059f, 0.011418f, -0.004992f, -0.003983f, 0.011949f, -0.023027f, -0.004349f, 0.018635f, 0.009331f, -0.013000f, -0.000305f, -0.008822f, 0.003583f, 0.014333f, 0.035194f, 0.011621f, 0.027407f, -0.009719f, -0.002057f, -0.026687f, 0.009038f, -0.007786f, 0.007493f, -0.011688f, -0.000635f, 0.001129f, -0.004181f, 0.009582f, -0.004313f, 0.004578f, 0.011770f, -0.009030f, 0.005299f, 0.015064f, -0.004127f, 0.005043f, -0.000005f, 0.006060f, 0.008225f, 0.008484f, -0.045297f, 0.016563f, -0.005257f, -0.021193f, -0.003730f, 0.012957f, 0.003936f, -0.016368f, 0.008811f, 0.012922f, -0.026690f, 0.002154f, -0.007554f, 0.015702f, 0.003555f, 0.012975f, -0.003196f, -0.009314f, -0.018754f, 0.001166f, -0.011356f, 0.035368f, 0.006501f, -0.005787f, 0.011750f, 0.001507f, 0.011368f, + -0.027790f, -0.003696f, 0.004319f, 0.008586f, 0.002075f, -0.013048f, -0.002022f, 0.004718f, 0.012408f, 0.010408f, -0.008600f, 0.000194f, 0.012212f, -0.000570f, 0.005771f, -0.004286f, -0.002056f, 0.008497f, 0.000872f, -0.000710f, -0.001122f, 0.000384f, 0.004233f, -0.004079f, -0.001736f, -0.000563f, 0.003306f, 0.003105f, -0.000359f, -0.001176f, 0.008479f, -0.002735f, -0.001382f, -0.004497f, 0.000652f, 0.002227f, -0.002142f, 0.000096f, 0.002664f, 0.003376f, -0.002927f, -0.001434f, -0.004908f, 0.000306f, 0.004031f, -0.001959f, 0.000823f, 0.001755f, 0.002140f, 0.006717f, 0.000969f, 0.003252f, -0.000105f, -0.003023f, 0.004539f, 0.001010f, -0.040435f, -0.044348f, -0.015184f, -0.003462f, 0.000815f, 0.009421f, -0.018938f, 0.005974f, 0.022330f, -0.012813f, 0.011888f, 0.015455f, -0.010767f, 0.000329f, -0.005242f, 0.018901f, 0.026375f, -0.012637f, -0.014881f, 0.013256f, 0.001283f, -0.012666f, 0.006004f, 0.000206f, 0.003316f, 0.003765f, -0.006758f, -0.004938f, -0.028166f, -0.001456f, -0.008045f, -0.000656f, -0.000819f, 0.019150f, 0.005705f, -0.034399f, 0.000596f, 0.016574f, -0.018788f, 0.004943f, + 0.020252f, -0.004461f, 0.007145f, 0.000398f, -0.005281f, -0.013082f, 0.026034f, 0.021872f, -0.016614f, 0.008700f, -0.006159f, -0.000879f, 0.008127f, -0.005792f, 0.006824f, -0.010316f, -0.001137f, 0.021952f, -0.006203f, 0.004629f, 0.010417f, -0.007524f, -0.018016f, -0.000795f, 0.006246f, 0.003186f, -0.008632f, 0.001123f, 0.004916f, 0.007789f, 0.016117f, 0.009917f, 0.017732f, 0.009317f, 0.003472f, 0.008194f, -0.002846f, 0.015916f, -0.000463f, -0.012631f, -0.016903f, 0.002051f, 0.005571f, -0.003005f, 0.012749f, -0.006592f, -0.006783f, 0.005003f, -0.001529f, 0.001318f, 0.000716f, -0.007887f, -0.001023f, -0.004771f, 0.005843f, 0.002540f, 0.004715f, 0.009003f, 0.001209f, -0.003257f, -0.013049f, -0.001065f, 0.003132f, -0.003412f, -0.001270f, 0.001267f, -0.002834f, 0.002744f, 0.003010f, 0.000310f, -0.003002f, -0.002271f, 0.006524f, -0.000976f, 0.003116f, 0.001528f, 0.002182f, -0.004678f, -0.004778f, -0.002953f, 0.001227f, 0.002139f, 0.003957f, 0.002779f, 0.001996f, 0.001717f, 0.004951f, -0.001346f, -0.004643f, -0.043958f, 0.048180f, -0.003225f, 0.030854f, 0.001982f, -0.018539f, -0.005836f, + -0.010905f, -0.013132f, -0.002058f, 0.000469f, 0.022211f, -0.003976f, 0.015139f, -0.016025f, -0.001219f, 0.003466f, 0.003197f, 0.001390f, 0.019258f, 0.019205f, 0.006779f, 0.002742f, -0.002855f, -0.004193f, -0.001501f, -0.003635f, -0.033101f, -0.011525f, 0.014710f, 0.009381f, -0.004018f, 0.001305f, -0.015859f, 0.007487f, -0.019362f, 0.003805f, 0.029816f, 0.002935f, 0.006189f, -0.025444f, 0.013044f, 0.011356f, 0.002862f, -0.017179f, -0.007727f, -0.008186f, 0.001022f, -0.015451f, 0.015095f, 0.018549f, 0.011041f, -0.001996f, 0.027940f, 0.009713f, 0.041058f, 0.015868f, -0.011424f, 0.034188f, 0.000433f, -0.012889f, 0.024631f, -0.004372f, 0.007903f, 0.015441f, -0.011706f, -0.010026f, 0.022761f, 0.024540f, 0.014332f, -0.020438f, 0.007316f, -0.000484f, -0.009645f, -0.016835f, 0.011943f, 0.021693f, 0.012948f, 0.031629f, 0.004069f, -0.007313f, -0.007443f, -0.019944f, -0.007785f, 0.011911f, 0.001577f, -0.003876f, 0.000460f, -0.012540f, -0.008912f, 0.001451f, 0.002829f, -0.000678f, 0.012890f, 0.010168f, 0.004320f, 0.000161f, 0.003559f, 0.006000f, 0.002921f, -0.006377f, -0.002781f, 0.001540f, + -0.001708f, -0.002359f, 0.005260f, 0.000249f, -0.001867f, 0.004222f, 0.001411f, 0.001183f, 0.001461f, -0.004290f, 0.000736f, 0.011307f, -0.005526f, 0.007039f, 0.003107f, 0.000062f, -0.005488f, -0.006020f, -0.003243f, 0.002208f, 0.010726f, -0.023375f, 0.031113f, -0.008975f, -0.020417f, 0.006846f, 0.013542f, -0.013555f, -0.006854f, -0.028632f, 0.012013f, -0.010500f, -0.003434f, -0.026251f, -0.011516f, -0.008908f, -0.004467f, -0.011844f, 0.006219f, -0.005323f, -0.006440f, 0.006162f, 0.008703f, 0.015270f, 0.015012f, -0.006500f, -0.005383f, -0.021176f, 0.008371f, 0.000379f, 0.013962f, 0.003794f, 0.003770f, -0.004829f, 0.005613f, -0.013262f, -0.011159f, 0.006181f, 0.003216f, 0.006272f, -0.025760f, 0.008586f, 0.016924f, -0.000112f, -0.022681f, -0.023790f, -0.018448f, -0.054785f, 0.007782f, -0.006372f, 0.026532f, -0.013036f, 0.022052f, 0.006987f, 0.001546f, 0.028292f, 0.004369f, -0.003360f, 0.020437f, 0.007463f, -0.027759f, -0.013912f, 0.003370f, -0.008963f, -0.015736f, -0.009697f, 0.035894f, 0.016387f, -0.016825f, -0.002156f, -0.009429f, -0.004745f, 0.005290f, 0.025202f, 0.000511f, -0.006916f, + 0.033546f, -0.012128f, -0.030375f, -0.029160f, -0.034381f, -0.006251f, 0.002690f, -0.001040f, -0.006003f, -0.004357f, -0.014667f, -0.003045f, 0.004368f, -0.004723f, -0.004299f, 0.002748f, 0.002880f, -0.021818f, -0.008839f, -0.017128f, 0.000874f, -0.005924f, -0.005428f, -0.009261f, -0.002774f, 0.002238f, 0.013218f, -0.000060f, 0.016196f, 0.007733f, 0.011916f, 0.001048f, 0.005652f, -0.005747f, 0.010875f, -0.000291f, -0.007693f, -0.011833f, 0.006765f, 0.000820f, 0.003782f, -0.003283f, 0.002210f, -0.003913f, 0.003821f, -0.001582f, 0.004514f, -0.001205f, -0.001809f, 0.002572f, -0.000516f, 0.013551f, -0.022514f, -0.005683f, -0.006052f, -0.002979f, -0.001589f, 0.059709f, 0.009759f, 0.021808f, -0.010622f, 0.019040f, 0.038475f, -0.033032f, 0.049991f, 0.029610f, -0.013400f, 0.000410f, 0.003013f, -0.018023f, -0.030183f, 0.002035f, -0.017508f, -0.026956f, -0.012084f, 0.002349f, 0.000025f, -0.003352f, -0.012118f, -0.002069f, -0.011799f, -0.000867f, -0.013637f, -0.001041f, 0.009315f, -0.021200f, 0.011604f, 0.017763f, -0.013883f, -0.012940f, 0.009179f, 0.006896f, -0.001222f, 0.053590f, 0.004720f, 0.035705f, + -0.025720f, -0.002550f, -0.031182f, -0.022941f, 0.005502f, -0.023011f, -0.031520f, -0.021074f, -0.023942f, -0.005284f, -0.006381f, -0.026645f, -0.028892f, 0.037628f, 0.005914f, 0.002301f, -0.005113f, 0.019456f, 0.010838f, 0.023481f, -0.002338f, 0.022188f, -0.012450f, 0.004995f, -0.041655f, 0.033952f, 0.016456f, 0.002591f, -0.022876f, -0.001811f, 0.010333f, 0.002080f, 0.003984f, 0.016721f, 0.023455f, -0.018260f, -0.023348f, -0.015470f, -0.003650f, -0.000490f, 0.002561f, -0.013823f, 0.001572f, 0.003823f, 0.009670f, 0.012451f, -0.001582f, -0.007879f, 0.013099f, 0.006348f, -0.009765f, -0.000796f, 0.004738f, -0.005968f, -0.010319f, 0.001735f, -0.003495f, -0.003538f, -0.000307f, -0.004669f, 0.012011f, -0.012807f, 0.006975f, -0.000510f, 0.013285f, -0.014020f, -0.003357f, 0.002172f, -0.003511f, -0.005448f, -0.002221f, -0.011162f, -0.012077f, -0.002461f, 0.001276f, 0.003387f, 0.004392f, -0.008389f, 0.008325f, 0.006099f, -0.004939f, 0.007237f, -0.001459f, 0.004068f, 0.000370f, 0.004019f, -0.003355f, -0.002845f, 0.001144f, 0.001989f, 0.004878f, -0.000825f, 0.006692f, -0.003297f, -0.002312f, 0.000001f, + -0.002424f, 0.004223f, 0.004296f, 0.029205f, -0.011777f, -0.009585f, 0.032594f, -0.027251f, -0.020754f, -0.005013f, -0.016487f, -0.002554f, -0.032463f, 0.007399f, -0.019949f, 0.015482f, 0.002272f, 0.005340f, 0.018719f, 0.005443f, 0.013242f, 0.018144f, 0.017241f, 0.014243f, 0.024118f, 0.002940f, 0.016428f, 0.014721f, -0.017420f, 0.030411f, 0.007532f, 0.014104f, -0.016255f, 0.023750f, 0.010773f, 0.016702f, 0.004315f, 0.006011f, -0.002965f, -0.021748f, 0.005663f, 0.012424f, 0.014662f, 0.015978f, 0.003527f, -0.026466f, -0.016678f, 0.019174f, 0.010499f, 0.004423f, -0.009980f, 0.013297f, -0.009541f, -0.026527f, 0.039176f, 0.023934f, 0.017554f, -0.014955f, -0.007284f, -0.019741f, -0.061648f, -0.001791f, -0.008506f, 0.008054f, -0.014310f, -0.015428f, -0.027118f, 0.004897f, 0.008857f, 0.034649f, -0.027139f, 0.011141f, 0.000634f, 0.016000f, -0.023875f, -0.029374f, -0.017813f, 0.019124f, 0.005943f, 0.006048f, 0.010258f, -0.007991f, 0.003519f, 0.022408f, 0.008087f, 0.011400f, 0.014395f, -0.005583f, -0.005029f, -0.009245f, 0.000395f, 0.009861f, 0.012252f, 0.000567f, 0.005183f, 0.002557f, + 0.002140f, 0.009284f, -0.005482f, -0.004744f, -0.007803f, -0.004365f, -0.008077f, -0.000123f, -0.012365f, -0.004934f, -0.013077f, -0.000603f, -0.007778f, -0.002152f, -0.001603f, -0.004458f, 0.004058f, -0.003168f, -0.016828f, -0.002397f, 0.007088f, 0.007629f, 0.014331f, -0.001936f, -0.008091f, 0.004162f, -0.003019f, -0.012260f, 0.011753f, 0.009873f, 0.009619f, 0.021928f, 0.014559f, -0.001013f, 0.001087f, -0.004687f, 0.006095f, 0.001953f, -0.050462f, 0.028102f, 0.029947f, -0.015728f, 0.025458f, 0.008390f, -0.042639f, -0.007998f, 0.054766f, -0.008427f, -0.037339f, -0.006309f, -0.004078f, -0.032527f, 0.021847f, 0.004095f, -0.016658f, 0.023571f, 0.015477f, 0.056490f, 0.032906f, 0.000335f, 0.003672f, 0.053263f, -0.014325f, 0.013070f, -0.022505f, -0.032192f, -0.009953f, -0.022046f, 0.004330f, -0.002118f, 0.010336f, -0.002192f, -0.004368f, -0.009651f, 0.041914f, 0.001511f, -0.033930f, -0.027066f, -0.006540f, -0.007423f, -0.001692f, 0.013308f, 0.038219f, 0.024203f, 0.007688f, -0.024035f, 0.029624f, 0.054498f, -0.012129f, 0.024463f, 0.022910f, 0.065781f, 0.012132f, 0.012113f, 0.019576f, 0.027735f, + 0.015197f, -0.023294f, -0.022364f, 0.014735f, -0.041132f, -0.025016f, -0.029609f, 0.027112f, 0.023716f, 0.016374f, -0.007069f, 0.019851f, 0.042098f, -0.024796f, 0.033443f, 0.033236f, -0.004993f, 0.032663f, -0.031644f, -0.014288f, -0.011326f, 0.069000f, -0.034378f, 0.033653f, 0.020933f, 0.012078f, 0.009284f, -0.031275f, -0.003475f, -0.024701f, 0.025559f, 0.024186f, -0.000808f, 0.001329f, -0.012832f, 0.017961f, -0.007636f, 0.001359f, 0.006552f, 0.007081f, -0.000454f, 0.010777f, -0.008161f, -0.004657f, -0.003484f, -0.008209f, 0.003126f, 0.006319f, -0.006118f, 0.002633f, 0.007620f, 0.013624f, 0.001794f, -0.013462f, 0.005143f, -0.014553f, 0.002163f, 0.012232f, 0.007929f, 0.012966f, -0.002676f, 0.021195f, -0.008926f, 0.015524f, -0.004531f, -0.005661f, -0.003180f, 0.000425f, 0.017147f, -0.013178f, 0.008071f, -0.000853f, 0.008188f, -0.010824f, 0.002416f, 0.003727f, -0.005024f, 0.022475f, -0.012879f, 0.009725f, 0.010618f, 0.037657f, 0.067523f, 0.006850f, -0.007442f, 0.006749f, -0.004047f, -0.011637f, 0.001630f, 0.006642f, -0.016971f, -0.022567f, 0.007134f, -0.011943f, -0.006625f, 0.016844f, + -0.001214f, 0.033536f, -0.018237f, 0.032865f, 0.016049f, 0.002804f, -0.019679f, 0.005817f, 0.032939f, 0.009146f, -0.017198f, 0.006089f, -0.004315f, 0.000452f, 0.019245f, -0.027549f, -0.014591f, 0.029707f, 0.000373f, -0.007957f, 0.025964f, -0.001795f, 0.009030f, 0.005458f, -0.025340f, -0.046257f, -0.009920f, 0.015362f, 0.029101f, 0.005828f, -0.022716f, 0.028768f, -0.009798f, 0.058886f, -0.030273f, 0.039450f, -0.023542f, 0.013779f, 0.034111f, -0.051188f, -0.052524f, -0.000886f, -0.014975f, 0.012996f, 0.016552f, 0.001871f, -0.007845f, -0.031515f, 0.020755f, -0.005030f, 0.037055f, 0.016258f, 0.034504f, 0.008898f, 0.020046f, -0.008996f, 0.026482f, 0.009047f, -0.015991f, 0.002675f, -0.000538f, -0.077150f, -0.002345f, 0.012911f, 0.018460f, 0.031820f, 0.027403f, -0.009527f, 0.002254f, -0.006274f, 0.005087f, -0.000610f, -0.008560f, -0.020902f, 0.008786f, -0.012453f, 0.026533f, 0.002520f, 0.005163f, 0.012433f, 0.007715f, -0.008980f, 0.007662f, 0.018620f, 0.016885f, -0.006385f, -0.003042f, 0.002119f, -0.004056f, -0.003434f, -0.011972f, -0.002835f, -0.025115f, -0.004171f, 0.008692f, -0.021672f, + 0.014636f, -0.016534f, -0.012778f, 0.003069f, -0.012986f, 0.012609f, 0.005274f, -0.005725f, 0.008808f, -0.001736f, -0.001311f, 0.004839f, 0.018621f, -0.013599f, 0.003031f, 0.002005f, 0.008328f, 0.005176f, 0.003902f, -0.007696f, 0.044506f, 0.057512f, -0.012356f, -0.002066f, 0.020396f, 0.076022f, 0.002293f, -0.044734f, -0.017787f, 0.009271f, 0.008807f, -0.014050f, 0.014682f, -0.010112f, 0.023693f, -0.037928f, 0.002185f, 0.023840f, -0.015706f, -0.017042f, 0.003501f, -0.037498f, -0.011400f, -0.012134f, -0.059703f, -0.050461f, -0.029110f, 0.022195f, 0.026187f, -0.004443f, -0.042421f, 0.004910f, 0.001725f, -0.001400f, 0.008759f, -0.021300f, 0.051395f, -0.014508f, 0.006742f, 0.056799f, -0.049407f, 0.024027f, 0.008625f, -0.017223f, 0.020858f, -0.013325f, -0.040004f, 0.000918f, 0.035064f, -0.015500f, -0.025033f, 0.014578f, 0.004951f, 0.033269f, 0.000515f, -0.051103f, 0.004365f, -0.030189f, 0.050691f, -0.018230f, 0.007904f, 0.012451f, 0.006333f, -0.007191f, -0.032437f, 0.013713f, 0.034631f, 0.010016f, 0.035727f, -0.051845f, -0.028251f, -0.008518f, -0.000148f, 0.005616f, -0.039716f, 0.035880f, + -0.004598f, -0.038144f, -0.012397f, 0.024155f, 0.022805f, -0.021123f, -0.029000f, 0.028996f, -0.023007f, -0.014633f, -0.000174f, -0.003589f, -0.002820f, -0.001895f, -0.008161f, -0.001624f, 0.014940f, -0.003311f, 0.013769f, -0.015327f, 0.011035f, 0.013952f, -0.003331f, 0.007529f, 0.002707f, -0.002843f, 0.000628f, 0.001887f, 0.025355f, 0.001294f, -0.004296f, 0.002114f, 0.006016f, -0.012445f, 0.004953f, -0.015913f, -0.000756f, 0.018390f, -0.006086f, -0.014499f, -0.004820f, 0.008239f, 0.000828f, 0.000596f, 0.011432f, 0.000855f, -0.013932f, -0.007560f, 0.027045f, 0.019302f, -0.005754f, -0.001147f, -0.000272f, -0.039359f, 0.057856f, 0.001649f, -0.099097f, 0.039695f, -0.013622f, 0.007723f, 0.010110f, 0.013305f, 0.024325f, 0.008868f, -0.017943f, -0.004334f, 0.024497f, 0.016564f, -0.019678f, -0.001053f, -0.015613f, -0.008095f, -0.048676f, -0.006212f, 0.023425f, 0.029092f, 0.006538f, -0.011547f, 0.032226f, -0.033199f, 0.036719f, -0.021158f, -0.011887f, 0.004376f, -0.011397f, 0.009790f, -0.029297f, -0.039550f, -0.044263f, -0.014168f, 0.022917f, -0.008852f, 0.000221f, 0.026955f, 0.007483f, 0.004710f, + -0.000849f, 0.000915f, -0.009325f, 0.000362f, 0.029048f, 0.017884f, 0.030655f, 0.026003f, 0.030753f, 0.020930f, -0.018291f, -0.011663f, 0.007552f, -0.001960f, -0.035348f, 0.023766f, -0.006401f, -0.033393f, 0.041914f, -0.000474f, 0.006809f, -0.001167f, -0.015252f, -0.005033f, 0.017599f, 0.025501f, 0.021207f, 0.000650f, 0.012987f, -0.042772f, -0.006081f, -0.015243f, 0.023269f, 0.008035f, -0.011928f, -0.013606f, 0.053855f, -0.016420f, -0.018459f, -0.005836f, 0.008679f, -0.013336f, -0.035501f, -0.002003f, -0.006089f, -0.019179f, 0.033256f, 0.006788f, 0.012513f, -0.010223f, -0.001791f, 0.007748f, 0.001988f, 0.009785f, 0.010541f, -0.003456f, 0.006459f, -0.006404f, 0.007321f, 0.002795f, -0.005896f, -0.004453f, 0.005417f, 0.007657f, 0.002066f, -0.006760f, -0.005628f, -0.006076f, -0.004506f, 0.000165f, 0.003787f, -0.005501f, -0.006694f, 0.001599f, -0.000548f, -0.001183f, 0.005755f, -0.002687f, 0.009128f, 0.002798f, 0.026777f, -0.002242f, -0.003387f, -0.005880f, 0.003261f, 0.000167f, -0.011287f, -0.014831f, 0.134985f, -0.132377f, -0.006541f, -0.143935f, -0.022194f, -0.054687f, -0.006570f, 0.035229f, + -0.017758f, -0.039792f, 0.062938f, -0.016936f, -0.010850f, 0.002141f, 0.019467f, -0.002189f, 0.052326f, 0.034632f, 0.020822f, -0.030782f, 0.002152f, -0.020987f, -0.021305f, -0.014262f, 0.000873f, -0.006541f, -0.005680f, -0.017374f, -0.003788f, 0.028907f, 0.003643f, 0.019141f, 0.019163f, -0.001505f, 0.025551f, 0.037136f, 0.002073f, -0.007581f, -0.019287f, -0.023115f, 0.009326f, 0.010152f, -0.019118f, 0.031466f, -0.041490f, -0.042034f, 0.004704f, -0.014705f, 0.022553f, -0.038974f, 0.016702f, -0.074957f, -0.039893f, -0.060008f, -0.005152f, -0.029619f, -0.002637f, -0.018080f, -0.022502f, -0.019615f, -0.001752f, 0.005082f, -0.058595f, 0.006683f, -0.012805f, 0.006727f, 0.000301f, -0.027108f, -0.047667f, 0.032982f, -0.028674f, -0.005125f, 0.029540f, -0.002992f, -0.009229f, 0.019525f, 0.024488f, -0.005048f, 0.024393f, 0.015958f, 0.029471f, 0.016244f, 0.029821f, 0.014115f, -0.017643f, -0.004917f, -0.015540f, 0.000711f, -0.012865f, 0.002756f, 0.010816f, 0.015266f, 0.016741f, -0.007422f, 0.007790f, 0.005581f, 0.010985f, -0.002602f, -0.004167f, 0.005729f, 0.013163f, 0.001733f, 0.003076f, 0.014498f, + 0.007455f, 0.014924f, -0.002112f, 0.000689f, -0.001525f, 0.007280f, 0.010348f, -0.001879f, -0.017160f, 0.009417f, -0.002852f, 0.003658f, -0.005377f, 0.002387f, -0.004867f, -0.002541f, 0.000916f, -0.014314f, 0.000248f, 0.019600f, -0.012239f, -0.012927f, 0.001704f, 0.006690f, 0.006842f, 0.002313f, -0.013545f, 0.109210f, 0.054813f, 0.026489f, -0.026514f, -0.013739f, -0.057128f, 0.012522f, 0.045664f, -0.008978f, -0.010972f, 0.074891f, -0.013526f, -0.016702f, 0.036989f, 0.054821f, 0.009382f, 0.055915f, -0.014115f, 0.008114f, 0.032920f, 0.037278f, 0.058788f, 0.047603f, -0.002646f, -0.021298f, 0.017572f, 0.021426f, 0.020149f, 0.025196f, 0.043922f, 0.021512f, 0.055894f, -0.021789f, -0.001643f, 0.016330f, 0.015053f, 0.047399f, 0.027429f, 0.050804f, -0.036835f, -0.011597f, 0.020132f, -0.039575f, 0.031747f, 0.032355f, 0.030878f, 0.013167f, -0.040005f, -0.014610f, 0.075362f, 0.019389f, 0.050748f, 0.042192f, 0.046145f, -0.009569f, 0.061219f, 0.096081f, 0.032923f, 0.008418f, 0.067256f, 0.046533f, -0.026159f, -0.016055f, -0.032849f, -0.026183f, 0.028191f, 0.032927f, 0.002662f, -0.027872f, + 0.000369f, -0.024928f, -0.001370f, -0.011173f, 0.016054f, -0.058541f, -0.006896f, 0.005843f, -0.029849f, 0.022286f, 0.003725f, -0.018332f, 0.015399f, -0.036866f, -0.024167f, -0.040836f, -0.013867f, -0.019727f, 0.014190f, 0.004437f, -0.019196f, 0.004249f, 0.026418f, 0.007820f, -0.008958f, -0.016231f, -0.025401f, -0.009765f, 0.008115f, -0.035667f, -0.016848f, -0.003075f, 0.028405f, 0.009579f, -0.012401f, 0.005968f, -0.019442f, -0.005282f, -0.006139f, -0.015928f, -0.010504f, 0.026764f, -0.006416f, -0.001895f, -0.006770f, 0.006323f, 0.016879f, 0.012181f, 0.014429f, 0.036934f, -0.000192f, 0.029780f, 0.001152f, 0.003074f, 0.018415f, 0.015997f, -0.024757f, -0.014178f, -0.002162f, 0.005777f, 0.002364f, 0.000258f, -0.002705f, 0.011695f, -0.034366f, 0.017373f, -0.041464f, 0.073195f, 0.103861f, 0.060537f, -0.026366f, -0.056755f, -0.020749f, 0.051442f, -0.014951f, -0.042270f, 0.077492f, -0.053372f, 0.046380f, 0.026208f, -0.060437f, -0.024994f, -0.006121f, -0.100011f, 0.004239f, 0.011663f, -0.048043f, 0.098834f, -0.033635f, 0.091800f, -0.068388f, 0.010332f, 0.004691f, 0.067154f, 0.098998f, -0.007986f, + 0.033821f, 0.046751f, -0.054268f, 0.036769f, -0.073559f, -0.020230f, 0.140692f, -0.007763f, -0.038398f, -0.007444f, -0.078223f, 0.003538f, -0.024392f, 0.087973f, 0.033750f, 0.041029f, -0.013107f, -0.023066f, -0.043362f, -0.040313f, 0.010560f, 0.005747f, 0.000607f, 0.058621f, -0.013810f, 0.011299f, -0.060282f, -0.031320f, 0.040952f, -0.090255f, -0.035210f, -0.027052f, -0.030467f, 0.084541f, 0.006592f, 0.091329f, 0.065843f, 0.029208f, 0.035447f, -0.020317f, -0.047718f, 0.040971f, -0.065111f, -0.039957f, 0.081434f, 0.024708f, -0.048242f, -0.080284f, -0.048141f, -0.057103f, 0.046481f, -0.049281f, 0.026155f, -0.035564f, -0.002569f, -0.030531f, 0.033165f, 0.019126f, 0.003411f, -0.026479f, -0.004372f, -0.018258f, 0.005953f, -0.036048f, -0.024496f, -0.013529f, 0.008520f, 0.020258f, -0.000161f, -0.014649f, -0.020018f, -0.033504f, -0.023455f, 0.021397f, 0.029734f, -0.009117f, 0.020696f, 0.040936f, 0.020126f, -0.037906f, -0.010584f, -0.013904f, 0.024585f, -0.023118f, -0.014656f, -0.005419f, 0.009443f, -0.030406f, -0.040524f, -0.029211f, -0.009160f, 0.016922f, 0.000064f, 0.003839f, -0.005198f, 0.023158f, + 0.007866f, -0.001418f, -0.020721f, -0.007047f, -0.012599f, 0.016292f, -0.003998f, 0.003908f, 0.065455f, -0.109470f, 0.115782f, -0.003239f, 0.008605f, -0.037530f, 0.093424f, 0.021684f, 0.060041f, 0.022489f, -0.039924f, 0.013167f, 0.033192f, -0.057721f, 0.039803f, 0.000379f, 0.026290f, -0.076939f, -0.006330f, 0.018448f, 0.070172f, -0.029756f, -0.058538f, -0.002889f, 0.069784f, 0.036682f, -0.027163f, -0.060811f, -0.003348f, 0.050314f, 0.006262f, 0.003197f, 0.013674f, 0.036493f, 0.092602f, -0.131384f, -0.021984f, 0.012343f, 0.072529f, 0.016001f, -0.040080f, -0.010152f, 0.027406f, 0.066407f, -0.007102f, 0.002940f, -0.126057f, 0.036091f, 0.019285f, 0.033992f, -0.091562f, 0.080367f, 0.069092f, 0.025865f, -0.041619f, -0.004473f, -0.046012f, 0.033854f, 0.059120f, 0.024693f, 0.027475f, -0.005448f, 0.044727f, -0.065964f, 0.061934f, -0.018690f, -0.022585f, 0.072992f, 0.059983f, 0.003669f, -0.023172f, -0.060427f, 0.043729f, 0.048045f, -0.129310f, -0.010429f, 0.073794f, 0.018274f, -0.001176f, -0.046312f, -0.020205f, 0.125864f, -0.010012f, -0.043294f, -0.005814f, -0.023422f, -0.028403f, 0.041751f, + -0.035794f, 0.012631f, 0.018784f, 0.025427f, -0.018054f, 0.002363f, -0.018325f, -0.021724f, -0.014735f, 0.019182f, 0.019009f, -0.019883f, -0.004287f, 0.009540f, -0.016025f, 0.038026f, -0.036958f, 0.009442f, -0.006922f, -0.011962f, 0.013225f, 0.063078f, 0.003821f, 0.000045f, -0.010462f, -0.022299f, -0.000217f, 0.034335f, 0.007881f, -0.001636f, -0.006977f, -0.016215f, 0.028972f, -0.007571f, -0.002013f, -0.017188f, 0.016495f, -0.002695f, -0.008047f, -0.097945f, 0.047007f, 0.008633f, 0.029729f, 0.035991f, 0.052552f, 0.018328f, 0.016526f, -0.025815f, 0.026830f, 0.004557f, 0.062459f, -0.007724f, -0.019354f, 0.049049f, 0.037465f, -0.008783f, 0.002739f, -0.021619f, 0.000116f, 0.015246f, -0.005426f, -0.013079f, 0.027700f, -0.022920f, 0.002366f, 0.037825f, -0.008804f, 0.021663f, -0.039526f, -0.008349f, 0.004661f, -0.016448f, -0.006762f, 0.004074f, 0.027324f, -0.007477f, -0.047170f, 0.001454f, 0.092412f, 0.018896f, -0.050918f, 0.014692f, -0.051904f, -0.035528f, -0.027054f, -0.007549f, 0.058801f, -0.006792f, -0.047782f, 0.095596f, -0.104304f, 0.017298f, 0.105455f, 0.010891f, 0.073987f, -0.057228f, + -0.106703f, 0.033979f, 0.003145f, 0.084348f, 0.003985f, -0.048007f, 0.038808f, -0.010964f, -0.009289f, -0.020564f, -0.003879f, -0.029957f, 0.014346f, 0.003886f, 0.022138f, -0.036508f, -0.031685f, -0.012638f, 0.037048f, 0.048050f, -0.016601f, 0.025486f, -0.004374f, 0.040206f, 0.028105f, -0.051009f, 0.040101f, -0.010584f, 0.005519f, -0.008771f, -0.016294f, -0.000309f, -0.000738f, 0.005386f, -0.004398f, 0.004165f, 0.003125f, 0.002791f, 0.005309f, -0.016846f, 0.000320f, 0.009270f, -0.014560f, -0.001881f, 0.008386f, -0.009024f, 0.011163f, 0.012908f, -0.019718f, 0.023061f, 0.008821f, 0.023896f, -0.005913f, 0.011073f, 0.018670f, -0.036479f, -0.001060f, 0.011157f, 0.020659f, -0.013038f, -0.010311f, -0.012535f, -0.009718f, 0.021238f, 0.042029f, -0.018127f, -0.197592f, -0.454028f, -0.179930f, -0.273278f, -0.400114f, 0.215099f, 0.059490f, 0.123770f, 0.569888f, 0.439263f, 0.256274f, 0.469121f, 0.350061f, 0.059818f, 0.115743f, 0.096285f, -0.222278f, -0.190236f, -0.093165f, -0.340005f, -0.325099f, -0.124510f, -0.167023f, -0.235870f, -0.098585f, -0.084724f, -0.240039f, -0.200375f, -0.016612f, -0.114145f, + -0.194613f, -0.066854f, 0.062117f, -0.141380f, 0.042609f, 0.210442f, -0.015991f, -0.030161f, 0.285844f, 0.228248f, -0.009940f, 0.333917f, 0.386977f, 0.157147f, 0.363586f, 0.510106f, 0.304393f, 0.264399f, 0.612211f, 0.488561f, 0.367376f, 0.435462f, 0.577603f, 0.206511f, 0.081999f, 0.241823f, -0.190641f, -0.547251f, -0.396655f, -0.605251f, -0.980070f, -0.877896f, -0.931663f, -1.083533f, -1.104271f, -0.952234f, -0.829141f, -0.831585f, -0.584560f, -0.258952f, -0.175309f, -0.026563f, 0.283748f, 0.521356f, 0.526374f, 0.653389f, 0.940078f, 0.821705f, 0.751214f, 1.038009f, 0.825067f, 0.466318f, 0.680576f, 0.476537f, 0.185083f, 0.167441f, 0.219931f, 0.022672f, -0.069305f, 0.042708f, 0.006371f, -0.154101f, -0.082037f, 0.013735f, -0.122638f, -0.227397f, -0.109088f, -0.156015f, -0.331123f, -0.208801f, -0.080569f, -0.247568f, -0.166312f, 0.033369f, -0.078556f, -0.115619f, 0.056838f, -0.068398f, -0.272655f, -0.209014f, -0.334706f, -0.566032f, -0.532922f, -0.511181f, -0.530908f, -0.466726f, -0.313499f, -0.245024f, -0.147382f, -0.028614f, 0.124819f, 0.221263f, 0.339596f, 0.428321f, 0.532075f, 0.553545f, + 0.587136f, 0.654107f, 0.620514f, 0.568948f, 0.538260f, 0.356562f, 0.125661f, 0.011914f, -0.053330f, -0.152348f, -0.179600f, -0.156789f, -0.177026f, -0.198825f, -0.175148f, -0.176912f, -0.173356f, -0.146394f, -0.142845f, -0.149888f, -0.144645f, -0.126657f, -0.105013f, -0.089748f, -0.058716f, -0.036427f, -0.007399f, 0.004176f, 0.026671f, 0.040534f, 0.050952f, 0.052874f, 0.055947f, 0.055462f, 0.043629f, 0.025511f, 0.019707f, 0.009943f, -0.002789f, -0.013343f, -0.016992f, -0.037551f, -0.049034f, -0.060562f, -0.080714f, -0.095071f, -0.089087f, -0.085797f, -0.076557f, -0.057424f, -0.040697f, -0.029892f, -0.007506f, 0.015903f, 0.031160f, 0.047355f, 0.073656f, 0.079669f, 0.078998f, 0.085470f, 0.093920f, 0.086919f, 0.090352f, 0.094864f, 0.089928f, 0.086496f, 0.086885f, 0.076861f, 0.066185f, 0.058372f, 0.044862f, 0.025477f, 0.011555f, -0.004888f, -0.026703f, -0.048744f, -0.064824f, -0.084072f, -0.095647f, -0.100697f, -0.099296f, -0.098160f, -0.089942f, -0.077835f, -0.065610f, -0.053128f, -0.037096f, -0.026195f, -0.014104f, -0.003967f, 0.005659f, 0.013649f, 0.020207f, 0.025718f, 0.029687f, 0.029093f, + 0.028530f, 0.025918f, 0.022534f, 0.019172f, 0.016886f, 0.013929f, 0.011336f, 0.008978f, 0.007552f, 0.005980f, 0.005189f, 0.004564f, 0.004154f, 0.003671f, 0.003361f, 0.003232f} + }, + { + {-0.015902f, 0.009482f, -0.012087f, 0.001522f, -0.005098f, -0.001557f, 0.004761f, -0.007472f, -0.013627f, -0.003444f, 0.001194f, -0.007785f, -0.004481f, 0.006680f, -0.003897f, 0.003120f, -0.017078f, -0.001416f, 0.011610f, 0.006221f, -0.019113f, -0.006539f, -0.004993f, -0.005031f, 0.006495f, -0.002738f, -0.009945f, -0.006208f, -0.007103f, -0.007200f, 0.012641f, 0.004002f, 0.008149f, -0.005207f, 0.010695f, 0.009762f, 0.006935f, -0.003779f, -0.009039f, -0.007054f, 0.000771f, 0.001870f, 0.014537f, 0.005212f, 0.002779f, -0.006775f, 0.001593f, 0.000694f, 0.001675f, 0.005823f, 0.003421f, -0.009790f, -0.008372f, -0.004262f, 0.005315f, 0.001307f, -0.001851f, -0.010468f, -0.003216f, 0.004208f, 0.004778f, -0.004179f, -0.001605f, 0.000311f, 0.005056f, -0.001015f, -0.005578f, 0.000083f, 0.000803f, -0.007114f, 0.015309f, 0.001041f, -0.010395f, 0.000063f, -0.001606f, 0.009909f, 0.000784f, 0.006733f, 0.009178f, 0.003525f, -0.000635f, 0.000524f, -0.003347f, -0.002095f, -0.002230f, 0.005916f, -0.001894f, -0.000675f, -0.002648f, 0.002093f, 0.000690f, -0.001051f, -0.000257f, -0.001445f, 0.000290f, -0.000142f, + 0.001166f, 0.001268f, 0.001931f, 0.002478f, -0.010566f, -0.009566f, 0.010754f, 0.009861f, -0.008056f, 0.005922f, 0.000553f, 0.003033f, -0.026355f, 0.010137f, -0.003957f, -0.018004f, -0.023474f, 0.000596f, 0.016891f, 0.000990f, 0.010935f, 0.000377f, -0.021237f, -0.007344f, 0.002394f, 0.007381f, -0.003780f, -0.001842f, -0.008970f, 0.001154f, -0.001669f, 0.014949f, 0.007563f, 0.003157f, 0.002638f, 0.004044f, 0.005151f, 0.013630f, 0.008226f, -0.012087f, -0.001074f, 0.002782f, 0.002869f, -0.014370f, 0.004618f, -0.004288f, -0.009126f, -0.002590f, -0.000435f, 0.009795f, 0.002473f, -0.005506f, 0.009890f, 0.015475f, -0.003334f, -0.005898f, 0.003696f, -0.001129f, 0.008420f, 0.008619f, 0.006711f, -0.010379f, -0.007939f, 0.007413f, -0.003189f, -0.002619f, -0.007999f, 0.000844f, -0.011855f, 0.007012f, 0.006280f, 0.008302f, 0.002085f, 0.009651f, -0.010514f, -0.006588f, 0.013528f, 0.000696f, 0.004984f, 0.016021f, 0.006145f, 0.001564f, -0.006511f, 0.009393f, 0.001079f, -0.004786f, 0.002638f, -0.011352f, 0.000271f, -0.001208f, 0.001638f, 0.003032f, -0.001345f, -0.005066f, -0.002821f, -0.000835f, + 0.002419f, 0.002303f, 0.000731f, -0.001408f, 0.001333f, 0.003191f, 0.000514f, -0.001071f, -0.001035f, 0.000014f, 0.013390f, 0.001185f, 0.005185f, -0.011272f, -0.009573f, 0.005481f, -0.002653f, -0.004123f, -0.005235f, -0.004899f, 0.004070f, -0.013045f, -0.007475f, -0.016110f, -0.019349f, -0.003584f, 0.016113f, 0.010384f, -0.006502f, -0.001816f, -0.002233f, -0.003754f, -0.013933f, 0.010036f, -0.003493f, -0.003585f, 0.000887f, 0.006558f, -0.003134f, 0.000577f, -0.000475f, 0.009499f, -0.008779f, 0.009528f, 0.005212f, 0.011424f, -0.003891f, 0.008837f, 0.003940f, -0.005477f, 0.007981f, -0.005416f, 0.004599f, 0.008466f, -0.006385f, 0.008891f, -0.005304f, -0.004299f, -0.001335f, -0.002644f, 0.004492f, -0.002603f, -0.006758f, 0.002709f, -0.005865f, 0.001277f, 0.000811f, 0.000903f, 0.013432f, 0.002595f, -0.003074f, 0.000062f, -0.005491f, -0.007693f, 0.003981f, -0.001865f, 0.012824f, 0.013048f, 0.005311f, -0.003643f, -0.002004f, -0.000111f, -0.005135f, -0.005976f, 0.006604f, 0.010336f, 0.000348f, -0.001146f, 0.006384f, 0.006852f, -0.000882f, 0.002407f, 0.002223f, -0.005015f, 0.004753f, -0.000929f, + 0.006816f, -0.003394f, -0.001286f, -0.000281f, -0.002814f, -0.000334f, 0.004970f, -0.001109f, 0.001517f, 0.001427f, -0.003486f, 0.001071f, -0.000627f, -0.000734f, 0.001432f, 0.001269f, -0.002225f, 0.002527f, -0.000849f, -0.001128f, 0.000204f, -0.000318f, -0.000404f, -0.002076f, -0.001500f, 0.000659f, 0.025549f, -0.010806f, 0.010476f, -0.013022f, -0.010951f, 0.000055f, -0.003037f, -0.002769f, 0.003563f, -0.005478f, 0.011051f, 0.010781f, 0.009238f, -0.002770f, -0.001201f, -0.004809f, -0.011788f, 0.001845f, -0.007080f, -0.001308f, 0.001297f, -0.003947f, 0.006722f, 0.002544f, -0.000803f, -0.019461f, -0.008121f, -0.012264f, 0.000464f, -0.008023f, -0.012334f, -0.005405f, -0.006814f, -0.007539f, 0.012285f, -0.009812f, 0.008661f, 0.000754f, -0.003481f, 0.004852f, 0.004170f, -0.008795f, -0.002407f, 0.000185f, 0.009488f, -0.000900f, -0.012965f, -0.016450f, -0.017124f, 0.004459f, -0.006254f, 0.000379f, -0.001355f, 0.002480f, 0.005792f, 0.009522f, -0.006574f, -0.003481f, 0.003136f, 0.003276f, 0.001222f, 0.011940f, -0.006678f, 0.007384f, -0.013713f, 0.026882f, 0.003307f, -0.002861f, 0.005228f, 0.002574f, + 0.005141f, -0.007473f, -0.001316f, 0.002041f, -0.000828f, -0.001609f, -0.013565f, -0.004511f, -0.009219f, -0.002745f, -0.001078f, -0.006649f, -0.006498f, 0.004828f, 0.005641f, 0.001718f, 0.001110f, -0.000622f, 0.004766f, 0.002800f, 0.005472f, -0.002742f, 0.000483f, 0.000167f, 0.005028f, -0.002019f, -0.000295f, -0.000309f, 0.000561f, -0.003983f, 0.000980f, -0.002884f, 0.001454f, 0.002004f, -0.000953f, -0.003355f, 0.000670f, 0.001028f, -0.001034f, -0.001159f, -0.003603f, 0.000945f, -0.000422f, -0.001846f, 0.002275f, 0.002610f, -0.000334f, -0.000771f, -0.012581f, 0.001734f, 0.002233f, 0.000748f, -0.002060f, -0.007562f, 0.004365f, 0.003484f, -0.011377f, 0.013181f, -0.016624f, 0.020322f, -0.002092f, 0.006733f, 0.002915f, -0.000492f, -0.002291f, 0.004123f, 0.019024f, 0.021373f, -0.004208f, 0.003790f, -0.002684f, -0.003115f, 0.002742f, 0.004485f, 0.014603f, -0.001933f, 0.004353f, -0.007508f, 0.007958f, 0.001726f, 0.011490f, 0.005554f, 0.010755f, -0.015719f, 0.006497f, 0.005650f, -0.005037f, -0.000219f, 0.011683f, -0.000003f, 0.000816f, 0.003535f, 0.007065f, -0.002484f, -0.001129f, 0.022694f, + 0.010714f, 0.001968f, 0.001961f, -0.004799f, 0.010216f, -0.013788f, -0.020252f, -0.024425f, -0.001613f, 0.012778f, -0.000508f, 0.006351f, 0.017219f, 0.006811f, -0.003185f, -0.006135f, 0.009125f, -0.001831f, 0.022171f, 0.009982f, 0.003187f, 0.003081f, -0.012285f, 0.002553f, 0.009064f, -0.004708f, -0.013819f, 0.002376f, 0.004805f, -0.000625f, -0.004882f, -0.001775f, 0.002206f, -0.004476f, 0.002451f, 0.002513f, 0.002201f, -0.000907f, 0.002559f, -0.004388f, -0.004197f, -0.001361f, -0.002712f, 0.001379f, -0.004214f, 0.002345f, 0.003877f, 0.002619f, 0.002892f, 0.003014f, 0.000822f, 0.001930f, -0.005765f, -0.004766f, -0.001907f, -0.002506f, -0.003077f, -0.000619f, 0.001752f, 0.001038f, -0.000340f, 0.003524f, 0.001778f, -0.000274f, 0.004313f, 0.002764f, -0.000150f, -0.029823f, 0.003066f, -0.002358f, 0.020259f, -0.015365f, 0.008823f, -0.031563f, 0.012259f, -0.003073f, -0.016158f, -0.017716f, -0.012450f, 0.009295f, 0.007210f, 0.023782f, 0.003039f, 0.007861f, 0.022724f, -0.004062f, -0.016761f, 0.002410f, -0.012948f, 0.003049f, 0.018499f, 0.003385f, -0.005362f, -0.002297f, -0.003705f, 0.005404f, + 0.007077f, -0.001609f, 0.004683f, 0.009531f, -0.006137f, 0.002973f, -0.011414f, -0.000940f, -0.014250f, -0.002275f, 0.001776f, -0.006750f, 0.010257f, 0.007048f, 0.008717f, 0.017624f, 0.000977f, 0.021342f, 0.016227f, 0.007869f, -0.011286f, 0.024488f, 0.010401f, 0.004261f, 0.021346f, -0.002408f, 0.000317f, 0.001745f, 0.006971f, -0.004531f, -0.006451f, -0.014782f, -0.014435f, -0.011682f, -0.000046f, -0.009226f, 0.018694f, -0.011417f, 0.007628f, 0.011740f, -0.006797f, 0.000565f, -0.005593f, -0.003204f, -0.018726f, -0.021260f, 0.009518f, -0.003738f, -0.007310f, -0.006331f, 0.001622f, 0.002447f, 0.001242f, 0.004120f, -0.007612f, 0.017321f, 0.001024f, 0.005186f, -0.003758f, 0.000933f, 0.004966f, -0.008492f, 0.002649f, 0.000295f, 0.002719f, 0.003905f, -0.000231f, 0.003045f, 0.005719f, -0.000014f, 0.001496f, 0.004246f, 0.004499f, 0.006117f, -0.000477f, 0.001030f, -0.003365f, -0.000897f, 0.000091f, -0.001488f, -0.004674f, 0.000299f, -0.001511f, -0.001939f, 0.000257f, -0.001812f, -0.002595f, 0.024827f, 0.000906f, 0.000261f, -0.002342f, -0.004900f, 0.004425f, 0.000995f, -0.012732f, -0.016300f, + -0.022082f, -0.011588f, -0.023103f, -0.014701f, -0.007900f, -0.017102f, -0.010837f, -0.007503f, -0.008916f, -0.023106f, 0.015774f, 0.009870f, 0.000537f, 0.008297f, 0.003781f, -0.006450f, 0.028588f, 0.001716f, -0.009947f, -0.005244f, -0.019464f, -0.008398f, 0.021275f, 0.000988f, -0.017947f, -0.017939f, 0.002555f, -0.018158f, 0.005751f, 0.006298f, -0.014158f, 0.000505f, 0.004355f, 0.000947f, 0.020937f, 0.006233f, -0.009639f, 0.002065f, -0.011546f, 0.010540f, 0.001454f, 0.004636f, -0.025722f, 0.017645f, -0.008876f, 0.007318f, 0.000540f, 0.003375f, 0.004159f, 0.000603f, -0.007531f, -0.000650f, -0.010079f, -0.000039f, -0.020293f, -0.000173f, -0.021888f, 0.028720f, -0.004952f, 0.018249f, -0.013524f, -0.006360f, -0.002951f, -0.013960f, -0.007820f, 0.011180f, -0.000464f, -0.000496f, 0.008274f, 0.010743f, 0.001671f, 0.017585f, 0.015217f, 0.021161f, 0.011243f, 0.004444f, 0.002527f, 0.009570f, 0.005084f, 0.003138f, 0.003857f, 0.002113f, 0.004667f, -0.001405f, 0.007665f, 0.001280f, -0.000563f, -0.001697f, 0.005955f, 0.002377f, 0.004219f, 0.002077f, -0.002897f, 0.001983f, 0.002309f, 0.001920f, + -0.004732f, 0.008816f, 0.004724f, -0.000942f, -0.006863f, -0.000824f, -0.001095f, -0.004965f, 0.001705f, 0.000802f, 0.004986f, -0.004249f, -0.009455f, -0.012665f, 0.000039f, 0.009478f, -0.024410f, 0.000085f, -0.010500f, -0.008386f, 0.017443f, -0.028168f, -0.026603f, 0.007052f, 0.035687f, 0.001007f, 0.003477f, 0.002832f, -0.005333f, 0.019587f, 0.019018f, 0.011029f, 0.005462f, -0.005037f, -0.028842f, 0.017247f, 0.000239f, -0.023086f, -0.007387f, 0.005471f, -0.001079f, 0.000289f, 0.002462f, -0.005487f, -0.022734f, -0.001191f, 0.001026f, -0.004078f, -0.009445f, 0.006945f, 0.019891f, -0.025449f, 0.015984f, -0.009482f, -0.004718f, 0.001612f, 0.012702f, 0.041600f, -0.026750f, -0.006671f, 0.002727f, -0.002568f, -0.004821f, 0.001466f, -0.010199f, 0.003675f, -0.009202f, 0.028630f, 0.009905f, 0.005440f, 0.007967f, -0.005937f, -0.001555f, 0.015199f, -0.002281f, 0.006659f, -0.012467f, 0.022001f, 0.001067f, -0.015413f, 0.030731f, -0.019429f, 0.014200f, 0.004115f, 0.007051f, 0.022377f, -0.008788f, 0.009583f, -0.000991f, 0.000139f, 0.002780f, -0.001396f, -0.014947f, -0.007872f, -0.000873f, -0.006552f, + -0.002266f, -0.003527f, -0.009131f, -0.009331f, -0.006986f, 0.004494f, -0.007984f, 0.004754f, -0.002064f, -0.000231f, -0.006993f, -0.004749f, -0.005134f, 0.004271f, -0.009691f, 0.001086f, 0.001045f, 0.006046f, 0.009397f, -0.003542f, -0.001671f, -0.008266f, -0.007051f, 0.000608f, -0.006192f, 0.001878f, -0.001067f, -0.005460f, 0.000205f, -0.001578f, 0.002634f, 0.003460f, -0.002236f, 0.030311f, 0.002326f, 0.007869f, 0.008961f, -0.005129f, -0.017522f, -0.013752f, 0.002055f, 0.030321f, 0.017171f, 0.003691f, -0.027200f, 0.003866f, -0.014979f, 0.000042f, 0.030343f, 0.029174f, 0.014720f, 0.019705f, -0.017862f, -0.036957f, -0.019366f, -0.026650f, 0.014710f, -0.000313f, -0.004536f, -0.000152f, -0.020170f, -0.006027f, 0.006189f, -0.003834f, -0.007688f, -0.007493f, 0.021491f, -0.001443f, 0.005820f, -0.006172f, 0.014078f, 0.002940f, -0.008182f, -0.017174f, -0.013190f, 0.038921f, -0.001715f, -0.008865f, 0.012416f, -0.022324f, 0.006948f, -0.012800f, -0.038949f, -0.008784f, -0.005099f, 0.011723f, 0.004476f, 0.010292f, 0.003250f, 0.015343f, 0.000541f, 0.001014f, 0.008489f, -0.038088f, -0.006044f, -0.010273f, + -0.002752f, 0.003636f, 0.021804f, 0.024071f, 0.008661f, -0.006372f, -0.016672f, -0.021914f, -0.007373f, -0.012918f, 0.002720f, -0.006456f, -0.006849f, -0.015113f, 0.022486f, 0.016170f, 0.006563f, 0.020649f, -0.004966f, 0.008209f, 0.012668f, -0.008152f, 0.007532f, -0.005275f, 0.001622f, 0.007490f, -0.002333f, -0.005074f, -0.002116f, -0.002832f, -0.002001f, -0.000242f, 0.000477f, 0.007417f, 0.000268f, 0.000824f, 0.002267f, -0.004229f, -0.011545f, 0.000393f, -0.002717f, -0.001567f, -0.002116f, -0.006848f, -0.000801f, 0.002183f, 0.010207f, 0.008339f, -0.004782f, 0.001105f, 0.006706f, -0.001505f, 0.001520f, -0.002502f, 0.001515f, 0.006382f, 0.000783f, 0.007009f, -0.043964f, -0.028743f, -0.006650f, -0.010463f, 0.022471f, 0.015438f, -0.003677f, 0.038692f, -0.039090f, -0.009109f, -0.014748f, 0.041327f, 0.019832f, -0.013571f, 0.015242f, 0.005804f, -0.016073f, 0.028545f, -0.031463f, 0.015591f, -0.014484f, 0.002471f, 0.003442f, -0.010495f, 0.027566f, -0.019356f, 0.016932f, -0.008055f, -0.040531f, -0.006715f, 0.028332f, -0.017135f, -0.027669f, 0.000390f, -0.003440f, -0.041407f, -0.007733f, 0.016631f, + 0.007060f, 0.022101f, 0.016256f, -0.004668f, 0.039852f, -0.009523f, -0.012257f, -0.019583f, -0.018233f, -0.017636f, 0.010947f, 0.014888f, -0.012815f, -0.014457f, 0.004783f, -0.012539f, 0.016715f, -0.004592f, 0.009077f, -0.006776f, -0.010349f, -0.007944f, -0.000220f, -0.023438f, 0.006357f, 0.016913f, -0.003946f, 0.007318f, 0.010167f, 0.012010f, 0.021650f, -0.015486f, 0.006968f, 0.016881f, -0.002170f, -0.035949f, -0.038265f, 0.004216f, -0.003634f, 0.002845f, -0.014003f, -0.005817f, 0.002824f, -0.013862f, -0.025147f, -0.007685f, 0.018982f, 0.015398f, -0.007564f, -0.003068f, 0.005842f, 0.005203f, -0.002995f, -0.006114f, 0.000455f, -0.000811f, -0.009889f, -0.003670f, 0.010508f, -0.003029f, 0.008442f, 0.001518f, -0.002630f, -0.005182f, 0.006780f, 0.006680f, 0.007847f, 0.000933f, -0.004411f, 0.004549f, -0.011784f, -0.007077f, 0.005803f, 0.002702f, 0.004978f, 0.009163f, -0.004692f, 0.001890f, 0.003595f, 0.004461f, 0.000851f, -0.005393f, -0.007739f, 0.003444f, -0.004218f, -0.002593f, 0.031254f, -0.020165f, -0.050416f, -0.000046f, 0.035501f, 0.045386f, 0.008278f, -0.017096f, -0.012882f, 0.004428f, + -0.008400f, -0.007475f, 0.019812f, 0.020087f, -0.010222f, 0.019373f, -0.025139f, -0.003308f, 0.017717f, -0.009026f, 0.021506f, 0.009976f, -0.003260f, -0.030183f, 0.011206f, -0.007263f, -0.007353f, 0.001275f, -0.002475f, -0.003448f, 0.040815f, -0.020445f, 0.020716f, 0.034921f, 0.024164f, 0.012580f, 0.000220f, -0.023516f, 0.023025f, -0.013284f, 0.021927f, -0.012768f, 0.004885f, -0.024711f, -0.004943f, -0.023371f, -0.015408f, 0.003228f, -0.021737f, -0.006227f, -0.007728f, -0.001164f, 0.018916f, -0.022838f, -0.019634f, -0.007363f, -0.011374f, -0.004861f, -0.019465f, -0.025136f, -0.031334f, 0.002854f, 0.023896f, -0.001961f, -0.015559f, 0.002295f, 0.004915f, 0.018883f, -0.021323f, -0.012363f, -0.006962f, -0.000825f, 0.014151f, -0.000032f, 0.003803f, -0.014833f, -0.006289f, 0.007308f, 0.028912f, 0.012782f, 0.019916f, 0.023134f, 0.030216f, 0.011581f, -0.004312f, -0.010951f, 0.007235f, 0.009149f, 0.013254f, 0.005566f, 0.001131f, -0.000139f, 0.018292f, 0.006460f, -0.006981f, 0.001331f, 0.010201f, 0.004047f, 0.002368f, -0.006900f, -0.006760f, -0.004847f, -0.009349f, 0.000506f, 0.008579f, 0.008254f, + 0.001713f, -0.005072f, 0.012024f, 0.006915f, 0.015267f, 0.007941f, 0.000333f, 0.010215f, 0.000008f, -0.008102f, 0.011682f, -0.000186f, -0.001724f, -0.004595f, 0.002216f, -0.002918f, -0.000358f, 0.010238f, 0.005946f, -0.084131f, -0.039994f, 0.028073f, -0.068702f, -0.047617f, -0.003074f, -0.028022f, -0.019224f, 0.020975f, 0.023971f, 0.007358f, -0.004413f, 0.008698f, 0.068602f, -0.008394f, 0.010969f, 0.026431f, 0.030094f, -0.031269f, -0.016245f, -0.014796f, 0.025324f, 0.027676f, 0.013884f, 0.005117f, 0.025888f, -0.007581f, -0.012985f, 0.018218f, 0.035039f, 0.002530f, 0.011318f, 0.035683f, 0.026289f, 0.021481f, -0.016007f, 0.006795f, 0.010793f, -0.000024f, -0.000593f, 0.022927f, -0.007507f, -0.000312f, -0.002320f, 0.015332f, 0.000568f, -0.024973f, -0.016754f, 0.005074f, -0.033985f, 0.025802f, -0.007552f, 0.056940f, 0.002264f, 0.031258f, 0.006185f, -0.001300f, -0.018345f, -0.000818f, 0.007290f, -0.023990f, -0.012384f, -0.028034f, -0.003553f, 0.014443f, 0.019581f, -0.008474f, -0.045731f, 0.016635f, -0.007269f, 0.015671f, -0.016399f, -0.019519f, 0.014356f, -0.029552f, -0.022669f, 0.044216f, + 0.000661f, 0.020401f, -0.004160f, -0.019045f, 0.005309f, 0.026072f, 0.006336f, 0.020750f, -0.033499f, -0.001592f, -0.002268f, -0.005480f, -0.028798f, 0.028194f, -0.016766f, 0.002136f, -0.003279f, 0.003468f, -0.010675f, -0.000972f, 0.005916f, 0.008694f, -0.007121f, 0.018500f, -0.004532f, -0.005811f, -0.010781f, -0.009130f, -0.009301f, 0.008938f, -0.003570f, -0.006428f, -0.002718f, 0.002429f, -0.007071f, 0.012969f, -0.003835f, 0.014669f, -0.009118f, 0.006283f, 0.002276f, 0.005920f, 0.009466f, 0.002020f, 0.033962f, -0.015711f, -0.039628f, 0.016776f, -0.020771f, 0.008480f, -0.000680f, -0.019805f, 0.036168f, -0.048732f, -0.002160f, -0.058795f, 0.001277f, 0.047238f, 0.066148f, 0.031216f, -0.011540f, 0.030502f, -0.002480f, -0.004401f, 0.003144f, -0.005346f, 0.016152f, -0.002163f, -0.031182f, 0.001672f, -0.043274f, 0.015039f, -0.013497f, -0.009761f, 0.028768f, -0.000731f, -0.033310f, -0.037215f, 0.008445f, 0.004977f, -0.018624f, -0.015534f, 0.027615f, -0.040331f, -0.000367f, -0.008252f, 0.014033f, -0.010930f, -0.008868f, -0.032293f, -0.013817f, -0.014337f, -0.006151f, 0.023032f, -0.027643f, 0.009751f, + -0.003503f, -0.004912f, 0.003458f, 0.009846f, -0.046689f, -0.005097f, 0.006160f, -0.004256f, 0.017069f, -0.014808f, -0.020716f, -0.009526f, -0.052226f, -0.023120f, -0.022854f, 0.000940f, 0.022082f, 0.033327f, -0.015988f, 0.025181f, -0.043574f, 0.069451f, 0.004624f, -0.012656f, 0.036264f, -0.043345f, 0.036398f, 0.016176f, -0.009925f, 0.000597f, 0.012045f, 0.000804f, 0.005689f, 0.033124f, -0.014388f, 0.014037f, -0.007861f, 0.010108f, 0.016452f, 0.016178f, 0.019831f, -0.007062f, 0.016697f, 0.003796f, 0.002376f, -0.002978f, -0.022577f, 0.000669f, -0.016065f, 0.007147f, 0.010175f, -0.003637f, -0.002646f, 0.002804f, 0.002116f, 0.011025f, 0.005026f, -0.008320f, 0.012015f, -0.000348f, 0.001280f, 0.014839f, 0.010125f, 0.005821f, 0.027141f, -0.022623f, 0.000015f, 0.009790f, -0.000123f, -0.017816f, 0.004125f, -0.011400f, -0.010726f, 0.042748f, 0.002474f, -0.030433f, -0.000629f, -0.004558f, 0.019856f, 0.013112f, -0.018548f, 0.021543f, 0.000446f, -0.047925f, -0.052203f, -0.004937f, -0.015688f, 0.013109f, -0.002192f, -0.018382f, -0.047048f, -0.041013f, 0.022462f, -0.034883f, -0.007794f, 0.002293f, + 0.011116f, 0.002698f, 0.033633f, 0.002902f, -0.016929f, 0.022590f, -0.002941f, 0.003383f, 0.020825f, -0.027281f, -0.001748f, 0.006033f, -0.027889f, 0.017041f, 0.023260f, 0.010222f, 0.020703f, 0.010892f, 0.032038f, 0.008838f, 0.023337f, -0.032616f, -0.010170f, -0.005113f, -0.043877f, -0.000126f, -0.004703f, 0.018498f, -0.002894f, 0.021189f, -0.003466f, -0.025382f, -0.017311f, -0.001202f, -0.040580f, 0.017928f, 0.001169f, -0.007778f, 0.023803f, 0.015166f, 0.019781f, 0.020596f, 0.006314f, -0.002341f, 0.017279f, -0.054968f, 0.016755f, 0.007055f, 0.024710f, -0.009621f, -0.038846f, 0.024611f, -0.005831f, 0.042212f, -0.062042f, -0.021985f, -0.043436f, 0.029872f, -0.012636f, -0.039845f, -0.044509f, -0.029229f, -0.013141f, 0.014319f, 0.011220f, -0.012106f, -0.012622f, -0.006532f, -0.000763f, -0.013382f, -0.005079f, 0.022846f, 0.003566f, -0.002056f, 0.006714f, 0.005088f, 0.004207f, 0.012457f, -0.009531f, -0.012560f, -0.000285f, -0.021907f, 0.000032f, -0.007617f, -0.003110f, -0.014102f, -0.003803f, -0.019287f, -0.017339f, 0.022100f, -0.012260f, -0.000682f, 0.007424f, 0.010701f, -0.001838f, 0.018562f, + -0.015330f, -0.004856f, 0.007656f, -0.017986f, -0.004937f, 0.021278f, 0.007628f, 0.004846f, -0.007225f, -0.010838f, 0.008200f, 0.029075f, 0.026952f, 0.098831f, 0.074660f, 0.010030f, 0.021588f, 0.006180f, 0.057347f, 0.001482f, 0.027874f, -0.026186f, 0.067940f, -0.027044f, 0.061608f, -0.002876f, 0.039329f, -0.004690f, 0.027736f, -0.027763f, 0.006594f, 0.013787f, -0.015231f, -0.005064f, -0.008214f, -0.006490f, 0.018334f, 0.000336f, -0.015943f, -0.021975f, -0.033075f, -0.042085f, -0.020250f, -0.007173f, 0.000194f, 0.013109f, -0.035429f, 0.014891f, -0.019523f, -0.030130f, -0.006301f, -0.022042f, 0.009969f, -0.005449f, -0.046075f, -0.011051f, -0.023450f, -0.027836f, -0.029170f, 0.026351f, 0.035295f, -0.074005f, 0.016725f, 0.006469f, 0.020720f, 0.007227f, -0.009354f, 0.044616f, 0.025123f, 0.023301f, -0.061879f, -0.027776f, -0.000838f, 0.015155f, 0.051187f, 0.001824f, -0.006944f, 0.002386f, 0.043365f, 0.038876f, -0.036943f, 0.041609f, 0.003081f, 0.009270f, -0.007065f, 0.024377f, -0.052641f, -0.018536f, 0.054247f, -0.008426f, -0.003528f, -0.020994f, 0.036176f, 0.023540f, -0.018702f, -0.031756f, + -0.005454f, -0.001461f, 0.003221f, 0.000372f, -0.006762f, -0.029612f, -0.010084f, 0.022909f, 0.030182f, 0.018603f, -0.016645f, -0.004508f, -0.004857f, -0.014376f, 0.004656f, 0.004670f, 0.013972f, -0.003169f, -0.009824f, 0.008624f, 0.003407f, 0.005158f, 0.027345f, 0.003607f, -0.007563f, -0.010484f, 0.004738f, 0.009702f, 0.021311f, 0.004171f, -0.020635f, -0.011156f, -0.015481f, 0.006062f, 0.007977f, -0.017209f, -0.036383f, 0.011685f, -0.002926f, -0.006230f, -0.012678f, -0.022544f, 0.027235f, -0.010672f, 0.023743f, 0.036882f, -0.041508f, 0.012988f, -0.023680f, 0.069425f, -0.040984f, 0.039253f, 0.036202f, -0.013683f, -0.064710f, -0.037649f, -0.004189f, -0.017182f, -0.001842f, -0.029651f, -0.047114f, -0.062747f, -0.035905f, -0.041765f, 0.018138f, -0.035716f, 0.014987f, 0.004300f, -0.004019f, -0.003655f, -0.029358f, -0.009063f, -0.030162f, 0.008923f, 0.027132f, 0.035452f, 0.000740f, -0.009904f, -0.030962f, -0.007365f, 0.003190f, -0.018430f, 0.005372f, -0.025437f, -0.016507f, -0.003608f, -0.025197f, 0.020057f, -0.022242f, -0.065922f, 0.002549f, -0.002002f, -0.021685f, 0.028153f, 0.022124f, 0.032074f, + 0.012392f, 0.025246f, 0.051096f, 0.008619f, -0.050633f, -0.011538f, 0.023972f, -0.011117f, -0.042071f, 0.023608f, 0.033528f, 0.011308f, -0.000135f, -0.056997f, 0.051061f, -0.002387f, 0.041695f, -0.034473f, 0.042223f, 0.103263f, -0.009033f, -0.002912f, -0.050314f, 0.027203f, -0.040909f, 0.034658f, 0.017688f, -0.022521f, -0.004945f, -0.055684f, 0.012950f, -0.030339f, 0.000586f, 0.021513f, 0.021601f, -0.000700f, -0.014300f, -0.012379f, 0.015435f, 0.037794f, -0.018205f, -0.002870f, 0.005912f, -0.016366f, -0.004675f, -0.005110f, 0.008034f, -0.001740f, 0.015963f, -0.007161f, -0.017979f, -0.009957f, 0.005603f, 0.014370f, -0.017794f, -0.005480f, -0.000152f, 0.002569f, 0.013448f, 0.002988f, -0.004376f, 0.004865f, -0.030279f, -0.017306f, -0.001705f, -0.002669f, 0.006492f, 0.001933f, 0.002651f, -0.000422f, -0.005065f, 0.015684f, -0.000633f, 0.011739f, -0.000545f, -0.003177f, -0.011019f, -0.007534f, -0.081289f, 0.027438f, -0.106585f, 0.070183f, 0.025047f, -0.018312f, 0.074797f, -0.007319f, -0.038295f, 0.066343f, -0.025723f, -0.003733f, 0.013919f, 0.023135f, 0.061302f, 0.002395f, -0.005131f, 0.043269f, + 0.018282f, 0.036322f, 0.044461f, 0.032975f, 0.002929f, 0.023022f, 0.003531f, -0.002417f, -0.024539f, 0.015538f, 0.023276f, 0.005569f, -0.001523f, -0.026441f, 0.012537f, -0.024773f, 0.029609f, 0.029256f, 0.004991f, 0.034583f, -0.021452f, 0.022812f, 0.035833f, 0.022863f, -0.048596f, -0.052183f, 0.061154f, -0.005991f, 0.038217f, 0.059431f, 0.001317f, 0.000016f, -0.006283f, 0.011659f, 0.034278f, 0.032616f, 0.003324f, 0.027094f, -0.000067f, -0.030967f, -0.038707f, -0.057233f, 0.000927f, -0.023247f, 0.000742f, 0.032421f, 0.030291f, -0.053528f, 0.004516f, 0.020761f, -0.047024f, 0.007799f, 0.065235f, -0.028320f, -0.032660f, 0.035066f, -0.037757f, 0.008691f, -0.010667f, 0.068511f, -0.019991f, 0.042328f, -0.021068f, 0.035581f, -0.003418f, 0.013239f, 0.028341f, -0.044720f, -0.013706f, 0.017076f, -0.029718f, 0.021765f, -0.026681f, -0.007330f, -0.015102f, -0.013655f, 0.001841f, -0.007313f, -0.012276f, 0.007219f, 0.020284f, -0.010197f, 0.005486f, 0.007495f, -0.017749f, 0.003192f, 0.002335f, -0.004471f, -0.012575f, -0.005076f, -0.009731f, -0.028659f, -0.011495f, 0.006264f, -0.037830f, 0.013771f, + -0.019427f, 0.014681f, -0.008870f, -0.003538f, -0.026554f, -0.013709f, 0.000243f, 0.007452f, -0.011770f, -0.025678f, 0.004224f, 0.001909f, 0.013780f, 0.006110f, -0.000046f, 0.016958f, 0.013395f, 0.001599f, 0.011496f, 0.007974f, -0.036967f, 0.008506f, -0.042863f, 0.088755f, 0.021932f, -0.047068f, 0.018201f, -0.010765f, -0.041887f, -0.049385f, -0.050132f, 0.015117f, -0.002272f, 0.044632f, 0.066079f, 0.031873f, 0.016165f, -0.007767f, 0.022079f, 0.002303f, -0.082698f, 0.036569f, 0.086306f, -0.056168f, -0.059057f, -0.050978f, -0.072232f, 0.052584f, -0.071126f, 0.032299f, 0.000635f, -0.008723f, -0.000298f, -0.022968f, -0.027421f, 0.035582f, -0.073195f, 0.075601f, 0.043421f, 0.010201f, -0.048116f, -0.036281f, -0.031825f, 0.006946f, 0.012729f, -0.031037f, -0.004198f, -0.022869f, 0.052045f, 0.023723f, -0.009265f, -0.001387f, 0.021459f, 0.004981f, 0.024474f, -0.042279f, -0.016724f, -0.003886f, -0.007436f, -0.039316f, -0.027715f, 0.023646f, -0.075044f, -0.044140f, 0.005789f, 0.088004f, 0.042443f, -0.026584f, -0.001737f, -0.066591f, 0.032541f, 0.102047f, 0.003653f, -0.021737f, -0.015267f, -0.047946f, + 0.062793f, -0.020013f, -0.024204f, -0.001949f, 0.037233f, 0.023526f, -0.032226f, -0.028930f, -0.010362f, 0.032928f, -0.008710f, 0.009755f, -0.002528f, -0.025858f, -0.008409f, 0.041675f, 0.023799f, 0.003555f, -0.019245f, -0.002924f, -0.002902f, 0.032530f, 0.026387f, 0.013343f, 0.011929f, -0.038253f, 0.014706f, 0.013977f, -0.005733f, 0.008863f, -0.005994f, -0.005343f, -0.033615f, -0.003425f, -0.001711f, -0.004615f, -0.010721f, 0.009164f, 0.012342f, 0.006621f, -0.039543f, -0.033888f, -0.016764f, 0.000030f, 0.002413f, -0.039755f, 0.014234f, 0.050295f, 0.010112f, -0.013770f, 0.000944f, 0.007918f, 0.000159f, -0.021616f, -0.016582f, -0.005542f, 0.006802f, 0.000358f, -0.040953f, -0.028140f, -0.082122f, 0.018253f, -0.060436f, -0.090512f, 0.021593f, 0.050427f, 0.012622f, 0.013715f, -0.038143f, -0.047813f, -0.012212f, -0.070957f, -0.034712f, 0.018826f, -0.059305f, 0.094087f, 0.018553f, -0.022840f, 0.020462f, -0.044763f, -0.088624f, -0.029608f, -0.067715f, 0.011002f, 0.020150f, -0.024741f, -0.048078f, -0.024330f, -0.029552f, 0.026276f, -0.035192f, -0.012761f, -0.004317f, 0.040348f, -0.028764f, -0.005135f, + -0.013298f, 0.010433f, 0.017077f, 0.003221f, -0.011721f, 0.041600f, 0.054485f, 0.034809f, -0.027457f, -0.022590f, -0.079417f, -0.044218f, -0.017929f, 0.021250f, 0.134219f, -0.022752f, 0.001869f, 0.059752f, -0.005119f, 0.025516f, -0.030170f, -0.031597f, -0.025350f, 0.028401f, -0.075316f, 0.000675f, -0.009732f, -0.000867f, 0.065721f, -0.028678f, 0.099338f, 0.008853f, 0.075351f, -0.095583f, -0.028400f, 0.027755f, -0.001607f, -0.041438f, -0.034680f, 0.077710f, -0.079742f, -0.065966f, 0.095559f, 0.016844f, 0.083008f, -0.032801f, -0.005211f, -0.005696f, 0.026915f, 0.011431f, -0.007291f, 0.028209f, 0.028511f, -0.001485f, 0.013567f, 0.008928f, 0.003279f, -0.009757f, -0.017520f, -0.004030f, -0.011492f, -0.015764f, 0.015004f, 0.008568f, -0.013074f, 0.009608f, -0.028913f, -0.002865f, 0.020945f, 0.036057f, -0.002584f, -0.022709f, -0.001413f, -0.025855f, 0.015103f, 0.024770f, -0.016965f, -0.014215f, 0.014229f, 0.016511f, -0.036609f, 0.013200f, 0.001949f, 0.024072f, -0.015383f, -0.016214f, 0.000143f, 0.007610f, 0.011547f, -0.041590f, 0.007078f, -0.017648f, 0.033290f, -0.011542f, -0.007413f, -0.004818f, + -0.082079f, 0.039210f, 0.060392f, -0.043662f, -0.035850f, -0.012225f, -0.039383f, -0.047513f, 0.012813f, 0.014125f, 0.037076f, 0.001676f, 0.032416f, 0.057514f, 0.060092f, 0.039835f, 0.013899f, -0.043939f, 0.004453f, 0.022894f, 0.030468f, 0.046649f, 0.000631f, -0.024114f, -0.034966f, -0.013248f, 0.047430f, -0.019391f, 0.018747f, 0.041087f, 0.004198f, 0.080724f, 0.009460f, -0.051525f, 0.044686f, 0.043969f, 0.012845f, 0.018953f, 0.040969f, 0.006509f, 0.003627f, -0.047303f, 0.102324f, -0.108914f, -0.079879f, -0.092914f, -0.030576f, 0.019195f, -0.054425f, 0.028022f, 0.061108f, -0.018101f, 0.006154f, 0.053688f, 0.017352f, -0.058250f, -0.020018f, -0.045094f, -0.006268f, 0.003309f, 0.003159f, 0.051895f, 0.051268f, -0.011793f, -0.012695f, 0.032574f, 0.078844f, 0.013589f, 0.064905f, -0.054627f, 0.057719f, -0.025297f, 0.019274f, -0.011574f, -0.036480f, -0.025609f, -0.005601f, 0.025955f, 0.016166f, 0.064087f, -0.082822f, 0.042174f, -0.032642f, -0.020609f, -0.015965f, 0.030654f, -0.014415f, -0.002998f, 0.006910f, -0.033419f, 0.021081f, -0.016422f, -0.000907f, -0.025412f, 0.008036f, -0.005258f, + 0.001334f, -0.028614f, 0.004447f, -0.002768f, 0.005909f, -0.002948f, -0.030807f, 0.012224f, -0.017450f, -0.016270f, -0.007096f, 0.022949f, 0.027019f, 0.029411f, -0.025168f, 0.050693f, -0.038123f, -0.011777f, 0.003138f, -0.004365f, -0.028113f, -0.015459f, -0.001408f, -0.021484f, 0.006308f, -0.001989f, -0.000689f, -0.002773f, -0.020771f, 0.002457f, -0.003269f, -0.001214f, -0.046523f, -0.093573f, -0.094181f, -0.068173f, 0.013957f, 0.174883f, 0.044180f, -0.024158f, -0.052912f, -0.126427f, -0.177815f, 0.040106f, 0.073607f, 0.088360f, -0.018628f, 0.007626f, -0.052160f, -0.090733f, 0.026123f, 0.016430f, 0.029484f, 0.004226f, -0.076090f, -0.023280f, 0.018555f, -0.015334f, -0.003031f, -0.014433f, 0.099076f, 0.086983f, 0.058652f, -0.005417f, -0.042571f, -0.072296f, -0.047857f, -0.043283f, 0.067665f, -0.011269f, 0.049504f, 0.022351f, 0.023165f, -0.030509f, -0.164711f, -0.113434f, 0.055951f, -0.089271f, -0.030483f, 0.189937f, 0.130601f, 0.098102f, -0.074448f, 0.053705f, -0.051577f, 0.003708f, 0.003733f, 0.027511f, 0.080551f, 0.141969f, -0.054423f, -0.005132f, -0.093698f, -0.075737f, -0.123990f, 0.013382f, + -0.005163f, -0.133528f, -0.032017f, 0.085889f, 0.032078f, 0.059924f, 0.081279f, 0.146472f, -0.106808f, -0.064156f, 0.008423f, -0.087225f, -0.011285f, 0.048642f, 0.114100f, 0.057949f, 0.017767f, -0.069752f, -0.066851f, 0.044996f, -0.019081f, 0.067184f, 0.059085f, -0.016066f, 0.027032f, 0.010788f, -0.011452f, -0.022485f, -0.013106f, -0.008547f, 0.020015f, 0.005722f, -0.000595f, 0.006887f, -0.002172f, 0.009600f, 0.000176f, 0.042461f, 0.034912f, 0.055380f, 0.009901f, -0.030617f, -0.064314f, -0.052581f, 0.021239f, 0.049741f, 0.057015f, -0.007291f, -0.036629f, -0.147824f, -0.076030f, -0.070051f, 0.001541f, 0.007349f, 0.014949f, -0.000663f, 0.010848f, -0.016866f, -0.000240f, -0.024896f, -0.022303f, 0.031087f, 0.027377f, 0.015869f, 0.015985f, 0.007977f, 0.003476f, 0.006941f, 0.043263f, -0.070326f, -0.232775f, -0.216605f, -0.124357f, -0.135223f, -0.033755f, 0.224153f, 0.113859f, 0.230622f, 0.204630f, 0.320801f, 0.229080f, 0.197076f, 0.031754f, -0.085573f, -0.193478f, -0.309970f, -0.263274f, -0.265109f, -0.138604f, -0.066519f, -0.015671f, 0.002210f, 0.007570f, 0.054730f, 0.073093f, 0.184475f, + 0.111978f, 0.217703f, 0.141762f, 0.186619f, 0.067462f, 0.180324f, 0.062588f, 0.044125f, 0.042619f, -0.010712f, -0.050677f, -0.122047f, -0.140917f, -0.261477f, -0.179194f, -0.331342f, -0.262232f, -0.402151f, -0.238502f, -0.189175f, -0.045717f, 0.110550f, 0.058717f, 0.009963f, 0.110265f, 0.235860f, 0.314960f, 0.413071f, 0.492264f, 0.421318f, 0.307681f, 0.383828f, 0.316586f, 0.177560f, 0.079760f, -0.019632f, -0.132108f, -0.305422f, -0.362895f, -0.485822f, -0.627396f, -0.725912f, -0.655206f, -0.577330f, -0.411012f, -0.280497f, 0.085879f, 0.270683f, 0.329740f, 0.507984f, 0.423993f, 0.529774f, 0.556596f, 0.546180f, 0.629450f, 0.413361f, 0.107273f, -0.103930f, -0.201838f, -0.249607f, -0.161776f, -0.233753f, -0.200589f, -0.233934f, -0.316835f, -0.320257f, -0.373074f, -0.220726f, -0.172028f, -0.146453f, -0.082011f, -0.004835f, 0.021925f, 0.090738f, 0.245843f, 0.259295f, 0.367850f, 0.320443f, 0.420717f, 0.309611f, 0.206696f, 0.213542f, 0.081268f, -0.055772f, -0.091419f, -0.405660f, -0.523332f, -0.487013f, -0.430024f, -0.251515f, -0.197641f, -0.107798f, 0.009407f, 0.109975f, 0.167166f, 0.227612f, + 0.271340f, 0.323039f, 0.306404f, 0.290052f, 0.255051f, 0.142948f, -0.000559f, -0.071733f, -0.168226f, -0.175549f, -0.150706f, -0.122519f, -0.128137f, -0.129166f, -0.101815f, -0.072423f, -0.043044f, -0.017112f, -0.016076f, -0.010582f, 0.004417f, -0.010970f, -0.013788f, 0.019870f, 0.043324f, 0.049371f, 0.032707f, 0.025410f, 0.038991f, 0.049881f, 0.039200f, 0.047594f, 0.062561f, 0.076384f, 0.064983f, 0.015749f, -0.007693f, -0.002733f, -0.003259f, -0.021075f, -0.018254f, -0.012758f, -0.029404f, -0.048270f, -0.060796f, -0.057696f, -0.050808f, -0.040841f, -0.033893f, -0.019498f, -0.007762f, -0.004352f, -0.001928f, 0.009301f, 0.018777f, 0.024918f, 0.026997f, 0.028817f, 0.023413f, 0.019272f, 0.018756f, 0.012283f, 0.002715f, 0.006088f, 0.007461f, 0.002736f, -0.002870f, -0.004533f, -0.000223f, 0.008961f, 0.012463f, 0.010831f, 0.009391f, 0.013947f, 0.011015f, 0.003236f, -0.003758f, -0.008027f, -0.011503f, -0.014432f, -0.023969f, -0.029054f, -0.027532f, -0.029036f, -0.034503f, -0.026789f, -0.010231f, 0.001124f, 0.003669f, 0.010035f, 0.018584f, 0.023472f, 0.021017f, 0.021034f, 0.023303f, 0.021449f, + 0.015819f, 0.011317f, 0.006422f, 0.003140f, -0.000660f, -0.003507f, -0.003934f, -0.003546f, -0.004361f, -0.005804f, -0.006205f, -0.005352f, -0.004724f, -0.004307f, -0.003646f, -0.002701f, -0.002041f, -0.001528f, -0.001261f, -0.000970f}, + {-0.022232f, 0.008364f, -0.012631f, 0.006954f, -0.007097f, -0.014627f, -0.025330f, 0.004552f, 0.000825f, 0.006468f, 0.005692f, -0.001694f, -0.001796f, 0.001997f, 0.015427f, -0.010826f, -0.019390f, 0.006528f, -0.007982f, -0.012961f, 0.000298f, -0.001868f, 0.008123f, 0.002951f, 0.005813f, -0.005782f, -0.001390f, -0.003765f, 0.013147f, -0.003491f, -0.005226f, -0.004582f, -0.002245f, -0.003085f, -0.005192f, -0.004565f, -0.003160f, 0.002665f, 0.001168f, 0.001786f, 0.000504f, 0.003480f, 0.005610f, 0.002893f, -0.004889f, -0.014699f, -0.000093f, -0.010199f, 0.001546f, -0.000626f, -0.004628f, 0.006681f, 0.000500f, 0.000118f, -0.014670f, -0.005942f, 0.002019f, -0.001083f, 0.005189f, 0.000447f, 0.004621f, -0.004202f, 0.001942f, -0.001782f, 0.009124f, -0.003148f, 0.004824f, -0.008054f, -0.008049f, -0.010157f, 0.000547f, -0.002356f, -0.002945f, 0.000139f, -0.003537f, 0.000008f, -0.004133f, 0.000957f, 0.000219f, -0.001684f, -0.006409f, 0.000716f, 0.000701f, 0.003779f, 0.003293f, 0.000105f, 0.003505f, -0.000294f, -0.002670f, -0.000815f, -0.001249f, 0.001431f, -0.000003f, 0.000266f, 0.001983f, 0.001500f, + -0.000228f, 0.001863f, -0.001175f, 0.000443f, -0.015948f, -0.003276f, -0.002075f, -0.004504f, -0.002023f, -0.005432f, 0.005312f, -0.002134f, -0.001839f, -0.000430f, 0.000137f, -0.000297f, -0.003826f, 0.014181f, 0.009127f, 0.014821f, -0.006905f, 0.014753f, -0.008702f, -0.006094f, 0.005748f, 0.016335f, -0.000339f, -0.009862f, -0.014578f, -0.010462f, -0.002000f, 0.011653f, 0.004586f, 0.003961f, 0.005176f, -0.005085f, 0.007929f, 0.001033f, 0.005928f, -0.002861f, -0.013288f, 0.003645f, -0.009191f, -0.006280f, -0.006446f, -0.001512f, -0.016877f, -0.000758f, 0.000807f, -0.007033f, 0.015786f, -0.002969f, -0.005092f, -0.006318f, -0.000151f, 0.001763f, -0.006754f, 0.000255f, -0.008286f, -0.003096f, 0.000233f, -0.003394f, 0.011347f, 0.000376f, -0.003053f, 0.006381f, 0.004078f, 0.010534f, 0.004225f, 0.012659f, 0.003113f, 0.010356f, -0.011781f, 0.003087f, 0.009418f, -0.003194f, -0.008417f, -0.011559f, -0.000228f, -0.000879f, -0.002318f, 0.002880f, 0.003407f, -0.002430f, 0.009027f, -0.007738f, 0.002996f, 0.003184f, -0.005790f, 0.004257f, 0.000947f, -0.004201f, 0.002264f, -0.001035f, 0.000890f, -0.003934f, + 0.001229f, 0.000531f, 0.000734f, -0.000409f, -0.000283f, 0.002000f, 0.000505f, 0.003670f, -0.000742f, 0.000360f, 0.018019f, -0.008278f, -0.006385f, 0.001746f, -0.004095f, -0.003064f, 0.009007f, -0.007123f, 0.008671f, 0.003942f, 0.000131f, 0.004394f, -0.005913f, -0.005640f, -0.010325f, -0.011124f, 0.014510f, 0.006824f, 0.005067f, 0.007728f, -0.005155f, -0.003466f, -0.003807f, 0.018337f, -0.007175f, 0.020077f, -0.000732f, -0.005191f, -0.004902f, -0.010731f, -0.011523f, -0.013984f, -0.000909f, -0.003571f, 0.002471f, 0.013386f, -0.001193f, -0.006369f, -0.018803f, 0.000589f, 0.014858f, 0.021810f, -0.010309f, 0.005582f, 0.003988f, -0.005632f, -0.004991f, 0.005640f, 0.020687f, -0.005013f, 0.003225f, -0.001846f, -0.003062f, -0.002011f, 0.009907f, 0.014280f, -0.010900f, -0.005966f, 0.004418f, 0.018744f, 0.003109f, 0.013256f, -0.010918f, -0.010167f, -0.000583f, -0.001740f, 0.003785f, 0.002787f, -0.000271f, 0.001110f, 0.001925f, -0.004972f, 0.002260f, 0.006019f, 0.004651f, -0.003755f, 0.012001f, -0.003137f, 0.007534f, -0.004020f, -0.004170f, 0.004447f, 0.003777f, 0.004013f, 0.000895f, 0.004188f, + 0.000793f, -0.006322f, -0.004269f, 0.001147f, -0.000324f, 0.002235f, -0.001198f, 0.003374f, -0.000175f, 0.001853f, -0.001887f, -0.000416f, -0.000188f, -0.000987f, -0.002192f, -0.000267f, -0.001345f, -0.000402f, -0.001613f, -0.001431f, 0.003378f, -0.000118f, -0.001656f, 0.003621f, 0.000051f, -0.001956f, 0.029775f, -0.020383f, -0.004463f, -0.008441f, 0.002377f, 0.007965f, 0.014330f, -0.014222f, 0.009840f, -0.003680f, -0.015047f, -0.024379f, -0.004951f, -0.010329f, 0.001790f, -0.002283f, -0.010274f, -0.005227f, 0.005753f, 0.006082f, 0.019155f, 0.010650f, 0.009776f, 0.001056f, 0.003086f, -0.009842f, -0.006637f, 0.015403f, 0.011815f, 0.008035f, 0.003764f, 0.007421f, 0.001644f, 0.000126f, -0.012746f, -0.018069f, 0.012204f, -0.004773f, -0.012130f, -0.005756f, -0.007596f, 0.006551f, -0.006679f, 0.015475f, 0.003637f, -0.008815f, -0.004247f, -0.006736f, -0.005813f, 0.007594f, 0.011405f, -0.000905f, 0.007717f, -0.005529f, -0.006154f, 0.000111f, 0.001621f, -0.005898f, -0.002227f, 0.008965f, 0.000202f, -0.003606f, -0.004279f, 0.004915f, 0.005504f, -0.000619f, 0.006633f, 0.000975f, -0.004520f, 0.015440f, + -0.002083f, 0.001761f, 0.000850f, -0.018451f, 0.007339f, 0.005876f, 0.009726f, 0.006330f, -0.006664f, -0.001484f, -0.016587f, -0.007615f, -0.015210f, -0.005562f, -0.006751f, 0.000123f, 0.001585f, -0.010044f, 0.000567f, -0.002381f, 0.000157f, 0.004367f, -0.001402f, -0.001806f, -0.000206f, -0.002740f, 0.000632f, -0.001370f, 0.001291f, -0.001665f, -0.003632f, -0.001846f, -0.000817f, -0.006268f, -0.000435f, -0.000241f, 0.001452f, -0.000343f, 0.000922f, -0.000297f, 0.000300f, -0.003332f, -0.004224f, 0.000485f, -0.000485f, -0.001908f, 0.000975f, -0.004869f, -0.020368f, 0.005136f, 0.000118f, -0.006098f, -0.011200f, 0.004552f, -0.010709f, -0.002037f, 0.018246f, 0.027705f, 0.013585f, 0.015190f, -0.001245f, -0.007804f, 0.011383f, 0.010195f, 0.004236f, 0.005404f, 0.013591f, -0.002107f, 0.009853f, 0.009577f, 0.014103f, 0.013539f, -0.011271f, 0.009047f, -0.000834f, 0.003118f, -0.010512f, 0.003080f, -0.001511f, 0.009225f, -0.003728f, -0.002726f, -0.007464f, 0.006688f, -0.011506f, -0.009339f, 0.000792f, 0.009694f, 0.005215f, -0.005989f, -0.003191f, -0.001909f, -0.004036f, 0.005820f, -0.013829f, 0.012506f, + -0.000200f, 0.015580f, -0.022390f, 0.001478f, -0.020182f, -0.006418f, -0.006533f, 0.005374f, -0.002245f, -0.004658f, 0.004248f, 0.001565f, 0.005248f, 0.008564f, 0.014052f, -0.001854f, -0.011572f, 0.002363f, 0.018985f, 0.003818f, -0.005706f, -0.001492f, 0.011641f, -0.006317f, 0.007018f, -0.006105f, -0.020626f, 0.011738f, 0.012368f, 0.011544f, -0.010283f, -0.015258f, -0.011117f, 0.012779f, -0.001556f, -0.002048f, 0.008925f, 0.003286f, 0.002067f, 0.001489f, -0.000824f, 0.003465f, 0.004561f, -0.001657f, -0.002777f, 0.002602f, 0.000094f, -0.000969f, 0.001420f, -0.002636f, 0.000550f, 0.004064f, -0.001908f, 0.004274f, -0.002022f, -0.003286f, 0.001328f, -0.000160f, -0.000183f, 0.002135f, 0.001476f, 0.002170f, 0.001540f, 0.001543f, -0.000336f, 0.002095f, -0.001561f, -0.030485f, 0.000541f, -0.006739f, 0.002830f, -0.017061f, 0.002107f, 0.002849f, 0.022674f, -0.018098f, 0.000249f, -0.024287f, 0.005560f, -0.014664f, -0.003563f, 0.000924f, -0.007945f, 0.007061f, 0.003130f, -0.012700f, 0.000253f, -0.000162f, 0.011789f, -0.007663f, 0.018980f, -0.000198f, -0.016422f, -0.008357f, 0.020196f, -0.001908f, + 0.008094f, 0.005406f, -0.003318f, 0.012103f, -0.013343f, -0.012603f, -0.009821f, 0.001418f, -0.012780f, 0.013635f, -0.007480f, 0.008762f, -0.012376f, -0.000104f, -0.015040f, 0.009929f, 0.001332f, 0.011886f, 0.010589f, -0.009981f, 0.019903f, 0.017014f, 0.016026f, 0.003217f, 0.016826f, 0.013873f, -0.014270f, 0.012304f, 0.005856f, 0.001182f, -0.013249f, 0.006162f, -0.011276f, 0.011238f, -0.004848f, -0.008840f, -0.001083f, 0.016742f, 0.005937f, -0.019149f, 0.018311f, -0.001451f, -0.006481f, -0.010916f, 0.018649f, 0.016199f, -0.013911f, 0.013826f, -0.001003f, -0.016512f, 0.000197f, -0.009356f, -0.005179f, 0.009182f, -0.007998f, 0.006576f, -0.000678f, 0.002950f, -0.003838f, 0.005027f, -0.000696f, -0.000442f, -0.001119f, -0.001767f, 0.001747f, 0.001033f, -0.004652f, 0.001726f, 0.002298f, 0.000067f, 0.001709f, 0.002098f, -0.004370f, 0.001013f, -0.000538f, 0.000165f, -0.003689f, 0.001380f, -0.001522f, -0.002146f, -0.004905f, 0.005703f, 0.001157f, -0.002585f, -0.000775f, 0.001576f, -0.000597f, 0.043542f, 0.007397f, -0.001742f, -0.015019f, -0.028214f, 0.007199f, -0.004160f, -0.041410f, 0.036322f, + -0.017603f, -0.026282f, 0.005550f, -0.001682f, 0.004892f, -0.001701f, 0.007039f, 0.010472f, 0.000137f, -0.000672f, -0.021163f, -0.001762f, -0.002010f, 0.024948f, -0.004560f, 0.000645f, 0.009182f, -0.004382f, -0.003074f, -0.010157f, 0.021305f, -0.015990f, 0.015394f, -0.003803f, -0.012768f, 0.002386f, -0.014274f, -0.007260f, -0.023182f, 0.004079f, 0.010641f, -0.006272f, -0.011567f, -0.009158f, 0.014010f, -0.021733f, -0.005140f, -0.010720f, -0.000305f, -0.003120f, 0.002827f, -0.018856f, 0.018362f, -0.025742f, -0.017601f, 0.006975f, 0.003106f, -0.000983f, 0.006872f, -0.013356f, -0.019210f, 0.002374f, -0.005226f, -0.000888f, 0.009427f, -0.011491f, 0.008546f, 0.005942f, 0.021186f, -0.005880f, 0.003037f, -0.001643f, 0.000303f, 0.029369f, 0.002459f, 0.029078f, -0.007027f, -0.010936f, 0.003312f, -0.014974f, -0.001338f, 0.014854f, 0.001192f, -0.017421f, -0.015242f, 0.004260f, -0.001624f, 0.000053f, 0.014927f, 0.001148f, -0.002814f, 0.006188f, -0.000858f, -0.000618f, -0.006983f, 0.002568f, 0.003259f, -0.003523f, -0.000104f, -0.001741f, 0.005758f, -0.002626f, -0.001176f, 0.002943f, 0.000758f, 0.001780f, + -0.000557f, 0.003283f, -0.001096f, -0.000003f, 0.001751f, -0.003675f, 0.004529f, -0.002900f, 0.001670f, 0.003794f, 0.002066f, 0.003582f, 0.000978f, -0.031881f, -0.004116f, -0.006429f, -0.025848f, -0.044558f, 0.013834f, 0.023247f, -0.016283f, -0.007794f, 0.013183f, -0.004741f, 0.027879f, -0.003023f, -0.014779f, -0.008777f, -0.041517f, 0.014139f, 0.004775f, -0.003712f, -0.029138f, 0.006988f, -0.016169f, -0.004201f, -0.014183f, -0.007220f, 0.020850f, -0.019844f, 0.008679f, -0.029423f, 0.018981f, 0.003850f, 0.000464f, -0.008427f, 0.002320f, -0.003768f, -0.016405f, -0.030983f, 0.006123f, 0.000142f, 0.006747f, 0.013116f, -0.007455f, -0.002400f, -0.019891f, -0.010189f, -0.005257f, 0.008556f, 0.005821f, 0.014826f, 0.023625f, 0.018491f, 0.009563f, 0.014131f, 0.004366f, 0.014725f, 0.013264f, -0.012734f, 0.015180f, 0.017132f, -0.003402f, 0.022913f, -0.002278f, 0.026867f, -0.011744f, -0.028668f, -0.004599f, 0.018447f, 0.020297f, 0.023305f, -0.004377f, -0.040037f, -0.003929f, -0.002033f, 0.001626f, -0.001255f, -0.009765f, 0.005861f, -0.029180f, 0.022905f, 0.014488f, 0.013931f, -0.015227f, -0.014381f, + -0.003088f, 0.008586f, -0.000928f, -0.016099f, 0.000253f, -0.007810f, -0.013066f, -0.005187f, -0.002070f, -0.006201f, 0.000703f, -0.005225f, 0.002781f, -0.003220f, -0.001709f, 0.004336f, 0.000910f, 0.002035f, -0.001987f, -0.005685f, -0.006308f, 0.004595f, -0.005007f, -0.000075f, -0.001755f, 0.002867f, -0.001973f, -0.001206f, -0.001951f, 0.006843f, 0.003688f, 0.002166f, -0.001976f, 0.042729f, -0.009407f, -0.010270f, 0.014248f, 0.023000f, -0.001655f, 0.010698f, 0.026644f, 0.019238f, -0.043751f, -0.040213f, 0.000328f, -0.003880f, 0.005897f, -0.017985f, -0.031915f, 0.007560f, 0.025590f, 0.016884f, -0.018524f, 0.030079f, 0.024326f, 0.022807f, -0.038339f, 0.010835f, 0.020118f, 0.001008f, 0.003069f, 0.017094f, 0.039516f, -0.007663f, -0.018046f, 0.011956f, 0.008969f, -0.005411f, 0.021369f, 0.031849f, 0.005971f, 0.032995f, 0.014456f, -0.024823f, 0.002815f, 0.027354f, -0.002935f, -0.011282f, 0.014211f, 0.002254f, 0.005422f, 0.028708f, 0.018486f, 0.009741f, 0.003440f, -0.033415f, -0.033968f, -0.002884f, 0.005422f, 0.008839f, -0.010456f, -0.001523f, -0.008752f, 0.002941f, 0.004282f, -0.012780f, + 0.004866f, -0.007864f, -0.001939f, -0.010868f, 0.001268f, 0.021195f, -0.012514f, -0.030737f, -0.004743f, -0.026151f, 0.005803f, -0.009364f, -0.000625f, -0.003551f, 0.012382f, -0.004659f, 0.008983f, -0.000162f, 0.007715f, 0.003571f, -0.003491f, -0.004209f, -0.005258f, -0.015187f, 0.005576f, 0.001929f, 0.003859f, 0.000463f, -0.011644f, 0.005844f, -0.009093f, -0.007746f, -0.002601f, -0.009934f, -0.002016f, -0.003274f, -0.003622f, -0.003150f, 0.006503f, -0.002878f, 0.004362f, -0.000434f, 0.003526f, 0.000580f, 0.008383f, -0.003613f, 0.002328f, -0.006726f, -0.001619f, -0.005771f, -0.005167f, -0.001115f, -0.003786f, 0.012744f, 0.005470f, 0.000465f, -0.001690f, -0.001811f, -0.071072f, -0.044222f, -0.013184f, 0.013266f, -0.004085f, -0.017523f, 0.003480f, -0.017073f, 0.050255f, -0.019955f, 0.032341f, 0.049591f, 0.027017f, 0.024567f, -0.019018f, 0.017737f, -0.009303f, -0.022616f, 0.020183f, 0.023508f, 0.015676f, 0.033470f, 0.000456f, -0.001493f, -0.014431f, -0.014805f, -0.012609f, -0.020477f, -0.019931f, -0.013619f, 0.007976f, 0.003000f, 0.000052f, -0.012813f, -0.006866f, -0.019873f, 0.008600f, -0.017144f, + -0.015529f, -0.006861f, 0.008640f, 0.000074f, -0.010404f, -0.029031f, 0.003734f, -0.008480f, 0.010815f, -0.034278f, -0.026433f, 0.030353f, -0.004383f, -0.005696f, -0.013745f, -0.008430f, 0.022868f, 0.007472f, -0.004462f, 0.012541f, -0.003163f, 0.013042f, 0.010479f, 0.014862f, -0.010344f, -0.017260f, -0.043566f, 0.003161f, -0.042246f, -0.002772f, -0.035727f, -0.005079f, 0.034222f, -0.004187f, 0.006246f, -0.024151f, -0.010283f, -0.012416f, 0.002938f, -0.015479f, -0.008842f, 0.015410f, 0.019237f, -0.001882f, -0.001722f, 0.002252f, -0.008472f, 0.003312f, -0.000776f, -0.008438f, -0.003283f, -0.007212f, -0.002662f, -0.004068f, -0.019497f, 0.003513f, -0.003098f, -0.002486f, 0.001424f, -0.005319f, -0.006177f, -0.013489f, -0.002968f, -0.007776f, -0.009161f, -0.001685f, -0.011591f, -0.005426f, 0.002161f, -0.007335f, -0.008392f, 0.001139f, -0.006982f, 0.002468f, 0.003014f, 0.008555f, -0.004919f, 0.006001f, 0.003032f, -0.007675f, -0.002705f, -0.001794f, -0.003368f, 0.001618f, -0.001493f, -0.002181f, 0.049151f, 0.000969f, -0.035587f, -0.030174f, 0.030834f, 0.024182f, -0.022782f, -0.022002f, 0.041339f, 0.026279f, + 0.001516f, -0.024525f, 0.002961f, -0.010306f, 0.019601f, -0.015213f, 0.002325f, -0.006436f, -0.004521f, 0.042760f, -0.006054f, -0.011621f, 0.007917f, 0.007295f, 0.012767f, 0.013228f, 0.001437f, -0.016844f, 0.012753f, 0.006490f, 0.014614f, 0.033092f, 0.015114f, -0.047569f, -0.013652f, -0.007726f, -0.036471f, 0.014147f, -0.006362f, 0.000785f, -0.020350f, 0.017210f, -0.007936f, 0.003328f, -0.026459f, 0.017962f, -0.021566f, 0.001818f, 0.021151f, -0.003352f, 0.022312f, -0.017412f, 0.027838f, -0.035710f, 0.017801f, 0.000464f, -0.012957f, 0.046852f, 0.012405f, -0.009666f, -0.027982f, 0.012208f, -0.005819f, 0.003921f, -0.004330f, 0.017193f, 0.025436f, 0.034477f, -0.021869f, 0.015545f, -0.008735f, 0.030853f, 0.011169f, 0.004488f, -0.002949f, 0.018540f, 0.003170f, -0.012127f, 0.014857f, -0.010548f, -0.018141f, -0.007700f, -0.024629f, 0.000426f, -0.027581f, -0.002220f, -0.018641f, 0.021264f, -0.006864f, 0.013715f, -0.014967f, 0.000679f, -0.008458f, 0.012958f, -0.004249f, -0.001101f, -0.008391f, 0.004467f, -0.006346f, -0.009788f, -0.005909f, 0.004431f, -0.009773f, 0.005956f, -0.007792f, 0.003713f, + -0.005126f, -0.004618f, -0.005129f, -0.010415f, -0.006382f, 0.000418f, -0.007945f, -0.006848f, 0.009514f, 0.008627f, 0.004350f, -0.004738f, -0.012671f, -0.001150f, 0.005135f, -0.000275f, -0.009904f, -0.005566f, -0.000971f, -0.071438f, -0.046238f, 0.038564f, -0.028175f, -0.026435f, 0.014888f, 0.033771f, -0.055460f, -0.009147f, 0.013311f, 0.003660f, -0.028916f, -0.043376f, 0.081687f, -0.035102f, 0.011168f, -0.039921f, 0.022134f, -0.013852f, 0.038242f, 0.033988f, 0.003513f, 0.006095f, -0.045238f, 0.000026f, 0.021522f, -0.018281f, -0.026935f, 0.021571f, 0.006175f, 0.023252f, 0.018506f, -0.003758f, 0.007826f, -0.005010f, -0.002789f, 0.034250f, -0.028941f, -0.016976f, 0.027502f, -0.001025f, -0.021821f, 0.029102f, -0.000773f, -0.006276f, -0.019491f, -0.008552f, 0.010815f, -0.015207f, -0.001635f, 0.010315f, -0.019335f, -0.019824f, -0.012852f, 0.014814f, -0.042098f, 0.020279f, -0.001813f, 0.040269f, -0.037610f, 0.012673f, -0.028573f, 0.010720f, -0.017104f, -0.021848f, 0.036337f, -0.019883f, -0.008689f, -0.019352f, 0.015783f, -0.022154f, 0.013310f, -0.007450f, 0.026614f, 0.027287f, -0.003275f, -0.042208f, + 0.017052f, 0.017746f, -0.001893f, -0.001219f, -0.024033f, -0.016584f, -0.003874f, -0.020706f, -0.016610f, -0.005770f, -0.000355f, -0.010241f, -0.013627f, 0.015881f, 0.005430f, -0.009706f, -0.008079f, -0.009921f, -0.010479f, 0.011585f, 0.004382f, 0.002890f, -0.015823f, -0.005975f, 0.013898f, -0.007864f, -0.009648f, 0.006572f, -0.006861f, 0.000178f, 0.005169f, 0.008137f, -0.003108f, -0.013094f, 0.002812f, 0.008017f, -0.017491f, 0.000537f, 0.004758f, 0.000550f, -0.009131f, -0.005187f, 0.000638f, -0.004070f, 0.036081f, 0.017602f, -0.040357f, 0.013937f, 0.043672f, -0.003703f, 0.000215f, 0.020239f, -0.012915f, 0.030681f, 0.027743f, -0.036390f, -0.022302f, -0.006587f, 0.019397f, 0.035027f, 0.006290f, 0.018687f, 0.039454f, 0.029619f, -0.041314f, -0.004286f, 0.065871f, 0.016409f, -0.004299f, -0.007601f, -0.012299f, -0.019153f, 0.005879f, 0.016297f, 0.018040f, 0.016900f, -0.011692f, -0.027908f, 0.007625f, -0.014419f, 0.015498f, 0.045606f, -0.012006f, -0.045398f, 0.054644f, -0.016249f, -0.030007f, 0.044422f, -0.007913f, -0.012971f, -0.047271f, -0.008303f, 0.019622f, 0.009554f, -0.010230f, -0.019756f, + 0.018336f, 0.002174f, -0.021879f, 0.019032f, -0.004352f, 0.043384f, -0.031710f, 0.004744f, -0.006161f, 0.049681f, 0.016886f, -0.069975f, 0.022056f, -0.029090f, -0.012285f, -0.024843f, 0.030414f, 0.100791f, 0.036754f, 0.006113f, 0.023290f, 0.029544f, -0.037044f, -0.015440f, -0.010406f, -0.020873f, -0.012781f, -0.023127f, 0.022147f, -0.051317f, -0.013664f, 0.004977f, 0.006194f, -0.016603f, 0.003234f, 0.009427f, -0.005034f, -0.006224f, 0.017583f, 0.003565f, 0.011745f, 0.010092f, -0.010569f, 0.003349f, 0.008702f, 0.003673f, 0.007281f, -0.004932f, 0.004476f, -0.009653f, 0.001359f, -0.002654f, -0.009578f, -0.004668f, -0.002156f, 0.016141f, 0.000895f, 0.004499f, 0.000667f, -0.002847f, -0.003209f, 0.001759f, -0.001382f, -0.014141f, -0.001741f, 0.002823f, -0.003441f, -0.010773f, -0.026205f, -0.009041f, -0.007927f, 0.015948f, -0.002655f, 0.002916f, -0.015378f, -0.053257f, -0.022692f, 0.003593f, -0.021657f, -0.067019f, 0.058021f, -0.011206f, 0.026120f, 0.004893f, -0.030764f, -0.052887f, -0.050970f, 0.057044f, 0.034712f, 0.013049f, -0.020196f, -0.038245f, -0.028676f, -0.045405f, -0.011720f, 0.016858f, + -0.007123f, 0.003650f, 0.007169f, -0.007500f, -0.023565f, -0.022647f, -0.038624f, -0.013891f, -0.007479f, 0.018900f, 0.013159f, 0.020784f, -0.010411f, -0.017317f, -0.007306f, 0.027183f, 0.003803f, 0.024060f, -0.080680f, -0.019051f, -0.000182f, 0.017628f, -0.025792f, -0.001194f, -0.029843f, 0.023263f, 0.020461f, 0.003862f, 0.099493f, 0.001512f, 0.031040f, 0.040903f, 0.001701f, 0.013163f, 0.000545f, -0.007240f, -0.012054f, 0.020575f, 0.030233f, 0.039568f, -0.000970f, -0.007565f, 0.002643f, 0.025967f, 0.023587f, 0.000763f, 0.019105f, 0.016491f, 0.012830f, -0.005390f, 0.038885f, -0.011331f, 0.049922f, -0.049526f, -0.024812f, -0.060895f, -0.019037f, 0.010780f, 0.001362f, -0.015855f, 0.003145f, -0.000310f, 0.027112f, -0.005626f, 0.032502f, -0.015036f, -0.012244f, -0.016512f, 0.008292f, 0.018225f, -0.003124f, -0.009019f, -0.010049f, 0.011208f, 0.000005f, 0.037931f, -0.006200f, -0.002721f, 0.006647f, 0.010571f, 0.015496f, -0.013261f, -0.001365f, 0.004992f, 0.007541f, -0.018264f, 0.006108f, 0.006821f, 0.023112f, -0.023189f, 0.012903f, 0.008699f, -0.010066f, 0.019696f, -0.011407f, -0.013668f, + -0.000165f, -0.004702f, 0.009891f, 0.004982f, -0.008407f, -0.000341f, 0.008065f, 0.001843f, 0.020043f, -0.001046f, 0.013002f, 0.037248f, -0.007512f, 0.001124f, 0.009407f, -0.052259f, 0.001622f, 0.006883f, 0.032008f, 0.049126f, -0.042815f, 0.008827f, -0.027196f, 0.034866f, 0.031543f, 0.003532f, 0.061063f, 0.018691f, 0.023986f, -0.022986f, -0.004164f, -0.039853f, 0.061006f, -0.036299f, 0.009066f, 0.037146f, -0.009518f, -0.024742f, 0.018468f, -0.006054f, 0.009068f, 0.039924f, 0.000492f, -0.013330f, -0.004282f, 0.007076f, -0.001835f, -0.024494f, 0.017211f, -0.002795f, -0.007367f, 0.068537f, -0.053613f, 0.049451f, 0.031686f, 0.061837f, 0.024835f, -0.044557f, 0.033544f, 0.000203f, 0.031130f, 0.081595f, -0.059767f, -0.025014f, -0.008181f, 0.001115f, 0.055244f, -0.033585f, 0.002342f, -0.036029f, 0.002229f, 0.062449f, -0.007652f, 0.064827f, 0.017843f, 0.010700f, 0.029125f, -0.040354f, -0.007164f, 0.028248f, 0.040075f, -0.066487f, -0.002920f, -0.057030f, 0.024778f, -0.029874f, -0.001542f, 0.012932f, 0.017860f, 0.000953f, -0.020695f, -0.016480f, -0.062428f, -0.007482f, -0.044518f, 0.035200f, + 0.002512f, -0.003222f, 0.027179f, 0.001117f, -0.000719f, 0.026224f, 0.019323f, 0.012973f, -0.000252f, -0.009417f, 0.011995f, -0.021321f, -0.002145f, -0.014758f, 0.013746f, 0.014495f, -0.013214f, -0.002847f, -0.027432f, 0.011491f, -0.002259f, -0.000436f, -0.001328f, -0.026462f, -0.032003f, -0.010795f, 0.009560f, 0.023421f, 0.011511f, 0.010355f, -0.004400f, 0.019563f, 0.013271f, -0.001263f, -0.010770f, 0.016980f, -0.025348f, -0.007327f, 0.004534f, 0.027618f, 0.022514f, 0.004649f, -0.010998f, -0.039728f, 0.011501f, -0.069719f, -0.061394f, 0.001138f, 0.001112f, -0.038927f, 0.032050f, 0.009420f, -0.010421f, -0.036118f, 0.049686f, -0.011315f, 0.073830f, -0.010549f, 0.016084f, 0.026740f, -0.035591f, -0.011778f, 0.011442f, -0.042521f, -0.023823f, -0.037171f, 0.032279f, -0.029753f, -0.007926f, -0.009673f, 0.027971f, -0.025073f, -0.042398f, -0.059275f, -0.001560f, 0.049534f, 0.003127f, -0.027119f, -0.011439f, -0.034374f, -0.011401f, 0.000398f, 0.020754f, -0.038740f, -0.004200f, -0.008372f, -0.027551f, -0.038085f, 0.001964f, 0.006461f, 0.024825f, 0.008537f, 0.042559f, 0.011835f, 0.053670f, -0.022269f, + 0.044339f, -0.011212f, -0.034366f, -0.008952f, 0.072024f, -0.030998f, 0.032904f, -0.022716f, 0.052888f, -0.027861f, 0.017947f, 0.033499f, -0.001845f, -0.013774f, 0.006541f, -0.019061f, 0.048119f, -0.043935f, -0.016408f, 0.047894f, -0.005734f, -0.039930f, 0.002051f, 0.036609f, 0.020510f, 0.036607f, -0.036783f, -0.031402f, -0.019783f, -0.004043f, 0.036262f, 0.043640f, -0.077064f, 0.004091f, 0.022545f, -0.042392f, 0.007186f, 0.026774f, 0.021036f, 0.019639f, 0.019379f, 0.012819f, -0.005712f, 0.001405f, 0.014906f, 0.016431f, 0.013610f, 0.032987f, -0.009803f, 0.017332f, 0.007556f, 0.035703f, 0.021495f, -0.027607f, -0.034638f, 0.011073f, 0.037770f, -0.010721f, -0.010154f, -0.023951f, -0.040509f, 0.004654f, -0.034530f, -0.010974f, 0.008218f, -0.023202f, 0.021861f, 0.006133f, -0.006968f, -0.019176f, -0.003409f, -0.019880f, -0.001340f, 0.010947f, 0.005486f, 0.003051f, -0.003177f, -0.004925f, -0.067295f, 0.072224f, -0.025133f, 0.061379f, -0.013797f, 0.049148f, 0.003387f, -0.016429f, -0.034965f, -0.024950f, -0.005320f, -0.000044f, 0.035898f, -0.014767f, -0.003627f, 0.009742f, -0.034200f, 0.053155f, + 0.019356f, 0.001235f, -0.045186f, 0.029684f, 0.015249f, -0.036187f, 0.033867f, 0.002261f, -0.006215f, 0.007983f, -0.001837f, 0.044772f, -0.011186f, -0.057986f, 0.061092f, -0.032646f, -0.005779f, 0.045230f, -0.021053f, -0.010802f, -0.028237f, 0.071828f, -0.033284f, -0.009721f, -0.046157f, -0.009572f, 0.004779f, 0.064131f, -0.031149f, 0.011459f, 0.019901f, 0.037828f, -0.010913f, -0.041908f, 0.044080f, 0.026463f, 0.035640f, -0.018520f, -0.009494f, 0.003849f, 0.039566f, -0.023116f, -0.048089f, -0.053546f, 0.027345f, -0.037724f, 0.008689f, 0.038722f, 0.035851f, -0.026536f, -0.009615f, 0.052379f, -0.085492f, -0.002751f, 0.010912f, 0.028557f, -0.004708f, -0.031663f, -0.006958f, 0.047709f, -0.010199f, 0.098746f, 0.038137f, -0.029192f, -0.004637f, 0.002200f, -0.012783f, -0.036756f, -0.044938f, -0.033042f, 0.026864f, -0.021649f, -0.009383f, -0.001566f, 0.042577f, 0.018087f, -0.015850f, 0.018436f, 0.013186f, -0.001307f, 0.005563f, 0.007348f, -0.001354f, 0.005316f, 0.043604f, 0.035898f, 0.034532f, 0.023405f, 0.002561f, -0.022569f, 0.010962f, -0.017783f, 0.020459f, -0.026976f, 0.027728f, 0.041063f, + 0.013029f, 0.052201f, 0.056163f, 0.022470f, -0.001394f, 0.029271f, 0.009435f, -0.006114f, -0.019027f, 0.030466f, -0.008974f, -0.025531f, -0.001209f, 0.014444f, -0.007999f, 0.012499f, 0.023584f, 0.008676f, -0.031661f, 0.024712f, -0.014836f, -0.016810f, -0.094396f, 0.031260f, 0.017542f, 0.082923f, 0.072519f, -0.011465f, -0.027750f, -0.086732f, 0.001809f, 0.028223f, -0.037593f, 0.027563f, 0.049693f, 0.048476f, -0.023474f, 0.058485f, 0.052042f, 0.001986f, -0.032610f, -0.034660f, 0.053140f, 0.045590f, -0.066267f, -0.089799f, 0.117940f, 0.005702f, -0.009182f, 0.015148f, 0.008013f, 0.043624f, 0.042993f, -0.018007f, -0.015778f, 0.061471f, 0.028616f, -0.011434f, -0.041930f, 0.024597f, 0.004140f, 0.003012f, 0.021219f, 0.002788f, -0.002754f, -0.024973f, 0.013031f, -0.007658f, -0.031084f, 0.055302f, -0.089251f, 0.061434f, 0.050318f, -0.083941f, -0.006680f, 0.042496f, 0.009916f, 0.048527f, -0.012283f, 0.006684f, 0.043739f, -0.006030f, 0.021899f, -0.041425f, -0.066293f, 0.183997f, -0.076213f, -0.106004f, -0.024067f, 0.204955f, 0.087619f, -0.087487f, -0.020708f, 0.036142f, 0.024111f, -0.001927f, + -0.053729f, 0.077051f, 0.042193f, 0.032310f, 0.006659f, -0.104103f, -0.018049f, 0.016932f, 0.030022f, -0.042745f, -0.071692f, 0.006257f, 0.021377f, 0.009805f, -0.034367f, -0.035293f, 0.016006f, 0.009560f, 0.024629f, -0.004688f, -0.009608f, -0.002495f, 0.026368f, 0.034895f, 0.023018f, -0.052300f, -0.021291f, 0.037091f, 0.026230f, -0.026274f, -0.000927f, 0.030293f, 0.052518f, 0.021079f, -0.029299f, -0.038080f, -0.051055f, 0.023782f, -0.017066f, 0.022146f, -0.043337f, 0.023966f, 0.011231f, 0.026991f, -0.020442f, -0.009971f, -0.035025f, -0.014162f, 0.032392f, 0.006415f, -0.028923f, 0.015675f, 0.049493f, 0.003417f, -0.004373f, 0.015342f, -0.008004f, 0.013667f, -0.036395f, -0.022872f, 0.046327f, 0.080106f, 0.005784f, 0.132883f, -0.058609f, -0.022347f, 0.077151f, 0.004077f, -0.004154f, -0.039292f, -0.078836f, 0.065976f, -0.040979f, -0.044540f, 0.034303f, -0.049467f, 0.024920f, -0.046881f, -0.052067f, -0.008491f, 0.011670f, 0.007738f, -0.012095f, 0.063173f, 0.015969f, 0.038661f, 0.018619f, 0.001424f, 0.001193f, -0.028028f, -0.060127f, 0.019666f, 0.060378f, -0.048775f, 0.042223f, -0.049720f, + -0.005024f, -0.002365f, -0.077313f, 0.055559f, -0.026683f, 0.021882f, 0.001689f, -0.022403f, 0.001485f, -0.055640f, 0.057729f, -0.040165f, 0.019387f, -0.064830f, -0.039517f, -0.085163f, 0.032470f, -0.039582f, -0.044881f, -0.035944f, -0.018593f, 0.000487f, 0.091202f, 0.033028f, 0.045145f, -0.012020f, -0.042513f, -0.053460f, 0.014326f, 0.003755f, -0.092783f, -0.042771f, -0.163222f, -0.076407f, -0.063099f, -0.009028f, -0.075207f, -0.061512f, -0.013620f, 0.060214f, 0.068128f, -0.054964f, -0.070087f, -0.080119f, 0.040560f, 0.096841f, 0.004889f, 0.077981f, 0.001944f, 0.047292f, 0.018739f, 0.006154f, 0.022514f, 0.008805f, -0.001934f, -0.027472f, 0.039937f, 0.033583f, 0.017689f, -0.032908f, -0.013355f, -0.003949f, 0.017018f, 0.018540f, -0.006783f, 0.020086f, -0.008784f, -0.021933f, -0.039367f, 0.005408f, 0.054344f, 0.020177f, -0.006669f, 0.015917f, -0.017825f, 0.029769f, -0.010947f, 0.038752f, 0.036749f, 0.004918f, -0.040136f, 0.007170f, 0.008574f, 0.043874f, 0.010221f, 0.049797f, -0.033319f, -0.019714f, 0.045028f, 0.047671f, 0.012166f, -0.011702f, -0.009036f, -0.045986f, 0.033515f, -0.021365f, + -0.092832f, 0.022535f, 0.033528f, -0.080315f, 0.045379f, 0.009473f, -0.022902f, 0.005376f, -0.022303f, -0.001726f, 0.017968f, 0.024138f, 0.041948f, -0.048176f, 0.005312f, 0.056688f, -0.005669f, -0.026250f, 0.051084f, -0.021678f, 0.004116f, -0.029392f, -0.011559f, -0.059208f, 0.016152f, 0.001952f, 0.034327f, -0.023060f, 0.003091f, 0.042461f, -0.019269f, 0.001176f, 0.043884f, -0.084483f, 0.006124f, -0.096788f, -0.030353f, -0.064683f, 0.052635f, 0.018890f, -0.003215f, 0.022318f, -0.018487f, 0.024301f, 0.066738f, 0.018270f, 0.103284f, -0.056736f, -0.065030f, 0.060961f, 0.017081f, -0.043917f, -0.041055f, -0.016547f, 0.038533f, -0.035978f, -0.000785f, -0.031057f, -0.040074f, 0.024339f, 0.030508f, -0.060226f, -0.034653f, 0.052603f, -0.000297f, 0.018852f, -0.010677f, 0.029019f, 0.013319f, 0.053084f, -0.030040f, -0.022340f, 0.013984f, 0.012559f, -0.014595f, -0.054620f, -0.039611f, -0.043133f, 0.058892f, -0.026678f, -0.044465f, 0.013473f, -0.011168f, -0.014468f, -0.029097f, 0.011600f, 0.013965f, -0.004566f, -0.008212f, -0.015800f, -0.026765f, -0.004427f, -0.005582f, -0.019618f, 0.001364f, -0.009428f, + -0.018168f, 0.011757f, -0.010464f, 0.010842f, -0.010317f, -0.008954f, 0.028141f, -0.010573f, 0.013632f, 0.009964f, -0.025578f, 0.012023f, 0.004095f, -0.010273f, -0.031155f, 0.043531f, 0.029019f, -0.011939f, 0.007322f, -0.020941f, -0.015542f, 0.013477f, 0.000232f, -0.026995f, 0.010161f, -0.010638f, 0.025387f, -0.006348f, -0.004010f, 0.005055f, 0.012144f, 0.015611f, -0.063196f, -0.127734f, -0.063876f, -0.024356f, 0.055791f, 0.072759f, -0.139437f, 0.024012f, -0.055411f, -0.075588f, -0.015559f, 0.087251f, 0.055741f, 0.047567f, -0.030127f, -0.033648f, -0.040262f, 0.044005f, 0.030997f, 0.067913f, 0.008802f, -0.088258f, -0.034634f, 0.066323f, -0.010259f, 0.019451f, 0.059339f, -0.028412f, -0.041216f, -0.064551f, -0.064722f, 0.000402f, 0.042042f, 0.090953f, 0.067262f, 0.044655f, 0.018192f, -0.093045f, -0.099229f, 0.034669f, -0.068496f, 0.016164f, 0.087244f, 0.034757f, 0.005817f, -0.044059f, -0.079178f, -0.013530f, -0.034189f, 0.026561f, 0.020537f, 0.014855f, 0.054630f, -0.008510f, -0.010724f, 0.014421f, 0.039607f, 0.064462f, 0.066617f, 0.022665f, 0.059306f, 0.020019f, 0.021211f, -0.013053f, + -0.066721f, -0.026115f, -0.029025f, -0.054567f, 0.040953f, 0.038444f, 0.028411f, 0.028451f, -0.012839f, -0.065511f, 0.010696f, 0.019612f, -0.001198f, 0.043659f, 0.027899f, 0.022905f, -0.005360f, 0.003038f, 0.006247f, 0.044966f, 0.045074f, 0.034411f, 0.009791f, -0.008241f, -0.033399f, -0.006099f, 0.019178f, 0.005696f, -0.010017f, -0.000115f, -0.026587f, -0.012223f, -0.015472f, -0.017283f, 0.013477f, 0.049141f, 0.023898f, -0.008911f, -0.005167f, -0.036617f, -0.004011f, 0.012935f, 0.024546f, 0.027605f, -0.008917f, -0.011650f, -0.057395f, -0.032924f, -0.008527f, 0.000507f, 0.022708f, 0.019225f, -0.011527f, -0.013653f, 0.008986f, 0.003768f, 0.005639f, 0.014208f, -0.016244f, -0.005554f, -0.003492f, 0.009505f, 0.014920f, 0.001628f, -0.005646f, -0.004095f, -0.024229f, -0.010851f, 0.039574f, -0.112315f, -0.226045f, -0.116676f, 0.021934f, 0.088304f, 0.215189f, 0.210528f, 0.087731f, 0.089593f, 0.064340f, 0.003517f, -0.107128f, -0.181559f, -0.273584f, -0.081651f, -0.114431f, -0.019903f, 0.111702f, 0.199063f, 0.167387f, 0.147813f, 0.081494f, -0.001795f, -0.052069f, -0.069873f, -0.014907f, -0.121031f, + -0.096094f, -0.091306f, -0.059803f, -0.049099f, -0.022743f, -0.004261f, 0.041745f, 0.098180f, 0.101125f, 0.099375f, 0.072793f, 0.094674f, 0.050264f, 0.054168f, -0.017636f, -0.003913f, -0.044589f, -0.117223f, -0.169789f, -0.205188f, -0.099347f, -0.039974f, 0.032022f, -0.005241f, 0.021768f, 0.047775f, 0.062492f, 0.133194f, 0.153607f, 0.203510f, 0.129872f, 0.013156f, 0.059403f, -0.030689f, -0.112273f, -0.098250f, -0.195559f, -0.228218f, -0.170542f, -0.105446f, -0.045256f, -0.035714f, 0.082251f, 0.092830f, 0.257537f, 0.210848f, 0.154356f, 0.151054f, 0.072451f, -0.009190f, -0.102146f, -0.147831f, -0.107831f, -0.129439f, -0.177672f, -0.084420f, 0.005035f, -0.017356f, 0.005178f, 0.077764f, 0.108463f, 0.080091f, 0.041896f, 0.040492f, 0.069165f, 0.029492f, -0.004993f, -0.008255f, -0.033718f, -0.005686f, -0.030069f, -0.079647f, -0.041980f, -0.059394f, -0.096355f, -0.016977f, -0.016605f, 0.077146f, 0.070429f, 0.042324f, 0.075763f, 0.130902f, 0.093818f, -0.022979f, -0.015655f, -0.063127f, -0.056047f, -0.131782f, -0.136533f, -0.066117f, -0.027757f, 0.011352f, 0.046515f, 0.054901f, 0.081971f, 0.093228f, + 0.090267f, 0.094647f, 0.024293f, -0.009670f, -0.050240f, -0.061571f, -0.081135f, -0.090007f, -0.090170f, -0.038964f, 0.020382f, 0.027000f, 0.039333f, 0.040916f, 0.028578f, 0.030268f, 0.031881f, 0.010083f, 0.007523f, -0.010793f, -0.011182f, 0.019023f, -0.012841f, -0.031477f, 0.001790f, 0.006690f, -0.004056f, -0.009891f, -0.013513f, 0.000021f, -0.003911f, -0.022168f, -0.009938f, 0.006332f, 0.001402f, 0.001290f, 0.012843f, 0.016148f, 0.011982f, 0.010969f, 0.010113f, 0.003758f, -0.001603f, -0.001211f, -0.002143f, -0.006841f, -0.007435f, -0.007978f, -0.007422f, -0.005624f, -0.002722f, -0.003568f, -0.001342f, 0.001046f, 0.003144f, 0.006635f, 0.005147f, 0.000954f, 0.001232f, 0.002581f, -0.000431f, -0.005240f, -0.005741f, -0.003249f, 0.000496f, 0.002847f, 0.005469f, 0.008339f, 0.007943f, 0.006614f, 0.005138f, 0.001063f, -0.003331f, -0.007082f, -0.010072f, -0.011806f, -0.013057f, -0.012763f, -0.008222f, -0.001890f, 0.004105f, 0.009788f, 0.013870f, 0.015268f, 0.015619f, 0.012663f, 0.006475f, 0.000282f, -0.005914f, -0.010053f, -0.012527f, -0.013020f, -0.009706f, -0.005866f, -0.002434f, 0.001609f, + 0.004063f, 0.004754f, 0.004296f, 0.003624f, 0.002853f, 0.002090f, 0.001490f, 0.000548f, 0.000174f, 0.000171f, 0.000060f, -0.000361f, -0.000503f, -0.000567f, -0.000498f, -0.000509f, -0.000398f, -0.000355f, -0.000373f, -0.000357f} + }, + { + {-0.008454f, -0.013189f, -0.009585f, 0.003750f, -0.001437f, -0.022591f, -0.012818f, -0.000970f, 0.003257f, -0.006942f, 0.002406f, -0.008381f, 0.001666f, -0.006056f, 0.015891f, -0.012918f, -0.005647f, -0.005677f, 0.010138f, 0.006988f, 0.016182f, 0.004268f, 0.003388f, -0.007383f, 0.007653f, 0.000974f, 0.002098f, -0.000900f, 0.006149f, 0.008385f, 0.000659f, 0.008356f, 0.007968f, -0.003862f, 0.004472f, -0.004722f, -0.005222f, 0.000585f, -0.004261f, 0.002683f, -0.006704f, -0.012217f, 0.003332f, 0.004351f, -0.002992f, 0.003388f, -0.005791f, 0.005487f, 0.007529f, -0.012909f, 0.002559f, -0.000726f, 0.004894f, 0.004132f, 0.000720f, -0.012745f, -0.003774f, -0.005612f, 0.004266f, -0.000170f, 0.001325f, -0.004107f, 0.002404f, -0.006552f, 0.000361f, 0.007060f, 0.004570f, 0.000454f, -0.003573f, 0.002317f, -0.010362f, -0.005875f, -0.007598f, 0.001355f, 0.001368f, -0.000683f, 0.011056f, 0.000019f, 0.009645f, 0.000103f, 0.001074f, 0.000858f, 0.000026f, -0.005235f, 0.003958f, -0.000356f, 0.001992f, -0.001156f, 0.001308f, 0.001775f, -0.000639f, -0.001860f, -0.000638f, -0.000595f, -0.000480f, -0.000353f, + -0.002716f, 0.000428f, 0.002959f, 0.001609f, 0.000111f, 0.000267f, -0.000704f, -0.001324f, 0.001302f, -0.000865f, -0.026135f, -0.000868f, 0.001337f, 0.000332f, 0.004243f, -0.009252f, 0.006720f, 0.003757f, -0.004879f, -0.015593f, 0.010183f, 0.010449f, -0.002517f, 0.008687f, 0.006255f, -0.008663f, 0.017081f, 0.003525f, -0.007802f, 0.009163f, 0.000613f, 0.008559f, 0.001214f, -0.014965f, 0.005620f, -0.002874f, -0.005574f, -0.005839f, -0.004582f, 0.009724f, 0.007521f, 0.000568f, 0.007871f, 0.002823f, -0.007542f, -0.009317f, -0.000899f, -0.002212f, 0.003936f, 0.002667f, -0.007346f, 0.001697f, 0.003743f, 0.003544f, -0.006466f, -0.005420f, -0.008551f, -0.003025f, -0.002175f, 0.001662f, -0.002137f, 0.011362f, 0.004825f, -0.001808f, -0.005836f, 0.002097f, 0.004689f, 0.002419f, 0.012220f, -0.002087f, 0.006126f, -0.000769f, -0.004097f, -0.007499f, 0.005200f, -0.001729f, -0.003520f, 0.007162f, -0.002284f, 0.002359f, -0.001671f, -0.001530f, -0.008350f, 0.001781f, -0.002413f, 0.009705f, 0.011994f, -0.007295f, -0.007445f, -0.005223f, 0.001964f, -0.004691f, -0.002443f, -0.003040f, -0.003067f, -0.003279f, + 0.001861f, 0.004458f, -0.000362f, 0.001126f, 0.001269f, -0.000507f, 0.000071f, -0.002163f, -0.004879f, -0.007681f, -0.017713f, -0.010569f, -0.003830f, 0.012773f, 0.001663f, 0.002410f, 0.007822f, 0.002137f, 0.003379f, -0.018558f, -0.017052f, -0.010845f, -0.002843f, -0.000036f, 0.007880f, -0.005548f, 0.006167f, -0.003157f, -0.011467f, 0.003615f, -0.001677f, -0.007825f, -0.000124f, 0.011047f, 0.016020f, 0.007295f, -0.007334f, 0.004333f, 0.000513f, 0.011580f, -0.000052f, -0.009157f, -0.000314f, -0.005330f, 0.011355f, 0.005002f, 0.005326f, 0.011529f, -0.001986f, 0.000879f, 0.015426f, 0.013519f, -0.000505f, -0.000023f, 0.001062f, -0.000813f, 0.004107f, 0.001171f, -0.011235f, -0.014881f, -0.005261f, -0.001853f, 0.000054f, -0.004904f, -0.016622f, -0.001726f, 0.004615f, -0.009017f, -0.004411f, -0.005859f, -0.005032f, 0.001804f, 0.002140f, 0.005528f, -0.011583f, -0.009234f, 0.008947f, -0.003741f, -0.002017f, 0.001886f, -0.000683f, 0.005870f, -0.011155f, 0.004465f, 0.004146f, -0.004393f, -0.004247f, 0.004499f, -0.004870f, 0.007148f, -0.002785f, 0.000109f, 0.000006f, -0.002758f, 0.001416f, 0.005295f, + 0.002928f, 0.000637f, 0.003199f, 0.000946f, -0.001448f, -0.002823f, -0.001566f, -0.001610f, 0.000659f, 0.000846f, -0.000473f, -0.000378f, 0.000791f, -0.000215f, 0.023885f, -0.008962f, -0.007071f, -0.001007f, 0.000551f, -0.008728f, 0.000224f, -0.006061f, 0.011561f, -0.002643f, -0.013978f, -0.019514f, -0.004909f, -0.012875f, 0.018293f, 0.001628f, 0.013021f, 0.011007f, -0.017074f, -0.000813f, 0.007363f, 0.005382f, 0.009288f, 0.001860f, -0.000971f, -0.001404f, 0.004428f, -0.005546f, 0.006708f, 0.003791f, -0.006006f, 0.003960f, 0.000413f, 0.004598f, 0.010003f, -0.005167f, 0.004053f, -0.000466f, 0.005771f, 0.005019f, -0.001890f, 0.006856f, -0.001766f, 0.005987f, -0.004318f, 0.005475f, -0.013815f, -0.005757f, -0.004965f, 0.004093f, 0.012184f, -0.008684f, -0.005728f, -0.003095f, 0.000859f, -0.003873f, -0.005219f, -0.002654f, 0.005005f, 0.004134f, 0.007096f, -0.002135f, 0.004095f, -0.003927f, -0.004209f, -0.000224f, -0.002482f, 0.005009f, 0.000054f, -0.007100f, 0.004215f, -0.004067f, -0.007053f, -0.002476f, -0.004344f, 0.003342f, -0.005117f, -0.014010f, -0.001898f, -0.005947f, -0.005937f, 0.003273f, + -0.003805f, -0.008353f, -0.001628f, 0.002004f, -0.000502f, 0.000713f, 0.000026f, -0.005169f, 0.000281f, 0.003035f, -0.001921f, -0.002041f, 0.000678f, 0.000096f, 0.001132f, 0.001117f, 0.002892f, 0.001018f, -0.002313f, 0.001816f, -0.000325f, -0.000646f, -0.000832f, -0.002189f, -0.002151f, -0.002236f, 0.004245f, 0.006443f, -0.002197f, 0.009659f, -0.014543f, 0.006847f, -0.008599f, -0.009506f, 0.014523f, 0.005561f, -0.016627f, 0.002002f, 0.000340f, 0.005332f, -0.011901f, -0.007516f, -0.000827f, -0.009578f, -0.017691f, -0.017100f, -0.011220f, -0.017064f, 0.007674f, -0.001548f, 0.002861f, 0.009642f, -0.014979f, 0.010286f, -0.004068f, 0.004956f, 0.003322f, -0.001282f, 0.001801f, -0.001932f, -0.001960f, -0.009646f, -0.005713f, 0.013225f, -0.004552f, -0.010503f, -0.009689f, -0.000692f, -0.004229f, 0.004311f, -0.009254f, -0.014399f, 0.002468f, 0.013915f, -0.001855f, 0.008544f, -0.004500f, 0.004784f, -0.007111f, 0.005838f, 0.002493f, -0.009752f, 0.014960f, 0.002904f, -0.002891f, 0.003721f, 0.013770f, 0.012786f, 0.006786f, -0.001064f, -0.014919f, -0.002278f, -0.012403f, 0.003906f, -0.002567f, 0.002378f, + 0.002382f, 0.003792f, -0.011262f, 0.000182f, -0.000660f, 0.005811f, 0.011897f, -0.014376f, 0.002136f, -0.004013f, -0.013542f, -0.001272f, 0.004185f, -0.001121f, -0.000158f, -0.001035f, 0.004687f, 0.001171f, -0.003816f, -0.002445f, -0.002718f, -0.001467f, -0.004581f, 0.000454f, -0.000239f, 0.002949f, -0.005560f, -0.003719f, -0.000288f, -0.000468f, -0.000564f, 0.000561f, -0.000296f, 0.001218f, -0.001933f, -0.001841f, -0.000415f, -0.000057f, -0.001373f, -0.000077f, -0.000273f, 0.002852f, 0.002498f, 0.000269f, 0.000188f, -0.002329f, -0.004163f, -0.001210f, 0.000339f, -0.003583f, -0.002184f, -0.001527f, -0.001278f, -0.001290f, -0.016509f, -0.015803f, -0.010168f, -0.017432f, -0.020721f, -0.019729f, 0.008771f, 0.009569f, -0.012600f, -0.003110f, -0.011382f, -0.018733f, 0.010470f, -0.004691f, -0.016234f, 0.005973f, -0.000850f, 0.001140f, 0.001950f, 0.005907f, 0.002110f, -0.000297f, 0.004522f, 0.006012f, -0.009228f, -0.008827f, -0.002193f, -0.010829f, -0.000526f, -0.011561f, -0.020262f, -0.001334f, 0.012686f, -0.014565f, -0.011134f, 0.008347f, -0.007585f, 0.001223f, 0.003414f, -0.007366f, -0.005923f, -0.006202f, + -0.021863f, -0.009297f, 0.004998f, -0.006043f, -0.007084f, -0.013659f, 0.006466f, 0.012719f, -0.004260f, 0.019463f, -0.010386f, -0.004732f, 0.000145f, -0.004355f, -0.015987f, -0.000869f, 0.003940f, -0.000262f, -0.003192f, -0.013883f, -0.002115f, 0.014211f, 0.007242f, 0.004386f, 0.007441f, 0.005444f, -0.003460f, 0.026930f, -0.008172f, -0.010072f, -0.009654f, -0.011544f, 0.004902f, 0.015425f, 0.010537f, 0.001443f, -0.002268f, -0.007364f, -0.002547f, 0.000056f, -0.003401f, 0.000931f, -0.004629f, 0.002146f, 0.011284f, 0.007472f, -0.005279f, -0.000870f, -0.001803f, 0.004299f, -0.002132f, 0.004655f, -0.004449f, -0.002036f, 0.000856f, 0.001180f, -0.000988f, 0.001781f, -0.002510f, 0.003178f, 0.000266f, 0.002568f, 0.002018f, 0.001653f, -0.001154f, -0.001835f, -0.000412f, -0.001855f, -0.002368f, 0.029624f, 0.020085f, -0.001156f, 0.018326f, -0.001793f, 0.002498f, 0.003314f, -0.010356f, 0.016675f, -0.000029f, 0.014681f, 0.014093f, -0.011811f, 0.018370f, 0.000036f, -0.014371f, -0.023623f, 0.021136f, 0.010086f, 0.020999f, -0.018030f, 0.011979f, 0.006338f, -0.019766f, -0.019598f, -0.011642f, -0.005762f, + 0.020237f, -0.019733f, 0.017038f, -0.001951f, -0.002126f, 0.012130f, 0.011512f, 0.015665f, 0.005672f, -0.009017f, 0.007598f, 0.014701f, -0.009288f, 0.014694f, 0.022605f, 0.009392f, 0.013641f, 0.005440f, 0.003713f, 0.003575f, 0.000391f, -0.012733f, 0.004395f, 0.000943f, 0.000720f, 0.010143f, -0.007583f, 0.005921f, 0.006802f, -0.003355f, 0.019720f, -0.012001f, -0.007274f, -0.004825f, 0.017014f, -0.003458f, 0.014024f, 0.006848f, 0.009426f, 0.008281f, 0.001499f, -0.024631f, -0.003934f, -0.019814f, -0.010738f, 0.024967f, 0.013046f, -0.011634f, -0.000834f, -0.014264f, -0.012615f, -0.006841f, 0.020900f, 0.001538f, 0.007104f, 0.003770f, -0.003431f, 0.003981f, 0.007406f, 0.012855f, -0.003864f, 0.007380f, 0.005433f, 0.004442f, -0.004656f, -0.003221f, 0.001976f, -0.002681f, -0.000217f, 0.003266f, 0.004767f, 0.001695f, 0.002008f, 0.005537f, 0.005647f, 0.001814f, 0.000083f, 0.002489f, -0.001314f, 0.004648f, 0.007522f, 0.003284f, 0.000142f, 0.008013f, 0.000875f, -0.003989f, 0.003429f, -0.026244f, 0.016529f, 0.015875f, 0.047010f, 0.001829f, 0.004034f, -0.002376f, -0.006498f, -0.003087f, + 0.015864f, 0.014489f, 0.012582f, 0.018279f, 0.007359f, 0.028874f, 0.008388f, -0.011451f, 0.002691f, 0.025169f, 0.009865f, 0.002552f, 0.003829f, -0.012947f, -0.018713f, 0.011940f, -0.009347f, -0.018239f, -0.038738f, -0.000609f, 0.015260f, -0.001173f, 0.008948f, -0.013370f, -0.007206f, -0.004988f, 0.002757f, -0.004223f, -0.011719f, -0.005637f, -0.031255f, -0.008103f, -0.026557f, 0.002251f, -0.014076f, 0.010636f, -0.015315f, 0.005795f, -0.014735f, -0.005029f, -0.001097f, 0.000472f, 0.002063f, 0.002987f, -0.019480f, 0.009365f, -0.003107f, 0.004318f, -0.010286f, 0.000314f, 0.015186f, 0.006248f, 0.021063f, 0.011971f, -0.006722f, -0.001207f, -0.004619f, -0.002118f, -0.005231f, -0.006716f, -0.000575f, 0.008800f, 0.005410f, 0.006562f, 0.003925f, -0.030372f, 0.019844f, 0.019802f, -0.007642f, 0.011378f, 0.008578f, -0.016007f, 0.007497f, 0.004915f, 0.000765f, -0.003324f, 0.002550f, 0.010497f, -0.009404f, 0.006165f, -0.002839f, 0.000636f, -0.000971f, 0.002406f, 0.005301f, -0.004532f, -0.002346f, 0.007843f, -0.005733f, 0.000516f, -0.000018f, 0.003063f, -0.003839f, -0.006326f, 0.003691f, 0.000396f, + -0.002288f, -0.001785f, 0.000714f, -0.000079f, 0.003418f, 0.004433f, 0.004519f, 0.000230f, -0.005391f, 0.001159f, 0.050563f, 0.018135f, -0.008613f, 0.024900f, -0.016593f, 0.017322f, 0.011477f, -0.024012f, 0.004950f, -0.030170f, 0.000473f, -0.010347f, -0.021281f, 0.011168f, 0.000245f, 0.008515f, 0.012261f, 0.015238f, 0.024549f, 0.010165f, -0.001890f, -0.006514f, -0.016944f, -0.030413f, 0.010610f, 0.011726f, 0.003158f, -0.010703f, 0.016231f, 0.002003f, 0.017157f, 0.010151f, -0.031709f, -0.012119f, 0.004125f, -0.023368f, 0.001070f, -0.001796f, -0.004541f, 0.006713f, 0.005006f, -0.005604f, 0.023159f, -0.013580f, 0.000798f, 0.012929f, -0.011601f, 0.008841f, -0.005134f, -0.014246f, 0.009346f, -0.000238f, -0.001947f, 0.013291f, 0.008757f, 0.000378f, -0.007084f, 0.027646f, 0.001123f, 0.015501f, 0.001456f, -0.008764f, -0.009742f, -0.023388f, -0.009107f, 0.009609f, -0.000729f, 0.008185f, -0.002746f, -0.018245f, 0.007137f, 0.005887f, -0.026696f, 0.007630f, 0.013610f, -0.007199f, 0.014525f, 0.003348f, -0.015194f, -0.015460f, 0.017340f, -0.000444f, -0.035015f, 0.004285f, 0.003669f, 0.001404f, + -0.003642f, 0.001992f, -0.004887f, 0.000811f, 0.010340f, -0.003259f, 0.001585f, 0.002565f, 0.002995f, -0.008856f, 0.002573f, -0.003204f, 0.002344f, 0.006434f, 0.006790f, 0.004894f, 0.002308f, -0.005832f, 0.002547f, -0.000563f, -0.000598f, 0.002276f, -0.006512f, -0.000136f, 0.004341f, 0.005992f, -0.004091f, -0.002504f, -0.007611f, 0.001282f, 0.007849f, -0.007837f, 0.003108f, 0.002733f, -0.052803f, -0.017610f, 0.054942f, 0.015167f, 0.008675f, -0.008408f, -0.001597f, -0.008585f, 0.011115f, -0.017924f, 0.023957f, 0.013649f, 0.011173f, 0.011474f, -0.008638f, -0.000959f, -0.001103f, 0.007617f, 0.016092f, -0.024505f, -0.014579f, -0.007915f, 0.018418f, 0.006563f, 0.010227f, 0.010993f, -0.002649f, -0.017608f, 0.005625f, 0.001237f, 0.033530f, 0.026340f, 0.006855f, 0.019972f, 0.000995f, -0.009822f, 0.004065f, -0.002912f, -0.004717f, 0.012825f, 0.015829f, 0.012981f, 0.032445f, 0.015589f, 0.012669f, 0.014163f, -0.014858f, -0.024314f, -0.011437f, 0.010890f, -0.020714f, -0.010335f, 0.019949f, 0.021237f, 0.011630f, -0.009802f, 0.018820f, -0.007583f, 0.001973f, 0.004391f, 0.010774f, -0.005699f, + -0.011884f, 0.006623f, -0.010724f, -0.033491f, 0.001367f, 0.010646f, -0.018263f, 0.002235f, -0.003358f, -0.004855f, -0.003407f, -0.010936f, 0.027060f, -0.002977f, 0.015437f, -0.039051f, -0.037080f, -0.031489f, -0.014366f, 0.003044f, 0.003738f, -0.001170f, 0.002076f, -0.000812f, -0.008332f, 0.003906f, -0.009152f, -0.002832f, -0.004046f, 0.009333f, 0.001446f, 0.003276f, -0.007358f, -0.001508f, -0.006555f, -0.002519f, 0.005103f, 0.008034f, 0.008750f, 0.008291f, -0.000170f, -0.005830f, 0.004551f, 0.007280f, 0.004563f, 0.007245f, 0.002547f, -0.000884f, 0.003088f, 0.000886f, 0.001488f, -0.002413f, -0.005129f, 0.005805f, 0.006649f, -0.002397f, -0.001958f, -0.001675f, -0.001156f, 0.027386f, 0.042908f, -0.062571f, -0.008650f, 0.004000f, -0.000239f, -0.007277f, -0.015429f, 0.017459f, -0.019875f, -0.031706f, -0.003019f, 0.031466f, -0.004239f, -0.017991f, 0.006024f, -0.025271f, -0.013639f, 0.001272f, 0.016614f, -0.026499f, 0.003198f, 0.029460f, 0.030186f, 0.001039f, 0.010834f, 0.026435f, -0.014746f, -0.023121f, -0.032466f, 0.003432f, -0.032363f, -0.006697f, 0.013937f, 0.013166f, -0.028615f, -0.026940f, + -0.016323f, 0.011983f, -0.007447f, -0.004815f, -0.007359f, 0.026262f, -0.038409f, -0.011027f, 0.006219f, -0.020555f, -0.006976f, 0.000343f, -0.024160f, 0.001404f, 0.010226f, -0.001053f, 0.032145f, -0.001888f, -0.012737f, 0.002987f, -0.001418f, -0.010214f, 0.006326f, 0.015998f, -0.014350f, 0.022697f, -0.010881f, -0.041455f, 0.002152f, -0.016008f, -0.008749f, -0.000878f, -0.004278f, -0.054776f, -0.009058f, 0.025524f, 0.021981f, 0.015532f, 0.033049f, 0.033766f, -0.045122f, -0.004802f, 0.003102f, 0.009705f, -0.012985f, -0.022274f, -0.000244f, 0.010518f, 0.012254f, 0.010611f, 0.008224f, 0.004126f, 0.006667f, -0.011813f, 0.000243f, 0.007515f, -0.003637f, -0.002521f, 0.001520f, 0.002628f, 0.006697f, -0.006943f, 0.001501f, -0.002649f, 0.003227f, 0.004520f, -0.009503f, 0.001661f, -0.000824f, -0.006380f, 0.002997f, -0.001265f, 0.001436f, 0.000560f, -0.000000f, -0.008139f, 0.004451f, 0.000841f, 0.002399f, -0.005342f, -0.004035f, -0.003460f, -0.003548f, -0.060108f, 0.016755f, -0.011197f, 0.020458f, -0.019246f, -0.000234f, 0.031417f, -0.010548f, 0.044645f, 0.010232f, 0.008598f, -0.019240f, 0.008444f, + 0.022094f, -0.013640f, -0.002818f, 0.028883f, 0.018564f, 0.021745f, 0.003024f, -0.033378f, 0.021180f, -0.021543f, -0.002069f, -0.012977f, 0.003250f, -0.016571f, 0.009599f, -0.004299f, 0.009351f, 0.008995f, 0.015911f, 0.016237f, 0.017911f, -0.021269f, 0.005026f, 0.034084f, 0.007201f, -0.006060f, -0.006893f, -0.017037f, -0.013852f, -0.000012f, 0.001190f, 0.006191f, 0.028569f, 0.002539f, 0.015729f, 0.015387f, -0.001149f, -0.007220f, -0.007039f, 0.026073f, -0.030427f, -0.006517f, -0.026937f, -0.022040f, -0.006295f, 0.000281f, -0.045149f, 0.011816f, -0.014250f, 0.027707f, -0.005801f, 0.001312f, 0.019070f, 0.004031f, 0.046191f, 0.038342f, 0.055035f, 0.020970f, 0.002250f, -0.006280f, -0.005684f, -0.009168f, -0.002800f, -0.010924f, -0.030445f, 0.020698f, 0.025064f, 0.012135f, -0.004206f, 0.002955f, -0.021474f, -0.028931f, 0.013411f, 0.003746f, 0.003923f, -0.009221f, -0.004107f, -0.010014f, -0.005599f, 0.009081f, 0.002862f, 0.011857f, -0.000863f, 0.002744f, -0.006800f, 0.008315f, -0.024186f, -0.006224f, -0.000943f, -0.000832f, -0.004627f, 0.004368f, 0.001006f, 0.001687f, -0.001761f, -0.005739f, + -0.001276f, -0.002313f, -0.001708f, 0.007644f, 0.000797f, 0.001068f, -0.005047f, 0.001749f, 0.001112f, -0.000245f, -0.010841f, -0.007676f, -0.008448f, -0.017810f, 0.023537f, -0.007136f, -0.005378f, 0.055180f, -0.011616f, -0.012362f, 0.061369f, -0.001060f, 0.034835f, 0.025668f, 0.001861f, 0.014324f, -0.008472f, 0.011195f, 0.010481f, 0.006604f, 0.008465f, 0.028274f, -0.019827f, 0.034110f, -0.019097f, -0.000757f, 0.006810f, -0.004807f, -0.025083f, -0.022383f, -0.000882f, -0.036227f, -0.011745f, -0.039558f, -0.002944f, -0.023568f, -0.017736f, -0.012981f, -0.011482f, 0.005709f, -0.031913f, 0.036606f, 0.005538f, -0.024047f, -0.018067f, -0.001298f, -0.004860f, -0.006012f, 0.009276f, 0.004889f, 0.035920f, 0.003990f, -0.000650f, -0.018633f, 0.002806f, 0.007333f, -0.001597f, -0.019864f, -0.008780f, 0.022534f, 0.024500f, -0.001623f, -0.021263f, 0.008442f, -0.004384f, 0.032119f, 0.035699f, -0.014192f, -0.009547f, -0.006794f, 0.003835f, -0.013959f, 0.014284f, -0.044888f, -0.004447f, 0.052726f, -0.047958f, -0.023666f, -0.011305f, 0.003277f, 0.003975f, 0.006160f, -0.004567f, 0.014009f, -0.008707f, -0.002534f, + 0.025496f, -0.004206f, 0.018409f, -0.012780f, 0.018546f, -0.016606f, 0.012624f, 0.010342f, 0.025303f, -0.000684f, -0.004574f, 0.010638f, 0.016569f, 0.001342f, -0.004280f, -0.002799f, 0.001459f, -0.009293f, -0.003039f, 0.008455f, 0.011100f, 0.003419f, -0.003934f, 0.010871f, -0.008867f, 0.008905f, 0.007315f, 0.008113f, 0.004300f, 0.000147f, -0.013682f, 0.013350f, 0.007729f, 0.006098f, 0.002714f, 0.006218f, 0.011563f, 0.002567f, -0.009520f, 0.004474f, -0.007803f, -0.005971f, 0.009531f, -0.002529f, 0.008220f, 0.009027f, -0.003825f, -0.006738f, -0.006723f, 0.003724f, -0.032269f, -0.017711f, -0.005086f, 0.024880f, 0.030012f, 0.020543f, -0.019169f, -0.049146f, 0.084942f, 0.021318f, -0.053370f, -0.053571f, -0.008053f, 0.012893f, 0.036161f, -0.046619f, -0.008249f, 0.008626f, -0.000702f, -0.006764f, 0.048673f, 0.010379f, -0.028615f, 0.015194f, 0.001988f, -0.001440f, 0.025620f, -0.004753f, 0.013995f, -0.031817f, -0.010769f, 0.055699f, 0.020591f, 0.043906f, 0.013869f, 0.039687f, 0.006944f, -0.014686f, 0.027954f, 0.025401f, 0.039937f, 0.019587f, -0.045110f, -0.017188f, 0.009757f, 0.023231f, + -0.018117f, 0.006792f, -0.017454f, -0.029254f, 0.002956f, -0.003459f, -0.017442f, 0.013481f, 0.018912f, 0.016319f, 0.012002f, 0.011159f, -0.008583f, 0.030098f, -0.000219f, -0.030084f, -0.021755f, 0.027059f, 0.014746f, -0.047197f, 0.020515f, 0.008271f, 0.015178f, -0.041253f, -0.028099f, 0.026374f, 0.040926f, 0.023021f, -0.009147f, -0.044109f, 0.010007f, -0.002040f, 0.037586f, -0.012625f, -0.050412f, 0.021060f, 0.029498f, -0.011251f, 0.030702f, 0.025125f, 0.010463f, -0.020249f, 0.002714f, -0.000357f, 0.005967f, 0.002119f, -0.001289f, -0.010815f, -0.004424f, -0.013550f, -0.001308f, -0.002749f, 0.007127f, -0.008310f, -0.004836f, -0.002849f, -0.006059f, -0.003845f, -0.003168f, -0.003841f, 0.015754f, 0.004622f, 0.000305f, 0.015138f, -0.003657f, -0.014433f, -0.009512f, -0.007769f, -0.006071f, 0.000589f, -0.010327f, 0.004328f, 0.006515f, 0.005314f, 0.004162f, -0.013850f, -0.005197f, 0.011514f, 0.009715f, -0.001479f, 0.007513f, -0.001647f, 0.019826f, 0.039172f, 0.014813f, 0.041379f, 0.006548f, 0.018726f, 0.013837f, 0.069240f, 0.094392f, 0.006941f, 0.018522f, -0.060847f, -0.019643f, 0.036036f, + -0.031222f, 0.071327f, -0.014747f, 0.010836f, 0.018887f, 0.041570f, 0.022871f, -0.010506f, -0.030923f, -0.036201f, -0.012238f, -0.006366f, -0.045235f, -0.021719f, -0.018271f, 0.028238f, -0.017115f, 0.008059f, -0.029170f, 0.003325f, -0.011742f, -0.042408f, 0.043103f, 0.029702f, 0.034613f, 0.014936f, -0.021830f, -0.021215f, -0.049222f, 0.000389f, -0.044411f, -0.013870f, -0.004196f, 0.005281f, 0.022048f, 0.017225f, -0.014728f, -0.010644f, 0.018185f, 0.040664f, 0.010603f, 0.015223f, 0.029600f, -0.038831f, 0.026680f, -0.022286f, -0.020575f, -0.039205f, -0.017412f, 0.017155f, 0.014488f, 0.001932f, 0.044751f, -0.010436f, -0.017241f, 0.006389f, 0.011361f, 0.061577f, -0.020906f, 0.024359f, 0.024061f, -0.060256f, -0.000405f, 0.006915f, -0.013632f, -0.009348f, 0.020171f, -0.012400f, 0.001284f, 0.024750f, 0.012604f, -0.037303f, -0.044580f, -0.043151f, -0.020411f, -0.016413f, 0.035050f, 0.030403f, -0.008962f, -0.014101f, 0.001347f, 0.003367f, 0.022963f, -0.003211f, -0.007799f, 0.013962f, -0.003139f, -0.002996f, -0.006608f, 0.009952f, 0.013972f, -0.008229f, 0.013355f, 0.012432f, 0.012904f, 0.001771f, + -0.006081f, 0.011189f, -0.008573f, 0.006468f, 0.014583f, 0.000519f, 0.008528f, 0.011416f, -0.020808f, -0.001481f, 0.009509f, 0.010505f, 0.014532f, 0.001164f, 0.012965f, 0.000108f, 0.000444f, -0.005198f, 0.007264f, 0.010653f, -0.039772f, 0.010790f, 0.060093f, -0.013432f, 0.009359f, -0.025916f, -0.006935f, -0.034772f, 0.028831f, -0.050318f, 0.003030f, -0.040397f, 0.008815f, 0.018212f, 0.007076f, -0.023931f, 0.084891f, -0.005286f, -0.010615f, 0.008270f, -0.047198f, 0.003371f, -0.031655f, 0.001729f, 0.009825f, -0.009094f, -0.000370f, 0.020435f, -0.016854f, 0.001360f, 0.026224f, 0.002681f, 0.007197f, -0.040634f, 0.006007f, -0.002896f, -0.001807f, -0.009858f, -0.050378f, -0.027886f, 0.013417f, 0.004759f, 0.023494f, -0.058696f, 0.007253f, -0.054593f, 0.028768f, -0.037057f, -0.059375f, 0.031035f, 0.056300f, 0.010122f, 0.028112f, -0.041010f, 0.041985f, -0.009657f, 0.006980f, -0.024948f, 0.035124f, 0.014350f, 0.036448f, 0.011714f, 0.044050f, -0.038594f, 0.008342f, 0.002689f, -0.005831f, -0.030498f, -0.024415f, -0.028639f, 0.033992f, -0.008300f, 0.045885f, -0.027439f, -0.020541f, 0.005545f, + 0.006915f, -0.024497f, 0.013919f, -0.014207f, -0.057644f, 0.026246f, 0.039768f, 0.064943f, 0.023503f, 0.046204f, -0.025444f, 0.000566f, -0.028799f, 0.049456f, 0.017509f, -0.008913f, -0.018509f, 0.023723f, -0.015725f, -0.004249f, 0.003515f, -0.014317f, -0.023898f, -0.016168f, -0.010767f, -0.009460f, -0.032146f, -0.014008f, -0.026603f, 0.021783f, -0.004186f, 0.013118f, 0.025977f, 0.006992f, -0.017712f, -0.001392f, -0.017710f, -0.007682f, -0.027014f, -0.015159f, -0.028644f, -0.004818f, 0.050037f, 0.010362f, -0.002533f, 0.011363f, 0.015873f, -0.027860f, -0.011746f, -0.001254f, -0.002523f, -0.011331f, 0.013692f, -0.005176f, -0.041909f, -0.003330f, -0.008604f, -0.031129f, -0.098159f, 0.012281f, -0.031228f, 0.091229f, -0.016943f, -0.045750f, 0.018458f, -0.002419f, -0.045619f, -0.007619f, 0.007794f, -0.027351f, 0.068883f, 0.009983f, 0.006753f, 0.031413f, -0.038490f, -0.059248f, -0.036512f, 0.084101f, -0.006550f, -0.017603f, 0.055559f, 0.031489f, -0.026303f, -0.026051f, -0.014682f, 0.066729f, 0.009444f, -0.016001f, -0.025893f, -0.012333f, -0.051836f, 0.035273f, -0.005947f, 0.014434f, 0.033518f, -0.011585f, + -0.053703f, -0.006354f, 0.069472f, -0.002739f, -0.017220f, 0.033680f, -0.015114f, 0.041742f, 0.027316f, -0.003269f, -0.051197f, -0.025863f, -0.006965f, -0.047187f, -0.027785f, -0.027060f, 0.003775f, -0.006222f, 0.040113f, -0.027567f, -0.009619f, 0.000153f, 0.103041f, 0.036145f, -0.017695f, 0.021204f, 0.012178f, -0.005689f, 0.052336f, 0.025816f, -0.019774f, 0.008596f, 0.042309f, 0.048192f, -0.029149f, -0.020388f, -0.069938f, -0.055726f, 0.031972f, -0.020528f, 0.034510f, -0.000477f, -0.041130f, 0.010542f, -0.003266f, 0.013549f, -0.027378f, -0.020370f, 0.038704f, 0.010317f, 0.005111f, -0.003304f, -0.004555f, 0.026270f, -0.012377f, 0.013815f, -0.006622f, 0.016629f, 0.032488f, 0.009250f, -0.023568f, 0.004494f, -0.009095f, 0.018362f, 0.014575f, 0.005504f, 0.021111f, 0.033604f, -0.013011f, 0.027255f, -0.002654f, -0.034556f, -0.009206f, 0.001854f, -0.019810f, 0.008687f, 0.025591f, 0.000284f, -0.013102f, 0.002382f, -0.004910f, 0.034313f, 0.028613f, 0.003766f, 0.013483f, 0.018126f, 0.008906f, 0.023270f, -0.028826f, -0.020444f, 0.010154f, 0.006726f, -0.006225f, -0.001563f, -0.004700f, -0.010713f, + -0.010564f, -0.111136f, 0.038171f, -0.023782f, 0.059157f, 0.060152f, -0.034852f, 0.028408f, -0.059520f, -0.089369f, 0.002187f, -0.062851f, 0.008267f, -0.007862f, 0.048632f, -0.036102f, 0.034697f, 0.029779f, 0.048773f, -0.074258f, 0.008097f, -0.045447f, -0.041662f, 0.004511f, -0.053783f, -0.034682f, 0.048796f, -0.014245f, 0.018519f, 0.056997f, -0.011322f, 0.018770f, -0.046982f, 0.005405f, -0.051802f, 0.048007f, -0.042948f, -0.028501f, -0.031712f, 0.053547f, 0.042886f, -0.030738f, 0.058650f, 0.038861f, -0.012448f, 0.058233f, -0.003283f, -0.061617f, -0.017068f, -0.007266f, -0.048057f, 0.010811f, -0.101632f, 0.010188f, -0.025898f, -0.048764f, -0.039432f, 0.045400f, -0.027186f, 0.094136f, 0.069895f, -0.105271f, -0.000030f, -0.002767f, 0.004972f, 0.048639f, -0.082721f, -0.057656f, 0.056754f, -0.047398f, -0.059290f, -0.068197f, 0.004510f, 0.139970f, 0.069488f, -0.065192f, -0.041122f, 0.005635f, 0.050852f, 0.019439f, -0.068238f, 0.010080f, -0.045630f, -0.026800f, -0.002537f, -0.008264f, 0.002502f, 0.044873f, 0.010494f, 0.026576f, 0.017531f, -0.052486f, 0.013935f, 0.023444f, -0.007562f, -0.018976f, + 0.002604f, -0.044818f, 0.039636f, 0.014354f, 0.010697f, -0.059424f, 0.009700f, 0.030482f, 0.008421f, -0.014135f, -0.011321f, 0.026174f, -0.043518f, -0.002925f, -0.032530f, -0.017992f, 0.042131f, -0.044968f, -0.002124f, 0.026558f, -0.022797f, 0.020782f, 0.025117f, 0.006455f, 0.003466f, 0.018502f, 0.005736f, -0.024030f, 0.034434f, -0.027059f, -0.021460f, -0.012387f, -0.037215f, -0.011773f, -0.033478f, -0.032067f, 0.012920f, 0.052501f, -0.058160f, 0.029285f, -0.097729f, -0.014645f, -0.038007f, -0.033122f, 0.051801f, -0.066761f, -0.104173f, 0.060937f, 0.091738f, 0.022282f, -0.017727f, -0.083220f, 0.005693f, 0.032670f, 0.032640f, -0.013898f, -0.033356f, 0.004244f, -0.008214f, -0.010839f, 0.010638f, -0.012210f, -0.027939f, -0.054481f, 0.006935f, -0.032758f, 0.008152f, -0.029360f, -0.062188f, 0.038715f, 0.028456f, 0.047588f, 0.001684f, 0.051462f, 0.028809f, 0.007804f, -0.016659f, -0.026197f, -0.042817f, -0.030480f, -0.017214f, 0.012239f, 0.029552f, -0.019721f, -0.009646f, -0.070803f, 0.066567f, 0.078937f, 0.043901f, -0.040082f, 0.042128f, -0.054769f, -0.000822f, 0.012757f, -0.119962f, 0.009947f, + 0.012001f, 0.056877f, -0.071544f, 0.092608f, 0.036414f, -0.066060f, -0.037413f, 0.028037f, -0.011417f, -0.048347f, -0.059354f, -0.063916f, -0.087262f, 0.064546f, -0.027347f, 0.010333f, -0.133496f, -0.052989f, 0.008455f, 0.001671f, 0.030910f, -0.021096f, 0.005674f, 0.023028f, 0.024249f, -0.063664f, -0.014393f, 0.010595f, 0.035683f, 0.025903f, -0.005229f, -0.024333f, -0.010189f, -0.005111f, 0.033348f, 0.005830f, -0.020395f, -0.002266f, -0.015779f, -0.006025f, 0.030877f, 0.014219f, -0.014816f, 0.032837f, -0.032192f, -0.018845f, -0.023934f, 0.031748f, -0.012218f, 0.004000f, -0.014176f, 0.014003f, -0.044886f, 0.006930f, 0.019284f, 0.007373f, -0.007549f, -0.019543f, -0.016611f, -0.022908f, 0.023333f, 0.005151f, -0.007231f, -0.026270f, 0.027827f, 0.001727f, 0.002434f, 0.004077f, -0.045658f, -0.022467f, -0.029720f, 0.004062f, -0.014802f, 0.000346f, -0.000569f, -0.010565f, -0.025515f, -0.009247f, -0.091211f, -0.012036f, 0.033461f, -0.042760f, -0.039800f, 0.037887f, 0.038440f, 0.007924f, -0.035927f, -0.123531f, -0.017994f, 0.024330f, 0.014940f, 0.053767f, -0.000979f, 0.031305f, -0.007866f, -0.000667f, + -0.015363f, 0.002422f, 0.032956f, 0.003881f, 0.001556f, 0.031901f, -0.008271f, -0.007595f, -0.041588f, -0.003787f, -0.006497f, -0.004622f, 0.007425f, 0.025429f, 0.034908f, -0.006767f, 0.000250f, 0.027236f, -0.005912f, -0.052391f, -0.003353f, -0.046518f, 0.007031f, 0.006341f, -0.060747f, 0.044232f, -0.083793f, 0.018800f, 0.023405f, -0.036898f, -0.002319f, 0.108959f, -0.030579f, 0.036740f, -0.022728f, 0.019406f, -0.081353f, 0.008720f, 0.048087f, -0.001377f, 0.041540f, -0.009709f, 0.004605f, -0.002782f, 0.053020f, -0.034048f, -0.040417f, 0.046618f, -0.042875f, -0.053507f, -0.000355f, -0.085375f, 0.057186f, 0.047071f, -0.016721f, 0.018040f, 0.008213f, -0.000731f, -0.072206f, -0.012186f, -0.005187f, 0.031720f, 0.012366f, -0.030873f, 0.029187f, -0.002369f, -0.036578f, -0.025377f, -0.022592f, 0.004586f, 0.005418f, -0.005388f, -0.000423f, 0.022820f, -0.022479f, -0.006973f, 0.016408f, -0.024830f, -0.012746f, 0.018379f, -0.024601f, 0.001206f, 0.022696f, 0.000931f, -0.005734f, 0.009168f, -0.000338f, 0.001696f, 0.019928f, -0.007608f, -0.005329f, -0.015372f, 0.007060f, -0.009936f, -0.008321f, 0.007891f, + 0.011278f, -0.021484f, 0.004059f, -0.020132f, 0.019555f, -0.022859f, 0.013107f, -0.000888f, -0.003183f, 0.001451f, -0.004035f, -0.003386f, -0.000037f, 0.014486f, -0.044681f, -0.136119f, -0.063728f, -0.020872f, 0.045133f, 0.101180f, -0.091710f, 0.020684f, -0.026193f, -0.092451f, -0.012520f, 0.084100f, 0.022984f, 0.069382f, -0.057603f, 0.017836f, -0.019617f, 0.004629f, 0.041129f, 0.007446f, 0.022578f, -0.012575f, -0.118002f, 0.035723f, 0.006327f, -0.049712f, 0.052155f, 0.040028f, -0.035309f, 0.037054f, 0.004888f, -0.037980f, 0.012344f, -0.023228f, 0.074634f, 0.009724f, 0.030534f, 0.002069f, -0.075528f, -0.060264f, -0.020006f, -0.044485f, 0.050008f, 0.071754f, 0.073618f, 0.059494f, -0.019842f, 0.008874f, -0.059243f, -0.008345f, -0.005496f, -0.024482f, -0.030978f, 0.005759f, 0.006289f, -0.081457f, -0.023543f, -0.031432f, -0.001746f, 0.037471f, -0.039908f, -0.008644f, 0.014714f, 0.000772f, 0.042786f, -0.046161f, -0.001409f, -0.052381f, -0.027398f, -0.038541f, 0.022107f, 0.014808f, 0.042727f, -0.005019f, -0.003912f, -0.049323f, -0.014525f, -0.023057f, -0.005827f, 0.021819f, 0.029396f, 0.060137f, + -0.037679f, 0.011518f, -0.032591f, 0.012559f, 0.022723f, 0.006904f, -0.017742f, -0.006752f, -0.005950f, -0.006751f, -0.002261f, 0.016380f, 0.016941f, -0.004011f, -0.001518f, -0.007265f, -0.011286f, 0.008318f, 0.016851f, 0.006255f, 0.002244f, 0.005134f, -0.013450f, -0.015462f, -0.014697f, 0.025652f, -0.000305f, 0.017960f, 0.014653f, -0.001695f, -0.019058f, -0.020180f, 0.003503f, 0.006532f, -0.015752f, -0.004471f, -0.013662f, 0.011089f, -0.009795f, 0.004250f, 0.003339f, 0.011570f, -0.005110f, -0.005689f, 0.003043f, 0.004652f, -0.007942f, 0.013244f, -0.004056f, 0.035587f, -0.057426f, -0.226690f, -0.119516f, 0.024536f, 0.095404f, 0.213444f, 0.163113f, 0.091875f, 0.030977f, 0.047922f, -0.015153f, -0.089760f, -0.173551f, -0.230955f, -0.058370f, -0.066945f, 0.003535f, 0.112476f, 0.160520f, 0.107573f, 0.143834f, 0.033074f, 0.030548f, -0.016842f, -0.072649f, -0.082406f, -0.066523f, -0.070822f, -0.087428f, -0.070225f, -0.029904f, -0.004558f, -0.000972f, 0.056046f, 0.072905f, 0.139123f, 0.065883f, 0.021590f, 0.057267f, 0.088756f, 0.028443f, 0.016874f, -0.071541f, -0.098188f, -0.160206f, -0.074192f, + -0.083957f, -0.060960f, -0.036083f, -0.028544f, 0.012023f, 0.019644f, 0.067572f, 0.137929f, 0.111215f, 0.121072f, 0.089896f, 0.109825f, 0.081984f, -0.066277f, -0.060469f, -0.152945f, -0.118180f, -0.086765f, -0.194436f, -0.150683f, -0.091912f, 0.007144f, 0.118154f, 0.112263f, 0.133045f, 0.165943f, 0.142243f, 0.076325f, 0.092396f, 0.003472f, -0.035895f, -0.097651f, -0.141324f, -0.142332f, -0.117086f, -0.070693f, -0.014999f, 0.020038f, 0.034505f, 0.039203f, 0.065910f, 0.047250f, 0.077063f, 0.048410f, 0.019442f, 0.012329f, -0.002732f, -0.007789f, -0.001617f, -0.053397f, -0.036910f, -0.007749f, -0.024495f, -0.063749f, -0.017614f, -0.023048f, -0.023403f, -0.004657f, 0.047693f, 0.089473f, 0.074649f, 0.007570f, 0.073380f, 0.051268f, -0.009356f, -0.060504f, -0.095106f, -0.088943f, -0.039913f, -0.044206f, -0.027223f, -0.015555f, 0.025523f, 0.055280f, 0.077359f, 0.087318f, 0.063381f, 0.024345f, 0.027272f, -0.017162f, -0.047665f, -0.081133f, -0.072102f, -0.032432f, -0.002990f, -0.024070f, -0.007479f, 0.022795f, 0.029763f, 0.030020f, 0.029235f, 0.006981f, 0.012309f, 0.018068f, -0.003003f, -0.017382f, + 0.000735f, 0.005411f, -0.012188f, -0.014522f, -0.001818f, 0.004731f, 0.004088f, -0.009548f, -0.004515f, 0.003111f, 0.001533f, -0.008372f, -0.013227f, -0.010679f, 0.003989f, 0.000684f, -0.000608f, 0.007889f, 0.014833f, 0.010978f, 0.011308f, 0.007692f, 0.006184f, -0.000838f, -0.004084f, -0.007052f, -0.009628f, -0.008407f, -0.002862f, -0.006794f, -0.005802f, -0.005031f, 0.005369f, 0.006165f, -0.001815f, -0.002941f, 0.005822f, 0.003303f, -0.000615f, -0.000958f, -0.001445f, -0.004147f, 0.003267f, 0.004447f, 0.002301f, 0.003963f, 0.007776f, 0.007876f, 0.007037f, 0.000537f, -0.002281f, -0.004565f, -0.006886f, -0.013173f, -0.015566f, -0.013244f, -0.008824f, -0.007032f, -0.000320f, 0.006997f, 0.013006f, 0.016085f, 0.018387f, 0.015913f, 0.011718f, 0.005079f, -0.000369f, -0.006990f, -0.012010f, -0.014682f, -0.013413f, -0.013831f, -0.009364f, -0.004441f, -0.000720f, 0.003387f, 0.008708f, 0.009241f, 0.008702f, 0.007740f, 0.006493f, 0.003040f, 0.000120f, -0.002020f, -0.002140f, -0.002632f, -0.002713f, -0.002799f, -0.002014f, -0.001508f, -0.000791f, -0.000423f, -0.000123f, -0.000022f, 0.000262f, 0.000363f, + 0.000454f}, + {-0.002889f, -0.004115f, -0.007908f, 0.004621f, 0.007394f, 0.013114f, 0.003542f, -0.009213f, -0.016381f, 0.003552f, -0.007652f, 0.000647f, 0.005145f, 0.001996f, 0.013258f, -0.010969f, -0.002698f, -0.001498f, -0.000866f, -0.009418f, 0.005802f, 0.002449f, 0.001214f, 0.000246f, -0.004592f, -0.003544f, -0.003324f, -0.001083f, 0.000466f, 0.002208f, -0.003461f, 0.005040f, 0.011875f, -0.000389f, 0.005280f, -0.008426f, -0.004878f, -0.010083f, -0.004852f, 0.010686f, 0.000520f, -0.002195f, 0.001911f, 0.011336f, 0.001233f, 0.005695f, -0.001423f, -0.005339f, -0.001659f, 0.006465f, -0.005556f, 0.010153f, 0.006273f, 0.011449f, 0.005672f, 0.000714f, -0.003496f, -0.007616f, -0.004200f, -0.006623f, -0.001006f, -0.004838f, 0.001921f, 0.000408f, -0.002583f, 0.001664f, -0.002217f, 0.004085f, -0.001011f, -0.001147f, 0.005808f, -0.000593f, -0.000400f, 0.000757f, -0.005594f, 0.002538f, -0.004091f, -0.006634f, -0.003797f, -0.002927f, 0.002894f, -0.000563f, -0.000445f, -0.007524f, -0.001233f, 0.001940f, 0.001493f, -0.003000f, 0.000298f, -0.002966f, 0.001338f, 0.002090f, 0.001589f, 0.000575f, -0.000502f, -0.001219f, + 0.000366f, -0.002340f, -0.001236f, 0.000492f, 0.000366f, 0.001011f, 0.001024f, 0.000909f, 0.000227f, 0.002134f, -0.022852f, -0.005171f, 0.009384f, 0.001650f, 0.012790f, 0.006825f, -0.010515f, 0.002781f, -0.000221f, 0.004193f, -0.003761f, -0.017547f, 0.010140f, 0.006213f, 0.011618f, 0.014516f, 0.012502f, 0.004384f, 0.000176f, -0.017879f, -0.001838f, 0.008215f, -0.008148f, -0.007072f, -0.018668f, -0.001251f, -0.003119f, -0.002158f, -0.004748f, 0.002215f, -0.011142f, 0.005087f, -0.001950f, 0.004720f, 0.001393f, -0.007492f, 0.005788f, 0.004829f, 0.012956f, -0.001506f, -0.010371f, -0.005357f, 0.005618f, 0.002260f, -0.002593f, 0.000540f, 0.004137f, 0.000540f, -0.007578f, -0.000069f, 0.001600f, -0.000805f, 0.000483f, -0.004783f, -0.002096f, -0.006370f, -0.001310f, 0.007847f, 0.002806f, -0.002679f, 0.003353f, -0.001018f, -0.000403f, 0.001192f, -0.009102f, -0.000836f, -0.000451f, 0.005093f, 0.009857f, -0.002914f, -0.000994f, -0.006358f, -0.004924f, 0.002518f, 0.011216f, -0.009925f, -0.001554f, 0.002549f, -0.000539f, -0.002695f, -0.000173f, -0.002628f, 0.003652f, 0.003834f, 0.002026f, 0.006233f, + -0.002964f, -0.001917f, -0.000639f, 0.001466f, -0.001426f, 0.000259f, 0.001009f, 0.000843f, -0.000753f, -0.002667f, 0.001939f, -0.002657f, 0.012626f, 0.004727f, 0.004256f, -0.004258f, 0.000317f, 0.001171f, 0.001195f, -0.021728f, -0.011756f, -0.001003f, -0.005416f, -0.006738f, -0.000349f, -0.005676f, -0.022107f, 0.013148f, 0.003015f, 0.005941f, -0.002338f, 0.004515f, -0.005853f, 0.000259f, 0.000782f, 0.011362f, -0.004060f, -0.002419f, -0.001915f, -0.001946f, -0.001832f, -0.000827f, 0.012324f, -0.002410f, -0.000196f, -0.007048f, -0.000406f, -0.003414f, 0.003997f, 0.002007f, -0.011964f, 0.009246f, -0.012110f, -0.000254f, 0.010596f, -0.001543f, 0.000383f, 0.000785f, -0.000259f, -0.007437f, -0.005283f, 0.012157f, 0.007029f, -0.015120f, -0.008082f, 0.002363f, -0.008879f, -0.006457f, 0.006446f, -0.010890f, 0.002096f, 0.002605f, 0.006197f, 0.012947f, 0.009930f, 0.006057f, 0.004633f, -0.008868f, -0.009232f, -0.007920f, 0.002549f, 0.011261f, 0.004348f, -0.001965f, -0.005058f, 0.003672f, -0.004279f, -0.001889f, 0.002613f, -0.004216f, -0.006360f, -0.000885f, 0.005069f, -0.000954f, -0.004347f, 0.000544f, + 0.000025f, 0.004922f, 0.002047f, 0.004545f, 0.001025f, -0.002132f, -0.002170f, -0.001756f, -0.000917f, -0.000611f, 0.001453f, 0.002843f, 0.003403f, 0.003563f, 0.016602f, -0.004055f, -0.004233f, -0.004966f, 0.004688f, -0.005557f, 0.008122f, -0.015732f, -0.002009f, 0.011684f, 0.006120f, -0.011830f, 0.008766f, 0.014386f, 0.013577f, 0.008661f, 0.001667f, -0.000532f, -0.008868f, -0.011437f, 0.004861f, -0.001093f, 0.011477f, -0.000893f, 0.006866f, -0.007142f, -0.004751f, -0.003829f, 0.001142f, 0.003662f, -0.000645f, -0.013969f, 0.002953f, 0.004848f, 0.003521f, 0.006032f, 0.003702f, -0.007578f, -0.018671f, -0.006007f, 0.002739f, 0.003608f, 0.000883f, -0.000795f, 0.003547f, -0.007656f, -0.000122f, -0.013909f, 0.006506f, -0.014351f, -0.003783f, -0.006082f, -0.009445f, 0.006899f, 0.003050f, 0.002928f, -0.008247f, -0.004007f, -0.002426f, -0.008269f, 0.000784f, -0.000698f, 0.004423f, -0.003542f, -0.006965f, -0.005313f, -0.016525f, 0.005254f, 0.001916f, 0.007103f, 0.010469f, 0.013373f, 0.005219f, -0.005264f, -0.007873f, -0.003713f, 0.007265f, 0.007250f, -0.008205f, 0.008953f, 0.000381f, -0.005817f, + 0.012905f, -0.002500f, 0.002911f, 0.002192f, 0.003786f, -0.000228f, -0.002883f, 0.000839f, 0.004011f, 0.001442f, -0.000634f, 0.004346f, -0.002275f, -0.001780f, -0.003152f, 0.001491f, 0.000392f, -0.001611f, 0.002375f, -0.002303f, -0.004153f, -0.001742f, 0.003148f, -0.000758f, -0.000724f, 0.001134f, 0.008163f, 0.007532f, -0.001461f, 0.005292f, -0.016177f, 0.001763f, -0.007798f, 0.000718f, 0.002251f, -0.010207f, 0.003542f, 0.029391f, 0.003087f, -0.002728f, -0.016754f, 0.023638f, -0.000193f, 0.009860f, 0.001041f, -0.000613f, -0.013053f, 0.012424f, 0.003078f, -0.007046f, 0.001498f, 0.000835f, -0.005297f, 0.004957f, 0.013074f, -0.003959f, 0.013911f, -0.004273f, 0.005868f, -0.000335f, 0.009123f, 0.008124f, 0.009084f, -0.000009f, -0.005176f, 0.007121f, -0.005447f, 0.006260f, -0.001970f, 0.006312f, 0.006096f, 0.005874f, -0.000927f, -0.001949f, 0.002249f, -0.005303f, -0.007660f, -0.019303f, 0.012393f, -0.012519f, 0.008528f, 0.001001f, 0.003503f, -0.002346f, -0.023046f, -0.005065f, -0.006334f, -0.011260f, 0.001363f, 0.006833f, -0.014860f, -0.004759f, 0.006483f, 0.001119f, 0.010248f, 0.018053f, + -0.000651f, -0.005021f, -0.004498f, -0.018981f, 0.005635f, 0.003547f, -0.004375f, 0.000887f, 0.007340f, 0.007585f, 0.002071f, 0.001858f, 0.005270f, 0.000523f, -0.000989f, 0.007995f, 0.004614f, -0.004552f, 0.008128f, 0.005957f, 0.007976f, 0.002399f, -0.001542f, 0.000487f, -0.000687f, -0.000644f, -0.003162f, 0.000968f, -0.001982f, 0.001792f, -0.002464f, 0.003699f, 0.001206f, 0.000273f, 0.002986f, 0.000188f, -0.001110f, 0.000797f, -0.000835f, -0.000361f, -0.001236f, 0.003688f, 0.002157f, 0.000688f, 0.002538f, -0.000936f, 0.004132f, 0.000479f, 0.001219f, -0.000514f, 0.001024f, -0.000702f, -0.002624f, 0.001008f, -0.008325f, -0.010068f, -0.000931f, 0.005493f, -0.003188f, -0.004836f, -0.007320f, 0.002199f, 0.013464f, 0.006060f, 0.002165f, -0.030443f, -0.013939f, -0.004205f, 0.006293f, -0.003596f, 0.010371f, 0.034838f, 0.010880f, -0.012734f, 0.002045f, -0.015074f, -0.004839f, 0.010635f, -0.011975f, -0.003016f, 0.015584f, 0.003786f, -0.003822f, 0.002246f, 0.008844f, -0.005242f, 0.004324f, 0.004651f, 0.004627f, -0.008600f, 0.004018f, -0.004009f, -0.004863f, -0.012726f, -0.004893f, -0.007428f, + -0.014136f, 0.006245f, 0.000569f, -0.000941f, 0.014429f, 0.010503f, 0.003761f, 0.011543f, 0.000154f, -0.014574f, 0.012375f, -0.001375f, -0.009908f, -0.007868f, -0.014424f, 0.000673f, 0.017569f, 0.001205f, -0.007603f, 0.007437f, -0.012922f, -0.008142f, 0.006834f, -0.010528f, -0.013920f, -0.007360f, -0.004318f, 0.007903f, -0.012284f, -0.003828f, -0.005661f, 0.015922f, 0.002404f, -0.005533f, 0.007923f, -0.004792f, -0.005697f, 0.000889f, 0.012728f, -0.002388f, 0.000953f, 0.006963f, 0.004116f, -0.016126f, -0.000493f, 0.009798f, 0.004795f, 0.005696f, -0.001186f, -0.003158f, 0.007352f, -0.004345f, 0.001376f, -0.003572f, 0.002192f, 0.002671f, 0.003869f, -0.008209f, 0.000185f, 0.000798f, 0.002194f, 0.000443f, 0.000229f, 0.003760f, -0.000573f, -0.000792f, -0.003456f, 0.002740f, 0.003937f, 0.010674f, 0.007730f, -0.019709f, 0.018835f, -0.007002f, 0.001801f, -0.008579f, 0.016142f, -0.002214f, -0.010757f, -0.035249f, -0.004640f, 0.018392f, 0.004611f, -0.027468f, 0.012624f, 0.000044f, -0.005565f, -0.008767f, -0.007081f, -0.002658f, -0.016302f, -0.002702f, 0.013314f, 0.017299f, 0.020590f, 0.012514f, + 0.018783f, -0.006070f, 0.014812f, 0.007160f, -0.029005f, -0.000628f, 0.007647f, 0.010386f, 0.005116f, -0.009971f, 0.000650f, -0.002038f, 0.010343f, -0.017378f, -0.006189f, 0.013013f, -0.004199f, 0.007340f, 0.003906f, -0.011560f, -0.012818f, -0.006609f, -0.019247f, -0.005451f, -0.005856f, 0.007986f, 0.002959f, -0.011132f, -0.002489f, -0.023829f, -0.005939f, 0.009797f, -0.006899f, -0.023548f, -0.000274f, 0.013447f, -0.028548f, 0.008348f, 0.004842f, 0.009143f, -0.013496f, -0.006268f, -0.012823f, 0.001041f, -0.003798f, -0.014576f, -0.003770f, -0.002418f, 0.008867f, 0.004999f, 0.021481f, 0.001397f, 0.000301f, 0.003450f, -0.001550f, -0.010812f, 0.013605f, 0.004752f, -0.005500f, 0.011891f, 0.002221f, -0.005862f, 0.002024f, -0.000340f, 0.007280f, 0.001683f, 0.001483f, 0.004520f, -0.003778f, 0.000190f, -0.004063f, 0.000016f, -0.003225f, 0.003323f, -0.001282f, 0.001452f, 0.004106f, 0.000597f, -0.002509f, 0.003779f, 0.000996f, 0.004019f, 0.001134f, -0.001140f, 0.001514f, 0.000391f, 0.005422f, -0.022029f, 0.004793f, 0.017469f, 0.022541f, 0.016772f, 0.017137f, 0.006556f, -0.012045f, 0.011968f, + 0.020827f, -0.031066f, 0.015439f, 0.015425f, -0.033262f, -0.008807f, 0.008062f, 0.035668f, -0.002878f, -0.002382f, -0.008611f, -0.010131f, 0.044173f, 0.021836f, 0.006070f, 0.005426f, 0.022871f, -0.000530f, -0.003578f, -0.008694f, 0.003347f, -0.020021f, -0.018057f, -0.004218f, 0.005481f, 0.013204f, 0.005961f, 0.002907f, -0.006866f, 0.001171f, -0.014699f, 0.005964f, -0.021745f, 0.021105f, -0.002458f, -0.010694f, -0.012536f, -0.014332f, -0.021936f, 0.003657f, -0.021236f, -0.007236f, 0.014439f, -0.003496f, -0.007327f, -0.007088f, -0.003467f, -0.018218f, -0.012652f, -0.008281f, -0.007791f, -0.004259f, 0.006573f, 0.003584f, 0.001023f, 0.000835f, -0.016066f, 0.027393f, 0.015743f, 0.000251f, -0.002102f, 0.036068f, -0.004441f, -0.006392f, -0.008962f, -0.018486f, -0.005100f, 0.011963f, 0.011567f, -0.001933f, 0.014092f, -0.028302f, 0.008257f, -0.010887f, 0.002628f, 0.010688f, -0.003844f, -0.000402f, 0.001696f, 0.000768f, 0.003411f, -0.004586f, 0.005181f, 0.006586f, -0.006403f, 0.002451f, 0.003489f, 0.004235f, 0.011445f, -0.008822f, -0.000853f, 0.001048f, -0.000277f, 0.002520f, 0.001216f, 0.002636f, + 0.003566f, -0.003324f, 0.002271f, -0.001165f, 0.000220f, -0.006355f, -0.001392f, -0.001643f, 0.005190f, -0.005403f, 0.040959f, 0.014105f, 0.008806f, 0.019970f, -0.022162f, -0.013269f, 0.012958f, 0.013767f, 0.030451f, 0.004553f, 0.008624f, -0.020208f, -0.000983f, 0.010229f, -0.026533f, -0.008450f, 0.010927f, -0.008765f, 0.000554f, 0.007478f, 0.019988f, -0.006549f, 0.007945f, 0.004202f, 0.004568f, 0.017032f, 0.014922f, 0.018140f, -0.013948f, -0.009331f, 0.019711f, -0.024592f, -0.007999f, -0.008066f, -0.001444f, -0.006565f, -0.015593f, 0.015510f, -0.000339f, -0.016934f, 0.001019f, -0.006603f, -0.017562f, -0.022027f, -0.012107f, -0.013162f, 0.026378f, -0.008226f, -0.006451f, -0.015398f, -0.001078f, -0.007787f, 0.004256f, 0.030966f, -0.005576f, -0.009991f, 0.005460f, -0.001728f, 0.018010f, -0.020561f, 0.035176f, 0.007113f, -0.033445f, -0.024362f, 0.009078f, -0.022550f, 0.000575f, -0.024152f, 0.000316f, 0.005285f, -0.002899f, 0.026296f, 0.033040f, -0.015516f, 0.004186f, -0.006342f, -0.024093f, -0.008980f, -0.013029f, -0.015758f, -0.003443f, 0.012028f, -0.008043f, -0.018590f, 0.012575f, 0.000903f, + -0.009917f, -0.008461f, 0.004284f, 0.007024f, -0.002807f, -0.001870f, -0.009324f, 0.000604f, -0.008593f, -0.001681f, -0.004197f, 0.006224f, 0.007144f, 0.001744f, -0.008528f, 0.001014f, 0.000777f, 0.005725f, 0.000089f, -0.002086f, 0.000687f, -0.010894f, -0.000991f, -0.006111f, -0.004177f, 0.000928f, 0.002691f, -0.005692f, 0.004699f, -0.003283f, -0.002923f, 0.007524f, -0.002757f, -0.007197f, -0.036101f, 0.013145f, 0.073537f, -0.013149f, -0.001215f, -0.032714f, -0.013978f, 0.021593f, -0.003563f, 0.042031f, 0.025090f, 0.023173f, -0.000209f, 0.017804f, -0.035062f, 0.031216f, 0.015983f, 0.001153f, 0.003750f, -0.020452f, 0.008362f, -0.000638f, 0.031795f, 0.017611f, 0.021058f, -0.008135f, 0.001707f, 0.005260f, -0.021998f, -0.017774f, -0.008330f, 0.009539f, 0.037141f, -0.010740f, -0.013060f, -0.013112f, -0.007542f, 0.004546f, -0.024258f, -0.007261f, -0.001974f, -0.013104f, -0.025659f, -0.005669f, -0.032445f, -0.011982f, 0.018458f, -0.022613f, -0.010138f, -0.004719f, 0.001396f, -0.036439f, -0.022174f, -0.005035f, -0.004173f, -0.007218f, 0.022379f, 0.009695f, 0.001117f, 0.013420f, 0.023063f, -0.014759f, + -0.006377f, -0.020012f, 0.008574f, -0.015805f, 0.012804f, 0.014842f, 0.017817f, 0.032788f, 0.008993f, -0.025224f, -0.004446f, 0.055163f, 0.017682f, 0.030882f, 0.014651f, 0.009169f, -0.002534f, 0.003491f, -0.013519f, -0.017078f, 0.007180f, 0.005233f, -0.017056f, 0.004137f, 0.011250f, 0.010235f, -0.016397f, 0.012231f, 0.003872f, 0.008733f, 0.010080f, -0.000369f, 0.004661f, 0.008434f, 0.003193f, 0.009953f, -0.001435f, 0.001921f, -0.003632f, -0.007219f, 0.001087f, 0.008653f, 0.000925f, -0.004190f, 0.014014f, 0.008916f, 0.007440f, 0.000029f, -0.002160f, -0.002659f, -0.000795f, 0.000203f, -0.002772f, 0.004777f, 0.003528f, 0.003701f, 0.003957f, 0.001932f, -0.008120f, 0.038059f, 0.041713f, -0.042235f, 0.010267f, 0.030888f, 0.018620f, -0.011814f, -0.022518f, -0.019461f, 0.043462f, 0.003528f, 0.016300f, 0.022799f, -0.013092f, 0.006410f, 0.009470f, -0.026680f, -0.028414f, 0.022992f, 0.007729f, -0.041256f, -0.009618f, 0.053580f, 0.025596f, -0.000122f, -0.030686f, 0.010020f, 0.007929f, 0.032586f, 0.010657f, -0.015897f, 0.021212f, 0.003775f, -0.009103f, -0.003095f, -0.006580f, -0.025420f, + -0.012153f, 0.003907f, 0.004253f, -0.030337f, -0.032900f, -0.019371f, -0.009543f, -0.036022f, 0.021278f, -0.002226f, -0.025750f, 0.004914f, 0.000460f, -0.011071f, -0.003253f, 0.007779f, -0.000360f, 0.008192f, 0.009297f, 0.014575f, -0.014412f, -0.016857f, 0.022184f, 0.045371f, 0.020350f, 0.012440f, 0.032881f, -0.006131f, 0.017838f, 0.044116f, 0.026756f, 0.004229f, 0.004740f, -0.013685f, -0.027138f, 0.026293f, -0.025863f, 0.011635f, -0.010474f, 0.008116f, -0.033807f, 0.016232f, -0.000636f, -0.010876f, -0.006542f, 0.019229f, -0.018330f, -0.008993f, -0.004906f, 0.003043f, -0.000659f, 0.005798f, -0.007413f, -0.000758f, -0.013170f, -0.003122f, -0.000993f, 0.002546f, -0.004120f, 0.004654f, -0.005100f, 0.004067f, -0.004597f, 0.014847f, 0.004327f, -0.003566f, -0.007073f, 0.005759f, 0.000348f, 0.005309f, 0.004333f, -0.003269f, 0.003871f, 0.005640f, -0.003895f, 0.001672f, 0.006378f, -0.001747f, 0.002069f, 0.007612f, 0.007416f, 0.013691f, -0.008540f, -0.039496f, 0.011167f, -0.019013f, -0.008729f, -0.014686f, -0.002418f, 0.033914f, 0.033607f, -0.067800f, 0.021063f, 0.021581f, -0.021007f, -0.034474f, + -0.044933f, 0.007981f, -0.013150f, 0.008371f, -0.015635f, -0.012321f, -0.007233f, 0.042033f, 0.010712f, -0.003626f, -0.000647f, -0.006662f, -0.012477f, 0.010649f, 0.007065f, -0.000174f, 0.016928f, 0.003683f, -0.003474f, 0.006020f, 0.015375f, 0.043361f, 0.004443f, 0.005349f, -0.021334f, -0.009160f, -0.010054f, -0.010778f, -0.001225f, -0.003607f, 0.014447f, 0.020737f, 0.001074f, 0.023953f, -0.005474f, -0.004057f, -0.004817f, -0.002679f, -0.041922f, 0.047374f, 0.001318f, 0.003342f, -0.003389f, -0.012337f, 0.012677f, -0.003270f, 0.019340f, 0.001066f, -0.018293f, 0.004953f, 0.020503f, -0.014539f, 0.019052f, 0.004574f, -0.028864f, -0.004984f, -0.006083f, -0.052743f, -0.017879f, 0.013434f, 0.013737f, -0.021581f, -0.012258f, 0.012533f, 0.001880f, 0.035175f, -0.027934f, 0.012731f, 0.015863f, -0.002337f, 0.013894f, 0.012712f, 0.015733f, 0.005939f, 0.007087f, 0.006236f, 0.005318f, -0.002417f, -0.002720f, -0.009173f, 0.003786f, 0.013085f, 0.002505f, -0.009742f, -0.003594f, -0.005544f, 0.003288f, -0.004323f, -0.003410f, -0.006529f, 0.008699f, 0.004735f, 0.005991f, 0.000518f, -0.015158f, 0.006017f, + -0.015405f, 0.001081f, 0.002680f, 0.005381f, -0.007204f, -0.003693f, -0.002117f, 0.004918f, 0.009534f, 0.004086f, 0.004138f, 0.001170f, 0.004336f, -0.010604f, 0.034905f, 0.010301f, 0.010998f, -0.024978f, 0.019230f, -0.009795f, 0.018340f, -0.013804f, 0.023551f, -0.020797f, -0.016888f, 0.032228f, 0.004315f, 0.008483f, -0.018663f, -0.042185f, -0.003735f, 0.012743f, 0.003635f, 0.018559f, -0.014853f, 0.002677f, 0.000119f, -0.031421f, -0.022554f, 0.010825f, -0.035524f, -0.023171f, 0.011756f, 0.000469f, -0.037160f, -0.005043f, -0.018356f, 0.024207f, 0.014650f, 0.004628f, -0.008421f, -0.023163f, -0.049579f, 0.017914f, -0.022035f, 0.027627f, -0.007925f, -0.008813f, -0.004308f, -0.012927f, 0.007912f, 0.007464f, -0.039568f, -0.017294f, 0.039582f, 0.034648f, -0.035146f, 0.046389f, 0.002703f, 0.034239f, -0.007811f, -0.007840f, -0.003956f, -0.013090f, 0.017958f, -0.012897f, -0.036883f, -0.019463f, 0.044543f, -0.009606f, -0.008559f, -0.002179f, 0.014031f, 0.009064f, 0.022674f, -0.050510f, 0.015331f, 0.034871f, 0.027600f, -0.010852f, -0.002501f, -0.010680f, -0.022647f, 0.002866f, 0.021465f, 0.033037f, + -0.019770f, -0.020127f, -0.022717f, -0.002092f, -0.003405f, 0.002399f, -0.010703f, 0.005981f, 0.006143f, -0.003665f, -0.001244f, -0.004711f, -0.009701f, 0.010070f, 0.000598f, 0.001722f, -0.014917f, -0.012664f, -0.003039f, -0.016492f, -0.006107f, -0.008164f, 0.002274f, -0.005720f, 0.000432f, 0.013086f, -0.004802f, 0.005578f, 0.000240f, -0.011806f, 0.002776f, -0.005856f, -0.001137f, 0.005371f, 0.011723f, 0.001795f, 0.005171f, 0.010747f, 0.010930f, 0.014107f, -0.003970f, -0.003594f, -0.002076f, 0.014456f, -0.001754f, -0.022868f, -0.000840f, -0.017562f, 0.023866f, 0.018529f, -0.017990f, -0.030653f, -0.025724f, -0.015090f, -0.029816f, -0.001631f, 0.014118f, 0.032769f, -0.005667f, -0.001529f, -0.054800f, 0.032858f, 0.040867f, -0.006443f, -0.022233f, -0.022542f, -0.014006f, 0.061564f, -0.037482f, -0.000089f, -0.004442f, 0.016651f, -0.002780f, 0.070922f, 0.001702f, -0.038526f, -0.010184f, -0.036609f, 0.047815f, 0.041655f, -0.033613f, 0.039189f, 0.009767f, 0.031559f, 0.011745f, -0.059112f, 0.018516f, 0.031711f, -0.041027f, -0.011316f, -0.046549f, -0.023183f, 0.001562f, -0.042783f, -0.036605f, -0.000987f, + -0.029670f, -0.000359f, 0.010357f, -0.010545f, -0.029435f, 0.024179f, 0.021806f, -0.048307f, -0.037033f, 0.020280f, 0.008464f, 0.013058f, 0.024454f, 0.032102f, -0.011860f, -0.017327f, -0.001069f, -0.011208f, -0.000688f, -0.003529f, -0.016305f, 0.006508f, -0.067227f, 0.022947f, 0.032577f, -0.034567f, -0.028625f, 0.021728f, -0.021942f, -0.019736f, -0.009536f, 0.012192f, 0.001619f, 0.041744f, 0.000229f, 0.024422f, -0.002487f, -0.016895f, 0.008946f, 0.012650f, 0.012944f, -0.010870f, 0.000184f, 0.001434f, -0.001634f, -0.006945f, -0.016731f, 0.011069f, 0.017397f, -0.008872f, -0.029373f, 0.007553f, 0.002403f, 0.031112f, -0.003096f, -0.012020f, 0.009457f, 0.003561f, 0.015374f, 0.000095f, -0.009592f, 0.000344f, 0.012508f, 0.009542f, 0.003012f, -0.003215f, 0.002244f, -0.005650f, -0.005005f, -0.014442f, 0.007146f, 0.007092f, -0.010120f, 0.004937f, 0.004229f, 0.002795f, -0.001857f, -0.004777f, 0.001096f, -0.013841f, -0.010473f, 0.000296f, 0.014852f, 0.037125f, 0.069964f, 0.110555f, 0.003080f, -0.045025f, -0.057913f, -0.013776f, 0.002026f, -0.014013f, 0.053541f, 0.040089f, 0.027643f, 0.046505f, + 0.033767f, 0.027252f, 0.001584f, 0.021906f, -0.029077f, 0.040247f, 0.046580f, 0.002914f, 0.048472f, -0.020339f, 0.003730f, 0.011041f, -0.045739f, -0.030834f, -0.011048f, -0.027309f, -0.032138f, -0.004984f, 0.049830f, -0.000937f, -0.009926f, 0.005985f, 0.010449f, -0.007044f, -0.068175f, -0.009559f, 0.017515f, -0.010274f, -0.021060f, 0.008133f, 0.026023f, 0.046387f, 0.011261f, 0.023528f, 0.032767f, 0.040417f, -0.056390f, -0.039187f, 0.021854f, -0.016561f, 0.071210f, -0.007649f, 0.061199f, -0.049761f, 0.029081f, 0.049849f, 0.001682f, 0.007935f, 0.029823f, -0.054365f, -0.025382f, 0.001225f, 0.030729f, 0.000693f, 0.035405f, 0.014269f, 0.013189f, 0.036120f, 0.012909f, -0.004975f, -0.015475f, -0.043038f, -0.010111f, 0.002340f, 0.011198f, 0.000719f, 0.000765f, 0.000819f, -0.023553f, 0.012032f, 0.007996f, 0.020133f, -0.007141f, 0.015118f, 0.024755f, 0.014688f, 0.006147f, -0.000194f, -0.003135f, 0.005149f, -0.008777f, 0.005002f, -0.008394f, 0.000155f, 0.004981f, 0.004986f, -0.007438f, 0.011105f, 0.010698f, 0.013537f, 0.001381f, 0.001008f, 0.005555f, -0.004954f, 0.009143f, -0.006990f, + 0.009238f, 0.021455f, -0.002751f, -0.004183f, 0.001515f, 0.018660f, -0.011638f, 0.004364f, -0.002368f, -0.002813f, -0.003682f, 0.002538f, 0.005034f, 0.008396f, 0.006274f, 0.006406f, 0.017217f, -0.012223f, 0.020455f, -0.010035f, -0.023773f, 0.006914f, 0.079396f, 0.026411f, 0.027888f, 0.057865f, -0.004240f, 0.012233f, 0.025227f, 0.037146f, -0.041345f, -0.033249f, -0.014065f, -0.036474f, -0.006329f, -0.048990f, 0.025217f, 0.038959f, 0.028599f, 0.038681f, -0.026042f, -0.014613f, 0.030067f, 0.023165f, -0.016269f, 0.039204f, 0.023755f, -0.009178f, -0.047981f, 0.026593f, 0.029403f, -0.024614f, -0.003515f, 0.013885f, 0.007067f, -0.038957f, 0.044845f, 0.011779f, 0.048137f, 0.026023f, 0.018958f, -0.026253f, 0.022547f, -0.014034f, 0.073312f, -0.057818f, 0.006483f, 0.021894f, -0.010771f, -0.037401f, 0.023932f, 0.023105f, -0.004387f, 0.022725f, -0.022113f, 0.059448f, -0.027450f, 0.015517f, 0.013175f, -0.038086f, -0.016225f, -0.052514f, 0.022451f, 0.015090f, -0.038688f, 0.036089f, 0.031284f, -0.027157f, 0.022504f, -0.003141f, 0.060749f, 0.019528f, -0.030041f, -0.022447f, -0.021435f, 0.018801f, + -0.012386f, 0.015985f, -0.007491f, 0.003310f, 0.020510f, 0.012531f, 0.010358f, -0.020201f, 0.052276f, 0.005481f, -0.019938f, -0.029874f, 0.025384f, 0.012216f, 0.023976f, -0.013863f, 0.007193f, 0.018536f, 0.039506f, 0.009674f, -0.006233f, 0.032373f, -0.008592f, -0.009804f, -0.004398f, 0.002869f, 0.009060f, -0.019883f, -0.016908f, 0.007084f, -0.014584f, -0.009392f, 0.002086f, -0.007492f, -0.001829f, -0.002905f, -0.014304f, 0.009749f, 0.006066f, -0.028524f, 0.006987f, -0.021434f, -0.012867f, -0.007115f, 0.010538f, 0.005076f, 0.019581f, 0.008038f, -0.000366f, 0.005040f, 0.007336f, 0.007797f, 0.000963f, 0.001851f, 0.004667f, 0.015987f, -0.005148f, -0.002901f, -0.071218f, 0.030553f, -0.060858f, 0.061315f, 0.073871f, -0.004833f, 0.012287f, -0.061577f, -0.001308f, -0.014436f, 0.005460f, 0.034401f, 0.035409f, -0.011598f, 0.018029f, 0.028438f, 0.003961f, 0.011411f, 0.007791f, 0.011248f, -0.008349f, 0.041860f, -0.006626f, 0.008802f, -0.024502f, 0.047219f, 0.009801f, -0.005427f, -0.002194f, 0.042408f, 0.015999f, 0.019546f, 0.047313f, -0.011575f, -0.030155f, 0.057906f, -0.063040f, -0.027881f, + -0.011366f, 0.012978f, 0.040863f, 0.008752f, -0.017494f, -0.018340f, -0.030662f, -0.001483f, -0.005968f, 0.011173f, 0.065887f, 0.063630f, 0.040539f, 0.057332f, -0.005706f, 0.086749f, -0.029644f, 0.023620f, -0.021141f, 0.001293f, 0.027228f, -0.014260f, 0.002949f, -0.027054f, -0.034178f, -0.000180f, -0.021552f, 0.017149f, -0.029173f, 0.042501f, -0.032721f, -0.053151f, -0.021847f, -0.014207f, -0.004887f, 0.062290f, -0.038201f, -0.009549f, -0.005492f, -0.040358f, -0.010084f, 0.022271f, 0.049495f, -0.005159f, -0.002211f, 0.001120f, -0.016290f, -0.034826f, 0.001364f, -0.002298f, -0.005182f, -0.004360f, 0.000023f, -0.020490f, 0.015862f, -0.017673f, 0.019605f, -0.008618f, -0.014922f, -0.017320f, 0.004140f, 0.014673f, -0.010843f, -0.014984f, -0.004849f, 0.011991f, 0.014427f, -0.011239f, 0.006875f, 0.007676f, 0.005281f, 0.007637f, -0.007957f, -0.008329f, 0.004229f, -0.000121f, 0.009247f, -0.012072f, 0.008181f, 0.013303f, -0.000329f, -0.005719f, -0.007045f, 0.011489f, -0.025092f, -0.013071f, 0.025520f, -0.016297f, -0.001367f, -0.005119f, 0.005304f, -0.016764f, 0.011792f, -0.006146f, 0.023040f, 0.019973f, + 0.000312f, -0.024867f, 0.109051f, 0.151403f, 0.046425f, 0.118020f, -0.025851f, -0.082113f, -0.057536f, -0.040239f, 0.019914f, 0.021686f, -0.027369f, -0.044115f, 0.038211f, 0.051364f, 0.030027f, 0.051245f, 0.039549f, 0.009741f, 0.015740f, 0.007723f, -0.002559f, -0.033755f, 0.014898f, -0.039996f, 0.028184f, 0.000233f, -0.037396f, 0.043347f, 0.026254f, 0.020722f, 0.074935f, 0.046015f, -0.021456f, -0.014491f, -0.026939f, -0.031993f, -0.039111f, -0.015477f, 0.001580f, -0.030991f, -0.009572f, 0.064685f, 0.098207f, 0.072284f, 0.009946f, 0.049324f, 0.052697f, 0.080454f, 0.036917f, -0.042683f, -0.069965f, -0.043706f, -0.044615f, 0.026416f, 0.022290f, -0.095763f, -0.065576f, -0.016930f, 0.040458f, 0.087099f, -0.065149f, -0.002601f, -0.056525f, -0.007373f, 0.071332f, -0.039213f, 0.026959f, -0.056875f, -0.009144f, -0.017000f, 0.048167f, -0.053306f, -0.030229f, 0.000865f, 0.021363f, -0.043271f, 0.099535f, -0.023400f, -0.001384f, 0.056508f, -0.024645f, 0.042487f, -0.013357f, -0.035079f, -0.027077f, 0.016518f, 0.001832f, 0.014089f, 0.009026f, -0.031307f, 0.001085f, -0.013207f, 0.038291f, 0.022299f, + 0.006958f, 0.020818f, 0.023964f, 0.001344f, -0.000046f, -0.007508f, -0.023468f, 0.048552f, -0.014732f, 0.010208f, 0.000675f, -0.028080f, 0.001427f, 0.003125f, -0.008575f, -0.018436f, -0.003704f, -0.010798f, 0.003009f, 0.007283f, -0.007906f, 0.001712f, 0.033426f, 0.023681f, -0.003894f, -0.005234f, 0.031717f, -0.013032f, -0.003576f, -0.026368f, -0.037716f, -0.014193f, -0.009655f, -0.004012f, -0.010232f, -0.042752f, -0.083129f, 0.010325f, 0.046536f, -0.038410f, 0.072014f, -0.028513f, 0.028733f, -0.009426f, -0.082852f, -0.042379f, -0.003855f, -0.048704f, -0.111906f, -0.031298f, 0.040608f, 0.062321f, -0.030181f, -0.047851f, -0.099841f, -0.029600f, 0.029692f, -0.019753f, -0.028816f, -0.049565f, 0.011968f, -0.011094f, -0.008255f, -0.009201f, 0.020378f, 0.040309f, -0.031090f, 0.031194f, 0.026646f, -0.031449f, -0.091110f, 0.007606f, 0.007564f, 0.023714f, 0.011185f, 0.059875f, 0.006207f, -0.090587f, 0.000778f, -0.099774f, -0.000282f, 0.034854f, 0.042019f, -0.007587f, 0.005723f, 0.046605f, -0.024110f, -0.017530f, -0.031120f, 0.030229f, 0.022056f, -0.014223f, 0.036015f, -0.011008f, 0.015265f, 0.016857f, + 0.058832f, 0.007994f, -0.020657f, -0.062623f, -0.021470f, 0.032761f, 0.028443f, 0.050042f, 0.072811f, 0.125942f, 0.062759f, 0.030435f, -0.032615f, -0.126100f, -0.034482f, -0.018050f, 0.096689f, -0.016044f, 0.006133f, -0.000234f, -0.030355f, 0.004327f, 0.028421f, 0.013697f, -0.000568f, 0.001563f, 0.000619f, 0.000354f, 0.046919f, -0.016729f, -0.013863f, -0.015360f, 0.032567f, 0.012618f, 0.016514f, -0.012596f, -0.039858f, 0.013349f, 0.016963f, -0.017999f, -0.002616f, 0.010350f, -0.002233f, 0.003291f, -0.007032f, -0.057237f, -0.018781f, -0.004412f, 0.026402f, 0.041522f, 0.004963f, -0.034155f, -0.033481f, 0.015554f, 0.005619f, -0.002934f, -0.005645f, 0.002127f, -0.003524f, -0.001453f, 0.030724f, -0.033497f, 0.004323f, -0.028741f, 0.030728f, -0.016593f, 0.000689f, -0.041473f, -0.006521f, 0.028458f, -0.008754f, 0.015507f, -0.023983f, 0.012153f, -0.012604f, 0.019717f, -0.019253f, 0.006747f, -0.081387f, -0.024776f, 0.056611f, -0.027876f, -0.023379f, -0.006029f, -0.018256f, -0.065255f, -0.072546f, -0.106141f, -0.033499f, 0.000203f, -0.008205f, 0.069473f, 0.019130f, 0.090740f, 0.056003f, 0.028093f, + -0.012658f, -0.033546f, -0.006232f, 0.127245f, 0.007925f, 0.036660f, 0.020700f, -0.016002f, 0.063436f, -0.026486f, 0.051212f, -0.055924f, -0.005522f, -0.040316f, 0.048204f, -0.067904f, -0.014254f, 0.020688f, 0.021413f, 0.021725f, -0.059260f, 0.042144f, -0.067830f, 0.013725f, -0.033202f, -0.022847f, 0.067612f, 0.003919f, 0.004504f, 0.023171f, -0.025574f, -0.001597f, 0.017727f, -0.082476f, 0.002299f, 0.018903f, -0.011906f, 0.052967f, -0.023667f, -0.010493f, 0.089360f, -0.033936f, -0.074190f, 0.000067f, -0.027963f, 0.005880f, -0.005529f, -0.004047f, -0.059521f, 0.031727f, -0.009608f, -0.081472f, 0.049052f, -0.100876f, 0.019664f, -0.023259f, -0.039770f, -0.063844f, -0.008097f, 0.017038f, 0.029401f, 0.002403f, 0.023832f, 0.029165f, -0.034641f, 0.061141f, -0.014075f, 0.016171f, -0.000695f, 0.029044f, -0.001209f, -0.003566f, -0.009845f, 0.017050f, -0.036537f, -0.005017f, 0.012134f, 0.007637f, -0.014119f, -0.000548f, -0.015818f, -0.021563f, 0.011074f, 0.008351f, 0.016290f, 0.009984f, -0.004487f, 0.012092f, 0.036637f, -0.018446f, -0.018834f, 0.005952f, -0.001627f, 0.006712f, 0.027220f, -0.004322f, + 0.014909f, 0.013315f, 0.014146f, -0.018870f, -0.021866f, -0.005966f, -0.001605f, -0.023627f, -0.001147f, -0.005136f, 0.009941f, -0.025807f, 0.007734f, -0.011765f, -0.033922f, -0.122971f, -0.126416f, -0.107713f, -0.053666f, 0.226721f, 0.071885f, -0.026850f, -0.028123f, -0.110244f, -0.234945f, -0.025344f, 0.064680f, 0.080470f, 0.035229f, -0.035089f, -0.026024f, -0.068371f, -0.075507f, 0.058888f, -0.054089f, 0.143373f, 0.107693f, -0.164573f, 0.054711f, 0.022979f, -0.033675f, 0.014078f, 0.120082f, 0.018226f, 0.083153f, 0.164121f, -0.034465f, -0.132622f, 0.007272f, -0.021647f, -0.123715f, -0.032840f, 0.061216f, -0.004325f, 0.075119f, 0.120959f, 0.011653f, -0.102692f, -0.202390f, -0.173419f, -0.155125f, -0.015240f, 0.152141f, 0.044271f, 0.041265f, 0.023904f, -0.040204f, -0.202643f, -0.126625f, -0.064115f, -0.023966f, 0.013682f, 0.046942f, 0.045931f, 0.058356f, 0.060104f, 0.074105f, -0.086614f, -0.030762f, -0.070699f, -0.005257f, -0.077433f, 0.049767f, 0.050102f, 0.101030f, 0.112511f, 0.053987f, 0.002953f, -0.028834f, -0.019261f, -0.136326f, -0.107877f, 0.096692f, 0.151294f, 0.102968f, 0.121174f, + -0.028021f, -0.052180f, -0.107729f, -0.060416f, 0.032853f, 0.001647f, 0.008206f, 0.035112f, 0.012095f, 0.009939f, -0.025532f, -0.033450f, -0.016501f, -0.024899f, 0.001735f, 0.027918f, 0.008264f, 0.011743f, -0.005280f, 0.016935f, -0.027945f, 0.020754f, -0.007819f, -0.025133f, -0.025413f, -0.006363f, -0.042766f, -0.011833f, -0.025852f, 0.029177f, 0.031910f, 0.016671f, 0.012815f, -0.026746f, -0.057412f, -0.055949f, 0.016071f, -0.003758f, 0.026935f, 0.024702f, 0.013038f, -0.040265f, -0.020587f, -0.038236f, -0.060838f, 0.020234f, 0.037852f, 0.016410f, 0.002020f, 0.043282f, -0.015953f, -0.226272f, -0.253338f, -0.172226f, -0.177085f, -0.047160f, 0.199096f, 0.134088f, 0.214802f, 0.239056f, 0.363184f, 0.241141f, 0.249744f, 0.161058f, -0.012007f, -0.179234f, -0.309745f, -0.366178f, -0.317590f, -0.250717f, -0.181103f, -0.043845f, -0.008887f, -0.026194f, 0.009561f, 0.078866f, 0.130220f, 0.180168f, 0.157015f, 0.213519f, 0.206648f, 0.266538f, 0.244212f, 0.068460f, 0.164058f, -0.035569f, 0.045171f, 0.032922f, 0.009673f, -0.022727f, -0.237210f, -0.285364f, -0.364265f, -0.427915f, -0.388508f, -0.216316f, + -0.191682f, -0.158205f, -0.197535f, -0.229288f, -0.048630f, 0.055885f, 0.144339f, 0.210617f, 0.305640f, 0.364365f, 0.468528f, 0.617404f, 0.600249f, 0.455262f, 0.370071f, 0.307307f, 0.163201f, 0.258017f, -0.104212f, -0.210914f, -0.503543f, -0.577529f, -0.717081f, -0.689746f, -0.629999f, -0.597864f, -0.576640f, -0.355770f, -0.219647f, -0.120208f, 0.322898f, 0.327980f, 0.502551f, 0.644363f, 0.559603f, 0.504564f, 0.511411f, 0.400901f, 0.306630f, 0.167672f, 0.022766f, -0.002981f, -0.094018f, -0.115631f, -0.166362f, -0.216905f, -0.296596f, -0.321847f, -0.291915f, -0.337761f, -0.260017f, -0.239879f, -0.225282f, -0.199014f, -0.101733f, -0.020890f, 0.106217f, 0.216929f, 0.204809f, 0.317414f, 0.352161f, 0.386919f, 0.458178f, 0.369414f, 0.216759f, 0.107129f, -0.064936f, -0.169268f, -0.167931f, -0.326806f, -0.301355f, -0.414399f, -0.328659f, -0.343660f, -0.219496f, -0.231133f, -0.133951f, -0.018171f, 0.116997f, 0.173763f, 0.308727f, 0.357508f, 0.348603f, 0.336943f, 0.329981f, 0.251981f, 0.090996f, -0.059153f, -0.082719f, -0.110156f, -0.119640f, -0.137934f, -0.160925f, -0.151667f, -0.110330f, -0.122100f, + -0.108305f, -0.096284f, -0.067164f, -0.032002f, -0.019775f, -0.016853f, 0.005609f, 0.018822f, 0.014540f, 0.017178f, 0.049108f, 0.060765f, 0.065960f, 0.059358f, 0.046411f, 0.047234f, 0.073841f, 0.051288f, 0.042982f, 0.040507f, 0.038337f, 0.015062f, -0.002238f, -0.020718f, -0.014503f, -0.020342f, -0.024579f, -0.036510f, -0.028102f, -0.025590f, -0.029419f, -0.040146f, -0.029542f, -0.027540f, -0.031123f, -0.033503f, -0.017677f, -0.013882f, -0.006764f, -0.005388f, 0.002096f, 0.013887f, 0.025895f, 0.021373f, 0.020217f, 0.019982f, 0.024719f, 0.019707f, 0.013936f, 0.007556f, 0.011534f, 0.007879f, 0.006334f, 0.003464f, 0.002038f, -0.004902f, -0.001705f, 0.004758f, 0.007409f, 0.002290f, 0.001473f, -0.000845f, 0.002183f, -0.001719f, -0.009224f, -0.014043f, -0.011794f, -0.013649f, -0.013490f, -0.013652f, -0.010682f, -0.010970f, -0.008353f, -0.004519f, 0.000102f, 0.000400f, 0.002361f, 0.001218f, 0.002939f, 0.003516f, 0.005495f, 0.006157f, 0.008012f, 0.007605f, 0.008158f, 0.006444f, 0.005668f, 0.003647f, 0.002697f, 0.001132f, 0.000465f, -0.000508f, -0.000665f, -0.001159f, -0.001228f, -0.001318f, + -0.001204f} + }, + { + {0.024821f, 0.002780f, -0.011035f, 0.003700f, -0.007001f, 0.001760f, -0.004582f, -0.002911f, -0.006105f, 0.004225f, 0.007328f, 0.002087f, 0.002239f, -0.013634f, 0.002605f, 0.000186f, 0.004164f, 0.005132f, 0.002782f, 0.007752f, -0.001709f, -0.004412f, 0.000761f, 0.009277f, -0.000004f, -0.007188f, -0.000781f, 0.007893f, 0.004251f, 0.000813f, 0.000015f, 0.002193f, -0.000264f, 0.000567f, 0.001475f, -0.000290f, -0.002896f, -0.000372f, 0.000009f, 0.003082f, -0.004709f, -0.010967f, 0.008009f, 0.008026f, 0.006984f, 0.006566f, -0.000400f, 0.003569f, 0.006242f, -0.006661f, -0.001551f, -0.000203f, -0.008880f, 0.001965f, 0.000591f, 0.007959f, 0.000773f, 0.004451f, 0.000081f, 0.010017f, 0.005046f, -0.001495f, 0.007003f, 0.004244f, -0.002342f, -0.008225f, 0.002001f, 0.002118f, -0.002218f, 0.000593f, -0.004710f, -0.001240f, 0.004145f, 0.002904f, 0.003436f, 0.008263f, -0.001424f, -0.002629f, 0.001082f, 0.004908f, 0.011321f, -0.006702f, 0.002984f, 0.003058f, 0.003266f, -0.000358f, -0.000811f, 0.003498f, -0.002007f, 0.000081f, 0.001620f, -0.002155f, -0.000416f, 0.000309f, 0.000550f, -0.001410f, + -0.002155f, 0.001316f, -0.000561f, 0.000250f, -0.000817f, 0.002068f, -0.000308f, 0.002463f, -0.000635f, 0.002191f, -0.000097f, 0.002072f, 0.021072f, -0.014121f, 0.004736f, 0.011851f, 0.002757f, 0.008345f, 0.010117f, -0.009235f, 0.001917f, -0.000866f, 0.003927f, -0.011704f, -0.009287f, -0.001755f, 0.009066f, 0.012281f, -0.004733f, -0.004104f, 0.005887f, -0.010023f, -0.013379f, -0.002498f, -0.015731f, 0.005351f, 0.005203f, 0.001391f, -0.009778f, -0.009970f, 0.003521f, -0.005819f, 0.001332f, -0.000331f, 0.010347f, 0.010896f, 0.009865f, -0.001646f, 0.006911f, -0.010862f, 0.004700f, -0.006424f, -0.000595f, 0.000528f, 0.008445f, -0.009172f, -0.008112f, 0.000012f, 0.011112f, 0.004532f, 0.004338f, -0.006787f, 0.003762f, 0.002701f, -0.003282f, -0.013952f, -0.002257f, -0.004772f, -0.006109f, -0.005558f, 0.006370f, -0.005910f, -0.001892f, 0.001384f, 0.003956f, 0.009913f, -0.003825f, -0.000303f, -0.007528f, -0.003716f, 0.001561f, -0.010499f, -0.000645f, 0.002777f, 0.007137f, -0.002338f, -0.005405f, -0.002806f, -0.010856f, 0.005067f, 0.003190f, 0.000555f, -0.000880f, -0.009462f, 0.003870f, 0.000700f, + -0.003338f, 0.003335f, -0.001328f, 0.000752f, 0.003121f, 0.000227f, 0.000655f, 0.003539f, 0.001626f, 0.000664f, 0.000108f, 0.002818f, 0.001084f, -0.000634f, 0.001213f, 0.001614f, 0.003360f, -0.007216f, -0.013264f, -0.003134f, 0.002554f, -0.003932f, -0.006600f, -0.003556f, -0.013222f, -0.007346f, 0.014450f, -0.000342f, -0.006074f, 0.007768f, -0.011162f, -0.002381f, -0.013979f, -0.002726f, -0.010968f, -0.005627f, 0.013381f, 0.000918f, -0.002451f, -0.014614f, -0.009031f, -0.003121f, -0.006134f, 0.002739f, -0.007676f, 0.001002f, 0.005142f, 0.015963f, 0.007945f, 0.006130f, 0.007040f, 0.012966f, -0.010475f, 0.000104f, -0.002979f, -0.008021f, 0.003634f, -0.001457f, -0.002984f, -0.008406f, 0.004734f, 0.009311f, 0.001183f, -0.006363f, -0.003994f, 0.023473f, 0.000331f, -0.006445f, -0.009069f, -0.013702f, -0.018337f, -0.002083f, -0.009395f, 0.002466f, -0.001651f, 0.005425f, 0.001201f, 0.002746f, -0.008297f, 0.001513f, 0.001632f, 0.011483f, 0.004038f, -0.008173f, 0.000710f, -0.002378f, -0.002261f, -0.001766f, 0.004258f, 0.006270f, 0.006144f, -0.005268f, -0.005127f, 0.003626f, 0.001846f, 0.002456f, + 0.002672f, -0.001900f, -0.007998f, -0.009429f, -0.000904f, 0.001991f, -0.002068f, 0.001253f, 0.000308f, -0.001067f, -0.001798f, -0.002785f, -0.000936f, -0.000335f, -0.001580f, -0.003121f, 0.000528f, 0.001347f, -0.001581f, 0.000890f, -0.001361f, 0.000569f, -0.001765f, -0.000755f, 0.000639f, 0.000780f, -0.002176f, 0.000612f, -0.000677f, -0.004095f, 0.000696f, -0.001275f, 0.002687f, -0.001640f, -0.001065f, -0.000413f, -0.032586f, 0.012746f, -0.005922f, 0.005328f, -0.013555f, -0.005514f, -0.010640f, -0.009723f, 0.000534f, -0.003127f, -0.006717f, 0.016450f, 0.004163f, -0.001625f, -0.010163f, -0.003262f, 0.004523f, -0.011579f, -0.006219f, -0.011029f, -0.006228f, 0.015731f, 0.001403f, 0.010465f, -0.001149f, -0.000183f, -0.002799f, 0.002914f, 0.002777f, -0.008462f, -0.000043f, 0.002442f, 0.004580f, 0.017091f, -0.009123f, -0.010467f, -0.002212f, 0.018915f, 0.005816f, 0.020137f, 0.001628f, 0.001798f, -0.003732f, 0.009918f, -0.001897f, 0.014653f, -0.001662f, -0.001770f, -0.002813f, -0.006177f, 0.006083f, 0.001845f, -0.005422f, 0.004226f, 0.005367f, 0.010166f, -0.006081f, -0.000564f, -0.002011f, 0.009053f, + -0.003898f, -0.001577f, -0.003608f, -0.002369f, 0.002005f, -0.003018f, 0.000870f, 0.001501f, -0.002412f, 0.002218f, -0.015262f, 0.001413f, 0.009599f, 0.003407f, 0.012921f, 0.001039f, 0.001194f, 0.003135f, 0.008157f, 0.013362f, -0.009057f, 0.001265f, -0.000902f, 0.003144f, -0.000627f, -0.000348f, 0.003801f, 0.008666f, 0.003126f, 0.004249f, 0.000253f, -0.001514f, -0.002478f, 0.001173f, 0.004180f, -0.001542f, 0.001778f, 0.002012f, 0.001858f, -0.000078f, 0.000675f, 0.003698f, -0.000874f, 0.000982f, -0.000371f, 0.004272f, 0.002249f, -0.001364f, -0.000485f, 0.004600f, 0.002108f, -0.001352f, 0.003127f, 0.001898f, -0.004318f, -0.006753f, -0.003234f, 0.000050f, -0.015859f, -0.002483f, 0.000345f, -0.007790f, -0.028220f, -0.006688f, -0.005936f, -0.012179f, -0.002226f, -0.002980f, 0.017982f, -0.005968f, 0.013644f, 0.006509f, 0.009893f, -0.018063f, -0.008023f, -0.018253f, -0.016968f, 0.000194f, 0.003411f, 0.010951f, -0.004998f, -0.007860f, -0.004782f, -0.012274f, 0.002851f, 0.005894f, 0.006714f, 0.004238f, -0.003608f, 0.004866f, -0.008155f, 0.001112f, -0.014853f, 0.005641f, -0.003703f, 0.002272f, + 0.003483f, 0.005830f, 0.006161f, -0.005526f, 0.000395f, 0.014771f, -0.007634f, 0.007272f, 0.007569f, -0.000266f, 0.004598f, 0.007378f, -0.002793f, 0.003038f, 0.007216f, 0.000605f, 0.012600f, -0.006297f, -0.008455f, -0.003949f, 0.004223f, 0.000184f, -0.016385f, -0.008172f, -0.018172f, -0.019726f, -0.003249f, 0.005617f, -0.016108f, 0.007469f, -0.002495f, -0.000066f, -0.005423f, 0.005668f, -0.009531f, -0.001325f, -0.003241f, -0.013426f, -0.011897f, -0.003763f, 0.007280f, 0.000455f, 0.006259f, -0.002354f, 0.004096f, 0.003399f, -0.007427f, 0.000268f, -0.001373f, 0.004499f, -0.004971f, -0.008294f, -0.002667f, 0.001389f, 0.000109f, -0.003052f, 0.001563f, -0.001806f, -0.000664f, 0.001589f, -0.000347f, 0.000327f, -0.000072f, -0.001704f, -0.000322f, -0.001646f, -0.001161f, -0.000981f, 0.000051f, 0.001113f, 0.000195f, 0.002659f, 0.001020f, -0.000936f, 0.009341f, -0.026275f, -0.001110f, 0.008390f, 0.005348f, -0.013860f, -0.001550f, -0.008753f, 0.002454f, 0.002864f, 0.002073f, -0.015146f, -0.020372f, -0.013802f, 0.002551f, -0.010993f, 0.012386f, 0.004068f, -0.019618f, 0.014475f, 0.012661f, 0.010105f, + 0.009012f, -0.009618f, 0.016231f, 0.004455f, 0.000014f, -0.006056f, 0.005571f, 0.009855f, -0.008708f, -0.012765f, 0.004931f, -0.004679f, -0.015958f, -0.001928f, -0.015398f, -0.005435f, 0.028234f, -0.007273f, -0.012514f, -0.015438f, 0.000994f, 0.002795f, 0.011302f, 0.004692f, -0.010179f, 0.009606f, -0.001084f, -0.007845f, -0.010594f, -0.011123f, 0.017427f, 0.008000f, 0.011020f, -0.007999f, -0.011193f, 0.005356f, 0.002901f, -0.011367f, -0.000493f, -0.006867f, 0.011290f, -0.001894f, 0.001087f, -0.013470f, 0.008859f, 0.007617f, -0.007734f, -0.004755f, -0.004772f, 0.015832f, 0.000262f, 0.002566f, -0.004421f, 0.010943f, -0.010818f, -0.018222f, -0.008197f, 0.001898f, -0.003486f, 0.010382f, -0.002017f, -0.000867f, -0.010739f, -0.005399f, 0.004722f, 0.000918f, -0.007636f, -0.004714f, 0.006596f, 0.003842f, -0.002048f, 0.000594f, 0.000129f, 0.000310f, -0.002087f, 0.003159f, 0.001286f, 0.004740f, 0.000722f, 0.001088f, 0.000171f, 0.002238f, -0.000895f, 0.003093f, -0.003625f, 0.004121f, -0.000416f, -0.002051f, -0.014597f, -0.001021f, 0.003097f, -0.003961f, -0.011754f, -0.017238f, -0.013901f, 0.013183f, + 0.001167f, 0.016252f, 0.019464f, 0.018906f, 0.002509f, 0.026101f, 0.005942f, -0.003336f, 0.011836f, 0.008964f, 0.024067f, 0.003142f, 0.013659f, -0.019710f, 0.031387f, 0.023017f, 0.010891f, -0.010037f, -0.008078f, 0.011112f, 0.002232f, 0.007866f, -0.005151f, 0.013341f, -0.004519f, -0.003934f, 0.011916f, 0.009652f, -0.012985f, 0.008090f, -0.003784f, 0.012992f, 0.014090f, -0.028833f, -0.005673f, 0.017191f, 0.004870f, 0.009200f, 0.007102f, 0.017023f, -0.008819f, 0.006620f, -0.000098f, -0.014979f, -0.007558f, -0.000748f, 0.002628f, -0.021827f, -0.002242f, 0.013248f, -0.011157f, 0.022472f, 0.016675f, -0.007225f, -0.000621f, 0.004043f, 0.008137f, 0.012989f, -0.005577f, -0.004628f, 0.021161f, -0.005423f, -0.000863f, 0.009073f, 0.000024f, 0.012308f, 0.009634f, 0.003839f, 0.006529f, 0.006966f, 0.006520f, 0.002905f, 0.002530f, -0.003313f, -0.005460f, -0.002422f, -0.005012f, -0.000845f, -0.003629f, 0.002091f, 0.001735f, -0.004873f, -0.004040f, -0.000841f, 0.003057f, 0.006764f, 0.005468f, 0.003051f, 0.000245f, 0.003219f, -0.006502f, -0.003030f, -0.003690f, 0.001064f, -0.002794f, 0.002865f, + -0.007493f, 0.000491f, -0.000553f, 0.005819f, 0.002007f, 0.000028f, 0.000626f, 0.006046f, 0.001506f, -0.005721f, 0.001375f, -0.000770f, 0.001044f, 0.005065f, -0.000585f, 0.001406f, -0.000513f, 0.055093f, -0.029153f, 0.003817f, 0.022581f, -0.002404f, 0.000593f, 0.029983f, 0.032862f, 0.003729f, -0.002757f, 0.006768f, -0.001827f, 0.007289f, 0.009270f, -0.012283f, -0.003949f, 0.019359f, 0.017012f, -0.008241f, -0.015976f, -0.016997f, -0.017704f, -0.009599f, 0.014261f, -0.011340f, 0.006111f, 0.000612f, -0.020659f, -0.001539f, -0.013820f, -0.001793f, 0.005587f, 0.008792f, -0.026727f, -0.012593f, -0.021338f, -0.006700f, 0.031650f, 0.004447f, -0.003154f, 0.002685f, -0.003174f, 0.001428f, 0.009146f, 0.005387f, 0.015653f, -0.000997f, 0.011621f, 0.006956f, -0.011405f, 0.006915f, -0.017208f, 0.000348f, -0.017287f, -0.017839f, 0.006392f, -0.019611f, 0.007891f, -0.000346f, 0.009615f, 0.007782f, 0.006843f, -0.010516f, 0.011808f, -0.017781f, -0.000694f, -0.008246f, -0.003085f, 0.022090f, 0.000459f, 0.011012f, 0.010665f, -0.002348f, -0.004560f, 0.008495f, -0.018693f, 0.007266f, 0.017104f, -0.026079f, + -0.019465f, -0.005378f, 0.012839f, -0.001290f, -0.016347f, 0.005971f, -0.002702f, 0.006796f, -0.006261f, 0.002051f, -0.003725f, 0.011424f, -0.002526f, 0.010506f, 0.005446f, 0.009814f, 0.003019f, 0.002699f, -0.005581f, 0.006643f, 0.002568f, -0.000251f, 0.003512f, 0.003361f, -0.002329f, 0.004964f, 0.003490f, -0.002432f, -0.003034f, -0.008505f, -0.002198f, -0.004853f, -0.000602f, -0.000205f, -0.003316f, 0.004387f, -0.001941f, 0.002584f, 0.000483f, 0.008901f, -0.007472f, 0.003340f, 0.001046f, 0.000403f, -0.001120f, -0.032634f, 0.006535f, 0.008367f, -0.021919f, 0.010468f, 0.000238f, 0.023774f, -0.005784f, -0.011502f, 0.010284f, -0.028513f, -0.009555f, 0.024767f, 0.011082f, -0.014451f, -0.035310f, 0.016279f, -0.004580f, 0.009113f, -0.022389f, -0.029803f, -0.020098f, 0.026500f, 0.002528f, 0.014789f, -0.002122f, -0.013452f, -0.020137f, 0.010061f, -0.005086f, -0.017484f, -0.020497f, 0.001891f, -0.018255f, -0.013958f, -0.007436f, -0.003310f, -0.019811f, 0.011695f, 0.013892f, 0.018644f, -0.008351f, 0.016615f, -0.012691f, 0.026074f, -0.004394f, -0.000993f, 0.019964f, 0.010454f, -0.004464f, -0.012783f, + -0.006211f, 0.019285f, 0.004755f, -0.013665f, 0.007097f, 0.020464f, 0.019367f, 0.008547f, -0.022822f, -0.025237f, -0.001912f, 0.005368f, 0.001974f, -0.018056f, 0.005909f, 0.020751f, 0.006275f, -0.008285f, -0.032438f, 0.009167f, -0.013899f, -0.031615f, 0.001378f, 0.002108f, -0.017712f, 0.026418f, -0.001505f, -0.010301f, -0.035107f, 0.000184f, -0.010068f, -0.001243f, 0.013695f, -0.007538f, -0.013196f, -0.000502f, 0.003427f, 0.003626f, -0.010386f, -0.010494f, -0.010459f, 0.004414f, -0.008979f, 0.001007f, -0.001319f, 0.001948f, -0.002232f, 0.003044f, 0.005135f, 0.004664f, 0.005817f, 0.003126f, 0.010165f, 0.012890f, 0.001068f, 0.004097f, 0.002652f, -0.004425f, -0.000991f, -0.003525f, 0.001890f, 0.001802f, 0.001098f, -0.011666f, 0.001795f, -0.000589f, -0.004050f, -0.000137f, -0.003604f, 0.004092f, -0.004486f, -0.004646f, -0.003411f, -0.040533f, 0.025988f, 0.020116f, 0.022126f, 0.003434f, 0.023369f, 0.002680f, -0.014376f, -0.016720f, 0.002963f, 0.018797f, -0.012344f, 0.004638f, -0.027156f, 0.019247f, 0.020458f, -0.009749f, -0.005271f, 0.004983f, 0.022376f, 0.016363f, -0.010905f, -0.009784f, + 0.015452f, -0.017661f, 0.006689f, -0.024276f, 0.000437f, -0.006903f, -0.032543f, -0.033700f, 0.007105f, 0.020044f, 0.009619f, -0.028716f, -0.015183f, 0.022640f, -0.024145f, -0.009842f, 0.020295f, -0.004934f, 0.025247f, -0.008293f, -0.016715f, 0.006900f, -0.024547f, 0.029298f, -0.002514f, 0.005519f, -0.012967f, -0.006473f, -0.000603f, -0.026719f, -0.015981f, 0.002570f, -0.003816f, 0.003094f, -0.008184f, -0.028392f, 0.006024f, -0.023444f, 0.011256f, -0.005628f, 0.017832f, -0.028343f, 0.013565f, 0.005283f, -0.007527f, 0.021769f, -0.002047f, -0.014352f, -0.027556f, -0.003449f, 0.006874f, -0.022419f, 0.017498f, -0.015041f, 0.011596f, -0.029640f, -0.029973f, 0.014911f, 0.012310f, -0.011935f, -0.008965f, 0.010056f, 0.007330f, -0.006210f, -0.004775f, -0.007955f, -0.009949f, -0.000684f, -0.016409f, -0.001527f, -0.001791f, 0.001559f, 0.005419f, -0.002897f, 0.005477f, -0.003033f, -0.000380f, -0.008986f, -0.003900f, -0.002262f, -0.000515f, 0.013887f, -0.003362f, -0.001678f, 0.008572f, -0.008296f, 0.006596f, 0.003627f, -0.002615f, -0.001851f, -0.007886f, -0.007730f, 0.000343f, -0.004440f, 0.001910f, 0.000739f, + -0.003125f, -0.005456f, 0.013341f, -0.012983f, 0.004436f, 0.015877f, 0.023444f, -0.006196f, 0.002601f, -0.008322f, -0.031306f, -0.006687f, -0.006701f, 0.013602f, -0.027498f, -0.000081f, -0.015864f, 0.017066f, -0.019236f, -0.026232f, 0.017449f, 0.008011f, 0.011352f, 0.036128f, -0.005955f, -0.010361f, 0.010197f, -0.023142f, -0.026988f, 0.002223f, 0.034579f, 0.010516f, 0.019416f, -0.013796f, -0.016967f, -0.027492f, 0.005501f, 0.035104f, -0.015726f, 0.018348f, 0.004225f, 0.027295f, -0.041754f, -0.013279f, -0.000692f, 0.004904f, 0.023795f, 0.011472f, -0.031818f, -0.008623f, -0.014762f, -0.001266f, -0.036636f, -0.005766f, -0.013181f, 0.002528f, -0.019276f, -0.001286f, 0.004488f, -0.053504f, 0.006143f, -0.016780f, 0.003297f, -0.021182f, -0.001141f, 0.013151f, 0.006735f, -0.007209f, -0.006766f, -0.028221f, 0.028378f, 0.027245f, 0.009003f, 0.006787f, -0.024463f, 0.037363f, 0.013033f, 0.019256f, -0.007340f, -0.058842f, 0.022951f, -0.002027f, 0.044158f, 0.041449f, 0.013101f, -0.005338f, 0.018290f, 0.000955f, 0.016022f, 0.000849f, 0.001859f, -0.010424f, 0.005008f, -0.009524f, -0.005054f, -0.002666f, + 0.019272f, -0.000289f, 0.001192f, 0.004928f, -0.001190f, -0.010405f, -0.005313f, 0.001756f, 0.007836f, -0.003691f, 0.003919f, -0.006116f, 0.008155f, -0.006399f, -0.009777f, -0.005011f, -0.001383f, 0.004567f, 0.001812f, -0.002125f, -0.001672f, -0.002174f, 0.012734f, -0.002794f, 0.000767f, 0.002081f, 0.006369f, 0.050659f, 0.017862f, 0.034670f, -0.033646f, 0.007819f, 0.035352f, -0.010625f, -0.012741f, 0.004997f, -0.021862f, 0.016693f, 0.004230f, -0.025532f, -0.033432f, -0.002512f, 0.028356f, -0.000734f, -0.002285f, 0.018553f, -0.027703f, -0.007058f, -0.022805f, 0.012809f, -0.038863f, 0.000641f, -0.008309f, 0.014134f, -0.040590f, -0.028043f, -0.017737f, 0.011896f, 0.013062f, 0.009041f, -0.013168f, 0.009863f, -0.009797f, 0.012033f, -0.008037f, -0.003556f, -0.002796f, -0.011399f, 0.007721f, 0.017962f, 0.010693f, 0.018083f, -0.001491f, -0.017543f, 0.002498f, -0.017468f, 0.046531f, -0.011762f, -0.045776f, -0.014262f, 0.012509f, 0.039757f, -0.039797f, -0.016409f, -0.002596f, 0.025564f, 0.001634f, -0.056318f, -0.006918f, 0.025989f, 0.053673f, 0.001987f, 0.037365f, 0.053837f, -0.004010f, 0.017330f, + 0.025434f, -0.007042f, 0.045877f, -0.006167f, 0.055402f, 0.008823f, -0.015228f, -0.048052f, -0.030105f, 0.000357f, 0.014447f, 0.006903f, -0.007320f, -0.009339f, -0.014937f, -0.020381f, -0.018118f, 0.022040f, 0.006440f, -0.000269f, -0.031601f, -0.003570f, 0.001155f, -0.005768f, -0.017976f, 0.004689f, 0.009503f, -0.002722f, -0.009321f, -0.006795f, -0.017613f, -0.010631f, -0.005187f, 0.011089f, -0.002185f, -0.009585f, 0.009594f, -0.013770f, 0.009888f, 0.009994f, -0.008640f, -0.016689f, 0.015239f, 0.022658f, 0.003457f, 0.000695f, 0.001366f, 0.013203f, -0.003951f, -0.015783f, 0.001849f, 0.015304f, 0.012665f, -0.015670f, -0.013318f, 0.002445f, 0.002501f, 0.000228f, 0.004521f, -0.002447f, 0.021233f, 0.025718f, -0.044317f, -0.043115f, 0.011340f, -0.010113f, 0.001301f, -0.017201f, 0.040116f, -0.018114f, -0.011597f, 0.013893f, 0.010006f, 0.000319f, -0.018426f, -0.013514f, -0.022410f, 0.008942f, -0.001350f, -0.010878f, -0.001839f, 0.026647f, 0.040062f, -0.043453f, -0.002826f, -0.042390f, -0.004565f, -0.011006f, 0.041899f, -0.017782f, -0.016989f, -0.008217f, 0.025477f, 0.008415f, 0.006988f, 0.010642f, + 0.010159f, -0.007643f, 0.000444f, -0.005556f, 0.006759f, -0.005071f, 0.039217f, -0.010292f, 0.010366f, 0.027597f, -0.014463f, -0.031799f, 0.007003f, 0.010760f, -0.011226f, -0.012229f, -0.002714f, 0.006473f, 0.019863f, -0.027243f, 0.036380f, 0.053538f, 0.035944f, -0.015095f, -0.021746f, -0.049673f, -0.064094f, -0.023611f, -0.000306f, -0.011637f, -0.003308f, -0.007344f, 0.015247f, -0.001381f, -0.024796f, 0.012935f, -0.011017f, -0.002410f, 0.023434f, 0.039141f, -0.009662f, 0.010961f, -0.006962f, 0.002093f, 0.035619f, 0.017972f, 0.030453f, 0.031014f, -0.024896f, -0.007694f, -0.005756f, 0.000827f, -0.000637f, 0.011003f, 0.000695f, 0.006724f, 0.031225f, 0.001248f, 0.014553f, -0.006688f, -0.006937f, -0.012874f, -0.004003f, 0.001767f, 0.014186f, -0.004013f, -0.011930f, -0.005635f, 0.006795f, -0.004983f, -0.002726f, -0.003731f, 0.004268f, 0.001074f, -0.004670f, -0.002541f, 0.003135f, 0.001529f, 0.001573f, 0.017993f, -0.007454f, 0.000391f, 0.002279f, 0.000205f, -0.010021f, 0.004498f, 0.005559f, 0.011468f, -0.022999f, 0.042919f, 0.019206f, 0.024339f, 0.036630f, 0.056689f, -0.022029f, 0.029246f, + -0.058733f, -0.007392f, -0.026443f, -0.057725f, 0.023117f, 0.013445f, 0.017353f, 0.007512f, 0.022640f, 0.006777f, -0.041584f, 0.034690f, 0.061443f, -0.009406f, -0.010081f, 0.014901f, 0.005953f, -0.013059f, -0.055097f, 0.004311f, 0.000026f, -0.005186f, 0.000574f, 0.018496f, -0.039436f, 0.008308f, 0.010986f, -0.008272f, -0.022817f, -0.011239f, -0.025410f, 0.025511f, -0.056552f, -0.008375f, -0.036432f, 0.019943f, 0.007989f, 0.020226f, -0.007340f, 0.005360f, -0.014580f, 0.034306f, 0.010230f, 0.028125f, -0.025933f, 0.027641f, -0.000789f, -0.027472f, 0.056162f, -0.009543f, 0.006742f, 0.037826f, -0.036702f, 0.042423f, 0.025328f, -0.033628f, 0.013949f, -0.012988f, 0.018588f, -0.046507f, 0.033692f, 0.004583f, 0.011746f, -0.004560f, 0.010816f, -0.037811f, 0.023797f, 0.042475f, -0.084957f, 0.008451f, 0.081674f, -0.053061f, -0.017097f, 0.005558f, 0.039746f, 0.028062f, 0.009707f, 0.024490f, -0.011282f, 0.014679f, -0.006330f, -0.018319f, 0.008832f, -0.004272f, -0.003161f, 0.015160f, 0.022207f, -0.002141f, -0.008791f, -0.007674f, 0.006498f, 0.014010f, -0.018997f, -0.007311f, -0.013029f, -0.008276f, + -0.016990f, 0.016664f, 0.022226f, -0.004942f, 0.010188f, -0.006587f, 0.004092f, 0.013969f, 0.015959f, -0.018704f, 0.001502f, 0.006599f, -0.009757f, 0.014441f, 0.000701f, -0.000535f, 0.013251f, 0.006556f, -0.016032f, -0.013624f, 0.004515f, 0.001887f, -0.004853f, 0.002477f, 0.034359f, -0.020783f, -0.025022f, -0.000790f, -0.023954f, -0.010893f, -0.063311f, -0.054052f, -0.007455f, -0.031011f, -0.037212f, -0.026852f, 0.016533f, -0.009565f, -0.018838f, -0.030266f, 0.027953f, 0.001871f, -0.045708f, -0.007218f, -0.000256f, -0.021765f, -0.006841f, 0.018545f, 0.013342f, -0.003227f, 0.000174f, 0.000855f, -0.011467f, 0.009739f, 0.021351f, -0.008019f, -0.005084f, 0.032750f, -0.061549f, -0.010049f, 0.017339f, 0.065620f, -0.027168f, -0.017054f, -0.024475f, -0.033338f, 0.014545f, 0.069628f, 0.012954f, 0.043117f, 0.008929f, -0.007120f, -0.003621f, -0.005192f, -0.033590f, 0.007328f, 0.007629f, -0.027405f, 0.006088f, 0.054362f, -0.008800f, -0.016828f, 0.009152f, -0.019587f, -0.004453f, 0.047941f, 0.070984f, 0.019094f, 0.042628f, 0.049175f, -0.017438f, -0.020621f, 0.005646f, -0.016330f, 0.002836f, -0.048766f, + -0.000397f, -0.038019f, 0.011580f, 0.007847f, 0.023163f, -0.039584f, -0.014724f, -0.013558f, -0.015438f, -0.012457f, -0.013811f, 0.021914f, 0.004786f, 0.028267f, -0.007157f, 0.010715f, 0.028399f, -0.005309f, 0.001051f, -0.004218f, -0.011209f, -0.009163f, -0.001492f, -0.006955f, -0.010297f, -0.000297f, 0.004346f, -0.005480f, 0.001967f, 0.013115f, -0.013225f, -0.012222f, 0.000972f, 0.009791f, 0.005216f, -0.006526f, -0.019617f, -0.019297f, -0.002279f, 0.004341f, -0.011606f, -0.006667f, 0.004204f, -0.004129f, 0.002143f, 0.001232f, 0.013544f, 0.004348f, 0.003509f, -0.014927f, 0.016419f, -0.007051f, -0.015836f, 0.049802f, 0.056337f, -0.023428f, 0.128203f, -0.018291f, 0.002371f, -0.024424f, 0.014588f, -0.010677f, 0.014392f, 0.032476f, 0.008802f, -0.031450f, -0.017324f, -0.032836f, -0.001103f, -0.022490f, -0.040495f, 0.004752f, 0.025345f, -0.004987f, 0.006978f, 0.011690f, 0.014634f, -0.000842f, -0.012077f, -0.015659f, 0.007094f, -0.000708f, -0.020460f, 0.007204f, 0.054811f, 0.038519f, 0.021695f, -0.047563f, 0.033166f, 0.025744f, -0.012928f, -0.014941f, -0.014911f, -0.019396f, -0.008629f, 0.014603f, + -0.034535f, 0.002636f, 0.003693f, 0.019784f, 0.052238f, 0.009578f, 0.010400f, 0.002256f, -0.006856f, -0.011297f, 0.022352f, -0.014495f, 0.052762f, 0.016529f, -0.005689f, 0.022728f, 0.003903f, -0.036541f, -0.026374f, 0.029682f, 0.034404f, 0.012365f, -0.009269f, 0.022614f, 0.024464f, 0.034988f, 0.069052f, 0.006853f, -0.020527f, -0.036385f, -0.024419f, 0.017467f, 0.003412f, 0.005247f, -0.003828f, 0.023867f, 0.002083f, -0.003579f, -0.032988f, -0.016606f, 0.033311f, 0.037337f, -0.014029f, -0.026374f, -0.031289f, -0.009516f, 0.016017f, 0.009806f, 0.002543f, -0.011006f, 0.002183f, -0.000596f, -0.014123f, -0.000454f, -0.030594f, -0.008407f, -0.001634f, 0.021033f, -0.004372f, -0.007111f, -0.000314f, 0.016956f, -0.010967f, 0.011994f, -0.006992f, -0.014699f, 0.011780f, 0.016757f, 0.010691f, 0.011693f, -0.002026f, 0.012561f, 0.024422f, 0.010303f, 0.010180f, 0.006579f, -0.009615f, -0.004697f, 0.000258f, -0.002758f, 0.007048f, -0.007547f, 0.011783f, 0.015219f, 0.008901f, 0.000620f, -0.012385f, 0.004191f, 0.003955f, 0.012252f, 0.020061f, -0.020820f, 0.091258f, -0.014501f, 0.003067f, 0.009410f, + -0.007801f, -0.002071f, 0.022241f, -0.017907f, -0.021110f, -0.011401f, 0.028938f, 0.025853f, -0.072042f, 0.012979f, 0.011331f, 0.028379f, -0.019055f, -0.028827f, -0.027608f, 0.019643f, 0.017585f, -0.029422f, -0.016525f, -0.012493f, 0.047079f, 0.023410f, 0.012639f, -0.009979f, -0.050449f, 0.013384f, 0.011675f, 0.024916f, -0.006965f, 0.012937f, -0.014582f, 0.004185f, -0.043929f, 0.017260f, 0.016823f, -0.000005f, -0.011501f, -0.027672f, -0.054433f, 0.034152f, -0.023397f, 0.017265f, 0.017539f, 0.030115f, 0.003482f, -0.033276f, 0.053582f, 0.010060f, -0.053964f, -0.025249f, 0.031019f, 0.006991f, 0.040856f, 0.017046f, 0.006078f, -0.038457f, -0.019516f, 0.020594f, -0.066696f, 0.070422f, -0.051478f, 0.002325f, 0.041801f, -0.011986f, 0.083643f, 0.012123f, 0.014524f, -0.031111f, 0.097569f, 0.009738f, 0.063206f, -0.043953f, -0.020220f, -0.014173f, 0.024196f, -0.003143f, -0.010740f, 0.044142f, -0.037638f, 0.042566f, -0.051844f, 0.010561f, 0.004476f, 0.008894f, -0.010615f, 0.037500f, -0.005271f, 0.018922f, 0.016329f, 0.024789f, 0.013609f, 0.007013f, 0.016925f, 0.019295f, -0.000015f, 0.006878f, + 0.001475f, -0.013621f, 0.016144f, 0.000199f, 0.010875f, 0.023477f, 0.011211f, 0.001229f, -0.001931f, 0.017926f, 0.018849f, 0.009526f, -0.011891f, 0.039590f, -0.002556f, -0.008230f, -0.008534f, 0.025335f, -0.020208f, 0.008648f, -0.005087f, 0.013520f, 0.000055f, 0.005482f, 0.006729f, -0.005679f, -0.005207f, 0.003686f, 0.006786f, 0.006404f, 0.007125f, 0.010066f, -0.010618f, 0.033099f, 0.076739f, 0.025994f, 0.048500f, 0.061553f, -0.001781f, 0.070464f, -0.052876f, -0.018482f, -0.019383f, -0.017013f, 0.008301f, 0.012124f, -0.003757f, -0.022991f, -0.045342f, 0.045047f, 0.042685f, 0.018470f, 0.038640f, -0.061199f, -0.052754f, 0.018787f, 0.026461f, -0.027918f, -0.039339f, 0.026387f, -0.011823f, -0.057017f, -0.020361f, -0.010305f, 0.029404f, -0.052379f, 0.030223f, 0.020615f, 0.024128f, -0.024152f, -0.000623f, -0.023888f, -0.009918f, -0.070021f, -0.016356f, 0.034913f, -0.111135f, -0.034850f, -0.003413f, -0.001874f, 0.004762f, -0.066758f, -0.015877f, -0.100865f, -0.007560f, 0.020667f, -0.027993f, -0.031150f, -0.012225f, 0.031126f, -0.009397f, -0.036004f, -0.040803f, -0.105310f, -0.036827f, 0.050135f, + -0.045928f, -0.070708f, 0.060618f, -0.018186f, -0.079177f, 0.024780f, 0.073335f, -0.038166f, -0.016584f, 0.009285f, -0.051575f, 0.065717f, 0.029913f, 0.042245f, -0.020859f, -0.004128f, 0.022433f, 0.062586f, 0.029929f, 0.010269f, -0.018890f, -0.003869f, 0.071473f, 0.007316f, 0.011991f, -0.004730f, -0.040523f, -0.018008f, 0.034115f, -0.000303f, 0.003110f, -0.006312f, -0.036071f, -0.002405f, 0.017088f, -0.022612f, 0.028352f, -0.035098f, -0.021725f, 0.007691f, -0.011403f, 0.018820f, 0.008543f, -0.031932f, 0.014340f, 0.016586f, 0.009812f, 0.006517f, -0.012020f, 0.008080f, 0.000779f, -0.007555f, -0.021800f, 0.011727f, 0.010433f, -0.002346f, 0.018415f, -0.025104f, 0.003999f, -0.024033f, 0.001801f, 0.006744f, -0.007462f, -0.003935f, -0.000062f, 0.009881f, 0.002571f, -0.007010f, 0.001564f, 0.087237f, 0.120792f, -0.019454f, -0.004233f, -0.047999f, -0.048262f, -0.082886f, 0.034472f, -0.014502f, 0.120678f, -0.026096f, -0.052869f, -0.073478f, 0.003757f, 0.022153f, -0.027439f, 0.022319f, 0.078747f, -0.031965f, -0.014597f, -0.055908f, -0.025650f, 0.052995f, 0.061322f, -0.062855f, -0.018122f, 0.031246f, + -0.013925f, 0.013455f, -0.019073f, 0.077153f, 0.061896f, 0.131975f, 0.042754f, 0.057988f, -0.026580f, 0.041383f, 0.089221f, 0.028410f, -0.006185f, 0.020216f, -0.003478f, 0.057754f, 0.030136f, 0.084542f, 0.023589f, -0.086721f, 0.029783f, 0.032485f, 0.070428f, -0.040377f, -0.034154f, 0.040323f, 0.044114f, -0.021933f, 0.070830f, -0.025634f, 0.028827f, -0.078993f, 0.049180f, -0.019063f, 0.026817f, 0.027174f, 0.062100f, 0.053413f, -0.043368f, -0.045611f, -0.014765f, 0.064786f, 0.065887f, -0.025633f, -0.037032f, -0.071186f, -0.008305f, 0.049006f, 0.056054f, 0.036858f, -0.016722f, -0.047310f, -0.044379f, -0.008195f, 0.030431f, -0.031096f, 0.042534f, 0.010028f, 0.029645f, 0.004794f, -0.015454f, 0.033396f, 0.021200f, -0.005572f, -0.014609f, 0.010166f, 0.028608f, -0.042162f, 0.016625f, 0.020459f, 0.027899f, 0.014973f, 0.039528f, -0.013500f, 0.013838f, -0.018981f, -0.027375f, 0.015380f, 0.033293f, 0.029040f, 0.044756f, -0.000782f, -0.000720f, 0.013167f, 0.011806f, 0.079813f, 0.015245f, -0.003682f, -0.035144f, -0.000086f, 0.051114f, 0.025789f, 0.039468f, 0.022816f, -0.001245f, 0.000486f, + -0.008994f, -0.000542f, 0.049191f, 0.040716f, 0.004174f, 0.015121f, -0.005101f, -0.008272f, 0.001690f, 0.020674f, 0.015685f, 0.013697f, -0.010760f, -0.010520f, 0.011843f, -0.030758f, -0.099449f, 0.005885f, 0.149768f, 0.089098f, -0.022122f, -0.222025f, -0.032705f, -0.023425f, 0.016175f, -0.026122f, 0.003054f, 0.022100f, -0.009597f, 0.009014f, -0.049261f, 0.029789f, 0.035765f, 0.067410f, -0.050604f, -0.063301f, 0.063345f, 0.101388f, 0.024535f, -0.046310f, -0.061810f, -0.013852f, 0.013929f, 0.004903f, 0.014861f, -0.000418f, 0.021176f, 0.008283f, 0.065408f, -0.022089f, -0.093076f, -0.040479f, 0.028083f, 0.010072f, -0.033142f, -0.040834f, 0.003885f, 0.042568f, 0.075322f, 0.069819f, -0.003015f, 0.000546f, 0.027380f, -0.027862f, -0.080688f, 0.023456f, -0.050942f, 0.094450f, 0.102619f, -0.002665f, 0.027816f, 0.014372f, 0.019148f, -0.046591f, -0.008289f, 0.098591f, -0.039007f, 0.000443f, -0.136320f, -0.018338f, 0.013515f, 0.030714f, 0.027578f, 0.027467f, -0.035087f, -0.021341f, 0.059168f, 0.088862f, -0.017551f, -0.004198f, 0.006841f, 0.035607f, 0.041696f, -0.020538f, 0.012777f, -0.048836f, + -0.059236f, 0.005625f, 0.013804f, 0.021010f, -0.008958f, -0.009174f, -0.012847f, -0.012516f, 0.037153f, -0.000382f, -0.009395f, -0.020742f, -0.003725f, 0.024102f, 0.019824f, -0.011821f, 0.027856f, 0.006823f, 0.043472f, 0.003740f, 0.005838f, 0.001507f, -0.018333f, -0.013669f, -0.010362f, -0.010598f, -0.005487f, -0.013698f, -0.012037f, 0.003594f, 0.035504f, 0.043102f, 0.010235f, 0.022476f, 0.005818f, 0.007982f, 0.034489f, -0.026609f, 0.025486f, 0.010385f, 0.043468f, -0.012151f, 0.009232f, 0.008793f, -0.021708f, 0.014967f, -0.011932f, 0.015303f, -0.008305f, 0.025912f, -0.012157f, -0.015523f, 0.009434f, 0.005990f, 0.002867f, 0.010539f, 0.002960f, 0.018624f, -0.000018f, 0.007294f, -0.000323f, 0.006918f, 0.002585f, 0.006022f, 0.007964f, 0.009150f, -0.002685f, 0.002191f, -0.001499f, 0.012046f, 0.004209f, 0.009142f, -0.001968f, 0.002512f, 0.001539f, 0.006830f, 0.000283f, 0.007660f, -0.003000f, 0.010431f, -0.011490f, -0.099299f, -0.041082f, 0.079501f, 0.087600f, 0.083215f, 0.112794f, 0.019432f, -0.048523f, -0.148736f, -0.112934f, -0.021216f, 0.031547f, 0.094365f, 0.102613f, 0.048581f, + 0.002307f, -0.049888f, -0.043218f, -0.019127f, 0.032053f, 0.088095f, 0.050028f, -0.011541f, 0.003225f, -0.007112f, -0.048322f, -0.066081f, -0.054126f, 0.010224f, 0.081079f, 0.060962f, 0.121912f, 0.079348f, 0.078512f, 0.110531f, -0.032166f, -0.076249f, -0.086822f, -0.115240f, -0.142000f, -0.053531f, -0.016749f, 0.042248f, 0.078190f, 0.112985f, 0.105522f, 0.085814f, 0.054252f, 0.108542f, -0.021225f, -0.068518f, -0.003228f, -0.017406f, 0.028694f, 0.032887f, 0.129486f, 0.113142f, -0.042068f, 0.020348f, -0.029472f, -0.086524f, -0.025571f, 0.023058f, -0.052148f, 0.080552f, -0.032257f, 0.026824f, 0.006828f, -0.009112f, 0.069604f, 0.096820f, 0.077117f, 0.054362f, -0.040240f, -0.097765f, -0.111397f, 0.031872f, -0.046999f, 0.008663f, -0.005420f, 0.062949f, 0.009757f, 0.035675f, -0.030112f, -0.068458f, -0.063708f, -0.099773f, -0.086943f, 0.037025f, 0.020679f, 0.050454f, 0.075629f, 0.059088f, 0.002152f, -0.044445f, -0.072031f, -0.097378f, -0.053503f, -0.024740f, -0.036044f, 0.016292f, -0.013199f, -0.011123f, -0.011726f, -0.029413f, 0.000099f, -0.012933f, -0.019873f, -0.023284f, -0.015174f, -0.002900f, + 0.015371f, -0.028186f, -0.018035f, 0.005809f, 0.017099f, -0.007213f, 0.041456f, 0.004061f, -0.222613f, -0.234304f, -0.243701f, -0.249801f, -0.330039f, -0.035912f, -0.093419f, -0.022685f, 0.030745f, 0.150215f, 0.170754f, 0.176532f, 0.247170f, 0.341686f, 0.327426f, 0.321755f, 0.258530f, 0.186682f, 0.135671f, 0.040712f, -0.156013f, -0.074929f, -0.092197f, -0.057152f, -0.187351f, -0.031171f, -0.077574f, -0.085486f, -0.155032f, -0.119204f, -0.121215f, -0.109871f, -0.114706f, -0.201611f, -0.178477f, -0.105397f, -0.095237f, -0.119703f, -0.165725f, -0.025282f, -0.145121f, -0.275125f, -0.235672f, -0.207001f, -0.109083f, -0.140662f, -0.025121f, -0.284771f, -0.126067f, -0.126198f, -0.058281f, -0.042599f, -0.146595f, 0.006391f, -0.146872f, -0.017844f, 0.022872f, 0.068715f, 0.006157f, 0.070623f, 0.105597f, 0.165928f, 0.176989f, 0.243385f, 0.159101f, 0.381991f, 0.241454f, 0.444647f, 0.302377f, 0.442967f, 0.513946f, 0.610155f, 0.501284f, 0.504558f, 0.568799f, 0.510247f, 0.518330f, 0.504330f, 0.437396f, 0.252938f, 0.202226f, 0.142568f, 0.104067f, 0.121669f, 0.181762f, 0.100055f, -0.036919f, -0.063416f, + -0.073012f, -0.125556f, -0.162742f, -0.198571f, -0.182736f, -0.300457f, -0.290912f, -0.299795f, -0.362962f, -0.319806f, -0.403180f, -0.357178f, -0.418913f, -0.430402f, -0.405307f, -0.447397f, -0.404437f, -0.451776f, -0.358474f, -0.351419f, -0.291140f, -0.310909f, -0.320294f, -0.225381f, -0.201668f, -0.154310f, -0.078552f, 0.026113f, 0.085682f, 0.074928f, 0.095917f, 0.085681f, 0.096952f, 0.111262f, 0.159220f, 0.191218f, 0.172971f, 0.155463f, 0.190260f, 0.176921f, 0.218860f, 0.199134f, 0.145616f, 0.132449f, 0.115260f, 0.101440f, 0.063899f, 0.048413f, 0.045145f, 0.028290f, 0.031174f, 0.012261f, 0.020231f, 0.017640f, 0.012149f, 0.017714f, 0.012940f, 0.007630f, 0.002774f, -0.007087f, -0.001097f, -0.000277f, -0.019011f, -0.030373f, -0.017434f, -0.015340f, -0.020018f, -0.019668f, -0.012248f, -0.014637f, -0.020973f, -0.028083f, -0.021578f, -0.014168f, -0.011636f, -0.007535f, -0.009120f, -0.006905f, -0.001211f, 0.005776f, 0.010108f, 0.009258f, 0.005049f, 0.004274f, 0.010613f, 0.015988f, 0.011357f, 0.011055f, 0.005321f, 0.002460f, 0.006780f, 0.005695f, 0.005799f, 0.004498f, 0.004669f, 0.001869f, + -0.003478f, 0.004846f, 0.011937f, 0.011529f, 0.013867f, 0.014980f, 0.021724f, 0.025490f, 0.025862f, 0.027655f, 0.029314f, 0.031971f, 0.034663f, 0.034782f, 0.032600f, 0.031398f, 0.034564f, 0.028039f, 0.024297f, 0.021475f, 0.018463f, 0.012404f, 0.009994f, 0.004077f, 0.002847f, -0.000548f, -0.006503f, -0.012283f, -0.017819f, -0.019363f, -0.024522f, -0.025304f, -0.024752f, -0.024908f, -0.027598f, -0.029076f, -0.026939f, -0.026210f, -0.023851f, -0.021937f, -0.020191f, -0.017986f, -0.013968f, -0.010167f, -0.007678f, -0.006133f, -0.004333f, -0.003317f, -0.002417f, -0.002098f, -0.001614f, -0.001513f, -0.001384f, -0.001258f}, + {0.031697f, 0.004158f, -0.010457f, 0.004906f, 0.005569f, 0.001907f, -0.013233f, 0.005995f, 0.009326f, -0.010115f, -0.003060f, -0.012386f, -0.002754f, -0.005279f, -0.004567f, -0.001808f, 0.000645f, -0.000457f, 0.001217f, 0.004416f, -0.005545f, 0.002435f, -0.012699f, 0.004331f, 0.007739f, 0.001629f, -0.003370f, -0.010289f, 0.006666f, -0.004535f, 0.010808f, 0.009231f, -0.000442f, -0.004333f, 0.008802f, 0.010288f, 0.008251f, 0.008363f, 0.002040f, -0.006458f, 0.001971f, 0.007910f, -0.003376f, -0.006746f, 0.005991f, 0.009542f, -0.004250f, 0.004971f, -0.010937f, -0.000924f, -0.009600f, 0.006492f, -0.012763f, -0.003460f, -0.002421f, 0.004327f, 0.006285f, 0.004465f, -0.000417f, -0.006765f, 0.000770f, -0.009349f, -0.006210f, 0.001681f, -0.001211f, -0.005647f, 0.003015f, 0.003133f, 0.000745f, 0.005859f, -0.005297f, 0.002508f, -0.007135f, -0.002833f, -0.003070f, 0.003874f, -0.003729f, -0.007515f, -0.003418f, -0.002816f, 0.010245f, 0.008836f, 0.002187f, -0.004729f, 0.000550f, -0.000573f, 0.001739f, 0.003534f, 0.000592f, 0.000176f, 0.000564f, -0.000170f, 0.000087f, -0.001349f, 0.000965f, -0.003970f, + 0.000121f, -0.000325f, 0.001560f, 0.000827f, -0.001284f, -0.001750f, 0.000292f, 0.000689f, 0.000684f, -0.000335f, 0.000036f, -0.000798f, 0.018146f, -0.018196f, 0.000738f, 0.000368f, -0.004572f, -0.005430f, -0.005784f, 0.001934f, -0.010233f, -0.010097f, 0.001482f, 0.004971f, -0.000328f, 0.005882f, 0.004599f, -0.005532f, 0.002348f, -0.019965f, -0.004845f, -0.004428f, -0.004605f, -0.006264f, -0.006905f, -0.017591f, -0.013648f, 0.001925f, 0.004182f, -0.000903f, 0.009602f, 0.007680f, 0.003268f, -0.003353f, -0.001847f, 0.008989f, -0.003397f, 0.001154f, -0.001245f, -0.009349f, 0.003203f, -0.003099f, -0.006340f, -0.002428f, 0.007743f, 0.018605f, -0.007015f, 0.002119f, 0.004581f, -0.003386f, 0.005907f, 0.002659f, -0.006421f, 0.003828f, -0.015272f, -0.007054f, 0.000239f, 0.006320f, 0.009810f, -0.005925f, -0.002703f, -0.000621f, -0.022160f, 0.003844f, 0.011562f, 0.000666f, 0.001739f, 0.006334f, -0.003546f, 0.009861f, 0.013307f, -0.001630f, 0.003833f, 0.008000f, 0.007625f, 0.001546f, 0.000486f, -0.003647f, -0.005237f, -0.003274f, 0.002418f, -0.005011f, 0.011128f, 0.007471f, -0.000173f, -0.005360f, + -0.002693f, 0.006410f, 0.007563f, -0.003707f, 0.005886f, -0.003498f, 0.001656f, -0.003567f, -0.002110f, -0.002433f, 0.000774f, 0.000207f, 0.000506f, 0.000535f, -0.000336f, -0.001162f, -0.000862f, -0.004776f, -0.015610f, 0.003633f, 0.000586f, -0.015100f, 0.002329f, 0.008482f, 0.012480f, 0.003214f, -0.008950f, 0.021137f, -0.002819f, -0.004150f, 0.009948f, -0.006127f, -0.005960f, 0.001028f, -0.007696f, 0.009426f, 0.009431f, -0.003798f, -0.014193f, -0.007014f, 0.007093f, -0.009142f, 0.020118f, 0.017352f, -0.013842f, -0.016955f, 0.000630f, 0.003181f, -0.016120f, -0.001049f, 0.006694f, 0.004534f, -0.007879f, -0.004591f, 0.018553f, -0.001961f, 0.012779f, -0.001260f, -0.004116f, -0.004303f, -0.009515f, 0.001666f, -0.001328f, 0.010001f, -0.008504f, 0.002317f, -0.002207f, 0.001861f, -0.004995f, -0.000657f, 0.008466f, 0.006705f, -0.010529f, 0.016456f, 0.001393f, -0.000074f, -0.000227f, -0.001506f, 0.004500f, -0.002268f, -0.014693f, -0.002091f, -0.007740f, 0.012831f, 0.005415f, 0.000334f, 0.015802f, -0.008721f, 0.010585f, 0.010367f, 0.000996f, -0.007672f, -0.001524f, -0.001635f, -0.000122f, -0.002185f, + -0.003133f, 0.004356f, 0.004667f, -0.006969f, 0.003390f, -0.000415f, 0.004938f, 0.004313f, -0.001375f, 0.000671f, -0.002108f, -0.003278f, 0.002389f, -0.003018f, -0.002487f, 0.001286f, 0.003362f, -0.003048f, -0.002210f, -0.003965f, -0.001640f, 0.002374f, -0.001450f, -0.000584f, 0.000110f, 0.001201f, -0.002130f, -0.001255f, 0.003115f, 0.001005f, -0.000582f, -0.000969f, -0.003365f, -0.000146f, 0.001798f, 0.001030f, -0.037529f, 0.008769f, 0.002143f, 0.026956f, -0.001327f, 0.010907f, -0.014309f, 0.003232f, -0.010692f, -0.002464f, -0.005177f, -0.001580f, 0.005052f, -0.002776f, 0.004726f, 0.009170f, 0.007030f, 0.025600f, 0.017704f, -0.011438f, 0.005964f, -0.000493f, 0.004825f, 0.003133f, -0.003128f, -0.025182f, 0.006533f, -0.001165f, -0.000123f, 0.009735f, -0.001384f, -0.006932f, -0.004786f, -0.001067f, -0.007737f, -0.004096f, -0.020102f, -0.004616f, 0.000657f, -0.007015f, -0.001145f, 0.008513f, 0.012123f, -0.003751f, 0.014951f, -0.010962f, 0.002565f, 0.005195f, 0.002067f, -0.003311f, -0.007680f, 0.005651f, -0.001837f, 0.003531f, -0.005674f, -0.008122f, 0.001665f, 0.004935f, -0.008205f, 0.008077f, + -0.005566f, 0.019054f, 0.020205f, -0.005973f, 0.007458f, 0.007841f, -0.000913f, -0.002473f, -0.002566f, -0.024396f, 0.010381f, 0.010100f, 0.000433f, -0.003996f, -0.010114f, 0.001209f, -0.002876f, -0.012366f, -0.027866f, 0.001971f, -0.006808f, 0.007316f, 0.000132f, 0.000020f, -0.004543f, -0.003032f, -0.005136f, -0.000390f, 0.003007f, -0.003520f, 0.004402f, -0.004365f, -0.002469f, -0.001765f, -0.000980f, 0.002424f, 0.002043f, -0.001382f, 0.001021f, 0.000765f, 0.001679f, 0.002633f, 0.002075f, -0.001176f, -0.002824f, 0.002242f, -0.001107f, -0.002081f, 0.000963f, 0.000859f, -0.001159f, 0.001696f, 0.002686f, 0.001002f, -0.000193f, -0.008127f, -0.012371f, 0.012216f, 0.006935f, -0.001138f, 0.014135f, -0.007682f, 0.012675f, -0.014414f, -0.013832f, 0.006636f, -0.022036f, -0.007855f, 0.005485f, 0.013309f, 0.017429f, -0.003124f, 0.012996f, -0.000527f, 0.012376f, 0.004522f, 0.001966f, -0.002120f, 0.000627f, 0.012329f, -0.005966f, -0.001382f, 0.002206f, 0.000999f, -0.012274f, -0.001600f, -0.006681f, 0.025195f, -0.012130f, -0.012325f, -0.003021f, 0.011832f, 0.011942f, 0.010212f, 0.013727f, -0.002467f, + 0.002486f, -0.003139f, -0.006878f, 0.005129f, -0.000658f, -0.001388f, -0.007858f, 0.019738f, 0.012185f, -0.006213f, 0.003739f, 0.005772f, -0.010493f, 0.002133f, 0.007669f, -0.002039f, 0.014835f, -0.006094f, -0.001963f, -0.016254f, -0.006130f, -0.013834f, 0.000584f, 0.018866f, -0.007490f, 0.005261f, 0.003220f, 0.000562f, -0.005200f, -0.001850f, 0.000144f, -0.004729f, 0.009079f, -0.009450f, -0.004434f, -0.000928f, 0.019967f, 0.003069f, -0.000139f, 0.006215f, -0.005461f, -0.015096f, 0.003702f, 0.001411f, -0.002404f, 0.000987f, 0.003670f, -0.001093f, 0.000745f, 0.007188f, 0.001369f, -0.000689f, 0.001724f, 0.000003f, -0.000985f, -0.001846f, 0.006761f, -0.000437f, 0.000563f, -0.006295f, 0.003751f, 0.000850f, 0.003736f, -0.001025f, -0.002545f, -0.000871f, 0.001900f, 0.002954f, 0.001987f, -0.005154f, 0.000253f, 0.003461f, -0.001100f, -0.006474f, -0.004282f, -0.035659f, 0.025592f, 0.002553f, -0.013216f, -0.031514f, -0.003277f, 0.000636f, -0.018704f, -0.001836f, 0.008486f, 0.007199f, 0.000527f, -0.005527f, 0.006688f, 0.022246f, 0.022584f, -0.009907f, -0.010838f, -0.024822f, 0.004778f, -0.004613f, + 0.023801f, -0.009930f, -0.000679f, -0.005791f, 0.008867f, -0.002859f, -0.024698f, 0.007890f, -0.001299f, -0.014724f, -0.000132f, 0.002123f, -0.002139f, -0.002655f, -0.010236f, -0.014227f, 0.008397f, 0.001936f, 0.011027f, -0.009888f, 0.018658f, 0.008744f, -0.004026f, -0.016838f, -0.003449f, 0.005840f, 0.018246f, 0.005521f, -0.010540f, -0.004925f, 0.008404f, 0.005333f, -0.005481f, -0.002792f, 0.008868f, 0.007191f, 0.009369f, 0.018033f, 0.020197f, 0.009750f, 0.010689f, 0.012313f, -0.007460f, 0.001625f, -0.013598f, 0.013271f, 0.001985f, 0.006611f, -0.009753f, -0.015144f, 0.003281f, -0.019308f, -0.007025f, -0.008531f, 0.013897f, 0.014513f, 0.015262f, 0.003849f, -0.004500f, -0.005078f, 0.014249f, 0.002725f, -0.002147f, 0.003420f, -0.004666f, 0.008983f, 0.000343f, -0.000344f, 0.002886f, 0.003564f, -0.001563f, 0.007320f, -0.000137f, 0.001062f, -0.003747f, -0.002390f, 0.001943f, 0.005660f, -0.000492f, 0.001911f, 0.003271f, 0.001738f, 0.001003f, -0.001996f, 0.002681f, -0.002579f, -0.003739f, 0.002961f, -0.012742f, -0.000732f, 0.023917f, 0.014713f, 0.020226f, 0.003868f, -0.022069f, -0.007262f, + 0.023488f, -0.006744f, -0.014830f, -0.015462f, -0.015214f, -0.016109f, 0.008903f, 0.009032f, 0.005820f, 0.005318f, 0.005508f, 0.022587f, -0.002754f, 0.009812f, -0.019348f, -0.021797f, 0.014645f, -0.000763f, -0.011866f, 0.000866f, -0.030346f, -0.009911f, -0.010197f, 0.003742f, -0.001028f, -0.002796f, -0.021336f, -0.013986f, 0.002414f, 0.014769f, 0.024032f, -0.009510f, -0.009369f, 0.012787f, -0.016430f, -0.001179f, -0.000797f, 0.005516f, 0.010542f, 0.008564f, 0.016675f, -0.008927f, 0.024155f, 0.011371f, -0.026003f, 0.013014f, -0.014431f, -0.017283f, -0.014324f, -0.020907f, 0.018970f, 0.004440f, -0.022228f, 0.002541f, 0.004754f, 0.002058f, 0.003583f, -0.004095f, 0.015745f, -0.009115f, 0.012118f, -0.019397f, 0.014759f, -0.009850f, -0.008902f, 0.001901f, 0.006585f, -0.000772f, 0.010684f, 0.030415f, -0.002492f, -0.016340f, 0.009707f, 0.019924f, 0.001659f, -0.002189f, -0.015744f, -0.006922f, 0.014760f, -0.002521f, -0.000918f, 0.000475f, 0.003041f, -0.004147f, -0.002288f, -0.000393f, 0.004414f, -0.002541f, -0.000440f, -0.002917f, 0.008369f, -0.006106f, 0.001365f, -0.005742f, -0.007045f, 0.001842f, + 0.002390f, -0.002269f, 0.001206f, -0.002111f, -0.001468f, -0.000494f, -0.000707f, -0.000219f, -0.002920f, -0.001830f, 0.008606f, -0.000488f, 0.000168f, -0.000866f, 0.003283f, 0.001804f, 0.002955f, 0.049148f, -0.045022f, 0.020271f, 0.021169f, -0.020445f, -0.003998f, 0.029250f, 0.010366f, 0.018439f, 0.005251f, -0.006898f, 0.044197f, -0.002169f, -0.008715f, -0.000427f, -0.000224f, 0.021015f, 0.033154f, 0.012314f, -0.000605f, 0.000293f, 0.004660f, 0.011139f, -0.000534f, 0.005731f, -0.023808f, 0.010713f, 0.017894f, -0.004214f, 0.007079f, -0.000381f, 0.003021f, -0.015490f, -0.012160f, 0.000467f, -0.000890f, 0.020305f, 0.009849f, 0.008173f, -0.009085f, -0.011101f, -0.011076f, 0.011523f, 0.016938f, -0.000241f, -0.005937f, 0.033420f, 0.017141f, 0.022204f, -0.012547f, -0.025613f, -0.005173f, -0.026804f, -0.017750f, -0.008349f, -0.011385f, -0.001908f, 0.019404f, -0.006648f, 0.000393f, -0.016567f, -0.017641f, 0.019310f, -0.001365f, 0.008798f, 0.009468f, -0.010671f, 0.018559f, 0.004535f, 0.001326f, -0.006972f, -0.013047f, 0.014463f, -0.004924f, -0.026706f, 0.014837f, 0.012456f, 0.015532f, 0.006776f, + -0.018909f, -0.004285f, 0.001353f, -0.019750f, 0.010684f, 0.010699f, -0.002187f, 0.007980f, 0.006630f, 0.007090f, -0.002194f, 0.011438f, 0.001382f, -0.000871f, -0.006385f, 0.002536f, -0.000502f, 0.009026f, 0.001650f, -0.000671f, 0.001544f, -0.000500f, 0.006552f, -0.003363f, -0.001245f, -0.005009f, 0.001967f, -0.001638f, -0.003994f, 0.000370f, 0.000577f, -0.001784f, 0.000679f, 0.007225f, 0.005373f, -0.003722f, -0.002553f, -0.005349f, 0.000883f, -0.001482f, -0.001063f, 0.000424f, 0.000534f, 0.002166f, -0.003710f, -0.034352f, 0.004513f, 0.011694f, -0.016747f, 0.014450f, -0.029126f, 0.006984f, 0.009208f, -0.003589f, -0.011389f, -0.014648f, -0.017167f, -0.029189f, 0.004002f, 0.033810f, -0.010792f, 0.016461f, 0.009221f, 0.025226f, 0.013473f, -0.009119f, -0.021177f, 0.011335f, -0.005178f, -0.007301f, -0.021960f, -0.003002f, -0.002758f, -0.008533f, -0.009281f, -0.004780f, -0.015372f, -0.020154f, 0.024104f, -0.002017f, -0.013650f, 0.019079f, 0.006829f, -0.016015f, 0.002672f, -0.000860f, 0.010876f, -0.021383f, 0.006334f, 0.007818f, -0.031880f, 0.011073f, 0.010689f, -0.016166f, 0.004960f, 0.001613f, + -0.004984f, 0.012224f, 0.001306f, -0.001867f, 0.001626f, 0.008407f, 0.021855f, 0.017609f, 0.022296f, 0.015642f, 0.008075f, -0.005332f, 0.033083f, -0.007968f, -0.016651f, 0.036870f, 0.002620f, 0.022445f, 0.004926f, -0.006663f, -0.033677f, -0.030883f, -0.007602f, 0.002396f, -0.012198f, -0.005571f, -0.009545f, 0.021945f, -0.018682f, -0.005058f, -0.003043f, 0.005690f, -0.018239f, 0.013718f, -0.001309f, 0.004645f, -0.001438f, -0.006683f, -0.011828f, -0.007573f, -0.009290f, -0.007172f, -0.002139f, 0.001688f, -0.005669f, -0.003640f, -0.003111f, 0.008350f, -0.009034f, -0.007568f, -0.006468f, -0.007264f, -0.000217f, 0.006813f, -0.002694f, -0.002589f, 0.004618f, 0.001619f, -0.002194f, 0.003605f, -0.005635f, -0.005766f, 0.004908f, -0.006805f, -0.011736f, 0.004693f, 0.010668f, -0.005085f, 0.001220f, 0.007662f, -0.002361f, -0.005292f, -0.005908f, -0.057485f, 0.028340f, 0.049798f, 0.003602f, -0.028036f, 0.012997f, -0.005066f, -0.001816f, 0.008277f, 0.004957f, 0.012916f, -0.014876f, 0.001868f, 0.044651f, 0.034316f, 0.030056f, -0.032508f, -0.001226f, 0.008144f, 0.017236f, -0.015536f, -0.017377f, -0.004349f, + 0.005796f, 0.015584f, 0.007855f, -0.041854f, -0.047464f, 0.014935f, -0.001400f, 0.026957f, 0.027695f, -0.017645f, 0.022956f, 0.018440f, 0.024512f, -0.001552f, -0.014308f, -0.014989f, 0.011822f, -0.015881f, -0.005928f, 0.000092f, -0.000481f, 0.014649f, 0.031135f, 0.017486f, -0.008250f, -0.007205f, -0.015092f, -0.003813f, 0.001589f, 0.008458f, -0.003067f, -0.005362f, 0.015437f, 0.009658f, -0.023115f, -0.000230f, 0.001214f, 0.028156f, -0.013878f, -0.016039f, -0.030360f, -0.010314f, 0.005505f, 0.002127f, 0.016081f, -0.003336f, 0.004229f, -0.013621f, -0.020068f, -0.018380f, -0.018360f, -0.010656f, 0.009184f, -0.038350f, 0.004881f, -0.005317f, -0.005732f, -0.008061f, 0.007902f, 0.021104f, 0.015637f, 0.002495f, -0.003131f, -0.019458f, -0.005907f, -0.001744f, -0.003644f, 0.012947f, 0.006912f, 0.003988f, 0.003176f, 0.006753f, 0.008167f, -0.002941f, -0.002921f, 0.000245f, -0.003186f, 0.000728f, 0.001227f, 0.002619f, 0.004671f, -0.012439f, 0.002306f, -0.001573f, 0.009857f, 0.002611f, -0.012162f, -0.000663f, -0.007548f, -0.006055f, -0.002724f, -0.002769f, -0.002916f, -0.001552f, -0.001193f, 0.003333f, + -0.000249f, 0.006857f, 0.006261f, 0.005241f, 0.009151f, 0.028803f, 0.002131f, 0.024963f, -0.003692f, 0.032474f, 0.016077f, 0.025269f, 0.015437f, 0.007192f, -0.012877f, -0.001517f, -0.008151f, 0.017245f, 0.004906f, 0.015116f, -0.014906f, -0.002802f, 0.026883f, -0.033677f, -0.018937f, 0.025828f, -0.044355f, -0.019684f, 0.003043f, -0.008656f, -0.022086f, 0.044187f, -0.008186f, 0.030450f, 0.012064f, -0.026969f, -0.004338f, -0.010290f, -0.032571f, -0.042221f, 0.033287f, -0.000540f, -0.012467f, 0.008061f, 0.000361f, -0.005808f, 0.011963f, 0.004560f, -0.004580f, -0.015679f, 0.002714f, 0.031449f, 0.026609f, -0.022389f, 0.008539f, 0.001508f, 0.024807f, -0.011640f, 0.016731f, -0.036254f, -0.008974f, 0.024365f, 0.008008f, -0.008476f, 0.029096f, -0.009567f, 0.020322f, -0.040221f, -0.046370f, -0.016854f, 0.000645f, -0.032897f, 0.035043f, 0.024685f, 0.035602f, -0.016669f, -0.012364f, -0.012662f, 0.001604f, -0.018413f, -0.000451f, -0.028023f, -0.025497f, 0.000931f, 0.006850f, 0.025532f, 0.011913f, -0.002935f, -0.009760f, 0.007884f, 0.014606f, 0.009528f, 0.005681f, -0.009376f, 0.010485f, 0.009386f, + 0.011849f, 0.008759f, 0.006293f, 0.009499f, -0.013610f, 0.011032f, -0.008343f, -0.004306f, 0.017355f, 0.015376f, 0.010203f, -0.002065f, 0.000348f, -0.004916f, 0.008759f, 0.002630f, -0.003996f, 0.004706f, 0.008885f, 0.001184f, 0.006839f, 0.006733f, -0.009481f, 0.002853f, -0.007242f, -0.002226f, 0.001875f, 0.040309f, 0.029012f, 0.045413f, -0.040153f, -0.030149f, -0.068853f, 0.029807f, -0.007590f, -0.058808f, -0.011342f, 0.005696f, 0.008759f, -0.021904f, 0.024062f, 0.020373f, 0.002353f, -0.000153f, 0.003820f, -0.009645f, -0.020440f, 0.004641f, -0.011595f, -0.019076f, -0.000182f, 0.044787f, 0.001454f, -0.006652f, -0.035650f, 0.015196f, 0.028267f, -0.014460f, -0.043032f, -0.007683f, 0.014585f, 0.005290f, -0.009089f, 0.009531f, 0.003126f, 0.015645f, -0.004303f, 0.025713f, 0.039125f, 0.014931f, -0.025929f, 0.029599f, 0.013308f, -0.033121f, -0.035363f, 0.038651f, 0.018663f, -0.014828f, -0.017235f, -0.000689f, -0.031344f, 0.023145f, 0.030311f, -0.000549f, 0.001747f, 0.007798f, -0.003837f, 0.033306f, 0.011176f, 0.008795f, -0.013701f, 0.005540f, 0.011221f, 0.041099f, -0.009787f, 0.015869f, + -0.031662f, -0.035905f, 0.032224f, -0.004655f, -0.002981f, 0.003532f, 0.030714f, 0.000882f, -0.001417f, 0.019578f, -0.009242f, 0.004078f, 0.017796f, 0.021912f, -0.010351f, -0.013288f, -0.029092f, -0.014135f, 0.009532f, -0.012632f, 0.010155f, -0.000087f, 0.010774f, -0.005584f, 0.007950f, 0.001890f, -0.004467f, 0.003746f, 0.016297f, 0.004267f, 0.016222f, 0.005146f, -0.010242f, 0.000921f, 0.006776f, 0.005875f, -0.010052f, -0.008955f, -0.009792f, -0.003933f, -0.007691f, -0.007258f, -0.011963f, -0.004872f, 0.006680f, 0.004527f, -0.001210f, -0.001656f, 0.003656f, -0.007657f, -0.000185f, 0.010546f, -0.002878f, -0.001354f, -0.004922f, -0.003844f, -0.002143f, -0.014863f, -0.002125f, -0.005567f, -0.006053f, -0.009036f, -0.013067f, -0.046187f, -0.003376f, -0.030058f, -0.061460f, -0.063355f, -0.027120f, -0.048262f, -0.021627f, -0.007402f, 0.009222f, 0.027725f, 0.030875f, 0.003584f, -0.015984f, 0.033221f, -0.016183f, 0.016612f, -0.060676f, -0.005545f, -0.041478f, -0.027682f, 0.028878f, 0.020417f, 0.019874f, 0.006924f, 0.041379f, -0.003667f, -0.002095f, -0.029000f, -0.009751f, -0.005466f, -0.019593f, -0.019789f, + -0.049780f, -0.019290f, -0.005084f, -0.007634f, -0.030623f, 0.027958f, 0.011410f, 0.016871f, -0.013224f, -0.004802f, -0.075786f, -0.021510f, -0.020556f, 0.018124f, 0.039538f, -0.023609f, -0.003233f, -0.043956f, -0.002749f, 0.023329f, -0.006823f, -0.014537f, 0.010451f, 0.033256f, 0.056409f, 0.012227f, 0.002230f, -0.002628f, -0.014557f, -0.021932f, 0.015415f, -0.014293f, 0.051206f, 0.010447f, 0.022303f, 0.103970f, -0.020149f, -0.017151f, -0.025700f, -0.035814f, -0.004475f, 0.035825f, 0.016363f, 0.005522f, 0.012211f, -0.014488f, -0.011151f, -0.031112f, -0.007120f, 0.018221f, -0.002460f, -0.006516f, -0.002527f, -0.006896f, 0.004158f, -0.000698f, 0.007319f, 0.007443f, 0.007549f, 0.009807f, 0.010657f, 0.026832f, 0.016524f, -0.009304f, 0.015772f, 0.000059f, 0.001403f, 0.011497f, -0.012335f, 0.000709f, -0.014298f, -0.008433f, -0.019728f, -0.014494f, -0.020598f, -0.016969f, -0.011274f, 0.023507f, -0.013933f, -0.007623f, -0.016511f, 0.001527f, 0.005421f, -0.003188f, 0.007335f, 0.003266f, -0.000041f, -0.013818f, -0.051698f, 0.029491f, 0.048537f, -0.028569f, 0.001532f, 0.010971f, -0.016689f, -0.003931f, + -0.036171f, -0.000644f, -0.020278f, 0.052728f, 0.000015f, -0.009815f, 0.042259f, -0.010619f, 0.012288f, -0.048350f, 0.025142f, 0.007619f, 0.032753f, -0.015168f, 0.024380f, 0.043197f, 0.046248f, 0.026104f, 0.041682f, 0.021512f, -0.006679f, 0.040688f, -0.019673f, -0.026542f, -0.008609f, 0.016435f, 0.027428f, -0.065821f, -0.004576f, -0.042488f, 0.033772f, 0.015505f, -0.000924f, 0.011835f, 0.047314f, 0.002225f, 0.042212f, 0.018272f, 0.063969f, 0.005975f, -0.007402f, 0.028280f, 0.009165f, -0.032440f, 0.006911f, -0.003574f, -0.043942f, 0.030998f, -0.026554f, -0.042521f, -0.087599f, 0.007055f, -0.010913f, 0.051722f, -0.028789f, 0.069133f, 0.022590f, -0.000862f, -0.010667f, 0.027155f, 0.028180f, -0.050056f, -0.021655f, -0.036900f, 0.012831f, -0.016465f, 0.037674f, 0.012376f, 0.012573f, 0.018635f, -0.008856f, 0.003612f, -0.013389f, -0.004222f, 0.000917f, -0.004593f, -0.039061f, 0.015777f, -0.000216f, 0.011948f, 0.000233f, -0.011029f, 0.001104f, 0.016355f, -0.026040f, 0.022784f, -0.009635f, 0.000408f, 0.002392f, -0.021251f, -0.002002f, 0.013650f, 0.006507f, -0.015095f, -0.006601f, -0.003235f, + -0.018465f, 0.006714f, -0.005362f, 0.027278f, -0.021550f, 0.010111f, 0.018475f, 0.007292f, -0.008031f, -0.005219f, 0.008921f, 0.005100f, 0.005491f, -0.004052f, 0.009259f, -0.027854f, 0.007527f, 0.007584f, 0.012161f, -0.007913f, -0.013460f, 0.001800f, 0.011910f, 0.002478f, 0.032660f, -0.022847f, -0.025491f, -0.025091f, 0.031386f, 0.015990f, 0.041053f, 0.010956f, 0.128269f, -0.038882f, 0.000093f, 0.000361f, 0.059388f, 0.024230f, 0.027177f, -0.039961f, 0.016684f, -0.016126f, 0.000517f, -0.018813f, 0.003409f, 0.042745f, -0.012004f, 0.013140f, 0.083184f, 0.025688f, -0.038540f, -0.045043f, 0.004575f, 0.054025f, 0.027902f, 0.009770f, -0.021733f, 0.045899f, 0.007306f, -0.007515f, -0.051703f, 0.015012f, -0.008711f, 0.021413f, -0.046988f, -0.028936f, 0.001831f, -0.012419f, 0.005519f, -0.043883f, -0.002079f, -0.027008f, 0.011674f, 0.037746f, 0.030080f, 0.009420f, -0.059951f, -0.000116f, 0.005285f, -0.054114f, -0.048364f, -0.032282f, -0.026706f, -0.026698f, 0.041761f, 0.009056f, -0.001794f, 0.026992f, 0.043447f, 0.011131f, 0.037550f, 0.000416f, 0.024664f, 0.167747f, -0.038997f, 0.027126f, + 0.018747f, -0.030200f, 0.005687f, -0.112801f, 0.001680f, 0.055093f, 0.014003f, -0.031479f, 0.042313f, 0.009725f, 0.015739f, -0.028605f, -0.006933f, -0.024526f, 0.007826f, 0.001474f, 0.001554f, 0.008999f, -0.035339f, 0.012263f, -0.019646f, -0.014476f, -0.048172f, 0.011212f, 0.010358f, 0.008888f, 0.011683f, 0.058976f, 0.008423f, 0.005779f, 0.006267f, 0.004069f, 0.035036f, 0.003594f, 0.014464f, 0.011869f, 0.026592f, 0.010337f, -0.002206f, -0.006600f, -0.005517f, 0.003931f, 0.016652f, 0.019994f, 0.005508f, -0.031844f, -0.014946f, -0.007497f, -0.007512f, -0.010900f, -0.033245f, -0.008497f, 0.010954f, 0.024504f, 0.067584f, -0.032265f, -0.002209f, -0.046297f, -0.033813f, 0.010273f, 0.029273f, -0.038386f, 0.044572f, 0.018406f, -0.059905f, 0.035947f, -0.024625f, -0.029894f, -0.003076f, -0.036036f, 0.007730f, -0.016410f, 0.045207f, -0.026914f, -0.002730f, 0.024744f, -0.089151f, 0.012194f, 0.026816f, -0.027186f, 0.021135f, -0.053949f, 0.052791f, 0.005381f, 0.008533f, -0.101654f, 0.090653f, 0.038717f, 0.029303f, 0.001566f, -0.058405f, 0.052461f, -0.004087f, -0.026646f, 0.092686f, -0.019029f, + -0.041742f, -0.022031f, 0.010546f, 0.026613f, 0.024848f, 0.006403f, -0.016501f, -0.110384f, -0.013186f, 0.027110f, 0.000832f, 0.039983f, -0.058511f, 0.059190f, 0.005258f, 0.019759f, -0.059481f, -0.017343f, 0.008632f, 0.075565f, -0.032410f, 0.017373f, -0.055200f, 0.047716f, 0.026104f, 0.045013f, -0.018359f, 0.019747f, 0.006972f, -0.059776f, -0.057629f, 0.030854f, 0.024608f, 0.048056f, 0.009466f, 0.061776f, -0.094533f, -0.122836f, 0.018630f, -0.026188f, 0.068272f, -0.045497f, -0.010738f, 0.007642f, -0.053131f, 0.002246f, -0.032124f, 0.026795f, 0.037472f, 0.003515f, 0.030201f, 0.034020f, 0.009176f, -0.031350f, -0.016710f, 0.054934f, 0.027700f, 0.006851f, 0.008593f, -0.016893f, 0.000237f, 0.033326f, 0.017759f, -0.027554f, -0.016515f, 0.030989f, -0.005563f, 0.019192f, 0.018459f, -0.012354f, -0.017156f, -0.016468f, -0.001047f, 0.016393f, 0.006365f, 0.021058f, 0.029423f, 0.002205f, -0.002204f, 0.024687f, 0.000295f, 0.004715f, 0.006635f, -0.010771f, 0.007270f, -0.018603f, 0.009099f, 0.003435f, -0.000914f, 0.007758f, -0.009041f, -0.085544f, 0.078036f, -0.016828f, -0.018841f, -0.030436f, + -0.008894f, -0.067450f, -0.125964f, 0.043518f, 0.036168f, -0.005533f, -0.025972f, -0.051299f, -0.008481f, -0.015898f, -0.027295f, 0.049656f, -0.112659f, -0.048120f, -0.059481f, -0.017717f, -0.085785f, -0.007888f, -0.012935f, -0.003059f, -0.014384f, -0.017380f, 0.013803f, -0.000836f, -0.037983f, -0.011879f, -0.000882f, -0.051943f, -0.027778f, -0.015321f, 0.003764f, 0.039996f, -0.020551f, 0.080160f, -0.041913f, -0.006007f, 0.033674f, -0.035758f, 0.021701f, 0.004548f, -0.054988f, -0.082220f, -0.020197f, 0.020973f, 0.074923f, 0.032491f, -0.057486f, -0.024332f, -0.164939f, -0.055220f, -0.011961f, 0.034640f, 0.089462f, -0.004804f, -0.095994f, 0.005265f, 0.052004f, -0.019244f, -0.004634f, 0.055146f, 0.058020f, 0.133267f, -0.147480f, -0.028683f, 0.020759f, 0.037170f, -0.046653f, -0.055361f, -0.078950f, -0.078386f, -0.043930f, -0.036541f, -0.010423f, -0.005783f, -0.091229f, -0.037933f, -0.033570f, 0.033484f, -0.017402f, -0.009211f, 0.081767f, 0.061849f, 0.004735f, -0.011991f, -0.004024f, -0.050953f, -0.002535f, 0.017721f, -0.036895f, -0.019954f, 0.006620f, 0.022764f, -0.015849f, -0.018336f, -0.012491f, 0.025391f, + -0.017464f, 0.026598f, 0.001537f, 0.027453f, 0.019436f, 0.019618f, -0.015837f, 0.009637f, -0.038829f, 0.019202f, -0.005539f, 0.011039f, -0.034437f, -0.026939f, -0.004351f, 0.008049f, -0.019672f, -0.000261f, -0.043596f, -0.008346f, -0.005795f, 0.017548f, 0.022100f, -0.028278f, 0.055432f, 0.000198f, 0.020094f, 0.011460f, 0.039895f, 0.039671f, -0.002792f, 0.024764f, -0.047534f, 0.012515f, -0.018738f, -0.116031f, 0.027283f, -0.019118f, 0.035374f, -0.031434f, -0.032455f, 0.003362f, -0.048102f, 0.009218f, -0.048517f, -0.000108f, -0.007808f, -0.018441f, 0.024500f, -0.035911f, -0.047230f, -0.042928f, -0.055606f, -0.008535f, -0.005413f, 0.063384f, 0.014567f, -0.044689f, -0.067041f, 0.009806f, -0.000710f, 0.017047f, -0.012488f, 0.038782f, -0.043862f, -0.016793f, -0.061894f, -0.039140f, -0.017311f, 0.003001f, -0.025750f, 0.066136f, -0.022125f, -0.054800f, 0.017968f, 0.068622f, 0.049759f, 0.021001f, -0.047229f, -0.030219f, -0.004258f, 0.062418f, 0.118286f, -0.000102f, 0.023765f, -0.021584f, -0.114545f, -0.024300f, 0.011053f, 0.044433f, 0.098841f, -0.053406f, -0.066069f, 0.040123f, 0.019113f, -0.022102f, + 0.003660f, -0.035570f, 0.023159f, -0.096278f, -0.010675f, 0.006645f, 0.024160f, -0.057609f, 0.068212f, -0.094108f, -0.107842f, -0.098928f, 0.050992f, -0.019418f, 0.095830f, -0.131805f, -0.057441f, 0.011810f, 0.136192f, -0.009749f, -0.023708f, -0.073509f, -0.026896f, -0.007544f, 0.065895f, -0.004356f, 0.000140f, 0.005121f, 0.011792f, 0.002520f, -0.000563f, -0.027032f, -0.023685f, 0.032477f, 0.014176f, 0.005046f, -0.070703f, 0.019089f, -0.017913f, -0.007129f, -0.036441f, 0.002948f, -0.002955f, -0.005427f, -0.083312f, 0.009043f, -0.018186f, -0.008264f, -0.006936f, 0.015504f, 0.000014f, 0.006503f, -0.000287f, 0.001834f, -0.000001f, 0.001721f, -0.030259f, -0.004571f, -0.019397f, -0.015506f, 0.014782f, 0.016504f, -0.024272f, 0.002276f, -0.017250f, 0.024121f, -0.008258f, -0.037472f, 0.006001f, 0.068459f, 0.020256f, -0.125032f, -0.022964f, -0.086602f, 0.037246f, 0.006087f, -0.171463f, 0.010548f, -0.053379f, -0.111583f, -0.086849f, -0.127202f, 0.077165f, -0.039611f, -0.100098f, -0.045775f, 0.031412f, -0.060342f, -0.051884f, -0.041047f, -0.024465f, -0.045152f, -0.044422f, -0.081783f, -0.059046f, -0.111756f, + -0.063088f, -0.057494f, -0.019299f, -0.053346f, -0.011379f, -0.025665f, -0.002178f, 0.002903f, 0.014049f, 0.029645f, -0.031136f, 0.024411f, 0.002502f, 0.055377f, 0.024105f, 0.034053f, 0.035166f, -0.105039f, -0.027845f, 0.081797f, -0.014873f, -0.052997f, -0.058710f, -0.044526f, 0.032747f, 0.132795f, -0.009495f, -0.003544f, -0.090671f, -0.093474f, -0.019987f, 0.017380f, 0.079701f, -0.007151f, 0.072588f, 0.025439f, -0.089104f, 0.158045f, 0.002450f, 0.122566f, -0.000307f, -0.033520f, 0.066122f, -0.091322f, -0.116256f, -0.075971f, -0.256751f, -0.157322f, -0.051631f, 0.115370f, 0.071302f, -0.104777f, -0.068311f, -0.159105f, 0.077135f, 0.101762f, -0.080992f, -0.082457f, 0.017656f, 0.066398f, 0.096929f, 0.025083f, 0.055205f, -0.054507f, -0.029583f, -0.041729f, -0.060654f, -0.026950f, -0.006411f, 0.003236f, 0.001385f, -0.035182f, 0.003989f, 0.019609f, 0.006115f, -0.007844f, -0.024878f, -0.018773f, -0.028240f, -0.012878f, -0.041185f, -0.011458f, 0.023118f, -0.041754f, -0.064448f, -0.012331f, -0.042885f, -0.031356f, -0.006524f, -0.056494f, -0.042818f, -0.014143f, 0.023602f, 0.022839f, 0.027417f, -0.004251f, + -0.024750f, -0.007550f, 0.007340f, -0.017449f, 0.037156f, -0.002104f, 0.026647f, -0.002410f, -0.002675f, 0.024782f, 0.019807f, 0.028181f, 0.067836f, 0.039959f, 0.049667f, -0.043520f, -0.105683f, 0.122925f, 0.117579f, -0.074349f, -0.096408f, -0.000475f, 0.105528f, -0.011471f, -0.006058f, -0.032909f, 0.092308f, -0.010284f, -0.024529f, -0.002315f, 0.025571f, 0.047274f, 0.001379f, -0.035648f, -0.040350f, 0.056809f, 0.004358f, -0.024569f, -0.060722f, 0.034486f, 0.019249f, -0.007052f, -0.047809f, 0.014943f, 0.020816f, 0.016981f, -0.030158f, -0.018373f, 0.005555f, 0.046779f, -0.013606f, 0.016680f, -0.068859f, -0.019418f, 0.000336f, 0.045284f, -0.095917f, -0.017396f, 0.009601f, 0.068982f, -0.033009f, 0.010493f, -0.048865f, 0.006447f, 0.020617f, -0.034057f, -0.025477f, -0.004280f, 0.011539f, 0.020822f, -0.021612f, 0.001187f, -0.085380f, 0.046068f, -0.014004f, 0.079961f, -0.049447f, 0.035485f, -0.033539f, 0.036896f, 0.007310f, 0.024620f, 0.021531f, -0.062735f, 0.070907f, 0.013566f, 0.041072f, -0.069226f, 0.019516f, -0.017912f, 0.011335f, -0.020037f, 0.003133f, -0.005193f, 0.009794f, 0.022947f, + -0.003257f, -0.027967f, -0.015943f, 0.006573f, -0.003279f, 0.001256f, -0.010281f, -0.027291f, 0.009430f, 0.006627f, -0.007868f, -0.008097f, -0.000046f, -0.008925f, 0.001721f, -0.015113f, -0.000000f, -0.007666f, 0.012518f, 0.006480f, -0.004520f, -0.011388f, 0.004229f, -0.000279f, -0.009029f, 0.006370f, -0.028921f, -0.000862f, -0.002956f, 0.012496f, 0.000001f, 0.033277f, -0.021996f, -0.023490f, -0.007292f, 0.017266f, -0.023859f, 0.035723f, -0.030055f, 0.014789f, -0.014490f, 0.032506f, -0.029177f, 0.035829f, -0.020248f, 0.027877f, -0.025298f, 0.043689f, -0.041271f, 0.031476f, -0.009178f, 0.023550f, -0.022061f, 0.023153f, -0.025061f, 0.026221f, -0.025247f, 0.020963f, -0.016791f, 0.023270f, -0.018093f, 0.019400f, -0.018024f, 0.005460f, -0.005849f, 0.011756f, -0.008931f, 0.009660f, -0.007901f, 0.007869f, -0.005653f, 0.010852f, -0.006640f, 0.004223f, -0.005197f, 0.005775f, -0.004518f, 0.002077f, 0.000910f, -0.035839f, -0.079907f, -0.106316f, 0.077847f, 0.051707f, -0.060555f, -0.086368f, -0.042233f, 0.040255f, 0.021197f, 0.053489f, 0.057563f, 0.011425f, -0.028760f, -0.008254f, 0.020253f, -0.019554f, + -0.001439f, 0.012053f, 0.003432f, 0.032306f, 0.022635f, 0.009921f, -0.028736f, -0.000890f, -0.017728f, 0.018822f, -0.030115f, -0.026063f, 0.022175f, -0.006811f, -0.012154f, -0.011930f, -0.020882f, -0.028691f, 0.002387f, 0.023764f, 0.021698f, 0.018222f, -0.006675f, -0.023628f, -0.020500f, -0.014284f, 0.025899f, 0.035157f, -0.016120f, -0.024272f, -0.010392f, 0.029202f, 0.015179f, 0.039007f, -0.027262f, -0.010267f, 0.015531f, -0.007147f, 0.001471f, -0.003990f, 0.013977f, 0.008435f, 0.011329f, 0.002506f, -0.026071f, 0.011041f, 0.005087f, -0.000807f, 0.020549f, -0.010405f, -0.004992f, 0.003675f, -0.003541f, 0.002769f, -0.007395f, 0.034629f, 0.008883f, -0.002631f, 0.033063f, 0.033054f, -0.033212f, -0.050469f, -0.018325f, -0.034520f, 0.001270f, 0.023085f, 0.006790f, -0.020589f, -0.024779f, -0.006525f, -0.004585f, 0.020077f, 0.009760f, 0.012568f, 0.018919f, 0.011540f, -0.010164f, 0.011682f, 0.008439f, -0.024227f, -0.032400f, 0.009921f, -0.008351f, 0.016387f, 0.012193f, -0.017775f, -0.004521f, -0.005949f, -0.006294f, -0.020679f, -0.011145f, -0.001162f, 0.006856f, 0.010071f, 0.027963f, -0.013653f, + -0.010027f, 0.007221f, -0.006140f, -0.008023f, 0.016473f, 0.000686f, 0.036514f, -0.088727f, -0.233583f, -0.085871f, 0.041884f, 0.121506f, 0.256623f, 0.171732f, 0.044187f, 0.065085f, -0.034311f, -0.104462f, -0.173497f, -0.150943f, -0.120021f, -0.034608f, 0.004600f, 0.083492f, 0.092028f, 0.195946f, 0.095107f, 0.062726f, -0.004941f, -0.041766f, -0.094336f, -0.048972f, -0.076288f, -0.087946f, -0.054177f, -0.045331f, -0.003408f, 0.024508f, 0.073283f, 0.045325f, 0.052594f, 0.047840f, 0.048320f, 0.072729f, 0.006247f, 0.050396f, -0.009376f, -0.022611f, -0.061402f, -0.036555f, -0.091557f, -0.134710f, -0.117753f, 0.001404f, -0.020058f, 0.036963f, 0.063256f, 0.034727f, 0.097595f, 0.085274f, 0.123358f, 0.070265f, 0.083647f, 0.004167f, 0.004074f, -0.065963f, -0.107858f, -0.125966f, -0.151297f, -0.099390f, -0.123656f, -0.010368f, -0.000538f, 0.059532f, 0.062365f, 0.149444f, 0.117322f, 0.166932f, 0.067692f, 0.078063f, 0.032491f, -0.000667f, -0.099642f, -0.162415f, -0.108836f, -0.129744f, -0.080911f, -0.087840f, -0.008268f, 0.013633f, 0.051808f, 0.068087f, 0.092138f, 0.094153f, 0.090434f, 0.059300f, + 0.064741f, 0.016920f, -0.011804f, -0.022214f, -0.073035f, -0.066487f, -0.087431f, -0.061691f, -0.087400f, -0.066499f, -0.007011f, 0.015654f, 0.045978f, 0.069566f, 0.061937f, 0.063961f, 0.105211f, 0.038185f, 0.064212f, 0.049413f, -0.066453f, -0.120088f, -0.052170f, -0.105877f, -0.066877f, -0.036279f, -0.007651f, 0.009520f, 0.033666f, 0.061224f, 0.042475f, 0.065861f, 0.041666f, 0.035900f, 0.014360f, -0.003940f, -0.038298f, -0.012459f, -0.018008f, -0.066940f, -0.062731f, -0.017163f, -0.007162f, 0.003678f, 0.021960f, 0.025895f, 0.032615f, 0.026248f, 0.025777f, 0.009847f, 0.008662f, -0.000207f, -0.014717f, -0.007111f, -0.005400f, -0.014739f, -0.023911f, -0.007915f, -0.011970f, -0.013723f, -0.001635f, 0.006664f, 0.007264f, 0.011181f, 0.013235f, 0.016564f, 0.010600f, 0.007869f, 0.002444f, -0.001305f, -0.004153f, -0.006533f, -0.008959f, -0.009510f, -0.006919f, -0.005116f, -0.003851f, -0.003395f, 0.000078f, 0.001817f, 0.002069f, 0.003050f, 0.003240f, 0.004899f, 0.007282f, 0.007326f, 0.002105f, 0.001454f, 0.001965f, -0.000946f, -0.003804f, -0.005002f, -0.006915f, -0.005937f, -0.004167f, -0.001224f, + -0.001654f, -0.000068f, 0.002868f, 0.003091f, 0.002934f, 0.004226f, 0.003384f, 0.001973f, 0.000138f, 0.000119f, 0.000218f, -0.000480f, -0.001872f, -0.001608f, -0.001903f, -0.001861f, -0.001907f, -0.001212f, -0.000729f, 0.000214f, 0.000822f, 0.001568f, 0.001737f, 0.001367f, -0.000057f, 0.000659f, 0.000953f, 0.000639f, -0.000247f, -0.001115f, -0.001479f, -0.001223f, -0.000761f, -0.000113f, 0.000414f, 0.000989f, 0.000689f, 0.000264f, 0.000307f, 0.000424f, -0.000309f, -0.000611f, -0.000516f, -0.000493f, -0.000389f, 0.000023f, -0.000021f, 0.000049f, 0.000188f, 0.000195f, 0.000090f, 0.000036f, 0.000019f, -0.000018f} + }, + { + {0.014236f, 0.001503f, -0.003867f, -0.004046f, 0.002468f, -0.006900f, -0.000116f, -0.013430f, 0.009612f, 0.012191f, 0.008515f, 0.011998f, -0.014421f, 0.001154f, 0.003287f, -0.005151f, -0.003966f, -0.003526f, -0.016888f, -0.002852f, 0.010026f, -0.017292f, -0.014051f, 0.008161f, 0.007399f, -0.011115f, -0.003882f, 0.007338f, 0.000934f, 0.008923f, 0.003821f, 0.009295f, -0.005853f, 0.001768f, 0.001283f, -0.002486f, 0.004327f, 0.003394f, 0.006311f, 0.002639f, -0.002797f, 0.000593f, 0.007052f, -0.001922f, -0.003217f, -0.001209f, -0.008543f, -0.018855f, 0.011196f, 0.005423f, -0.005901f, 0.008251f, -0.003316f, 0.000900f, -0.000295f, 0.003825f, -0.004978f, -0.001308f, 0.011127f, -0.010500f, -0.004209f, 0.003625f, 0.001812f, -0.001639f, -0.000522f, 0.004863f, 0.000553f, 0.004303f, -0.007478f, 0.007586f, 0.003907f, -0.009759f, 0.007755f, 0.000670f, 0.002806f, -0.001182f, -0.002901f, -0.011389f, -0.003523f, -0.000871f, 0.005839f, -0.001521f, 0.004774f, -0.002878f, 0.000563f, 0.001404f, 0.000567f, 0.003370f, -0.000610f, 0.000213f, -0.000419f, -0.002325f, -0.001055f, 0.000431f, -0.001241f, 0.000140f, + -0.000062f, -0.000547f, 0.003104f, 0.003104f, 0.001623f, 0.001281f, 0.001129f, 0.000380f, 0.000007f, 0.000394f, 0.000166f, -0.000498f, -0.001392f, -0.001586f, -0.000357f, -0.000165f, 0.022330f, -0.012739f, 0.003975f, -0.014087f, 0.001769f, 0.003376f, -0.014202f, -0.017977f, 0.004573f, -0.019510f, 0.004380f, -0.005040f, -0.001285f, -0.011941f, -0.001674f, -0.013417f, -0.006864f, 0.000119f, -0.014198f, 0.015223f, 0.005404f, -0.023593f, 0.002314f, -0.001239f, -0.004218f, -0.010064f, 0.005155f, 0.012337f, 0.000311f, -0.000842f, 0.011588f, -0.006707f, 0.000213f, -0.004248f, 0.007701f, -0.008883f, 0.002689f, 0.010830f, -0.009309f, 0.009478f, 0.003377f, 0.010246f, -0.000810f, 0.002369f, -0.001478f, -0.004245f, 0.013410f, -0.016510f, 0.003885f, -0.007278f, -0.003122f, -0.002108f, -0.005969f, -0.004408f, -0.013143f, -0.008249f, -0.002002f, 0.008648f, -0.000672f, 0.003277f, 0.012093f, -0.000235f, -0.010374f, -0.001297f, 0.000437f, 0.003309f, -0.005035f, 0.000058f, -0.010204f, 0.000258f, -0.004121f, 0.003432f, 0.005391f, 0.007886f, 0.002853f, -0.004392f, -0.005709f, 0.007739f, -0.002523f, -0.003492f, + 0.001493f, 0.004319f, 0.008928f, 0.001115f, 0.002600f, -0.000546f, 0.005256f, -0.000979f, -0.004069f, -0.002077f, -0.001988f, -0.000156f, 0.003580f, 0.000719f, -0.000182f, -0.001846f, 0.003470f, 0.000020f, -0.001230f, -0.000929f, -0.000825f, -0.000969f, 0.001675f, -0.000658f, -0.000121f, -0.001950f, -0.005281f, -0.018355f, -0.000142f, -0.011030f, -0.003431f, -0.001730f, -0.012883f, -0.001694f, -0.002946f, 0.006511f, 0.015180f, 0.015280f, 0.001876f, -0.006412f, 0.006144f, -0.014636f, -0.002039f, -0.005548f, 0.005197f, -0.021851f, 0.007809f, 0.003803f, -0.000739f, -0.006224f, -0.009396f, -0.004234f, -0.007742f, -0.006621f, 0.004162f, -0.001377f, -0.008353f, -0.002360f, 0.001758f, 0.014417f, -0.000500f, -0.014377f, 0.001185f, 0.006327f, -0.000130f, -0.004458f, 0.001250f, 0.005548f, -0.015678f, -0.001124f, -0.006792f, 0.011149f, 0.006772f, 0.001976f, -0.014495f, 0.001748f, 0.005641f, 0.009020f, 0.008381f, -0.009449f, -0.004455f, 0.000542f, -0.002950f, -0.002886f, 0.007806f, -0.004710f, 0.004790f, 0.001417f, -0.006078f, -0.001264f, -0.008364f, 0.010228f, 0.003826f, -0.009873f, -0.006864f, 0.001807f, + 0.005326f, -0.007805f, -0.009974f, -0.001579f, 0.000518f, -0.006524f, 0.001450f, -0.002603f, 0.003391f, -0.006209f, 0.009438f, 0.005177f, 0.007117f, 0.002162f, 0.000949f, 0.006524f, 0.008656f, 0.001144f, 0.002465f, -0.000689f, 0.001236f, 0.000286f, -0.000356f, 0.001106f, 0.000730f, 0.001145f, -0.001366f, 0.000194f, 0.000662f, -0.000337f, 0.000148f, 0.003029f, -0.001683f, 0.000807f, -0.002017f, -0.001458f, -0.001358f, 0.000450f, 0.001078f, 0.000891f, 0.000083f, -0.001711f, -0.001257f, 0.003115f, -0.031285f, 0.010217f, 0.009145f, 0.015265f, -0.003867f, 0.009615f, -0.026977f, -0.007320f, 0.008546f, 0.001081f, -0.013311f, -0.003410f, -0.004386f, -0.023618f, -0.009538f, 0.002479f, -0.001024f, -0.016817f, 0.010615f, 0.015073f, -0.015339f, 0.011766f, -0.020108f, -0.006784f, -0.001751f, 0.007019f, -0.000052f, -0.008102f, 0.005589f, 0.002835f, -0.001293f, 0.009088f, -0.004309f, -0.005730f, -0.001761f, -0.003238f, -0.005918f, 0.008942f, -0.006763f, 0.002588f, 0.006686f, -0.001274f, -0.005229f, -0.009827f, -0.001158f, -0.006989f, -0.002115f, -0.008144f, -0.002183f, 0.018370f, 0.000414f, 0.011201f, + -0.010170f, 0.009412f, -0.002880f, -0.014866f, -0.008782f, 0.008356f, -0.005399f, -0.007520f, 0.005491f, -0.008856f, 0.007474f, 0.002084f, -0.002719f, 0.009814f, 0.008816f, 0.003961f, -0.009625f, -0.010844f, -0.000729f, 0.014634f, 0.002919f, 0.002292f, -0.008223f, 0.002236f, 0.005252f, -0.011012f, -0.004039f, 0.003697f, 0.007773f, 0.003934f, 0.006583f, -0.000281f, 0.000084f, 0.002507f, 0.000330f, -0.001157f, 0.000416f, -0.000857f, -0.001383f, -0.004818f, -0.003908f, 0.001289f, -0.002345f, -0.001313f, 0.001671f, 0.000840f, 0.001227f, -0.000213f, 0.002026f, -0.001206f, 0.000113f, -0.001632f, 0.000034f, -0.002000f, 0.001064f, 0.000458f, 0.001452f, -0.002637f, -0.016471f, -0.015640f, -0.010235f, 0.002290f, -0.002384f, 0.006847f, -0.005476f, 0.000324f, 0.001461f, -0.004447f, -0.001505f, 0.004336f, -0.004418f, 0.018981f, -0.011944f, 0.008960f, -0.002915f, -0.000961f, -0.008395f, -0.002074f, -0.000909f, 0.013927f, -0.009005f, 0.001536f, 0.002926f, -0.013032f, -0.007876f, -0.008801f, -0.007467f, -0.015157f, -0.005050f, 0.005886f, 0.010776f, 0.006970f, -0.012077f, -0.017108f, -0.003551f, 0.000856f, + -0.008599f, 0.001950f, -0.005755f, -0.008769f, -0.021302f, -0.010521f, -0.014851f, 0.009040f, -0.003642f, 0.007408f, -0.008418f, -0.020708f, -0.010887f, 0.001369f, -0.004019f, -0.006573f, -0.002875f, -0.007953f, 0.011499f, 0.001339f, 0.006804f, 0.009085f, 0.002478f, -0.000029f, -0.007035f, 0.000658f, 0.009770f, -0.001307f, -0.006785f, -0.009426f, 0.015912f, -0.012687f, -0.017930f, -0.012506f, -0.007143f, -0.009762f, 0.011641f, 0.018515f, -0.014233f, -0.009649f, 0.002484f, 0.009161f, 0.013799f, 0.011062f, 0.008615f, 0.008600f, -0.002675f, -0.003258f, -0.003875f, -0.003919f, 0.003601f, -0.002264f, 0.001158f, -0.002838f, -0.004895f, -0.001739f, -0.003457f, 0.003075f, -0.002068f, -0.004221f, -0.002432f, -0.002284f, -0.004361f, -0.004726f, -0.002943f, -0.000919f, 0.001261f, 0.001287f, 0.002638f, 0.000678f, -0.007666f, 0.001313f, -0.000976f, -0.002804f, 0.001171f, -0.001004f, -0.002149f, -0.004803f, -0.004033f, 0.000528f, 0.000253f, -0.001357f, -0.001762f, 0.000390f, -0.002188f, 0.001742f, -0.001876f, -0.000876f, -0.000698f, -0.003295f, 0.004321f, -0.034400f, 0.010631f, -0.002419f, 0.006097f, 0.018895f, + 0.007411f, -0.004648f, 0.006386f, -0.014177f, 0.008777f, 0.010335f, -0.018759f, -0.003973f, -0.009508f, 0.010612f, 0.009183f, 0.014391f, 0.016624f, -0.021584f, -0.011168f, 0.003614f, 0.018551f, -0.006998f, 0.008605f, -0.020622f, -0.006285f, -0.007192f, -0.004429f, -0.012455f, 0.003057f, -0.020404f, 0.014137f, -0.003947f, -0.003686f, 0.010443f, -0.000675f, 0.002449f, 0.010956f, 0.000386f, 0.008954f, 0.006132f, -0.002619f, -0.003458f, -0.001288f, -0.014275f, -0.010612f, -0.013030f, -0.000907f, 0.027419f, 0.006262f, 0.005396f, -0.000726f, -0.003696f, -0.000317f, 0.016443f, -0.003583f, 0.005235f, -0.031585f, 0.029108f, -0.007122f, -0.005038f, 0.001560f, 0.017888f, 0.006350f, -0.002824f, -0.010911f, 0.031198f, -0.006104f, -0.000222f, 0.009825f, -0.007705f, -0.000176f, 0.004617f, -0.007125f, 0.006303f, 0.005954f, 0.025816f, -0.012900f, -0.015880f, -0.003096f, 0.007860f, -0.009798f, 0.002342f, 0.006478f, 0.002317f, -0.005796f, 0.002742f, 0.006637f, -0.004082f, 0.000443f, -0.007124f, -0.002475f, -0.001939f, -0.006166f, 0.008095f, -0.005878f, -0.004603f, 0.003412f, 0.000009f, -0.006946f, -0.000368f, + 0.001441f, 0.003155f, 0.000135f, 0.003675f, -0.002652f, -0.001832f, -0.002203f, 0.002566f, -0.002710f, 0.004359f, 0.000231f, -0.001442f, 0.001649f, 0.004552f, -0.007773f, -0.000305f, -0.002166f, 0.014688f, 0.008148f, 0.016369f, -0.006838f, -0.004149f, 0.009346f, -0.015497f, 0.013561f, 0.015504f, -0.008075f, -0.001528f, -0.024889f, 0.000967f, 0.008296f, 0.006673f, -0.005429f, -0.017000f, -0.034275f, 0.000345f, -0.005992f, -0.016376f, 0.003573f, 0.010668f, -0.014994f, -0.006509f, -0.016335f, 0.007960f, 0.000728f, -0.002607f, -0.005563f, -0.007201f, 0.017199f, 0.020095f, 0.007697f, 0.009468f, -0.004720f, -0.010397f, 0.028109f, 0.006835f, -0.005024f, -0.016829f, 0.012056f, 0.000306f, 0.016081f, -0.001641f, 0.019918f, 0.009859f, 0.013880f, 0.011703f, 0.005873f, 0.015457f, 0.019348f, -0.000764f, 0.003418f, -0.006445f, -0.000397f, 0.010463f, 0.004270f, 0.005597f, -0.017477f, -0.006549f, -0.003839f, -0.015253f, -0.014583f, -0.009683f, 0.007870f, 0.016410f, 0.021529f, 0.028218f, 0.006138f, 0.002283f, 0.022712f, -0.009330f, -0.017448f, -0.006214f, -0.008926f, 0.014621f, 0.011930f, 0.004441f, + -0.016531f, -0.004655f, 0.002739f, 0.002173f, -0.003357f, -0.007736f, 0.002134f, 0.001724f, 0.009287f, -0.002468f, -0.005400f, 0.000897f, 0.001672f, 0.002120f, 0.000014f, -0.000061f, 0.001716f, 0.004137f, -0.003221f, -0.003179f, 0.000130f, -0.000569f, -0.004453f, -0.001182f, -0.005636f, 0.005800f, 0.001779f, -0.004316f, -0.000323f, 0.003872f, -0.002277f, -0.000554f, -0.003405f, 0.001608f, 0.001995f, -0.001630f, 0.005052f, 0.003757f, -0.000717f, 0.026125f, -0.025111f, -0.011897f, -0.003527f, 0.009906f, -0.023508f, 0.014584f, -0.023165f, 0.011146f, -0.000254f, 0.011839f, 0.018818f, -0.007940f, 0.017169f, 0.018824f, 0.017857f, -0.010618f, 0.015032f, -0.016546f, -0.013264f, -0.002183f, -0.010297f, -0.000310f, -0.008884f, 0.014767f, -0.011240f, 0.003136f, -0.011101f, -0.019280f, -0.009123f, -0.004172f, 0.022923f, -0.019532f, 0.018011f, 0.007882f, -0.027069f, 0.030674f, 0.007381f, 0.003304f, 0.021428f, 0.003712f, 0.000762f, -0.012384f, -0.000274f, -0.006970f, 0.024458f, 0.010296f, 0.017078f, -0.006858f, -0.004298f, 0.011788f, 0.020331f, -0.021598f, 0.021075f, 0.003777f, -0.003683f, -0.004116f, + -0.020459f, 0.009647f, -0.009775f, 0.004015f, 0.000673f, -0.018446f, 0.005967f, 0.015433f, -0.014339f, 0.009756f, 0.006221f, 0.021647f, 0.002078f, -0.001559f, 0.012960f, 0.018925f, 0.001309f, -0.010994f, 0.012527f, -0.014803f, -0.007910f, 0.003846f, -0.006205f, 0.003897f, -0.005025f, 0.001817f, 0.007972f, 0.005936f, -0.006258f, 0.005181f, -0.003345f, 0.004167f, -0.004473f, 0.013178f, 0.001078f, 0.012583f, -0.001777f, 0.003113f, -0.002933f, -0.001148f, -0.004299f, 0.007964f, 0.003100f, -0.006648f, 0.006637f, 0.007988f, -0.001159f, -0.001142f, 0.004630f, -0.000383f, -0.000690f, 0.006655f, -0.000481f, 0.001615f, 0.004038f, 0.002801f, -0.001318f, 0.005087f, -0.004507f, -0.000792f, 0.000701f, 0.001372f, 0.000851f, -0.000294f, -0.000891f, -0.005086f, 0.002129f, 0.007567f, 0.001872f, -0.021276f, -0.015233f, 0.023088f, -0.029642f, 0.007441f, -0.015796f, 0.017577f, -0.018848f, 0.028727f, 0.009929f, 0.002769f, -0.024977f, 0.012701f, 0.021075f, 0.005572f, -0.012861f, -0.008341f, -0.007381f, 0.019598f, 0.010619f, -0.027357f, 0.003826f, -0.019352f, -0.001113f, 0.002219f, -0.016588f, 0.021692f, + 0.021718f, -0.009874f, 0.004722f, 0.014778f, -0.018086f, -0.002731f, -0.005607f, -0.014918f, 0.031701f, -0.011525f, -0.007162f, -0.015974f, -0.026775f, -0.004216f, 0.000432f, -0.009206f, 0.003905f, -0.022082f, 0.001883f, 0.001592f, -0.004500f, 0.017510f, -0.003713f, -0.013559f, 0.007006f, 0.000028f, -0.010249f, 0.008770f, 0.037573f, -0.007487f, 0.008886f, 0.002101f, -0.025651f, -0.004107f, 0.022737f, 0.010342f, 0.022570f, -0.002262f, 0.013013f, -0.017982f, 0.008016f, 0.008043f, 0.002581f, -0.015267f, 0.014095f, 0.005089f, -0.039880f, 0.003183f, -0.007278f, 0.026697f, -0.010309f, 0.020753f, 0.019046f, 0.015478f, -0.002000f, 0.006001f, 0.000808f, 0.001652f, -0.002690f, -0.004279f, 0.010298f, 0.004307f, -0.000242f, -0.006783f, -0.009742f, -0.002126f, 0.004028f, 0.006877f, 0.004734f, 0.008793f, 0.000199f, -0.002210f, -0.003682f, -0.002652f, 0.003026f, 0.005326f, -0.000587f, 0.004238f, 0.002571f, 0.000911f, 0.003638f, -0.000559f, 0.003807f, -0.006337f, -0.008161f, -0.010420f, -0.000618f, 0.004998f, 0.002073f, -0.004791f, -0.001925f, -0.003294f, -0.003974f, 0.006671f, 0.001858f, 0.003087f, + 0.002612f, -0.046761f, 0.052299f, 0.005930f, 0.020480f, -0.038409f, 0.020553f, 0.026832f, -0.031503f, 0.011634f, 0.015193f, 0.011699f, -0.020453f, 0.002384f, 0.003290f, -0.007076f, 0.011511f, 0.024010f, -0.019760f, -0.016478f, -0.006205f, 0.020315f, 0.017522f, 0.024904f, -0.001488f, 0.010369f, -0.019027f, -0.005172f, -0.005147f, 0.003856f, 0.011554f, 0.031908f, 0.018877f, 0.011437f, 0.005840f, -0.001324f, 0.015089f, -0.005944f, -0.027880f, -0.005615f, 0.007837f, 0.008562f, -0.016433f, -0.012487f, -0.020285f, 0.003612f, -0.001869f, 0.006774f, -0.013396f, 0.023235f, 0.022678f, -0.020129f, 0.046990f, 0.001921f, -0.004626f, -0.000515f, -0.010124f, -0.002372f, -0.003310f, -0.019358f, 0.000034f, -0.000183f, 0.012265f, -0.040019f, 0.009461f, -0.014338f, 0.028611f, 0.034660f, 0.014820f, 0.014264f, 0.006234f, 0.002096f, 0.031218f, -0.006141f, -0.023584f, 0.019707f, -0.010780f, 0.005117f, 0.015276f, 0.028158f, 0.003701f, 0.002575f, -0.023012f, -0.001212f, 0.006359f, 0.017796f, -0.008119f, 0.009568f, 0.004430f, -0.007114f, 0.018008f, 0.002873f, 0.007913f, -0.005544f, -0.001978f, -0.005494f, + 0.000603f, 0.001897f, -0.003080f, -0.000365f, 0.005221f, -0.003247f, 0.005295f, 0.003561f, -0.004188f, -0.000613f, 0.002305f, -0.001844f, 0.000155f, -0.003942f, -0.012632f, -0.003737f, -0.002168f, 0.012717f, 0.015684f, 0.001385f, 0.002063f, -0.004769f, -0.005630f, 0.001169f, 0.001457f, -0.006852f, -0.005472f, -0.003640f, -0.003308f, 0.004125f, -0.007680f, -0.000518f, -0.005718f, 0.019407f, 0.003945f, -0.013022f, 0.012678f, 0.018901f, 0.016438f, 0.010498f, 0.019553f, -0.023158f, -0.014698f, 0.002910f, -0.020958f, -0.004994f, -0.003360f, 0.004972f, -0.005256f, -0.013472f, -0.017072f, -0.010107f, 0.008697f, 0.014836f, -0.025324f, 0.005669f, -0.002504f, -0.000413f, -0.030558f, -0.027326f, -0.004652f, -0.021133f, 0.010256f, -0.024135f, 0.001720f, 0.013335f, 0.018930f, -0.016367f, 0.022463f, 0.005974f, -0.002070f, -0.004644f, 0.033238f, -0.008944f, -0.001510f, -0.026315f, -0.014819f, 0.021969f, -0.001519f, 0.008497f, -0.025468f, -0.027736f, -0.007536f, -0.015523f, -0.002632f, 0.001519f, -0.010220f, -0.012960f, 0.008005f, -0.012007f, 0.001201f, -0.017834f, -0.009690f, -0.000159f, -0.029777f, 0.003059f, + 0.019786f, 0.004060f, 0.010445f, 0.021737f, 0.036830f, -0.035119f, 0.006566f, -0.021547f, -0.021152f, -0.011569f, -0.016050f, -0.010054f, -0.009432f, 0.036259f, 0.019873f, 0.020221f, 0.004231f, 0.006178f, -0.025881f, 0.001609f, -0.009054f, 0.004500f, -0.011187f, 0.016249f, 0.021084f, 0.002405f, -0.009417f, -0.006100f, -0.017839f, 0.001987f, 0.011109f, 0.006468f, -0.004255f, 0.011737f, 0.005563f, 0.012407f, -0.002507f, -0.001837f, 0.002051f, 0.008208f, -0.004922f, 0.003723f, -0.007277f, -0.009826f, 0.007448f, 0.003043f, 0.001586f, 0.002033f, -0.013849f, -0.007882f, -0.000012f, 0.011090f, -0.008950f, 0.005753f, -0.012016f, -0.003634f, -0.001880f, 0.004682f, 0.002947f, -0.003186f, -0.002902f, -0.015631f, 0.006862f, 0.037581f, 0.039810f, 0.043672f, -0.031483f, 0.002905f, 0.023821f, 0.018863f, -0.018151f, -0.035271f, -0.003596f, -0.004787f, -0.027602f, -0.015744f, 0.054064f, 0.004758f, 0.004239f, 0.020562f, -0.001731f, 0.009103f, -0.006784f, -0.020674f, 0.014570f, 0.012226f, -0.028124f, -0.040283f, -0.031032f, -0.024603f, -0.023340f, 0.002835f, 0.007572f, 0.012677f, -0.015313f, 0.016133f, + 0.004356f, -0.007288f, -0.016235f, -0.000043f, 0.001562f, -0.025496f, -0.019742f, 0.003505f, -0.004071f, 0.004066f, -0.015131f, 0.013256f, 0.004605f, -0.014335f, -0.031195f, -0.012083f, -0.010102f, -0.041843f, -0.012699f, 0.004452f, 0.021580f, -0.001539f, 0.025438f, -0.003893f, -0.001425f, -0.035602f, -0.007005f, 0.014656f, 0.007436f, -0.059903f, 0.017980f, 0.005698f, -0.016154f, -0.009775f, -0.016875f, -0.019361f, -0.000102f, 0.001370f, -0.018454f, -0.005720f, 0.012924f, 0.018055f, 0.028436f, -0.020755f, 0.001728f, 0.016093f, 0.000015f, -0.045731f, -0.036076f, 0.000008f, -0.009007f, 0.011990f, 0.000400f, -0.010931f, -0.015784f, 0.008051f, -0.004007f, 0.007349f, 0.019635f, -0.000097f, -0.008564f, -0.015319f, -0.028080f, -0.009441f, 0.002547f, -0.004375f, -0.004072f, 0.002292f, 0.002695f, 0.013226f, -0.005763f, 0.001735f, 0.005646f, 0.002933f, -0.009596f, 0.001589f, -0.001806f, -0.024730f, 0.003419f, -0.008915f, -0.010473f, 0.004449f, 0.003965f, -0.007239f, -0.001501f, 0.009412f, 0.003534f, 0.002766f, -0.008364f, -0.010160f, -0.002769f, -0.000442f, 0.001493f, 0.006787f, -0.011015f, -0.000969f, + -0.006904f, -0.004308f, -0.009080f, 0.015366f, -0.011980f, 0.042575f, -0.035378f, -0.021586f, -0.006723f, -0.067444f, -0.034920f, 0.000351f, -0.042739f, 0.034183f, -0.014635f, -0.013524f, 0.004466f, 0.077578f, 0.037810f, 0.002890f, 0.016450f, -0.003084f, -0.020051f, -0.001568f, -0.031362f, -0.022677f, 0.011662f, 0.011660f, 0.014479f, -0.021772f, 0.029150f, 0.017897f, 0.032900f, -0.032304f, 0.005937f, 0.048214f, 0.005145f, 0.002395f, 0.010113f, -0.045381f, 0.012386f, -0.011157f, 0.008234f, -0.018033f, -0.042544f, -0.002245f, 0.018191f, 0.021698f, 0.006235f, -0.006369f, 0.003867f, -0.001604f, 0.015065f, -0.032292f, -0.046792f, 0.008864f, -0.016603f, 0.028726f, -0.010601f, -0.011470f, 0.037824f, 0.008677f, 0.016708f, 0.003285f, -0.030557f, -0.012535f, -0.002964f, 0.017219f, 0.049680f, 0.037925f, -0.010428f, -0.042928f, -0.000086f, -0.004691f, 0.016822f, -0.026374f, -0.032567f, -0.018697f, 0.016644f, -0.033584f, -0.004445f, -0.028147f, 0.001026f, 0.023116f, 0.000158f, -0.042327f, -0.008492f, 0.005866f, 0.012072f, 0.005517f, -0.025645f, -0.017683f, -0.027498f, 0.004597f, -0.005052f, -0.012152f, + -0.008559f, -0.012153f, 0.003334f, -0.004973f, -0.010845f, -0.003180f, 0.009272f, 0.000109f, 0.000579f, -0.014293f, 0.000628f, -0.001218f, -0.008207f, 0.000889f, 0.018745f, 0.006053f, 0.004238f, -0.018168f, 0.008125f, -0.001923f, -0.001077f, 0.002950f, 0.000610f, -0.000289f, -0.002701f, -0.010817f, -0.011059f, -0.009908f, 0.013399f, 0.010788f, -0.003902f, -0.027112f, -0.008939f, -0.010060f, -0.001098f, -0.014438f, -0.077745f, 0.029473f, 0.024102f, -0.011736f, -0.051531f, -0.011656f, -0.020109f, -0.021096f, 0.022130f, 0.027500f, -0.003277f, 0.007264f, -0.058518f, 0.020118f, -0.073139f, -0.018733f, -0.006746f, 0.014156f, 0.036149f, 0.057784f, 0.023676f, -0.033948f, 0.007376f, 0.040289f, 0.004953f, 0.012050f, 0.021574f, -0.034483f, -0.013653f, -0.005685f, 0.009908f, -0.024370f, -0.013426f, -0.007582f, -0.018569f, -0.014075f, 0.024199f, 0.023955f, 0.005734f, 0.001754f, 0.041287f, -0.008117f, 0.019013f, -0.047489f, 0.030821f, 0.008715f, -0.043339f, 0.004137f, 0.013208f, -0.040494f, -0.005719f, -0.039604f, 0.012644f, 0.016364f, 0.017154f, -0.026728f, -0.002819f, 0.026257f, -0.022608f, 0.000105f, + -0.004112f, 0.043489f, -0.026429f, 0.031993f, 0.015738f, -0.040895f, 0.035162f, -0.030156f, 0.022413f, 0.030129f, -0.031209f, 0.017101f, -0.026725f, -0.032662f, -0.049597f, -0.041026f, -0.045417f, -0.010854f, 0.007355f, -0.013636f, 0.038520f, 0.040527f, -0.017855f, 0.035704f, -0.006167f, -0.007693f, 0.044908f, -0.010275f, -0.031240f, 0.021130f, -0.005288f, -0.023981f, -0.019072f, 0.017906f, 0.002475f, 0.009231f, 0.013530f, 0.002418f, 0.010988f, 0.018031f, -0.005603f, 0.020235f, 0.013206f, 0.010051f, 0.010772f, 0.001614f, 0.006300f, 0.017198f, 0.013107f, 0.017442f, 0.001797f, 0.014476f, -0.003552f, 0.000948f, 0.011836f, -0.006340f, -0.023660f, 0.010741f, 0.002765f, -0.000018f, -0.000418f, 0.010265f, -0.021092f, 0.010331f, 0.013280f, 0.011505f, -0.014322f, 0.011779f, -0.062026f, -0.029738f, -0.030923f, 0.052788f, 0.000827f, 0.019244f, -0.009512f, 0.075190f, 0.011193f, -0.051519f, 0.002913f, 0.055044f, -0.021482f, 0.011663f, -0.010029f, 0.004071f, -0.033438f, -0.044780f, 0.069009f, 0.048931f, -0.019942f, 0.037381f, 0.014171f, 0.048858f, 0.055592f, -0.017251f, -0.014151f, 0.049409f, + 0.035943f, 0.003320f, -0.016702f, -0.025693f, -0.027008f, 0.022470f, 0.043396f, 0.020042f, -0.008929f, 0.028983f, -0.016504f, 0.027471f, -0.013493f, 0.040405f, 0.072047f, 0.054766f, -0.060259f, 0.026380f, -0.011001f, -0.024953f, -0.001672f, 0.019927f, 0.019099f, 0.132422f, -0.014346f, -0.002161f, -0.022582f, -0.024412f, 0.025040f, 0.047347f, -0.012692f, 0.035807f, 0.030326f, -0.004965f, 0.000198f, -0.026698f, 0.025493f, 0.021419f, 0.069941f, 0.071284f, 0.086592f, 0.035578f, -0.023272f, -0.018893f, -0.041152f, 0.038487f, -0.060426f, 0.042253f, -0.056780f, 0.032037f, -0.020641f, -0.034375f, 0.023335f, -0.091207f, -0.072478f, 0.012240f, 0.013092f, -0.026669f, -0.026052f, 0.041378f, 0.020054f, -0.039589f, 0.004794f, -0.009634f, -0.022218f, 0.006155f, 0.009893f, 0.002520f, 0.010034f, 0.012155f, 0.021791f, -0.011347f, 0.003448f, -0.013554f, -0.023606f, -0.014607f, 0.004411f, 0.001172f, 0.030236f, 0.005878f, -0.008571f, -0.026111f, 0.003000f, -0.010829f, -0.009168f, -0.012052f, 0.007713f, 0.018054f, 0.005642f, 0.015567f, 0.012668f, 0.020837f, -0.010139f, 0.015691f, 0.001128f, 0.004023f, + -0.002541f, 0.000636f, -0.013777f, 0.014417f, 0.035188f, 0.018691f, -0.004916f, -0.004809f, 0.030130f, 0.025445f, -0.021007f, 0.008368f, 0.015817f, -0.009952f, 0.043060f, 0.010637f, -0.096664f, 0.023650f, 0.014128f, -0.071690f, 0.005598f, -0.011338f, 0.004337f, 0.027839f, -0.002212f, -0.066207f, -0.010628f, -0.020345f, -0.002433f, 0.048787f, 0.058586f, -0.031482f, -0.006851f, -0.026262f, 0.015463f, -0.050526f, -0.098700f, -0.034804f, -0.028838f, 0.006295f, 0.003038f, 0.046537f, -0.067011f, 0.033613f, -0.014500f, -0.006565f, 0.029520f, 0.014185f, 0.049009f, 0.011818f, 0.019753f, 0.051862f, -0.056727f, 0.073528f, 0.059078f, 0.030979f, 0.055509f, -0.020078f, 0.021988f, -0.049733f, -0.008610f, -0.024599f, 0.046260f, -0.038817f, 0.011063f, -0.084371f, -0.104206f, 0.071413f, -0.001771f, 0.046365f, -0.030601f, 0.030962f, -0.019465f, 0.007349f, -0.010518f, -0.068455f, -0.020380f, -0.045512f, -0.020461f, 0.025841f, 0.104194f, 0.037407f, -0.089069f, -0.019763f, 0.025511f, -0.020270f, -0.012045f, -0.059146f, -0.029434f, 0.046940f, -0.015790f, 0.011883f, 0.010627f, -0.036633f, 0.025141f, -0.004787f, + 0.003362f, -0.075923f, -0.020755f, -0.000994f, -0.033448f, -0.019231f, 0.004456f, -0.051213f, 0.006962f, 0.012192f, -0.040372f, -0.032414f, -0.057637f, -0.043585f, -0.002546f, -0.023905f, -0.010152f, 0.002012f, -0.015389f, -0.016215f, -0.005382f, -0.025651f, -0.010966f, 0.003839f, 0.019368f, -0.022601f, -0.006667f, -0.039044f, 0.015537f, 0.010124f, 0.024818f, -0.015947f, 0.025750f, -0.050705f, -0.001433f, 0.000353f, -0.001995f, 0.008142f, -0.006708f, 0.005724f, -0.022110f, -0.024588f, 0.001804f, 0.010217f, 0.000911f, -0.019341f, 0.006980f, 0.005985f, -0.060255f, 0.031748f, 0.031653f, 0.056337f, -0.027565f, 0.020671f, -0.031686f, -0.036671f, 0.016264f, 0.074854f, 0.121075f, -0.007481f, -0.008168f, 0.002636f, -0.002837f, -0.053904f, 0.084642f, 0.040852f, 0.044934f, 0.034906f, -0.024747f, 0.029593f, -0.048009f, -0.068651f, -0.012108f, 0.051714f, 0.033274f, -0.024426f, -0.016153f, -0.003203f, 0.041420f, 0.001991f, 0.030103f, 0.030018f, 0.049064f, 0.016720f, -0.031387f, -0.029220f, 0.027889f, -0.032912f, -0.025121f, 0.014932f, 0.053856f, 0.050324f, -0.057518f, -0.043847f, 0.029059f, 0.035514f, + 0.106184f, -0.024368f, -0.058491f, -0.059768f, 0.050559f, -0.038088f, 0.047659f, 0.054858f, 0.109206f, 0.233242f, -0.052561f, -0.029201f, -0.087762f, -0.138391f, -0.044833f, -0.069430f, 0.007455f, 0.097087f, -0.014771f, 0.051687f, 0.072341f, 0.048376f, -0.027573f, -0.085428f, -0.141501f, 0.079250f, -0.006189f, 0.090080f, -0.046636f, -0.121495f, 0.041946f, -0.071712f, -0.097126f, -0.048789f, -0.031417f, 0.031450f, 0.029522f, 0.055696f, -0.004859f, -0.025949f, -0.005043f, -0.001434f, -0.050702f, -0.047504f, 0.023770f, -0.016252f, 0.048434f, 0.045803f, -0.022351f, 0.045637f, -0.036140f, 0.001930f, 0.043148f, 0.005715f, -0.069585f, 0.019318f, -0.035548f, -0.004976f, -0.012128f, -0.008130f, -0.051636f, -0.040310f, 0.006983f, 0.061172f, 0.063238f, -0.059064f, -0.008258f, 0.074521f, 0.069011f, 0.001369f, 0.013611f, -0.065037f, -0.036454f, 0.011208f, 0.037520f, -0.055944f, 0.013375f, 0.046174f, 0.021114f, 0.018448f, 0.003699f, 0.029786f, 0.042434f, 0.022633f, -0.006452f, 0.007840f, -0.046107f, 0.009632f, -0.041944f, -0.117272f, 0.030653f, -0.048494f, 0.049951f, 0.008077f, 0.028300f, 0.024859f, + -0.107160f, -0.075723f, -0.036996f, -0.022968f, -0.024185f, -0.043335f, -0.012794f, -0.072556f, -0.045792f, 0.036130f, -0.046827f, 0.091778f, -0.066705f, 0.007778f, 0.019722f, -0.006385f, 0.008984f, -0.003100f, 0.022725f, -0.020297f, -0.021737f, -0.003145f, 0.017292f, -0.002080f, 0.040024f, -0.036041f, 0.009329f, 0.057772f, 0.019294f, 0.009313f, 0.030061f, 0.004357f, -0.022173f, -0.014039f, 0.047308f, 0.011120f, -0.072046f, -0.031676f, -0.058249f, -0.026273f, 0.079697f, 0.074035f, -0.074637f, -0.007657f, -0.085002f, -0.020038f, -0.006049f, 0.020567f, 0.044292f, -0.069833f, 0.048185f, -0.059353f, -0.009018f, -0.039993f, 0.091672f, -0.017617f, 0.065009f, 0.060391f, 0.134073f, -0.060552f, 0.055996f, 0.009585f, 0.053274f, 0.018841f, 0.040939f, -0.065948f, -0.059951f, 0.089426f, 0.005565f, -0.002711f, -0.061626f, 0.072311f, -0.023007f, 0.037397f, -0.064902f, 0.139710f, -0.073242f, 0.077987f, -0.092015f, 0.037467f, -0.069021f, 0.039448f, -0.063472f, 0.048629f, -0.039701f, 0.028798f, -0.021555f, 0.016111f, -0.033549f, -0.021035f, -0.015152f, -0.003806f, 0.013751f, 0.002696f, 0.011376f, 0.001347f, + 0.011221f, -0.004753f, -0.016381f, -0.027733f, 0.014276f, 0.014550f, 0.005549f, 0.013361f, -0.009058f, 0.005502f, -0.006848f, 0.005750f, 0.049363f, -0.011606f, -0.032773f, 0.005286f, -0.017880f, -0.036212f, 0.013223f, -0.019603f, 0.016223f, -0.016387f, 0.013775f, -0.031624f, 0.014630f, -0.041009f, 0.027562f, 0.060085f, 0.011075f, -0.104404f, -0.044763f, -0.063905f, 0.005771f, -0.013363f, -0.141671f, -0.063237f, -0.035574f, -0.074552f, -0.045579f, -0.142841f, -0.120172f, -0.020296f, 0.054185f, -0.077795f, -0.045569f, -0.009758f, -0.065850f, -0.013739f, -0.003454f, -0.063797f, -0.015523f, 0.015250f, 0.005233f, -0.085270f, -0.047553f, -0.047866f, -0.025599f, -0.029033f, -0.006886f, -0.058652f, 0.052420f, 0.034652f, 0.073978f, 0.106433f, 0.093046f, 0.025041f, 0.098273f, 0.040363f, 0.019216f, -0.040963f, 0.035780f, 0.036846f, 0.029813f, -0.009354f, -0.030856f, -0.013473f, 0.026217f, 0.044610f, 0.222135f, 0.031656f, 0.047484f, 0.034170f, 0.092144f, 0.036668f, 0.081219f, 0.145698f, -0.067188f, -0.139003f, 0.019769f, 0.091881f, 0.163045f, 0.073155f, -0.136582f, 0.020679f, -0.032326f, 0.204764f, + 0.151614f, 0.183416f, 0.168811f, -0.142653f, -0.092990f, 0.120593f, 0.144889f, -0.039575f, -0.080355f, -0.097983f, 0.227151f, 0.151635f, -0.007161f, -0.191311f, 0.048859f, -0.005338f, -0.040452f, 0.055371f, 0.016922f, -0.014768f, -0.038895f, 0.001376f, 0.033086f, 0.085665f, 0.061993f, -0.047557f, -0.017379f, -0.011093f, -0.007980f, 0.049452f, 0.037010f, 0.038924f, 0.003275f, 0.022014f, 0.079745f, 0.054569f, 0.013657f, 0.033221f, -0.018193f, 0.040880f, 0.052660f, 0.067769f, 0.086245f, 0.067547f, 0.052914f, 0.003311f, -0.008110f, -0.014102f, -0.002409f, -0.034029f, -0.017023f, -0.014614f, -0.042404f, -0.056379f, -0.064117f, -0.113544f, -0.062538f, -0.039883f, -0.066437f, -0.126429f, -0.086369f, -0.072783f, -0.084966f, -0.102360f, -0.107713f, -0.034187f, -0.038308f, -0.057064f, -0.029434f, -0.033501f, -0.020039f, -0.030810f, -0.029168f, -0.029120f, -0.020561f, -0.027779f, -0.016399f, -0.022176f, -0.015284f, -0.017647f, -0.009113f, -0.020093f, -0.001233f, -0.019845f, -0.026832f, -0.035479f, -0.104280f, 0.166800f, 0.134683f, -0.116888f, 0.025938f, -0.002881f, 0.018643f, -0.004737f, -0.011669f, 0.042788f, + -0.043318f, 0.041777f, -0.017224f, -0.000071f, 0.016504f, 0.013301f, 0.014894f, -0.000371f, -0.024570f, -0.015914f, 0.026779f, -0.022346f, -0.002906f, 0.025622f, -0.014210f, -0.015064f, -0.020644f, -0.037966f, -0.037906f, 0.027386f, -0.013868f, 0.010013f, -0.023859f, 0.004458f, -0.050540f, -0.009422f, 0.013772f, 0.032185f, -0.020712f, 0.006775f, 0.022221f, 0.035264f, -0.008584f, 0.029133f, -0.023983f, 0.093535f, -0.034917f, 0.032027f, 0.004269f, 0.017983f, -0.017638f, 0.024532f, -0.010027f, 0.066525f, -0.010966f, 0.020345f, -0.046752f, 0.060990f, -0.032314f, -0.002893f, -0.009106f, 0.008533f, -0.018340f, 0.036446f, -0.042537f, 0.034212f, -0.038981f, 0.050163f, -0.052919f, 0.063716f, -0.042646f, -0.023495f, -0.026728f, -0.013938f, 0.002579f, -0.042728f, 0.027539f, -0.025558f, 0.024168f, 0.001391f, 0.033400f, 0.011977f, 0.023124f, 0.040007f, 0.017607f, -0.014731f, 0.011031f, 0.009273f, -0.005677f, 0.006614f, -0.012581f, 0.013970f, -0.006994f, -0.000667f, -0.012276f, 0.027823f, -0.028067f, 0.001869f, -0.002357f, 0.022370f, -0.004186f, 0.003939f, -0.005157f, 0.008458f, -0.013104f, 0.009413f, + -0.011143f, -0.006922f, 0.022186f, 0.018770f, -0.005599f, -0.020781f, 0.013169f, 0.016431f, 0.019154f, -0.018200f, 0.015029f, -0.012950f, 0.011433f, 0.001538f, 0.004722f, -0.019590f, 0.020260f, -0.008490f, -0.022543f, 0.017979f, 0.018919f, -0.016829f, -0.002463f, -0.004694f, 0.005778f, -0.016469f, 0.021913f, -0.021025f, 0.008175f, -0.022921f, 0.020191f, -0.017056f, 0.017506f, -0.014104f, 0.021348f, -0.024063f, 0.025571f, -0.023814f, 0.013043f, -0.020188f, 0.019958f, -0.022879f, 0.018409f, -0.015172f, 0.022780f, -0.025337f, 0.025401f, -0.022470f, 0.021280f, -0.017037f, 0.019747f, -0.018370f, 0.016860f, -0.014758f, 0.013711f, -0.015086f, 0.013219f, -0.014002f, 0.014877f, -0.015346f, 0.014650f, -0.012814f, 0.012972f, -0.013237f, 0.012441f, -0.012039f, 0.013933f, -0.011887f, 0.013591f, -0.009951f, 0.011791f, -0.009714f, 0.009920f, -0.010212f, 0.012152f, -0.008994f, 0.009306f, -0.007310f, 0.010527f, -0.007825f, 0.007667f, -0.006966f, 0.005184f, -0.005325f, 0.006645f, -0.004526f, 0.007103f, -0.005455f, 0.007237f, -0.005486f, -0.040811f, -0.084480f, -0.092958f, 0.079274f, 0.020137f, -0.024379f, + -0.126018f, -0.050595f, 0.070425f, 0.014444f, 0.050904f, 0.056727f, -0.020301f, -0.035472f, 0.001817f, 0.013521f, 0.010548f, 0.009487f, -0.022182f, -0.016303f, -0.012262f, 0.000154f, 0.034262f, 0.018533f, -0.001529f, 0.007761f, -0.009714f, -0.016427f, -0.010423f, -0.008566f, 0.000732f, 0.010156f, -0.007648f, 0.013081f, 0.013775f, -0.046265f, -0.020476f, -0.020438f, 0.024845f, 0.017274f, -0.001455f, -0.021510f, -0.029065f, 0.025463f, 0.005708f, 0.017090f, 0.023804f, -0.042918f, -0.028506f, 0.007885f, 0.034700f, 0.017515f, -0.048800f, -0.030094f, -0.039630f, -0.018916f, 0.010315f, 0.009001f, -0.016273f, 0.017994f, -0.007299f, -0.017123f, 0.007745f, 0.016392f, -0.012158f, 0.003905f, -0.000406f, -0.015312f, -0.001334f, -0.005414f, -0.034644f, -0.035057f, -0.002098f, -0.037402f, -0.027982f, 0.001165f, 0.011396f, -0.008174f, 0.041304f, 0.030437f, 0.017405f, 0.001273f, -0.003903f, -0.018391f, 0.022900f, 0.011159f, 0.013380f, 0.012839f, -0.011509f, -0.004905f, -0.000827f, 0.006512f, -0.021572f, -0.026363f, -0.003582f, 0.011533f, 0.001756f, 0.014605f, 0.010263f, -0.013783f, 0.004560f, 0.008004f, + 0.005728f, -0.004482f, 0.014705f, -0.018337f, -0.010851f, 0.033545f, 0.019357f, -0.020768f, -0.015505f, -0.010615f, -0.018415f, 0.020326f, -0.000652f, 0.002836f, 0.009408f, 0.005971f, -0.000184f, -0.000880f, -0.013721f, 0.008659f, 0.005277f, 0.011930f, -0.006755f, -0.002118f, 0.007854f, -0.000870f, -0.009062f, 0.032789f, -0.081751f, -0.222768f, -0.084670f, 0.050717f, 0.107298f, 0.252996f, 0.148722f, 0.040433f, 0.052980f, -0.043855f, -0.081866f, -0.179221f, -0.120802f, -0.092665f, -0.030284f, 0.036714f, 0.098664f, 0.076623f, 0.095787f, 0.092477f, 0.062758f, -0.021179f, -0.072966f, -0.063257f, -0.064908f, -0.052257f, -0.075247f, 0.023089f, -0.047550f, 0.003457f, 0.035074f, 0.064672f, 0.036591f, 0.060531f, 0.079959f, 0.001452f, 0.023896f, 0.001724f, -0.001173f, -0.044699f, -0.005850f, -0.039782f, -0.077486f, -0.122484f, -0.068120f, -0.037408f, 0.009947f, 0.009258f, 0.072865f, 0.100967f, 0.097226f, 0.115557f, 0.016918f, 0.075812f, 0.030165f, -0.006912f, -0.071050f, -0.069785f, -0.094522f, -0.124301f, -0.084591f, -0.096341f, -0.060849f, 0.000280f, 0.029949f, 0.069081f, 0.111856f, 0.164492f, + 0.132002f, 0.119388f, 0.064826f, -0.024756f, -0.024240f, -0.064714f, -0.137317f, -0.105708f, -0.173554f, -0.114318f, -0.050456f, -0.038629f, 0.054426f, 0.104149f, 0.143039f, 0.100734f, 0.077383f, 0.046827f, 0.053689f, 0.046921f, -0.007361f, -0.054238f, -0.051443f, -0.081536f, -0.089923f, -0.071835f, -0.048881f, -0.045745f, -0.043178f, 0.019726f, 0.042418f, 0.074604f, 0.088891f, 0.072620f, 0.064132f, 0.036343f, 0.001471f, 0.001700f, 0.008460f, -0.054055f, -0.091234f, -0.037622f, -0.079649f, -0.090689f, -0.002842f, 0.022465f, 0.050673f, 0.052013f, 0.033579f, 0.054978f, 0.032281f, 0.043945f, -0.009075f, -0.001120f, -0.038472f, -0.023479f, -0.020320f, -0.025814f, -0.029082f, -0.023869f, 0.004169f, -0.010068f, 0.000325f, 0.026652f, 0.037563f, 0.023258f, 0.020735f, -0.005405f, -0.006240f, -0.000582f, -0.000256f, -0.011617f, -0.013133f, -0.002482f, -0.007638f, -0.008383f, -0.004536f, -0.000086f, -0.007981f, -0.003017f, 0.016801f, 0.005588f, 0.007925f, 0.010559f, 0.009041f, 0.003242f, 0.003092f, -0.002002f, -0.007113f, -0.010405f, -0.007478f, -0.012192f, -0.010005f, -0.002718f, 0.001906f, 0.004212f, + 0.008297f, 0.006581f, 0.006082f, 0.007901f, 0.005493f, -0.003401f, 0.001453f, 0.003179f, -0.002350f, -0.006498f, -0.006831f, -0.005556f, -0.000433f, -0.002484f, -0.003969f, -0.002462f, 0.002267f, -0.000263f, 0.002320f, 0.005971f, 0.005886f, 0.004900f, 0.002730f, 0.000436f, 0.000091f, -0.001849f, -0.001761f, -0.002943f, -0.002718f, -0.002109f, -0.001807f, -0.002960f, -0.001565f, -0.001533f, -0.001125f, 0.000863f, 0.003585f, 0.002029f, 0.003018f, 0.003437f, 0.002857f, 0.001727f, 0.000442f, -0.001098f, -0.001903f, -0.003016f, -0.002232f, -0.002526f, -0.002318f, -0.000826f, -0.000054f, -0.000940f, 0.000464f, 0.002131f, 0.002598f, 0.001692f, 0.001057f, 0.001152f, 0.001287f, -0.000295f, -0.001117f, -0.001242f, -0.001051f, -0.000964f, -0.000477f, -0.000384f, -0.000051f, 0.000083f, 0.000203f, 0.000063f, 0.000115f, 0.000097f, 0.000105f, 0.000030f, 0.000040f}, + {0.015075f, 0.009664f, 0.000295f, 0.000542f, 0.011877f, 0.002989f, -0.005872f, 0.004068f, 0.007910f, -0.003953f, -0.006517f, -0.023463f, 0.001275f, -0.007861f, 0.015716f, -0.007741f, 0.007889f, 0.006393f, -0.000801f, 0.005179f, 0.008701f, 0.002424f, 0.002045f, -0.004230f, -0.005149f, -0.003944f, -0.006493f, 0.005727f, 0.003392f, -0.003012f, 0.005120f, -0.003473f, -0.005191f, -0.006148f, -0.002989f, -0.004843f, 0.000426f, 0.000143f, -0.000907f, 0.010820f, -0.006215f, 0.008864f, -0.003173f, -0.002169f, 0.005910f, -0.003589f, 0.001850f, -0.003588f, 0.006478f, -0.001840f, -0.018369f, 0.005535f, 0.000646f, 0.002327f, 0.009244f, 0.004849f, 0.000669f, -0.002023f, -0.006074f, 0.015803f, -0.008317f, 0.006192f, 0.003203f, -0.006431f, 0.006623f, 0.003024f, -0.007687f, 0.006173f, -0.007929f, 0.000531f, -0.000820f, 0.007015f, 0.001142f, 0.007330f, -0.002796f, -0.016152f, -0.003473f, -0.003838f, -0.007712f, -0.006829f, -0.006844f, 0.005683f, 0.002467f, 0.002044f, 0.003403f, 0.003480f, 0.000677f, 0.001694f, -0.001902f, 0.001220f, -0.001404f, -0.000560f, -0.003963f, 0.000032f, -0.001317f, 0.003088f, + -0.000294f, -0.000864f, -0.000607f, 0.000406f, -0.002055f, 0.000793f, -0.000893f, 0.001202f, -0.000657f, 0.000297f, -0.002369f, -0.000202f, -0.002960f, -0.001726f, -0.001690f, 0.002500f, 0.028482f, -0.014248f, 0.001457f, -0.000985f, -0.000964f, 0.006378f, -0.005276f, -0.020674f, -0.019063f, 0.008779f, -0.006120f, -0.001889f, 0.004704f, 0.000914f, 0.004641f, 0.005190f, -0.009152f, 0.004733f, 0.003228f, -0.006530f, 0.007344f, 0.011126f, -0.007494f, -0.002563f, 0.000420f, -0.012306f, -0.005639f, 0.001076f, 0.014385f, -0.002495f, -0.000964f, -0.012263f, 0.007017f, -0.000149f, -0.011011f, -0.004799f, 0.003625f, -0.001807f, 0.001957f, -0.009554f, -0.000381f, 0.000479f, -0.003985f, 0.009874f, 0.002383f, 0.002089f, 0.009536f, -0.001174f, 0.012431f, -0.004398f, -0.016166f, 0.006299f, 0.006104f, -0.005803f, -0.002619f, -0.002132f, 0.001825f, 0.000546f, 0.004299f, -0.003838f, 0.002790f, -0.008902f, -0.000554f, 0.005565f, -0.008513f, -0.001152f, 0.004751f, 0.001390f, -0.004529f, 0.002704f, -0.003469f, 0.000735f, 0.008034f, 0.002780f, -0.011425f, 0.013517f, 0.004977f, 0.004874f, -0.001327f, 0.007714f, + 0.008589f, -0.003953f, -0.000697f, 0.001784f, 0.002095f, 0.002594f, 0.003538f, -0.000521f, 0.000153f, 0.002607f, -0.000544f, 0.000254f, 0.001575f, 0.004125f, -0.000833f, 0.004204f, -0.000312f, 0.000910f, 0.002075f, 0.000446f, -0.001406f, -0.000492f, 0.001373f, 0.001342f, -0.000400f, -0.002073f, -0.006908f, -0.016686f, -0.001991f, 0.001798f, 0.018424f, -0.007017f, 0.015791f, 0.003960f, -0.000535f, 0.000980f, 0.014128f, -0.003283f, -0.003861f, -0.004087f, 0.009959f, 0.020222f, 0.005300f, -0.013942f, -0.018917f, -0.026917f, 0.003532f, -0.007031f, -0.011313f, -0.006211f, -0.017543f, -0.000083f, -0.008139f, 0.001324f, 0.008431f, 0.008876f, -0.010000f, -0.008960f, -0.006359f, 0.001126f, -0.014883f, -0.001624f, 0.004636f, -0.006742f, -0.002448f, 0.001565f, 0.006011f, -0.008365f, 0.002192f, 0.019681f, -0.000807f, -0.000955f, -0.007245f, 0.008197f, -0.003642f, 0.000725f, 0.006265f, 0.008151f, 0.012117f, -0.001933f, 0.001797f, -0.003647f, -0.000153f, -0.002069f, 0.001612f, 0.018909f, -0.020998f, 0.000470f, 0.004095f, 0.011173f, -0.004636f, -0.005560f, -0.001224f, -0.005249f, 0.015119f, -0.008323f, + -0.019792f, -0.001371f, -0.005898f, -0.008291f, 0.004928f, -0.019602f, 0.007255f, -0.002097f, -0.005432f, 0.000396f, 0.013855f, -0.004102f, -0.005196f, -0.005340f, 0.006647f, -0.006224f, -0.001679f, 0.001169f, -0.000558f, 0.002389f, 0.000230f, 0.000934f, 0.004119f, 0.000335f, 0.001084f, -0.001027f, 0.003313f, 0.000728f, -0.000649f, -0.003726f, -0.001994f, -0.000280f, -0.001949f, 0.003832f, 0.002342f, -0.002184f, 0.002867f, 0.000290f, 0.000431f, -0.002030f, 0.001074f, -0.000891f, 0.000097f, 0.000990f, -0.030754f, 0.011484f, -0.009623f, 0.012889f, -0.011590f, -0.001050f, 0.008916f, -0.017784f, -0.003063f, 0.005425f, -0.004851f, 0.025917f, -0.010884f, -0.003280f, -0.010384f, -0.008669f, 0.013302f, 0.014812f, 0.005718f, -0.017439f, -0.021069f, 0.019476f, 0.003251f, -0.019727f, 0.007356f, 0.000731f, 0.009321f, -0.005847f, 0.008892f, -0.011801f, 0.005738f, 0.019065f, 0.007857f, 0.008170f, 0.004309f, 0.000340f, -0.004872f, 0.003988f, 0.001467f, -0.012999f, 0.000198f, -0.004118f, -0.009575f, -0.009529f, -0.003642f, 0.007538f, -0.013734f, 0.001878f, -0.009942f, -0.001012f, -0.001538f, 0.004532f, + 0.008112f, 0.017227f, 0.006059f, -0.000094f, 0.007379f, -0.009199f, -0.013567f, -0.000236f, 0.003133f, 0.001414f, 0.016342f, -0.003717f, -0.002023f, -0.005226f, -0.002337f, 0.002334f, 0.007925f, -0.002149f, 0.003300f, -0.008111f, 0.013220f, -0.003467f, -0.004650f, -0.003048f, 0.004268f, -0.007179f, 0.000202f, 0.008200f, -0.000607f, -0.002340f, 0.001187f, 0.006518f, 0.005102f, -0.001002f, 0.004108f, -0.003508f, 0.002591f, -0.002116f, 0.000992f, 0.004673f, -0.001668f, 0.002007f, 0.001956f, -0.003162f, 0.003164f, 0.001973f, 0.000684f, -0.001345f, -0.002919f, -0.000672f, 0.003541f, 0.002396f, -0.001276f, 0.001458f, -0.000724f, 0.005879f, -0.000562f, -0.001609f, -0.015372f, -0.003587f, -0.009978f, -0.001019f, 0.020415f, 0.013049f, 0.009117f, -0.001552f, -0.017969f, 0.002507f, -0.011824f, -0.019046f, -0.006323f, 0.013707f, -0.010758f, -0.016888f, 0.004411f, 0.001449f, -0.008414f, 0.001804f, 0.009610f, 0.002647f, -0.022511f, -0.006380f, 0.014145f, 0.016663f, 0.008309f, -0.018656f, -0.006769f, 0.008501f, -0.003180f, -0.004017f, 0.001209f, 0.006245f, 0.001004f, 0.002308f, 0.019143f, 0.000036f, + 0.011579f, 0.008975f, -0.000148f, -0.008621f, -0.000212f, -0.005087f, 0.011413f, -0.006528f, -0.010890f, 0.000025f, 0.017908f, 0.001004f, 0.017790f, 0.009588f, 0.001725f, 0.011494f, -0.001939f, 0.024699f, 0.001993f, 0.012219f, 0.013921f, 0.001288f, -0.011511f, -0.001767f, -0.013772f, 0.007029f, -0.009869f, -0.005536f, -0.009100f, -0.006002f, -0.004367f, 0.004520f, 0.001529f, 0.006805f, -0.000282f, -0.007869f, -0.006849f, 0.002558f, 0.012724f, -0.003771f, 0.003148f, -0.013657f, 0.004328f, 0.011799f, 0.018118f, -0.006242f, -0.001348f, 0.002999f, -0.006229f, -0.000473f, 0.005982f, -0.001834f, 0.010989f, 0.000723f, 0.002502f, 0.000274f, 0.000524f, 0.004052f, -0.002676f, -0.001741f, -0.001426f, -0.000827f, 0.001112f, 0.001360f, -0.002067f, 0.001797f, -0.000628f, -0.002193f, -0.002668f, 0.000905f, -0.002532f, -0.001670f, -0.003176f, 0.001548f, 0.002205f, -0.000460f, 0.006200f, -0.004018f, 0.001096f, -0.000437f, -0.003509f, 0.005899f, -0.001698f, -0.000836f, -0.003080f, 0.003349f, 0.002209f, -0.000539f, 0.000899f, 0.002955f, 0.018641f, -0.027836f, -0.005123f, 0.023328f, -0.011570f, 0.004271f, + -0.017990f, 0.007934f, 0.032815f, -0.004432f, 0.001740f, -0.001382f, -0.023174f, 0.001877f, -0.001471f, 0.034819f, -0.010981f, -0.001699f, 0.015224f, -0.009591f, 0.021583f, -0.014545f, -0.002168f, -0.021993f, 0.024875f, 0.000345f, -0.009781f, 0.000318f, 0.009117f, -0.011562f, 0.017296f, -0.001838f, 0.015330f, -0.000109f, 0.008034f, -0.024041f, -0.015466f, -0.011217f, -0.003597f, 0.014493f, -0.021780f, 0.011647f, 0.009007f, 0.003039f, -0.009013f, -0.013138f, 0.029966f, 0.005951f, -0.003389f, 0.011621f, -0.010577f, 0.006299f, -0.014084f, -0.013842f, -0.005760f, -0.009295f, 0.032363f, 0.009661f, -0.006420f, -0.009618f, -0.012334f, 0.010169f, 0.008411f, 0.003057f, -0.011375f, -0.001394f, -0.004603f, 0.013821f, 0.001259f, 0.011179f, -0.026117f, 0.014207f, -0.002281f, 0.000698f, -0.002897f, 0.004592f, -0.011522f, -0.005367f, -0.018108f, -0.005936f, 0.006603f, 0.011050f, 0.011697f, 0.004317f, 0.004271f, 0.002724f, -0.006471f, 0.003860f, 0.002674f, -0.000487f, -0.004334f, -0.007241f, 0.003880f, 0.003604f, -0.005512f, 0.002845f, 0.000411f, -0.004572f, 0.003016f, 0.000822f, -0.001930f, -0.001092f, + 0.000314f, 0.000875f, -0.003335f, 0.002324f, 0.001322f, -0.005268f, -0.001195f, -0.002713f, 0.000465f, 0.003684f, 0.002579f, -0.000575f, 0.000199f, -0.002460f, 0.005912f, 0.000481f, -0.002016f, 0.011983f, 0.005997f, 0.009910f, 0.003065f, 0.000300f, -0.003511f, -0.014730f, -0.004456f, -0.009437f, 0.006051f, -0.000380f, 0.022603f, -0.018668f, -0.024100f, -0.005970f, 0.007722f, -0.007413f, -0.005716f, 0.019242f, 0.003983f, -0.010396f, -0.012004f, -0.012452f, 0.021018f, -0.010382f, 0.014251f, -0.006670f, 0.015577f, -0.015268f, 0.003527f, 0.023830f, 0.008248f, -0.032168f, 0.007567f, 0.000848f, -0.004008f, -0.002757f, 0.003442f, -0.003742f, 0.003261f, -0.005156f, 0.002710f, -0.001199f, -0.014311f, 0.014568f, 0.014950f, -0.004310f, 0.016547f, -0.013905f, -0.002310f, -0.003927f, -0.006557f, 0.018193f, -0.012897f, -0.022952f, -0.012808f, 0.004449f, -0.018693f, -0.017414f, -0.008645f, -0.005807f, -0.011932f, -0.000893f, 0.015546f, 0.016365f, 0.002605f, 0.017634f, 0.005596f, 0.002465f, 0.013397f, -0.014092f, -0.002379f, 0.000119f, -0.011554f, -0.000001f, -0.011189f, 0.013797f, -0.003813f, -0.002382f, + 0.011498f, -0.001971f, -0.003462f, -0.002237f, 0.013705f, -0.001545f, 0.004864f, -0.013109f, -0.004569f, 0.007514f, -0.008458f, 0.000747f, 0.000362f, 0.001587f, -0.006416f, -0.004401f, -0.003318f, 0.000333f, -0.003459f, -0.004143f, 0.001488f, -0.000532f, -0.003711f, -0.001562f, 0.000626f, -0.000286f, -0.001069f, -0.001181f, -0.002082f, 0.000825f, -0.006976f, -0.004821f, -0.004657f, -0.004615f, 0.000188f, -0.000145f, -0.001558f, 0.001852f, -0.003514f, 0.035885f, -0.017893f, -0.017231f, 0.011480f, 0.029140f, 0.005578f, 0.026231f, 0.014931f, 0.023810f, 0.010496f, -0.004600f, -0.010973f, 0.008446f, -0.017993f, -0.013735f, 0.019870f, 0.016577f, 0.041635f, -0.001206f, 0.005709f, -0.015591f, 0.016024f, 0.007170f, -0.018696f, -0.004545f, 0.023545f, -0.000213f, -0.026133f, -0.010657f, -0.014786f, -0.005127f, 0.014441f, 0.013204f, -0.009961f, -0.004930f, 0.018039f, -0.017699f, 0.007985f, 0.015127f, 0.018171f, -0.009882f, 0.015633f, -0.006778f, -0.023793f, 0.008239f, 0.021706f, -0.005963f, 0.006221f, 0.005181f, -0.007445f, 0.002525f, 0.006464f, -0.006904f, 0.002371f, 0.017500f, -0.010439f, -0.005621f, + 0.016222f, -0.003626f, -0.003339f, -0.027122f, -0.009600f, -0.016429f, -0.026827f, -0.018169f, 0.013402f, -0.008910f, -0.011489f, 0.023074f, 0.023165f, -0.005987f, 0.024920f, 0.009880f, 0.016363f, -0.004727f, -0.012933f, 0.010666f, -0.013409f, -0.026853f, -0.016127f, -0.006990f, 0.013169f, 0.005968f, 0.022092f, 0.003791f, -0.004783f, -0.003695f, -0.000024f, 0.003726f, -0.006886f, 0.000335f, -0.004003f, -0.000688f, 0.003876f, -0.000779f, 0.000620f, 0.007048f, -0.002598f, -0.001400f, 0.007113f, -0.005331f, -0.002671f, -0.003565f, 0.002110f, -0.003963f, 0.002605f, 0.001492f, 0.001123f, 0.003647f, 0.004799f, 0.002080f, 0.008651f, 0.000966f, 0.005922f, 0.001922f, 0.004459f, 0.005011f, -0.004447f, 0.003974f, 0.004385f, -0.003222f, -0.000943f, -0.000522f, -0.006218f, 0.001734f, -0.003211f, -0.018189f, -0.019459f, 0.026324f, -0.004405f, 0.060154f, -0.024797f, -0.011660f, -0.001402f, 0.014674f, -0.008410f, -0.008200f, -0.024808f, -0.028682f, 0.012931f, 0.002489f, 0.039569f, 0.012828f, -0.004065f, -0.004517f, 0.026276f, 0.026853f, -0.022209f, 0.016121f, -0.021217f, 0.005580f, -0.009153f, -0.010916f, + -0.006531f, 0.004520f, -0.003475f, 0.013957f, 0.006962f, 0.015617f, -0.001973f, -0.007434f, -0.014681f, -0.002823f, 0.017026f, 0.001543f, -0.022690f, -0.002834f, 0.005484f, -0.009659f, 0.017921f, 0.015188f, 0.003125f, 0.005300f, -0.049513f, -0.018930f, 0.017262f, -0.001132f, 0.027743f, 0.007781f, 0.031275f, -0.003486f, -0.016967f, 0.016750f, -0.009501f, 0.011438f, 0.002003f, 0.045646f, 0.037689f, 0.004491f, 0.010646f, -0.006176f, 0.014973f, 0.015953f, 0.017178f, 0.018642f, 0.030224f, -0.000509f, 0.005407f, -0.011549f, -0.010127f, 0.009525f, -0.014168f, -0.035031f, -0.026037f, -0.000557f, 0.021771f, -0.010944f, -0.019862f, -0.011343f, -0.010720f, -0.001131f, -0.023709f, -0.000894f, 0.004382f, -0.000100f, -0.003209f, -0.002269f, 0.002441f, 0.005180f, -0.000661f, 0.003922f, -0.017708f, -0.010784f, -0.005665f, -0.012478f, 0.001096f, -0.004463f, -0.007324f, -0.004847f, -0.002995f, 0.007235f, 0.002915f, -0.006650f, 0.002187f, 0.015920f, 0.008142f, -0.003273f, -0.005662f, -0.007139f, -0.004210f, -0.005738f, -0.012405f, 0.004633f, -0.004793f, -0.000915f, 0.008987f, 0.003026f, -0.001792f, 0.001819f, + 0.003446f, -0.052182f, 0.041260f, -0.001138f, 0.004734f, -0.014421f, 0.023152f, -0.049541f, -0.031742f, -0.009976f, -0.012690f, -0.001155f, -0.044416f, 0.008749f, 0.000956f, -0.001149f, -0.020261f, -0.020619f, 0.008452f, 0.028378f, 0.004432f, -0.037766f, -0.008153f, -0.030915f, 0.024500f, 0.015831f, 0.001271f, -0.013663f, -0.006443f, -0.006953f, 0.020196f, -0.002828f, -0.000367f, -0.004319f, -0.027354f, 0.014283f, 0.019244f, -0.011438f, -0.006094f, 0.014985f, -0.029780f, -0.021684f, -0.032860f, -0.011101f, 0.008313f, -0.020937f, -0.009985f, -0.000846f, -0.034033f, 0.010459f, 0.021051f, 0.037251f, 0.005390f, -0.003647f, 0.002317f, -0.024422f, -0.019159f, 0.028529f, -0.002003f, -0.010783f, -0.006703f, -0.043562f, -0.023373f, 0.008579f, -0.009190f, -0.005042f, -0.003379f, 0.028576f, -0.004929f, -0.027073f, 0.002193f, 0.021169f, -0.000529f, -0.013260f, -0.000249f, 0.001499f, -0.011194f, -0.018977f, 0.014949f, -0.034925f, -0.017297f, -0.000225f, 0.016905f, -0.021336f, 0.013520f, 0.008987f, 0.012317f, 0.013152f, -0.013426f, -0.003366f, 0.016098f, 0.003107f, -0.009849f, 0.009262f, 0.013318f, -0.012436f, + 0.004620f, 0.011971f, 0.011275f, 0.017749f, 0.001180f, -0.005407f, -0.003049f, 0.002919f, 0.000220f, 0.007803f, 0.006545f, 0.000607f, -0.001641f, -0.005663f, -0.001958f, 0.003900f, 0.007885f, -0.013115f, 0.001660f, -0.002500f, 0.005394f, 0.012635f, 0.000591f, 0.008842f, -0.004764f, 0.005864f, 0.007197f, 0.010641f, 0.008271f, 0.010379f, -0.000817f, 0.005944f, -0.001967f, 0.004524f, 0.027104f, 0.024839f, 0.008674f, 0.042469f, -0.019771f, -0.009527f, 0.006441f, -0.011823f, -0.003846f, 0.013494f, 0.045569f, -0.007995f, 0.008845f, -0.000848f, -0.003349f, -0.001324f, 0.050321f, -0.025196f, 0.025872f, -0.000838f, -0.033834f, 0.010480f, -0.033563f, -0.020778f, 0.018617f, -0.017992f, 0.013034f, 0.000155f, 0.001350f, 0.022203f, 0.017772f, -0.027965f, -0.031515f, -0.023908f, -0.008283f, 0.008298f, 0.008504f, 0.002767f, 0.005692f, -0.037886f, 0.005262f, -0.020615f, -0.047429f, 0.031405f, -0.009694f, 0.029494f, 0.031715f, 0.001263f, 0.011574f, -0.017770f, -0.021358f, -0.037599f, 0.008062f, 0.033314f, 0.005548f, -0.015496f, 0.001572f, -0.008104f, 0.004765f, -0.020538f, -0.016739f, -0.020511f, + 0.003005f, -0.003028f, -0.006926f, 0.021240f, 0.019226f, 0.011216f, 0.031407f, 0.002967f, -0.033913f, 0.042655f, -0.032033f, -0.010351f, -0.008349f, -0.008985f, 0.035839f, -0.006416f, -0.052349f, 0.043555f, -0.017674f, -0.011194f, 0.011693f, 0.010584f, 0.033631f, 0.021115f, 0.013840f, 0.016012f, 0.014635f, 0.010748f, 0.000243f, 0.013665f, 0.016787f, 0.003933f, -0.000175f, 0.017785f, -0.003678f, 0.001503f, -0.017332f, -0.004707f, -0.005799f, -0.009439f, 0.001007f, -0.002011f, 0.010700f, 0.007439f, 0.002895f, -0.002032f, 0.004943f, 0.001656f, 0.003491f, 0.006841f, -0.002726f, -0.003527f, 0.001157f, -0.003487f, 0.005163f, 0.001946f, 0.002187f, 0.003765f, 0.002130f, 0.016344f, 0.012010f, 0.002881f, 0.003027f, 0.039015f, 0.044144f, 0.010001f, -0.084200f, 0.002629f, 0.023282f, -0.028050f, 0.016455f, 0.033148f, 0.001257f, 0.008740f, 0.020775f, 0.015913f, 0.005927f, 0.029771f, 0.006452f, -0.004525f, 0.056215f, 0.020721f, 0.007028f, 0.024135f, -0.019069f, 0.029688f, -0.021393f, -0.002154f, -0.002731f, -0.007252f, -0.031390f, 0.010095f, -0.022310f, 0.040018f, -0.003940f, -0.008231f, + 0.058928f, 0.007618f, 0.008328f, 0.019429f, 0.001898f, 0.011077f, -0.013634f, -0.026122f, -0.003274f, 0.017147f, -0.030924f, 0.035218f, 0.031715f, 0.023373f, 0.005868f, 0.013807f, -0.021473f, -0.022236f, -0.035172f, -0.015661f, -0.019134f, -0.018182f, 0.007956f, -0.003646f, -0.034453f, -0.015393f, 0.029672f, -0.000767f, -0.028484f, 0.015707f, -0.001898f, -0.019421f, -0.046042f, 0.002944f, -0.069608f, 0.040030f, -0.023927f, 0.036393f, 0.001427f, 0.009988f, 0.000847f, -0.013833f, 0.018071f, 0.061720f, 0.005330f, 0.017441f, -0.011193f, -0.048485f, 0.003915f, -0.005415f, 0.034958f, 0.020361f, -0.008685f, -0.001901f, -0.007686f, -0.004006f, 0.011636f, -0.014001f, 0.010899f, -0.001806f, -0.012524f, -0.012404f, 0.012660f, -0.015148f, -0.015137f, -0.020929f, -0.004585f, -0.015089f, 0.004302f, 0.012910f, 0.000494f, -0.003926f, -0.010082f, 0.018932f, -0.018288f, 0.004569f, 0.001922f, 0.001478f, -0.010900f, 0.007470f, 0.018374f, -0.000948f, -0.009729f, -0.002392f, 0.016728f, 0.017672f, -0.014644f, 0.016921f, -0.001628f, -0.004540f, 0.002318f, -0.001182f, 0.018453f, 0.004809f, -0.010437f, -0.008889f, + -0.000491f, 0.002024f, 0.010654f, 0.023522f, 0.017603f, 0.046079f, -0.062378f, 0.025173f, -0.036371f, 0.031757f, -0.015213f, -0.025967f, -0.007179f, -0.029968f, -0.012394f, -0.006378f, 0.011346f, 0.014392f, -0.008495f, 0.044278f, -0.001701f, -0.007157f, -0.005534f, -0.039347f, -0.004049f, 0.000564f, -0.033100f, 0.011126f, -0.028183f, -0.035554f, -0.011307f, 0.022052f, -0.059220f, -0.040018f, -0.026701f, 0.003467f, -0.041441f, -0.035055f, -0.028427f, -0.014028f, -0.011361f, -0.005078f, -0.027933f, 0.030562f, 0.005440f, -0.002534f, -0.020793f, -0.021250f, 0.041037f, -0.035084f, -0.024026f, 0.011119f, 0.011108f, 0.015060f, -0.020386f, -0.028266f, -0.011887f, -0.004918f, 0.013564f, -0.020185f, -0.008058f, -0.008021f, -0.024389f, -0.041520f, -0.052803f, 0.050551f, -0.054728f, -0.002643f, 0.004082f, -0.009173f, -0.009970f, -0.048698f, 0.019201f, -0.011365f, -0.051340f, -0.000765f, -0.011143f, 0.048901f, 0.012172f, 0.034922f, 0.032996f, -0.009367f, 0.013012f, -0.004982f, -0.009224f, 0.024694f, -0.005990f, 0.014369f, -0.018471f, 0.001873f, -0.018611f, 0.016421f, 0.012637f, 0.002706f, 0.011570f, -0.004471f, + -0.001669f, 0.012565f, 0.005909f, -0.011437f, 0.008880f, 0.020222f, -0.002963f, 0.004999f, -0.010689f, -0.024907f, -0.002594f, -0.001796f, -0.000783f, -0.017157f, -0.003765f, 0.003250f, -0.002501f, -0.008942f, 0.012051f, -0.001767f, -0.006757f, -0.020071f, -0.020730f, 0.000743f, 0.011408f, 0.007152f, 0.004413f, -0.000951f, 0.014946f, 0.017407f, -0.007624f, 0.004101f, 0.004095f, -0.000687f, 0.005036f, 0.012771f, -0.055667f, 0.064851f, 0.010432f, 0.006740f, -0.011019f, 0.033048f, 0.000585f, 0.054275f, -0.014563f, 0.037314f, 0.020150f, -0.053050f, 0.023261f, 0.008994f, 0.025455f, -0.004102f, -0.014052f, -0.020967f, -0.007677f, 0.026296f, 0.057418f, 0.006330f, -0.008249f, -0.035971f, 0.013801f, -0.038922f, -0.006092f, 0.039854f, -0.035643f, 0.000352f, 0.002612f, -0.005870f, -0.013401f, -0.014898f, 0.063578f, -0.013400f, -0.015516f, -0.007374f, 0.014473f, 0.021629f, 0.008049f, 0.001391f, -0.012880f, 0.000159f, 0.009555f, 0.038929f, -0.008811f, 0.055549f, 0.032295f, 0.016816f, -0.013237f, 0.048484f, 0.054690f, -0.004110f, -0.014463f, -0.002463f, -0.017757f, 0.005853f, -0.017589f, 0.027997f, + 0.009401f, 0.040160f, 0.030699f, -0.048209f, -0.054820f, 0.066198f, 0.048848f, 0.008223f, -0.009310f, -0.025606f, -0.036121f, -0.013633f, 0.037004f, -0.034343f, -0.037713f, -0.004804f, -0.010192f, -0.059782f, -0.013452f, 0.013918f, -0.023380f, 0.003773f, -0.000171f, 0.003751f, 0.004885f, 0.010595f, -0.017797f, -0.010380f, -0.018292f, -0.006027f, -0.000097f, 0.003309f, -0.009990f, -0.004130f, -0.001780f, -0.029131f, -0.009924f, -0.013533f, -0.006569f, -0.000144f, 0.002617f, 0.001895f, 0.004969f, -0.001243f, 0.001088f, -0.014974f, 0.008996f, -0.012784f, -0.015583f, 0.011794f, 0.004748f, -0.027186f, -0.003044f, -0.007995f, 0.013767f, 0.027353f, 0.000567f, -0.021914f, 0.018198f, -0.004397f, 0.004755f, 0.007168f, -0.007369f, -0.004498f, 0.001661f, -0.011294f, -0.015995f, 0.029106f, -0.022956f, -0.007106f, -0.004442f, 0.006147f, 0.001395f, -0.034751f, -0.101622f, 0.051660f, -0.048608f, 0.020511f, 0.073376f, 0.011627f, -0.030035f, 0.021531f, 0.025906f, -0.010104f, -0.022594f, -0.004298f, -0.049796f, 0.017111f, -0.051774f, -0.031255f, 0.021508f, 0.002667f, 0.009569f, -0.046746f, -0.009101f, -0.033604f, + -0.028440f, -0.041581f, -0.014169f, 0.014917f, -0.024543f, -0.024938f, 0.025249f, 0.003919f, -0.001552f, 0.008366f, -0.047882f, -0.002478f, -0.037121f, 0.032736f, 0.009419f, -0.091642f, 0.023736f, 0.049882f, -0.010024f, 0.029958f, 0.025321f, 0.017230f, 0.013947f, 0.047661f, 0.037510f, 0.001859f, -0.033216f, -0.006642f, 0.037910f, 0.024748f, -0.030744f, 0.002746f, -0.036001f, -0.011283f, 0.003008f, 0.027000f, 0.036035f, -0.064685f, -0.050996f, -0.028358f, 0.006035f, -0.018886f, -0.006617f, 0.061127f, 0.010528f, 0.014846f, 0.047779f, -0.018677f, 0.010302f, -0.011561f, 0.048881f, -0.024112f, 0.002539f, 0.005305f, 0.036364f, -0.009486f, -0.003229f, 0.013589f, 0.015267f, -0.001379f, 0.007752f, 0.023867f, 0.001516f, -0.000248f, -0.000371f, 0.023252f, -0.010946f, -0.006889f, 0.006072f, 0.010336f, 0.007285f, 0.003487f, 0.011337f, -0.004510f, 0.000648f, -0.009940f, 0.000312f, -0.007274f, -0.000541f, -0.010198f, 0.018071f, -0.012692f, -0.018735f, 0.018733f, 0.012602f, 0.013044f, -0.013034f, -0.017103f, 0.000619f, -0.031052f, -0.008013f, -0.015781f, -0.015878f, 0.006873f, 0.000457f, -0.016361f, + 0.006297f, 0.007301f, -0.001213f, -0.009501f, -0.008957f, 0.007765f, 0.005210f, 0.015468f, 0.033833f, 0.032702f, -0.057029f, 0.011932f, -0.012287f, -0.014998f, -0.013257f, 0.038259f, 0.020314f, -0.027902f, -0.015928f, 0.029199f, -0.052461f, 0.002983f, 0.019077f, 0.029257f, -0.006238f, 0.006484f, -0.061224f, -0.000218f, -0.027129f, 0.020490f, 0.007515f, 0.033991f, -0.053850f, -0.027140f, -0.007847f, 0.006662f, -0.004651f, 0.010538f, 0.003832f, 0.029392f, 0.055329f, -0.035016f, -0.045292f, 0.011957f, -0.047200f, -0.013877f, 0.019731f, -0.034260f, -0.033344f, 0.002818f, 0.020499f, 0.028850f, 0.020415f, -0.012832f, -0.002928f, -0.060025f, -0.040533f, 0.053373f, -0.037045f, 0.072032f, -0.030560f, 0.014703f, 0.010505f, -0.000519f, -0.052943f, 0.066334f, -0.030911f, -0.006232f, -0.011958f, 0.025930f, 0.049886f, -0.050452f, -0.028760f, 0.059327f, -0.043914f, -0.000044f, -0.016602f, 0.012154f, 0.068571f, 0.000426f, -0.005089f, -0.042415f, 0.052442f, -0.017065f, 0.013607f, 0.017393f, -0.033234f, -0.039987f, 0.003873f, 0.023127f, -0.012024f, 0.011873f, -0.095007f, -0.044250f, -0.013637f, -0.048388f, + -0.023919f, 0.008133f, 0.031428f, -0.006590f, -0.008686f, -0.024720f, 0.000610f, -0.002320f, -0.018145f, -0.006202f, 0.011067f, 0.000972f, 0.014846f, 0.007028f, 0.014067f, -0.018630f, -0.002708f, -0.003874f, 0.019586f, 0.015581f, -0.011823f, 0.036066f, 0.013237f, -0.014470f, 0.021801f, 0.006026f, -0.002208f, -0.011378f, 0.008221f, -0.008223f, -0.007796f, 0.016134f, 0.001321f, -0.007054f, -0.006392f, 0.013527f, -0.003794f, 0.012232f, -0.002833f, 0.022226f, 0.004568f, 0.003256f, -0.009009f, -0.006552f, -0.008061f, -0.002936f, 0.002671f, 0.032508f, -0.037632f, 0.010162f, 0.030706f, 0.030354f, 0.069207f, -0.044424f, 0.063552f, -0.011508f, -0.042056f, -0.041164f, 0.010244f, 0.026394f, -0.018742f, -0.008797f, -0.029033f, -0.012105f, 0.053807f, -0.038411f, -0.003802f, 0.043212f, -0.014313f, 0.025687f, -0.017616f, -0.008539f, 0.045841f, -0.001889f, 0.002093f, 0.044224f, 0.030573f, 0.010631f, -0.005738f, 0.037310f, 0.051023f, -0.052523f, 0.047935f, -0.046427f, 0.024165f, -0.033590f, 0.006709f, 0.039467f, 0.013329f, -0.090504f, 0.039799f, 0.025348f, -0.000557f, 0.045474f, -0.071889f, -0.014110f, + 0.048454f, 0.041186f, 0.006677f, 0.064883f, -0.034919f, 0.000479f, -0.008589f, -0.010348f, 0.027696f, 0.011271f, 0.048568f, 0.040402f, -0.030768f, 0.026710f, -0.056903f, -0.017837f, 0.004279f, -0.003173f, -0.004652f, -0.009503f, -0.088918f, -0.049220f, -0.068734f, -0.046793f, 0.050668f, -0.031967f, -0.007930f, 0.005517f, 0.083119f, -0.020250f, -0.029620f, 0.066618f, 0.040727f, -0.002260f, 0.053923f, 0.007904f, 0.010009f, -0.025652f, -0.000149f, -0.021512f, -0.022643f, -0.011864f, 0.017315f, -0.021746f, -0.011448f, 0.010040f, 0.003745f, 0.016437f, -0.006965f, -0.003164f, 0.021412f, 0.012267f, 0.001049f, -0.017495f, -0.014084f, -0.002480f, -0.005568f, 0.012547f, 0.021365f, -0.001958f, 0.003609f, 0.004650f, -0.008985f, 0.053471f, 0.016402f, 0.003475f, 0.001940f, -0.017951f, 0.014092f, -0.031804f, -0.002555f, 0.026749f, -0.002110f, -0.007526f, 0.019437f, 0.010898f, 0.005809f, -0.000828f, -0.017755f, 0.011317f, 0.012523f, 0.003855f, 0.006758f, 0.009018f, -0.006326f, 0.006892f, -0.021479f, 0.022201f, 0.055812f, -0.029652f, 0.022010f, 0.027910f, -0.038906f, 0.005816f, -0.048019f, 0.019279f, + -0.004434f, -0.025295f, 0.039438f, 0.001842f, 0.061085f, -0.002999f, -0.044331f, 0.077011f, -0.012915f, 0.008304f, 0.011345f, -0.070946f, 0.022383f, 0.062333f, 0.022814f, -0.026134f, -0.046068f, 0.005550f, 0.012282f, 0.053389f, 0.034857f, -0.016531f, -0.009396f, -0.040425f, 0.001264f, 0.060310f, -0.080207f, 0.025259f, 0.057581f, -0.050357f, 0.019619f, 0.005939f, 0.020566f, 0.060315f, 0.020852f, 0.023668f, -0.010118f, -0.057967f, 0.061619f, -0.010636f, -0.030062f, 0.127849f, 0.063568f, 0.033081f, 0.006551f, 0.003506f, -0.058875f, -0.048475f, -0.021259f, 0.038016f, -0.000248f, -0.034125f, -0.023489f, 0.047789f, -0.027771f, 0.033104f, 0.019501f, -0.022695f, 0.035790f, 0.016502f, -0.049311f, -0.024573f, -0.028465f, 0.008899f, 0.032663f, -0.062445f, 0.021859f, -0.064000f, -0.080472f, -0.050731f, 0.079445f, -0.026476f, 0.017361f, -0.017717f, -0.025996f, -0.003321f, -0.031199f, -0.021867f, -0.016031f, 0.004578f, -0.029823f, 0.004240f, 0.019457f, 0.000557f, -0.026071f, -0.019729f, 0.010855f, 0.003674f, 0.036076f, 0.005245f, -0.038685f, -0.014965f, -0.021588f, 0.033439f, -0.005323f, -0.012708f, + -0.030284f, 0.000178f, 0.020413f, 0.009262f, 0.023086f, -0.010389f, -0.002117f, 0.006998f, 0.023533f, 0.014653f, 0.000879f, -0.011921f, 0.017950f, -0.014727f, -0.000053f, 0.009517f, -0.012702f, 0.000228f, 0.026287f, -0.000187f, 0.006223f, -0.026522f, -0.017420f, -0.020028f, 0.013999f, -0.021342f, -0.005058f, 0.077239f, 0.129248f, -0.022384f, -0.005053f, -0.107284f, -0.036485f, -0.079068f, -0.052956f, 0.071923f, 0.004435f, 0.019040f, -0.061041f, 0.018868f, -0.053681f, -0.119924f, 0.016682f, 0.056610f, -0.005423f, 0.006741f, 0.060985f, -0.082423f, 0.092644f, 0.045859f, 0.028457f, -0.046907f, 0.062079f, 0.120342f, -0.024716f, 0.036761f, 0.091230f, 0.076952f, 0.136265f, 0.029127f, 0.048520f, 0.036641f, 0.032713f, 0.116992f, -0.031202f, -0.014556f, 0.042751f, 0.025178f, -0.013353f, 0.064115f, 0.003337f, 0.013083f, -0.038918f, -0.105541f, 0.003548f, 0.069571f, 0.010157f, 0.041965f, -0.076296f, 0.004258f, -0.101271f, -0.000241f, -0.108783f, 0.007048f, 0.075536f, -0.010025f, -0.032720f, -0.103656f, 0.134875f, 0.024237f, 0.008691f, 0.139782f, -0.002050f, -0.032330f, -0.023993f, 0.006951f, + 0.027708f, -0.008004f, 0.000201f, -0.011357f, -0.074361f, 0.043691f, 0.016806f, -0.046639f, -0.028692f, 0.036498f, -0.044964f, -0.077641f, -0.037988f, 0.016698f, 0.073923f, -0.077692f, 0.061544f, -0.003211f, 0.032798f, -0.013715f, 0.026777f, -0.018748f, -0.002778f, 0.006557f, 0.007516f, 0.024712f, 0.022540f, 0.004529f, 0.047383f, -0.002592f, 0.019513f, 0.024831f, 0.014639f, 0.010819f, 0.011431f, 0.040821f, 0.030617f, 0.014659f, -0.015786f, -0.006760f, 0.035760f, -0.047300f, 0.018538f, -0.028221f, 0.007150f, -0.010500f, 0.032469f, 0.037004f, 0.075564f, 0.042047f, 0.071387f, 0.040722f, 0.015530f, 0.074587f, 0.077928f, 0.073718f, 0.042923f, -0.012337f, 0.044987f, 0.049163f, 0.031151f, 0.059188f, 0.045497f, 0.000538f, 0.014766f, 0.010660f, 0.011206f, 0.017978f, 0.014223f, -0.014182f, -0.013219f, 0.001749f, 0.014516f, -0.002430f, 0.000135f, -0.003260f, -0.006538f, -0.014026f, -0.012263f, -0.004811f, -0.002862f, -0.004866f, 0.000478f, -0.007738f, -0.003388f, -0.042852f, -0.137743f, 0.004821f, 0.181967f, 0.025005f, -0.039239f, -0.037214f, -0.085460f, -0.056402f, 0.000740f, 0.113038f, + 0.018451f, -0.078287f, -0.007271f, 0.029600f, 0.005773f, 0.000655f, -0.009307f, 0.018328f, -0.056503f, -0.022153f, 0.026228f, 0.061966f, 0.062374f, -0.062105f, -0.025002f, 0.003048f, 0.006820f, 0.014597f, -0.071333f, 0.005172f, 0.009630f, -0.019859f, 0.048335f, -0.002039f, 0.056040f, 0.085482f, 0.039907f, 0.016539f, 0.036154f, -0.050825f, 0.043137f, -0.041310f, 0.065382f, 0.117150f, 0.037306f, -0.065441f, -0.056990f, 0.052376f, 0.017885f, 0.099724f, 0.074241f, 0.021912f, -0.020684f, -0.023942f, 0.001391f, 0.004015f, -0.036888f, 0.038071f, 0.032684f, 0.005351f, 0.089599f, 0.061351f, -0.010104f, 0.043433f, 0.047964f, 0.022056f, 0.047967f, 0.001026f, -0.088535f, -0.011829f, -0.022622f, -0.021141f, 0.097060f, 0.044462f, 0.014323f, 0.077540f, 0.044808f, 0.049080f, 0.059758f, 0.020269f, -0.064476f, -0.032100f, -0.003219f, -0.002051f, -0.023888f, -0.019321f, -0.039821f, 0.022793f, 0.013527f, 0.036042f, -0.019084f, 0.040343f, 0.009784f, 0.041831f, 0.026753f, -0.010217f, -0.023569f, 0.005656f, 0.009696f, -0.000304f, 0.003067f, 0.030550f, 0.001184f, 0.048211f, 0.063567f, 0.018144f, + -0.007387f, 0.004237f, 0.045117f, 0.010302f, -0.016822f, -0.012985f, 0.035208f, -0.002392f, -0.013537f, -0.007630f, 0.010257f, 0.025992f, 0.050552f, -0.028033f, 0.002163f, -0.018245f, 0.002243f, 0.001869f, 0.040792f, -0.023206f, 0.019030f, 0.025882f, 0.013307f, -0.019588f, 0.003779f, 0.030257f, 0.001549f, 0.000938f, 0.026954f, 0.004119f, 0.015292f, 0.011250f, 0.000527f, -0.005399f, 0.002829f, -0.003760f, 0.004179f, 0.002534f, 0.004562f, 0.002239f, 0.011642f, 0.004631f, 0.003108f, 0.003751f, 0.007617f, 0.003514f, 0.008339f, 0.003386f, 0.004076f, 0.004436f, 0.003501f, 0.004667f, 0.002322f, 0.004324f, 0.005933f, 0.006742f, 0.006500f, 0.007320f, 0.005819f, 0.007738f, 0.005736f, 0.006307f, 0.002664f, 0.006422f, 0.002672f, 0.005917f, 0.001976f, 0.005966f, 0.004050f, 0.005469f, 0.001310f, 0.005465f, 0.003515f, 0.005815f, 0.003801f, 0.006550f, 0.002022f, 0.007005f, 0.002114f, 0.006263f, 0.003481f, 0.006210f, 0.002428f, 0.006986f, 0.002305f, 0.005688f, 0.003242f, 0.006110f, 0.002999f, 0.007211f, -0.000072f, -0.026229f, -0.128411f, -0.027162f, 0.073011f, 0.039754f, + 0.158734f, 0.009354f, -0.022003f, -0.070048f, -0.137642f, -0.151496f, -0.024418f, 0.066265f, 0.074670f, 0.047899f, -0.075912f, -0.100944f, 0.000253f, -0.011838f, 0.041527f, 0.106551f, 0.054949f, -0.009380f, -0.062526f, -0.085655f, -0.053157f, 0.004068f, -0.052040f, 0.021204f, -0.043370f, -0.021434f, 0.071689f, 0.058921f, 0.053044f, 0.020797f, -0.071526f, -0.019775f, -0.068366f, -0.052950f, -0.026856f, 0.041426f, -0.006655f, 0.043956f, 0.108231f, 0.112207f, -0.045560f, 0.013274f, -0.081457f, -0.056037f, -0.038337f, -0.006776f, 0.016474f, 0.065200f, 0.070227f, 0.095708f, 0.068855f, 0.024688f, -0.046135f, -0.043163f, -0.009346f, 0.030970f, -0.076788f, 0.005981f, 0.092133f, 0.072901f, -0.017939f, 0.098679f, 0.088930f, 0.049831f, 0.092897f, -0.173704f, 0.042468f, -0.049209f, -0.052541f, 0.030087f, -0.027675f, -0.002279f, 0.176571f, 0.148671f, 0.053742f, -0.045656f, -0.002964f, -0.069599f, -0.012601f, -0.093668f, -0.032204f, -0.015609f, 0.037337f, 0.115102f, 0.061352f, 0.024251f, 0.021620f, -0.018380f, -0.056540f, -0.074145f, 0.001360f, -0.048914f, 0.040432f, -0.004161f, 0.000891f, 0.044195f, + 0.037224f, 0.013705f, 0.038519f, 0.013293f, 0.059521f, -0.040605f, 0.000388f, -0.044785f, 0.019880f, -0.038948f, -0.034547f, 0.006335f, -0.009559f, 0.031094f, 0.056388f, 0.003448f, -0.049819f, -0.085969f, -0.024634f, -0.049807f, 0.007035f, 0.022433f, 0.042085f, -0.033200f, -0.010461f, 0.001559f, -0.000565f, 0.043643f, 0.003510f, -0.223742f, -0.253650f, -0.272722f, -0.275538f, -0.373533f, -0.022383f, -0.133956f, -0.043441f, 0.049267f, 0.124524f, 0.174795f, 0.180318f, 0.368694f, 0.395369f, 0.321822f, 0.239355f, 0.253546f, 0.241776f, 0.093061f, -0.036196f, -0.166499f, -0.166790f, -0.255873f, -0.083266f, -0.138749f, -0.103478f, -0.009850f, -0.217202f, -0.062597f, -0.194018f, -0.052926f, -0.222907f, -0.210165f, -0.097112f, -0.173540f, -0.017859f, -0.087727f, -0.081079f, -0.129808f, -0.085960f, -0.195924f, -0.138525f, -0.073688f, -0.067535f, -0.103716f, -0.063578f, -0.007768f, -0.083929f, 0.028073f, 0.125128f, -0.097714f, 0.148051f, 0.088663f, 0.197665f, 0.198510f, 0.173357f, 0.213753f, 0.180621f, 0.298213f, 0.296289f, 0.236204f, 0.316161f, 0.271023f, 0.414102f, 0.407706f, 0.480568f, 0.373925f, + 0.402597f, 0.438635f, 0.396309f, 0.473780f, 0.351142f, 0.513048f, 0.410115f, 0.156174f, 0.200518f, 0.052710f, 0.079409f, -0.277810f, -0.233060f, -0.260302f, -0.276910f, -0.292092f, -0.377200f, -0.355294f, -0.390370f, -0.428780f, -0.503898f, -0.421317f, -0.385639f, -0.428820f, -0.467483f, -0.557530f, -0.447083f, -0.495214f, -0.498287f, -0.378243f, -0.426213f, -0.246089f, -0.305222f, -0.209075f, -0.193935f, -0.102873f, -0.075056f, -0.106507f, -0.018268f, 0.050038f, 0.242161f, 0.229264f, 0.166648f, 0.188188f, 0.202694f, 0.274524f, 0.281446f, 0.304139f, 0.321027f, 0.275875f, 0.280574f, 0.205947f, 0.291942f, 0.298272f, 0.227483f, 0.159787f, 0.123659f, 0.179173f, 0.177572f, 0.137964f, 0.082973f, 0.045703f, 0.069948f, -0.018279f, 0.009720f, -0.032787f, -0.025698f, -0.132537f, -0.121000f, -0.088472f, -0.060899f, -0.080722f, -0.061506f, -0.029614f, -0.024027f, -0.032078f, -0.059325f, -0.054932f, -0.026913f, -0.035384f, -0.023017f, -0.019787f, 0.004278f, 0.009250f, 0.002038f, -0.009436f, -0.002146f, 0.004780f, -0.002912f, -0.003020f, 0.003564f, 0.006461f, 0.013072f, 0.003552f, -0.003315f, -0.000618f, + 0.004457f, 0.003725f, -0.002958f, -0.001273f, 0.007081f, 0.004459f, 0.003749f, 0.004131f, 0.007547f, 0.006224f, 0.001730f, -0.000594f, 0.005333f, 0.005085f, 0.005611f, -0.001245f, -0.005906f, -0.003001f, 0.002105f, 0.007279f, 0.008683f, 0.004805f, 0.001802f, -0.004438f, -0.007026f, -0.005232f, -0.005174f, -0.010264f, -0.016768f, -0.021177f, -0.021696f, -0.022457f, -0.024540f, -0.026876f, -0.031217f, -0.034854f, -0.037673f, -0.037322f, -0.033849f, -0.031160f, -0.031244f, -0.030277f, -0.028528f, -0.018498f, -0.012673f, -0.009236f, -0.001988f, 0.004932f, 0.010546f, 0.016213f, 0.022183f, 0.025512f, 0.029653f, 0.029484f, 0.028466f, 0.028315f, 0.025408f, 0.021061f, 0.016310f, 0.013052f, 0.010586f, 0.007808f, 0.005354f, 0.003235f, 0.001934f, 0.000905f, 0.000685f, 0.000426f, 0.000309f, 0.000205f, 0.000113f, 0.000106f, 0.000195f, 0.000328f, 0.000398f} + }, + { + {-0.005191f, 0.009873f, -0.000298f, 0.004109f, 0.001650f, -0.008456f, -0.006335f, 0.002327f, -0.005698f, -0.008503f, 0.005001f, -0.000923f, 0.001377f, -0.004840f, 0.003723f, 0.000446f, -0.007521f, -0.000251f, 0.008889f, 0.007239f, -0.005373f, -0.009544f, -0.008687f, 0.001387f, -0.001928f, -0.001628f, -0.007379f, 0.008228f, -0.002067f, 0.002386f, -0.003313f, -0.001976f, -0.000650f, 0.003178f, -0.002116f, -0.004189f, -0.016311f, 0.005673f, -0.001150f, 0.005395f, 0.003243f, 0.002321f, -0.000330f, 0.011031f, 0.002150f, 0.002278f, 0.001621f, -0.005505f, -0.003485f, -0.000428f, 0.000898f, -0.005512f, -0.001232f, 0.002272f, -0.000676f, -0.005204f, -0.002693f, 0.000285f, 0.005272f, -0.008017f, -0.010900f, -0.013537f, 0.004919f, 0.007896f, 0.000885f, 0.006546f, 0.004832f, 0.000996f, -0.012396f, -0.000237f, -0.003174f, -0.004295f, 0.000312f, 0.000785f, 0.005271f, -0.001028f, 0.007461f, 0.005302f, -0.002235f, -0.007394f, -0.003544f, -0.001250f, 0.002006f, 0.000658f, 0.002510f, 0.002888f, 0.005239f, -0.000024f, -0.000397f, -0.002337f, -0.002003f, -0.001921f, -0.000798f, -0.004090f, -0.001876f, -0.002277f, + 0.001394f, -0.000193f, -0.000430f, -0.001200f, 0.002052f, -0.002856f, 0.005936f, 0.007753f, -0.001756f, -0.000075f, -0.011028f, 0.009886f, -0.012636f, 0.004920f, 0.021336f, -0.004537f, -0.007919f, 0.001241f, 0.011137f, 0.001214f, -0.003152f, -0.001509f, -0.003177f, -0.001983f, -0.010009f, -0.003867f, 0.004946f, -0.007919f, -0.004543f, 0.000489f, -0.000437f, 0.008831f, -0.005365f, 0.001683f, -0.002076f, 0.001964f, -0.001117f, -0.005091f, 0.009735f, 0.016603f, 0.004193f, -0.000896f, -0.003106f, 0.017968f, 0.000832f, -0.007444f, 0.000498f, -0.013312f, 0.000045f, 0.007028f, -0.010262f, -0.001248f, 0.002195f, -0.008135f, -0.002471f, 0.009496f, 0.001337f, -0.000953f, 0.009100f, -0.005996f, -0.009585f, 0.005485f, 0.003587f, -0.006622f, -0.003324f, -0.007093f, -0.008402f, -0.008960f, -0.005005f, -0.005092f, 0.007310f, 0.005279f, 0.001423f, -0.000132f, -0.005091f, 0.004784f, -0.001113f, -0.003388f, 0.006189f, 0.006934f, -0.004905f, -0.000895f, -0.002328f, -0.003036f, 0.000946f, 0.007938f, -0.003982f, 0.001847f, 0.007467f, 0.005040f, -0.001736f, 0.001991f, -0.001329f, -0.000112f, 0.003152f, -0.000354f, + 0.000028f, 0.003330f, -0.003479f, 0.001502f, 0.000687f, -0.001004f, -0.003210f, 0.002543f, 0.000253f, -0.001316f, 0.000722f, 0.000459f, -0.001171f, 0.000475f, -0.000616f, -0.000947f, -0.001894f, 0.010940f, -0.015828f, -0.010434f, -0.003731f, -0.002262f, 0.000586f, 0.002089f, -0.015090f, 0.010560f, -0.004732f, 0.003482f, 0.002217f, 0.003545f, 0.006663f, -0.000002f, -0.002141f, -0.004993f, 0.010949f, -0.000817f, 0.007135f, 0.013503f, -0.002870f, 0.011487f, 0.009813f, -0.008420f, 0.005708f, 0.005766f, 0.006192f, -0.014891f, -0.001433f, 0.000934f, -0.004642f, -0.009351f, 0.000198f, 0.010999f, -0.002521f, -0.004654f, -0.003634f, 0.003391f, 0.010214f, 0.005057f, -0.005138f, -0.000049f, -0.004228f, 0.000469f, -0.001309f, -0.005028f, 0.009544f, -0.012229f, -0.010079f, -0.009274f, 0.002933f, -0.001274f, -0.000279f, -0.011409f, -0.012027f, 0.002977f, -0.000199f, 0.000717f, -0.001136f, -0.000610f, -0.008963f, -0.005307f, -0.009805f, 0.001964f, 0.008509f, -0.002604f, 0.007557f, 0.001434f, 0.006726f, -0.014374f, 0.000120f, 0.002109f, -0.004746f, -0.002146f, 0.001983f, -0.005105f, -0.000572f, 0.003799f, + 0.004136f, -0.003170f, -0.009574f, 0.008506f, 0.001391f, 0.000232f, -0.002067f, -0.001208f, -0.007652f, 0.000363f, 0.000595f, -0.001336f, 0.001456f, 0.000270f, -0.002658f, 0.001183f, 0.001314f, -0.000759f, -0.001044f, -0.000366f, -0.000394f, -0.000504f, 0.000492f, 0.004077f, 0.000135f, -0.001204f, 0.003429f, 0.001514f, -0.000196f, -0.001107f, -0.000264f, -0.000552f, -0.005588f, 0.001195f, -0.001240f, 0.009202f, 0.014720f, 0.000798f, -0.005804f, -0.012789f, 0.005635f, 0.003612f, 0.003358f, 0.015608f, -0.010449f, 0.000222f, 0.001766f, -0.002996f, -0.005304f, 0.002190f, 0.000840f, 0.009356f, 0.020795f, -0.001982f, 0.003472f, 0.008622f, -0.003953f, 0.007678f, 0.013461f, -0.009636f, -0.000509f, -0.003674f, -0.000352f, 0.005942f, -0.010761f, 0.011328f, 0.002400f, 0.000004f, 0.005885f, -0.001122f, 0.008209f, -0.004661f, -0.002083f, -0.002480f, 0.012984f, 0.006001f, 0.008212f, -0.001709f, 0.006739f, -0.012875f, 0.014586f, -0.005827f, 0.005641f, -0.013544f, 0.005261f, 0.009630f, 0.017811f, 0.006482f, 0.003199f, -0.011937f, -0.004685f, 0.003154f, -0.009107f, -0.010757f, -0.002682f, 0.021121f, + 0.024428f, 0.004609f, 0.005627f, -0.007119f, -0.003273f, 0.013645f, 0.002524f, 0.005919f, -0.000990f, 0.004086f, 0.003527f, -0.001914f, 0.002986f, -0.002106f, 0.002212f, 0.001564f, 0.008527f, 0.006976f, -0.011063f, 0.009629f, -0.003348f, 0.004910f, -0.003593f, 0.003589f, -0.003057f, -0.004136f, -0.000235f, -0.006552f, 0.000858f, 0.004660f, 0.000920f, 0.002368f, -0.002457f, -0.002933f, -0.001632f, 0.001115f, 0.000045f, 0.001014f, -0.000576f, 0.000686f, -0.001986f, 0.000621f, 0.000541f, 0.003391f, 0.000048f, 0.002294f, -0.001262f, 0.002052f, -0.002583f, 0.000240f, 0.000245f, 0.002445f, 0.010195f, 0.000113f, 0.001122f, 0.014369f, -0.012420f, -0.014604f, 0.022317f, -0.006005f, -0.003761f, 0.014517f, 0.008640f, 0.000902f, -0.025948f, 0.027678f, -0.005256f, -0.003709f, -0.003076f, -0.001708f, 0.000961f, 0.001531f, 0.008569f, 0.012805f, 0.008423f, -0.002060f, 0.014446f, 0.009056f, 0.004551f, 0.003727f, -0.005498f, 0.006459f, -0.010613f, 0.008172f, -0.001726f, 0.003303f, -0.008999f, -0.013102f, 0.001536f, -0.001837f, 0.004615f, 0.007574f, -0.003946f, -0.012555f, -0.007315f, 0.002830f, + -0.014924f, 0.009369f, 0.002874f, -0.023840f, 0.010577f, 0.001420f, 0.006010f, 0.001317f, 0.003582f, 0.003796f, -0.001053f, -0.006881f, -0.005871f, -0.016345f, -0.011930f, -0.006802f, -0.008313f, -0.002037f, 0.000888f, -0.012027f, -0.016776f, -0.002714f, 0.010799f, 0.018498f, -0.001017f, -0.012691f, 0.002012f, -0.019830f, 0.001290f, -0.001566f, -0.007763f, 0.016310f, 0.015502f, 0.005004f, -0.000648f, -0.004231f, -0.001223f, -0.008924f, 0.004044f, 0.015620f, 0.008441f, 0.012865f, 0.002609f, -0.006224f, 0.006061f, 0.002923f, -0.000475f, 0.001005f, 0.000683f, 0.000133f, 0.002803f, 0.002663f, 0.002782f, -0.001147f, 0.004907f, 0.001071f, 0.009717f, 0.003536f, 0.002587f, 0.000187f, 0.000815f, 0.002295f, -0.000722f, 0.004290f, 0.001664f, 0.001485f, -0.002623f, 0.005394f, 0.001404f, -0.002321f, -0.000865f, 0.004155f, -0.025330f, 0.013070f, -0.004844f, -0.009021f, -0.007153f, -0.008632f, -0.012045f, 0.023186f, -0.029556f, 0.006954f, 0.007134f, 0.009652f, 0.014434f, 0.002355f, 0.004008f, 0.005419f, 0.003909f, 0.002989f, 0.004890f, 0.012687f, 0.002293f, -0.007017f, -0.000014f, -0.001251f, + -0.009097f, -0.008254f, 0.004213f, 0.008488f, 0.009164f, 0.001215f, 0.006535f, -0.015423f, -0.001786f, -0.000249f, -0.000844f, -0.014619f, -0.008734f, -0.005285f, 0.009541f, 0.008523f, -0.000145f, -0.016002f, 0.000094f, -0.008685f, -0.006184f, -0.003178f, -0.004290f, 0.009988f, 0.013652f, 0.004101f, 0.014203f, -0.022758f, -0.015861f, 0.007511f, 0.004647f, 0.000725f, 0.003014f, 0.001437f, -0.007354f, -0.014338f, -0.009861f, 0.007522f, -0.006385f, 0.011528f, 0.011418f, -0.004212f, 0.010821f, -0.017252f, -0.008487f, -0.004897f, -0.005785f, 0.001196f, 0.031332f, -0.004565f, 0.008875f, -0.005062f, -0.004514f, -0.003257f, 0.006666f, 0.007056f, -0.000809f, 0.005681f, 0.003953f, -0.009841f, 0.002716f, 0.000674f, 0.004217f, 0.000835f, 0.000539f, -0.005003f, 0.003182f, -0.000285f, 0.003225f, 0.000941f, 0.001684f, -0.000996f, -0.001840f, 0.000848f, -0.002823f, -0.004200f, 0.001428f, -0.002343f, -0.003502f, -0.001139f, 0.001091f, 0.001300f, 0.001431f, 0.001435f, -0.000171f, 0.001000f, 0.002253f, 0.001746f, 0.000659f, 0.000434f, -0.000696f, -0.001296f, 0.002107f, 0.001050f, -0.000166f, 0.001438f, + 0.025884f, -0.004995f, 0.000694f, 0.010892f, -0.024668f, 0.016932f, 0.008580f, -0.013910f, 0.015411f, 0.017243f, 0.005779f, -0.026632f, 0.016442f, 0.000701f, -0.002525f, 0.013461f, 0.014543f, -0.000841f, -0.004313f, 0.000411f, -0.010345f, 0.009653f, -0.005663f, -0.009858f, -0.020722f, 0.004822f, -0.022522f, 0.006029f, -0.005531f, -0.002532f, 0.006476f, -0.018354f, -0.007550f, 0.015234f, -0.001346f, -0.007133f, 0.009317f, 0.000605f, -0.008019f, 0.006892f, 0.002489f, 0.000664f, -0.003447f, 0.005253f, -0.011180f, -0.001185f, -0.016320f, 0.015413f, 0.015408f, -0.019216f, 0.012817f, -0.013713f, -0.005187f, 0.013244f, 0.018525f, -0.001360f, -0.009252f, 0.005591f, -0.001181f, 0.002659f, -0.022679f, -0.017933f, 0.003562f, 0.003201f, -0.004917f, -0.004673f, 0.005862f, -0.000714f, -0.008049f, 0.009565f, -0.009276f, 0.003230f, 0.006916f, -0.001604f, 0.010856f, -0.010913f, 0.010977f, -0.000093f, 0.017476f, -0.006018f, 0.005293f, 0.009857f, 0.001101f, -0.006290f, -0.001803f, -0.000669f, 0.005113f, -0.001733f, -0.008250f, 0.006919f, 0.001489f, -0.003472f, 0.003048f, -0.002343f, -0.000122f, -0.003261f, + -0.000947f, 0.002349f, -0.002776f, 0.001754f, 0.004777f, -0.002510f, 0.001148f, 0.000309f, -0.001609f, 0.003010f, 0.000793f, 0.002558f, -0.003885f, 0.001545f, -0.003977f, -0.004553f, 0.001665f, -0.000749f, 0.001820f, 0.001880f, 0.000551f, 0.005520f, 0.007208f, 0.003163f, -0.009391f, 0.018222f, -0.006186f, 0.008886f, -0.018322f, -0.001263f, -0.004808f, -0.016630f, 0.000619f, 0.011812f, 0.020965f, 0.027417f, -0.015556f, -0.000399f, -0.019399f, -0.001416f, -0.012341f, 0.011090f, -0.011552f, -0.022884f, 0.001522f, -0.014654f, -0.001338f, 0.019043f, -0.011230f, -0.011206f, 0.020435f, 0.000667f, 0.003543f, -0.002097f, -0.011957f, 0.005130f, 0.004389f, 0.024616f, -0.016923f, 0.012091f, -0.014347f, 0.003622f, 0.004809f, -0.014159f, -0.008702f, 0.023638f, 0.006492f, -0.017522f, -0.004497f, -0.006390f, -0.014060f, -0.000560f, 0.023174f, 0.012428f, 0.016137f, 0.003714f, 0.006474f, -0.021083f, -0.003019f, 0.026888f, 0.002163f, -0.016657f, 0.008966f, 0.008912f, -0.012213f, -0.010634f, -0.005869f, -0.027556f, -0.004220f, 0.008225f, 0.013666f, 0.024255f, -0.006037f, -0.013220f, -0.003799f, -0.008217f, + 0.019701f, -0.007285f, -0.017135f, -0.011669f, -0.005038f, -0.002313f, -0.005286f, -0.009894f, 0.021444f, -0.012241f, -0.001457f, 0.002007f, 0.001058f, 0.007021f, 0.004392f, -0.006277f, -0.008436f, 0.006393f, 0.007673f, 0.008110f, -0.001817f, 0.003685f, -0.002207f, -0.001305f, 0.003644f, -0.000764f, -0.003725f, 0.003837f, 0.001815f, -0.000080f, -0.002429f, -0.000793f, -0.006228f, 0.000615f, -0.001523f, -0.005350f, -0.002718f, 0.002479f, 0.002160f, 0.000132f, 0.002531f, 0.011870f, -0.040805f, -0.028100f, -0.017977f, 0.002245f, -0.034173f, 0.005209f, 0.025564f, 0.008515f, 0.026320f, -0.013987f, -0.006396f, -0.002763f, -0.013536f, -0.005017f, -0.020367f, 0.036456f, 0.020863f, 0.014584f, -0.030631f, -0.005857f, -0.009792f, -0.019911f, 0.007014f, -0.002022f, 0.006585f, -0.024752f, -0.001607f, -0.002144f, -0.017733f, 0.010455f, 0.003056f, 0.018305f, 0.007435f, -0.015162f, 0.024117f, -0.011275f, 0.009851f, 0.005136f, -0.000096f, 0.019080f, 0.017768f, 0.004533f, -0.022805f, 0.028029f, -0.014040f, 0.020119f, 0.009248f, -0.010295f, -0.011423f, 0.022550f, 0.003412f, -0.002543f, 0.005965f, -0.018909f, + -0.006689f, 0.011023f, -0.001472f, 0.019949f, -0.011372f, -0.017894f, 0.007485f, 0.005159f, 0.000731f, 0.019839f, 0.008640f, 0.004093f, -0.012487f, 0.014458f, 0.005766f, -0.010951f, -0.001391f, -0.001109f, -0.006211f, -0.004537f, -0.005216f, 0.008725f, 0.021840f, 0.036657f, 0.017135f, -0.006098f, 0.001991f, -0.008325f, 0.008554f, 0.011330f, -0.000040f, -0.009274f, -0.005357f, -0.012128f, 0.007668f, -0.006593f, 0.001932f, -0.005691f, -0.001433f, 0.008192f, -0.000816f, 0.000954f, -0.007276f, 0.008013f, -0.004038f, -0.003488f, 0.004515f, -0.007227f, 0.008158f, -0.005520f, 0.004443f, -0.003880f, -0.000584f, 0.001867f, -0.005284f, -0.003801f, -0.002222f, -0.008807f, -0.008750f, -0.003841f, -0.000295f, -0.003072f, 0.007241f, 0.006596f, 0.003991f, -0.026332f, 0.034202f, 0.013884f, 0.039184f, -0.018304f, -0.021825f, 0.037318f, 0.000774f, -0.004405f, 0.007787f, 0.002403f, 0.021637f, 0.029004f, 0.003346f, -0.027896f, -0.044388f, 0.005670f, -0.012615f, 0.002193f, 0.000742f, -0.019481f, -0.001715f, 0.023424f, 0.019049f, 0.014891f, 0.030283f, -0.007432f, 0.025583f, -0.018800f, 0.022599f, 0.007126f, + 0.017398f, -0.012472f, 0.031029f, 0.017679f, 0.022523f, -0.037011f, -0.000675f, 0.032774f, 0.018428f, 0.005571f, -0.008385f, 0.049540f, 0.020609f, -0.020067f, -0.012584f, 0.011736f, -0.019573f, -0.002312f, -0.009655f, 0.002126f, 0.041491f, 0.043527f, 0.031441f, 0.011281f, -0.000129f, 0.016109f, -0.015093f, -0.004132f, 0.017522f, -0.019111f, 0.043966f, 0.027281f, 0.021327f, 0.008164f, -0.002206f, -0.021431f, 0.025904f, 0.000526f, 0.022534f, -0.010719f, 0.008455f, -0.015244f, -0.008986f, -0.000805f, 0.011123f, -0.017851f, 0.040902f, 0.017421f, -0.005041f, -0.020699f, -0.039494f, 0.018783f, 0.002932f, -0.013094f, -0.001679f, 0.004430f, -0.009598f, 0.005269f, 0.014575f, -0.003002f, -0.005660f, 0.000080f, -0.003670f, -0.004271f, 0.002925f, -0.005096f, -0.003930f, -0.006836f, 0.006272f, 0.003471f, -0.010275f, 0.005136f, 0.005811f, 0.005725f, -0.000680f, -0.003267f, -0.001582f, -0.000439f, 0.002778f, -0.001197f, 0.001929f, -0.006158f, 0.009077f, -0.012349f, -0.000280f, 0.003790f, 0.010236f, 0.001041f, 0.043427f, -0.001970f, -0.020650f, -0.009030f, -0.016067f, -0.000117f, -0.026104f, 0.007428f, + -0.022412f, 0.013511f, 0.003520f, -0.005700f, -0.017510f, -0.021102f, -0.032173f, -0.033470f, -0.009506f, 0.029939f, -0.001623f, -0.018742f, 0.008516f, -0.017857f, 0.014650f, -0.015196f, 0.028190f, -0.027899f, 0.007229f, -0.019666f, -0.019977f, -0.003347f, 0.004114f, -0.005581f, 0.013645f, -0.040382f, 0.017053f, 0.004337f, -0.009203f, -0.002427f, -0.002075f, -0.019803f, -0.031736f, -0.034319f, 0.025610f, 0.012714f, -0.012920f, 0.021971f, 0.001345f, -0.008663f, -0.024874f, -0.053311f, -0.043517f, 0.025359f, -0.007056f, 0.000890f, -0.004639f, -0.002208f, -0.001886f, -0.036035f, 0.014496f, -0.042634f, -0.022219f, 0.002256f, -0.000663f, -0.008905f, -0.005082f, -0.005455f, 0.044976f, -0.013448f, -0.013741f, -0.011771f, 0.047035f, -0.008127f, -0.017903f, 0.029579f, -0.022328f, -0.014447f, -0.018271f, -0.015803f, -0.059035f, 0.012152f, 0.010291f, -0.019856f, -0.002183f, 0.014122f, -0.007071f, -0.005236f, -0.010410f, -0.010085f, -0.000712f, -0.005228f, -0.004559f, 0.020959f, -0.000986f, -0.002152f, 0.014690f, 0.016670f, -0.007458f, -0.005948f, -0.000613f, -0.002874f, 0.004986f, -0.010083f, 0.001904f, 0.001206f, + 0.002650f, -0.006000f, -0.006666f, -0.003040f, 0.007570f, -0.002772f, -0.004750f, -0.000773f, 0.005087f, -0.013085f, -0.001282f, 0.007366f, 0.001271f, -0.005252f, 0.007810f, -0.004602f, 0.007019f, -0.000095f, 0.006753f, 0.006252f, 0.007300f, -0.011517f, -0.000340f, 0.000066f, -0.062966f, -0.047453f, -0.027012f, 0.055643f, -0.002488f, -0.008841f, -0.006435f, -0.003978f, -0.017907f, 0.019954f, 0.015425f, 0.049874f, -0.045365f, -0.008493f, 0.014345f, -0.032982f, -0.013092f, -0.011390f, 0.057254f, -0.000400f, 0.013394f, 0.029453f, 0.002872f, 0.028373f, -0.029908f, -0.037430f, -0.025129f, -0.006503f, -0.006226f, 0.005004f, 0.018019f, -0.000386f, -0.031717f, -0.021525f, -0.001442f, -0.016532f, -0.035626f, 0.032478f, -0.005170f, -0.017335f, -0.000063f, 0.010798f, 0.010307f, 0.006516f, -0.016037f, 0.003815f, -0.033163f, -0.014014f, -0.049256f, 0.023779f, 0.015035f, -0.005258f, -0.015399f, 0.018845f, -0.024509f, -0.005685f, 0.053360f, -0.004998f, 0.045225f, 0.020818f, 0.012172f, -0.011192f, -0.056649f, -0.022943f, -0.010862f, -0.029878f, -0.022792f, -0.013892f, 0.025407f, -0.010933f, 0.000594f, -0.022107f, + 0.048356f, -0.016599f, 0.019938f, 0.014231f, -0.033008f, -0.012564f, 0.007247f, 0.031294f, 0.055778f, 0.047170f, 0.020069f, -0.002426f, 0.019102f, 0.000896f, 0.001592f, -0.010182f, 0.005554f, -0.010540f, -0.007967f, 0.000579f, 0.003176f, -0.006033f, -0.009191f, -0.015539f, -0.013159f, 0.007769f, 0.005218f, 0.006497f, -0.006185f, -0.001685f, -0.032660f, 0.000222f, -0.015169f, -0.006189f, 0.005683f, 0.005368f, 0.001663f, 0.014300f, 0.000103f, -0.001015f, 0.001094f, -0.004525f, -0.023830f, -0.001328f, -0.013672f, 0.007630f, -0.012179f, -0.012015f, 0.001207f, 0.015979f, 0.006535f, -0.003330f, -0.009142f, -0.007182f, -0.004225f, 0.009066f, 0.001750f, -0.002638f, -0.006222f, 0.031765f, -0.002625f, -0.019728f, 0.019208f, 0.010549f, 0.067584f, 0.001327f, -0.000234f, 0.023148f, -0.031922f, -0.022384f, -0.007111f, 0.004605f, 0.010148f, -0.009354f, 0.028080f, -0.018857f, 0.003112f, 0.026248f, 0.011375f, 0.009072f, 0.009216f, -0.021202f, 0.002927f, -0.001654f, -0.010733f, 0.003132f, -0.015489f, -0.027066f, -0.014437f, 0.001006f, -0.026461f, 0.032078f, -0.003244f, 0.002265f, -0.005362f, 0.021747f, + 0.024912f, -0.005909f, -0.019777f, -0.002794f, -0.006840f, 0.029286f, 0.038161f, -0.028732f, -0.019783f, -0.015047f, 0.008991f, 0.027871f, -0.026601f, 0.007595f, -0.001861f, 0.005022f, -0.014168f, -0.019060f, 0.004941f, 0.018022f, 0.002851f, -0.024620f, 0.020656f, 0.061631f, -0.020968f, 0.010624f, -0.005396f, 0.003804f, 0.023535f, 0.005803f, 0.027871f, 0.022811f, -0.006935f, 0.035515f, 0.065814f, 0.001648f, -0.025223f, 0.064032f, -0.001949f, 0.061176f, -0.022180f, -0.031506f, 0.028055f, 0.010016f, 0.042805f, -0.008112f, 0.060549f, 0.018271f, 0.013548f, -0.019374f, 0.028346f, 0.002322f, 0.002270f, 0.005752f, 0.023040f, 0.003922f, 0.026407f, 0.002232f, 0.006090f, -0.000132f, 0.003451f, 0.003267f, 0.008027f, -0.003809f, 0.009078f, 0.021685f, 0.008938f, 0.009342f, 0.002642f, 0.005030f, -0.013239f, 0.010041f, 0.003721f, 0.004005f, 0.007624f, 0.003249f, -0.001348f, -0.001256f, 0.005847f, -0.007484f, 0.001687f, -0.000803f, 0.005166f, 0.015126f, 0.005342f, -0.001651f, -0.008709f, 0.007433f, 0.001007f, 0.000930f, -0.001995f, 0.007212f, 0.004432f, -0.013699f, 0.012057f, -0.043822f, + -0.014625f, 0.066454f, 0.010528f, -0.031826f, 0.008553f, -0.024311f, 0.008023f, 0.012090f, -0.006131f, -0.036370f, -0.014034f, -0.053982f, 0.021419f, 0.017403f, -0.021067f, 0.018936f, 0.030259f, 0.005491f, -0.008892f, -0.031922f, 0.006496f, 0.048793f, -0.024340f, 0.028917f, 0.027914f, 0.003590f, 0.020874f, 0.018932f, 0.000398f, 0.023827f, 0.016001f, -0.048261f, -0.007204f, -0.020028f, 0.047864f, 0.031097f, -0.034200f, 0.019767f, -0.004340f, 0.024528f, 0.080178f, -0.008629f, -0.014072f, 0.007043f, 0.072141f, 0.028767f, -0.004873f, 0.008241f, 0.012749f, 0.040836f, 0.036583f, -0.026353f, 0.044007f, 0.019280f, 0.040779f, -0.030226f, 0.004072f, 0.007152f, 0.008420f, 0.024320f, 0.037430f, -0.025702f, -0.019845f, 0.028762f, 0.014646f, -0.011323f, -0.010979f, -0.001073f, 0.045043f, -0.086655f, 0.019854f, -0.031592f, -0.022695f, 0.002901f, -0.029533f, -0.028441f, -0.004154f, -0.047984f, 0.033511f, -0.011200f, 0.035433f, -0.002565f, 0.030982f, -0.021882f, 0.012357f, -0.000554f, 0.010147f, -0.002287f, -0.012183f, 0.008105f, 0.006507f, 0.006188f, 0.015084f, -0.008801f, 0.007583f, 0.009105f, + -0.008848f, -0.000592f, 0.014452f, 0.003975f, -0.007905f, 0.014787f, -0.010740f, 0.000726f, 0.008411f, -0.011901f, -0.007899f, 0.001824f, 0.003224f, 0.016585f, 0.014976f, 0.009209f, 0.005454f, -0.003270f, 0.011713f, 0.001072f, 0.005192f, 0.003582f, 0.009759f, 0.010205f, -0.009713f, -0.009803f, -0.015739f, 0.010832f, 0.005042f, -0.000649f, 0.004065f, -0.001449f, -0.016943f, -0.016258f, 0.010895f, 0.014239f, 0.015084f, -0.019211f, -0.022839f, -0.058760f, 0.002526f, -0.032913f, 0.053123f, 0.006228f, -0.013941f, -0.008192f, 0.031852f, 0.008919f, 0.051801f, 0.020651f, -0.013553f, 0.001857f, 0.010890f, 0.023321f, 0.038978f, -0.043985f, -0.037855f, -0.008253f, 0.065614f, -0.020552f, 0.008353f, 0.018395f, 0.028750f, 0.034555f, 0.049894f, 0.042759f, 0.003796f, -0.010627f, 0.046617f, 0.003266f, -0.029672f, 0.015438f, -0.027517f, 0.019537f, 0.005008f, -0.024929f, 0.022522f, 0.087270f, 0.048889f, -0.031340f, -0.023368f, -0.003579f, -0.024235f, -0.024495f, -0.020741f, 0.014651f, -0.011767f, -0.020914f, 0.004672f, 0.023704f, 0.014534f, 0.007577f, 0.034570f, 0.008813f, -0.008200f, 0.035942f, + 0.030785f, -0.026726f, 0.018007f, -0.030120f, -0.023020f, -0.026764f, 0.000109f, -0.064014f, -0.018627f, 0.043762f, 0.032841f, -0.015603f, 0.022129f, -0.005821f, 0.001796f, -0.039552f, 0.009016f, 0.022940f, 0.037468f, 0.020421f, 0.024911f, 0.013001f, 0.012070f, -0.017195f, -0.014411f, -0.018263f, 0.010239f, -0.004383f, 0.001693f, 0.006977f, 0.008098f, -0.001386f, 0.019570f, -0.006645f, -0.008165f, -0.009794f, 0.013842f, -0.018292f, -0.006842f, -0.022430f, -0.000842f, 0.003656f, -0.009075f, 0.000204f, -0.004860f, 0.012953f, -0.002256f, -0.029420f, 0.000809f, -0.002655f, 0.008956f, 0.010558f, 0.004043f, 0.012082f, -0.000397f, 0.020075f, 0.004679f, -0.002366f, -0.000115f, 0.001539f, 0.001337f, 0.000319f, 0.008481f, -0.005433f, -0.024324f, 0.019267f, 0.015472f, -0.030779f, -0.013406f, -0.066380f, -0.005692f, 0.054489f, 0.000247f, -0.040754f, 0.006084f, 0.001404f, -0.027460f, 0.036150f, 0.020788f, -0.015219f, 0.010041f, 0.016107f, 0.022237f, 0.012069f, 0.003540f, -0.016777f, 0.008492f, 0.012525f, 0.034648f, 0.051818f, -0.014743f, -0.035759f, -0.018923f, 0.009453f, 0.010531f, 0.042536f, + -0.016832f, -0.034283f, -0.026645f, -0.027545f, 0.051760f, 0.094971f, 0.034341f, 0.004230f, 0.104442f, 0.005733f, 0.043099f, 0.024217f, -0.009166f, -0.022554f, 0.018284f, -0.030336f, -0.020172f, 0.020648f, 0.001091f, -0.063741f, -0.065736f, -0.016966f, 0.026986f, -0.034731f, -0.043129f, -0.024181f, -0.032014f, -0.026709f, 0.021775f, -0.018797f, -0.048849f, 0.021181f, 0.001599f, -0.014795f, 0.011039f, -0.011590f, 0.024158f, 0.097663f, -0.060541f, 0.048899f, -0.068789f, -0.039509f, -0.023006f, -0.016182f, 0.037773f, 0.014691f, 0.017961f, -0.008100f, 0.020860f, 0.043416f, 0.010746f, 0.000314f, 0.000285f, -0.013530f, 0.005783f, 0.011362f, 0.035072f, -0.002871f, -0.017800f, -0.003370f, 0.026731f, 0.016598f, -0.007908f, 0.009472f, 0.011987f, -0.010532f, -0.000606f, -0.004962f, 0.033628f, 0.011479f, 0.015808f, 0.011117f, 0.009439f, -0.014779f, -0.010149f, -0.003029f, 0.008447f, -0.017923f, 0.002262f, -0.017699f, -0.011867f, 0.001878f, 0.001561f, -0.020238f, 0.018754f, 0.025060f, -0.002778f, -0.004211f, 0.015554f, -0.000688f, -0.007010f, 0.022042f, -0.009652f, 0.014997f, 0.001227f, 0.052960f, + 0.033973f, 0.030597f, 0.045075f, -0.053167f, 0.020093f, -0.055677f, -0.002470f, 0.072137f, 0.064155f, 0.027175f, 0.000758f, 0.012249f, 0.007943f, -0.021051f, 0.016547f, 0.020563f, -0.091477f, 0.005304f, 0.013184f, 0.027454f, -0.033663f, -0.051672f, 0.037463f, 0.017531f, 0.009369f, -0.022262f, 0.044482f, -0.006586f, 0.034534f, 0.028566f, -0.003655f, 0.004098f, -0.010304f, 0.034876f, -0.021085f, 0.010427f, 0.020972f, -0.002164f, 0.044772f, 0.025717f, -0.002712f, 0.022748f, 0.026026f, -0.001680f, -0.020487f, -0.068774f, -0.012806f, 0.006979f, -0.040713f, 0.003586f, 0.032166f, -0.062536f, -0.027771f, 0.009204f, -0.026908f, -0.004671f, 0.032662f, 0.001561f, -0.023384f, -0.030652f, 0.013337f, 0.012805f, -0.063038f, -0.021320f, -0.005372f, -0.000093f, 0.039351f, 0.018995f, 0.004274f, 0.068644f, -0.008835f, -0.002601f, 0.002588f, -0.039728f, 0.037150f, -0.000053f, 0.061054f, -0.024092f, -0.010358f, 0.018031f, 0.009120f, -0.052533f, 0.001579f, -0.007584f, -0.020982f, -0.017242f, 0.006408f, 0.001774f, -0.014831f, -0.001699f, -0.009253f, -0.006843f, 0.001793f, -0.022709f, 0.006334f, 0.002665f, + -0.003220f, 0.008135f, 0.002249f, -0.015136f, 0.002909f, 0.003807f, 0.003823f, -0.014664f, 0.020729f, 0.003676f, 0.027000f, -0.020398f, 0.002438f, -0.017258f, -0.006026f, -0.003525f, -0.030074f, 0.005947f, 0.002703f, -0.001691f, -0.004142f, -0.005858f, 0.011028f, -0.013959f, -0.010514f, 0.012610f, 0.017374f, -0.013655f, -0.017572f, -0.064822f, -0.056522f, 0.010072f, -0.029201f, -0.009312f, -0.043601f, -0.054279f, -0.057075f, -0.037608f, 0.040339f, 0.055117f, 0.001272f, -0.045827f, 0.003409f, 0.001885f, 0.000414f, 0.020800f, 0.035136f, 0.035084f, 0.000690f, -0.023149f, -0.056923f, -0.032782f, -0.049848f, -0.010910f, 0.000037f, 0.003939f, 0.004953f, 0.006734f, 0.013511f, 0.017481f, 0.033259f, -0.052740f, 0.022870f, 0.008912f, 0.011420f, 0.027890f, 0.049624f, 0.055634f, -0.032365f, 0.024641f, -0.044673f, -0.014179f, -0.040549f, -0.004217f, -0.015903f, 0.092655f, 0.032814f, 0.066666f, 0.002660f, -0.036205f, -0.015591f, 0.042584f, 0.046250f, -0.027569f, 0.085577f, -0.036217f, 0.005190f, 0.003466f, 0.014734f, 0.031185f, 0.095223f, -0.006987f, 0.023202f, 0.052795f, 0.011977f, -0.042404f, + 0.026593f, 0.097268f, -0.017962f, -0.023944f, -0.057707f, -0.005128f, 0.035858f, 0.021887f, 0.002878f, -0.055599f, -0.042005f, 0.006689f, -0.043824f, 0.012810f, 0.001798f, -0.055364f, -0.006370f, 0.005310f, -0.008782f, 0.039375f, 0.037188f, 0.000466f, -0.011024f, -0.024066f, 0.025708f, -0.011328f, 0.044774f, -0.010611f, 0.000462f, 0.030379f, 0.030751f, 0.043549f, 0.033817f, -0.025180f, -0.009836f, 0.005529f, -0.008321f, 0.002609f, -0.019015f, -0.018566f, -0.018519f, 0.009224f, -0.022653f, -0.026661f, 0.015473f, 0.019952f, 0.001733f, -0.022966f, 0.014257f, 0.007601f, -0.005660f, -0.006148f, -0.015454f, -0.000709f, 0.008670f, -0.004285f, -0.013824f, -0.018281f, -0.003500f, -0.012150f, 0.014591f, 0.007834f, 0.001241f, -0.016748f, -0.007273f, -0.009509f, 0.019131f, 0.087013f, -0.004198f, -0.000199f, 0.037090f, 0.007428f, -0.119370f, -0.037330f, 0.085276f, 0.028553f, -0.024644f, -0.047394f, -0.006400f, -0.031221f, 0.044117f, 0.023035f, 0.008525f, -0.024990f, -0.056348f, 0.012416f, -0.097274f, -0.011663f, 0.048014f, 0.065386f, -0.007222f, -0.055052f, -0.037371f, -0.113943f, 0.033822f, -0.019582f, + 0.045025f, 0.034045f, -0.032151f, -0.023381f, -0.101029f, -0.075878f, 0.039933f, 0.108214f, 0.043424f, 0.051518f, -0.035661f, -0.063961f, -0.061288f, -0.025602f, 0.092085f, 0.123847f, 0.064786f, -0.143475f, -0.052370f, -0.109898f, -0.058570f, 0.136722f, 0.033590f, 0.030482f, -0.017815f, -0.131255f, -0.107331f, -0.107813f, -0.019770f, 0.010675f, 0.068396f, -0.025078f, 0.052107f, -0.104060f, 0.065135f, 0.026125f, 0.008224f, 0.131267f, 0.008741f, -0.011928f, -0.005947f, -0.177654f, -0.054010f, -0.011906f, 0.056339f, 0.029382f, 0.025934f, 0.078654f, -0.083578f, 0.005572f, -0.055194f, 0.060710f, 0.044067f, 0.004349f, 0.012424f, 0.013047f, -0.009576f, 0.036157f, 0.019636f, 0.009712f, 0.030998f, -0.020773f, -0.038747f, 0.009634f, 0.028385f, 0.042720f, 0.035441f, 0.023287f, -0.029007f, -0.047456f, -0.066329f, -0.005849f, 0.005108f, 0.054050f, 0.067190f, -0.009966f, -0.050571f, -0.087414f, -0.041675f, 0.006324f, 0.067218f, 0.107443f, 0.028308f, -0.104964f, -0.107479f, -0.109982f, -0.000883f, 0.089811f, 0.079351f, 0.083428f, -0.027693f, -0.040590f, -0.077961f, -0.078990f, 0.029268f, 0.053413f, + 0.069939f, 0.035347f, -0.054903f, -0.052177f, -0.029208f, -0.008281f, 0.064912f, 0.034220f, 0.010961f, -0.002985f, -0.039357f, -0.028657f, -0.005645f, -0.007787f, 0.017157f, 0.021355f, 0.009759f, 0.008597f, -0.050738f, 0.099262f, 0.042986f, 0.045836f, -0.121506f, 0.025123f, -0.169516f, -0.037006f, 0.000168f, 0.024636f, 0.010431f, -0.108484f, 0.059718f, -0.029704f, -0.018999f, -0.020010f, -0.022558f, -0.026231f, -0.033084f, 0.071892f, -0.019784f, -0.060885f, 0.020237f, -0.016910f, 0.008163f, 0.034889f, -0.068631f, -0.024357f, -0.003610f, 0.029494f, 0.003650f, 0.078991f, -0.006006f, -0.044529f, 0.104398f, -0.087365f, 0.051984f, -0.080998f, -0.026236f, 0.040116f, -0.065431f, 0.005231f, 0.048641f, -0.024630f, -0.005000f, -0.004542f, 0.062444f, 0.094564f, 0.055212f, -0.031319f, -0.012322f, -0.014357f, 0.006703f, 0.030616f, -0.011748f, -0.018382f, 0.019061f, 0.010055f, -0.170016f, -0.006536f, -0.005568f, 0.025190f, 0.021978f, 0.001441f, 0.001036f, 0.048899f, -0.052987f, -0.013503f, -0.004471f, 0.037325f, -0.136318f, -0.018926f, 0.124672f, -0.031468f, -0.049201f, -0.000174f, 0.094544f, -0.016992f, + -0.021660f, 0.025802f, -0.036131f, -0.038389f, 0.058708f, 0.089942f, -0.031709f, -0.045344f, 0.016245f, 0.027128f, -0.013434f, -0.047832f, -0.000237f, 0.007191f, -0.008994f, -0.006786f, -0.014250f, -0.020724f, 0.010621f, 0.000877f, -0.018444f, -0.003281f, 0.000045f, -0.000523f, -0.016929f, 0.010379f, -0.022929f, -0.024984f, -0.013929f, -0.015214f, 0.024081f, -0.003247f, -0.004114f, -0.000409f, -0.012479f, 0.019361f, -0.024367f, 0.007376f, 0.001525f, 0.001912f, 0.018270f, -0.000736f, -0.029421f, 0.003545f, -0.007166f, 0.005738f, 0.004964f, -0.027174f, 0.043702f, -0.011262f, -0.003214f, -0.004107f, 0.004788f, 0.010860f, -0.000137f, -0.010044f, -0.004687f, -0.021555f, -0.040341f, -0.123822f, -0.101486f, 0.090954f, 0.077741f, 0.008194f, 0.082977f, -0.088427f, -0.004204f, -0.171598f, -0.060300f, -0.029653f, 0.084541f, 0.076969f, 0.047614f, -0.068568f, -0.022904f, -0.002181f, -0.032123f, 0.017245f, 0.031223f, 0.040104f, 0.053415f, -0.039123f, 0.030387f, -0.073803f, -0.046213f, -0.010986f, -0.014854f, 0.002811f, 0.050435f, -0.058112f, 0.051930f, -0.021959f, -0.031700f, -0.012218f, 0.005846f, -0.073186f, + -0.000568f, -0.066191f, -0.023934f, -0.025230f, -0.062588f, 0.088326f, 0.041294f, 0.020658f, 0.022502f, -0.016168f, -0.088185f, -0.131553f, -0.076221f, -0.077061f, 0.053934f, 0.013380f, 0.058051f, 0.080146f, 0.066558f, -0.020684f, 0.016835f, -0.044961f, -0.033967f, -0.041017f, 0.033898f, -0.043524f, -0.000964f, -0.041514f, -0.042528f, -0.026763f, 0.052706f, -0.040804f, -0.010530f, 0.004881f, -0.004754f, -0.059180f, -0.063275f, -0.038395f, -0.021925f, -0.086171f, -0.050502f, 0.013799f, 0.053476f, 0.055240f, 0.070800f, -0.003907f, -0.055558f, -0.072883f, -0.055354f, 0.029451f, 0.010432f, -0.008516f, 0.035083f, 0.086384f, 0.023990f, 0.023464f, -0.020495f, -0.015722f, -0.027030f, -0.016691f, -0.007887f, -0.026801f, -0.005105f, 0.033065f, -0.005775f, -0.013905f, -0.025225f, -0.028896f, -0.031886f, -0.009400f, 0.017386f, -0.008448f, 0.008168f, 0.004409f, -0.058417f, 0.006841f, -0.027189f, 0.025341f, 0.049238f, -0.023823f, 0.034409f, -0.003900f, 0.009359f, 0.001416f, -0.045936f, -0.007245f, -0.014102f, -0.012024f, 0.007974f, -0.000688f, -0.003965f, -0.009921f, -0.020183f, -0.027813f, 0.042273f, -0.028218f, + -0.187015f, -0.253146f, -0.239310f, -0.227573f, -0.272785f, -0.046196f, -0.076033f, 0.047586f, 0.076103f, 0.242885f, 0.155596f, 0.205833f, 0.283671f, 0.312246f, 0.212703f, 0.271205f, 0.153807f, 0.071526f, -0.011798f, -0.051618f, -0.070292f, -0.115326f, -0.113611f, -0.156205f, -0.066798f, -0.057791f, -0.147445f, -0.109860f, -0.105724f, -0.119577f, -0.194794f, -0.132450f, -0.102643f, -0.082047f, -0.150181f, -0.021219f, -0.045736f, -0.062416f, -0.145494f, -0.133769f, -0.111063f, -0.094387f, -0.069386f, -0.028117f, -0.092935f, 0.026246f, 0.046504f, -0.072175f, 0.079434f, 0.111667f, 0.106386f, 0.194957f, 0.157450f, 0.121970f, 0.133290f, 0.135112f, 0.133066f, 0.205100f, 0.229766f, 0.226851f, 0.154111f, 0.244705f, 0.240506f, 0.251776f, 0.254861f, 0.290766f, 0.256888f, 0.272570f, 0.360458f, 0.184517f, 0.185045f, 0.188886f, 0.174688f, -0.008289f, 0.079087f, 0.101231f, -0.059296f, -0.031169f, -0.101244f, -0.183118f, -0.167202f, -0.174984f, -0.316849f, -0.231406f, -0.142231f, -0.246532f, -0.262550f, -0.215403f, -0.231114f, -0.227239f, -0.274540f, -0.250088f, -0.254167f, -0.236302f, -0.222186f, -0.201027f, + -0.187816f, -0.186292f, -0.156519f, -0.130305f, -0.208167f, -0.031123f, -0.094404f, -0.106329f, -0.025544f, -0.012703f, -0.106093f, -0.012669f, -0.041882f, -0.014366f, 0.037081f, 0.046991f, 0.119951f, 0.072848f, 0.100043f, 0.113465f, 0.121069f, 0.112156f, 0.153805f, 0.152498f, 0.159823f, 0.151592f, 0.179139f, 0.186620f, 0.180636f, 0.148480f, 0.188972f, 0.201368f, 0.153850f, 0.106077f, 0.099985f, 0.062970f, 0.051903f, 0.016155f, -0.007736f, -0.004245f, -0.034175f, -0.027731f, -0.023780f, -0.011008f, -0.030327f, -0.029224f, -0.030186f, -0.011138f, -0.030041f, -0.034601f, -0.022386f, -0.004347f, -0.025947f, -0.031706f, -0.028054f, -0.019646f, -0.039022f, -0.044231f, -0.046952f, -0.029867f, -0.028428f, -0.032507f, -0.029726f, -0.003004f, -0.007689f, -0.017746f, -0.012273f, 0.001337f, -0.006065f, -0.010560f, -0.010266f, 0.001583f, -0.006436f, -0.011659f, -0.013764f, -0.005439f, -0.008583f, -0.002775f, -0.005258f, -0.006961f, -0.011002f, 0.001979f, 0.005593f, 0.004462f, -0.001088f, 0.003215f, 0.001288f, 0.005132f, 0.002958f, 0.007608f, 0.006671f, 0.008079f, -0.002742f, -0.002499f, -0.004097f, -0.001921f, + -0.009932f, -0.010104f, -0.010686f, -0.010928f, -0.017534f, -0.012837f, -0.012586f, -0.008783f, -0.015198f, -0.014622f, -0.014858f, -0.009158f, -0.011390f, -0.012909f, -0.009353f, -0.001163f, -0.001988f, -0.003185f, 0.001346f, 0.007897f, 0.005835f, 0.005788f, 0.005684f, 0.009736f, 0.010895f, 0.011272f, 0.009293f, 0.011811f, 0.012279f, 0.011303f, 0.010902f, 0.011428f, 0.010811f, 0.009050f, 0.006884f, 0.006749f, 0.005292f, 0.004182f, 0.002212f, 0.001881f, 0.001094f, 0.000807f, 0.000156f, 0.000102f, -0.000032f, -0.000148f}, + {-0.011664f, 0.014943f, -0.001061f, 0.006070f, 0.003095f, 0.007134f, -0.012526f, -0.006724f, 0.008174f, 0.004000f, 0.000165f, -0.006926f, 0.001513f, -0.019477f, -0.012518f, -0.000597f, -0.007432f, -0.008408f, 0.003561f, 0.015371f, 0.002639f, 0.011725f, -0.002623f, 0.011589f, -0.006797f, -0.006047f, -0.000694f, -0.010299f, 0.002133f, 0.005247f, -0.003683f, -0.000167f, 0.002766f, 0.000574f, 0.004755f, -0.000472f, -0.011045f, 0.004061f, -0.006821f, -0.005109f, 0.003186f, -0.006761f, -0.010304f, 0.010402f, -0.010816f, 0.009903f, 0.009231f, 0.006120f, -0.000434f, -0.012684f, -0.007372f, 0.001518f, -0.002356f, 0.016510f, -0.010006f, 0.004077f, -0.001248f, 0.002252f, -0.012386f, -0.020684f, -0.003617f, -0.006155f, -0.006884f, -0.001557f, 0.008817f, -0.001827f, -0.009320f, 0.008290f, 0.003530f, -0.004087f, 0.006900f, -0.001264f, 0.002096f, -0.009481f, -0.000751f, -0.002311f, -0.000121f, 0.003735f, -0.004344f, 0.003040f, -0.008712f, 0.005976f, -0.001343f, 0.000700f, -0.003170f, -0.002819f, 0.000055f, 0.003658f, 0.001329f, -0.000052f, 0.001393f, 0.000008f, -0.005251f, 0.001594f, 0.000437f, 0.003382f, + -0.000526f, 0.000187f, -0.000009f, 0.000150f, -0.000332f, -0.001814f, 0.008062f, 0.008043f, 0.001213f, 0.014434f, -0.000078f, 0.006285f, 0.007792f, -0.000002f, -0.006919f, 0.000825f, -0.009866f, -0.012647f, -0.004756f, -0.014424f, -0.014906f, -0.004786f, 0.009928f, -0.003426f, -0.003337f, -0.007707f, -0.001900f, -0.013547f, 0.006742f, -0.003725f, 0.003441f, 0.008288f, 0.002849f, -0.002774f, 0.005700f, 0.005440f, -0.006591f, 0.004728f, 0.000682f, 0.001339f, 0.005058f, -0.011798f, -0.005071f, 0.008536f, -0.005341f, -0.000288f, -0.003375f, 0.009464f, -0.011929f, -0.000889f, -0.009983f, 0.006621f, -0.000538f, -0.000627f, 0.009131f, -0.003810f, -0.004303f, -0.003023f, -0.008425f, 0.000721f, -0.003787f, -0.000558f, 0.000614f, 0.005888f, 0.005916f, 0.002093f, -0.002555f, -0.009891f, -0.016327f, -0.004957f, -0.001091f, -0.003925f, 0.008847f, -0.003428f, -0.005004f, 0.007151f, -0.004483f, -0.006899f, 0.015583f, -0.003251f, -0.008653f, -0.000653f, 0.001465f, -0.002476f, 0.007702f, -0.000863f, -0.006817f, 0.000233f, 0.000335f, -0.001344f, -0.002032f, 0.006232f, 0.001407f, 0.000997f, -0.003608f, 0.000897f, + -0.001081f, 0.000553f, 0.002403f, -0.000392f, 0.001372f, 0.002972f, 0.000379f, -0.000429f, -0.000589f, 0.001345f, -0.003437f, -0.001144f, -0.000675f, -0.001445f, 0.001452f, 0.001342f, -0.000554f, 0.016551f, -0.010683f, -0.005090f, -0.007755f, 0.006085f, 0.001104f, -0.000843f, 0.011917f, 0.002790f, 0.003430f, -0.017504f, 0.003123f, -0.008215f, -0.009532f, -0.012372f, -0.000285f, 0.000349f, 0.014494f, -0.012007f, 0.005433f, -0.005091f, 0.017944f, -0.006595f, -0.006051f, 0.012729f, -0.004982f, 0.004330f, 0.001859f, -0.000948f, 0.002044f, -0.008697f, 0.001324f, 0.000307f, 0.003564f, 0.016842f, 0.005833f, 0.001482f, -0.007305f, 0.005827f, -0.013235f, -0.003755f, -0.002589f, 0.007108f, 0.006097f, 0.010132f, 0.006648f, -0.007779f, -0.011353f, -0.005031f, 0.008562f, -0.001165f, 0.004416f, -0.001922f, -0.001306f, 0.017114f, 0.004004f, -0.001416f, -0.020615f, -0.009280f, 0.000479f, 0.007040f, 0.010946f, 0.015366f, 0.008617f, -0.003851f, 0.002724f, -0.003907f, -0.005309f, 0.010990f, -0.007046f, 0.011317f, 0.000475f, -0.010442f, 0.003677f, -0.005440f, 0.008881f, -0.007783f, -0.000919f, 0.007636f, + 0.008863f, -0.009052f, -0.003464f, -0.001807f, -0.003696f, 0.005237f, -0.001237f, -0.003946f, 0.002438f, 0.001164f, 0.001327f, 0.001374f, 0.002125f, 0.001036f, 0.001259f, 0.000439f, -0.000672f, -0.000914f, -0.003333f, 0.005004f, -0.000225f, 0.000169f, 0.000565f, -0.000063f, 0.000796f, 0.002602f, 0.002650f, -0.000268f, -0.000720f, 0.003275f, 0.002590f, -0.000356f, 0.002163f, 0.008807f, -0.002012f, -0.001387f, -0.003142f, -0.010143f, 0.000478f, 0.007413f, 0.007393f, 0.013750f, 0.006352f, -0.017888f, -0.014918f, -0.012948f, 0.000624f, -0.002136f, 0.001039f, -0.007023f, -0.004320f, -0.001036f, 0.005540f, -0.000007f, -0.011418f, 0.012499f, -0.001687f, -0.011488f, 0.002456f, 0.002792f, -0.000145f, -0.001047f, 0.005091f, 0.006645f, -0.004027f, 0.010123f, 0.000594f, 0.005954f, -0.013628f, 0.009821f, 0.003569f, 0.005686f, -0.009348f, -0.000982f, 0.007004f, 0.005964f, 0.015087f, -0.000507f, -0.020597f, -0.005609f, -0.009813f, 0.004901f, 0.003455f, -0.000808f, -0.005423f, 0.001629f, -0.008384f, -0.002961f, -0.015351f, -0.009052f, -0.000415f, 0.008651f, 0.009712f, -0.006892f, -0.005829f, -0.006036f, + 0.009981f, -0.003331f, -0.001106f, -0.014805f, 0.009056f, -0.014613f, -0.004976f, -0.000602f, -0.002985f, -0.003947f, 0.015698f, -0.001296f, -0.003508f, -0.004142f, 0.003208f, -0.009366f, 0.001199f, -0.016264f, -0.012976f, 0.004797f, -0.004451f, -0.002410f, 0.005942f, -0.002928f, 0.007889f, 0.001551f, 0.003691f, 0.005488f, -0.001337f, 0.002659f, 0.001910f, 0.001025f, -0.001021f, 0.002013f, 0.000936f, 0.000505f, -0.001082f, -0.001272f, 0.000450f, -0.004764f, 0.000043f, 0.003002f, 0.000851f, -0.000180f, 0.000703f, -0.002926f, -0.000811f, 0.001790f, 0.001109f, 0.004797f, 0.001400f, -0.000598f, -0.000618f, 0.004417f, -0.005142f, 0.007910f, -0.005892f, 0.000270f, 0.010813f, 0.019484f, 0.013552f, 0.003120f, -0.014795f, -0.011025f, 0.004292f, -0.002316f, -0.009399f, -0.002899f, -0.012181f, -0.005076f, 0.025230f, 0.003159f, -0.002412f, -0.004380f, 0.000263f, -0.005539f, -0.003773f, 0.017165f, -0.017281f, -0.001791f, 0.001976f, -0.003471f, 0.004643f, 0.010495f, -0.004452f, -0.005490f, 0.002826f, -0.006896f, -0.006763f, -0.016013f, -0.005796f, 0.004675f, -0.014350f, -0.002159f, 0.007478f, 0.011279f, + 0.004148f, -0.022595f, -0.006669f, 0.004890f, 0.011771f, -0.008686f, 0.020142f, -0.002026f, -0.009870f, -0.005341f, -0.004077f, -0.007569f, 0.011053f, -0.007795f, -0.001928f, -0.010387f, -0.008156f, -0.003621f, -0.008298f, 0.011747f, -0.003984f, -0.022636f, 0.008990f, 0.015701f, 0.000432f, 0.005872f, -0.027656f, 0.022070f, 0.000619f, -0.017969f, 0.002069f, -0.012034f, -0.002397f, 0.002248f, -0.013046f, -0.015249f, 0.010561f, 0.005154f, -0.013260f, -0.000603f, 0.000555f, -0.008022f, -0.000836f, -0.002762f, 0.002292f, -0.007080f, -0.003606f, -0.001142f, -0.003473f, -0.001551f, -0.005232f, 0.002112f, -0.000153f, 0.003126f, -0.005709f, 0.001721f, 0.003546f, 0.000248f, -0.003159f, 0.002499f, -0.003061f, 0.003440f, 0.002732f, -0.002168f, 0.002669f, -0.000124f, -0.001529f, -0.000466f, 0.001059f, 0.001535f, 0.000912f, 0.000880f, -0.020353f, 0.004938f, -0.014911f, 0.016526f, 0.004420f, -0.005884f, -0.011984f, -0.021193f, -0.009059f, -0.015259f, 0.005657f, 0.030365f, 0.005414f, -0.007489f, -0.000170f, -0.003795f, -0.004341f, -0.013212f, -0.008620f, -0.013610f, 0.004065f, -0.000713f, 0.003349f, -0.004541f, + 0.002601f, -0.014393f, -0.000725f, 0.003716f, -0.009735f, -0.003345f, 0.001548f, -0.005115f, 0.001728f, -0.004678f, 0.022475f, -0.026770f, -0.004553f, 0.002556f, 0.007573f, -0.002442f, -0.010869f, -0.016276f, -0.011529f, 0.009286f, -0.002105f, 0.010264f, -0.008178f, 0.026082f, 0.003637f, -0.004619f, 0.000013f, -0.014906f, -0.019269f, -0.009493f, 0.007670f, -0.016299f, -0.000749f, 0.019960f, -0.000286f, -0.008896f, -0.018331f, -0.031049f, 0.001562f, 0.016506f, -0.004210f, 0.018887f, -0.001422f, -0.005415f, -0.011359f, -0.009883f, 0.002051f, 0.007737f, -0.005680f, 0.027228f, 0.008353f, -0.008229f, 0.004373f, -0.010637f, 0.004294f, 0.005470f, -0.003454f, 0.006215f, 0.011111f, 0.005024f, 0.000733f, -0.006803f, -0.019501f, 0.001733f, -0.004260f, -0.001580f, -0.002793f, 0.001831f, 0.000638f, 0.000158f, -0.008511f, 0.001795f, -0.004797f, 0.002060f, -0.004727f, -0.001212f, -0.001090f, -0.000024f, -0.000255f, -0.000521f, -0.003353f, -0.002734f, -0.003695f, -0.005262f, -0.005890f, -0.002095f, 0.000481f, 0.002045f, -0.003018f, 0.000356f, 0.000345f, 0.001047f, -0.002267f, 0.002618f, -0.004097f, -0.000167f, + 0.017480f, -0.007908f, -0.020574f, -0.005738f, -0.015412f, -0.008086f, -0.006796f, 0.021466f, -0.005611f, -0.007383f, -0.009307f, 0.013754f, 0.012298f, 0.010894f, 0.030298f, 0.031813f, 0.014595f, 0.019730f, -0.007680f, -0.009312f, 0.013004f, 0.019473f, -0.008717f, 0.008499f, 0.005836f, -0.017125f, -0.016326f, 0.009406f, -0.002583f, -0.000311f, -0.016299f, -0.020515f, -0.005089f, -0.016644f, 0.018501f, 0.034928f, 0.006996f, 0.013734f, 0.003788f, -0.004201f, 0.012270f, -0.023998f, -0.006638f, 0.004901f, 0.013083f, -0.007948f, -0.019569f, 0.028142f, -0.000308f, -0.008728f, -0.007150f, 0.011515f, -0.003718f, 0.010262f, -0.007316f, 0.016142f, -0.001621f, -0.000474f, 0.019741f, 0.006172f, 0.008961f, 0.003551f, -0.003321f, 0.014903f, -0.023037f, -0.009168f, 0.008240f, 0.025719f, -0.015947f, -0.001857f, -0.003478f, -0.003661f, -0.011022f, -0.002395f, -0.005859f, -0.007410f, -0.001346f, 0.001709f, 0.006984f, -0.003047f, 0.020378f, 0.007518f, -0.012170f, -0.002877f, 0.001242f, 0.007884f, 0.002488f, -0.003595f, -0.007472f, -0.001567f, 0.004255f, -0.004608f, -0.004352f, -0.003523f, 0.003918f, 0.002649f, + 0.003861f, 0.002194f, -0.004138f, -0.001496f, -0.000210f, -0.003826f, -0.001002f, 0.003027f, 0.001521f, -0.000452f, -0.004617f, 0.005674f, -0.001122f, 0.003545f, -0.002736f, 0.001759f, -0.005322f, -0.000443f, -0.001091f, 0.000281f, -0.003676f, -0.001053f, 0.012619f, -0.012653f, -0.004987f, 0.011376f, -0.009100f, 0.004843f, 0.008549f, -0.017221f, -0.018349f, 0.005062f, 0.013857f, -0.004893f, 0.012641f, -0.009421f, -0.004208f, 0.024150f, -0.027651f, 0.016459f, -0.007945f, 0.000047f, 0.000644f, 0.029849f, -0.006767f, 0.005773f, 0.009446f, 0.016374f, 0.009578f, 0.014323f, -0.002497f, -0.002487f, 0.004641f, 0.002169f, 0.002324f, -0.014646f, 0.022426f, -0.030187f, -0.006693f, -0.008070f, 0.016690f, -0.003549f, 0.020359f, -0.001110f, 0.001850f, -0.035896f, -0.009879f, 0.021606f, 0.036952f, -0.000513f, -0.018449f, -0.015657f, 0.015138f, 0.012054f, 0.009131f, 0.008548f, -0.015819f, -0.007391f, -0.009183f, 0.004629f, 0.000610f, -0.009863f, 0.005644f, 0.004790f, -0.004574f, -0.005143f, -0.021612f, -0.005872f, -0.007961f, 0.030626f, 0.002775f, 0.005619f, 0.011637f, 0.000735f, -0.024169f, 0.001011f, + -0.014566f, 0.011853f, 0.028735f, -0.015450f, 0.008862f, -0.004586f, -0.014967f, 0.007024f, -0.012549f, -0.002365f, 0.005197f, 0.003670f, 0.006563f, 0.002578f, -0.001064f, -0.005677f, 0.006214f, 0.013283f, 0.002252f, 0.006476f, 0.011083f, 0.004730f, 0.012536f, -0.004002f, 0.011860f, 0.000381f, 0.000276f, 0.002370f, 0.001327f, 0.003192f, -0.000360f, -0.006053f, -0.003239f, 0.000029f, 0.003188f, 0.003121f, -0.002267f, 0.005525f, 0.005467f, -0.004817f, 0.007727f, 0.013254f, -0.022143f, -0.008372f, -0.008182f, 0.004504f, -0.001053f, 0.033549f, -0.003950f, 0.001408f, 0.021374f, -0.018608f, -0.013464f, -0.017429f, -0.018281f, -0.004244f, -0.000454f, 0.008564f, 0.035848f, -0.003016f, -0.020283f, 0.037137f, 0.000827f, 0.010567f, 0.025433f, 0.017635f, 0.023749f, -0.005911f, 0.018805f, -0.011759f, 0.024848f, 0.021786f, -0.005629f, 0.011471f, -0.009706f, -0.008959f, 0.009513f, 0.028442f, 0.012903f, 0.011394f, 0.004197f, -0.008750f, -0.015377f, -0.015610f, 0.002774f, 0.019634f, -0.011084f, -0.013334f, -0.016486f, -0.006089f, -0.032874f, -0.007512f, 0.006535f, -0.024056f, 0.011944f, 0.001973f, + -0.010895f, -0.028298f, -0.018892f, 0.000276f, -0.037671f, 0.012112f, 0.008569f, -0.000599f, 0.010736f, 0.007099f, -0.003509f, -0.019485f, -0.011765f, -0.001986f, -0.012315f, 0.011895f, -0.012915f, 0.031590f, -0.020931f, 0.001352f, 0.013947f, 0.001449f, -0.009262f, -0.035946f, 0.006482f, 0.017969f, 0.004470f, 0.001272f, 0.019800f, 0.011062f, -0.011074f, 0.000248f, -0.001135f, 0.001704f, -0.000628f, -0.006020f, -0.012574f, -0.003572f, -0.013600f, 0.001008f, 0.003616f, 0.001920f, -0.003396f, -0.006881f, -0.003129f, -0.004514f, 0.006152f, 0.002044f, 0.007996f, 0.005819f, 0.004665f, 0.001967f, -0.000478f, -0.002471f, -0.002254f, -0.005996f, 0.003042f, 0.000650f, 0.003030f, -0.002772f, -0.000249f, -0.004977f, 0.000499f, -0.003839f, 0.001779f, -0.046287f, 0.016180f, 0.021055f, 0.037086f, -0.000165f, -0.027641f, 0.007730f, 0.013238f, -0.028619f, -0.029755f, -0.018620f, -0.000785f, 0.015804f, -0.000870f, -0.011690f, -0.000657f, -0.010236f, -0.006901f, -0.018470f, 0.030703f, 0.023963f, 0.008998f, -0.037762f, -0.011342f, 0.006011f, -0.002188f, -0.008450f, 0.047693f, 0.017437f, 0.014961f, 0.013998f, + 0.022620f, 0.016949f, 0.004106f, 0.017748f, -0.001247f, -0.029683f, 0.016005f, -0.030533f, 0.009285f, -0.030229f, 0.025464f, -0.008030f, 0.030755f, -0.016847f, 0.007456f, -0.013636f, 0.011073f, 0.017956f, 0.046962f, 0.009883f, -0.059763f, -0.003214f, -0.008332f, 0.012780f, 0.026090f, -0.005334f, -0.011618f, 0.019137f, -0.003404f, -0.009469f, 0.025704f, 0.001582f, -0.001151f, 0.001257f, 0.011005f, 0.020523f, 0.016283f, -0.017727f, -0.013149f, -0.011201f, -0.017940f, 0.004158f, -0.001663f, 0.020290f, 0.014615f, -0.027488f, -0.006620f, -0.015570f, 0.013316f, -0.007604f, -0.007330f, 0.004759f, 0.000895f, -0.010617f, 0.009072f, 0.002169f, 0.001512f, -0.001604f, 0.005163f, 0.005299f, 0.000858f, -0.015576f, 0.004346f, 0.002673f, -0.001988f, -0.002780f, -0.005156f, 0.000160f, -0.006900f, 0.003167f, 0.007807f, -0.002409f, -0.002304f, 0.007613f, 0.001208f, -0.007168f, -0.005455f, -0.001321f, 0.003740f, -0.003143f, -0.000728f, -0.004422f, 0.001193f, -0.002968f, 0.000054f, 0.007318f, -0.004906f, 0.001156f, 0.050440f, -0.018983f, -0.033452f, -0.010587f, 0.013206f, -0.008204f, 0.024294f, 0.035096f, + -0.013978f, 0.032194f, 0.020763f, 0.016227f, -0.005200f, -0.003783f, -0.006364f, 0.031228f, 0.005802f, 0.003837f, -0.018021f, 0.007977f, -0.009364f, -0.000711f, -0.029831f, 0.020375f, -0.027363f, 0.000208f, -0.019266f, 0.032567f, -0.016485f, 0.000807f, 0.032216f, 0.024480f, 0.016616f, -0.001883f, -0.012617f, 0.014999f, -0.000342f, -0.002805f, -0.040860f, -0.012094f, -0.024627f, -0.020036f, -0.015568f, -0.007324f, 0.021447f, 0.013471f, 0.012565f, 0.000130f, 0.031505f, -0.016536f, 0.033332f, 0.029260f, 0.031451f, 0.054847f, -0.021030f, -0.016446f, 0.024226f, 0.004612f, -0.021104f, 0.033125f, -0.010724f, -0.015878f, 0.010873f, -0.004010f, -0.011310f, -0.009383f, 0.014345f, -0.019090f, 0.008844f, -0.011799f, 0.030505f, -0.012837f, 0.000628f, 0.008935f, 0.022286f, 0.030157f, 0.002563f, -0.026198f, -0.028391f, 0.009404f, -0.018864f, -0.061181f, -0.032089f, 0.009847f, -0.000539f, 0.017789f, 0.002417f, -0.009972f, -0.001011f, -0.005760f, 0.002755f, -0.010555f, -0.004523f, -0.007223f, -0.002916f, 0.000908f, -0.001169f, -0.019062f, -0.004873f, -0.012460f, -0.011104f, -0.008769f, 0.004043f, -0.000816f, + 0.000931f, -0.013859f, -0.009560f, -0.000452f, -0.000381f, 0.002790f, 0.007334f, 0.005973f, 0.004534f, -0.009950f, 0.000639f, 0.002361f, -0.012813f, 0.004642f, 0.000915f, 0.005716f, 0.002715f, 0.007272f, 0.004206f, -0.002862f, 0.006237f, -0.004572f, -0.003316f, -0.001353f, -0.046193f, -0.038929f, -0.001157f, 0.009099f, -0.026340f, 0.001963f, 0.003158f, 0.044409f, -0.027711f, -0.031814f, 0.011317f, -0.012969f, 0.000707f, -0.023043f, 0.023433f, -0.023424f, -0.031638f, -0.018845f, 0.038202f, -0.024785f, -0.020107f, -0.004054f, 0.015962f, -0.010444f, -0.026097f, 0.009085f, -0.010117f, 0.000910f, 0.012982f, -0.034674f, -0.001910f, 0.020372f, 0.032291f, -0.004040f, 0.048957f, 0.021882f, -0.004732f, 0.002893f, 0.022680f, -0.008276f, -0.018836f, 0.004469f, 0.026871f, 0.003660f, 0.013297f, 0.001337f, -0.020616f, 0.008141f, -0.046171f, 0.005023f, 0.003315f, -0.005228f, -0.026880f, -0.024345f, 0.003813f, -0.010696f, -0.018215f, -0.011962f, -0.014514f, 0.018718f, -0.030146f, -0.016892f, -0.008146f, 0.014205f, -0.017420f, 0.038661f, -0.004938f, -0.031105f, -0.001991f, -0.018212f, -0.049773f, -0.014362f, + 0.004115f, -0.000782f, -0.032065f, -0.016776f, -0.006725f, 0.008242f, -0.018743f, -0.008928f, 0.033168f, -0.010766f, -0.043442f, -0.014796f, 0.006497f, 0.004147f, 0.015305f, 0.013055f, 0.009944f, -0.009508f, -0.012071f, -0.002295f, -0.008199f, 0.007222f, 0.002722f, -0.004900f, 0.010242f, 0.004716f, 0.006343f, -0.003049f, 0.005339f, 0.004192f, 0.000755f, -0.001107f, -0.002491f, -0.003327f, 0.000865f, 0.003345f, -0.014932f, 0.004151f, -0.008257f, 0.010887f, 0.004529f, -0.010841f, -0.009506f, -0.000111f, -0.007358f, -0.000404f, 0.004112f, -0.002156f, -0.004707f, -0.007831f, -0.005758f, 0.005341f, 0.002482f, -0.008970f, 0.004450f, 0.001816f, -0.005696f, -0.004730f, -0.010370f, 0.035342f, 0.031543f, 0.009090f, 0.065104f, -0.012711f, -0.023396f, -0.021064f, -0.010090f, -0.035879f, 0.047278f, -0.029151f, -0.010897f, -0.023725f, -0.012401f, -0.011457f, 0.005195f, -0.034183f, 0.000095f, -0.000196f, -0.005056f, 0.008961f, -0.035939f, -0.009624f, 0.023967f, -0.024799f, 0.000935f, -0.031921f, 0.029664f, -0.000440f, -0.053758f, -0.028325f, -0.010035f, -0.001779f, 0.014485f, -0.033062f, -0.018530f, 0.021614f, + -0.004149f, 0.014721f, 0.013813f, 0.013297f, -0.019779f, 0.001501f, 0.023298f, 0.008053f, -0.044373f, 0.027727f, 0.020217f, -0.024507f, 0.067393f, -0.001893f, -0.048856f, 0.012777f, 0.015080f, -0.001752f, 0.035861f, -0.011749f, -0.060599f, 0.016342f, 0.008414f, 0.017402f, 0.021190f, -0.028273f, 0.043444f, 0.015747f, 0.013368f, -0.011072f, 0.065924f, -0.005770f, 0.000948f, 0.044427f, -0.007893f, 0.019879f, 0.035549f, 0.011532f, 0.005166f, -0.009295f, 0.017016f, 0.000015f, 0.030060f, -0.014002f, 0.029267f, 0.026232f, 0.001522f, 0.025939f, 0.015863f, 0.020508f, -0.010937f, -0.000824f, 0.024309f, 0.016825f, 0.013027f, 0.007084f, 0.008280f, -0.016894f, -0.001948f, -0.000007f, -0.007571f, 0.000218f, -0.002768f, -0.007709f, 0.014114f, -0.015338f, -0.002768f, -0.015074f, 0.012321f, -0.006901f, 0.014779f, -0.013429f, 0.002079f, -0.009622f, -0.012400f, 0.007779f, -0.004697f, -0.001192f, -0.012075f, -0.018911f, -0.013300f, 0.013045f, 0.001425f, -0.006655f, 0.001576f, 0.016430f, 0.012715f, -0.006193f, 0.006245f, -0.000720f, -0.004719f, 0.016976f, 0.000809f, 0.010770f, 0.013185f, -0.046839f, + -0.045962f, 0.094169f, 0.030364f, -0.058906f, -0.029621f, -0.027055f, -0.053916f, -0.004071f, -0.028462f, 0.039173f, -0.022202f, 0.000117f, 0.048936f, 0.000971f, 0.008123f, -0.036134f, 0.045126f, 0.033544f, -0.000591f, -0.010984f, -0.003520f, -0.028126f, 0.002132f, 0.003454f, 0.005732f, -0.038622f, -0.005596f, -0.002345f, -0.011577f, -0.008697f, -0.026527f, 0.025024f, 0.049846f, 0.059718f, -0.004846f, -0.024379f, -0.010081f, -0.012538f, -0.008350f, -0.036878f, 0.012540f, 0.014204f, 0.013223f, -0.038434f, -0.051044f, 0.055072f, 0.020916f, 0.030769f, 0.040181f, 0.037453f, -0.016242f, -0.025894f, 0.036375f, -0.037121f, 0.018820f, -0.027832f, -0.021131f, -0.012521f, 0.043282f, -0.014512f, 0.008870f, 0.014654f, -0.007778f, -0.035133f, 0.072331f, -0.043876f, 0.004591f, 0.052115f, -0.047252f, -0.021641f, 0.005687f, 0.018929f, 0.053912f, 0.009428f, -0.031071f, 0.000680f, 0.006690f, -0.007524f, -0.012962f, 0.007527f, -0.021706f, 0.016526f, -0.017938f, -0.025621f, 0.013857f, 0.007479f, 0.019523f, 0.008487f, -0.000540f, -0.009042f, 0.002360f, 0.005190f, 0.006155f, 0.020478f, -0.001008f, 0.002631f, + 0.013062f, -0.030898f, 0.004612f, -0.014057f, 0.003577f, 0.003173f, -0.004735f, -0.011857f, -0.014158f, -0.003772f, -0.014201f, 0.005404f, 0.008081f, 0.017451f, -0.001310f, -0.012127f, 0.011558f, 0.013455f, 0.008625f, 0.008114f, -0.021783f, 0.000487f, 0.005854f, -0.005762f, 0.019288f, -0.007419f, 0.001744f, 0.001719f, 0.017860f, -0.008673f, 0.005588f, 0.024426f, 0.024537f, -0.015650f, 0.015403f, 0.062816f, 0.037873f, -0.005636f, -0.040171f, 0.004244f, 0.064417f, 0.051296f, 0.010835f, -0.050927f, -0.019590f, -0.043963f, -0.003243f, 0.034468f, 0.042576f, -0.003086f, 0.016210f, 0.050591f, 0.053847f, 0.083523f, 0.084085f, -0.041928f, 0.018332f, -0.045278f, -0.008150f, -0.036698f, -0.013151f, 0.029002f, -0.006436f, 0.012719f, 0.011437f, -0.026064f, -0.019070f, 0.021355f, 0.023818f, 0.030875f, 0.021971f, -0.001000f, 0.022651f, 0.034077f, -0.017960f, 0.017281f, 0.020133f, 0.006024f, 0.019665f, 0.065163f, -0.048872f, -0.042081f, -0.009421f, 0.040286f, 0.038623f, -0.022856f, -0.000224f, 0.061867f, 0.050064f, -0.034972f, -0.023289f, 0.021300f, -0.042703f, 0.011959f, -0.020508f, -0.038743f, + 0.012620f, -0.045530f, 0.047451f, 0.017468f, 0.052556f, -0.021968f, -0.030605f, -0.059207f, -0.012743f, 0.019438f, -0.051852f, -0.044361f, -0.024240f, 0.023289f, 0.013837f, 0.011003f, -0.022784f, 0.010013f, -0.016277f, 0.006387f, 0.048354f, -0.020450f, 0.005766f, -0.027280f, 0.020823f, -0.011192f, -0.022884f, 0.016324f, 0.022632f, -0.012433f, -0.006370f, -0.007320f, 0.016289f, 0.036094f, -0.011414f, -0.024089f, 0.000644f, -0.000334f, -0.008844f, -0.003733f, -0.033420f, 0.004764f, -0.017698f, -0.007871f, 0.012279f, -0.010831f, -0.005836f, -0.000871f, -0.009165f, 0.014909f, -0.014598f, -0.023117f, -0.020921f, -0.017622f, 0.019015f, 0.010067f, -0.004169f, 0.008488f, 0.005777f, -0.014915f, -0.016277f, 0.006269f, -0.017360f, -0.001856f, -0.030175f, 0.023950f, 0.062296f, -0.004878f, -0.020339f, 0.039710f, 0.007527f, -0.003137f, -0.060882f, 0.051969f, -0.026851f, -0.057887f, -0.020196f, 0.003064f, 0.065004f, 0.005505f, 0.046357f, 0.018320f, -0.056644f, -0.012941f, -0.050273f, 0.007144f, -0.050112f, -0.036261f, -0.021969f, 0.001683f, 0.009575f, -0.039023f, 0.036719f, -0.012906f, 0.022003f, 0.023706f, + 0.023463f, 0.044709f, 0.082225f, 0.047913f, -0.016633f, -0.041639f, -0.002218f, 0.086610f, 0.053669f, -0.030567f, 0.042729f, -0.017570f, 0.052369f, -0.027211f, 0.004375f, -0.020573f, -0.010595f, -0.003781f, -0.015722f, 0.130571f, -0.025776f, -0.037066f, -0.042701f, -0.059753f, -0.023463f, -0.046238f, -0.002808f, 0.049967f, -0.021003f, 0.014191f, -0.017686f, -0.026716f, 0.045407f, -0.013654f, 0.077030f, 0.013611f, 0.061461f, -0.076835f, 0.030541f, 0.132754f, 0.047830f, -0.075298f, 0.043579f, 0.039809f, 0.001681f, 0.007816f, -0.023597f, 0.024643f, 0.116483f, 0.061551f, 0.025552f, 0.034764f, -0.037435f, 0.067065f, -0.007857f, 0.009638f, 0.010012f, 0.015964f, 0.007116f, 0.043848f, -0.037632f, -0.009991f, 0.002462f, 0.056122f, -0.010353f, 0.013177f, 0.065161f, -0.005962f, -0.037421f, -0.009251f, 0.023491f, 0.003232f, -0.016255f, -0.037941f, 0.020884f, 0.014749f, -0.026341f, -0.015797f, 0.016999f, -0.032207f, -0.026906f, 0.007754f, 0.012348f, -0.000856f, 0.008351f, 0.005438f, 0.009888f, -0.012266f, 0.010374f, -0.007755f, -0.010137f, 0.009531f, 0.003650f, 0.013473f, 0.002366f, 0.091431f, + 0.042763f, 0.010271f, -0.002735f, -0.099633f, 0.046589f, 0.062696f, -0.045015f, -0.032778f, 0.077486f, 0.050511f, -0.061838f, -0.065726f, 0.002413f, -0.038405f, 0.016829f, 0.006404f, 0.016072f, -0.061789f, 0.016262f, -0.011991f, -0.030687f, 0.054957f, -0.003714f, -0.009127f, 0.018582f, 0.046080f, 0.041511f, 0.028334f, -0.052784f, 0.001163f, -0.025693f, -0.056385f, 0.020673f, 0.015965f, 0.034864f, -0.011916f, -0.026169f, 0.072154f, -0.051675f, 0.022868f, 0.025197f, 0.020380f, 0.015626f, -0.008976f, 0.042784f, -0.039568f, -0.068181f, -0.011491f, -0.078117f, 0.068676f, 0.042351f, 0.067387f, -0.005308f, 0.013243f, -0.054284f, 0.056581f, 0.071530f, 0.025578f, -0.030215f, -0.080044f, -0.018260f, -0.105590f, 0.001698f, -0.019706f, -0.071444f, -0.060796f, 0.027951f, 0.004383f, 0.044184f, -0.034130f, 0.050631f, 0.042407f, -0.059746f, 0.012615f, -0.035628f, -0.010205f, -0.053956f, 0.006794f, 0.157700f, 0.039209f, 0.046385f, 0.057622f, 0.025917f, -0.044820f, -0.005975f, -0.000750f, 0.037556f, -0.008702f, 0.038592f, -0.017534f, -0.023494f, 0.000798f, -0.002489f, -0.044313f, 0.038178f, -0.007175f, + -0.010630f, -0.013862f, -0.030739f, 0.004279f, -0.014395f, -0.019941f, -0.028536f, -0.022820f, 0.014269f, -0.016542f, 0.013989f, 0.015469f, -0.010767f, -0.018628f, -0.024569f, 0.011157f, -0.004200f, 0.010365f, 0.038307f, 0.023450f, -0.000111f, -0.003394f, 0.012513f, 0.023505f, -0.023137f, 0.020693f, -0.023316f, -0.018026f, -0.012110f, -0.064241f, 0.026313f, 0.019768f, -0.030948f, 0.009125f, -0.016602f, -0.095954f, -0.026402f, 0.022210f, -0.012371f, 0.009238f, -0.054104f, 0.067662f, -0.091986f, 0.005979f, -0.067753f, 0.044960f, 0.049486f, 0.015452f, 0.041184f, 0.003585f, -0.045153f, 0.073548f, -0.036252f, 0.006754f, -0.000245f, -0.044066f, 0.069453f, 0.003833f, 0.016977f, 0.014441f, 0.020714f, 0.010720f, 0.051690f, 0.061524f, 0.019738f, 0.072069f, -0.064914f, -0.005923f, -0.001340f, 0.092449f, -0.019236f, 0.073508f, 0.040259f, 0.101400f, 0.018807f, -0.024242f, -0.033999f, 0.039692f, -0.077911f, 0.071269f, -0.044926f, -0.026773f, -0.013442f, 0.013583f, 0.053464f, -0.013816f, -0.100603f, -0.028591f, 0.159557f, 0.010925f, -0.102572f, 0.024035f, -0.068361f, 0.018950f, 0.157195f, -0.044590f, + -0.044660f, 0.109013f, -0.119963f, 0.058963f, 0.025970f, 0.034874f, 0.101947f, 0.064276f, -0.093007f, 0.111963f, 0.073186f, 0.002432f, 0.119233f, -0.050477f, -0.017680f, 0.086226f, 0.056392f, 0.009470f, 0.022354f, -0.001058f, -0.002217f, 0.009595f, 0.028917f, -0.027984f, 0.030631f, 0.031532f, -0.028002f, 0.013146f, 0.021060f, -0.039646f, -0.004515f, 0.013561f, -0.004528f, 0.006446f, 0.048250f, -0.000101f, 0.031867f, -0.018193f, -0.000391f, 0.022854f, -0.015712f, -0.013281f, -0.033061f, 0.004643f, 0.028670f, 0.018789f, 0.026974f, -0.052739f, 0.028282f, 0.033016f, 0.014687f, 0.005068f, 0.013378f, -0.003245f, 0.030220f, 0.054245f, 0.012908f, 0.025732f, 0.024646f, -0.013588f, -0.014983f, 0.025387f, -0.033225f, 0.012169f, 0.039174f, 0.053569f, 0.103057f, 0.050781f, -0.050761f, 0.065478f, 0.019051f, 0.058952f, -0.018138f, -0.112112f, 0.112076f, 0.096962f, 0.059439f, 0.184000f, -0.018051f, -0.156433f, -0.081061f, -0.074440f, 0.163435f, 0.119521f, 0.028464f, -0.011617f, -0.030698f, -0.109787f, -0.052250f, -0.036399f, -0.063047f, 0.165840f, 0.134928f, 0.187185f, 0.002902f, -0.216829f, + -0.336277f, -0.164995f, 0.186496f, 0.251114f, 0.257229f, 0.102599f, -0.214152f, -0.393858f, -0.241182f, -0.122809f, 0.180661f, 0.306592f, 0.174464f, 0.093763f, 0.025054f, -0.140248f, -0.187021f, -0.141045f, -0.010869f, 0.106920f, 0.219235f, 0.261073f, 0.046391f, 0.049951f, -0.208552f, -0.346649f, -0.184314f, 0.170673f, 0.288653f, 0.272402f, 0.170824f, -0.101852f, -0.335967f, -0.218886f, -0.281724f, -0.000366f, 0.191078f, 0.205166f, 0.103507f, -0.083423f, -0.176849f, -0.158175f, -0.123906f, 0.035273f, 0.117776f, 0.081390f, 0.238283f, 0.084672f, -0.053248f, -0.142222f, -0.052205f, 0.157404f, 0.232048f, 0.076953f, -0.008946f, -0.143259f, -0.028708f, -0.033224f, 0.091717f, 0.033421f, -0.023227f, -0.099345f, -0.029292f, 0.004249f, -0.015632f, -0.030641f, -0.006270f, 0.022065f, 0.049781f, 0.082719f, 0.040615f, -0.083676f, -0.073370f, -0.070006f, 0.016724f, 0.087196f, 0.098328f, 0.044373f, 0.010699f, -0.063769f, -0.026842f, -0.123923f, -0.108476f, -0.010398f, 0.032516f, 0.134168f, 0.203513f, 0.076314f, -0.070498f, -0.168396f, -0.208460f, -0.088459f, 0.164234f, 0.269745f, 0.186117f, 0.055701f, + -0.135395f, -0.222132f, -0.108023f, -0.001308f, 0.040816f, 0.039305f, 0.094788f, 0.047385f, 0.021453f, -0.056945f, -0.118908f, -0.090750f, 0.013207f, 0.059781f, 0.119345f, 0.055561f, 0.020595f, -0.022633f, -0.059490f, 0.070512f, 0.010855f, -0.100010f, 0.013833f, -0.025362f, -0.039634f, 0.031267f, -0.030156f, -0.011419f, -0.053094f, 0.004076f, -0.019708f, -0.039356f, 0.017101f, -0.003574f, 0.014489f, 0.007536f, 0.034514f, -0.031891f, -0.010079f, 0.011182f, 0.004689f, 0.016627f, -0.012999f, 0.034855f, -0.022769f, 0.024371f, 0.012103f, -0.009785f, -0.023964f, -0.009619f, -0.045815f, 0.052226f, -0.003529f, 0.002952f, -0.007772f, -0.010922f, 0.003927f, -0.000215f, 0.002446f, 0.021008f, 0.012898f, 0.000719f, 0.029761f, -0.023428f, 0.009976f, -0.022173f, 0.026871f, 0.017045f, -0.018295f, 0.014997f, -0.022585f, -0.025384f, -0.020500f, -0.039867f, -0.003359f, 0.032343f, -0.027150f, -0.054703f, -0.037340f, 0.004700f, 0.035234f, 0.002046f, 0.026520f, -0.051981f, -0.013019f, -0.004860f, -0.003889f, -0.050793f, -0.012136f, 0.003076f, 0.008509f, -0.017347f, 0.055205f, 0.023205f, -0.016775f, 0.051414f, + -0.004212f, -0.088291f, -0.003018f, -0.011726f, -0.007370f, 0.018598f, 0.012022f, 0.025137f, -0.027374f, 0.039837f, -0.065264f, 0.020336f, 0.012237f, -0.001456f, 0.000562f, -0.002965f, -0.003985f, 0.023407f, -0.003611f, 0.005230f, -0.009402f, 0.000350f, -0.018824f, 0.006266f, 0.000609f, 0.039802f, 0.000123f, 0.018391f, -0.017307f, 0.003507f, -0.008503f, -0.021352f, 0.007430f, 0.000807f, -0.010891f, 0.028825f, -0.004862f, -0.005717f, -0.010780f, 0.021540f, -0.007328f, -0.036664f, 0.008128f, -0.006107f, 0.012070f, -0.014784f, 0.001983f, -0.003260f, -0.023028f, 0.022930f, -0.020367f, 0.016260f, -0.019469f, 0.011910f, -0.001619f, -0.005868f, -0.011267f, -0.053700f, -0.088578f, -0.139600f, 0.005914f, 0.116588f, -0.043513f, -0.070350f, -0.075195f, -0.071066f, 0.015813f, 0.015631f, 0.134328f, -0.018590f, -0.018333f, -0.058679f, 0.007497f, 0.018785f, 0.042888f, -0.043944f, 0.023475f, -0.031774f, 0.053142f, 0.017366f, 0.017990f, 0.006984f, -0.031659f, -0.017014f, -0.020322f, -0.006325f, 0.019814f, -0.018944f, -0.016391f, 0.037539f, -0.032777f, -0.020352f, 0.031375f, -0.028361f, -0.009759f, -0.024260f, + -0.039727f, 0.014999f, 0.027578f, 0.005529f, 0.026043f, -0.037597f, -0.008811f, -0.000519f, 0.023088f, 0.028052f, 0.034938f, 0.002978f, -0.002630f, -0.056881f, -0.058125f, -0.021262f, -0.018213f, -0.012349f, 0.028062f, 0.037721f, 0.053408f, 0.006350f, -0.022997f, 0.053146f, -0.036622f, -0.016253f, 0.024365f, -0.015928f, 0.070024f, 0.004051f, -0.010540f, 0.012229f, -0.024261f, 0.020553f, 0.048819f, 0.039722f, -0.013180f, 0.015345f, -0.045504f, -0.029846f, -0.016265f, -0.010983f, 0.035468f, -0.003979f, 0.034657f, 0.009432f, -0.010109f, 0.004523f, 0.007020f, -0.039830f, 0.024963f, -0.029366f, 0.019529f, -0.013234f, -0.007427f, -0.001647f, 0.022969f, -0.020492f, 0.003593f, 0.004136f, 0.020186f, 0.034119f, -0.016169f, -0.004599f, -0.025815f, -0.010346f, 0.010222f, -0.010121f, 0.008323f, -0.007827f, -0.010009f, -0.018202f, -0.028286f, -0.015708f, 0.027615f, -0.010073f, 0.014081f, -0.018783f, -0.003506f, -0.001146f, -0.005139f, -0.016810f, -0.006806f, 0.002319f, -0.001069f, 0.000609f, 0.000963f, -0.025642f, -0.003339f, -0.005529f, -0.004474f, -0.000034f, -0.000618f, -0.000854f, 0.036651f, -0.090338f, + -0.211301f, -0.161442f, -0.018583f, 0.070019f, 0.182415f, 0.154051f, 0.147051f, 0.150207f, 0.099118f, 0.041821f, -0.054064f, -0.095887f, -0.183152f, -0.134896f, -0.132605f, -0.132155f, -0.082226f, 0.079890f, 0.107573f, 0.158134f, 0.121367f, 0.101749f, 0.033569f, 0.067906f, -0.015233f, -0.017463f, -0.021281f, -0.036997f, -0.069363f, -0.056739f, -0.116840f, -0.042463f, -0.092794f, -0.044116f, -0.021942f, 0.030495f, 0.006084f, 0.043591f, 0.010063f, 0.061010f, 0.044779f, 0.073783f, 0.097932f, 0.121772f, 0.077810f, 0.052394f, 0.086446f, 0.006795f, -0.029433f, -0.106671f, -0.125249f, -0.172153f, -0.153585f, -0.143450f, -0.055034f, -0.094107f, -0.049344f, 0.005910f, 0.025953f, 0.060958f, 0.116004f, 0.123809f, 0.138182f, 0.208939f, 0.117504f, 0.160112f, 0.110880f, 0.025432f, -0.017033f, -0.065410f, -0.167138f, -0.182574f, -0.174041f, -0.192870f, -0.141811f, -0.098711f, -0.079428f, -0.021554f, 0.040561f, 0.068296f, 0.086458f, 0.128941f, 0.136638f, 0.144193f, 0.135940f, 0.085007f, 0.059104f, 0.028347f, 0.002968f, -0.000157f, -0.041194f, -0.066949f, -0.097179f, -0.115194f, -0.122652f, -0.115701f, + -0.081611f, -0.036358f, -0.032980f, -0.012164f, 0.021573f, 0.058001f, 0.071777f, 0.136523f, 0.095891f, 0.076145f, 0.075634f, 0.027655f, -0.003369f, -0.019359f, -0.024401f, -0.025345f, -0.066338f, -0.059025f, -0.043170f, -0.044625f, -0.033161f, 0.004717f, 0.009966f, 0.013443f, -0.008312f, 0.022073f, 0.000262f, 0.026057f, 0.026099f, 0.009086f, -0.009565f, -0.000666f, 0.005252f, 0.004109f, 0.003645f, 0.012606f, 0.002155f, -0.005635f, -0.019762f, -0.003917f, 0.003695f, 0.000015f, 0.011181f, 0.009813f, -0.002745f, -0.001224f, -0.008950f, -0.005942f, -0.005260f, -0.002349f, -0.004557f, 0.003288f, -0.003248f, -0.001150f, -0.001771f, -0.003901f, -0.008110f, 0.000055f, -0.000865f, 0.005173f, 0.010098f, 0.008054f, 0.004739f, 0.007046f, 0.000345f, 0.000708f, 0.000617f, 0.001891f, -0.002106f, -0.001430f, -0.002733f, 0.000680f, -0.001073f, -0.003825f, -0.004646f, 0.000431f, 0.000304f, -0.000446f, -0.004153f, -0.004293f, -0.004500f, -0.004068f, -0.002445f, 0.002328f, 0.001982f, 0.003942f, 0.003922f, 0.003872f, 0.000242f, 0.002164f, 0.001531f, 0.002514f, 0.002054f, 0.004472f, 0.003396f, 0.003522f, + 0.000101f, -0.002501f, -0.004124f, -0.003256f, -0.004768f, -0.004085f, -0.004380f, -0.003502f, -0.004556f, -0.002864f, -0.001678f, 0.000023f, 0.000788f, 0.002323f, 0.003091f, 0.005097f, 0.005235f, 0.006333f, 0.004334f, 0.003177f, 0.001486f, 0.001011f, -0.001659f, -0.002961f, -0.004164f, -0.004426f, -0.004392f, -0.002630f, -0.002159f, -0.001154f, -0.000604f, 0.000310f, 0.000340f, 0.001083f, 0.001049f, 0.001233f, 0.001025f, 0.000998f, 0.000525f, 0.000464f, 0.000189f, 0.000169f, -0.000017f, -0.000070f, -0.000157f, -0.000163f} + }, + { + {-0.017344f, 0.013427f, 0.000658f, 0.006167f, 0.006116f, 0.017381f, 0.008171f, -0.006421f, -0.008115f, -0.011310f, 0.008097f, -0.009894f, -0.007204f, 0.001619f, 0.002482f, 0.001075f, 0.010188f, -0.003327f, 0.009521f, -0.002436f, 0.008545f, -0.008096f, 0.003740f, -0.003573f, -0.008671f, -0.000603f, -0.016529f, 0.002486f, 0.004037f, 0.007394f, -0.006048f, -0.000088f, 0.006426f, -0.004732f, 0.007220f, 0.006826f, -0.004111f, 0.004906f, -0.005503f, -0.002539f, -0.004076f, -0.005910f, -0.007548f, 0.006753f, 0.009932f, -0.007435f, 0.004394f, 0.008020f, 0.006453f, 0.009816f, 0.001206f, -0.001455f, 0.005680f, 0.004349f, -0.010387f, -0.000377f, 0.001171f, 0.000679f, 0.003261f, 0.006736f, 0.001477f, 0.002456f, -0.003626f, -0.002255f, 0.004722f, 0.006695f, 0.003689f, -0.003513f, -0.006221f, 0.006904f, -0.005620f, -0.001791f, 0.003817f, -0.001136f, -0.000287f, 0.002958f, 0.000658f, 0.000213f, 0.006200f, -0.006078f, 0.004608f, 0.002557f, 0.003008f, 0.005789f, -0.002359f, -0.000639f, -0.001989f, -0.000778f, 0.000195f, 0.002851f, -0.002283f, -0.000377f, -0.001592f, -0.000860f, 0.000049f, -0.000187f, + -0.000948f, -0.000605f, 0.000587f, 0.000870f, -0.000066f, -0.000330f, -0.000674f, 0.000128f, -0.000250f, 0.000135f, -0.000947f, -0.000162f, 0.000844f, -0.001949f, -0.000966f, 0.006887f, -0.003617f, 0.005053f, 0.000503f, -0.000402f, -0.013960f, 0.002269f, 0.011930f, -0.007286f, 0.004940f, -0.014821f, -0.015003f, -0.004924f, -0.012197f, -0.010635f, -0.001588f, 0.002231f, 0.008410f, 0.001365f, -0.004027f, 0.001930f, 0.005728f, -0.007354f, 0.010248f, -0.006902f, -0.007483f, 0.008701f, -0.004300f, 0.010020f, 0.012707f, 0.001792f, -0.009143f, 0.006441f, 0.004200f, 0.002603f, -0.004647f, -0.003342f, 0.005343f, 0.004488f, 0.000917f, -0.010312f, -0.002976f, -0.009522f, 0.008645f, -0.008590f, -0.005618f, 0.006396f, 0.000310f, 0.005557f, 0.001588f, 0.002158f, 0.009405f, 0.001631f, 0.010547f, -0.013546f, -0.006969f, -0.003099f, 0.006741f, 0.009565f, 0.010889f, 0.014852f, 0.001614f, -0.004175f, -0.001411f, -0.001943f, -0.000448f, -0.009580f, -0.004210f, -0.004142f, -0.001168f, 0.001532f, -0.007804f, -0.004576f, -0.001760f, -0.003277f, -0.006102f, 0.007382f, -0.007336f, -0.002454f, 0.004886f, -0.012522f, + 0.003800f, 0.006903f, 0.007602f, 0.004051f, 0.002203f, 0.004607f, -0.002234f, -0.004825f, -0.001232f, 0.001365f, -0.000527f, 0.001366f, 0.000237f, -0.001303f, 0.000093f, -0.001901f, -0.002302f, 0.002853f, 0.001255f, -0.000205f, -0.000026f, 0.000033f, 0.002119f, 0.001043f, -0.000836f, -0.000813f, -0.000874f, 0.000215f, 0.001563f, -0.001808f, -0.000323f, -0.000047f, -0.000355f, 0.001095f, -0.000061f, -0.000697f, 0.015884f, -0.011803f, -0.004439f, -0.002338f, 0.009760f, 0.008811f, -0.008924f, -0.000824f, -0.016552f, -0.003623f, 0.020031f, 0.007543f, -0.008083f, 0.014385f, 0.004679f, 0.005528f, 0.001451f, -0.004835f, -0.015799f, 0.002113f, -0.007126f, -0.004504f, -0.002903f, -0.009623f, -0.003423f, -0.007450f, 0.005176f, -0.003375f, -0.004376f, 0.009000f, -0.017004f, 0.015623f, -0.005528f, 0.002218f, -0.005339f, 0.004874f, -0.000654f, -0.001565f, -0.000441f, 0.006648f, 0.000308f, 0.004202f, -0.006092f, 0.011703f, -0.009126f, 0.013628f, 0.002881f, -0.001353f, -0.007655f, -0.008958f, 0.018506f, 0.003191f, -0.017393f, 0.017760f, 0.016719f, -0.009096f, -0.003356f, 0.005254f, -0.006881f, -0.001282f, + -0.004250f, 0.004200f, 0.010655f, -0.006501f, 0.002417f, -0.004870f, -0.004473f, 0.001746f, 0.014351f, -0.013188f, 0.007973f, -0.013593f, -0.010475f, -0.009819f, -0.001759f, 0.000263f, -0.000035f, 0.008217f, 0.012700f, 0.003315f, 0.003060f, 0.006209f, 0.005012f, 0.002777f, 0.003131f, 0.003719f, -0.001409f, 0.004005f, -0.001866f, -0.003952f, 0.006744f, -0.000351f, 0.000902f, -0.001241f, -0.002043f, -0.001190f, 0.000013f, 0.002853f, -0.000757f, 0.000631f, 0.000255f, -0.002561f, -0.000009f, 0.001399f, 0.001770f, -0.000220f, 0.001234f, 0.004173f, -0.006460f, 0.000368f, -0.012404f, 0.011230f, -0.017286f, 0.000351f, 0.017424f, -0.032505f, 0.022127f, 0.008662f, -0.008854f, 0.006760f, -0.000944f, 0.019243f, -0.002330f, -0.016461f, -0.011578f, 0.006276f, 0.007293f, 0.001886f, 0.000257f, 0.008015f, 0.002211f, 0.001080f, 0.010994f, 0.004329f, 0.002954f, 0.007839f, 0.005576f, 0.027566f, -0.007915f, 0.007134f, -0.000657f, -0.004847f, 0.006973f, 0.004216f, 0.002577f, 0.003261f, -0.004812f, -0.007983f, 0.000263f, -0.000285f, 0.000152f, 0.003757f, 0.008253f, -0.008942f, -0.009450f, 0.003703f, + -0.002448f, -0.003797f, -0.005754f, 0.011057f, -0.008373f, 0.016102f, 0.007457f, 0.000448f, 0.003607f, 0.001107f, 0.004241f, 0.020532f, 0.017246f, 0.001053f, 0.000754f, 0.003722f, -0.004418f, 0.007511f, -0.001947f, 0.006746f, 0.001934f, 0.000180f, -0.000218f, -0.009154f, 0.008273f, 0.006225f, -0.002124f, -0.005380f, 0.000483f, 0.007903f, 0.000581f, -0.002575f, 0.000249f, -0.006473f, 0.004269f, 0.001414f, 0.005501f, -0.001793f, 0.001482f, 0.002123f, 0.002175f, 0.001732f, 0.003222f, 0.001356f, 0.001322f, -0.007830f, -0.000644f, 0.002669f, 0.004036f, -0.002865f, 0.002550f, 0.002256f, 0.002062f, 0.002267f, 0.000889f, 0.001691f, 0.002274f, 0.002485f, 0.000245f, 0.000780f, 0.000606f, 0.000983f, 0.000211f, 0.000425f, 0.001534f, 0.000380f, -0.000518f, -0.001963f, 0.000860f, 0.002256f, -0.002098f, 0.004076f, -0.001933f, 0.008989f, 0.000181f, 0.010380f, -0.004013f, 0.009200f, -0.007013f, 0.019283f, -0.014801f, -0.005559f, -0.007074f, 0.019880f, 0.011259f, 0.007278f, 0.012632f, -0.011481f, -0.002327f, 0.018335f, 0.010421f, 0.008575f, 0.008916f, 0.004708f, 0.006124f, -0.002165f, + 0.017627f, -0.001894f, -0.008124f, -0.006099f, 0.006180f, -0.006718f, 0.004041f, -0.016746f, 0.006180f, -0.003269f, 0.000333f, -0.017993f, 0.007735f, -0.003922f, 0.016833f, -0.002825f, 0.005339f, 0.004532f, -0.007072f, -0.001848f, 0.007684f, 0.000966f, 0.005278f, -0.003885f, 0.009355f, 0.013132f, 0.001702f, -0.009326f, 0.003574f, 0.009200f, 0.006685f, 0.001128f, -0.006286f, -0.013111f, 0.010939f, -0.014589f, -0.006084f, 0.008008f, -0.019157f, -0.004512f, 0.011958f, -0.008988f, 0.002556f, 0.000046f, -0.001026f, -0.002690f, 0.004902f, -0.009700f, 0.000592f, -0.016116f, -0.008213f, -0.021983f, 0.001720f, -0.006264f, 0.000553f, -0.004370f, -0.000604f, -0.005697f, 0.005087f, 0.004646f, 0.002017f, -0.003599f, 0.004710f, -0.000672f, 0.001896f, -0.006450f, 0.001701f, 0.001136f, 0.002118f, 0.001223f, 0.004429f, -0.000718f, 0.004988f, -0.002304f, -0.000215f, 0.003223f, 0.004696f, 0.000543f, 0.002654f, -0.003122f, -0.000993f, -0.001012f, -0.001018f, -0.002300f, 0.001555f, 0.003387f, 0.001109f, 0.003580f, -0.003439f, -0.002342f, -0.001863f, -0.005163f, 0.000666f, -0.000929f, 0.002489f, -0.000890f, + -0.000831f, -0.005409f, 0.005515f, -0.035031f, 0.006451f, -0.010853f, -0.006205f, 0.008370f, 0.006396f, 0.004587f, 0.001797f, -0.025661f, -0.002500f, 0.008358f, -0.013706f, -0.003372f, -0.018838f, -0.009426f, 0.004470f, -0.001987f, -0.017337f, 0.018558f, 0.011237f, -0.005311f, 0.002171f, 0.014661f, -0.009103f, 0.004145f, -0.006176f, -0.009752f, -0.006669f, -0.017865f, -0.006606f, 0.013967f, 0.006610f, 0.017769f, -0.008700f, -0.028337f, -0.012224f, 0.007272f, -0.009047f, -0.018377f, -0.003025f, -0.003238f, 0.017149f, 0.008949f, -0.019740f, 0.013521f, -0.013945f, -0.000607f, -0.010049f, -0.009538f, -0.009201f, -0.021732f, -0.012912f, 0.001837f, 0.014217f, 0.021532f, 0.013745f, 0.004187f, 0.008576f, -0.009528f, -0.016225f, -0.009871f, 0.010404f, -0.004798f, 0.011213f, -0.003173f, -0.010290f, -0.000326f, 0.001027f, -0.004817f, -0.011608f, 0.000912f, 0.008868f, -0.028380f, -0.018809f, 0.026848f, -0.008587f, 0.000725f, -0.014633f, 0.007224f, 0.004019f, -0.001547f, -0.001080f, 0.009938f, 0.007273f, 0.002377f, -0.002992f, -0.003457f, -0.000608f, -0.003883f, 0.002347f, 0.003049f, -0.005586f, -0.002664f, + 0.002140f, 0.000815f, 0.000053f, 0.001851f, 0.005592f, -0.005743f, -0.002681f, -0.010650f, -0.004368f, -0.001456f, -0.001989f, 0.000714f, 0.001572f, 0.003243f, 0.000250f, 0.004111f, -0.004656f, -0.003195f, 0.000857f, 0.001120f, 0.001599f, -0.003778f, -0.002159f, -0.005272f, -0.000232f, 0.001963f, 0.013160f, -0.000709f, 0.006492f, -0.009582f, 0.006447f, -0.012971f, -0.001235f, 0.021646f, -0.010697f, 0.020434f, 0.020694f, 0.025626f, 0.006140f, 0.010072f, 0.022020f, 0.017209f, 0.012537f, -0.017645f, 0.001903f, 0.005189f, 0.014644f, -0.003245f, -0.013229f, 0.016371f, 0.016527f, -0.005074f, 0.010888f, -0.005885f, -0.006254f, 0.010319f, 0.008776f, -0.001553f, 0.010480f, 0.000692f, -0.018125f, -0.014448f, 0.014967f, 0.022010f, -0.002134f, -0.007963f, 0.004318f, 0.000438f, -0.011003f, -0.020145f, 0.009998f, -0.019058f, -0.009558f, 0.014156f, 0.002648f, 0.012501f, 0.000140f, 0.020159f, 0.002424f, 0.022164f, -0.026450f, 0.023405f, -0.005003f, -0.001104f, 0.006697f, 0.012282f, -0.010439f, -0.021748f, -0.006543f, 0.019570f, -0.004278f, -0.023249f, -0.014062f, -0.014310f, 0.003383f, 0.008176f, + -0.020530f, 0.009993f, 0.011176f, 0.020709f, 0.005974f, 0.006421f, -0.000381f, 0.005727f, 0.000623f, 0.004454f, 0.002699f, -0.015351f, -0.002155f, 0.007121f, 0.004621f, 0.012194f, -0.008546f, -0.002602f, -0.000610f, 0.000886f, 0.005399f, 0.000648f, 0.004372f, 0.001866f, -0.002845f, -0.001147f, 0.004136f, 0.004154f, 0.001142f, 0.004542f, 0.000795f, 0.001951f, 0.005606f, -0.000023f, -0.003793f, -0.001798f, 0.000828f, 0.002890f, -0.000933f, -0.001508f, 0.004416f, 0.002461f, 0.000571f, -0.005140f, -0.002162f, -0.002971f, -0.003062f, -0.000310f, 0.004731f, 0.000225f, 0.004469f, 0.003547f, 0.002811f, -0.000421f, 0.000215f, 0.006947f, 0.022385f, 0.002831f, 0.009315f, 0.026634f, 0.028692f, 0.008532f, 0.007173f, -0.021287f, -0.010789f, 0.023451f, -0.017497f, 0.023971f, 0.006718f, -0.000126f, -0.004840f, -0.008419f, -0.013930f, 0.002521f, 0.010577f, -0.025840f, -0.011752f, -0.010999f, 0.005671f, 0.005174f, 0.005600f, 0.000788f, 0.004327f, -0.000950f, 0.007723f, 0.006322f, -0.006912f, -0.012111f, -0.022390f, 0.003938f, -0.012128f, 0.020162f, 0.000742f, -0.011182f, -0.014115f, -0.004283f, + 0.009292f, -0.017516f, 0.010902f, -0.005847f, 0.003547f, -0.000181f, -0.012559f, 0.012425f, 0.015623f, -0.010735f, 0.013133f, 0.003801f, -0.001090f, 0.037682f, -0.009545f, -0.024383f, 0.004553f, 0.009223f, -0.006182f, 0.002081f, -0.010704f, 0.025609f, 0.014792f, -0.002489f, -0.005545f, 0.018206f, 0.017269f, -0.003577f, -0.014869f, -0.010686f, 0.035483f, -0.003214f, -0.004976f, -0.014276f, -0.009388f, -0.002795f, 0.003380f, -0.003649f, -0.009544f, 0.015395f, -0.004933f, 0.018259f, 0.005190f, -0.005648f, -0.002091f, 0.003341f, -0.000187f, -0.003022f, -0.003262f, 0.006501f, -0.008175f, -0.001885f, -0.002259f, 0.010611f, 0.000872f, -0.002179f, -0.000359f, -0.005241f, -0.005094f, -0.000545f, 0.000964f, 0.011141f, -0.002689f, 0.006661f, 0.002399f, -0.003447f, 0.002158f, 0.000592f, -0.005443f, 0.004261f, -0.002765f, 0.005834f, -0.000664f, -0.005651f, -0.004385f, -0.003152f, -0.004413f, 0.000104f, -0.001475f, -0.001657f, 0.001859f, 0.002212f, 0.002964f, 0.001335f, 0.009504f, -0.019378f, -0.005308f, -0.005935f, 0.001879f, 0.008593f, 0.019590f, 0.017145f, -0.026769f, 0.000860f, 0.003426f, -0.002496f, + -0.007814f, -0.018372f, -0.001655f, 0.006517f, 0.011312f, 0.009233f, -0.016837f, -0.002742f, -0.021410f, 0.020536f, 0.001142f, -0.001781f, 0.010010f, -0.009418f, -0.001515f, -0.022841f, 0.004123f, -0.013545f, 0.009760f, -0.001576f, -0.003616f, -0.007577f, -0.015068f, -0.014669f, -0.001521f, -0.018148f, -0.029704f, -0.005349f, -0.013407f, -0.028567f, -0.002101f, -0.002261f, -0.015515f, 0.010528f, 0.016045f, -0.001755f, 0.007769f, -0.001787f, -0.002272f, 0.004493f, 0.004899f, -0.023108f, -0.006645f, 0.012987f, -0.011006f, 0.028084f, 0.005264f, 0.007638f, -0.017768f, 0.000023f, -0.007900f, -0.018166f, -0.001733f, 0.026078f, 0.012229f, 0.019860f, 0.011148f, -0.008380f, -0.020647f, -0.032431f, 0.022123f, 0.022635f, -0.002451f, 0.011788f, -0.025211f, 0.012366f, 0.010643f, 0.018463f, 0.002980f, -0.021585f, -0.002574f, -0.020109f, -0.006813f, 0.001871f, -0.006361f, 0.004487f, -0.004288f, -0.006553f, -0.001523f, 0.002144f, -0.000782f, -0.002023f, 0.006208f, -0.001685f, 0.002547f, -0.014556f, 0.000494f, -0.001036f, -0.002105f, -0.006510f, -0.002614f, 0.004595f, -0.005980f, -0.007052f, -0.002372f, -0.002432f, + -0.002752f, 0.000130f, -0.001536f, -0.007829f, -0.006217f, -0.003828f, 0.002484f, 0.002824f, 0.004909f, 0.002376f, 0.004525f, 0.001618f, -0.005546f, 0.001311f, -0.000722f, -0.003415f, 0.002371f, -0.006564f, 0.003079f, -0.003499f, -0.000381f, 0.004651f, -0.050284f, -0.012420f, 0.040359f, 0.013637f, 0.016583f, -0.010243f, 0.016744f, 0.028217f, 0.002260f, -0.004492f, -0.046436f, -0.010657f, -0.001994f, 0.026963f, 0.007719f, 0.010948f, -0.034747f, -0.009177f, -0.012803f, -0.008086f, 0.021908f, -0.012024f, -0.004069f, 0.004006f, 0.006402f, -0.010793f, -0.004644f, 0.005855f, -0.009585f, 0.021603f, -0.023766f, 0.002845f, 0.015950f, -0.020265f, 0.017009f, 0.028883f, 0.033503f, 0.016266f, 0.016480f, 0.022142f, -0.014840f, -0.027253f, 0.011145f, 0.012227f, 0.018356f, 0.014744f, -0.030942f, -0.008578f, 0.016499f, 0.009718f, 0.006098f, 0.019796f, 0.004536f, 0.023015f, -0.008308f, -0.004618f, 0.013156f, 0.012311f, 0.003772f, -0.019741f, -0.010565f, -0.021225f, -0.024500f, -0.001139f, -0.026811f, 0.001728f, -0.015555f, 0.001421f, -0.014138f, -0.008124f, -0.034486f, 0.024190f, 0.006425f, -0.004840f, + -0.006085f, -0.003585f, 0.004749f, -0.012493f, -0.001681f, -0.029804f, -0.016395f, 0.010801f, 0.013739f, 0.005931f, 0.004681f, 0.001497f, -0.015695f, 0.007554f, 0.007315f, 0.005935f, -0.014997f, 0.003777f, 0.000680f, -0.011687f, -0.003966f, 0.002423f, 0.001980f, -0.005857f, -0.008940f, 0.003310f, -0.004354f, -0.005190f, -0.001292f, 0.001647f, -0.001049f, -0.000337f, 0.003134f, -0.002461f, 0.004332f, -0.000379f, 0.006148f, -0.002339f, 0.005499f, 0.008873f, -0.005980f, 0.005107f, 0.000478f, 0.003668f, -0.003665f, 0.000006f, 0.004975f, 0.004327f, -0.007385f, 0.004338f, 0.003962f, 0.031787f, -0.015315f, -0.013090f, -0.011586f, 0.021920f, 0.027800f, -0.017271f, 0.044543f, 0.009435f, -0.018882f, 0.022845f, 0.006594f, -0.018411f, -0.021644f, -0.017463f, -0.001313f, -0.009336f, -0.006360f, -0.028894f, 0.011727f, 0.012161f, 0.040180f, 0.005513f, -0.006739f, -0.018007f, -0.018851f, 0.004878f, -0.002145f, -0.025274f, 0.004591f, -0.009328f, 0.001313f, 0.019646f, -0.015049f, 0.025957f, -0.022630f, -0.019033f, -0.001195f, -0.029669f, -0.035476f, 0.005833f, -0.003981f, -0.040996f, 0.002937f, 0.000527f, + -0.019441f, 0.010309f, -0.009395f, 0.005232f, -0.027649f, -0.045253f, 0.029840f, -0.027673f, 0.046176f, 0.025196f, -0.032837f, -0.004184f, -0.033275f, -0.008965f, -0.004135f, 0.013882f, -0.011926f, 0.021168f, 0.026749f, 0.025333f, -0.018173f, -0.014865f, 0.002462f, -0.022380f, -0.001997f, -0.007285f, -0.029471f, 0.017692f, 0.013185f, -0.015731f, 0.023362f, -0.034559f, -0.003230f, 0.002088f, -0.008965f, -0.005816f, 0.030126f, 0.022200f, 0.014859f, -0.001803f, -0.015595f, -0.012698f, -0.011736f, 0.005206f, 0.004926f, -0.000954f, 0.003485f, -0.000914f, -0.001306f, 0.000634f, -0.001180f, 0.001207f, 0.006072f, -0.007145f, 0.002927f, -0.000517f, 0.006674f, -0.003859f, -0.000610f, 0.003797f, 0.008890f, 0.003479f, 0.007189f, -0.008498f, -0.009178f, 0.004375f, -0.006088f, 0.001461f, 0.000036f, -0.009913f, -0.005441f, -0.005933f, 0.000178f, 0.003197f, 0.003005f, 0.001939f, 0.002389f, -0.001425f, -0.027495f, -0.021047f, 0.012843f, 0.015690f, 0.017396f, 0.029827f, -0.011787f, 0.055362f, -0.002306f, -0.029505f, 0.012074f, 0.027015f, 0.006992f, 0.013940f, -0.012815f, -0.031553f, 0.046080f, 0.025358f, + 0.018558f, 0.008522f, -0.016700f, 0.014491f, 0.038286f, -0.014803f, 0.007780f, -0.000910f, 0.007628f, 0.006172f, 0.027122f, -0.008484f, 0.008862f, -0.010279f, 0.007868f, -0.003141f, -0.002034f, 0.016680f, 0.003106f, -0.034805f, -0.023566f, -0.032644f, -0.022578f, -0.017543f, -0.009028f, -0.025099f, -0.014485f, -0.012569f, -0.021901f, -0.015308f, 0.008863f, -0.022754f, -0.008244f, -0.017767f, 0.040811f, 0.020580f, 0.035456f, -0.033089f, -0.003628f, -0.030270f, -0.006866f, 0.032956f, 0.017814f, 0.038911f, 0.018203f, 0.023914f, -0.026449f, 0.011248f, 0.010911f, 0.036009f, 0.036437f, 0.010647f, 0.032912f, -0.029275f, -0.014357f, 0.021046f, -0.076250f, 0.000931f, 0.011855f, 0.001152f, 0.018202f, 0.011705f, 0.042083f, -0.003727f, -0.006490f, 0.045807f, 0.013375f, -0.004523f, -0.021298f, -0.000835f, -0.000240f, 0.037471f, 0.004431f, 0.000612f, 0.002460f, 0.007253f, 0.011209f, -0.002519f, -0.002759f, 0.011824f, 0.005265f, 0.003579f, 0.005849f, 0.008480f, 0.006249f, -0.000848f, 0.000888f, 0.000821f, 0.012030f, -0.002626f, 0.006055f, 0.011825f, 0.008383f, 0.013240f, -0.006580f, -0.004900f, + 0.002613f, 0.004041f, -0.005217f, 0.000017f, 0.007227f, 0.012279f, -0.001405f, 0.003413f, 0.001300f, 0.032611f, 0.021203f, -0.021318f, 0.041674f, 0.024751f, -0.002093f, -0.010372f, -0.005227f, 0.025043f, 0.061540f, 0.032906f, 0.008850f, 0.002600f, 0.020216f, -0.004909f, 0.049669f, 0.028115f, 0.031019f, 0.001299f, -0.015826f, 0.010565f, 0.003724f, -0.026378f, -0.006532f, -0.001628f, -0.006268f, -0.007488f, 0.010054f, 0.005541f, -0.021707f, -0.010341f, -0.038335f, -0.003876f, -0.011952f, -0.049215f, -0.022181f, 0.001560f, 0.018381f, -0.025290f, 0.031647f, -0.008710f, -0.007646f, -0.004241f, -0.007821f, 0.023150f, -0.015608f, 0.016211f, -0.050610f, 0.015727f, 0.021943f, 0.017101f, 0.033561f, -0.033142f, 0.028719f, -0.029735f, -0.022403f, 0.025057f, -0.014737f, -0.004320f, 0.020810f, -0.033720f, 0.029880f, 0.048240f, -0.001120f, -0.006858f, 0.061237f, -0.013080f, 0.011667f, 0.034749f, -0.073939f, -0.037622f, 0.002344f, 0.002401f, 0.009841f, 0.017908f, 0.035718f, 0.021751f, -0.028397f, -0.022438f, -0.006883f, -0.007890f, -0.038307f, -0.003542f, -0.007795f, 0.009586f, -0.040030f, 0.000642f, + -0.012211f, 0.016389f, -0.006229f, 0.020821f, 0.005315f, 0.000383f, -0.012025f, -0.008453f, -0.011326f, -0.011534f, -0.009243f, 0.008338f, -0.024459f, 0.017583f, -0.003141f, 0.009898f, 0.000331f, -0.001307f, -0.016794f, 0.009324f, -0.012011f, 0.003256f, -0.012751f, -0.006542f, -0.000370f, -0.005247f, -0.014603f, 0.001338f, -0.004784f, 0.001868f, -0.010048f, -0.010452f, -0.011768f, 0.002373f, 0.002139f, 0.014819f, 0.015168f, 0.000198f, 0.000020f, -0.018553f, -0.011058f, -0.058436f, -0.035120f, 0.043159f, 0.042912f, 0.004681f, -0.010061f, 0.036405f, -0.058619f, -0.031432f, -0.063433f, 0.027855f, 0.007780f, 0.002899f, 0.012385f, -0.028816f, 0.014705f, 0.020179f, 0.026425f, 0.044737f, 0.045969f, 0.038635f, -0.001485f, 0.008799f, 0.000576f, -0.016700f, -0.003397f, -0.013931f, -0.007165f, 0.053300f, -0.012358f, -0.048851f, -0.012297f, -0.009986f, 0.004446f, 0.076760f, -0.027654f, -0.027407f, 0.026017f, -0.041444f, 0.014426f, -0.045996f, 0.060261f, 0.017092f, -0.001623f, 0.015525f, -0.023166f, -0.029310f, 0.041303f, -0.050077f, -0.040015f, -0.035963f, 0.010049f, 0.015153f, 0.018820f, -0.033359f, + 0.034362f, -0.010514f, 0.002634f, 0.052951f, -0.003564f, -0.008903f, 0.015611f, 0.042752f, -0.027573f, 0.070844f, 0.002671f, -0.081446f, -0.009875f, -0.003047f, -0.027182f, -0.007764f, 0.000028f, -0.007538f, -0.022194f, -0.018615f, 0.040157f, 0.026976f, -0.009836f, 0.026108f, -0.046793f, 0.013240f, 0.021031f, 0.013158f, 0.001557f, 0.025152f, -0.004089f, -0.001010f, 0.009421f, 0.024595f, -0.010103f, -0.010580f, -0.008313f, 0.001234f, 0.009298f, -0.004609f, -0.019278f, -0.020656f, 0.001061f, -0.009634f, 0.007249f, -0.000132f, 0.005128f, 0.011147f, -0.013472f, -0.008805f, 0.023394f, -0.005264f, 0.004265f, -0.001664f, 0.000659f, -0.007832f, -0.008841f, -0.004352f, -0.002940f, -0.012261f, 0.006043f, 0.011506f, 0.006397f, -0.000056f, 0.001098f, 0.005288f, -0.009489f, 0.002359f, 0.010909f, -0.000910f, 0.009364f, -0.005097f, -0.016901f, -0.022749f, 0.000585f, 0.009830f, -0.016845f, -0.007846f, 0.077508f, 0.045806f, -0.063030f, -0.050993f, 0.062331f, 0.059395f, 0.037063f, 0.042599f, -0.074984f, -0.016700f, -0.020881f, 0.019399f, 0.006963f, -0.030460f, -0.055458f, -0.083873f, 0.024159f, 0.021745f, + 0.006195f, 0.022674f, -0.011699f, -0.004507f, -0.020116f, 0.016280f, 0.028643f, 0.025649f, 0.006504f, 0.034180f, 0.010786f, -0.004224f, -0.014342f, -0.051114f, -0.003009f, -0.021691f, -0.017989f, 0.017348f, -0.054771f, 0.004561f, 0.001925f, -0.025752f, 0.021985f, 0.020076f, 0.009813f, -0.036997f, -0.034384f, -0.090223f, -0.023149f, 0.000308f, -0.029066f, 0.004743f, 0.018725f, 0.018580f, 0.050006f, 0.024332f, -0.022472f, -0.015910f, -0.033664f, 0.041939f, -0.018034f, 0.072839f, 0.060898f, 0.016603f, -0.039331f, 0.080449f, 0.036923f, -0.033086f, 0.004764f, 0.040241f, 0.093756f, -0.039204f, -0.072099f, -0.037433f, 0.000744f, -0.026280f, 0.011103f, 0.025558f, 0.021409f, -0.019231f, -0.029620f, -0.016613f, -0.024689f, -0.027235f, 0.007228f, 0.028832f, 0.023110f, 0.012747f, 0.011405f, 0.003875f, 0.019409f, 0.002281f, 0.002941f, 0.028168f, 0.022177f, -0.001697f, -0.009588f, 0.006063f, -0.015083f, 0.015492f, -0.005869f, 0.015864f, -0.008531f, 0.006110f, 0.004054f, 0.010346f, 0.013654f, 0.007753f, 0.006253f, -0.013886f, -0.026739f, 0.002740f, -0.013662f, -0.007241f, 0.007833f, 0.001987f, + -0.004100f, -0.005569f, 0.019019f, 0.005905f, 0.025796f, -0.008745f, 0.013734f, -0.013445f, 0.013326f, -0.018380f, 0.017725f, 0.000240f, -0.015467f, 0.030477f, 0.010516f, -0.011450f, -0.030731f, 0.024674f, -0.051677f, -0.047859f, -0.017581f, 0.036062f, -0.021567f, -0.027460f, -0.000811f, 0.041638f, 0.003921f, 0.043046f, -0.015128f, 0.052084f, 0.005553f, 0.027643f, -0.018977f, -0.012909f, 0.016151f, -0.054871f, -0.015642f, 0.019932f, -0.010165f, -0.007852f, -0.044182f, -0.041826f, 0.018713f, -0.025720f, -0.018532f, 0.033337f, 0.045998f, -0.007350f, 0.030111f, -0.055446f, 0.002934f, -0.015425f, 0.070927f, -0.029925f, 0.023355f, 0.043223f, 0.041228f, 0.011694f, -0.029406f, 0.018037f, 0.012922f, 0.012194f, 0.022687f, -0.070712f, 0.129362f, 0.041040f, -0.011710f, 0.006419f, 0.014243f, 0.035620f, -0.010299f, 0.027335f, 0.075340f, -0.004691f, -0.093780f, 0.038712f, 0.032277f, -0.033575f, 0.043679f, -0.010037f, -0.019839f, -0.050489f, 0.096658f, -0.050252f, 0.107651f, -0.071398f, 0.026456f, -0.001711f, 0.116983f, 0.051663f, -0.050301f, 0.047734f, 0.001894f, -0.031459f, 0.023354f, 0.003330f, + 0.010406f, 0.025908f, 0.010970f, -0.030436f, -0.008019f, 0.035440f, 0.009404f, 0.019930f, -0.016631f, 0.022062f, -0.037983f, 0.013765f, -0.002299f, -0.012499f, 0.023356f, -0.013344f, -0.007516f, 0.016656f, -0.003041f, 0.002260f, -0.003140f, 0.028196f, -0.018790f, 0.027512f, -0.016552f, 0.025435f, 0.035793f, 0.013103f, 0.009600f, 0.019627f, -0.005317f, -0.014382f, -0.013901f, 0.016909f, 0.005809f, -0.003082f, -0.000376f, -0.004700f, -0.025952f, -0.020070f, -0.004135f, 0.000596f, -0.006008f, -0.015302f, 0.089151f, 0.010816f, 0.048472f, 0.024831f, -0.048803f, 0.003248f, 0.029191f, -0.008546f, -0.042494f, -0.007966f, -0.092847f, -0.025825f, -0.034512f, -0.019844f, 0.020418f, -0.002511f, 0.033395f, -0.016100f, 0.003715f, 0.032636f, -0.028789f, 0.003344f, 0.018586f, -0.001601f, -0.031608f, 0.000170f, -0.021689f, 0.064381f, -0.011164f, 0.037410f, 0.006103f, -0.000397f, 0.065861f, 0.047620f, -0.028892f, -0.033770f, 0.016749f, 0.030012f, 0.036171f, 0.044074f, -0.000751f, 0.015702f, 0.041632f, -0.002023f, -0.016679f, 0.013257f, 0.001499f, -0.036613f, -0.000801f, 0.024522f, -0.036228f, -0.048611f, + -0.004592f, -0.002713f, -0.005211f, -0.016151f, -0.017624f, -0.057960f, -0.000008f, 0.057396f, 0.017628f, 0.032042f, 0.018810f, -0.007420f, -0.075200f, -0.054919f, 0.014855f, 0.048941f, 0.015923f, 0.024863f, 0.098850f, 0.102882f, 0.086855f, -0.006637f, 0.043181f, -0.027261f, -0.072880f, -0.121281f, 0.021163f, 0.015252f, -0.005392f, 0.017152f, -0.038415f, 0.008518f, -0.009336f, 0.044831f, -0.003318f, 0.036058f, -0.044006f, 0.021974f, -0.054048f, -0.010201f, 0.022867f, 0.004170f, -0.027504f, 0.006753f, -0.022649f, -0.024249f, -0.010439f, 0.006802f, 0.020694f, 0.027002f, 0.035118f, -0.008138f, -0.001871f, 0.009399f, -0.009596f, 0.011621f, -0.036341f, -0.030679f, -0.021557f, -0.028677f, -0.027982f, -0.029282f, 0.019307f, 0.014418f, -0.004920f, -0.019056f, -0.029632f, 0.018450f, 0.000342f, 0.028923f, -0.006938f, 0.025702f, 0.018642f, 0.001621f, 0.008054f, 0.030760f, -0.036168f, -0.033490f, 0.020879f, -0.002515f, -0.007165f, -0.015791f, -0.027965f, -0.058384f, 0.016133f, -0.035174f, 0.016641f, -0.015505f, -0.041303f, -0.013061f, -0.000591f, 0.019922f, -0.017633f, 0.009956f, -0.060452f, 0.055902f, + -0.126349f, -0.012973f, -0.031797f, -0.026183f, 0.016600f, 0.071787f, 0.011310f, 0.025827f, -0.062358f, 0.013570f, 0.022620f, 0.049241f, -0.026063f, -0.040475f, -0.028118f, -0.013951f, -0.002148f, -0.001403f, 0.029743f, 0.021501f, -0.017924f, -0.091368f, -0.043470f, -0.074359f, 0.008367f, 0.130251f, -0.092593f, -0.036903f, -0.014417f, 0.075150f, -0.025444f, 0.031600f, -0.024321f, 0.036069f, -0.014599f, -0.022330f, -0.047067f, 0.023892f, -0.054514f, 0.049984f, 0.090583f, 0.011388f, -0.016921f, -0.017247f, 0.075105f, 0.019705f, -0.000855f, 0.039531f, 0.012889f, 0.014123f, -0.014665f, 0.086777f, -0.136999f, 0.098806f, -0.083541f, 0.039310f, 0.097656f, -0.078761f, 0.158459f, 0.107822f, -0.040834f, -0.013843f, 0.108928f, 0.039563f, -0.010520f, 0.071577f, 0.064227f, -0.084037f, 0.112392f, -0.068369f, 0.019865f, 0.021293f, -0.030339f, 0.021437f, 0.036620f, -0.023024f, -0.041357f, 0.013097f, -0.022364f, 0.009271f, 0.009285f, -0.011600f, -0.032460f, 0.012594f, 0.011370f, -0.013493f, 0.013416f, 0.010654f, -0.026158f, 0.063477f, 0.006759f, 0.001049f, 0.001166f, -0.013193f, 0.009562f, 0.008314f, + 0.003180f, -0.021050f, 0.010601f, 0.002650f, -0.009287f, -0.018493f, 0.039154f, -0.015179f, 0.031802f, 0.036268f, -0.003931f, -0.013815f, 0.009421f, 0.008713f, 0.013941f, 0.043771f, 0.037658f, -0.034298f, 0.015561f, -0.014098f, -0.002273f, 0.050037f, -0.010010f, 0.013776f, 0.019477f, -0.003394f, 0.092343f, 0.088002f, -0.075213f, 0.073270f, 0.067433f, -0.063484f, -0.095784f, -0.141543f, 0.032899f, 0.212302f, 0.087198f, 0.000280f, 0.043775f, -0.203165f, -0.083929f, -0.007316f, 0.030890f, 0.152641f, 0.149414f, 0.025672f, -0.057680f, -0.112641f, -0.066008f, 0.007485f, 0.048215f, 0.072891f, 0.117484f, 0.070811f, -0.094765f, -0.224018f, -0.182506f, -0.018089f, 0.203011f, 0.220740f, 0.139527f, 0.042475f, -0.046951f, -0.090349f, -0.136326f, -0.077887f, -0.082938f, 0.162331f, 0.135182f, 0.085250f, 0.075601f, -0.115138f, -0.161091f, -0.187088f, -0.167405f, 0.064276f, 0.226657f, 0.278927f, 0.094334f, -0.084774f, -0.198755f, -0.238568f, -0.064886f, 0.038155f, 0.024601f, 0.148936f, 0.058488f, -0.056567f, -0.033434f, -0.115034f, -0.025092f, -0.131488f, 0.056804f, 0.155356f, 0.291023f, -0.017930f, + -0.155643f, -0.338318f, -0.013246f, -0.114568f, -0.012172f, 0.161774f, 0.032081f, -0.015152f, -0.072322f, -0.152574f, -0.099843f, 0.072844f, 0.118057f, 0.038550f, -0.020647f, -0.052188f, -0.062138f, 0.060214f, 0.069558f, 0.042661f, 0.037244f, 0.016321f, 0.034729f, -0.003701f, 0.003291f, -0.034164f, -0.015660f, 0.003492f, 0.087790f, 0.076407f, -0.003969f, -0.033303f, -0.008537f, -0.078765f, -0.052639f, -0.002393f, 0.029939f, 0.080634f, 0.062471f, 0.043896f, 0.004059f, -0.109615f, -0.098339f, -0.067008f, 0.025803f, 0.104895f, 0.204184f, 0.124574f, -0.094137f, -0.169982f, -0.149721f, -0.060794f, 0.004276f, 0.139355f, 0.175977f, 0.130804f, 0.023118f, -0.104954f, -0.237265f, -0.150006f, 0.048321f, 0.146749f, 0.168234f, 0.048629f, -0.024635f, -0.065876f, -0.077335f, -0.044839f, -0.014256f, 0.015973f, 0.036992f, 0.046249f, 0.037051f, 0.008486f, -0.003238f, -0.032557f, 0.001624f, -0.019180f, 0.095941f, 0.056210f, -0.008221f, 0.020571f, 0.010583f, -0.067958f, -0.006902f, -0.005326f, 0.007657f, 0.002343f, 0.005676f, -0.024715f, -0.009751f, -0.008982f, -0.006056f, -0.011126f, 0.041024f, -0.014443f, + 0.017752f, -0.030497f, -0.002871f, 0.012896f, -0.001230f, -0.009116f, 0.070694f, 0.009970f, -0.039672f, -0.046146f, 0.009974f, 0.009963f, -0.027021f, 0.007776f, 0.035624f, 0.018601f, 0.033544f, -0.033884f, 0.010550f, -0.000991f, 0.008234f, -0.023788f, 0.004796f, 0.026848f, 0.037940f, 0.009762f, -0.009590f, 0.011272f, 0.004493f, -0.008570f, 0.025942f, -0.037772f, 0.008807f, -0.061659f, -0.019145f, 0.025765f, -0.020771f, -0.024659f, 0.033869f, -0.021252f, -0.057526f, -0.044502f, 0.039825f, -0.004740f, -0.007624f, 0.009301f, 0.020290f, 0.050371f, -0.032486f, -0.042416f, 0.002040f, -0.005657f, 0.034201f, 0.000443f, 0.020092f, 0.009280f, -0.003133f, 0.052308f, -0.067664f, -0.009765f, -0.009357f, -0.039694f, 0.010444f, 0.022499f, 0.001222f, -0.023577f, 0.010780f, -0.005189f, 0.007018f, -0.020368f, 0.015324f, -0.000902f, 0.002707f, -0.001662f, -0.004776f, 0.026590f, -0.026312f, 0.002215f, -0.004277f, -0.009411f, -0.008229f, 0.003229f, -0.011229f, 0.012262f, 0.015842f, -0.016052f, -0.003818f, -0.006065f, 0.014550f, 0.015917f, -0.007662f, 0.019587f, 0.002217f, -0.002692f, -0.012811f, 0.014147f, + 0.005176f, -0.005461f, -0.021372f, 0.010340f, -0.019352f, 0.012772f, -0.010293f, -0.009469f, 0.018333f, 0.018010f, -0.024135f, 0.003000f, -0.005363f, -0.023962f, 0.008166f, -0.013995f, 0.016137f, -0.013802f, -0.055783f, -0.061544f, -0.146763f, 0.042758f, 0.042290f, -0.002739f, -0.123689f, -0.079865f, -0.011546f, -0.020076f, 0.083053f, 0.056119f, 0.027106f, -0.054610f, -0.022413f, -0.014286f, 0.052088f, 0.005950f, -0.014548f, -0.031947f, 0.021492f, 0.009699f, 0.026023f, -0.001160f, -0.010316f, -0.012925f, -0.029446f, -0.014558f, -0.017735f, 0.049794f, 0.026695f, 0.006089f, 0.007640f, -0.032366f, -0.001539f, 0.004222f, 0.045433f, -0.003012f, 0.021284f, -0.016551f, -0.011512f, 0.009474f, -0.018443f, 0.012577f, 0.005607f, 0.013509f, 0.044310f, -0.003602f, 0.038905f, -0.000251f, 0.025049f, -0.018971f, 0.001817f, -0.028019f, -0.036433f, -0.038257f, -0.032794f, 0.011127f, 0.005893f, 0.003103f, -0.048385f, 0.024259f, -0.042094f, -0.004502f, 0.002364f, -0.026204f, -0.028512f, -0.014871f, 0.000681f, -0.050201f, -0.033996f, 0.031633f, -0.015089f, 0.029471f, 0.004790f, -0.007821f, -0.027149f, -0.031235f, + -0.001907f, 0.044994f, 0.055552f, -0.013528f, -0.005544f, -0.020565f, -0.027648f, -0.018895f, 0.017792f, 0.009670f, 0.006918f, 0.017618f, -0.003313f, -0.011208f, 0.012123f, 0.006902f, 0.010104f, 0.015450f, -0.008401f, 0.005395f, -0.001585f, 0.000633f, -0.011465f, 0.020323f, 0.006438f, 0.004853f, -0.005930f, 0.003185f, -0.000352f, 0.031524f, 0.004059f, 0.009653f, -0.017454f, 0.001464f, -0.011282f, 0.020730f, 0.001472f, 0.000601f, -0.007145f, 0.005035f, -0.002306f, 0.000549f, 0.009828f, 0.001219f, 0.012862f, -0.008434f, 0.004193f, 0.001641f, -0.016424f, -0.000601f, 0.009414f, 0.003902f, -0.003381f, 0.005677f, 0.033013f, -0.071104f, -0.176276f, -0.168954f, -0.025675f, 0.051071f, 0.169932f, 0.146869f, 0.138430f, 0.148726f, 0.082763f, 0.020023f, -0.075140f, -0.075457f, -0.156851f, -0.121773f, -0.106809f, -0.067724f, -0.085239f, 0.117321f, 0.096464f, 0.127050f, 0.073215f, 0.103847f, -0.003821f, 0.027361f, -0.016740f, -0.040496f, -0.023230f, -0.048418f, -0.056404f, -0.056106f, -0.055429f, -0.065519f, -0.048049f, -0.038944f, -0.004488f, 0.010354f, 0.092039f, 0.077338f, 0.040671f, 0.043816f, + 0.060689f, 0.056435f, 0.027087f, 0.131168f, 0.016981f, 0.001763f, 0.024526f, -0.048930f, -0.150520f, -0.042988f, -0.120676f, -0.129285f, -0.136735f, -0.096609f, -0.086174f, 0.004364f, 0.071303f, 0.072895f, 0.088869f, 0.161890f, 0.116379f, 0.142081f, 0.139476f, 0.089122f, 0.095658f, 0.032774f, -0.033789f, -0.109245f, -0.143539f, -0.163810f, -0.106718f, -0.147006f, -0.123709f, -0.141144f, -0.082519f, -0.009748f, 0.038587f, 0.114387f, 0.108955f, 0.110829f, 0.184275f, 0.128574f, 0.152304f, 0.095047f, 0.015673f, -0.017794f, -0.046298f, -0.076216f, -0.085602f, -0.090460f, -0.088381f, -0.101631f, -0.087331f, -0.063691f, -0.039334f, -0.020188f, -0.015494f, 0.044278f, 0.041801f, 0.059238f, 0.095383f, 0.107766f, 0.068116f, 0.082366f, 0.050562f, -0.003003f, -0.022527f, -0.049517f, -0.062242f, -0.053106f, -0.046143f, -0.055514f, -0.020527f, -0.013655f, 0.001050f, 0.015837f, 0.017265f, 0.004521f, 0.002177f, 0.015518f, -0.002461f, -0.013295f, 0.012107f, 0.007410f, 0.008568f, 0.013739f, 0.003820f, 0.003748f, 0.008061f, 0.019062f, 0.016012f, 0.007553f, 0.001353f, -0.004064f, -0.016401f, -0.012176f, + -0.014936f, -0.012699f, -0.005335f, -0.009786f, -0.008848f, -0.004697f, -0.004005f, -0.005190f, -0.001640f, 0.006238f, 0.005881f, 0.007624f, 0.011822f, 0.008173f, 0.005626f, 0.007854f, 0.002790f, 0.003425f, 0.003245f, 0.002292f, 0.001911f, 0.000874f, -0.002219f, -0.004722f, -0.009053f, -0.006881f, -0.007439f, -0.005859f, -0.003148f, -0.001203f, -0.002884f, -0.001693f, -0.002395f, 0.000447f, 0.002057f, 0.003579f, 0.006761f, 0.006745f, 0.002601f, 0.002794f, 0.001207f, -0.000945f, 0.001675f, 0.001342f, 0.000367f, 0.002292f, 0.000647f, -0.000850f, -0.002018f, -0.001665f, -0.002035f, -0.001616f, -0.001791f, -0.000569f, -0.001094f, -0.001255f, -0.004088f, -0.004616f, -0.004603f, -0.003250f, -0.000785f, 0.001408f, 0.003817f, 0.004941f, 0.005087f, 0.005465f, 0.004326f, 0.004776f, 0.003250f, 0.001572f, 0.000259f, -0.000642f, -0.002475f, -0.003773f, -0.004566f, -0.004081f, -0.004307f, -0.003501f, -0.003414f, -0.002858f, -0.001358f, 0.000252f, 0.000999f, 0.002304f, 0.003349f, 0.003881f, 0.003731f, 0.003248f, 0.002197f, 0.001320f, 0.000231f, -0.000161f, -0.000828f, -0.000992f, -0.001096f, -0.000977f, + -0.000923f, -0.000700f, -0.000530f, -0.000290f, -0.000175f, -0.000086f}, + {-0.008170f, 0.013879f, 0.004877f, -0.002460f, 0.003560f, 0.004501f, 0.008344f, 0.013902f, -0.006594f, 0.004658f, -0.005611f, -0.004342f, 0.002830f, 0.000093f, 0.001204f, -0.009712f, -0.004702f, 0.003509f, 0.006940f, -0.000856f, 0.005854f, -0.010415f, -0.009254f, 0.005919f, 0.003786f, 0.001676f, 0.004301f, -0.003511f, 0.007550f, 0.008474f, 0.008199f, 0.011773f, -0.006453f, -0.005293f, 0.000456f, 0.001559f, -0.011185f, -0.000636f, -0.000938f, 0.003157f, 0.001139f, -0.006945f, -0.001696f, 0.009635f, -0.005074f, 0.001952f, -0.005826f, 0.002887f, 0.002983f, 0.001993f, -0.008696f, 0.007125f, 0.000672f, 0.001671f, -0.001175f, -0.002785f, -0.003593f, -0.005867f, 0.012685f, -0.002145f, -0.002310f, -0.002751f, 0.005646f, 0.001401f, -0.011950f, 0.003133f, -0.005447f, -0.008123f, 0.004869f, -0.004986f, -0.012942f, 0.005266f, 0.001921f, 0.000664f, -0.011926f, -0.014386f, -0.005900f, -0.007039f, 0.006731f, -0.001846f, -0.000004f, -0.003173f, -0.003904f, -0.003155f, 0.000111f, 0.006039f, 0.001090f, -0.002539f, -0.000206f, -0.002657f, -0.001220f, 0.002743f, 0.000808f, -0.002393f, -0.003385f, -0.001059f, + -0.001385f, 0.001421f, -0.000846f, 0.000610f, 0.000483f, 0.001542f, 0.000373f, 0.002160f, -0.000849f, 0.000605f, -0.000466f, 0.001562f, -0.000084f, 0.001446f, 0.001673f, 0.007999f, 0.000866f, 0.000599f, 0.007106f, -0.010850f, 0.001705f, -0.009071f, -0.011452f, 0.003177f, 0.010560f, -0.006687f, 0.004965f, -0.005058f, -0.002487f, 0.002047f, 0.000444f, -0.005374f, -0.015752f, -0.015654f, 0.000190f, -0.004039f, -0.000230f, 0.008034f, 0.001216f, 0.009859f, 0.013372f, -0.007197f, 0.011537f, 0.001349f, 0.011712f, 0.000643f, 0.013915f, 0.001679f, -0.007918f, -0.002259f, 0.000705f, 0.006272f, -0.001808f, -0.002210f, 0.001308f, 0.004734f, -0.005900f, -0.000460f, -0.001876f, 0.004174f, 0.005137f, 0.000179f, -0.005380f, -0.000485f, -0.001038f, 0.002953f, 0.005402f, 0.009705f, -0.003501f, 0.006258f, -0.002946f, -0.008654f, -0.007700f, -0.005270f, 0.004760f, 0.005131f, -0.002957f, 0.008377f, 0.000209f, 0.002969f, 0.000373f, 0.010209f, 0.006778f, 0.007492f, 0.003024f, 0.004364f, 0.002700f, 0.004041f, 0.008371f, -0.001908f, -0.000500f, 0.011798f, 0.002329f, 0.000225f, 0.002417f, -0.004551f, + 0.000602f, 0.003395f, -0.000328f, -0.011258f, 0.003432f, 0.001061f, -0.001845f, -0.003989f, 0.002517f, 0.000636f, 0.006009f, -0.002365f, -0.001159f, -0.002449f, -0.001941f, 0.001405f, 0.000387f, 0.002302f, 0.001097f, 0.000431f, -0.002243f, -0.001871f, -0.001075f, -0.001212f, 0.000906f, -0.003030f, 0.002503f, -0.001177f, 0.000707f, -0.000840f, -0.001079f, -0.001748f, 0.000939f, -0.001438f, -0.001021f, -0.003295f, 0.012137f, -0.012217f, -0.008204f, -0.006724f, -0.009874f, 0.003239f, 0.004386f, -0.007927f, 0.001950f, 0.016546f, -0.011898f, 0.008432f, 0.014287f, 0.014122f, -0.008565f, -0.002285f, 0.007051f, 0.001420f, 0.002253f, -0.006215f, 0.003553f, -0.021274f, 0.016870f, 0.026365f, 0.004752f, 0.008939f, -0.004171f, -0.000269f, 0.014057f, -0.007247f, -0.016753f, -0.002715f, 0.000356f, 0.000040f, -0.013512f, 0.001100f, 0.003495f, -0.016094f, -0.007497f, 0.007602f, 0.002658f, -0.005666f, -0.001388f, 0.005701f, -0.007781f, 0.016851f, 0.005343f, 0.000868f, -0.010642f, -0.000969f, 0.005898f, -0.003559f, 0.000474f, -0.003748f, -0.000098f, -0.001509f, -0.008499f, 0.000632f, -0.008214f, 0.012671f, + -0.012029f, -0.007995f, -0.002600f, -0.014458f, 0.009878f, -0.007736f, -0.020129f, -0.003632f, -0.008609f, 0.002566f, 0.009440f, -0.009373f, 0.001307f, -0.006336f, 0.006744f, 0.001004f, -0.006559f, 0.005831f, -0.007117f, -0.009500f, 0.010816f, -0.006811f, 0.003188f, 0.000346f, 0.001112f, 0.003817f, -0.001965f, -0.003176f, -0.003497f, -0.005756f, 0.002105f, -0.008170f, 0.000620f, -0.001589f, 0.002746f, -0.002374f, -0.000050f, 0.000092f, 0.000377f, -0.004302f, 0.004082f, 0.000268f, 0.000899f, -0.002283f, -0.001498f, -0.001694f, -0.000252f, 0.002556f, -0.009499f, 0.005986f, -0.000327f, -0.001895f, 0.007105f, -0.006819f, -0.023865f, -0.004690f, -0.001521f, 0.010368f, 0.014680f, 0.013021f, 0.006221f, -0.005160f, -0.001666f, -0.014715f, -0.012509f, 0.004268f, 0.016682f, -0.004822f, 0.017090f, 0.010887f, -0.010651f, 0.005666f, -0.001696f, 0.005928f, -0.011900f, -0.008002f, 0.001881f, 0.008526f, -0.001153f, 0.005077f, 0.007045f, -0.013393f, -0.002759f, -0.006186f, -0.018293f, 0.011317f, 0.001729f, 0.004104f, 0.007820f, 0.014439f, 0.004960f, 0.000673f, 0.011254f, -0.002652f, -0.005877f, 0.011653f, + -0.006219f, 0.019697f, 0.008996f, 0.007835f, 0.000329f, -0.005662f, -0.006974f, 0.009662f, 0.013038f, -0.009745f, 0.002287f, 0.012539f, -0.002311f, 0.004085f, 0.027595f, -0.008359f, -0.003422f, 0.005395f, -0.013966f, -0.000545f, 0.002394f, -0.006170f, 0.006651f, -0.004462f, 0.004065f, 0.013763f, 0.000388f, -0.003140f, -0.009450f, -0.000743f, -0.011715f, 0.004943f, -0.004410f, -0.005680f, -0.002481f, 0.002240f, -0.003444f, -0.003314f, -0.002920f, 0.000670f, 0.004176f, 0.003209f, 0.000766f, -0.000947f, -0.001404f, -0.000939f, -0.000753f, -0.001880f, -0.003532f, -0.000612f, -0.001173f, 0.001862f, -0.000105f, 0.000966f, -0.003576f, 0.001526f, 0.001709f, -0.001232f, -0.003151f, -0.001061f, -0.003300f, -0.001611f, -0.001539f, 0.002421f, 0.000132f, -0.000427f, -0.000368f, 0.000630f, 0.000252f, 0.001318f, -0.004994f, -0.001192f, 0.001467f, -0.006198f, -0.034216f, -0.002892f, -0.000846f, -0.006947f, -0.010699f, -0.003590f, 0.018168f, -0.013093f, -0.019525f, 0.007160f, -0.008006f, 0.002649f, 0.003328f, 0.012150f, -0.008502f, -0.002651f, 0.002289f, 0.011288f, -0.005468f, -0.007619f, -0.002371f, -0.006572f, + 0.008285f, 0.015284f, 0.007628f, 0.000014f, -0.001400f, -0.008953f, -0.000655f, 0.024116f, 0.004141f, -0.003136f, 0.027886f, -0.001801f, 0.020708f, -0.006419f, 0.000043f, 0.014014f, 0.004169f, 0.003392f, 0.004923f, 0.002356f, 0.007656f, 0.004407f, -0.013425f, 0.024608f, 0.014909f, 0.020185f, 0.013497f, 0.008843f, -0.013656f, 0.005862f, 0.006772f, 0.000920f, -0.008419f, 0.022838f, 0.013781f, 0.020621f, 0.003577f, -0.004257f, -0.005229f, 0.015154f, -0.007563f, -0.015893f, 0.018440f, 0.005686f, -0.010307f, -0.006031f, 0.000809f, -0.004889f, 0.001705f, -0.002279f, 0.002510f, -0.006560f, -0.001873f, -0.015048f, 0.005623f, -0.001960f, -0.000493f, 0.005366f, -0.001941f, -0.002915f, 0.008678f, -0.000702f, 0.006721f, 0.009020f, 0.007394f, 0.004707f, 0.004702f, 0.001809f, 0.002709f, -0.000076f, -0.001992f, -0.001863f, 0.003916f, -0.001248f, -0.002549f, -0.002680f, 0.001816f, -0.003008f, -0.000837f, -0.000692f, 0.004911f, 0.001966f, 0.003497f, -0.003474f, 0.000980f, -0.002810f, -0.001025f, 0.003334f, -0.000544f, -0.001524f, -0.001184f, -0.001027f, -0.002056f, -0.001460f, 0.001387f, -0.000207f, + -0.000946f, -0.008802f, -0.001396f, -0.022501f, -0.008982f, -0.025144f, -0.017283f, 0.001694f, -0.016392f, -0.012917f, 0.001352f, -0.002991f, 0.016576f, -0.011273f, 0.018386f, 0.022622f, 0.002179f, -0.019475f, -0.013751f, 0.020310f, -0.010538f, -0.005725f, 0.011306f, -0.015100f, -0.026745f, 0.010526f, 0.022776f, -0.011927f, 0.005695f, -0.000550f, 0.009838f, -0.027849f, 0.005360f, -0.011258f, 0.006531f, 0.000445f, -0.011805f, 0.019223f, 0.008664f, 0.008057f, 0.025571f, 0.011896f, 0.005143f, 0.014486f, 0.002742f, 0.004624f, 0.007168f, 0.002358f, 0.000988f, 0.003888f, 0.003328f, 0.029231f, 0.016297f, -0.000157f, 0.024406f, 0.015323f, 0.017962f, 0.028311f, -0.014719f, -0.012207f, 0.024667f, -0.008754f, -0.001168f, -0.014852f, -0.006466f, 0.008769f, 0.012980f, -0.011331f, -0.001547f, 0.003674f, -0.003409f, 0.006780f, -0.012142f, -0.002310f, -0.014012f, 0.026710f, -0.008891f, 0.014555f, -0.004396f, -0.007224f, 0.019453f, 0.003385f, -0.006013f, 0.006338f, -0.002683f, 0.000496f, -0.005823f, 0.007387f, -0.001656f, 0.002621f, 0.007722f, 0.004516f, 0.002126f, 0.004439f, 0.000089f, -0.000772f, + 0.002937f, 0.000759f, -0.005723f, 0.001123f, -0.001413f, -0.002599f, 0.004670f, -0.000053f, 0.002141f, 0.001977f, -0.001389f, 0.000899f, -0.003485f, 0.000624f, -0.003211f, 0.000207f, -0.001483f, 0.003536f, 0.000663f, 0.003035f, 0.000536f, 0.003683f, 0.000713f, 0.001671f, 0.001927f, 0.000338f, 0.008401f, -0.009133f, 0.002845f, 0.001228f, 0.002822f, -0.013088f, 0.016845f, 0.009736f, 0.022914f, 0.004368f, -0.003173f, -0.026019f, -0.013922f, -0.009807f, 0.006567f, -0.013560f, -0.022508f, -0.006343f, 0.005706f, 0.002410f, -0.025123f, 0.020263f, 0.001523f, -0.001617f, -0.021401f, -0.012382f, 0.005001f, 0.002538f, -0.023767f, -0.007477f, 0.008642f, 0.000863f, 0.002366f, 0.012065f, 0.014186f, 0.008202f, -0.003696f, 0.007062f, 0.002197f, -0.008617f, -0.017581f, 0.030161f, -0.007611f, -0.014846f, 0.000279f, 0.007402f, 0.009775f, 0.022521f, 0.003717f, -0.000520f, -0.008506f, -0.000364f, 0.012552f, -0.001698f, 0.015686f, 0.029937f, 0.002534f, -0.006631f, 0.000923f, 0.025755f, 0.032373f, -0.016244f, 0.004535f, 0.004399f, 0.017517f, 0.009126f, 0.003111f, 0.005259f, -0.012854f, 0.007905f, + 0.008377f, 0.008207f, -0.005532f, 0.000349f, 0.006394f, 0.009507f, -0.001315f, 0.003179f, 0.002275f, -0.011077f, 0.005331f, 0.000383f, -0.009813f, -0.007309f, 0.010526f, -0.004838f, 0.007305f, -0.010642f, -0.007955f, -0.003724f, 0.002456f, -0.000307f, 0.009520f, 0.004168f, 0.001773f, 0.000315f, 0.004807f, 0.004209f, 0.001460f, -0.008125f, 0.000442f, -0.003504f, 0.001375f, -0.002679f, -0.001842f, -0.000257f, -0.000695f, -0.001296f, -0.002603f, -0.007978f, -0.002055f, 0.000684f, -0.005145f, -0.003524f, -0.003211f, -0.000030f, -0.003210f, -0.005683f, -0.001151f, 0.002437f, 0.004395f, -0.001638f, 0.001372f, -0.002263f, 0.001635f, -0.008568f, 0.011769f, -0.010755f, -0.019405f, 0.013212f, -0.001705f, -0.004821f, 0.004935f, 0.011231f, -0.032466f, 0.001863f, 0.024639f, -0.003001f, 0.044437f, 0.021183f, -0.013753f, -0.010112f, -0.004320f, -0.012996f, -0.005862f, 0.019785f, -0.007800f, -0.006643f, 0.019802f, 0.016075f, 0.005202f, 0.009170f, 0.018498f, 0.012225f, 0.013806f, -0.010335f, -0.007136f, 0.017589f, -0.003622f, 0.015913f, -0.000041f, -0.019245f, -0.012447f, 0.005072f, 0.014980f, -0.020920f, + 0.001155f, -0.011219f, 0.005684f, -0.012805f, 0.017543f, 0.017536f, -0.017367f, -0.001936f, 0.004887f, -0.000660f, -0.023434f, -0.010542f, 0.003850f, 0.015344f, 0.025268f, 0.008542f, -0.018972f, -0.004251f, -0.004726f, -0.002305f, 0.015839f, 0.002446f, 0.012663f, -0.019350f, 0.008500f, 0.001222f, -0.015415f, 0.017993f, 0.007539f, -0.002533f, -0.004200f, 0.003034f, -0.000828f, -0.015664f, 0.011586f, -0.003692f, 0.006848f, -0.012191f, -0.021553f, -0.011955f, 0.004914f, 0.009466f, 0.000080f, 0.005191f, 0.019064f, 0.000115f, -0.005064f, 0.012001f, -0.003893f, 0.011293f, 0.000519f, 0.003614f, -0.009914f, 0.000920f, 0.000105f, 0.005141f, 0.005585f, 0.007985f, 0.004969f, -0.002059f, -0.002513f, -0.003823f, 0.009404f, -0.004547f, 0.004824f, 0.000972f, 0.002848f, 0.003852f, 0.005197f, 0.002293f, -0.001992f, 0.004756f, 0.001738f, 0.001552f, -0.002011f, 0.006425f, 0.002911f, 0.001301f, -0.006604f, 0.002288f, -0.002698f, -0.000123f, 0.004253f, 0.001243f, 0.020475f, -0.025579f, -0.004193f, -0.008277f, 0.025927f, -0.011805f, 0.021339f, -0.006860f, 0.019914f, 0.027033f, -0.012194f, 0.008418f, + -0.007055f, 0.015329f, -0.006022f, 0.012735f, 0.010575f, 0.009927f, -0.002441f, 0.010448f, -0.005484f, -0.013657f, -0.006606f, 0.014895f, -0.017747f, 0.002618f, -0.000183f, 0.013247f, 0.027053f, -0.025037f, 0.000760f, 0.024177f, -0.000708f, 0.022087f, 0.002930f, 0.009605f, -0.003181f, -0.002069f, 0.005903f, -0.034528f, 0.003279f, -0.001008f, -0.013767f, 0.008902f, 0.005524f, 0.024739f, 0.012304f, -0.002666f, 0.047241f, 0.011604f, -0.025046f, 0.006406f, 0.002298f, 0.016337f, -0.010847f, 0.002976f, 0.013873f, 0.000901f, 0.008414f, -0.002690f, -0.027342f, -0.028114f, -0.000038f, -0.009643f, 0.022330f, -0.038139f, 0.048673f, -0.000501f, 0.027058f, 0.030838f, 0.007376f, -0.008446f, -0.006295f, -0.014809f, -0.019417f, -0.001879f, 0.006143f, -0.005129f, 0.009672f, -0.006755f, -0.015650f, -0.010062f, -0.007955f, 0.002566f, -0.002523f, 0.001477f, 0.010352f, 0.005010f, 0.004862f, 0.003583f, -0.004451f, -0.005610f, 0.000219f, -0.001386f, 0.002903f, 0.000462f, 0.001119f, 0.003036f, 0.005973f, 0.003359f, -0.012171f, 0.001946f, -0.002370f, 0.008534f, 0.008784f, 0.004868f, -0.000903f, -0.002841f, + 0.003398f, 0.002503f, -0.004354f, -0.004778f, -0.001195f, -0.003356f, 0.000772f, -0.003569f, -0.005925f, 0.002053f, 0.009703f, -0.002802f, 0.003873f, -0.007780f, 0.000909f, 0.004032f, 0.004426f, -0.000511f, 0.002825f, 0.006007f, -0.004685f, 0.002038f, -0.045051f, -0.003138f, 0.015411f, 0.002580f, -0.016883f, -0.041842f, 0.000042f, 0.004830f, -0.007285f, -0.001711f, -0.012272f, 0.006532f, -0.010204f, 0.021612f, 0.007682f, -0.012824f, -0.016006f, -0.027506f, 0.020691f, -0.008756f, 0.001486f, 0.026867f, 0.036992f, 0.022528f, -0.003346f, 0.001955f, -0.025228f, -0.010804f, -0.010091f, 0.006819f, -0.035823f, 0.009404f, 0.009908f, 0.002073f, -0.018366f, 0.017746f, 0.027680f, -0.004431f, -0.000376f, 0.003229f, -0.015894f, -0.016909f, 0.009851f, 0.006676f, 0.020975f, -0.022925f, 0.025008f, -0.013102f, 0.013841f, -0.021227f, -0.016635f, -0.008394f, -0.000417f, -0.002514f, 0.009216f, -0.004580f, -0.036988f, -0.027842f, -0.007700f, 0.000984f, -0.037082f, 0.000513f, 0.018551f, -0.009859f, -0.004158f, 0.005632f, 0.015801f, -0.032761f, 0.016884f, -0.005774f, -0.004776f, -0.000176f, 0.013533f, 0.016697f, + -0.019520f, -0.010063f, -0.013073f, -0.006446f, -0.004622f, 0.009695f, 0.003384f, -0.011897f, -0.005168f, -0.009132f, 0.006477f, 0.021738f, 0.014509f, -0.000150f, -0.000467f, -0.012193f, 0.000626f, -0.007467f, 0.010413f, -0.001905f, 0.018041f, 0.005922f, 0.006406f, -0.006467f, 0.000546f, 0.000159f, -0.014124f, 0.015207f, 0.001316f, -0.002753f, 0.008133f, -0.002882f, -0.002239f, -0.000792f, 0.001352f, -0.012469f, 0.005634f, 0.007478f, 0.008188f, -0.001371f, -0.002747f, 0.002634f, 0.004713f, -0.004527f, -0.002445f, 0.004303f, -0.009243f, 0.000941f, -0.000042f, 0.008752f, -0.000486f, 0.040466f, 0.000947f, -0.008260f, 0.031469f, -0.006926f, -0.012844f, -0.003433f, -0.002926f, 0.039026f, 0.044657f, -0.005862f, 0.009485f, 0.011342f, -0.005725f, -0.021263f, 0.010430f, 0.041499f, 0.031677f, 0.027050f, -0.009848f, 0.011696f, 0.022303f, -0.029006f, -0.021571f, 0.025244f, -0.012909f, -0.014221f, -0.000973f, 0.031571f, -0.004757f, 0.029058f, 0.001920f, 0.026070f, -0.015628f, 0.035840f, 0.010933f, -0.011184f, -0.018293f, 0.006504f, -0.025883f, 0.003062f, -0.030714f, -0.010534f, -0.010999f, 0.017548f, + -0.017569f, 0.028943f, -0.035458f, -0.061454f, 0.038408f, 0.017125f, -0.007505f, 0.000275f, 0.042368f, 0.019826f, 0.003410f, -0.011157f, 0.009195f, -0.004976f, 0.000563f, -0.027552f, -0.027844f, 0.016375f, -0.009305f, 0.009027f, 0.052614f, -0.013795f, 0.011374f, -0.034354f, 0.040678f, -0.013637f, -0.018059f, -0.008736f, -0.005593f, 0.016911f, -0.034326f, 0.028729f, -0.033639f, 0.024281f, -0.017271f, -0.023563f, 0.023570f, -0.001059f, 0.007795f, -0.009577f, 0.013991f, -0.007659f, -0.010502f, -0.004788f, -0.015973f, 0.011043f, -0.000404f, -0.010518f, -0.004327f, 0.003874f, 0.017296f, 0.003214f, 0.002586f, 0.004545f, -0.000291f, -0.002965f, 0.008860f, -0.004937f, 0.004090f, 0.003603f, -0.004303f, -0.001293f, -0.000836f, 0.012295f, 0.010940f, -0.003994f, -0.005792f, -0.012919f, -0.000066f, -0.002658f, -0.001672f, -0.002126f, 0.000571f, 0.011794f, 0.003744f, -0.001444f, 0.015113f, 0.007265f, -0.046018f, -0.034201f, -0.033155f, 0.046362f, 0.001590f, 0.019911f, 0.011889f, -0.040800f, -0.035649f, 0.024013f, -0.063634f, 0.018620f, 0.018957f, -0.004082f, -0.025290f, -0.023296f, 0.039721f, -0.021332f, + -0.002752f, -0.006672f, -0.020510f, 0.030170f, 0.009664f, 0.027293f, 0.015934f, 0.018824f, -0.005913f, 0.030638f, -0.002761f, -0.020065f, -0.023544f, -0.005456f, 0.013367f, -0.017921f, 0.023869f, 0.015253f, -0.017875f, -0.064502f, -0.005345f, -0.005335f, -0.001524f, 0.046801f, 0.001136f, -0.036740f, -0.021695f, -0.022489f, 0.019314f, -0.014199f, -0.030477f, -0.034163f, -0.021135f, -0.016647f, -0.075934f, 0.001753f, 0.009567f, 0.024900f, -0.039623f, 0.012922f, -0.032723f, -0.026927f, -0.009102f, 0.031691f, 0.008218f, 0.029403f, 0.055793f, 0.016664f, 0.012875f, 0.036224f, -0.028228f, -0.003725f, -0.013358f, -0.015653f, 0.029200f, 0.026797f, 0.042852f, 0.020888f, -0.039057f, -0.026213f, 0.030845f, -0.046391f, -0.050855f, -0.016166f, 0.037223f, 0.005736f, -0.008980f, 0.025159f, 0.020757f, -0.000382f, 0.005993f, 0.021294f, -0.013951f, 0.012518f, -0.010256f, -0.002170f, -0.010691f, -0.002206f, 0.002929f, 0.014830f, -0.009447f, -0.012293f, 0.000070f, 0.008259f, 0.002815f, 0.007479f, -0.001103f, -0.012319f, -0.002789f, -0.008256f, 0.000728f, -0.006952f, -0.001214f, -0.001228f, -0.013484f, 0.010722f, + 0.001784f, 0.010906f, 0.014196f, 0.019162f, -0.007215f, -0.010703f, -0.000726f, 0.001531f, 0.001121f, 0.021341f, -0.020787f, -0.042842f, 0.011059f, -0.001172f, -0.001377f, 0.000987f, 0.005334f, 0.008397f, 0.017984f, 0.005450f, 0.015048f, 0.008012f, 0.017934f, 0.047339f, 0.001014f, -0.063077f, -0.023471f, 0.015212f, 0.000025f, -0.013620f, -0.040745f, -0.027082f, 0.007856f, 0.031906f, 0.012016f, -0.031771f, 0.016051f, 0.012544f, -0.035794f, -0.007319f, -0.044124f, 0.033481f, -0.018744f, -0.023395f, 0.030935f, -0.031264f, 0.007920f, 0.065038f, -0.008339f, 0.009980f, 0.018782f, -0.000854f, 0.008948f, -0.039286f, 0.008743f, 0.006051f, 0.005603f, 0.085627f, 0.057855f, -0.007223f, -0.030778f, -0.020728f, 0.026505f, 0.030707f, -0.035272f, -0.020101f, -0.047117f, 0.072930f, 0.019675f, 0.007720f, -0.012537f, -0.008872f, -0.017110f, -0.009947f, 0.052366f, -0.015040f, 0.013675f, 0.052112f, 0.008219f, -0.015812f, -0.040009f, 0.000139f, 0.015031f, -0.079937f, 0.016488f, 0.007754f, 0.053338f, 0.036023f, 0.028091f, 0.047348f, 0.026551f, -0.010479f, 0.004015f, 0.015905f, -0.006212f, 0.001426f, + -0.004185f, 0.006726f, 0.003483f, 0.044141f, -0.002090f, 0.017566f, -0.008744f, 0.016928f, -0.002310f, 0.022912f, 0.004245f, 0.005686f, 0.020916f, -0.002750f, 0.008183f, 0.013669f, -0.000465f, 0.010855f, 0.015871f, 0.006367f, 0.012472f, 0.018467f, 0.010321f, -0.008293f, -0.002294f, 0.003270f, 0.003892f, -0.000865f, -0.008709f, 0.002831f, 0.004200f, 0.001252f, 0.009449f, -0.002518f, 0.015333f, 0.007741f, -0.007578f, 0.015809f, -0.003238f, 0.001352f, -0.011084f, -0.050616f, -0.007306f, 0.034744f, 0.019476f, -0.056712f, -0.074686f, 0.008489f, 0.050629f, 0.020385f, 0.030936f, -0.017712f, 0.023896f, 0.003891f, 0.000629f, -0.027218f, -0.009692f, -0.042323f, 0.062673f, 0.020862f, -0.050854f, -0.035052f, 0.022805f, 0.002266f, 0.012593f, -0.015387f, 0.031307f, 0.018095f, 0.021576f, 0.040846f, 0.036401f, 0.007311f, 0.035600f, -0.018879f, 0.020479f, -0.000285f, 0.024883f, 0.011197f, -0.005852f, -0.015138f, 0.017221f, -0.022390f, 0.058578f, -0.015910f, -0.010928f, 0.011783f, 0.029034f, 0.028366f, -0.019214f, 0.050143f, 0.050053f, 0.028807f, 0.012231f, 0.003968f, -0.015891f, -0.038146f, + -0.064719f, -0.010766f, 0.023252f, -0.001623f, 0.028423f, 0.030554f, 0.033186f, 0.011266f, 0.018581f, 0.107526f, -0.052783f, -0.023374f, 0.010878f, 0.020588f, -0.002523f, -0.084361f, 0.019948f, -0.013317f, 0.012821f, 0.014684f, 0.037496f, 0.007244f, 0.000851f, -0.034056f, 0.035308f, -0.012794f, 0.005288f, 0.030505f, 0.014191f, -0.033020f, -0.006858f, -0.018654f, -0.006052f, -0.014374f, 0.002546f, 0.001074f, 0.013458f, -0.003383f, 0.016370f, 0.015607f, 0.021166f, -0.000425f, 0.000070f, -0.012923f, -0.005464f, -0.017227f, -0.011224f, -0.005287f, 0.022510f, 0.006908f, -0.003246f, 0.001292f, -0.008459f, 0.003003f, 0.019796f, 0.021704f, -0.004097f, -0.020449f, -0.000098f, 0.001025f, 0.009751f, -0.005799f, 0.006836f, -0.009820f, 0.015135f, -0.028528f, 0.003169f, -0.008897f, -0.009698f, -0.000205f, 0.005926f, -0.018454f, 0.009132f, -0.003668f, 0.009052f, -0.009541f, -0.016712f, 0.006269f, 0.028133f, 0.027705f, -0.015390f, -0.020885f, 0.006112f, -0.020068f, -0.064201f, 0.066237f, -0.019428f, 0.018591f, 0.006056f, 0.055557f, 0.044241f, 0.027825f, -0.026606f, -0.004416f, 0.037938f, 0.020151f, + 0.044667f, 0.119275f, -0.007481f, -0.047049f, -0.012355f, 0.035646f, -0.005425f, -0.055561f, 0.084765f, 0.043962f, -0.030028f, -0.046515f, -0.005842f, 0.010418f, -0.014889f, 0.033702f, 0.028530f, 0.033072f, 0.063241f, 0.010608f, 0.017780f, 0.011328f, -0.024664f, -0.058972f, 0.034549f, -0.040124f, -0.030276f, 0.046563f, 0.024270f, 0.026273f, 0.013646f, 0.009609f, -0.002804f, -0.058215f, -0.051837f, 0.000990f, 0.030779f, -0.038472f, 0.036327f, -0.017047f, -0.043331f, 0.013656f, 0.037742f, -0.006964f, 0.007142f, 0.037675f, 0.036931f, 0.038549f, 0.002680f, -0.023448f, 0.021786f, 0.091540f, 0.010869f, 0.037262f, 0.052097f, 0.002616f, -0.016741f, -0.045912f, -0.018766f, -0.072389f, -0.025025f, -0.018064f, -0.009121f, 0.016546f, 0.002631f, -0.003214f, -0.021015f, -0.013638f, -0.012289f, 0.017987f, -0.018831f, -0.003634f, -0.016641f, 0.005450f, -0.010647f, -0.017755f, 0.000500f, -0.025594f, -0.009273f, 0.000544f, -0.023428f, -0.004282f, -0.020445f, -0.011568f, 0.002005f, -0.036992f, -0.003828f, 0.001857f, -0.000657f, 0.017650f, -0.023867f, -0.007660f, 0.025070f, 0.000616f, -0.010239f, -0.000975f, + -0.008793f, 0.005001f, -0.011159f, -0.008106f, 0.012322f, -0.000746f, 0.000563f, -0.019879f, 0.033033f, 0.027086f, 0.000183f, -0.022645f, -0.033177f, -0.058236f, 0.009793f, 0.034922f, 0.047985f, -0.041768f, -0.044471f, 0.053388f, 0.023716f, -0.002663f, -0.005971f, -0.022917f, 0.009770f, -0.010980f, -0.023853f, 0.024172f, 0.029647f, 0.020301f, 0.001505f, -0.004960f, -0.017369f, 0.003053f, 0.012164f, 0.007088f, -0.019555f, -0.067914f, 0.014523f, -0.015901f, -0.020708f, 0.003151f, -0.009208f, 0.005048f, -0.067601f, 0.030683f, 0.024030f, -0.048920f, 0.033317f, 0.044292f, 0.037078f, -0.010694f, 0.005807f, -0.006623f, 0.024009f, -0.006158f, -0.000628f, 0.119328f, -0.036509f, 0.009350f, -0.032646f, -0.019296f, 0.067254f, 0.024154f, 0.022651f, 0.042700f, -0.055643f, -0.046303f, 0.067631f, -0.043757f, 0.034285f, 0.042361f, 0.003635f, 0.010828f, 0.015889f, 0.076616f, -0.026738f, -0.030164f, -0.071386f, -0.015848f, -0.031015f, 0.023359f, -0.044851f, 0.074432f, 0.040391f, 0.045205f, 0.022118f, 0.039424f, 0.020552f, 0.071012f, 0.017168f, 0.033819f, 0.025854f, -0.035906f, -0.017346f, -0.014304f, + 0.005787f, 0.003405f, 0.034638f, 0.014634f, -0.000507f, -0.002331f, 0.007534f, 0.002585f, -0.014137f, -0.027541f, -0.014814f, -0.020854f, 0.024877f, -0.009624f, -0.014941f, 0.007485f, -0.006087f, 0.030598f, 0.013980f, -0.006277f, 0.017083f, -0.020856f, 0.009184f, 0.015043f, -0.006186f, 0.029593f, 0.030470f, 0.019967f, -0.015014f, 0.024866f, 0.014233f, -0.025982f, -0.005353f, 0.001881f, -0.015764f, 0.000968f, 0.021617f, -0.026159f, -0.029853f, 0.012181f, 0.005324f, -0.003594f, 0.027767f, -0.019832f, 0.049093f, -0.029243f, 0.025704f, 0.083828f, 0.041337f, 0.031429f, -0.047669f, 0.012823f, 0.046413f, -0.040566f, 0.065928f, 0.023401f, 0.035008f, 0.031421f, -0.021018f, 0.032577f, 0.027832f, 0.011570f, 0.065324f, 0.049579f, -0.004382f, -0.113138f, -0.013823f, 0.052048f, 0.049945f, 0.051624f, 0.011843f, 0.028685f, 0.001948f, 0.014301f, -0.004360f, -0.035210f, 0.071594f, -0.002152f, 0.068180f, 0.030744f, 0.049022f, -0.069701f, 0.046491f, 0.023268f, 0.020569f, -0.018414f, 0.015731f, -0.013131f, 0.014982f, 0.068983f, 0.026930f, 0.090077f, 0.003820f, 0.019815f, 0.052090f, -0.010774f, + 0.082241f, 0.040741f, 0.006628f, -0.054982f, -0.034951f, 0.030146f, 0.002845f, -0.009216f, 0.001189f, -0.009417f, 0.005884f, -0.040030f, 0.026115f, -0.042608f, -0.064043f, -0.023747f, -0.004170f, -0.021183f, -0.016967f, 0.053757f, -0.007039f, 0.048977f, -0.047226f, 0.053831f, 0.006595f, -0.059462f, 0.058307f, 0.049300f, -0.019071f, -0.008214f, 0.013438f, 0.025966f, 0.015965f, -0.002356f, -0.027666f, 0.017193f, -0.012311f, -0.001555f, 0.033355f, -0.006760f, -0.006228f, -0.027288f, -0.007999f, 0.007846f, 0.004668f, -0.001582f, 0.024911f, 0.022937f, -0.018528f, 0.006448f, -0.001081f, 0.001301f, 0.022855f, 0.007575f, -0.026290f, 0.017676f, -0.022586f, 0.011572f, -0.018399f, -0.006627f, -0.006292f, -0.003497f, 0.002335f, 0.005481f, 0.002454f, 0.001939f, -0.005762f, 0.004933f, -0.013000f, 0.009187f, 0.009099f, -0.001395f, -0.010787f, 0.008249f, -0.002977f, 0.013521f, -0.007852f, -0.005288f, -0.018454f, 0.000092f, -0.018258f, 0.005096f, -0.015227f, -0.049985f, -0.047747f, -0.019048f, -0.020475f, 0.039228f, -0.062599f, -0.078180f, -0.084927f, -0.102768f, 0.046426f, 0.050796f, -0.002539f, -0.008069f, + 0.000096f, -0.024301f, 0.006399f, 0.012996f, -0.021282f, 0.070317f, 0.066523f, 0.043335f, 0.047729f, -0.043375f, 0.029401f, 0.002517f, 0.034934f, -0.013460f, -0.017240f, -0.064242f, 0.058082f, -0.058056f, -0.069897f, -0.018437f, -0.014251f, 0.075634f, -0.040975f, 0.010199f, -0.038634f, -0.010940f, 0.073453f, 0.013527f, 0.023651f, 0.036077f, 0.067533f, 0.004102f, -0.006872f, -0.081790f, -0.014454f, -0.006599f, -0.001674f, 0.044739f, 0.024746f, 0.152182f, 0.008302f, -0.004791f, -0.049808f, -0.004158f, 0.061231f, 0.055408f, -0.004283f, -0.026885f, -0.074491f, 0.018658f, 0.048370f, -0.024543f, -0.054098f, -0.023404f, 0.047711f, -0.014504f, 0.035243f, -0.109177f, -0.060189f, -0.087323f, -0.022764f, 0.034798f, 0.019413f, -0.038167f, -0.035394f, -0.042877f, 0.017979f, 0.089567f, 0.028054f, -0.000632f, -0.030971f, -0.002840f, -0.023915f, -0.007056f, 0.011539f, 0.010326f, -0.027643f, -0.013219f, -0.001611f, 0.019164f, -0.047607f, -0.033381f, -0.010371f, 0.023527f, -0.002335f, 0.031049f, 0.011056f, 0.003331f, -0.009956f, -0.005814f, -0.020830f, -0.005040f, -0.031897f, -0.007756f, 0.037255f, 0.012565f, + 0.017559f, -0.025719f, -0.044464f, 0.022092f, 0.022510f, -0.013687f, 0.001108f, -0.019299f, -0.002366f, 0.005179f, -0.001311f, 0.016521f, 0.011766f, 0.010604f, 0.022864f, 0.011455f, 0.018325f, 0.017893f, -0.002457f, 0.014230f, 0.009203f, 0.013767f, 0.001915f, 0.001816f, -0.013957f, -0.031940f, -0.017293f, 0.072571f, 0.000936f, -0.001051f, 0.129599f, 0.011499f, -0.098581f, -0.076029f, 0.090428f, 0.080127f, 0.003692f, -0.066138f, -0.081822f, -0.047536f, 0.014548f, 0.077914f, 0.069281f, 0.045954f, -0.030304f, 0.007931f, -0.030433f, 0.024524f, 0.058773f, 0.091457f, 0.100010f, -0.014052f, -0.055485f, -0.086935f, -0.129256f, -0.002672f, 0.066950f, 0.275839f, -0.037456f, -0.016127f, -0.135186f, -0.056745f, 0.010077f, 0.030668f, 0.163753f, 0.117708f, 0.072335f, -0.085147f, -0.048675f, -0.083221f, -0.006138f, 0.136872f, 0.126503f, 0.154443f, -0.044262f, -0.154664f, -0.112918f, -0.156150f, 0.037473f, 0.140774f, 0.123600f, 0.229029f, -0.111314f, -0.135128f, -0.118633f, -0.020879f, 0.100543f, 0.134478f, 0.188508f, 0.084634f, -0.041249f, -0.075206f, 0.016137f, -0.006980f, 0.052662f, 0.150583f, + -0.034779f, 0.093071f, -0.035072f, -0.088760f, -0.000094f, 0.012299f, 0.080904f, 0.002555f, -0.009023f, 0.006478f, -0.022915f, -0.076956f, 0.030172f, -0.011785f, 0.024400f, -0.022750f, -0.063598f, -0.016457f, -0.016055f, 0.005642f, 0.039953f, 0.004388f, -0.013322f, 0.014504f, -0.016485f, -0.020773f, -0.005024f, 0.058849f, 0.013916f, 0.053924f, -0.005423f, 0.004916f, -0.017205f, 0.005803f, 0.004985f, 0.009770f, 0.041343f, 0.072508f, -0.003565f, -0.021374f, -0.069078f, -0.090786f, 0.002156f, 0.003978f, 0.106804f, 0.068346f, 0.010353f, -0.038876f, -0.153795f, -0.087203f, -0.014497f, 0.067606f, 0.133542f, 0.068635f, -0.042187f, -0.051728f, -0.159376f, -0.060099f, 0.073991f, 0.137434f, 0.110732f, 0.005884f, -0.072871f, -0.082338f, -0.009386f, -0.004303f, 0.064212f, 0.038190f, 0.034589f, 0.000865f, -0.033741f, -0.019809f, -0.001616f, -0.015547f, 0.019642f, 0.020923f, -0.011543f, -0.067433f, 0.089051f, -0.020330f, 0.105108f, -0.096273f, 0.001436f, -0.041953f, -0.099905f, 0.073526f, -0.052302f, 0.068064f, -0.053481f, -0.020596f, -0.004500f, 0.035101f, 0.008136f, -0.038285f, -0.020157f, -0.001545f, + 0.054652f, -0.050369f, 0.062652f, 0.044779f, -0.033585f, 0.007876f, -0.042252f, -0.042830f, 0.072936f, -0.071515f, -0.035672f, 0.048205f, 0.111230f, -0.000774f, 0.015420f, -0.010158f, -0.048093f, -0.013578f, 0.045671f, -0.015699f, -0.072765f, 0.010324f, -0.015555f, -0.012442f, 0.022549f, -0.066812f, 0.034100f, -0.000277f, 0.023522f, 0.051366f, -0.115874f, -0.086233f, -0.028056f, -0.002725f, 0.120310f, -0.063682f, 0.043935f, 0.094036f, -0.051169f, -0.030737f, -0.002716f, 0.050906f, 0.075007f, -0.040897f, 0.022104f, -0.015200f, 0.030076f, 0.115715f, -0.042434f, -0.130932f, 0.028441f, 0.059592f, 0.016221f, -0.070122f, 0.044250f, 0.017997f, 0.044438f, -0.013990f, -0.001260f, -0.049116f, -0.038028f, 0.028382f, 0.008046f, -0.052362f, 0.016040f, 0.035555f, -0.016644f, -0.000656f, -0.056887f, 0.008049f, -0.013522f, -0.063853f, -0.001351f, 0.027930f, 0.025487f, 0.009771f, -0.000816f, 0.015236f, -0.042439f, -0.011205f, 0.016273f, -0.021535f, 0.034229f, -0.020813f, -0.007527f, -0.019729f, 0.001020f, -0.021003f, 0.032845f, 0.005217f, -0.024190f, -0.022194f, -0.000013f, -0.001531f, 0.053601f, -0.018992f, + 0.019683f, -0.010196f, 0.000055f, 0.010796f, -0.021636f, -0.020800f, 0.004558f, -0.045196f, -0.011231f, 0.012306f, -0.036736f, 0.001035f, -0.005893f, -0.013876f, 0.009302f, 0.023961f, 0.001158f, 0.002828f, -0.013734f, -0.008844f, -0.134727f, -0.042619f, 0.058086f, 0.079490f, 0.066005f, -0.067084f, 0.021615f, -0.187640f, -0.122002f, -0.103589f, -0.016387f, 0.088123f, 0.056713f, -0.003775f, -0.041170f, -0.050811f, 0.025014f, -0.031019f, -0.003074f, 0.067420f, 0.018428f, 0.003331f, -0.066482f, -0.031874f, -0.006682f, -0.031334f, 0.020441f, -0.005371f, 0.036189f, -0.009272f, -0.000280f, -0.011631f, -0.002068f, -0.008400f, -0.037940f, -0.028571f, -0.063735f, -0.044841f, 0.032656f, 0.062669f, 0.068107f, 0.038088f, 0.059360f, -0.008782f, 0.050516f, -0.011537f, -0.023026f, -0.079411f, -0.002993f, -0.043742f, 0.034186f, 0.013329f, 0.100845f, -0.081079f, 0.028976f, 0.056782f, -0.031054f, -0.042943f, -0.024995f, -0.019858f, -0.020597f, 0.007616f, 0.071639f, 0.046311f, -0.019011f, -0.002359f, 0.051436f, -0.059131f, -0.065641f, 0.027470f, -0.076202f, -0.058378f, -0.051135f, 0.006735f, 0.024823f, 0.029964f, + 0.088562f, 0.060498f, -0.009530f, 0.045133f, -0.025701f, 0.002179f, 0.011123f, 0.033558f, 0.053766f, 0.058419f, 0.040907f, 0.034288f, 0.027318f, 0.002747f, -0.074314f, -0.020620f, -0.038360f, -0.009179f, 0.043454f, -0.001433f, 0.006610f, -0.015740f, -0.033086f, 0.004154f, -0.016344f, -0.013041f, -0.036048f, 0.016406f, 0.027068f, -0.011538f, 0.010434f, 0.024482f, 0.013190f, 0.016155f, 0.002727f, 0.015924f, -0.010675f, 0.011133f, -0.005058f, -0.018392f, 0.014427f, 0.018732f, -0.014971f, -0.021218f, 0.001843f, -0.014131f, -0.025518f, 0.020252f, 0.021026f, 0.008886f, 0.027106f, -0.001800f, -0.025251f, -0.030414f, 0.043137f, -0.017221f, -0.160760f, -0.237649f, -0.291763f, -0.230514f, -0.343938f, -0.060754f, -0.125564f, 0.038154f, 0.072312f, 0.249100f, 0.145523f, 0.258044f, 0.262387f, 0.359191f, 0.262204f, 0.266552f, 0.196360f, 0.008517f, -0.056793f, -0.103875f, -0.063852f, -0.214410f, -0.146506f, -0.116669f, -0.119236f, -0.117982f, -0.117755f, -0.114290f, -0.123336f, -0.135356f, -0.100878f, -0.157397f, -0.128694f, -0.112145f, -0.050306f, -0.132246f, -0.040794f, 0.048773f, -0.098227f, -0.047408f, + 0.026553f, 0.021683f, -0.083141f, 0.069482f, 0.089267f, 0.113013f, 0.153266f, 0.155784f, -0.012108f, 0.092670f, 0.150662f, 0.213777f, 0.168516f, 0.336681f, 0.316215f, 0.279303f, 0.226346f, 0.286551f, 0.142324f, 0.228163f, 0.277715f, 0.213905f, 0.136835f, 0.231983f, 0.075348f, 0.077999f, 0.142561f, 0.143016f, 0.101593f, 0.029527f, 0.083066f, -0.027521f, 0.005051f, 0.072716f, -0.082584f, -0.207720f, -0.310474f, -0.122641f, -0.425109f, -0.371851f, -0.327023f, -0.378197f, -0.420767f, -0.352684f, -0.305258f, -0.294490f, -0.202940f, -0.266913f, -0.136979f, -0.169443f, -0.180101f, -0.273200f, -0.220732f, -0.159178f, -0.130328f, -0.110344f, -0.103397f, -0.064794f, 0.025904f, -0.000191f, -0.006124f, 0.077067f, 0.160897f, 0.134179f, 0.135929f, 0.216618f, 0.185262f, 0.192474f, 0.244397f, 0.230445f, 0.196135f, 0.186522f, 0.223773f, 0.190508f, 0.184758f, 0.196009f, 0.203427f, 0.172984f, 0.151317f, 0.139180f, 0.130153f, 0.170027f, 0.133428f, 0.100048f, 0.104664f, 0.078221f, 0.045719f, -0.027103f, -0.056282f, -0.073824f, -0.132196f, -0.113229f, -0.117172f, -0.139618f, -0.147521f, -0.135906f, + -0.088580f, -0.099546f, -0.090016f, -0.091745f, -0.047402f, -0.052772f, -0.063251f, -0.043752f, -0.014511f, -0.016629f, -0.030335f, -0.020082f, 0.000342f, -0.012678f, -0.017124f, -0.015905f, -0.006051f, -0.009492f, -0.013757f, -0.010869f, 0.006723f, 0.010269f, 0.002877f, -0.006467f, 0.000278f, 0.008326f, 0.001994f, -0.007444f, -0.001368f, 0.003282f, 0.001768f, -0.002016f, 0.003158f, 0.002817f, 0.004637f, 0.004010f, 0.000220f, 0.000138f, 0.003834f, 0.004097f, 0.008887f, 0.005518f, -0.001816f, -0.005785f, 0.002256f, 0.004490f, -0.002354f, -0.004541f, -0.002634f, -0.006219f, -0.004688f, -0.005178f, -0.007801f, -0.006668f, -0.006616f, -0.008184f, -0.005178f, 0.000343f, 0.004532f, 0.003025f, 0.007042f, 0.010577f, 0.010361f, 0.008282f, 0.011758f, 0.016522f, 0.015454f, 0.014644f, 0.017240f, 0.016979f, 0.020239f, 0.018041f, 0.016583f, 0.019501f, 0.019521f, 0.014599f, 0.008181f, 0.008348f, 0.006168f, 0.000233f, -0.002012f, -0.004008f, -0.005949f, -0.008641f, -0.009770f, -0.009927f, -0.009434f, -0.009682f, -0.008954f, -0.008162f, -0.007567f, -0.006400f, -0.005698f, -0.004368f, -0.003209f, -0.002596f, + -0.002179f, -0.001650f, -0.001141f, -0.001019f, -0.000831f, -0.000715f} + } +}; +const float CRendBin_Combined_BRIR_coeff_im_48kHz[15][BINAURAL_CHANNELS][2955]={ + { + {0.009861f, 0.004728f, -0.006472f, 0.009783f, -0.005693f, -0.002101f, 0.000249f, -0.003498f, -0.003708f, -0.007780f, 0.001935f, 0.011525f, 0.001291f, 0.001975f, 0.005042f, 0.001088f, -0.004030f, -0.001395f, -0.002356f, -0.002587f, 0.007152f, 0.001824f, 0.001025f, -0.002517f, 0.001401f, -0.000405f, -0.002581f, -0.004504f, 0.006935f, 0.005146f, 0.001075f, -0.001569f, 0.008027f, -0.011147f, -0.004012f, 0.004585f, -0.004473f, 0.009384f, 0.001070f, 0.006590f, 0.000961f, 0.000661f, 0.004438f, -0.003918f, -0.001487f, -0.000245f, -0.000009f, -0.003084f, -0.002277f, 0.004076f, -0.000112f, -0.010291f, 0.009644f, -0.001457f, 0.001722f, -0.008711f, 0.004182f, -0.003921f, 0.003481f, 0.000144f, -0.000199f, -0.003345f, -0.000235f, -0.005087f, 0.005228f, -0.009781f, -0.000996f, 0.006953f, -0.005506f, 0.002520f, 0.010642f, 0.003095f, 0.001154f, -0.005364f, 0.000652f, 0.002699f, -0.001895f, 0.003411f, -0.002124f, -0.001642f, -0.002881f, 0.003075f, -0.003376f, -0.005655f, 0.001854f, 0.000815f, -0.001299f, 0.006680f, -0.001633f, -0.001580f, -0.001568f, 0.002145f, 0.002563f, -0.000287f, 0.000361f, 0.001118f, + -0.001271f, 0.001106f, -0.002534f, -0.001192f, -0.000346f, -0.000659f, -0.001329f, -0.000160f, 0.000002f, -0.000403f, -0.000748f, -0.000175f, -0.001335f, 0.000639f, -0.000633f, 0.001523f, -0.000991f, 0.001105f, 0.001742f, 0.001035f, 0.020367f, 0.003758f, -0.002844f, 0.006221f, -0.003070f, -0.002548f, -0.003252f, -0.001326f, -0.007636f, 0.010824f, 0.006263f, 0.004674f, 0.005042f, 0.004788f, -0.005005f, -0.006756f, 0.009124f, -0.001953f, -0.007055f, -0.013453f, 0.002218f, -0.003978f, 0.004240f, 0.000092f, -0.001126f, -0.003004f, 0.004253f, -0.004977f, -0.002501f, 0.006662f, 0.012656f, 0.003303f, 0.005770f, 0.001108f, 0.006376f, -0.001304f, 0.006784f, 0.004280f, 0.000787f, 0.003797f, 0.000360f, 0.001127f, 0.000374f, 0.009253f, 0.001983f, 0.002448f, -0.002059f, 0.001387f, -0.000626f, -0.001272f, 0.007524f, 0.008600f, -0.003054f, -0.003136f, 0.001761f, 0.007918f, -0.012818f, -0.000650f, -0.003457f, -0.009487f, -0.003836f, 0.001349f, -0.004020f, 0.004255f, 0.003463f, 0.000311f, -0.005762f, 0.002728f, -0.001197f, -0.005518f, 0.007157f, -0.009792f, -0.004603f, -0.010445f, -0.005144f, -0.001455f, + 0.001602f, 0.010603f, -0.004525f, -0.002720f, 0.003313f, -0.001633f, -0.002468f, 0.005042f, -0.000782f, -0.000170f, -0.002238f, -0.003506f, -0.004346f, -0.001134f, 0.003785f, 0.001527f, 0.001867f, 0.001773f, 0.001378f, 0.000175f, -0.000571f, -0.000229f, 0.000354f, 0.002680f, 0.001340f, 0.001433f, -0.000845f, 0.000263f, 0.000965f, 0.000795f, 0.000061f, 0.000218f, 0.000070f, -0.000152f, -0.000300f, -0.001793f, -0.001352f, -0.000906f, 0.001085f, 0.000907f, -0.000346f, 0.001719f, 0.006282f, 0.002583f, -0.012275f, -0.001293f, 0.001964f, 0.008697f, -0.002534f, -0.015507f, 0.012519f, -0.014660f, 0.000895f, -0.006468f, -0.004915f, -0.015539f, -0.010127f, -0.006131f, -0.003768f, 0.006234f, 0.002271f, -0.010270f, 0.001558f, -0.005545f, 0.000198f, -0.000471f, 0.004302f, 0.000742f, -0.004316f, 0.000612f, 0.001202f, 0.002381f, -0.003019f, -0.002281f, -0.000825f, -0.005139f, -0.007517f, 0.010219f, 0.004905f, 0.001287f, -0.001313f, 0.008688f, 0.007721f, -0.008799f, 0.002540f, 0.000714f, -0.001550f, -0.005177f, 0.001252f, -0.009089f, 0.002120f, -0.001825f, -0.007228f, 0.008933f, 0.000253f, -0.000823f, + 0.011428f, -0.009965f, 0.009009f, 0.003170f, -0.001230f, -0.007418f, 0.002213f, -0.001179f, -0.007618f, -0.006551f, 0.000148f, -0.002941f, -0.003374f, -0.010784f, 0.000580f, 0.002144f, 0.005079f, -0.003226f, 0.004729f, 0.001279f, -0.001804f, -0.001622f, -0.006217f, 0.005304f, 0.001192f, 0.000658f, -0.010385f, 0.005346f, -0.000844f, 0.000602f, -0.005333f, 0.000024f, -0.009538f, 0.001022f, 0.002123f, 0.001148f, -0.000767f, 0.000797f, -0.000128f, -0.000078f, -0.001615f, 0.000375f, -0.000444f, 0.001963f, 0.001263f, 0.000726f, 0.002005f, -0.000123f, 0.000717f, 0.001808f, 0.001227f, -0.001514f, -0.000506f, 0.002958f, -0.001057f, 0.000459f, -0.001028f, 0.001004f, -0.003533f, -0.001052f, -0.001053f, 0.001303f, -0.000607f, -0.022894f, -0.021626f, 0.008366f, 0.014360f, 0.008652f, -0.019476f, 0.013867f, -0.004689f, -0.001799f, 0.001259f, -0.009057f, -0.006828f, 0.016368f, -0.000197f, -0.000047f, 0.001278f, -0.000408f, 0.005384f, -0.008169f, 0.004985f, -0.004334f, 0.004473f, 0.007487f, -0.004936f, -0.001363f, 0.004384f, -0.001264f, 0.007861f, -0.002450f, 0.003439f, 0.000667f, -0.000756f, 0.000644f, + -0.006626f, -0.009283f, 0.008798f, 0.001134f, -0.001643f, 0.000066f, -0.008648f, -0.010829f, -0.000256f, 0.000199f, 0.005681f, -0.010066f, -0.008527f, -0.001837f, -0.017824f, 0.006932f, -0.001360f, 0.003640f, -0.001324f, -0.004308f, 0.002784f, 0.022894f, 0.012761f, 0.006643f, -0.006811f, 0.009022f, -0.000051f, -0.011761f, 0.000087f, -0.012274f, 0.010485f, 0.001439f, 0.001287f, -0.006991f, 0.000121f, 0.007141f, 0.002669f, 0.001432f, 0.000950f, 0.000804f, 0.007723f, 0.005353f, 0.001041f, 0.005217f, 0.003153f, 0.004169f, 0.011280f, 0.004670f, 0.005579f, -0.005191f, 0.004275f, 0.003158f, -0.001286f, 0.008861f, 0.002742f, -0.000009f, -0.000738f, 0.002659f, 0.004762f, 0.000595f, -0.000001f, -0.001726f, 0.001189f, 0.003905f, 0.002201f, -0.000861f, 0.000440f, -0.003164f, 0.000973f, 0.000830f, -0.001365f, 0.000339f, -0.000140f, -0.000031f, 0.002231f, -0.000388f, 0.002327f, 0.003151f, 0.001183f, -0.001795f, -0.003463f, 0.000617f, -0.002161f, 0.001738f, 0.001592f, -0.002194f, 0.000978f, -0.005115f, -0.032826f, -0.002518f, -0.007883f, -0.001168f, -0.005472f, -0.018651f, -0.000777f, -0.005031f, + -0.007665f, -0.017487f, -0.002139f, 0.012381f, -0.008652f, 0.008137f, -0.001431f, 0.011480f, -0.003884f, 0.009323f, -0.003067f, -0.009276f, -0.002471f, 0.000972f, -0.004048f, -0.008343f, -0.006675f, -0.008202f, 0.000275f, -0.007487f, 0.002730f, 0.000858f, 0.000755f, 0.003507f, -0.005606f, -0.007543f, 0.010856f, -0.001014f, 0.003224f, 0.000088f, -0.008512f, -0.005428f, -0.006008f, 0.000267f, -0.004313f, 0.007539f, 0.007692f, 0.001244f, -0.010431f, -0.003445f, 0.019194f, 0.004750f, -0.008118f, -0.006484f, -0.004111f, -0.007141f, -0.003761f, 0.014969f, 0.009123f, -0.010912f, 0.006658f, 0.008819f, 0.013054f, -0.003395f, 0.005303f, -0.000828f, 0.000110f, -0.005312f, -0.010879f, -0.001993f, 0.008014f, 0.000800f, 0.015528f, 0.010999f, 0.000728f, 0.003583f, 0.013093f, -0.010461f, -0.004794f, -0.003103f, -0.006441f, 0.004596f, 0.002018f, 0.002096f, -0.005649f, 0.003805f, -0.004109f, 0.004220f, -0.008028f, -0.000396f, -0.000757f, -0.003165f, -0.000213f, -0.000708f, 0.003917f, 0.001057f, 0.000863f, -0.003454f, -0.002345f, -0.001126f, -0.003259f, -0.000155f, -0.004692f, -0.002734f, 0.000164f, -0.000379f, + 0.002882f, -0.002000f, 0.000767f, -0.000975f, 0.001552f, 0.001131f, 0.003992f, -0.003339f, 0.042048f, 0.028307f, -0.008748f, -0.001534f, 0.000063f, -0.001093f, -0.004855f, 0.005934f, 0.014372f, 0.012222f, 0.006280f, -0.022027f, -0.009851f, 0.002898f, 0.001248f, 0.009444f, -0.016658f, 0.003421f, 0.022508f, 0.015233f, -0.002619f, 0.005469f, -0.002010f, -0.007546f, -0.010421f, 0.000646f, -0.008882f, -0.005100f, 0.002567f, 0.007067f, -0.006516f, -0.012018f, -0.005769f, 0.002149f, 0.011078f, 0.015573f, -0.002973f, -0.016320f, -0.003490f, -0.005788f, -0.016469f, -0.000916f, -0.000516f, -0.007819f, 0.002703f, 0.004508f, 0.009597f, -0.013719f, 0.005621f, 0.007194f, 0.001537f, -0.013263f, -0.009926f, 0.004626f, 0.000571f, 0.003545f, -0.001467f, -0.001223f, -0.000474f, -0.007312f, 0.003635f, 0.003947f, -0.005175f, 0.009347f, 0.010946f, 0.015067f, 0.003588f, 0.001210f, 0.014105f, 0.023096f, 0.003668f, 0.003239f, 0.003916f, 0.013621f, 0.001528f, 0.008099f, 0.022710f, 0.006835f, 0.004181f, 0.000724f, -0.004294f, -0.019316f, 0.002594f, -0.000422f, -0.003156f, -0.003618f, 0.002386f, -0.002595f, + 0.004797f, 0.002233f, -0.002570f, -0.001315f, -0.000658f, 0.004017f, 0.002492f, -0.000980f, -0.000756f, 0.002768f, 0.005771f, 0.000147f, -0.001446f, 0.002121f, 0.000222f, -0.002590f, -0.005366f, 0.004003f, -0.005052f, 0.003191f, 0.002138f, 0.003859f, -0.000250f, -0.000515f, 0.000081f, 0.001335f, -0.007047f, 0.000315f, 0.001031f, -0.000556f, 0.000819f, 0.022267f, 0.000377f, 0.004731f, 0.005276f, 0.010799f, -0.004277f, 0.006919f, -0.005868f, -0.003557f, -0.018361f, 0.007400f, 0.012363f, -0.011176f, 0.009358f, -0.004556f, -0.016099f, 0.016775f, 0.009785f, -0.002849f, 0.009896f, 0.019626f, 0.013581f, -0.009944f, -0.005703f, 0.009953f, 0.003029f, -0.002102f, 0.007494f, 0.007069f, 0.010056f, 0.000762f, -0.004513f, -0.008578f, -0.015524f, -0.000386f, -0.012898f, 0.001700f, -0.004250f, 0.007286f, -0.010270f, -0.023333f, 0.005089f, -0.005696f, 0.010757f, 0.002852f, 0.000782f, -0.006369f, -0.013885f, -0.011471f, -0.001160f, -0.001063f, -0.010485f, 0.014798f, 0.018923f, 0.019834f, 0.007907f, -0.013989f, -0.001302f, 0.018800f, 0.001739f, -0.003095f, 0.008638f, -0.002318f, -0.004763f, -0.017602f, + 0.009711f, 0.005263f, 0.025639f, 0.012003f, -0.017511f, 0.005988f, 0.006508f, -0.001722f, -0.000375f, 0.006364f, -0.004301f, 0.001557f, -0.007534f, -0.018258f, 0.016566f, 0.003168f, 0.009855f, 0.004928f, -0.008716f, 0.014196f, -0.003171f, 0.003482f, 0.000713f, -0.002982f, 0.000492f, 0.000560f, 0.001075f, 0.007490f, 0.002395f, 0.001535f, 0.000593f, -0.002385f, -0.003000f, -0.003715f, -0.002312f, 0.002668f, -0.001256f, -0.000062f, -0.001504f, 0.002456f, -0.002189f, -0.000995f, 0.000190f, -0.000151f, 0.000957f, -0.003924f, 0.004683f, -0.001853f, 0.004119f, 0.001500f, -0.002194f, -0.002545f, 0.005828f, -0.005219f, 0.004676f, -0.001168f, -0.006779f, -0.011431f, -0.003029f, -0.002958f, -0.019611f, 0.000931f, 0.002449f, 0.009781f, -0.003682f, -0.008525f, 0.003558f, 0.001014f, 0.004679f, 0.000093f, 0.010702f, 0.004224f, 0.007397f, 0.001193f, -0.000804f, 0.006278f, 0.003730f, -0.019419f, -0.005966f, -0.027733f, 0.001264f, -0.005231f, 0.003204f, 0.004828f, 0.000375f, 0.013144f, 0.003367f, 0.018797f, 0.002319f, -0.022523f, 0.000454f, -0.009114f, -0.003720f, -0.001152f, -0.003377f, -0.001242f, + -0.017805f, 0.003782f, -0.008582f, 0.021341f, -0.022269f, 0.012252f, -0.004857f, -0.019106f, -0.003581f, -0.013467f, -0.002905f, -0.004174f, -0.020254f, 0.005698f, 0.006161f, -0.003814f, -0.003384f, -0.001403f, 0.007117f, -0.016180f, 0.000366f, 0.014946f, 0.002738f, 0.020836f, 0.034174f, 0.014016f, -0.031047f, -0.041493f, 0.020010f, 0.008858f, 0.030836f, -0.006534f, 0.014764f, 0.003032f, 0.014659f, 0.020478f, 0.026482f, -0.014258f, 0.007586f, 0.019611f, -0.016253f, 0.002862f, -0.002158f, -0.002186f, 0.001404f, 0.013951f, -0.002237f, 0.004660f, -0.009229f, 0.003144f, -0.007141f, -0.007602f, -0.003381f, -0.006382f, 0.000921f, -0.003837f, -0.010543f, -0.000567f, 0.006813f, 0.004124f, -0.002057f, -0.002122f, -0.001672f, -0.000042f, 0.003098f, 0.003189f, -0.002826f, -0.004273f, -0.001936f, 0.005792f, -0.001607f, 0.005600f, 0.000777f, 0.000638f, -0.001625f, 0.001187f, 0.001567f, 0.000264f, 0.001448f, 0.000051f, -0.005103f, -0.005046f, -0.003296f, 0.001300f, 0.004809f, -0.007275f, -0.004857f, -0.002472f, 0.002724f, -0.003565f, -0.002850f, -0.038137f, 0.028544f, 0.004936f, -0.004746f, -0.000824f, + -0.016904f, -0.014331f, 0.014995f, -0.004247f, -0.004588f, 0.015021f, -0.011169f, -0.012546f, 0.000888f, 0.014924f, 0.006678f, -0.005212f, 0.000643f, -0.009016f, -0.000991f, 0.000891f, 0.008337f, 0.000048f, -0.019187f, -0.019559f, 0.004486f, -0.002902f, 0.004788f, -0.002256f, 0.007875f, 0.014615f, 0.028015f, -0.000782f, 0.017419f, -0.004608f, 0.004997f, 0.011567f, -0.011501f, 0.022402f, -0.003182f, -0.014520f, -0.019910f, -0.004198f, -0.016515f, -0.021300f, -0.005731f, 0.009248f, -0.006419f, -0.016646f, 0.008152f, 0.011176f, 0.018127f, 0.022969f, -0.019053f, 0.006851f, -0.005307f, -0.017965f, 0.006578f, -0.020038f, -0.003615f, -0.032453f, 0.012773f, -0.009997f, 0.004722f, -0.006218f, 0.005021f, -0.034881f, -0.034348f, -0.021292f, -0.008096f, 0.018572f, -0.018510f, 0.035671f, -0.012801f, 0.003115f, -0.003422f, 0.006254f, -0.003361f, -0.026068f, 0.003637f, 0.002489f, 0.006908f, 0.005435f, 0.002917f, 0.009399f, -0.005775f, -0.009294f, -0.000064f, -0.000123f, -0.008651f, 0.003351f, -0.011112f, 0.005686f, 0.003563f, 0.004500f, -0.001754f, -0.000536f, -0.003507f, -0.009054f, -0.006334f, -0.004054f, + -0.004004f, 0.005073f, -0.003985f, -0.010852f, 0.003363f, 0.003798f, -0.002092f, 0.006364f, -0.000797f, -0.002665f, -0.000263f, 0.001028f, -0.003226f, -0.003554f, 0.003459f, 0.004416f, 0.003525f, 0.001065f, -0.007742f, -0.005996f, -0.001900f, -0.006590f, 0.001907f, -0.000113f, -0.000376f, -0.009266f, -0.004653f, -0.001864f, 0.001918f, -0.000081f, -0.007203f, -0.001500f, -0.000180f, -0.005679f, 0.032473f, 0.001362f, 0.012570f, 0.007919f, 0.003870f, 0.018134f, 0.003072f, -0.026596f, 0.013072f, 0.003242f, 0.012503f, -0.001688f, -0.018826f, 0.027146f, 0.015446f, 0.010853f, -0.002124f, -0.008891f, 0.004048f, -0.002522f, -0.014842f, 0.009424f, 0.007414f, -0.009033f, 0.011592f, 0.017089f, 0.000944f, 0.006119f, 0.017988f, -0.019575f, 0.005044f, -0.006930f, 0.008324f, -0.036375f, 0.011416f, 0.016756f, -0.005570f, 0.004090f, 0.017751f, 0.008743f, 0.000725f, 0.005210f, -0.017514f, 0.004117f, -0.010130f, 0.000300f, 0.005640f, 0.002339f, -0.007768f, 0.033855f, -0.005755f, -0.007019f, -0.007617f, -0.030480f, -0.011763f, -0.018871f, -0.020890f, -0.004603f, 0.029929f, 0.031918f, -0.002813f, 0.009513f, + 0.013345f, -0.027586f, -0.008393f, 0.021505f, 0.018531f, -0.011259f, -0.007247f, -0.027176f, -0.008331f, -0.010593f, -0.012526f, -0.015547f, 0.004341f, -0.027714f, 0.004806f, 0.025052f, 0.036024f, 0.010494f, -0.010189f, -0.001230f, 0.019252f, -0.007122f, -0.012575f, 0.000759f, -0.001346f, -0.006159f, -0.008345f, 0.000785f, -0.000588f, 0.003740f, 0.005954f, 0.002793f, -0.002787f, 0.001162f, 0.003311f, 0.001872f, -0.000212f, -0.005702f, -0.011130f, 0.002772f, -0.000424f, -0.005145f, 0.008943f, 0.002232f, 0.005138f, -0.005339f, 0.007634f, -0.005685f, -0.003716f, -0.006338f, 0.006105f, 0.000684f, 0.004577f, 0.008119f, -0.000477f, -0.004906f, -0.002124f, 0.003838f, 0.002196f, -0.000846f, 0.000487f, 0.000720f, 0.001494f, -0.000966f, -0.001478f, 0.003909f, 0.006121f, 0.015138f, 0.007368f, -0.002852f, -0.010152f, 0.006355f, 0.001606f, -0.013347f, -0.019928f, -0.021305f, -0.008600f, -0.020835f, -0.008754f, -0.008433f, 0.000257f, -0.019831f, 0.004367f, 0.008385f, 0.000846f, -0.022652f, 0.006971f, -0.028111f, 0.008610f, 0.015715f, 0.000363f, 0.024414f, 0.000654f, -0.007255f, -0.004544f, 0.016463f, + -0.006013f, 0.022654f, 0.007973f, -0.007841f, -0.007857f, 0.003985f, -0.011644f, -0.006246f, 0.000761f, 0.021413f, -0.000811f, 0.011310f, 0.006348f, 0.001927f, 0.014940f, -0.006761f, -0.013878f, 0.006088f, -0.009969f, -0.004607f, -0.027028f, 0.015137f, -0.009566f, -0.007994f, -0.005567f, -0.029724f, 0.035399f, 0.009169f, -0.004350f, 0.015420f, 0.004938f, 0.007479f, -0.015850f, -0.023692f, -0.027026f, -0.013043f, 0.001266f, -0.027235f, 0.009996f, 0.019628f, -0.030625f, -0.011199f, 0.011029f, -0.014107f, 0.007202f, 0.033790f, 0.000921f, -0.005573f, -0.009173f, 0.007557f, -0.018592f, 0.011950f, 0.006323f, -0.016725f, 0.005263f, 0.011698f, -0.006903f, -0.019797f, -0.017028f, -0.008932f, -0.000836f, 0.005256f, 0.004381f, 0.003546f, -0.003647f, -0.005068f, -0.002672f, 0.004193f, 0.000001f, -0.002942f, -0.011366f, -0.013430f, -0.003878f, 0.000736f, -0.009734f, -0.011546f, -0.008117f, -0.004968f, -0.004613f, -0.010167f, -0.008878f, -0.004836f, -0.006490f, -0.012940f, 0.001914f, 0.011718f, -0.001518f, -0.001357f, -0.005110f, -0.003859f, 0.003651f, -0.004739f, 0.000571f, -0.010292f, 0.000023f, -0.003181f, + -0.005749f, -0.000302f, -0.005424f, 0.002837f, 0.004302f, -0.004516f, 0.006687f, -0.005253f, -0.002329f, -0.005429f, -0.000794f, 0.000477f, 0.009634f, 0.021138f, 0.054241f, 0.056079f, 0.017555f, 0.034644f, -0.023564f, -0.024682f, -0.005191f, -0.003990f, 0.002502f, 0.007564f, 0.018494f, 0.032044f, 0.011099f, 0.029632f, 0.003780f, 0.008703f, 0.004923f, -0.008671f, 0.014151f, -0.000728f, 0.005907f, 0.001957f, -0.014854f, -0.002258f, -0.007770f, -0.016931f, -0.009896f, -0.000091f, 0.002079f, -0.022332f, -0.008634f, 0.027347f, 0.020373f, 0.014051f, 0.023869f, -0.014878f, 0.000566f, -0.040605f, 0.002281f, 0.034228f, -0.006342f, -0.007217f, 0.004556f, -0.004041f, 0.027453f, -0.002477f, -0.004117f, 0.020534f, -0.024497f, -0.040653f, -0.015868f, 0.003287f, -0.021302f, 0.015723f, 0.022829f, -0.032074f, -0.011648f, -0.000041f, -0.000216f, -0.045885f, -0.028655f, 0.014313f, 0.006675f, -0.003703f, 0.015042f, -0.020182f, -0.011841f, -0.028435f, 0.007058f, 0.008768f, 0.002698f, 0.001680f, -0.018347f, -0.031307f, 0.026032f, -0.042470f, 0.012683f, -0.015721f, 0.040652f, 0.003946f, 0.017149f, -0.011732f, + -0.015577f, 0.011467f, 0.005784f, 0.017846f, -0.016867f, -0.003325f, 0.012581f, -0.001018f, -0.009199f, -0.009095f, -0.009039f, 0.000702f, 0.009742f, 0.010170f, -0.011272f, -0.005014f, -0.001566f, -0.015613f, -0.005166f, 0.002638f, -0.001375f, 0.001188f, -0.007771f, -0.013711f, -0.001613f, 0.000196f, 0.010933f, 0.003147f, -0.006260f, 0.008063f, 0.001715f, 0.004041f, -0.014630f, 0.002929f, -0.008613f, 0.006967f, 0.001628f, 0.007388f, 0.012319f, 0.003604f, -0.008120f, -0.016933f, 0.005584f, 0.005547f, -0.052391f, -0.037847f, 0.026246f, -0.005544f, 0.047643f, -0.011684f, 0.039241f, -0.031584f, 0.001046f, 0.013979f, -0.003021f, 0.001603f, 0.004695f, -0.002540f, -0.023535f, 0.008204f, 0.008990f, 0.010256f, 0.011876f, -0.007359f, 0.019524f, -0.017743f, -0.012936f, -0.010183f, 0.027423f, -0.015176f, -0.004984f, 0.002355f, -0.000471f, -0.014283f, 0.012285f, -0.015927f, -0.018742f, -0.035619f, 0.003342f, 0.006410f, -0.024021f, -0.011358f, 0.011723f, -0.004987f, 0.006313f, 0.001823f, 0.028156f, 0.001845f, 0.021218f, 0.009307f, 0.001015f, 0.016808f, 0.003951f, 0.005748f, -0.031710f, 0.032655f, + 0.011716f, 0.025559f, -0.015493f, 0.006699f, -0.016966f, 0.026516f, 0.020322f, 0.032374f, 0.005296f, -0.008634f, -0.023505f, -0.001594f, 0.004282f, -0.020232f, 0.028679f, 0.004478f, 0.004562f, 0.030625f, 0.007004f, -0.009348f, -0.012157f, -0.001134f, 0.018408f, 0.021933f, -0.007049f, 0.027384f, -0.032800f, -0.034638f, -0.014967f, 0.007881f, -0.010385f, 0.014904f, -0.003616f, 0.007934f, 0.026502f, -0.001320f, 0.013226f, -0.011126f, -0.009895f, 0.011377f, -0.000870f, 0.018337f, -0.005567f, -0.000276f, -0.005527f, -0.011581f, 0.002468f, -0.006884f, -0.002517f, 0.007452f, 0.002749f, -0.010552f, -0.009353f, 0.005379f, 0.014162f, 0.014348f, -0.001302f, 0.011717f, 0.013084f, -0.018295f, 0.008621f, 0.016934f, 0.013643f, 0.007401f, -0.013345f, -0.016586f, -0.016905f, -0.017429f, -0.016911f, 0.001220f, -0.005776f, -0.002616f, 0.002133f, -0.012822f, 0.009145f, 0.007876f, -0.006274f, 0.009407f, 0.003644f, 0.004311f, -0.011766f, 0.009784f, 0.024189f, -0.057059f, -0.002607f, 0.029708f, -0.019013f, -0.006368f, 0.021882f, -0.023788f, -0.048278f, 0.009555f, 0.008163f, 0.007432f, -0.006336f, -0.028589f, + 0.007155f, 0.008051f, 0.002098f, 0.015779f, -0.051196f, 0.023394f, -0.011947f, 0.012134f, -0.029214f, 0.023623f, -0.036954f, -0.023641f, 0.014226f, -0.009760f, -0.004388f, -0.028137f, 0.021921f, 0.028876f, -0.000187f, 0.003112f, -0.013453f, 0.043357f, 0.010663f, 0.011725f, -0.008025f, -0.037763f, -0.008222f, 0.020639f, -0.003922f, 0.030953f, 0.000121f, -0.011427f, 0.007360f, -0.002334f, 0.019357f, -0.037393f, -0.004653f, -0.028723f, 0.030716f, -0.011675f, 0.010186f, -0.001047f, -0.001272f, -0.033929f, -0.012026f, 0.029448f, 0.009289f, 0.002453f, -0.009117f, 0.000671f, 0.003596f, -0.043454f, -0.044970f, 0.047460f, -0.021364f, -0.051998f, 0.020865f, 0.024238f, -0.041892f, -0.054772f, -0.038273f, -0.036795f, 0.006275f, 0.014250f, -0.004789f, -0.035393f, -0.001369f, -0.019078f, -0.009086f, -0.025751f, -0.001663f, 0.002269f, 0.002315f, -0.005385f, 0.023863f, -0.013405f, 0.009227f, -0.011436f, -0.000814f, 0.006284f, -0.006410f, -0.001277f, -0.014535f, 0.018490f, -0.004677f, 0.006258f, -0.010740f, -0.015606f, -0.003450f, 0.007014f, 0.008163f, 0.002274f, -0.015152f, 0.008417f, -0.002431f, -0.012331f, + 0.011358f, -0.018472f, -0.003912f, -0.011591f, 0.017811f, -0.008395f, -0.020421f, 0.008320f, -0.008292f, -0.009110f, -0.027037f, -0.001857f, 0.005649f, 0.021934f, 0.008818f, -0.013691f, -0.007127f, 0.001734f, -0.003946f, -0.007535f, 0.003762f, -0.001537f, -0.005487f, -0.005540f, -0.002137f, 0.021949f, -0.030893f, -0.017846f, -0.032319f, -0.003427f, 0.007077f, -0.044332f, 0.007400f, -0.021886f, 0.061455f, 0.002813f, -0.054622f, -0.013038f, 0.027001f, 0.015901f, 0.013340f, 0.027296f, 0.028169f, -0.040070f, -0.009797f, -0.015742f, 0.037525f, -0.013469f, 0.043755f, -0.000445f, -0.024780f, -0.020370f, -0.038527f, -0.044904f, 0.002939f, 0.004806f, -0.006995f, -0.023316f, -0.009494f, 0.002633f, 0.007326f, 0.014923f, -0.021517f, 0.010707f, -0.025355f, -0.030468f, 0.006132f, -0.006769f, -0.007781f, -0.031749f, -0.029555f, -0.014670f, -0.008969f, 0.042350f, 0.004174f, 0.014024f, 0.024200f, -0.001045f, 0.053871f, 0.021446f, -0.017672f, 0.002477f, 0.027829f, -0.011080f, 0.035175f, -0.009473f, 0.004578f, 0.002148f, -0.047296f, -0.048857f, 0.007357f, 0.033714f, 0.000896f, -0.010845f, -0.052945f, 0.003169f, + 0.018305f, 0.011158f, -0.018071f, -0.015080f, -0.010410f, 0.006256f, -0.022794f, 0.056174f, 0.031957f, 0.034360f, 0.007009f, -0.040047f, 0.014624f, 0.017947f, 0.056308f, 0.012735f, 0.005877f, 0.022343f, 0.009769f, -0.009377f, 0.000645f, 0.017077f, -0.001474f, 0.002150f, 0.005721f, -0.014457f, -0.009871f, 0.016612f, 0.000601f, -0.013770f, 0.017811f, -0.011159f, -0.003948f, -0.008590f, -0.008039f, 0.015546f, -0.010037f, -0.004724f, 0.008449f, -0.017118f, 0.007237f, -0.001714f, -0.009574f, 0.020567f, -0.007370f, -0.000162f, -0.026347f, 0.016000f, -0.007976f, -0.007049f, -0.016955f, -0.024379f, 0.003937f, -0.009917f, 0.017153f, -0.000696f, 0.010217f, 0.006380f, 0.000480f, -0.010225f, 0.000373f, 0.015287f, -0.000078f, -0.026541f, -0.023940f, 0.050721f, -0.015626f, -0.018955f, -0.002552f, -0.014133f, -0.034495f, 0.000631f, 0.024091f, -0.059527f, -0.000888f, 0.015318f, 0.019099f, -0.020360f, 0.013601f, -0.034114f, 0.002747f, -0.008869f, 0.010775f, -0.030556f, 0.019099f, -0.051966f, 0.008635f, 0.001348f, 0.029524f, 0.027576f, 0.013892f, -0.019449f, 0.021734f, -0.006386f, 0.024264f, -0.026336f, + 0.004288f, 0.030707f, 0.024523f, -0.014500f, 0.005150f, 0.000722f, -0.006680f, 0.014877f, -0.005663f, -0.017957f, -0.019822f, 0.014191f, -0.035922f, 0.023787f, 0.005709f, -0.038709f, 0.036583f, 0.034848f, 0.032963f, 0.011814f, -0.016909f, 0.042189f, 0.005219f, 0.018117f, -0.025777f, -0.022514f, -0.024703f, 0.007699f, 0.009778f, 0.015114f, -0.034710f, 0.003374f, 0.025781f, -0.066924f, 0.002653f, -0.021981f, 0.042082f, 0.027046f, 0.021202f, -0.005922f, 0.027942f, -0.026241f, -0.001244f, -0.018269f, -0.040106f, -0.001683f, -0.036922f, -0.030993f, 0.018278f, 0.049458f, -0.046341f, -0.011014f, -0.008361f, 0.049656f, -0.012143f, 0.021732f, -0.014103f, -0.008691f, -0.001774f, 0.017584f, -0.010253f, -0.004306f, 0.001561f, 0.011992f, 0.008940f, 0.006321f, -0.006488f, 0.001847f, 0.005311f, 0.024622f, -0.019330f, 0.020554f, -0.004338f, 0.015048f, 0.000157f, 0.004028f, 0.005358f, 0.009490f, -0.012743f, -0.002874f, -0.002366f, -0.015953f, -0.014168f, -0.014149f, 0.009976f, 0.007962f, -0.002788f, -0.006325f, -0.008112f, -0.011145f, -0.006807f, 0.000983f, -0.004848f, -0.000068f, 0.014940f, -0.000295f, + -0.026970f, 0.012777f, -0.015727f, -0.002360f, 0.011559f, -0.004421f, 0.044845f, 0.008974f, 0.023018f, -0.064336f, 0.030163f, -0.036234f, 0.048868f, -0.005365f, 0.019388f, 0.036037f, -0.038890f, 0.069877f, 0.051090f, 0.037577f, -0.016729f, 0.009781f, 0.048835f, -0.012584f, -0.014961f, -0.011723f, -0.001995f, -0.036923f, 0.010200f, -0.019853f, -0.043698f, 0.042391f, 0.014704f, 0.011338f, 0.005896f, 0.009501f, 0.017109f, 0.044655f, 0.009995f, -0.028530f, -0.001884f, -0.029587f, 0.006290f, 0.003809f, -0.050791f, -0.002586f, 0.028448f, 0.001637f, -0.003160f, -0.016055f, 0.055049f, 0.010847f, 0.023738f, 0.011620f, -0.028934f, -0.021425f, -0.015581f, 0.033506f, 0.020520f, -0.007171f, 0.021078f, -0.003407f, -0.036634f, 0.035661f, 0.004899f, 0.040935f, 0.005084f, 0.003874f, 0.001334f, -0.055213f, 0.007991f, 0.001081f, 0.006586f, 0.033722f, -0.012964f, 0.053284f, -0.081023f, -0.014855f, 0.061333f, -0.025001f, 0.020639f, -0.028138f, -0.042885f, -0.035338f, 0.025712f, -0.024272f, 0.024010f, -0.037940f, -0.007517f, 0.005956f, -0.008725f, -0.015140f, -0.004225f, -0.004791f, 0.016920f, 0.037407f, + 0.004521f, 0.022049f, -0.006797f, -0.004134f, 0.028086f, -0.004375f, -0.007334f, 0.007262f, -0.013239f, 0.011886f, 0.024531f, -0.016394f, -0.001915f, -0.006612f, 0.004936f, 0.004144f, 0.011931f, 0.042307f, -0.007201f, 0.014671f, 0.001320f, 0.009895f, 0.016062f, 0.007426f, 0.002955f, 0.023393f, 0.026246f, -0.007528f, -0.003048f, 0.010255f, 0.006140f, 0.008828f, -0.032484f, -0.003096f, 0.031968f, -0.007392f, 0.007095f, 0.011964f, -0.001175f, 0.032552f, 0.011271f, -0.065878f, -0.079152f, -0.006838f, -0.037186f, 0.005151f, 0.022328f, -0.031481f, 0.009062f, -0.048159f, 0.020839f, -0.026472f, -0.132197f, -0.008381f, 0.080371f, -0.034604f, -0.015104f, 0.081042f, -0.019169f, 0.004471f, 0.096781f, -0.023099f, 0.021260f, 0.009166f, -0.014343f, 0.078176f, -0.063057f, -0.008028f, -0.001903f, -0.010977f, -0.012841f, -0.012791f, -0.001752f, 0.025507f, -0.014502f, -0.042534f, 0.000292f, 0.000918f, 0.012400f, 0.015595f, 0.002628f, 0.035121f, -0.001534f, 0.016187f, -0.009764f, -0.042227f, 0.029274f, -0.005150f, -0.043716f, 0.001705f, 0.024910f, 0.076940f, 0.038712f, 0.064680f, 0.001165f, 0.015939f, + 0.030667f, 0.007306f, -0.003970f, 0.060449f, -0.003384f, -0.023546f, 0.070558f, 0.012360f, 0.012305f, 0.000502f, -0.010185f, 0.040414f, -0.000218f, -0.023533f, -0.026752f, -0.005520f, -0.005463f, 0.061181f, -0.041733f, 0.005326f, 0.007667f, -0.010926f, 0.071669f, 0.000552f, -0.046203f, 0.007664f, 0.023270f, -0.033841f, -0.001842f, 0.034350f, 0.028179f, -0.017447f, 0.002506f, -0.019716f, 0.016360f, -0.005382f, 0.002050f, -0.019421f, 0.017741f, 0.000126f, -0.002193f, -0.028198f, 0.011397f, 0.009475f, -0.018536f, 0.001314f, 0.006421f, -0.009598f, -0.006470f, 0.021557f, 0.003162f, 0.011951f, -0.008201f, 0.006207f, 0.037368f, -0.034297f, -0.015791f, -0.011368f, 0.040422f, 0.014975f, 0.021289f, -0.024747f, -0.022673f, -0.009321f, -0.002933f, -0.029995f, -0.033691f, 0.039917f, 0.015982f, -0.023755f, -0.022174f, -0.013639f, -0.000467f, -0.023581f, -0.020705f, 0.000088f, 0.005970f, 0.015000f, -0.004159f, -0.007693f, 0.012219f, -0.003205f, 0.003833f, 0.044996f, 0.036115f, -0.073924f, -0.036282f, 0.056983f, -0.010561f, -0.055379f, -0.000595f, 0.001235f, 0.020008f, 0.060257f, 0.053430f, -0.032869f, + 0.009825f, -0.007398f, 0.000395f, -0.000481f, -0.034728f, 0.052280f, -0.015574f, -0.034153f, 0.012109f, -0.024498f, 0.029592f, 0.002667f, 0.042114f, -0.012929f, -0.040081f, -0.036100f, 0.031898f, -0.015317f, 0.041549f, -0.011105f, 0.026896f, -0.027297f, -0.021326f, -0.012947f, 0.002930f, -0.034278f, 0.008375f, 0.001885f, 0.000519f, 0.033642f, -0.000430f, 0.011287f, -0.023362f, 0.016715f, -0.036843f, 0.039478f, -0.035441f, 0.023498f, 0.011878f, 0.033202f, -0.055444f, 0.001973f, 0.004647f, -0.016669f, -0.040059f, -0.067753f, -0.011363f, -0.057800f, -0.022267f, -0.046236f, -0.021583f, -0.084571f, -0.026309f, 0.038509f, 0.048657f, 0.026579f, 0.028337f, -0.004476f, 0.030791f, -0.060217f, -0.013763f, 0.009466f, 0.038998f, 0.010859f, -0.082922f, -0.003161f, -0.036422f, -0.024165f, 0.097063f, 0.065318f, -0.045927f, -0.018596f, -0.032222f, 0.010941f, -0.085419f, 0.005387f, 0.017936f, -0.024304f, -0.025267f, 0.015695f, 0.005108f, 0.000973f, -0.016295f, -0.014260f, -0.013927f, -0.014094f, 0.026833f, 0.024652f, -0.001591f, -0.006688f, -0.026149f, -0.030028f, -0.006236f, -0.007382f, 0.010367f, 0.026294f, + -0.050760f, -0.003667f, 0.025725f, 0.000098f, 0.032872f, -0.011182f, -0.031010f, 0.017103f, 0.035545f, 0.018056f, -0.020912f, 0.002829f, 0.032950f, -0.041332f, -0.029296f, 0.055380f, 0.003368f, -0.001638f, -0.005254f, 0.009004f, 0.013083f, 0.017023f, -0.006538f, -0.013142f, -0.015429f, -0.097175f, 0.028109f, 0.015653f, -0.051737f, 0.020593f, 0.018685f, -0.036940f, -0.029015f, 0.044153f, 0.005045f, 0.023663f, -0.012189f, 0.029283f, -0.009630f, -0.004273f, 0.022408f, 0.011337f, 0.007068f, 0.000929f, -0.015836f, -0.026196f, -0.016569f, 0.041731f, -0.015042f, -0.035664f, 0.060670f, 0.038032f, 0.004399f, 0.028152f, 0.007836f, -0.031305f, -0.093761f, 0.038477f, -0.003559f, -0.050180f, 0.041892f, -0.004236f, -0.068472f, -0.056980f, -0.030192f, 0.044886f, 0.017473f, 0.046511f, 0.057875f, 0.017648f, -0.047594f, 0.015137f, 0.016499f, -0.059816f, -0.010149f, 0.034043f, -0.019200f, -0.065205f, -0.050087f, -0.079535f, -0.051302f, -0.011323f, 0.049930f, 0.073158f, 0.034690f, -0.004625f, 0.049773f, -0.012339f, -0.123635f, -0.097467f, 0.020987f, -0.049007f, -0.058846f, 0.083886f, 0.010599f, -0.112368f, + -0.087473f, 0.029932f, 0.004749f, 0.019482f, 0.041412f, 0.101038f, 0.057375f, -0.008242f, 0.111813f, 0.036040f, -0.118225f, 0.001305f, -0.025554f, 0.061152f, 0.017842f, -0.038394f, 0.018479f, -0.028752f, -0.017676f, -0.024975f, 0.037847f, -0.006804f, 0.027553f, 0.023774f, 0.029875f, -0.006496f, -0.030856f, -0.009580f, 0.020485f, -0.012813f, 0.017153f, 0.011636f, 0.012239f, -0.026106f, 0.002732f, 0.010973f, 0.000110f, 0.047751f, -0.002046f, 0.021376f, 0.004237f, -0.007568f, 0.024941f, 0.006406f, -0.004204f, 0.028496f, -0.013911f, -0.004020f, 0.016844f, 0.007375f, -0.003103f, -0.011163f, -0.016421f, 0.002094f, -0.018799f, -0.013377f, 0.009428f, 0.013848f, -0.014521f, 0.092016f, 0.089768f, -0.028367f, 0.031422f, -0.036904f, 0.022680f, 0.001051f, 0.013228f, -0.043945f, 0.003736f, -0.037564f, -0.033110f, 0.000186f, -0.076831f, 0.001773f, -0.032555f, 0.008465f, 0.022915f, -0.000717f, 0.026504f, -0.038004f, 0.057674f, -0.028504f, -0.000794f, 0.039616f, -0.037184f, 0.014514f, 0.028887f, 0.035140f, 0.005286f, 0.012632f, 0.008928f, -0.055457f, -0.030623f, -0.009016f, 0.008358f, 0.008487f, + -0.008060f, 0.036656f, -0.011674f, -0.000559f, -0.006845f, -0.015948f, 0.013143f, 0.007262f, -0.043639f, 0.012846f, -0.035045f, 0.009594f, -0.084407f, -0.004143f, -0.001971f, -0.000236f, 0.034664f, -0.013983f, -0.030694f, -0.013830f, 0.031850f, -0.000163f, -0.081591f, 0.114277f, -0.009871f, -0.021935f, 0.025041f, -0.005061f, -0.016705f, -0.021509f, -0.022649f, -0.024589f, 0.078545f, -0.030411f, -0.045314f, 0.038784f, 0.003914f, -0.061987f, -0.014489f, 0.025775f, 0.020700f, -0.020508f, 0.042415f, -0.007565f, -0.011489f, 0.039016f, -0.028695f, -0.026581f, 0.049596f, -0.022022f, -0.007708f, -0.002823f, 0.021085f, 0.010004f, -0.000395f, -0.003614f, 0.001349f, 0.009221f, -0.010044f, -0.000920f, 0.009817f, 0.010130f, 0.012422f, -0.030524f, 0.007961f, 0.015149f, -0.029398f, 0.002320f, 0.006318f, -0.005428f, -0.011816f, 0.011735f, 0.003527f, -0.010867f, 0.001854f, -0.001211f, -0.004832f, -0.037411f, 0.021289f, -0.022228f, 0.006824f, 0.006083f, -0.033507f, -0.002100f, 0.001808f, -0.000433f, -0.000311f, -0.011608f, -0.001490f, 0.009300f, -0.001194f, -0.072794f, -0.107332f, -0.103293f, 0.228698f, 0.189721f, + 0.216137f, 0.488177f, 0.127881f, -0.122279f, 0.038773f, -0.391487f, -0.414923f, -0.102676f, -0.260663f, -0.201646f, 0.123701f, -0.064035f, 0.026031f, 0.311196f, 0.154727f, 0.230736f, 0.443201f, 0.295355f, 0.077561f, 0.064424f, -0.130096f, -0.402913f, -0.307605f, -0.235507f, -0.475845f, -0.192439f, 0.011942f, -0.083989f, -0.037398f, 0.241323f, 0.064472f, 0.032753f, 0.299051f, 0.037391f, 0.072009f, 0.424437f, 0.312366f, 0.197838f, 0.401536f, 0.200178f, -0.069643f, -0.005533f, -0.126131f, -0.623888f, -0.544145f, -0.439718f, -0.683479f, -0.520775f, -0.183909f, -0.246369f, 0.056557f, 0.475847f, 0.425255f, 0.588063f, 0.742482f, 0.552493f, 0.431295f, 0.419351f, 0.232534f, -0.077657f, -0.148306f, -0.339775f, -0.485230f, -0.476781f, -0.412816f, -0.473266f, -0.484095f, -0.389246f, -0.217127f, -0.157332f, 0.059939f, 0.372606f, 0.537073f, 0.766016f, 0.861689f, 0.514632f, 0.125797f, -0.072764f, -0.517464f, -0.492612f, -0.374916f, -0.291373f, -0.107666f, 0.055667f, 0.041671f, 0.053647f, 0.067175f, 0.031719f, 0.078919f, 0.110224f, 0.082237f, 0.132941f, 0.076132f, -0.032975f, -0.040205f, -0.115901f, + -0.212314f, -0.057755f, -0.065800f, -0.076240f, 0.067833f, 0.058143f, -0.071552f, -0.092667f, -0.172741f, -0.282883f, -0.118219f, 0.162518f, 0.276399f, 0.535163f, 0.645724f, 0.439170f, 0.273013f, 0.073629f, -0.240922f, -0.353040f, -0.399407f, -0.467304f, -0.438970f, -0.336790f, -0.272645f, -0.225616f, -0.136415f, -0.033819f, 0.118717f, 0.408996f, 0.570724f, 0.506647f, 0.364616f, 0.225404f, 0.049972f, -0.086908f, -0.133028f, -0.168969f, -0.120026f, -0.031353f, -0.004510f, -0.033823f, -0.056802f, -0.092139f, -0.148173f, -0.192950f, -0.186230f, -0.186952f, -0.108876f, 0.019306f, 0.070861f, 0.128866f, 0.169308f, 0.171242f, 0.133607f, 0.091204f, 0.052386f, 0.029479f, 0.042638f, 0.057988f, 0.059306f, 0.052454f, 0.031576f, -0.011994f, -0.069441f, -0.115822f, -0.141930f, -0.144999f, -0.116518f, -0.092066f, -0.074477f, -0.038431f, 0.010585f, 0.041442f, 0.053753f, 0.061745f, 0.065944f, 0.078480f, 0.086317f, 0.077374f, 0.044463f, 0.019444f, 0.005761f, -0.011367f, -0.016411f, -0.010064f, -0.015757f, -0.009020f, 0.003079f, -0.004980f, -0.022198f, -0.027010f, -0.044240f, -0.062779f, -0.059964f, -0.053628f, + -0.040944f, -0.006147f, 0.022612f, 0.037032f, 0.052589f, 0.060140f, 0.043320f, 0.033274f, 0.018603f, 0.005209f, 0.004834f, 0.017076f, 0.015908f, 0.014278f, 0.008056f, -0.011115f, -0.024635f, -0.038002f, -0.051613f, -0.052053f, -0.040976f, -0.022309f, -0.003272f, 0.017070f, 0.030412f, 0.036239f, 0.029766f, 0.019500f, 0.008779f, 0.003104f, 0.001243f, 0.000941f, -0.001242f, -0.003061f, -0.005562f, -0.006313f, -0.006105f, -0.004252f, -0.002774f, -0.000625f, 0.000069f, 0.000953f, 0.000055f}, + {0.016638f, -0.002184f, 0.001321f, 0.013096f, -0.001693f, -0.000605f, -0.003820f, 0.014286f, 0.000830f, 0.006948f, 0.004214f, 0.004207f, -0.005900f, 0.002966f, -0.009134f, -0.000990f, 0.007070f, 0.001438f, 0.004137f, 0.006667f, -0.011278f, -0.007869f, 0.002675f, -0.000558f, 0.008357f, 0.005095f, -0.000442f, -0.004641f, -0.002928f, -0.005742f, -0.000922f, -0.000765f, -0.000869f, 0.001592f, 0.002180f, -0.004997f, 0.008377f, -0.001925f, -0.001315f, 0.002866f, -0.010693f, -0.002465f, 0.004619f, 0.001636f, 0.010540f, -0.000040f, -0.000777f, 0.002060f, 0.000714f, 0.004391f, 0.007297f, 0.009285f, -0.000541f, -0.000958f, 0.000163f, -0.005341f, -0.006783f, 0.003743f, 0.006051f, -0.004250f, -0.004080f, -0.002755f, 0.007719f, 0.004548f, -0.001066f, 0.001204f, -0.009108f, -0.002623f, 0.004731f, 0.003925f, 0.006731f, -0.009789f, 0.002221f, 0.003703f, -0.002042f, 0.006905f, -0.000446f, 0.006019f, 0.002863f, 0.001936f, 0.007634f, 0.003790f, 0.001926f, 0.000062f, 0.000900f, -0.001821f, 0.000641f, 0.001061f, -0.000602f, -0.002713f, 0.001341f, 0.001320f, -0.002008f, -0.000281f, -0.001355f, 0.001418f, + 0.002196f, 0.000089f, -0.000280f, -0.000124f, -0.002036f, 0.000999f, -0.000719f, 0.001691f, 0.000799f, 0.000520f, 0.000363f, -0.000910f, 0.000552f, 0.000250f, 0.000869f, -0.001618f, -0.000770f, -0.000358f, 0.000222f, -0.002204f, 0.021696f, 0.005972f, -0.004969f, 0.011058f, -0.005376f, 0.011509f, -0.003828f, -0.005251f, 0.005855f, 0.010761f, -0.000331f, -0.005326f, 0.002874f, 0.002257f, -0.000442f, -0.015329f, 0.003591f, 0.004486f, 0.001230f, 0.009569f, 0.012887f, 0.006913f, 0.012690f, 0.008624f, 0.007732f, -0.002067f, 0.008587f, 0.004133f, -0.006511f, 0.002435f, 0.003967f, -0.008389f, -0.010648f, -0.001640f, 0.004197f, 0.000163f, -0.003843f, -0.005154f, -0.005015f, -0.002492f, 0.005745f, 0.011511f, 0.009754f, 0.003679f, 0.007492f, -0.012096f, 0.000763f, -0.003089f, 0.000118f, -0.013883f, 0.005147f, -0.001338f, -0.003273f, -0.000544f, -0.003768f, -0.006865f, -0.004822f, 0.004864f, 0.001165f, 0.003730f, -0.005060f, 0.009465f, 0.002434f, -0.010969f, 0.004530f, 0.001388f, 0.003048f, 0.006004f, 0.001823f, 0.011022f, -0.003517f, 0.001205f, -0.012876f, 0.002445f, 0.001241f, 0.000365f, + 0.000305f, -0.002428f, 0.009159f, -0.002805f, -0.004258f, 0.006945f, -0.007199f, -0.003517f, -0.002974f, -0.001343f, -0.003358f, 0.002318f, 0.000613f, 0.001208f, -0.000095f, -0.000322f, 0.000118f, -0.001319f, 0.000788f, 0.001201f, -0.000467f, -0.000568f, -0.000064f, -0.002387f, -0.003889f, 0.001428f, 0.000473f, -0.003073f, -0.000410f, -0.000345f, -0.000672f, -0.003722f, 0.000949f, -0.000024f, -0.000123f, 0.000248f, 0.000644f, 0.000396f, -0.001413f, -0.000061f, -0.002566f, -0.000299f, 0.001066f, -0.004381f, -0.004431f, -0.001420f, 0.004015f, -0.007418f, 0.002152f, -0.014661f, 0.002733f, 0.002782f, -0.001729f, 0.010496f, 0.000644f, -0.001155f, 0.000921f, 0.005565f, -0.009017f, 0.001297f, 0.002732f, 0.005757f, -0.012819f, -0.006468f, -0.004852f, 0.004706f, 0.001895f, -0.004003f, -0.012955f, 0.003149f, -0.012887f, -0.000774f, 0.005080f, -0.002368f, 0.003863f, -0.002208f, 0.008641f, 0.012867f, 0.006765f, -0.006637f, 0.001221f, 0.009755f, 0.005990f, -0.006008f, 0.005032f, 0.001523f, -0.010052f, 0.003540f, 0.013752f, 0.006477f, 0.004593f, 0.015384f, 0.001351f, -0.005817f, -0.011789f, -0.000498f, + -0.006630f, -0.007903f, -0.003780f, 0.008466f, -0.008051f, 0.002815f, -0.004817f, -0.004464f, 0.009820f, -0.001275f, 0.001604f, 0.007867f, 0.010669f, -0.004735f, -0.009851f, 0.012513f, 0.009561f, 0.006136f, 0.000552f, -0.007496f, 0.001170f, 0.009891f, -0.010045f, 0.003066f, -0.006556f, -0.000202f, 0.006084f, -0.005722f, -0.000352f, -0.011026f, -0.002943f, -0.000956f, 0.001647f, -0.000573f, -0.004208f, -0.000484f, 0.002081f, -0.003246f, -0.000875f, 0.001527f, 0.001233f, 0.000961f, 0.000879f, -0.000156f, -0.000837f, -0.004342f, 0.002310f, -0.000226f, 0.002381f, -0.001674f, -0.002900f, 0.001028f, 0.002256f, -0.001491f, 0.001989f, -0.000334f, -0.000166f, -0.000171f, -0.000484f, 0.002433f, -0.001445f, 0.000951f, -0.001459f, -0.029060f, -0.010640f, -0.004474f, 0.015899f, -0.006034f, -0.002393f, -0.009394f, -0.007953f, -0.001357f, -0.020964f, 0.011749f, 0.003878f, -0.000595f, -0.007748f, 0.011567f, -0.003261f, 0.005875f, -0.004690f, 0.003711f, 0.007370f, -0.009215f, 0.000968f, 0.010170f, 0.005743f, 0.004096f, 0.010871f, 0.009729f, -0.006110f, -0.007784f, -0.009717f, -0.000161f, -0.012773f, 0.003048f, + -0.016870f, -0.003228f, 0.012414f, 0.006532f, -0.004284f, -0.001313f, -0.012694f, 0.005763f, -0.005432f, 0.011184f, -0.006450f, -0.011479f, -0.002366f, -0.004731f, -0.009440f, 0.003654f, -0.002170f, -0.006004f, -0.006127f, -0.020334f, 0.002770f, -0.006099f, -0.015078f, -0.004010f, 0.009283f, 0.004766f, -0.007804f, 0.006438f, 0.008269f, 0.007996f, 0.002960f, -0.010396f, -0.001744f, -0.002309f, 0.007190f, -0.007307f, -0.002820f, 0.003792f, 0.003841f, -0.011379f, -0.013566f, -0.024339f, -0.004177f, -0.014136f, 0.004640f, -0.000547f, -0.003390f, 0.007157f, -0.001526f, -0.003258f, 0.003107f, 0.004881f, 0.004675f, 0.003648f, 0.008457f, -0.003617f, -0.002997f, -0.002289f, 0.001229f, 0.000426f, -0.001943f, 0.002335f, 0.003346f, -0.000748f, 0.000773f, -0.001485f, -0.001943f, -0.000360f, -0.001269f, 0.000350f, 0.000720f, 0.000099f, -0.002154f, 0.000330f, -0.001459f, -0.000553f, 0.001196f, 0.002730f, -0.001234f, 0.003270f, 0.003966f, 0.000627f, -0.001175f, -0.003463f, -0.000720f, 0.002328f, 0.001529f, -0.001507f, -0.025293f, -0.010116f, -0.004532f, -0.007489f, 0.008606f, 0.011254f, 0.010607f, -0.021114f, + -0.015768f, 0.006079f, 0.025731f, 0.015218f, -0.000010f, 0.003669f, 0.007332f, -0.009241f, 0.006106f, -0.008566f, 0.006194f, 0.009149f, 0.001414f, 0.007343f, 0.002292f, -0.000504f, 0.003810f, 0.002268f, -0.006894f, -0.008725f, 0.012076f, 0.004906f, -0.008810f, 0.008657f, -0.004803f, -0.000879f, 0.020758f, -0.009892f, 0.011755f, 0.023216f, 0.009475f, -0.001309f, 0.000901f, -0.008352f, 0.010856f, -0.011064f, -0.006051f, -0.018608f, 0.003518f, 0.014383f, -0.000352f, -0.013166f, -0.004690f, -0.018673f, -0.009483f, -0.003450f, -0.026578f, -0.014447f, -0.002618f, 0.002840f, -0.011631f, 0.005921f, -0.003074f, -0.009167f, 0.009964f, 0.029415f, 0.002745f, 0.015007f, 0.010176f, 0.008835f, -0.009292f, 0.003939f, -0.015841f, 0.001720f, 0.004572f, 0.003582f, -0.006145f, 0.000172f, -0.016083f, -0.005578f, -0.005634f, -0.001114f, 0.007838f, 0.008416f, -0.000361f, 0.003297f, 0.004576f, -0.002270f, -0.001743f, -0.001448f, 0.001523f, 0.000223f, 0.001144f, 0.000917f, 0.002589f, -0.001325f, -0.000069f, -0.003822f, -0.000458f, -0.000560f, 0.002778f, 0.001619f, -0.001675f, -0.002290f, -0.002229f, -0.002147f, + -0.000716f, -0.002646f, 0.000987f, 0.005003f, -0.003900f, -0.000463f, 0.001721f, 0.002867f, 0.039506f, 0.024965f, -0.013583f, 0.005068f, 0.012717f, -0.005248f, 0.007281f, -0.002472f, 0.011864f, 0.005942f, 0.003800f, 0.010759f, 0.006089f, 0.005323f, -0.003351f, -0.026436f, 0.012661f, -0.004503f, -0.006012f, 0.020681f, 0.012806f, 0.007146f, 0.009544f, 0.007082f, 0.005268f, -0.004047f, 0.003070f, 0.000840f, -0.006761f, 0.005467f, 0.008953f, -0.014913f, 0.002863f, -0.009652f, 0.007142f, 0.008255f, -0.023304f, -0.000384f, -0.027734f, 0.000476f, 0.003475f, 0.002353f, 0.007582f, 0.018925f, -0.002305f, -0.009811f, -0.004798f, -0.005268f, -0.007285f, 0.005446f, 0.005878f, 0.001830f, -0.003068f, -0.003405f, 0.018405f, -0.006105f, -0.003669f, -0.010045f, 0.016350f, -0.002485f, 0.013742f, -0.006467f, 0.014686f, -0.014137f, -0.029705f, -0.008838f, 0.001872f, 0.006010f, 0.010056f, -0.010010f, -0.007443f, 0.004068f, 0.002692f, -0.004643f, -0.007740f, 0.018572f, -0.007260f, 0.017667f, 0.004681f, 0.012482f, 0.004929f, 0.009092f, 0.007681f, -0.003204f, -0.001192f, 0.003567f, -0.000516f, 0.009632f, + 0.000258f, -0.003203f, 0.000889f, -0.010816f, -0.002133f, -0.002512f, 0.000759f, -0.003624f, -0.001376f, -0.001229f, -0.000249f, -0.001259f, -0.005660f, -0.004613f, 0.001386f, 0.000378f, -0.006355f, -0.000398f, 0.000946f, 0.000921f, 0.002604f, 0.001087f, 0.006267f, 0.000262f, -0.002105f, -0.000272f, -0.000843f, -0.002920f, -0.003415f, -0.001374f, 0.000948f, 0.018499f, -0.007073f, -0.012273f, -0.000575f, 0.001966f, -0.017569f, -0.013717f, -0.004386f, 0.004792f, -0.002628f, 0.022816f, 0.013672f, 0.000619f, 0.021760f, 0.007868f, 0.006361f, -0.018643f, 0.017496f, -0.003259f, -0.004404f, -0.015721f, -0.007120f, 0.013988f, 0.013787f, -0.003917f, 0.009141f, -0.018909f, -0.002670f, 0.012729f, 0.009564f, -0.007059f, -0.013446f, -0.007531f, -0.008312f, -0.010352f, -0.008635f, 0.002086f, -0.014131f, -0.001348f, 0.019518f, -0.009384f, 0.002252f, -0.000723f, -0.004495f, 0.007628f, -0.003114f, 0.012773f, 0.000016f, 0.018009f, -0.004619f, -0.011321f, 0.006510f, -0.008941f, -0.008874f, -0.008941f, -0.025542f, 0.002983f, 0.010580f, 0.015229f, 0.010970f, 0.020008f, -0.002044f, -0.007668f, 0.011560f, -0.014184f, + 0.003311f, 0.002216f, -0.002125f, 0.012974f, 0.012095f, -0.003090f, -0.015420f, 0.003108f, -0.007959f, -0.014672f, -0.013605f, 0.007533f, 0.013209f, 0.008295f, -0.028527f, 0.006462f, 0.003058f, -0.001392f, 0.013484f, 0.007300f, 0.011039f, 0.004201f, -0.001048f, 0.014492f, 0.001967f, 0.006605f, 0.005278f, 0.001180f, -0.006465f, 0.001098f, -0.003592f, -0.007910f, 0.001544f, 0.002458f, 0.003806f, -0.000907f, 0.001060f, 0.000938f, 0.000737f, 0.002879f, 0.001880f, 0.002004f, -0.000262f, -0.004969f, 0.003593f, -0.001976f, -0.002214f, -0.001833f, -0.003532f, 0.006614f, 0.007457f, 0.006353f, 0.002585f, 0.000757f, 0.001128f, -0.001445f, 0.005114f, -0.022804f, -0.012844f, 0.002054f, -0.012525f, -0.033601f, 0.025539f, -0.000874f, -0.001337f, 0.002873f, 0.002313f, -0.022334f, 0.015715f, -0.023271f, 0.002367f, 0.010177f, -0.002698f, 0.003505f, 0.004024f, -0.025013f, -0.007992f, -0.011320f, -0.001963f, 0.004752f, -0.007792f, -0.005464f, -0.000679f, -0.001764f, 0.002587f, 0.010023f, 0.005858f, 0.021912f, -0.007740f, 0.030193f, -0.001812f, 0.000523f, -0.019620f, -0.003264f, 0.015148f, -0.003247f, + -0.030352f, 0.012085f, 0.014585f, -0.009429f, 0.007869f, -0.011760f, 0.021581f, 0.011464f, -0.000282f, -0.001550f, -0.013322f, -0.009001f, -0.014609f, 0.013687f, 0.014119f, 0.005773f, 0.001894f, 0.006005f, -0.011717f, -0.031949f, -0.011257f, 0.010808f, 0.005182f, -0.023767f, 0.000913f, 0.002494f, 0.003534f, -0.011542f, 0.008396f, 0.016406f, 0.008931f, 0.000076f, 0.007071f, 0.011209f, -0.006163f, 0.016824f, 0.000583f, -0.000712f, -0.016620f, -0.021881f, 0.014207f, -0.006844f, 0.007201f, 0.006778f, -0.000873f, -0.004879f, -0.004438f, -0.003859f, 0.002501f, -0.005560f, 0.007306f, 0.001392f, -0.001660f, 0.001559f, -0.002216f, 0.000059f, -0.008565f, 0.001998f, 0.000959f, -0.001753f, -0.004660f, 0.001445f, -0.004097f, -0.000444f, 0.001658f, -0.001102f, -0.002604f, -0.000249f, -0.002616f, 0.010495f, 0.008369f, 0.002849f, -0.001013f, -0.001098f, -0.002861f, -0.000117f, -0.000996f, 0.006654f, -0.002080f, -0.001085f, 0.006732f, 0.001360f, 0.002933f, 0.004609f, -0.003142f, -0.001969f, 0.005076f, 0.002780f, -0.001173f, -0.000916f, 0.007179f, -0.035172f, 0.018960f, -0.004886f, 0.007037f, -0.010483f, + -0.005584f, 0.014652f, -0.016982f, 0.016489f, -0.010238f, -0.020005f, 0.009099f, -0.010829f, 0.042510f, 0.006196f, -0.014756f, -0.020726f, -0.003628f, -0.025679f, -0.011678f, -0.027650f, -0.001553f, 0.018295f, -0.012989f, 0.011241f, 0.018647f, -0.017344f, 0.000119f, -0.020225f, 0.011337f, 0.003846f, -0.000684f, 0.011725f, -0.012485f, -0.018156f, -0.015179f, 0.000917f, 0.003448f, 0.015017f, -0.021765f, 0.015397f, 0.003086f, -0.032346f, -0.017680f, -0.026135f, -0.010637f, 0.009744f, -0.008726f, -0.008814f, -0.049451f, -0.001171f, -0.010831f, -0.004673f, -0.031710f, -0.011194f, -0.004166f, 0.002316f, 0.025917f, 0.023448f, 0.019993f, 0.011340f, 0.024982f, -0.027010f, 0.020965f, 0.002761f, 0.009792f, 0.006888f, -0.019159f, 0.029690f, 0.018529f, 0.011616f, -0.013087f, -0.017770f, -0.012650f, 0.017167f, 0.002023f, -0.000082f, 0.009413f, 0.004369f, 0.009896f, -0.008851f, 0.026252f, 0.013613f, -0.002782f, -0.004445f, 0.005913f, 0.005126f, 0.003232f, -0.001739f, -0.001569f, 0.002266f, -0.000382f, -0.000634f, -0.010835f, 0.000466f, -0.006247f, 0.000217f, 0.003490f, 0.001025f, -0.000625f, -0.000126f, + 0.002187f, 0.001712f, -0.010305f, -0.002926f, 0.003696f, -0.003182f, -0.004005f, -0.000436f, 0.001423f, 0.001513f, 0.002042f, -0.001696f, -0.002107f, 0.001600f, -0.004476f, -0.007867f, -0.001904f, -0.002101f, -0.002470f, 0.001221f, -0.000563f, 0.006647f, 0.003246f, -0.002958f, 0.003052f, 0.002063f, 0.001772f, -0.003053f, -0.005347f, -0.000307f, 0.000856f, 0.005642f, -0.001975f, -0.001539f, 0.013285f, 0.024624f, 0.026700f, 0.010916f, 0.018688f, 0.015126f, 0.009055f, -0.004878f, 0.002025f, -0.007275f, 0.000652f, -0.002501f, -0.016094f, 0.020554f, 0.032617f, 0.013006f, -0.008873f, 0.014628f, 0.013927f, -0.000542f, 0.008671f, -0.015340f, -0.029574f, -0.019680f, -0.013430f, 0.008607f, -0.003528f, -0.015444f, 0.011636f, -0.005282f, -0.013783f, -0.000132f, 0.024077f, 0.012143f, 0.017862f, 0.006277f, 0.013174f, 0.014595f, -0.003245f, 0.013374f, -0.005090f, -0.015172f, 0.006522f, -0.017576f, 0.006683f, 0.007082f, -0.025834f, -0.016786f, 0.010746f, 0.026947f, -0.013818f, 0.018804f, 0.026261f, -0.021535f, 0.001017f, 0.023918f, 0.002706f, -0.008629f, -0.001875f, -0.012142f, -0.021233f, 0.000347f, + -0.006346f, -0.011122f, 0.014829f, 0.000829f, -0.024313f, 0.031441f, -0.012806f, 0.025521f, -0.029929f, -0.020467f, 0.014845f, -0.018394f, 0.010370f, -0.012334f, -0.008923f, -0.017266f, -0.010488f, -0.014034f, -0.035345f, 0.005963f, 0.021839f, -0.009900f, -0.001464f, 0.015157f, 0.016191f, 0.011510f, -0.002099f, -0.001185f, -0.009062f, -0.002769f, -0.003905f, -0.004699f, 0.003950f, -0.000860f, -0.003244f, 0.005318f, 0.004832f, -0.002109f, -0.000344f, -0.006248f, 0.002906f, -0.005482f, -0.010059f, -0.000605f, 0.009623f, 0.000190f, -0.005203f, -0.001304f, 0.015820f, 0.007970f, 0.000662f, -0.004600f, -0.005573f, -0.004049f, 0.001081f, 0.001198f, -0.004655f, -0.001671f, 0.000312f, 0.001977f, 0.006386f, 0.001625f, 0.010004f, 0.006060f, 0.007206f, 0.002834f, 0.003304f, 0.003956f, -0.001196f, 0.000265f, -0.021908f, 0.013967f, -0.009236f, -0.024351f, 0.034979f, 0.017553f, -0.023968f, 0.017057f, 0.016034f, 0.004354f, 0.029552f, -0.059975f, 0.004717f, 0.024404f, 0.008850f, 0.002050f, 0.026497f, 0.000869f, 0.014692f, -0.034734f, -0.004258f, 0.009277f, 0.000848f, -0.017451f, 0.007161f, 0.013785f, + 0.007144f, 0.006463f, 0.018848f, 0.015212f, 0.024914f, 0.019133f, -0.007144f, -0.007994f, 0.019376f, -0.011779f, 0.013717f, -0.021585f, -0.011248f, -0.027580f, -0.012098f, 0.015047f, 0.005713f, -0.006443f, 0.023010f, -0.026897f, -0.035772f, -0.058702f, 0.018617f, 0.020146f, 0.016289f, 0.012297f, -0.013401f, 0.009225f, -0.007599f, 0.022044f, 0.059549f, -0.009303f, -0.012046f, -0.025819f, -0.007743f, 0.022050f, -0.014670f, 0.012597f, 0.022225f, 0.003466f, -0.000064f, -0.017270f, -0.004550f, 0.008050f, -0.040546f, -0.037937f, 0.004225f, 0.005027f, -0.014120f, 0.020678f, 0.016292f, 0.029806f, 0.048832f, 0.019189f, -0.010831f, -0.005993f, 0.010634f, -0.000366f, -0.026292f, 0.012598f, 0.011619f, 0.009441f, 0.003576f, 0.012344f, -0.000102f, 0.006792f, 0.006136f, 0.003745f, -0.005676f, 0.000403f, -0.000233f, -0.000932f, 0.010294f, 0.002843f, 0.000224f, 0.005080f, -0.010234f, 0.002941f, 0.002273f, -0.001432f, 0.010817f, 0.001982f, -0.002695f, -0.001866f, -0.006104f, 0.018460f, 0.001590f, 0.003098f, 0.008139f, -0.002817f, -0.002419f, 0.010361f, -0.010969f, 0.010306f, -0.007930f, 0.008531f, + -0.000237f, -0.000808f, -0.001658f, 0.003434f, -0.001393f, 0.008824f, -0.006971f, -0.003076f, 0.003071f, -0.001700f, -0.002173f, -0.005654f, -0.008282f, 0.006196f, 0.088629f, 0.050151f, 0.031929f, -0.008159f, -0.009051f, -0.001079f, -0.007570f, -0.009097f, -0.013768f, -0.016545f, -0.028460f, 0.001283f, -0.002026f, 0.006973f, 0.012389f, 0.023657f, 0.035731f, -0.004751f, -0.046518f, -0.018154f, 0.039899f, -0.006195f, 0.014944f, -0.005143f, -0.000685f, 0.026617f, 0.009195f, 0.020218f, 0.011865f, -0.000807f, -0.001213f, -0.000349f, 0.013413f, 0.017179f, -0.006670f, -0.026170f, 0.034291f, 0.024608f, 0.017453f, 0.006452f, 0.008886f, -0.013904f, -0.025971f, 0.035783f, 0.019945f, 0.009229f, -0.016602f, -0.018435f, -0.025912f, -0.015929f, -0.004615f, -0.016182f, 0.008968f, -0.033115f, 0.004576f, 0.024472f, -0.015915f, 0.008643f, 0.001474f, 0.003600f, -0.037827f, 0.013417f, -0.016246f, 0.027607f, -0.060746f, 0.010436f, -0.015879f, -0.020501f, 0.005026f, -0.012367f, 0.012492f, 0.011853f, -0.039575f, 0.000438f, 0.027665f, 0.004145f, 0.008113f, 0.017409f, 0.007103f, 0.028870f, 0.011777f, 0.006111f, + 0.001936f, -0.004182f, 0.018594f, -0.036725f, -0.000696f, -0.002142f, -0.003368f, 0.001448f, -0.001052f, -0.000279f, -0.003192f, -0.005404f, -0.007059f, 0.011429f, 0.009575f, -0.005025f, -0.000814f, -0.017589f, 0.001733f, -0.001100f, -0.017352f, -0.000083f, -0.025740f, -0.019567f, 0.008685f, 0.003275f, 0.013563f, -0.015303f, 0.006588f, 0.013324f, 0.002954f, -0.000577f, 0.003471f, 0.007141f, 0.000618f, -0.003841f, 0.014131f, 0.000098f, 0.004610f, -0.008290f, -0.006202f, 0.005868f, 0.008483f, 0.001493f, -0.054479f, -0.027979f, 0.004020f, -0.047864f, 0.010973f, 0.034754f, -0.016729f, 0.042246f, 0.049541f, 0.006313f, 0.024748f, 0.030568f, 0.013697f, -0.029310f, 0.019126f, 0.023328f, -0.001154f, 0.005904f, 0.016445f, 0.014558f, 0.034963f, 0.005977f, -0.013486f, 0.022337f, 0.008000f, -0.003462f, 0.000503f, 0.014978f, -0.020445f, -0.009234f, -0.008655f, 0.012498f, 0.006470f, -0.028819f, 0.008509f, 0.024092f, 0.000638f, 0.029034f, -0.027458f, -0.051850f, 0.004140f, 0.023279f, 0.035180f, 0.032646f, 0.016840f, 0.015496f, 0.012402f, -0.035229f, -0.010318f, -0.001467f, 0.026434f, 0.041808f, + -0.014452f, 0.009011f, -0.015389f, 0.009894f, 0.006644f, 0.025453f, 0.039402f, -0.015185f, -0.017273f, -0.003426f, 0.021587f, 0.027740f, 0.038834f, 0.000961f, -0.041980f, -0.039584f, -0.006467f, 0.005129f, 0.000121f, -0.018144f, 0.000406f, -0.047729f, -0.030816f, -0.028202f, -0.032115f, 0.013694f, 0.004923f, 0.038467f, 0.030731f, 0.011597f, -0.018393f, -0.018348f, -0.017098f, -0.015515f, -0.026680f, 0.012592f, 0.008351f, 0.004945f, 0.017933f, 0.019955f, 0.000108f, 0.017026f, 0.003491f, 0.018181f, -0.006328f, 0.015081f, -0.004824f, -0.001358f, 0.004469f, -0.005532f, 0.025208f, 0.011366f, 0.014964f, 0.006777f, 0.017947f, 0.004028f, 0.008602f, 0.025759f, 0.022322f, 0.011967f, -0.001445f, -0.009868f, -0.008475f, -0.018208f, -0.010238f, -0.011950f, -0.007148f, -0.011020f, -0.013378f, -0.007724f, 0.007774f, 0.017171f, 0.004754f, -0.004015f, 0.000620f, -0.002534f, 0.010713f, 0.012687f, 0.010511f, -0.001108f, 0.004724f, -0.019399f, 0.023020f, -0.050923f, 0.004587f, -0.010172f, 0.027890f, -0.014945f, -0.002346f, 0.008641f, 0.021123f, -0.028424f, -0.047879f, -0.008307f, -0.018774f, 0.001349f, + -0.021617f, 0.012726f, 0.012539f, 0.001263f, -0.025839f, 0.016132f, 0.001596f, 0.043146f, -0.006907f, 0.023634f, -0.019952f, 0.044562f, 0.012831f, 0.027815f, 0.018658f, 0.030346f, 0.044594f, -0.010861f, 0.017298f, -0.031197f, 0.032901f, 0.032007f, -0.000749f, 0.010413f, 0.032221f, -0.020613f, -0.019933f, -0.003271f, 0.064877f, 0.010569f, -0.018146f, 0.032240f, 0.004214f, 0.024733f, 0.035523f, 0.010384f, -0.002405f, 0.003372f, 0.005543f, 0.023471f, -0.008203f, 0.025170f, -0.017354f, 0.024573f, -0.013584f, 0.055421f, -0.008048f, 0.047664f, -0.043199f, -0.047403f, 0.066017f, -0.055234f, -0.029579f, 0.002265f, -0.017803f, -0.034271f, 0.030162f, -0.003986f, -0.042533f, -0.020089f, -0.021846f, -0.062529f, -0.023205f, 0.007759f, 0.014063f, -0.048232f, -0.012330f, 0.029331f, -0.005850f, 0.016867f, 0.028894f, -0.020597f, -0.004711f, 0.004754f, 0.018864f, 0.013592f, 0.014234f, -0.004631f, -0.002725f, 0.011725f, -0.001013f, -0.007717f, 0.006418f, 0.013516f, 0.002560f, 0.009413f, -0.000272f, -0.008622f, -0.000018f, 0.012476f, 0.004695f, -0.006269f, -0.015612f, -0.009374f, 0.018317f, -0.008345f, + -0.024600f, 0.005933f, -0.014114f, -0.026718f, 0.000031f, 0.010176f, 0.000961f, -0.006854f, -0.001971f, 0.007461f, -0.005599f, 0.000460f, 0.009654f, -0.000416f, -0.004464f, -0.005649f, 0.017390f, 0.033463f, 0.001843f, -0.011605f, -0.009717f, -0.005288f, -0.015711f, -0.003225f, -0.006570f, 0.006587f, -0.042738f, -0.028511f, 0.008316f, -0.055884f, -0.032601f, -0.038832f, -0.039511f, 0.048153f, -0.001189f, 0.001660f, 0.014340f, -0.014039f, -0.061446f, -0.045966f, -0.045023f, -0.091806f, 0.006633f, 0.010425f, 0.039671f, 0.023189f, 0.013747f, 0.019797f, 0.013730f, 0.004294f, -0.028979f, -0.042580f, -0.024526f, 0.033094f, -0.004188f, -0.024907f, -0.010058f, 0.032416f, -0.039204f, -0.025297f, -0.040270f, -0.020021f, -0.003444f, -0.038631f, 0.014368f, -0.032079f, 0.034705f, 0.024342f, -0.005393f, 0.024013f, -0.023621f, -0.048555f, 0.021210f, 0.028317f, -0.025069f, -0.055719f, 0.041972f, -0.003623f, 0.030398f, 0.025533f, -0.079699f, -0.056622f, 0.000529f, -0.012931f, 0.051881f, -0.029767f, -0.034414f, -0.009247f, 0.019130f, 0.002923f, -0.004808f, -0.018081f, 0.068889f, -0.033814f, -0.056125f, -0.075886f, + 0.054396f, -0.013010f, -0.062493f, 0.029097f, 0.029620f, 0.017561f, 0.062783f, 0.067174f, 0.068967f, 0.029508f, -0.015680f, -0.006357f, -0.010725f, 0.022887f, -0.044185f, 0.028367f, 0.005389f, 0.005528f, 0.021499f, 0.020796f, -0.018257f, 0.026638f, -0.020961f, 0.008875f, -0.029751f, -0.016971f, -0.011584f, -0.015442f, -0.006182f, -0.016633f, -0.004175f, 0.011364f, 0.031128f, 0.036225f, 0.001462f, 0.028405f, -0.017080f, 0.004068f, 0.016757f, 0.002198f, -0.031640f, 0.003806f, 0.007674f, -0.008825f, -0.023526f, -0.015102f, -0.014500f, 0.037554f, 0.023375f, 0.012091f, 0.017664f, 0.031661f, -0.005076f, -0.037953f, -0.023847f, -0.021872f, -0.027240f, -0.035286f, 0.006130f, -0.029622f, -0.051674f, -0.001116f, -0.009177f, -0.012285f, -0.009830f, 0.007811f, -0.050388f, -0.020071f, 0.023485f, 0.038207f, 0.077805f, 0.012756f, 0.040700f, 0.019725f, 0.019651f, -0.017749f, -0.005687f, -0.015132f, -0.042678f, -0.050146f, -0.070405f, -0.025630f, -0.063426f, -0.024936f, -0.033201f, -0.012402f, 0.034088f, 0.008380f, 0.023199f, 0.040087f, 0.000063f, 0.027083f, 0.007885f, 0.001382f, -0.000913f, -0.005291f, + -0.053503f, 0.019482f, -0.006671f, -0.060463f, -0.037426f, 0.017664f, -0.038787f, -0.014886f, 0.014141f, 0.043898f, 0.053279f, 0.018535f, -0.011057f, 0.007336f, 0.035675f, 0.019087f, 0.007538f, -0.001049f, -0.105449f, -0.021267f, 0.023357f, 0.026776f, 0.010706f, -0.004029f, -0.035539f, 0.024670f, -0.031701f, -0.023907f, -0.006219f, 0.006484f, -0.017617f, -0.056324f, 0.030137f, -0.007205f, 0.070107f, 0.026664f, 0.023975f, 0.026942f, 0.051545f, 0.115574f, 0.001793f, 0.001981f, -0.004828f, -0.034406f, 0.020564f, -0.023868f, 0.084060f, -0.007468f, -0.030119f, -0.027109f, 0.035540f, -0.045575f, -0.030758f, -0.005991f, 0.071907f, 0.002417f, 0.034322f, 0.053116f, 0.010751f, 0.043004f, 0.032618f, -0.005930f, 0.029910f, 0.032413f, 0.001102f, -0.022122f, -0.023831f, 0.006694f, 0.008232f, 0.027198f, 0.017482f, -0.001150f, -0.004046f, 0.004848f, 0.011080f, -0.020139f, -0.004190f, -0.004923f, -0.002627f, -0.031597f, 0.019944f, -0.022925f, 0.008051f, -0.004628f, -0.013702f, 0.003852f, 0.038536f, 0.033711f, 0.000094f, -0.002235f, -0.024476f, -0.009980f, -0.024327f, -0.003601f, -0.028315f, -0.040371f, + 0.011883f, 0.028042f, 0.001958f, 0.001638f, -0.013931f, -0.021142f, 0.059025f, -0.008000f, 0.010723f, -0.064594f, -0.021852f, 0.075650f, -0.050415f, -0.013783f, -0.043655f, -0.129011f, -0.018307f, 0.039531f, 0.032671f, 0.006227f, 0.009407f, -0.007016f, 0.072310f, -0.077937f, -0.000040f, -0.022472f, -0.052041f, -0.044143f, -0.006531f, 0.014745f, 0.013013f, 0.017379f, 0.046702f, 0.030227f, -0.033012f, -0.033669f, 0.092862f, 0.075793f, -0.006064f, 0.008832f, -0.010148f, 0.024675f, -0.000331f, 0.054084f, 0.019743f, 0.028730f, 0.008138f, 0.004148f, -0.095947f, 0.039748f, -0.004092f, -0.055337f, -0.028116f, 0.005438f, -0.014860f, -0.055071f, 0.053025f, -0.009391f, -0.039135f, -0.008235f, 0.005830f, 0.046920f, 0.052642f, 0.039952f, 0.015488f, 0.046796f, 0.050101f, -0.037623f, -0.041020f, -0.026302f, -0.006648f, 0.048494f, 0.064957f, 0.011094f, 0.023466f, 0.062186f, 0.037462f, -0.058354f, 0.043196f, 0.015666f, -0.012753f, 0.002287f, 0.119764f, -0.079248f, 0.061084f, 0.069824f, -0.070194f, -0.004123f, -0.045587f, -0.014750f, -0.100880f, 0.029054f, 0.044771f, -0.060808f, 0.036796f, -0.052615f, + -0.037904f, 0.046007f, -0.028548f, -0.004243f, -0.017123f, 0.002235f, -0.025176f, 0.007789f, 0.011763f, -0.019158f, -0.026983f, -0.002120f, -0.029316f, 0.038550f, 0.007028f, -0.036198f, 0.008018f, -0.006080f, -0.019570f, -0.019001f, 0.012548f, 0.024582f, 0.030942f, 0.012654f, -0.027655f, 0.071006f, -0.013033f, 0.007077f, -0.004503f, -0.037572f, 0.014453f, 0.020507f, -0.018962f, 0.030296f, 0.007833f, 0.022637f, -0.005177f, -0.036340f, 0.012375f, 0.054772f, -0.035407f, -0.050764f, -0.082944f, 0.016605f, -0.016121f, -0.026129f, -0.033730f, 0.018518f, -0.020594f, -0.009379f, 0.054061f, -0.016816f, -0.003365f, -0.042508f, 0.003165f, 0.027348f, -0.060070f, -0.037605f, -0.036073f, -0.017483f, 0.021404f, -0.080479f, -0.045155f, -0.116197f, 0.019892f, -0.001101f, -0.029882f, -0.012893f, -0.017519f, 0.024912f, 0.036987f, -0.041250f, 0.001199f, -0.014373f, -0.014344f, -0.072605f, 0.015616f, 0.055799f, 0.014382f, 0.042214f, 0.052588f, 0.047468f, -0.064073f, -0.019471f, -0.019619f, -0.029825f, 0.053203f, -0.054768f, -0.031967f, 0.001915f, 0.077424f, 0.017571f, -0.027719f, 0.078398f, -0.044495f, -0.041438f, + 0.093129f, 0.089551f, 0.008231f, 0.022794f, -0.025874f, -0.084895f, -0.026531f, 0.085471f, -0.041862f, 0.077461f, -0.028373f, -0.122012f, -0.032581f, -0.057075f, 0.064633f, 0.000565f, 0.014163f, 0.058275f, -0.009723f, 0.048043f, -0.063151f, -0.073971f, 0.056470f, -0.014855f, -0.125013f, 0.076933f, -0.040084f, 0.020975f, 0.024849f, -0.043602f, 0.082258f, -0.056471f, 0.029579f, -0.000888f, 0.021607f, 0.083710f, -0.021676f, -0.026476f, 0.002867f, -0.017455f, -0.023115f, -0.018942f, 0.009168f, 0.018805f, 0.004316f, -0.012033f, 0.010270f, -0.039903f, 0.035640f, 0.025112f, 0.019955f, 0.007963f, -0.000004f, -0.018680f, -0.020521f, -0.019434f, 0.016689f, 0.032674f, -0.032258f, 0.028330f, 0.065868f, 0.022157f, -0.056803f, 0.005446f, 0.020463f, -0.021057f, -0.037592f, 0.035151f, -0.031877f, -0.000751f, -0.003002f, -0.033860f, -0.043793f, -0.000479f, 0.024562f, -0.014480f, 0.056638f, -0.019104f, -0.037849f, 0.026258f, -0.016927f, 0.001938f, 0.021969f, 0.043360f, 0.002880f, -0.077258f, 0.045401f, 0.053006f, -0.064431f, 0.035293f, -0.000714f, -0.022952f, -0.027788f, -0.092230f, -0.041164f, 0.032684f, + 0.005466f, 0.085025f, -0.068521f, -0.038355f, 0.015554f, -0.009212f, 0.053998f, -0.075458f, -0.000315f, 0.007900f, -0.064300f, 0.064029f, 0.034629f, 0.019622f, -0.030377f, 0.043870f, -0.052211f, 0.028731f, 0.021841f, 0.013559f, -0.004106f, -0.028848f, 0.011576f, 0.058193f, -0.030996f, -0.011064f, 0.010930f, -0.045455f, 0.045981f, 0.001867f, 0.011715f, -0.062321f, 0.033186f, 0.008294f, 0.010969f, -0.146318f, 0.019600f, -0.041573f, 0.067918f, 0.056669f, 0.059627f, 0.030758f, -0.119534f, -0.020871f, 0.025002f, 0.002564f, 0.007385f, 0.083854f, -0.013028f, -0.050460f, -0.061076f, 0.002453f, -0.067879f, -0.059089f, -0.052897f, 0.025201f, -0.098789f, 0.069800f, 0.132978f, -0.035034f, -0.016587f, -0.104266f, -0.023302f, 0.039918f, 0.024076f, -0.034700f, -0.007696f, -0.126162f, -0.044879f, 0.126618f, 0.053362f, -0.039337f, 0.036504f, -0.071584f, -0.053418f, 0.013926f, 0.002274f, 0.008519f, -0.049022f, -0.016872f, -0.010696f, -0.000093f, -0.070823f, 0.015078f, -0.009549f, -0.022096f, 0.008840f, 0.028984f, -0.038904f, -0.019295f, -0.006528f, 0.013769f, -0.030004f, -0.007957f, -0.005583f, -0.027970f, + -0.000086f, -0.051731f, 0.066952f, 0.021671f, -0.018172f, -0.006925f, -0.020327f, -0.002905f, 0.042795f, 0.012839f, -0.008478f, 0.022491f, -0.014519f, -0.064413f, 0.002482f, 0.002803f, 0.013098f, 0.028367f, -0.017311f, -0.012259f, 0.027559f, 0.033694f, 0.013990f, -0.031151f, -0.069226f, -0.096551f, 0.027009f, -0.042929f, -0.027438f, 0.027959f, -0.022331f, -0.034630f, 0.027642f, -0.045200f, -0.001651f, -0.051374f, 0.073750f, 0.000240f, -0.052077f, -0.016725f, 0.002280f, -0.006373f, 0.017961f, -0.036523f, -0.023536f, 0.006948f, 0.015694f, 0.007512f, 0.008172f, 0.026572f, -0.030927f, -0.013280f, -0.072488f, 0.026283f, 0.007894f, -0.023455f, 0.054111f, 0.028057f, -0.020790f, 0.080311f, 0.018983f, -0.052075f, 0.039524f, 0.005706f, 0.026036f, 0.052717f, -0.004097f, -0.014099f, 0.009266f, 0.043302f, 0.025851f, 0.000079f, -0.003678f, 0.046406f, -0.003382f, -0.055846f, -0.008706f, 0.009267f, 0.044194f, -0.020110f, 0.075507f, 0.081705f, -0.051662f, 0.042269f, 0.093542f, -0.025876f, 0.141641f, 0.078740f, -0.034567f, -0.032869f, -0.052390f, -0.060861f, -0.033271f, 0.018016f, -0.009826f, -0.011427f, + -0.001182f, -0.009891f, -0.097808f, -0.038883f, -0.096563f, 0.022058f, 0.087824f, -0.033323f, -0.004626f, -0.048112f, 0.024268f, 0.005207f, 0.017451f, 0.023646f, 0.073786f, -0.004279f, 0.033879f, 0.033330f, -0.054277f, 0.001695f, 0.000530f, 0.011350f, 0.024685f, -0.003747f, -0.012349f, 0.022218f, -0.002731f, -0.013258f, 0.003539f, -0.023357f, -0.004823f, 0.016160f, 0.003783f, -0.010353f, -0.051931f, 0.002129f, -0.023594f, -0.002537f, -0.019789f, 0.043408f, -0.014129f, 0.020906f, 0.027070f, -0.021472f, 0.032535f, 0.019964f, 0.000927f, -0.011833f, -0.019489f, 0.004480f, -0.001696f, -0.011959f, -0.001447f, 0.021405f, -0.016300f, 0.009064f, -0.005537f, 0.015335f, -0.040968f, 0.124385f, 0.032842f, -0.044538f, 0.004966f, -0.058491f, -0.007677f, 0.020514f, -0.024300f, -0.031088f, -0.034674f, -0.013141f, 0.013319f, -0.007657f, -0.011155f, 0.015798f, 0.009095f, 0.021414f, -0.022132f, -0.013889f, 0.015920f, -0.005742f, 0.002821f, -0.032335f, 0.021903f, -0.037853f, 0.018133f, 0.012481f, -0.008187f, -0.001712f, 0.001353f, -0.021985f, 0.003650f, 0.004455f, -0.017550f, 0.031617f, -0.017064f, 0.007630f, + 0.000132f, 0.001067f, 0.015950f, -0.015649f, -0.024320f, -0.007333f, 0.036519f, -0.027179f, 0.017861f, -0.049803f, -0.029649f, 0.009395f, -0.010820f, -0.000842f, -0.003351f, -0.030009f, 0.031710f, 0.025325f, 0.002246f, -0.021991f, -0.001157f, -0.013399f, 0.006466f, -0.016708f, -0.000605f, -0.016042f, 0.011891f, -0.004480f, 0.003038f, 0.040182f, -0.034138f, -0.002978f, 0.005957f, 0.002390f, -0.007479f, 0.000889f, -0.016250f, 0.000854f, -0.013639f, 0.008215f, 0.015786f, -0.024456f, -0.020354f, 0.011606f, 0.001405f, -0.005854f, -0.019409f, 0.008256f, 0.002461f, -0.000898f, -0.004515f, 0.000097f, -0.004564f, 0.013364f, -0.009088f, -0.002567f, 0.006110f, -0.004593f, -0.000875f, 0.010687f, -0.007364f, -0.004824f, -0.002927f, 0.002205f, 0.010961f, -0.003885f, -0.012694f, 0.000663f, -0.008240f, 0.028878f, -0.011882f, 0.003466f, 0.006436f, -0.007461f, 0.022923f, -0.003422f, -0.020236f, 0.007083f, -0.011648f, 0.014146f, 0.006804f, -0.003287f, -0.001435f, -0.005436f, -0.005680f, 0.013962f, -0.009537f, -0.004372f, -0.001748f, -0.012430f, 0.015594f, -0.060172f, -0.087621f, 0.060893f, 0.282840f, 0.123132f, + 0.129914f, -0.001381f, -0.260790f, -0.189684f, -0.097875f, -0.206488f, 0.100491f, 0.122316f, 0.064375f, 0.265779f, 0.120253f, -0.012105f, 0.088811f, -0.172879f, -0.219255f, -0.125968f, -0.153463f, -0.033727f, 0.119487f, 0.121346f, 0.051513f, 0.204225f, 0.102088f, -0.014777f, 0.098943f, -0.091172f, -0.155088f, -0.089720f, -0.116571f, -0.184151f, 0.068046f, -0.002098f, -0.065514f, 0.197255f, 0.119478f, 0.066537f, 0.202834f, 0.048483f, -0.102443f, 0.099254f, -0.146235f, -0.167590f, -0.033860f, -0.176242f, -0.178039f, 0.070129f, -0.029181f, 0.042729f, 0.225228f, 0.153678f, 0.160674f, 0.150919f, 0.018661f, -0.085183f, -0.097734f, -0.164462f, -0.215033f, -0.113286f, -0.061089f, -0.044908f, 0.082482f, 0.127861f, 0.120654f, 0.170152f, 0.154236f, -0.024092f, -0.026995f, -0.028018f, -0.157912f, -0.047747f, -0.077678f, -0.117823f, 0.026467f, 0.047874f, 0.007972f, 0.109204f, 0.049030f, 0.000697f, 0.068730f, -0.053072f, -0.057988f, 0.001310f, -0.037653f, -0.012188f, 0.028743f, -0.006191f, 0.031888f, 0.042183f, -0.023290f, 0.033125f, 0.013692f, -0.051603f, 0.004951f, -0.024753f, -0.097395f, -0.001654f, + -0.024709f, -0.041850f, 0.094136f, 0.027931f, 0.035382f, 0.123296f, 0.049026f, 0.036011f, 0.027223f, -0.061517f, -0.089613f, -0.083305f, -0.139510f, -0.114307f, -0.050823f, 0.004563f, 0.062713f, 0.143266f, 0.151895f, 0.139317f, 0.123557f, 0.076145f, -0.030526f, -0.087747f, -0.174701f, -0.221408f, -0.170898f, -0.102706f, -0.036302f, 0.092897f, 0.172227f, 0.197958f, 0.202933f, 0.097725f, -0.024475f, -0.067145f, -0.082511f, -0.106414f, -0.076913f, -0.079025f, -0.063943f, -0.009501f, 0.019135f, 0.031273f, 0.053686f, 0.057702f, 0.052809f, 0.048153f, 0.026121f, 0.006821f, -0.008222f, -0.027396f, -0.042600f, -0.042138f, -0.036142f, -0.025954f, -0.014910f, 0.005063f, 0.016574f, 0.022947f, 0.023818f, 0.022916f, 0.014758f, 0.008920f, -0.000088f, -0.000836f, -0.004109f, -0.005964f, -0.008774f, -0.004591f, -0.007030f, -0.007801f, -0.007523f, -0.004964f, -0.010693f, -0.004424f, 0.000123f, 0.005479f, 0.012290f, 0.016898f, 0.011297f, 0.015242f, 0.009338f, 0.002906f, -0.005278f, -0.011823f, -0.018743f, -0.016311f, -0.016325f, -0.007578f, -0.000957f, 0.008011f, 0.009614f, 0.014415f, 0.011902f, 0.009805f, + 0.003545f, 0.001671f, -0.004605f, -0.004449f, -0.007353f, -0.006265f, -0.005689f, -0.001432f, -0.002771f, 0.001502f, -0.000441f, 0.002331f, 0.001719f, 0.001714f, -0.000629f, 0.003726f, 0.001747f, 0.004256f, 0.001166f, 0.001794f, 0.000062f, 0.000223f, -0.004193f, -0.002672f, -0.005281f, -0.002857f, -0.003155f, 0.000163f, -0.000369f, 0.003314f, 0.001792f, 0.004026f, 0.001783f, 0.002802f, -0.000164f, 0.001123f, -0.001660f, -0.000201f, -0.002298f, -0.000082f, -0.001947f, 0.000496f, -0.001194f} + }, + { + {0.009029f, 0.005082f, -0.008051f, -0.001926f, -0.002933f, -0.000331f, 0.012234f, 0.000627f, -0.005135f, 0.006341f, 0.001376f, 0.000585f, 0.002209f, 0.001277f, 0.000178f, 0.009081f, 0.005228f, -0.006263f, -0.002318f, -0.000781f, -0.002107f, 0.002497f, 0.003975f, 0.002555f, -0.002584f, -0.004025f, 0.001590f, -0.008039f, -0.003555f, 0.005916f, 0.000595f, 0.004750f, 0.002535f, -0.003957f, 0.003015f, -0.000017f, -0.003363f, 0.008335f, -0.005554f, -0.002713f, 0.001142f, 0.002822f, -0.003776f, -0.001080f, -0.005452f, -0.010999f, 0.010294f, -0.002120f, -0.005631f, 0.000533f, 0.009469f, -0.000060f, 0.003706f, -0.004742f, -0.002663f, -0.001997f, 0.002959f, -0.003765f, 0.007587f, 0.001118f, 0.006853f, -0.009917f, 0.004236f, -0.002629f, 0.001717f, 0.004113f, -0.001628f, -0.001167f, -0.007206f, -0.000019f, 0.004004f, 0.000823f, -0.001957f, -0.000413f, 0.003572f, -0.001923f, -0.001868f, 0.005448f, -0.002447f, 0.001682f, -0.000979f, -0.000401f, -0.006722f, -0.002862f, -0.001782f, 0.002408f, -0.000438f, -0.003099f, -0.000452f, -0.000688f, -0.001840f, 0.001736f, -0.002215f, 0.000079f, 0.000581f, 0.001090f, + 0.001912f, -0.000879f, -0.001577f, 0.001657f, 0.000416f, -0.001318f, 0.000294f, 0.002874f, -0.000330f, -0.000358f, 0.001246f, 0.000029f, 0.000461f, 0.000405f, -0.000836f, -0.001670f, -0.000850f, 0.001187f, -0.000235f, 0.000068f, 0.000683f, -0.000930f, 0.000884f, -0.000056f, -0.000459f, 0.003153f, 0.025708f, 0.008768f, -0.001999f, 0.006918f, 0.000389f, 0.012634f, 0.007994f, -0.001811f, 0.006546f, 0.011341f, 0.014912f, -0.008816f, -0.008561f, 0.003622f, -0.003434f, -0.002908f, 0.010673f, 0.008564f, 0.008224f, 0.005813f, 0.001135f, -0.000370f, -0.003681f, 0.004026f, 0.002869f, 0.013520f, 0.001405f, -0.000328f, -0.005961f, 0.002788f, 0.004003f, -0.000806f, -0.001814f, -0.002154f, 0.003709f, -0.000572f, -0.002151f, -0.004998f, 0.005298f, -0.001801f, -0.001748f, 0.007450f, 0.010653f, -0.002773f, -0.001268f, 0.006105f, 0.005528f, 0.009694f, 0.006061f, 0.002639f, 0.001035f, 0.008248f, 0.004721f, -0.011456f, 0.000046f, 0.003469f, -0.006547f, 0.000135f, 0.001110f, -0.008183f, 0.004182f, -0.003992f, 0.006142f, -0.001354f, -0.001021f, 0.003250f, 0.001091f, -0.005658f, -0.000468f, 0.003083f, + -0.001070f, -0.001429f, -0.001597f, 0.000568f, 0.006535f, 0.001109f, -0.006513f, -0.001596f, 0.001573f, -0.001993f, -0.000799f, 0.009577f, -0.001914f, 0.001128f, -0.001094f, -0.002501f, 0.002209f, 0.003536f, -0.000894f, 0.001584f, 0.001786f, -0.001825f, 0.000884f, 0.001558f, 0.000409f, -0.001229f, -0.003343f, -0.001095f, -0.001998f, -0.000991f, -0.000211f, 0.001027f, -0.000592f, 0.001244f, 0.000742f, -0.000340f, 0.008869f, -0.000679f, -0.016783f, -0.007792f, -0.003267f, -0.003616f, -0.009142f, -0.008371f, -0.005278f, 0.009101f, -0.010000f, -0.004650f, -0.004757f, 0.001841f, 0.015147f, -0.002264f, -0.001217f, 0.003720f, 0.008663f, -0.013256f, -0.002178f, 0.002720f, -0.005871f, 0.004697f, 0.007404f, -0.008169f, -0.000519f, 0.001067f, -0.004771f, -0.012030f, 0.002082f, -0.005059f, 0.001619f, -0.004657f, 0.006879f, -0.008302f, -0.007775f, -0.019100f, -0.005165f, 0.006585f, -0.001080f, -0.007321f, -0.003627f, -0.000911f, -0.007701f, 0.000400f, -0.001309f, 0.005294f, 0.004163f, -0.001967f, 0.000226f, -0.001944f, -0.008129f, 0.009923f, 0.001713f, 0.006711f, -0.002473f, 0.000036f, 0.001729f, 0.002911f, + 0.007663f, -0.002448f, -0.001868f, 0.002282f, -0.000230f, 0.008393f, 0.004465f, -0.007233f, -0.002890f, -0.001795f, -0.011486f, -0.001276f, -0.001098f, 0.006837f, -0.004411f, 0.006232f, 0.001054f, -0.000205f, -0.000653f, -0.001082f, -0.001253f, 0.001340f, -0.004645f, 0.002164f, -0.002685f, 0.002351f, 0.001978f, 0.000914f, 0.000557f, 0.006695f, 0.004886f, -0.001213f, 0.006065f, -0.000812f, -0.002066f, -0.001917f, 0.001173f, -0.000420f, 0.004145f, -0.001061f, 0.002581f, 0.002127f, -0.000389f, 0.001786f, -0.000021f, 0.001870f, 0.001814f, 0.000554f, 0.000610f, 0.002024f, 0.001318f, -0.002727f, -0.001532f, -0.000271f, 0.003359f, 0.003784f, -0.000011f, -0.000380f, 0.002021f, 0.000037f, -0.001279f, -0.036950f, -0.011498f, -0.003317f, -0.002928f, -0.003142f, 0.014293f, -0.013199f, 0.006373f, -0.003125f, 0.002940f, -0.003813f, -0.003007f, -0.010639f, 0.001777f, -0.003916f, 0.000839f, -0.015418f, 0.000345f, -0.001628f, -0.002717f, -0.000306f, 0.002919f, 0.002272f, -0.001425f, -0.001108f, -0.006131f, 0.001846f, -0.004919f, 0.003197f, 0.000018f, 0.002722f, 0.009616f, -0.002567f, -0.010972f, -0.004757f, + -0.012853f, 0.001727f, 0.002338f, -0.001222f, 0.002246f, -0.004552f, 0.004328f, 0.002162f, -0.005688f, 0.000437f, -0.015461f, -0.003354f, -0.010338f, 0.005609f, 0.010243f, -0.009070f, -0.000697f, 0.002880f, 0.001578f, -0.014816f, 0.002470f, 0.007534f, -0.007081f, -0.003429f, -0.016840f, 0.005663f, -0.002432f, 0.006909f, 0.012481f, 0.007060f, -0.010028f, 0.002073f, 0.002373f, 0.000499f, -0.011152f, 0.002829f, -0.004755f, 0.007375f, -0.003003f, -0.000410f, 0.003484f, 0.002979f, 0.008775f, 0.009936f, 0.006827f, -0.000554f, 0.002523f, 0.005901f, 0.003005f, -0.005930f, -0.001215f, -0.003970f, -0.003948f, 0.001753f, -0.000173f, 0.000919f, 0.000094f, -0.001212f, -0.000333f, 0.003553f, -0.001185f, -0.001220f, 0.000101f, -0.001059f, -0.002646f, 0.003220f, 0.000124f, 0.001506f, 0.003949f, -0.000529f, 0.000438f, -0.003146f, 0.002003f, 0.001344f, 0.000318f, -0.003162f, 0.001032f, 0.000009f, 0.002090f, -0.022900f, 0.002586f, 0.004018f, -0.008112f, -0.001081f, 0.022396f, 0.017274f, 0.009485f, -0.002563f, -0.003979f, 0.011040f, 0.007041f, 0.003489f, 0.004282f, -0.009029f, 0.003141f, 0.000796f, + 0.010573f, -0.010091f, -0.004505f, -0.001985f, 0.001397f, -0.002124f, -0.011486f, -0.007914f, -0.008061f, -0.009692f, 0.005402f, 0.006373f, 0.004224f, 0.002784f, 0.000287f, 0.002717f, -0.001375f, -0.001328f, 0.000812f, -0.003578f, -0.000921f, 0.004984f, 0.004031f, -0.007942f, -0.008686f, -0.000903f, -0.008712f, 0.005177f, -0.002588f, -0.014955f, 0.001879f, 0.007469f, 0.010796f, 0.007320f, 0.000502f, 0.006910f, -0.010522f, -0.003505f, -0.004651f, -0.000841f, 0.000836f, 0.004658f, -0.003566f, -0.009819f, 0.011922f, -0.010842f, -0.005053f, 0.007210f, 0.017198f, 0.003934f, 0.003476f, -0.016815f, 0.018162f, 0.002046f, 0.012687f, 0.019277f, -0.004186f, 0.001950f, 0.002357f, -0.008061f, 0.016161f, 0.003637f, -0.005170f, 0.004307f, -0.002150f, 0.007799f, -0.013116f, -0.007174f, -0.013404f, -0.002755f, -0.005891f, 0.005278f, -0.003327f, 0.002166f, -0.006232f, -0.001761f, -0.001138f, -0.004206f, -0.000177f, -0.001673f, 0.001757f, -0.000442f, -0.001670f, -0.001086f, -0.000702f, 0.003043f, 0.000960f, -0.002587f, -0.005399f, 0.002919f, 0.003148f, 0.000401f, 0.000093f, -0.000252f, -0.002183f, 0.000808f, + -0.001429f, 0.003168f, 0.000722f, 0.001709f, -0.001816f, -0.002383f, -0.004266f, 0.002360f, 0.034444f, 0.024410f, -0.008754f, -0.012585f, 0.019093f, 0.012592f, 0.020103f, 0.029731f, -0.015009f, 0.010379f, 0.004896f, 0.008717f, 0.003820f, 0.005287f, 0.012218f, 0.003172f, 0.012480f, 0.000538f, -0.008029f, 0.003489f, -0.002610f, 0.004350f, -0.001514f, 0.023124f, 0.003860f, 0.005199f, 0.003094f, 0.001042f, 0.008026f, 0.003553f, 0.000452f, -0.001344f, 0.005742f, -0.004312f, 0.010985f, -0.008442f, 0.013231f, -0.006122f, 0.007998f, 0.004330f, 0.004885f, 0.004025f, 0.019437f, 0.015006f, 0.000925f, -0.004046f, -0.010551f, 0.011665f, -0.012858f, 0.003370f, -0.005625f, 0.005815f, 0.012171f, 0.001612f, -0.020382f, -0.016392f, 0.001708f, -0.010141f, -0.011160f, -0.006286f, -0.012867f, 0.004742f, 0.022306f, 0.011347f, -0.008214f, 0.000672f, 0.002575f, -0.005688f, -0.006573f, -0.000929f, 0.010956f, 0.012342f, -0.012923f, 0.006287f, 0.014301f, 0.003010f, 0.004707f, 0.007067f, 0.011145f, -0.001754f, -0.007606f, 0.003130f, -0.003274f, -0.000481f, -0.007297f, 0.006918f, 0.010538f, 0.001784f, + 0.001890f, 0.001631f, -0.007385f, -0.000897f, -0.000122f, -0.000647f, 0.000751f, -0.000986f, 0.001219f, 0.001085f, 0.003615f, 0.000560f, -0.000059f, 0.000517f, 0.002326f, 0.004167f, 0.002084f, 0.004404f, 0.002312f, 0.000961f, 0.001248f, -0.000711f, -0.006872f, -0.006946f, 0.001459f, 0.005441f, 0.001356f, -0.001375f, 0.001291f, -0.000728f, 0.003328f, -0.002453f, -0.002428f, -0.004272f, 0.001962f, 0.015294f, 0.002806f, 0.022099f, -0.002031f, -0.000178f, -0.007401f, -0.005814f, 0.007291f, 0.016740f, -0.004954f, 0.004498f, 0.001099f, 0.018127f, 0.007374f, -0.008323f, -0.007853f, 0.001261f, 0.003693f, 0.016477f, 0.015987f, 0.024556f, 0.004359f, 0.006889f, -0.004385f, 0.010056f, 0.011259f, -0.004330f, -0.005706f, 0.008870f, -0.006836f, -0.009303f, 0.008726f, 0.002731f, -0.010941f, -0.013243f, 0.020165f, 0.010224f, -0.000760f, 0.012987f, 0.002448f, -0.008999f, 0.019150f, -0.004437f, 0.000515f, -0.000400f, 0.004920f, -0.006936f, 0.004920f, -0.006948f, 0.004788f, -0.006450f, 0.005821f, -0.005264f, 0.007945f, -0.006655f, -0.006890f, 0.017967f, -0.022484f, 0.001323f, 0.002599f, -0.007640f, + 0.001439f, -0.025134f, -0.012444f, 0.012103f, -0.010107f, 0.007459f, -0.002739f, 0.005052f, 0.002132f, 0.004339f, 0.002595f, -0.011366f, 0.006088f, -0.006583f, -0.000820f, -0.014457f, -0.007922f, -0.003577f, -0.003526f, 0.004191f, 0.013624f, 0.007973f, -0.011077f, 0.004308f, 0.002100f, 0.000150f, -0.005352f, 0.000804f, -0.001057f, 0.002737f, 0.001224f, -0.002750f, -0.003783f, -0.001414f, -0.001081f, -0.002078f, 0.007871f, 0.001513f, -0.003069f, -0.001658f, 0.001857f, -0.003205f, 0.000306f, 0.001634f, 0.000074f, 0.000476f, -0.008387f, -0.003344f, -0.002112f, 0.001304f, -0.002352f, -0.000296f, 0.005265f, -0.000424f, -0.001429f, -0.001512f, 0.000541f, 0.001674f, -0.017952f, -0.015335f, -0.000127f, 0.006755f, 0.012466f, -0.014520f, 0.004136f, -0.013041f, 0.010770f, 0.008373f, -0.018089f, -0.003663f, 0.001875f, -0.021064f, -0.012085f, 0.012943f, -0.001728f, -0.000843f, 0.002986f, -0.001260f, -0.022193f, 0.020309f, 0.001244f, -0.014264f, -0.007037f, 0.002763f, -0.001915f, -0.013709f, -0.004187f, -0.007850f, 0.002232f, -0.000622f, -0.004448f, 0.004486f, -0.019245f, -0.008462f, 0.004904f, 0.025160f, + -0.004250f, -0.014681f, -0.010483f, -0.008147f, 0.017028f, -0.018132f, -0.003691f, -0.001200f, -0.019497f, -0.024169f, 0.005911f, -0.016734f, -0.002721f, 0.002572f, 0.012726f, 0.007207f, 0.000998f, 0.002832f, 0.015206f, -0.006526f, -0.004811f, 0.022677f, -0.015153f, 0.011842f, -0.005230f, -0.005589f, -0.002347f, -0.002668f, 0.024092f, 0.000624f, 0.009342f, -0.024779f, -0.018068f, 0.000666f, -0.003643f, 0.027822f, 0.000857f, 0.018990f, 0.007932f, 0.023732f, 0.014322f, -0.003526f, -0.016515f, -0.006134f, 0.011038f, 0.004888f, 0.007442f, -0.009086f, -0.010346f, -0.002797f, -0.003509f, 0.004959f, -0.002583f, -0.006609f, -0.001246f, -0.001571f, -0.000105f, -0.000771f, 0.000854f, -0.002673f, -0.003725f, 0.004563f, -0.000372f, 0.000329f, -0.001311f, -0.001965f, -0.001616f, 0.001268f, 0.003802f, -0.004006f, 0.000863f, -0.002446f, -0.003724f, 0.002635f, -0.001145f, -0.003394f, -0.004056f, -0.000752f, 0.003708f, 0.000417f, 0.000428f, 0.001445f, 0.006737f, -0.005724f, -0.004835f, -0.002907f, 0.000493f, 0.002759f, -0.029856f, 0.002962f, -0.003066f, 0.020433f, 0.002209f, -0.021466f, 0.025574f, 0.008371f, + -0.015261f, -0.033035f, -0.013958f, 0.032801f, 0.001463f, -0.004078f, -0.005643f, 0.003444f, 0.000911f, 0.010162f, 0.005173f, 0.010880f, -0.002522f, 0.019376f, -0.010149f, -0.022697f, 0.000784f, 0.001118f, -0.005603f, -0.000767f, 0.008343f, -0.005786f, -0.003671f, -0.001925f, 0.018008f, 0.014187f, 0.007120f, -0.001287f, -0.024983f, -0.000422f, -0.001495f, -0.000979f, -0.004323f, -0.000347f, -0.011052f, -0.020162f, -0.003376f, 0.013957f, 0.013316f, -0.005040f, 0.014321f, -0.004641f, 0.006063f, 0.016022f, 0.015063f, -0.033695f, 0.011353f, 0.012218f, 0.004828f, -0.008183f, -0.029813f, 0.017991f, 0.010372f, 0.005777f, -0.010782f, -0.005864f, -0.012182f, 0.006667f, -0.013492f, -0.002428f, 0.000005f, 0.012109f, -0.007727f, 0.006180f, 0.003107f, -0.021609f, -0.003217f, -0.014437f, 0.023474f, 0.011023f, -0.028098f, -0.005887f, 0.021838f, 0.011022f, -0.011715f, -0.005713f, -0.012917f, -0.004267f, 0.006355f, -0.003859f, -0.001769f, -0.004830f, -0.006330f, -0.010590f, 0.001813f, 0.000838f, -0.003645f, -0.001080f, 0.005189f, 0.003658f, -0.006933f, -0.002378f, 0.004672f, -0.001312f, 0.003515f, -0.004424f, + -0.003311f, -0.000878f, 0.000745f, 0.005662f, -0.006285f, -0.004312f, 0.002795f, -0.006879f, -0.000791f, -0.004864f, 0.002678f, -0.003872f, 0.006319f, -0.002360f, -0.001434f, -0.003425f, 0.003931f, 0.002782f, 0.007228f, 0.002112f, 0.018601f, 0.022604f, 0.023271f, 0.017725f, 0.022821f, -0.028667f, -0.018665f, -0.009917f, -0.009233f, -0.013745f, -0.010446f, -0.023009f, -0.007732f, 0.001513f, 0.013759f, -0.000046f, -0.013086f, -0.000647f, 0.013753f, 0.000639f, -0.011281f, -0.005352f, 0.031204f, 0.002997f, 0.011776f, 0.003566f, 0.012940f, 0.002599f, 0.004250f, -0.019175f, 0.010758f, 0.000695f, 0.004498f, -0.020095f, 0.007020f, -0.030851f, 0.000060f, -0.009772f, 0.007717f, -0.002842f, -0.022450f, -0.000564f, -0.022344f, 0.004091f, -0.018553f, 0.016993f, -0.009576f, 0.026725f, 0.000913f, -0.000508f, 0.013555f, 0.002883f, -0.004156f, -0.003946f, 0.005537f, -0.009150f, 0.006400f, 0.016492f, 0.008529f, -0.012282f, -0.006335f, 0.035359f, 0.002802f, 0.028205f, -0.026052f, -0.005499f, -0.002670f, 0.020522f, -0.022714f, 0.003228f, 0.011040f, -0.022691f, 0.015965f, -0.014248f, 0.004267f, 0.022073f, + 0.002503f, 0.012440f, 0.006005f, 0.028844f, 0.012608f, -0.011948f, -0.009290f, -0.011509f, 0.001874f, 0.001116f, 0.012260f, -0.007195f, -0.001236f, 0.007932f, 0.000697f, 0.006123f, 0.008449f, 0.001174f, -0.006539f, 0.008005f, 0.006269f, -0.000755f, 0.002632f, 0.002704f, -0.002794f, -0.002369f, -0.009312f, 0.006351f, -0.004378f, -0.004220f, -0.001699f, -0.004895f, 0.004799f, -0.003325f, -0.000976f, -0.005244f, -0.001131f, -0.001162f, 0.006833f, 0.004787f, -0.000053f, -0.001042f, -0.000227f, 0.003813f, 0.004741f, 0.004045f, 0.008736f, -0.000953f, -0.003171f, -0.008401f, -0.028852f, 0.004576f, 0.027637f, 0.021126f, 0.022545f, -0.007300f, -0.006086f, 0.005980f, -0.004178f, 0.028482f, 0.009223f, 0.013721f, 0.023553f, -0.001429f, 0.008693f, -0.015844f, 0.023468f, 0.012127f, -0.006147f, -0.014213f, -0.013685f, 0.016186f, -0.027645f, 0.011036f, 0.015639f, -0.011169f, -0.015502f, -0.008448f, 0.014585f, 0.005825f, -0.005725f, -0.009756f, 0.000048f, -0.016625f, -0.025599f, 0.004937f, -0.024572f, -0.036112f, -0.004714f, 0.001707f, 0.036766f, -0.015620f, -0.012704f, 0.016725f, 0.027063f, 0.027504f, + 0.014377f, -0.001364f, 0.006199f, -0.011444f, 0.001994f, -0.012009f, 0.030289f, 0.027099f, 0.017286f, -0.000953f, -0.031167f, 0.000088f, -0.026629f, 0.029558f, 0.022665f, 0.014407f, -0.022111f, 0.018448f, 0.010275f, 0.012852f, -0.004190f, -0.018414f, -0.013644f, -0.014681f, 0.005013f, -0.020743f, -0.038506f, 0.007793f, 0.026024f, 0.014029f, 0.025554f, -0.007574f, -0.007094f, 0.026087f, 0.008580f, 0.003710f, 0.017159f, 0.005902f, 0.000470f, 0.015022f, 0.009294f, -0.001167f, 0.006745f, 0.006631f, 0.003878f, -0.004701f, -0.008501f, -0.011020f, 0.003000f, 0.007437f, 0.004204f, 0.015142f, 0.000391f, 0.010848f, -0.003351f, 0.004565f, 0.008450f, 0.001357f, -0.003846f, -0.002111f, -0.012378f, -0.010452f, 0.003775f, 0.002896f, 0.004984f, 0.013172f, 0.001965f, 0.010062f, -0.003677f, -0.001964f, 0.001764f, -0.009310f, -0.007420f, -0.002559f, -0.007960f, 0.004015f, -0.002583f, 0.003293f, 0.007326f, 0.010377f, 0.014670f, 0.023179f, 0.050125f, 0.022155f, 0.017538f, 0.016197f, -0.030928f, -0.004959f, -0.011275f, 0.039508f, -0.040181f, -0.038259f, 0.010994f, 0.025753f, -0.000674f, 0.031516f, + 0.028727f, -0.001471f, 0.011084f, -0.019072f, -0.013642f, 0.029953f, -0.011809f, 0.020548f, 0.007349f, -0.013478f, -0.006947f, -0.006035f, -0.006589f, -0.014058f, 0.011710f, 0.012362f, 0.010460f, 0.000865f, -0.015576f, -0.020180f, 0.026013f, -0.025668f, 0.020150f, 0.001743f, -0.031467f, 0.015761f, 0.030057f, -0.000726f, -0.008122f, -0.003926f, 0.002472f, 0.001611f, 0.020517f, -0.001197f, -0.015366f, -0.006543f, 0.017462f, -0.031882f, 0.007700f, -0.005447f, 0.025857f, 0.027124f, 0.018223f, 0.021204f, 0.028109f, 0.020054f, 0.007370f, -0.018376f, -0.020542f, 0.009819f, 0.013729f, -0.001114f, 0.011897f, 0.016058f, 0.042825f, -0.024277f, 0.027110f, -0.016179f, -0.010227f, 0.029316f, 0.004520f, -0.017710f, -0.015293f, -0.016350f, -0.026366f, -0.009142f, -0.012871f, 0.021005f, 0.000554f, -0.017015f, 0.009291f, 0.005745f, -0.003567f, 0.009794f, -0.020095f, 0.013032f, 0.000900f, -0.002003f, -0.002123f, 0.011058f, 0.001973f, 0.002826f, 0.011707f, -0.004967f, 0.001950f, 0.008407f, -0.012848f, 0.008977f, 0.000568f, 0.003274f, -0.005719f, 0.007136f, -0.002530f, 0.000740f, 0.009997f, -0.000074f, + -0.002355f, 0.002428f, 0.006758f, 0.008355f, 0.014178f, 0.011408f, 0.004248f, -0.006654f, -0.005396f, -0.020209f, 0.004489f, -0.016849f, -0.004911f, -0.007399f, -0.006848f, 0.007823f, 0.003062f, -0.008102f, -0.033312f, -0.005956f, 0.019397f, -0.023933f, 0.000767f, -0.015061f, -0.026315f, 0.038276f, 0.032735f, 0.027356f, 0.012978f, 0.007124f, 0.010775f, 0.028098f, 0.015531f, 0.028806f, -0.010667f, 0.024126f, -0.018181f, 0.029221f, 0.039263f, 0.024608f, 0.019627f, 0.009984f, 0.020272f, 0.020412f, -0.006068f, 0.040627f, 0.009757f, -0.024520f, 0.011626f, -0.024825f, -0.017068f, -0.005097f, -0.038596f, 0.000651f, -0.008232f, -0.010477f, -0.018767f, -0.009770f, -0.005395f, -0.001217f, -0.003812f, 0.001663f, 0.001608f, -0.022165f, -0.014637f, 0.004578f, -0.011706f, 0.009188f, 0.038000f, -0.019175f, -0.001557f, -0.003624f, 0.001394f, -0.018181f, 0.009780f, -0.008740f, 0.029410f, 0.006251f, 0.017561f, 0.027504f, 0.004683f, -0.001838f, -0.018163f, -0.040412f, 0.005318f, 0.030064f, 0.021813f, -0.005700f, -0.026943f, 0.022678f, 0.002371f, 0.013658f, -0.034491f, -0.024756f, -0.022720f, -0.034192f, + -0.021187f, -0.025017f, 0.011627f, 0.003692f, 0.008727f, 0.011405f, 0.015758f, -0.007724f, 0.016039f, 0.018262f, 0.000551f, 0.009817f, -0.005889f, -0.012132f, -0.012513f, -0.013134f, -0.005283f, -0.009576f, -0.000611f, 0.002886f, -0.001292f, 0.000866f, 0.002408f, -0.011111f, -0.010301f, -0.017591f, -0.006055f, -0.004080f, -0.009813f, 0.003869f, 0.001433f, -0.005196f, -0.015938f, -0.007319f, -0.005899f, -0.004103f, 0.013250f, 0.004061f, -0.005823f, -0.007335f, -0.002700f, -0.019090f, 0.005187f, -0.003884f, 0.009844f, 0.001136f, -0.006035f, -0.011250f, 0.011727f, -0.007711f, 0.016782f, -0.057186f, -0.036610f, -0.017420f, 0.040849f, 0.029745f, -0.022152f, 0.025484f, 0.023000f, 0.019609f, 0.019202f, -0.019203f, 0.001934f, 0.011061f, -0.019101f, -0.057645f, -0.010547f, -0.016022f, -0.035355f, 0.003155f, -0.012087f, -0.009083f, 0.010763f, 0.006379f, -0.007902f, 0.001645f, 0.026958f, 0.028826f, -0.053159f, 0.012568f, 0.002652f, 0.024506f, 0.008310f, 0.001271f, -0.033135f, 0.010023f, -0.008544f, -0.009268f, -0.022813f, -0.017005f, 0.042484f, -0.019411f, -0.000838f, 0.004971f, -0.011325f, 0.046958f, + 0.022269f, -0.021068f, -0.012757f, -0.036950f, -0.005399f, 0.035075f, 0.010247f, 0.010516f, -0.011648f, 0.021366f, -0.005158f, -0.009426f, 0.019708f, -0.011878f, 0.032735f, -0.007870f, 0.024362f, -0.050013f, -0.016983f, 0.028396f, 0.006923f, -0.004759f, 0.007934f, -0.055335f, -0.026184f, 0.008198f, -0.022113f, 0.008236f, 0.002138f, 0.005928f, 0.033728f, -0.012867f, 0.013548f, -0.002892f, -0.027597f, -0.004998f, 0.020712f, 0.029909f, -0.001072f, -0.012871f, -0.023415f, 0.000395f, -0.032649f, -0.010847f, 0.002708f, 0.038020f, 0.034052f, 0.004392f, 0.014241f, 0.004016f, -0.005837f, 0.018683f, 0.014214f, -0.007822f, 0.015611f, 0.011581f, 0.006182f, -0.013494f, -0.001047f, -0.007153f, 0.011353f, 0.007697f, 0.010083f, -0.001182f, -0.015738f, 0.014358f, 0.000533f, -0.007615f, -0.015334f, -0.001086f, -0.001372f, -0.014708f, 0.009914f, -0.010799f, -0.016725f, 0.018341f, -0.007638f, -0.006722f, -0.008530f, 0.003783f, 0.002514f, 0.014605f, 0.003147f, -0.002965f, 0.006065f, 0.008873f, -0.016951f, 0.004208f, 0.004610f, -0.006894f, 0.010372f, -0.024905f, -0.071594f, -0.006067f, -0.008645f, -0.007752f, + 0.010950f, -0.028563f, 0.056091f, -0.010243f, 0.002460f, 0.061894f, -0.072886f, -0.007577f, -0.014299f, -0.006945f, -0.083481f, 0.004655f, -0.012975f, -0.016130f, 0.028224f, -0.028646f, 0.004320f, 0.005471f, 0.013411f, -0.002623f, -0.030490f, 0.020805f, -0.020059f, 0.043363f, -0.007560f, -0.049152f, -0.003725f, -0.001652f, -0.024914f, -0.049520f, 0.022134f, 0.025226f, -0.041583f, 0.033874f, -0.037621f, -0.029157f, -0.018069f, 0.003285f, 0.002887f, 0.005600f, 0.023816f, -0.004528f, -0.022970f, -0.053986f, 0.010872f, -0.072985f, -0.038946f, -0.025079f, -0.058662f, -0.034628f, -0.017025f, -0.003565f, -0.027629f, 0.041851f, 0.042861f, 0.009595f, -0.013136f, 0.047548f, 0.021255f, -0.005382f, -0.010890f, 0.034253f, 0.025051f, -0.011623f, 0.045063f, -0.037923f, -0.019650f, 0.049531f, 0.023089f, 0.069456f, -0.038075f, -0.042577f, 0.010864f, -0.032356f, 0.034761f, 0.003842f, 0.011989f, 0.066046f, -0.036521f, -0.038866f, -0.014507f, 0.013814f, 0.014898f, 0.016727f, 0.016739f, 0.019231f, -0.020435f, 0.008168f, 0.002984f, -0.001303f, -0.002466f, -0.013457f, -0.010956f, 0.019396f, -0.020928f, -0.000887f, + 0.004116f, -0.009899f, 0.002508f, -0.010151f, -0.000834f, -0.000936f, 0.004244f, -0.016489f, 0.008430f, 0.021013f, 0.006084f, 0.005214f, 0.022926f, 0.017112f, -0.001686f, -0.021980f, 0.020267f, 0.005374f, -0.007757f, -0.016326f, 0.021043f, 0.003376f, 0.000591f, 0.013076f, 0.016297f, -0.020844f, 0.010872f, 0.007083f, -0.015159f, -0.006024f, -0.023521f, 0.015025f, -0.002862f, -0.026550f, -0.013260f, 0.006571f, 0.055724f, 0.031553f, -0.005148f, 0.075201f, -0.008678f, 0.030782f, -0.035576f, 0.043819f, 0.041455f, -0.003946f, -0.033277f, 0.003335f, 0.012022f, -0.018768f, 0.019661f, -0.027307f, -0.000452f, -0.008529f, -0.008915f, -0.031014f, -0.022554f, -0.014224f, -0.001902f, -0.010187f, -0.024230f, 0.035749f, 0.024655f, 0.006459f, -0.010072f, 0.005914f, 0.034600f, 0.016083f, 0.025421f, 0.015788f, -0.018960f, -0.029534f, 0.059175f, -0.007983f, -0.032375f, -0.013724f, -0.013916f, -0.007973f, 0.042822f, 0.001603f, -0.033035f, -0.012854f, -0.082096f, -0.020458f, -0.009637f, 0.050325f, 0.034907f, -0.100008f, -0.042983f, -0.024520f, -0.000521f, 0.004755f, -0.039841f, 0.029070f, 0.015669f, 0.025264f, + 0.050020f, -0.065702f, 0.064013f, 0.045714f, -0.020819f, -0.044215f, 0.002785f, -0.011232f, 0.017031f, 0.058019f, -0.030215f, -0.034072f, 0.047518f, -0.056263f, -0.062673f, -0.025522f, 0.006402f, -0.018243f, -0.068680f, -0.028071f, -0.022214f, 0.000747f, 0.003754f, -0.019972f, -0.001395f, 0.002635f, 0.000817f, 0.005518f, -0.043418f, -0.015592f, -0.014390f, 0.002447f, 0.012121f, -0.003576f, -0.013891f, -0.008442f, 0.004605f, 0.021785f, 0.023663f, -0.003669f, -0.020572f, -0.005729f, 0.030108f, 0.001402f, -0.007855f, 0.005888f, -0.040887f, -0.012434f, -0.019298f, 0.002296f, 0.007049f, -0.040057f, -0.040421f, 0.009656f, 0.035125f, -0.015520f, 0.022982f, 0.006670f, -0.011341f, -0.003735f, 0.009317f, 0.006617f, -0.003343f, 0.006568f, -0.001179f, 0.052281f, 0.007032f, 0.019668f, -0.040801f, -0.064409f, 0.093104f, 0.046653f, 0.004237f, 0.006143f, -0.020935f, -0.054775f, 0.019247f, -0.004220f, 0.047023f, 0.010564f, 0.017467f, 0.051595f, 0.028528f, -0.000520f, -0.005470f, 0.008779f, -0.031391f, -0.025770f, -0.033376f, -0.018568f, 0.030963f, -0.008386f, 0.001991f, 0.038767f, -0.006608f, 0.017063f, + -0.053686f, -0.048168f, -0.032710f, 0.028014f, 0.011396f, -0.001674f, 0.012826f, -0.016965f, -0.048266f, 0.061119f, -0.057893f, 0.026830f, 0.027593f, 0.021829f, 0.009730f, 0.037074f, -0.023777f, -0.059118f, 0.043863f, 0.124391f, -0.021856f, 0.060258f, -0.072249f, -0.038844f, 0.044733f, 0.026326f, -0.067075f, -0.018740f, -0.005622f, 0.058452f, -0.014453f, -0.006135f, -0.091222f, -0.058474f, -0.020929f, -0.066829f, 0.056067f, 0.059910f, 0.094269f, -0.083256f, 0.035909f, 0.010658f, -0.046378f, -0.002461f, -0.002175f, -0.096195f, 0.068787f, -0.028409f, 0.032488f, -0.009666f, 0.005371f, 0.130725f, -0.035231f, 0.045513f, 0.029929f, -0.031361f, 0.056887f, 0.000172f, -0.010941f, 0.003730f, 0.014688f, 0.037011f, 0.022507f, 0.014888f, -0.001281f, 0.035060f, -0.032603f, -0.015790f, 0.002757f, 0.008985f, 0.016157f, -0.008650f, 0.028107f, 0.004075f, 0.012491f, -0.005183f, 0.021295f, -0.001496f, -0.031204f, 0.018241f, -0.038334f, -0.022337f, -0.008917f, 0.016741f, -0.004101f, 0.019931f, 0.044824f, 0.069579f, 0.049963f, 0.014089f, 0.032133f, -0.018228f, 0.016332f, -0.000834f, -0.001432f, -0.002599f, + 0.006672f, -0.013997f, 0.019630f, -0.018684f, -0.082849f, -0.047408f, -0.001443f, -0.012867f, -0.027586f, 0.009822f, 0.027075f, 0.002502f, -0.029173f, -0.001757f, -0.027955f, 0.076171f, -0.023213f, 0.001480f, 0.058218f, -0.003528f, -0.059184f, -0.041631f, -0.040371f, -0.018271f, -0.021373f, 0.063417f, 0.006862f, 0.010237f, 0.032004f, -0.017721f, -0.017516f, -0.010966f, -0.017863f, -0.039104f, -0.008871f, 0.072738f, 0.023812f, 0.017091f, -0.048262f, 0.017640f, 0.004053f, -0.034813f, -0.003784f, -0.017571f, 0.079463f, -0.062907f, -0.053840f, -0.019312f, 0.010125f, -0.018915f, 0.002657f, 0.021141f, -0.040999f, -0.011321f, 0.067342f, -0.054314f, 0.009734f, -0.013788f, -0.032639f, -0.057588f, -0.043594f, 0.001895f, -0.079635f, -0.096801f, 0.023147f, 0.019557f, 0.015729f, -0.086518f, 0.066858f, 0.080734f, -0.027273f, -0.023662f, 0.005261f, -0.003588f, -0.018043f, -0.045049f, 0.032687f, 0.121951f, 0.031913f, -0.030393f, 0.000788f, 0.019192f, 0.040946f, 0.010835f, -0.072108f, -0.064672f, 0.070029f, -0.013571f, -0.028407f, -0.042310f, 0.014673f, 0.079657f, 0.024619f, -0.025432f, 0.014880f, -0.003281f, + -0.014065f, -0.007161f, -0.004124f, 0.035160f, 0.019676f, -0.012177f, -0.019408f, 0.015832f, 0.009406f, -0.003123f, -0.007964f, 0.012782f, -0.018784f, 0.011603f, 0.030729f, -0.002949f, -0.016835f, -0.005214f, -0.010809f, -0.018648f, -0.034196f, 0.004896f, 0.026249f, -0.017601f, -0.021551f, 0.010598f, -0.026924f, 0.000087f, -0.043848f, 0.021020f, 0.027424f, 0.069907f, -0.022226f, -0.009564f, -0.028929f, -0.029736f, 0.008425f, 0.015407f, 0.029127f, -0.003497f, -0.006278f, -0.029312f, 0.011812f, 0.007260f, 0.008814f, -0.008655f, -0.001830f, 0.018442f, 0.021344f, -0.026490f, -0.069712f, 0.019260f, 0.027306f, -0.103355f, 0.056631f, 0.002404f, -0.029404f, 0.009876f, 0.037738f, -0.053429f, 0.033013f, -0.049615f, 0.013421f, -0.002902f, -0.024964f, -0.013913f, -0.006740f, -0.036536f, 0.026182f, 0.022867f, -0.001041f, 0.012601f, 0.001612f, 0.020225f, 0.026434f, 0.025527f, 0.037902f, 0.032530f, -0.020126f, 0.005049f, -0.041324f, 0.043803f, -0.033879f, 0.010710f, -0.006523f, 0.008914f, 0.002154f, -0.031330f, 0.028480f, -0.015892f, -0.030258f, 0.063458f, -0.050793f, 0.015233f, -0.014646f, -0.025267f, + 0.025621f, -0.006634f, 0.007603f, 0.039531f, -0.047816f, 0.001912f, -0.058588f, -0.115452f, -0.002946f, 0.036755f, -0.013866f, 0.148340f, 0.030204f, -0.058009f, 0.016297f, -0.080921f, 0.028087f, 0.057837f, 0.068354f, -0.023540f, -0.013493f, -0.089964f, -0.103090f, -0.008713f, -0.064274f, 0.015184f, -0.004067f, -0.056138f, -0.013146f, -0.027822f, -0.061414f, 0.050262f, 0.098964f, -0.027828f, 0.006970f, 0.021302f, -0.026270f, 0.030571f, 0.039007f, -0.027167f, 0.004516f, 0.000039f, -0.049301f, 0.024555f, 0.004137f, 0.014902f, 0.018009f, -0.034885f, 0.013609f, -0.018540f, -0.027969f, -0.031717f, 0.026884f, -0.019709f, 0.011038f, -0.030665f, -0.011066f, -0.002156f, -0.037348f, 0.036483f, -0.023686f, 0.007241f, 0.011128f, -0.034848f, -0.005697f, 0.026738f, -0.003203f, 0.003748f, 0.005939f, -0.010231f, 0.016442f, 0.034537f, -0.004173f, 0.020032f, 0.023663f, -0.029643f, -0.056167f, 0.018922f, 0.007823f, 0.032351f, 0.038804f, -0.050811f, -0.049876f, 0.008668f, -0.014660f, 0.008832f, 0.016906f, 0.009208f, -0.073661f, 0.015198f, -0.005380f, -0.042906f, 0.019294f, -0.027855f, -0.018848f, -0.034631f, + 0.017641f, -0.037716f, 0.048288f, -0.005127f, 0.017860f, -0.011132f, 0.064868f, -0.017630f, 0.035610f, -0.000581f, 0.042460f, -0.011861f, -0.021495f, 0.013875f, -0.024323f, -0.025666f, 0.003450f, 0.048348f, 0.031055f, -0.032925f, 0.035123f, -0.024699f, -0.037852f, 0.010653f, 0.051675f, -0.019907f, -0.021120f, 0.027649f, 0.012369f, -0.025781f, 0.002842f, 0.035172f, -0.014717f, -0.033877f, 0.018400f, 0.014088f, 0.021579f, 0.039601f, 0.008264f, -0.023945f, -0.007914f, 0.087021f, 0.091400f, -0.025314f, -0.075787f, 0.058045f, -0.025376f, 0.016345f, 0.008186f, 0.097986f, 0.013425f, -0.050925f, -0.018645f, -0.012377f, 0.002710f, 0.015124f, 0.023613f, 0.031811f, -0.037896f, 0.012110f, 0.008562f, 0.056783f, -0.014223f, 0.039991f, 0.043038f, 0.023798f, 0.020504f, 0.012364f, 0.034265f, -0.032939f, 0.036876f, 0.046921f, 0.033852f, 0.005676f, -0.066600f, -0.009998f, -0.042965f, 0.001942f, 0.028792f, 0.009637f, -0.014706f, -0.023440f, -0.013723f, -0.003786f, -0.001727f, 0.012147f, -0.013822f, 0.003684f, -0.001466f, -0.010504f, 0.020246f, 0.007836f, -0.018206f, -0.008648f, -0.004697f, 0.024695f, + -0.000041f, 0.005001f, -0.023873f, -0.017145f, -0.031660f, -0.014970f, -0.001959f, -0.003092f, 0.000402f, -0.005606f, -0.028378f, 0.007218f, -0.009714f, -0.004741f, 0.004186f, -0.008012f, -0.000424f, -0.024669f, -0.005874f, 0.000933f, 0.000363f, 0.000424f, -0.006289f, -0.006295f, -0.002172f, -0.009843f, -0.013845f, 0.103264f, 0.043534f, -0.046759f, 0.011345f, -0.048846f, -0.026383f, -0.003433f, 0.017716f, -0.007875f, 0.037938f, -0.045182f, -0.001333f, 0.017701f, -0.001449f, 0.018412f, -0.002623f, 0.006403f, 0.004394f, -0.032404f, -0.010085f, 0.008406f, -0.030092f, -0.030459f, 0.002618f, 0.007732f, -0.021383f, 0.015268f, 0.014890f, -0.009123f, -0.015098f, -0.002503f, 0.003347f, -0.005389f, 0.012801f, 0.003194f, 0.010095f, -0.013392f, -0.005588f, 0.023561f, 0.000075f, 0.001143f, 0.011476f, -0.007706f, 0.012691f, -0.012135f, -0.022339f, -0.014616f, 0.023180f, -0.018448f, -0.013455f, 0.001367f, -0.018163f, -0.019742f, 0.028188f, -0.028059f, 0.044527f, 0.009694f, -0.019665f, 0.019420f, 0.003143f, -0.033020f, 0.002934f, -0.005954f, -0.005729f, 0.015603f, -0.000455f, -0.019395f, 0.037885f, -0.022744f, + -0.008760f, 0.019544f, 0.006345f, -0.008289f, 0.001022f, 0.006018f, -0.000581f, -0.001633f, -0.003865f, 0.008663f, 0.015767f, -0.000644f, -0.026177f, 0.018737f, -0.013479f, -0.002065f, 0.022484f, -0.001517f, -0.006822f, -0.000956f, -0.019346f, 0.009344f, 0.006755f, -0.002196f, 0.000472f, 0.007874f, -0.018838f, 0.001338f, -0.006428f, 0.001865f, 0.007852f, 0.001965f, -0.007985f, 0.018473f, -0.028109f, 0.003646f, 0.003367f, -0.002044f, 0.003525f, -0.004188f, -0.015855f, 0.017484f, -0.008098f, 0.012476f, 0.000248f, -0.002096f, 0.016556f, 0.006120f, -0.013789f, 0.005171f, -0.006934f, -0.006072f, 0.003209f, 0.010406f, 0.010683f, -0.004229f, -0.013613f, 0.006931f, -0.007731f, 0.009417f, -0.062757f, -0.074991f, 0.063208f, 0.257101f, 0.100290f, 0.118063f, 0.001386f, -0.240312f, -0.177345f, -0.092389f, -0.141370f, 0.063526f, 0.121329f, 0.050321f, 0.214655f, 0.121787f, -0.008308f, 0.050698f, -0.108865f, -0.218980f, -0.087692f, -0.152043f, -0.024564f, 0.105652f, 0.088618f, 0.080615f, 0.133699f, 0.082819f, 0.022487f, 0.036975f, -0.010215f, -0.155778f, -0.069164f, -0.055995f, -0.215727f, 0.040138f, + 0.028001f, -0.095522f, 0.154961f, 0.153767f, -0.005496f, 0.194506f, 0.095301f, -0.090115f, 0.060043f, -0.089592f, -0.187066f, -0.014666f, -0.113107f, -0.163316f, 0.028614f, 0.017635f, -0.010040f, 0.152561f, 0.146691f, 0.087919f, 0.130547f, 0.079652f, -0.051171f, -0.057210f, -0.102259f, -0.174613f, -0.129241f, -0.061403f, -0.057969f, 0.031465f, 0.098369f, 0.067563f, 0.108101f, 0.163828f, 0.063381f, -0.021427f, -0.020806f, -0.113155f, -0.091781f, 0.008481f, -0.105310f, -0.047576f, 0.056619f, 0.014124f, 0.070956f, 0.057428f, -0.029580f, 0.019193f, -0.006250f, -0.039040f, 0.008294f, -0.017398f, -0.018045f, 0.036263f, 0.012190f, 0.015384f, 0.047821f, -0.027643f, -0.011132f, 0.026229f, -0.036324f, -0.029450f, 0.013262f, -0.086011f, -0.014720f, 0.029562f, -0.069767f, 0.033996f, 0.042912f, 0.004655f, 0.108390f, 0.103538f, 0.023371f, 0.042045f, -0.030670f, -0.092479f, -0.046851f, -0.123093f, -0.140217f, -0.079268f, -0.034203f, 0.026490f, 0.132766f, 0.154366f, 0.161233f, 0.143613f, 0.081513f, -0.017916f, -0.090879f, -0.143040f, -0.200048f, -0.170747f, -0.094504f, -0.024415f, 0.079867f, 0.144275f, + 0.143461f, 0.128703f, 0.083125f, -0.015824f, -0.026528f, -0.041469f, -0.063077f, -0.044585f, -0.039792f, -0.046466f, -0.025716f, -0.013197f, -0.011886f, 0.009058f, 0.026246f, 0.035633f, 0.046051f, 0.042901f, 0.032981f, 0.014644f, 0.001170f, -0.017460f, -0.026079f, -0.034016f, -0.036274f, -0.035980f, -0.015318f, 0.001145f, 0.012410f, 0.012302f, 0.018599f, 0.019964f, 0.021207f, 0.015344f, 0.004335f, -0.002068f, -0.001308f, -0.007677f, -0.006494f, -0.005956f, -0.011444f, -0.013330f, -0.002966f, -0.004652f, -0.003280f, -0.002119f, -0.001571f, 0.004915f, 0.013253f, 0.010012f, 0.010329f, 0.010074f, 0.005654f, 0.001631f, -0.002091f, -0.010275f, -0.011303f, -0.012345f, -0.009166f, -0.005483f, -0.000353f, 0.001354f, 0.005741f, 0.008289f, 0.008725f, 0.004334f, 0.002833f, 0.000713f, 0.000586f, -0.000919f, -0.001603f, -0.003133f, -0.001072f, -0.001793f, -0.001490f, -0.002574f, -0.002488f, -0.003214f, -0.001768f, -0.002323f, 0.001159f, 0.003146f, 0.005595f, 0.005257f, 0.004999f, 0.002613f, 0.001792f, -0.001704f, -0.002871f, -0.003979f, -0.004411f, -0.005222f, -0.001939f, -0.001433f, 0.000402f, 0.000877f, + 0.002187f, 0.001764f, 0.003181f, 0.001526f, 0.001830f, 0.000367f, 0.000361f, -0.001218f, -0.000415f, -0.001402f, -0.000251f, -0.000709f}, + {0.001020f, 0.006386f, -0.008690f, -0.007109f, -0.001197f, 0.006848f, 0.010141f, -0.004785f, 0.005930f, -0.003292f, -0.008407f, -0.002330f, -0.004691f, 0.002751f, -0.001140f, -0.004092f, 0.003755f, 0.005649f, 0.001291f, 0.006833f, -0.012535f, -0.013586f, -0.008696f, 0.001244f, -0.000013f, -0.002338f, 0.000676f, 0.004123f, -0.001336f, 0.005574f, 0.004641f, -0.005946f, 0.002277f, -0.000462f, 0.007264f, 0.006661f, 0.002541f, -0.007116f, 0.004674f, -0.004246f, 0.002387f, 0.004638f, -0.011318f, 0.012372f, 0.018218f, 0.002364f, 0.008267f, -0.006719f, -0.001333f, -0.006308f, -0.003248f, 0.005619f, -0.001863f, -0.006523f, -0.001704f, -0.004114f, 0.003157f, -0.004012f, -0.003610f, 0.000347f, 0.003348f, -0.003330f, -0.003718f, -0.001639f, 0.006487f, 0.005804f, -0.004898f, -0.001828f, -0.005792f, 0.001320f, 0.007702f, 0.002117f, -0.002791f, -0.003688f, 0.002911f, -0.001050f, -0.005211f, -0.001929f, -0.003511f, -0.000527f, -0.001872f, 0.003018f, 0.002866f, 0.001509f, -0.001659f, -0.002339f, 0.005201f, -0.000721f, 0.001433f, 0.002667f, -0.000748f, -0.000092f, -0.001049f, 0.001560f, 0.000234f, 0.000377f, + -0.001490f, 0.000194f, -0.000455f, -0.001526f, 0.000100f, -0.000254f, 0.001144f, 0.002705f, -0.001489f, 0.000613f, -0.000267f, 0.001305f, 0.001653f, -0.000417f, -0.000642f, -0.000365f, -0.000055f, -0.001479f, -0.000582f, 0.000628f, -0.000528f, 0.000251f, -0.000002f, 0.001188f, 0.000294f, 0.000135f, 0.028005f, 0.012872f, -0.000959f, 0.005849f, 0.005334f, -0.006726f, -0.003280f, 0.007752f, 0.003543f, 0.008438f, -0.006130f, 0.012275f, 0.004628f, -0.012138f, 0.009636f, 0.000500f, -0.000206f, -0.006413f, 0.007054f, -0.013122f, -0.011236f, -0.002424f, -0.003987f, -0.002192f, -0.004005f, 0.001503f, -0.002426f, -0.005466f, -0.003927f, 0.004544f, -0.004964f, 0.003168f, 0.002026f, 0.001259f, -0.005481f, 0.007693f, -0.016125f, -0.002859f, -0.000075f, -0.002850f, -0.002015f, 0.001368f, 0.003026f, -0.005201f, 0.004130f, -0.006297f, 0.006016f, 0.001875f, 0.001326f, 0.006165f, -0.004356f, -0.001079f, 0.002521f, 0.009660f, 0.002410f, 0.004036f, -0.002222f, -0.008437f, -0.011732f, 0.002130f, 0.006386f, 0.008293f, -0.003402f, -0.013161f, 0.001963f, -0.005400f, -0.003653f, -0.003070f, 0.003650f, 0.000353f, + 0.012848f, -0.000414f, 0.004331f, 0.002486f, -0.001935f, -0.003375f, -0.003572f, -0.013446f, -0.003932f, -0.002226f, -0.001816f, -0.002600f, 0.002504f, 0.006688f, 0.001885f, 0.006343f, -0.000063f, -0.000635f, -0.002030f, 0.001721f, 0.002332f, -0.000673f, -0.002591f, 0.002229f, -0.001330f, 0.000858f, -0.001127f, 0.001144f, -0.001918f, -0.001221f, 0.001829f, 0.000560f, 0.001036f, -0.000727f, 0.000641f, -0.001261f, 0.015132f, 0.003457f, -0.012685f, -0.014497f, 0.004007f, -0.004450f, -0.011921f, 0.013540f, -0.006626f, -0.002266f, -0.001811f, 0.010608f, 0.002285f, -0.006218f, 0.007517f, -0.005839f, 0.011339f, -0.015661f, -0.010265f, 0.012394f, -0.012941f, -0.013150f, -0.005224f, 0.010585f, 0.004694f, 0.005042f, -0.001215f, 0.009478f, 0.005801f, -0.001042f, -0.012552f, 0.003348f, -0.003471f, 0.004471f, 0.004018f, 0.003370f, 0.010944f, 0.002868f, -0.010738f, 0.000929f, 0.007510f, 0.010940f, 0.003727f, -0.006088f, -0.001408f, -0.008951f, 0.003815f, -0.015829f, -0.000602f, 0.016961f, 0.000926f, 0.001760f, -0.008721f, -0.010877f, 0.001670f, 0.002293f, 0.012533f, -0.002794f, 0.001087f, 0.001250f, + -0.001844f, 0.001218f, 0.004170f, 0.000676f, 0.008816f, -0.002460f, 0.005857f, 0.000797f, 0.001586f, 0.000989f, 0.010339f, 0.000361f, -0.001438f, 0.001839f, -0.002202f, -0.007061f, -0.003720f, -0.007278f, -0.000164f, 0.012939f, 0.002731f, -0.004333f, -0.001461f, -0.007502f, 0.004225f, -0.005891f, -0.004084f, 0.001337f, 0.000217f, 0.000360f, -0.003354f, -0.004824f, -0.000982f, 0.001098f, -0.001597f, 0.002645f, -0.000305f, -0.000085f, 0.002664f, 0.001587f, 0.002683f, 0.002138f, -0.000032f, 0.000800f, -0.002182f, 0.000039f, -0.001937f, -0.002161f, 0.001455f, 0.001661f, 0.003075f, 0.002150f, -0.001497f, -0.000469f, 0.001624f, -0.001284f, -0.002359f, 0.001243f, 0.000331f, 0.000018f, 0.000300f, -0.034789f, -0.022554f, -0.005098f, 0.003869f, 0.005474f, 0.000681f, -0.000155f, -0.013150f, -0.000928f, -0.002794f, -0.002326f, 0.000380f, -0.003481f, -0.001439f, -0.009906f, 0.005169f, -0.020721f, -0.007451f, 0.001737f, -0.004056f, -0.006411f, -0.003528f, -0.011839f, -0.005868f, -0.004985f, -0.005489f, 0.002482f, -0.009004f, -0.005107f, 0.011326f, 0.007221f, 0.000836f, 0.005290f, 0.004045f, -0.003799f, + -0.007465f, 0.004360f, 0.016872f, 0.001791f, 0.002180f, -0.006737f, -0.005846f, 0.004824f, -0.014314f, -0.007773f, 0.016019f, -0.014695f, 0.004478f, -0.003593f, -0.007278f, 0.003252f, 0.001148f, -0.004174f, 0.001019f, 0.002328f, -0.004973f, -0.000073f, -0.000925f, 0.009716f, 0.008801f, 0.001167f, 0.002426f, 0.004143f, -0.000214f, -0.002043f, -0.003320f, -0.020363f, 0.009875f, 0.005985f, -0.005437f, -0.000349f, -0.008395f, -0.002435f, 0.001280f, -0.006325f, 0.002886f, -0.007647f, -0.004105f, -0.008882f, -0.012901f, 0.008401f, -0.002393f, 0.000247f, -0.010892f, -0.002876f, 0.001495f, 0.001681f, -0.002814f, -0.000645f, -0.000528f, -0.003167f, -0.005600f, 0.000766f, -0.002838f, 0.002302f, -0.000375f, -0.001575f, -0.001092f, -0.000739f, 0.002853f, 0.000337f, -0.004129f, 0.000650f, -0.001191f, -0.000497f, 0.001425f, 0.000481f, -0.001022f, 0.000843f, -0.003228f, 0.001620f, -0.002929f, -0.001086f, -0.003828f, -0.030070f, 0.004721f, 0.006928f, -0.001784f, -0.002726f, -0.016486f, -0.006886f, 0.004657f, -0.014910f, -0.014091f, 0.002809f, -0.013398f, -0.007044f, -0.000236f, -0.008242f, 0.004712f, -0.006513f, + 0.010244f, -0.005431f, -0.003400f, 0.003118f, 0.007199f, 0.013031f, 0.008307f, -0.014688f, -0.000680f, -0.001159f, 0.007318f, 0.010731f, 0.018471f, -0.008229f, -0.007101f, 0.009446f, -0.009913f, 0.002262f, 0.002995f, 0.015447f, 0.005802f, 0.008596f, -0.011425f, -0.005161f, -0.015641f, 0.012412f, 0.013173f, 0.014953f, -0.000119f, -0.003278f, -0.009937f, -0.002157f, 0.010208f, -0.004725f, -0.006358f, -0.006011f, -0.007775f, 0.001666f, 0.001977f, 0.002331f, -0.010683f, -0.000179f, -0.010464f, -0.000604f, -0.001463f, 0.004284f, 0.003849f, -0.003275f, -0.004682f, -0.013439f, -0.000663f, -0.001096f, 0.008389f, -0.005200f, 0.013861f, -0.007848f, 0.001835f, 0.006357f, 0.012606f, -0.009665f, 0.003012f, 0.006536f, -0.011095f, 0.005616f, 0.000124f, 0.013815f, 0.004734f, 0.003095f, 0.008620f, -0.000856f, 0.002453f, 0.006540f, 0.002770f, 0.000081f, -0.002287f, 0.000121f, 0.002883f, -0.000876f, 0.003628f, 0.005370f, 0.004509f, -0.002004f, 0.002560f, 0.000365f, -0.001321f, 0.002169f, 0.002950f, 0.000029f, 0.001423f, 0.003459f, 0.002651f, 0.002799f, 0.001458f, -0.001306f, -0.002094f, 0.002683f, + -0.002257f, 0.002675f, -0.001246f, 0.000243f, 0.003435f, 0.002564f, -0.000650f, 0.001898f, 0.037316f, 0.031561f, -0.000910f, 0.000714f, 0.016774f, 0.002025f, 0.008334f, -0.005191f, 0.009313f, -0.007226f, 0.016932f, 0.005486f, 0.000260f, 0.003179f, 0.001400f, 0.020908f, 0.014508f, -0.014087f, -0.011306f, 0.004265f, 0.002469f, -0.004670f, -0.002775f, 0.002452f, 0.010370f, 0.007298f, 0.004861f, 0.000859f, 0.005585f, -0.003757f, -0.000045f, 0.011419f, -0.012561f, 0.004910f, 0.015786f, 0.011440f, 0.021377f, -0.002307f, -0.002983f, -0.002069f, 0.001567f, -0.006975f, 0.023211f, 0.020838f, 0.015283f, -0.007230f, -0.001864f, 0.008733f, 0.007530f, -0.006654f, 0.001667f, 0.011832f, -0.004275f, -0.005867f, 0.007901f, -0.022560f, -0.002366f, 0.001013f, 0.003516f, -0.007783f, -0.014374f, 0.005741f, 0.010218f, -0.012101f, -0.004195f, -0.013140f, 0.005043f, 0.000687f, -0.002491f, -0.002998f, -0.011044f, 0.018663f, -0.004746f, 0.002320f, -0.018983f, -0.004780f, -0.008949f, 0.022236f, -0.003743f, -0.003303f, 0.010220f, 0.004405f, 0.000155f, -0.007385f, 0.006863f, -0.004933f, -0.006478f, 0.010194f, + 0.009911f, -0.000363f, 0.006269f, 0.000003f, -0.002554f, 0.005308f, -0.000651f, 0.001940f, -0.001584f, -0.002654f, -0.000413f, 0.004083f, -0.002986f, -0.002650f, 0.000060f, -0.003473f, 0.001363f, -0.003152f, -0.001500f, 0.000066f, -0.000340f, 0.004058f, 0.000327f, 0.001041f, 0.002917f, 0.002528f, 0.000914f, 0.001206f, 0.002441f, 0.005481f, 0.001267f, 0.005155f, 0.001091f, 0.002448f, 0.004087f, 0.024443f, -0.000965f, 0.015457f, 0.021072f, -0.011114f, -0.025984f, 0.001117f, 0.019740f, -0.015261f, 0.013858f, -0.004098f, -0.018806f, -0.008644f, 0.018918f, -0.018460f, -0.016335f, 0.011925f, -0.018887f, 0.006325f, 0.008994f, 0.007442f, -0.005365f, 0.011472f, 0.003214f, 0.002188f, 0.007347f, -0.012017f, 0.016425f, 0.008131f, 0.007128f, -0.003349f, -0.001841f, 0.030677f, -0.010733f, 0.001948f, 0.007966f, 0.015462f, -0.020956f, -0.017198f, -0.016071f, 0.000669f, 0.001182f, -0.001025f, 0.009744f, 0.003085f, 0.017398f, 0.007056f, 0.010195f, -0.001586f, 0.001362f, -0.008548f, 0.015551f, -0.006987f, 0.015341f, -0.008311f, -0.013231f, 0.022880f, 0.018539f, -0.026187f, -0.023162f, -0.015169f, + -0.011906f, 0.008324f, 0.001313f, -0.005254f, 0.012082f, 0.013381f, -0.015978f, 0.009474f, -0.001287f, -0.031933f, -0.010564f, -0.016069f, -0.014628f, 0.005609f, -0.004973f, 0.010578f, -0.002410f, 0.001649f, 0.019153f, 0.019567f, -0.001797f, 0.005200f, -0.001684f, 0.003107f, 0.002771f, -0.006521f, 0.005505f, 0.001677f, -0.000233f, 0.016527f, 0.004963f, -0.000041f, 0.000512f, -0.002860f, 0.004882f, -0.000459f, 0.003223f, -0.003480f, -0.000171f, -0.003674f, 0.001028f, 0.004364f, 0.001379f, 0.000070f, -0.000484f, 0.003829f, 0.002445f, -0.002283f, 0.000359f, -0.000019f, 0.000601f, 0.001988f, 0.000877f, -0.001480f, -0.001795f, 0.000615f, 0.001113f, -0.000134f, -0.013802f, -0.019509f, 0.011736f, -0.011243f, -0.008143f, -0.007006f, -0.022538f, -0.002434f, 0.010157f, -0.006172f, -0.001298f, -0.008313f, 0.018697f, 0.002824f, 0.011934f, 0.009008f, -0.014944f, 0.015369f, 0.023155f, -0.007124f, -0.009363f, 0.002436f, -0.003942f, 0.009923f, -0.028484f, 0.010894f, 0.024798f, -0.003331f, -0.008025f, -0.007091f, 0.010824f, 0.022109f, -0.005186f, 0.005553f, -0.009814f, 0.015135f, -0.018217f, -0.007046f, + 0.003626f, -0.002897f, -0.014120f, 0.026090f, 0.018491f, 0.013763f, -0.005748f, -0.019720f, -0.002354f, -0.027999f, 0.004901f, -0.002067f, -0.000824f, -0.000616f, -0.004148f, 0.015126f, 0.012905f, -0.019460f, 0.010931f, -0.011664f, 0.016140f, -0.001505f, -0.003190f, -0.001364f, -0.016954f, -0.003281f, -0.015462f, -0.034410f, -0.001495f, 0.003996f, 0.002781f, -0.013227f, -0.000382f, -0.003803f, -0.025617f, 0.000495f, 0.022369f, -0.014119f, 0.005904f, 0.007255f, -0.002764f, 0.001559f, -0.006537f, -0.003930f, 0.005301f, 0.006325f, 0.007059f, -0.001800f, -0.004416f, -0.001733f, -0.004751f, 0.003914f, 0.001994f, -0.004078f, -0.001111f, -0.003752f, -0.004001f, -0.000562f, -0.003591f, -0.005566f, 0.003471f, -0.001178f, -0.004190f, 0.003342f, -0.002918f, 0.002752f, 0.004297f, 0.001767f, 0.004131f, 0.002862f, 0.000008f, 0.002704f, 0.009260f, 0.004415f, -0.004526f, -0.003169f, -0.005205f, -0.000004f, -0.006751f, 0.003576f, -0.000348f, 0.005241f, -0.001347f, 0.004081f, -0.000655f, -0.002917f, 0.008741f, 0.004165f, -0.036115f, 0.002539f, 0.021051f, 0.011499f, -0.016461f, -0.013378f, 0.026390f, 0.006101f, + 0.005925f, -0.005202f, 0.006822f, -0.000270f, -0.017664f, -0.004603f, -0.018552f, 0.008770f, -0.011057f, -0.001689f, -0.018078f, -0.020000f, -0.026897f, 0.016820f, 0.011343f, -0.008628f, -0.009599f, 0.007551f, -0.024703f, -0.002258f, 0.001846f, 0.005959f, 0.010837f, 0.005294f, 0.000679f, -0.008550f, 0.003577f, -0.007852f, 0.006499f, -0.007533f, 0.004287f, 0.002278f, -0.007838f, -0.010166f, -0.019367f, -0.012775f, 0.004876f, -0.033030f, -0.009022f, 0.018107f, 0.009620f, -0.003994f, 0.043086f, -0.006253f, 0.019947f, 0.019741f, -0.031444f, 0.002036f, -0.004200f, -0.026550f, -0.013909f, -0.014618f, 0.000435f, 0.003095f, 0.029762f, -0.004807f, 0.002834f, 0.020180f, 0.014947f, -0.003536f, 0.020079f, -0.009550f, -0.007415f, -0.013452f, -0.017859f, -0.025969f, -0.009896f, 0.014796f, -0.028303f, -0.014432f, 0.021812f, 0.015917f, -0.009560f, 0.019958f, -0.008927f, -0.001391f, -0.000924f, 0.009597f, -0.006283f, 0.009564f, -0.006020f, 0.008181f, -0.002403f, 0.003376f, -0.003879f, 0.006619f, 0.006323f, 0.002748f, -0.001151f, 0.007472f, -0.004866f, -0.005487f, 0.005813f, -0.001642f, 0.006347f, 0.004643f, + 0.003136f, 0.004295f, 0.002594f, 0.001218f, -0.010924f, -0.002020f, -0.000127f, 0.003037f, -0.002923f, -0.004610f, -0.003868f, -0.010437f, 0.003938f, -0.000218f, 0.006567f, 0.003715f, 0.006392f, 0.004877f, 0.001347f, 0.001970f, 0.024929f, -0.004422f, 0.008109f, -0.012229f, 0.007258f, 0.010309f, -0.006251f, 0.008802f, -0.013646f, -0.015203f, 0.023132f, 0.012455f, 0.014977f, 0.018269f, 0.000028f, -0.015209f, 0.019992f, -0.017507f, -0.023279f, 0.000239f, 0.022055f, -0.003248f, -0.018897f, 0.002503f, 0.025934f, -0.003819f, 0.007200f, 0.002404f, 0.036334f, 0.002193f, 0.007859f, 0.017778f, -0.002170f, -0.009349f, -0.017253f, 0.002356f, -0.002308f, -0.016776f, 0.000641f, -0.009924f, 0.006748f, 0.024464f, 0.000339f, -0.014910f, -0.004301f, -0.013833f, -0.007221f, -0.002236f, -0.005710f, 0.003227f, -0.018229f, 0.019569f, -0.010305f, 0.033126f, -0.008296f, -0.024237f, 0.001463f, 0.001075f, 0.011869f, 0.004935f, 0.006458f, -0.024860f, -0.019996f, 0.014407f, -0.020828f, -0.029211f, 0.008429f, 0.005681f, -0.006543f, 0.031372f, -0.025539f, -0.035593f, 0.013350f, -0.024337f, 0.002397f, 0.003245f, + 0.000762f, -0.023409f, -0.014121f, -0.030416f, 0.010460f, -0.003153f, -0.001607f, -0.004784f, -0.013434f, -0.006175f, -0.010177f, -0.005163f, -0.003913f, 0.011467f, -0.008792f, 0.008782f, 0.003296f, 0.009070f, 0.001595f, 0.001083f, -0.012315f, -0.004618f, 0.003414f, -0.004087f, -0.013449f, 0.002558f, -0.002139f, -0.005374f, -0.004704f, 0.004193f, -0.005379f, 0.005697f, -0.003064f, 0.006939f, -0.001313f, 0.003482f, -0.007005f, -0.007023f, -0.000192f, 0.000413f, -0.002476f, 0.010528f, -0.009271f, -0.008972f, -0.005803f, 0.005045f, 0.005625f, -0.007296f, 0.005441f, 0.001505f, -0.019291f, 0.010700f, 0.001109f, 0.026351f, 0.027674f, 0.039907f, 0.018248f, 0.008481f, 0.005575f, 0.013173f, -0.013521f, 0.015229f, -0.024001f, 0.011735f, -0.002313f, -0.002009f, -0.046044f, -0.017802f, -0.007519f, 0.015727f, -0.001922f, 0.003841f, 0.005046f, 0.004215f, -0.023505f, 0.024408f, -0.000869f, 0.009958f, 0.000865f, 0.022785f, -0.024387f, 0.017028f, -0.011959f, -0.000546f, 0.018489f, -0.020889f, -0.009293f, -0.022766f, -0.009017f, -0.025355f, 0.023192f, 0.017042f, 0.031136f, -0.001485f, 0.007415f, -0.028263f, + 0.006509f, -0.029301f, 0.028577f, 0.008110f, -0.004571f, 0.027049f, 0.027620f, 0.014128f, -0.016357f, -0.024470f, -0.035245f, -0.001521f, -0.012437f, -0.017751f, 0.019227f, -0.005228f, 0.044682f, -0.033006f, -0.011988f, 0.025556f, -0.026543f, -0.010532f, 0.006198f, 0.000516f, -0.003815f, -0.025495f, 0.011728f, 0.004392f, -0.013831f, 0.012692f, 0.026960f, -0.023065f, 0.026025f, 0.032375f, -0.009613f, -0.017064f, 0.013381f, -0.013083f, 0.012369f, 0.007923f, -0.013465f, -0.010480f, -0.002617f, -0.004152f, 0.019025f, 0.006455f, -0.003149f, -0.009142f, -0.014980f, -0.008449f, 0.004836f, -0.009564f, 0.004683f, 0.009196f, 0.005930f, -0.006408f, 0.005030f, -0.005231f, 0.007310f, 0.004773f, 0.008148f, 0.004960f, 0.000457f, -0.008423f, 0.005644f, 0.008552f, -0.008484f, 0.000424f, 0.003050f, 0.003235f, 0.007409f, 0.000747f, -0.000854f, 0.008149f, 0.010004f, 0.002021f, -0.004426f, -0.007650f, -0.000091f, 0.006955f, 0.008452f, 0.005785f, 0.041565f, -0.009516f, 0.005900f, -0.002249f, -0.013641f, 0.018600f, -0.006774f, 0.006879f, 0.002281f, 0.026661f, -0.008348f, 0.031096f, 0.000572f, 0.015477f, + 0.013806f, -0.002461f, -0.010029f, -0.030303f, 0.014446f, 0.031542f, 0.001718f, -0.000210f, 0.021954f, 0.018575f, -0.001279f, 0.003438f, 0.037617f, 0.023537f, -0.006733f, 0.008193f, 0.024760f, -0.006205f, -0.027271f, 0.000674f, -0.019780f, -0.003107f, -0.012510f, 0.001186f, -0.037743f, -0.011267f, -0.013701f, 0.000670f, 0.007997f, 0.007995f, 0.036874f, 0.040691f, 0.021530f, -0.028094f, -0.016504f, 0.022889f, 0.032155f, 0.006820f, -0.029187f, -0.004772f, -0.006839f, -0.030496f, -0.019185f, -0.023078f, 0.028366f, -0.010516f, 0.003982f, -0.028696f, 0.041933f, 0.030920f, -0.003358f, 0.012818f, 0.069538f, -0.003452f, -0.014114f, -0.026626f, -0.001497f, 0.018515f, 0.014732f, -0.010675f, 0.021053f, 0.041612f, -0.017673f, 0.026570f, -0.011943f, 0.008751f, -0.016548f, -0.008975f, -0.014258f, -0.018769f, -0.009558f, 0.012425f, 0.000087f, -0.004059f, 0.003147f, 0.005209f, 0.022547f, -0.002397f, 0.002374f, -0.000176f, -0.010216f, -0.001033f, -0.003561f, 0.002167f, 0.009209f, -0.005779f, -0.002638f, -0.007181f, -0.003307f, 0.002642f, 0.002906f, -0.002534f, -0.014652f, -0.013719f, -0.004589f, -0.016916f, + -0.014716f, -0.002602f, 0.013347f, 0.011785f, 0.010238f, 0.002371f, -0.002179f, 0.000711f, 0.005778f, 0.004813f, -0.001673f, 0.003352f, 0.002481f, 0.021384f, 0.002188f, -0.012845f, 0.012706f, 0.004915f, -0.017776f, -0.030095f, 0.039070f, -0.024542f, 0.029490f, -0.021572f, -0.032066f, 0.001469f, 0.040473f, 0.025883f, -0.029775f, -0.020060f, 0.006985f, 0.005854f, 0.013748f, -0.002455f, 0.027022f, 0.014253f, 0.035581f, -0.013041f, -0.005858f, -0.001353f, -0.006786f, -0.034299f, -0.025126f, -0.007996f, 0.035777f, 0.007330f, 0.002892f, 0.001109f, -0.033168f, -0.037964f, -0.029179f, 0.015025f, 0.017372f, -0.013047f, -0.008453f, 0.003212f, 0.004198f, -0.020289f, 0.005913f, 0.037544f, 0.006697f, 0.023484f, 0.023273f, 0.016564f, 0.040496f, 0.057901f, 0.019143f, 0.000916f, 0.008448f, 0.022811f, -0.012007f, -0.006529f, 0.015504f, -0.005312f, 0.008338f, -0.005444f, 0.025144f, 0.008799f, 0.017839f, -0.005007f, -0.006567f, 0.012649f, 0.033565f, -0.002510f, -0.027339f, 0.017492f, -0.042840f, -0.049875f, -0.016958f, 0.025702f, -0.016539f, -0.049318f, -0.030021f, -0.012591f, 0.018080f, 0.012228f, + -0.026545f, 0.047752f, -0.015274f, -0.033561f, 0.008842f, 0.013037f, -0.010932f, 0.016571f, -0.017203f, -0.006844f, 0.006282f, 0.004457f, -0.009006f, 0.008416f, 0.001669f, 0.015056f, -0.008280f, -0.018062f, -0.010436f, 0.002991f, -0.003931f, -0.003665f, -0.001382f, 0.000116f, -0.001406f, 0.012231f, -0.002061f, 0.002028f, -0.004921f, 0.005643f, 0.010146f, 0.001977f, 0.009726f, 0.003021f, -0.015042f, -0.006648f, 0.000086f, -0.013008f, -0.015369f, 0.007433f, 0.010838f, -0.008413f, -0.016401f, -0.018017f, 0.007396f, 0.003049f, -0.000784f, 0.011703f, -0.006752f, 0.004289f, 0.016003f, -0.069788f, 0.004032f, 0.034910f, -0.006224f, -0.008569f, 0.043019f, -0.023237f, -0.023426f, -0.030504f, -0.009765f, -0.010522f, -0.019880f, 0.005639f, 0.010029f, 0.016149f, 0.011867f, -0.009990f, -0.007402f, -0.003744f, -0.008327f, 0.002523f, 0.008258f, 0.034462f, -0.014722f, -0.045440f, 0.024300f, -0.000164f, -0.001146f, -0.037861f, 0.016897f, 0.006918f, -0.003714f, 0.042353f, -0.012067f, 0.004275f, -0.003802f, 0.018465f, 0.022877f, -0.025375f, -0.002315f, -0.014407f, -0.001492f, 0.012392f, -0.009323f, 0.019178f, + -0.030387f, -0.025872f, -0.015995f, -0.027619f, -0.004615f, 0.002072f, 0.004336f, -0.038477f, -0.024913f, 0.017712f, 0.030813f, -0.014995f, -0.017071f, 0.015725f, -0.034741f, -0.032006f, -0.030477f, 0.033169f, -0.056613f, 0.017979f, -0.002982f, -0.033892f, -0.010604f, 0.027793f, 0.072144f, -0.010114f, -0.019853f, 0.023299f, 0.055322f, 0.019391f, -0.012433f, -0.013878f, -0.002501f, 0.014656f, -0.001012f, 0.006577f, 0.032930f, 0.001671f, -0.012290f, -0.023744f, 0.019294f, -0.027928f, -0.018702f, -0.014167f, 0.009695f, -0.011830f, -0.019871f, -0.013105f, -0.012094f, -0.000707f, -0.014665f, 0.004490f, -0.011370f, -0.001566f, -0.003734f, 0.013398f, -0.010570f, -0.008862f, -0.021650f, -0.007026f, -0.003866f, -0.007874f, 0.020528f, -0.015748f, -0.019471f, -0.001846f, -0.017093f, -0.016215f, -0.007165f, 0.001699f, 0.015374f, -0.002639f, -0.006620f, -0.003597f, -0.010232f, 0.006569f, -0.020612f, -0.002415f, 0.021240f, 0.009480f, 0.013887f, -0.006017f, 0.005247f, 0.006170f, -0.005147f, -0.008736f, -0.011646f, 0.003481f, 0.005473f, 0.008674f, 0.009647f, -0.004069f, -0.039169f, -0.062263f, -0.003723f, 0.071581f, + -0.011546f, -0.005031f, -0.047366f, -0.003481f, -0.003262f, 0.005012f, 0.015532f, 0.002244f, 0.012896f, 0.001027f, -0.000882f, -0.033580f, 0.004690f, 0.030744f, -0.020800f, 0.038109f, -0.016128f, -0.002247f, -0.033804f, 0.021695f, -0.016895f, -0.010794f, -0.038991f, -0.052594f, 0.026817f, -0.025609f, -0.025441f, 0.009374f, 0.005300f, -0.011221f, 0.002481f, 0.029985f, -0.008967f, -0.028342f, -0.017801f, -0.036327f, -0.004583f, 0.010583f, 0.025138f, 0.005339f, -0.007550f, -0.006085f, -0.015224f, 0.008925f, 0.026119f, 0.004523f, -0.016534f, 0.030028f, -0.028694f, 0.003258f, -0.049364f, -0.014306f, -0.009764f, 0.060916f, -0.038487f, 0.012618f, -0.012578f, 0.008196f, -0.007183f, -0.006553f, 0.001065f, 0.024924f, 0.007380f, -0.044562f, 0.049156f, 0.015297f, 0.017491f, 0.006616f, -0.019731f, -0.014747f, -0.005718f, 0.006487f, -0.001182f, 0.010103f, -0.026724f, -0.027486f, -0.004608f, 0.013794f, 0.029861f, -0.018270f, 0.025322f, -0.005974f, 0.009834f, -0.019790f, 0.011380f, -0.032426f, 0.036540f, 0.001879f, 0.004031f, 0.012288f, 0.016463f, 0.001881f, -0.022872f, -0.010743f, 0.006126f, -0.021385f, + 0.005851f, 0.010461f, 0.009130f, -0.012604f, -0.008022f, 0.022211f, 0.003993f, -0.021982f, -0.003224f, 0.019302f, -0.007177f, -0.027105f, 0.031008f, -0.008144f, 0.011983f, -0.004951f, -0.008906f, -0.014311f, 0.009537f, 0.002923f, 0.009926f, 0.001792f, 0.016666f, 0.002269f, 0.011990f, -0.005519f, 0.000830f, 0.007797f, -0.004222f, -0.006292f, -0.030474f, -0.018478f, 0.066662f, -0.008461f, 0.006028f, -0.034653f, 0.031390f, -0.018043f, 0.023253f, -0.018204f, 0.040484f, 0.003826f, 0.004607f, -0.019578f, -0.015358f, 0.023146f, 0.052319f, -0.021690f, -0.031013f, 0.014766f, -0.011877f, 0.034046f, 0.043697f, 0.021189f, -0.005923f, 0.026616f, -0.017170f, -0.016559f, 0.036808f, 0.049844f, -0.055273f, 0.004538f, 0.008905f, 0.009427f, -0.018322f, -0.001340f, 0.023128f, -0.056463f, 0.017545f, 0.032971f, 0.012998f, -0.025122f, -0.006357f, 0.040495f, 0.033766f, 0.011027f, -0.018475f, -0.024900f, -0.048257f, 0.069694f, 0.013216f, 0.035839f, -0.004613f, -0.014829f, 0.008409f, 0.020871f, 0.001263f, -0.001107f, -0.056168f, 0.008815f, 0.054166f, -0.009546f, 0.051933f, -0.030765f, -0.013214f, -0.021442f, + 0.012586f, 0.048310f, -0.014591f, -0.001361f, 0.044291f, 0.053368f, -0.016775f, -0.038930f, -0.034142f, -0.030263f, -0.013488f, -0.012753f, 0.031311f, -0.037511f, 0.021095f, 0.023195f, -0.007904f, 0.002719f, 0.024681f, -0.004586f, -0.013220f, 0.014538f, 0.010859f, 0.007790f, 0.022749f, 0.004944f, -0.003334f, 0.020120f, 0.007770f, 0.008562f, 0.010771f, -0.003356f, 0.001811f, -0.004471f, 0.009277f, -0.036738f, -0.009643f, 0.001655f, -0.006602f, 0.014455f, -0.027087f, -0.003027f, 0.000903f, 0.009923f, -0.000105f, 0.015710f, 0.011415f, -0.007335f, 0.022674f, 0.011400f, -0.007146f, 0.016085f, 0.017845f, 0.000290f, -0.010624f, 0.008546f, 0.017386f, 0.010349f, -0.001962f, -0.016114f, -0.007349f, 0.004385f, 0.003114f, 0.002743f, -0.015054f, 0.026346f, 0.019434f, 0.046527f, -0.014026f, 0.033708f, -0.017774f, -0.007097f, 0.031403f, -0.001025f, 0.042790f, -0.051493f, 0.032394f, 0.005944f, 0.014458f, -0.020662f, 0.015760f, 0.038529f, 0.074907f, -0.017119f, 0.019140f, -0.000946f, -0.049457f, 0.045600f, 0.004771f, 0.017904f, -0.008894f, -0.023095f, -0.008449f, -0.001764f, -0.019062f, -0.011957f, + 0.063681f, 0.004593f, 0.024620f, -0.018007f, 0.045212f, 0.000417f, 0.022052f, 0.009399f, -0.026093f, -0.005432f, -0.015999f, 0.000674f, 0.008379f, 0.053395f, 0.027329f, 0.002447f, 0.006573f, -0.001678f, -0.004153f, 0.008935f, 0.005579f, 0.033539f, 0.027404f, 0.013882f, -0.015569f, 0.023367f, 0.048943f, -0.045724f, 0.042938f, 0.007077f, 0.013118f, -0.045942f, -0.021635f, -0.057784f, -0.046524f, -0.009007f, 0.031526f, 0.026285f, -0.080132f, -0.000357f, -0.035974f, 0.019294f, 0.080601f, 0.040533f, -0.051341f, 0.028468f, -0.020939f, -0.026412f, 0.044555f, 0.022585f, -0.022429f, -0.012446f, 0.039254f, 0.032116f, 0.017754f, 0.049767f, -0.013038f, 0.030617f, 0.027070f, -0.031357f, 0.044556f, 0.012373f, 0.051666f, 0.015876f, -0.004437f, 0.030466f, -0.002812f, 0.008120f, -0.035736f, 0.027375f, -0.017253f, 0.014369f, -0.012745f, 0.006484f, 0.017068f, 0.041148f, 0.011058f, 0.025114f, 0.006625f, 0.008199f, -0.013097f, -0.002775f, -0.004466f, 0.003607f, 0.020862f, 0.017801f, 0.031200f, 0.011683f, -0.003379f, 0.005210f, -0.006900f, -0.003786f, -0.030668f, -0.004929f, 0.008056f, 0.010102f, + 0.026960f, 0.024040f, 0.021851f, 0.025206f, -0.066612f, -0.104618f, -0.026252f, -0.012582f, -0.024801f, 0.004865f, 0.035813f, -0.037451f, 0.053611f, 0.018432f, -0.075284f, -0.059269f, -0.010898f, 0.040754f, 0.002308f, 0.002627f, -0.007156f, -0.024971f, -0.072849f, 0.002189f, -0.061075f, -0.052103f, 0.025945f, 0.019127f, 0.018998f, -0.009483f, -0.023193f, 0.055006f, 0.034267f, -0.024488f, -0.047458f, 0.036062f, 0.019438f, 0.007900f, -0.021898f, -0.057292f, 0.022302f, -0.027296f, 0.009291f, -0.048896f, 0.059333f, 0.000715f, -0.022635f, 0.004984f, 0.015536f, 0.047555f, 0.030981f, -0.013070f, -0.001613f, 0.016211f, 0.017526f, 0.017918f, -0.010191f, -0.076175f, -0.058582f, 0.011351f, -0.007377f, 0.043547f, -0.007682f, -0.019598f, -0.052480f, 0.061262f, 0.024540f, -0.043735f, -0.043706f, 0.062883f, 0.060294f, -0.001210f, 0.044443f, -0.006405f, 0.002294f, -0.018602f, -0.010177f, -0.034647f, 0.042865f, -0.008315f, -0.008759f, -0.018745f, 0.018142f, -0.054163f, 0.026108f, -0.016204f, -0.009301f, 0.037635f, -0.000045f, 0.005562f, 0.010363f, 0.034537f, 0.018681f, -0.014710f, 0.026761f, -0.008167f, + 0.032147f, 0.011982f, -0.034420f, 0.008358f, -0.017086f, 0.016337f, -0.013709f, 0.000001f, -0.022585f, -0.012368f, 0.013677f, -0.023493f, 0.010677f, 0.007609f, 0.010953f, -0.021003f, -0.013969f, -0.026925f, -0.022485f, 0.030799f, -0.010343f, 0.019805f, 0.013498f, -0.019275f, -0.001802f, -0.016868f, 0.001572f, -0.010763f, 0.040205f, 0.032950f, 0.023370f, 0.030788f, -0.006671f, -0.034515f, -0.038412f, -0.005761f, 0.012871f, 0.057170f, 0.035957f, -0.013293f, -0.009712f, -0.015476f, -0.027522f, -0.001779f, 0.013973f, 0.019865f, 0.013591f, 0.006366f, 0.035799f, 0.004147f, -0.026216f, -0.065289f, 0.103293f, 0.003204f, -0.080917f, -0.005493f, -0.030481f, 0.014177f, 0.039293f, 0.036801f, -0.045267f, -0.071135f, 0.011686f, -0.033735f, 0.010376f, -0.006397f, 0.031063f, -0.009783f, 0.003963f, 0.019391f, -0.029863f, -0.035329f, 0.003239f, 0.010038f, 0.030757f, -0.000110f, -0.050654f, 0.033564f, -0.028496f, 0.026511f, -0.024838f, -0.015919f, -0.003285f, -0.007334f, -0.054410f, 0.010738f, 0.014501f, -0.051454f, 0.021482f, -0.019843f, 0.009888f, -0.016751f, 0.049770f, 0.039804f, -0.051273f, -0.026297f, + 0.034111f, 0.044052f, -0.052451f, 0.069170f, 0.003910f, 0.055822f, 0.039560f, 0.065761f, -0.020677f, -0.026994f, 0.014091f, -0.053390f, 0.007723f, 0.007478f, 0.094354f, -0.028766f, -0.089718f, 0.151224f, -0.071667f, -0.054067f, 0.086285f, 0.039871f, -0.051173f, 0.085014f, 0.008866f, -0.068039f, 0.084924f, 0.010984f, 0.007131f, -0.014264f, 0.012035f, 0.057371f, -0.014388f, -0.019098f, -0.030036f, 0.042892f, -0.015896f, -0.010152f, -0.006453f, -0.016374f, -0.018724f, -0.025811f, 0.024823f, -0.003125f, -0.002892f, -0.008941f, -0.007057f, 0.003849f, -0.011960f, -0.019241f, 0.002003f, -0.015452f, -0.030357f, -0.030402f, 0.038038f, -0.016142f, 0.003052f, 0.036224f, -0.017669f, -0.015713f, 0.001974f, 0.018267f, 0.007065f, 0.008120f, 0.033712f, -0.020555f, 0.004417f, -0.015000f, -0.010265f, -0.006283f, 0.056110f, 0.028692f, -0.009744f, 0.008627f, -0.030560f, 0.010189f, -0.028013f, -0.016503f, 0.012752f, -0.006717f, -0.057246f, 0.035512f, 0.013757f, -0.009991f, -0.000720f, -0.028586f, -0.004431f, 0.000957f, -0.093476f, 0.012913f, 0.028043f, -0.070188f, 0.032124f, 0.018527f, -0.024583f, -0.007046f, + -0.001219f, -0.017241f, -0.005634f, -0.010125f, -0.031268f, 0.000824f, -0.015596f, -0.003501f, -0.007679f, 0.015173f, 0.055868f, 0.046704f, -0.043111f, -0.004833f, 0.058785f, -0.010376f, -0.011045f, -0.060218f, 0.006944f, 0.019656f, -0.009845f, 0.051154f, 0.122842f, -0.041426f, -0.051790f, 0.087363f, -0.005858f, -0.047273f, 0.054559f, 0.035818f, -0.028338f, -0.042489f, -0.052394f, 0.015840f, 0.028058f, -0.023460f, 0.082380f, 0.053634f, -0.102841f, -0.098793f, 0.057467f, -0.046581f, -0.060181f, 0.077841f, 0.012497f, 0.104249f, 0.050051f, -0.012835f, -0.014114f, -0.075516f, -0.058826f, 0.171314f, 0.047268f, -0.036986f, -0.083082f, 0.002114f, -0.033913f, -0.074328f, -0.011660f, 0.086622f, 0.036822f, 0.000886f, 0.071355f, 0.062259f, -0.019938f, -0.079814f, 0.012200f, 0.047471f, -0.019907f, -0.018857f, 0.099454f, 0.057022f, 0.009733f, -0.010724f, -0.051396f, -0.050478f, -0.013149f, 0.047157f, 0.018925f, -0.019546f, -0.009338f, -0.022585f, 0.018443f, -0.014631f, -0.019420f, -0.012679f, -0.002614f, 0.013944f, 0.018925f, 0.016703f, 0.006866f, -0.045888f, -0.016199f, -0.009248f, 0.016906f, -0.018044f, + 0.002849f, -0.005044f, 0.041592f, -0.027373f, -0.019125f, 0.042936f, 0.011754f, -0.022238f, 0.033760f, -0.012240f, 0.009615f, 0.002345f, 0.007407f, -0.026482f, -0.007434f, 0.035243f, 0.034501f, 0.014119f, -0.014231f, 0.008954f, -0.016293f, -0.013173f, -0.010192f, 0.018299f, -0.029657f, -0.006548f, 0.022756f, 0.092068f, 0.078359f, -0.021631f, 0.055955f, 0.004768f, -0.041786f, 0.026446f, 0.047927f, 0.014793f, 0.021252f, -0.062465f, -0.011608f, 0.006304f, 0.013376f, -0.009974f, -0.052609f, -0.020194f, 0.020217f, -0.013949f, -0.004779f, -0.046204f, 0.070427f, 0.007790f, -0.056467f, 0.031578f, 0.082518f, -0.043042f, -0.023666f, 0.011027f, 0.027799f, -0.027247f, -0.050536f, 0.043172f, 0.075104f, -0.006870f, -0.028344f, 0.008721f, 0.021866f, 0.032897f, 0.048406f, 0.002205f, 0.087421f, -0.002867f, -0.095605f, -0.000180f, -0.010036f, 0.030519f, -0.009276f, -0.079680f, -0.001364f, -0.034953f, -0.032401f, 0.046318f, 0.025661f, 0.026006f, 0.034763f, -0.071529f, -0.036104f, -0.013357f, -0.000138f, 0.027527f, 0.001801f, -0.015401f, 0.002791f, -0.025141f, -0.047294f, 0.003679f, 0.075610f, -0.039451f, + 0.007931f, -0.030885f, -0.020592f, 0.050153f, -0.062119f, -0.001714f, 0.028452f, -0.023276f, 0.011128f, 0.006822f, 0.016462f, 0.017100f, -0.032436f, -0.040858f, 0.067772f, -0.014978f, -0.020933f, 0.033440f, -0.033584f, 0.020464f, 0.005098f, -0.015214f, 0.011337f, 0.027894f, -0.004725f, 0.002812f, -0.013505f, 0.005856f, 0.002589f, -0.003053f, -0.011978f, 0.014698f, 0.008699f, -0.002745f, -0.000584f, 0.012119f, 0.011812f, -0.013546f, -0.021514f, 0.010990f, -0.000584f, 0.004994f, 0.002052f, -0.007005f, 0.012246f, -0.000921f, 0.010288f, -0.004951f, -0.001057f, -0.007753f, 0.002561f, 0.009467f, -0.001660f, 0.025523f, -0.010151f, -0.009477f, 0.001973f, -0.013047f, 0.008202f, 0.016654f, -0.080944f, -0.115064f, -0.102572f, 0.205862f, 0.195664f, 0.196132f, 0.552096f, 0.196716f, -0.023213f, 0.036763f, -0.382523f, -0.464992f, -0.156824f, -0.260753f, -0.362363f, 0.046913f, -0.020562f, -0.060191f, 0.398069f, 0.243632f, 0.101134f, 0.622745f, 0.293352f, 0.054676f, 0.283287f, -0.066966f, -0.339116f, -0.323954f, -0.309444f, -0.427825f, -0.419695f, -0.098129f, -0.151817f, -0.246514f, 0.287721f, 0.133032f, + -0.104301f, 0.416528f, 0.133944f, -0.048594f, 0.470115f, 0.429063f, 0.098263f, 0.445240f, 0.450979f, -0.017055f, 0.111597f, 0.051367f, -0.435066f, -0.504189f, -0.376211f, -0.709897f, -0.673064f, -0.403676f, -0.539981f, -0.405564f, 0.045437f, 0.333834f, 0.378018f, 0.813728f, 0.739090f, 0.652436f, 0.702156f, 0.518534f, 0.262595f, 0.080561f, -0.057601f, -0.395771f, -0.477979f, -0.510843f, -0.576535f, -0.546255f, -0.466408f, -0.300845f, -0.219311f, -0.213687f, 0.040207f, 0.129775f, 0.253937f, 0.605567f, 0.628087f, 0.430040f, 0.536680f, 0.227312f, -0.074873f, -0.177831f, -0.276314f, -0.377662f, -0.274295f, -0.182885f, -0.182830f, -0.062724f, -0.017867f, 0.001564f, 0.096162f, 0.123147f, 0.116542f, 0.179722f, 0.112372f, 0.073199f, 0.089846f, -0.053619f, -0.050405f, 0.015222f, -0.146564f, -0.103186f, -0.038854f, -0.140850f, -0.087843f, -0.009880f, -0.142627f, -0.149792f, -0.100345f, -0.147017f, -0.097409f, 0.110381f, 0.205637f, 0.328545f, 0.483885f, 0.452357f, 0.386246f, 0.363853f, 0.195762f, -0.060541f, -0.304240f, -0.536754f, -0.638208f, -0.574856f, -0.466431f, -0.351625f, -0.166212f, 0.051992f, + 0.206652f, 0.291473f, 0.313665f, 0.277567f, 0.246647f, 0.230173f, 0.231002f, 0.161003f, 0.074588f, 0.034070f, -0.022681f, -0.067989f, -0.062822f, -0.109956f, -0.119442f, -0.084848f, -0.065752f, -0.085113f, -0.083658f, -0.105773f, -0.122246f, -0.120958f, -0.105661f, -0.086342f, -0.029097f, 0.042867f, 0.098428f, 0.132050f, 0.169328f, 0.167420f, 0.139304f, 0.099769f, 0.060177f, 0.022582f, 0.017334f, 0.002145f, -0.022542f, -0.041013f, -0.046359f, -0.060688f, -0.068430f, -0.075706f, -0.082217f, -0.086282f, -0.059279f, -0.033349f, -0.010640f, -0.000256f, 0.012583f, 0.023326f, 0.041188f, 0.042213f, 0.029437f, 0.013334f, 0.021995f, 0.032618f, 0.034213f, 0.031990f, 0.030640f, 0.026780f, 0.030701f, 0.027645f, 0.014467f, -0.003080f, -0.012952f, -0.033620f, -0.041303f, -0.044392f, -0.046445f, -0.052529f, -0.046441f, -0.048376f, -0.043988f, -0.026937f, -0.003737f, 0.018547f, 0.048618f, 0.067841f, 0.080046f, 0.076010f, 0.058682f, 0.027101f, -0.000405f, -0.023818f, -0.032431f, -0.038471f, -0.033053f, -0.027039f, -0.017392f, -0.011599f, -0.005677f, -0.005047f, -0.000456f, 0.000877f, 0.004695f, 0.004194f, + 0.007037f, 0.004897f, 0.005897f, 0.003023f, 0.003121f, -0.000088f, 0.000571f, -0.001652f, 0.000218f, -0.001244f, 0.000740f, -0.000904f} + }, + { + {-0.006754f, 0.025660f, 0.013711f, 0.011272f, 0.006412f, -0.002808f, -0.000721f, -0.002716f, -0.005269f, -0.007511f, -0.005169f, -0.007672f, -0.003118f, 0.007158f, 0.002561f, -0.000450f, 0.000089f, 0.004670f, 0.002305f, -0.003069f, -0.003128f, -0.002499f, -0.013319f, 0.005497f, 0.001511f, 0.000066f, -0.002663f, 0.001680f, 0.000345f, -0.003771f, 0.002046f, 0.004853f, 0.000092f, -0.006186f, -0.001447f, -0.002705f, -0.002737f, 0.000701f, 0.006022f, -0.001582f, 0.001514f, -0.007068f, 0.004625f, -0.008718f, 0.005647f, 0.001176f, 0.000451f, 0.000021f, 0.005621f, -0.006700f, -0.004814f, -0.009113f, 0.002535f, 0.001589f, 0.000576f, 0.005137f, -0.005464f, 0.001170f, -0.000634f, 0.000112f, -0.003947f, 0.003558f, 0.001775f, -0.003041f, 0.005726f, -0.008950f, 0.004222f, -0.004898f, 0.009224f, 0.004109f, 0.001737f, 0.000621f, -0.001678f, -0.011153f, 0.008614f, -0.002696f, -0.000138f, 0.001430f, 0.002507f, 0.001998f, 0.002382f, 0.002659f, -0.000668f, 0.000759f, -0.001097f, 0.002598f, -0.000051f, 0.001471f, -0.003232f, 0.001131f, -0.000386f, 0.000718f, 0.001493f, 0.003608f, -0.000061f, -0.000634f, + 0.001371f, 0.001420f, -0.001322f, 0.001861f, -0.002069f, 0.001819f, 0.000538f, 0.001619f, 0.000274f, 0.001044f, -0.000428f, 0.000408f, 0.001573f, 0.000698f, -0.000087f, 0.001078f, -0.000085f, 0.000723f, 0.000783f, -0.000094f, 0.001022f, -0.000290f, 0.024748f, 0.011575f, 0.016208f, 0.004255f, 0.005610f, -0.001078f, 0.006433f, 0.000516f, 0.005734f, -0.004262f, 0.011040f, -0.002907f, -0.012298f, -0.003555f, 0.000403f, 0.000542f, -0.003805f, 0.009403f, 0.000675f, 0.003588f, 0.009370f, 0.004374f, 0.000253f, -0.000152f, 0.002345f, -0.008553f, -0.005419f, 0.003206f, 0.004161f, -0.003200f, 0.001025f, 0.003977f, -0.008199f, 0.011633f, -0.001061f, 0.001598f, -0.001721f, 0.004235f, 0.006218f, 0.000169f, -0.006235f, -0.006646f, 0.012915f, 0.000150f, -0.003586f, -0.000676f, 0.007501f, 0.005302f, -0.003654f, -0.005261f, -0.011117f, -0.003633f, -0.004474f, 0.000333f, -0.004027f, 0.000870f, -0.010797f, -0.004608f, 0.001415f, -0.004596f, 0.002553f, 0.004278f, -0.002073f, -0.000430f, 0.002218f, -0.002916f, 0.004455f, -0.000452f, 0.005567f, -0.000068f, -0.001719f, -0.006430f, 0.000859f, -0.007944f, + 0.002603f, 0.000009f, 0.004569f, -0.000053f, 0.004688f, 0.005718f, 0.005133f, 0.000058f, -0.003090f, -0.000379f, -0.001036f, 0.006327f, -0.001593f, 0.000697f, 0.004279f, 0.004190f, -0.000152f, 0.002306f, 0.001022f, 0.002096f, -0.000761f, 0.002566f, -0.000870f, 0.003845f, 0.001061f, 0.000632f, -0.000176f, 0.000228f, 0.000556f, 0.001870f, 0.005177f, -0.016582f, -0.005379f, -0.003773f, 0.002869f, 0.003279f, -0.011366f, -0.005085f, -0.002268f, 0.002724f, 0.006014f, 0.001899f, 0.008252f, -0.006827f, -0.009887f, 0.002858f, 0.000316f, -0.001773f, -0.006779f, 0.021925f, -0.001162f, 0.005832f, 0.001291f, 0.000682f, -0.000512f, -0.003380f, -0.008355f, -0.006546f, -0.002068f, 0.005601f, -0.004676f, 0.011479f, -0.003907f, -0.001073f, -0.009429f, -0.011201f, -0.000985f, -0.007145f, -0.003992f, 0.015269f, -0.008368f, -0.002316f, -0.008125f, 0.002968f, 0.000366f, -0.002942f, -0.008537f, -0.001625f, 0.000050f, -0.009669f, 0.001119f, -0.005206f, 0.007713f, 0.005083f, -0.004473f, -0.002372f, -0.002482f, 0.002368f, -0.000443f, 0.006141f, -0.003198f, -0.004038f, -0.004166f, 0.013924f, 0.012556f, -0.004318f, + -0.012134f, 0.001641f, 0.003727f, -0.000390f, 0.003540f, -0.005033f, 0.000970f, -0.005837f, 0.004145f, 0.000317f, 0.013353f, 0.008245f, 0.012694f, -0.011578f, 0.004993f, 0.007747f, 0.000278f, 0.005879f, 0.004216f, 0.000875f, 0.008727f, -0.001610f, -0.000949f, 0.002239f, 0.001196f, -0.003594f, 0.003470f, -0.002754f, -0.002377f, -0.000249f, 0.000871f, -0.000394f, 0.001307f, -0.002058f, 0.001006f, -0.000264f, 0.000254f, 0.001132f, 0.001591f, 0.000767f, 0.001847f, 0.001748f, -0.001352f, -0.001763f, 0.001368f, 0.000511f, -0.003164f, -0.001286f, 0.002512f, -0.001543f, -0.054653f, -0.008753f, -0.015811f, -0.017757f, 0.004712f, -0.005957f, -0.015600f, -0.012778f, 0.002067f, -0.012589f, 0.001713f, 0.018966f, -0.004781f, 0.008184f, 0.006059f, 0.016003f, 0.004054f, -0.011019f, 0.002459f, 0.017385f, -0.008166f, 0.008691f, -0.012858f, -0.011569f, 0.003734f, 0.005038f, 0.013522f, 0.000870f, -0.008428f, 0.007970f, -0.005681f, 0.006132f, -0.000784f, 0.008655f, -0.007360f, -0.004654f, -0.008200f, 0.000173f, 0.001398f, -0.003115f, 0.006161f, -0.014265f, 0.001768f, 0.014518f, 0.003055f, -0.004035f, + 0.005491f, -0.007327f, -0.003822f, -0.018032f, -0.005436f, -0.000540f, 0.002757f, 0.000367f, 0.009647f, -0.014468f, 0.001337f, -0.001936f, 0.007244f, 0.003971f, -0.002884f, 0.010408f, -0.009153f, -0.001166f, -0.007360f, -0.013905f, -0.005955f, -0.003158f, -0.004021f, 0.010552f, -0.009475f, -0.015030f, 0.000521f, 0.004993f, -0.001585f, -0.004300f, 0.005114f, 0.005817f, -0.004293f, -0.003353f, -0.005937f, -0.002371f, 0.012067f, -0.005589f, 0.006621f, -0.001957f, -0.000284f, -0.001070f, -0.000480f, -0.006244f, 0.001469f, -0.003720f, -0.000253f, -0.000400f, -0.000979f, 0.000194f, -0.001521f, -0.001926f, -0.002005f, -0.000487f, 0.000542f, -0.001173f, 0.001944f, 0.000939f, -0.027188f, 0.015531f, 0.017415f, -0.000902f, 0.009761f, 0.004502f, 0.020583f, 0.027450f, 0.003494f, 0.003639f, 0.007839f, 0.003460f, 0.004535f, -0.003838f, 0.005404f, -0.004458f, 0.007184f, 0.008445f, -0.023488f, 0.012228f, -0.002589f, -0.004287f, -0.007276f, -0.009441f, 0.003824f, 0.006738f, 0.010675f, 0.002155f, 0.001807f, -0.013638f, 0.000588f, -0.003930f, -0.004590f, -0.001958f, 0.001822f, 0.000865f, -0.001060f, 0.013550f, + -0.000712f, -0.004396f, 0.004442f, -0.005160f, 0.006897f, 0.009183f, 0.010176f, 0.005371f, 0.001109f, -0.005590f, 0.011369f, 0.003694f, 0.001525f, 0.001272f, 0.001492f, 0.000903f, -0.006587f, -0.009190f, 0.008415f, -0.008560f, 0.008062f, 0.007445f, 0.005404f, -0.001111f, -0.006109f, 0.005594f, 0.007165f, 0.015978f, 0.007338f, 0.006082f, 0.003725f, -0.015467f, -0.004782f, 0.001992f, -0.002540f, 0.006773f, -0.013467f, 0.000758f, 0.004452f, -0.012521f, -0.001184f, 0.004308f, -0.003052f, 0.001696f, -0.007384f, 0.002868f, 0.000951f, -0.003072f, 0.005813f, 0.003499f, 0.000234f, 0.006453f, -0.002884f, -0.002728f, -0.000638f, 0.001406f, 0.002608f, 0.009743f, 0.001581f, 0.003382f, 0.002282f, -0.000002f, 0.002114f, -0.001506f, -0.001830f, -0.002509f, 0.001708f, -0.001339f, -0.001232f, 0.001177f, 0.001031f, -0.001093f, 0.003282f, -0.001828f, 0.002297f, 0.002201f, -0.000957f, 0.003265f, 0.000920f, 0.001444f, 0.001590f, 0.000305f, 0.000347f, 0.003781f, -0.000260f, 0.050460f, 0.015073f, 0.003836f, 0.009740f, 0.025284f, 0.010036f, 0.030465f, 0.007328f, -0.006579f, -0.002283f, -0.002429f, + -0.003002f, 0.008353f, 0.012905f, -0.005927f, 0.002692f, 0.009187f, -0.003472f, -0.012495f, 0.009924f, -0.001067f, 0.004667f, -0.004176f, -0.006428f, 0.010436f, 0.002310f, -0.000825f, -0.003029f, -0.011369f, -0.005776f, 0.006348f, 0.001471f, -0.003829f, -0.002105f, 0.001867f, 0.004240f, 0.011688f, 0.003569f, -0.010529f, -0.002529f, 0.000817f, -0.003429f, 0.003962f, 0.005403f, -0.010609f, -0.013042f, -0.000623f, 0.003176f, -0.001245f, 0.009946f, -0.018351f, -0.003994f, -0.008252f, -0.010469f, -0.001010f, -0.000870f, 0.002863f, 0.009836f, 0.000035f, 0.001429f, 0.003332f, -0.001659f, 0.013334f, 0.008367f, -0.010703f, -0.009562f, 0.007370f, 0.015938f, -0.001249f, -0.007534f, 0.015907f, 0.008290f, 0.003790f, -0.006984f, -0.007389f, 0.007749f, 0.000537f, 0.005852f, -0.003437f, -0.011498f, -0.006181f, -0.007838f, -0.004808f, 0.004485f, -0.006256f, 0.000842f, 0.002864f, -0.002334f, 0.002782f, 0.001891f, 0.002389f, 0.001295f, -0.004000f, 0.002264f, -0.001174f, -0.002206f, -0.000873f, 0.003057f, 0.002545f, 0.000385f, -0.003419f, 0.003134f, -0.001275f, 0.005431f, -0.000727f, 0.000732f, -0.005070f, + -0.006701f, 0.002352f, -0.006307f, -0.001098f, -0.000984f, -0.003434f, -0.001720f, 0.000889f, -0.005656f, -0.002235f, -0.000582f, 0.000746f, -0.001185f, 0.004096f, 0.000559f, -0.001389f, 0.024896f, 0.011811f, 0.022437f, -0.007695f, 0.000370f, -0.005848f, 0.022604f, -0.023249f, -0.003086f, 0.005717f, -0.004229f, -0.004755f, 0.007694f, -0.002780f, -0.006919f, 0.019478f, 0.011305f, 0.002077f, 0.033419f, -0.009268f, -0.002021f, -0.007222f, 0.000444f, 0.005300f, -0.008386f, -0.001291f, -0.004260f, 0.012494f, -0.010530f, 0.002667f, 0.000939f, -0.003557f, 0.001351f, 0.007267f, 0.005277f, -0.010276f, -0.017402f, 0.000228f, 0.003818f, 0.014384f, 0.017296f, 0.016834f, 0.001750f, -0.010000f, 0.012445f, -0.029891f, -0.004688f, -0.011854f, -0.017088f, 0.011908f, -0.003775f, -0.005786f, 0.009633f, -0.003610f, -0.004860f, 0.025735f, 0.000515f, -0.007836f, 0.009235f, 0.000509f, 0.007079f, 0.004875f, 0.003591f, 0.015518f, -0.009205f, -0.005964f, 0.001135f, -0.013670f, 0.000106f, 0.002364f, -0.003206f, 0.004438f, 0.007980f, 0.016325f, -0.006012f, 0.005320f, 0.014482f, 0.008474f, 0.004448f, 0.002506f, + -0.004691f, -0.010613f, 0.005559f, 0.007768f, -0.001510f, 0.000610f, -0.001423f, -0.001519f, -0.005709f, 0.000977f, -0.001590f, 0.000832f, -0.005314f, -0.002981f, 0.000251f, -0.001160f, 0.005371f, 0.002047f, 0.000257f, -0.007330f, -0.003001f, 0.003357f, -0.003929f, -0.000265f, 0.002992f, 0.002611f, -0.004581f, 0.004296f, 0.003744f, 0.000960f, 0.004870f, 0.003974f, -0.008023f, -0.001668f, -0.002935f, 0.002051f, 0.004727f, 0.005263f, -0.000890f, -0.003240f, 0.000964f, -0.001852f, -0.038540f, -0.057887f, -0.009779f, 0.002874f, -0.001025f, 0.001604f, -0.002733f, -0.011610f, -0.006568f, -0.009257f, -0.002519f, 0.009409f, 0.011200f, -0.010201f, -0.015070f, 0.012852f, 0.002629f, -0.008265f, 0.000634f, -0.001381f, -0.009210f, -0.007703f, 0.021314f, 0.010858f, -0.011528f, 0.005822f, 0.002369f, 0.009123f, -0.011190f, 0.012385f, -0.012443f, 0.008505f, 0.005515f, -0.002642f, -0.005838f, 0.005484f, -0.023162f, -0.011489f, 0.014089f, 0.022767f, 0.012584f, -0.015979f, 0.000306f, -0.011340f, 0.015084f, 0.003104f, 0.003857f, 0.001045f, -0.012567f, 0.006031f, 0.018463f, 0.002059f, 0.013936f, 0.009889f, + 0.006336f, 0.010684f, 0.022658f, -0.006352f, -0.022990f, 0.011061f, -0.000028f, -0.005467f, 0.001071f, 0.019640f, -0.008141f, -0.013729f, 0.006610f, -0.003672f, -0.002435f, -0.005230f, -0.003183f, -0.006210f, -0.010815f, -0.005436f, 0.013087f, -0.018047f, -0.011403f, -0.006694f, -0.013039f, -0.012632f, -0.000870f, 0.007748f, -0.011971f, -0.000278f, -0.004506f, -0.005069f, -0.010802f, -0.006817f, -0.012388f, -0.000724f, -0.009555f, -0.000800f, -0.000359f, 0.008551f, 0.006007f, -0.004444f, -0.004800f, -0.006340f, -0.002019f, -0.004508f, -0.004359f, 0.005151f, -0.008479f, 0.003082f, 0.000606f, -0.005397f, 0.000463f, -0.003560f, 0.001902f, -0.001881f, -0.006953f, -0.008446f, -0.000191f, 0.002117f, 0.003358f, -0.001669f, 0.001359f, 0.002561f, -0.000115f, -0.004453f, -0.000708f, -0.005681f, 0.000469f, 0.002512f, 0.001919f, 0.002383f, -0.022093f, -0.014690f, 0.003942f, 0.003389f, 0.029876f, -0.026138f, -0.017582f, -0.010204f, -0.004728f, -0.003397f, 0.009785f, 0.009103f, -0.013565f, 0.013948f, -0.003093f, 0.006228f, -0.009719f, 0.020880f, -0.003914f, -0.008110f, 0.013792f, 0.009641f, 0.008099f, -0.014497f, + -0.013293f, 0.017648f, -0.009155f, 0.005085f, 0.004536f, -0.006632f, 0.015328f, 0.004438f, 0.000162f, 0.003197f, 0.011298f, 0.014104f, 0.004575f, -0.012858f, 0.003129f, -0.018277f, 0.010982f, 0.004558f, -0.020102f, 0.014214f, 0.003519f, -0.010706f, 0.018744f, 0.005747f, -0.004859f, 0.010674f, -0.001511f, 0.020353f, -0.004519f, -0.005290f, -0.004178f, -0.002839f, 0.026851f, 0.005484f, 0.000625f, 0.007112f, -0.022257f, -0.014154f, -0.015073f, 0.001525f, 0.014361f, 0.001747f, 0.017771f, -0.022902f, -0.009200f, -0.014583f, -0.013227f, 0.033072f, -0.003223f, 0.011731f, 0.008670f, -0.007257f, -0.001512f, -0.004755f, 0.002668f, 0.001623f, 0.009218f, 0.005404f, 0.018310f, -0.009916f, 0.001656f, -0.003228f, 0.004093f, -0.000249f, -0.000212f, -0.000177f, -0.003730f, -0.017267f, 0.006524f, 0.003881f, 0.002680f, -0.004675f, -0.001479f, -0.002322f, -0.009436f, -0.000730f, -0.003296f, -0.006340f, 0.003611f, -0.005368f, 0.002364f, 0.002945f, 0.002531f, 0.003813f, -0.006539f, -0.003742f, -0.004395f, -0.004216f, 0.002506f, 0.004647f, 0.002907f, -0.001689f, -0.000794f, -0.001298f, -0.001969f, 0.006807f, + -0.002279f, 0.004813f, 0.003178f, -0.001992f, 0.002176f, -0.001479f, 0.000093f, 0.001617f, 0.001941f, -0.030088f, 0.009404f, -0.012933f, 0.007333f, -0.009053f, 0.024305f, 0.004076f, -0.017015f, 0.002659f, -0.017347f, 0.014061f, 0.026861f, -0.022920f, 0.015131f, 0.005579f, -0.000668f, 0.011052f, 0.028629f, -0.010968f, -0.000027f, 0.008733f, -0.031254f, 0.001811f, 0.014220f, -0.008711f, 0.010192f, 0.011076f, -0.005702f, 0.028027f, -0.013981f, -0.025395f, -0.010914f, 0.003034f, 0.000678f, -0.005215f, -0.010941f, 0.007625f, 0.007082f, -0.000011f, -0.017866f, -0.004216f, -0.004527f, 0.011915f, -0.007825f, 0.047016f, -0.005916f, 0.006711f, -0.002164f, -0.002023f, -0.022824f, 0.002319f, 0.016928f, 0.013671f, 0.045878f, -0.004958f, -0.004441f, -0.009527f, -0.001810f, -0.012942f, -0.000979f, 0.018371f, -0.009796f, -0.001930f, 0.003331f, 0.004312f, 0.018086f, 0.014688f, 0.004161f, 0.035485f, -0.006720f, -0.032926f, -0.032933f, -0.023257f, -0.004786f, 0.010357f, -0.003252f, -0.008680f, 0.015664f, -0.000989f, 0.013908f, -0.008612f, -0.001636f, 0.011262f, 0.009581f, -0.003523f, -0.003371f, 0.001114f, + 0.002929f, -0.003695f, -0.007698f, -0.011095f, -0.003737f, -0.004740f, -0.001404f, -0.007925f, 0.005881f, -0.002415f, 0.001759f, -0.004037f, -0.005680f, 0.007546f, 0.003391f, -0.003928f, -0.001064f, -0.003230f, -0.003397f, 0.003261f, -0.002122f, -0.003813f, -0.007499f, 0.005857f, 0.002326f, -0.003270f, -0.005685f, -0.007592f, -0.001429f, -0.005240f, -0.005254f, 0.006302f, -0.003784f, 0.001205f, 0.000241f, -0.002804f, 0.002716f, 0.001181f, -0.001050f, -0.001468f, -0.001686f, 0.053432f, -0.038478f, -0.029321f, -0.009265f, -0.018542f, -0.021035f, 0.025908f, 0.010645f, 0.005167f, -0.008033f, -0.005205f, 0.031628f, -0.009157f, -0.013090f, -0.037673f, -0.005281f, -0.000907f, 0.017956f, 0.006597f, -0.007472f, 0.002367f, 0.015785f, 0.007106f, 0.009956f, 0.024185f, 0.030496f, 0.008471f, -0.011055f, 0.007881f, -0.017950f, 0.012557f, 0.010458f, -0.006408f, 0.000867f, -0.013984f, 0.005952f, 0.000492f, -0.027045f, 0.026740f, -0.002117f, -0.012263f, 0.016719f, -0.025136f, -0.005550f, 0.027947f, 0.016162f, -0.000202f, 0.001352f, -0.034846f, 0.012608f, 0.019728f, 0.011488f, 0.006678f, -0.001578f, -0.025649f, + -0.075577f, -0.005860f, 0.015836f, 0.021545f, -0.001581f, -0.022051f, 0.037888f, -0.017146f, 0.017509f, 0.028639f, 0.023800f, 0.004603f, 0.028718f, 0.003483f, 0.010511f, 0.006264f, 0.017610f, 0.003663f, 0.005894f, 0.036352f, -0.011640f, -0.007569f, 0.030949f, 0.016213f, 0.008739f, -0.012267f, 0.003543f, 0.025140f, -0.002204f, 0.020224f, 0.005065f, 0.004690f, 0.013021f, -0.006362f, -0.000095f, 0.001709f, -0.000782f, -0.005221f, 0.010289f, 0.004929f, -0.013022f, 0.007861f, 0.005622f, 0.007596f, 0.004103f, -0.003470f, 0.000559f, -0.003887f, -0.004389f, 0.006453f, 0.008228f, 0.003637f, 0.005227f, -0.003578f, -0.003336f, -0.002213f, -0.004233f, -0.005894f, -0.008934f, 0.001896f, -0.005499f, 0.005067f, -0.001610f, 0.003170f, -0.008177f, -0.005290f, -0.001204f, -0.002358f, -0.001952f, -0.003485f, 0.001815f, 0.009045f, 0.009548f, 0.003890f, 0.001399f, -0.004388f, 0.007712f, 0.027462f, 0.024701f, -0.005995f, -0.013757f, -0.001800f, -0.008412f, 0.029988f, 0.018296f, -0.050345f, -0.006319f, 0.004834f, -0.024674f, 0.010173f, -0.035661f, 0.027216f, 0.005715f, -0.003459f, 0.013798f, 0.007863f, + -0.008058f, -0.011092f, -0.009275f, 0.038154f, 0.000804f, 0.000346f, 0.007598f, -0.004444f, 0.014335f, 0.044832f, 0.017318f, -0.005829f, -0.008495f, -0.005871f, 0.024921f, 0.009721f, 0.025245f, 0.018551f, 0.012261f, 0.008082f, -0.011959f, -0.011812f, 0.010897f, -0.025638f, 0.003824f, -0.013338f, -0.012315f, 0.001490f, 0.017470f, 0.003138f, 0.000809f, 0.007090f, -0.006348f, 0.030912f, 0.038687f, 0.045593f, -0.000851f, 0.021128f, -0.027350f, 0.010903f, 0.014850f, -0.011669f, 0.022274f, -0.017743f, -0.037214f, 0.005439f, -0.019793f, -0.002293f, 0.001115f, -0.018869f, 0.004287f, 0.027171f, -0.016754f, -0.015193f, 0.012805f, 0.025213f, -0.001683f, -0.008492f, 0.022079f, 0.002588f, 0.004504f, -0.014993f, -0.003780f, -0.000497f, 0.018142f, -0.008914f, 0.000974f, -0.003823f, 0.003561f, 0.000207f, 0.003096f, 0.005308f, 0.002806f, 0.000592f, 0.001333f, 0.004637f, 0.004758f, -0.003708f, -0.008972f, -0.000975f, -0.001755f, -0.007322f, -0.010081f, -0.000195f, -0.004888f, 0.007407f, -0.006957f, 0.005752f, 0.008622f, -0.000117f, -0.015445f, -0.001108f, 0.002518f, -0.004848f, -0.007495f, 0.001445f, + 0.003768f, 0.023780f, 0.007410f, 0.007594f, -0.001094f, 0.000923f, -0.002380f, 0.007199f, -0.002020f, 0.007638f, 0.019257f, 0.018218f, -0.002635f, -0.000693f, -0.003672f, 0.001237f, 0.005743f, 0.007289f, 0.010098f, 0.002261f, -0.031790f, 0.057906f, 0.003690f, 0.015024f, 0.044327f, -0.016419f, 0.004548f, -0.008502f, 0.011698f, -0.012828f, 0.012798f, -0.031238f, -0.036966f, -0.001191f, -0.021893f, -0.001739f, -0.002041f, -0.002550f, -0.006249f, 0.002295f, -0.010256f, 0.009166f, -0.029401f, -0.011827f, -0.039666f, -0.002086f, 0.009086f, 0.018937f, 0.042815f, 0.023662f, 0.007389f, 0.005381f, 0.012281f, 0.009404f, 0.007206f, 0.017206f, 0.018107f, -0.005850f, -0.036261f, -0.036018f, -0.024667f, -0.014819f, 0.003562f, 0.012012f, -0.013314f, -0.021158f, -0.036804f, 0.000961f, -0.014093f, 0.033445f, -0.015017f, 0.008327f, -0.025569f, -0.012413f, -0.004537f, -0.010595f, -0.049362f, -0.051463f, 0.014009f, 0.005144f, 0.001253f, 0.026219f, 0.014943f, 0.021023f, 0.016947f, -0.032110f, -0.007056f, 0.059897f, -0.011216f, -0.022826f, 0.008718f, -0.013331f, 0.006023f, -0.037169f, 0.014895f, -0.017120f, + 0.002412f, -0.002564f, 0.024229f, 0.001315f, 0.009638f, -0.021206f, 0.003864f, -0.012016f, -0.005492f, -0.014591f, -0.011088f, 0.007425f, 0.008325f, -0.019404f, -0.006623f, 0.001262f, 0.003484f, 0.004659f, 0.002384f, -0.007608f, 0.008263f, 0.003341f, 0.002726f, -0.001140f, -0.000713f, 0.002513f, 0.008358f, -0.009306f, 0.008440f, -0.002432f, -0.000481f, -0.003405f, 0.005288f, -0.005534f, -0.003345f, 0.007441f, -0.014487f, -0.000435f, 0.002585f, -0.008849f, -0.003205f, -0.020181f, 0.014193f, 0.016857f, -0.001380f, 0.003864f, 0.004296f, 0.005648f, -0.009170f, 0.009326f, 0.005811f, 0.007247f, -0.006764f, 0.003889f, 0.005441f, 0.008594f, 0.034582f, 0.026027f, 0.003601f, 0.027666f, -0.005027f, -0.011497f, 0.015425f, -0.021358f, -0.041302f, -0.062131f, 0.005385f, 0.001206f, 0.024165f, 0.017416f, -0.022924f, -0.011932f, -0.060389f, -0.004169f, -0.028022f, 0.006486f, -0.014005f, -0.006875f, -0.011462f, -0.004588f, -0.004525f, -0.021139f, -0.009269f, -0.024619f, 0.019764f, -0.005020f, 0.016944f, 0.043309f, -0.022722f, 0.012394f, -0.003358f, -0.010872f, 0.011388f, -0.023318f, -0.039289f, 0.018864f, + 0.009486f, 0.018763f, 0.012006f, -0.082827f, -0.037346f, 0.010929f, -0.027328f, -0.002433f, -0.023317f, 0.034526f, 0.041917f, -0.002143f, 0.046313f, 0.006405f, 0.021156f, -0.006186f, -0.001311f, -0.025883f, 0.016548f, 0.033231f, 0.007439f, 0.055399f, 0.001529f, 0.007545f, -0.016077f, -0.024487f, 0.033066f, 0.051989f, 0.018398f, 0.010025f, 0.005352f, 0.019610f, 0.001921f, 0.003681f, -0.048520f, -0.035831f, -0.003482f, 0.002521f, 0.006681f, 0.036573f, 0.039635f, -0.007332f, 0.002810f, -0.013600f, 0.008428f, -0.025311f, 0.000866f, -0.026779f, -0.022413f, 0.011626f, -0.000440f, 0.002886f, -0.014808f, 0.009595f, 0.012018f, 0.007889f, 0.012167f, 0.014067f, 0.001441f, -0.008048f, 0.006408f, -0.010976f, -0.002455f, -0.006782f, -0.015823f, -0.004631f, -0.008657f, -0.007161f, 0.013521f, 0.007336f, -0.004532f, -0.010555f, -0.015674f, -0.010406f, 0.010924f, -0.010554f, -0.000839f, 0.000856f, 0.007538f, -0.014975f, -0.011770f, 0.005328f, 0.018808f, 0.011886f, 0.004983f, 0.000002f, -0.011004f, -0.001332f, -0.006620f, -0.012935f, 0.022348f, -0.032254f, -0.016180f, -0.060429f, -0.075732f, -0.055824f, + -0.025769f, 0.017316f, -0.000683f, -0.013101f, -0.027792f, 0.000243f, 0.049660f, 0.024596f, -0.043798f, -0.006994f, -0.009207f, -0.030634f, -0.005689f, 0.002458f, 0.020793f, 0.015638f, -0.032727f, 0.023559f, -0.018574f, 0.010104f, -0.017317f, 0.005364f, -0.025120f, -0.009139f, 0.012152f, -0.044857f, -0.008802f, -0.016804f, 0.014597f, -0.011035f, -0.041803f, 0.049124f, 0.047013f, 0.000812f, -0.019263f, 0.026836f, -0.063957f, -0.019810f, 0.018806f, -0.021292f, -0.013737f, -0.001482f, -0.020798f, 0.004249f, -0.005494f, -0.042587f, 0.018161f, -0.005289f, -0.013325f, -0.014467f, -0.011476f, -0.002519f, -0.011890f, -0.017971f, 0.035288f, -0.016735f, -0.016950f, 0.017024f, -0.000633f, 0.058358f, -0.011830f, -0.035936f, 0.020454f, -0.018697f, -0.016191f, -0.028007f, 0.019344f, 0.036045f, -0.070224f, 0.005640f, 0.058948f, -0.009478f, -0.003843f, -0.023253f, 0.040130f, -0.002713f, -0.022089f, -0.002780f, -0.020749f, -0.016380f, 0.029023f, -0.017408f, -0.001653f, -0.009605f, -0.012385f, -0.020367f, 0.008490f, 0.006981f, 0.010503f, -0.002318f, -0.016703f, -0.011212f, 0.000420f, 0.003022f, -0.025346f, -0.007092f, + -0.016371f, 0.025160f, -0.008554f, 0.001907f, 0.003379f, 0.003216f, 0.002473f, -0.020244f, 0.013555f, 0.000802f, -0.007964f, 0.018380f, 0.002640f, 0.024014f, -0.004424f, 0.027728f, 0.006215f, 0.011258f, 0.013335f, -0.017767f, -0.011980f, 0.008841f, -0.014897f, -0.011370f, 0.004177f, 0.000174f, -0.010528f, -0.024058f, 0.011620f, -0.003361f, -0.047757f, 0.095441f, 0.068151f, -0.001360f, -0.018180f, 0.015086f, -0.057233f, 0.000878f, 0.071280f, -0.012642f, -0.024761f, 0.001082f, 0.080772f, -0.011655f, 0.017734f, -0.017275f, -0.036528f, -0.029642f, -0.007478f, -0.013606f, 0.014873f, 0.020535f, 0.001108f, -0.030515f, -0.042574f, -0.039277f, -0.006343f, -0.008738f, -0.021138f, 0.019641f, 0.015980f, -0.017256f, -0.020910f, -0.022934f, 0.012791f, 0.004315f, 0.015726f, 0.040218f, -0.000275f, -0.034609f, 0.023375f, 0.009082f, 0.007868f, 0.002307f, -0.000686f, -0.016766f, 0.029832f, 0.015145f, -0.012007f, -0.014425f, -0.009516f, -0.039323f, 0.010754f, 0.028541f, 0.008663f, -0.027592f, 0.032042f, 0.023363f, 0.013222f, 0.003406f, -0.016918f, 0.008654f, -0.055898f, 0.008551f, -0.003539f, 0.049630f, + -0.017966f, -0.024849f, 0.010499f, -0.013061f, -0.001121f, -0.036194f, -0.006604f, -0.009856f, 0.048287f, -0.031657f, -0.058744f, -0.038457f, -0.076313f, 0.014732f, -0.015612f, -0.005290f, -0.040786f, -0.026207f, -0.067472f, -0.030093f, -0.023670f, -0.003744f, 0.016404f, -0.022021f, -0.003926f, -0.004393f, -0.003553f, -0.006285f, 0.014317f, -0.025571f, 0.010847f, -0.010240f, -0.019799f, 0.002731f, -0.005810f, 0.017776f, 0.009222f, 0.000039f, -0.010009f, 0.023028f, 0.021667f, 0.012820f, -0.008596f, -0.012011f, -0.011704f, -0.011026f, 0.024362f, 0.039714f, 0.004544f, 0.036453f, 0.040343f, 0.013106f, 0.000555f, -0.036626f, -0.004046f, 0.006339f, 0.005138f, -0.003833f, -0.010121f, -0.031110f, -0.000867f, 0.020137f, 0.003137f, -0.023496f, -0.006019f, -0.017799f, 0.090638f, 0.003669f, 0.014965f, -0.015069f, -0.029860f, -0.039959f, -0.013336f, 0.011396f, 0.026484f, 0.022088f, -0.019321f, -0.000028f, -0.040138f, -0.014556f, 0.014259f, -0.033649f, -0.018184f, -0.012699f, 0.048874f, 0.025647f, 0.026863f, 0.025561f, -0.028470f, 0.005313f, 0.010211f, 0.011666f, -0.002824f, 0.033138f, -0.007361f, 0.014648f, + 0.025544f, 0.009924f, 0.007037f, 0.021762f, 0.029662f, -0.017424f, -0.035048f, 0.023478f, -0.003876f, 0.000209f, -0.037036f, -0.034299f, 0.007830f, -0.017110f, -0.013468f, 0.030316f, -0.031218f, 0.040062f, 0.025719f, -0.017644f, 0.020964f, -0.023327f, -0.023690f, -0.028491f, 0.041200f, -0.028839f, 0.012929f, 0.012701f, -0.047382f, 0.004586f, 0.005396f, -0.037241f, -0.064434f, -0.057436f, 0.041824f, -0.043148f, -0.000888f, -0.038788f, -0.009079f, -0.027708f, -0.002443f, 0.018081f, 0.010898f, -0.028201f, 0.029218f, 0.034157f, 0.071077f, 0.018740f, -0.048007f, 0.016997f, -0.029599f, 0.016073f, -0.042244f, 0.022721f, -0.018170f, 0.003297f, -0.008786f, 0.017372f, -0.005350f, -0.016984f, -0.040556f, -0.040147f, 0.004339f, 0.004032f, 0.025366f, -0.018034f, -0.001877f, 0.039955f, 0.011139f, 0.027745f, 0.008241f, -0.007061f, -0.003168f, -0.009313f, -0.026767f, 0.009711f, -0.032263f, -0.018832f, 0.006795f, 0.026793f, -0.035202f, 0.019708f, 0.003558f, 0.025344f, -0.008646f, 0.014258f, 0.025337f, 0.028149f, 0.028070f, -0.012666f, 0.013653f, 0.022102f, 0.023614f, 0.004790f, 0.014069f, 0.007549f, + -0.010882f, 0.043823f, 0.020169f, 0.022174f, -0.018867f, -0.020858f, 0.005449f, 0.007379f, 0.008425f, -0.018172f, 0.001498f, -0.039797f, -0.000786f, 0.006819f, 0.007640f, -0.035103f, -0.036798f, -0.057890f, 0.040105f, 0.004201f, 0.013688f, -0.009480f, 0.021176f, -0.015831f, -0.015780f, 0.012022f, 0.030487f, 0.007208f, 0.019988f, 0.062436f, -0.009206f, -0.037684f, -0.080238f, -0.011413f, -0.031115f, -0.015245f, -0.019250f, -0.037225f, -0.026382f, -0.055600f, -0.006642f, -0.000914f, 0.019259f, 0.057550f, -0.048155f, -0.018539f, -0.008090f, 0.018793f, 0.020203f, 0.056992f, 0.007559f, -0.065281f, -0.015180f, 0.013276f, 0.050779f, 0.013278f, -0.079175f, -0.031773f, 0.071250f, 0.006388f, 0.071072f, -0.042074f, 0.002086f, 0.005447f, 0.042930f, -0.004157f, 0.039042f, 0.059018f, 0.008146f, 0.050042f, 0.034980f, 0.008355f, 0.069284f, 0.059235f, 0.019036f, 0.092458f, 0.070911f, 0.044440f, -0.075296f, -0.005053f, 0.029164f, 0.016896f, -0.001124f, -0.054600f, -0.065301f, -0.033846f, -0.093366f, -0.014908f, -0.069501f, -0.026613f, -0.018067f, -0.099894f, -0.094850f, -0.066021f, 0.032248f, 0.000808f, + -0.022129f, -0.001388f, -0.007452f, -0.002230f, -0.018677f, -0.009974f, 0.022916f, 0.009024f, 0.003741f, -0.003366f, 0.003407f, -0.004756f, 0.014085f, -0.002639f, -0.025175f, 0.043048f, 0.006704f, 0.010198f, -0.013145f, 0.001878f, -0.001815f, 0.022454f, -0.001470f, 0.012999f, -0.008103f, -0.023896f, 0.009186f, 0.018096f, 0.047577f, 0.042320f, 0.002518f, -0.000653f, 0.030261f, 0.014988f, 0.035396f, 0.029451f, -0.009784f, 0.033998f, 0.018854f, 0.006690f, 0.021203f, 0.013700f, -0.012505f, -0.005758f, -0.027683f, 0.016545f, -0.024744f, -0.011088f, -0.043249f, -0.026272f, 0.012675f, -0.050696f, 0.054165f, -0.022985f, 0.035157f, 0.018474f, -0.047100f, 0.007611f, 0.027883f, -0.017442f, -0.049168f, 0.032716f, -0.013947f, 0.028078f, -0.017068f, 0.007682f, 0.010318f, -0.029070f, -0.004372f, -0.012439f, -0.001488f, -0.048017f, -0.039129f, 0.048014f, 0.001319f, 0.019807f, -0.038221f, 0.039366f, 0.033745f, -0.025404f, 0.021190f, -0.037173f, -0.008977f, -0.020553f, 0.026598f, 0.067949f, -0.002030f, 0.082308f, -0.021513f, -0.003312f, 0.003081f, 0.008941f, -0.006401f, -0.045518f, 0.079364f, 0.052834f, + -0.007043f, 0.044459f, 0.033565f, 0.046122f, -0.018072f, -0.000524f, -0.082210f, 0.037340f, 0.037606f, -0.010096f, -0.014668f, 0.051471f, 0.026206f, 0.027364f, 0.062709f, 0.011080f, -0.033312f, -0.038839f, 0.011187f, -0.011891f, -0.047562f, 0.039213f, -0.054983f, 0.002745f, 0.011341f, -0.038178f, -0.060998f, -0.040606f, -0.016063f, 0.004689f, 0.047970f, 0.033011f, 0.014836f, -0.092073f, -0.026686f, 0.056048f, -0.005121f, -0.019775f, 0.015744f, -0.049750f, -0.031938f, 0.042478f, -0.000909f, 0.000937f, -0.018515f, 0.000595f, 0.024924f, -0.007632f, -0.019613f, 0.014873f, -0.007254f, -0.035328f, -0.020092f, 0.003811f, -0.003398f, -0.001883f, -0.000164f, -0.015339f, -0.000709f, -0.024182f, -0.033660f, 0.004728f, -0.003811f, -0.053854f, -0.006850f, -0.032506f, -0.019701f, -0.005733f, 0.007413f, 0.010168f, 0.028906f, -0.027105f, -0.019441f, 0.006274f, 0.028127f, -0.030035f, -0.033258f, 0.045927f, -0.007955f, -0.002297f, -0.009564f, -0.000017f, -0.019993f, 0.008412f, 0.020522f, 0.012029f, 0.017739f, 0.001603f, 0.006098f, 0.000744f, 0.001765f, 0.007097f, 0.014637f, -0.011688f, -0.003809f, 0.006399f, + 0.010378f, 0.006008f, -0.069127f, 0.039513f, 0.060201f, -0.000716f, 0.069450f, 0.021598f, -0.061190f, -0.036958f, -0.005249f, -0.020687f, -0.037399f, 0.039501f, 0.045231f, -0.003965f, 0.031344f, 0.043280f, -0.034283f, 0.030657f, 0.050911f, -0.002684f, -0.069805f, 0.027683f, -0.002413f, -0.013322f, 0.018703f, 0.052820f, -0.017161f, -0.025943f, 0.012425f, -0.022525f, -0.030500f, -0.001660f, 0.045615f, 0.039743f, -0.065788f, 0.021230f, 0.027581f, -0.043462f, -0.028448f, 0.053438f, -0.014809f, -0.076624f, -0.010214f, 0.065256f, -0.021506f, -0.110905f, 0.116447f, -0.032772f, -0.013806f, -0.057119f, 0.075136f, 0.025051f, -0.026310f, 0.055367f, -0.032578f, -0.023656f, -0.014374f, 0.140981f, 0.046630f, -0.058344f, -0.052307f, 0.054375f, -0.012734f, 0.078936f, 0.001212f, 0.059369f, -0.081283f, 0.065257f, 0.111435f, 0.011038f, -0.012222f, -0.019180f, -0.019689f, -0.044067f, 0.105147f, 0.071309f, -0.063209f, 0.018184f, -0.066424f, -0.010848f, 0.006976f, 0.014304f, 0.009145f, 0.020043f, 0.001690f, -0.072115f, 0.033830f, 0.004924f, -0.007674f, -0.001076f, 0.033257f, -0.013987f, 0.007275f, -0.010114f, + 0.017197f, -0.006389f, 0.004363f, -0.011118f, 0.021701f, 0.001361f, -0.004482f, 0.012896f, 0.017425f, -0.039265f, 0.004724f, 0.025524f, 0.009456f, -0.028163f, 0.015229f, 0.045505f, -0.044176f, -0.068013f, 0.013398f, 0.008985f, 0.026763f, 0.026767f, -0.003661f, -0.061393f, -0.020978f, 0.017402f, 0.008523f, 0.017886f, -0.009368f, 0.003070f, -0.002518f, -0.020180f, 0.018000f, -0.015689f, -0.007529f, 0.050430f, 0.115138f, 0.022325f, -0.044614f, -0.010566f, -0.010997f, 0.020247f, 0.017261f, -0.035934f, -0.051372f, 0.013717f, -0.043490f, 0.008661f, -0.027108f, -0.031055f, -0.006848f, 0.005280f, 0.014629f, -0.034625f, -0.014092f, -0.013727f, -0.043213f, 0.036158f, -0.013669f, 0.002328f, -0.006509f, -0.028765f, 0.011293f, 0.008081f, 0.000881f, -0.006228f, 0.000197f, -0.001073f, -0.017131f, -0.036611f, 0.015515f, -0.018191f, 0.015735f, 0.011125f, -0.036710f, -0.029644f, -0.003507f, -0.004296f, -0.004315f, -0.007904f, 0.029661f, -0.020676f, 0.002897f, -0.038894f, 0.033005f, -0.038112f, -0.020303f, 0.018861f, 0.000371f, -0.030564f, 0.024082f, -0.041077f, 0.002956f, 0.012276f, -0.001255f, 0.004412f, + 0.019481f, 0.009250f, -0.042432f, 0.021305f, 0.002826f, -0.025584f, 0.036072f, 0.014191f, -0.040285f, -0.004482f, -0.032159f, -0.004308f, 0.012844f, 0.010620f, -0.041018f, 0.051911f, -0.027683f, -0.015216f, 0.028771f, 0.019107f, 0.004562f, 0.019224f, -0.001786f, 0.026942f, -0.012216f, 0.005426f, -0.003526f, 0.012977f, 0.010056f, -0.007887f, -0.009559f, 0.010288f, -0.013156f, 0.001257f, 0.002083f, 0.001597f, -0.007797f, 0.001156f, -0.007285f, -0.011866f, -0.006533f, -0.012903f, -0.000829f, 0.009445f, 0.016556f, 0.006071f, 0.001835f, 0.008693f, 0.010793f, -0.015363f, 0.023292f, 0.005993f, -0.000879f, -0.015596f, -0.008911f, 0.007176f, 0.018401f, -0.003786f, -0.000512f, -0.009293f, 0.002922f, 0.002472f, -0.007768f, -0.010579f, -0.009339f, -0.024353f, -0.008933f, -0.009634f, -0.069422f, -0.086048f, -0.031922f, 0.261108f, 0.208490f, 0.138742f, 0.252190f, -0.099931f, -0.239073f, -0.076237f, -0.386241f, -0.150078f, 0.010696f, -0.090116f, 0.176827f, 0.242231f, 0.039357f, 0.154138f, 0.263880f, 0.006166f, 0.072601f, -0.016764f, -0.310562f, -0.256345f, -0.194207f, -0.192290f, -0.095142f, 0.147722f, + 0.078980f, 0.114433f, 0.324016f, 0.137986f, 0.019982f, 0.194611f, 0.090096f, -0.110650f, 0.037741f, -0.092724f, -0.314674f, -0.075158f, -0.164465f, -0.323506f, -0.053973f, 0.008053f, -0.079287f, 0.219801f, 0.252957f, 0.100380f, 0.297474f, 0.301706f, 0.056124f, 0.116667f, 0.052162f, -0.189777f, -0.213482f, -0.199152f, -0.359376f, -0.316913f, -0.121057f, -0.146854f, 0.031051f, 0.193093f, 0.263505f, 0.218402f, 0.336613f, 0.250375f, 0.134017f, 0.019178f, -0.042016f, -0.193532f, -0.236496f, -0.173999f, -0.207795f, -0.172666f, -0.007561f, -0.009151f, 0.039460f, 0.187655f, 0.090194f, 0.114894f, 0.179226f, -0.003091f, -0.055751f, -0.028955f, -0.112257f, -0.063573f, -0.037574f, -0.040787f, 0.046113f, 0.095403f, 0.036851f, 0.053122f, 0.059812f, -0.042834f, -0.015374f, -0.017835f, -0.114415f, 0.016500f, 0.048042f, -0.123463f, -0.001313f, -0.010789f, -0.125081f, 0.047281f, 0.021395f, -0.141195f, 0.089888f, 0.134257f, 0.031693f, 0.269763f, 0.167676f, -0.002669f, 0.143526f, 0.026504f, -0.181545f, -0.150376f, -0.236497f, -0.335375f, -0.251939f, -0.163514f, -0.087875f, 0.115463f, 0.249206f, 0.292313f, + 0.363475f, 0.356505f, 0.252363f, 0.056496f, -0.026076f, -0.179814f, -0.329034f, -0.319660f, -0.284193f, -0.238311f, -0.050800f, 0.026820f, 0.042548f, 0.165922f, 0.176078f, 0.122842f, 0.126289f, 0.098630f, 0.043542f, 0.061105f, 0.044656f, -0.008814f, -0.020218f, -0.050077f, -0.102652f, -0.111265f, -0.110431f, -0.111877f, -0.084772f, -0.018405f, 0.005004f, 0.036265f, 0.076061f, 0.092313f, 0.098346f, 0.098003f, 0.071334f, 0.023607f, 0.000161f, -0.027598f, -0.049683f, -0.057211f, -0.044508f, -0.046438f, -0.036136f, -0.012357f, -0.007627f, -0.011430f, 0.000949f, 0.002352f, 0.003685f, 0.028053f, 0.029979f, 0.014194f, 0.018869f, 0.015417f, 0.008957f, 0.019836f, 0.016612f, 0.003239f, 0.001135f, -0.013998f, -0.025986f, -0.023701f, -0.023849f, -0.025885f, -0.019815f, -0.012034f, -0.003215f, 0.008154f, 0.019642f, 0.022610f, 0.022771f, 0.021077f, 0.014790f, 0.006147f, 0.001859f, -0.007331f, -0.014200f, -0.012658f, -0.009764f, -0.008447f, -0.001064f, 0.002548f, 0.005477f, 0.003988f, 0.002422f, -0.002429f, -0.004513f, -0.008255f, -0.007483f, -0.005158f, -0.001031f, 0.000820f, 0.005478f, 0.008304f, + 0.012163f, 0.011422f, 0.008711f, 0.004822f, 0.003122f, -0.002260f, -0.005367f, -0.008037f, -0.008924f, -0.009377f, -0.006630f, -0.005363f, -0.001965f, 0.000267f, 0.002709f, 0.002906f, 0.004184f, 0.002896f, 0.002438f, 0.000373f}, + {-0.009464f, 0.029348f, 0.011209f, 0.007157f, 0.002289f, -0.006182f, 0.000055f, 0.005655f, 0.010556f, 0.000178f, 0.001005f, 0.000652f, -0.003894f, 0.001065f, 0.003571f, -0.000689f, 0.003489f, 0.005445f, 0.007193f, 0.003064f, 0.002944f, 0.003834f, 0.003356f, -0.006592f, 0.006708f, 0.012659f, -0.005998f, 0.003622f, 0.001972f, 0.003558f, 0.000642f, 0.007509f, -0.004877f, -0.001703f, -0.004389f, 0.004347f, 0.012512f, -0.002077f, 0.006070f, -0.000137f, -0.002833f, -0.010286f, 0.003858f, -0.005315f, 0.004754f, 0.002441f, 0.005312f, -0.000562f, -0.003195f, 0.001709f, -0.002200f, 0.007200f, 0.000928f, -0.005650f, 0.007280f, -0.001564f, 0.005684f, 0.004410f, -0.000224f, 0.004235f, 0.008209f, -0.002281f, -0.002867f, -0.002301f, 0.004091f, -0.003328f, -0.004414f, 0.005132f, 0.000071f, 0.003453f, -0.005452f, 0.008097f, 0.000491f, -0.002248f, -0.000932f, -0.000868f, 0.003229f, -0.002997f, -0.004826f, 0.002888f, 0.004351f, 0.004129f, -0.003822f, -0.005710f, 0.002327f, -0.000176f, -0.000665f, -0.002185f, -0.002076f, 0.002898f, -0.000728f, -0.000397f, -0.001756f, -0.002084f, 0.000442f, -0.001492f, + 0.000680f, 0.000468f, 0.002154f, 0.001503f, -0.000605f, 0.000789f, 0.001240f, -0.001258f, -0.000503f, 0.000106f, -0.000553f, -0.000958f, 0.000773f, 0.002085f, 0.001214f, 0.001564f, 0.000066f, -0.000121f, 0.000569f, -0.001285f, 0.000031f, 0.000497f, 0.022851f, 0.017792f, 0.009036f, 0.001238f, -0.003306f, 0.010284f, -0.005995f, -0.006572f, -0.001435f, -0.011432f, 0.006927f, 0.000396f, -0.004656f, 0.002627f, 0.006659f, 0.011279f, -0.005206f, 0.006480f, 0.014791f, -0.004267f, 0.000155f, 0.003316f, 0.007711f, -0.001989f, 0.008396f, 0.005850f, 0.008493f, 0.001888f, 0.006496f, -0.006619f, 0.011303f, -0.001399f, 0.010907f, 0.005333f, -0.001153f, 0.001299f, -0.001756f, -0.000301f, -0.003885f, -0.001904f, -0.004810f, -0.003624f, 0.003825f, -0.001066f, -0.010482f, -0.002409f, 0.001150f, -0.000341f, -0.005835f, -0.006110f, -0.003045f, -0.002669f, 0.008259f, -0.003340f, -0.009006f, -0.012115f, -0.013259f, -0.004630f, -0.005825f, -0.000524f, 0.002074f, 0.006371f, -0.008666f, -0.003994f, 0.001040f, -0.000927f, -0.003872f, 0.000920f, -0.009125f, -0.000911f, -0.010759f, 0.005712f, -0.005850f, -0.002908f, + 0.007493f, -0.001136f, 0.005148f, 0.001432f, 0.001885f, 0.005740f, 0.001458f, -0.004709f, -0.002122f, 0.000413f, -0.004533f, 0.002369f, 0.004639f, 0.002197f, -0.003551f, 0.002624f, 0.003880f, 0.000705f, 0.002107f, -0.001189f, -0.002084f, -0.001515f, -0.002084f, 0.001437f, -0.000209f, 0.001314f, -0.001741f, -0.001351f, 0.001492f, 0.002097f, 0.012095f, -0.026192f, -0.007011f, -0.013280f, -0.002450f, -0.000029f, 0.014424f, -0.007031f, -0.023451f, -0.008287f, -0.000590f, 0.008911f, 0.002793f, -0.008727f, -0.020362f, -0.005265f, 0.005588f, -0.002308f, 0.011477f, 0.000426f, 0.005030f, -0.001161f, -0.009038f, -0.009863f, 0.005930f, 0.007207f, 0.000849f, 0.002321f, -0.000359f, 0.004395f, 0.001027f, -0.012129f, 0.000644f, 0.017015f, 0.002293f, -0.004262f, -0.001574f, -0.004555f, 0.001043f, -0.003934f, -0.007407f, 0.011381f, -0.003550f, -0.004780f, 0.010354f, -0.005447f, -0.009197f, 0.000391f, 0.000058f, 0.000269f, -0.013265f, 0.010750f, -0.004114f, -0.000288f, 0.009941f, 0.009013f, -0.014224f, -0.003639f, 0.002747f, 0.003419f, -0.001264f, 0.007754f, 0.002140f, 0.003833f, 0.005392f, 0.000771f, + 0.004307f, 0.006488f, 0.001414f, 0.000001f, 0.006079f, -0.016258f, -0.003601f, 0.000369f, 0.008256f, 0.004544f, -0.002007f, -0.001683f, 0.006001f, 0.005555f, -0.006479f, -0.000969f, -0.002316f, 0.000152f, 0.003544f, 0.004482f, 0.000891f, 0.005549f, -0.000580f, -0.004064f, -0.001912f, 0.000398f, 0.000401f, 0.000478f, -0.001525f, 0.003843f, -0.000818f, 0.001344f, -0.000612f, -0.001835f, 0.001131f, -0.000116f, -0.000794f, -0.001519f, 0.000303f, -0.001435f, -0.000246f, -0.002525f, -0.001917f, 0.000435f, -0.000395f, -0.001995f, -0.003809f, -0.001464f, 0.000806f, 0.003124f, -0.052146f, -0.020489f, -0.010552f, -0.014711f, 0.004612f, -0.005039f, -0.005023f, -0.000544f, 0.006545f, -0.005893f, -0.007153f, -0.010270f, 0.002044f, 0.009373f, 0.002041f, -0.007015f, -0.008844f, 0.002711f, 0.007723f, 0.007259f, -0.010048f, -0.014679f, 0.001085f, -0.013717f, 0.007328f, -0.000009f, 0.005106f, -0.000305f, 0.004926f, -0.005347f, -0.002308f, 0.014519f, -0.017491f, 0.008121f, 0.004050f, 0.002040f, -0.006219f, 0.003947f, 0.008579f, 0.002381f, -0.010664f, 0.002235f, -0.006773f, 0.005293f, -0.014547f, -0.000462f, + -0.013179f, 0.010220f, -0.001095f, -0.002519f, -0.003755f, 0.005669f, -0.022102f, 0.010278f, -0.006387f, -0.013275f, 0.005328f, 0.010853f, 0.012148f, 0.007267f, 0.002582f, -0.000765f, 0.001432f, -0.001004f, 0.007837f, -0.004378f, 0.002212f, 0.006279f, 0.015194f, 0.002531f, 0.000292f, -0.010813f, 0.006955f, -0.005320f, 0.001237f, 0.000417f, 0.008088f, -0.007067f, 0.000419f, 0.007549f, -0.000665f, -0.008704f, -0.012150f, 0.010159f, 0.000842f, 0.002002f, 0.005063f, -0.000923f, 0.002463f, 0.002288f, -0.000074f, 0.001938f, -0.000847f, 0.000429f, 0.002699f, 0.002627f, 0.002661f, -0.004279f, 0.001738f, -0.003180f, -0.001432f, -0.002658f, 0.002614f, -0.003032f, -0.029613f, 0.014494f, 0.023130f, 0.004487f, 0.001831f, 0.012847f, 0.004344f, 0.003925f, 0.007033f, 0.000959f, 0.007359f, 0.007389f, -0.005966f, -0.001103f, 0.001005f, -0.007275f, -0.004503f, -0.000102f, 0.003576f, -0.004295f, 0.024050f, 0.012768f, -0.003508f, 0.001711f, 0.007637f, 0.009607f, 0.010977f, -0.004604f, 0.007730f, 0.008993f, 0.000507f, 0.002617f, 0.002595f, 0.005117f, 0.003715f, 0.002252f, 0.005082f, 0.004844f, + -0.010406f, -0.008053f, -0.016020f, 0.001723f, -0.005676f, -0.008019f, 0.008240f, -0.002354f, 0.005187f, -0.019859f, 0.021855f, -0.001598f, -0.010395f, -0.001941f, 0.017324f, 0.012527f, -0.002764f, 0.000437f, 0.008388f, -0.004002f, 0.003606f, -0.006401f, -0.013642f, 0.001594f, 0.001274f, -0.010975f, -0.004339f, -0.010818f, 0.001928f, 0.003981f, 0.002442f, -0.005267f, -0.009551f, -0.014567f, -0.017342f, -0.012483f, -0.004860f, 0.000984f, -0.004219f, 0.001675f, 0.005759f, 0.005098f, -0.007209f, -0.000788f, -0.007862f, 0.002855f, -0.002741f, 0.002243f, -0.000105f, -0.003226f, 0.002297f, 0.002611f, -0.002315f, -0.001107f, -0.003013f, 0.004049f, -0.004819f, 0.001035f, 0.001544f, 0.001415f, -0.000488f, -0.001135f, 0.001030f, 0.002147f, 0.002159f, 0.001755f, 0.001357f, 0.001808f, 0.000599f, 0.003453f, -0.000797f, 0.003827f, -0.002394f, 0.001203f, -0.000711f, -0.000996f, -0.002756f, -0.002142f, -0.001833f, -0.002506f, 0.000987f, -0.002013f, -0.000267f, 0.001822f, 0.000612f, 0.054644f, 0.014442f, 0.004093f, -0.002059f, 0.032958f, 0.003831f, 0.015686f, 0.003199f, 0.010452f, 0.017117f, 0.006103f, + -0.009538f, 0.010172f, 0.011763f, 0.001918f, -0.000878f, 0.002575f, 0.021556f, 0.001557f, -0.007385f, -0.013052f, -0.003862f, -0.000332f, -0.014991f, 0.002581f, 0.004442f, 0.008668f, 0.003662f, 0.006141f, 0.016521f, -0.005086f, -0.002625f, 0.010226f, -0.001584f, -0.004400f, -0.000851f, -0.014697f, 0.009564f, 0.006340f, 0.000348f, 0.009591f, -0.004742f, -0.012855f, -0.027960f, -0.010155f, 0.010345f, 0.011511f, 0.000375f, 0.008109f, -0.007886f, -0.008485f, 0.022778f, -0.013073f, 0.010333f, -0.011497f, 0.002443f, -0.016805f, -0.017732f, 0.019375f, -0.007339f, -0.006819f, 0.026605f, 0.002114f, -0.002964f, -0.012374f, 0.009769f, 0.015472f, 0.000774f, -0.008155f, -0.015633f, -0.002336f, 0.011407f, -0.003519f, 0.003884f, -0.006792f, 0.005631f, -0.002504f, 0.001841f, 0.012259f, -0.013058f, 0.004226f, -0.003677f, 0.000947f, 0.001534f, -0.001369f, 0.014041f, 0.004526f, 0.002089f, -0.004024f, 0.000170f, -0.003157f, 0.005932f, -0.002717f, 0.004710f, 0.004842f, -0.004896f, 0.000173f, -0.000762f, -0.003048f, 0.006687f, 0.001268f, 0.003142f, 0.000397f, -0.002325f, 0.001498f, 0.000055f, 0.000272f, + 0.001932f, 0.003104f, 0.001125f, 0.004026f, 0.001244f, -0.000143f, 0.002200f, 0.001632f, -0.001484f, 0.000627f, -0.000628f, 0.001006f, 0.003479f, 0.003998f, 0.000643f, -0.000191f, 0.027991f, 0.009068f, 0.023233f, -0.014292f, 0.004834f, 0.012721f, -0.017337f, -0.006160f, -0.006635f, 0.001676f, -0.008647f, -0.005560f, 0.013869f, -0.004295f, -0.002338f, -0.001109f, 0.017301f, -0.006375f, -0.007679f, 0.018092f, 0.003186f, -0.013026f, 0.005672f, -0.002960f, 0.003153f, 0.006760f, -0.010219f, -0.002542f, -0.007620f, -0.014225f, 0.001951f, 0.000231f, 0.002915f, -0.013996f, -0.014214f, 0.005471f, -0.001019f, 0.005322f, -0.000351f, 0.007798f, 0.002561f, -0.000480f, -0.008997f, -0.009054f, 0.002706f, 0.008791f, 0.004556f, -0.002717f, 0.026390f, 0.006100f, 0.004702f, 0.011781f, 0.004627f, 0.008734f, 0.009227f, 0.005782f, 0.003840f, 0.004408f, -0.003578f, -0.002172f, 0.002211f, -0.011209f, 0.003158f, -0.018000f, 0.005108f, -0.011950f, 0.009494f, -0.006766f, 0.005314f, -0.002417f, -0.008457f, 0.002817f, -0.002073f, 0.009237f, -0.007914f, 0.024883f, 0.021278f, 0.009617f, -0.017782f, 0.005559f, + 0.008226f, -0.007785f, 0.003549f, 0.002131f, 0.012476f, 0.011549f, 0.005108f, -0.000358f, -0.001449f, -0.002598f, -0.006897f, 0.010761f, -0.000601f, -0.001402f, 0.000251f, -0.003210f, 0.001402f, 0.003533f, -0.002766f, 0.005567f, -0.001934f, -0.004741f, -0.004653f, -0.000257f, 0.003546f, 0.003147f, -0.000676f, -0.001246f, -0.003627f, -0.001740f, 0.002249f, -0.004696f, 0.005369f, 0.005250f, -0.003167f, 0.000882f, -0.004067f, -0.001485f, 0.000944f, 0.001667f, -0.003047f, 0.005579f, -0.034470f, -0.066315f, -0.002838f, -0.013292f, 0.011491f, -0.003424f, -0.018377f, -0.001789f, -0.014888f, -0.016411f, -0.014080f, 0.021673f, 0.011235f, -0.014505f, -0.008357f, 0.016484f, 0.009527f, 0.014706f, -0.010170f, 0.009499f, -0.009028f, -0.009113f, -0.002840f, -0.004003f, -0.028092f, 0.007625f, 0.015975f, 0.006857f, -0.016722f, -0.003877f, 0.002909f, 0.004226f, -0.014928f, -0.003365f, -0.021406f, 0.004660f, -0.010179f, -0.001001f, -0.007498f, 0.004029f, 0.022788f, -0.002522f, -0.004308f, 0.011387f, 0.016638f, -0.010167f, 0.004489f, 0.006247f, -0.014156f, 0.007477f, 0.006960f, -0.016614f, 0.002528f, 0.010633f, + -0.002605f, -0.017496f, -0.011056f, -0.011314f, 0.015740f, 0.006054f, 0.015410f, -0.009247f, -0.017989f, 0.004165f, 0.008844f, -0.003890f, -0.012906f, 0.008434f, 0.012432f, 0.011786f, -0.014790f, -0.007726f, -0.003148f, 0.023656f, -0.005143f, 0.014084f, 0.004070f, -0.016802f, -0.013715f, -0.002694f, 0.009217f, -0.015930f, -0.001042f, -0.003043f, 0.008603f, -0.002003f, 0.019526f, 0.002362f, -0.004607f, -0.005966f, -0.005089f, -0.005760f, -0.003784f, -0.002022f, 0.001687f, -0.000153f, -0.002427f, -0.007304f, -0.000819f, -0.007106f, -0.003188f, 0.002768f, -0.002576f, 0.001031f, -0.002164f, -0.005404f, 0.003062f, -0.000969f, 0.008273f, -0.001754f, -0.006968f, -0.004921f, 0.002543f, -0.001403f, 0.000160f, -0.002028f, -0.004537f, 0.001373f, 0.004567f, -0.004314f, -0.001470f, 0.006298f, 0.002824f, -0.004092f, 0.000192f, 0.004945f, -0.033546f, -0.000410f, 0.001322f, 0.019189f, 0.005123f, -0.008177f, 0.011957f, -0.005934f, 0.005449f, -0.018748f, -0.005023f, -0.012011f, -0.006076f, -0.023604f, -0.008436f, -0.014239f, 0.032438f, 0.018063f, 0.019922f, -0.023155f, -0.019134f, -0.009693f, 0.011312f, -0.001393f, + 0.000130f, 0.000320f, 0.006948f, -0.001897f, 0.009700f, -0.013608f, -0.011010f, -0.000552f, -0.002852f, -0.016706f, -0.016094f, -0.013505f, -0.009167f, -0.007433f, -0.006179f, -0.021070f, 0.009904f, 0.025115f, -0.005133f, 0.011609f, 0.016731f, -0.012283f, 0.014532f, 0.008656f, 0.003750f, 0.022918f, -0.000725f, 0.019148f, 0.007603f, 0.002221f, -0.017872f, 0.007038f, 0.009404f, -0.005075f, 0.027135f, 0.021068f, 0.004542f, -0.008200f, -0.012949f, 0.007484f, -0.012722f, 0.005073f, 0.000124f, 0.015593f, 0.000346f, -0.023793f, 0.002083f, -0.009504f, -0.003370f, -0.017875f, 0.021030f, 0.010506f, 0.007868f, 0.004711f, 0.023429f, -0.006830f, -0.023764f, -0.003976f, 0.015568f, 0.000230f, -0.012055f, -0.003387f, 0.002111f, -0.005559f, 0.003328f, 0.007125f, 0.000311f, 0.000055f, -0.001171f, 0.002199f, -0.000019f, 0.008625f, 0.003067f, 0.002452f, -0.001692f, 0.003236f, 0.005027f, 0.007819f, -0.006325f, 0.004255f, 0.005001f, -0.000223f, 0.001834f, 0.007879f, 0.004833f, 0.001919f, -0.004503f, 0.006672f, -0.001626f, -0.004129f, -0.004234f, -0.000467f, -0.011614f, 0.007423f, 0.004245f, 0.001214f, + -0.005292f, 0.006526f, 0.007093f, 0.011726f, 0.007822f, 0.001861f, 0.002460f, 0.000447f, 0.010266f, -0.030604f, 0.013734f, 0.010262f, 0.013025f, -0.014238f, -0.025575f, 0.007477f, 0.007534f, 0.001376f, -0.021582f, 0.020628f, 0.005777f, -0.010859f, -0.019019f, 0.008630f, -0.008475f, 0.032968f, 0.038168f, 0.005749f, -0.006237f, -0.014189f, 0.021628f, -0.024642f, -0.008963f, 0.030624f, 0.007484f, -0.005843f, -0.016617f, -0.015121f, -0.008708f, 0.000633f, -0.020296f, 0.004644f, 0.021411f, -0.002646f, 0.007981f, -0.015677f, -0.014502f, -0.004791f, -0.012006f, 0.031356f, -0.011573f, 0.014133f, 0.011453f, 0.012780f, 0.003254f, 0.006326f, -0.021774f, -0.021651f, -0.020938f, -0.004557f, 0.015556f, 0.036140f, -0.014613f, -0.025951f, -0.006105f, -0.011909f, 0.006587f, 0.005685f, 0.019990f, -0.012171f, -0.000337f, -0.016157f, -0.003173f, 0.028964f, -0.003766f, -0.015630f, 0.020585f, 0.006864f, 0.003270f, 0.010942f, -0.023235f, 0.003633f, -0.007911f, 0.002336f, 0.010541f, 0.025479f, 0.007040f, -0.029403f, 0.010726f, 0.002678f, -0.004629f, -0.012199f, 0.000526f, -0.003048f, -0.001658f, -0.000698f, + 0.004122f, 0.006895f, 0.008135f, 0.002805f, 0.000522f, -0.004666f, 0.001512f, -0.001381f, 0.005841f, -0.009917f, 0.003724f, 0.003993f, -0.000235f, 0.000978f, 0.001665f, -0.007483f, -0.000215f, -0.004934f, 0.008250f, 0.007763f, 0.001904f, 0.009303f, -0.003594f, 0.001368f, 0.007033f, -0.001388f, 0.005580f, 0.001462f, 0.005171f, 0.001828f, -0.011628f, -0.000620f, -0.004138f, -0.000569f, 0.001615f, 0.000779f, -0.004069f, 0.000485f, -0.004794f, 0.000094f, -0.002303f, 0.049919f, -0.021697f, -0.017000f, -0.005198f, 0.010522f, -0.029196f, 0.011693f, -0.007879f, 0.014747f, -0.013102f, -0.005971f, 0.018116f, 0.013433f, 0.005121f, -0.009112f, -0.003298f, 0.024796f, 0.024395f, -0.005063f, 0.021303f, -0.006178f, 0.031320f, -0.014636f, -0.007687f, 0.005625f, 0.032813f, 0.023966f, 0.007938f, -0.017579f, -0.001225f, -0.036433f, -0.005499f, 0.005700f, 0.016769f, 0.019537f, 0.034585f, 0.009067f, -0.000623f, -0.001666f, -0.013263f, -0.022720f, -0.001622f, -0.019705f, 0.014265f, 0.004477f, 0.022054f, 0.012275f, -0.007518f, 0.021857f, -0.026002f, 0.011769f, -0.005788f, 0.001892f, -0.004510f, 0.027822f, + 0.016314f, 0.007973f, 0.004976f, -0.050471f, -0.008015f, 0.029954f, 0.015136f, 0.001873f, -0.000918f, 0.001536f, 0.024166f, 0.010263f, -0.038155f, -0.012432f, -0.014706f, 0.003598f, 0.000847f, -0.037908f, 0.001511f, -0.035431f, -0.023483f, -0.003048f, -0.015208f, -0.016483f, 0.022200f, 0.028023f, -0.002971f, -0.013561f, -0.001452f, 0.008640f, -0.003384f, 0.007381f, 0.011513f, -0.000874f, 0.012788f, 0.018701f, -0.005896f, -0.010326f, 0.001799f, -0.004366f, 0.005724f, 0.003742f, -0.002854f, -0.002533f, 0.000338f, 0.000355f, 0.005368f, -0.000489f, -0.006310f, 0.001393f, 0.006462f, 0.002451f, 0.005761f, -0.004810f, 0.008682f, 0.000098f, -0.003014f, 0.002209f, -0.005268f, 0.002281f, -0.010696f, -0.006834f, -0.008329f, 0.004503f, 0.000583f, -0.007937f, -0.001433f, 0.007036f, 0.004725f, 0.006129f, -0.003778f, 0.003443f, 0.000265f, -0.001190f, -0.010163f, -0.005173f, -0.010778f, 0.018443f, 0.034873f, -0.008564f, -0.014688f, 0.002325f, 0.013272f, 0.008113f, -0.021901f, -0.001057f, -0.017812f, -0.000676f, -0.024118f, -0.002343f, -0.020781f, 0.001212f, 0.020794f, 0.001912f, 0.046338f, -0.019357f, + -0.009732f, -0.016425f, 0.018712f, 0.031337f, -0.025236f, -0.008109f, -0.038954f, 0.007487f, -0.000645f, 0.010777f, 0.009202f, -0.021416f, -0.013146f, 0.017111f, -0.006645f, -0.004570f, -0.021330f, 0.042589f, -0.005961f, -0.045155f, 0.012461f, -0.011749f, -0.013768f, 0.016524f, 0.012427f, -0.012909f, -0.014729f, -0.004187f, -0.026490f, -0.015556f, 0.008475f, 0.006061f, 0.008856f, -0.007801f, -0.019208f, -0.021801f, -0.022300f, 0.018396f, -0.032632f, 0.000699f, 0.007593f, -0.009813f, 0.000640f, -0.000028f, -0.004599f, -0.025538f, -0.004959f, -0.010276f, 0.016171f, 0.021113f, -0.004078f, 0.032723f, -0.002048f, -0.000161f, -0.010171f, -0.001908f, 0.046614f, 0.004706f, -0.021331f, -0.008275f, 0.018006f, 0.013725f, -0.026186f, 0.000693f, 0.003501f, -0.017457f, 0.014480f, 0.003613f, 0.016228f, 0.002705f, 0.002281f, 0.002686f, 0.001058f, 0.007334f, 0.009668f, 0.001038f, 0.004723f, 0.016081f, 0.000995f, -0.005531f, 0.002524f, 0.007797f, -0.006308f, -0.001584f, 0.000645f, -0.007334f, 0.006647f, 0.006529f, 0.007717f, 0.001714f, -0.008964f, 0.002135f, -0.003267f, 0.001567f, -0.002126f, -0.001480f, + 0.000453f, -0.004749f, 0.006599f, -0.003461f, -0.005113f, -0.005687f, 0.013647f, 0.000254f, -0.015521f, 0.011197f, 0.008316f, 0.003864f, -0.001375f, 0.008588f, 0.006015f, -0.016774f, -0.004165f, 0.000956f, 0.000366f, -0.005067f, -0.022730f, 0.057401f, -0.014761f, -0.005035f, 0.005105f, 0.024476f, 0.017590f, -0.037266f, -0.015198f, -0.035402f, 0.007778f, 0.002043f, -0.010946f, -0.038964f, 0.001629f, -0.018184f, 0.008110f, 0.008596f, 0.019693f, 0.001012f, 0.014341f, 0.067455f, 0.014679f, 0.016849f, -0.010569f, -0.003731f, 0.029472f, -0.002554f, 0.002341f, 0.007828f, 0.001951f, -0.004304f, -0.015365f, 0.027194f, -0.028805f, 0.012031f, -0.042834f, -0.013021f, -0.020025f, -0.026433f, -0.022706f, -0.000014f, -0.046798f, -0.015908f, 0.006465f, 0.026851f, 0.015464f, -0.045975f, 0.026137f, 0.017403f, 0.019060f, -0.029176f, 0.021523f, -0.013661f, -0.033458f, -0.011350f, -0.033287f, 0.016342f, 0.039899f, 0.010142f, -0.003773f, -0.025942f, 0.021124f, -0.027629f, 0.041672f, -0.007608f, -0.004436f, -0.024950f, -0.027357f, 0.004204f, 0.032560f, 0.010890f, -0.022317f, -0.008877f, 0.005502f, -0.004413f, + -0.008898f, 0.021536f, 0.011055f, -0.009687f, 0.027583f, -0.001981f, -0.039001f, 0.049242f, 0.026136f, 0.020449f, 0.009318f, -0.006313f, -0.002335f, -0.003789f, 0.014710f, 0.003627f, 0.002234f, 0.032538f, 0.012672f, 0.000895f, 0.001633f, 0.004905f, 0.016925f, -0.013156f, 0.009589f, 0.001267f, 0.003276f, 0.003432f, 0.010947f, 0.005656f, 0.000785f, 0.018520f, 0.014009f, 0.001581f, -0.006230f, -0.006077f, -0.002260f, 0.015247f, 0.007564f, 0.008734f, 0.008146f, 0.010285f, -0.012162f, 0.012700f, -0.003131f, -0.002868f, 0.011528f, 0.018282f, -0.002461f, -0.004542f, 0.000023f, 0.017437f, 0.019721f, 0.007942f, 0.012204f, 0.009345f, 0.031392f, 0.005975f, -0.020217f, 0.009222f, -0.005896f, 0.009503f, 0.034452f, -0.048477f, -0.022066f, -0.038954f, 0.022165f, -0.007758f, 0.003818f, -0.012777f, 0.028129f, -0.027578f, -0.027939f, -0.012595f, -0.006511f, -0.019822f, -0.034568f, -0.016560f, 0.006495f, 0.022835f, -0.031800f, 0.021118f, -0.011954f, 0.002652f, 0.041251f, 0.031695f, -0.000493f, 0.016774f, 0.008012f, -0.006415f, -0.004938f, -0.055819f, 0.007812f, -0.005528f, 0.005570f, 0.011056f, + -0.004339f, 0.001682f, 0.056614f, -0.050608f, 0.004846f, 0.061415f, 0.008064f, 0.017079f, -0.023947f, -0.006397f, 0.032103f, 0.056397f, 0.002931f, 0.050035f, -0.019358f, 0.045281f, -0.015763f, 0.033561f, 0.033962f, -0.008214f, 0.066101f, -0.010816f, -0.002692f, -0.019433f, -0.029722f, -0.031437f, -0.014392f, -0.018802f, -0.045808f, -0.021265f, -0.009625f, 0.017157f, 0.016926f, 0.002326f, -0.023457f, -0.003768f, -0.006525f, 0.029710f, 0.009307f, -0.015229f, 0.025453f, 0.005868f, -0.002977f, -0.003399f, -0.018261f, -0.002664f, -0.007158f, 0.007878f, -0.018474f, -0.008747f, -0.012823f, -0.012773f, 0.023731f, 0.009255f, -0.007612f, 0.007272f, -0.005802f, 0.004660f, -0.013945f, 0.021254f, 0.001229f, 0.006073f, -0.000311f, -0.014072f, 0.013279f, -0.001582f, 0.005048f, 0.015131f, 0.010666f, 0.006526f, 0.001461f, -0.021996f, 0.010872f, -0.008357f, -0.000710f, 0.019162f, -0.000094f, 0.007170f, 0.004896f, 0.009203f, 0.013149f, -0.004518f, -0.009964f, -0.006750f, -0.007892f, 0.004052f, 0.011890f, 0.019676f, 0.011744f, -0.022834f, -0.002471f, -0.024806f, -0.021503f, -0.072471f, -0.051725f, -0.036313f, + -0.003737f, 0.049504f, -0.032470f, -0.003912f, -0.025010f, -0.035796f, -0.029892f, -0.036573f, -0.038439f, -0.014971f, -0.045348f, -0.049055f, -0.042931f, 0.012332f, -0.029679f, -0.015247f, -0.036969f, 0.035343f, 0.057418f, 0.005205f, -0.006762f, -0.020062f, 0.004590f, -0.003369f, -0.001647f, -0.004401f, 0.017999f, 0.004044f, 0.039116f, -0.033990f, 0.002866f, -0.028880f, 0.059523f, 0.014866f, -0.035123f, 0.027725f, -0.025209f, 0.022570f, -0.033802f, 0.019980f, 0.002757f, -0.019905f, 0.017955f, -0.031630f, -0.010780f, 0.010369f, 0.032476f, 0.014514f, 0.057745f, -0.012715f, -0.037456f, 0.003779f, -0.010784f, 0.004685f, -0.024864f, -0.021144f, -0.039963f, 0.005329f, -0.042477f, -0.008217f, -0.006755f, -0.036827f, 0.024673f, 0.031714f, -0.018408f, -0.001692f, -0.054730f, 0.063077f, 0.076008f, 0.012506f, -0.030166f, 0.010709f, 0.066876f, -0.031129f, -0.014397f, -0.035546f, -0.021013f, -0.039047f, 0.016052f, -0.001566f, -0.022322f, 0.017515f, -0.022357f, 0.009586f, -0.013954f, -0.006029f, 0.008997f, 0.005117f, -0.000279f, -0.014412f, -0.003048f, 0.013273f, 0.007436f, -0.024251f, 0.019331f, -0.016789f, + 0.008859f, 0.011594f, -0.007839f, -0.014117f, 0.007688f, -0.011348f, 0.009496f, 0.007271f, -0.015377f, 0.005963f, -0.002155f, 0.006267f, -0.009191f, -0.024432f, 0.006689f, 0.004708f, -0.010260f, 0.006796f, -0.009196f, 0.018040f, -0.000339f, 0.007601f, 0.001973f, 0.023342f, 0.002991f, -0.030400f, 0.017300f, 0.011829f, 0.005200f, 0.019681f, -0.058762f, 0.107446f, 0.040492f, -0.008675f, -0.032456f, -0.008888f, -0.034459f, 0.037075f, 0.093008f, 0.002169f, -0.061870f, -0.028123f, 0.033497f, 0.012648f, -0.012384f, 0.044536f, -0.008668f, 0.005738f, 0.025364f, -0.002506f, -0.025693f, -0.008171f, 0.020885f, -0.026662f, -0.024475f, -0.009724f, 0.008654f, 0.001521f, -0.004714f, -0.011074f, 0.019692f, 0.002258f, 0.029178f, 0.023294f, -0.030177f, 0.015020f, 0.035885f, 0.020327f, -0.027885f, 0.010986f, 0.005931f, 0.024470f, 0.000583f, 0.008688f, 0.006502f, 0.010240f, 0.050632f, 0.048200f, 0.029689f, 0.065245f, -0.032041f, 0.033763f, -0.038594f, 0.024892f, -0.000445f, 0.022777f, 0.028207f, 0.009379f, 0.007330f, 0.034552f, 0.015922f, -0.008831f, 0.021749f, 0.000430f, 0.029177f, -0.030634f, + -0.017687f, 0.003011f, 0.070342f, -0.048200f, 0.004706f, -0.060686f, -0.007234f, 0.007425f, 0.024059f, -0.029339f, -0.005846f, -0.030240f, 0.007946f, 0.038101f, -0.023111f, -0.054187f, -0.011598f, -0.004982f, -0.014785f, 0.013642f, 0.009527f, -0.015040f, 0.005493f, -0.012800f, -0.012875f, 0.012658f, -0.001920f, -0.006936f, -0.024608f, 0.013820f, -0.001009f, -0.015165f, -0.012461f, 0.012110f, 0.033255f, 0.003691f, -0.009479f, -0.003939f, 0.012148f, 0.030300f, 0.006005f, 0.003085f, 0.024905f, -0.000220f, 0.006823f, -0.001800f, -0.004826f, -0.000616f, 0.009077f, 0.014654f, 0.008551f, -0.003446f, -0.005202f, 0.013140f, 0.009040f, -0.018134f, 0.017857f, 0.005398f, 0.034624f, -0.007997f, 0.008859f, 0.021412f, -0.014169f, -0.008115f, 0.011810f, -0.018980f, 0.090006f, 0.007182f, 0.006660f, -0.019979f, -0.012466f, 0.014638f, 0.013837f, 0.007957f, 0.034760f, 0.014192f, -0.014537f, 0.018037f, 0.037047f, -0.001836f, 0.040592f, -0.004319f, 0.019718f, -0.041681f, 0.074813f, -0.011563f, -0.008777f, 0.012097f, -0.056650f, -0.015038f, -0.027307f, 0.039413f, 0.021857f, 0.022082f, -0.026536f, 0.009104f, + 0.009444f, -0.035764f, 0.009645f, 0.029575f, 0.025490f, 0.008233f, -0.008880f, 0.003007f, -0.017143f, 0.056236f, 0.008398f, 0.025056f, 0.020733f, 0.030015f, -0.050857f, -0.004729f, -0.015511f, 0.008733f, -0.019067f, -0.022917f, 0.041625f, -0.040723f, 0.030406f, -0.026141f, 0.032003f, -0.008087f, -0.034249f, -0.004042f, -0.051304f, 0.030688f, 0.028804f, 0.034505f, -0.105740f, 0.029485f, 0.018562f, -0.033284f, -0.022155f, -0.031029f, 0.053753f, -0.078518f, 0.046047f, 0.108110f, 0.001537f, -0.053069f, -0.021442f, 0.030641f, 0.063439f, 0.016658f, -0.022470f, -0.047978f, -0.079508f, -0.007417f, -0.001105f, 0.030259f, -0.024284f, -0.011734f, -0.018792f, 0.052971f, 0.002754f, -0.002682f, -0.016236f, 0.010133f, 0.002343f, -0.001185f, 0.001348f, -0.001736f, 0.009335f, 0.033311f, 0.041285f, 0.021053f, -0.007142f, -0.004588f, 0.015866f, 0.003039f, -0.011301f, 0.003770f, -0.017662f, -0.011334f, -0.021344f, -0.030905f, -0.063329f, -0.025912f, 0.008589f, 0.001781f, 0.034043f, -0.026237f, -0.018811f, 0.043664f, 0.015614f, -0.012989f, -0.019664f, 0.013296f, -0.005687f, -0.018516f, 0.043301f, 0.003841f, + -0.003320f, -0.015349f, 0.000060f, -0.019140f, -0.015484f, -0.023605f, -0.006932f, -0.010306f, -0.008404f, -0.025065f, 0.016309f, -0.052214f, 0.008538f, -0.031774f, 0.047258f, 0.002647f, 0.013545f, -0.026984f, 0.021437f, -0.008023f, -0.017800f, 0.008074f, -0.018349f, -0.011989f, -0.015442f, -0.041943f, -0.022973f, 0.029614f, 0.025975f, 0.018693f, 0.022235f, -0.050612f, -0.013679f, 0.009103f, -0.013950f, 0.028511f, 0.021421f, 0.001003f, 0.018400f, 0.048884f, -0.014164f, -0.051791f, 0.097706f, -0.043228f, -0.053526f, 0.059179f, -0.028368f, -0.018019f, 0.014110f, 0.029911f, -0.035429f, -0.012274f, 0.004397f, -0.024690f, 0.126969f, -0.002046f, -0.019944f, -0.008929f, 0.001830f, 0.030472f, -0.061143f, -0.047992f, -0.025698f, -0.025706f, -0.001445f, -0.054246f, 0.000590f, -0.005680f, 0.020276f, 0.079019f, 0.081418f, -0.032217f, 0.063082f, -0.062161f, -0.053889f, 0.032072f, 0.051178f, -0.018197f, 0.014640f, 0.005560f, 0.035275f, 0.042051f, 0.000716f, 0.001971f, 0.057091f, -0.051298f, -0.099498f, -0.011991f, -0.039269f, 0.021437f, 0.047799f, -0.005498f, -0.031014f, 0.063425f, 0.019683f, 0.012114f, + -0.016746f, -0.053586f, -0.028982f, 0.004878f, -0.022262f, 0.029471f, -0.002139f, -0.019780f, -0.002143f, -0.022274f, -0.021488f, 0.029261f, -0.009114f, 0.011339f, -0.021519f, 0.031213f, -0.002250f, -0.002710f, 0.021062f, 0.029897f, -0.002862f, -0.007181f, -0.020530f, 0.001936f, -0.017596f, -0.017250f, -0.012265f, -0.006107f, -0.031093f, -0.000770f, -0.013912f, -0.006132f, -0.031216f, 0.008446f, 0.036921f, 0.013154f, -0.021923f, -0.046965f, -0.003060f, -0.004861f, 0.025253f, -0.063013f, -0.012455f, 0.013941f, -0.012400f, 0.028340f, -0.000180f, 0.016954f, -0.000838f, -0.005523f, 0.004015f, -0.035824f, 0.038783f, 0.001064f, 0.023512f, -0.024259f, -0.038590f, 0.035925f, -0.038202f, 0.012233f, -0.009173f, 0.033805f, -0.000301f, 0.007861f, -0.020501f, 0.006907f, -0.014608f, -0.048612f, -0.039203f, 0.016994f, -0.003428f, -0.000806f, 0.007676f, 0.037076f, -0.016759f, -0.010738f, -0.031091f, 0.013707f, 0.010983f, -0.003365f, -0.006349f, -0.081967f, 0.003519f, 0.023567f, -0.029697f, 0.020899f, -0.045870f, -0.008207f, 0.002820f, 0.028918f, 0.035922f, 0.004710f, -0.017394f, 0.011804f, 0.064874f, 0.057068f, + 0.056300f, -0.002263f, -0.005306f, 0.012339f, 0.006656f, -0.025672f, 0.016681f, 0.071621f, -0.050979f, -0.016330f, -0.014838f, 0.000361f, 0.002621f, 0.009462f, -0.037913f, -0.057506f, -0.021747f, -0.003280f, 0.116152f, 0.059228f, 0.039404f, -0.005301f, -0.010222f, -0.029489f, 0.050499f, 0.007459f, 0.032314f, -0.011838f, -0.015719f, -0.023346f, -0.020774f, -0.085796f, -0.038082f, -0.045230f, 0.035615f, -0.003246f, -0.016773f, -0.002620f, -0.035276f, -0.016411f, 0.037337f, 0.056284f, -0.008783f, 0.049642f, 0.026696f, 0.020856f, 0.002999f, 0.023578f, 0.029666f, 0.025066f, -0.006321f, -0.001473f, 0.000370f, 0.033882f, -0.026771f, -0.034379f, -0.016698f, 0.018632f, -0.003230f, -0.024152f, -0.015800f, -0.024191f, 0.014331f, -0.005393f, 0.030742f, 0.061411f, 0.011506f, 0.037917f, 0.049142f, 0.024054f, 0.030492f, 0.015481f, 0.009688f, 0.013701f, -0.022484f, 0.032498f, -0.026651f, -0.017761f, 0.007152f, 0.002895f, -0.019000f, 0.009916f, 0.017555f, 0.032632f, 0.013316f, -0.037120f, 0.020537f, 0.015844f, 0.004079f, 0.017452f, -0.010004f, -0.019500f, 0.010883f, -0.000833f, -0.014307f, -0.008141f, + -0.013365f, 0.005278f, -0.079240f, 0.044408f, 0.039178f, -0.002348f, 0.064284f, 0.028614f, -0.043585f, -0.043343f, 0.018878f, -0.017927f, -0.038876f, 0.002318f, 0.003988f, 0.017267f, -0.009598f, 0.022598f, -0.005560f, 0.021387f, 0.027670f, -0.025653f, -0.102755f, 0.055038f, -0.015435f, -0.032424f, 0.023530f, 0.036294f, 0.001389f, -0.069284f, -0.008953f, -0.002984f, -0.070994f, -0.044564f, 0.037557f, -0.011004f, -0.028784f, -0.024621f, 0.016194f, -0.069378f, -0.049004f, 0.093325f, -0.007853f, -0.054403f, 0.021367f, 0.050640f, 0.021894f, -0.076987f, 0.109971f, 0.044288f, -0.067604f, 0.037511f, 0.049780f, 0.007807f, -0.045749f, 0.047495f, 0.053303f, 0.032227f, -0.042156f, 0.039833f, 0.074617f, 0.003908f, 0.075377f, 0.092997f, -0.049708f, -0.029809f, -0.034578f, 0.087871f, 0.056152f, -0.038306f, 0.021587f, -0.023199f, -0.055852f, 0.048090f, 0.109821f, 0.015743f, -0.032851f, -0.027647f, 0.066033f, -0.006252f, -0.073636f, -0.052898f, 0.013560f, -0.002824f, 0.061238f, -0.010978f, 0.047340f, -0.091774f, -0.013907f, 0.003594f, 0.015904f, -0.019160f, 0.019625f, -0.000931f, 0.002050f, 0.010455f, + 0.002775f, -0.024020f, 0.007449f, -0.011459f, 0.014973f, 0.005752f, -0.033200f, 0.029147f, 0.009704f, -0.027851f, -0.019662f, 0.005256f, -0.023912f, 0.004686f, 0.022242f, 0.024210f, 0.003643f, -0.022815f, -0.007207f, 0.007463f, -0.031035f, 0.018213f, 0.023321f, 0.007497f, 0.002122f, 0.023097f, 0.008658f, -0.010401f, 0.011468f, -0.008380f, 0.002124f, -0.015959f, 0.010261f, 0.037016f, -0.026084f, 0.064524f, 0.103873f, 0.041738f, -0.042966f, -0.015975f, -0.036036f, 0.021973f, -0.017501f, 0.028343f, 0.018858f, -0.047806f, 0.024301f, -0.048720f, -0.016306f, 0.000223f, -0.017824f, 0.002560f, 0.025381f, 0.019649f, 0.001432f, -0.038903f, 0.008759f, 0.030913f, -0.011753f, 0.004429f, -0.014002f, -0.045493f, 0.045845f, -0.027569f, 0.031747f, -0.046860f, -0.027489f, -0.006808f, -0.038296f, -0.011625f, 0.038922f, -0.038208f, 0.051309f, 0.003067f, 0.041838f, 0.016241f, -0.020849f, -0.056402f, 0.046021f, 0.028256f, 0.019151f, 0.011513f, 0.047434f, -0.035477f, -0.017908f, -0.020673f, 0.014797f, 0.017480f, -0.004697f, -0.044653f, -0.002058f, -0.006477f, -0.044806f, -0.018111f, 0.007013f, 0.011742f, + 0.035249f, -0.004589f, -0.031512f, 0.041537f, -0.008155f, -0.007672f, 0.050353f, 0.023587f, -0.041457f, 0.013001f, -0.025444f, 0.015643f, -0.013385f, 0.019316f, -0.035833f, 0.019563f, -0.012491f, 0.039130f, 0.006688f, 0.014745f, -0.013536f, -0.000553f, -0.029121f, 0.011150f, 0.001761f, 0.000826f, -0.000887f, 0.007824f, -0.011827f, -0.011361f, -0.001551f, 0.004195f, -0.003405f, 0.007096f, -0.014917f, -0.003366f, 0.011153f, -0.003279f, -0.000715f, -0.002935f, 0.000112f, 0.000121f, -0.023475f, 0.003838f, 0.018477f, -0.000208f, -0.002928f, -0.005618f, -0.002503f, -0.017906f, 0.001024f, -0.004947f, -0.002379f, -0.009625f, -0.014516f, -0.003862f, 0.013761f, -0.008758f, -0.004542f, 0.005871f, 0.002712f, 0.010013f, -0.010931f, -0.004827f, -0.001881f, -0.009223f, -0.012736f, -0.014609f, -0.077561f, -0.089813f, -0.049193f, 0.269280f, 0.235387f, 0.143594f, 0.312575f, -0.066057f, -0.236058f, -0.082044f, -0.444427f, -0.231895f, -0.005301f, -0.114135f, 0.157986f, 0.291566f, 0.040121f, 0.171614f, 0.332539f, 0.056632f, 0.115588f, 0.011823f, -0.342955f, -0.285223f, -0.253152f, -0.277408f, -0.169247f, 0.138757f, + 0.057825f, 0.138930f, 0.359475f, 0.217730f, 0.055576f, 0.267904f, 0.121365f, -0.163036f, 0.088316f, -0.118802f, -0.314064f, -0.037991f, -0.194403f, -0.355576f, -0.161358f, -0.036311f, -0.187414f, 0.209071f, 0.223639f, 0.106830f, 0.356538f, 0.404175f, 0.152520f, 0.200187f, 0.187671f, -0.209276f, -0.137376f, -0.267815f, -0.420017f, -0.385108f, -0.247909f, -0.247693f, -0.071865f, 0.161893f, 0.208150f, 0.279597f, 0.392556f, 0.353738f, 0.205850f, 0.151300f, 0.026589f, -0.163041f, -0.238458f, -0.173755f, -0.227065f, -0.279171f, -0.095244f, -0.105042f, -0.051861f, 0.175119f, 0.120417f, 0.129545f, 0.271020f, 0.069874f, -0.012447f, 0.045380f, -0.075507f, -0.116818f, -0.065772f, -0.118060f, -0.036038f, 0.076629f, 0.028551f, 0.042469f, 0.095809f, -0.022057f, 0.019728f, 0.053004f, -0.088938f, -0.008332f, 0.111037f, -0.104861f, 0.008853f, 0.018210f, -0.210405f, -0.010164f, -0.004312f, -0.250491f, 0.019826f, 0.088901f, -0.032409f, 0.259064f, 0.234766f, 0.043541f, 0.251247f, 0.124521f, -0.011064f, 0.042243f, -0.067868f, -0.270645f, -0.282642f, -0.349085f, -0.397896f, -0.200048f, -0.032521f, 0.080944f, + 0.249636f, 0.415555f, 0.476014f, 0.379326f, 0.280333f, 0.128648f, -0.052395f, -0.157743f, -0.347763f, -0.435048f, -0.320608f, -0.256838f, -0.244831f, 0.015990f, 0.120207f, 0.147595f, 0.241255f, 0.215685f, 0.141901f, 0.139904f, 0.100552f, 0.032282f, 0.040102f, -0.000428f, -0.076327f, -0.087285f, -0.110726f, -0.141760f, -0.126796f, -0.091604f, -0.068641f, -0.025550f, 0.033977f, 0.051307f, 0.083412f, 0.101820f, 0.087631f, 0.064151f, 0.049119f, 0.021784f, -0.003966f, -0.022446f, -0.032960f, -0.044642f, -0.035458f, -0.025930f, -0.020752f, -0.016495f, -0.004012f, -0.005929f, -0.005011f, -0.000966f, -0.004453f, -0.010996f, -0.000122f, -0.002722f, 0.002237f, 0.017210f, 0.027456f, 0.034127f, 0.049481f, 0.036968f, 0.018545f, -0.000537f, -0.017257f, -0.031148f, -0.033578f, -0.045486f, -0.045524f, -0.035714f, -0.015757f, -0.002693f, 0.017236f, 0.028237f, 0.038430f, 0.036963f, 0.034305f, 0.017619f, 0.004349f, -0.009356f, -0.016253f, -0.023073f, -0.018343f, -0.016213f, -0.007180f, -0.000451f, 0.008348f, 0.008575f, 0.011670f, 0.006134f, 0.003557f, -0.005438f, -0.008964f, -0.013629f, -0.008603f, -0.007133f, + 0.001351f, 0.004260f, 0.010349f, 0.009949f, 0.012704f, 0.007402f, 0.006977f, 0.000865f, -0.000292f, -0.005365f, -0.003778f, -0.006930f, -0.004135f, -0.005709f, -0.001844f, -0.003070f, 0.000925f, -0.000953f, 0.001737f, -0.001149f} + }, + { + {-0.000963f, 0.012014f, -0.001235f, 0.003646f, -0.002195f, 0.016039f, -0.006300f, -0.001560f, -0.000568f, 0.001983f, -0.002834f, 0.007344f, -0.001270f, -0.004960f, -0.000879f, 0.010044f, 0.000746f, -0.005090f, 0.004712f, 0.003468f, 0.006617f, 0.002705f, -0.005038f, -0.003336f, 0.011231f, 0.001559f, -0.002875f, -0.002225f, -0.002289f, 0.002204f, 0.002391f, -0.001452f, -0.014299f, -0.003584f, 0.000690f, 0.009868f, 0.003529f, -0.001228f, -0.000041f, -0.005699f, 0.007861f, -0.008033f, -0.010679f, 0.001380f, 0.000103f, -0.003621f, -0.002460f, -0.002987f, 0.001528f, 0.000970f, 0.000942f, -0.003742f, 0.009324f, 0.000282f, 0.012497f, -0.002016f, -0.005954f, 0.002737f, -0.000664f, 0.001783f, 0.002901f, 0.006312f, 0.004296f, -0.001618f, -0.003432f, -0.002927f, 0.008108f, -0.008258f, 0.000322f, 0.000230f, -0.001450f, -0.007083f, 0.006245f, -0.003573f, 0.000825f, 0.005420f, -0.003819f, -0.005120f, -0.004257f, 0.005496f, -0.000507f, -0.001715f, -0.001528f, 0.000179f, -0.001031f, -0.002234f, 0.002730f, 0.002795f, 0.002042f, 0.001272f, 0.000699f, 0.003821f, 0.000617f, -0.000082f, 0.000804f, -0.000377f, + 0.000136f, -0.000886f, -0.000475f, -0.000460f, 0.002582f, 0.000621f, -0.001739f, 0.002169f, -0.004740f, 0.004145f, 0.002500f, -0.005585f, -0.003065f, -0.000430f, 0.000529f, -0.000285f, -0.000815f, -0.002821f, 0.005072f, 0.000987f, -0.002167f, -0.002948f, -0.000136f, 0.010484f, -0.001449f, -0.004900f, 0.006721f, -0.002588f, -0.006293f, -0.000616f, 0.005383f, 0.004034f, -0.003436f, 0.000976f, -0.004299f, 0.002549f, 0.002482f, -0.002030f, 0.005381f, -0.001426f, -0.009647f, 0.001837f, 0.005038f, 0.004722f, 0.000684f, -0.000671f, -0.006985f, -0.002317f, -0.000896f, -0.003023f, 0.006358f, 0.008942f, 0.004169f, -0.012073f, 0.004134f, 0.014329f, 0.005936f, -0.000639f, -0.000063f, 0.006634f, -0.003218f, 0.002214f, -0.005985f, -0.005380f, 0.005560f, 0.006310f, 0.003048f, 0.001740f, 0.001141f, 0.001325f, 0.002988f, 0.000633f, -0.000527f, -0.002079f, 0.001538f, -0.004166f, -0.000758f, -0.001752f, -0.008618f, -0.004252f, 0.001857f, 0.003299f, 0.002702f, 0.005941f, 0.004667f, 0.004949f, 0.007054f, -0.004387f, -0.002773f, -0.001213f, 0.002275f, 0.002651f, 0.004185f, -0.000803f, -0.001336f, -0.000698f, + 0.002577f, -0.001751f, 0.002339f, 0.000657f, -0.000899f, -0.000683f, 0.000811f, -0.000336f, 0.001449f, 0.000661f, 0.000281f, -0.000488f, 0.000830f, 0.000788f, -0.000245f, 0.001215f, 0.000344f, 0.000374f, -0.000854f, 0.000294f, -0.000194f, 0.000121f, 0.001536f, 0.000265f, 0.000692f, 0.000641f, 0.000275f, 0.008366f, -0.000654f, 0.003490f, -0.005416f, -0.007913f, -0.005056f, 0.004399f, -0.003698f, -0.003643f, -0.004006f, -0.005207f, 0.005000f, 0.000772f, 0.003648f, -0.001589f, 0.001020f, -0.010773f, -0.007035f, -0.004892f, 0.006865f, 0.001373f, 0.001467f, 0.003842f, -0.003913f, -0.001905f, -0.000945f, 0.001296f, -0.008287f, -0.001544f, -0.005618f, -0.005995f, 0.000264f, -0.005286f, 0.003493f, 0.003406f, 0.014221f, -0.003525f, 0.007189f, -0.004809f, 0.002919f, -0.003291f, 0.000660f, 0.012543f, 0.001917f, 0.005450f, -0.006018f, 0.003841f, -0.005424f, -0.002507f, -0.000919f, 0.007974f, -0.004018f, -0.002020f, -0.007168f, -0.003736f, -0.008448f, -0.001101f, 0.007796f, 0.001907f, 0.000489f, 0.001387f, 0.007138f, -0.007118f, -0.012616f, 0.002916f, 0.003839f, -0.008156f, -0.000703f, 0.001111f, + -0.002129f, 0.003311f, 0.009681f, 0.002058f, -0.002591f, 0.000236f, -0.003591f, 0.000659f, 0.000488f, -0.002785f, -0.000948f, -0.000881f, -0.004065f, -0.000923f, -0.002368f, 0.000846f, -0.000968f, -0.001551f, 0.003128f, -0.000608f, -0.003299f, 0.001371f, -0.002383f, 0.000105f, -0.002569f, -0.003574f, 0.001971f, -0.000645f, -0.000370f, 0.001141f, 0.001411f, 0.000464f, 0.003204f, -0.001576f, -0.000390f, 0.000556f, -0.001307f, -0.000511f, -0.000489f, -0.001654f, -0.000980f, 0.002726f, 0.000799f, 0.003884f, 0.000363f, 0.001739f, -0.001658f, 0.004528f, -0.012706f, 0.002058f, -0.004400f, -0.009476f, -0.006734f, 0.003759f, -0.001813f, -0.000498f, 0.009399f, 0.003037f, -0.001232f, 0.000754f, 0.008004f, -0.003795f, 0.005928f, -0.002719f, 0.001821f, -0.008455f, -0.001411f, 0.005630f, -0.001844f, 0.007009f, 0.007998f, 0.002551f, 0.005066f, 0.010325f, -0.002359f, -0.014684f, 0.003396f, -0.006567f, 0.000526f, -0.017971f, 0.000559f, 0.005691f, -0.003522f, 0.006628f, 0.001018f, -0.006520f, 0.002392f, -0.013529f, -0.008550f, -0.003343f, -0.003242f, -0.011237f, 0.005735f, 0.006141f, 0.000433f, 0.005711f, + 0.000511f, 0.001509f, -0.003558f, 0.005173f, 0.004051f, -0.002147f, 0.012403f, -0.002377f, 0.010257f, 0.008675f, -0.000439f, -0.001475f, 0.000088f, 0.002742f, 0.004226f, 0.001274f, 0.004722f, 0.001498f, 0.001644f, 0.013598f, 0.005271f, -0.006017f, -0.002682f, -0.000137f, -0.003231f, 0.001971f, -0.002322f, 0.013716f, 0.002357f, 0.006415f, -0.004890f, 0.005535f, -0.000006f, -0.002769f, 0.001238f, -0.004512f, -0.002849f, -0.000820f, -0.003147f, -0.002024f, -0.001886f, 0.001634f, -0.002951f, -0.000757f, -0.002064f, -0.001146f, -0.000980f, 0.003729f, -0.001564f, 0.001918f, -0.000495f, -0.003275f, -0.000489f, 0.001937f, 0.000847f, 0.000298f, 0.001285f, -0.002001f, 0.001711f, 0.001039f, 0.001020f, 0.001813f, -0.001030f, 0.000390f, -0.003108f, -0.000278f, 0.002457f, 0.002115f, 0.000564f, 0.000355f, 0.000341f, 0.001719f, -0.024468f, 0.000171f, -0.000149f, 0.006348f, 0.010628f, 0.003851f, -0.005469f, -0.008818f, -0.001499f, 0.011686f, -0.002275f, -0.002115f, -0.008664f, -0.000105f, -0.003648f, 0.008679f, 0.010131f, -0.017419f, 0.011357f, 0.007397f, -0.006712f, -0.001324f, -0.009256f, 0.000155f, + -0.002842f, 0.000316f, 0.005949f, 0.011748f, -0.004443f, 0.002793f, -0.003119f, -0.003885f, 0.004254f, 0.008139f, 0.005350f, -0.004949f, -0.008361f, 0.005882f, 0.003941f, -0.002882f, -0.001578f, 0.001117f, -0.010756f, 0.003990f, 0.003164f, -0.004172f, -0.007214f, 0.002869f, -0.005498f, 0.009612f, 0.004114f, -0.016582f, 0.007551f, -0.007039f, -0.018450f, -0.005220f, -0.001442f, 0.003799f, -0.007606f, -0.000238f, 0.003989f, -0.008006f, -0.008064f, -0.008241f, -0.002622f, 0.002207f, 0.017381f, 0.002859f, 0.003253f, -0.003639f, -0.009183f, 0.012004f, -0.003670f, -0.013839f, 0.000626f, -0.013967f, 0.001001f, -0.001245f, -0.005197f, -0.015309f, 0.004643f, 0.000332f, -0.003454f, 0.003896f, 0.009300f, 0.004420f, -0.001838f, -0.001473f, -0.000106f, 0.005233f, 0.000766f, 0.001377f, 0.002813f, 0.005101f, -0.000491f, -0.002204f, -0.003038f, -0.002954f, 0.001135f, -0.000113f, -0.002487f, -0.002348f, 0.002201f, 0.002309f, 0.004290f, 0.001045f, -0.000159f, -0.000118f, 0.001569f, -0.000633f, -0.000133f, -0.000563f, 0.002691f, -0.000184f, 0.001410f, -0.000273f, 0.003696f, 0.015257f, 0.003986f, 0.003368f, + 0.006553f, 0.009629f, -0.002207f, 0.023418f, -0.003493f, 0.016775f, -0.019800f, 0.006853f, 0.011416f, -0.004104f, 0.001507f, -0.005484f, -0.000628f, 0.009063f, 0.016322f, -0.004588f, -0.008256f, -0.002343f, 0.007553f, 0.001686f, 0.016598f, 0.007953f, -0.001901f, 0.002455f, -0.000221f, -0.007754f, 0.001455f, -0.001689f, -0.002518f, 0.007350f, 0.009489f, -0.015077f, 0.017375f, -0.013250f, -0.007334f, 0.003023f, -0.005486f, 0.008853f, 0.000129f, -0.005004f, 0.012245f, 0.017354f, -0.012988f, -0.002274f, -0.001358f, 0.005411f, -0.012303f, -0.020052f, -0.009478f, -0.006095f, 0.005816f, -0.013890f, -0.008151f, -0.001571f, 0.014343f, 0.009137f, -0.010169f, 0.007250f, 0.003722f, -0.005429f, -0.008377f, -0.001257f, -0.005195f, -0.005849f, 0.000496f, -0.003873f, 0.010696f, -0.008119f, -0.001810f, 0.009203f, -0.007360f, 0.009943f, 0.011711f, 0.001668f, -0.001331f, 0.001098f, -0.014711f, -0.012903f, -0.003348f, 0.008198f, 0.000241f, -0.005619f, 0.005269f, 0.012058f, -0.008109f, -0.003662f, 0.003155f, -0.001018f, -0.005796f, 0.000035f, 0.001425f, -0.005444f, 0.000184f, -0.001451f, 0.002357f, 0.000799f, + 0.004225f, 0.000672f, 0.003292f, -0.002098f, -0.001017f, 0.000231f, 0.000279f, -0.000154f, 0.002934f, 0.001380f, 0.003442f, 0.003472f, 0.000218f, 0.001090f, -0.000633f, 0.002271f, 0.003511f, -0.001786f, 0.008919f, 0.007214f, 0.009741f, -0.009414f, -0.012407f, -0.006740f, 0.008459f, 0.000358f, 0.034967f, -0.002695f, -0.000851f, -0.008479f, -0.015793f, -0.023258f, -0.005123f, 0.007605f, 0.012294f, -0.007731f, -0.014866f, 0.001860f, 0.000133f, 0.014831f, -0.004988f, -0.006182f, 0.018398f, -0.010103f, 0.001197f, -0.014268f, 0.009089f, -0.002928f, 0.000070f, -0.003239f, -0.021612f, -0.013646f, 0.001146f, 0.011903f, 0.008015f, 0.000886f, -0.022395f, 0.014779f, -0.009053f, -0.009329f, -0.009666f, -0.012898f, -0.002010f, 0.012078f, -0.009930f, -0.011026f, 0.007508f, -0.003670f, 0.004309f, 0.022311f, -0.009791f, 0.000385f, 0.001106f, 0.009416f, -0.006642f, -0.006176f, -0.003105f, 0.014139f, -0.003220f, -0.007617f, -0.001334f, 0.011000f, 0.014418f, -0.014423f, -0.016294f, -0.005645f, -0.002422f, -0.005561f, 0.003452f, -0.011542f, -0.004052f, -0.010901f, -0.021527f, -0.008612f, -0.004983f, 0.002750f, + -0.019799f, -0.005601f, 0.000297f, 0.013886f, 0.000410f, -0.012294f, -0.000240f, -0.000630f, -0.003736f, -0.006859f, 0.000298f, 0.002761f, -0.001296f, 0.002012f, 0.001963f, -0.002814f, 0.004021f, -0.001792f, -0.004021f, 0.004241f, 0.005349f, -0.002450f, -0.005139f, -0.000291f, -0.001013f, 0.000767f, 0.004282f, 0.001468f, 0.000074f, 0.002887f, -0.001636f, -0.002718f, -0.002071f, -0.002970f, 0.004250f, -0.011473f, 0.009732f, 0.011745f, -0.008623f, -0.010584f, -0.008831f, 0.004751f, -0.000837f, 0.017050f, 0.029873f, -0.016800f, 0.001162f, -0.000759f, -0.002024f, 0.002715f, 0.008681f, -0.024547f, 0.022042f, -0.017317f, -0.008486f, 0.022069f, -0.005071f, -0.010646f, 0.007384f, 0.008115f, 0.000544f, -0.001301f, -0.017033f, 0.010599f, -0.002389f, 0.003639f, -0.011259f, 0.014030f, -0.001247f, -0.023628f, -0.025111f, 0.008342f, -0.004571f, -0.013061f, 0.006423f, -0.001147f, 0.039015f, 0.006469f, -0.007084f, -0.011674f, -0.022936f, -0.008222f, 0.004506f, -0.005666f, 0.017990f, -0.003873f, -0.026721f, -0.002666f, 0.018447f, -0.008116f, 0.002456f, 0.015826f, 0.010784f, -0.009101f, -0.001642f, 0.012799f, + 0.017248f, -0.007926f, 0.003407f, 0.002377f, -0.008253f, 0.003648f, -0.003778f, -0.001233f, 0.002609f, -0.004085f, -0.004801f, -0.016665f, -0.018092f, -0.015414f, 0.015337f, 0.008457f, 0.010007f, 0.004128f, 0.000162f, 0.006016f, -0.013188f, -0.007401f, -0.018475f, 0.009108f, -0.002295f, -0.002646f, -0.003722f, -0.002850f, -0.009402f, -0.005699f, 0.001982f, -0.003932f, 0.000615f, 0.000621f, 0.000711f, 0.003542f, 0.000519f, 0.004268f, -0.000430f, 0.003121f, -0.004255f, 0.002370f, -0.006405f, 0.000446f, -0.003015f, 0.005281f, 0.000313f, -0.003512f, -0.000955f, 0.001596f, -0.002722f, -0.003242f, -0.007488f, -0.007687f, -0.004138f, 0.007598f, 0.000575f, 0.002609f, 0.004910f, 0.001430f, 0.005949f, 0.002190f, -0.004802f, -0.020052f, 0.007655f, -0.021642f, 0.000913f, 0.007767f, -0.003410f, -0.016218f, -0.007517f, -0.003374f, 0.014523f, 0.011394f, -0.008531f, -0.008991f, 0.015480f, 0.006343f, -0.008854f, -0.009716f, -0.007443f, -0.001107f, 0.014967f, -0.002617f, 0.001420f, -0.000920f, -0.000116f, 0.019049f, 0.009552f, 0.012738f, -0.000834f, -0.001012f, 0.006667f, -0.009972f, -0.016598f, 0.013539f, + 0.021970f, -0.014889f, 0.018895f, -0.005593f, -0.001848f, -0.008511f, 0.009765f, 0.000532f, -0.010487f, 0.006360f, 0.017868f, 0.013874f, 0.006493f, -0.013436f, -0.005429f, -0.027140f, 0.004555f, 0.014051f, -0.008650f, -0.002230f, -0.010668f, 0.002752f, -0.006330f, 0.010459f, -0.006635f, 0.003455f, 0.012598f, 0.007105f, 0.023688f, 0.012317f, 0.008044f, 0.015072f, -0.012636f, 0.022647f, 0.007073f, 0.013753f, -0.004487f, -0.015683f, -0.024077f, -0.004624f, -0.004001f, -0.006336f, -0.005617f, 0.008947f, -0.016540f, 0.025048f, -0.004258f, -0.020321f, 0.011603f, 0.018716f, 0.007825f, 0.002387f, 0.003961f, 0.007008f, 0.002427f, -0.004184f, 0.004861f, -0.003834f, -0.000020f, 0.007851f, 0.000015f, -0.000318f, 0.008658f, 0.001215f, 0.004764f, -0.000736f, -0.004005f, 0.001299f, 0.000886f, -0.003454f, 0.002727f, 0.003520f, 0.000974f, -0.002461f, 0.002112f, 0.000715f, 0.006707f, 0.001473f, -0.001184f, 0.004226f, -0.005690f, 0.001680f, 0.001335f, -0.006228f, -0.009082f, -0.002537f, -0.003537f, -0.002328f, -0.004489f, -0.003169f, -0.001874f, -0.000760f, -0.007813f, 0.011043f, -0.023660f, 0.017373f, + 0.006219f, -0.003736f, 0.026009f, 0.019871f, -0.032661f, -0.022107f, 0.020881f, 0.035431f, -0.003109f, 0.005135f, -0.002846f, -0.004593f, -0.003368f, -0.001575f, 0.009188f, 0.005257f, 0.021682f, 0.005200f, 0.020761f, 0.005722f, 0.009154f, -0.002874f, -0.011409f, 0.004911f, 0.001827f, -0.009555f, 0.015961f, 0.001553f, 0.006540f, 0.003615f, -0.003022f, -0.014656f, 0.002141f, -0.016614f, -0.005344f, -0.019215f, -0.012571f, -0.007796f, 0.016362f, 0.002261f, 0.008197f, 0.019682f, -0.008261f, -0.001680f, 0.002590f, 0.007055f, 0.002414f, 0.000460f, -0.005253f, 0.014578f, 0.032459f, 0.015462f, -0.025315f, -0.018269f, -0.018654f, 0.022211f, -0.003067f, -0.020585f, 0.012328f, -0.011537f, -0.000945f, -0.003365f, -0.001112f, -0.001579f, 0.001029f, 0.019492f, 0.032537f, 0.012193f, 0.028075f, 0.017807f, 0.009339f, 0.003634f, 0.007338f, -0.008903f, 0.029879f, 0.009586f, -0.015127f, -0.020706f, 0.009529f, 0.006861f, -0.005307f, 0.014836f, 0.028301f, 0.006488f, -0.010392f, 0.017446f, -0.001235f, -0.012738f, 0.003057f, 0.009814f, 0.001995f, -0.001630f, 0.001524f, 0.005425f, 0.009837f, 0.004251f, + 0.004601f, 0.001147f, 0.006580f, -0.002522f, -0.000764f, -0.003538f, -0.000590f, 0.012969f, -0.006383f, 0.004861f, -0.001556f, 0.003171f, 0.000785f, -0.003330f, 0.002399f, 0.004674f, 0.006094f, -0.002550f, 0.002792f, -0.005082f, 0.000359f, 0.002709f, -0.008799f, 0.004081f, -0.002612f, -0.012985f, 0.003379f, 0.032356f, 0.005780f, 0.011573f, -0.010618f, 0.008530f, -0.016124f, -0.027589f, 0.000297f, 0.015161f, 0.004104f, 0.012221f, 0.016465f, 0.018756f, 0.000743f, -0.019953f, -0.017521f, -0.026516f, -0.041799f, -0.000483f, -0.005358f, 0.018556f, 0.013250f, -0.015325f, -0.009041f, 0.010972f, 0.021300f, -0.026903f, -0.017881f, -0.004997f, -0.015242f, -0.009911f, -0.005939f, 0.008604f, 0.016443f, 0.000964f, -0.010617f, -0.012359f, 0.016614f, -0.013388f, -0.006120f, -0.000213f, 0.023540f, -0.001493f, 0.001558f, -0.037399f, -0.003247f, 0.009356f, 0.018899f, 0.025272f, 0.004992f, -0.024039f, 0.011006f, 0.000649f, 0.010949f, 0.015961f, 0.002234f, 0.008095f, 0.017727f, 0.031872f, -0.021529f, -0.008195f, -0.002294f, 0.009853f, 0.033316f, 0.014342f, 0.010833f, 0.019057f, -0.006945f, -0.011036f, + -0.020716f, -0.025416f, -0.015605f, -0.000882f, 0.015925f, 0.037686f, -0.023902f, -0.017131f, -0.002871f, 0.036946f, -0.021102f, -0.011895f, -0.018902f, -0.003309f, -0.016994f, 0.005362f, 0.002674f, 0.008844f, 0.019094f, 0.003681f, 0.012054f, -0.008076f, -0.008561f, -0.010376f, 0.000350f, -0.005215f, -0.012711f, -0.010910f, -0.005849f, -0.002846f, -0.003043f, 0.012476f, -0.009833f, -0.002792f, -0.004025f, 0.008918f, 0.001722f, 0.006498f, -0.004727f, -0.004245f, 0.008375f, 0.002959f, 0.001821f, -0.007446f, 0.010934f, -0.005807f, -0.000851f, -0.004066f, 0.003099f, -0.004225f, 0.000639f, 0.007517f, 0.008559f, 0.001463f, 0.016411f, 0.009676f, 0.023219f, -0.027535f, -0.020106f, -0.002854f, 0.040483f, 0.016716f, 0.000742f, 0.022283f, -0.014031f, 0.033317f, -0.008075f, -0.028847f, -0.005943f, -0.028672f, 0.023161f, 0.014225f, 0.008890f, 0.009331f, 0.000216f, -0.009081f, 0.011032f, 0.017092f, 0.008181f, -0.005731f, 0.014811f, 0.020422f, 0.017796f, -0.002111f, -0.016110f, 0.027601f, 0.006100f, -0.001545f, -0.004978f, 0.003429f, -0.018293f, 0.017938f, -0.003756f, -0.004828f, -0.023227f, -0.012324f, + -0.014495f, 0.032129f, 0.011017f, 0.000433f, 0.003817f, 0.016640f, 0.023368f, 0.012213f, -0.031177f, 0.028064f, -0.003730f, 0.016256f, 0.006468f, 0.024653f, -0.006083f, -0.032149f, 0.009653f, -0.001430f, 0.012872f, -0.005684f, -0.013626f, 0.012005f, -0.005598f, 0.008148f, 0.040071f, -0.004911f, -0.019140f, 0.000105f, 0.004852f, -0.019674f, 0.032184f, -0.014537f, -0.020197f, 0.028818f, -0.017279f, 0.014686f, 0.001448f, -0.020911f, -0.015353f, -0.020923f, 0.006080f, 0.017474f, -0.010941f, 0.010107f, 0.018886f, -0.010822f, 0.013169f, -0.004506f, 0.022432f, -0.008198f, 0.006326f, 0.007430f, -0.006834f, 0.000027f, 0.000367f, -0.010478f, -0.001878f, 0.009435f, -0.015141f, -0.002895f, 0.010201f, 0.005421f, -0.000206f, -0.009020f, 0.003926f, -0.002492f, 0.003076f, -0.009445f, -0.009609f, -0.005175f, 0.001378f, 0.002214f, -0.011468f, -0.006926f, 0.009650f, 0.001231f, 0.003898f, -0.011213f, 0.004515f, 0.000860f, -0.005601f, 0.002091f, 0.000996f, 0.003478f, -0.006494f, 0.000313f, -0.003473f, -0.000751f, -0.009333f, -0.003759f, -0.001327f, 0.005833f, -0.002137f, -0.006068f, -0.003736f, -0.001330f, + 0.001284f, 0.001020f, -0.002276f, -0.000077f, -0.012505f, 0.009581f, -0.027705f, -0.004933f, 0.013584f, 0.003779f, -0.027109f, 0.007365f, -0.010064f, 0.019757f, 0.003826f, 0.010341f, -0.044691f, 0.013852f, -0.000027f, 0.017466f, 0.027428f, 0.001944f, -0.004415f, 0.002805f, -0.015100f, 0.029141f, -0.028115f, 0.009329f, 0.016416f, 0.012245f, 0.015052f, -0.006804f, -0.013984f, -0.014811f, -0.029062f, 0.011639f, 0.003460f, 0.016893f, 0.029131f, -0.010859f, 0.024861f, 0.014450f, -0.025631f, -0.013658f, -0.001224f, 0.003159f, 0.000482f, 0.000229f, 0.011877f, 0.022519f, 0.019578f, 0.009087f, -0.052634f, 0.013267f, 0.014546f, 0.015787f, -0.034974f, 0.021109f, -0.018367f, 0.018378f, 0.001294f, 0.009925f, -0.005494f, 0.013900f, -0.004994f, 0.044490f, 0.020290f, -0.019250f, 0.001609f, -0.054907f, 0.008437f, -0.015873f, -0.017624f, 0.015994f, 0.010314f, -0.027373f, -0.055956f, 0.035284f, 0.020604f, -0.051285f, 0.019390f, -0.011256f, 0.018975f, -0.003896f, 0.003942f, 0.008543f, -0.000257f, -0.034405f, -0.013818f, -0.004607f, 0.010263f, 0.000114f, -0.009599f, 0.015100f, -0.019417f, -0.006903f, + 0.018585f, -0.001230f, -0.002458f, 0.007184f, 0.003266f, 0.008058f, 0.002708f, -0.009931f, 0.003544f, -0.015077f, 0.008897f, -0.006340f, 0.004765f, 0.004586f, -0.004872f, -0.001898f, -0.003537f, -0.005053f, 0.002116f, -0.008446f, -0.002154f, -0.007078f, -0.006321f, -0.011984f, 0.005686f, -0.003232f, -0.004027f, -0.006681f, 0.002595f, 0.006712f, 0.003413f, 0.003870f, 0.000520f, 0.002344f, 0.004018f, 0.000201f, 0.004421f, 0.004799f, 0.011227f, -0.005847f, 0.016810f, -0.006043f, -0.011586f, 0.020724f, -0.015910f, 0.000559f, 0.002648f, 0.052606f, -0.007470f, 0.038105f, 0.008918f, 0.028798f, 0.001438f, 0.008526f, 0.008858f, 0.050749f, 0.050075f, -0.025633f, -0.024164f, 0.029231f, -0.036892f, 0.000454f, 0.009529f, -0.035998f, 0.020393f, 0.003366f, -0.003257f, -0.006182f, -0.011449f, 0.004839f, 0.003585f, 0.007281f, -0.022724f, 0.000639f, -0.005801f, -0.028974f, 0.014683f, 0.020966f, -0.033219f, -0.024016f, -0.012356f, 0.018204f, 0.016893f, 0.016962f, -0.002103f, -0.006191f, 0.015139f, 0.052880f, 0.027922f, -0.009830f, -0.007149f, -0.006652f, 0.035053f, -0.027795f, 0.012750f, 0.007995f, + -0.044436f, -0.017785f, -0.002300f, 0.006510f, -0.037707f, 0.026263f, 0.016463f, 0.008017f, 0.006811f, 0.018377f, -0.035719f, -0.003774f, -0.029678f, 0.001825f, 0.017933f, 0.031196f, 0.018586f, -0.018881f, -0.010615f, -0.001014f, 0.000735f, -0.021764f, 0.049577f, -0.003430f, 0.006350f, -0.011224f, 0.016821f, -0.003259f, 0.009723f, -0.003977f, 0.005940f, 0.005236f, 0.010575f, -0.000722f, -0.000088f, -0.003518f, 0.002305f, -0.000219f, -0.003073f, 0.015265f, -0.004652f, -0.010293f, -0.000886f, -0.000653f, 0.007268f, -0.010493f, 0.002271f, -0.008601f, -0.014642f, 0.009458f, -0.002917f, -0.009255f, 0.000559f, 0.000389f, 0.001471f, -0.008070f, 0.011264f, 0.003572f, 0.013889f, -0.016857f, -0.001431f, 0.008782f, -0.004620f, -0.013568f, -0.000474f, 0.015875f, 0.006687f, -0.009215f, 0.009433f, -0.004544f, 0.023895f, 0.037458f, -0.002758f, 0.002585f, -0.023263f, 0.002099f, -0.001179f, -0.016357f, -0.027748f, -0.005140f, -0.012936f, -0.020517f, -0.015275f, 0.023532f, -0.019979f, 0.017108f, -0.006137f, -0.004578f, 0.032576f, -0.022514f, -0.012811f, 0.005154f, 0.013043f, 0.002073f, -0.043481f, -0.026476f, + 0.004790f, -0.006838f, 0.006862f, -0.005923f, -0.013762f, 0.027750f, 0.005749f, -0.002251f, -0.011508f, -0.062164f, 0.037243f, -0.011144f, -0.000846f, -0.005180f, 0.002215f, 0.017979f, -0.010542f, -0.016878f, -0.029242f, -0.002625f, 0.012670f, -0.017834f, -0.023205f, 0.009612f, 0.036411f, -0.006098f, 0.033851f, 0.025158f, -0.025069f, 0.045908f, 0.030108f, -0.030095f, -0.046832f, -0.013315f, -0.020505f, 0.002606f, -0.014954f, -0.003522f, 0.022185f, -0.038917f, 0.018947f, -0.006240f, -0.022093f, -0.024386f, -0.024625f, -0.029539f, 0.006009f, 0.017890f, -0.016090f, 0.025521f, -0.003474f, -0.014740f, -0.030735f, 0.000596f, -0.003593f, 0.011916f, 0.036316f, -0.013096f, -0.027808f, -0.009553f, 0.000640f, 0.009475f, 0.024803f, 0.006660f, -0.003257f, -0.020369f, -0.000318f, 0.000856f, 0.009125f, 0.003954f, -0.000112f, 0.006989f, 0.010067f, -0.007579f, 0.012609f, -0.007274f, 0.005688f, 0.014911f, 0.013206f, 0.000898f, -0.021059f, -0.008506f, 0.003027f, 0.005237f, -0.014687f, 0.023668f, -0.014455f, 0.010860f, 0.012600f, -0.009605f, 0.001120f, 0.002666f, -0.005676f, -0.019926f, 0.004104f, 0.009050f, + 0.001445f, 0.016871f, 0.011577f, -0.011361f, -0.011039f, -0.002909f, -0.039510f, 0.071924f, 0.101300f, -0.009801f, 0.012373f, 0.006472f, 0.024563f, 0.049076f, -0.046835f, 0.000537f, 0.008158f, 0.000905f, -0.016866f, 0.002510f, -0.020845f, 0.024627f, 0.060365f, -0.012756f, 0.001337f, 0.003424f, 0.018316f, 0.001659f, 0.007126f, 0.023185f, -0.046437f, -0.003478f, 0.045649f, 0.046844f, -0.054719f, -0.011633f, 0.007924f, 0.007701f, 0.016347f, 0.041232f, 0.011650f, 0.083180f, 0.013895f, 0.025666f, 0.012304f, -0.013074f, -0.017211f, -0.000999f, -0.058327f, -0.083980f, -0.028382f, -0.027256f, -0.087438f, 0.013695f, -0.002031f, -0.048865f, -0.023794f, -0.081858f, -0.008902f, -0.011270f, 0.055845f, -0.054669f, 0.034157f, -0.037356f, -0.002991f, -0.024567f, -0.019335f, 0.021949f, 0.050196f, -0.038640f, -0.014442f, -0.003504f, -0.011379f, -0.004100f, 0.021211f, 0.040203f, 0.042986f, -0.030631f, 0.086400f, 0.057912f, 0.007612f, -0.032744f, -0.070970f, -0.016118f, -0.026371f, -0.019393f, 0.004762f, 0.022813f, -0.014833f, 0.008508f, 0.026882f, 0.004348f, -0.008424f, 0.027231f, 0.018219f, 0.009337f, + 0.012036f, 0.028588f, 0.028929f, 0.000223f, 0.002452f, 0.011562f, 0.010907f, -0.004710f, -0.008493f, -0.004941f, 0.005378f, -0.000712f, -0.003528f, 0.001801f, -0.005629f, 0.003983f, 0.018919f, -0.000813f, 0.006754f, 0.022955f, -0.005881f, -0.008233f, -0.008660f, -0.000979f, -0.012618f, -0.002571f, 0.011022f, -0.005974f, -0.003344f, 0.002196f, 0.000222f, 0.001954f, -0.001660f, 0.009028f, -0.005962f, -0.006334f, 0.015031f, 0.010514f, -0.011431f, -0.000609f, -0.006034f, -0.002494f, -0.036106f, 0.066186f, 0.110326f, -0.025969f, -0.005573f, 0.019572f, 0.049422f, 0.016610f, -0.028605f, 0.017949f, -0.024426f, 0.006352f, 0.015676f, -0.005916f, -0.032973f, 0.009944f, 0.035221f, -0.008763f, -0.050248f, 0.039381f, -0.011480f, 0.032145f, -0.011823f, -0.007946f, -0.012339f, -0.020353f, -0.000741f, 0.035700f, 0.020020f, 0.005905f, 0.028946f, -0.013718f, -0.011372f, 0.010999f, -0.015351f, 0.019978f, 0.011724f, 0.030563f, 0.052454f, 0.045896f, -0.032989f, -0.061561f, -0.022412f, -0.003882f, 0.048227f, -0.018460f, 0.008626f, 0.019404f, -0.019041f, -0.028389f, -0.045326f, -0.046631f, 0.036769f, 0.039127f, + -0.031224f, -0.112214f, 0.009324f, -0.007933f, -0.015332f, 0.008676f, -0.011142f, -0.045048f, -0.020971f, -0.010601f, -0.031235f, -0.013431f, 0.047786f, 0.018034f, 0.027558f, -0.010846f, -0.015589f, -0.010195f, 0.026574f, 0.004402f, 0.005000f, 0.022764f, 0.066251f, -0.005845f, -0.009711f, -0.033519f, -0.031623f, -0.046264f, -0.004961f, 0.026059f, 0.017843f, -0.018937f, 0.013823f, -0.008798f, -0.010976f, -0.019361f, -0.017538f, 0.015855f, -0.013584f, 0.015460f, 0.007299f, 0.008680f, -0.009899f, -0.014524f, 0.016214f, 0.009934f, -0.004099f, 0.012143f, -0.017008f, 0.006999f, -0.002345f, 0.009965f, -0.005654f, -0.009854f, -0.005533f, -0.004975f, 0.011367f, 0.005488f, -0.000586f, -0.012105f, -0.002880f, 0.023684f, -0.017170f, -0.000637f, -0.016684f, 0.020276f, -0.011120f, -0.004819f, -0.015430f, 0.001971f, -0.006663f, 0.001959f, 0.017250f, 0.017231f, 0.003506f, 0.000012f, -0.006787f, -0.013207f, -0.014520f, -0.001841f, -0.023780f, -0.003159f, -0.019661f, 0.010603f, -0.027818f, -0.045393f, -0.009967f, -0.007496f, 0.008430f, -0.015417f, 0.035059f, -0.020741f, -0.071384f, -0.038582f, 0.024746f, -0.033530f, + 0.039714f, 0.035555f, -0.015619f, -0.005264f, 0.005194f, -0.021644f, 0.000168f, 0.011741f, -0.003041f, 0.006454f, 0.050310f, 0.042013f, -0.011090f, -0.066414f, -0.050398f, 0.003902f, 0.035349f, -0.026605f, -0.011406f, -0.031287f, -0.040187f, 0.003859f, -0.011273f, -0.047064f, -0.051326f, -0.075278f, 0.030432f, 0.010551f, 0.001758f, 0.043660f, 0.058468f, -0.002140f, -0.043533f, -0.032971f, -0.035194f, -0.019792f, -0.012404f, 0.013435f, 0.022691f, -0.020008f, -0.032037f, -0.039042f, 0.020868f, 0.018449f, -0.038448f, -0.036548f, -0.014676f, -0.006239f, -0.022422f, 0.014075f, 0.094686f, 0.056985f, 0.110569f, 0.037121f, -0.058718f, 0.069023f, -0.003000f, -0.035084f, 0.003414f, -0.033020f, -0.072503f, -0.029819f, 0.016603f, 0.034748f, -0.008203f, 0.032026f, 0.018347f, 0.070549f, 0.076728f, 0.063358f, 0.020892f, -0.017575f, -0.011210f, -0.010243f, 0.013293f, 0.018032f, -0.026787f, -0.009702f, 0.004295f, 0.057565f, -0.008123f, 0.005129f, -0.006386f, 0.020932f, 0.020746f, 0.024707f, -0.001402f, 0.000651f, 0.000241f, 0.005503f, -0.002423f, 0.003638f, -0.021102f, -0.006533f, -0.007353f, -0.019439f, + -0.020456f, -0.009203f, 0.007154f, 0.024433f, -0.015898f, 0.003825f, 0.008305f, 0.027740f, 0.037125f, 0.025722f, 0.023650f, 0.026744f, 0.005647f, -0.009828f, -0.020775f, -0.029458f, -0.037078f, -0.028875f, -0.017386f, -0.034831f, -0.035802f, -0.013631f, -0.006539f, 0.003430f, 0.015565f, 0.066110f, -0.037633f, 0.004514f, 0.019167f, -0.008096f, -0.049051f, 0.049619f, 0.046988f, -0.026936f, -0.037548f, 0.005322f, 0.065146f, -0.034054f, 0.018440f, 0.042080f, 0.012637f, -0.015550f, -0.031391f, -0.020306f, 0.014330f, -0.004762f, 0.010887f, -0.018098f, 0.012042f, -0.040338f, 0.059174f, -0.005534f, 0.013182f, -0.002599f, -0.074911f, 0.023502f, -0.020832f, 0.038760f, 0.023096f, 0.041400f, -0.016213f, -0.071904f, 0.051657f, 0.023512f, -0.024633f, -0.044688f, 0.037005f, 0.020094f, 0.039362f, 0.040057f, -0.034876f, 0.016199f, 0.041551f, -0.060874f, 0.055862f, 0.027751f, -0.001883f, 0.018006f, -0.031779f, 0.070313f, -0.008009f, 0.046344f, 0.020611f, 0.081613f, -0.005813f, -0.014069f, 0.011362f, 0.033324f, 0.021882f, 0.023258f, 0.082135f, 0.005036f, 0.020002f, 0.048268f, -0.031877f, 0.033189f, + 0.003805f, -0.054484f, 0.020266f, -0.018223f, 0.061762f, -0.045352f, -0.054846f, -0.056770f, 0.048577f, 0.080116f, -0.025601f, 0.020551f, -0.094315f, 0.009195f, 0.004450f, -0.003388f, -0.044216f, 0.007589f, 0.018587f, -0.014359f, -0.012217f, -0.011635f, 0.029766f, 0.014206f, -0.018910f, -0.020099f, -0.011801f, -0.004584f, -0.005977f, 0.008775f, -0.032559f, -0.019263f, 0.017194f, 0.007341f, 0.006077f, 0.001256f, 0.014810f, -0.002324f, -0.001782f, -0.018870f, 0.025536f, 0.032135f, -0.013699f, -0.049462f, -0.033615f, -0.000147f, 0.000017f, 0.009746f, 0.002479f, -0.015446f, -0.024451f, -0.013188f, 0.009185f, 0.014573f, 0.039795f, 0.013693f, 0.002068f, 0.000896f, -0.029694f, -0.005860f, 0.030843f, 0.018469f, 0.006997f, -0.032140f, -0.019672f, -0.003431f, 0.004464f, 0.005853f, -0.005322f, -0.005903f, -0.005675f, -0.001895f, -0.120862f, 0.006594f, -0.014791f, 0.003736f, 0.093604f, 0.077019f, 0.110845f, 0.058509f, -0.029462f, -0.022599f, -0.045906f, -0.061236f, 0.021562f, 0.005350f, 0.016089f, 0.019444f, -0.017819f, 0.027846f, 0.047275f, 0.008670f, -0.012638f, -0.016031f, -0.033456f, -0.022276f, + -0.020213f, 0.009221f, 0.015073f, -0.048090f, -0.028416f, -0.006649f, 0.032273f, -0.014577f, 0.020795f, 0.025789f, -0.068282f, -0.067318f, 0.012792f, 0.019492f, 0.015013f, -0.050817f, -0.023332f, -0.045643f, -0.022061f, -0.020904f, 0.044032f, -0.057847f, -0.080500f, -0.030284f, 0.016001f, 0.013685f, -0.062084f, -0.049885f, -0.039171f, -0.029699f, 0.033591f, 0.047305f, 0.002161f, -0.016075f, -0.019630f, -0.010975f, -0.010455f, -0.021380f, -0.068916f, 0.022679f, 0.051822f, 0.047071f, 0.014678f, 0.064294f, 0.086973f, -0.007575f, -0.011161f, 0.066578f, -0.016102f, -0.040518f, -0.091560f, -0.031193f, 0.012497f, -0.050256f, -0.033628f, 0.023548f, -0.008212f, 0.032651f, 0.057133f, -0.034764f, -0.053936f, -0.017860f, -0.023134f, -0.013390f, -0.014626f, -0.014517f, 0.006094f, 0.008292f, 0.006694f, 0.011631f, -0.019365f, 0.016925f, -0.026756f, -0.003202f, 0.016666f, 0.022325f, -0.023906f, -0.033364f, 0.019133f, -0.007591f, 0.001253f, -0.023282f, 0.027559f, -0.016114f, -0.005785f, -0.006403f, 0.025510f, -0.021559f, 0.027674f, -0.012257f, -0.012890f, 0.018317f, 0.004844f, 0.014595f, -0.011524f, 0.001314f, + 0.005441f, 0.029836f, -0.003471f, 0.007104f, 0.004561f, 0.079665f, 0.027593f, 0.006699f, 0.028713f, -0.032635f, 0.001878f, -0.016540f, -0.024852f, 0.014952f, 0.005536f, -0.020266f, -0.034385f, -0.019358f, -0.031934f, -0.025512f, 0.010144f, -0.019626f, -0.009934f, 0.015159f, -0.010071f, 0.003633f, -0.011178f, 0.039731f, -0.031091f, 0.032619f, 0.011538f, 0.003904f, -0.030075f, -0.012613f, 0.023624f, 0.009914f, -0.000745f, 0.019293f, -0.003578f, -0.007647f, -0.012428f, -0.010068f, -0.008392f, 0.003814f, -0.000349f, 0.004245f, -0.035185f, 0.018634f, -0.014823f, -0.013480f, 0.012017f, 0.008608f, 0.004392f, -0.006375f, 0.024375f, 0.021363f, -0.030812f, 0.027640f, -0.004018f, 0.018820f, 0.036802f, -0.007546f, 0.019837f, 0.019281f, -0.018572f, -0.012894f, -0.024693f, 0.002405f, 0.004040f, -0.039096f, 0.016045f, 0.006173f, 0.030427f, -0.011847f, -0.069898f, 0.043921f, 0.002473f, 0.001474f, 0.000722f, -0.030572f, -0.009903f, -0.007904f, -0.010587f, -0.044653f, 0.025372f, 0.013056f, 0.027377f, -0.019784f, 0.011948f, -0.022217f, -0.020643f, 0.001145f, 0.017309f, 0.014329f, 0.000274f, -0.002370f, + -0.006482f, 0.001758f, -0.010480f, -0.001914f, 0.029539f, -0.011877f, 0.005716f, 0.003433f, 0.008250f, -0.018040f, 0.019595f, -0.000527f, -0.003966f, 0.004845f, -0.002170f, 0.004738f, 0.006428f, -0.016390f, -0.002492f, 0.000496f, -0.003324f, -0.002840f, 0.008859f, -0.010400f, 0.013022f, 0.019437f, 0.007037f, -0.011795f, -0.000826f, -0.002305f, -0.011415f, 0.014231f, -0.004127f, 0.007868f, -0.040828f, -0.115988f, -0.172447f, 0.036220f, 0.135615f, 0.005649f, 0.371129f, 0.342082f, 0.235087f, 0.404198f, 0.311039f, 0.042358f, 0.006836f, -0.041855f, -0.296170f, -0.302170f, -0.229612f, -0.395805f, -0.368984f, -0.105432f, -0.122943f, -0.124408f, 0.029877f, 0.075103f, -0.061512f, -0.020432f, 0.119056f, 0.075831f, -0.003736f, 0.088510f, 0.061593f, 0.004843f, 0.074310f, 0.175277f, 0.115551f, 0.040395f, 0.179784f, 0.133026f, 0.010844f, 0.154418f, 0.209406f, 0.050484f, 0.023147f, 0.213459f, 0.058928f, -0.082616f, 0.107883f, 0.164547f, -0.083290f, 0.038757f, 0.230070f, 0.022230f, 0.038566f, 0.277449f, 0.218361f, 0.018870f, 0.173424f, 0.229597f, -0.078819f, -0.046600f, 0.065942f, -0.186852f, + -0.312339f, -0.210737f, -0.344486f, -0.512305f, -0.470286f, -0.526306f, -0.670302f, -0.707501f, -0.625583f, -0.661333f, -0.622620f, -0.467428f, -0.372981f, -0.194003f, -0.047585f, 0.110915f, 0.385084f, 0.447826f, 0.486330f, 0.753865f, 0.737255f, 0.495165f, 0.637497f, 0.498235f, 0.198944f, 0.219604f, 0.310351f, 0.152225f, 0.099748f, 0.232064f, 0.166025f, 0.000065f, 0.080224f, 0.180659f, 0.046047f, 0.013615f, 0.135175f, 0.032066f, -0.138082f, 0.046279f, 0.111051f, -0.030849f, 0.099641f, 0.262824f, 0.105030f, 0.060082f, 0.231756f, 0.126998f, -0.043754f, 0.028291f, -0.058023f, -0.274646f, -0.336525f, -0.334491f, -0.422006f, -0.477077f, -0.394185f, -0.379004f, -0.432197f, -0.389980f, -0.321971f, -0.371247f, -0.339505f, -0.228218f, -0.181078f, -0.173359f, -0.070056f, 0.043409f, 0.051583f, 0.157972f, 0.265712f, 0.279276f, 0.276311f, 0.311838f, 0.288432f, 0.206857f, 0.175875f, 0.156911f, 0.109088f, 0.089525f, 0.109819f, 0.097875f, 0.067044f, 0.069779f, 0.076308f, 0.064924f, 0.063617f, 0.081259f, 0.072097f, 0.051717f, 0.042079f, 0.038055f, 0.007774f, -0.000912f, -0.008447f, -0.044055f, + -0.059026f, -0.055322f, -0.046117f, -0.038582f, -0.023489f, -0.011418f, -0.009050f, -0.001928f, 0.015640f, 0.029270f, 0.038354f, 0.037994f, 0.028837f, 0.019493f, 0.007197f, 0.000940f, 0.003902f, -0.001205f, -0.013564f, -0.014275f, -0.021844f, -0.039608f, -0.043868f, -0.042338f, -0.056740f, -0.061569f, -0.054872f, -0.062339f, -0.074965f, -0.071007f, -0.073147f, -0.081094f, -0.073479f, -0.061438f, -0.064392f, -0.058010f, -0.039149f, -0.031023f, -0.027964f, -0.007986f, 0.003399f, 0.006643f, 0.018801f, 0.034671f, 0.037351f, 0.039096f, 0.047694f, 0.046346f, 0.042189f, 0.048363f, 0.053029f, 0.053609f, 0.055421f, 0.059294f, 0.053976f, 0.051122f, 0.051615f, 0.052096f, 0.044135f, 0.037892f, 0.027707f, 0.014335f, 0.004179f, -0.000649f, -0.004193f, -0.007647f, -0.011086f, -0.012754f, -0.013588f, -0.012771f, -0.011211f, -0.009052f, -0.009727f, -0.008942f, -0.008338f, -0.007979f, -0.007906f, -0.006086f, -0.005334f, -0.003692f, -0.002608f, -0.000554f}, + {0.006979f, 0.009659f, -0.005684f, 0.000399f, 0.000302f, -0.006916f, 0.009235f, -0.003690f, -0.003628f, 0.002643f, -0.009556f, -0.004280f, 0.010211f, 0.002320f, -0.004186f, 0.007265f, 0.002233f, 0.001551f, -0.001517f, 0.003539f, -0.000081f, -0.012242f, -0.000605f, -0.004548f, -0.000572f, -0.000276f, -0.011737f, 0.000172f, -0.007555f, 0.000399f, 0.001157f, 0.005218f, 0.006227f, 0.002051f, 0.001525f, 0.001135f, 0.005374f, -0.002973f, 0.001817f, 0.000330f, 0.000817f, 0.001113f, -0.001655f, 0.004812f, 0.007188f, -0.013889f, 0.006411f, -0.003646f, -0.008379f, -0.005355f, 0.010608f, 0.005318f, -0.003633f, 0.006025f, 0.001721f, -0.003836f, 0.003711f, 0.000060f, -0.000045f, 0.000536f, 0.000686f, -0.001468f, 0.000039f, 0.000764f, -0.000657f, 0.004551f, -0.002889f, -0.006433f, -0.006254f, -0.000064f, 0.002042f, -0.000420f, 0.000250f, 0.003472f, -0.001427f, 0.006114f, -0.006540f, -0.001966f, 0.004946f, 0.005364f, -0.003761f, 0.006049f, 0.002086f, -0.001607f, -0.004157f, -0.001936f, -0.001807f, -0.001669f, -0.001681f, -0.000845f, -0.000290f, -0.000930f, -0.001771f, 0.000484f, 0.001168f, -0.002481f, + -0.000701f, -0.000826f, 0.001205f, -0.002166f, -0.000549f, 0.000260f, 0.005082f, 0.000441f, -0.004183f, 0.002638f, -0.002288f, -0.003227f, 0.000734f, -0.006866f, -0.000906f, -0.005133f, 0.001740f, 0.003293f, 0.003035f, 0.002528f, -0.005488f, -0.000334f, -0.004564f, 0.004841f, -0.009327f, -0.005200f, 0.004575f, -0.010087f, -0.001235f, -0.000630f, 0.002491f, 0.002259f, 0.004883f, 0.010545f, 0.004752f, -0.001279f, -0.000134f, -0.003732f, -0.003033f, -0.018537f, -0.017196f, -0.001120f, 0.012544f, -0.003120f, 0.009996f, 0.000905f, 0.002779f, -0.003125f, -0.014482f, 0.007447f, 0.002160f, -0.004310f, 0.003424f, -0.007606f, -0.001669f, 0.004325f, 0.001782f, 0.013483f, -0.009367f, 0.008182f, -0.004362f, -0.010609f, -0.005055f, -0.002891f, -0.003043f, 0.003760f, 0.003042f, -0.008557f, -0.003948f, -0.004875f, -0.001952f, 0.008259f, 0.008685f, 0.009481f, -0.007088f, 0.001182f, -0.004498f, -0.000578f, -0.003807f, -0.004685f, -0.005823f, -0.006385f, 0.003380f, 0.000997f, -0.001126f, -0.002325f, 0.000698f, 0.003583f, -0.003802f, -0.003220f, -0.001787f, 0.004102f, -0.001576f, -0.000794f, -0.001945f, -0.002093f, + -0.000670f, 0.000887f, -0.000206f, -0.000361f, 0.000531f, 0.000886f, -0.000423f, -0.000415f, 0.002474f, -0.002097f, -0.001473f, 0.000988f, -0.001436f, 0.002008f, -0.001441f, -0.001438f, -0.000448f, -0.000287f, 0.001108f, -0.000700f, -0.000812f, 0.000728f, -0.000005f, -0.002106f, 0.000497f, 0.000444f, -0.001738f, 0.006820f, -0.006457f, -0.008534f, -0.007248f, 0.000132f, -0.002817f, -0.002421f, -0.005718f, 0.001177f, -0.006397f, -0.000548f, -0.002586f, 0.009857f, -0.006314f, -0.007085f, -0.015556f, -0.020370f, -0.004832f, -0.009122f, -0.008242f, -0.002061f, 0.004281f, -0.005226f, -0.012099f, 0.007480f, -0.017583f, 0.005237f, -0.002888f, -0.003243f, 0.011500f, 0.007987f, 0.004304f, 0.001515f, -0.001889f, -0.001882f, -0.004216f, 0.001787f, 0.007830f, -0.006297f, 0.007429f, 0.006734f, 0.002053f, 0.000953f, 0.003139f, 0.005150f, -0.011406f, -0.005029f, 0.011030f, -0.008535f, 0.000796f, -0.000213f, 0.006779f, -0.000878f, -0.002470f, 0.001232f, 0.011443f, 0.006259f, 0.004036f, 0.003636f, 0.006414f, -0.010059f, 0.007833f, -0.008213f, 0.007259f, 0.004706f, -0.002044f, -0.001457f, -0.003330f, -0.004511f, + -0.007220f, -0.000385f, -0.002195f, -0.005834f, -0.006360f, -0.003638f, -0.003664f, -0.000661f, -0.000348f, -0.001775f, 0.008714f, -0.003568f, -0.001528f, -0.005867f, 0.006068f, 0.000031f, -0.001234f, 0.001272f, -0.002424f, -0.004224f, 0.000183f, 0.002389f, -0.000194f, -0.000405f, -0.002653f, 0.000799f, -0.000816f, -0.002460f, 0.000252f, 0.000562f, 0.001451f, -0.000298f, 0.000984f, 0.000768f, 0.002117f, 0.000720f, -0.002119f, 0.000115f, 0.001235f, -0.000299f, -0.001847f, -0.001190f, 0.002934f, 0.001498f, -0.001442f, -0.000642f, -0.000517f, 0.004155f, -0.010838f, -0.000174f, -0.005131f, -0.009795f, -0.004680f, -0.001757f, -0.006974f, -0.002247f, -0.006442f, -0.002401f, 0.004913f, 0.006808f, -0.011249f, -0.006272f, 0.003562f, -0.002148f, -0.012285f, 0.008182f, 0.014426f, 0.003116f, -0.003518f, -0.006717f, 0.001509f, 0.007084f, 0.013037f, -0.006610f, -0.002883f, -0.008353f, -0.006854f, 0.007328f, 0.007185f, -0.010155f, 0.005900f, -0.003202f, -0.006626f, 0.010392f, -0.000134f, 0.005696f, -0.014257f, 0.001035f, -0.009182f, 0.002113f, -0.011383f, -0.007019f, -0.001954f, -0.002574f, 0.023396f, 0.007519f, + 0.005981f, 0.004644f, -0.017621f, 0.009843f, 0.006692f, -0.003813f, -0.000559f, 0.007684f, -0.001205f, 0.008115f, 0.009212f, 0.009334f, -0.005510f, 0.000730f, -0.003132f, 0.004990f, -0.004540f, -0.004621f, 0.002945f, -0.004339f, 0.001942f, 0.002951f, 0.000028f, 0.005512f, 0.002034f, -0.010338f, -0.001391f, -0.001283f, 0.003125f, -0.011726f, -0.003922f, -0.002948f, 0.008155f, -0.002490f, -0.001522f, -0.006324f, -0.001827f, 0.000449f, -0.000745f, -0.002929f, -0.000063f, -0.001892f, 0.001994f, 0.000790f, -0.000135f, 0.000374f, 0.000636f, -0.001494f, -0.004535f, 0.002347f, 0.000819f, -0.002493f, 0.001053f, -0.001353f, 0.000359f, 0.000564f, 0.001403f, -0.000330f, -0.000695f, -0.001078f, 0.000833f, -0.001791f, 0.001536f, -0.002043f, -0.000283f, -0.000152f, 0.001185f, -0.001352f, -0.000712f, -0.001973f, -0.001333f, -0.001821f, -0.014629f, -0.008040f, 0.005874f, -0.006297f, 0.016989f, 0.007581f, 0.016629f, -0.000186f, -0.008253f, -0.008639f, -0.011814f, 0.017908f, -0.004458f, 0.008215f, 0.009024f, 0.001947f, 0.006326f, 0.005882f, 0.005583f, 0.002317f, -0.011876f, -0.000618f, -0.004648f, -0.001712f, + 0.007983f, -0.000682f, -0.000821f, 0.005679f, 0.003456f, 0.005878f, -0.005223f, -0.018540f, -0.011191f, -0.006999f, 0.013580f, -0.012326f, -0.003849f, 0.008419f, -0.001053f, 0.001594f, -0.010483f, 0.018027f, 0.000870f, -0.006979f, 0.014097f, -0.008702f, 0.021899f, 0.011402f, -0.005085f, 0.002573f, -0.006390f, -0.004265f, -0.020399f, 0.007209f, -0.009359f, -0.001416f, -0.000915f, -0.004422f, 0.008568f, -0.003375f, -0.008978f, -0.008615f, 0.001884f, -0.007871f, -0.008811f, 0.004972f, 0.000641f, 0.006270f, -0.003520f, -0.018504f, 0.006266f, 0.008054f, 0.010219f, -0.009955f, -0.011341f, 0.001465f, 0.018220f, 0.002958f, -0.009619f, -0.004345f, -0.001740f, 0.005033f, 0.000785f, 0.005358f, -0.005533f, -0.002050f, -0.001195f, -0.006643f, -0.005571f, 0.008152f, -0.001494f, 0.003193f, -0.000844f, -0.002332f, -0.005327f, -0.000510f, 0.000070f, 0.002016f, -0.001104f, 0.001872f, -0.001480f, -0.004240f, -0.001829f, -0.000602f, -0.000231f, -0.000784f, 0.003044f, 0.000157f, 0.003306f, -0.001185f, -0.000379f, -0.000561f, -0.003878f, -0.000040f, 0.001808f, 0.001908f, 0.001170f, 0.014516f, -0.013342f, 0.006579f, + 0.017412f, -0.012598f, 0.003586f, -0.007151f, -0.013378f, 0.019893f, 0.007671f, 0.018478f, 0.017344f, 0.002370f, -0.013522f, -0.008533f, 0.007286f, -0.001034f, 0.003143f, -0.014959f, 0.001729f, -0.026469f, -0.010886f, -0.020675f, 0.012845f, -0.011803f, -0.000241f, 0.003650f, -0.003215f, -0.005447f, 0.006414f, 0.006123f, 0.018394f, -0.002661f, -0.003857f, -0.014067f, -0.011727f, 0.011514f, 0.002689f, 0.003895f, 0.021969f, -0.006704f, 0.000341f, 0.011482f, -0.005013f, 0.005251f, 0.004186f, 0.011494f, 0.010633f, -0.007335f, -0.000938f, -0.014890f, 0.015580f, -0.010200f, -0.013148f, -0.012935f, 0.008325f, -0.004858f, -0.006833f, 0.015050f, -0.004515f, 0.015606f, -0.009458f, -0.007441f, -0.001802f, 0.010193f, 0.013543f, -0.001097f, -0.014191f, 0.005120f, -0.008994f, 0.018665f, 0.004099f, 0.010933f, -0.014868f, -0.006738f, 0.004257f, -0.003944f, 0.009306f, 0.001269f, -0.004915f, 0.005367f, 0.012268f, 0.016922f, 0.013334f, 0.000131f, -0.002849f, -0.000270f, 0.003062f, 0.000201f, -0.002716f, 0.001934f, -0.002249f, -0.000475f, 0.005081f, 0.000198f, -0.002147f, 0.005132f, -0.001423f, -0.002820f, + 0.001598f, 0.001762f, 0.000149f, -0.003317f, 0.001447f, -0.002300f, 0.000717f, -0.004491f, -0.005225f, 0.001317f, 0.002326f, -0.000211f, 0.004512f, -0.001590f, 0.002188f, 0.008788f, -0.023096f, 0.008103f, 0.006773f, 0.004664f, -0.017475f, 0.013366f, 0.021853f, -0.021301f, 0.008083f, -0.013068f, 0.008558f, 0.001240f, 0.007685f, -0.006259f, -0.000536f, 0.005131f, -0.014608f, -0.007137f, -0.006326f, 0.011603f, 0.012051f, -0.003888f, 0.005635f, -0.002873f, 0.008895f, 0.011503f, 0.004403f, 0.003539f, -0.011619f, -0.004252f, -0.014498f, -0.015917f, -0.011242f, 0.001171f, -0.005404f, -0.000652f, -0.006735f, -0.015845f, -0.005445f, 0.003346f, 0.001405f, -0.000870f, 0.024090f, -0.019432f, 0.007163f, -0.009627f, -0.002854f, -0.005961f, -0.006186f, 0.010359f, -0.006157f, 0.000888f, -0.007449f, -0.004843f, -0.009041f, 0.012417f, -0.011355f, 0.010207f, -0.002663f, 0.010198f, -0.000948f, 0.001637f, -0.001076f, 0.009863f, 0.005608f, -0.000171f, 0.020906f, 0.000945f, -0.010514f, 0.005628f, -0.009459f, -0.011471f, -0.013987f, 0.013697f, 0.004782f, 0.012216f, 0.012315f, 0.014581f, 0.008482f, -0.001621f, + -0.002610f, -0.002491f, 0.013898f, -0.001922f, 0.015587f, 0.003451f, -0.000681f, -0.002257f, 0.005340f, 0.008072f, 0.002067f, 0.003393f, 0.001086f, -0.000929f, 0.001546f, -0.002492f, 0.004189f, 0.000321f, 0.003593f, -0.000937f, 0.003411f, -0.000235f, -0.005453f, 0.002835f, 0.003751f, 0.000129f, 0.003053f, -0.000828f, 0.000175f, -0.003019f, 0.002640f, -0.000619f, 0.001295f, 0.005922f, 0.005947f, -0.024359f, -0.001750f, 0.002968f, -0.005427f, -0.019216f, 0.021966f, -0.001577f, 0.000976f, 0.018354f, -0.005007f, -0.019224f, 0.006898f, 0.012332f, 0.023823f, -0.001676f, 0.010171f, 0.001892f, -0.020634f, -0.006266f, -0.010640f, 0.010451f, 0.006223f, 0.005393f, -0.007604f, -0.001564f, -0.000690f, 0.001768f, -0.006848f, 0.009737f, 0.002932f, -0.008508f, 0.012411f, 0.001595f, -0.013472f, -0.011606f, 0.003396f, 0.014660f, 0.013472f, -0.018644f, 0.036450f, -0.001913f, 0.000894f, 0.009859f, -0.001227f, -0.004867f, -0.000107f, 0.023191f, -0.011437f, 0.011421f, -0.002585f, 0.016029f, 0.005090f, 0.014361f, -0.005260f, -0.011456f, 0.008261f, 0.012274f, -0.005889f, -0.013900f, -0.014777f, -0.013310f, + -0.005736f, -0.002743f, 0.014038f, 0.000275f, 0.012240f, -0.001500f, -0.003684f, 0.011829f, -0.010100f, -0.020097f, -0.005052f, -0.012846f, -0.011766f, -0.022332f, 0.016918f, 0.014467f, 0.006258f, -0.034601f, 0.008428f, 0.007253f, -0.002281f, -0.001038f, -0.011747f, 0.016498f, 0.008775f, 0.006526f, 0.004362f, 0.015158f, -0.000992f, -0.001092f, 0.001453f, -0.000157f, 0.003862f, 0.001724f, 0.000411f, 0.004658f, -0.002454f, -0.000615f, -0.003226f, 0.001056f, 0.001560f, 0.005145f, -0.003222f, -0.000535f, -0.001042f, 0.003979f, -0.001457f, 0.001505f, 0.002713f, 0.003202f, -0.002358f, 0.007627f, 0.000368f, -0.000180f, -0.002398f, 0.003018f, -0.004350f, 0.001738f, 0.000600f, -0.001159f, 0.002068f, 0.003761f, -0.000315f, -0.006673f, -0.001898f, -0.000886f, -0.014054f, -0.000667f, 0.000801f, 0.010302f, -0.014780f, 0.000997f, -0.002500f, -0.005796f, -0.030409f, -0.003394f, 0.013974f, 0.011256f, 0.014325f, 0.001942f, -0.016464f, 0.043060f, 0.017749f, 0.029363f, 0.002783f, -0.012500f, -0.005345f, -0.003890f, -0.018426f, -0.000901f, -0.007386f, 0.009366f, -0.000204f, 0.001184f, -0.006076f, -0.007532f, + -0.015621f, 0.005416f, 0.001263f, 0.000992f, 0.007678f, -0.000421f, 0.003116f, -0.001300f, -0.013606f, -0.010137f, 0.007828f, 0.000278f, 0.019197f, -0.024351f, 0.019423f, 0.012295f, -0.008927f, -0.017547f, -0.028008f, 0.006095f, 0.021661f, -0.010991f, 0.020959f, -0.001443f, -0.001195f, 0.005094f, -0.006475f, -0.024421f, 0.002709f, 0.011866f, 0.004947f, -0.010487f, -0.003050f, -0.006500f, 0.005202f, 0.012162f, -0.000874f, 0.003262f, -0.001870f, 0.011714f, -0.005401f, -0.003721f, 0.007601f, -0.006602f, 0.017856f, -0.004634f, -0.009422f, 0.006934f, -0.016644f, -0.008163f, -0.000112f, 0.006685f, -0.007356f, 0.003244f, -0.002837f, 0.003805f, -0.000130f, 0.004482f, 0.003473f, -0.001275f, 0.001974f, -0.007586f, 0.003960f, -0.000881f, -0.010746f, -0.003473f, -0.003227f, -0.006147f, -0.000255f, 0.001997f, -0.005162f, -0.003351f, -0.000485f, -0.006495f, 0.000224f, 0.001856f, -0.001705f, -0.006891f, 0.000372f, 0.000039f, -0.005577f, 0.002332f, 0.003679f, -0.004192f, -0.000536f, 0.001397f, 0.000168f, 0.002179f, 0.005961f, 0.005295f, -0.005589f, -0.004162f, 0.006931f, 0.004673f, -0.033038f, 0.023607f, + 0.021468f, 0.025141f, -0.008069f, -0.022614f, 0.007940f, 0.008946f, -0.033628f, -0.030715f, 0.029689f, 0.003135f, -0.014474f, 0.011117f, -0.021013f, -0.024024f, 0.003418f, 0.062172f, 0.028929f, 0.011445f, -0.016921f, 0.000161f, -0.006037f, 0.000370f, -0.007108f, -0.003586f, -0.007897f, 0.002118f, 0.017722f, 0.003390f, 0.021850f, -0.008790f, -0.007261f, 0.003872f, 0.015260f, -0.003054f, -0.002224f, -0.032705f, -0.001408f, -0.018481f, -0.001004f, 0.025114f, 0.017990f, -0.006819f, 0.017581f, 0.034900f, -0.016718f, 0.009976f, 0.028998f, -0.021468f, 0.030649f, -0.002708f, 0.012588f, -0.007428f, 0.001260f, -0.004302f, 0.004225f, 0.006955f, 0.030396f, -0.011823f, -0.003878f, 0.007753f, -0.014222f, 0.008785f, 0.004661f, -0.008330f, -0.013862f, 0.029811f, -0.002029f, -0.016632f, -0.005488f, 0.018419f, -0.007865f, 0.012446f, -0.000129f, 0.000732f, -0.019823f, -0.021709f, -0.010405f, -0.018545f, -0.016649f, -0.018175f, -0.001144f, -0.004472f, 0.008709f, -0.001316f, 0.001536f, -0.001829f, 0.010969f, 0.006823f, 0.000744f, -0.013833f, 0.000458f, -0.002748f, -0.010195f, -0.003096f, -0.005274f, 0.005133f, + 0.001982f, -0.007136f, -0.002373f, -0.005521f, -0.004225f, -0.000696f, 0.003753f, 0.003512f, 0.003837f, 0.006466f, -0.004164f, 0.000635f, 0.004128f, -0.003119f, -0.004064f, 0.004687f, -0.006975f, -0.002938f, -0.002195f, 0.002871f, 0.001246f, 0.004743f, 0.000785f, 0.000282f, 0.004005f, -0.002093f, -0.004851f, 0.040271f, 0.007376f, 0.005580f, -0.020899f, -0.012316f, 0.001180f, 0.004524f, 0.008297f, 0.009243f, -0.039966f, 0.001677f, 0.002642f, 0.028816f, 0.004741f, 0.007230f, -0.002646f, 0.026200f, -0.042936f, 0.001185f, 0.022148f, -0.025778f, 0.006513f, 0.004886f, 0.020858f, 0.003940f, 0.002306f, -0.007192f, 0.000761f, -0.022158f, 0.007548f, -0.005644f, 0.003989f, 0.005840f, -0.003684f, -0.016847f, 0.006196f, -0.013331f, -0.022852f, 0.012796f, -0.012889f, 0.008364f, -0.021486f, -0.013749f, -0.002209f, -0.006844f, 0.005218f, -0.009321f, 0.023702f, -0.000433f, 0.022601f, -0.023953f, -0.020051f, -0.006615f, 0.000389f, -0.000560f, -0.006939f, 0.020118f, 0.016616f, 0.042138f, -0.006742f, 0.026892f, -0.015808f, -0.002885f, 0.008201f, -0.032281f, 0.036687f, -0.001154f, 0.022855f, -0.001075f, + -0.031958f, -0.019462f, 0.013502f, -0.042999f, 0.022328f, 0.005975f, 0.032576f, 0.040843f, 0.005363f, -0.030599f, -0.022985f, -0.009672f, 0.023388f, -0.003045f, -0.005642f, 0.001096f, -0.008552f, 0.001043f, -0.006259f, -0.009422f, -0.003179f, -0.015037f, -0.000724f, 0.000453f, -0.006879f, -0.006406f, -0.008399f, -0.006210f, -0.002887f, 0.003496f, 0.007125f, 0.002417f, -0.001199f, 0.006277f, -0.004491f, -0.002736f, 0.001497f, 0.003198f, 0.004138f, -0.004421f, 0.005239f, -0.005687f, -0.002584f, -0.008187f, -0.013886f, 0.008297f, 0.001437f, -0.008143f, -0.007979f, -0.001801f, -0.011047f, 0.001214f, 0.000051f, -0.003947f, 0.008051f, 0.020652f, 0.031635f, 0.011003f, -0.013227f, 0.030098f, -0.032367f, -0.003399f, -0.010023f, 0.003947f, 0.025650f, -0.023362f, 0.057948f, 0.007638f, 0.014252f, -0.017180f, -0.023568f, 0.008021f, 0.000048f, 0.049247f, -0.007235f, -0.017183f, -0.028365f, -0.019111f, 0.013577f, 0.008713f, 0.007863f, -0.003675f, -0.027944f, -0.042930f, 0.003019f, -0.025935f, 0.034137f, 0.004345f, 0.027680f, -0.017370f, 0.011451f, -0.011291f, 0.014235f, 0.040114f, -0.006906f, -0.004421f, + -0.006308f, 0.010349f, 0.013158f, 0.006716f, 0.002714f, 0.003982f, 0.017235f, 0.015535f, -0.009304f, -0.014010f, -0.012693f, -0.014037f, 0.045781f, 0.017982f, -0.027278f, 0.020616f, -0.006420f, -0.022310f, -0.016142f, 0.007913f, 0.016565f, -0.031725f, -0.041403f, 0.004357f, -0.018660f, 0.053754f, 0.027743f, -0.009521f, -0.006455f, 0.011182f, 0.024030f, 0.005969f, -0.004460f, -0.007451f, -0.037608f, -0.002029f, -0.009468f, -0.040757f, 0.014981f, 0.025186f, -0.004490f, 0.012458f, 0.006705f, 0.025677f, -0.014650f, -0.004164f, 0.008964f, -0.004390f, -0.012111f, -0.013596f, -0.000742f, -0.008356f, -0.020136f, -0.004433f, -0.009498f, 0.008223f, -0.004240f, -0.011287f, 0.007147f, 0.002626f, 0.000669f, -0.007160f, 0.007113f, 0.001662f, -0.012832f, 0.003887f, 0.004483f, -0.006221f, -0.017665f, -0.008922f, -0.003612f, -0.002315f, -0.000684f, -0.006960f, -0.001340f, -0.005296f, 0.001899f, 0.001551f, -0.003876f, 0.000288f, -0.000766f, -0.005660f, -0.011181f, -0.001931f, 0.001761f, 0.005666f, 0.002604f, -0.008600f, -0.000217f, 0.005715f, 0.002311f, 0.002188f, -0.008918f, 0.002598f, -0.003756f, -0.004320f, + -0.004750f, -0.005326f, 0.000468f, -0.000104f, -0.005762f, 0.002579f, -0.015789f, -0.025030f, 0.014183f, -0.007970f, 0.021761f, 0.010638f, -0.024514f, -0.009645f, -0.012622f, 0.005683f, -0.032862f, 0.022461f, 0.030247f, -0.011990f, 0.018706f, -0.004148f, -0.008876f, 0.015440f, -0.023143f, 0.014646f, 0.024497f, 0.007390f, 0.042562f, 0.021410f, -0.018424f, 0.018913f, 0.007388f, 0.016687f, 0.000336f, 0.023667f, 0.019694f, 0.031524f, 0.011268f, -0.011601f, -0.014937f, -0.018661f, -0.002231f, 0.048611f, 0.000627f, 0.020867f, -0.030667f, 0.063342f, -0.019031f, -0.048705f, -0.023670f, 0.040187f, 0.002746f, -0.005000f, -0.005828f, -0.002384f, 0.029164f, -0.021185f, 0.016728f, -0.003890f, 0.036827f, 0.057367f, 0.028878f, 0.027930f, -0.020587f, 0.032849f, 0.019161f, 0.019724f, 0.021602f, 0.032849f, -0.007104f, -0.055923f, -0.036585f, -0.040485f, 0.010270f, 0.015132f, 0.011339f, -0.008993f, 0.018728f, 0.050365f, 0.003132f, 0.004396f, 0.011789f, -0.002268f, -0.044082f, -0.046504f, -0.016446f, 0.009875f, 0.004661f, -0.001473f, -0.027245f, 0.007375f, 0.000984f, 0.002753f, 0.013778f, -0.002580f, + 0.008637f, 0.003614f, 0.017092f, -0.003849f, 0.011304f, -0.008676f, 0.001754f, 0.002370f, 0.019896f, 0.009831f, 0.019862f, 0.002820f, 0.009958f, -0.003069f, 0.001951f, 0.009200f, -0.005911f, -0.012596f, 0.002714f, -0.007288f, -0.015121f, -0.011129f, -0.003540f, -0.002657f, 0.019384f, 0.004670f, -0.000356f, -0.005437f, 0.002777f, 0.000655f, -0.007401f, -0.007505f, -0.006193f, 0.005012f, 0.012289f, -0.001041f, 0.000874f, 0.002141f, 0.005360f, 0.004527f, 0.013120f, -0.012945f, 0.008235f, 0.020752f, 0.024374f, 0.008807f, 0.011449f, 0.018977f, -0.014955f, 0.044136f, 0.017416f, 0.008527f, -0.012593f, -0.033867f, -0.013656f, 0.018464f, -0.001836f, -0.047994f, 0.064622f, -0.022701f, -0.012658f, 0.019902f, 0.000983f, -0.006460f, 0.004688f, -0.012557f, -0.015165f, -0.003325f, -0.035153f, 0.008680f, -0.037776f, 0.001028f, -0.029946f, -0.033745f, -0.006759f, -0.007197f, -0.007391f, -0.024695f, 0.010832f, 0.026386f, 0.007090f, 0.020196f, -0.035058f, 0.034548f, 0.063015f, 0.006490f, -0.025292f, 0.039329f, -0.032277f, -0.051188f, 0.085172f, -0.008775f, 0.006057f, -0.005970f, -0.038069f, 0.029336f, + -0.034509f, 0.014897f, 0.052050f, -0.001090f, 0.071485f, -0.055826f, 0.053857f, 0.015636f, -0.035347f, -0.018591f, 0.006769f, -0.034046f, -0.016915f, 0.037799f, -0.037106f, 0.024590f, -0.024943f, 0.013613f, 0.039583f, -0.086915f, -0.038244f, 0.039918f, -0.074500f, 0.026263f, 0.023148f, 0.042554f, 0.037741f, 0.016890f, -0.002989f, 0.024937f, 0.037442f, -0.040700f, 0.040626f, -0.000852f, 0.014092f, -0.002239f, 0.012788f, 0.003187f, -0.007658f, 0.002693f, -0.011720f, -0.003979f, 0.003114f, -0.002217f, -0.020358f, 0.012744f, -0.003527f, 0.016632f, 0.010117f, -0.014600f, 0.011516f, 0.013847f, 0.010258f, 0.004065f, 0.007376f, 0.004237f, 0.009378f, -0.028534f, 0.016035f, -0.003878f, -0.007612f, 0.019990f, -0.016051f, -0.013343f, 0.006934f, -0.016949f, -0.013500f, -0.005511f, -0.012271f, -0.016622f, 0.009248f, -0.025141f, -0.074580f, -0.019554f, 0.024581f, 0.057547f, -0.018262f, 0.028999f, 0.000900f, 0.013636f, 0.029968f, 0.019225f, 0.051827f, -0.013493f, 0.002285f, 0.014099f, -0.045746f, -0.029588f, -0.013584f, -0.014937f, 0.010619f, 0.000669f, 0.003957f, -0.023999f, -0.003882f, -0.031736f, + -0.025645f, 0.012254f, 0.063969f, 0.036652f, -0.016733f, -0.020567f, 0.030522f, 0.036376f, -0.021668f, 0.009518f, 0.028143f, -0.011235f, 0.061185f, 0.020685f, 0.009042f, -0.047267f, 0.029156f, 0.005866f, 0.022987f, -0.004954f, 0.005979f, -0.007897f, -0.010100f, -0.074467f, 0.019770f, 0.051305f, 0.025463f, 0.006766f, -0.001382f, 0.025815f, -0.041765f, -0.077359f, 0.005803f, 0.102296f, 0.024702f, 0.081129f, 0.077088f, 0.000908f, 0.006779f, -0.049109f, -0.043827f, -0.004800f, -0.037590f, 0.051175f, -0.111740f, 0.021007f, -0.041830f, -0.089401f, 0.019890f, 0.041678f, 0.089316f, 0.007891f, 0.004513f, -0.057000f, 0.018634f, 0.026760f, -0.039717f, -0.003828f, 0.002864f, 0.041598f, -0.011134f, -0.026725f, 0.063194f, 0.013256f, -0.022521f, -0.000920f, -0.036504f, 0.004717f, -0.034549f, -0.007087f, -0.001143f, -0.017011f, 0.005309f, -0.013760f, -0.014456f, -0.008028f, -0.000106f, -0.007000f, 0.011741f, 0.032637f, -0.001801f, 0.000294f, 0.012251f, -0.029709f, -0.017855f, -0.003644f, 0.009021f, 0.009292f, -0.025745f, -0.014674f, 0.020549f, 0.012011f, 0.007196f, 0.004876f, 0.021705f, -0.000881f, + 0.000442f, 0.002172f, -0.014539f, 0.002597f, 0.020765f, -0.010614f, -0.019716f, 0.054789f, 0.095230f, 0.002665f, 0.025907f, 0.017384f, -0.050285f, -0.014029f, 0.049854f, 0.015950f, 0.021896f, -0.012356f, 0.014383f, 0.008714f, -0.017882f, 0.000981f, 0.025796f, 0.027699f, 0.033380f, -0.014625f, -0.004283f, -0.073912f, -0.069683f, 0.009783f, -0.043146f, 0.001682f, 0.037125f, 0.009220f, 0.004274f, -0.012680f, -0.008474f, 0.024116f, 0.058191f, -0.042197f, -0.024510f, -0.005343f, -0.041378f, -0.002813f, -0.039888f, -0.012157f, -0.042337f, 0.037443f, -0.051268f, -0.003971f, 0.009023f, 0.024943f, 0.089164f, 0.119328f, 0.030675f, -0.031137f, -0.063739f, -0.005421f, -0.043657f, -0.016877f, -0.067784f, 0.010305f, 0.065002f, 0.048278f, 0.038936f, 0.004897f, 0.009296f, 0.066984f, 0.064683f, 0.047858f, -0.004086f, 0.030280f, 0.010927f, 0.015062f, -0.077085f, 0.023390f, 0.008326f, -0.017539f, 0.046182f, 0.063158f, -0.008941f, -0.000869f, -0.031111f, -0.131181f, -0.002736f, 0.039059f, -0.019283f, 0.091149f, 0.064408f, -0.029827f, 0.005813f, -0.033275f, 0.022420f, 0.006487f, -0.012395f, -0.019826f, + -0.009357f, -0.001648f, 0.013916f, 0.017797f, 0.026690f, 0.000978f, -0.016422f, -0.034808f, 0.001815f, -0.016295f, 0.013149f, -0.015360f, -0.021592f, -0.005082f, -0.005775f, 0.016107f, 0.006410f, -0.005762f, 0.008110f, 0.004853f, 0.006385f, 0.001824f, -0.012387f, -0.019084f, -0.010049f, 0.007584f, 0.015968f, -0.001121f, 0.012973f, 0.000129f, -0.019652f, -0.019878f, 0.005364f, -0.024385f, -0.014168f, 0.000377f, -0.011120f, -0.002689f, 0.006682f, 0.010471f, -0.009486f, -0.016318f, -0.023567f, 0.059823f, 0.042078f, -0.027988f, 0.028395f, 0.044539f, 0.004665f, -0.054984f, -0.066385f, 0.062087f, 0.020703f, 0.014656f, 0.048289f, 0.001464f, -0.021452f, 0.052542f, 0.013458f, -0.039171f, -0.020357f, -0.013944f, 0.017331f, 0.001504f, -0.023959f, 0.009571f, -0.026471f, -0.002219f, -0.012078f, -0.012333f, 0.035285f, 0.066656f, -0.022786f, 0.014171f, 0.030982f, -0.015077f, -0.013550f, 0.013246f, 0.037493f, 0.012516f, -0.029159f, -0.036187f, -0.044306f, 0.024132f, 0.024663f, 0.060592f, -0.028671f, -0.026516f, 0.020931f, 0.036306f, 0.055869f, -0.001098f, -0.103980f, -0.021723f, 0.033313f, 0.033893f, + 0.014872f, -0.019762f, -0.000924f, -0.040995f, 0.006096f, -0.017415f, 0.043017f, 0.062395f, -0.018839f, 0.001906f, -0.036365f, -0.038701f, -0.015287f, -0.078938f, -0.016129f, -0.039846f, 0.035126f, -0.031766f, 0.036447f, 0.045961f, -0.092129f, -0.007074f, -0.039049f, 0.040033f, -0.016333f, 0.014529f, -0.028733f, 0.005313f, -0.024491f, 0.027803f, 0.030127f, 0.052873f, 0.050289f, 0.025647f, 0.048383f, 0.023195f, 0.002777f, 0.026353f, 0.016391f, -0.006522f, 0.021483f, -0.023253f, 0.011458f, -0.011522f, 0.009907f, -0.029473f, 0.017816f, 0.000921f, 0.014089f, -0.021476f, -0.012760f, 0.015247f, -0.005925f, -0.006649f, 0.025919f, -0.019667f, -0.004821f, 0.021924f, 0.010304f, -0.013303f, -0.004588f, 0.009468f, 0.047930f, 0.026696f, 0.020832f, 0.029226f, 0.001809f, 0.031713f, 0.010260f, 0.010363f, 0.015983f, 0.000976f, 0.025720f, 0.008142f, -0.044564f, -0.019766f, -0.011994f, -0.014298f, 0.005540f, -0.008691f, -0.021447f, -0.030580f, -0.049516f, -0.011720f, -0.027378f, -0.051037f, -0.076109f, 0.036998f, 0.039983f, 0.022933f, -0.050740f, -0.069989f, -0.053050f, -0.030720f, 0.012898f, -0.002711f, + -0.067397f, -0.040872f, -0.046080f, 0.065348f, 0.020823f, 0.028240f, -0.020347f, -0.037831f, 0.083702f, 0.020214f, 0.026340f, -0.016352f, 0.005272f, 0.024241f, -0.016720f, 0.019187f, -0.005816f, 0.039370f, 0.056492f, 0.002092f, -0.045013f, -0.036763f, 0.044807f, 0.030123f, 0.039285f, 0.010905f, 0.010081f, -0.020443f, -0.008509f, 0.006102f, 0.027530f, 0.058503f, -0.000206f, -0.110095f, -0.101460f, 0.001154f, -0.024580f, 0.065562f, 0.067290f, -0.074851f, -0.050092f, -0.031639f, 0.093066f, 0.082388f, -0.044521f, 0.012937f, -0.058391f, -0.056790f, 0.034712f, -0.026259f, 0.000625f, -0.008923f, -0.040445f, 0.028844f, 0.030126f, 0.023530f, 0.094235f, -0.069098f, -0.018269f, -0.006595f, 0.024351f, 0.007442f, 0.038918f, -0.137722f, -0.079680f, 0.028593f, 0.043404f, 0.042436f, 0.012342f, -0.045569f, -0.046174f, 0.000657f, 0.027675f, 0.079352f, 0.019553f, -0.026587f, 0.008365f, -0.051592f, 0.032143f, 0.027689f, 0.001813f, 0.044405f, 0.095607f, 0.022799f, -0.069864f, -0.036834f, -0.004809f, 0.007948f, 0.046225f, 0.039959f, 0.019115f, -0.021193f, -0.008483f, -0.014628f, -0.016451f, 0.041410f, + -0.004802f, 0.003723f, -0.016460f, 0.040153f, -0.018607f, -0.007842f, -0.001002f, 0.034832f, 0.015346f, 0.012331f, -0.007370f, -0.044030f, -0.015718f, 0.014176f, 0.035047f, 0.005946f, -0.048776f, -0.067747f, -0.056414f, -0.001467f, 0.008158f, 0.010315f, 0.006744f, -0.018579f, -0.014048f, 0.092221f, -0.061276f, 0.057599f, 0.057154f, 0.036743f, -0.133520f, -0.053431f, 0.044645f, -0.036126f, 0.025811f, -0.009381f, -0.055484f, 0.035650f, 0.010638f, 0.010735f, -0.024548f, -0.088198f, -0.008418f, -0.002535f, 0.000296f, -0.012451f, -0.064413f, 0.048288f, -0.039818f, 0.082355f, -0.008714f, -0.007019f, 0.040000f, 0.029979f, -0.039333f, -0.003475f, -0.029783f, 0.044088f, 0.069140f, 0.052826f, -0.058384f, 0.013258f, -0.039082f, 0.035383f, -0.033951f, -0.013745f, 0.005738f, -0.002790f, 0.037564f, -0.034356f, -0.081052f, 0.021024f, -0.029012f, 0.030444f, 0.031563f, -0.102344f, -0.017433f, -0.019364f, 0.003711f, 0.113736f, -0.030646f, -0.082434f, -0.021989f, 0.072366f, 0.034616f, -0.044547f, -0.014719f, 0.044972f, -0.000221f, 0.055477f, -0.083166f, -0.043698f, 0.049991f, -0.051971f, -0.126784f, -0.037175f, + -0.017315f, 0.144862f, -0.039501f, -0.074505f, 0.039721f, -0.085982f, 0.227393f, 0.021768f, -0.211347f, -0.056027f, -0.037358f, 0.150227f, 0.081151f, -0.094048f, -0.049818f, -0.000978f, 0.110800f, 0.088646f, -0.013835f, -0.069247f, 0.027187f, -0.023253f, 0.099918f, -0.009414f, -0.050271f, -0.041307f, 0.065432f, -0.052139f, 0.033875f, -0.100087f, -0.000519f, -0.003560f, -0.005916f, -0.005603f, 0.021026f, -0.055269f, 0.053734f, 0.004766f, 0.039390f, 0.001901f, -0.063465f, -0.048378f, 0.036024f, 0.043038f, 0.067029f, 0.025375f, -0.006930f, -0.043487f, 0.005755f, 0.011238f, -0.011659f, 0.003213f, 0.043898f, 0.007194f, -0.002179f, -0.049772f, 0.009547f, 0.035961f, 0.013057f, 0.001828f, -0.014760f, -0.035685f, -0.039613f, -0.018379f, 0.012095f, -0.011693f, 0.017510f, -0.016509f, -0.010076f, 0.006794f, 0.001318f, 0.000530f, -0.122044f, 0.034196f, -0.001911f, 0.041683f, 0.100987f, 0.032328f, 0.013938f, -0.056929f, -0.023572f, -0.056893f, -0.068070f, -0.022835f, 0.013426f, 0.038907f, 0.051550f, -0.005795f, 0.029998f, 0.036274f, -0.031573f, -0.064107f, 0.033988f, 0.012178f, -0.052046f, -0.017724f, + 0.049514f, -0.016859f, -0.005504f, 0.045254f, 0.025414f, 0.020105f, 0.006339f, 0.025717f, -0.024602f, -0.059552f, -0.025854f, 0.016941f, -0.024358f, -0.014092f, 0.021842f, 0.001440f, -0.041897f, 0.043688f, 0.009475f, -0.038858f, 0.005016f, -0.009396f, 0.037657f, 0.020918f, -0.015140f, 0.017647f, -0.023145f, -0.052209f, 0.007038f, 0.012679f, -0.004697f, 0.000101f, 0.011090f, -0.022821f, 0.007259f, -0.019544f, 0.011772f, 0.037211f, -0.003894f, 0.016252f, 0.017275f, -0.014421f, 0.000991f, -0.035558f, 0.012223f, 0.020937f, -0.064507f, 0.037465f, -0.040206f, 0.012677f, 0.001941f, -0.000211f, 0.017867f, 0.007182f, 0.042223f, 0.007667f, 0.011995f, -0.006116f, 0.021643f, -0.022686f, -0.014838f, 0.005196f, 0.003695f, -0.019855f, 0.007227f, -0.001797f, -0.005682f, -0.011480f, 0.004177f, -0.002286f, 0.022900f, -0.005873f, 0.002812f, 0.016307f, -0.011375f, 0.011322f, -0.006972f, 0.003955f, -0.011379f, -0.010034f, -0.011363f, -0.003040f, -0.005058f, 0.008599f, 0.006253f, -0.026766f, -0.007214f, -0.007841f, 0.018717f, -0.011063f, 0.007063f, 0.003169f, -0.029682f, 0.009881f, 0.019438f, 0.001240f, + -0.007152f, 0.003194f, -0.008647f, -0.004443f, 0.006522f, 0.098913f, -0.003678f, -0.003216f, -0.027527f, -0.026925f, 0.020260f, -0.001134f, 0.017524f, 0.000365f, -0.009752f, -0.013011f, 0.006602f, -0.018237f, 0.018442f, -0.017177f, 0.026913f, -0.021822f, 0.015636f, -0.018471f, -0.004231f, -0.002963f, -0.017335f, -0.013153f, 0.003777f, -0.007766f, -0.005559f, -0.000128f, -0.013073f, 0.001714f, -0.002700f, 0.004125f, -0.003177f, 0.007546f, -0.026096f, 0.023637f, -0.009027f, -0.007764f, 0.017781f, -0.014403f, 0.000814f, -0.017987f, -0.015887f, 0.011432f, 0.009939f, -0.012651f, -0.008318f, 0.005060f, -0.000978f, -0.022006f, 0.005459f, 0.003833f, -0.000189f, 0.014397f, -0.005530f, -0.006238f, -0.006107f, -0.015047f, -0.004268f, 0.015703f, -0.016937f, 0.004270f, -0.008314f, -0.002107f, 0.000874f, -0.005141f, 0.003489f, 0.000042f, 0.010798f, -0.016053f, -0.001595f, 0.010274f, -0.020874f, 0.011976f, -0.009526f, 0.000076f, 0.009214f, -0.004645f, -0.009643f, 0.004191f, -0.001903f, -0.002773f, -0.000936f, -0.006799f, -0.000411f, 0.006899f, -0.000705f, -0.003364f, 0.000968f, -0.005913f, 0.003771f, 0.002851f, + 0.001455f, -0.004800f, -0.001677f, 0.005949f, -0.008003f, 0.007612f, -0.003813f, 0.003250f, 0.008297f, -0.010440f, 0.002178f, 0.000581f, -0.013324f, 0.002251f, -0.004452f, 0.005244f, -0.002154f, 0.000265f, 0.007584f, -0.005339f, 0.001199f, -0.008525f, 0.001118f, 0.001068f, -0.002423f, -0.002171f, -0.001343f, -0.003175f, 0.000250f, -0.001685f, -0.000006f, 0.005651f, -0.008852f, 0.003552f, -0.046718f, -0.078058f, 0.028755f, 0.251287f, 0.062478f, 0.138695f, -0.005774f, -0.134514f, -0.044121f, -0.132365f, -0.113689f, -0.039788f, -0.027669f, -0.008984f, 0.074822f, 0.101237f, 0.133113f, 0.168867f, 0.072416f, -0.042909f, -0.078456f, -0.165310f, -0.157762f, -0.063920f, -0.052964f, -0.034817f, 0.067632f, 0.092969f, 0.055048f, 0.086213f, 0.102722f, 0.035129f, 0.027896f, 0.019513f, -0.053806f, -0.024343f, -0.038639f, -0.083126f, -0.046396f, -0.061701f, -0.092179f, -0.049721f, 0.011001f, 0.010071f, 0.050907f, 0.124646f, 0.084728f, 0.071069f, 0.068636f, 0.021481f, 0.004732f, -0.006832f, -0.036180f, -0.050854f, -0.065036f, -0.092206f, -0.082099f, -0.045457f, -0.014699f, -0.030981f, 0.025431f, 0.048172f, + 0.040369f, 0.070515f, 0.077974f, 0.050542f, 0.045206f, 0.044781f, -0.007285f, -0.021589f, -0.011318f, -0.063511f, -0.053160f, -0.013260f, -0.052618f, -0.055682f, -0.035753f, -0.050059f, -0.024775f, 0.014630f, 0.031844f, 0.058439f, 0.092939f, 0.058092f, 0.053291f, 0.059572f, 0.021635f, -0.006800f, -0.011123f, -0.031595f, -0.052994f, -0.054455f, -0.052461f, -0.056956f, -0.040081f, -0.036349f, -0.030707f, -0.012281f, 0.014016f, 0.035627f, 0.054508f, 0.082948f, 0.086779f, 0.085135f, 0.071844f, 0.023098f, -0.019057f, -0.038374f, -0.062485f, -0.082100f, -0.093307f, -0.092630f, -0.073822f, -0.041205f, -0.010149f, 0.025811f, 0.076111f, 0.085197f, 0.084826f, 0.089374f, 0.073439f, 0.039003f, 0.012099f, -0.020602f, -0.059629f, -0.082858f, -0.073582f, -0.068357f, -0.054282f, -0.024880f, 0.002107f, 0.020619f, 0.040883f, 0.046778f, 0.045625f, 0.036722f, 0.016384f, 0.007980f, 0.002913f, -0.006332f, -0.007831f, -0.007419f, -0.010400f, -0.012437f, -0.009999f, -0.013731f, -0.009563f, -0.007421f, -0.005408f, -0.006306f, -0.002197f, -0.000322f, 0.003895f, 0.004775f, 0.008732f, 0.010604f, 0.012854f, 0.009509f, + 0.009774f, 0.006668f, 0.004226f, -0.001498f, -0.003267f, -0.007084f, -0.007613f, -0.010960f, -0.010185f, -0.010065f, -0.007179f, -0.006394f, -0.001993f, 0.000697f, 0.004086f, 0.005616f, 0.009966f, 0.009592f, 0.010472f, 0.008158f, 0.006601f, 0.002497f, 0.001888f, -0.001791f, -0.002930f, -0.007874f, -0.010436f, -0.011516f, -0.008284f, -0.007299f, -0.002287f, 0.000072f, 0.002587f, 0.003098f, 0.005986f, 0.005604f, 0.007960f, 0.006718f, 0.007071f, 0.004303f, 0.002941f, -0.001629f, -0.003050f, -0.006411f, -0.006187f, -0.007034f, -0.005322f, -0.005806f, -0.002861f, -0.001784f, 0.001871f, 0.003162f, 0.005841f, 0.004967f, 0.005887f, 0.003301f, 0.002803f, -0.000114f, -0.000650f, -0.002305f, -0.001220f, -0.002748f, -0.001584f, -0.002690f, -0.001058f, -0.001733f, 0.000030f, -0.000653f, 0.000992f, 0.000069f, 0.001362f, 0.000145f, 0.001240f, -0.000027f, 0.001049f, -0.000304f, 0.000746f, -0.000540f, 0.000651f, -0.000572f, 0.000618f, -0.000583f} + }, + { + {0.005683f, 0.005921f, -0.005343f, -0.000801f, 0.008186f, 0.002853f, -0.004421f, 0.001019f, -0.004871f, -0.004106f, -0.003522f, -0.007326f, -0.002709f, 0.004664f, -0.000488f, 0.002638f, -0.001378f, -0.001990f, -0.002186f, -0.000782f, 0.006139f, -0.003833f, 0.000269f, -0.000160f, 0.000153f, 0.005091f, -0.000285f, 0.003541f, 0.010773f, 0.008618f, 0.008422f, 0.004550f, 0.001819f, -0.001257f, -0.010192f, 0.004257f, -0.003879f, 0.006582f, 0.002172f, -0.003297f, 0.002921f, -0.004375f, -0.008850f, -0.002569f, -0.003494f, -0.008146f, 0.000233f, -0.000894f, -0.001301f, -0.003752f, 0.000407f, 0.008751f, 0.003707f, 0.005986f, -0.000210f, 0.003728f, -0.003492f, -0.000122f, 0.004394f, -0.003607f, 0.002904f, -0.004501f, -0.005038f, 0.000622f, 0.010040f, 0.006814f, 0.003781f, -0.001856f, 0.001579f, 0.001211f, 0.000469f, -0.001712f, -0.004020f, -0.005844f, -0.004445f, 0.000256f, -0.003823f, -0.001731f, -0.004107f, 0.001442f, 0.000489f, 0.002184f, -0.001296f, 0.001818f, 0.002280f, 0.002094f, 0.000138f, 0.001359f, -0.001037f, -0.000874f, -0.000152f, -0.002363f, 0.002497f, 0.002269f, -0.000372f, 0.002834f, + 0.000679f, 0.000665f, -0.001347f, -0.000654f, -0.001688f, 0.000640f, 0.000756f, 0.000090f, -0.000617f, 0.001056f, -0.000724f, -0.002186f, -0.000775f, -0.001424f, -0.000217f, 0.000570f, 0.000445f, -0.002296f, 0.000307f, 0.001653f, 0.003715f, 0.001927f, -0.006444f, 0.015210f, -0.000337f, 0.000931f, -0.001618f, -0.008013f, 0.005925f, -0.004173f, -0.004018f, -0.009338f, -0.007214f, -0.003016f, 0.005801f, 0.008366f, -0.001695f, 0.004956f, -0.001926f, 0.009077f, 0.009397f, -0.018749f, 0.003434f, 0.000108f, -0.001841f, 0.006370f, 0.009987f, -0.003061f, -0.001457f, 0.000224f, -0.000614f, -0.004746f, 0.003928f, -0.004784f, -0.003797f, -0.000364f, 0.005008f, -0.002805f, -0.010553f, -0.004665f, -0.007172f, 0.000869f, 0.000643f, -0.009341f, -0.001108f, -0.004059f, 0.001950f, -0.000247f, -0.001409f, 0.002337f, -0.003117f, 0.003214f, -0.005016f, 0.004964f, 0.007221f, 0.011115f, 0.004609f, -0.004801f, 0.003979f, 0.004689f, -0.001731f, -0.012498f, 0.000829f, 0.006574f, -0.005027f, 0.003812f, -0.007259f, -0.000035f, -0.004627f, -0.012691f, -0.003868f, -0.006612f, 0.003243f, 0.004788f, -0.004284f, 0.002084f, + -0.002005f, 0.006069f, 0.000488f, 0.003580f, 0.005055f, -0.002088f, 0.002097f, 0.001083f, 0.002145f, 0.004401f, -0.000998f, 0.001533f, 0.005440f, 0.003150f, 0.000748f, 0.003307f, 0.000597f, 0.001472f, -0.000210f, 0.000001f, -0.002929f, 0.001647f, 0.001878f, 0.002538f, 0.001696f, 0.000634f, 0.000808f, 0.000162f, 0.000952f, -0.000302f, -0.000809f, -0.000143f, 0.002012f, 0.001770f, 0.000533f, 0.001597f, 0.000373f, 0.001836f, 0.001512f, 0.012514f, 0.003333f, -0.016832f, 0.005932f, 0.008750f, 0.003097f, -0.001391f, 0.004338f, -0.010546f, 0.001429f, 0.004787f, -0.002451f, 0.004633f, -0.000795f, 0.005629f, 0.001269f, -0.007090f, 0.004436f, 0.006636f, 0.006407f, -0.001801f, 0.003026f, 0.003625f, 0.002390f, -0.019055f, 0.002621f, -0.008060f, -0.002477f, -0.002621f, 0.004406f, 0.002160f, -0.015684f, -0.005536f, -0.003563f, -0.002875f, 0.006291f, -0.005725f, -0.010991f, 0.002790f, 0.005009f, 0.003252f, -0.010933f, -0.005019f, 0.003430f, -0.010169f, -0.000883f, -0.011246f, 0.001614f, 0.005663f, -0.005865f, -0.001668f, 0.006443f, 0.008369f, -0.019329f, -0.001323f, -0.005401f, 0.005945f, + 0.002349f, 0.001067f, 0.001627f, -0.005322f, 0.004872f, 0.004356f, -0.015012f, 0.011613f, -0.001578f, 0.002942f, -0.007674f, -0.003084f, -0.006494f, -0.000693f, 0.001654f, -0.005882f, -0.008350f, 0.007502f, -0.002708f, 0.003160f, -0.000436f, -0.001388f, 0.002121f, 0.002626f, -0.003055f, -0.007580f, 0.004271f, 0.004005f, 0.000976f, 0.001924f, -0.000253f, 0.000703f, 0.001276f, 0.000062f, 0.001274f, 0.001018f, -0.000177f, 0.003085f, 0.000421f, 0.002394f, 0.002699f, 0.000280f, 0.003806f, 0.000024f, 0.000751f, 0.001153f, 0.001714f, 0.001498f, 0.001905f, -0.002714f, 0.001307f, -0.001160f, 0.000593f, 0.001395f, 0.000945f, 0.002371f, -0.000745f, -0.000539f, 0.001703f, 0.003200f, -0.007953f, -0.007795f, -0.006168f, -0.004188f, 0.012803f, -0.004581f, 0.001890f, -0.010431f, 0.011053f, 0.000563f, -0.007209f, -0.002107f, 0.006475f, -0.013307f, 0.004631f, -0.004042f, 0.003133f, 0.001960f, -0.005846f, -0.004432f, -0.015462f, -0.004369f, -0.017434f, 0.002121f, 0.004143f, -0.002048f, -0.002220f, -0.001767f, 0.002835f, -0.007049f, -0.012374f, -0.005990f, -0.004440f, -0.002094f, 0.004787f, -0.003047f, + 0.007653f, 0.003164f, 0.005908f, -0.007933f, -0.000258f, -0.000540f, -0.006324f, 0.001653f, 0.005310f, -0.000661f, -0.003061f, -0.007778f, -0.006869f, 0.004599f, 0.007290f, -0.000381f, 0.014255f, 0.011007f, -0.009889f, -0.002715f, 0.000215f, -0.010783f, -0.011977f, 0.018240f, -0.000109f, 0.000357f, 0.005959f, -0.011833f, -0.003651f, -0.007717f, 0.018353f, 0.004761f, 0.001139f, -0.014605f, -0.011285f, 0.001399f, -0.004534f, 0.009240f, -0.004616f, -0.000247f, 0.002774f, -0.005818f, 0.002262f, 0.005522f, -0.008303f, -0.000047f, -0.013361f, 0.001341f, 0.005315f, -0.004059f, 0.002192f, 0.001492f, 0.006864f, -0.001092f, 0.001283f, -0.001451f, -0.000041f, 0.002744f, 0.003177f, 0.002630f, -0.001829f, 0.000749f, 0.000089f, 0.001108f, 0.000317f, 0.001084f, -0.001754f, 0.004151f, 0.000268f, 0.001097f, 0.000881f, 0.001223f, 0.001241f, 0.001109f, -0.000904f, -0.001237f, -0.000726f, 0.000818f, 0.003117f, 0.003261f, 0.000848f, 0.001412f, -0.002542f, -0.001137f, -0.021142f, 0.010551f, 0.006091f, 0.010761f, -0.005733f, 0.005871f, 0.006285f, 0.011063f, 0.002718f, -0.021238f, 0.005375f, 0.000856f, + 0.008505f, 0.015317f, 0.000896f, 0.006622f, 0.005938f, -0.012737f, 0.004546f, 0.001123f, 0.001848f, -0.003498f, -0.001670f, 0.007822f, 0.005310f, 0.000272f, -0.007664f, -0.000141f, -0.003606f, -0.004063f, 0.012787f, 0.005818f, -0.000432f, -0.001743f, -0.015232f, -0.013196f, -0.014960f, 0.003966f, 0.004176f, -0.015654f, 0.001214f, 0.001018f, -0.015365f, 0.000935f, 0.002498f, -0.002106f, 0.017894f, -0.002229f, -0.008629f, -0.002235f, 0.010326f, -0.000880f, -0.015728f, 0.017182f, 0.009035f, -0.010986f, 0.008496f, 0.001637f, 0.001729f, -0.000315f, 0.001086f, -0.004283f, -0.007834f, -0.007557f, 0.013885f, -0.000941f, -0.003894f, -0.000665f, 0.010024f, -0.009193f, -0.016066f, 0.000558f, 0.003819f, 0.003016f, -0.014024f, -0.007352f, 0.005585f, -0.001292f, 0.008050f, 0.002999f, -0.002376f, -0.002382f, -0.002023f, -0.001139f, 0.000418f, 0.012566f, 0.007474f, 0.004537f, 0.004171f, 0.004852f, 0.007472f, -0.003507f, -0.001019f, -0.003973f, -0.001056f, 0.001390f, 0.000517f, -0.002198f, -0.003385f, 0.003697f, 0.000724f, 0.001668f, 0.000102f, -0.002258f, 0.000974f, 0.001958f, -0.004307f, -0.000753f, + 0.003752f, 0.000783f, 0.000385f, -0.001633f, -0.000317f, -0.001056f, -0.001763f, 0.000495f, 0.001999f, 0.001467f, -0.001124f, 0.001498f, 0.000317f, 0.006438f, 0.024440f, 0.007339f, 0.019590f, -0.021561f, 0.000775f, -0.010624f, 0.000289f, 0.007215f, 0.008214f, -0.011061f, 0.004792f, -0.006391f, -0.005751f, -0.007678f, -0.012609f, -0.001804f, -0.029620f, -0.000245f, 0.009698f, -0.001267f, -0.002076f, 0.003286f, -0.015573f, 0.005494f, -0.014855f, -0.004634f, 0.015164f, 0.003120f, 0.005189f, 0.000395f, 0.004414f, 0.013022f, 0.011682f, 0.022664f, 0.011685f, -0.017083f, -0.001499f, 0.019097f, -0.002743f, -0.013922f, -0.002196f, 0.001799f, -0.006451f, 0.012804f, 0.009392f, -0.010946f, -0.003283f, 0.012280f, 0.012963f, -0.004615f, -0.008366f, 0.020699f, -0.008597f, -0.027837f, -0.018909f, 0.006169f, -0.028109f, -0.000531f, -0.008471f, 0.000165f, -0.002682f, -0.007808f, 0.010419f, 0.003029f, -0.002824f, -0.009136f, 0.007935f, -0.005463f, 0.014780f, 0.010181f, -0.004145f, -0.009829f, 0.002032f, 0.003912f, 0.001299f, 0.000582f, 0.003429f, -0.002028f, -0.011013f, -0.003142f, 0.015128f, -0.001738f, + -0.006275f, -0.001622f, -0.003284f, -0.007841f, -0.007727f, -0.004214f, -0.003759f, 0.000925f, -0.000160f, 0.007644f, -0.000755f, -0.002727f, 0.000979f, 0.002747f, -0.001922f, 0.001612f, -0.002714f, 0.005202f, -0.000259f, 0.003202f, 0.000382f, -0.004965f, -0.000600f, -0.000522f, -0.005332f, -0.001394f, -0.003283f, 0.002403f, 0.000059f, -0.000789f, 0.001701f, 0.000826f, -0.000623f, 0.000952f, -0.005956f, 0.001290f, 0.001625f, -0.023812f, 0.011261f, -0.002024f, 0.005995f, 0.008003f, 0.012877f, 0.002983f, -0.011391f, 0.015515f, -0.005778f, 0.006952f, -0.006933f, 0.005806f, -0.001077f, -0.027988f, -0.005843f, -0.004720f, -0.003331f, 0.002005f, -0.006769f, -0.004553f, 0.003726f, 0.006243f, 0.002099f, 0.015246f, 0.006971f, -0.014577f, -0.001105f, 0.000114f, -0.008280f, 0.017528f, -0.010457f, -0.010004f, 0.018345f, 0.019428f, -0.002427f, -0.000145f, -0.012064f, 0.004424f, 0.002598f, -0.006201f, 0.003192f, 0.012062f, 0.007381f, 0.014489f, -0.003605f, -0.011237f, 0.007019f, 0.001761f, 0.003441f, -0.013410f, -0.007009f, -0.007848f, 0.003158f, 0.007796f, 0.002805f, 0.002142f, 0.013824f, 0.016670f, + 0.002455f, -0.007813f, 0.009423f, 0.007811f, -0.011722f, 0.001706f, 0.002005f, -0.001266f, 0.001341f, -0.000196f, 0.009882f, -0.001013f, -0.007766f, 0.004016f, 0.013034f, 0.005875f, 0.007640f, 0.016253f, -0.011066f, 0.002039f, -0.003787f, 0.015425f, 0.008765f, 0.016515f, -0.007953f, -0.002040f, 0.002701f, -0.005783f, 0.000820f, 0.001682f, -0.001904f, 0.000077f, 0.003774f, 0.004463f, -0.001691f, 0.002466f, 0.001668f, 0.005769f, 0.004993f, -0.000617f, -0.000469f, -0.002508f, 0.000685f, -0.002528f, 0.001317f, -0.004496f, 0.004465f, -0.000019f, -0.001797f, -0.000013f, -0.000432f, 0.000236f, -0.001657f, -0.003492f, 0.004967f, -0.000575f, 0.000778f, -0.005557f, -0.004658f, -0.001188f, 0.004765f, -0.000462f, -0.000574f, 0.000520f, -0.000618f, 0.009950f, -0.020707f, -0.012427f, 0.008268f, -0.004872f, -0.019341f, 0.009831f, -0.010110f, -0.008866f, 0.012514f, -0.003808f, -0.004114f, -0.003118f, 0.003244f, 0.009233f, 0.004825f, 0.004959f, 0.005140f, -0.007724f, -0.004586f, -0.001625f, 0.011276f, 0.005778f, -0.019767f, 0.006283f, 0.006192f, -0.008317f, 0.018638f, 0.017062f, 0.009213f, 0.000643f, + -0.006740f, -0.004400f, 0.001023f, -0.005824f, -0.006938f, -0.011482f, 0.001689f, -0.013108f, 0.009525f, 0.003634f, 0.000140f, 0.002054f, 0.005038f, 0.004321f, 0.010195f, 0.015855f, -0.005992f, -0.025163f, -0.004360f, -0.017142f, 0.005926f, 0.002356f, -0.022743f, 0.008246f, -0.009534f, 0.028576f, 0.009513f, -0.018022f, -0.000594f, 0.018177f, 0.009507f, -0.014924f, -0.008858f, 0.019017f, 0.010951f, -0.013225f, 0.016278f, -0.013573f, -0.017863f, 0.002757f, -0.027058f, 0.016334f, 0.017606f, -0.004044f, -0.016278f, -0.002934f, 0.006431f, 0.003305f, 0.002755f, 0.001633f, 0.012626f, -0.017717f, 0.005725f, 0.019715f, 0.000356f, 0.000673f, -0.017350f, 0.008639f, 0.004880f, -0.016050f, -0.003977f, -0.008107f, -0.003811f, 0.000625f, 0.005045f, 0.004009f, 0.000596f, -0.004837f, 0.000519f, -0.005183f, 0.002172f, 0.003072f, -0.000631f, -0.002513f, -0.001699f, 0.003151f, 0.001033f, -0.001025f, -0.002677f, -0.005177f, -0.000558f, -0.005055f, 0.010097f, -0.009447f, 0.000006f, -0.001013f, 0.003893f, 0.002590f, -0.005401f, 0.001643f, -0.001649f, 0.008546f, -0.001040f, 0.002405f, 0.000291f, -0.004938f, + 0.002050f, 0.001022f, -0.000582f, 0.005523f, -0.000087f, -0.016212f, -0.012025f, 0.000418f, -0.019531f, 0.000093f, -0.045886f, -0.014399f, -0.005294f, -0.025023f, -0.008797f, -0.005209f, -0.011008f, -0.008454f, 0.005965f, -0.012038f, -0.022951f, 0.006151f, 0.014380f, -0.023382f, -0.006489f, 0.007267f, 0.011750f, 0.020257f, 0.012893f, 0.011953f, 0.013052f, 0.004772f, 0.023140f, -0.013721f, -0.005898f, 0.004953f, -0.011455f, 0.004412f, 0.006560f, 0.012172f, 0.001595f, 0.019869f, 0.004166f, 0.004942f, 0.013685f, -0.005986f, -0.011723f, 0.000270f, -0.017975f, -0.011439f, -0.020747f, -0.000807f, -0.000943f, -0.027226f, 0.009854f, -0.012300f, 0.005600f, -0.025710f, 0.003102f, -0.019441f, 0.029124f, 0.001529f, -0.025923f, 0.031199f, 0.038156f, 0.010775f, -0.012759f, -0.009404f, 0.009921f, -0.003254f, -0.001233f, 0.011335f, -0.018184f, 0.011934f, -0.018779f, 0.010028f, -0.007469f, -0.010529f, 0.004515f, 0.010073f, -0.005405f, -0.000510f, 0.011773f, 0.003146f, -0.005763f, 0.006676f, -0.002870f, -0.010695f, 0.001447f, 0.010123f, -0.001899f, -0.003905f, 0.004030f, 0.002993f, 0.008227f, 0.001709f, + 0.000317f, 0.003600f, -0.002710f, 0.005782f, 0.001483f, 0.004802f, 0.001677f, 0.003830f, 0.003081f, 0.003138f, 0.002510f, -0.003433f, 0.003990f, -0.004643f, -0.004330f, 0.000501f, 0.002637f, 0.000923f, 0.001347f, 0.002908f, 0.001925f, 0.000294f, -0.001475f, -0.003472f, 0.000098f, -0.003654f, 0.010009f, -0.004867f, 0.009028f, 0.013631f, 0.001841f, 0.012591f, -0.007184f, 0.019599f, -0.015275f, -0.013948f, -0.037221f, -0.008099f, -0.019373f, -0.045092f, 0.011198f, -0.025946f, -0.015991f, -0.020895f, 0.005621f, -0.040612f, 0.010745f, 0.003446f, -0.007979f, -0.000791f, -0.011873f, -0.004027f, 0.009612f, -0.013773f, -0.010055f, 0.000643f, 0.007289f, -0.012038f, -0.001101f, 0.014032f, -0.022515f, -0.005074f, 0.012886f, -0.012314f, -0.000919f, 0.000211f, -0.003697f, 0.018989f, -0.016685f, 0.011314f, -0.007679f, 0.015461f, 0.016054f, -0.016410f, -0.022197f, 0.020710f, -0.002389f, 0.004582f, 0.005230f, 0.001943f, -0.004891f, 0.011701f, -0.006454f, -0.025398f, 0.006490f, 0.005279f, -0.022240f, -0.002380f, -0.008063f, 0.013358f, 0.015996f, 0.008085f, 0.002565f, -0.006270f, -0.015846f, 0.016139f, + 0.009768f, 0.014444f, -0.001145f, -0.022526f, -0.005445f, -0.003325f, -0.010027f, -0.005489f, -0.002792f, 0.006618f, 0.009920f, -0.008649f, -0.007576f, -0.022382f, -0.010818f, 0.004423f, 0.009121f, 0.002592f, -0.002052f, 0.010379f, 0.009556f, 0.005893f, 0.011768f, -0.003572f, 0.009200f, 0.004325f, 0.006251f, 0.001167f, -0.000054f, -0.006106f, -0.004863f, -0.001047f, 0.002882f, -0.001384f, -0.005394f, -0.006516f, -0.000334f, -0.000998f, 0.001277f, -0.004402f, 0.000955f, -0.005267f, 0.001581f, 0.009053f, 0.001933f, -0.005042f, -0.005365f, 0.011498f, 0.006409f, -0.001316f, -0.000768f, -0.014331f, -0.001707f, -0.000072f, -0.012285f, 0.000411f, -0.005020f, -0.003687f, 0.002845f, 0.003903f, 0.000863f, -0.001299f, -0.011248f, 0.055163f, 0.031694f, 0.002220f, -0.017580f, -0.041593f, -0.005185f, 0.019488f, -0.009232f, -0.016744f, -0.031363f, -0.001726f, -0.006849f, 0.001111f, -0.010827f, 0.010127f, -0.000278f, 0.027318f, 0.010688f, -0.011369f, -0.000913f, -0.004848f, 0.001959f, -0.005606f, 0.005533f, 0.016944f, -0.019928f, 0.003863f, -0.012052f, 0.007905f, -0.008617f, -0.014422f, -0.028350f, -0.002254f, + 0.016054f, 0.005447f, -0.003640f, 0.005992f, -0.002205f, 0.015447f, 0.024279f, -0.008482f, -0.005670f, -0.028227f, -0.030745f, 0.008498f, 0.004434f, -0.012928f, -0.011314f, -0.025416f, -0.017600f, 0.010108f, -0.003411f, 0.000074f, 0.001185f, -0.001943f, 0.011517f, 0.006679f, -0.021056f, 0.000904f, -0.019199f, -0.001634f, -0.010408f, -0.005901f, 0.020164f, 0.041821f, 0.068739f, 0.002622f, 0.022039f, -0.020746f, -0.026567f, -0.037151f, -0.002066f, -0.000099f, 0.007432f, 0.007908f, -0.005191f, -0.046969f, 0.019405f, -0.007960f, -0.006593f, 0.002987f, -0.012428f, 0.001449f, -0.006805f, -0.019116f, 0.000138f, -0.007632f, 0.000078f, 0.001944f, 0.000631f, 0.013630f, 0.001872f, 0.001585f, -0.000833f, 0.000599f, -0.000671f, 0.005876f, 0.012717f, 0.003830f, -0.000555f, 0.002781f, 0.011522f, 0.000359f, 0.000047f, 0.004417f, -0.003948f, 0.001488f, -0.010723f, 0.003681f, 0.005465f, -0.009939f, 0.010120f, 0.000666f, 0.000794f, -0.002906f, -0.011207f, -0.003527f, 0.004888f, 0.000108f, -0.001218f, -0.002715f, 0.006724f, -0.001857f, 0.000425f, 0.020132f, 0.033572f, -0.016605f, 0.000068f, 0.006449f, + -0.027372f, 0.000252f, -0.017670f, -0.017131f, 0.025796f, -0.007592f, -0.006469f, -0.013863f, 0.029625f, 0.026027f, -0.000002f, 0.042762f, 0.004817f, 0.013354f, 0.009417f, -0.011924f, -0.013961f, -0.022261f, -0.011718f, 0.005212f, 0.000212f, 0.019162f, 0.001496f, -0.002093f, -0.003487f, 0.013540f, -0.019570f, -0.047834f, -0.016767f, 0.014105f, 0.004426f, -0.003933f, -0.014249f, 0.000847f, -0.023011f, -0.003461f, -0.020964f, -0.001453f, -0.002624f, -0.014777f, 0.014162f, 0.007030f, 0.026899f, -0.022221f, 0.041668f, 0.011182f, -0.008105f, -0.014751f, -0.007571f, 0.006560f, 0.024038f, -0.007402f, 0.013754f, -0.021243f, 0.017165f, -0.019292f, -0.021703f, 0.021398f, -0.031041f, 0.020341f, 0.017097f, 0.033017f, -0.033621f, 0.025547f, -0.003187f, 0.022775f, 0.008900f, -0.035345f, -0.006180f, -0.008312f, 0.009857f, -0.018760f, 0.055636f, -0.002749f, -0.019637f, 0.007879f, 0.025715f, 0.017452f, 0.012047f, 0.013264f, -0.001752f, 0.006312f, -0.002272f, -0.007388f, -0.004689f, 0.001946f, -0.000243f, -0.007331f, 0.002104f, -0.002165f, -0.011281f, -0.002362f, -0.004306f, 0.004729f, 0.005955f, 0.003223f, + -0.001554f, 0.010965f, -0.001780f, 0.006060f, 0.002436f, 0.007752f, 0.002926f, -0.003947f, -0.004885f, 0.001311f, -0.000580f, 0.005336f, -0.002168f, 0.000491f, 0.004553f, -0.002778f, 0.007796f, -0.003708f, -0.004296f, 0.002150f, -0.003220f, 0.008110f, 0.002951f, -0.002413f, 0.004898f, 0.002401f, -0.023262f, -0.031192f, -0.063899f, -0.019615f, -0.037520f, 0.010461f, -0.001708f, -0.012780f, -0.018580f, -0.017686f, -0.015985f, -0.017322f, -0.016969f, 0.001784f, -0.013833f, -0.002489f, -0.030073f, -0.046147f, 0.056546f, -0.017616f, 0.030643f, -0.005853f, 0.007916f, 0.009766f, 0.016522f, 0.010898f, -0.002879f, -0.000923f, -0.024407f, -0.005517f, -0.005803f, -0.016412f, -0.025595f, 0.010005f, -0.002883f, 0.036197f, -0.025053f, 0.000671f, 0.050072f, -0.012061f, -0.041593f, -0.013413f, 0.001658f, -0.018848f, 0.029302f, 0.013471f, -0.016080f, 0.011893f, 0.015747f, -0.009692f, -0.000313f, 0.007921f, 0.019595f, -0.000720f, -0.019282f, -0.018979f, 0.023452f, 0.016772f, -0.012307f, -0.026705f, 0.017062f, 0.019743f, -0.017598f, -0.024027f, 0.016862f, -0.030473f, 0.058355f, 0.012564f, -0.004752f, 0.002393f, + 0.014286f, 0.003235f, -0.010256f, 0.000961f, 0.004210f, 0.020968f, -0.013729f, 0.004212f, -0.041437f, -0.037322f, -0.004155f, 0.002248f, -0.004054f, -0.018104f, 0.013216f, 0.030856f, -0.000838f, 0.007925f, -0.002871f, 0.006613f, 0.009351f, 0.011149f, -0.011892f, 0.013401f, -0.006149f, -0.003529f, 0.008895f, 0.016495f, -0.004826f, -0.016497f, 0.004750f, -0.001494f, 0.002799f, -0.001472f, -0.008820f, -0.002429f, -0.009115f, -0.005642f, -0.011259f, 0.011680f, 0.011970f, -0.007108f, 0.000039f, 0.014368f, 0.004602f, -0.006022f, 0.003061f, 0.017995f, 0.011866f, 0.012994f, 0.013110f, 0.011581f, 0.004354f, 0.016510f, 0.008758f, 0.006919f, 0.006188f, 0.015545f, -0.024191f, 0.000216f, 0.008767f, 0.007016f, -0.015877f, 0.038169f, 0.026678f, 0.054871f, 0.030104f, 0.020572f, 0.007834f, -0.047590f, -0.004012f, 0.006759f, -0.028247f, -0.007250f, 0.054018f, 0.004421f, -0.031412f, -0.030644f, 0.027968f, -0.042319f, -0.011102f, 0.002181f, 0.011376f, 0.005217f, -0.008159f, 0.014170f, -0.019266f, 0.000312f, -0.003910f, -0.011767f, -0.002680f, -0.008070f, -0.027830f, 0.015043f, -0.024113f, 0.014536f, + 0.012620f, 0.016869f, 0.003004f, 0.011328f, -0.010059f, 0.045416f, 0.006065f, -0.047341f, -0.041976f, 0.004306f, 0.018893f, 0.037033f, -0.012015f, -0.028225f, -0.012670f, -0.003313f, 0.004182f, 0.021978f, 0.004735f, -0.016427f, 0.049552f, -0.060136f, -0.010024f, 0.012027f, -0.042120f, -0.021306f, -0.011013f, 0.006805f, -0.068281f, -0.031803f, 0.049081f, -0.017971f, 0.014419f, -0.015314f, -0.055086f, -0.020284f, 0.026728f, -0.007530f, 0.010509f, 0.017552f, 0.035081f, -0.015998f, 0.004020f, -0.009784f, 0.022049f, 0.010574f, 0.009610f, 0.002062f, -0.000663f, 0.001246f, 0.019268f, 0.010454f, 0.011501f, -0.002267f, -0.000183f, 0.007747f, -0.012513f, -0.010998f, 0.005362f, 0.022766f, 0.010639f, 0.009291f, -0.021228f, 0.013408f, 0.040623f, 0.000541f, -0.000105f, -0.014722f, 0.011268f, 0.002553f, -0.009015f, -0.011792f, 0.002071f, 0.012719f, 0.014394f, 0.010910f, -0.012064f, 0.009182f, -0.007940f, 0.010327f, -0.015628f, -0.008042f, -0.002787f, -0.007646f, -0.009981f, -0.002358f, -0.025673f, -0.024016f, 0.004599f, -0.000936f, -0.003578f, 0.009724f, 0.000246f, -0.001530f, 0.000807f, 0.010545f, + 0.009289f, 0.003740f, 0.000141f, 0.005194f, 0.005944f, 0.004553f, 0.007133f, -0.001814f, 0.009709f, 0.027133f, -0.011271f, -0.088868f, -0.022226f, 0.004291f, 0.025207f, 0.023457f, 0.022429f, 0.021385f, 0.040251f, 0.070785f, -0.040362f, 0.029261f, -0.009801f, -0.001971f, -0.009945f, -0.059359f, -0.043279f, -0.009032f, -0.002065f, 0.011907f, 0.023602f, 0.029411f, -0.008866f, -0.001696f, -0.014887f, -0.000572f, -0.002154f, -0.001001f, 0.031682f, 0.015910f, 0.011000f, 0.023174f, 0.028921f, -0.050291f, 0.025241f, -0.029523f, -0.035907f, -0.011526f, 0.024286f, 0.006084f, -0.024020f, 0.007446f, 0.003687f, 0.016958f, -0.000986f, -0.048899f, -0.033814f, -0.040676f, -0.039060f, 0.004485f, 0.033667f, -0.006902f, 0.120090f, -0.078780f, -0.058079f, 0.035193f, -0.009761f, -0.024700f, -0.007301f, -0.007302f, 0.002084f, -0.073872f, 0.008499f, -0.006159f, 0.010844f, 0.055081f, -0.003098f, 0.018726f, 0.022420f, 0.025824f, 0.092674f, -0.034946f, 0.116976f, 0.031454f, -0.002300f, 0.014430f, 0.007534f, -0.048570f, -0.041406f, -0.001629f, -0.009484f, 0.005097f, 0.018845f, 0.013404f, -0.007360f, -0.041775f, + -0.032808f, 0.012631f, -0.021829f, 0.013948f, 0.017109f, 0.035376f, 0.036098f, 0.031387f, 0.007204f, 0.010402f, 0.000454f, -0.002422f, 0.024710f, -0.004755f, -0.001134f, 0.006787f, -0.033429f, -0.009000f, 0.015496f, -0.000832f, -0.002493f, 0.021114f, 0.009296f, -0.032831f, 0.023103f, -0.018713f, -0.023971f, -0.014748f, -0.006703f, 0.005415f, 0.011464f, 0.010106f, -0.012271f, 0.014962f, 0.007732f, 0.009348f, 0.005539f, 0.012561f, -0.004382f, 0.007290f, -0.019580f, -0.005102f, -0.010208f, 0.003668f, 0.008407f, -0.052155f, 0.018812f, 0.084141f, 0.002163f, 0.087807f, 0.045986f, -0.005085f, -0.034047f, 0.099020f, 0.014625f, -0.016415f, 0.012590f, -0.022287f, -0.006809f, -0.003168f, -0.006237f, 0.012689f, 0.027422f, 0.019424f, 0.003500f, 0.012896f, -0.019966f, -0.018966f, 0.005879f, -0.005633f, 0.032380f, 0.035447f, 0.022333f, -0.008833f, 0.002148f, -0.042602f, -0.026939f, -0.007728f, -0.029444f, -0.046093f, -0.027622f, 0.022299f, -0.026929f, -0.081465f, -0.037791f, 0.025191f, -0.033004f, -0.023057f, 0.001191f, -0.005770f, 0.038476f, 0.056760f, 0.074326f, -0.039092f, 0.021189f, -0.000315f, + 0.002529f, -0.015731f, -0.049018f, -0.097772f, -0.064421f, 0.034289f, -0.065263f, -0.034031f, 0.018004f, 0.033512f, -0.024048f, 0.037767f, 0.107688f, 0.022932f, 0.021045f, -0.080940f, -0.108721f, -0.023273f, -0.033667f, -0.057799f, -0.016328f, -0.048219f, 0.034963f, 0.020102f, 0.097750f, 0.040554f, -0.010959f, -0.019313f, -0.033503f, 0.023454f, 0.044645f, 0.088700f, 0.062128f, -0.042049f, -0.088787f, -0.043105f, -0.028035f, -0.052316f, -0.009410f, 0.045465f, 0.022024f, 0.056134f, 0.002859f, 0.040064f, 0.016249f, -0.012357f, -0.016158f, -0.018590f, 0.011276f, 0.024716f, 0.006557f, 0.032003f, 0.039788f, 0.024276f, 0.028547f, 0.013453f, 0.042967f, 0.037829f, 0.002144f, -0.000200f, 0.019207f, 0.042650f, -0.003489f, -0.010648f, -0.005647f, 0.036492f, 0.011702f, 0.002336f, -0.009970f, 0.023072f, 0.017941f, -0.004859f, 0.015037f, 0.018421f, 0.009573f, -0.003220f, 0.004704f, 0.013396f, 0.002393f, -0.000698f, -0.020263f, 0.043797f, 0.090123f, -0.048646f, 0.068479f, 0.052982f, -0.008066f, -0.015232f, -0.029669f, 0.007852f, 0.061097f, 0.043405f, 0.071523f, -0.032305f, -0.013424f, -0.015965f, + -0.003843f, -0.020594f, 0.019078f, -0.024960f, 0.052560f, 0.020542f, -0.085079f, -0.038536f, 0.001168f, 0.011227f, 0.037350f, -0.019295f, -0.031956f, 0.007942f, 0.010479f, -0.015431f, -0.015605f, 0.007911f, -0.023955f, -0.038982f, -0.016559f, 0.078880f, 0.033726f, 0.011907f, -0.040575f, -0.014986f, -0.034393f, 0.018514f, 0.039404f, 0.011374f, 0.002888f, 0.021301f, -0.013424f, 0.049636f, 0.029485f, 0.001240f, 0.017349f, -0.003713f, 0.102188f, 0.019227f, -0.043160f, 0.014746f, 0.017855f, 0.008304f, 0.023305f, -0.000514f, -0.041216f, 0.047257f, 0.011032f, 0.006551f, 0.019467f, 0.007062f, 0.000116f, -0.032347f, 0.035306f, 0.038117f, 0.020871f, 0.112954f, 0.081832f, -0.046010f, -0.088522f, -0.063996f, -0.005963f, 0.005785f, -0.008938f, -0.077347f, -0.037289f, -0.028694f, -0.030932f, -0.032882f, 0.028128f, 0.020003f, -0.007834f, 0.002723f, -0.006679f, -0.044215f, 0.012259f, -0.009753f, -0.002253f, -0.045279f, -0.041602f, -0.009467f, 0.017724f, 0.018708f, 0.002597f, 0.020066f, 0.009466f, 0.025822f, 0.004048f, 0.003562f, -0.047257f, -0.030090f, 0.020114f, 0.003480f, -0.013113f, 0.022769f, + 0.010480f, 0.002398f, -0.022793f, 0.019972f, 0.030149f, 0.019225f, 0.021849f, 0.025669f, -0.006219f, 0.028650f, 0.061385f, 0.046441f, 0.010821f, 0.004658f, -0.008021f, -0.012805f, -0.031789f, -0.042066f, 0.010285f, -0.015734f, -0.001002f, 0.002107f, -0.003304f, -0.011360f, -0.005601f, -0.015427f, -0.105254f, -0.012423f, 0.024636f, 0.030354f, -0.025137f, 0.037653f, 0.009929f, -0.013758f, -0.040346f, 0.009654f, -0.010964f, -0.056902f, -0.020012f, -0.019565f, 0.002669f, -0.078729f, -0.064001f, -0.009658f, 0.037543f, -0.004290f, -0.013754f, -0.047238f, -0.000730f, 0.042285f, 0.000258f, -0.027664f, -0.018239f, -0.005184f, -0.017925f, 0.011252f, 0.011995f, -0.039831f, -0.047252f, 0.008105f, -0.003292f, 0.010817f, 0.073397f, -0.044922f, -0.006479f, -0.001881f, -0.074913f, -0.021054f, -0.055264f, -0.007379f, -0.006190f, 0.052847f, 0.056722f, 0.072520f, 0.018828f, 0.013140f, -0.028787f, -0.061549f, 0.000897f, 0.026462f, -0.023330f, 0.088856f, 0.203717f, 0.198248f, 0.027198f, -0.125160f, -0.117447f, -0.044398f, -0.074427f, 0.242965f, 0.148105f, 0.095061f, 0.120675f, -0.000905f, -0.066317f, -0.171295f, + -0.111961f, -0.041712f, -0.010725f, 0.070534f, 0.139007f, 0.126212f, -0.016333f, -0.102321f, -0.064099f, -0.092550f, -0.075080f, 0.014189f, 0.100323f, 0.149476f, 0.056093f, -0.006926f, 0.006920f, -0.055787f, -0.068697f, -0.065816f, 0.022063f, 0.011602f, 0.016171f, 0.060747f, 0.030552f, -0.004888f, -0.039444f, -0.031927f, -0.023057f, -0.051136f, -0.011620f, 0.024325f, -0.020649f, 0.002584f, -0.008292f, 0.037550f, 0.026244f, -0.047373f, -0.031320f, -0.096993f, -0.080111f, -0.068955f, 0.043966f, 0.080875f, 0.029292f, 0.021970f, -0.029807f, -0.049534f, -0.155076f, -0.112574f, -0.069354f, 0.014717f, 0.041920f, 0.028978f, 0.005525f, -0.055060f, -0.048158f, -0.088028f, -0.149559f, -0.056809f, 0.016535f, 0.045318f, 0.075420f, 0.037137f, -0.000749f, -0.039932f, -0.016111f, -0.025751f, 0.001081f, 0.056496f, -0.055323f, 0.063370f, 0.009662f, 0.008849f, -0.099232f, -0.029355f, 0.083387f, -0.055066f, 0.021618f, 0.002206f, -0.021231f, 0.028470f, 0.007889f, 0.047698f, 0.070091f, -0.040051f, -0.058337f, 0.016978f, -0.036256f, 0.047318f, -0.060868f, -0.028802f, -0.039180f, 0.006601f, -0.011974f, -0.031958f, + 0.013616f, 0.070885f, -0.055727f, -0.057299f, -0.045918f, -0.011516f, -0.014821f, 0.094425f, 0.003679f, -0.000377f, -0.092607f, -0.020981f, 0.006519f, 0.079750f, 0.031582f, -0.011279f, -0.132676f, -0.091038f, 0.086587f, 0.099188f, 0.091378f, -0.040252f, -0.220024f, -0.040243f, 0.095518f, 0.084359f, 0.010049f, -0.022388f, 0.011378f, -0.085079f, -0.054934f, 0.032671f, -0.028454f, 0.029880f, -0.018721f, 0.006658f, 0.089578f, -0.065471f, -0.038772f, 0.079603f, 0.057486f, 0.118546f, 0.046163f, -0.150850f, 0.045415f, 0.169633f, 0.032945f, 0.087524f, 0.018375f, -0.043424f, -0.004275f, 0.109219f, 0.069875f, 0.143995f, -0.187731f, 0.028691f, -0.004190f, -0.017489f, 0.070247f, 0.004418f, -0.099077f, 0.011672f, -0.007255f, -0.016570f, 0.011099f, 0.002761f, -0.061886f, 0.054609f, -0.027424f, 0.001770f, -0.000561f, -0.010716f, -0.000638f, 0.010971f, -0.019561f, -0.018095f, -0.035324f, -0.043721f, 0.042906f, 0.001002f, 0.013652f, 0.042715f, -0.048327f, 0.024767f, -0.005119f, -0.078287f, -0.003153f, 0.028767f, 0.084578f, -0.019894f, -0.126003f, -0.011080f, 0.054844f, 0.019058f, 0.048019f, -0.037056f, + -0.037786f, -0.041107f, 0.016869f, -0.004382f, 0.027818f, -0.043546f, 0.019696f, 0.015532f, 0.010373f, -0.048684f, 0.001568f, 0.014891f, 0.033158f, -0.010969f, 0.003935f, -0.027924f, 0.007786f, -0.014965f, 0.027692f, -0.001611f, 0.021277f, -0.003739f, 0.006313f, -0.031230f, 0.000971f, 0.000151f, 0.033409f, -0.016662f, 0.010746f, -0.033755f, 0.001822f, -0.000838f, 0.027570f, -0.006003f, 0.011046f, -0.108562f, 0.012273f, 0.019410f, 0.010354f, 0.107027f, 0.018035f, -0.008038f, -0.068326f, -0.011686f, -0.006718f, -0.016014f, -0.000677f, -0.012936f, 0.027389f, 0.012778f, -0.020140f, -0.003454f, 0.042506f, 0.000131f, -0.002388f, 0.004515f, -0.010637f, -0.018243f, 0.023854f, 0.021088f, 0.016010f, -0.026573f, 0.013974f, 0.039764f, 0.015598f, -0.002282f, 0.025653f, -0.004667f, -0.030430f, 0.008051f, 0.007719f, -0.024512f, -0.026640f, 0.026547f, 0.025853f, -0.025513f, 0.016359f, 0.015793f, -0.000218f, -0.009291f, 0.000198f, 0.020185f, -0.001107f, -0.022536f, 0.011740f, 0.013754f, -0.041857f, 0.010711f, 0.030970f, 0.010132f, -0.027209f, 0.004245f, 0.019228f, -0.035262f, 0.009595f, 0.016531f, + 0.006993f, -0.009169f, -0.033609f, 0.039585f, -0.042827f, -0.003780f, 0.041249f, 0.000674f, -0.007091f, 0.000913f, -0.038729f, 0.017155f, -0.000550f, 0.022138f, 0.041024f, -0.018551f, -0.002928f, -0.023695f, 0.031383f, -0.006568f, -0.003480f, 0.032154f, -0.041959f, -0.018460f, 0.023337f, 0.019023f, 0.008374f, -0.034136f, 0.011831f, -0.007501f, -0.002115f, 0.016373f, 0.012476f, 0.002346f, -0.008660f, -0.004370f, 0.001618f, 0.009265f, -0.029768f, 0.021715f, 0.004466f, -0.004141f, 0.008450f, -0.003906f, 0.018892f, -0.028034f, -0.005041f, 0.000580f, 0.001691f, 0.002799f, 0.013018f, 0.008592f, -0.047570f, 0.025181f, -0.005041f, -0.005534f, -0.001935f, 0.009691f, 0.013069f, -0.011797f, -0.004713f, 0.022156f, -0.018901f, -0.002430f, -0.014445f, 0.010537f, 0.100361f, 0.008741f, -0.012192f, -0.033606f, -0.022249f, 0.011687f, -0.014908f, 0.012868f, -0.019915f, -0.001661f, 0.015929f, -0.009068f, 0.007503f, 0.007240f, -0.027781f, 0.007595f, -0.009085f, -0.006145f, -0.022899f, 0.006373f, -0.006477f, -0.014552f, -0.006730f, 0.010972f, -0.009998f, -0.010012f, 0.014142f, -0.015819f, 0.007949f, 0.013332f, + -0.027867f, 0.027345f, -0.006964f, -0.032899f, 0.017378f, 0.017173f, -0.015303f, 0.005182f, 0.009896f, -0.013982f, -0.012427f, -0.000057f, 0.001820f, 0.008784f, -0.004540f, -0.001836f, -0.013825f, 0.012494f, -0.010842f, -0.003652f, 0.015828f, -0.019337f, 0.005483f, -0.003651f, 0.000001f, -0.009205f, -0.012422f, -0.005223f, 0.021519f, -0.014944f, -0.005682f, 0.003293f, 0.004520f, 0.000422f, -0.013146f, 0.009753f, -0.005934f, -0.011496f, -0.000399f, -0.020906f, 0.030173f, -0.013582f, 0.006046f, 0.006459f, -0.006312f, 0.010268f, -0.018088f, -0.014906f, 0.018324f, -0.009281f, -0.012583f, 0.012104f, -0.000927f, 0.003203f, -0.008428f, 0.001953f, -0.001951f, 0.005396f, -0.006752f, -0.005445f, 0.006867f, -0.004309f, -0.004959f, -0.001560f, 0.004285f, -0.003133f, -0.000531f, -0.002597f, 0.001044f, 0.003930f, -0.006032f, -0.006216f, 0.017192f, -0.005379f, -0.006342f, 0.005148f, -0.002131f, 0.004763f, -0.014050f, 0.000650f, -0.002462f, -0.000715f, -0.003837f, 0.015960f, 0.000060f, -0.014590f, 0.004528f, 0.001285f, -0.000775f, -0.000177f, 0.006161f, -0.004384f, -0.004277f, -0.002121f, -0.003876f, -0.002172f, + 0.001624f, -0.004788f, -0.000278f, 0.001026f, -0.000794f, -0.050151f, -0.081087f, 0.036896f, 0.281194f, 0.042748f, 0.140623f, -0.033238f, -0.142472f, -0.052164f, -0.138840f, -0.091887f, -0.028810f, -0.015585f, 0.006885f, 0.082357f, 0.099606f, 0.137648f, 0.137239f, 0.043244f, -0.053885f, -0.087924f, -0.160540f, -0.123466f, -0.064535f, -0.025520f, -0.016173f, 0.049370f, 0.083604f, 0.064112f, 0.088075f, 0.084811f, 0.031639f, 0.027302f, 0.010688f, -0.062555f, -0.022854f, -0.053824f, -0.092398f, -0.056305f, -0.053860f, -0.080621f, -0.016821f, 0.037272f, 0.028824f, 0.081684f, 0.107701f, 0.055644f, 0.071838f, 0.053574f, -0.007275f, -0.002613f, -0.004752f, -0.058042f, -0.070870f, -0.063723f, -0.095291f, -0.081682f, -0.028498f, -0.005044f, 0.011850f, 0.066060f, 0.061335f, 0.058578f, 0.074406f, 0.055085f, 0.019317f, 0.034720f, 0.019474f, -0.021823f, -0.009985f, -0.040127f, -0.083616f, -0.050714f, -0.047315f, -0.066334f, -0.031545f, -0.021423f, -0.036857f, 0.031179f, 0.059733f, 0.068386f, 0.109769f, 0.102908f, 0.043844f, 0.025375f, -0.001131f, -0.037617f, -0.044070f, -0.046001f, -0.066341f, -0.061260f, + -0.055739f, -0.051606f, -0.031798f, -0.012973f, 0.000214f, 0.024809f, 0.058980f, 0.072908f, 0.068320f, 0.081844f, 0.057146f, 0.027345f, 0.011955f, -0.009722f, -0.041777f, -0.047743f, -0.065973f, -0.086689f, -0.086880f, -0.069472f, -0.057552f, -0.008989f, 0.034942f, 0.077247f, 0.104107f, 0.112153f, 0.087089f, 0.056360f, 0.025384f, -0.006919f, -0.043144f, -0.063857f, -0.085764f, -0.085611f, -0.060845f, -0.040283f, -0.011883f, 0.015387f, 0.031202f, 0.040782f, 0.051505f, 0.044039f, 0.027917f, 0.023229f, 0.008651f, -0.000623f, -0.007794f, -0.010616f, -0.013369f, -0.013457f, -0.018976f, -0.015799f, -0.012009f, -0.010274f, -0.009892f, -0.006704f, -0.006150f, -0.001282f, 0.003663f, 0.010681f, 0.013053f, 0.017292f, 0.018607f, 0.019345f, 0.012277f, 0.007376f, 0.001587f, -0.002187f, -0.010846f, -0.014943f, -0.019704f, -0.019087f, -0.016318f, -0.009805f, -0.006535f, -0.001216f, 0.001943f, 0.009581f, 0.013512f, 0.016951f, 0.013712f, 0.013395f, 0.009261f, 0.006125f, 0.001351f, -0.000444f, -0.006022f, -0.008695f, -0.012895f, -0.013712f, -0.014719f, -0.010152f, -0.006896f, -0.000337f, 0.002276f, 0.007417f, + 0.009333f, 0.011705f, 0.008897f, 0.009468f, 0.006602f, 0.005455f, 0.000919f, -0.001375f, -0.005363f, -0.005774f, -0.008269f, -0.007167f, -0.007951f, -0.005727f, -0.005085f, -0.001029f, 0.000244f, 0.004261f, 0.005145f, 0.007837f, 0.006468f, 0.006925f, 0.003218f, 0.002095f, -0.000906f, -0.000508f, -0.002811f, -0.002474f, -0.004799f, -0.003771f, -0.004898f, -0.002841f, -0.003031f, 0.000012f, 0.000335f, 0.003082f, 0.002391f, 0.003705f, 0.001942f, 0.002865f, 0.000772f, 0.001490f, -0.000634f, 0.000260f, -0.001401f, -0.000172f, -0.001646f, -0.000136f, -0.001373f, 0.000248f, -0.001004f, 0.000547f, -0.000734f}, + {-0.002129f, 0.011495f, -0.006462f, 0.001925f, -0.009605f, 0.002687f, 0.001075f, 0.014648f, -0.008780f, 0.000026f, -0.004623f, 0.007338f, 0.007488f, -0.004787f, -0.000920f, -0.004116f, -0.002368f, -0.004812f, -0.005993f, 0.004405f, 0.001431f, -0.003922f, 0.008164f, 0.007435f, 0.012712f, -0.000388f, 0.004805f, 0.002518f, -0.000229f, -0.011512f, 0.002974f, 0.004774f, -0.004557f, 0.002861f, -0.003365f, -0.003915f, -0.006330f, 0.003260f, 0.008103f, 0.000823f, 0.009457f, -0.003886f, -0.000829f, 0.009541f, 0.004979f, 0.000755f, -0.000141f, 0.009060f, 0.013614f, -0.010159f, 0.002248f, -0.003521f, -0.001597f, -0.015805f, -0.005629f, 0.006362f, -0.004930f, 0.004402f, 0.002016f, -0.002339f, -0.003858f, 0.002214f, -0.001340f, 0.004902f, 0.002641f, 0.002272f, 0.002491f, -0.008219f, 0.000280f, -0.003964f, 0.005011f, 0.008337f, 0.005833f, -0.001216f, 0.009026f, 0.000034f, 0.003810f, -0.001227f, -0.002046f, 0.000457f, 0.004509f, 0.005208f, -0.001746f, -0.003602f, -0.007413f, -0.000982f, -0.003291f, -0.003522f, -0.002005f, -0.003002f, -0.002164f, -0.003531f, -0.001874f, -0.000119f, -0.000088f, 0.000048f, + 0.002868f, -0.002048f, 0.001479f, -0.000762f, -0.001460f, 0.000044f, 0.001287f, 0.000452f, 0.001015f, -0.000037f, -0.001025f, -0.000020f, 0.001312f, 0.000412f, -0.002056f, -0.001597f, -0.000130f, -0.000022f, 0.000759f, 0.000735f, 0.000056f, 0.001630f, -0.002072f, 0.006954f, -0.008499f, -0.008661f, 0.000220f, -0.011704f, 0.002057f, -0.003608f, 0.005630f, -0.003054f, -0.009484f, 0.001178f, 0.009077f, -0.001293f, 0.000205f, 0.012904f, 0.015968f, -0.006827f, -0.007490f, -0.001985f, -0.012065f, 0.005219f, 0.000980f, 0.003092f, -0.004315f, 0.006494f, -0.008441f, -0.001405f, 0.005592f, -0.004575f, -0.001821f, 0.000987f, 0.010249f, 0.000779f, 0.007385f, -0.009768f, 0.009596f, -0.000946f, 0.001292f, 0.006398f, -0.005535f, 0.005357f, -0.002574f, -0.002396f, 0.004405f, 0.006073f, -0.001122f, 0.003522f, -0.013218f, 0.008039f, 0.007580f, -0.013778f, -0.012341f, -0.003340f, -0.010254f, -0.002728f, 0.003755f, 0.002638f, 0.003581f, 0.000328f, -0.003493f, 0.008664f, -0.002976f, 0.000429f, -0.003530f, 0.002130f, -0.005289f, 0.007390f, 0.001671f, -0.005481f, -0.003242f, -0.002100f, -0.003357f, -0.002754f, + 0.007254f, 0.009769f, -0.000572f, -0.001850f, 0.000263f, 0.003209f, -0.002120f, 0.006862f, 0.003717f, -0.002637f, -0.000630f, -0.001602f, 0.002818f, -0.002706f, -0.000192f, -0.000625f, 0.000334f, 0.001190f, -0.000279f, -0.000708f, 0.001717f, -0.001293f, -0.000583f, 0.000503f, 0.001108f, 0.000220f, -0.002560f, -0.001565f, 0.000360f, -0.001488f, -0.001464f, 0.001744f, -0.000970f, -0.002866f, -0.002039f, -0.002280f, -0.000752f, 0.000510f, 0.002766f, 0.020638f, 0.003978f, -0.007669f, 0.009613f, 0.001194f, -0.006472f, 0.018853f, -0.012633f, -0.018168f, -0.010599f, -0.011023f, -0.003667f, 0.005349f, 0.006660f, -0.006290f, 0.009570f, -0.011974f, -0.006479f, -0.001462f, 0.004006f, 0.002969f, -0.003599f, -0.004712f, 0.010707f, 0.002042f, -0.000680f, -0.005988f, 0.008008f, -0.005830f, -0.001297f, -0.000020f, -0.000623f, -0.000842f, 0.003152f, 0.001651f, -0.001588f, 0.006642f, -0.003078f, 0.004050f, -0.000228f, -0.010842f, -0.004195f, -0.004330f, 0.011590f, -0.006389f, -0.007710f, -0.014075f, -0.016388f, -0.003002f, 0.000903f, -0.006563f, 0.012552f, 0.001694f, 0.006774f, -0.005034f, 0.010877f, 0.004620f, + -0.006194f, 0.017437f, -0.007822f, -0.008424f, 0.001424f, 0.010937f, 0.016089f, 0.011355f, 0.003833f, -0.005560f, -0.012521f, 0.005039f, -0.000072f, 0.012440f, 0.005078f, -0.003527f, -0.000344f, 0.006357f, 0.005175f, 0.000118f, -0.001097f, 0.000548f, -0.002389f, -0.005203f, -0.000402f, 0.001676f, 0.001392f, 0.004553f, -0.000063f, 0.002774f, -0.000860f, 0.002198f, -0.000450f, 0.000448f, -0.000363f, -0.003024f, 0.000393f, -0.000520f, -0.003818f, 0.003193f, -0.000615f, 0.001973f, -0.000955f, -0.002067f, 0.000406f, 0.000420f, -0.000037f, -0.001334f, 0.001573f, 0.000632f, -0.000916f, -0.000268f, -0.002898f, 0.000443f, -0.001579f, 0.001576f, -0.000440f, 0.003321f, -0.000056f, -0.001625f, -0.001325f, -0.019668f, 0.003185f, -0.007218f, 0.004665f, 0.001199f, 0.014183f, -0.018196f, -0.010196f, -0.013380f, 0.007245f, 0.005813f, 0.008671f, -0.009570f, 0.003395f, -0.002904f, 0.001341f, -0.014852f, -0.012457f, -0.009326f, -0.009016f, 0.014831f, -0.005870f, -0.001873f, -0.000131f, 0.005004f, -0.002236f, -0.015769f, 0.006757f, -0.006317f, -0.001909f, 0.007189f, 0.005598f, 0.008264f, 0.000682f, 0.004388f, + -0.010851f, -0.004614f, 0.010007f, 0.016312f, 0.009757f, -0.000776f, -0.012360f, 0.008856f, -0.003882f, -0.010865f, 0.015076f, 0.004373f, 0.005287f, -0.009241f, -0.005200f, 0.005067f, -0.003221f, -0.005168f, 0.008032f, -0.006258f, 0.002899f, 0.000343f, -0.010242f, -0.002255f, -0.006722f, 0.010882f, 0.005729f, -0.001561f, 0.002030f, -0.005069f, 0.006640f, 0.001043f, -0.000018f, 0.001882f, -0.012282f, -0.006527f, 0.007199f, 0.003353f, -0.001859f, -0.001643f, -0.008680f, 0.014483f, 0.018146f, 0.009890f, -0.008062f, 0.007335f, 0.001449f, 0.006256f, -0.002560f, 0.005138f, -0.003769f, 0.003315f, 0.006749f, 0.003508f, 0.003334f, 0.002354f, 0.000314f, -0.002242f, -0.000551f, 0.006407f, 0.000525f, 0.000397f, -0.002228f, -0.000492f, 0.001542f, 0.003842f, -0.000290f, 0.004520f, 0.000942f, 0.000088f, 0.000028f, 0.003664f, 0.004738f, -0.002012f, -0.000668f, -0.000539f, 0.000909f, 0.003217f, 0.000018f, 0.000848f, 0.000450f, 0.000750f, -0.001421f, 0.005421f, -0.029524f, 0.009853f, 0.001490f, 0.007346f, 0.007941f, -0.005761f, -0.020886f, 0.016089f, 0.006822f, 0.015830f, -0.002925f, 0.008391f, + -0.000180f, -0.005700f, -0.000408f, -0.014760f, 0.018036f, 0.004117f, 0.001691f, -0.009300f, -0.005360f, -0.006302f, 0.005371f, -0.008297f, 0.013803f, 0.000597f, 0.004734f, 0.007693f, 0.004230f, -0.000900f, 0.004436f, 0.004252f, -0.003262f, 0.003576f, -0.015407f, 0.003982f, 0.006975f, 0.007156f, 0.013771f, 0.004777f, -0.009258f, 0.004603f, -0.004686f, 0.009370f, 0.001780f, 0.006811f, 0.010469f, 0.001700f, -0.002344f, 0.008214f, -0.005713f, -0.008976f, -0.003355f, 0.005720f, 0.014518f, -0.003481f, 0.000869f, 0.000232f, 0.001692f, 0.002831f, 0.006051f, 0.002043f, -0.003884f, -0.000718f, -0.005222f, 0.003720f, 0.001153f, -0.009265f, -0.008185f, 0.003209f, 0.005066f, 0.005105f, 0.009089f, -0.014133f, -0.007649f, -0.010313f, 0.012025f, -0.005370f, -0.007571f, 0.003880f, -0.006986f, -0.010087f, -0.003702f, 0.000241f, 0.010686f, -0.003844f, 0.003405f, -0.004325f, -0.002589f, -0.000668f, 0.003200f, 0.001381f, -0.002028f, -0.001677f, 0.001983f, 0.005299f, 0.001728f, 0.003036f, -0.001568f, -0.001061f, 0.003539f, -0.000190f, 0.000160f, 0.001315f, -0.002618f, 0.004726f, -0.001584f, -0.000380f, + -0.002330f, -0.006136f, -0.001044f, -0.001390f, -0.000553f, -0.000117f, -0.002394f, 0.000191f, 0.005347f, -0.001411f, -0.000637f, -0.001090f, -0.002132f, 0.007126f, 0.030134f, 0.015748f, 0.014399f, 0.020608f, 0.005807f, 0.003634f, -0.012546f, -0.000576f, -0.023598f, -0.004440f, 0.009204f, 0.006407f, 0.004376f, 0.005333f, 0.006693f, -0.005291f, -0.003320f, 0.013454f, 0.012434f, 0.010370f, -0.000644f, 0.001312f, -0.016811f, -0.014862f, -0.005410f, 0.010571f, 0.003629f, -0.002398f, 0.005987f, -0.010053f, 0.001089f, -0.005270f, 0.011967f, 0.009107f, 0.020901f, -0.002232f, 0.007980f, 0.006348f, -0.003186f, -0.011056f, 0.019672f, -0.011526f, -0.002424f, 0.008662f, 0.000575f, 0.004847f, 0.014223f, -0.004674f, 0.005399f, -0.013789f, -0.028940f, -0.016316f, -0.009503f, -0.004089f, 0.001498f, -0.001345f, -0.007352f, -0.015821f, -0.003110f, -0.011413f, 0.003597f, -0.000446f, 0.001534f, -0.017821f, -0.007880f, 0.011243f, 0.004096f, -0.000877f, -0.019401f, -0.017880f, 0.010675f, 0.001701f, 0.006556f, -0.013154f, -0.010197f, 0.000502f, -0.005132f, -0.011252f, -0.007715f, 0.006016f, -0.002254f, 0.002665f, + 0.000963f, 0.007570f, 0.005836f, 0.002468f, -0.003807f, 0.001902f, -0.000563f, -0.004908f, -0.004505f, 0.004269f, -0.001770f, 0.001122f, -0.002863f, -0.004747f, -0.000652f, -0.000566f, 0.004178f, -0.000651f, -0.003792f, 0.000862f, 0.001652f, 0.004262f, 0.001015f, 0.000874f, -0.001751f, 0.005385f, -0.001984f, 0.006158f, -0.003369f, 0.004515f, -0.004034f, 0.000526f, 0.002611f, 0.000016f, -0.000166f, 0.000819f, -0.000994f, -0.001612f, -0.015207f, 0.011516f, -0.006785f, -0.000522f, -0.039515f, -0.009285f, -0.014633f, -0.009616f, 0.001566f, 0.013068f, -0.002634f, 0.017267f, 0.009088f, -0.000986f, -0.017015f, -0.006998f, 0.025226f, 0.004256f, -0.015160f, -0.011023f, -0.005031f, 0.011874f, -0.009272f, 0.000170f, 0.008110f, 0.012914f, 0.014505f, -0.015918f, 0.010692f, 0.001478f, 0.002998f, 0.004579f, 0.005855f, 0.005151f, 0.014542f, 0.000424f, 0.004387f, -0.012756f, 0.017831f, -0.008959f, -0.004249f, 0.003022f, -0.014876f, 0.018369f, -0.002947f, -0.035854f, -0.011901f, -0.028786f, 0.001719f, -0.000407f, -0.008745f, 0.039068f, -0.006874f, -0.019329f, -0.006603f, -0.004748f, 0.017906f, -0.002453f, + 0.008520f, 0.010529f, -0.007370f, 0.013407f, 0.018456f, -0.009397f, 0.007001f, -0.016442f, 0.007978f, -0.005896f, -0.004689f, 0.018993f, -0.006995f, -0.001818f, -0.008486f, 0.000503f, 0.000282f, 0.007244f, 0.010684f, 0.011364f, -0.003071f, -0.003226f, 0.000408f, 0.014718f, 0.006942f, 0.007650f, 0.000255f, -0.012024f, 0.004790f, -0.005841f, -0.006579f, -0.003597f, -0.000158f, -0.000340f, 0.000745f, 0.002669f, 0.002771f, -0.000710f, 0.007964f, 0.001292f, 0.003463f, 0.001388f, 0.001550f, -0.002242f, 0.002089f, 0.000805f, -0.002395f, -0.003508f, -0.002303f, -0.006030f, -0.004738f, 0.004144f, 0.003319f, -0.005107f, 0.001369f, -0.000285f, 0.001415f, 0.005752f, 0.001208f, -0.002262f, 0.000614f, 0.001847f, 0.000118f, -0.004669f, 0.002056f, 0.017879f, -0.024995f, 0.004936f, 0.005183f, -0.008008f, 0.003421f, 0.018807f, 0.020294f, 0.007427f, 0.007289f, 0.009569f, -0.015615f, -0.002814f, -0.016679f, -0.000445f, 0.010723f, 0.006665f, -0.003484f, -0.013331f, -0.004252f, 0.008834f, -0.017305f, 0.000480f, -0.001210f, 0.007886f, 0.016535f, 0.001445f, -0.008877f, -0.006903f, 0.017685f, -0.011480f, + -0.005465f, 0.010038f, -0.006313f, -0.021018f, -0.007555f, 0.004615f, 0.003543f, -0.008492f, 0.001962f, 0.010734f, 0.007513f, 0.010344f, -0.001230f, 0.007759f, 0.015015f, -0.006775f, 0.007479f, 0.006297f, -0.010272f, 0.022114f, -0.021418f, 0.012601f, 0.005613f, -0.029931f, 0.028476f, -0.018603f, 0.004036f, -0.003467f, 0.022718f, -0.009829f, -0.016130f, -0.003613f, 0.000125f, 0.003936f, 0.017443f, -0.015034f, -0.000751f, 0.000866f, 0.000998f, -0.002869f, 0.005144f, -0.012274f, -0.001800f, -0.008815f, -0.016104f, -0.018018f, 0.009564f, 0.007564f, 0.007387f, -0.000043f, 0.011236f, -0.005418f, -0.013071f, 0.003167f, -0.023119f, -0.019469f, -0.003669f, 0.005411f, -0.000249f, -0.003794f, -0.003035f, 0.002530f, -0.012690f, -0.004452f, -0.002722f, -0.002292f, 0.005800f, -0.000849f, 0.000900f, 0.000239f, -0.004222f, 0.001837f, -0.004740f, 0.000109f, 0.002141f, -0.005301f, -0.001163f, 0.004036f, -0.003427f, -0.000224f, -0.002435f, -0.000445f, 0.001486f, -0.000101f, -0.007033f, -0.001348f, -0.000201f, -0.000602f, -0.001309f, -0.004499f, -0.007251f, -0.001975f, -0.000569f, -0.001254f, 0.005660f, 0.004025f, + 0.000656f, -0.001596f, -0.020251f, 0.016113f, -0.046036f, 0.025330f, -0.018499f, -0.012232f, -0.022657f, 0.002737f, -0.002980f, 0.004152f, 0.015672f, -0.013206f, -0.005459f, 0.012934f, 0.011327f, -0.003631f, 0.004223f, -0.005981f, -0.021259f, -0.001841f, 0.004976f, -0.010596f, 0.016608f, 0.002983f, -0.002274f, -0.009924f, -0.010188f, 0.002410f, 0.025754f, 0.001184f, -0.003961f, 0.007216f, -0.022822f, -0.003821f, 0.007930f, -0.015200f, 0.021593f, 0.013962f, -0.001083f, -0.006655f, -0.007632f, -0.008395f, -0.015270f, -0.018464f, 0.015263f, 0.001191f, 0.027344f, 0.002545f, -0.001726f, -0.012389f, 0.002008f, -0.004837f, 0.005918f, -0.000356f, -0.017704f, -0.013593f, -0.018034f, -0.029872f, -0.004449f, 0.026385f, -0.025489f, -0.001525f, -0.026676f, 0.004240f, 0.007155f, 0.006163f, 0.018559f, -0.002047f, -0.027412f, 0.019500f, -0.002161f, -0.013110f, -0.011224f, -0.023428f, -0.008303f, -0.017809f, 0.009506f, -0.027360f, -0.004835f, 0.010788f, -0.000478f, 0.002109f, 0.012831f, 0.006696f, 0.015465f, 0.000088f, -0.008776f, -0.003338f, -0.006096f, -0.000267f, 0.005546f, -0.001581f, 0.000758f, 0.000821f, + 0.000372f, -0.004548f, -0.006923f, 0.004227f, -0.004924f, 0.002058f, 0.000592f, -0.000933f, 0.001838f, 0.000719f, 0.000631f, 0.009469f, 0.001469f, -0.000542f, 0.001563f, 0.003003f, 0.001861f, -0.004747f, -0.000949f, -0.010006f, 0.003536f, 0.005190f, 0.007623f, 0.002824f, 0.002485f, -0.000156f, -0.005283f, 0.003046f, -0.000433f, 0.019658f, -0.007197f, 0.017478f, -0.017060f, -0.009043f, 0.011945f, 0.003832f, -0.023026f, 0.001492f, 0.029936f, -0.034493f, 0.002027f, 0.016114f, 0.038758f, -0.016576f, -0.009873f, -0.004249f, 0.030007f, 0.029472f, -0.031171f, -0.001467f, -0.023952f, -0.011465f, 0.015572f, 0.015675f, 0.020513f, 0.011653f, -0.004097f, 0.014428f, -0.017878f, -0.009636f, -0.001818f, -0.002755f, -0.025871f, 0.002278f, -0.000623f, 0.034175f, -0.005321f, 0.016837f, 0.004030f, 0.009976f, 0.022850f, -0.013869f, -0.006223f, -0.033779f, 0.023212f, -0.029773f, -0.005343f, 0.006821f, -0.004082f, -0.017204f, -0.004380f, 0.004866f, -0.012294f, 0.003333f, -0.002069f, -0.002623f, -0.038025f, -0.026901f, 0.001799f, -0.019511f, -0.026730f, 0.004893f, -0.024723f, 0.007823f, 0.015940f, -0.014491f, + 0.027439f, 0.005757f, 0.017571f, 0.018935f, 0.004761f, -0.014091f, -0.016788f, -0.020779f, 0.010551f, -0.021561f, 0.012835f, 0.015542f, 0.021349f, 0.003767f, -0.015426f, -0.009853f, 0.000292f, 0.002052f, -0.028637f, -0.000729f, -0.018600f, -0.003168f, -0.005373f, 0.001121f, -0.013668f, 0.001744f, -0.003255f, -0.000229f, -0.008943f, -0.006434f, 0.001928f, 0.014183f, 0.001325f, -0.001399f, 0.001749f, -0.002067f, -0.005456f, -0.005224f, -0.005894f, -0.002550f, -0.006965f, 0.007291f, 0.005160f, -0.000555f, -0.005812f, 0.008667f, 0.012842f, -0.002959f, -0.002493f, -0.003146f, -0.001567f, -0.000500f, 0.002976f, -0.005023f, 0.004945f, 0.004753f, 0.003052f, -0.004789f, -0.000975f, 0.002648f, 0.003533f, 0.008923f, -0.018356f, 0.047377f, 0.019754f, 0.008230f, 0.024365f, -0.009295f, 0.005128f, -0.025133f, -0.032396f, 0.020447f, 0.041654f, 0.012432f, -0.000193f, -0.041126f, 0.049677f, 0.007218f, 0.006119f, 0.007164f, 0.001844f, 0.009019f, 0.002838f, -0.007079f, -0.000304f, 0.012583f, -0.007699f, 0.015802f, 0.003030f, -0.012373f, -0.017218f, -0.004663f, 0.015734f, -0.004271f, 0.005137f, -0.007076f, + -0.006312f, 0.000305f, 0.044573f, 0.007251f, 0.006449f, 0.006061f, 0.003763f, 0.026754f, -0.009953f, 0.007727f, -0.017261f, 0.031867f, 0.044337f, 0.011597f, -0.002554f, -0.015741f, 0.046328f, 0.021814f, 0.000682f, -0.017887f, 0.006775f, -0.010715f, -0.001663f, -0.020528f, -0.007729f, -0.013686f, -0.018863f, 0.030531f, -0.009150f, 0.022510f, 0.004713f, -0.017486f, -0.000261f, -0.037464f, 0.035647f, -0.002548f, -0.017055f, -0.013285f, -0.021735f, -0.026751f, -0.014650f, 0.041515f, -0.012930f, 0.014974f, 0.018846f, -0.016736f, -0.015950f, -0.029904f, 0.004515f, 0.020203f, 0.006932f, 0.019316f, -0.004444f, -0.003792f, 0.000874f, 0.005503f, -0.008224f, 0.002323f, -0.014896f, 0.004858f, -0.000682f, 0.016935f, 0.011951f, -0.009144f, 0.000936f, -0.000496f, 0.010086f, -0.003420f, -0.013391f, 0.002973f, -0.000397f, -0.001095f, 0.005008f, 0.000914f, -0.002075f, -0.006737f, -0.007491f, -0.001467f, -0.001760f, 0.007940f, -0.000263f, 0.007959f, -0.010916f, 0.002615f, 0.008323f, -0.015593f, -0.011274f, 0.004047f, -0.008351f, -0.002235f, -0.004918f, 0.011648f, 0.014054f, -0.010471f, -0.011069f, 0.044070f, + 0.043263f, 0.053377f, 0.032168f, 0.010578f, -0.013553f, -0.014127f, 0.008019f, 0.015488f, 0.019010f, -0.028405f, -0.000811f, -0.003405f, 0.014266f, 0.011220f, -0.019666f, -0.024309f, -0.000065f, -0.009224f, 0.023183f, 0.027224f, 0.000020f, 0.014422f, 0.004787f, 0.005753f, 0.031496f, -0.019236f, -0.025437f, 0.020067f, -0.033321f, 0.002863f, -0.010246f, 0.018391f, 0.009430f, 0.000320f, 0.021568f, 0.019748f, -0.017935f, 0.022377f, -0.000012f, -0.009602f, 0.005337f, 0.024311f, -0.009367f, 0.010389f, 0.018080f, 0.008145f, -0.038839f, -0.022500f, 0.003871f, 0.002035f, -0.026392f, -0.018082f, 0.008823f, 0.012558f, 0.010734f, -0.036036f, -0.025113f, -0.025085f, -0.001944f, 0.015591f, 0.022812f, -0.057235f, -0.042003f, 0.006976f, 0.008839f, 0.033025f, 0.011701f, 0.012097f, 0.024111f, -0.002614f, -0.006125f, -0.008759f, 0.059124f, 0.020397f, -0.009269f, -0.030938f, 0.028295f, 0.018424f, -0.009183f, -0.008425f, 0.004414f, -0.008536f, 0.015141f, -0.005479f, -0.003175f, 0.008851f, -0.002143f, -0.003576f, -0.004599f, 0.009294f, 0.024275f, 0.000134f, 0.001783f, 0.000810f, 0.010592f, 0.013485f, + -0.003386f, -0.008554f, 0.003720f, -0.000838f, 0.002786f, 0.001540f, 0.002137f, -0.011533f, -0.006206f, 0.008089f, 0.000889f, -0.004726f, 0.004036f, 0.011272f, 0.008883f, -0.015253f, -0.003348f, -0.010163f, -0.009663f, 0.007148f, -0.011549f, 0.004488f, -0.006197f, 0.011214f, 0.008817f, -0.013467f, -0.018758f, -0.036321f, -0.035343f, -0.029059f, 0.011217f, -0.003747f, 0.016403f, -0.032039f, -0.005277f, 0.001492f, -0.012357f, -0.014995f, 0.026047f, -0.009981f, 0.005277f, -0.000400f, 0.001816f, -0.026124f, -0.009607f, -0.022340f, 0.002976f, 0.002944f, 0.005809f, 0.061745f, -0.024049f, 0.017050f, 0.026001f, -0.013198f, -0.012443f, -0.018688f, -0.003769f, 0.028840f, -0.029424f, 0.020147f, -0.001922f, -0.004910f, 0.002714f, 0.002952f, 0.015823f, 0.001772f, -0.031214f, 0.023878f, -0.019440f, -0.044816f, -0.036262f, -0.018177f, 0.060670f, 0.051465f, -0.027966f, -0.008057f, -0.038396f, -0.032058f, -0.012645f, 0.037470f, 0.000988f, 0.025843f, 0.013525f, -0.017632f, 0.019718f, -0.013425f, -0.039961f, -0.003392f, -0.024224f, -0.004947f, -0.012973f, 0.078907f, 0.000739f, -0.065328f, 0.051304f, -0.020703f, + -0.014544f, 0.051809f, 0.052684f, 0.000167f, -0.023040f, 0.010266f, 0.012902f, -0.070943f, -0.030496f, 0.001873f, -0.010405f, 0.037128f, 0.015747f, -0.053823f, -0.008026f, -0.004331f, 0.024423f, 0.015508f, 0.010650f, 0.009633f, -0.011175f, 0.001904f, 0.004312f, 0.022500f, -0.002754f, 0.003079f, 0.004458f, 0.003827f, 0.013277f, 0.006254f, 0.000344f, -0.015402f, 0.019509f, -0.001789f, -0.000043f, 0.000876f, 0.000076f, -0.008341f, -0.012907f, -0.008917f, 0.001820f, -0.003244f, 0.005723f, -0.000924f, -0.005682f, 0.006143f, 0.014423f, -0.019155f, -0.006146f, -0.005883f, -0.002671f, 0.005388f, -0.000299f, -0.005524f, -0.010696f, -0.004106f, -0.002705f, 0.009898f, -0.031579f, -0.019363f, 0.009375f, 0.007618f, 0.016911f, 0.053931f, 0.009100f, -0.001205f, 0.012409f, 0.002979f, -0.022530f, -0.013566f, 0.011871f, 0.002935f, 0.043721f, 0.010534f, -0.002913f, 0.016047f, 0.023388f, 0.024053f, 0.025532f, 0.001553f, -0.018222f, -0.004844f, -0.041390f, -0.005439f, -0.046712f, 0.026109f, -0.028504f, -0.010804f, -0.000056f, 0.037826f, -0.022034f, 0.021116f, -0.015536f, 0.012855f, -0.019436f, 0.024194f, + 0.036132f, 0.002625f, -0.007889f, -0.019406f, -0.028401f, 0.015921f, 0.017859f, 0.046222f, -0.006459f, 0.002453f, 0.020087f, 0.073943f, -0.017445f, 0.011201f, -0.012171f, -0.040971f, 0.028634f, -0.005753f, 0.020292f, -0.002419f, 0.004854f, -0.024637f, 0.068091f, -0.102355f, 0.075198f, -0.117462f, 0.050449f, -0.060537f, 0.018602f, -0.047445f, 0.016878f, 0.031647f, -0.007791f, 0.023541f, -0.012313f, 0.085876f, -0.052288f, 0.057052f, -0.088516f, 0.044624f, -0.034884f, 0.042933f, -0.029067f, -0.031064f, -0.015540f, -0.007801f, 0.021329f, -0.005845f, -0.004126f, 0.002238f, 0.001005f, -0.010941f, 0.015062f, -0.016547f, 0.015930f, -0.011941f, 0.004636f, -0.019046f, -0.011057f, -0.014057f, 0.002165f, -0.012923f, 0.015693f, 0.017201f, -0.016633f, -0.000207f, 0.006103f, 0.015785f, -0.002785f, 0.005689f, 0.012474f, -0.012041f, 0.020889f, -0.005892f, 0.027756f, -0.016772f, 0.033324f, -0.024064f, 0.008222f, -0.001953f, 0.018359f, 0.015661f, -0.003491f, 0.009175f, -0.026544f, 0.029691f, -0.020917f, 0.007221f, -0.021261f, 0.015005f, -0.028196f, 0.009494f, -0.002905f, -0.010139f, 0.009854f, -0.019928f, + 0.003018f, -0.009789f, 0.009713f, -0.009686f, 0.005565f, 0.003505f, 0.002608f, -0.007461f, 0.026041f, 0.020996f, 0.082700f, -0.057480f, 0.024053f, 0.015231f, -0.049682f, -0.001288f, -0.009779f, -0.014025f, -0.025536f, -0.001279f, 0.002917f, 0.033018f, 0.012264f, 0.017322f, 0.024733f, 0.020123f, 0.000737f, 0.027543f, -0.031672f, -0.004474f, 0.038141f, 0.004337f, -0.052365f, -0.011951f, -0.068521f, -0.012724f, 0.011942f, -0.012614f, -0.015979f, -0.002901f, 0.061235f, 0.015562f, 0.004685f, 0.007560f, 0.015325f, -0.004541f, -0.035137f, -0.010680f, -0.003905f, 0.006602f, -0.008106f, -0.016336f, 0.044342f, 0.023950f, -0.009174f, -0.002035f, -0.009536f, -0.040028f, -0.032924f, -0.023977f, -0.019995f, 0.044830f, 0.010777f, 0.016591f, -0.026979f, -0.026126f, 0.008422f, 0.018288f, 0.016800f, -0.007513f, -0.005307f, -0.030351f, -0.020102f, 0.026625f, 0.001198f, -0.073564f, 0.025897f, 0.040232f, 0.012854f, -0.032027f, -0.019740f, -0.015929f, 0.005275f, -0.023046f, 0.011406f, -0.054139f, -0.072439f, 0.030033f, 0.026127f, -0.014429f, -0.026635f, 0.020371f, -0.011928f, 0.005309f, 0.006289f, -0.010627f, + 0.011590f, -0.006568f, -0.006818f, -0.003884f, 0.017409f, -0.012351f, -0.003664f, -0.013517f, -0.000198f, 0.001174f, 0.011638f, 0.012096f, -0.001363f, 0.007141f, -0.008567f, 0.014126f, -0.009828f, 0.011543f, -0.026656f, -0.012103f, -0.003683f, 0.007725f, -0.008720f, -0.017358f, -0.013342f, 0.006377f, 0.013724f, -0.000492f, 0.017735f, 0.005007f, 0.007011f, 0.001111f, 0.011547f, -0.006518f, 0.011037f, -0.002648f, -0.021956f, -0.016874f, -0.006471f, 0.010010f, -0.012343f, 0.007275f, -0.018421f, -0.008103f, 0.008425f, -0.068333f, 0.059817f, 0.072689f, -0.006801f, 0.052832f, 0.002161f, 0.008022f, 0.023045f, -0.046784f, 0.016995f, 0.034513f, 0.034120f, 0.014247f, 0.010568f, -0.033852f, 0.024712f, 0.014466f, -0.020500f, 0.010836f, -0.004080f, 0.040216f, 0.011102f, 0.010225f, 0.023805f, -0.009639f, -0.027453f, 0.007844f, 0.051319f, -0.018480f, -0.010004f, 0.046270f, -0.017052f, -0.020839f, -0.016910f, 0.015870f, 0.059613f, 0.082835f, -0.005181f, -0.053900f, 0.081329f, 0.027915f, -0.053602f, 0.060571f, 0.023211f, -0.015150f, -0.015585f, -0.022857f, -0.037780f, -0.002249f, 0.019806f, -0.032493f, + -0.021231f, -0.068523f, -0.009316f, 0.039727f, -0.082909f, -0.044999f, 0.013068f, 0.013262f, 0.016331f, 0.050183f, 0.044477f, -0.073766f, 0.000585f, 0.002722f, -0.052158f, 0.014457f, 0.024785f, -0.026851f, -0.019118f, -0.022688f, 0.015083f, 0.057791f, 0.018090f, 0.030006f, -0.039616f, 0.020072f, -0.044856f, 0.003819f, -0.030179f, -0.122572f, 0.093631f, 0.023969f, -0.034223f, 0.063299f, -0.021917f, -0.028996f, 0.017011f, 0.012851f, 0.016266f, 0.024685f, 0.009977f, -0.025015f, -0.007962f, 0.024213f, -0.000855f, 0.009248f, 0.003864f, -0.004105f, 0.005911f, -0.011037f, 0.008027f, 0.022611f, 0.008138f, -0.013525f, -0.009989f, 0.006822f, -0.006157f, -0.012285f, 0.004563f, 0.014058f, 0.008163f, -0.042479f, -0.012890f, -0.031317f, -0.016267f, 0.018059f, -0.013992f, -0.017561f, 0.016511f, 0.010597f, -0.018372f, 0.023098f, -0.017243f, -0.007637f, 0.008253f, -0.013597f, 0.015179f, -0.006926f, -0.025220f, 0.020747f, -0.038909f, 0.044829f, 0.148412f, -0.047345f, 0.001263f, 0.011464f, 0.066988f, 0.059486f, -0.019492f, -0.025743f, -0.037478f, 0.001656f, 0.028356f, -0.000882f, -0.019175f, -0.019621f, + 0.026762f, -0.014553f, -0.036044f, -0.032127f, -0.006531f, 0.054625f, 0.038240f, -0.043311f, 0.002893f, 0.000865f, -0.018935f, 0.021583f, 0.007941f, -0.015403f, -0.005125f, -0.012097f, -0.005829f, 0.069722f, -0.025941f, -0.046167f, -0.032379f, -0.026202f, 0.061585f, 0.001791f, -0.014281f, 0.056801f, 0.038987f, 0.015586f, 0.028866f, 0.055858f, -0.033909f, 0.008691f, 0.054269f, 0.031818f, 0.041464f, -0.046993f, -0.013259f, -0.001664f, 0.019874f, 0.018803f, -0.044550f, 0.004351f, -0.058534f, -0.087975f, -0.004617f, -0.023201f, 0.040929f, 0.045584f, -0.011897f, -0.003510f, 0.009271f, -0.031921f, -0.085271f, 0.057519f, -0.041299f, 0.008982f, -0.015874f, -0.028743f, -0.016691f, -0.033347f, -0.067575f, 0.040046f, 0.035597f, 0.043234f, 0.008381f, -0.053636f, -0.094358f, -0.027927f, -0.026060f, -0.011442f, 0.029911f, -0.019206f, -0.004657f, 0.005811f, 0.004076f, -0.014910f, -0.006797f, -0.011955f, 0.001537f, -0.005264f, 0.010061f, -0.005812f, -0.007247f, 0.011067f, 0.014333f, 0.011401f, -0.022758f, 0.007597f, 0.001391f, -0.001948f, 0.000369f, -0.050076f, 0.002531f, 0.007061f, 0.007489f, -0.032953f, + 0.021637f, -0.004624f, -0.027427f, -0.022410f, 0.013492f, 0.017830f, -0.003192f, 0.010640f, -0.016858f, -0.011820f, -0.011448f, 0.001472f, 0.020646f, 0.005325f, 0.019729f, -0.000353f, 0.009218f, -0.029039f, -0.004390f, -0.006865f, -0.005358f, 0.022906f, 0.010992f, -0.000683f, 0.007376f, 0.003536f, -0.022873f, -0.007371f, -0.072570f, -0.042131f, -0.033658f, -0.086169f, 0.099433f, -0.002613f, 0.052526f, -0.012254f, 0.002924f, -0.060165f, -0.032390f, -0.031211f, 0.007234f, 0.046527f, -0.001830f, -0.049153f, -0.036183f, -0.070117f, -0.077352f, 0.066263f, 0.024892f, -0.060810f, -0.018452f, 0.029475f, 0.055787f, 0.007415f, -0.068533f, -0.042218f, 0.013881f, 0.018900f, 0.017402f, 0.039829f, -0.042495f, -0.040985f, -0.005930f, -0.014782f, 0.005979f, 0.011603f, -0.082420f, -0.015617f, -0.057394f, -0.037326f, -0.076649f, -0.029546f, 0.105726f, 0.017804f, 0.003639f, 0.025482f, 0.026446f, 0.007880f, 0.078648f, 0.061641f, -0.020196f, 0.020689f, 0.106160f, -0.028114f, -0.024417f, -0.025668f, -0.078546f, -0.003429f, -0.042865f, -0.098342f, -0.102419f, -0.054251f, -0.052720f, 0.023604f, -0.039403f, 0.003077f, + 0.021152f, -0.070198f, -0.025261f, 0.000040f, 0.000021f, 0.017614f, 0.045967f, 0.029944f, 0.055366f, 0.074130f, 0.054408f, -0.007071f, -0.039029f, -0.057515f, -0.004516f, 0.023218f, 0.007312f, -0.008451f, -0.000354f, 0.015772f, 0.013443f, 0.034689f, -0.003579f, 0.005177f, 0.001004f, -0.012122f, 0.011867f, 0.001392f, -0.005258f, 0.029579f, 0.013384f, 0.006387f, -0.027707f, 0.018500f, -0.009670f, 0.013849f, -0.026252f, -0.074474f, -0.003028f, 0.028820f, -0.005072f, -0.039725f, -0.024761f, -0.029183f, -0.021213f, 0.008970f, 0.013413f, 0.014278f, 0.004525f, -0.003032f, 0.011557f, 0.028587f, 0.048934f, 0.045309f, 0.057398f, 0.048270f, -0.004052f, 0.032348f, 0.074729f, 0.004915f, -0.031871f, -0.046744f, -0.046046f, -0.063933f, -0.050938f, -0.025014f, -0.026966f, -0.004124f, -0.007732f, 0.065287f, -0.042580f, 0.012632f, -0.049375f, -0.017180f, -0.053883f, 0.006610f, 0.065994f, -0.001869f, 0.040886f, -0.081609f, 0.071681f, 0.023558f, -0.014383f, 0.056224f, 0.008180f, 0.025358f, -0.022408f, -0.027130f, -0.000285f, 0.016929f, 0.013508f, -0.057154f, 0.052285f, -0.063300f, 0.007898f, 0.017150f, + -0.021155f, 0.036601f, -0.038898f, -0.022662f, -0.004146f, -0.014418f, -0.019622f, -0.004851f, 0.008534f, -0.029525f, -0.034076f, -0.011592f, -0.005857f, -0.008917f, 0.020912f, 0.010772f, 0.008584f, -0.042045f, 0.011149f, 0.049953f, 0.067038f, -0.049943f, -0.024798f, 0.056354f, 0.077922f, -0.047779f, -0.029127f, 0.032239f, 0.013835f, -0.038087f, 0.031168f, -0.088665f, -0.017305f, 0.035260f, 0.070417f, 0.008527f, -0.043649f, -0.040130f, 0.010691f, 0.083708f, 0.007352f, 0.011981f, 0.002520f, 0.027319f, -0.005426f, 0.062010f, -0.000718f, -0.070065f, 0.043736f, -0.045970f, -0.013928f, 0.018476f, -0.026545f, 0.005602f, -0.056537f, -0.021786f, 0.052283f, 0.023364f, -0.023547f, -0.034303f, -0.018446f, 0.003609f, -0.027330f, -0.009000f, -0.006118f, -0.017479f, -0.010354f, -0.008859f, -0.035478f, 0.021574f, -0.013353f, -0.016510f, -0.051348f, -0.013746f, 0.037501f, -0.026902f, -0.014551f, -0.014437f, -0.029415f, 0.055442f, 0.022932f, 0.001297f, -0.002042f, -0.032155f, -0.047066f, 0.002121f, 0.041715f, 0.033522f, 0.011332f, -0.036144f, -0.020817f, -0.016649f, 0.020227f, 0.002830f, -0.031577f, -0.008686f, + 0.001803f, 0.011432f, -0.028118f, -0.019704f, -0.016685f, 0.042766f, 0.022183f, 0.001870f, -0.027319f, -0.024442f, 0.024282f, 0.051578f, -0.000754f, -0.023613f, -0.032562f, -0.011982f, 0.014420f, 0.000127f, -0.007632f, 0.000834f, -0.006600f, -0.006023f, 0.004876f, 0.015607f, 0.000233f, -0.003463f, 0.000091f, -0.000143f, -0.004056f, 0.000967f, 0.000140f, 0.000357f, -0.005647f, 0.003617f, 0.000782f, -0.106770f, -0.028714f, 0.017177f, -0.035098f, 0.103987f, 0.077324f, 0.049545f, 0.027353f, 0.069911f, 0.050539f, 0.015869f, 0.034618f, -0.083869f, -0.111066f, -0.016279f, 0.001667f, -0.029493f, 0.015536f, -0.006087f, -0.028576f, -0.037376f, -0.029277f, 0.057123f, 0.050957f, -0.041071f, -0.004591f, -0.006368f, -0.009539f, -0.015082f, -0.020427f, -0.031267f, -0.042152f, -0.008905f, 0.076076f, -0.024877f, -0.041336f, -0.020760f, 0.071444f, -0.033822f, -0.031961f, 0.108917f, 0.039616f, 0.017740f, -0.026060f, -0.060945f, -0.041446f, -0.062838f, 0.017422f, 0.050574f, 0.139092f, -0.122358f, -0.050973f, 0.070700f, 0.099485f, 0.016569f, -0.005172f, 0.126229f, 0.061499f, -0.040719f, 0.041142f, -0.015287f, + 0.001206f, -0.088558f, -0.043594f, -0.031382f, -0.143333f, -0.061775f, -0.022465f, 0.076917f, -0.041171f, -0.024940f, 0.058661f, -0.004511f, -0.006875f, 0.013192f, 0.041536f, -0.040021f, 0.029612f, 0.043410f, 0.001864f, -0.009041f, -0.080504f, 0.036886f, 0.030034f, -0.094690f, -0.005918f, 0.009533f, 0.007000f, -0.008650f, -0.040839f, 0.010473f, 0.008014f, 0.011097f, -0.005678f, -0.012713f, 0.031010f, 0.005777f, -0.005336f, 0.020095f, 0.009542f, 0.054630f, -0.006618f, 0.017491f, 0.004447f, -0.044531f, -0.037287f, 0.026213f, -0.020330f, 0.015688f, 0.021605f, 0.012174f, 0.013712f, -0.000264f, 0.037498f, -0.012287f, -0.008176f, -0.015039f, 0.011458f, 0.027836f, -0.041876f, -0.016565f, 0.021561f, 0.008946f, -0.023297f, -0.044327f, -0.010190f, 0.011393f, 0.091959f, 0.033571f, -0.007520f, 0.023692f, -0.004510f, -0.008616f, -0.033689f, 0.016123f, 0.014172f, -0.026807f, -0.012845f, -0.097249f, -0.003790f, 0.039893f, -0.009217f, -0.040614f, 0.017901f, -0.009205f, 0.043877f, 0.008631f, -0.020993f, -0.000439f, 0.046967f, -0.026733f, 0.007712f, 0.016804f, -0.014048f, -0.000508f, -0.025120f, 0.051569f, + -0.002909f, 0.007598f, 0.001025f, 0.024879f, -0.011105f, -0.009810f, -0.015945f, 0.010243f, 0.019625f, -0.008592f, 0.023279f, -0.010067f, 0.014429f, -0.024313f, -0.018872f, 0.029348f, 0.037958f, -0.048824f, 0.002506f, -0.000003f, 0.004801f, 0.015300f, -0.030438f, 0.046992f, -0.041909f, 0.037812f, 0.005545f, -0.065858f, -0.003341f, 0.051302f, -0.066724f, 0.031907f, 0.000548f, 0.008608f, -0.015820f, -0.010077f, 0.013800f, -0.019472f, 0.068861f, -0.050784f, 0.007860f, -0.013655f, -0.005877f, 0.016882f, 0.001243f, -0.008360f, -0.001288f, 0.020711f, -0.000355f, -0.023833f, 0.007005f, 0.012055f, -0.039547f, 0.030976f, 0.014302f, 0.001437f, 0.028894f, -0.010484f, -0.008525f, 0.013438f, 0.006568f, 0.008519f, 0.005187f, -0.007902f, 0.016470f, 0.006933f, 0.001535f, -0.017447f, -0.002534f, 0.008505f, 0.015818f, -0.026470f, 0.014203f, 0.016476f, -0.023022f, 0.011087f, 0.003801f, 0.003976f, 0.012718f, -0.006963f, 0.003140f, -0.004366f, -0.033530f, -0.000515f, -0.007805f, 0.014815f, -0.009150f, 0.005655f, 0.004135f, -0.001401f, 0.004946f, 0.008585f, -0.005191f, 0.000009f, 0.001967f, -0.000243f, + 0.002902f, 0.010309f, -0.010057f, 0.009658f, -0.007211f, -0.048662f, -0.138491f, -0.197119f, 0.066040f, 0.175756f, 0.038398f, 0.486715f, 0.400309f, 0.270905f, 0.457758f, 0.238808f, -0.016720f, -0.057049f, -0.181369f, -0.417628f, -0.345445f, -0.335427f, -0.467054f, -0.344881f, -0.101842f, -0.074695f, -0.012793f, 0.162320f, 0.074976f, -0.020221f, 0.102342f, 0.170245f, 0.082743f, 0.079699f, 0.154319f, 0.092215f, 0.070502f, 0.140286f, 0.219792f, 0.091629f, 0.128685f, 0.206792f, 0.034716f, 0.013795f, 0.182079f, 0.107883f, -0.071010f, 0.087890f, 0.112760f, -0.118966f, -0.036333f, 0.130709f, -0.027387f, -0.078890f, 0.168326f, 0.089314f, -0.106101f, 0.090404f, 0.119475f, -0.161294f, -0.151619f, -0.064840f, -0.389423f, -0.515806f, -0.324330f, -0.456106f, -0.608368f, -0.423738f, -0.434222f, -0.560489f, -0.443978f, -0.307701f, -0.334169f, -0.199705f, 0.017611f, 0.123433f, 0.268679f, 0.441093f, 0.549430f, 0.677483f, 0.752218f, 0.822478f, 0.871573f, 0.783055f, 0.614924f, 0.568506f, 0.363410f, 0.109266f, 0.084969f, -0.059519f, -0.282115f, -0.221394f, -0.095280f, -0.209849f, -0.216339f, -0.046607f, + -0.153027f, -0.290934f, -0.176888f, -0.128263f, -0.261089f, -0.222035f, -0.080093f, -0.197564f, -0.235052f, -0.020245f, -0.013963f, -0.106635f, 0.039238f, 0.022452f, -0.171305f, -0.127061f, -0.075226f, -0.242347f, -0.333816f, -0.272891f, -0.372635f, -0.460982f, -0.343240f, -0.275672f, -0.262293f, -0.115960f, 0.049993f, 0.135377f, 0.201406f, 0.279929f, 0.315543f, 0.283225f, 0.369429f, 0.475201f, 0.491971f, 0.459757f, 0.467538f, 0.451348f, 0.365031f, 0.413256f, 0.371976f, 0.157889f, 0.016527f, -0.096639f, -0.208690f, -0.219812f, -0.182897f, -0.214572f, -0.210776f, -0.182796f, -0.181363f, -0.192518f, -0.160191f, -0.143456f, -0.138372f, -0.130832f, -0.103784f, -0.098683f, -0.103513f, -0.084337f, -0.060950f, -0.057591f, -0.047088f, -0.026566f, -0.016530f, -0.014126f, 0.005912f, 0.007798f, 0.004794f, 0.011065f, 0.021918f, 0.019143f, 0.024134f, 0.028874f, 0.024883f, 0.016074f, 0.010412f, 0.006425f, 0.007353f, 0.004932f, 0.006680f, 0.005033f, -0.001833f, -0.009732f, -0.006318f, -0.000293f, 0.010329f, 0.024285f, 0.039459f, 0.040835f, 0.046299f, 0.055967f, 0.060658f, 0.064281f, 0.075792f, 0.071950f, + 0.061180f, 0.055112f, 0.052236f, 0.037219f, 0.031918f, 0.029533f, 0.017437f, 0.004718f, 0.005956f, -0.004581f, -0.017439f, -0.025774f, -0.037400f, -0.056264f, -0.061761f, -0.064479f, -0.067295f, -0.069993f, -0.063868f, -0.061394f, -0.057203f, -0.048540f, -0.036028f, -0.030887f, -0.021823f, -0.015390f, -0.013210f, -0.009405f, -0.000765f, 0.003093f, 0.009595f, 0.012877f, 0.017108f, 0.018581f, 0.020498f, 0.020688f, 0.021726f, 0.018301f, 0.017753f, 0.015354f, 0.014098f, 0.010985f, 0.010959f, 0.008312f, 0.007809f, 0.005436f, 0.005448f, 0.003051f, 0.003119f, 0.001340f, 0.001896f, 0.000183f, 0.000786f} + }, + { + {0.007617f, 0.018013f, 0.000370f, 0.000677f, -0.008576f, -0.006981f, 0.005276f, 0.003120f, 0.000531f, 0.007308f, -0.011080f, -0.003857f, 0.018108f, 0.001154f, 0.003571f, -0.004826f, -0.006042f, 0.008410f, 0.007152f, -0.003055f, 0.007039f, 0.000217f, 0.001190f, -0.006966f, 0.002529f, -0.006351f, -0.004844f, -0.006239f, 0.002144f, 0.000167f, -0.001958f, -0.000775f, 0.002157f, 0.005287f, -0.002519f, -0.009896f, 0.000216f, -0.007079f, -0.008897f, -0.002429f, 0.004079f, -0.001459f, 0.003645f, 0.002203f, 0.003345f, -0.001493f, -0.001213f, -0.001766f, -0.001402f, 0.002938f, -0.000059f, 0.006128f, -0.000790f, 0.007608f, 0.001325f, 0.001657f, 0.007364f, 0.002525f, 0.001920f, 0.009384f, -0.003804f, 0.003047f, -0.003245f, -0.006779f, 0.006191f, -0.002304f, 0.000063f, 0.002185f, -0.001078f, -0.005644f, -0.001669f, 0.003917f, -0.002547f, -0.000226f, -0.005353f, 0.002522f, 0.000405f, -0.003688f, 0.000480f, -0.005833f, 0.000908f, -0.005599f, -0.000452f, -0.000162f, -0.000697f, 0.003102f, 0.001581f, 0.000751f, 0.001797f, -0.000688f, 0.003262f, 0.002250f, -0.000223f, 0.000631f, 0.000759f, -0.000204f, + 0.000157f, 0.000982f, -0.001310f, 0.000653f, -0.001685f, 0.001388f, 0.000199f, -0.000359f, -0.000035f, 0.001132f, 0.000354f, -0.001216f, 0.000430f, -0.000149f, -0.000612f, -0.001793f, -0.023732f, -0.012311f, -0.005550f, -0.005140f, -0.000030f, 0.000070f, 0.001757f, 0.000346f, -0.001337f, -0.009709f, -0.004414f, -0.009949f, -0.015604f, -0.013020f, 0.007353f, 0.009086f, 0.009176f, -0.003602f, -0.001089f, -0.001019f, -0.002051f, 0.003395f, 0.001413f, -0.003302f, -0.007069f, 0.005111f, 0.004350f, 0.006382f, 0.001668f, -0.002121f, -0.003867f, 0.001827f, 0.003044f, -0.000702f, 0.006470f, -0.003121f, -0.000174f, 0.006307f, -0.004799f, -0.007604f, 0.000617f, 0.010581f, 0.002435f, 0.002364f, 0.001488f, 0.000122f, 0.001364f, -0.001601f, 0.001890f, -0.008305f, 0.001373f, 0.008687f, -0.001967f, 0.000163f, 0.000874f, -0.002917f, -0.001636f, -0.001162f, -0.001390f, -0.002276f, 0.005313f, -0.004928f, 0.005215f, 0.004467f, 0.009739f, -0.000632f, 0.005485f, 0.012450f, -0.002265f, -0.009954f, -0.011183f, -0.000493f, -0.001439f, 0.000652f, -0.009485f, 0.002808f, -0.006650f, -0.004919f, 0.002316f, 0.006994f, + -0.002826f, -0.005246f, -0.006309f, -0.001185f, -0.000662f, 0.001803f, 0.000597f, 0.004046f, 0.002398f, -0.000164f, 0.002053f, 0.000639f, 0.003978f, 0.003038f, 0.001915f, 0.000917f, 0.000903f, -0.000628f, 0.002680f, 0.000190f, 0.000837f, -0.000258f, 0.000104f, -0.001921f, 0.000049f, -0.000316f, 0.016601f, 0.012889f, 0.005646f, 0.006553f, -0.004187f, 0.002905f, 0.011516f, 0.005488f, 0.012394f, -0.004879f, 0.005067f, 0.006942f, -0.000236f, 0.008928f, -0.004550f, 0.005548f, 0.001147f, -0.005859f, -0.001347f, -0.001178f, -0.000241f, -0.001725f, 0.000794f, -0.002983f, 0.001027f, -0.002206f, 0.011350f, -0.002670f, -0.000498f, -0.000116f, -0.004945f, -0.014364f, 0.008246f, -0.003474f, 0.003260f, -0.005757f, -0.005242f, -0.006152f, -0.003898f, 0.003625f, 0.010897f, 0.008412f, 0.003703f, -0.000699f, -0.002189f, 0.003332f, 0.007869f, -0.001806f, -0.002416f, 0.009503f, -0.004122f, 0.004505f, -0.004652f, -0.003836f, -0.002163f, 0.003482f, 0.003928f, -0.006827f, -0.004508f, 0.000096f, 0.007338f, 0.009247f, 0.005198f, 0.007188f, -0.000870f, 0.006727f, 0.002813f, 0.007070f, -0.003897f, 0.002781f, + 0.016513f, 0.007542f, 0.007087f, -0.001773f, -0.004469f, -0.011261f, 0.006621f, 0.002700f, -0.004471f, -0.004721f, -0.001380f, 0.003315f, -0.003253f, -0.001660f, -0.002913f, 0.000009f, 0.002485f, -0.001090f, -0.004456f, 0.001236f, 0.001730f, 0.002545f, 0.002869f, 0.000277f, 0.004004f, 0.001805f, 0.001751f, 0.001097f, -0.001117f, 0.002626f, 0.000401f, -0.000106f, -0.001174f, -0.002112f, -0.002059f, 0.000441f, 0.001737f, 0.000558f, 0.000254f, 0.000392f, 0.000020f, 0.002348f, -0.003190f, -0.000894f, 0.001167f, -0.001434f, 0.001493f, 0.005024f, 0.018937f, 0.002697f, 0.006870f, 0.013714f, 0.000257f, -0.007845f, -0.003368f, -0.002359f, 0.000534f, -0.004947f, -0.013470f, 0.005395f, 0.000443f, 0.000282f, 0.005615f, -0.008941f, -0.004140f, 0.014049f, -0.003462f, -0.005325f, -0.008348f, 0.000270f, -0.007892f, -0.001332f, -0.002648f, -0.002387f, 0.000986f, 0.011340f, -0.000392f, -0.003587f, 0.003305f, -0.009056f, 0.012088f, -0.001571f, -0.002756f, 0.015122f, -0.008762f, 0.000692f, -0.010349f, -0.004746f, 0.000841f, 0.000450f, 0.003925f, 0.004749f, -0.009245f, 0.002707f, 0.003813f, 0.003103f, + 0.000838f, 0.004308f, 0.003107f, 0.006306f, -0.005876f, -0.003152f, 0.011903f, -0.005015f, 0.004515f, 0.001097f, 0.003379f, 0.003044f, -0.001076f, -0.004097f, -0.000688f, 0.008398f, -0.005090f, -0.000607f, -0.002737f, 0.001907f, 0.007471f, -0.004287f, -0.009475f, -0.018218f, 0.001062f, -0.000803f, -0.001639f, 0.000017f, -0.007063f, -0.004951f, -0.010212f, -0.004049f, 0.004961f, -0.000229f, 0.003054f, -0.001266f, 0.006225f, 0.004311f, -0.000148f, 0.003214f, -0.000346f, -0.000456f, 0.002096f, -0.004007f, -0.002202f, -0.003266f, -0.000121f, -0.003888f, 0.002177f, -0.000208f, 0.000982f, -0.001489f, -0.001333f, -0.000232f, -0.001483f, 0.000807f, 0.001329f, -0.003612f, 0.001577f, 0.001359f, 0.000719f, -0.003449f, 0.001673f, 0.001121f, 0.003071f, 0.003285f, -0.000426f, -0.001241f, -0.001886f, 0.001599f, -0.001015f, -0.000702f, 0.000501f, -0.000551f, -0.002236f, -0.008266f, -0.020224f, 0.010189f, -0.006607f, -0.011634f, 0.000588f, -0.021786f, 0.004748f, 0.006568f, -0.002334f, 0.015789f, -0.006014f, -0.019176f, 0.004638f, 0.007174f, -0.006595f, -0.013590f, 0.023145f, -0.001529f, -0.001330f, 0.005789f, + -0.005058f, -0.003038f, 0.002406f, -0.011387f, 0.006674f, -0.001283f, 0.003310f, -0.002452f, 0.010845f, -0.002818f, 0.006099f, 0.005234f, -0.010626f, -0.005322f, -0.005971f, 0.011002f, -0.005480f, -0.003406f, 0.008469f, -0.003034f, -0.006230f, 0.004793f, 0.015499f, -0.007950f, 0.007574f, -0.008212f, 0.010204f, -0.005708f, 0.005397f, 0.000924f, -0.005426f, -0.015929f, 0.008891f, 0.011290f, -0.001024f, -0.003747f, 0.006595f, 0.007878f, 0.007800f, -0.011004f, -0.001198f, -0.009723f, -0.000839f, 0.003262f, -0.006661f, 0.002460f, 0.007585f, -0.008147f, -0.000124f, 0.001415f, -0.007626f, -0.005730f, 0.007242f, -0.005275f, 0.005737f, -0.003483f, -0.009808f, 0.001864f, -0.009507f, 0.002336f, -0.003561f, 0.003194f, -0.010475f, 0.009560f, -0.007879f, 0.000836f, -0.007320f, -0.000415f, -0.000390f, 0.001823f, -0.000712f, -0.000225f, -0.002240f, 0.002381f, -0.007067f, 0.002319f, -0.005775f, -0.004894f, 0.000210f, 0.004106f, 0.002118f, 0.000601f, 0.001418f, 0.000077f, 0.002642f, 0.005270f, -0.004514f, 0.004345f, -0.002886f, -0.000825f, 0.002983f, 0.002096f, -0.003176f, -0.000247f, -0.008216f, 0.010372f, + -0.011428f, -0.011331f, -0.019438f, 0.008179f, 0.020516f, 0.003120f, -0.003701f, -0.001782f, -0.003476f, 0.017870f, -0.010745f, -0.009782f, -0.002332f, -0.010785f, -0.003335f, -0.011718f, -0.005080f, -0.008231f, -0.016286f, -0.004581f, -0.003613f, -0.000589f, -0.001815f, 0.004200f, 0.009670f, 0.003444f, 0.004773f, -0.014960f, 0.001820f, -0.000266f, -0.004711f, 0.005159f, 0.002731f, -0.004383f, -0.001959f, -0.010662f, -0.011827f, -0.001751f, 0.013041f, -0.003862f, -0.006759f, -0.001471f, -0.004397f, -0.009217f, 0.000120f, -0.009625f, 0.019583f, 0.016514f, 0.004245f, -0.005091f, -0.004631f, 0.001695f, 0.002916f, 0.003351f, 0.003194f, -0.001234f, 0.007264f, -0.006968f, 0.003191f, -0.006137f, 0.000148f, -0.000115f, 0.004059f, 0.002822f, 0.009166f, -0.004036f, -0.005698f, -0.005208f, -0.021351f, 0.000614f, 0.004396f, -0.002206f, 0.007681f, 0.003286f, -0.006456f, 0.001797f, -0.011230f, -0.004217f, 0.000882f, 0.008505f, 0.003604f, 0.011658f, 0.002308f, -0.001472f, 0.000020f, 0.004275f, -0.004903f, -0.000687f, 0.001070f, -0.002088f, 0.002948f, -0.004282f, 0.002157f, -0.003283f, -0.002670f, -0.000606f, + -0.003644f, -0.003605f, -0.004448f, -0.002403f, -0.001337f, 0.003205f, 0.002688f, -0.003351f, -0.004709f, -0.001512f, -0.003615f, 0.002371f, -0.004027f, 0.001850f, -0.002366f, -0.000758f, 0.003906f, 0.000171f, 0.003258f, 0.002152f, -0.002132f, -0.002076f, -0.020251f, 0.003440f, 0.020258f, 0.019466f, -0.020908f, -0.018715f, 0.004693f, -0.014854f, -0.008184f, 0.002345f, -0.001250f, -0.005966f, 0.015325f, 0.007050f, -0.022075f, -0.001607f, 0.001105f, -0.000039f, 0.013781f, 0.005360f, -0.010363f, 0.014879f, 0.005288f, 0.002093f, -0.008088f, -0.008248f, 0.006099f, -0.005239f, -0.015017f, -0.002553f, -0.002130f, -0.006476f, -0.009042f, -0.011810f, 0.012530f, 0.001039f, 0.001687f, -0.008138f, 0.000012f, 0.009169f, -0.007310f, -0.014898f, -0.015438f, 0.016141f, 0.003403f, 0.015245f, -0.002598f, 0.004468f, 0.010933f, 0.022781f, 0.007117f, -0.002705f, -0.011749f, -0.004827f, -0.005953f, 0.003576f, 0.001034f, -0.008880f, -0.003853f, 0.013301f, 0.009108f, 0.018023f, 0.008183f, -0.012238f, -0.012029f, 0.014934f, 0.007680f, -0.007649f, -0.000102f, 0.015378f, 0.001000f, -0.000726f, -0.012034f, 0.013215f, + 0.009614f, -0.002201f, 0.018023f, -0.002599f, -0.005441f, -0.018912f, -0.002705f, 0.001075f, 0.009947f, -0.013016f, -0.001003f, 0.005984f, -0.003400f, -0.009332f, -0.009061f, -0.001077f, -0.001074f, -0.001611f, -0.011279f, -0.009687f, -0.006004f, 0.003659f, -0.000398f, -0.004394f, -0.001703f, -0.000493f, 0.000792f, 0.001040f, 0.001463f, -0.000825f, 0.003552f, -0.002957f, -0.000962f, 0.000209f, -0.002391f, -0.007216f, 0.000306f, 0.004378f, -0.001513f, -0.006357f, 0.000374f, -0.001440f, 0.002127f, 0.000501f, -0.000999f, -0.000456f, 0.001950f, -0.000873f, 0.003761f, 0.002164f, -0.000304f, -0.003456f, 0.002485f, -0.002697f, 0.002512f, 0.003337f, -0.008211f, 0.003246f, -0.003072f, -0.001662f, 0.010047f, -0.016748f, 0.010064f, -0.010985f, 0.001977f, 0.008767f, -0.000119f, -0.004473f, 0.003276f, -0.011506f, 0.000451f, -0.008967f, -0.025991f, -0.007968f, 0.010980f, 0.007090f, 0.003989f, -0.006345f, 0.005284f, 0.002347f, 0.027718f, 0.004733f, -0.009421f, 0.010285f, 0.002001f, 0.002159f, 0.018412f, -0.005360f, -0.005232f, 0.006367f, -0.013050f, 0.015591f, 0.014399f, -0.000401f, 0.008124f, -0.003105f, + -0.008013f, -0.001108f, -0.010059f, 0.000766f, -0.009852f, 0.003751f, -0.000195f, 0.002752f, 0.001073f, -0.016889f, -0.003520f, -0.002249f, 0.000874f, -0.008554f, 0.003607f, 0.003646f, -0.003292f, 0.022087f, -0.009748f, -0.019797f, 0.011700f, 0.019301f, 0.004336f, 0.004922f, -0.008629f, 0.016546f, -0.005745f, 0.002706f, 0.007405f, 0.002090f, -0.007612f, 0.007844f, 0.003365f, 0.000859f, -0.000124f, -0.015293f, -0.005442f, 0.007364f, 0.013425f, -0.005328f, -0.010062f, -0.013926f, -0.004584f, 0.004558f, 0.002475f, 0.006820f, -0.017136f, 0.003116f, 0.011412f, 0.001417f, -0.000739f, 0.004306f, -0.003636f, -0.002035f, -0.000552f, -0.001023f, 0.005950f, -0.001793f, 0.001840f, -0.001892f, -0.001326f, -0.001415f, -0.004440f, -0.002556f, 0.001991f, -0.003159f, 0.004070f, -0.000760f, -0.000827f, -0.002109f, -0.002533f, -0.013054f, 0.001139f, 0.006822f, -0.000430f, 0.002311f, -0.001329f, 0.004187f, 0.001362f, -0.002643f, -0.003073f, 0.002295f, 0.056513f, -0.015419f, 0.000251f, -0.005619f, -0.003710f, -0.012520f, -0.000374f, -0.033075f, 0.017137f, -0.011830f, -0.000929f, 0.019284f, 0.009390f, -0.012648f, + -0.013760f, -0.005029f, -0.011780f, 0.010642f, -0.027525f, 0.005153f, 0.011271f, 0.015785f, 0.002994f, 0.004766f, 0.000539f, 0.002644f, -0.003722f, -0.008538f, -0.025168f, -0.003620f, 0.003080f, 0.011617f, -0.009133f, 0.011205f, 0.004236f, -0.004482f, -0.001715f, 0.008696f, -0.009186f, -0.008505f, -0.005050f, -0.006481f, -0.001086f, -0.022116f, -0.010495f, -0.005219f, -0.000734f, 0.017663f, 0.003820f, 0.016855f, 0.005663f, -0.000691f, -0.010654f, 0.001362f, 0.000928f, 0.002634f, 0.005690f, 0.023597f, 0.002633f, -0.021941f, 0.005568f, -0.008557f, -0.000732f, -0.008228f, -0.009414f, -0.004279f, 0.008891f, 0.005909f, -0.039116f, -0.014558f, -0.011721f, 0.007466f, -0.001797f, -0.008296f, -0.005492f, 0.022092f, -0.009161f, 0.016993f, -0.016056f, -0.011903f, -0.017376f, -0.009335f, -0.018463f, -0.002793f, 0.024387f, 0.005811f, -0.003076f, 0.003006f, 0.010298f, -0.000136f, 0.012722f, -0.007156f, 0.004830f, 0.007256f, 0.008593f, 0.003516f, -0.001658f, -0.016924f, -0.006425f, -0.008657f, 0.000005f, 0.005582f, 0.004636f, -0.003365f, -0.001345f, 0.007245f, 0.002862f, -0.005535f, -0.002473f, -0.003859f, + -0.001855f, 0.000388f, 0.003581f, -0.002905f, -0.003035f, 0.009202f, 0.007584f, 0.002510f, -0.001194f, 0.003385f, 0.006188f, 0.000549f, -0.005697f, -0.000466f, -0.005809f, 0.001547f, -0.005225f, 0.003114f, 0.009364f, -0.002945f, -0.008668f, -0.009573f, 0.007161f, -0.017733f, 0.001103f, -0.041355f, 0.010062f, -0.013560f, 0.004042f, -0.014095f, -0.030487f, -0.004725f, -0.007094f, 0.021613f, 0.009177f, 0.007764f, -0.000730f, 0.028692f, -0.021587f, 0.005244f, 0.008156f, 0.022160f, -0.025570f, -0.014618f, -0.005070f, 0.002081f, -0.001721f, -0.007290f, -0.002385f, 0.007635f, -0.013778f, 0.002782f, 0.008130f, -0.001609f, 0.001096f, -0.011144f, -0.012741f, -0.007912f, 0.034325f, 0.000278f, -0.008368f, 0.013324f, -0.008268f, -0.017315f, -0.014176f, -0.009402f, -0.002503f, 0.006054f, 0.001250f, 0.001149f, 0.019047f, 0.017392f, -0.003170f, 0.006171f, 0.004182f, -0.022072f, -0.015147f, -0.001001f, -0.001789f, -0.005814f, -0.015055f, 0.018414f, 0.022269f, -0.018331f, 0.012010f, 0.011254f, -0.003606f, -0.017526f, -0.028239f, -0.027397f, -0.021122f, -0.012479f, -0.024378f, 0.002158f, -0.019966f, 0.011886f, + 0.010713f, 0.001712f, 0.000196f, -0.034080f, 0.002180f, 0.000564f, 0.002459f, -0.017506f, 0.005807f, 0.019254f, 0.002550f, 0.004827f, -0.015459f, -0.009627f, -0.001946f, -0.016319f, 0.003724f, 0.010018f, -0.004853f, -0.006119f, -0.007521f, 0.006217f, 0.010230f, -0.018120f, -0.009933f, -0.000991f, 0.011956f, 0.004352f, -0.005315f, 0.004113f, -0.000705f, -0.000307f, 0.005334f, -0.003582f, 0.006893f, -0.008117f, -0.002898f, 0.005714f, 0.005001f, -0.002116f, 0.013421f, 0.000733f, -0.008555f, -0.007331f, -0.001302f, -0.006066f, -0.005450f, 0.000579f, 0.003715f, -0.002667f, -0.002856f, -0.016910f, -0.014216f, -0.009839f, -0.011129f, -0.003511f, -0.025256f, 0.001098f, 0.027531f, -0.009738f, 0.014484f, -0.005833f, 0.027445f, 0.023248f, 0.009569f, -0.028600f, -0.007394f, 0.038116f, -0.009937f, 0.028244f, 0.004350f, -0.027167f, -0.013833f, 0.031915f, 0.000597f, -0.021548f, 0.000410f, -0.018381f, -0.002618f, 0.006431f, 0.002527f, -0.003725f, -0.031966f, -0.028366f, 0.007716f, 0.020423f, -0.018303f, -0.001665f, 0.007886f, -0.001429f, 0.003030f, 0.033964f, 0.006166f, 0.004895f, 0.002848f, 0.011187f, + -0.015163f, -0.010736f, -0.007830f, -0.035923f, -0.012267f, -0.013520f, -0.009381f, 0.009404f, 0.006232f, -0.002330f, -0.003663f, -0.014248f, -0.021587f, 0.028000f, -0.006135f, -0.024717f, -0.011640f, 0.004955f, 0.018710f, -0.014956f, -0.004751f, -0.015869f, -0.003055f, -0.018949f, -0.003723f, -0.004081f, -0.038051f, 0.003429f, -0.012872f, 0.026248f, -0.006859f, -0.021426f, -0.040355f, -0.026606f, -0.005103f, 0.003295f, 0.014066f, -0.010464f, -0.009602f, -0.021987f, 0.020024f, 0.033911f, 0.003531f, -0.004063f, 0.011497f, -0.008905f, 0.012721f, -0.009609f, -0.004683f, 0.004342f, 0.009717f, 0.007021f, -0.011913f, 0.000390f, 0.002425f, -0.000176f, -0.000896f, -0.002996f, 0.003162f, 0.012043f, -0.005100f, -0.010606f, -0.000508f, -0.002381f, 0.005478f, -0.000086f, 0.011676f, 0.000819f, 0.004242f, 0.000425f, -0.007231f, 0.001899f, -0.002924f, 0.012604f, 0.000684f, -0.007995f, -0.001569f, -0.001918f, 0.008368f, 0.000869f, -0.009275f, -0.001378f, 0.006432f, -0.002956f, 0.001522f, 0.013241f, -0.046533f, -0.023611f, -0.016075f, -0.025293f, -0.013692f, -0.010291f, -0.026434f, 0.027783f, -0.008117f, 0.041884f, + -0.021193f, -0.031421f, -0.006241f, -0.021059f, 0.035851f, -0.012268f, -0.019068f, -0.008672f, 0.009536f, 0.018393f, 0.015594f, -0.003684f, -0.004326f, -0.008128f, 0.003859f, 0.029758f, -0.000894f, 0.002945f, -0.009649f, -0.003625f, -0.015628f, -0.004954f, 0.006782f, 0.005227f, -0.012937f, 0.000740f, -0.019094f, 0.003936f, -0.005776f, -0.005556f, 0.007657f, 0.003742f, -0.008944f, -0.003414f, 0.016133f, 0.006233f, -0.013541f, -0.017556f, 0.029431f, -0.001272f, -0.047116f, 0.024596f, -0.005311f, -0.019842f, 0.009379f, -0.002767f, 0.002064f, -0.004448f, 0.016263f, 0.006456f, 0.001584f, 0.045301f, 0.044500f, -0.015607f, 0.004779f, -0.033391f, -0.007213f, -0.006315f, 0.014150f, -0.005003f, 0.002226f, 0.013896f, -0.010230f, 0.025929f, -0.010992f, 0.002967f, -0.035031f, 0.014645f, -0.009182f, -0.024326f, 0.012198f, -0.005525f, 0.049115f, 0.011851f, 0.009294f, 0.018339f, 0.001951f, -0.017038f, -0.001454f, -0.006944f, -0.004309f, 0.005073f, -0.006177f, 0.010167f, 0.006062f, -0.007373f, 0.012455f, 0.007256f, -0.008310f, -0.002007f, 0.000668f, 0.001422f, -0.003458f, 0.002836f, 0.004316f, -0.001023f, + -0.003769f, 0.001021f, 0.003829f, 0.002482f, 0.002880f, -0.007741f, 0.007951f, -0.015669f, 0.013997f, -0.009134f, -0.005527f, -0.000893f, 0.007260f, 0.010672f, 0.002727f, -0.011842f, 0.000037f, -0.004664f, -0.002969f, 0.003085f, -0.011647f, -0.020804f, 0.006101f, 0.055965f, -0.041977f, -0.013235f, -0.026583f, -0.017444f, 0.021096f, -0.023911f, 0.051181f, -0.005825f, 0.015622f, 0.003034f, 0.012423f, -0.031648f, 0.005824f, 0.008560f, -0.002365f, -0.004587f, -0.002805f, 0.009618f, -0.019570f, -0.011655f, -0.002778f, -0.005326f, -0.024184f, -0.021263f, -0.005763f, -0.009714f, 0.029212f, -0.007387f, -0.013848f, -0.009781f, 0.010045f, -0.014776f, -0.006350f, -0.025739f, 0.012165f, -0.009689f, 0.010722f, -0.008957f, 0.013634f, -0.006718f, -0.044790f, -0.022581f, 0.006621f, -0.003253f, -0.002735f, -0.013730f, -0.026671f, -0.001289f, 0.011760f, 0.008150f, -0.006059f, 0.009045f, 0.013731f, 0.042730f, -0.018214f, 0.020379f, -0.047799f, 0.003270f, 0.007028f, -0.005421f, -0.013726f, 0.009958f, 0.001804f, 0.002480f, 0.010744f, 0.034035f, 0.022921f, 0.017574f, -0.009045f, -0.010625f, 0.016721f, -0.020079f, + 0.005020f, 0.017364f, -0.012094f, 0.042525f, -0.000638f, 0.013395f, -0.011512f, 0.024651f, -0.023175f, -0.022554f, 0.000761f, 0.008841f, -0.010460f, -0.002267f, 0.026406f, 0.000536f, 0.024045f, 0.009077f, -0.003694f, -0.003502f, -0.013688f, -0.000806f, -0.000703f, 0.007081f, -0.000866f, -0.010715f, 0.001940f, 0.005263f, 0.013650f, -0.019576f, 0.003461f, -0.009780f, 0.004232f, 0.011675f, -0.003856f, 0.000011f, -0.010349f, 0.003747f, 0.003912f, -0.006398f, -0.023909f, -0.014660f, -0.009424f, 0.004987f, -0.012611f, -0.006845f, -0.008441f, -0.007256f, 0.004867f, 0.009607f, -0.000210f, 0.008036f, 0.003006f, 0.004455f, 0.001464f, -0.016944f, 0.014754f, -0.012404f, 0.022793f, 0.065704f, 0.047176f, -0.012949f, -0.028937f, -0.020233f, 0.040483f, -0.048061f, 0.002915f, -0.012470f, -0.011335f, 0.019113f, -0.034595f, 0.004273f, -0.017525f, -0.000832f, -0.023967f, -0.019155f, 0.003186f, 0.000878f, 0.001327f, -0.023884f, 0.037786f, 0.007186f, -0.016406f, 0.006387f, -0.004605f, 0.002885f, 0.056162f, 0.017230f, -0.015245f, -0.014123f, 0.003047f, 0.016908f, 0.005008f, -0.042151f, -0.009942f, -0.029269f, + -0.009304f, -0.013925f, 0.014430f, -0.008202f, -0.003636f, -0.000698f, -0.001110f, -0.020888f, -0.023437f, 0.015053f, -0.008677f, 0.003762f, -0.000792f, 0.020348f, -0.016553f, -0.012501f, 0.005609f, 0.008245f, -0.022021f, 0.024497f, -0.015309f, -0.036824f, -0.033604f, -0.012573f, -0.009421f, -0.015161f, -0.007287f, -0.052174f, 0.018573f, -0.025000f, -0.007474f, -0.020950f, 0.028986f, 0.008847f, 0.014031f, -0.000481f, -0.004091f, -0.025488f, -0.007255f, 0.033289f, -0.027498f, 0.040437f, 0.031551f, 0.010499f, -0.007063f, 0.000933f, -0.005472f, 0.005397f, -0.017777f, -0.015028f, -0.008718f, 0.002005f, -0.002170f, 0.002105f, 0.007945f, -0.013630f, -0.002962f, 0.012725f, 0.014086f, -0.005922f, 0.008871f, -0.007827f, -0.011504f, -0.005720f, -0.003411f, 0.008244f, 0.002641f, 0.002783f, -0.011377f, -0.008163f, 0.004310f, -0.004841f, 0.004027f, 0.004345f, 0.008569f, 0.015867f, 0.006799f, 0.008678f, -0.010752f, -0.006862f, -0.003512f, 0.004309f, -0.005098f, 0.001697f, -0.004700f, 0.001795f, 0.016902f, 0.007334f, 0.004774f, -0.003712f, 0.010728f, 0.002797f, -0.004101f, -0.065405f, -0.007850f, 0.043225f, + -0.053039f, -0.021393f, -0.001063f, -0.016484f, 0.019542f, -0.011245f, 0.060444f, -0.006202f, -0.012854f, -0.010108f, -0.002422f, 0.017511f, -0.011724f, -0.011736f, 0.049376f, -0.036104f, -0.004133f, 0.011347f, -0.007711f, 0.030661f, 0.017586f, -0.002215f, -0.003607f, 0.012985f, 0.017719f, 0.018955f, 0.015840f, 0.032468f, 0.010619f, 0.013948f, 0.008720f, -0.010590f, 0.054676f, 0.006821f, 0.010418f, 0.013731f, 0.008358f, 0.039267f, -0.002551f, 0.009681f, 0.013799f, 0.011346f, 0.006676f, 0.025911f, -0.015088f, -0.012384f, 0.026060f, -0.004748f, -0.025791f, -0.006694f, -0.045285f, -0.015493f, -0.008484f, 0.043115f, -0.040551f, -0.005279f, 0.002036f, -0.001401f, -0.002083f, 0.025427f, 0.069918f, -0.012156f, 0.009006f, 0.007966f, 0.010836f, 0.033231f, -0.035737f, -0.036973f, -0.033329f, 0.059315f, 0.004672f, -0.022308f, 0.054745f, -0.020765f, 0.047768f, -0.025558f, 0.018509f, 0.002015f, -0.062848f, -0.009171f, -0.015489f, 0.018097f, -0.001006f, -0.005432f, 0.000713f, 0.011381f, -0.001385f, -0.019139f, 0.010633f, 0.000296f, -0.008620f, -0.000164f, -0.016486f, 0.022613f, -0.002109f, 0.008130f, + -0.010401f, -0.009671f, -0.009259f, -0.012812f, -0.000874f, 0.000386f, 0.021898f, -0.000955f, 0.002733f, -0.008611f, 0.002757f, -0.020418f, 0.006865f, -0.019678f, -0.003286f, -0.004239f, -0.017228f, 0.009346f, -0.013559f, -0.013987f, 0.003461f, -0.019517f, 0.006391f, 0.015640f, 0.014973f, -0.007336f, -0.006481f, 0.003784f, 0.006317f, 0.013602f, 0.017734f, 0.001016f, 0.038882f, 0.003258f, -0.038662f, -0.114718f, 0.023194f, -0.027749f, -0.043984f, 0.049328f, -0.029437f, -0.015541f, -0.043310f, 0.011060f, -0.008357f, -0.042828f, -0.013518f, -0.025531f, 0.012214f, -0.023662f, 0.001464f, 0.008883f, 0.019473f, 0.009508f, 0.032760f, 0.004876f, 0.000095f, -0.003600f, -0.026976f, -0.021195f, -0.019112f, 0.015501f, 0.024577f, 0.011047f, 0.008953f, -0.000926f, 0.009700f, 0.018786f, 0.044661f, -0.021216f, -0.011336f, 0.007548f, -0.019800f, 0.021104f, 0.004976f, -0.019626f, 0.045451f, 0.016245f, -0.037628f, 0.014777f, -0.036183f, 0.004101f, 0.007323f, 0.019009f, -0.010036f, -0.012563f, 0.057699f, 0.022061f, -0.024316f, 0.014753f, 0.030688f, -0.023751f, -0.049659f, 0.027555f, -0.003670f, -0.000784f, + 0.004460f, 0.011968f, 0.077958f, -0.007425f, 0.010062f, 0.014666f, 0.000110f, 0.017638f, 0.010784f, -0.041375f, 0.009101f, -0.022103f, -0.018789f, -0.011724f, 0.009750f, -0.066695f, -0.007732f, 0.020575f, 0.003655f, 0.032877f, -0.023935f, 0.023237f, -0.015509f, -0.007136f, -0.008573f, 0.010310f, 0.004968f, -0.008318f, 0.000428f, -0.000186f, -0.011421f, 0.009235f, -0.014513f, 0.015479f, 0.002459f, 0.010732f, 0.009644f, -0.006890f, -0.005167f, 0.002577f, -0.003782f, 0.002110f, 0.003993f, -0.006696f, -0.002000f, -0.007671f, -0.004906f, -0.005092f, -0.012976f, 0.000083f, 0.002214f, 0.007591f, -0.003944f, 0.007305f, 0.018453f, -0.009657f, 0.003312f, -0.009690f, 0.005130f, 0.005575f, -0.014901f, -0.000013f, 0.005237f, -0.014582f, -0.006825f, 0.012358f, 0.000455f, 0.002315f, 0.003108f, 0.000295f, 0.000342f, -0.035391f, -0.040758f, 0.087421f, 0.018691f, -0.005618f, -0.010518f, 0.019748f, 0.078996f, 0.036273f, 0.009476f, -0.002239f, 0.026511f, 0.066011f, 0.016453f, 0.022801f, 0.020617f, 0.047093f, -0.030260f, 0.030532f, 0.013604f, -0.090211f, 0.026819f, -0.012683f, 0.026850f, -0.028024f, + 0.021323f, 0.014199f, 0.028143f, -0.000117f, 0.012000f, 0.004509f, -0.025514f, 0.012894f, 0.025522f, -0.021191f, 0.012893f, -0.020566f, -0.012318f, 0.064872f, 0.006755f, 0.057461f, -0.040640f, 0.018001f, -0.001935f, -0.008046f, -0.001123f, -0.004817f, 0.009074f, 0.021180f, 0.014748f, -0.001418f, 0.032931f, -0.052020f, -0.049022f, 0.035891f, -0.027814f, -0.007019f, -0.006356f, -0.033555f, 0.017225f, -0.008687f, 0.009819f, 0.005454f, 0.055698f, 0.027169f, 0.029462f, 0.011213f, 0.008078f, -0.050219f, -0.011380f, 0.025069f, -0.000233f, 0.000887f, 0.000199f, -0.015928f, -0.043645f, 0.008671f, 0.004314f, -0.032585f, 0.004907f, -0.015506f, -0.012719f, 0.014087f, 0.009562f, 0.050094f, -0.006858f, 0.012969f, 0.012183f, -0.009274f, -0.012574f, -0.001079f, -0.011932f, -0.004388f, 0.029638f, 0.012592f, 0.005616f, 0.001807f, -0.000231f, 0.001049f, -0.000054f, -0.001393f, -0.019591f, -0.005726f, 0.012499f, -0.003113f, 0.001566f, -0.007010f, -0.009711f, -0.003721f, 0.003589f, 0.024198f, -0.015502f, -0.014941f, 0.014379f, 0.007273f, -0.017441f, 0.012992f, 0.007978f, -0.012218f, 0.016308f, 0.001748f, + -0.009124f, -0.004004f, -0.006188f, -0.002548f, -0.002628f, 0.008357f, 0.004423f, 0.004415f, 0.009505f, 0.013636f, 0.010237f, -0.002073f, 0.007427f, 0.023246f, -0.079767f, 0.068154f, -0.029021f, 0.013933f, 0.043209f, -0.062740f, -0.002166f, -0.004488f, 0.014935f, 0.024742f, 0.027034f, 0.048433f, 0.007539f, -0.029482f, 0.016369f, 0.051543f, -0.072172f, -0.041119f, 0.047724f, 0.003568f, -0.000804f, 0.003386f, 0.003703f, -0.000175f, -0.001650f, 0.025758f, 0.014703f, -0.033297f, 0.001799f, -0.008530f, 0.059526f, 0.037403f, -0.012616f, 0.004809f, 0.006844f, 0.008651f, -0.000744f, 0.022983f, 0.001846f, 0.017950f, 0.060817f, 0.009676f, 0.006124f, -0.008000f, 0.015394f, -0.056893f, -0.025479f, -0.023176f, -0.002889f, 0.007430f, -0.051589f, 0.021426f, -0.045809f, 0.016606f, 0.046955f, -0.009150f, -0.042755f, -0.021635f, 0.017348f, -0.007176f, -0.087048f, 0.024864f, -0.060812f, -0.012109f, -0.007737f, 0.003083f, -0.024485f, 0.007241f, 0.030419f, -0.024065f, -0.057748f, -0.085479f, 0.067484f, 0.021627f, -0.010728f, 0.020351f, -0.020575f, 0.021689f, 0.037408f, -0.037920f, 0.067140f, 0.010320f, + -0.007215f, 0.032289f, 0.017679f, -0.009756f, 0.017328f, 0.002359f, 0.018722f, -0.017126f, -0.009705f, 0.006175f, 0.013554f, 0.024453f, 0.006967f, 0.022169f, -0.013870f, 0.013093f, 0.021909f, 0.020560f, -0.003170f, 0.018837f, -0.018871f, 0.008717f, 0.001903f, 0.009341f, 0.036549f, -0.023099f, 0.014621f, 0.003234f, -0.001225f, 0.029693f, 0.007941f, 0.038343f, -0.004690f, 0.019606f, 0.005058f, 0.015758f, 0.004362f, -0.006289f, 0.011338f, -0.017802f, 0.016794f, -0.005730f, 0.013970f, -0.001899f, 0.003972f, -0.000152f, 0.003075f, 0.001143f, 0.014670f, -0.001839f, -0.003206f, -0.000494f, 0.006488f, 0.000756f, -0.001198f, 0.002157f, 0.003409f, 0.003556f, 0.002921f, -0.000276f, 0.002939f, -0.000573f, 0.002820f, 0.003191f, 0.003113f, -0.003402f, 0.001295f, 0.002165f, -0.001615f, -0.001410f, 0.097523f, -0.104893f, 0.042939f, 0.051850f, -0.064211f, -0.021102f, -0.034175f, -0.020348f, 0.096745f, -0.044228f, 0.068884f, -0.033026f, -0.008351f, -0.018407f, 0.023095f, 0.007193f, -0.082151f, -0.017008f, -0.021202f, 0.034374f, 0.002589f, 0.013569f, 0.029569f, -0.041991f, -0.006794f, -0.027410f, + 0.015237f, 0.032205f, 0.021728f, -0.053942f, -0.008399f, 0.008767f, 0.007722f, -0.005021f, -0.023928f, -0.011964f, -0.046487f, -0.010452f, -0.005866f, 0.041615f, -0.037855f, 0.093016f, 0.021572f, -0.029604f, 0.042523f, -0.000406f, 0.055012f, 0.027767f, 0.052224f, 0.010738f, 0.047746f, 0.036505f, 0.046706f, 0.046674f, 0.007973f, 0.045080f, -0.059701f, -0.012409f, 0.013203f, -0.041747f, -0.006364f, 0.022949f, -0.046252f, -0.070538f, 0.028008f, 0.042381f, 0.001884f, 0.008174f, -0.047486f, -0.014989f, -0.039673f, -0.003661f, 0.046204f, 0.001686f, 0.085958f, 0.036692f, -0.021267f, 0.088191f, 0.048129f, -0.028761f, -0.010020f, -0.021179f, -0.028401f, -0.020381f, 0.022400f, -0.015053f, -0.044194f, 0.005100f, 0.031348f, -0.001045f, -0.014392f, -0.013903f, -0.009098f, -0.017185f, -0.026793f, 0.002466f, -0.006121f, -0.005841f, -0.020696f, -0.004220f, -0.007256f, 0.006802f, 0.014874f, -0.006866f, 0.002979f, -0.008357f, -0.016235f, 0.008137f, -0.004370f, -0.015005f, -0.030741f, 0.011780f, -0.042372f, -0.008412f, -0.029424f, -0.020415f, -0.023978f, -0.008743f, -0.003911f, -0.011271f, -0.016880f, -0.010870f, + -0.019264f, -0.006218f, -0.002450f, -0.004163f, -0.013064f, 0.016660f, -0.015747f, 0.006398f, -0.003473f, -0.028750f, -0.008054f, -0.029308f, 0.003794f, -0.002898f, -0.003114f, 0.002630f, -0.136986f, 0.125083f, -0.029962f, -0.038744f, -0.038011f, 0.087328f, -0.066771f, -0.008222f, -0.020644f, 0.001469f, 0.043583f, -0.048652f, -0.006735f, 0.022421f, -0.017430f, -0.004493f, -0.000911f, -0.026542f, 0.038732f, 0.004707f, -0.068880f, -0.014444f, -0.018336f, 0.006519f, -0.075296f, 0.001777f, 0.006516f, -0.012118f, -0.001574f, 0.022382f, 0.042916f, -0.016280f, -0.013611f, 0.012046f, -0.032431f, -0.091685f, 0.005924f, 0.077100f, -0.040333f, -0.055508f, 0.001752f, 0.062667f, -0.030360f, -0.015577f, -0.080282f, -0.010272f, -0.000649f, 0.058040f, 0.023569f, 0.009475f, -0.061104f, -0.031296f, 0.044080f, -0.053218f, 0.017380f, 0.094280f, 0.049766f, 0.073633f, -0.036643f, 0.043890f, 0.024243f, -0.077586f, -0.031591f, -0.040619f, -0.012756f, 0.049297f, -0.004418f, 0.053122f, 0.039104f, -0.077095f, 0.086257f, -0.051589f, -0.002422f, 0.006755f, -0.042832f, 0.089584f, -0.008111f, -0.018098f, 0.067961f, -0.054873f, + -0.012068f, -0.079230f, -0.029977f, 0.039371f, -0.013822f, 0.035823f, 0.033926f, -0.006263f, -0.016508f, 0.008314f, -0.022208f, -0.020927f, -0.008737f, -0.014847f, -0.012482f, -0.011627f, 0.003566f, -0.014980f, 0.001092f, -0.019457f, -0.023553f, -0.016773f, 0.013565f, -0.009033f, -0.004180f, 0.013125f, 0.000391f, -0.001787f, -0.025526f, -0.034158f, -0.025679f, -0.045174f, 0.032460f, 0.016504f, 0.027786f, 0.012905f, -0.027966f, -0.024051f, -0.015969f, -0.001588f, 0.035888f, -0.005914f, -0.002520f, 0.007158f, -0.008419f, -0.004212f, -0.005559f, -0.012297f, 0.024297f, -0.014713f, 0.031816f, 0.001782f, 0.080183f, 0.057307f, 0.008178f, -0.015152f, -0.042011f, 0.024710f, -0.003514f, -0.003490f, -0.002886f, -0.001135f, -0.000054f, -0.015726f, 0.020019f, -0.000146f, -0.071994f, 0.018277f, 0.006203f, -0.024553f, 0.000720f, 0.031278f, -0.010683f, 0.002352f, -0.052121f, 0.038065f, -0.018692f, -0.005318f, -0.005458f, 0.021791f, -0.028348f, -0.000759f, 0.006173f, 0.001137f, 0.005720f, -0.013057f, 0.038212f, -0.019857f, 0.067529f, -0.041400f, -0.044668f, 0.042180f, -0.047185f, 0.002765f, 0.034796f, -0.032128f, + -0.014692f, 0.018969f, 0.021584f, 0.029178f, -0.103566f, 0.033223f, -0.001197f, -0.023327f, 0.065323f, -0.032571f, 0.003809f, 0.000658f, -0.055864f, 0.071651f, -0.003613f, -0.002787f, -0.037707f, -0.006438f, 0.058623f, -0.013390f, -0.002422f, 0.002670f, 0.016756f, 0.010113f, -0.072858f, 0.036158f, 0.064536f, -0.033675f, 0.025738f, -0.050339f, 0.084673f, 0.004155f, -0.079412f, 0.001406f, 0.043990f, -0.004128f, -0.049406f, -0.010741f, 0.115442f, -0.017675f, -0.047824f, 0.008342f, 0.050822f, -0.012864f, -0.016134f, -0.005675f, -0.002451f, 0.003324f, 0.002116f, -0.012636f, 0.033491f, -0.005134f, -0.008095f, 0.002210f, 0.011321f, 0.028538f, -0.008604f, -0.013464f, 0.015368f, 0.003823f, -0.026274f, -0.009222f, 0.013833f, 0.003518f, -0.011075f, -0.005554f, 0.022327f, -0.020149f, -0.004285f, 0.003808f, 0.003071f, -0.019016f, -0.007966f, 0.025299f, -0.001517f, -0.017697f, -0.007778f, 0.018413f, -0.005486f, -0.013222f, -0.011626f, 0.016119f, 0.000583f, -0.044959f, -0.149600f, -0.226452f, 0.015194f, 0.196179f, 0.003012f, 0.512961f, 0.464728f, 0.278480f, 0.536536f, 0.352302f, -0.058146f, 0.020637f, + -0.068797f, -0.422086f, -0.239795f, -0.185547f, -0.412474f, -0.338932f, -0.099977f, -0.198804f, -0.228599f, -0.018255f, 0.013773f, -0.096343f, 0.021396f, 0.087962f, -0.111579f, -0.094558f, 0.150036f, 0.031129f, -0.036049f, 0.105061f, 0.140590f, 0.000346f, 0.144226f, 0.244201f, 0.087647f, 0.067405f, 0.248762f, 0.168512f, 0.020675f, 0.183004f, 0.269499f, 0.118870f, 0.138029f, 0.307343f, 0.116918f, 0.042554f, 0.293385f, 0.289016f, 0.089615f, 0.347982f, 0.494325f, 0.184852f, 0.203275f, 0.345131f, 0.105637f, -0.110641f, 0.020372f, -0.113642f, -0.414254f, -0.394851f, -0.421972f, -0.678054f, -0.733200f, -0.783874f, -0.927453f, -0.970019f, -0.947665f, -0.922067f, -0.811870f, -0.728270f, -0.595522f, -0.392938f, -0.280374f, -0.096003f, 0.268930f, 0.435916f, 0.430377f, 0.796444f, 0.849004f, 0.661300f, 0.805363f, 0.843872f, 0.453393f, 0.473232f, 0.579777f, 0.282278f, 0.228342f, 0.376951f, 0.273687f, 0.129427f, 0.178592f, 0.238924f, 0.102279f, 0.083938f, 0.239876f, 0.127629f, -0.020290f, 0.132288f, 0.103494f, -0.072837f, 0.011844f, 0.095777f, -0.060507f, -0.025326f, 0.177986f, 0.071563f, + 0.008330f, 0.171589f, 0.113250f, -0.014681f, 0.010997f, -0.072257f, -0.247877f, -0.337762f, -0.373859f, -0.490706f, -0.525285f, -0.524521f, -0.568481f, -0.573590f, -0.600926f, -0.602506f, -0.550703f, -0.546706f, -0.458615f, -0.353386f, -0.279447f, -0.115169f, 0.105379f, 0.223464f, 0.370715f, 0.463337f, 0.490423f, 0.467964f, 0.427092f, 0.363543f, 0.295662f, 0.258201f, 0.226164f, 0.186286f, 0.168092f, 0.163678f, 0.149386f, 0.140652f, 0.146681f, 0.137540f, 0.115977f, 0.100567f, 0.080962f, 0.051794f, 0.032909f, 0.000801f, -0.037357f, -0.066448f, -0.090095f, -0.091411f, -0.087081f, -0.081592f, -0.060033f, -0.044998f, -0.034096f, -0.019971f, -0.001204f, 0.012714f, 0.028647f, 0.034875f, 0.040057f, 0.033724f, 0.024415f, 0.020159f, 0.015852f, 0.006161f, 0.001035f, -0.002758f, -0.010227f, -0.023624f, -0.024572f, -0.030872f, -0.046427f, -0.044317f, -0.040183f, -0.060037f, -0.065235f, -0.065162f, -0.080915f, -0.085904f, -0.077601f, -0.088557f, -0.093246f, -0.082758f, -0.076997f, -0.074923f, -0.063557f, -0.053297f, -0.049676f, -0.040581f, -0.025200f, -0.019194f, -0.011631f, 0.002802f, 0.017468f, 0.024267f, + 0.039291f, 0.055903f, 0.064838f, 0.072293f, 0.086124f, 0.091435f, 0.090272f, 0.091392f, 0.090962f, 0.080997f, 0.071078f, 0.064170f, 0.054002f, 0.038820f, 0.030369f, 0.021587f, 0.011194f, 0.003415f, -0.000421f, -0.006272f, -0.010097f, -0.012581f, -0.013759f, -0.015945f, -0.015005f, -0.014227f, -0.012924f, -0.012437f, -0.010297f, -0.009773f, -0.007500f, -0.006233f, -0.003938f, -0.002912f, -0.000538f}, + {0.005407f, 0.017842f, 0.003918f, 0.002646f, -0.004099f, -0.001403f, -0.008838f, -0.000308f, -0.002303f, 0.006651f, 0.005777f, -0.005815f, -0.004293f, -0.003485f, -0.003429f, -0.004120f, 0.000402f, 0.005311f, -0.004220f, -0.004401f, -0.014710f, -0.010715f, -0.007983f, -0.000296f, 0.000734f, 0.010822f, -0.005976f, 0.005404f, 0.003242f, 0.002816f, 0.000594f, -0.007948f, 0.002006f, -0.017033f, 0.002037f, 0.000611f, 0.000758f, -0.001092f, -0.010603f, -0.004728f, -0.009146f, 0.000644f, 0.000539f, -0.005417f, -0.014174f, 0.009799f, -0.000728f, -0.008181f, -0.000084f, 0.005601f, 0.001156f, -0.002762f, 0.001965f, -0.004618f, -0.002072f, -0.004352f, 0.003381f, -0.004637f, 0.006621f, 0.005481f, -0.001108f, -0.009318f, 0.000454f, 0.001396f, -0.000875f, -0.003352f, 0.002347f, 0.001773f, -0.002183f, 0.005187f, 0.005507f, 0.003925f, 0.000333f, 0.000127f, 0.001740f, -0.005009f, 0.000678f, 0.007975f, 0.000890f, 0.001611f, 0.001428f, 0.005923f, 0.002207f, 0.001937f, 0.005192f, -0.001178f, 0.004083f, -0.001494f, 0.002658f, 0.001997f, -0.000740f, 0.001229f, 0.001492f, -0.000347f, 0.001896f, 0.003056f, + 0.000681f, 0.000183f, 0.002063f, 0.002890f, 0.002194f, -0.000210f, 0.000824f, 0.001032f, 0.001066f, 0.000444f, 0.000161f, -0.000087f, -0.000704f, -0.002058f, 0.001414f, 0.000291f, -0.018849f, -0.021257f, -0.001459f, -0.008431f, 0.006524f, -0.010439f, 0.002657f, 0.004762f, -0.007041f, 0.005750f, 0.021269f, 0.001148f, -0.001908f, 0.011590f, 0.001621f, 0.011638f, 0.000224f, 0.005289f, -0.008310f, -0.011113f, -0.000556f, 0.004160f, -0.007657f, -0.002519f, -0.000740f, -0.002213f, 0.002149f, -0.002304f, -0.004026f, 0.003806f, -0.001877f, -0.001654f, 0.008377f, 0.011851f, -0.003670f, -0.006432f, 0.002405f, 0.009478f, 0.003649f, 0.012159f, 0.000547f, -0.001752f, -0.000278f, 0.010846f, 0.000734f, -0.007822f, -0.004242f, 0.008509f, 0.006231f, 0.006612f, 0.001841f, -0.004275f, -0.008763f, 0.001706f, 0.004170f, 0.005105f, -0.001865f, -0.004638f, 0.009536f, 0.006357f, -0.001550f, -0.005348f, 0.000346f, -0.003730f, 0.009936f, 0.003015f, 0.001843f, 0.003144f, 0.001132f, 0.002037f, 0.006112f, 0.001060f, 0.006139f, -0.001200f, 0.009771f, 0.001182f, -0.009627f, -0.003826f, -0.003342f, 0.004785f, + 0.005977f, -0.000964f, 0.001609f, -0.006754f, -0.002439f, -0.006290f, -0.001896f, -0.004101f, -0.003480f, -0.001480f, 0.002060f, 0.000091f, 0.000068f, 0.000267f, 0.002709f, 0.000431f, 0.000624f, -0.000334f, -0.002887f, -0.000817f, 0.000159f, -0.000281f, 0.001176f, 0.000448f, 0.000505f, -0.001097f, 0.011075f, 0.007872f, 0.011665f, 0.012270f, -0.002988f, 0.006181f, -0.002677f, -0.006851f, -0.000706f, 0.018147f, 0.007855f, 0.004105f, 0.006373f, -0.007468f, 0.012829f, 0.005599f, 0.008576f, -0.002475f, -0.014369f, 0.006089f, -0.022386f, 0.004606f, -0.005762f, 0.004565f, 0.003459f, -0.000342f, -0.007745f, 0.001933f, 0.004955f, -0.002908f, 0.004643f, 0.011400f, -0.000871f, -0.009303f, -0.012851f, 0.002080f, 0.005658f, -0.011691f, 0.006489f, -0.010982f, -0.007279f, 0.008119f, -0.004728f, -0.009269f, -0.004619f, -0.006514f, 0.010276f, 0.014277f, 0.007978f, -0.005018f, 0.000003f, 0.007666f, 0.004469f, -0.000556f, -0.005859f, -0.002668f, -0.005149f, 0.005490f, 0.017492f, -0.000053f, -0.009577f, -0.007429f, 0.004013f, 0.001516f, -0.003625f, -0.010304f, -0.000250f, -0.008814f, -0.003554f, 0.001489f, + -0.001584f, 0.007152f, 0.001262f, 0.008958f, 0.010265f, -0.008967f, -0.003391f, 0.000595f, -0.007125f, -0.008394f, -0.001414f, 0.000130f, -0.005249f, 0.005065f, -0.004775f, -0.000498f, 0.003871f, 0.000881f, 0.000225f, 0.003973f, -0.004829f, -0.001558f, 0.001073f, 0.001887f, -0.002217f, 0.001641f, 0.000790f, 0.001842f, -0.000322f, 0.000056f, 0.001733f, -0.002343f, 0.003064f, -0.002347f, 0.001472f, 0.000573f, -0.000749f, -0.000097f, 0.001333f, -0.000907f, -0.001681f, -0.002659f, 0.001669f, -0.001926f, 0.000703f, 0.002729f, -0.000417f, -0.001581f, 0.024929f, -0.006707f, 0.002445f, 0.003545f, -0.016417f, -0.014014f, 0.000383f, 0.016274f, 0.012443f, 0.019675f, 0.006513f, -0.005564f, -0.008448f, 0.001445f, -0.004839f, 0.003875f, 0.001905f, 0.006646f, 0.012253f, 0.003892f, 0.009042f, -0.000256f, 0.005373f, -0.005426f, -0.011361f, -0.005970f, -0.008688f, 0.000120f, -0.002403f, 0.002660f, -0.013844f, -0.006924f, -0.001824f, 0.005139f, -0.006825f, 0.014384f, -0.016166f, 0.003483f, -0.010166f, -0.008268f, 0.004749f, 0.004138f, 0.013911f, -0.001530f, 0.003546f, -0.003949f, 0.009757f, 0.010281f, + 0.002898f, -0.002200f, -0.010396f, -0.001434f, 0.003648f, -0.007988f, 0.008069f, -0.008794f, 0.003827f, 0.014586f, 0.012257f, 0.000200f, -0.004655f, 0.002302f, 0.014614f, -0.001798f, 0.003633f, 0.002287f, 0.011953f, 0.000143f, -0.003123f, -0.007366f, 0.005246f, -0.011111f, 0.004111f, 0.023194f, 0.005753f, 0.010937f, 0.001140f, -0.015297f, 0.005601f, 0.002878f, -0.005987f, 0.006286f, -0.001880f, -0.001635f, -0.007581f, 0.003230f, 0.007586f, 0.003395f, 0.001513f, -0.003456f, -0.007457f, 0.001778f, -0.001430f, -0.001133f, 0.000555f, -0.000340f, -0.001352f, 0.002467f, -0.002493f, -0.002290f, -0.002137f, 0.003457f, 0.001440f, 0.002732f, -0.001438f, 0.002525f, 0.000216f, -0.002393f, 0.002699f, 0.001481f, -0.002088f, -0.004091f, -0.001431f, 0.003463f, 0.000296f, -0.000842f, 0.001797f, 0.001606f, 0.003790f, -0.000116f, -0.001366f, 0.002429f, -0.001814f, -0.008980f, -0.015640f, 0.007942f, -0.011180f, -0.011317f, 0.002254f, -0.005430f, -0.036652f, 0.003649f, 0.005550f, 0.033566f, 0.010744f, 0.002586f, -0.015285f, 0.014052f, 0.005952f, -0.005963f, 0.007218f, -0.001160f, 0.012072f, -0.007231f, + -0.003852f, -0.002362f, -0.003314f, -0.004930f, -0.002267f, 0.008749f, 0.007477f, 0.013182f, 0.004595f, 0.006524f, -0.000207f, -0.008397f, -0.009275f, 0.012494f, -0.006852f, 0.002864f, -0.001185f, -0.008631f, 0.012494f, -0.001985f, -0.005508f, 0.002302f, 0.009080f, -0.005970f, 0.013822f, -0.017483f, -0.014622f, -0.017732f, 0.004263f, -0.009939f, -0.015334f, -0.003402f, 0.014220f, -0.005938f, 0.004227f, 0.008585f, -0.006198f, -0.007943f, 0.000594f, 0.001430f, 0.004721f, 0.000987f, -0.004510f, -0.000400f, 0.018346f, 0.007919f, -0.007556f, -0.023046f, -0.018557f, 0.006881f, 0.021838f, 0.018522f, -0.014412f, 0.000482f, -0.009421f, 0.004262f, 0.003584f, -0.015580f, -0.001302f, 0.003226f, 0.001780f, -0.004144f, 0.000884f, 0.001056f, 0.000424f, 0.005439f, 0.004818f, -0.003019f, -0.003878f, 0.002727f, -0.001911f, 0.001339f, -0.005525f, 0.002365f, 0.001588f, -0.008621f, -0.002015f, 0.001996f, 0.001280f, 0.000839f, 0.001672f, -0.000420f, 0.000593f, 0.000766f, 0.000827f, -0.003071f, -0.000488f, 0.001243f, -0.001057f, -0.003755f, -0.001979f, 0.000644f, 0.000568f, 0.004341f, -0.006457f, 0.010759f, + -0.018130f, -0.003098f, -0.022484f, -0.006603f, 0.003427f, 0.007890f, -0.020483f, -0.005099f, 0.014175f, -0.001673f, -0.020495f, 0.010698f, -0.006497f, -0.011742f, 0.006545f, 0.010837f, 0.002542f, 0.002301f, 0.003824f, 0.014154f, -0.006595f, -0.005819f, 0.003796f, -0.006950f, -0.003457f, 0.000235f, -0.000682f, 0.000520f, 0.011428f, 0.005855f, -0.001197f, -0.000937f, 0.006732f, 0.002829f, 0.008244f, -0.000650f, 0.009294f, 0.009762f, 0.003998f, -0.010535f, 0.001663f, -0.001425f, -0.007400f, 0.010261f, -0.005644f, 0.004336f, -0.006859f, -0.002508f, -0.025065f, 0.002373f, 0.020613f, 0.001876f, 0.021907f, -0.003946f, -0.004736f, -0.022332f, 0.026446f, 0.012458f, 0.015139f, 0.002526f, 0.012442f, -0.000064f, 0.000071f, 0.010322f, -0.005819f, 0.003786f, 0.000132f, -0.025038f, 0.005940f, -0.005811f, 0.006818f, -0.003700f, 0.006174f, 0.023402f, 0.007219f, 0.006233f, -0.000092f, -0.014069f, 0.010821f, -0.005656f, 0.002330f, 0.005427f, 0.007209f, -0.007701f, -0.001855f, -0.003130f, -0.004012f, 0.004652f, -0.002442f, -0.001933f, -0.003099f, 0.000642f, 0.001072f, 0.000451f, -0.006298f, 0.002719f, + 0.001360f, -0.001358f, 0.002114f, 0.001018f, 0.001878f, 0.001470f, 0.003340f, 0.000140f, 0.000906f, -0.000283f, -0.001249f, 0.004023f, -0.000481f, 0.005625f, 0.001114f, 0.002415f, -0.001433f, 0.003155f, 0.001284f, 0.002592f, 0.002708f, 0.002281f, -0.028750f, -0.001153f, 0.021959f, -0.004969f, 0.013077f, -0.014089f, -0.009386f, -0.025207f, 0.014472f, 0.007211f, 0.016771f, 0.007549f, -0.007988f, 0.013775f, -0.003350f, 0.013172f, -0.008623f, -0.008346f, 0.001195f, -0.003191f, 0.011763f, 0.002228f, 0.009947f, 0.010721f, -0.006369f, -0.005784f, -0.003690f, 0.006992f, -0.001310f, -0.004844f, 0.001653f, -0.010038f, 0.005250f, 0.003282f, -0.005011f, 0.007077f, 0.012949f, -0.005317f, -0.005640f, -0.001743f, -0.009498f, -0.004892f, 0.014855f, 0.001798f, -0.008944f, 0.017666f, -0.019488f, 0.002912f, 0.010678f, -0.004697f, -0.006313f, -0.001643f, 0.008543f, -0.015185f, 0.007662f, -0.006280f, -0.012723f, -0.009840f, -0.007631f, 0.000093f, -0.003530f, -0.008392f, 0.003684f, 0.021993f, 0.012382f, -0.003194f, -0.007483f, -0.021628f, 0.002407f, 0.011752f, -0.006861f, -0.023881f, 0.000765f, -0.003883f, + 0.001318f, 0.002834f, 0.011005f, -0.000790f, -0.005411f, -0.002255f, -0.008539f, -0.005259f, -0.003977f, 0.006387f, -0.005260f, 0.005919f, -0.012526f, 0.000929f, -0.005691f, -0.003995f, 0.007803f, -0.003794f, -0.003522f, -0.004544f, 0.001680f, -0.008199f, -0.003122f, -0.001976f, -0.000212f, 0.001614f, -0.005631f, 0.001510f, -0.004448f, 0.002402f, 0.003105f, 0.006533f, 0.001345f, 0.002295f, 0.003595f, 0.002573f, -0.001808f, 0.000977f, 0.000512f, 0.004843f, 0.002956f, -0.000601f, 0.003057f, -0.000339f, 0.000355f, -0.002120f, 0.000400f, -0.000071f, -0.003406f, 0.000953f, -0.002324f, -0.001935f, 0.000342f, 0.002544f, -0.000646f, 0.009622f, -0.004234f, 0.002441f, 0.014243f, 0.000915f, 0.016685f, 0.018068f, 0.040349f, 0.027500f, 0.016877f, -0.004300f, -0.021367f, -0.007468f, 0.019582f, 0.008451f, -0.020640f, 0.015386f, -0.003601f, -0.010261f, -0.012632f, 0.001865f, 0.034879f, -0.023663f, 0.025222f, 0.009821f, -0.005439f, 0.008260f, -0.006824f, 0.018026f, -0.006937f, 0.009508f, 0.001891f, -0.012555f, -0.008784f, -0.012234f, 0.000458f, 0.010295f, -0.002994f, -0.006912f, 0.006640f, 0.000828f, + -0.002098f, -0.023628f, 0.007127f, -0.013252f, -0.010019f, 0.006476f, 0.015537f, -0.011521f, -0.016561f, 0.000553f, 0.014023f, 0.001123f, -0.009451f, -0.003552f, -0.005635f, 0.006366f, 0.004647f, -0.005464f, -0.008937f, -0.013431f, 0.008262f, 0.021450f, 0.013142f, 0.006751f, -0.012492f, 0.006428f, 0.013576f, -0.015301f, -0.019958f, 0.003452f, -0.016485f, -0.007908f, -0.032293f, 0.000383f, -0.022186f, -0.011577f, 0.005931f, -0.002817f, -0.002161f, 0.009777f, 0.001639f, -0.018112f, -0.012573f, 0.008120f, -0.002536f, 0.000955f, -0.005661f, 0.000502f, 0.005244f, -0.000818f, 0.003463f, 0.003492f, 0.000687f, 0.000303f, 0.002558f, 0.003009f, 0.001977f, 0.000210f, 0.000584f, -0.001851f, 0.004733f, 0.000099f, 0.004351f, -0.000811f, -0.002971f, 0.001399f, 0.004044f, -0.005156f, -0.007591f, -0.003870f, -0.001142f, -0.002384f, 0.008525f, 0.003208f, -0.002752f, 0.003793f, -0.002228f, 0.000557f, -0.006969f, -0.000637f, 0.000443f, -0.003180f, 0.044118f, 0.001011f, -0.017307f, 0.019478f, -0.021314f, 0.024650f, 0.001966f, -0.014989f, -0.025730f, -0.006215f, 0.012573f, -0.020421f, 0.018095f, -0.002888f, + 0.011650f, 0.013927f, -0.011992f, -0.004972f, -0.007236f, -0.009523f, -0.003747f, -0.008900f, 0.001437f, -0.010879f, 0.011263f, 0.007134f, 0.009445f, 0.019248f, 0.009863f, -0.002887f, 0.022920f, 0.011692f, 0.004190f, -0.012351f, -0.013503f, 0.006868f, -0.010352f, 0.002341f, 0.007200f, -0.015371f, 0.013072f, 0.034968f, 0.002604f, 0.024858f, 0.011718f, 0.012006f, 0.017704f, 0.000995f, 0.009350f, 0.009904f, -0.022728f, -0.015413f, 0.015558f, 0.000996f, 0.014678f, 0.002575f, 0.015411f, -0.002558f, 0.005492f, 0.003796f, -0.032538f, -0.002199f, 0.008258f, 0.021653f, 0.004766f, 0.018980f, 0.001852f, -0.004561f, 0.006162f, 0.008473f, -0.018308f, -0.030885f, -0.016350f, 0.004158f, 0.007494f, 0.000948f, 0.022523f, 0.007887f, -0.035538f, 0.008933f, -0.005237f, 0.000096f, 0.010103f, -0.014322f, -0.000582f, -0.007765f, 0.006427f, 0.009062f, 0.000458f, 0.001872f, 0.006531f, 0.000159f, -0.000162f, -0.003187f, -0.003501f, 0.001086f, 0.000567f, 0.000103f, 0.005432f, 0.003890f, 0.001289f, 0.003202f, 0.002044f, 0.000020f, -0.005539f, 0.004204f, 0.003446f, -0.002276f, -0.000585f, -0.000894f, + 0.000157f, 0.003027f, 0.002525f, 0.008253f, -0.007166f, -0.002157f, 0.003042f, -0.001879f, 0.004299f, -0.003662f, 0.007260f, -0.001911f, -0.002358f, 0.000883f, 0.004109f, 0.002834f, -0.001148f, -0.000645f, -0.003026f, -0.000710f, -0.021557f, -0.001683f, -0.019212f, -0.008793f, 0.007873f, -0.009472f, 0.004139f, 0.006676f, -0.011572f, -0.028226f, 0.008975f, -0.027963f, -0.032485f, 0.007192f, -0.016036f, 0.014446f, 0.020239f, -0.005047f, 0.023638f, -0.005590f, 0.023352f, 0.032157f, -0.000072f, 0.002049f, -0.032427f, -0.005950f, 0.003400f, 0.005689f, -0.003879f, -0.021132f, 0.001384f, -0.017872f, 0.002198f, -0.004706f, 0.004810f, -0.006769f, -0.012045f, 0.002866f, -0.002231f, -0.006429f, 0.007477f, 0.000910f, -0.005034f, 0.023268f, 0.008477f, 0.017507f, -0.011075f, 0.003353f, -0.009357f, 0.006765f, -0.002179f, 0.009246f, -0.003165f, -0.006703f, -0.008984f, -0.020299f, -0.012189f, 0.033146f, 0.013235f, 0.022035f, -0.025449f, 0.005485f, 0.018597f, -0.015802f, 0.000014f, 0.012387f, -0.006763f, 0.012429f, 0.001617f, -0.021962f, -0.005887f, -0.033889f, -0.004353f, 0.013882f, 0.006952f, 0.023002f, + 0.002439f, 0.015330f, 0.016039f, 0.005773f, -0.001169f, 0.029756f, 0.002351f, 0.000919f, -0.005236f, -0.002780f, 0.015519f, 0.009329f, 0.014835f, -0.001641f, -0.003249f, -0.003700f, 0.010790f, 0.002364f, -0.002447f, 0.003094f, 0.007351f, -0.001669f, -0.004587f, -0.008588f, 0.000145f, -0.006832f, -0.003245f, -0.005815f, 0.004831f, -0.000608f, -0.010343f, -0.001797f, 0.000598f, 0.000828f, -0.000657f, -0.004742f, 0.006771f, -0.005550f, 0.001610f, 0.002677f, -0.007848f, -0.001379f, -0.005300f, 0.001091f, 0.005985f, -0.005435f, -0.004633f, -0.003371f, -0.003519f, 0.003470f, 0.001791f, -0.020970f, -0.018702f, -0.019861f, -0.028945f, 0.019743f, 0.012796f, 0.001755f, -0.019478f, 0.017597f, -0.000161f, -0.024598f, -0.020109f, -0.007035f, -0.005011f, -0.015758f, -0.006204f, -0.009353f, -0.007915f, -0.005842f, -0.022738f, 0.011362f, 0.013321f, -0.001205f, -0.002115f, -0.004173f, -0.008400f, -0.027032f, -0.029459f, 0.000879f, 0.012791f, -0.007803f, -0.018142f, -0.010216f, 0.013820f, 0.010138f, 0.000676f, -0.005699f, -0.007792f, -0.007919f, 0.017478f, -0.008916f, 0.012288f, -0.008436f, 0.000369f, -0.029392f, + -0.006393f, -0.002333f, 0.022183f, 0.006078f, -0.005184f, -0.016534f, -0.011475f, -0.023134f, 0.037321f, -0.017175f, 0.035445f, 0.004499f, -0.015259f, 0.023359f, 0.023031f, 0.039761f, -0.038998f, 0.016134f, 0.006504f, 0.005242f, -0.007732f, -0.011230f, 0.017261f, 0.008909f, -0.002954f, -0.018327f, 0.020363f, -0.010709f, 0.021891f, 0.018045f, 0.017132f, -0.015520f, 0.033803f, -0.024970f, 0.013908f, 0.021762f, -0.012533f, 0.002704f, 0.000637f, 0.018906f, -0.005021f, 0.008392f, -0.009862f, 0.020205f, -0.000632f, 0.003531f, -0.011600f, 0.009216f, -0.000631f, 0.009508f, -0.002755f, 0.012822f, 0.006288f, 0.004035f, -0.007573f, 0.002413f, -0.006340f, 0.000354f, -0.005397f, -0.007304f, -0.001458f, -0.006452f, -0.004286f, -0.000700f, -0.003265f, -0.006428f, 0.004410f, 0.005332f, 0.007871f, 0.001821f, -0.007341f, 0.000684f, -0.004954f, 0.004966f, 0.002089f, -0.003617f, 0.000978f, 0.003470f, 0.002098f, -0.008278f, 0.001630f, 0.008294f, 0.003267f, -0.001312f, 0.002398f, 0.031786f, -0.053070f, -0.056826f, -0.035827f, -0.005879f, -0.024998f, 0.015406f, -0.020571f, 0.002222f, 0.010144f, -0.001412f, + 0.037408f, 0.027134f, 0.009500f, -0.010865f, -0.008418f, 0.026362f, -0.004449f, 0.004195f, -0.010801f, -0.023283f, 0.000017f, 0.009618f, 0.006232f, -0.012733f, 0.011304f, 0.001766f, -0.001567f, 0.022374f, 0.030569f, 0.002347f, -0.019603f, -0.008275f, -0.037570f, -0.014392f, -0.009735f, -0.011113f, 0.001664f, 0.006729f, -0.013674f, -0.005296f, -0.019113f, 0.020736f, 0.024659f, 0.020740f, 0.023026f, 0.018290f, 0.030141f, 0.003870f, 0.010335f, 0.007335f, -0.005489f, 0.011802f, 0.017965f, -0.017859f, -0.062352f, -0.014335f, 0.020704f, -0.032122f, 0.016463f, 0.020551f, 0.007362f, -0.009643f, 0.001562f, -0.007578f, -0.025034f, -0.006631f, 0.016298f, -0.019839f, -0.016940f, 0.006204f, -0.013751f, 0.040777f, 0.041291f, -0.015100f, 0.026593f, 0.007211f, -0.003894f, -0.017883f, 0.012722f, -0.024189f, -0.020148f, 0.022374f, 0.016772f, 0.011941f, -0.001552f, -0.001942f, -0.029695f, -0.021163f, -0.003903f, -0.006557f, -0.005522f, -0.004241f, -0.008774f, -0.007073f, -0.008178f, -0.003893f, 0.001093f, 0.007228f, 0.005557f, 0.009513f, -0.000772f, -0.004205f, -0.004440f, -0.002809f, 0.013419f, 0.012681f, + 0.006453f, -0.000921f, -0.000840f, -0.002627f, -0.005001f, -0.007557f, -0.003429f, 0.001658f, -0.002293f, 0.005671f, -0.002860f, 0.002294f, 0.002600f, 0.002557f, 0.005138f, -0.005702f, -0.000094f, 0.001480f, 0.004358f, -0.006915f, 0.012382f, -0.004842f, -0.003114f, 0.051209f, -0.043149f, -0.000487f, 0.006948f, -0.040686f, -0.012408f, -0.017002f, 0.005871f, -0.012213f, 0.035276f, 0.004873f, -0.000739f, 0.044701f, -0.002809f, -0.039092f, -0.031859f, -0.019053f, 0.014922f, -0.002037f, -0.038453f, 0.010028f, 0.010340f, 0.020298f, -0.022990f, 0.011764f, 0.019027f, 0.017032f, 0.013220f, -0.004434f, 0.022798f, 0.025147f, 0.008153f, -0.055354f, 0.040347f, -0.019722f, 0.015385f, -0.003851f, -0.006027f, 0.010840f, -0.024872f, -0.013879f, 0.025868f, -0.011761f, -0.003654f, 0.023800f, -0.026669f, 0.023933f, -0.009424f, 0.022233f, -0.029348f, 0.039016f, -0.017509f, 0.060267f, -0.008099f, 0.003937f, 0.015237f, -0.013146f, -0.010092f, -0.007160f, 0.004683f, -0.002940f, -0.030462f, -0.037870f, -0.010702f, 0.022195f, -0.011585f, -0.013681f, -0.038912f, 0.017962f, 0.003814f, -0.052802f, -0.000937f, 0.000817f, + 0.007654f, 0.027329f, -0.018642f, 0.008609f, -0.023896f, -0.020678f, -0.031643f, -0.031324f, -0.005720f, -0.018288f, 0.022600f, -0.003701f, 0.022075f, -0.010747f, 0.012520f, -0.001705f, -0.014348f, -0.019704f, -0.002401f, 0.002429f, 0.009545f, -0.004639f, 0.004135f, 0.002010f, 0.007793f, -0.000727f, -0.010621f, -0.001463f, -0.016007f, -0.000677f, 0.002464f, 0.003579f, 0.000787f, -0.005968f, -0.007817f, 0.008799f, 0.003942f, -0.002573f, 0.009837f, -0.012447f, -0.016756f, -0.000254f, 0.014697f, 0.000395f, 0.004193f, 0.005902f, 0.010028f, 0.000652f, 0.011235f, -0.009175f, 0.003556f, 0.002309f, 0.009126f, 0.015648f, -0.009782f, 0.002563f, -0.002356f, 0.002600f, 0.019644f, 0.059043f, 0.029522f, -0.018037f, 0.040768f, 0.013365f, -0.025948f, 0.009980f, 0.026368f, -0.004106f, -0.008897f, -0.036323f, -0.009774f, 0.022352f, 0.014694f, 0.010619f, 0.006657f, -0.006577f, -0.014492f, -0.034289f, 0.018308f, -0.011711f, 0.009161f, -0.026336f, -0.014162f, -0.000689f, -0.003973f, 0.033652f, 0.010234f, 0.005336f, 0.025875f, 0.012349f, -0.038938f, -0.004597f, 0.014357f, -0.007351f, 0.000898f, 0.033247f, + 0.011042f, 0.038604f, -0.022407f, -0.014227f, -0.006252f, -0.014458f, 0.015253f, -0.015070f, 0.029196f, 0.028933f, -0.012652f, -0.028355f, 0.047515f, -0.024448f, -0.009761f, -0.005731f, 0.014219f, 0.007179f, -0.026357f, -0.007940f, 0.017024f, -0.012628f, 0.021568f, -0.010208f, 0.030519f, -0.015856f, 0.006965f, 0.046467f, -0.000841f, 0.032720f, 0.056846f, 0.007127f, 0.027962f, -0.014451f, -0.068172f, -0.046316f, -0.008769f, -0.002971f, 0.038885f, -0.001316f, 0.013065f, 0.003245f, -0.009559f, -0.031681f, -0.070362f, 0.053261f, 0.003772f, 0.001522f, 0.017526f, 0.008254f, -0.017096f, 0.039351f, 0.002060f, 0.008260f, -0.000405f, 0.002590f, -0.034663f, -0.012974f, -0.022824f, -0.013894f, -0.001040f, -0.012989f, -0.012856f, 0.007995f, -0.002734f, -0.008970f, 0.025502f, -0.004818f, -0.025781f, -0.018568f, 0.006570f, 0.001189f, -0.007426f, 0.039279f, 0.011958f, -0.013259f, -0.015149f, 0.003997f, -0.003470f, -0.008255f, 0.001353f, 0.003524f, -0.008799f, 0.009241f, -0.000238f, 0.013387f, 0.017572f, 0.003319f, -0.001592f, -0.005400f, 0.011796f, 0.011259f, 0.010308f, -0.077112f, -0.018462f, 0.080535f, + -0.030915f, -0.034533f, 0.071109f, -0.045627f, 0.040071f, 0.053552f, 0.021164f, 0.007359f, -0.040674f, 0.015565f, -0.071349f, -0.035153f, 0.015612f, 0.037091f, 0.004195f, 0.008554f, 0.027040f, 0.072167f, 0.048785f, 0.015245f, 0.002692f, -0.000086f, 0.008029f, 0.005958f, -0.028008f, 0.000593f, 0.017859f, 0.022574f, 0.096313f, 0.054283f, 0.037114f, 0.069543f, 0.028417f, -0.009969f, 0.020894f, -0.001323f, 0.066633f, 0.024107f, -0.005446f, -0.011125f, 0.027840f, -0.004304f, 0.031967f, -0.099369f, 0.004285f, 0.034189f, -0.002060f, 0.041383f, -0.015496f, 0.010916f, 0.022051f, -0.092530f, -0.035758f, -0.007283f, -0.029635f, -0.038357f, -0.045181f, 0.042232f, -0.027647f, 0.008389f, -0.008474f, 0.042374f, -0.069521f, -0.019133f, -0.009820f, 0.021758f, -0.000351f, -0.006467f, 0.051213f, 0.089291f, -0.000479f, 0.027721f, -0.016966f, 0.007432f, 0.062473f, -0.066601f, -0.039575f, -0.055769f, -0.070297f, -0.006270f, -0.002887f, -0.027818f, -0.029877f, -0.028328f, -0.026886f, -0.034679f, -0.050215f, -0.022040f, -0.032626f, -0.020086f, 0.008583f, 0.043830f, 0.013911f, 0.006439f, 0.006435f, -0.004622f, + 0.009609f, 0.004008f, -0.031528f, -0.028480f, -0.008364f, -0.040027f, -0.016058f, -0.017849f, -0.013945f, -0.016011f, 0.017849f, -0.014847f, 0.000782f, 0.002280f, 0.007480f, 0.021421f, 0.032973f, -0.000862f, -0.008832f, 0.023717f, -0.012744f, 0.014901f, 0.005443f, 0.002800f, -0.007026f, 0.003807f, 0.002530f, -0.014886f, -0.019416f, -0.021052f, -0.003438f, 0.006554f, 0.041829f, 0.036846f, -0.034694f, -0.122751f, -0.022247f, 0.050339f, 0.011364f, -0.013677f, -0.009958f, 0.003834f, -0.017233f, -0.022506f, 0.026799f, 0.020216f, 0.055548f, 0.020335f, 0.033280f, -0.012570f, 0.073999f, 0.013447f, 0.046807f, -0.006600f, 0.068235f, -0.025980f, 0.044353f, -0.043446f, 0.000096f, 0.004853f, 0.031603f, -0.012518f, -0.024083f, -0.057484f, 0.031753f, 0.004262f, 0.006283f, -0.027773f, -0.051885f, -0.003127f, 0.005710f, -0.006323f, 0.015538f, 0.033264f, 0.004745f, 0.023793f, 0.084603f, -0.035691f, 0.008235f, -0.027936f, 0.043561f, 0.038067f, -0.042862f, 0.040245f, 0.045623f, -0.032769f, 0.011378f, 0.010836f, 0.031526f, 0.015745f, 0.064345f, 0.020394f, -0.023212f, 0.003909f, 0.083240f, 0.026501f, + -0.095796f, 0.028213f, 0.016808f, -0.082167f, -0.023147f, -0.026300f, -0.058365f, 0.004219f, 0.035541f, 0.039320f, -0.023620f, 0.070688f, -0.018498f, -0.030660f, -0.016132f, 0.037390f, -0.139018f, -0.016912f, 0.001691f, 0.111895f, 0.014495f, 0.094877f, 0.045231f, 0.066593f, -0.002215f, 0.022866f, -0.013104f, 0.056430f, 0.056876f, 0.051376f, -0.012791f, -0.034208f, -0.014357f, 0.056369f, -0.006999f, -0.036816f, -0.016377f, 0.066778f, 0.008935f, -0.041539f, -0.014590f, 0.060239f, 0.016837f, 0.025085f, -0.001206f, 0.022755f, -0.017615f, -0.001192f, -0.001710f, 0.009854f, -0.002022f, 0.010651f, -0.008794f, -0.019558f, -0.023573f, -0.028304f, -0.004170f, -0.020668f, -0.000458f, -0.003699f, -0.008523f, 0.019972f, -0.023233f, -0.009330f, -0.023051f, -0.008381f, -0.041914f, -0.030888f, 0.041349f, 0.000731f, -0.048321f, -0.076593f, 0.062201f, 0.132556f, 0.009382f, -0.074304f, 0.115140f, -0.026215f, -0.001196f, 0.015987f, 0.065511f, -0.037766f, 0.003266f, 0.129844f, -0.064077f, 0.030647f, 0.044354f, 0.041735f, -0.057257f, -0.006180f, 0.010832f, -0.028650f, 0.005421f, 0.013221f, -0.022986f, 0.022763f, + -0.039315f, -0.011639f, -0.015447f, -0.003360f, -0.023406f, -0.021266f, -0.007225f, 0.012194f, -0.042918f, -0.040925f, 0.061507f, 0.010731f, -0.037718f, -0.010359f, 0.036789f, 0.087741f, -0.007178f, -0.043292f, 0.046461f, 0.067212f, -0.019123f, -0.005359f, 0.002263f, 0.024117f, 0.000694f, -0.000276f, 0.031228f, -0.074958f, 0.051705f, -0.043389f, 0.001063f, -0.061361f, 0.034762f, -0.005119f, -0.090630f, 0.044643f, -0.005991f, -0.035616f, 0.062025f, 0.006882f, 0.061337f, -0.051793f, -0.019183f, -0.021135f, -0.047066f, -0.074194f, -0.097160f, 0.082549f, 0.034415f, 0.060673f, 0.056803f, 0.034467f, 0.014112f, -0.035489f, 0.053819f, -0.026853f, -0.021900f, 0.071777f, 0.024624f, -0.013951f, -0.005940f, 0.021622f, -0.050607f, 0.012807f, -0.019674f, 0.033490f, -0.012471f, -0.022237f, 0.032852f, 0.005119f, -0.037472f, 0.002696f, -0.017469f, -0.010959f, 0.008591f, -0.008666f, 0.007506f, -0.002447f, -0.026831f, -0.014211f, 0.012400f, -0.009480f, -0.016712f, 0.016750f, 0.027503f, 0.026097f, -0.020714f, -0.009078f, 0.031539f, -0.052907f, 0.016332f, 0.018886f, -0.021948f, -0.052577f, 0.026836f, 0.002917f, + -0.022978f, 0.015968f, -0.024634f, -0.041008f, 0.011266f, 0.036109f, -0.029604f, -0.013386f, 0.013491f, 0.031473f, -0.008146f, -0.004323f, 0.028324f, 0.001633f, -0.021739f, 0.072073f, -0.029290f, 0.021298f, 0.016767f, -0.074919f, 0.067385f, 0.023471f, -0.019152f, 0.057731f, 0.004921f, 0.003810f, 0.028343f, -0.025143f, 0.073835f, -0.059233f, -0.031588f, 0.027462f, 0.025499f, 0.012526f, -0.054941f, -0.033536f, -0.061229f, 0.033889f, 0.008264f, 0.030960f, 0.000168f, 0.033257f, 0.013542f, 0.011135f, 0.001459f, 0.028361f, -0.012666f, 0.015619f, -0.027915f, 0.021039f, -0.025791f, -0.000216f, -0.034087f, -0.024305f, 0.001566f, -0.030428f, 0.014393f, 0.072589f, 0.017481f, -0.054375f, 0.028513f, 0.021858f, 0.038621f, 0.001113f, 0.064134f, -0.054970f, 0.008548f, 0.025569f, -0.052934f, -0.012345f, 0.107220f, 0.060326f, -0.141593f, -0.060135f, 0.075521f, -0.020543f, -0.067116f, 0.026562f, -0.006759f, -0.051840f, 0.038182f, 0.064502f, -0.087252f, 0.017327f, 0.077721f, -0.052535f, -0.047069f, 0.063497f, 0.008628f, -0.052174f, 0.009398f, 0.041293f, -0.045527f, -0.006303f, 0.050153f, -0.007314f, + -0.022193f, -0.035805f, 0.045891f, -0.012065f, 0.025635f, 0.005974f, 0.026036f, -0.017746f, 0.016887f, 0.046232f, 0.018331f, -0.034011f, 0.002876f, -0.024326f, -0.016403f, -0.034263f, -0.003021f, -0.009121f, -0.002352f, -0.023020f, 0.023643f, 0.020327f, -0.007972f, 0.052842f, -0.013297f, -0.056110f, 0.067651f, -0.007987f, -0.012785f, 0.012490f, 0.023734f, 0.003204f, -0.006212f, 0.057072f, 0.031414f, -0.040042f, 0.003450f, 0.016257f, -0.029028f, -0.024002f, 0.041312f, -0.021232f, -0.078196f, 0.075426f, 0.009668f, -0.076237f, -0.002191f, 0.040199f, -0.028611f, -0.064107f, 0.037053f, 0.049432f, -0.079036f, 0.011667f, 0.059602f, -0.034883f, -0.006064f, 0.065217f, -0.004779f, -0.026606f, 0.015333f, 0.027564f, -0.035677f, -0.009749f, 0.038274f, -0.008713f, -0.033341f, 0.028088f, 0.016780f, -0.019432f, 0.062990f, -0.135594f, -0.009255f, -0.024327f, -0.149947f, -0.027321f, -0.046009f, 0.014316f, 0.026196f, 0.044040f, -0.019498f, -0.059089f, -0.021823f, -0.085079f, 0.011666f, 0.029820f, 0.017848f, 0.012962f, -0.067741f, 0.041279f, 0.006946f, -0.082292f, 0.060065f, -0.088463f, -0.035668f, -0.033504f, + 0.024187f, 0.063139f, 0.074128f, -0.006573f, -0.016316f, -0.142878f, 0.061432f, 0.143607f, 0.052841f, 0.002771f, -0.078901f, -0.116594f, -0.047380f, -0.010359f, 0.060895f, -0.073250f, -0.043149f, -0.075244f, -0.023522f, 0.134055f, 0.145443f, -0.025902f, -0.066679f, -0.058292f, -0.030467f, -0.015963f, 0.073373f, -0.035401f, 0.022123f, 0.014591f, 0.048882f, -0.014040f, -0.032554f, -0.085470f, -0.036560f, 0.128482f, 0.055543f, 0.085267f, -0.078632f, -0.044434f, -0.036307f, 0.087125f, 0.002009f, -0.143648f, -0.137650f, 0.076460f, 0.133132f, 0.222192f, 0.039212f, -0.190106f, 0.031898f, -0.050780f, 0.064606f, 0.061309f, -0.231808f, -0.074756f, 0.045526f, 0.121494f, 0.029928f, -0.118855f, -0.026266f, -0.012575f, 0.068833f, 0.057835f, 0.015839f, -0.095361f, -0.014633f, 0.020006f, 0.042334f, 0.020246f, -0.024513f, 0.003315f, -0.052198f, -0.007366f, -0.000756f, 0.049879f, -0.034528f, 0.066768f, -0.042967f, 0.018541f, 0.039277f, -0.016874f, 0.032589f, 0.028049f, 0.053067f, 0.002025f, -0.025643f, -0.031233f, 0.004844f, 0.001894f, 0.009014f, 0.004856f, -0.001727f, -0.004244f, -0.019158f, -0.020913f, + -0.004019f, 0.032800f, -0.008616f, 0.000252f, -0.007004f, 0.010520f, 0.002501f, 0.017992f, -0.017023f, -0.022778f, -0.043842f, -0.022399f, -0.002609f, 0.023931f, -0.023464f, -0.002163f, -0.068645f, 0.058635f, -0.061272f, -0.012947f, 0.001903f, 0.015727f, -0.011861f, 0.014134f, 0.023317f, -0.038996f, -0.034114f, -0.000473f, 0.008535f, 0.025485f, -0.028805f, 0.004275f, 0.021328f, -0.016593f, 0.013151f, -0.008492f, 0.066071f, -0.000692f, -0.010451f, 0.038464f, 0.020506f, 0.034207f, -0.017602f, 0.021931f, -0.007333f, -0.000667f, 0.027569f, 0.020156f, 0.004226f, 0.008602f, 0.037325f, -0.034982f, -0.011076f, 0.004015f, 0.050510f, -0.000575f, -0.011914f, 0.047626f, -0.012486f, -0.020357f, -0.020944f, 0.039500f, -0.009751f, 0.017385f, 0.010068f, 0.006211f, -0.014220f, 0.007287f, 0.014879f, 0.005639f, 0.043918f, 0.022238f, 0.012186f, -0.018980f, -0.003293f, 0.017137f, -0.032031f, 0.011624f, 0.011661f, 0.032892f, 0.000073f, -0.003664f, 0.018119f, 0.004294f, -0.037107f, 0.041564f, 0.012281f, -0.009445f, 0.033987f, -0.023110f, -0.003241f, -0.017199f, -0.015573f, 0.033999f, 0.024390f, -0.002151f, + 0.012039f, -0.020007f, 0.004372f, -0.027042f, -0.002923f, -0.024755f, 0.005237f, 0.016263f, 0.005537f, 0.003161f, -0.005726f, -0.003297f, 0.004441f, -0.014752f, 0.004019f, -0.006322f, 0.006750f, -0.009689f, -0.003773f, -0.008964f, -0.011895f, 0.005717f, -0.002325f, -0.000674f, -0.004585f, 0.016108f, 0.005884f, -0.020212f, -0.021498f, -0.014384f, 0.004159f, 0.006704f, 0.015168f, 0.009246f, -0.019830f, -0.002832f, -0.007653f, 0.017996f, -0.004789f, 0.019400f, 0.007726f, -0.015787f, -0.000177f, 0.008641f, -0.009327f, 0.012397f, -0.007550f, 0.014006f, -0.010105f, -0.003099f, 0.004227f, -0.007836f, 0.107021f, 0.008627f, -0.039566f, -0.032748f, 0.005287f, 0.024202f, -0.001513f, 0.022090f, -0.008448f, -0.005926f, -0.029729f, -0.006539f, -0.020837f, 0.033030f, -0.020727f, -0.001701f, -0.013111f, -0.006177f, -0.007721f, 0.003599f, -0.022031f, 0.003349f, -0.009537f, -0.015499f, 0.004469f, -0.002488f, 0.001165f, -0.004214f, 0.007655f, 0.003706f, -0.018455f, -0.011828f, -0.000100f, -0.012484f, -0.010929f, 0.009084f, -0.003070f, -0.018805f, 0.001150f, -0.010472f, 0.007904f, -0.027767f, 0.013757f, -0.012088f, + -0.021159f, 0.006366f, -0.009762f, -0.010948f, 0.002730f, -0.000217f, 0.001186f, -0.004652f, 0.004529f, -0.008522f, 0.009251f, -0.005862f, 0.000858f, 0.015424f, -0.011306f, 0.005148f, -0.003086f, -0.001683f, 0.004070f, -0.012832f, 0.011481f, -0.013490f, 0.011459f, -0.002858f, -0.000721f, -0.008658f, 0.010817f, -0.012968f, 0.000687f, 0.004506f, -0.017142f, 0.016875f, -0.010507f, 0.007126f, -0.008001f, 0.006803f, -0.006208f, -0.007566f, 0.012410f, -0.007968f, -0.001737f, 0.012304f, -0.008173f, -0.000190f, 0.000844f, 0.001881f, -0.009024f, 0.000624f, -0.000977f, -0.003944f, -0.002667f, 0.002038f, -0.002965f, -0.004851f, -0.002556f, 0.005303f, -0.005125f, 0.003949f, -0.001593f, -0.000662f, -0.001781f, -0.003757f, 0.003243f, -0.002573f, -0.003082f, 0.003602f, -0.004083f, 0.002825f, 0.001154f, -0.002445f, 0.000365f, -0.000715f, 0.000809f, -0.007586f, 0.006945f, -0.007802f, 0.001105f, -0.001252f, -0.004255f, 0.000911f, -0.002452f, 0.005116f, -0.013127f, -0.051841f, -0.082856f, 0.087852f, 0.306656f, 0.058453f, 0.092240f, -0.188979f, -0.262127f, -0.109891f, -0.137148f, 0.105813f, 0.246242f, 0.141155f, + 0.095199f, 0.009233f, -0.135347f, -0.120292f, -0.119799f, -0.049360f, 0.068308f, 0.057811f, 0.062272f, 0.055506f, -0.001652f, -0.009300f, -0.014028f, -0.019609f, -0.028253f, -0.004114f, 0.037820f, -0.003609f, -0.021663f, -0.008835f, -0.031386f, -0.018025f, -0.005310f, -0.008118f, 0.060558f, 0.055871f, 0.033383f, 0.035376f, 0.002003f, -0.043864f, -0.044288f, -0.081823f, -0.054167f, 0.007233f, 0.006821f, 0.016405f, 0.048295f, 0.068312f, 0.041306f, 0.034289f, -0.001424f, -0.039059f, -0.053872f, -0.046870f, -0.038982f, 0.005372f, 0.014095f, 0.024886f, 0.017491f, 0.011311f, 0.002639f, -0.014364f, 0.005677f, 0.001150f, 0.006039f, 0.033857f, -0.003070f, 0.014878f, 0.015615f, -0.025551f, -0.047807f, -0.049543f, -0.044380f, 0.011617f, 0.036583f, 0.026247f, 0.040016f, 0.034994f, -0.011711f, 0.008652f, 0.021854f, -0.014222f, -0.013065f, -0.030869f, -0.039461f, -0.015552f, -0.009267f, -0.004298f, 0.016813f, 0.007637f, 0.009107f, 0.026472f, 0.025411f, 0.026057f, 0.015033f, 0.006515f, -0.013089f, -0.016465f, -0.040579f, -0.044735f, -0.031542f, -0.023344f, 0.010095f, 0.028925f, 0.036661f, 0.048961f, + 0.035146f, 0.022249f, 0.000366f, -0.015404f, -0.024000f, -0.050948f, -0.053823f, -0.019165f, 0.009650f, 0.025617f, 0.020586f, 0.017789f, 0.020603f, 0.014734f, -0.000984f, -0.003960f, 0.002189f, 0.000434f, -0.008929f, -0.008136f, -0.027207f, -0.017983f, -0.000754f, 0.009741f, 0.013409f, 0.010520f, -0.004058f, -0.000558f, 0.009882f, 0.007696f, 0.000586f, 0.005329f, 0.004766f, -0.003237f, -0.012827f, -0.011605f, -0.011109f, -0.002620f, -0.002941f, -0.000257f, 0.002349f, 0.011339f, 0.012618f, 0.011340f, 0.005407f, 0.003630f, -0.005378f, -0.009833f, -0.012078f, -0.007130f, -0.004259f, -0.000037f, 0.000630f, 0.004169f, 0.003634f, 0.006786f, 0.004601f, 0.002772f, -0.001166f, -0.000525f, -0.001641f, -0.001041f, -0.004163f, -0.003793f, -0.003245f, 0.002246f, 0.002634f, 0.003261f, -0.000789f, -0.001189f, -0.001918f, 0.001745f, 0.000377f, 0.001718f, 0.000341f, 0.001969f, -0.000881f, -0.000846f, -0.001877f, 0.001023f, -0.000347f, 0.000538f, -0.001989f, -0.000732f, -0.001691f, 0.000663f, 0.000174f, 0.002390f, 0.000425f, 0.001090f, -0.000165f, 0.001708f, -0.000024f, 0.000242f, -0.002578f, -0.001451f, + -0.002303f, 0.000230f, -0.000289f, 0.001737f, 0.000163f, 0.001579f, 0.000272f, 0.001253f, -0.000966f, 0.000208f, -0.001180f, 0.000521f, -0.000884f, 0.000674f, -0.000671f, 0.000734f, -0.001012f, 0.000391f, -0.000731f, 0.001045f, -0.000414f, 0.000893f, -0.000706f, 0.000778f, -0.000691f, 0.000812f, -0.000660f, 0.000772f, -0.000779f, 0.000684f, -0.000826f, 0.000652f, -0.000831f, 0.000689f, -0.000756f} + }, + { + {0.004110f, 0.011707f, 0.001045f, 0.007816f, -0.001759f, -0.001209f, -0.004200f, 0.008338f, 0.005351f, -0.004995f, -0.006466f, 0.004170f, -0.001616f, -0.010067f, -0.011549f, 0.002689f, 0.000619f, -0.003974f, -0.003911f, -0.007864f, 0.005024f, -0.009240f, 0.002389f, -0.000966f, 0.002120f, 0.000694f, 0.002007f, -0.004186f, -0.000561f, 0.001567f, 0.002678f, -0.001004f, 0.003269f, 0.002294f, -0.004033f, 0.003008f, -0.002425f, -0.007888f, 0.011153f, -0.002197f, 0.000546f, 0.002585f, -0.001354f, 0.006067f, 0.007876f, -0.001744f, 0.002981f, 0.005827f, 0.000535f, -0.006316f, -0.004746f, 0.001505f, 0.003767f, -0.001961f, 0.002078f, 0.007165f, -0.006324f, -0.005800f, 0.006048f, 0.001080f, -0.002342f, -0.003941f, -0.000128f, 0.001307f, 0.004599f, -0.007360f, 0.003628f, 0.001792f, -0.005650f, -0.006221f, 0.005294f, -0.003415f, -0.007500f, -0.003288f, -0.000668f, 0.011321f, 0.013191f, -0.001200f, 0.002223f, -0.001702f, 0.002062f, -0.002233f, 0.003534f, 0.002060f, -0.002130f, -0.000793f, -0.002264f, 0.001062f, -0.003032f, 0.002836f, 0.002627f, 0.000526f, -0.003557f, 0.000366f, -0.000129f, 0.001507f, + -0.000889f, 0.002373f, -0.001221f, 0.000373f, 0.000199f, 0.001450f, -0.000294f, 0.000464f, 0.000485f, 0.001500f, -0.000032f, -0.014460f, -0.006252f, -0.009976f, 0.006536f, -0.004839f, -0.006779f, -0.004590f, -0.006079f, -0.001208f, 0.002238f, 0.010939f, 0.001885f, -0.005846f, 0.009230f, 0.000359f, 0.009515f, -0.009150f, 0.014738f, 0.006840f, 0.015988f, -0.002872f, -0.005450f, -0.001102f, -0.008807f, -0.000751f, -0.000634f, -0.003191f, 0.002984f, 0.000293f, -0.006995f, -0.001698f, -0.000032f, 0.002161f, 0.006932f, 0.001598f, -0.010456f, -0.008707f, -0.003309f, 0.005866f, 0.000383f, 0.000284f, -0.005304f, 0.008696f, -0.000245f, 0.000632f, -0.003760f, 0.001104f, -0.002275f, 0.004561f, -0.001488f, 0.014499f, 0.000115f, -0.001916f, 0.005489f, -0.003671f, -0.006535f, -0.002709f, 0.004906f, 0.008746f, 0.001444f, 0.005353f, 0.001311f, 0.000896f, -0.004616f, -0.004510f, -0.007389f, -0.000340f, -0.007660f, 0.001890f, 0.006223f, 0.006640f, 0.004666f, -0.002381f, -0.003400f, 0.005959f, -0.004248f, -0.001783f, 0.003721f, -0.003424f, -0.000608f, -0.001788f, 0.003852f, 0.006853f, 0.003536f, 0.001999f, + -0.001745f, -0.000787f, 0.001232f, -0.000701f, 0.004593f, 0.000765f, -0.002251f, -0.001347f, -0.001036f, -0.000327f, 0.000640f, 0.000555f, 0.000070f, -0.000731f, 0.002129f, 0.001337f, 0.000102f, 0.000808f, -0.001665f, -0.001077f, -0.001329f, -0.001569f, -0.000552f, -0.001757f, -0.001706f, -0.000389f, 0.002186f, 0.010098f, 0.010953f, 0.005763f, 0.000034f, 0.008908f, -0.004790f, -0.007599f, 0.007425f, 0.007677f, 0.009787f, 0.014349f, 0.001420f, -0.009154f, 0.005379f, -0.008729f, -0.000505f, 0.002914f, 0.002181f, 0.015987f, 0.001359f, -0.012877f, -0.000492f, 0.002297f, 0.005518f, -0.000930f, -0.004259f, -0.014174f, -0.002667f, 0.012032f, 0.004282f, 0.007915f, 0.009393f, 0.007706f, 0.002276f, -0.001336f, 0.008366f, -0.010523f, -0.000190f, -0.007152f, 0.019345f, -0.001033f, 0.000672f, 0.008561f, -0.006990f, -0.001110f, 0.003140f, -0.001066f, 0.011595f, -0.001757f, 0.003598f, 0.010979f, -0.001996f, 0.003453f, 0.001048f, -0.000516f, 0.000029f, -0.001426f, -0.003032f, 0.004757f, 0.006502f, -0.001522f, 0.006473f, 0.002329f, 0.012674f, 0.014347f, -0.000625f, 0.003852f, 0.002508f, -0.007213f, + 0.007239f, -0.001748f, -0.005895f, 0.002551f, 0.007133f, 0.002002f, -0.001687f, 0.012723f, -0.001666f, 0.003476f, 0.003949f, 0.001910f, -0.006309f, -0.000343f, -0.001177f, 0.001056f, -0.003265f, -0.000670f, 0.000525f, 0.001383f, 0.001500f, 0.002372f, -0.000683f, 0.001179f, -0.003023f, -0.002110f, -0.003782f, 0.003026f, 0.001130f, -0.000544f, 0.001330f, -0.000499f, -0.003078f, 0.002067f, 0.000452f, 0.001510f, -0.000843f, -0.001082f, 0.000707f, 0.003820f, -0.003773f, 0.002192f, 0.016052f, 0.015554f, -0.006072f, -0.009046f, -0.007742f, -0.005466f, 0.004107f, -0.017196f, -0.001571f, 0.002273f, -0.008089f, -0.015247f, 0.014807f, -0.003280f, -0.003599f, 0.002252f, 0.006884f, 0.005934f, -0.007398f, -0.003092f, -0.000194f, -0.000927f, 0.003650f, 0.005068f, -0.002735f, 0.006258f, -0.004652f, 0.009653f, -0.001048f, 0.000285f, -0.004874f, 0.005046f, 0.002029f, -0.001599f, -0.004854f, 0.002253f, -0.002701f, -0.004473f, -0.003532f, 0.000760f, 0.003347f, -0.009347f, 0.000925f, -0.017539f, -0.009943f, 0.006158f, -0.002492f, 0.001972f, 0.004026f, 0.011365f, -0.003562f, -0.005891f, -0.000268f, 0.000255f, + 0.004962f, 0.004535f, -0.005239f, -0.002471f, 0.012809f, 0.000376f, 0.002068f, 0.000971f, 0.005774f, -0.010679f, 0.000491f, 0.005247f, 0.009983f, 0.001957f, 0.004366f, 0.014869f, -0.003554f, -0.001522f, -0.007979f, -0.000005f, 0.002595f, 0.005132f, 0.000113f, -0.003344f, 0.004703f, -0.000508f, 0.008442f, -0.000034f, -0.000211f, 0.000907f, -0.010406f, -0.005539f, -0.006114f, 0.005749f, -0.000913f, -0.001811f, -0.000008f, 0.000659f, -0.000331f, 0.002964f, -0.000891f, -0.001868f, -0.002233f, -0.001254f, -0.003198f, -0.002240f, 0.002515f, 0.000035f, -0.000839f, -0.001773f, 0.000812f, 0.000530f, 0.000259f, -0.001574f, 0.002751f, 0.001043f, 0.001742f, -0.000520f, -0.000141f, -0.002016f, -0.002055f, 0.001255f, -0.000980f, 0.001738f, 0.002449f, -0.000095f, -0.010275f, -0.015693f, 0.006649f, -0.005020f, 0.000173f, -0.008003f, 0.006204f, -0.018136f, -0.015142f, -0.017093f, -0.005932f, -0.003495f, -0.012164f, 0.006315f, 0.016374f, -0.011974f, 0.002430f, 0.019535f, -0.004596f, -0.005111f, -0.009024f, 0.001748f, -0.000165f, 0.008757f, 0.002693f, 0.006346f, 0.004212f, -0.006124f, -0.012416f, -0.005676f, + 0.007236f, -0.003991f, -0.007637f, 0.002083f, 0.002997f, 0.002603f, 0.001451f, 0.017040f, -0.008069f, 0.009362f, -0.004503f, 0.004793f, -0.005018f, 0.014211f, -0.010551f, 0.005912f, -0.000971f, -0.008147f, 0.007657f, -0.002905f, -0.002870f, 0.008552f, 0.004338f, -0.000530f, -0.003805f, 0.007792f, 0.003636f, -0.007630f, -0.009483f, 0.006607f, 0.010253f, 0.006027f, 0.000125f, -0.004321f, 0.000411f, 0.006804f, -0.002967f, 0.008184f, -0.001998f, -0.016081f, 0.000395f, -0.006954f, 0.023054f, 0.008285f, -0.013307f, -0.007234f, -0.002723f, -0.005777f, 0.005856f, 0.005990f, 0.004271f, -0.002646f, 0.004959f, 0.004287f, 0.001315f, -0.000779f, -0.006932f, 0.001544f, 0.002217f, -0.001748f, 0.001442f, 0.002568f, -0.001037f, -0.000089f, 0.001371f, -0.000233f, -0.002150f, -0.001490f, 0.000034f, 0.001981f, -0.001974f, 0.001887f, 0.001855f, -0.002346f, -0.003385f, -0.003897f, 0.000001f, 0.002646f, -0.001248f, 0.002375f, -0.001896f, 0.000042f, 0.001513f, -0.000954f, -0.003807f, 0.000797f, 0.005983f, -0.013389f, -0.016537f, 0.014267f, -0.003044f, -0.013319f, 0.001125f, -0.003352f, 0.013766f, 0.006952f, + -0.003487f, 0.002670f, -0.000664f, -0.001940f, -0.002429f, 0.016105f, 0.003166f, 0.000981f, -0.010875f, -0.004864f, -0.002511f, 0.005732f, 0.007070f, 0.021650f, 0.000588f, 0.000841f, -0.000609f, 0.001600f, -0.009410f, 0.000564f, 0.003964f, -0.011627f, -0.008254f, -0.007480f, -0.000910f, 0.015870f, -0.012739f, 0.002322f, 0.007238f, 0.003256f, -0.005926f, 0.006694f, -0.015912f, 0.013203f, -0.002769f, 0.000147f, 0.007148f, -0.007930f, -0.009406f, -0.014526f, 0.003168f, -0.004654f, 0.013957f, 0.004979f, 0.000400f, 0.002797f, 0.004286f, 0.011053f, -0.004765f, -0.002251f, 0.011444f, -0.002191f, -0.006440f, -0.000089f, 0.011452f, 0.011700f, 0.010588f, 0.005854f, -0.006961f, 0.006916f, 0.009583f, -0.011104f, 0.014460f, -0.008655f, -0.008185f, 0.013215f, 0.001419f, 0.019000f, -0.000197f, -0.010423f, 0.004695f, -0.004557f, 0.012527f, 0.006115f, 0.003479f, 0.001000f, 0.004319f, -0.002045f, 0.007886f, 0.002893f, 0.003154f, 0.002529f, 0.004631f, -0.000208f, -0.000357f, 0.003755f, -0.000107f, 0.002802f, -0.001383f, 0.004515f, 0.008923f, -0.005016f, -0.002354f, 0.001732f, 0.001138f, 0.000736f, + 0.002285f, -0.000283f, 0.000735f, 0.001996f, 0.004382f, 0.000486f, 0.008214f, 0.002121f, 0.000972f, -0.003513f, 0.000947f, 0.002881f, -0.003669f, 0.000974f, 0.001622f, -0.000049f, 0.001061f, -0.000074f, -0.029420f, -0.019553f, 0.005330f, 0.009379f, 0.020284f, -0.012409f, 0.010929f, 0.001911f, 0.011503f, -0.000691f, -0.005233f, -0.007045f, 0.007135f, 0.020802f, 0.001855f, -0.001945f, -0.019868f, -0.016805f, 0.000189f, -0.012384f, -0.007139f, 0.000599f, 0.002592f, -0.012692f, -0.003689f, 0.002936f, 0.007458f, 0.003824f, -0.008065f, -0.000141f, 0.009455f, 0.007528f, 0.001654f, -0.007831f, 0.001490f, -0.004837f, 0.002336f, 0.002516f, 0.004365f, -0.006059f, 0.007512f, 0.018097f, -0.001797f, -0.001476f, 0.003588f, -0.010273f, 0.004845f, 0.014550f, -0.014410f, -0.017174f, -0.008776f, 0.001293f, -0.022039f, 0.000431f, 0.000675f, 0.002965f, 0.000256f, -0.000441f, -0.010446f, -0.005768f, -0.006773f, -0.001046f, 0.015060f, 0.022065f, 0.000662f, 0.001344f, 0.010854f, -0.004652f, -0.001826f, 0.004905f, 0.024984f, 0.003037f, 0.008996f, 0.017408f, 0.003225f, -0.011492f, 0.004739f, 0.005120f, + -0.005233f, 0.005272f, 0.004524f, -0.001291f, -0.005417f, 0.002438f, 0.001605f, -0.001298f, -0.009270f, 0.003969f, 0.008516f, 0.003064f, 0.006204f, 0.003341f, 0.007484f, -0.001742f, -0.002815f, 0.006769f, 0.005717f, -0.001899f, -0.000393f, -0.002184f, 0.004916f, 0.005223f, -0.004329f, 0.005186f, 0.001411f, 0.000530f, 0.001314f, 0.002757f, 0.003964f, 0.000391f, 0.003458f, -0.002490f, -0.001292f, -0.000149f, -0.000659f, 0.001293f, -0.002361f, 0.000218f, -0.000740f, 0.000887f, -0.003176f, -0.002895f, 0.015067f, 0.009654f, -0.014149f, -0.000483f, 0.030012f, 0.026748f, 0.005525f, 0.016185f, 0.019764f, 0.005145f, -0.000380f, 0.013174f, -0.005988f, 0.000281f, -0.011924f, 0.009813f, -0.000900f, 0.000619f, 0.004269f, 0.005290f, 0.016294f, -0.013677f, -0.012699f, 0.012666f, 0.002468f, 0.005859f, -0.009935f, 0.001913f, -0.003541f, 0.006582f, -0.000007f, 0.009183f, 0.008785f, -0.008913f, 0.007423f, 0.006420f, -0.010512f, 0.026839f, 0.004564f, 0.005329f, -0.020826f, -0.006520f, -0.001773f, 0.017439f, 0.016030f, -0.001523f, -0.017893f, 0.011736f, -0.015573f, -0.004688f, 0.013438f, -0.000279f, + -0.011077f, 0.013342f, 0.016518f, -0.004122f, 0.005496f, -0.006579f, -0.023420f, 0.000248f, 0.014835f, -0.006761f, -0.008085f, 0.009944f, -0.011293f, -0.016869f, 0.004108f, 0.011625f, 0.020868f, 0.011111f, -0.015834f, 0.006696f, -0.018582f, -0.021655f, 0.019973f, 0.009559f, 0.007236f, -0.013412f, -0.014716f, -0.002080f, 0.015026f, 0.005167f, 0.021516f, 0.009714f, 0.005342f, -0.022872f, 0.003597f, -0.006284f, 0.000754f, -0.005245f, 0.004663f, 0.001570f, 0.005669f, 0.009840f, 0.004946f, 0.000994f, 0.004158f, -0.003696f, -0.002022f, -0.003767f, -0.000188f, -0.003516f, -0.001223f, 0.001578f, 0.007112f, 0.001409f, -0.003162f, -0.001154f, 0.002175f, 0.000471f, -0.000793f, -0.007245f, 0.000258f, -0.003629f, 0.001252f, -0.005103f, -0.005945f, 0.004015f, 0.004412f, 0.007395f, -0.007264f, 0.000260f, 0.003586f, 0.031153f, 0.020158f, -0.013659f, -0.003609f, -0.000626f, 0.005567f, 0.004296f, -0.001881f, -0.012336f, 0.003052f, -0.008496f, 0.013092f, 0.000286f, 0.005097f, -0.004375f, -0.001852f, -0.012879f, -0.006709f, 0.026745f, 0.008961f, -0.016516f, 0.007831f, -0.016140f, -0.011235f, -0.025174f, + 0.010956f, 0.000281f, 0.000455f, 0.005792f, -0.000632f, -0.011497f, 0.018938f, 0.010655f, -0.004112f, -0.019173f, 0.019101f, -0.013212f, 0.005076f, -0.000646f, 0.006287f, 0.003605f, 0.012150f, 0.013805f, -0.003219f, 0.007571f, 0.022166f, 0.002676f, -0.006907f, -0.006499f, -0.003883f, 0.003269f, 0.014804f, -0.004231f, 0.006035f, 0.000989f, -0.013504f, 0.000342f, -0.003304f, 0.006422f, -0.020328f, -0.000524f, -0.033907f, -0.020756f, -0.018909f, -0.004979f, -0.018687f, 0.012389f, -0.004656f, -0.015678f, -0.004147f, -0.001936f, -0.012525f, -0.005647f, -0.000429f, 0.001057f, -0.007509f, -0.016476f, -0.016283f, 0.000669f, -0.003527f, 0.003768f, 0.009150f, -0.001673f, 0.004582f, 0.002058f, -0.000065f, -0.000492f, -0.008868f, -0.000608f, -0.000175f, -0.007358f, -0.000579f, 0.006482f, 0.012919f, -0.002472f, -0.006169f, 0.004596f, -0.007989f, 0.006516f, -0.006669f, -0.002740f, 0.001293f, -0.005114f, -0.005993f, -0.000297f, -0.003740f, 0.000671f, -0.001392f, -0.006302f, 0.002976f, -0.000516f, 0.007537f, 0.004798f, -0.005309f, 0.004269f, -0.002964f, 0.003946f, -0.002432f, 0.002586f, 0.002654f, 0.001761f, + 0.000160f, 0.002719f, -0.003509f, -0.002188f, -0.003900f, -0.008185f, 0.001049f, 0.002548f, -0.000813f, 0.001396f, -0.006174f, -0.021410f, -0.026649f, -0.012638f, -0.017698f, 0.046023f, -0.022218f, 0.010447f, -0.020974f, -0.006028f, 0.002341f, -0.003388f, -0.031310f, -0.000632f, -0.014814f, 0.001144f, 0.037137f, -0.011815f, 0.015655f, 0.020404f, 0.007487f, 0.008316f, 0.022387f, 0.006660f, -0.008540f, 0.006364f, 0.008857f, 0.009432f, 0.004117f, -0.004589f, 0.026039f, 0.001028f, -0.001952f, -0.004301f, 0.007157f, -0.002172f, -0.008886f, 0.008810f, -0.003205f, 0.006332f, -0.024963f, 0.001091f, -0.004716f, 0.022752f, -0.008825f, 0.007372f, 0.034182f, -0.002920f, 0.000851f, -0.008264f, -0.013933f, -0.000761f, -0.002169f, -0.014351f, 0.018227f, -0.003849f, 0.013264f, 0.001441f, 0.012536f, -0.007145f, -0.001194f, 0.027262f, 0.013460f, -0.021090f, -0.010919f, 0.005807f, 0.006690f, 0.003282f, 0.005949f, -0.006131f, 0.007850f, 0.010025f, 0.022757f, -0.028997f, 0.001897f, -0.012379f, 0.006072f, -0.000492f, 0.003474f, 0.010723f, 0.015684f, -0.010339f, 0.011127f, -0.007478f, -0.004942f, -0.004165f, + -0.003715f, 0.008780f, -0.019600f, -0.003859f, -0.008961f, 0.011355f, 0.009325f, 0.003930f, 0.004883f, -0.006602f, 0.007735f, 0.003490f, 0.005616f, -0.000759f, 0.004490f, -0.005856f, -0.003126f, -0.007348f, -0.000448f, -0.001193f, -0.006438f, -0.000106f, -0.000509f, -0.001774f, 0.000088f, 0.007827f, 0.004986f, -0.004329f, -0.006895f, 0.003681f, 0.002863f, 0.008978f, -0.006754f, 0.000533f, -0.002319f, 0.004025f, 0.004767f, -0.002364f, -0.003613f, -0.007296f, -0.015117f, -0.013694f, -0.014622f, 0.015849f, -0.030758f, -0.009156f, -0.019243f, 0.009548f, 0.032044f, -0.017466f, 0.001019f, 0.000847f, -0.006184f, 0.012266f, -0.010213f, 0.004894f, -0.003117f, -0.013225f, 0.028593f, 0.001359f, -0.009222f, 0.000346f, -0.004093f, -0.012682f, 0.010031f, -0.009733f, 0.009421f, -0.018123f, -0.008312f, 0.012106f, 0.009023f, -0.030237f, -0.005334f, -0.025761f, 0.007740f, -0.004381f, -0.024620f, 0.030037f, -0.008338f, -0.000674f, -0.022770f, -0.025153f, 0.001547f, -0.022689f, -0.002863f, -0.019617f, -0.016579f, 0.019625f, 0.002271f, -0.025493f, 0.008428f, -0.022830f, 0.020357f, 0.007222f, -0.009729f, 0.000671f, + 0.006609f, 0.021181f, -0.016377f, -0.023414f, 0.023672f, -0.016578f, -0.009297f, 0.012243f, 0.017892f, -0.033143f, -0.016156f, 0.018660f, 0.014052f, 0.007161f, -0.001644f, 0.002200f, -0.023639f, 0.008021f, 0.007994f, 0.012957f, -0.004097f, -0.025236f, -0.018121f, 0.008747f, -0.021581f, -0.019104f, 0.008066f, -0.001398f, 0.000369f, 0.007763f, 0.018362f, -0.000123f, -0.000701f, 0.016884f, 0.001648f, -0.002929f, 0.002981f, -0.002482f, -0.003406f, 0.003509f, -0.004423f, -0.003327f, -0.008545f, -0.008399f, -0.005819f, 0.001342f, -0.004837f, -0.000102f, 0.003527f, 0.002597f, -0.000435f, -0.000283f, 0.003766f, -0.004495f, -0.006785f, 0.001869f, -0.000191f, 0.006333f, -0.006255f, -0.001985f, -0.007098f, 0.008080f, 0.008756f, 0.001690f, -0.000417f, -0.005589f, -0.002173f, -0.007782f, 0.000660f, 0.001023f, -0.004245f, 0.001116f, 0.001726f, 0.001648f, -0.001885f, 0.015612f, -0.024148f, -0.039623f, -0.031829f, 0.014288f, -0.038073f, -0.001942f, 0.028992f, -0.002656f, 0.002151f, 0.020655f, -0.013701f, -0.011831f, 0.046032f, -0.018296f, 0.010824f, 0.017395f, -0.003176f, -0.041758f, -0.003398f, 0.004302f, + -0.010409f, -0.005867f, -0.009630f, 0.038784f, 0.000438f, 0.000349f, -0.001850f, -0.028095f, 0.005189f, -0.016215f, -0.008041f, 0.001653f, 0.004744f, 0.008209f, 0.022635f, 0.004925f, -0.005761f, 0.044331f, 0.004732f, -0.011074f, -0.040564f, -0.006016f, 0.029850f, -0.006554f, -0.018587f, -0.025084f, -0.021967f, -0.018888f, -0.011781f, 0.031511f, 0.012334f, 0.001732f, 0.017608f, 0.026314f, 0.014767f, -0.005834f, -0.004587f, 0.027203f, -0.005344f, -0.008450f, 0.007968f, 0.020784f, 0.003013f, -0.021523f, 0.004969f, -0.002244f, -0.032014f, -0.002501f, 0.025541f, -0.012711f, -0.014702f, -0.003665f, 0.034323f, -0.027369f, -0.005441f, -0.015305f, 0.015693f, 0.009013f, 0.007286f, 0.010892f, -0.004469f, -0.005956f, 0.011638f, 0.009195f, 0.006437f, -0.001946f, 0.001456f, 0.007222f, -0.020126f, -0.003796f, 0.002661f, -0.010503f, 0.000288f, 0.010946f, -0.001097f, 0.001964f, -0.004315f, -0.001325f, 0.006053f, 0.007712f, 0.011694f, 0.006492f, -0.001944f, 0.004085f, -0.006667f, -0.008584f, 0.002451f, -0.001736f, -0.006917f, 0.007640f, 0.004108f, 0.005763f, 0.001246f, 0.002757f, 0.005998f, 0.003250f, + -0.001728f, -0.004353f, -0.001126f, 0.002362f, 0.000013f, 0.002395f, 0.000501f, 0.002986f, 0.001848f, 0.005156f, 0.000660f, -0.005090f, 0.011082f, 0.009009f, -0.008557f, -0.002963f, -0.004113f, -0.002929f, 0.004247f, -0.005202f, 0.003055f, 0.032331f, 0.003253f, -0.028892f, -0.001072f, 0.008650f, -0.001052f, -0.013185f, 0.012523f, -0.009764f, 0.025696f, -0.019809f, 0.017649f, 0.038595f, -0.010477f, -0.010324f, -0.009134f, -0.008075f, 0.034449f, -0.025599f, -0.028126f, -0.021478f, 0.007781f, -0.011232f, -0.018128f, -0.008374f, 0.012337f, -0.017392f, 0.009533f, 0.002209f, 0.013470f, 0.020020f, 0.002408f, -0.002639f, -0.003925f, 0.019723f, -0.005175f, 0.006915f, -0.024347f, -0.000303f, -0.008725f, 0.019214f, -0.025878f, 0.021083f, -0.009001f, -0.013395f, 0.021230f, 0.036842f, -0.020868f, 0.010403f, -0.004690f, 0.007377f, -0.055585f, -0.044111f, -0.026796f, 0.003718f, -0.017045f, 0.007176f, 0.001690f, -0.020752f, -0.016403f, 0.001644f, 0.044095f, 0.010273f, -0.027689f, -0.041360f, -0.021875f, -0.015376f, 0.026962f, -0.018956f, -0.026981f, 0.006251f, 0.005746f, -0.025002f, -0.001709f, -0.000592f, + -0.012464f, -0.003015f, -0.000808f, -0.001226f, 0.011991f, 0.002800f, -0.014430f, -0.012862f, -0.007123f, -0.018460f, -0.010107f, 0.002830f, 0.020392f, 0.003251f, 0.003685f, -0.006161f, -0.017043f, -0.002822f, 0.013647f, -0.000870f, -0.008024f, 0.012489f, -0.019419f, -0.009678f, 0.002716f, 0.002825f, -0.000498f, 0.001906f, 0.001175f, -0.006740f, -0.013659f, -0.005089f, 0.010096f, -0.006229f, -0.004985f, -0.005645f, -0.012218f, -0.013572f, 0.004788f, -0.005051f, -0.003104f, -0.012817f, 0.002902f, 0.007946f, 0.009757f, -0.000719f, -0.006186f, -0.007291f, 0.006972f, 0.002182f, 0.006285f, 0.055877f, 0.036124f, -0.009273f, 0.003438f, 0.036255f, -0.014421f, 0.001513f, 0.015238f, 0.039229f, 0.022640f, -0.006506f, -0.008880f, -0.013185f, 0.003312f, -0.007136f, 0.000420f, 0.001267f, 0.040839f, 0.068127f, -0.004145f, 0.047083f, 0.029396f, 0.006335f, 0.007182f, -0.033080f, -0.033244f, -0.003484f, 0.008621f, -0.002106f, 0.007976f, -0.012171f, -0.024914f, -0.041525f, -0.003728f, -0.026618f, -0.022881f, -0.014787f, -0.023676f, -0.016636f, -0.001044f, 0.039109f, -0.001346f, -0.029182f, -0.002587f, 0.008674f, + 0.028720f, -0.008762f, -0.007412f, -0.017308f, 0.012989f, -0.052553f, -0.047569f, -0.022558f, -0.023768f, -0.025095f, -0.015478f, 0.017137f, -0.021431f, -0.029319f, -0.024971f, -0.043996f, 0.022653f, 0.012452f, -0.039416f, 0.020479f, 0.039721f, 0.078254f, 0.042967f, -0.000197f, 0.014200f, -0.044573f, -0.018385f, 0.024446f, 0.020390f, -0.011203f, -0.030371f, 0.004243f, 0.006358f, 0.027888f, -0.003516f, -0.028040f, -0.004955f, 0.045478f, 0.028868f, 0.033010f, 0.026032f, 0.045873f, 0.042934f, 0.013177f, 0.011695f, -0.009738f, -0.017996f, -0.004722f, -0.001529f, -0.015123f, -0.000003f, -0.017524f, -0.013239f, 0.021000f, 0.009257f, -0.005320f, -0.017897f, -0.006540f, -0.002071f, 0.000028f, -0.019918f, 0.020260f, 0.000348f, -0.016416f, 0.010121f, -0.009996f, -0.008561f, -0.002238f, 0.006355f, 0.027840f, 0.013587f, 0.033248f, 0.000269f, -0.006157f, 0.003893f, 0.012895f, 0.008516f, -0.003900f, 0.017519f, 0.001180f, -0.005456f, 0.002918f, 0.014538f, -0.006736f, -0.005914f, 0.005708f, -0.001049f, 0.005149f, -0.057249f, -0.005695f, 0.092648f, -0.006987f, 0.003573f, 0.022860f, -0.033524f, 0.018725f, + 0.065764f, 0.060296f, -0.060883f, -0.058766f, 0.000201f, -0.063731f, -0.023839f, -0.000289f, 0.007554f, 0.022987f, 0.035114f, 0.030602f, 0.054644f, 0.012673f, 0.021656f, 0.021506f, -0.008975f, -0.004054f, 0.006154f, 0.007017f, 0.016305f, -0.029350f, 0.065647f, 0.027912f, 0.030776f, -0.005843f, 0.066670f, 0.008100f, 0.040287f, 0.016461f, 0.012775f, -0.015774f, -0.009909f, 0.033751f, 0.013277f, 0.015631f, -0.035449f, -0.019208f, -0.029556f, -0.017511f, -0.021425f, -0.000202f, -0.042957f, -0.047039f, -0.002479f, -0.018170f, -0.088287f, -0.065997f, -0.059414f, 0.016949f, 0.064825f, 0.083527f, -0.045899f, 0.057573f, 0.089903f, 0.015240f, 0.007857f, -0.005753f, 0.061964f, 0.004670f, 0.056091f, 0.023971f, 0.026426f, -0.037210f, -0.122760f, -0.097475f, -0.021705f, -0.003325f, 0.002922f, 0.004326f, 0.045800f, 0.043000f, 0.037748f, -0.023311f, 0.003312f, -0.012165f, -0.063134f, 0.006421f, 0.005365f, 0.031909f, 0.005257f, 0.046925f, 0.042703f, 0.010519f, 0.037189f, -0.015590f, 0.025289f, -0.022136f, -0.024611f, -0.009182f, 0.010219f, 0.040790f, -0.008859f, -0.011466f, 0.006330f, -0.020157f, + -0.009560f, 0.020659f, -0.005549f, 0.014282f, -0.025376f, 0.035011f, 0.010914f, 0.000373f, -0.002097f, 0.026933f, -0.006306f, 0.001895f, 0.004708f, -0.000526f, 0.018608f, -0.013211f, -0.006443f, -0.000179f, 0.017898f, -0.026180f, 0.003808f, 0.009345f, -0.012469f, 0.001962f, 0.005082f, 0.003254f, -0.005916f, 0.044088f, -0.009059f, -0.081851f, -0.006308f, 0.128275f, 0.024421f, -0.024887f, 0.034107f, -0.011383f, 0.022489f, -0.011040f, -0.013169f, -0.043198f, -0.015163f, -0.005325f, -0.006291f, -0.021041f, 0.031340f, -0.028262f, -0.028806f, -0.002718f, 0.005553f, 0.026357f, 0.012975f, 0.006766f, 0.012354f, -0.011698f, 0.001061f, 0.039701f, -0.019796f, -0.048757f, -0.008808f, 0.003572f, -0.015421f, 0.032944f, -0.016738f, -0.011960f, 0.029130f, 0.007319f, 0.022200f, -0.050339f, -0.055152f, 0.017992f, -0.009975f, -0.019660f, -0.023146f, -0.030187f, -0.060812f, -0.000434f, -0.004574f, 0.019985f, -0.038636f, -0.082899f, 0.062490f, 0.016386f, 0.058790f, 0.005880f, -0.017863f, -0.018015f, 0.015925f, -0.031556f, 0.048892f, 0.009003f, 0.058516f, 0.039695f, 0.086476f, -0.009024f, -0.081406f, -0.064489f, + -0.035519f, 0.046763f, 0.048385f, -0.036705f, 0.038591f, 0.074335f, -0.043307f, -0.007366f, 0.081346f, 0.011958f, 0.062673f, -0.009754f, -0.030802f, -0.084347f, -0.031767f, 0.008874f, 0.054260f, 0.046039f, -0.026738f, 0.022829f, 0.022807f, 0.043625f, 0.016040f, -0.044688f, -0.051377f, -0.021180f, 0.036830f, 0.075941f, -0.001162f, -0.007549f, 0.040608f, 0.020347f, 0.004392f, -0.007281f, -0.016004f, -0.021389f, -0.015946f, 0.012365f, 0.008769f, 0.023550f, -0.009416f, -0.003540f, 0.003062f, 0.013940f, 0.019662f, -0.024998f, 0.001173f, 0.026687f, -0.002373f, -0.008765f, -0.029705f, 0.021327f, 0.000684f, -0.013879f, -0.008621f, 0.029816f, -0.000722f, -0.020453f, -0.009800f, 0.015763f, 0.001199f, -0.068055f, 0.070570f, 0.095722f, 0.016705f, 0.004356f, 0.021306f, -0.014591f, 0.041817f, 0.023392f, 0.043709f, -0.008810f, -0.046033f, 0.102470f, 0.000665f, -0.038446f, 0.004822f, 0.069323f, 0.031807f, 0.013655f, -0.043780f, 0.004840f, -0.023382f, -0.017067f, 0.006990f, -0.032548f, 0.002890f, 0.008891f, 0.039509f, -0.055785f, -0.009366f, -0.006580f, 0.033408f, -0.012516f, -0.020484f, -0.019516f, + -0.000090f, 0.021343f, -0.043289f, 0.003323f, 0.011644f, -0.088773f, 0.012457f, -0.023938f, -0.062479f, 0.041386f, -0.046117f, -0.081083f, 0.107521f, -0.000657f, 0.006440f, -0.008283f, -0.029611f, 0.064937f, -0.045567f, -0.004116f, 0.009889f, -0.029367f, -0.002166f, 0.082028f, 0.042570f, -0.071980f, -0.077839f, 0.077248f, -0.036499f, 0.045098f, 0.074237f, -0.066163f, -0.113956f, -0.078871f, 0.132190f, -0.007617f, -0.103135f, 0.094777f, -0.068663f, -0.130968f, -0.001779f, 0.113346f, -0.004597f, -0.135917f, -0.001650f, -0.045603f, 0.001548f, 0.168078f, -0.025309f, -0.123364f, 0.018251f, 0.066001f, 0.001720f, 0.077150f, 0.004809f, 0.001756f, -0.024000f, 0.003365f, 0.017945f, 0.062338f, -0.012627f, -0.016513f, 0.061847f, -0.007977f, 0.015039f, 0.043317f, -0.006992f, -0.062455f, 0.041317f, 0.029922f, 0.048335f, -0.014609f, -0.000703f, 0.017308f, -0.013375f, -0.045889f, -0.019905f, 0.019320f, 0.001895f, -0.008807f, 0.061290f, -0.001544f, -0.067194f, 0.016098f, 0.055792f, 0.032357f, -0.023041f, 0.003336f, -0.026465f, -0.014739f, 0.067611f, 0.056571f, -0.014104f, -0.064177f, -0.020099f, 0.026792f, + 0.022162f, 0.017890f, -0.011564f, -0.043026f, -0.001613f, -0.046326f, 0.070578f, -0.014615f, 0.021646f, 0.044321f, 0.032448f, 0.033462f, 0.082978f, 0.035225f, -0.019954f, 0.012537f, 0.020697f, 0.026445f, -0.029611f, 0.078967f, 0.075437f, 0.009929f, 0.026333f, -0.018892f, 0.000281f, -0.081662f, 0.037627f, -0.043355f, 0.029252f, -0.003809f, -0.029481f, 0.043489f, -0.017152f, -0.033310f, 0.017972f, -0.046833f, 0.031141f, 0.000849f, -0.008440f, 0.012347f, 0.019608f, 0.028330f, 0.029861f, 0.027602f, 0.084550f, -0.008697f, 0.009574f, 0.026181f, 0.057109f, -0.005985f, 0.015491f, -0.000186f, 0.044771f, 0.052244f, -0.016719f, 0.012296f, -0.001899f, -0.008944f, -0.095710f, 0.007359f, 0.041454f, -0.023321f, -0.023060f, 0.020990f, -0.039589f, -0.059926f, 0.005807f, 0.033545f, 0.071541f, -0.091542f, 0.035438f, -0.004939f, -0.002039f, 0.000156f, 0.036218f, 0.076256f, 0.001897f, -0.056055f, 0.019062f, 0.061853f, -0.033075f, -0.049325f, 0.005318f, 0.027024f, -0.025748f, 0.048959f, -0.008981f, 0.037592f, 0.003885f, -0.037871f, 0.046958f, 0.037090f, 0.006951f, 0.029229f, -0.015953f, 0.018196f, + -0.008381f, 0.009552f, 0.015808f, 0.044637f, -0.008857f, -0.054443f, -0.006333f, 0.062766f, 0.005538f, -0.008132f, 0.056588f, 0.011550f, 0.000434f, 0.013332f, 0.039499f, 0.057568f, -0.036306f, 0.014116f, 0.008630f, -0.002848f, 0.029084f, -0.008341f, -0.041241f, 0.013722f, 0.040833f, -0.017219f, 0.011252f, 0.013564f, -0.012203f, 0.015527f, -0.025895f, 0.018976f, 0.017949f, -0.023339f, -0.049456f, 0.021424f, 0.029481f, -0.013307f, -0.017469f, 0.026677f, -0.001138f, -0.016271f, -0.017941f, 0.018972f, 0.011083f, 0.043813f, -0.082728f, -0.064414f, -0.001194f, -0.099408f, -0.034189f, -0.036792f, 0.076497f, -0.002235f, -0.028407f, 0.035206f, -0.018150f, 0.019498f, 0.004904f, -0.037984f, 0.045214f, -0.102503f, -0.009849f, 0.006179f, -0.025756f, 0.018843f, 0.004429f, -0.020049f, -0.003803f, 0.002953f, 0.025651f, 0.001489f, -0.030216f, -0.099493f, -0.072693f, -0.055315f, -0.027664f, 0.061556f, -0.012687f, 0.002240f, -0.099767f, 0.007377f, -0.007153f, -0.013572f, 0.002915f, -0.096349f, 0.051314f, -0.046826f, 0.023476f, -0.019226f, 0.065304f, -0.035894f, -0.063744f, -0.030642f, -0.000813f, 0.047437f, + 0.086413f, 0.090956f, -0.112668f, -0.083291f, -0.057667f, 0.038621f, 0.092045f, 0.111620f, -0.019790f, -0.028193f, -0.098682f, -0.036629f, 0.087256f, 0.053362f, -0.001376f, -0.000125f, -0.002418f, -0.083275f, 0.055277f, -0.016854f, 0.053334f, 0.129804f, -0.145552f, 0.175820f, 0.049368f, -0.095498f, 0.026308f, -0.191295f, -0.187127f, 0.137675f, 0.058450f, 0.013412f, 0.040743f, -0.070921f, -0.034358f, 0.128278f, -0.005277f, 0.086203f, -0.008872f, -0.069661f, -0.023060f, 0.076117f, -0.025796f, -0.001890f, 0.024363f, -0.006346f, -0.044906f, 0.024571f, -0.036543f, 0.016484f, 0.048240f, -0.050832f, 0.047501f, 0.015869f, -0.006863f, 0.017915f, -0.003378f, -0.011619f, 0.007527f, -0.017794f, 0.008571f, -0.036181f, 0.031427f, 0.033017f, 0.006320f, 0.000884f, -0.011543f, 0.016810f, 0.005751f, 0.006577f, 0.015998f, 0.031729f, -0.040152f, -0.013654f, -0.037317f, -0.028348f, 0.002387f, 0.001177f, 0.031087f, -0.041323f, -0.032006f, -0.039836f, -0.025564f, -0.010887f, 0.058285f, -0.083345f, 0.068961f, -0.041497f, 0.042449f, 0.022039f, 0.026832f, 0.015375f, -0.052960f, 0.057757f, -0.008517f, -0.021003f, + -0.018940f, -0.023269f, 0.017876f, -0.012354f, 0.025386f, 0.014766f, -0.003229f, -0.006354f, -0.044337f, 0.025531f, 0.010598f, -0.011690f, 0.009963f, 0.023148f, -0.006610f, 0.013015f, -0.022511f, 0.026383f, -0.009880f, 0.003142f, 0.010892f, 0.011060f, -0.011826f, 0.040824f, -0.001563f, -0.038905f, -0.002529f, 0.017547f, 0.008821f, -0.029826f, 0.014394f, 0.034139f, -0.006448f, -0.016988f, -0.016304f, -0.002534f, 0.009491f, -0.004444f, 0.040430f, -0.027461f, -0.010397f, -0.009932f, -0.020295f, -0.001996f, -0.006187f, 0.014540f, 0.010727f, -0.016983f, -0.002509f, 0.015264f, -0.016329f, -0.008678f, -0.004869f, 0.024716f, -0.015443f, 0.010444f, 0.016804f, -0.039002f, -0.015587f, 0.012133f, -0.040380f, 0.061001f, 0.016402f, 0.019228f, 0.028295f, -0.018202f, -0.000450f, -0.005574f, -0.027801f, 0.005321f, 0.009219f, 0.022104f, -0.004402f, -0.009681f, 0.013678f, -0.014408f, -0.005778f, 0.013149f, 0.000189f, -0.003562f, 0.011375f, 0.003196f, -0.007203f, -0.000591f, -0.007958f, 0.017621f, -0.016880f, 0.026876f, 0.001247f, 0.005718f, -0.011278f, -0.001272f, -0.004079f, -0.008739f, -0.004425f, 0.006208f, + 0.003309f, 0.007566f, -0.000121f, -0.006634f, -0.004249f, -0.021253f, 0.021265f, -0.017108f, 0.009651f, -0.004234f, 0.012431f, -0.007158f, -0.019580f, 0.001097f, 0.010216f, -0.016287f, 0.024173f, -0.019365f, 0.010594f, -0.007505f, 0.095805f, 0.012624f, -0.032639f, -0.025132f, -0.019055f, -0.001725f, -0.003221f, 0.002205f, -0.002750f, -0.003613f, -0.054388f, 0.001272f, -0.010943f, -0.012440f, 0.006743f, -0.021220f, -0.009811f, 0.009958f, -0.014999f, 0.004304f, 0.016688f, -0.022686f, 0.014196f, -0.008354f, -0.012227f, -0.001862f, -0.012230f, 0.005713f, -0.011363f, -0.005913f, -0.013363f, -0.002517f, -0.000347f, -0.000248f, -0.008087f, -0.008187f, 0.002348f, 0.004383f, -0.009641f, 0.012897f, -0.015963f, -0.001349f, -0.006459f, -0.001963f, -0.003120f, -0.012499f, 0.017051f, 0.010603f, -0.017403f, 0.021040f, -0.002282f, 0.004526f, -0.009631f, 0.020188f, -0.020275f, 0.001560f, 0.001583f, 0.005370f, -0.003472f, -0.005167f, 0.014886f, -0.009926f, 0.002091f, 0.000843f, -0.003204f, 0.004852f, -0.006685f, -0.000864f, 0.008252f, -0.004178f, -0.003978f, 0.009557f, -0.003850f, -0.004111f, -0.008979f, 0.004636f, + 0.004185f, -0.019548f, 0.023310f, -0.013199f, 0.005162f, 0.001652f, 0.000177f, -0.007554f, 0.003097f, 0.009682f, -0.007303f, -0.003596f, 0.005021f, -0.007181f, -0.000611f, 0.005938f, -0.002585f, 0.002381f, 0.001135f, -0.005320f, 0.000776f, 0.000715f, 0.004647f, -0.008659f, 0.000554f, -0.000960f, -0.003586f, 0.003645f, -0.004437f, 0.002104f, -0.002937f, -0.007582f, 0.004079f, -0.006573f, -0.003964f, 0.002451f, -0.004304f, 0.001532f, 0.003642f, 0.000428f, -0.005933f, 0.006105f, -0.001362f, -0.003760f, 0.004870f, -0.047147f, -0.076011f, 0.084914f, 0.286737f, 0.028891f, 0.066069f, -0.156113f, -0.238060f, -0.060151f, -0.124212f, 0.096743f, 0.199990f, 0.104986f, 0.066857f, -0.015186f, -0.077182f, -0.076446f, -0.057029f, -0.053474f, 0.019314f, 0.033810f, 0.020001f, 0.036411f, 0.005160f, 0.002676f, 0.014786f, 0.003898f, 0.016745f, 0.012845f, -0.009463f, -0.036745f, -0.026682f, -0.032416f, -0.043113f, -0.023189f, 0.024791f, 0.031343f, 0.058982f, 0.082618f, 0.030347f, 0.011744f, -0.027215f, -0.065940f, -0.063259f, -0.044644f, -0.030499f, 0.006069f, 0.024789f, 0.034923f, 0.037837f, 0.031386f, + 0.021652f, 0.002237f, -0.002177f, -0.021121f, -0.014108f, -0.009457f, -0.010126f, -0.004313f, -0.011486f, -0.003639f, -0.013679f, -0.013914f, 0.005380f, -0.001341f, 0.018465f, 0.029588f, 0.018046f, 0.044125f, 0.039839f, -0.019251f, -0.038645f, -0.039277f, -0.057797f, -0.016601f, -0.013667f, -0.003365f, 0.036091f, 0.031653f, -0.005305f, 0.027495f, 0.034912f, 0.011500f, 0.024491f, -0.002405f, -0.027587f, -0.020465f, -0.047590f, -0.030404f, -0.011040f, -0.003210f, -0.003229f, 0.008418f, 0.022935f, 0.035633f, 0.045557f, 0.038057f, 0.013092f, -0.021116f, -0.033908f, -0.032971f, -0.036219f, -0.016615f, -0.008984f, -0.003996f, 0.008382f, 0.017804f, 0.014612f, 0.024993f, 0.014070f, 0.016347f, 0.015344f, -0.000076f, -0.012169f, -0.016487f, -0.020092f, -0.020242f, -0.017560f, -0.009675f, -0.009554f, 0.005505f, 0.010571f, 0.020517f, 0.030340f, 0.028813f, 0.011324f, 0.001850f, -0.016265f, -0.020307f, -0.023425f, -0.023958f, -0.006693f, -0.001244f, -0.004308f, 0.005504f, 0.018727f, 0.023897f, 0.012157f, 0.002491f, -0.001047f, 0.000198f, -0.004610f, -0.005597f, -0.008860f, -0.005740f, -0.006686f, -0.005027f, + -0.002780f, 0.000013f, 0.000281f, 0.005304f, 0.010694f, 0.011007f, 0.005746f, 0.002558f, -0.002790f, -0.004407f, -0.006357f, -0.004823f, -0.005369f, -0.002674f, -0.002496f, -0.000097f, 0.001249f, 0.004418f, 0.004036f, 0.004827f, 0.001628f, 0.001135f, -0.000734f, -0.001048f, -0.002345f, -0.000833f, -0.001100f, 0.000174f, -0.001000f, -0.001305f, -0.003491f, -0.000175f, 0.000405f, 0.002046f, 0.001578f, 0.003362f, 0.001025f, 0.000779f, -0.002077f, -0.000796f, 0.000527f, 0.001880f, -0.000772f, -0.001726f, -0.003613f, -0.001266f, -0.000088f, 0.002059f, 0.000622f, 0.000854f, -0.000660f, 0.000815f, 0.000337f, 0.001797f, 0.000669f, 0.001133f, -0.000859f, -0.000057f, -0.001768f, -0.001111f, -0.002019f, -0.000387f, -0.000814f, 0.000893f, 0.000319f, 0.002219f, 0.001477f, 0.001766f, -0.000262f, 0.000235f, -0.001289f, -0.000238f, -0.001543f, -0.000783f, -0.001354f, 0.000496f, -0.000208f, 0.001086f, 0.000085f, 0.000911f, -0.000398f, 0.000836f, -0.000217f, 0.000787f, -0.000559f, 0.000261f, -0.000936f, 0.000254f, -0.000687f, 0.000531f, -0.000512f, 0.000561f, -0.000546f}, + {0.007432f, 0.012090f, 0.003178f, 0.010675f, 0.000187f, -0.011011f, -0.007590f, -0.008020f, -0.001245f, -0.005507f, 0.012914f, -0.009655f, -0.002451f, -0.004384f, -0.001541f, -0.007744f, 0.007449f, -0.004566f, -0.003573f, 0.006264f, 0.010390f, 0.011754f, 0.001814f, -0.000841f, 0.002449f, 0.000625f, 0.001663f, -0.005317f, -0.005721f, 0.002802f, -0.005187f, -0.005197f, -0.006962f, -0.007323f, 0.002239f, -0.004849f, 0.006487f, -0.008083f, -0.001095f, 0.003571f, 0.003399f, 0.002995f, -0.012535f, -0.002248f, -0.006950f, -0.001206f, -0.002913f, -0.007645f, -0.000150f, 0.009136f, 0.002787f, 0.004441f, 0.004208f, 0.004942f, 0.000638f, 0.006199f, 0.003905f, 0.006919f, -0.003902f, 0.004621f, -0.002260f, 0.003195f, 0.000377f, -0.006372f, 0.007473f, 0.008447f, -0.004511f, -0.005655f, 0.002503f, 0.007764f, 0.001863f, 0.002081f, -0.002584f, -0.000500f, 0.004219f, 0.002638f, 0.000691f, -0.001526f, 0.000527f, 0.003561f, 0.004336f, -0.000514f, -0.006734f, -0.004119f, -0.002262f, -0.002863f, 0.001577f, -0.000635f, -0.000604f, 0.003215f, -0.002353f, -0.000782f, -0.000004f, 0.000574f, -0.001592f, -0.000450f, + 0.000248f, -0.002548f, -0.000285f, 0.003150f, -0.000457f, 0.001670f, -0.002266f, 0.001322f, 0.000676f, -0.000147f, -0.001487f, -0.018928f, -0.004928f, -0.008558f, 0.006287f, -0.017748f, 0.003915f, -0.007845f, -0.004091f, 0.002472f, 0.000382f, 0.001939f, 0.002678f, 0.001955f, 0.007714f, -0.003460f, 0.000832f, -0.000820f, -0.009324f, 0.006849f, 0.011543f, -0.009417f, -0.008773f, 0.006641f, 0.001745f, 0.008208f, 0.002641f, 0.011042f, -0.001515f, 0.003689f, -0.005847f, -0.001836f, 0.011330f, 0.000855f, -0.007352f, -0.009148f, -0.009806f, 0.000366f, 0.008163f, 0.004082f, -0.000031f, 0.009213f, 0.007406f, 0.000239f, -0.007552f, 0.011795f, 0.003047f, 0.009084f, 0.009310f, -0.001678f, 0.005940f, 0.006940f, -0.000826f, 0.004079f, 0.004814f, -0.004662f, 0.000973f, -0.001483f, 0.004576f, -0.010464f, -0.006643f, 0.003305f, -0.006423f, -0.002540f, 0.008947f, -0.003669f, 0.004925f, -0.002149f, -0.013989f, 0.002307f, -0.000047f, 0.007306f, -0.011518f, -0.006263f, 0.005237f, 0.001262f, -0.001088f, 0.002919f, -0.005418f, 0.001523f, 0.001408f, -0.001724f, -0.003408f, 0.004660f, 0.004311f, 0.002909f, + 0.000559f, -0.001836f, 0.001161f, -0.001376f, -0.002057f, 0.001493f, 0.001356f, -0.002876f, 0.002051f, -0.001636f, -0.001175f, 0.002470f, -0.001801f, -0.003810f, -0.000036f, -0.001462f, -0.000438f, -0.001840f, -0.001930f, 0.000718f, -0.000126f, 0.001073f, 0.000010f, 0.001052f, -0.002741f, 0.000733f, -0.000785f, 0.011838f, 0.012589f, 0.005475f, 0.009323f, 0.007204f, 0.012609f, 0.014277f, -0.005282f, -0.001580f, 0.004865f, -0.014349f, -0.000434f, -0.004758f, -0.002684f, 0.006509f, -0.008283f, -0.001015f, 0.010632f, 0.001916f, 0.006832f, -0.003397f, -0.002406f, -0.003605f, -0.013406f, -0.002244f, 0.000963f, 0.007076f, -0.002115f, 0.012207f, 0.004874f, -0.002153f, 0.004945f, 0.002501f, 0.006343f, -0.004587f, -0.000899f, 0.014261f, -0.001862f, 0.013472f, 0.006391f, -0.005964f, 0.001470f, 0.011860f, 0.006246f, -0.007882f, 0.010897f, -0.003011f, 0.000786f, 0.000528f, -0.002136f, 0.002046f, 0.001258f, -0.009841f, 0.006309f, 0.004538f, -0.000793f, 0.000321f, -0.002135f, -0.008892f, 0.000063f, 0.004946f, -0.000961f, -0.001078f, -0.005912f, -0.013059f, -0.004424f, 0.004816f, 0.010987f, -0.016641f, + -0.008804f, 0.003075f, -0.007197f, 0.004225f, -0.000284f, -0.000107f, -0.009944f, -0.007615f, -0.004390f, -0.006520f, -0.003153f, 0.000340f, 0.001175f, -0.002355f, 0.003818f, 0.002971f, 0.000666f, 0.002737f, -0.002987f, -0.001150f, 0.000127f, -0.004500f, -0.000929f, 0.000420f, -0.005629f, 0.002361f, 0.001422f, -0.001111f, 0.000216f, 0.001164f, 0.002779f, 0.000286f, 0.000434f, 0.000027f, -0.002716f, -0.000370f, -0.000789f, 0.002008f, 0.001452f, 0.002755f, -0.001919f, -0.000451f, 0.017550f, 0.018660f, -0.003731f, -0.007814f, -0.008544f, 0.017892f, -0.015523f, 0.000429f, -0.002535f, -0.007232f, -0.009829f, 0.003499f, -0.002703f, -0.013381f, -0.016289f, 0.000623f, -0.001227f, -0.008505f, 0.003079f, 0.004519f, -0.005990f, -0.009019f, -0.008420f, 0.011899f, -0.012842f, -0.001549f, -0.015007f, 0.000178f, 0.008354f, 0.002850f, 0.001430f, -0.008414f, -0.008095f, 0.007367f, -0.005686f, -0.008600f, 0.001069f, -0.003129f, 0.005266f, 0.000107f, 0.002129f, -0.008577f, -0.003169f, -0.002419f, 0.008238f, 0.005646f, 0.005730f, -0.016984f, 0.002690f, 0.004733f, 0.003883f, 0.004786f, -0.004839f, -0.003095f, + 0.000614f, 0.003440f, 0.006724f, -0.001167f, 0.004445f, -0.004918f, 0.013120f, -0.023793f, 0.008365f, 0.000674f, -0.012651f, -0.000548f, 0.014000f, -0.004239f, -0.006554f, -0.012761f, -0.004296f, 0.000987f, -0.003535f, -0.000021f, 0.005747f, 0.007296f, 0.006110f, -0.001816f, -0.000999f, -0.007513f, -0.001521f, -0.001933f, -0.003768f, 0.001027f, -0.001524f, -0.001500f, 0.003061f, -0.003809f, -0.001744f, 0.003647f, -0.001816f, 0.002349f, -0.000547f, -0.001530f, -0.001306f, -0.001030f, -0.005480f, -0.003454f, 0.002405f, 0.002673f, -0.002594f, -0.002131f, -0.001761f, 0.001999f, -0.001283f, -0.000813f, -0.002143f, 0.001383f, 0.001514f, -0.002599f, 0.001043f, -0.000396f, -0.002326f, -0.000590f, -0.001311f, 0.001473f, -0.000764f, 0.002209f, 0.003191f, -0.001504f, -0.008330f, -0.026326f, 0.004799f, -0.012000f, 0.002628f, 0.002208f, -0.001526f, 0.018693f, 0.001033f, -0.011946f, 0.015963f, 0.007702f, 0.005483f, -0.002390f, 0.003311f, -0.004851f, 0.012519f, -0.002067f, 0.001430f, 0.018863f, 0.018407f, 0.007887f, 0.008434f, 0.008119f, 0.009168f, 0.006130f, -0.018177f, -0.005666f, -0.000245f, -0.004767f, + -0.015469f, -0.001691f, -0.003661f, -0.004074f, -0.008305f, -0.000145f, -0.002431f, 0.013332f, -0.004263f, 0.023364f, -0.000130f, 0.001986f, -0.004316f, -0.003363f, 0.000189f, -0.000654f, -0.001858f, -0.004064f, -0.002725f, -0.011422f, 0.002798f, 0.001894f, -0.001353f, -0.005895f, 0.008004f, 0.005939f, 0.006940f, -0.002408f, -0.004997f, 0.000160f, 0.006051f, 0.006561f, -0.005244f, -0.014919f, -0.007617f, 0.001642f, 0.012478f, -0.001693f, 0.010205f, -0.008062f, -0.011733f, 0.008808f, -0.004091f, -0.009620f, 0.005629f, 0.005885f, -0.010799f, -0.008524f, -0.011884f, -0.003924f, -0.004079f, 0.006872f, -0.003701f, 0.002117f, -0.000741f, 0.004595f, 0.002846f, 0.002562f, -0.002223f, -0.001235f, -0.006171f, -0.003076f, -0.001628f, -0.000036f, 0.002777f, -0.000490f, 0.000217f, 0.005191f, 0.002041f, -0.000211f, 0.000082f, 0.003352f, -0.002147f, 0.000938f, 0.000985f, -0.001704f, 0.002028f, -0.001505f, 0.001347f, 0.001073f, 0.001503f, -0.000891f, -0.003818f, 0.003790f, 0.000518f, -0.006386f, 0.009486f, -0.011268f, -0.012726f, 0.006230f, -0.003780f, -0.000851f, -0.006769f, -0.003562f, 0.006240f, 0.009336f, + 0.004576f, -0.001851f, 0.001214f, -0.000825f, -0.002266f, -0.008402f, 0.002755f, -0.023090f, -0.006940f, -0.007166f, 0.006295f, 0.008296f, 0.000520f, 0.004264f, -0.014696f, 0.004261f, 0.002098f, 0.004246f, -0.013261f, 0.025070f, -0.001257f, 0.004902f, 0.003114f, -0.011411f, 0.001713f, -0.016490f, 0.010653f, -0.003275f, -0.014187f, 0.003142f, 0.000947f, -0.006742f, 0.000639f, 0.001849f, 0.010978f, 0.020296f, 0.008528f, -0.003731f, 0.006350f, 0.008524f, -0.018719f, -0.006519f, -0.008641f, 0.005494f, 0.004137f, -0.002772f, 0.002828f, 0.006797f, 0.004008f, 0.008665f, 0.015472f, 0.000687f, -0.005919f, -0.001275f, -0.000782f, 0.012571f, -0.008923f, 0.000375f, 0.005533f, 0.016842f, -0.000056f, -0.010655f, -0.010838f, -0.000619f, -0.013285f, -0.001456f, 0.004869f, 0.020560f, 0.017296f, -0.001695f, -0.009370f, 0.007789f, 0.000430f, 0.002511f, 0.001760f, -0.000364f, 0.002427f, -0.000373f, -0.002684f, 0.002541f, 0.002776f, -0.002524f, 0.003940f, 0.004106f, 0.003543f, -0.000729f, -0.003120f, 0.002685f, 0.003138f, -0.000204f, 0.000834f, -0.002200f, 0.000260f, -0.000224f, 0.004614f, 0.002056f, + 0.002826f, 0.002611f, 0.000597f, 0.001856f, -0.000167f, 0.002183f, 0.004109f, 0.001211f, 0.001601f, 0.003359f, 0.003992f, -0.001661f, -0.001188f, 0.001316f, 0.001082f, 0.003449f, 0.004712f, -0.002115f, -0.024209f, -0.006664f, -0.008963f, 0.010318f, 0.000353f, -0.005046f, -0.031130f, -0.004168f, -0.004184f, 0.012836f, 0.030796f, -0.008939f, 0.020678f, 0.003494f, -0.018251f, -0.018685f, 0.003206f, 0.004661f, -0.010625f, 0.011598f, -0.008408f, 0.009330f, -0.011631f, 0.005534f, 0.003961f, -0.011100f, -0.009315f, -0.007159f, 0.003622f, 0.011974f, -0.015763f, 0.000500f, -0.016574f, -0.001011f, -0.006333f, 0.003940f, 0.012019f, 0.001177f, -0.005272f, -0.004714f, 0.013009f, -0.000136f, 0.019856f, 0.006017f, -0.007562f, -0.007324f, -0.005823f, 0.002748f, 0.012434f, -0.000363f, 0.020647f, -0.036981f, -0.027258f, -0.022114f, -0.005158f, -0.018880f, 0.001150f, -0.007177f, 0.006606f, 0.016634f, 0.002934f, 0.006816f, 0.010665f, 0.017611f, 0.009037f, 0.002593f, -0.012309f, -0.030645f, -0.032251f, 0.017140f, 0.001081f, 0.021790f, -0.015700f, -0.011363f, 0.009511f, -0.022722f, 0.000354f, -0.008200f, + -0.000949f, -0.014703f, 0.000475f, 0.004728f, 0.013063f, 0.002244f, 0.002026f, -0.004338f, 0.004639f, -0.001101f, 0.001460f, 0.003537f, 0.005849f, 0.007533f, -0.002197f, -0.003367f, 0.005471f, 0.002685f, -0.002248f, -0.004194f, 0.000728f, -0.000824f, -0.000615f, -0.001865f, 0.000737f, -0.000093f, -0.002327f, -0.000901f, 0.002162f, 0.003995f, 0.003195f, 0.002694f, 0.001351f, -0.009518f, -0.005291f, -0.003740f, -0.003471f, 0.004865f, -0.000926f, -0.001715f, -0.000107f, 0.001267f, 0.000218f, -0.000331f, 0.014418f, 0.006586f, -0.011848f, -0.000121f, 0.027632f, 0.023795f, -0.002388f, -0.020205f, -0.034627f, -0.003735f, -0.012294f, 0.012501f, -0.010527f, -0.009966f, -0.039191f, -0.016538f, -0.035127f, 0.013069f, -0.001360f, -0.008326f, 0.009083f, -0.001043f, -0.000009f, 0.002707f, -0.011429f, 0.001167f, -0.013097f, -0.002111f, 0.007596f, 0.005994f, -0.013358f, 0.004903f, 0.013177f, 0.021989f, -0.003530f, -0.002883f, -0.007488f, 0.001409f, 0.011097f, 0.016250f, -0.002541f, 0.002543f, -0.003701f, -0.002623f, 0.018927f, 0.014107f, 0.000326f, 0.014545f, 0.003929f, -0.017467f, 0.003090f, -0.001615f, + 0.022565f, 0.009072f, 0.002632f, 0.011163f, 0.014554f, 0.004230f, -0.013261f, -0.022139f, -0.005392f, 0.004804f, 0.011713f, 0.006261f, 0.000498f, 0.004821f, 0.017435f, 0.004046f, 0.005500f, 0.008294f, 0.004504f, -0.011221f, -0.013106f, -0.011021f, -0.012952f, -0.011478f, 0.019401f, 0.002910f, 0.014921f, -0.013211f, -0.012048f, -0.002130f, 0.012423f, -0.007810f, 0.006490f, 0.004016f, 0.001749f, -0.006618f, -0.004564f, -0.006107f, -0.004547f, -0.006981f, 0.002548f, 0.002415f, -0.002229f, 0.004788f, -0.003369f, 0.002316f, -0.001536f, 0.000626f, 0.001836f, -0.006178f, -0.004207f, -0.006202f, -0.004389f, -0.007582f, -0.002516f, -0.006272f, -0.003362f, -0.003595f, -0.005165f, -0.000221f, 0.005257f, 0.001914f, 0.002005f, -0.001907f, -0.000866f, -0.000610f, -0.001654f, 0.004428f, -0.002385f, -0.001094f, -0.001670f, 0.048651f, 0.010870f, -0.015223f, 0.008893f, -0.008933f, -0.028773f, -0.006020f, -0.028223f, -0.015717f, 0.014866f, 0.019437f, 0.007742f, 0.003901f, 0.001830f, 0.003503f, 0.018749f, -0.013297f, 0.026455f, -0.017087f, -0.017123f, 0.020899f, 0.009492f, -0.033920f, 0.014984f, 0.008594f, + 0.010910f, 0.022280f, 0.011182f, 0.016573f, -0.000955f, 0.008988f, -0.005131f, 0.014162f, 0.003892f, 0.003043f, 0.009626f, -0.019064f, -0.010144f, -0.005828f, 0.012397f, 0.005352f, 0.004556f, 0.009764f, 0.003001f, 0.003498f, -0.017078f, 0.000228f, 0.018839f, -0.003292f, 0.002476f, 0.002423f, 0.002585f, 0.022398f, 0.008783f, 0.030111f, 0.007116f, -0.004203f, 0.028740f, -0.024489f, -0.003008f, -0.003803f, -0.009617f, -0.002155f, 0.006175f, 0.028395f, 0.002910f, -0.005914f, -0.010805f, 0.005949f, -0.011372f, -0.004847f, -0.007250f, -0.015395f, -0.002293f, 0.004252f, 0.024408f, -0.001905f, -0.023198f, -0.006368f, -0.013850f, -0.006934f, 0.017101f, 0.013753f, 0.016030f, -0.012496f, 0.002806f, -0.013916f, -0.001930f, -0.004645f, -0.008268f, -0.004620f, -0.011409f, -0.006641f, -0.001987f, -0.004843f, -0.015036f, -0.005904f, -0.004181f, -0.002985f, -0.003259f, -0.005229f, 0.000862f, -0.002457f, -0.011796f, -0.000508f, -0.005582f, -0.003350f, -0.000818f, -0.000040f, 0.002305f, -0.000294f, 0.005569f, 0.005372f, 0.001103f, 0.001035f, -0.003659f, -0.003278f, -0.000714f, -0.003979f, 0.005689f, 0.003355f, + 0.005351f, 0.004971f, 0.002282f, 0.006932f, 0.004723f, 0.001792f, 0.003364f, -0.000872f, -0.002643f, 0.004917f, 0.007113f, -0.017574f, -0.027090f, -0.009782f, -0.026673f, 0.019154f, -0.022758f, -0.016750f, -0.013403f, 0.012107f, 0.030517f, -0.030965f, -0.010993f, -0.034898f, 0.009995f, 0.004870f, 0.003272f, -0.010026f, 0.002722f, 0.039288f, -0.020563f, -0.003452f, 0.014873f, 0.010161f, 0.007777f, 0.013820f, 0.009198f, -0.012926f, -0.021847f, -0.004082f, -0.012105f, -0.016485f, -0.020172f, 0.000321f, -0.004716f, 0.004963f, 0.025951f, 0.016437f, -0.014597f, -0.007881f, -0.001647f, -0.007535f, 0.006340f, 0.049375f, -0.016779f, 0.034442f, 0.010770f, 0.005787f, -0.002279f, -0.005586f, 0.005803f, -0.018916f, 0.009027f, 0.026807f, 0.001109f, 0.004280f, 0.021429f, 0.013922f, 0.008275f, -0.018095f, 0.015102f, -0.010792f, -0.016150f, -0.043613f, -0.013757f, 0.028330f, -0.016143f, 0.007341f, -0.030728f, 0.021962f, -0.011591f, -0.012098f, 0.019156f, -0.030605f, -0.022659f, 0.034666f, -0.024742f, -0.023271f, 0.013878f, -0.015965f, 0.003197f, 0.000053f, 0.009897f, -0.025103f, 0.007872f, 0.000656f, + 0.025011f, -0.018635f, 0.006196f, -0.002647f, -0.014181f, 0.018557f, 0.003744f, -0.015448f, -0.011216f, -0.010644f, 0.001621f, -0.000041f, -0.007789f, 0.000208f, 0.009674f, -0.000812f, 0.006854f, 0.007720f, 0.006119f, -0.013909f, 0.007725f, 0.007086f, 0.011161f, -0.000282f, 0.000820f, -0.010114f, -0.004044f, -0.004977f, -0.005248f, 0.002339f, -0.001170f, 0.006474f, -0.009203f, -0.005801f, 0.003467f, -0.008899f, -0.007508f, -0.009480f, 0.003260f, -0.019745f, -0.014656f, -0.002022f, 0.022463f, -0.010638f, 0.039454f, 0.036689f, 0.007252f, 0.011746f, -0.021274f, 0.002635f, -0.017216f, 0.027550f, -0.005474f, 0.008119f, -0.013116f, -0.008512f, 0.004736f, 0.003722f, -0.012587f, 0.021124f, -0.005921f, 0.004488f, 0.007933f, -0.013824f, 0.005295f, -0.017640f, 0.000138f, 0.010055f, 0.012094f, 0.000297f, 0.015971f, 0.020084f, -0.001431f, -0.037571f, -0.006252f, -0.011104f, 0.026988f, -0.022690f, -0.028133f, -0.020105f, -0.013383f, 0.003943f, -0.015896f, -0.012530f, -0.007949f, -0.002281f, 0.005057f, -0.055066f, 0.034904f, 0.027164f, 0.039783f, -0.012568f, 0.006490f, 0.026628f, -0.025285f, -0.023496f, + 0.004793f, 0.017421f, 0.011550f, -0.002934f, 0.005499f, -0.013861f, -0.016440f, -0.021114f, -0.006070f, 0.073357f, 0.006049f, -0.040546f, -0.007108f, -0.022178f, 0.014143f, 0.011037f, -0.025015f, 0.005483f, -0.007558f, 0.002172f, -0.012251f, 0.015776f, 0.016165f, -0.002281f, -0.007928f, -0.009510f, -0.031725f, 0.009731f, 0.005343f, -0.001168f, 0.013384f, -0.006246f, 0.002314f, 0.005246f, -0.014930f, 0.005937f, 0.009264f, 0.021054f, 0.011340f, 0.001452f, -0.017767f, 0.000283f, 0.016642f, 0.001120f, 0.000228f, 0.012445f, 0.000489f, 0.004365f, 0.012343f, 0.010434f, -0.001632f, 0.005797f, 0.010493f, 0.009655f, -0.004270f, 0.004336f, 0.012558f, 0.015283f, 0.011404f, -0.000133f, -0.007659f, -0.001604f, 0.000618f, 0.009656f, 0.000247f, -0.002498f, 0.000915f, 0.003683f, -0.005639f, 0.003708f, 0.006155f, -0.005543f, 0.004047f, -0.013837f, -0.001459f, -0.009883f, -0.021686f, -0.039775f, 0.002555f, -0.033114f, 0.015209f, 0.006154f, -0.027942f, 0.016051f, 0.016939f, 0.025320f, 0.006393f, 0.010424f, -0.028981f, 0.000113f, -0.006369f, 0.026987f, 0.011504f, 0.001833f, 0.023858f, 0.028081f, + -0.004047f, -0.012465f, 0.002383f, 0.034465f, -0.022765f, -0.016783f, 0.016662f, 0.010166f, -0.023152f, -0.004327f, -0.021484f, 0.039308f, -0.033771f, 0.009794f, 0.019790f, -0.011824f, 0.018122f, 0.007423f, -0.010217f, -0.009422f, -0.010942f, -0.015149f, 0.020848f, 0.029759f, 0.005018f, -0.021793f, 0.001512f, -0.024137f, -0.010235f, 0.016644f, -0.003882f, -0.011722f, -0.009848f, 0.004666f, -0.033709f, 0.001520f, -0.004293f, -0.018438f, 0.024819f, -0.024774f, -0.002564f, -0.005334f, -0.019568f, 0.020300f, -0.002439f, 0.011938f, -0.010388f, -0.001493f, -0.002005f, -0.011532f, 0.008340f, -0.010597f, -0.002941f, -0.010432f, 0.028789f, 0.013185f, -0.036158f, -0.007327f, -0.059001f, 0.033936f, -0.001009f, -0.025795f, 0.022561f, 0.002919f, 0.002556f, 0.008963f, -0.000510f, 0.013826f, 0.015521f, 0.004068f, -0.005206f, 0.009411f, 0.016749f, -0.009773f, -0.007184f, 0.007511f, 0.001607f, 0.004682f, 0.004252f, 0.009291f, 0.011090f, -0.007560f, 0.005324f, 0.004117f, -0.010501f, -0.008418f, 0.006674f, 0.001891f, -0.001971f, -0.006081f, -0.006776f, -0.010117f, 0.009307f, 0.010919f, 0.000788f, -0.006670f, + -0.022929f, 0.000751f, 0.000956f, 0.007416f, -0.015109f, 0.001827f, 0.010092f, -0.005824f, 0.011829f, 0.006097f, -0.001913f, 0.003852f, 0.005930f, 0.000891f, 0.001459f, 0.004163f, 0.007508f, -0.007294f, -0.001564f, -0.004139f, 0.002026f, 0.035062f, 0.001702f, -0.027346f, -0.011232f, 0.015561f, 0.026170f, 0.027285f, 0.001356f, -0.006884f, 0.039247f, 0.016538f, 0.043580f, 0.004870f, 0.004021f, -0.021223f, -0.008218f, -0.012753f, 0.011883f, 0.005843f, 0.023727f, -0.027209f, 0.002160f, -0.016369f, 0.014686f, -0.023649f, 0.009167f, 0.025287f, -0.003531f, -0.001217f, -0.013102f, 0.003200f, -0.013191f, -0.046633f, 0.006675f, -0.007555f, 0.003541f, -0.021090f, -0.004208f, 0.017569f, 0.035195f, -0.004086f, -0.012343f, 0.019826f, 0.009861f, 0.004477f, 0.024323f, 0.007887f, -0.012503f, -0.006603f, 0.015812f, -0.002608f, 0.014458f, -0.017359f, -0.014740f, 0.004748f, -0.013834f, -0.027563f, -0.012214f, -0.031328f, -0.006583f, 0.009929f, -0.023937f, -0.003949f, -0.027540f, -0.012646f, 0.000104f, 0.010487f, -0.032881f, 0.014051f, 0.002766f, -0.020210f, 0.025030f, -0.009283f, 0.006851f, 0.043360f, + 0.049926f, 0.002719f, 0.017751f, 0.035818f, 0.043701f, 0.042600f, -0.003948f, -0.029198f, -0.043727f, -0.016485f, -0.028891f, 0.027079f, -0.005641f, -0.013490f, 0.007348f, -0.001203f, 0.003301f, -0.001016f, -0.012758f, 0.013505f, 0.004244f, 0.004750f, 0.001303f, 0.018427f, -0.010309f, -0.000708f, -0.005534f, 0.012624f, -0.011910f, -0.005701f, -0.001016f, 0.018177f, -0.004597f, 0.010774f, 0.015692f, -0.014670f, -0.002759f, -0.006500f, -0.015752f, -0.006999f, -0.003407f, 0.006391f, 0.000817f, 0.021355f, 0.006202f, 0.014278f, -0.001148f, -0.014633f, 0.004196f, 0.003381f, 0.000147f, 0.059584f, 0.068301f, 0.003588f, 0.021854f, 0.020951f, -0.002924f, -0.049166f, -0.001352f, -0.001984f, -0.018702f, 0.013850f, 0.012795f, -0.026779f, 0.014510f, 0.018711f, 0.003019f, -0.007151f, 0.010095f, -0.006864f, 0.034710f, -0.006009f, -0.016396f, 0.000188f, 0.007791f, -0.003319f, -0.002423f, -0.000669f, -0.055621f, 0.015973f, -0.001411f, -0.038377f, -0.016052f, 0.006581f, -0.003770f, -0.026173f, 0.008900f, -0.030882f, -0.002970f, 0.002975f, -0.049669f, -0.008909f, 0.021036f, -0.015941f, 0.002102f, 0.031151f, + 0.018918f, 0.023814f, 0.007215f, -0.013509f, -0.023335f, 0.023697f, -0.012498f, 0.013246f, -0.022196f, -0.011535f, 0.015525f, 0.026617f, 0.003661f, 0.031896f, -0.021684f, 0.027584f, -0.023666f, -0.028255f, -0.020401f, 0.027489f, 0.028575f, -0.026723f, 0.013516f, -0.073666f, -0.007009f, 0.021558f, 0.006551f, -0.011624f, -0.029628f, 0.013431f, -0.041759f, 0.006612f, -0.021684f, 0.019579f, -0.032332f, -0.020507f, 0.031783f, 0.000645f, 0.015812f, 0.003570f, 0.013735f, -0.007303f, 0.005475f, -0.003718f, -0.024336f, -0.004423f, -0.011539f, 0.007387f, -0.008091f, 0.004183f, 0.000597f, 0.003910f, 0.001563f, -0.005368f, -0.007665f, 0.000934f, -0.015569f, 0.005337f, 0.003928f, 0.008641f, -0.010126f, 0.008582f, 0.007661f, 0.005235f, 0.006525f, 0.005026f, -0.010873f, 0.001028f, 0.004650f, -0.007796f, 0.013528f, -0.001336f, -0.005863f, -0.008061f, -0.000535f, 0.001175f, 0.006175f, -0.005154f, 0.005820f, -0.004979f, 0.014189f, 0.006393f, -0.012896f, -0.003283f, -0.003610f, -0.005892f, -0.005762f, -0.012997f, -0.054303f, 0.004293f, 0.066522f, -0.044869f, -0.004548f, -0.003604f, 0.003251f, -0.017563f, + 0.008234f, -0.028191f, -0.029487f, -0.009318f, -0.008272f, 0.007368f, -0.007643f, 0.015517f, -0.022179f, 0.001033f, 0.042685f, -0.034921f, -0.031390f, -0.007233f, 0.037316f, 0.005561f, -0.047397f, 0.020355f, -0.017774f, -0.019845f, 0.004383f, 0.065039f, -0.036719f, -0.020008f, 0.045790f, 0.034431f, 0.002673f, -0.018768f, 0.000969f, -0.006798f, -0.014933f, 0.013477f, 0.011743f, -0.007561f, -0.037642f, 0.048129f, 0.022177f, 0.009337f, -0.051137f, -0.007504f, 0.015503f, 0.017871f, -0.006617f, 0.027013f, -0.004608f, 0.009368f, -0.011950f, -0.030352f, 0.019666f, -0.021581f, 0.012818f, 0.007069f, -0.027130f, 0.050960f, 0.007506f, 0.036773f, 0.036311f, 0.006797f, -0.055356f, -0.010298f, 0.000232f, -0.021603f, -0.011384f, 0.002351f, -0.002048f, 0.024185f, 0.044666f, -0.012725f, -0.004689f, -0.019573f, -0.009153f, 0.018945f, -0.012900f, 0.011119f, 0.033137f, -0.028964f, 0.032936f, -0.006268f, 0.009696f, -0.012377f, -0.007065f, -0.010353f, 0.001147f, 0.006456f, 0.007045f, -0.005312f, -0.000107f, 0.007827f, 0.004032f, 0.017804f, 0.007956f, -0.008633f, 0.000467f, 0.001829f, 0.015739f, -0.008659f, + 0.004379f, 0.007616f, 0.002217f, -0.000419f, 0.000284f, -0.020699f, 0.009990f, -0.007502f, 0.009777f, 0.013294f, 0.001485f, -0.001946f, 0.006395f, -0.000524f, 0.004833f, 0.001888f, -0.002447f, -0.007578f, -0.008119f, 0.015709f, 0.002400f, -0.003532f, 0.004112f, -0.009600f, -0.002084f, 0.015969f, 0.020920f, 0.002801f, -0.019111f, -0.096106f, 0.006381f, -0.025105f, 0.003383f, 0.048059f, 0.004665f, -0.009314f, 0.008832f, 0.001823f, -0.032558f, -0.035242f, -0.031654f, -0.030478f, 0.039686f, -0.007966f, 0.047354f, 0.004170f, -0.044618f, -0.001598f, 0.004987f, 0.038249f, 0.007595f, -0.006213f, -0.007553f, 0.010907f, -0.024005f, -0.009244f, 0.042385f, -0.008657f, -0.054924f, -0.042017f, 0.025143f, -0.005484f, -0.011379f, 0.012612f, -0.003898f, -0.028346f, 0.008584f, 0.016612f, 0.038160f, -0.007703f, -0.031601f, 0.000411f, -0.039869f, 0.015334f, 0.045217f, -0.007253f, -0.055414f, 0.017437f, -0.000601f, 0.003100f, 0.013399f, -0.017485f, 0.034157f, 0.002543f, -0.022994f, 0.017885f, -0.012438f, -0.007723f, 0.048789f, -0.024998f, -0.008364f, -0.008218f, 0.030746f, 0.012329f, -0.053919f, 0.027347f, + -0.043448f, -0.010391f, -0.023436f, 0.005586f, -0.014288f, -0.013201f, -0.004475f, 0.024752f, -0.008039f, -0.015287f, 0.029327f, -0.017115f, 0.030104f, -0.000180f, -0.015891f, -0.009590f, 0.007494f, 0.008263f, 0.005971f, -0.018110f, -0.005981f, 0.004426f, -0.001009f, -0.011854f, 0.000268f, 0.011145f, 0.017183f, 0.007141f, 0.008840f, 0.001385f, 0.016889f, -0.009579f, 0.005485f, 0.013339f, -0.005075f, 0.001660f, 0.005444f, -0.003355f, 0.002662f, 0.005275f, -0.016553f, 0.013965f, 0.005952f, -0.016664f, -0.013655f, 0.000954f, -0.019594f, 0.001693f, -0.014443f, 0.018680f, -0.033807f, -0.000084f, -0.007162f, 0.003550f, -0.008807f, 0.010540f, -0.005643f, 0.004907f, 0.003774f, -0.006969f, 0.001521f, -0.046782f, 0.009465f, 0.077578f, 0.050308f, 0.023197f, -0.038584f, 0.028911f, 0.036258f, 0.053986f, 0.025861f, 0.006469f, 0.001745f, 0.033851f, 0.058094f, -0.013059f, -0.007278f, 0.033083f, -0.065419f, 0.023821f, 0.058013f, -0.011993f, -0.020354f, 0.015179f, 0.044992f, 0.036463f, -0.024537f, -0.041627f, -0.002658f, 0.021028f, -0.007276f, 0.005105f, 0.000456f, 0.048943f, -0.028140f, 0.031368f, + 0.047077f, -0.018891f, -0.005947f, 0.033427f, -0.005235f, 0.117120f, -0.049336f, 0.021110f, 0.079906f, -0.046128f, 0.014885f, 0.005384f, -0.065219f, -0.002000f, 0.011884f, -0.028642f, 0.063305f, 0.004817f, -0.008981f, 0.004949f, -0.026690f, 0.087139f, 0.023777f, -0.069845f, 0.067134f, -0.028175f, 0.002239f, 0.020670f, 0.024767f, 0.044711f, 0.021541f, -0.012100f, -0.043930f, -0.058753f, -0.022323f, -0.023568f, -0.004314f, -0.018052f, 0.036643f, -0.022490f, -0.039221f, 0.004325f, 0.010463f, 0.007895f, 0.013881f, -0.022074f, -0.021783f, -0.013075f, -0.014518f, -0.046341f, -0.019886f, -0.015806f, -0.032308f, -0.015417f, 0.011115f, -0.013647f, -0.030331f, -0.001483f, 0.011311f, 0.020095f, -0.005102f, 0.009427f, 0.021572f, -0.001313f, -0.015268f, -0.000977f, -0.009417f, 0.012157f, 0.017104f, -0.024594f, 0.021186f, -0.012772f, -0.000141f, 0.003182f, -0.011808f, 0.022619f, 0.008325f, -0.031921f, 0.019175f, 0.002913f, -0.011770f, 0.023467f, -0.027234f, 0.010678f, -0.005480f, 0.011438f, -0.006867f, -0.007510f, 0.003977f, -0.004443f, -0.003219f, 0.008219f, -0.005357f, -0.018319f, 0.007950f, -0.001757f, + 0.005034f, -0.000857f, 0.014735f, -0.008417f, 0.018770f, -0.089720f, 0.052093f, 0.002762f, 0.031334f, 0.052668f, -0.086802f, 0.020129f, 0.044080f, 0.010447f, 0.032792f, -0.032907f, 0.036139f, 0.011023f, -0.034265f, 0.000870f, -0.021739f, -0.062908f, 0.034339f, 0.020076f, 0.057471f, -0.031646f, -0.042772f, -0.014461f, 0.013188f, -0.008458f, -0.072123f, -0.035056f, 0.021673f, -0.005009f, 0.010354f, -0.029941f, -0.009765f, 0.024205f, -0.020602f, -0.009765f, -0.031003f, -0.006843f, 0.010784f, -0.033611f, 0.003208f, -0.073798f, -0.061360f, 0.019169f, -0.063811f, 0.005835f, -0.066741f, -0.046224f, -0.032383f, 0.031530f, 0.061607f, 0.076580f, -0.018407f, 0.034192f, 0.041010f, 0.020311f, 0.017589f, -0.029324f, 0.084591f, 0.086858f, -0.059173f, 0.059284f, -0.046622f, 0.029963f, 0.060610f, 0.058142f, 0.070286f, 0.084470f, 0.059417f, -0.066753f, -0.047875f, -0.000240f, 0.001393f, 0.025599f, -0.016232f, -0.012625f, -0.040420f, -0.022001f, -0.059828f, 0.013344f, 0.049765f, -0.019948f, 0.012014f, 0.052471f, 0.024368f, -0.035509f, 0.039889f, -0.002218f, 0.013960f, -0.003673f, -0.007308f, 0.011834f, + -0.012838f, 0.018011f, 0.014790f, -0.013070f, -0.016315f, 0.015576f, -0.011178f, 0.000788f, 0.000293f, -0.001017f, 0.004196f, 0.001761f, -0.021647f, 0.020231f, -0.009284f, 0.009797f, 0.011319f, -0.007735f, 0.012208f, -0.015099f, -0.011399f, 0.010396f, -0.012458f, -0.015606f, -0.007148f, 0.006523f, -0.006351f, 0.004139f, -0.014465f, 0.000719f, 0.005134f, 0.013394f, 0.019625f, -0.004486f, 0.011003f, -0.012879f, -0.000115f, -0.002235f, 0.005867f, 0.004747f, -0.001298f, -0.009933f, -0.014258f, -0.003202f, 0.002949f, 0.111490f, -0.081596f, -0.041557f, 0.044010f, -0.026195f, 0.042048f, -0.032764f, -0.036484f, 0.012321f, -0.086280f, -0.003916f, 0.058095f, -0.014018f, 0.029888f, -0.049518f, -0.012112f, -0.019550f, 0.002031f, 0.061923f, 0.018793f, 0.013770f, -0.010978f, 0.034000f, 0.011012f, 0.084614f, 0.020893f, 0.049411f, 0.003603f, -0.038595f, -0.036431f, 0.049256f, -0.023843f, 0.022797f, -0.000377f, -0.063495f, 0.045910f, -0.056565f, 0.110040f, -0.081906f, 0.050138f, 0.044832f, -0.046933f, -0.039498f, -0.029090f, 0.040651f, -0.002975f, 0.042543f, -0.000405f, 0.005601f, -0.075036f, -0.040335f, + 0.017630f, -0.036885f, 0.012377f, -0.022465f, 0.022228f, 0.012610f, 0.057885f, -0.034237f, -0.011662f, -0.014557f, -0.028142f, 0.078355f, 0.014654f, 0.007451f, -0.072736f, -0.023529f, 0.039385f, 0.023233f, 0.025153f, 0.067895f, 0.043577f, 0.060053f, 0.069385f, -0.001920f, 0.030838f, -0.028678f, 0.092240f, 0.007034f, -0.014990f, 0.033651f, -0.007654f, 0.070748f, 0.001497f, -0.014106f, -0.014369f, 0.008584f, 0.049893f, -0.037547f, 0.025892f, -0.011862f, -0.003842f, 0.014871f, 0.010118f, 0.019470f, -0.011897f, 0.012727f, 0.023437f, -0.005946f, -0.008570f, 0.015848f, -0.002304f, -0.002312f, -0.001512f, 0.004374f, 0.002827f, 0.007712f, -0.016595f, 0.022253f, -0.012756f, -0.007051f, -0.003300f, 0.013674f, -0.018805f, 0.002093f, -0.013376f, 0.018642f, 0.033743f, -0.011029f, -0.008974f, -0.004277f, 0.023268f, 0.011477f, 0.024296f, -0.001751f, -0.013655f, 0.011161f, 0.011830f, -0.003249f, 0.011726f, 0.009112f, -0.032298f, 0.005258f, 0.037630f, -0.004786f, -0.017475f, -0.168673f, 0.117358f, -0.072873f, -0.050393f, 0.000942f, 0.024374f, 0.029908f, 0.005806f, -0.027250f, 0.091430f, 0.045894f, + 0.013079f, -0.045877f, 0.030231f, -0.001839f, 0.034317f, -0.043825f, -0.029734f, 0.023006f, 0.068435f, -0.078370f, 0.003543f, 0.025006f, 0.008647f, -0.019516f, -0.011203f, -0.010140f, 0.003478f, -0.004277f, 0.017971f, 0.085521f, 0.005870f, -0.039115f, 0.058064f, -0.013806f, -0.055471f, -0.072335f, 0.068901f, 0.022083f, -0.009198f, 0.025190f, 0.016177f, 0.056693f, -0.077104f, -0.008570f, -0.039061f, -0.011562f, 0.044573f, -0.033014f, 0.017558f, -0.038018f, 0.018466f, 0.117922f, 0.009255f, -0.068138f, -0.075726f, -0.005117f, 0.036497f, 0.035104f, -0.030193f, 0.006915f, 0.057857f, -0.024634f, -0.111212f, 0.063092f, -0.038180f, -0.063890f, 0.028085f, 0.105219f, -0.072802f, 0.052757f, 0.073947f, 0.024888f, -0.063614f, -0.053828f, -0.032592f, 0.026035f, 0.023271f, -0.022614f, 0.066375f, 0.031732f, -0.003940f, -0.002465f, 0.004183f, -0.055810f, -0.020890f, -0.039677f, 0.020328f, 0.017258f, 0.013334f, 0.017432f, 0.013743f, 0.040109f, -0.020176f, -0.010542f, 0.007979f, -0.000453f, -0.031267f, 0.026537f, -0.001037f, 0.016404f, -0.007708f, 0.012203f, -0.020096f, -0.006823f, -0.012070f, 0.018516f, + 0.003762f, 0.003316f, 0.000662f, 0.010897f, 0.029986f, -0.012443f, -0.056922f, 0.004049f, -0.028062f, -0.006132f, 0.017123f, -0.024768f, -0.015619f, 0.031762f, -0.030247f, -0.007396f, 0.000298f, 0.014903f, -0.032404f, 0.001652f, 0.096636f, 0.031811f, 0.006405f, -0.007079f, 0.015316f, 0.027199f, -0.008668f, 0.012693f, -0.014642f, -0.000130f, -0.011574f, 0.045396f, -0.050943f, -0.005713f, 0.030439f, -0.070737f, 0.022884f, -0.017254f, 0.005318f, -0.008271f, -0.019818f, 0.012661f, -0.005488f, -0.028799f, 0.077497f, -0.059145f, -0.016669f, 0.055055f, -0.035303f, -0.005377f, -0.011155f, 0.012132f, 0.054421f, 0.004262f, -0.053154f, 0.072841f, -0.039375f, 0.025975f, 0.045337f, 0.020248f, -0.016989f, 0.004054f, -0.040046f, 0.009814f, -0.024274f, -0.019017f, 0.097471f, -0.022623f, -0.038931f, 0.012746f, -0.018213f, 0.023202f, -0.015215f, 0.025473f, 0.062693f, -0.034464f, 0.020713f, 0.047983f, -0.056419f, 0.025863f, 0.030604f, 0.014075f, 0.038320f, -0.043705f, -0.011594f, 0.067090f, -0.046338f, -0.010156f, 0.019078f, -0.018720f, 0.063898f, -0.063503f, 0.010735f, 0.022947f, -0.029429f, 0.022321f, + 0.024381f, -0.060477f, 0.021473f, 0.051614f, -0.000627f, -0.015485f, -0.002504f, 0.033209f, -0.006926f, -0.056794f, 0.046124f, 0.021927f, -0.025035f, 0.009485f, -0.013827f, 0.020506f, -0.008061f, -0.025417f, 0.029873f, 0.001677f, -0.006581f, -0.022100f, 0.020739f, 0.003958f, -0.029528f, 0.010538f, 0.019684f, -0.004077f, -0.009706f, 0.004316f, 0.018192f, -0.002701f, -0.019021f, 0.019383f, 0.012625f, 0.002366f, -0.001022f, 0.016204f, 0.003059f, 0.005682f, -0.022599f, 0.028635f, -0.015836f, 0.030538f, -0.020172f, -0.054524f, -0.147181f, -0.231294f, 0.020945f, 0.221508f, 0.018094f, 0.501468f, 0.517584f, 0.257690f, 0.541846f, 0.361411f, -0.075113f, -0.007846f, -0.119368f, -0.435145f, -0.382049f, -0.236164f, -0.444638f, -0.347993f, -0.101312f, -0.218121f, -0.182698f, 0.064543f, 0.109132f, -0.053060f, 0.028390f, 0.097470f, -0.075438f, -0.044198f, 0.137321f, 0.121981f, 0.013769f, 0.136344f, 0.232754f, 0.077629f, 0.168272f, 0.318567f, 0.152791f, 0.080549f, 0.285316f, 0.238472f, 0.031470f, 0.171148f, 0.334363f, 0.065901f, 0.078398f, 0.270002f, 0.116056f, -0.029712f, 0.190685f, 0.179972f, + -0.017407f, 0.158795f, 0.205105f, -0.004030f, -0.151337f, -0.070891f, -0.354687f, -0.585406f, -0.520799f, -0.555260f, -0.847686f, -0.761529f, -0.712754f, -0.866665f, -0.842146f, -0.691112f, -0.623364f, -0.560944f, -0.325398f, -0.125972f, 0.108129f, 0.231861f, 0.445199f, 0.664580f, 0.725576f, 0.808445f, 1.055279f, 1.041443f, 0.818958f, 0.896082f, 0.791960f, 0.326676f, 0.356052f, 0.302264f, -0.014925f, -0.051910f, 0.085980f, -0.014508f, -0.138666f, 0.015322f, 0.089299f, -0.090931f, -0.037644f, 0.078497f, -0.045513f, -0.175918f, -0.059985f, -0.049696f, -0.253620f, -0.180658f, -0.050950f, -0.199779f, -0.225922f, -0.018709f, -0.082370f, -0.228703f, -0.111820f, -0.105584f, -0.320417f, -0.304100f, -0.276040f, -0.494536f, -0.534400f, -0.446440f, -0.475987f, -0.513380f, -0.369195f, -0.315711f, -0.274720f, -0.200429f, -0.110368f, -0.052702f, -0.018241f, 0.035477f, 0.168505f, 0.231976f, 0.360890f, 0.592151f, 0.670360f, 0.742139f, 0.867896f, 0.847782f, 0.745922f, 0.634404f, 0.443064f, 0.187333f, 0.042649f, -0.051795f, -0.149608f, -0.174977f, -0.172084f, -0.174410f, -0.178294f, -0.167344f, -0.152175f, -0.163871f, + -0.167602f, -0.159579f, -0.170680f, -0.186716f, -0.178502f, -0.172124f, -0.167763f, -0.147889f, -0.113005f, -0.085041f, -0.056165f, -0.017091f, 0.012072f, 0.025351f, 0.034693f, 0.036761f, 0.030277f, 0.026742f, 0.020038f, 0.004657f, -0.008119f, -0.019614f, -0.033713f, -0.038042f, -0.037754f, -0.041682f, -0.040862f, -0.034252f, -0.033299f, -0.029760f, -0.019591f, -0.019444f, -0.021303f, -0.012252f, -0.008425f, -0.012469f, -0.005068f, -0.002648f, -0.005738f, 0.007912f, 0.021724f, 0.026241f, 0.040905f, 0.056444f, 0.063633f, 0.073921f, 0.085406f, 0.087361f, 0.086370f, 0.090139f, 0.089726f, 0.084724f, 0.079591f, 0.072134f, 0.059702f, 0.047827f, 0.039147f, 0.027467f, 0.015083f, 0.003656f, -0.010385f, -0.027003f, -0.040921f, -0.054383f, -0.065144f, -0.074689f, -0.080398f, -0.080705f, -0.077920f, -0.070407f, -0.056879f, -0.044273f, -0.032880f, -0.022626f, -0.014521f, -0.011379f, -0.007523f, -0.004478f, -0.002896f, -0.001880f, 0.000469f, 0.001393f, 0.002397f, 0.003059f, 0.004354f, 0.004319f, 0.004711f, 0.004393f, 0.004343f, 0.003223f, 0.002655f, 0.001463f, 0.000762f} + }, + { + {0.003003f, 0.012045f, -0.006014f, 0.003344f, -0.001272f, 0.000710f, 0.000534f, -0.004838f, -0.005545f, 0.003623f, -0.001039f, -0.004410f, -0.005686f, -0.003469f, 0.004950f, -0.000507f, 0.006654f, 0.001417f, -0.008517f, -0.008752f, -0.006255f, 0.002568f, 0.002133f, 0.004553f, -0.000712f, 0.005209f, -0.004009f, -0.000726f, -0.009210f, -0.001402f, -0.001746f, 0.001903f, 0.003417f, 0.003472f, 0.006742f, -0.003367f, -0.004573f, 0.003674f, 0.002034f, -0.004418f, -0.004549f, 0.000217f, 0.003117f, 0.001516f, 0.007489f, -0.002859f, -0.002422f, 0.008533f, 0.002570f, 0.015993f, 0.006759f, -0.004487f, -0.000192f, -0.009843f, 0.000146f, -0.011220f, -0.000779f, -0.004198f, 0.007713f, 0.000817f, 0.004122f, 0.005676f, 0.003033f, 0.005442f, 0.003581f, 0.000770f, -0.009454f, -0.001050f, -0.004759f, 0.006486f, 0.009431f, -0.006649f, -0.004772f, -0.002862f, -0.003878f, -0.005019f, -0.008113f, -0.001837f, 0.002376f, -0.004762f, -0.003977f, -0.001681f, -0.006679f, 0.000765f, -0.001380f, -0.004484f, 0.001385f, 0.000234f, -0.000073f, -0.002211f, 0.000348f, 0.000412f, 0.002419f, -0.000691f, 0.001544f, -0.000824f, + 0.001103f, -0.000326f, -0.001540f, 0.000402f, 0.001888f, 0.000322f, -0.001789f, -0.001794f, -0.000235f, 0.003298f, 0.000714f, -0.000645f, 0.000480f, -0.000977f, -0.001119f, -0.018876f, -0.020171f, -0.001607f, -0.005782f, 0.000772f, -0.004373f, -0.001193f, 0.011231f, -0.002011f, 0.006040f, -0.002778f, -0.005392f, -0.007462f, 0.001374f, -0.001546f, -0.008903f, 0.010265f, 0.003089f, 0.000702f, 0.005478f, 0.005219f, 0.008471f, 0.005961f, -0.000558f, -0.006304f, 0.005886f, 0.001367f, -0.008490f, -0.003756f, -0.003827f, -0.002548f, 0.007596f, -0.002604f, -0.012948f, -0.004390f, -0.001478f, 0.002702f, -0.004023f, -0.008430f, 0.000278f, -0.000825f, 0.009793f, 0.001448f, -0.000076f, 0.003574f, -0.000222f, 0.013208f, -0.002277f, 0.001214f, -0.002918f, -0.005243f, 0.000007f, 0.005672f, 0.002566f, 0.001547f, 0.005362f, -0.004920f, -0.008195f, -0.005864f, -0.001180f, 0.001078f, -0.001913f, 0.000234f, -0.006152f, -0.001362f, 0.003223f, -0.001963f, 0.006416f, 0.003349f, -0.000364f, 0.001191f, -0.006019f, -0.005124f, 0.009955f, 0.002263f, 0.004239f, 0.002890f, -0.001774f, -0.000584f, -0.007568f, 0.000535f, + -0.004326f, 0.001859f, -0.001479f, 0.001928f, 0.002047f, 0.005858f, -0.000615f, -0.002044f, 0.000339f, 0.001257f, 0.000777f, 0.000214f, 0.000199f, -0.001761f, -0.001398f, 0.000715f, -0.000648f, -0.001516f, 0.002369f, -0.001199f, 0.001210f, 0.001816f, -0.001727f, -0.000505f, 0.001356f, -0.000512f, 0.002440f, -0.001471f, 0.001203f, -0.001170f, -0.000873f, -0.003062f, 0.002868f, 0.013007f, -0.000676f, 0.006658f, 0.003980f, 0.008894f, 0.010991f, -0.002518f, 0.000945f, 0.006720f, 0.006707f, 0.004437f, 0.012577f, 0.002528f, -0.004046f, 0.000536f, 0.011015f, 0.003853f, 0.005230f, 0.009503f, 0.012838f, 0.008435f, -0.002846f, -0.008758f, 0.006221f, 0.004207f, -0.005010f, -0.008454f, 0.000515f, -0.004932f, 0.002310f, 0.003251f, -0.003032f, -0.004209f, 0.004310f, 0.003377f, 0.007608f, -0.005034f, -0.010237f, -0.005145f, -0.004399f, -0.006842f, -0.002325f, -0.007817f, 0.004753f, -0.010707f, 0.004667f, 0.000943f, 0.002537f, -0.004741f, 0.010306f, 0.007851f, -0.007191f, 0.009042f, 0.003443f, -0.001294f, 0.003024f, -0.006486f, -0.002028f, 0.006203f, 0.002249f, 0.002628f, 0.001674f, 0.007405f, + 0.003043f, 0.009146f, -0.004401f, -0.000493f, -0.000525f, 0.003589f, 0.005334f, -0.002037f, 0.003573f, -0.004709f, 0.002486f, 0.003262f, 0.002947f, 0.010049f, 0.000447f, 0.007519f, 0.008424f, 0.004761f, -0.007518f, -0.001380f, -0.001099f, -0.001905f, 0.000767f, 0.004314f, -0.001662f, 0.000222f, -0.000220f, 0.000577f, 0.001634f, -0.001144f, 0.001907f, 0.003014f, -0.001933f, -0.000986f, 0.002882f, 0.000203f, 0.000141f, -0.000031f, -0.001461f, 0.000806f, -0.000645f, 0.000344f, 0.002273f, 0.003628f, 0.000284f, -0.000353f, 0.001907f, 0.001484f, 0.000698f, 0.000944f, 0.000823f, 0.000994f, 0.000019f, -0.000349f, 0.001715f, 0.002044f, -0.001601f, 0.001146f, -0.000469f, 0.001662f, 0.002041f, 0.000302f, 0.000511f, 0.002152f, 0.000123f, 0.000043f, -0.000273f, 0.001016f, 0.036348f, 0.000031f, 0.032214f, 0.002302f, 0.020499f, -0.004614f, -0.003221f, 0.005272f, -0.014842f, 0.016244f, -0.009128f, 0.010810f, 0.008427f, -0.006309f, 0.005079f, -0.000708f, 0.000868f, -0.003056f, 0.004847f, 0.006262f, 0.008343f, 0.013076f, 0.003502f, 0.003995f, -0.000274f, 0.015425f, -0.017773f, 0.000178f, + -0.001138f, 0.004064f, 0.007884f, -0.009737f, 0.003862f, 0.004020f, 0.002433f, 0.006016f, 0.003624f, -0.007574f, 0.003710f, 0.013779f, -0.002410f, 0.004037f, -0.002152f, -0.002443f, -0.000458f, -0.010340f, 0.015753f, -0.000501f, 0.001717f, 0.011365f, -0.001434f, 0.000638f, 0.014615f, -0.021415f, 0.005996f, -0.000656f, 0.006514f, 0.016862f, 0.005289f, 0.003880f, 0.006109f, -0.002115f, -0.004617f, -0.003499f, 0.004350f, 0.001305f, 0.009353f, -0.003584f, 0.007712f, 0.003267f, -0.002428f, 0.001295f, -0.005900f, -0.004178f, 0.000941f, -0.002028f, -0.008206f, -0.005558f, -0.008402f, 0.004796f, 0.007661f, -0.002286f, 0.002442f, -0.002024f, -0.005556f, -0.000492f, 0.003231f, 0.002892f, -0.010066f, -0.000671f, 0.001048f, -0.001812f, 0.000671f, -0.002342f, 0.000300f, -0.002499f, -0.004807f, -0.000342f, -0.003154f, -0.002857f, -0.003963f, -0.000069f, -0.003876f, -0.001473f, -0.003760f, -0.003168f, -0.000045f, -0.001634f, -0.001968f, -0.000464f, 0.000591f, 0.001616f, -0.001986f, -0.000210f, 0.000718f, -0.014518f, -0.017626f, -0.007126f, -0.002564f, -0.006729f, 0.014283f, 0.005970f, -0.011224f, 0.012533f, + -0.001669f, -0.009295f, 0.002849f, 0.005410f, -0.005026f, -0.008500f, -0.007478f, -0.016082f, -0.007974f, 0.006824f, -0.010039f, -0.016327f, 0.004683f, 0.006492f, 0.001410f, -0.006057f, 0.012277f, 0.001426f, 0.011359f, -0.000783f, -0.002488f, 0.006354f, 0.010768f, -0.015241f, -0.007123f, 0.004061f, -0.003299f, 0.003646f, -0.009818f, -0.000792f, 0.002776f, 0.003526f, -0.008365f, -0.015471f, -0.004238f, 0.004431f, -0.002508f, -0.002005f, 0.001035f, 0.004920f, -0.001425f, 0.002706f, -0.005092f, 0.008878f, -0.011629f, -0.008825f, -0.002968f, -0.008645f, -0.002477f, -0.002374f, 0.003523f, -0.006353f, 0.004862f, 0.009654f, -0.000741f, 0.002233f, 0.002715f, 0.004611f, 0.009575f, -0.003644f, -0.001719f, -0.001836f, -0.003831f, 0.009826f, -0.003911f, -0.017212f, -0.010868f, -0.007290f, 0.016604f, 0.000257f, 0.009569f, 0.004317f, 0.001535f, 0.002533f, -0.001041f, -0.000391f, 0.008047f, -0.002660f, -0.001709f, 0.002557f, -0.001290f, 0.001265f, -0.003457f, -0.002170f, 0.001923f, -0.000490f, 0.002106f, -0.000520f, 0.001286f, 0.002976f, 0.002242f, 0.002784f, 0.000122f, 0.001940f, -0.000326f, 0.002857f, + 0.003238f, 0.005095f, 0.003292f, 0.004047f, 0.001065f, 0.002706f, 0.002426f, 0.001684f, 0.002521f, 0.003362f, -0.001406f, 0.000277f, -0.000544f, -0.001408f, 0.001497f, 0.001999f, -0.004006f, -0.015705f, -0.036136f, -0.003492f, 0.002617f, 0.000275f, -0.011647f, -0.005318f, -0.013235f, -0.003554f, -0.015632f, -0.018136f, -0.013985f, -0.003385f, -0.009235f, -0.020427f, -0.012617f, 0.004082f, 0.006370f, -0.005735f, 0.012301f, 0.006634f, -0.004439f, 0.014938f, 0.003305f, 0.001115f, 0.002498f, -0.020754f, -0.000686f, 0.003300f, 0.007835f, -0.006619f, -0.005676f, 0.012148f, 0.023970f, -0.018027f, 0.006496f, -0.005406f, -0.000866f, -0.015909f, -0.001334f, -0.000328f, -0.007988f, -0.010350f, -0.007359f, -0.008830f, -0.004574f, 0.005003f, 0.017596f, -0.008359f, 0.006623f, 0.011699f, 0.010774f, -0.003790f, 0.001250f, -0.004011f, -0.003377f, -0.016353f, -0.007982f, 0.008998f, -0.005810f, 0.001815f, -0.005548f, 0.004445f, 0.002475f, -0.001967f, -0.000595f, -0.007735f, -0.006213f, 0.001232f, -0.002237f, 0.003134f, -0.019140f, -0.020449f, -0.002174f, -0.003157f, -0.008699f, -0.000244f, 0.006426f, -0.010158f, + -0.007667f, -0.008694f, -0.014744f, 0.010218f, -0.001077f, -0.002415f, 0.003991f, -0.000785f, 0.003577f, 0.006665f, 0.002370f, 0.003608f, 0.002166f, 0.004836f, -0.001534f, 0.000690f, 0.000794f, 0.000934f, 0.001645f, -0.001538f, -0.001284f, 0.000060f, 0.001527f, 0.001730f, -0.001281f, 0.001376f, -0.001851f, -0.003694f, 0.001845f, 0.001134f, -0.001413f, 0.004293f, 0.002006f, 0.000067f, 0.001700f, -0.002982f, -0.003016f, -0.001019f, -0.001626f, -0.001480f, -0.004022f, -0.000836f, -0.003184f, -0.022764f, -0.004178f, -0.027359f, -0.005824f, -0.019456f, -0.002040f, 0.003368f, 0.005141f, 0.020596f, -0.012755f, 0.004413f, 0.005879f, -0.011559f, -0.004855f, 0.016523f, 0.002030f, -0.005147f, 0.002357f, -0.014060f, 0.012783f, -0.017946f, -0.005597f, 0.007645f, 0.005160f, -0.002089f, 0.003271f, -0.003743f, 0.006045f, -0.007800f, -0.013047f, 0.000660f, 0.006679f, 0.005018f, -0.010386f, 0.002702f, 0.012196f, -0.012535f, -0.015330f, 0.012169f, -0.010377f, 0.007859f, -0.007401f, 0.004276f, -0.000071f, -0.011300f, -0.014141f, -0.009105f, 0.004161f, -0.000822f, 0.005615f, -0.007761f, -0.007088f, -0.018609f, + 0.009813f, -0.013409f, -0.005777f, 0.006901f, 0.016534f, -0.002362f, -0.003143f, -0.024283f, -0.018699f, -0.006560f, -0.006513f, 0.008790f, -0.002324f, -0.014330f, -0.002021f, 0.000494f, -0.007597f, -0.002175f, -0.016585f, 0.010958f, 0.004590f, 0.013884f, 0.017494f, 0.008848f, 0.000939f, 0.007269f, 0.015629f, -0.001531f, -0.003320f, -0.001303f, -0.004480f, -0.015556f, 0.001081f, 0.000882f, 0.003525f, 0.007952f, -0.003108f, 0.001564f, 0.000218f, -0.006270f, -0.003035f, 0.005350f, 0.005610f, 0.004847f, -0.003699f, 0.001288f, 0.002344f, 0.001696f, 0.002107f, 0.001994f, 0.000960f, 0.004013f, 0.004454f, 0.002634f, -0.000639f, 0.001718f, -0.000505f, 0.001440f, 0.003274f, 0.000840f, 0.001450f, -0.000170f, -0.000837f, -0.001199f, 0.000156f, -0.002901f, -0.001017f, 0.002738f, 0.013298f, 0.007081f, 0.038756f, 0.018860f, 0.025087f, -0.007704f, -0.001021f, -0.000339f, -0.038354f, 0.002092f, 0.016490f, -0.007505f, -0.003008f, 0.001401f, 0.024117f, -0.004005f, 0.013961f, -0.002777f, 0.013372f, 0.007452f, 0.016523f, 0.023354f, 0.002970f, 0.015626f, -0.004830f, 0.013539f, -0.001839f, 0.024994f, + 0.013230f, -0.000317f, 0.014151f, 0.011541f, -0.004206f, 0.011025f, 0.006561f, 0.009536f, -0.007462f, -0.005868f, -0.020129f, -0.001120f, 0.014259f, 0.002859f, 0.001811f, -0.004567f, -0.007529f, -0.005890f, -0.006637f, 0.035155f, -0.022533f, 0.009055f, 0.010646f, 0.006160f, 0.003032f, -0.013324f, -0.017882f, -0.004449f, -0.002659f, -0.000702f, -0.030985f, -0.015244f, -0.015923f, 0.000892f, -0.000722f, 0.009347f, -0.001006f, 0.008320f, 0.010998f, 0.019984f, 0.003659f, -0.004976f, 0.006692f, -0.012358f, 0.003433f, -0.009027f, 0.003356f, 0.007820f, 0.004360f, 0.012786f, -0.008523f, -0.009564f, 0.045499f, 0.006372f, 0.008271f, 0.005899f, 0.015454f, -0.010782f, -0.005634f, 0.009863f, -0.001112f, -0.000121f, 0.001805f, 0.003344f, 0.008932f, -0.004280f, -0.000664f, 0.001829f, 0.005149f, 0.001319f, -0.004687f, 0.008783f, 0.000336f, -0.001892f, 0.000213f, -0.000852f, -0.004609f, -0.004183f, -0.002014f, -0.004668f, 0.000002f, -0.001739f, 0.002115f, 0.006338f, -0.000560f, -0.000457f, -0.006799f, -0.001284f, 0.003379f, -0.000602f, 0.000419f, 0.000779f, 0.005374f, -0.002628f, -0.000794f, 0.001880f, + 0.002032f, -0.005789f, -0.005011f, 0.059780f, 0.006110f, 0.009142f, 0.006425f, -0.003447f, -0.024402f, 0.016541f, 0.016911f, -0.009383f, 0.007248f, 0.007983f, -0.014744f, -0.001785f, 0.013883f, 0.008371f, -0.025759f, 0.006713f, -0.007175f, -0.012825f, -0.000497f, 0.007705f, 0.001836f, -0.000029f, -0.000663f, 0.011220f, -0.003623f, 0.006415f, -0.020090f, 0.008186f, -0.002221f, 0.008037f, 0.004329f, -0.003431f, 0.014016f, -0.019159f, -0.008507f, -0.018923f, 0.016464f, 0.008062f, 0.026966f, 0.013603f, -0.000253f, 0.006008f, -0.022173f, -0.000017f, 0.006259f, 0.007183f, 0.006533f, 0.001628f, 0.003710f, -0.005671f, 0.006102f, 0.019642f, 0.026079f, 0.011503f, -0.012119f, -0.006450f, -0.002869f, -0.005056f, 0.009603f, 0.013393f, -0.009370f, 0.007969f, 0.014499f, 0.004616f, -0.020398f, -0.039836f, -0.019885f, 0.008118f, 0.017320f, -0.007436f, 0.005089f, -0.001425f, -0.003826f, -0.000060f, 0.018085f, 0.003419f, -0.015196f, 0.024750f, 0.011028f, -0.028554f, 0.001193f, -0.003386f, -0.009337f, -0.003159f, -0.004476f, 0.000024f, 0.009798f, 0.004211f, -0.007837f, -0.004067f, 0.005754f, 0.010695f, + -0.004860f, 0.008139f, 0.001987f, -0.006631f, -0.001827f, 0.001079f, 0.000162f, -0.001233f, 0.000473f, -0.003291f, -0.002509f, 0.002375f, 0.000574f, -0.002930f, -0.003250f, 0.000191f, -0.002123f, -0.004874f, 0.002941f, -0.001704f, -0.002633f, 0.001376f, 0.004996f, -0.005468f, -0.008716f, -0.000077f, -0.001339f, -0.012681f, -0.002265f, 0.003141f, -0.000079f, -0.007668f, -0.000981f, -0.002848f, 0.002385f, 0.001778f, 0.003929f, 0.003125f, -0.001264f, -0.001394f, -0.002431f, -0.006262f, -0.037016f, 0.011479f, 0.016814f, -0.019017f, 0.012123f, 0.021830f, -0.052463f, 0.011736f, 0.001727f, 0.011916f, -0.019875f, 0.029866f, -0.041496f, 0.000147f, -0.003423f, -0.002852f, -0.004690f, -0.011434f, -0.015985f, -0.002041f, 0.014216f, 0.002007f, -0.000071f, -0.007325f, 0.009867f, -0.001119f, -0.005539f, 0.008297f, 0.017664f, -0.011532f, 0.012611f, -0.001885f, 0.007475f, 0.004475f, 0.011821f, 0.019334f, -0.004814f, 0.005451f, -0.024858f, -0.011730f, -0.005491f, -0.008749f, -0.022677f, 0.002885f, -0.008539f, -0.013968f, 0.020905f, -0.019513f, -0.007106f, -0.008942f, -0.011249f, 0.015077f, -0.016988f, 0.009767f, + -0.006214f, 0.015479f, -0.008324f, 0.016904f, -0.022078f, -0.005665f, 0.002395f, 0.020368f, -0.035390f, -0.012706f, 0.000918f, 0.000475f, -0.006597f, 0.014413f, -0.018523f, -0.035123f, 0.007366f, -0.030787f, 0.015494f, -0.010716f, -0.000245f, -0.032212f, -0.013120f, 0.035638f, 0.019576f, -0.026071f, -0.022495f, -0.018350f, 0.000768f, 0.011082f, -0.004951f, -0.011459f, 0.022567f, 0.008568f, -0.004356f, -0.004608f, -0.008928f, -0.001418f, 0.008656f, -0.008037f, 0.009331f, -0.000784f, -0.007012f, 0.001567f, -0.005436f, 0.003876f, 0.007834f, -0.004531f, 0.003294f, 0.006300f, 0.003915f, -0.000402f, 0.009159f, -0.008703f, 0.008630f, -0.002228f, 0.007554f, -0.010177f, -0.005748f, 0.001852f, 0.000378f, 0.011143f, 0.003347f, 0.006809f, -0.003976f, -0.005948f, 0.003286f, -0.011712f, -0.001473f, -0.002251f, 0.004701f, -0.002225f, -0.002715f, -0.003645f, -0.026982f, -0.011554f, 0.033950f, 0.001451f, -0.028027f, 0.026389f, -0.012357f, 0.001771f, -0.029222f, 0.004509f, 0.011573f, -0.025754f, -0.006301f, -0.023014f, -0.000168f, 0.001482f, -0.007767f, -0.006380f, 0.022482f, 0.003474f, -0.015233f, 0.003835f, + -0.032634f, 0.019628f, 0.031097f, -0.010041f, 0.012988f, 0.022075f, -0.001644f, -0.004489f, 0.002719f, 0.002697f, 0.012929f, 0.002224f, 0.002995f, 0.006803f, -0.018234f, -0.001294f, -0.020961f, -0.021409f, -0.008779f, 0.009029f, 0.012739f, -0.000649f, -0.025216f, 0.004996f, 0.006633f, 0.012440f, 0.026995f, -0.027634f, 0.040504f, -0.033545f, 0.001502f, -0.006736f, -0.005796f, -0.016206f, -0.031129f, -0.042000f, -0.016277f, -0.004782f, 0.010732f, -0.003158f, 0.001771f, 0.006217f, -0.000279f, 0.029634f, 0.014033f, -0.030336f, -0.004709f, -0.000586f, 0.019412f, -0.020955f, 0.001434f, -0.042268f, 0.007960f, 0.033085f, -0.029507f, -0.011564f, 0.004222f, -0.000287f, 0.008306f, 0.046349f, 0.000734f, -0.006075f, 0.002453f, 0.023615f, -0.015967f, 0.006350f, 0.008666f, -0.003465f, -0.001666f, -0.000277f, -0.000574f, 0.010530f, -0.003384f, -0.002377f, -0.009036f, 0.015318f, -0.003260f, 0.004532f, 0.001592f, 0.002723f, 0.003873f, 0.011145f, -0.007681f, -0.001959f, 0.011838f, -0.008520f, -0.011988f, 0.009966f, 0.000543f, 0.004877f, 0.006764f, 0.003801f, 0.012249f, -0.009455f, 0.005737f, 0.006755f, + -0.004152f, 0.017256f, 0.005985f, 0.010561f, 0.003935f, -0.010372f, -0.003722f, -0.001752f, -0.001736f, -0.001835f, 0.005074f, -0.017237f, -0.035278f, 0.042157f, 0.017868f, -0.020494f, 0.027207f, 0.027431f, 0.038710f, -0.014191f, -0.013478f, 0.028441f, -0.004243f, -0.005478f, 0.009799f, 0.012721f, 0.004960f, 0.006156f, -0.038656f, -0.003962f, 0.000061f, 0.000464f, 0.002082f, -0.004219f, 0.016323f, 0.031889f, 0.003176f, 0.002321f, -0.000574f, 0.001673f, 0.029209f, 0.007925f, -0.002083f, -0.006224f, 0.007468f, 0.006632f, -0.004600f, 0.003523f, -0.016693f, -0.003313f, 0.025420f, -0.025058f, -0.012264f, -0.021584f, 0.028412f, -0.025854f, 0.013057f, -0.010478f, 0.008370f, -0.005474f, 0.006756f, -0.020729f, 0.004810f, 0.031763f, -0.020756f, 0.001844f, -0.055085f, -0.002256f, -0.019443f, 0.001689f, -0.051405f, -0.002076f, -0.002499f, -0.015665f, -0.011015f, 0.042193f, -0.045025f, 0.007724f, -0.012141f, -0.016606f, 0.012167f, -0.015039f, -0.035154f, -0.024480f, 0.003467f, 0.002072f, 0.007321f, -0.017226f, -0.023645f, 0.013716f, 0.001199f, 0.002858f, 0.015850f, -0.026061f, 0.019763f, -0.018895f, + -0.008907f, -0.007994f, 0.004753f, 0.000908f, 0.005695f, -0.003169f, -0.006634f, 0.001870f, -0.003739f, 0.005767f, 0.012343f, 0.007377f, 0.004594f, 0.003699f, 0.003402f, 0.003483f, -0.001239f, 0.013572f, 0.002609f, -0.002328f, 0.010037f, 0.010456f, 0.003909f, -0.005450f, -0.000487f, -0.008054f, 0.013381f, 0.004947f, 0.010780f, -0.005007f, 0.011064f, 0.010008f, 0.014458f, 0.007289f, -0.003967f, -0.007279f, 0.012173f, 0.002678f, 0.010546f, 0.002595f, 0.002917f, 0.002973f, 0.003217f, 0.035719f, 0.011960f, -0.004213f, 0.007174f, -0.017228f, -0.019070f, -0.014830f, 0.033902f, -0.030275f, -0.038627f, 0.018718f, -0.035974f, 0.013608f, 0.000929f, 0.010112f, -0.016332f, -0.003410f, -0.019785f, -0.007785f, -0.015379f, 0.007605f, 0.017210f, 0.012596f, -0.029153f, 0.033764f, 0.003585f, 0.012054f, 0.002582f, 0.016457f, -0.003923f, 0.015819f, 0.003314f, -0.006510f, 0.009374f, 0.003965f, 0.012574f, 0.009354f, -0.022268f, 0.009108f, -0.006879f, 0.006498f, -0.004937f, -0.007769f, -0.007243f, -0.014943f, 0.013736f, 0.015590f, 0.015432f, -0.002654f, 0.028656f, 0.035189f, 0.013421f, 0.004882f, + 0.015289f, 0.036449f, 0.017296f, 0.039727f, 0.024778f, 0.029685f, -0.032146f, -0.031512f, 0.005902f, -0.006176f, -0.009135f, 0.002751f, -0.016499f, 0.013486f, 0.009299f, 0.006473f, 0.029425f, -0.006805f, -0.020033f, -0.016036f, -0.014981f, 0.003730f, -0.007477f, -0.064247f, -0.028685f, -0.024874f, -0.009765f, -0.012819f, -0.007426f, -0.009575f, -0.018968f, 0.000870f, -0.011675f, -0.010350f, 0.003597f, -0.010392f, -0.004009f, -0.016081f, 0.000266f, 0.001013f, -0.003266f, -0.023005f, 0.008860f, 0.000082f, 0.000404f, -0.017283f, 0.004561f, 0.006320f, 0.006012f, 0.002023f, 0.019514f, -0.012962f, -0.005699f, 0.004230f, 0.001501f, -0.001385f, 0.007617f, -0.009175f, -0.008580f, -0.001617f, 0.013617f, -0.001414f, 0.009704f, 0.011933f, -0.003287f, -0.014907f, -0.014126f, -0.001596f, 0.014214f, 0.001166f, -0.011466f, 0.001515f, -0.003118f, -0.007299f, -0.006213f, -0.002341f, 0.000075f, -0.011203f, -0.010270f, 0.009694f, 0.028281f, 0.019880f, -0.063207f, -0.045987f, -0.014843f, -0.000204f, 0.020304f, -0.008233f, -0.001870f, -0.049605f, 0.006686f, -0.025802f, 0.018311f, -0.003262f, 0.024389f, -0.020876f, + -0.005675f, -0.024846f, 0.003992f, 0.020906f, -0.010219f, 0.006338f, -0.014808f, 0.001410f, -0.034135f, -0.009046f, -0.002001f, 0.002733f, 0.024663f, 0.032871f, 0.000765f, -0.029623f, -0.021410f, -0.009388f, 0.002708f, -0.007634f, 0.009161f, -0.034108f, -0.011027f, -0.004461f, -0.009278f, -0.019065f, -0.004880f, -0.008665f, 0.023057f, 0.034193f, 0.022572f, 0.008594f, 0.013660f, 0.014449f, -0.016710f, 0.056948f, 0.034078f, -0.044550f, -0.039027f, 0.041875f, -0.033101f, -0.018745f, 0.006115f, 0.004781f, -0.032134f, 0.030995f, 0.001705f, -0.095944f, 0.025425f, 0.060446f, -0.042037f, 0.041684f, 0.055321f, -0.018415f, -0.006052f, 0.029808f, -0.035012f, -0.022914f, 0.011306f, -0.018835f, -0.022000f, 0.025275f, -0.042411f, -0.012755f, 0.005136f, 0.001020f, 0.002118f, -0.004020f, 0.015165f, -0.010998f, 0.006326f, 0.002299f, -0.011468f, 0.022322f, 0.011117f, -0.000715f, -0.014500f, 0.017218f, -0.011081f, 0.013287f, -0.011777f, 0.016160f, 0.001400f, 0.003350f, 0.016090f, -0.012685f, -0.014518f, 0.004294f, -0.013415f, -0.008094f, -0.000901f, 0.001401f, -0.009025f, -0.015762f, 0.007190f, -0.037000f, + -0.000303f, 0.017030f, -0.013945f, 0.010026f, -0.004473f, 0.005031f, -0.015783f, 0.000361f, 0.008205f, -0.007267f, 0.005279f, 0.033203f, -0.015066f, -0.013929f, 0.032401f, -0.023635f, -0.004232f, 0.027462f, -0.019530f, -0.012452f, 0.020676f, 0.012675f, 0.013597f, -0.003368f, -0.020124f, -0.016169f, 0.019124f, -0.015198f, -0.001324f, 0.005663f, -0.028466f, 0.018596f, 0.015271f, -0.011544f, -0.009255f, -0.022266f, 0.000703f, -0.013756f, 0.019381f, -0.031258f, 0.002502f, 0.012057f, -0.001540f, -0.014827f, -0.032314f, -0.007227f, -0.013975f, -0.003073f, -0.024959f, 0.034337f, -0.033283f, 0.005958f, -0.011993f, 0.008723f, -0.047185f, 0.048937f, 0.009466f, 0.005011f, -0.019340f, 0.011269f, 0.008155f, 0.002284f, 0.004651f, -0.008560f, -0.037152f, -0.006311f, -0.015950f, -0.023792f, -0.031871f, -0.011406f, -0.007849f, -0.031706f, -0.011956f, -0.001294f, 0.022311f, 0.010365f, -0.028607f, -0.025030f, 0.015838f, -0.006411f, -0.036369f, -0.015594f, 0.009314f, 0.030408f, 0.030307f, 0.030727f, 0.048999f, -0.009116f, -0.032671f, -0.031296f, -0.001657f, 0.021636f, 0.038267f, 0.017305f, 0.008514f, -0.038393f, + 0.022144f, 0.008382f, 0.037367f, 0.025971f, 0.017154f, 0.012960f, 0.000415f, 0.003580f, 0.022184f, -0.004868f, 0.001949f, 0.004163f, 0.006724f, 0.007798f, 0.007445f, 0.010839f, 0.026584f, 0.008549f, 0.002356f, 0.009327f, -0.000182f, 0.008729f, 0.002870f, 0.001892f, 0.016695f, -0.019356f, -0.013551f, -0.004855f, 0.007804f, -0.009612f, 0.006945f, -0.003984f, 0.020919f, 0.001145f, 0.003889f, -0.010287f, -0.012786f, 0.001554f, 0.012407f, -0.010842f, -0.000772f, 0.014232f, -0.010892f, -0.000239f, 0.006999f, -0.019351f, 0.024671f, 0.013421f, -0.003777f, 0.006244f, -0.000373f, 0.000211f, -0.005261f, 0.014159f, -0.003681f, 0.023473f, 0.060368f, -0.053163f, -0.002429f, -0.020717f, -0.029444f, -0.016326f, 0.027134f, -0.014563f, -0.017524f, 0.015105f, 0.035181f, 0.023447f, -0.027984f, 0.018224f, -0.029327f, 0.021612f, 0.000255f, -0.002499f, -0.014668f, -0.020507f, -0.018010f, 0.004273f, 0.002970f, -0.032856f, 0.020348f, 0.004170f, -0.003955f, -0.012082f, -0.015159f, 0.024444f, -0.033476f, -0.000915f, 0.034469f, 0.042248f, -0.038265f, -0.001898f, -0.008363f, -0.023588f, -0.032214f, 0.034778f, + 0.006834f, 0.022307f, -0.007661f, 0.003210f, -0.003914f, 0.022189f, -0.009395f, 0.001700f, -0.027777f, 0.038969f, 0.031097f, -0.046374f, -0.058277f, -0.011654f, -0.000285f, -0.018382f, 0.000950f, -0.013550f, 0.003413f, -0.028631f, 0.029860f, -0.036952f, -0.033733f, -0.011786f, 0.004433f, 0.026231f, -0.014458f, 0.037808f, 0.002974f, -0.012962f, -0.013755f, -0.009432f, -0.024513f, 0.023161f, 0.016052f, -0.005833f, 0.013425f, 0.011652f, -0.019401f, -0.018084f, -0.016590f, 0.029313f, 0.006699f, -0.020435f, 0.001791f, 0.008475f, 0.008921f, -0.030652f, 0.015094f, 0.012635f, 0.005150f, -0.000061f, -0.009359f, 0.004373f, -0.010172f, -0.027290f, 0.005078f, -0.003438f, -0.005622f, -0.003012f, 0.002098f, -0.008147f, -0.011129f, -0.000388f, -0.004425f, 0.013926f, -0.007942f, -0.003663f, 0.007346f, -0.003535f, -0.013567f, 0.010994f, -0.013526f, -0.004099f, -0.023116f, 0.012150f, 0.001821f, -0.003116f, 0.003422f, -0.010017f, 0.019469f, -0.001200f, 0.002852f, 0.022689f, 0.015666f, -0.006221f, -0.007922f, 0.010931f, 0.005558f, -0.007731f, 0.003825f, -0.007103f, -0.007104f, -0.001365f, 0.004552f, -0.004212f, + -0.001555f, -0.083741f, 0.123641f, -0.085228f, -0.020705f, 0.021331f, 0.067147f, 0.052994f, -0.019072f, -0.022465f, 0.004326f, 0.002186f, 0.035003f, 0.011715f, -0.044470f, 0.012687f, -0.009013f, -0.016798f, 0.005202f, 0.017618f, 0.000493f, -0.034826f, -0.029174f, 0.014930f, 0.013663f, 0.020063f, -0.010754f, 0.025049f, 0.006765f, 0.029534f, -0.002455f, -0.011297f, 0.023230f, -0.003639f, -0.023392f, 0.003284f, 0.028668f, -0.002116f, -0.031254f, 0.014938f, 0.037871f, -0.035196f, 0.014202f, -0.037741f, 0.015241f, -0.047449f, -0.029730f, 0.050309f, 0.048434f, 0.021522f, 0.062870f, -0.012874f, 0.074923f, 0.026684f, 0.029289f, 0.038966f, -0.066614f, 0.055796f, 0.020017f, 0.022022f, 0.026824f, 0.005343f, -0.032201f, 0.004435f, 0.063303f, 0.070465f, -0.000227f, -0.081727f, 0.040337f, 0.001280f, 0.017510f, -0.003705f, 0.002519f, -0.018511f, -0.060321f, 0.011398f, -0.009536f, 0.012825f, -0.010772f, 0.029272f, -0.033670f, -0.037617f, -0.025270f, 0.004445f, -0.010581f, -0.017409f, 0.020206f, 0.006868f, -0.025755f, -0.028713f, -0.021479f, -0.017253f, -0.002424f, -0.005212f, 0.015032f, -0.001228f, + -0.022036f, 0.017003f, 0.004005f, -0.006359f, 0.001453f, 0.007997f, -0.010779f, -0.006300f, 0.011626f, -0.020509f, -0.007965f, -0.014241f, 0.012009f, 0.013831f, -0.016168f, 0.004308f, -0.044076f, 0.000309f, 0.002598f, 0.001902f, -0.008286f, -0.008852f, -0.019676f, -0.015562f, 0.010588f, 0.006126f, 0.010167f, 0.015169f, -0.014430f, 0.000864f, 0.006418f, 0.003652f, -0.014138f, -0.000200f, 0.004020f, -0.000769f, -0.011540f, -0.001955f, -0.002716f, 0.080985f, -0.002772f, -0.096768f, -0.048584f, -0.057039f, -0.021476f, 0.000328f, 0.032110f, -0.082484f, -0.018185f, 0.012797f, -0.038115f, -0.044334f, -0.039978f, -0.044251f, -0.006843f, 0.048567f, 0.025278f, -0.019426f, 0.023671f, 0.009479f, -0.022036f, 0.025019f, -0.027902f, -0.006341f, 0.012028f, 0.016534f, -0.055688f, 0.028032f, -0.027255f, 0.015948f, -0.010733f, -0.045031f, 0.012763f, 0.013898f, 0.007223f, 0.007326f, -0.018400f, -0.063873f, 0.002856f, 0.013120f, 0.014167f, 0.000585f, 0.008225f, -0.026543f, -0.000052f, -0.002311f, 0.058209f, -0.008969f, -0.095032f, -0.043107f, -0.010089f, -0.079219f, 0.018291f, -0.024240f, -0.019941f, -0.038210f, + -0.016820f, -0.057044f, -0.055598f, -0.068587f, -0.006557f, 0.072091f, 0.010175f, -0.045706f, 0.021291f, 0.000585f, -0.004801f, -0.025728f, -0.035830f, 0.015107f, 0.029969f, 0.022576f, 0.012549f, -0.013715f, -0.058184f, -0.041733f, -0.058577f, 0.008617f, 0.006686f, -0.002091f, 0.021160f, -0.031023f, -0.037249f, -0.005314f, -0.013695f, -0.038319f, 0.008522f, 0.022031f, 0.003199f, 0.008056f, 0.036958f, -0.006640f, -0.007521f, -0.006303f, 0.002521f, -0.013210f, -0.007240f, 0.016455f, 0.025244f, 0.027513f, 0.018603f, -0.007600f, 0.001305f, 0.004312f, -0.011431f, 0.025493f, -0.010382f, 0.037197f, -0.013026f, 0.017483f, -0.017693f, -0.004905f, 0.037779f, 0.012560f, 0.005209f, -0.000131f, -0.014744f, 0.014924f, 0.003267f, -0.018307f, 0.008345f, -0.015646f, -0.020183f, 0.005929f, 0.006075f, -0.012393f, -0.012115f, 0.012977f, 0.000720f, 0.018211f, 0.003934f, 0.012453f, -0.006687f, 0.005574f, 0.005139f, 0.001960f, 0.053915f, -0.006694f, 0.043270f, 0.055001f, -0.046492f, -0.059055f, -0.061468f, 0.015868f, 0.021937f, -0.085066f, -0.048660f, 0.001329f, 0.002689f, 0.025142f, -0.098278f, 0.010156f, + 0.023014f, 0.067944f, -0.078701f, 0.008953f, 0.013158f, -0.010240f, 0.043731f, -0.025472f, 0.076471f, -0.004616f, 0.006905f, 0.022574f, 0.029799f, -0.029271f, -0.061449f, 0.035452f, 0.043652f, 0.009573f, 0.055181f, 0.010213f, -0.006865f, -0.021062f, -0.046437f, 0.071579f, -0.032129f, 0.067805f, 0.027087f, -0.005553f, 0.020312f, -0.029389f, 0.037025f, 0.035995f, -0.025393f, 0.026631f, 0.013952f, -0.072133f, 0.052276f, 0.052583f, -0.006618f, -0.037054f, 0.007003f, -0.002310f, 0.002412f, -0.013436f, 0.098681f, -0.002388f, -0.057144f, -0.032617f, 0.011263f, -0.083144f, -0.108097f, 0.014246f, 0.135392f, 0.029343f, -0.009488f, -0.086999f, -0.021868f, -0.014931f, 0.092282f, -0.063663f, -0.040356f, -0.152511f, -0.021950f, -0.028399f, -0.035744f, -0.029085f, 0.055870f, 0.059010f, -0.059348f, -0.023658f, 0.019627f, 0.007665f, -0.010830f, 0.023885f, -0.010421f, -0.019350f, -0.018663f, 0.020498f, 0.008437f, 0.006257f, -0.007552f, 0.020081f, -0.021343f, -0.007844f, 0.018232f, 0.007827f, -0.001216f, -0.001416f, -0.015940f, 0.007133f, -0.010586f, 0.038801f, -0.010800f, -0.021996f, -0.017585f, -0.034278f, + -0.011470f, 0.025412f, 0.029323f, 0.079529f, 0.030444f, -0.009672f, -0.061147f, -0.085069f, -0.039616f, 0.000691f, 0.034508f, 0.027393f, -0.022604f, -0.034222f, -0.017156f, -0.014366f, 0.020878f, 0.035773f, 0.007959f, 0.001466f, -0.004651f, -0.013565f, -0.011076f, -0.010412f, -0.001966f, -0.004859f, -0.005191f, 0.004276f, -0.009234f, 0.003084f, 0.001222f, 0.002248f, -0.007034f, -0.001465f, -0.005276f, -0.004833f, -0.006879f, 0.004034f, -0.004390f, 0.007406f, -0.135689f, 0.039986f, 0.064458f, -0.086019f, -0.008234f, 0.049532f, -0.021371f, -0.038230f, 0.034520f, -0.036851f, -0.021004f, 0.003728f, -0.028716f, 0.046663f, -0.015782f, -0.020048f, -0.008322f, 0.025075f, 0.082541f, -0.012024f, -0.038471f, -0.041732f, 0.015067f, 0.040501f, 0.023400f, -0.036770f, -0.006208f, 0.045983f, 0.000952f, -0.033234f, 0.011060f, -0.029561f, 0.076367f, -0.033744f, -0.083268f, 0.029573f, -0.014209f, 0.040528f, -0.055852f, -0.053804f, 0.054703f, -0.003515f, -0.071409f, -0.036932f, -0.068233f, 0.088987f, 0.042264f, 0.024666f, -0.092983f, 0.017408f, 0.038116f, -0.064154f, 0.003663f, -0.045829f, -0.035599f, 0.037257f, + -0.031663f, 0.042620f, -0.026173f, -0.055614f, -0.012889f, -0.013090f, -0.008482f, 0.020351f, 0.006673f, -0.034403f, 0.109659f, -0.012614f, 0.048616f, 0.050779f, 0.030345f, -0.014076f, 0.011530f, -0.024047f, 0.061697f, 0.016063f, -0.015574f, 0.008228f, 0.026225f, 0.043673f, -0.010636f, -0.092305f, -0.006299f, 0.029860f, -0.009230f, 0.050005f, -0.020797f, 0.017782f, -0.007436f, 0.002083f, 0.020321f, 0.005704f, 0.012401f, 0.025888f, 0.014945f, 0.029926f, -0.006922f, 0.010249f, 0.015492f, 0.002800f, -0.029848f, 0.036641f, -0.014805f, 0.000986f, 0.005637f, -0.017164f, 0.009323f, 0.002613f, -0.004678f, 0.025712f, -0.011171f, 0.002598f, 0.036143f, 0.000383f, 0.020178f, -0.016865f, -0.011264f, 0.020213f, -0.004473f, -0.012653f, -0.018772f, 0.001736f, 0.002661f, 0.005265f, -0.006215f, 0.005369f, 0.011330f, -0.003320f, 0.007765f, 0.010222f, -0.004976f, 0.012305f, 0.002272f, -0.012102f, 0.008255f, 0.005063f, 0.002523f, -0.000654f, 0.098185f, 0.019737f, 0.042717f, -0.003951f, 0.010565f, 0.015144f, -0.035267f, 0.015314f, 0.034469f, -0.000029f, -0.040636f, -0.022267f, -0.030072f, -0.012812f, + -0.040735f, -0.039983f, 0.005245f, -0.031947f, 0.046625f, 0.014636f, -0.010521f, -0.033929f, -0.015825f, -0.011413f, 0.025233f, -0.008080f, -0.038534f, -0.032408f, 0.008373f, 0.007959f, 0.022491f, 0.008064f, -0.008319f, 0.009954f, -0.033589f, -0.103390f, 0.004534f, 0.124614f, -0.003445f, -0.091246f, -0.014554f, 0.059113f, 0.016777f, 0.009333f, -0.001478f, -0.039849f, -0.048989f, -0.029794f, 0.011391f, -0.003397f, -0.045309f, 0.016429f, -0.091320f, -0.016743f, 0.084921f, 0.024575f, 0.109185f, -0.014703f, -0.042856f, -0.013350f, -0.009442f, 0.028833f, 0.006501f, -0.001173f, -0.059312f, -0.030267f, -0.028295f, -0.004368f, 0.069145f, -0.009632f, -0.016746f, 0.022354f, 0.028078f, 0.004125f, -0.036609f, -0.057675f, -0.004033f, 0.022882f, -0.002444f, -0.028801f, -0.007189f, 0.015680f, -0.011970f, -0.011050f, -0.018683f, 0.034273f, 0.036619f, -0.018705f, -0.009553f, -0.017214f, 0.014927f, 0.021220f, -0.009935f, 0.002783f, -0.003778f, -0.003338f, -0.006783f, -0.027744f, 0.003057f, 0.015321f, -0.016586f, 0.003770f, -0.003973f, 0.000905f, -0.014859f, -0.005342f, -0.006248f, -0.010091f, -0.011282f, -0.011930f, + -0.003291f, 0.048622f, -0.024303f, -0.000043f, -0.009577f, 0.002358f, 0.027075f, -0.018625f, -0.002582f, -0.005572f, 0.008522f, -0.001602f, 0.007747f, -0.014386f, -0.043466f, -0.144075f, -0.222648f, 0.052580f, 0.199197f, 0.062936f, 0.487335f, 0.459138f, 0.204158f, 0.473425f, 0.199916f, -0.085743f, -0.001450f, -0.142278f, -0.389460f, -0.212535f, -0.203938f, -0.399048f, -0.290606f, -0.166801f, -0.251419f, -0.168959f, 0.036795f, -0.014571f, -0.080439f, 0.095412f, 0.089104f, -0.000280f, 0.095529f, 0.259364f, 0.108873f, 0.048941f, 0.248211f, 0.222169f, 0.074642f, 0.264646f, 0.323713f, -0.000399f, 0.191796f, 0.326423f, 0.123645f, 0.130573f, 0.332714f, 0.198857f, -0.026258f, 0.259746f, 0.182302f, -0.070655f, 0.102000f, 0.206641f, -0.092377f, -0.163751f, -0.036931f, -0.346229f, -0.581378f, -0.562785f, -0.625825f, -1.001163f, -0.866604f, -0.714855f, -0.926501f, -0.794308f, -0.510422f, -0.605018f, -0.462403f, -0.127851f, -0.041219f, 0.196039f, 0.364707f, 0.601206f, 0.805361f, 0.878531f, 1.024649f, 1.112921f, 1.039607f, 0.984758f, 1.044658f, 0.794838f, 0.630201f, 0.747654f, 0.407831f, 0.065353f, + 0.094300f, -0.150782f, -0.552081f, -0.463481f, -0.342922f, -0.494923f, -0.506161f, -0.315674f, -0.359377f, -0.453194f, -0.332161f, -0.302009f, -0.426365f, -0.382485f, -0.249414f, -0.317267f, -0.340820f, -0.111408f, -0.107194f, -0.201058f, -0.021011f, 0.076828f, -0.057459f, 0.011075f, 0.076245f, -0.108396f, -0.140318f, -0.133158f, -0.292070f, -0.322523f, -0.225787f, -0.169575f, -0.123568f, 0.042176f, 0.198250f, 0.269430f, 0.381636f, 0.489014f, 0.510608f, 0.541669f, 0.598986f, 0.568174f, 0.516499f, 0.537995f, 0.487169f, 0.362370f, 0.248538f, 0.065614f, -0.095832f, -0.246344f, -0.358785f, -0.402001f, -0.423595f, -0.377925f, -0.289551f, -0.253578f, -0.213733f, -0.174733f, -0.150843f, -0.132798f, -0.099567f, -0.077106f, -0.071037f, -0.069266f, -0.048308f, -0.036448f, -0.029099f, -0.010019f, 0.015241f, 0.037403f, 0.065362f, 0.067921f, 0.069838f, 0.080882f, 0.079856f, 0.065493f, 0.070450f, 0.058627f, 0.031073f, 0.002370f, -0.023895f, -0.051841f, -0.062418f, -0.074529f, -0.080097f, -0.074598f, -0.069211f, -0.067162f, -0.048053f, -0.037551f, -0.022755f, 0.000812f, 0.020000f, 0.029430f, 0.045250f, 0.054669f, + 0.061796f, 0.069901f, 0.072993f, 0.076221f, 0.079440f, 0.079974f, 0.079197f, 0.073877f, 0.072800f, 0.068840f, 0.064361f, 0.058132f, 0.055480f, 0.045431f, 0.034523f, 0.021070f, 0.010253f, -0.003795f, -0.016563f, -0.028435f, -0.041747f, -0.058530f, -0.069741f, -0.081732f, -0.088030f, -0.093575f, -0.095887f, -0.095957f, -0.091834f, -0.087888f, -0.079556f, -0.072243f, -0.060771f, -0.047624f, -0.029301f, -0.015284f, 0.004387f, 0.018734f, 0.032146f, 0.043768f, 0.054802f, 0.057732f, 0.062129f, 0.060813f, 0.056049f, 0.047775f, 0.041640f, 0.030406f, 0.021410f, 0.013442f, 0.008705f, 0.002013f, 0.000364f, -0.001457f, -0.001192f, -0.003004f, -0.001533f, -0.002295f, -0.001046f, -0.001842f, 0.000052f, -0.000701f}, + {-0.000954f, 0.020699f, -0.010223f, 0.000745f, -0.006068f, -0.000547f, 0.008860f, 0.004093f, 0.005588f, -0.004879f, 0.006904f, -0.007128f, 0.007742f, 0.003759f, 0.009315f, 0.003829f, -0.001676f, -0.010497f, 0.011294f, 0.007663f, 0.002924f, 0.001252f, 0.001122f, -0.004498f, -0.004994f, 0.005733f, 0.003634f, 0.003724f, 0.005648f, -0.005723f, -0.000355f, 0.005162f, 0.006268f, -0.000870f, -0.004540f, -0.008841f, 0.000110f, 0.001579f, -0.005230f, 0.001926f, 0.001490f, -0.007973f, -0.004203f, -0.000661f, 0.004097f, 0.000032f, -0.003781f, 0.007332f, 0.001453f, -0.002555f, -0.005396f, -0.001272f, 0.000722f, -0.010387f, 0.004843f, 0.006423f, -0.003522f, 0.008241f, 0.006861f, -0.001126f, 0.005687f, 0.003272f, 0.011049f, 0.003412f, 0.002123f, -0.001752f, 0.004203f, -0.008876f, 0.001204f, 0.004195f, -0.004311f, 0.004810f, 0.005913f, 0.006386f, 0.004072f, 0.008406f, -0.001749f, -0.005162f, -0.002599f, -0.002203f, 0.001182f, -0.001986f, -0.006497f, 0.003079f, -0.003033f, -0.003483f, -0.003918f, 0.001487f, 0.000057f, -0.002045f, -0.001529f, 0.002589f, 0.000256f, -0.000325f, -0.000642f, -0.000281f, + 0.001293f, 0.001734f, -0.000223f, -0.000122f, -0.001427f, 0.000400f, -0.002616f, 0.000241f, 0.001853f, 0.002359f, -0.001630f, -0.001809f, 0.000474f, 0.001536f, -0.001507f, -0.019649f, -0.013848f, -0.001901f, -0.008939f, -0.007535f, 0.003676f, -0.011165f, -0.010886f, 0.003175f, -0.004966f, -0.004340f, 0.004442f, -0.003485f, -0.007731f, -0.000779f, -0.000643f, -0.002111f, -0.003571f, -0.002016f, -0.008858f, -0.000494f, -0.006406f, -0.004535f, -0.000305f, 0.007916f, -0.001811f, 0.011415f, -0.005971f, 0.006879f, 0.007779f, -0.008757f, 0.003007f, -0.002182f, 0.001643f, -0.006187f, 0.003026f, 0.004080f, 0.005986f, -0.003062f, -0.007457f, -0.002529f, -0.004118f, 0.002410f, 0.002807f, -0.008923f, -0.001191f, -0.006115f, -0.005010f, 0.001724f, -0.007407f, -0.011723f, -0.002265f, 0.011587f, 0.002495f, 0.004079f, 0.000571f, 0.002691f, 0.001522f, 0.004286f, 0.004509f, 0.012988f, 0.000915f, -0.005724f, -0.007489f, -0.001566f, -0.003595f, -0.000927f, -0.015088f, 0.003146f, -0.001122f, 0.004828f, -0.002062f, 0.001361f, -0.003639f, -0.001735f, 0.014665f, 0.002977f, 0.013443f, -0.004556f, -0.002510f, 0.001054f, + 0.003789f, 0.001331f, 0.004527f, -0.004468f, 0.004920f, -0.005213f, -0.003292f, 0.002701f, 0.001893f, -0.000179f, 0.000190f, 0.000126f, -0.001179f, 0.000384f, -0.002042f, -0.000171f, -0.000731f, -0.000315f, 0.000831f, 0.001033f, -0.001149f, -0.001895f, -0.001225f, 0.000134f, 0.000033f, 0.000332f, 0.000591f, -0.000785f, -0.000911f, -0.000801f, 0.000166f, -0.000305f, 0.001059f, 0.016032f, 0.018470f, 0.014223f, 0.010549f, 0.014951f, 0.006057f, 0.006500f, -0.001368f, 0.004250f, 0.015725f, 0.001683f, 0.004793f, -0.005842f, -0.003903f, 0.012059f, -0.008094f, -0.014745f, 0.004457f, -0.012319f, 0.010629f, 0.002511f, 0.012755f, -0.004061f, -0.000809f, -0.003144f, 0.004186f, 0.005113f, -0.000188f, -0.012551f, -0.002598f, 0.010758f, -0.007168f, 0.004852f, 0.002836f, -0.002422f, -0.003104f, 0.011954f, 0.009001f, 0.020851f, 0.008333f, 0.001734f, 0.004981f, -0.001760f, 0.001254f, 0.006569f, 0.003902f, 0.017772f, -0.007624f, -0.005069f, 0.001223f, 0.004578f, -0.002813f, 0.008238f, -0.007731f, 0.001602f, -0.000524f, -0.005923f, 0.001825f, 0.001785f, -0.008047f, -0.010863f, -0.006742f, 0.008603f, + 0.004149f, 0.000037f, -0.000719f, 0.006493f, 0.000470f, 0.002153f, 0.011238f, 0.005556f, -0.002707f, -0.001793f, 0.009987f, -0.008681f, 0.001126f, -0.007826f, -0.003546f, -0.010115f, 0.002731f, -0.002106f, -0.006022f, -0.003929f, 0.005842f, 0.003618f, 0.001023f, 0.003447f, -0.005644f, -0.000944f, -0.000507f, 0.004351f, 0.000099f, 0.000310f, 0.000777f, 0.001299f, 0.003173f, 0.003591f, 0.002805f, 0.000219f, 0.001486f, 0.003250f, 0.000155f, -0.002956f, 0.002707f, -0.001500f, -0.000613f, 0.000665f, -0.000527f, 0.002388f, 0.002143f, 0.001088f, -0.000034f, -0.000830f, -0.000890f, 0.001026f, 0.001338f, 0.000499f, 0.002057f, -0.004222f, -0.002729f, 0.002115f, -0.000180f, -0.001664f, -0.000235f, 0.002257f, 0.000177f, -0.001557f, -0.001992f, 0.001330f, -0.001966f, 0.000168f, 0.034804f, -0.000607f, 0.017049f, -0.003081f, -0.002672f, 0.018306f, -0.017910f, -0.006188f, -0.001397f, 0.009052f, 0.006278f, -0.003818f, 0.003488f, 0.001710f, -0.016217f, 0.004122f, 0.008682f, 0.007727f, -0.018174f, -0.006372f, 0.002057f, -0.013015f, -0.003579f, 0.001020f, 0.000595f, 0.001797f, -0.001997f, 0.008329f, + -0.005865f, 0.006629f, 0.013639f, 0.013642f, -0.003948f, -0.007785f, -0.001387f, 0.015366f, -0.000869f, -0.000799f, 0.000124f, 0.001535f, -0.007959f, 0.001389f, 0.006466f, 0.000994f, 0.001543f, 0.006206f, -0.004082f, 0.004187f, 0.002429f, -0.001661f, 0.010799f, 0.001087f, 0.008589f, 0.001721f, -0.002860f, 0.003770f, 0.005747f, 0.004972f, -0.000235f, -0.008407f, -0.007663f, -0.010129f, -0.004509f, -0.000331f, 0.000026f, -0.001161f, 0.007571f, 0.006522f, -0.004896f, -0.009933f, 0.000337f, 0.005199f, 0.006240f, -0.006066f, -0.001117f, 0.005911f, -0.000509f, -0.000787f, 0.007840f, 0.003690f, 0.003726f, -0.002889f, -0.002496f, -0.000439f, 0.003392f, 0.005053f, 0.000134f, 0.003832f, 0.001390f, 0.000342f, 0.000755f, 0.001292f, 0.004698f, 0.003539f, 0.005286f, -0.002644f, 0.002504f, 0.000381f, 0.000685f, -0.000742f, 0.000570f, 0.000805f, 0.000254f, 0.000707f, -0.000841f, 0.002539f, 0.002490f, -0.002271f, 0.000629f, 0.001426f, 0.001573f, -0.000732f, 0.004894f, 0.001907f, -0.000706f, -0.009224f, -0.026090f, -0.006675f, -0.008922f, 0.001763f, 0.004195f, -0.004347f, -0.005335f, -0.048915f, + 0.000844f, 0.015791f, -0.011573f, -0.018286f, 0.013580f, -0.020706f, -0.003288f, -0.009251f, -0.011060f, -0.006756f, -0.007005f, 0.000752f, 0.008168f, -0.001517f, 0.004483f, -0.005298f, 0.006118f, -0.004815f, -0.007585f, 0.003259f, -0.002945f, -0.011728f, -0.015124f, 0.007132f, 0.000549f, 0.007038f, 0.001998f, 0.015772f, 0.002067f, 0.005451f, -0.007757f, -0.013184f, -0.003983f, -0.006564f, 0.012970f, -0.006171f, 0.000173f, 0.003373f, -0.006694f, 0.018332f, 0.012003f, 0.000217f, -0.014809f, -0.018619f, -0.006475f, 0.006131f, -0.016927f, -0.000472f, -0.008323f, -0.016001f, 0.001309f, -0.025026f, -0.005696f, -0.002716f, -0.009460f, 0.016729f, -0.001210f, -0.002707f, -0.000447f, 0.010453f, 0.013248f, 0.003968f, -0.013609f, -0.004414f, -0.003574f, 0.007168f, 0.003218f, 0.004084f, -0.007721f, -0.009697f, 0.007377f, 0.005069f, 0.001726f, 0.002463f, -0.000643f, 0.004235f, 0.001029f, 0.006419f, 0.001675f, 0.001435f, -0.000719f, -0.000272f, 0.000868f, 0.004107f, 0.005802f, 0.003583f, -0.001629f, 0.002297f, -0.007635f, 0.003776f, 0.004277f, -0.001336f, -0.000793f, 0.001285f, -0.001853f, -0.000556f, + -0.000581f, -0.002386f, -0.002582f, -0.001406f, -0.000879f, 0.001316f, 0.002798f, -0.000554f, -0.003611f, -0.000113f, -0.005031f, 0.001566f, 0.006506f, 0.002772f, 0.003774f, 0.002697f, 0.010251f, -0.027892f, -0.041458f, 0.005152f, -0.009610f, 0.009289f, -0.011744f, -0.020432f, 0.000321f, 0.018941f, 0.003663f, 0.011652f, 0.009047f, 0.007240f, 0.004393f, -0.006532f, 0.004856f, 0.012614f, -0.019829f, -0.009110f, -0.006729f, -0.004317f, 0.006996f, -0.001532f, 0.002277f, 0.013089f, 0.011129f, -0.004512f, -0.011273f, 0.002693f, -0.006401f, -0.004631f, -0.010934f, -0.007357f, -0.016547f, 0.004039f, -0.006310f, -0.000024f, 0.014322f, -0.002791f, 0.002586f, 0.003953f, -0.010611f, 0.008869f, 0.008456f, 0.012220f, -0.010811f, 0.019229f, -0.003305f, -0.013867f, -0.012003f, -0.015180f, 0.014062f, -0.005270f, -0.016437f, 0.005050f, -0.002689f, -0.011340f, 0.012009f, 0.016493f, -0.005841f, -0.013570f, 0.009970f, 0.003330f, 0.007777f, -0.001080f, 0.021854f, 0.013060f, -0.013040f, -0.006274f, -0.006249f, -0.004907f, 0.007178f, 0.010190f, 0.012898f, 0.000080f, 0.001554f, 0.005121f, -0.005368f, 0.004876f, + -0.001605f, 0.008550f, 0.011832f, -0.016190f, -0.007447f, -0.008115f, -0.005292f, -0.008294f, -0.000819f, -0.005853f, 0.002578f, -0.000272f, -0.000690f, -0.000644f, 0.002019f, -0.003959f, 0.010028f, -0.001226f, 0.004185f, 0.001581f, 0.001962f, -0.001948f, 0.000246f, 0.000316f, 0.000455f, -0.003403f, 0.000577f, -0.002204f, -0.003711f, -0.005343f, -0.001725f, -0.000295f, -0.001025f, 0.000225f, 0.000509f, -0.001070f, -0.000851f, -0.002001f, -0.001996f, 0.003215f, -0.000122f, 0.001088f, -0.002344f, -0.038719f, 0.000113f, -0.007143f, 0.002699f, -0.000203f, 0.014702f, 0.010547f, 0.015225f, -0.002574f, 0.020717f, -0.009686f, 0.014138f, 0.016999f, 0.003310f, 0.016945f, 0.003843f, 0.004318f, -0.004626f, -0.001860f, -0.007013f, 0.013416f, -0.000671f, -0.001651f, 0.019226f, 0.011404f, 0.000351f, 0.005029f, -0.001447f, -0.000744f, 0.012571f, -0.007188f, -0.012080f, -0.000112f, -0.001518f, 0.006196f, -0.034486f, 0.020755f, 0.022679f, 0.008784f, 0.004566f, 0.000504f, -0.010832f, -0.023212f, 0.015469f, -0.009406f, -0.010319f, -0.007127f, 0.013909f, -0.009739f, 0.008659f, 0.008505f, -0.008012f, -0.005519f, + -0.019766f, 0.009117f, -0.012785f, 0.007633f, 0.001494f, 0.006830f, 0.012347f, 0.019308f, 0.008524f, -0.009011f, -0.021107f, -0.003827f, 0.013259f, 0.021292f, 0.016249f, -0.003302f, -0.004021f, -0.013794f, -0.022610f, -0.002479f, 0.016014f, 0.006988f, 0.005204f, -0.005124f, 0.021185f, -0.000770f, 0.007275f, 0.001976f, -0.003835f, 0.001931f, -0.010478f, -0.005261f, -0.005189f, 0.003517f, -0.002465f, -0.007691f, -0.004286f, -0.005326f, -0.005487f, 0.002246f, -0.007902f, -0.003425f, 0.001797f, 0.001365f, 0.006522f, 0.000298f, 0.001127f, 0.001046f, -0.001470f, 0.005102f, -0.001380f, 0.005809f, 0.002351f, -0.001702f, -0.004243f, -0.000260f, 0.005878f, 0.003983f, -0.000463f, -0.005511f, -0.001199f, 0.004833f, 0.004601f, 0.000601f, -0.000740f, -0.000679f, -0.003071f, -0.002486f, 0.003870f, 0.014613f, 0.050579f, 0.027413f, -0.002267f, 0.004758f, 0.004669f, 0.011092f, 0.020126f, -0.002795f, 0.004125f, 0.033728f, 0.003662f, -0.001468f, 0.020568f, 0.014206f, -0.013815f, 0.008393f, 0.002274f, 0.013595f, 0.009581f, -0.023402f, 0.018076f, -0.010817f, -0.001296f, 0.002042f, 0.014212f, 0.002539f, + 0.004040f, 0.010658f, 0.012442f, -0.011575f, 0.012777f, 0.037312f, -0.006304f, 0.017012f, 0.017676f, -0.009217f, 0.013926f, 0.003666f, -0.008685f, -0.009650f, 0.006905f, -0.008618f, -0.022890f, -0.002940f, -0.000798f, 0.002444f, -0.029375f, -0.007182f, 0.009409f, -0.018704f, -0.012346f, -0.030846f, 0.010513f, 0.014288f, -0.020846f, -0.007474f, -0.009904f, 0.022442f, 0.000833f, -0.012735f, -0.008671f, -0.014189f, 0.007456f, 0.018794f, -0.013015f, 0.007286f, -0.005364f, 0.009098f, 0.021468f, 0.008963f, 0.016977f, 0.017026f, 0.021442f, 0.003305f, -0.011556f, -0.011763f, 0.008778f, 0.013468f, 0.002238f, 0.009072f, -0.009177f, 0.003861f, -0.000857f, -0.002874f, -0.009646f, 0.001437f, -0.004109f, 0.000642f, 0.008405f, 0.003499f, 0.003725f, 0.002811f, 0.009254f, -0.005476f, 0.000637f, -0.001425f, 0.002978f, -0.000977f, 0.000626f, 0.003895f, 0.001332f, -0.003076f, 0.005112f, -0.000972f, -0.006549f, 0.004355f, -0.004583f, -0.003856f, -0.004762f, -0.010238f, 0.005909f, -0.002284f, 0.005052f, -0.000463f, -0.000642f, 0.001468f, 0.008011f, 0.005257f, 0.007186f, 0.003280f, 0.000246f, 0.002901f, + 0.008236f, -0.003117f, 0.007466f, 0.052106f, 0.013675f, 0.002373f, -0.003177f, -0.007248f, 0.000139f, 0.009963f, -0.006476f, -0.011727f, -0.017925f, 0.001592f, 0.012491f, -0.015532f, 0.007587f, 0.010634f, -0.004626f, 0.035247f, 0.012198f, -0.008462f, -0.006150f, -0.002384f, 0.012397f, -0.004936f, -0.011844f, -0.012603f, 0.007875f, -0.027799f, 0.000821f, -0.007678f, -0.010411f, 0.009199f, 0.001819f, -0.010055f, -0.006511f, -0.009657f, 0.013827f, -0.004401f, -0.022363f, -0.002486f, 0.000351f, 0.001862f, -0.013036f, -0.017913f, 0.001555f, -0.003190f, -0.002615f, 0.006346f, -0.003994f, 0.017156f, 0.003352f, 0.010307f, -0.010985f, 0.024884f, 0.007025f, -0.012162f, 0.016204f, 0.031427f, -0.009116f, -0.007521f, 0.015867f, 0.014942f, 0.006017f, 0.009153f, -0.019425f, -0.004988f, -0.020989f, 0.006285f, 0.019424f, 0.008996f, -0.024580f, -0.004829f, 0.007620f, -0.024021f, -0.038018f, -0.003149f, 0.001126f, 0.010896f, 0.034297f, 0.002876f, -0.004034f, -0.010625f, -0.008258f, 0.005512f, 0.008613f, 0.007442f, -0.000641f, 0.003992f, 0.000226f, -0.007492f, 0.004606f, 0.006043f, -0.009794f, -0.009162f, + 0.010342f, -0.003403f, 0.006038f, 0.004754f, 0.002995f, -0.002545f, 0.002146f, -0.000180f, 0.003519f, 0.000956f, 0.005400f, 0.000217f, 0.004762f, 0.003461f, 0.000999f, -0.004416f, 0.010020f, 0.003270f, 0.009143f, -0.001894f, -0.003167f, 0.003408f, -0.006262f, -0.001018f, 0.004315f, -0.005785f, 0.001425f, 0.003378f, 0.001984f, 0.002213f, 0.004875f, -0.001935f, -0.009065f, -0.000116f, -0.001005f, -0.009551f, 0.001348f, -0.004016f, -0.001187f, 0.003815f, 0.003085f, 0.003458f, -0.040340f, 0.019022f, 0.053358f, -0.021890f, 0.037411f, -0.008388f, -0.008208f, -0.011659f, -0.019511f, 0.014465f, 0.000423f, 0.009897f, 0.009587f, -0.035050f, 0.000332f, 0.016400f, -0.014376f, -0.007478f, -0.022260f, 0.039192f, -0.024558f, 0.019358f, 0.018080f, -0.023262f, -0.009748f, -0.008096f, 0.016273f, -0.018608f, -0.007758f, 0.019007f, -0.003462f, -0.005051f, -0.009401f, 0.023170f, 0.003919f, -0.003720f, -0.009680f, 0.000635f, -0.017776f, 0.019100f, -0.002434f, 0.008796f, 0.047406f, 0.031953f, -0.027573f, -0.019365f, 0.007294f, -0.002455f, 0.019721f, -0.010927f, -0.016252f, -0.005695f, -0.030053f, -0.011512f, + -0.003742f, -0.022918f, -0.013307f, 0.050875f, 0.011930f, 0.000191f, -0.002707f, -0.000553f, 0.014758f, 0.017927f, -0.003996f, 0.017706f, 0.001202f, -0.009717f, 0.001693f, -0.027133f, -0.002270f, -0.025144f, -0.013809f, 0.015155f, 0.021968f, -0.033345f, 0.013294f, -0.008548f, -0.010826f, 0.016151f, -0.002612f, -0.015355f, -0.001124f, -0.006024f, -0.012278f, 0.006157f, 0.004208f, -0.008403f, -0.020952f, -0.009983f, -0.002330f, -0.001650f, 0.016103f, 0.004839f, 0.003836f, -0.008926f, -0.000102f, -0.003690f, 0.008518f, 0.009788f, -0.005495f, 0.004167f, 0.007151f, 0.008043f, 0.006091f, 0.009147f, -0.003885f, 0.000608f, -0.006561f, 0.000468f, -0.007602f, -0.003952f, 0.002560f, -0.002076f, -0.006184f, -0.001450f, 0.002900f, -0.009862f, -0.005080f, -0.005376f, -0.003194f, -0.003805f, -0.004708f, -0.000622f, 0.005282f, 0.000353f, -0.000689f, 0.006283f, -0.042888f, 0.007515f, 0.039322f, -0.010200f, -0.010332f, 0.008744f, -0.012519f, -0.009826f, 0.010924f, -0.001304f, -0.002465f, -0.000304f, -0.027087f, 0.045735f, -0.048674f, -0.004494f, -0.001352f, 0.016760f, 0.009742f, 0.000757f, -0.018630f, -0.013059f, + 0.005551f, 0.035740f, -0.003137f, -0.015534f, -0.010972f, -0.025101f, -0.001966f, -0.014683f, -0.012047f, -0.005054f, 0.007673f, -0.000698f, 0.000939f, -0.016959f, 0.003193f, 0.004995f, 0.010688f, 0.009236f, 0.010763f, -0.023073f, -0.000140f, -0.004602f, 0.015010f, 0.003998f, 0.030707f, 0.006823f, -0.007411f, 0.002867f, -0.017079f, 0.000003f, 0.013275f, 0.017575f, -0.026811f, -0.020480f, -0.002173f, 0.027851f, -0.043610f, 0.011520f, 0.049837f, 0.027661f, -0.013620f, 0.004760f, -0.027140f, 0.011484f, 0.024512f, -0.042208f, 0.009250f, -0.020497f, -0.006044f, -0.057269f, 0.000083f, -0.024050f, 0.022170f, 0.001679f, -0.026879f, 0.017871f, -0.001909f, -0.034267f, -0.004791f, -0.021618f, 0.013997f, -0.011981f, -0.018168f, 0.024613f, -0.004921f, 0.004484f, -0.008344f, -0.010462f, -0.003090f, 0.010607f, 0.007632f, -0.005725f, -0.001670f, 0.000597f, -0.006243f, 0.003960f, 0.005760f, 0.008811f, -0.008930f, 0.003613f, 0.004457f, -0.010221f, 0.000474f, 0.004735f, -0.007625f, 0.000888f, -0.004998f, 0.011667f, 0.005983f, 0.014163f, -0.006801f, -0.005047f, 0.004512f, -0.013147f, -0.001588f, -0.003645f, + -0.002262f, -0.000511f, 0.002663f, -0.007291f, 0.000317f, -0.000808f, 0.002454f, 0.002764f, 0.000312f, -0.007350f, -0.004486f, -0.011604f, -0.032339f, 0.051173f, 0.015053f, 0.026774f, -0.030132f, -0.033997f, -0.006023f, 0.008970f, -0.009196f, -0.004577f, 0.017456f, 0.004689f, 0.005625f, 0.015157f, -0.037387f, -0.004147f, 0.000804f, 0.009560f, -0.025901f, 0.003429f, 0.004774f, -0.018248f, -0.009748f, -0.025130f, -0.018563f, -0.000141f, 0.008395f, -0.020333f, 0.001850f, -0.009216f, -0.017743f, 0.007024f, 0.000285f, 0.014436f, -0.039611f, -0.041701f, 0.008977f, -0.003578f, 0.015978f, 0.034983f, 0.004202f, -0.022003f, 0.031554f, -0.015579f, -0.029104f, -0.022627f, -0.009401f, 0.002516f, -0.030925f, -0.012044f, 0.030911f, 0.041628f, 0.017797f, 0.011669f, 0.008911f, -0.004792f, 0.026739f, 0.015008f, -0.030742f, -0.016868f, 0.000378f, 0.003115f, 0.029245f, 0.018690f, 0.004856f, -0.004440f, -0.003397f, -0.014223f, 0.019479f, 0.015160f, 0.033725f, 0.007701f, 0.009962f, 0.004114f, 0.060406f, 0.006868f, 0.023518f, -0.024879f, 0.002336f, 0.022936f, -0.054381f, 0.004520f, 0.007404f, 0.015421f, + -0.005474f, 0.008225f, -0.006945f, -0.001798f, 0.009550f, -0.004477f, 0.029111f, -0.011559f, 0.017097f, -0.004411f, -0.010078f, -0.005447f, -0.010915f, 0.000372f, 0.004718f, 0.005734f, -0.002120f, -0.005532f, 0.012250f, -0.003560f, 0.008262f, -0.004238f, -0.004429f, -0.008745f, 0.009252f, 0.009950f, 0.002296f, 0.001002f, -0.007214f, -0.012723f, 0.006141f, -0.001061f, 0.000578f, 0.015240f, -0.004113f, 0.013358f, -0.001893f, 0.007828f, 0.005430f, 0.010300f, 0.002470f, -0.009431f, -0.001645f, 0.034806f, 0.001997f, 0.043176f, -0.001846f, -0.019648f, -0.022012f, -0.040296f, 0.006993f, -0.016967f, -0.001554f, 0.003511f, 0.014084f, 0.021207f, 0.035309f, 0.037093f, -0.006177f, 0.033022f, -0.002902f, -0.002836f, 0.012024f, 0.027827f, 0.011649f, 0.007805f, -0.044695f, -0.022691f, -0.036431f, 0.018253f, 0.035586f, 0.007019f, -0.016023f, 0.025182f, 0.035696f, -0.004875f, 0.005159f, -0.008448f, 0.029939f, 0.025700f, 0.021346f, -0.012890f, -0.023379f, -0.003637f, -0.006404f, -0.051012f, 0.008448f, 0.006989f, 0.004094f, -0.012966f, -0.007226f, -0.056893f, -0.020590f, -0.051639f, -0.009494f, -0.038672f, + -0.020500f, 0.037307f, 0.009446f, 0.039303f, 0.002162f, -0.032173f, -0.016101f, -0.033479f, -0.064411f, 0.009036f, -0.039972f, -0.011530f, 0.037295f, 0.015749f, 0.014415f, 0.003116f, -0.007591f, -0.002756f, 0.007012f, -0.027537f, 0.021690f, -0.046981f, -0.048829f, -0.002685f, -0.004510f, -0.006048f, -0.035958f, -0.008089f, 0.046718f, -0.002567f, 0.002603f, -0.012548f, -0.041022f, 0.020706f, -0.027673f, -0.010763f, -0.027545f, -0.016873f, -0.013011f, -0.008708f, -0.010084f, -0.006069f, 0.000403f, 0.004835f, -0.025769f, -0.011003f, 0.004709f, 0.004573f, 0.014076f, 0.006683f, -0.008697f, -0.010767f, 0.009135f, -0.017266f, -0.002802f, 0.005342f, -0.013406f, 0.004192f, 0.003850f, 0.009618f, -0.009205f, -0.003148f, -0.004984f, -0.000702f, 0.006239f, -0.003783f, -0.000716f, -0.005076f, 0.010021f, 0.014046f, -0.004769f, -0.002265f, 0.003661f, 0.004717f, 0.008702f, 0.012447f, 0.002167f, -0.002119f, -0.003114f, -0.002954f, 0.020217f, 0.040583f, 0.035414f, 0.038053f, -0.021914f, -0.038278f, 0.029445f, -0.017427f, 0.030431f, 0.009079f, -0.048766f, 0.012256f, 0.009137f, -0.055009f, 0.029592f, -0.025078f, + -0.025542f, 0.014981f, 0.016767f, 0.002614f, 0.019895f, 0.001491f, 0.001033f, -0.012905f, -0.007404f, 0.012062f, -0.007594f, -0.018861f, 0.001307f, -0.035433f, 0.012845f, -0.045041f, -0.027337f, 0.001673f, 0.017914f, -0.006149f, -0.018578f, 0.006985f, 0.014140f, 0.010488f, 0.000873f, 0.036273f, -0.083329f, -0.018934f, -0.022787f, -0.027695f, 0.036221f, -0.029167f, -0.003939f, -0.067256f, -0.018764f, -0.007992f, 0.003558f, 0.044843f, -0.010768f, 0.005668f, -0.027028f, 0.022741f, -0.033641f, -0.021830f, 0.017568f, -0.078094f, 0.011423f, 0.041730f, 0.054270f, 0.041399f, 0.026277f, 0.060954f, 0.033730f, -0.000739f, -0.015018f, -0.015662f, -0.023517f, -0.052578f, -0.005635f, 0.004901f, -0.074278f, -0.029430f, -0.022409f, -0.016794f, 0.023868f, 0.062268f, 0.072833f, 0.048179f, -0.024345f, 0.019867f, -0.015667f, -0.003428f, 0.016552f, 0.011182f, -0.006268f, 0.003919f, 0.005503f, -0.001467f, 0.002588f, -0.011460f, 0.006632f, 0.020411f, -0.009526f, 0.002708f, -0.017933f, 0.004410f, -0.008354f, -0.001249f, -0.000798f, 0.015757f, 0.028067f, -0.010060f, 0.001846f, 0.006781f, 0.011488f, -0.016955f, + -0.026095f, 0.000466f, 0.020489f, 0.005894f, -0.016607f, 0.015614f, 0.008336f, -0.017015f, 0.012003f, 0.007563f, -0.006427f, -0.005252f, -0.001705f, -0.003216f, 0.003185f, 0.006311f, -0.005844f, 0.011379f, -0.071693f, 0.000222f, 0.011847f, 0.050335f, -0.016427f, 0.023352f, 0.021038f, 0.011270f, 0.011465f, -0.078123f, 0.061695f, 0.033816f, 0.076465f, 0.028268f, -0.003357f, -0.028262f, -0.018081f, -0.017628f, -0.027739f, 0.019967f, 0.014532f, -0.027959f, -0.032013f, 0.017111f, 0.022951f, 0.040166f, 0.011198f, -0.024626f, -0.037078f, 0.008065f, 0.006286f, 0.002773f, 0.004458f, 0.071193f, 0.024032f, 0.013787f, 0.023382f, 0.025905f, 0.028908f, 0.000896f, -0.045019f, 0.031933f, 0.099018f, -0.009879f, -0.027567f, -0.060013f, -0.012942f, 0.080078f, 0.009345f, 0.033285f, 0.011076f, -0.110125f, 0.022787f, 0.020069f, 0.002338f, 0.011604f, -0.007702f, 0.001956f, 0.022544f, -0.059155f, -0.024638f, 0.050696f, 0.018738f, 0.007187f, -0.044710f, 0.032250f, 0.011895f, -0.040038f, -0.043730f, -0.029090f, 0.040115f, 0.083633f, 0.077604f, 0.085735f, 0.086702f, 0.003760f, -0.038541f, -0.031431f, + -0.075711f, -0.024524f, 0.024020f, -0.061158f, -0.000480f, -0.049768f, 0.000754f, 0.067685f, 0.026333f, 0.028094f, 0.033532f, 0.021233f, -0.020446f, -0.006463f, -0.025231f, 0.036983f, -0.022039f, -0.019162f, 0.006718f, -0.003861f, -0.013058f, -0.023817f, -0.006918f, 0.025345f, 0.023623f, -0.010559f, 0.036467f, -0.001269f, 0.001059f, -0.016046f, 0.005504f, 0.019203f, -0.004598f, -0.013837f, -0.013717f, 0.009818f, -0.007521f, 0.020959f, 0.013090f, 0.017068f, 0.024377f, -0.024214f, 0.006455f, 0.002635f, 0.011273f, -0.004634f, -0.010401f, 0.022294f, 0.005398f, 0.018299f, -0.009415f, 0.007021f, -0.014351f, -0.004258f, -0.022145f, 0.035455f, 0.072223f, -0.146364f, -0.051625f, 0.011430f, -0.085498f, -0.078421f, -0.033924f, -0.047623f, 0.005456f, -0.035068f, 0.092798f, -0.009868f, -0.032831f, -0.013320f, -0.070957f, -0.019678f, -0.057242f, -0.023860f, 0.010091f, -0.073901f, -0.012301f, 0.057238f, -0.047846f, -0.013801f, 0.016611f, -0.000284f, 0.024001f, 0.005011f, 0.000205f, 0.021349f, 0.008048f, -0.036720f, -0.006748f, 0.032686f, -0.016387f, -0.045737f, -0.014884f, -0.055464f, -0.027161f, -0.097158f, + 0.009639f, -0.066185f, 0.032129f, 0.011820f, -0.024093f, -0.085705f, 0.008123f, -0.009133f, 0.105803f, 0.041969f, 0.002151f, 0.057308f, 0.025054f, 0.000529f, 0.046809f, -0.054974f, -0.025931f, 0.004107f, 0.041427f, -0.045537f, -0.027445f, 0.153081f, -0.014442f, 0.079291f, -0.061634f, -0.000151f, -0.043980f, 0.033277f, -0.015496f, 0.051912f, 0.081693f, 0.002165f, -0.057682f, 0.049528f, -0.061466f, -0.027954f, 0.020778f, -0.063878f, -0.042670f, -0.020369f, 0.046424f, 0.088565f, -0.105375f, 0.088790f, 0.017777f, 0.025959f, 0.009810f, 0.012465f, 0.009463f, -0.013113f, 0.016050f, 0.045995f, -0.023258f, 0.008074f, -0.004519f, 0.006009f, -0.049921f, -0.008963f, -0.015301f, 0.015055f, 0.015391f, 0.049139f, -0.030706f, -0.017790f, -0.023943f, 0.034098f, -0.043589f, 0.010491f, 0.016023f, 0.014794f, 0.016157f, -0.071737f, -0.017135f, 0.025879f, -0.012404f, -0.030653f, -0.004088f, 0.008475f, 0.001750f, 0.030418f, 0.015325f, 0.024150f, -0.024253f, -0.021534f, 0.024389f, 0.007216f, 0.016360f, -0.016141f, 0.016456f, 0.011327f, 0.003023f, 0.006200f, -0.006903f, -0.007429f, 0.000203f, -0.035444f, + -0.034522f, -0.055146f, 0.114124f, -0.065505f, 0.041905f, 0.037602f, -0.059544f, 0.032738f, 0.017873f, 0.012987f, -0.010638f, 0.045289f, 0.023271f, -0.057281f, 0.040686f, 0.047566f, 0.009176f, 0.008203f, 0.028638f, -0.000578f, -0.057141f, 0.074413f, -0.042404f, 0.016983f, -0.031535f, -0.007077f, 0.009325f, -0.013706f, 0.060492f, 0.013805f, -0.007994f, -0.014332f, -0.003159f, 0.012076f, -0.061560f, 0.019752f, -0.031904f, -0.021329f, -0.014758f, 0.000106f, -0.030187f, -0.014113f, 0.007367f, 0.064190f, 0.000719f, -0.013125f, -0.040692f, 0.017305f, 0.011289f, 0.002193f, 0.049657f, -0.011756f, -0.005115f, 0.059340f, 0.018622f, 0.003771f, -0.056880f, -0.029456f, 0.036825f, 0.020911f, -0.053266f, 0.002071f, -0.121144f, -0.059665f, 0.108781f, -0.025074f, 0.058894f, 0.077424f, 0.022022f, 0.013525f, 0.034983f, -0.014439f, -0.042446f, 0.023314f, 0.007303f, -0.002305f, 0.049184f, 0.032364f, -0.035083f, -0.084145f, -0.017364f, 0.034997f, 0.011155f, -0.001525f, 0.027614f, -0.031434f, 0.047662f, -0.022702f, 0.017959f, 0.022747f, 0.009912f, 0.033185f, 0.024927f, 0.040124f, 0.004700f, -0.009614f, + 0.014522f, 0.038970f, -0.009806f, 0.034234f, 0.020351f, -0.020953f, 0.007011f, 0.018593f, 0.012253f, 0.008157f, 0.024318f, 0.020984f, 0.009090f, 0.041057f, -0.012459f, 0.005558f, -0.005512f, -0.001586f, -0.009925f, 0.036694f, 0.029761f, 0.024763f, -0.010850f, 0.005702f, 0.042296f, -0.009691f, 0.031089f, 0.028970f, 0.000371f, 0.049568f, -0.043260f, 0.007638f, 0.066368f, 0.010058f, 0.019016f, -0.012045f, 0.046793f, 0.010784f, 0.017937f, 0.064899f, -0.020058f, -0.108345f, 0.018400f, -0.013024f, 0.037312f, 0.011459f, -0.036766f, 0.019094f, 0.022365f, -0.041848f, -0.046002f, -0.030745f, -0.076804f, -0.077255f, 0.053209f, -0.012274f, -0.079413f, -0.024306f, 0.008167f, 0.026337f, 0.025193f, -0.048608f, -0.052719f, 0.005240f, 0.073460f, -0.035059f, 0.028388f, -0.049341f, 0.017615f, -0.055670f, 0.036356f, 0.038363f, -0.027251f, -0.057293f, -0.039383f, -0.006334f, 0.022591f, -0.024557f, -0.016139f, -0.020435f, -0.072867f, -0.062994f, 0.033164f, -0.052876f, -0.010717f, 0.018930f, -0.043602f, -0.070538f, 0.027084f, 0.037116f, -0.004596f, -0.084932f, 0.038169f, 0.033426f, 0.107653f, 0.000566f, + 0.028393f, 0.021113f, -0.045730f, 0.017652f, -0.014072f, -0.092839f, -0.014017f, 0.056857f, 0.013745f, -0.046939f, -0.116340f, 0.073688f, 0.094367f, -0.027928f, 0.076397f, 0.088645f, 0.004863f, 0.004052f, 0.070334f, -0.045320f, 0.003854f, 0.117307f, -0.086102f, 0.050307f, -0.073681f, -0.020318f, -0.005620f, 0.050513f, -0.016710f, 0.007339f, 0.028793f, -0.000893f, -0.065065f, 0.072203f, -0.012584f, -0.008495f, 0.011654f, 0.030125f, -0.048693f, 0.021538f, 0.013308f, -0.007489f, 0.015683f, 0.017493f, -0.044975f, -0.006269f, 0.011393f, 0.023906f, 0.050653f, -0.004323f, -0.042937f, 0.022117f, 0.052055f, -0.040884f, 0.050842f, -0.023828f, -0.004350f, -0.017758f, 0.057317f, -0.039159f, 0.014414f, 0.034927f, -0.023219f, 0.008550f, 0.007381f, -0.032773f, 0.008333f, 0.013653f, -0.004877f, -0.025034f, 0.017386f, 0.020022f, -0.010032f, 0.040196f, -0.059644f, 0.014550f, 0.019417f, 0.000272f, 0.005335f, 0.007739f, 0.042462f, -0.009890f, 0.023998f, -0.049260f, -0.154113f, 0.041315f, -0.017463f, 0.114931f, -0.039346f, -0.025839f, -0.046004f, -0.132692f, 0.060781f, -0.077544f, -0.044748f, 0.001840f, + 0.000115f, 0.101449f, -0.072701f, -0.051613f, 0.067397f, 0.039435f, 0.035238f, -0.013217f, 0.033663f, -0.024208f, -0.033439f, -0.031538f, 0.078936f, 0.064924f, 0.102556f, -0.033169f, -0.038176f, 0.001215f, -0.006628f, 0.036990f, -0.061529f, 0.012604f, -0.064692f, 0.033994f, 0.063648f, 0.021185f, -0.052264f, 0.035027f, -0.046080f, 0.103253f, 0.052960f, 0.014042f, 0.014037f, -0.016731f, -0.081462f, 0.045364f, -0.110527f, 0.022391f, 0.020590f, 0.053298f, 0.042861f, -0.096214f, 0.028783f, -0.060888f, -0.035733f, 0.025258f, -0.009519f, 0.034878f, 0.022778f, -0.088078f, 0.035629f, 0.079425f, 0.105973f, -0.031563f, 0.031257f, -0.044105f, 0.074332f, -0.106545f, -0.005683f, -0.020089f, 0.033275f, 0.068719f, 0.099766f, -0.080813f, 0.019780f, -0.107863f, 0.068631f, 0.140092f, -0.035973f, -0.096955f, -0.007910f, -0.073353f, 0.092366f, 0.022584f, -0.047478f, -0.014292f, 0.005148f, -0.016763f, 0.065860f, 0.023950f, -0.037622f, 0.034618f, -0.053178f, 0.002474f, 0.049320f, -0.011343f, -0.061284f, 0.066592f, -0.097612f, 0.027186f, -0.015037f, 0.037860f, -0.002821f, 0.023117f, -0.022817f, -0.013055f, + 0.009488f, 0.007479f, 0.009893f, 0.045063f, -0.047648f, -0.040746f, 0.001731f, 0.009543f, -0.011395f, -0.050348f, -0.036518f, 0.070967f, 0.018909f, -0.033198f, -0.037518f, -0.083459f, 0.097950f, 0.075958f, -0.030638f, -0.027597f, -0.058093f, 0.000976f, 0.072972f, 0.012913f, -0.031589f, -0.012305f, -0.017051f, 0.010671f, 0.007223f, 0.002750f, -0.009652f, -0.004782f, 0.013175f, -0.002107f, -0.008152f, -0.006271f, 0.008538f, 0.002639f, 0.017621f, -0.008726f, -0.122982f, 0.088276f, -0.012829f, -0.001817f, 0.027245f, 0.025742f, 0.032744f, 0.011095f, 0.015229f, -0.041177f, 0.039001f, 0.012605f, -0.045060f, 0.030890f, -0.018823f, 0.000795f, 0.038098f, 0.024416f, -0.063475f, 0.036302f, -0.030821f, 0.053109f, -0.039084f, 0.014541f, -0.020695f, 0.025503f, -0.019794f, 0.012518f, -0.028752f, 0.060860f, -0.006728f, 0.003087f, 0.016207f, 0.021376f, -0.031547f, -0.004804f, 0.012121f, 0.021273f, 0.016637f, -0.019422f, 0.006083f, 0.002329f, -0.061785f, -0.003559f, 0.014216f, 0.023658f, 0.008228f, 0.015688f, -0.055726f, 0.010104f, -0.004584f, 0.006936f, 0.011069f, -0.009288f, 0.010389f, 0.010518f, + 0.003698f, -0.011666f, -0.013687f, -0.002725f, 0.061432f, -0.020633f, 0.011085f, 0.024831f, -0.014587f, 0.023703f, -0.026695f, 0.022900f, 0.009692f, -0.015440f, -0.026857f, 0.017466f, -0.017062f, 0.014022f, -0.024311f, -0.018249f, -0.010507f, 0.030381f, -0.008924f, 0.004282f, 0.004294f, -0.000583f, 0.005387f, -0.021366f, 0.015806f, -0.013243f, 0.036508f, -0.033850f, 0.014993f, -0.019571f, 0.017364f, -0.015695f, 0.013564f, 0.001976f, 0.024116f, -0.020694f, 0.010402f, -0.009817f, -0.000326f, 0.006125f, 0.013518f, -0.014393f, 0.002077f, -0.015647f, 0.022710f, -0.018851f, -0.007413f, 0.013979f, 0.003310f, -0.008351f, -0.004726f, 0.015602f, 0.007441f, -0.032074f, 0.017057f, 0.003347f, -0.001621f, -0.001870f, 0.004982f, -0.002506f, 0.001740f, -0.000892f, 0.002496f, 0.002865f, 0.006901f, -0.007792f, 0.022192f, -0.028883f, 0.007917f, -0.003747f, 0.004716f, -0.003973f, 0.006904f, -0.002484f, -0.005572f, -0.001047f, 0.002558f, -0.006404f, 0.096551f, -0.006951f, -0.031274f, -0.047667f, -0.021679f, -0.026752f, 0.035031f, 0.020274f, -0.025469f, 0.002138f, 0.003004f, 0.011460f, 0.001575f, 0.024275f, + 0.008378f, 0.019125f, -0.006546f, -0.000667f, -0.005726f, 0.008979f, 0.020720f, -0.019205f, -0.000112f, -0.009491f, 0.000688f, 0.025278f, -0.014310f, 0.002492f, -0.006458f, 0.009981f, 0.005153f, -0.013818f, -0.005117f, 0.014900f, -0.004546f, 0.024273f, 0.017260f, -0.025245f, 0.008130f, 0.005407f, 0.013293f, 0.005656f, -0.023873f, 0.016227f, -0.004446f, 0.015785f, 0.012618f, -0.028478f, 0.007861f, 0.000141f, 0.006459f, -0.003125f, -0.012496f, 0.020405f, -0.004962f, 0.009298f, 0.000527f, -0.006043f, 0.009460f, -0.012077f, -0.001661f, 0.017038f, -0.011611f, -0.013914f, 0.028330f, -0.018184f, 0.026434f, -0.002669f, -0.021318f, 0.043811f, -0.040095f, 0.034993f, -0.012320f, -0.020835f, 0.022174f, -0.020465f, 0.006155f, 0.007218f, -0.020052f, 0.017037f, -0.003556f, -0.001198f, 0.010887f, -0.013887f, 0.018375f, -0.005827f, -0.001335f, 0.004619f, -0.003048f, 0.006541f, -0.002988f, 0.001149f, 0.005419f, -0.005038f, 0.008619f, -0.000879f, -0.004779f, 0.010623f, -0.016195f, 0.008777f, -0.007153f, -0.003215f, 0.010242f, 0.000981f, -0.002968f, 0.005404f, -0.003771f, 0.005370f, 0.002764f, -0.007403f, + 0.005153f, 0.001172f, -0.001613f, -0.001137f, 0.004669f, 0.001136f, 0.008536f, -0.006489f, 0.002506f, 0.001245f, -0.004654f, 0.009510f, -0.002594f, -0.001312f, -0.047122f, -0.081326f, 0.102538f, 0.293023f, 0.046526f, 0.028233f, -0.214187f, -0.265198f, -0.084763f, -0.052282f, 0.179418f, 0.273242f, 0.140851f, 0.040587f, -0.091882f, -0.198013f, -0.180304f, -0.151328f, 0.012099f, 0.226335f, 0.189584f, 0.108461f, 0.037019f, -0.097119f, -0.125606f, -0.100042f, -0.096398f, -0.034219f, 0.045897f, 0.062733f, 0.130236f, 0.092981f, 0.022717f, -0.031725f, -0.018452f, -0.104910f, -0.050775f, -0.053101f, -0.071589f, 0.042515f, 0.080569f, 0.046362f, 0.117241f, 0.030946f, -0.027708f, -0.045164f, -0.077768f, -0.061710f, -0.009531f, -0.019194f, 0.024021f, 0.048310f, 0.043292f, 0.030700f, 0.021125f, -0.010811f, -0.042651f, -0.030389f, -0.035454f, 0.011301f, 0.041589f, 0.013535f, 0.010299f, -0.018155f, -0.037085f, -0.007103f, 0.000019f, -0.000685f, 0.030232f, 0.026841f, 0.030303f, 0.011781f, -0.010297f, -0.032506f, -0.046784f, -0.048126f, -0.031106f, 0.033127f, 0.049345f, 0.060946f, 0.042347f, -0.010763f, + -0.023779f, -0.025482f, -0.050154f, -0.022333f, 0.018449f, 0.009528f, 0.009211f, 0.014523f, 0.007145f, 0.005488f, -0.007680f, -0.010217f, 0.008039f, 0.017327f, -0.000261f, -0.001640f, -0.011915f, -0.016664f, -0.008490f, -0.010173f, -0.005797f, 0.012815f, -0.002176f, 0.026946f, 0.033529f, 0.019200f, -0.011469f, -0.019109f, -0.021174f, -0.027010f, -0.019549f, -0.026730f, 0.014346f, 0.036550f, 0.033558f, 0.019688f, 0.021001f, 0.007795f, -0.020441f, -0.040296f, -0.041004f, -0.020998f, -0.004134f, 0.012899f, 0.029410f, 0.042917f, 0.035411f, 0.006545f, -0.022610f, -0.037963f, -0.027636f, -0.009309f, 0.000387f, 0.010261f, 0.006716f, 0.016136f, 0.020883f, 0.006060f, -0.008865f, -0.012353f, -0.006770f, -0.005210f, -0.004869f, -0.001509f, 0.001596f, 0.009558f, 0.005944f, 0.000578f, -0.000013f, -0.000696f, -0.001803f, -0.004511f, -0.005096f, 0.001651f, 0.004175f, 0.003005f, -0.000597f, -0.000200f, -0.000484f, -0.001450f, -0.001671f, 0.000885f, 0.000816f, 0.001355f, 0.000434f, 0.000663f, -0.000866f, -0.001098f, -0.001964f, -0.001196f, 0.000459f, 0.002399f, 0.000524f, 0.000965f, 0.000888f, 0.000245f, + -0.001230f, 0.000034f, -0.001264f, -0.003466f, -0.002313f, 0.002285f, 0.002697f, 0.002803f, 0.001418f, 0.000071f, -0.001845f, -0.000753f, -0.001186f, -0.000624f, -0.001124f, 0.000488f, 0.000088f, 0.000409f, 0.000176f, 0.001377f, 0.000678f, 0.001324f, 0.000109f, -0.000157f, -0.001257f, -0.000988f, -0.001963f, -0.000887f, -0.000457f, 0.001530f, 0.001305f, 0.002338f, 0.001127f, 0.000381f, -0.001815f, -0.001547f, -0.001721f, -0.000452f, -0.000506f, 0.001346f, 0.000977f, 0.001087f, -0.000128f, 0.000181f, -0.000648f, 0.000102f, -0.000526f, 0.000231f, -0.000476f, 0.000301f, -0.000307f, 0.000406f, -0.000371f, 0.000328f, -0.000273f, 0.000509f, -0.000267f, 0.000360f, -0.000348f, 0.000312f, -0.000413f, 0.000339f} + }, + { + {-0.005310f, 0.020334f, 0.002407f, 0.005499f, 0.001980f, 0.002893f, -0.004877f, -0.012321f, -0.002343f, 0.006498f, 0.002356f, -0.006101f, -0.000821f, 0.004970f, -0.001248f, -0.007342f, 0.002250f, -0.008460f, -0.005203f, -0.000265f, 0.002366f, -0.002406f, -0.001870f, 0.005242f, -0.007252f, -0.000174f, 0.000968f, 0.003529f, 0.002840f, 0.002687f, 0.008955f, 0.004027f, -0.011033f, -0.002821f, -0.004991f, 0.001407f, -0.000242f, -0.000832f, -0.006929f, -0.009085f, 0.012090f, -0.005552f, 0.002992f, 0.003514f, 0.003067f, -0.011420f, -0.006448f, -0.002984f, 0.001310f, -0.000885f, -0.000307f, -0.001038f, 0.001978f, 0.004371f, -0.005924f, -0.000001f, 0.003257f, 0.003743f, 0.004505f, 0.001654f, 0.000138f, 0.004325f, 0.001586f, -0.001854f, -0.000492f, 0.007013f, -0.005134f, -0.005476f, -0.002905f, -0.002186f, 0.006037f, 0.003551f, 0.001485f, -0.002213f, 0.005822f, -0.002549f, 0.003048f, -0.006790f, -0.000585f, 0.000545f, 0.001481f, 0.001434f, -0.005432f, 0.001510f, 0.003958f, 0.001981f, 0.000727f, -0.000471f, 0.005161f, 0.002451f, -0.000443f, 0.003290f, 0.002011f, 0.000876f, -0.000674f, 0.001124f, + 0.000951f, 0.000741f, -0.000896f, 0.001274f, 0.000426f, -0.000989f, -0.000737f, 0.001801f, 0.000467f, -0.000133f, 0.000101f, 0.000111f, 0.000377f, -0.001602f, 0.001260f, -0.000416f, 0.001008f, -0.001246f, -0.011505f, -0.007043f, 0.005003f, -0.011399f, -0.015943f, 0.003040f, 0.001446f, 0.001901f, 0.002410f, 0.002179f, -0.013698f, -0.002325f, 0.004065f, -0.008807f, 0.009239f, 0.008840f, 0.007718f, -0.003173f, 0.000768f, 0.001992f, 0.005925f, 0.001257f, -0.000136f, 0.001073f, -0.003921f, 0.003617f, -0.001377f, -0.001533f, -0.001812f, 0.011229f, -0.006688f, 0.003832f, -0.004201f, -0.003752f, -0.003767f, 0.002917f, 0.006244f, -0.006687f, -0.003235f, -0.003663f, 0.004584f, 0.004176f, 0.006934f, 0.004587f, 0.000973f, 0.005939f, -0.005080f, 0.003534f, 0.001430f, 0.001484f, 0.012675f, 0.002895f, 0.006292f, -0.010452f, -0.002748f, 0.004181f, -0.005135f, 0.004823f, -0.002193f, -0.003906f, 0.001397f, 0.007481f, 0.005154f, 0.003399f, -0.001809f, 0.001455f, 0.005689f, -0.006928f, 0.009055f, -0.001326f, 0.007427f, -0.003099f, 0.006134f, 0.007176f, 0.006166f, -0.003522f, -0.009051f, -0.013517f, + -0.009026f, 0.000774f, -0.004719f, 0.008760f, 0.001505f, 0.001285f, 0.002405f, -0.006430f, -0.001926f, -0.002950f, 0.003214f, -0.001818f, -0.001187f, 0.003797f, -0.004739f, -0.001792f, 0.001916f, -0.002755f, 0.000247f, -0.003064f, -0.002335f, -0.001982f, -0.000506f, 0.001738f, 0.000529f, 0.000219f, -0.003225f, 0.019527f, 0.013901f, 0.011525f, 0.009453f, 0.010813f, 0.004457f, -0.000778f, -0.000319f, -0.003921f, -0.001273f, 0.014199f, -0.006253f, -0.006293f, 0.009666f, 0.007302f, 0.009288f, -0.006494f, 0.002749f, -0.002419f, 0.002027f, 0.004235f, 0.005761f, 0.000913f, -0.004368f, -0.003121f, -0.005595f, -0.001912f, -0.003496f, -0.009973f, -0.001315f, 0.008490f, -0.006671f, -0.001095f, 0.003019f, -0.005119f, -0.004782f, 0.004819f, -0.002684f, -0.006652f, -0.003695f, 0.003857f, -0.005829f, -0.007326f, -0.003469f, -0.002149f, 0.002375f, -0.005102f, -0.010762f, 0.000791f, -0.001868f, -0.001457f, 0.002971f, -0.008709f, -0.004372f, 0.000192f, -0.003764f, 0.004849f, -0.001340f, 0.002109f, -0.015805f, -0.004729f, 0.008770f, -0.003472f, -0.008753f, 0.002601f, 0.001420f, 0.002459f, -0.003329f, -0.012423f, + -0.005763f, 0.014026f, 0.000840f, 0.005183f, 0.002849f, -0.001993f, 0.004155f, 0.005854f, 0.002339f, -0.002882f, -0.006816f, 0.000002f, 0.001555f, -0.005061f, 0.002181f, -0.006566f, -0.000790f, -0.004184f, -0.002168f, -0.005545f, -0.001174f, -0.003167f, -0.004148f, -0.003106f, 0.000497f, -0.001381f, 0.000598f, -0.001517f, 0.000435f, -0.002802f, 0.001885f, 0.001074f, -0.000889f, -0.000519f, 0.002486f, -0.000068f, -0.001058f, -0.002499f, -0.001400f, -0.001141f, -0.000310f, 0.000225f, -0.000060f, -0.002886f, 0.027487f, 0.017047f, 0.015943f, 0.000396f, 0.001516f, 0.001393f, -0.006654f, -0.014492f, -0.005596f, 0.011139f, -0.008411f, 0.005106f, 0.014832f, 0.001317f, -0.004794f, -0.001750f, -0.003087f, -0.001465f, 0.005963f, 0.008686f, 0.000245f, 0.002642f, 0.003439f, 0.005703f, 0.000280f, -0.007730f, 0.002365f, -0.012528f, -0.003861f, -0.001484f, -0.003566f, -0.002183f, 0.001528f, -0.002912f, -0.006681f, -0.005059f, -0.002432f, 0.000659f, -0.002889f, -0.007556f, 0.009077f, -0.003311f, 0.000629f, -0.002261f, -0.006009f, 0.007591f, 0.020800f, 0.005122f, -0.007273f, 0.012415f, 0.002793f, -0.003704f, + 0.003730f, -0.002044f, -0.008044f, 0.000121f, -0.003383f, 0.003193f, -0.006969f, -0.011954f, 0.000458f, 0.002079f, -0.014612f, 0.004439f, 0.003006f, 0.008233f, 0.004620f, 0.010855f, -0.003663f, -0.007200f, -0.004283f, -0.002189f, 0.005241f, -0.001846f, -0.009392f, 0.006474f, -0.004583f, -0.008463f, 0.005823f, -0.008454f, -0.004673f, 0.002771f, -0.003088f, 0.003030f, -0.002037f, -0.003445f, 0.002829f, 0.007314f, -0.001674f, -0.003487f, -0.001295f, 0.000072f, 0.002539f, 0.005166f, 0.001466f, -0.001406f, -0.001893f, -0.001784f, -0.000614f, 0.001287f, -0.003676f, -0.001210f, -0.001078f, 0.005659f, 0.002843f, 0.004029f, -0.000655f, 0.000391f, 0.003064f, 0.002137f, 0.001486f, -0.000087f, 0.000528f, -0.000558f, 0.001591f, -0.000952f, -0.000757f, -0.014078f, -0.022556f, -0.006774f, -0.011346f, 0.016190f, -0.003791f, -0.001856f, 0.005898f, -0.014731f, -0.010581f, 0.009016f, -0.007317f, -0.006571f, -0.000497f, -0.000501f, 0.001453f, 0.005972f, -0.002599f, 0.002772f, -0.004001f, -0.002778f, -0.000409f, -0.002448f, -0.006638f, -0.000488f, -0.001534f, 0.006887f, 0.006738f, 0.006125f, -0.008196f, 0.003832f, + 0.002586f, 0.011356f, -0.005821f, -0.000332f, -0.004007f, -0.008533f, 0.012130f, -0.011561f, -0.005865f, -0.004452f, 0.002748f, 0.010269f, -0.009579f, 0.010619f, -0.001292f, 0.005760f, 0.008632f, 0.001503f, 0.006618f, -0.012470f, 0.002613f, -0.004657f, 0.000496f, -0.013215f, 0.000096f, -0.004509f, -0.012052f, -0.009072f, 0.000559f, 0.008848f, 0.000305f, -0.006332f, 0.009838f, -0.003368f, 0.005627f, -0.000723f, -0.012511f, 0.017348f, -0.010951f, -0.002078f, -0.006301f, 0.004380f, 0.006851f, 0.004706f, 0.006307f, 0.014053f, 0.010514f, -0.001729f, 0.002063f, 0.006665f, 0.003993f, -0.004927f, 0.006935f, 0.005592f, -0.001222f, 0.003201f, -0.007152f, -0.009567f, -0.001209f, -0.003050f, 0.005222f, -0.005591f, -0.001358f, -0.005374f, -0.001440f, -0.002445f, -0.000997f, 0.001667f, 0.001816f, 0.001148f, -0.000434f, -0.001322f, 0.003050f, 0.001689f, -0.003555f, 0.002463f, -0.000045f, -0.008294f, -0.000950f, -0.002964f, 0.004554f, -0.001241f, -0.000775f, 0.001767f, -0.001128f, 0.001684f, 0.003518f, -0.000225f, 0.002202f, 0.002609f, -0.000726f, 0.000985f, 0.005041f, 0.000871f, 0.005859f, -0.015699f, + -0.022846f, 0.002734f, 0.001715f, 0.001467f, 0.014419f, -0.004537f, -0.016087f, 0.001878f, 0.001666f, -0.004002f, -0.001100f, -0.013789f, -0.002947f, 0.001938f, 0.001893f, 0.015845f, -0.002924f, 0.014220f, -0.003575f, -0.003423f, 0.000987f, -0.013722f, 0.005754f, -0.005050f, 0.008291f, -0.002150f, -0.003768f, -0.004975f, -0.002715f, 0.000692f, -0.010595f, 0.018191f, -0.012661f, -0.020041f, 0.005860f, 0.001125f, -0.014402f, -0.004006f, -0.027465f, 0.000665f, -0.009906f, 0.000061f, -0.010740f, -0.008362f, 0.001284f, 0.001162f, 0.004503f, -0.008433f, 0.006690f, -0.009541f, -0.019031f, 0.002437f, 0.005014f, -0.005515f, 0.005969f, -0.003037f, -0.010654f, -0.009013f, -0.012912f, -0.005840f, -0.001561f, 0.002274f, -0.004012f, 0.011982f, -0.000174f, -0.003492f, 0.000812f, 0.000903f, 0.002239f, 0.002025f, 0.001168f, -0.011124f, -0.010798f, 0.002431f, 0.007275f, 0.004617f, 0.001018f, -0.002309f, 0.009086f, 0.005308f, -0.004568f, -0.003018f, -0.010654f, -0.004122f, 0.004418f, 0.002375f, -0.005918f, 0.002471f, -0.001822f, -0.001503f, -0.002905f, -0.003116f, -0.001381f, -0.004169f, -0.003539f, 0.001962f, + 0.000614f, 0.002770f, 0.004227f, 0.000521f, 0.003674f, 0.000361f, -0.002848f, 0.003884f, 0.002071f, -0.000590f, 0.000282f, -0.001967f, -0.002394f, 0.000100f, -0.000078f, -0.002225f, -0.000164f, -0.000571f, -0.000387f, 0.000132f, -0.000798f, 0.002579f, -0.004179f, -0.000467f, -0.001449f, 0.000352f, 0.001056f, 0.002639f, -0.000197f, -0.035062f, -0.008750f, 0.001343f, -0.008901f, -0.006580f, -0.011145f, 0.002832f, 0.003957f, 0.007913f, -0.005989f, -0.007527f, -0.008426f, 0.004162f, 0.009440f, -0.004754f, -0.004009f, -0.002462f, -0.001429f, 0.004401f, -0.019507f, -0.004890f, 0.011050f, 0.003526f, -0.005703f, 0.002018f, 0.009787f, -0.001033f, -0.002479f, 0.003344f, -0.000602f, 0.023891f, -0.010300f, 0.005786f, 0.001940f, -0.010172f, 0.003332f, 0.002175f, -0.011473f, 0.008027f, -0.016307f, -0.001669f, 0.014448f, 0.003090f, -0.000412f, -0.003125f, -0.011147f, -0.009719f, 0.002580f, 0.006121f, -0.004193f, 0.002935f, 0.011969f, 0.005839f, -0.004963f, 0.007283f, -0.010614f, -0.025072f, -0.003302f, -0.011065f, 0.006952f, -0.007123f, 0.017744f, 0.008787f, -0.000814f, -0.003010f, -0.023003f, 0.007157f, + 0.008794f, -0.007156f, 0.014059f, -0.011023f, 0.004290f, -0.018405f, 0.008494f, 0.006321f, -0.020847f, -0.013368f, -0.004277f, 0.005049f, 0.006923f, 0.015092f, -0.002111f, -0.000834f, 0.009860f, 0.002186f, 0.000049f, -0.004502f, 0.002255f, 0.002185f, 0.002959f, 0.003134f, 0.000803f, -0.000505f, -0.001902f, -0.002259f, -0.005630f, -0.004773f, 0.003736f, 0.002555f, 0.001919f, 0.004547f, -0.001894f, 0.002144f, 0.002355f, -0.001283f, 0.003985f, -0.000635f, -0.000052f, -0.001054f, -0.004542f, -0.001091f, 0.005190f, 0.001071f, 0.003848f, -0.001539f, 0.001400f, -0.002151f, 0.006169f, 0.000489f, 0.005169f, 0.002193f, -0.002573f, 0.001255f, 0.008619f, 0.014944f, 0.033993f, 0.036609f, 0.007153f, 0.011102f, -0.000044f, 0.005396f, 0.000184f, 0.004037f, -0.009886f, 0.004726f, -0.006198f, 0.008277f, 0.007507f, 0.018965f, 0.002760f, -0.003578f, 0.011626f, 0.008698f, 0.014013f, 0.000922f, 0.008674f, 0.005342f, -0.004481f, 0.004632f, 0.020929f, 0.003583f, -0.009201f, -0.004661f, 0.015464f, 0.009873f, 0.007385f, 0.014728f, -0.011244f, 0.004596f, 0.017159f, -0.016944f, -0.020653f, 0.007051f, + 0.010924f, 0.018184f, -0.007860f, -0.013112f, 0.010760f, 0.004202f, -0.001712f, 0.007012f, -0.002801f, -0.001361f, -0.000182f, 0.025791f, -0.009303f, 0.005457f, -0.006229f, -0.003665f, -0.003077f, 0.013595f, -0.001829f, 0.029987f, 0.014175f, -0.013955f, 0.016533f, 0.003924f, 0.007678f, 0.003878f, 0.003551f, 0.004362f, -0.005486f, 0.010337f, -0.023534f, -0.005882f, 0.010706f, -0.023593f, 0.008152f, -0.018998f, 0.004505f, 0.021675f, 0.005244f, 0.000199f, 0.005835f, 0.002380f, -0.005769f, 0.001792f, -0.006127f, 0.001060f, 0.004899f, -0.014016f, 0.008226f, -0.002248f, -0.003432f, 0.001339f, 0.004454f, -0.003396f, -0.005735f, 0.002315f, 0.005183f, -0.002354f, -0.004844f, -0.004383f, -0.002796f, 0.002391f, -0.003414f, -0.002667f, 0.003245f, 0.004918f, 0.002128f, -0.001973f, 0.002963f, -0.001710f, -0.007383f, -0.002927f, -0.000086f, -0.003340f, 0.002148f, 0.001972f, 0.003139f, 0.005489f, 0.007438f, -0.003052f, 0.010479f, -0.003200f, -0.006053f, -0.001616f, 0.003751f, 0.001268f, -0.006147f, -0.003549f, -0.004450f, 0.056717f, 0.009431f, 0.009235f, -0.016872f, 0.024664f, -0.008443f, -0.000691f, + -0.006761f, 0.001722f, -0.016167f, -0.000829f, 0.007099f, 0.002144f, -0.013239f, 0.016399f, -0.004228f, -0.007956f, 0.001958f, 0.005390f, -0.016936f, -0.022933f, 0.009312f, -0.009259f, -0.014113f, 0.003068f, -0.000421f, -0.006710f, 0.011794f, -0.011871f, 0.003690f, 0.012172f, -0.002436f, 0.017572f, 0.005081f, -0.021450f, -0.023139f, -0.009389f, 0.001137f, 0.004510f, -0.018355f, 0.006874f, 0.006219f, 0.003788f, 0.005462f, 0.008314f, -0.019064f, -0.008984f, 0.005098f, -0.020522f, -0.007888f, -0.000137f, -0.021960f, -0.011224f, -0.007729f, 0.004744f, -0.011410f, -0.023146f, -0.011479f, -0.012198f, 0.026908f, 0.013523f, -0.002554f, 0.004093f, -0.007629f, 0.022024f, 0.025663f, 0.003288f, 0.017092f, 0.013072f, 0.004690f, 0.003502f, -0.010385f, -0.001814f, -0.009212f, 0.012995f, -0.016950f, 0.000936f, -0.004336f, -0.025125f, -0.008065f, -0.003299f, 0.013502f, -0.012242f, 0.006599f, 0.006337f, 0.002252f, 0.001713f, 0.005657f, -0.005713f, 0.004443f, -0.003292f, 0.004970f, -0.000963f, 0.007517f, 0.002691f, 0.000320f, -0.003739f, -0.001890f, -0.009572f, 0.004979f, -0.000990f, 0.008103f, -0.007736f, + -0.000381f, -0.000445f, 0.004680f, -0.000490f, 0.004140f, 0.002315f, 0.002082f, 0.002805f, 0.000899f, -0.005046f, 0.005924f, 0.008424f, -0.004460f, -0.005372f, -0.007154f, -0.002398f, -0.000828f, -0.002023f, 0.000299f, -0.001407f, -0.038415f, 0.025928f, 0.041646f, -0.031253f, -0.018600f, 0.008557f, 0.007470f, -0.006363f, 0.013677f, 0.003691f, -0.011652f, -0.014260f, -0.000304f, -0.004609f, -0.010174f, 0.005159f, -0.004689f, 0.000622f, 0.011495f, -0.015540f, 0.003237f, 0.002029f, -0.009229f, 0.001268f, -0.014643f, 0.002800f, 0.021417f, 0.010885f, -0.002186f, -0.006954f, -0.001799f, -0.012308f, -0.013080f, 0.006348f, 0.010803f, -0.003491f, -0.006053f, -0.004345f, 0.006438f, 0.010737f, 0.005135f, 0.019731f, -0.010718f, 0.008073f, -0.005198f, 0.001870f, 0.012295f, -0.004529f, -0.003976f, -0.023661f, -0.003682f, -0.018344f, 0.009106f, 0.006174f, 0.023402f, -0.020219f, -0.007496f, -0.019576f, -0.032138f, -0.005490f, 0.013289f, -0.022249f, 0.004822f, -0.002565f, -0.016248f, -0.019164f, -0.024107f, 0.032118f, 0.001115f, 0.019023f, 0.013970f, 0.016138f, -0.007474f, -0.021578f, -0.016348f, -0.020206f, + 0.006894f, 0.015589f, -0.015151f, 0.006949f, 0.016654f, -0.011508f, 0.001792f, 0.013451f, 0.015501f, 0.003600f, -0.005742f, 0.006541f, -0.002948f, 0.003411f, -0.016818f, -0.001699f, 0.006242f, -0.005833f, 0.001975f, 0.000855f, 0.000549f, 0.003543f, 0.006110f, -0.006786f, -0.002536f, 0.003631f, 0.005413f, 0.001371f, 0.002528f, 0.005262f, -0.001378f, 0.005697f, -0.005184f, 0.003829f, 0.005766f, 0.006440f, 0.000519f, -0.002757f, 0.004979f, -0.004483f, 0.001054f, -0.001209f, -0.003856f, -0.002044f, -0.003815f, -0.001231f, 0.001412f, -0.004678f, -0.012448f, 0.004013f, 0.006371f, -0.030413f, 0.022059f, -0.003096f, -0.010935f, 0.018226f, 0.006898f, -0.018486f, -0.025610f, -0.010404f, 0.000382f, 0.000136f, 0.001548f, -0.009645f, 0.029761f, 0.011802f, 0.009184f, 0.006385f, 0.009538f, -0.009395f, 0.002491f, 0.005422f, 0.004560f, 0.026031f, 0.003001f, -0.039903f, 0.005091f, 0.015960f, -0.014494f, -0.022649f, -0.004483f, -0.012519f, -0.006911f, 0.001364f, 0.028092f, 0.016217f, -0.002641f, -0.001139f, -0.008234f, -0.024938f, -0.008094f, -0.020695f, 0.014567f, 0.019186f, 0.000403f, -0.011479f, + -0.003847f, -0.005065f, 0.009171f, 0.012002f, 0.013439f, -0.031332f, 0.006054f, 0.000501f, 0.002827f, 0.020831f, -0.012387f, 0.008186f, -0.011304f, -0.008798f, 0.002342f, 0.013411f, 0.025282f, -0.004600f, -0.016236f, 0.004669f, -0.029289f, 0.022823f, 0.012704f, -0.003530f, -0.012082f, 0.005701f, -0.006746f, -0.015133f, -0.012025f, -0.013789f, -0.006253f, -0.003420f, 0.000900f, 0.011746f, -0.009485f, 0.033469f, 0.001428f, -0.005875f, 0.001955f, 0.009493f, 0.000446f, -0.001093f, 0.011051f, 0.006910f, 0.005679f, -0.000297f, -0.005415f, -0.004888f, -0.001332f, -0.001497f, -0.005021f, -0.014605f, 0.007261f, 0.006215f, -0.005321f, 0.001166f, -0.007787f, -0.006513f, -0.002765f, -0.002273f, -0.000318f, 0.011442f, -0.002646f, -0.004615f, -0.002123f, -0.001506f, 0.007353f, 0.012800f, -0.004606f, 0.006815f, -0.002237f, -0.009328f, 0.009649f, -0.010045f, -0.007649f, -0.005763f, -0.007732f, 0.000747f, 0.005566f, 0.002089f, 0.005698f, -0.000792f, -0.002483f, -0.001446f, -0.006359f, 0.002742f, -0.003777f, -0.007914f, 0.004953f, -0.003683f, -0.003764f, -0.003611f, -0.000488f, -0.002916f, -0.000240f, -0.002547f, + -0.002046f, -0.000401f, -0.000958f, -0.013779f, -0.002426f, 0.013655f, -0.025077f, -0.008095f, 0.017483f, -0.021769f, -0.001399f, -0.002854f, -0.002043f, -0.025231f, 0.025073f, 0.009775f, -0.016175f, -0.003682f, -0.006504f, -0.006974f, -0.036423f, -0.005988f, -0.016232f, -0.042738f, 0.009723f, 0.005719f, -0.018334f, -0.016561f, -0.021741f, -0.026387f, 0.022581f, 0.011539f, 0.023732f, 0.000034f, 0.048973f, 0.001486f, 0.025939f, 0.033878f, -0.003267f, 0.009811f, 0.036459f, -0.024843f, 0.011763f, -0.015286f, 0.025314f, -0.008509f, 0.048589f, 0.020943f, -0.014146f, -0.023292f, 0.004482f, 0.010291f, 0.020701f, 0.004561f, -0.016560f, -0.004797f, 0.016584f, 0.034742f, -0.014106f, 0.023030f, -0.007944f, 0.013734f, -0.027094f, 0.010169f, -0.014393f, 0.010184f, 0.002559f, 0.002839f, -0.004312f, 0.021144f, 0.031421f, -0.056585f, 0.017659f, 0.010773f, 0.009027f, -0.011015f, 0.008081f, -0.040845f, 0.004155f, -0.000142f, -0.005492f, -0.016138f, -0.012535f, -0.014079f, -0.003106f, 0.027665f, -0.015691f, -0.010522f, -0.022376f, -0.000032f, 0.021248f, -0.011152f, -0.010727f, 0.014998f, 0.000160f, 0.010645f, + 0.003297f, -0.003717f, 0.001017f, 0.004189f, -0.010306f, 0.004688f, 0.002964f, -0.010407f, -0.007217f, -0.005562f, 0.003518f, 0.005508f, 0.007355f, 0.018405f, -0.001313f, 0.013707f, 0.007937f, 0.003827f, -0.008925f, -0.003960f, -0.013853f, -0.007550f, -0.001693f, -0.005860f, -0.006188f, 0.007130f, 0.005442f, 0.008699f, 0.013158f, 0.001333f, -0.002062f, -0.002585f, -0.007196f, 0.003809f, -0.001486f, -0.000971f, 0.004872f, -0.006521f, 0.027664f, 0.029663f, -0.006570f, 0.030837f, -0.001705f, -0.006278f, 0.002298f, 0.017394f, -0.006593f, -0.007695f, -0.003715f, -0.021703f, 0.003455f, -0.006130f, 0.034259f, 0.022761f, -0.016519f, -0.017240f, -0.032775f, -0.011828f, 0.023579f, 0.042836f, -0.019566f, 0.013318f, 0.002732f, 0.005745f, 0.023138f, 0.016776f, -0.033576f, 0.006767f, -0.012070f, -0.006674f, -0.013927f, -0.007418f, -0.014691f, -0.032116f, 0.005520f, 0.021680f, 0.008137f, 0.050616f, -0.012403f, -0.006843f, 0.034954f, -0.012670f, -0.002084f, -0.007709f, 0.009167f, -0.038411f, -0.024856f, 0.013508f, 0.028696f, 0.042121f, 0.050007f, -0.036726f, -0.019242f, -0.001817f, 0.016645f, -0.001537f, + 0.056759f, 0.015948f, 0.008378f, -0.044020f, 0.002939f, 0.000439f, 0.021219f, 0.027968f, -0.020879f, -0.006765f, 0.008583f, -0.008932f, -0.000124f, 0.031761f, 0.011294f, -0.031167f, 0.008042f, 0.016620f, -0.015144f, 0.049329f, -0.017139f, -0.026195f, -0.037060f, 0.027426f, -0.006030f, -0.030885f, -0.024695f, -0.005508f, -0.001262f, -0.012216f, 0.000621f, -0.013310f, 0.002502f, -0.018578f, 0.001200f, 0.009261f, -0.006557f, 0.007320f, 0.001326f, -0.011185f, 0.001164f, -0.000053f, -0.002269f, 0.001333f, -0.007776f, 0.009417f, 0.000004f, -0.004614f, 0.010539f, 0.010916f, 0.000405f, -0.002847f, 0.004673f, -0.010036f, -0.004299f, -0.008036f, -0.001606f, 0.008525f, -0.006670f, 0.003808f, 0.008218f, -0.015154f, -0.005517f, -0.003014f, 0.002478f, -0.002750f, 0.006555f, 0.014949f, -0.004212f, -0.008707f, -0.004335f, 0.009709f, 0.002704f, 0.001049f, 0.007665f, -0.004293f, -0.003173f, -0.002637f, -0.004301f, -0.003438f, 0.006725f, 0.058441f, 0.027549f, -0.015219f, -0.005039f, -0.053720f, 0.004081f, 0.014344f, 0.003642f, 0.080376f, -0.010266f, -0.005989f, -0.035383f, -0.030387f, 0.012388f, -0.024836f, + -0.015342f, -0.016636f, -0.011367f, 0.020014f, -0.013155f, -0.022843f, -0.019890f, 0.001848f, 0.019993f, -0.025851f, 0.005700f, 0.011763f, 0.002461f, 0.029011f, -0.003503f, 0.002313f, -0.029585f, -0.041405f, -0.017212f, 0.019019f, -0.023012f, 0.005572f, -0.019350f, -0.072327f, -0.039113f, 0.021702f, 0.001388f, -0.041446f, 0.006226f, 0.057752f, -0.002837f, -0.001499f, -0.022724f, 0.012630f, -0.025062f, -0.044612f, 0.000941f, 0.006763f, -0.017496f, 0.008543f, 0.016595f, -0.004159f, -0.014782f, 0.012005f, 0.015411f, 0.028942f, -0.016878f, 0.021737f, 0.027699f, 0.011719f, 0.048325f, 0.005403f, -0.030400f, 0.035348f, 0.001916f, 0.005874f, -0.006677f, -0.007182f, 0.021644f, -0.021704f, -0.003336f, 0.053794f, 0.042010f, -0.026209f, 0.026804f, -0.007878f, 0.049746f, 0.020985f, -0.017567f, -0.039996f, -0.001976f, -0.014679f, -0.017570f, 0.011173f, -0.015857f, -0.000563f, -0.004242f, -0.014047f, -0.023622f, -0.004676f, 0.019538f, -0.021394f, -0.000134f, -0.013332f, 0.001778f, 0.008222f, -0.008868f, -0.025030f, -0.004646f, -0.011919f, 0.014914f, 0.009052f, -0.006329f, -0.016625f, -0.007106f, -0.017884f, + 0.010416f, -0.008866f, 0.005536f, 0.006807f, 0.009910f, 0.007956f, -0.014058f, -0.009949f, -0.015762f, 0.004397f, 0.009672f, 0.001106f, 0.019521f, 0.020796f, 0.011127f, 0.008319f, -0.005704f, 0.010993f, -0.001591f, -0.005608f, -0.042473f, -0.043905f, -0.053692f, 0.073820f, -0.041108f, 0.010206f, -0.002795f, -0.022716f, 0.036653f, -0.043160f, 0.018385f, 0.078484f, 0.047415f, 0.011706f, -0.063684f, -0.002965f, -0.042193f, -0.020551f, -0.038569f, -0.003022f, 0.010305f, -0.006253f, 0.029418f, -0.013782f, 0.004476f, 0.015402f, 0.041324f, 0.006433f, 0.005284f, 0.051237f, -0.033807f, -0.004098f, 0.021845f, -0.009134f, -0.026318f, -0.016539f, 0.025035f, -0.021593f, 0.010232f, 0.043976f, -0.012519f, -0.077467f, -0.005228f, 0.020210f, -0.096404f, 0.058563f, 0.044205f, -0.035735f, 0.059069f, 0.041005f, 0.026121f, 0.062407f, 0.000900f, 0.032398f, 0.003234f, 0.004422f, 0.021821f, -0.038555f, 0.038740f, 0.053876f, 0.040522f, -0.041549f, -0.008669f, 0.059155f, -0.028774f, 0.047055f, 0.042106f, 0.100054f, 0.059545f, 0.004124f, 0.006493f, -0.012134f, 0.012088f, 0.018022f, -0.057961f, -0.081690f, + -0.029070f, 0.007893f, 0.002717f, -0.011115f, 0.064138f, 0.031139f, 0.011803f, -0.027617f, 0.025232f, -0.019349f, -0.025810f, -0.012260f, 0.028866f, 0.034774f, 0.006237f, -0.005356f, -0.006869f, 0.001792f, -0.040266f, -0.008681f, -0.010624f, 0.013713f, 0.007126f, -0.019937f, -0.016088f, -0.000167f, 0.031212f, -0.007968f, -0.012420f, 0.001655f, -0.012846f, -0.031091f, 0.015709f, -0.006047f, -0.012747f, -0.017872f, -0.000141f, 0.011456f, 0.001841f, -0.055881f, -0.003455f, 0.028838f, -0.004476f, 0.002007f, 0.004448f, 0.009007f, 0.023586f, 0.019849f, 0.000627f, 0.000663f, -0.009336f, -0.002007f, 0.004634f, 0.045003f, 0.055045f, -0.108253f, -0.099662f, 0.043643f, -0.028828f, -0.031003f, -0.013288f, -0.037524f, 0.013189f, -0.060969f, 0.077129f, 0.029405f, -0.032477f, -0.000371f, -0.031767f, -0.023391f, -0.025644f, -0.028768f, -0.019077f, -0.073580f, -0.066627f, -0.012046f, -0.015287f, 0.004575f, 0.006114f, 0.013206f, -0.004854f, 0.009788f, 0.012198f, 0.033254f, 0.036252f, -0.013370f, -0.018570f, -0.021196f, -0.018453f, -0.041450f, 0.062104f, -0.021602f, 0.015044f, 0.046615f, 0.043563f, -0.016192f, + -0.018847f, -0.034430f, -0.022988f, -0.028195f, 0.047733f, 0.005503f, 0.005799f, -0.058799f, -0.021099f, 0.085994f, -0.008393f, 0.080093f, -0.016182f, -0.029431f, -0.018908f, -0.033320f, -0.034633f, -0.005911f, 0.000317f, -0.047087f, 0.003935f, 0.023153f, -0.001975f, 0.018297f, -0.109730f, -0.043879f, -0.030743f, 0.058702f, -0.013945f, 0.010047f, 0.019882f, 0.091907f, 0.025935f, -0.007959f, -0.009314f, 0.079217f, 0.047572f, 0.012095f, 0.015384f, -0.003545f, 0.062550f, -0.025569f, -0.035612f, 0.019772f, 0.029436f, 0.052689f, 0.048613f, -0.027944f, 0.033022f, 0.025161f, 0.026636f, 0.008421f, -0.018889f, -0.036968f, -0.031730f, 0.020365f, 0.027600f, 0.015220f, 0.010012f, 0.032998f, -0.003057f, -0.008428f, -0.001702f, -0.002149f, 0.017070f, 0.010713f, 0.022239f, 0.039128f, 0.027416f, 0.044683f, 0.012120f, -0.039081f, 0.012818f, 0.011187f, 0.034718f, -0.000052f, 0.027276f, 0.012134f, 0.026259f, 0.001218f, -0.049577f, -0.005819f, -0.010641f, -0.002712f, -0.022157f, -0.012656f, -0.057324f, 0.119086f, -0.038443f, -0.023936f, 0.070602f, -0.044777f, -0.067553f, 0.062638f, -0.090943f, -0.026337f, + 0.021444f, 0.015583f, -0.063443f, -0.024921f, 0.054453f, 0.000312f, -0.010742f, -0.035461f, 0.042729f, -0.042445f, 0.002792f, 0.033605f, -0.011253f, 0.030851f, 0.000192f, -0.015306f, 0.010316f, 0.007292f, -0.018463f, 0.029329f, -0.016210f, -0.006602f, 0.008724f, -0.000631f, 0.001771f, -0.005570f, 0.008661f, 0.018592f, 0.030073f, 0.043336f, 0.021207f, -0.017974f, -0.005082f, -0.027574f, 0.025351f, -0.009206f, -0.039860f, 0.009287f, 0.000063f, -0.022705f, -0.054468f, 0.038226f, 0.002783f, -0.025205f, 0.061320f, 0.003488f, -0.019149f, -0.011131f, 0.090867f, -0.085175f, -0.091791f, 0.055842f, 0.087074f, -0.160984f, 0.000621f, -0.059612f, -0.054262f, -0.023977f, 0.058382f, -0.045269f, 0.077313f, -0.010998f, -0.002117f, 0.104134f, -0.029625f, -0.080654f, 0.099897f, 0.117912f, -0.114766f, 0.128016f, -0.043389f, 0.003153f, 0.105575f, -0.035417f, -0.040777f, 0.029034f, 0.028160f, -0.013593f, -0.005648f, 0.019670f, 0.003599f, 0.002542f, -0.025518f, 0.034853f, -0.000138f, -0.002223f, 0.000311f, 0.004738f, 0.015356f, 0.009591f, -0.013084f, -0.013794f, 0.014239f, 0.034812f, -0.030471f, -0.027744f, + -0.007922f, 0.036477f, -0.001725f, 0.019563f, -0.005737f, 0.008259f, -0.000338f, 0.008467f, -0.004649f, -0.006182f, -0.043470f, -0.017812f, 0.010218f, -0.015268f, -0.004893f, -0.014992f, -0.023794f, 0.036591f, 0.022073f, -0.062837f, 0.024576f, 0.033117f, -0.007090f, 0.000143f, -0.022947f, 0.032861f, 0.070221f, -0.032469f, -0.045548f, -0.011679f, 0.010607f, 0.072706f, 0.053173f, -0.018132f, -0.006364f, 0.023177f, 0.057993f, -0.018838f, -0.003905f, 0.036647f, -0.046692f, -0.038918f, 0.030975f, -0.020329f, -0.016303f, -0.018660f, -0.002346f, -0.031198f, 0.001963f, 0.022607f, -0.014003f, 0.017630f, -0.015599f, -0.008701f, -0.010037f, -0.043401f, 0.006028f, -0.017131f, 0.026525f, 0.058547f, 0.002659f, 0.029561f, 0.023367f, 0.002970f, 0.010407f, 0.018858f, 0.060812f, -0.042608f, 0.029129f, 0.026846f, -0.031905f, 0.021808f, 0.019968f, 0.007329f, -0.028364f, -0.054927f, -0.056855f, 0.019409f, 0.019727f, -0.020457f, -0.094681f, 0.077440f, -0.026278f, -0.040421f, -0.024320f, 0.077914f, -0.036727f, 0.085133f, -0.000473f, 0.029185f, -0.079793f, 0.075861f, -0.034821f, 0.034117f, -0.010622f, -0.107611f, + -0.034674f, 0.022303f, -0.067510f, 0.069871f, 0.006934f, -0.098548f, -0.112350f, -0.056604f, 0.077305f, 0.020189f, -0.069917f, 0.085663f, -0.091527f, -0.003474f, 0.163965f, 0.025631f, 0.008887f, 0.017391f, 0.012007f, -0.042103f, 0.044489f, 0.004407f, 0.022513f, -0.027879f, 0.042751f, -0.022761f, -0.023202f, -0.017941f, -0.002870f, -0.000046f, 0.012642f, -0.003176f, -0.006795f, 0.009662f, -0.015497f, -0.029943f, 0.027896f, -0.009239f, -0.005306f, -0.035715f, 0.016456f, 0.009475f, 0.015600f, 0.005682f, 0.018070f, -0.012403f, 0.003939f, 0.052469f, -0.006372f, 0.001906f, 0.026685f, -0.027663f, -0.006535f, 0.002925f, -0.003320f, 0.021343f, -0.020972f, 0.023815f, -0.008208f, -0.056288f, 0.003344f, -0.013556f, 0.025485f, 0.019872f, 0.017297f, -0.019551f, 0.022653f, -0.036214f, -0.068334f, -0.000032f, -0.072614f, 0.019683f, -0.006244f, -0.013371f, 0.024608f, 0.039922f, -0.025588f, 0.005435f, 0.044471f, -0.035025f, 0.060229f, -0.008362f, -0.065809f, 0.056275f, -0.027043f, -0.012486f, 0.050632f, -0.064993f, 0.017225f, 0.000714f, 0.023632f, -0.010539f, -0.023544f, -0.099014f, 0.022789f, -0.041104f, + -0.098902f, 0.119343f, -0.080464f, -0.033996f, -0.015861f, -0.027681f, -0.060712f, 0.033722f, 0.082774f, -0.051582f, 0.023317f, -0.074635f, -0.041860f, -0.042720f, 0.037454f, 0.006275f, 0.108540f, -0.019114f, -0.008961f, -0.032817f, -0.093469f, -0.000363f, 0.045549f, -0.035053f, 0.038235f, 0.045430f, -0.038697f, 0.003379f, -0.033002f, -0.138688f, -0.072463f, -0.043035f, -0.145184f, 0.092306f, 0.122283f, 0.056995f, -0.123121f, -0.099490f, -0.220878f, 0.031405f, 0.262557f, 0.120920f, 0.046362f, -0.069574f, -0.242302f, -0.055583f, 0.056035f, 0.165029f, 0.165990f, -0.113417f, -0.095536f, -0.044910f, 0.021583f, 0.010851f, 0.180291f, 0.002435f, -0.022100f, 0.014078f, -0.018011f, -0.044661f, 0.063319f, 0.010769f, -0.013765f, 0.034485f, -0.028945f, -0.049770f, 0.034644f, 0.029489f, -0.083864f, 0.055686f, -0.012738f, -0.019105f, -0.044813f, 0.046642f, -0.045295f, 0.053473f, -0.026931f, 0.054737f, -0.065677f, 0.025438f, -0.018592f, 0.000132f, 0.046926f, 0.076561f, 0.021543f, -0.029495f, -0.020815f, -0.005594f, 0.042318f, -0.007623f, 0.061005f, -0.048862f, -0.038292f, 0.016859f, 0.060414f, 0.006322f, + 0.036606f, -0.049149f, -0.014603f, -0.016331f, 0.037516f, -0.003277f, 0.005582f, -0.011486f, -0.104589f, 0.076048f, -0.015430f, -0.015872f, 0.001243f, 0.034603f, 0.000018f, -0.005867f, 0.024508f, 0.009285f, 0.007749f, 0.040712f, -0.026010f, 0.000365f, 0.020189f, -0.006605f, -0.004397f, 0.025914f, -0.024070f, -0.005039f, 0.006494f, 0.040368f, -0.026864f, -0.017979f, 0.021623f, -0.000393f, 0.011873f, -0.038683f, 0.050997f, -0.011642f, 0.016810f, -0.010618f, 0.006046f, 0.028781f, 0.011775f, -0.005946f, 0.023594f, -0.008556f, 0.023855f, -0.018613f, -0.002038f, 0.025893f, -0.006409f, -0.009844f, -0.051537f, 0.005816f, 0.038787f, 0.004769f, 0.017867f, -0.025145f, -0.008772f, -0.014800f, -0.016787f, -0.006005f, 0.027903f, -0.009762f, 0.016778f, -0.021810f, -0.027401f, -0.010874f, 0.005799f, 0.052728f, -0.020559f, 0.024326f, 0.000990f, 0.005820f, -0.026038f, 0.014553f, 0.026470f, 0.002095f, -0.025188f, 0.019666f, -0.016972f, 0.013396f, -0.010574f, -0.006604f, -0.010138f, 0.004174f, 0.018408f, -0.008910f, -0.005423f, 0.009418f, -0.001690f, -0.013761f, -0.003637f, 0.014804f, 0.011461f, -0.011841f, + 0.001574f, 0.013590f, -0.000012f, -0.007204f, 0.001541f, -0.011911f, 0.008876f, -0.000111f, 0.004275f, -0.005037f, 0.001917f, 0.008915f, -0.004648f, 0.010332f, 0.001312f, 0.009490f, 0.006183f, -0.013518f, -0.014960f, -0.004183f, 0.024706f, -0.015353f, 0.017006f, 0.014748f, -0.010770f, -0.025329f, 0.019231f, -0.015998f, 0.021799f, -0.001347f, -0.004217f, -0.008437f, 0.003208f, 0.004465f, -0.001864f, -0.002221f, 0.001390f, 0.003009f, -0.010487f, 0.099084f, 0.019555f, -0.052950f, -0.037783f, -0.058493f, -0.018679f, 0.011373f, 0.031020f, -0.009626f, -0.012674f, -0.010741f, -0.010536f, -0.009780f, 0.014129f, -0.007131f, -0.002082f, -0.003045f, -0.010402f, -0.002375f, 0.015542f, 0.002325f, -0.004611f, -0.015540f, 0.017852f, -0.023182f, 0.013591f, -0.008227f, -0.022920f, 0.000178f, 0.010328f, 0.011788f, 0.009083f, -0.013414f, 0.002929f, -0.004250f, -0.007464f, 0.027577f, -0.024564f, -0.004397f, -0.001068f, -0.001621f, 0.002509f, -0.004028f, -0.014453f, 0.012178f, -0.022864f, 0.021811f, -0.003248f, -0.015205f, 0.005215f, -0.007813f, 0.019287f, -0.011249f, -0.006895f, 0.020949f, -0.018768f, 0.006575f, + -0.009008f, -0.001994f, 0.015973f, -0.011376f, -0.004590f, 0.014422f, -0.009895f, 0.003842f, 0.001441f, -0.011595f, 0.028324f, -0.024705f, -0.002147f, 0.010981f, -0.006331f, 0.018188f, -0.008249f, -0.003932f, 0.004714f, 0.006050f, -0.001980f, 0.004087f, -0.001629f, -0.007961f, 0.007179f, 0.000065f, 0.000682f, 0.004022f, -0.000537f, 0.005731f, -0.005728f, 0.001736f, 0.001118f, 0.001348f, -0.000721f, -0.003453f, 0.004610f, -0.000589f, -0.001237f, -0.003271f, 0.004075f, 0.006744f, -0.002276f, -0.003336f, 0.002065f, 0.003974f, -0.004926f, 0.004143f, -0.003719f, -0.003116f, 0.010659f, -0.001555f, 0.003926f, 0.005704f, -0.007397f, 0.018236f, -0.005975f, -0.000871f, -0.000929f, -0.010397f, 0.010830f, -0.006689f, -0.010872f, 0.009741f, -0.046898f, -0.070354f, 0.092228f, 0.287907f, 0.024602f, 0.025112f, -0.196282f, -0.248174f, -0.051763f, -0.052523f, 0.146175f, 0.248923f, 0.127667f, 0.024640f, -0.090088f, -0.175162f, -0.123720f, -0.088371f, -0.004629f, 0.121306f, 0.177140f, 0.095811f, 0.021903f, -0.062060f, -0.110453f, -0.061767f, -0.059522f, -0.055650f, 0.035177f, 0.072252f, 0.071117f, 0.071744f, + 0.017201f, -0.031010f, -0.012785f, -0.047162f, -0.073964f, -0.008125f, -0.022077f, -0.014853f, 0.066726f, 0.038640f, 0.055740f, 0.033895f, -0.025313f, -0.060765f, -0.014679f, -0.039469f, -0.006134f, 0.027729f, 0.008450f, 0.015017f, 0.030144f, -0.015218f, -0.021427f, -0.004850f, -0.012598f, 0.012253f, 0.019458f, 0.001136f, 0.024026f, 0.014349f, -0.025263f, -0.024203f, -0.038715f, -0.033009f, 0.001453f, 0.040008f, 0.060500f, 0.029236f, 0.007640f, -0.013980f, -0.040522f, -0.006863f, -0.045688f, -0.027933f, 0.021496f, 0.016965f, 0.051150f, 0.017329f, -0.013029f, 0.015170f, -0.026531f, -0.045927f, 0.008095f, 0.011770f, 0.015427f, 0.014364f, -0.002884f, -0.005650f, -0.004406f, -0.019033f, -0.014668f, 0.010143f, 0.015614f, 0.015813f, 0.015935f, -0.004305f, -0.015401f, -0.010096f, -0.005912f, 0.000523f, -0.000317f, -0.017304f, 0.004468f, 0.022061f, 0.011846f, 0.013777f, -0.004057f, -0.021952f, -0.012817f, -0.012905f, 0.005111f, 0.015617f, 0.010230f, 0.009703f, 0.004159f, -0.003020f, -0.016726f, -0.021917f, -0.010075f, 0.001499f, 0.013667f, 0.021912f, 0.013355f, 0.013569f, 0.008500f, -0.013679f, + -0.025649f, -0.032804f, -0.021333f, 0.009393f, 0.018521f, 0.024148f, 0.033295f, 0.010289f, -0.009920f, -0.016607f, -0.013560f, -0.009913f, -0.009477f, -0.009500f, -0.002740f, 0.007643f, 0.014751f, 0.013151f, 0.010250f, 0.007299f, 0.001725f, -0.009040f, -0.016019f, -0.015321f, -0.007795f, -0.000093f, 0.006948f, 0.009488f, 0.008704f, 0.004634f, 0.002840f, 0.001163f, -0.001336f, -0.005774f, -0.007138f, -0.005817f, -0.001947f, 0.002510f, 0.004334f, 0.003594f, 0.000896f, -0.000930f, 0.000693f, 0.000602f, 0.000984f, 0.000412f, -0.001385f, -0.002730f, -0.000867f, 0.001436f, 0.000438f, -0.002234f, -0.001136f, 0.000654f, 0.000561f, -0.000289f, 0.001781f, 0.003880f, 0.003580f, -0.001521f, -0.004076f, -0.003094f, -0.001024f, -0.000158f, -0.000027f, -0.000350f, 0.001214f, 0.002635f, 0.002610f, 0.000399f, -0.000503f, -0.000459f, -0.001080f, -0.002011f, -0.001607f, -0.001019f, 0.000453f, 0.001035f, 0.001849f, 0.001472f, 0.000548f, -0.000394f, -0.000497f, -0.001164f, -0.001015f, -0.000911f, 0.000047f, 0.000713f, 0.001224f, 0.000473f, 0.000163f, -0.000488f, -0.000494f, -0.000712f, -0.000017f, 0.000399f, + 0.000724f, 0.000182f, 0.000166f, -0.000290f, -0.000305f, -0.000497f, 0.000019f, -0.000005f, 0.000239f, 0.000030f, 0.000212f, -0.000081f, 0.000093f, -0.000147f, 0.000068f, -0.000129f}, + {0.002302f, 0.006414f, 0.004973f, -0.001641f, 0.003807f, 0.001840f, 0.010993f, -0.001906f, -0.000309f, 0.001402f, 0.008041f, -0.001579f, -0.008420f, -0.003895f, -0.008083f, 0.001978f, -0.002887f, -0.000662f, -0.001033f, 0.001960f, 0.000765f, 0.001649f, 0.004661f, 0.008602f, -0.003832f, -0.002104f, 0.001703f, -0.004046f, -0.000572f, 0.006711f, -0.003653f, 0.008293f, 0.000842f, -0.002966f, 0.005491f, -0.007506f, -0.001935f, -0.005228f, 0.007335f, -0.000214f, -0.002722f, -0.001993f, 0.000080f, 0.006831f, 0.000268f, 0.008221f, 0.003149f, -0.006750f, 0.005463f, -0.002949f, -0.005051f, -0.004119f, 0.005617f, -0.001169f, 0.017913f, 0.001905f, 0.004500f, 0.003264f, -0.008355f, 0.000127f, -0.001236f, 0.002189f, -0.004746f, -0.003202f, 0.009334f, 0.007653f, 0.000689f, 0.003184f, -0.000858f, 0.004765f, -0.007706f, 0.000791f, 0.005783f, 0.003652f, 0.000587f, -0.000589f, 0.004121f, -0.006529f, -0.003015f, 0.006965f, -0.004577f, 0.001488f, 0.003386f, 0.004123f, 0.001262f, -0.005218f, -0.003486f, 0.002762f, 0.000606f, 0.002739f, -0.000832f, 0.000794f, -0.002612f, -0.000138f, -0.001303f, -0.000760f, + 0.001485f, 0.002873f, 0.001203f, -0.001655f, -0.000649f, -0.001117f, 0.000672f, 0.001761f, -0.001039f, 0.001302f, 0.000946f, 0.001832f, -0.000261f, 0.002195f, -0.000890f, 0.000556f, 0.001340f, 0.001722f, -0.013683f, -0.012329f, -0.007691f, -0.006983f, -0.006072f, 0.002333f, 0.008613f, 0.017593f, 0.003358f, 0.004543f, -0.000052f, -0.012546f, -0.005271f, -0.004657f, -0.011294f, 0.017553f, 0.004646f, 0.006974f, 0.004800f, -0.003878f, 0.001768f, 0.016803f, 0.006687f, -0.003952f, -0.000344f, -0.004076f, 0.000332f, -0.007776f, 0.004656f, -0.002454f, -0.003506f, 0.000664f, 0.008906f, 0.000942f, 0.003092f, 0.005593f, 0.007717f, -0.013872f, 0.000156f, 0.003521f, 0.008047f, 0.012401f, -0.006925f, -0.001402f, -0.003368f, 0.010343f, 0.005579f, 0.006669f, -0.001129f, 0.003091f, 0.020665f, -0.013072f, 0.002596f, 0.001216f, -0.008763f, 0.003720f, -0.012233f, -0.001645f, 0.003108f, -0.002645f, -0.018432f, 0.005159f, 0.001247f, -0.004980f, -0.005127f, -0.000855f, -0.002795f, 0.006212f, -0.005865f, -0.002591f, 0.001787f, -0.000200f, -0.005707f, -0.000281f, 0.004628f, -0.007715f, 0.000657f, -0.002111f, + -0.001875f, -0.002408f, -0.001386f, 0.001166f, -0.004522f, -0.003397f, 0.000639f, -0.002702f, -0.003584f, -0.003670f, -0.001282f, -0.002443f, 0.004442f, -0.003956f, -0.001143f, 0.000617f, 0.002217f, -0.000277f, 0.000123f, -0.001392f, 0.000242f, -0.002381f, 0.001746f, -0.001601f, -0.001587f, -0.000475f, -0.003481f, 0.018616f, 0.001552f, 0.006726f, -0.000850f, -0.004904f, 0.000320f, 0.013101f, 0.006589f, 0.008479f, 0.013389f, -0.005878f, 0.000058f, 0.013147f, 0.004103f, 0.005815f, 0.000666f, 0.001679f, 0.007585f, -0.006867f, -0.002121f, 0.009793f, -0.006696f, 0.003869f, 0.005459f, -0.004077f, 0.003993f, 0.013106f, -0.006255f, 0.004882f, 0.000961f, 0.000574f, 0.000094f, -0.002650f, -0.008971f, -0.002692f, -0.007527f, -0.000722f, 0.003048f, 0.006308f, 0.006532f, -0.001127f, -0.011231f, -0.000963f, 0.016231f, -0.005986f, 0.003225f, -0.002871f, -0.017212f, 0.010068f, 0.002454f, 0.007488f, -0.001307f, 0.008519f, 0.008194f, -0.014545f, 0.005769f, 0.000484f, 0.005412f, -0.001044f, -0.010285f, -0.000453f, -0.001494f, -0.001847f, -0.001979f, 0.006560f, -0.000078f, 0.001305f, 0.013202f, 0.002595f, + 0.010489f, 0.000367f, 0.000983f, 0.002044f, -0.005814f, -0.009072f, 0.006195f, -0.006860f, 0.004062f, 0.002580f, -0.000388f, 0.004363f, -0.004625f, -0.002592f, 0.002887f, 0.000174f, -0.008812f, 0.002856f, 0.001015f, 0.001162f, -0.001800f, 0.003835f, 0.000342f, -0.001499f, 0.004225f, -0.000946f, -0.000385f, -0.003512f, 0.001246f, -0.001742f, 0.000594f, 0.000048f, -0.000538f, 0.000869f, -0.001358f, 0.002314f, 0.000515f, -0.000881f, 0.000651f, -0.000520f, 0.000238f, -0.000085f, -0.001420f, -0.000114f, 0.030424f, 0.016999f, 0.026043f, 0.008374f, -0.010711f, 0.005466f, -0.004761f, 0.000683f, 0.002587f, -0.022196f, -0.005840f, -0.006142f, 0.005787f, 0.008664f, -0.003519f, -0.000549f, 0.002996f, 0.000666f, 0.015925f, -0.001781f, -0.016549f, 0.005384f, -0.009535f, 0.007358f, 0.008505f, 0.006697f, 0.009898f, -0.002386f, -0.003311f, 0.003960f, -0.002856f, -0.003886f, 0.002916f, -0.002600f, 0.005984f, 0.008423f, -0.003550f, -0.012814f, 0.004223f, -0.012461f, -0.007918f, -0.001577f, -0.025795f, 0.000246f, -0.004266f, 0.010151f, 0.009799f, 0.004679f, 0.015980f, 0.015964f, 0.007190f, 0.003557f, + -0.001036f, 0.000781f, 0.001024f, -0.007235f, 0.014945f, -0.001969f, 0.005283f, -0.004690f, -0.005517f, -0.002026f, -0.008331f, 0.007484f, -0.003776f, -0.003117f, 0.014676f, -0.012086f, -0.003567f, 0.003101f, -0.005400f, -0.001656f, -0.000291f, 0.005121f, 0.006172f, 0.004068f, 0.010513f, -0.003355f, -0.002648f, -0.001465f, -0.006339f, 0.003482f, 0.006825f, 0.009169f, 0.000018f, -0.001332f, -0.001745f, 0.000164f, 0.002168f, 0.001980f, -0.002535f, 0.003094f, 0.000172f, 0.002252f, 0.002076f, -0.000303f, -0.000497f, 0.003992f, -0.000903f, 0.002056f, 0.001846f, 0.001902f, 0.001860f, -0.001037f, 0.001714f, 0.006710f, -0.000241f, 0.000423f, 0.001036f, 0.004986f, 0.001140f, -0.000992f, -0.003209f, 0.002670f, 0.002160f, -0.001062f, 0.001151f, -0.011257f, -0.026912f, -0.009215f, -0.003064f, 0.004071f, -0.003586f, 0.008345f, -0.002048f, 0.013297f, -0.011996f, 0.007165f, -0.003167f, 0.024221f, 0.009781f, -0.004988f, -0.010519f, 0.005787f, -0.014855f, -0.007574f, 0.005383f, -0.004915f, -0.008956f, 0.016817f, 0.006675f, -0.000733f, -0.007894f, -0.010145f, 0.006801f, 0.005625f, 0.005022f, -0.000242f, + -0.002800f, -0.006191f, 0.009545f, -0.012534f, -0.005677f, -0.000388f, 0.008850f, 0.007135f, -0.000855f, 0.010189f, 0.001060f, -0.004472f, 0.001837f, -0.004454f, -0.005040f, -0.005424f, 0.006846f, -0.004961f, -0.000352f, 0.009498f, 0.013707f, 0.014413f, 0.005649f, 0.005235f, -0.001093f, 0.008249f, -0.003398f, 0.011778f, -0.002169f, 0.007582f, 0.005541f, -0.004570f, 0.000448f, -0.005025f, 0.005489f, 0.005116f, 0.001832f, -0.001588f, -0.009872f, 0.007080f, -0.010729f, -0.001066f, -0.011595f, 0.004430f, -0.000970f, -0.000879f, 0.002065f, -0.009515f, 0.000338f, 0.002766f, 0.015709f, 0.005367f, 0.002561f, 0.003989f, 0.006074f, 0.002962f, 0.003111f, -0.004470f, 0.003462f, 0.002938f, -0.006564f, -0.000300f, 0.000273f, 0.001631f, 0.002701f, -0.002948f, 0.001989f, -0.001819f, 0.000383f, -0.000139f, 0.003939f, 0.000675f, 0.000450f, 0.000739f, 0.001296f, -0.000572f, 0.003576f, -0.001718f, 0.001317f, 0.001672f, 0.003451f, 0.001929f, 0.004808f, -0.003237f, 0.001769f, -0.000555f, 0.005553f, 0.002419f, 0.001962f, -0.000446f, -0.000811f, 0.000718f, -0.001115f, -0.000881f, -0.003721f, -0.012428f, + -0.026060f, -0.021067f, 0.001334f, -0.018002f, -0.008839f, -0.025489f, -0.013541f, -0.015541f, 0.006204f, -0.008310f, -0.011010f, -0.003792f, 0.000634f, -0.006565f, -0.024712f, 0.006633f, -0.004346f, 0.002477f, -0.011168f, 0.011159f, 0.004170f, 0.000247f, -0.009930f, -0.004442f, 0.012697f, 0.008632f, 0.000598f, -0.001886f, -0.008458f, 0.005299f, 0.002786f, 0.005489f, -0.010132f, -0.000941f, -0.008222f, -0.007407f, -0.008041f, 0.000849f, 0.016447f, -0.013369f, 0.000331f, -0.012734f, 0.001349f, 0.005950f, 0.007487f, -0.013425f, 0.013566f, 0.016433f, -0.005366f, -0.003884f, -0.002818f, -0.000626f, 0.005266f, 0.006648f, 0.001689f, 0.004533f, -0.007953f, -0.001528f, -0.002922f, 0.014153f, -0.004373f, 0.015662f, -0.000350f, -0.004765f, 0.012521f, -0.001268f, -0.007408f, 0.002703f, 0.013564f, 0.015599f, -0.001115f, -0.004831f, -0.008422f, 0.005402f, -0.011258f, -0.001079f, 0.007626f, -0.005751f, 0.003466f, -0.000355f, -0.000015f, -0.004611f, 0.000158f, -0.003563f, -0.005605f, -0.000526f, 0.004845f, 0.002585f, 0.004828f, -0.002081f, -0.001485f, -0.003762f, 0.001553f, -0.003027f, 0.005028f, 0.002586f, + 0.007002f, 0.000718f, -0.001555f, -0.000554f, -0.001163f, -0.002392f, 0.003247f, -0.002106f, -0.001182f, 0.001373f, 0.001138f, -0.003347f, -0.001119f, 0.000990f, 0.000181f, -0.001811f, -0.003232f, -0.000127f, -0.002973f, -0.002027f, -0.001198f, 0.004082f, -0.000209f, 0.001470f, 0.001286f, 0.000260f, -0.002299f, -0.000623f, -0.000197f, -0.019970f, -0.020222f, -0.022980f, 0.006631f, -0.018578f, -0.007987f, 0.018202f, 0.008609f, -0.020182f, -0.001550f, 0.000373f, 0.008763f, 0.013483f, 0.022554f, -0.005980f, -0.008357f, -0.022184f, -0.027623f, -0.016044f, -0.005706f, 0.011355f, -0.011317f, 0.005549f, -0.015997f, 0.016598f, -0.012053f, 0.013360f, -0.006311f, 0.002009f, 0.003255f, -0.002497f, -0.011893f, 0.018697f, -0.016199f, -0.000660f, -0.008732f, 0.002414f, -0.010142f, 0.002432f, -0.040287f, 0.000788f, 0.018474f, -0.023732f, 0.005265f, 0.016437f, 0.005671f, -0.012302f, -0.001566f, 0.019755f, -0.024372f, 0.000039f, 0.009721f, 0.009616f, 0.009127f, -0.003378f, -0.003681f, -0.015534f, -0.007944f, 0.006520f, 0.010496f, 0.017105f, 0.020552f, -0.030426f, 0.011435f, -0.009113f, 0.002056f, -0.021426f, + -0.008934f, 0.017823f, 0.004146f, 0.002530f, -0.012006f, 0.000105f, 0.011250f, 0.008411f, 0.004917f, -0.010571f, -0.007076f, 0.011182f, -0.003134f, -0.004618f, -0.002590f, -0.007766f, 0.006499f, -0.001218f, -0.006393f, -0.002302f, -0.002322f, 0.001672f, -0.004205f, -0.004196f, 0.001278f, 0.001582f, 0.001509f, -0.002368f, -0.003743f, 0.003085f, -0.002467f, -0.008052f, -0.000918f, -0.002365f, 0.004708f, -0.003716f, 0.000047f, 0.000430f, 0.001756f, -0.005037f, -0.003061f, -0.001802f, 0.000327f, 0.005412f, -0.000845f, -0.001261f, 0.003102f, 0.000079f, 0.003044f, -0.001527f, -0.003832f, -0.001352f, -0.006345f, 0.001388f, -0.000277f, -0.004258f, 0.002373f, 0.023967f, 0.039952f, 0.022241f, 0.026036f, 0.003974f, 0.009233f, 0.035056f, -0.001117f, 0.001054f, 0.023971f, -0.011725f, 0.000037f, 0.006904f, 0.011939f, 0.019796f, -0.016129f, -0.022964f, 0.012639f, 0.007035f, -0.013359f, 0.002863f, 0.008168f, -0.005113f, 0.004684f, -0.012363f, -0.002819f, -0.014441f, 0.004419f, 0.015741f, 0.004870f, 0.013788f, 0.010636f, 0.011221f, -0.027338f, 0.001433f, 0.031769f, -0.003782f, -0.000592f, 0.029630f, + -0.003929f, -0.001048f, 0.004366f, -0.003905f, -0.000894f, 0.016401f, 0.025738f, -0.025309f, -0.004150f, 0.005051f, -0.007794f, 0.011948f, -0.004048f, 0.001175f, 0.001852f, -0.005519f, 0.022655f, -0.002906f, -0.008287f, 0.008498f, -0.008593f, -0.014151f, 0.004854f, 0.015453f, 0.005815f, -0.001720f, 0.003104f, 0.014785f, 0.007698f, 0.013245f, 0.003969f, 0.001645f, -0.000179f, -0.012999f, -0.002718f, -0.010186f, -0.002358f, -0.004281f, -0.023179f, -0.010031f, 0.001464f, 0.014923f, -0.006166f, 0.005764f, -0.003999f, -0.012251f, 0.005402f, 0.001318f, -0.003924f, 0.001910f, -0.007487f, 0.000359f, 0.001822f, 0.004558f, 0.006482f, -0.001578f, 0.004165f, -0.005642f, -0.008358f, -0.009990f, -0.001089f, 0.008985f, -0.001662f, -0.000744f, 0.002978f, 0.000453f, 0.000960f, 0.004810f, -0.002388f, -0.000948f, -0.002686f, 0.006928f, 0.000127f, -0.001099f, 0.000785f, -0.001835f, -0.003760f, -0.004547f, 0.001812f, 0.003887f, 0.004904f, 0.002638f, 0.001922f, -0.000967f, -0.000356f, -0.000029f, -0.001651f, -0.006987f, 0.002199f, 0.067435f, 0.009359f, -0.001455f, -0.000404f, -0.032389f, -0.009469f, 0.003102f, + -0.007554f, 0.014256f, 0.006276f, 0.023120f, -0.002959f, 0.000001f, -0.005010f, -0.009825f, 0.015512f, 0.002878f, 0.005919f, 0.008675f, 0.012132f, -0.011485f, -0.011547f, -0.013364f, -0.009299f, -0.007683f, -0.003381f, -0.018347f, -0.003631f, 0.029462f, 0.013873f, -0.005688f, -0.002048f, -0.003547f, 0.002409f, 0.010381f, -0.005175f, 0.042114f, -0.007400f, -0.001237f, -0.019221f, 0.007563f, 0.018338f, -0.003262f, -0.014170f, -0.001928f, 0.007011f, 0.014028f, 0.006019f, 0.019758f, 0.029585f, 0.009555f, -0.000725f, 0.017511f, 0.014304f, 0.005263f, 0.011029f, -0.037113f, 0.008480f, 0.000848f, -0.032839f, 0.011889f, -0.000880f, -0.014240f, 0.009108f, -0.015097f, -0.014674f, 0.017212f, 0.013532f, -0.007861f, -0.029088f, -0.013261f, 0.006825f, -0.016805f, -0.003529f, 0.007118f, 0.028310f, -0.004780f, 0.005610f, -0.014999f, -0.031400f, -0.016959f, -0.015125f, -0.006964f, 0.014781f, 0.001860f, -0.010526f, -0.003331f, -0.006623f, -0.006499f, 0.009390f, 0.007754f, 0.002906f, 0.006589f, 0.007892f, -0.006986f, -0.005149f, -0.005247f, 0.000915f, -0.005739f, -0.008384f, -0.008185f, 0.003288f, -0.002924f, + -0.001355f, 0.000904f, 0.002772f, -0.006998f, 0.003661f, -0.001693f, -0.001000f, -0.003238f, -0.001284f, -0.004500f, 0.010476f, -0.006835f, -0.002491f, 0.001641f, -0.007045f, -0.006855f, -0.005222f, 0.000149f, 0.005224f, 0.004235f, -0.036176f, 0.022944f, -0.004568f, -0.022664f, -0.001339f, 0.021377f, -0.024380f, -0.004651f, -0.019736f, 0.013209f, 0.003738f, -0.006711f, -0.008639f, -0.002563f, 0.012452f, 0.010235f, 0.005116f, 0.013776f, 0.011342f, 0.001591f, 0.013783f, 0.016669f, 0.006332f, 0.009399f, -0.016990f, -0.007732f, -0.011949f, 0.010650f, 0.012989f, 0.005163f, 0.003747f, -0.007492f, -0.006161f, -0.004447f, -0.004669f, -0.013713f, 0.012513f, 0.003338f, 0.000454f, -0.014702f, -0.004887f, 0.024327f, -0.017627f, -0.018034f, -0.028607f, 0.010230f, -0.021548f, 0.031097f, 0.035178f, 0.024862f, 0.013966f, 0.001735f, 0.027420f, -0.014330f, 0.021473f, -0.002484f, -0.015946f, 0.001508f, 0.000910f, -0.033076f, -0.015242f, 0.012901f, 0.001552f, -0.005309f, 0.004690f, 0.028393f, 0.018818f, -0.031875f, -0.008513f, -0.000137f, -0.001214f, 0.009636f, 0.013360f, -0.000310f, -0.026203f, 0.010737f, + -0.015356f, -0.047599f, -0.014308f, -0.009416f, 0.014522f, 0.024546f, 0.007819f, 0.001546f, 0.000883f, 0.001072f, 0.001808f, 0.017586f, -0.000287f, 0.002909f, 0.001872f, 0.009059f, -0.015599f, -0.000459f, 0.004342f, 0.011732f, 0.013362f, 0.005212f, 0.007797f, 0.012499f, 0.015666f, 0.021004f, 0.007545f, 0.010586f, 0.009752f, 0.000883f, -0.001272f, -0.003364f, -0.002875f, 0.000486f, 0.003883f, -0.011684f, -0.003310f, 0.007423f, 0.010990f, -0.000822f, 0.002855f, -0.001152f, 0.004434f, 0.000477f, 0.006939f, -0.000768f, 0.006643f, -0.004774f, 0.008597f, 0.000586f, 0.008103f, -0.029946f, 0.002955f, 0.003369f, 0.018720f, 0.004074f, 0.047879f, 0.007662f, -0.019804f, -0.006363f, -0.016679f, 0.030311f, -0.038868f, -0.003435f, 0.026819f, -0.058631f, -0.023181f, -0.019762f, -0.020536f, -0.038876f, 0.003654f, -0.006786f, -0.016713f, -0.002091f, 0.018385f, 0.002352f, 0.002420f, -0.011442f, 0.004543f, -0.003848f, 0.004517f, 0.000060f, 0.002893f, 0.015045f, -0.003662f, -0.000893f, 0.030516f, -0.019710f, -0.003989f, 0.005312f, 0.026286f, -0.013770f, 0.037538f, -0.011330f, -0.015174f, -0.032108f, + -0.041832f, -0.012168f, -0.031136f, 0.015223f, -0.009448f, -0.023339f, 0.003194f, 0.003814f, 0.017226f, 0.014604f, 0.006095f, -0.002922f, 0.053147f, 0.029445f, -0.003344f, 0.005220f, 0.018211f, 0.013641f, 0.008855f, -0.007160f, -0.001018f, -0.009500f, -0.012367f, -0.011425f, 0.008034f, 0.041477f, -0.028947f, -0.007062f, -0.016471f, 0.029899f, -0.007835f, 0.009288f, -0.004225f, 0.014056f, -0.032777f, -0.024514f, -0.008432f, 0.013981f, 0.004468f, 0.012076f, -0.007210f, 0.007461f, 0.011289f, 0.009896f, 0.004738f, -0.001929f, -0.013938f, 0.008845f, 0.003357f, -0.011853f, -0.008268f, 0.007466f, -0.007743f, -0.005893f, -0.000172f, 0.008035f, -0.007363f, 0.009675f, -0.005957f, 0.013809f, -0.007585f, 0.001567f, 0.004903f, 0.002532f, -0.006548f, -0.012570f, 0.009864f, -0.003762f, -0.002724f, -0.000963f, -0.001200f, -0.003963f, 0.009378f, 0.011572f, 0.008145f, 0.007087f, -0.001246f, 0.004092f, 0.013397f, -0.007138f, 0.005383f, 0.002314f, -0.000165f, 0.002930f, -0.000705f, 0.000725f, -0.004635f, 0.006161f, 0.001953f, 0.005878f, -0.001731f, 0.002577f, -0.001003f, -0.004816f, 0.003518f, 0.000893f, + 0.004145f, 0.006001f, -0.000892f, -0.023986f, -0.022860f, 0.012843f, -0.010198f, -0.043110f, 0.021391f, -0.012916f, 0.017098f, -0.012466f, 0.021497f, 0.014494f, 0.017884f, 0.028429f, 0.004691f, 0.024042f, 0.009765f, 0.006152f, 0.016441f, 0.005576f, 0.004549f, 0.001094f, -0.000631f, -0.015404f, 0.013705f, -0.031198f, 0.013664f, 0.003177f, -0.008872f, -0.016847f, -0.000397f, 0.011958f, -0.013857f, -0.005879f, -0.020742f, -0.008124f, -0.025544f, 0.001547f, 0.014115f, -0.000328f, -0.003282f, -0.016305f, -0.028211f, -0.020581f, 0.022109f, 0.007302f, -0.009170f, -0.016293f, -0.003945f, -0.001365f, -0.027584f, 0.023317f, 0.021311f, -0.027265f, -0.026403f, -0.043380f, -0.006564f, -0.051891f, 0.013993f, 0.020124f, 0.010649f, -0.003290f, -0.006590f, -0.005411f, 0.021298f, 0.021450f, 0.024839f, -0.016217f, -0.012827f, 0.016541f, -0.007142f, -0.007795f, -0.030369f, 0.013445f, 0.024854f, 0.028383f, -0.006679f, 0.015523f, -0.008725f, 0.004628f, 0.015575f, 0.007975f, -0.010940f, 0.005098f, -0.018743f, -0.011471f, -0.007765f, 0.002740f, 0.007940f, 0.006746f, -0.007417f, -0.006866f, -0.002755f, -0.008461f, + -0.001644f, -0.011639f, -0.014416f, -0.007628f, -0.006001f, -0.004479f, -0.001910f, -0.004254f, -0.005725f, 0.001205f, -0.000253f, 0.008309f, -0.002885f, 0.010627f, -0.002805f, 0.008470f, 0.000585f, -0.004882f, 0.002185f, 0.021538f, 0.006695f, 0.010948f, -0.004975f, -0.008802f, 0.001782f, 0.007785f, -0.007545f, 0.015583f, 0.015746f, 0.004423f, 0.007392f, 0.003191f, -0.018018f, -0.009583f, -0.008818f, -0.001287f, -0.000486f, -0.007881f, 0.041491f, 0.047710f, -0.018816f, -0.001188f, 0.012996f, -0.038818f, -0.007098f, 0.047973f, 0.001752f, -0.052552f, 0.005819f, 0.015954f, -0.001196f, 0.018045f, 0.043096f, -0.017828f, 0.038952f, 0.020900f, 0.033247f, 0.009117f, -0.025390f, -0.027293f, 0.021746f, -0.024796f, -0.038581f, -0.011436f, -0.045851f, 0.009864f, -0.003071f, 0.016048f, 0.014012f, 0.009764f, 0.005184f, -0.002111f, 0.001292f, 0.023040f, 0.011376f, -0.045257f, -0.005274f, 0.014770f, 0.028899f, 0.015808f, 0.035800f, 0.031995f, 0.025280f, -0.012291f, -0.004351f, 0.006358f, 0.065178f, -0.027657f, 0.004737f, 0.013464f, 0.025533f, -0.010913f, -0.036305f, -0.007990f, -0.009200f, -0.022224f, + -0.040162f, -0.044193f, 0.011950f, -0.024979f, -0.018618f, 0.010899f, 0.034394f, 0.042035f, 0.000710f, -0.002860f, -0.000616f, 0.032159f, -0.022241f, -0.011794f, 0.038508f, -0.042597f, 0.004550f, -0.033770f, -0.022438f, 0.001957f, 0.044653f, -0.007804f, -0.030779f, 0.039396f, -0.041041f, 0.001100f, -0.049521f, -0.004932f, -0.006363f, 0.013948f, 0.027288f, -0.020929f, -0.011732f, -0.014990f, 0.003511f, 0.000379f, -0.015483f, 0.008034f, -0.004722f, -0.004985f, -0.006727f, -0.005951f, -0.018319f, 0.003380f, -0.008939f, 0.005707f, 0.004663f, -0.002051f, -0.004233f, 0.010252f, -0.000228f, -0.000601f, -0.021598f, 0.002415f, -0.002067f, -0.001514f, 0.019671f, 0.001177f, 0.005369f, -0.009165f, 0.002957f, -0.005670f, -0.011877f, 0.004200f, -0.023933f, 0.006981f, -0.008439f, 0.016786f, -0.014366f, -0.002877f, 0.002977f, -0.002963f, -0.003981f, -0.008384f, 0.012856f, -0.009743f, 0.014020f, -0.006161f, -0.009186f, 0.009010f, 0.007747f, 0.023206f, -0.027157f, -0.058429f, -0.014699f, -0.019924f, -0.020237f, -0.011527f, 0.001994f, -0.019576f, -0.017913f, 0.006344f, 0.012415f, -0.012047f, 0.030545f, -0.002726f, + 0.020205f, -0.009932f, -0.002029f, 0.018725f, -0.026599f, -0.015511f, -0.009579f, 0.027598f, -0.007297f, -0.028960f, -0.011984f, 0.005104f, -0.015165f, 0.012918f, -0.020661f, -0.019336f, 0.028184f, 0.009042f, -0.023812f, 0.014566f, -0.003605f, -0.017512f, -0.002598f, -0.029438f, -0.026675f, 0.005717f, 0.044184f, 0.018744f, 0.013176f, -0.035513f, 0.026942f, -0.002620f, 0.020434f, -0.012010f, -0.026002f, 0.012783f, -0.047230f, 0.039276f, -0.063641f, -0.039220f, 0.013644f, 0.035099f, 0.001778f, 0.041913f, -0.019003f, 0.011388f, -0.029620f, 0.039340f, 0.011561f, 0.029389f, 0.012366f, 0.007301f, -0.010038f, -0.009154f, -0.019886f, -0.006107f, -0.002076f, -0.032938f, -0.020916f, 0.003427f, -0.051646f, 0.003346f, 0.055970f, 0.017460f, 0.019536f, 0.005965f, -0.026800f, -0.018964f, -0.006247f, -0.005763f, -0.002822f, -0.009576f, -0.014581f, 0.011798f, 0.006443f, 0.010742f, 0.015074f, -0.015802f, 0.009540f, -0.005734f, -0.009802f, -0.006194f, 0.013289f, -0.004419f, -0.016667f, -0.023251f, -0.001213f, -0.013840f, -0.007769f, -0.014206f, -0.005126f, -0.009182f, -0.006833f, 0.022674f, -0.013255f, 0.005479f, + 0.005812f, -0.017502f, 0.019292f, 0.000559f, 0.011083f, 0.016425f, -0.008592f, 0.008298f, 0.002468f, -0.000376f, 0.003822f, 0.013782f, -0.008944f, -0.007286f, 0.011216f, 0.001384f, 0.004880f, -0.003442f, -0.004735f, 0.000729f, 0.009360f, -0.043973f, -0.041938f, 0.004572f, 0.016607f, -0.020483f, -0.094271f, -0.019126f, -0.000960f, 0.012738f, -0.032206f, 0.003221f, -0.018171f, -0.003210f, -0.025756f, -0.027743f, 0.024590f, -0.026967f, -0.034156f, -0.005217f, -0.024052f, -0.025443f, 0.008444f, -0.037177f, -0.012946f, 0.023197f, 0.051548f, 0.042502f, -0.002490f, -0.025162f, 0.008510f, 0.038304f, -0.002232f, 0.025634f, -0.007705f, 0.032166f, 0.017334f, -0.032076f, 0.051322f, -0.039012f, -0.021340f, 0.035349f, -0.038912f, 0.012073f, -0.009316f, -0.028446f, 0.002923f, 0.044310f, -0.009582f, -0.025290f, 0.015928f, 0.021986f, -0.001105f, 0.009378f, -0.063529f, 0.015698f, 0.002150f, 0.032282f, 0.014914f, -0.027179f, 0.026979f, -0.014259f, -0.002880f, -0.025154f, 0.013132f, 0.037414f, -0.008098f, -0.006836f, -0.038351f, -0.053078f, 0.029976f, -0.003402f, 0.024056f, -0.028815f, 0.021794f, 0.018279f, + -0.038606f, 0.002669f, 0.033442f, 0.019856f, -0.018291f, -0.030173f, 0.027257f, 0.004994f, -0.024312f, 0.023068f, 0.003232f, 0.010544f, 0.002184f, 0.009830f, 0.001254f, 0.025717f, -0.000154f, 0.009159f, -0.002217f, 0.001512f, 0.021912f, -0.006765f, 0.000042f, 0.005561f, -0.006398f, 0.004551f, 0.001483f, 0.015945f, -0.001327f, -0.016781f, -0.002658f, 0.002647f, -0.010798f, -0.002602f, 0.000554f, -0.006435f, 0.022660f, -0.005032f, -0.013888f, 0.001918f, 0.014196f, 0.007386f, -0.001378f, 0.008858f, 0.000586f, -0.009231f, -0.001825f, 0.024828f, 0.016033f, -0.016076f, -0.012724f, 0.003943f, -0.005739f, 0.035542f, 0.035277f, -0.095450f, 0.035867f, 0.048664f, -0.012528f, 0.033910f, -0.000532f, 0.017663f, -0.007957f, -0.019483f, -0.012897f, 0.020525f, 0.004605f, -0.027444f, -0.018141f, -0.002373f, -0.013153f, -0.006892f, -0.003165f, 0.059342f, 0.011697f, 0.013281f, -0.036798f, 0.025654f, -0.026260f, 0.000566f, 0.004384f, -0.039814f, 0.018478f, -0.014648f, 0.001883f, -0.016014f, -0.029117f, 0.000966f, 0.018990f, 0.054999f, 0.019511f, 0.005876f, 0.033704f, 0.014534f, -0.004300f, 0.005751f, + 0.000647f, 0.009750f, 0.005347f, 0.037364f, 0.016064f, 0.011419f, 0.005924f, -0.004590f, -0.011771f, -0.036429f, -0.030950f, 0.004448f, -0.004610f, -0.022408f, 0.002991f, 0.027639f, -0.042106f, 0.040647f, 0.010208f, -0.014726f, -0.001905f, -0.010656f, -0.003582f, 0.024693f, 0.010492f, 0.008167f, -0.028691f, -0.005608f, -0.039132f, -0.011821f, 0.010602f, 0.014404f, 0.013941f, -0.016665f, -0.013759f, 0.030332f, -0.003793f, -0.048687f, 0.006782f, -0.000712f, -0.000776f, -0.028675f, 0.009215f, 0.021761f, -0.003227f, 0.031243f, 0.020694f, -0.010266f, -0.000828f, -0.013292f, 0.016521f, -0.001270f, 0.005271f, 0.002728f, -0.007323f, -0.005723f, -0.001558f, -0.005938f, 0.006537f, -0.013205f, -0.001583f, 0.000971f, 0.006964f, -0.006718f, -0.008306f, -0.009376f, 0.000241f, -0.002151f, 0.005046f, 0.003251f, -0.000571f, -0.005788f, 0.006178f, 0.005078f, 0.000658f, 0.007268f, 0.000989f, 0.005252f, 0.004383f, 0.006910f, -0.002172f, -0.024323f, -0.001243f, -0.006799f, 0.004891f, -0.011234f, -0.085037f, 0.131774f, -0.130275f, -0.058855f, -0.029788f, -0.008839f, 0.076177f, 0.022449f, 0.085287f, 0.021361f, + -0.017451f, 0.067276f, 0.029077f, -0.022684f, 0.031508f, 0.028593f, 0.015953f, 0.026762f, 0.025886f, -0.022980f, -0.037231f, -0.026432f, 0.004316f, -0.024295f, 0.012893f, 0.007744f, 0.016715f, -0.002502f, 0.011564f, 0.003998f, 0.041920f, 0.010038f, 0.003980f, 0.013001f, -0.009724f, -0.000477f, 0.014830f, -0.026166f, -0.037322f, -0.025290f, -0.021688f, 0.003840f, 0.011145f, -0.026224f, -0.004226f, -0.015726f, -0.064719f, 0.032764f, -0.011637f, 0.016652f, -0.033999f, -0.011435f, -0.031481f, -0.043115f, 0.016434f, 0.011622f, 0.042194f, -0.001659f, 0.037193f, -0.015542f, 0.031178f, 0.003829f, 0.044458f, -0.031238f, 0.027559f, 0.033137f, 0.018365f, 0.019302f, 0.001755f, -0.013281f, 0.052066f, 0.034939f, -0.003296f, 0.062838f, 0.015160f, 0.007539f, 0.026980f, 0.040588f, 0.000659f, 0.018781f, 0.023490f, 0.010875f, 0.010364f, -0.004456f, 0.002244f, -0.036382f, -0.009178f, -0.004703f, 0.006016f, 0.007925f, 0.007442f, 0.024591f, 0.010969f, 0.012663f, -0.009326f, -0.001077f, 0.009784f, 0.001276f, 0.001023f, -0.008436f, 0.010237f, 0.008763f, 0.005050f, -0.006514f, 0.012962f, -0.001650f, + 0.002513f, -0.009578f, -0.008912f, -0.003383f, 0.001265f, 0.001435f, -0.005734f, -0.019828f, 0.004942f, 0.004689f, -0.005178f, -0.000685f, -0.004879f, 0.001853f, -0.007081f, 0.005302f, -0.006799f, 0.000654f, 0.018371f, -0.004779f, -0.017573f, 0.011983f, 0.008752f, 0.007440f, -0.003965f, -0.002013f, 0.080670f, 0.006707f, -0.048216f, -0.071445f, -0.037536f, -0.029978f, 0.009757f, 0.058637f, -0.000783f, -0.025212f, 0.052883f, 0.004035f, -0.042432f, 0.037998f, 0.041718f, -0.007946f, -0.000647f, -0.004376f, -0.037584f, 0.041549f, 0.002468f, 0.023430f, -0.013202f, -0.033918f, -0.058555f, 0.010294f, 0.007471f, 0.008667f, -0.008223f, 0.018018f, -0.019460f, -0.000659f, -0.037556f, -0.047268f, 0.016457f, -0.006379f, 0.014903f, -0.007230f, -0.017390f, -0.042880f, -0.065846f, 0.033264f, -0.036826f, 0.014594f, 0.031595f, -0.002729f, -0.017019f, -0.032842f, -0.023376f, 0.075244f, 0.017118f, -0.004007f, 0.009730f, -0.010576f, -0.030771f, -0.010632f, 0.043795f, -0.043083f, -0.071657f, -0.025581f, -0.022875f, -0.100797f, -0.078467f, -0.042780f, -0.043741f, 0.010110f, -0.000686f, -0.035524f, -0.067074f, -0.027121f, + -0.031846f, -0.023375f, -0.018560f, -0.014170f, -0.040268f, -0.039042f, 0.029996f, -0.034767f, 0.001826f, 0.004409f, -0.042229f, -0.008105f, -0.030925f, -0.039083f, -0.009675f, -0.007036f, 0.017386f, 0.006660f, 0.023498f, -0.025294f, 0.005881f, 0.013231f, -0.000531f, -0.033767f, -0.019066f, -0.022953f, -0.002599f, 0.009861f, -0.011662f, -0.016916f, 0.028056f, 0.016086f, 0.020043f, -0.034578f, 0.005218f, -0.017318f, -0.002394f, 0.000467f, 0.002824f, -0.005003f, 0.033453f, 0.001692f, -0.006545f, 0.003297f, 0.011338f, 0.016146f, 0.013525f, -0.003284f, 0.019538f, -0.015563f, -0.008360f, -0.007321f, -0.026992f, -0.001842f, -0.008705f, -0.034986f, -0.029024f, 0.003768f, 0.000726f, -0.001717f, -0.009394f, -0.008632f, -0.003297f, -0.006192f, 0.054576f, -0.005882f, 0.051962f, 0.078603f, -0.015030f, -0.083896f, -0.082519f, -0.017028f, 0.038592f, 0.005961f, -0.064895f, 0.051015f, -0.011638f, -0.041533f, 0.051117f, -0.096709f, -0.021072f, 0.001014f, -0.017848f, -0.014414f, 0.117365f, -0.048963f, 0.109951f, -0.004998f, 0.022666f, -0.007719f, -0.044257f, 0.071268f, 0.018220f, 0.074080f, -0.051019f, -0.049283f, + 0.015519f, -0.079769f, -0.024580f, -0.012468f, -0.056311f, 0.116439f, -0.010638f, -0.119972f, -0.002355f, -0.053271f, 0.015166f, 0.030024f, 0.047753f, 0.039569f, -0.048045f, -0.029392f, -0.074470f, -0.021317f, -0.034748f, 0.032052f, 0.020479f, -0.003675f, 0.021342f, -0.014473f, -0.052939f, -0.021168f, -0.061694f, 0.063126f, -0.047793f, -0.032417f, 0.055953f, 0.013645f, 0.094897f, 0.046513f, 0.007950f, 0.050614f, -0.067789f, -0.024863f, -0.069968f, -0.067343f, -0.010773f, -0.009551f, -0.085256f, 0.087841f, -0.015720f, -0.067657f, -0.101452f, 0.006913f, -0.020347f, 0.074399f, -0.004983f, 0.004130f, 0.009712f, -0.013005f, 0.013832f, 0.016953f, 0.034587f, -0.023030f, -0.023672f, -0.014752f, 0.000880f, -0.003998f, -0.005037f, -0.021753f, 0.024422f, 0.015447f, 0.029175f, -0.006639f, -0.015967f, -0.013327f, -0.005289f, 0.005739f, 0.039168f, 0.041945f, -0.006865f, 0.002531f, 0.022614f, -0.006087f, -0.052289f, -0.025150f, 0.003247f, 0.007404f, -0.004102f, -0.033099f, 0.011692f, -0.003750f, -0.007885f, -0.037952f, 0.015008f, 0.013111f, 0.045533f, 0.007634f, 0.011300f, -0.002055f, 0.018821f, 0.003458f, + -0.010686f, -0.020049f, -0.001444f, 0.002426f, 0.014886f, 0.006975f, -0.008522f, 0.001457f, -0.157272f, 0.081004f, 0.019136f, -0.034467f, -0.025314f, 0.049876f, 0.028028f, -0.030879f, -0.007981f, -0.074647f, -0.030744f, 0.031119f, -0.063858f, 0.002028f, 0.011797f, -0.020042f, -0.042518f, -0.029646f, 0.057875f, 0.022692f, -0.011329f, -0.083283f, 0.028279f, 0.051657f, 0.030306f, -0.064604f, -0.042518f, -0.000206f, 0.070003f, 0.005740f, -0.016699f, 0.010512f, 0.002433f, 0.035176f, -0.092845f, -0.080966f, 0.099758f, 0.014946f, 0.041823f, -0.095243f, 0.020788f, -0.004783f, 0.069588f, -0.062789f, -0.011766f, -0.095498f, 0.033355f, 0.067917f, 0.016183f, -0.042731f, 0.027338f, 0.098801f, -0.044398f, -0.047932f, -0.037057f, 0.013572f, 0.004261f, 0.086586f, -0.025913f, 0.006124f, -0.046881f, 0.014856f, -0.051424f, -0.002259f, 0.033179f, -0.064941f, 0.061646f, 0.018108f, -0.044617f, -0.070216f, -0.042188f, -0.004100f, 0.062177f, -0.112923f, -0.024390f, 0.101074f, 0.013473f, -0.046446f, -0.021485f, -0.032936f, 0.095825f, -0.011205f, -0.100297f, -0.012253f, 0.000017f, -0.025341f, 0.040974f, -0.007615f, + -0.014025f, 0.030450f, -0.002757f, -0.021188f, -0.026273f, -0.003356f, -0.023167f, 0.006448f, 0.017072f, 0.021943f, -0.020165f, -0.015468f, 0.020894f, -0.014295f, 0.019785f, -0.011096f, -0.020122f, 0.026980f, -0.015142f, 0.024232f, 0.034215f, 0.001582f, -0.049593f, -0.004010f, -0.029567f, 0.011667f, 0.018299f, 0.011315f, -0.034670f, -0.000298f, -0.026189f, 0.023807f, -0.007381f, -0.015666f, -0.010023f, 0.004627f, 0.008360f, -0.019198f, 0.008487f, 0.103770f, 0.053756f, 0.023743f, 0.024501f, 0.024784f, -0.016181f, -0.016642f, -0.034768f, 0.004184f, 0.011681f, 0.008952f, -0.001729f, -0.060154f, 0.029015f, 0.011511f, -0.041323f, -0.035587f, -0.017743f, -0.020913f, 0.015803f, -0.015689f, -0.017386f, 0.004889f, -0.001193f, -0.032058f, 0.041033f, -0.029509f, -0.009218f, -0.030655f, -0.027343f, 0.019597f, -0.011525f, -0.004241f, 0.010479f, 0.012708f, -0.003116f, -0.040724f, 0.009856f, 0.062909f, 0.013680f, -0.099277f, -0.006078f, -0.021734f, -0.030608f, 0.020630f, 0.022515f, 0.051038f, 0.024851f, -0.064839f, 0.070226f, -0.017592f, -0.048419f, 0.145689f, -0.029265f, -0.012722f, -0.047995f, -0.116243f, + 0.053261f, 0.058686f, 0.019568f, 0.022005f, -0.099054f, 0.028589f, -0.007636f, -0.024283f, -0.017351f, 0.003719f, -0.009318f, 0.015265f, 0.018990f, 0.003839f, -0.014606f, -0.028654f, 0.030190f, 0.037520f, 0.052730f, -0.026302f, -0.005239f, 0.010906f, -0.007652f, 0.027304f, -0.067986f, 0.006304f, 0.012129f, -0.032199f, 0.005358f, -0.026880f, 0.010497f, 0.000176f, 0.008429f, -0.004708f, 0.001946f, 0.002303f, -0.001315f, -0.001243f, -0.009013f, -0.007392f, 0.018229f, -0.010395f, -0.000647f, 0.013109f, 0.003017f, 0.000262f, 0.022258f, -0.018695f, 0.013636f, 0.015612f, -0.000984f, -0.003564f, -0.018832f, 0.014878f, -0.035215f, -0.010255f, 0.022959f, 0.006259f, -0.009629f, -0.024196f, 0.007175f, -0.005922f, 0.028551f, 0.003677f, -0.059641f, -0.141111f, -0.239975f, 0.020008f, 0.243119f, 0.023938f, 0.517345f, 0.523859f, 0.189400f, 0.525720f, 0.303918f, -0.087873f, -0.008785f, -0.046894f, -0.398395f, -0.329214f, -0.232036f, -0.412374f, -0.395009f, -0.111853f, -0.248745f, -0.215611f, 0.048655f, 0.069863f, -0.053882f, 0.077552f, 0.112438f, 0.000590f, 0.007655f, 0.225309f, 0.149529f, 0.057958f, + 0.165787f, 0.311365f, 0.145988f, 0.172000f, 0.383997f, 0.152866f, 0.068938f, 0.333149f, 0.320191f, 0.014941f, 0.204782f, 0.363397f, 0.000622f, 0.092961f, 0.214845f, -0.007494f, -0.175688f, 0.087956f, -0.036667f, -0.337054f, -0.315217f, -0.288626f, -0.562888f, -0.831062f, -0.579226f, -0.808525f, -1.078585f, -0.760082f, -0.616867f, -0.832910f, -0.532613f, -0.255273f, -0.247023f, -0.045834f, 0.248608f, 0.502429f, 0.567726f, 0.760790f, 1.033884f, 1.016921f, 0.961109f, 1.083612f, 1.080994f, 0.883808f, 0.710722f, 0.762045f, 0.505887f, 0.181147f, 0.241313f, 0.060425f, -0.443536f, -0.284104f, -0.301394f, -0.618087f, -0.522815f, -0.374819f, -0.440091f, -0.508278f, -0.316806f, -0.275725f, -0.385095f, -0.316587f, -0.164766f, -0.263112f, -0.347929f, -0.207929f, -0.147269f, -0.274763f, -0.155394f, 0.038063f, -0.085907f, -0.097133f, 0.111529f, -0.002114f, -0.139536f, -0.016108f, -0.087565f, -0.315033f, -0.219689f, -0.164722f, -0.293185f, -0.129521f, 0.074111f, 0.142939f, 0.261227f, 0.435460f, 0.504776f, 0.530892f, 0.593900f, 0.633453f, 0.622662f, 0.575463f, 0.534549f, 0.455444f, 0.361343f, 0.223542f, + 0.166973f, 0.022380f, -0.139852f, -0.244595f, -0.394130f, -0.566022f, -0.551544f, -0.467958f, -0.424991f, -0.367175f, -0.251623f, -0.210445f, -0.188881f, -0.134454f, -0.088475f, -0.077547f, -0.031815f, -0.017270f, -0.012323f, 0.004104f, 0.036076f, 0.059851f, 0.074813f, 0.089332f, 0.101892f, 0.100483f, 0.097401f, 0.083984f, 0.082135f, 0.059591f, 0.046792f, 0.024186f, 0.014046f, -0.010400f, -0.026507f, -0.035605f, -0.033689f, -0.044670f, -0.044018f, -0.043727f, -0.044652f, -0.050850f, -0.036588f, -0.037501f, -0.023303f, 0.000729f, 0.029858f, 0.043269f, 0.070094f, 0.082096f, 0.090717f, 0.096561f, 0.109928f, 0.103489f, 0.099792f, 0.096143f, 0.085394f, 0.057418f, 0.050018f, 0.039778f, 0.025660f, 0.008237f, 0.007956f, -0.011711f, -0.022722f, -0.034749f, -0.045602f, -0.065646f, -0.070694f, -0.084511f, -0.094446f, -0.103406f, -0.102051f, -0.110166f, -0.107764f, -0.102410f, -0.088926f, -0.077857f, -0.052615f, -0.033868f, -0.010978f, 0.004057f, 0.027155f, 0.037348f, 0.050254f, 0.055629f, 0.062512f, 0.058876f, 0.062532f, 0.055856f, 0.055882f, 0.046673f, 0.044097f, 0.033738f, 0.028178f, 0.016465f, + 0.013704f, 0.003976f, 0.003570f, -0.002300f, -0.000550f, -0.005665f, -0.002634f, -0.006032f, -0.002140f, -0.005259f, -0.000920f, -0.004005f, -0.000001f, -0.003166f, 0.000956f, -0.002047f} + }, + { + {0.019166f, -0.000861f, -0.000939f, 0.006013f, -0.002401f, 0.006879f, -0.003604f, -0.008985f, 0.003216f, 0.008889f, 0.001402f, -0.001457f, 0.011976f, 0.000338f, 0.000573f, -0.004124f, -0.002182f, 0.018475f, 0.002661f, -0.012648f, -0.009224f, 0.013013f, -0.001109f, 0.013498f, 0.001035f, -0.002638f, -0.001193f, 0.010181f, 0.002111f, 0.021441f, 0.009552f, 0.005861f, -0.001073f, 0.004719f, 0.009811f, -0.002448f, -0.007164f, -0.009162f, -0.001660f, 0.008155f, 0.007146f, 0.010900f, 0.003164f, -0.006178f, -0.006285f, -0.002704f, 0.004662f, -0.001519f, 0.002604f, -0.001298f, -0.009662f, -0.007574f, 0.003071f, 0.007070f, 0.004469f, -0.003574f, -0.003935f, -0.000318f, 0.010718f, 0.005363f, -0.001078f, -0.002423f, 0.005017f, 0.003283f, 0.002203f, -0.005464f, 0.002814f, 0.005056f, -0.000565f, 0.007745f, 0.009277f, -0.016088f, 0.005984f, 0.003241f, 0.010565f, 0.003124f, 0.000923f, 0.004745f, -0.002034f, -0.007517f, -0.002690f, -0.004542f, -0.001414f, -0.000962f, 0.004647f, -0.000262f, -0.003557f, 0.000025f, 0.000628f, 0.002691f, -0.002278f, 0.000414f, -0.000368f, 0.000945f, 0.001483f, 0.000948f, + 0.001888f, 0.000157f, 0.001202f, -0.002421f, 0.005415f, 0.008310f, 0.018110f, -0.014732f, 0.003351f, -0.003272f, 0.000250f, -0.018917f, 0.001937f, 0.011301f, -0.016741f, -0.003528f, 0.011254f, 0.029708f, 0.004305f, -0.000252f, 0.002156f, -0.018688f, -0.000562f, 0.013689f, 0.012234f, 0.000284f, -0.000350f, 0.001081f, 0.006438f, 0.010667f, 0.011332f, 0.012159f, -0.005419f, 0.002589f, -0.000709f, 0.004658f, 0.001353f, 0.002985f, -0.018880f, -0.005235f, 0.002982f, 0.001494f, -0.010428f, -0.000387f, 0.007167f, -0.008372f, 0.006601f, 0.006013f, 0.011226f, 0.005192f, -0.004253f, 0.005537f, 0.012541f, -0.007060f, -0.011274f, 0.003740f, 0.002647f, 0.002155f, 0.005956f, -0.005063f, -0.009114f, -0.013673f, 0.011024f, -0.002079f, -0.002553f, -0.004484f, 0.004849f, -0.000222f, 0.007155f, 0.014051f, 0.002874f, 0.000906f, -0.000740f, -0.003458f, -0.010984f, 0.017056f, 0.004228f, -0.002096f, 0.008859f, -0.001444f, -0.010127f, -0.008971f, -0.001967f, 0.003312f, -0.014778f, 0.001165f, -0.008757f, -0.001710f, 0.004524f, -0.000311f, 0.002382f, -0.002701f, -0.004830f, -0.001082f, 0.002450f, 0.003296f, + 0.002488f, -0.000569f, -0.001481f, -0.000143f, 0.002419f, -0.001330f, -0.002462f, -0.001896f, 0.000471f, -0.000987f, -0.008907f, -0.007637f, -0.009659f, -0.013603f, 0.007591f, -0.000128f, -0.006575f, -0.002549f, -0.003386f, 0.003010f, -0.005472f, -0.009327f, 0.002079f, -0.006049f, 0.015959f, 0.021331f, 0.016780f, -0.011603f, -0.000502f, -0.000724f, 0.004448f, -0.006421f, 0.013152f, 0.008326f, -0.001941f, 0.006439f, 0.009961f, 0.000854f, 0.002372f, 0.003538f, 0.009676f, -0.000888f, 0.003564f, 0.011689f, 0.001130f, -0.000091f, -0.005144f, 0.008422f, -0.012714f, 0.005155f, -0.001830f, -0.002560f, 0.008377f, -0.008109f, -0.001087f, 0.000328f, -0.011060f, 0.004612f, -0.002277f, 0.005136f, -0.000414f, -0.004716f, 0.003283f, 0.003540f, -0.000639f, 0.009814f, -0.000757f, 0.011315f, -0.000229f, -0.007457f, -0.003396f, 0.000471f, -0.005178f, 0.010094f, 0.005187f, 0.008670f, 0.009730f, -0.004242f, -0.009753f, -0.006296f, -0.000073f, -0.001762f, -0.002128f, 0.008016f, 0.010007f, -0.001469f, -0.005579f, 0.003540f, 0.002685f, -0.003822f, -0.005328f, 0.001843f, -0.007625f, 0.001879f, -0.000209f, -0.000202f, + -0.002089f, -0.007125f, 0.001554f, -0.002785f, 0.000231f, 0.003238f, -0.000066f, -0.003624f, 0.001770f, -0.004983f, -0.000155f, 0.000354f, -0.001216f, 0.000453f, 0.000897f, -0.002712f, -0.000017f, 0.000365f, -0.003316f, 0.000719f, -0.001043f, -0.000171f, -0.001775f, -0.000018f, 0.000841f, 0.002874f, -0.028173f, -0.006620f, -0.008785f, -0.015207f, 0.005175f, 0.004009f, -0.001828f, 0.007103f, -0.000993f, 0.005999f, 0.008429f, -0.003686f, -0.009856f, -0.012385f, -0.004743f, -0.011531f, 0.000898f, 0.001306f, -0.005042f, 0.006591f, -0.005663f, 0.003550f, -0.002590f, -0.006562f, -0.017531f, -0.006788f, 0.001558f, 0.002791f, 0.004603f, -0.006481f, 0.004651f, 0.007083f, 0.002331f, 0.016028f, 0.003978f, -0.000370f, 0.012381f, -0.008710f, 0.007152f, 0.001219f, -0.004163f, -0.005883f, 0.007987f, 0.001118f, 0.002527f, -0.018831f, -0.003477f, -0.006192f, 0.018970f, 0.008176f, 0.006837f, 0.007745f, 0.008713f, 0.006939f, 0.009662f, -0.005059f, -0.002063f, 0.005969f, 0.009493f, -0.001224f, 0.011087f, -0.005910f, 0.002434f, -0.002349f, 0.009394f, 0.014107f, -0.021940f, 0.005809f, -0.005419f, 0.000758f, + -0.010344f, -0.005268f, 0.001744f, -0.003087f, -0.004435f, -0.008729f, -0.003948f, 0.004197f, -0.000199f, 0.009458f, -0.000975f, 0.003684f, 0.008161f, 0.013008f, -0.000469f, 0.003482f, -0.001500f, 0.006089f, 0.000983f, 0.002996f, -0.004002f, -0.001349f, 0.000447f, 0.002820f, -0.001777f, -0.002870f, 0.000161f, 0.000230f, -0.002254f, 0.000413f, 0.001335f, 0.000123f, 0.003795f, -0.001590f, -0.001744f, 0.000500f, 0.003311f, -0.001260f, 0.000096f, -0.001123f, 0.001982f, 0.003104f, -0.000400f, 0.002973f, 0.003195f, -0.000693f, -0.001340f, -0.000490f, 0.011017f, 0.006719f, 0.004008f, -0.002117f, 0.000925f, 0.001166f, 0.014214f, -0.011305f, 0.014257f, -0.001924f, 0.007776f, 0.014561f, -0.009123f, 0.011272f, -0.007059f, 0.005766f, 0.002221f, 0.017118f, 0.007595f, -0.009595f, -0.015722f, 0.003540f, -0.011788f, 0.009655f, -0.002418f, 0.012594f, -0.009421f, -0.001580f, -0.007546f, 0.004309f, 0.002803f, 0.003564f, -0.000952f, -0.001397f, -0.013738f, -0.006076f, 0.011277f, -0.009053f, -0.001841f, 0.007281f, 0.000332f, -0.007103f, 0.002279f, 0.000573f, -0.001600f, -0.006169f, 0.012318f, 0.003871f, + -0.017597f, -0.007995f, -0.014212f, -0.002550f, -0.012572f, -0.021698f, -0.004957f, 0.009370f, 0.026616f, 0.005757f, 0.002167f, 0.012486f, -0.000367f, -0.009903f, -0.008631f, 0.006939f, 0.002695f, 0.004660f, 0.007651f, -0.018928f, -0.004677f, -0.017417f, -0.003853f, 0.004788f, -0.006917f, -0.016107f, 0.001577f, 0.006863f, -0.003477f, -0.006037f, -0.002873f, 0.002711f, -0.002432f, -0.000749f, 0.003462f, -0.002277f, -0.002424f, -0.003311f, -0.002407f, -0.007421f, 0.002577f, -0.001993f, 0.003329f, -0.001323f, 0.001926f, 0.004558f, 0.000599f, -0.001333f, -0.000487f, -0.003998f, -0.002652f, -0.006285f, -0.005694f, 0.000778f, 0.000621f, -0.000083f, 0.002154f, 0.003548f, 0.002482f, -0.000083f, 0.002254f, 0.001871f, -0.001755f, 0.001339f, 0.001418f, -0.003320f, -0.001403f, 0.030469f, 0.007463f, 0.022013f, -0.010232f, -0.001616f, -0.007232f, -0.001881f, 0.023738f, -0.020280f, 0.006915f, 0.002109f, 0.031034f, 0.016263f, 0.020650f, 0.003568f, -0.004931f, 0.009493f, -0.006576f, -0.025770f, 0.005030f, 0.001279f, 0.003163f, 0.019993f, 0.002078f, -0.012030f, -0.000886f, 0.000352f, 0.006556f, 0.006803f, + -0.000449f, -0.002821f, 0.008390f, -0.009822f, -0.002502f, -0.005063f, -0.002320f, 0.002309f, 0.000522f, 0.017588f, 0.002711f, 0.013771f, 0.016235f, 0.004270f, 0.014336f, -0.001234f, 0.004844f, 0.008441f, -0.009163f, -0.014087f, 0.001890f, 0.013820f, -0.022227f, 0.006476f, -0.017024f, -0.016224f, -0.009697f, -0.004631f, -0.014964f, -0.014814f, -0.015348f, -0.008126f, -0.003716f, 0.010212f, 0.000389f, 0.012271f, 0.002022f, -0.010445f, 0.015843f, -0.016518f, -0.006062f, -0.006947f, -0.006576f, -0.008844f, -0.011271f, 0.016117f, 0.012814f, -0.007313f, 0.006359f, 0.004945f, 0.013015f, -0.000136f, 0.009436f, -0.004761f, 0.011827f, 0.005725f, -0.006779f, 0.000215f, -0.006114f, 0.007267f, -0.006994f, 0.000607f, 0.005882f, 0.000256f, 0.004529f, -0.001437f, 0.000831f, 0.002883f, -0.000907f, -0.003310f, 0.003026f, -0.001019f, 0.000624f, -0.006197f, -0.004874f, -0.004980f, -0.003639f, -0.000808f, -0.001982f, -0.004334f, -0.000075f, 0.000699f, -0.001841f, 0.000319f, -0.000027f, -0.002593f, 0.000649f, -0.016585f, -0.016590f, -0.009841f, -0.010165f, -0.005496f, -0.004155f, -0.019885f, -0.015892f, -0.013527f, + -0.002008f, -0.001211f, -0.002439f, 0.013714f, 0.001444f, 0.007056f, 0.010621f, 0.012305f, 0.002004f, 0.024103f, 0.030304f, -0.000680f, 0.008819f, 0.006770f, -0.003613f, 0.013173f, 0.007232f, -0.027239f, -0.000848f, -0.009462f, 0.001634f, 0.020963f, 0.008425f, -0.021794f, -0.005715f, 0.009613f, 0.009656f, 0.001269f, 0.027887f, -0.011590f, 0.011280f, 0.011294f, 0.012455f, 0.007191f, 0.014498f, -0.024554f, 0.009031f, -0.009622f, 0.014608f, 0.000478f, 0.006326f, -0.018452f, 0.013558f, 0.009714f, -0.002316f, 0.009403f, -0.001531f, 0.002576f, -0.000123f, -0.009658f, 0.002551f, -0.006200f, 0.006060f, -0.007634f, 0.009470f, 0.002892f, 0.023632f, 0.017559f, -0.005503f, 0.006228f, -0.019389f, 0.016858f, -0.005266f, 0.010311f, 0.018335f, 0.017895f, 0.000889f, 0.018279f, 0.012719f, 0.008607f, 0.009352f, 0.016789f, 0.001710f, 0.003569f, -0.013734f, -0.002462f, -0.003919f, 0.003089f, -0.009899f, 0.001414f, -0.007206f, 0.002181f, -0.007179f, 0.002133f, -0.002622f, -0.004586f, -0.004227f, 0.002903f, 0.000336f, -0.002351f, -0.001679f, -0.005930f, -0.001872f, 0.000956f, -0.001683f, -0.004300f, + 0.000648f, 0.004296f, -0.010031f, -0.006299f, -0.005528f, 0.003974f, -0.006145f, 0.003707f, 0.000061f, 0.002093f, -0.005088f, -0.007609f, -0.001678f, 0.001392f, 0.016012f, -0.014277f, -0.003673f, 0.012651f, -0.006725f, 0.021712f, -0.006902f, -0.015451f, 0.028986f, 0.039270f, 0.008789f, -0.015596f, 0.010910f, -0.008258f, 0.016203f, 0.009331f, -0.003480f, -0.016539f, -0.010730f, -0.028075f, 0.007375f, 0.011866f, -0.024662f, -0.003016f, 0.014402f, 0.003671f, -0.001157f, 0.000511f, -0.002987f, -0.013454f, 0.003293f, 0.016513f, 0.000719f, 0.003509f, 0.006045f, 0.023421f, -0.015441f, -0.000501f, 0.017115f, -0.015686f, 0.022974f, 0.001129f, 0.032271f, -0.026880f, -0.024126f, 0.013238f, 0.001238f, -0.003276f, 0.006973f, -0.002274f, 0.009019f, 0.005455f, 0.017970f, 0.017024f, -0.014065f, 0.002531f, -0.009174f, -0.005617f, 0.010777f, -0.001383f, -0.005468f, -0.002435f, 0.000563f, 0.015988f, -0.030573f, 0.023295f, -0.007257f, -0.010472f, 0.017375f, -0.014024f, 0.013943f, -0.018853f, -0.010506f, -0.003532f, -0.013909f, -0.004872f, -0.009802f, -0.015683f, -0.010472f, 0.003377f, -0.003499f, -0.003799f, + -0.000161f, -0.007325f, -0.002260f, -0.001122f, 0.009767f, -0.000538f, 0.001478f, 0.003867f, -0.004015f, -0.001634f, -0.003387f, 0.002316f, 0.004819f, 0.001261f, -0.001877f, 0.011359f, 0.000143f, 0.008418f, -0.009103f, -0.005971f, -0.005371f, -0.003962f, 0.004433f, 0.002077f, 0.000398f, 0.006591f, -0.004847f, 0.005023f, 0.002094f, 0.004669f, 0.002760f, 0.000625f, -0.005728f, -0.019397f, -0.014955f, -0.006447f, -0.014031f, -0.021155f, -0.004548f, 0.007810f, 0.025999f, 0.004320f, -0.015825f, -0.029081f, -0.006169f, 0.009128f, -0.005183f, 0.031396f, 0.009771f, -0.010997f, -0.022229f, -0.027600f, -0.052513f, -0.004202f, -0.005867f, 0.020167f, 0.014780f, -0.010660f, 0.001283f, -0.008230f, -0.004618f, 0.018932f, -0.000578f, 0.001083f, -0.002378f, 0.021468f, 0.003542f, -0.006337f, -0.001143f, -0.000710f, 0.005707f, -0.019381f, -0.006212f, -0.007573f, 0.030713f, 0.007263f, -0.032468f, 0.008436f, -0.016889f, -0.009378f, 0.004689f, -0.030059f, 0.009299f, 0.021812f, 0.019190f, 0.015112f, 0.003589f, 0.006154f, -0.001055f, 0.003285f, -0.019088f, 0.006990f, -0.029839f, -0.005627f, 0.016965f, 0.006315f, + 0.017382f, 0.017308f, 0.014161f, -0.009661f, -0.022044f, -0.019127f, -0.014936f, 0.004912f, 0.005869f, 0.010253f, 0.010032f, 0.002278f, 0.006680f, 0.021569f, 0.030010f, -0.007134f, 0.010650f, -0.007405f, -0.008163f, 0.009280f, -0.013273f, -0.004591f, 0.000475f, -0.008294f, 0.007763f, -0.007197f, -0.006399f, -0.003416f, 0.001817f, -0.001838f, 0.004200f, 0.000146f, 0.006108f, -0.001390f, -0.003807f, -0.001662f, -0.003728f, -0.009440f, 0.002483f, 0.005176f, -0.000520f, 0.003425f, -0.000979f, 0.004661f, 0.008702f, 0.008465f, 0.006478f, -0.006663f, -0.003470f, 0.006526f, -0.002025f, -0.002520f, 0.000552f, -0.001021f, 0.006439f, -0.001403f, -0.000428f, -0.000937f, 0.015287f, 0.027205f, 0.031395f, 0.022792f, 0.038824f, -0.018137f, 0.027580f, -0.023616f, -0.018605f, 0.020519f, 0.026118f, 0.030950f, -0.031925f, -0.000130f, 0.007997f, -0.023565f, 0.011152f, -0.010329f, -0.016769f, 0.019137f, -0.024859f, 0.026995f, -0.025551f, 0.025293f, -0.018346f, -0.006693f, -0.001704f, -0.033321f, -0.004659f, 0.036862f, -0.009435f, -0.026244f, 0.005607f, 0.017148f, -0.019199f, 0.009563f, 0.039779f, 0.021460f, + 0.008043f, 0.017667f, -0.021063f, 0.014119f, -0.012656f, -0.036193f, -0.011007f, -0.009422f, 0.002683f, 0.016500f, 0.020306f, -0.008937f, -0.015900f, 0.014534f, 0.000099f, 0.011138f, 0.006917f, -0.005848f, 0.001982f, -0.014362f, 0.002195f, 0.004645f, -0.000192f, 0.004791f, 0.032741f, -0.003998f, 0.003241f, 0.009423f, 0.001956f, 0.004087f, -0.016649f, -0.018161f, 0.012665f, -0.021630f, -0.029467f, -0.030851f, 0.024049f, 0.015635f, 0.004637f, -0.001603f, -0.003571f, 0.011554f, -0.001813f, -0.008599f, 0.011025f, 0.030356f, 0.020475f, -0.007927f, -0.005140f, 0.009460f, 0.005429f, -0.002041f, -0.004791f, 0.003510f, 0.004278f, -0.001183f, 0.001249f, 0.016529f, 0.003944f, 0.002444f, 0.006452f, -0.005253f, 0.001211f, 0.005330f, 0.010971f, -0.000955f, 0.000799f, -0.010611f, 0.003487f, -0.005472f, -0.004058f, 0.011302f, 0.009004f, 0.000694f, 0.007062f, -0.005965f, -0.002915f, 0.003478f, 0.000085f, -0.003107f, -0.006152f, -0.006548f, 0.004290f, 0.002042f, -0.002874f, 0.003960f, -0.025180f, -0.040001f, 0.014239f, 0.051927f, 0.025431f, -0.009754f, -0.040165f, -0.013975f, 0.002563f, 0.005585f, + -0.007806f, 0.019696f, 0.013303f, -0.014620f, -0.007554f, -0.001987f, -0.026584f, 0.036896f, -0.016829f, 0.013121f, -0.003093f, -0.008742f, -0.032394f, 0.010573f, 0.006713f, -0.004077f, 0.003900f, 0.014464f, -0.005307f, 0.036070f, -0.008105f, -0.005553f, 0.030100f, -0.003407f, -0.021646f, -0.019381f, -0.037380f, 0.005091f, -0.008321f, -0.011650f, -0.008175f, -0.027450f, -0.011511f, -0.025710f, 0.002704f, -0.022635f, 0.020376f, -0.012813f, -0.000461f, 0.006303f, 0.002492f, 0.011745f, -0.010894f, -0.027778f, 0.012025f, -0.003240f, 0.006852f, -0.006247f, -0.002849f, 0.000777f, 0.026661f, 0.039927f, 0.010808f, -0.012592f, 0.013762f, 0.014468f, 0.015826f, -0.006572f, -0.013417f, 0.020342f, 0.009597f, 0.027199f, 0.006283f, 0.007237f, 0.000720f, 0.008153f, 0.024473f, 0.033454f, 0.016426f, 0.005621f, 0.012530f, 0.005263f, -0.007053f, -0.022974f, -0.014604f, 0.002578f, 0.011063f, 0.001722f, -0.000632f, -0.008623f, -0.003241f, 0.004678f, 0.003141f, -0.018164f, -0.003495f, 0.004066f, -0.000815f, -0.009059f, -0.007606f, -0.010123f, 0.001860f, -0.001807f, 0.006830f, 0.012823f, 0.007504f, 0.000398f, + -0.004333f, 0.007838f, 0.009400f, 0.000611f, 0.003101f, -0.012681f, -0.000527f, -0.004307f, -0.013041f, 0.002717f, 0.002300f, -0.011609f, -0.001261f, -0.002728f, 0.004304f, -0.004515f, 0.010839f, 0.000052f, -0.002653f, 0.014631f, 0.077772f, 0.001722f, -0.020532f, 0.064352f, 0.032913f, 0.028371f, 0.056363f, 0.055701f, 0.016222f, 0.017633f, 0.014270f, 0.060551f, 0.003339f, -0.021526f, 0.026419f, 0.005485f, -0.023497f, -0.026787f, 0.023544f, 0.022518f, 0.043804f, -0.004380f, 0.003354f, 0.000481f, 0.006158f, -0.026015f, 0.029341f, 0.020182f, 0.009131f, -0.020232f, 0.031040f, -0.009463f, -0.001467f, -0.041099f, -0.008786f, -0.003210f, -0.002444f, -0.021731f, 0.014315f, -0.020222f, -0.011353f, -0.011895f, 0.005999f, -0.014048f, -0.018731f, -0.026285f, 0.027794f, -0.020037f, 0.029549f, 0.012879f, 0.024292f, 0.007331f, -0.024433f, -0.001374f, -0.039368f, -0.018443f, -0.021401f, 0.008108f, -0.027305f, -0.015130f, -0.004863f, 0.000006f, 0.028577f, 0.002742f, -0.004341f, -0.045786f, 0.018165f, 0.015169f, -0.000968f, -0.000705f, -0.022948f, 0.017372f, 0.002024f, -0.020102f, 0.054028f, 0.011795f, + -0.006931f, -0.000996f, -0.021644f, 0.003251f, 0.027108f, -0.007510f, -0.002156f, -0.030350f, -0.017680f, 0.010506f, -0.004127f, -0.014627f, 0.017568f, 0.010314f, -0.017788f, 0.015499f, -0.006121f, 0.004635f, -0.005919f, 0.015152f, 0.003413f, -0.002863f, 0.000487f, 0.003349f, -0.021455f, -0.000193f, -0.007897f, 0.005943f, 0.007419f, 0.010077f, -0.008787f, 0.007227f, 0.005818f, 0.004159f, 0.007939f, 0.008847f, -0.000637f, 0.006705f, -0.010316f, 0.017708f, -0.008196f, 0.014903f, -0.010616f, 0.006322f, -0.023616f, -0.043311f, 0.013302f, 0.013043f, -0.013400f, 0.028190f, -0.031171f, 0.033859f, -0.024427f, -0.014228f, 0.010899f, 0.007834f, 0.087390f, 0.034144f, 0.013091f, -0.054537f, -0.001451f, -0.012947f, -0.028905f, -0.008402f, -0.010565f, -0.009572f, -0.003236f, -0.045355f, -0.000873f, -0.017164f, 0.000562f, 0.022073f, -0.024057f, 0.028644f, -0.009392f, -0.031716f, -0.028289f, 0.022691f, 0.017412f, -0.007099f, -0.015619f, 0.028942f, -0.015621f, -0.014762f, 0.022756f, -0.000660f, 0.007003f, -0.023455f, -0.000790f, -0.013795f, 0.029187f, -0.004412f, 0.041869f, -0.015673f, 0.006293f, 0.012603f, + -0.001196f, 0.001587f, 0.012774f, -0.027010f, -0.004328f, 0.034389f, 0.002792f, 0.009428f, -0.000319f, -0.027917f, 0.011927f, -0.019494f, 0.009919f, 0.030059f, 0.039023f, 0.042536f, 0.044805f, -0.009688f, 0.015726f, -0.000382f, 0.024044f, 0.054277f, -0.059637f, 0.046342f, -0.027571f, 0.012437f, 0.037276f, -0.023546f, 0.002401f, 0.011678f, 0.010166f, -0.002811f, 0.025945f, -0.010082f, -0.008204f, 0.010943f, -0.006222f, 0.024965f, -0.003707f, 0.009444f, -0.020146f, -0.003306f, -0.000602f, -0.016261f, -0.006827f, -0.020505f, 0.000214f, 0.005886f, 0.001990f, 0.022696f, -0.007504f, 0.001499f, 0.002452f, 0.009627f, 0.002376f, 0.009710f, -0.013474f, 0.010102f, 0.003114f, -0.000609f, 0.007223f, 0.009902f, -0.011330f, 0.010286f, -0.021786f, -0.019292f, 0.013435f, -0.006496f, -0.015456f, -0.002264f, 0.006324f, -0.009975f, 0.017538f, -0.020966f, -0.046049f, -0.009001f, 0.009350f, 0.000600f, 0.010839f, -0.034269f, -0.004606f, -0.007052f, -0.048670f, -0.037753f, 0.019418f, 0.020182f, 0.009407f, 0.013901f, -0.024884f, -0.012281f, -0.017618f, 0.053216f, 0.012859f, 0.001422f, 0.039976f, 0.022908f, + 0.020144f, 0.018005f, 0.015776f, -0.028176f, 0.020317f, 0.008143f, -0.008544f, 0.015828f, -0.014077f, -0.014074f, 0.027935f, -0.012162f, 0.017651f, 0.036663f, 0.001411f, 0.006963f, -0.000518f, 0.002306f, -0.007857f, -0.021632f, -0.027081f, -0.044333f, 0.018287f, -0.037566f, 0.014232f, 0.014505f, 0.019026f, 0.000043f, 0.001316f, -0.005335f, -0.028668f, -0.013777f, 0.014833f, -0.010089f, 0.015305f, 0.036674f, -0.011110f, 0.028034f, 0.013083f, 0.003035f, -0.001401f, -0.010118f, -0.026506f, -0.001215f, -0.035886f, -0.012628f, 0.038894f, -0.020756f, 0.006360f, -0.063894f, 0.030511f, -0.011907f, 0.009989f, -0.049323f, -0.043560f, 0.004051f, 0.011989f, 0.022438f, -0.050579f, -0.005470f, 0.000891f, 0.034552f, 0.028633f, 0.031972f, -0.009963f, 0.000592f, 0.005135f, 0.016678f, 0.004265f, 0.009133f, 0.026775f, 0.014959f, -0.009821f, 0.009527f, 0.002872f, 0.001808f, -0.000283f, -0.005718f, -0.021579f, 0.007598f, -0.010291f, 0.003184f, 0.008980f, -0.000367f, 0.002265f, -0.000384f, 0.009014f, -0.005488f, 0.036061f, 0.009615f, -0.001073f, 0.019839f, 0.012414f, 0.001567f, 0.006330f, -0.000703f, + -0.015596f, 0.020853f, -0.006505f, 0.002720f, 0.025413f, 0.013816f, -0.007446f, -0.000005f, -0.009606f, 0.016391f, 0.011815f, 0.013979f, 0.012434f, 0.038061f, -0.090153f, -0.022180f, -0.053555f, 0.018067f, -0.048099f, -0.016126f, -0.054510f, 0.014575f, -0.028435f, -0.021804f, -0.004676f, -0.046288f, -0.016853f, -0.049595f, -0.025068f, -0.057423f, 0.012359f, -0.053128f, -0.021031f, -0.027606f, -0.015494f, -0.014596f, -0.012436f, -0.050716f, -0.029026f, -0.038585f, -0.019827f, -0.011148f, 0.021869f, -0.003176f, 0.016316f, -0.031566f, -0.005169f, 0.001817f, -0.036398f, 0.007029f, -0.002581f, 0.003081f, 0.009493f, -0.036814f, -0.002113f, 0.013577f, -0.004586f, 0.015305f, 0.030535f, 0.055383f, -0.046040f, 0.002829f, 0.061526f, 0.000299f, 0.030184f, -0.021577f, 0.038114f, 0.006973f, -0.009144f, -0.051183f, -0.030174f, 0.042503f, 0.026204f, 0.041504f, 0.001485f, -0.028951f, 0.010542f, 0.014998f, 0.029647f, -0.055657f, 0.000366f, 0.010545f, -0.030757f, -0.010238f, -0.013315f, -0.018632f, -0.044638f, 0.068984f, -0.012707f, -0.022162f, -0.014189f, 0.014304f, 0.016532f, -0.038985f, -0.036271f, -0.001437f, + 0.011513f, 0.001810f, 0.000090f, -0.007603f, -0.013198f, -0.000167f, 0.034729f, 0.021538f, -0.000254f, -0.028624f, -0.019837f, 0.003217f, -0.011069f, 0.007585f, 0.009151f, 0.004680f, -0.003042f, -0.014765f, 0.006015f, 0.007321f, -0.004108f, 0.011083f, -0.006469f, -0.025418f, -0.012098f, -0.001451f, 0.007361f, -0.001888f, -0.008199f, -0.037194f, -0.014893f, -0.008517f, 0.002790f, 0.004668f, -0.016098f, -0.028811f, 0.011264f, 0.017305f, -0.015308f, 0.000693f, -0.013461f, 0.014574f, -0.004717f, -0.025554f, 0.038352f, -0.064726f, -0.000681f, -0.012822f, 0.027988f, -0.014242f, -0.039890f, 0.034861f, -0.070024f, -0.060375f, -0.049834f, 0.028598f, -0.014816f, 0.001624f, -0.027167f, -0.025709f, -0.030044f, 0.016921f, 0.014654f, 0.048859f, 0.023010f, 0.009917f, 0.045495f, -0.012049f, 0.016521f, -0.016350f, 0.014254f, 0.008272f, 0.027130f, 0.043841f, 0.022919f, -0.009055f, -0.026733f, -0.015922f, -0.005418f, 0.024652f, -0.008057f, 0.006922f, 0.000989f, -0.011239f, 0.023322f, -0.001409f, 0.019161f, 0.014242f, -0.037218f, 0.030823f, 0.056575f, 0.008873f, 0.047340f, 0.045824f, 0.020829f, 0.015222f, + 0.000190f, 0.024250f, -0.014970f, -0.054876f, -0.017804f, 0.040891f, 0.000492f, -0.020128f, 0.021117f, 0.058042f, -0.013135f, 0.004520f, -0.041840f, 0.041403f, 0.037154f, -0.002608f, 0.012035f, -0.018843f, 0.095228f, -0.059598f, -0.051699f, -0.048819f, 0.004276f, 0.001829f, -0.014261f, 0.042496f, -0.059408f, -0.000924f, -0.037916f, 0.014648f, 0.017026f, -0.002582f, 0.041486f, 0.009626f, -0.003329f, -0.022274f, -0.000097f, 0.010538f, 0.030294f, -0.020532f, -0.026374f, 0.011189f, -0.015632f, -0.004056f, 0.003889f, 0.007336f, 0.002675f, 0.000287f, -0.001769f, -0.024869f, 0.002604f, 0.006115f, 0.017401f, -0.014666f, -0.008146f, 0.009806f, 0.004808f, 0.006861f, 0.000849f, -0.016204f, -0.001599f, -0.018410f, -0.013867f, 0.018785f, 0.009718f, 0.010637f, 0.007557f, -0.000502f, 0.003882f, -0.004920f, 0.011564f, 0.001688f, -0.004812f, -0.000959f, -0.016023f, -0.005983f, -0.010553f, 0.006716f, 0.104581f, -0.023516f, 0.058508f, 0.099330f, -0.033501f, 0.047310f, 0.021711f, -0.063538f, 0.058023f, 0.008131f, -0.027009f, 0.041788f, 0.018563f, 0.039223f, 0.000154f, -0.034213f, 0.032278f, 0.010327f, + 0.000652f, 0.009402f, -0.009140f, -0.036165f, -0.020722f, -0.017638f, -0.030295f, -0.023457f, -0.005355f, 0.023027f, -0.020714f, -0.013348f, -0.029840f, 0.005791f, 0.003063f, 0.004223f, 0.042066f, -0.025537f, 0.010491f, -0.023740f, -0.012593f, 0.023240f, -0.018612f, -0.043334f, -0.054397f, 0.062522f, 0.028520f, -0.016320f, 0.044004f, -0.040706f, -0.034638f, -0.021981f, -0.003068f, 0.005746f, 0.000742f, -0.037943f, -0.026982f, -0.029815f, -0.063678f, -0.040714f, -0.034108f, 0.011725f, 0.021944f, -0.002426f, 0.037659f, 0.006416f, -0.037933f, -0.033752f, 0.050654f, -0.043734f, 0.006467f, 0.043349f, -0.005391f, -0.076440f, 0.053319f, -0.028607f, 0.008782f, 0.002753f, 0.044161f, -0.011191f, -0.016552f, -0.002883f, -0.024860f, 0.012496f, -0.043071f, 0.014079f, -0.055460f, -0.036328f, 0.021778f, -0.024276f, -0.006605f, -0.003707f, -0.032860f, 0.010192f, -0.019119f, 0.015194f, -0.004865f, -0.001249f, 0.001867f, 0.019975f, -0.014715f, -0.012489f, 0.003792f, -0.021543f, -0.009076f, 0.002545f, -0.013500f, -0.015279f, -0.009920f, -0.006863f, -0.015780f, -0.009534f, 0.022628f, -0.018922f, 0.008821f, 0.012941f, + -0.003156f, 0.013883f, -0.019221f, 0.001513f, -0.013475f, 0.027655f, 0.005426f, 0.009549f, -0.019674f, 0.024212f, 0.017198f, 0.018387f, 0.008152f, 0.001810f, 0.006204f, 0.013205f, -0.013466f, 0.000862f, -0.011195f, -0.050535f, 0.030389f, -0.014322f, 0.051261f, 0.035143f, -0.081343f, -0.010262f, 0.008885f, -0.049654f, -0.007855f, -0.008125f, 0.060475f, 0.043478f, 0.040484f, 0.050143f, -0.001626f, -0.035135f, -0.026962f, -0.027966f, 0.001573f, -0.077835f, 0.009591f, 0.066657f, -0.060515f, -0.109684f, 0.011418f, -0.041044f, 0.081167f, -0.000540f, 0.002902f, 0.054254f, -0.024616f, 0.011147f, -0.002269f, -0.014740f, 0.047361f, -0.013595f, 0.024079f, 0.079212f, -0.058055f, -0.033269f, -0.052894f, 0.026449f, 0.004644f, 0.053031f, -0.030181f, 0.020893f, 0.003056f, 0.048300f, 0.028678f, -0.023622f, -0.015500f, 0.018273f, -0.008519f, -0.002153f, -0.033908f, -0.033656f, 0.017874f, -0.007514f, -0.009717f, -0.019139f, 0.043939f, -0.016593f, -0.017374f, 0.073361f, 0.078624f, 0.050803f, -0.066459f, -0.005916f, -0.020759f, 0.025897f, 0.097856f, -0.012355f, -0.074246f, -0.004875f, -0.030479f, 0.043851f, + 0.019802f, -0.049882f, 0.026459f, 0.019379f, 0.025814f, -0.048128f, -0.017165f, 0.003582f, 0.042814f, 0.002640f, -0.006684f, 0.007005f, -0.014439f, 0.003374f, 0.042784f, 0.020710f, -0.017575f, -0.021306f, -0.004679f, 0.013447f, 0.017211f, 0.022531f, -0.021112f, -0.008062f, -0.038837f, -0.008160f, 0.024858f, -0.024469f, -0.003684f, -0.015105f, -0.013857f, -0.022982f, -0.004654f, 0.015691f, -0.003341f, -0.001641f, 0.004090f, 0.010011f, -0.010183f, -0.029323f, -0.030277f, 0.018402f, 0.014301f, 0.025702f, -0.012654f, 0.018871f, 0.055326f, 0.002925f, -0.032834f, -0.005278f, 0.003166f, -0.002930f, -0.020474f, -0.008398f, 0.006264f, 0.016089f, -0.003252f, -0.047672f, 0.006976f, -0.039076f, 0.035988f, 0.021069f, -0.038651f, 0.065783f, 0.099137f, 0.003064f, -0.004813f, -0.033741f, -0.034569f, 0.006043f, 0.005559f, -0.016495f, 0.089681f, -0.007839f, 0.066855f, 0.053972f, -0.067845f, -0.001863f, -0.022840f, -0.072141f, 0.018127f, 0.017060f, 0.039425f, 0.068045f, -0.002179f, -0.019076f, 0.022171f, 0.024858f, 0.053234f, 0.022632f, 0.004786f, 0.044206f, 0.046118f, 0.016201f, -0.010731f, 0.040574f, + 0.017857f, 0.048702f, 0.010274f, 0.014266f, 0.030194f, 0.051574f, -0.008634f, -0.040316f, -0.047049f, -0.015006f, -0.016405f, 0.080960f, 0.044120f, 0.124795f, -0.005867f, -0.062398f, 0.055173f, -0.018610f, -0.021549f, -0.018458f, -0.042393f, 0.006611f, 0.023738f, -0.000553f, -0.023760f, 0.088800f, -0.017689f, 0.104729f, -0.028605f, 0.056540f, 0.004892f, -0.017229f, -0.056959f, -0.080911f, 0.076236f, -0.006970f, -0.013021f, -0.022949f, 0.070865f, 0.000391f, -0.074336f, 0.136752f, 0.042886f, 0.015281f, -0.015615f, -0.056787f, 0.028710f, 0.001982f, 0.028906f, -0.026155f, 0.020642f, 0.010815f, -0.012796f, -0.019202f, 0.003606f, -0.023300f, -0.011065f, -0.026526f, 0.003250f, -0.004282f, -0.000255f, 0.009409f, 0.022380f, -0.022194f, 0.008835f, -0.010599f, -0.000550f, 0.030393f, 0.020084f, -0.010235f, -0.037316f, -0.000726f, -0.002078f, 0.005459f, 0.034358f, -0.021709f, -0.012958f, 0.009074f, 0.021630f, -0.030660f, 0.002246f, 0.021026f, -0.000302f, -0.001901f, -0.032352f, 0.017370f, -0.000848f, 0.015871f, -0.033797f, 0.004367f, 0.014611f, 0.011913f, 0.017025f, -0.032076f, 0.027640f, -0.034017f, + 0.021908f, 0.092803f, -0.055324f, -0.034904f, 0.007075f, 0.017068f, -0.010877f, 0.065778f, 0.050506f, 0.051822f, 0.016959f, 0.025771f, 0.042858f, 0.027091f, -0.016080f, -0.025422f, -0.058513f, -0.009050f, 0.031527f, 0.011278f, 0.006499f, -0.021299f, -0.055360f, -0.015702f, -0.008105f, 0.056387f, 0.000383f, -0.006358f, 0.042119f, -0.006416f, 0.011374f, 0.009404f, -0.095042f, 0.024611f, 0.025192f, -0.016207f, -0.040847f, 0.008027f, -0.053760f, -0.026846f, -0.082140f, 0.025053f, -0.068641f, -0.135009f, 0.015344f, -0.001529f, 0.094938f, -0.002953f, 0.032008f, 0.079011f, -0.013260f, -0.020081f, 0.034600f, -0.000378f, -0.069027f, -0.023678f, 0.008663f, 0.011750f, 0.050299f, 0.021401f, 0.044753f, 0.039395f, -0.028463f, -0.020722f, 0.018866f, 0.057822f, -0.024306f, -0.011757f, -0.053163f, -0.036160f, 0.013667f, -0.070990f, 0.020323f, -0.079776f, 0.014869f, -0.020821f, 0.056495f, -0.024532f, 0.039947f, -0.085527f, -0.017826f, 0.012008f, -0.051409f, 0.013185f, 0.008714f, 0.009101f, -0.038854f, 0.020501f, -0.038050f, 0.011030f, -0.003212f, -0.015803f, -0.007217f, -0.003522f, 0.011746f, -0.012894f, + -0.006328f, -0.010296f, 0.024246f, -0.015733f, 0.014047f, -0.035996f, 0.018793f, -0.001864f, -0.003200f, 0.005429f, 0.034826f, 0.012435f, 0.014731f, -0.041782f, 0.005206f, -0.017007f, -0.052138f, 0.021051f, -0.016872f, -0.012995f, -0.019411f, 0.019534f, -0.009580f, 0.009519f, 0.010656f, -0.004828f, 0.002065f, -0.012540f, 0.003446f, 0.010794f, -0.002682f, 0.001796f, -0.001574f, -0.019880f, 0.072710f, 0.077255f, 0.180933f, 0.021204f, -0.101064f, -0.076083f, -0.055795f, -0.064657f, 0.126700f, 0.168823f, 0.057419f, -0.016209f, -0.052970f, 0.001789f, -0.064133f, 0.070669f, 0.067055f, 0.019768f, 0.009852f, -0.041987f, -0.005902f, 0.077782f, 0.018325f, 0.031209f, 0.026532f, 0.081628f, 0.068916f, -0.026565f, -0.060572f, -0.080382f, -0.053951f, -0.008115f, 0.022571f, 0.073389f, 0.044244f, -0.015387f, 0.040001f, -0.055802f, -0.018782f, -0.125414f, -0.019602f, 0.123341f, 0.095568f, -0.019249f, 0.250233f, 0.078387f, 0.007544f, -0.137125f, -0.023147f, -0.011801f, -0.031939f, 0.034977f, 0.019662f, 0.029633f, 0.052702f, -0.111892f, -0.120265f, -0.060574f, -0.081054f, -0.011630f, 0.027773f, 0.101183f, + -0.060288f, 0.037006f, 0.157999f, 0.078846f, 0.027719f, 0.044211f, 0.032451f, -0.095300f, -0.157443f, 0.080656f, -0.038747f, 0.034727f, 0.084726f, 0.093435f, 0.008522f, -0.056509f, -0.074184f, -0.060705f, 0.065568f, 0.037755f, 0.011662f, 0.065179f, -0.064676f, -0.011278f, -0.010117f, -0.028744f, -0.033331f, -0.002856f, -0.000671f, 0.021158f, 0.006862f, -0.009308f, 0.000481f, -0.000802f, 0.001385f, 0.005600f, 0.012382f, 0.018848f, -0.018525f, -0.025694f, -0.087947f, -0.048272f, -0.043317f, 0.052128f, 0.031148f, 0.018654f, -0.071947f, -0.070728f, -0.113693f, -0.031072f, 0.045119f, 0.057324f, 0.074866f, 0.029282f, 0.022111f, 0.008738f, 0.007522f, -0.002097f, 0.017041f, -0.003959f, 0.053711f, 0.037863f, 0.007888f, 0.000468f, 0.000675f, -0.009130f, 0.000177f, -0.006403f, -0.038493f, -0.165506f, -0.039484f, 0.092317f, 0.176671f, 0.155718f, 0.373212f, 0.195387f, 0.132515f, 0.116661f, 0.053037f, -0.020849f, -0.188603f, -0.236680f, -0.353173f, -0.270395f, -0.277457f, -0.105513f, 0.001344f, 0.106259f, 0.197592f, 0.163070f, 0.168450f, 0.116159f, 0.158492f, 0.124133f, 0.175488f, 0.083621f, + 0.065415f, 0.031332f, -0.045189f, -0.069416f, -0.106414f, -0.064276f, -0.231097f, -0.097566f, -0.218734f, -0.157750f, -0.250347f, -0.148760f, -0.233037f, -0.082716f, -0.115547f, -0.037578f, 0.017793f, 0.118303f, 0.310100f, 0.295391f, 0.413776f, 0.280144f, 0.191012f, 0.248144f, 0.338811f, 0.298269f, 0.250420f, 0.174815f, 0.021018f, -0.169405f, -0.168281f, -0.208477f, -0.396912f, -0.438067f, -0.477274f, -0.476479f, -0.523330f, -0.452501f, -0.381306f, -0.336172f, -0.219021f, 0.025214f, 0.248990f, 0.433318f, 0.572641f, 0.713986f, 0.794310f, 0.553865f, 0.528079f, 0.342820f, 0.207572f, 0.196296f, -0.011856f, -0.064797f, -0.304432f, -0.583226f, -0.628294f, -0.509921f, -0.394298f, -0.232198f, -0.188044f, -0.191323f, -0.105688f, -0.164303f, -0.066645f, -0.018251f, 0.126064f, 0.239657f, 0.196702f, 0.256182f, 0.275152f, 0.293707f, 0.259225f, 0.346255f, 0.257138f, 0.210845f, 0.108742f, 0.022393f, -0.058670f, -0.268228f, -0.237784f, -0.318439f, -0.422433f, -0.382532f, -0.438722f, -0.450659f, -0.131650f, 0.014733f, 0.228762f, 0.280310f, 0.298294f, 0.346506f, 0.361663f, 0.307023f, 0.266781f, 0.204783f, + 0.154995f, 0.056143f, -0.040355f, -0.119455f, -0.215743f, -0.316509f, -0.296813f, -0.264701f, -0.198340f, -0.093247f, -0.041408f, -0.019510f, -0.012011f, 0.029167f, 0.060588f, 0.073944f, 0.079197f, 0.065708f, 0.052231f, 0.057055f, 0.046103f, 0.034775f, 0.063315f, 0.071501f, 0.054606f, 0.026942f, 0.013943f, 0.022723f, 0.029184f, 0.011640f, 0.005765f, 0.011619f, 0.001558f, -0.022030f, -0.065938f, -0.079239f, -0.052547f, -0.040231f, -0.046247f, -0.043939f, -0.027047f, -0.038176f, -0.043551f, -0.037373f, -0.015387f, 0.003485f, 0.018949f, 0.026279f, 0.035347f, 0.040379f, 0.037273f, 0.031702f, 0.035987f, 0.036465f, 0.031689f, 0.022345f, 0.015531f, 0.005451f, -0.001988f, -0.004290f, -0.007123f, -0.014481f, -0.008982f, -0.004248f, -0.007596f, -0.010730f, -0.007077f, -0.001393f, 0.006252f, 0.004915f, -0.000832f, -0.006618f, -0.005542f, -0.009972f, -0.018448f, -0.022936f, -0.021478f, -0.020402f, -0.017710f, -0.019145f, -0.016662f, -0.007244f, 0.000526f, 0.002617f, 0.014172f, 0.030192f, 0.036069f, 0.029907f, 0.027130f, 0.027324f, 0.023522f, 0.013734f, 0.007085f, 0.004853f, -0.000086f, -0.008218f, + -0.012184f, -0.014364f, -0.014555f, -0.014196f, -0.013190f, -0.010587f, -0.007511f, -0.006801f, -0.006272f, -0.005303f, -0.002708f, -0.001499f, -0.000463f, -0.000099f, 0.001010f, 0.000939f, 0.001212f, 0.000641f, 0.000738f, 0.000088f}, + {0.024092f, 0.001069f, 0.004072f, 0.003368f, -0.009790f, -0.005078f, 0.013361f, 0.023217f, 0.003770f, 0.012374f, -0.004990f, 0.002350f, -0.000609f, 0.010485f, -0.008265f, -0.018914f, 0.007691f, 0.008877f, -0.010998f, 0.012815f, 0.006341f, 0.011694f, 0.003735f, 0.002799f, -0.005055f, -0.001608f, 0.000655f, 0.007808f, 0.000750f, -0.011689f, 0.000565f, -0.000919f, 0.002586f, -0.001601f, 0.002141f, 0.002845f, 0.007038f, 0.005103f, 0.001724f, 0.002222f, 0.000751f, 0.003465f, -0.003549f, -0.005804f, -0.012919f, 0.002550f, 0.002916f, 0.001095f, 0.010007f, -0.003476f, 0.007792f, 0.002183f, -0.003019f, -0.006081f, -0.003902f, 0.013979f, 0.003050f, 0.007826f, 0.001364f, 0.003120f, -0.002605f, 0.000533f, 0.001003f, 0.004062f, -0.001132f, -0.005130f, -0.002736f, -0.010741f, 0.001274f, 0.002174f, 0.009314f, -0.002903f, 0.007138f, -0.001164f, 0.004700f, 0.000150f, 0.004242f, 0.003303f, 0.002020f, -0.001659f, 0.004868f, 0.006681f, 0.004694f, 0.004391f, -0.000070f, 0.001010f, 0.001160f, -0.003571f, 0.001615f, 0.000902f, 0.003294f, 0.001737f, 0.001406f, 0.001792f, 0.002381f, -0.001211f, + 0.001473f, -0.000903f, -0.000045f, -0.000379f, 0.009074f, 0.008469f, 0.004083f, 0.003375f, 0.004856f, 0.005549f, 0.008575f, -0.003825f, 0.008894f, -0.000052f, 0.009492f, -0.002198f, 0.016784f, 0.005504f, 0.005644f, -0.011488f, -0.001444f, -0.002721f, -0.014606f, 0.007913f, 0.006939f, -0.004808f, -0.019180f, -0.008949f, -0.002760f, 0.009268f, 0.013097f, 0.008021f, -0.005038f, 0.002617f, -0.008145f, 0.000246f, 0.000859f, -0.006894f, -0.003218f, -0.017629f, 0.001582f, -0.002342f, -0.007180f, 0.000612f, 0.001147f, -0.002519f, -0.000416f, 0.016582f, -0.003884f, 0.013479f, 0.002791f, -0.010684f, 0.000920f, 0.000873f, 0.007802f, -0.003592f, 0.002313f, 0.001665f, 0.000726f, 0.010284f, 0.003760f, 0.010562f, 0.008017f, -0.005650f, 0.009906f, 0.004604f, 0.007270f, 0.000519f, 0.002467f, -0.002655f, -0.004511f, -0.008975f, -0.010727f, 0.011162f, -0.011151f, -0.008862f, -0.009201f, 0.005078f, 0.004862f, 0.001926f, 0.002184f, 0.006477f, -0.004141f, 0.004837f, -0.003094f, -0.004674f, 0.007373f, -0.006820f, 0.001255f, 0.003235f, -0.005483f, 0.001205f, 0.000945f, -0.001029f, -0.000750f, -0.000649f, + 0.003929f, -0.001401f, 0.001545f, -0.001840f, 0.003047f, -0.000970f, 0.001761f, -0.002175f, -0.002083f, -0.002097f, -0.015008f, -0.014086f, 0.003086f, 0.000209f, -0.002975f, 0.008329f, -0.001044f, -0.001535f, 0.008778f, -0.009673f, 0.001938f, -0.008455f, -0.005371f, -0.003102f, 0.000147f, 0.014167f, 0.016234f, -0.007597f, 0.006391f, -0.011738f, -0.001065f, -0.004648f, 0.015769f, -0.004735f, -0.000843f, 0.001558f, -0.022091f, -0.003941f, -0.010888f, -0.003695f, -0.002671f, 0.008153f, 0.010997f, 0.004393f, 0.014848f, -0.001993f, -0.006703f, -0.006940f, 0.008590f, 0.022121f, 0.015572f, -0.008767f, -0.010098f, 0.011014f, -0.009937f, 0.001796f, 0.003581f, 0.018103f, -0.006668f, -0.009076f, 0.002016f, -0.005670f, 0.003513f, 0.004534f, 0.011604f, -0.012781f, -0.008193f, 0.007326f, 0.014009f, -0.001393f, -0.006465f, -0.008346f, -0.019746f, 0.007397f, -0.000013f, 0.005787f, 0.000945f, 0.000408f, -0.003090f, 0.003522f, -0.005031f, 0.003025f, 0.004287f, 0.004200f, -0.007004f, 0.005046f, -0.001274f, -0.005037f, 0.000484f, -0.010494f, 0.006517f, 0.000868f, 0.000832f, -0.004240f, -0.001411f, -0.003607f, + -0.007235f, -0.005614f, 0.003853f, 0.000243f, 0.001560f, -0.001469f, 0.000508f, -0.000529f, -0.002073f, -0.001755f, -0.003029f, 0.000194f, -0.001741f, -0.001420f, -0.000432f, 0.000557f, -0.000544f, 0.000867f, -0.000569f, 0.003512f, 0.001395f, -0.002241f, 0.002460f, 0.001364f, -0.002862f, 0.001888f, -0.036777f, -0.011959f, -0.002058f, 0.006368f, 0.004083f, 0.009235f, -0.017630f, -0.005131f, -0.000918f, -0.018045f, -0.013097f, 0.004671f, 0.010857f, 0.006555f, 0.011994f, -0.001440f, 0.006835f, 0.016246f, 0.014115f, 0.013491f, 0.007589f, -0.005052f, -0.004232f, -0.008186f, -0.003800f, -0.008225f, 0.017098f, 0.008115f, -0.002772f, -0.007531f, -0.004782f, -0.007692f, -0.011479f, -0.012145f, -0.015513f, 0.009378f, 0.006520f, -0.016979f, 0.003901f, -0.000804f, 0.011664f, 0.001886f, 0.005679f, 0.007722f, -0.016264f, -0.002439f, -0.000718f, 0.002208f, 0.008347f, 0.012928f, -0.005274f, -0.001798f, -0.003899f, -0.010099f, 0.003003f, 0.002091f, -0.001191f, -0.002714f, 0.009634f, 0.000590f, -0.005506f, -0.001768f, 0.004508f, 0.006291f, -0.002631f, -0.000225f, 0.001519f, -0.008781f, 0.006446f, -0.000629f, + -0.013387f, 0.001581f, -0.016315f, 0.002628f, 0.011940f, -0.003969f, -0.000593f, -0.018149f, -0.008991f, -0.013472f, -0.008313f, -0.001072f, -0.001503f, 0.008451f, 0.001535f, 0.009913f, -0.006018f, 0.003372f, 0.005256f, 0.001833f, 0.005172f, 0.000656f, -0.003635f, 0.002087f, -0.001673f, 0.001737f, 0.000070f, 0.000745f, -0.000749f, -0.002460f, -0.001003f, 0.002262f, -0.002485f, 0.001693f, 0.004097f, 0.002167f, 0.001006f, 0.000139f, 0.000069f, -0.000853f, -0.001688f, -0.002671f, 0.001943f, 0.002691f, -0.001643f, 0.001775f, -0.001730f, -0.001250f, 0.020307f, 0.007407f, 0.003583f, -0.005210f, 0.015006f, 0.005566f, 0.008558f, 0.023309f, 0.025617f, 0.000790f, -0.003956f, -0.009204f, -0.013654f, 0.004894f, 0.010226f, -0.005388f, -0.000861f, 0.001250f, -0.002252f, -0.008311f, 0.009707f, -0.009520f, 0.004569f, -0.027118f, -0.003722f, -0.006747f, -0.006377f, -0.013499f, -0.002613f, -0.001917f, 0.000367f, -0.007017f, -0.009581f, -0.007874f, 0.001225f, -0.005285f, -0.010178f, 0.005979f, 0.009035f, 0.000523f, -0.008325f, -0.009721f, 0.003648f, -0.007535f, 0.008524f, -0.010683f, 0.006901f, 0.002232f, + 0.000018f, -0.015138f, -0.013673f, 0.002988f, -0.009869f, 0.016032f, 0.003046f, 0.013416f, -0.006926f, 0.013502f, 0.002814f, 0.008610f, 0.003144f, 0.008143f, -0.007575f, -0.011263f, -0.000091f, 0.017415f, -0.001593f, -0.012132f, -0.006175f, 0.007450f, -0.004808f, -0.007044f, 0.001917f, -0.019210f, 0.012931f, 0.015168f, -0.000837f, -0.013416f, -0.016480f, -0.000774f, 0.014086f, 0.009820f, -0.007791f, 0.010445f, 0.001233f, -0.001838f, -0.001974f, -0.001390f, -0.000785f, 0.002665f, -0.004573f, -0.004343f, 0.000469f, 0.001306f, -0.003413f, 0.000986f, -0.001545f, -0.000797f, 0.003811f, -0.001797f, -0.000705f, 0.000288f, -0.005754f, 0.002784f, 0.000871f, 0.000216f, 0.001448f, 0.001530f, -0.000161f, 0.000170f, -0.001058f, -0.001467f, -0.000792f, -0.001011f, -0.001528f, 0.028704f, 0.006160f, 0.015677f, -0.006006f, 0.011695f, 0.009104f, 0.018325f, -0.013476f, -0.009997f, -0.002890f, 0.000877f, 0.013427f, -0.006386f, 0.020255f, -0.001681f, 0.011623f, 0.009625f, -0.005338f, 0.003848f, 0.011774f, 0.010462f, 0.002985f, 0.002755f, 0.010750f, -0.021876f, 0.003804f, 0.016587f, 0.013368f, -0.011912f, + 0.014896f, -0.017479f, 0.010761f, -0.015440f, -0.007440f, -0.004201f, 0.016140f, -0.003445f, 0.016888f, 0.003491f, 0.003838f, 0.000615f, -0.000308f, 0.006373f, 0.010017f, 0.021458f, 0.003659f, 0.018489f, -0.008949f, 0.013457f, 0.018254f, -0.000782f, -0.002977f, -0.006710f, 0.007214f, -0.025938f, -0.001883f, 0.002319f, -0.009379f, -0.015480f, -0.000604f, -0.001187f, -0.001808f, 0.006521f, -0.015460f, 0.007733f, 0.007187f, 0.009773f, -0.024523f, 0.008316f, 0.006216f, -0.014864f, -0.001463f, 0.007861f, 0.018497f, -0.023321f, -0.002603f, 0.001560f, -0.021578f, -0.002135f, 0.003471f, -0.006273f, 0.014617f, -0.003419f, 0.001512f, 0.003831f, -0.002249f, -0.000924f, -0.000715f, 0.002360f, -0.005387f, 0.000648f, -0.002666f, 0.001542f, 0.000784f, -0.003411f, -0.000083f, 0.003781f, -0.001491f, -0.000985f, 0.000371f, -0.004805f, -0.001481f, 0.000717f, -0.001498f, -0.002288f, -0.000386f, 0.000704f, -0.002282f, -0.001258f, 0.003507f, 0.004174f, -0.005316f, -0.000320f, 0.001197f, -0.000127f, -0.000637f, -0.025638f, -0.031585f, -0.025157f, -0.022858f, -0.000708f, 0.015982f, -0.033185f, 0.023607f, 0.015378f, + -0.037414f, 0.023587f, 0.009913f, 0.008111f, 0.003644f, 0.003680f, 0.008397f, -0.005807f, -0.006149f, -0.012213f, -0.000417f, 0.014392f, 0.012064f, 0.007122f, -0.021319f, 0.014598f, -0.015251f, 0.000478f, -0.013416f, 0.016747f, -0.008887f, -0.006837f, 0.005223f, -0.024950f, 0.002454f, -0.008223f, -0.007522f, -0.002604f, 0.001748f, 0.024667f, -0.011645f, -0.003703f, -0.009406f, 0.018776f, -0.011421f, -0.006069f, 0.005725f, 0.005692f, 0.005236f, 0.006687f, -0.007806f, 0.009091f, 0.002261f, -0.020453f, 0.028168f, 0.011288f, 0.004517f, 0.003008f, -0.000184f, -0.013078f, 0.016104f, 0.013594f, 0.005612f, 0.018167f, 0.001887f, 0.008033f, 0.018154f, 0.009331f, 0.003873f, -0.012478f, 0.014951f, -0.006520f, 0.028600f, -0.003063f, 0.000720f, -0.007759f, -0.030089f, 0.003981f, -0.007328f, -0.003522f, 0.015378f, -0.001261f, -0.016341f, -0.009237f, 0.013212f, 0.011136f, 0.001689f, 0.012895f, 0.003346f, -0.009400f, 0.004441f, -0.000868f, -0.003201f, -0.002587f, 0.001004f, 0.007644f, -0.003637f, 0.000974f, 0.001310f, 0.004313f, 0.001584f, -0.003427f, 0.005521f, 0.000841f, 0.001443f, -0.000301f, + 0.001400f, 0.000716f, -0.002214f, 0.003210f, -0.002237f, 0.002647f, 0.002014f, -0.001598f, 0.006227f, -0.000829f, 0.001508f, -0.002109f, -0.001456f, 0.018356f, 0.012512f, -0.002127f, -0.011512f, 0.030169f, 0.047973f, -0.006335f, -0.006656f, 0.023197f, 0.005649f, 0.007653f, 0.006161f, -0.034547f, 0.003813f, -0.022338f, 0.017881f, 0.025489f, -0.006679f, -0.012306f, 0.004176f, 0.016147f, -0.009677f, 0.019504f, -0.007640f, 0.037639f, -0.010991f, 0.007288f, -0.001831f, 0.010220f, 0.026825f, -0.010115f, 0.002657f, -0.002359f, 0.007772f, -0.009934f, -0.004782f, 0.015270f, 0.032908f, 0.002758f, 0.024098f, -0.008905f, 0.003341f, -0.004518f, 0.008050f, 0.017611f, 0.026269f, 0.020473f, 0.019463f, 0.020223f, 0.012810f, -0.003680f, 0.003146f, -0.002771f, 0.000537f, 0.004027f, -0.013100f, -0.003770f, 0.021178f, -0.018564f, 0.007436f, -0.008156f, -0.004861f, -0.009643f, -0.038246f, 0.004295f, 0.020798f, 0.013153f, -0.004681f, -0.018141f, -0.044083f, -0.007093f, 0.018003f, -0.003696f, 0.007134f, -0.013737f, 0.010315f, -0.012666f, 0.011706f, 0.025040f, -0.010930f, -0.013509f, -0.024911f, 0.007555f, + 0.003142f, 0.004123f, -0.019680f, 0.001450f, 0.000183f, -0.005952f, 0.001202f, 0.009341f, 0.000478f, 0.006431f, 0.002910f, 0.004176f, 0.005142f, -0.000846f, 0.008049f, 0.001936f, 0.000886f, -0.001625f, -0.002513f, -0.002167f, 0.007681f, 0.002596f, -0.000182f, 0.005137f, 0.002764f, 0.003718f, -0.000624f, 0.004259f, 0.005233f, 0.007008f, -0.002827f, 0.000782f, -0.002749f, -0.032921f, -0.026268f, 0.003455f, 0.015391f, -0.014774f, -0.009776f, 0.001976f, -0.008037f, -0.049316f, -0.042650f, 0.018618f, 0.017050f, 0.003209f, 0.002461f, -0.018020f, 0.028269f, 0.034479f, 0.021167f, -0.017688f, 0.016516f, 0.022659f, -0.003576f, -0.028600f, -0.012988f, 0.039681f, -0.011826f, 0.004039f, 0.002354f, 0.022323f, -0.017914f, -0.031753f, 0.006849f, 0.014688f, -0.007884f, 0.009423f, 0.020558f, -0.009939f, -0.007979f, -0.000872f, -0.044505f, -0.012807f, 0.015230f, -0.008380f, -0.029760f, 0.005441f, -0.000850f, -0.009282f, 0.005841f, -0.002744f, -0.028221f, -0.023809f, -0.042211f, -0.033440f, 0.006472f, 0.014827f, 0.001314f, -0.009971f, -0.014132f, 0.000404f, -0.009684f, 0.009048f, -0.020315f, 0.000745f, + -0.007238f, -0.005791f, -0.006925f, -0.001776f, 0.007846f, -0.009152f, -0.040501f, 0.006124f, -0.005887f, 0.010039f, 0.011020f, 0.000813f, 0.007637f, 0.009422f, 0.002913f, -0.002262f, 0.004863f, -0.005699f, 0.002209f, -0.012559f, -0.006739f, -0.005609f, -0.006992f, 0.002916f, 0.011080f, -0.005786f, 0.001699f, -0.014286f, 0.001595f, -0.001392f, -0.010673f, 0.004678f, -0.003435f, 0.002723f, 0.004296f, 0.002535f, 0.001887f, 0.009070f, 0.001919f, 0.001212f, 0.002959f, 0.000058f, 0.001184f, 0.001283f, -0.002634f, -0.006802f, -0.001412f, -0.006889f, 0.003213f, -0.005235f, 0.007701f, 0.000109f, 0.011058f, 0.005145f, -0.006750f, -0.004399f, -0.003706f, -0.000390f, 0.016107f, 0.051763f, 0.045985f, 0.035947f, -0.003827f, 0.035150f, 0.011409f, 0.049053f, 0.020788f, -0.000971f, 0.059841f, -0.012410f, -0.003098f, -0.038043f, -0.010008f, -0.000727f, -0.026818f, 0.016132f, 0.024056f, -0.007747f, -0.000282f, -0.021564f, -0.037028f, -0.021820f, -0.028212f, -0.008184f, -0.017012f, -0.005308f, -0.002614f, 0.017066f, 0.004391f, -0.003460f, -0.015198f, -0.005200f, -0.010112f, 0.005507f, 0.000496f, -0.015063f, + 0.008106f, 0.010155f, 0.004085f, -0.011618f, -0.015264f, 0.005224f, 0.014330f, -0.001934f, -0.000406f, -0.027093f, 0.048891f, 0.008279f, -0.009137f, -0.001231f, 0.004468f, 0.020973f, 0.017870f, -0.018238f, 0.010493f, -0.007068f, 0.002376f, -0.002990f, -0.004468f, -0.027764f, -0.024709f, -0.033266f, 0.005224f, -0.001290f, -0.006875f, 0.021061f, -0.006489f, 0.059260f, -0.005649f, -0.003081f, -0.014387f, -0.006399f, 0.007863f, 0.010287f, 0.007341f, -0.000384f, 0.025652f, 0.018365f, -0.003566f, -0.012199f, 0.003577f, -0.007226f, 0.000177f, 0.002513f, -0.007983f, -0.002587f, 0.000437f, -0.002632f, 0.004227f, -0.009958f, 0.006232f, 0.011388f, -0.003212f, 0.006035f, -0.003237f, -0.002652f, -0.004303f, 0.001983f, 0.006492f, -0.002526f, 0.008632f, 0.001715f, 0.003215f, 0.011705f, 0.005247f, -0.001407f, 0.012418f, 0.005614f, 0.008696f, 0.011098f, 0.008722f, 0.001070f, 0.000245f, 0.008256f, -0.007187f, 0.000388f, 0.005232f, 0.002851f, 0.005952f, 0.005386f, 0.003121f, 0.006872f, -0.031218f, -0.045277f, -0.024663f, 0.033059f, 0.026622f, -0.023323f, -0.023442f, 0.035475f, 0.021946f, -0.023051f, + -0.030662f, -0.005492f, 0.005540f, 0.003003f, 0.004648f, -0.018488f, 0.019149f, -0.013908f, 0.037235f, -0.006207f, -0.025742f, 0.005582f, 0.009718f, -0.000703f, 0.003088f, -0.011936f, -0.016646f, -0.001428f, 0.015295f, -0.009708f, 0.011711f, -0.018675f, -0.048295f, -0.039900f, 0.025211f, -0.031194f, 0.024865f, 0.006669f, 0.003138f, -0.010775f, 0.014717f, 0.004114f, -0.003582f, -0.007561f, 0.007034f, 0.014268f, -0.013082f, 0.040574f, -0.010105f, 0.013302f, -0.012127f, 0.003093f, -0.003214f, -0.016638f, 0.039947f, -0.031579f, 0.043434f, -0.002093f, -0.021193f, -0.033163f, 0.016951f, 0.005316f, 0.005685f, 0.001387f, 0.017819f, 0.011231f, 0.016176f, -0.034123f, -0.009909f, 0.000370f, 0.000736f, 0.007951f, -0.025179f, -0.012863f, -0.008131f, -0.004887f, -0.031589f, -0.007029f, -0.010450f, -0.036361f, -0.001720f, -0.020844f, 0.005418f, -0.010056f, 0.002905f, 0.004108f, 0.015883f, 0.008773f, -0.005816f, -0.001515f, -0.012998f, 0.006756f, -0.000761f, 0.005797f, -0.015290f, 0.000342f, -0.006040f, 0.003236f, -0.014084f, 0.002298f, 0.003388f, 0.000211f, -0.003027f, 0.004484f, -0.008222f, 0.005883f, + -0.012906f, 0.004501f, -0.009215f, 0.004066f, 0.002604f, 0.005903f, -0.004722f, 0.015894f, 0.006572f, -0.000247f, -0.009755f, -0.008640f, -0.001433f, 0.010453f, -0.002133f, -0.005845f, -0.004986f, 0.007010f, 0.000629f, 0.006609f, 0.076834f, 0.025637f, -0.017132f, 0.039481f, 0.036769f, -0.019007f, -0.024220f, 0.059364f, -0.005314f, 0.013062f, -0.035200f, 0.086415f, 0.003022f, -0.024187f, 0.012549f, 0.004331f, 0.041962f, 0.000737f, 0.052994f, -0.038069f, 0.000826f, -0.041584f, 0.003217f, 0.029258f, 0.001371f, -0.025472f, 0.036131f, 0.019323f, 0.010650f, 0.008714f, -0.012610f, -0.012158f, 0.003302f, -0.018020f, 0.023664f, -0.021068f, -0.028100f, 0.024843f, 0.009420f, -0.032593f, 0.017726f, 0.002165f, -0.023697f, -0.013281f, -0.007912f, 0.012486f, -0.002789f, -0.014271f, 0.017427f, -0.021068f, -0.008353f, -0.007218f, 0.029162f, -0.019129f, 0.014098f, 0.022402f, 0.010373f, -0.013232f, -0.027232f, 0.017280f, -0.023286f, 0.031510f, -0.039673f, 0.052352f, -0.015487f, -0.007352f, -0.007434f, 0.023841f, -0.001714f, 0.008656f, 0.014254f, 0.008587f, 0.020257f, -0.019762f, -0.037640f, 0.002648f, + 0.031999f, -0.021343f, -0.010104f, -0.022308f, -0.013384f, 0.005892f, -0.002202f, -0.006412f, 0.013847f, 0.009969f, 0.007324f, -0.003508f, 0.021108f, 0.012930f, -0.009790f, -0.005153f, 0.004171f, 0.001137f, 0.017878f, 0.011337f, -0.001438f, -0.005803f, -0.004518f, 0.019521f, 0.001823f, -0.009988f, 0.012373f, 0.003718f, 0.000535f, 0.010321f, 0.004698f, -0.001802f, -0.010493f, 0.002953f, 0.012849f, -0.009500f, -0.002345f, 0.014630f, -0.000913f, -0.003001f, -0.003644f, 0.008644f, 0.001708f, 0.000264f, -0.003846f, -0.045955f, -0.005687f, 0.042023f, -0.012267f, -0.026205f, 0.011629f, -0.012302f, -0.002240f, 0.019055f, -0.045620f, -0.026810f, 0.017671f, 0.023491f, 0.032052f, -0.002260f, -0.006017f, 0.012913f, -0.003058f, -0.045117f, -0.030869f, 0.053089f, -0.003994f, -0.046492f, -0.026961f, -0.018703f, -0.015343f, 0.004331f, 0.015655f, 0.000859f, -0.007724f, -0.023194f, -0.035456f, 0.004794f, 0.004767f, -0.001229f, 0.029074f, -0.019796f, -0.055640f, 0.022600f, 0.016431f, -0.065024f, 0.038888f, -0.010505f, -0.032796f, -0.027048f, -0.002395f, 0.037033f, 0.008903f, -0.012245f, -0.013356f, 0.010588f, + 0.019509f, -0.027375f, 0.021023f, 0.003394f, 0.015502f, -0.011845f, -0.028438f, 0.025292f, 0.000137f, 0.028362f, -0.087972f, 0.011204f, 0.013653f, -0.013008f, 0.024524f, 0.028427f, 0.083746f, 0.002384f, -0.055198f, -0.025466f, -0.014374f, -0.053696f, -0.052659f, 0.002747f, -0.029876f, 0.000396f, -0.019829f, 0.019731f, -0.020179f, -0.019895f, 0.035385f, 0.008676f, -0.001122f, -0.001940f, 0.020802f, -0.004378f, -0.001992f, 0.012003f, 0.009939f, -0.007624f, 0.006820f, -0.018890f, -0.004073f, 0.005258f, -0.003478f, -0.005494f, -0.009008f, -0.009693f, -0.004873f, -0.011952f, 0.004884f, -0.015189f, 0.003384f, -0.002642f, 0.014330f, -0.003372f, -0.007333f, -0.006335f, -0.008463f, -0.009184f, -0.002353f, -0.006428f, -0.011046f, -0.008265f, 0.008266f, -0.011064f, -0.005583f, -0.019768f, 0.006199f, 0.007904f, 0.020494f, 0.004572f, -0.002507f, 0.001230f, -0.038521f, 0.006239f, 0.023564f, 0.021215f, -0.034203f, 0.060765f, 0.042157f, -0.019372f, 0.025161f, -0.049037f, -0.011033f, -0.016379f, 0.077424f, 0.049770f, -0.018599f, -0.029510f, -0.036336f, -0.007964f, 0.001924f, 0.014329f, 0.051895f, 0.011149f, + 0.008709f, 0.011336f, 0.001305f, -0.017077f, 0.001960f, -0.003168f, 0.023842f, 0.032440f, 0.040890f, 0.026785f, 0.017265f, -0.003949f, -0.007712f, 0.006609f, 0.037057f, 0.005977f, 0.006469f, -0.037716f, -0.019350f, 0.063947f, 0.025786f, 0.019299f, 0.000343f, 0.038361f, 0.020302f, 0.080721f, -0.004648f, 0.083226f, 0.005770f, -0.025663f, 0.026767f, -0.022322f, -0.016924f, -0.002805f, -0.015480f, 0.001059f, 0.015290f, 0.033395f, 0.005643f, -0.006928f, -0.036556f, 0.011907f, 0.002869f, 0.024185f, -0.028705f, 0.007786f, -0.012759f, 0.004482f, -0.036476f, 0.018629f, -0.032114f, -0.003697f, -0.043661f, -0.059656f, -0.010132f, -0.009154f, 0.049131f, 0.013479f, -0.001683f, 0.009440f, 0.015222f, 0.019418f, 0.003102f, -0.000519f, 0.000645f, -0.034463f, 0.010839f, 0.000721f, 0.032173f, -0.012895f, -0.001733f, -0.008409f, 0.022818f, 0.004818f, 0.020829f, -0.000002f, -0.024538f, 0.012141f, -0.001420f, 0.008327f, -0.018692f, -0.008125f, 0.004295f, 0.005385f, -0.013938f, 0.001597f, 0.012478f, 0.008145f, -0.012284f, -0.013187f, 0.023589f, -0.023619f, 0.009800f, -0.007081f, -0.019664f, 0.006482f, + 0.004296f, 0.006540f, 0.007941f, -0.008617f, -0.001303f, 0.011726f, 0.000745f, 0.008268f, -0.003549f, -0.008789f, -0.009487f, -0.020451f, -0.030929f, 0.009334f, -0.035505f, -0.000201f, 0.043098f, 0.013357f, 0.036740f, -0.042724f, -0.019595f, 0.020709f, 0.004316f, 0.060761f, -0.030943f, 0.036264f, -0.013773f, -0.018618f, -0.045404f, -0.017824f, -0.024415f, 0.030262f, 0.007105f, -0.040651f, 0.050665f, -0.026403f, -0.024415f, 0.004712f, 0.019710f, -0.015031f, 0.035013f, -0.017229f, -0.024424f, -0.012789f, 0.011581f, -0.004524f, -0.006763f, 0.003549f, 0.034873f, -0.023942f, 0.063885f, -0.025098f, -0.000916f, 0.058997f, -0.011998f, 0.010154f, -0.080942f, 0.003303f, 0.014343f, -0.018545f, 0.035547f, -0.065166f, -0.079463f, 0.029802f, -0.014209f, 0.043557f, -0.032894f, -0.031265f, 0.003390f, -0.010515f, 0.067301f, -0.008558f, -0.003246f, 0.014674f, -0.062822f, 0.003204f, -0.063488f, -0.025739f, 0.003474f, 0.014751f, -0.079231f, -0.035677f, -0.009891f, -0.004257f, 0.025397f, -0.034321f, 0.040281f, -0.017038f, 0.004349f, -0.052362f, -0.002835f, -0.046320f, 0.017131f, 0.009498f, 0.033944f, 0.043091f, + -0.016436f, 0.028100f, 0.003643f, -0.009800f, 0.014372f, 0.008665f, -0.014246f, -0.014666f, -0.025331f, -0.001380f, -0.015168f, -0.016094f, 0.005170f, -0.004169f, 0.021392f, -0.029547f, -0.005313f, -0.018764f, 0.006953f, 0.010087f, -0.010353f, -0.001854f, -0.015729f, -0.015948f, 0.017080f, 0.027951f, 0.031762f, 0.006065f, 0.001795f, -0.009135f, 0.005797f, 0.004775f, -0.012395f, -0.019816f, 0.006315f, -0.010693f, -0.014434f, 0.021125f, 0.014798f, 0.012109f, -0.020119f, -0.023456f, -0.049476f, 0.040447f, -0.035520f, -0.009495f, 0.031503f, 0.073758f, -0.021199f, 0.060558f, 0.021022f, 0.016052f, -0.028182f, 0.067036f, 0.010163f, 0.031597f, 0.002660f, -0.038381f, 0.013955f, -0.038540f, -0.039184f, 0.024940f, -0.039031f, -0.007750f, -0.009290f, 0.039996f, 0.003186f, -0.012594f, 0.012574f, 0.018146f, -0.008293f, -0.036505f, -0.008884f, 0.029197f, 0.069014f, 0.016575f, -0.039134f, 0.004922f, -0.007641f, 0.017218f, 0.020849f, 0.035710f, -0.015656f, 0.001436f, 0.022564f, 0.005863f, -0.001332f, 0.046906f, 0.041657f, 0.050403f, 0.017033f, 0.042449f, 0.005590f, 0.025704f, -0.019819f, -0.002910f, + 0.005427f, -0.038310f, 0.002811f, 0.066406f, -0.008483f, -0.013841f, 0.013733f, -0.000415f, 0.017583f, -0.038636f, 0.051759f, -0.031992f, -0.014649f, -0.008357f, 0.002549f, 0.006656f, 0.006567f, -0.056466f, 0.071818f, -0.015060f, -0.023116f, -0.007993f, 0.060975f, -0.006430f, 0.012618f, -0.047785f, -0.033711f, 0.001501f, 0.025327f, 0.023880f, 0.038966f, -0.062244f, -0.019733f, 0.060591f, -0.021659f, 0.007142f, 0.051344f, 0.012754f, 0.011177f, -0.002844f, 0.001701f, -0.019133f, -0.001593f, 0.005411f, 0.014612f, -0.008385f, 0.012156f, -0.022156f, -0.012790f, 0.001723f, -0.006457f, -0.003408f, -0.052770f, -0.040348f, 0.003288f, 0.027016f, -0.024939f, -0.042106f, -0.017461f, -0.034504f, 0.009757f, 0.001987f, -0.013445f, 0.033971f, -0.009709f, 0.014135f, 0.015300f, -0.017827f, -0.012927f, -0.002631f, 0.004074f, -0.000938f, 0.025280f, 0.000027f, 0.001570f, -0.011850f, -0.002791f, -0.018886f, 0.117807f, -0.007169f, 0.023793f, -0.001260f, -0.011871f, 0.003035f, -0.054172f, -0.023505f, -0.016523f, 0.020841f, 0.015276f, 0.026294f, 0.003223f, -0.028932f, 0.030154f, -0.024631f, 0.034730f, 0.025105f, + -0.027827f, -0.030325f, 0.003707f, 0.041935f, -0.043234f, 0.017796f, 0.020105f, -0.025150f, 0.011144f, -0.003588f, 0.015244f, -0.002320f, -0.063127f, 0.035051f, 0.021873f, -0.053688f, 0.064351f, -0.034494f, -0.008116f, -0.021526f, 0.051943f, -0.010731f, -0.044081f, -0.000535f, 0.000715f, 0.042423f, 0.043651f, 0.002426f, -0.033596f, 0.048424f, -0.007866f, 0.008156f, -0.062004f, 0.048359f, 0.019936f, 0.002459f, -0.035574f, -0.027457f, -0.003778f, 0.016494f, -0.028597f, -0.051635f, -0.021762f, 0.039881f, 0.025034f, -0.006493f, 0.065570f, 0.003390f, -0.010655f, -0.047824f, 0.057857f, -0.054308f, -0.017362f, 0.058546f, 0.018671f, 0.007115f, -0.022228f, 0.008629f, 0.058250f, 0.012377f, 0.025539f, 0.036324f, -0.095317f, -0.021448f, -0.015837f, -0.008466f, -0.039532f, -0.007586f, -0.004686f, 0.057321f, 0.015694f, 0.003326f, 0.029437f, 0.040781f, 0.028981f, -0.021101f, 0.011047f, 0.024158f, -0.004901f, 0.008970f, 0.010687f, 0.012613f, 0.008560f, 0.040508f, 0.022270f, 0.001945f, -0.011962f, -0.019145f, -0.035608f, 0.004570f, 0.000050f, 0.009000f, 0.011703f, 0.004935f, 0.061914f, -0.009123f, + 0.022403f, 0.012788f, -0.016838f, -0.049772f, -0.007936f, -0.018832f, -0.030591f, -0.033640f, 0.005711f, -0.006094f, -0.039821f, -0.000517f, 0.015203f, -0.004585f, -0.003872f, 0.013267f, -0.009790f, -0.031122f, -0.013520f, -0.048081f, 0.002433f, -0.053723f, 0.050285f, 0.076162f, 0.036727f, 0.042897f, -0.066435f, -0.061017f, -0.046283f, 0.003507f, 0.084341f, -0.016495f, 0.031886f, 0.053220f, 0.028192f, -0.031049f, 0.002617f, 0.038545f, -0.050316f, -0.043827f, -0.035868f, 0.040417f, 0.029738f, -0.054734f, -0.074916f, 0.101501f, 0.064072f, -0.074371f, 0.033891f, -0.009746f, 0.031102f, 0.002047f, -0.021418f, -0.052054f, 0.047150f, -0.002476f, -0.036980f, -0.057663f, 0.015143f, 0.011943f, -0.013567f, 0.000237f, -0.004539f, -0.029118f, -0.011562f, -0.015954f, 0.026853f, -0.050744f, 0.055212f, -0.038618f, 0.002665f, 0.084515f, -0.082158f, -0.021318f, 0.078798f, 0.004367f, 0.018909f, -0.012955f, -0.023861f, 0.023177f, -0.008492f, -0.035826f, 0.005057f, -0.079967f, 0.133839f, -0.014490f, -0.146430f, 0.054237f, 0.145518f, 0.084145f, -0.178674f, -0.053537f, 0.034410f, 0.011540f, -0.026801f, -0.042748f, + 0.022835f, 0.053331f, -0.066966f, -0.020057f, -0.117194f, -0.021746f, 0.041059f, 0.013365f, -0.035534f, -0.060348f, 0.023567f, 0.050125f, -0.000711f, -0.017395f, -0.027842f, 0.039514f, 0.024748f, 0.015164f, -0.003106f, -0.013902f, 0.005220f, 0.021374f, 0.018127f, -0.005731f, -0.046836f, -0.030936f, 0.049345f, 0.019432f, -0.025000f, -0.018745f, 0.035455f, 0.010153f, -0.004671f, -0.073145f, -0.032555f, -0.037312f, 0.040359f, 0.009340f, 0.008976f, -0.009109f, 0.001197f, 0.037348f, -0.007777f, -0.008661f, -0.033942f, 0.005018f, -0.010900f, 0.052760f, 0.011677f, -0.013984f, 0.006717f, 0.053237f, -0.007101f, -0.022824f, 0.004529f, 0.000414f, -0.002753f, -0.037840f, 0.009231f, 0.035909f, 0.086115f, -0.036457f, 0.028520f, -0.045841f, -0.119135f, 0.064056f, -0.029497f, -0.066146f, -0.044744f, -0.067602f, 0.032808f, 0.021752f, -0.089464f, 0.057309f, -0.030741f, -0.002822f, -0.000421f, -0.046810f, 0.036367f, 0.035021f, 0.032036f, -0.003490f, 0.041701f, 0.020924f, -0.024197f, 0.001763f, -0.050719f, -0.019113f, -0.044920f, -0.032295f, -0.001559f, 0.073644f, -0.061232f, -0.013691f, -0.012666f, -0.055939f, + 0.033206f, -0.063032f, 0.033101f, 0.027665f, -0.041796f, 0.033049f, -0.067602f, 0.019185f, -0.058688f, 0.038100f, -0.021563f, -0.031801f, -0.031867f, -0.048802f, -0.012373f, 0.023963f, 0.042861f, -0.049518f, 0.033502f, 0.017997f, 0.052050f, 0.062789f, 0.037298f, -0.052886f, -0.023714f, -0.099117f, -0.024290f, -0.029044f, 0.033504f, -0.115604f, -0.021201f, -0.068902f, -0.005291f, 0.068400f, 0.063934f, 0.041236f, 0.015382f, 0.092235f, 0.102054f, 0.089920f, -0.030365f, -0.040915f, 0.034959f, 0.088021f, 0.164034f, 0.011473f, 0.038899f, 0.019595f, -0.008105f, 0.029875f, -0.028812f, 0.017486f, -0.007020f, -0.000751f, -0.018345f, 0.030324f, 0.036083f, -0.012688f, -0.028685f, -0.022552f, 0.027482f, 0.011566f, 0.031079f, -0.017012f, 0.012429f, -0.006356f, -0.012883f, -0.009016f, 0.030863f, 0.059470f, 0.029178f, -0.031323f, 0.016376f, -0.011032f, 0.022009f, 0.009270f, 0.011181f, 0.028928f, -0.018248f, -0.039673f, 0.003854f, 0.029952f, 0.024313f, 0.007837f, -0.005309f, -0.013875f, -0.053508f, 0.052806f, 0.015409f, -0.012836f, -0.055670f, -0.013472f, -0.038088f, 0.018937f, 0.022055f, -0.018645f, + 0.013681f, 0.107100f, -0.063324f, 0.040056f, 0.048616f, -0.022481f, 0.004391f, 0.018670f, -0.006000f, 0.051970f, 0.002633f, 0.037639f, -0.048113f, -0.006764f, 0.041781f, 0.006928f, -0.065270f, 0.042278f, -0.026083f, -0.021196f, -0.024939f, -0.006430f, -0.024323f, 0.024790f, 0.034547f, 0.016889f, -0.006059f, -0.018098f, 0.029973f, -0.009717f, -0.047944f, 0.039311f, -0.080929f, -0.020312f, -0.016683f, -0.017703f, 0.046144f, 0.050611f, 0.090609f, -0.026496f, 0.038754f, -0.001345f, 0.017461f, 0.059517f, -0.004349f, 0.006458f, -0.039636f, -0.124722f, 0.061801f, 0.012025f, -0.060276f, -0.041178f, 0.006098f, 0.032769f, -0.005745f, -0.035234f, 0.018356f, -0.036127f, 0.047717f, 0.026759f, -0.020775f, -0.043351f, 0.086497f, 0.009669f, 0.004625f, -0.007768f, 0.012031f, 0.006276f, 0.003822f, -0.028903f, -0.061400f, 0.017172f, -0.008935f, -0.021691f, -0.056568f, -0.013747f, -0.001597f, 0.050709f, 0.020924f, -0.063450f, 0.037203f, 0.006818f, -0.002316f, -0.006852f, 0.020812f, 0.026737f, -0.005134f, -0.011676f, -0.004386f, -0.011033f, 0.009935f, 0.015993f, -0.000550f, 0.009277f, 0.017850f, -0.006289f, + 0.025711f, 0.011109f, 0.008022f, 0.013677f, -0.007009f, 0.032248f, 0.005599f, -0.006511f, 0.021094f, -0.024983f, 0.008350f, 0.014807f, -0.005752f, -0.010517f, 0.029058f, 0.041810f, -0.036909f, -0.006586f, -0.012828f, -0.012434f, 0.015128f, 0.013177f, -0.023054f, 0.013246f, 0.010690f, 0.009585f, 0.011189f, -0.020630f, 0.015319f, -0.001265f, 0.009187f, -0.025801f, -0.006375f, 0.005422f, 0.119458f, 0.060095f, 0.120200f, -0.111045f, 0.010097f, 0.056876f, -0.021736f, 0.064858f, 0.126791f, 0.068722f, 0.004564f, -0.034580f, -0.034544f, 0.005981f, 0.055251f, 0.058029f, 0.013845f, -0.000714f, -0.086606f, -0.018528f, 0.086459f, 0.027859f, -0.023443f, 0.046887f, -0.039853f, -0.057055f, -0.014992f, -0.004347f, 0.066958f, 0.086195f, 0.078473f, 0.028958f, -0.029706f, -0.047040f, -0.085674f, -0.086285f, 0.075158f, 0.030720f, 0.006627f, 0.114697f, 0.007492f, -0.035889f, -0.046671f, -0.048523f, 0.023820f, 0.048661f, 0.039701f, 0.075026f, 0.005869f, 0.053817f, -0.003071f, -0.010378f, 0.028059f, 0.049780f, 0.037347f, 0.031415f, -0.028247f, -0.011490f, -0.022178f, -0.051708f, -0.040456f, -0.075083f, + -0.024445f, 0.019357f, -0.011747f, 0.053570f, 0.065613f, -0.001674f, 0.001093f, -0.027283f, -0.047140f, 0.009205f, 0.063409f, -0.004245f, 0.035304f, 0.014659f, -0.004105f, -0.020339f, -0.008604f, 0.005135f, 0.022436f, 0.016508f, -0.016362f, -0.035860f, -0.043099f, -0.041498f, -0.015384f, 0.015973f, -0.003804f, -0.026315f, -0.012694f, -0.018453f, -0.014622f, 0.007797f, -0.001835f, 0.023494f, 0.034964f, 0.007119f, -0.041546f, -0.022215f, -0.024718f, -0.006344f, 0.028753f, 0.006204f, 0.007393f, -0.034969f, -0.032097f, -0.037696f, -0.018610f, 0.031720f, 0.022458f, 0.027295f, 0.015417f, -0.014147f, -0.016322f, 0.011222f, 0.011121f, -0.003524f, 0.007664f, -0.014801f, -0.011012f, 0.007791f, 0.006302f, 0.011035f, -0.006446f, -0.014713f, -0.006122f, -0.011421f, -0.001678f, 0.021478f, -0.063304f, -0.123043f, 0.048468f, 0.201018f, 0.204109f, 0.173028f, 0.125134f, -0.077174f, -0.088312f, -0.095143f, -0.126862f, -0.193788f, -0.156359f, -0.135551f, 0.062864f, 0.145918f, 0.108283f, 0.234586f, 0.181068f, 0.094621f, -0.034992f, -0.063048f, -0.157735f, -0.122903f, -0.121964f, -0.024774f, -0.074784f, -0.060492f, + 0.017949f, 0.033121f, 0.066275f, 0.066784f, 0.091310f, 0.090834f, 0.116884f, 0.068380f, 0.029887f, -0.016895f, -0.019889f, -0.051357f, -0.078037f, -0.093949f, -0.115138f, -0.075200f, -0.141386f, -0.093986f, -0.070762f, 0.070833f, 0.133933f, 0.144695f, 0.099888f, 0.068271f, 0.106617f, 0.081801f, 0.102320f, 0.080634f, 0.028104f, -0.037898f, -0.179503f, -0.126732f, -0.129435f, -0.200551f, -0.126019f, -0.108835f, -0.105869f, 0.038568f, 0.106269f, 0.169062f, 0.138983f, 0.198728f, 0.178119f, 0.174416f, 0.124138f, -0.067690f, -0.061506f, -0.139379f, -0.184609f, -0.203158f, -0.166851f, -0.079909f, -0.022845f, -0.042010f, 0.054888f, 0.145587f, 0.102435f, 0.069399f, 0.116552f, 0.098174f, 0.034929f, -0.022976f, -0.023394f, -0.007463f, -0.028674f, -0.078180f, -0.049314f, -0.055834f, -0.030349f, -0.024993f, -0.058439f, -0.021510f, 0.019982f, -0.019462f, 0.064490f, 0.085370f, 0.093550f, 0.099190f, 0.006063f, 0.029674f, 0.028816f, -0.008365f, -0.135845f, -0.108212f, -0.084739f, -0.075483f, -0.059623f, -0.056350f, 0.062394f, 0.093444f, 0.101352f, 0.097199f, 0.079967f, 0.055003f, 0.049328f, -0.000647f, + -0.014716f, -0.078398f, -0.106032f, -0.094779f, -0.079206f, -0.050380f, -0.032916f, 0.003933f, 0.047709f, 0.096986f, 0.072494f, 0.046259f, 0.033385f, 0.009265f, -0.000662f, 0.000159f, -0.019343f, -0.025130f, -0.020883f, -0.024553f, 0.005911f, -0.009163f, -0.033874f, 0.004580f, 0.016264f, -0.005929f, -0.008409f, -0.006916f, 0.003902f, 0.006476f, -0.008765f, 0.002020f, 0.022146f, 0.013941f, 0.006555f, 0.013723f, 0.013232f, 0.002365f, -0.002519f, -0.004112f, -0.008796f, -0.012419f, -0.009208f, -0.006645f, -0.008461f, -0.007028f, -0.003201f, -0.001252f, 0.001931f, 0.004133f, 0.004210f, 0.003843f, 0.006657f, 0.005388f, 0.005938f, 0.002477f, -0.002266f, -0.002748f, -0.000228f, -0.002567f, -0.004951f, -0.003176f, 0.002194f, 0.005103f, 0.006385f, 0.005036f, 0.004896f, 0.001218f, -0.002546f, -0.005375f, -0.008038f, -0.010830f, -0.010118f, -0.008915f, -0.005546f, -0.002374f, 0.002095f, 0.007689f, 0.013675f, 0.015272f, 0.015251f, 0.012285f, 0.007644f, 0.001687f, -0.003746f, -0.010958f, -0.014265f, -0.015488f, -0.013347f, -0.009609f, -0.004614f, 0.001057f, 0.006381f, 0.007769f, 0.009162f, 0.008066f, + 0.005831f, 0.002823f, 0.001199f, -0.000307f, -0.000813f, -0.001512f, -0.001536f, -0.001870f, -0.001008f, -0.001180f, -0.000923f, -0.001204f, -0.000518f, -0.000670f, -0.000110f, -0.000390f, 0.000129f, -0.000294f, 0.000147f, -0.000211f} + }, + { + {-0.006330f, 0.006372f, 0.005245f, 0.012101f, -0.016482f, 0.003612f, 0.010679f, 0.019825f, -0.002242f, 0.011209f, -0.000579f, 0.010185f, 0.002326f, 0.015574f, -0.000426f, -0.004932f, 0.010316f, 0.014928f, 0.013947f, 0.008387f, 0.002158f, -0.005639f, -0.004625f, 0.001479f, 0.007064f, -0.003561f, 0.003226f, 0.000968f, 0.008047f, -0.003864f, -0.000334f, 0.002115f, -0.009840f, -0.005579f, -0.002967f, -0.010086f, 0.002330f, -0.002793f, -0.000188f, -0.001307f, -0.008562f, 0.006661f, 0.009988f, -0.002014f, 0.000712f, 0.001000f, -0.001709f, 0.010776f, -0.013087f, 0.000030f, 0.005280f, 0.001509f, 0.001621f, -0.003054f, -0.010853f, -0.002685f, 0.004093f, 0.005013f, 0.005410f, -0.000915f, 0.000099f, 0.000133f, 0.002092f, -0.001768f, 0.011179f, 0.000374f, -0.001078f, -0.007328f, 0.000912f, -0.005233f, -0.004164f, 0.004501f, 0.004759f, 0.011671f, 0.000327f, 0.011476f, 0.001215f, 0.001291f, 0.000687f, -0.005984f, 0.000292f, -0.002095f, -0.003150f, 0.001287f, 0.003576f, -0.002256f, 0.001398f, -0.002336f, 0.002824f, -0.002978f, -0.001017f, -0.001505f, 0.001602f, -0.000917f, 0.001492f, -0.001304f, + 0.001773f, 0.003299f, 0.001545f, -0.001536f, -0.000500f, -0.000766f, -0.000865f, 0.000979f, 0.000620f, -0.000738f, 0.012949f, 0.020945f, 0.002825f, 0.010416f, -0.003770f, 0.006178f, 0.008111f, -0.002511f, -0.006471f, 0.010972f, 0.018979f, -0.003740f, 0.002123f, 0.007313f, -0.009061f, 0.005630f, 0.008113f, -0.016598f, 0.004680f, 0.001597f, -0.003712f, -0.000020f, -0.017244f, 0.000681f, 0.004853f, -0.008228f, 0.001536f, 0.000269f, 0.011074f, 0.007877f, -0.004135f, -0.001202f, -0.001034f, -0.011774f, -0.007886f, 0.001271f, 0.004764f, 0.001042f, 0.005291f, -0.007786f, 0.001188f, 0.003857f, 0.000817f, -0.007210f, -0.005248f, -0.001614f, 0.002517f, 0.005795f, 0.006030f, 0.003991f, 0.007037f, 0.006853f, -0.007702f, -0.002382f, 0.000326f, 0.009750f, -0.001474f, 0.006990f, -0.004598f, -0.004793f, -0.001465f, -0.008801f, -0.004040f, 0.001779f, 0.005136f, -0.007514f, 0.007347f, -0.002095f, -0.002179f, -0.001484f, -0.002960f, -0.003810f, 0.001527f, 0.005687f, 0.002138f, 0.009505f, -0.013203f, -0.010672f, -0.002337f, 0.003929f, -0.000132f, -0.002191f, 0.002028f, 0.000278f, 0.002458f, 0.004002f, + 0.006740f, 0.000102f, -0.000390f, 0.001577f, -0.000619f, -0.000115f, 0.001044f, -0.003110f, -0.001618f, -0.006414f, 0.002556f, 0.012150f, 0.017208f, 0.009960f, -0.004304f, 0.007369f, -0.004484f, -0.003038f, -0.014681f, -0.011712f, 0.005323f, 0.011247f, 0.011035f, 0.011467f, 0.002586f, 0.000612f, 0.007137f, -0.009485f, 0.009564f, 0.007716f, 0.000743f, 0.006628f, 0.017071f, 0.011586f, 0.003281f, -0.012249f, 0.000391f, 0.004112f, 0.002678f, 0.002018f, -0.013378f, 0.003210f, 0.002507f, 0.008977f, 0.009949f, -0.003115f, 0.006405f, -0.004827f, -0.005316f, 0.007216f, 0.004136f, -0.012842f, -0.012110f, -0.005324f, -0.006785f, -0.005083f, -0.005380f, -0.014835f, -0.013380f, -0.001215f, 0.004893f, -0.000085f, -0.001369f, -0.009995f, 0.001381f, 0.011866f, -0.003281f, -0.003747f, 0.004520f, -0.000022f, 0.008634f, 0.004316f, 0.004438f, -0.005534f, -0.006780f, 0.012744f, 0.005885f, -0.005097f, 0.008450f, -0.001114f, 0.006601f, -0.005530f, 0.001089f, 0.009410f, -0.003513f, -0.003044f, 0.006842f, 0.000836f, 0.002762f, 0.004043f, -0.004618f, 0.005281f, -0.002136f, 0.004328f, 0.004417f, 0.003372f, + -0.002936f, 0.001106f, -0.001429f, -0.002546f, -0.003200f, 0.000189f, 0.000457f, 0.002133f, 0.001893f, 0.000501f, -0.000098f, 0.001676f, 0.000591f, 0.001169f, -0.023712f, -0.014019f, -0.004341f, 0.004466f, -0.009752f, 0.002950f, -0.002641f, 0.006800f, -0.001621f, -0.013332f, -0.010537f, 0.009166f, 0.007569f, 0.018995f, 0.016844f, -0.002586f, 0.012199f, -0.018325f, -0.002935f, 0.014189f, 0.004328f, 0.003268f, -0.001831f, -0.006006f, -0.002743f, 0.001938f, -0.001587f, -0.000584f, 0.007243f, -0.008998f, 0.002048f, 0.003232f, -0.000168f, 0.005635f, -0.006117f, -0.005079f, 0.003307f, -0.003956f, 0.005113f, -0.010050f, 0.001714f, -0.006047f, -0.002318f, -0.006731f, -0.004968f, -0.007643f, -0.011247f, 0.006905f, -0.000020f, 0.011789f, -0.010991f, -0.009478f, -0.000023f, 0.002242f, -0.001243f, -0.002290f, 0.000837f, 0.007096f, 0.003464f, 0.001514f, -0.004802f, -0.004705f, -0.002602f, -0.008839f, 0.001461f, -0.002301f, 0.001093f, -0.000430f, -0.009438f, -0.000811f, -0.000693f, -0.010070f, 0.000338f, -0.001909f, 0.001230f, -0.001707f, -0.011138f, 0.001001f, 0.005095f, -0.002234f, 0.007462f, 0.002040f, + -0.003894f, 0.003112f, 0.007828f, 0.002551f, 0.001405f, 0.001754f, -0.001580f, 0.000963f, 0.006141f, -0.000475f, -0.000897f, 0.002238f, 0.002564f, 0.000968f, 0.002082f, 0.000436f, 0.000915f, -0.004058f, 0.000523f, -0.000317f, -0.001919f, -0.001453f, -0.001393f, -0.002062f, 0.000393f, -0.001690f, 0.008400f, -0.012831f, 0.005310f, -0.014331f, -0.002333f, 0.000632f, -0.010377f, 0.009841f, 0.007710f, -0.021240f, -0.001988f, 0.003493f, -0.001801f, -0.009329f, -0.012260f, 0.002496f, -0.006092f, -0.010397f, -0.004936f, 0.006061f, 0.005594f, 0.014954f, 0.019696f, -0.001761f, 0.017619f, -0.010767f, 0.007031f, 0.007545f, -0.001386f, 0.007432f, -0.004129f, 0.000107f, -0.000972f, -0.003650f, -0.001700f, -0.004079f, 0.014711f, -0.000867f, -0.010672f, -0.002639f, 0.007453f, 0.004480f, 0.005994f, 0.001116f, -0.004897f, 0.010583f, 0.021824f, 0.001308f, 0.002356f, 0.001228f, -0.001438f, 0.003389f, -0.001280f, 0.012335f, -0.009286f, 0.011798f, 0.008381f, -0.007557f, 0.004034f, 0.007673f, 0.005457f, -0.009048f, -0.009581f, -0.019326f, -0.002973f, -0.001857f, 0.002632f, 0.007424f, -0.001629f, 0.004823f, + -0.001454f, -0.005158f, -0.004920f, 0.009931f, -0.002083f, 0.010537f, -0.015397f, -0.006181f, 0.003779f, -0.009915f, 0.002767f, 0.010603f, 0.001209f, -0.000102f, 0.000984f, 0.002243f, 0.001665f, -0.006013f, -0.001711f, -0.000997f, 0.001082f, -0.001083f, 0.002161f, 0.002709f, 0.001619f, -0.001751f, -0.003810f, 0.004394f, 0.001918f, 0.001704f, 0.001372f, 0.001271f, 0.000541f, 0.000103f, -0.001722f, 0.001831f, 0.001091f, 0.000713f, 0.000546f, 0.001927f, 0.001522f, 0.002312f, -0.002457f, -0.001637f, -0.002921f, -0.002931f, -0.000546f, 0.002322f, -0.001604f, -0.001101f, 0.001518f, 0.000512f, 0.001189f, -0.000495f, 0.000430f, 0.005399f, 0.002697f, 0.000080f, 0.007752f, 0.021664f, 0.025993f, -0.006890f, -0.000374f, 0.005239f, -0.003673f, 0.016506f, 0.016519f, -0.010443f, 0.016201f, 0.012372f, 0.005068f, 0.007103f, 0.006744f, 0.003153f, -0.001165f, 0.000992f, 0.002384f, -0.008981f, -0.010543f, 0.002664f, -0.002776f, -0.000296f, 0.002110f, -0.009690f, 0.009865f, 0.019153f, -0.000353f, -0.011740f, 0.019133f, 0.002144f, 0.000833f, 0.007264f, -0.003060f, -0.005809f, 0.003005f, -0.007245f, + 0.003094f, 0.019140f, 0.008523f, -0.000281f, 0.007157f, 0.010344f, 0.027478f, -0.004585f, 0.012009f, -0.002469f, -0.011564f, 0.007646f, 0.000975f, -0.004062f, 0.005623f, 0.016560f, 0.004554f, 0.002843f, 0.000027f, 0.006562f, 0.024362f, 0.010684f, 0.003285f, 0.002330f, 0.006616f, -0.007058f, 0.012600f, -0.003287f, -0.023567f, 0.002800f, -0.002281f, 0.014264f, 0.017197f, 0.007222f, -0.006956f, -0.006670f, -0.005893f, -0.000944f, 0.005543f, 0.000403f, 0.003844f, 0.002341f, 0.004017f, 0.010703f, 0.004948f, -0.008643f, -0.003435f, 0.001105f, 0.003264f, 0.000471f, 0.000067f, 0.000245f, -0.004417f, 0.004895f, 0.001453f, 0.000935f, 0.000821f, 0.000936f, 0.000741f, 0.003651f, -0.001234f, 0.002645f, -0.002429f, -0.000866f, -0.003997f, 0.000798f, -0.001360f, -0.000296f, 0.000535f, 0.001731f, -0.029323f, -0.003060f, -0.012577f, -0.014369f, -0.004096f, -0.010193f, 0.000259f, 0.009134f, -0.013906f, 0.014348f, -0.030473f, 0.004482f, -0.009197f, -0.015926f, -0.021871f, 0.022741f, 0.011011f, 0.001623f, -0.019416f, -0.012364f, 0.006893f, -0.024718f, -0.017660f, 0.006063f, 0.005016f, 0.025422f, + -0.003552f, 0.002253f, 0.018449f, -0.010993f, 0.018113f, 0.006451f, 0.006458f, -0.003448f, -0.011362f, -0.001163f, 0.015027f, -0.008131f, 0.001011f, 0.019361f, -0.007317f, -0.005548f, -0.009607f, -0.011304f, -0.010181f, -0.007288f, -0.015841f, -0.001784f, 0.004356f, -0.005208f, 0.003102f, -0.004978f, -0.008269f, 0.010919f, -0.014192f, 0.008537f, -0.012116f, -0.014757f, 0.000389f, 0.012330f, 0.000460f, -0.003582f, 0.004512f, -0.009817f, -0.005343f, -0.013796f, -0.025114f, -0.011607f, 0.003169f, -0.007416f, 0.027929f, 0.011341f, -0.020109f, -0.009868f, -0.003297f, -0.007038f, 0.008712f, 0.019261f, 0.012227f, -0.009208f, 0.008494f, -0.010936f, 0.006238f, 0.001067f, 0.008508f, -0.009680f, -0.002708f, 0.000934f, -0.004694f, -0.008252f, -0.007367f, 0.001358f, -0.000866f, -0.001873f, 0.003952f, 0.001736f, 0.000260f, -0.002694f, 0.002188f, -0.000486f, -0.002570f, -0.005999f, -0.000570f, -0.003059f, 0.000092f, 0.002747f, -0.002437f, -0.006683f, -0.001230f, -0.002811f, -0.011344f, -0.001570f, -0.003519f, 0.031197f, 0.020800f, 0.021252f, -0.006016f, -0.030953f, -0.002176f, -0.016014f, 0.004194f, 0.006470f, + 0.016738f, -0.008066f, 0.007481f, -0.012926f, 0.002399f, -0.011442f, -0.028232f, -0.015700f, 0.011143f, -0.010735f, -0.022323f, -0.021566f, -0.019487f, -0.031161f, 0.004077f, -0.011139f, -0.023215f, -0.021455f, 0.003946f, 0.029324f, -0.003727f, -0.005299f, -0.009683f, -0.018339f, 0.003951f, -0.007508f, 0.002206f, -0.022793f, 0.001667f, -0.023728f, 0.003497f, -0.002249f, 0.012796f, 0.009388f, 0.010689f, 0.005030f, -0.000656f, 0.008338f, -0.005510f, 0.016736f, 0.005031f, 0.008303f, 0.005412f, -0.005927f, 0.006307f, 0.016868f, -0.002023f, 0.009274f, -0.002222f, 0.026725f, 0.003707f, 0.009833f, 0.001543f, -0.015508f, -0.011392f, 0.000202f, -0.005161f, 0.003168f, -0.003711f, 0.008639f, 0.008212f, 0.010096f, -0.004578f, 0.005619f, -0.020548f, 0.010723f, 0.030566f, -0.014961f, -0.002870f, 0.007747f, -0.017268f, -0.001515f, 0.011146f, -0.007179f, -0.000875f, -0.003947f, 0.009720f, -0.010074f, -0.002117f, 0.002334f, -0.005244f, 0.002335f, -0.001685f, 0.003707f, -0.004840f, -0.005343f, 0.005811f, -0.002832f, -0.005340f, 0.003619f, -0.001987f, -0.000182f, -0.007632f, 0.005689f, 0.002206f, -0.001597f, + -0.001100f, 0.003116f, 0.001410f, 0.003014f, 0.002606f, 0.000299f, -0.003165f, -0.006211f, -0.001538f, 0.003216f, -0.015277f, -0.044077f, -0.007364f, -0.015357f, -0.023283f, 0.012546f, -0.044386f, -0.005712f, -0.015832f, -0.008551f, 0.012730f, -0.014078f, 0.018677f, 0.016195f, 0.002503f, 0.014605f, 0.001217f, 0.007733f, -0.011630f, -0.020365f, -0.022528f, -0.012538f, -0.020655f, 0.016059f, 0.020932f, -0.000885f, -0.011157f, 0.006083f, 0.005971f, -0.007725f, 0.001456f, -0.035042f, -0.018630f, 0.016312f, -0.009031f, 0.000481f, 0.015901f, -0.001514f, 0.009798f, 0.008471f, -0.004663f, 0.009691f, -0.000216f, -0.018687f, 0.020700f, -0.014628f, 0.000896f, 0.001145f, -0.011588f, 0.007641f, 0.012294f, -0.007322f, 0.014060f, 0.001588f, -0.001220f, -0.012963f, 0.015895f, -0.000097f, -0.013090f, -0.004304f, -0.026106f, -0.010908f, -0.014959f, -0.001885f, 0.017745f, 0.005151f, -0.001826f, 0.000290f, -0.016945f, 0.003775f, 0.012805f, -0.016973f, 0.000843f, 0.025970f, -0.010828f, 0.002541f, 0.001833f, -0.018477f, -0.011248f, 0.011810f, 0.009760f, -0.030061f, 0.005914f, 0.022466f, -0.000255f, 0.002674f, + -0.000012f, 0.005409f, -0.001863f, 0.014178f, -0.003399f, -0.000598f, 0.001665f, 0.002716f, -0.006589f, 0.001623f, 0.004842f, 0.001532f, 0.008273f, 0.003089f, -0.000341f, -0.003107f, -0.006805f, -0.001929f, 0.002990f, -0.004123f, 0.002816f, -0.004228f, -0.000292f, 0.005832f, 0.002965f, -0.004129f, -0.005762f, 0.000281f, 0.000012f, 0.012422f, -0.005196f, 0.001007f, 0.006623f, 0.002740f, 0.006532f, 0.078735f, 0.017338f, -0.010164f, -0.015920f, -0.001400f, -0.005140f, 0.014054f, -0.003260f, 0.011895f, 0.022131f, -0.008877f, 0.000964f, -0.014641f, -0.010259f, 0.004846f, -0.002595f, 0.011556f, -0.022196f, -0.012816f, 0.010237f, 0.022175f, 0.014413f, -0.000597f, 0.005065f, -0.005327f, -0.013437f, 0.009673f, 0.017091f, 0.018179f, 0.021673f, -0.018018f, -0.004458f, -0.010307f, -0.022613f, -0.002768f, 0.000991f, -0.004852f, 0.010138f, 0.013671f, -0.000209f, 0.006777f, -0.004206f, -0.023786f, -0.013157f, -0.031834f, -0.032540f, -0.009393f, 0.010659f, -0.004683f, -0.014515f, 0.027169f, 0.010075f, -0.001061f, -0.025619f, -0.001121f, -0.008019f, -0.018151f, 0.000043f, -0.008286f, -0.011970f, -0.025154f, + -0.003415f, -0.009272f, -0.027881f, 0.000025f, 0.021004f, -0.014208f, -0.006938f, 0.007853f, -0.012098f, 0.004765f, -0.011989f, 0.017281f, -0.005708f, -0.016654f, -0.026073f, -0.042500f, 0.008221f, 0.007207f, 0.032323f, 0.013101f, 0.011083f, -0.000139f, 0.009697f, -0.007633f, 0.010288f, -0.000950f, 0.003522f, 0.005218f, 0.012236f, 0.005690f, 0.000342f, -0.002257f, -0.000773f, 0.004924f, 0.002913f, 0.012894f, 0.009957f, 0.006773f, 0.002049f, -0.002615f, -0.006960f, 0.003726f, 0.008209f, 0.000754f, 0.000387f, -0.001562f, -0.006170f, -0.001033f, -0.001037f, -0.002884f, -0.002287f, -0.004647f, 0.003738f, 0.005691f, -0.005465f, -0.005420f, -0.000439f, -0.000706f, 0.002846f, 0.017560f, -0.062148f, -0.035597f, 0.033137f, -0.008690f, 0.002251f, -0.017214f, 0.014535f, -0.006006f, -0.023890f, 0.011449f, 0.033511f, 0.004191f, -0.029055f, 0.008152f, -0.006211f, -0.006762f, 0.019365f, 0.019848f, -0.002533f, -0.004129f, 0.042177f, 0.009320f, -0.005880f, -0.025891f, 0.011602f, -0.037101f, -0.030312f, -0.028152f, 0.011571f, -0.005369f, -0.002836f, 0.024090f, 0.009810f, -0.024570f, -0.020309f, 0.005291f, + 0.024033f, 0.008124f, -0.002531f, 0.001318f, 0.016092f, -0.011522f, -0.025701f, 0.033767f, -0.009730f, 0.003481f, 0.013851f, 0.002084f, 0.004892f, 0.034735f, 0.000817f, 0.022121f, 0.001216f, -0.023307f, 0.003592f, 0.004962f, -0.004605f, 0.004430f, 0.016044f, -0.011787f, -0.003347f, 0.004037f, -0.045808f, 0.012208f, 0.009648f, -0.000270f, 0.011285f, 0.008607f, -0.016843f, 0.008098f, 0.063473f, 0.027183f, 0.015867f, 0.004588f, 0.015605f, -0.048609f, -0.022794f, 0.024611f, 0.001237f, -0.000214f, -0.018398f, 0.016455f, 0.020160f, 0.016681f, 0.003040f, 0.003513f, -0.006409f, 0.000289f, -0.011298f, -0.004178f, 0.009403f, -0.002033f, -0.005558f, 0.004776f, 0.000650f, 0.004586f, -0.006465f, -0.002826f, 0.002546f, -0.001195f, 0.004894f, -0.008032f, -0.002503f, 0.005782f, -0.006151f, 0.004684f, 0.001976f, 0.000637f, 0.000469f, 0.000094f, -0.004925f, 0.002647f, 0.005112f, -0.002379f, -0.002131f, -0.005552f, 0.002749f, -0.000303f, -0.041481f, 0.029071f, 0.031620f, 0.009875f, 0.017551f, -0.011841f, 0.050323f, -0.006129f, 0.019345f, 0.012827f, -0.022860f, -0.009712f, -0.010422f, 0.028866f, + -0.017069f, -0.005620f, 0.018567f, 0.015188f, -0.016775f, -0.004843f, -0.048941f, 0.008968f, -0.005222f, -0.014664f, 0.004486f, 0.001106f, 0.003859f, 0.004297f, 0.016876f, 0.000456f, 0.018463f, 0.001946f, 0.009114f, -0.004937f, -0.015621f, -0.017119f, 0.031996f, -0.011545f, -0.022790f, -0.019596f, -0.008562f, -0.010884f, 0.014004f, 0.008325f, 0.010834f, 0.013824f, 0.004429f, -0.017644f, 0.010195f, -0.028630f, -0.009083f, -0.025047f, 0.017286f, -0.030185f, -0.021289f, -0.006591f, -0.009880f, 0.008713f, 0.020357f, -0.016247f, 0.019229f, 0.031081f, 0.015755f, 0.029932f, -0.012450f, 0.040260f, 0.003910f, 0.034072f, 0.019661f, 0.004032f, -0.018090f, -0.046254f, -0.030878f, -0.025518f, -0.014149f, -0.014411f, -0.004301f, -0.021670f, 0.016360f, 0.026664f, -0.010141f, -0.020876f, -0.018604f, -0.015136f, -0.027785f, 0.017386f, 0.012967f, -0.007690f, -0.007003f, -0.011124f, 0.001652f, -0.006413f, 0.015305f, -0.000213f, 0.004085f, -0.008300f, -0.006688f, -0.011598f, -0.001872f, -0.013843f, -0.012829f, 0.013114f, -0.000725f, 0.001375f, 0.000551f, 0.004643f, -0.005117f, -0.000766f, -0.007798f, 0.000007f, + 0.000266f, -0.000613f, 0.004346f, 0.000174f, -0.006343f, -0.004574f, -0.004491f, 0.001054f, -0.006833f, -0.007943f, -0.009478f, 0.002357f, -0.002409f, 0.023253f, 0.011848f, -0.013228f, 0.039142f, 0.004426f, -0.038215f, 0.047716f, 0.003192f, -0.020326f, 0.016833f, -0.039193f, -0.007511f, -0.024955f, -0.007802f, -0.004423f, -0.007669f, -0.017842f, 0.004984f, -0.033867f, -0.013112f, -0.012217f, -0.045709f, 0.005543f, -0.033156f, -0.023563f, -0.037197f, 0.007451f, -0.028073f, -0.008477f, -0.009319f, 0.000294f, 0.014114f, -0.011411f, 0.019878f, 0.001019f, 0.026384f, -0.006163f, 0.022943f, 0.028940f, -0.034782f, -0.000532f, 0.009284f, 0.021242f, 0.000791f, 0.025543f, 0.008517f, 0.024628f, -0.000561f, -0.018840f, -0.011884f, -0.001824f, 0.015898f, -0.003685f, -0.007386f, -0.001615f, 0.029478f, 0.018630f, -0.007079f, -0.024355f, 0.008099f, 0.013356f, 0.009445f, 0.026171f, -0.035138f, -0.025962f, -0.007481f, 0.002456f, -0.009947f, 0.000265f, -0.010144f, -0.021946f, 0.061452f, -0.030409f, -0.035353f, 0.026313f, 0.015079f, 0.022858f, 0.006929f, 0.008394f, 0.004640f, 0.013358f, -0.012737f, 0.035330f, + -0.006283f, 0.008655f, -0.006939f, 0.004717f, 0.002011f, -0.001951f, 0.022420f, 0.002809f, 0.001854f, -0.022229f, 0.009937f, 0.003311f, -0.003389f, -0.018105f, -0.001986f, -0.003754f, 0.000340f, -0.005773f, 0.016091f, 0.003744f, 0.004390f, -0.013086f, 0.008778f, -0.006224f, 0.001661f, 0.007820f, -0.000488f, -0.003875f, -0.004367f, -0.011642f, 0.006594f, 0.011888f, -0.005839f, -0.001321f, -0.004386f, 0.001765f, -0.006943f, -0.015663f, -0.004933f, -0.000529f, -0.010930f, 0.011121f, -0.001172f, -0.001512f, 0.003546f, -0.010527f, -0.012141f, -0.003369f, 0.004681f, -0.007992f, -0.010644f, 0.031224f, 0.022634f, 0.036881f, -0.012424f, -0.008883f, -0.050589f, 0.058692f, 0.026597f, -0.077714f, -0.041915f, 0.025158f, 0.034461f, 0.035079f, -0.022629f, -0.018001f, 0.041991f, 0.010200f, 0.009465f, 0.029451f, 0.023431f, -0.042896f, 0.012975f, 0.018335f, -0.003453f, 0.020509f, 0.003680f, -0.005360f, 0.003982f, -0.013854f, 0.071688f, 0.019001f, 0.009134f, -0.001810f, -0.009131f, -0.004671f, -0.041033f, 0.007984f, 0.011750f, -0.009447f, -0.013616f, -0.065886f, -0.031795f, 0.013977f, 0.011271f, -0.021525f, + -0.021446f, -0.002846f, -0.031689f, 0.013150f, 0.011424f, -0.004436f, 0.012883f, 0.026177f, 0.001056f, -0.001222f, -0.008595f, -0.013788f, -0.004804f, 0.002464f, -0.048934f, -0.006357f, 0.011177f, 0.029801f, -0.052943f, 0.011822f, 0.018623f, -0.004029f, -0.025066f, -0.022279f, 0.039517f, 0.039432f, -0.006018f, -0.024441f, -0.046848f, 0.009914f, 0.018412f, 0.009883f, 0.000504f, -0.050684f, 0.021152f, 0.046324f, -0.015924f, 0.005316f, 0.014247f, -0.018926f, -0.030620f, -0.015955f, 0.004350f, -0.009329f, -0.002691f, -0.014223f, -0.012608f, -0.010371f, -0.004712f, -0.004041f, 0.005894f, -0.001042f, -0.001212f, -0.012968f, 0.005088f, -0.006062f, 0.002514f, 0.000155f, 0.003926f, 0.007952f, 0.008918f, -0.014508f, 0.005559f, -0.011205f, -0.019227f, -0.009909f, 0.002428f, -0.001881f, 0.007985f, -0.001806f, 0.005099f, 0.011209f, 0.000271f, -0.000494f, -0.010108f, -0.005461f, 0.014519f, 0.007528f, -0.006485f, -0.003776f, -0.001728f, -0.009415f, 0.023123f, -0.017020f, 0.006267f, -0.014181f, -0.012603f, 0.002215f, 0.015645f, 0.031387f, -0.057824f, -0.075344f, -0.052451f, -0.067407f, 0.058474f, -0.039040f, + 0.023499f, -0.006593f, -0.047440f, 0.008479f, -0.012932f, -0.017602f, -0.061574f, -0.056341f, -0.042150f, -0.016066f, 0.002114f, -0.032613f, -0.009525f, 0.008590f, 0.026399f, 0.002073f, -0.016562f, 0.000034f, -0.017707f, 0.025374f, -0.032057f, 0.044139f, 0.037976f, -0.009155f, -0.012212f, -0.052445f, -0.030656f, -0.031920f, 0.003733f, 0.006981f, -0.008643f, 0.042749f, 0.012093f, 0.034636f, 0.006733f, -0.004168f, -0.015859f, 0.031144f, 0.021450f, 0.009715f, -0.031477f, 0.016706f, -0.053152f, -0.006015f, -0.005752f, -0.035305f, -0.005918f, 0.000335f, 0.040430f, 0.026767f, 0.000646f, 0.018648f, -0.000874f, -0.040099f, 0.020239f, 0.005536f, 0.033220f, -0.019010f, -0.038612f, 0.022822f, -0.069281f, -0.015999f, 0.024331f, -0.010525f, -0.011153f, 0.016789f, -0.004654f, -0.013789f, 0.012658f, -0.005928f, -0.044520f, -0.039181f, -0.006609f, 0.018088f, 0.029360f, 0.041348f, 0.041440f, -0.017820f, -0.014304f, 0.008000f, 0.014919f, 0.013408f, 0.005520f, -0.018687f, 0.016087f, 0.000103f, -0.003605f, 0.001887f, 0.009912f, 0.016655f, -0.005096f, 0.002626f, 0.015786f, -0.003928f, -0.000485f, -0.016335f, + 0.007877f, -0.003752f, -0.001282f, 0.013025f, -0.002765f, -0.006188f, 0.005795f, -0.018569f, -0.006935f, 0.018341f, 0.005170f, 0.005757f, -0.006741f, -0.004629f, -0.002909f, -0.014894f, -0.002081f, -0.008441f, 0.010923f, -0.032046f, 0.000379f, 0.023528f, -0.075816f, -0.006564f, -0.048430f, 0.003413f, -0.035781f, 0.032629f, -0.025677f, -0.002215f, 0.005900f, 0.012479f, 0.038353f, 0.013479f, -0.017970f, 0.042355f, 0.012640f, -0.070799f, 0.011371f, -0.042286f, -0.003405f, 0.008629f, -0.006326f, 0.035675f, -0.010775f, 0.006888f, 0.008572f, 0.003596f, -0.023187f, 0.036213f, -0.020996f, -0.001461f, -0.042084f, 0.000472f, 0.006782f, -0.006098f, -0.014992f, -0.018653f, -0.022114f, 0.054658f, 0.001886f, 0.028553f, -0.048493f, 0.005960f, -0.000875f, 0.017074f, 0.028516f, -0.032638f, 0.058638f, 0.085321f, -0.004125f, 0.008703f, -0.029851f, 0.014090f, 0.019497f, -0.015865f, 0.003991f, 0.016482f, 0.032681f, -0.000564f, 0.001714f, -0.009698f, -0.028851f, -0.042502f, 0.021697f, -0.031750f, -0.013840f, -0.020624f, 0.009133f, 0.029466f, 0.025777f, -0.004644f, 0.009561f, -0.057870f, 0.038378f, -0.006689f, + 0.008209f, -0.016648f, 0.037503f, -0.051890f, 0.062315f, 0.045963f, 0.051893f, -0.020554f, -0.001417f, -0.050855f, -0.028006f, -0.018616f, 0.016711f, 0.014741f, -0.042665f, -0.030708f, 0.001028f, -0.010376f, -0.031164f, 0.000334f, -0.021615f, -0.025052f, -0.009684f, -0.003402f, 0.001819f, -0.016428f, 0.002873f, 0.006086f, 0.025617f, 0.023449f, -0.003712f, 0.022126f, -0.010822f, -0.026742f, -0.015133f, -0.005432f, -0.013792f, -0.001713f, -0.010273f, 0.015726f, 0.004552f, 0.059643f, 0.007753f, -0.020060f, -0.007088f, 0.005661f, -0.031048f, -0.019004f, 0.007319f, 0.001575f, -0.008075f, 0.003421f, -0.000015f, -0.033513f, -0.003573f, 0.022957f, -0.016709f, 0.024074f, 0.095284f, 0.026423f, 0.069466f, 0.021354f, -0.071147f, 0.028221f, 0.020561f, -0.024506f, 0.005480f, 0.045746f, 0.002650f, 0.043760f, 0.039889f, -0.046682f, 0.025956f, -0.046701f, -0.030562f, -0.004974f, 0.093264f, 0.027890f, -0.041264f, 0.038905f, 0.026014f, -0.051617f, -0.021946f, -0.004087f, 0.052445f, 0.007068f, -0.046897f, -0.027293f, -0.000919f, -0.013593f, 0.029367f, 0.040960f, -0.014461f, 0.035956f, -0.022977f, -0.032448f, + -0.000533f, 0.074700f, 0.007572f, -0.043816f, 0.025163f, -0.002615f, -0.003730f, 0.020492f, -0.048496f, -0.042982f, -0.039689f, 0.028926f, -0.025793f, 0.008939f, 0.013136f, 0.044435f, 0.022850f, 0.045698f, 0.005515f, -0.002573f, 0.038323f, 0.068708f, 0.041765f, -0.069097f, 0.002014f, 0.006094f, -0.011014f, 0.012654f, 0.019607f, -0.053487f, -0.007380f, 0.009920f, 0.009768f, -0.063596f, -0.059143f, -0.034059f, -0.035699f, 0.062030f, 0.023755f, 0.002348f, 0.028217f, -0.051619f, 0.021684f, 0.013589f, 0.009941f, -0.005067f, -0.011084f, 0.042692f, 0.026592f, -0.017847f, 0.007995f, -0.013593f, 0.028829f, -0.008687f, 0.002583f, 0.005386f, 0.004786f, 0.020500f, -0.002734f, -0.034715f, -0.000839f, 0.005871f, 0.009565f, 0.017044f, -0.004170f, 0.001038f, 0.013757f, -0.027028f, -0.015104f, -0.002994f, -0.047602f, -0.007926f, 0.013957f, -0.004100f, 0.005821f, 0.027056f, -0.003342f, -0.019770f, 0.004713f, 0.006156f, 0.018525f, 0.020858f, -0.020028f, -0.013270f, -0.000767f, -0.018070f, -0.010812f, -0.034145f, -0.039394f, 0.010568f, 0.001257f, -0.018573f, -0.014480f, -0.018947f, -0.035801f, 0.026766f, + -0.071737f, 0.051877f, 0.058368f, 0.015937f, 0.063549f, -0.065079f, -0.031544f, -0.017727f, -0.093053f, 0.052399f, 0.005481f, 0.032386f, 0.043004f, 0.041696f, 0.003456f, -0.001445f, 0.042764f, -0.006855f, -0.050270f, -0.052555f, 0.031985f, -0.059359f, 0.058070f, -0.016700f, 0.012930f, 0.057186f, 0.051922f, -0.026094f, 0.078935f, -0.045696f, 0.005365f, -0.047506f, 0.007943f, -0.016286f, 0.031255f, 0.010453f, -0.033357f, 0.030115f, 0.046172f, 0.067334f, -0.038667f, 0.014361f, 0.041680f, -0.056899f, 0.002934f, -0.022893f, -0.081889f, -0.035410f, 0.022271f, -0.045188f, 0.016413f, -0.037936f, -0.000578f, 0.055332f, -0.025927f, 0.023430f, 0.064136f, 0.045537f, 0.017427f, 0.084799f, -0.131741f, -0.024904f, 0.044479f, -0.005094f, 0.026084f, -0.040910f, -0.071005f, 0.086732f, -0.000851f, -0.043681f, 0.019121f, 0.054898f, 0.136604f, 0.051595f, -0.102579f, -0.056201f, 0.035523f, 0.038118f, 0.016957f, -0.071911f, -0.005825f, 0.015811f, -0.021777f, 0.048616f, 0.017847f, 0.031051f, 0.037388f, 0.027738f, -0.018407f, 0.021432f, -0.056660f, 0.008275f, 0.031036f, -0.003629f, -0.029819f, 0.017761f, + -0.018002f, 0.030358f, 0.034026f, -0.014293f, -0.027378f, -0.007474f, 0.062390f, -0.011027f, -0.006720f, -0.024197f, 0.028514f, -0.024027f, -0.014296f, 0.017922f, -0.010998f, 0.058319f, -0.003893f, -0.014398f, 0.059173f, -0.005205f, 0.014255f, 0.035930f, -0.002161f, -0.003034f, 0.004015f, 0.005364f, -0.026990f, 0.012561f, 0.002101f, -0.039961f, 0.027781f, -0.012379f, 0.052156f, -0.028057f, 0.016125f, 0.004853f, 0.069744f, -0.061254f, -0.005536f, -0.029232f, -0.036304f, 0.055980f, -0.021705f, 0.073489f, -0.007220f, -0.056510f, 0.088114f, 0.127387f, -0.018074f, -0.040510f, -0.061379f, 0.014762f, 0.067728f, 0.013456f, -0.014120f, -0.042008f, 0.010160f, 0.010140f, -0.009185f, 0.010617f, -0.005851f, -0.020528f, -0.020973f, 0.019695f, 0.027979f, -0.001918f, 0.037764f, -0.035989f, 0.077251f, 0.058275f, 0.033687f, -0.002559f, 0.004816f, 0.011227f, -0.040515f, -0.035413f, -0.039251f, -0.020496f, -0.010548f, 0.024967f, 0.021973f, 0.042100f, -0.019880f, -0.004677f, -0.017568f, 0.047876f, 0.093171f, -0.021588f, -0.059368f, -0.038106f, -0.002069f, -0.080489f, 0.063236f, -0.109444f, 0.032073f, 0.046914f, + 0.048210f, -0.047477f, 0.011588f, 0.048859f, -0.110759f, -0.052159f, 0.023269f, -0.011347f, -0.055263f, -0.048758f, -0.005901f, -0.025332f, 0.083176f, 0.035921f, -0.029789f, -0.027409f, -0.045398f, 0.127156f, 0.027757f, 0.066671f, -0.004208f, 0.019832f, 0.024506f, 0.028921f, -0.040864f, -0.004780f, 0.053201f, 0.036802f, 0.022303f, -0.016833f, -0.021958f, 0.000566f, 0.017036f, 0.024838f, 0.017106f, -0.032102f, 0.005323f, 0.000936f, 0.009137f, 0.024155f, 0.024300f, -0.033606f, 0.016633f, -0.020464f, -0.025167f, 0.003357f, 0.027487f, 0.011532f, -0.015399f, 0.004347f, -0.001587f, -0.004214f, -0.013040f, 0.051277f, -0.014240f, 0.000843f, -0.029536f, 0.007826f, -0.010460f, 0.034088f, 0.011537f, -0.006398f, -0.017076f, 0.019732f, 0.016508f, -0.022503f, 0.002394f, -0.037102f, -0.014135f, 0.009791f, 0.016411f, 0.022241f, 0.000588f, 0.023274f, -0.004574f, 0.004533f, 0.011931f, -0.046923f, 0.013501f, 0.074324f, 0.001528f, -0.024140f, 0.060727f, 0.044712f, -0.013440f, -0.038720f, -0.060482f, 0.012167f, 0.116888f, 0.026586f, 0.059604f, -0.004549f, 0.004592f, -0.004015f, -0.014490f, 0.000738f, + 0.004736f, 0.029214f, 0.008757f, -0.022110f, 0.018923f, -0.019264f, -0.022632f, -0.024155f, -0.000011f, 0.024310f, 0.004496f, 0.019576f, 0.019627f, 0.017061f, -0.017141f, -0.028476f, 0.008654f, -0.019524f, -0.051141f, -0.014291f, 0.010891f, -0.016960f, 0.058496f, -0.060292f, 0.049059f, -0.015077f, -0.000181f, 0.074070f, -0.012061f, -0.001371f, 0.095363f, -0.014099f, -0.039558f, 0.007671f, -0.033964f, -0.006979f, -0.032088f, 0.107421f, -0.030717f, 0.026364f, -0.026160f, -0.010919f, -0.015128f, 0.018322f, -0.027360f, -0.064907f, 0.028437f, -0.006949f, -0.073095f, 0.038566f, -0.019483f, 0.040988f, 0.090794f, -0.045168f, -0.001409f, -0.004148f, -0.013913f, -0.048648f, -0.008980f, 0.045580f, 0.017694f, 0.028173f, -0.041773f, 0.012818f, 0.007009f, -0.039491f, -0.011221f, 0.009440f, 0.020278f, 0.026205f, 0.001826f, 0.005429f, 0.016488f, -0.003489f, -0.020171f, 0.029475f, -0.011677f, -0.008269f, 0.026120f, 0.004070f, -0.007489f, 0.039765f, -0.002831f, -0.002483f, 0.000135f, 0.013311f, -0.011969f, 0.020306f, -0.015469f, -0.007184f, -0.012246f, 0.010792f, -0.000469f, -0.000970f, 0.005571f, 0.018696f, + -0.021790f, 0.005167f, -0.003014f, 0.013542f, 0.003808f, -0.003720f, 0.022304f, -0.013180f, 0.012016f, -0.003406f, 0.006578f, 0.001996f, 0.016725f, -0.001991f, -0.025612f, -0.000347f, 0.122883f, 0.061808f, 0.128911f, -0.072250f, -0.018217f, 0.042115f, -0.039728f, 0.030414f, 0.132617f, 0.031075f, 0.019581f, -0.035111f, -0.032391f, 0.037651f, -0.019544f, 0.053341f, -0.008304f, -0.012415f, -0.015042f, -0.076138f, 0.018799f, 0.091200f, -0.047744f, 0.055102f, 0.048708f, -0.031058f, -0.008789f, 0.037892f, -0.060171f, 0.030177f, -0.003757f, 0.045684f, 0.016058f, -0.038076f, -0.011678f, -0.076489f, -0.038618f, 0.035730f, 0.027520f, 0.059287f, 0.093216f, 0.009813f, 0.002056f, -0.080291f, -0.048424f, -0.047970f, -0.038852f, 0.020942f, -0.032124f, -0.009422f, -0.006906f, 0.023970f, -0.060658f, -0.009945f, 0.032354f, 0.016332f, 0.051151f, -0.006806f, -0.023562f, 0.050218f, -0.008464f, 0.030771f, -0.038055f, -0.023389f, -0.005338f, -0.012950f, 0.025305f, 0.036546f, 0.052347f, 0.014585f, 0.004926f, -0.035707f, -0.009378f, -0.018329f, 0.043959f, 0.000474f, 0.065546f, 0.011275f, 0.049544f, -0.047521f, + -0.016348f, -0.000331f, -0.000471f, 0.035386f, -0.004930f, -0.017580f, -0.008868f, 0.008704f, 0.003159f, 0.009217f, 0.017070f, 0.014648f, -0.008271f, -0.010560f, 0.001394f, -0.006232f, 0.014519f, 0.014764f, 0.004183f, -0.012298f, 0.001272f, -0.016131f, -0.006037f, -0.003505f, 0.028627f, 0.010034f, -0.002891f, 0.007308f, -0.017907f, -0.021992f, -0.014153f, 0.007037f, 0.016068f, -0.013073f, -0.000530f, 0.000293f, 0.012187f, 0.006412f, -0.000965f, 0.012235f, 0.002693f, -0.000547f, -0.011216f, 0.005848f, 0.004318f, -0.004815f, 0.002051f, 0.003756f, -0.016619f, -0.033011f, -0.126440f, 0.003932f, 0.201732f, 0.183187f, 0.171009f, 0.073408f, -0.073569f, -0.100412f, -0.100873f, -0.088956f, -0.165167f, -0.116821f, -0.115164f, 0.089210f, 0.135423f, 0.111646f, 0.176449f, 0.147971f, 0.030614f, -0.006220f, -0.064016f, -0.122841f, -0.074329f, -0.129111f, -0.071099f, -0.042812f, 0.000065f, -0.016730f, 0.031916f, 0.056292f, 0.094001f, 0.060142f, 0.098798f, 0.076285f, 0.078371f, 0.006738f, -0.065666f, -0.029038f, 0.001644f, -0.070475f, -0.094482f, -0.121476f, -0.120605f, -0.084533f, -0.012595f, 0.060140f, + 0.022928f, 0.087233f, 0.060696f, 0.099410f, 0.087401f, 0.096411f, 0.110581f, 0.060396f, -0.009143f, -0.017386f, -0.073197f, -0.058847f, -0.196616f, -0.156243f, -0.126271f, -0.097661f, 0.010842f, -0.042318f, 0.002186f, 0.134445f, 0.164743f, 0.226764f, 0.142452f, 0.086558f, 0.057925f, 0.014219f, -0.087263f, -0.078880f, -0.121420f, -0.155648f, -0.132899f, -0.122862f, -0.058514f, 0.009421f, 0.061934f, 0.103339f, 0.100925f, 0.086939f, 0.053895f, 0.058524f, 0.024305f, 0.016158f, -0.003396f, -0.047465f, -0.042414f, -0.037661f, -0.043148f, -0.022118f, -0.048154f, -0.033486f, 0.011174f, 0.004598f, -0.028244f, 0.015557f, 0.038588f, 0.022790f, 0.044112f, 0.070215f, 0.071904f, 0.032517f, -0.045405f, -0.018853f, -0.006863f, -0.090888f, -0.097018f, -0.083565f, -0.035680f, 0.026627f, 0.040715f, 0.034974f, 0.057331f, 0.066018f, 0.080225f, 0.054141f, 0.032483f, -0.011849f, -0.054733f, -0.054525f, -0.061914f, -0.082062f, -0.059204f, -0.032004f, 0.027674f, 0.045372f, 0.028503f, 0.018180f, 0.051826f, 0.035905f, 0.020974f, 0.005514f, -0.008307f, -0.016183f, 0.001229f, -0.019537f, -0.024365f, -0.008240f, + 0.007601f, -0.013362f, -0.010867f, 0.002800f, 0.010384f, 0.001938f, -0.005716f, -0.006624f, 0.007725f, 0.000528f, -0.004535f, -0.007924f, 0.002537f, 0.011730f, 0.013755f, 0.002511f, 0.011811f, 0.011176f, 0.005682f, -0.003101f, -0.002882f, -0.009451f, -0.009147f, -0.013993f, -0.007856f, -0.009087f, -0.002446f, 0.001209f, 0.002521f, -0.000868f, 0.005543f, 0.007114f, 0.010682f, -0.002811f, -0.001262f, 0.003656f, 0.005509f, -0.004479f, -0.000405f, -0.001436f, 0.000678f, 0.002453f, 0.007956f, -0.000512f, 0.002495f, 0.001437f, 0.001779f, -0.004919f, -0.007205f, -0.012320f, -0.007593f, -0.009847f, -0.007311f, -0.007932f, 0.002379f, 0.006343f, 0.011853f, 0.012284f, 0.018766f, 0.014764f, 0.013207f, 0.005101f, 0.000855f, -0.009228f, -0.011869f, -0.017329f, -0.015035f, -0.016476f, -0.009521f, -0.005777f, 0.001562f, 0.003521f, 0.011837f, 0.010048f, 0.012976f, 0.010339f, 0.009750f, 0.001793f, 0.001690f, -0.003649f, -0.003577f, -0.008131f, -0.004818f, -0.005933f, -0.001545f, -0.003625f, 0.000224f, -0.001583f, 0.002120f, -0.000452f, 0.002556f, -0.000484f, 0.002217f, -0.000740f, 0.002009f, -0.001098f, + 0.001566f}, + {0.001985f, -0.002290f, 0.008216f, 0.009365f, 0.004937f, -0.003540f, -0.014118f, -0.012836f, 0.004614f, 0.007461f, -0.002794f, 0.013881f, -0.002738f, 0.008305f, -0.009881f, -0.008602f, 0.003715f, 0.000401f, -0.002611f, 0.003712f, 0.008901f, -0.003843f, 0.001182f, -0.005065f, -0.000574f, 0.000536f, 0.003611f, 0.003478f, 0.004541f, 0.000822f, 0.002679f, 0.010297f, -0.004013f, -0.004732f, -0.005233f, -0.009216f, 0.002607f, -0.001891f, 0.016904f, 0.003358f, -0.001339f, 0.001396f, 0.010232f, -0.000890f, -0.002305f, -0.002564f, -0.006098f, -0.001046f, 0.007854f, -0.001155f, 0.003222f, 0.008066f, -0.002573f, -0.000513f, -0.012934f, -0.007504f, -0.011800f, -0.002234f, -0.003470f, 0.001797f, 0.000581f, 0.001756f, 0.004128f, -0.002751f, 0.001964f, 0.000195f, 0.000978f, 0.001854f, -0.004344f, 0.004118f, -0.001447f, -0.004815f, -0.000679f, -0.004856f, -0.001559f, 0.000526f, -0.007730f, 0.002099f, 0.000289f, 0.005980f, 0.000562f, -0.000036f, -0.003583f, 0.000859f, 0.005835f, 0.002950f, -0.001526f, 0.000724f, 0.001253f, 0.001503f, 0.004438f, 0.000607f, 0.000223f, -0.001017f, -0.000734f, 0.000522f, + 0.000121f, -0.000391f, 0.002912f, 0.001689f, 0.001707f, 0.001326f, 0.000870f, 0.000453f, 0.000841f, 0.001665f, 0.009557f, 0.022539f, 0.008903f, 0.005333f, 0.006266f, -0.013245f, -0.001553f, 0.005716f, -0.001791f, 0.002236f, -0.012081f, 0.011881f, 0.016097f, 0.002776f, 0.007193f, -0.003389f, -0.009424f, -0.014605f, -0.015988f, -0.010632f, 0.012680f, -0.011965f, -0.007599f, -0.010126f, 0.003252f, 0.008422f, 0.001596f, 0.001142f, 0.004713f, -0.000477f, 0.002980f, 0.010379f, -0.001452f, 0.008629f, -0.008213f, 0.007873f, 0.005484f, 0.005006f, -0.004324f, -0.013423f, -0.002851f, 0.007686f, 0.004558f, -0.003752f, -0.000443f, 0.002659f, -0.000561f, -0.006477f, -0.001351f, 0.005492f, -0.001877f, 0.000609f, -0.003192f, -0.000710f, 0.000407f, 0.001835f, 0.009488f, 0.003964f, -0.004850f, 0.000819f, 0.000793f, -0.003220f, 0.001738f, -0.004689f, -0.000540f, 0.007689f, 0.002512f, 0.008627f, -0.006154f, -0.005291f, -0.003155f, -0.001365f, 0.004402f, 0.009780f, -0.005632f, -0.007078f, 0.008430f, -0.000792f, -0.000152f, 0.000291f, 0.002916f, 0.002080f, 0.007087f, -0.001993f, 0.003310f, -0.004316f, + -0.004029f, 0.000317f, 0.001925f, -0.000299f, 0.000156f, 0.001625f, 0.001783f, 0.001380f, -0.003674f, 0.004124f, -0.000871f, 0.006618f, 0.002800f, -0.007406f, -0.006999f, -0.007937f, -0.001249f, -0.006477f, -0.013667f, -0.013005f, 0.013435f, -0.000283f, 0.002829f, -0.000089f, 0.008184f, -0.012095f, 0.017989f, 0.015987f, 0.000828f, 0.000864f, 0.000025f, 0.000487f, -0.001776f, 0.006268f, 0.004868f, 0.000408f, -0.010238f, 0.004450f, -0.003176f, 0.004936f, -0.001426f, 0.010923f, -0.002541f, -0.006337f, -0.002876f, -0.001700f, 0.004044f, -0.000056f, 0.006747f, -0.010819f, 0.005842f, 0.001902f, -0.006011f, 0.017059f, -0.002707f, -0.002428f, -0.000357f, -0.000254f, -0.004493f, -0.001439f, 0.009100f, 0.007461f, -0.015976f, -0.007524f, 0.008124f, 0.002352f, -0.003820f, 0.013914f, 0.000510f, 0.003129f, 0.013688f, 0.005665f, 0.010747f, 0.003049f, -0.004125f, -0.005568f, -0.010750f, -0.010405f, 0.001516f, 0.005557f, 0.013321f, 0.000520f, -0.005429f, -0.006784f, 0.002320f, -0.000112f, -0.003719f, 0.004335f, -0.001500f, -0.003406f, 0.003119f, 0.007231f, 0.002342f, -0.003608f, 0.003621f, 0.003772f, + 0.004717f, 0.003037f, 0.000242f, 0.000462f, -0.004470f, -0.000929f, -0.000059f, 0.002304f, 0.001935f, 0.003689f, 0.003559f, 0.002966f, 0.001125f, -0.000279f, -0.018242f, -0.006347f, -0.008879f, 0.008290f, -0.006067f, 0.005388f, -0.006559f, -0.002700f, 0.015456f, 0.007568f, -0.010272f, 0.004692f, 0.014742f, 0.002172f, -0.005178f, -0.010347f, -0.012450f, -0.008520f, -0.012518f, 0.008317f, 0.001882f, 0.004583f, -0.002410f, -0.005651f, -0.005982f, -0.011009f, 0.000565f, -0.000329f, 0.002610f, -0.002674f, -0.010032f, 0.000177f, 0.010698f, -0.002358f, 0.000115f, -0.005320f, -0.010684f, -0.015782f, -0.001369f, 0.011401f, 0.004129f, 0.001215f, -0.005366f, 0.001475f, -0.008581f, -0.002789f, -0.006458f, 0.000840f, 0.001448f, -0.009741f, 0.011010f, -0.006184f, 0.014011f, 0.005325f, 0.001323f, -0.006349f, -0.003353f, 0.003626f, -0.000813f, 0.003433f, 0.007518f, 0.001554f, 0.002976f, -0.008307f, 0.004910f, -0.004162f, 0.012880f, 0.015990f, 0.007314f, 0.010756f, 0.004986f, -0.001609f, -0.011207f, -0.007202f, 0.000915f, 0.008282f, 0.008309f, -0.006623f, 0.000864f, 0.007874f, -0.010265f, 0.010161f, + 0.000641f, -0.005162f, 0.003330f, -0.002146f, -0.000499f, -0.005743f, 0.001126f, 0.001675f, 0.000989f, -0.004599f, 0.001220f, -0.003238f, -0.004359f, -0.001479f, 0.000300f, 0.001962f, -0.002847f, 0.000744f, -0.001239f, -0.003990f, 0.000424f, 0.003369f, 0.001386f, -0.002842f, 0.001861f, -0.002126f, 0.006109f, -0.014725f, 0.001938f, -0.015747f, -0.000066f, 0.002407f, 0.001466f, 0.007094f, 0.000712f, 0.001120f, 0.027844f, -0.003499f, -0.012302f, -0.013272f, 0.013982f, 0.009362f, -0.010558f, 0.002542f, -0.011776f, -0.005054f, 0.000385f, 0.013308f, -0.016523f, 0.004803f, -0.000656f, 0.002620f, -0.001273f, 0.016896f, -0.008759f, 0.004754f, -0.002661f, -0.004492f, 0.002554f, -0.000828f, 0.005052f, -0.005192f, -0.004823f, -0.014326f, 0.002224f, -0.004771f, -0.003101f, 0.001114f, -0.005089f, 0.004200f, -0.008095f, -0.004825f, -0.014227f, -0.000450f, -0.012635f, -0.005345f, -0.015024f, 0.011121f, 0.002236f, -0.004623f, 0.009769f, -0.011389f, -0.000086f, -0.021680f, -0.001195f, 0.007463f, -0.000621f, 0.006395f, 0.013750f, -0.004862f, -0.001971f, 0.017219f, 0.007245f, 0.006633f, 0.010497f, -0.005474f, + -0.015971f, -0.001715f, -0.009576f, 0.006940f, 0.015844f, -0.002883f, 0.004624f, 0.008427f, 0.007078f, -0.000869f, -0.001369f, 0.001943f, 0.000270f, -0.002960f, 0.004243f, 0.003810f, -0.006646f, 0.002177f, 0.005551f, -0.002829f, -0.002049f, -0.009844f, -0.002312f, -0.004155f, -0.001391f, -0.004310f, 0.000832f, -0.001062f, 0.000738f, -0.000464f, 0.000638f, 0.002514f, -0.002924f, 0.001005f, -0.001219f, -0.002972f, -0.000427f, -0.000523f, -0.000926f, 0.000199f, 0.001654f, 0.002766f, -0.002773f, 0.000943f, -0.002352f, 0.000392f, -0.000300f, -0.003104f, -0.001254f, -0.002375f, -0.000471f, -0.003763f, 0.000886f, 0.000184f, -0.002150f, 0.008012f, 0.008752f, 0.003364f, -0.005498f, 0.003996f, 0.002195f, 0.017085f, -0.002707f, -0.003494f, -0.022976f, -0.006313f, 0.017059f, 0.016922f, 0.010670f, 0.008649f, 0.024338f, 0.001656f, -0.029325f, -0.007344f, -0.004984f, -0.006930f, 0.015456f, -0.002324f, -0.005779f, 0.018299f, 0.002723f, -0.007340f, -0.002711f, 0.007394f, -0.006557f, -0.002399f, 0.002104f, -0.002173f, -0.010286f, -0.004467f, -0.000589f, -0.009685f, -0.004616f, -0.003981f, 0.006755f, -0.004467f, + 0.013116f, 0.013007f, 0.001142f, 0.012380f, 0.008473f, -0.005371f, -0.001987f, -0.004039f, -0.019088f, 0.002290f, 0.003818f, -0.017903f, -0.002694f, -0.004962f, 0.006368f, 0.016660f, 0.002415f, -0.016575f, 0.002363f, -0.006290f, -0.011372f, 0.009295f, -0.002731f, -0.011823f, 0.005347f, 0.004780f, 0.013162f, -0.000891f, -0.001725f, 0.009929f, 0.011461f, 0.012864f, -0.013112f, 0.009374f, -0.001739f, -0.002041f, 0.003355f, 0.013877f, -0.000681f, -0.003484f, 0.004273f, 0.002264f, -0.011681f, -0.001357f, 0.015903f, 0.003699f, -0.001076f, -0.001823f, -0.007252f, 0.005322f, -0.002689f, -0.003094f, 0.000505f, -0.000290f, 0.003660f, -0.000059f, -0.004982f, -0.003368f, 0.006626f, -0.000639f, 0.002606f, -0.002812f, 0.003204f, -0.002288f, -0.001858f, -0.002260f, 0.001673f, 0.003740f, -0.001743f, 0.011708f, -0.029928f, 0.012483f, -0.003302f, -0.006766f, -0.006178f, 0.005180f, -0.002875f, -0.017666f, -0.018910f, 0.002362f, 0.029409f, 0.008173f, -0.021451f, 0.004895f, 0.017441f, -0.012505f, 0.002240f, -0.003110f, 0.010391f, -0.000002f, 0.009589f, 0.025822f, 0.018733f, 0.011779f, -0.000459f, -0.002058f, + -0.011925f, -0.012682f, 0.005058f, -0.033293f, -0.005293f, 0.015893f, 0.001755f, -0.001610f, -0.015995f, -0.005619f, -0.000693f, -0.000645f, -0.007777f, -0.016442f, 0.018507f, -0.006317f, -0.004068f, -0.002902f, -0.015315f, -0.017133f, -0.000547f, -0.008316f, 0.001192f, 0.008284f, 0.006273f, 0.007025f, -0.013667f, -0.003461f, -0.006714f, -0.004182f, 0.021981f, -0.002228f, -0.010033f, 0.000798f, 0.028191f, -0.014946f, 0.004743f, 0.020842f, 0.000653f, -0.004670f, -0.010451f, 0.006410f, 0.001207f, 0.015040f, -0.008027f, 0.012743f, 0.010276f, 0.019673f, 0.009489f, 0.014761f, 0.001570f, -0.009499f, 0.002082f, -0.000293f, -0.005518f, 0.008963f, 0.012637f, -0.010360f, 0.006910f, 0.003880f, -0.009384f, 0.001342f, 0.003370f, 0.002746f, 0.003450f, -0.005268f, 0.003084f, -0.005783f, -0.001744f, -0.001519f, 0.000449f, 0.001215f, 0.002573f, 0.003336f, -0.000627f, 0.004944f, -0.000318f, -0.002040f, 0.001717f, 0.003331f, -0.001044f, 0.002069f, -0.004987f, 0.002119f, -0.001590f, 0.003302f, -0.003658f, 0.017256f, 0.024580f, 0.015137f, 0.002436f, -0.005220f, -0.009308f, -0.020411f, -0.006008f, 0.013578f, + -0.027939f, -0.011366f, 0.025298f, -0.035105f, -0.006446f, 0.019718f, 0.024606f, -0.002482f, -0.024878f, 0.003487f, -0.009573f, 0.033212f, 0.014616f, -0.022731f, -0.014753f, -0.003458f, -0.014148f, -0.028622f, -0.014438f, -0.012677f, -0.010472f, -0.023173f, 0.011582f, 0.004163f, 0.014240f, -0.008798f, -0.004385f, -0.020382f, -0.002193f, -0.017681f, 0.001743f, -0.011741f, 0.002505f, 0.006233f, -0.027465f, -0.008948f, -0.010522f, -0.007227f, 0.005789f, 0.005876f, -0.008843f, 0.027005f, -0.001858f, -0.007019f, -0.005170f, 0.002638f, -0.006444f, -0.002195f, 0.009923f, 0.008582f, 0.011121f, 0.014832f, 0.013931f, 0.001143f, 0.009097f, -0.004463f, 0.020926f, 0.022538f, -0.011436f, -0.005859f, 0.013697f, -0.000368f, -0.034256f, 0.001599f, -0.017455f, 0.010611f, 0.010678f, 0.019332f, -0.014766f, 0.008244f, -0.020673f, -0.001973f, 0.011626f, -0.004994f, 0.018226f, -0.004756f, -0.002355f, 0.003708f, 0.001084f, 0.002598f, -0.001335f, 0.001103f, 0.007682f, -0.005761f, -0.001598f, 0.007522f, -0.001275f, 0.005911f, -0.008898f, -0.007609f, 0.005046f, -0.001206f, 0.001500f, 0.000837f, -0.001166f, 0.001372f, + -0.005370f, -0.001353f, -0.001031f, -0.002265f, -0.003668f, -0.001215f, 0.002671f, 0.003368f, -0.000283f, -0.003546f, -0.019057f, -0.022769f, -0.011346f, -0.021991f, -0.031698f, 0.022473f, 0.002085f, 0.012637f, -0.017572f, -0.018017f, -0.025160f, -0.016798f, 0.007610f, -0.018427f, -0.016794f, 0.022858f, -0.005804f, 0.001215f, 0.005378f, 0.013124f, -0.010202f, -0.007503f, 0.003636f, -0.005977f, 0.003440f, -0.001002f, -0.011321f, -0.021308f, -0.033703f, 0.011257f, -0.024236f, -0.021972f, 0.001062f, -0.005676f, -0.001651f, -0.012297f, 0.005533f, 0.006563f, -0.027484f, -0.000438f, -0.006109f, -0.010559f, -0.015320f, 0.008821f, 0.001761f, 0.027536f, 0.003175f, -0.015193f, -0.001042f, 0.002711f, 0.011204f, 0.004896f, 0.024188f, -0.001913f, -0.026494f, 0.011478f, -0.005684f, 0.012105f, -0.015871f, 0.003621f, 0.008886f, -0.046521f, -0.022257f, 0.016691f, -0.001506f, -0.004829f, 0.007103f, -0.002190f, 0.029424f, -0.000849f, 0.018612f, 0.016422f, -0.023970f, -0.027550f, 0.001553f, -0.030539f, -0.000767f, -0.001318f, 0.000565f, 0.004670f, 0.019208f, -0.000470f, -0.012152f, 0.011252f, 0.014444f, -0.013319f, + 0.002326f, 0.004572f, 0.014534f, -0.006910f, 0.000467f, -0.007007f, 0.004889f, -0.000176f, 0.003048f, 0.005076f, 0.007818f, 0.008182f, -0.000277f, -0.007407f, 0.000308f, 0.005891f, 0.001744f, 0.001427f, -0.007009f, 0.001005f, -0.007018f, -0.000777f, 0.003762f, -0.000871f, 0.006849f, 0.005359f, -0.000312f, 0.001714f, 0.005548f, -0.004899f, 0.009798f, 0.000066f, -0.004311f, 0.004680f, 0.016118f, 0.065309f, -0.016027f, -0.044110f, -0.003845f, -0.019381f, 0.047656f, 0.003519f, 0.026722f, 0.014238f, -0.008227f, -0.021217f, -0.009380f, -0.023107f, -0.005844f, 0.031853f, -0.035635f, 0.001331f, -0.029067f, 0.007718f, 0.002466f, 0.014030f, 0.003331f, -0.014161f, -0.023560f, -0.027705f, -0.005070f, -0.027188f, -0.021096f, 0.003246f, 0.006313f, 0.019849f, -0.018740f, -0.039344f, -0.008174f, -0.013811f, 0.004715f, -0.018625f, -0.012410f, 0.005404f, -0.009779f, -0.015807f, -0.001051f, 0.001453f, -0.007953f, 0.037875f, -0.007813f, -0.006514f, 0.009632f, 0.009699f, -0.011315f, -0.005075f, 0.028206f, 0.023388f, 0.015525f, 0.029476f, 0.023294f, -0.000235f, 0.009751f, 0.016614f, -0.012578f, -0.012110f, + 0.003464f, 0.011881f, 0.019781f, 0.007810f, 0.040149f, 0.004094f, 0.026917f, -0.007950f, -0.015561f, -0.010342f, 0.056976f, 0.009798f, -0.007410f, -0.007208f, -0.020480f, -0.019924f, -0.014125f, -0.014080f, -0.016405f, 0.006190f, 0.013109f, -0.014318f, 0.004460f, 0.013799f, 0.007008f, -0.013261f, 0.002577f, 0.014070f, -0.003660f, 0.007608f, -0.007264f, -0.002425f, 0.003182f, -0.002857f, -0.001680f, -0.004751f, -0.009281f, -0.001862f, -0.008418f, 0.003991f, 0.006912f, 0.003124f, -0.007042f, 0.008797f, 0.005916f, -0.005576f, -0.006176f, -0.009905f, -0.002908f, -0.003083f, 0.002380f, -0.002546f, 0.004285f, 0.002779f, 0.000703f, -0.001423f, 0.000035f, -0.008041f, 0.003010f, 0.012174f, -0.057127f, -0.021508f, 0.028970f, -0.007074f, -0.029069f, -0.027704f, -0.009033f, 0.030911f, 0.016824f, -0.025276f, 0.014110f, -0.033563f, -0.013436f, -0.004266f, -0.021647f, -0.030185f, 0.025398f, 0.013550f, -0.026410f, -0.009677f, 0.057720f, 0.013057f, -0.025142f, -0.035284f, 0.000977f, 0.018531f, 0.003587f, 0.002915f, -0.039682f, -0.001510f, -0.004125f, -0.029127f, -0.016369f, -0.011962f, -0.022628f, -0.011278f, + 0.007123f, 0.000529f, -0.023906f, -0.024716f, 0.003555f, 0.014910f, 0.000049f, 0.020106f, 0.034779f, -0.024539f, 0.021727f, 0.015635f, 0.007221f, 0.004213f, 0.026331f, 0.007640f, 0.016411f, 0.010235f, 0.014835f, -0.005290f, -0.002659f, 0.029079f, 0.046638f, 0.007184f, -0.010291f, 0.005191f, -0.006191f, -0.017974f, 0.029843f, -0.014854f, -0.024325f, -0.039668f, -0.013016f, -0.046147f, 0.023272f, -0.019126f, -0.007431f, -0.003179f, -0.006120f, -0.016935f, -0.002288f, 0.017641f, -0.020335f, -0.002375f, 0.010040f, -0.006520f, -0.019820f, 0.009621f, 0.002109f, 0.005099f, -0.000898f, -0.002975f, -0.006800f, -0.001371f, -0.003308f, 0.010281f, 0.003310f, 0.002416f, 0.002217f, 0.002956f, 0.000599f, 0.004932f, 0.004202f, 0.009022f, -0.013029f, -0.002198f, 0.001566f, 0.008314f, -0.003239f, 0.006818f, -0.007675f, 0.002172f, 0.002438f, -0.002404f, -0.004045f, 0.007162f, -0.003102f, -0.001278f, 0.004958f, 0.000724f, 0.000896f, -0.011621f, -0.025359f, 0.021566f, 0.012814f, -0.003734f, 0.014289f, 0.010740f, 0.030502f, 0.023639f, -0.049739f, -0.016407f, 0.055184f, -0.043448f, -0.012911f, -0.026288f, + 0.039314f, 0.017613f, 0.018096f, 0.007729f, 0.005731f, 0.015847f, 0.041716f, 0.019966f, -0.018420f, -0.000268f, 0.001353f, -0.001073f, 0.016500f, 0.018678f, 0.002234f, 0.011096f, 0.010488f, -0.009478f, 0.012915f, 0.007876f, 0.025780f, -0.012281f, -0.024827f, -0.021200f, -0.016616f, 0.005026f, -0.002173f, 0.009965f, 0.011177f, 0.011363f, 0.022713f, -0.009845f, 0.004790f, -0.009923f, -0.017719f, -0.007055f, 0.001882f, -0.020298f, 0.026092f, 0.031696f, -0.034308f, 0.011819f, -0.023763f, 0.019538f, -0.003878f, 0.007672f, -0.002598f, -0.018868f, -0.004618f, 0.021976f, -0.017080f, -0.005130f, 0.003879f, -0.034902f, -0.013377f, 0.007471f, -0.027084f, -0.001750f, 0.043370f, 0.021694f, -0.002907f, -0.009790f, 0.034613f, 0.009221f, 0.024934f, -0.007699f, -0.011160f, 0.036259f, -0.012241f, 0.011414f, 0.004831f, 0.005270f, -0.007415f, -0.005309f, -0.006624f, -0.004460f, -0.012128f, -0.007366f, -0.008441f, 0.001359f, 0.007852f, -0.002735f, -0.017035f, -0.005342f, -0.002315f, 0.002075f, -0.000479f, -0.004105f, 0.000122f, 0.004965f, 0.008390f, -0.006507f, -0.000146f, -0.018262f, 0.003179f, -0.002145f, + -0.003412f, 0.012574f, -0.000148f, -0.001044f, -0.007253f, 0.007754f, 0.002171f, 0.011409f, -0.003754f, -0.000500f, -0.007449f, -0.000665f, -0.010761f, 0.034564f, -0.002869f, -0.007989f, -0.028733f, 0.001288f, 0.002679f, -0.007662f, -0.000659f, -0.013261f, 0.004997f, -0.041156f, 0.037572f, -0.007553f, -0.013344f, -0.026028f, -0.029477f, -0.002992f, 0.035852f, -0.006453f, 0.009921f, -0.022116f, -0.012828f, -0.006130f, -0.021601f, -0.025990f, 0.023804f, -0.014654f, -0.012000f, 0.021180f, 0.020524f, -0.028963f, 0.010115f, 0.011054f, 0.025143f, 0.020845f, -0.007582f, -0.018295f, -0.011586f, -0.028148f, 0.031073f, 0.020520f, 0.010325f, 0.022247f, -0.022929f, 0.015805f, -0.003312f, 0.014499f, 0.015982f, -0.014925f, -0.001162f, 0.050663f, 0.042407f, -0.031932f, 0.012862f, 0.026360f, -0.020138f, 0.006364f, -0.047212f, 0.014274f, -0.025525f, 0.021256f, -0.014789f, -0.016210f, -0.011503f, 0.056535f, 0.003275f, -0.016298f, 0.005056f, 0.019109f, 0.002551f, 0.011428f, -0.030335f, -0.003313f, 0.050723f, -0.001511f, -0.019827f, -0.030826f, 0.001029f, -0.022773f, 0.014393f, 0.014777f, 0.017785f, -0.031476f, + -0.032968f, -0.008649f, 0.005650f, 0.011047f, 0.003541f, 0.000354f, 0.000905f, 0.012234f, -0.008011f, -0.003062f, -0.002409f, -0.005133f, 0.006043f, 0.005230f, -0.009999f, -0.006760f, -0.015416f, 0.009704f, -0.005579f, 0.004362f, 0.006922f, 0.010212f, 0.008074f, 0.003652f, 0.015730f, 0.001216f, -0.003503f, 0.007700f, -0.011456f, 0.006709f, 0.004632f, 0.003411f, 0.010471f, 0.011307f, 0.002199f, -0.001288f, 0.006678f, 0.000995f, -0.000844f, -0.011950f, -0.015836f, -0.002769f, -0.001069f, -0.001720f, -0.031016f, -0.001307f, -0.003535f, -0.005430f, 0.009542f, -0.045732f, -0.020519f, -0.025817f, 0.021852f, -0.011190f, 0.032297f, 0.018973f, 0.040998f, -0.020516f, -0.001238f, -0.032211f, 0.027483f, 0.048858f, -0.014893f, -0.039452f, 0.004278f, -0.008338f, 0.060853f, -0.015221f, -0.023245f, 0.022688f, 0.013147f, 0.009308f, 0.023210f, 0.007418f, -0.075458f, -0.000044f, -0.004631f, 0.029334f, 0.053796f, -0.050688f, 0.002466f, 0.014804f, -0.023691f, -0.005201f, -0.068363f, -0.015885f, 0.035588f, -0.056952f, -0.033420f, -0.017685f, -0.021681f, 0.022295f, -0.013234f, -0.020479f, 0.030834f, 0.008935f, + 0.011562f, 0.030991f, 0.003946f, -0.011051f, 0.022760f, 0.032536f, -0.031419f, -0.024075f, 0.049346f, 0.033300f, 0.011850f, 0.015235f, 0.012061f, -0.022258f, -0.031210f, -0.000316f, 0.000950f, -0.006801f, 0.010532f, -0.019485f, 0.014176f, -0.026878f, 0.011335f, 0.061832f, -0.028361f, -0.024153f, 0.034707f, 0.009575f, -0.011076f, 0.021344f, 0.030580f, 0.022049f, 0.027094f, 0.012881f, -0.012915f, 0.010682f, -0.032167f, 0.017242f, 0.008000f, 0.008993f, -0.016029f, -0.005221f, 0.004068f, -0.001805f, -0.002723f, -0.005244f, 0.011350f, 0.020779f, -0.007612f, -0.020576f, 0.013503f, 0.024072f, 0.013323f, 0.009313f, -0.028182f, 0.017190f, 0.002502f, 0.009185f, -0.003984f, -0.010118f, -0.001661f, 0.014452f, 0.001987f, -0.002974f, -0.011778f, -0.001279f, -0.006590f, -0.003838f, -0.005080f, 0.006285f, 0.014568f, -0.008621f, 0.001226f, 0.008509f, -0.002752f, -0.001792f, -0.006904f, 0.001118f, -0.004393f, -0.005939f, 0.013122f, 0.004413f, 0.018050f, 0.016220f, 0.026555f, -0.061502f, -0.113470f, -0.052375f, -0.007948f, 0.038551f, 0.002733f, 0.042511f, 0.039337f, -0.011998f, 0.006355f, -0.009745f, + -0.021616f, -0.035600f, -0.020694f, -0.025740f, -0.014951f, 0.040333f, -0.052661f, -0.009288f, -0.043911f, -0.054525f, -0.009605f, -0.055036f, -0.044245f, 0.005234f, -0.011655f, -0.006514f, 0.009870f, 0.047966f, 0.003236f, -0.035146f, 0.001856f, -0.004402f, -0.010662f, -0.045599f, -0.003133f, 0.053866f, 0.004835f, -0.001161f, 0.021737f, 0.041776f, 0.028098f, 0.007093f, -0.017317f, 0.014387f, -0.014590f, -0.038794f, -0.070863f, 0.066909f, -0.008743f, 0.055681f, -0.004962f, 0.000441f, -0.020376f, -0.032657f, 0.058734f, -0.033853f, -0.027529f, -0.003165f, -0.043291f, -0.040737f, 0.033276f, 0.024280f, 0.012605f, -0.004649f, 0.016775f, -0.030199f, 0.011259f, -0.024587f, -0.034531f, -0.037686f, -0.029459f, -0.012392f, 0.028512f, 0.001430f, 0.009987f, -0.017673f, 0.009820f, -0.023003f, 0.016025f, 0.012340f, 0.011281f, -0.007800f, -0.001384f, 0.014103f, -0.004417f, -0.018077f, -0.013755f, -0.017908f, -0.001989f, -0.013350f, -0.003475f, -0.005012f, -0.005197f, 0.004647f, 0.001590f, -0.007430f, 0.002453f, 0.008642f, -0.002959f, -0.006346f, -0.014220f, -0.000637f, -0.009960f, -0.001825f, -0.002110f, -0.007035f, + 0.015350f, -0.015531f, -0.014647f, -0.007188f, 0.007842f, -0.013831f, -0.013994f, 0.001330f, -0.011818f, -0.000669f, -0.002658f, 0.005651f, -0.002139f, 0.001496f, -0.009708f, 0.003027f, -0.019388f, -0.010038f, -0.003547f, -0.040088f, 0.008377f, -0.009568f, -0.029624f, -0.042997f, -0.001222f, -0.041105f, -0.049372f, -0.007491f, -0.022990f, -0.052650f, -0.074694f, 0.009082f, -0.028771f, 0.014326f, -0.006147f, 0.028396f, 0.061425f, 0.003822f, 0.005609f, -0.030922f, -0.034646f, 0.028797f, 0.014875f, -0.022234f, -0.000735f, 0.018987f, -0.042974f, -0.031775f, -0.003142f, 0.054034f, -0.046813f, 0.001198f, 0.000223f, 0.025174f, -0.040127f, 0.041462f, 0.020585f, 0.012140f, -0.001966f, -0.016498f, -0.046450f, 0.000062f, -0.011811f, 0.016984f, -0.025636f, -0.059934f, 0.048874f, -0.035925f, -0.017168f, -0.002063f, 0.047791f, -0.036600f, 0.016147f, -0.029993f, 0.017911f, -0.010588f, -0.045783f, 0.021868f, -0.058077f, -0.012188f, -0.017370f, 0.020354f, 0.045821f, -0.026692f, 0.016335f, 0.047810f, -0.038983f, 0.006635f, 0.010447f, 0.011498f, 0.012998f, -0.068858f, -0.021745f, -0.011389f, 0.023876f, 0.005546f, + -0.001153f, 0.012936f, -0.013216f, 0.027901f, -0.006094f, 0.006556f, -0.027677f, 0.023300f, 0.004845f, -0.042420f, -0.020543f, 0.020305f, 0.024051f, -0.003359f, -0.007490f, -0.016503f, 0.022451f, 0.003137f, -0.000720f, -0.044221f, 0.006126f, -0.021217f, -0.034713f, -0.010054f, -0.007898f, -0.004238f, -0.020903f, -0.025386f, 0.008002f, -0.005814f, -0.013681f, 0.007350f, -0.003726f, -0.003643f, 0.000311f, -0.006834f, 0.001238f, 0.013692f, -0.027070f, 0.002547f, 0.003664f, -0.008614f, 0.017432f, 0.017255f, 0.018532f, 0.007799f, 0.010683f, -0.012626f, 0.003920f, 0.000448f, 0.004394f, -0.005891f, -0.001037f, -0.000638f, 0.006959f, -0.005324f, -0.012896f, 0.010898f, 0.080942f, 0.008477f, 0.034069f, 0.093264f, -0.043731f, -0.024241f, -0.036687f, -0.013395f, 0.042637f, 0.003013f, 0.052564f, 0.014391f, -0.002184f, -0.019529f, 0.039641f, -0.024696f, 0.008789f, -0.016446f, 0.016183f, -0.026181f, 0.030118f, -0.014639f, -0.007422f, -0.017215f, 0.023072f, 0.016201f, -0.026098f, -0.005967f, 0.024299f, 0.007606f, -0.016887f, 0.001809f, -0.021625f, -0.069753f, 0.029956f, -0.036578f, -0.054136f, 0.033380f, + 0.014344f, 0.036087f, -0.003770f, -0.034864f, -0.013497f, -0.009235f, 0.020460f, 0.028030f, 0.030593f, 0.051876f, 0.050617f, -0.022518f, 0.006606f, -0.053904f, 0.000107f, -0.039218f, -0.070746f, -0.006797f, -0.057768f, 0.018711f, -0.046233f, -0.030018f, -0.030782f, -0.042816f, 0.003776f, -0.010066f, 0.003132f, -0.012668f, -0.005911f, -0.003639f, -0.074834f, 0.011983f, 0.010796f, 0.017069f, 0.035178f, -0.006634f, -0.059618f, 0.034339f, -0.038800f, 0.022233f, 0.021291f, 0.048387f, -0.026737f, -0.023889f, -0.016415f, -0.009252f, -0.034858f, 0.013897f, 0.007381f, 0.004492f, -0.008765f, 0.012305f, -0.017684f, 0.017564f, -0.003410f, 0.003787f, 0.004605f, -0.021015f, -0.000664f, 0.008495f, 0.020434f, -0.005316f, -0.013192f, 0.009420f, 0.013981f, 0.018206f, -0.011803f, 0.000355f, 0.009511f, -0.000988f, -0.002501f, -0.006442f, -0.013912f, 0.009672f, -0.000815f, 0.006272f, -0.008020f, -0.000783f, 0.011706f, -0.007873f, -0.013117f, -0.006948f, 0.001417f, -0.005087f, -0.022623f, 0.035769f, -0.009577f, -0.007040f, 0.002521f, 0.007073f, -0.006493f, 0.006809f, 0.007961f, -0.003200f, -0.001213f, -0.004547f, + -0.007477f, 0.058347f, 0.108221f, -0.059289f, -0.048500f, -0.083838f, -0.171412f, -0.042063f, -0.018296f, 0.038470f, 0.022722f, -0.014571f, -0.033402f, 0.046953f, 0.056715f, 0.005155f, -0.003172f, 0.000523f, -0.045543f, -0.026420f, -0.032430f, -0.024397f, -0.048166f, -0.000476f, -0.012500f, -0.005602f, 0.032299f, -0.044672f, 0.035469f, 0.033852f, -0.010984f, 0.017493f, -0.002443f, -0.079637f, -0.057316f, -0.031595f, -0.029544f, -0.013267f, 0.005802f, 0.030854f, 0.009460f, 0.016627f, 0.076511f, 0.070130f, 0.015339f, -0.051962f, -0.027605f, -0.002198f, -0.027297f, -0.049288f, -0.123718f, -0.103454f, -0.047118f, -0.011054f, 0.004516f, 0.026999f, -0.086018f, -0.049207f, 0.043726f, 0.051433f, 0.061137f, -0.056249f, -0.068903f, 0.022261f, -0.042276f, 0.101357f, -0.051722f, -0.005833f, -0.030700f, -0.016281f, 0.013367f, 0.029967f, -0.015597f, -0.040086f, 0.036560f, 0.036062f, -0.008838f, 0.041306f, 0.036074f, -0.080337f, 0.071166f, -0.046609f, -0.000467f, -0.013762f, -0.048700f, -0.013541f, 0.023595f, 0.018040f, -0.004626f, 0.009300f, -0.030009f, 0.000579f, 0.013968f, 0.019752f, 0.030568f, -0.023645f, + 0.003986f, -0.006854f, -0.013566f, -0.033455f, -0.004894f, -0.032246f, 0.027491f, -0.005390f, -0.034945f, 0.005254f, -0.039923f, -0.002812f, 0.003843f, -0.009283f, -0.017790f, 0.000928f, 0.002221f, 0.003852f, 0.011819f, -0.002673f, -0.001553f, 0.022520f, 0.006457f, -0.023284f, -0.027360f, 0.006878f, -0.018513f, -0.037516f, -0.013824f, -0.035332f, 0.010416f, 0.010689f, 0.026364f, 0.003715f, -0.028289f, -0.020331f, 0.020130f, 0.102042f, -0.033976f, 0.032901f, -0.001393f, -0.045409f, 0.007059f, -0.091682f, -0.020602f, 0.019738f, 0.001860f, -0.053344f, 0.031659f, 0.093525f, 0.065646f, -0.028880f, -0.058465f, -0.024871f, 0.006657f, 0.098300f, 0.013297f, 0.002550f, 0.000461f, 0.045504f, 0.046792f, 0.012301f, 0.035800f, 0.029057f, 0.055001f, -0.015537f, 0.006371f, 0.035196f, -0.031907f, -0.048604f, 0.027484f, 0.080741f, 0.017580f, 0.039209f, 0.003859f, 0.024139f, -0.107780f, 0.020136f, -0.004099f, 0.024548f, 0.105900f, 0.042873f, 0.014426f, -0.010306f, 0.047531f, -0.010619f, -0.022103f, 0.016973f, 0.029588f, 0.062489f, -0.019939f, 0.038938f, 0.007179f, 0.010990f, 0.024629f, 0.031770f, + -0.000850f, -0.040952f, -0.025456f, 0.009933f, 0.079923f, 0.054960f, 0.042592f, 0.046292f, 0.038625f, -0.010700f, -0.098661f, -0.070628f, -0.135392f, -0.001539f, 0.041461f, 0.078389f, 0.012283f, -0.056528f, 0.018935f, -0.034825f, 0.011442f, 0.027359f, 0.008283f, -0.016073f, -0.009022f, 0.000727f, -0.007514f, 0.022313f, -0.014858f, -0.038941f, 0.000880f, 0.013609f, 0.017655f, -0.024988f, -0.011449f, -0.046888f, 0.011871f, 0.021169f, -0.018100f, -0.015799f, 0.011966f, -0.008717f, -0.011611f, -0.009664f, -0.036751f, -0.007302f, 0.038112f, 0.024440f, 0.034510f, -0.017902f, -0.038870f, -0.028206f, 0.025363f, 0.020646f, -0.009103f, -0.001003f, -0.002309f, 0.007831f, -0.010906f, 0.023608f, -0.025947f, -0.013883f, 0.001847f, 0.005151f, 0.014999f, -0.031258f, 0.006652f, -0.022700f, 0.062666f, -0.017461f, 0.013654f, -0.019493f, 0.007201f, 0.000631f, 0.005853f, -0.002311f, -0.014890f, -0.038322f, -0.016790f, 0.083924f, -0.003916f, -0.038476f, 0.009020f, -0.007033f, -0.032213f, -0.025235f, 0.004139f, 0.044425f, 0.119185f, 0.054026f, 0.105586f, 0.055766f, 0.046622f, 0.045158f, -0.032067f, -0.026147f, + -0.030701f, 0.013524f, 0.086445f, 0.028229f, -0.073192f, 0.031586f, -0.078651f, 0.039344f, -0.050071f, -0.010290f, -0.044018f, -0.046519f, -0.002768f, 0.006257f, -0.001212f, -0.058255f, 0.075672f, -0.015237f, 0.028110f, -0.073731f, 0.019286f, -0.016955f, -0.023304f, 0.038600f, -0.031929f, 0.076956f, 0.008524f, -0.029996f, 0.003434f, -0.022532f, -0.031936f, 0.021843f, -0.052487f, -0.010900f, 0.064826f, -0.014004f, 0.026245f, -0.003267f, -0.047828f, 0.052159f, -0.028442f, -0.107519f, 0.012956f, 0.008360f, -0.000893f, 0.012149f, -0.015317f, -0.020728f, -0.006479f, 0.049072f, -0.093079f, 0.055026f, -0.022280f, -0.012608f, 0.060517f, -0.037218f, 0.017491f, 0.022784f, 0.088065f, 0.031110f, 0.038697f, -0.005971f, 0.052466f, -0.041935f, 0.041536f, 0.007208f, -0.016613f, 0.011563f, 0.002124f, 0.002077f, -0.023243f, -0.005584f, 0.003689f, -0.009375f, -0.017489f, 0.036330f, 0.000222f, -0.002199f, -0.010983f, 0.012382f, -0.014484f, 0.032459f, 0.018267f, 0.017652f, 0.003600f, 0.000273f, -0.003417f, 0.027272f, -0.021864f, -0.027089f, 0.010233f, 0.014538f, -0.001678f, 0.024573f, -0.010697f, -0.004331f, + 0.000861f, -0.007684f, -0.027152f, -0.026274f, -0.002880f, 0.009543f, -0.013669f, 0.005231f, 0.008230f, 0.010182f, -0.007573f, -0.000012f, 0.017243f, -0.007498f, -0.025221f, -0.045171f, 0.074095f, 0.068753f, 0.239978f, 0.096845f, -0.130442f, -0.061350f, -0.063778f, -0.100338f, 0.070209f, 0.215654f, 0.086569f, 0.040997f, -0.053775f, -0.014764f, -0.003334f, -0.002412f, 0.103817f, 0.071059f, 0.045489f, 0.155932f, -0.186196f, 0.012336f, 0.097887f, -0.023422f, 0.020437f, 0.102421f, 0.018319f, -0.028925f, 0.055536f, -0.102601f, -0.205947f, -0.019397f, 0.020734f, -0.079721f, -0.008608f, 0.110935f, 0.019138f, 0.006873f, 0.042541f, -0.086934f, -0.177306f, -0.162060f, -0.073388f, 0.054169f, 0.106252f, 0.234587f, 0.059391f, -0.029463f, -0.028857f, -0.062961f, -0.139428f, -0.042039f, 0.103075f, 0.103643f, 0.108797f, 0.106026f, 0.066865f, 0.055503f, 0.016577f, 0.024609f, -0.089302f, -0.054674f, 0.014079f, 0.025803f, 0.046844f, 0.057184f, 0.139873f, 0.037099f, 0.081731f, -0.052622f, -0.051833f, -0.093727f, -0.019760f, -0.071499f, -0.016445f, 0.145823f, 0.187114f, 0.004782f, -0.006729f, -0.115274f, + -0.132956f, -0.074574f, -0.030953f, 0.075120f, 0.040449f, -0.007331f, 0.028499f, -0.009467f, -0.018234f, -0.034164f, -0.032219f, -0.003579f, 0.009355f, 0.007750f, 0.041897f, -0.002074f, 0.000080f, -0.020039f, 0.001691f, -0.025146f, -0.007762f, 0.001043f, -0.037431f, -0.016333f, 0.001861f, -0.009487f, -0.001643f, 0.023547f, 0.021080f, 0.048066f, -0.019592f, -0.007416f, -0.046488f, -0.037411f, -0.028093f, 0.049860f, 0.032054f, 0.016490f, 0.017382f, -0.013836f, -0.041070f, -0.032821f, 0.002790f, -0.022711f, 0.042671f, 0.062792f, -0.000984f, -0.013358f, -0.042221f, -0.014533f, -0.171694f, -0.104833f, 0.060849f, 0.161843f, 0.186930f, 0.391157f, 0.237482f, 0.162348f, 0.142153f, 0.111823f, -0.019927f, -0.168407f, -0.185760f, -0.358569f, -0.382668f, -0.361442f, -0.232102f, -0.080060f, 0.079930f, 0.139875f, 0.231156f, 0.228462f, 0.159232f, 0.158619f, 0.201182f, 0.194398f, 0.173146f, 0.110980f, 0.076052f, 0.068426f, -0.007441f, -0.010927f, -0.223994f, -0.158383f, -0.200473f, -0.241213f, -0.102340f, -0.235526f, -0.191377f, -0.347400f, -0.305321f, -0.215182f, -0.144890f, -0.020605f, 0.180607f, 0.220325f, + 0.184375f, 0.198462f, 0.182389f, 0.339889f, 0.440810f, 0.395331f, 0.390681f, 0.346168f, 0.332796f, 0.248765f, 0.247222f, 0.054101f, -0.167669f, -0.346849f, -0.333227f, -0.496758f, -0.415789f, -0.603527f, -0.720635f, -0.638944f, -0.608308f, -0.364838f, -0.255290f, 0.047685f, 0.120240f, 0.285332f, 0.422128f, 0.652610f, 0.563805f, 0.815750f, 0.703154f, 0.505201f, 0.495227f, 0.226797f, 0.015849f, -0.044129f, -0.177149f, -0.307165f, -0.368963f, -0.439093f, -0.382023f, -0.344493f, -0.334009f, -0.269793f, -0.279679f, -0.228164f, -0.202325f, -0.060252f, -0.043519f, 0.056779f, 0.129470f, 0.150595f, 0.194319f, 0.278325f, 0.334769f, 0.358671f, 0.373636f, 0.276051f, 0.227023f, 0.221808f, 0.081329f, 0.055311f, -0.124824f, -0.296437f, -0.397036f, -0.404492f, -0.454570f, -0.287148f, -0.329415f, -0.218095f, -0.158746f, -0.042417f, 0.078360f, 0.156528f, 0.235533f, 0.246213f, 0.368312f, 0.380038f, 0.363411f, 0.309797f, 0.276422f, 0.111584f, 0.027932f, -0.067472f, -0.156611f, -0.296786f, -0.351664f, -0.290498f, -0.198276f, -0.173543f, -0.122503f, -0.110179f, -0.058429f, -0.005355f, 0.015184f, 0.012643f, + 0.054004f, 0.062934f, 0.096545f, 0.084070f, 0.077087f, 0.073840f, 0.082676f, 0.060542f, 0.056956f, 0.066450f, 0.069217f, 0.041485f, 0.027496f, 0.004488f, 0.001880f, 0.011646f, -0.004897f, -0.036211f, -0.027854f, -0.038961f, -0.048998f, -0.064693f, -0.056975f, -0.047989f, -0.031335f, -0.037902f, -0.029479f, -0.025076f, -0.006568f, -0.014650f, -0.010754f, -0.005391f, 0.011894f, 0.003302f, 0.011903f, 0.020317f, 0.033069f, 0.024983f, 0.032332f, 0.026359f, 0.037108f, 0.031320f, 0.025033f, 0.008304f, 0.011668f, 0.004566f, 0.004130f, -0.009825f, -0.007418f, -0.009542f, -0.003330f, -0.012578f, -0.006738f, -0.012445f, -0.008063f, -0.010465f, 0.002864f, -0.002878f, -0.004010f, -0.011910f, -0.006276f, -0.010757f, -0.006435f, -0.017469f, -0.011884f, -0.010639f, -0.001828f, -0.005637f, 0.002886f, 0.001178f, 0.008539f, 0.004856f, 0.013542f, 0.010112f, 0.013460f, 0.006649f, 0.010506f, 0.004496f, 0.010279f, 0.004485f, 0.009186f, 0.002844f, 0.006395f, -0.000950f, 0.002401f, -0.004903f, -0.000542f, -0.006712f, -0.001293f, -0.006623f, -0.000671f, -0.005536f, 0.000562f, -0.004414f, 0.001666f, -0.003281f, + 0.002589f} + }, + { + {-0.009587f, -0.025848f, -0.002130f, -0.004174f, -0.003479f, 0.000329f, -0.004260f, 0.001553f, 0.002570f, 0.010516f, -0.003531f, -0.000484f, -0.009715f, 0.000658f, 0.009838f, 0.000620f, 0.007119f, -0.002155f, 0.003006f, -0.004161f, -0.006128f, 0.000140f, 0.006764f, -0.000934f, -0.008414f, -0.000419f, 0.008196f, 0.002593f, -0.003480f, -0.002990f, -0.000365f, -0.001197f, -0.001892f, 0.000024f, -0.001367f, -0.002887f, -0.000345f, 0.001602f, 0.001155f, -0.000450f, -0.006419f, 0.009481f, 0.013031f, 0.000341f, 0.001522f, -0.005341f, -0.002986f, 0.000954f, -0.006799f, -0.007625f, 0.004510f, -0.006210f, 0.004455f, 0.005697f, 0.005750f, 0.002078f, -0.000877f, 0.001478f, 0.001195f, 0.004264f, -0.009369f, 0.000728f, -0.001220f, -0.006893f, -0.009231f, 0.000190f, 0.004589f, -0.003591f, -0.000505f, -0.001151f, -0.000669f, 0.006417f, 0.003201f, 0.000790f, 0.002522f, -0.002201f, -0.007610f, 0.002867f, 0.001203f, 0.006415f, -0.007827f, -0.005992f, 0.004371f, -0.003572f, -0.001657f, -0.005892f, 0.001283f, -0.003497f, -0.003206f, -0.000004f, -0.002580f, -0.002852f, 0.000722f, -0.001583f, -0.000742f, -0.003238f, + 0.001903f, -0.000480f, 0.000138f, -0.000931f, 0.001543f, -0.000392f, 0.000466f, -0.000655f, -0.000548f, -0.000057f, -0.001083f, -0.000149f, -0.023783f, -0.005432f, 0.009056f, -0.001271f, -0.007418f, 0.003123f, -0.017670f, -0.006736f, -0.002675f, -0.003148f, -0.009203f, -0.009562f, 0.005048f, 0.007974f, 0.006706f, -0.008942f, -0.013330f, 0.001512f, -0.007859f, -0.014075f, 0.003096f, -0.000879f, 0.003860f, 0.015858f, -0.005345f, -0.001655f, -0.010134f, 0.013705f, 0.000928f, 0.006847f, 0.004587f, 0.011255f, 0.005585f, 0.003493f, -0.011282f, -0.001247f, -0.010384f, -0.002809f, 0.000317f, -0.004287f, 0.003314f, 0.002930f, -0.004981f, -0.009497f, 0.005931f, 0.009943f, 0.002660f, -0.004702f, -0.007481f, -0.004535f, 0.002222f, -0.008246f, -0.010612f, -0.002953f, 0.005054f, -0.002863f, 0.002425f, 0.006621f, 0.004029f, -0.004858f, 0.009419f, 0.000894f, 0.008003f, -0.006774f, -0.005870f, -0.003280f, -0.004139f, 0.005725f, -0.003328f, 0.000387f, 0.009511f, 0.003482f, 0.000110f, -0.009073f, 0.002355f, -0.003585f, 0.006633f, 0.009884f, -0.001825f, 0.000874f, -0.004616f, 0.003788f, 0.008518f, -0.003002f, + 0.005260f, 0.002516f, 0.001017f, 0.004524f, 0.001645f, 0.000293f, 0.003426f, 0.001425f, -0.000412f, 0.000101f, 0.001445f, 0.001520f, -0.001727f, 0.001281f, 0.001074f, 0.001909f, -0.001239f, -0.004867f, 0.006135f, 0.008387f, 0.003438f, -0.005279f, 0.003711f, -0.002485f, 0.002585f, 0.015798f, 0.009796f, -0.013364f, 0.009112f, -0.007356f, -0.003576f, -0.001938f, 0.000319f, 0.006719f, 0.000308f, 0.018491f, 0.005400f, -0.007097f, -0.004604f, -0.004603f, 0.013084f, 0.003068f, 0.012606f, 0.004121f, 0.008510f, 0.013092f, 0.015075f, 0.005718f, -0.001624f, -0.001489f, 0.002337f, -0.012014f, -0.011116f, 0.003590f, -0.008418f, 0.004845f, 0.002400f, -0.002861f, -0.001172f, 0.003548f, 0.012607f, -0.004081f, -0.004169f, -0.006416f, 0.016087f, -0.002138f, -0.019862f, -0.009926f, -0.007818f, -0.007228f, 0.008337f, 0.007955f, 0.007064f, 0.010463f, 0.004728f, 0.006574f, -0.000189f, -0.000586f, -0.000190f, 0.010530f, 0.003516f, 0.006198f, -0.013777f, 0.000957f, 0.000753f, 0.000802f, 0.001033f, 0.006095f, 0.004352f, 0.001806f, -0.006608f, -0.006644f, 0.004020f, 0.003304f, -0.001854f, -0.000355f, + -0.005290f, -0.006824f, -0.005497f, 0.003902f, 0.006807f, 0.000887f, 0.000526f, 0.002401f, -0.001788f, -0.000165f, -0.001380f, 0.001289f, 0.001331f, 0.000780f, -0.000766f, 0.002089f, 0.003361f, -0.000382f, 0.000480f, 0.000801f, -0.000344f, 0.000943f, -0.001152f, 0.002436f, 0.000192f, -0.000350f, -0.001331f, 0.002169f, -0.003844f, 0.002377f, 0.000850f, 0.001819f, -0.000106f, -0.002277f, 0.000657f, -0.001046f, 0.035360f, 0.007544f, 0.005595f, -0.004437f, -0.002199f, 0.003252f, 0.002695f, 0.009213f, 0.012629f, -0.000725f, 0.018482f, 0.007123f, -0.006205f, -0.006182f, -0.000232f, 0.008574f, -0.000802f, -0.004922f, 0.009886f, 0.001200f, 0.026543f, 0.006734f, 0.005433f, 0.000928f, -0.002320f, 0.001084f, 0.004203f, 0.004947f, -0.000976f, -0.000103f, 0.014339f, 0.001818f, 0.015762f, -0.007977f, -0.007258f, 0.004972f, 0.023556f, 0.006605f, 0.005852f, -0.002182f, -0.009885f, -0.004126f, 0.003365f, 0.000536f, -0.000024f, 0.000697f, -0.014120f, 0.000856f, -0.006099f, 0.005579f, 0.004723f, -0.005815f, 0.003498f, 0.004867f, 0.003577f, -0.006890f, -0.006715f, 0.001488f, 0.002643f, -0.000137f, + -0.008692f, 0.002167f, -0.003265f, 0.005545f, -0.000627f, 0.000952f, 0.003811f, -0.001528f, 0.002191f, -0.003330f, 0.001165f, 0.020332f, 0.002510f, 0.007103f, 0.000432f, -0.005801f, 0.003553f, 0.001066f, 0.006533f, -0.011555f, -0.007758f, 0.003740f, -0.001488f, 0.002184f, -0.002787f, 0.004183f, 0.003821f, 0.000301f, -0.004868f, -0.002067f, -0.006689f, -0.001381f, -0.001403f, 0.004255f, -0.002992f, -0.000998f, 0.000922f, -0.000765f, -0.001478f, -0.001811f, 0.001456f, -0.001914f, -0.002137f, -0.000185f, 0.000255f, 0.001080f, -0.004482f, -0.001965f, 0.001341f, 0.000516f, -0.004897f, -0.001389f, -0.000177f, -0.006666f, -0.002586f, -0.000856f, 0.005292f, -0.007858f, -0.001222f, 0.007767f, -0.003866f, -0.012323f, 0.000048f, 0.020051f, -0.001271f, 0.015723f, 0.008233f, 0.021792f, 0.002765f, 0.001953f, 0.008087f, -0.006240f, -0.012929f, -0.017246f, 0.004168f, -0.008817f, 0.020306f, 0.011473f, 0.014383f, -0.002742f, -0.005810f, 0.001730f, 0.003325f, 0.006622f, 0.019017f, 0.002220f, 0.007997f, -0.008674f, 0.006144f, -0.006163f, 0.002707f, -0.003337f, 0.006345f, 0.010787f, 0.001586f, 0.010307f, + 0.003915f, 0.005148f, -0.002868f, -0.002519f, 0.013944f, -0.003247f, -0.003335f, 0.010395f, -0.006107f, -0.000602f, 0.001611f, -0.004571f, -0.005920f, 0.004600f, -0.006807f, -0.001334f, -0.008724f, -0.018884f, -0.001994f, -0.002874f, -0.000371f, -0.019673f, -0.007390f, -0.006005f, -0.004974f, 0.007397f, 0.019503f, -0.004935f, 0.006349f, 0.010141f, -0.002708f, 0.001914f, 0.001836f, 0.001160f, -0.006940f, 0.007720f, -0.008835f, 0.002353f, 0.006558f, 0.018178f, 0.005799f, 0.005396f, 0.001773f, -0.000220f, 0.005602f, -0.006545f, 0.000067f, 0.003771f, 0.001899f, 0.000348f, -0.007231f, 0.004416f, 0.005484f, 0.005419f, -0.000896f, 0.004045f, 0.002309f, 0.001169f, 0.003780f, 0.002152f, 0.000563f, 0.002110f, -0.000381f, 0.001650f, 0.001163f, 0.001400f, 0.002241f, 0.002696f, 0.003256f, 0.002223f, 0.002228f, 0.002408f, -0.001262f, 0.002187f, -0.025364f, 0.002043f, 0.013887f, 0.007055f, -0.014156f, -0.001247f, 0.000837f, 0.003212f, 0.005412f, -0.000989f, -0.010985f, -0.010842f, 0.001819f, 0.017929f, 0.008761f, 0.010567f, 0.018364f, -0.012485f, 0.013146f, 0.023872f, -0.002062f, 0.005257f, + -0.013487f, 0.004522f, 0.005059f, -0.011852f, -0.006162f, -0.002679f, 0.005665f, -0.011970f, -0.015469f, 0.002837f, 0.001829f, -0.013522f, 0.001172f, 0.004081f, -0.002631f, 0.028348f, -0.001532f, -0.020319f, -0.001296f, 0.006844f, 0.016115f, 0.005789f, 0.007260f, -0.013069f, 0.003637f, 0.003965f, -0.011490f, -0.000877f, -0.001919f, 0.019662f, 0.012148f, -0.003400f, -0.006757f, -0.015435f, 0.006635f, 0.006032f, -0.009021f, -0.000420f, 0.003694f, 0.005889f, 0.006177f, -0.007908f, -0.000202f, -0.001806f, 0.018573f, -0.015700f, 0.001929f, -0.004164f, 0.016723f, -0.001299f, -0.004081f, -0.007106f, 0.002099f, -0.007349f, -0.017018f, 0.000379f, 0.012943f, 0.003782f, 0.008112f, 0.001933f, -0.006135f, -0.002525f, -0.003098f, 0.010937f, 0.004372f, -0.003078f, -0.000418f, 0.009929f, 0.007476f, -0.002904f, 0.001065f, 0.001500f, 0.002148f, -0.000268f, 0.004000f, 0.002707f, 0.002441f, 0.000185f, -0.001414f, -0.000709f, 0.000784f, -0.001502f, 0.000464f, -0.002066f, -0.000677f, 0.001578f, -0.005220f, -0.001289f, 0.009879f, 0.008670f, 0.003269f, -0.006666f, 0.001956f, 0.004050f, 0.030038f, 0.019665f, + 0.014994f, 0.020862f, 0.008618f, -0.002025f, 0.003083f, 0.007580f, -0.021164f, 0.010673f, 0.000374f, 0.011484f, -0.008515f, -0.004574f, -0.013652f, 0.003641f, 0.024143f, -0.023846f, -0.014960f, -0.025342f, 0.012714f, -0.005995f, 0.000794f, -0.011699f, 0.001459f, -0.004549f, -0.011445f, 0.004062f, 0.005568f, -0.018139f, -0.002473f, 0.002908f, -0.003975f, 0.009089f, -0.025905f, -0.012855f, 0.026397f, 0.002311f, -0.000522f, -0.002968f, 0.000872f, -0.013795f, -0.014334f, 0.000479f, -0.020830f, -0.005164f, 0.002017f, 0.005184f, -0.009006f, -0.002439f, 0.025687f, -0.002054f, 0.008957f, 0.018778f, -0.017955f, -0.006610f, 0.004099f, 0.004136f, 0.003339f, -0.005887f, -0.012873f, 0.014223f, -0.001726f, -0.014043f, 0.009898f, -0.002869f, 0.002230f, 0.003393f, -0.007476f, -0.004876f, -0.003241f, -0.005988f, -0.008102f, -0.010016f, -0.009349f, -0.012190f, -0.003701f, -0.005405f, -0.001311f, -0.001953f, -0.000298f, 0.001123f, -0.004994f, -0.004273f, 0.002618f, 0.002840f, 0.005218f, -0.000731f, -0.002356f, -0.007367f, -0.002136f, -0.008452f, -0.005295f, -0.001518f, 0.001391f, -0.001022f, 0.000903f, -0.002470f, + -0.001376f, 0.005523f, 0.002118f, 0.003694f, -0.004215f, 0.000611f, 0.000781f, 0.001115f, -0.008351f, 0.000159f, 0.002231f, -0.000438f, 0.004146f, -0.001138f, -0.001472f, 0.000443f, 0.001161f, -0.049976f, -0.027392f, 0.022175f, -0.008403f, -0.010841f, 0.013839f, 0.011562f, -0.021004f, -0.028959f, -0.008966f, -0.010517f, -0.010564f, -0.002200f, -0.019521f, -0.014486f, 0.007442f, 0.000526f, -0.026343f, -0.029525f, -0.016196f, -0.008271f, -0.001275f, 0.014751f, -0.000878f, -0.011180f, 0.008432f, -0.024618f, 0.000932f, -0.001384f, 0.001231f, 0.008270f, 0.004866f, -0.018002f, -0.013175f, 0.010416f, 0.003913f, 0.039385f, 0.009898f, -0.013434f, 0.001961f, 0.001053f, 0.000564f, 0.010228f, 0.002155f, 0.004138f, -0.003925f, -0.008940f, 0.002726f, -0.023014f, -0.004121f, -0.010160f, -0.011921f, 0.002406f, -0.018004f, 0.020909f, -0.002596f, 0.008613f, 0.015239f, 0.004268f, 0.008134f, -0.001201f, -0.009692f, -0.000627f, -0.001145f, -0.012406f, 0.015979f, -0.006778f, 0.028345f, -0.001130f, -0.000536f, 0.001118f, -0.007220f, -0.015483f, 0.004872f, -0.012188f, -0.004759f, 0.016353f, -0.021254f, -0.021179f, + 0.014176f, 0.013211f, 0.011586f, -0.017968f, 0.012940f, 0.005183f, 0.007587f, -0.000704f, 0.003379f, 0.003334f, 0.010084f, 0.004107f, 0.002554f, 0.007257f, -0.000885f, -0.000603f, -0.005972f, -0.004862f, -0.000873f, 0.004905f, -0.006421f, 0.000762f, -0.000648f, -0.003963f, -0.002261f, 0.001551f, -0.008293f, -0.005246f, -0.006160f, -0.001212f, 0.002813f, -0.000149f, 0.006329f, -0.002187f, 0.006616f, 0.000471f, 0.002526f, 0.000943f, 0.005148f, -0.004003f, -0.003067f, 0.005725f, -0.002537f, 0.000709f, 0.000543f, 0.010035f, 0.036943f, -0.020639f, 0.017647f, 0.007187f, 0.013182f, -0.005269f, -0.019951f, 0.002836f, -0.005136f, -0.018783f, 0.038132f, -0.002702f, -0.010424f, -0.037479f, 0.023167f, 0.006377f, -0.000270f, -0.014012f, -0.016051f, 0.000419f, 0.038740f, 0.014354f, -0.001343f, -0.003818f, -0.016395f, -0.013491f, 0.011305f, 0.004922f, -0.012782f, -0.009122f, 0.013637f, 0.003360f, -0.000382f, 0.011569f, 0.017993f, 0.002798f, 0.023699f, 0.026673f, 0.016375f, -0.006155f, 0.006067f, 0.002177f, 0.004593f, 0.013918f, -0.019578f, 0.020800f, -0.001240f, -0.010575f, -0.015831f, 0.000097f, + 0.013857f, 0.009567f, -0.018714f, 0.004149f, 0.015153f, 0.002301f, -0.013494f, -0.029546f, -0.026670f, 0.007093f, 0.012099f, 0.002007f, -0.010209f, -0.001379f, 0.021687f, -0.009840f, -0.015983f, -0.031194f, 0.003522f, 0.006074f, -0.023057f, 0.008764f, 0.023505f, -0.010571f, 0.018336f, 0.006314f, -0.021329f, -0.015960f, 0.001909f, 0.022172f, -0.002063f, 0.023293f, -0.003801f, -0.008125f, 0.005139f, 0.011893f, 0.003403f, -0.003939f, -0.006001f, 0.004023f, 0.010761f, 0.008571f, 0.001693f, 0.013856f, 0.002812f, 0.009953f, 0.002718f, 0.013597f, 0.002303f, 0.008413f, 0.000121f, 0.006732f, 0.003866f, -0.003303f, -0.009648f, 0.000897f, -0.011323f, -0.001576f, -0.004475f, 0.001862f, -0.001245f, -0.000400f, -0.010015f, -0.000919f, 0.005093f, -0.004983f, 0.000952f, -0.001172f, 0.001016f, -0.000634f, -0.007153f, 0.001185f, -0.001284f, 0.044604f, 0.029133f, 0.006761f, -0.009027f, -0.004658f, -0.006340f, -0.030442f, -0.012466f, -0.000290f, 0.019391f, -0.013934f, -0.007969f, -0.006458f, 0.000222f, 0.032288f, -0.025127f, -0.006590f, -0.001498f, 0.015222f, -0.005343f, -0.018361f, -0.031048f, 0.011191f, + -0.021488f, -0.009658f, -0.013448f, -0.014302f, 0.004421f, -0.024101f, -0.011887f, 0.021626f, 0.032075f, 0.001615f, -0.020267f, -0.017822f, 0.029572f, -0.003171f, -0.016202f, 0.031147f, 0.000845f, 0.002063f, 0.001190f, -0.033643f, 0.013638f, -0.012360f, 0.012173f, 0.011532f, -0.023100f, -0.002332f, -0.023430f, 0.009237f, -0.022725f, -0.003669f, 0.009356f, 0.013040f, -0.007670f, 0.008001f, -0.027552f, 0.019079f, -0.002251f, 0.013081f, 0.010700f, 0.008023f, -0.006209f, -0.005542f, 0.027230f, -0.018708f, 0.013465f, -0.004433f, -0.023404f, -0.013835f, -0.001674f, 0.024801f, -0.014189f, 0.011744f, 0.003184f, -0.007342f, 0.000195f, -0.027147f, 0.034505f, 0.021532f, -0.004212f, -0.009169f, 0.016848f, 0.007616f, -0.005117f, -0.008621f, 0.001798f, -0.005654f, 0.008624f, -0.001547f, 0.004477f, 0.014652f, 0.005045f, 0.011665f, -0.000138f, 0.004333f, 0.001568f, -0.001818f, 0.000182f, -0.000752f, 0.009716f, 0.004191f, 0.013529f, 0.002610f, -0.007773f, 0.010281f, -0.004108f, 0.000045f, 0.007353f, -0.006856f, -0.002498f, -0.003455f, -0.003189f, 0.006515f, 0.003642f, 0.003557f, 0.005327f, -0.000284f, + -0.001660f, 0.013095f, -0.004416f, -0.004018f, 0.017074f, 0.003655f, -0.011845f, -0.026097f, -0.001771f, -0.034016f, 0.005585f, 0.003386f, 0.016472f, -0.013389f, -0.003603f, 0.009234f, 0.007087f, 0.010125f, -0.023566f, 0.033192f, 0.022987f, 0.004621f, 0.016912f, -0.007444f, -0.033431f, 0.008143f, -0.014263f, -0.015181f, 0.015282f, 0.038418f, 0.006348f, -0.010180f, -0.014130f, -0.030228f, -0.000251f, 0.001749f, 0.046668f, -0.018165f, -0.001050f, 0.001735f, -0.001740f, -0.027977f, -0.032250f, 0.025611f, 0.000687f, 0.014696f, -0.004416f, -0.035849f, -0.021140f, 0.003216f, -0.006356f, -0.007325f, -0.010633f, 0.024003f, -0.005301f, 0.015707f, -0.016893f, 0.033305f, -0.039245f, 0.019606f, 0.019900f, 0.012375f, 0.010385f, 0.010089f, 0.030519f, 0.016159f, -0.002529f, 0.006900f, -0.000048f, 0.030770f, 0.045465f, -0.004953f, 0.003369f, -0.013124f, 0.018861f, 0.031045f, -0.021298f, 0.006778f, -0.053228f, 0.034927f, 0.035462f, 0.024171f, 0.032973f, -0.014836f, -0.026811f, -0.001586f, -0.004120f, -0.007525f, -0.005832f, -0.015602f, -0.011323f, -0.005568f, -0.001649f, -0.008587f, 0.005091f, 0.010046f, + 0.003541f, -0.014644f, 0.002756f, -0.007996f, -0.008971f, -0.005210f, 0.006023f, 0.006076f, -0.002829f, -0.003411f, -0.001511f, -0.002283f, 0.001427f, -0.014163f, 0.004642f, 0.002407f, 0.009206f, 0.002406f, -0.000785f, -0.000112f, 0.001904f, 0.008512f, 0.002691f, -0.007185f, 0.005843f, 0.000313f, 0.000738f, -0.038529f, -0.005697f, -0.049276f, -0.025280f, 0.019366f, -0.020170f, -0.043824f, 0.004068f, -0.023639f, 0.001087f, 0.000834f, -0.028098f, -0.026720f, 0.012076f, 0.025778f, 0.007782f, -0.030006f, 0.014347f, -0.033749f, -0.011830f, -0.012442f, 0.010559f, -0.013875f, -0.006320f, 0.016201f, 0.002770f, -0.011114f, -0.024017f, 0.025419f, 0.024657f, 0.032036f, 0.004185f, -0.003576f, 0.001134f, 0.010261f, -0.002423f, 0.013135f, -0.014458f, 0.017273f, -0.006802f, 0.019900f, 0.015966f, 0.012012f, -0.005784f, 0.000823f, -0.030970f, 0.010538f, -0.007797f, 0.023293f, 0.004239f, -0.054152f, 0.008319f, 0.026688f, 0.035903f, -0.020654f, -0.028212f, 0.033766f, 0.015331f, 0.023740f, -0.042293f, 0.020910f, 0.052948f, 0.055769f, 0.003551f, 0.001324f, 0.031737f, -0.021966f, -0.029267f, 0.018748f, + -0.032403f, 0.012166f, -0.015090f, -0.012754f, -0.007156f, -0.069800f, -0.040304f, -0.033995f, 0.025080f, 0.009514f, 0.007053f, -0.024797f, -0.010083f, -0.018734f, -0.003544f, -0.010065f, 0.027412f, 0.006513f, -0.010899f, -0.024354f, -0.005420f, 0.015768f, -0.002515f, -0.006737f, 0.004846f, 0.016506f, -0.005875f, -0.009755f, -0.004674f, -0.003620f, -0.001120f, 0.012838f, 0.012900f, 0.011206f, -0.011320f, 0.014688f, -0.000745f, 0.004198f, 0.016793f, -0.007545f, -0.007572f, 0.014640f, 0.026282f, -0.006146f, -0.008579f, -0.004185f, 0.003164f, -0.004738f, -0.018103f, 0.002924f, 0.013224f, 0.003567f, -0.018229f, -0.017461f, 0.008237f, 0.005921f, -0.000974f, -0.001117f, -0.003185f, -0.012984f, -0.008890f, -0.029000f, -0.055696f, 0.042586f, 0.004447f, 0.014309f, -0.007232f, 0.030163f, 0.000781f, -0.025697f, 0.019875f, 0.008113f, -0.009128f, -0.015505f, -0.012188f, 0.003848f, 0.007242f, 0.026716f, -0.015228f, 0.020969f, 0.006648f, 0.038087f, -0.054657f, -0.014648f, -0.008685f, 0.007048f, 0.022276f, 0.032374f, 0.007322f, -0.026269f, 0.017720f, 0.025472f, 0.021404f, -0.005983f, 0.007449f, 0.001554f, + -0.009004f, -0.003664f, 0.001520f, 0.008249f, 0.002933f, 0.018833f, 0.003071f, -0.023740f, 0.022152f, -0.024615f, -0.031470f, 0.004892f, 0.022690f, -0.011049f, -0.008194f, 0.008264f, 0.011053f, 0.019593f, -0.011229f, 0.009290f, 0.044206f, -0.017657f, -0.047062f, -0.060903f, -0.030823f, -0.041267f, 0.018698f, 0.035812f, 0.022859f, 0.008751f, 0.021498f, 0.012659f, 0.023764f, -0.020392f, 0.026867f, 0.013978f, 0.010869f, 0.028044f, 0.036399f, -0.011353f, -0.008196f, 0.009952f, -0.002454f, 0.032799f, 0.012647f, -0.005024f, 0.005471f, -0.040040f, -0.028061f, 0.005533f, -0.001648f, 0.007101f, 0.002627f, 0.008395f, -0.007558f, 0.021078f, -0.011225f, -0.012898f, -0.012521f, -0.021074f, -0.007723f, -0.004187f, 0.006830f, 0.005596f, -0.003240f, -0.018109f, -0.001145f, 0.005961f, 0.001922f, -0.007287f, 0.004187f, 0.000222f, 0.006891f, -0.007598f, 0.003009f, 0.001425f, 0.008327f, -0.004061f, 0.012868f, -0.008065f, -0.009358f, 0.002714f, -0.001684f, -0.006804f, 0.002035f, 0.008928f, 0.000651f, -0.001419f, 0.055682f, 0.005434f, 0.008695f, -0.011518f, 0.020190f, -0.063694f, -0.028192f, -0.043518f, + -0.045019f, 0.017899f, -0.039295f, 0.038617f, 0.043844f, 0.001972f, 0.009455f, -0.006715f, 0.007967f, -0.041645f, 0.017063f, 0.046176f, -0.026358f, -0.053630f, 0.007021f, -0.020144f, -0.017202f, -0.052314f, 0.008980f, 0.019266f, -0.000297f, -0.007066f, 0.016742f, -0.029822f, -0.005075f, 0.019460f, -0.010818f, -0.026430f, 0.003093f, -0.013177f, 0.027240f, -0.018092f, -0.010180f, 0.025647f, 0.022104f, 0.047332f, 0.006138f, 0.011447f, -0.004485f, 0.012727f, 0.016712f, 0.029247f, -0.008567f, -0.000938f, -0.018312f, 0.038574f, -0.048745f, 0.052224f, 0.001705f, -0.020796f, 0.024303f, -0.018963f, -0.014136f, 0.048028f, -0.069486f, 0.011318f, -0.014798f, 0.013570f, -0.027070f, 0.012956f, 0.027317f, -0.014239f, -0.002728f, -0.007318f, -0.011672f, -0.006162f, 0.050901f, -0.057967f, -0.019995f, 0.097428f, -0.036886f, -0.043019f, 0.041970f, 0.025221f, 0.027940f, -0.024555f, 0.001723f, -0.024411f, -0.013877f, -0.003852f, -0.028080f, 0.006073f, 0.003533f, -0.007290f, 0.009801f, 0.008939f, -0.012858f, -0.023734f, -0.006335f, -0.002034f, 0.009070f, -0.020956f, -0.014931f, 0.000510f, -0.002348f, 0.005233f, + 0.012792f, 0.030980f, -0.014378f, -0.000754f, -0.003667f, -0.003295f, 0.008648f, 0.003452f, -0.018736f, -0.013979f, 0.014540f, -0.012072f, 0.005309f, 0.003773f, -0.011537f, 0.004226f, -0.002883f, -0.018929f, -0.015787f, 0.009203f, 0.005765f, -0.002913f, -0.000673f, 0.011735f, -0.027933f, -0.042606f, 0.003953f, -0.016029f, -0.014706f, -0.023898f, -0.030392f, 0.038272f, 0.016183f, 0.002617f, 0.017674f, 0.045294f, 0.026457f, -0.002895f, 0.009013f, 0.030516f, 0.038503f, -0.034147f, 0.015854f, 0.032587f, 0.013914f, 0.012068f, 0.044501f, 0.021735f, 0.009146f, -0.001160f, 0.019931f, -0.002045f, 0.022579f, 0.019002f, 0.010118f, -0.020717f, 0.039355f, -0.032283f, -0.004228f, 0.049680f, 0.048756f, -0.011441f, -0.043530f, 0.016535f, -0.000821f, 0.042654f, 0.072893f, 0.016533f, -0.011345f, 0.005379f, -0.042068f, -0.004738f, -0.011227f, -0.008797f, 0.000692f, 0.037494f, -0.016144f, 0.016622f, 0.044713f, 0.007834f, -0.041636f, 0.027673f, -0.002261f, 0.017683f, 0.042011f, 0.059573f, -0.016880f, -0.015522f, -0.005224f, -0.046800f, -0.068976f, 0.002103f, -0.031439f, -0.004846f, -0.038085f, -0.003674f, + 0.001099f, 0.005397f, 0.028058f, -0.000564f, -0.019738f, -0.032392f, 0.023724f, -0.009832f, 0.020286f, 0.000987f, 0.037884f, 0.014327f, 0.013918f, 0.000381f, -0.011914f, 0.021582f, -0.016380f, -0.018617f, -0.005779f, -0.013936f, -0.005585f, 0.001333f, 0.001420f, -0.004846f, 0.005762f, 0.008624f, 0.000615f, -0.001904f, 0.010986f, -0.009255f, -0.013550f, 0.008496f, 0.009674f, 0.002203f, -0.011717f, -0.013759f, -0.008235f, 0.011552f, 0.015139f, 0.002252f, -0.002194f, 0.017090f, 0.004565f, 0.008291f, 0.006942f, 0.012296f, 0.003355f, -0.001956f, -0.008920f, 0.005098f, 0.009561f, -0.019462f, 0.015593f, 0.046560f, -0.087285f, 0.048044f, -0.036791f, -0.085984f, -0.025529f, -0.021648f, -0.003108f, -0.019818f, 0.010379f, -0.023770f, -0.053355f, -0.032175f, -0.016002f, -0.004852f, 0.006039f, -0.021934f, 0.021375f, 0.041763f, 0.001475f, -0.002626f, 0.011369f, 0.002560f, -0.007873f, -0.015514f, -0.008828f, 0.011283f, 0.012328f, -0.003728f, 0.011714f, 0.051276f, 0.014027f, -0.015031f, -0.050998f, -0.008165f, 0.035849f, -0.043826f, -0.020700f, -0.016725f, 0.000411f, -0.003396f, 0.027498f, -0.009172f, + 0.003183f, 0.037957f, 0.013441f, 0.042109f, -0.006075f, -0.019985f, -0.009288f, -0.010900f, -0.011086f, 0.020260f, 0.002052f, 0.013666f, 0.025547f, -0.045305f, 0.006476f, -0.012069f, -0.028308f, -0.021333f, 0.043986f, 0.031701f, 0.001429f, -0.021687f, 0.008749f, 0.018523f, 0.001751f, 0.012774f, -0.030540f, -0.075141f, -0.034939f, -0.027604f, 0.027274f, 0.002639f, -0.003652f, -0.012820f, 0.005184f, -0.008616f, -0.023903f, -0.024743f, -0.013016f, 0.030188f, 0.022730f, -0.034056f, -0.042546f, -0.016727f, 0.002755f, 0.025521f, 0.010207f, -0.008387f, -0.011564f, -0.008905f, 0.005789f, -0.018981f, 0.002602f, -0.013031f, 0.000878f, 0.019187f, 0.020496f, 0.005276f, -0.010918f, 0.006465f, 0.014711f, -0.000712f, -0.003415f, 0.010825f, -0.015414f, 0.020939f, 0.018772f, 0.007150f, -0.000566f, -0.001115f, -0.002349f, 0.017506f, -0.007180f, -0.009617f, -0.010919f, -0.015480f, -0.015161f, 0.004551f, -0.005736f, 0.006194f, -0.004510f, 0.002958f, 0.010977f, -0.005767f, -0.011028f, -0.015976f, -0.004585f, 0.007010f, -0.011396f, 0.024482f, -0.033717f, 0.040687f, -0.002611f, -0.066148f, 0.014060f, -0.032263f, + -0.005838f, -0.005455f, -0.007057f, -0.042394f, 0.013795f, 0.001454f, 0.033705f, -0.071985f, 0.001825f, 0.034396f, 0.004895f, -0.017650f, -0.035401f, -0.003551f, 0.021330f, 0.030006f, -0.024903f, -0.009867f, 0.017240f, 0.034387f, 0.032722f, -0.031753f, -0.005708f, -0.051005f, 0.024021f, 0.024724f, 0.016387f, -0.015097f, -0.003343f, -0.014456f, -0.004764f, -0.017539f, 0.005403f, 0.035844f, -0.013026f, -0.015235f, -0.012030f, -0.021591f, 0.042132f, 0.034939f, -0.002968f, 0.049527f, -0.001771f, 0.017064f, -0.043951f, 0.035659f, 0.016711f, -0.050842f, -0.015691f, 0.056388f, 0.024203f, 0.014645f, 0.011590f, -0.027816f, -0.020788f, -0.029771f, 0.050128f, -0.026612f, 0.038807f, 0.038823f, -0.044678f, 0.103373f, -0.021955f, 0.063752f, 0.003198f, -0.015593f, -0.027580f, 0.047642f, 0.019103f, -0.038676f, -0.022713f, -0.082013f, 0.032726f, -0.012124f, 0.037570f, -0.050896f, 0.056041f, -0.043761f, 0.016723f, -0.017611f, -0.012540f, 0.035628f, 0.003666f, 0.002346f, 0.020646f, 0.013220f, -0.009192f, 0.022964f, -0.002782f, 0.005942f, -0.016641f, 0.002140f, -0.002170f, -0.011785f, -0.016762f, -0.000564f, + -0.018635f, 0.007788f, 0.008137f, -0.005584f, 0.016241f, -0.007032f, -0.009700f, -0.014821f, 0.009554f, 0.000734f, -0.002266f, -0.028111f, 0.012135f, -0.006627f, -0.032389f, -0.011582f, 0.009209f, -0.010476f, -0.016831f, 0.009879f, -0.009208f, 0.007906f, -0.017176f, 0.006673f, -0.017526f, -0.004397f, -0.002814f, 0.008003f, -0.004324f, 0.000291f, -0.005899f, -0.007432f, 0.024188f, 0.043743f, 0.002739f, -0.035139f, 0.016623f, -0.068637f, -0.019231f, -0.062265f, -0.088110f, 0.003869f, -0.034308f, 0.012135f, -0.007180f, -0.012795f, -0.033935f, -0.021957f, 0.018866f, 0.053533f, -0.044508f, -0.008479f, -0.076191f, -0.065379f, 0.017643f, 0.027525f, -0.042114f, -0.042462f, 0.002105f, 0.010587f, -0.070796f, 0.004715f, 0.000894f, 0.037458f, -0.032102f, 0.002376f, 0.029642f, -0.018702f, -0.037123f, -0.039870f, -0.020337f, -0.036261f, -0.031127f, -0.037892f, 0.053911f, -0.068227f, -0.043503f, 0.063629f, -0.002570f, 0.018683f, -0.052972f, -0.008128f, -0.015500f, 0.002410f, 0.087715f, -0.011482f, -0.002283f, 0.009753f, 0.040811f, 0.002001f, -0.039638f, -0.016286f, -0.028729f, 0.010550f, 0.105086f, 0.021592f, + -0.037760f, 0.080653f, 0.056986f, -0.050040f, 0.058796f, 0.098418f, 0.000314f, -0.036927f, 0.065736f, -0.010443f, 0.069190f, 0.063887f, 0.004768f, -0.002190f, -0.019225f, 0.044936f, 0.035164f, 0.021388f, -0.037703f, -0.011300f, -0.024506f, 0.056639f, -0.007516f, -0.037115f, -0.019070f, -0.037314f, -0.016986f, 0.039097f, 0.003870f, -0.018955f, -0.007251f, -0.023443f, -0.004549f, 0.035075f, -0.016815f, 0.009443f, -0.003813f, -0.031353f, 0.034733f, 0.005334f, 0.013715f, 0.018134f, -0.023013f, 0.008099f, 0.031916f, -0.004665f, 0.000934f, -0.016210f, -0.000399f, 0.003764f, -0.010944f, -0.008641f, 0.005796f, 0.025128f, -0.015688f, 0.010648f, -0.020837f, -0.008630f, 0.000956f, -0.005656f, 0.023323f, -0.007868f, 0.000775f, 0.003470f, 0.008385f, 0.002005f, -0.011472f, -0.001425f, -0.006590f, 0.049912f, -0.125626f, -0.074644f, -0.081853f, -0.027115f, -0.054744f, 0.067857f, 0.024817f, 0.055747f, -0.008815f, -0.105970f, -0.016891f, 0.017839f, 0.072653f, -0.002481f, 0.016374f, 0.067855f, -0.025842f, -0.048211f, 0.004310f, -0.002753f, 0.084387f, 0.055857f, -0.028489f, -0.038132f, 0.089654f, 0.006833f, + 0.044484f, 0.022265f, 0.083553f, 0.073285f, 0.055378f, 0.006373f, -0.048414f, -0.025502f, -0.037202f, 0.070860f, -0.034705f, -0.047778f, -0.027172f, 0.002932f, -0.002940f, 0.031517f, -0.031577f, 0.011540f, -0.144206f, 0.016403f, 0.021197f, 0.023863f, -0.060967f, -0.055228f, 0.016008f, 0.050733f, -0.062954f, 0.024343f, -0.036316f, -0.027151f, -0.042706f, -0.003494f, 0.042809f, -0.029288f, 0.047130f, -0.012114f, 0.017689f, -0.089112f, -0.058689f, -0.002100f, 0.046139f, 0.033299f, -0.066270f, -0.069898f, -0.033852f, 0.006667f, 0.072863f, 0.030641f, -0.008542f, -0.052098f, -0.061590f, -0.020436f, 0.011119f, 0.052512f, -0.006102f, 0.017392f, 0.033677f, -0.013497f, 0.011179f, -0.034874f, 0.020033f, 0.012308f, -0.023105f, -0.018002f, 0.000305f, 0.026848f, -0.027533f, -0.001180f, 0.041293f, 0.006569f, 0.004596f, -0.000186f, -0.013956f, -0.029424f, 0.005742f, -0.032683f, 0.036318f, 0.032378f, 0.023027f, 0.002628f, -0.004856f, -0.038334f, 0.022169f, -0.008055f, 0.042513f, -0.011171f, -0.052102f, -0.031370f, -0.008177f, 0.048366f, 0.011774f, -0.011004f, -0.007005f, -0.039918f, -0.021043f, -0.016480f, + -0.004463f, 0.021410f, 0.019135f, -0.040404f, -0.024068f, -0.025083f, -0.025991f, -0.009471f, 0.005186f, -0.004264f, -0.015873f, -0.025157f, -0.027176f, 0.002261f, -0.003717f, -0.013323f, 0.023534f, 0.160223f, 0.017735f, -0.087827f, -0.192797f, -0.019118f, 0.116461f, 0.027411f, 0.051549f, -0.006861f, 0.071342f, -0.013352f, 0.032093f, -0.017822f, 0.040977f, 0.054387f, 0.031136f, -0.028735f, -0.062821f, 0.073832f, 0.086892f, -0.020872f, -0.083541f, -0.053214f, 0.010106f, 0.047768f, 0.017639f, 0.016093f, 0.004359f, 0.011012f, 0.006874f, 0.010894f, -0.015480f, -0.099828f, 0.000606f, 0.059148f, 0.047865f, -0.020919f, 0.005873f, 0.035798f, 0.082994f, 0.048701f, 0.041256f, -0.049824f, -0.032597f, -0.009820f, -0.007806f, -0.074791f, 0.052925f, 0.029218f, 0.054925f, 0.108476f, -0.055557f, -0.037837f, -0.004040f, -0.032031f, -0.025411f, -0.049609f, 0.086309f, -0.053237f, -0.054805f, -0.058862f, -0.019027f, 0.107499f, 0.028836f, 0.041000f, -0.001387f, -0.010581f, -0.024290f, 0.066321f, 0.055655f, -0.029466f, -0.062737f, 0.020621f, -0.007450f, 0.024883f, -0.058800f, -0.024589f, -0.033861f, -0.046552f, + 0.028386f, 0.043668f, 0.009219f, 0.000437f, -0.023241f, 0.012113f, -0.008622f, 0.040514f, 0.004100f, -0.015573f, -0.007542f, 0.012684f, 0.027525f, 0.028277f, -0.016443f, 0.017114f, 0.010247f, 0.008310f, -0.000715f, -0.032596f, -0.003494f, -0.026656f, -0.009564f, 0.000337f, 0.004839f, 0.007497f, 0.009662f, 0.009430f, 0.027906f, 0.039401f, 0.036722f, -0.004338f, -0.008477f, 0.003623f, -0.017335f, 0.021315f, -0.024571f, -0.003948f, 0.020628f, -0.002144f, -0.004632f, -0.041423f, 0.020537f, -0.041311f, 0.013718f, -0.009935f, 0.006614f, -0.004376f, 0.004788f, -0.002731f, -0.025005f, 0.013267f, 0.012516f, -0.002885f, 0.008427f, -0.002200f, 0.007170f, -0.004070f, -0.006647f, -0.001947f, -0.002235f, 0.000722f, -0.001476f, 0.000820f, 0.000708f, -0.009116f, -0.003978f, -0.002212f, 0.005146f, 0.001173f, -0.002672f, -0.005279f, -0.005560f, -0.000279f, 0.001270f, -0.002679f, 0.000099f, -0.003515f, -0.001077f, -0.003923f, -0.046138f, 0.003610f, 0.124484f, 0.094912f, 0.015428f, 0.006717f, -0.066864f, -0.130305f, -0.113034f, -0.056141f, 0.093571f, 0.101243f, 0.106195f, 0.057969f, -0.015067f, -0.067979f, + -0.061780f, -0.041520f, 0.027041f, 0.040614f, 0.072797f, 0.005928f, -0.054631f, -0.047315f, -0.009756f, -0.047411f, -0.021310f, 0.009439f, 0.075358f, 0.106140f, 0.069695f, 0.032244f, 0.030749f, -0.067814f, -0.007530f, -0.135535f, -0.150187f, -0.095169f, -0.045034f, -0.042208f, 0.070792f, 0.109415f, 0.122621f, 0.109613f, 0.096098f, 0.038761f, 0.006842f, -0.047122f, -0.012333f, -0.075370f, -0.131622f, -0.011865f, 0.012690f, 0.011886f, 0.044212f, 0.025165f, 0.044849f, -0.148820f, -0.080396f, -0.053850f, -0.085249f, -0.037370f, 0.063832f, -0.038875f, 0.043127f, 0.004850f, -0.038607f, 0.030435f, -0.032188f, 0.034336f, 0.041696f, -0.032555f, -0.063020f, -0.132063f, -0.126474f, -0.095868f, 0.046857f, 0.015192f, -0.017700f, 0.023306f, 0.007314f, -0.000740f, -0.060120f, -0.043789f, -0.112270f, -0.038628f, -0.041085f, -0.005789f, 0.082916f, 0.086891f, 0.013392f, 0.044238f, -0.026813f, -0.062422f, -0.109183f, -0.073596f, -0.067254f, -0.003715f, 0.034052f, 0.017823f, 0.027857f, 0.028039f, -0.019679f, 0.016439f, -0.018522f, 0.017093f, 0.005191f, -0.002097f, -0.003433f, 0.013845f, 0.014094f, 0.027714f, + -0.006044f, -0.008358f, 0.027943f, 0.024080f, 0.005522f, -0.010208f, 0.021904f, -0.222231f, -0.113312f, -0.059325f, 0.074965f, 0.017128f, 0.285121f, 0.291806f, 0.220356f, 0.284497f, 0.298538f, 0.270846f, 0.194800f, 0.176424f, 0.196205f, 0.077832f, -0.011397f, -0.121426f, -0.187160f, -0.259147f, -0.251374f, -0.375234f, -0.227349f, -0.148208f, -0.117359f, -0.167385f, -0.087756f, -0.024268f, -0.125097f, -0.097461f, -0.102547f, -0.023373f, -0.061492f, -0.022118f, -0.083333f, -0.042569f, 0.050034f, 0.051451f, 0.015635f, -0.015558f, 0.054507f, 0.043840f, -0.126202f, 0.026160f, 0.085699f, 0.187035f, 0.137500f, 0.178065f, 0.073308f, 0.070694f, 0.297068f, 0.160629f, 0.303990f, 0.101616f, 0.285120f, 0.196606f, 0.248957f, 0.335394f, 0.318008f, 0.257602f, 0.289607f, 0.321400f, 0.350106f, 0.298742f, 0.345119f, 0.235235f, 0.350065f, 0.280819f, 0.249451f, 0.265665f, 0.145309f, 0.297430f, 0.144171f, 0.087283f, -0.109235f, 0.007136f, -0.161467f, -0.181781f, -0.277701f, -0.328166f, -0.504122f, -0.492519f, -0.464995f, -0.435067f, -0.409866f, -0.346590f, -0.422600f, -0.520425f, -0.513039f, -0.425761f, + -0.450463f, -0.423828f, -0.425086f, -0.363005f, -0.395098f, -0.379059f, -0.282606f, -0.312342f, -0.239815f, -0.224178f, -0.206476f, -0.131838f, -0.170092f, -0.038962f, -0.063198f, 0.028992f, 0.039480f, 0.123737f, 0.183310f, 0.191895f, 0.221852f, 0.196800f, 0.296908f, 0.336337f, 0.333461f, 0.385140f, 0.402448f, 0.398528f, 0.304036f, 0.271222f, 0.238206f, 0.220615f, 0.214999f, 0.220478f, 0.207410f, 0.157691f, 0.101704f, 0.115314f, 0.089239f, 0.069174f, 0.046221f, -0.036227f, -0.046909f, -0.049553f, -0.060392f, -0.074034f, -0.083122f, -0.058807f, -0.064491f, -0.051865f, -0.052717f, -0.046031f, -0.033083f, -0.039891f, -0.032568f, -0.031966f, -0.038794f, -0.036048f, -0.039764f, -0.031794f, -0.026134f, -0.035274f, -0.040287f, -0.018333f, -0.008959f, -0.012630f, -0.011381f, -0.002221f, -0.003051f, -0.006890f, -0.007137f, 0.002994f, 0.014184f, 0.015016f, 0.015497f, 0.015411f, 0.014476f, 0.020568f, 0.021677f, 0.021804f, 0.015012f, 0.010608f, 0.008200f, 0.013707f, 0.014765f, 0.008746f, 0.002458f, 0.002927f, -0.001934f, 0.006308f, 0.004969f, 0.005228f, 0.003786f, 0.005244f, 0.004422f, 0.004419f, + 0.010080f, 0.020473f, 0.014231f, 0.014951f, 0.013249f, 0.016498f, 0.015464f, 0.011830f, 0.007431f, 0.007321f, 0.003240f, 0.002788f, -0.004008f, -0.007779f, -0.014667f, -0.013410f, -0.021740f, -0.027109f, -0.029483f, -0.030441f, -0.035267f, -0.035134f, -0.036965f, -0.036481f, -0.035749f, -0.038139f, -0.038881f, -0.037247f, -0.033581f, -0.029773f, -0.027585f, -0.019965f, -0.018336f, -0.015118f, -0.014570f, -0.007194f, -0.004565f, -0.000040f, 0.001958f, 0.005141f, 0.006043f, 0.009922f, 0.010489f, 0.011333f, 0.008801f, 0.009171f, 0.006905f, 0.006820f, 0.004413f, 0.004483f, 0.002400f, 0.002545f, 0.000679f, 0.000993f}, + {-0.014287f, -0.028302f, -0.004948f, 0.000375f, -0.006480f, -0.013320f, -0.004390f, 0.009758f, -0.015657f, -0.008654f, -0.005181f, -0.003069f, 0.004978f, -0.002239f, 0.005542f, 0.002532f, 0.004854f, -0.000543f, 0.006008f, -0.005241f, 0.000981f, -0.002301f, 0.001139f, 0.015105f, -0.003212f, -0.000933f, -0.007486f, 0.009336f, 0.005800f, 0.004491f, 0.011655f, -0.005960f, -0.003383f, 0.003983f, 0.010436f, -0.002817f, -0.000693f, -0.008424f, -0.009224f, -0.006173f, 0.006592f, -0.008193f, -0.007021f, -0.000888f, 0.009388f, -0.012701f, -0.002698f, -0.010612f, -0.005144f, -0.003037f, 0.001464f, -0.000956f, -0.007603f, 0.009752f, 0.001668f, 0.008776f, -0.003544f, -0.002225f, -0.010930f, -0.000237f, -0.003831f, -0.004123f, 0.006306f, 0.003542f, -0.001954f, 0.003392f, 0.006978f, -0.001985f, 0.003001f, -0.004993f, -0.002878f, -0.001207f, -0.004705f, 0.004184f, 0.001461f, 0.003186f, -0.007467f, 0.005365f, 0.003093f, 0.012101f, 0.007201f, -0.001980f, -0.007684f, -0.000626f, 0.001680f, 0.000958f, 0.002396f, -0.000354f, -0.002600f, 0.000107f, -0.001765f, 0.000017f, -0.002137f, 0.000767f, -0.002079f, -0.000136f, + 0.002336f, 0.000790f, 0.001208f, -0.001488f, -0.001043f, 0.001108f, 0.001606f, 0.000731f, -0.000234f, 0.000122f, -0.000030f, 0.001005f, -0.023314f, -0.008334f, 0.006682f, -0.006135f, -0.002792f, -0.002578f, 0.003142f, -0.001158f, -0.006162f, 0.009728f, 0.008656f, 0.002927f, -0.001106f, 0.004526f, -0.011973f, -0.001719f, -0.011832f, -0.005920f, 0.008702f, -0.001421f, 0.001541f, -0.001159f, -0.001368f, 0.000233f, 0.018224f, 0.016732f, 0.007446f, 0.008950f, 0.010554f, -0.002001f, -0.001227f, -0.003600f, 0.009312f, -0.000869f, -0.003547f, 0.002661f, -0.005440f, 0.003769f, 0.006701f, -0.003387f, 0.007556f, 0.008590f, 0.016667f, -0.006478f, -0.007874f, 0.007187f, -0.004316f, 0.000287f, 0.003507f, -0.009644f, 0.000577f, -0.005021f, -0.005692f, 0.012898f, 0.007544f, 0.009300f, -0.005291f, -0.006916f, 0.004891f, -0.008059f, 0.005694f, 0.024845f, 0.001396f, 0.001760f, 0.005565f, 0.002481f, 0.002281f, 0.014171f, -0.007555f, -0.001852f, 0.002585f, 0.001905f, -0.007033f, -0.005098f, -0.007179f, -0.003340f, -0.002628f, 0.006555f, -0.001111f, 0.006585f, 0.006672f, -0.006630f, -0.007175f, -0.001776f, + 0.004520f, 0.006357f, -0.007522f, -0.001387f, -0.002240f, -0.005089f, -0.000636f, -0.004815f, 0.001269f, -0.000246f, 0.002609f, -0.001415f, 0.000998f, -0.001817f, -0.000489f, -0.001376f, 0.001143f, -0.006768f, 0.007331f, 0.011906f, -0.005739f, 0.005911f, 0.018647f, 0.006271f, 0.004235f, -0.013050f, 0.010789f, 0.002866f, -0.016862f, 0.007149f, -0.004764f, -0.010082f, 0.004025f, -0.001389f, 0.003877f, 0.009787f, -0.010308f, -0.010770f, -0.004842f, 0.014678f, 0.000368f, 0.007292f, 0.015141f, -0.022569f, -0.018258f, 0.002977f, 0.011085f, -0.008149f, 0.000678f, 0.015089f, 0.003847f, -0.001932f, -0.004574f, 0.018054f, 0.002169f, -0.004376f, 0.002487f, -0.016349f, 0.001823f, -0.009009f, 0.008301f, 0.001476f, 0.008819f, -0.004442f, -0.002255f, 0.004021f, 0.000233f, 0.001182f, 0.000477f, 0.008515f, 0.006807f, -0.009303f, 0.005304f, 0.007539f, -0.012829f, 0.001544f, -0.005799f, 0.002422f, -0.002967f, -0.009871f, 0.000128f, 0.008548f, 0.007378f, 0.016475f, -0.010225f, 0.012761f, -0.008458f, -0.001675f, 0.007525f, -0.008228f, -0.012324f, -0.004423f, 0.000551f, -0.000756f, -0.000658f, -0.001307f, + 0.002406f, 0.005266f, -0.007181f, -0.000071f, 0.003377f, -0.000636f, 0.002896f, -0.005839f, -0.003392f, -0.002303f, -0.004336f, 0.001286f, -0.000961f, -0.003354f, 0.001824f, 0.001937f, -0.002854f, -0.004305f, -0.000256f, -0.000986f, 0.004435f, -0.000202f, -0.000756f, 0.000838f, 0.000932f, -0.000757f, -0.001364f, 0.003022f, 0.000971f, -0.002379f, -0.001240f, -0.001817f, 0.000244f, 0.003093f, 0.000277f, -0.001055f, 0.037600f, 0.016832f, 0.022784f, -0.001859f, -0.006280f, -0.008225f, -0.008214f, 0.004465f, -0.006895f, 0.010469f, -0.001169f, 0.014371f, 0.000890f, 0.007598f, 0.009465f, 0.007290f, 0.006272f, 0.008269f, -0.027898f, -0.008264f, -0.002603f, -0.005893f, -0.005144f, -0.008796f, -0.019865f, 0.000889f, 0.013650f, -0.008393f, 0.008205f, -0.006740f, -0.009901f, -0.007495f, 0.001157f, -0.006325f, -0.002322f, -0.006485f, -0.000424f, 0.016433f, 0.000904f, 0.007388f, 0.010416f, 0.013512f, -0.006319f, 0.003167f, -0.002993f, -0.010424f, 0.011872f, -0.006622f, -0.000452f, -0.010316f, 0.007577f, -0.000096f, 0.000205f, -0.002844f, -0.004771f, 0.003501f, 0.010614f, -0.004432f, 0.005996f, 0.005652f, + 0.004783f, 0.018199f, -0.018268f, -0.007731f, 0.000481f, -0.010073f, -0.013025f, -0.005175f, -0.015949f, 0.002405f, 0.018783f, -0.012924f, -0.006131f, -0.014760f, 0.000993f, -0.004642f, -0.007025f, -0.017304f, 0.010215f, 0.013294f, 0.005298f, 0.009293f, -0.004673f, 0.001503f, -0.003452f, 0.003860f, 0.000205f, 0.009199f, -0.002337f, 0.003965f, -0.000145f, -0.002342f, 0.003243f, 0.002209f, 0.004256f, 0.003544f, -0.000559f, 0.000858f, 0.002349f, 0.000944f, 0.001843f, -0.000142f, -0.001713f, -0.003307f, 0.001698f, 0.000878f, -0.002227f, 0.001649f, 0.001855f, -0.000549f, 0.000836f, 0.002197f, -0.000618f, -0.001961f, -0.000691f, -0.000595f, 0.011549f, 0.016785f, -0.009360f, 0.008785f, -0.007665f, -0.003552f, -0.003123f, -0.020566f, 0.014889f, -0.004281f, -0.002335f, 0.023936f, 0.014696f, 0.016027f, -0.006617f, 0.000698f, 0.002709f, -0.003587f, 0.005169f, -0.012075f, -0.000461f, -0.008238f, 0.009596f, -0.009382f, -0.006660f, -0.000915f, 0.001518f, -0.011605f, 0.002106f, 0.001314f, 0.015202f, 0.000183f, -0.021116f, 0.012155f, 0.011175f, 0.016200f, -0.002711f, 0.004129f, -0.011748f, -0.008679f, + -0.003813f, -0.008425f, 0.003181f, 0.002283f, -0.003321f, -0.001211f, 0.008618f, 0.013729f, -0.018867f, -0.003982f, -0.000168f, -0.007612f, -0.008153f, 0.012423f, -0.010115f, 0.004726f, -0.009933f, -0.012883f, -0.009800f, -0.006336f, 0.004304f, 0.001874f, 0.022971f, -0.003859f, -0.006380f, 0.006956f, -0.007122f, -0.001976f, -0.006343f, 0.006507f, -0.005885f, 0.008369f, -0.004333f, -0.003769f, 0.005537f, 0.013956f, 0.003684f, -0.012993f, -0.000103f, -0.006375f, -0.013418f, 0.003811f, 0.009183f, -0.003056f, 0.001981f, 0.003322f, 0.000274f, -0.001369f, 0.004633f, 0.000154f, -0.005557f, 0.000096f, -0.002127f, -0.000946f, -0.002986f, 0.004456f, -0.001240f, -0.003557f, -0.004071f, 0.000595f, 0.003867f, -0.001771f, -0.000481f, -0.005372f, 0.000300f, 0.001027f, 0.001622f, -0.000931f, -0.004805f, -0.002340f, 0.003816f, -0.001594f, -0.005175f, 0.002055f, -0.028811f, 0.027714f, 0.014773f, -0.016433f, -0.016706f, 0.006884f, 0.021878f, -0.000257f, 0.006368f, 0.025621f, 0.008499f, 0.007754f, -0.004393f, 0.013380f, 0.012101f, 0.014089f, -0.025376f, -0.015485f, -0.015426f, 0.012174f, 0.010379f, 0.013382f, + 0.000559f, -0.015393f, 0.006271f, -0.002294f, 0.006907f, -0.022153f, 0.008498f, 0.013497f, -0.010497f, 0.005862f, 0.010799f, 0.003092f, -0.000410f, 0.002376f, -0.003575f, 0.019477f, 0.013122f, 0.010439f, 0.000303f, 0.006793f, 0.014914f, -0.013355f, -0.007293f, 0.000696f, 0.019747f, 0.012725f, 0.007716f, -0.014910f, 0.000462f, 0.010188f, 0.011755f, -0.004140f, 0.003582f, 0.011597f, 0.014237f, 0.004549f, 0.013157f, 0.005282f, -0.001573f, -0.012205f, -0.000170f, -0.020343f, -0.008434f, -0.009750f, 0.001613f, 0.006731f, -0.011888f, -0.004764f, -0.021630f, 0.009381f, -0.006074f, -0.000145f, 0.011333f, 0.016668f, 0.020034f, 0.002507f, -0.002188f, -0.012483f, -0.003827f, 0.006383f, 0.006781f, -0.013249f, 0.004065f, -0.005963f, 0.004761f, 0.000886f, -0.004572f, 0.000081f, 0.002269f, -0.004207f, 0.001782f, -0.001118f, -0.005115f, -0.002588f, -0.003258f, 0.003149f, 0.003754f, -0.000690f, -0.003013f, 0.002064f, -0.002339f, -0.001626f, -0.004005f, -0.000561f, -0.000942f, -0.004568f, 0.003514f, 0.002847f, 0.003616f, 0.024517f, 0.007478f, -0.003971f, -0.011197f, -0.028701f, -0.014148f, 0.017873f, + -0.006343f, -0.026364f, -0.007224f, -0.004024f, 0.003924f, 0.014870f, 0.022298f, -0.001120f, 0.006476f, -0.004941f, 0.011051f, -0.012318f, -0.013451f, -0.014144f, -0.025610f, 0.013817f, 0.007639f, -0.021091f, 0.000538f, -0.015348f, -0.006051f, 0.013939f, 0.007662f, 0.011414f, -0.003268f, -0.002746f, -0.003770f, 0.024418f, 0.018740f, 0.020182f, -0.009197f, -0.016879f, 0.013401f, -0.002099f, -0.006163f, 0.017419f, 0.002958f, 0.017141f, -0.000649f, 0.009670f, -0.012015f, -0.000426f, 0.008409f, -0.036122f, -0.005588f, 0.001943f, -0.026696f, 0.007091f, -0.006886f, 0.025005f, 0.015711f, -0.015012f, 0.001092f, 0.022846f, -0.002457f, 0.011733f, -0.007717f, 0.015761f, -0.007349f, 0.003261f, -0.006119f, 0.000566f, 0.010798f, -0.014573f, 0.015818f, 0.008349f, 0.009039f, 0.002786f, 0.021059f, -0.008131f, -0.024326f, 0.004374f, 0.016689f, -0.007768f, -0.015149f, -0.010679f, -0.007789f, 0.017555f, 0.000270f, -0.007266f, 0.000619f, 0.000601f, -0.003482f, -0.003149f, 0.000987f, 0.003525f, -0.002046f, -0.002096f, -0.001369f, 0.003906f, -0.002050f, -0.006350f, 0.001725f, -0.007049f, 0.006511f, 0.004483f, + -0.000188f, -0.000559f, 0.001662f, -0.001923f, 0.002827f, 0.000467f, 0.001926f, 0.000570f, 0.000798f, 0.007864f, 0.002578f, -0.003848f, 0.002066f, 0.001087f, 0.003522f, -0.000955f, 0.000786f, -0.058481f, -0.012391f, 0.031395f, -0.025356f, -0.009166f, 0.026636f, 0.010054f, -0.008480f, 0.002829f, -0.022101f, 0.019702f, -0.002529f, -0.035578f, 0.002514f, -0.001867f, 0.013414f, 0.013196f, -0.007109f, -0.027879f, -0.011985f, -0.010652f, 0.000547f, -0.014876f, -0.008215f, -0.018968f, -0.005499f, 0.020639f, -0.017020f, -0.008542f, -0.006580f, -0.011059f, -0.011711f, -0.015843f, 0.010737f, 0.002164f, 0.013366f, 0.002316f, -0.009980f, -0.015362f, -0.015201f, -0.003156f, 0.009998f, 0.014826f, -0.005330f, -0.013593f, 0.014148f, 0.005872f, -0.021390f, -0.023792f, -0.048500f, -0.004336f, -0.015557f, -0.009415f, 0.007085f, 0.007298f, 0.004336f, 0.021684f, -0.002367f, -0.010454f, -0.001413f, -0.011264f, 0.024695f, 0.013109f, -0.004933f, 0.013178f, -0.014068f, 0.006873f, 0.005591f, -0.013724f, -0.006113f, -0.012320f, 0.008622f, 0.006058f, -0.022647f, 0.014757f, 0.022647f, -0.001593f, -0.001228f, -0.023160f, + -0.009117f, 0.010047f, -0.007305f, 0.006597f, 0.022436f, -0.007674f, 0.004818f, 0.002164f, 0.001601f, -0.007273f, 0.001172f, -0.001290f, -0.009593f, -0.005813f, -0.001024f, 0.003216f, 0.000380f, 0.002499f, -0.010009f, 0.001028f, -0.005443f, 0.002352f, -0.005875f, -0.005658f, -0.003536f, -0.000491f, 0.001057f, -0.004369f, 0.001110f, 0.002250f, -0.000781f, 0.000839f, 0.003993f, 0.002191f, -0.008018f, -0.005317f, -0.002650f, 0.000656f, 0.002708f, -0.001426f, 0.002745f, 0.000425f, 0.002295f, -0.001954f, 0.000397f, 0.010068f, 0.039184f, -0.018484f, 0.015130f, -0.009858f, 0.000294f, 0.021899f, -0.006031f, -0.010251f, -0.004855f, -0.002412f, 0.004308f, 0.014787f, 0.051528f, -0.003148f, 0.003485f, 0.013857f, 0.003714f, -0.000089f, -0.023514f, -0.025214f, 0.004241f, 0.003083f, -0.015228f, -0.008301f, -0.003193f, 0.013854f, -0.005866f, 0.002437f, 0.000093f, 0.005876f, -0.005981f, 0.029546f, 0.017003f, -0.014254f, 0.016847f, 0.014568f, -0.017635f, 0.002857f, 0.008122f, 0.005681f, -0.004591f, -0.006417f, 0.025302f, -0.022065f, 0.009652f, 0.027213f, -0.009149f, 0.003136f, 0.018069f, -0.002210f, + 0.015772f, 0.008153f, 0.000675f, 0.008147f, 0.013597f, 0.017823f, 0.011823f, 0.001199f, -0.000226f, -0.012747f, -0.013369f, 0.000252f, 0.001973f, -0.043662f, 0.028783f, -0.006925f, -0.012979f, -0.015344f, -0.031375f, -0.036208f, -0.022899f, 0.004105f, 0.018243f, -0.006774f, 0.002649f, -0.003159f, 0.018133f, -0.006855f, -0.013862f, 0.007885f, 0.004702f, -0.006217f, 0.002630f, 0.011811f, -0.011207f, 0.002080f, -0.014373f, -0.005215f, -0.006200f, 0.003312f, -0.001272f, 0.007382f, 0.005192f, 0.001374f, -0.001687f, 0.003643f, 0.005666f, -0.000359f, -0.010285f, 0.005789f, -0.000073f, 0.008941f, 0.009213f, 0.004139f, -0.003951f, 0.007721f, 0.002184f, -0.001475f, 0.000169f, 0.000250f, -0.006732f, 0.007757f, -0.000291f, -0.005491f, 0.008115f, 0.015118f, -0.002596f, -0.003477f, 0.008310f, -0.003306f, -0.005047f, -0.002249f, 0.007230f, 0.052779f, 0.052520f, -0.001260f, -0.043894f, 0.008765f, 0.008719f, -0.004779f, 0.011221f, 0.006799f, 0.003602f, -0.000264f, -0.007598f, 0.042866f, 0.007678f, -0.006617f, -0.047685f, -0.026454f, 0.011023f, -0.002710f, -0.016701f, -0.028235f, 0.003798f, 0.005070f, + 0.007137f, -0.006857f, -0.031394f, -0.033065f, 0.035933f, 0.034417f, 0.010497f, 0.031628f, -0.026993f, 0.003895f, 0.013897f, -0.005408f, -0.017170f, -0.030344f, -0.015286f, 0.005655f, -0.001450f, -0.014108f, 0.014619f, 0.000526f, 0.014186f, 0.011873f, 0.000653f, -0.032642f, -0.019263f, -0.015221f, -0.002798f, 0.003632f, 0.004207f, -0.005346f, -0.009450f, 0.002513f, 0.005170f, -0.029164f, -0.007550f, 0.005058f, 0.006473f, -0.013107f, -0.036934f, -0.008342f, -0.009391f, 0.027417f, -0.001199f, 0.012475f, -0.012445f, -0.009086f, -0.016614f, -0.018157f, -0.010925f, 0.003219f, -0.001524f, 0.023056f, -0.013700f, 0.004205f, 0.026212f, -0.001591f, 0.013020f, 0.012044f, 0.025459f, 0.005935f, -0.007587f, -0.012869f, -0.011680f, -0.004269f, 0.015331f, 0.002640f, 0.015455f, 0.008544f, -0.001376f, -0.000175f, 0.000611f, 0.001508f, -0.007114f, -0.008485f, -0.000130f, -0.001922f, -0.000995f, 0.002773f, -0.001849f, 0.002223f, -0.010296f, -0.002123f, 0.006068f, -0.000132f, 0.003778f, -0.017122f, -0.002108f, -0.000470f, -0.003553f, 0.003776f, 0.002540f, 0.002451f, 0.002856f, 0.004185f, 0.004253f, 0.004822f, + -0.001691f, -0.007815f, 0.009340f, -0.005957f, 0.022724f, -0.011617f, 0.003843f, -0.008719f, 0.001614f, 0.006151f, -0.014556f, -0.009603f, -0.025863f, -0.028282f, -0.018829f, -0.007175f, -0.001469f, 0.000843f, -0.015895f, -0.014440f, -0.029640f, 0.014305f, -0.029708f, -0.037880f, 0.024372f, -0.022659f, -0.029182f, 0.027138f, 0.004949f, -0.005970f, 0.028790f, 0.016849f, -0.022703f, 0.020940f, -0.057598f, -0.003759f, -0.014947f, -0.006005f, -0.027186f, 0.047363f, 0.021922f, -0.013714f, 0.006733f, 0.015011f, -0.010096f, 0.016559f, 0.000037f, 0.000850f, -0.013713f, 0.016083f, 0.018175f, 0.024982f, -0.039165f, -0.001234f, -0.000493f, 0.011651f, -0.017885f, -0.006619f, -0.018204f, -0.017546f, 0.030720f, 0.010126f, -0.023428f, 0.012068f, -0.014589f, -0.015100f, -0.025148f, -0.045145f, 0.011570f, 0.030020f, 0.001774f, 0.030238f, 0.040648f, -0.002323f, -0.017022f, -0.038671f, 0.002755f, -0.004860f, 0.002207f, -0.009572f, 0.007736f, -0.016937f, 0.036344f, 0.020385f, 0.031752f, 0.006599f, -0.004240f, -0.009643f, 0.012785f, 0.015225f, 0.006519f, -0.002660f, -0.004888f, 0.001535f, 0.016929f, -0.002941f, + 0.006914f, -0.010772f, 0.004375f, -0.017867f, 0.001427f, 0.002315f, -0.008235f, 0.017034f, 0.009466f, -0.004261f, -0.011482f, -0.009653f, -0.003563f, -0.000810f, 0.005089f, -0.011318f, 0.002590f, 0.002133f, -0.001202f, -0.007794f, 0.002612f, -0.017013f, -0.003844f, -0.003969f, -0.005162f, 0.003043f, -0.000707f, -0.033012f, 0.004632f, -0.073339f, -0.048868f, -0.035446f, 0.019293f, 0.036016f, -0.051474f, 0.011757f, 0.036904f, 0.022404f, -0.000282f, 0.013180f, 0.034809f, -0.016119f, -0.001825f, -0.010309f, 0.001262f, -0.022702f, 0.016212f, 0.000091f, 0.002131f, 0.005660f, 0.046579f, -0.002588f, -0.020200f, -0.020153f, 0.011288f, 0.033872f, -0.013535f, -0.034793f, 0.010499f, 0.034376f, 0.020453f, -0.004914f, 0.017054f, 0.011112f, 0.016440f, 0.003356f, 0.013964f, 0.023239f, -0.002687f, -0.039840f, 0.002230f, 0.011966f, -0.036861f, -0.027336f, 0.036544f, 0.028235f, -0.027780f, -0.018609f, 0.009113f, -0.002125f, 0.018052f, 0.043897f, -0.009242f, -0.008791f, 0.008642f, -0.002530f, 0.016591f, 0.007918f, -0.015842f, -0.012889f, -0.005823f, 0.012681f, 0.011997f, -0.011997f, -0.031740f, -0.005894f, + -0.047889f, 0.045302f, 0.007934f, -0.008610f, 0.004589f, 0.018625f, -0.000724f, -0.021411f, 0.008114f, -0.009452f, -0.013469f, 0.010470f, -0.002623f, -0.021190f, -0.034180f, -0.011500f, -0.013784f, 0.028188f, -0.004278f, 0.009133f, 0.005671f, 0.003227f, -0.002416f, -0.002723f, 0.004699f, -0.007887f, 0.001504f, 0.010049f, -0.000978f, -0.005638f, -0.002819f, -0.023728f, -0.006983f, -0.000878f, -0.004140f, -0.017340f, -0.015079f, -0.006688f, -0.003240f, -0.001782f, -0.004750f, -0.001147f, 0.000564f, 0.012636f, 0.004833f, -0.002356f, -0.004949f, 0.001790f, -0.004343f, -0.004131f, 0.008639f, -0.004439f, -0.009698f, -0.003156f, -0.007234f, 0.000679f, -0.008962f, 0.000044f, 0.006416f, 0.001716f, -0.008792f, -0.003055f, -0.028140f, -0.001306f, 0.004994f, -0.034698f, -0.008983f, 0.025956f, 0.033977f, 0.023895f, 0.063305f, 0.038049f, 0.057382f, 0.021317f, 0.015225f, -0.029628f, 0.032275f, -0.010860f, -0.003468f, -0.023724f, -0.015615f, 0.031013f, -0.010005f, 0.070386f, 0.032929f, 0.020299f, -0.003594f, 0.016267f, -0.010902f, -0.032879f, -0.016440f, -0.020406f, 0.015029f, -0.019237f, -0.000242f, -0.020580f, + 0.012251f, 0.028657f, 0.026065f, -0.001687f, 0.037608f, 0.031260f, 0.001681f, -0.010853f, -0.014061f, -0.025594f, -0.008581f, 0.058989f, 0.023099f, 0.067906f, -0.021634f, 0.000390f, -0.002057f, 0.015876f, 0.054720f, 0.018721f, 0.001564f, 0.035079f, 0.040390f, 0.042449f, -0.003572f, -0.024973f, -0.008934f, -0.006839f, -0.006951f, 0.028180f, 0.019461f, 0.026753f, 0.040987f, -0.025287f, 0.061852f, -0.041246f, -0.077294f, -0.011894f, -0.023903f, 0.015928f, 0.037754f, 0.018447f, -0.020640f, -0.002017f, -0.022435f, -0.016882f, -0.010940f, 0.000423f, 0.031311f, 0.005368f, -0.008437f, 0.004997f, 0.002659f, 0.009440f, 0.010228f, 0.006901f, 0.012480f, 0.003460f, 0.007985f, 0.002957f, 0.008826f, 0.000718f, -0.024626f, -0.009473f, 0.000111f, -0.023138f, 0.002952f, -0.024160f, -0.012418f, -0.014583f, -0.013275f, -0.011332f, -0.008051f, -0.003042f, 0.001828f, 0.007223f, 0.026080f, 0.003716f, -0.015801f, 0.007677f, 0.001965f, 0.023444f, -0.003935f, 0.010264f, 0.000275f, 0.000555f, -0.011971f, 0.003198f, 0.037221f, 0.059285f, -0.029283f, -0.024033f, 0.021963f, -0.018500f, -0.002810f, -0.009050f, + 0.008490f, 0.025475f, 0.028608f, 0.040873f, -0.045200f, 0.050551f, -0.018122f, 0.003694f, -0.023308f, 0.020360f, 0.039218f, 0.014814f, 0.007548f, 0.001574f, 0.047675f, 0.010481f, -0.001230f, -0.016820f, -0.006892f, -0.049838f, -0.006247f, -0.024880f, -0.058210f, 0.003732f, -0.003208f, 0.022617f, -0.060646f, -0.013253f, 0.014602f, 0.021216f, 0.051045f, -0.015307f, 0.015072f, 0.026335f, 0.004467f, -0.008452f, 0.014631f, -0.014888f, -0.003191f, -0.077551f, 0.006959f, -0.033835f, -0.037869f, -0.043887f, 0.017440f, -0.069607f, 0.022755f, -0.026915f, -0.034001f, -0.047777f, 0.042230f, 0.044300f, 0.045026f, 0.008222f, 0.008438f, 0.041520f, -0.058530f, -0.006275f, -0.017900f, 0.023313f, -0.069589f, -0.024541f, -0.007008f, 0.021874f, 0.017950f, 0.013864f, 0.028394f, -0.026595f, 0.010521f, -0.032001f, -0.009092f, -0.019377f, -0.007193f, -0.006903f, 0.001068f, -0.030346f, 0.013844f, 0.018287f, -0.003028f, 0.000846f, -0.014435f, -0.005051f, 0.014573f, -0.019736f, -0.000181f, 0.009008f, -0.023649f, 0.010485f, -0.021170f, -0.000164f, 0.013607f, 0.002768f, -0.017317f, -0.011925f, 0.006996f, -0.010157f, + 0.011095f, 0.007236f, 0.012767f, -0.001998f, -0.015140f, 0.028925f, -0.013693f, -0.007389f, -0.018723f, 0.012721f, -0.006226f, 0.001521f, -0.017353f, 0.002022f, -0.021131f, -0.003705f, 0.015897f, -0.005254f, -0.008834f, -0.022701f, 0.002830f, 0.002711f, -0.002732f, -0.029684f, -0.055193f, -0.001055f, -0.019735f, 0.065261f, 0.013570f, 0.046134f, -0.015208f, 0.062996f, -0.039729f, -0.074388f, 0.016666f, 0.012495f, 0.008363f, -0.037039f, -0.042193f, -0.033074f, 0.012209f, -0.033318f, 0.014461f, -0.017737f, 0.049370f, -0.016283f, -0.007622f, 0.035558f, 0.000958f, -0.089060f, -0.037101f, -0.001357f, 0.058429f, -0.006895f, -0.018540f, -0.051149f, 0.008683f, -0.012759f, -0.044038f, -0.052138f, -0.006198f, 0.009324f, -0.018062f, -0.019985f, -0.052168f, 0.033837f, -0.013078f, 0.012019f, -0.026065f, 0.000917f, 0.015242f, 0.009182f, 0.045708f, 0.000222f, -0.015981f, -0.059913f, -0.021229f, 0.028577f, -0.041035f, -0.021090f, 0.014935f, 0.032551f, 0.025426f, 0.065155f, 0.049749f, 0.000650f, 0.037707f, 0.038555f, 0.013045f, 0.001227f, 0.022546f, -0.019711f, 0.098583f, -0.045746f, -0.108063f, 0.028358f, + -0.092013f, -0.003887f, -0.072065f, -0.000839f, 0.087740f, 0.010668f, -0.042086f, 0.013581f, 0.014759f, -0.027740f, -0.022683f, -0.031348f, 0.006535f, -0.009750f, 0.027990f, -0.022647f, 0.018648f, -0.037672f, 0.010238f, -0.001668f, -0.006286f, -0.008897f, 0.025352f, 0.048416f, 0.015106f, 0.019406f, 0.033591f, 0.009841f, -0.033901f, 0.009366f, -0.012677f, 0.022092f, -0.007189f, -0.010987f, -0.001459f, -0.002780f, -0.009230f, -0.028288f, -0.018398f, -0.012823f, -0.001690f, 0.003440f, -0.002171f, -0.018152f, -0.039904f, -0.025404f, 0.005842f, -0.007565f, -0.000835f, -0.015774f, 0.005228f, 0.028154f, 0.011051f, 0.040740f, -0.062061f, -0.042288f, -0.025277f, -0.022607f, 0.025809f, 0.038519f, -0.022405f, 0.002003f, 0.035523f, -0.071290f, 0.005832f, 0.015962f, -0.052717f, 0.027015f, -0.017149f, 0.023762f, 0.009776f, 0.026856f, 0.003583f, -0.035164f, 0.036394f, -0.045645f, -0.009205f, 0.086611f, -0.035182f, 0.031345f, -0.020159f, 0.035303f, 0.033341f, -0.012053f, -0.037652f, 0.040036f, 0.106325f, -0.058539f, 0.015653f, -0.077493f, 0.039494f, 0.022787f, -0.041056f, 0.045538f, 0.004930f, -0.092928f, + 0.013850f, 0.003929f, 0.042739f, -0.011916f, -0.005954f, -0.049114f, -0.046627f, -0.024838f, 0.115842f, -0.018204f, 0.059070f, -0.052000f, 0.039034f, 0.018251f, -0.010090f, -0.040115f, -0.006843f, 0.031925f, 0.065314f, -0.024079f, -0.021292f, -0.007456f, 0.013172f, 0.055836f, -0.013878f, -0.013927f, -0.041460f, 0.012288f, -0.062649f, -0.028657f, 0.045418f, 0.053922f, 0.006532f, -0.005087f, -0.029199f, -0.049041f, -0.140343f, 0.087248f, 0.033743f, 0.049877f, 0.005317f, -0.046331f, 0.050709f, -0.028902f, 0.021643f, 0.029447f, 0.029533f, 0.067248f, -0.000962f, 0.015309f, 0.019052f, -0.008109f, -0.029373f, -0.010354f, 0.049833f, 0.030060f, -0.027465f, -0.006557f, -0.018587f, -0.005327f, 0.023430f, 0.006384f, -0.032196f, -0.021456f, 0.031382f, 0.006801f, -0.009527f, 0.015686f, -0.027182f, -0.017179f, -0.005411f, 0.013166f, 0.022248f, 0.013842f, 0.004509f, 0.016932f, -0.013654f, -0.018762f, 0.003599f, -0.002159f, -0.024375f, 0.002653f, -0.025148f, -0.001277f, -0.015255f, -0.004005f, 0.004295f, -0.013369f, -0.024051f, 0.007896f, -0.058656f, 0.040819f, 0.041118f, -0.080834f, 0.008166f, -0.042724f, + 0.005615f, -0.088914f, 0.089244f, 0.076745f, -0.007524f, -0.040833f, -0.013593f, -0.016664f, 0.043528f, -0.044700f, 0.056028f, -0.074381f, -0.042423f, 0.020602f, 0.026604f, 0.005542f, 0.025707f, 0.069944f, 0.020709f, 0.032034f, 0.009076f, 0.033316f, 0.024438f, -0.016230f, 0.007469f, 0.028170f, -0.001546f, -0.002814f, 0.056665f, 0.024860f, 0.074235f, -0.007115f, 0.042509f, -0.000239f, -0.053504f, 0.054841f, -0.028072f, -0.006528f, 0.017469f, -0.051493f, -0.034140f, 0.019552f, 0.080745f, 0.043551f, 0.029449f, -0.103764f, -0.023642f, -0.072839f, -0.000268f, 0.115752f, 0.076756f, 0.087511f, 0.007299f, -0.085442f, 0.026901f, 0.086144f, 0.018548f, -0.021881f, 0.077317f, 0.008066f, 0.051821f, -0.132707f, -0.109488f, 0.078754f, -0.005304f, -0.035878f, -0.083779f, -0.018559f, -0.031204f, 0.035800f, 0.033783f, 0.039227f, 0.040905f, -0.016909f, 0.013041f, 0.072996f, 0.068036f, 0.070507f, 0.006291f, 0.101401f, 0.051122f, -0.018166f, -0.039790f, 0.000477f, -0.019378f, 0.005900f, 0.052109f, -0.008274f, 0.002721f, 0.037485f, 0.041934f, 0.003876f, 0.000676f, 0.015952f, 0.046419f, 0.016067f, + 0.022033f, 0.031156f, 0.011653f, 0.024222f, -0.000654f, -0.013813f, -0.005458f, -0.005334f, 0.002464f, 0.032225f, -0.011811f, 0.005615f, -0.025902f, 0.039021f, 0.019533f, 0.017006f, 0.000115f, 0.019646f, 0.000604f, 0.066925f, 0.017832f, 0.068710f, -0.018000f, 0.060089f, 0.028231f, 0.008790f, 0.026833f, 0.025790f, 0.030031f, -0.007971f, -0.004750f, 0.041041f, 0.013299f, 0.034506f, -0.076601f, 0.045169f, 0.060434f, 0.004552f, 0.020655f, -0.054669f, 0.042708f, -0.024880f, 0.020485f, 0.001961f, 0.000209f, 0.036111f, -0.011144f, 0.023519f, -0.007531f, -0.043833f, 0.011739f, -0.003013f, 0.049060f, 0.042856f, 0.060999f, 0.020361f, -0.046634f, -0.038473f, 0.039609f, 0.044514f, 0.020607f, 0.003982f, 0.014093f, -0.012064f, -0.038225f, 0.006602f, -0.014141f, 0.054246f, 0.037861f, 0.033149f, 0.042948f, 0.044149f, -0.060757f, 0.067065f, 0.065830f, 0.048372f, -0.032650f, -0.028922f, -0.042236f, 0.058483f, 0.034127f, 0.095945f, -0.058272f, -0.057516f, -0.044575f, -0.084464f, -0.022044f, 0.091737f, 0.014602f, 0.072110f, -0.076610f, -0.081698f, 0.017914f, 0.052328f, -0.071641f, 0.011531f, + -0.057054f, 0.023067f, -0.065861f, -0.004875f, 0.031339f, 0.033471f, -0.059886f, 0.024007f, -0.045552f, -0.090397f, -0.002986f, 0.107896f, 0.055683f, 0.043963f, -0.030023f, -0.076479f, 0.116875f, 0.094964f, 0.026567f, -0.104570f, -0.004099f, -0.024195f, 0.074854f, 0.038735f, 0.046400f, -0.054081f, 0.041047f, -0.023961f, 0.026885f, -0.037247f, 0.013385f, -0.041710f, 0.061148f, -0.011489f, 0.010042f, -0.072369f, 0.021119f, 0.009777f, -0.003413f, -0.015706f, 0.014796f, 0.008344f, 0.007592f, -0.044481f, 0.018966f, 0.046774f, 0.002851f, 0.028447f, 0.023393f, 0.020083f, 0.002990f, 0.009908f, 0.000878f, 0.003323f, 0.001934f, -0.013535f, -0.001746f, 0.015401f, -0.000363f, 0.029907f, 0.024418f, -0.012132f, -0.002698f, 0.014395f, 0.005589f, 0.023433f, -0.042273f, 0.028534f, 0.002831f, -0.000173f, -0.148546f, -0.029126f, -0.004055f, 0.002875f, 0.051340f, -0.136649f, -0.015941f, 0.063406f, -0.101811f, 0.023965f, -0.023345f, 0.119396f, 0.062402f, -0.071356f, 0.017645f, 0.080637f, 0.007926f, -0.030736f, 0.026067f, 0.020075f, 0.010303f, -0.000578f, -0.008093f, 0.007055f, 0.012880f, 0.028207f, + 0.081854f, 0.066527f, 0.071571f, 0.049810f, 0.090171f, 0.044749f, 0.092209f, 0.038782f, 0.081793f, 0.001895f, 0.050768f, 0.046471f, 0.050318f, 0.039275f, -0.003770f, 0.015783f, -0.062902f, -0.036786f, 0.119561f, 0.002219f, -0.047850f, -0.012678f, 0.037510f, 0.063740f, 0.128698f, -0.016684f, -0.070871f, -0.034956f, -0.052242f, 0.074053f, 0.083886f, 0.094694f, 0.029185f, -0.002696f, 0.063607f, -0.107343f, 0.098393f, 0.038001f, -0.051845f, -0.000242f, -0.168086f, 0.004715f, -0.111080f, -0.153383f, -0.038314f, -0.089850f, -0.039256f, 0.175315f, 0.159378f, 0.150533f, -0.117795f, -0.011345f, -0.013352f, 0.118529f, 0.184700f, -0.040389f, -0.051984f, 0.103024f, 0.105191f, 0.091138f, -0.010615f, -0.013812f, -0.050965f, -0.063573f, 0.009518f, -0.022891f, 0.028488f, 0.045191f, 0.038805f, 0.027572f, 0.002806f, 0.018142f, 0.049597f, 0.009248f, 0.000462f, -0.013206f, 0.002990f, 0.004165f, 0.013637f, 0.010965f, 0.010288f, 0.051933f, -0.004269f, -0.029659f, 0.031524f, 0.037959f, 0.008905f, 0.060156f, 0.014258f, 0.029513f, 0.065154f, 0.087639f, 0.063754f, 0.047259f, 0.019033f, 0.009532f, + 0.025569f, 0.060299f, 0.026453f, 0.061785f, 0.045510f, 0.030057f, 0.042832f, 0.016425f, 0.058071f, 0.051244f, 0.041403f, 0.063480f, 0.036314f, 0.012433f, 0.017745f, -0.042081f, 0.106985f, 0.127574f, -0.105477f, -0.098861f, 0.033993f, 0.111390f, 0.003903f, -0.053831f, 0.001482f, 0.029420f, 0.034874f, -0.094156f, 0.035714f, -0.013535f, 0.050235f, -0.052208f, -0.023461f, -0.060989f, 0.064338f, -0.009750f, -0.026800f, -0.057113f, 0.042161f, 0.023066f, -0.008536f, -0.048462f, 0.023293f, 0.019792f, 0.012345f, -0.042976f, -0.004850f, -0.003278f, 0.049532f, -0.037631f, -0.007677f, -0.054493f, -0.012808f, 0.017222f, 0.043662f, -0.056679f, -0.019934f, 0.057854f, 0.051854f, -0.016784f, -0.034499f, -0.001499f, -0.016962f, 0.048078f, -0.026915f, -0.016874f, 0.025210f, 0.016605f, 0.031500f, -0.028440f, 0.009924f, -0.038702f, 0.044519f, 0.049658f, 0.025608f, 0.006569f, -0.038509f, 0.043932f, -0.030663f, 0.068760f, -0.049859f, 0.054963f, -0.086965f, 0.058306f, 0.009084f, -0.006580f, -0.060656f, -0.020002f, 0.021858f, -0.017352f, 0.007698f, -0.016859f, 0.019289f, -0.009277f, 0.021426f, -0.020894f, + -0.024885f, -0.018504f, 0.020530f, -0.000179f, -0.000471f, -0.006263f, -0.012835f, 0.007556f, 0.023856f, -0.013017f, -0.000793f, -0.000351f, 0.005040f, -0.002916f, 0.006006f, -0.005673f, 0.018034f, -0.001349f, 0.022793f, -0.020572f, 0.005733f, -0.010563f, 0.023118f, -0.024416f, 0.022878f, -0.025180f, 0.016202f, 0.004707f, 0.028472f, -0.008293f, 0.027164f, -0.024819f, -0.015386f, -0.006014f, 0.042653f, -0.021794f, 0.033600f, -0.013517f, 0.007134f, 0.001831f, 0.024705f, -0.012138f, 0.014037f, 0.001453f, 0.003222f, -0.004302f, 0.010591f, -0.005303f, -0.010606f, 0.024790f, -0.013220f, 0.001396f, -0.009781f, 0.005605f, -0.008908f, 0.010954f, -0.015278f, 0.018670f, -0.013760f, 0.015090f, -0.019990f, 0.017624f, -0.026258f, 0.025171f, -0.014020f, 0.016293f, -0.017154f, 0.017284f, -0.017078f, 0.017766f, -0.015035f, 0.015905f, -0.020734f, 0.017413f, -0.016842f, 0.017836f, -0.019539f, 0.020589f, -0.018703f, -0.003406f, -0.022972f, 0.102629f, 0.109197f, -0.064247f, -0.038067f, 0.021667f, 0.104285f, 0.064806f, 0.038862f, 0.037395f, -0.016603f, -0.043622f, -0.013203f, 0.024525f, -0.000372f, -0.010260f, + 0.031120f, 0.000563f, 0.021938f, 0.002712f, -0.011652f, -0.039077f, -0.010365f, -0.002262f, 0.002903f, -0.001521f, -0.031753f, 0.035494f, 0.005938f, -0.014248f, -0.000780f, -0.001067f, 0.000524f, 0.022926f, 0.042080f, 0.017967f, 0.004280f, -0.015111f, -0.021738f, -0.005614f, 0.013695f, 0.028224f, 0.037993f, -0.021153f, -0.020890f, 0.004771f, 0.038410f, 0.017344f, 0.008595f, -0.017302f, -0.034788f, 0.029741f, -0.006086f, 0.000872f, 0.002060f, 0.009606f, 0.009220f, -0.004187f, -0.001225f, -0.022671f, 0.003534f, 0.020062f, -0.009464f, 0.012002f, -0.006662f, -0.016144f, 0.010330f, -0.003035f, 0.005614f, -0.001198f, 0.017468f, 0.011850f, -0.025907f, 0.007698f, 0.001299f, -0.047062f, -0.062531f, 0.001833f, 0.003727f, 0.014301f, 0.038177f, 0.004216f, -0.016716f, -0.016389f, 0.015081f, 0.016433f, 0.024948f, 0.016999f, 0.001137f, 0.007275f, -0.002591f, -0.018857f, -0.007775f, 0.002919f, -0.025854f, -0.024779f, 0.016069f, 0.017013f, -0.000315f, 0.019130f, -0.026975f, -0.004875f, -0.001176f, 0.001386f, -0.008268f, 0.004328f, 0.014721f, 0.020330f, 0.009999f, 0.017126f, -0.010706f, -0.021193f, + 0.012559f, 0.002022f, -0.005102f, 0.014548f, 0.008179f, -0.009974f, -0.036067f, -0.135628f, 0.057708f, 0.208633f, 0.192763f, 0.164171f, 0.065770f, -0.156165f, -0.097423f, -0.140413f, -0.156924f, -0.140682f, -0.040724f, 0.030180f, 0.118620f, 0.123159f, 0.147926f, 0.097662f, 0.098885f, 0.002259f, -0.103611f, -0.099330f, -0.122040f, -0.095800f, -0.053039f, -0.003773f, -0.034105f, 0.036973f, 0.045984f, 0.074068f, 0.081724f, 0.082650f, 0.049526f, 0.003995f, 0.022101f, -0.018421f, 0.011920f, -0.056870f, -0.041044f, -0.052606f, -0.085531f, -0.068166f, -0.051947f, -0.036966f, -0.060772f, 0.008290f, 0.104173f, 0.117357f, 0.065770f, 0.122719f, 0.030616f, 0.071543f, 0.037036f, 0.020895f, -0.030749f, -0.065776f, -0.089766f, -0.126464f, -0.096705f, -0.144244f, -0.059525f, -0.064317f, 0.041487f, 0.041242f, 0.120641f, 0.138703f, 0.123800f, 0.109961f, 0.107797f, 0.067196f, 0.008389f, -0.037867f, -0.115057f, -0.072429f, -0.150335f, -0.128463f, -0.178321f, -0.029060f, -0.015875f, 0.043799f, 0.056565f, 0.101526f, 0.119760f, 0.099945f, 0.089515f, 0.066120f, 0.039216f, 0.005341f, -0.033138f, -0.048068f, + -0.064395f, -0.099766f, -0.069866f, -0.086889f, -0.060214f, -0.031122f, -0.008842f, 0.019449f, 0.019211f, 0.094931f, 0.087784f, 0.086706f, 0.067868f, 0.049518f, 0.006008f, 0.030706f, -0.034380f, -0.057328f, -0.044428f, -0.123857f, -0.144077f, -0.028036f, -0.009643f, -0.006466f, 0.070382f, 0.057346f, 0.076805f, 0.053558f, 0.070191f, 0.021166f, 0.018192f, -0.005663f, -0.029647f, -0.038444f, -0.049321f, -0.054930f, -0.033608f, -0.007327f, -0.042621f, -0.022754f, 0.034159f, 0.048386f, 0.032674f, 0.041874f, 0.028803f, 0.020629f, 0.005474f, -0.004080f, -0.014787f, -0.021183f, -0.016184f, -0.026419f, -0.013677f, -0.005446f, -0.009797f, -0.013577f, 0.003016f, 0.009775f, 0.002255f, 0.015043f, 0.019607f, 0.014417f, 0.010424f, 0.008943f, 0.004732f, -0.001571f, -0.009058f, -0.009198f, -0.012828f, -0.009584f, -0.009901f, -0.006430f, -0.005204f, 0.000849f, 0.002469f, 0.004484f, 0.003734f, 0.006228f, 0.006397f, 0.005051f, 0.003827f, 0.003732f, 0.002729f, 0.003296f, 0.000675f, -0.003884f, -0.006169f, -0.003058f, -0.005476f, -0.006305f, -0.005444f, -0.003406f, -0.001496f, 0.002455f, 0.003800f, 0.004397f, + 0.002948f, 0.005692f, 0.003636f, 0.002231f, 0.001240f, 0.000671f, -0.002233f, -0.002421f, -0.002879f, -0.001113f, -0.002197f, -0.001993f, -0.002047f, -0.000316f, -0.000864f, 0.000605f, 0.000474f, 0.001945f, 0.001420f, 0.002364f, 0.001250f, 0.001504f, -0.000205f, -0.000522f, -0.001066f, 0.000587f, -0.001086f, -0.000777f, -0.002032f, -0.000692f, -0.000709f, 0.000915f, 0.000531f, 0.001505f, 0.000561f, 0.000834f, -0.000736f, 0.000100f, -0.000592f, -0.000202f, -0.001258f, 0.000116f, -0.000458f, 0.000522f, -0.000013f, 0.000799f, -0.000239f, 0.000702f, -0.000256f, 0.000440f, -0.000488f, 0.000387f, -0.000462f, 0.000400f} + }, + { + {-0.009644f, -0.009812f, -0.008153f, 0.002275f, -0.004688f, -0.000728f, -0.001357f, 0.004735f, 0.018806f, -0.005015f, 0.001871f, -0.017916f, -0.009823f, 0.005490f, -0.008552f, -0.006631f, -0.002541f, -0.007556f, -0.002032f, 0.015646f, -0.006736f, -0.009985f, 0.016859f, 0.013536f, -0.004795f, -0.003114f, 0.015430f, 0.004417f, 0.005968f, 0.003004f, 0.000731f, -0.003935f, -0.006539f, 0.006146f, -0.004878f, 0.004598f, 0.001637f, 0.001784f, -0.002189f, -0.005292f, -0.004193f, 0.003794f, -0.004823f, -0.007557f, -0.003443f, -0.003367f, -0.009677f, 0.010942f, 0.016851f, -0.009688f, 0.005482f, 0.000488f, -0.003815f, 0.002697f, -0.000445f, 0.000161f, -0.005679f, 0.010461f, -0.006220f, -0.007628f, 0.008660f, 0.002674f, -0.000482f, -0.000954f, 0.004746f, 0.000325f, -0.000164f, -0.002974f, -0.001532f, 0.009196f, -0.013426f, 0.004583f, 0.002436f, -0.003237f, -0.003232f, -0.004656f, -0.006848f, 0.000075f, 0.006550f, 0.006745f, 0.001929f, -0.000106f, 0.001493f, -0.003713f, 0.004866f, -0.001834f, 0.002851f, -0.002062f, -0.001373f, -0.000985f, -0.001252f, -0.000952f, 0.002228f, -0.000084f, 0.000901f, 0.001390f, + 0.000798f, 0.002371f, 0.002932f, -0.000957f, -0.000716f, -0.001305f, -0.000950f, -0.001863f, -0.000591f, -0.001235f, -0.001067f, -0.001895f, -0.000790f, -0.000192f, 0.001152f, -0.000721f, -0.029676f, -0.004668f, -0.010851f, -0.002649f, 0.002386f, -0.008068f, -0.018090f, 0.013273f, -0.004448f, 0.003106f, 0.008864f, -0.002798f, -0.000910f, -0.001083f, 0.004081f, -0.003114f, 0.014923f, -0.000595f, 0.011512f, 0.016906f, -0.020262f, 0.004272f, 0.014079f, 0.000995f, 0.002808f, 0.009771f, 0.018012f, 0.002602f, -0.004046f, 0.009092f, -0.002405f, -0.004667f, 0.004068f, 0.003233f, 0.004025f, -0.005043f, 0.018360f, -0.008441f, 0.004641f, 0.006876f, -0.000072f, -0.000867f, -0.008942f, 0.001488f, -0.010362f, 0.008746f, -0.010584f, -0.008107f, 0.005886f, -0.009849f, 0.006794f, -0.006867f, 0.002865f, -0.005537f, 0.003786f, 0.008019f, 0.015658f, 0.004832f, 0.001792f, 0.007643f, 0.000139f, -0.013484f, 0.001818f, 0.003829f, 0.005169f, -0.003369f, 0.000735f, -0.001831f, 0.002597f, 0.007569f, 0.004576f, 0.010329f, 0.003584f, 0.001399f, -0.006245f, -0.003178f, 0.006102f, 0.004757f, -0.005976f, 0.007231f, + 0.003556f, 0.007905f, -0.002426f, -0.001868f, -0.002432f, 0.000387f, -0.001489f, -0.006300f, -0.001125f, 0.001063f, 0.001095f, 0.004103f, 0.000496f, -0.001195f, -0.001514f, 0.001745f, 0.000916f, -0.003072f, -0.000416f, -0.000214f, 0.000075f, 0.001262f, 0.000390f, -0.001417f, -0.000148f, -0.001341f, -0.010753f, 0.008006f, 0.005256f, 0.001620f, 0.010199f, -0.000541f, 0.005731f, 0.013847f, 0.008612f, 0.018159f, 0.003544f, -0.002673f, -0.018556f, 0.002938f, -0.011363f, -0.003798f, 0.001471f, 0.004206f, -0.007100f, 0.000014f, 0.017920f, -0.009129f, -0.000437f, -0.009115f, 0.004388f, 0.000109f, 0.003516f, 0.007321f, 0.008655f, -0.005398f, 0.006506f, 0.006694f, 0.012982f, 0.000517f, -0.012640f, 0.001256f, 0.013760f, -0.001324f, -0.000805f, -0.001870f, 0.009272f, -0.010709f, 0.000959f, 0.007067f, 0.009281f, 0.011076f, -0.004102f, -0.007213f, -0.000867f, 0.015910f, 0.001546f, 0.005763f, -0.012857f, -0.005754f, 0.003203f, 0.002692f, -0.002143f, 0.008443f, -0.000511f, -0.001722f, 0.004796f, -0.008102f, 0.000590f, -0.001251f, 0.005627f, 0.008551f, -0.012481f, -0.002793f, 0.004145f, 0.008430f, + -0.005297f, -0.005136f, 0.003567f, 0.009986f, -0.000796f, 0.006718f, 0.004839f, 0.006888f, 0.002974f, 0.007682f, 0.011636f, 0.000472f, 0.003328f, -0.003167f, 0.004796f, 0.003382f, -0.002105f, -0.005179f, -0.000882f, -0.003663f, 0.001311f, -0.003347f, 0.001566f, -0.001512f, 0.000916f, -0.002710f, 0.000175f, -0.000243f, 0.000679f, -0.001617f, 0.002681f, -0.002426f, -0.000957f, -0.001069f, -0.001205f, 0.000346f, 0.001560f, 0.001531f, 0.000942f, -0.000708f, -0.000430f, -0.001114f, 0.003590f, 0.000666f, 0.032324f, 0.015578f, 0.012788f, -0.012066f, -0.002043f, -0.016809f, -0.011884f, 0.017901f, 0.001704f, -0.011378f, -0.005188f, 0.003799f, -0.010633f, -0.001010f, 0.018343f, 0.007266f, -0.000672f, 0.005826f, 0.026863f, -0.017862f, 0.004362f, -0.003373f, -0.008574f, 0.015368f, 0.007912f, 0.007962f, -0.005906f, 0.006873f, 0.008931f, -0.002742f, 0.005764f, -0.001826f, -0.007544f, 0.001573f, 0.002960f, -0.001342f, 0.009161f, 0.002226f, -0.003182f, 0.010023f, -0.004489f, -0.004736f, -0.005717f, 0.002811f, 0.003944f, 0.000726f, 0.007302f, 0.000964f, 0.022764f, 0.001489f, 0.000085f, -0.005265f, + -0.004632f, 0.005440f, -0.016770f, 0.000704f, 0.010220f, 0.008047f, -0.009006f, 0.013364f, 0.000329f, 0.005984f, 0.010775f, -0.003016f, 0.008366f, 0.006424f, -0.002830f, -0.009610f, -0.007242f, 0.006051f, 0.015274f, 0.004344f, -0.006489f, -0.003226f, -0.003631f, 0.010458f, -0.008737f, -0.000482f, 0.008722f, 0.010011f, 0.001491f, 0.001281f, -0.002651f, -0.004156f, 0.000292f, -0.000948f, -0.003397f, -0.000700f, -0.001485f, -0.001715f, -0.002583f, -0.001331f, 0.003664f, 0.002438f, -0.000592f, 0.004627f, 0.001478f, 0.001886f, -0.000474f, 0.001598f, -0.000687f, -0.000370f, -0.000062f, 0.000565f, 0.000695f, 0.001322f, 0.002628f, 0.000672f, 0.000418f, -0.000727f, 0.007854f, 0.002008f, 0.021185f, 0.005207f, 0.012667f, -0.000609f, 0.002885f, 0.003500f, 0.003606f, -0.003522f, 0.012963f, -0.005443f, 0.014020f, -0.006854f, -0.005276f, 0.003636f, -0.009082f, -0.002638f, -0.002777f, 0.003921f, 0.005909f, -0.003681f, -0.013339f, 0.006138f, -0.016151f, -0.006552f, -0.002634f, -0.000350f, -0.002417f, 0.003218f, 0.014728f, 0.008283f, 0.001133f, -0.015126f, -0.014431f, 0.000554f, 0.009989f, -0.005140f, + 0.001695f, -0.001801f, -0.006308f, -0.009681f, 0.001171f, 0.006672f, 0.014237f, 0.012770f, -0.001457f, 0.004159f, -0.017468f, 0.006113f, 0.011902f, 0.013405f, -0.001460f, 0.012235f, 0.002788f, 0.017773f, 0.010648f, 0.003479f, 0.008194f, -0.000704f, -0.004422f, -0.003040f, -0.001591f, 0.011202f, -0.004050f, -0.006170f, -0.007527f, 0.011188f, -0.002467f, -0.019346f, 0.004087f, 0.007474f, 0.011122f, 0.014213f, 0.024339f, -0.010010f, -0.008048f, 0.014373f, 0.015311f, 0.011989f, 0.005331f, -0.002403f, -0.002509f, -0.009312f, -0.010309f, -0.002851f, -0.003565f, 0.003251f, -0.000181f, -0.002981f, -0.000177f, -0.005748f, 0.001514f, -0.000695f, 0.003006f, 0.000459f, -0.004199f, -0.000281f, 0.000742f, -0.000659f, -0.000136f, 0.002198f, 0.004225f, 0.004066f, 0.003535f, 0.000957f, 0.001100f, -0.005878f, 0.000563f, 0.004250f, -0.002414f, 0.002375f, 0.000802f, -0.001594f, -0.001123f, -0.000665f, 0.004416f, 0.003167f, 0.000938f, -0.000295f, 0.002567f, 0.000273f, 0.001835f, 0.000976f, -0.001069f, 0.001386f, -0.000515f, -0.000545f, -0.027629f, 0.013225f, 0.019578f, 0.002208f, 0.016361f, 0.001877f, + -0.013938f, -0.001675f, -0.006301f, -0.003849f, 0.015134f, -0.019523f, -0.004973f, 0.006397f, 0.007925f, 0.017058f, -0.003044f, 0.007201f, -0.026852f, -0.014170f, 0.007354f, 0.015800f, -0.010223f, -0.007922f, -0.010986f, -0.014017f, 0.007555f, -0.002003f, 0.000523f, 0.004798f, 0.002874f, 0.005020f, 0.021518f, -0.013109f, 0.020893f, -0.001452f, 0.004581f, 0.004233f, 0.004845f, -0.006504f, 0.007521f, -0.014827f, -0.002373f, -0.008221f, -0.001143f, -0.011095f, 0.013455f, 0.001993f, 0.036576f, 0.000843f, -0.001930f, -0.009475f, 0.001991f, -0.007986f, 0.019302f, -0.011988f, 0.002897f, -0.021483f, 0.016268f, 0.014298f, -0.017138f, 0.010398f, 0.011270f, 0.004221f, -0.009108f, -0.009972f, 0.016323f, 0.003812f, -0.022664f, 0.010748f, -0.010555f, -0.006242f, 0.005606f, -0.006055f, 0.002455f, 0.004367f, 0.006605f, -0.012298f, -0.028817f, 0.003961f, 0.006948f, -0.001188f, -0.005885f, 0.011241f, -0.004580f, -0.004024f, -0.005015f, 0.007384f, -0.009059f, -0.004015f, -0.004979f, -0.004255f, 0.002771f, -0.003882f, 0.005407f, 0.000452f, -0.008010f, 0.005889f, 0.001205f, -0.004579f, 0.000136f, 0.005284f, + 0.002204f, 0.000002f, -0.000352f, -0.001789f, -0.004059f, 0.000112f, 0.001630f, 0.000305f, -0.000053f, 0.002291f, -0.004643f, 0.000295f, 0.001352f, -0.005863f, -0.003872f, -0.004991f, 0.012294f, 0.002392f, -0.000248f, -0.010383f, -0.017466f, 0.006187f, -0.009376f, -0.003770f, 0.016890f, -0.023013f, -0.009600f, -0.016957f, -0.001739f, 0.014546f, -0.001364f, -0.011998f, -0.016668f, -0.018699f, 0.007270f, 0.019777f, -0.005688f, 0.012354f, 0.018582f, -0.005157f, -0.004317f, 0.007278f, 0.010320f, 0.022075f, -0.003230f, 0.012404f, 0.001770f, 0.026245f, 0.019277f, 0.005270f, -0.006218f, 0.002636f, -0.014593f, 0.025476f, 0.005886f, -0.011266f, -0.012524f, 0.014680f, 0.012374f, 0.008915f, 0.006320f, 0.004340f, 0.013151f, -0.005733f, 0.005773f, -0.008762f, 0.001208f, 0.000682f, -0.013311f, -0.017744f, -0.006341f, -0.012545f, 0.007981f, -0.007674f, -0.005736f, -0.019357f, -0.012220f, 0.003662f, -0.006670f, -0.002359f, 0.009214f, 0.019308f, 0.024333f, 0.012644f, 0.010026f, -0.009046f, -0.019954f, 0.000296f, -0.013992f, -0.032183f, 0.000196f, -0.002314f, 0.011899f, 0.008028f, -0.007955f, -0.017961f, + -0.009825f, 0.008598f, -0.000524f, -0.002058f, -0.007511f, 0.003897f, 0.003984f, 0.003168f, -0.002012f, -0.010263f, 0.002043f, 0.001270f, 0.000885f, -0.002378f, -0.001368f, -0.001454f, 0.001156f, -0.005068f, -0.005256f, -0.000620f, 0.000502f, -0.004232f, 0.000238f, -0.000914f, 0.003708f, 0.005041f, -0.005673f, -0.000289f, 0.003882f, -0.000770f, -0.002467f, 0.000845f, 0.000438f, 0.005465f, -0.001874f, 0.003479f, 0.002657f, -0.002489f, -0.002247f, -0.037258f, -0.011265f, 0.001831f, 0.018240f, -0.013211f, 0.008993f, 0.005569f, -0.000593f, 0.026983f, -0.003494f, 0.025378f, -0.014931f, 0.007291f, 0.008242f, 0.000089f, -0.023254f, -0.009904f, -0.008603f, -0.026800f, 0.009194f, -0.006849f, 0.005762f, -0.001903f, 0.009755f, -0.000282f, -0.010275f, 0.005294f, -0.016983f, 0.012365f, 0.007495f, 0.028867f, -0.001130f, 0.000621f, 0.026705f, -0.023768f, 0.020752f, 0.025049f, -0.015737f, 0.016034f, -0.006715f, -0.007921f, -0.013199f, 0.003079f, 0.003142f, 0.017725f, 0.011651f, -0.004923f, -0.007427f, -0.015590f, 0.008447f, 0.009259f, -0.017505f, -0.008188f, 0.016472f, -0.029096f, 0.002726f, -0.022546f, + 0.012593f, 0.000925f, -0.000410f, 0.006421f, -0.007538f, 0.002247f, 0.026546f, -0.011255f, 0.005808f, 0.012598f, 0.008148f, 0.001098f, -0.013996f, 0.005859f, 0.005179f, -0.008472f, -0.022687f, -0.000089f, -0.005190f, -0.018312f, 0.013615f, -0.005240f, 0.005009f, -0.001068f, 0.002576f, 0.005370f, 0.005556f, -0.010400f, 0.002528f, -0.001365f, 0.002288f, -0.001171f, 0.006768f, 0.003018f, -0.001690f, -0.001622f, -0.009809f, -0.000768f, -0.006713f, 0.000787f, 0.001090f, 0.006709f, -0.010380f, 0.003456f, 0.005570f, -0.004326f, -0.006460f, 0.001902f, -0.000964f, -0.004212f, 0.003079f, -0.001237f, -0.004056f, 0.001011f, -0.001398f, -0.005076f, -0.001340f, -0.003443f, -0.006273f, 0.002505f, -0.001951f, 0.000133f, -0.003462f, -0.001169f, -0.003542f, 0.001205f, 0.006620f, -0.001347f, -0.004115f, -0.015335f, 0.044222f, -0.016565f, 0.008702f, 0.006141f, 0.015870f, 0.004752f, 0.009685f, 0.021804f, -0.016858f, -0.010639f, -0.001256f, 0.030406f, -0.011667f, -0.013217f, -0.015042f, 0.007368f, 0.005249f, 0.016550f, -0.034796f, 0.000133f, 0.000875f, -0.002571f, 0.018090f, -0.004556f, 0.013980f, 0.025484f, + -0.018535f, -0.008579f, 0.007451f, -0.014212f, -0.017488f, 0.011646f, -0.016237f, 0.023948f, -0.003994f, -0.025073f, -0.003159f, -0.014486f, 0.008028f, 0.019492f, -0.000253f, 0.009755f, -0.001093f, 0.003619f, 0.023599f, 0.000509f, 0.017151f, 0.006512f, -0.012626f, 0.013070f, 0.011491f, 0.001353f, 0.009672f, 0.033463f, -0.005464f, -0.015370f, 0.008127f, -0.019396f, 0.001623f, 0.031950f, 0.011047f, 0.004851f, -0.006012f, -0.009444f, -0.006083f, -0.011614f, 0.019516f, -0.012975f, -0.003280f, -0.008177f, 0.022128f, -0.040698f, 0.013957f, 0.014028f, 0.024467f, 0.005543f, 0.001967f, 0.021221f, -0.005958f, -0.009517f, -0.012039f, 0.000068f, -0.009997f, -0.001249f, -0.008587f, 0.006803f, 0.000758f, -0.007988f, -0.008062f, -0.007080f, 0.002709f, 0.008154f, 0.006834f, 0.001211f, 0.000593f, -0.003816f, -0.008744f, -0.003190f, -0.002187f, 0.003407f, 0.003822f, -0.001720f, -0.002089f, 0.001496f, -0.005214f, -0.000255f, -0.005059f, -0.002836f, -0.006690f, -0.009373f, -0.002462f, 0.002885f, 0.010233f, 0.001396f, -0.002745f, -0.002952f, 0.004056f, -0.001219f, 0.009807f, 0.004163f, 0.001762f, 0.001126f, + 0.003774f, 0.065045f, 0.019453f, -0.011899f, -0.015779f, -0.013357f, 0.047174f, -0.040678f, 0.003254f, 0.015867f, 0.002371f, -0.022081f, -0.004970f, 0.011004f, -0.002351f, 0.002510f, 0.019565f, -0.020303f, -0.017001f, 0.008280f, 0.025493f, 0.015645f, 0.006579f, -0.012425f, -0.012082f, -0.011698f, -0.013554f, 0.012549f, 0.004999f, 0.018012f, 0.014495f, 0.008185f, -0.019229f, -0.009219f, -0.020487f, -0.004150f, -0.013454f, -0.030998f, -0.005794f, 0.013715f, 0.003031f, -0.014435f, -0.014496f, 0.000263f, 0.007430f, 0.019242f, 0.002408f, 0.009703f, 0.002748f, 0.037273f, -0.032497f, 0.021110f, 0.003917f, -0.033220f, -0.006046f, -0.010099f, -0.008260f, 0.004962f, -0.014566f, 0.008619f, 0.006282f, 0.014693f, -0.018154f, 0.006269f, 0.028853f, 0.013419f, 0.045890f, -0.010425f, -0.001240f, -0.011445f, -0.005884f, 0.001105f, -0.001022f, -0.043751f, 0.019326f, -0.001986f, -0.002667f, 0.011674f, 0.011588f, -0.012522f, -0.018695f, -0.020485f, -0.007680f, 0.014259f, 0.006016f, -0.004913f, -0.012138f, 0.010415f, -0.019011f, 0.009704f, -0.003240f, -0.008726f, -0.010818f, -0.011766f, -0.004335f, -0.004050f, + 0.001672f, -0.005029f, -0.003436f, 0.002197f, -0.003638f, -0.003443f, 0.001827f, -0.009670f, -0.004496f, -0.000870f, -0.003408f, -0.005632f, -0.002610f, -0.009828f, 0.001161f, 0.006971f, 0.009494f, 0.011151f, -0.008475f, -0.010353f, -0.007395f, -0.009387f, 0.000122f, -0.000260f, -0.005842f, -0.006632f, 0.002219f, -0.001098f, 0.006081f, -0.002217f, -0.000713f, 0.004648f, 0.004654f, -0.004209f, -0.021509f, 0.005031f, 0.012129f, -0.000715f, -0.013103f, -0.009547f, -0.028647f, -0.034633f, 0.007426f, -0.015485f, -0.006964f, 0.004818f, 0.000009f, -0.003835f, -0.015041f, -0.007848f, 0.000157f, 0.011844f, 0.013177f, -0.019112f, -0.010523f, 0.011672f, -0.016607f, -0.008529f, -0.027396f, 0.026620f, -0.003169f, 0.023965f, 0.002442f, 0.008864f, 0.026016f, 0.019213f, -0.011070f, 0.005655f, 0.013399f, -0.013910f, -0.005242f, 0.012535f, -0.004374f, -0.030972f, -0.005373f, -0.021751f, 0.032004f, -0.003520f, -0.008044f, -0.018264f, -0.026039f, 0.009297f, 0.005963f, 0.006067f, 0.013397f, 0.000148f, -0.004440f, 0.013479f, 0.003859f, -0.002752f, 0.005177f, -0.007762f, 0.021301f, -0.005079f, 0.013586f, 0.038913f, + 0.009100f, 0.007207f, 0.009542f, 0.014285f, -0.033586f, -0.027628f, 0.010879f, -0.030139f, 0.021204f, -0.004347f, 0.024239f, 0.006192f, 0.046867f, 0.018144f, 0.003585f, -0.013588f, -0.005561f, -0.023971f, -0.001179f, 0.007374f, 0.005101f, 0.005006f, 0.008651f, 0.021131f, -0.008370f, -0.017250f, -0.005526f, -0.004831f, 0.007127f, 0.019189f, 0.007263f, -0.004676f, 0.006012f, 0.005611f, -0.000521f, -0.004470f, -0.010720f, 0.000737f, 0.001743f, -0.005471f, -0.006922f, -0.001412f, -0.011381f, 0.008338f, 0.005226f, -0.005564f, -0.001306f, -0.011766f, -0.005270f, 0.005490f, 0.010839f, -0.005137f, -0.004268f, -0.000159f, -0.008946f, 0.010119f, 0.000062f, 0.007320f, -0.009259f, 0.000099f, -0.009605f, 0.006053f, 0.010767f, -0.011765f, -0.003018f, -0.055159f, -0.039113f, 0.014714f, -0.015737f, -0.031762f, -0.048945f, -0.000868f, 0.003630f, -0.009114f, -0.008022f, 0.046767f, 0.011946f, -0.033237f, 0.006794f, -0.020142f, -0.017460f, -0.016284f, -0.030203f, -0.004590f, 0.002556f, -0.040924f, -0.039304f, -0.014477f, 0.006274f, 0.004236f, 0.023505f, 0.020446f, 0.012280f, -0.009542f, -0.000558f, 0.009573f, + -0.021342f, -0.011391f, -0.007382f, 0.007437f, -0.020045f, -0.011721f, 0.013457f, 0.008676f, -0.000673f, -0.002607f, -0.003842f, 0.011790f, -0.028769f, -0.015863f, -0.014215f, 0.019479f, -0.022310f, 0.015577f, 0.025360f, 0.035359f, -0.002405f, 0.010532f, -0.008346f, -0.016132f, -0.021908f, -0.005371f, 0.021470f, 0.008623f, -0.039149f, 0.002264f, 0.040416f, -0.026327f, 0.001272f, -0.005183f, 0.002130f, 0.010180f, 0.020616f, -0.003706f, 0.006547f, 0.025348f, 0.017035f, 0.011499f, -0.018942f, -0.022212f, 0.016688f, -0.015897f, -0.031214f, -0.029393f, 0.032733f, 0.013075f, 0.018107f, 0.008391f, -0.005093f, -0.005654f, 0.015666f, 0.011711f, 0.003016f, 0.015695f, -0.005907f, -0.019014f, -0.010074f, -0.013034f, 0.005622f, 0.020619f, 0.009819f, 0.003124f, 0.011919f, 0.007269f, 0.011133f, -0.001364f, -0.005493f, 0.007517f, -0.002297f, -0.006865f, -0.006321f, 0.006022f, -0.018008f, 0.004787f, 0.010866f, -0.005616f, 0.013408f, 0.009863f, -0.000541f, -0.000613f, 0.012677f, 0.002383f, -0.002632f, -0.007073f, -0.007530f, 0.003049f, 0.006831f, 0.002381f, 0.005567f, -0.006998f, -0.005427f, 0.003447f, + -0.004574f, 0.003730f, -0.002682f, -0.031738f, 0.017218f, -0.025557f, -0.047427f, 0.009123f, -0.029087f, -0.015835f, 0.054617f, 0.004447f, 0.040741f, 0.037931f, -0.008098f, 0.039915f, 0.053635f, 0.039291f, -0.049146f, -0.005765f, -0.023166f, -0.022131f, -0.014580f, 0.001700f, -0.020604f, 0.043075f, 0.011994f, 0.023974f, -0.020411f, 0.022986f, 0.016548f, 0.006445f, -0.025823f, -0.018892f, 0.039748f, -0.006603f, -0.038155f, -0.001797f, -0.044068f, -0.005507f, 0.011574f, -0.014830f, 0.000444f, -0.034737f, 0.015805f, 0.032992f, 0.016945f, -0.003949f, -0.017919f, -0.005709f, -0.004866f, -0.005236f, -0.016799f, -0.042825f, 0.029021f, 0.017400f, 0.014953f, 0.019296f, -0.025238f, 0.039329f, 0.004411f, -0.010795f, -0.009001f, -0.029862f, -0.013942f, 0.020736f, 0.011911f, 0.033780f, -0.003942f, -0.036856f, -0.066568f, -0.003044f, -0.000838f, 0.001122f, -0.024217f, -0.032484f, -0.006708f, 0.022943f, -0.011983f, -0.012616f, 0.008438f, -0.002095f, 0.033294f, -0.005745f, -0.030221f, -0.009806f, 0.030998f, 0.002906f, 0.005651f, -0.029554f, -0.011119f, -0.004829f, 0.012313f, 0.017235f, -0.008335f, 0.006609f, + 0.000981f, 0.013157f, 0.007716f, -0.000277f, 0.005188f, 0.017328f, 0.003742f, 0.000692f, -0.005678f, 0.002836f, 0.010579f, 0.000636f, 0.005271f, 0.019723f, 0.002534f, -0.005408f, -0.014064f, -0.000483f, 0.009846f, -0.008552f, 0.004936f, -0.003252f, -0.003149f, -0.005319f, -0.008506f, -0.005203f, -0.000040f, 0.012939f, 0.009054f, -0.011420f, -0.023245f, -0.005672f, 0.008474f, 0.004288f, 0.002973f, 0.002386f, 0.071121f, 0.043930f, -0.005751f, -0.041665f, 0.009212f, 0.019917f, 0.012369f, 0.029371f, 0.045504f, -0.020408f, 0.004260f, -0.040748f, 0.011932f, 0.002736f, -0.015034f, 0.071807f, 0.027983f, 0.061878f, 0.026334f, 0.015529f, -0.053877f, 0.000256f, 0.030899f, 0.004948f, -0.028431f, 0.011662f, -0.043749f, -0.017879f, 0.003579f, 0.012758f, -0.012733f, -0.009202f, 0.010129f, 0.007235f, 0.003725f, 0.038621f, 0.024889f, 0.005857f, -0.015178f, 0.026411f, -0.017043f, -0.013212f, -0.025304f, -0.009200f, 0.034202f, -0.053818f, -0.000301f, 0.023276f, -0.026038f, -0.008958f, 0.010642f, 0.008371f, 0.049651f, -0.003444f, -0.000046f, -0.023551f, 0.048553f, -0.022019f, 0.006572f, 0.004426f, + 0.033773f, -0.008381f, -0.011512f, 0.031047f, -0.052935f, 0.013304f, 0.005619f, -0.022778f, 0.043223f, -0.054032f, -0.006282f, -0.018485f, -0.035365f, -0.018579f, -0.002693f, 0.014567f, 0.034056f, 0.054722f, 0.027498f, 0.035941f, 0.056209f, -0.023320f, 0.010756f, 0.013367f, -0.023328f, 0.031568f, 0.001121f, -0.043321f, 0.022864f, 0.011174f, -0.015147f, 0.000834f, 0.033426f, 0.024255f, 0.007822f, 0.018999f, 0.006319f, 0.005757f, 0.018560f, -0.003896f, 0.008158f, 0.015500f, -0.003476f, 0.002896f, -0.002500f, -0.001567f, 0.011858f, 0.001604f, 0.001668f, -0.010631f, -0.005484f, -0.007567f, -0.013657f, 0.002415f, -0.007345f, -0.023214f, 0.009099f, 0.012880f, -0.004230f, -0.000898f, 0.006488f, -0.008462f, 0.000157f, 0.023165f, -0.003184f, -0.007335f, -0.014649f, -0.068805f, 0.019361f, 0.003165f, 0.082990f, 0.018414f, 0.015919f, -0.002726f, 0.040662f, 0.010404f, -0.060170f, -0.009775f, 0.065134f, -0.019683f, -0.013289f, 0.004961f, -0.004139f, 0.000956f, -0.011464f, 0.066928f, 0.077060f, -0.041803f, 0.018938f, 0.020112f, 0.011519f, 0.021239f, -0.033487f, -0.047230f, 0.036192f, 0.009284f, + -0.025537f, -0.045202f, -0.013132f, -0.015756f, 0.041051f, 0.032726f, 0.018957f, -0.038398f, 0.020999f, -0.017007f, 0.013462f, 0.001613f, 0.017738f, 0.037800f, 0.009054f, -0.086684f, -0.026165f, 0.015106f, -0.034274f, 0.009772f, 0.036664f, 0.011546f, 0.063709f, -0.021758f, -0.095305f, -0.002950f, -0.037913f, 0.032457f, 0.028959f, -0.011183f, -0.020181f, 0.028713f, -0.045729f, -0.008982f, -0.024665f, 0.020837f, 0.029944f, 0.024664f, 0.027816f, -0.021519f, -0.038772f, -0.116489f, -0.055218f, -0.068165f, 0.010687f, -0.046497f, -0.022057f, -0.010193f, -0.050125f, 0.025969f, -0.090281f, 0.027183f, -0.064925f, -0.048017f, 0.046324f, 0.053737f, -0.016816f, -0.003216f, 0.029630f, 0.037563f, -0.053025f, 0.000118f, 0.008651f, -0.008678f, 0.009313f, 0.027423f, -0.003688f, 0.011509f, -0.002469f, 0.010022f, -0.023505f, -0.013420f, -0.010768f, -0.016582f, -0.003445f, 0.021184f, 0.009189f, 0.018932f, 0.000645f, -0.022512f, -0.019461f, 0.002124f, 0.011605f, -0.005673f, 0.012322f, 0.011714f, 0.031247f, 0.001765f, 0.010640f, 0.002074f, 0.007312f, -0.015198f, -0.004419f, 0.004354f, -0.011428f, -0.000849f, + -0.005353f, -0.000126f, 0.005613f, 0.031318f, -0.003244f, -0.020970f, -0.021808f, 0.000595f, -0.002141f, -0.033350f, -0.021012f, 0.015151f, -0.023438f, -0.000141f, -0.001164f, -0.088443f, -0.014010f, 0.060556f, -0.071526f, 0.008157f, 0.025612f, 0.001993f, 0.017733f, -0.004022f, -0.056784f, -0.003396f, 0.029769f, 0.011571f, 0.044736f, 0.032144f, -0.048767f, -0.050648f, -0.007618f, -0.021136f, -0.008079f, -0.084319f, 0.031371f, 0.035363f, 0.059290f, 0.028665f, 0.053925f, -0.022191f, 0.006863f, 0.057493f, -0.018327f, 0.062461f, 0.016393f, 0.033723f, 0.010331f, -0.014089f, 0.029609f, -0.035587f, 0.001259f, 0.078622f, -0.060424f, 0.007003f, -0.078415f, -0.033597f, -0.056521f, -0.036603f, -0.010296f, 0.005606f, -0.018884f, -0.057857f, -0.011188f, -0.097090f, 0.110936f, 0.040614f, 0.000227f, -0.013538f, -0.027341f, 0.007737f, -0.049420f, 0.010628f, -0.073840f, 0.003258f, 0.003378f, 0.018009f, 0.046728f, 0.069417f, 0.002012f, -0.112137f, -0.052575f, 0.050380f, -0.025097f, -0.021075f, -0.027818f, -0.013466f, 0.055889f, 0.013353f, -0.031756f, 0.025265f, -0.052905f, 0.010894f, -0.010175f, -0.021667f, + -0.053366f, -0.028378f, 0.033510f, -0.014247f, -0.013011f, 0.019899f, -0.019887f, -0.004355f, 0.033421f, -0.037349f, -0.026631f, -0.009584f, -0.008204f, 0.043954f, 0.019611f, 0.013331f, 0.024910f, 0.011714f, -0.004080f, 0.021383f, -0.000368f, 0.016250f, 0.020420f, 0.033716f, -0.012218f, 0.001817f, -0.003391f, 0.025466f, 0.035695f, 0.015314f, -0.008325f, -0.000377f, -0.010544f, -0.023560f, 0.045682f, -0.011053f, 0.023711f, -0.011100f, 0.007559f, -0.011894f, -0.009909f, 0.014018f, 0.024811f, 0.001230f, -0.008122f, -0.004393f, 0.021763f, -0.045601f, 0.032655f, 0.049625f, 0.019961f, -0.024496f, -0.029732f, 0.013567f, -0.038745f, 0.061967f, 0.053858f, 0.078869f, -0.055975f, -0.071676f, -0.016515f, -0.002897f, -0.034461f, 0.045847f, 0.058326f, -0.043569f, 0.000989f, -0.076686f, -0.021131f, -0.037000f, -0.066953f, 0.020237f, 0.057294f, 0.032744f, -0.043145f, -0.018447f, 0.006282f, 0.036572f, 0.006754f, -0.004018f, 0.015302f, -0.005549f, -0.018075f, -0.062277f, -0.040304f, 0.014459f, -0.004639f, -0.034460f, 0.037087f, 0.030782f, 0.021478f, -0.063716f, -0.055901f, 0.052601f, 0.033567f, 0.038780f, + -0.039619f, -0.105314f, -0.018625f, 0.042555f, 0.044525f, -0.011914f, 0.106272f, -0.014334f, 0.106817f, -0.160333f, -0.196243f, -0.082291f, -0.117843f, 0.000145f, 0.047283f, 0.023134f, 0.129469f, -0.015856f, -0.007459f, 0.022683f, -0.024746f, -0.102652f, -0.089399f, -0.101787f, 0.081263f, 0.064546f, -0.023987f, -0.008071f, -0.167251f, 0.045571f, -0.001336f, -0.076322f, 0.031992f, 0.046811f, 0.075119f, 0.056991f, 0.027747f, -0.006472f, -0.049165f, 0.000186f, 0.003237f, -0.015301f, -0.020747f, 0.058001f, 0.037301f, 0.021763f, 0.061191f, -0.047926f, 0.011831f, -0.014402f, -0.028192f, 0.036505f, -0.005282f, -0.067513f, 0.000200f, 0.019457f, -0.023082f, 0.029964f, -0.011975f, 0.006963f, -0.014019f, 0.071956f, 0.057911f, 0.066542f, -0.056759f, -0.014500f, 0.070992f, 0.050586f, -0.049419f, -0.032404f, -0.049800f, -0.031204f, 0.041610f, 0.045130f, -0.015915f, -0.006331f, 0.078994f, 0.001703f, 0.007749f, -0.011944f, 0.014469f, 0.011898f, -0.002204f, -0.040429f, -0.009880f, -0.009710f, 0.012687f, 0.022788f, -0.076371f, 0.066680f, 0.050691f, 0.020907f, 0.062773f, -0.036818f, 0.023138f, -0.103867f, + -0.050228f, 0.027417f, 0.038407f, 0.017709f, 0.013442f, 0.013017f, 0.026937f, -0.012542f, 0.118325f, 0.010758f, 0.073714f, 0.021254f, -0.035460f, 0.090227f, -0.012182f, 0.035495f, 0.001963f, 0.032407f, -0.003309f, -0.001834f, 0.019901f, 0.045337f, 0.013294f, 0.033153f, 0.002443f, -0.006697f, 0.071280f, 0.008218f, -0.014863f, 0.001349f, -0.005455f, -0.035690f, -0.010100f, 0.020173f, 0.013391f, -0.080145f, -0.019453f, 0.010284f, 0.018741f, 0.084092f, 0.068583f, -0.082863f, -0.045572f, 0.007016f, -0.018193f, 0.092603f, 0.009210f, 0.085430f, -0.059834f, 0.043099f, 0.008854f, 0.004918f, 0.039803f, 0.087812f, 0.057067f, 0.011896f, 0.077680f, 0.030652f, -0.036254f, -0.077895f, 0.068702f, -0.062071f, 0.041630f, -0.081808f, 0.000565f, -0.129864f, 0.135227f, -0.033155f, 0.004851f, -0.090851f, 0.082165f, -0.031555f, 0.026139f, -0.066582f, 0.079379f, -0.041011f, -0.037047f, -0.026806f, -0.049598f, 0.015769f, -0.027707f, 0.023913f, -0.025671f, 0.043685f, -0.048422f, 0.043775f, -0.050986f, 0.028528f, -0.059730f, 0.048244f, -0.020504f, 0.053518f, -0.018365f, 0.028227f, -0.022415f, 0.018354f, + -0.025595f, 0.001326f, -0.027986f, 0.032664f, 0.013403f, 0.009544f, -0.011030f, 0.003532f, -0.022291f, 0.017775f, -0.022901f, 0.041129f, -0.033461f, -0.039702f, -0.017861f, 0.016686f, -0.047430f, 0.037272f, -0.011533f, 0.020690f, -0.013307f, 0.011991f, -0.021676f, 0.010754f, -0.011059f, 0.012790f, 0.015845f, -0.002885f, -0.131190f, -0.031648f, -0.010966f, 0.014670f, 0.010850f, -0.080165f, -0.047959f, 0.074263f, -0.029244f, 0.028017f, -0.033237f, 0.008161f, 0.091299f, 0.149437f, 0.009524f, -0.004256f, 0.073801f, 0.033526f, 0.030144f, 0.092956f, 0.001350f, 0.056705f, 0.066797f, 0.065875f, -0.026085f, 0.029104f, 0.057680f, 0.082327f, 0.065828f, 0.101012f, 0.055793f, 0.128697f, 0.134765f, 0.098973f, 0.107349f, 0.074715f, -0.008630f, 0.037197f, 0.018582f, -0.026767f, -0.028165f, 0.022417f, 0.062504f, 0.015568f, 0.002403f, 0.000860f, 0.030665f, 0.095038f, 0.072479f, 0.158790f, 0.031332f, -0.080552f, 0.032235f, 0.002850f, 0.032990f, -0.040748f, 0.062240f, -0.112965f, -0.147717f, 0.042498f, 0.147805f, 0.065770f, 0.029270f, -0.182326f, 0.000752f, 0.071152f, 0.110663f, 0.150395f, + -0.063613f, 0.010605f, -0.257173f, -0.168003f, 0.068416f, 0.097667f, -0.143307f, -0.120645f, -0.076319f, 0.141941f, 0.093527f, -0.166535f, -0.217143f, -0.042394f, 0.088250f, -0.102316f, 0.049318f, -0.014379f, -0.037636f, -0.054540f, 0.007691f, 0.023863f, 0.036489f, -0.004934f, -0.089840f, -0.076058f, 0.009578f, -0.022554f, 0.037705f, 0.006799f, -0.009295f, -0.032456f, -0.022558f, 0.015913f, -0.001930f, -0.072891f, -0.037487f, -0.054711f, -0.029104f, 0.012032f, -0.028661f, -0.019300f, -0.066668f, -0.086973f, -0.122209f, -0.120286f, -0.102973f, -0.085677f, -0.096502f, -0.094095f, -0.073197f, -0.099301f, -0.107196f, -0.089300f, -0.102914f, -0.064501f, -0.017434f, -0.056898f, -0.085747f, -0.054666f, 0.003399f, -0.028847f, -0.016416f, -0.017901f, 0.045641f, 0.050568f, 0.002490f, 0.024267f, 0.025549f, 0.017008f, 0.015033f, 0.003072f, 0.011986f, 0.011193f, 0.011088f, 0.008306f, 0.012930f, 0.004720f, 0.010544f, 0.004792f, 0.004038f, -0.000578f, 0.002719f, -0.024109f, -0.004479f, -0.047824f, 0.122498f, 0.139468f, -0.157131f, -0.064066f, 0.059445f, -0.042831f, 0.029382f, -0.056399f, 0.051469f, -0.047634f, + 0.011501f, 0.000729f, -0.023678f, 0.012718f, 0.002418f, -0.014084f, -0.011315f, -0.037933f, -0.010585f, 0.009232f, 0.004465f, -0.038673f, 0.037213f, -0.035418f, -0.012762f, -0.030622f, 0.003307f, -0.029283f, 0.060913f, -0.000712f, 0.015880f, -0.015888f, 0.015813f, -0.016932f, 0.017092f, 0.037974f, 0.050523f, -0.013247f, 0.016702f, 0.019328f, 0.044268f, -0.027358f, 0.028313f, -0.024346f, 0.053226f, -0.013671f, -0.031051f, 0.017943f, -0.013979f, -0.015744f, 0.005505f, -0.004223f, 0.022411f, -0.011777f, -0.031351f, -0.029238f, 0.003906f, 0.006300f, -0.054125f, 0.016777f, -0.009102f, -0.004772f, 0.008331f, -0.014483f, -0.010012f, 0.006010f, -0.009487f, 0.007948f, -0.029711f, 0.034238f, -0.096385f, 0.050940f, -0.041733f, 0.064506f, -0.043925f, 0.057831f, -0.001867f, 0.031709f, 0.016843f, 0.025914f, 0.010388f, 0.004902f, 0.009741f, -0.001356f, -0.041454f, -0.007709f, 0.000568f, -0.015550f, -0.008926f, -0.007789f, -0.005667f, 0.003001f, -0.016677f, -0.000486f, 0.004332f, -0.000668f, -0.026466f, 0.027681f, -0.005941f, 0.015195f, -0.028153f, 0.013774f, -0.018004f, 0.011921f, -0.020806f, 0.023142f, + -0.029777f, 0.041057f, -0.009247f, 0.006601f, -0.043029f, 0.029777f, -0.003758f, 0.021999f, -0.041060f, 0.011148f, -0.018273f, 0.007367f, -0.009976f, 0.005069f, -0.027831f, 0.014201f, -0.007327f, -0.014545f, -0.000550f, 0.033558f, -0.038476f, 0.003883f, -0.016519f, 0.020452f, -0.027840f, 0.025773f, -0.022925f, 0.008192f, -0.017278f, 0.020267f, -0.009649f, 0.011857f, -0.010592f, 0.013099f, -0.017430f, 0.010155f, -0.009736f, -0.001120f, -0.004839f, 0.008706f, -0.005928f, 0.004657f, 0.000282f, 0.006576f, -0.008180f, 0.003194f, 0.001068f, -0.003730f, 0.005238f, -0.004924f, 0.002817f, -0.007017f, 0.005937f, -0.007590f, 0.004283f, -0.005659f, 0.005091f, -0.004131f, 0.004397f, -0.005582f, 0.007118f, -0.007018f, 0.006192f, -0.006572f, 0.007466f, -0.005704f, 0.007518f, -0.007503f, 0.008830f, -0.009279f, 0.008039f, -0.009588f, 0.007827f, -0.007631f, 0.009254f, -0.010723f, 0.009790f, -0.009276f, 0.008661f, -0.011899f, 0.009564f, -0.011536f, 0.010119f, -0.008610f, 0.009300f, -0.008730f, 0.007922f, -0.009230f, 0.008298f, -0.010222f, 0.006001f, -0.025080f, 0.118192f, 0.071979f, -0.039204f, -0.044697f, + -0.004105f, 0.147285f, 0.061285f, 0.020831f, 0.040552f, -0.035453f, -0.045181f, 0.012763f, 0.028400f, 0.007669f, 0.002441f, -0.015438f, -0.012349f, 0.014069f, 0.013971f, 0.034474f, 0.015104f, -0.018224f, -0.008270f, -0.008887f, -0.018734f, 0.000039f, 0.003162f, 0.009370f, 0.011495f, 0.000608f, -0.005050f, 0.013924f, -0.039585f, -0.014742f, 0.017462f, 0.025448f, 0.031128f, -0.017306f, -0.010316f, -0.018412f, 0.031851f, 0.022370f, -0.006127f, 0.010428f, -0.036984f, -0.031657f, 0.029401f, 0.023208f, 0.007166f, -0.055644f, -0.028817f, 0.002594f, 0.009266f, 0.037115f, 0.026273f, -0.003831f, 0.010783f, 0.013386f, -0.017521f, 0.016297f, 0.017313f, -0.004816f, -0.010694f, 0.010624f, -0.018739f, 0.002074f, -0.003214f, -0.012812f, -0.020061f, 0.028157f, 0.005689f, 0.006496f, 0.038339f, 0.046968f, 0.016522f, 0.038078f, 0.035346f, -0.005236f, -0.009520f, -0.010277f, -0.006784f, 0.015081f, 0.024138f, -0.009006f, 0.007463f, -0.021285f, -0.007818f, -0.000708f, 0.005205f, -0.011442f, -0.014029f, 0.014947f, 0.027971f, 0.012437f, 0.007822f, 0.012061f, -0.013318f, 0.001474f, 0.013374f, 0.002987f, + -0.004059f, 0.003739f, -0.001247f, -0.015854f, 0.033207f, 0.011182f, -0.026329f, -0.024591f, 0.010210f, -0.004543f, 0.026244f, 0.014227f, -0.003167f, 0.010171f, 0.003531f, -0.004963f, -0.001013f, -0.007099f, 0.007848f, 0.012412f, 0.002073f, -0.002682f, -0.010130f, 0.009327f, -0.001812f, -0.008229f, -0.000081f, -0.042329f, -0.117243f, 0.040698f, 0.215229f, 0.169472f, 0.162035f, 0.051980f, -0.150869f, -0.090296f, -0.133757f, -0.133927f, -0.122293f, -0.042513f, 0.065778f, 0.085064f, 0.133490f, 0.119798f, 0.071974f, 0.012239f, 0.011672f, -0.057772f, -0.091638f, -0.130898f, -0.050473f, -0.035440f, 0.011704f, -0.007256f, 0.066438f, 0.045050f, 0.019041f, 0.089044f, 0.049865f, 0.038187f, -0.007820f, 0.033522f, -0.060431f, -0.045390f, -0.037698f, -0.043839f, -0.057968f, -0.034773f, -0.023160f, -0.058787f, -0.040805f, 0.015765f, 0.086635f, 0.083801f, 0.095002f, 0.074773f, 0.108629f, 0.018920f, 0.027789f, -0.072134f, -0.053535f, -0.045759f, -0.108438f, -0.107838f, -0.096899f, -0.045682f, -0.056801f, 0.013410f, 0.041989f, 0.060608f, 0.121579f, 0.119566f, 0.114317f, 0.102685f, 0.089748f, 0.019263f, + -0.052818f, -0.085898f, -0.153609f, -0.131861f, -0.096258f, -0.131066f, -0.060894f, -0.027314f, 0.005747f, 0.128733f, 0.100820f, 0.148071f, 0.146182f, 0.106878f, 0.029869f, -0.029486f, -0.043756f, -0.050657f, -0.045247f, -0.087101f, -0.107819f, -0.075279f, -0.051483f, -0.045464f, 0.005691f, 0.030293f, 0.048149f, 0.041513f, 0.086671f, 0.094789f, 0.071609f, 0.056976f, 0.009497f, -0.020064f, -0.040914f, -0.066913f, -0.057499f, -0.040810f, -0.064214f, -0.087014f, -0.009209f, 0.004979f, -0.014326f, 0.074865f, 0.098884f, 0.063220f, 0.055584f, 0.004064f, 0.015710f, -0.010394f, -0.017418f, -0.043356f, -0.050828f, -0.033487f, -0.037992f, 0.005276f, -0.015163f, 0.004757f, 0.000752f, 0.033964f, 0.018366f, 0.017442f, 0.031917f, 0.032384f, 0.000066f, -0.008760f, -0.023149f, -0.023330f, -0.006579f, -0.005450f, -0.011168f, -0.011301f, 0.002221f, 0.002543f, -0.002726f, 0.005332f, 0.006174f, 0.005459f, 0.001728f, 0.020788f, 0.007756f, -0.000795f, 0.003304f, -0.001157f, -0.007619f, -0.008024f, -0.009150f, -0.010962f, -0.009642f, -0.003098f, -0.001659f, 0.000593f, 0.009120f, 0.011786f, 0.009153f, 0.008666f, + 0.004575f, 0.000796f, 0.000129f, -0.001505f, -0.008751f, -0.005238f, -0.000063f, -0.005654f, -0.008047f, -0.004232f, -0.000937f, 0.003642f, 0.002586f, 0.000078f, 0.002202f, 0.005842f, 0.004179f, 0.002587f, 0.005848f, 0.002813f, -0.000372f, -0.002669f, -0.004484f, -0.003717f, -0.003771f, -0.003153f, -0.002229f, -0.001708f, -0.000148f, 0.000423f, -0.000021f, 0.001010f, 0.002163f, 0.002000f, 0.003230f, 0.004389f, 0.002239f, 0.000585f, 0.001188f, -0.000814f, -0.001935f, -0.003047f, -0.003388f, -0.003122f, -0.002446f, -0.001224f, 0.000087f, 0.000121f, 0.001737f, 0.002216f, 0.001338f, 0.001576f, 0.002942f, 0.001900f, 0.000389f, -0.000839f, -0.000650f, -0.000702f, -0.001590f, -0.002273f, -0.001188f, -0.000621f, -0.000009f, 0.000233f, 0.000586f, 0.000390f, 0.000636f, 0.000275f, 0.000296f, -0.000015f, 0.000218f, -0.000063f, 0.000108f, -0.000133f, 0.000123f}, + {-0.006005f, -0.008016f, -0.011238f, 0.003637f, -0.005367f, -0.011574f, -0.007015f, 0.004914f, -0.014075f, -0.008174f, -0.017267f, 0.005844f, 0.008065f, 0.009719f, 0.005674f, -0.006368f, 0.013507f, -0.009321f, 0.002921f, 0.000037f, -0.001667f, -0.009836f, -0.004674f, -0.010794f, 0.000654f, -0.004726f, 0.006151f, 0.003673f, -0.004794f, -0.001849f, -0.000910f, -0.009926f, -0.000163f, -0.002392f, 0.004546f, -0.000411f, 0.009003f, -0.003357f, 0.011328f, -0.005039f, 0.000383f, 0.001547f, -0.007856f, 0.005390f, -0.002244f, -0.003346f, 0.001156f, -0.002428f, 0.004482f, -0.017206f, 0.008100f, 0.009984f, 0.001666f, 0.005573f, 0.003347f, -0.007747f, -0.000818f, -0.008387f, 0.011299f, -0.003171f, -0.006773f, 0.006477f, -0.010055f, 0.000220f, 0.004089f, -0.011813f, 0.001510f, -0.002935f, -0.004297f, 0.003777f, 0.000978f, 0.000854f, -0.005379f, -0.003705f, -0.018536f, -0.002468f, 0.004117f, -0.003160f, 0.000984f, 0.002166f, 0.010002f, 0.008342f, 0.000570f, 0.002688f, 0.001266f, -0.001692f, -0.001316f, -0.002577f, -0.001261f, -0.000868f, -0.001837f, -0.001779f, -0.000012f, 0.001754f, 0.001267f, 0.001168f, + -0.002820f, -0.000054f, -0.000035f, -0.000853f, -0.000140f, 0.000652f, -0.000353f, 0.000066f, -0.001330f, -0.001136f, -0.001181f, -0.000087f, -0.001104f, 0.001705f, 0.002247f, 0.002303f, -0.026554f, -0.015972f, 0.002954f, -0.008633f, 0.001645f, -0.008907f, -0.015255f, -0.010169f, 0.017318f, 0.010068f, -0.002684f, 0.011718f, 0.002760f, 0.002871f, 0.003289f, -0.005697f, -0.001550f, 0.009521f, -0.007680f, 0.004316f, 0.006952f, -0.007455f, -0.011772f, 0.005378f, -0.009624f, 0.001056f, 0.005509f, 0.014114f, -0.003190f, -0.006829f, -0.005967f, 0.002185f, 0.007680f, -0.010457f, -0.000092f, 0.008572f, 0.003377f, 0.000887f, -0.000574f, -0.000822f, 0.011150f, -0.000444f, 0.010214f, 0.006699f, -0.002603f, 0.006674f, -0.002364f, -0.000629f, -0.001053f, -0.018680f, 0.006449f, 0.010526f, -0.006114f, -0.003501f, 0.002560f, 0.002848f, 0.002984f, 0.001624f, -0.001027f, -0.002277f, 0.000618f, -0.004719f, 0.012762f, -0.005755f, 0.001472f, 0.006912f, 0.005531f, -0.004596f, 0.005030f, 0.001567f, 0.003271f, 0.006980f, 0.006170f, -0.009298f, 0.009581f, 0.010604f, -0.003624f, 0.000149f, -0.000688f, 0.006913f, + -0.008518f, -0.004457f, 0.001852f, 0.001182f, 0.000311f, 0.000425f, -0.001824f, -0.002893f, 0.001697f, -0.001387f, -0.000743f, 0.000459f, 0.002423f, -0.001844f, -0.000439f, 0.000017f, -0.003348f, 0.001100f, -0.001990f, -0.002088f, -0.001616f, 0.001208f, 0.000168f, -0.001000f, -0.002005f, 0.000433f, -0.010525f, 0.013459f, 0.008808f, 0.020823f, -0.003454f, 0.002244f, 0.006378f, -0.010105f, -0.002096f, 0.004046f, -0.004176f, -0.013727f, -0.000813f, 0.001498f, 0.009227f, -0.011083f, -0.027115f, -0.021878f, -0.013483f, 0.005237f, 0.012899f, -0.012958f, 0.007306f, -0.006343f, 0.009968f, 0.007765f, 0.006758f, 0.011967f, 0.006659f, -0.009342f, -0.008640f, 0.001645f, 0.006393f, -0.000471f, 0.000551f, 0.016732f, -0.000125f, 0.002931f, 0.008326f, 0.008803f, 0.001463f, 0.000271f, 0.020667f, -0.001426f, -0.007754f, -0.002314f, 0.004700f, 0.006047f, -0.004001f, 0.011128f, 0.002185f, 0.005984f, -0.007943f, -0.007022f, -0.002708f, -0.004635f, 0.002697f, -0.003672f, 0.012103f, -0.013940f, -0.012458f, 0.015118f, -0.001578f, -0.000610f, -0.017544f, 0.005476f, -0.008506f, 0.009492f, -0.007297f, -0.019416f, + -0.000888f, 0.010022f, -0.008318f, 0.012948f, -0.007771f, 0.005974f, 0.012081f, -0.003396f, 0.005057f, 0.012176f, -0.000790f, -0.008955f, 0.000757f, 0.005958f, 0.002758f, -0.004325f, 0.008379f, 0.000575f, 0.004421f, 0.001681f, 0.001208f, 0.003188f, 0.000580f, -0.001246f, -0.000083f, 0.000458f, 0.001286f, -0.003362f, -0.001713f, -0.001745f, 0.003222f, 0.000406f, 0.003284f, 0.003429f, -0.003166f, 0.000798f, 0.000838f, -0.001812f, -0.001353f, -0.000635f, 0.000624f, -0.001642f, 0.000684f, -0.001717f, 0.032401f, 0.007630f, 0.008645f, 0.003707f, -0.007395f, 0.015547f, -0.007348f, -0.004405f, 0.019791f, -0.001491f, 0.015919f, -0.001681f, -0.018177f, 0.006432f, -0.006157f, 0.020066f, 0.010580f, -0.001402f, -0.017952f, -0.012568f, 0.016615f, 0.019684f, -0.022964f, 0.011513f, 0.009229f, 0.006921f, -0.001487f, 0.002229f, 0.001933f, -0.001747f, 0.022772f, -0.001037f, -0.003885f, -0.006278f, -0.007620f, -0.009744f, -0.003199f, -0.000522f, -0.013101f, -0.004674f, 0.003435f, -0.009141f, 0.000520f, 0.000522f, 0.013630f, -0.005112f, 0.000438f, 0.006331f, 0.000549f, 0.013015f, 0.005888f, 0.013532f, + 0.006704f, 0.004118f, -0.014305f, 0.001501f, -0.010597f, -0.009922f, 0.002383f, 0.013800f, -0.000529f, 0.011851f, -0.004960f, -0.008969f, -0.002072f, 0.000564f, 0.003499f, 0.008135f, -0.003754f, -0.000080f, -0.004444f, 0.004542f, 0.003122f, -0.011681f, 0.002281f, 0.002416f, 0.001559f, -0.003294f, 0.012224f, -0.001305f, -0.002379f, 0.001300f, 0.005740f, 0.002508f, -0.004005f, -0.001307f, -0.001619f, -0.002947f, 0.002406f, -0.003521f, 0.005769f, -0.003487f, -0.000680f, 0.000690f, -0.002719f, -0.000793f, 0.003208f, -0.003784f, -0.000857f, -0.004073f, 0.001583f, 0.001686f, 0.003273f, -0.004448f, 0.000885f, -0.001828f, 0.002248f, -0.001527f, -0.005307f, -0.001720f, 0.009139f, 0.006404f, 0.007349f, 0.020836f, 0.010902f, -0.009043f, -0.008085f, -0.022427f, -0.001457f, -0.000499f, -0.011968f, 0.004549f, 0.017997f, 0.002181f, -0.014180f, 0.013167f, 0.012512f, -0.001305f, 0.005002f, 0.012681f, 0.003005f, -0.011523f, -0.001779f, 0.026868f, 0.013217f, 0.002778f, -0.017726f, -0.006346f, 0.016169f, 0.005562f, -0.002416f, 0.009104f, 0.008140f, 0.008524f, -0.000069f, 0.016676f, -0.000152f, -0.002141f, + 0.004202f, -0.008287f, -0.010857f, -0.000551f, 0.001836f, 0.006198f, 0.003404f, -0.010147f, 0.010301f, 0.018080f, 0.009280f, -0.000500f, 0.013427f, -0.015294f, 0.008719f, -0.009114f, 0.009580f, -0.002558f, -0.011006f, -0.000564f, -0.014337f, -0.023470f, -0.008569f, -0.009330f, -0.001148f, -0.000105f, -0.012290f, 0.002377f, -0.003780f, 0.007121f, 0.004698f, 0.008435f, -0.001352f, 0.003391f, -0.011835f, 0.002044f, 0.001868f, 0.016479f, -0.006375f, -0.000526f, -0.005730f, 0.003475f, 0.014820f, 0.007613f, -0.008617f, -0.013779f, 0.004347f, -0.005516f, -0.001896f, 0.007160f, -0.001021f, 0.002401f, 0.001678f, -0.008209f, 0.000384f, -0.006266f, 0.001772f, -0.005953f, -0.004011f, -0.002175f, -0.000257f, -0.000809f, 0.001074f, -0.003817f, -0.000404f, -0.001292f, -0.003045f, -0.002574f, 0.000906f, -0.000678f, -0.001583f, 0.000396f, 0.001402f, 0.004550f, -0.001625f, 0.002657f, -0.001983f, -0.004605f, 0.003395f, -0.005038f, 0.004821f, -0.000468f, -0.003254f, -0.000563f, 0.001600f, 0.003527f, -0.002624f, -0.000359f, 0.000751f, -0.000904f, -0.021971f, -0.014517f, 0.031068f, -0.006791f, -0.006824f, 0.001834f, + -0.001095f, 0.033325f, -0.009744f, -0.017964f, 0.000434f, -0.017721f, 0.004416f, 0.014154f, 0.015199f, 0.004819f, -0.030926f, 0.025431f, -0.020013f, 0.010644f, -0.013683f, -0.010383f, -0.007662f, 0.012705f, 0.013642f, -0.020446f, 0.001615f, 0.008951f, -0.006355f, 0.004113f, 0.006001f, -0.007381f, 0.000941f, -0.016836f, -0.011330f, -0.025994f, 0.015397f, -0.003622f, 0.026215f, -0.012199f, 0.005686f, 0.017526f, -0.004380f, -0.005184f, -0.007757f, 0.020084f, 0.014647f, -0.024623f, 0.007024f, -0.013919f, -0.004685f, -0.005396f, -0.013844f, 0.008330f, 0.004403f, 0.021717f, 0.015267f, -0.027240f, -0.004474f, -0.011691f, 0.015920f, 0.005559f, 0.001365f, -0.015887f, 0.002377f, -0.001657f, 0.013378f, -0.002220f, 0.001670f, -0.018276f, -0.000423f, 0.013003f, -0.011983f, 0.002025f, -0.003785f, -0.003556f, -0.009686f, 0.001962f, -0.001280f, 0.023039f, 0.010148f, 0.010544f, -0.004221f, -0.002560f, -0.004006f, -0.006261f, -0.003370f, 0.005148f, -0.007052f, -0.002232f, -0.006917f, 0.005236f, 0.004384f, -0.003751f, -0.002120f, 0.004868f, -0.006512f, 0.003235f, 0.000986f, -0.001742f, -0.002072f, 0.001752f, + -0.000185f, -0.000585f, -0.001252f, 0.004255f, -0.006281f, 0.000840f, 0.000563f, 0.003186f, 0.003438f, 0.003447f, -0.003188f, 0.000946f, -0.002250f, 0.004602f, 0.001263f, 0.001093f, 0.003365f, 0.007581f, -0.008352f, 0.000572f, -0.017608f, -0.002201f, -0.020319f, 0.003181f, -0.005090f, 0.011665f, -0.000821f, 0.009898f, -0.013917f, -0.026201f, 0.005562f, 0.017635f, 0.002305f, -0.002122f, 0.013754f, 0.009260f, -0.021426f, -0.000338f, -0.008075f, 0.027135f, -0.001201f, 0.003166f, 0.002138f, 0.000286f, -0.000842f, -0.009725f, 0.021508f, -0.001818f, -0.030467f, -0.005713f, 0.018480f, -0.011890f, 0.003093f, -0.000475f, 0.002482f, -0.003805f, 0.002956f, -0.005595f, 0.007300f, -0.011678f, 0.011026f, 0.015457f, -0.012091f, -0.003075f, -0.007150f, -0.021210f, 0.008516f, -0.015054f, 0.013134f, -0.013230f, -0.022881f, -0.006244f, 0.013633f, -0.004238f, -0.008159f, 0.009114f, 0.012610f, 0.007215f, 0.013819f, 0.023615f, 0.019033f, -0.001210f, 0.003727f, 0.003235f, -0.012635f, 0.002431f, -0.013212f, -0.014410f, 0.007903f, -0.010988f, 0.003612f, -0.000634f, 0.008331f, 0.008452f, -0.010917f, 0.012741f, + -0.003448f, -0.005198f, -0.002312f, 0.008966f, -0.001609f, -0.008241f, -0.005597f, -0.011679f, 0.013413f, -0.006691f, -0.001718f, 0.002327f, -0.000515f, -0.004934f, -0.004180f, 0.000922f, 0.001813f, 0.000609f, -0.002297f, 0.003112f, 0.002315f, -0.002606f, 0.000285f, 0.002013f, 0.001262f, -0.001577f, 0.000008f, -0.002126f, 0.000887f, -0.003576f, -0.003269f, 0.002066f, 0.001081f, 0.004479f, 0.004924f, 0.000446f, 0.003404f, 0.000073f, -0.000190f, -0.029937f, -0.025104f, 0.014655f, 0.026827f, 0.000046f, -0.001588f, 0.005167f, -0.012900f, -0.006203f, -0.031006f, -0.016460f, -0.008785f, -0.000246f, -0.022553f, 0.032299f, 0.006411f, 0.017992f, -0.020561f, -0.024494f, -0.018454f, -0.007152f, 0.004910f, -0.027814f, -0.012469f, 0.012924f, -0.005524f, -0.033842f, -0.011488f, 0.004586f, 0.000357f, 0.021027f, 0.007064f, -0.006584f, -0.016062f, 0.020000f, -0.011601f, -0.001153f, 0.015060f, 0.004470f, -0.016404f, -0.008409f, -0.001277f, -0.027403f, 0.006901f, 0.021330f, -0.009284f, -0.011755f, 0.003106f, -0.013863f, -0.005128f, 0.002771f, -0.008848f, -0.006746f, 0.007222f, -0.010330f, -0.021874f, 0.010829f, + -0.012476f, -0.016293f, -0.022415f, -0.011185f, 0.002228f, -0.008929f, 0.003719f, 0.027588f, 0.015565f, -0.003330f, 0.026273f, 0.026716f, -0.011561f, 0.003743f, 0.007409f, -0.013796f, -0.008978f, -0.029252f, 0.003016f, -0.009345f, -0.023681f, -0.000201f, 0.012468f, 0.022076f, 0.013562f, 0.006511f, 0.002460f, -0.019861f, -0.002495f, -0.004496f, 0.005217f, -0.007482f, -0.000871f, 0.000516f, -0.000285f, 0.004845f, 0.000930f, -0.001750f, 0.004276f, -0.001715f, -0.006273f, 0.005107f, -0.004205f, -0.005573f, 0.000857f, 0.002128f, 0.001889f, 0.000507f, 0.006113f, -0.000561f, 0.003913f, 0.002354f, 0.000468f, 0.001298f, -0.000035f, -0.004689f, 0.001072f, -0.006470f, 0.001518f, -0.010373f, -0.002598f, -0.000395f, -0.006881f, -0.008115f, -0.001072f, -0.008022f, -0.001505f, -0.001660f, -0.009225f, -0.019087f, 0.048610f, -0.001923f, 0.029812f, -0.015002f, -0.042527f, 0.012143f, 0.003699f, -0.001690f, -0.019918f, -0.001963f, -0.013107f, 0.033697f, 0.024724f, 0.022049f, 0.016167f, -0.026439f, -0.000119f, 0.003620f, 0.023502f, -0.040133f, -0.004516f, -0.009833f, -0.011689f, 0.006013f, -0.013182f, 0.005139f, + 0.008971f, 0.006632f, 0.007176f, 0.009288f, -0.002757f, -0.003959f, -0.019479f, -0.004658f, -0.002949f, 0.019151f, 0.000029f, -0.017551f, -0.004096f, 0.020841f, -0.002400f, 0.012122f, 0.015616f, -0.011310f, -0.006661f, -0.025852f, -0.014996f, 0.050574f, 0.013349f, 0.022503f, 0.012121f, 0.002926f, 0.001926f, -0.032061f, 0.019023f, 0.003000f, 0.005600f, 0.016362f, 0.017872f, 0.027788f, -0.031969f, -0.013214f, -0.017732f, -0.002245f, 0.004459f, -0.004227f, -0.008945f, -0.005252f, -0.026809f, -0.033720f, -0.021878f, -0.031602f, -0.004082f, -0.020655f, -0.035363f, -0.014956f, 0.011519f, 0.019383f, -0.007351f, -0.030260f, -0.001054f, -0.004569f, 0.007189f, -0.008319f, 0.001969f, 0.017397f, 0.000823f, -0.001275f, -0.001058f, 0.002217f, 0.003083f, -0.005137f, -0.004600f, -0.012158f, -0.013610f, 0.007266f, -0.003719f, 0.006503f, 0.005902f, -0.002214f, 0.004027f, 0.005365f, 0.009821f, 0.006957f, -0.004237f, 0.002160f, 0.012510f, 0.002412f, -0.012603f, -0.010433f, -0.005678f, -0.002628f, 0.000975f, -0.004433f, 0.007254f, 0.007984f, -0.001894f, 0.012045f, 0.001612f, -0.003347f, -0.002556f, 0.002808f, + -0.006954f, 0.065253f, 0.014782f, -0.009429f, -0.013535f, 0.002088f, -0.020936f, -0.040937f, 0.030141f, 0.000128f, 0.019404f, -0.014665f, 0.014043f, 0.033503f, -0.003298f, 0.003738f, -0.008421f, 0.029162f, 0.024572f, 0.009528f, -0.039497f, 0.002861f, 0.005835f, 0.024424f, 0.035563f, -0.010490f, -0.007252f, -0.004698f, 0.009552f, 0.012694f, 0.010575f, -0.017971f, 0.008238f, -0.020715f, 0.015875f, 0.021166f, -0.010091f, -0.020951f, 0.013255f, -0.022798f, -0.020838f, -0.000870f, 0.006082f, 0.029715f, 0.003610f, -0.004066f, 0.025335f, -0.004690f, 0.022760f, 0.042019f, 0.021082f, 0.000485f, -0.026655f, -0.002532f, -0.015344f, -0.012449f, 0.026866f, 0.010496f, -0.027031f, -0.000309f, -0.020659f, -0.005236f, 0.035610f, 0.016376f, 0.005213f, 0.015246f, 0.021458f, 0.011122f, -0.028669f, 0.014799f, 0.023966f, 0.008218f, -0.019584f, 0.008096f, 0.002301f, 0.004115f, -0.015319f, 0.023679f, -0.006490f, -0.005677f, 0.028484f, 0.030176f, 0.004474f, 0.008597f, 0.032820f, 0.001942f, 0.016217f, -0.011487f, -0.000324f, 0.018905f, 0.010971f, -0.008351f, 0.009779f, 0.017067f, -0.004589f, 0.000155f, + 0.021765f, 0.004508f, 0.009284f, -0.006414f, -0.010832f, -0.003276f, 0.006102f, 0.003181f, 0.005038f, 0.005162f, -0.003517f, -0.003373f, -0.002785f, 0.001702f, 0.006556f, 0.007902f, -0.005244f, -0.001562f, 0.013589f, 0.002017f, 0.018206f, -0.003234f, 0.004993f, -0.002432f, 0.002375f, 0.008214f, 0.005046f, 0.000700f, -0.000073f, -0.007653f, -0.005344f, -0.003851f, -0.008169f, 0.010496f, 0.009434f, -0.015857f, -0.000821f, -0.020259f, -0.047679f, 0.016467f, -0.019004f, 0.005272f, 0.001670f, 0.033408f, -0.023035f, -0.020362f, -0.008571f, -0.009321f, -0.012323f, 0.024672f, -0.021890f, -0.030885f, 0.009211f, -0.057710f, 0.001672f, -0.010882f, -0.024426f, 0.031020f, -0.002010f, -0.001853f, 0.013039f, -0.012321f, 0.009794f, -0.003142f, -0.034482f, -0.037641f, -0.000398f, 0.007919f, 0.022027f, 0.010625f, -0.002534f, -0.003994f, -0.021694f, -0.010294f, 0.021737f, -0.034060f, 0.046930f, 0.027856f, 0.006252f, 0.034688f, -0.023200f, -0.009965f, -0.021242f, -0.021735f, -0.009407f, 0.015818f, 0.044316f, 0.000357f, -0.022932f, -0.003897f, 0.002137f, -0.002520f, -0.002398f, -0.014131f, 0.011931f, 0.010937f, + 0.029866f, -0.000598f, 0.033772f, 0.017369f, 0.009261f, -0.000898f, 0.007183f, -0.050537f, 0.026594f, -0.006480f, -0.029570f, 0.021023f, -0.000054f, 0.027690f, 0.012287f, -0.046844f, 0.036271f, 0.028276f, -0.024509f, 0.039340f, 0.015137f, 0.029373f, 0.011643f, -0.004163f, -0.001670f, -0.001308f, -0.005543f, -0.010377f, -0.003189f, 0.004283f, -0.010339f, -0.015754f, 0.000115f, -0.010304f, -0.018452f, -0.011078f, -0.013827f, 0.008672f, -0.008510f, 0.010682f, 0.002850f, 0.010900f, 0.005166f, -0.001286f, -0.005903f, 0.001813f, 0.001021f, -0.000909f, 0.001506f, -0.003324f, -0.007672f, 0.003614f, -0.000725f, 0.004427f, 0.004842f, 0.000130f, 0.004089f, 0.001851f, 0.007069f, 0.006029f, -0.011123f, -0.006725f, -0.009977f, -0.018613f, -0.013080f, -0.089538f, -0.006682f, 0.052576f, -0.009548f, 0.001255f, 0.046386f, -0.011050f, 0.000713f, 0.005319f, 0.012495f, -0.014224f, 0.012464f, -0.005111f, -0.015263f, 0.014561f, 0.017714f, -0.052481f, 0.006311f, -0.046746f, -0.001112f, -0.024386f, -0.026076f, -0.006097f, -0.007743f, -0.025814f, 0.012892f, 0.003858f, 0.016224f, 0.021595f, -0.031520f, 0.039460f, + 0.002875f, -0.037615f, 0.003183f, -0.026080f, -0.012876f, -0.028027f, -0.025076f, -0.011232f, 0.026506f, -0.023099f, 0.012682f, 0.026355f, -0.015918f, -0.028863f, -0.026191f, -0.038900f, -0.041471f, -0.024777f, -0.011746f, 0.002873f, -0.006201f, 0.011086f, 0.007954f, -0.025014f, -0.001727f, 0.027348f, 0.015994f, -0.041336f, 0.016153f, -0.003493f, -0.011342f, -0.038334f, 0.025685f, -0.014003f, 0.035422f, 0.044336f, 0.001230f, 0.042146f, -0.023353f, 0.024277f, -0.018373f, 0.026132f, 0.033832f, 0.002525f, -0.044421f, -0.001782f, -0.060642f, 0.019242f, 0.013185f, 0.023687f, 0.011476f, -0.024200f, -0.020640f, -0.000806f, -0.013833f, 0.013308f, -0.014970f, -0.000930f, -0.000906f, -0.015339f, -0.011660f, 0.009832f, -0.005826f, -0.017303f, -0.001588f, 0.004841f, 0.012602f, 0.006333f, 0.027314f, -0.003253f, 0.002314f, -0.008548f, 0.019160f, -0.003131f, -0.004142f, 0.016377f, -0.000919f, 0.002089f, 0.004003f, 0.022219f, -0.003637f, -0.009643f, 0.002352f, 0.015209f, 0.014782f, -0.015320f, -0.001445f, 0.009895f, -0.017243f, 0.009198f, -0.002783f, 0.011905f, 0.000731f, -0.015116f, -0.008173f, 0.006730f, + 0.007708f, 0.009137f, 0.006972f, -0.042471f, 0.034337f, -0.080985f, -0.004769f, -0.007767f, -0.006733f, 0.007456f, -0.046444f, 0.003197f, -0.009131f, -0.004032f, 0.021239f, 0.008286f, 0.024709f, -0.019130f, 0.017496f, -0.009166f, -0.041249f, -0.016700f, -0.030267f, -0.018908f, 0.020021f, -0.036119f, 0.004765f, -0.013421f, -0.027258f, -0.004938f, 0.026751f, -0.035906f, -0.034419f, 0.014052f, 0.020776f, -0.001222f, -0.016246f, 0.019267f, 0.020495f, 0.024946f, 0.021622f, 0.008872f, 0.029575f, 0.034898f, -0.018700f, 0.005181f, -0.016479f, 0.043800f, -0.003475f, -0.030406f, 0.036667f, 0.015990f, 0.008878f, -0.017436f, -0.022996f, 0.005336f, 0.014018f, 0.013949f, -0.001143f, -0.019155f, 0.014606f, -0.022296f, 0.000729f, -0.022003f, 0.067846f, 0.010398f, -0.019387f, 0.055588f, -0.006722f, 0.016964f, -0.014330f, 0.027890f, 0.041649f, -0.025876f, 0.039792f, 0.042071f, 0.055102f, 0.042183f, 0.004038f, 0.031312f, -0.024497f, -0.004916f, 0.005997f, -0.013691f, 0.024379f, 0.001029f, -0.001477f, -0.002488f, -0.006986f, 0.011772f, 0.006063f, 0.033274f, -0.010846f, 0.012255f, -0.007250f, 0.000148f, + 0.006365f, 0.009768f, -0.013968f, 0.005120f, 0.014038f, -0.006123f, -0.015689f, -0.003123f, -0.025219f, 0.008694f, 0.007963f, 0.006800f, -0.006590f, 0.004130f, 0.013361f, 0.007435f, -0.003130f, 0.012695f, 0.005809f, -0.008361f, -0.004151f, -0.002716f, 0.020923f, 0.027066f, 0.014516f, 0.006218f, 0.004962f, 0.009236f, 0.016198f, -0.010818f, -0.004252f, 0.007250f, -0.001609f, 0.001454f, 0.007526f, -0.006448f, 0.083699f, 0.021520f, -0.013938f, -0.012414f, 0.019660f, 0.005352f, 0.008540f, -0.002180f, -0.033061f, 0.027851f, -0.075838f, 0.008209f, 0.017000f, -0.003481f, -0.013632f, -0.029290f, -0.013126f, 0.003393f, 0.022850f, 0.034432f, -0.020155f, -0.044400f, -0.035547f, -0.005177f, 0.001592f, -0.026207f, 0.053989f, -0.025143f, -0.016144f, 0.022097f, -0.007283f, 0.003909f, -0.004551f, 0.046017f, 0.007960f, -0.046299f, 0.018574f, 0.005781f, 0.032248f, -0.011496f, 0.003724f, -0.019190f, 0.016149f, 0.006970f, 0.040582f, -0.009898f, 0.018454f, 0.019061f, -0.024121f, -0.026941f, 0.002167f, 0.024419f, -0.047218f, -0.056206f, -0.016275f, -0.023119f, -0.002785f, -0.008202f, 0.005830f, 0.012677f, + -0.011140f, 0.001872f, -0.064589f, -0.055118f, 0.044034f, 0.046474f, -0.055917f, -0.043204f, -0.053810f, -0.028333f, -0.022145f, 0.027972f, -0.029274f, -0.052152f, 0.001758f, 0.002212f, -0.031656f, -0.006827f, 0.045614f, -0.006880f, 0.002746f, 0.014563f, -0.000244f, 0.002564f, -0.001782f, -0.016101f, -0.019718f, -0.001105f, -0.005443f, 0.013031f, -0.001890f, -0.001287f, -0.014221f, 0.007208f, -0.022118f, -0.000555f, 0.007032f, 0.007382f, 0.010943f, 0.012135f, 0.002462f, 0.006864f, -0.004767f, 0.001129f, -0.011170f, 0.004116f, 0.001342f, -0.012854f, 0.013355f, 0.013141f, -0.020465f, 0.001265f, 0.015267f, 0.012445f, 0.023490f, -0.004839f, -0.026909f, 0.007528f, 0.009028f, -0.013368f, 0.008773f, -0.014881f, -0.006842f, -0.002302f, -0.004548f, -0.012632f, 0.004753f, -0.046245f, -0.005856f, -0.011040f, 0.013789f, -0.021796f, -0.006166f, -0.072008f, 0.063772f, 0.041303f, -0.007110f, 0.087908f, -0.008775f, -0.047878f, -0.004591f, 0.019907f, -0.029882f, -0.039002f, -0.008394f, -0.026549f, -0.001405f, 0.007688f, -0.040440f, 0.059379f, 0.001837f, 0.006600f, -0.037313f, -0.010478f, 0.003880f, -0.010385f, + 0.009362f, 0.013717f, 0.048498f, 0.008959f, -0.002603f, 0.039543f, 0.032303f, -0.011230f, 0.019009f, -0.024557f, 0.006894f, 0.022245f, 0.021265f, 0.055240f, -0.054451f, 0.033678f, 0.100713f, 0.001012f, 0.016456f, 0.034776f, 0.003851f, 0.007147f, 0.016198f, 0.012845f, -0.033777f, -0.039858f, -0.014684f, 0.032592f, 0.009546f, -0.041422f, -0.022683f, -0.001520f, -0.020120f, 0.037417f, 0.003334f, 0.028974f, -0.063717f, -0.039107f, 0.018492f, 0.043983f, 0.026675f, 0.017920f, 0.060459f, 0.035689f, -0.025479f, 0.042032f, -0.031471f, -0.006052f, -0.004572f, 0.023788f, -0.004991f, -0.025662f, 0.022546f, 0.010193f, 0.002115f, -0.029472f, 0.020623f, -0.000091f, 0.000361f, -0.012947f, 0.017380f, -0.013839f, -0.011505f, -0.010520f, 0.008271f, -0.010989f, -0.021884f, 0.007721f, 0.001512f, 0.000240f, -0.011916f, -0.001915f, -0.014914f, -0.012351f, -0.011928f, -0.007104f, -0.004607f, -0.005182f, -0.004539f, 0.002534f, 0.000425f, -0.027791f, 0.018969f, 0.007914f, -0.008914f, -0.020433f, -0.029739f, -0.000263f, -0.016189f, -0.010450f, 0.010772f, -0.007362f, 0.018464f, 0.009689f, -0.006463f, 0.003728f, + 0.017284f, -0.007225f, -0.002820f, -0.007739f, 0.014587f, 0.003993f, 0.006103f, -0.014127f, 0.029839f, -0.084020f, 0.001787f, -0.000574f, -0.002693f, -0.010673f, 0.039239f, 0.003086f, -0.022577f, -0.042145f, 0.042648f, -0.037900f, 0.000990f, 0.027331f, 0.022034f, -0.029816f, -0.007961f, -0.047990f, -0.000199f, 0.013650f, 0.016740f, 0.019325f, 0.005123f, -0.031292f, -0.038886f, 0.031910f, 0.016544f, 0.015841f, 0.006296f, 0.016115f, 0.004890f, 0.023464f, -0.041933f, -0.071128f, 0.019726f, -0.010838f, -0.015092f, 0.039503f, -0.006911f, -0.021241f, 0.035063f, 0.032916f, 0.027474f, -0.002658f, -0.017828f, -0.030683f, -0.007860f, -0.040543f, 0.095024f, -0.008235f, 0.034241f, 0.007206f, -0.031510f, 0.025762f, -0.012031f, -0.030379f, 0.029710f, 0.023415f, -0.052217f, 0.036297f, -0.005536f, 0.050402f, -0.051095f, -0.038732f, 0.051603f, -0.002254f, -0.041714f, 0.042503f, -0.015614f, 0.072700f, -0.030890f, -0.025173f, -0.043945f, 0.027789f, 0.005204f, -0.035925f, 0.014312f, -0.046651f, -0.033919f, 0.002927f, 0.030206f, -0.026814f, -0.016286f, -0.052968f, -0.047846f, 0.056080f, -0.006442f, 0.024375f, + 0.039479f, 0.053209f, 0.000306f, -0.005506f, -0.004086f, 0.013979f, 0.021465f, 0.003897f, 0.009881f, 0.032740f, 0.014447f, 0.018006f, 0.010799f, 0.008154f, -0.006365f, -0.003123f, 0.020271f, 0.015318f, 0.026550f, -0.012600f, 0.017527f, 0.018367f, -0.028829f, 0.007320f, 0.007352f, -0.015802f, -0.007972f, -0.000089f, 0.007365f, -0.012842f, 0.020919f, 0.001111f, -0.004717f, -0.005978f, 0.017777f, 0.000639f, 0.005618f, 0.001587f, 0.005066f, 0.003986f, -0.016069f, -0.008071f, -0.011983f, 0.001457f, -0.000140f, 0.008860f, 0.011544f, -0.010321f, -0.024039f, 0.062270f, -0.014205f, 0.042158f, -0.065977f, -0.011633f, -0.001532f, -0.078777f, -0.017317f, 0.011355f, 0.038674f, -0.019427f, -0.018479f, 0.001664f, -0.006091f, 0.055218f, -0.005280f, -0.027845f, 0.058597f, -0.007330f, -0.003044f, 0.011003f, -0.023436f, 0.050601f, 0.003329f, -0.010398f, 0.024250f, 0.020734f, -0.027667f, -0.009537f, -0.012849f, 0.039388f, -0.078868f, -0.001409f, -0.015312f, -0.027888f, 0.013481f, -0.028355f, 0.045886f, -0.012097f, -0.056840f, -0.005954f, 0.086306f, -0.052420f, 0.037806f, -0.058436f, -0.016829f, 0.058080f, + 0.042459f, -0.031404f, 0.014726f, -0.038288f, -0.050285f, 0.010659f, -0.022128f, 0.021873f, 0.006308f, -0.003553f, 0.008528f, -0.073659f, -0.028814f, -0.037569f, -0.053839f, 0.024966f, -0.020456f, -0.015022f, -0.029867f, -0.052344f, -0.044013f, 0.034427f, -0.006910f, 0.107450f, 0.018821f, 0.009891f, 0.038358f, 0.067564f, 0.008819f, -0.048803f, 0.059282f, 0.044847f, -0.037958f, 0.010002f, -0.009646f, -0.037820f, -0.029811f, -0.025570f, -0.002969f, -0.023346f, 0.008716f, 0.015786f, 0.005471f, -0.018200f, 0.031515f, 0.004877f, 0.014517f, -0.004368f, -0.005591f, 0.014914f, 0.009078f, -0.015180f, -0.013700f, -0.013128f, 0.014398f, 0.006855f, 0.017412f, 0.018513f, 0.000610f, -0.010010f, 0.013978f, -0.008090f, 0.030111f, 0.014272f, -0.036442f, -0.007227f, -0.026922f, 0.003186f, -0.008926f, -0.013003f, 0.037695f, -0.002089f, -0.011967f, 0.009633f, 0.011688f, -0.013857f, -0.003002f, -0.019040f, 0.008208f, 0.013641f, -0.002885f, -0.006066f, 0.001897f, -0.012839f, -0.003633f, -0.002053f, 0.017529f, 0.041912f, -0.024850f, -0.031508f, 0.035415f, -0.056296f, -0.006716f, -0.011472f, 0.003240f, 0.039929f, + -0.026109f, 0.044300f, 0.018832f, 0.010213f, 0.013112f, -0.071833f, 0.048865f, 0.009334f, -0.050714f, 0.020034f, -0.053786f, 0.009379f, 0.072046f, -0.008726f, -0.042727f, -0.045195f, 0.019347f, 0.032985f, 0.026406f, 0.014340f, -0.047592f, -0.032320f, -0.014767f, -0.008572f, 0.061558f, -0.038720f, -0.023424f, 0.091989f, -0.050989f, -0.003632f, 0.036327f, 0.000483f, 0.038272f, -0.005270f, -0.030903f, -0.020368f, -0.056142f, 0.029007f, 0.039904f, -0.059526f, 0.089525f, 0.030178f, -0.067530f, -0.061210f, -0.058734f, -0.069990f, -0.056927f, 0.003340f, 0.028114f, 0.005943f, -0.047432f, -0.017521f, 0.031660f, -0.000408f, -0.029714f, 0.033154f, -0.063839f, 0.004533f, -0.014697f, -0.058535f, -0.055081f, 0.010035f, -0.021917f, 0.042161f, -0.076376f, -0.009762f, -0.027053f, -0.055403f, 0.003824f, 0.090583f, 0.023095f, -0.039303f, 0.019356f, -0.048504f, 0.019912f, -0.019362f, 0.001737f, 0.003274f, 0.025500f, -0.002140f, 0.008725f, 0.032693f, 0.000341f, -0.017159f, -0.008178f, 0.026357f, 0.018221f, 0.012495f, 0.006301f, -0.049876f, -0.005135f, 0.004500f, 0.028317f, 0.014845f, -0.026184f, 0.000213f, + 0.003012f, 0.044873f, 0.002477f, 0.014920f, -0.013636f, -0.007938f, 0.006527f, 0.015185f, -0.001797f, -0.012237f, -0.024763f, 0.004454f, -0.009372f, -0.016298f, 0.008463f, -0.011096f, -0.012221f, 0.017974f, -0.013706f, -0.018869f, -0.027327f, -0.023258f, -0.004449f, 0.008077f, 0.000120f, -0.020053f, 0.017546f, 0.044500f, -0.110288f, -0.100553f, -0.088584f, -0.056032f, 0.022140f, -0.023292f, 0.112085f, 0.030477f, -0.012899f, -0.025263f, -0.015132f, 0.032570f, -0.074331f, 0.086569f, 0.112857f, 0.045780f, -0.007791f, 0.090469f, -0.029479f, 0.054900f, 0.102426f, -0.018386f, 0.004727f, 0.019831f, 0.136588f, -0.034450f, -0.009697f, 0.082186f, 0.029988f, 0.026686f, -0.023603f, -0.083479f, 0.004714f, -0.066105f, 0.030620f, -0.082018f, -0.097556f, -0.000840f, -0.006661f, -0.067038f, -0.004730f, -0.032476f, -0.070205f, -0.054910f, -0.091267f, -0.004060f, 0.090685f, -0.029120f, -0.018870f, -0.084565f, -0.046705f, -0.031049f, -0.030397f, 0.028826f, -0.022113f, 0.153163f, -0.037590f, -0.002022f, -0.057270f, 0.115580f, 0.093489f, -0.067062f, 0.075740f, -0.026969f, -0.113664f, -0.020049f, -0.012276f, 0.023601f, + -0.027600f, -0.025509f, -0.015643f, -0.045558f, 0.011603f, 0.056223f, -0.068138f, -0.009564f, 0.017651f, 0.011549f, -0.078928f, 0.050147f, 0.033848f, 0.115896f, -0.051103f, 0.031673f, 0.047364f, -0.003097f, 0.011876f, -0.001708f, 0.015349f, -0.013096f, 0.036093f, 0.015717f, 0.028965f, 0.025774f, 0.000811f, 0.026535f, 0.007024f, -0.010296f, 0.026896f, -0.001977f, 0.003441f, 0.002781f, 0.018389f, 0.014223f, -0.022095f, -0.016611f, -0.027703f, 0.039949f, -0.028566f, 0.005643f, 0.023407f, 0.010047f, 0.043501f, 0.038104f, 0.065476f, 0.045305f, 0.036629f, 0.002206f, 0.023664f, -0.035503f, 0.030911f, 0.023637f, -0.009219f, -0.034175f, -0.064883f, -0.025246f, 0.017106f, -0.035863f, -0.014640f, -0.026181f, -0.063640f, -0.054449f, -0.026971f, -0.040666f, -0.025425f, -0.035089f, -0.045533f, -0.047149f, -0.016071f, -0.013953f, -0.022445f, -0.034800f, -0.020439f, -0.031140f, -0.022832f, -0.025524f, -0.008494f, -0.012234f, -0.011023f, -0.013257f, -0.011898f, -0.017228f, -0.009617f, -0.034611f, 0.046352f, 0.194624f, 0.022716f, -0.122031f, -0.030261f, -0.043156f, 0.009400f, 0.060747f, 0.109254f, 0.031201f, + -0.091628f, -0.001770f, 0.063491f, 0.013771f, 0.001435f, -0.002866f, 0.016610f, -0.008783f, -0.011088f, 0.075391f, 0.047316f, 0.042099f, -0.064066f, -0.041632f, 0.043684f, 0.016845f, 0.025810f, -0.022282f, 0.008077f, 0.083988f, 0.002018f, 0.071205f, 0.037482f, 0.038821f, 0.069668f, 0.010037f, -0.036945f, 0.008499f, -0.042318f, 0.010558f, 0.029496f, 0.007428f, 0.113881f, -0.038090f, -0.073421f, -0.070853f, 0.087941f, 0.040478f, 0.046824f, 0.031925f, -0.050426f, -0.063357f, -0.038586f, -0.002289f, 0.019103f, -0.013955f, 0.030982f, 0.058157f, -0.004092f, 0.042128f, 0.038310f, -0.059198f, -0.011805f, 0.016657f, -0.027803f, -0.025158f, -0.029196f, -0.097575f, -0.016632f, 0.041933f, 0.003528f, 0.084813f, 0.056477f, -0.041462f, 0.029858f, 0.000235f, -0.028517f, -0.024123f, -0.047369f, -0.105488f, -0.056422f, 0.004036f, 0.001606f, -0.023568f, -0.006606f, -0.011224f, 0.033346f, 0.034868f, 0.017852f, -0.006679f, 0.002189f, 0.026351f, -0.013637f, 0.016419f, -0.047879f, -0.022852f, -0.006704f, 0.025088f, -0.007090f, 0.009691f, 0.016086f, 0.016050f, 0.001586f, 0.045097f, -0.037107f, -0.033305f, + -0.033812f, 0.023320f, -0.022207f, -0.034772f, -0.034659f, 0.023613f, -0.012055f, -0.025445f, -0.013910f, 0.017651f, 0.003667f, 0.026029f, -0.045307f, -0.029548f, -0.006212f, -0.003281f, 0.007681f, 0.020173f, -0.010942f, -0.017938f, 0.028513f, -0.015937f, -0.019968f, -0.016742f, 0.027365f, -0.007997f, -0.016780f, 0.008222f, -0.003447f, -0.015987f, -0.001490f, -0.021214f, -0.015095f, -0.009620f, -0.003295f, -0.006775f, 0.002644f, -0.005465f, 0.000154f, -0.002017f, 0.001335f, -0.010824f, -0.000671f, -0.004002f, -0.000510f, -0.006063f, -0.000116f, -0.009484f, 0.000870f, -0.007223f, 0.000626f, -0.006141f, 0.000598f, -0.002601f, 0.002254f, -0.004223f, 0.000968f, -0.005637f, 0.000023f, -0.006036f, -0.001614f, -0.007809f, -0.001106f, -0.005730f, -0.001460f, -0.005154f, -0.001190f, -0.003236f, -0.001384f, -0.005361f, -0.000911f, -0.002332f, -0.000443f, -0.003174f, -0.000144f, -0.004358f, -0.000522f, -0.002935f, -0.001461f, -0.001829f, -0.001185f, -0.002987f, -0.000849f, -0.002256f, -0.002053f, -0.001358f, -0.001056f, -0.001885f, -0.000704f, -0.001806f, -0.013008f, -0.045276f, 0.003241f, 0.155447f, 0.037386f, 0.066504f, + -0.034137f, -0.137977f, -0.073098f, -0.101073f, -0.036836f, 0.071195f, 0.156778f, 0.072824f, 0.015568f, -0.073615f, -0.073285f, 0.052005f, 0.076946f, 0.041125f, 0.093899f, -0.002149f, -0.064876f, -0.089970f, -0.046809f, -0.012268f, 0.069237f, 0.010656f, 0.039155f, 0.038643f, 0.004155f, 0.097189f, 0.064765f, -0.005438f, -0.011169f, -0.085920f, -0.023434f, 0.000041f, -0.000221f, 0.052232f, 0.087851f, 0.056927f, 0.041129f, 0.086310f, 0.046719f, -0.085660f, -0.072430f, -0.020062f, -0.057204f, 0.060472f, 0.037757f, 0.088548f, 0.065468f, 0.078557f, 0.020667f, 0.015521f, -0.064907f, -0.063838f, -0.063772f, 0.023789f, 0.029488f, 0.001836f, -0.010368f, 0.138587f, 0.032608f, -0.007373f, -0.014876f, 0.095550f, -0.101631f, 0.023022f, -0.191728f, -0.040378f, 0.045523f, -0.064316f, 0.060000f, 0.037143f, -0.000988f, 0.138479f, 0.062746f, -0.075337f, -0.155967f, -0.072004f, -0.071712f, -0.035797f, -0.027867f, -0.017794f, 0.065403f, 0.044892f, 0.088906f, 0.013059f, -0.068811f, -0.043934f, -0.072109f, -0.063165f, -0.066863f, 0.030854f, 0.004155f, 0.030551f, 0.036793f, -0.016082f, 0.033884f, 0.021160f, + -0.026938f, -0.000716f, -0.029633f, -0.006692f, -0.061798f, -0.061114f, -0.025660f, -0.025264f, -0.000855f, -0.057080f, 0.029678f, -0.001956f, 0.009055f, 0.018982f, -0.041601f, -0.079798f, -0.076307f, -0.001607f, 0.014364f, 0.019429f, 0.046944f, 0.014606f, -0.026497f, -0.043790f, 0.013427f, -0.015051f, -0.025032f, 0.011754f, -0.222371f, -0.134469f, -0.074713f, 0.066136f, 0.017714f, 0.303042f, 0.321510f, 0.196816f, 0.356619f, 0.293046f, 0.308329f, 0.215056f, 0.260728f, 0.213106f, 0.003013f, -0.100390f, -0.145215f, -0.137903f, -0.290784f, -0.347092f, -0.364375f, -0.252980f, -0.200471f, -0.077739f, 0.012956f, -0.101960f, 0.061867f, -0.128718f, -0.047768f, -0.008092f, -0.040997f, 0.031479f, -0.119797f, 0.164182f, 0.026960f, 0.149740f, 0.094757f, 0.056477f, 0.037961f, 0.083201f, 0.052753f, 0.085309f, 0.193547f, 0.185626f, 0.146448f, 0.181425f, 0.227609f, 0.208828f, 0.195238f, 0.360687f, 0.125320f, 0.254014f, 0.329069f, 0.227548f, 0.298824f, 0.159921f, 0.212658f, 0.167747f, 0.199562f, 0.217735f, 0.079413f, 0.141254f, 0.105591f, 0.132257f, 0.126271f, 0.035534f, -0.025837f, -0.137118f, + -0.051982f, -0.183199f, -0.161704f, -0.271353f, -0.308969f, -0.309488f, -0.655489f, -0.553580f, -0.596023f, -0.589785f, -0.689882f, -0.696250f, -0.430744f, -0.499480f, -0.373280f, -0.440614f, -0.336383f, -0.317070f, -0.277522f, -0.276923f, -0.160467f, -0.069830f, -0.102425f, -0.102018f, -0.084803f, 0.016655f, 0.131627f, 0.070018f, 0.275382f, 0.238619f, 0.348368f, 0.359740f, 0.330308f, 0.414447f, 0.382350f, 0.444743f, 0.346049f, 0.425545f, 0.449051f, 0.503923f, 0.438987f, 0.263626f, 0.261774f, 0.263315f, 0.265510f, 0.246757f, 0.171735f, 0.162667f, 0.066004f, 0.048349f, -0.007103f, 0.008634f, 0.031414f, -0.090279f, -0.135878f, -0.144670f, -0.091335f, -0.078595f, -0.151288f, -0.173038f, -0.204747f, -0.146340f, -0.189768f, -0.172752f, -0.148504f, -0.156286f, -0.162538f, -0.159303f, -0.043995f, -0.036614f, -0.022086f, -0.034820f, 0.018438f, -0.003669f, -0.006405f, -0.032476f, -0.014576f, 0.013419f, 0.018992f, 0.009088f, 0.027361f, 0.022418f, 0.033620f, 0.003030f, 0.003495f, -0.002745f, 0.016626f, -0.001270f, 0.004107f, 0.003353f, 0.010968f, 0.002380f, 0.002208f, -0.014318f, -0.000411f, -0.002562f, + 0.003481f, -0.009008f, -0.001469f, 0.000378f, 0.003910f, -0.007126f, -0.000013f, -0.005488f, -0.000997f, -0.011780f, -0.007061f, -0.007846f, -0.001566f, -0.011278f, -0.008641f, -0.018159f, -0.005949f, -0.006638f, 0.000262f, -0.008362f, -0.009868f, -0.019882f, -0.017191f, -0.023675f, -0.014256f, -0.018929f, -0.017299f, -0.026062f, -0.019862f, -0.020947f, -0.011988f, -0.016345f, -0.009956f, -0.014197f, -0.007033f, -0.007545f, 0.003556f, 0.006330f, 0.016741f, 0.013986f, 0.022108f, 0.022151f, 0.034776f, 0.036027f, 0.038550f, 0.036881f, 0.042741f, 0.037363f, 0.039237f, 0.033022f, 0.032436f, 0.023270f, 0.021336f, 0.009367f, 0.009293f, -0.000466f, -0.001987f, -0.009979f, -0.007385f, -0.011496f, -0.007782f, -0.011916f, -0.007258f, -0.010204f, -0.004806f, -0.007534f, -0.002189f, -0.005554f, -0.000680f, -0.004256f, 0.000419f, -0.003171f, 0.001398f, -0.002383f, 0.001946f} + }, + { + {0.010236f, 0.000201f, -0.003802f, -0.000868f, -0.009159f, -0.006295f, 0.004076f, 0.000362f, -0.005764f, 0.007178f, 0.004816f, -0.001555f, 0.000442f, -0.000973f, 0.005784f, -0.008015f, 0.003018f, 0.006010f, 0.005309f, -0.011534f, -0.008076f, -0.005727f, 0.007762f, 0.001883f, 0.002543f, -0.003207f, 0.008280f, 0.003114f, -0.002037f, 0.000228f, -0.002340f, 0.001632f, 0.003113f, -0.001826f, -0.002361f, -0.006935f, 0.007411f, 0.012327f, 0.001475f, 0.007835f, -0.001432f, 0.001590f, 0.002829f, 0.003417f, -0.009321f, 0.000674f, -0.009738f, -0.002223f, -0.001363f, 0.003089f, -0.004902f, -0.000143f, 0.002158f, 0.001001f, -0.005669f, 0.000244f, 0.000666f, 0.004677f, -0.006028f, -0.007569f, -0.001002f, 0.010321f, 0.016543f, 0.000057f, 0.002727f, 0.001172f, -0.003520f, -0.009904f, -0.002507f, 0.006953f, -0.003149f, 0.006926f, 0.002695f, 0.007054f, -0.000360f, 0.002763f, 0.002510f, -0.005897f, -0.007996f, -0.000810f, 0.003052f, 0.004641f, 0.002256f, 0.002097f, 0.001403f, 0.001589f, -0.002724f, -0.004338f, -0.002958f, -0.002342f, -0.001119f, 0.000128f, -0.001623f, -0.000180f, 0.001495f, 0.002414f, + 0.002119f, -0.000282f, 0.000176f, 0.001455f, -0.000003f, -0.001683f, 0.004795f, -0.010461f, -0.002255f, -0.009926f, 0.005781f, 0.000540f, -0.004432f, 0.020857f, -0.008091f, -0.015111f, 0.001242f, 0.006858f, -0.001171f, -0.011395f, -0.003121f, -0.005007f, -0.001753f, -0.005454f, -0.001665f, 0.007677f, -0.000448f, -0.005167f, 0.009014f, 0.001215f, 0.008759f, -0.002400f, -0.002031f, 0.003237f, 0.000322f, 0.003786f, -0.001527f, 0.008080f, 0.013454f, -0.003775f, -0.008884f, -0.006674f, 0.005607f, -0.000109f, -0.020472f, -0.002047f, -0.008099f, -0.003144f, 0.010168f, -0.007122f, -0.005243f, 0.006854f, -0.004442f, -0.001084f, 0.009334f, 0.003096f, -0.007183f, 0.003173f, -0.005145f, -0.012239f, 0.003986f, 0.004679f, -0.009123f, -0.005428f, -0.002564f, -0.003966f, 0.000019f, 0.003868f, 0.006405f, 0.009454f, 0.010773f, -0.002633f, 0.001198f, -0.004296f, 0.004708f, 0.002845f, -0.002262f, 0.004382f, 0.006961f, -0.006629f, -0.003229f, 0.001022f, 0.000242f, 0.002557f, 0.007983f, -0.001075f, -0.001997f, 0.007056f, 0.001160f, -0.005030f, -0.002986f, -0.000455f, -0.002925f, 0.002105f, -0.001147f, -0.002814f, + 0.001235f, -0.003182f, -0.002330f, 0.001466f, -0.003004f, -0.002187f, 0.000208f, 0.001996f, -0.003744f, 0.000372f, -0.000820f, -0.001418f, -0.001742f, -0.000245f, -0.002893f, -0.000927f, -0.002764f, -0.016828f, -0.008607f, 0.005223f, 0.007434f, 0.002953f, 0.008069f, -0.006894f, 0.008448f, 0.010451f, -0.002961f, 0.011563f, -0.001607f, 0.008528f, -0.004069f, 0.000302f, -0.003652f, 0.010896f, 0.004204f, -0.000398f, 0.009665f, -0.005122f, -0.004133f, 0.007140f, -0.016877f, -0.002890f, 0.000893f, -0.003543f, -0.015042f, -0.009128f, 0.006202f, -0.005839f, -0.003941f, 0.000260f, 0.011721f, -0.002777f, -0.008247f, -0.000604f, 0.002999f, 0.006688f, -0.001033f, -0.010605f, -0.006889f, -0.001913f, -0.005480f, 0.001818f, -0.009294f, 0.004653f, -0.008745f, -0.012775f, 0.000391f, 0.004545f, 0.005196f, -0.004053f, -0.002965f, -0.008366f, 0.010870f, 0.006347f, 0.001503f, 0.000163f, -0.000319f, -0.003645f, -0.001997f, 0.003736f, 0.004635f, 0.016483f, -0.001864f, 0.004191f, 0.001067f, -0.000437f, -0.008055f, -0.006057f, 0.011125f, -0.004732f, 0.001086f, 0.002822f, 0.001603f, -0.001691f, 0.008409f, 0.000505f, + 0.000300f, -0.009074f, 0.008821f, 0.005012f, -0.003419f, -0.001971f, -0.000995f, -0.002592f, 0.001215f, 0.006429f, -0.000091f, 0.002592f, 0.001924f, -0.000830f, 0.001475f, 0.003354f, -0.000345f, 0.000070f, 0.001011f, 0.001599f, 0.001318f, 0.001946f, 0.003404f, 0.001342f, -0.002496f, 0.002686f, 0.001216f, -0.001768f, -0.001437f, -0.000228f, 0.000394f, 0.000051f, 0.004133f, 0.004978f, 0.004536f, 0.010689f, -0.007083f, -0.010690f, -0.008552f, 0.005327f, 0.011908f, -0.002280f, 0.009126f, -0.008167f, -0.009823f, 0.008065f, -0.004079f, 0.000762f, 0.003054f, 0.010121f, 0.003801f, 0.016119f, -0.007049f, -0.008726f, 0.003792f, -0.004876f, -0.004509f, 0.009092f, -0.014326f, -0.008931f, 0.001439f, -0.002866f, 0.006529f, -0.004964f, 0.001796f, 0.011422f, -0.010732f, 0.007910f, -0.006481f, 0.005087f, -0.006074f, -0.001831f, -0.000989f, 0.011832f, 0.002235f, 0.000315f, -0.008754f, 0.000318f, -0.010417f, 0.003788f, 0.002550f, -0.007066f, -0.000187f, -0.002995f, 0.017994f, 0.002306f, 0.001130f, -0.015756f, -0.009193f, -0.013310f, 0.010270f, -0.006845f, -0.000773f, 0.005300f, 0.022950f, 0.016095f, + -0.006522f, -0.014272f, -0.005926f, -0.012412f, 0.012944f, -0.002628f, -0.003630f, -0.005821f, -0.003815f, -0.001207f, -0.005978f, -0.004075f, -0.001033f, -0.004959f, 0.003413f, -0.003516f, 0.004802f, -0.018026f, 0.001172f, -0.001630f, -0.005696f, -0.002807f, -0.006047f, -0.001363f, -0.009431f, 0.000603f, -0.003938f, -0.000481f, 0.005648f, -0.001972f, -0.002057f, -0.004180f, -0.004507f, -0.001426f, 0.001226f, -0.000430f, -0.000432f, -0.001778f, -0.000738f, -0.002073f, -0.000355f, 0.000270f, 0.001061f, -0.001529f, -0.001630f, -0.002322f, -0.001988f, -0.001827f, -0.002952f, 0.001007f, -0.000995f, -0.000244f, -0.003000f, -0.008920f, 0.006366f, -0.009236f, -0.016810f, 0.017138f, 0.007561f, -0.017717f, 0.017707f, -0.002737f, -0.001176f, -0.024951f, 0.014796f, 0.010078f, -0.020415f, 0.006158f, -0.003480f, 0.007806f, 0.001644f, 0.008975f, 0.005547f, 0.002379f, -0.009566f, 0.000999f, 0.003341f, -0.012355f, -0.005447f, -0.014602f, -0.002655f, -0.009035f, -0.005028f, 0.001784f, -0.011655f, -0.004135f, -0.017113f, 0.006532f, 0.001559f, 0.001573f, 0.001365f, -0.007199f, -0.014915f, -0.004512f, 0.005074f, -0.002293f, + -0.001408f, 0.015587f, -0.023096f, 0.009753f, 0.011605f, -0.001602f, 0.000610f, -0.004371f, -0.001945f, -0.007349f, -0.011476f, -0.007644f, -0.009070f, -0.005888f, 0.005571f, 0.003243f, 0.004945f, 0.007838f, -0.001979f, -0.004046f, 0.010927f, 0.021208f, 0.014770f, -0.000236f, -0.018115f, 0.005022f, -0.002892f, 0.002723f, 0.018917f, -0.000049f, 0.019057f, 0.017199f, -0.002485f, -0.005673f, -0.004740f, 0.001408f, 0.001519f, 0.006448f, 0.019323f, 0.005250f, 0.000638f, -0.001943f, -0.012201f, 0.001488f, 0.003584f, -0.004035f, -0.000733f, 0.000663f, -0.000296f, 0.002286f, 0.001555f, 0.001416f, -0.001653f, 0.002393f, 0.002020f, 0.002139f, 0.002259f, -0.006505f, -0.001187f, -0.004668f, 0.001728f, -0.003645f, 0.001405f, -0.001027f, -0.001825f, -0.003911f, 0.000603f, 0.000992f, -0.005864f, -0.001817f, 0.001200f, 0.000164f, 0.026891f, 0.007101f, -0.004985f, -0.001133f, 0.008151f, -0.002667f, 0.026044f, -0.002606f, -0.004204f, 0.033403f, 0.000032f, 0.016978f, -0.006422f, 0.000640f, -0.001625f, 0.002913f, -0.004427f, 0.002485f, -0.000697f, -0.000772f, -0.018205f, -0.001547f, -0.004473f, -0.003049f, + -0.007690f, 0.011718f, 0.005219f, 0.007045f, -0.010291f, -0.000943f, -0.016160f, -0.006220f, 0.002824f, -0.001123f, -0.009895f, -0.002816f, 0.005162f, 0.012236f, 0.007118f, -0.003645f, -0.015039f, -0.000342f, 0.004050f, -0.002318f, 0.007692f, 0.005410f, 0.010491f, 0.014892f, -0.004966f, 0.000082f, -0.016050f, -0.019110f, 0.018022f, 0.009955f, -0.000842f, -0.000631f, -0.000788f, -0.006856f, -0.007899f, 0.000028f, 0.014389f, 0.008602f, 0.002460f, 0.017963f, -0.013818f, 0.004178f, -0.011368f, -0.008446f, 0.007463f, 0.008040f, 0.006284f, 0.026967f, -0.001156f, -0.011923f, 0.001914f, -0.011684f, 0.005185f, 0.003307f, 0.009593f, -0.005101f, -0.000037f, 0.001390f, -0.009190f, -0.001424f, 0.006103f, -0.000757f, 0.001438f, -0.003725f, -0.002189f, -0.000403f, 0.004164f, -0.002118f, 0.002558f, -0.003961f, 0.000193f, -0.005175f, 0.001519f, -0.002661f, -0.002037f, 0.001044f, 0.002509f, -0.003131f, 0.003389f, 0.002484f, 0.004180f, 0.000457f, 0.002397f, -0.000931f, 0.001385f, 0.000986f, 0.001402f, -0.001475f, -0.000237f, -0.001369f, -0.000426f, 0.000981f, 0.002061f, -0.001787f, 0.000715f, -0.000384f, + -0.014885f, -0.019929f, 0.007722f, -0.018625f, -0.000020f, 0.020785f, -0.021748f, 0.007975f, 0.009726f, -0.005804f, -0.026837f, 0.000378f, 0.015659f, -0.017324f, 0.010763f, -0.001191f, -0.007714f, -0.022472f, -0.000657f, -0.016207f, 0.002850f, -0.008218f, -0.012672f, -0.015766f, 0.006467f, -0.002217f, -0.000948f, 0.015031f, -0.009106f, 0.012684f, -0.009640f, -0.003826f, 0.019377f, 0.006672f, -0.010374f, 0.007988f, 0.004662f, -0.008954f, 0.004711f, 0.004903f, -0.003465f, -0.003812f, 0.000755f, -0.004305f, -0.005137f, 0.003200f, 0.003531f, 0.026424f, -0.024879f, 0.004043f, 0.001566f, -0.008887f, 0.017854f, 0.010195f, -0.006154f, -0.019251f, 0.001696f, -0.001929f, -0.005838f, -0.012141f, -0.014268f, 0.017409f, 0.011255f, 0.001465f, -0.001758f, 0.009286f, 0.004681f, -0.004185f, 0.007390f, 0.005348f, -0.004842f, 0.018523f, -0.006889f, 0.011341f, -0.007595f, 0.005655f, 0.005797f, 0.004196f, -0.000581f, -0.010267f, 0.009816f, -0.007987f, -0.008363f, -0.005698f, 0.002845f, 0.000010f, 0.001199f, -0.009735f, 0.005284f, 0.004133f, -0.006203f, 0.000667f, -0.000265f, -0.003057f, 0.000560f, -0.002015f, + 0.004699f, -0.001330f, 0.000701f, 0.003984f, -0.001815f, -0.002967f, 0.002602f, -0.003387f, 0.002742f, -0.000579f, -0.000060f, -0.003902f, -0.001786f, -0.000096f, -0.004325f, 0.004284f, 0.002383f, 0.000999f, 0.002795f, -0.000871f, 0.001897f, -0.001034f, 0.008777f, -0.020094f, 0.014739f, -0.008392f, -0.003719f, -0.011521f, -0.008315f, 0.007065f, -0.006634f, 0.005784f, 0.022533f, 0.007749f, 0.012380f, -0.028722f, -0.019031f, -0.010215f, -0.006881f, 0.003143f, -0.000135f, 0.004992f, -0.024135f, 0.012949f, 0.005380f, 0.003259f, 0.023021f, 0.000422f, -0.013052f, 0.021647f, 0.008503f, -0.009611f, 0.004414f, -0.012361f, 0.011358f, 0.005390f, 0.015138f, -0.012941f, -0.009215f, 0.003872f, -0.013122f, 0.016586f, -0.015176f, -0.000227f, 0.014706f, 0.013586f, -0.028012f, -0.000752f, 0.001368f, 0.003300f, 0.004630f, 0.030643f, 0.007064f, 0.001957f, -0.009367f, -0.007692f, -0.016545f, -0.008913f, 0.022620f, 0.000595f, -0.027007f, 0.000457f, 0.006251f, -0.015288f, -0.016881f, 0.002056f, -0.010950f, 0.004542f, 0.024793f, 0.012219f, 0.010434f, -0.010119f, -0.026494f, 0.002190f, -0.004534f, 0.012216f, + -0.002382f, -0.022134f, -0.002698f, 0.005847f, 0.006115f, 0.006050f, -0.001871f, 0.018848f, 0.003550f, -0.011891f, 0.015504f, -0.001083f, 0.009280f, -0.000247f, -0.002311f, -0.008002f, 0.011459f, 0.007946f, 0.004484f, -0.005789f, -0.002283f, -0.001471f, -0.003862f, 0.002246f, -0.000019f, -0.004906f, 0.002485f, 0.001582f, -0.002792f, -0.003630f, -0.001536f, -0.002723f, -0.000400f, 0.003562f, -0.003554f, 0.001876f, 0.004392f, 0.005330f, -0.001339f, 0.002323f, -0.002781f, -0.035426f, -0.010589f, 0.010055f, 0.027376f, 0.003937f, 0.014194f, 0.048673f, 0.008075f, 0.008329f, -0.007531f, -0.023291f, 0.013210f, -0.011280f, 0.012173f, -0.002905f, 0.032174f, 0.023481f, -0.012420f, -0.026318f, -0.020955f, 0.015922f, -0.013959f, 0.019512f, 0.008560f, 0.006375f, -0.006737f, -0.002542f, 0.023153f, -0.004544f, 0.020432f, 0.020482f, 0.010566f, 0.014375f, -0.015913f, 0.015564f, 0.008372f, -0.008306f, 0.022626f, -0.009952f, 0.020556f, 0.001571f, 0.002319f, -0.030150f, 0.018180f, 0.001686f, -0.005679f, 0.014929f, -0.021037f, -0.008324f, 0.012597f, 0.010322f, -0.019383f, 0.003143f, -0.012401f, -0.007105f, + 0.019188f, 0.002599f, 0.005788f, -0.002010f, -0.022110f, 0.014857f, 0.014083f, 0.000982f, 0.011134f, 0.005016f, -0.009797f, -0.010269f, -0.000836f, 0.011806f, -0.020022f, -0.000707f, 0.001282f, 0.000885f, -0.000193f, 0.008780f, 0.011510f, 0.023660f, 0.013268f, 0.000798f, -0.033230f, -0.010912f, -0.012443f, -0.001100f, 0.002457f, -0.009322f, -0.019700f, -0.006193f, -0.008878f, 0.005206f, 0.000761f, -0.005603f, 0.002103f, -0.005747f, 0.009156f, -0.003285f, -0.003925f, -0.005423f, 0.000099f, 0.002652f, -0.011849f, 0.007437f, -0.007624f, 0.003092f, -0.001965f, -0.004370f, 0.000202f, -0.007296f, 0.002352f, -0.006583f, -0.004805f, -0.000942f, -0.003811f, -0.003506f, 0.004058f, 0.006998f, 0.004185f, 0.006737f, 0.008763f, -0.001828f, 0.001291f, 0.043937f, 0.012830f, 0.005865f, -0.016305f, -0.039532f, 0.028583f, 0.008941f, -0.026268f, 0.007847f, -0.002879f, 0.006744f, 0.005517f, -0.018952f, -0.040592f, -0.031741f, 0.010660f, 0.024855f, -0.004990f, 0.026091f, -0.012161f, 0.020353f, 0.024784f, 0.033663f, -0.007503f, 0.024870f, -0.022174f, 0.008409f, -0.012138f, 0.002975f, 0.013329f, -0.000604f, + -0.007275f, 0.006029f, 0.016750f, -0.012049f, -0.022509f, -0.022714f, 0.047377f, 0.000040f, -0.002482f, -0.021478f, 0.021902f, 0.007105f, -0.043945f, -0.025443f, 0.009701f, -0.006237f, -0.007894f, 0.017037f, 0.005653f, 0.042324f, 0.023272f, -0.001594f, -0.024796f, -0.024283f, -0.013889f, -0.010046f, -0.028123f, 0.025739f, -0.019293f, 0.020340f, 0.017401f, -0.017821f, -0.023008f, -0.022184f, -0.032392f, 0.007709f, -0.000738f, -0.011713f, -0.014777f, -0.023769f, -0.008676f, -0.023420f, 0.004678f, 0.002658f, -0.008149f, 0.003007f, 0.018835f, -0.048866f, -0.019159f, -0.039915f, 0.019811f, 0.013793f, -0.017322f, -0.005944f, 0.007895f, -0.007695f, -0.000526f, 0.009213f, -0.007663f, -0.016124f, -0.002073f, -0.004806f, -0.005326f, -0.000429f, -0.002389f, -0.007000f, -0.000064f, 0.001162f, 0.008156f, -0.011987f, 0.002761f, 0.006179f, -0.001088f, -0.005129f, -0.007887f, -0.002470f, -0.001529f, 0.001379f, -0.002985f, -0.000940f, -0.004961f, 0.001934f, -0.002241f, -0.007809f, 0.012911f, 0.001054f, 0.003593f, -0.010621f, -0.024087f, -0.044935f, -0.010595f, -0.011269f, 0.002030f, -0.010014f, 0.001495f, 0.005349f, + -0.005354f, 0.020086f, -0.025631f, -0.007060f, -0.024338f, -0.000584f, -0.012330f, 0.028264f, 0.030514f, 0.025328f, -0.034930f, 0.025089f, -0.012872f, 0.019211f, -0.007537f, 0.014356f, -0.011846f, -0.014115f, 0.004936f, -0.018411f, 0.011890f, 0.015424f, -0.002195f, 0.009533f, -0.017817f, -0.001532f, 0.029222f, -0.022836f, 0.000789f, -0.006295f, -0.009968f, -0.018264f, -0.001375f, 0.029907f, 0.038186f, -0.023582f, 0.011339f, -0.002337f, -0.023644f, -0.023163f, -0.025932f, -0.011014f, 0.048461f, 0.030156f, -0.009366f, 0.016387f, -0.010590f, 0.014301f, -0.026900f, 0.016420f, -0.001028f, -0.013818f, 0.036878f, 0.019884f, 0.007371f, 0.012896f, 0.010424f, 0.035505f, 0.004421f, -0.028698f, 0.011823f, 0.023269f, 0.017456f, -0.050654f, 0.031260f, -0.021045f, -0.019559f, -0.008813f, 0.003076f, -0.019381f, 0.022112f, 0.050112f, -0.008667f, 0.007870f, 0.025110f, 0.005109f, -0.004202f, 0.006830f, 0.002512f, 0.015219f, 0.012873f, 0.008627f, 0.023603f, 0.012981f, -0.006605f, 0.016955f, 0.009990f, -0.006234f, -0.014381f, 0.009001f, -0.001971f, 0.009680f, -0.004090f, 0.003528f, 0.007200f, 0.003723f, + -0.001990f, -0.000855f, 0.003310f, 0.011999f, 0.002512f, -0.001675f, 0.002562f, 0.009450f, -0.003618f, 0.001409f, 0.014480f, 0.006500f, -0.003653f, 0.008817f, 0.002646f, 0.003071f, 0.006098f, 0.000844f, 0.005085f, -0.001247f, -0.008900f, -0.007286f, 0.007376f, -0.003368f, 0.032235f, 0.020210f, 0.086558f, 0.023595f, -0.013899f, 0.005069f, 0.015042f, -0.000091f, 0.029222f, 0.020878f, 0.020424f, -0.026023f, -0.042151f, 0.042307f, -0.023619f, 0.003639f, 0.015377f, 0.046478f, 0.019407f, -0.028809f, 0.026224f, -0.026091f, -0.004723f, -0.035715f, -0.045781f, -0.005586f, 0.013109f, 0.012112f, 0.009925f, 0.011442f, -0.003075f, -0.032209f, -0.011169f, 0.009854f, 0.011353f, -0.017225f, 0.035936f, 0.022047f, -0.020568f, 0.011356f, 0.018204f, 0.006538f, 0.001694f, -0.019893f, -0.001803f, -0.014053f, -0.007461f, 0.001660f, 0.022611f, 0.054362f, -0.014217f, 0.004640f, 0.008703f, 0.020067f, -0.018934f, 0.069013f, -0.005347f, 0.006388f, 0.006447f, -0.031800f, -0.030205f, -0.050131f, -0.020498f, 0.026948f, -0.008887f, 0.013397f, 0.011710f, 0.047409f, 0.008305f, 0.008257f, 0.003203f, 0.037303f, + 0.018845f, -0.016024f, 0.035201f, -0.031715f, 0.005735f, 0.031514f, 0.041716f, 0.037457f, 0.015590f, -0.021802f, -0.034384f, -0.015435f, -0.010503f, -0.025911f, -0.013551f, -0.014859f, -0.003321f, -0.021793f, 0.006172f, -0.007675f, -0.002792f, -0.019025f, -0.001464f, -0.011958f, 0.019296f, 0.001659f, 0.004811f, -0.016940f, -0.002458f, -0.023164f, 0.002361f, 0.009555f, 0.000039f, 0.016521f, 0.011355f, -0.000195f, 0.007718f, -0.003702f, -0.009541f, -0.006287f, -0.003841f, -0.019846f, 0.002623f, 0.003724f, 0.005498f, 0.005667f, -0.008882f, 0.013683f, 0.015856f, 0.006451f, -0.010805f, -0.007999f, -0.003037f, 0.003223f, 0.009164f, 0.004362f, -0.006930f, -0.004146f, -0.003016f, -0.008703f, -0.036165f, 0.020502f, 0.009198f, 0.025080f, -0.007046f, -0.054445f, 0.003954f, -0.036443f, -0.032990f, 0.009914f, 0.007350f, 0.015488f, -0.009965f, 0.011195f, -0.002398f, -0.018528f, 0.029355f, -0.004637f, -0.010368f, -0.011788f, -0.021436f, -0.017801f, 0.010345f, -0.022489f, 0.005005f, -0.014360f, -0.010481f, -0.006157f, 0.028729f, -0.005673f, 0.030867f, 0.019701f, -0.008807f, 0.010471f, 0.010298f, 0.022345f, + -0.016000f, -0.021055f, 0.002574f, 0.013144f, 0.016538f, 0.029456f, -0.033138f, -0.031585f, 0.012903f, 0.010471f, 0.035719f, -0.017953f, -0.003247f, 0.018012f, -0.000553f, 0.005015f, -0.007388f, 0.023740f, 0.029206f, 0.013662f, -0.004500f, 0.018705f, 0.061981f, -0.013924f, -0.019020f, 0.023211f, -0.003313f, 0.036542f, 0.008051f, 0.017002f, 0.019872f, -0.006794f, 0.013666f, 0.042268f, -0.012359f, -0.051018f, 0.035004f, 0.010342f, -0.017599f, 0.004756f, -0.078424f, 0.051607f, -0.001369f, 0.031928f, -0.021243f, 0.016572f, 0.001482f, -0.031114f, -0.030384f, -0.004252f, 0.004809f, -0.023071f, -0.000808f, 0.003287f, -0.005147f, -0.007845f, -0.005727f, -0.025260f, -0.005133f, -0.015281f, -0.000782f, -0.008134f, -0.003282f, -0.009291f, 0.014016f, -0.011483f, -0.009572f, -0.016466f, -0.008867f, -0.018758f, -0.004481f, 0.003761f, -0.011347f, -0.001542f, -0.009513f, -0.009552f, -0.011056f, -0.001024f, -0.009370f, -0.006550f, 0.001777f, -0.003086f, 0.006801f, -0.006177f, -0.012987f, -0.013358f, -0.001166f, 0.001727f, -0.009375f, -0.002175f, -0.004944f, 0.003413f, -0.018618f, -0.000312f, -0.034278f, -0.000537f, + 0.050546f, 0.026454f, -0.067665f, 0.011273f, -0.013138f, 0.006630f, 0.009741f, -0.002404f, -0.035451f, 0.005609f, -0.006464f, 0.030606f, 0.056633f, -0.008761f, 0.017441f, 0.038873f, -0.002879f, -0.009927f, -0.010961f, 0.015829f, 0.056529f, -0.000438f, -0.005198f, 0.048188f, -0.020514f, 0.013510f, -0.001086f, -0.000085f, -0.013597f, 0.018546f, -0.054189f, 0.002333f, 0.015545f, 0.039376f, 0.039924f, -0.033210f, 0.000200f, 0.037848f, -0.003485f, 0.069878f, -0.026367f, -0.033272f, 0.003410f, 0.050937f, 0.007633f, -0.037957f, -0.019354f, 0.012101f, -0.001392f, 0.022544f, -0.057491f, 0.007530f, 0.001276f, -0.011105f, -0.042051f, -0.035522f, 0.008358f, -0.010343f, -0.003764f, 0.002680f, -0.043730f, -0.043920f, 0.008222f, 0.007632f, -0.046284f, -0.014602f, -0.030525f, 0.026869f, -0.072450f, -0.026297f, 0.022106f, -0.042572f, 0.022405f, -0.011026f, -0.018638f, 0.024240f, -0.008567f, 0.036092f, 0.032355f, 0.008214f, 0.019575f, -0.008833f, 0.002918f, -0.024475f, 0.025823f, -0.018842f, 0.014818f, -0.025679f, 0.018087f, 0.001953f, 0.007302f, -0.001649f, -0.001254f, -0.014497f, 0.016590f, -0.019205f, + 0.002028f, 0.002882f, 0.008703f, -0.021145f, 0.009881f, -0.008194f, -0.007528f, 0.007469f, -0.006068f, -0.009612f, 0.013185f, 0.006767f, 0.014182f, 0.007496f, -0.003093f, -0.006781f, -0.008961f, -0.001398f, 0.001427f, -0.009771f, 0.002146f, -0.006979f, 0.002143f, -0.020299f, -0.012435f, -0.007983f, 0.009162f, 0.012917f, -0.008418f, 0.003333f, -0.004667f, 0.005887f, -0.018118f, 0.038322f, -0.000715f, 0.021526f, -0.039987f, -0.002215f, -0.037891f, 0.039667f, 0.016529f, 0.051672f, 0.035190f, -0.017365f, 0.006161f, 0.040958f, 0.019959f, 0.021193f, 0.012418f, -0.033493f, -0.010495f, 0.017503f, 0.001991f, 0.020543f, -0.044322f, -0.031675f, 0.018996f, 0.065980f, 0.008179f, -0.020923f, 0.040540f, 0.012422f, 0.025066f, 0.007481f, 0.004322f, -0.036200f, -0.038264f, 0.001311f, -0.000108f, -0.063892f, 0.004485f, -0.012625f, -0.004061f, 0.021047f, -0.025929f, 0.016057f, 0.049940f, 0.005941f, -0.083393f, -0.058809f, -0.010450f, -0.017685f, -0.021318f, -0.000018f, 0.014270f, 0.013689f, -0.021043f, 0.023490f, 0.020927f, 0.020264f, -0.013575f, 0.017517f, -0.010125f, -0.020930f, -0.005890f, 0.019483f, + -0.062486f, -0.013524f, -0.028663f, -0.031605f, -0.013623f, 0.009229f, -0.017207f, -0.001151f, 0.067088f, 0.039169f, -0.026943f, 0.000762f, -0.000078f, -0.011186f, -0.012956f, 0.006488f, 0.044701f, 0.017168f, 0.006042f, -0.013618f, -0.011119f, -0.023134f, -0.028119f, -0.028548f, -0.007533f, 0.004222f, 0.008136f, -0.009684f, 0.007169f, -0.001934f, -0.007525f, -0.002035f, -0.008684f, -0.025034f, -0.007264f, 0.000237f, -0.007363f, -0.021600f, 0.001877f, -0.007531f, 0.023128f, -0.011701f, 0.007217f, -0.001997f, 0.008994f, 0.000328f, -0.020403f, 0.002103f, 0.022394f, 0.004008f, 0.020042f, -0.005352f, 0.009788f, -0.006289f, 0.005857f, -0.001020f, -0.015423f, -0.005992f, -0.002521f, -0.002169f, -0.003847f, 0.000310f, -0.005364f, -0.010302f, 0.013652f, 0.026895f, -0.037338f, -0.009179f, -0.016017f, 0.010061f, 0.077052f, 0.012428f, -0.038415f, 0.010265f, 0.033845f, -0.007149f, 0.031599f, 0.040846f, -0.021337f, 0.009790f, 0.020185f, 0.014183f, 0.000564f, -0.005821f, -0.012929f, 0.006229f, 0.023771f, 0.012595f, 0.022176f, -0.033609f, -0.052388f, -0.005383f, 0.022866f, 0.020622f, 0.016317f, -0.005774f, + -0.048361f, 0.015611f, 0.010293f, 0.072053f, 0.075250f, 0.018106f, -0.056610f, 0.040832f, -0.021781f, -0.057360f, -0.013798f, -0.067912f, -0.052199f, -0.022758f, -0.025337f, -0.052642f, 0.008834f, -0.021145f, -0.060784f, -0.055169f, 0.015612f, 0.036013f, -0.006288f, -0.046561f, 0.013505f, 0.001445f, 0.014566f, 0.029485f, 0.028264f, -0.036012f, 0.046239f, 0.032118f, 0.003701f, 0.012967f, 0.032062f, -0.001608f, 0.084449f, -0.060396f, -0.029286f, -0.001949f, -0.069371f, 0.056708f, 0.003762f, 0.071259f, 0.021608f, 0.015993f, -0.003973f, 0.014167f, 0.029800f, 0.001241f, -0.028464f, -0.000402f, -0.015368f, 0.011340f, 0.010497f, 0.020399f, -0.008912f, -0.025960f, -0.000545f, 0.024190f, 0.011059f, -0.015391f, -0.008084f, 0.012730f, -0.017691f, -0.000056f, 0.000005f, 0.022206f, 0.008312f, -0.012076f, -0.005629f, -0.013726f, -0.022612f, -0.019250f, -0.001432f, 0.004232f, -0.011391f, -0.008084f, 0.002230f, -0.011102f, 0.017075f, 0.008516f, -0.000561f, 0.010488f, 0.034853f, -0.013384f, -0.007043f, 0.003977f, 0.009116f, -0.018985f, 0.020302f, -0.006950f, -0.000961f, 0.003519f, 0.014966f, 0.026425f, + -0.038168f, 0.010352f, -0.075759f, -0.019948f, -0.005137f, -0.018078f, 0.082185f, 0.026496f, -0.022433f, -0.051490f, -0.026808f, -0.020939f, -0.033380f, -0.023709f, 0.012157f, -0.075378f, -0.016808f, 0.056073f, -0.007076f, -0.005827f, -0.058414f, 0.055672f, 0.026890f, 0.001663f, -0.022465f, 0.023962f, 0.011181f, -0.012781f, 0.024717f, -0.038735f, -0.010893f, -0.019587f, 0.010717f, -0.008739f, -0.025177f, 0.028407f, -0.021554f, 0.012080f, 0.000289f, -0.037635f, -0.024206f, -0.005542f, -0.048126f, -0.046345f, -0.063107f, -0.015766f, 0.028168f, -0.020627f, -0.012003f, 0.036487f, -0.044581f, -0.035826f, 0.038486f, 0.000063f, -0.002810f, 0.035525f, -0.000038f, -0.029706f, -0.017834f, 0.012233f, 0.024865f, -0.038494f, -0.012771f, 0.047661f, 0.019874f, 0.046000f, 0.023086f, -0.008981f, 0.023465f, -0.001476f, -0.062386f, 0.019777f, -0.047340f, 0.034247f, 0.005343f, 0.012785f, -0.020268f, -0.053109f, 0.010663f, -0.007625f, -0.046992f, -0.018248f, 0.020225f, -0.023200f, 0.000373f, 0.007661f, 0.014556f, -0.014763f, 0.000208f, 0.002599f, -0.004612f, 0.010034f, -0.007575f, 0.005770f, 0.018410f, -0.003174f, + 0.005894f, 0.005343f, -0.012976f, 0.004235f, 0.008493f, 0.005543f, -0.009864f, 0.012872f, 0.008039f, -0.000577f, -0.013566f, -0.026047f, 0.004768f, -0.020539f, 0.016291f, -0.020978f, 0.013306f, 0.017796f, 0.000140f, 0.001352f, -0.000187f, 0.010262f, 0.000845f, -0.008744f, 0.019828f, 0.016767f, -0.008852f, -0.005539f, -0.013170f, -0.021248f, 0.056148f, 0.019952f, 0.001815f, 0.007144f, -0.015002f, 0.022620f, 0.034490f, 0.088314f, 0.076642f, 0.006900f, -0.034139f, 0.015911f, 0.044320f, 0.012991f, 0.034254f, 0.025150f, 0.016440f, -0.025863f, -0.033805f, -0.040045f, -0.003097f, 0.015202f, 0.028081f, 0.057442f, 0.029981f, 0.036920f, 0.021038f, 0.034245f, 0.016866f, 0.032994f, -0.022186f, 0.006402f, 0.061546f, -0.001442f, 0.047276f, 0.012831f, 0.038173f, -0.060840f, -0.010242f, -0.017783f, -0.018306f, 0.014453f, 0.023463f, 0.044433f, 0.071220f, 0.060134f, -0.021566f, 0.010849f, -0.079773f, 0.019503f, 0.017964f, 0.070201f, -0.055980f, 0.044470f, -0.014784f, -0.038813f, 0.029554f, 0.009420f, 0.024606f, 0.044042f, -0.014613f, -0.055966f, 0.028717f, -0.035915f, -0.049860f, -0.023345f, + 0.065881f, -0.057313f, -0.081973f, -0.041004f, -0.013886f, 0.043226f, -0.004861f, -0.029171f, -0.056699f, -0.042351f, 0.026561f, -0.003675f, -0.001434f, 0.036657f, -0.040127f, 0.011532f, 0.040420f, 0.016061f, 0.026927f, 0.039689f, -0.027166f, -0.013327f, -0.023025f, 0.030391f, 0.006306f, 0.015723f, 0.010607f, -0.027050f, 0.033369f, 0.008502f, 0.004932f, -0.013177f, -0.049825f, -0.047040f, 0.004269f, -0.022313f, -0.009761f, -0.021159f, -0.018973f, -0.007990f, 0.008251f, -0.000145f, -0.021296f, 0.026743f, 0.021830f, -0.002867f, -0.024127f, 0.004009f, 0.013759f, -0.016772f, -0.008150f, -0.009579f, -0.000304f, 0.011624f, -0.005821f, -0.011560f, -0.009982f, 0.008207f, 0.006232f, 0.013090f, 0.015633f, -0.008365f, -0.007709f, -0.009524f, 0.009006f, 0.010254f, 0.055106f, -0.017204f, -0.061372f, 0.004549f, -0.025756f, -0.087154f, -0.044425f, 0.114919f, 0.015832f, -0.051501f, -0.057046f, 0.006684f, 0.000827f, 0.023968f, 0.029584f, -0.039804f, -0.026800f, -0.063668f, 0.014728f, -0.022900f, -0.015517f, 0.098068f, 0.020840f, -0.013204f, -0.101045f, -0.006194f, -0.054015f, 0.053728f, 0.065830f, 0.007253f, + 0.051195f, -0.060114f, -0.023902f, -0.037848f, -0.009130f, 0.100187f, 0.124226f, 0.020220f, -0.033279f, -0.044031f, -0.089849f, 0.001606f, 0.011535f, 0.108914f, 0.060497f, -0.015469f, -0.178479f, -0.092019f, 0.015307f, -0.016721f, 0.156666f, 0.052944f, -0.075253f, -0.030868f, -0.134307f, -0.042062f, 0.004707f, 0.088272f, 0.090603f, 0.102191f, 0.004842f, 0.024570f, -0.010696f, 0.009262f, 0.125155f, -0.045697f, 0.091945f, -0.021766f, -0.094366f, -0.027755f, -0.100027f, -0.031626f, 0.131075f, 0.060106f, 0.093613f, -0.030470f, 0.073434f, -0.081598f, -0.013023f, 0.020095f, 0.039191f, 0.078401f, -0.026176f, -0.001105f, 0.005010f, -0.006775f, 0.012135f, 0.021373f, -0.022148f, 0.004014f, -0.023286f, -0.041713f, 0.019180f, 0.035059f, 0.019337f, -0.003805f, -0.025270f, -0.055985f, -0.055632f, -0.028744f, 0.019066f, 0.052855f, 0.029580f, 0.041059f, -0.054651f, -0.071184f, -0.055257f, 0.006983f, 0.063224f, 0.070720f, 0.053983f, -0.031334f, -0.136725f, -0.087236f, 0.002932f, 0.069767f, 0.149131f, 0.058511f, 0.012530f, -0.066921f, -0.088984f, -0.030152f, -0.028093f, 0.078907f, 0.086550f, 0.033148f, + -0.004759f, -0.073878f, -0.055751f, 0.018065f, 0.026163f, 0.064446f, 0.031242f, -0.031765f, -0.022527f, -0.038207f, -0.018248f, 0.019524f, 0.017310f, 0.019787f, 0.024452f, -0.004200f, -0.006702f, -0.079139f, 0.087814f, 0.000502f, -0.023309f, -0.136605f, -0.037199f, -0.036622f, -0.062118f, 0.132964f, 0.001104f, 0.059780f, -0.090942f, 0.050702f, 0.041953f, -0.040397f, 0.026239f, -0.007451f, 0.023431f, 0.000377f, 0.067555f, 0.024354f, -0.066085f, 0.040147f, 0.032537f, 0.000181f, 0.045549f, -0.033462f, -0.017633f, 0.057886f, 0.040062f, 0.038690f, 0.018900f, 0.033719f, -0.099414f, 0.086995f, -0.049992f, -0.031271f, 0.018756f, -0.069144f, 0.101436f, -0.028491f, 0.010041f, 0.073782f, 0.002438f, -0.010765f, 0.039803f, 0.041195f, 0.071851f, -0.017155f, -0.066838f, -0.067648f, 0.007520f, -0.024170f, 0.031499f, -0.040755f, -0.020038f, -0.027461f, 0.020363f, -0.127469f, 0.002091f, 0.095348f, 0.026289f, 0.039063f, -0.003551f, -0.010040f, 0.025050f, -0.033347f, -0.038595f, 0.024236f, 0.013264f, -0.041208f, -0.046219f, 0.176646f, -0.018995f, -0.056884f, 0.016088f, 0.083021f, -0.002222f, -0.064655f, + 0.026882f, -0.011794f, -0.024550f, 0.053597f, 0.067606f, -0.048989f, -0.080745f, 0.018702f, 0.019573f, -0.018229f, -0.048240f, 0.002835f, 0.024508f, -0.007009f, -0.007733f, -0.002773f, -0.008210f, 0.013406f, 0.014545f, -0.016172f, 0.001969f, 0.007694f, 0.003774f, -0.009549f, 0.003874f, -0.000112f, -0.022227f, 0.016573f, 0.007062f, 0.031653f, 0.015661f, -0.011396f, 0.012930f, -0.005718f, 0.018580f, -0.000860f, -0.004577f, 0.025907f, -0.006099f, 0.017895f, -0.004877f, -0.019556f, -0.001502f, 0.023368f, -0.006189f, 0.026536f, -0.024444f, 0.033200f, 0.007967f, -0.023072f, 0.010178f, 0.000979f, 0.012341f, -0.003501f, -0.009164f, -0.001920f, 0.008245f, 0.026263f, -0.068960f, 0.025003f, 0.107195f, 0.170492f, -0.075681f, 0.056054f, -0.112692f, -0.032319f, -0.068864f, -0.008569f, 0.103792f, 0.111500f, 0.087468f, -0.001982f, -0.070794f, -0.041698f, 0.037763f, 0.003695f, 0.018709f, 0.058713f, -0.001529f, 0.029666f, -0.074116f, -0.017914f, -0.043043f, -0.051004f, 0.028068f, 0.024638f, 0.001210f, 0.052832f, -0.044452f, -0.000634f, 0.011329f, -0.061171f, -0.002061f, 0.005341f, -0.039607f, -0.013826f, + 0.014420f, -0.025222f, 0.058219f, -0.018103f, 0.088356f, 0.068081f, -0.043953f, -0.011195f, -0.060980f, -0.068337f, -0.090372f, 0.029934f, 0.041352f, 0.121618f, 0.091711f, 0.044079f, 0.058234f, 0.012345f, -0.066526f, -0.042704f, -0.037316f, -0.044000f, -0.009719f, 0.026506f, -0.002533f, -0.029826f, 0.008009f, -0.030085f, 0.019642f, 0.046159f, 0.008714f, -0.045553f, 0.036582f, -0.021154f, -0.023843f, -0.045548f, 0.024272f, 0.022127f, 0.010675f, 0.007108f, 0.106302f, 0.082580f, 0.066491f, 0.012677f, -0.015325f, -0.088579f, -0.018735f, -0.007972f, 0.088641f, 0.052169f, 0.023220f, 0.028226f, 0.076831f, -0.010729f, -0.030339f, -0.039904f, -0.034467f, -0.014802f, -0.007532f, 0.008523f, 0.001189f, 0.002110f, 0.040059f, -0.003049f, -0.023461f, -0.012969f, -0.007834f, 0.002455f, 0.020020f, 0.037114f, 0.015900f, -0.002847f, 0.022353f, -0.035086f, 0.014769f, 0.035448f, 0.014208f, 0.068263f, -0.026846f, 0.002151f, 0.011850f, -0.026049f, 0.007745f, -0.042438f, -0.001763f, 0.017224f, 0.001079f, 0.019787f, 0.010887f, -0.003114f, -0.000527f, -0.006584f, -0.000689f, 0.010641f, -0.011595f, -0.185575f, + -0.105600f, -0.062722f, 0.107158f, 0.048508f, 0.283225f, 0.263929f, 0.275038f, 0.275888f, 0.297957f, 0.207623f, 0.110064f, 0.156914f, 0.096052f, -0.048537f, -0.086859f, -0.136770f, -0.262498f, -0.238674f, -0.245191f, -0.179725f, -0.179899f, -0.135345f, -0.110200f, -0.060402f, 0.006922f, -0.105632f, -0.052472f, -0.023004f, -0.015625f, -0.057816f, 0.015369f, 0.069153f, 0.080002f, 0.028096f, 0.094353f, 0.117684f, 0.030277f, 0.022009f, 0.024306f, 0.115586f, 0.122651f, 0.152446f, 0.172963f, 0.149310f, 0.171754f, 0.258372f, 0.105990f, 0.201392f, 0.277478f, 0.176527f, 0.210756f, 0.163710f, 0.083337f, 0.097167f, 0.109732f, 0.095521f, 0.132423f, 0.128382f, 0.081163f, 0.014169f, 0.040589f, 0.074975f, -0.004332f, 0.007250f, -0.036383f, -0.044063f, -0.130202f, -0.060484f, -0.225980f, -0.286135f, -0.227475f, -0.261237f, -0.352840f, -0.342768f, -0.201935f, -0.382684f, -0.345406f, -0.317253f, -0.356627f, -0.302898f, -0.229534f, -0.290352f, -0.212207f, -0.060672f, -0.140927f, -0.176292f, -0.068904f, -0.070854f, -0.056687f, -0.064500f, -0.027821f, 0.015292f, 0.035822f, 0.067663f, 0.090110f, 0.101347f, + 0.116348f, 0.118332f, 0.169697f, 0.102045f, 0.199897f, 0.221925f, 0.106419f, 0.205956f, 0.197585f, 0.123396f, 0.151306f, 0.217962f, 0.149302f, 0.246259f, 0.187141f, 0.233348f, 0.164439f, 0.147648f, 0.154874f, 0.142931f, 0.113412f, 0.128289f, 0.112885f, 0.087494f, 0.066895f, 0.063617f, 0.052782f, 0.020771f, -0.017790f, -0.015631f, -0.010686f, -0.080886f, -0.128729f, -0.125056f, -0.127004f, -0.139505f, -0.128281f, -0.144349f, -0.104220f, -0.108943f, -0.088645f, -0.067150f, -0.052239f, -0.060132f, -0.058481f, -0.045930f, -0.032490f, -0.036287f, -0.046374f, -0.025980f, -0.014296f, -0.028490f, -0.041458f, -0.025639f, -0.019296f, -0.026001f, -0.031409f, -0.015205f, -0.002187f, 0.009033f, -0.000399f, 0.006295f, 0.020486f, 0.020885f, -0.002032f, 0.006210f, 0.013796f, 0.009198f, -0.002982f, 0.002636f, 0.007457f, 0.005707f, -0.006052f, 0.000350f, 0.004992f, 0.008470f, 0.004564f, 0.008658f, 0.001706f, 0.005118f, 0.009537f, 0.017114f, 0.005498f, 0.003275f, 0.001455f, 0.005710f, 0.001527f, 0.004166f, -0.000230f, 0.002097f, -0.004999f, -0.008067f, -0.013759f, -0.005509f, -0.008930f, -0.007385f, + -0.012598f, -0.003627f, -0.006704f, -0.004123f, -0.003951f, 0.005249f, 0.001613f, 0.004312f, -0.001080f, 0.008785f, 0.007505f, 0.013821f, 0.006331f, 0.016051f, 0.016974f, 0.020656f, 0.011379f, 0.018823f, 0.017747f, 0.018147f, 0.009476f, 0.014206f, 0.010528f, 0.015053f, 0.007306f, 0.009311f, 0.004167f, 0.009163f, 0.001124f, 0.004362f, -0.000960f, 0.002267f, -0.004499f, -0.001832f, -0.006127f, -0.001849f, -0.007047f, -0.002836f, -0.006866f, -0.001364f, -0.005554f, -0.000365f, -0.004418f, 0.000990f, -0.003190f, 0.002012f}, + {0.020157f, 0.000971f, -0.001240f, -0.000771f, -0.001491f, -0.010355f, -0.010343f, 0.009906f, 0.002486f, -0.006041f, -0.009019f, -0.004460f, -0.006794f, -0.011940f, 0.015272f, 0.001766f, 0.005591f, 0.007499f, 0.021963f, -0.000630f, 0.003587f, -0.005337f, -0.001849f, -0.004120f, -0.014158f, 0.003115f, -0.004263f, 0.001342f, 0.010007f, -0.003978f, -0.000874f, 0.002093f, 0.001150f, -0.002418f, 0.000566f, -0.013232f, 0.002836f, -0.000378f, -0.004622f, 0.004059f, 0.001995f, -0.008925f, 0.014097f, 0.000432f, 0.002118f, 0.012961f, -0.004947f, -0.005681f, -0.012729f, -0.006561f, 0.008974f, 0.000501f, 0.009560f, -0.004685f, -0.010390f, 0.004514f, -0.009676f, -0.004432f, -0.018779f, 0.007715f, 0.006721f, 0.003976f, 0.005798f, 0.012911f, 0.003473f, -0.005741f, 0.007106f, 0.010716f, -0.006932f, 0.005282f, 0.000072f, -0.002320f, -0.003542f, -0.002947f, 0.007366f, -0.001514f, 0.008163f, -0.004115f, 0.003344f, -0.002556f, 0.003036f, 0.005824f, -0.003072f, 0.002096f, -0.002087f, 0.004700f, 0.003961f, 0.003209f, -0.001522f, 0.001086f, 0.000237f, -0.002681f, 0.001429f, 0.004595f, 0.000929f, 0.001535f, + -0.002629f, 0.001785f, -0.001385f, 0.001044f, -0.001991f, 0.000427f, 0.002768f, -0.008026f, 0.002228f, -0.004998f, -0.009982f, -0.001064f, -0.011806f, -0.014499f, -0.009026f, -0.006985f, -0.015822f, 0.000565f, -0.005658f, -0.003275f, 0.004983f, 0.016875f, 0.001641f, -0.004099f, -0.001853f, 0.002654f, -0.000239f, 0.006970f, 0.012124f, -0.001086f, 0.013603f, -0.001623f, -0.000787f, -0.001684f, 0.007792f, -0.010235f, 0.001683f, 0.001169f, -0.002397f, -0.000643f, -0.005972f, -0.010168f, 0.013988f, -0.004785f, -0.000929f, -0.002534f, 0.006232f, -0.006663f, -0.005579f, 0.002363f, 0.002168f, 0.009645f, -0.006544f, 0.007935f, -0.004558f, -0.008051f, -0.000519f, -0.003355f, 0.002284f, 0.004304f, -0.000060f, 0.005602f, 0.002803f, 0.004072f, -0.005237f, -0.006335f, -0.010306f, -0.007703f, 0.001096f, 0.012405f, 0.001691f, 0.010069f, 0.002745f, -0.005242f, 0.007073f, 0.003265f, -0.007386f, 0.013137f, 0.002321f, -0.012435f, 0.003359f, 0.005591f, 0.001242f, 0.003706f, 0.003355f, -0.008813f, 0.003335f, 0.003053f, 0.002299f, -0.000527f, 0.006602f, 0.002156f, -0.001520f, -0.002140f, 0.000091f, 0.002571f, + 0.000064f, 0.003499f, 0.000029f, 0.000159f, 0.002168f, -0.000850f, -0.001786f, -0.001248f, 0.000494f, -0.001721f, -0.001688f, 0.002259f, -0.000068f, 0.002171f, 0.002056f, -0.000527f, -0.000038f, -0.014675f, -0.013209f, 0.002868f, 0.001387f, 0.011069f, -0.008597f, 0.011384f, -0.005862f, -0.002480f, -0.017892f, -0.001101f, 0.001041f, -0.006065f, -0.001209f, 0.009565f, 0.008838f, 0.013529f, -0.003457f, -0.002036f, 0.008258f, 0.003977f, 0.007396f, -0.018299f, 0.017968f, -0.003896f, -0.000436f, 0.002889f, -0.002407f, -0.000134f, -0.001819f, -0.001247f, 0.011062f, -0.000325f, 0.014582f, -0.002542f, -0.006260f, -0.012298f, 0.001226f, -0.005572f, -0.005092f, 0.008495f, 0.006355f, 0.008880f, 0.000078f, 0.001091f, -0.013318f, -0.009456f, -0.000366f, 0.011912f, 0.003897f, -0.001550f, 0.003762f, -0.004986f, 0.012469f, -0.000697f, -0.011201f, -0.013942f, -0.005207f, 0.015585f, 0.011554f, 0.012031f, 0.005364f, 0.000434f, -0.013293f, -0.005856f, -0.002079f, -0.007659f, 0.007816f, -0.001393f, -0.003890f, 0.006865f, -0.018833f, 0.005551f, -0.002614f, 0.004403f, -0.001659f, -0.005338f, 0.008247f, 0.003191f, + -0.009030f, -0.009384f, 0.004563f, -0.002447f, 0.005354f, 0.001498f, -0.004194f, 0.002885f, 0.003339f, -0.000160f, 0.001173f, 0.000004f, 0.000222f, -0.001567f, -0.000208f, -0.002584f, -0.000152f, -0.002251f, 0.003514f, 0.002023f, -0.002985f, 0.001413f, -0.000898f, 0.000984f, 0.000811f, 0.001293f, -0.002268f, -0.001811f, 0.000482f, 0.001376f, -0.004019f, -0.002171f, 0.003625f, -0.004104f, -0.008194f, -0.001239f, -0.006368f, 0.002968f, 0.010056f, 0.004077f, 0.000264f, -0.004038f, -0.023693f, -0.015455f, -0.000603f, 0.006934f, 0.008172f, 0.000579f, 0.001577f, -0.003227f, 0.008103f, 0.003735f, 0.006475f, -0.010182f, 0.009664f, 0.005707f, -0.011180f, 0.004263f, 0.010082f, -0.000451f, 0.003200f, 0.001765f, 0.009135f, -0.007059f, 0.005388f, -0.000825f, -0.001329f, -0.008709f, 0.000455f, 0.009554f, -0.006105f, -0.004248f, -0.008344f, 0.011197f, -0.001164f, 0.002274f, -0.008771f, -0.024657f, -0.007303f, 0.003759f, 0.002207f, 0.009275f, -0.006670f, -0.003949f, -0.003835f, -0.001532f, -0.008040f, 0.000374f, -0.007265f, 0.016362f, 0.005638f, 0.013371f, -0.013485f, -0.002513f, -0.005636f, 0.012541f, + -0.003850f, -0.002156f, -0.010400f, 0.006545f, -0.000283f, -0.006771f, 0.010498f, 0.003411f, 0.001223f, 0.012258f, 0.002528f, -0.010486f, -0.001551f, 0.001428f, -0.002954f, -0.003444f, 0.000015f, -0.008880f, 0.017845f, 0.007527f, 0.002542f, 0.011309f, 0.004784f, 0.004561f, 0.008142f, -0.002197f, 0.006882f, -0.003825f, 0.001139f, 0.000872f, 0.000361f, -0.001915f, 0.001200f, 0.000696f, -0.000711f, -0.001052f, -0.001211f, 0.001022f, -0.000966f, 0.000244f, 0.005891f, 0.000789f, -0.000221f, 0.000068f, -0.000124f, -0.000632f, 0.004669f, 0.001391f, 0.003017f, 0.000377f, -0.003058f, -0.000579f, 0.006668f, -0.005324f, 0.004263f, 0.000323f, -0.002629f, 0.011129f, 0.008606f, -0.000931f, -0.015189f, -0.020446f, -0.015664f, 0.005771f, 0.000098f, -0.008863f, -0.002207f, 0.000976f, -0.001913f, 0.022881f, 0.004054f, -0.016623f, -0.004311f, -0.005002f, 0.000932f, -0.007846f, 0.013073f, -0.009738f, -0.012605f, 0.011836f, -0.004888f, 0.003224f, 0.003261f, -0.005467f, -0.014851f, 0.001962f, -0.007861f, -0.007073f, -0.007213f, -0.000941f, 0.011763f, -0.001634f, -0.002522f, 0.017190f, 0.003279f, 0.002617f, + -0.022086f, -0.002495f, 0.011968f, 0.013852f, -0.007544f, 0.003751f, 0.002024f, -0.021923f, -0.002804f, -0.001350f, -0.002103f, 0.005516f, 0.000380f, -0.012295f, 0.001736f, -0.009830f, 0.009561f, -0.003343f, 0.012270f, 0.002424f, -0.013784f, 0.006175f, 0.026269f, -0.010142f, 0.000370f, -0.019466f, 0.004860f, 0.016390f, -0.029218f, 0.004202f, -0.001945f, -0.002531f, 0.007443f, -0.004725f, -0.007521f, 0.013794f, 0.013320f, -0.011370f, -0.001236f, 0.008648f, -0.003692f, 0.002059f, 0.004215f, 0.002579f, 0.000985f, -0.003297f, 0.007499f, -0.000164f, 0.004956f, 0.000235f, 0.006720f, 0.004506f, 0.004298f, -0.000310f, 0.001573f, 0.007350f, 0.000947f, -0.001462f, 0.002728f, 0.002320f, 0.001030f, 0.006122f, -0.003207f, 0.001981f, 0.001135f, -0.001300f, 0.000607f, 0.002247f, 0.001694f, 0.000795f, -0.000409f, 0.000326f, 0.019904f, 0.002186f, 0.009073f, 0.013665f, -0.016894f, -0.005518f, -0.012826f, 0.006341f, 0.007874f, 0.014871f, 0.029538f, 0.004365f, -0.022035f, -0.002325f, -0.005327f, -0.002551f, -0.009364f, -0.000197f, -0.000790f, 0.010833f, 0.009099f, 0.002979f, -0.000494f, 0.000220f, + -0.003137f, -0.002774f, 0.012978f, -0.004351f, -0.001391f, 0.009258f, -0.000880f, 0.005370f, -0.000632f, 0.011848f, -0.008888f, -0.018432f, 0.022991f, -0.001539f, 0.005707f, -0.017260f, 0.001585f, -0.005387f, 0.025485f, 0.003770f, 0.011722f, -0.002572f, 0.010436f, 0.006608f, -0.022423f, -0.003773f, -0.012437f, -0.011172f, 0.001884f, 0.015866f, 0.002367f, -0.003399f, 0.025262f, -0.002811f, -0.013713f, -0.010916f, -0.006999f, 0.012058f, 0.037999f, -0.000241f, 0.010815f, 0.002540f, -0.011616f, -0.002791f, 0.000588f, 0.011012f, 0.017491f, 0.001423f, 0.014139f, 0.012119f, -0.022137f, 0.000602f, -0.003627f, -0.000715f, 0.011694f, -0.005178f, 0.003341f, 0.005197f, -0.001324f, -0.011702f, -0.007616f, -0.017030f, 0.004465f, 0.006612f, -0.000425f, 0.002479f, 0.002918f, 0.001935f, 0.000230f, -0.005364f, 0.001552f, 0.002377f, 0.000148f, 0.002196f, -0.002292f, 0.004395f, 0.000067f, 0.002159f, -0.000784f, -0.000911f, -0.001709f, 0.000474f, -0.000697f, 0.000698f, 0.004199f, 0.005887f, 0.005426f, 0.000660f, 0.001781f, 0.003577f, 0.002530f, 0.000033f, 0.002570f, 0.000656f, -0.000061f, 0.004439f, + -0.006418f, -0.029342f, 0.006863f, -0.003224f, 0.010242f, 0.006099f, 0.027316f, 0.005151f, -0.004855f, 0.006187f, 0.020960f, 0.022610f, 0.009718f, 0.015834f, 0.016761f, -0.013106f, -0.009693f, -0.021049f, -0.022162f, 0.002139f, 0.009914f, -0.019275f, -0.013242f, -0.001349f, -0.021691f, -0.018502f, 0.009457f, 0.002627f, -0.009510f, -0.006817f, -0.014157f, 0.011617f, 0.008955f, 0.019312f, 0.037569f, -0.004480f, -0.010369f, -0.004328f, -0.018188f, -0.000561f, -0.014127f, -0.016215f, 0.019348f, 0.001835f, 0.002841f, -0.024940f, 0.025599f, 0.004694f, -0.015613f, -0.005436f, 0.013271f, 0.000521f, 0.003029f, -0.000790f, 0.002320f, 0.007070f, -0.011921f, 0.013847f, 0.000504f, -0.010342f, -0.002600f, -0.017463f, 0.002844f, -0.017922f, -0.015395f, 0.013089f, 0.014078f, -0.014335f, -0.022008f, 0.005271f, -0.010525f, -0.001982f, -0.005745f, 0.007078f, -0.006186f, 0.009461f, 0.003317f, 0.011533f, -0.002541f, 0.008513f, 0.004749f, -0.020306f, -0.006809f, 0.004500f, 0.002773f, -0.000043f, -0.009692f, -0.005959f, -0.002793f, 0.006176f, -0.003657f, -0.003712f, 0.000438f, 0.004862f, 0.004244f, -0.000641f, + -0.000142f, -0.006125f, -0.002933f, 0.000680f, -0.001209f, -0.000995f, 0.004820f, 0.000090f, -0.000190f, -0.004620f, 0.004175f, 0.000866f, -0.001398f, -0.001241f, -0.002693f, -0.000967f, -0.002997f, 0.003832f, -0.000927f, 0.001529f, -0.001110f, 0.007509f, -0.011245f, -0.011934f, 0.014447f, -0.004347f, -0.003641f, 0.008615f, -0.012392f, -0.012682f, 0.014559f, 0.019891f, 0.000118f, -0.001056f, 0.006462f, -0.016844f, 0.028757f, -0.017650f, 0.001872f, 0.014005f, -0.006826f, 0.013073f, 0.015398f, 0.005284f, -0.016660f, 0.017826f, -0.002882f, 0.006776f, -0.013120f, -0.002286f, -0.024729f, 0.008542f, -0.014794f, 0.005723f, -0.025448f, 0.014903f, -0.018672f, -0.012754f, 0.010284f, 0.014708f, 0.004658f, 0.001718f, 0.000355f, -0.015743f, -0.014954f, -0.009299f, 0.038083f, 0.021126f, -0.006284f, -0.035440f, -0.005263f, 0.010063f, 0.020423f, -0.011628f, 0.001433f, -0.024485f, -0.008686f, -0.002981f, 0.006139f, 0.003648f, -0.005755f, -0.000400f, 0.010527f, -0.012111f, -0.000912f, -0.013814f, 0.007297f, 0.009087f, 0.026252f, 0.011275f, -0.013108f, 0.005486f, -0.007403f, -0.019995f, -0.002764f, 0.011590f, + 0.001412f, 0.032992f, -0.019107f, -0.009200f, 0.004866f, -0.017176f, 0.008543f, 0.002757f, -0.003471f, 0.016757f, 0.003919f, 0.007401f, -0.000099f, 0.000608f, -0.002841f, 0.008282f, 0.012114f, 0.002975f, -0.003786f, 0.009046f, -0.004948f, 0.002836f, -0.008747f, -0.002854f, -0.000248f, -0.011220f, -0.000426f, -0.004374f, -0.002222f, -0.004368f, -0.007509f, -0.003380f, 0.002261f, 0.002817f, 0.001719f, -0.002383f, -0.000598f, 0.004932f, -0.008436f, 0.000830f, 0.000463f, -0.025430f, -0.003562f, 0.005035f, 0.015077f, 0.007117f, 0.019638f, 0.003404f, -0.023130f, 0.014683f, -0.019542f, -0.021231f, 0.000750f, -0.002055f, 0.016214f, 0.019816f, 0.018519f, 0.026632f, 0.006714f, -0.027749f, 0.030409f, 0.016406f, -0.012043f, 0.023140f, -0.002830f, 0.002719f, -0.020225f, -0.007176f, -0.005702f, -0.009159f, 0.019687f, -0.032872f, -0.007222f, -0.015499f, -0.014447f, 0.002605f, 0.015986f, -0.007577f, -0.018716f, -0.020153f, -0.025926f, -0.026500f, -0.013221f, -0.004582f, 0.011591f, -0.020817f, -0.026675f, -0.015968f, -0.006570f, -0.013271f, -0.008615f, 0.023337f, -0.012961f, 0.002127f, 0.012632f, -0.021316f, + -0.012416f, -0.014387f, 0.023270f, -0.009907f, 0.015230f, 0.032976f, -0.003001f, 0.007351f, 0.003440f, -0.010187f, -0.013064f, -0.009136f, 0.015823f, -0.002384f, 0.018087f, 0.001020f, 0.013709f, 0.003091f, -0.022478f, 0.028059f, -0.011909f, -0.003637f, -0.023890f, 0.014744f, 0.031842f, 0.005295f, -0.004109f, 0.008349f, 0.003885f, -0.020290f, -0.009223f, 0.001154f, -0.004564f, -0.002220f, -0.008499f, -0.008578f, -0.001184f, 0.001469f, 0.001489f, 0.014663f, -0.001476f, 0.001832f, -0.007058f, 0.005552f, 0.000829f, 0.011017f, 0.005024f, 0.004956f, 0.002316f, -0.001357f, -0.004531f, -0.004039f, -0.006381f, -0.001465f, -0.004750f, 0.003290f, 0.001923f, -0.000134f, -0.003242f, -0.002957f, -0.002317f, -0.001030f, 0.001375f, -0.001202f, 0.006278f, 0.047092f, 0.029294f, 0.021740f, -0.015780f, -0.033480f, -0.009349f, 0.020774f, -0.032190f, -0.017162f, 0.000368f, 0.025332f, 0.017733f, 0.014819f, -0.018759f, 0.014206f, -0.005238f, 0.014201f, -0.003915f, 0.036516f, 0.021490f, -0.001553f, -0.033623f, -0.003197f, 0.025031f, 0.021757f, 0.000635f, 0.044214f, 0.019628f, -0.008597f, -0.000282f, 0.003278f, + -0.005467f, -0.012039f, -0.017203f, -0.002422f, -0.047820f, 0.013714f, -0.016582f, 0.002501f, -0.001946f, 0.012659f, 0.017419f, 0.000687f, 0.004435f, -0.020981f, 0.014846f, -0.007472f, 0.031209f, 0.000960f, 0.004219f, -0.076466f, -0.003578f, 0.020704f, 0.010284f, 0.022006f, -0.007748f, -0.021240f, 0.011648f, 0.004403f, -0.017881f, 0.016988f, 0.003108f, -0.016628f, -0.000042f, 0.000961f, 0.005592f, -0.005960f, -0.028374f, -0.027895f, -0.001452f, -0.009883f, 0.009134f, 0.010156f, 0.003872f, 0.010794f, -0.034685f, -0.011549f, 0.001466f, 0.007864f, 0.007994f, -0.013452f, 0.010490f, 0.002760f, -0.005234f, 0.003875f, 0.009428f, -0.006236f, 0.000991f, -0.001850f, 0.003709f, -0.006347f, -0.010629f, -0.003237f, 0.011931f, -0.009024f, 0.000976f, -0.006681f, 0.004577f, -0.002620f, 0.004011f, 0.007312f, -0.001191f, -0.006781f, 0.005410f, -0.000941f, -0.008567f, -0.004994f, 0.002605f, 0.004053f, 0.000099f, -0.003068f, 0.001279f, -0.000415f, 0.004710f, -0.002138f, 0.009465f, -0.003102f, -0.001003f, 0.005965f, -0.032429f, -0.052012f, 0.008337f, 0.018086f, 0.018661f, 0.000499f, 0.043211f, -0.030727f, + 0.010083f, 0.005977f, -0.008844f, -0.027272f, -0.011578f, -0.015489f, 0.018286f, -0.008007f, -0.016899f, -0.027760f, -0.002641f, -0.010230f, -0.005385f, -0.020928f, 0.011112f, -0.001270f, -0.009891f, 0.011342f, 0.014308f, 0.017066f, -0.022175f, 0.040416f, 0.002379f, -0.005763f, -0.024873f, -0.023270f, -0.004816f, -0.003022f, -0.024264f, -0.025174f, -0.019428f, 0.016297f, -0.011286f, 0.027000f, 0.008557f, 0.045028f, 0.015362f, 0.017113f, -0.005854f, 0.024157f, -0.004278f, 0.005834f, 0.034110f, -0.010396f, 0.012324f, -0.041089f, -0.052428f, 0.011432f, -0.002556f, -0.033212f, 0.001991f, 0.000834f, -0.045262f, 0.012726f, -0.013392f, -0.008930f, -0.017728f, 0.017056f, -0.016570f, 0.000944f, -0.001904f, 0.008222f, -0.000039f, -0.024729f, 0.014430f, -0.003566f, 0.005696f, -0.031192f, -0.043138f, -0.038332f, 0.002048f, -0.009092f, -0.043677f, -0.009180f, 0.041802f, 0.022071f, 0.009634f, 0.007985f, -0.019439f, 0.000639f, -0.004524f, 0.001872f, -0.006454f, -0.005160f, -0.000304f, -0.000477f, 0.001591f, -0.000062f, -0.013594f, -0.003254f, 0.003489f, -0.002540f, 0.006439f, 0.010680f, 0.008876f, -0.000098f, + -0.001575f, -0.004645f, 0.014116f, 0.008172f, 0.009268f, 0.007782f, 0.005654f, -0.001054f, -0.005472f, -0.004861f, 0.011003f, -0.008566f, 0.006539f, 0.009312f, 0.003578f, 0.004594f, 0.000697f, 0.002753f, -0.007533f, 0.000683f, -0.002212f, -0.006409f, 0.003038f, 0.004297f, 0.008504f, 0.031581f, 0.041492f, -0.001237f, 0.011153f, 0.026072f, 0.021593f, -0.002234f, -0.052478f, 0.036009f, -0.003373f, 0.009788f, -0.010545f, 0.018461f, -0.001102f, -0.022791f, 0.006625f, 0.041418f, 0.006563f, -0.027186f, 0.024191f, 0.017132f, 0.011457f, -0.020434f, 0.022298f, 0.016365f, 0.002208f, 0.026354f, -0.010221f, 0.007078f, 0.042703f, 0.030946f, 0.001553f, 0.009820f, 0.021148f, -0.039990f, -0.007744f, -0.002511f, -0.005919f, -0.035023f, 0.009344f, 0.010659f, 0.002395f, -0.027137f, -0.000038f, -0.046493f, 0.002888f, -0.033200f, -0.006172f, 0.017213f, -0.013782f, -0.020060f, -0.015770f, 0.009970f, 0.008569f, -0.018489f, 0.007812f, -0.006610f, 0.023414f, -0.011844f, -0.013026f, 0.012079f, 0.021928f, -0.001952f, 0.009829f, 0.008415f, -0.050356f, -0.001043f, -0.003253f, -0.025786f, 0.003192f, 0.033250f, + 0.010601f, -0.009137f, -0.003566f, 0.024353f, 0.017503f, 0.010744f, -0.006302f, 0.038562f, 0.000931f, -0.031673f, 0.004832f, 0.038609f, 0.020485f, 0.019723f, 0.012107f, 0.002340f, -0.008892f, -0.010614f, 0.007527f, 0.006510f, 0.009732f, 0.014692f, -0.002954f, 0.011672f, 0.007567f, 0.001430f, -0.001314f, -0.000861f, 0.005758f, -0.004869f, -0.001334f, -0.004814f, 0.000562f, -0.002086f, 0.006322f, -0.011223f, 0.002700f, 0.004318f, 0.001974f, 0.009221f, -0.014912f, -0.006141f, 0.003410f, 0.003405f, -0.000793f, 0.009465f, -0.002537f, -0.002575f, -0.003532f, 0.001484f, 0.006652f, 0.007319f, -0.007864f, 0.001763f, 0.004902f, -0.007499f, -0.004181f, -0.003907f, -0.003131f, 0.020988f, -0.047335f, 0.020546f, -0.048995f, -0.056458f, -0.037789f, 0.003173f, -0.032363f, 0.031494f, -0.010472f, -0.037726f, -0.002134f, -0.009041f, 0.004386f, 0.007907f, -0.009816f, -0.004233f, 0.024527f, -0.006847f, 0.008828f, -0.013106f, -0.014629f, 0.041098f, -0.014461f, -0.003921f, -0.002082f, 0.009913f, 0.024012f, -0.049990f, -0.004312f, 0.027860f, 0.025327f, 0.025283f, 0.002352f, -0.008486f, 0.051264f, 0.018390f, + 0.015533f, 0.021065f, 0.008354f, -0.006659f, -0.000554f, 0.031416f, 0.009009f, -0.021023f, 0.010559f, 0.057260f, -0.030811f, 0.039783f, 0.013392f, -0.059037f, 0.013509f, 0.040796f, -0.005306f, 0.018727f, -0.001178f, -0.044586f, 0.021921f, 0.057040f, 0.002227f, 0.039006f, -0.024176f, 0.034585f, 0.027088f, -0.000237f, -0.006043f, 0.031796f, 0.015518f, -0.040265f, 0.039951f, -0.009455f, -0.010324f, 0.025496f, -0.013012f, -0.014063f, -0.019251f, 0.007039f, 0.001132f, 0.007471f, -0.002718f, -0.007643f, 0.029740f, -0.026832f, 0.003726f, -0.005050f, -0.009995f, -0.021822f, -0.022330f, 0.013181f, -0.002652f, -0.013217f, -0.020047f, -0.015354f, -0.028126f, -0.018642f, -0.002120f, -0.012729f, -0.009031f, -0.001397f, -0.015107f, 0.006487f, -0.013434f, -0.012189f, -0.004529f, 0.003701f, 0.003417f, -0.005865f, -0.001895f, -0.019425f, 0.006854f, -0.020410f, 0.014887f, -0.004841f, -0.002452f, -0.008666f, -0.006131f, -0.000519f, 0.022823f, 0.012507f, -0.003606f, 0.006202f, 0.015336f, 0.009446f, -0.010199f, -0.003818f, 0.005298f, -0.007738f, 0.012272f, 0.003473f, -0.006383f, 0.005026f, -0.018639f, -0.031671f, + 0.076773f, 0.038747f, -0.090626f, -0.036640f, 0.009055f, -0.014431f, 0.025524f, 0.031157f, 0.032378f, 0.038129f, -0.023624f, 0.071784f, -0.011238f, 0.002308f, -0.023843f, 0.027369f, 0.035281f, -0.025286f, -0.029936f, -0.005680f, -0.017459f, 0.003679f, 0.013762f, 0.002717f, -0.019038f, -0.006486f, 0.028837f, -0.001825f, 0.014316f, 0.004098f, 0.034804f, 0.053457f, 0.019565f, -0.024935f, -0.060161f, -0.004482f, -0.010645f, 0.007239f, -0.014325f, 0.020203f, 0.032538f, 0.003518f, -0.012778f, -0.026720f, 0.064682f, 0.057553f, -0.008092f, 0.028377f, -0.016047f, -0.020304f, -0.063341f, 0.035256f, -0.029839f, -0.006219f, -0.002409f, -0.019095f, 0.010472f, 0.039120f, 0.005367f, -0.016484f, 0.017777f, -0.007337f, -0.026466f, 0.039992f, 0.007474f, -0.054131f, 0.069518f, -0.046917f, -0.025965f, 0.027636f, 0.027265f, 0.023848f, -0.000147f, -0.057852f, -0.005571f, 0.005676f, -0.003940f, -0.018641f, 0.010764f, -0.009486f, 0.003586f, 0.007800f, -0.024793f, 0.028557f, 0.018958f, 0.009937f, 0.003208f, -0.010943f, -0.009070f, -0.000019f, 0.009325f, 0.001411f, 0.007063f, -0.004034f, -0.019341f, 0.006226f, + -0.028090f, -0.008183f, 0.008187f, -0.007594f, 0.014485f, -0.012217f, -0.002459f, -0.010300f, 0.011420f, 0.001586f, 0.014175f, 0.017690f, 0.011211f, 0.001035f, -0.013578f, 0.009967f, 0.015370f, -0.002623f, -0.002457f, -0.016563f, -0.008138f, 0.020385f, -0.007384f, 0.013941f, -0.001767f, -0.006930f, 0.006431f, 0.007198f, -0.001020f, -0.010727f, 0.019893f, -0.010323f, -0.024897f, 0.002802f, 0.035525f, 0.010571f, -0.048270f, -0.038666f, -0.009294f, 0.060380f, 0.006278f, -0.028959f, -0.077882f, -0.021633f, -0.003569f, 0.018508f, 0.053548f, 0.041072f, -0.005766f, 0.000530f, 0.035214f, 0.028706f, 0.001300f, 0.007885f, -0.105090f, -0.066218f, -0.032314f, -0.051888f, 0.004473f, -0.028937f, 0.046447f, -0.010627f, -0.003686f, -0.000213f, -0.018764f, -0.021364f, 0.033642f, 0.021003f, 0.011879f, -0.004751f, -0.016085f, -0.014356f, 0.016735f, -0.037636f, -0.014152f, 0.006668f, -0.013099f, -0.018326f, 0.015654f, -0.054407f, -0.076188f, 0.018116f, 0.023743f, 0.029557f, -0.044511f, -0.023637f, 0.024572f, 0.009352f, -0.074274f, -0.065188f, 0.003912f, -0.031547f, -0.032686f, 0.012142f, -0.060015f, 0.030432f, + -0.023246f, 0.025010f, 0.023948f, -0.014876f, -0.033847f, -0.078100f, -0.027429f, -0.023465f, 0.043790f, -0.037894f, -0.024763f, 0.013365f, 0.044766f, 0.026122f, 0.000202f, -0.015257f, -0.005066f, 0.013406f, -0.013486f, 0.045286f, -0.028109f, -0.022000f, -0.010675f, -0.003940f, 0.012409f, -0.033367f, 0.019608f, 0.015059f, -0.014017f, -0.023366f, 0.005396f, -0.001358f, 0.022710f, -0.029182f, -0.038093f, -0.009658f, 0.005991f, -0.021058f, -0.003200f, -0.025464f, 0.001075f, 0.006209f, -0.011480f, 0.017763f, -0.004806f, -0.012591f, 0.005502f, -0.008511f, 0.005171f, -0.007250f, -0.026458f, -0.001162f, 0.001940f, 0.025254f, 0.019809f, -0.012151f, 0.000100f, -0.001356f, -0.014917f, -0.019098f, 0.009289f, -0.004846f, -0.006938f, 0.005780f, 0.030966f, 0.042533f, -0.006801f, -0.057217f, 0.025922f, -0.008592f, -0.023868f, -0.049345f, 0.014722f, 0.021077f, -0.073158f, 0.027600f, 0.025995f, 0.065946f, 0.005960f, -0.016578f, 0.004075f, -0.080795f, -0.023471f, -0.009872f, 0.001028f, 0.014707f, -0.027633f, 0.049406f, 0.019779f, 0.061077f, -0.012335f, 0.053700f, 0.034492f, 0.021151f, 0.048978f, 0.024694f, + 0.032290f, 0.041520f, 0.001738f, -0.054729f, -0.051577f, 0.010303f, 0.058835f, 0.042368f, -0.078647f, -0.002488f, -0.013427f, -0.011284f, -0.008379f, -0.054665f, 0.013791f, -0.039028f, 0.034729f, -0.026213f, 0.078549f, -0.021003f, -0.113098f, -0.012321f, -0.039098f, 0.022132f, 0.016577f, 0.031831f, 0.073086f, 0.016027f, -0.010165f, 0.039766f, -0.023908f, 0.081513f, 0.013558f, 0.054398f, 0.025523f, 0.004592f, -0.021004f, -0.019202f, 0.134145f, 0.000370f, -0.093033f, -0.019099f, 0.073879f, -0.044775f, 0.009450f, -0.020920f, 0.032268f, 0.067590f, 0.039017f, -0.079063f, -0.005371f, -0.077858f, 0.010440f, -0.011208f, -0.046099f, -0.005964f, -0.012700f, -0.020858f, -0.000443f, -0.040201f, -0.043815f, 0.014436f, 0.016088f, -0.002787f, -0.049011f, 0.034515f, -0.043472f, -0.067441f, -0.028799f, 0.015943f, -0.016922f, -0.030463f, -0.038686f, 0.006316f, 0.015825f, -0.035511f, -0.026934f, 0.012117f, -0.015775f, -0.028841f, 0.022527f, 0.017480f, -0.002058f, -0.004347f, 0.000908f, -0.007273f, -0.011888f, -0.013109f, 0.004045f, -0.026802f, 0.014769f, -0.010184f, 0.005337f, -0.033887f, 0.036177f, 0.016840f, + -0.077599f, -0.027987f, -0.088013f, 0.014105f, 0.076030f, -0.055819f, -0.053932f, 0.051592f, 0.023046f, -0.086110f, -0.083201f, 0.027216f, 0.003527f, 0.012896f, 0.027206f, -0.002631f, -0.025567f, -0.011776f, 0.051797f, -0.036888f, 0.064154f, 0.011388f, -0.016062f, 0.014687f, 0.036706f, 0.000665f, -0.012088f, -0.068763f, -0.031373f, 0.008517f, -0.038124f, 0.032955f, 0.047189f, 0.004260f, 0.007102f, -0.048975f, 0.058497f, -0.020053f, -0.027386f, 0.049191f, -0.019454f, 0.000887f, -0.035573f, -0.002742f, -0.025265f, -0.084759f, 0.028504f, -0.008801f, 0.062727f, 0.082335f, -0.002056f, -0.013783f, -0.052556f, -0.015567f, -0.015254f, 0.078380f, -0.074646f, -0.051315f, -0.123164f, 0.003633f, -0.051500f, 0.014805f, 0.041560f, -0.022118f, -0.007256f, 0.084186f, 0.052933f, 0.038804f, 0.005695f, 0.004568f, 0.062436f, -0.067905f, -0.003875f, 0.020247f, -0.008999f, 0.038629f, 0.017286f, 0.161737f, 0.024562f, -0.043245f, -0.003370f, -0.029405f, -0.080252f, -0.030724f, 0.002047f, 0.014201f, -0.016195f, -0.015738f, -0.015937f, -0.055984f, -0.001633f, -0.003961f, -0.031026f, 0.008732f, 0.019286f, -0.047908f, + 0.002256f, -0.032284f, 0.011986f, -0.001563f, -0.012387f, -0.005858f, 0.001882f, 0.029321f, 0.015773f, 0.001961f, 0.030776f, -0.018817f, -0.005062f, -0.008603f, 0.028899f, 0.020644f, 0.013244f, 0.031360f, 0.013321f, -0.021247f, -0.011488f, -0.002933f, 0.014236f, -0.026910f, -0.008085f, 0.001540f, -0.032084f, 0.034575f, -0.009451f, 0.005503f, 0.074570f, -0.054880f, 0.019077f, -0.018994f, -0.026463f, -0.026122f, 0.112580f, -0.015358f, 0.055283f, -0.044903f, 0.076790f, -0.026947f, 0.001139f, 0.041017f, 0.044322f, 0.105504f, 0.005025f, 0.016917f, 0.015500f, -0.045388f, 0.054596f, 0.016488f, -0.032205f, 0.052802f, -0.022357f, 0.066600f, 0.051152f, -0.016379f, 0.044478f, 0.001529f, 0.041505f, 0.007816f, 0.070467f, -0.043712f, 0.035080f, -0.071979f, -0.018025f, 0.023336f, 0.076352f, -0.004010f, 0.006014f, 0.032287f, -0.000429f, -0.026495f, -0.092305f, -0.057670f, 0.015552f, -0.040302f, -0.001957f, 0.028324f, -0.080500f, 0.048322f, -0.003757f, 0.057592f, -0.028050f, -0.055482f, -0.009796f, 0.150098f, 0.033997f, -0.138261f, 0.023896f, 0.034046f, 0.008244f, 0.148518f, -0.009364f, -0.111082f, + 0.113880f, -0.039535f, -0.007740f, 0.124053f, -0.013836f, 0.081221f, 0.012849f, -0.075434f, 0.002732f, 0.126764f, -0.104813f, 0.053656f, -0.064424f, -0.073290f, 0.052986f, 0.031004f, -0.066495f, -0.025397f, -0.041513f, -0.023493f, -0.024507f, 0.010671f, -0.040970f, -0.009595f, 0.015539f, -0.042764f, -0.030342f, 0.020197f, -0.049224f, -0.013201f, 0.016530f, 0.005345f, -0.011857f, 0.035049f, -0.016458f, -0.013796f, -0.018322f, -0.034480f, 0.015308f, -0.022795f, -0.025279f, -0.007343f, 0.003494f, 0.047073f, -0.000579f, 0.012156f, -0.040995f, 0.002471f, 0.050722f, -0.011325f, -0.007010f, -0.005815f, 0.001621f, 0.001825f, 0.035068f, -0.020873f, -0.023121f, -0.012916f, -0.035440f, -0.042812f, 0.009828f, -0.022336f, -0.018215f, 0.024142f, 0.007168f, 0.015147f, -0.007117f, -0.108596f, -0.010242f, 0.019194f, -0.043124f, -0.009907f, -0.117753f, 0.075541f, 0.110896f, -0.047388f, 0.014165f, -0.083623f, -0.252164f, -0.045755f, 0.009816f, 0.129254f, 0.104903f, -0.102362f, -0.094954f, -0.091749f, -0.078944f, -0.052294f, 0.064422f, -0.009305f, 0.144121f, 0.101006f, -0.031227f, -0.118544f, -0.303741f, -0.193229f, + 0.011782f, 0.337299f, 0.253153f, 0.048919f, -0.133367f, -0.327613f, -0.339707f, -0.022386f, 0.194840f, 0.306490f, 0.331738f, 0.036610f, -0.109791f, -0.134358f, -0.183021f, -0.160895f, 0.009038f, 0.114987f, 0.208105f, 0.146815f, 0.113626f, -0.148323f, -0.186415f, -0.214520f, -0.262919f, 0.031420f, 0.310875f, 0.310494f, 0.060778f, -0.109172f, -0.295348f, -0.382616f, -0.132038f, 0.031735f, 0.141087f, 0.353114f, 0.127313f, 0.001176f, -0.195581f, -0.156431f, -0.068695f, 0.081770f, 0.135310f, 0.242945f, 0.061041f, 0.127753f, -0.012190f, -0.159792f, -0.135780f, 0.009324f, 0.153543f, 0.171516f, -0.079442f, -0.145962f, -0.183105f, -0.043739f, 0.027483f, 0.044515f, 0.025492f, -0.088861f, -0.080442f, -0.030907f, 0.055662f, 0.001439f, -0.001273f, 0.014334f, 0.044060f, 0.038784f, 0.026650f, -0.014546f, -0.112447f, -0.071918f, 0.005973f, 0.058114f, 0.102956f, 0.052269f, -0.032054f, -0.068567f, -0.094648f, -0.056569f, -0.039451f, -0.047147f, 0.103177f, 0.111526f, 0.118622f, 0.101703f, -0.049148f, -0.191860f, -0.166102f, -0.087076f, 0.071957f, 0.245075f, 0.233910f, 0.014291f, -0.151916f, -0.232529f, + -0.212849f, -0.012741f, 0.114070f, 0.110797f, 0.050650f, 0.049148f, 0.000055f, -0.061831f, -0.077953f, -0.094221f, -0.017122f, 0.089562f, 0.106166f, 0.077850f, 0.006983f, -0.072339f, -0.068864f, -0.030693f, 0.054824f, 0.040469f, -0.094020f, 0.000099f, 0.049830f, -0.040177f, 0.054983f, -0.003118f, -0.008915f, -0.004791f, 0.011878f, 0.040148f, -0.015135f, 0.047479f, 0.033896f, 0.018815f, 0.022898f, 0.015738f, -0.003179f, -0.028560f, 0.046251f, -0.001468f, 0.028623f, -0.017310f, 0.025605f, -0.009294f, -0.002490f, 0.015874f, -0.021337f, -0.024420f, 0.004520f, -0.010958f, 0.037674f, 0.035394f, -0.032110f, 0.015769f, -0.018692f, 0.021986f, 0.001549f, 0.014179f, 0.006763f, 0.018642f, -0.022535f, 0.015631f, -0.026092f, -0.012527f, -0.002677f, -0.003792f, 0.023053f, -0.042179f, -0.007084f, -0.017819f, -0.035800f, -0.003963f, -0.013391f, 0.008143f, 0.036283f, -0.011239f, -0.047624f, 0.007177f, 0.031389f, 0.058381f, -0.001448f, 0.004555f, -0.030676f, -0.024820f, 0.028642f, 0.001867f, -0.009265f, 0.000207f, 0.049360f, 0.020718f, 0.016382f, 0.025421f, 0.045591f, -0.050932f, 0.021276f, -0.009188f, + -0.073899f, -0.009337f, 0.059303f, -0.011351f, 0.052902f, -0.002883f, 0.033319f, -0.038564f, 0.024717f, -0.026405f, -0.006450f, 0.050361f, -0.013397f, 0.004153f, 0.002314f, -0.000756f, 0.019865f, -0.000605f, -0.006363f, -0.004851f, -0.000138f, -0.004114f, 0.010595f, 0.014094f, 0.022615f, 0.001913f, -0.016964f, -0.008726f, -0.022303f, 0.008385f, -0.023163f, 0.012729f, 0.011375f, -0.008042f, 0.015014f, 0.003886f, -0.024043f, -0.000070f, 0.001299f, 0.007618f, -0.042218f, 0.014745f, 0.011012f, 0.003335f, 0.000171f, -0.012499f, 0.015623f, -0.022494f, 0.023595f, -0.002197f, -0.001296f, 0.005520f, -0.009243f, 0.018320f, -0.019655f, 0.005440f, -0.010203f, 0.011327f, -0.035415f, 0.089342f, 0.151829f, 0.013827f, -0.100578f, 0.034298f, -0.008261f, 0.124534f, 0.057385f, 0.122438f, -0.012179f, -0.056945f, -0.016453f, 0.027828f, 0.050386f, 0.040854f, -0.023260f, 0.004801f, 0.020988f, 0.016645f, 0.047579f, -0.032862f, 0.007438f, -0.044620f, -0.008074f, 0.001571f, 0.011005f, 0.024666f, 0.004517f, -0.018472f, 0.036298f, -0.002452f, -0.033369f, 0.045572f, -0.008303f, -0.014974f, 0.011172f, -0.005641f, + 0.034056f, 0.056393f, 0.000701f, 0.015482f, -0.019285f, -0.010605f, 0.031398f, 0.024241f, 0.025897f, 0.006308f, -0.017460f, -0.033774f, -0.036380f, -0.037791f, 0.030478f, 0.035248f, 0.032884f, 0.051045f, 0.052913f, 0.024243f, 0.002234f, -0.045627f, 0.028066f, -0.003891f, -0.043006f, 0.053540f, -0.004420f, 0.035610f, 0.017501f, -0.051371f, 0.013978f, -0.014439f, 0.010683f, 0.036701f, 0.006102f, -0.042717f, -0.031718f, -0.024697f, -0.046545f, 0.029237f, -0.003341f, 0.049584f, -0.001005f, 0.009119f, 0.000467f, -0.024894f, -0.017317f, 0.010424f, -0.039970f, 0.013187f, -0.000886f, -0.006406f, 0.013764f, -0.020670f, 0.012894f, 0.009958f, -0.002230f, -0.017284f, 0.023918f, -0.004854f, 0.021173f, -0.035182f, -0.027318f, -0.014545f, -0.014572f, 0.018578f, -0.007685f, -0.003165f, -0.005060f, -0.016903f, -0.010328f, -0.009850f, -0.000363f, 0.035210f, 0.004131f, -0.007197f, -0.000924f, -0.018265f, 0.013972f, -0.009520f, -0.002286f, -0.006055f, 0.015716f, 0.000068f, 0.001788f, -0.001935f, -0.011969f, -0.006411f, 0.017213f, -0.004686f, 0.012243f, -0.002159f, 0.006388f, -0.009518f, -0.053184f, -0.121093f, + 0.008837f, 0.166168f, 0.221222f, 0.188692f, 0.131237f, -0.006168f, 0.008767f, -0.097091f, -0.114148f, -0.193491f, -0.145097f, -0.155473f, -0.049536f, 0.012463f, 0.051091f, 0.084140f, 0.211012f, 0.174424f, 0.118527f, 0.037571f, -0.017910f, -0.076659f, -0.055987f, -0.079680f, -0.099921f, -0.056550f, -0.056868f, -0.071408f, -0.032314f, -0.047189f, 0.010523f, 0.032311f, 0.028306f, 0.089017f, 0.083383f, 0.072812f, 0.048671f, 0.055008f, 0.035650f, 0.065998f, 0.016708f, 0.057025f, 0.003219f, -0.015643f, -0.099885f, -0.044322f, -0.120524f, -0.141477f, -0.156908f, -0.124121f, -0.092135f, -0.033480f, 0.024451f, 0.089981f, 0.097159f, 0.075496f, 0.157230f, 0.126330f, 0.136288f, 0.125044f, 0.117873f, 0.046490f, 0.076472f, -0.030977f, -0.074735f, -0.079624f, -0.185469f, -0.186572f, -0.179042f, -0.191802f, -0.157033f, -0.054469f, -0.025869f, 0.041929f, 0.107433f, 0.115754f, 0.142796f, 0.170620f, 0.153388f, 0.118470f, 0.108828f, 0.079098f, 0.030456f, -0.003486f, -0.063366f, -0.094821f, -0.094393f, -0.109013f, -0.090310f, -0.102576f, -0.105677f, -0.090315f, -0.069251f, -0.035553f, 0.004835f, 0.045835f, + 0.089948f, 0.083085f, 0.083139f, 0.096726f, 0.108123f, 0.082690f, 0.084003f, 0.036719f, -0.038395f, -0.029027f, -0.068017f, -0.087867f, -0.072290f, -0.060448f, -0.041507f, -0.053500f, -0.037737f, 0.004199f, 0.011834f, 0.018171f, 0.047854f, 0.041096f, 0.027050f, 0.006124f, 0.018475f, 0.017709f, 0.006076f, 0.022522f, -0.013589f, -0.016136f, -0.012024f, 0.008284f, -0.001895f, 0.000091f, -0.000565f, -0.003329f, -0.016467f, -0.012265f, -0.004366f, 0.016209f, 0.000568f, 0.007345f, 0.003123f, -0.009206f, -0.010371f, -0.005884f, -0.007090f, 0.002199f, 0.000226f, 0.002709f, 0.002420f, 0.003781f, -0.003543f, 0.003922f, -0.002101f, 0.000893f, 0.003518f, 0.010361f, 0.004972f, 0.012081f, 0.002176f, -0.000246f, -0.002899f, -0.002616f, -0.007664f, -0.000700f, -0.004078f, -0.002148f, -0.005874f, -0.000497f, -0.002742f, 0.001250f, -0.005372f, -0.000849f, -0.000011f, 0.003944f, -0.002503f, -0.000787f, -0.003831f, 0.002149f, 0.000222f, 0.005175f, 0.005141f, 0.007089f, 0.002282f, 0.004640f, -0.000230f, 0.000229f, -0.002216f, 0.002268f, -0.001576f, 0.001593f, -0.001423f, 0.000811f, -0.004595f, -0.003115f, + -0.008294f, -0.003965f, -0.004846f, -0.000826f, -0.003181f, 0.001460f, -0.000819f, 0.002841f, 0.000796f, 0.005867f, 0.003108f, 0.006299f, 0.003090f, 0.005757f, 0.002456f, 0.004183f, -0.000390f, 0.000378f, -0.005000f, -0.002576f, -0.005944f, -0.003434f, -0.006886f, -0.002363f, -0.004193f, 0.000562f, -0.000580f, 0.003512f, 0.000478f, 0.003931f, 0.000788f, 0.003579f, 0.000171f, 0.003046f, -0.000696f, 0.002090f, -0.001437f, 0.001356f, -0.001946f, 0.001210f, -0.001952f, 0.001245f, -0.001893f, 0.001344f, -0.001716f, 0.001531f} + }, + { + {0.019427f, 0.010215f, -0.001089f, 0.006681f, 0.001758f, 0.001468f, -0.021126f, -0.009296f, -0.010430f, 0.008184f, -0.001069f, -0.006961f, 0.007574f, 0.007676f, 0.000575f, 0.007366f, -0.003044f, -0.000332f, -0.000373f, -0.004672f, -0.002329f, -0.010265f, 0.005326f, -0.015139f, 0.006351f, -0.007936f, 0.006473f, 0.011892f, 0.005526f, -0.002363f, -0.003326f, 0.008765f, -0.001368f, 0.000326f, 0.008432f, -0.009056f, -0.000204f, -0.003121f, -0.005110f, 0.001012f, -0.001201f, 0.001768f, 0.008639f, 0.014057f, -0.004441f, 0.000166f, 0.011802f, 0.000803f, 0.003143f, -0.004417f, -0.006532f, -0.001059f, 0.002026f, -0.011190f, -0.002864f, 0.005707f, 0.000803f, 0.002001f, 0.003493f, -0.001688f, -0.003421f, -0.003377f, -0.003844f, 0.004197f, 0.003563f, -0.002144f, -0.006314f, -0.007917f, 0.003908f, -0.000029f, -0.006447f, 0.006749f, -0.001453f, -0.000555f, 0.001086f, 0.001832f, -0.003197f, 0.003995f, -0.004321f, -0.001577f, 0.005397f, -0.003805f, 0.002174f, -0.006370f, -0.004754f, -0.002413f, -0.001515f, -0.000508f, 0.000883f, -0.002635f, -0.003129f, -0.000427f, -0.001768f, 0.000597f, -0.000636f, -0.000685f, + -0.000831f, 0.000556f, 0.000217f, -0.000777f, -0.001263f, -0.000894f, -0.000453f, -0.000236f, -0.000672f, -0.000566f, -0.000962f, 0.000788f, -0.001423f, -0.001016f, 0.001169f, -0.006982f, -0.001886f, 0.000030f, -0.006564f, -0.006692f, -0.003973f, 0.015974f, -0.011210f, -0.004644f, -0.007819f, -0.014312f, 0.005364f, 0.002427f, 0.000584f, 0.012243f, 0.011641f, 0.011616f, 0.003787f, -0.002199f, 0.001829f, 0.008752f, -0.003724f, 0.003763f, 0.004461f, -0.010371f, 0.014767f, 0.002839f, 0.004613f, 0.010879f, -0.004163f, -0.010894f, 0.000763f, 0.007367f, -0.005177f, -0.002380f, -0.006912f, 0.007334f, -0.000160f, -0.000767f, -0.012034f, -0.000540f, -0.001437f, 0.007411f, 0.003824f, -0.006632f, 0.013227f, 0.004855f, 0.002776f, 0.004608f, -0.002123f, 0.007385f, -0.002853f, 0.000352f, -0.009180f, -0.011016f, 0.008851f, 0.006895f, 0.012250f, 0.001181f, 0.003327f, -0.009475f, -0.014617f, -0.007202f, -0.004365f, -0.004278f, -0.006737f, -0.005839f, 0.003051f, -0.001705f, 0.004475f, -0.005507f, -0.002076f, 0.002408f, 0.002765f, -0.001660f, 0.007487f, 0.002259f, -0.005567f, 0.011250f, -0.004383f, 0.003458f, + 0.014232f, 0.003026f, 0.001979f, -0.004405f, 0.000229f, -0.004836f, -0.005746f, -0.000932f, 0.003300f, -0.000065f, 0.000452f, 0.000178f, -0.001535f, -0.000499f, 0.000174f, -0.001416f, 0.003362f, 0.002139f, -0.001214f, -0.000302f, 0.000128f, 0.000881f, 0.000504f, -0.002205f, -0.001163f, -0.000524f, 0.000278f, 0.000997f, -0.000998f, -0.001581f, 0.001401f, -0.000806f, 0.001082f, -0.000556f, -0.000850f, -0.001091f, -0.013753f, -0.012862f, 0.007547f, 0.001692f, 0.010560f, -0.016310f, -0.002276f, -0.006498f, 0.001772f, 0.019372f, 0.011091f, -0.016982f, 0.006439f, 0.001588f, -0.007051f, -0.007890f, -0.009598f, -0.015639f, 0.000577f, 0.001851f, -0.005772f, 0.002753f, -0.003319f, 0.000576f, 0.004728f, 0.003618f, 0.010085f, -0.008829f, 0.015868f, -0.009687f, 0.009221f, 0.007281f, -0.005923f, 0.004252f, 0.000782f, 0.006566f, -0.002624f, 0.003421f, 0.006057f, 0.001997f, 0.000952f, -0.002444f, 0.004722f, 0.001392f, -0.002094f, 0.011256f, -0.014733f, 0.000993f, -0.008921f, 0.017733f, 0.006279f, -0.015521f, 0.006034f, 0.020277f, -0.019071f, -0.009121f, 0.002307f, -0.001591f, -0.007228f, 0.006027f, + -0.002528f, 0.013492f, -0.011364f, -0.001159f, -0.003755f, -0.000815f, -0.000684f, 0.013034f, -0.012115f, -0.004057f, -0.001310f, -0.012553f, 0.006754f, 0.005186f, 0.013508f, 0.005461f, 0.011501f, 0.010325f, 0.001708f, -0.004224f, 0.003258f, -0.000408f, -0.001441f, -0.003161f, -0.000296f, -0.004820f, -0.001910f, -0.001126f, -0.006685f, 0.004199f, 0.000352f, -0.004713f, -0.000794f, -0.003832f, 0.000346f, -0.000217f, 0.002565f, -0.000956f, -0.001519f, 0.000261f, -0.002159f, -0.000134f, 0.002209f, 0.000756f, -0.000500f, -0.001572f, 0.006098f, -0.009447f, 0.001160f, -0.005926f, 0.006239f, 0.002272f, -0.009600f, 0.027621f, -0.017607f, 0.005540f, 0.029832f, -0.021113f, 0.009776f, -0.000562f, 0.009710f, -0.002607f, -0.018133f, -0.003971f, 0.014847f, 0.013351f, 0.003625f, -0.000150f, 0.007476f, 0.003677f, 0.000192f, 0.006222f, 0.006197f, -0.005221f, 0.007915f, -0.002257f, 0.012523f, -0.010201f, -0.015779f, 0.003307f, -0.013790f, 0.004683f, 0.000156f, -0.003963f, -0.004487f, -0.006303f, -0.009426f, 0.001756f, 0.003175f, 0.000276f, 0.002256f, 0.002654f, -0.005864f, -0.012087f, 0.009334f, 0.002052f, + 0.001427f, -0.000658f, 0.013767f, 0.002724f, 0.005687f, 0.014607f, -0.009154f, 0.003479f, 0.000449f, 0.004348f, 0.010138f, 0.007972f, -0.013544f, -0.011827f, -0.003176f, -0.006798f, -0.001696f, 0.000385f, -0.005926f, 0.002968f, -0.010875f, 0.000425f, -0.010473f, 0.004994f, 0.004880f, -0.006075f, -0.008013f, 0.000764f, 0.004129f, 0.000687f, -0.009242f, 0.001164f, -0.005372f, 0.003780f, 0.003043f, 0.001331f, -0.001890f, -0.002667f, 0.001609f, -0.000391f, -0.001173f, -0.000190f, -0.002538f, -0.002100f, -0.006426f, -0.001679f, 0.005461f, 0.002339f, -0.001840f, -0.001272f, 0.003741f, -0.001512f, 0.000969f, -0.001909f, -0.000154f, -0.000599f, -0.000017f, -0.002417f, -0.001730f, -0.001028f, -0.000881f, -0.000987f, -0.001180f, 0.000010f, -0.000865f, -0.001607f, -0.001418f, 0.000561f, 0.002645f, 0.000860f, 0.008344f, -0.003358f, 0.007521f, -0.001121f, 0.003564f, -0.004168f, 0.000171f, -0.002612f, 0.002250f, -0.001068f, -0.017593f, 0.013444f, 0.008022f, 0.021937f, -0.014529f, 0.009197f, -0.017888f, -0.002648f, 0.010310f, 0.011923f, -0.012668f, 0.003878f, -0.014617f, 0.001414f, -0.017074f, 0.005829f, + -0.012886f, -0.015163f, -0.014267f, 0.007331f, -0.011601f, 0.000843f, -0.013541f, 0.002068f, 0.001552f, -0.001628f, -0.010017f, 0.006405f, 0.008074f, 0.005393f, 0.003554f, -0.009942f, 0.005217f, -0.010444f, -0.003802f, 0.006981f, -0.000173f, -0.001144f, -0.003298f, -0.000064f, 0.006462f, -0.007613f, -0.015751f, -0.002894f, 0.004335f, -0.002893f, -0.011782f, -0.011164f, -0.016727f, 0.004257f, -0.005107f, -0.014940f, 0.010536f, -0.009450f, -0.010010f, 0.018830f, -0.007079f, -0.003297f, 0.001111f, -0.002998f, -0.006430f, 0.001842f, -0.010544f, -0.004675f, -0.008936f, -0.006378f, -0.003206f, 0.005854f, 0.013582f, 0.001059f, 0.007999f, 0.001051f, 0.005864f, 0.004708f, 0.010890f, -0.000479f, -0.000669f, 0.001509f, 0.003762f, -0.001956f, 0.000066f, -0.000763f, 0.007845f, 0.000019f, 0.003571f, 0.000938f, 0.001169f, -0.001073f, 0.001422f, -0.004732f, 0.005113f, 0.000469f, -0.000320f, -0.003807f, -0.001484f, -0.005262f, 0.002225f, -0.002525f, 0.001468f, -0.000419f, 0.005152f, -0.002388f, 0.000666f, -0.004534f, -0.004349f, -0.000030f, -0.002144f, 0.001691f, 0.003120f, 0.001045f, 0.001348f, -0.002116f, + 0.000451f, 0.014200f, -0.020484f, 0.003634f, 0.018065f, -0.006737f, 0.019780f, 0.005427f, 0.001328f, -0.005771f, -0.013667f, -0.009104f, 0.023543f, -0.012648f, -0.000013f, -0.004401f, 0.001932f, 0.014072f, 0.012784f, -0.007725f, 0.018425f, 0.018256f, -0.008512f, -0.004543f, 0.011255f, -0.009442f, -0.008122f, -0.000616f, -0.012535f, -0.000307f, -0.003611f, 0.001615f, 0.022107f, 0.007489f, 0.001318f, -0.010085f, -0.029100f, -0.003569f, 0.016567f, 0.004030f, -0.010814f, 0.008406f, 0.013500f, 0.011670f, 0.014259f, -0.023094f, 0.004825f, 0.001136f, -0.011307f, 0.006232f, -0.010156f, 0.007370f, -0.005656f, 0.009140f, 0.020663f, 0.027113f, 0.017270f, 0.007887f, -0.011057f, -0.003065f, -0.013228f, -0.014059f, -0.002781f, 0.015925f, 0.004098f, 0.000298f, 0.003934f, -0.015493f, 0.004239f, 0.001990f, 0.000063f, -0.007807f, 0.004419f, 0.008572f, -0.008781f, -0.016882f, 0.038823f, 0.005061f, -0.006693f, 0.002459f, 0.004382f, 0.017672f, -0.003311f, 0.004926f, 0.006232f, 0.008822f, -0.005834f, -0.002884f, -0.006313f, 0.003216f, -0.001566f, 0.003540f, 0.003458f, -0.002169f, -0.003330f, 0.006662f, + 0.001138f, 0.001850f, -0.000978f, 0.004081f, -0.006516f, -0.004715f, -0.002988f, -0.001071f, 0.007833f, 0.002919f, 0.005338f, 0.003995f, 0.004254f, 0.000431f, 0.001182f, -0.001524f, -0.004449f, 0.004816f, 0.001439f, 0.002135f, -0.002994f, -0.000971f, 0.000092f, 0.002180f, 0.006219f, 0.001706f, -0.010347f, -0.003279f, -0.006241f, -0.002778f, 0.005223f, -0.006998f, 0.030722f, -0.003296f, 0.008849f, 0.021561f, 0.003126f, -0.003553f, -0.014040f, 0.007740f, -0.007467f, -0.009952f, -0.028650f, -0.013218f, 0.006058f, -0.001830f, -0.005354f, -0.021159f, 0.007522f, 0.011210f, -0.016198f, -0.008878f, -0.004188f, -0.017488f, 0.007072f, 0.000929f, -0.008881f, -0.007767f, -0.002922f, -0.023534f, -0.008075f, 0.011223f, 0.019520f, -0.014930f, -0.018090f, -0.005609f, -0.000877f, -0.015157f, -0.012021f, 0.004351f, 0.008323f, -0.016581f, 0.032782f, -0.000142f, 0.013434f, -0.007721f, 0.012629f, -0.008740f, 0.003921f, -0.023445f, -0.004711f, 0.009142f, -0.022986f, 0.006050f, -0.005077f, -0.012094f, -0.026133f, -0.000885f, 0.014729f, -0.000088f, -0.027584f, -0.004489f, 0.005175f, 0.010851f, 0.020464f, -0.007786f, + 0.009223f, 0.023449f, 0.008047f, 0.002602f, -0.010694f, -0.002352f, -0.006636f, 0.001109f, -0.007936f, 0.001540f, -0.015085f, -0.002314f, 0.011721f, 0.003020f, 0.002345f, -0.006912f, -0.011692f, 0.006232f, -0.002102f, 0.006438f, -0.002438f, 0.000575f, -0.001467f, -0.003711f, -0.003075f, 0.004068f, 0.001755f, -0.001192f, -0.001510f, -0.000175f, -0.004537f, 0.001821f, -0.004641f, -0.006162f, -0.003651f, 0.001732f, 0.000296f, -0.000306f, -0.004400f, 0.003130f, -0.000549f, -0.002616f, -0.006238f, -0.002303f, 0.000381f, 0.000478f, 0.002513f, 0.006279f, 0.002077f, 0.001185f, 0.003304f, -0.001303f, -0.000480f, -0.002083f, 0.005137f, 0.008672f, -0.002618f, -0.009324f, 0.011289f, 0.001673f, -0.016621f, -0.026801f, -0.021399f, -0.027730f, 0.023899f, -0.014633f, -0.003285f, 0.007494f, -0.025734f, -0.011054f, -0.017834f, -0.008322f, -0.005547f, 0.011481f, -0.022528f, -0.012419f, 0.007469f, 0.008736f, 0.013342f, -0.000482f, 0.000652f, -0.004341f, 0.000165f, -0.005628f, 0.003463f, -0.018327f, -0.009505f, -0.016153f, 0.011214f, 0.005183f, 0.008729f, 0.010772f, -0.021746f, -0.001871f, -0.002175f, 0.019669f, + -0.007314f, 0.005991f, 0.011058f, -0.004387f, 0.011825f, -0.007924f, 0.013161f, 0.017909f, -0.006939f, -0.001560f, 0.015803f, -0.013665f, 0.021782f, -0.009563f, -0.034190f, 0.005030f, 0.017970f, -0.007114f, 0.002220f, -0.000912f, 0.013823f, 0.016795f, -0.017199f, -0.007894f, 0.004223f, 0.011459f, -0.020263f, -0.015840f, -0.012241f, 0.024417f, -0.000427f, -0.028726f, -0.006001f, -0.012153f, 0.009860f, 0.000932f, 0.007483f, -0.011009f, 0.017702f, 0.000392f, 0.003298f, 0.004704f, -0.016078f, -0.005884f, 0.001360f, -0.002395f, -0.003940f, -0.005086f, 0.004691f, -0.004865f, -0.004239f, 0.003063f, 0.005321f, 0.002283f, -0.009395f, -0.001237f, -0.003662f, -0.003167f, 0.004092f, 0.003130f, 0.008145f, -0.001489f, -0.003805f, 0.002676f, -0.008825f, -0.001452f, 0.000059f, -0.006242f, 0.000928f, 0.000152f, -0.002091f, 0.000710f, -0.010061f, -0.002261f, -0.001100f, 0.000738f, 0.001423f, 0.003861f, -0.000423f, 0.004384f, 0.002846f, 0.002054f, 0.000440f, -0.001036f, -0.016005f, -0.006386f, 0.010889f, 0.004125f, 0.015631f, 0.005454f, 0.007621f, -0.030733f, -0.012123f, 0.012103f, -0.008163f, -0.005729f, + -0.010308f, 0.003243f, 0.016013f, 0.004302f, 0.003790f, -0.020548f, -0.007014f, -0.003671f, 0.007624f, 0.018227f, -0.022041f, 0.010482f, -0.017968f, -0.004666f, -0.016528f, 0.002228f, 0.002273f, -0.000729f, 0.006886f, -0.015299f, -0.004448f, -0.014327f, -0.005944f, 0.000382f, -0.000667f, -0.018016f, 0.010403f, 0.011773f, -0.004331f, 0.013950f, 0.027190f, 0.002920f, 0.020603f, 0.026543f, 0.002097f, 0.000994f, 0.006393f, -0.005410f, 0.008780f, 0.001936f, -0.005749f, -0.008752f, 0.033204f, -0.003299f, 0.019423f, 0.008726f, -0.009736f, -0.011194f, -0.007855f, 0.009429f, -0.007525f, 0.012209f, 0.029272f, 0.014974f, -0.003821f, 0.000639f, -0.024436f, -0.016712f, -0.014878f, 0.023169f, 0.036169f, -0.015669f, -0.000063f, -0.014482f, -0.002338f, 0.022254f, -0.006897f, -0.001159f, -0.034731f, -0.004473f, -0.006252f, -0.003506f, 0.013312f, 0.001127f, 0.002847f, 0.004219f, -0.006883f, 0.005739f, 0.003063f, 0.005138f, -0.004058f, 0.007361f, -0.003328f, -0.000592f, -0.008699f, -0.001882f, 0.007804f, -0.002624f, -0.000098f, -0.001295f, 0.007508f, -0.001663f, -0.005203f, 0.003332f, 0.003421f, 0.002092f, + 0.002730f, 0.002935f, -0.002739f, 0.000966f, 0.005367f, 0.009232f, 0.007975f, 0.005285f, 0.002913f, 0.000783f, 0.000865f, -0.005395f, -0.000323f, 0.003790f, -0.003260f, 0.003982f, -0.001072f, 0.001539f, 0.005101f, -0.001878f, 0.009142f, -0.000745f, 0.021173f, 0.057456f, 0.025521f, -0.008183f, -0.001671f, -0.011064f, 0.026970f, -0.027008f, -0.014824f, -0.041118f, -0.000130f, 0.019792f, 0.025366f, 0.004185f, -0.009593f, -0.024776f, -0.017552f, 0.017703f, -0.003317f, 0.028307f, 0.000262f, -0.009510f, 0.013855f, 0.004607f, 0.000101f, -0.007432f, 0.019034f, -0.003786f, 0.016491f, -0.000569f, -0.008450f, 0.034907f, -0.008072f, 0.013975f, 0.034971f, 0.011865f, -0.001109f, -0.017227f, -0.002835f, -0.027866f, -0.031935f, 0.006726f, 0.021035f, -0.005266f, 0.003255f, -0.035546f, -0.013044f, 0.020116f, 0.011420f, -0.009434f, 0.007107f, -0.010754f, -0.004714f, -0.016370f, -0.026653f, 0.001335f, -0.006016f, -0.019370f, -0.030815f, -0.027182f, -0.008395f, -0.024991f, 0.011726f, -0.011350f, 0.004279f, 0.002907f, 0.000172f, 0.000306f, -0.003638f, -0.005821f, 0.016356f, 0.031503f, -0.021066f, 0.003600f, + -0.008642f, 0.011213f, -0.011597f, -0.000752f, -0.008272f, -0.004181f, 0.029615f, 0.020980f, 0.005160f, -0.003566f, 0.000666f, -0.012234f, 0.004507f, 0.011643f, -0.001894f, -0.010614f, -0.005536f, 0.010049f, -0.012120f, 0.000878f, 0.005707f, 0.004738f, -0.004015f, -0.004250f, 0.004851f, 0.005362f, -0.003921f, 0.006437f, 0.004256f, 0.005297f, -0.000207f, 0.007079f, -0.000393f, 0.004386f, 0.002671f, 0.002479f, 0.002077f, -0.001866f, 0.009015f, -0.008723f, -0.000864f, 0.001604f, -0.002152f, -0.002397f, -0.003594f, 0.003599f, 0.000741f, -0.007547f, -0.002348f, 0.004537f, -0.004853f, -0.023596f, -0.027145f, 0.007208f, 0.010135f, 0.032543f, -0.027517f, 0.008953f, 0.008198f, -0.045268f, -0.002293f, 0.000567f, -0.038202f, -0.020464f, -0.013622f, 0.009959f, -0.003210f, 0.002562f, -0.010896f, 0.016290f, 0.025038f, 0.013556f, -0.003740f, -0.038326f, -0.016968f, -0.020704f, 0.007688f, 0.002659f, -0.017083f, -0.001019f, 0.013155f, -0.010940f, 0.022836f, -0.020404f, -0.000754f, -0.011764f, -0.038728f, 0.006895f, -0.016562f, -0.018212f, 0.014239f, 0.021632f, -0.024047f, 0.009574f, 0.028097f, -0.008897f, + 0.012242f, 0.010005f, -0.006742f, 0.004171f, -0.031457f, 0.047760f, 0.018552f, 0.011564f, 0.045181f, -0.054950f, -0.004262f, -0.007315f, 0.005749f, 0.022899f, 0.023321f, 0.009343f, 0.011064f, 0.029312f, -0.002877f, -0.019342f, -0.034310f, 0.013590f, -0.013046f, 0.001628f, 0.009140f, -0.006487f, 0.013868f, 0.037470f, -0.023013f, 0.017654f, -0.011214f, -0.010277f, 0.027955f, 0.002485f, 0.008643f, 0.027582f, 0.022356f, -0.009525f, -0.011491f, -0.023595f, -0.006158f, 0.000485f, 0.012381f, 0.013470f, -0.000077f, 0.003482f, 0.001777f, -0.000099f, 0.002508f, 0.003398f, 0.000907f, 0.007785f, -0.003800f, 0.001502f, 0.005221f, 0.003351f, 0.001452f, -0.002921f, 0.007064f, 0.005072f, 0.000992f, -0.003671f, -0.005826f, -0.013161f, 0.008014f, -0.000124f, -0.001324f, 0.004535f, -0.006607f, -0.000353f, 0.004446f, 0.006667f, 0.009296f, 0.005725f, 0.002499f, 0.003038f, -0.000179f, 0.003302f, 0.006913f, 0.029593f, 0.034920f, 0.008657f, 0.021553f, -0.014070f, 0.010167f, 0.009795f, -0.057213f, 0.016119f, 0.018577f, 0.003833f, -0.018219f, -0.000506f, -0.035318f, 0.041487f, 0.025056f, -0.013155f, + -0.013982f, -0.020761f, -0.010795f, 0.029987f, -0.030454f, -0.017541f, -0.004575f, -0.005182f, -0.006577f, 0.004282f, -0.020181f, -0.020675f, -0.012142f, -0.015950f, -0.004311f, -0.020719f, -0.002871f, -0.013940f, -0.045284f, -0.028985f, -0.011204f, -0.007290f, 0.006293f, 0.007457f, -0.000283f, 0.001225f, 0.013079f, 0.006204f, 0.006680f, 0.031752f, 0.006621f, 0.010661f, 0.019839f, 0.042680f, 0.036538f, 0.001826f, -0.014511f, -0.028178f, 0.025519f, -0.006391f, 0.069022f, 0.013839f, 0.030917f, -0.003485f, 0.003893f, -0.027549f, -0.001143f, 0.023857f, 0.013798f, 0.018058f, -0.020798f, -0.013821f, -0.026714f, -0.050694f, 0.029144f, -0.044753f, -0.005515f, 0.058761f, 0.003863f, 0.023483f, 0.011175f, 0.017243f, 0.000458f, -0.031897f, 0.030832f, -0.000641f, -0.027994f, -0.025094f, 0.000839f, 0.009615f, 0.020706f, 0.005463f, -0.024566f, 0.001172f, -0.004950f, 0.004851f, -0.009734f, -0.008144f, 0.004235f, 0.003827f, -0.007690f, 0.000625f, -0.002558f, -0.000817f, -0.010106f, -0.003783f, -0.003306f, 0.004525f, -0.002785f, -0.006236f, 0.007887f, -0.005057f, -0.002098f, -0.014274f, -0.015136f, -0.000082f, + 0.000215f, -0.006310f, -0.004077f, 0.004792f, 0.003530f, -0.006409f, -0.010192f, -0.000740f, -0.010592f, 0.006132f, -0.040459f, 0.011631f, 0.015838f, -0.027862f, -0.020761f, -0.000017f, 0.017334f, 0.039526f, -0.001607f, -0.031262f, -0.030665f, -0.002082f, -0.017163f, 0.004770f, 0.006104f, -0.034854f, -0.029246f, -0.056662f, -0.016171f, -0.016755f, -0.037835f, -0.026386f, 0.000181f, -0.018252f, -0.010747f, -0.010531f, -0.002695f, -0.038283f, -0.019865f, -0.023714f, -0.011082f, 0.011196f, -0.031743f, 0.001937f, 0.027224f, 0.031416f, -0.007045f, 0.008249f, 0.018682f, -0.032026f, 0.018271f, -0.014143f, 0.028495f, -0.014063f, 0.003001f, -0.015120f, -0.002746f, 0.055218f, -0.011006f, 0.020479f, -0.040267f, -0.007229f, 0.000419f, -0.039124f, 0.036512f, 0.000879f, -0.012759f, 0.025380f, -0.010149f, 0.006152f, 0.051603f, -0.020801f, -0.027544f, 0.018770f, -0.004880f, -0.057973f, 0.023818f, -0.076688f, -0.040422f, 0.030042f, 0.024325f, 0.004376f, 0.016620f, -0.000431f, 0.000065f, -0.057986f, -0.030416f, -0.014059f, 0.005733f, -0.033187f, 0.008520f, 0.004005f, 0.013958f, -0.021857f, 0.001758f, 0.015951f, + 0.013011f, 0.008945f, 0.001585f, 0.007268f, -0.018223f, -0.012510f, -0.012140f, -0.004068f, -0.002110f, -0.002199f, 0.015585f, -0.008292f, 0.008413f, 0.014534f, -0.006930f, 0.004116f, -0.011499f, -0.009675f, -0.000076f, 0.003339f, -0.010281f, 0.004179f, -0.013010f, 0.011297f, -0.004263f, -0.002924f, 0.001008f, 0.010082f, -0.002855f, 0.003703f, -0.008989f, 0.007966f, 0.006945f, 0.019092f, 0.005124f, 0.015587f, -0.015417f, -0.005875f, -0.018435f, -0.005884f, -0.009806f, -0.009525f, 0.077267f, 0.042241f, 0.000113f, -0.039799f, 0.020479f, -0.041498f, -0.033672f, 0.006094f, 0.034353f, 0.067767f, -0.010616f, 0.034246f, -0.012204f, 0.024302f, 0.041153f, 0.022955f, 0.026323f, 0.014060f, -0.007643f, -0.033662f, -0.034750f, -0.010558f, -0.032837f, -0.009700f, -0.005987f, -0.007426f, 0.026349f, -0.004501f, -0.067511f, 0.003946f, 0.016352f, 0.015591f, 0.040468f, -0.004188f, -0.080577f, 0.045838f, -0.036031f, 0.011792f, -0.007844f, 0.027118f, 0.039560f, -0.043975f, -0.003029f, -0.021977f, -0.038283f, 0.027743f, -0.019015f, -0.047216f, 0.018579f, 0.027569f, 0.045434f, 0.012015f, -0.007025f, 0.004962f, + 0.037208f, -0.029899f, 0.058707f, -0.018438f, -0.016293f, -0.005275f, 0.035796f, -0.037177f, 0.003479f, 0.004546f, -0.103439f, -0.015339f, 0.032096f, -0.014890f, 0.005431f, 0.014384f, 0.007575f, -0.005065f, 0.008486f, 0.035512f, 0.042463f, -0.033555f, 0.012177f, -0.024574f, -0.004126f, 0.041984f, -0.000824f, -0.004346f, 0.001624f, -0.002813f, -0.021680f, 0.006018f, 0.001533f, -0.012674f, -0.032141f, 0.000462f, -0.007618f, 0.009881f, -0.014798f, -0.013878f, -0.017420f, 0.014872f, 0.003515f, 0.009134f, 0.007402f, 0.000658f, 0.005491f, -0.007095f, -0.014661f, 0.022613f, -0.002167f, -0.010889f, -0.000242f, -0.007833f, -0.004832f, -0.009049f, 0.001269f, 0.002840f, -0.001211f, 0.006317f, 0.016562f, -0.000554f, -0.003876f, -0.006646f, 0.001626f, -0.008278f, -0.004602f, 0.009482f, -0.007055f, -0.005908f, -0.008661f, -0.021665f, -0.012023f, 0.003116f, 0.014242f, -0.011276f, -0.003199f, 0.044431f, 0.029176f, -0.082107f, -0.046962f, 0.056527f, 0.065130f, -0.034938f, -0.012084f, -0.092421f, -0.051367f, 0.013503f, -0.004392f, 0.012477f, -0.049410f, -0.030679f, -0.033927f, 0.050127f, 0.074050f, -0.003455f, + 0.019844f, -0.011934f, -0.006707f, -0.000792f, 0.016847f, 0.032325f, 0.007623f, -0.011311f, -0.006367f, -0.007410f, -0.044564f, -0.025013f, -0.045306f, -0.005858f, 0.013724f, -0.018822f, 0.027606f, -0.020471f, -0.007937f, 0.043308f, -0.021151f, 0.024395f, 0.016640f, -0.007792f, -0.041814f, -0.029983f, -0.025022f, 0.007614f, 0.077525f, 0.013805f, 0.041577f, 0.049392f, 0.038336f, 0.028667f, 0.025322f, -0.042787f, 0.000788f, -0.006913f, 0.057314f, 0.027456f, 0.033418f, 0.060197f, -0.029752f, -0.040321f, 0.014588f, 0.050928f, -0.086379f, -0.001452f, 0.006614f, 0.040162f, -0.069908f, -0.104864f, -0.018931f, 0.029517f, 0.007086f, 0.012001f, 0.032649f, 0.002206f, -0.023542f, -0.034352f, 0.000881f, 0.004837f, 0.006549f, 0.031885f, 0.046840f, 0.022390f, 0.003224f, 0.000274f, -0.000789f, 0.003995f, 0.004459f, -0.011782f, 0.017097f, 0.002283f, -0.016181f, -0.027862f, 0.003175f, -0.011807f, 0.005711f, 0.003176f, -0.002824f, 0.001902f, -0.011896f, 0.012180f, -0.006532f, 0.008223f, -0.012777f, -0.007924f, -0.022551f, -0.021790f, 0.000715f, 0.011695f, -0.010170f, 0.023272f, 0.000282f, 0.007044f, + -0.007317f, 0.024874f, 0.001713f, 0.011497f, -0.012588f, -0.006503f, -0.004267f, -0.004286f, -0.015720f, -0.002649f, 0.016302f, -0.028477f, 0.021841f, -0.000796f, -0.021498f, -0.037113f, 0.013725f, -0.017943f, -0.036873f, 0.026548f, 0.050262f, 0.015744f, -0.019572f, 0.030252f, 0.050555f, 0.019002f, 0.010295f, 0.003792f, -0.005810f, 0.024082f, -0.042548f, 0.002701f, -0.061126f, 0.032765f, -0.049362f, -0.003969f, 0.026342f, 0.014794f, -0.028218f, 0.006085f, -0.032630f, 0.066775f, 0.008498f, 0.021757f, 0.034605f, 0.073639f, -0.030476f, 0.024004f, -0.035299f, 0.012835f, 0.026314f, 0.059212f, 0.013826f, -0.011895f, 0.060440f, 0.008294f, -0.004369f, -0.034744f, 0.002191f, 0.038059f, -0.012966f, 0.036581f, -0.045027f, 0.069301f, 0.071657f, -0.086198f, -0.002374f, -0.005364f, 0.018727f, -0.014627f, -0.011448f, 0.037188f, -0.031455f, -0.091986f, 0.000964f, 0.081903f, -0.064721f, 0.032477f, -0.015081f, -0.008146f, -0.039496f, 0.090390f, -0.006007f, 0.014987f, 0.008130f, -0.060747f, 0.078515f, 0.006174f, 0.069800f, -0.138460f, 0.012996f, -0.013015f, -0.041966f, -0.011215f, 0.024106f, -0.032253f, + 0.021447f, -0.029078f, -0.019589f, -0.038274f, 0.048032f, -0.018579f, 0.003042f, -0.040828f, 0.001497f, -0.030014f, -0.010503f, 0.013864f, -0.020962f, 0.009586f, 0.000984f, -0.027733f, 0.024675f, -0.011426f, 0.003253f, -0.011928f, 0.022347f, -0.017169f, 0.003216f, 0.001459f, -0.006676f, 0.029913f, -0.017725f, -0.021184f, -0.012560f, -0.023736f, -0.033230f, -0.016662f, 0.002778f, 0.001870f, -0.024056f, -0.013619f, -0.016303f, -0.023091f, -0.018535f, 0.007696f, 0.004900f, -0.000949f, -0.010134f, 0.057808f, 0.007475f, -0.045155f, 0.005056f, -0.091303f, -0.020233f, 0.004074f, -0.017112f, -0.072885f, -0.007546f, -0.048019f, -0.011338f, 0.043078f, 0.010571f, 0.056634f, 0.024168f, 0.021062f, 0.013847f, -0.020002f, 0.046274f, -0.023763f, -0.000029f, 0.021151f, 0.010395f, -0.028588f, 0.023179f, 0.008820f, 0.054673f, 0.021838f, -0.009347f, 0.032318f, -0.025696f, 0.043812f, 0.015588f, -0.049143f, -0.049727f, 0.025434f, 0.032909f, 0.013069f, 0.005648f, -0.024099f, -0.031712f, 0.009349f, -0.031203f, -0.048095f, -0.014300f, -0.008493f, -0.043479f, -0.016728f, 0.016698f, -0.030408f, -0.049084f, 0.013504f, + 0.018607f, 0.001303f, -0.005767f, -0.003301f, -0.008110f, 0.017318f, 0.084376f, 0.016736f, -0.002478f, -0.003602f, -0.029456f, -0.048391f, -0.021036f, 0.068840f, 0.074626f, 0.037728f, 0.007314f, 0.067131f, 0.032711f, -0.015650f, -0.093679f, -0.071987f, -0.058721f, -0.112557f, -0.065145f, 0.015521f, 0.091382f, -0.040741f, 0.031060f, -0.045506f, 0.014991f, -0.004034f, 0.031538f, -0.014965f, -0.005075f, -0.040621f, -0.022923f, -0.010125f, -0.035734f, 0.045604f, -0.006955f, -0.024194f, -0.011154f, 0.004480f, -0.025802f, 0.018404f, 0.013937f, 0.029468f, 0.007026f, 0.008188f, -0.028994f, -0.034280f, -0.003759f, -0.025355f, -0.015689f, -0.029513f, -0.042107f, 0.002090f, -0.010862f, 0.002530f, 0.003246f, 0.032313f, 0.032593f, -0.012160f, -0.006251f, -0.014427f, 0.031495f, 0.020682f, 0.013810f, 0.004823f, -0.006179f, 0.017869f, -0.024566f, -0.009893f, -0.003832f, -0.028362f, -0.054722f, 0.028849f, -0.000808f, -0.017633f, -0.016975f, -0.010125f, -0.007626f, 0.020496f, 0.039186f, -0.016951f, 0.050418f, -0.057736f, 0.046594f, -0.006209f, 0.062121f, -0.040460f, 0.035938f, -0.059518f, 0.051667f, -0.048171f, + -0.020082f, 0.071398f, 0.016644f, 0.057275f, 0.082436f, 0.008106f, -0.006573f, -0.034719f, -0.002691f, 0.051922f, 0.013222f, -0.018895f, -0.057864f, 0.004583f, 0.011483f, 0.026995f, 0.016759f, 0.022407f, 0.014251f, -0.034166f, -0.053864f, -0.023248f, 0.052206f, 0.019613f, 0.166504f, -0.053272f, -0.044467f, 0.053903f, 0.085484f, 0.017544f, -0.001447f, 0.022093f, 0.005669f, 0.027051f, -0.025114f, 0.009517f, 0.039967f, 0.043756f, 0.029483f, 0.128819f, -0.016397f, -0.017078f, -0.008391f, 0.066277f, 0.039864f, -0.034187f, 0.034933f, -0.001120f, 0.011401f, -0.028216f, 0.059179f, -0.059406f, 0.004124f, 0.090860f, -0.067179f, 0.195520f, -0.089932f, 0.093379f, 0.085994f, -0.084792f, -0.077170f, 0.086808f, 0.003760f, -0.050640f, -0.021271f, 0.047811f, -0.132281f, 0.020421f, -0.015555f, -0.085459f, 0.055744f, -0.066968f, 0.005294f, 0.004727f, -0.026863f, -0.066090f, 0.017881f, -0.005316f, -0.002944f, 0.012480f, -0.013588f, -0.021930f, 0.011821f, 0.027444f, -0.010474f, 0.004022f, 0.021488f, -0.020318f, 0.029900f, 0.022861f, -0.047621f, 0.006657f, -0.026746f, 0.011965f, -0.001885f, 0.003693f, + -0.024366f, 0.009944f, 0.006384f, -0.000319f, -0.012220f, 0.036630f, 0.008317f, -0.001539f, 0.035162f, -0.025056f, -0.022700f, 0.003565f, 0.015182f, 0.003599f, 0.016916f, 0.008534f, -0.049021f, -0.025613f, 0.012645f, -0.029015f, 0.042192f, -0.019172f, -0.023952f, -0.001150f, -0.016586f, 0.033404f, 0.042554f, -0.100251f, -0.042999f, 0.062053f, -0.130095f, -0.080057f, -0.054542f, 0.091175f, 0.193309f, 0.053886f, -0.152049f, -0.033886f, -0.155332f, -0.080594f, 0.126254f, 0.075946f, 0.118688f, 0.065757f, -0.090134f, -0.142341f, -0.108976f, -0.025719f, 0.064207f, 0.073582f, 0.043854f, 0.025078f, -0.037919f, -0.155629f, -0.187843f, -0.040230f, 0.143466f, 0.256587f, 0.173502f, -0.032343f, -0.120410f, -0.172091f, -0.128180f, -0.103100f, -0.000136f, 0.041748f, 0.139690f, 0.149780f, -0.081132f, -0.050232f, -0.188102f, -0.174239f, -0.063070f, 0.017628f, 0.181085f, 0.268177f, 0.118569f, -0.078644f, -0.280894f, -0.207614f, -0.152870f, 0.074117f, 0.159539f, 0.100134f, 0.062852f, 0.054070f, -0.167709f, -0.030363f, -0.095755f, 0.035891f, -0.013513f, 0.099569f, 0.155592f, 0.124152f, -0.145790f, -0.293143f, + -0.220931f, 0.024891f, 0.171318f, -0.003835f, 0.237667f, 0.010310f, -0.061552f, -0.071183f, -0.052851f, 0.001088f, 0.171631f, 0.148791f, 0.026960f, -0.058659f, -0.021411f, -0.010470f, 0.089935f, 0.099987f, 0.011652f, 0.004750f, -0.015830f, -0.002217f, -0.019435f, -0.023861f, -0.016333f, -0.008409f, 0.034232f, 0.054271f, 0.043774f, -0.064533f, -0.073960f, -0.027954f, -0.030843f, -0.028746f, 0.066802f, 0.055277f, 0.070263f, 0.021175f, -0.030599f, -0.052570f, -0.102866f, -0.064906f, 0.042707f, 0.090984f, 0.136834f, 0.094399f, 0.007503f, -0.211063f, -0.186291f, -0.062901f, 0.076061f, 0.119428f, 0.158705f, 0.120399f, -0.009724f, -0.119834f, -0.177611f, -0.170624f, -0.031564f, 0.186670f, 0.192381f, 0.098467f, -0.046805f, -0.128201f, -0.090127f, -0.059877f, 0.005013f, 0.039021f, 0.050798f, 0.045708f, 0.027489f, 0.002397f, -0.029243f, -0.035806f, -0.037281f, -0.029599f, -0.034509f, 0.068625f, 0.021383f, -0.055591f, -0.052454f, 0.000162f, -0.084514f, -0.010451f, 0.012521f, 0.009667f, -0.007349f, 0.002111f, -0.028422f, -0.003545f, -0.003340f, 0.014582f, -0.009807f, 0.038955f, -0.010343f, -0.007500f, + -0.010879f, -0.012233f, 0.024284f, 0.006949f, -0.011716f, 0.037729f, 0.002387f, -0.067072f, -0.033493f, 0.018476f, 0.032823f, -0.011171f, 0.003999f, 0.045964f, -0.001134f, 0.006275f, -0.037599f, -0.016792f, 0.011575f, -0.008171f, -0.008357f, -0.004989f, 0.030407f, 0.011013f, -0.011909f, -0.035976f, -0.014331f, -0.002107f, -0.032816f, 0.003145f, -0.037480f, -0.025077f, -0.017445f, -0.033301f, 0.052214f, -0.009403f, -0.023633f, 0.022096f, -0.000367f, -0.051319f, -0.003008f, 0.051281f, 0.041577f, -0.023814f, 0.032191f, 0.005428f, 0.030712f, -0.034271f, -0.050573f, 0.019407f, 0.022285f, 0.019664f, 0.017006f, -0.019071f, 0.018772f, -0.037694f, 0.025533f, -0.051426f, -0.045305f, 0.033491f, -0.026515f, 0.022868f, 0.031318f, 0.002317f, -0.024246f, 0.007834f, 0.008842f, -0.002001f, -0.002005f, -0.000783f, 0.020393f, -0.017086f, 0.013235f, -0.017856f, 0.023905f, -0.020901f, -0.011451f, 0.008865f, -0.007277f, -0.000703f, 0.009427f, 0.002344f, 0.006287f, 0.018510f, -0.014754f, -0.008671f, 0.010532f, 0.006427f, 0.021038f, -0.017036f, 0.005815f, -0.001981f, -0.013227f, -0.013155f, 0.005368f, 0.003485f, + -0.013090f, -0.019295f, 0.005540f, 0.000362f, -0.003694f, 0.012492f, -0.018608f, 0.021584f, 0.006361f, -0.018435f, -0.020751f, 0.017416f, -0.029138f, 0.020044f, -0.003345f, 0.013935f, -0.001572f, 0.004895f, 0.026008f, -0.041419f, 0.082820f, 0.126058f, -0.016353f, -0.046771f, -0.039953f, 0.116222f, 0.052725f, 0.112480f, 0.060862f, 0.000085f, -0.052115f, -0.011743f, 0.028884f, 0.052800f, 0.025462f, -0.024557f, -0.005868f, 0.025200f, 0.037400f, 0.004550f, 0.008527f, -0.026103f, 0.004924f, -0.012631f, 0.017143f, 0.018976f, 0.049432f, 0.042375f, -0.022363f, 0.003635f, -0.025122f, 0.006545f, 0.022656f, 0.033528f, 0.002666f, -0.016020f, 0.000121f, -0.028909f, 0.024273f, -0.006697f, 0.010121f, 0.022456f, 0.000651f, 0.029927f, -0.014575f, -0.008256f, -0.006836f, -0.030859f, -0.018291f, -0.047047f, -0.008720f, -0.053641f, 0.003845f, -0.018472f, 0.044298f, 0.006531f, 0.013172f, -0.041478f, 0.017697f, 0.000276f, -0.018268f, 0.030372f, -0.016220f, -0.008552f, 0.007725f, 0.020082f, -0.002246f, -0.011029f, 0.068510f, 0.022225f, 0.015977f, 0.025657f, -0.018327f, -0.000916f, -0.005995f, 0.035723f, + 0.049826f, 0.047700f, -0.028283f, -0.031119f, -0.004067f, -0.012376f, 0.012660f, 0.032153f, 0.033582f, 0.001480f, 0.018903f, -0.002239f, -0.004925f, 0.010939f, 0.021483f, -0.002026f, 0.016921f, -0.014009f, 0.003213f, 0.000253f, 0.006024f, -0.004805f, 0.018929f, 0.010898f, -0.001796f, -0.005237f, 0.005861f, 0.003323f, 0.020570f, 0.001154f, -0.011867f, -0.013086f, -0.007334f, 0.005751f, 0.007128f, 0.013070f, -0.015667f, 0.002215f, -0.004156f, 0.010504f, -0.007590f, 0.014819f, -0.004817f, 0.005538f, -0.008136f, -0.006914f, 0.004896f, -0.012912f, 0.000266f, 0.014310f, 0.003783f, -0.005887f, 0.001535f, -0.000695f, -0.046905f, -0.102486f, -0.013596f, 0.134906f, 0.208533f, 0.174672f, 0.138414f, -0.009527f, 0.016457f, -0.101717f, -0.114910f, -0.187894f, -0.107842f, -0.118412f, -0.037019f, 0.014666f, 0.081935f, 0.057981f, 0.178132f, 0.154712f, 0.051383f, 0.010623f, -0.027403f, -0.060654f, -0.095394f, -0.035202f, -0.097788f, -0.026300f, -0.047477f, -0.031028f, -0.022659f, 0.004979f, 0.001888f, 0.033051f, 0.048294f, 0.072913f, 0.079409f, 0.094911f, 0.082286f, -0.010063f, 0.008188f, -0.001195f, + 0.015622f, -0.047256f, 0.019225f, -0.050496f, -0.125619f, -0.061950f, -0.093977f, -0.158421f, -0.046193f, -0.013933f, -0.063926f, 0.021544f, 0.048854f, 0.110323f, 0.130415f, 0.192050f, 0.121578f, 0.098777f, 0.098530f, 0.061015f, -0.018856f, 0.009830f, -0.096791f, -0.083700f, -0.140264f, -0.167117f, -0.192626f, -0.140553f, -0.108002f, -0.011431f, -0.005057f, 0.015142f, 0.056523f, 0.095225f, 0.171981f, 0.169762f, 0.169337f, 0.135498f, 0.058346f, 0.087370f, 0.013904f, -0.044086f, -0.066006f, -0.156601f, -0.142113f, -0.126146f, -0.108505f, -0.087166f, -0.052461f, -0.032096f, -0.010750f, 0.007683f, 0.052847f, 0.062342f, 0.082514f, 0.068055f, 0.097778f, 0.088224f, 0.058003f, 0.066473f, 0.044943f, -0.012324f, -0.036020f, -0.041903f, -0.099415f, -0.086487f, -0.077596f, -0.058411f, -0.031600f, -0.001340f, -0.003698f, 0.025292f, 0.039310f, 0.030332f, 0.036474f, 0.023054f, 0.007417f, -0.000919f, 0.010654f, 0.002325f, -0.012089f, 0.012976f, 0.015937f, 0.000962f, 0.008612f, -0.002544f, -0.003454f, 0.001318f, 0.005980f, -0.000388f, -0.013427f, -0.018121f, -0.017538f, -0.020538f, -0.013740f, -0.004273f, + -0.004662f, 0.005801f, 0.002402f, 0.001595f, 0.006909f, 0.007789f, 0.006344f, 0.008419f, 0.013374f, 0.011268f, 0.006456f, 0.007690f, 0.002649f, -0.002907f, -0.000917f, -0.003652f, -0.005428f, -0.002702f, -0.004893f, -0.004704f, -0.005693f, -0.007191f, -0.007834f, -0.007572f, -0.004256f, 0.000002f, 0.000387f, 0.004184f, 0.004315f, 0.003170f, 0.002391f, 0.004080f, 0.004106f, 0.006801f, 0.004584f, 0.005720f, 0.002943f, -0.001300f, -0.003127f, -0.001244f, -0.003891f, -0.000553f, -0.000213f, -0.001755f, -0.001041f, -0.001304f, -0.003832f, -0.002874f, -0.002472f, -0.001013f, -0.001233f, -0.000159f, -0.000265f, 0.000284f, -0.001185f, -0.001263f, -0.001965f, 0.001511f, 0.002344f, 0.005689f, 0.005652f, 0.006491f, 0.004713f, 0.003245f, 0.001212f, 0.000000f, -0.001775f, -0.002073f, -0.004845f, -0.004309f, -0.005040f, -0.004356f, -0.004968f, -0.002965f, -0.002037f, 0.000003f, 0.000146f, 0.002091f, 0.001689f, 0.003952f, 0.003958f, 0.004591f, 0.003398f, 0.004016f, 0.002060f, 0.001541f, -0.000661f, -0.001021f, -0.002601f, -0.002083f, -0.002783f, -0.001567f, -0.002155f, -0.000647f, -0.001162f, 0.000123f, + -0.000542f, 0.000607f, -0.000222f, 0.000725f, -0.000299f, 0.000542f}, + {0.013874f, 0.005147f, -0.006824f, -0.001265f, 0.004893f, -0.000939f, 0.005201f, -0.012703f, -0.008904f, -0.002291f, -0.010533f, 0.004367f, -0.002276f, -0.001257f, -0.007087f, -0.003286f, 0.006765f, 0.006583f, -0.002523f, -0.002115f, -0.004337f, -0.010278f, 0.011458f, 0.006679f, 0.000383f, 0.001114f, -0.000533f, 0.000250f, 0.009246f, -0.004721f, 0.001771f, -0.014724f, -0.011917f, -0.003084f, 0.001179f, -0.010283f, -0.001806f, 0.003552f, 0.000968f, 0.000108f, -0.005034f, -0.004016f, 0.009668f, -0.004510f, -0.003996f, -0.001420f, -0.001262f, 0.004148f, -0.002125f, -0.006346f, -0.000133f, 0.005432f, -0.007750f, 0.000269f, -0.008307f, 0.000521f, -0.006060f, 0.009253f, -0.000442f, -0.009892f, -0.001342f, -0.001021f, 0.001259f, -0.014094f, -0.001609f, 0.001102f, -0.009291f, 0.004252f, 0.000289f, -0.010871f, 0.005004f, 0.006583f, -0.005681f, -0.006682f, -0.011792f, 0.006160f, 0.003677f, 0.010962f, 0.005523f, -0.001698f, 0.002226f, -0.001588f, 0.003425f, 0.003447f, 0.007688f, 0.001880f, -0.003232f, -0.000173f, 0.000973f, -0.000303f, 0.004427f, 0.001074f, -0.001417f, -0.002165f, 0.002195f, 0.001639f, + 0.003338f, 0.001578f, 0.001346f, 0.001903f, 0.001850f, 0.000683f, 0.001177f, -0.000252f, -0.000482f, 0.000651f, 0.000541f, 0.000785f, -0.000381f, 0.000935f, -0.001245f, -0.000034f, -0.010266f, 0.004666f, -0.012789f, -0.003501f, -0.001837f, -0.006392f, 0.006076f, 0.014289f, -0.005884f, -0.001860f, 0.000614f, -0.005857f, 0.004037f, -0.000854f, -0.004852f, -0.008107f, -0.004387f, 0.012886f, 0.012351f, 0.007007f, 0.014357f, 0.008516f, 0.004527f, 0.013605f, -0.008499f, 0.003014f, 0.005744f, -0.000245f, 0.002278f, -0.004012f, 0.002540f, -0.018769f, 0.000338f, -0.001074f, 0.006722f, -0.004238f, -0.002453f, -0.001296f, 0.005133f, -0.005935f, -0.001026f, 0.001704f, 0.003594f, 0.003575f, -0.001067f, -0.006370f, 0.001140f, 0.002242f, 0.004534f, 0.003482f, 0.005283f, -0.005991f, -0.003632f, -0.001092f, -0.010712f, -0.001254f, 0.002755f, 0.009151f, 0.010142f, -0.001397f, 0.005560f, 0.004197f, -0.000836f, 0.003795f, 0.004447f, 0.006603f, -0.002722f, -0.000088f, -0.005024f, 0.000855f, -0.004340f, 0.002934f, -0.006390f, -0.005966f, 0.003502f, -0.000039f, -0.011871f, -0.001107f, -0.008911f, -0.002399f, + -0.001336f, -0.001494f, -0.011805f, 0.001128f, 0.004054f, -0.003461f, -0.003430f, 0.002022f, 0.001395f, 0.000848f, -0.002409f, -0.006303f, -0.000414f, -0.002762f, 0.002304f, 0.000086f, 0.000077f, -0.000706f, -0.002698f, -0.002893f, -0.003367f, 0.000232f, -0.001512f, 0.001420f, -0.002148f, 0.000811f, 0.000395f, -0.001871f, -0.000140f, -0.002084f, -0.000853f, 0.000121f, -0.000091f, -0.001854f, -0.000552f, -0.000315f, -0.012972f, -0.012075f, 0.004441f, -0.001349f, 0.010020f, 0.010232f, 0.000763f, 0.000321f, 0.019452f, -0.005204f, -0.000534f, 0.016478f, 0.000611f, -0.009407f, -0.013954f, 0.010154f, -0.004128f, 0.000139f, -0.008664f, 0.002744f, -0.006205f, 0.006923f, 0.030430f, -0.011054f, -0.009016f, -0.010918f, -0.011953f, 0.002252f, -0.009756f, -0.023946f, -0.000657f, 0.002487f, 0.000009f, -0.009473f, -0.002058f, 0.007884f, -0.009858f, -0.005708f, 0.014206f, 0.004773f, -0.003671f, -0.003316f, 0.009135f, -0.004470f, 0.006530f, 0.006085f, -0.013045f, -0.008545f, -0.007738f, 0.008594f, -0.006631f, -0.003840f, -0.003618f, -0.004246f, -0.000711f, -0.008686f, 0.000046f, -0.002562f, 0.002144f, -0.001127f, + -0.019076f, 0.008924f, -0.010674f, 0.008493f, 0.001553f, -0.015572f, 0.003165f, 0.010553f, 0.003215f, 0.017516f, -0.007383f, 0.001041f, 0.002029f, 0.004163f, 0.006233f, -0.006792f, 0.002602f, 0.002383f, -0.010135f, 0.013974f, 0.000999f, -0.001888f, 0.005899f, -0.001913f, 0.002646f, -0.002457f, -0.005288f, -0.000287f, -0.003402f, 0.004644f, -0.001179f, 0.000948f, 0.005427f, 0.001957f, 0.002073f, -0.001122f, 0.002960f, 0.000607f, -0.000783f, 0.002030f, 0.003955f, -0.002766f, 0.000271f, -0.002922f, 0.001895f, -0.000894f, 0.005866f, -0.008182f, 0.003902f, 0.004013f, -0.004261f, 0.001890f, -0.002050f, -0.017583f, 0.005496f, 0.016342f, 0.013779f, 0.015321f, 0.002806f, -0.003402f, -0.013116f, -0.007012f, -0.006108f, -0.005066f, 0.013777f, 0.018913f, 0.001471f, -0.001364f, 0.013643f, -0.022035f, 0.000532f, -0.001834f, -0.000296f, -0.007219f, -0.007291f, 0.007949f, 0.009977f, 0.000269f, -0.002103f, 0.003899f, -0.010591f, -0.008135f, 0.008268f, -0.008961f, 0.017139f, 0.015410f, 0.002665f, 0.009472f, 0.008118f, 0.001585f, -0.006907f, 0.002376f, -0.000307f, -0.012091f, 0.011757f, -0.001083f, + 0.005533f, 0.009462f, -0.011244f, -0.004436f, -0.013375f, -0.003084f, 0.003134f, 0.012564f, -0.012887f, -0.005188f, 0.009504f, -0.002036f, -0.008228f, 0.013786f, -0.011471f, -0.024256f, 0.004128f, -0.013684f, -0.006045f, 0.006541f, -0.005807f, 0.001118f, 0.001488f, -0.005958f, 0.010378f, -0.009511f, -0.010693f, -0.012950f, -0.001388f, -0.005647f, 0.000890f, 0.003375f, -0.007849f, 0.002032f, 0.002298f, 0.000528f, -0.003724f, 0.002032f, 0.001719f, 0.005340f, 0.000844f, -0.001792f, -0.003669f, -0.002440f, -0.001613f, -0.001025f, -0.001279f, -0.002356f, 0.000728f, 0.000991f, 0.001591f, 0.000429f, -0.000694f, -0.001899f, -0.000707f, 0.002621f, -0.002713f, -0.002923f, -0.000825f, -0.000142f, -0.000228f, 0.001989f, 0.002454f, 0.002211f, -0.001396f, 0.000735f, 0.000513f, 0.000834f, 0.000479f, -0.000832f, 0.005241f, -0.002583f, 0.000285f, -0.021865f, 0.004635f, 0.020658f, 0.001630f, 0.003250f, 0.006235f, 0.019348f, 0.002617f, -0.018575f, 0.020597f, 0.009080f, 0.007417f, 0.012574f, 0.010863f, 0.000100f, -0.003896f, 0.011857f, 0.009023f, 0.003107f, -0.008561f, 0.010310f, 0.004812f, 0.015258f, + 0.017755f, 0.006773f, -0.004430f, 0.000408f, -0.000173f, 0.007417f, 0.022544f, 0.013419f, -0.012581f, 0.021858f, 0.000830f, -0.002699f, 0.002842f, -0.016131f, 0.017867f, -0.002399f, 0.000273f, -0.002155f, 0.004517f, -0.002438f, 0.009198f, -0.013022f, 0.018248f, 0.015586f, -0.000641f, -0.002940f, -0.010237f, -0.019423f, -0.006715f, 0.007665f, -0.004578f, -0.007310f, 0.010223f, 0.012036f, -0.008245f, -0.007324f, -0.024943f, -0.008673f, -0.003149f, -0.001260f, -0.027908f, 0.014122f, 0.001482f, -0.016631f, -0.013704f, 0.004512f, -0.006545f, 0.001630f, -0.004200f, 0.000828f, -0.007412f, -0.001684f, -0.006624f, 0.004650f, 0.009204f, -0.002704f, 0.006978f, 0.000760f, -0.003040f, 0.008243f, 0.002800f, 0.000333f, 0.006757f, -0.000884f, -0.003239f, -0.004410f, -0.004979f, -0.005177f, -0.004943f, -0.006040f, -0.004460f, 0.000202f, -0.002519f, -0.005682f, -0.002881f, 0.000452f, -0.001319f, -0.002188f, 0.001062f, 0.002143f, 0.000955f, -0.002668f, -0.003773f, -0.004635f, 0.000341f, -0.004408f, 0.003801f, -0.002485f, -0.002617f, -0.002460f, -0.000074f, -0.001801f, 0.000229f, 0.000919f, 0.001745f, -0.002159f, + 0.002149f, 0.010015f, -0.012718f, -0.000358f, 0.000377f, 0.000224f, 0.021182f, 0.011260f, 0.000055f, 0.025849f, 0.012295f, 0.023311f, 0.005854f, 0.007719f, 0.025378f, -0.010199f, -0.016539f, -0.010854f, 0.023738f, 0.005505f, -0.013050f, 0.017689f, -0.004695f, -0.010723f, 0.016244f, 0.037806f, -0.009613f, 0.001665f, 0.006285f, 0.007031f, -0.009696f, 0.001011f, 0.021151f, 0.002004f, 0.025960f, -0.005855f, 0.027859f, 0.019330f, 0.006817f, 0.016166f, 0.010578f, -0.010092f, 0.007062f, -0.002772f, -0.002285f, 0.002402f, 0.002054f, -0.002031f, 0.007471f, 0.004817f, 0.018045f, 0.011809f, -0.014779f, 0.004979f, 0.006892f, -0.011269f, 0.000815f, -0.026262f, -0.033571f, 0.013267f, -0.008490f, -0.022272f, -0.004583f, -0.012098f, 0.014668f, 0.002957f, -0.006710f, -0.016869f, 0.013166f, -0.012271f, 0.008081f, -0.013742f, 0.002113f, -0.005670f, 0.020558f, 0.003581f, -0.007859f, 0.007639f, -0.017312f, 0.015641f, 0.002696f, -0.015217f, 0.000791f, -0.001781f, -0.004199f, -0.002032f, 0.002233f, 0.004197f, -0.004268f, 0.007073f, -0.001533f, -0.003113f, -0.003237f, -0.002821f, -0.006375f, -0.000767f, + -0.002220f, -0.006500f, -0.002243f, 0.002002f, -0.003816f, 0.003751f, 0.000676f, -0.002478f, 0.001116f, -0.004414f, -0.000725f, -0.003161f, -0.000318f, -0.000389f, 0.000235f, 0.001791f, 0.002533f, 0.002524f, 0.000157f, 0.001146f, -0.000115f, 0.001095f, -0.002043f, 0.001511f, -0.001436f, 0.001013f, -0.015016f, 0.002239f, 0.000338f, 0.004171f, -0.009252f, 0.010436f, 0.010985f, -0.000960f, -0.007743f, -0.025661f, -0.022457f, -0.016841f, 0.007728f, 0.002566f, 0.003892f, -0.020995f, 0.013229f, 0.009752f, 0.016520f, -0.017965f, 0.017045f, 0.013534f, -0.010696f, -0.008431f, -0.005521f, 0.017842f, 0.011905f, -0.007492f, 0.001508f, 0.026869f, 0.013257f, 0.007119f, 0.015193f, 0.010848f, 0.003914f, -0.008568f, 0.001760f, 0.001471f, -0.003986f, -0.009541f, 0.023413f, 0.011288f, -0.022245f, 0.015122f, 0.014563f, 0.014979f, 0.011316f, 0.003358f, -0.013955f, 0.000663f, -0.002064f, 0.020867f, 0.002505f, 0.009464f, 0.018491f, -0.003110f, -0.020677f, 0.004789f, 0.010774f, 0.021080f, -0.028009f, -0.015417f, 0.007380f, 0.000541f, 0.002331f, -0.016205f, -0.004298f, -0.015707f, -0.002450f, 0.007833f, + -0.005482f, -0.008478f, -0.010841f, 0.004748f, -0.002863f, -0.005049f, -0.013352f, 0.000733f, -0.017798f, -0.000076f, -0.001939f, -0.008650f, -0.010133f, 0.011528f, -0.004116f, -0.002562f, -0.005845f, -0.010572f, 0.003593f, 0.005464f, 0.003375f, 0.004330f, 0.002725f, -0.005733f, -0.003489f, -0.001576f, -0.001713f, -0.005376f, -0.010786f, -0.004437f, -0.000512f, -0.003339f, -0.000560f, -0.005411f, 0.000244f, -0.002828f, -0.002405f, -0.003871f, -0.004863f, -0.002187f, 0.004360f, -0.003102f, -0.001862f, 0.000925f, 0.001610f, 0.001449f, -0.002505f, 0.003735f, 0.004999f, 0.005536f, -0.001729f, -0.000097f, -0.000374f, 0.000869f, 0.000654f, 0.009762f, 0.001360f, -0.017311f, 0.017622f, 0.011190f, -0.005171f, 0.006888f, 0.010642f, -0.011735f, -0.003870f, 0.044806f, -0.001401f, 0.017425f, 0.012312f, -0.037550f, -0.019859f, -0.002193f, -0.001518f, -0.000522f, 0.021336f, 0.004693f, -0.010303f, 0.021907f, 0.013563f, -0.002839f, -0.003562f, 0.006933f, -0.003533f, -0.007860f, -0.016653f, -0.019878f, 0.010993f, -0.004428f, -0.009284f, -0.001056f, -0.030793f, -0.005821f, 0.002072f, 0.016925f, -0.020338f, -0.005982f, + 0.002670f, 0.001280f, 0.004474f, 0.001430f, 0.021772f, -0.025427f, -0.008411f, 0.005549f, -0.000801f, -0.015041f, -0.003136f, 0.019638f, 0.016978f, 0.014581f, -0.004029f, -0.025322f, -0.011504f, 0.009047f, -0.002865f, 0.016862f, -0.000983f, -0.000414f, -0.012578f, -0.007882f, 0.014799f, -0.018182f, 0.012392f, 0.009605f, -0.013053f, -0.006558f, -0.003041f, 0.002015f, -0.014059f, 0.006763f, 0.004855f, -0.006974f, -0.002165f, -0.019242f, 0.006932f, 0.014759f, 0.021185f, 0.001792f, 0.005680f, 0.009983f, 0.003092f, -0.016817f, 0.011480f, -0.004081f, 0.001880f, -0.000013f, -0.005400f, -0.005839f, -0.003121f, 0.007735f, 0.001370f, 0.006454f, -0.000733f, 0.001008f, -0.009337f, -0.003236f, -0.004307f, 0.006976f, -0.000736f, -0.003092f, 0.004846f, -0.003645f, 0.003790f, -0.002343f, 0.000599f, -0.007764f, 0.001776f, -0.001859f, -0.001631f, -0.005004f, 0.001738f, -0.000848f, -0.004383f, -0.008027f, -0.001820f, 0.000724f, -0.003244f, 0.003157f, -0.000877f, -0.005289f, -0.034073f, -0.002024f, 0.004573f, 0.022940f, 0.002764f, -0.000857f, 0.013736f, -0.009942f, 0.029897f, -0.029869f, -0.002966f, -0.006343f, + 0.004919f, -0.001392f, -0.002547f, 0.007761f, -0.005739f, -0.010114f, -0.006906f, -0.005953f, -0.018081f, -0.002781f, 0.012659f, -0.002874f, -0.008103f, 0.019068f, -0.000416f, 0.022922f, -0.022490f, -0.012758f, 0.028174f, -0.002827f, -0.001854f, 0.001738f, -0.017952f, -0.002018f, -0.022381f, 0.006567f, -0.026840f, -0.000623f, 0.019703f, -0.006430f, 0.013378f, 0.017838f, 0.010189f, 0.014054f, -0.018210f, 0.018041f, 0.001844f, -0.047019f, -0.008070f, 0.006894f, -0.004006f, -0.005193f, -0.020342f, 0.015956f, -0.017365f, -0.003341f, -0.019674f, -0.018263f, -0.028497f, 0.025305f, 0.000007f, 0.029486f, -0.014842f, 0.022232f, 0.029254f, -0.019306f, 0.023802f, -0.029473f, -0.024717f, -0.026679f, -0.009474f, -0.018793f, 0.005851f, 0.008902f, -0.001223f, -0.003453f, -0.000343f, -0.021103f, 0.001463f, 0.000257f, 0.012009f, 0.004846f, 0.004584f, 0.008699f, 0.004713f, -0.004579f, -0.000383f, -0.008588f, -0.005327f, 0.000239f, 0.003313f, 0.000161f, 0.003769f, -0.002818f, 0.004065f, -0.001288f, 0.002052f, -0.013091f, 0.000587f, 0.005002f, 0.003593f, 0.007285f, -0.004354f, -0.005779f, -0.007896f, -0.000184f, + -0.000874f, -0.006133f, -0.006896f, 0.000686f, -0.001306f, 0.001113f, -0.000187f, -0.001963f, 0.003248f, 0.010417f, -0.002789f, -0.002455f, -0.001561f, -0.002867f, 0.009131f, 0.000352f, 0.000883f, -0.003269f, 0.005318f, -0.006109f, -0.001427f, 0.004018f, 0.022091f, 0.037558f, 0.005240f, -0.009834f, -0.020352f, 0.012702f, 0.034369f, 0.000457f, 0.009765f, 0.001912f, 0.013643f, 0.009625f, 0.010443f, 0.018925f, -0.022777f, -0.001670f, -0.008536f, 0.029752f, 0.021872f, -0.000951f, 0.033994f, 0.018154f, 0.002947f, -0.031951f, -0.016012f, -0.024333f, -0.011413f, 0.002610f, 0.009124f, -0.008648f, 0.001213f, 0.034809f, -0.006578f, 0.000155f, 0.001699f, 0.035764f, -0.021852f, -0.008646f, -0.008938f, -0.003372f, -0.021378f, 0.024676f, 0.001585f, 0.016593f, -0.025628f, 0.003611f, -0.002838f, -0.015102f, -0.006107f, -0.028092f, 0.008804f, 0.000663f, 0.005896f, -0.003338f, -0.001757f, -0.032630f, -0.011177f, 0.012928f, 0.020783f, -0.005911f, 0.005411f, 0.043682f, -0.002864f, 0.002657f, 0.007966f, 0.019765f, -0.018487f, 0.004369f, 0.022038f, -0.012952f, 0.016014f, 0.004843f, 0.016693f, -0.022089f, + -0.011333f, 0.003157f, 0.005069f, 0.011403f, 0.012730f, 0.012350f, -0.008393f, 0.003682f, 0.007508f, 0.014915f, 0.022988f, 0.010812f, -0.010956f, -0.004943f, -0.008628f, 0.003866f, 0.004834f, 0.010181f, 0.009088f, 0.005663f, 0.009604f, -0.010218f, -0.002111f, -0.010423f, 0.009085f, -0.011962f, 0.012257f, 0.009000f, -0.009227f, 0.005602f, -0.001145f, -0.005450f, 0.001344f, 0.002024f, -0.003332f, 0.002973f, 0.015233f, -0.000299f, -0.000047f, -0.009206f, 0.004787f, -0.000238f, -0.000319f, -0.008338f, 0.008722f, -0.007064f, 0.002719f, 0.003951f, 0.006916f, -0.000581f, -0.003310f, -0.020339f, -0.031039f, 0.008626f, -0.003351f, -0.031301f, 0.008553f, 0.003160f, 0.028351f, 0.025103f, -0.023313f, -0.027925f, 0.006216f, -0.021322f, -0.011275f, 0.000883f, 0.042239f, 0.000603f, -0.005436f, -0.037805f, -0.018996f, -0.003271f, -0.028264f, -0.042848f, 0.029322f, -0.011051f, -0.013605f, -0.002468f, 0.031800f, -0.009980f, 0.003405f, -0.006397f, -0.006487f, -0.018529f, -0.009969f, 0.003106f, -0.044848f, -0.028791f, -0.008370f, -0.016341f, -0.015258f, -0.005240f, -0.017665f, 0.015208f, 0.006861f, 0.004870f, + -0.010820f, 0.007689f, -0.064718f, 0.060062f, 0.035141f, -0.006100f, -0.008319f, 0.033783f, 0.001911f, -0.020235f, -0.028921f, -0.003681f, -0.010236f, -0.012006f, -0.017459f, -0.017713f, 0.021965f, 0.020608f, -0.009493f, 0.045294f, -0.025352f, -0.020721f, -0.018836f, 0.000090f, 0.014644f, -0.053102f, 0.015524f, -0.016810f, 0.027573f, -0.030104f, 0.013022f, -0.002757f, -0.010364f, 0.020738f, -0.039277f, 0.036713f, 0.001900f, -0.000521f, -0.008476f, 0.001053f, -0.000739f, -0.018591f, 0.003440f, -0.005169f, 0.009483f, 0.012328f, -0.011560f, 0.005617f, 0.007675f, 0.017310f, 0.000399f, -0.005706f, -0.001200f, -0.001598f, -0.007133f, 0.005031f, -0.002937f, -0.004215f, 0.004190f, -0.006951f, -0.002441f, 0.001616f, 0.004738f, 0.005882f, -0.014126f, -0.010690f, -0.009460f, 0.001486f, 0.005404f, -0.000092f, 0.003465f, 0.003137f, 0.009004f, 0.004747f, -0.007825f, 0.006886f, 0.001091f, -0.008732f, 0.030762f, 0.002540f, 0.071726f, 0.023369f, -0.001454f, 0.003086f, -0.027753f, -0.035950f, 0.044798f, -0.013266f, 0.005079f, 0.059478f, -0.015497f, -0.002868f, -0.012723f, 0.046384f, 0.008921f, -0.019168f, + 0.027380f, -0.009951f, 0.040671f, 0.021356f, 0.010133f, 0.006032f, -0.004504f, -0.015562f, -0.005075f, -0.004216f, -0.043599f, -0.010945f, -0.007022f, 0.024130f, -0.013501f, 0.004559f, 0.008025f, -0.031228f, -0.046532f, -0.001650f, 0.040188f, -0.002672f, 0.035704f, -0.006171f, -0.049881f, -0.019307f, 0.002282f, 0.011321f, 0.009039f, -0.040569f, 0.000358f, -0.011604f, 0.029490f, -0.030101f, 0.037278f, 0.055117f, 0.035750f, -0.011200f, 0.006685f, 0.022246f, -0.007904f, 0.043192f, 0.049986f, 0.044073f, 0.014426f, 0.048326f, -0.001618f, -0.019443f, 0.006277f, -0.025241f, -0.031857f, 0.017426f, -0.013650f, 0.039499f, 0.020439f, 0.010492f, -0.013517f, -0.048589f, -0.044028f, 0.030955f, -0.019466f, -0.039312f, 0.026311f, 0.052468f, 0.031580f, -0.016795f, 0.025091f, 0.015398f, -0.005392f, -0.012371f, 0.014923f, -0.018621f, -0.005597f, -0.001976f, -0.012779f, 0.001727f, -0.002700f, 0.010822f, 0.006616f, -0.002480f, -0.017020f, 0.009565f, 0.008769f, 0.006013f, -0.003610f, 0.000584f, -0.015890f, 0.001317f, -0.000064f, 0.004176f, 0.003858f, 0.000442f, 0.009630f, -0.003295f, 0.013289f, 0.014903f, + 0.003970f, 0.012108f, 0.001231f, -0.009532f, -0.022543f, 0.005161f, 0.000689f, 0.004910f, -0.003743f, -0.016246f, -0.036253f, 0.021213f, 0.026490f, -0.000411f, 0.012937f, 0.008724f, 0.012793f, 0.010647f, 0.004836f, -0.002910f, 0.006206f, -0.007636f, 0.013706f, -0.024664f, -0.068700f, -0.027584f, 0.037527f, 0.002108f, -0.011289f, -0.023050f, -0.000232f, 0.031551f, 0.040289f, 0.008514f, -0.024908f, -0.004480f, 0.032195f, -0.039228f, 0.003606f, -0.005003f, 0.028786f, 0.032859f, -0.026596f, 0.049917f, 0.009573f, 0.001829f, 0.070583f, 0.000171f, -0.022334f, 0.024577f, -0.011963f, 0.003331f, -0.015265f, 0.005041f, 0.046838f, 0.005195f, 0.059705f, 0.025031f, -0.052449f, -0.057471f, -0.012685f, 0.014618f, 0.031790f, -0.044644f, -0.015888f, -0.006703f, 0.053699f, 0.049067f, -0.042483f, -0.001947f, -0.026014f, 0.015970f, -0.009131f, 0.056103f, 0.000496f, -0.012754f, 0.036797f, -0.007897f, -0.044067f, -0.022479f, -0.007445f, 0.045126f, -0.040624f, 0.024035f, 0.070421f, 0.033080f, 0.047165f, -0.013119f, 0.018993f, -0.013228f, -0.029676f, -0.028666f, 0.014517f, -0.020521f, -0.001682f, -0.007675f, + 0.012569f, -0.000814f, 0.028376f, -0.006950f, -0.013574f, -0.005209f, -0.006120f, 0.006536f, -0.004929f, 0.010516f, -0.020080f, 0.013993f, -0.013417f, -0.006526f, 0.003667f, -0.005770f, -0.006542f, 0.008585f, -0.009059f, -0.003905f, -0.002986f, -0.007781f, -0.024648f, -0.014314f, -0.002784f, -0.003506f, -0.007596f, -0.010176f, -0.002679f, 0.006517f, -0.004676f, 0.003533f, -0.004194f, -0.000960f, 0.005027f, -0.019349f, 0.001584f, -0.003386f, -0.014539f, -0.001325f, -0.034079f, 0.025583f, 0.035860f, 0.031246f, -0.053871f, -0.024629f, 0.032834f, 0.102365f, 0.005451f, 0.022771f, -0.030229f, 0.009861f, -0.002172f, -0.004098f, -0.028431f, 0.009051f, -0.010458f, 0.049453f, 0.037986f, -0.050350f, -0.023307f, 0.054565f, 0.026665f, 0.020019f, 0.005024f, 0.029770f, 0.033261f, 0.011451f, 0.019608f, 0.019345f, -0.025319f, 0.004250f, -0.024809f, -0.010195f, 0.005950f, -0.004124f, 0.003413f, -0.020198f, -0.019351f, 0.015057f, -0.004518f, 0.020532f, 0.015031f, -0.046549f, 0.034566f, 0.007644f, 0.027703f, -0.031229f, 0.017601f, 0.029233f, -0.022847f, -0.035754f, -0.037265f, -0.039665f, -0.040950f, -0.032774f, + 0.011366f, 0.060167f, 0.015177f, 0.018954f, 0.027642f, 0.002573f, -0.001098f, -0.022643f, 0.039331f, -0.050001f, -0.102078f, 0.035369f, -0.023726f, 0.005009f, -0.086670f, 0.021865f, 0.026891f, 0.005286f, 0.016748f, 0.015092f, -0.013184f, -0.021440f, -0.034574f, 0.011414f, 0.007212f, -0.025476f, 0.018686f, -0.009333f, -0.044441f, -0.023487f, -0.000831f, -0.007318f, 0.004343f, 0.003548f, 0.012774f, 0.006669f, 0.002069f, -0.000289f, 0.010083f, -0.005813f, -0.014377f, -0.024448f, -0.015305f, -0.015603f, -0.005907f, -0.008366f, 0.008952f, 0.014700f, 0.010290f, -0.019377f, -0.001928f, -0.007837f, -0.000151f, 0.012032f, 0.003211f, -0.017068f, -0.032910f, -0.002246f, 0.001092f, 0.003263f, -0.011908f, -0.004372f, -0.012437f, -0.001919f, -0.016166f, -0.016167f, 0.010536f, -0.015786f, 0.006454f, 0.003296f, -0.008727f, -0.002781f, 0.010073f, -0.008850f, 0.003673f, -0.012060f, 0.024219f, 0.017294f, 0.023133f, -0.032997f, -0.017030f, -0.004723f, 0.021147f, -0.044009f, 0.073130f, 0.034619f, -0.005914f, 0.039758f, 0.023997f, 0.037881f, -0.019931f, -0.025677f, -0.024804f, 0.045900f, 0.016378f, 0.008197f, + 0.041529f, -0.036447f, -0.117600f, -0.007954f, 0.007882f, 0.013876f, -0.066193f, 0.051194f, 0.037333f, -0.071222f, -0.054717f, 0.001629f, 0.029311f, 0.002362f, 0.016652f, 0.037564f, -0.009993f, 0.023275f, -0.034346f, -0.039456f, -0.031357f, -0.040984f, -0.063608f, 0.017590f, 0.006584f, -0.042835f, 0.056364f, 0.021780f, -0.013786f, -0.013573f, -0.033292f, -0.025059f, -0.058003f, -0.031633f, 0.020599f, 0.051317f, -0.019628f, 0.005024f, 0.021136f, -0.045775f, 0.032897f, 0.044451f, 0.006533f, -0.011566f, 0.038063f, 0.010298f, 0.004240f, -0.027457f, -0.032007f, -0.002481f, 0.056912f, -0.017660f, -0.052647f, -0.001062f, -0.067073f, -0.069927f, -0.072772f, -0.034995f, -0.038443f, -0.024631f, 0.031160f, -0.004527f, 0.027995f, -0.005942f, -0.009395f, -0.026435f, -0.007194f, -0.007884f, 0.014962f, -0.011691f, -0.016952f, -0.003457f, -0.006748f, 0.002339f, -0.024669f, 0.004510f, -0.011468f, -0.009941f, 0.012786f, -0.011869f, -0.004104f, 0.004120f, -0.008926f, 0.018972f, -0.012316f, 0.002740f, 0.030761f, 0.003685f, 0.017867f, -0.007035f, -0.011127f, 0.031298f, 0.004447f, -0.016742f, 0.000338f, 0.000219f, + 0.002157f, 0.004364f, -0.009210f, 0.019530f, 0.000879f, -0.001564f, -0.009811f, 0.001762f, -0.009970f, -0.025758f, -0.044513f, -0.023331f, -0.023919f, 0.028979f, 0.057038f, 0.021056f, -0.026027f, -0.055014f, 0.058992f, 0.031753f, -0.028481f, -0.015353f, -0.015209f, 0.003300f, 0.013867f, -0.018195f, 0.030640f, 0.028502f, 0.001571f, -0.019188f, -0.018197f, -0.017132f, -0.002228f, 0.011063f, -0.008654f, -0.018969f, -0.045104f, 0.013850f, 0.039577f, -0.022796f, 0.034981f, 0.001021f, 0.023458f, -0.019703f, 0.026084f, 0.075774f, -0.028489f, 0.033029f, 0.065803f, 0.011363f, -0.011614f, -0.018372f, 0.019018f, 0.001336f, 0.033529f, -0.025819f, 0.090300f, -0.028083f, -0.060811f, 0.013832f, -0.027778f, 0.071420f, 0.023323f, -0.022502f, 0.003973f, -0.043296f, -0.059350f, 0.072496f, 0.008150f, -0.019708f, 0.071604f, -0.037338f, 0.009180f, -0.021171f, 0.041411f, -0.053246f, -0.059751f, -0.042699f, 0.013010f, 0.025406f, 0.047420f, 0.020136f, 0.050119f, 0.078695f, -0.009955f, 0.015647f, -0.010674f, 0.009730f, -0.002783f, 0.002928f, -0.058287f, 0.001901f, -0.080396f, -0.027023f, -0.016095f, 0.013895f, + -0.003024f, 0.017242f, -0.006678f, -0.024274f, -0.025518f, -0.006095f, -0.017002f, -0.018808f, -0.032304f, -0.000366f, -0.003722f, 0.023887f, 0.009956f, -0.020059f, 0.017564f, 0.008010f, 0.014408f, 0.019172f, -0.025961f, 0.006715f, -0.011048f, -0.005279f, 0.025144f, -0.008994f, 0.012288f, 0.016830f, -0.010819f, -0.028227f, -0.014659f, 0.009679f, -0.046212f, -0.014753f, 0.000504f, -0.006953f, -0.010873f, 0.020145f, -0.022158f, -0.024388f, 0.016154f, 0.027239f, -0.013332f, 0.022656f, -0.015985f, 0.054840f, -0.007643f, 0.001023f, 0.066978f, 0.006620f, -0.035785f, -0.042809f, -0.036761f, 0.067560f, -0.045311f, 0.026425f, 0.032432f, -0.022549f, 0.006968f, -0.038136f, -0.008141f, 0.029787f, -0.026840f, 0.021321f, -0.008808f, -0.047775f, -0.103113f, -0.009914f, 0.093215f, 0.038281f, 0.009732f, -0.019049f, -0.027786f, -0.005710f, -0.036534f, 0.011275f, -0.051585f, 0.061330f, 0.004712f, 0.006884f, 0.005198f, -0.021493f, -0.062275f, -0.024451f, 0.050183f, -0.041501f, -0.010403f, -0.028902f, 0.022452f, -0.020879f, 0.069375f, -0.011782f, 0.014355f, -0.025878f, -0.064653f, 0.013725f, -0.049359f, -0.011749f, + -0.004305f, -0.091232f, -0.076408f, -0.072879f, 0.024019f, -0.013958f, -0.039107f, -0.026083f, -0.025018f, -0.023721f, -0.034915f, -0.024205f, -0.006061f, -0.082011f, 0.022725f, 0.008436f, 0.029989f, -0.018711f, 0.070679f, -0.008084f, 0.013618f, -0.025229f, -0.009765f, 0.037402f, -0.075495f, 0.031327f, 0.049426f, -0.051494f, -0.032897f, 0.002310f, 0.007961f, -0.014192f, -0.024449f, -0.040533f, -0.002499f, 0.000105f, -0.024016f, 0.019550f, -0.017737f, -0.032497f, -0.017569f, -0.014462f, 0.019970f, -0.001440f, 0.000586f, -0.001623f, 0.014874f, -0.039886f, -0.011271f, -0.005633f, -0.007693f, -0.003664f, 0.000539f, -0.047686f, 0.001345f, -0.016130f, -0.012466f, -0.005045f, -0.021076f, 0.004683f, -0.006110f, 0.003131f, 0.000678f, -0.005164f, -0.005389f, -0.012780f, -0.002117f, -0.010721f, -0.002443f, 0.005342f, -0.010812f, -0.018315f, 0.000287f, -0.005361f, -0.004075f, -0.011966f, -0.019219f, -0.014185f, -0.005153f, -0.003737f, -0.003748f, 0.005350f, -0.014165f, -0.015319f, 0.027575f, 0.017579f, 0.033486f, -0.012263f, -0.071299f, 0.020974f, 0.000472f, 0.118050f, 0.119700f, 0.015114f, 0.000648f, 0.028898f, + 0.013676f, 0.030832f, 0.051363f, 0.019915f, 0.053357f, 0.081993f, -0.020785f, 0.011271f, -0.067381f, -0.008890f, 0.008259f, -0.008054f, -0.020393f, -0.039958f, -0.034592f, 0.019487f, 0.018296f, -0.088271f, 0.062945f, 0.017731f, 0.089031f, -0.004858f, -0.018164f, 0.029860f, -0.006634f, 0.094805f, 0.023564f, -0.004231f, 0.017701f, 0.019233f, -0.025681f, -0.056940f, -0.045512f, -0.022028f, 0.069941f, 0.001527f, 0.076923f, 0.010090f, 0.075204f, -0.021217f, -0.104366f, -0.038328f, -0.030555f, 0.054417f, 0.006197f, -0.049955f, -0.073566f, -0.050571f, -0.010543f, 0.063794f, -0.055358f, -0.047348f, -0.031904f, 0.056987f, -0.028129f, -0.015892f, -0.073201f, -0.071975f, 0.022574f, 0.012788f, 0.097360f, 0.025635f, -0.010619f, -0.025902f, 0.030352f, 0.032219f, 0.103996f, 0.002396f, -0.034035f, -0.044663f, -0.003148f, -0.004166f, 0.002148f, 0.016693f, 0.014788f, -0.023822f, -0.005704f, 0.008323f, 0.021529f, -0.022880f, -0.019136f, 0.029729f, 0.042965f, 0.020476f, 0.013029f, 0.017182f, -0.018372f, -0.007361f, -0.011625f, -0.002005f, -0.002598f, 0.009834f, -0.000026f, 0.056659f, 0.011679f, -0.002094f, + -0.017341f, -0.029273f, 0.028147f, 0.045989f, -0.016650f, 0.001005f, 0.001701f, 0.005949f, 0.026105f, 0.011617f, 0.019391f, 0.020040f, 0.005015f, 0.015613f, 0.005053f, -0.000849f, 0.005091f, -0.013827f, -0.004703f, 0.003476f, -0.008375f, -0.005630f, -0.018212f, -0.001104f, 0.005910f, 0.001215f, 0.072207f, 0.026960f, -0.034658f, 0.067399f, -0.003935f, -0.133492f, -0.040282f, 0.083564f, 0.093511f, -0.066035f, -0.065484f, -0.067217f, 0.037481f, 0.056680f, 0.114346f, 0.034103f, 0.014910f, -0.065574f, -0.006454f, -0.004498f, 0.025817f, 0.056640f, 0.041617f, 0.002851f, -0.068951f, -0.134683f, -0.035472f, -0.068414f, 0.101015f, 0.106339f, 0.186599f, -0.056443f, -0.179381f, -0.039683f, -0.061624f, 0.138839f, 0.047433f, 0.140806f, 0.036419f, -0.047905f, -0.136731f, -0.093084f, 0.004928f, 0.016350f, 0.153197f, 0.061572f, -0.005412f, -0.126842f, -0.220151f, -0.058250f, 0.004586f, 0.100933f, 0.231400f, 0.049717f, 0.069664f, -0.149970f, -0.228787f, 0.009096f, 0.052317f, 0.181257f, 0.106831f, 0.075689f, -0.042463f, -0.148143f, -0.120740f, -0.002013f, 0.033746f, -0.004019f, 0.091643f, -0.076753f, + -0.071297f, -0.018479f, -0.162745f, 0.024491f, 0.007497f, 0.043425f, -0.032965f, -0.066586f, -0.035663f, -0.028686f, -0.074669f, 0.016152f, 0.021379f, -0.024708f, -0.004107f, -0.070701f, 0.009569f, 0.019275f, 0.022584f, 0.031551f, 0.009967f, -0.036669f, 0.012114f, -0.012234f, -0.006591f, 0.004307f, 0.056228f, 0.008817f, -0.002229f, -0.015401f, -0.043544f, -0.009378f, -0.017666f, 0.015722f, -0.008277f, 0.017535f, 0.011543f, -0.040403f, -0.089905f, -0.044993f, -0.066180f, 0.052735f, 0.053590f, 0.063290f, 0.036373f, -0.084354f, -0.075685f, -0.117256f, -0.028581f, 0.093335f, 0.103852f, 0.100750f, 0.004484f, -0.113184f, -0.084533f, -0.066355f, -0.001892f, 0.166406f, 0.115578f, 0.046437f, -0.090308f, -0.105328f, -0.078819f, 0.037547f, 0.039226f, 0.057074f, 0.029859f, -0.018700f, -0.026465f, -0.050241f, -0.021916f, 0.014039f, 0.001713f, 0.016813f, 0.023852f, -0.001584f, -0.077821f, 0.102933f, -0.003673f, 0.016222f, -0.044172f, -0.095116f, 0.056095f, -0.095788f, 0.101612f, 0.016303f, 0.007762f, 0.023030f, -0.063393f, 0.062726f, 0.004597f, 0.043984f, -0.060834f, 0.022239f, -0.000898f, 0.075046f, + -0.030786f, 0.019374f, 0.047819f, -0.054760f, -0.033699f, 0.006607f, -0.052469f, 0.084077f, -0.019969f, -0.033010f, 0.073181f, 0.086846f, -0.024276f, -0.062261f, -0.016977f, -0.054744f, -0.011640f, 0.035659f, -0.006702f, -0.068460f, 0.007011f, 0.038581f, -0.025785f, 0.043373f, -0.036286f, 0.017430f, 0.044021f, -0.017050f, 0.028592f, -0.078122f, -0.080994f, 0.082247f, 0.043981f, 0.126335f, -0.006373f, -0.030714f, 0.105090f, -0.059605f, -0.055193f, 0.038312f, 0.034712f, 0.061302f, -0.055889f, -0.025113f, 0.015055f, -0.010633f, 0.059079f, -0.047137f, -0.150277f, 0.039780f, 0.082339f, 0.002098f, -0.070195f, 0.014069f, 0.041403f, -0.015683f, -0.019123f, -0.054677f, -0.019007f, -0.044960f, 0.045217f, 0.012252f, -0.033472f, -0.007791f, 0.054220f, -0.038191f, -0.014933f, -0.034418f, -0.005141f, 0.027792f, -0.039888f, 0.021794f, 0.056741f, 0.023137f, -0.001757f, -0.015430f, -0.004177f, -0.020332f, -0.027835f, 0.044664f, -0.019149f, 0.020861f, -0.007037f, -0.021232f, -0.001083f, 0.005802f, 0.003234f, 0.016970f, 0.018339f, -0.032238f, -0.011039f, 0.017676f, 0.013018f, 0.034186f, -0.005259f, -0.027528f, + 0.010459f, -0.032230f, 0.015091f, -0.029250f, -0.017938f, 0.001726f, -0.007409f, -0.019196f, 0.046005f, -0.019246f, 0.008801f, 0.021669f, 0.003580f, 0.017281f, 0.030286f, 0.000708f, -0.006342f, 0.002830f, -0.002599f, -0.039659f, -0.024351f, 0.151078f, 0.041383f, 0.042027f, -0.127964f, -0.031936f, -0.100235f, -0.084629f, 0.076462f, 0.080478f, 0.159255f, 0.073645f, -0.021127f, -0.030579f, -0.018321f, 0.050472f, 0.035204f, 0.001322f, 0.077600f, 0.015350f, -0.030558f, -0.036300f, -0.029189f, 0.055876f, 0.000395f, 0.048905f, 0.023072f, 0.029632f, 0.007715f, -0.011947f, 0.006055f, -0.000058f, 0.007697f, -0.012400f, -0.002824f, 0.016200f, 0.013802f, 0.104534f, 0.084324f, 0.068867f, -0.005626f, 0.019011f, -0.042091f, -0.006775f, -0.026032f, -0.047622f, -0.049521f, 0.015323f, 0.027619f, 0.039888f, 0.048986f, 0.040318f, -0.024689f, -0.063763f, 0.097776f, -0.069326f, -0.030045f, -0.017587f, 0.033836f, 0.004571f, 0.048092f, 0.049883f, 0.043945f, -0.058403f, -0.020566f, 0.008145f, -0.022586f, -0.094323f, 0.063645f, -0.022025f, -0.016585f, 0.035849f, 0.073798f, 0.083362f, 0.061171f, 0.059549f, + 0.051785f, -0.054642f, 0.007572f, -0.013936f, -0.016580f, 0.031319f, 0.025244f, 0.033357f, 0.016609f, -0.015184f, -0.026867f, -0.039493f, -0.042335f, -0.085821f, -0.033875f, 0.012650f, -0.004486f, 0.052277f, 0.000324f, -0.023906f, -0.007566f, -0.034230f, 0.013379f, 0.003898f, -0.002121f, -0.000555f, 0.022621f, 0.048917f, -0.005619f, 0.002307f, 0.027414f, 0.001812f, 0.000709f, -0.009988f, -0.002817f, -0.011844f, -0.010839f, 0.002733f, -0.022975f, 0.010178f, 0.013744f, -0.017430f, -0.025054f, 0.006775f, 0.005491f, -0.009515f, 0.025306f, 0.033186f, -0.004209f, 0.004729f, -0.010541f, -0.034141f, -0.013917f, 0.006779f, 0.006082f, -0.195394f, -0.097199f, -0.134222f, 0.096990f, 0.021305f, 0.277417f, 0.286484f, 0.285707f, 0.326220f, 0.321503f, 0.230788f, 0.143847f, 0.179994f, 0.079826f, 0.016704f, -0.151737f, -0.132313f, -0.331645f, -0.290229f, -0.260315f, -0.153541f, -0.193487f, -0.147633f, -0.011892f, -0.047193f, -0.018804f, -0.023301f, 0.001428f, -0.000379f, 0.009044f, 0.037840f, 0.040886f, 0.038800f, 0.114678f, 0.117440f, 0.124724f, 0.088937f, 0.249217f, 0.065120f, 0.104927f, 0.174319f, + 0.194568f, 0.072271f, 0.195818f, 0.235355f, 0.185821f, 0.161168f, 0.164099f, 0.018111f, 0.098382f, 0.198121f, 0.195985f, 0.126213f, 0.164532f, 0.143684f, -0.001616f, -0.053035f, -0.037083f, -0.097770f, -0.120451f, -0.015408f, -0.135407f, -0.206929f, -0.161007f, -0.192720f, -0.284856f, -0.130383f, -0.192477f, -0.213593f, -0.302341f, -0.245989f, -0.278780f, -0.318756f, -0.212094f, -0.360436f, -0.426215f, -0.427967f, -0.232584f, -0.289513f, -0.364707f, -0.071548f, -0.162173f, -0.076071f, -0.040512f, 0.119927f, 0.053721f, 0.175854f, 0.093709f, 0.166147f, 0.158377f, 0.104125f, 0.082340f, 0.128914f, 0.238694f, 0.242679f, 0.243713f, 0.248731f, 0.258623f, 0.313966f, 0.280704f, 0.232977f, 0.286579f, 0.323113f, 0.258502f, 0.194436f, 0.232116f, 0.195242f, 0.126431f, 0.159372f, 0.108075f, 0.053918f, 0.023609f, 0.049651f, 0.015032f, -0.019489f, -0.013208f, -0.025262f, -0.061349f, -0.093816f, -0.093195f, -0.101684f, -0.086753f, -0.108705f, -0.171382f, -0.154045f, -0.177099f, -0.199868f, -0.232947f, -0.232323f, -0.192232f, -0.193078f, -0.158048f, -0.100013f, -0.112886f, -0.076535f, -0.053526f, 0.007040f, + 0.000211f, 0.001619f, 0.010413f, 0.036047f, 0.041237f, 0.014830f, 0.032863f, 0.052094f, 0.041529f, 0.019348f, 0.021905f, 0.039229f, 0.023323f, 0.010966f, 0.016364f, 0.022964f, 0.020883f, 0.014628f, 0.017892f, 0.028909f, 0.027633f, 0.013066f, 0.004458f, 0.009660f, 0.017143f, 0.010275f, 0.000007f, 0.006952f, 0.012987f, 0.010179f, 0.004944f, 0.008867f, 0.009456f, 0.007365f, 0.006487f, 0.003255f, 0.002486f, 0.007259f, 0.005817f, 0.006354f, 0.002616f, -0.004037f, -0.005109f, 0.002919f, 0.006078f, -0.001314f, -0.004215f, 0.001150f, 0.000004f, 0.001228f, 0.003608f, 0.002539f, 0.004319f, 0.007850f, 0.007343f, 0.011681f, 0.015713f, 0.018287f, 0.014195f, 0.014487f, 0.015888f, 0.013289f, 0.009330f, 0.010641f, 0.012681f, 0.009806f, 0.004697f, 0.006119f, 0.003653f, 0.002847f, -0.000198f, -0.004843f, -0.004430f, -0.006181f, -0.012726f, -0.017688f, -0.017423f, -0.015275f, -0.019884f, -0.018705f, -0.017074f, -0.015290f, -0.014870f, -0.012298f, -0.009872f, -0.006708f, -0.005604f, -0.003461f, -0.002049f, -0.000519f, 0.000176f, 0.001575f, 0.001586f, 0.002877f, 0.001952f, 0.002304f, + 0.001442f, 0.002027f, 0.000909f, 0.001188f, 0.000244f, 0.000527f} + } +}; +const float CRendBin_Combined_BRIR_coeff_diffuse_re_48kHz[BINAURAL_CHANNELS][2885]={ {-0.000036f, -0.000011f, -0.000019f, -0.000013f, -0.000030f, -0.000006f, -0.000048f, -0.000013f, -0.000158f, 0.000107f, -0.000008f, 0.000108f, -0.000022f, 0.000046f, 0.000299f, -0.000037f, -0.000351f, -0.000354f, -0.000113f, -0.000220f, 0.000032f, -0.000180f, -0.000473f, 0.000130f, -0.000116f, -0.000091f, 0.000132f, 0.000034f, -0.000158f, -0.000261f, -0.000326f, 0.000037f, -0.000195f, -0.000130f, 0.000076f, -0.000361f, 0.000321f, 0.000322f, -0.000185f, -0.000033f, -0.000117f, -0.000344f, 0.000036f, -0.000314f, -0.000234f, 0.000223f, -0.000150f, 0.000483f, 0.002034f, -0.000891f, 0.000900f, -0.000388f, 0.000319f, -0.000018f, 0.000469f, -0.000211f, 0.000114f, 0.000197f, 0.000239f, 0.000254f, 0.000445f, -0.000116f, 0.000049f, 0.000816f, 0.000612f, -0.001621f, 0.000319f, -0.000213f, 0.000079f, -0.000556f, 0.000361f, -0.000699f, 0.000689f, 0.000567f, 0.000282f, -0.000096f, -0.000219f, -0.000261f, 0.000489f, 0.000445f, -0.000204f, 0.000096f, 0.000846f, -0.000323f, -0.000018f, -0.000295f, 0.000099f, 0.000124f, -0.000024f, -0.000246f, 0.000397f, 0.000054f, -0.000122f, 0.000295f, 0.008176f, -0.000604f, + 0.001128f, -0.000033f, 0.000349f, 0.000145f, 0.000264f, 0.000174f, 0.000772f, -0.000464f, 0.000318f, -0.000173f, 0.000123f, 0.000418f, 0.000659f, 0.000255f, 0.000118f, -0.000335f, 0.000599f, -0.000456f, 0.000221f, -0.000219f, -0.000656f, 0.000054f, 0.000212f, 0.000010f, -0.000213f, 0.000043f, -0.000237f, 0.000409f, -0.000881f, 0.000189f, -0.000213f, 0.000216f, -0.000020f, -0.001232f, -0.000434f, 0.000110f, 0.000181f, 0.000126f, -0.000223f, -0.000289f, -0.000249f, 0.000158f, 0.000461f, -0.000210f, 0.000197f, 0.004950f, -0.005827f, 0.001178f, -0.001392f, 0.000781f, -0.000898f, 0.000723f, -0.001232f, -0.000360f, -0.000756f, -0.000127f, -0.000628f, 0.000069f, 0.001158f, 0.001681f, 0.000710f, 0.000385f, 0.000041f, 0.000538f, 0.001203f, 0.000882f, -0.000533f, -0.000639f, -0.000862f, -0.000400f, -0.000494f, 0.000062f, -0.000071f, -0.000060f, 0.000034f, 0.000270f, -0.000396f, 0.000533f, -0.000524f, -0.000694f, 0.000269f, 0.000007f, 0.000062f, 0.000167f, -0.000485f, -0.000543f, 0.000179f, -0.000323f, -0.000451f, -0.000068f, 0.000073f, 0.000377f, -0.011298f, 0.002275f, -0.000551f, 0.000305f, + 0.000263f, -0.000929f, -0.000408f, 0.000919f, -0.000129f, 0.000096f, 0.001028f, 0.000346f, -0.000367f, -0.000684f, 0.000722f, 0.000081f, -0.000836f, -0.001203f, -0.001752f, 0.000590f, -0.000769f, 0.000202f, -0.000237f, 0.000351f, -0.000163f, 0.000145f, -0.000902f, -0.000887f, -0.000548f, -0.000222f, -0.000555f, 0.000191f, -0.000260f, 0.000343f, 0.001079f, 0.000204f, 0.000202f, 0.000723f, 0.000211f, 0.000184f, -0.000007f, -0.000117f, -0.000685f, -0.000145f, 0.000179f, -0.000109f, -0.000017f, -0.013514f, 0.005078f, -0.001249f, 0.001642f, -0.000779f, 0.001189f, -0.000632f, -0.000167f, -0.001139f, 0.000905f, -0.001351f, 0.000927f, -0.000220f, 0.001290f, -0.001714f, 0.000467f, 0.001625f, 0.000494f, -0.001344f, -0.000459f, -0.000804f, -0.000317f, 0.000528f, 0.000286f, 0.000394f, -0.000190f, -0.000449f, -0.000630f, -0.000625f, -0.000029f, -0.000719f, -0.000103f, -0.000668f, -0.000456f, -0.001878f, -0.000502f, -0.000254f, 0.000131f, 0.000055f, 0.000684f, 0.000292f, 0.000675f, -0.000056f, 0.000781f, 0.000189f, 0.000097f, 0.000197f, 0.001667f, 0.005870f, -0.001647f, 0.002592f, -0.001609f, 0.000662f, + -0.001734f, 0.001325f, -0.000146f, 0.001446f, -0.000140f, -0.000168f, 0.001420f, -0.000259f, -0.000223f, 0.001241f, -0.000640f, -0.001178f, -0.001870f, 0.001620f, -0.000157f, 0.001102f, 0.000107f, 0.000777f, 0.000362f, -0.001091f, 0.000432f, 0.000415f, -0.000097f, 0.000533f, 0.000820f, -0.001084f, 0.000116f, -0.000052f, -0.000116f, -0.000630f, -0.000300f, -0.000617f, 0.000138f, -0.000143f, 0.000437f, 0.001363f, 0.000028f, 0.000682f, -0.000151f, 0.000117f, -0.000174f, 0.000194f, 0.000533f, -0.000272f, -0.000524f, 0.017769f, -0.004406f, 0.001672f, -0.000869f, 0.001478f, -0.000674f, 0.001130f, -0.000659f, 0.000377f, -0.001752f, 0.000786f, -0.001674f, 0.001248f, -0.000526f, 0.000356f, -0.000502f, 0.001765f, 0.000224f, 0.000431f, -0.000877f, 0.001148f, -0.000126f, -0.000554f, 0.000970f, -0.000784f, -0.001216f, 0.000015f, -0.000395f, 0.000554f, -0.000028f, -0.000194f, -0.000412f, 0.000158f, -0.000062f, 0.000209f, -0.000845f, 0.000178f, -0.000386f, 0.001267f, -0.000263f, 0.000599f, 0.000092f, 0.000501f, 0.000936f, -0.000674f, 0.000027f, 0.000209f, -0.000351f, 0.000740f, -0.000180f, -0.000349f, + 0.001515f, -0.009212f, 0.003660f, -0.002832f, 0.001696f, -0.001403f, 0.000504f, -0.001854f, 0.001230f, -0.000732f, 0.001712f, -0.000175f, 0.000757f, -0.001477f, -0.000612f, -0.000083f, -0.000525f, -0.000493f, 0.001974f, -0.001428f, 0.000267f, 0.000924f, -0.001769f, 0.000473f, 0.000650f, -0.000436f, 0.000634f, 0.000218f, 0.000373f, -0.001126f, -0.000081f, -0.000353f, 0.000721f, -0.000555f, 0.000403f, -0.001331f, -0.000251f, 0.000994f, 0.000495f, 0.000323f, -0.000322f, -0.000191f, -0.001005f, -0.001080f, 0.000614f, 0.000231f, -0.000028f, -0.000150f, -0.000074f, 0.000107f, 0.000117f, -0.000219f, -0.000201f, 0.000144f, 0.000165f, -0.000365f, -0.000273f, -0.000224f, -0.014887f, 0.004915f, -0.002612f, 0.000707f, -0.000217f, 0.000863f, -0.001089f, 0.001237f, -0.000465f, -0.000390f, -0.000119f, 0.000904f, -0.000443f, -0.000668f, 0.000539f, 0.001711f, -0.000203f, 0.000101f, -0.002788f, 0.000273f, 0.000074f, 0.001405f, -0.000418f, -0.000180f, -0.002125f, -0.000706f, 0.000054f, 0.000073f, 0.000776f, 0.001061f, -0.001600f, -0.001461f, 0.000991f, 0.000275f, -0.001651f, -0.001255f, 0.000657f, 0.000397f, + -0.000073f, -0.000016f, -0.000618f, 0.000691f, -0.000177f, 0.000273f, 0.000111f, -0.000846f, -0.000346f, 0.000503f, -0.001333f, -0.000646f, -0.000247f, 0.000320f, -0.000249f, 0.000057f, -0.000654f, -0.000025f, -0.000468f, 0.000081f, -0.014869f, 0.006610f, -0.003621f, 0.002787f, -0.002521f, 0.001282f, -0.002872f, 0.000688f, -0.001866f, 0.002998f, -0.001487f, 0.001073f, -0.000166f, 0.000044f, -0.001346f, -0.000366f, -0.000546f, 0.002717f, -0.000495f, 0.001399f, 0.002200f, 0.001277f, 0.000339f, -0.000267f, 0.000540f, -0.000452f, 0.001238f, 0.001207f, 0.000184f, -0.000569f, 0.000224f, 0.000252f, -0.000799f, -0.000340f, 0.000633f, 0.000914f, -0.000655f, -0.000629f, -0.000665f, 0.000072f, -0.000268f, 0.000407f, -0.000642f, 0.000496f, -0.001017f, 0.000332f, -0.000552f, -0.000009f, 0.000118f, -0.000380f, -0.000548f, -0.000682f, -0.000657f, -0.000856f, 0.000122f, -0.000778f, -0.000388f, 0.000032f, 0.005495f, 0.005712f, -0.002160f, 0.001879f, -0.002367f, 0.000326f, 0.000673f, 0.000028f, -0.000968f, 0.001039f, 0.000239f, 0.002244f, 0.001152f, 0.002539f, -0.000429f, 0.001485f, -0.000448f, 0.000938f, + 0.001318f, -0.000213f, -0.001912f, 0.001759f, -0.000231f, 0.000722f, -0.000456f, -0.000032f, 0.000220f, 0.002159f, 0.000289f, -0.001218f, -0.000440f, 0.000260f, -0.000692f, 0.001622f, 0.000667f, -0.000286f, -0.000467f, -0.000963f, 0.000698f, -0.000944f, 0.000902f, 0.000959f, -0.000766f, 0.000539f, 0.000474f, 0.000236f, -0.000111f, 0.001576f, 0.000953f, 0.001147f, -0.000085f, 0.000116f, 0.000487f, -0.000367f, -0.000172f, -0.000134f, -0.000386f, -0.000033f, 0.000044f, 0.000122f, -0.000326f, -0.000689f, -0.000735f, 0.000127f, 0.000354f, 0.016778f, -0.006038f, 0.002051f, -0.002841f, 0.001880f, -0.001884f, 0.002426f, -0.000880f, 0.000082f, -0.001882f, 0.003661f, -0.000568f, 0.003295f, 0.000170f, 0.000538f, -0.002268f, 0.000765f, 0.003308f, -0.001060f, -0.002854f, 0.000385f, 0.000081f, 0.001276f, -0.002069f, 0.001634f, -0.000056f, 0.000116f, -0.000217f, -0.001989f, -0.000615f, 0.000298f, -0.002396f, 0.000363f, 0.000918f, 0.000760f, -0.000703f, -0.000215f, -0.000130f, 0.001078f, 0.000291f, -0.000215f, -0.000525f, 0.000835f, 0.000552f, 0.002112f, 0.000509f, -0.000343f, 0.001150f, 0.000454f, + -0.000167f, 0.000371f, 0.000862f, 0.000574f, 0.000080f, 0.000120f, -0.000739f, 0.000127f, -0.000114f, 0.000863f, -0.000138f, 0.000328f, -0.000144f, 0.000293f, -0.000065f, 0.000271f, 0.005644f, -0.008118f, 0.004887f, -0.003602f, 0.001536f, 0.000563f, -0.000353f, -0.000294f, 0.000984f, -0.002034f, -0.001286f, -0.001048f, -0.000809f, -0.002787f, 0.001435f, -0.002588f, -0.000087f, -0.002069f, 0.000782f, -0.001555f, -0.001216f, -0.000613f, 0.002383f, 0.000342f, 0.002320f, 0.001219f, 0.001596f, 0.002288f, 0.000138f, -0.000280f, -0.000329f, 0.000651f, 0.001771f, -0.000138f, -0.000107f, -0.001161f, 0.000910f, -0.000135f, -0.000677f, 0.000656f, 0.000562f, 0.001835f, 0.000768f, 0.000868f, -0.001272f, -0.000597f, -0.000052f, -0.000235f, 0.000915f, -0.002611f, 0.000589f, -0.000638f, -0.000417f, -0.000807f, -0.000894f, -0.000306f, -0.000883f, 0.000373f, -0.000610f, -0.000101f, -0.001354f, -0.001353f, 0.000026f, -0.000480f, 0.001130f, -0.017232f, -0.003745f, 0.000817f, -0.003247f, -0.001327f, 0.000166f, -0.000078f, -0.002763f, 0.000824f, -0.002751f, 0.000106f, 0.002262f, -0.000393f, -0.000345f, 0.001251f, + 0.000832f, 0.001273f, 0.000101f, 0.001535f, -0.000810f, 0.000452f, 0.001781f, -0.000097f, -0.000082f, -0.001127f, 0.001697f, -0.001271f, -0.000681f, 0.000459f, 0.000705f, 0.001295f, 0.003961f, -0.001056f, -0.000610f, -0.001673f, 0.000126f, -0.001227f, 0.000329f, -0.000478f, -0.001819f, -0.000095f, 0.002397f, 0.000686f, -0.001565f, -0.000774f, 0.000817f, -0.000948f, -0.001178f, 0.000246f, -0.000539f, 0.000158f, 0.000282f, 0.001509f, 0.000245f, 0.000750f, 0.000425f, -0.001236f, -0.000610f, 0.000804f, 0.000770f, -0.000488f, 0.000473f, -0.000082f, -0.000547f, 0.000032f, -0.021153f, 0.017462f, -0.006102f, 0.005190f, -0.003822f, 0.002924f, -0.001109f, 0.001864f, -0.002028f, 0.001251f, 0.001456f, 0.002110f, -0.001372f, 0.002554f, 0.001261f, 0.004343f, -0.000681f, 0.000370f, -0.002299f, 0.000587f, -0.000808f, -0.001430f, -0.001782f, -0.002042f, -0.001888f, 0.002820f, -0.000130f, 0.003384f, 0.000874f, 0.000626f, -0.000060f, 0.000437f, -0.001495f, 0.000247f, -0.000548f, 0.000711f, 0.001997f, 0.000367f, 0.000655f, 0.000127f, 0.000204f, -0.001513f, -0.000839f, -0.000050f, -0.000122f, 0.000213f, + -0.000470f, -0.001392f, 0.000027f, 0.001514f, -0.000491f, 0.000454f, 0.000431f, -0.001232f, 0.000847f, 0.000378f, 0.000462f, -0.000245f, 0.000134f, -0.000124f, -0.000396f, 0.000122f, 0.001343f, 0.000024f, 0.000079f, 0.012301f, -0.001922f, -0.004003f, -0.001407f, -0.000864f, -0.000665f, -0.003529f, -0.001866f, 0.000951f, 0.000576f, 0.000974f, 0.001222f, -0.002380f, 0.000926f, -0.000488f, 0.000822f, 0.003752f, -0.003842f, 0.001294f, 0.001298f, 0.001003f, -0.001009f, -0.002234f, 0.001699f, 0.000488f, 0.001210f, 0.002303f, -0.000019f, 0.003183f, 0.000257f, 0.001467f, 0.000105f, 0.000987f, -0.000902f, 0.001189f, 0.000855f, 0.001134f, -0.000467f, 0.000361f, -0.000112f, 0.001461f, 0.001812f, -0.002738f, 0.003641f, 0.000288f, 0.001003f, 0.000138f, 0.000618f, 0.000688f, -0.000791f, 0.002174f, 0.001166f, 0.000063f, 0.001992f, 0.000834f, -0.001125f, -0.000113f, -0.000759f, -0.000818f, -0.000620f, 0.000344f, -0.000175f, 0.000104f, -0.000067f, -0.002265f, 0.001138f, -0.000910f, 0.000299f, -0.000322f, -0.000149f, -0.000576f, -0.000337f, 0.009748f, 0.000833f, 0.001970f, -0.002549f, -0.000499f, + -0.006301f, 0.001482f, -0.000323f, -0.004287f, 0.003556f, -0.001994f, 0.000105f, 0.002607f, 0.001158f, 0.001953f, -0.001534f, 0.000853f, -0.002003f, 0.000021f, -0.001717f, 0.000617f, -0.002598f, 0.003673f, 0.002638f, 0.002163f, 0.002514f, 0.000549f, -0.000865f, -0.001610f, 0.000693f, 0.002011f, -0.000020f, 0.001366f, -0.001024f, 0.000266f, 0.001316f, 0.000934f, 0.001182f, 0.000073f, 0.000407f, -0.000165f, -0.000888f, 0.000844f, -0.000623f, 0.000388f, 0.000325f, -0.000893f, 0.001173f, -0.001639f, 0.001427f, -0.000775f, 0.001001f, 0.001558f, -0.001944f, 0.000181f, 0.000195f, -0.000794f, -0.001538f, 0.001057f, -0.002477f, -0.001903f, 0.001147f, 0.000485f, 0.000519f, 0.000465f, 0.001495f, 0.001457f, -0.000560f, 0.000197f, 0.000861f, -0.000362f, -0.000037f, 0.015421f, -0.012801f, 0.004358f, -0.003178f, 0.001139f, 0.004014f, 0.003267f, -0.002137f, 0.003915f, 0.002208f, 0.002371f, -0.001606f, 0.001111f, -0.000815f, 0.004647f, 0.001297f, 0.001323f, 0.001803f, 0.001976f, 0.001252f, 0.001355f, -0.003799f, 0.000624f, -0.006873f, -0.002380f, -0.000631f, -0.003928f, 0.000998f, 0.002129f, + -0.001479f, -0.002124f, -0.002508f, -0.002400f, -0.001281f, 0.001403f, 0.001102f, -0.003489f, -0.004048f, -0.000296f, -0.002062f, 0.001122f, 0.000906f, 0.000402f, -0.000284f, 0.001935f, -0.001002f, 0.000114f, -0.000262f, -0.000843f, -0.002599f, 0.002035f, 0.003432f, -0.000446f, -0.000425f, 0.001628f, -0.002411f, 0.002950f, 0.000760f, -0.001468f, -0.000051f, -0.001362f, -0.000578f, -0.000331f, -0.000984f, -0.000245f, -0.000664f, -0.002002f, 0.000529f, 0.000745f, 0.000685f, 0.000739f, 0.000234f, -0.023798f, 0.002420f, -0.002076f, 0.000928f, 0.002482f, 0.001797f, 0.004917f, -0.001948f, -0.000118f, 0.000444f, 0.005875f, 0.002074f, -0.004512f, -0.002929f, 0.002620f, 0.003497f, -0.000815f, -0.001251f, -0.000046f, 0.001640f, 0.003610f, 0.003669f, -0.000003f, -0.006426f, -0.001824f, -0.000619f, -0.000729f, 0.003808f, -0.001678f, 0.002244f, 0.000264f, -0.000362f, -0.003313f, 0.000315f, 0.002724f, -0.004250f, -0.002473f, -0.000962f, -0.000706f, -0.001990f, -0.001657f, -0.003970f, -0.000696f, -0.002677f, 0.000071f, 0.000637f, 0.002942f, -0.001928f, -0.001256f, 0.000296f, -0.000247f, 0.000498f, -0.002453f, + 0.001026f, 0.000992f, 0.000359f, 0.000184f, -0.001842f, -0.001671f, -0.000908f, -0.000496f, -0.000103f, -0.003186f, 0.000702f, 0.000983f, -0.001348f, -0.002925f, 0.001232f, -0.000103f, -0.001442f, -0.000253f, -0.000647f, -0.000455f, 0.001922f, -0.014046f, 0.014828f, -0.002163f, 0.000902f, 0.003463f, 0.004164f, -0.003205f, 0.001986f, 0.000758f, 0.002559f, 0.001716f, 0.003628f, 0.002027f, -0.002514f, -0.004164f, 0.000553f, 0.004318f, 0.008680f, -0.002150f, -0.002991f, 0.002236f, 0.001384f, -0.001712f, -0.004323f, -0.000922f, -0.000893f, -0.003932f, 0.003371f, 0.004001f, 0.000035f, 0.000892f, -0.000109f, 0.003134f, -0.002513f, -0.007753f, 0.003221f, -0.000977f, 0.002551f, 0.001181f, 0.000084f, -0.001961f, -0.002985f, 0.001996f, 0.002403f, 0.001716f, -0.000368f, -0.000215f, 0.002646f, 0.001442f, 0.000801f, -0.001647f, 0.002225f, 0.001818f, -0.000331f, -0.000642f, -0.001323f, 0.001480f, 0.000031f, -0.003861f, 0.003109f, 0.001811f, -0.000726f, 0.000836f, -0.000490f, 0.000040f, -0.000089f, 0.000865f, 0.000230f, 0.001077f, 0.001830f, 0.000922f, -0.000295f, -0.001182f, -0.000751f, 0.002633f, + 0.001034f, -0.000526f, -0.000839f, -0.000156f, 0.004163f, 0.000150f, -0.003249f, -0.006626f, 0.001572f, -0.000366f, -0.005476f, 0.001821f, -0.001831f, 0.000235f, -0.002091f, -0.001628f, 0.001690f, 0.004129f, 0.000484f, 0.005477f, 0.002466f, -0.002784f, -0.003664f, 0.005996f, -0.002637f, -0.000210f, 0.000509f, -0.005661f, -0.000073f, 0.002970f, -0.003306f, -0.000885f, 0.003749f, 0.000224f, 0.001943f, 0.000044f, 0.002457f, -0.000435f, -0.001721f, -0.000240f, 0.003272f, 0.004449f, -0.001496f, 0.000893f, 0.000742f, 0.002964f, -0.001806f, -0.000323f, 0.000545f, -0.000764f, 0.001896f, 0.000862f, 0.000124f, -0.001024f, 0.001508f, 0.001707f, 0.000053f, 0.000075f, 0.001248f, 0.001999f, -0.002450f, -0.000017f, 0.000635f, 0.001095f, -0.001274f, 0.000992f, 0.000456f, 0.000028f, 0.000660f, -0.000769f, 0.000296f, 0.000793f, 0.001626f, 0.002008f, -0.001665f, 0.000179f, 0.031211f, -0.003055f, 0.000472f, 0.001899f, -0.002852f, -0.004895f, -0.002864f, -0.001255f, -0.005558f, -0.005969f, 0.000409f, -0.005293f, -0.002349f, -0.001564f, -0.001334f, 0.003173f, 0.003714f, 0.001139f, 0.007822f, 0.001377f, + -0.003935f, 0.006724f, -0.000719f, 0.004747f, -0.001573f, -0.000554f, -0.004500f, 0.000118f, 0.003911f, -0.000186f, -0.001961f, -0.000816f, 0.000367f, -0.001042f, -0.000871f, 0.001472f, -0.003589f, 0.001388f, 0.000498f, -0.001738f, -0.003405f, -0.002340f, 0.002565f, 0.002505f, 0.003020f, -0.005208f, 0.002862f, 0.000739f, -0.000154f, 0.000177f, 0.000481f, 0.000511f, 0.000639f, -0.000497f, 0.000246f, 0.002665f, -0.000796f, 0.001012f, 0.001250f, -0.001195f, 0.002234f, 0.002528f, 0.000407f, -0.000293f, 0.002366f, 0.001643f, 0.001296f, 0.001547f, -0.002034f, -0.000995f, 0.000441f, -0.000287f, -0.000321f, 0.000067f, 0.001047f, 0.000220f, -0.001971f, -0.018325f, -0.030764f, 0.011182f, -0.000751f, 0.004671f, -0.005360f, 0.000288f, -0.006214f, -0.000776f, -0.008974f, 0.003924f, 0.004180f, -0.000167f, -0.000675f, -0.000078f, 0.000864f, -0.002120f, -0.007649f, 0.014165f, 0.001004f, -0.001777f, 0.004869f, 0.000895f, -0.002532f, 0.006819f, 0.007561f, -0.003205f, 0.004469f, 0.000899f, -0.000941f, -0.007036f, -0.003852f, 0.005560f, -0.002824f, 0.000815f, -0.000364f, 0.003792f, -0.005750f, -0.006448f, + 0.000933f, 0.000130f, -0.004368f, 0.002681f, 0.000552f, -0.002700f, 0.001948f, -0.002978f, -0.002499f, 0.001231f, 0.001161f, 0.000194f, -0.000798f, -0.001386f, 0.001805f, 0.003056f, 0.000448f, 0.000985f, -0.000862f, -0.000834f, 0.002645f, 0.000350f, 0.000596f, -0.002656f, -0.000617f, -0.001762f, 0.001487f, 0.002240f, 0.000022f, 0.001850f, -0.000025f, 0.002454f, -0.001957f, 0.001248f, -0.000029f, -0.000083f, -0.001850f, 0.000013f, -0.001587f, -0.000177f, -0.009875f, 0.029792f, -0.013192f, 0.002260f, 0.001976f, 0.007496f, -0.000919f, 0.004799f, -0.004681f, 0.000326f, -0.009002f, -0.001691f, 0.000071f, 0.003676f, 0.000629f, 0.003785f, -0.002564f, -0.005443f, 0.000733f, -0.008207f, -0.008668f, 0.000295f, -0.002833f, -0.000116f, 0.000765f, 0.001291f, -0.002134f, -0.001395f, -0.003082f, -0.004657f, 0.001914f, 0.002329f, -0.006107f, -0.002723f, -0.007683f, 0.000174f, -0.003384f, 0.002822f, 0.003256f, -0.006291f, 0.001018f, 0.005294f, 0.004731f, -0.002387f, 0.001733f, -0.001747f, -0.000881f, 0.001537f, -0.002858f, -0.000555f, 0.002688f, 0.002151f, 0.001846f, 0.002311f, 0.001213f, -0.000602f, + 0.001777f, 0.001231f, -0.001311f, -0.000000f, 0.003612f, -0.000309f, -0.001650f, -0.000457f, 0.001494f, -0.001472f, -0.003678f, -0.000195f, -0.001281f, 0.001015f, 0.000789f, -0.000464f, -0.001489f, -0.002146f, -0.002595f, 0.002708f, -0.000879f, -0.000028f, -0.000581f, -0.000110f, -0.000324f, -0.024509f, -0.007538f, 0.002846f, -0.003808f, 0.003586f, -0.001543f, 0.000112f, -0.007168f, -0.008630f, -0.001103f, -0.002971f, 0.003725f, 0.001115f, -0.000979f, -0.017920f, 0.009114f, 0.000717f, 0.007953f, 0.009866f, 0.006854f, -0.009334f, -0.002215f, -0.000837f, -0.002268f, 0.002104f, 0.002315f, -0.000088f, -0.003345f, 0.003880f, -0.006281f, -0.003329f, 0.005733f, 0.000364f, -0.002349f, 0.006683f, 0.000233f, 0.007007f, -0.002312f, -0.001037f, 0.000911f, 0.002244f, -0.004879f, -0.003595f, -0.000787f, 0.003978f, -0.001335f, 0.000705f, -0.001476f, 0.002681f, 0.003364f, 0.000706f, 0.000264f, -0.005690f, -0.000510f, 0.002889f, 0.003251f, -0.001734f, 0.003632f, 0.001235f, -0.000887f, 0.000993f, -0.003504f, -0.001056f, -0.002314f, 0.002441f, 0.000466f, -0.000774f, 0.000951f, -0.006077f, 0.000134f, 0.001239f, + 0.003038f, 0.001038f, -0.001514f, 0.002913f, 0.000367f, -0.003805f, -0.001664f, -0.001919f, -0.000448f, 0.000883f, 0.015647f, 0.005219f, -0.009558f, -0.001705f, -0.004170f, 0.003209f, -0.005807f, 0.004692f, -0.001159f, 0.005472f, 0.003765f, 0.006662f, -0.009167f, 0.010824f, -0.006788f, 0.006305f, -0.003759f, 0.003754f, 0.000620f, 0.003179f, -0.005902f, -0.013369f, 0.005064f, 0.009204f, -0.003463f, 0.003745f, -0.004814f, 0.001057f, -0.003197f, 0.009685f, -0.000195f, -0.001012f, 0.002221f, -0.004778f, -0.003395f, -0.002819f, 0.004168f, -0.000002f, -0.001679f, -0.000040f, -0.000948f, 0.006644f, 0.004378f, -0.002544f, 0.002061f, 0.002503f, -0.002885f, -0.001651f, -0.002610f, -0.005108f, -0.000807f, 0.000064f, -0.000796f, -0.001903f, -0.005251f, -0.000251f, 0.007740f, 0.004221f, -0.003392f, 0.004344f, -0.000583f, -0.000114f, 0.003565f, 0.001884f, -0.003859f, 0.001376f, 0.000720f, 0.003830f, 0.004518f, -0.003718f, 0.001554f, 0.002669f, 0.003421f, -0.000349f, -0.000222f, -0.001308f, -0.000767f, 0.001953f, -0.000446f, 0.003580f, -0.000935f, 0.033353f, -0.027169f, -0.004544f, 0.001372f, -0.000509f, + -0.007502f, 0.002537f, 0.001977f, 0.010663f, -0.003476f, 0.002110f, 0.008757f, 0.000254f, 0.005269f, 0.017313f, -0.003752f, -0.001108f, -0.008996f, -0.008399f, 0.000391f, 0.002881f, -0.003794f, 0.001661f, 0.015251f, 0.008842f, 0.001269f, 0.000598f, 0.001243f, 0.008462f, -0.007040f, -0.003091f, -0.000390f, 0.004377f, -0.000676f, 0.001071f, -0.003572f, 0.001374f, -0.006345f, -0.003705f, -0.004798f, 0.000105f, -0.004298f, 0.001056f, -0.007654f, 0.003559f, -0.015292f, -0.003884f, 0.002094f, 0.002854f, -0.000576f, -0.003494f, 0.001179f, 0.000483f, 0.001828f, -0.004150f, 0.001856f, -0.002416f, -0.002771f, -0.006714f, -0.005035f, -0.001450f, -0.000848f, 0.000366f, 0.001138f, 0.002198f, 0.000404f, 0.001069f, -0.004035f, 0.000008f, -0.004924f, -0.000704f, -0.000348f, 0.000168f, 0.001626f, 0.004944f, -0.003080f, -0.001331f, -0.000335f, -0.002579f, -0.004547f, 0.001053f, -0.021004f, -0.014597f, -0.001011f, -0.002897f, 0.011125f, 0.000437f, 0.002118f, -0.013758f, 0.000791f, 0.001976f, 0.000868f, 0.001142f, 0.008421f, -0.010326f, 0.002275f, -0.002145f, -0.007096f, -0.003401f, 0.006689f, -0.002239f, + 0.005458f, -0.001763f, 0.003192f, 0.001768f, -0.001045f, -0.000742f, 0.003604f, -0.000399f, 0.000015f, -0.008827f, 0.004472f, 0.004069f, 0.003835f, 0.004421f, -0.007933f, -0.008163f, 0.004861f, 0.007230f, -0.008536f, 0.003247f, 0.001292f, 0.007509f, 0.004331f, 0.000795f, 0.005050f, -0.002548f, -0.005134f, -0.000700f, -0.009949f, -0.007222f, -0.000768f, -0.000287f, 0.001632f, -0.004687f, 0.001704f, -0.003742f, -0.012769f, -0.003673f, -0.003417f, -0.012555f, 0.000057f, -0.001980f, -0.001443f, 0.001529f, 0.003968f, -0.003634f, 0.002458f, 0.001693f, -0.005679f, -0.003561f, -0.004359f, -0.000850f, -0.001273f, -0.000030f, -0.001786f, 0.002511f, -0.002752f, -0.000619f, -0.002336f, 0.004242f, -0.004574f, 0.002831f, -0.000706f, -0.000927f, 0.000270f, 0.001262f, -0.001062f, -0.013116f, 0.020068f, -0.010479f, -0.004445f, -0.006116f, 0.001628f, 0.001755f, 0.002998f, -0.001239f, 0.008790f, 0.006621f, -0.006229f, -0.011118f, 0.004225f, -0.004157f, 0.010308f, 0.000868f, 0.004434f, 0.005409f, -0.003824f, -0.003743f, 0.013683f, -0.007786f, -0.001823f, -0.003944f, 0.000541f, -0.001615f, 0.001874f, -0.002289f, + -0.000840f, -0.010493f, 0.009342f, -0.003222f, -0.000756f, 0.010988f, -0.007445f, -0.009462f, 0.000932f, -0.004286f, -0.006160f, -0.000026f, -0.003120f, 0.002499f, -0.013596f, -0.004531f, -0.003278f, -0.000313f, 0.004896f, 0.000076f, 0.001041f, 0.002506f, -0.002264f, 0.001917f, 0.003302f, 0.002794f, 0.003138f, -0.001737f, -0.002814f, -0.002521f, 0.003559f, -0.008263f, -0.001722f, -0.001938f, -0.001957f, 0.005424f, -0.003578f, -0.005780f, 0.005957f, 0.001798f, 0.003623f, 0.006967f, -0.002460f, -0.002313f, 0.003530f, -0.003752f, -0.004666f, -0.004378f, 0.002703f, 0.002004f, -0.002491f, 0.002406f, 0.000897f, 0.002836f, 0.000605f, -0.005224f, 0.003598f, -0.001734f, -0.027456f, 0.013827f, 0.014891f, 0.007660f, 0.006959f, -0.004862f, 0.007072f, -0.011827f, 0.000447f, -0.013906f, -0.001782f, -0.006037f, 0.006540f, -0.006619f, -0.005493f, -0.001458f, -0.010194f, 0.003069f, -0.004635f, 0.004584f, -0.009569f, 0.016094f, -0.005227f, 0.007635f, -0.006543f, 0.000705f, -0.006556f, -0.002052f, 0.003671f, 0.010327f, 0.011553f, -0.005711f, 0.000079f, -0.003350f, -0.006049f, -0.004586f, -0.016413f, -0.000339f, + 0.002787f, -0.015416f, 0.006064f, 0.003105f, 0.004267f, 0.007458f, 0.004696f, 0.002537f, -0.005170f, -0.001646f, -0.005770f, -0.002890f, 0.003127f, -0.012319f, 0.004903f, 0.002475f, 0.000815f, -0.005794f, -0.003427f, 0.003230f, 0.009995f, 0.004248f, 0.002600f, -0.003882f, 0.004179f, 0.000629f, -0.004716f, 0.001326f, -0.003407f, -0.005349f, -0.002797f, -0.001226f, -0.004876f, 0.005616f, 0.003169f, 0.004580f, 0.002530f, -0.004025f, 0.001354f, 0.007005f, -0.001364f, 0.006510f, 0.003439f, 0.002437f, 0.004364f, -0.002228f, -0.002603f, 0.001730f, 0.001140f, 0.022886f, -0.015598f, -0.006494f, -0.001913f, 0.000004f, 0.011184f, -0.002028f, 0.003715f, -0.006327f, 0.003518f, -0.003907f, -0.017942f, -0.012320f, -0.004539f, 0.006526f, -0.000695f, -0.009893f, -0.009259f, -0.019590f, -0.006267f, 0.002577f, 0.002734f, 0.000969f, -0.001949f, -0.001100f, -0.006019f, 0.001653f, 0.002633f, 0.003395f, 0.000840f, -0.000844f, -0.002281f, -0.009321f, -0.002317f, -0.002079f, 0.004790f, -0.000930f, -0.007408f, -0.002889f, 0.002239f, -0.008356f, 0.001514f, -0.008620f, 0.004899f, 0.006824f, -0.006368f, -0.012498f, + -0.002356f, -0.003900f, -0.005675f, 0.000648f, 0.001205f, 0.001279f, 0.003149f, 0.000200f, -0.004858f, 0.007908f, 0.012286f, -0.005855f, 0.005134f, 0.002084f, 0.005856f, -0.008812f, 0.003404f, 0.001159f, 0.003222f, -0.012694f, 0.010128f, 0.001254f, 0.001196f, -0.001517f, -0.007210f, 0.001922f, 0.000981f, 0.001814f, 0.002280f, -0.007904f, -0.004133f, 0.001593f, 0.003783f, -0.001980f, 0.000049f, 0.002975f, 0.001223f, -0.001405f, -0.003749f, 0.002777f, 0.037062f, -0.020719f, 0.001890f, -0.002088f, -0.004422f, -0.015461f, -0.000842f, -0.000862f, 0.012568f, 0.005744f, 0.025398f, -0.010111f, 0.000967f, 0.002773f, 0.006075f, -0.002606f, -0.001185f, 0.010294f, -0.006479f, 0.014819f, 0.008975f, -0.020613f, 0.019628f, 0.006918f, -0.007104f, -0.005126f, -0.007749f, -0.004039f, 0.001392f, 0.000896f, -0.005578f, 0.013046f, 0.001652f, -0.006261f, -0.005561f, 0.001267f, -0.006880f, -0.012119f, 0.000091f, 0.007224f, 0.002849f, 0.008787f, -0.004114f, 0.002730f, 0.009388f, 0.013544f, 0.003163f, -0.014027f, 0.004567f, -0.004518f, -0.007768f, 0.002039f, 0.005891f, 0.003407f, -0.001755f, -0.012729f, + -0.011188f, 0.015698f, -0.002121f, 0.012132f, 0.001340f, -0.004779f, 0.005895f, -0.010520f, -0.004715f, 0.005076f, -0.001417f, 0.010439f, -0.008450f, -0.016616f, -0.004730f, -0.000810f, -0.005172f, -0.003979f, 0.010271f, -0.003454f, 0.001830f, -0.009484f, -0.009343f, 0.004544f, 0.002305f, 0.003830f, -0.004116f, 0.003911f, 0.000318f, -0.002204f, -0.000562f, -0.041733f, -0.027091f, 0.010055f, -0.014039f, 0.004588f, -0.006976f, -0.025220f, -0.018643f, 0.033855f, -0.015468f, 0.015331f, 0.008691f, -0.008742f, 0.007943f, -0.004928f, 0.010708f, 0.011865f, -0.000688f, -0.003269f, 0.020313f, -0.006502f, -0.022801f, 0.000451f, -0.009509f, 0.002412f, 0.002234f, 0.013773f, 0.007328f, 0.002927f, 0.006773f, -0.006085f, 0.000067f, 0.015075f, 0.009654f, -0.002627f, 0.003927f, -0.013167f, -0.020413f, -0.015015f, -0.010492f, -0.002883f, -0.002853f, 0.003869f, -0.001851f, -0.005626f, 0.013183f, 0.003531f, -0.009809f, -0.009151f, -0.002604f, 0.003894f, -0.009885f, 0.004051f, 0.012300f, -0.000168f, 0.004640f, -0.008334f, 0.006582f, 0.004832f, 0.001558f, 0.004927f, -0.007353f, -0.011364f, -0.016064f, 0.008171f, + 0.006394f, 0.000635f, 0.006345f, 0.001272f, -0.007348f, -0.001477f, 0.000608f, -0.012807f, -0.001130f, -0.019940f, -0.010965f, 0.003425f, -0.005073f, 0.003921f, 0.000512f, -0.002567f, -0.002695f, -0.001802f, -0.003692f, 0.003632f, 0.000136f, -0.000511f, -0.049908f, 0.017115f, -0.003898f, -0.003197f, 0.009008f, 0.002276f, 0.005056f, 0.021864f, 0.013072f, 0.016535f, 0.008344f, 0.022549f, -0.003878f, -0.021787f, 0.003292f, -0.002368f, -0.009311f, -0.019288f, -0.008393f, 0.017039f, 0.003903f, -0.001077f, 0.003594f, -0.001194f, 0.000295f, 0.014379f, 0.001868f, 0.005398f, -0.002108f, 0.003635f, 0.014277f, -0.003833f, -0.009521f, 0.007333f, -0.016948f, -0.016970f, -0.010934f, -0.002054f, 0.000513f, 0.007183f, 0.016712f, 0.000367f, -0.005716f, -0.016508f, -0.027197f, -0.009470f, -0.003940f, -0.001512f, -0.000151f, 0.010169f, -0.012451f, 0.022598f, 0.011708f, -0.002014f, 0.006494f, -0.008728f, 0.001635f, 0.000312f, 0.010420f, 0.020215f, 0.013568f, -0.011687f, -0.004950f, 0.003497f, -0.001891f, -0.002377f, 0.001049f, -0.005960f, -0.019449f, -0.001325f, -0.003580f, -0.001244f, 0.003058f, -0.007423f, + -0.002552f, -0.013120f, -0.001408f, 0.002029f, 0.013911f, 0.006993f, 0.001953f, 0.002417f, 0.003513f, 0.000614f, -0.011774f, 0.002608f, -0.002746f, 0.003329f, -0.001441f, -0.001360f, -0.006452f, 0.020193f, 0.020442f, 0.006855f, 0.013634f, 0.009800f, 0.021458f, -0.019114f, 0.022315f, -0.027523f, -0.004938f, 0.025491f, 0.035005f, 0.007208f, -0.002355f, 0.012669f, -0.010919f, -0.012708f, 0.025292f, 0.003981f, -0.004035f, 0.006072f, 0.020312f, -0.005488f, 0.012414f, -0.004221f, -0.005234f, -0.002567f, 0.009107f, -0.023779f, -0.003000f, 0.011380f, -0.005361f, 0.001091f, -0.008483f, 0.004792f, 0.018630f, -0.017403f, 0.005477f, -0.005239f, 0.006022f, -0.009158f, 0.012486f, 0.000955f, 0.004449f, 0.004988f, -0.021053f, 0.010124f, -0.029272f, -0.006056f, 0.016444f, 0.001666f, -0.010513f, 0.018156f, -0.006397f, -0.011142f, 0.013171f, -0.005575f, -0.003874f, -0.002215f, 0.007925f, -0.001327f, 0.002033f, -0.016057f, 0.005711f, 0.001349f, 0.031084f, -0.023560f, -0.010286f, 0.002652f, -0.006104f, 0.006897f, 0.008714f, -0.011407f, 0.021721f, 0.008015f, -0.000169f, 0.003437f, 0.007232f, -0.003679f, + -0.011886f, 0.004519f, -0.006163f, 0.001800f, -0.002470f, 0.005530f, -0.007556f, 0.002130f, 0.000013f, -0.004133f, 0.004953f, -0.001912f, 0.041689f, -0.026158f, 0.000957f, -0.004240f, -0.007018f, 0.000794f, -0.009584f, -0.004098f, -0.030923f, -0.025914f, -0.025781f, 0.008548f, -0.005407f, 0.008444f, -0.005914f, -0.018792f, 0.029824f, 0.020723f, -0.013898f, -0.011733f, -0.016400f, -0.003515f, 0.006368f, 0.009757f, 0.012060f, -0.000950f, 0.009332f, -0.002790f, -0.011826f, -0.014516f, 0.008994f, -0.006671f, 0.027247f, 0.016967f, 0.025133f, 0.003424f, 0.009135f, 0.024642f, 0.017158f, -0.005556f, 0.004520f, -0.001229f, 0.000310f, 0.002495f, -0.011537f, -0.008441f, 0.004453f, -0.014569f, -0.014861f, 0.014258f, 0.016386f, -0.018096f, -0.000576f, 0.031751f, 0.022235f, -0.001290f, -0.010526f, -0.002475f, 0.006631f, 0.005839f, -0.004290f, -0.012039f, 0.014284f, -0.001120f, 0.003524f, 0.010044f, 0.012997f, -0.013740f, 0.005865f, -0.002398f, 0.005430f, -0.021271f, 0.003945f, 0.018864f, -0.018914f, -0.015761f, -0.008028f, 0.008271f, 0.015082f, -0.008681f, 0.008326f, -0.007513f, -0.000684f, 0.000237f, + 0.003196f, 0.005426f, -0.002558f, -0.001368f, 0.003489f, 0.002950f, 0.000113f, -0.000641f, 0.002548f, 0.033810f, 0.013011f, -0.004524f, -0.001100f, 0.010600f, -0.012669f, -0.016472f, 0.014113f, -0.019678f, -0.025479f, 0.006763f, -0.013676f, -0.017623f, -0.009198f, 0.016827f, 0.041281f, 0.017085f, -0.022474f, 0.042285f, 0.004904f, -0.006629f, 0.007617f, -0.024693f, 0.006278f, 0.003411f, -0.017703f, 0.015310f, -0.004763f, 0.003022f, -0.012747f, 0.007160f, -0.011649f, 0.021401f, -0.025347f, -0.009334f, -0.008758f, 0.012075f, 0.013933f, 0.012418f, -0.013472f, 0.003940f, -0.014084f, -0.004041f, 0.007505f, 0.017889f, 0.008257f, -0.008216f, 0.017423f, 0.008889f, 0.014055f, 0.000945f, 0.016384f, -0.007163f, 0.009059f, -0.024941f, 0.028026f, -0.002429f, 0.003903f, -0.007427f, -0.014611f, 0.000753f, 0.009362f, 0.022393f, 0.006584f, -0.026771f, 0.011420f, -0.010826f, 0.022060f, 0.001916f, -0.008420f, 0.004284f, -0.007281f, 0.004610f, -0.015591f, 0.006247f, 0.001489f, 0.001376f, 0.002499f, -0.003035f, 0.001611f, -0.004181f, -0.006533f, 0.008755f, 0.005479f, 0.005058f, -0.011558f, 0.003836f, + -0.006268f, 0.005424f, 0.001218f, -0.000688f, 0.002708f, 0.001325f, -0.069347f, 0.002961f, 0.011498f, 0.027122f, 0.008851f, -0.042694f, 0.056661f, 0.020721f, -0.026081f, 0.009265f, 0.056356f, 0.012603f, -0.013802f, -0.001789f, -0.034297f, 0.017496f, 0.001538f, -0.008824f, 0.004838f, 0.011635f, -0.022271f, 0.011783f, -0.027885f, 0.002862f, -0.025422f, -0.022849f, -0.009782f, 0.010636f, 0.016208f, -0.012525f, 0.014165f, -0.024775f, -0.003633f, 0.027675f, 0.002483f, -0.010078f, -0.003341f, 0.005352f, -0.006507f, -0.018390f, -0.020526f, -0.002775f, -0.009465f, 0.019977f, -0.028215f, 0.029743f, 0.009417f, 0.003758f, -0.010058f, -0.003329f, 0.013713f, -0.011222f, 0.018527f, 0.004566f, 0.016740f, -0.006253f, -0.009835f, -0.029504f, 0.009990f, -0.003019f, -0.030442f, 0.009069f, -0.002134f, 0.018442f, 0.029681f, -0.012615f, 0.006678f, 0.014639f, 0.015567f, 0.003169f, -0.009173f, -0.001814f, -0.036851f, -0.001834f, 0.003262f, 0.009042f, -0.000288f, 0.024672f, 0.005251f, 0.012252f, -0.013989f, -0.009970f, 0.018386f, -0.001925f, -0.003866f, 0.011165f, -0.002707f, -0.003169f, -0.000319f, -0.000642f, + 0.001093f, -0.002027f, 0.010198f, 0.085892f, 0.039158f, 0.008163f, 0.013966f, -0.017580f, -0.011799f, -0.004142f, 0.032466f, -0.022976f, 0.003696f, -0.019112f, -0.052787f, -0.025295f, 0.012121f, -0.013465f, 0.008730f, -0.020894f, -0.001049f, -0.022468f, 0.019310f, -0.022748f, -0.016375f, -0.048964f, -0.009130f, -0.007670f, -0.012868f, 0.025548f, -0.008288f, -0.020415f, 0.006660f, 0.019717f, 0.007311f, 0.006712f, -0.002933f, -0.004108f, -0.012946f, 0.010068f, -0.016668f, -0.004474f, -0.010357f, -0.029184f, 0.004453f, -0.020243f, 0.008188f, 0.002639f, -0.005948f, -0.000633f, -0.021283f, -0.001188f, -0.004843f, 0.031158f, -0.008962f, -0.000715f, 0.012666f, -0.017053f, -0.007579f, 0.031619f, -0.018442f, 0.012099f, 0.000828f, 0.028123f, 0.039933f, -0.002333f, 0.005162f, 0.004000f, 0.013818f, 0.007236f, -0.030464f, 0.002807f, 0.007704f, 0.010761f, -0.013038f, -0.020279f, 0.002132f, 0.005902f, -0.005304f, -0.007706f, -0.032679f, -0.016120f, -0.018796f, 0.001322f, 0.004128f, -0.006158f, -0.008982f, -0.010200f, -0.002505f, -0.005119f, -0.005719f, 0.006811f, -0.003208f, 0.003300f, -0.011759f, 0.000842f, + -0.004543f, -0.008146f, 0.001910f, 0.004789f, -0.006344f}, + {-0.000043f, -0.000012f, -0.000046f, 0.000003f, -0.000030f, 0.000068f, 0.000045f, -0.000216f, 0.000003f, -0.000141f, -0.000168f, 0.000045f, 0.000141f, 0.000137f, 0.000050f, -0.000312f, -0.000191f, 0.000062f, -0.000098f, 0.000016f, 0.000063f, 0.000081f, 0.000131f, -0.000097f, -0.000106f, -0.000197f, -0.000114f, -0.000001f, -0.000448f, -0.000010f, -0.000045f, -0.000131f, 0.000092f, -0.000259f, -0.000226f, -0.000459f, -0.000064f, -0.000406f, -0.000125f, -0.000011f, 0.000322f, 0.000088f, 0.000246f, -0.000128f, 0.000261f, -0.000071f, 0.000051f, 0.000314f, 0.001946f, -0.001525f, 0.000949f, -0.001206f, 0.000614f, -0.000588f, -0.000581f, -0.000350f, -0.000331f, 0.000351f, 0.000403f, -0.001493f, -0.000083f, 0.000219f, -0.000150f, -0.000251f, -0.000875f, -0.000319f, 0.000621f, 0.000943f, 0.000471f, 0.001487f, 0.000301f, -0.000265f, 0.000304f, 0.000257f, -0.000154f, 0.000486f, 0.001056f, -0.000406f, -0.000012f, 0.000451f, -0.000015f, -0.000103f, -0.000759f, -0.000029f, 0.000383f, 0.000308f, 0.000061f, 0.000022f, -0.000253f, 0.000268f, -0.000029f, 0.000033f, 0.000014f, -0.000258f, 0.007057f, -0.000467f, + 0.000608f, -0.000454f, 0.000448f, -0.000544f, 0.000106f, -0.000139f, -0.000132f, 0.000398f, -0.000380f, -0.001290f, 0.000363f, 0.000125f, 0.000390f, 0.000860f, 0.000457f, 0.000304f, -0.000123f, -0.000751f, -0.000262f, 0.000335f, -0.000108f, -0.000128f, 0.000718f, -0.000927f, -0.000298f, -0.000023f, -0.000164f, -0.000235f, 0.000342f, 0.000375f, 0.000467f, 0.000126f, 0.000162f, -0.000202f, 0.000650f, -0.000037f, 0.000497f, 0.000347f, -0.000124f, -0.000074f, 0.000233f, -0.000002f, -0.000147f, -0.000075f, 0.000001f, 0.005198f, -0.004955f, 0.000785f, -0.001335f, 0.000725f, -0.000085f, 0.000525f, -0.000470f, 0.000940f, -0.000392f, 0.000572f, -0.001180f, 0.000053f, -0.000682f, 0.000203f, -0.000104f, -0.000156f, -0.000314f, -0.000865f, -0.000084f, 0.000110f, -0.000425f, 0.000721f, -0.000318f, -0.000512f, -0.000651f, 0.000399f, -0.000415f, 0.001023f, -0.000102f, 0.000010f, 0.000303f, 0.000011f, 0.000026f, -0.000445f, -0.000377f, -0.000098f, 0.000107f, -0.000166f, -0.000434f, 0.000396f, 0.000281f, 0.000705f, -0.000159f, 0.000237f, -0.000094f, 0.000138f, -0.012165f, 0.001445f, -0.000898f, 0.000042f, + -0.000125f, -0.001006f, 0.001121f, -0.000256f, 0.000114f, 0.000483f, 0.000157f, 0.001297f, -0.000048f, -0.000506f, 0.001551f, 0.000637f, 0.001401f, -0.000013f, -0.001822f, -0.001084f, -0.000871f, 0.000774f, -0.000944f, 0.000096f, -0.000334f, -0.000308f, 0.000126f, 0.000301f, -0.000264f, -0.000560f, -0.000415f, 0.000388f, 0.000434f, 0.000818f, -0.000050f, -0.000095f, -0.000037f, 0.000513f, -0.000543f, 0.000161f, 0.000233f, 0.000385f, -0.000440f, 0.000491f, -0.000536f, -0.000080f, 0.000197f, -0.015368f, 0.005593f, -0.002231f, 0.002597f, -0.001774f, 0.001201f, -0.001925f, 0.001122f, -0.001425f, 0.000575f, 0.001089f, 0.000073f, 0.000428f, 0.001002f, -0.000616f, 0.000726f, -0.000795f, -0.000578f, -0.001775f, 0.001653f, -0.001036f, 0.001115f, 0.000098f, 0.000016f, -0.001702f, -0.000040f, 0.000348f, -0.000221f, -0.000041f, -0.000041f, 0.000733f, -0.000083f, -0.000488f, 0.000567f, 0.000181f, -0.000195f, 0.000051f, 0.000049f, 0.000077f, 0.000338f, -0.000449f, 0.001219f, -0.000082f, -0.000722f, -0.000062f, -0.000381f, -0.000028f, 0.000757f, 0.006997f, -0.001505f, 0.002654f, -0.001219f, 0.000911f, + -0.000989f, 0.003308f, -0.000638f, 0.001765f, -0.000204f, -0.000130f, 0.000447f, -0.000002f, -0.002275f, 0.000516f, -0.000206f, -0.001026f, -0.000249f, 0.000038f, -0.002862f, -0.000079f, 0.000235f, 0.000904f, -0.000022f, -0.000544f, -0.000111f, 0.000980f, 0.000180f, -0.000486f, -0.000963f, 0.001472f, -0.000913f, -0.000036f, -0.001361f, -0.000150f, 0.000004f, 0.000237f, -0.000331f, 0.000361f, 0.000589f, -0.000576f, 0.000467f, -0.000022f, 0.000373f, -0.000021f, 0.000675f, -0.000340f, -0.000204f, 0.000608f, 0.000849f, 0.018429f, -0.005417f, 0.000770f, -0.000947f, 0.001181f, -0.000021f, -0.000047f, -0.002517f, 0.001081f, -0.001120f, 0.000729f, 0.000231f, 0.000359f, 0.000766f, 0.001217f, 0.000159f, 0.000404f, -0.002124f, 0.000738f, 0.000737f, -0.001374f, -0.000296f, 0.001386f, 0.000880f, 0.000875f, 0.001972f, 0.001096f, 0.000257f, 0.000505f, -0.000788f, 0.000611f, -0.000216f, 0.001129f, 0.001465f, -0.000238f, 0.000469f, 0.000918f, -0.000435f, 0.000301f, -0.001345f, -0.000377f, 0.001269f, -0.000003f, -0.000957f, -0.000339f, 0.000355f, 0.000945f, -0.000109f, 0.000525f, -0.000048f, -0.000806f, + 0.001333f, -0.009853f, 0.004178f, -0.002859f, 0.001902f, -0.001693f, 0.002241f, -0.001426f, 0.000114f, -0.001211f, -0.001492f, -0.002099f, 0.000169f, -0.001240f, 0.000631f, 0.000725f, 0.001620f, -0.002596f, 0.001633f, -0.000609f, 0.002259f, 0.000507f, -0.000110f, 0.000192f, 0.000195f, -0.000514f, -0.000426f, 0.000354f, -0.001043f, 0.000714f, 0.001288f, -0.001706f, -0.000356f, -0.000090f, 0.000714f, -0.000644f, 0.001833f, -0.001876f, 0.000389f, 0.000008f, 0.000137f, -0.000801f, 0.000152f, -0.000499f, 0.000502f, 0.000084f, 0.000115f, -0.000568f, -0.000078f, -0.001188f, -0.000383f, -0.000060f, 0.000287f, 0.000101f, -0.000414f, -0.001508f, -0.000030f, -0.000301f, -0.015900f, 0.005062f, -0.003243f, -0.000201f, -0.000648f, 0.001012f, -0.002733f, 0.000211f, 0.000888f, 0.000739f, -0.000946f, 0.000562f, -0.001212f, -0.001997f, -0.000772f, 0.000269f, -0.001192f, 0.004238f, 0.000128f, -0.001155f, -0.000372f, -0.001395f, -0.000650f, 0.001306f, 0.000784f, 0.001690f, -0.000141f, 0.000763f, -0.000933f, 0.000406f, -0.000844f, -0.000273f, -0.000490f, 0.000299f, 0.000532f, -0.000249f, -0.000801f, 0.000218f, + 0.000315f, 0.001177f, -0.000193f, -0.000407f, -0.001500f, -0.001213f, -0.000578f, -0.000220f, 0.000292f, 0.000224f, -0.000610f, -0.000235f, 0.000120f, 0.000574f, 0.000296f, 0.000117f, -0.000263f, 0.000583f, -0.000180f, 0.000982f, -0.015305f, 0.007206f, -0.003373f, 0.003225f, -0.001658f, 0.001918f, 0.000957f, 0.000597f, -0.001728f, 0.000230f, -0.000874f, 0.000278f, -0.002268f, 0.000876f, 0.001443f, 0.000481f, -0.002415f, -0.001186f, -0.001208f, -0.001254f, -0.000820f, 0.001760f, 0.000431f, 0.001245f, 0.000996f, -0.000411f, -0.000086f, -0.001816f, 0.002381f, -0.000655f, -0.000227f, 0.000171f, -0.000495f, -0.000707f, -0.000846f, -0.000174f, -0.001917f, 0.000594f, -0.001012f, 0.000793f, 0.000685f, 0.001129f, -0.000288f, 0.000145f, -0.001241f, 0.000497f, 0.000935f, 0.000244f, -0.000194f, 0.000211f, 0.000734f, 0.001103f, 0.000480f, 0.001028f, 0.000057f, 0.000180f, -0.000048f, -0.000203f, 0.004958f, 0.006137f, -0.002797f, 0.001631f, -0.000873f, 0.000602f, -0.000679f, 0.000338f, 0.000525f, 0.002998f, -0.001084f, 0.001227f, 0.002814f, -0.000787f, -0.000133f, -0.000493f, 0.000669f, 0.001448f, + 0.001482f, 0.001935f, 0.000509f, 0.001645f, -0.000442f, -0.000995f, -0.003338f, 0.000685f, -0.000523f, -0.001680f, -0.001208f, -0.000070f, -0.000334f, 0.001058f, -0.000173f, -0.001940f, -0.002008f, 0.000523f, -0.001748f, 0.000220f, 0.001031f, -0.001565f, -0.001060f, -0.000672f, 0.000751f, 0.000689f, -0.000072f, -0.000216f, 0.001141f, 0.000237f, -0.000470f, 0.000456f, -0.001025f, 0.000116f, -0.000550f, -0.000766f, -0.000532f, 0.000781f, -0.000426f, 0.000587f, -0.000469f, -0.000979f, 0.000241f, 0.000528f, -0.000364f, 0.000299f, -0.000452f, 0.017704f, -0.006169f, 0.003338f, -0.002316f, 0.003319f, -0.002348f, 0.002034f, -0.000764f, 0.002066f, 0.000498f, 0.001453f, -0.001699f, 0.001735f, -0.000600f, -0.001447f, -0.000155f, -0.001554f, -0.002481f, -0.001310f, -0.000275f, 0.001253f, -0.001702f, -0.002271f, -0.002785f, -0.000502f, -0.000250f, 0.002220f, 0.001211f, 0.001426f, -0.000983f, 0.001153f, -0.000889f, -0.000869f, -0.000484f, 0.001465f, 0.001259f, 0.000394f, -0.000017f, -0.000054f, 0.000033f, -0.000412f, -0.000240f, 0.001014f, 0.000190f, 0.002497f, -0.000966f, -0.000301f, -0.002090f, 0.001363f, + -0.000552f, -0.000324f, -0.000499f, -0.000129f, 0.000113f, -0.000346f, 0.000371f, -0.000557f, -0.000001f, -0.000790f, -0.000358f, 0.000177f, 0.000805f, -0.000423f, -0.000063f, -0.000284f, 0.004964f, -0.007611f, 0.004445f, -0.002854f, 0.003451f, -0.000050f, 0.002138f, 0.000596f, -0.003342f, -0.001591f, -0.001134f, 0.000396f, 0.000825f, 0.000455f, 0.003751f, -0.002127f, 0.002996f, 0.000512f, 0.000371f, -0.002068f, -0.000456f, 0.002587f, -0.000181f, -0.002219f, 0.002502f, 0.001906f, 0.000415f, -0.001047f, -0.000827f, -0.000231f, -0.000185f, 0.001152f, -0.000580f, 0.000507f, -0.001417f, -0.000324f, 0.000802f, -0.002041f, 0.000767f, -0.000799f, 0.000717f, -0.000600f, -0.000189f, 0.002381f, 0.001024f, 0.001351f, -0.000114f, 0.000552f, 0.000868f, -0.000192f, -0.000669f, -0.001068f, 0.000352f, 0.000471f, 0.000841f, 0.001017f, 0.000232f, -0.000244f, -0.001067f, -0.000493f, -0.001080f, -0.000968f, 0.000115f, 0.000020f, -0.000813f, -0.018833f, -0.003788f, -0.000486f, -0.003126f, -0.001284f, 0.002842f, 0.001225f, -0.000801f, -0.000710f, -0.002242f, -0.001482f, -0.001815f, -0.002038f, -0.001688f, -0.001067f, + -0.001525f, -0.002609f, -0.002228f, 0.000889f, -0.002263f, 0.000784f, -0.003052f, 0.000124f, -0.001249f, -0.000992f, 0.002702f, -0.000250f, -0.001278f, 0.001755f, -0.001917f, 0.001854f, 0.000574f, 0.001955f, 0.001341f, -0.000012f, -0.000898f, 0.002056f, -0.000001f, -0.000284f, 0.001875f, -0.000741f, -0.002487f, -0.002814f, -0.000703f, 0.000973f, 0.000631f, -0.000816f, -0.000056f, -0.000753f, 0.000209f, 0.000071f, 0.000174f, 0.001812f, 0.000728f, -0.001255f, -0.000457f, 0.000264f, 0.001158f, 0.000294f, 0.001715f, 0.000495f, -0.000113f, -0.000831f, -0.000760f, 0.000045f, -0.022175f, 0.019307f, -0.007862f, 0.005361f, -0.005038f, 0.001238f, -0.002474f, 0.003270f, 0.000619f, 0.000385f, -0.001580f, 0.002218f, 0.000450f, -0.003980f, 0.000404f, 0.000594f, -0.002006f, -0.003066f, 0.003034f, 0.003772f, -0.001218f, -0.000988f, 0.000626f, 0.001742f, -0.001022f, 0.003437f, -0.000113f, 0.000876f, -0.002496f, -0.000879f, -0.001490f, 0.002243f, -0.000504f, 0.000494f, 0.000477f, -0.001276f, 0.002160f, 0.002087f, 0.000560f, 0.000722f, 0.002532f, -0.001541f, -0.000421f, -0.000316f, -0.001857f, 0.000405f, + -0.001216f, 0.000460f, -0.000069f, 0.000174f, 0.002064f, -0.000070f, -0.000485f, 0.000470f, 0.000096f, 0.001368f, -0.001275f, 0.000487f, -0.000097f, 0.002672f, -0.000809f, -0.000095f, -0.001063f, -0.000214f, -0.000689f, 0.014776f, -0.001813f, -0.003120f, -0.000763f, 0.001962f, 0.000999f, 0.000871f, -0.000137f, -0.002086f, 0.000482f, 0.001222f, 0.001389f, -0.000968f, -0.000913f, 0.002959f, 0.000993f, -0.002363f, 0.000474f, 0.003837f, -0.004855f, 0.003199f, 0.000364f, 0.004098f, -0.000300f, 0.000209f, 0.000784f, 0.000807f, 0.002145f, -0.001627f, -0.000631f, 0.000787f, 0.001534f, -0.000640f, -0.000066f, 0.000177f, 0.000341f, 0.000957f, -0.002004f, -0.000069f, 0.001133f, 0.000306f, -0.001112f, -0.000361f, 0.002534f, 0.001859f, 0.000876f, -0.000998f, -0.000734f, 0.000713f, -0.000346f, -0.000650f, 0.000433f, -0.000807f, -0.001245f, 0.002606f, 0.001015f, 0.001668f, 0.000251f, 0.001254f, 0.001021f, 0.001113f, 0.000113f, 0.001353f, 0.000673f, 0.000956f, -0.000807f, 0.000165f, 0.000355f, -0.001186f, 0.000409f, -0.000582f, -0.000125f, 0.007031f, 0.002042f, 0.001696f, -0.001031f, -0.000690f, + -0.001911f, -0.001365f, 0.000347f, -0.000749f, -0.000941f, -0.002737f, 0.002330f, 0.001614f, -0.001706f, 0.002915f, -0.002746f, -0.000830f, 0.001222f, -0.002033f, 0.001180f, 0.001893f, 0.002890f, 0.002553f, 0.002431f, 0.001263f, -0.005144f, 0.000002f, -0.001081f, 0.001031f, -0.000498f, 0.002013f, 0.001362f, -0.000662f, -0.001253f, 0.001322f, -0.000921f, 0.003396f, -0.000002f, 0.001124f, 0.003438f, 0.003296f, -0.002489f, 0.000210f, -0.001642f, -0.002958f, -0.000322f, 0.000558f, -0.000380f, -0.000605f, -0.000318f, 0.000258f, -0.001388f, 0.000186f, -0.001619f, -0.000451f, -0.000193f, 0.000433f, 0.000010f, -0.000943f, -0.001009f, 0.002065f, -0.000730f, 0.000319f, 0.000920f, 0.001143f, -0.000632f, -0.000640f, -0.000304f, -0.001627f, -0.001112f, 0.000179f, 0.000353f, 0.016615f, -0.011690f, 0.004256f, -0.004441f, -0.000342f, -0.003103f, 0.002808f, 0.002789f, 0.000900f, 0.000567f, 0.002638f, 0.007251f, -0.006372f, -0.000886f, -0.001656f, -0.002574f, 0.005626f, 0.004236f, -0.000867f, -0.003855f, 0.001563f, -0.003150f, -0.002517f, -0.004413f, 0.000565f, -0.004519f, -0.001492f, 0.002661f, 0.000385f, + -0.001387f, -0.003728f, 0.000006f, -0.000899f, 0.002265f, 0.002084f, 0.000961f, -0.001693f, 0.000253f, -0.000106f, 0.000915f, 0.001799f, -0.001143f, -0.000576f, -0.002023f, 0.003065f, -0.000382f, 0.000453f, 0.002731f, -0.000564f, -0.000252f, 0.001093f, -0.001376f, -0.000142f, 0.001183f, -0.002031f, 0.000459f, -0.000377f, -0.000181f, -0.002118f, 0.001026f, -0.000454f, 0.000179f, 0.000521f, -0.000787f, 0.001389f, -0.001097f, -0.000284f, -0.002271f, 0.000204f, -0.000319f, 0.000942f, 0.000991f, -0.025867f, 0.003587f, 0.000369f, 0.001824f, -0.001981f, -0.003222f, -0.000007f, 0.002173f, 0.003449f, -0.000202f, 0.005241f, 0.002924f, -0.003531f, -0.003149f, 0.002455f, 0.000450f, -0.002512f, -0.004675f, -0.005364f, -0.003435f, -0.003955f, -0.004428f, 0.000815f, 0.001426f, 0.001196f, -0.003273f, -0.003146f, 0.000496f, -0.000817f, -0.000525f, -0.000407f, -0.002609f, 0.002236f, -0.004501f, -0.001673f, -0.000673f, -0.000148f, 0.001460f, 0.000526f, -0.000296f, 0.002103f, -0.000619f, 0.002097f, 0.001212f, -0.001582f, 0.000273f, 0.003397f, -0.001332f, -0.001331f, 0.000105f, 0.001998f, 0.000529f, -0.001384f, + -0.001787f, 0.001674f, 0.000105f, -0.002349f, 0.003272f, 0.003691f, 0.000461f, -0.001025f, 0.000455f, -0.000045f, 0.000796f, 0.001645f, -0.000142f, 0.002175f, 0.001386f, 0.001255f, 0.001097f, 0.000583f, 0.000917f, -0.001052f, -0.000063f, -0.015855f, 0.013538f, -0.004540f, 0.002887f, -0.000084f, 0.002249f, -0.005496f, 0.002116f, -0.003750f, 0.000012f, -0.002542f, 0.005079f, 0.004316f, 0.001630f, 0.000340f, -0.004184f, -0.002785f, -0.000436f, -0.001693f, 0.004822f, -0.003957f, -0.000161f, -0.001967f, 0.007065f, -0.002261f, 0.000630f, -0.000212f, 0.001215f, 0.000542f, 0.001212f, 0.000878f, -0.001171f, 0.000624f, -0.000286f, 0.002455f, 0.000380f, 0.004666f, 0.002427f, -0.001523f, -0.000318f, -0.000596f, 0.000086f, -0.001800f, -0.001260f, -0.000461f, 0.000836f, 0.005691f, 0.000519f, 0.000368f, -0.001566f, 0.002313f, -0.000863f, -0.001233f, 0.000753f, -0.001199f, 0.000704f, -0.001485f, -0.003192f, 0.001570f, 0.001415f, -0.000459f, 0.003337f, 0.000696f, 0.000793f, 0.001185f, -0.000894f, 0.000381f, 0.001083f, -0.002776f, -0.001296f, -0.000228f, -0.001257f, 0.001256f, 0.001972f, -0.000725f, + 0.003385f, 0.002249f, -0.000076f, -0.000900f, -0.000681f, -0.000235f, 0.010345f, -0.000227f, 0.002336f, -0.007022f, -0.001164f, 0.000893f, -0.005666f, 0.000458f, 0.007860f, -0.001364f, 0.000569f, -0.003539f, -0.004851f, 0.001240f, -0.004432f, 0.006928f, -0.004803f, 0.001666f, 0.001641f, 0.003712f, 0.002887f, -0.000752f, -0.004285f, -0.000493f, -0.000392f, 0.002200f, -0.003003f, -0.000578f, -0.000879f, -0.001426f, -0.001016f, 0.002104f, 0.001294f, 0.005619f, 0.001909f, -0.002086f, 0.002332f, -0.001524f, -0.001607f, 0.001731f, 0.004809f, -0.000687f, -0.002479f, -0.002319f, 0.002557f, -0.000059f, -0.003479f, -0.003203f, 0.001645f, 0.001533f, -0.001443f, -0.002647f, -0.004399f, 0.001220f, 0.001640f, 0.001106f, -0.002484f, 0.001870f, 0.001149f, 0.000781f, -0.000882f, -0.000267f, 0.001362f, -0.003301f, -0.000431f, 0.001458f, 0.001715f, -0.000312f, 0.000836f, 0.000072f, 0.035167f, -0.002268f, 0.001391f, 0.003197f, -0.003108f, -0.001340f, -0.001082f, -0.008318f, 0.005543f, -0.000928f, -0.005169f, 0.001084f, -0.002665f, 0.002996f, 0.002365f, 0.003815f, -0.001396f, 0.005188f, 0.004441f, 0.002830f, + -0.004628f, 0.003504f, -0.006339f, -0.003751f, -0.004323f, 0.001671f, -0.003328f, -0.000625f, -0.001153f, -0.004233f, -0.002312f, 0.003522f, -0.002669f, -0.002025f, -0.004043f, 0.001276f, 0.001268f, 0.002979f, -0.001726f, 0.005147f, 0.001265f, 0.005871f, -0.000705f, 0.001045f, 0.001161f, -0.003285f, 0.002296f, 0.006012f, -0.002108f, -0.000195f, 0.001614f, -0.001782f, -0.002464f, 0.001407f, -0.002455f, -0.001335f, -0.003201f, -0.002106f, 0.002325f, 0.002074f, 0.001386f, 0.002229f, 0.002806f, 0.002675f, 0.004035f, 0.000639f, -0.001231f, 0.002082f, 0.001404f, -0.000042f, -0.000430f, 0.000151f, -0.001546f, -0.000343f, 0.000295f, 0.000354f, -0.000111f, -0.015482f, -0.030454f, 0.011425f, 0.000202f, 0.000719f, -0.002961f, -0.003170f, -0.000644f, 0.001144f, -0.001889f, 0.008072f, -0.003605f, -0.006880f, 0.000497f, 0.000533f, -0.000838f, -0.002366f, 0.005517f, 0.001078f, -0.002366f, 0.002623f, -0.004753f, 0.006211f, -0.003352f, -0.001693f, -0.004099f, 0.006923f, -0.002883f, -0.000899f, -0.004064f, -0.001823f, 0.003777f, -0.001641f, 0.004083f, -0.005101f, -0.006002f, 0.000590f, 0.001118f, 0.001143f, + -0.000099f, -0.003051f, 0.000642f, 0.001713f, 0.000865f, 0.003260f, 0.000040f, 0.005060f, 0.000746f, 0.004749f, 0.006151f, 0.001363f, -0.000406f, 0.001244f, -0.003362f, -0.000781f, -0.005653f, -0.004988f, 0.001544f, 0.001606f, 0.001049f, -0.000258f, -0.001578f, -0.000757f, -0.001343f, -0.000681f, -0.001341f, 0.000125f, -0.000080f, 0.001163f, -0.000303f, -0.000569f, -0.001904f, -0.000053f, -0.002220f, -0.000176f, -0.002962f, -0.000298f, -0.001075f, -0.000234f, -0.010204f, 0.029864f, -0.013574f, 0.006251f, -0.002865f, 0.009502f, -0.001476f, -0.004163f, -0.004352f, 0.002514f, -0.001286f, -0.000538f, 0.000231f, 0.001882f, -0.010016f, -0.004870f, -0.002574f, 0.004017f, 0.003365f, 0.005881f, 0.001084f, -0.000860f, -0.000913f, 0.007052f, -0.009109f, 0.005318f, -0.004376f, -0.000881f, -0.004611f, 0.007287f, 0.002924f, -0.004679f, 0.000639f, -0.002030f, 0.000794f, 0.003114f, -0.013082f, -0.005430f, 0.001090f, 0.004642f, -0.002682f, 0.001012f, 0.003371f, -0.001320f, -0.001468f, -0.000433f, 0.005079f, 0.002047f, 0.000879f, 0.000615f, 0.001965f, 0.006002f, -0.003602f, 0.002773f, -0.008348f, -0.001392f, + 0.001893f, 0.004085f, 0.000765f, 0.000639f, 0.000204f, 0.002240f, -0.001627f, 0.000309f, -0.000581f, -0.001910f, -0.001710f, 0.003186f, 0.003047f, -0.001086f, -0.001575f, -0.005136f, -0.002196f, -0.001099f, -0.000928f, 0.003859f, -0.001444f, -0.001351f, -0.002543f, -0.002228f, -0.000184f, -0.026770f, -0.005771f, 0.002626f, -0.006344f, 0.001606f, 0.001174f, 0.003930f, -0.000012f, 0.007486f, 0.004891f, 0.002710f, -0.002043f, -0.003665f, -0.000182f, 0.007919f, -0.006758f, -0.002579f, -0.005235f, -0.000110f, -0.014324f, -0.011296f, 0.000722f, 0.007020f, 0.009665f, 0.002235f, -0.003503f, 0.003299f, -0.003109f, -0.002077f, -0.002113f, 0.000961f, 0.002540f, 0.000623f, 0.003770f, -0.002846f, -0.005086f, 0.004226f, 0.002789f, 0.008870f, -0.001073f, 0.001449f, -0.001258f, 0.007155f, -0.007425f, -0.003730f, -0.001745f, -0.005641f, 0.003609f, -0.002324f, 0.003034f, -0.006043f, 0.006048f, 0.005858f, 0.005404f, -0.002189f, 0.004793f, 0.000263f, 0.001685f, 0.002805f, 0.002015f, -0.002523f, 0.000464f, -0.000781f, -0.000116f, 0.005504f, 0.002078f, -0.002411f, 0.004477f, -0.000716f, -0.003826f, -0.001270f, + -0.000251f, -0.005415f, -0.000189f, 0.002269f, 0.002981f, 0.000477f, -0.000082f, -0.002234f, 0.000853f, 0.001319f, 0.019383f, 0.012592f, -0.004009f, 0.005693f, -0.012941f, 0.009035f, 0.003291f, 0.006792f, -0.002375f, -0.001756f, -0.007100f, -0.003663f, -0.012112f, -0.002128f, -0.009651f, -0.002958f, -0.005961f, -0.006103f, -0.008206f, 0.003203f, -0.011199f, 0.001461f, 0.004783f, -0.002186f, 0.001479f, -0.004846f, -0.000106f, -0.001541f, -0.001635f, -0.006590f, -0.000927f, 0.000712f, -0.000493f, -0.001052f, -0.003475f, -0.003023f, 0.001972f, 0.002105f, 0.002783f, 0.014136f, -0.005767f, -0.000373f, 0.005692f, -0.001421f, -0.002412f, -0.005486f, 0.001628f, 0.004769f, 0.007910f, 0.002639f, 0.006586f, -0.006535f, -0.009806f, 0.000884f, 0.006339f, 0.003531f, -0.005319f, 0.006070f, -0.004668f, 0.002900f, 0.001164f, 0.005513f, 0.003085f, 0.001993f, 0.003707f, -0.003804f, 0.002343f, 0.001953f, 0.001081f, 0.005414f, 0.001198f, 0.004365f, -0.000717f, -0.001815f, 0.000643f, 0.001000f, 0.000859f, 0.005252f, -0.000907f, -0.003035f, -0.000344f, 0.039217f, -0.025353f, -0.001358f, 0.002959f, 0.000809f, + 0.003106f, 0.005391f, -0.001066f, -0.000842f, 0.003028f, -0.004506f, -0.004312f, -0.000688f, 0.003489f, 0.014131f, 0.000606f, 0.004899f, -0.004531f, 0.000310f, -0.013936f, 0.008645f, -0.008425f, -0.011991f, 0.002807f, 0.003402f, -0.004449f, 0.004041f, 0.001694f, 0.009345f, 0.010321f, -0.001684f, -0.003884f, -0.002907f, -0.015403f, -0.008369f, 0.012089f, 0.004017f, 0.004453f, -0.006919f, -0.007127f, 0.002147f, -0.001377f, -0.006106f, 0.005360f, -0.001133f, -0.003835f, -0.004401f, 0.003038f, -0.003938f, -0.002120f, 0.014199f, -0.008629f, 0.002658f, -0.003094f, 0.003319f, -0.003883f, -0.001559f, -0.010564f, 0.001817f, -0.003911f, -0.002597f, 0.008446f, 0.002075f, 0.002356f, 0.005146f, 0.006125f, 0.001861f, 0.004240f, -0.001852f, -0.000502f, -0.006905f, 0.003173f, 0.005766f, -0.001310f, 0.000412f, -0.000637f, -0.001407f, -0.001788f, 0.000679f, -0.001839f, -0.000798f, -0.024263f, -0.011880f, 0.004656f, -0.001378f, 0.008982f, -0.001119f, -0.002192f, -0.006914f, -0.007761f, 0.004310f, -0.008119f, -0.002724f, -0.004547f, -0.000791f, -0.004806f, -0.003254f, -0.003834f, -0.001906f, -0.004786f, -0.009204f, + 0.005494f, -0.018386f, -0.000062f, 0.016711f, 0.004178f, 0.000043f, -0.004399f, 0.001306f, -0.016624f, 0.007048f, 0.004345f, 0.001286f, 0.006190f, 0.009131f, -0.006966f, -0.003610f, -0.007254f, 0.001215f, 0.000398f, -0.004253f, -0.004868f, -0.005420f, -0.003156f, -0.000128f, 0.003817f, 0.000430f, 0.003155f, 0.001836f, 0.000513f, 0.011629f, 0.002906f, -0.001726f, 0.009261f, -0.004331f, -0.010219f, -0.003061f, -0.001072f, -0.001365f, -0.000523f, -0.003461f, -0.000656f, -0.004346f, -0.000924f, -0.004422f, 0.000614f, 0.002574f, -0.004818f, -0.001289f, -0.002585f, 0.000333f, -0.004886f, -0.006276f, -0.002612f, 0.002718f, 0.004692f, 0.001954f, -0.001336f, -0.000047f, 0.001902f, -0.000701f, -0.000890f, -0.002116f, 0.001194f, 0.002517f, 0.000662f, 0.000021f, -0.002652f, -0.014943f, 0.020316f, -0.009913f, -0.004877f, -0.016465f, 0.012981f, -0.004485f, 0.007680f, 0.000539f, 0.000540f, -0.004952f, 0.010194f, -0.002464f, 0.003373f, 0.002570f, -0.004555f, -0.001516f, -0.001421f, -0.008704f, 0.001828f, 0.001647f, -0.006694f, -0.011315f, -0.006978f, -0.010407f, -0.002458f, 0.005727f, 0.003060f, -0.006106f, + -0.006037f, 0.009199f, 0.006390f, -0.007860f, 0.007369f, -0.003893f, 0.006532f, -0.009978f, -0.007827f, -0.007596f, 0.002817f, -0.006724f, 0.004388f, -0.003012f, 0.001917f, -0.001822f, -0.000860f, 0.001618f, 0.007414f, -0.015934f, -0.001909f, 0.003226f, -0.001344f, -0.004820f, -0.011409f, -0.000992f, 0.010699f, 0.000004f, 0.009289f, 0.006788f, 0.002083f, -0.001277f, 0.007125f, -0.006914f, -0.005566f, 0.004494f, -0.001545f, -0.004285f, 0.003090f, 0.000889f, -0.003245f, -0.004932f, 0.008523f, -0.007794f, -0.004121f, -0.004651f, 0.004899f, 0.000262f, -0.003227f, -0.001881f, 0.002621f, -0.007200f, 0.000159f, 0.001952f, 0.001614f, 0.000186f, -0.002317f, -0.003497f, -0.034420f, 0.013091f, 0.005657f, -0.008512f, 0.004485f, -0.009653f, 0.009056f, 0.007844f, 0.006699f, -0.017540f, 0.010917f, 0.018982f, -0.002415f, 0.006582f, 0.000476f, -0.005656f, -0.007477f, 0.020892f, -0.000103f, -0.001631f, -0.011214f, -0.022309f, -0.012020f, 0.001337f, -0.009793f, 0.008498f, -0.014584f, -0.004706f, -0.008546f, 0.002583f, -0.003246f, -0.010809f, 0.002001f, -0.002346f, 0.007381f, -0.002240f, -0.008497f, -0.003126f, + -0.026333f, 0.004938f, -0.000678f, 0.012435f, -0.007354f, -0.008113f, 0.011557f, 0.002593f, 0.002012f, -0.004382f, -0.006961f, 0.002718f, 0.005328f, 0.003961f, -0.001737f, 0.004197f, 0.002300f, 0.000657f, -0.002201f, -0.002310f, -0.008622f, 0.000876f, -0.003361f, -0.004904f, 0.004697f, 0.002770f, 0.012996f, 0.002887f, -0.008583f, -0.008539f, 0.002020f, -0.005466f, -0.004058f, 0.001636f, -0.004179f, -0.000007f, -0.001877f, -0.002350f, 0.002549f, -0.003243f, 0.001351f, -0.000239f, -0.000603f, -0.001088f, -0.001813f, -0.004020f, -0.005025f, -0.001398f, -0.004321f, 0.028467f, -0.011797f, -0.000226f, 0.001203f, 0.011659f, -0.001945f, -0.002758f, 0.007883f, 0.013809f, -0.009986f, -0.011491f, 0.008250f, -0.002064f, 0.007128f, 0.010471f, 0.008685f, 0.007402f, 0.005888f, 0.006968f, 0.027656f, -0.002795f, 0.001689f, 0.005033f, 0.015091f, -0.003626f, -0.006040f, 0.005532f, -0.000788f, -0.005473f, -0.006592f, -0.005870f, -0.000219f, -0.007503f, 0.010329f, 0.015684f, -0.001199f, -0.004435f, 0.006385f, -0.004355f, 0.009297f, 0.006483f, -0.000104f, -0.008760f, 0.005998f, -0.001075f, -0.003061f, 0.000875f, + -0.001477f, 0.018310f, -0.001912f, 0.007722f, -0.004453f, 0.016263f, -0.001878f, 0.001062f, -0.006121f, -0.010582f, 0.008213f, -0.005483f, 0.016541f, 0.003264f, 0.007680f, -0.000373f, -0.000217f, 0.004446f, 0.001017f, 0.011605f, 0.006450f, 0.001752f, 0.005786f, -0.007509f, 0.002405f, 0.005100f, 0.000350f, -0.002453f, 0.009639f, 0.002005f, -0.003494f, -0.003699f, 0.003725f, -0.002284f, -0.000216f, 0.005129f, -0.001953f, 0.002943f, 0.001147f, -0.003552f, 0.037474f, -0.010684f, 0.003609f, -0.003486f, 0.001769f, 0.004905f, 0.012673f, -0.009660f, 0.005376f, -0.000124f, 0.000795f, 0.006894f, -0.005453f, 0.007361f, -0.019563f, -0.008859f, 0.003430f, 0.007395f, 0.005328f, 0.015720f, -0.015446f, 0.002489f, -0.002190f, -0.021308f, 0.009238f, -0.008262f, -0.005273f, -0.003073f, -0.017381f, 0.005728f, 0.006317f, 0.002760f, -0.008988f, -0.015301f, 0.006170f, -0.009475f, 0.008468f, -0.014668f, 0.000373f, -0.017558f, -0.004143f, -0.011727f, -0.010006f, 0.010391f, 0.016357f, 0.002248f, 0.006136f, -0.007470f, 0.003204f, -0.012532f, 0.005506f, -0.008240f, 0.002476f, 0.011968f, 0.006307f, -0.004248f, + 0.007478f, 0.001173f, 0.006508f, -0.005438f, 0.010765f, 0.017991f, 0.001195f, -0.010950f, -0.007311f, -0.004925f, -0.001762f, 0.001100f, 0.008341f, 0.001541f, 0.013401f, -0.000117f, 0.005287f, -0.012025f, -0.001507f, -0.008708f, -0.001375f, -0.001373f, 0.002971f, -0.010925f, 0.001755f, -0.000925f, 0.003536f, 0.001075f, 0.002321f, 0.000990f, 0.001151f, -0.037979f, -0.031839f, 0.013635f, -0.003880f, 0.015834f, -0.001091f, 0.005266f, -0.018968f, -0.017793f, -0.010765f, 0.006114f, -0.014653f, -0.010077f, -0.004238f, 0.003094f, 0.010950f, 0.003984f, -0.021543f, 0.005967f, 0.012264f, -0.030631f, -0.003529f, 0.001605f, -0.032507f, -0.011081f, 0.014680f, -0.030123f, 0.014958f, 0.015713f, 0.000339f, -0.004246f, -0.001093f, -0.007160f, -0.007886f, 0.005543f, 0.006823f, 0.022801f, -0.013262f, -0.006923f, -0.005491f, -0.010416f, 0.000766f, -0.017863f, -0.004337f, 0.001483f, -0.000362f, -0.005738f, -0.000768f, -0.009790f, -0.001862f, 0.005637f, -0.002326f, -0.006346f, 0.007651f, -0.003407f, -0.007197f, -0.010389f, 0.022487f, -0.000829f, 0.013761f, 0.001900f, 0.005258f, 0.014827f, 0.002281f, 0.010132f, + -0.006526f, 0.011247f, 0.008244f, 0.002522f, 0.003079f, 0.002830f, 0.009871f, 0.004525f, 0.001961f, 0.009478f, -0.003831f, 0.001461f, -0.000932f, -0.014568f, 0.007016f, 0.003572f, 0.002163f, -0.008888f, -0.002398f, 0.001753f, 0.003008f, -0.002497f, -0.061728f, 0.023425f, -0.006728f, -0.027629f, -0.006668f, 0.000809f, -0.007073f, 0.010821f, -0.023916f, 0.011676f, -0.001840f, -0.027500f, -0.018941f, 0.003895f, 0.011057f, 0.010474f, 0.007692f, 0.016377f, 0.004735f, 0.026862f, 0.014729f, 0.031466f, 0.004160f, 0.025584f, -0.019531f, -0.015330f, 0.005352f, 0.002338f, -0.015478f, 0.004478f, 0.003376f, -0.002043f, -0.005855f, 0.015219f, 0.002964f, -0.033172f, -0.014774f, 0.011291f, 0.003916f, -0.006935f, 0.009594f, 0.009847f, 0.015198f, 0.003387f, 0.004557f, 0.002962f, 0.004459f, 0.005660f, -0.011507f, 0.001898f, 0.002190f, -0.024488f, 0.011667f, 0.008685f, 0.010508f, -0.016739f, -0.009741f, 0.012456f, 0.000071f, -0.003130f, -0.002493f, -0.007075f, -0.006330f, 0.000188f, -0.008441f, -0.018783f, 0.006490f, 0.020340f, -0.014149f, 0.002120f, -0.008024f, -0.003124f, -0.005838f, -0.001678f, + 0.010451f, 0.002653f, 0.008641f, 0.002663f, -0.009112f, -0.006347f, -0.007395f, -0.004291f, -0.006043f, 0.001618f, -0.003819f, -0.000667f, -0.005785f, 0.002021f, 0.003046f, 0.003477f, -0.001736f, 0.026285f, 0.017878f, 0.012462f, 0.006929f, 0.001136f, -0.005711f, -0.008884f, 0.008473f, -0.025561f, 0.027657f, -0.016602f, 0.004732f, -0.027778f, -0.000698f, 0.026760f, 0.010714f, -0.009039f, 0.017101f, -0.026375f, 0.010998f, 0.005297f, 0.002199f, -0.032555f, -0.009528f, 0.002333f, 0.005623f, 0.021436f, -0.032011f, -0.004054f, -0.010411f, -0.030136f, -0.006347f, 0.007616f, 0.015548f, 0.023141f, 0.018072f, 0.017969f, -0.001174f, -0.011038f, 0.011963f, 0.003825f, -0.006641f, 0.004477f, -0.014541f, 0.023961f, 0.011405f, 0.008311f, -0.012001f, -0.026750f, -0.006899f, 0.000925f, -0.032461f, -0.026215f, -0.006643f, -0.023483f, 0.015615f, 0.006218f, 0.005085f, -0.010653f, -0.011440f, 0.004878f, 0.003649f, 0.002295f, 0.007677f, -0.004278f, 0.005882f, 0.015942f, 0.007440f, 0.002950f, 0.002453f, -0.010014f, -0.008315f, -0.007465f, 0.004883f, -0.002470f, -0.020669f, -0.016508f, -0.001354f, -0.013239f, + -0.011656f, -0.003158f, -0.017004f, -0.010606f, -0.002400f, 0.001220f, -0.002157f, -0.000850f, 0.004467f, -0.003034f, -0.000933f, 0.001216f, 0.029882f, -0.023276f, 0.006286f, -0.003268f, -0.003010f, 0.000577f, 0.008273f, -0.014480f, 0.019433f, -0.005568f, 0.013327f, -0.001257f, -0.010809f, 0.020708f, 0.020387f, 0.014637f, -0.006829f, 0.031365f, 0.011590f, -0.034956f, 0.036100f, 0.003355f, -0.000110f, 0.026160f, 0.001143f, -0.011255f, -0.015157f, 0.025828f, -0.016153f, -0.021448f, 0.020825f, 0.018258f, -0.011864f, -0.028541f, 0.011202f, -0.009738f, 0.003951f, -0.020045f, -0.016533f, -0.006747f, 0.019485f, 0.017621f, 0.002283f, 0.016183f, -0.023393f, 0.007638f, -0.006178f, -0.008593f, 0.011156f, 0.001686f, 0.003396f, -0.032580f, -0.008987f, 0.018317f, -0.023410f, -0.005955f, -0.029361f, -0.005330f, -0.010991f, 0.005079f, -0.007125f, 0.003454f, 0.002982f, -0.000860f, 0.002903f, -0.007693f, -0.026093f, -0.004759f, 0.013242f, -0.001612f, 0.009170f, -0.009867f, -0.022909f, -0.003888f, 0.005000f, 0.014713f, 0.003499f, 0.008134f, -0.000896f, 0.003449f, 0.005444f, 0.003532f, -0.008001f, 0.002205f, + -0.003311f, 0.003625f, -0.006389f, 0.003962f, 0.001479f, 0.000643f, -0.000775f, -0.005270f, -0.002810f, 0.027127f, 0.002149f, -0.007804f, -0.019319f, -0.000590f, -0.009199f, 0.007276f, -0.015946f, 0.010248f, 0.006551f, -0.013934f, -0.014294f, 0.021732f, -0.025478f, -0.000935f, 0.016558f, -0.018428f, 0.006025f, 0.021240f, -0.016782f, 0.014589f, 0.010732f, 0.015609f, -0.025516f, 0.022159f, -0.025622f, 0.007806f, -0.019490f, 0.002506f, -0.009938f, 0.017461f, 0.000596f, 0.010712f, 0.005555f, -0.018187f, -0.011067f, -0.025166f, 0.014779f, -0.017027f, 0.014861f, -0.020488f, -0.023337f, -0.039126f, 0.003886f, 0.020634f, -0.003077f, -0.000543f, 0.006566f, 0.017793f, -0.005947f, 0.004821f, -0.021583f, 0.005564f, 0.028812f, -0.002845f, 0.026128f, 0.034161f, -0.000156f, 0.005768f, 0.007077f, -0.014512f, 0.007631f, -0.017594f, -0.000820f, -0.018061f, -0.017498f, 0.001083f, -0.006588f, -0.029713f, 0.020240f, 0.000527f, 0.015074f, -0.017517f, -0.008899f, -0.006672f, 0.007763f, -0.000125f, -0.004577f, -0.004586f, -0.002931f, -0.001099f, 0.001782f, 0.001963f, -0.003465f, 0.004083f, -0.003985f, -0.003988f, + -0.002175f, 0.005746f, 0.004323f, 0.004782f, -0.002249f, 0.003613f, -0.061291f, 0.015570f, 0.022971f, 0.006388f, -0.026550f, -0.003870f, 0.043249f, -0.049661f, -0.001239f, -0.008357f, -0.032473f, -0.008168f, -0.021997f, 0.008097f, 0.008048f, 0.019029f, 0.007722f, -0.025944f, -0.009198f, 0.018761f, -0.029619f, -0.008387f, -0.031678f, 0.027093f, 0.008144f, 0.021202f, 0.036089f, -0.012663f, -0.007587f, -0.005902f, -0.018042f, 0.017351f, -0.008451f, -0.021472f, -0.024111f, -0.004174f, 0.009285f, -0.000617f, 0.004955f, 0.005948f, 0.014067f, -0.006107f, -0.000631f, 0.010478f, -0.010013f, 0.020488f, 0.023262f, 0.021989f, -0.017736f, 0.002456f, -0.005509f, 0.010565f, 0.043853f, 0.032950f, 0.062765f, 0.005065f, 0.024836f, 0.020158f, -0.009497f, -0.002066f, -0.003249f, -0.005758f, 0.007957f, 0.001946f, 0.022621f, 0.017111f, -0.007618f, -0.002206f, -0.013378f, -0.026228f, 0.010618f, -0.000271f, 0.009037f, -0.001803f, -0.018166f, -0.002553f, 0.002782f, -0.010047f, 0.006192f, -0.006362f, -0.008800f, 0.000370f, -0.008818f, 0.000081f, -0.002418f, -0.002066f, 0.000103f, 0.001480f, -0.005495f, 0.000908f, + 0.000393f, 0.000101f, 0.002256f, 0.095428f, 0.046171f, 0.016613f, 0.014991f, -0.022361f, 0.014845f, -0.018015f, 0.022105f, 0.018151f, 0.017030f, 0.004542f, -0.030910f, -0.017192f, 0.034230f, 0.006121f, -0.001725f, -0.006965f, 0.038286f, -0.040987f, -0.017097f, -0.010117f, -0.002834f, -0.028967f, 0.007195f, -0.025003f, -0.013855f, 0.004397f, -0.015755f, 0.023811f, -0.022500f, -0.009592f, -0.005361f, 0.025434f, -0.041642f, -0.007838f, -0.030935f, -0.000671f, 0.000067f, -0.027140f, 0.004706f, 0.021729f, 0.011881f, -0.000282f, -0.012640f, 0.001375f, 0.013150f, -0.016994f, 0.034827f, 0.047272f, -0.002753f, -0.029028f, -0.027347f, 0.019620f, -0.006784f, -0.006128f, 0.040691f, -0.008390f, 0.013125f, -0.000885f, 0.025661f, -0.004877f, 0.003523f, -0.004659f, -0.015923f, -0.044746f, -0.026676f, -0.003992f, -0.011873f, -0.030768f, -0.020198f, 0.011902f, 0.026317f, -0.001916f, -0.003152f, -0.002548f, -0.003996f, 0.014548f, 0.009252f, 0.002290f, -0.008577f, 0.010282f, -0.005591f, -0.020307f, -0.019491f, 0.002811f, 0.013727f, -0.015770f, 0.010762f, -0.000765f, -0.005944f, -0.005083f, 0.000625f, -0.008690f, + -0.006725f, 0.000675f, -0.002469f, -0.001058f, -0.004056f} +}; +const float CRendBin_Combined_BRIR_coeff_diffuse_im_48kHz[BINAURAL_CHANNELS][2885]={ {-0.004498f, 0.002497f, -0.001443f, 0.000619f, -0.000813f, 0.000186f, -0.000598f, -0.000162f, 0.000026f, 0.001200f, -0.000788f, 0.000523f, -0.001278f, 0.000943f, -0.001443f, -0.001961f, -0.001724f, 0.000396f, -0.000185f, 0.000270f, 0.000037f, -0.000892f, 0.000515f, 0.000893f, -0.000505f, 0.000715f, -0.000113f, -0.000312f, -0.000632f, -0.000114f, 0.000186f, 0.000502f, -0.000366f, 0.000751f, -0.000305f, 0.000479f, 0.000699f, -0.000511f, -0.000492f, 0.000032f, -0.000517f, 0.000139f, 0.000013f, -0.000237f, 0.000514f, 0.000084f, -0.000239f, 0.001718f, -0.001776f, -0.000315f, -0.000381f, -0.000400f, -0.000137f, -0.000018f, -0.000346f, -0.000233f, -0.000007f, 0.000084f, -0.000256f, 0.000153f, -0.000558f, -0.000152f, -0.000099f, 0.000343f, -0.001888f, -0.000167f, 0.000378f, -0.000169f, -0.000239f, 0.000174f, 0.000025f, 0.000143f, 0.000854f, -0.000408f, -0.000287f, -0.000452f, -0.000096f, 0.000265f, 0.000378f, -0.000387f, -0.000308f, 0.000471f, -0.000434f, -0.000619f, -0.000080f, -0.000161f, 0.000209f, -0.000177f, -0.000190f, 0.000114f, 0.000183f, -0.000378f, 0.000117f, 0.000157f, -0.006029f, -0.004095f, + -0.001664f, -0.001900f, -0.001062f, -0.000994f, -0.000942f, -0.000426f, -0.001136f, -0.000895f, -0.000391f, -0.000698f, -0.000092f, -0.000251f, -0.000609f, -0.000823f, -0.000922f, -0.000363f, -0.000535f, -0.000929f, -0.000122f, -0.001163f, 0.000003f, -0.000088f, -0.000162f, -0.000704f, -0.000122f, -0.000532f, 0.000004f, -0.000687f, -0.000439f, 0.000237f, -0.000506f, 0.000089f, -0.001174f, -0.000216f, 0.000572f, 0.000351f, -0.000022f, -0.000171f, -0.000338f, 0.000096f, 0.000106f, 0.000544f, -0.000327f, -0.000054f, -0.000169f, -0.007934f, -0.000424f, 0.001012f, -0.000009f, 0.000297f, -0.000047f, 0.000000f, -0.000627f, 0.000669f, 0.000275f, 0.000807f, 0.000589f, 0.001662f, 0.001235f, 0.000087f, -0.000651f, -0.000387f, -0.000147f, 0.000305f, -0.000215f, -0.001481f, -0.001316f, -0.000693f, -0.000196f, 0.000057f, 0.000196f, 0.000266f, -0.000044f, 0.000039f, 0.000171f, -0.000316f, -0.000033f, -0.000049f, -0.000899f, 0.000527f, 0.000229f, -0.000107f, -0.000000f, -0.000354f, -0.000495f, 0.000307f, 0.000130f, -0.000336f, 0.000325f, 0.000262f, 0.000394f, -0.000178f, 0.008893f, 0.006234f, 0.001233f, 0.002409f, + 0.000508f, 0.000792f, 0.001978f, 0.001008f, 0.000321f, 0.001178f, 0.000490f, -0.000528f, -0.000250f, 0.000405f, 0.000695f, -0.001211f, -0.000152f, -0.000730f, 0.001613f, 0.000791f, 0.000420f, 0.000792f, 0.000417f, 0.000407f, 0.000030f, -0.000084f, -0.000384f, 0.000622f, 0.000771f, 0.000642f, 0.000820f, 0.000973f, 0.000596f, 0.001424f, 0.000335f, -0.000086f, 0.000521f, 0.000090f, -0.000237f, -0.000118f, -0.000210f, -0.000287f, 0.000020f, 0.000659f, 0.000172f, 0.000105f, 0.000400f, 0.013276f, 0.005619f, 0.001722f, 0.001533f, 0.001103f, 0.000653f, 0.000233f, 0.000034f, 0.001472f, 0.000277f, 0.000825f, 0.001080f, 0.000598f, -0.000094f, -0.000385f, 0.002300f, -0.000190f, -0.001283f, -0.000707f, 0.000560f, 0.000051f, 0.001224f, 0.000426f, 0.000138f, -0.000209f, -0.000592f, -0.000144f, -0.000279f, 0.000563f, -0.000108f, 0.000245f, 0.000041f, 0.000105f, -0.000311f, 0.000461f, 0.001596f, 0.001037f, 0.001056f, 0.000983f, 0.000783f, 0.000455f, 0.000299f, 0.000203f, 0.000515f, -0.000424f, 0.000310f, -0.000190f, 0.004369f, -0.004604f, -0.001390f, -0.001989f, -0.001717f, -0.000939f, + -0.000275f, 0.000637f, -0.000638f, 0.000065f, -0.001701f, 0.000578f, -0.000618f, -0.001548f, 0.000411f, -0.001108f, -0.001471f, -0.001059f, 0.001411f, 0.001055f, -0.000494f, 0.000533f, -0.000974f, 0.000372f, -0.001774f, 0.000085f, 0.000295f, -0.000310f, -0.000414f, 0.000363f, -0.001404f, -0.000647f, 0.000184f, -0.000501f, -0.000413f, -0.000330f, 0.000117f, 0.000139f, 0.000711f, 0.000031f, 0.001225f, -0.000485f, -0.000334f, -0.000397f, -0.000603f, -0.000200f, -0.000301f, 0.000159f, -0.000520f, -0.000817f, -0.000124f, -0.015760f, -0.007972f, -0.002877f, -0.002233f, -0.002459f, -0.001522f, -0.002128f, -0.001364f, -0.002316f, -0.000407f, -0.001057f, -0.000257f, 0.000086f, -0.000945f, -0.000282f, 0.000160f, -0.000008f, -0.001443f, -0.000985f, -0.000648f, 0.000116f, -0.001949f, 0.000173f, -0.000879f, -0.001763f, 0.000159f, -0.000046f, 0.000130f, -0.000067f, -0.000606f, -0.000495f, 0.000029f, -0.000157f, -0.000013f, -0.000676f, 0.000030f, 0.000151f, 0.000535f, 0.000174f, -0.000668f, 0.000361f, -0.000668f, 0.000432f, -0.001155f, -0.000820f, 0.000184f, -0.000671f, 0.000041f, -0.000271f, -0.000926f, -0.000304f, + -0.009327f, 0.004900f, 0.002036f, 0.000775f, 0.001246f, 0.000249f, 0.000323f, 0.001123f, 0.001224f, 0.000686f, 0.000810f, -0.000612f, -0.000281f, -0.000963f, 0.001175f, 0.000264f, 0.000200f, 0.001639f, 0.000038f, -0.001073f, 0.001915f, -0.001264f, 0.000141f, 0.001611f, -0.000496f, 0.000435f, 0.000192f, -0.000020f, -0.000815f, -0.000174f, 0.000427f, 0.000477f, 0.000064f, -0.000268f, 0.000018f, -0.000547f, 0.001807f, 0.000173f, -0.000042f, -0.000699f, -0.000374f, -0.000445f, -0.000447f, 0.001003f, 0.000931f, -0.000226f, 0.000080f, -0.000044f, 0.000272f, 0.000087f, -0.000075f, -0.000176f, 0.000212f, 0.000166f, -0.000288f, -0.000239f, 0.000039f, 0.000235f, 0.014030f, 0.005938f, 0.001607f, 0.003199f, 0.001882f, 0.000785f, 0.001416f, 0.001190f, 0.000018f, 0.000866f, 0.001406f, 0.000308f, 0.000019f, 0.000698f, 0.001975f, -0.000676f, -0.000343f, -0.001562f, 0.000411f, 0.001774f, 0.000771f, 0.000071f, -0.000992f, -0.000553f, -0.000417f, 0.001870f, 0.000601f, 0.000973f, 0.000567f, -0.000903f, -0.001421f, 0.001621f, 0.000912f, -0.001011f, -0.000461f, 0.001575f, 0.001352f, -0.000077f, + 0.000349f, -0.000174f, 0.000714f, 0.000437f, -0.000138f, 0.000315f, -0.000542f, -0.000269f, 0.000871f, -0.000458f, -0.000331f, 0.000906f, 0.000797f, 0.000427f, 0.000173f, 0.000184f, 0.000210f, 0.000645f, 0.000372f, 0.001021f, 0.016603f, 0.003577f, 0.002787f, 0.001200f, 0.001292f, 0.000518f, 0.001329f, 0.001524f, 0.002480f, 0.001491f, -0.000441f, 0.001919f, -0.000350f, 0.000505f, 0.000455f, 0.001622f, 0.002440f, 0.001541f, -0.000395f, 0.002686f, -0.000490f, -0.000293f, -0.001399f, 0.000371f, -0.000400f, 0.000430f, 0.000751f, -0.000830f, -0.001111f, -0.000483f, 0.000245f, -0.000922f, -0.000276f, 0.000405f, 0.000624f, -0.001079f, -0.000888f, -0.000390f, 0.000373f, -0.000017f, 0.000305f, -0.000397f, 0.000015f, -0.000271f, -0.000338f, 0.000426f, -0.000593f, 0.000580f, -0.000638f, -0.000238f, -0.000480f, 0.000102f, -0.000159f, 0.000654f, 0.000319f, -0.000058f, 0.000931f, 0.000309f, 0.001926f, -0.007360f, -0.002353f, -0.002634f, -0.001687f, 0.000448f, -0.000413f, -0.001584f, 0.000908f, 0.000060f, 0.001115f, -0.000131f, 0.000122f, -0.001727f, -0.001207f, -0.000806f, -0.001243f, 0.000100f, + -0.001323f, -0.002572f, 0.000513f, 0.000294f, -0.001185f, -0.000268f, -0.001075f, 0.000220f, 0.000368f, -0.000217f, -0.002641f, -0.000757f, 0.000172f, -0.000303f, 0.000230f, 0.000703f, -0.001880f, -0.000573f, -0.001174f, 0.000602f, -0.000143f, -0.000110f, 0.001235f, -0.001259f, -0.000082f, 0.000375f, -0.000157f, -0.000422f, 0.000598f, 0.000305f, -0.000747f, -0.000928f, -0.001459f, -0.000234f, -0.001115f, -0.000916f, -0.000476f, -0.000638f, -0.000372f, -0.000185f, -0.000342f, -0.000576f, -0.000756f, -0.000445f, 0.000272f, 0.000500f, -0.000089f, -0.017254f, -0.005829f, -0.003546f, -0.000875f, -0.001846f, -0.000048f, -0.001008f, -0.001260f, -0.001601f, 0.001981f, 0.000025f, -0.000730f, -0.000206f, -0.002842f, -0.001650f, -0.001375f, 0.002316f, -0.001946f, -0.004179f, 0.000367f, 0.000489f, 0.000349f, -0.001551f, -0.000382f, 0.000855f, -0.001889f, -0.000219f, -0.001928f, -0.000604f, 0.001113f, -0.000959f, 0.000290f, 0.002103f, 0.000255f, -0.000461f, -0.000492f, 0.000555f, 0.000682f, 0.000511f, -0.000610f, -0.000139f, 0.000708f, 0.000915f, 0.000588f, 0.000295f, -0.001768f, 0.000318f, -0.000063f, -0.000929f, + -0.000315f, 0.000155f, -0.000219f, -0.000939f, -0.000585f, -0.000974f, -0.000251f, 0.000027f, 0.000157f, -0.000166f, -0.000643f, -0.000142f, -0.000495f, -0.000065f, -0.000531f, -0.000025f, -0.011470f, 0.002683f, 0.000139f, -0.001362f, 0.002020f, -0.001262f, -0.001032f, 0.000551f, -0.001962f, -0.001120f, -0.000441f, 0.000837f, -0.001554f, 0.002118f, 0.000016f, -0.000021f, 0.000944f, 0.001006f, 0.001498f, -0.000128f, 0.002074f, 0.003056f, 0.002154f, 0.000726f, 0.001839f, -0.000571f, 0.001158f, -0.001342f, -0.001433f, -0.000552f, 0.000146f, 0.000951f, -0.000766f, -0.001287f, -0.000741f, 0.000004f, 0.000791f, -0.001243f, 0.000897f, 0.000353f, 0.000686f, -0.000290f, -0.001192f, -0.001536f, -0.001895f, 0.000526f, -0.000981f, 0.000546f, -0.002007f, -0.000538f, 0.000867f, -0.001215f, 0.000182f, -0.000843f, 0.000576f, -0.000246f, 0.000559f, 0.000174f, -0.000376f, 0.000005f, -0.000821f, 0.001527f, 0.000605f, 0.001413f, 0.000568f, 0.007665f, 0.012616f, 0.003680f, 0.003271f, 0.004575f, 0.003684f, 0.000745f, 0.002920f, 0.002627f, 0.001411f, 0.005545f, 0.001308f, 0.000959f, 0.002384f, 0.002236f, + 0.001159f, 0.001005f, 0.000576f, 0.000945f, -0.000718f, 0.002815f, -0.000751f, 0.000297f, -0.000880f, 0.001794f, 0.000085f, -0.000427f, 0.001459f, 0.001770f, 0.000612f, 0.002340f, -0.001638f, -0.002677f, -0.000612f, -0.000127f, 0.000587f, -0.000156f, 0.001166f, -0.001051f, 0.001062f, 0.002360f, 0.001002f, -0.002040f, -0.000429f, 0.001090f, 0.000414f, -0.000982f, 0.001466f, 0.000609f, 0.000869f, 0.000996f, 0.001310f, 0.000463f, -0.000364f, 0.000354f, -0.001181f, -0.000278f, 0.001106f, 0.001044f, -0.000569f, 0.000018f, 0.000273f, -0.000467f, 0.000160f, 0.000835f, 0.029028f, 0.002976f, -0.000266f, 0.001787f, -0.000029f, 0.002472f, 0.000054f, 0.000660f, 0.000340f, 0.002606f, 0.001246f, -0.001082f, 0.000902f, 0.001246f, 0.000697f, -0.001585f, -0.003255f, -0.001511f, -0.001353f, 0.000576f, -0.001989f, -0.000359f, -0.000103f, 0.000535f, 0.003633f, 0.001999f, 0.000705f, 0.001442f, -0.002221f, -0.000142f, -0.001152f, -0.000455f, -0.000902f, 0.001351f, -0.000493f, 0.002264f, -0.001017f, -0.000412f, -0.001138f, -0.000522f, -0.001655f, -0.000785f, 0.000412f, 0.000365f, -0.000062f, 0.000019f, + -0.000896f, 0.000523f, 0.001589f, 0.000127f, -0.000815f, 0.000981f, -0.001356f, 0.000605f, 0.000634f, -0.000135f, -0.000403f, -0.000292f, -0.000035f, -0.000257f, 0.000096f, 0.000940f, -0.000078f, -0.000857f, 0.000207f, -0.008441f, -0.010047f, -0.001867f, -0.000561f, -0.000411f, -0.001599f, -0.000660f, 0.003046f, 0.001804f, 0.000640f, 0.000832f, -0.001333f, -0.000266f, 0.002285f, -0.000843f, 0.003722f, -0.002893f, -0.000793f, 0.003036f, -0.000589f, -0.000341f, -0.001769f, 0.002080f, 0.002297f, 0.000042f, 0.002264f, -0.000827f, 0.001001f, -0.000048f, -0.001274f, -0.000201f, -0.001009f, -0.000421f, -0.000657f, 0.001251f, -0.000928f, -0.000222f, -0.001425f, 0.000959f, -0.000743f, 0.002095f, -0.003317f, 0.001389f, 0.001148f, -0.002003f, 0.000036f, -0.001325f, 0.000349f, -0.001508f, 0.000470f, 0.000624f, -0.001918f, -0.000292f, -0.000703f, -0.002848f, -0.001655f, -0.000793f, -0.001422f, -0.000311f, -0.000246f, 0.000151f, -0.001165f, 0.000159f, -0.002244f, 0.000621f, 0.000265f, -0.000776f, 0.000271f, -0.000774f, -0.000216f, -0.000505f, -0.000243f, -0.007445f, -0.004230f, -0.005782f, -0.002930f, -0.003871f, + -0.000410f, 0.003685f, -0.003853f, 0.002957f, 0.001928f, -0.002140f, 0.004254f, -0.000696f, 0.000846f, -0.002789f, -0.000274f, -0.001256f, -0.000154f, -0.000009f, 0.001065f, 0.000483f, 0.002230f, 0.004206f, -0.001125f, 0.000555f, -0.002003f, -0.002144f, -0.001858f, 0.000399f, 0.001781f, -0.000649f, -0.000595f, -0.000591f, -0.001289f, 0.001439f, -0.000442f, -0.000128f, -0.001262f, -0.001038f, -0.000834f, -0.001351f, -0.000094f, -0.000088f, -0.001099f, 0.000702f, -0.001692f, 0.000601f, -0.000976f, -0.000209f, 0.000637f, -0.001294f, 0.001577f, -0.002746f, -0.000829f, 0.000224f, -0.000789f, -0.001481f, 0.000726f, -0.000432f, -0.001616f, 0.002643f, 0.001528f, 0.000337f, 0.000525f, 0.000505f, 0.000671f, -0.001386f, -0.000874f, 0.000311f, -0.000468f, -0.000971f, 0.001024f, -0.020685f, -0.002340f, 0.001651f, -0.001489f, 0.003411f, 0.001609f, -0.004201f, 0.000592f, 0.000687f, -0.001322f, -0.003520f, -0.001270f, -0.000870f, 0.001028f, 0.000236f, -0.003213f, -0.001240f, -0.001700f, -0.003135f, -0.002599f, -0.006130f, -0.003153f, -0.003587f, -0.004304f, 0.003427f, -0.002274f, 0.001244f, 0.002611f, -0.001882f, + -0.002908f, -0.001148f, -0.000601f, 0.000689f, 0.001970f, 0.001112f, -0.002403f, -0.003037f, 0.002416f, 0.001478f, 0.001918f, 0.002640f, 0.000418f, -0.000024f, 0.001076f, -0.000139f, -0.001138f, 0.000660f, -0.000599f, -0.000416f, 0.001594f, 0.003961f, -0.001282f, -0.001999f, 0.000961f, -0.001278f, -0.000084f, 0.002036f, -0.003892f, -0.000066f, -0.001258f, -0.000225f, -0.000046f, 0.000014f, -0.000430f, 0.000775f, -0.001132f, 0.001416f, 0.001587f, 0.000644f, -0.000053f, -0.000019f, -0.001286f, 0.016567f, 0.014428f, 0.003922f, 0.008770f, 0.002441f, 0.005047f, -0.000808f, -0.000810f, 0.002470f, 0.003315f, 0.001777f, -0.005739f, -0.001887f, 0.003568f, 0.004052f, -0.001495f, -0.001931f, 0.000651f, 0.001697f, 0.001904f, 0.000301f, -0.002987f, -0.006390f, -0.002411f, 0.003515f, -0.000313f, 0.003612f, -0.000854f, -0.001125f, 0.000725f, -0.002959f, -0.001728f, -0.001712f, 0.003292f, -0.004083f, -0.002831f, 0.000759f, 0.000687f, -0.001035f, -0.000130f, -0.001154f, 0.001233f, 0.001701f, 0.001443f, 0.003275f, 0.001895f, 0.000080f, -0.002658f, 0.002529f, -0.000233f, 0.001414f, -0.001297f, 0.000995f, + 0.001986f, -0.000275f, -0.000526f, -0.001211f, -0.001464f, 0.000930f, 0.000208f, 0.001304f, -0.001265f, 0.001094f, 0.002579f, -0.000510f, -0.001403f, 0.001824f, 0.002339f, -0.000914f, 0.001049f, 0.001200f, 0.000943f, 0.002259f, 0.001912f, 0.020130f, 0.003695f, -0.003884f, 0.003213f, 0.002159f, -0.003854f, -0.000817f, 0.001893f, 0.000148f, 0.000573f, -0.000280f, -0.000847f, -0.004176f, -0.004161f, 0.001850f, 0.003831f, 0.004031f, -0.004009f, -0.007998f, 0.001068f, -0.000109f, -0.003270f, -0.004086f, -0.000780f, 0.002059f, -0.001472f, 0.003050f, 0.004826f, -0.001824f, -0.001655f, -0.000651f, -0.000783f, -0.000947f, -0.007530f, 0.003906f, 0.003495f, -0.000135f, 0.002231f, -0.002264f, -0.000782f, -0.002060f, 0.002949f, 0.003220f, 0.000294f, -0.000806f, -0.001239f, 0.001793f, 0.000366f, -0.001054f, -0.001960f, 0.000001f, 0.001526f, -0.002426f, -0.001571f, -0.001324f, 0.000342f, 0.000768f, -0.003118f, 0.001547f, 0.003297f, -0.002755f, -0.000106f, -0.000670f, -0.000543f, -0.000031f, 0.000265f, 0.000179f, -0.000266f, 0.000592f, -0.000980f, -0.001810f, -0.002194f, -0.000946f, -0.000592f, -0.001168f, + -0.002093f, -0.001642f, -0.000476f, 0.001449f, -0.000681f, -0.005544f, -0.003592f, 0.000479f, 0.005016f, -0.005053f, 0.003596f, 0.001585f, 0.000809f, 0.000972f, 0.000889f, 0.003205f, 0.005293f, 0.000096f, 0.001614f, 0.000536f, -0.004501f, -0.004160f, 0.004042f, 0.000496f, -0.004652f, 0.002711f, -0.003969f, 0.000609f, 0.004935f, -0.000363f, -0.001317f, 0.005556f, 0.000897f, 0.000332f, 0.000484f, 0.000116f, 0.000528f, -0.002518f, 0.001500f, 0.002208f, 0.003721f, -0.002990f, -0.001434f, 0.000522f, 0.000536f, -0.001401f, -0.002633f, 0.001642f, -0.000948f, 0.001134f, 0.000649f, -0.000977f, -0.000839f, 0.000325f, 0.001702f, -0.001331f, -0.000544f, -0.000341f, 0.000986f, -0.002743f, -0.001236f, 0.001193f, 0.000286f, -0.000963f, -0.000450f, 0.001073f, -0.001117f, 0.000299f, -0.000749f, -0.000244f, 0.000929f, 0.000210f, 0.000550f, -0.002376f, -0.001634f, 0.000565f, -0.021614f, -0.019799f, -0.004457f, -0.009161f, -0.008090f, -0.004547f, -0.001413f, -0.003408f, -0.004157f, 0.002828f, 0.000721f, -0.000939f, 0.004681f, 0.001748f, 0.005630f, 0.004403f, 0.001229f, 0.001773f, 0.002032f, -0.008658f, + 0.004057f, -0.000653f, -0.001871f, -0.001609f, -0.005168f, -0.001574f, -0.001817f, 0.004946f, -0.001686f, -0.002932f, -0.001505f, 0.000798f, -0.000682f, -0.000972f, 0.001048f, -0.001292f, -0.000887f, 0.003028f, -0.002999f, -0.000248f, -0.000999f, 0.005437f, 0.002112f, 0.002179f, -0.004218f, 0.000330f, 0.003672f, -0.001945f, 0.000843f, 0.000025f, 0.000858f, 0.000029f, 0.000266f, -0.000280f, 0.002322f, -0.000305f, -0.000819f, 0.001728f, -0.001272f, 0.000970f, 0.002016f, -0.000964f, -0.001483f, 0.000640f, 0.000740f, -0.001551f, -0.000685f, -0.002863f, -0.002317f, 0.000750f, -0.000311f, -0.000507f, -0.000103f, 0.000374f, -0.000235f, -0.001820f, -0.000907f, -0.013591f, 0.028623f, 0.017842f, 0.005832f, 0.001671f, 0.002042f, 0.001944f, 0.003285f, 0.002734f, 0.006125f, 0.012000f, 0.000771f, 0.001297f, 0.002714f, 0.002396f, 0.003193f, -0.002332f, 0.011812f, 0.008279f, -0.007697f, 0.005674f, 0.001152f, -0.001329f, 0.002905f, 0.007010f, -0.006559f, -0.001967f, 0.000629f, -0.005592f, -0.003674f, -0.004015f, 0.008146f, -0.000425f, -0.001345f, 0.001004f, 0.000533f, -0.002473f, -0.006383f, 0.004423f, + 0.003752f, -0.001161f, 0.002088f, 0.004538f, -0.002972f, 0.002445f, 0.000348f, -0.001259f, 0.003721f, 0.003041f, 0.000812f, 0.000361f, 0.000460f, 0.002439f, 0.003615f, -0.000027f, -0.000549f, -0.000091f, -0.001028f, 0.002419f, 0.000608f, -0.001058f, -0.001145f, -0.000955f, 0.001971f, 0.000818f, 0.004363f, -0.001342f, 0.001619f, -0.001000f, 0.001158f, -0.001793f, -0.000526f, 0.000477f, -0.000855f, -0.001267f, 0.000202f, 0.000161f, 0.000643f, 0.001110f, 0.030976f, -0.010950f, -0.010656f, 0.004799f, 0.001244f, -0.004102f, -0.003517f, -0.005716f, -0.005565f, -0.004156f, -0.003428f, 0.005073f, 0.001247f, 0.000572f, -0.002851f, -0.002582f, -0.008999f, -0.000056f, -0.003524f, -0.006268f, 0.005240f, 0.003404f, 0.001125f, 0.003161f, 0.000956f, -0.001136f, -0.001949f, -0.000214f, -0.001638f, 0.002580f, 0.004501f, -0.004761f, -0.001679f, 0.000026f, 0.002486f, 0.006118f, 0.001913f, 0.008220f, -0.004177f, 0.002566f, 0.006949f, 0.004019f, -0.003368f, -0.001062f, 0.000871f, -0.001787f, 0.003046f, -0.000501f, 0.000241f, 0.004361f, 0.002490f, 0.000667f, 0.000501f, -0.000146f, -0.001759f, -0.000089f, + 0.000622f, -0.002011f, -0.001023f, 0.001916f, -0.000664f, -0.003780f, -0.000446f, 0.000078f, -0.000547f, -0.003934f, 0.001122f, 0.000770f, 0.001085f, 0.001058f, -0.000704f, -0.001651f, -0.000440f, -0.000848f, 0.003285f, 0.001327f, -0.001122f, 0.000854f, -0.000176f, 0.000641f, 0.000166f, 0.009962f, 0.018836f, 0.007446f, 0.005028f, 0.005949f, -0.001744f, 0.001942f, -0.005405f, 0.009422f, 0.003676f, 0.009053f, 0.002677f, 0.003480f, -0.008239f, 0.010318f, 0.015206f, 0.001984f, 0.009855f, -0.001928f, -0.008021f, -0.007875f, 0.007228f, -0.002276f, 0.005770f, 0.001127f, 0.002307f, -0.004380f, 0.004465f, -0.001496f, -0.001606f, 0.007451f, 0.005129f, -0.003810f, 0.006899f, 0.000844f, 0.001256f, -0.001321f, -0.005214f, 0.001521f, 0.000384f, -0.002825f, -0.003285f, 0.003130f, 0.004289f, 0.001485f, -0.001515f, 0.002104f, 0.000163f, 0.004648f, -0.002756f, -0.000320f, -0.004543f, 0.000613f, 0.004444f, 0.003074f, -0.002064f, 0.000069f, 0.001562f, -0.003949f, -0.000303f, -0.002668f, -0.001534f, 0.000929f, 0.001064f, 0.002801f, -0.003184f, 0.001470f, -0.003663f, 0.000412f, 0.004544f, 0.001688f, + 0.000898f, -0.002784f, 0.000429f, 0.000437f, -0.004737f, -0.001163f, 0.000555f, 0.000904f, 0.001882f, 0.000860f, -0.000024f, -0.022116f, -0.001125f, -0.005058f, 0.006331f, -0.004847f, 0.005221f, 0.000073f, 0.004199f, -0.000657f, 0.003631f, -0.011096f, 0.003309f, -0.001378f, -0.003901f, 0.001850f, -0.004768f, 0.002882f, -0.004815f, -0.002666f, -0.010724f, 0.006052f, 0.012993f, -0.005162f, -0.001653f, -0.001568f, -0.002056f, 0.001879f, 0.002625f, 0.003657f, -0.009536f, 0.002774f, -0.005920f, -0.001804f, -0.000281f, 0.004828f, 0.001921f, -0.002569f, 0.001082f, 0.000953f, 0.003560f, 0.003496f, -0.005946f, -0.002070f, 0.000902f, -0.004463f, -0.003856f, -0.000837f, -0.002746f, 0.001085f, 0.003381f, 0.000349f, 0.000612f, -0.000891f, 0.003153f, 0.008329f, 0.004787f, -0.005279f, 0.001075f, 0.001811f, -0.002537f, 0.002869f, 0.000801f, -0.003418f, -0.000287f, 0.003693f, 0.000432f, 0.003530f, -0.004865f, -0.001245f, 0.002961f, 0.000036f, -0.001583f, -0.003507f, -0.000235f, -0.001911f, 0.002833f, -0.000905f, 0.001778f, -0.000947f, -0.000338f, -0.040541f, -0.015093f, 0.008127f, 0.003050f, -0.005283f, + 0.005838f, 0.004652f, 0.007680f, -0.001920f, -0.003222f, 0.006545f, 0.000385f, -0.004552f, 0.009123f, -0.010193f, -0.013061f, -0.006298f, -0.006959f, 0.004531f, 0.006743f, -0.000234f, 0.001823f, 0.010388f, 0.004723f, -0.010687f, -0.004679f, -0.006604f, 0.002069f, -0.009928f, -0.008475f, -0.000599f, 0.001450f, -0.003845f, -0.004001f, -0.006079f, -0.002997f, -0.005569f, -0.005261f, -0.002095f, 0.000587f, -0.002034f, -0.000191f, -0.003777f, -0.000444f, -0.002909f, -0.006131f, 0.013457f, 0.001229f, 0.003134f, -0.005384f, 0.003518f, -0.000220f, 0.001769f, -0.004295f, -0.000241f, -0.000582f, -0.003744f, -0.002169f, -0.001738f, 0.004535f, 0.003151f, 0.003580f, 0.002083f, 0.002809f, -0.000680f, 0.000184f, -0.003245f, -0.000439f, -0.000210f, -0.000103f, 0.004101f, 0.001277f, 0.002383f, 0.002691f, -0.001931f, -0.004342f, 0.001872f, -0.001575f, -0.000851f, 0.001986f, 0.005275f, -0.000501f, 0.021178f, 0.007834f, 0.017059f, 0.002734f, 0.001127f, -0.006794f, 0.002609f, 0.010275f, 0.003833f, 0.000795f, 0.006858f, -0.006094f, -0.002755f, 0.005644f, -0.004260f, 0.002006f, 0.009828f, 0.003224f, 0.001345f, + 0.003198f, -0.001783f, 0.004343f, -0.003239f, 0.000182f, 0.001682f, 0.000645f, -0.002492f, -0.002629f, 0.001082f, 0.010197f, -0.003252f, 0.002585f, -0.009303f, -0.004907f, 0.004297f, 0.010744f, -0.008163f, 0.000151f, 0.005173f, 0.001381f, 0.001993f, -0.006690f, -0.002329f, -0.005768f, -0.010206f, -0.002614f, -0.005654f, -0.005925f, 0.004910f, 0.002041f, 0.001730f, -0.003421f, -0.002104f, -0.000601f, -0.009792f, -0.000823f, 0.005577f, -0.003800f, 0.004488f, 0.009200f, 0.001445f, 0.006129f, 0.004036f, 0.000448f, -0.001751f, 0.005336f, -0.006538f, -0.000200f, -0.000325f, 0.004271f, 0.002085f, 0.003946f, 0.000223f, 0.004366f, -0.000188f, 0.000999f, 0.000729f, 0.004644f, 0.000115f, 0.000169f, 0.004140f, -0.002063f, 0.002614f, 0.001021f, 0.000773f, -0.001183f, 0.025902f, -0.005789f, -0.007781f, 0.001134f, 0.006061f, 0.004689f, 0.005068f, -0.001567f, 0.005456f, 0.001541f, -0.006189f, -0.012786f, 0.008612f, 0.002149f, 0.006268f, 0.003535f, -0.003233f, 0.001365f, -0.004710f, -0.008404f, 0.008737f, -0.005505f, -0.010160f, 0.000975f, -0.001550f, 0.001153f, -0.000885f, -0.001158f, -0.002476f, + -0.004197f, 0.003174f, 0.006831f, -0.009899f, 0.009705f, -0.008353f, -0.011196f, 0.001219f, 0.002863f, -0.006115f, 0.004821f, -0.000744f, 0.003021f, -0.005245f, -0.002775f, 0.009307f, 0.003650f, 0.009423f, 0.002371f, 0.000848f, 0.002861f, 0.000118f, 0.000260f, 0.005006f, -0.000509f, 0.001004f, -0.004421f, -0.002810f, -0.002651f, 0.003570f, -0.003454f, -0.002732f, 0.005447f, -0.000014f, 0.006110f, 0.001093f, -0.004597f, 0.007557f, 0.005687f, -0.000323f, 0.003682f, -0.003645f, -0.006314f, 0.002551f, -0.002361f, -0.004341f, 0.000312f, 0.004110f, 0.005305f, -0.001877f, 0.001605f, 0.002760f, -0.000431f, 0.001271f, -0.005463f, 0.002223f, 0.001796f, -0.002537f, 0.021640f, 0.026259f, -0.003985f, 0.000114f, -0.013188f, -0.001545f, -0.009610f, -0.007271f, -0.002258f, -0.004986f, 0.007498f, -0.000042f, 0.005828f, -0.012399f, 0.010318f, -0.007825f, 0.010536f, 0.000329f, 0.008377f, -0.003052f, 0.010545f, 0.003408f, -0.004944f, 0.002171f, -0.007405f, 0.004906f, -0.004103f, 0.011774f, 0.003574f, 0.007725f, -0.012869f, -0.007441f, -0.003117f, -0.006588f, -0.002688f, -0.004520f, 0.000474f, 0.015932f, + -0.007327f, 0.007992f, 0.013591f, 0.001881f, 0.006008f, 0.000043f, -0.002978f, -0.006355f, -0.004763f, 0.000637f, -0.003421f, 0.008136f, -0.005237f, 0.003712f, 0.009945f, -0.001336f, -0.000758f, -0.000826f, 0.008145f, 0.008707f, 0.002798f, -0.004091f, -0.003497f, -0.002175f, 0.003478f, -0.008039f, 0.001565f, -0.001467f, -0.002143f, 0.000083f, 0.005348f, 0.000442f, 0.007548f, 0.006824f, 0.001421f, 0.001616f, -0.003193f, -0.000191f, 0.007759f, -0.001021f, 0.000521f, 0.003201f, -0.004043f, 0.000052f, -0.004637f, -0.005146f, 0.000810f, 0.000714f, -0.000959f, -0.020425f, -0.018446f, 0.008261f, -0.002511f, 0.010202f, -0.005832f, -0.004674f, -0.006947f, -0.005559f, -0.002679f, -0.016094f, -0.006001f, 0.006316f, 0.008633f, 0.003680f, -0.011339f, -0.003112f, -0.005474f, 0.004875f, 0.016250f, 0.009228f, 0.003928f, 0.000737f, 0.001180f, 0.000948f, 0.002812f, 0.008537f, 0.000633f, 0.002323f, -0.004850f, 0.000503f, -0.006929f, 0.002803f, 0.003319f, 0.006213f, 0.000750f, -0.004052f, -0.002132f, 0.008159f, -0.003776f, 0.003158f, 0.001613f, 0.003041f, 0.010241f, -0.005588f, -0.008711f, 0.003393f, + 0.007295f, 0.002068f, 0.007292f, 0.008914f, 0.004216f, 0.006223f, 0.002328f, 0.001448f, 0.004807f, 0.014774f, -0.008164f, 0.000133f, 0.002389f, 0.001442f, -0.006334f, -0.000975f, 0.004856f, 0.000063f, -0.005680f, 0.002402f, 0.010612f, -0.008495f, 0.002807f, -0.008036f, 0.004725f, 0.003365f, 0.001300f, 0.000469f, -0.003869f, -0.003695f, 0.007467f, 0.004191f, 0.001520f, -0.002127f, 0.005233f, -0.000592f, 0.000015f, -0.003481f, 0.003858f, 0.001595f, -0.041169f, -0.014506f, -0.000826f, -0.004220f, -0.010078f, 0.006115f, 0.008401f, 0.013904f, 0.004702f, 0.008703f, -0.008079f, -0.017358f, 0.008134f, -0.004181f, 0.000529f, -0.009395f, 0.009237f, -0.005594f, -0.000338f, 0.008389f, -0.023443f, 0.002162f, 0.012337f, -0.022952f, -0.005946f, -0.008204f, 0.001198f, 0.000739f, 0.005681f, -0.006465f, 0.007499f, 0.000942f, -0.011887f, -0.006287f, 0.001507f, -0.001652f, -0.005844f, 0.005106f, 0.014015f, 0.002858f, 0.003940f, -0.002354f, -0.003380f, 0.008005f, 0.001569f, -0.004203f, -0.019920f, -0.003309f, 0.002608f, -0.010267f, 0.004900f, 0.003972f, 0.000894f, -0.007965f, -0.006930f, -0.008485f, + 0.018039f, 0.004637f, -0.002658f, 0.003347f, -0.015187f, 0.001662f, -0.007068f, -0.008344f, 0.008026f, -0.001490f, 0.000179f, -0.005312f, -0.019024f, 0.002440f, 0.005879f, 0.003219f, -0.001320f, 0.011160f, 0.000451f, -0.004875f, -0.000683f, -0.007558f, 0.011779f, 0.006236f, 0.003348f, -0.002077f, 0.000869f, 0.003629f, -0.003412f, 0.001334f, 0.001685f, 0.000494f, 0.043832f, 0.010993f, 0.011346f, 0.009567f, -0.002749f, 0.000347f, 0.045082f, 0.012977f, -0.003674f, 0.027482f, -0.015377f, 0.011453f, 0.002469f, 0.006993f, 0.011302f, -0.003495f, -0.007787f, 0.008461f, -0.001478f, -0.027212f, 0.007021f, 0.007042f, 0.005827f, 0.012940f, 0.008275f, 0.008451f, -0.007587f, 0.001686f, -0.007321f, -0.003861f, 0.008141f, 0.002678f, -0.015794f, -0.009476f, -0.013222f, -0.019804f, -0.002946f, 0.004097f, 0.009767f, 0.008366f, 0.007290f, 0.006051f, -0.002838f, 0.010381f, 0.005864f, -0.012590f, -0.004724f, 0.003387f, 0.009602f, 0.000254f, 0.002155f, 0.016752f, -0.002886f, -0.001384f, -0.004220f, -0.000838f, 0.008638f, -0.007240f, 0.000244f, -0.010253f, -0.009026f, -0.005817f, 0.010838f, 0.014772f, + -0.004147f, 0.001240f, -0.002708f, -0.009088f, -0.006064f, 0.002430f, -0.010453f, -0.002757f, -0.002692f, -0.006784f, 0.018900f, 0.004175f, 0.006420f, 0.005537f, -0.000396f, 0.000095f, 0.003392f, 0.001060f, 0.006054f, 0.003796f, 0.000262f, -0.000516f, 0.044762f, 0.026123f, 0.002092f, 0.016515f, 0.012966f, 0.003449f, 0.019510f, 0.005246f, 0.000133f, -0.006195f, -0.004253f, -0.012785f, -0.033958f, -0.002726f, 0.003516f, -0.011849f, -0.006449f, -0.001503f, 0.024041f, 0.007619f, -0.005993f, 0.000058f, 0.001851f, -0.003601f, 0.010249f, -0.001879f, -0.006001f, -0.004409f, -0.005646f, 0.003586f, -0.008388f, -0.021149f, 0.000669f, -0.011126f, -0.016770f, 0.003145f, 0.007509f, 0.010440f, 0.006172f, 0.009221f, -0.006216f, -0.018240f, -0.011591f, -0.016425f, 0.006569f, 0.015050f, 0.012735f, 0.007932f, 0.015396f, 0.000211f, 0.009694f, 0.020464f, -0.016890f, 0.002902f, -0.007519f, -0.000099f, 0.006127f, 0.005978f, 0.010230f, -0.001083f, -0.020687f, -0.016308f, 0.003667f, -0.004737f, -0.005740f, -0.004159f, -0.004363f, -0.014473f, 0.001463f, 0.009512f, -0.000837f, 0.007205f, -0.004236f, -0.000557f, + -0.000601f, 0.003515f, 0.014389f, 0.009828f, 0.008850f, -0.008372f, 0.000683f, -0.005107f, 0.000792f, -0.013311f, 0.002852f, 0.001991f, 0.001642f, -0.000449f, -0.001391f, -0.003964f, 0.003498f, 0.010933f, -0.022344f, 0.002838f, -0.017126f, 0.007698f, -0.032617f, -0.000805f, -0.010888f, -0.016702f, 0.029931f, 0.017059f, -0.010817f, -0.026903f, -0.006933f, -0.009773f, -0.023684f, 0.018407f, 0.000866f, -0.016231f, -0.006177f, 0.009482f, -0.015547f, -0.010439f, -0.008229f, -0.018226f, -0.007142f, -0.000318f, -0.014921f, -0.013366f, 0.018701f, -0.006985f, -0.006013f, -0.001694f, -0.004348f, 0.016054f, -0.017884f, -0.008251f, 0.003602f, -0.004690f, -0.000168f, -0.003992f, 0.009085f, -0.016789f, 0.005837f, -0.026864f, 0.002579f, -0.007665f, -0.010899f, 0.028263f, 0.002771f, -0.010419f, 0.005218f, 0.005918f, -0.022970f, 0.015832f, -0.004033f, -0.004898f, -0.001905f, 0.009054f, -0.003952f, 0.000408f, -0.011103f, 0.005943f, 0.007210f, 0.012709f, -0.011170f, -0.028155f, 0.019460f, -0.002258f, 0.007917f, 0.009615f, -0.006034f, 0.005541f, 0.014326f, -0.018577f, 0.000785f, -0.006558f, -0.002236f, -0.019289f, + 0.006355f, -0.003020f, 0.000552f, -0.000510f, 0.002325f, -0.003274f, -0.003145f, 0.005270f, -0.005114f, 0.003804f, 0.000889f, -0.003659f, -0.042797f, -0.023422f, 0.005038f, -0.014837f, 0.001545f, -0.010650f, -0.005944f, -0.015746f, -0.011314f, 0.008342f, 0.023594f, 0.025365f, 0.003703f, 0.017976f, -0.012518f, 0.031202f, 0.022418f, -0.017826f, -0.016569f, 0.005390f, 0.004812f, 0.026411f, 0.009194f, 0.017004f, -0.006332f, 0.006971f, -0.003696f, -0.002546f, -0.005841f, 0.024705f, 0.010642f, 0.023673f, 0.020965f, 0.004343f, -0.001559f, -0.010098f, 0.009961f, -0.000974f, -0.021719f, -0.014025f, -0.004379f, -0.010816f, -0.002781f, -0.011125f, -0.010292f, 0.007004f, -0.003335f, -0.006953f, 0.017564f, 0.021315f, -0.012438f, -0.003809f, 0.028425f, 0.011963f, -0.019944f, -0.019059f, -0.007273f, 0.007501f, -0.001233f, -0.003357f, -0.014286f, 0.012029f, 0.003319f, -0.004317f, 0.002957f, 0.003472f, -0.017639f, -0.007401f, 0.001329f, -0.006307f, -0.008730f, -0.008864f, 0.023184f, -0.018195f, -0.016823f, 0.006998f, 0.011740f, 0.017401f, -0.009034f, -0.002571f, 0.001341f, -0.007696f, 0.007895f, -0.001019f, + 0.005849f, -0.004952f, -0.002446f, 0.001808f, 0.002080f, -0.002756f, -0.002909f, -0.000020f, -0.003485f, -0.016266f, -0.023662f, -0.020495f, -0.000084f, -0.016146f, -0.020566f, 0.005238f, -0.001690f, -0.028860f, 0.020635f, 0.003594f, -0.001671f, 0.010174f, 0.031758f, 0.030212f, 0.013129f, -0.037127f, 0.013842f, 0.009779f, -0.036250f, -0.000560f, -0.017465f, -0.008566f, 0.018778f, -0.022019f, 0.012826f, -0.000051f, -0.003712f, -0.007899f, 0.003839f, -0.001872f, 0.006359f, -0.004273f, -0.019388f, 0.018848f, 0.009003f, 0.022583f, -0.002294f, -0.007664f, -0.010880f, 0.009123f, -0.009800f, 0.026682f, 0.005685f, 0.016014f, -0.020760f, 0.016549f, 0.000702f, 0.005838f, -0.013457f, 0.004508f, -0.015994f, -0.002564f, -0.016409f, 0.006703f, 0.011443f, -0.021895f, 0.000941f, -0.018044f, 0.008489f, 0.010616f, 0.010419f, -0.001445f, -0.030853f, 0.000039f, 0.008213f, -0.002685f, 0.013789f, -0.029589f, 0.007634f, -0.012321f, 0.004020f, -0.010443f, 0.002202f, 0.007626f, -0.003278f, -0.000128f, -0.003166f, -0.003861f, 0.001232f, -0.007986f, 0.010072f, 0.002242f, -0.000204f, -0.012721f, -0.001127f, 0.001321f, + -0.000860f, 0.005314f, -0.005433f, 0.001205f, -0.000530f, -0.002818f, 0.044466f, 0.053939f, 0.022562f, 0.018807f, -0.031097f, 0.029911f, 0.043427f, -0.047516f, 0.005686f, 0.030817f, 0.005365f, -0.056675f, -0.005658f, -0.030767f, 0.009932f, 0.011272f, -0.014326f, -0.005609f, 0.010335f, -0.026024f, -0.002078f, -0.010197f, -0.012786f, 0.005076f, -0.019737f, 0.021259f, 0.015155f, 0.027494f, -0.013621f, 0.004492f, -0.002970f, -0.011217f, 0.034715f, -0.000689f, -0.015980f, -0.007557f, 0.007499f, -0.007488f, -0.009094f, -0.010679f, 0.017658f, 0.006548f, 0.024549f, -0.001755f, 0.008998f, 0.032210f, -0.020452f, 0.004260f, -0.013890f, 0.025552f, -0.010053f, 0.011942f, 0.005066f, -0.001043f, -0.009699f, -0.018241f, -0.012328f, 0.005108f, 0.023099f, -0.021773f, 0.019487f, 0.023030f, 0.011579f, 0.026918f, -0.013182f, -0.010752f, 0.017543f, -0.003077f, -0.003280f, -0.024899f, -0.001588f, -0.020551f, 0.004200f, 0.025946f, 0.012732f, 0.006502f, 0.011896f, 0.007045f, -0.011184f, -0.005082f, -0.019519f, 0.022007f, 0.000906f, -0.008817f, 0.005809f, 0.001933f, -0.010270f, 0.005306f, -0.001490f, 0.006268f, + -0.001081f, 0.009539f, 0.004570f, -0.020755f, -0.070541f, -0.029626f, -0.050720f, -0.027433f, -0.021674f, 0.011671f, -0.032556f, -0.033326f, -0.015911f, -0.044524f, -0.014452f, 0.033482f, -0.001014f, 0.001273f, -0.009057f, -0.007935f, -0.004197f, 0.002988f, -0.000535f, -0.029843f, -0.004724f, -0.005946f, 0.043177f, -0.005663f, 0.038390f, 0.003046f, -0.010322f, 0.009916f, 0.031607f, -0.001710f, 0.000330f, -0.012794f, -0.003714f, -0.013425f, 0.007515f, -0.005714f, -0.011357f, 0.005665f, -0.015343f, 0.012400f, 0.012668f, 0.002384f, 0.027677f, -0.012603f, 0.014108f, -0.011787f, 0.015570f, 0.010459f, 0.029159f, 0.003919f, -0.011882f, 0.015606f, -0.001998f, -0.009840f, 0.037033f, -0.002833f, -0.002234f, 0.021261f, 0.006579f, 0.028649f, -0.022369f, -0.021900f, -0.003326f, -0.009526f, -0.003010f, -0.035388f, -0.008032f, 0.012189f, -0.004793f, -0.015267f, -0.024849f, 0.001620f, 0.007596f, -0.012489f, -0.011902f, -0.021669f, -0.007699f, 0.009124f, 0.009470f, 0.019083f, -0.003070f, -0.001814f, -0.000682f, 0.006336f, 0.007641f, 0.001251f, 0.012120f, 0.003293f, 0.001303f, -0.001670f, -0.001156f, 0.008641f, + -0.003709f, 0.008541f, 0.009661f, -0.000451f, 0.002867f}, + {-0.005166f, 0.002777f, -0.001458f, 0.001697f, -0.001015f, 0.001427f, -0.003001f, 0.000132f, -0.000123f, -0.000344f, 0.000687f, 0.001488f, -0.000057f, -0.000145f, -0.001647f, -0.000658f, 0.000702f, 0.000404f, -0.000199f, 0.000646f, -0.000205f, 0.000225f, -0.000746f, -0.000506f, -0.000510f, -0.000173f, 0.000065f, -0.000381f, -0.000271f, 0.000876f, -0.000517f, 0.000533f, -0.000509f, -0.000087f, -0.000399f, 0.000489f, 0.000176f, 0.000403f, 0.000686f, 0.000866f, 0.000322f, 0.000234f, -0.000082f, 0.000097f, 0.000130f, -0.000180f, 0.000167f, 0.001825f, -0.002088f, -0.000278f, -0.000385f, -0.000517f, 0.000336f, -0.001035f, 0.000350f, -0.000023f, 0.000470f, 0.000415f, -0.000824f, -0.000291f, 0.001252f, -0.000130f, 0.000266f, -0.000232f, 0.000543f, 0.001151f, 0.001328f, 0.000227f, 0.000571f, -0.000019f, -0.001052f, -0.000031f, 0.000112f, -0.000227f, 0.000002f, 0.000579f, -0.000605f, -0.000810f, 0.000351f, -0.000391f, -0.000364f, -0.000568f, -0.000028f, 0.000598f, 0.000148f, -0.000177f, -0.000219f, -0.000238f, -0.000006f, 0.000133f, -0.000323f, 0.000118f, -0.000368f, 0.000221f, -0.005242f, -0.003704f, + -0.001828f, -0.001355f, -0.001061f, -0.001067f, -0.000385f, -0.000786f, -0.000260f, -0.000491f, -0.001307f, 0.000258f, 0.000648f, -0.000100f, 0.000364f, -0.000243f, -0.000685f, -0.000667f, -0.001028f, -0.000341f, 0.000230f, 0.000035f, -0.000585f, 0.000389f, -0.000705f, -0.000676f, 0.000432f, 0.000003f, 0.000007f, 0.000362f, 0.000391f, 0.000110f, -0.000173f, -0.000200f, -0.000284f, 0.000140f, 0.000055f, -0.000355f, 0.000175f, -0.000709f, -0.000323f, -0.000176f, -0.000091f, -0.000506f, -0.000120f, -0.000187f, -0.000029f, -0.007463f, -0.000969f, 0.000546f, 0.000141f, 0.000514f, 0.000089f, -0.000437f, 0.000300f, -0.000343f, -0.000320f, -0.000694f, -0.000532f, 0.000243f, -0.000179f, 0.000447f, -0.000427f, -0.000019f, -0.000412f, 0.000113f, 0.000785f, -0.000224f, 0.000592f, 0.000005f, -0.000486f, -0.000130f, 0.000715f, 0.000318f, 0.000476f, 0.000479f, -0.000682f, 0.000455f, -0.000260f, -0.000084f, -0.000354f, -0.000210f, 0.000239f, 0.000283f, 0.000197f, -0.000198f, 0.000583f, 0.000452f, 0.000318f, -0.000190f, -0.000325f, 0.000025f, -0.000262f, 0.000035f, 0.008778f, 0.006959f, 0.001669f, 0.003106f, + 0.000771f, 0.002399f, 0.001717f, 0.000506f, 0.001729f, 0.000670f, 0.001317f, 0.000547f, -0.000449f, 0.001287f, 0.000939f, -0.000369f, -0.000095f, -0.002431f, -0.000237f, 0.000112f, 0.001499f, 0.000157f, 0.000082f, 0.000742f, 0.000085f, 0.000671f, 0.000652f, 0.000092f, -0.000024f, 0.000232f, 0.001034f, 0.000765f, 0.000677f, -0.000070f, -0.000231f, 0.000038f, 0.000496f, -0.000180f, -0.000020f, 0.000519f, 0.000202f, -0.000261f, 0.000018f, 0.000111f, -0.000483f, 0.000642f, -0.000343f, 0.015464f, 0.005588f, 0.002784f, 0.001564f, 0.001043f, 0.000942f, 0.001001f, 0.001520f, 0.000444f, 0.002515f, 0.000411f, 0.000181f, 0.001164f, -0.000655f, 0.000327f, -0.000322f, -0.000214f, -0.000481f, 0.001715f, 0.000857f, -0.000069f, 0.001204f, -0.000797f, -0.000273f, -0.000235f, 0.001890f, -0.000111f, 0.000646f, 0.000226f, 0.000901f, 0.000239f, -0.000333f, 0.000576f, 0.000603f, -0.000224f, 0.000183f, 0.000345f, 0.000127f, 0.000475f, -0.000176f, 0.000534f, 0.000363f, -0.001167f, 0.000227f, 0.000229f, 0.000193f, 0.000939f, 0.005980f, -0.004442f, -0.001466f, -0.002094f, -0.001192f, -0.001274f, + 0.000876f, -0.000760f, -0.001761f, -0.000532f, -0.002364f, -0.000644f, -0.000995f, -0.002402f, -0.000532f, 0.000445f, -0.001414f, -0.000572f, 0.000283f, -0.001723f, -0.000020f, 0.001808f, 0.000477f, 0.000186f, -0.000816f, -0.000051f, 0.000711f, -0.000075f, -0.000748f, -0.000935f, 0.000918f, -0.000169f, -0.001076f, 0.000011f, -0.000430f, 0.001281f, 0.000008f, 0.000523f, -0.000175f, 0.001091f, -0.000737f, 0.000376f, 0.000204f, 0.000176f, 0.000059f, 0.000202f, 0.000010f, -0.000487f, 0.000769f, 0.000455f, 0.000074f, -0.016298f, -0.009124f, -0.001940f, -0.002232f, -0.001638f, -0.001946f, -0.002891f, -0.000207f, 0.000006f, -0.000778f, 0.000635f, -0.000720f, 0.000045f, -0.000034f, -0.001002f, -0.000979f, -0.001691f, -0.000524f, 0.001514f, -0.001475f, -0.000250f, 0.001476f, 0.000839f, -0.000197f, 0.000448f, -0.000183f, -0.001647f, -0.000754f, -0.001368f, -0.000414f, -0.000025f, -0.000302f, 0.000659f, -0.001355f, -0.001172f, -0.000030f, -0.001421f, -0.001019f, -0.001032f, -0.001086f, 0.001060f, -0.000334f, -0.001497f, -0.000444f, 0.000291f, 0.000438f, -0.000570f, -0.000720f, -0.000420f, -0.001341f, -0.000727f, + -0.010118f, 0.005877f, 0.001985f, 0.001096f, 0.000824f, 0.001033f, 0.000282f, -0.000905f, 0.000129f, -0.000473f, -0.000334f, 0.001945f, 0.000943f, 0.001699f, 0.001427f, 0.001787f, -0.001499f, 0.000852f, 0.001603f, 0.000448f, 0.001379f, -0.001630f, 0.000199f, -0.000285f, -0.000262f, -0.000503f, 0.000505f, -0.000062f, -0.000110f, 0.001758f, -0.001772f, -0.000322f, 0.000489f, 0.001088f, -0.000561f, 0.000937f, -0.000781f, -0.000897f, 0.001146f, -0.000459f, -0.000185f, -0.000177f, 0.000353f, 0.000019f, 0.000460f, -0.000452f, -0.000370f, -0.000391f, -0.000285f, -0.000317f, 0.000826f, 0.000277f, 0.000181f, -0.000399f, -0.000835f, 0.000239f, 0.000841f, 0.000237f, 0.014904f, 0.005981f, 0.001374f, 0.003293f, 0.002737f, 0.000428f, 0.001276f, 0.003112f, 0.001553f, -0.000160f, 0.000780f, 0.000315f, -0.000374f, 0.000833f, 0.002845f, 0.000564f, 0.003378f, 0.001514f, -0.002601f, 0.000428f, 0.000197f, 0.000480f, 0.002523f, 0.001289f, 0.001078f, -0.000287f, -0.000274f, -0.000401f, -0.000305f, 0.000306f, -0.000426f, 0.000737f, 0.000349f, 0.001030f, -0.000116f, -0.000349f, 0.000511f, 0.000831f, + 0.000598f, -0.000162f, -0.001076f, -0.000563f, -0.000548f, 0.000999f, 0.000879f, 0.001137f, 0.000774f, 0.000122f, 0.000286f, 0.000967f, 0.000924f, 0.000619f, 0.000224f, 0.000102f, 0.000627f, 0.000495f, 0.000392f, 0.000788f, 0.016626f, 0.004672f, 0.002144f, 0.002513f, 0.000502f, 0.002426f, -0.000329f, -0.001030f, 0.000023f, 0.000569f, 0.000344f, -0.000149f, 0.000553f, 0.002479f, -0.000297f, -0.001665f, -0.001038f, 0.001166f, 0.000395f, 0.001372f, 0.002362f, 0.001933f, -0.000056f, 0.001267f, -0.001370f, 0.000095f, -0.001046f, 0.001472f, 0.000961f, -0.001794f, 0.001091f, -0.000884f, 0.000203f, -0.000724f, 0.001105f, -0.000698f, 0.001366f, 0.000969f, 0.000911f, 0.001605f, 0.000624f, -0.000086f, -0.000325f, -0.000046f, 0.000306f, 0.001787f, 0.000032f, 0.000001f, 0.000212f, 0.000844f, 0.000674f, 0.000025f, -0.000146f, -0.000309f, -0.000888f, -0.000207f, -0.000662f, -0.000288f, 0.002370f, -0.007128f, -0.002776f, -0.001228f, -0.001527f, -0.000819f, -0.000522f, 0.000022f, 0.001094f, -0.001116f, -0.001820f, 0.001692f, -0.002204f, -0.002269f, -0.000316f, -0.000594f, 0.001079f, -0.000708f, + 0.000036f, -0.002197f, -0.001175f, -0.002633f, -0.002711f, -0.003199f, -0.000348f, 0.000633f, -0.002090f, -0.000676f, 0.000393f, 0.000141f, 0.000177f, -0.000372f, -0.002071f, -0.001432f, 0.001018f, 0.000268f, -0.000420f, 0.001945f, -0.001283f, -0.000708f, 0.000590f, 0.001155f, 0.001102f, -0.000272f, -0.000228f, 0.000396f, 0.000383f, -0.001417f, 0.000202f, -0.000872f, -0.000271f, 0.000006f, -0.000454f, -0.000023f, 0.000982f, 0.000103f, -0.000105f, 0.000130f, -0.000916f, 0.000512f, 0.000898f, -0.000271f, 0.000042f, 0.000021f, -0.000082f, -0.018036f, -0.005625f, -0.003441f, -0.001370f, -0.002487f, -0.001914f, -0.000616f, -0.001355f, -0.000622f, -0.001822f, -0.002555f, -0.001759f, -0.000656f, -0.003683f, -0.000933f, -0.001476f, -0.002299f, -0.000240f, 0.000346f, 0.001250f, -0.001363f, -0.001822f, -0.000730f, 0.001564f, 0.001917f, 0.002441f, 0.001247f, -0.000030f, -0.001229f, -0.000504f, -0.000028f, -0.001429f, 0.000571f, 0.001030f, 0.001213f, -0.000818f, -0.000770f, -0.000646f, -0.000376f, -0.000254f, -0.000553f, 0.001005f, -0.000322f, 0.000664f, -0.001281f, -0.002119f, -0.000943f, -0.000049f, 0.001042f, + -0.001830f, 0.000580f, -0.000861f, 0.000839f, -0.000877f, 0.000486f, -0.000728f, -0.000078f, -0.000462f, -0.000089f, 0.000349f, 0.000650f, -0.000435f, -0.000662f, 0.000011f, -0.000660f, -0.010341f, 0.002760f, 0.000758f, 0.000016f, 0.001803f, -0.001732f, 0.000455f, -0.003992f, -0.001310f, 0.001392f, 0.000973f, 0.002579f, -0.000201f, 0.002812f, -0.001652f, -0.000414f, 0.001332f, -0.002447f, -0.000912f, -0.001441f, 0.002726f, -0.000177f, -0.002287f, 0.001139f, 0.002168f, -0.001948f, -0.001499f, -0.001756f, 0.000488f, -0.000416f, 0.000924f, -0.000679f, -0.000575f, -0.000480f, -0.001082f, 0.001536f, -0.001267f, 0.000288f, 0.000992f, -0.000141f, 0.001149f, -0.000694f, 0.002540f, 0.000369f, -0.000282f, -0.000915f, -0.000916f, 0.000020f, -0.001051f, -0.001272f, -0.000803f, 0.000179f, 0.000850f, -0.000144f, 0.000215f, -0.001115f, -0.001121f, -0.001581f, -0.000647f, -0.000522f, -0.000436f, 0.000417f, 0.000612f, -0.000656f, 0.000073f, 0.008914f, 0.012856f, 0.004397f, 0.004487f, 0.006054f, 0.004435f, -0.000642f, 0.000925f, -0.000499f, 0.000876f, 0.000726f, 0.001179f, 0.000806f, 0.002256f, 0.000823f, + 0.001442f, 0.000414f, 0.004398f, 0.001001f, 0.002199f, 0.001246f, 0.001196f, 0.003401f, 0.000894f, 0.004266f, 0.002297f, -0.000871f, 0.003107f, 0.000788f, 0.001581f, 0.003013f, 0.000713f, 0.001795f, -0.000814f, -0.000310f, 0.000955f, 0.001359f, -0.001733f, 0.001579f, -0.000954f, -0.001996f, -0.001066f, 0.001664f, 0.002602f, 0.001892f, -0.000243f, 0.000618f, 0.000696f, 0.000940f, 0.001431f, 0.000762f, 0.001604f, 0.000907f, -0.001287f, -0.000029f, 0.001166f, 0.001443f, 0.000558f, 0.000477f, 0.000383f, -0.001408f, -0.000447f, -0.000866f, 0.000946f, -0.000058f, 0.030960f, 0.002186f, -0.001423f, 0.002340f, -0.001531f, 0.003349f, 0.001196f, 0.003524f, -0.001662f, 0.000211f, 0.000163f, 0.002066f, -0.003741f, 0.000629f, 0.002648f, -0.000659f, -0.000425f, 0.003088f, 0.005208f, -0.002234f, -0.001022f, 0.000490f, 0.002654f, -0.001240f, 0.001780f, -0.000042f, -0.001474f, -0.001482f, -0.001143f, 0.000950f, 0.001697f, 0.001652f, -0.001116f, 0.001837f, -0.001101f, 0.001782f, 0.001876f, -0.000553f, -0.000969f, 0.000539f, -0.001657f, -0.002692f, 0.000748f, -0.001875f, 0.000901f, 0.000073f, + 0.000461f, 0.000993f, 0.000164f, 0.001230f, 0.000275f, -0.001856f, 0.000885f, -0.000559f, 0.001023f, -0.001381f, -0.000065f, 0.000102f, 0.001077f, -0.000796f, -0.002026f, -0.000471f, -0.000771f, 0.000106f, -0.000574f, -0.010499f, -0.010216f, -0.002303f, 0.000777f, -0.000447f, -0.001556f, -0.001660f, -0.002299f, -0.000608f, 0.001667f, -0.000552f, -0.000598f, -0.002353f, 0.002451f, -0.000151f, -0.002061f, -0.001764f, 0.004262f, -0.003894f, 0.000373f, 0.002832f, -0.000366f, 0.000457f, -0.003779f, 0.001183f, -0.001640f, 0.000882f, -0.002640f, -0.001719f, 0.000392f, 0.000676f, -0.001254f, -0.001382f, 0.000092f, -0.000577f, 0.000148f, -0.001614f, -0.000942f, 0.001649f, -0.000223f, -0.000802f, -0.000514f, 0.002101f, 0.000895f, -0.001229f, -0.001888f, -0.001658f, 0.000508f, -0.000273f, -0.000823f, 0.000157f, 0.000304f, -0.000923f, 0.002472f, 0.001344f, -0.000310f, -0.000218f, -0.000703f, 0.000280f, -0.000784f, -0.000756f, -0.000808f, -0.000171f, -0.001474f, -0.001154f, -0.001963f, 0.000419f, -0.002098f, -0.000100f, -0.000568f, -0.000524f, -0.000162f, -0.004201f, -0.003437f, -0.004322f, -0.002947f, -0.002311f, + -0.001382f, 0.000234f, 0.000055f, -0.001167f, -0.000327f, 0.000911f, 0.003762f, -0.003295f, 0.001703f, -0.001171f, -0.001916f, 0.002482f, -0.000121f, 0.000412f, 0.003495f, 0.000400f, 0.001530f, -0.002229f, -0.000403f, -0.006297f, -0.000605f, 0.001076f, 0.000870f, 0.000439f, 0.000732f, 0.000776f, -0.001271f, -0.001953f, 0.001523f, -0.000258f, 0.001445f, 0.000581f, -0.001531f, 0.001256f, -0.000031f, -0.004489f, -0.003514f, -0.000700f, -0.003320f, 0.000353f, 0.001174f, -0.000326f, -0.000776f, -0.000485f, 0.000257f, -0.001101f, -0.000215f, -0.000290f, -0.000494f, 0.000973f, 0.000385f, 0.000261f, -0.000516f, -0.000535f, 0.001787f, 0.000352f, -0.000998f, 0.001080f, -0.000175f, -0.000875f, -0.001688f, -0.000043f, -0.000878f, -0.000391f, 0.001348f, 0.000921f, 0.001427f, -0.020065f, -0.004566f, 0.000290f, -0.003982f, 0.001604f, 0.000406f, 0.004806f, -0.002245f, 0.000280f, -0.001316f, 0.003219f, -0.006571f, -0.006318f, 0.002667f, -0.003065f, 0.004753f, 0.001712f, -0.003807f, -0.006690f, -0.000146f, -0.001898f, -0.003237f, -0.001336f, 0.000770f, 0.001076f, -0.001560f, 0.005717f, 0.000314f, -0.000575f, + -0.002386f, 0.001943f, 0.002175f, 0.002329f, 0.002517f, -0.000317f, -0.001479f, -0.000568f, 0.001491f, -0.000122f, 0.001798f, -0.001691f, -0.000656f, -0.000585f, 0.002082f, 0.001661f, -0.001811f, 0.002353f, -0.001308f, -0.001648f, 0.000209f, -0.000752f, -0.001555f, 0.001605f, -0.001842f, -0.000250f, 0.000477f, -0.000452f, -0.000747f, 0.000418f, 0.001554f, -0.000964f, 0.001491f, -0.001231f, 0.001003f, -0.000685f, -0.000761f, -0.000484f, 0.000306f, 0.001913f, 0.000354f, 0.001792f, -0.001134f, 0.018393f, 0.016168f, 0.003379f, 0.004326f, -0.000861f, 0.005289f, 0.004234f, 0.005328f, -0.000217f, 0.002147f, 0.001286f, -0.004980f, -0.004224f, 0.002336f, 0.000458f, -0.003560f, -0.003774f, -0.002093f, 0.000249f, 0.002164f, 0.000635f, 0.005072f, 0.004621f, 0.002045f, -0.001058f, -0.001095f, 0.003063f, 0.002886f, 0.000236f, 0.002534f, -0.000800f, 0.003233f, 0.000190f, -0.000657f, 0.004464f, 0.002353f, 0.003664f, 0.002396f, 0.000816f, 0.002601f, 0.001302f, 0.000931f, 0.002386f, -0.001257f, 0.000490f, 0.003196f, -0.000017f, -0.001983f, 0.001888f, 0.001906f, 0.001348f, -0.001377f, -0.000018f, + 0.001887f, 0.002784f, -0.001332f, 0.003363f, 0.003874f, -0.000644f, -0.002014f, 0.000376f, 0.000934f, 0.000615f, 0.001733f, 0.000015f, 0.000658f, 0.001318f, -0.000870f, 0.000118f, -0.001261f, -0.000311f, -0.001721f, -0.000995f, -0.000157f, 0.022348f, 0.001788f, -0.000599f, 0.001545f, 0.001111f, -0.003689f, 0.000991f, 0.000966f, 0.000037f, 0.002349f, 0.003446f, 0.005074f, -0.002241f, -0.002335f, -0.003570f, -0.002944f, 0.003328f, -0.000284f, 0.004790f, -0.001169f, -0.001118f, 0.001936f, 0.004167f, 0.001618f, -0.004114f, 0.003261f, -0.001176f, 0.002604f, -0.001334f, 0.002016f, -0.002463f, 0.001511f, -0.000164f, 0.002371f, 0.000328f, 0.001342f, 0.000772f, -0.004232f, -0.002277f, -0.000415f, -0.000814f, -0.000418f, -0.001275f, 0.002007f, 0.000809f, 0.004315f, -0.000634f, -0.002992f, -0.001693f, -0.000321f, 0.000297f, -0.003325f, 0.001151f, -0.001146f, -0.000110f, -0.000343f, -0.001892f, 0.001734f, 0.003395f, -0.001080f, 0.001765f, 0.000378f, -0.001849f, -0.000202f, -0.001758f, -0.001518f, 0.000337f, -0.002653f, -0.001833f, 0.001075f, -0.000099f, 0.000566f, 0.001840f, -0.002513f, 0.003004f, + 0.000318f, -0.001230f, -0.002986f, 0.000865f, -0.001091f, 0.006436f, -0.001530f, -0.006161f, -0.004151f, -0.005555f, 0.005139f, -0.004106f, 0.001146f, 0.006260f, -0.000268f, -0.006368f, 0.000445f, -0.006684f, 0.005572f, -0.001943f, 0.005554f, 0.000032f, -0.002102f, 0.004766f, 0.000187f, 0.000989f, -0.003579f, -0.004534f, -0.000720f, 0.001595f, 0.000984f, -0.000885f, -0.002082f, 0.002110f, -0.000637f, 0.001577f, 0.002433f, 0.002946f, 0.001371f, 0.001631f, -0.005964f, 0.000501f, -0.001346f, -0.002039f, 0.000827f, 0.002964f, -0.002486f, -0.004584f, -0.002017f, 0.001348f, 0.000531f, -0.004027f, -0.001635f, 0.001884f, 0.002758f, -0.002419f, -0.001569f, -0.001860f, 0.002822f, 0.003740f, 0.000763f, -0.001253f, 0.000432f, 0.002681f, -0.001275f, -0.000101f, -0.001751f, 0.001882f, -0.002193f, -0.000253f, 0.002619f, 0.001568f, -0.000753f, -0.000392f, -0.000057f, -0.000836f, -0.022501f, -0.022823f, -0.003685f, -0.011196f, -0.006928f, -0.003984f, -0.006195f, -0.000771f, 0.004691f, -0.010243f, 0.003744f, -0.002111f, 0.003416f, 0.000571f, 0.002096f, -0.004260f, 0.001083f, -0.000552f, -0.002207f, -0.009400f, + -0.001907f, -0.004899f, -0.005960f, -0.000645f, 0.001510f, 0.000294f, -0.002026f, 0.001275f, -0.001923f, -0.000595f, 0.004983f, -0.000131f, -0.001658f, 0.000284f, 0.003260f, 0.004353f, 0.002936f, -0.000025f, 0.002344f, 0.002681f, -0.000265f, -0.000003f, -0.004872f, 0.001761f, -0.004027f, 0.000724f, 0.003882f, -0.002705f, -0.004877f, 0.001378f, -0.002737f, -0.002647f, 0.000538f, -0.000072f, -0.002313f, 0.001089f, -0.000551f, 0.005221f, 0.002948f, 0.001573f, 0.000647f, 0.001892f, -0.000195f, 0.000545f, -0.002075f, -0.003762f, -0.000619f, 0.000284f, -0.002665f, -0.001884f, -0.001465f, -0.001284f, -0.001512f, 0.000793f, -0.000779f, -0.000268f, -0.001677f, -0.013398f, 0.024884f, 0.019499f, 0.001239f, 0.003955f, 0.001601f, 0.004314f, 0.006626f, 0.001497f, 0.006438f, 0.001143f, -0.006725f, 0.004481f, 0.005435f, 0.001593f, 0.001647f, 0.004034f, 0.005358f, -0.005341f, 0.004476f, -0.002823f, 0.003937f, 0.000575f, -0.003198f, 0.000616f, 0.004451f, 0.002494f, -0.005201f, 0.002529f, -0.002099f, 0.007607f, -0.000588f, 0.001768f, -0.001119f, -0.004929f, 0.005014f, 0.004913f, 0.002411f, 0.001242f, + -0.000158f, 0.001759f, 0.005322f, 0.001208f, 0.003826f, 0.000457f, 0.002682f, 0.001410f, -0.000277f, 0.002831f, -0.003368f, -0.005366f, -0.002278f, -0.004096f, -0.003382f, -0.001786f, -0.003474f, 0.004768f, 0.003480f, 0.000402f, -0.000772f, -0.001718f, -0.000477f, -0.000137f, 0.000123f, 0.000224f, 0.000754f, 0.000989f, 0.000642f, -0.000110f, -0.001171f, -0.001084f, -0.000087f, -0.000109f, -0.000365f, 0.000531f, -0.000459f, 0.002877f, -0.000553f, 0.003782f, 0.033419f, -0.013149f, -0.006961f, 0.001105f, 0.000038f, -0.001752f, -0.009136f, -0.004053f, 0.002477f, -0.000550f, -0.001208f, -0.001910f, 0.001542f, -0.007704f, -0.002053f, 0.003854f, 0.007529f, 0.003943f, 0.003445f, -0.002470f, -0.002128f, -0.004476f, 0.005233f, -0.007304f, -0.001135f, 0.001691f, -0.004626f, 0.001463f, 0.002167f, 0.005710f, -0.008749f, -0.000841f, -0.000032f, -0.001929f, 0.002483f, -0.008310f, -0.004162f, 0.008954f, 0.006081f, 0.001148f, -0.001426f, 0.005311f, -0.001456f, -0.000792f, 0.001135f, 0.004134f, 0.002563f, -0.002705f, 0.000684f, -0.001618f, 0.003592f, -0.005630f, -0.002366f, -0.003446f, -0.003398f, 0.006685f, + 0.001989f, 0.000750f, -0.002862f, -0.000342f, -0.000884f, -0.001287f, -0.003006f, 0.000414f, -0.002843f, -0.000218f, 0.001156f, 0.002520f, -0.004381f, -0.003217f, -0.003857f, -0.001308f, 0.002284f, 0.000289f, 0.002990f, -0.000474f, -0.003575f, -0.000483f, -0.001541f, 0.001636f, -0.000033f, 0.009935f, 0.022752f, 0.003781f, 0.008659f, 0.007896f, 0.007502f, 0.002558f, 0.005600f, 0.003511f, -0.001668f, -0.004585f, -0.002971f, -0.001294f, 0.006420f, -0.005471f, -0.006137f, -0.000376f, -0.000309f, -0.002455f, -0.004704f, 0.013858f, 0.012947f, 0.009811f, 0.000452f, -0.005530f, 0.000962f, 0.000971f, -0.002806f, 0.003225f, 0.002011f, 0.005620f, 0.000625f, 0.002322f, -0.000289f, -0.003790f, 0.006295f, 0.005284f, 0.003755f, -0.000857f, -0.005030f, 0.000355f, -0.000405f, -0.001351f, -0.010251f, 0.007420f, -0.004681f, 0.008550f, 0.000466f, 0.004646f, -0.000994f, 0.005119f, 0.007684f, 0.001587f, -0.003502f, -0.000211f, 0.001396f, -0.002492f, 0.001338f, -0.000938f, -0.003287f, -0.001743f, 0.001055f, -0.000747f, 0.003212f, 0.001191f, -0.005480f, 0.000395f, -0.000767f, -0.005831f, -0.001400f, 0.001246f, + -0.002255f, 0.000694f, 0.004972f, 0.002098f, -0.000308f, -0.001679f, -0.001343f, 0.000155f, 0.002159f, -0.000552f, 0.002391f, -0.023949f, -0.003160f, -0.014936f, 0.000185f, 0.002606f, -0.005048f, -0.008744f, -0.010074f, -0.009588f, -0.005648f, -0.007824f, -0.001898f, -0.000553f, -0.002002f, 0.002482f, -0.001542f, 0.000484f, 0.006137f, 0.002725f, -0.000593f, 0.014463f, -0.003169f, 0.002876f, -0.002107f, 0.001189f, 0.002115f, 0.000744f, -0.000803f, 0.002101f, 0.006795f, 0.002014f, 0.002412f, 0.000732f, 0.002724f, 0.005701f, 0.007906f, 0.002453f, 0.009591f, -0.002595f, -0.008253f, 0.008314f, -0.002639f, -0.001787f, -0.001676f, 0.004687f, 0.007327f, 0.005486f, -0.000136f, -0.001934f, -0.004185f, -0.010714f, 0.006584f, 0.007442f, 0.005295f, -0.006413f, 0.003864f, 0.000962f, -0.000640f, 0.006018f, 0.001026f, 0.004030f, -0.003380f, 0.001947f, -0.004214f, -0.000443f, 0.003657f, -0.001104f, 0.002750f, -0.000619f, -0.001540f, -0.001544f, -0.005135f, 0.000478f, 0.000383f, -0.000083f, 0.000985f, -0.001179f, -0.006337f, 0.000440f, 0.000328f, -0.041941f, -0.018736f, 0.008461f, -0.001572f, -0.001498f, + 0.001551f, -0.005310f, -0.004546f, -0.001640f, -0.002019f, -0.007398f, 0.005236f, 0.000501f, 0.011005f, -0.006185f, -0.005197f, -0.009020f, -0.004953f, -0.009287f, 0.000808f, 0.003306f, -0.013710f, 0.008808f, 0.007696f, -0.001165f, 0.001580f, 0.005714f, 0.000913f, 0.005019f, -0.010376f, -0.010571f, -0.005770f, -0.006958f, -0.005247f, 0.016940f, 0.005602f, -0.003821f, -0.006051f, -0.008786f, 0.004186f, 0.002266f, -0.004080f, 0.003322f, 0.003410f, -0.006220f, 0.000629f, 0.001297f, 0.004893f, -0.005782f, 0.014065f, -0.006214f, -0.004842f, 0.002111f, -0.001458f, -0.000154f, -0.004169f, -0.001670f, 0.000487f, 0.008825f, -0.002715f, 0.012751f, 0.002785f, 0.000758f, 0.001482f, 0.003348f, -0.003801f, -0.001464f, -0.005014f, -0.004171f, -0.003832f, -0.000096f, 0.006961f, -0.004584f, -0.003261f, -0.001985f, -0.002535f, -0.002487f, -0.000247f, -0.001672f, -0.002336f, -0.002177f, 0.006619f, 0.021172f, 0.010894f, 0.006759f, 0.004600f, -0.007446f, 0.000766f, -0.006021f, 0.009430f, -0.001014f, -0.001234f, 0.003211f, 0.002094f, 0.002200f, -0.000258f, 0.003332f, 0.001226f, 0.003519f, -0.002862f, 0.009219f, + 0.001274f, -0.000817f, 0.027629f, 0.001525f, -0.002069f, -0.007040f, 0.004150f, -0.006545f, 0.006203f, 0.014891f, -0.001119f, 0.003669f, 0.003714f, -0.007622f, -0.008507f, 0.000288f, 0.000236f, 0.006563f, -0.004176f, 0.000270f, -0.000393f, 0.004847f, 0.005018f, 0.008316f, 0.003177f, 0.002910f, 0.003497f, 0.000389f, 0.005531f, 0.002587f, -0.009981f, 0.002196f, -0.005107f, -0.012860f, -0.001039f, 0.003678f, 0.000148f, 0.001130f, -0.001631f, 0.000303f, -0.000328f, -0.000012f, 0.001714f, 0.000341f, 0.005972f, -0.003462f, -0.000454f, 0.001208f, 0.001333f, 0.000237f, -0.002159f, 0.004135f, 0.007013f, 0.006842f, 0.001526f, -0.001359f, -0.000584f, 0.002488f, -0.000209f, -0.000770f, -0.000024f, 0.001417f, 0.003311f, -0.000472f, -0.001109f, -0.002193f, -0.001286f, 0.031256f, -0.009270f, -0.003203f, -0.008638f, 0.015845f, 0.005526f, 0.001516f, 0.002944f, -0.002055f, -0.003870f, 0.005727f, 0.000287f, -0.005189f, 0.001182f, -0.006915f, -0.005630f, 0.000588f, -0.007460f, 0.001219f, 0.002147f, -0.005115f, -0.009627f, 0.001134f, 0.000292f, 0.006611f, 0.010250f, 0.007534f, -0.005117f, 0.000167f, + 0.006288f, 0.012113f, -0.012636f, 0.004937f, -0.002539f, 0.000043f, -0.005876f, -0.007721f, 0.000475f, 0.007407f, 0.001899f, 0.003457f, 0.004319f, -0.000241f, 0.002820f, -0.000460f, 0.001962f, 0.004850f, -0.008491f, -0.005553f, 0.012699f, -0.000766f, -0.000594f, -0.002658f, 0.004958f, 0.016953f, 0.003988f, 0.002780f, 0.005226f, -0.004129f, -0.005149f, 0.000269f, -0.003890f, -0.009295f, 0.005972f, 0.001061f, -0.004951f, 0.002899f, 0.001254f, -0.002435f, -0.004671f, 0.006363f, -0.002274f, -0.006985f, 0.003221f, 0.003648f, 0.004963f, -0.004781f, 0.000297f, 0.002502f, -0.001059f, -0.001647f, 0.007531f, -0.000329f, 0.001251f, -0.003131f, -0.000614f, 0.000198f, 0.026628f, 0.024975f, -0.008036f, 0.006723f, 0.002206f, 0.005199f, 0.013610f, -0.001778f, -0.006886f, -0.002580f, 0.026164f, -0.014733f, -0.002630f, -0.007354f, -0.005653f, -0.011953f, 0.013169f, -0.003855f, -0.017524f, -0.013279f, -0.015972f, -0.006282f, 0.014461f, -0.001787f, 0.006919f, -0.002609f, -0.007124f, 0.006293f, 0.002062f, 0.007993f, -0.007589f, 0.007108f, 0.005896f, 0.002879f, 0.003510f, -0.012770f, 0.003861f, -0.010666f, + 0.009178f, 0.018934f, 0.005706f, 0.005661f, -0.011868f, 0.016956f, 0.004760f, -0.001804f, -0.002416f, -0.003480f, 0.005543f, 0.008470f, 0.002288f, -0.002003f, -0.000271f, 0.002278f, -0.003884f, -0.002957f, -0.003726f, -0.003072f, -0.000092f, 0.006211f, -0.003936f, 0.009292f, 0.003583f, 0.005684f, -0.001695f, -0.013344f, -0.008705f, 0.003395f, 0.001146f, -0.003982f, 0.005217f, -0.000250f, -0.000214f, 0.002685f, -0.001631f, 0.003910f, -0.000419f, -0.000448f, 0.002149f, -0.002300f, -0.000154f, -0.002486f, -0.001255f, -0.003119f, 0.002302f, 0.000170f, 0.000917f, -0.024712f, -0.015086f, 0.003785f, 0.001720f, 0.000062f, -0.011201f, 0.006691f, 0.003420f, -0.006424f, -0.018185f, 0.014807f, 0.003326f, 0.005604f, 0.008009f, 0.005042f, -0.002629f, 0.002829f, -0.004801f, 0.012303f, -0.010407f, -0.017374f, -0.000867f, -0.000747f, -0.008597f, -0.018908f, 0.000300f, -0.003802f, -0.010302f, -0.005414f, -0.003437f, 0.004349f, 0.000407f, 0.007074f, 0.013685f, -0.005878f, -0.011884f, 0.003711f, -0.001677f, 0.000200f, 0.005408f, -0.008147f, -0.007818f, -0.000965f, 0.006430f, -0.008828f, 0.007044f, -0.002515f, + 0.013892f, -0.001995f, -0.004802f, -0.001643f, -0.000269f, 0.002875f, -0.016626f, 0.002374f, -0.014437f, 0.014424f, -0.000299f, 0.009055f, 0.005022f, -0.005507f, -0.001085f, -0.007308f, 0.003210f, -0.000796f, 0.002465f, 0.002689f, -0.010074f, -0.001488f, -0.009736f, -0.004146f, 0.003782f, -0.002863f, -0.006131f, 0.002715f, -0.000481f, -0.009723f, -0.005180f, 0.000994f, -0.000071f, -0.004044f, 0.003822f, -0.002220f, -0.002897f, 0.002011f, -0.006244f, 0.002987f, -0.034937f, -0.015514f, -0.006217f, -0.003464f, -0.001472f, 0.004012f, -0.012417f, -0.008237f, 0.002779f, -0.009691f, 0.002776f, -0.010808f, -0.003900f, -0.010437f, -0.013474f, 0.014223f, 0.005341f, 0.002470f, -0.001224f, -0.011029f, -0.019748f, 0.010049f, -0.025775f, 0.009596f, -0.000015f, -0.007744f, 0.000945f, -0.004654f, 0.001551f, 0.018074f, -0.009290f, -0.000553f, -0.019463f, 0.015393f, -0.004821f, 0.007222f, -0.007108f, -0.001851f, -0.001942f, -0.000326f, 0.008491f, 0.003447f, 0.018107f, 0.022625f, -0.002724f, 0.000721f, -0.007743f, 0.001216f, -0.003254f, 0.003865f, 0.006695f, 0.001273f, 0.015701f, 0.004953f, -0.006371f, 0.002969f, + 0.002950f, 0.000494f, -0.001520f, 0.000904f, 0.011846f, -0.008724f, -0.018788f, -0.007153f, -0.000111f, 0.004746f, 0.002813f, 0.009658f, -0.001315f, 0.004359f, -0.005047f, -0.006995f, -0.010636f, -0.007784f, 0.000313f, -0.002217f, 0.004615f, 0.001737f, -0.003208f, -0.000876f, 0.008439f, 0.000271f, 0.004517f, -0.001702f, 0.001295f, -0.001729f, -0.002412f, -0.003283f, 0.043903f, 0.019745f, 0.013478f, 0.005734f, -0.005106f, -0.007898f, -0.013827f, 0.007722f, 0.013073f, 0.005546f, -0.006254f, 0.015646f, 0.008658f, 0.015644f, 0.000968f, -0.011128f, -0.004449f, 0.023438f, -0.024435f, -0.004890f, 0.016017f, -0.009424f, -0.005432f, 0.037787f, -0.004807f, 0.010886f, 0.034078f, -0.005362f, -0.002325f, -0.000878f, 0.004169f, -0.001772f, 0.014735f, 0.009649f, 0.012133f, -0.008515f, -0.020250f, 0.008192f, -0.008032f, 0.009821f, -0.003851f, 0.003650f, 0.014314f, 0.008463f, 0.000776f, 0.006460f, 0.002851f, 0.006227f, 0.013840f, 0.007975f, -0.001545f, 0.013657f, 0.005606f, 0.002069f, 0.003156f, 0.025041f, 0.014878f, 0.000175f, 0.013512f, -0.005839f, 0.017098f, -0.004126f, 0.003728f, -0.004720f, + 0.002001f, 0.009982f, -0.005503f, -0.000238f, -0.001022f, 0.003569f, 0.000333f, -0.006280f, 0.000212f, -0.005354f, -0.009904f, 0.001816f, -0.013168f, 0.005269f, 0.008008f, -0.003125f, -0.005660f, -0.003604f, 0.007012f, 0.002259f, 0.000341f, -0.002772f, 0.056917f, 0.025537f, -0.011372f, 0.004836f, 0.029473f, 0.000566f, 0.021322f, -0.006350f, 0.008515f, 0.017542f, -0.013175f, 0.001487f, 0.030960f, 0.027568f, 0.022674f, 0.007843f, 0.019493f, 0.003141f, 0.017107f, 0.005803f, 0.005274f, -0.010725f, -0.012318f, -0.017833f, -0.034965f, 0.011076f, 0.000557f, -0.009643f, -0.003217f, 0.012035f, -0.007836f, -0.001318f, 0.001515f, 0.006720f, -0.030961f, -0.005140f, 0.022719f, 0.017274f, -0.006134f, 0.011378f, 0.009955f, 0.006255f, -0.003664f, -0.007334f, -0.002991f, -0.004967f, -0.002999f, -0.011592f, -0.009612f, 0.007866f, -0.019229f, 0.006316f, 0.016055f, -0.004813f, -0.011192f, -0.017774f, 0.016738f, -0.000613f, -0.008220f, -0.005568f, -0.003668f, -0.006159f, 0.003650f, -0.002892f, -0.006007f, 0.006210f, 0.025974f, -0.012990f, -0.007600f, 0.003210f, -0.004856f, 0.005874f, 0.000398f, 0.013227f, + 0.002734f, -0.001377f, -0.000952f, -0.013907f, -0.006362f, -0.002228f, 0.001343f, 0.000989f, 0.005113f, 0.002981f, 0.000742f, 0.002147f, 0.002739f, 0.008082f, 0.000842f, 0.000152f, -0.005127f, 0.001741f, -0.022542f, -0.006151f, -0.027072f, -0.005754f, -0.027053f, 0.013070f, -0.025778f, 0.013934f, -0.004551f, -0.014747f, -0.004596f, -0.006837f, 0.031312f, 0.004999f, -0.022976f, 0.000570f, -0.015034f, -0.011648f, 0.015383f, -0.017327f, -0.016237f, -0.018089f, 0.027314f, -0.003546f, 0.018005f, -0.027729f, -0.014942f, 0.011242f, -0.013070f, 0.010733f, 0.030254f, 0.020079f, 0.018696f, 0.003376f, -0.003286f, -0.014558f, -0.020998f, -0.000952f, 0.004597f, -0.019227f, 0.000369f, -0.011257f, 0.005561f, 0.008746f, -0.022243f, -0.018669f, -0.034826f, -0.005253f, 0.002355f, -0.014764f, -0.021546f, 0.021389f, 0.001053f, 0.021968f, 0.021337f, -0.002425f, -0.003042f, -0.008474f, 0.012306f, 0.010882f, 0.001527f, 0.005487f, -0.001757f, -0.000878f, 0.010417f, -0.002531f, -0.012207f, -0.009154f, -0.015365f, -0.012679f, -0.004766f, -0.000366f, -0.002101f, -0.019191f, -0.011251f, 0.006566f, 0.001491f, -0.006668f, + 0.008386f, -0.001456f, 0.000459f, 0.013389f, 0.010887f, 0.007246f, 0.002808f, 0.008673f, 0.001288f, 0.000488f, 0.003942f, 0.003035f, -0.037991f, -0.006940f, 0.003707f, -0.003871f, 0.000388f, 0.010041f, -0.008156f, 0.008892f, 0.009066f, -0.006385f, 0.012155f, -0.016764f, 0.020925f, 0.013791f, 0.001036f, -0.015468f, 0.001550f, 0.009715f, -0.044448f, 0.008954f, 0.018593f, -0.032406f, 0.013530f, -0.016756f, -0.023194f, -0.021781f, 0.011225f, -0.005698f, -0.033101f, 0.017632f, 0.009947f, -0.020581f, -0.033494f, 0.006507f, 0.004322f, -0.010990f, -0.002127f, -0.017722f, 0.016675f, 0.013156f, 0.024110f, -0.019371f, 0.003433f, -0.025616f, -0.009228f, 0.004019f, -0.015835f, 0.006382f, -0.001672f, -0.013032f, -0.018742f, -0.020963f, 0.030495f, -0.020673f, -0.009278f, -0.007996f, 0.001601f, 0.013510f, 0.008553f, 0.009760f, 0.000442f, 0.011478f, -0.003641f, 0.001544f, -0.004679f, -0.012849f, 0.002806f, 0.026427f, 0.004494f, 0.000268f, 0.000237f, -0.017599f, 0.011563f, 0.017663f, 0.019143f, 0.003405f, 0.001744f, -0.001176f, -0.001157f, 0.002364f, 0.000715f, -0.008937f, 0.000158f, 0.001370f, + 0.001609f, -0.000229f, 0.000524f, 0.006289f, -0.001956f, 0.000489f, -0.001327f, -0.000010f, 0.011944f, -0.025428f, -0.013543f, -0.026851f, 0.007633f, -0.004749f, 0.010650f, -0.007298f, 0.005038f, 0.008825f, -0.009013f, -0.015317f, 0.022883f, -0.005979f, -0.010222f, 0.026633f, -0.005490f, -0.006169f, 0.030394f, -0.017558f, 0.004464f, 0.007477f, 0.002360f, -0.026778f, 0.000079f, -0.003876f, -0.016127f, 0.009252f, -0.012671f, 0.017097f, -0.003012f, 0.019027f, -0.020786f, 0.012960f, -0.036798f, 0.000449f, -0.020080f, 0.022446f, -0.003458f, 0.003107f, -0.003862f, -0.020373f, -0.001487f, 0.017838f, 0.046950f, 0.003514f, 0.002950f, 0.010026f, 0.016046f, -0.002673f, -0.004524f, 0.001519f, -0.000807f, 0.041346f, -0.003744f, 0.006415f, 0.016580f, -0.016038f, -0.027509f, 0.000143f, -0.029072f, -0.003512f, -0.014926f, -0.010648f, -0.005833f, -0.012215f, 0.006907f, 0.010293f, -0.016932f, 0.021433f, 0.017757f, -0.002478f, -0.004397f, -0.017400f, 0.012198f, 0.004392f, 0.011571f, -0.009725f, 0.004786f, -0.001839f, 0.008753f, 0.001073f, 0.008469f, -0.004240f, 0.006212f, -0.000982f, 0.000156f, 0.002134f, + 0.009607f, 0.004670f, 0.002946f, -0.003091f, 0.000250f, 0.000951f, 0.044314f, 0.048143f, 0.000407f, -0.014868f, -0.011826f, 0.040307f, -0.026501f, -0.030345f, 0.031527f, -0.028671f, 0.018434f, 0.005511f, 0.025511f, 0.023396f, 0.015893f, 0.002458f, -0.016028f, -0.013958f, 0.033093f, -0.014138f, -0.001401f, 0.007970f, 0.028193f, 0.040680f, -0.001226f, 0.027758f, -0.022798f, -0.023926f, 0.002705f, -0.008905f, 0.013172f, 0.008237f, -0.020332f, 0.002668f, 0.012944f, 0.033431f, 0.011451f, 0.013636f, 0.012624f, 0.014891f, 0.003876f, -0.001291f, 0.021296f, 0.003632f, 0.017033f, 0.027146f, 0.005701f, -0.011328f, -0.009510f, 0.024456f, 0.006450f, 0.050289f, 0.011778f, 0.019749f, -0.020550f, -0.032446f, -0.003101f, -0.037865f, -0.024179f, -0.008728f, -0.012901f, 0.001296f, -0.001916f, 0.000179f, 0.000526f, -0.028350f, -0.023368f, -0.012469f, -0.024131f, 0.008697f, 0.009595f, -0.007430f, -0.001867f, -0.022526f, -0.003514f, 0.006479f, -0.006378f, -0.002050f, 0.002293f, -0.014266f, 0.005913f, -0.004473f, 0.001693f, 0.002380f, 0.000086f, 0.000839f, 0.003072f, -0.003506f, 0.000531f, 0.003161f, + -0.000127f, 0.000656f, 0.000958f, -0.021049f, -0.074011f, -0.030558f, -0.060400f, -0.013558f, -0.021114f, -0.008540f, 0.005511f, -0.019813f, -0.023982f, -0.038366f, -0.030493f, 0.027259f, -0.004844f, -0.024409f, -0.025928f, 0.005871f, -0.034505f, -0.048697f, 0.008047f, -0.011337f, -0.010427f, -0.010467f, 0.009378f, -0.029024f, 0.030558f, -0.017759f, 0.020760f, -0.014447f, -0.013858f, 0.000338f, 0.016772f, -0.023665f, -0.022591f, 0.012137f, -0.004260f, 0.033434f, -0.014631f, 0.019165f, 0.028836f, 0.013706f, -0.010477f, -0.004783f, -0.002989f, 0.023649f, -0.008272f, 0.015882f, 0.031926f, -0.026792f, -0.046736f, -0.018402f, 0.015888f, 0.019470f, -0.022037f, 0.036317f, -0.011659f, -0.013109f, -0.004357f, -0.003960f, -0.011213f, -0.029378f, -0.012396f, -0.030354f, -0.029055f, -0.018001f, 0.021498f, 0.005089f, -0.005130f, 0.001988f, 0.033225f, 0.031204f, 0.002242f, -0.014392f, 0.005985f, -0.003233f, 0.013707f, 0.004324f, -0.005912f, -0.013698f, -0.001190f, -0.002712f, -0.021764f, -0.005600f, 0.008350f, 0.022686f, -0.010079f, 0.000076f, 0.008688f, -0.012663f, -0.000348f, -0.000824f, 0.000437f, -0.006566f, + 0.008540f, 0.000569f, 0.002267f, -0.000988f, 0.001342f} +}; + +/* Sample Rate = 32000 */ + +const int16_t CRendBin_Combined_BRIR_max_num_iterations_32kHz = 22; +const uint16_t CRendBin_Combined_BRIR_num_iterations_32kHz[15][BINAURAL_CHANNELS]={{22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22} }; +const uint16_t CRendBin_Combined_BRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS] = {40, 40}; +const uint16_t CRendBin_Combined_BRIR_pIndex_frequency_max_32kHz[15][BINAURAL_CHANNELS][22]={{{115, 117, 117, 120, 112, 118, 121, 130, 126, 130, 136, 127, 133, 135, 132, 133, 129, 137, 134, 129, 128, 160},{115, 117, 117, 120, 112, 118, 121, 130, 126, 130, 136, 127, 133, 135, 132, 133, 129, 137, 134, 129, 128, 160}},{{121, 106, 119, 113, 120, 123, 114, 126, 123, 125, 127, 128, 127, 134, 132, 130, 129, 139, 133, 131, 128, 160},{121, 106, 119, 113, 120, 123, 114, 126, 123, 125, 127, 128, 127, 134, 132, 130, 129, 139, 133, 131, 128, 160}},{{113, 103, 116, 104, 123, 123, 122, 124, 130, 128, 132, 131, 131, 132, 130, 132, 130, 135, 137, 128, 128, 160},{113, 103, 116, 104, 123, 123, 122, 124, 130, 128, 132, 131, 131, 132, 130, 132, 130, 135, 137, 128, 128, 160}},{{102, 116, 116, 121, 116, 114, 115, 121, 125, 123, 124, 130, 132, 122, 127, 131, 131, 135, 133, 124, 125, 160},{102, 116, 116, 121, 116, 114, 115, 121, 125, 123, 124, 130, 132, 122, 127, 131, 131, 135, 133, 124, 125, 160}},{{115, 115, 115, 119, 121, 119, 125, 127, 123, 129, 122, 126, 128, 134, 130, 130, 131, 140, 146, 127, 131, 160},{115, 115, 115, 119, 121, 119, 125, 127, 123, 129, 122, 126, 128, 134, 130, 130, 131, 140, 146, 127, 131, 160}},{{112, 106, 118, 121, 115, 117, 129, 123, 128, 126, 130, 130, 131, 131, 130, 134, 133, 149, 130, 132, 126, 160},{112, 106, 118, 121, 115, 117, 129, 123, 128, 126, 130, 130, 131, 131, 130, 134, 133, 149, 130, 132, 126, 160}},{{107, 112, 110, 119, 114, 124, 121, 121, 132, 122, 131, 134, 124, 133, 130, 129, 134, 134, 135, 127, 120, 160},{107, 112, 110, 119, 114, 124, 121, 121, 132, 122, 131, 134, 124, 133, 130, 129, 134, 134, 135, 127, 120, 160}},{{110, 113, 123, 113, 121, 120, 120, 126, 131, 123, 128, 128, 132, 130, 132, 136, 133, 136, 135, 128, 124, 160},{110, 113, 123, 113, 121, 120, 120, 126, 131, 123, 128, 128, 132, 130, 132, 136, 133, 136, 135, 128, 124, 160}},{{114, 101, 113, 113, 124, 126, 123, 128, 122, 127, 132, 127, 136, 128, 128, 127, 132, 132, 129, 125, 120, 160},{114, 101, 113, 113, 124, 126, 123, 128, 122, 127, 132, 127, 136, 128, 128, 127, 132, 132, 129, 125, 120, 160}},{{99, 100, 111, 117, 114, 114, 118, 116, 121, 124, 124, 121, 125, 130, 127, 132, 132, 130, 133, 128, 131, 160},{99, 100, 111, 117, 114, 114, 118, 116, 121, 124, 124, 121, 125, 130, 127, 132, 132, 130, 133, 128, 131, 160}},{{105, 93, 103, 108, 119, 110, 111, 114, 120, 121, 119, 122, 130, 128, 130, 131, 132, 131, 136, 128, 128, 160},{105, 93, 103, 108, 119, 110, 111, 114, 120, 121, 119, 122, 130, 128, 130, 131, 132, 131, 136, 128, 128, 160}},{{105, 100, 112, 114, 115, 108, 117, 120, 123, 117, 122, 129, 124, 128, 124, 132, 135, 131, 139, 153, 116, 160},{105, 100, 112, 114, 115, 108, 117, 120, 123, 117, 122, 129, 124, 128, 124, 132, 135, 131, 139, 153, 116, 160}},{{110, 106, 113, 110, 122, 116, 119, 125, 123, 128, 125, 127, 128, 127, 133, 130, 132, 132, 143, 155, 127, 160},{110, 106, 113, 110, 122, 116, 119, 125, 123, 128, 125, 127, 128, 127, 133, 130, 132, 132, 143, 155, 127, 160}},{{102, 107, 110, 112, 115, 117, 117, 115, 120, 118, 127, 130, 130, 129, 126, 126, 125, 130, 141, 135, 127, 160},{102, 107, 110, 112, 115, 117, 117, 115, 120, 118, 127, 130, 130, 129, 126, 126, 125, 130, 141, 135, 127, 160}},{{110, 117, 106, 118, 118, 116, 121, 124, 128, 125, 122, 122, 126, 131, 124, 130, 133, 131, 139, 134, 131, 160},{110, 117, 106, 118, 118, 116, 121, 124, 128, 125, 122, 122, 126, 131, 124, 130, 133, 131, 139, 134, 131, 160}}}; +const uint16_t CRendBin_Combined_BRIR_index_frequency_max_diffuse_32kHz = 97; +const float CRendBin_Combined_BRIR_inv_diffuse_weight_32kHz[15]={0.224190f, 0.227445f, 0.241827f, 0.207131f, 0.218113f, 0.222941f, 0.232139f, 0.248192f, 0.249239f, 0.261572f, 0.246309f, 0.279145f, 0.285786f, 0.262528f, 0.271847f}; +const uint16_t CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS][40]={{47, 47, 47, 47, 47, 47, 50, 50, 56, 56, 56, 63, 63, 63, 63, 63, 72, 72, 72, 74, 74, 77, 77, 79, 81, 81, 81, 81, 87, 87, 87, 87, 87, 87, 93, 93, 93, 93, 93, 97},{47, 47, 47, 47, 47, 47, 50, 50, 56, 56, 56, 63, 63, 63, 63, 63, 72, 72, 72, 74, 74, 77, 77, 79, 81, 81, 81, 81, 87, 87, 87, 87, 87, 87, 93, 93, 93, 93, 93, 97}}; +const float CRendBin_Combined_BRIR_coeff_re_32kHz[15][BINAURAL_CHANNELS][2819]={ + { + {-0.009097f, 0.009352f, -0.003456f, 0.000006f, 0.008745f, -0.004992f, 0.003412f, -0.000642f, 0.001223f, -0.005946f, -0.012435f, -0.002568f, 0.004887f, -0.003199f, 0.002973f, 0.004305f, 0.003661f, -0.002738f, 0.002074f, -0.007701f, -0.001411f, 0.001920f, 0.003183f, -0.000267f, -0.000175f, 0.000950f, 0.001899f, -0.006450f, -0.005352f, 0.002251f, 0.004456f, -0.002233f, 0.004665f, 0.008899f, -0.011970f, 0.001696f, -0.005728f, -0.003886f, 0.002671f, -0.001493f, 0.007354f, -0.002285f, 0.006623f, 0.003476f, 0.001083f, -0.000478f, 0.003540f, 0.000208f, -0.000724f, -0.003736f, 0.010735f, -0.007457f, -0.002261f, 0.003771f, 0.004169f, -0.000190f, -0.003631f, 0.002061f, -0.004016f, 0.004162f, 0.000801f, 0.001514f, -0.000085f, -0.001427f, -0.001326f, 0.005561f, -0.014330f, 0.003361f, -0.001844f, -0.008319f, -0.001409f, 0.007005f, 0.003391f, 0.004349f, -0.006273f, 0.005044f, -0.002184f, 0.003171f, 0.001934f, 0.002467f, -0.002649f, 0.001045f, 0.003774f, -0.002504f, -0.005599f, 0.002282f, -0.005197f, 0.001002f, 0.003817f, -0.000006f, -0.001878f, -0.002174f, 0.001025f, 0.002039f, -0.000843f, 0.002450f, + 0.000116f, 0.001753f, 0.001513f, -0.000691f, -0.000354f, 0.000662f, -0.000808f, -0.000500f, -0.000626f, 0.000674f, -0.001121f, 0.000551f, -0.001643f, -0.000420f, -0.001540f, -0.000233f, -0.000483f, -0.001761f, -0.000375f, -0.016686f, 0.012962f, -0.006248f, 0.002887f, 0.002407f, 0.000392f, -0.003586f, -0.000290f, -0.009385f, -0.011673f, 0.003177f, -0.002238f, 0.003631f, 0.003683f, 0.010504f, -0.008595f, 0.001243f, 0.007167f, 0.006916f, -0.006970f, -0.007462f, -0.003932f, -0.006482f, 0.000619f, -0.002179f, -0.005008f, -0.003892f, 0.000057f, -0.011819f, -0.011237f, -0.002395f, 0.002281f, -0.001037f, 0.000974f, -0.001365f, 0.002603f, -0.006216f, 0.007200f, -0.002539f, 0.004117f, -0.000903f, 0.002921f, -0.005673f, 0.001963f, 0.003910f, 0.004776f, 0.002035f, 0.000950f, 0.001679f, -0.001985f, -0.004707f, 0.009579f, 0.007193f, 0.003065f, -0.003588f, 0.011869f, 0.007989f, -0.003324f, 0.007510f, -0.000563f, -0.005908f, -0.001409f, -0.002146f, -0.005218f, 0.003401f, 0.003979f, 0.001874f, -0.003996f, 0.008337f, -0.005486f, 0.004875f, 0.007106f, -0.001379f, 0.000769f, -0.010431f, -0.004571f, -0.011225f, + 0.001685f, 0.005305f, -0.005327f, -0.001630f, 0.002137f, -0.005093f, -0.001371f, 0.002447f, -0.000245f, 0.001748f, -0.001108f, -0.002723f, -0.007323f, -0.003635f, -0.001273f, -0.001799f, -0.000552f, -0.000181f, 0.000515f, -0.000938f, -0.001185f, -0.002732f, -0.001174f, 0.000053f, 0.000654f, 0.000557f, -0.001428f, -0.000279f, 0.000025f, 0.000369f, -0.000268f, 0.000382f, -0.000083f, 0.000718f, -0.000058f, -0.001357f, -0.002149f, -0.002330f, -0.000153f, -0.001394f, 0.000480f, 0.014048f, 0.006459f, -0.005328f, 0.002440f, 0.001881f, 0.022356f, -0.006525f, 0.006439f, 0.010931f, -0.002057f, 0.009953f, 0.004079f, 0.006793f, -0.008789f, -0.003213f, -0.010307f, -0.004726f, 0.007015f, -0.000138f, -0.004884f, 0.001245f, -0.007217f, -0.000503f, -0.004713f, 0.006695f, -0.002872f, -0.000847f, -0.002584f, 0.003590f, 0.001584f, 0.000145f, -0.000817f, 0.002960f, -0.010871f, -0.008335f, 0.003781f, 0.001067f, -0.001030f, -0.005462f, 0.013012f, 0.003795f, -0.001647f, 0.004357f, 0.005166f, 0.000076f, 0.002567f, 0.001287f, -0.006397f, 0.005884f, -0.007620f, -0.005711f, 0.006869f, -0.008086f, 0.007051f, 0.003221f, + -0.006147f, 0.010651f, 0.005728f, 0.004134f, -0.002878f, 0.009659f, 0.002243f, -0.001243f, -0.002785f, 0.002990f, 0.001121f, -0.001608f, -0.011321f, -0.001571f, -0.002217f, 0.003525f, -0.006658f, 0.009036f, -0.003137f, 0.007417f, -0.007705f, 0.000326f, -0.000825f, 0.009221f, -0.004292f, -0.002939f, 0.001645f, 0.003473f, -0.000135f, 0.001864f, -0.001422f, -0.008361f, -0.000967f, -0.000530f, -0.000461f, -0.001084f, -0.000186f, 0.000106f, -0.001175f, -0.001555f, -0.001756f, -0.001916f, 0.000130f, -0.000711f, 0.000020f, 0.001216f, -0.001432f, 0.000965f, 0.001103f, 0.002559f, -0.003017f, 0.002029f, 0.000884f, 0.001589f, -0.000201f, 0.002372f, 0.000857f, -0.001061f, -0.001843f, -0.000477f, -0.000884f, 0.023307f, -0.019323f, -0.016961f, -0.005456f, 0.017848f, -0.002478f, -0.009654f, 0.012225f, -0.008126f, 0.005783f, -0.000435f, -0.013281f, -0.009030f, 0.011224f, -0.007251f, 0.005568f, -0.007567f, 0.007422f, -0.003287f, -0.002039f, -0.000832f, -0.007313f, 0.003884f, 0.005385f, -0.007352f, 0.001824f, -0.003730f, 0.001539f, 0.003383f, -0.001055f, 0.004845f, 0.001481f, 0.003968f, 0.006278f, -0.008008f, + -0.005880f, 0.007274f, 0.000398f, 0.005654f, 0.005520f, -0.005070f, -0.007556f, -0.002993f, 0.001342f, 0.010011f, -0.010751f, 0.004484f, -0.012008f, -0.014637f, -0.003418f, -0.008354f, -0.001368f, -0.009903f, -0.018872f, -0.009978f, 0.008817f, 0.008242f, 0.005363f, -0.006256f, 0.018145f, -0.005527f, 0.003095f, -0.009965f, -0.009402f, 0.002534f, 0.000041f, -0.000873f, -0.011877f, -0.003848f, -0.000640f, -0.002364f, -0.002272f, -0.006373f, -0.005121f, 0.001371f, -0.001606f, -0.003473f, 0.000447f, -0.006173f, 0.001159f, 0.003593f, 0.006236f, 0.003502f, -0.005180f, 0.005546f, -0.003559f, -0.000294f, 0.006209f, 0.002664f, 0.000957f, -0.001968f, 0.003221f, 0.003684f, 0.002894f, 0.000682f, -0.001537f, 0.000594f, 0.004435f, 0.002309f, 0.002878f, 0.001260f, -0.001588f, 0.002398f, 0.000508f, -0.000215f, 0.000724f, -0.001193f, 0.000475f, 0.000698f, -0.001244f, 0.002461f, 0.003640f, 0.004276f, -0.000217f, -0.000267f, 0.000673f, -0.002669f, 0.003994f, -0.000209f, 0.002516f, 0.029839f, -0.009793f, 0.013953f, -0.003724f, 0.018754f, -0.003639f, -0.002925f, 0.003177f, 0.003763f, -0.003166f, -0.021609f, + 0.002141f, -0.002120f, -0.005725f, -0.000372f, -0.001011f, 0.007632f, -0.002440f, 0.018317f, -0.002401f, 0.002024f, -0.001288f, 0.010339f, -0.002012f, 0.003532f, -0.008557f, -0.000384f, -0.005866f, -0.006215f, -0.001723f, -0.001845f, 0.000114f, 0.006599f, -0.011752f, -0.003569f, 0.004042f, -0.001448f, 0.008197f, 0.001780f, -0.002025f, -0.005511f, -0.005336f, -0.005851f, -0.010745f, 0.003957f, 0.004611f, 0.003922f, -0.018758f, -0.002878f, 0.013313f, 0.007335f, -0.002971f, -0.000712f, -0.005781f, -0.013033f, -0.013649f, 0.013532f, -0.004179f, -0.009299f, -0.005085f, 0.007293f, 0.005949f, 0.000549f, 0.006664f, 0.002615f, 0.006445f, -0.003291f, -0.013385f, -0.004703f, -0.006013f, -0.006975f, 0.009908f, 0.006405f, -0.001069f, 0.010871f, 0.016481f, -0.004045f, 0.006999f, -0.006485f, -0.000789f, -0.000014f, 0.007189f, -0.000676f, 0.001816f, 0.001518f, 0.002245f, 0.005573f, -0.005637f, 0.004347f, -0.002922f, 0.000345f, -0.003585f, 0.000511f, 0.001914f, 0.003945f, 0.002952f, -0.000179f, 0.001066f, 0.000161f, -0.000429f, 0.001998f, -0.005321f, -0.000836f, -0.004246f, 0.000901f, -0.000756f, -0.000762f, + -0.001856f, -0.001197f, -0.002213f, 0.002304f, 0.001127f, -0.044753f, 0.024465f, 0.008854f, -0.002148f, -0.002075f, 0.000034f, -0.006890f, -0.012530f, -0.002791f, 0.005996f, 0.018819f, 0.012621f, -0.017324f, -0.003374f, -0.010343f, 0.006930f, -0.000965f, -0.023360f, -0.006958f, 0.014211f, 0.008738f, 0.004810f, 0.012027f, 0.007266f, -0.001326f, -0.001603f, 0.003491f, -0.008933f, -0.005324f, 0.001973f, 0.010481f, -0.004518f, -0.008975f, -0.012930f, -0.006564f, 0.006362f, 0.020733f, 0.001386f, -0.003730f, 0.004355f, -0.004373f, -0.015493f, 0.001069f, -0.010953f, -0.008655f, -0.010224f, 0.006257f, -0.000676f, -0.014552f, 0.002648f, 0.005404f, 0.005605f, -0.015737f, -0.008743f, -0.005910f, -0.003945f, -0.001785f, -0.005846f, -0.002878f, -0.007541f, -0.015277f, -0.001834f, -0.012986f, -0.015558f, -0.009682f, -0.002802f, 0.002593f, -0.009286f, -0.013695f, 0.003954f, 0.010847f, -0.000635f, -0.002087f, -0.001360f, 0.007868f, -0.011950f, 0.008802f, 0.013967f, 0.013556f, 0.010683f, 0.018260f, 0.000169f, -0.007639f, 0.004878f, 0.000740f, -0.002003f, -0.001789f, -0.000041f, -0.004267f, 0.006007f, 0.000230f, + 0.000397f, -0.003811f, -0.001084f, 0.001914f, 0.002231f, -0.002254f, -0.002039f, 0.001078f, 0.006204f, -0.000898f, 0.002326f, 0.002028f, 0.005298f, -0.004424f, 0.000225f, -0.000174f, -0.004877f, 0.000647f, 0.000623f, 0.004007f, 0.000402f, 0.000760f, 0.003470f, 0.002140f, -0.006062f, 0.002171f, -0.002198f, -0.018482f, 0.006963f, -0.009145f, -0.001585f, 0.002406f, 0.005445f, -0.000770f, 0.009545f, 0.000229f, -0.001932f, -0.025922f, 0.012005f, -0.004823f, -0.005515f, 0.009292f, -0.015030f, -0.020661f, 0.008419f, -0.007245f, -0.009694f, -0.003066f, 0.018637f, 0.011719f, -0.006835f, -0.004033f, 0.008664f, -0.002592f, -0.000943f, 0.002502f, 0.008455f, 0.015532f, 0.009881f, 0.012566f, -0.001944f, -0.000553f, 0.000291f, -0.008295f, 0.002101f, -0.003500f, 0.021145f, -0.016187f, -0.009391f, -0.008566f, -0.008028f, 0.005083f, 0.002852f, 0.007573f, -0.001278f, -0.010694f, -0.014329f, -0.004146f, -0.017836f, -0.024828f, -0.004998f, 0.000665f, 0.019262f, 0.003815f, -0.015310f, -0.003933f, 0.014434f, -0.006136f, 0.004820f, 0.004344f, 0.008089f, -0.011497f, -0.017253f, -0.007630f, -0.008795f, 0.027799f, + 0.003080f, -0.008924f, 0.006025f, 0.004632f, -0.002079f, 0.003497f, 0.006333f, -0.000779f, 0.012313f, -0.016348f, -0.014665f, 0.004742f, -0.006790f, 0.014818f, -0.006885f, -0.000388f, 0.007942f, -0.002451f, 0.007032f, -0.000434f, -0.000391f, -0.000492f, -0.002439f, -0.000262f, 0.006323f, 0.002358f, 0.006142f, 0.003466f, 0.003048f, 0.000218f, -0.002298f, -0.001011f, 0.002551f, -0.000811f, 0.000748f, -0.001265f, 0.004399f, -0.003673f, 0.002546f, -0.003291f, 0.004436f, -0.004270f, 0.000373f, -0.000412f, -0.000494f, 0.003184f, 0.004179f, -0.004467f, 0.003091f, 0.001719f, -0.001533f, 0.006559f, 0.016041f, 0.005150f, -0.001196f, 0.011122f, -0.001968f, -0.013579f, -0.002434f, -0.001093f, 0.013608f, -0.007499f, -0.001710f, -0.004004f, 0.002291f, -0.004059f, 0.000941f, 0.004534f, 0.006483f, 0.009329f, 0.006133f, 0.003041f, 0.023777f, 0.009461f, 0.007885f, -0.000884f, -0.018570f, 0.001353f, -0.015452f, 0.004876f, -0.010446f, 0.002708f, 0.000140f, 0.006139f, 0.029216f, 0.008398f, -0.004430f, 0.010599f, -0.008142f, 0.009049f, -0.005019f, 0.015311f, -0.008205f, 0.000041f, -0.011328f, 0.007066f, + 0.011647f, -0.013426f, 0.027468f, -0.006604f, 0.002109f, -0.004096f, -0.007258f, 0.003055f, -0.008108f, -0.023353f, 0.004095f, -0.005770f, -0.001176f, -0.014378f, 0.003572f, -0.005013f, -0.024025f, -0.010821f, -0.006609f, -0.021237f, 0.012264f, 0.030905f, 0.037445f, -0.035418f, -0.026998f, -0.014920f, 0.001659f, 0.008987f, -0.010818f, 0.005221f, -0.012295f, 0.003413f, 0.017377f, 0.026700f, -0.018136f, 0.029882f, 0.009699f, 0.003628f, 0.005249f, 0.005519f, -0.006418f, 0.010357f, 0.009586f, 0.011523f, 0.008922f, 0.003821f, 0.013432f, 0.000216f, 0.004347f, -0.000086f, 0.000160f, 0.007340f, -0.001921f, -0.008514f, -0.002151f, 0.005841f, 0.004602f, 0.001959f, 0.000136f, -0.000382f, -0.000537f, 0.005890f, 0.004780f, 0.002192f, -0.004892f, 0.001475f, 0.001652f, 0.000269f, 0.006321f, 0.002841f, 0.004012f, 0.000158f, 0.004792f, 0.002827f, 0.004845f, 0.006582f, 0.006893f, 0.000619f, 0.000484f, -0.003153f, 0.007585f, 0.006764f, -0.000526f, -0.001819f, 0.000981f, 0.004936f, 0.013866f, -0.024887f, 0.037176f, 0.001191f, 0.021943f, 0.008217f, -0.007135f, -0.007383f, 0.020361f, -0.011327f, + 0.013017f, 0.015959f, -0.001587f, -0.010500f, 0.001037f, 0.016495f, 0.009470f, 0.008687f, 0.007593f, -0.001007f, 0.003002f, 0.005832f, 0.020791f, 0.014784f, -0.010475f, -0.008860f, -0.001250f, -0.004278f, -0.001850f, -0.010257f, -0.006727f, 0.010672f, 0.018375f, 0.005032f, 0.027511f, -0.007123f, 0.030044f, 0.001791f, 0.014357f, 0.033101f, 0.023522f, 0.007863f, 0.007068f, 0.015208f, -0.002836f, -0.012748f, 0.000306f, 0.014343f, -0.007625f, -0.014688f, 0.000944f, -0.001950f, 0.030228f, 0.024443f, 0.000074f, 0.034208f, -0.002631f, 0.018603f, 0.009949f, 0.014811f, -0.001514f, -0.011188f, 0.015508f, -0.002591f, 0.018078f, 0.012594f, 0.037808f, -0.020477f, -0.003247f, -0.041818f, 0.009346f, -0.020323f, -0.002477f, 0.019931f, -0.007628f, 0.008469f, -0.003128f, 0.023228f, -0.005640f, -0.015378f, -0.000845f, -0.004913f, 0.007163f, -0.000536f, 0.011380f, 0.013428f, 0.003778f, -0.002914f, 0.010604f, -0.001767f, 0.004787f, 0.000552f, -0.006448f, 0.005173f, 0.005126f, 0.009508f, 0.005032f, 0.010597f, 0.004868f, 0.000329f, 0.000744f, -0.002599f, 0.000469f, 0.010412f, -0.003186f, -0.006923f, + 0.004635f, 0.000002f, 0.001813f, 0.008637f, 0.002192f, 0.002531f, 0.003730f, 0.005935f, -0.001359f, -0.000429f, 0.003932f, 0.007126f, 0.010902f, 0.010267f, 0.000335f, 0.005176f, 0.000444f, 0.000135f, 0.004958f, 0.007415f, -0.024477f, -0.017953f, 0.008850f, -0.014496f, 0.008326f, -0.008728f, 0.002407f, 0.022576f, -0.003854f, -0.021222f, 0.005726f, -0.008884f, 0.021660f, -0.022671f, -0.015912f, 0.009306f, 0.010399f, 0.015904f, 0.000495f, -0.001509f, 0.010150f, -0.006157f, -0.015626f, 0.009724f, -0.006487f, -0.012325f, 0.003609f, 0.012220f, -0.009018f, 0.022910f, 0.009122f, -0.000746f, 0.002866f, 0.011269f, 0.004751f, -0.038899f, 0.015785f, -0.003904f, -0.004277f, -0.006635f, 0.020575f, 0.000219f, 0.021912f, 0.001022f, 0.001757f, 0.002535f, -0.006021f, -0.002266f, 0.010537f, -0.012378f, 0.002767f, 0.035558f, 0.002918f, 0.026185f, 0.001814f, -0.005174f, -0.003069f, -0.017419f, -0.036671f, -0.026410f, 0.011834f, 0.016880f, -0.007448f, 0.028054f, 0.011692f, -0.019760f, -0.011845f, 0.025719f, 0.017910f, 0.017118f, 0.004943f, -0.007652f, -0.000028f, -0.001190f, -0.015967f, -0.004627f, + -0.009454f, -0.042658f, -0.018726f, -0.000756f, 0.028515f, 0.006661f, -0.006958f, 0.003347f, 0.024425f, -0.005873f, 0.000946f, 0.000420f, 0.005950f, -0.007840f, -0.004215f, -0.005778f, -0.003817f, -0.001847f, 0.005607f, 0.000019f, -0.001410f, -0.000058f, 0.004304f, 0.004053f, 0.006903f, -0.004802f, -0.008407f, 0.003246f, -0.008883f, -0.004341f, 0.000690f, 0.003458f, 0.000601f, -0.001114f, 0.008498f, -0.003756f, -0.003053f, -0.009885f, 0.003501f, -0.008887f, 0.006923f, 0.003664f, 0.004446f, -0.007437f, 0.000270f, -0.000912f, 0.003392f, -0.004082f, 0.002538f, -0.003590f, 0.004438f, -0.008253f, -0.000159f, -0.009746f, 0.011320f, 0.023794f, 0.009362f, 0.008298f, 0.027246f, 0.022860f, 0.019159f, 0.001218f, 0.007433f, 0.001925f, -0.003866f, -0.004745f, 0.004868f, -0.001657f, -0.015557f, 0.003980f, 0.016210f, 0.000284f, -0.004057f, 0.005332f, -0.038708f, 0.013507f, -0.015132f, 0.010188f, 0.013753f, 0.012443f, -0.014241f, 0.008395f, -0.001041f, 0.000140f, 0.023677f, 0.017433f, 0.000703f, 0.009556f, 0.007203f, -0.002677f, -0.012778f, 0.003702f, 0.011801f, 0.000697f, 0.017004f, 0.005430f, + 0.015426f, 0.029956f, 0.002013f, 0.012380f, 0.013097f, 0.016290f, -0.000190f, -0.009635f, 0.025943f, -0.009367f, 0.021036f, -0.023727f, -0.019439f, 0.028405f, -0.000924f, 0.009720f, 0.016935f, 0.024852f, 0.031981f, 0.013781f, 0.004818f, -0.014879f, 0.007417f, -0.002648f, -0.027676f, 0.024406f, 0.015379f, -0.022545f, -0.000873f, 0.001945f, -0.028377f, 0.010218f, 0.023458f, 0.014080f, 0.000307f, 0.009340f, 0.006786f, -0.012934f, 0.025630f, 0.002931f, -0.004419f, 0.013468f, 0.025359f, 0.010281f, -0.000488f, -0.008161f, -0.006299f, -0.002459f, 0.004764f, 0.007534f, 0.010786f, 0.003875f, 0.002296f, 0.003735f, 0.012520f, 0.011247f, 0.013862f, 0.000356f, -0.000885f, 0.005825f, 0.011948f, 0.000570f, 0.001591f, -0.001759f, 0.005809f, 0.001471f, -0.000780f, -0.003778f, 0.003263f, -0.007697f, -0.014146f, -0.000136f, 0.008793f, 0.000323f, 0.006380f, -0.006467f, 0.005030f, 0.000854f, 0.005641f, 0.001333f, -0.003411f, 0.003875f, -0.002121f, -0.001630f, -0.000377f, -0.008346f, 0.006866f, -0.002730f, 0.003176f, 0.005475f, 0.000826f, -0.000727f, -0.003543f, -0.005212f, -0.065005f, -0.040450f, + 0.013101f, 0.013744f, 0.026582f, 0.044054f, -0.012250f, -0.006967f, -0.014164f, -0.013078f, -0.016696f, -0.017812f, 0.001320f, 0.007071f, 0.005455f, 0.027796f, 0.001080f, 0.027280f, -0.001524f, 0.009366f, 0.012495f, 0.009684f, 0.020177f, 0.014469f, 0.000865f, 0.017887f, -0.000394f, -0.002136f, -0.010491f, 0.012106f, -0.001812f, -0.026679f, -0.023255f, 0.014480f, -0.003536f, 0.031816f, 0.018794f, 0.020466f, 0.007363f, -0.040006f, 0.009432f, 0.025185f, -0.004082f, 0.007346f, -0.006360f, 0.005023f, 0.031374f, -0.001066f, 0.026249f, 0.044198f, 0.002232f, -0.016624f, -0.000732f, 0.000513f, -0.027987f, 0.037541f, 0.017586f, -0.004918f, -0.002423f, 0.027226f, 0.012507f, -0.032846f, -0.027110f, 0.010641f, -0.011980f, 0.015820f, 0.011032f, 0.005075f, -0.013371f, -0.023290f, -0.001478f, 0.006027f, 0.004034f, 0.025410f, -0.034360f, 0.005083f, -0.002716f, -0.028680f, -0.014143f, -0.028839f, 0.024873f, -0.008469f, 0.034536f, -0.027361f, 0.002115f, -0.013090f, 0.019417f, 0.008798f, -0.009064f, -0.001505f, 0.017836f, 0.001309f, 0.005231f, -0.010435f, -0.006142f, -0.008793f, 0.015722f, 0.008244f, + -0.000585f, 0.004505f, 0.004331f, -0.014684f, 0.000457f, -0.003992f, 0.004656f, 0.003310f, -0.003795f, -0.014994f, -0.005894f, -0.011016f, 0.012810f, -0.009764f, 0.001563f, -0.002461f, 0.012649f, -0.002582f, -0.002973f, -0.004496f, -0.008944f, -0.000255f, -0.006175f, 0.005526f, 0.013957f, 0.013018f, -0.001615f, -0.013130f, 0.016257f, 0.046031f, -0.054795f, -0.015334f, -0.026712f, -0.001129f, 0.008686f, 0.001445f, 0.036736f, -0.037918f, 0.017926f, -0.005184f, 0.007323f, -0.004598f, 0.020175f, -0.011133f, -0.018769f, -0.001579f, -0.005467f, 0.014250f, -0.001183f, 0.009631f, 0.021377f, -0.004459f, -0.016013f, -0.002155f, 0.024041f, -0.014154f, 0.005737f, 0.005394f, 0.000961f, -0.002196f, 0.023879f, -0.000916f, -0.006150f, -0.039885f, 0.012835f, -0.009881f, -0.025173f, -0.021926f, -0.005811f, -0.024305f, -0.014302f, -0.021109f, 0.010016f, -0.024909f, 0.024846f, -0.022865f, 0.015409f, -0.011825f, 0.030121f, -0.029190f, -0.016933f, -0.004417f, 0.017459f, 0.007159f, 0.000161f, -0.012030f, -0.023886f, 0.002402f, 0.009355f, 0.034095f, 0.017906f, 0.007419f, -0.019501f, 0.011581f, -0.017297f, -0.019556f, + 0.017053f, -0.018987f, 0.009048f, 0.022081f, 0.018466f, -0.004954f, -0.007034f, -0.015990f, 0.026626f, 0.002566f, 0.025484f, 0.041128f, -0.008039f, -0.021640f, -0.009630f, -0.007233f, -0.014814f, 0.006473f, -0.024599f, 0.010679f, 0.008047f, 0.007350f, 0.019485f, -0.013809f, 0.000739f, -0.002555f, 0.004954f, 0.017654f, 0.000534f, 0.013871f, -0.005033f, -0.000389f, 0.001767f, -0.007952f, -0.002806f, 0.008304f, 0.004438f, -0.011346f, -0.014721f, -0.007070f, 0.006520f, 0.005767f, -0.006459f, 0.020984f, 0.006182f, -0.015465f, 0.007771f, 0.011177f, 0.028078f, 0.022723f, 0.012800f, 0.004646f, 0.002721f, -0.011866f, -0.009218f, -0.000475f, -0.009341f, 0.001683f, -0.005415f, -0.017300f, 0.009500f, -0.005792f, -0.002395f, 0.001936f, 0.009362f, 0.000119f, 0.030661f, 0.042393f, -0.044507f, 0.033005f, 0.023048f, 0.001294f, 0.016634f, 0.056286f, -0.015629f, -0.015976f, 0.005473f, 0.016699f, 0.023445f, 0.007865f, -0.021756f, 0.024974f, -0.008965f, 0.049761f, -0.001164f, -0.007991f, 0.016181f, 0.013222f, 0.013034f, -0.000336f, 0.046674f, -0.038461f, 0.009574f, -0.000503f, 0.012915f, -0.015926f, + -0.032043f, 0.016214f, 0.012765f, 0.013264f, -0.011127f, -0.008363f, 0.039035f, 0.014796f, 0.049019f, 0.004677f, -0.017946f, -0.001733f, 0.011000f, -0.004041f, 0.050878f, -0.006174f, 0.027763f, -0.004708f, 0.045663f, 0.016815f, 0.012415f, -0.010831f, -0.002427f, 0.025283f, 0.000602f, 0.027059f, 0.020391f, 0.023939f, -0.031364f, 0.005280f, 0.022634f, 0.027287f, 0.020335f, 0.015724f, 0.036548f, 0.044926f, -0.033967f, -0.003854f, 0.068059f, -0.016098f, -0.018274f, 0.044205f, 0.059402f, 0.001362f, -0.000473f, -0.031834f, -0.026275f, -0.001485f, 0.029889f, -0.004103f, -0.005494f, 0.001607f, -0.002162f, -0.008005f, -0.022736f, -0.008086f, -0.001616f, -0.013263f, 0.001041f, 0.014105f, -0.007612f, 0.017968f, -0.017782f, 0.015874f, -0.003516f, 0.013863f, -0.013300f, 0.000725f, 0.010186f, 0.006181f, 0.017339f, -0.002772f, -0.008963f, -0.003735f, 0.005252f, 0.016020f, 0.004787f, -0.005343f, 0.021865f, -0.006488f, 0.011589f, 0.011787f, -0.001854f, -0.002140f, -0.004790f, 0.032029f, -0.011463f, 0.004371f, 0.008227f, 0.012100f, -0.005619f, -0.020285f, -0.011814f, -0.003288f, 0.024112f, 0.011919f, + -0.001677f, 0.001737f, 0.008657f, -0.001239f, 0.000413f, 0.008791f, 0.004623f, 0.002472f, 0.000332f, 0.018756f, 0.042068f, -0.002457f, 0.013214f, -0.035737f, 0.034261f, -0.018079f, -0.011070f, -0.031295f, -0.020217f, 0.064376f, 0.001025f, -0.045231f, -0.020063f, -0.001308f, 0.000317f, -0.005948f, 0.049872f, 0.023244f, -0.004101f, -0.020762f, -0.001826f, 0.013073f, -0.006006f, 0.066226f, 0.014240f, 0.029099f, 0.010205f, -0.014959f, -0.037343f, 0.008771f, -0.000257f, 0.005817f, -0.028885f, -0.003150f, -0.019445f, 0.022256f, 0.000323f, 0.003572f, 0.023383f, -0.021098f, -0.015186f, 0.004462f, 0.001229f, 0.006764f, -0.031878f, -0.025356f, -0.054766f, -0.028917f, 0.002599f, -0.031567f, 0.004453f, -0.022961f, -0.013403f, 0.040654f, 0.013095f, -0.020054f, 0.012492f, 0.004428f, 0.000098f, 0.039069f, -0.006460f, 0.047364f, 0.018487f, -0.020723f, -0.057804f, 0.009878f, 0.009552f, 0.031911f, -0.017089f, -0.042007f, -0.014567f, 0.011813f, 0.002389f, -0.010256f, -0.029719f, -0.009961f, -0.042116f, -0.048679f, 0.015442f, -0.003029f, 0.049885f, -0.016200f, -0.029845f, -0.026608f, -0.002068f, 0.034656f, + -0.001531f, 0.012516f, 0.022846f, 0.016815f, -0.007315f, 0.011008f, 0.015752f, 0.004710f, 0.016143f, 0.015026f, -0.010543f, -0.002033f, 0.022473f, -0.004833f, 0.003502f, 0.020516f, -0.003549f, 0.011970f, -0.015052f, 0.005562f, 0.012517f, -0.007590f, 0.007673f, 0.006385f, -0.014000f, 0.018701f, -0.017678f, 0.008748f, 0.010163f, 0.014707f, -0.003269f, -0.011092f, 0.021048f, -0.003318f, 0.015716f, -0.022516f, -0.010096f, -0.016717f, -0.012973f, 0.001378f, -0.010570f, 0.007656f, 0.001746f, 0.002788f, -0.021315f, 0.029972f, -0.033618f, -0.002208f, 0.050608f, -0.011133f, 0.014848f, 0.005080f, 0.006545f, -0.047812f, 0.039363f, -0.004158f, -0.038280f, -0.022549f, 0.019821f, -0.005934f, 0.009842f, -0.000483f, -0.015960f, -0.012031f, 0.006706f, -0.012054f, -0.002903f, -0.000932f, -0.055385f, -0.014714f, -0.037185f, 0.007919f, 0.013017f, -0.000611f, -0.016452f, 0.006275f, -0.007948f, 0.021383f, -0.049027f, 0.002991f, 0.008376f, 0.027681f, -0.021432f, 0.025768f, -0.021114f, 0.016289f, 0.004288f, 0.019980f, -0.032065f, 0.009475f, -0.015964f, -0.034229f, 0.021901f, -0.027758f, -0.055330f, 0.007803f, + -0.005330f, 0.043200f, -0.021155f, 0.005782f, 0.019834f, 0.028558f, 0.032517f, 0.003214f, -0.011360f, -0.020881f, 0.000491f, 0.015261f, 0.021356f, -0.043305f, 0.048015f, -0.000681f, -0.032699f, -0.024627f, -0.043454f, 0.017319f, 0.010336f, 0.016926f, 0.007444f, 0.045597f, -0.016484f, 0.049583f, -0.027259f, 0.011374f, -0.011189f, -0.023490f, -0.069716f, 0.038931f, 0.007322f, -0.018748f, -0.047395f, -0.003055f, 0.008555f, -0.004354f, 0.017071f, -0.013043f, -0.015383f, -0.002769f, 0.007144f, -0.013568f, -0.013301f, -0.008687f, -0.002670f, 0.006993f, -0.004343f, -0.004531f, -0.018957f, 0.013569f, 0.000191f, -0.010571f, 0.008313f, -0.007762f, 0.014181f, -0.004802f, 0.006956f, 0.009248f, 0.017569f, -0.006494f, 0.015922f, 0.001464f, 0.000611f, -0.017838f, -0.014046f, 0.003937f, 0.006276f, 0.002074f, 0.000612f, -0.003745f, -0.011783f, -0.006714f, -0.005772f, -0.012866f, -0.006091f, 0.021486f, -0.011291f, -0.012803f, 0.006435f, -0.027669f, -0.041013f, -0.000258f, 0.022477f, -0.009074f, -0.044410f, -0.007167f, -0.064857f, 0.031265f, -0.071667f, 0.042616f, -0.049573f, -0.043310f, 0.012227f, 0.036949f, + 0.027612f, -0.024736f, 0.025902f, 0.046507f, 0.008214f, 0.006825f, 0.010902f, 0.004059f, -0.027558f, 0.033307f, -0.056224f, -0.035047f, 0.003089f, -0.003639f, -0.003666f, -0.007631f, -0.014052f, 0.007327f, 0.051627f, 0.013192f, 0.007132f, 0.004666f, -0.024366f, 0.029832f, -0.005472f, -0.052183f, -0.008049f, 0.000931f, 0.001080f, -0.035764f, -0.025169f, 0.027180f, -0.008950f, 0.046775f, 0.008687f, -0.000164f, -0.038245f, -0.021154f, 0.014072f, 0.005865f, -0.010433f, 0.040041f, -0.031859f, -0.019555f, -0.001392f, -0.002561f, 0.037985f, 0.002882f, 0.044439f, -0.000195f, -0.036295f, 0.008833f, -0.030937f, 0.023378f, -0.004321f, 0.031931f, 0.060832f, -0.093788f, 0.031917f, 0.012744f, 0.017180f, 0.035217f, 0.008833f, -0.043129f, -0.009905f, -0.004104f, -0.007703f, 0.021726f, -0.043888f, 0.003962f, -0.011439f, -0.006464f, -0.030207f, -0.016484f, -0.045733f, 0.004905f, -0.002795f, 0.004521f, 0.012720f, -0.018795f, -0.003259f, 0.022062f, -0.013593f, 0.004174f, -0.007513f, -0.022773f, 0.010619f, 0.013456f, -0.015698f, -0.001855f, -0.024873f, -0.001656f, -0.036039f, 0.012821f, 0.009035f, -0.004699f, + 0.004032f, -0.009316f, 0.001683f, 0.007177f, -0.005631f, -0.006937f, 0.020843f, 0.025081f, -0.005495f, 0.008199f, 0.004265f, 0.025749f, 0.011729f, -0.032820f, 0.004537f, 0.018557f, -0.010435f, 0.018753f, 0.006328f, 0.008540f, 0.076646f, 0.066248f, -0.018868f, -0.025519f, -0.001450f, -0.050267f, 0.029464f, -0.002794f, 0.011154f, 0.003999f, -0.025392f, 0.076479f, -0.032767f, -0.134662f, -0.019666f, 0.026982f, -0.090661f, -0.015454f, 0.028441f, -0.076751f, 0.010712f, 0.050126f, -0.035277f, 0.050009f, -0.047882f, 0.042980f, 0.053243f, -0.033882f, 0.014529f, -0.004802f, 0.001193f, -0.014294f, -0.021013f, -0.003778f, 0.032780f, -0.021002f, -0.035101f, -0.019086f, -0.028262f, -0.002888f, -0.022179f, -0.003521f, 0.011759f, -0.005175f, 0.032009f, -0.028113f, -0.034650f, 0.027744f, -0.036655f, -0.054300f, -0.069750f, -0.024194f, -0.001642f, 0.013687f, 0.038895f, -0.016121f, 0.017442f, 0.018336f, -0.012785f, -0.005894f, 0.064075f, -0.042236f, -0.001625f, 0.043971f, 0.013604f, 0.034603f, -0.008610f, 0.012696f, 0.048649f, 0.025136f, -0.002640f, -0.005805f, -0.029980f, 0.012424f, 0.048932f, -0.045368f, + 0.034611f, -0.044894f, 0.013143f, 0.063794f, 0.014677f, -0.035628f, 0.036200f, 0.005885f, -0.022849f, -0.017704f, 0.043804f, 0.014556f, 0.018894f, -0.002503f, 0.003314f, 0.012154f, 0.014368f, -0.001168f, -0.004390f, 0.018772f, 0.016251f, 0.003564f, -0.021654f, 0.023973f, 0.002944f, -0.008082f, 0.005858f, 0.008308f, -0.015771f, -0.004044f, 0.012153f, 0.002485f, 0.020246f, -0.024873f, 0.037612f, 0.029285f, -0.005188f, -0.023720f, -0.009700f, 0.025208f, 0.028663f, 0.046382f, -0.001443f, 0.009026f, 0.007554f, 0.025475f, -0.038609f, -0.020481f, 0.038696f, 0.024322f, 0.002602f, -0.006161f, 0.003302f, 0.010784f, -0.020227f, -0.015779f, -0.013617f, 0.002897f, 0.012316f, -0.006185f, -0.021939f, -0.015686f, 0.067248f, 0.045561f, -0.064936f, -0.013140f, 0.057887f, -0.017689f, -0.035942f, -0.025379f, -0.036067f, -0.021292f, 0.058434f, 0.035639f, -0.004793f, 0.026517f, -0.006472f, 0.032335f, -0.020454f, -0.011355f, 0.064918f, -0.027100f, 0.011656f, -0.018858f, -0.007123f, -0.000784f, 0.017681f, 0.052847f, 0.020279f, -0.035891f, -0.010619f, -0.001695f, -0.005538f, 0.029730f, 0.003870f, 0.053220f, + -0.015812f, 0.009165f, -0.005611f, 0.015511f, -0.044767f, 0.026797f, -0.041307f, 0.027856f, -0.002307f, 0.040902f, -0.010806f, 0.030324f, -0.014129f, 0.009531f, 0.017282f, -0.017696f, 0.017907f, 0.041301f, 0.051468f, -0.027361f, 0.052737f, 0.022210f, 0.062589f, -0.018039f, 0.011676f, -0.002369f, -0.007886f, -0.012058f, -0.004500f, -0.020805f, -0.103022f, -0.064788f, -0.020103f, -0.001338f, 0.014414f, 0.007207f, 0.023581f, 0.038696f, -0.056790f, -0.003233f, -0.023056f, 0.085622f, -0.006193f, -0.026144f, -0.007651f, -0.075246f, -0.063092f, 0.094638f, 0.038308f, 0.021100f, -0.014818f, 0.029594f, 0.002242f, -0.068922f, 0.013853f, 0.004581f, -0.026412f, -0.026958f, 0.004102f, 0.000286f, 0.007096f, -0.014514f, -0.007565f, -0.033837f, -0.028778f, 0.011973f, 0.014759f, 0.012936f, 0.009805f, -0.017670f, -0.026033f, -0.015846f, -0.033614f, 0.020951f, 0.006914f, -0.059443f, -0.007310f, -0.017357f, -0.004396f, 0.028830f, -0.027616f, -0.038542f, -0.008756f, 0.024595f, 0.008055f, -0.026833f, 0.015547f, 0.034066f, -0.064110f, -0.017379f, 0.022356f, -0.001392f, -0.005221f, -0.012420f, -0.002959f, 0.010851f, + 0.018669f, 0.004221f, 0.051199f, -0.073542f, 0.069629f, -0.020058f, -0.020518f, 0.018077f, 0.032527f, -0.057549f, -0.011353f, 0.001218f, 0.011749f, 0.003312f, -0.001440f, 0.029174f, -0.017368f, 0.003919f, 0.015435f, 0.017064f, 0.024370f, 0.020193f, 0.006887f, -0.031498f, -0.006182f, 0.043302f, -0.041671f, -0.035613f, 0.044873f, 0.015445f, 0.031762f, 0.049026f, 0.075918f, -0.016985f, -0.047964f, 0.064245f, -0.025676f, -0.010628f, 0.066962f, 0.021165f, -0.024311f, -0.069485f, -0.045800f, -0.006814f, -0.025537f, 0.032957f, 0.065997f, 0.033908f, -0.022391f, 0.067774f, 0.022934f, -0.024305f, 0.018842f, 0.075611f, 0.022027f, 0.014802f, -0.015713f, -0.060243f, -0.080920f, -0.064294f, -0.004448f, 0.049074f, 0.015156f, 0.031076f, 0.115847f, 0.057172f, -0.069000f, -0.046433f, 0.030900f, -0.095628f, -0.043800f, 0.082818f, 0.029747f, -0.106270f, -0.088616f, -0.041020f, -0.067789f, -0.063731f, -0.038022f, 0.058133f, -0.016260f, -0.011949f, 0.151420f, 0.025611f, -0.043277f, -0.011865f, -0.046777f, 0.080528f, -0.016698f, 0.017642f, 0.005794f, 0.001338f, -0.043760f, -0.016831f, -0.003213f, -0.022109f, + 0.005542f, 0.017404f, 0.039580f, 0.005287f, -0.026496f, -0.000995f, 0.000109f, -0.017483f, 0.008381f, 0.011562f, 0.013578f, -0.034720f, 0.009211f, -0.032159f, 0.005879f, 0.017079f, -0.001640f, 0.025895f, -0.005982f, -0.001572f, 0.026359f, -0.005243f, 0.014863f, 0.029038f, -0.009552f, 0.008713f, 0.020270f, 0.021839f, 0.018183f, 0.003660f, 0.004787f, 0.015200f, -0.015662f, -0.006102f, 0.010746f, -0.103137f, 0.071669f, 0.030830f, 0.023278f, 0.028868f, -0.010948f, 0.035392f, 0.029107f, 0.041468f, -0.007718f, 0.056825f, -0.035516f, 0.043124f, -0.015547f, -0.032873f, -0.010329f, -0.053983f, 0.005743f, -0.019778f, 0.019236f, -0.013651f, -0.020810f, 0.051926f, -0.059461f, 0.038502f, -0.001918f, -0.025910f, -0.010284f, 0.023023f, 0.026104f, 0.018807f, 0.049211f, 0.039608f, -0.028315f, -0.005909f, -0.025319f, 0.022081f, -0.022427f, 0.017222f, 0.023768f, 0.010837f, 0.013388f, 0.008800f, -0.013881f, 0.054198f, -0.004965f, 0.016109f, 0.005522f, 0.024968f, 0.013963f, -0.064820f, 0.004307f, -0.038786f, 0.009993f, 0.028590f, -0.005202f, -0.027478f, -0.025054f, 0.060367f, -0.063727f, -0.051665f, + 0.094882f, -0.040314f, 0.024688f, 0.009376f, 0.030547f, -0.014359f, 0.016035f, -0.066030f, 0.004623f, 0.064002f, -0.034210f, -0.025979f, 0.055339f, -0.003852f, -0.045692f, -0.033997f, 0.020470f, -0.018053f, -0.010538f, 0.034161f, -0.025141f, 0.008422f, 0.042799f, -0.048206f, 0.003285f, 0.028030f, -0.015485f, -0.009699f, -0.012438f, 0.017188f, 0.004913f, 0.006845f, -0.006185f, 0.009686f, 0.007538f, -0.009617f, 0.000872f, 0.001533f, 0.025610f, 0.012655f, -0.023731f, 0.029020f, 0.007461f, -0.015070f, 0.008684f, 0.008713f, -0.002483f, -0.008928f, 0.021108f, -0.000202f, 0.007232f, 0.002376f, 0.027259f, -0.012836f, -0.010008f, 0.016168f, -0.024130f, 0.030316f, -0.002105f, -0.017605f, -0.002650f, -0.002178f, 0.003889f, -0.000697f, -0.011552f, -0.002134f, 0.016173f, 0.031511f, -0.062019f, -0.248735f, -0.268252f, -0.010671f, -0.154285f, 0.134782f, 0.489816f, 0.212948f, 0.295020f, 0.372857f, -0.142151f, -0.100824f, -0.040707f, -0.336710f, -0.235779f, -0.077098f, -0.369100f, -0.161409f, -0.033710f, -0.151451f, 0.034928f, 0.344636f, 0.313026f, 0.338814f, 0.439461f, 0.264422f, -0.024801f, 0.098051f, + -0.099647f, -0.392781f, -0.213816f, -0.158463f, -0.326515f, -0.224175f, 0.011523f, -0.251617f, -0.083438f, 0.054396f, -0.251389f, -0.129379f, 0.186477f, 0.071762f, 0.202311f, 0.505300f, 0.410630f, 0.331865f, 0.597849f, 0.433678f, -0.008317f, 0.061576f, -0.112854f, -0.537461f, -0.513765f, -0.529987f, -0.824966f, -0.559126f, -0.345924f, -0.338670f, 0.003094f, 0.266599f, 0.300444f, 0.421419f, 0.638548f, 0.590829f, 0.498683f, 0.492305f, 0.281542f, 0.098318f, 0.014734f, -0.031365f, -0.225127f, -0.386812f, -0.474652f, -0.508191f, -0.685748f, -0.570288f, -0.439995f, -0.215859f, 0.228522f, 0.676443f, 0.630033f, 0.690388f, 0.483908f, 0.058126f, -0.066870f, -0.208586f, -0.286304f, -0.193951f, -0.095656f, -0.096532f, -0.043296f, -0.044832f, -0.070474f, -0.000529f, 0.009031f, 0.049362f, 0.156663f, 0.142097f, 0.104540f, 0.143990f, -0.014715f, -0.094719f, -0.013602f, -0.111041f, -0.096189f, 0.057954f, 0.062879f, 0.013754f, 0.013661f, -0.168683f, -0.429797f, -0.407121f, -0.346789f, -0.261584f, 0.125923f, 0.390225f, 0.477544f, 0.603363f, 0.540887f, 0.333210f, 0.231139f, 0.081408f, -0.097083f, -0.202725f, + -0.241538f, -0.313087f, -0.383885f, -0.432931f, -0.505349f, -0.449509f, -0.155857f, 0.109750f, 0.259357f, 0.336378f, 0.365782f, 0.274318f, 0.190338f, 0.095166f, -0.003767f, -0.011268f, 0.046555f, 0.074332f, 0.081588f, 0.088721f, 0.073833f, 0.006856f, -0.060198f, -0.130512f, -0.233551f, -0.224220f, -0.179966f, -0.146470f, -0.071319f, 0.006661f, 0.050612f, 0.044768f, 0.029253f, 0.017308f, 0.014183f}, + {-0.014472f, 0.007019f, -0.016458f, 0.003226f, 0.001197f, 0.001032f, -0.011229f, -0.003981f, 0.003092f, -0.002462f, 0.003660f, 0.005849f, 0.003532f, -0.000153f, 0.004611f, -0.012695f, 0.000308f, -0.000495f, -0.000311f, 0.006973f, 0.010611f, -0.011130f, -0.002496f, -0.006752f, -0.002200f, 0.003959f, 0.007282f, 0.001177f, 0.001807f, -0.002745f, -0.003625f, -0.002956f, -0.002251f, -0.005069f, 0.002770f, -0.005110f, -0.003448f, 0.005807f, -0.004963f, 0.004168f, 0.000689f, -0.012567f, -0.004259f, -0.006928f, -0.001661f, 0.005333f, -0.003716f, -0.001103f, -0.003655f, -0.003783f, -0.002644f, 0.005213f, 0.007932f, 0.001458f, 0.004410f, 0.003501f, -0.004216f, -0.007994f, 0.004286f, 0.003527f, -0.001749f, -0.006879f, -0.005739f, 0.005174f, 0.001046f, 0.003869f, 0.001842f, -0.010573f, -0.003493f, -0.003938f, 0.005829f, 0.002356f, -0.010633f, 0.002794f, -0.005638f, -0.001748f, -0.000556f, -0.003856f, 0.003029f, -0.003519f, 0.000811f, 0.004053f, 0.004184f, 0.002570f, 0.002884f, 0.001887f, -0.000341f, 0.002015f, 0.002480f, 0.000234f, -0.002067f, 0.002838f, 0.000585f, 0.000023f, -0.000841f, -0.001907f, + 0.000912f, 0.001790f, 0.000320f, 0.001469f, -0.000569f, -0.000972f, -0.000025f, -0.001493f, 0.001565f, -0.000276f, 0.001851f, -0.000358f, 0.000357f, -0.000180f, 0.001720f, 0.000905f, -0.000092f, -0.000725f, 0.001089f, -0.020418f, 0.013541f, -0.009750f, 0.001369f, -0.001286f, -0.003714f, 0.010380f, -0.009100f, -0.006043f, 0.000009f, 0.010972f, -0.004050f, -0.000609f, -0.001161f, 0.009081f, -0.005450f, -0.014497f, -0.003211f, -0.007444f, -0.010133f, 0.000405f, -0.000792f, 0.001706f, 0.005886f, 0.009696f, 0.006046f, 0.000964f, 0.014803f, 0.005786f, 0.000518f, 0.010576f, 0.011079f, -0.000859f, -0.005943f, 0.000451f, 0.004904f, 0.003937f, -0.000068f, -0.002103f, -0.008567f, -0.007540f, -0.003701f, 0.008491f, 0.003521f, 0.014602f, 0.008268f, -0.000623f, 0.004896f, 0.005965f, 0.002004f, -0.009032f, 0.009825f, -0.003864f, 0.005146f, -0.000364f, 0.003123f, -0.010774f, -0.001706f, -0.003408f, 0.003839f, -0.003271f, -0.004059f, 0.011299f, -0.000760f, -0.008437f, 0.003366f, -0.006414f, 0.005283f, -0.003606f, 0.008469f, 0.007311f, 0.008124f, 0.002757f, -0.007787f, 0.004324f, -0.001164f, 0.004263f, + -0.003358f, 0.001237f, 0.011121f, -0.004250f, 0.005413f, 0.007330f, -0.001074f, 0.000474f, -0.000311f, -0.001301f, -0.002928f, 0.001872f, -0.000152f, 0.002804f, -0.000036f, 0.002271f, 0.000167f, 0.000213f, 0.001625f, 0.002731f, 0.001152f, 0.002623f, 0.002916f, -0.000520f, -0.002084f, 0.003786f, 0.000439f, -0.000077f, 0.000320f, 0.002320f, -0.000587f, -0.002034f, 0.001123f, -0.000468f, 0.000626f, 0.000110f, 0.002286f, 0.000765f, 0.001258f, 0.000772f, 0.004081f, 0.004587f, 0.000231f, -0.003978f, 0.004278f, 0.001671f, 0.001292f, 0.002027f, -0.016178f, 0.005239f, -0.010314f, 0.001709f, 0.003326f, 0.003508f, -0.004741f, 0.008585f, 0.001347f, -0.003182f, -0.001498f, 0.010021f, 0.007176f, -0.004366f, -0.005632f, -0.004607f, 0.003856f, 0.007110f, -0.004324f, -0.004703f, 0.001364f, -0.018333f, -0.000074f, -0.007825f, -0.003121f, -0.007784f, -0.010237f, -0.001256f, 0.009253f, 0.002558f, -0.008352f, -0.002208f, 0.007914f, 0.002406f, -0.005142f, 0.008999f, -0.003957f, -0.012548f, -0.003780f, 0.007048f, -0.003156f, 0.008340f, 0.015893f, 0.012892f, 0.001739f, -0.000175f, 0.004459f, -0.001953f, + -0.009452f, 0.000102f, 0.003497f, -0.006734f, 0.005630f, -0.013358f, -0.002048f, 0.000834f, -0.005724f, -0.004360f, 0.005768f, 0.011653f, -0.009180f, -0.009527f, 0.005870f, 0.005965f, 0.010913f, 0.003540f, -0.006460f, 0.008766f, 0.007505f, -0.002513f, 0.008373f, -0.009322f, 0.009388f, 0.002298f, 0.006343f, 0.001301f, -0.005083f, -0.002871f, -0.000973f, 0.002088f, 0.000134f, -0.004581f, 0.001516f, 0.000055f, -0.002751f, -0.002196f, 0.000553f, -0.000673f, 0.001991f, 0.000127f, 0.003365f, -0.002482f, -0.001889f, -0.000120f, 0.000369f, 0.002983f, -0.001582f, -0.002964f, 0.001276f, 0.000117f, -0.000703f, 0.002031f, -0.000536f, 0.001234f, -0.001419f, 0.001244f, 0.001723f, 0.000243f, 0.002840f, 0.027540f, -0.010696f, -0.004709f, -0.001761f, 0.019856f, -0.001974f, 0.015017f, -0.010915f, 0.013234f, -0.013093f, -0.011487f, 0.002766f, 0.006269f, -0.007729f, -0.001897f, 0.003952f, -0.001009f, 0.005153f, -0.007970f, 0.009206f, 0.003331f, -0.009865f, -0.000372f, 0.003964f, 0.003094f, 0.001769f, 0.018680f, 0.014891f, 0.011650f, 0.000004f, 0.007563f, 0.000714f, 0.002184f, 0.005599f, -0.017233f, + -0.002630f, 0.010507f, 0.006841f, 0.008156f, -0.000187f, -0.003051f, 0.003811f, -0.000676f, 0.021072f, -0.003186f, 0.003559f, 0.002118f, 0.001037f, -0.006228f, 0.012640f, -0.001433f, 0.013142f, -0.007233f, -0.007581f, 0.005446f, -0.005048f, -0.017530f, -0.008070f, 0.003535f, -0.001658f, -0.012538f, 0.003508f, 0.000041f, 0.016328f, 0.001434f, 0.001424f, -0.004985f, 0.005950f, 0.006030f, -0.001330f, -0.000948f, 0.014344f, 0.010542f, 0.010475f, -0.006908f, -0.009831f, -0.008585f, -0.016800f, 0.001403f, -0.011892f, -0.004014f, 0.000759f, -0.006484f, -0.007396f, -0.004122f, -0.000828f, -0.002523f, 0.003965f, 0.007382f, -0.001372f, -0.000850f, -0.003305f, 0.001713f, -0.002391f, -0.002768f, 0.001190f, 0.002026f, 0.000041f, 0.002609f, -0.001511f, 0.000097f, -0.001459f, -0.000984f, -0.000792f, 0.001520f, -0.000899f, -0.000908f, -0.000532f, -0.002386f, -0.002708f, 0.000170f, -0.000290f, -0.003284f, 0.002805f, 0.002803f, 0.003417f, -0.000062f, -0.002368f, -0.001390f, 0.002688f, 0.020200f, -0.016087f, -0.000452f, -0.016824f, -0.011071f, -0.006582f, 0.014507f, 0.008494f, -0.020319f, -0.027758f, -0.010717f, + 0.009732f, 0.006905f, -0.004200f, 0.009444f, 0.000046f, -0.002410f, 0.001033f, -0.014621f, 0.004341f, -0.001970f, 0.001170f, 0.004554f, 0.000940f, -0.000103f, 0.006075f, 0.005322f, -0.009727f, -0.009704f, 0.010975f, -0.003542f, -0.005466f, 0.006699f, -0.019000f, 0.004468f, 0.003914f, -0.017517f, 0.006313f, 0.018028f, 0.010908f, 0.012359f, 0.002503f, 0.006798f, 0.017124f, 0.003173f, 0.003231f, -0.019739f, 0.010359f, 0.014796f, 0.012107f, 0.002286f, 0.012300f, -0.014078f, 0.013781f, -0.004195f, -0.013838f, -0.021317f, -0.000245f, -0.013577f, -0.010948f, -0.004727f, -0.013000f, -0.032379f, 0.001370f, 0.001638f, -0.001116f, 0.004986f, 0.015875f, 0.005936f, 0.006385f, 0.004196f, -0.011583f, 0.001645f, 0.005373f, 0.004591f, 0.004072f, 0.004658f, -0.011886f, -0.003564f, -0.014974f, -0.006789f, -0.001103f, 0.003443f, -0.005492f, 0.005266f, 0.001037f, 0.000897f, -0.003769f, -0.000642f, -0.002013f, -0.000005f, -0.002173f, 0.001967f, 0.000624f, 0.001483f, -0.000573f, -0.002764f, -0.002304f, -0.002279f, 0.002273f, 0.001447f, -0.000027f, -0.001081f, -0.002089f, -0.002267f, -0.002203f, -0.006760f, + 0.000993f, 0.000919f, -0.005128f, -0.002689f, -0.001876f, -0.043727f, 0.021493f, 0.002747f, -0.017009f, 0.004101f, -0.001900f, -0.005037f, -0.003501f, -0.009645f, 0.005130f, -0.004958f, 0.000977f, 0.006272f, 0.005768f, 0.018909f, -0.007695f, -0.018117f, 0.009802f, -0.022966f, -0.009936f, 0.003720f, 0.003109f, 0.002593f, 0.007383f, 0.009184f, 0.007881f, -0.000189f, 0.010445f, 0.000662f, -0.004225f, 0.013923f, 0.008584f, -0.004268f, 0.008235f, -0.014442f, 0.027192f, 0.001011f, 0.005008f, -0.002574f, -0.023460f, -0.004069f, -0.008773f, -0.008213f, 0.003565f, 0.019484f, 0.000484f, 0.000803f, -0.002584f, -0.005394f, -0.012698f, 0.003983f, -0.002155f, 0.006970f, -0.015986f, 0.005358f, 0.008404f, 0.003721f, -0.011865f, -0.004196f, 0.003031f, 0.001514f, 0.009475f, 0.001869f, 0.033055f, -0.009465f, -0.014200f, -0.016058f, -0.004935f, 0.000332f, 0.011750f, -0.015994f, -0.002153f, -0.006859f, 0.007227f, -0.023348f, -0.001096f, -0.006329f, -0.009855f, 0.002905f, -0.002917f, 0.006362f, -0.000911f, 0.011694f, 0.007326f, -0.000037f, 0.002407f, 0.000902f, 0.001394f, 0.013563f, 0.001553f, 0.009699f, + 0.003440f, -0.002453f, 0.000172f, 0.000347f, 0.002726f, -0.001786f, 0.001364f, -0.000521f, 0.004031f, 0.000760f, -0.003147f, -0.004463f, 0.003534f, -0.001719f, -0.005394f, -0.002343f, -0.002872f, -0.001235f, -0.001701f, -0.000099f, 0.006503f, 0.000112f, 0.001777f, 0.000795f, 0.002585f, -0.002602f, -0.001523f, -0.005653f, 0.019687f, -0.006404f, -0.004766f, 0.004193f, 0.005768f, -0.015982f, -0.016127f, -0.014755f, -0.013874f, -0.022655f, 0.014179f, -0.013284f, 0.003932f, 0.005425f, 0.020471f, -0.003461f, -0.004949f, 0.016020f, 0.003658f, 0.003303f, -0.018958f, -0.012443f, 0.009214f, 0.003964f, 0.007310f, 0.011037f, -0.019971f, 0.000150f, 0.008417f, 0.018916f, -0.000274f, 0.001722f, -0.002942f, -0.000061f, -0.013064f, -0.002533f, -0.004121f, -0.024221f, -0.002025f, 0.007304f, -0.013946f, 0.005857f, -0.015165f, -0.000164f, -0.010522f, -0.002223f, -0.003348f, 0.001283f, 0.019377f, -0.005759f, 0.000161f, 0.009898f, -0.005680f, 0.005762f, -0.016262f, -0.028887f, -0.015752f, -0.008819f, -0.004187f, 0.002977f, 0.019105f, -0.009129f, 0.005040f, 0.004585f, -0.013941f, 0.004576f, -0.010766f, -0.003844f, + 0.006914f, 0.019396f, -0.003119f, -0.001147f, 0.006100f, -0.000546f, -0.018440f, -0.017439f, -0.007407f, 0.017193f, -0.002222f, -0.026054f, 0.001693f, -0.017157f, -0.007707f, -0.003652f, -0.001952f, 0.005648f, -0.006714f, -0.002102f, 0.006305f, -0.001944f, 0.007428f, 0.006447f, 0.004590f, -0.003198f, 0.007267f, -0.006744f, -0.005143f, -0.004815f, 0.000955f, -0.000895f, -0.001596f, -0.001693f, -0.001452f, -0.002421f, 0.001302f, -0.000733f, 0.004609f, -0.003446f, -0.002288f, 0.001879f, -0.003065f, -0.001835f, -0.007686f, -0.009210f, -0.000997f, 0.000577f, 0.004264f, 0.000456f, 0.002492f, 0.000065f, 0.019226f, 0.020181f, -0.006169f, 0.001880f, 0.021170f, -0.021523f, -0.019147f, 0.016198f, -0.003870f, 0.002216f, 0.014713f, -0.002904f, -0.004012f, 0.014689f, -0.027198f, 0.011592f, -0.001215f, 0.004605f, 0.013257f, 0.013657f, -0.015222f, 0.002885f, -0.020919f, 0.006436f, -0.006285f, -0.002247f, -0.014551f, -0.000753f, -0.020864f, 0.002016f, -0.018081f, 0.012668f, -0.006331f, 0.002390f, 0.022609f, 0.010468f, 0.010135f, -0.018043f, 0.003345f, 0.020933f, -0.004930f, -0.029774f, 0.016001f, -0.003646f, + 0.002942f, -0.005869f, -0.013773f, 0.019650f, 0.007100f, 0.016009f, 0.004036f, 0.002308f, -0.013183f, -0.017168f, 0.006217f, 0.008017f, 0.008646f, 0.011400f, 0.026381f, -0.000888f, -0.020386f, -0.013309f, 0.015899f, -0.002298f, -0.017515f, -0.004630f, -0.001037f, -0.004799f, -0.022174f, 0.000341f, 0.003083f, 0.005540f, -0.008005f, 0.012798f, -0.000609f, 0.001407f, 0.018266f, 0.009310f, 0.019018f, -0.018670f, -0.007756f, 0.003439f, -0.010209f, 0.008495f, 0.005270f, 0.005202f, -0.000732f, -0.002377f, -0.001516f, -0.000291f, -0.007303f, 0.009397f, -0.003394f, 0.005762f, -0.001472f, 0.006712f, -0.002629f, -0.003334f, 0.000467f, 0.003856f, -0.003261f, -0.000129f, -0.000772f, -0.003708f, -0.001810f, 0.001700f, -0.004019f, -0.001274f, -0.008594f, -0.006757f, 0.003719f, 0.005972f, 0.003172f, 0.002721f, -0.000837f, -0.000709f, -0.003981f, -0.000651f, 0.004529f, -0.005778f, -0.000748f, 0.002667f, -0.001089f, 0.004674f, 0.004611f, -0.003235f, -0.001225f, 0.004179f, 0.002984f, -0.002175f, 0.015310f, -0.018635f, 0.021827f, -0.004913f, 0.023088f, -0.018855f, 0.017089f, 0.001882f, -0.001806f, 0.028759f, + -0.015024f, 0.001723f, -0.014583f, -0.004342f, 0.043829f, 0.021156f, 0.009306f, 0.006347f, 0.012465f, -0.006998f, -0.000059f, -0.037048f, 0.006882f, -0.001541f, -0.016026f, 0.017776f, 0.013328f, -0.000547f, 0.003163f, -0.021404f, 0.018867f, -0.009991f, 0.020036f, 0.013140f, 0.010697f, -0.015353f, -0.002706f, -0.012907f, 0.019238f, 0.004442f, -0.007011f, 0.034116f, 0.016297f, -0.003835f, 0.001786f, -0.028242f, 0.004792f, 0.001324f, 0.022436f, -0.010068f, -0.028745f, -0.004931f, -0.007959f, -0.005572f, -0.040625f, -0.020226f, -0.043270f, -0.022023f, -0.015470f, 0.005109f, -0.010886f, 0.020443f, 0.002538f, -0.023339f, 0.014084f, -0.015609f, 0.022081f, -0.019674f, -0.015979f, 0.011530f, 0.019668f, 0.019403f, 0.000056f, -0.018157f, -0.014515f, 0.008910f, -0.011906f, 0.000467f, -0.006017f, 0.007342f, -0.008174f, -0.011986f, 0.021163f, 0.009837f, 0.002887f, -0.003351f, 0.007973f, 0.004531f, 0.009815f, -0.000904f, 0.006646f, 0.002374f, 0.011023f, 0.000234f, -0.000523f, 0.000639f, -0.005437f, 0.000209f, 0.002816f, 0.001369f, 0.001206f, 0.000310f, 0.008489f, 0.003909f, -0.006708f, 0.000758f, + 0.003860f, -0.002105f, -0.002563f, -0.001608f, 0.000510f, 0.001635f, 0.004274f, -0.001060f, 0.002914f, 0.004979f, -0.001034f, -0.005029f, -0.000444f, -0.005485f, -0.002414f, -0.005065f, -0.003269f, 0.004411f, 0.000302f, -0.002831f, -0.026845f, -0.031873f, -0.021127f, -0.003040f, -0.000410f, -0.004135f, 0.007576f, 0.011531f, 0.008006f, -0.000005f, 0.004293f, -0.010116f, 0.006638f, -0.020534f, -0.028626f, 0.000899f, 0.021945f, 0.003843f, -0.007731f, 0.017562f, 0.010391f, 0.016998f, 0.028610f, 0.003715f, -0.008840f, -0.018235f, -0.014606f, 0.008361f, -0.016741f, -0.011606f, 0.004301f, -0.013246f, -0.029202f, -0.016006f, -0.001622f, -0.003390f, 0.006818f, -0.006568f, 0.016162f, 0.004696f, 0.006125f, 0.022381f, -0.003597f, 0.002654f, 0.005178f, -0.017865f, 0.021061f, 0.003469f, -0.019500f, -0.031888f, 0.008103f, 0.002866f, -0.023183f, 0.024524f, 0.015912f, -0.021481f, 0.007261f, 0.020614f, 0.011588f, 0.005526f, 0.017110f, -0.007836f, -0.006918f, 0.001294f, -0.009494f, -0.015181f, 0.025968f, -0.023166f, -0.002595f, 0.009688f, 0.002213f, 0.040374f, -0.035064f, 0.010689f, -0.004493f, -0.000171f, + 0.011279f, 0.000449f, 0.002407f, -0.009434f, 0.005332f, -0.020802f, -0.044106f, -0.002494f, -0.000549f, -0.022678f, -0.014424f, -0.003172f, 0.008323f, 0.007255f, 0.003095f, 0.001848f, -0.007359f, -0.000244f, -0.010304f, -0.005207f, -0.002011f, -0.005995f, -0.009292f, 0.003156f, -0.001782f, 0.001557f, -0.004766f, -0.003504f, 0.002172f, -0.007594f, -0.016105f, -0.005657f, 0.001064f, -0.004402f, -0.015532f, -0.008699f, 0.006411f, 0.004367f, 0.003028f, -0.003122f, -0.005984f, -0.007484f, -0.001403f, -0.003787f, -0.008829f, -0.007350f, -0.010406f, -0.005479f, -0.007030f, -0.007079f, -0.000233f, -0.001779f, 0.002787f, -0.002812f, -0.001979f, 0.005680f, -0.007778f, -0.020810f, 0.018322f, -0.037619f, -0.026715f, 0.019802f, -0.000927f, -0.034267f, 0.017565f, -0.020058f, 0.038776f, 0.007736f, -0.051036f, -0.006517f, 0.004641f, -0.012919f, 0.003842f, 0.008867f, 0.018118f, 0.015480f, -0.029641f, -0.001333f, 0.002779f, -0.006183f, -0.027161f, -0.004238f, -0.005629f, -0.009371f, -0.008277f, -0.000433f, 0.002023f, 0.023083f, 0.025348f, -0.007896f, 0.013660f, 0.011742f, 0.011536f, 0.025204f, 0.000338f, 0.006746f, + -0.029065f, -0.010041f, 0.010271f, -0.005796f, 0.014066f, 0.034613f, 0.005133f, -0.030380f, -0.067577f, -0.000199f, -0.020812f, 0.019152f, -0.012746f, -0.006932f, -0.013248f, -0.036568f, 0.015936f, 0.048776f, 0.002903f, 0.012749f, -0.038254f, 0.007882f, -0.004292f, -0.017298f, 0.004452f, 0.018677f, 0.009796f, 0.015061f, -0.016429f, 0.024180f, 0.014278f, -0.028287f, -0.041872f, -0.002722f, -0.031819f, -0.029891f, -0.018937f, -0.022052f, 0.002957f, 0.039279f, 0.015198f, 0.001398f, -0.005156f, 0.025273f, -0.012786f, -0.018904f, -0.002907f, 0.003894f, -0.002847f, 0.004615f, 0.004052f, 0.000182f, 0.004107f, 0.009642f, 0.003703f, -0.001098f, 0.000870f, -0.003803f, -0.003575f, 0.010116f, -0.002915f, 0.009951f, 0.000414f, -0.005718f, 0.001407f, -0.003036f, -0.004038f, 0.012037f, -0.002723f, 0.006486f, -0.014658f, -0.001959f, 0.007439f, -0.000132f, 0.003179f, 0.012293f, -0.009053f, 0.011227f, -0.000901f, 0.001191f, 0.003709f, -0.003866f, 0.008894f, 0.001185f, 0.000778f, 0.001446f, 0.000697f, 0.003866f, 0.011408f, -0.004725f, 0.004198f, 0.004285f, 0.004627f, 0.004830f, -0.073694f, -0.046519f, + 0.033477f, 0.026964f, 0.043843f, -0.000116f, 0.017301f, 0.004317f, 0.013871f, -0.000517f, 0.008962f, -0.019367f, -0.023221f, -0.014404f, -0.020784f, -0.013402f, -0.014793f, 0.017861f, 0.042152f, 0.009237f, -0.051329f, -0.012165f, 0.009054f, -0.013604f, 0.012601f, -0.029330f, -0.002327f, -0.000952f, 0.001760f, 0.014358f, 0.010907f, 0.002051f, -0.003485f, -0.006523f, 0.012011f, 0.023280f, -0.018575f, -0.028862f, 0.019280f, 0.009191f, 0.025273f, 0.011550f, 0.036716f, -0.025329f, -0.008847f, 0.023441f, 0.035011f, 0.030404f, 0.018037f, 0.008578f, -0.007442f, 0.002327f, -0.004349f, 0.000157f, 0.012171f, -0.045651f, 0.024608f, -0.003580f, 0.006709f, -0.003001f, 0.034740f, -0.010567f, -0.000459f, -0.007591f, 0.022052f, 0.018689f, -0.038911f, 0.027968f, -0.033091f, -0.001666f, -0.016753f, -0.016664f, 0.015194f, 0.002774f, -0.051614f, -0.004573f, -0.004019f, -0.009530f, -0.005958f, -0.001211f, -0.006538f, 0.026847f, 0.002700f, 0.025680f, -0.008061f, 0.030365f, 0.014387f, -0.015685f, 0.006743f, -0.003920f, 0.001806f, 0.001968f, 0.002926f, 0.004090f, 0.001629f, -0.005892f, -0.009661f, 0.015098f, + 0.006762f, 0.012390f, 0.003525f, -0.007383f, 0.014333f, 0.000548f, 0.000816f, 0.010747f, -0.030066f, -0.013981f, -0.013323f, 0.004221f, -0.000337f, -0.020483f, 0.000958f, 0.003425f, -0.000874f, -0.003860f, 0.000020f, 0.007021f, -0.007412f, -0.000318f, 0.008232f, 0.004050f, 0.010018f, -0.008705f, -0.004180f, 0.002456f, 0.010864f, 0.040932f, -0.045537f, -0.001047f, -0.025883f, -0.073014f, -0.008632f, -0.026948f, -0.057630f, 0.011518f, -0.000371f, -0.011199f, 0.003625f, 0.030973f, -0.002002f, -0.032737f, 0.011238f, 0.001324f, -0.010518f, -0.007874f, -0.005834f, 0.001658f, 0.035697f, -0.008008f, -0.001309f, 0.016210f, 0.011983f, -0.005135f, 0.017289f, 0.015820f, -0.007616f, -0.007491f, -0.014332f, 0.019867f, -0.004739f, -0.034194f, 0.005232f, -0.002258f, 0.011762f, 0.044824f, -0.029903f, -0.047975f, -0.030251f, -0.014004f, 0.006648f, 0.016020f, 0.008521f, 0.034127f, 0.017063f, -0.024028f, -0.013867f, -0.032778f, 0.028410f, 0.017488f, 0.003177f, 0.006049f, -0.018797f, 0.002004f, -0.019888f, 0.034412f, 0.033764f, 0.002433f, -0.015699f, -0.008716f, 0.003355f, 0.031334f, 0.062503f, 0.038482f, + -0.005889f, -0.013925f, 0.000891f, 0.019923f, 0.008664f, 0.018394f, 0.025346f, -0.025038f, -0.001137f, -0.048324f, -0.032563f, -0.031034f, -0.020787f, 0.013056f, 0.029734f, 0.020453f, 0.003273f, -0.005863f, -0.002739f, -0.026869f, -0.033806f, -0.008487f, -0.017937f, -0.016901f, 0.003939f, -0.003370f, -0.004274f, 0.000253f, 0.001144f, 0.007807f, -0.008564f, 0.017379f, -0.017523f, 0.007512f, -0.022317f, -0.007415f, 0.000024f, 0.004237f, -0.000603f, 0.004032f, 0.008639f, -0.005973f, 0.001078f, 0.020661f, 0.025171f, 0.030324f, 0.016659f, 0.019042f, 0.008645f, 0.003724f, 0.001492f, 0.000665f, 0.001226f, -0.005151f, -0.016232f, -0.015847f, -0.002564f, 0.012578f, 0.000082f, 0.002075f, -0.006579f, -0.004579f, 0.002019f, 0.015383f, 0.009697f, 0.018335f, 0.012959f, 0.015628f, -0.035671f, -0.004209f, -0.018481f, 0.026816f, -0.029640f, 0.005724f, 0.002584f, 0.052466f, -0.032479f, -0.009531f, -0.033405f, -0.007241f, -0.032996f, -0.027736f, -0.020019f, 0.010323f, -0.035491f, -0.025757f, -0.038592f, -0.009872f, -0.005823f, -0.011826f, -0.017450f, -0.043013f, 0.011220f, -0.030410f, 0.012264f, -0.031905f, + 0.039281f, 0.006032f, 0.017596f, -0.007607f, -0.037089f, 0.019839f, 0.011482f, -0.012499f, 0.019834f, 0.027752f, -0.015027f, -0.039964f, -0.021407f, 0.053519f, -0.022891f, -0.001765f, 0.001368f, -0.009102f, 0.011760f, 0.034681f, 0.006148f, 0.014741f, -0.011182f, 0.024807f, 0.000342f, 0.019538f, 0.005955f, 0.006622f, -0.000609f, 0.001989f, 0.042451f, 0.012852f, 0.101634f, -0.062052f, 0.039607f, 0.055683f, -0.014714f, 0.001256f, 0.028732f, -0.020833f, -0.006096f, 0.046622f, 0.018480f, -0.007788f, 0.024759f, -0.010607f, -0.045153f, -0.033420f, 0.011344f, 0.001805f, -0.060329f, -0.016803f, -0.006158f, -0.031348f, 0.016116f, 0.009384f, -0.020359f, -0.016693f, -0.012289f, 0.001758f, 0.005568f, 0.012766f, -0.010575f, 0.001497f, 0.007475f, -0.003345f, -0.013396f, 0.003696f, 0.002834f, 0.004224f, 0.012568f, 0.002232f, -0.007621f, 0.001016f, 0.014561f, 0.012887f, 0.006292f, -0.014425f, -0.000289f, 0.026545f, -0.007548f, -0.005600f, 0.014759f, -0.014417f, -0.024929f, -0.007112f, 0.001399f, -0.003244f, -0.012777f, -0.003935f, -0.000736f, -0.014128f, -0.002892f, 0.001518f, -0.003880f, -0.014660f, + -0.024139f, 0.009203f, 0.026052f, 0.009420f, -0.000486f, 0.000953f, -0.004810f, -0.015374f, -0.012229f, 0.057072f, 0.063712f, 0.001445f, 0.046140f, 0.045971f, -0.001972f, 0.021016f, -0.045149f, -0.013576f, 0.040993f, 0.004444f, 0.040478f, 0.056485f, 0.046568f, -0.008647f, 0.030569f, -0.046213f, -0.072491f, -0.030632f, -0.026793f, 0.018218f, 0.000648f, 0.019453f, 0.020884f, 0.044636f, 0.034580f, 0.012515f, -0.034308f, -0.003590f, 0.035322f, 0.011855f, -0.016588f, 0.023057f, 0.048503f, -0.004747f, 0.017200f, -0.038513f, 0.019240f, -0.030261f, -0.007907f, -0.018968f, -0.040153f, 0.025578f, 0.003281f, 0.012818f, 0.049100f, -0.025637f, -0.029115f, 0.018224f, 0.050850f, -0.038935f, -0.026053f, 0.017053f, -0.012348f, 0.071859f, 0.053134f, -0.049422f, -0.018489f, -0.038929f, 0.002542f, 0.044104f, -0.019745f, -0.029498f, -0.013354f, 0.003335f, 0.010853f, -0.035438f, 0.009030f, 0.073239f, 0.005631f, -0.047853f, -0.073725f, 0.060454f, -0.071113f, -0.059332f, -0.034754f, -0.030020f, -0.051372f, 0.014465f, 0.013445f, 0.083766f, 0.021085f, 0.037175f, -0.018079f, 0.040369f, -0.004593f, -0.016392f, + 0.015263f, 0.002424f, -0.003594f, 0.041386f, 0.005423f, 0.021463f, 0.026180f, 0.014638f, 0.031336f, -0.008270f, 0.008606f, -0.006166f, -0.002347f, -0.006128f, -0.026024f, -0.018786f, -0.021471f, 0.025507f, 0.009028f, 0.022781f, 0.027613f, -0.005487f, 0.016589f, 0.036234f, 0.012945f, -0.010943f, 0.018486f, 0.021981f, 0.007435f, -0.004439f, -0.025795f, -0.022634f, 0.023179f, 0.010370f, 0.015428f, 0.031053f, 0.067668f, 0.029684f, 0.017085f, 0.013016f, 0.019151f, -0.009508f, -0.002257f, 0.034688f, -0.021943f, 0.012461f, -0.012192f, 0.011779f, 0.006858f, -0.066170f, -0.038364f, -0.049799f, 0.013034f, 0.027418f, 0.009592f, 0.042157f, 0.037876f, 0.053506f, 0.016541f, 0.058438f, 0.026046f, 0.037659f, -0.018715f, -0.007487f, -0.018801f, -0.045323f, -0.032534f, -0.070022f, -0.041567f, -0.013604f, -0.040833f, 0.008812f, -0.001687f, -0.001240f, 0.016596f, 0.013549f, 0.006255f, 0.033642f, -0.008580f, -0.028217f, 0.040403f, 0.003561f, -0.053624f, -0.023274f, -0.005853f, -0.064536f, -0.048903f, -0.047656f, 0.004341f, 0.022774f, 0.006176f, -0.024887f, -0.003164f, 0.026733f, 0.016529f, 0.063887f, + 0.011908f, -0.086319f, -0.028749f, -0.015066f, 0.013723f, 0.013283f, -0.009934f, -0.023019f, 0.031896f, -0.047883f, -0.008875f, -0.038423f, 0.028978f, -0.075352f, -0.046596f, -0.061480f, -0.049274f, 0.002198f, -0.027787f, -0.021607f, -0.049433f, 0.024717f, 0.088810f, -0.002445f, 0.057409f, -0.032004f, 0.014081f, -0.042315f, -0.000172f, 0.063113f, 0.015080f, -0.030049f, 0.003354f, 0.024205f, -0.042724f, -0.066323f, -0.035627f, 0.016778f, -0.051476f, 0.021974f, -0.000759f, -0.001574f, 0.033038f, 0.017103f, -0.008818f, 0.038196f, 0.038182f, 0.030503f, -0.010072f, -0.010689f, -0.006689f, -0.000597f, 0.026614f, 0.018991f, 0.013442f, 0.000542f, 0.027756f, 0.015249f, 0.004282f, 0.003512f, 0.020565f, -0.008698f, -0.007026f, 0.014183f, -0.021367f, 0.019190f, -0.018558f, -0.018402f, -0.021841f, 0.038160f, 0.023844f, 0.035466f, 0.013034f, 0.013302f, 0.003162f, 0.002389f, 0.017395f, -0.026799f, -0.042973f, 0.003278f, 0.012018f, 0.010651f, -0.017585f, 0.049191f, 0.020090f, 0.049624f, -0.081142f, 0.035119f, 0.060859f, -0.005982f, 0.070105f, -0.037249f, -0.107122f, -0.055461f, -0.000816f, -0.010742f, + 0.011745f, -0.038412f, 0.036927f, 0.052243f, -0.047170f, 0.041483f, -0.025877f, -0.031639f, -0.074831f, -0.030587f, -0.043037f, -0.028431f, -0.034440f, 0.033652f, 0.004951f, -0.067051f, -0.085850f, 0.064724f, 0.014578f, 0.023158f, -0.020136f, 0.005124f, -0.023293f, 0.000545f, 0.019627f, 0.029826f, 0.027020f, 0.072475f, 0.002251f, -0.052140f, 0.070294f, -0.007527f, -0.018358f, -0.032754f, 0.029625f, -0.057971f, -0.038952f, 0.032766f, -0.030182f, -0.045175f, -0.056661f, -0.049668f, -0.010661f, 0.006542f, 0.005295f, -0.015397f, 0.060955f, 0.051855f, -0.005075f, -0.029703f, -0.051085f, -0.058655f, 0.014396f, 0.012260f, -0.011579f, -0.005814f, 0.083706f, 0.005556f, -0.024490f, 0.036093f, 0.017335f, -0.055300f, 0.043880f, 0.079615f, -0.087446f, 0.141104f, 0.037688f, 0.040666f, 0.015441f, 0.040953f, -0.011246f, -0.087292f, 0.059688f, 0.004975f, -0.010861f, 0.061936f, -0.073642f, 0.012772f, 0.012917f, -0.000540f, -0.007135f, 0.002970f, -0.005766f, -0.020481f, 0.010847f, 0.021634f, -0.018148f, -0.002470f, -0.026836f, -0.030914f, 0.039889f, -0.008995f, -0.019599f, 0.008988f, -0.010695f, -0.024651f, + -0.044398f, -0.010383f, -0.015106f, 0.038656f, -0.037256f, -0.003964f, 0.045727f, -0.009901f, 0.036537f, -0.013284f, -0.031995f, 0.016398f, -0.006471f, -0.015441f, 0.018904f, 0.004215f, 0.050366f, -0.007012f, -0.000811f, 0.033184f, 0.101236f, 0.044476f, 0.002376f, -0.033871f, 0.048369f, -0.000786f, 0.003516f, -0.023195f, 0.044144f, -0.051172f, 0.037395f, 0.035938f, 0.037874f, 0.018333f, -0.013836f, 0.050198f, 0.062964f, -0.012811f, 0.026040f, -0.038982f, 0.063354f, 0.027049f, 0.021242f, -0.040339f, -0.088188f, 0.017622f, -0.026974f, -0.020123f, -0.035732f, -0.045084f, 0.027353f, 0.012285f, -0.021838f, 0.005098f, 0.002223f, -0.023791f, -0.107763f, -0.006675f, -0.022797f, -0.011007f, -0.001550f, 0.076081f, 0.052013f, -0.025289f, 0.019703f, -0.050025f, 0.005704f, 0.037548f, -0.057124f, -0.053035f, -0.043543f, 0.068881f, -0.049361f, 0.014379f, 0.055353f, -0.074426f, -0.069112f, 0.063804f, 0.050783f, 0.053571f, 0.071557f, 0.026504f, -0.091394f, 0.020698f, 0.027107f, -0.008019f, 0.149417f, -0.015381f, -0.022693f, -0.067435f, -0.058307f, 0.030177f, -0.053744f, 0.035133f, 0.012251f, 0.039730f, + 0.081854f, -0.052425f, -0.035780f, 0.099698f, -0.060662f, -0.066935f, 0.043807f, -0.086229f, 0.062780f, -0.065549f, 0.014963f, 0.022644f, -0.047519f, 0.019790f, -0.055171f, 0.038475f, 0.070372f, -0.002800f, 0.012202f, 0.014537f, 0.002595f, -0.021427f, -0.020297f, -0.004530f, 0.020373f, -0.009004f, 0.013731f, -0.014203f, -0.043686f, 0.018795f, 0.003813f, 0.029764f, 0.014656f, 0.026004f, -0.008896f, -0.008555f, -0.043345f, 0.030473f, -0.005915f, -0.039420f, 0.009162f, 0.081466f, 0.022426f, -0.020682f, 0.023839f, 0.043923f, -0.021806f, 0.004899f, 0.033504f, -0.016762f, 0.033400f, 0.011498f, -0.010621f, -0.052224f, 0.008771f, -0.019885f, -0.001396f, 0.065381f, -0.029963f, 0.003580f, -0.017374f, 0.022611f, 0.075136f, 0.006461f, -0.063727f, 0.091459f, 0.022366f, -0.005884f, 0.065259f, 0.032442f, 0.052837f, 0.019863f, -0.078024f, -0.017014f, -0.029031f, 0.037020f, 0.091399f, -0.057596f, 0.014968f, -0.027545f, 0.040848f, 0.046850f, -0.061263f, 0.051544f, -0.049152f, -0.044257f, 0.022878f, 0.042465f, 0.002075f, 0.014233f, 0.033202f, -0.049601f, 0.044257f, 0.003665f, 0.053952f, -0.009302f, + -0.013880f, 0.017721f, 0.079757f, -0.035448f, 0.064496f, -0.030837f, 0.013241f, 0.017025f, 0.064453f, -0.003532f, -0.003869f, 0.022319f, 0.096997f, 0.006619f, -0.075291f, -0.005892f, -0.090705f, 0.054907f, 0.000497f, 0.149447f, 0.032241f, -0.043359f, -0.012940f, 0.033244f, -0.032717f, 0.052660f, 0.097654f, 0.066927f, 0.001754f, 0.028597f, 0.042462f, -0.004535f, -0.045027f, -0.005959f, -0.010027f, -0.155478f, 0.097378f, 0.072719f, 0.067103f, 0.016403f, -0.067203f, -0.019930f, 0.051119f, 0.026612f, 0.044549f, 0.024137f, -0.148912f, -0.053071f, 0.091820f, 0.025427f, 0.029792f, 0.079115f, -0.055666f, -0.001598f, -0.007666f, 0.044901f, 0.011477f, -0.004207f, -0.012003f, 0.035425f, -0.009086f, -0.040504f, 0.020324f, -0.019444f, -0.023204f, 0.021306f, 0.031099f, -0.022720f, -0.007066f, -0.000657f, 0.024541f, -0.031132f, 0.025488f, -0.027485f, 0.013119f, -0.047639f, -0.048855f, 0.048688f, 0.006360f, 0.004452f, -0.005567f, -0.035155f, -0.010835f, 0.032663f, 0.003522f, 0.011213f, 0.054116f, -0.008204f, -0.041058f, -0.003780f, -0.023338f, 0.018637f, 0.020245f, -0.019372f, -0.016600f, 0.021526f, + 0.044788f, 0.056866f, 0.058635f, -0.036319f, 0.059662f, -0.054675f, 0.009160f, 0.028527f, -0.028133f, 0.003971f, 0.011169f, -0.014980f, -0.029378f, -0.055297f, 0.084112f, -0.018906f, -0.016648f, -0.028120f, -0.004784f, -0.011632f, 0.027290f, -0.056640f, -0.016400f, -0.035456f, 0.012081f, -0.035639f, 0.034105f, -0.000258f, 0.017535f, -0.039293f, -0.071635f, 0.003358f, -0.052385f, -0.054656f, 0.024667f, -0.041928f, -0.035554f, 0.069142f, -0.025677f, -0.040447f, 0.005096f, -0.041587f, 0.019427f, 0.026108f, -0.007694f, -0.033965f, -0.009994f, 0.019794f, 0.017341f, -0.015444f, -0.001545f, 0.060978f, -0.010949f, -0.037634f, -0.047883f, -0.006875f, -0.021037f, -0.071958f, 0.067440f, 0.023355f, -0.082710f, 0.050885f, -0.003758f, -0.034639f, 0.158828f, 0.089501f, 0.073089f, 0.038848f, 0.022251f, -0.037713f, 0.005801f, 0.017492f, 0.018648f, 0.007128f, 0.069502f, 0.015604f, -0.020720f, -0.034256f, -0.140651f, 0.028698f, 0.018396f, -0.000678f, -0.027510f, -0.052938f, -0.010541f, -0.034098f, -0.030616f, -0.002184f, 0.044315f, -0.030413f, 0.076717f, 0.011279f, -0.015393f, -0.005358f, -0.006609f, 0.006139f, + 0.032234f, -0.012515f, 0.008027f, 0.022705f, 0.007749f, 0.004394f, 0.017598f, -0.028612f, 0.013859f, 0.005202f, 0.044852f, -0.015572f, -0.011299f, -0.012318f, -0.011426f, -0.035618f, -0.019508f, 0.013067f, -0.039034f, 0.029108f, -0.007970f, -0.018529f, 0.026668f, 0.017080f, 0.022413f, -0.008327f, -0.003634f, 0.003071f, 0.004185f, -0.024531f, 0.012808f, 0.001860f, -0.001277f, -0.002113f, 0.015945f, -0.072755f, 0.122913f, 0.015708f, 0.040310f, 0.022007f, -0.030431f, 0.022903f, 0.034646f, 0.008685f, -0.003487f, -0.029635f, -0.005170f, 0.008450f, -0.013850f, -0.010476f, 0.005188f, 0.013872f, 0.035783f, -0.024679f, 0.015071f, 0.001540f, 0.028564f, -0.009988f, 0.005687f, 0.009491f, -0.032740f, 0.026745f, 0.004348f, 0.006698f, 0.009599f, 0.009949f, -0.020737f, 0.022249f, -0.017872f, 0.004646f, 0.021237f, -0.011437f, 0.020821f, -0.008864f, 0.026236f, 0.020446f, 0.011851f, -0.032380f, 0.024334f, 0.018581f, 0.014821f, 0.040627f, -0.038911f, -0.003283f, -0.000323f, -0.008156f, 0.011948f, -0.019993f, -0.032233f, 0.022267f, 0.025064f, 0.012688f, -0.003055f, 0.005454f, -0.003440f, 0.013162f, + -0.011288f, 0.005430f, -0.023933f, 0.021961f, -0.037176f, 0.035274f, 0.019622f, -0.011642f, -0.000498f, 0.014739f, 0.001061f, 0.013230f, 0.000283f, 0.001642f, -0.001231f, -0.012458f, 0.018046f, 0.024602f, -0.021540f, -0.004787f, 0.004525f, 0.013730f, -0.009779f, -0.010100f, 0.002863f, 0.004638f, -0.002441f, 0.002628f, -0.007914f, 0.003174f, 0.010068f, -0.007651f, 0.002154f, 0.006106f, -0.008112f, 0.007140f, 0.008819f, -0.000619f, -0.002834f, -0.004006f, 0.001720f, 0.018447f, -0.006870f, 0.002558f, -0.016945f, 0.001206f, 0.018810f, -0.013118f, 0.014002f, -0.006276f, 0.001065f, 0.031338f, -0.005461f, 0.000810f, -0.000658f, -0.009415f, 0.016127f, 0.006799f, 0.006926f, 0.006802f, -0.005096f, 0.004360f, 0.017662f, -0.004953f, 0.012025f, -0.007644f, -0.001341f, 0.023756f, -0.098022f, -0.228373f, -0.036483f, 0.133749f, 0.121408f, 0.298934f, 0.156115f, -0.080359f, -0.024674f, -0.165421f, -0.280894f, -0.019319f, -0.127634f, -0.017713f, 0.204734f, 0.087490f, 0.158184f, 0.242853f, -0.028209f, -0.035491f, -0.123282f, -0.209626f, -0.166691f, -0.010673f, -0.062611f, -0.023665f, 0.174255f, 0.055321f, + 0.113363f, 0.206015f, 0.033779f, -0.000770f, 0.021360f, -0.125196f, -0.189621f, 0.032654f, -0.195945f, -0.128150f, 0.043544f, -0.019646f, 0.031904f, 0.252302f, 0.028987f, 0.096757f, 0.206007f, -0.040979f, 0.006438f, 0.045979f, -0.198513f, -0.165536f, -0.058633f, -0.225936f, -0.087478f, 0.028842f, 0.041855f, 0.155688f, 0.219280f, 0.156312f, 0.110359f, 0.096142f, -0.036464f, -0.132343f, -0.108651f, -0.163630f, -0.171894f, -0.073681f, -0.043512f, 0.001174f, 0.144373f, 0.172180f, 0.053967f, 0.134548f, 0.039311f, -0.042576f, 0.028385f, -0.093751f, -0.130272f, -0.025498f, -0.060470f, -0.040512f, 0.073566f, -0.002720f, 0.051333f, 0.091401f, -0.024989f, -0.002011f, 0.000097f, -0.046268f, -0.014149f, -0.003192f, -0.034591f, 0.038708f, 0.014139f, -0.009021f, 0.063356f, 0.020166f, -0.008949f, 0.060770f, -0.021233f, -0.065143f, 0.001412f, -0.099512f, -0.069517f, 0.021490f, -0.066077f, 0.014142f, 0.076845f, 0.056360f, 0.104703f, 0.114014f, 0.041673f, 0.040296f, -0.004644f, -0.094051f, -0.131264f, -0.135253f, -0.141089f, -0.089798f, -0.006609f, 0.045282f, 0.097707f, 0.169365f, 0.181935f, 0.150873f, + 0.118291f, -0.007121f, -0.110893f, -0.159294f, -0.203409f, -0.207742f, -0.110578f, -0.033492f, 0.087098f, 0.183754f, 0.166693f, 0.100271f, 0.074533f, 0.021533f, -0.015302f, -0.025049f, -0.073147f, -0.084946f, -0.063512f, -0.053518f, -0.038027f, -0.008131f, 0.007888f, 0.030157f, 0.045588f, 0.045935f, 0.044563f, 0.039099f, 0.018218f, -0.002570f, -0.014058f, -0.013683f, -0.009907f, -0.005530f, -0.004375f} + }, + { + {-0.008213f, 0.008653f, 0.002179f, -0.004681f, -0.002074f, -0.010448f, -0.002783f, 0.008781f, -0.004618f, -0.003361f, 0.002718f, -0.001348f, -0.000311f, 0.000574f, -0.002777f, -0.002226f, 0.010643f, 0.005189f, -0.001274f, 0.000542f, -0.001561f, -0.003149f, 0.001483f, 0.003820f, 0.005866f, -0.001469f, 0.002256f, 0.002723f, -0.009384f, -0.002860f, 0.000002f, -0.001843f, 0.005789f, 0.000549f, -0.001959f, 0.005216f, -0.003939f, 0.001779f, 0.008079f, -0.004446f, 0.000532f, 0.001103f, 0.006138f, -0.002334f, 0.008458f, -0.011941f, -0.004347f, 0.005229f, -0.002354f, -0.010118f, 0.000744f, 0.002059f, 0.003393f, 0.003491f, -0.001081f, -0.004348f, 0.000391f, -0.003944f, -0.002681f, 0.001200f, 0.005035f, 0.004640f, -0.006745f, 0.005965f, -0.007383f, 0.006623f, 0.000390f, 0.005808f, -0.002244f, -0.004785f, -0.002113f, 0.003908f, -0.000741f, -0.000974f, -0.001162f, 0.005407f, -0.005806f, 0.003000f, 0.001431f, 0.001460f, 0.001854f, 0.004325f, 0.001388f, -0.002775f, -0.003133f, -0.001733f, 0.002357f, -0.000508f, -0.002299f, 0.000444f, -0.002777f, -0.000615f, -0.000190f, -0.002842f, -0.001132f, -0.001602f, + 0.000378f, 0.001530f, -0.001915f, -0.001380f, 0.000797f, -0.000394f, -0.002741f, -0.000029f, 0.001498f, -0.001069f, -0.000136f, 0.000559f, -0.000253f, 0.001074f, 0.000784f, 0.000078f, -0.002071f, -0.000696f, 0.000078f, -0.000942f, 0.000057f, -0.000232f, -0.001451f, 0.000813f, -0.002460f, -0.028477f, 0.009350f, -0.010351f, -0.004124f, -0.008475f, -0.008702f, 0.004948f, -0.002902f, -0.007348f, -0.003948f, 0.009996f, 0.014856f, -0.008124f, -0.003024f, -0.000721f, -0.010699f, -0.010053f, 0.000754f, -0.001016f, 0.006537f, 0.002203f, 0.004869f, -0.004288f, -0.002685f, -0.005556f, 0.001566f, 0.009589f, 0.004163f, 0.001865f, -0.006182f, 0.004689f, 0.001418f, 0.002870f, -0.004035f, 0.000358f, 0.001417f, 0.002155f, -0.005483f, -0.004010f, 0.001501f, -0.007569f, -0.007738f, 0.003321f, 0.005870f, -0.006598f, -0.003320f, -0.002543f, 0.000475f, 0.005852f, 0.004718f, 0.002042f, 0.000890f, 0.015134f, 0.005943f, -0.004779f, 0.005893f, 0.004198f, -0.004205f, 0.007150f, -0.002664f, -0.001793f, -0.000040f, -0.003117f, 0.006354f, -0.003577f, 0.001669f, 0.003830f, 0.003069f, -0.005655f, 0.002228f, 0.001056f, + 0.001145f, -0.001978f, -0.002804f, -0.001178f, 0.008876f, 0.000591f, -0.002631f, -0.001903f, 0.002095f, -0.007987f, 0.001547f, 0.004756f, -0.000309f, 0.003079f, -0.001759f, -0.002878f, 0.001930f, 0.001759f, -0.000745f, 0.002993f, 0.001542f, -0.000854f, 0.002124f, 0.002224f, 0.003719f, 0.000484f, 0.000013f, -0.000263f, -0.001119f, -0.001582f, -0.000160f, -0.000284f, -0.000990f, 0.001095f, -0.000352f, 0.003707f, 0.021669f, 0.008636f, -0.001513f, 0.000978f, 0.004964f, 0.002592f, -0.001469f, -0.009370f, 0.000300f, 0.008305f, -0.008527f, -0.000957f, -0.016001f, 0.004195f, 0.006513f, 0.000430f, -0.003814f, 0.011691f, 0.008220f, -0.007542f, 0.003640f, 0.000438f, -0.006612f, 0.010432f, 0.005751f, -0.000685f, 0.004212f, 0.009940f, -0.003086f, -0.002060f, 0.000662f, 0.000054f, 0.000235f, 0.002383f, 0.012209f, 0.002454f, 0.001820f, -0.019749f, -0.001047f, 0.000894f, 0.002356f, -0.008940f, 0.002065f, -0.007212f, -0.005535f, -0.007628f, -0.004984f, 0.000040f, 0.002290f, -0.004663f, 0.004653f, -0.011349f, -0.006519f, -0.000698f, -0.000154f, 0.003633f, -0.004549f, -0.001064f, -0.004120f, 0.002458f, + 0.006140f, -0.003721f, 0.000656f, -0.003222f, -0.000589f, 0.009519f, 0.007457f, -0.003014f, 0.006988f, -0.003356f, -0.005965f, -0.007453f, -0.000563f, -0.000697f, -0.005027f, 0.004534f, -0.000802f, 0.001290f, -0.000561f, -0.001660f, 0.000337f, -0.001075f, -0.004076f, -0.000263f, -0.006493f, 0.000729f, -0.003200f, -0.002092f, -0.005455f, 0.006320f, -0.001943f, 0.002152f, 0.004317f, 0.001709f, -0.002204f, -0.000514f, -0.002474f, -0.000184f, 0.001086f, -0.002434f, 0.002508f, -0.000208f, 0.000272f, 0.000359f, -0.000896f, 0.001473f, 0.000854f, 0.000462f, 0.000185f, 0.003573f, 0.001716f, -0.001154f, -0.002438f, -0.002223f, 0.002159f, 0.002907f, -0.000011f, 0.000740f, 0.034212f, -0.014876f, 0.002820f, -0.001243f, -0.006304f, 0.005442f, 0.009595f, -0.006218f, 0.010315f, -0.000558f, 0.011002f, 0.003057f, 0.003888f, -0.004730f, 0.006239f, 0.002419f, 0.006389f, -0.013449f, 0.007216f, -0.007948f, 0.002497f, -0.006674f, 0.008450f, -0.002295f, 0.008512f, -0.004989f, 0.003137f, -0.003266f, -0.000732f, -0.000365f, -0.000852f, 0.003355f, 0.017682f, 0.000794f, 0.005196f, -0.004880f, -0.008188f, 0.000359f, + 0.000165f, 0.000360f, 0.002697f, -0.005665f, 0.011601f, -0.000722f, 0.009726f, 0.000692f, -0.004197f, -0.005301f, -0.014575f, 0.007180f, 0.004757f, -0.006802f, 0.000767f, 0.005861f, 0.003112f, -0.016966f, 0.010150f, -0.000554f, 0.007218f, -0.010182f, -0.010977f, -0.005311f, -0.010692f, -0.001943f, 0.012373f, 0.002594f, -0.004732f, 0.000761f, 0.007002f, -0.002330f, -0.005608f, -0.002893f, -0.006290f, 0.004533f, -0.009540f, -0.001656f, -0.007318f, -0.002772f, -0.000027f, 0.008240f, 0.003868f, 0.000931f, 0.002571f, 0.010340f, 0.005426f, 0.001295f, 0.003778f, -0.002879f, -0.001140f, 0.000726f, 0.000198f, 0.001686f, 0.000870f, -0.001738f, 0.001018f, 0.003678f, -0.000244f, 0.000828f, 0.001366f, -0.001714f, -0.002371f, 0.002327f, -0.002838f, 0.003430f, 0.002011f, 0.003183f, 0.000085f, -0.001151f, 0.001937f, 0.003154f, 0.000823f, -0.001239f, 0.001026f, 0.008943f, -0.020976f, 0.004275f, -0.006614f, -0.019166f, -0.014773f, 0.007853f, 0.008759f, 0.011527f, -0.005706f, -0.002966f, 0.007936f, 0.003792f, 0.011860f, 0.003862f, -0.001323f, 0.001213f, 0.007570f, 0.014749f, -0.003776f, 0.004299f, + -0.000180f, 0.011951f, 0.002750f, -0.000731f, -0.002396f, -0.009120f, -0.013866f, 0.000150f, -0.001993f, 0.004168f, -0.000784f, 0.003265f, 0.002431f, 0.000846f, 0.000891f, 0.002761f, -0.004733f, 0.000531f, 0.006596f, 0.010316f, -0.005046f, 0.001226f, -0.004447f, -0.005927f, 0.008525f, -0.006541f, -0.016287f, -0.006405f, -0.004170f, 0.007827f, 0.000656f, 0.008636f, 0.007898f, -0.004184f, 0.000351f, -0.006759f, -0.000938f, -0.002902f, 0.010116f, -0.012737f, -0.000366f, 0.004293f, -0.013486f, -0.015182f, 0.000237f, 0.004692f, 0.009618f, -0.006703f, -0.016058f, 0.008385f, -0.014816f, 0.017329f, 0.009796f, 0.002853f, 0.007391f, -0.000174f, -0.007131f, 0.022028f, -0.002000f, 0.010662f, -0.000403f, 0.015409f, 0.010598f, 0.005634f, -0.001565f, -0.003003f, -0.005164f, -0.001903f, 0.002335f, 0.000560f, 0.004264f, -0.004355f, 0.002660f, -0.002313f, -0.001571f, -0.001635f, -0.001774f, 0.002093f, -0.001101f, -0.000036f, -0.003256f, -0.000148f, 0.002025f, 0.003718f, -0.003725f, -0.004564f, 0.000655f, 0.002023f, -0.000019f, 0.002432f, -0.001352f, 0.000288f, -0.001776f, -0.000575f, 0.001273f, 0.002299f, + 0.002830f, 0.001689f, -0.002205f, -0.046420f, 0.009548f, 0.002333f, -0.023320f, -0.029428f, -0.004744f, -0.022723f, 0.018448f, 0.005272f, -0.013704f, 0.000841f, -0.006385f, 0.002038f, -0.009361f, 0.001182f, -0.000548f, 0.000093f, 0.013001f, -0.004667f, -0.003048f, -0.005444f, -0.004802f, -0.012291f, -0.008242f, 0.012299f, -0.005098f, 0.007771f, -0.006870f, 0.003353f, 0.000195f, 0.007019f, -0.007173f, 0.005312f, -0.007205f, 0.003121f, -0.002764f, -0.004508f, 0.004445f, -0.011493f, 0.004400f, -0.005860f, -0.002109f, -0.008359f, 0.020149f, 0.009578f, 0.017666f, -0.007552f, 0.007447f, 0.005982f, -0.003515f, 0.003129f, -0.008375f, 0.008865f, 0.019375f, 0.015306f, -0.010675f, -0.002874f, 0.004538f, -0.007741f, -0.005192f, -0.013542f, -0.025317f, -0.008601f, 0.012982f, 0.004657f, -0.006247f, 0.002557f, 0.001333f, -0.006910f, -0.012024f, -0.012149f, 0.008633f, 0.000996f, -0.018606f, 0.001971f, 0.001801f, -0.000919f, -0.001387f, 0.006168f, 0.013499f, -0.001380f, -0.000009f, 0.001885f, -0.000007f, -0.003551f, -0.012297f, 0.004071f, 0.004154f, 0.002530f, 0.005756f, 0.003480f, -0.005257f, 0.001357f, + -0.003307f, 0.000687f, -0.002795f, -0.001130f, -0.003093f, 0.000080f, 0.000706f, -0.000372f, -0.002236f, -0.002181f, -0.000651f, 0.000960f, -0.000063f, 0.004524f, 0.001627f, 0.004223f, 0.004579f, 0.004949f, -0.005918f, -0.006017f, -0.002246f, 0.004546f, -0.001534f, 0.001670f, -0.001762f, 0.002512f, 0.002643f, 0.001702f, -0.002878f, -0.001628f, -0.018169f, -0.007565f, -0.004712f, 0.013745f, -0.003614f, 0.003276f, -0.014151f, -0.014768f, 0.000757f, 0.004305f, -0.008630f, -0.004940f, -0.008095f, 0.016843f, 0.003741f, -0.005618f, -0.012244f, -0.012092f, -0.011810f, -0.003272f, 0.005730f, 0.016919f, 0.005523f, 0.009572f, -0.007542f, 0.018017f, 0.010321f, 0.003338f, 0.000251f, 0.018530f, -0.010762f, 0.001791f, 0.005912f, 0.012555f, -0.020211f, -0.010280f, 0.008898f, 0.003599f, -0.002739f, 0.021163f, -0.009173f, 0.006019f, 0.012805f, 0.004006f, 0.002209f, 0.009355f, 0.003853f, 0.004681f, 0.004814f, 0.002071f, 0.005538f, -0.000259f, 0.008126f, -0.001814f, 0.019816f, -0.014298f, 0.016323f, 0.012964f, -0.011166f, 0.012839f, 0.002445f, 0.010921f, 0.011078f, -0.024079f, -0.000554f, -0.000914f, + -0.007181f, 0.003913f, -0.006468f, 0.006743f, -0.002652f, 0.015440f, -0.001587f, 0.002468f, 0.006401f, 0.004374f, 0.006200f, -0.009766f, -0.003199f, -0.009982f, -0.009195f, -0.005285f, 0.015038f, 0.002276f, -0.004658f, 0.004456f, 0.004222f, 0.001944f, -0.002414f, 0.001597f, -0.001675f, 0.005927f, 0.002343f, 0.001907f, -0.002737f, 0.001851f, -0.005495f, -0.000482f, 0.006639f, 0.003433f, -0.000941f, 0.002202f, 0.002431f, -0.001794f, 0.002871f, 0.001881f, 0.006449f, 0.003515f, -0.003398f, -0.001370f, -0.001965f, 0.001959f, -0.005501f, 0.001668f, 0.024269f, -0.006304f, -0.003663f, -0.005841f, 0.017309f, 0.009130f, 0.001927f, 0.006658f, -0.011562f, 0.025843f, 0.008617f, -0.001945f, 0.009807f, 0.012529f, -0.020943f, -0.001322f, 0.005061f, 0.002549f, 0.000054f, 0.017884f, -0.008474f, -0.010716f, 0.024571f, 0.003791f, -0.001657f, -0.002345f, 0.012878f, 0.001071f, -0.001779f, -0.002312f, -0.005866f, 0.006473f, -0.003608f, 0.008604f, 0.006067f, -0.015338f, -0.014544f, 0.001926f, 0.028984f, -0.000251f, 0.005977f, -0.017739f, 0.008879f, 0.011966f, -0.007305f, 0.008896f, 0.010996f, -0.017986f, + -0.010966f, -0.002177f, -0.023090f, -0.012198f, -0.013754f, 0.004161f, -0.004670f, -0.005042f, -0.002475f, 0.016384f, -0.022267f, 0.009963f, 0.004920f, -0.007151f, 0.013701f, -0.008633f, 0.001374f, -0.018665f, -0.000330f, 0.011438f, 0.010253f, 0.021447f, -0.025173f, -0.006177f, -0.027956f, -0.005919f, -0.000514f, -0.006573f, 0.003194f, -0.001278f, 0.025535f, 0.019878f, 0.011247f, -0.012594f, 0.000694f, 0.004979f, 0.012463f, 0.015382f, -0.000313f, 0.000158f, -0.002143f, 0.000415f, 0.008725f, -0.000332f, -0.000724f, -0.000261f, 0.000181f, 0.000528f, 0.001079f, 0.003620f, -0.003570f, -0.001039f, 0.003652f, 0.000698f, 0.003374f, -0.000027f, 0.000384f, -0.002839f, 0.004620f, 0.002937f, 0.000064f, 0.004427f, -0.002197f, -0.000185f, 0.004046f, 0.001178f, -0.000698f, -0.004929f, -0.000346f, 0.001226f, 0.000719f, -0.001698f, 0.005173f, 0.008792f, -0.001605f, -0.000146f, -0.003942f, 0.002972f, 0.016591f, -0.018419f, 0.000704f, -0.011251f, 0.031791f, -0.013302f, -0.007602f, 0.027574f, 0.020810f, 0.003937f, -0.038225f, -0.009243f, 0.017725f, 0.001531f, -0.001746f, -0.005354f, -0.002924f, -0.002884f, + 0.002772f, 0.006041f, 0.005508f, 0.005256f, 0.034047f, -0.006977f, -0.004834f, 0.000137f, 0.004525f, -0.010010f, 0.006058f, 0.003717f, -0.001178f, -0.011026f, -0.006914f, 0.012378f, 0.013218f, 0.024975f, 0.006442f, -0.010112f, 0.006367f, -0.000200f, 0.006451f, 0.000585f, 0.013876f, -0.011369f, -0.017063f, -0.017548f, 0.011652f, -0.004913f, 0.002498f, 0.004729f, -0.006238f, -0.001045f, 0.029582f, 0.010204f, -0.024812f, 0.017831f, 0.005732f, 0.030004f, -0.015462f, -0.014517f, 0.008720f, 0.016213f, 0.011188f, 0.006325f, -0.002673f, 0.001068f, 0.007763f, -0.009605f, -0.002720f, 0.000450f, 0.012761f, -0.009067f, 0.025561f, -0.000790f, -0.000275f, -0.013047f, -0.014782f, 0.029273f, 0.008738f, -0.023785f, -0.005523f, 0.020219f, 0.014004f, 0.002910f, 0.005118f, -0.012042f, 0.003884f, 0.003378f, 0.003990f, 0.002363f, 0.004421f, -0.005461f, -0.006733f, 0.001050f, -0.000138f, -0.005469f, -0.001792f, 0.005366f, 0.005195f, -0.007357f, 0.002054f, 0.000148f, 0.003343f, 0.004655f, -0.001182f, -0.001154f, -0.001781f, 0.003200f, 0.009031f, -0.006318f, 0.005006f, -0.000246f, 0.000285f, -0.003627f, + -0.000821f, -0.002652f, -0.001851f, 0.004477f, -0.001421f, -0.002312f, -0.005757f, -0.000013f, -0.003233f, -0.022948f, -0.019502f, -0.007727f, 0.006834f, 0.007009f, 0.034869f, 0.033825f, -0.004170f, 0.002513f, 0.001304f, 0.000018f, -0.000587f, -0.007287f, -0.023058f, -0.017783f, -0.009252f, 0.007841f, -0.006569f, -0.020144f, -0.005826f, 0.003519f, -0.001665f, -0.030751f, -0.009149f, 0.006485f, -0.003304f, 0.002617f, 0.001923f, 0.008890f, 0.013243f, 0.001896f, -0.009906f, 0.009618f, 0.010137f, 0.006967f, -0.000576f, 0.013074f, -0.026906f, 0.008671f, -0.023856f, 0.029235f, -0.021116f, 0.007773f, -0.022391f, -0.003985f, -0.024995f, -0.013429f, -0.015634f, -0.017056f, 0.011338f, -0.015038f, -0.002992f, 0.004873f, -0.000332f, -0.008166f, -0.005798f, -0.002893f, -0.024433f, 0.000480f, 0.001454f, 0.011732f, -0.038059f, 0.000573f, -0.001116f, 0.017366f, 0.021138f, -0.014769f, -0.008996f, 0.000473f, 0.016216f, -0.031695f, 0.019975f, -0.014440f, -0.009446f, 0.001192f, -0.030633f, -0.001925f, -0.002584f, -0.005126f, -0.005570f, -0.004168f, 0.030491f, 0.012122f, 0.006179f, -0.007695f, -0.006983f, -0.008038f, + 0.000854f, 0.007137f, -0.012360f, -0.000714f, -0.002234f, -0.003683f, 0.001540f, 0.008653f, -0.003464f, -0.006190f, 0.005632f, 0.003113f, -0.000210f, 0.005949f, 0.003352f, 0.004916f, -0.003318f, -0.004527f, 0.007624f, -0.005979f, 0.001911f, -0.007715f, -0.001462f, -0.000099f, -0.001543f, -0.003198f, -0.006499f, -0.007524f, -0.007569f, 0.001378f, -0.000456f, -0.002087f, -0.005462f, -0.005580f, -0.002131f, -0.003163f, 0.001664f, 0.007185f, 0.005527f, -0.018172f, -0.047108f, -0.018915f, -0.009086f, 0.008019f, 0.012537f, -0.015574f, -0.005977f, -0.019551f, -0.017244f, 0.008841f, -0.015167f, 0.015296f, 0.006159f, 0.010932f, -0.002000f, -0.015435f, 0.026487f, 0.010384f, 0.014768f, -0.019250f, 0.007924f, 0.003265f, -0.027905f, 0.016938f, 0.010119f, 0.000794f, -0.019052f, -0.007504f, 0.009155f, 0.009652f, -0.000622f, 0.003169f, 0.013286f, -0.013429f, -0.009916f, 0.015601f, -0.031781f, -0.031431f, -0.041140f, -0.009468f, 0.012980f, -0.036233f, -0.030194f, -0.018489f, 0.000406f, 0.012646f, 0.003930f, 0.003352f, 0.000426f, -0.010705f, -0.014543f, -0.034257f, 0.017721f, 0.004746f, 0.040957f, -0.010160f, + 0.000883f, -0.025803f, -0.030670f, 0.003546f, 0.019483f, 0.001025f, -0.019425f, 0.012355f, 0.004945f, 0.027720f, 0.002557f, 0.003186f, -0.013779f, -0.002927f, 0.011699f, -0.027878f, -0.051618f, -0.014693f, -0.013037f, 0.002414f, 0.013324f, -0.024990f, -0.012657f, 0.007669f, -0.008792f, -0.002367f, 0.007861f, -0.005133f, -0.004313f, 0.010209f, 0.002434f, -0.001334f, 0.005049f, 0.007838f, 0.009019f, 0.001366f, -0.006316f, -0.016746f, -0.001649f, -0.010377f, 0.002561f, 0.001407f, 0.001952f, 0.006369f, -0.005991f, 0.005748f, 0.008303f, 0.005219f, 0.004653f, 0.004303f, -0.012229f, -0.011528f, -0.004305f, -0.009995f, 0.000972f, 0.002288f, 0.003130f, 0.010915f, -0.002745f, 0.006771f, 0.004368f, -0.005237f, -0.002535f, -0.007423f, -0.009450f, -0.003028f, -0.012428f, -0.004504f, -0.002822f, -0.043973f, -0.033799f, -0.015555f, 0.023192f, -0.002035f, 0.039720f, 0.007843f, -0.003460f, -0.022312f, 0.007918f, 0.040939f, -0.042886f, -0.038590f, -0.012778f, -0.006417f, -0.026913f, 0.025469f, 0.007423f, 0.013803f, 0.016443f, -0.026919f, -0.003254f, 0.010814f, -0.017019f, 0.031775f, 0.000406f, 0.007161f, + -0.009313f, 0.007860f, -0.021062f, -0.011952f, -0.007293f, 0.011972f, 0.005588f, 0.019340f, -0.031740f, 0.002869f, -0.000340f, -0.023547f, 0.025647f, -0.015354f, -0.037765f, 0.007489f, 0.013455f, 0.002789f, -0.011369f, -0.002682f, -0.015810f, 0.002646f, 0.012698f, 0.005518f, -0.025879f, 0.010148f, -0.006011f, -0.028522f, -0.017051f, -0.035053f, 0.000624f, -0.005392f, -0.001098f, 0.004640f, 0.021381f, 0.026872f, 0.022104f, -0.011306f, -0.019617f, 0.006523f, -0.005136f, -0.003172f, -0.015220f, 0.027979f, 0.022828f, -0.004833f, 0.042590f, -0.027182f, 0.014053f, 0.027119f, 0.028833f, 0.000919f, 0.018242f, -0.011819f, -0.004956f, -0.023814f, -0.010386f, 0.014483f, -0.005131f, -0.018504f, 0.011382f, -0.010527f, 0.011966f, -0.005285f, -0.013010f, 0.006836f, -0.002802f, -0.007100f, -0.005836f, 0.005083f, -0.006485f, 0.004468f, 0.008336f, -0.008850f, 0.011404f, -0.001209f, -0.006665f, 0.004597f, 0.001101f, 0.001002f, -0.005603f, 0.007095f, -0.010718f, 0.003818f, 0.003592f, 0.000718f, -0.007273f, -0.000437f, -0.004457f, 0.005595f, 0.009338f, 0.021284f, 0.010289f, 0.017078f, -0.001200f, 0.000191f, + 0.008255f, -0.010330f, 0.002519f, -0.014133f, -0.006259f, 0.016024f, -0.038125f, 0.004795f, 0.000411f, -0.024113f, 0.003472f, -0.053606f, -0.046378f, -0.011120f, -0.000448f, 0.001972f, -0.001209f, -0.019073f, -0.000712f, -0.005471f, 0.017092f, 0.003322f, -0.001127f, 0.003195f, -0.040526f, 0.013973f, 0.007503f, 0.022448f, 0.009273f, 0.009713f, 0.026342f, 0.013127f, 0.003768f, 0.066016f, 0.014071f, 0.025388f, 0.034984f, 0.001621f, 0.024655f, 0.006175f, -0.013784f, 0.016029f, 0.001075f, 0.007709f, -0.013505f, 0.000987f, -0.008787f, 0.005585f, -0.008762f, 0.018560f, 0.002167f, -0.011572f, -0.014516f, 0.001974f, -0.039259f, 0.022763f, 0.015290f, -0.002011f, -0.003629f, 0.008939f, -0.010499f, -0.008656f, -0.012942f, -0.015533f, 0.012865f, -0.012394f, 0.021314f, 0.024897f, 0.024316f, 0.025952f, -0.006124f, -0.039357f, 0.000529f, 0.016596f, 0.039579f, -0.009218f, -0.001568f, 0.018788f, 0.027606f, 0.040821f, -0.005407f, 0.017977f, -0.012200f, -0.007016f, -0.032928f, -0.025599f, -0.011307f, -0.011625f, -0.009498f, 0.006837f, 0.001291f, -0.014084f, 0.015802f, 0.010043f, 0.012384f, 0.022442f, + 0.008843f, 0.008403f, -0.002828f, 0.000013f, -0.003476f, -0.006442f, 0.000033f, 0.004037f, -0.000144f, 0.011835f, 0.009299f, 0.005777f, -0.000852f, -0.009735f, 0.000382f, -0.006998f, -0.007924f, 0.004926f, 0.005813f, 0.001782f, -0.012316f, -0.002749f, -0.017825f, -0.004313f, 0.005527f, 0.008697f, -0.005876f, 0.007223f, -0.010311f, -0.011740f, -0.006178f, -0.007095f, 0.006248f, 0.003348f, -0.010580f, -0.007126f, 0.032425f, 0.042056f, -0.031104f, -0.032553f, -0.043040f, 0.039038f, -0.003932f, -0.015536f, 0.013670f, 0.013244f, 0.036568f, 0.030522f, 0.002186f, 0.033452f, 0.047452f, 0.013688f, -0.023803f, 0.022899f, -0.022007f, -0.012174f, -0.004342f, -0.015274f, -0.018425f, 0.010011f, -0.009155f, -0.008960f, -0.022281f, 0.051707f, 0.006728f, -0.027010f, 0.000303f, -0.003361f, 0.023327f, 0.024683f, 0.009921f, -0.015648f, 0.024868f, -0.006295f, 0.015480f, -0.046625f, 0.002803f, 0.019918f, -0.019825f, 0.007141f, -0.021570f, -0.017476f, 0.048875f, 0.020552f, 0.014988f, -0.002992f, -0.042639f, -0.010044f, 0.012802f, 0.009670f, 0.007317f, -0.009787f, 0.034571f, -0.023640f, 0.019373f, -0.010889f, + 0.012940f, 0.014271f, 0.027470f, 0.037039f, -0.042167f, -0.000696f, 0.022239f, 0.011041f, 0.031110f, 0.030221f, -0.042042f, 0.000536f, -0.011365f, -0.021564f, -0.001004f, -0.022570f, 0.009837f, 0.018029f, -0.008194f, 0.032322f, -0.006805f, -0.018643f, -0.022761f, 0.020280f, 0.023177f, 0.023109f, -0.005862f, 0.004372f, -0.000942f, -0.032513f, -0.031490f, -0.029474f, 0.018881f, 0.009724f, 0.006282f, 0.015286f, -0.000624f, -0.007915f, 0.022854f, 0.003498f, 0.000218f, 0.014181f, 0.022153f, 0.013592f, 0.002009f, 0.002792f, -0.006094f, 0.013646f, 0.006967f, 0.028274f, -0.002262f, 0.003772f, 0.019951f, 0.016287f, 0.005820f, -0.002381f, 0.012888f, -0.000007f, -0.002238f, 0.022412f, -0.017284f, 0.001336f, 0.013957f, 0.001471f, -0.003715f, -0.006241f, -0.002998f, 0.000349f, 0.015057f, 0.003161f, 0.001436f, 0.016575f, 0.012185f, -0.010032f, 0.032171f, 0.064487f, 0.002385f, -0.031390f, 0.008367f, -0.021120f, 0.013029f, -0.018405f, -0.019817f, 0.058520f, -0.045108f, 0.073576f, 0.044905f, -0.011280f, 0.014521f, 0.035377f, 0.004799f, -0.056100f, 0.021520f, -0.045491f, 0.010373f, 0.003697f, + -0.022681f, 0.000639f, -0.003417f, 0.031947f, -0.016516f, -0.001919f, -0.001622f, -0.010110f, 0.067770f, -0.004201f, -0.010626f, 0.008504f, 0.022567f, -0.023497f, -0.049433f, 0.038440f, -0.006585f, -0.003215f, 0.043722f, -0.026192f, -0.007577f, -0.031130f, 0.007861f, -0.021821f, 0.024512f, 0.022756f, 0.046544f, -0.013674f, 0.012713f, 0.031161f, -0.044928f, 0.005259f, -0.028781f, -0.044988f, -0.057682f, -0.030308f, -0.062338f, -0.069809f, -0.010171f, 0.004341f, -0.033202f, -0.035421f, 0.021404f, -0.002623f, -0.020220f, -0.038158f, 0.026986f, -0.020443f, 0.006692f, 0.034362f, -0.065461f, -0.018879f, -0.012405f, 0.028747f, 0.077286f, -0.036891f, 0.001796f, -0.023445f, -0.034974f, 0.016650f, -0.041766f, 0.033194f, 0.057468f, -0.016592f, -0.027561f, -0.028752f, -0.007737f, -0.006906f, 0.000058f, 0.018772f, 0.013325f, -0.015287f, 0.014840f, -0.001936f, 0.011559f, 0.000696f, -0.014584f, -0.003994f, 0.016454f, -0.028155f, 0.012700f, -0.014731f, 0.003343f, -0.011977f, -0.005174f, -0.016907f, 0.003306f, -0.016236f, -0.025906f, -0.012110f, 0.005424f, -0.018714f, -0.000624f, 0.005789f, 0.027199f, -0.015928f, + -0.009976f, 0.009280f, 0.010843f, -0.019907f, -0.013135f, 0.005888f, -0.006078f, -0.010502f, 0.018762f, 0.003619f, -0.015811f, 0.013788f, 0.003188f, -0.023177f, 0.003942f, -0.019055f, 0.020803f, -0.009511f, -0.030229f, -0.044698f, -0.033910f, 0.037338f, -0.030712f, 0.015013f, 0.035578f, 0.015116f, 0.022828f, -0.042643f, 0.061090f, 0.038339f, 0.033296f, -0.024734f, 0.043774f, -0.004947f, 0.028935f, 0.018897f, 0.006400f, 0.015647f, 0.021235f, 0.012798f, -0.007182f, -0.011070f, -0.009790f, 0.004242f, -0.029487f, -0.034923f, 0.019523f, 0.008444f, 0.011326f, -0.028772f, 0.007770f, 0.008497f, 0.021387f, 0.031690f, 0.047976f, -0.027326f, 0.007254f, 0.068045f, 0.014718f, 0.007087f, 0.006596f, -0.014317f, 0.005010f, 0.067729f, 0.019723f, 0.043772f, 0.012555f, -0.047389f, -0.019623f, -0.034593f, 0.098716f, 0.039816f, -0.038148f, -0.024200f, -0.034022f, 0.005442f, -0.022323f, -0.053959f, 0.012326f, -0.040954f, 0.060451f, -0.004587f, -0.050029f, 0.065518f, 0.053415f, 0.007258f, -0.014513f, 0.008636f, -0.030446f, 0.040188f, 0.072503f, -0.019793f, 0.034391f, 0.080655f, -0.012753f, -0.013611f, + -0.009225f, 0.048922f, -0.003578f, -0.027691f, -0.025578f, -0.026478f, -0.000428f, -0.003681f, -0.022664f, 0.001320f, -0.009497f, 0.024371f, 0.006212f, -0.024439f, -0.015059f, -0.027780f, -0.002944f, 0.003156f, -0.004417f, -0.019660f, -0.021257f, -0.015732f, 0.013352f, 0.021818f, 0.003527f, -0.024022f, -0.003382f, 0.029052f, 0.000249f, 0.026545f, 0.014339f, -0.015990f, -0.001351f, -0.024448f, 0.023295f, 0.009636f, -0.030525f, -0.058293f, 0.005298f, -0.004547f, -0.017416f, 0.018028f, -0.000138f, -0.010928f, -0.008179f, 0.004965f, 0.001569f, -0.003245f, -0.046790f, 0.018559f, -0.006425f, 0.046378f, -0.097044f, -0.066584f, 0.038380f, 0.018360f, 0.013882f, 0.032588f, -0.033120f, -0.043167f, -0.023776f, -0.035555f, 0.020074f, -0.038148f, 0.011113f, 0.025316f, 0.041588f, 0.001374f, 0.034851f, 0.020298f, 0.005719f, -0.011129f, -0.036486f, -0.025743f, 0.021239f, -0.044609f, 0.022690f, 0.005242f, 0.037977f, 0.028983f, -0.014227f, -0.055519f, -0.036110f, -0.003360f, -0.002792f, -0.014684f, 0.037981f, -0.067111f, -0.005222f, 0.002343f, -0.070297f, -0.001360f, -0.008676f, -0.005608f, 0.007501f, 0.041148f, + -0.040116f, -0.110463f, 0.041214f, 0.045020f, 0.026811f, 0.086169f, -0.070960f, -0.009100f, 0.047843f, 0.036626f, -0.044549f, -0.020679f, -0.012310f, 0.067880f, 0.013331f, 0.064795f, -0.093749f, 0.013687f, -0.111830f, -0.066945f, -0.064845f, 0.076864f, 0.024315f, -0.049553f, 0.045081f, 0.005294f, -0.043521f, 0.044250f, -0.065088f, -0.068254f, 0.010165f, -0.070885f, 0.021001f, -0.121102f, 0.018454f, 0.038257f, -0.051641f, 0.056766f, -0.025773f, -0.013642f, 0.037888f, -0.013054f, -0.010475f, -0.026982f, -0.002029f, 0.008979f, 0.020870f, -0.002446f, 0.019390f, 0.038259f, -0.028812f, -0.003088f, -0.022925f, 0.013663f, -0.015001f, -0.003903f, 0.008264f, 0.004775f, 0.005044f, -0.004958f, 0.039279f, -0.012974f, 0.003102f, 0.016931f, -0.034827f, -0.030472f, -0.033822f, -0.015610f, -0.056903f, -0.025982f, -0.020867f, 0.049057f, 0.009595f, 0.043680f, 0.018665f, 0.008926f, 0.019698f, 0.013935f, 0.001680f, 0.016628f, 0.003406f, 0.034054f, 0.083782f, 0.031006f, -0.030004f, -0.019586f, 0.011565f, -0.021272f, -0.024962f, -0.002962f, 0.038984f, -0.006759f, 0.007286f, -0.041432f, -0.008572f, 0.057261f, + -0.041777f, 0.031683f, 0.074762f, 0.037403f, -0.003179f, -0.014250f, -0.024590f, -0.047793f, -0.035165f, 0.041221f, -0.023481f, 0.038683f, 0.027856f, 0.013293f, 0.001815f, 0.015120f, -0.011933f, -0.060780f, -0.021107f, 0.043539f, 0.034466f, 0.036195f, -0.038488f, 0.066432f, -0.017110f, 0.025859f, -0.049097f, 0.044997f, 0.077347f, -0.015518f, -0.027583f, -0.002802f, 0.002811f, -0.017147f, 0.016875f, 0.033899f, -0.063515f, 0.041733f, 0.040383f, -0.009831f, 0.046817f, 0.024909f, 0.020175f, -0.029649f, 0.006088f, 0.041996f, -0.088575f, -0.078758f, -0.032898f, 0.020969f, -0.040814f, -0.119745f, 0.050149f, 0.032969f, -0.015615f, -0.020245f, 0.000837f, -0.006940f, -0.041127f, -0.109979f, -0.006743f, 0.078261f, 0.018887f, -0.013807f, -0.009443f, 0.016985f, 0.063917f, 0.051087f, -0.075243f, -0.030899f, 0.050030f, -0.010509f, -0.020263f, -0.085796f, -0.005130f, 0.047240f, 0.015534f, -0.013116f, 0.028925f, -0.010688f, 0.002939f, -0.032244f, -0.005450f, 0.019806f, 0.029416f, -0.016676f, -0.006226f, 0.006204f, 0.016944f, -0.010463f, 0.010371f, 0.001530f, -0.021154f, 0.012744f, 0.035784f, 0.006314f, + 0.010570f, 0.006848f, 0.016063f, -0.016794f, -0.029856f, 0.003027f, 0.031940f, -0.026170f, 0.011361f, -0.008752f, 0.002708f, -0.025380f, -0.049329f, -0.026602f, 0.018139f, 0.059970f, -0.006282f, 0.028400f, -0.039793f, -0.017278f, -0.026959f, 0.016698f, 0.011465f, 0.019013f, -0.013683f, -0.020373f, -0.001613f, 0.004423f, -0.001968f, 0.040818f, 0.054082f, 0.001274f, -0.060833f, 0.080718f, -0.022590f, -0.056231f, 0.050515f, -0.008032f, -0.030565f, 0.039061f, 0.010501f, -0.008091f, 0.032955f, -0.045026f, 0.042835f, -0.015213f, 0.001499f, -0.013043f, -0.011141f, -0.062798f, 0.024956f, -0.023928f, 0.009965f, -0.025133f, -0.002020f, -0.018719f, 0.018061f, -0.010938f, 0.068004f, 0.012078f, 0.044508f, -0.017224f, 0.011172f, 0.028169f, -0.011877f, 0.019490f, -0.003797f, 0.034009f, -0.001653f, -0.011337f, 0.053709f, -0.047877f, 0.026802f, 0.036738f, -0.021474f, 0.041572f, -0.025361f, -0.000969f, 0.021401f, -0.016176f, 0.048834f, 0.043750f, 0.009128f, 0.072763f, -0.044762f, -0.102593f, -0.017236f, -0.063412f, -0.041955f, 0.149979f, -0.003779f, 0.046054f, -0.006960f, -0.063215f, -0.001592f, 0.063042f, + 0.089234f, 0.054288f, 0.089886f, -0.048281f, -0.014425f, -0.021606f, -0.051269f, 0.034070f, -0.014372f, -0.031616f, -0.003276f, -0.062215f, -0.113773f, 0.028693f, 0.040093f, -0.033637f, 0.022709f, -0.007042f, -0.033923f, 0.036279f, 0.026713f, -0.013225f, 0.037357f, -0.013681f, -0.033309f, 0.017162f, -0.016529f, 0.044305f, 0.004186f, 0.003342f, 0.025029f, 0.008374f, -0.028184f, -0.011798f, 0.014535f, -0.009261f, 0.027576f, -0.038413f, 0.024823f, -0.040280f, -0.010248f, 0.010070f, -0.028588f, 0.018274f, 0.001168f, -0.042922f, -0.006940f, 0.002782f, -0.011513f, -0.000099f, -0.008007f, -0.031497f, 0.012918f, 0.009451f, -0.004995f, 0.031631f, 0.048513f, -0.026435f, -0.037799f, -0.002428f, -0.018015f, 0.052451f, 0.053905f, -0.031767f, -0.020084f, 0.045747f, -0.048133f, 0.057874f, -0.034869f, 0.008002f, -0.000071f, 0.006040f, -0.044402f, -0.006837f, -0.040156f, -0.033222f, 0.000163f, -0.013074f, -0.030281f, -0.012061f, 0.022288f, -0.025858f, 0.020544f, -0.012196f, 0.062234f, -0.028762f, 0.018627f, 0.003813f, -0.015406f, -0.049889f, -0.018262f, 0.038077f, 0.006928f, -0.012404f, 0.049916f, -0.036848f, + -0.037189f, -0.005037f, 0.047668f, -0.043260f, -0.005999f, 0.008536f, 0.012977f, -0.048185f, 0.014573f, 0.016789f, -0.017185f, -0.050390f, 0.000964f, -0.039122f, 0.016650f, 0.008942f, 0.015080f, -0.077044f, -0.032888f, 0.043997f, 0.118644f, -0.053657f, -0.007356f, 0.009585f, -0.019955f, -0.033456f, -0.000597f, 0.099096f, 0.022894f, -0.010067f, -0.008639f, -0.026157f, -0.006017f, -0.020024f, 0.038499f, 0.002046f, -0.024460f, -0.026317f, 0.001455f, 0.017801f, -0.039425f, 0.030878f, 0.009222f, 0.033660f, 0.001426f, 0.042803f, 0.018058f, -0.029773f, 0.040250f, 0.038369f, 0.094944f, 0.030244f, 0.007458f, 0.009837f, -0.034539f, 0.011647f, 0.031134f, 0.032142f, 0.011189f, -0.002153f, 0.001347f, -0.003773f, 0.012088f, 0.013452f, -0.003012f, 0.017355f, -0.004312f, -0.001667f, 0.032906f, 0.014029f, 0.005779f, -0.009693f, 0.009854f, 0.024919f, 0.026262f, 0.030115f, 0.011051f, 0.011134f, -0.016648f, -0.000002f, -0.000808f, 0.005623f, 0.017131f, -0.000567f, -0.013254f, 0.015528f, -0.013895f, 0.012946f, -0.000433f, 0.015255f, 0.002457f, -0.012266f, -0.003248f, 0.001162f, 0.003664f, 0.007673f, + -0.001596f, 0.005543f, 0.004287f, -0.000038f, -0.075290f, 0.100140f, 0.013881f, 0.022850f, 0.024072f, -0.023045f, -0.026588f, 0.001029f, -0.010215f, 0.014304f, 0.033016f, -0.046227f, 0.015374f, -0.009691f, 0.012083f, 0.011342f, 0.007887f, 0.026461f, 0.020691f, -0.019665f, 0.018605f, 0.016215f, -0.015978f, -0.027568f, 0.008490f, -0.009731f, -0.022894f, 0.013816f, 0.011314f, -0.001858f, -0.014958f, 0.000508f, -0.010896f, -0.005228f, 0.001091f, 0.006047f, 0.010563f, -0.020591f, -0.003046f, 0.016648f, -0.007367f, 0.014952f, 0.002867f, 0.010814f, 0.021759f, 0.006524f, -0.022181f, 0.002419f, 0.020760f, -0.011679f, -0.001073f, 0.010152f, -0.035279f, -0.002044f, -0.008718f, -0.032794f, 0.045499f, -0.011468f, -0.001897f, 0.027105f, 0.004632f, -0.020195f, 0.008013f, -0.019295f, -0.003920f, 0.015132f, -0.018193f, -0.006464f, 0.033629f, -0.035603f, 0.003811f, 0.003332f, 0.012217f, -0.015752f, 0.010812f, -0.005325f, 0.010075f, -0.013492f, 0.000622f, -0.003164f, 0.033870f, -0.015331f, -0.001542f, 0.008971f, -0.017135f, -0.001510f, 0.023440f, -0.004811f, 0.015103f, -0.010179f, -0.009740f, 0.001899f, + 0.009070f, -0.008786f, 0.017281f, 0.000036f, -0.003816f, -0.003604f, -0.005494f, -0.005281f, 0.014733f, -0.012407f, 0.014420f, 0.008080f, -0.019034f, 0.004754f, -0.001961f, -0.001435f, 0.011162f, -0.015632f, -0.006394f, 0.002511f, -0.010583f, 0.011181f, -0.010886f, -0.001384f, 0.017862f, 0.003433f, -0.003391f, 0.008377f, -0.009033f, -0.006929f, -0.004404f, 0.008932f, 0.014889f, -0.004368f, -0.004342f, 0.001878f, 0.023615f, -0.098983f, -0.201531f, -0.025846f, 0.126686f, 0.097436f, 0.279526f, 0.134552f, -0.065025f, -0.056792f, -0.132363f, -0.231898f, -0.029219f, -0.089830f, -0.027802f, 0.163941f, 0.104546f, 0.111600f, 0.213337f, -0.007346f, -0.047082f, -0.080300f, -0.210752f, -0.116272f, -0.037333f, -0.039054f, 0.005987f, 0.096122f, 0.074463f, 0.079045f, 0.148941f, 0.087212f, -0.054596f, 0.079471f, -0.083239f, -0.194360f, 0.025009f, -0.130399f, -0.181489f, 0.070970f, -0.015473f, -0.033517f, 0.223435f, 0.073292f, 0.059487f, 0.192614f, -0.020537f, -0.037725f, 0.058708f, -0.128853f, -0.160151f, -0.042969f, -0.137115f, -0.122517f, 0.026120f, 0.026726f, 0.055576f, 0.168072f, 0.148854f, 0.090239f, + 0.106800f, 0.020775f, -0.084015f, -0.090468f, -0.112032f, -0.154004f, -0.071860f, -0.038984f, -0.052263f, 0.046731f, 0.148655f, 0.097115f, 0.095895f, 0.078883f, -0.055400f, -0.000462f, 0.015784f, -0.127076f, -0.052335f, -0.031744f, -0.037136f, 0.058493f, 0.029966f, -0.007174f, 0.047815f, -0.010930f, -0.009825f, 0.008299f, -0.034219f, -0.025741f, 0.017046f, -0.021124f, 0.034678f, 0.043631f, -0.016115f, 0.023725f, 0.044421f, -0.025706f, 0.029130f, 0.014666f, -0.086501f, 0.015470f, -0.028021f, -0.093880f, 0.001543f, -0.053553f, -0.047966f, 0.068532f, 0.074108f, 0.071618f, 0.132545f, 0.042375f, 0.042241f, 0.045069f, -0.057886f, -0.115516f, -0.129069f, -0.165182f, -0.123104f, -0.037003f, 0.021628f, 0.100408f, 0.166213f, 0.184244f, 0.143832f, 0.104927f, 0.020740f, -0.097350f, -0.146794f, -0.179153f, -0.166575f, -0.086234f, -0.005495f, 0.047131f, 0.119328f, 0.110254f, 0.060115f, 0.060535f, 0.023434f, -0.001614f, -0.000477f, -0.018604f, -0.036689f, -0.030300f, -0.038134f, -0.045998f, -0.034071f, -0.025247f, -0.007101f, 0.012284f, 0.030008f, 0.036330f, 0.038368f, 0.031591f, 0.017545f, 0.004539f, + -0.003982f, -0.005532f, -0.003378f, -0.001784f}, + {-0.001968f, 0.005007f, 0.008669f, -0.006482f, -0.005609f, -0.008671f, 0.007847f, 0.003909f, 0.000680f, 0.011610f, -0.001166f, -0.000149f, -0.003556f, -0.002877f, 0.002516f, -0.003110f, -0.006057f, 0.003402f, 0.000978f, 0.009696f, 0.013251f, -0.003455f, -0.007804f, -0.009612f, -0.000610f, -0.005498f, -0.005299f, -0.003636f, -0.000743f, -0.007657f, 0.007366f, -0.002745f, -0.002897f, -0.005067f, -0.003738f, 0.001409f, 0.008277f, -0.000867f, -0.002395f, 0.002499f, -0.008141f, 0.006100f, -0.005080f, -0.018250f, 0.009045f, 0.006010f, 0.010048f, 0.010424f, 0.001981f, 0.005487f, -0.005449f, 0.001544f, 0.007898f, 0.000612f, -0.000099f, -0.001906f, -0.001054f, 0.004237f, -0.003858f, -0.002784f, 0.000194f, 0.004028f, -0.003350f, -0.004169f, -0.006107f, 0.007806f, 0.003097f, 0.000961f, -0.001907f, -0.007817f, -0.000274f, 0.005838f, 0.003624f, -0.001117f, -0.001484f, 0.005848f, -0.000715f, -0.000431f, -0.002553f, -0.002411f, -0.003576f, -0.004231f, 0.000260f, 0.000890f, 0.002005f, -0.004354f, -0.001728f, 0.002418f, -0.003019f, 0.002611f, 0.000702f, 0.001169f, -0.001132f, -0.000073f, 0.000563f, 0.001273f, + 0.000316f, -0.000508f, 0.000794f, -0.000556f, -0.001492f, -0.000484f, -0.002467f, 0.001634f, 0.000836f, -0.000705f, 0.000030f, -0.001115f, 0.001463f, 0.001512f, 0.000483f, 0.000150f, 0.000564f, 0.000536f, -0.001537f, 0.000055f, -0.000304f, -0.000374f, -0.000605f, -0.000207f, 0.000853f, -0.027401f, 0.014231f, -0.001389f, 0.000364f, 0.004922f, 0.006953f, -0.010236f, -0.001338f, -0.001874f, 0.005775f, 0.002169f, -0.006279f, 0.019415f, -0.002128f, -0.001251f, 0.008616f, 0.007063f, 0.002282f, 0.004887f, 0.015843f, -0.007908f, 0.000458f, -0.004054f, 0.001550f, -0.004935f, 0.000357f, 0.000451f, 0.001747f, -0.008865f, 0.000720f, -0.002164f, -0.003356f, -0.000424f, 0.005506f, -0.003102f, 0.005117f, 0.007456f, -0.012980f, 0.001698f, -0.005299f, -0.001478f, -0.008006f, 0.003929f, -0.004766f, -0.000859f, -0.002707f, -0.008145f, 0.003059f, -0.005481f, 0.003658f, 0.001983f, -0.004042f, -0.005943f, 0.000154f, 0.005426f, 0.004085f, 0.009900f, 0.004564f, -0.004350f, -0.012251f, -0.000870f, 0.002121f, 0.015356f, -0.004811f, -0.002391f, -0.000204f, -0.003054f, -0.008064f, -0.003882f, -0.007509f, -0.001060f, + 0.006170f, -0.001456f, 0.007352f, 0.004704f, 0.003784f, 0.005309f, 0.000934f, -0.009690f, -0.002284f, -0.006256f, -0.003975f, -0.010756f, -0.000395f, -0.003105f, 0.001411f, 0.002847f, 0.001236f, -0.001649f, -0.002211f, 0.000311f, 0.002796f, -0.002470f, -0.000695f, 0.000010f, -0.000904f, -0.000283f, -0.001020f, 0.001077f, -0.003712f, -0.001322f, -0.000902f, 0.000050f, -0.000391f, -0.000743f, -0.000022f, -0.005242f, 0.019951f, 0.010392f, -0.003260f, -0.008072f, 0.011406f, -0.013379f, -0.002256f, 0.007398f, -0.005545f, -0.004003f, -0.005782f, 0.013165f, -0.004685f, 0.004048f, 0.001067f, 0.003999f, 0.017981f, -0.018133f, 0.005345f, 0.009041f, -0.006080f, -0.016784f, -0.008786f, -0.001173f, 0.001000f, -0.002404f, -0.003082f, 0.006996f, 0.010158f, -0.000868f, -0.007290f, 0.000521f, -0.009224f, 0.002708f, -0.005814f, 0.003215f, 0.010850f, 0.003976f, -0.011015f, -0.000310f, 0.000614f, 0.016310f, 0.002998f, 0.008157f, -0.002406f, 0.003610f, 0.002806f, -0.019753f, 0.000264f, 0.009343f, 0.004279f, 0.010452f, -0.009316f, -0.005698f, -0.009276f, 0.002499f, 0.005866f, -0.001889f, 0.001965f, 0.000510f, + -0.004679f, 0.001758f, -0.003526f, 0.003146f, 0.002922f, -0.000674f, 0.004786f, 0.000999f, -0.000763f, 0.002141f, 0.011696f, 0.002165f, 0.006084f, 0.007655f, 0.004183f, 0.000193f, -0.000225f, -0.011003f, -0.000066f, 0.011749f, 0.004104f, 0.005219f, -0.000266f, -0.000797f, 0.007338f, -0.005500f, 0.000570f, -0.000489f, 0.003710f, 0.002012f, -0.000005f, -0.004768f, 0.000754f, -0.002399f, -0.000748f, 0.000835f, -0.001575f, -0.001107f, 0.001124f, -0.000116f, 0.003766f, 0.001622f, 0.003440f, 0.001697f, 0.001028f, 0.001913f, -0.001437f, -0.001862f, 0.000193f, 0.000251f, 0.004309f, 0.002695f, 0.000612f, 0.001539f, 0.004095f, -0.000657f, 0.000384f, 0.001322f, 0.041207f, -0.010645f, -0.003854f, -0.006256f, 0.008425f, 0.005624f, 0.014018f, 0.005564f, -0.002077f, 0.006718f, -0.000306f, 0.007515f, 0.002899f, 0.010446f, 0.000207f, 0.008767f, 0.011395f, -0.012658f, 0.002254f, 0.003271f, 0.002094f, 0.001993f, 0.002809f, -0.007525f, -0.000039f, -0.008665f, -0.001274f, -0.000313f, -0.014703f, -0.009975f, 0.003653f, -0.000062f, -0.000540f, 0.005847f, 0.005705f, -0.002985f, -0.012683f, 0.003799f, + 0.011383f, 0.007519f, 0.010614f, -0.002862f, 0.005723f, 0.010566f, -0.017620f, 0.005586f, 0.007705f, -0.008685f, 0.010850f, -0.007571f, -0.001626f, 0.001084f, 0.002110f, -0.005846f, 0.005113f, -0.001534f, -0.002020f, -0.006082f, -0.005013f, 0.006109f, 0.006089f, 0.002773f, 0.005994f, 0.009393f, 0.005104f, 0.013055f, -0.002784f, -0.014670f, 0.014170f, 0.002333f, 0.006934f, 0.002966f, -0.002461f, 0.003724f, 0.002669f, 0.000634f, 0.009711f, -0.002966f, 0.009581f, -0.013788f, -0.003215f, 0.001806f, 0.004241f, 0.000957f, -0.007590f, -0.003464f, 0.001213f, 0.000454f, -0.000841f, 0.000486f, 0.002873f, -0.003682f, -0.002157f, -0.002068f, -0.002741f, 0.001603f, -0.000862f, -0.000998f, -0.002244f, -0.001571f, 0.004141f, -0.000975f, -0.001436f, -0.000027f, -0.001527f, -0.001187f, 0.002074f, -0.000813f, 0.002218f, -0.000449f, 0.000128f, 0.001805f, -0.000567f, 0.018238f, -0.020985f, 0.013913f, 0.002921f, 0.014248f, 0.003283f, -0.008067f, 0.002615f, 0.010972f, -0.013162f, -0.002806f, 0.001482f, -0.014840f, -0.002952f, -0.011412f, -0.006992f, -0.008322f, -0.009123f, 0.003838f, -0.014172f, -0.008814f, + -0.011296f, -0.002902f, 0.010868f, 0.003901f, -0.013585f, -0.005311f, -0.014207f, -0.003536f, 0.003075f, 0.020339f, -0.016425f, 0.006697f, -0.004195f, -0.006046f, -0.012246f, 0.000539f, 0.002066f, 0.013024f, 0.006845f, 0.001608f, -0.011105f, -0.019285f, -0.000301f, 0.005604f, 0.015100f, 0.005231f, 0.004832f, -0.011220f, 0.004059f, 0.009431f, 0.000717f, 0.001430f, -0.005998f, -0.005976f, -0.002016f, 0.005468f, 0.000974f, -0.003889f, 0.000104f, -0.012340f, -0.001770f, -0.010408f, 0.006521f, -0.002225f, 0.006520f, -0.010199f, -0.008601f, -0.014024f, -0.001628f, -0.009039f, -0.003876f, 0.003526f, -0.013569f, -0.005908f, 0.001560f, 0.007421f, -0.016298f, 0.009454f, -0.007672f, -0.008283f, -0.008663f, -0.007290f, 0.004893f, -0.004917f, 0.002266f, 0.002757f, -0.004325f, 0.000565f, 0.003389f, 0.002577f, 0.000173f, -0.003925f, -0.000581f, -0.001917f, -0.004374f, -0.000828f, 0.003233f, 0.001862f, -0.002165f, 0.002902f, -0.002536f, -0.001984f, -0.000482f, 0.000951f, -0.003258f, 0.000169f, -0.000398f, 0.002153f, 0.001736f, 0.003590f, -0.002939f, 0.000808f, -0.000665f, -0.001311f, 0.001137f, -0.003444f, + -0.001189f, 0.001666f, 0.000926f, -0.050936f, 0.008201f, 0.005806f, -0.014711f, -0.003280f, -0.000072f, 0.000504f, -0.002826f, -0.004892f, -0.003775f, -0.015141f, 0.011638f, -0.007337f, 0.001595f, -0.012611f, -0.004496f, 0.018234f, 0.016511f, -0.010485f, -0.006344f, 0.000524f, -0.000311f, -0.008606f, -0.010053f, -0.007116f, 0.001172f, 0.000779f, 0.000281f, -0.001037f, 0.004230f, -0.012429f, 0.003856f, 0.000425f, -0.021951f, -0.002634f, -0.006589f, 0.010024f, 0.014617f, 0.002288f, -0.002609f, 0.000701f, -0.012881f, -0.016091f, 0.008595f, 0.015921f, 0.017693f, -0.004780f, 0.003198f, 0.010344f, 0.010635f, -0.005525f, 0.009808f, 0.016045f, -0.000710f, 0.013508f, 0.011408f, -0.013452f, 0.004367f, 0.000784f, 0.014433f, -0.008868f, -0.009500f, 0.008348f, 0.010929f, -0.003367f, 0.000939f, -0.015849f, 0.011119f, -0.008862f, 0.011739f, -0.019711f, 0.002097f, 0.004702f, 0.009367f, 0.000657f, -0.008302f, -0.016810f, -0.010365f, 0.014166f, -0.014027f, -0.000641f, 0.001537f, 0.007652f, -0.004277f, -0.002969f, 0.005908f, -0.011227f, -0.009844f, 0.004038f, 0.002631f, -0.000798f, 0.007996f, -0.003708f, + 0.001861f, 0.002101f, 0.002104f, 0.003070f, 0.000607f, -0.003108f, 0.001904f, 0.004179f, -0.001774f, 0.000607f, -0.000892f, -0.002060f, 0.001640f, -0.005173f, -0.000790f, -0.005579f, -0.001129f, -0.001025f, -0.001888f, -0.002844f, 0.001111f, -0.001627f, -0.000133f, -0.004325f, 0.001690f, -0.000751f, 0.001462f, 0.001818f, 0.000610f, 0.000778f, -0.019740f, 0.006992f, -0.017445f, 0.022066f, 0.021221f, 0.000647f, -0.028756f, 0.011902f, 0.001627f, -0.005367f, 0.019838f, 0.000081f, -0.017136f, -0.001826f, 0.021567f, -0.027061f, 0.000853f, -0.006773f, -0.021357f, -0.005943f, 0.000387f, -0.004208f, -0.010939f, 0.006294f, -0.009062f, 0.007363f, -0.007719f, -0.014472f, 0.007712f, -0.001086f, 0.011081f, -0.021547f, 0.008791f, 0.016949f, -0.006817f, 0.001390f, 0.017043f, 0.024919f, -0.006629f, -0.005094f, -0.021003f, 0.001224f, -0.017327f, -0.001419f, -0.012062f, 0.000595f, 0.001690f, 0.010065f, 0.004826f, 0.009198f, -0.006641f, 0.001688f, 0.005704f, -0.001097f, 0.023003f, -0.015273f, -0.007541f, 0.030260f, 0.030398f, -0.006004f, -0.001917f, -0.019081f, -0.009751f, 0.000967f, -0.005293f, -0.012630f, + 0.018362f, 0.005657f, -0.004782f, 0.026938f, 0.005223f, -0.012931f, -0.000356f, -0.024744f, -0.012408f, -0.014029f, -0.012021f, -0.003290f, -0.019315f, -0.013945f, 0.007961f, 0.007356f, -0.001419f, 0.004339f, -0.005731f, 0.006466f, -0.004304f, -0.006324f, 0.001094f, -0.009103f, -0.004158f, 0.011685f, 0.000936f, 0.005822f, -0.003123f, 0.001194f, 0.000897f, 0.002740f, 0.002535f, -0.000513f, -0.000232f, -0.005787f, -0.000066f, 0.001233f, 0.000936f, -0.001632f, -0.001640f, 0.003904f, 0.001164f, -0.000838f, 0.000139f, -0.000998f, 0.000132f, 0.002163f, 0.024508f, -0.006438f, -0.000211f, 0.016901f, -0.003957f, 0.010021f, -0.005391f, -0.021289f, -0.001317f, 0.000101f, -0.004322f, -0.012581f, -0.014056f, 0.007434f, -0.011121f, 0.019857f, -0.006013f, -0.014267f, 0.012305f, 0.024904f, -0.006103f, 0.007041f, -0.006610f, 0.014425f, 0.000380f, -0.030085f, 0.010808f, 0.016843f, 0.001735f, -0.004939f, -0.017481f, 0.014797f, 0.009908f, 0.009560f, 0.001993f, 0.006059f, 0.019753f, -0.013813f, 0.002521f, 0.003940f, -0.010893f, -0.021123f, 0.020267f, 0.011325f, 0.037665f, -0.001831f, 0.016651f, -0.005442f, + -0.011753f, 0.002092f, -0.001786f, -0.000451f, -0.003302f, -0.012169f, 0.027064f, 0.000707f, 0.002171f, 0.003904f, -0.003705f, 0.022297f, 0.002885f, 0.018681f, 0.007830f, 0.003208f, 0.019951f, -0.009306f, -0.022229f, -0.004328f, 0.004185f, 0.002956f, -0.009156f, 0.010967f, -0.006536f, -0.031126f, 0.002889f, 0.006267f, -0.017167f, 0.008098f, -0.001722f, 0.003433f, 0.000109f, -0.007019f, -0.007764f, 0.000029f, 0.003022f, 0.009582f, -0.000791f, 0.002730f, -0.003606f, -0.002671f, 0.004373f, 0.002881f, -0.000471f, 0.002967f, -0.003105f, -0.000308f, 0.000290f, -0.004223f, -0.006088f, 0.003893f, -0.006785f, -0.001726f, -0.002919f, -0.005947f, -0.001593f, -0.000753f, -0.002152f, 0.002657f, -0.000949f, -0.002480f, -0.000672f, 0.011512f, 0.004574f, 0.004417f, -0.002240f, 0.001680f, -0.003513f, -0.004625f, -0.001454f, -0.001571f, 0.002072f, -0.003050f, 0.005629f, -0.007159f, -0.002188f, 0.001575f, 0.019801f, -0.032829f, 0.005390f, 0.014705f, 0.021889f, -0.022992f, -0.003313f, 0.015588f, 0.010864f, 0.013303f, 0.002350f, 0.028079f, 0.005206f, 0.011643f, -0.003491f, 0.001662f, 0.011586f, 0.006354f, + 0.013375f, 0.001061f, -0.018569f, -0.027093f, 0.014369f, 0.006955f, -0.005158f, 0.003187f, 0.008081f, -0.025349f, 0.000237f, -0.015996f, 0.007484f, -0.000870f, 0.016615f, -0.005325f, 0.007421f, -0.003837f, 0.004303f, 0.002275f, -0.000707f, 0.009357f, 0.012487f, 0.004477f, 0.007230f, -0.019859f, 0.008217f, -0.003497f, -0.034638f, -0.023008f, 0.005895f, -0.025289f, -0.001746f, 0.020908f, -0.015258f, 0.041530f, 0.015006f, -0.008360f, 0.022530f, 0.001061f, -0.007387f, -0.016755f, -0.016608f, -0.023055f, -0.003593f, 0.013484f, -0.016507f, -0.002045f, 0.014954f, 0.006837f, 0.008441f, 0.030433f, 0.003747f, 0.019899f, 0.000141f, 0.003910f, -0.032673f, 0.009052f, 0.002448f, -0.029725f, -0.028156f, 0.016245f, -0.010747f, 0.001895f, 0.008537f, -0.004844f, -0.007666f, 0.001723f, -0.001714f, -0.002031f, 0.001706f, -0.005314f, 0.004772f, -0.003820f, 0.001055f, -0.009382f, 0.005088f, 0.001582f, 0.002064f, -0.000503f, 0.011576f, -0.009382f, 0.000800f, -0.002625f, -0.002346f, 0.002347f, 0.002362f, 0.003244f, 0.005568f, 0.009312f, 0.005743f, -0.005977f, 0.001445f, -0.000749f, 0.008470f, -0.002785f, + 0.005463f, -0.008676f, -0.006604f, -0.004997f, -0.004215f, -0.000569f, -0.000477f, 0.004319f, 0.005036f, -0.017031f, -0.000415f, 0.010862f, -0.000048f, 0.007652f, -0.017447f, 0.013734f, -0.000973f, 0.004063f, 0.012812f, -0.023592f, -0.016180f, 0.004393f, -0.000215f, 0.013087f, 0.026916f, -0.002400f, 0.006794f, 0.028883f, -0.010587f, -0.019428f, -0.001013f, 0.021183f, -0.004462f, -0.024211f, 0.002060f, 0.009059f, -0.004666f, -0.007516f, -0.001677f, 0.031313f, -0.005837f, 0.026966f, 0.020415f, 0.024611f, 0.001462f, 0.002090f, 0.014437f, 0.004897f, -0.004865f, 0.005141f, -0.019307f, 0.014726f, 0.024671f, 0.015503f, 0.002219f, 0.013794f, -0.010665f, 0.010613f, -0.010373f, 0.015480f, -0.013773f, 0.000351f, -0.000999f, -0.000998f, 0.043798f, -0.006457f, -0.002335f, -0.003725f, 0.006179f, 0.012126f, 0.023112f, 0.026344f, -0.014247f, 0.006371f, 0.026252f, -0.014586f, -0.018098f, 0.011025f, -0.007820f, 0.011363f, 0.050014f, -0.023512f, 0.003484f, 0.004738f, -0.012890f, 0.005694f, 0.016399f, 0.011487f, 0.001461f, -0.010161f, -0.024478f, 0.011710f, -0.010616f, 0.013535f, -0.009134f, 0.001951f, + -0.012067f, -0.002616f, -0.020255f, 0.001792f, -0.006360f, -0.007149f, -0.002431f, 0.002519f, 0.005244f, 0.010144f, 0.004374f, -0.005746f, -0.001349f, 0.010336f, -0.005978f, -0.005296f, 0.000824f, 0.000766f, -0.009175f, -0.000086f, -0.004583f, -0.002268f, -0.001655f, -0.001634f, 0.003651f, 0.002255f, 0.007383f, -0.004640f, -0.004591f, 0.000584f, -0.005518f, 0.002647f, 0.011540f, -0.005715f, -0.006036f, -0.011379f, 0.005916f, -0.002867f, -0.002888f, -0.016913f, -0.026667f, -0.020528f, -0.027750f, -0.010688f, 0.003119f, 0.022223f, 0.016463f, 0.005966f, 0.023402f, 0.007039f, 0.014296f, 0.013161f, -0.006345f, 0.020298f, 0.021998f, 0.015538f, -0.029689f, -0.016637f, -0.017194f, 0.006481f, -0.011857f, 0.000829f, 0.008458f, -0.008624f, -0.020949f, 0.013560f, -0.009931f, 0.004817f, 0.004511f, 0.021383f, -0.022285f, 0.034666f, -0.034228f, 0.035414f, -0.000072f, 0.017771f, -0.017173f, 0.006259f, -0.038260f, -0.021304f, -0.018612f, 0.016878f, 0.007778f, 0.024467f, -0.002424f, -0.000079f, -0.012406f, -0.030670f, 0.020040f, -0.016744f, -0.008698f, 0.014606f, 0.034809f, 0.033684f, 0.015803f, -0.002232f, + -0.022773f, 0.013419f, -0.034979f, -0.002706f, -0.019857f, 0.011293f, 0.037772f, -0.036218f, 0.013230f, 0.016846f, -0.022519f, -0.002209f, -0.003831f, 0.012664f, -0.014925f, -0.021488f, 0.004298f, -0.008674f, -0.031590f, 0.016075f, -0.003110f, -0.029657f, 0.022062f, 0.029193f, -0.009601f, 0.001016f, 0.004135f, -0.012516f, 0.018956f, 0.008817f, -0.005345f, -0.004671f, -0.012415f, -0.007057f, 0.015210f, 0.008748f, 0.008686f, -0.000611f, -0.013680f, -0.004076f, -0.004633f, -0.015162f, -0.003224f, 0.004629f, -0.000898f, -0.004398f, -0.001366f, -0.010787f, 0.001440f, -0.003625f, 0.007403f, 0.004175f, 0.001559f, -0.012502f, 0.010398f, 0.001039f, -0.005415f, -0.003099f, -0.002047f, -0.000547f, 0.006177f, -0.004551f, -0.001911f, 0.004806f, 0.012785f, 0.006507f, 0.003792f, -0.007628f, 0.010205f, -0.025492f, -0.029765f, -0.008416f, 0.019161f, -0.022793f, 0.015050f, -0.031306f, -0.005606f, -0.012046f, -0.011044f, -0.024820f, -0.002233f, -0.009267f, -0.014928f, 0.011934f, -0.016631f, 0.017884f, 0.003762f, 0.013970f, -0.021971f, -0.041064f, -0.003430f, 0.008473f, -0.017213f, -0.012587f, 0.006699f, 0.005362f, + -0.020130f, -0.009538f, 0.028594f, 0.013900f, -0.003788f, 0.015663f, 0.041072f, 0.001472f, 0.005193f, 0.004223f, -0.003139f, -0.000661f, 0.006039f, 0.005518f, -0.031595f, -0.011466f, -0.038603f, -0.012180f, -0.036003f, -0.016947f, 0.001940f, 0.042062f, 0.019604f, -0.020790f, -0.024457f, 0.015694f, 0.033184f, 0.021012f, -0.014879f, 0.025472f, -0.009714f, -0.001901f, -0.044602f, -0.013241f, -0.005769f, -0.005484f, -0.030514f, -0.048839f, 0.015638f, -0.000100f, -0.035768f, 0.009120f, 0.055895f, 0.007305f, 0.006305f, -0.035311f, -0.003206f, -0.000501f, 0.007799f, -0.039651f, 0.036598f, 0.005797f, 0.010092f, 0.020262f, 0.007798f, 0.021979f, -0.001708f, 0.010324f, -0.008649f, -0.017165f, -0.014330f, 0.007563f, -0.011552f, -0.003643f, -0.015426f, 0.005172f, 0.012547f, 0.000242f, 0.010563f, 0.001191f, -0.004289f, -0.000185f, -0.008883f, 0.006149f, 0.006312f, 0.001135f, 0.001125f, -0.006028f, -0.002500f, 0.003367f, 0.009172f, 0.006690f, -0.008141f, -0.002880f, -0.003382f, -0.018545f, -0.025761f, -0.018935f, -0.006247f, -0.002381f, 0.002946f, -0.004426f, -0.007330f, -0.007894f, -0.000056f, -0.005292f, + -0.006903f, -0.011525f, -0.006305f, 0.018571f, -0.011544f, 0.022561f, -0.034277f, -0.007068f, 0.008061f, -0.016542f, 0.039278f, -0.032595f, -0.033554f, -0.027305f, 0.037981f, 0.016913f, -0.022176f, -0.020005f, -0.013383f, -0.004258f, -0.012072f, -0.012419f, 0.001764f, 0.014109f, 0.037515f, -0.004279f, 0.015917f, 0.013848f, 0.013449f, -0.025239f, -0.031479f, -0.022649f, 0.026184f, -0.004678f, 0.031840f, 0.010497f, -0.003668f, -0.043836f, -0.035781f, -0.003804f, 0.002764f, -0.025471f, -0.016003f, -0.012025f, -0.012314f, -0.057459f, -0.012610f, -0.014116f, -0.020818f, -0.010229f, -0.013671f, -0.026425f, 0.018352f, 0.035684f, 0.019737f, 0.000894f, 0.020977f, 0.026781f, -0.009733f, 0.008432f, 0.006681f, 0.002576f, -0.001272f, -0.006921f, 0.018694f, 0.007523f, 0.031455f, -0.007418f, 0.002964f, 0.011208f, 0.062096f, -0.000796f, 0.032934f, 0.041808f, -0.003810f, -0.036554f, 0.002985f, 0.036312f, 0.005182f, -0.031130f, -0.028019f, -0.035674f, 0.023083f, -0.029146f, -0.008059f, 0.041666f, -0.018098f, -0.027966f, 0.008465f, -0.007680f, 0.000644f, 0.011372f, -0.017674f, -0.007873f, 0.003306f, -0.005243f, + -0.008113f, -0.001587f, 0.003024f, 0.020827f, -0.002129f, -0.010817f, -0.009490f, -0.000090f, -0.008194f, -0.006573f, -0.006025f, -0.010495f, -0.005164f, 0.003962f, -0.005195f, -0.000994f, -0.014464f, 0.003679f, -0.001548f, 0.002892f, 0.014083f, 0.008942f, -0.008613f, 0.003906f, 0.002910f, -0.012580f, -0.019383f, 0.007182f, 0.007475f, 0.001108f, -0.019811f, -0.021187f, -0.003552f, -0.014799f, -0.005034f, -0.002164f, 0.035141f, 0.025599f, -0.058967f, 0.018701f, 0.023521f, -0.010339f, 0.017083f, 0.056028f, 0.004607f, 0.012470f, -0.019573f, 0.012985f, -0.020685f, -0.013219f, -0.011021f, 0.004114f, 0.014418f, 0.020156f, -0.002890f, 0.008308f, -0.006098f, -0.003434f, -0.010816f, 0.014834f, 0.052890f, -0.017276f, -0.017049f, 0.018962f, 0.013376f, 0.001910f, -0.038462f, 0.024931f, -0.030663f, 0.017592f, 0.022078f, 0.002451f, 0.005613f, -0.006355f, 0.036391f, 0.027535f, 0.000331f, 0.018520f, -0.014549f, 0.023354f, 0.003925f, 0.026373f, 0.038546f, -0.000867f, 0.009790f, -0.005039f, -0.014186f, -0.000994f, 0.016814f, 0.018925f, -0.036789f, -0.022378f, 0.008650f, 0.039972f, -0.019355f, 0.026526f, + 0.017803f, 0.005141f, -0.042865f, 0.005193f, 0.006704f, -0.051173f, 0.030179f, -0.028651f, -0.034019f, -0.064768f, 0.015792f, 0.039268f, -0.017763f, -0.036150f, 0.007523f, 0.043522f, 0.027807f, 0.004830f, -0.005648f, 0.000594f, 0.015391f, -0.013338f, 0.020527f, 0.033423f, 0.031902f, -0.002375f, 0.013540f, 0.033067f, -0.005180f, -0.000461f, -0.003636f, 0.028469f, -0.004179f, 0.006986f, -0.013310f, 0.007223f, -0.008186f, 0.001085f, 0.000410f, -0.002253f, -0.006445f, 0.006222f, 0.016791f, 0.005641f, 0.004778f, -0.015177f, 0.003864f, -0.015669f, 0.004758f, 0.024637f, -0.008973f, 0.000365f, 0.003254f, -0.011715f, -0.015247f, -0.017569f, -0.003983f, 0.011120f, -0.005157f, 0.002971f, -0.010619f, -0.001100f, 0.000406f, -0.032508f, -0.008339f, -0.001395f, 0.006836f, 0.008274f, -0.006750f, 0.011515f, 0.006105f, 0.006145f, -0.009638f, -0.009451f, 0.014425f, 0.040629f, 0.029453f, -0.010185f, -0.079400f, 0.009323f, 0.039729f, 0.018958f, 0.008629f, -0.034832f, -0.000220f, -0.024053f, 0.005581f, -0.002333f, 0.006573f, 0.011940f, 0.016635f, 0.007087f, -0.043174f, 0.024983f, -0.006020f, 0.007553f, + 0.032766f, 0.012605f, 0.006115f, -0.011759f, 0.040645f, -0.001462f, 0.040398f, -0.049129f, -0.014458f, 0.015632f, -0.028637f, -0.024759f, 0.001709f, -0.006498f, -0.022422f, 0.002582f, 0.035689f, -0.001235f, 0.002344f, -0.018821f, -0.039069f, -0.024940f, -0.011185f, 0.016119f, -0.004331f, 0.003703f, -0.019235f, -0.020950f, -0.010279f, 0.030984f, -0.021401f, 0.017812f, 0.011981f, 0.009990f, 0.003420f, -0.032211f, -0.045858f, -0.003812f, 0.030616f, -0.038145f, 0.018337f, -0.032857f, 0.020475f, -0.034562f, -0.001791f, -0.034079f, 0.048146f, -0.044083f, -0.026327f, 0.011275f, 0.007866f, 0.021986f, 0.018330f, -0.011499f, -0.006125f, -0.011571f, 0.005935f, -0.000580f, 0.028680f, -0.035786f, -0.014185f, -0.045956f, 0.023651f, -0.016403f, 0.001739f, -0.002027f, 0.012460f, -0.010261f, 0.004634f, -0.018875f, -0.028594f, 0.018226f, -0.014809f, 0.000351f, 0.004651f, 0.024246f, 0.009665f, -0.017612f, 0.003674f, -0.006040f, -0.022597f, -0.004283f, 0.005211f, 0.006987f, -0.020441f, -0.010058f, 0.022405f, -0.002404f, -0.019012f, -0.008421f, 0.026303f, -0.031083f, -0.010598f, 0.006213f, -0.007286f, 0.010926f, + -0.002413f, -0.013727f, -0.018427f, -0.005982f, -0.008309f, -0.005811f, -0.006124f, 0.004914f, -0.001527f, 0.011387f, -0.012236f, 0.006267f, 0.002115f, -0.005621f, 0.012284f, -0.067760f, -0.009627f, 0.020234f, 0.004933f, -0.016182f, -0.024198f, 0.002190f, -0.023003f, -0.002192f, -0.035508f, 0.033172f, -0.013307f, 0.020740f, -0.046162f, -0.026237f, -0.000977f, 0.056485f, -0.046309f, -0.004090f, -0.036254f, -0.028900f, -0.008834f, 0.035353f, -0.008267f, 0.015643f, 0.016550f, -0.018902f, -0.040214f, 0.056523f, 0.024616f, -0.032496f, 0.006244f, 0.004058f, 0.015587f, -0.031629f, 0.028231f, -0.002614f, -0.059242f, 0.006146f, 0.011817f, 0.015152f, -0.049091f, -0.011868f, 0.006153f, 0.043092f, 0.008193f, 0.023952f, -0.063318f, -0.038602f, 0.019386f, -0.000130f, 0.041276f, -0.011201f, -0.007000f, 0.003029f, 0.020971f, 0.019097f, 0.007319f, -0.080608f, 0.022650f, -0.009509f, 0.018397f, 0.042749f, -0.013586f, -0.003959f, -0.049032f, 0.015760f, 0.022149f, -0.025923f, -0.015322f, 0.044235f, 0.070073f, 0.018181f, 0.011412f, -0.020003f, -0.008237f, -0.038439f, 0.002913f, 0.000310f, -0.047272f, 0.017070f, + -0.001429f, -0.014005f, -0.003611f, 0.022072f, -0.018107f, -0.012373f, -0.002112f, -0.005239f, -0.001705f, 0.019462f, -0.008473f, 0.000213f, 0.011313f, 0.004321f, 0.015564f, 0.012919f, 0.009973f, 0.006839f, 0.018635f, 0.021612f, -0.029166f, 0.009082f, -0.018201f, 0.014238f, 0.002178f, -0.018669f, -0.012509f, -0.007392f, -0.006098f, -0.012322f, 0.011227f, -0.006388f, -0.011950f, 0.019859f, -0.003145f, -0.006584f, 0.011475f, 0.020452f, -0.000036f, -0.007655f, 0.005748f, 0.019061f, 0.020998f, 0.012950f, -0.006808f, 0.003283f, 0.003947f, 0.017115f, -0.058140f, -0.038043f, -0.013123f, -0.000639f, -0.033130f, 0.026245f, -0.068697f, 0.003301f, -0.042183f, 0.021832f, -0.015656f, -0.046898f, -0.004172f, -0.012670f, -0.016532f, -0.053416f, -0.038974f, 0.011098f, 0.042053f, -0.028307f, 0.051918f, -0.044324f, -0.029133f, 0.009426f, -0.004359f, 0.023516f, -0.014752f, -0.015515f, -0.021516f, -0.006084f, -0.072960f, -0.021073f, 0.002069f, -0.003261f, -0.012198f, -0.028802f, 0.022855f, -0.025501f, 0.038903f, -0.012174f, -0.004900f, -0.027725f, -0.025474f, -0.048417f, -0.021069f, 0.017724f, 0.007313f, -0.003027f, + 0.003147f, -0.017485f, -0.013142f, -0.022511f, -0.018816f, 0.009725f, 0.014321f, 0.006615f, -0.041980f, 0.047859f, 0.006471f, -0.020981f, 0.038373f, 0.027296f, 0.045740f, -0.008879f, 0.026671f, -0.062920f, -0.033959f, -0.059469f, 0.060258f, -0.019682f, -0.042116f, -0.040709f, -0.085956f, -0.036185f, 0.059407f, -0.004166f, -0.030200f, 0.021480f, -0.058672f, -0.039482f, 0.014671f, -0.003740f, -0.048967f, -0.048081f, -0.000621f, -0.027771f, 0.007295f, 0.009902f, -0.036431f, 0.035141f, -0.021704f, -0.032132f, 0.002720f, -0.019195f, 0.050629f, -0.019878f, 0.022729f, 0.003279f, 0.030764f, -0.016043f, -0.009051f, 0.002602f, -0.014085f, -0.000887f, -0.029582f, -0.022743f, -0.005742f, 0.011932f, 0.000551f, 0.020099f, 0.008223f, 0.014808f, -0.013309f, -0.000476f, -0.025749f, -0.006705f, -0.009315f, 0.007285f, 0.024497f, 0.010915f, 0.009807f, 0.011283f, 0.010115f, 0.002301f, -0.033542f, -0.010366f, -0.023173f, -0.006183f, 0.003828f, 0.015356f, 0.074997f, 0.096029f, -0.009142f, -0.042692f, -0.010174f, -0.016154f, -0.043134f, 0.018540f, 0.001182f, -0.031265f, 0.091786f, 0.031829f, -0.021764f, -0.063677f, + -0.005719f, 0.015326f, 0.016734f, 0.018624f, 0.043900f, -0.012659f, -0.021727f, 0.020604f, -0.079678f, -0.053258f, -0.020825f, -0.005740f, 0.008531f, -0.042564f, -0.038876f, 0.040949f, 0.032567f, -0.025083f, -0.048237f, 0.030576f, 0.000879f, 0.053958f, -0.043967f, -0.010117f, -0.015011f, -0.002760f, -0.034765f, -0.051782f, 0.043453f, -0.032119f, -0.020308f, -0.039577f, -0.008884f, 0.026110f, 0.024514f, -0.015965f, 0.003417f, 0.004585f, 0.032768f, 0.050232f, 0.036956f, -0.064392f, -0.030984f, -0.038202f, -0.009609f, 0.021967f, 0.007985f, -0.044013f, -0.063334f, 0.053654f, 0.003344f, -0.052568f, -0.087325f, 0.044019f, -0.011430f, 0.023695f, 0.021806f, 0.023172f, 0.003007f, 0.017115f, -0.034383f, -0.012968f, 0.023453f, 0.004324f, -0.016154f, 0.009783f, -0.004192f, -0.046219f, 0.023229f, -0.058688f, -0.003957f, -0.002806f, -0.010355f, -0.021022f, -0.008339f, 0.025929f, -0.001906f, -0.005809f, 0.013110f, -0.018886f, 0.057066f, -0.004397f, 0.004955f, -0.004118f, 0.000386f, 0.014406f, -0.001077f, 0.013893f, -0.029399f, 0.006481f, -0.005559f, -0.020216f, 0.001875f, 0.009919f, 0.018841f, -0.009439f, + 0.005098f, -0.048562f, -0.016187f, -0.002485f, -0.025781f, 0.021921f, -0.003183f, -0.005679f, -0.013997f, -0.019868f, -0.029902f, -0.041346f, 0.012300f, -0.003937f, 0.030155f, 0.036381f, 0.022701f, -0.024365f, -0.034552f, -0.043163f, -0.016619f, 0.040152f, 0.032212f, 0.005862f, 0.014860f, -0.013667f, -0.025413f, -0.018777f, -0.018308f, 0.008454f, 0.033605f, 0.041641f, -0.051874f, -0.043547f, 0.123343f, -0.010061f, -0.012173f, -0.018636f, -0.039061f, -0.004365f, 0.044446f, 0.071445f, -0.033048f, -0.020036f, -0.007347f, -0.032694f, -0.008187f, -0.018496f, 0.028370f, -0.029568f, 0.032489f, 0.015381f, -0.011248f, -0.041195f, -0.003076f, -0.017063f, 0.061546f, -0.034008f, -0.000886f, -0.000064f, -0.006195f, 0.027699f, -0.017802f, -0.002505f, 0.012766f, -0.008619f, -0.060205f, 0.030502f, -0.027489f, -0.031977f, -0.007354f, -0.034098f, -0.019727f, -0.061796f, 0.058904f, 0.002507f, -0.039293f, -0.072383f, 0.041996f, -0.042785f, -0.041601f, 0.000351f, -0.032408f, 0.014393f, 0.026628f, 0.081877f, -0.023371f, 0.031924f, -0.006941f, -0.039924f, -0.033760f, -0.010084f, 0.123480f, -0.109174f, -0.007999f, 0.113183f, + -0.103807f, -0.039616f, 0.058427f, -0.008876f, -0.046923f, 0.109434f, -0.054325f, -0.022818f, 0.050330f, 0.012226f, 0.021464f, -0.032782f, 0.036337f, 0.050879f, 0.023943f, -0.013359f, -0.003395f, 0.051376f, -0.007557f, 0.029266f, -0.000730f, 0.020332f, -0.029607f, -0.004159f, 0.013599f, 0.008001f, 0.005677f, 0.001052f, 0.002082f, 0.021168f, -0.009891f, 0.005217f, 0.007951f, 0.006928f, -0.046439f, -0.019467f, 0.014861f, -0.039686f, 0.011828f, 0.022072f, -0.016629f, -0.017912f, -0.013541f, 0.009012f, -0.019036f, 0.022101f, 0.019084f, -0.002902f, 0.011060f, -0.014409f, -0.027974f, -0.027705f, 0.054233f, 0.009323f, 0.033837f, 0.006498f, 0.006700f, 0.020974f, -0.018473f, -0.004856f, 0.034412f, -0.020945f, -0.046890f, 0.034655f, -0.004700f, 0.058698f, -0.073935f, 0.067139f, -0.010990f, -0.041061f, 0.036285f, 0.013011f, -0.006260f, 0.007930f, 0.005280f, -0.007612f, 0.013489f, -0.013947f, -0.018195f, -0.008059f, -0.025361f, -0.021060f, -0.047987f, -0.018118f, 0.042036f, 0.039655f, -0.059761f, 0.020535f, 0.032345f, 0.027168f, -0.009937f, -0.059001f, -0.004970f, -0.029001f, -0.069151f, 0.044281f, + 0.111813f, -0.063539f, -0.006525f, 0.079576f, -0.022081f, -0.027821f, 0.064697f, 0.048152f, 0.023958f, -0.025525f, -0.051405f, 0.017702f, -0.020705f, -0.032324f, 0.116919f, 0.086168f, -0.069891f, -0.051336f, 0.063333f, -0.114351f, -0.039983f, -0.032078f, -0.019403f, 0.080678f, 0.053760f, 0.035529f, 0.038939f, -0.134416f, -0.046651f, 0.128944f, 0.074858f, 0.015681f, -0.033891f, 0.044722f, -0.044843f, -0.091174f, -0.060673f, 0.045151f, -0.033020f, -0.006731f, 0.052303f, 0.096569f, -0.011168f, -0.053673f, 0.007363f, 0.038471f, -0.065113f, -0.023795f, 0.068665f, 0.061886f, 0.061942f, 0.043215f, -0.011848f, -0.038496f, -0.018934f, 0.052686f, 0.015499f, 0.022467f, -0.009611f, 0.006400f, 0.024186f, 0.002634f, -0.009039f, -0.010561f, -0.014488f, 0.012173f, 0.008842f, 0.050599f, 0.014465f, -0.009319f, -0.019508f, 0.005525f, 0.002937f, -0.006756f, -0.017071f, 0.005577f, 0.039159f, -0.040524f, -0.011878f, 0.037846f, -0.008057f, -0.000324f, 0.025175f, -0.008807f, 0.018747f, 0.008399f, 0.021943f, -0.040917f, -0.005504f, 0.009446f, 0.047854f, 0.012179f, 0.023202f, 0.020517f, 0.011421f, -0.008352f, + 0.016130f, 0.023197f, -0.024819f, 0.013287f, -0.114122f, 0.049469f, 0.000618f, -0.011637f, 0.058560f, -0.009886f, -0.044116f, 0.022278f, 0.020297f, 0.057278f, 0.032466f, -0.030866f, 0.001711f, 0.008921f, 0.039242f, 0.009168f, -0.045075f, -0.001656f, -0.002541f, 0.009289f, -0.041931f, -0.045684f, 0.066365f, -0.023811f, -0.069328f, 0.035776f, 0.061600f, -0.034542f, -0.011759f, 0.004144f, 0.042233f, -0.050259f, -0.066118f, 0.018259f, 0.055875f, -0.012000f, -0.023798f, -0.013697f, -0.013604f, 0.024415f, 0.010365f, 0.014635f, 0.140798f, 0.007896f, -0.017989f, 0.002041f, 0.004424f, 0.076164f, 0.002406f, -0.026904f, 0.017129f, -0.059316f, -0.034918f, 0.015545f, 0.000295f, 0.065484f, 0.051874f, -0.033445f, -0.009841f, -0.031609f, 0.001497f, 0.023573f, 0.005934f, 0.007414f, 0.023428f, -0.016687f, -0.069232f, 0.017770f, 0.046704f, -0.021937f, 0.041213f, -0.063934f, 0.030153f, 0.019483f, -0.056195f, 0.009775f, 0.001095f, -0.024344f, 0.002551f, -0.010320f, 0.027914f, 0.027417f, -0.047091f, -0.028862f, 0.062789f, -0.047774f, 0.023080f, -0.004321f, -0.018443f, 0.013954f, -0.001889f, -0.028035f, + 0.016046f, 0.009912f, 0.011482f, -0.000705f, -0.004807f, 0.003305f, 0.008691f, -0.010566f, -0.010215f, 0.008727f, 0.006112f, -0.005754f, -0.000525f, 0.014091f, 0.023377f, -0.013647f, -0.009462f, 0.003193f, -0.004189f, 0.008398f, -0.005800f, -0.002928f, 0.005415f, -0.000060f, 0.014051f, -0.004218f, 0.006938f, -0.017966f, 0.011065f, -0.012461f, 0.011699f, 0.020802f, -0.001815f, 0.000630f, 0.002874f, -0.023408f, 0.039714f, -0.073326f, -0.242134f, -0.286602f, -0.025408f, -0.198645f, 0.078600f, 0.485705f, 0.261454f, 0.394572f, 0.415790f, -0.044744f, -0.119327f, 0.035918f, -0.302178f, -0.369429f, -0.113889f, -0.406719f, -0.326466f, 0.083308f, -0.234734f, -0.063647f, 0.469026f, 0.170090f, 0.331705f, 0.572837f, 0.341052f, 0.152806f, 0.116337f, 0.041000f, -0.254635f, -0.317025f, -0.104396f, -0.433152f, -0.433527f, 0.057612f, -0.324121f, -0.265864f, 0.160424f, -0.272604f, -0.280409f, 0.212370f, 0.086451f, -0.038318f, 0.500661f, 0.468935f, 0.299501f, 0.635610f, 0.598922f, 0.204921f, 0.238589f, 0.186119f, -0.301061f, -0.301703f, -0.381741f, -0.756074f, -0.892650f, -0.641829f, -0.639071f, -0.471215f, + 0.016485f, 0.044008f, 0.311729f, 0.538906f, 0.664019f, 0.605158f, 0.702098f, 0.601722f, 0.354950f, 0.238871f, 0.079719f, -0.118114f, -0.266051f, -0.378535f, -0.325303f, -0.471739f, -0.528527f, -0.438158f, -0.512442f, -0.384317f, 0.061298f, 0.123787f, 0.299071f, 0.599681f, 0.477489f, 0.368197f, 0.278290f, 0.109934f, -0.090519f, -0.073711f, -0.149893f, -0.187538f, -0.143230f, -0.162863f, -0.157456f, -0.066821f, -0.063538f, 0.004032f, 0.097810f, 0.069811f, 0.137191f, 0.164876f, 0.029015f, 0.119744f, 0.114930f, -0.031293f, 0.038455f, 0.027299f, -0.086791f, 0.004284f, 0.028601f, -0.100328f, -0.109767f, -0.153252f, -0.315966f, -0.353164f, -0.274770f, -0.262416f, -0.085768f, 0.129740f, 0.233233f, 0.379348f, 0.571847f, 0.617527f, 0.572566f, 0.401522f, 0.122849f, -0.128547f, -0.275960f, -0.412107f, -0.508994f, -0.500432f, -0.390850f, -0.268027f, -0.127060f, -0.038336f, 0.016957f, 0.047447f, 0.117387f, 0.193187f, 0.199067f, 0.185182f, 0.189983f, 0.135852f, 0.122436f, 0.106558f, 0.044294f, 0.012004f, 0.028633f, 0.025775f, 0.017115f, 0.012841f, -0.020501f, -0.059974f, -0.087314f, -0.100471f, + -0.083436f, -0.049805f, -0.032249f, -0.028664f} + }, + { + {-0.016633f, -0.019806f, 0.010170f, 0.000599f, 0.015348f, 0.005550f, 0.006775f, 0.004337f, 0.006233f, -0.000197f, -0.000204f, -0.003480f, -0.010068f, -0.005835f, 0.002676f, -0.000528f, -0.001858f, -0.001224f, 0.005354f, 0.004137f, 0.000060f, 0.004797f, -0.004514f, -0.011482f, 0.003649f, -0.002700f, 0.001285f, -0.005875f, 0.004583f, -0.004819f, -0.002390f, -0.001931f, 0.008210f, -0.001979f, -0.000091f, -0.003472f, -0.000943f, -0.009315f, 0.003124f, -0.001618f, 0.005007f, -0.004458f, 0.000592f, -0.002135f, -0.007442f, 0.002306f, -0.000742f, -0.002069f, 0.003311f, 0.006060f, -0.001269f, -0.003810f, -0.010883f, 0.000931f, -0.006471f, 0.002941f, 0.000106f, -0.004255f, -0.000171f, -0.001864f, -0.001522f, -0.007915f, 0.005077f, -0.007026f, 0.003845f, -0.002806f, -0.004648f, -0.004024f, -0.008362f, 0.004540f, 0.000427f, 0.002227f, 0.005030f, -0.005432f, -0.008575f, 0.005426f, -0.008217f, 0.000197f, -0.005476f, 0.001679f, -0.004239f, 0.003662f, -0.002144f, 0.001901f, -0.003657f, 0.000592f, -0.001697f, 0.002126f, -0.001753f, -0.002001f, -0.001868f, -0.001840f, -0.003281f, 0.000403f, 0.000807f, -0.000646f, + -0.002585f, 0.001715f, -0.001952f, 0.000199f, -0.001305f, -0.002312f, -0.000825f, -0.000876f, -0.000361f, -0.000570f, -0.000328f, -0.001924f, -0.000999f, 0.000204f, -0.001107f, -0.000669f, -0.000593f, -0.029318f, -0.000353f, -0.003923f, 0.007667f, 0.000111f, 0.002929f, -0.002455f, 0.003797f, 0.000713f, 0.003317f, -0.003419f, 0.018870f, -0.004142f, -0.002693f, -0.008146f, 0.002687f, -0.009829f, -0.003178f, 0.000707f, -0.004795f, -0.000092f, 0.006905f, 0.003948f, 0.002605f, 0.004648f, 0.006707f, -0.008225f, -0.003161f, -0.000181f, 0.004253f, -0.007760f, 0.007517f, -0.006497f, -0.003296f, 0.006026f, -0.001174f, 0.001379f, -0.004836f, 0.005567f, 0.005816f, 0.006254f, -0.009657f, -0.002952f, 0.010379f, -0.000150f, -0.001595f, -0.002343f, 0.011318f, 0.007388f, 0.008750f, 0.000151f, -0.002079f, -0.002630f, -0.000650f, -0.000241f, 0.001262f, 0.003391f, -0.010994f, -0.000992f, -0.005135f, -0.006482f, -0.000876f, 0.001869f, -0.005718f, 0.001523f, -0.004377f, -0.001590f, -0.001787f, -0.000128f, 0.003768f, 0.003523f, -0.002016f, -0.001291f, -0.002516f, -0.008890f, -0.002139f, -0.005506f, 0.000115f, -0.007265f, + 0.001940f, 0.000135f, 0.007321f, -0.002520f, 0.000974f, -0.006357f, 0.000518f, 0.000920f, -0.003013f, -0.003033f, 0.003084f, 0.000132f, 0.000789f, -0.000265f, 0.002149f, -0.000540f, 0.000867f, -0.000332f, -0.000553f, 0.002702f, 0.001173f, 0.001158f, 0.000361f, -0.000247f, 0.009939f, 0.011773f, -0.008215f, 0.001040f, -0.007010f, 0.010785f, 0.001967f, -0.004482f, -0.006347f, -0.005618f, -0.001190f, 0.001352f, 0.002846f, 0.014353f, -0.008566f, -0.001379f, -0.003414f, 0.005612f, -0.016070f, -0.001900f, 0.010215f, -0.000305f, 0.008580f, 0.003781f, 0.006878f, 0.007156f, 0.003102f, -0.001428f, -0.007557f, 0.002463f, -0.002130f, 0.000932f, 0.011949f, 0.002993f, 0.010249f, -0.005422f, -0.002829f, 0.000758f, -0.013838f, 0.001592f, 0.010303f, -0.003061f, 0.000942f, -0.008664f, 0.006502f, -0.000172f, 0.002876f, -0.010249f, 0.005995f, -0.006893f, -0.003850f, -0.007199f, -0.008447f, 0.004829f, 0.001628f, -0.002757f, -0.004334f, -0.004107f, -0.003021f, -0.002066f, 0.004750f, -0.004753f, -0.008580f, -0.013213f, 0.012182f, 0.009339f, 0.000487f, -0.013218f, 0.003990f, -0.006351f, 0.005179f, -0.004299f, + 0.000928f, -0.008107f, -0.005108f, -0.010553f, -0.004778f, -0.001494f, 0.010269f, 0.006107f, -0.011492f, 0.004959f, 0.000242f, -0.001015f, 0.005008f, -0.000697f, 0.003975f, 0.008152f, 0.000417f, 0.001707f, 0.005406f, 0.001106f, 0.001073f, 0.005342f, -0.000950f, -0.000154f, 0.000403f, 0.000687f, 0.001131f, 0.001321f, -0.001200f, 0.001544f, -0.001124f, 0.000386f, 0.000263f, 0.001366f, 0.000314f, 0.003382f, 0.002958f, 0.000207f, -0.000165f, 0.003320f, 0.001696f, -0.002502f, 0.000475f, 0.001196f, 0.049848f, -0.018438f, 0.022361f, -0.017670f, 0.001573f, 0.005349f, 0.005287f, -0.014578f, -0.004919f, -0.004860f, -0.024450f, -0.000079f, 0.001344f, -0.008775f, -0.001381f, -0.000052f, 0.017563f, 0.003293f, -0.012172f, 0.008977f, 0.009786f, 0.002229f, 0.017803f, -0.013150f, -0.004788f, -0.007002f, 0.003794f, 0.014280f, -0.000988f, 0.000952f, 0.005336f, -0.002489f, 0.006400f, 0.002926f, 0.016295f, -0.002398f, 0.006413f, -0.010592f, 0.009757f, -0.007399f, 0.010888f, -0.000139f, -0.011301f, -0.001648f, 0.016425f, -0.000669f, 0.011126f, 0.006711f, 0.010702f, 0.001006f, -0.008398f, -0.006808f, + 0.000216f, -0.005045f, 0.008792f, 0.005862f, -0.008624f, 0.001253f, -0.006730f, 0.011613f, -0.003105f, 0.009329f, 0.011107f, 0.001998f, 0.011448f, -0.000466f, -0.005494f, -0.001820f, -0.007012f, 0.000384f, 0.015031f, -0.009340f, -0.009589f, -0.003578f, 0.004294f, -0.006525f, -0.004044f, 0.002969f, 0.007240f, -0.002926f, 0.002683f, -0.014474f, 0.003617f, 0.001011f, -0.001003f, 0.005160f, 0.000360f, 0.001439f, 0.003496f, -0.000374f, -0.001846f, 0.001636f, -0.003314f, 0.001120f, -0.001360f, 0.000491f, 0.000670f, -0.000446f, -0.001132f, -0.002836f, -0.000196f, -0.002244f, -0.001411f, -0.000905f, -0.004976f, -0.041467f, 0.004546f, -0.012207f, -0.008728f, -0.013388f, -0.016231f, 0.006409f, 0.014523f, -0.002184f, 0.005650f, 0.002304f, 0.007460f, 0.001695f, 0.000550f, 0.004505f, -0.008885f, 0.020609f, -0.001069f, -0.011992f, 0.013526f, -0.004131f, 0.005743f, -0.013518f, -0.008412f, -0.009578f, 0.004150f, 0.002520f, 0.010583f, 0.000323f, -0.006575f, 0.001108f, -0.005871f, -0.006453f, -0.007161f, -0.002488f, -0.009970f, -0.005052f, 0.009287f, -0.008648f, -0.000615f, -0.006766f, -0.010583f, -0.004715f, + 0.001320f, 0.003388f, 0.006709f, -0.005329f, -0.004892f, 0.006635f, 0.001151f, 0.002496f, 0.001753f, 0.004106f, 0.006217f, -0.010129f, -0.003403f, -0.001032f, -0.014207f, 0.003757f, -0.001015f, 0.008306f, -0.008339f, -0.006362f, -0.007797f, 0.001334f, 0.008782f, 0.006806f, 0.015506f, 0.010414f, -0.009624f, 0.003892f, -0.004377f, 0.007341f, 0.004571f, -0.010387f, 0.007452f, 0.002005f, -0.011549f, 0.001477f, -0.002133f, 0.000980f, -0.002197f, -0.007876f, 0.001403f, -0.005653f, -0.005975f, 0.002168f, -0.003307f, 0.001358f, 0.004180f, -0.002838f, -0.003818f, -0.003931f, -0.005913f, -0.001100f, 0.004476f, -0.001207f, 0.004656f, 0.000031f, 0.003127f, 0.002153f, 0.001601f, -0.002108f, -0.000880f, 0.000800f, -0.002104f, -0.002293f, 0.000478f, -0.002213f, -0.000912f, 0.000594f, -0.004187f, 0.002310f, -0.002176f, -0.000722f, 0.000408f, -0.000149f, 0.000261f, 0.001330f, -0.001908f, 0.001183f, 0.002696f, -0.052805f, 0.014498f, -0.015749f, -0.013122f, -0.009438f, 0.001780f, -0.002746f, 0.031105f, 0.003065f, 0.007442f, -0.003465f, 0.000119f, -0.012776f, 0.012689f, 0.003709f, -0.001851f, 0.002553f, + 0.016565f, -0.008295f, -0.002871f, 0.003829f, 0.001142f, 0.008322f, -0.007247f, -0.003252f, 0.009132f, 0.003361f, 0.008411f, 0.001012f, -0.008950f, -0.005849f, 0.005025f, -0.000866f, -0.003052f, -0.005577f, -0.003241f, -0.000364f, 0.015682f, 0.003970f, -0.002863f, 0.000334f, 0.001136f, -0.004760f, 0.011287f, 0.008665f, -0.002725f, -0.011881f, 0.002944f, -0.006289f, 0.010732f, 0.008366f, -0.008425f, 0.003278f, -0.010901f, -0.009678f, -0.008556f, -0.010680f, -0.003739f, 0.002361f, -0.006476f, 0.000534f, -0.007150f, -0.006011f, 0.012342f, 0.007888f, -0.010566f, -0.014184f, 0.001530f, 0.012085f, -0.009394f, -0.006918f, 0.010139f, 0.008035f, 0.011572f, -0.007509f, -0.000407f, 0.003292f, 0.004722f, 0.013087f, 0.003453f, -0.001713f, -0.000591f, -0.009537f, -0.001525f, -0.000174f, -0.008280f, 0.000597f, -0.002510f, -0.003737f, 0.000059f, -0.001108f, 0.003932f, -0.000971f, -0.001683f, 0.001915f, -0.001337f, -0.003412f, -0.002357f, 0.000714f, 0.003142f, -0.001564f, -0.001342f, 0.000096f, -0.000934f, 0.006128f, 0.000976f, 0.007946f, -0.005760f, 0.001431f, 0.000271f, -0.003321f, -0.000223f, -0.000282f, + -0.004408f, 0.001073f, -0.000969f, -0.004722f, -0.004534f, -0.002297f, -0.004347f, -0.003208f, 0.000938f, -0.002099f, -0.027790f, -0.002738f, 0.004702f, 0.013542f, -0.002614f, -0.007070f, 0.003192f, 0.019890f, -0.025007f, 0.005818f, -0.005057f, -0.004633f, -0.011243f, 0.006785f, -0.020033f, -0.013046f, 0.006922f, -0.010476f, 0.006371f, 0.028587f, -0.005028f, 0.011559f, -0.013410f, 0.013808f, -0.003556f, 0.004123f, -0.012023f, 0.005634f, 0.003455f, -0.006455f, 0.002874f, -0.001299f, -0.006166f, -0.000410f, 0.007885f, 0.012306f, -0.009597f, -0.015363f, -0.012138f, -0.011277f, 0.001500f, 0.009022f, 0.023938f, -0.000273f, 0.016135f, 0.016808f, -0.015596f, 0.012024f, -0.022957f, -0.008411f, 0.001501f, -0.010232f, -0.009490f, 0.006378f, -0.022228f, -0.004404f, 0.015545f, -0.006689f, -0.005781f, 0.002043f, -0.006757f, 0.006332f, -0.006703f, 0.010865f, 0.014091f, -0.003895f, 0.004414f, 0.000579f, -0.014167f, 0.001218f, -0.009151f, -0.006350f, -0.011181f, 0.006384f, 0.004941f, -0.010797f, 0.000929f, 0.008035f, 0.007528f, 0.009520f, 0.009873f, -0.001508f, -0.009281f, 0.007733f, 0.004105f, 0.004629f, + 0.002585f, 0.005591f, -0.000579f, -0.000189f, 0.000877f, 0.002297f, 0.002769f, -0.003829f, -0.001119f, -0.003090f, -0.001993f, 0.004487f, 0.003917f, 0.004332f, -0.007814f, 0.001606f, -0.000925f, -0.003250f, -0.003744f, 0.004058f, -0.002449f, -0.004306f, 0.001152f, 0.001016f, -0.001356f, 0.009576f, 0.003242f, -0.001882f, -0.002057f, -0.004452f, -0.001168f, 0.003914f, 0.006029f, 0.001498f, 0.000080f, 0.006002f, 0.066013f, -0.003078f, -0.025956f, -0.003157f, -0.001034f, 0.002606f, 0.008414f, 0.003496f, -0.002909f, -0.002596f, -0.013013f, -0.006106f, 0.007471f, 0.016214f, -0.013082f, -0.008189f, 0.010867f, 0.000987f, -0.003753f, 0.004422f, -0.000933f, -0.015161f, -0.015436f, 0.021289f, -0.001852f, -0.001229f, -0.003415f, 0.010994f, -0.000719f, 0.001268f, 0.007049f, -0.011476f, 0.012432f, 0.005242f, 0.002134f, 0.004823f, 0.012428f, -0.029454f, -0.013110f, -0.007069f, 0.027391f, 0.003646f, 0.002175f, -0.008267f, -0.009114f, 0.008287f, -0.001092f, 0.009588f, -0.003230f, -0.018776f, 0.002167f, 0.002439f, -0.002723f, 0.009316f, 0.004266f, 0.002596f, 0.015254f, 0.036964f, -0.002772f, -0.002984f, + 0.014173f, 0.004392f, -0.004206f, 0.009767f, 0.028811f, -0.003090f, 0.005634f, 0.010507f, 0.008491f, 0.007585f, 0.007768f, 0.008645f, 0.006717f, -0.007452f, 0.011591f, 0.020570f, -0.004574f, 0.007964f, 0.000266f, -0.002453f, -0.013994f, 0.008945f, 0.003496f, -0.001033f, 0.004442f, 0.005025f, 0.001328f, 0.000686f, -0.004610f, -0.005369f, -0.002001f, -0.010811f, -0.004695f, -0.007290f, 0.009656f, 0.004766f, 0.003772f, -0.001428f, -0.001266f, 0.000670f, -0.006117f, 0.000123f, 0.002475f, -0.008569f, 0.007776f, -0.003676f, 0.001522f, -0.002550f, 0.000585f, 0.002986f, 0.003631f, -0.006661f, -0.006519f, -0.005472f, 0.000928f, -0.001055f, -0.001681f, -0.000418f, 0.004868f, -0.001145f, 0.000669f, -0.002687f, -0.005767f, -0.003153f, 0.013326f, 0.014838f, -0.018847f, -0.005450f, -0.015997f, 0.015888f, 0.029737f, -0.014205f, -0.003321f, -0.016300f, -0.007080f, -0.019729f, 0.014101f, -0.012033f, -0.004890f, -0.001249f, 0.000154f, -0.007834f, -0.009666f, 0.017770f, -0.016088f, -0.005918f, 0.001853f, 0.012137f, 0.012937f, -0.018526f, -0.005446f, 0.007171f, -0.015953f, 0.009104f, -0.012655f, -0.005122f, + 0.004674f, 0.000413f, -0.006922f, -0.001887f, 0.003822f, 0.020778f, 0.002570f, 0.004726f, 0.000009f, -0.017685f, 0.019375f, -0.009457f, -0.014524f, 0.011673f, -0.010354f, -0.011667f, 0.015270f, -0.006857f, 0.001954f, -0.003326f, 0.002051f, 0.020122f, -0.003436f, 0.004554f, -0.017552f, -0.001323f, 0.020426f, 0.004626f, 0.020236f, 0.017388f, -0.005710f, -0.004377f, -0.023552f, 0.003678f, -0.003966f, 0.015672f, 0.019118f, -0.010932f, 0.004753f, -0.034522f, -0.009471f, 0.011526f, -0.011964f, 0.017993f, 0.001190f, 0.003942f, -0.006364f, -0.001269f, -0.008315f, 0.001541f, -0.005738f, 0.012731f, 0.012426f, -0.000490f, 0.004218f, -0.000115f, 0.007011f, 0.003116f, 0.005071f, 0.010775f, -0.003247f, -0.011951f, 0.005496f, 0.002822f, 0.007596f, -0.001901f, 0.008060f, -0.001567f, -0.002844f, 0.002128f, -0.004903f, -0.003144f, 0.000790f, -0.008365f, 0.002325f, -0.002849f, 0.007459f, 0.003339f, -0.000594f, -0.001496f, -0.004990f, -0.007398f, -0.000646f, 0.001122f, 0.002999f, -0.002647f, 0.001631f, -0.006946f, -0.000146f, 0.000536f, -0.003779f, 0.004846f, 0.000424f, 0.000229f, 0.001957f, -0.002188f, + 0.000312f, 0.000168f, 0.011933f, -0.015150f, 0.005203f, -0.014166f, -0.001534f, -0.019139f, 0.031473f, -0.009248f, 0.002152f, -0.009919f, -0.028685f, 0.016559f, 0.005807f, -0.021401f, 0.013273f, -0.009632f, -0.007091f, 0.007508f, 0.029791f, -0.014846f, 0.028780f, -0.000547f, -0.020208f, 0.000870f, 0.006734f, -0.017770f, 0.019651f, -0.010281f, 0.014555f, 0.031634f, 0.003104f, -0.014742f, -0.004120f, -0.001659f, 0.007260f, -0.012532f, -0.006846f, -0.001667f, 0.015594f, -0.005533f, -0.006245f, -0.020662f, -0.000689f, -0.024433f, -0.004496f, 0.027757f, -0.006206f, 0.015822f, 0.001513f, 0.004249f, -0.036319f, 0.000539f, -0.023233f, 0.018771f, 0.032575f, 0.010090f, 0.008200f, 0.002069f, 0.004899f, -0.018939f, 0.006714f, 0.010196f, -0.008437f, -0.002314f, -0.007476f, -0.004721f, 0.014699f, 0.000392f, 0.017825f, 0.054607f, 0.019949f, 0.005508f, -0.018709f, -0.017348f, -0.011259f, 0.010786f, -0.018524f, -0.001544f, -0.001663f, 0.003867f, 0.010524f, -0.010106f, -0.001890f, 0.010216f, 0.011167f, 0.002367f, 0.001930f, 0.007651f, 0.009620f, 0.008084f, -0.000061f, -0.001697f, -0.001770f, 0.000925f, + -0.003933f, -0.004865f, 0.004375f, -0.002419f, 0.006784f, -0.008183f, -0.002587f, 0.005803f, 0.004890f, -0.000405f, 0.004421f, -0.004168f, 0.002032f, 0.003098f, 0.004107f, -0.004583f, -0.004566f, 0.006563f, 0.004654f, 0.003726f, -0.001643f, -0.003166f, 0.001597f, -0.009113f, -0.002391f, 0.001573f, -0.004880f, 0.002340f, -0.003380f, -0.002295f, 0.001068f, 0.000849f, -0.000754f, -0.001724f, -0.006835f, 0.056990f, -0.030863f, -0.000846f, -0.015337f, -0.028926f, -0.038605f, 0.010686f, -0.012385f, 0.011316f, -0.036543f, 0.007155f, 0.013006f, 0.011702f, -0.015366f, -0.033551f, -0.026433f, -0.022198f, 0.000245f, -0.012929f, -0.024514f, -0.016880f, -0.008613f, -0.020027f, -0.013997f, 0.003266f, 0.025175f, -0.000751f, 0.003524f, -0.001004f, -0.022292f, 0.013563f, -0.002109f, 0.003890f, -0.005049f, -0.014822f, 0.012407f, -0.018456f, -0.025719f, 0.022800f, -0.025095f, 0.004782f, -0.000339f, -0.035188f, -0.021037f, 0.013517f, -0.000746f, 0.016659f, -0.011312f, -0.037377f, -0.000275f, 0.001096f, 0.013751f, 0.014622f, 0.034625f, -0.020348f, -0.071733f, -0.025257f, -0.024555f, 0.015807f, -0.046785f, -0.016007f, + -0.007917f, -0.042988f, -0.014389f, -0.000967f, -0.008281f, -0.008264f, 0.009197f, -0.011776f, -0.001156f, -0.011064f, 0.009912f, -0.025391f, 0.008929f, 0.019959f, -0.025592f, -0.013047f, 0.012400f, 0.009608f, 0.008323f, -0.026311f, 0.006056f, 0.000062f, -0.003822f, 0.013577f, -0.003619f, 0.011122f, 0.009906f, -0.002501f, 0.002985f, 0.001945f, -0.003285f, -0.008921f, 0.014099f, -0.004916f, -0.010156f, 0.000067f, -0.000540f, 0.007379f, 0.002560f, -0.000217f, 0.002232f, -0.007757f, -0.007826f, 0.000623f, 0.002548f, 0.004329f, 0.008012f, -0.001191f, 0.003582f, -0.001046f, 0.003150f, -0.008988f, -0.003950f, -0.006306f, -0.005737f, -0.001154f, -0.001345f, 0.002988f, -0.010079f, -0.004735f, -0.007583f, -0.005497f, -0.010554f, -0.012999f, -0.011513f, -0.001445f, -0.001187f, 0.001165f, -0.007143f, -0.009188f, -0.033087f, 0.012997f, 0.016265f, -0.005517f, -0.006416f, -0.016534f, -0.018216f, 0.041897f, 0.015247f, -0.039247f, 0.013523f, -0.021418f, -0.002065f, -0.019468f, -0.040268f, 0.011742f, -0.020992f, -0.008857f, 0.001651f, 0.001100f, -0.010254f, -0.034121f, -0.021110f, 0.016620f, -0.020869f, -0.000657f, + -0.018456f, -0.028412f, -0.011019f, 0.031376f, 0.005061f, 0.005519f, -0.027406f, -0.009280f, -0.005589f, -0.003659f, 0.011182f, 0.013706f, 0.017815f, 0.021918f, -0.010695f, 0.012316f, 0.004389f, -0.012794f, 0.007862f, -0.021443f, -0.018543f, -0.016170f, 0.007009f, -0.018668f, 0.000975f, -0.028027f, -0.024422f, -0.012712f, 0.029063f, 0.022542f, 0.022113f, 0.024203f, -0.022248f, 0.030347f, 0.001132f, 0.013936f, 0.041968f, -0.008684f, -0.007563f, 0.006730f, -0.019995f, 0.008222f, -0.009302f, -0.026103f, 0.003568f, 0.021170f, -0.024950f, -0.018010f, -0.002882f, 0.022752f, -0.018895f, 0.002086f, 0.007261f, 0.013636f, 0.003677f, -0.005793f, -0.012784f, 0.003385f, 0.009992f, -0.005470f, 0.001509f, -0.006861f, 0.002440f, -0.006533f, 0.002858f, 0.000278f, 0.003907f, -0.002578f, 0.002807f, 0.004468f, 0.012134f, -0.001672f, 0.000088f, 0.000789f, 0.005857f, -0.008949f, -0.003275f, -0.009841f, -0.002313f, -0.002370f, -0.010651f, 0.001871f, 0.010436f, -0.001125f, -0.012733f, -0.002473f, -0.000747f, -0.011693f, -0.012424f, -0.019072f, -0.007320f, 0.006948f, 0.001674f, 0.004830f, -0.002332f, -0.003662f, + -0.006223f, -0.001275f, -0.015987f, -0.003307f, 0.010493f, 0.015459f, -0.000206f, 0.004431f, -0.008762f, -0.015632f, -0.036692f, 0.042351f, -0.032774f, 0.043852f, 0.024613f, 0.016817f, 0.009516f, 0.017344f, 0.018803f, 0.017419f, 0.047098f, -0.016243f, 0.003469f, -0.002948f, -0.007944f, -0.001234f, 0.005972f, -0.004168f, 0.009180f, -0.002851f, 0.014827f, 0.012511f, -0.002501f, -0.007933f, -0.046643f, -0.016467f, -0.033798f, -0.001366f, 0.018024f, 0.018252f, 0.005871f, 0.009400f, 0.013614f, 0.011351f, 0.013196f, 0.033715f, 0.050094f, 0.033738f, 0.006877f, -0.006146f, -0.009544f, -0.014137f, 0.017593f, 0.018023f, 0.020071f, -0.014636f, -0.011605f, -0.018204f, -0.002949f, 0.024572f, 0.000327f, 0.029403f, -0.017610f, 0.015854f, 0.009499f, 0.026414f, -0.054669f, -0.038982f, -0.015983f, -0.021778f, -0.022439f, 0.006986f, -0.009124f, 0.034691f, 0.010290f, -0.038185f, -0.003112f, 0.062405f, -0.020908f, 0.019626f, -0.009348f, 0.025790f, -0.011861f, -0.007531f, 0.000954f, -0.010314f, -0.013839f, -0.000753f, 0.010479f, 0.015628f, 0.010747f, -0.003790f, 0.012112f, -0.002969f, 0.005608f, -0.015589f, + -0.010773f, 0.010403f, 0.006457f, -0.015672f, -0.006943f, -0.006506f, -0.002143f, 0.004215f, -0.004205f, -0.007551f, 0.003579f, 0.000965f, 0.002584f, -0.000996f, -0.004532f, 0.007329f, 0.002272f, -0.003751f, 0.009316f, -0.001052f, 0.002704f, -0.001486f, 0.010981f, -0.009119f, 0.009766f, 0.004574f, -0.009308f, 0.006365f, 0.000249f, 0.001892f, -0.009718f, -0.027855f, 0.010443f, 0.000503f, 0.001931f, -0.002964f, 0.010599f, -0.002341f, -0.005140f, 0.003688f, 0.008236f, 0.007204f, -0.004297f, 0.008870f, -0.027011f, -0.013532f, 0.022342f, 0.009752f, 0.016469f, 0.043024f, 0.003644f, 0.028745f, 0.042005f, 0.029185f, -0.019076f, -0.042780f, -0.001490f, -0.019648f, 0.046063f, 0.013263f, 0.035973f, -0.005163f, -0.019374f, -0.007132f, -0.021138f, 0.008303f, -0.016284f, 0.001941f, -0.018134f, 0.009386f, -0.013272f, -0.005569f, -0.029084f, -0.028760f, -0.002935f, -0.041194f, 0.022464f, 0.015521f, -0.012412f, 0.021070f, -0.010132f, 0.008183f, 0.023374f, -0.026052f, -0.034227f, 0.006050f, -0.007562f, 0.057270f, 0.024230f, -0.062894f, -0.017089f, -0.017871f, -0.032555f, -0.034362f, -0.070352f, 0.012354f, + -0.025292f, -0.006618f, 0.009938f, 0.002525f, 0.014325f, -0.002819f, -0.008449f, -0.053262f, 0.006188f, -0.024233f, 0.006395f, 0.031178f, 0.006422f, 0.020896f, -0.031866f, -0.042132f, 0.008354f, 0.026070f, 0.017414f, 0.009774f, 0.016534f, 0.027107f, 0.033780f, 0.034883f, -0.031203f, -0.018705f, -0.022530f, -0.016011f, -0.026277f, 0.036808f, 0.021405f, 0.020748f, 0.005496f, 0.015865f, 0.013413f, -0.001308f, 0.019056f, -0.029678f, -0.010634f, -0.003548f, 0.002239f, -0.006425f, -0.021241f, 0.001201f, -0.004463f, 0.002740f, 0.006625f, 0.021517f, 0.000985f, 0.010074f, 0.009875f, 0.001623f, 0.010493f, 0.000369f, -0.006708f, 0.001331f, -0.016366f, -0.006539f, 0.008393f, 0.012431f, 0.003587f, 0.002299f, -0.019976f, -0.001884f, 0.000459f, -0.009461f, -0.006821f, 0.002967f, 0.006086f, -0.018086f, -0.020310f, -0.009102f, 0.006546f, 0.005873f, 0.009977f, 0.002507f, -0.006667f, 0.004558f, -0.021031f, -0.018400f, 0.076007f, 0.050197f, 0.069737f, 0.004511f, -0.013835f, -0.047400f, -0.013985f, 0.007910f, 0.010991f, -0.011316f, -0.036625f, -0.013258f, 0.060256f, 0.024894f, -0.008340f, 0.018431f, + -0.001365f, -0.022169f, -0.006471f, -0.014477f, 0.041084f, -0.003190f, 0.002408f, 0.017700f, 0.001162f, 0.020088f, -0.000213f, 0.028449f, -0.026217f, 0.032784f, 0.006644f, -0.015330f, -0.009252f, -0.016978f, 0.029630f, -0.041107f, -0.044342f, 0.027991f, 0.046368f, 0.002124f, 0.032007f, 0.043968f, -0.049575f, 0.016441f, 0.010125f, -0.002783f, -0.000457f, 0.007296f, -0.018613f, 0.034498f, -0.020984f, -0.016744f, 0.013956f, 0.001687f, -0.003758f, -0.008117f, -0.010345f, 0.004906f, -0.032754f, -0.009890f, 0.026356f, -0.032389f, -0.007456f, -0.021910f, 0.000803f, 0.065270f, -0.020552f, 0.004103f, 0.017471f, 0.000220f, -0.015071f, -0.040938f, 0.039872f, 0.018499f, -0.082262f, 0.020263f, 0.020672f, 0.015182f, -0.018469f, -0.008716f, 0.041980f, 0.001754f, 0.003064f, 0.010635f, -0.029254f, 0.000975f, 0.018557f, -0.007745f, 0.010706f, -0.002492f, -0.009539f, -0.024523f, 0.003669f, -0.003372f, 0.022532f, -0.002279f, -0.001012f, -0.016406f, 0.017834f, -0.006210f, -0.006279f, -0.025909f, -0.012989f, 0.008834f, -0.016623f, 0.001154f, -0.008233f, 0.010062f, -0.009772f, -0.020915f, 0.010363f, -0.022521f, + -0.006202f, -0.010377f, 0.000942f, 0.001097f, -0.008472f, 0.021938f, -0.002863f, 0.029665f, 0.018143f, -0.003304f, 0.003011f, 0.018857f, -0.013428f, 0.003116f, 0.002121f, 0.018061f, -0.016818f, -0.010213f, -0.033474f, -0.080908f, 0.072904f, 0.043659f, 0.023445f, 0.016640f, 0.036259f, -0.081647f, 0.034210f, 0.038429f, 0.016726f, -0.052088f, 0.029741f, 0.053661f, 0.025118f, 0.059120f, 0.021858f, 0.001505f, -0.001852f, -0.001335f, -0.009513f, 0.025343f, 0.042118f, 0.040172f, 0.014334f, -0.011683f, -0.020225f, 0.005453f, -0.018374f, -0.021546f, 0.023660f, 0.016461f, 0.004874f, -0.021594f, -0.021052f, -0.004217f, -0.018246f, 0.010045f, 0.048315f, -0.008003f, -0.015033f, 0.016665f, 0.009115f, 0.014691f, 0.017154f, -0.003154f, -0.009229f, 0.038968f, 0.025875f, 0.013083f, 0.017397f, -0.002591f, -0.037799f, 0.009374f, 0.025863f, 0.003806f, -0.028034f, 0.038574f, 0.010335f, 0.053459f, 0.002370f, 0.048108f, 0.005489f, -0.015095f, -0.004674f, 0.011924f, 0.068152f, -0.008054f, 0.024742f, 0.017204f, 0.032398f, 0.017277f, 0.000523f, -0.001554f, 0.021258f, 0.096918f, 0.004875f, 0.039183f, + -0.032328f, -0.023912f, 0.012602f, 0.015660f, 0.019140f, 0.008227f, 0.003426f, -0.046889f, -0.018410f, -0.049191f, 0.003040f, -0.008042f, -0.016089f, -0.013405f, -0.005208f, -0.020475f, 0.002943f, -0.001691f, -0.021739f, 0.016242f, -0.025377f, -0.011991f, -0.022891f, -0.015372f, -0.001247f, 0.003023f, -0.018270f, -0.021047f, 0.005434f, 0.014142f, 0.016223f, -0.002790f, -0.005874f, -0.027223f, -0.035955f, 0.004071f, 0.004649f, -0.016046f, 0.033142f, 0.032311f, 0.047357f, 0.016980f, -0.010189f, 0.006876f, 0.014744f, 0.018277f, 0.021592f, 0.003583f, -0.022197f, 0.006050f, 0.028785f, 0.015080f, 0.001599f, 0.011863f, -0.053173f, 0.058037f, -0.001011f, 0.051362f, 0.001138f, 0.003395f, -0.046869f, -0.014457f, -0.021170f, 0.035625f, 0.008936f, 0.015753f, 0.009282f, -0.035949f, 0.003393f, 0.002822f, -0.031679f, -0.045159f, -0.046267f, 0.015576f, -0.017315f, 0.041962f, 0.002232f, -0.013342f, -0.011090f, 0.009044f, -0.016455f, 0.002706f, 0.012109f, -0.017665f, 0.009716f, 0.014165f, 0.004612f, 0.004062f, 0.031544f, 0.053426f, -0.010686f, -0.000397f, 0.026602f, 0.022004f, 0.031902f, -0.023805f, + -0.009588f, 0.009726f, -0.032202f, 0.003166f, 0.002527f, -0.042387f, 0.054451f, -0.002628f, 0.027353f, 0.023892f, 0.016457f, -0.032223f, 0.002797f, 0.027656f, -0.022712f, 0.049174f, 0.013223f, -0.017879f, 0.040339f, 0.030693f, 0.021092f, -0.068284f, -0.014198f, 0.013694f, -0.023616f, 0.003765f, -0.038403f, -0.009458f, -0.058061f, -0.016442f, -0.009115f, -0.015865f, -0.064317f, -0.006331f, -0.017767f, 0.096332f, -0.014141f, 0.019706f, -0.010171f, 0.015509f, -0.008366f, -0.015589f, 0.010112f, -0.013046f, -0.002322f, -0.006952f, 0.025562f, 0.009429f, 0.011075f, -0.041410f, -0.037464f, -0.027612f, -0.011856f, 0.007528f, -0.052547f, -0.008233f, -0.004502f, 0.004105f, 0.018830f, 0.014681f, -0.001862f, 0.020487f, -0.018592f, 0.000643f, 0.000801f, -0.029854f, -0.041860f, 0.008451f, -0.012459f, -0.038295f, -0.010878f, -0.017885f, 0.002328f, -0.040937f, -0.005007f, -0.017698f, 0.024035f, 0.000719f, -0.017900f, -0.006084f, 0.007278f, 0.009970f, -0.004248f, 0.018967f, -0.019129f, -0.011321f, 0.023803f, 0.023387f, 0.029967f, 0.026322f, 0.019616f, -0.014221f, 0.012272f, 0.032857f, 0.031729f, 0.013973f, + -0.038248f, -0.044394f, 0.019782f, -0.006078f, 0.014324f, -0.008138f, 0.037761f, -0.028090f, -0.005751f, -0.009662f, 0.032949f, -0.024666f, 0.057717f, 0.070913f, 0.072356f, 0.004500f, -0.013326f, 0.011785f, -0.009309f, 0.017736f, -0.002997f, -0.000350f, -0.021092f, -0.057963f, -0.019234f, -0.055509f, 0.031946f, 0.030034f, -0.034146f, -0.025575f, -0.034230f, -0.015990f, -0.004861f, 0.075808f, 0.000987f, -0.038591f, -0.041425f, -0.002449f, 0.053069f, 0.025369f, -0.106074f, -0.021605f, -0.018668f, 0.014026f, 0.040015f, -0.046053f, -0.014498f, -0.027400f, 0.012174f, -0.062864f, 0.031412f, -0.010434f, -0.001303f, 0.017526f, 0.002718f, -0.030754f, 0.062242f, -0.006162f, 0.029687f, 0.066564f, 0.136451f, 0.081813f, -0.001848f, 0.045990f, 0.069669f, 0.089476f, 0.097066f, 0.027797f, 0.059525f, 0.017052f, 0.000935f, 0.036516f, -0.028506f, 0.059865f, 0.025812f, -0.025919f, -0.088959f, -0.064780f, 0.008652f, -0.025272f, -0.018086f, -0.016369f, -0.009675f, -0.010856f, -0.036510f, -0.023941f, 0.001587f, -0.005576f, -0.001786f, -0.011450f, -0.003019f, -0.019020f, 0.024006f, -0.039514f, -0.015964f, 0.011611f, + 0.007567f, 0.003706f, -0.009962f, -0.012259f, -0.006719f, 0.008133f, -0.006026f, 0.020580f, -0.023702f, -0.029976f, -0.029866f, -0.018456f, 0.023308f, 0.025928f, -0.009323f, -0.004340f, 0.009736f, -0.004768f, 0.043113f, 0.009430f, 0.004135f, 0.034409f, 0.021851f, 0.019754f, 0.048941f, 0.032073f, 0.036930f, 0.011554f, 0.018017f, 0.040242f, 0.015892f, 0.016713f, -0.013380f, -0.030292f, 0.035251f, -0.044046f, 0.074158f, -0.008587f, -0.013425f, 0.001517f, 0.059088f, -0.039215f, -0.006800f, -0.001571f, 0.000950f, 0.021533f, -0.015104f, 0.030988f, 0.010859f, -0.005658f, 0.007312f, 0.003684f, 0.024380f, -0.074017f, -0.023238f, -0.002129f, 0.007995f, -0.007197f, -0.053899f, 0.044487f, -0.002317f, 0.006199f, 0.016200f, -0.035131f, -0.015938f, -0.081690f, 0.021807f, -0.019050f, 0.015806f, 0.059859f, -0.016270f, 0.012640f, -0.007585f, 0.028594f, -0.048744f, -0.065259f, 0.057367f, -0.005281f, 0.005029f, 0.009790f, 0.057699f, 0.042059f, 0.050090f, -0.000781f, -0.066811f, 0.039780f, 0.018743f, -0.015739f, -0.023574f, 0.038022f, -0.006850f, 0.048054f, 0.079483f, 0.061777f, 0.010607f, 0.005441f, + 0.058661f, -0.011498f, 0.018081f, 0.048246f, -0.032721f, 0.055775f, 0.034201f, 0.019919f, -0.039298f, -0.019408f, -0.052470f, -0.001480f, 0.018130f, 0.078305f, 0.033057f, -0.072608f, -0.006616f, 0.047050f, -0.006802f, 0.022934f, 0.031572f, -0.051475f, -0.012655f, 0.025226f, 0.006149f, 0.014130f, -0.022428f, 0.016787f, 0.028441f, 0.003752f, 0.000488f, 0.041586f, 0.007996f, -0.008886f, -0.010711f, 0.013847f, -0.003600f, 0.022375f, 0.003583f, 0.016949f, 0.019263f, -0.002852f, -0.019857f, 0.040935f, -0.005820f, -0.012485f, -0.002584f, -0.027698f, -0.027863f, -0.018275f, -0.019287f, 0.013336f, 0.024245f, -0.024278f, -0.020805f, 0.004897f, 0.036403f, -0.052467f, -0.012710f, 0.020322f, -0.006204f, 0.000171f, -0.007129f, -0.005639f, -0.037725f, -0.000494f, -0.010044f, 0.010489f, 0.002922f, 0.006312f, 0.000442f, 0.003299f, -0.002986f, -0.102796f, 0.023477f, -0.017053f, -0.004098f, 0.080188f, 0.034418f, -0.025195f, -0.019556f, -0.000337f, -0.051977f, -0.063608f, 0.005293f, 0.000530f, -0.035863f, 0.037946f, 0.004510f, -0.036711f, 0.023098f, 0.069004f, -0.009347f, -0.039768f, 0.024867f, -0.023417f, + -0.025629f, 0.012883f, 0.055940f, -0.018243f, 0.008092f, 0.015381f, -0.017409f, -0.041715f, -0.027506f, 0.055370f, 0.019346f, -0.054550f, 0.046548f, 0.018337f, -0.037539f, -0.019518f, 0.076733f, -0.024972f, -0.059149f, -0.030279f, 0.102026f, -0.100834f, -0.046915f, 0.059903f, -0.027256f, -0.032391f, -0.096295f, 0.075041f, -0.061725f, 0.022094f, 0.003015f, -0.011483f, -0.108735f, -0.032020f, 0.092718f, 0.058656f, -0.073635f, -0.020037f, -0.032004f, -0.014970f, 0.014852f, 0.020262f, 0.023979f, -0.128152f, 0.069931f, 0.053875f, 0.056228f, 0.000972f, 0.029326f, -0.062649f, -0.056011f, 0.109859f, 0.044804f, 0.012268f, 0.043962f, -0.058964f, 0.011657f, -0.026021f, 0.027995f, -0.015834f, 0.076771f, -0.031272f, -0.027021f, 0.010813f, 0.009048f, -0.029000f, 0.017288f, 0.008605f, 0.006304f, -0.005352f, 0.003645f, 0.006343f, 0.006010f, -0.007066f, -0.004432f, 0.016283f, 0.000661f, -0.008399f, 0.033430f, 0.010092f, -0.030235f, 0.003462f, 0.028630f, 0.007701f, -0.028780f, 0.038396f, 0.068358f, -0.033575f, -0.039644f, -0.010507f, -0.009169f, 0.023460f, 0.049995f, 0.015408f, -0.046842f, -0.015333f, + -0.007073f, 0.007106f, 0.013849f, -0.007661f, 0.020266f, -0.014688f, -0.002090f, 0.012205f, -0.084614f, 0.014821f, 0.105953f, 0.033206f, 0.011489f, 0.003023f, 0.008079f, 0.045507f, 0.062256f, -0.014089f, 0.011731f, 0.016190f, -0.010575f, 0.037596f, -0.019639f, -0.005189f, -0.014835f, 0.028909f, 0.021496f, -0.011648f, 0.019772f, -0.028117f, -0.022893f, 0.028865f, -0.018377f, 0.031707f, -0.020957f, -0.009246f, -0.000512f, 0.017380f, -0.000977f, 0.012959f, 0.005307f, 0.032286f, -0.022925f, -0.004502f, 0.000665f, -0.012701f, 0.031171f, 0.027058f, -0.022174f, -0.007803f, -0.013592f, 0.007243f, -0.028637f, 0.015600f, 0.008957f, 0.014327f, -0.011389f, -0.008616f, 0.035466f, -0.042412f, -0.007263f, 0.018033f, -0.011445f, -0.007635f, 0.018593f, -0.052147f, 0.012701f, -0.018815f, 0.003211f, -0.018423f, 0.045264f, -0.014614f, -0.019428f, 0.018642f, -0.010175f, -0.029522f, 0.057542f, -0.001497f, 0.005972f, -0.012750f, -0.022041f, -0.025985f, 0.029074f, -0.032475f, -0.015614f, 0.033228f, -0.045145f, -0.019616f, 0.005924f, -0.004156f, 0.005643f, -0.000624f, 0.006547f, 0.020230f, -0.007147f, 0.007982f, + -0.009132f, 0.021224f, 0.011675f, -0.000812f, 0.001888f, 0.012965f, -0.011217f, 0.009446f, 0.001622f, 0.010381f, -0.004557f, 0.016088f, -0.008057f, 0.004391f, -0.013828f, -0.011933f, -0.018926f, 0.003638f, 0.001214f, 0.006454f, -0.009224f, 0.021369f, -0.006929f, -0.003568f, 0.018349f, 0.016184f, 0.008724f, -0.007394f, -0.012154f, 0.011075f, 0.014653f, 0.009216f, 0.006383f, -0.000106f, 0.013252f, 0.014361f, 0.006402f, 0.012212f, 0.001686f, -0.009316f, 0.027446f, -0.079121f, -0.223245f, -0.183447f, 0.096635f, 0.027562f, 0.221445f, 0.395844f, 0.058594f, 0.124650f, 0.045194f, -0.316122f, -0.100132f, -0.214524f, -0.259215f, 0.007059f, 0.041119f, -0.108250f, 0.156304f, 0.204670f, 0.114761f, 0.326554f, 0.188212f, -0.042264f, -0.077808f, -0.151859f, -0.295383f, -0.233297f, -0.068946f, -0.208061f, -0.029212f, 0.179106f, 0.029697f, 0.041521f, 0.270858f, 0.138082f, 0.085303f, 0.282439f, 0.043300f, -0.078254f, 0.110255f, -0.148259f, -0.293472f, -0.122928f, -0.247641f, -0.309837f, -0.004778f, -0.064879f, -0.081749f, 0.205983f, 0.226993f, 0.144388f, 0.342612f, 0.276427f, 0.130251f, 0.117809f, + 0.068081f, -0.229327f, -0.211017f, -0.267116f, -0.352661f, -0.282774f, -0.119491f, -0.082122f, 0.006969f, 0.202381f, 0.246093f, 0.257673f, 0.246947f, 0.228875f, 0.048598f, 0.004047f, -0.039178f, -0.174836f, -0.191613f, -0.110781f, -0.200907f, -0.084623f, 0.017226f, -0.043973f, 0.100401f, 0.180985f, 0.055116f, 0.076357f, 0.033761f, -0.049645f, -0.031146f, -0.075894f, -0.098812f, -0.012012f, 0.027421f, 0.000606f, 0.080974f, 0.074845f, 0.008225f, 0.072049f, -0.000271f, -0.091537f, 0.080360f, 0.024143f, -0.081568f, 0.056988f, -0.060496f, -0.122267f, 0.055492f, -0.087046f, -0.215568f, 0.003266f, -0.095064f, -0.062808f, 0.213069f, 0.096437f, 0.101157f, 0.305180f, 0.202109f, 0.112233f, 0.132974f, -0.033309f, -0.193255f, -0.245372f, -0.333350f, -0.368539f, -0.234088f, -0.149449f, -0.026028f, 0.140169f, 0.311983f, 0.344648f, 0.319330f, 0.332751f, 0.177714f, 0.008173f, -0.085083f, -0.219104f, -0.280492f, -0.181406f, -0.202647f, -0.161197f, -0.032548f, 0.006162f, 0.021497f, 0.079652f, 0.067659f, 0.059443f, 0.105341f, 0.105430f, 0.089093f, 0.105488f, 0.073632f, 0.026613f, -0.005336f, -0.040966f, + -0.096908f, -0.102218f, -0.075694f, -0.059645f, -0.025891f, -0.008577f, -0.005999f, -0.007146f}, + {-0.019694f, -0.023970f, 0.012087f, -0.004389f, 0.010571f, -0.005251f, -0.005372f, -0.010723f, 0.002526f, 0.002273f, -0.000481f, 0.000174f, -0.001204f, -0.008202f, -0.000955f, -0.004690f, -0.005396f, -0.005112f, -0.000199f, 0.000616f, -0.000412f, -0.000923f, 0.004064f, -0.001129f, -0.012413f, 0.007721f, 0.003833f, -0.004227f, 0.001235f, -0.000120f, 0.000127f, 0.001743f, 0.007971f, -0.004446f, 0.000465f, -0.014062f, 0.007002f, 0.001384f, 0.003158f, 0.004861f, 0.007891f, -0.004416f, -0.003366f, -0.001597f, -0.007080f, 0.000567f, -0.001073f, 0.006113f, -0.003296f, -0.000419f, -0.003432f, -0.003922f, 0.007435f, -0.005611f, -0.002722f, 0.000699f, -0.005102f, 0.004252f, -0.000200f, -0.002392f, 0.004594f, 0.008445f, 0.000520f, -0.000328f, -0.001196f, 0.007220f, -0.007186f, 0.000063f, -0.001132f, 0.003778f, -0.001777f, -0.003288f, 0.007844f, -0.000139f, 0.001647f, -0.002182f, 0.001619f, 0.004223f, -0.003396f, -0.004736f, 0.000229f, 0.004123f, 0.006915f, -0.003119f, -0.002123f, 0.001704f, 0.000364f, 0.001058f, -0.003188f, -0.001025f, 0.001884f, -0.000429f, 0.001321f, -0.002513f, -0.000793f, -0.001551f, + -0.002178f, -0.001570f, -0.001468f, 0.001101f, 0.000184f, -0.001100f, 0.001095f, 0.000759f, -0.001005f, -0.000311f, -0.000256f, -0.001363f, -0.002458f, -0.000689f, -0.000010f, 0.000504f, 0.001316f, -0.028580f, 0.004858f, 0.003377f, 0.010017f, -0.003927f, 0.003035f, 0.011647f, -0.004512f, 0.003183f, -0.007068f, -0.010370f, 0.003793f, -0.007060f, -0.008059f, -0.008084f, 0.002432f, 0.003083f, -0.013794f, 0.008107f, 0.005372f, -0.002347f, -0.005053f, 0.003226f, -0.001259f, -0.003142f, 0.000995f, 0.004571f, 0.003377f, 0.007302f, 0.001405f, -0.002224f, 0.007513f, -0.003782f, 0.016391f, 0.003691f, 0.010097f, 0.003893f, 0.008858f, 0.003946f, 0.006103f, 0.003306f, 0.000725f, 0.000340f, 0.012402f, 0.002104f, -0.001997f, 0.000821f, 0.006546f, 0.004853f, 0.000708f, -0.000555f, -0.002556f, 0.001383f, 0.015131f, 0.004342f, 0.006990f, -0.007313f, -0.003770f, -0.007713f, -0.004884f, -0.007487f, 0.005617f, 0.003552f, -0.004793f, -0.003408f, 0.003363f, -0.003567f, 0.003754f, -0.001678f, -0.001145f, -0.005178f, -0.008743f, 0.003761f, -0.014195f, -0.002003f, -0.003041f, -0.003588f, 0.000757f, -0.003310f, + 0.000650f, 0.005344f, 0.002572f, -0.003637f, 0.000644f, -0.002884f, -0.006194f, -0.000998f, 0.002946f, -0.000301f, -0.004788f, 0.001737f, 0.000856f, 0.001814f, 0.003246f, 0.000131f, 0.000437f, -0.002241f, -0.001382f, -0.000328f, -0.000061f, 0.001179f, -0.002605f, -0.002203f, 0.016088f, 0.022167f, -0.006790f, 0.005962f, -0.011010f, -0.000581f, 0.000659f, 0.028323f, -0.002895f, -0.007478f, -0.012204f, 0.000292f, 0.008128f, 0.013033f, -0.002935f, -0.017087f, -0.004916f, -0.006509f, -0.004667f, 0.005819f, -0.001253f, 0.010887f, 0.001214f, -0.006142f, -0.013825f, 0.004159f, -0.001295f, 0.003225f, -0.001667f, 0.001574f, 0.006777f, 0.002498f, -0.017396f, 0.002108f, 0.011193f, 0.005518f, 0.001377f, 0.002693f, -0.002795f, 0.007769f, -0.010286f, -0.000990f, 0.008486f, -0.005839f, 0.000001f, 0.013801f, -0.006368f, -0.000637f, -0.004673f, 0.008496f, -0.008921f, -0.006605f, 0.004128f, -0.009236f, -0.004562f, 0.012053f, 0.007076f, -0.010742f, -0.003968f, -0.001600f, -0.002671f, -0.004888f, 0.003863f, -0.004193f, 0.004431f, -0.000116f, 0.000659f, 0.001958f, 0.009085f, -0.001017f, 0.012525f, 0.006491f, + -0.009620f, -0.004416f, -0.004696f, 0.007542f, 0.002241f, -0.000489f, -0.003866f, 0.010093f, 0.003880f, -0.000169f, -0.000219f, -0.002500f, -0.002313f, 0.003010f, 0.001160f, 0.003337f, 0.007859f, 0.002877f, -0.000425f, 0.000536f, 0.000634f, 0.002572f, -0.000523f, 0.000994f, 0.003758f, 0.000841f, 0.004651f, 0.000179f, 0.001647f, 0.002405f, 0.002851f, 0.001048f, 0.001806f, 0.002094f, 0.001703f, 0.002700f, -0.000817f, 0.000851f, 0.001833f, 0.002765f, -0.000234f, -0.002054f, -0.002449f, 0.000632f, 0.052881f, -0.019537f, 0.010732f, -0.014920f, -0.001548f, 0.000528f, -0.001084f, -0.007908f, 0.004335f, 0.006087f, 0.001483f, -0.005752f, -0.012248f, -0.000457f, 0.007489f, 0.005321f, -0.005384f, -0.009221f, -0.000740f, 0.008262f, 0.015088f, -0.008136f, -0.001092f, -0.006142f, -0.013201f, 0.001480f, -0.006641f, 0.004010f, -0.004917f, 0.010274f, -0.018028f, 0.012176f, -0.000799f, -0.010731f, 0.002614f, 0.004523f, -0.001273f, -0.005681f, 0.000351f, 0.014107f, -0.000534f, 0.002327f, -0.001997f, 0.005403f, 0.002484f, -0.003325f, -0.005301f, -0.011589f, 0.007513f, -0.002421f, -0.003418f, 0.004466f, + 0.000072f, -0.019483f, 0.014969f, -0.020970f, -0.012115f, -0.014849f, 0.003194f, -0.001734f, 0.008895f, -0.004857f, 0.004726f, -0.008935f, 0.004290f, -0.002331f, -0.003670f, -0.009858f, 0.006030f, 0.006957f, 0.011863f, -0.002877f, -0.001152f, 0.003231f, -0.003626f, -0.002119f, 0.002270f, 0.006880f, -0.009106f, 0.004509f, 0.006509f, 0.007271f, -0.011536f, -0.009395f, 0.003925f, -0.005867f, 0.002982f, -0.000081f, -0.000713f, 0.001031f, 0.001425f, -0.000471f, 0.002694f, -0.003334f, 0.001606f, -0.001021f, 0.006708f, 0.000423f, 0.001623f, 0.001539f, 0.000403f, -0.002628f, -0.000259f, 0.000685f, -0.000767f, -0.041754f, 0.004216f, 0.000404f, -0.003579f, -0.006472f, 0.007264f, -0.005697f, 0.004822f, -0.001536f, -0.000108f, 0.006707f, 0.008746f, -0.005438f, 0.006434f, -0.001923f, -0.003600f, -0.011740f, -0.000607f, -0.015849f, -0.011641f, 0.013881f, 0.004935f, -0.005426f, -0.002001f, -0.001669f, 0.009629f, 0.005062f, -0.004998f, 0.008772f, 0.005830f, 0.003419f, 0.003018f, 0.003715f, 0.006680f, 0.005740f, 0.005670f, 0.015528f, 0.013978f, 0.006017f, 0.001526f, -0.009703f, 0.010742f, -0.014400f, + 0.002816f, -0.004033f, 0.011639f, -0.008821f, -0.011461f, 0.019631f, -0.004603f, -0.010560f, -0.009416f, 0.014605f, 0.008961f, 0.000511f, 0.007501f, 0.010595f, 0.004850f, 0.017151f, -0.001046f, -0.002736f, 0.009724f, 0.005934f, 0.000550f, 0.000361f, -0.008959f, 0.005335f, 0.005551f, 0.013840f, 0.005621f, 0.008608f, -0.005352f, -0.007150f, -0.015161f, -0.003504f, -0.008211f, -0.006537f, -0.006919f, 0.007620f, -0.000297f, 0.000562f, -0.004459f, -0.005156f, -0.001450f, -0.004540f, 0.001373f, -0.003069f, -0.005044f, 0.002028f, -0.000521f, 0.000157f, -0.004723f, -0.000717f, 0.000166f, -0.005945f, -0.000839f, -0.001442f, 0.000366f, -0.002691f, -0.003101f, -0.001939f, -0.001169f, 0.000070f, -0.001017f, 0.000901f, -0.001414f, 0.001616f, 0.000367f, 0.001424f, 0.003214f, -0.000784f, 0.003395f, 0.000664f, 0.002219f, -0.001611f, 0.000668f, -0.003003f, -0.001136f, -0.000541f, -0.003602f, -0.001147f, -0.001789f, -0.055636f, 0.014882f, -0.011907f, -0.017588f, -0.017391f, 0.010731f, -0.012918f, 0.009474f, -0.016218f, 0.008872f, 0.007572f, 0.004640f, -0.017071f, 0.011631f, -0.000245f, 0.007026f, -0.014150f, + 0.007821f, 0.016656f, 0.012723f, 0.000423f, -0.006020f, 0.002310f, -0.003646f, -0.018038f, -0.003686f, -0.008689f, 0.004079f, -0.011360f, 0.009682f, 0.009497f, -0.003808f, -0.000458f, 0.013338f, -0.002972f, 0.009036f, -0.007343f, -0.011703f, 0.006038f, -0.000243f, 0.006249f, 0.016417f, 0.009977f, -0.000656f, -0.028733f, -0.013799f, -0.004024f, 0.003941f, -0.004454f, 0.015761f, -0.024968f, 0.007850f, 0.003344f, -0.000293f, 0.007775f, -0.003272f, 0.012068f, -0.026175f, -0.012238f, 0.010084f, -0.026305f, -0.004911f, 0.012217f, 0.004348f, -0.005843f, -0.017561f, 0.006465f, 0.011264f, 0.008255f, -0.003171f, -0.018422f, -0.001628f, 0.000098f, -0.002129f, -0.001023f, -0.009044f, 0.004038f, -0.014442f, 0.008813f, 0.001202f, -0.008584f, 0.001646f, -0.010317f, 0.000736f, -0.012332f, -0.003485f, 0.004267f, 0.004487f, 0.000359f, -0.001228f, -0.004277f, -0.003241f, 0.000818f, -0.007268f, 0.005775f, 0.000400f, -0.003536f, -0.000024f, -0.006276f, -0.004964f, 0.001350f, -0.002612f, 0.003340f, -0.003331f, -0.001872f, -0.002200f, -0.002404f, -0.004267f, -0.000751f, -0.002403f, -0.000976f, 0.001131f, -0.001023f, + -0.001952f, 0.001511f, -0.000817f, -0.001667f, -0.001717f, -0.003776f, -0.002672f, 0.000461f, 0.001925f, -0.000604f, -0.026145f, 0.002820f, 0.004359f, 0.020479f, -0.019342f, 0.022361f, 0.006342f, -0.001809f, -0.005250f, -0.002419f, 0.002080f, -0.016361f, -0.003125f, 0.005231f, -0.005365f, -0.009610f, -0.002585f, 0.015455f, -0.015969f, -0.003492f, 0.016021f, 0.000055f, -0.006333f, 0.005627f, -0.007771f, 0.011760f, 0.005197f, -0.000173f, 0.005911f, -0.006863f, -0.010744f, -0.000796f, 0.000846f, 0.008787f, -0.018853f, -0.010210f, -0.008304f, -0.005865f, -0.005564f, -0.005756f, 0.002864f, 0.000889f, 0.001605f, -0.014127f, -0.014430f, -0.011528f, 0.000457f, -0.018141f, -0.009954f, 0.010793f, -0.007285f, 0.002346f, 0.001203f, -0.000392f, 0.004574f, 0.006376f, 0.006179f, 0.007223f, 0.010735f, -0.001947f, 0.011612f, -0.000801f, 0.005904f, -0.001029f, -0.007352f, -0.000506f, -0.011895f, 0.007325f, -0.013931f, 0.013003f, -0.015551f, -0.000312f, -0.016040f, 0.001453f, -0.016114f, -0.015655f, 0.007456f, 0.021368f, 0.006561f, -0.013915f, 0.009957f, -0.000086f, -0.006021f, -0.003738f, -0.006310f, 0.008442f, + 0.007452f, 0.010400f, 0.001994f, 0.008087f, -0.006803f, -0.000839f, 0.008127f, 0.000846f, 0.002592f, 0.001482f, -0.003780f, 0.004704f, -0.000312f, 0.001686f, 0.007232f, 0.001978f, -0.001638f, -0.004354f, -0.001817f, 0.002822f, 0.003042f, 0.002205f, 0.000967f, -0.003423f, 0.000406f, -0.000821f, -0.007290f, 0.007111f, 0.000995f, 0.002522f, 0.000504f, -0.001892f, -0.003354f, 0.002417f, -0.003418f, -0.001848f, 0.072707f, 0.000878f, -0.020960f, 0.003311f, -0.011379f, 0.028993f, -0.004742f, 0.008164f, 0.002122f, 0.001414f, -0.025472f, -0.013046f, 0.014125f, 0.012424f, -0.020072f, -0.003515f, -0.000612f, 0.017874f, 0.008782f, 0.006809f, 0.017512f, 0.002768f, 0.001145f, 0.015216f, -0.005322f, -0.023143f, 0.003420f, 0.017718f, 0.010477f, -0.006693f, 0.000347f, 0.012359f, 0.007522f, 0.003388f, -0.000667f, -0.012980f, 0.006314f, -0.014119f, 0.001398f, -0.026592f, 0.006966f, 0.008205f, -0.002163f, -0.012231f, 0.016880f, 0.008894f, -0.003511f, 0.013148f, 0.006047f, -0.011063f, 0.020267f, 0.002199f, -0.007200f, 0.004721f, 0.020782f, 0.003251f, -0.000548f, -0.017335f, -0.010131f, 0.002447f, + 0.007039f, 0.023713f, -0.007824f, -0.009377f, 0.002045f, 0.012951f, -0.008367f, -0.010258f, -0.000935f, 0.017242f, 0.012322f, -0.004276f, -0.013234f, -0.000675f, 0.015036f, -0.005970f, 0.031236f, 0.006828f, 0.004661f, -0.015974f, 0.013566f, 0.000841f, -0.003463f, -0.008107f, 0.000794f, -0.004518f, 0.000830f, 0.019347f, 0.008806f, 0.007065f, 0.003686f, 0.002263f, 0.000317f, -0.001227f, 0.001787f, 0.003918f, 0.006970f, 0.001110f, 0.001255f, 0.002596f, -0.005293f, 0.000148f, 0.002295f, -0.001158f, 0.006070f, -0.004269f, -0.000120f, -0.002073f, 0.002391f, 0.010299f, 0.003515f, -0.003172f, -0.000760f, 0.002482f, 0.000878f, 0.003464f, -0.000655f, -0.004390f, 0.004104f, 0.003707f, -0.003455f, -0.000901f, 0.009067f, 0.003132f, 0.016389f, 0.008703f, -0.025860f, -0.002693f, -0.013087f, 0.025961f, -0.009769f, 0.012091f, 0.002294f, 0.016250f, 0.006392f, 0.002394f, -0.001364f, 0.006591f, -0.007457f, -0.011054f, -0.030602f, -0.022641f, 0.007448f, 0.020114f, 0.026984f, -0.009958f, -0.013231f, -0.011628f, 0.005994f, -0.006380f, -0.001413f, -0.001107f, 0.003603f, 0.004101f, 0.018002f, -0.009624f, + 0.001657f, 0.004433f, 0.008772f, -0.008734f, -0.006515f, -0.014405f, -0.009796f, -0.010045f, -0.017177f, -0.043495f, -0.000547f, -0.005833f, -0.018730f, 0.004190f, -0.002151f, -0.023591f, 0.007882f, -0.020005f, 0.005088f, -0.002432f, -0.001681f, 0.010147f, 0.013104f, -0.000378f, -0.019547f, 0.005745f, -0.012285f, -0.013508f, 0.018737f, 0.016963f, 0.018874f, -0.006166f, 0.003025f, 0.002518f, -0.009690f, 0.001506f, -0.004676f, 0.029633f, -0.004932f, -0.003039f, -0.002974f, -0.000201f, -0.018125f, -0.022382f, 0.005288f, -0.001622f, -0.001702f, 0.005077f, 0.032197f, -0.003964f, -0.015140f, -0.006351f, 0.016885f, -0.002444f, -0.005528f, -0.004846f, -0.000382f, -0.013704f, 0.003285f, -0.002609f, 0.002531f, -0.006906f, 0.000269f, -0.008693f, -0.000775f, -0.000519f, 0.003494f, -0.003624f, -0.001833f, -0.005293f, 0.007167f, 0.000501f, -0.005329f, 0.001225f, 0.002345f, -0.005610f, 0.001404f, 0.002283f, 0.008769f, -0.001777f, 0.001992f, 0.006299f, 0.003808f, -0.003162f, 0.003687f, -0.006639f, -0.011000f, 0.001404f, 0.000989f, -0.004065f, -0.010261f, -0.002014f, -0.002577f, 0.009128f, 0.003290f, 0.006156f, + -0.001109f, 0.007666f, 0.008384f, -0.028499f, 0.010459f, 0.003420f, 0.029997f, -0.020271f, -0.011500f, -0.006768f, 0.015996f, -0.015369f, -0.014763f, 0.013239f, 0.008902f, -0.015547f, -0.015670f, -0.015354f, -0.034280f, 0.022421f, 0.021059f, 0.022321f, -0.009676f, 0.007021f, 0.022166f, -0.032233f, 0.000008f, 0.021071f, 0.019550f, 0.008833f, -0.000085f, -0.010355f, 0.002120f, -0.005015f, -0.027874f, 0.003478f, 0.007598f, 0.004036f, 0.018437f, -0.016327f, 0.001725f, -0.030470f, -0.003888f, 0.005962f, -0.016740f, 0.006413f, 0.005109f, 0.013556f, 0.016609f, 0.023090f, -0.004757f, -0.009136f, -0.027957f, -0.019989f, 0.008595f, 0.040988f, -0.012756f, -0.001758f, -0.018936f, -0.010072f, -0.015026f, 0.008791f, 0.009073f, -0.003207f, 0.001326f, -0.030086f, -0.003978f, 0.020277f, -0.016243f, -0.014119f, 0.012046f, -0.005474f, 0.017634f, 0.004312f, -0.012977f, 0.002037f, -0.019599f, -0.005700f, -0.005182f, 0.037734f, -0.003790f, -0.011122f, 0.008271f, 0.007656f, -0.003325f, -0.006487f, -0.001935f, -0.005227f, -0.007029f, -0.006602f, -0.005008f, 0.002594f, 0.002934f, 0.006032f, -0.001575f, -0.000157f, + -0.003644f, 0.003629f, 0.000956f, -0.009760f, 0.002596f, -0.000150f, -0.001049f, 0.003442f, -0.000215f, -0.005360f, -0.005237f, -0.012596f, 0.004181f, -0.004010f, 0.003704f, 0.004721f, -0.005889f, 0.002627f, 0.001716f, -0.001322f, 0.004760f, -0.000047f, 0.013590f, 0.001840f, -0.002456f, 0.000258f, -0.003938f, -0.000777f, 0.002377f, 0.000318f, -0.001172f, 0.001039f, -0.005296f, 0.004182f, -0.017825f, 0.040773f, -0.020303f, -0.010523f, -0.000956f, -0.001495f, -0.029178f, 0.001727f, -0.021520f, 0.015315f, -0.040328f, -0.006001f, -0.012978f, 0.013579f, -0.013952f, -0.014056f, -0.034134f, 0.022777f, -0.014102f, 0.009277f, -0.011057f, 0.006712f, 0.017999f, -0.013298f, -0.022411f, -0.007634f, 0.015157f, 0.031529f, 0.010074f, 0.013120f, 0.001469f, -0.032035f, -0.017178f, -0.017334f, -0.008940f, 0.005438f, 0.028821f, 0.012324f, 0.016747f, 0.015654f, -0.004516f, -0.006875f, -0.009819f, -0.026801f, 0.001356f, -0.018745f, 0.028774f, -0.013339f, 0.019790f, 0.004120f, -0.010496f, 0.006528f, -0.007018f, -0.009178f, -0.015814f, 0.023578f, 0.006122f, 0.039930f, 0.008682f, -0.043261f, -0.010845f, 0.013690f, + 0.011127f, 0.006173f, -0.002531f, 0.003689f, 0.045036f, 0.022436f, -0.007724f, 0.004721f, -0.012248f, 0.032569f, -0.001349f, -0.001421f, 0.012634f, -0.028948f, -0.012532f, -0.009937f, -0.030913f, -0.036645f, 0.007144f, 0.012881f, -0.003513f, -0.018137f, -0.004807f, -0.005879f, -0.014228f, 0.000064f, -0.002985f, -0.011344f, 0.011020f, 0.016903f, -0.003852f, -0.002684f, -0.002683f, -0.006878f, 0.004787f, 0.000967f, -0.002054f, -0.003632f, -0.003083f, -0.002207f, 0.005511f, -0.003488f, -0.008154f, -0.002164f, -0.000508f, 0.002370f, 0.001484f, -0.005124f, 0.011939f, -0.004178f, 0.007202f, -0.001649f, 0.005992f, 0.002998f, -0.002080f, -0.008440f, -0.008009f, 0.002469f, -0.002278f, -0.012646f, -0.004696f, -0.003299f, 0.004421f, 0.000900f, -0.001070f, 0.003208f, 0.005544f, 0.001661f, -0.003544f, -0.005378f, -0.024836f, 0.015014f, 0.033434f, -0.003181f, -0.001346f, -0.000676f, 0.031082f, 0.009691f, 0.007525f, 0.005385f, 0.003761f, 0.005358f, -0.012110f, 0.002359f, -0.038293f, 0.005590f, -0.018402f, 0.016116f, 0.039361f, -0.005028f, 0.002959f, -0.030907f, 0.041490f, 0.020143f, 0.017686f, -0.005090f, + -0.022659f, 0.002802f, -0.007664f, 0.021062f, 0.015166f, -0.018760f, 0.001109f, 0.011136f, 0.007938f, -0.014513f, -0.012827f, 0.060691f, -0.013958f, -0.010524f, 0.012891f, -0.015395f, -0.011151f, 0.019325f, 0.018999f, 0.000787f, 0.007379f, 0.006905f, -0.023360f, -0.011641f, -0.000890f, 0.008030f, 0.020661f, 0.005110f, 0.004966f, -0.026485f, -0.002390f, 0.007848f, -0.036072f, 0.007957f, -0.009950f, -0.003635f, -0.006558f, 0.010662f, -0.010647f, -0.019629f, -0.020882f, -0.033224f, 0.004321f, -0.013460f, -0.006370f, 0.021297f, -0.007094f, 0.006914f, -0.037373f, -0.000066f, 0.034661f, 0.008079f, -0.017315f, -0.010378f, 0.021106f, 0.010753f, -0.022880f, 0.012909f, -0.016533f, -0.012848f, -0.005356f, -0.003230f, 0.007963f, -0.002236f, 0.001484f, -0.003571f, -0.004460f, 0.002768f, 0.004309f, -0.005865f, 0.005107f, 0.015235f, 0.002492f, -0.002100f, 0.006654f, 0.009620f, -0.003975f, 0.006539f, -0.004169f, -0.005941f, 0.001788f, 0.004341f, 0.012792f, 0.003322f, -0.001117f, 0.004589f, -0.001809f, 0.006517f, -0.003572f, 0.005988f, -0.004458f, 0.001974f, 0.005412f, 0.001516f, -0.008644f, -0.005018f, + 0.016203f, -0.006844f, -0.012741f, 0.006317f, 0.003485f, 0.004703f, -0.003267f, 0.020571f, 0.006134f, -0.019237f, -0.019314f, 0.045698f, -0.027456f, 0.007075f, -0.017574f, 0.053886f, 0.011402f, 0.009909f, -0.017310f, -0.020477f, 0.001904f, 0.015345f, -0.016603f, -0.026446f, -0.015737f, -0.038425f, -0.015004f, -0.022590f, -0.000098f, -0.051621f, 0.003554f, 0.027855f, 0.017140f, 0.022754f, -0.015985f, 0.005882f, 0.024730f, -0.002943f, 0.017919f, 0.006611f, 0.027957f, -0.014121f, 0.023309f, 0.018504f, 0.013235f, 0.030280f, -0.017041f, 0.018009f, -0.009329f, -0.010863f, -0.007202f, 0.006640f, -0.058887f, -0.018890f, -0.036615f, 0.042274f, -0.026717f, -0.030194f, -0.006476f, 0.023825f, 0.000641f, -0.010837f, 0.033281f, -0.011975f, -0.010582f, -0.024243f, -0.059544f, 0.002820f, 0.005516f, 0.024740f, -0.024973f, 0.000005f, -0.015229f, -0.020147f, 0.031826f, -0.006496f, 0.015942f, -0.034687f, -0.033707f, -0.021090f, 0.026536f, -0.002802f, -0.016809f, -0.017908f, -0.000708f, -0.029431f, -0.020042f, 0.002786f, -0.012308f, -0.021968f, 0.032307f, -0.044396f, -0.042226f, 0.010977f, 0.000196f, 0.018591f, + 0.002162f, -0.002108f, -0.013602f, -0.012102f, 0.002009f, -0.021029f, -0.008416f, 0.017787f, 0.002409f, 0.002991f, -0.010321f, 0.010503f, 0.003970f, -0.011517f, 0.005413f, -0.008556f, -0.001684f, -0.008772f, 0.007631f, -0.011648f, -0.002841f, 0.007819f, 0.015430f, 0.001651f, 0.000704f, -0.016793f, -0.004982f, -0.001212f, 0.002516f, -0.002536f, 0.014327f, -0.000661f, -0.005352f, 0.009042f, -0.010507f, -0.009808f, 0.006110f, 0.012945f, -0.003542f, -0.009289f, -0.012410f, 0.009953f, 0.008191f, 0.016071f, -0.022284f, -0.000309f, 0.029517f, 0.003739f, -0.009127f, 0.015151f, -0.024261f, 0.047830f, 0.029972f, -0.000451f, -0.022102f, -0.024991f, 0.010204f, -0.006422f, -0.002399f, -0.001482f, 0.043625f, -0.021666f, 0.000659f, -0.015127f, 0.015962f, -0.027374f, -0.025087f, -0.049251f, 0.011226f, -0.020121f, -0.027740f, -0.003543f, -0.046815f, -0.023105f, 0.013029f, 0.009774f, -0.006547f, 0.024121f, 0.002124f, 0.029275f, -0.013144f, -0.040765f, -0.006309f, -0.029913f, -0.005809f, -0.009109f, -0.039057f, 0.004913f, 0.031573f, -0.089461f, 0.011175f, 0.000046f, 0.022014f, -0.004608f, -0.027920f, -0.053157f, + 0.020996f, -0.006679f, 0.019616f, 0.011647f, -0.006578f, 0.030746f, -0.038579f, 0.053747f, -0.013641f, 0.029908f, 0.062803f, 0.025004f, 0.044656f, 0.017431f, 0.011640f, -0.006281f, 0.023275f, -0.008867f, -0.024572f, -0.033148f, -0.021393f, -0.001280f, 0.018463f, -0.003210f, -0.014497f, -0.020639f, -0.018408f, 0.024744f, -0.011189f, -0.009150f, 0.022253f, 0.003901f, 0.016742f, -0.001906f, -0.002519f, -0.006954f, 0.003883f, 0.008293f, -0.011497f, -0.002016f, -0.028022f, -0.020354f, 0.013677f, -0.006971f, -0.000767f, -0.004235f, -0.000586f, -0.010827f, -0.016785f, 0.011975f, -0.010120f, 0.015608f, -0.016141f, -0.007560f, -0.001829f, -0.011438f, -0.005713f, 0.007786f, 0.003262f, 0.018959f, -0.004833f, -0.011556f, 0.007188f, -0.022967f, 0.000358f, 0.002635f, -0.003565f, 0.001338f, -0.002556f, 0.011085f, 0.016174f, 0.002608f, -0.000584f, -0.007962f, -0.013538f, -0.006708f, 0.000780f, 0.026354f, 0.013283f, -0.013516f, 0.075298f, 0.061362f, 0.055297f, -0.012569f, 0.000166f, -0.046907f, 0.035100f, 0.043530f, 0.014828f, 0.042049f, 0.016808f, 0.014308f, 0.014781f, -0.007406f, 0.005842f, 0.011648f, + -0.010689f, -0.045196f, -0.027423f, -0.001655f, -0.030011f, -0.034993f, -0.082192f, 0.018081f, 0.014239f, 0.021448f, -0.015714f, -0.005609f, -0.010911f, 0.000594f, -0.025684f, -0.000725f, -0.019563f, 0.022774f, 0.018977f, -0.011734f, -0.015911f, -0.043348f, 0.073059f, -0.022797f, 0.014452f, -0.000025f, 0.004736f, 0.011660f, -0.030155f, 0.036419f, -0.018332f, 0.012450f, 0.008199f, -0.027212f, -0.028008f, -0.005193f, -0.002416f, 0.016917f, 0.077117f, -0.006441f, 0.011503f, 0.002555f, 0.023289f, 0.016545f, 0.017362f, -0.013619f, -0.004018f, 0.006665f, -0.037207f, 0.007572f, -0.031833f, -0.050910f, 0.017788f, 0.001616f, 0.004085f, -0.037273f, -0.089532f, 0.038738f, 0.040515f, 0.027883f, -0.050752f, 0.048369f, 0.051454f, 0.019014f, 0.014970f, 0.000453f, -0.014747f, -0.033838f, 0.025390f, -0.023845f, 0.001608f, 0.000417f, -0.013364f, 0.010217f, -0.024232f, -0.002545f, -0.004679f, 0.012019f, -0.006663f, -0.011201f, -0.015023f, 0.023136f, -0.012610f, -0.005527f, 0.006121f, -0.020815f, 0.011655f, 0.009451f, -0.007107f, -0.007298f, 0.002118f, -0.019339f, 0.017976f, -0.006503f, -0.004724f, -0.001636f, + 0.001625f, 0.013156f, -0.010268f, -0.024451f, 0.007391f, -0.013641f, -0.004100f, -0.013980f, -0.012247f, 0.001885f, -0.009877f, -0.004610f, -0.009190f, 0.031350f, -0.013774f, -0.025523f, 0.004161f, -0.009178f, -0.044161f, -0.088124f, 0.073101f, 0.011742f, 0.012964f, -0.029367f, -0.021147f, -0.093753f, 0.025900f, 0.067023f, 0.020543f, -0.059382f, -0.029716f, 0.009631f, -0.023123f, -0.014681f, 0.027463f, -0.030917f, 0.017252f, 0.015393f, 0.012731f, -0.034416f, 0.012284f, 0.010642f, -0.016156f, -0.032209f, -0.018650f, -0.012404f, -0.008343f, -0.030725f, -0.026502f, -0.014580f, -0.031682f, 0.024972f, -0.011833f, -0.040886f, -0.014126f, 0.025072f, -0.005195f, -0.028353f, -0.015613f, -0.014473f, -0.000107f, -0.022475f, -0.013560f, -0.037239f, -0.035384f, 0.015061f, -0.012592f, 0.046449f, 0.030527f, 0.002983f, 0.027719f, -0.040615f, 0.026255f, -0.038553f, 0.032393f, -0.005556f, 0.016570f, -0.017198f, 0.057564f, -0.014359f, 0.032237f, -0.008254f, 0.047351f, 0.019064f, 0.011523f, -0.048876f, 0.053012f, 0.042428f, 0.018481f, 0.019713f, -0.038116f, -0.007281f, 0.015607f, 0.026043f, -0.006751f, 0.006285f, + -0.042101f, 0.027015f, 0.046195f, -0.001019f, -0.033059f, -0.001931f, -0.021857f, -0.018727f, 0.009058f, -0.000110f, -0.009120f, 0.010672f, -0.024119f, -0.005679f, 0.000946f, 0.006870f, -0.016622f, -0.022848f, 0.008813f, -0.011132f, -0.021542f, -0.038692f, -0.002815f, 0.012006f, -0.003192f, -0.019487f, -0.023455f, -0.007218f, 0.014992f, -0.016163f, 0.006248f, 0.008655f, 0.002493f, 0.006362f, -0.001935f, -0.010400f, -0.008710f, -0.002923f, 0.010868f, 0.003617f, -0.004108f, -0.014526f, 0.019984f, -0.012863f, -0.011146f, -0.009391f, 0.004103f, 0.023138f, -0.015536f, 0.022784f, 0.019360f, -0.007671f, 0.007149f, 0.012134f, -0.061150f, 0.052241f, -0.006013f, 0.025102f, -0.033656f, -0.010837f, -0.008257f, -0.007734f, -0.007721f, 0.030564f, 0.001071f, -0.025209f, 0.020588f, 0.003636f, 0.014921f, 0.025921f, 0.026242f, 0.001490f, -0.022261f, 0.092383f, -0.025068f, 0.071074f, 0.000814f, 0.004373f, -0.039890f, -0.017444f, 0.006977f, 0.034484f, 0.017318f, -0.011031f, 0.028477f, 0.005886f, -0.038462f, 0.006645f, 0.006070f, 0.040117f, -0.001071f, 0.024084f, -0.029039f, 0.000179f, 0.027472f, 0.013623f, + 0.023071f, 0.060190f, 0.048538f, -0.007321f, 0.025411f, -0.003573f, 0.047695f, -0.037685f, 0.032049f, 0.013000f, -0.001164f, 0.028507f, -0.014358f, 0.073701f, -0.012107f, 0.035711f, -0.026136f, -0.023581f, 0.001825f, 0.078504f, 0.026123f, -0.072481f, 0.065074f, -0.001083f, 0.023231f, -0.054575f, 0.019280f, 0.006551f, -0.109101f, 0.046313f, 0.084510f, 0.032456f, -0.034391f, -0.021823f, 0.017660f, 0.083038f, 0.047716f, 0.063368f, -0.022251f, -0.030323f, -0.027265f, 0.013598f, 0.017850f, -0.002490f, -0.030863f, -0.013684f, 0.039898f, 0.007398f, 0.009653f, -0.013105f, 0.018740f, -0.004189f, 0.008923f, -0.007989f, -0.009876f, -0.012165f, 0.024407f, 0.040194f, 0.039207f, 0.009174f, 0.021180f, 0.036988f, 0.024921f, 0.026223f, 0.035755f, 0.020362f, 0.034186f, 0.026002f, 0.009964f, -0.050156f, -0.009145f, -0.023142f, 0.014945f, 0.030132f, -0.033074f, -0.011456f, 0.040624f, 0.022471f, 0.005292f, -0.008691f, 0.034510f, -0.025819f, 0.006872f, 0.035550f, 0.028177f, 0.015941f, 0.019164f, 0.021962f, 0.018473f, 0.021778f, 0.014340f, -0.016643f, -0.008130f, -0.029621f, 0.037875f, 0.005952f, + 0.025289f, -0.020068f, 0.050520f, -0.017438f, 0.023663f, 0.008000f, 0.010681f, 0.007578f, 0.004631f, -0.052437f, -0.030266f, 0.000535f, 0.004989f, 0.036190f, 0.029935f, -0.042735f, 0.004599f, -0.023450f, -0.021277f, 0.010801f, 0.002851f, -0.014505f, 0.017962f, 0.069698f, -0.045869f, -0.003461f, 0.106622f, -0.064569f, 0.007800f, 0.038216f, -0.019333f, -0.015453f, 0.022216f, 0.035323f, -0.038089f, 0.019073f, -0.069226f, -0.007238f, 0.103638f, 0.004783f, 0.029462f, -0.010691f, 0.056697f, 0.057119f, -0.015572f, -0.000699f, -0.026735f, 0.006850f, -0.019741f, -0.050167f, -0.032345f, -0.059909f, -0.044348f, 0.067324f, 0.027024f, 0.020149f, 0.089202f, -0.062847f, -0.037342f, 0.011718f, 0.033437f, -0.024459f, 0.016271f, -0.026218f, 0.049367f, 0.030012f, 0.017081f, 0.036687f, 0.129274f, -0.030162f, -0.010154f, -0.035629f, -0.041680f, -0.002149f, 0.054300f, -0.042051f, -0.005608f, 0.039300f, 0.041459f, 0.049813f, 0.028596f, -0.032642f, 0.008427f, -0.017758f, -0.004088f, 0.029351f, 0.009162f, -0.001763f, 0.021346f, -0.038459f, 0.002482f, 0.001442f, 0.010465f, -0.008030f, -0.010233f, 0.024628f, + -0.008964f, -0.005096f, 0.026181f, 0.034680f, 0.026866f, 0.012742f, 0.011289f, 0.023191f, 0.006457f, 0.002595f, 0.015275f, 0.002436f, -0.009053f, 0.007686f, -0.000432f, -0.001466f, -0.044304f, 0.011609f, 0.028189f, 0.047361f, -0.011071f, -0.012226f, -0.015590f, 0.024582f, 0.026401f, -0.058878f, 0.006821f, -0.025684f, -0.004180f, 0.004304f, 0.003478f, 0.010261f, -0.015158f, -0.031593f, 0.025255f, -0.007889f, 0.058079f, -0.053385f, 0.013110f, -0.004182f, -0.017292f, -0.015793f, -0.007938f, 0.017535f, 0.010756f, 0.011795f, -0.003066f, 0.032290f, 0.005474f, -0.043086f, -0.033882f, -0.005009f, -0.019998f, -0.024943f, 0.005387f, 0.026629f, -0.004003f, -0.006512f, -0.039359f, 0.018908f, -0.006469f, 0.039693f, -0.013811f, -0.077469f, 0.009268f, -0.023245f, -0.011773f, -0.000277f, -0.062669f, -0.033286f, -0.053844f, 0.000566f, -0.004032f, -0.015481f, -0.071222f, -0.029337f, -0.006320f, 0.036757f, 0.041008f, 0.002875f, 0.003058f, 0.019589f, 0.004480f, -0.049303f, 0.042783f, 0.057886f, -0.025368f, 0.008367f, -0.025409f, 0.010075f, -0.000232f, 0.043977f, -0.049909f, -0.036678f, -0.114123f, -0.040965f, + 0.028771f, 0.045499f, 0.032733f, 0.029194f, -0.028090f, -0.009837f, 0.022807f, 0.021336f, 0.049578f, 0.022964f, 0.021222f, 0.037595f, 0.009711f, -0.042538f, -0.044898f, -0.061562f, 0.025580f, -0.039555f, 0.003534f, -0.034762f, -0.052584f, -0.080444f, 0.011465f, -0.023723f, -0.024831f, 0.006522f, 0.007698f, -0.003639f, -0.011336f, 0.001042f, 0.026505f, 0.017641f, 0.006945f, -0.010811f, 0.019247f, 0.042298f, -0.009253f, -0.024131f, -0.019013f, 0.020401f, -0.010943f, -0.010323f, -0.038048f, -0.037756f, -0.028228f, -0.064045f, -0.003198f, -0.000529f, -0.025039f, 0.010515f, 0.017470f, 0.011771f, 0.031935f, 0.007995f, 0.037646f, 0.001699f, 0.010668f, 0.040324f, -0.019586f, -0.001888f, 0.006592f, -0.001113f, -0.028046f, -0.001840f, -0.005005f, 0.048705f, -0.002651f, -0.021357f, 0.016050f, 0.005355f, 0.015063f, 0.030882f, 0.010861f, -0.091335f, 0.038424f, -0.027257f, 0.003480f, 0.064992f, 0.054439f, -0.021529f, -0.009043f, 0.033468f, -0.020776f, -0.021950f, -0.018200f, 0.004486f, -0.006208f, -0.002473f, 0.007844f, -0.007187f, 0.032102f, 0.076284f, -0.032146f, -0.059853f, 0.059799f, -0.046392f, + -0.012424f, 0.000359f, 0.074611f, 0.005667f, -0.022463f, 0.021827f, 0.020865f, -0.078093f, -0.022832f, 0.012730f, -0.002939f, -0.037175f, -0.002700f, 0.014491f, -0.114439f, -0.053167f, 0.056822f, -0.056684f, -0.062805f, -0.039032f, 0.046428f, -0.060366f, -0.094095f, 0.094635f, -0.027828f, -0.059560f, -0.003360f, 0.036827f, -0.036222f, -0.063925f, -0.001491f, 0.028778f, -0.003195f, -0.082180f, 0.019378f, -0.001428f, -0.036595f, 0.085945f, 0.081284f, -0.006381f, -0.032913f, -0.064177f, 0.099082f, 0.013549f, 0.017635f, 0.033950f, -0.024169f, -0.096206f, 0.043412f, 0.073161f, 0.058911f, -0.036570f, 0.021390f, 0.079837f, 0.046694f, -0.055591f, -0.012008f, -0.043652f, 0.019749f, 0.011808f, 0.050613f, 0.049537f, -0.059562f, -0.002261f, -0.006006f, 0.008785f, -0.022983f, 0.023828f, -0.014954f, 0.013727f, 0.012860f, 0.009999f, -0.016549f, 0.012927f, -0.024872f, 0.041494f, -0.020783f, -0.010796f, 0.026863f, 0.022964f, -0.023669f, 0.003695f, -0.010822f, -0.028195f, -0.014569f, 0.011152f, 0.022593f, 0.013411f, -0.022217f, 0.012632f, -0.014087f, -0.035020f, 0.002263f, 0.006149f, -0.005032f, -0.002951f, + 0.024359f, 0.001425f, 0.003243f, 0.011117f, -0.002579f, 0.005958f, -0.036781f, 0.028064f, -0.094545f, 0.010399f, 0.089163f, 0.048533f, 0.012493f, -0.001166f, -0.016111f, 0.023138f, -0.031406f, 0.074000f, -0.005619f, 0.019690f, 0.027386f, -0.025537f, 0.001034f, -0.003279f, -0.028170f, -0.000180f, 0.010750f, 0.041465f, -0.000096f, -0.025856f, 0.012869f, 0.033342f, -0.005473f, 0.052890f, -0.041084f, 0.008503f, 0.012008f, 0.013729f, 0.046002f, -0.025262f, 0.004122f, -0.001843f, -0.059857f, 0.008398f, -0.019515f, -0.032871f, 0.014096f, -0.012592f, 0.047192f, 0.033803f, -0.024618f, -0.053893f, 0.025628f, 0.005048f, 0.010862f, 0.029866f, 0.065476f, -0.011317f, 0.013650f, -0.026730f, 0.037627f, 0.026668f, 0.028160f, -0.031357f, 0.043087f, -0.014953f, -0.018648f, -0.037809f, -0.003248f, -0.015061f, 0.055769f, -0.041681f, 0.003130f, 0.013560f, -0.012555f, -0.025522f, 0.077835f, -0.003596f, 0.018588f, -0.007331f, 0.009516f, -0.006658f, 0.021943f, -0.002910f, -0.009305f, -0.006449f, -0.008166f, 0.025780f, 0.018229f, 0.024256f, 0.013787f, 0.007650f, -0.016563f, 0.017892f, 0.001621f, 0.009878f, + 0.008797f, 0.021801f, -0.002888f, 0.000681f, 0.003741f, 0.006918f, 0.007463f, 0.016219f, -0.013283f, 0.010197f, 0.009199f, 0.007934f, 0.006964f, 0.005471f, 0.016193f, 0.006081f, -0.020716f, 0.012617f, 0.014777f, 0.015128f, 0.006867f, 0.016257f, 0.004749f, -0.001108f, 0.009502f, 0.005236f, 0.012020f, -0.001040f, -0.010178f, 0.002498f, 0.016556f, -0.008351f, 0.007038f, 0.000765f, 0.018010f, 0.015874f, 0.006452f, 0.011130f, 0.016775f, 0.007634f, 0.031216f, -0.082557f, -0.231910f, -0.220492f, 0.095980f, 0.009515f, 0.212197f, 0.449424f, 0.098482f, 0.181207f, 0.096695f, -0.333153f, -0.149078f, -0.224016f, -0.329083f, -0.021933f, 0.038990f, -0.155371f, 0.138290f, 0.235248f, 0.144047f, 0.405030f, 0.248571f, 0.002433f, -0.037388f, -0.143113f, -0.357555f, -0.289546f, -0.124779f, -0.274261f, -0.080923f, 0.157069f, 0.046682f, 0.039891f, 0.370911f, 0.143264f, 0.090370f, 0.343445f, 0.016278f, -0.017158f, 0.158268f, -0.078612f, -0.282986f, -0.136813f, -0.282780f, -0.412862f, -0.045759f, -0.187436f, -0.153194f, 0.132450f, 0.256414f, 0.118850f, 0.453101f, 0.361234f, 0.209325f, 0.274401f, + 0.092888f, -0.134163f, -0.207132f, -0.275856f, -0.442236f, -0.354279f, -0.237915f, -0.202416f, -0.063101f, 0.154263f, 0.233885f, 0.260995f, 0.350430f, 0.295364f, 0.138239f, 0.050588f, 0.075936f, -0.118081f, -0.181491f, -0.128561f, -0.271137f, -0.203703f, -0.035186f, -0.121496f, 0.048261f, 0.198746f, 0.070836f, 0.101556f, 0.144075f, 0.015626f, 0.008547f, -0.034850f, -0.135901f, -0.070838f, 0.001048f, -0.053935f, 0.041829f, 0.057836f, -0.023471f, 0.073265f, 0.062599f, -0.098023f, 0.075084f, 0.088072f, -0.062012f, 0.143354f, 0.021679f, -0.140395f, 0.098332f, -0.076845f, -0.275171f, -0.045089f, -0.167306f, -0.202572f, 0.125142f, 0.016272f, 0.031714f, 0.265082f, 0.168019f, 0.187678f, 0.300700f, 0.221815f, 0.073160f, 0.032155f, -0.209763f, -0.380532f, -0.379311f, -0.379628f, -0.359715f, -0.218777f, 0.011078f, 0.207304f, 0.303293f, 0.416494f, 0.386022f, 0.365580f, 0.287391f, 0.049598f, -0.132378f, -0.144147f, -0.305462f, -0.376969f, -0.227382f, -0.202684f, -0.113476f, 0.022198f, 0.054840f, 0.067222f, 0.130301f, 0.115713f, 0.107666f, 0.153526f, 0.125994f, 0.081849f, 0.070487f, 0.018747f, + -0.041628f, -0.071572f, -0.082518f, -0.085100f, -0.048489f, -0.024579f, -0.017177f, -0.015640f} + }, + { + {-0.009421f, -0.003640f, 0.002164f, -0.001773f, -0.005438f, -0.000423f, 0.012508f, -0.006465f, 0.001437f, -0.002745f, -0.000166f, -0.004825f, 0.008996f, -0.004711f, -0.005012f, -0.005666f, 0.010725f, -0.006423f, -0.001697f, -0.003053f, 0.003001f, 0.004929f, 0.006268f, -0.008908f, -0.000043f, 0.008462f, 0.003738f, 0.001420f, -0.000490f, -0.001096f, 0.003817f, 0.008627f, 0.002070f, -0.011158f, -0.005755f, -0.006020f, 0.009692f, -0.001030f, 0.007391f, -0.004693f, 0.003416f, 0.009682f, -0.004754f, -0.007355f, 0.002583f, -0.002774f, -0.000508f, -0.006585f, -0.002662f, -0.004930f, 0.001844f, -0.008916f, -0.002947f, -0.002308f, -0.000300f, 0.011982f, -0.003938f, -0.001842f, -0.000444f, -0.003185f, -0.001260f, -0.001170f, 0.007261f, 0.003730f, 0.004448f, -0.006286f, 0.004574f, 0.004783f, -0.004270f, 0.001958f, 0.002845f, -0.003252f, -0.004378f, 0.005076f, -0.007669f, 0.005378f, 0.003262f, 0.001399f, -0.007107f, -0.002494f, 0.002641f, -0.000661f, -0.001480f, -0.001948f, -0.000170f, -0.003842f, -0.004427f, -0.000713f, -0.000731f, 0.000499f, -0.001665f, 0.000006f, 0.002621f, -0.000131f, 0.000976f, 0.000342f, + 0.000518f, -0.000004f, -0.000513f, -0.001948f, -0.001154f, 0.001281f, -0.000681f, 0.000034f, -0.000262f, -0.005905f, 0.006242f, 0.000728f, -0.002695f, -0.004031f, -0.001101f, -0.002053f, 0.000007f, -0.004995f, -0.003833f, 0.002817f, -0.000790f, -0.001927f, -0.008715f, -0.001315f, 0.008106f, -0.005478f, -0.001367f, 0.006092f, -0.003522f, -0.006555f, -0.004989f, 0.004148f, 0.000036f, -0.000656f, -0.001257f, -0.006289f, 0.002111f, -0.002812f, -0.001472f, 0.007068f, -0.003900f, -0.009629f, -0.002863f, 0.000510f, 0.002880f, 0.002500f, 0.000826f, -0.007323f, -0.001684f, -0.008916f, -0.008078f, -0.002203f, 0.008466f, -0.001492f, -0.016729f, -0.000781f, 0.005637f, 0.004864f, -0.003452f, 0.003262f, 0.003601f, 0.000306f, 0.004979f, -0.009044f, -0.006377f, -0.000879f, 0.002619f, 0.000380f, 0.001868f, -0.001004f, 0.002362f, 0.002106f, 0.003485f, -0.000560f, 0.002150f, 0.002007f, -0.001679f, 0.003421f, -0.000853f, -0.008826f, -0.007198f, -0.004705f, -0.003711f, -0.003986f, 0.001205f, -0.002041f, 0.006814f, 0.005590f, -0.001038f, -0.002757f, -0.002363f, -0.001301f, 0.002050f, 0.003174f, 0.000410f, -0.001921f, + 0.000348f, 0.000409f, -0.001858f, 0.002378f, 0.000018f, -0.000599f, -0.000928f, -0.000245f, -0.001381f, 0.000927f, -0.000270f, 0.000142f, -0.001599f, 0.000915f, -0.001006f, -0.000031f, 0.000015f, 0.000621f, -0.000264f, -0.000805f, -0.000306f, -0.001549f, -0.000584f, 0.000112f, -0.000739f, 0.000088f, -0.001252f, 0.007653f, 0.004275f, 0.011465f, 0.000755f, -0.002270f, -0.001424f, 0.008107f, -0.002224f, 0.004342f, -0.007447f, -0.000805f, -0.000211f, 0.004248f, 0.002954f, 0.007268f, 0.005115f, -0.003765f, -0.007351f, -0.006013f, 0.004083f, -0.002576f, 0.005583f, 0.003497f, 0.000732f, -0.000387f, 0.004639f, 0.003252f, -0.003401f, 0.003809f, -0.007914f, -0.001127f, -0.007337f, -0.006299f, -0.008827f, 0.002539f, 0.005008f, -0.000966f, 0.006973f, -0.005468f, 0.006459f, -0.013148f, 0.005026f, 0.002199f, 0.009683f, 0.002807f, 0.003469f, 0.005196f, -0.000249f, -0.003382f, 0.003609f, 0.008428f, 0.002866f, 0.004063f, -0.001381f, -0.000187f, -0.012019f, -0.000837f, 0.001897f, 0.002272f, -0.001775f, 0.006365f, 0.012020f, -0.004064f, -0.008672f, 0.005727f, 0.001264f, -0.006175f, -0.000111f, -0.002885f, + -0.006191f, 0.000719f, 0.008646f, 0.002125f, 0.003138f, 0.001417f, -0.000935f, 0.003249f, 0.002023f, -0.000214f, 0.002838f, 0.000135f, -0.000796f, -0.000684f, -0.001644f, 0.001633f, -0.002410f, -0.000345f, 0.004013f, -0.000920f, -0.000101f, 0.001490f, -0.000955f, 0.002694f, -0.003838f, -0.001773f, 0.000054f, -0.001579f, -0.001677f, 0.000358f, -0.000944f, 0.001266f, 0.002941f, -0.001160f, 0.001660f, 0.000394f, 0.000171f, -0.000011f, 0.000408f, -0.003361f, -0.000855f, -0.000802f, 0.000648f, 0.002670f, 0.001608f, 0.004219f, 0.006309f, 0.006069f, -0.005879f, 0.009263f, -0.003297f, -0.006158f, -0.009100f, 0.002109f, -0.012035f, -0.000755f, 0.001249f, 0.003326f, -0.007677f, 0.004957f, -0.000125f, 0.001102f, 0.003212f, 0.001972f, 0.002718f, -0.010361f, -0.000697f, -0.002347f, -0.006760f, 0.003948f, 0.001987f, 0.001550f, 0.005797f, 0.020404f, -0.001506f, 0.001047f, 0.002908f, 0.005041f, 0.001995f, -0.016752f, 0.003478f, -0.002784f, -0.001925f, 0.009173f, 0.000268f, 0.004564f, 0.006616f, -0.008265f, -0.004614f, -0.002385f, -0.008020f, -0.017192f, 0.000810f, -0.006481f, -0.001038f, -0.001499f, + -0.000356f, -0.003986f, -0.008416f, 0.002389f, -0.008053f, -0.002556f, 0.001813f, -0.008975f, 0.009290f, 0.003208f, 0.002640f, -0.003770f, -0.000690f, -0.001468f, 0.001846f, -0.002892f, 0.004769f, -0.007361f, 0.002445f, 0.011197f, 0.009272f, -0.003239f, 0.004715f, -0.004407f, 0.001998f, -0.008346f, -0.000277f, 0.005198f, 0.005992f, 0.005366f, -0.000926f, 0.009988f, 0.000911f, 0.004995f, 0.004456f, -0.000170f, 0.002076f, 0.001094f, 0.000372f, -0.001682f, 0.001002f, 0.001562f, -0.000603f, 0.000184f, -0.001128f, -0.002735f, -0.000430f, 0.001885f, -0.001470f, 0.004036f, -0.001116f, -0.002081f, -0.001785f, 0.001424f, -0.001008f, 0.001774f, -0.000339f, -0.001681f, 0.001008f, -0.000456f, 0.002078f, 0.001281f, 0.001220f, 0.000851f, -0.003608f, -0.000835f, 0.000490f, 0.001564f, 0.000055f, 0.000319f, -0.000967f, 0.013621f, -0.017334f, 0.000707f, -0.010684f, 0.005427f, 0.007842f, 0.009567f, -0.001516f, -0.009141f, 0.000205f, 0.009424f, 0.001988f, 0.001780f, -0.007135f, -0.000980f, -0.012473f, 0.016512f, -0.000906f, -0.012763f, 0.013761f, 0.003425f, 0.004059f, -0.000927f, -0.005002f, -0.001655f, + -0.006597f, -0.006509f, 0.005068f, 0.007202f, -0.001501f, 0.006794f, -0.005651f, -0.003543f, -0.000027f, 0.009493f, 0.008989f, -0.002559f, -0.005108f, 0.007384f, 0.004705f, 0.000666f, 0.006252f, 0.001465f, -0.007401f, 0.007731f, 0.004818f, -0.000612f, -0.002588f, 0.002113f, -0.007975f, 0.021153f, -0.001121f, -0.000787f, 0.015760f, -0.001465f, -0.009680f, -0.005268f, -0.001163f, 0.003817f, -0.010059f, 0.006838f, 0.002052f, 0.000208f, -0.009134f, -0.007708f, -0.016126f, -0.001452f, 0.007492f, 0.003710f, 0.009091f, -0.005079f, -0.003595f, 0.019050f, -0.005319f, 0.003161f, -0.002669f, -0.007934f, 0.000593f, 0.003462f, -0.008268f, -0.014662f, 0.000594f, -0.009052f, -0.009120f, -0.004479f, 0.004737f, 0.000397f, -0.001390f, -0.005624f, -0.001931f, 0.000614f, -0.002107f, -0.001585f, 0.001484f, 0.005184f, 0.000721f, 0.001284f, -0.003702f, -0.001911f, -0.000396f, -0.000063f, -0.005217f, -0.003842f, -0.003317f, -0.000223f, 0.001248f, 0.000482f, -0.001708f, 0.000100f, -0.000344f, -0.000553f, -0.002742f, -0.001028f, -0.000407f, -0.001070f, -0.001441f, -0.018285f, -0.000280f, -0.007736f, -0.008740f, 0.002544f, + -0.010482f, 0.000211f, 0.007035f, 0.003793f, 0.014827f, -0.024950f, 0.015886f, -0.002733f, 0.006900f, -0.004850f, -0.003645f, -0.013154f, 0.011555f, 0.010180f, 0.002498f, -0.011704f, -0.000724f, -0.006808f, -0.000887f, 0.012005f, 0.008336f, 0.001764f, 0.011441f, -0.000256f, 0.000508f, 0.001039f, -0.000487f, -0.008158f, 0.017147f, -0.001821f, 0.000076f, 0.019929f, -0.013004f, 0.004695f, -0.006247f, -0.001396f, 0.006243f, -0.002828f, -0.010276f, 0.019179f, 0.014940f, -0.000635f, 0.004793f, 0.007986f, 0.020734f, -0.002789f, -0.003837f, -0.011388f, 0.001896f, 0.003865f, -0.012038f, -0.012839f, -0.011298f, 0.013360f, 0.000227f, -0.005603f, 0.009157f, 0.006487f, 0.000041f, -0.003277f, 0.002930f, -0.007340f, -0.001931f, -0.007979f, -0.001851f, 0.007397f, -0.014675f, 0.003394f, -0.003136f, -0.010177f, 0.006131f, 0.009680f, 0.004095f, 0.010083f, 0.008731f, -0.007494f, -0.011965f, -0.005991f, 0.005194f, -0.004737f, -0.009207f, 0.005906f, 0.009964f, -0.007303f, 0.001204f, 0.002110f, 0.001084f, -0.006821f, 0.003931f, -0.003048f, -0.002428f, -0.004383f, -0.002311f, -0.003434f, -0.000364f, -0.000397f, + 0.001295f, 0.002090f, -0.001745f, -0.001505f, -0.000685f, -0.002727f, -0.001599f, -0.000744f, -0.001097f, 0.002143f, 0.002688f, 0.000685f, 0.003964f, -0.003684f, 0.002677f, -0.003197f, -0.001455f, 0.002743f, 0.013691f, 0.014527f, 0.002408f, -0.012518f, -0.001722f, -0.011889f, 0.004959f, 0.031282f, 0.007722f, 0.021677f, 0.007965f, 0.000278f, -0.020218f, -0.004963f, 0.003332f, 0.019581f, -0.008656f, -0.004306f, -0.007539f, 0.001884f, 0.015738f, -0.011512f, 0.007706f, 0.013626f, 0.003029f, 0.005020f, -0.008910f, 0.016837f, -0.003604f, 0.021926f, -0.000205f, -0.006693f, -0.020567f, 0.002530f, 0.000077f, 0.024541f, -0.007402f, -0.001990f, 0.015558f, 0.000125f, 0.002061f, -0.005047f, -0.016083f, 0.001735f, 0.009264f, -0.011539f, -0.009107f, 0.002417f, -0.019288f, 0.010597f, 0.010708f, -0.003242f, -0.001254f, 0.005453f, 0.010921f, -0.000914f, -0.006721f, -0.000244f, 0.016037f, -0.002037f, -0.002466f, -0.006054f, 0.020762f, 0.021034f, 0.001422f, -0.003802f, 0.003276f, -0.000887f, 0.005480f, 0.009727f, -0.000804f, 0.014045f, -0.005468f, -0.007787f, -0.011362f, 0.003851f, -0.000933f, -0.017272f, + -0.012467f, -0.007166f, 0.013587f, -0.003968f, -0.006365f, -0.001746f, 0.000002f, -0.005855f, -0.008856f, -0.003103f, -0.002599f, -0.005280f, 0.000862f, -0.003310f, -0.002915f, 0.002793f, -0.005629f, -0.005795f, 0.001819f, 0.004654f, -0.002808f, -0.003732f, -0.002832f, -0.004868f, -0.002342f, 0.001519f, -0.001690f, 0.000838f, 0.002561f, -0.000855f, -0.001450f, -0.004294f, 0.002647f, 0.000373f, -0.013795f, 0.013986f, 0.010641f, 0.000824f, -0.009152f, -0.010277f, -0.004473f, -0.020417f, 0.023713f, 0.017838f, -0.003823f, 0.006612f, 0.002140f, -0.003896f, 0.017980f, -0.001442f, -0.008362f, 0.026617f, -0.028841f, 0.007450f, 0.012424f, -0.000099f, -0.011796f, 0.012686f, 0.001959f, 0.018343f, -0.007099f, -0.001971f, 0.004887f, 0.007329f, 0.001236f, -0.002507f, 0.026683f, 0.011513f, -0.012204f, -0.018424f, 0.012814f, -0.018432f, -0.005355f, -0.021221f, -0.002756f, 0.031772f, 0.012992f, 0.015360f, 0.000105f, -0.016856f, -0.002813f, -0.008236f, -0.003670f, 0.023762f, -0.003710f, -0.026186f, -0.002122f, 0.005140f, -0.016668f, -0.002764f, 0.010736f, 0.008455f, -0.011207f, -0.005850f, 0.011467f, 0.015188f, + -0.004422f, 0.015822f, 0.000274f, 0.003979f, 0.005913f, 0.001342f, 0.006208f, 0.009492f, 0.009177f, 0.008939f, -0.004711f, -0.018998f, -0.020997f, 0.005235f, -0.004226f, 0.015009f, -0.002696f, 0.017813f, 0.006019f, 0.008287f, -0.009496f, -0.008466f, 0.006340f, -0.000328f, 0.001291f, 0.001664f, 0.000782f, -0.008516f, -0.003912f, -0.001318f, -0.007084f, -0.000208f, -0.006087f, 0.001095f, -0.003442f, 0.002625f, -0.000866f, 0.004547f, -0.000010f, 0.002489f, 0.000794f, -0.002286f, -0.002001f, -0.002739f, 0.005623f, 0.000648f, -0.001673f, 0.001790f, 0.002904f, 0.002435f, 0.000543f, -0.004166f, -0.011653f, -0.006601f, 0.000041f, -0.005635f, -0.000143f, 0.011528f, -0.001635f, 0.010743f, -0.021942f, 0.007657f, 0.006041f, 0.003047f, -0.014422f, -0.012093f, -0.015352f, 0.011694f, 0.006013f, -0.011018f, -0.010993f, 0.014740f, 0.004692f, -0.001352f, -0.009277f, -0.015236f, -0.006305f, 0.005968f, -0.009806f, 0.000986f, -0.018254f, -0.005234f, 0.001958f, 0.006031f, 0.011667f, -0.002080f, 0.007386f, 0.010131f, -0.010674f, -0.025332f, 0.017146f, 0.000617f, -0.004170f, 0.016303f, -0.002727f, 0.000475f, + -0.011292f, 0.014304f, -0.009444f, -0.011945f, -0.004786f, 0.011693f, 0.017834f, 0.014958f, 0.004514f, 0.002866f, -0.032013f, 0.014273f, -0.002133f, 0.005895f, -0.011196f, -0.002266f, -0.012506f, -0.004461f, -0.003224f, -0.016534f, -0.008443f, -0.006887f, -0.009159f, 0.016755f, -0.005663f, 0.021848f, -0.002843f, -0.001428f, 0.013615f, 0.015582f, 0.026365f, 0.018038f, -0.000578f, -0.008803f, -0.001221f, -0.000146f, -0.012958f, 0.003035f, -0.008442f, -0.014167f, 0.026953f, -0.017435f, -0.018537f, -0.002839f, 0.009999f, 0.001322f, 0.003066f, 0.001180f, 0.011287f, -0.000326f, 0.003033f, 0.003917f, -0.004521f, 0.000534f, 0.006911f, -0.004034f, 0.002796f, 0.004927f, 0.004029f, 0.008659f, 0.001879f, 0.000038f, 0.004737f, 0.000765f, -0.001710f, 0.003161f, 0.004909f, 0.001891f, -0.000069f, 0.001454f, 0.000743f, 0.010068f, 0.000768f, 0.008185f, 0.005441f, 0.001180f, 0.008615f, 0.009450f, 0.000913f, -0.000319f, 0.001247f, 0.001273f, 0.001125f, -0.000859f, -0.001164f, 0.002369f, -0.005937f, -0.008508f, -0.033827f, 0.007503f, -0.023276f, -0.013925f, 0.022040f, 0.017148f, -0.038626f, -0.035410f, + 0.001205f, 0.015133f, -0.008979f, 0.009345f, -0.012747f, -0.001418f, -0.022424f, -0.005847f, -0.020244f, -0.001438f, -0.005540f, 0.000660f, 0.007780f, 0.006388f, 0.012606f, -0.001554f, -0.010752f, 0.009353f, -0.012823f, -0.005130f, 0.004112f, 0.000821f, 0.006532f, 0.013388f, -0.002166f, 0.001696f, 0.003074f, -0.005422f, -0.001425f, -0.019593f, -0.023219f, -0.022468f, 0.000017f, -0.022603f, 0.007570f, 0.002977f, -0.008941f, -0.010515f, -0.004531f, -0.003764f, -0.001952f, -0.013462f, -0.021268f, -0.001213f, 0.033739f, 0.018590f, -0.004773f, -0.020176f, -0.020840f, 0.023280f, -0.021887f, -0.007234f, -0.003911f, -0.014618f, -0.011097f, -0.014901f, -0.017437f, -0.024251f, -0.032801f, -0.004737f, -0.005310f, -0.004691f, 0.010955f, 0.010365f, 0.002692f, 0.009078f, -0.007472f, -0.009134f, 0.030272f, 0.012794f, -0.008126f, -0.022383f, 0.006890f, -0.013264f, -0.015733f, -0.000103f, 0.025375f, -0.005103f, -0.000269f, 0.017436f, -0.002031f, -0.011714f, 0.000432f, 0.004110f, -0.000426f, -0.004832f, -0.004673f, -0.000191f, 0.004225f, 0.002035f, 0.002795f, 0.001701f, 0.008615f, -0.002617f, 0.004594f, -0.012614f, + 0.005721f, 0.002976f, -0.002339f, 0.002600f, -0.002724f, 0.004554f, -0.002361f, -0.003719f, -0.002197f, 0.004131f, 0.003534f, 0.000417f, 0.004761f, -0.007184f, 0.007038f, -0.003613f, -0.004401f, 0.002159f, -0.027850f, 0.003107f, 0.013933f, 0.015142f, 0.014035f, 0.005884f, 0.027753f, -0.011068f, -0.020343f, -0.005384f, 0.003486f, -0.004189f, 0.008771f, 0.018437f, 0.037309f, 0.023433f, 0.013625f, 0.017332f, -0.014526f, -0.027700f, -0.009571f, -0.020775f, 0.023356f, 0.005215f, -0.005061f, -0.016874f, 0.026515f, 0.022770f, -0.008591f, -0.001805f, -0.000237f, -0.013914f, -0.011636f, -0.020875f, 0.006039f, 0.007034f, 0.011689f, -0.019746f, 0.001665f, 0.005474f, -0.009063f, -0.019192f, 0.000430f, 0.010957f, 0.014514f, 0.002348f, -0.037455f, -0.013468f, -0.018551f, 0.007509f, 0.022108f, -0.000150f, -0.021083f, 0.004853f, -0.020357f, 0.011063f, -0.005055f, 0.001653f, -0.014484f, 0.029962f, 0.023622f, -0.007595f, -0.007113f, -0.017517f, -0.001323f, 0.023921f, 0.005384f, 0.029430f, 0.028368f, 0.023622f, 0.013831f, 0.004730f, -0.019177f, -0.010755f, -0.025470f, 0.029099f, 0.029256f, -0.002489f, + -0.022510f, 0.014278f, 0.034011f, -0.000547f, 0.004240f, -0.008363f, -0.000889f, -0.022514f, 0.003483f, -0.017779f, 0.012042f, 0.004153f, 0.016975f, 0.016867f, 0.009147f, 0.001313f, 0.001451f, 0.010396f, 0.003786f, -0.002548f, -0.006959f, -0.002353f, -0.010587f, 0.001751f, 0.008135f, -0.007025f, -0.003954f, -0.008026f, 0.005733f, -0.001873f, 0.012294f, -0.011785f, 0.003119f, -0.000478f, 0.011709f, -0.005759f, 0.003863f, 0.007049f, 0.001275f, -0.000456f, 0.000416f, 0.002012f, -0.005404f, -0.002234f, 0.007017f, -0.018405f, -0.004592f, 0.013541f, 0.023575f, -0.024650f, -0.029938f, -0.025869f, 0.028522f, -0.011803f, 0.019078f, -0.000281f, 0.000346f, 0.045849f, -0.005491f, 0.003373f, -0.020253f, -0.031638f, 0.007946f, -0.004724f, 0.008586f, 0.005559f, -0.002480f, -0.018105f, 0.005184f, 0.006757f, 0.003239f, -0.017095f, 0.011384f, 0.008229f, 0.033514f, -0.015429f, 0.002363f, 0.018274f, 0.018771f, 0.000722f, 0.018955f, -0.004771f, 0.000831f, 0.016866f, 0.014330f, 0.003818f, -0.007288f, -0.026919f, -0.020338f, 0.015794f, -0.000368f, -0.006162f, -0.005275f, 0.004007f, 0.036225f, -0.002229f, + -0.012558f, 0.018413f, -0.008807f, 0.017404f, 0.004252f, 0.052161f, -0.010179f, -0.001676f, -0.000090f, 0.007757f, 0.017846f, -0.003473f, -0.006043f, 0.011605f, -0.024448f, 0.019970f, 0.036733f, 0.010881f, -0.007674f, 0.020492f, -0.007784f, -0.001077f, 0.041549f, -0.023979f, 0.009218f, 0.016319f, -0.006947f, 0.034594f, 0.008313f, 0.007434f, -0.013257f, -0.019909f, 0.003570f, 0.009058f, -0.021347f, 0.021752f, 0.000002f, 0.005508f, 0.000145f, 0.006350f, 0.020083f, -0.004551f, 0.020264f, 0.009612f, 0.006697f, 0.011292f, 0.010089f, -0.005877f, 0.012790f, 0.011890f, -0.010387f, 0.003944f, 0.008815f, 0.016209f, 0.003866f, 0.004677f, 0.008118f, 0.009494f, 0.014432f, 0.001479f, 0.000518f, -0.000856f, 0.009891f, 0.008369f, -0.009046f, -0.000137f, 0.006554f, 0.009222f, 0.007266f, -0.005403f, 0.013758f, -0.000371f, 0.004793f, 0.001697f, 0.011370f, 0.005791f, 0.005324f, 0.005445f, 0.007883f, 0.004435f, 0.005257f, 0.009086f, -0.026021f, -0.007411f, 0.017929f, -0.008595f, -0.013547f, -0.012083f, -0.012398f, 0.002318f, 0.018032f, -0.002204f, -0.039792f, 0.000111f, -0.030215f, 0.011872f, + 0.013117f, 0.000340f, 0.006249f, -0.013237f, -0.001614f, 0.016199f, -0.038101f, 0.009810f, -0.008238f, 0.021414f, 0.014869f, 0.009684f, 0.001783f, -0.015134f, -0.034372f, -0.001739f, -0.030024f, 0.018734f, 0.000380f, -0.009009f, 0.031880f, 0.016565f, -0.012526f, -0.009951f, -0.006469f, -0.004745f, -0.008724f, -0.017005f, 0.003237f, 0.005003f, 0.046066f, -0.001453f, -0.032672f, 0.000073f, 0.022591f, 0.001746f, -0.016738f, 0.010760f, -0.025333f, 0.017123f, -0.010605f, 0.011375f, -0.014677f, 0.006949f, -0.025909f, 0.068759f, 0.002772f, 0.047529f, -0.004417f, -0.012931f, 0.012497f, -0.015235f, -0.014862f, 0.026514f, 0.025896f, -0.022461f, -0.059576f, 0.056952f, -0.019779f, -0.015534f, -0.007294f, -0.007928f, 0.007711f, -0.005178f, 0.004584f, 0.024565f, 0.006047f, -0.019782f, -0.015862f, -0.011972f, 0.007493f, -0.012517f, -0.001662f, 0.011441f, -0.030857f, -0.002637f, 0.002110f, -0.004831f, -0.008970f, 0.003509f, -0.006323f, 0.016929f, -0.006583f, 0.007544f, -0.007457f, -0.005486f, 0.000507f, -0.007848f, 0.004650f, 0.004028f, -0.003164f, 0.004263f, -0.007142f, 0.003541f, -0.001829f, -0.000549f, + -0.003168f, 0.000097f, -0.012880f, -0.009488f, -0.001765f, -0.005287f, -0.010532f, -0.014061f, -0.007832f, -0.003433f, -0.005547f, -0.001197f, -0.009342f, -0.000011f, -0.008292f, -0.002413f, -0.010825f, 0.005849f, -0.005989f, -0.003353f, -0.029334f, -0.010415f, -0.008925f, -0.025221f, -0.044416f, -0.010962f, 0.000697f, -0.023590f, 0.011530f, -0.010094f, 0.019737f, -0.017021f, -0.007130f, -0.024252f, 0.057791f, 0.048893f, -0.010987f, 0.010903f, 0.033570f, -0.035318f, 0.035794f, -0.014899f, -0.014943f, 0.012905f, 0.004710f, 0.006118f, -0.005287f, -0.007788f, 0.000990f, 0.011590f, 0.009996f, -0.015705f, 0.017971f, -0.016924f, -0.028171f, 0.020424f, 0.017960f, -0.023451f, -0.029147f, -0.033678f, -0.004953f, -0.005584f, 0.009405f, -0.021996f, -0.027573f, -0.014079f, 0.046097f, 0.016135f, 0.015670f, -0.019760f, 0.017769f, 0.024267f, -0.018965f, 0.045305f, 0.008389f, -0.016215f, -0.021271f, 0.012125f, -0.017871f, -0.038748f, 0.009409f, -0.000443f, 0.000840f, 0.021179f, 0.019694f, -0.017029f, 0.003204f, -0.049658f, -0.006204f, -0.019585f, 0.041062f, 0.002453f, 0.005759f, -0.023952f, 0.019402f, -0.042186f, + -0.005168f, 0.016504f, 0.004717f, -0.004587f, -0.004857f, 0.005114f, -0.001992f, 0.004759f, -0.006354f, 0.001186f, 0.003456f, 0.010037f, 0.002447f, 0.003200f, -0.002338f, 0.005959f, -0.006235f, 0.001917f, 0.018681f, -0.003680f, 0.000797f, -0.005991f, 0.008298f, 0.003887f, -0.001045f, 0.009808f, -0.010365f, -0.009795f, 0.010596f, -0.008935f, -0.003365f, -0.008185f, 0.004461f, -0.011972f, -0.005453f, -0.003898f, 0.009568f, 0.009651f, -0.015452f, 0.002432f, 0.007828f, -0.005289f, -0.017420f, -0.008382f, 0.012815f, -0.008401f, -0.021484f, 0.027221f, 0.028683f, 0.025957f, 0.017509f, -0.000223f, 0.023774f, 0.021559f, 0.003605f, -0.004082f, 0.009580f, 0.000064f, -0.024241f, -0.002885f, 0.009203f, -0.018952f, 0.027068f, -0.028223f, 0.022601f, 0.024615f, -0.007082f, -0.005552f, 0.010434f, 0.032845f, 0.024605f, -0.029683f, -0.006481f, -0.007943f, -0.002369f, 0.007421f, -0.013849f, -0.014499f, 0.032220f, 0.000810f, 0.046271f, -0.030216f, -0.028662f, 0.023299f, -0.015437f, 0.008406f, -0.018163f, 0.015557f, 0.017749f, 0.011721f, -0.007253f, -0.026546f, 0.002627f, 0.008841f, -0.022086f, -0.040558f, + -0.001403f, 0.003712f, -0.023949f, 0.043846f, -0.005004f, -0.012406f, 0.058230f, 0.054867f, 0.005475f, -0.007601f, -0.002048f, -0.011682f, 0.013201f, -0.028737f, 0.026956f, 0.003592f, -0.015646f, 0.032599f, 0.005223f, 0.006632f, -0.009296f, -0.017656f, -0.043738f, 0.009632f, -0.014900f, -0.007179f, 0.020170f, 0.008211f, -0.009605f, -0.028551f, -0.007909f, -0.032517f, 0.013903f, 0.029315f, -0.004142f, -0.022082f, -0.015470f, -0.022020f, 0.000243f, 0.011922f, 0.014230f, -0.002976f, -0.015626f, -0.008099f, -0.008529f, 0.002089f, -0.004739f, -0.007460f, 0.006279f, -0.001149f, -0.004622f, 0.007735f, -0.017664f, 0.005073f, 0.004555f, 0.027318f, 0.002466f, -0.006031f, -0.013979f, 0.012058f, -0.014604f, -0.001891f, 0.010205f, -0.019375f, 0.018066f, 0.003881f, -0.000786f, 0.003718f, 0.012214f, -0.006154f, -0.019168f, 0.000466f, -0.005703f, -0.002412f, 0.018407f, 0.017561f, -0.048063f, -0.111317f, 0.037306f, 0.035348f, -0.012452f, 0.007888f, -0.026807f, 0.048030f, 0.030714f, -0.027236f, 0.007755f, 0.006532f, 0.000685f, -0.012258f, -0.008838f, -0.057411f, 0.024278f, 0.028341f, -0.006554f, -0.000018f, + -0.003224f, 0.019073f, -0.014400f, 0.036400f, 0.010783f, -0.043265f, -0.024525f, 0.054946f, 0.036065f, -0.035805f, -0.008430f, -0.012725f, -0.021934f, 0.003429f, -0.008765f, 0.007842f, 0.071374f, 0.019467f, 0.074783f, 0.042735f, 0.048192f, 0.043940f, 0.086136f, -0.005638f, -0.008003f, 0.020622f, -0.006094f, -0.072242f, 0.058576f, -0.025363f, 0.033588f, -0.047745f, -0.037990f, -0.071320f, 0.014163f, -0.006547f, -0.023957f, 0.017431f, -0.033540f, 0.000153f, -0.047912f, -0.047821f, 0.013417f, 0.027975f, -0.038886f, -0.010284f, -0.026963f, -0.037402f, -0.042039f, -0.030167f, 0.022985f, -0.018207f, -0.052485f, 0.075409f, 0.047230f, 0.076032f, -0.009926f, -0.016327f, -0.015133f, -0.026786f, -0.043111f, -0.002723f, -0.009479f, -0.032584f, -0.010893f, 0.009635f, -0.023112f, -0.020802f, 0.002405f, -0.003378f, -0.010302f, -0.008414f, 0.018751f, 0.020021f, 0.000628f, 0.005085f, 0.014209f, 0.017852f, 0.003623f, -0.001448f, -0.002742f, 0.008423f, -0.003568f, 0.002145f, -0.003282f, -0.012481f, -0.000339f, 0.011882f, -0.012313f, 0.016213f, 0.020414f, 0.008681f, 0.000665f, 0.003393f, 0.002155f, -0.013555f, + 0.001121f, 0.007815f, -0.007005f, 0.000166f, -0.003202f, 0.002295f, -0.004857f, 0.001881f, 0.007594f, -0.010360f, -0.008879f, 0.016502f, 0.006703f, -0.002003f, 0.002506f, -0.040194f, -0.105936f, 0.046359f, 0.055310f, -0.024550f, -0.010507f, -0.002420f, 0.062589f, 0.002350f, 0.013648f, 0.013480f, -0.014305f, 0.012720f, 0.029335f, -0.005465f, -0.027556f, 0.007301f, 0.053283f, -0.027712f, -0.017223f, 0.011952f, -0.007060f, 0.039988f, -0.009592f, 0.018220f, -0.020097f, -0.024186f, -0.024174f, 0.026334f, -0.007493f, 0.023417f, 0.027223f, -0.006596f, 0.003874f, 0.000516f, -0.021638f, 0.007634f, -0.019598f, 0.023879f, 0.057955f, 0.095000f, -0.000850f, -0.002349f, -0.039752f, 0.022008f, 0.031298f, -0.000582f, 0.035109f, 0.050095f, 0.021242f, 0.028637f, -0.043319f, -0.025852f, 0.036573f, 0.094921f, -0.017009f, -0.055164f, 0.014461f, -0.018103f, -0.000691f, 0.025991f, 0.000791f, -0.024970f, -0.011803f, -0.012718f, -0.064016f, -0.026534f, 0.000724f, 0.011023f, 0.022736f, -0.003342f, -0.024435f, -0.013895f, 0.006366f, -0.009676f, -0.024544f, 0.025948f, 0.062176f, 0.027125f, 0.033626f, 0.003767f, + -0.008158f, -0.049977f, -0.010842f, 0.014648f, 0.011420f, -0.010920f, 0.028837f, -0.007722f, 0.016261f, -0.034877f, 0.002324f, -0.011797f, -0.009861f, 0.000689f, 0.010058f, 0.009936f, -0.009664f, -0.018815f, 0.018823f, -0.006918f, 0.015512f, 0.001719f, -0.003579f, 0.001608f, 0.003538f, 0.014454f, 0.000733f, -0.001887f, -0.007032f, -0.007726f, 0.012403f, 0.004376f, 0.011450f, -0.023620f, 0.016945f, 0.009999f, 0.004797f, -0.008336f, -0.002924f, 0.017764f, -0.001844f, 0.001039f, -0.013169f, 0.001608f, -0.020340f, -0.003997f, 0.006207f, 0.017805f, 0.008907f, 0.015771f, 0.033747f, 0.011213f, 0.017682f, 0.006927f, 0.050864f, -0.016044f, -0.006405f, -0.019996f, 0.011777f, -0.012417f, 0.011158f, 0.057739f, 0.011364f, -0.061162f, -0.014974f, -0.017835f, -0.052385f, 0.033266f, 0.015643f, -0.006045f, 0.007325f, 0.003279f, -0.023574f, -0.000195f, -0.001754f, -0.023308f, -0.007093f, 0.050417f, 0.073969f, 0.034976f, -0.025939f, -0.040803f, 0.019149f, 0.033884f, 0.003650f, 0.027118f, -0.018994f, -0.013018f, 0.027668f, 0.008836f, 0.000233f, -0.062117f, -0.081220f, -0.002567f, -0.047576f, -0.027464f, + 0.016772f, 0.067883f, 0.014513f, 0.003435f, -0.019852f, -0.023391f, -0.034193f, -0.029817f, 0.005356f, 0.020536f, -0.007475f, -0.033603f, -0.054468f, 0.021644f, 0.001190f, -0.030107f, -0.050804f, -0.034141f, -0.055905f, -0.100330f, -0.060871f, -0.008954f, -0.012295f, 0.120853f, -0.015043f, -0.004429f, 0.069279f, 0.008262f, 0.003625f, 0.041955f, -0.025278f, -0.060953f, -0.071296f, -0.010906f, -0.034316f, -0.037517f, -0.040342f, -0.043662f, 0.008230f, 0.039685f, 0.062484f, 0.037472f, 0.007365f, 0.004227f, -0.016504f, 0.032575f, 0.006325f, -0.009683f, -0.040883f, 0.008517f, 0.029108f, -0.001260f, -0.000501f, -0.014367f, 0.007744f, 0.016548f, 0.026560f, 0.007803f, 0.011055f, 0.010550f, 0.013073f, 0.016955f, 0.017032f, -0.004686f, 0.012852f, 0.002952f, -0.009732f, -0.020955f, -0.025743f, 0.002827f, 0.005623f, -0.024987f, -0.012796f, -0.024011f, 0.007519f, 0.012810f, 0.018875f, 0.028615f, 0.047354f, 0.035877f, 0.036005f, 0.022014f, 0.013783f, -0.008374f, 0.003419f, 0.000548f, -0.022727f, -0.033912f, -0.026232f, -0.028889f, 0.038115f, -0.054196f, 0.013627f, 0.008554f, -0.023631f, -0.075983f, + 0.051614f, 0.015293f, -0.004935f, -0.076935f, 0.020408f, 0.011889f, -0.040657f, 0.006747f, 0.035560f, 0.021847f, 0.010313f, -0.034849f, -0.007156f, -0.013032f, 0.006073f, -0.013145f, 0.003159f, -0.027000f, -0.038850f, 0.042504f, -0.029448f, 0.064612f, -0.039953f, -0.036158f, -0.024541f, -0.045445f, 0.003921f, -0.000911f, 0.067837f, -0.050357f, -0.053144f, 0.027324f, 0.017408f, -0.043971f, -0.058508f, -0.006520f, -0.033006f, 0.037824f, 0.007978f, -0.048412f, 0.031314f, -0.008302f, -0.074454f, 0.048785f, -0.033262f, 0.031828f, -0.055424f, -0.013586f, -0.001639f, -0.023312f, -0.009640f, 0.006327f, 0.069738f, -0.018899f, -0.006643f, -0.020125f, 0.019839f, -0.033107f, 0.025748f, 0.054529f, -0.003468f, 0.054828f, 0.042985f, -0.006604f, 0.087845f, -0.005203f, 0.010051f, -0.002637f, 0.024710f, 0.088627f, -0.007414f, -0.024574f, -0.094917f, 0.073382f, 0.026069f, 0.062647f, 0.021213f, -0.049287f, 0.021796f, 0.014043f, 0.008907f, -0.043760f, 0.024861f, 0.005093f, 0.007085f, -0.023534f, -0.006986f, 0.029920f, 0.025514f, 0.001115f, -0.003219f, -0.003076f, -0.003573f, 0.007315f, 0.018662f, -0.038432f, + -0.011474f, -0.005334f, 0.006004f, -0.007868f, 0.008405f, 0.008271f, 0.011988f, -0.008982f, -0.020549f, 0.031708f, 0.049524f, 0.017380f, -0.025598f, -0.021880f, -0.009539f, -0.007463f, 0.013321f, 0.006754f, -0.005089f, -0.031364f, -0.022582f, -0.025412f, -0.002604f, 0.024352f, 0.010591f, 0.020532f, 0.007739f, -0.034203f, -0.006237f, 0.014954f, 0.052035f, -0.100297f, 0.003839f, -0.112879f, -0.037826f, -0.019176f, 0.034354f, 0.104233f, 0.088592f, 0.032630f, 0.052304f, -0.033992f, -0.028640f, 0.005038f, -0.007691f, 0.024122f, 0.007643f, -0.023575f, 0.034964f, 0.051481f, 0.042786f, 0.031974f, 0.027035f, -0.000898f, 0.004814f, -0.017541f, 0.048722f, 0.022725f, -0.009343f, -0.030078f, 0.010038f, 0.019966f, -0.005333f, 0.063742f, 0.066598f, -0.038570f, -0.028512f, 0.001377f, 0.051732f, 0.032217f, 0.008272f, 0.006292f, -0.012389f, -0.023394f, 0.012866f, 0.079507f, -0.032254f, -0.039456f, -0.042897f, 0.041504f, 0.016953f, -0.023936f, -0.037109f, -0.059506f, -0.070399f, 0.007631f, 0.015385f, 0.012604f, -0.015558f, -0.005306f, -0.019399f, 0.013780f, -0.056165f, -0.092327f, -0.041613f, -0.006545f, + -0.015728f, -0.036136f, 0.046097f, 0.076982f, -0.017400f, 0.039647f, 0.085087f, 0.055403f, 0.019671f, -0.058868f, 0.009434f, 0.010411f, -0.052015f, -0.028881f, -0.008367f, -0.041523f, 0.045086f, 0.064175f, -0.003958f, -0.015019f, -0.008052f, -0.018949f, -0.010574f, -0.026466f, -0.025879f, -0.009669f, -0.012914f, 0.009060f, -0.005892f, -0.007334f, 0.012543f, -0.039251f, -0.004870f, 0.002991f, 0.039506f, -0.040806f, -0.006752f, -0.009477f, 0.007373f, -0.026074f, -0.009235f, 0.007650f, -0.014303f, -0.024131f, -0.004091f, -0.002080f, -0.023590f, 0.027315f, -0.037959f, -0.004519f, -0.014121f, 0.008123f, -0.004195f, -0.011394f, -0.022256f, 0.000444f, 0.010883f, -0.008151f, -0.063885f, 0.051322f, -0.006639f, 0.044078f, 0.026700f, 0.000908f, 0.029202f, -0.012970f, -0.003394f, 0.025120f, 0.030831f, 0.004649f, 0.000060f, -0.001135f, -0.028258f, -0.018415f, 0.007433f, -0.039376f, 0.000962f, -0.014881f, 0.000861f, -0.033408f, 0.005582f, 0.001728f, -0.030374f, 0.025157f, 0.010664f, 0.016984f, -0.038120f, -0.010400f, 0.007083f, -0.002128f, 0.002666f, 0.021679f, 0.004742f, 0.005971f, -0.004451f, -0.008572f, + -0.006039f, -0.003264f, 0.014001f, -0.006518f, -0.024363f, 0.019523f, -0.033470f, -0.010634f, -0.011532f, 0.003855f, -0.016420f, -0.019521f, 0.025353f, -0.003394f, -0.025575f, 0.015434f, -0.035638f, 0.028339f, 0.008797f, 0.001186f, 0.029282f, 0.032505f, 0.004473f, 0.009148f, -0.024587f, 0.031522f, -0.015566f, -0.021840f, -0.001929f, 0.004522f, 0.059840f, -0.027084f, -0.044289f, 0.037730f, -0.014473f, 0.037698f, -0.006462f, 0.002315f, -0.016607f, 0.022763f, -0.038487f, -0.032063f, -0.012669f, 0.014889f, 0.008957f, -0.002506f, 0.018384f, -0.023042f, -0.023171f, -0.015547f, 0.005437f, 0.006509f, 0.001339f, -0.001178f, -0.007025f, 0.003783f, -0.031944f, 0.006279f, 0.006490f, -0.007887f, -0.002974f, 0.009437f, -0.005136f, -0.013834f, 0.016496f, -0.008435f, 0.002032f, -0.000897f, -0.004189f, 0.010946f, 0.004818f, -0.011774f, -0.001327f, -0.002952f, -0.010350f, -0.002433f, -0.003828f, -0.021460f, 0.006497f, 0.012782f, 0.010391f, -0.009856f, 0.009707f, -0.015716f, -0.004822f, 0.000179f, -0.010018f, 0.030774f, -0.014270f, -0.166692f, -0.317489f, -0.113289f, -0.248692f, -0.283326f, 0.068826f, -0.010014f, + 0.094466f, 0.366242f, 0.397099f, 0.280270f, 0.399931f, 0.328631f, 0.108751f, 0.114785f, 0.084777f, -0.221463f, -0.228067f, -0.127080f, -0.221404f, -0.239263f, -0.080504f, -0.070878f, -0.201791f, -0.152136f, -0.025141f, -0.090342f, -0.110420f, -0.027810f, -0.084638f, -0.149264f, -0.085261f, 0.027200f, -0.060233f, -0.074075f, 0.086856f, -0.015380f, -0.083294f, 0.074856f, 0.139027f, -0.032835f, 0.034327f, 0.215801f, 0.029232f, -0.069910f, 0.142989f, 0.124882f, -0.124947f, 0.070688f, 0.157642f, -0.049884f, 0.016706f, 0.273630f, 0.208587f, 0.104851f, 0.384484f, 0.428196f, 0.218623f, 0.394313f, 0.509259f, 0.319481f, 0.301328f, 0.418666f, 0.268914f, 0.170923f, 0.189250f, 0.098264f, -0.115884f, -0.223563f, -0.303104f, -0.516849f, -0.628854f, -0.712789f, -0.806065f, -0.794742f, -0.861447f, -0.769576f, -0.571504f, -0.571397f, -0.450668f, -0.040958f, -0.023992f, 0.011006f, 0.321950f, 0.254277f, 0.084190f, 0.168534f, 0.251006f, 0.092586f, 0.111612f, 0.255003f, 0.185399f, 0.037342f, 0.152664f, 0.215804f, 0.092317f, 0.115997f, 0.265474f, 0.099124f, -0.042901f, 0.122156f, 0.085171f, -0.059539f, + 0.115196f, 0.256592f, 0.120389f, 0.189025f, 0.409700f, 0.340774f, 0.322736f, 0.481498f, 0.444507f, 0.306334f, 0.266166f, 0.238712f, 0.088929f, -0.004042f, 0.012174f, -0.050857f, -0.160916f, -0.160052f, -0.183859f, -0.314162f, -0.351531f, -0.336872f, -0.377984f, -0.453255f, -0.397193f, -0.383825f, -0.409589f, -0.317096f, -0.214604f, -0.167862f, -0.106002f, 0.003644f, 0.042060f, 0.035359f, 0.058610f, 0.064570f, 0.032951f, 0.030227f, 0.059190f, 0.051293f, 0.034765f, 0.041953f, 0.048952f, 0.037014f, 0.048042f, 0.073526f, 0.080820f, 0.077122f, 0.088413f, 0.086142f, 0.060208f, 0.048775f, 0.033277f, 0.025804f, 0.025114f}, + {-0.008142f, 0.006770f, 0.007248f, -0.003433f, 0.007274f, -0.004381f, -0.000954f, 0.009680f, -0.003957f, 0.004608f, 0.002815f, -0.010720f, -0.004831f, 0.008061f, -0.003129f, -0.001530f, 0.005076f, 0.003362f, 0.003620f, 0.000975f, 0.012411f, 0.002126f, -0.003177f, 0.002788f, -0.004275f, 0.007692f, -0.002200f, -0.004217f, -0.001824f, -0.010034f, -0.003388f, -0.007389f, 0.002440f, -0.000120f, 0.002731f, -0.002957f, 0.004226f, 0.001996f, -0.000445f, 0.001295f, 0.000692f, 0.000979f, 0.001375f, -0.005304f, 0.013278f, 0.001963f, -0.004816f, 0.009831f, -0.002347f, -0.008474f, -0.009282f, 0.009076f, -0.001790f, -0.000718f, 0.006018f, 0.000682f, -0.001547f, 0.004699f, -0.000489f, 0.002726f, 0.000799f, 0.003463f, -0.001785f, 0.003770f, -0.001681f, 0.004478f, 0.006509f, 0.003540f, -0.003825f, -0.003936f, -0.001925f, 0.001755f, -0.004088f, 0.002903f, -0.002000f, 0.003601f, 0.004695f, -0.005798f, -0.003263f, 0.005075f, 0.001523f, -0.001591f, 0.007827f, 0.004538f, 0.003744f, -0.000379f, 0.002075f, -0.000147f, 0.001059f, -0.000892f, 0.001205f, 0.000473f, 0.000582f, -0.001764f, 0.002912f, 0.000960f, + 0.000224f, -0.000491f, 0.001194f, 0.001903f, -0.000975f, 0.002048f, -0.000059f, 0.008507f, 0.001676f, 0.001939f, 0.007141f, 0.000092f, 0.005155f, 0.002456f, -0.000577f, 0.000553f, -0.005568f, 0.002612f, 0.000454f, 0.008749f, 0.003102f, 0.002874f, 0.000401f, 0.002592f, 0.009600f, -0.009046f, 0.005133f, 0.001363f, -0.005968f, -0.002667f, -0.003695f, -0.001201f, -0.003428f, 0.002440f, 0.011085f, 0.006983f, 0.008282f, 0.006584f, 0.011301f, 0.008239f, -0.010231f, -0.018567f, -0.002341f, 0.000887f, -0.004519f, 0.009808f, -0.000402f, 0.014683f, -0.006835f, -0.006852f, 0.006337f, 0.000365f, 0.000540f, 0.005826f, -0.010699f, 0.002772f, -0.007657f, 0.010172f, 0.005994f, -0.000015f, 0.015434f, 0.000710f, -0.001461f, -0.001886f, -0.002695f, -0.003801f, 0.007315f, 0.003928f, -0.003743f, -0.001204f, -0.010724f, -0.004693f, -0.001406f, 0.011284f, 0.007696f, 0.001408f, 0.005676f, 0.000244f, 0.006044f, 0.000044f, 0.002507f, -0.006412f, -0.004151f, 0.001605f, 0.000850f, -0.000300f, -0.003257f, 0.003063f, 0.003566f, -0.000864f, -0.003348f, -0.000571f, 0.003593f, -0.000522f, 0.001917f, -0.001672f, + -0.000989f, -0.001309f, 0.001149f, -0.001140f, 0.000211f, -0.000038f, 0.001818f, -0.001458f, 0.001755f, 0.002760f, -0.001279f, 0.000689f, 0.000225f, -0.000010f, 0.003264f, -0.001001f, 0.000829f, -0.001171f, 0.001297f, 0.001004f, 0.000555f, -0.000334f, 0.002862f, -0.000094f, 0.000139f, 0.001266f, 0.006758f, 0.015364f, 0.004510f, 0.000680f, 0.000481f, 0.004334f, 0.004040f, 0.000923f, 0.002428f, 0.003486f, -0.000234f, -0.000317f, 0.004395f, 0.017390f, 0.005816f, 0.013571f, -0.007686f, -0.006262f, -0.002545f, -0.008135f, -0.009538f, -0.003797f, 0.007057f, -0.011752f, -0.001646f, -0.001369f, -0.018507f, 0.003739f, -0.018696f, -0.006195f, -0.002491f, 0.004464f, 0.000060f, 0.003923f, -0.003650f, -0.000159f, -0.012619f, 0.004667f, -0.004184f, -0.007020f, 0.001332f, 0.003580f, -0.000587f, 0.000959f, 0.005399f, 0.009604f, -0.016113f, 0.004444f, 0.001095f, -0.004726f, -0.005132f, -0.001004f, 0.002227f, -0.002119f, -0.009693f, -0.002244f, 0.002640f, 0.005092f, -0.000664f, 0.012067f, 0.001065f, 0.000574f, 0.004921f, -0.007666f, 0.011395f, 0.003671f, 0.006773f, 0.003058f, 0.005668f, -0.001153f, + -0.001080f, 0.003404f, 0.001981f, -0.001554f, -0.003438f, -0.002757f, -0.005684f, -0.000126f, -0.007630f, 0.000542f, 0.004448f, -0.000365f, -0.003249f, -0.005949f, 0.005313f, -0.003153f, 0.002155f, 0.000840f, -0.000944f, -0.005659f, 0.000474f, -0.000511f, 0.001395f, -0.001717f, -0.001653f, 0.000508f, -0.001839f, -0.003102f, -0.001686f, -0.001285f, -0.000314f, -0.002037f, -0.000358f, -0.001150f, 0.002672f, -0.000478f, -0.001454f, -0.000465f, 0.001421f, -0.000555f, -0.002429f, -0.002572f, 0.002759f, 0.000065f, 0.000236f, -0.001620f, 0.009175f, 0.010026f, -0.000309f, 0.011060f, 0.000706f, -0.001427f, 0.001368f, 0.000939f, -0.002035f, -0.000091f, -0.007697f, -0.004381f, 0.006899f, 0.008120f, -0.009468f, -0.002241f, 0.003957f, -0.006299f, -0.018127f, 0.004539f, 0.006727f, 0.007911f, -0.004150f, -0.004784f, -0.006451f, 0.009922f, 0.011302f, 0.001962f, 0.004472f, -0.008833f, -0.007154f, 0.008412f, 0.003190f, -0.006613f, 0.011668f, -0.011647f, 0.001962f, 0.001146f, 0.010944f, 0.004045f, -0.002396f, 0.001814f, -0.003764f, 0.006027f, -0.014227f, -0.004189f, -0.020507f, -0.008928f, 0.010416f, -0.000835f, + 0.015961f, -0.002138f, -0.013286f, 0.008461f, 0.001877f, -0.005405f, -0.000609f, 0.000682f, -0.005364f, 0.003571f, 0.009571f, 0.010792f, 0.000321f, 0.005177f, -0.000468f, 0.012274f, -0.006204f, 0.005328f, -0.001123f, -0.000179f, 0.000426f, 0.004271f, -0.001224f, 0.015347f, 0.001569f, 0.001423f, -0.002334f, 0.009057f, 0.003125f, -0.003008f, -0.006407f, 0.000176f, 0.006207f, 0.002168f, 0.001852f, -0.003964f, -0.000163f, 0.001275f, -0.000569f, -0.001028f, -0.001052f, -0.002100f, 0.001718f, 0.000178f, 0.000782f, 0.001341f, 0.003286f, -0.001230f, -0.003289f, 0.003725f, -0.000935f, 0.000406f, 0.000129f, -0.000400f, -0.000376f, 0.001501f, 0.001398f, 0.001824f, -0.000584f, 0.001704f, 0.000018f, 0.001001f, 0.001719f, -0.000346f, 0.000273f, 0.001450f, 0.002209f, 0.001207f, 0.001418f, 0.000465f, 0.000233f, 0.011217f, -0.015209f, -0.002091f, -0.010304f, -0.010701f, 0.003852f, 0.002091f, 0.022178f, 0.001170f, 0.008175f, -0.018483f, -0.004405f, 0.004101f, -0.009589f, 0.006369f, 0.001876f, 0.001584f, 0.005430f, 0.006275f, 0.014564f, 0.006493f, -0.002273f, 0.004621f, -0.007217f, 0.002133f, + 0.005897f, -0.000382f, 0.001249f, 0.006468f, 0.008369f, 0.020134f, 0.003970f, -0.002973f, -0.013726f, -0.000561f, 0.010491f, -0.016272f, 0.001846f, -0.001178f, 0.005167f, -0.008147f, -0.009577f, 0.017440f, -0.011080f, 0.003615f, -0.000648f, -0.010889f, 0.025231f, 0.006521f, 0.013258f, 0.007136f, 0.014494f, -0.002628f, -0.005367f, 0.009227f, -0.008414f, 0.007100f, -0.006689f, 0.003877f, 0.010021f, 0.005525f, -0.004386f, -0.000729f, 0.005161f, -0.008772f, -0.006437f, 0.000544f, -0.000961f, 0.014929f, -0.008104f, -0.013908f, -0.002001f, 0.007769f, 0.012639f, -0.007752f, -0.013094f, -0.002872f, 0.018434f, 0.002449f, 0.000080f, -0.006529f, 0.000994f, -0.000358f, 0.005764f, 0.005846f, -0.000268f, 0.002809f, 0.003223f, -0.008919f, -0.001955f, 0.003105f, -0.000330f, 0.005247f, 0.002192f, 0.000548f, -0.003676f, -0.000375f, -0.000402f, 0.002028f, -0.000490f, 0.005474f, -0.000941f, -0.000543f, -0.002585f, 0.000625f, -0.003298f, 0.000177f, -0.000251f, 0.001382f, 0.003305f, 0.000131f, 0.002789f, -0.000151f, -0.003078f, -0.000620f, 0.000445f, -0.005873f, 0.006684f, -0.024099f, 0.013657f, 0.004012f, + -0.005390f, 0.007326f, -0.019693f, -0.016439f, 0.002134f, -0.008119f, 0.018644f, 0.016556f, 0.017607f, -0.011755f, 0.006848f, 0.000257f, 0.017552f, 0.001237f, 0.012411f, 0.004965f, -0.005245f, -0.015801f, -0.014315f, 0.004563f, -0.019076f, -0.000294f, -0.004502f, -0.009279f, -0.012739f, -0.007495f, 0.000117f, 0.015342f, 0.000062f, 0.005976f, -0.021823f, -0.012203f, -0.002315f, -0.013697f, 0.000958f, 0.013687f, -0.014814f, 0.006107f, -0.000177f, -0.005081f, -0.001374f, -0.003192f, 0.015088f, 0.008080f, 0.007522f, -0.003638f, -0.004589f, 0.020755f, -0.006279f, -0.005687f, -0.017124f, 0.012486f, -0.024312f, 0.003305f, -0.007993f, 0.003772f, 0.008642f, -0.005885f, -0.012974f, -0.008054f, 0.000889f, 0.017596f, -0.008856f, -0.001983f, -0.011438f, -0.009251f, 0.005706f, 0.006086f, 0.013932f, -0.016313f, -0.000130f, -0.008661f, -0.005682f, 0.003371f, -0.006429f, -0.012829f, -0.007296f, -0.001179f, 0.011710f, 0.011871f, 0.004131f, 0.000584f, 0.001741f, 0.005382f, 0.000467f, 0.000784f, 0.002475f, -0.003438f, 0.000350f, 0.004871f, -0.001472f, 0.000514f, 0.006031f, -0.001554f, -0.000222f, 0.000892f, + 0.004392f, -0.000105f, 0.000690f, 0.001519f, 0.000754f, 0.003605f, -0.004341f, -0.004896f, -0.000315f, -0.001840f, 0.000058f, 0.002598f, -0.001164f, 0.004905f, 0.003133f, -0.022498f, 0.005994f, 0.002045f, 0.003733f, -0.030964f, 0.027622f, 0.000543f, -0.000639f, -0.000571f, -0.010076f, 0.003227f, 0.000325f, 0.009878f, -0.008701f, 0.011079f, 0.003137f, -0.006937f, -0.011946f, -0.014919f, 0.007440f, 0.001303f, -0.001325f, 0.001004f, -0.008632f, 0.009265f, 0.006893f, 0.017110f, 0.010138f, 0.006757f, 0.009407f, -0.002248f, -0.009500f, -0.007098f, 0.000519f, -0.004992f, 0.007357f, -0.008374f, -0.012708f, -0.013888f, 0.000757f, -0.018993f, 0.008607f, 0.009922f, -0.011412f, 0.011567f, -0.013771f, 0.006874f, -0.020287f, 0.002714f, -0.003787f, 0.001469f, -0.005451f, -0.000313f, -0.018884f, -0.003159f, -0.006554f, -0.011941f, -0.003283f, -0.009330f, 0.002880f, -0.008409f, -0.004928f, -0.012066f, 0.005241f, -0.011538f, -0.000938f, 0.018483f, -0.003245f, 0.000547f, 0.005908f, -0.004115f, -0.018874f, -0.021426f, -0.003671f, -0.014981f, 0.000640f, -0.004088f, 0.013867f, 0.001018f, 0.005153f, -0.014113f, + 0.001141f, -0.003184f, -0.002673f, 0.010199f, 0.002419f, -0.001216f, -0.005667f, 0.002772f, 0.003847f, 0.001434f, 0.005264f, -0.000225f, 0.002886f, -0.001611f, -0.000674f, 0.000797f, 0.000820f, 0.001920f, -0.000637f, 0.005928f, -0.001807f, -0.005058f, 0.001953f, -0.000070f, 0.001401f, 0.001957f, 0.001135f, -0.000736f, -0.002730f, 0.001507f, -0.004700f, 0.001768f, 0.008859f, 0.006059f, -0.019271f, -0.000683f, 0.003353f, -0.017951f, -0.020416f, 0.011055f, -0.020043f, 0.003805f, 0.013258f, -0.009759f, -0.023023f, -0.009908f, 0.000487f, 0.015086f, -0.006205f, 0.026665f, -0.001894f, -0.002174f, -0.015481f, -0.011029f, -0.001872f, 0.005334f, 0.001456f, -0.005585f, -0.004687f, -0.001317f, -0.005807f, -0.011524f, 0.009383f, -0.009563f, -0.005868f, 0.009956f, 0.002919f, -0.016241f, -0.017254f, -0.015903f, 0.013631f, -0.014798f, -0.015944f, 0.025849f, -0.016331f, 0.011357f, -0.002325f, 0.006908f, -0.023450f, 0.010608f, 0.001289f, -0.003909f, -0.001206f, -0.004677f, 0.007506f, 0.005428f, 0.021988f, -0.005678f, -0.004244f, 0.010338f, 0.021247f, 0.005732f, 0.004235f, -0.010220f, -0.006725f, -0.017697f, + -0.003795f, -0.000583f, -0.000251f, 0.012590f, -0.004073f, 0.006666f, 0.022244f, -0.003575f, -0.000887f, -0.002747f, -0.000508f, -0.022830f, -0.025994f, 0.001172f, 0.017039f, 0.000063f, -0.034483f, 0.008845f, -0.012118f, 0.005629f, -0.021562f, -0.013531f, -0.003426f, 0.000467f, -0.007950f, 0.003303f, 0.007865f, -0.001130f, -0.001146f, -0.000919f, -0.003764f, 0.003375f, -0.004281f, 0.003358f, 0.000436f, 0.000978f, -0.003750f, -0.002688f, -0.005202f, 0.002207f, 0.000275f, -0.001774f, -0.004996f, -0.001277f, -0.001572f, -0.003338f, -0.003726f, 0.002018f, -0.004223f, -0.001783f, 0.003408f, 0.000852f, -0.002104f, -0.000509f, -0.000008f, -0.005460f, 0.000442f, 0.009593f, -0.001514f, 0.011349f, -0.001641f, -0.004678f, -0.006816f, 0.009648f, 0.005971f, -0.005227f, 0.004411f, 0.009823f, -0.005033f, -0.032981f, -0.014330f, -0.006389f, -0.003622f, 0.014881f, -0.025880f, -0.018927f, 0.015967f, 0.009987f, 0.040103f, 0.011410f, 0.009279f, 0.011135f, 0.005120f, -0.007054f, 0.000839f, -0.007433f, 0.012795f, 0.000703f, 0.012912f, 0.000524f, -0.000340f, -0.017446f, 0.009141f, -0.011788f, 0.009280f, -0.001690f, + 0.009728f, 0.003993f, 0.013049f, -0.020197f, 0.002388f, -0.013963f, 0.016978f, 0.001192f, -0.017035f, 0.022672f, 0.016647f, 0.010856f, -0.010213f, -0.034125f, 0.009864f, -0.003554f, -0.004266f, 0.016975f, -0.001638f, 0.007953f, 0.016224f, -0.003406f, -0.020620f, 0.000014f, 0.009217f, 0.006201f, -0.005557f, -0.002100f, -0.015128f, 0.005811f, 0.002034f, 0.003396f, -0.002302f, 0.002345f, 0.012956f, -0.007886f, 0.005888f, -0.001925f, -0.000539f, 0.023626f, -0.006340f, 0.010972f, 0.007669f, -0.007161f, -0.008291f, 0.003142f, 0.001703f, -0.003715f, 0.001905f, -0.003874f, 0.003700f, -0.003434f, 0.008836f, 0.001043f, 0.008440f, 0.001873f, -0.000304f, 0.010967f, 0.003716f, -0.002937f, 0.002917f, -0.002271f, -0.003448f, 0.001803f, 0.004164f, -0.003808f, 0.002610f, -0.001841f, -0.004286f, 0.000067f, 0.004137f, -0.001702f, -0.004771f, 0.001691f, -0.002306f, -0.006916f, 0.002965f, 0.000291f, -0.003820f, -0.001893f, -0.001364f, -0.003790f, -0.000503f, 0.005598f, 0.007462f, -0.006932f, 0.008596f, -0.009384f, -0.037291f, 0.007687f, 0.009144f, 0.037913f, -0.007881f, -0.006014f, 0.017967f, 0.023587f, + -0.038282f, -0.021797f, 0.021006f, -0.010806f, 0.000761f, 0.008671f, -0.024364f, -0.053415f, -0.020946f, 0.030492f, 0.024236f, 0.020546f, -0.006158f, 0.011559f, -0.006187f, 0.010655f, -0.011091f, 0.003813f, -0.026934f, 0.006709f, -0.009468f, 0.013934f, 0.013507f, 0.000571f, -0.012685f, 0.012700f, 0.007999f, 0.021856f, -0.002194f, -0.013397f, -0.006665f, -0.034163f, -0.017465f, 0.008513f, -0.002237f, -0.022846f, 0.015638f, 0.021470f, -0.030215f, 0.029386f, -0.002742f, -0.003107f, 0.018461f, 0.003902f, 0.017456f, -0.002173f, 0.006275f, -0.006508f, -0.003490f, 0.008927f, 0.035021f, -0.012532f, 0.022313f, -0.001754f, 0.002126f, 0.008497f, 0.019433f, -0.017807f, 0.002122f, 0.028535f, 0.008514f, -0.012908f, 0.007608f, 0.011343f, 0.002655f, 0.022453f, 0.016167f, 0.028195f, -0.002513f, 0.008174f, -0.000231f, 0.001100f, -0.015591f, -0.010717f, -0.012394f, -0.005895f, -0.000009f, -0.002487f, -0.005008f, -0.004325f, 0.008399f, 0.012266f, 0.005577f, -0.006132f, 0.009784f, -0.002723f, -0.001556f, -0.005737f, -0.004702f, 0.006294f, 0.002052f, -0.002110f, 0.000399f, -0.006376f, -0.005515f, -0.006272f, + 0.000150f, -0.003446f, 0.005701f, 0.003630f, -0.002412f, 0.002654f, 0.006672f, -0.003945f, 0.003069f, 0.004026f, -0.003559f, -0.003086f, -0.003791f, -0.000487f, -0.001087f, 0.004279f, -0.001410f, -0.001602f, -0.024208f, -0.006073f, 0.025254f, 0.016089f, 0.019075f, -0.012157f, -0.006061f, -0.001844f, -0.002512f, 0.027037f, 0.003615f, -0.027554f, -0.012202f, -0.008339f, 0.017897f, 0.003592f, 0.003962f, 0.015205f, 0.033161f, -0.048691f, 0.032513f, -0.006312f, -0.005636f, -0.012502f, 0.009773f, 0.010074f, 0.019167f, 0.003071f, 0.018274f, -0.001769f, -0.004700f, 0.005735f, -0.002892f, 0.009371f, 0.016816f, 0.002078f, -0.001113f, 0.022027f, -0.016161f, -0.002933f, 0.005495f, -0.001815f, 0.019472f, -0.022724f, 0.002225f, -0.019434f, 0.003321f, -0.020612f, -0.002776f, 0.000724f, 0.011498f, 0.028118f, -0.016209f, -0.008933f, -0.016808f, -0.000911f, -0.024635f, -0.016030f, -0.016148f, 0.011072f, 0.020395f, 0.000327f, 0.040263f, -0.025369f, 0.035996f, -0.025210f, -0.005764f, 0.011125f, 0.008300f, 0.035596f, 0.020630f, -0.026557f, 0.014054f, -0.011106f, -0.036645f, -0.000876f, -0.023177f, 0.029443f, + 0.044812f, 0.028465f, -0.005401f, -0.015784f, -0.005683f, 0.025025f, -0.003571f, 0.013058f, 0.001661f, 0.005803f, 0.008974f, 0.002822f, 0.003663f, 0.002972f, -0.010753f, 0.007593f, 0.000282f, 0.003211f, -0.004058f, -0.003582f, -0.010197f, -0.005784f, -0.003413f, 0.006363f, -0.003018f, 0.004263f, 0.005532f, -0.002042f, -0.001168f, 0.000135f, 0.006282f, 0.003878f, 0.002428f, 0.011406f, -0.000014f, 0.011915f, -0.010453f, -0.004710f, 0.007841f, 0.007371f, -0.004280f, 0.002498f, -0.003563f, -0.007793f, 0.001082f, -0.024791f, -0.015691f, 0.000016f, 0.031289f, -0.005443f, 0.014124f, 0.029082f, -0.023681f, 0.010906f, -0.038174f, 0.023827f, -0.023236f, -0.011165f, 0.037938f, 0.013137f, 0.040863f, -0.016842f, 0.000754f, -0.017883f, 0.012160f, 0.052201f, 0.013790f, 0.017953f, -0.025687f, -0.004634f, 0.001779f, 0.020317f, 0.018101f, 0.033533f, -0.026477f, -0.009003f, -0.028854f, -0.024531f, 0.002345f, 0.002395f, 0.017878f, -0.016635f, 0.012670f, -0.039493f, 0.025489f, 0.019318f, 0.009507f, -0.006412f, -0.004215f, 0.002928f, 0.012360f, 0.004256f, 0.003845f, 0.000126f, 0.027608f, 0.023549f, + 0.010546f, 0.002405f, -0.020006f, -0.019885f, 0.056444f, 0.002390f, 0.007499f, 0.031492f, 0.014320f, -0.008515f, -0.006066f, 0.020144f, 0.040798f, -0.028879f, -0.011633f, -0.032585f, -0.030040f, 0.039706f, 0.018161f, 0.000712f, -0.007205f, 0.013367f, 0.030499f, 0.019428f, 0.031455f, 0.008939f, -0.013263f, 0.022705f, -0.015464f, -0.040691f, 0.012673f, 0.001767f, 0.001242f, 0.000397f, 0.017729f, 0.029967f, -0.005491f, 0.016000f, 0.018028f, 0.016180f, 0.002441f, 0.003816f, 0.015875f, 0.000483f, -0.004178f, -0.003067f, -0.005865f, 0.015239f, -0.008129f, -0.002212f, 0.004322f, 0.008718f, 0.001784f, -0.001116f, 0.016535f, 0.003608f, -0.002827f, 0.012295f, 0.015845f, 0.007301f, -0.005812f, 0.000195f, -0.002296f, 0.004958f, 0.000711f, 0.000304f, 0.000145f, -0.003275f, 0.005894f, 0.002297f, 0.001922f, 0.005429f, 0.007385f, -0.000966f, -0.006833f, -0.002635f, -0.000371f, 0.009245f, 0.003756f, 0.001548f, -0.001236f, 0.012163f, -0.026045f, -0.019449f, -0.007585f, -0.024239f, 0.027393f, -0.003051f, -0.006906f, -0.023086f, -0.003778f, -0.021496f, -0.053221f, 0.009274f, -0.006486f, -0.016802f, + 0.012131f, -0.028258f, -0.001628f, -0.015444f, -0.042634f, -0.009790f, -0.018440f, -0.020247f, 0.034246f, -0.009152f, -0.012226f, -0.006228f, -0.000681f, -0.008689f, -0.011953f, -0.001967f, 0.009122f, 0.028862f, 0.021894f, -0.000870f, -0.001561f, -0.048544f, 0.003089f, 0.006566f, 0.020010f, -0.011260f, -0.009944f, 0.073504f, -0.012504f, -0.036045f, -0.034810f, 0.030434f, -0.020293f, 0.008722f, -0.041276f, 0.010218f, -0.011471f, -0.022259f, -0.019009f, -0.047212f, 0.007727f, 0.013430f, 0.033666f, 0.009755f, -0.017980f, 0.026298f, 0.003292f, 0.024728f, 0.027780f, 0.079430f, 0.021511f, 0.005409f, -0.030753f, -0.034781f, -0.009137f, 0.003576f, -0.004237f, -0.031497f, 0.014283f, 0.036263f, 0.008605f, 0.025754f, 0.040303f, 0.035802f, -0.015051f, -0.028905f, -0.019457f, 0.002394f, 0.006587f, -0.003668f, -0.030315f, 0.005743f, -0.024609f, 0.007444f, -0.010796f, 0.001469f, -0.013480f, 0.008845f, -0.002043f, 0.005566f, 0.000983f, -0.006016f, -0.013764f, -0.003387f, -0.000098f, 0.008032f, 0.011627f, 0.008803f, 0.013368f, 0.000578f, 0.011482f, 0.019414f, 0.000741f, 0.003533f, 0.011303f, 0.003623f, + -0.009643f, -0.005860f, -0.016616f, -0.005190f, 0.010455f, 0.005548f, 0.001556f, -0.002433f, 0.006749f, 0.003414f, -0.003257f, -0.008104f, -0.014449f, 0.001735f, 0.002660f, -0.002311f, -0.004497f, -0.001324f, -0.004871f, -0.010617f, -0.032075f, -0.013846f, -0.004925f, 0.009964f, -0.011694f, 0.019163f, -0.009872f, -0.013093f, 0.037151f, 0.019355f, 0.042240f, 0.000605f, -0.012209f, -0.016583f, 0.044782f, -0.038352f, -0.014289f, 0.052279f, -0.031452f, 0.010514f, 0.010915f, 0.013624f, 0.003116f, 0.029419f, -0.009106f, 0.026486f, -0.009969f, 0.005860f, 0.006356f, -0.013493f, 0.019659f, -0.029632f, -0.020651f, -0.019196f, -0.008825f, -0.026326f, -0.048653f, -0.008772f, -0.014543f, 0.007841f, -0.012512f, -0.064607f, 0.018024f, 0.040744f, -0.002311f, -0.008548f, 0.063649f, -0.078703f, -0.017019f, 0.044063f, -0.010740f, 0.034220f, -0.025025f, -0.015443f, 0.011874f, -0.075099f, 0.024366f, -0.025498f, 0.037647f, 0.027752f, -0.039952f, 0.079050f, 0.011685f, 0.004308f, -0.004008f, 0.031227f, -0.057070f, 0.023507f, -0.002647f, -0.008938f, 0.015346f, -0.036781f, 0.052292f, 0.047564f, -0.087612f, 0.012733f, + -0.017404f, -0.082137f, -0.014122f, -0.036592f, 0.020295f, 0.005335f, 0.014310f, -0.033074f, 0.051685f, -0.004910f, -0.013810f, 0.024002f, -0.000938f, 0.017096f, -0.003555f, 0.026906f, 0.000702f, 0.013493f, 0.004212f, -0.001020f, -0.002785f, 0.015114f, -0.010762f, -0.011996f, 0.000334f, -0.014118f, 0.021452f, -0.004509f, -0.011016f, 0.001313f, 0.009911f, 0.004891f, 0.010222f, 0.004102f, 0.024887f, 0.006045f, -0.013412f, 0.025895f, -0.013874f, 0.014806f, 0.022235f, -0.006012f, 0.005068f, 0.015714f, -0.010611f, 0.015455f, 0.002504f, 0.048380f, -0.021567f, -0.062246f, -0.062451f, 0.005025f, 0.007829f, -0.027419f, 0.016397f, -0.034713f, 0.011244f, -0.015697f, 0.032251f, 0.041288f, 0.001427f, 0.039949f, 0.036359f, -0.020089f, -0.000425f, -0.025719f, -0.006388f, -0.005979f, 0.014095f, -0.002453f, -0.003890f, -0.004244f, -0.041684f, -0.063092f, -0.025306f, 0.033056f, 0.025587f, -0.027021f, -0.031089f, 0.018300f, 0.018550f, -0.040998f, 0.020829f, -0.027245f, -0.004991f, 0.031888f, 0.044249f, 0.000414f, -0.026055f, 0.017004f, 0.003480f, 0.027620f, 0.004886f, 0.023067f, 0.023819f, -0.006577f, + -0.090404f, 0.010377f, 0.002502f, 0.036753f, -0.013206f, 0.037483f, 0.037161f, -0.024640f, -0.122536f, -0.016318f, 0.005165f, -0.014602f, 0.073926f, 0.077549f, 0.054148f, 0.077061f, -0.019748f, 0.036315f, -0.030193f, 0.051558f, 0.036190f, -0.060429f, 0.076706f, -0.078987f, -0.067245f, -0.063382f, 0.020368f, 0.047968f, 0.039975f, 0.013520f, -0.049462f, 0.045996f, 0.006564f, -0.016281f, -0.021073f, 0.002883f, 0.043451f, -0.033295f, -0.013205f, 0.066281f, 0.012413f, 0.030413f, 0.005995f, 0.003400f, 0.016486f, -0.024784f, 0.013662f, -0.010017f, 0.000719f, 0.006965f, -0.006164f, -0.012751f, -0.008313f, -0.011136f, -0.024883f, 0.005821f, 0.023508f, -0.004443f, 0.024035f, 0.018634f, -0.015013f, -0.011871f, -0.011068f, 0.014914f, 0.009471f, -0.030426f, -0.017508f, 0.001795f, 0.001744f, -0.004367f, 0.004315f, 0.020283f, -0.000239f, 0.016169f, 0.001912f, -0.011631f, -0.048373f, -0.091572f, 0.019519f, 0.034057f, -0.004724f, 0.046735f, 0.018031f, -0.057686f, -0.014396f, 0.012528f, 0.014461f, 0.016156f, -0.011491f, 0.027055f, 0.002497f, -0.017058f, -0.007714f, 0.009777f, 0.038391f, 0.050042f, + 0.037862f, 0.059971f, -0.057249f, -0.015729f, -0.014706f, -0.058551f, -0.013892f, 0.010335f, 0.003194f, 0.006765f, -0.023226f, -0.026278f, 0.030078f, 0.067376f, -0.031591f, 0.034890f, -0.022496f, 0.009243f, -0.020735f, -0.003357f, -0.052162f, -0.018834f, -0.002812f, -0.072285f, -0.042227f, -0.070738f, -0.059747f, 0.039942f, 0.093750f, 0.074906f, 0.002356f, -0.004467f, 0.000413f, -0.016598f, -0.032022f, -0.113245f, -0.037773f, -0.016048f, 0.009417f, 0.005088f, -0.039886f, -0.027753f, 0.014872f, 0.050170f, 0.029944f, 0.016330f, 0.032810f, 0.056243f, 0.022084f, -0.055829f, 0.043048f, -0.032972f, -0.017242f, 0.033460f, 0.074930f, 0.016331f, 0.096031f, -0.022634f, -0.099533f, -0.011303f, -0.032025f, -0.060897f, 0.092337f, 0.026378f, 0.030145f, 0.000034f, -0.008050f, 0.026887f, 0.022172f, 0.001491f, -0.003577f, -0.015790f, -0.003070f, -0.004542f, 0.025352f, 0.030632f, 0.036509f, -0.003925f, -0.001180f, -0.001260f, -0.001156f, 0.024028f, -0.010060f, -0.007784f, -0.013827f, -0.010778f, 0.013709f, -0.002577f, -0.000259f, 0.004230f, 0.008811f, 0.014204f, 0.017510f, -0.002224f, -0.010110f, -0.017816f, + 0.009197f, 0.003571f, 0.008689f, 0.022692f, 0.019929f, -0.009803f, 0.005187f, 0.010330f, -0.017274f, -0.005185f, -0.003795f, -0.016623f, -0.007505f, -0.000550f, 0.015487f, -0.039211f, -0.064156f, 0.039542f, -0.006322f, -0.038790f, 0.018568f, 0.041936f, 0.036298f, -0.074941f, -0.064756f, 0.016028f, -0.030147f, 0.007543f, 0.036478f, -0.020019f, -0.014791f, 0.060371f, 0.016299f, -0.008553f, -0.019364f, -0.017300f, 0.022583f, -0.013741f, -0.002793f, -0.001916f, -0.024751f, -0.009655f, -0.041105f, -0.054695f, 0.019353f, 0.029642f, -0.034586f, 0.025043f, 0.017096f, -0.012049f, -0.024037f, 0.003534f, 0.042990f, 0.024683f, 0.007634f, -0.043305f, -0.048405f, -0.023672f, 0.012910f, 0.053892f, -0.040636f, -0.021597f, -0.018548f, 0.032122f, 0.086940f, 0.022894f, -0.085287f, -0.019077f, -0.010150f, 0.043580f, 0.000858f, 0.022499f, -0.011250f, -0.020354f, -0.018995f, -0.048375f, 0.044814f, 0.047461f, 0.019060f, 0.050188f, -0.015890f, 0.032406f, -0.015213f, -0.036488f, -0.040344f, -0.043148f, 0.007476f, -0.080651f, 0.084287f, -0.004121f, -0.032179f, -0.046693f, -0.038209f, -0.002726f, -0.025061f, -0.007685f, + -0.044426f, -0.027512f, -0.078846f, -0.022053f, -0.051987f, 0.018979f, -0.018535f, 0.015186f, 0.017539f, 0.018780f, -0.013122f, 0.043372f, -0.009990f, 0.031383f, 0.001061f, 0.007453f, -0.002563f, 0.013581f, -0.006829f, -0.017567f, 0.003478f, 0.004879f, 0.016106f, -0.026160f, -0.009196f, 0.006612f, -0.025776f, -0.000033f, 0.009325f, -0.032198f, -0.014142f, 0.007556f, -0.004546f, -0.024690f, -0.038083f, -0.022933f, 0.013794f, -0.007335f, 0.017361f, 0.004100f, 0.000599f, 0.025677f, 0.001716f, 0.022074f, 0.008517f, 0.013722f, 0.051659f, 0.030900f, -0.014607f, 0.007794f, 0.065210f, 0.048916f, 0.018649f, 0.009577f, 0.030646f, 0.027733f, -0.044416f, -0.064016f, 0.021658f, 0.049780f, 0.071325f, 0.000260f, -0.016064f, -0.044747f, -0.026291f, 0.029846f, -0.000940f, -0.038234f, -0.076855f, -0.076929f, 0.016102f, -0.023256f, 0.042983f, -0.088619f, -0.029283f, 0.017007f, 0.012665f, 0.016637f, -0.028053f, 0.012642f, -0.002436f, -0.016820f, -0.003353f, -0.041714f, 0.038237f, 0.047018f, 0.035058f, -0.056100f, -0.029915f, -0.001561f, 0.018911f, 0.027877f, 0.030051f, 0.023900f, -0.006352f, -0.004209f, + -0.007600f, 0.039750f, 0.110886f, 0.069820f, -0.057772f, -0.057031f, -0.036135f, -0.073404f, 0.086194f, 0.045758f, -0.026728f, -0.076142f, -0.072746f, 0.082494f, 0.050880f, 0.010855f, 0.063648f, -0.066345f, -0.007314f, 0.003873f, -0.017033f, 0.006222f, -0.024633f, -0.067121f, 0.016619f, -0.051360f, 0.068379f, 0.064422f, -0.024679f, -0.011722f, 0.000748f, 0.007185f, 0.072776f, 0.074230f, -0.118059f, -0.066083f, -0.037934f, 0.014657f, 0.033178f, 0.031875f, -0.045735f, -0.049280f, -0.057944f, -0.007394f, 0.060108f, 0.001119f, 0.011976f, -0.013935f, -0.064086f, 0.014550f, -0.026859f, -0.033773f, 0.014672f, 0.112052f, 0.037990f, -0.021252f, -0.028734f, -0.027139f, -0.022173f, 0.029245f, 0.035103f, 0.040303f, -0.007247f, 0.025914f, -0.039678f, 0.009351f, 0.014544f, 0.017835f, -0.014242f, 0.007466f, 0.033265f, -0.008886f, -0.009336f, -0.005839f, 0.032848f, 0.021005f, 0.051104f, 0.012555f, -0.018062f, -0.014020f, 0.018996f, 0.062761f, 0.051461f, 0.010384f, -0.037718f, -0.046871f, -0.014861f, -0.011534f, 0.011158f, -0.023191f, 0.043423f, -0.071041f, 0.061891f, 0.091249f, 0.099055f, -0.111717f, + 0.020515f, -0.003550f, -0.009594f, 0.047227f, -0.020168f, -0.033244f, 0.032739f, 0.016600f, 0.067899f, -0.007023f, -0.053752f, 0.001516f, -0.024523f, 0.040001f, -0.061757f, -0.021995f, -0.029014f, -0.041284f, 0.056412f, -0.041381f, -0.005840f, 0.038699f, 0.022574f, -0.013839f, -0.021546f, -0.057957f, 0.007507f, 0.075988f, 0.046416f, -0.003440f, 0.022691f, -0.017349f, 0.062248f, -0.042103f, 0.028786f, -0.023326f, 0.038697f, 0.064015f, -0.014201f, -0.041908f, 0.020661f, -0.057085f, 0.094280f, 0.010832f, -0.049916f, -0.017342f, -0.077918f, 0.009716f, 0.111818f, -0.020586f, -0.065644f, -0.046166f, 0.068598f, 0.020201f, -0.035860f, -0.002093f, 0.017765f, 0.038163f, 0.094258f, -0.077084f, 0.034336f, 0.076882f, -0.011567f, -0.091504f, -0.088189f, -0.052018f, 0.154827f, -0.113527f, 0.038495f, -0.119561f, -0.057172f, 0.248736f, 0.024097f, -0.108939f, -0.104197f, -0.120634f, 0.151883f, 0.019190f, -0.028529f, -0.120897f, -0.028783f, 0.037292f, 0.122964f, -0.044405f, 0.013546f, -0.053503f, 0.018442f, 0.074164f, 0.045684f, -0.067146f, 0.031702f, 0.011802f, 0.029125f, 0.025216f, -0.067527f, 0.001850f, + -0.015844f, -0.026123f, 0.013680f, -0.025363f, -0.049684f, 0.018644f, -0.014456f, 0.064441f, 0.009956f, -0.060331f, -0.067966f, -0.022310f, 0.002211f, 0.051797f, 0.039736f, 0.008602f, -0.031510f, 0.012855f, -0.000950f, -0.026009f, 0.002207f, 0.032671f, 0.029738f, 0.006545f, -0.049883f, 0.011838f, 0.020087f, 0.031148f, 0.028815f, 0.019747f, 0.040543f, -0.104954f, 0.018372f, -0.094300f, 0.041609f, 0.044559f, 0.088024f, 0.038943f, 0.020170f, 0.023008f, -0.027463f, -0.067339f, -0.046846f, -0.044232f, 0.018854f, 0.010938f, -0.011495f, 0.040220f, 0.062071f, -0.027821f, -0.039033f, 0.043089f, 0.007640f, -0.057484f, -0.013243f, 0.025977f, -0.047421f, -0.008416f, 0.010439f, 0.024082f, 0.012829f, 0.034076f, 0.058467f, 0.010282f, -0.037335f, -0.004361f, 0.011238f, -0.029684f, -0.013278f, 0.027295f, -0.020809f, -0.037573f, 0.052149f, -0.012648f, -0.012958f, -0.020826f, -0.020542f, 0.033764f, 0.008587f, 0.007669f, 0.045003f, -0.021589f, -0.034822f, -0.002085f, 0.003321f, -0.014823f, 0.011486f, -0.002519f, -0.012421f, -0.002310f, -0.043903f, 0.009715f, 0.008564f, -0.007535f, 0.023614f, 0.015892f, + 0.008236f, 0.010497f, -0.045342f, 0.053579f, -0.020120f, -0.019491f, 0.016412f, -0.049151f, 0.015952f, -0.036830f, 0.004253f, -0.029155f, 0.009421f, 0.012738f, 0.019843f, 0.001690f, 0.017599f, 0.026494f, -0.010283f, -0.006087f, 0.014722f, -0.000991f, -0.009370f, 0.008009f, 0.001858f, -0.006219f, -0.009427f, -0.008639f, -0.005668f, 0.019092f, -0.018364f, 0.018514f, 0.001264f, 0.004943f, 0.009297f, 0.005440f, 0.013550f, -0.000863f, -0.000382f, -0.008403f, -0.001842f, -0.011542f, 0.023062f, 0.001576f, -0.010356f, -0.017000f, -0.005526f, 0.008818f, -0.016504f, 0.021747f, -0.010629f, -0.027917f, 0.001576f, 0.011646f, -0.001613f, -0.000956f, 0.002851f, -0.013285f, -0.048676f, 0.078932f, -0.003980f, 0.044724f, -0.040398f, 0.005110f, -0.007231f, 0.014189f, 0.012845f, 0.024010f, -0.012111f, 0.017691f, -0.010840f, 0.009785f, -0.001655f, 0.007757f, 0.019120f, -0.002275f, 0.029595f, -0.011772f, 0.022387f, 0.001245f, -0.000838f, -0.008266f, 0.014375f, -0.011292f, 0.012997f, -0.007520f, 0.001011f, -0.006228f, 0.007168f, -0.005074f, 0.016884f, -0.005170f, -0.011639f, 0.026949f, -0.018481f, 0.014119f, + 0.011432f, 0.004197f, 0.013148f, -0.016421f, -0.011325f, 0.012399f, 0.011661f, -0.007194f, -0.001426f, 0.013216f, -0.001056f, -0.018285f, 0.008196f, -0.009266f, 0.009562f, 0.012831f, 0.006149f, 0.004427f, 0.004267f, -0.019692f, 0.009780f, 0.005613f, -0.005832f, 0.007273f, -0.009166f, 0.004553f, -0.004495f, -0.000853f, -0.002358f, 0.006936f, 0.013420f, -0.018373f, 0.016568f, -0.003210f, -0.006356f, 0.009489f, -0.012684f, 0.006116f, 0.009168f, -0.002191f, -0.004515f, 0.006344f, -0.002379f, 0.003739f, -0.001590f, -0.006525f, -0.000877f, 0.007078f, -0.001734f, 0.002753f, -0.001314f, -0.004783f, 0.003251f, 0.002869f, 0.005107f, -0.006951f, 0.005737f, -0.000461f, -0.002744f, 0.006626f, -0.007245f, 0.011557f, 0.006017f, -0.004314f, 0.011918f, -0.000895f, -0.004508f, 0.000475f, -0.004502f, 0.007045f, -0.007561f, 0.008078f, 0.003413f, 0.004347f, 0.002188f, -0.004645f, 0.004056f, 0.001815f, 0.001079f, 0.000731f, 0.000487f, -0.001897f, 0.002287f, -0.004866f, 0.006077f, 0.002354f, -0.005383f, 0.019464f, -0.066607f, -0.207300f, -0.030610f, 0.100458f, 0.051886f, 0.244380f, 0.045320f, 0.052433f, + 0.032932f, -0.066018f, -0.092939f, -0.066246f, -0.119098f, -0.102363f, -0.058146f, -0.023929f, 0.067907f, 0.185560f, 0.147130f, 0.126721f, 0.071948f, -0.057300f, -0.093166f, -0.068578f, -0.128334f, -0.121545f, -0.037406f, -0.017192f, -0.028518f, 0.046910f, 0.073412f, 0.048529f, 0.089567f, 0.069210f, 0.021032f, 0.063647f, 0.012808f, -0.009653f, 0.005680f, -0.038636f, -0.101411f, -0.086207f, -0.073317f, -0.102769f, -0.043178f, 0.029794f, 0.020393f, 0.065519f, 0.074173f, 0.064836f, 0.066517f, 0.067964f, 0.042977f, 0.042046f, 0.004412f, -0.038047f, -0.070942f, -0.048475f, -0.066796f, -0.088201f, -0.043562f, -0.040568f, -0.033093f, 0.012270f, 0.033178f, 0.031761f, 0.062013f, 0.077576f, 0.037418f, 0.054630f, 0.046594f, -0.013183f, 0.005230f, 0.020850f, -0.026028f, -0.023583f, -0.041637f, -0.074690f, -0.074986f, -0.059582f, -0.061693f, -0.012264f, 0.025703f, 0.017088f, 0.048827f, 0.073306f, 0.057778f, 0.053338f, 0.054845f, 0.036530f, 0.011940f, 0.003290f, -0.017182f, -0.032205f, -0.034579f, -0.051463f, -0.065037f, -0.069224f, -0.059592f, -0.053548f, -0.030624f, 0.006716f, 0.033590f, 0.076933f, + 0.101853f, 0.089334f, 0.074072f, 0.062795f, 0.036302f, 0.007450f, -0.031555f, -0.064948f, -0.088493f, -0.092756f, -0.102223f, -0.075459f, -0.031516f, -0.008107f, 0.021317f, 0.060646f, 0.078398f, 0.084539f, 0.087129f, 0.072774f, 0.030853f, -0.002384f, -0.022577f, -0.049700f, -0.064539f, -0.060687f, -0.053857f, -0.038905f, -0.015924f, 0.001854f, 0.021422f, 0.027689f, 0.021350f, 0.023352f, 0.018637f, 0.012638f, 0.009950f, 0.010186f, 0.003415f, 0.003355f, -0.000877f, -0.005242f, -0.006216f, -0.005552f, -0.007994f, -0.009540f, -0.010060f, -0.008812f, -0.007435f, -0.005041f, -0.001467f, 0.001725f, 0.001781f, 0.001125f, 0.000764f} + }, + { + {-0.006625f, 0.005005f, 0.003148f, -0.006536f, -0.001152f, 0.008345f, 0.002475f, 0.002060f, 0.004601f, -0.001089f, 0.001258f, -0.002171f, -0.008729f, -0.003430f, -0.000435f, -0.001926f, 0.002507f, -0.002702f, -0.000849f, -0.007393f, -0.000012f, 0.001275f, -0.005223f, -0.001136f, -0.006593f, -0.002345f, -0.002104f, -0.007977f, -0.003668f, 0.002539f, 0.003470f, 0.008940f, 0.005286f, 0.011421f, -0.001249f, -0.001863f, 0.001663f, -0.003941f, 0.009919f, 0.000584f, 0.004678f, 0.007872f, 0.001367f, -0.003190f, 0.003206f, -0.004209f, -0.005612f, -0.001409f, -0.002438f, -0.003102f, -0.010353f, -0.003349f, 0.000027f, 0.001607f, 0.003060f, 0.000856f, 0.005229f, -0.005872f, 0.004610f, -0.000047f, 0.001126f, 0.003270f, -0.004108f, -0.009145f, -0.003966f, 0.003880f, 0.005679f, 0.004321f, 0.000334f, 0.004406f, 0.003316f, 0.005995f, 0.002985f, 0.002584f, -0.003999f, 0.000301f, -0.000677f, -0.000805f, -0.003412f, -0.004182f, -0.001840f, -0.000973f, -0.000417f, -0.003225f, -0.000009f, 0.000455f, 0.001220f, 0.000294f, 0.002276f, -0.001256f, 0.001014f, -0.002019f, -0.003085f, 0.001506f, -0.000486f, -0.000078f, + 0.002073f, 0.001478f, 0.001810f, 0.000131f, 0.000132f, -0.001763f, 0.001002f, 0.000328f, 0.000574f, -0.000259f, 0.002819f, -0.000614f, 0.000104f, -0.001232f, -0.001056f, -0.001385f, 0.001164f, -0.000935f, -0.002677f, -0.004789f, 0.004554f, -0.007365f, -0.004526f, 0.011863f, -0.001921f, 0.010488f, -0.005364f, 0.001021f, 0.005188f, 0.002310f, 0.000348f, -0.007038f, -0.009985f, -0.010416f, 0.001123f, 0.000271f, -0.002948f, 0.001417f, -0.009221f, 0.018372f, 0.002078f, -0.010214f, 0.002720f, -0.005349f, -0.005828f, 0.005484f, 0.007790f, -0.000112f, 0.001754f, 0.003724f, -0.000563f, 0.000044f, 0.006116f, -0.003348f, -0.001494f, 0.000371f, 0.011137f, -0.000216f, -0.001302f, -0.004204f, -0.006579f, 0.003436f, -0.001623f, -0.006749f, -0.003051f, -0.008126f, 0.001091f, -0.007370f, 0.000167f, -0.005580f, -0.001845f, -0.004907f, -0.010222f, -0.004186f, -0.000642f, 0.009656f, 0.001420f, -0.002787f, 0.005262f, 0.008842f, 0.001334f, -0.012030f, 0.005544f, -0.000027f, 0.002250f, 0.003959f, -0.002798f, 0.007634f, -0.003805f, -0.006806f, -0.007101f, -0.012572f, 0.001176f, -0.004289f, -0.004464f, -0.005662f, + -0.005937f, -0.000339f, -0.006476f, 0.002056f, -0.001012f, -0.003674f, -0.001363f, -0.004151f, 0.000088f, -0.000179f, -0.004763f, -0.001977f, 0.001931f, -0.000690f, 0.000308f, 0.001072f, 0.000447f, 0.000819f, 0.000605f, -0.001292f, -0.004265f, -0.000766f, -0.001601f, 0.001204f, -0.000546f, 0.000505f, -0.000817f, 0.000037f, -0.000066f, -0.000923f, -0.002678f, -0.002198f, -0.000364f, -0.000969f, -0.001033f, -0.000862f, -0.002007f, -0.000741f, -0.009224f, 0.015442f, -0.003867f, -0.014003f, 0.001085f, 0.004803f, 0.000458f, 0.004428f, 0.003616f, -0.011081f, 0.003981f, -0.002564f, -0.000431f, 0.000475f, -0.002010f, 0.008500f, -0.002598f, -0.005479f, -0.000461f, 0.006799f, 0.004285f, 0.002542f, 0.004004f, 0.016447f, 0.004356f, -0.005606f, 0.007438f, -0.006849f, 0.002300f, -0.005521f, 0.015459f, 0.002435f, -0.005004f, -0.002998f, -0.005017f, -0.001719f, 0.010262f, -0.008149f, -0.006874f, -0.002074f, 0.008502f, 0.004890f, -0.007829f, 0.002244f, 0.001786f, -0.004568f, 0.000242f, -0.016790f, 0.005610f, -0.003851f, -0.003198f, -0.010638f, 0.016172f, 0.000924f, -0.008417f, -0.006606f, -0.008261f, 0.000650f, + -0.001778f, 0.000915f, -0.000045f, -0.009684f, 0.012802f, -0.007220f, -0.006627f, 0.005075f, 0.001372f, 0.005040f, -0.003590f, -0.000748f, -0.007875f, 0.000721f, 0.001722f, -0.010001f, -0.007466f, 0.000739f, -0.006970f, 0.002522f, -0.006234f, -0.001760f, -0.001758f, 0.004457f, -0.008052f, -0.008367f, -0.001711f, -0.001327f, -0.001998f, -0.000539f, -0.003608f, -0.000915f, -0.002626f, -0.002166f, -0.001702f, -0.002610f, -0.003156f, -0.000286f, -0.004238f, 0.001125f, -0.002812f, -0.000011f, 0.000270f, -0.001020f, -0.001596f, -0.000220f, -0.001124f, 0.002187f, -0.000333f, -0.001848f, -0.000109f, -0.003266f, -0.000640f, -0.002003f, 0.000161f, 0.000439f, -0.002240f, 0.013401f, 0.000416f, 0.002899f, -0.011085f, 0.003409f, 0.006369f, 0.004649f, -0.000464f, -0.005559f, 0.014412f, 0.002505f, -0.002871f, 0.006912f, 0.005648f, -0.006737f, 0.008831f, -0.005937f, 0.014563f, 0.002065f, 0.012998f, -0.001418f, 0.002294f, -0.005097f, -0.014715f, 0.001593f, 0.000302f, 0.000505f, -0.002543f, 0.003029f, 0.007771f, -0.001950f, -0.007557f, -0.005003f, -0.010749f, -0.002973f, -0.005293f, -0.005686f, 0.000991f, 0.003705f, + 0.005839f, -0.006912f, 0.004824f, -0.004626f, -0.005748f, -0.000776f, 0.004936f, 0.000925f, 0.001225f, -0.010749f, -0.010370f, -0.001966f, -0.003075f, -0.007859f, 0.017129f, 0.007951f, -0.001082f, 0.003303f, 0.006885f, -0.017279f, -0.008741f, 0.011591f, -0.006460f, 0.010872f, 0.002468f, -0.002263f, -0.011595f, -0.008557f, 0.013791f, 0.007308f, 0.013040f, -0.013693f, -0.000949f, -0.009496f, -0.000757f, 0.003379f, -0.005062f, 0.001615f, 0.001016f, -0.008524f, 0.007661f, 0.000860f, 0.001161f, -0.001388f, -0.015185f, 0.001652f, -0.003655f, -0.004777f, -0.004752f, -0.000917f, 0.002642f, -0.002444f, 0.001178f, -0.005339f, -0.001131f, -0.002444f, 0.003415f, -0.000655f, -0.000411f, -0.001730f, 0.000123f, -0.001808f, 0.001167f, -0.003012f, -0.001445f, 0.001001f, -0.000859f, -0.000184f, -0.000190f, -0.000019f, 0.001404f, 0.000880f, -0.000251f, -0.002111f, -0.002200f, -0.002289f, 0.001979f, 0.000908f, 0.002885f, 0.001521f, 0.001170f, -0.022686f, 0.001085f, -0.003019f, 0.005994f, -0.013777f, 0.004251f, -0.004727f, 0.022696f, -0.006175f, -0.011938f, -0.004451f, -0.010033f, 0.002967f, 0.008353f, -0.002827f, + 0.015830f, 0.001507f, -0.004822f, 0.003717f, 0.001828f, 0.004026f, -0.005766f, -0.001125f, 0.005821f, 0.009230f, 0.003591f, -0.001999f, 0.004379f, -0.008491f, -0.002721f, 0.011639f, 0.008304f, 0.013689f, 0.009697f, -0.000367f, -0.007145f, -0.014879f, 0.010065f, -0.001749f, -0.010863f, 0.005445f, -0.002951f, -0.016651f, 0.000322f, -0.013906f, -0.001202f, 0.012307f, -0.002223f, -0.009398f, -0.004373f, 0.011747f, -0.010412f, -0.017002f, 0.017008f, -0.003366f, -0.004268f, 0.003872f, 0.002066f, 0.001887f, 0.004010f, 0.003984f, 0.002173f, -0.012568f, -0.004826f, 0.009460f, -0.001401f, -0.003827f, 0.002801f, 0.016339f, -0.008460f, -0.009291f, -0.004277f, 0.006607f, 0.003330f, -0.014998f, -0.006702f, -0.005252f, -0.006577f, 0.004741f, -0.000977f, -0.001266f, -0.005618f, -0.004519f, -0.011849f, -0.006907f, 0.002742f, 0.000247f, 0.001778f, -0.000616f, 0.006875f, 0.007067f, 0.001172f, 0.002491f, -0.003708f, 0.000688f, 0.000260f, 0.002804f, -0.004544f, -0.002182f, 0.000473f, -0.000036f, 0.002001f, -0.000228f, -0.002613f, 0.002449f, 0.000886f, -0.005088f, -0.001044f, 0.001290f, 0.000813f, 0.000702f, + -0.001315f, 0.000515f, -0.002481f, -0.002519f, -0.002128f, 0.001111f, -0.001127f, -0.001359f, -0.000428f, -0.019841f, -0.000474f, 0.005242f, 0.018999f, 0.019638f, -0.006399f, 0.009755f, -0.012721f, 0.004117f, 0.008317f, 0.012598f, -0.003745f, 0.018921f, -0.003627f, 0.016042f, -0.008855f, 0.013434f, -0.006839f, -0.022470f, -0.005156f, 0.005553f, -0.007804f, 0.008610f, -0.004921f, -0.005433f, 0.002359f, -0.024624f, -0.008016f, -0.000554f, -0.004344f, -0.001525f, -0.011952f, -0.004150f, -0.004313f, 0.003862f, 0.024980f, 0.014395f, -0.014648f, 0.007921f, 0.019959f, 0.004923f, -0.007109f, 0.004949f, -0.005368f, -0.006012f, 0.014344f, 0.009992f, -0.010112f, -0.001393f, 0.010202f, 0.021450f, -0.007000f, 0.011650f, 0.031828f, 0.013689f, -0.014787f, 0.005903f, 0.003628f, -0.017817f, 0.002581f, -0.014729f, 0.006483f, -0.016046f, -0.003854f, 0.000630f, 0.007491f, -0.010482f, -0.002972f, -0.005211f, -0.009579f, 0.012248f, 0.010467f, -0.000605f, -0.007044f, 0.001875f, 0.001795f, 0.001715f, 0.002886f, 0.009099f, 0.001716f, -0.012149f, -0.000286f, 0.014720f, 0.000397f, 0.003294f, 0.002907f, 0.004454f, + -0.004659f, -0.002154f, -0.007449f, -0.003153f, -0.006859f, -0.000573f, 0.003995f, -0.000891f, -0.003906f, 0.002156f, -0.000832f, 0.000848f, -0.002138f, -0.001442f, 0.002696f, -0.000206f, 0.006517f, 0.001608f, -0.001442f, 0.003468f, -0.000121f, -0.001540f, -0.002513f, -0.003339f, 0.001425f, -0.001763f, -0.000934f, 0.001722f, -0.000201f, 0.003081f, 0.000150f, -0.004011f, 0.008729f, -0.004275f, -0.019986f, 0.004660f, -0.016048f, 0.002637f, -0.005292f, 0.020841f, -0.010522f, 0.002975f, 0.005510f, 0.002103f, 0.007588f, -0.003018f, 0.022806f, 0.001825f, -0.014728f, -0.002707f, -0.010851f, -0.001705f, -0.003507f, -0.010153f, -0.012764f, -0.003245f, -0.008208f, -0.003854f, 0.014602f, 0.005458f, -0.012282f, 0.004847f, -0.014675f, -0.002746f, 0.010734f, -0.020033f, -0.017690f, 0.010128f, 0.009505f, 0.004953f, -0.000575f, -0.012150f, 0.004857f, -0.005971f, -0.011491f, -0.005281f, 0.000646f, 0.003686f, 0.019085f, -0.007477f, -0.002138f, 0.001050f, 0.008908f, 0.004723f, -0.006588f, -0.008483f, -0.015271f, -0.004624f, -0.003374f, -0.008368f, -0.009793f, 0.006290f, 0.012750f, -0.000020f, -0.008132f, 0.014147f, + 0.002722f, -0.006920f, 0.001743f, -0.002021f, -0.001823f, -0.004815f, -0.002741f, 0.009201f, -0.007274f, -0.010873f, -0.006287f, 0.005759f, -0.008437f, 0.014954f, 0.006685f, -0.002418f, -0.006113f, -0.006892f, 0.004244f, 0.009309f, 0.018982f, -0.005436f, 0.009718f, 0.000373f, -0.000030f, 0.001090f, 0.003053f, -0.003444f, 0.000093f, 0.002398f, 0.004000f, -0.002451f, 0.002801f, -0.002096f, 0.009204f, 0.003568f, 0.006923f, 0.000141f, 0.004707f, -0.000191f, 0.004180f, -0.000768f, -0.000372f, 0.004926f, 0.001850f, 0.000655f, 0.002587f, 0.000637f, 0.004818f, -0.003499f, 0.001137f, 0.003354f, 0.004430f, 0.003879f, -0.001458f, -0.004816f, -0.000066f, 0.003144f, 0.000681f, 0.000632f, 0.003983f, 0.010361f, 0.019768f, -0.014744f, -0.000515f, 0.013461f, -0.006441f, -0.009663f, 0.012380f, -0.019533f, -0.001192f, 0.003609f, -0.002539f, -0.007288f, -0.008596f, -0.004138f, 0.003383f, -0.001052f, 0.009354f, 0.004708f, -0.003123f, -0.007446f, -0.005428f, 0.015387f, 0.000607f, -0.018820f, 0.008778f, -0.011907f, -0.011662f, 0.007146f, 0.013559f, 0.013812f, 0.010493f, -0.000339f, 0.007094f, 0.004817f, + 0.006698f, -0.006174f, -0.000304f, -0.005568f, -0.013540f, 0.005690f, -0.003490f, -0.000748f, -0.002980f, 0.001312f, -0.002231f, 0.014959f, 0.027851f, 0.004580f, -0.004819f, -0.000088f, -0.019879f, 0.019294f, -0.013551f, -0.008807f, -0.013040f, -0.015996f, 0.027075f, 0.001474f, -0.015032f, -0.005455f, 0.018686f, 0.009623f, -0.014144f, -0.010586f, 0.021418f, 0.001723f, 0.002223f, 0.027672f, -0.013207f, 0.007597f, -0.009915f, -0.027475f, 0.012923f, 0.013220f, 0.002224f, -0.015865f, -0.002210f, -0.003451f, 0.003300f, -0.006889f, 0.010075f, 0.006187f, -0.021702f, 0.009215f, 0.010428f, 0.013258f, 0.002316f, -0.011623f, 0.019447f, 0.003286f, -0.001700f, -0.001504f, -0.006485f, -0.006863f, -0.002432f, 0.001215f, 0.005894f, -0.000029f, 0.000510f, -0.000641f, -0.005190f, 0.002180f, 0.002387f, 0.001018f, -0.002361f, -0.001460f, 0.003961f, 0.001382f, 0.004507f, -0.002942f, 0.001093f, -0.006833f, 0.000812f, 0.006399f, -0.008572f, 0.001166f, -0.006706f, 0.007826f, -0.003229f, -0.000215f, -0.005210f, -0.000068f, 0.004593f, -0.000582f, 0.006248f, -0.000022f, 0.009333f, 0.011936f, 0.022155f, 0.020287f, + -0.000845f, 0.017293f, 0.007751f, 0.017636f, 0.017035f, -0.028407f, 0.010245f, -0.009210f, -0.012311f, -0.008983f, -0.002717f, -0.018123f, -0.003828f, 0.004401f, -0.015509f, -0.031785f, 0.007227f, -0.002258f, -0.028650f, -0.021023f, -0.018781f, -0.010494f, 0.000984f, -0.005395f, 0.006760f, -0.003796f, 0.011340f, 0.022171f, -0.012740f, 0.007530f, -0.005030f, -0.010183f, -0.007433f, 0.001338f, -0.002212f, -0.000934f, 0.016496f, -0.000699f, 0.016630f, 0.021578f, 0.006418f, 0.009282f, 0.014262f, -0.001887f, 0.002862f, -0.021336f, 0.019901f, -0.017404f, -0.006151f, -0.005556f, 0.001737f, -0.004822f, -0.016622f, -0.014637f, -0.032086f, 0.029033f, -0.032776f, -0.031758f, 0.005340f, 0.030448f, 0.010781f, -0.003950f, -0.007689f, 0.013996f, -0.015401f, 0.017510f, -0.005144f, 0.002216f, 0.001780f, -0.011644f, 0.012184f, -0.013754f, -0.011251f, -0.001333f, 0.004373f, -0.013140f, -0.002097f, 0.007033f, -0.001084f, -0.003618f, 0.009358f, -0.006234f, -0.011828f, -0.002739f, 0.005907f, -0.007840f, -0.004612f, -0.005377f, -0.001238f, 0.003524f, -0.002578f, 0.001036f, -0.002005f, -0.004317f, 0.001172f, -0.002790f, + 0.002681f, -0.002915f, 0.003904f, -0.001231f, 0.007328f, -0.001100f, 0.002803f, 0.003983f, -0.002613f, -0.005036f, -0.000580f, -0.001270f, -0.000348f, -0.001590f, 0.003375f, 0.000127f, 0.004381f, -0.004026f, 0.001510f, -0.008577f, 0.000323f, 0.000312f, -0.003188f, 0.002529f, 0.013295f, 0.017320f, 0.017313f, 0.018846f, 0.044421f, 0.019958f, 0.025391f, -0.012536f, 0.041118f, -0.023465f, 0.001137f, 0.009075f, -0.000179f, -0.015452f, 0.005142f, -0.004261f, -0.035039f, 0.013296f, -0.008819f, 0.003779f, -0.003274f, -0.011597f, 0.000032f, 0.010440f, -0.014143f, -0.007331f, -0.002196f, 0.008260f, -0.021368f, 0.013565f, 0.005126f, -0.019578f, -0.001519f, 0.008010f, -0.017744f, 0.006672f, -0.021282f, 0.009849f, -0.001813f, -0.006870f, -0.000813f, -0.013892f, 0.017906f, 0.021163f, -0.020142f, -0.011499f, 0.009159f, -0.007159f, 0.005642f, 0.005122f, 0.001372f, 0.000700f, 0.024413f, -0.006132f, -0.016290f, 0.015129f, -0.000605f, -0.012815f, -0.010765f, -0.020249f, 0.003926f, 0.005552f, 0.010153f, 0.009755f, -0.009351f, -0.015727f, 0.008831f, 0.004428f, 0.030511f, 0.003236f, -0.003764f, 0.000792f, + 0.002055f, -0.008978f, -0.004009f, -0.011261f, 0.012508f, 0.007241f, 0.008152f, -0.002372f, -0.019477f, -0.017751f, -0.005809f, -0.001560f, -0.006986f, -0.012296f, 0.003482f, -0.005374f, 0.008063f, 0.001434f, -0.001288f, 0.005023f, 0.005204f, 0.008279f, 0.007757f, 0.006256f, -0.000035f, -0.001844f, 0.002219f, 0.005569f, 0.004305f, -0.002464f, -0.002333f, -0.001550f, 0.001431f, -0.000004f, -0.001520f, 0.000110f, -0.009582f, 0.001191f, 0.006280f, 0.004817f, -0.007464f, -0.005367f, 0.010730f, 0.005750f, 0.010641f, 0.004213f, -0.007757f, 0.007394f, -0.001887f, -0.005863f, 0.001156f, -0.008373f, -0.004597f, -0.002125f, 0.003222f, -0.001671f, -0.023995f, -0.026966f, 0.044971f, 0.031356f, 0.040202f, 0.002558f, -0.025817f, 0.009084f, 0.020976f, 0.014931f, -0.006595f, -0.016339f, -0.004816f, -0.006013f, -0.007935f, -0.014069f, -0.005652f, -0.011819f, 0.029976f, 0.004782f, 0.004940f, 0.000216f, 0.001736f, 0.003173f, -0.011098f, 0.019836f, 0.011195f, -0.001196f, 0.007205f, -0.002840f, 0.020417f, 0.003753f, -0.001822f, -0.033438f, -0.002486f, 0.002087f, 0.003172f, -0.006273f, 0.004168f, -0.015846f, + 0.027119f, 0.021965f, 0.021199f, 0.018501f, -0.014571f, -0.020170f, 0.015454f, 0.004754f, 0.007550f, -0.001339f, -0.023479f, -0.016986f, 0.001343f, -0.013245f, 0.000144f, -0.011126f, -0.004848f, 0.014066f, 0.004468f, -0.010061f, 0.003586f, -0.025955f, 0.000783f, -0.043995f, -0.022363f, -0.041567f, 0.035871f, 0.032330f, 0.034508f, 0.041825f, 0.020249f, -0.006932f, -0.018568f, -0.005640f, -0.001038f, 0.005996f, 0.033131f, -0.010956f, -0.025192f, 0.019200f, -0.016037f, 0.008357f, -0.003681f, -0.003633f, 0.007762f, -0.007476f, -0.013631f, -0.003864f, -0.016781f, -0.003569f, -0.015090f, -0.003477f, 0.002103f, -0.001342f, -0.001829f, -0.004109f, -0.005273f, -0.010427f, -0.000169f, 0.005453f, 0.000842f, -0.005259f, 0.001822f, 0.009085f, -0.001238f, 0.006069f, 0.003323f, 0.003586f, 0.002544f, -0.012055f, 0.010531f, -0.004671f, -0.003835f, 0.007059f, 0.002427f, 0.007806f, 0.000786f, -0.010040f, -0.001876f, 0.000199f, 0.001731f, -0.006153f, -0.015958f, -0.021473f, 0.018929f, 0.024562f, -0.012068f, 0.022805f, 0.003214f, -0.009688f, 0.009170f, -0.033061f, -0.010260f, 0.009321f, -0.010536f, -0.020276f, + -0.038213f, 0.018770f, -0.016422f, 0.004417f, 0.024749f, 0.005938f, 0.028858f, 0.022076f, 0.012549f, 0.004736f, -0.017046f, -0.005005f, -0.008925f, 0.001559f, 0.016071f, 0.008376f, 0.003316f, 0.013720f, 0.039237f, -0.002051f, -0.033375f, -0.014657f, 0.005391f, 0.008010f, -0.001913f, 0.000826f, 0.003158f, -0.014238f, 0.000875f, -0.031414f, 0.007064f, -0.032863f, -0.011984f, -0.025448f, 0.012528f, -0.012696f, -0.020881f, 0.031860f, 0.008935f, 0.002596f, -0.014341f, -0.019116f, 0.004772f, 0.007574f, 0.002807f, 0.010381f, -0.016292f, 0.035818f, -0.043493f, 0.011313f, -0.018129f, -0.026401f, -0.014791f, 0.022796f, 0.006870f, -0.024750f, 0.017484f, -0.019710f, 0.048310f, -0.004504f, -0.005303f, -0.023501f, 0.002813f, -0.031351f, -0.016819f, 0.041823f, -0.016836f, -0.018995f, -0.012403f, 0.012505f, 0.001572f, 0.017727f, 0.008837f, 0.009267f, 0.012922f, 0.007022f, -0.001185f, 0.001334f, 0.006164f, 0.002640f, -0.003416f, 0.010384f, -0.003261f, -0.003619f, -0.007825f, -0.007029f, -0.003157f, 0.003832f, -0.006160f, 0.000454f, 0.003014f, -0.002543f, 0.002629f, 0.000486f, 0.010249f, 0.005370f, + -0.000012f, -0.002091f, 0.000019f, -0.000746f, 0.006125f, -0.005445f, 0.005557f, -0.001537f, 0.002461f, 0.008585f, -0.002717f, 0.000449f, -0.001183f, -0.004321f, 0.010517f, -0.001481f, 0.045440f, 0.046759f, 0.044104f, 0.009411f, -0.011828f, -0.007378f, -0.028415f, 0.023073f, 0.000678f, 0.013539f, -0.008503f, 0.004352f, -0.010391f, -0.007994f, -0.016431f, 0.008877f, -0.017109f, 0.028095f, -0.073325f, -0.021349f, 0.000525f, -0.022186f, 0.015759f, -0.022804f, 0.004690f, -0.008811f, 0.023060f, 0.004105f, 0.022198f, 0.001611f, -0.005241f, -0.000354f, 0.008125f, -0.025686f, -0.018457f, -0.019980f, -0.002830f, 0.025006f, -0.049321f, 0.017116f, 0.042889f, 0.005276f, -0.031559f, -0.001240f, -0.026581f, -0.025476f, 0.017641f, -0.003335f, -0.021716f, 0.012073f, 0.001802f, -0.008092f, -0.012272f, 0.007023f, 0.017827f, 0.010835f, -0.025224f, -0.018411f, 0.014421f, 0.021745f, -0.017761f, -0.023463f, 0.011560f, 0.024363f, -0.029632f, -0.001024f, -0.026456f, -0.036302f, 0.043178f, -0.007188f, 0.006665f, -0.008103f, 0.026759f, -0.006314f, 0.006546f, -0.014388f, 0.023275f, 0.012915f, 0.021414f, 0.024761f, + -0.024685f, -0.027244f, -0.011105f, -0.005222f, -0.016363f, -0.040991f, 0.004512f, 0.002229f, -0.000027f, -0.003021f, -0.006659f, -0.005516f, 0.011772f, -0.001037f, -0.005087f, 0.010874f, -0.011996f, -0.006382f, 0.004450f, 0.021354f, -0.006486f, -0.006595f, 0.001043f, -0.002701f, 0.007377f, -0.002586f, -0.001192f, -0.003761f, -0.006005f, -0.015001f, -0.021527f, 0.003807f, -0.001526f, -0.016400f, -0.008203f, 0.004315f, -0.005716f, -0.018580f, -0.010344f, -0.001249f, -0.003236f, 0.001482f, 0.005279f, 0.002216f, -0.000042f, 0.015230f, 0.005257f, 0.023972f, -0.008911f, -0.001189f, -0.035562f, -0.016820f, -0.008538f, -0.030226f, -0.043212f, -0.008450f, -0.014753f, 0.039805f, 0.011629f, 0.059413f, 0.010349f, -0.017663f, 0.007442f, 0.010899f, -0.049409f, 0.002341f, 0.042499f, 0.026833f, -0.028981f, 0.003451f, 0.021013f, -0.039770f, -0.006766f, -0.020137f, 0.016248f, -0.015857f, 0.010557f, 0.002213f, -0.008216f, 0.001679f, -0.000543f, -0.013098f, 0.012957f, -0.027167f, -0.010872f, -0.011929f, -0.033973f, -0.007505f, -0.004856f, 0.000069f, 0.001977f, -0.009611f, -0.010998f, 0.060693f, 0.017967f, -0.024231f, + -0.043726f, -0.016178f, 0.003960f, 0.043727f, -0.011150f, -0.006243f, -0.025148f, -0.007086f, -0.017827f, 0.035752f, -0.029916f, 0.031836f, 0.040555f, -0.041947f, 0.026916f, 0.009818f, -0.018035f, -0.016186f, 0.009581f, 0.018651f, -0.090871f, -0.012529f, -0.000626f, -0.012981f, 0.023357f, -0.012809f, -0.068048f, -0.026896f, -0.020173f, -0.031155f, -0.030257f, 0.004620f, 0.005339f, -0.017951f, -0.015860f, -0.028817f, 0.002408f, -0.011120f, 0.001906f, -0.012925f, -0.014794f, -0.016900f, 0.003232f, -0.004001f, 0.009334f, -0.014747f, 0.006336f, -0.002476f, -0.014845f, -0.030642f, -0.008004f, -0.002534f, 0.009147f, -0.005002f, -0.040273f, 0.007339f, 0.018739f, 0.006886f, -0.001420f, -0.014772f, 0.013622f, -0.002836f, -0.005110f, -0.024874f, -0.004629f, -0.009164f, 0.019355f, -0.003927f, 0.002668f, -0.000789f, 0.003757f, 0.011702f, -0.009731f, -0.000184f, 0.000134f, -0.005351f, 0.000545f, 0.004465f, -0.028984f, -0.025434f, -0.009866f, -0.020777f, -0.014344f, -0.006518f, -0.013090f, -0.016828f, -0.013098f, 0.009969f, 0.059834f, -0.002086f, -0.070317f, -0.039497f, -0.043602f, -0.008429f, -0.024215f, -0.001323f, + -0.035800f, 0.058036f, 0.034487f, -0.006580f, 0.045707f, 0.001017f, 0.049307f, 0.011523f, -0.028735f, -0.039300f, -0.024708f, -0.031787f, -0.014189f, 0.007304f, 0.021209f, -0.007349f, 0.006861f, -0.026356f, 0.004323f, -0.037858f, -0.003494f, -0.002571f, 0.012766f, -0.014504f, 0.059905f, 0.007294f, -0.001642f, 0.039344f, -0.015530f, -0.028711f, -0.016626f, 0.023911f, -0.001917f, -0.016534f, 0.006643f, -0.000737f, 0.051007f, 0.012071f, 0.000133f, -0.020349f, -0.030821f, -0.078381f, 0.005040f, -0.062396f, 0.031333f, 0.105474f, -0.075772f, -0.016812f, 0.017215f, -0.013673f, -0.013302f, -0.021867f, 0.017801f, -0.022445f, -0.073249f, -0.020145f, -0.073027f, -0.015966f, -0.002048f, -0.046519f, -0.006387f, -0.066658f, 0.028735f, -0.007325f, -0.041701f, 0.102096f, 0.008122f, 0.041197f, 0.035303f, 0.055985f, -0.034676f, -0.003083f, -0.020834f, -0.008356f, -0.014034f, 0.026172f, 0.017305f, 0.023423f, -0.049768f, -0.010849f, -0.026974f, -0.035944f, -0.029202f, -0.018873f, -0.003707f, 0.018708f, 0.016411f, 0.010353f, 0.014538f, -0.004843f, 0.004880f, 0.027093f, -0.004901f, 0.026786f, 0.008441f, -0.024910f, + -0.006286f, 0.007686f, -0.010090f, -0.005001f, 0.032848f, -0.000406f, -0.009551f, 0.035493f, -0.016522f, -0.003503f, -0.029624f, -0.008273f, -0.020548f, 0.014765f, -0.015607f, -0.008133f, -0.005681f, 0.005010f, -0.006684f, 0.013188f, 0.000782f, 0.013654f, 0.004562f, -0.006590f, -0.022185f, -0.123700f, -0.013205f, -0.031878f, -0.034851f, 0.044582f, 0.035307f, -0.043585f, -0.034505f, 0.084367f, -0.009928f, 0.027130f, 0.004047f, -0.004788f, -0.010091f, -0.009574f, -0.027832f, -0.000671f, 0.009469f, 0.014804f, 0.009934f, 0.029915f, -0.024102f, -0.000953f, -0.023493f, -0.014196f, 0.009089f, 0.042591f, 0.027329f, 0.037560f, 0.033749f, -0.008032f, 0.012031f, 0.020025f, -0.000233f, -0.035234f, -0.006621f, 0.047849f, -0.008911f, -0.069341f, -0.030643f, 0.007139f, -0.058680f, -0.025692f, -0.060124f, -0.041571f, -0.037671f, 0.054869f, 0.037575f, -0.012476f, 0.037614f, 0.014099f, 0.053167f, 0.035415f, 0.016934f, -0.094472f, -0.021227f, 0.003732f, -0.082842f, -0.060929f, -0.023443f, -0.016582f, -0.096980f, 0.020331f, 0.053270f, 0.071200f, 0.085714f, -0.029448f, -0.056241f, -0.001162f, -0.056736f, -0.042586f, + -0.078697f, -0.087831f, -0.061860f, -0.052510f, 0.057605f, 0.001944f, 0.011400f, -0.053413f, -0.055595f, -0.050259f, -0.005187f, 0.075193f, 0.095974f, 0.001908f, -0.035544f, -0.027808f, -0.039045f, -0.101709f, -0.045384f, -0.045715f, -0.012693f, -0.004629f, -0.023189f, 0.025654f, -0.000400f, -0.008709f, -0.036300f, -0.047801f, -0.024865f, -0.027357f, -0.041768f, -0.010123f, -0.010895f, -0.005004f, -0.011478f, -0.019949f, 0.024730f, 0.014487f, -0.002976f, -0.023875f, 0.016186f, 0.026344f, 0.001705f, -0.024490f, -0.012679f, 0.018115f, 0.004874f, -0.006274f, -0.022851f, 0.018084f, -0.004890f, -0.008416f, 0.001872f, 0.013790f, 0.003494f, -0.005375f, 0.002003f, 0.010449f, -0.037910f, -0.092075f, 0.036341f, 0.004769f, -0.062487f, 0.059005f, 0.029521f, 0.018401f, -0.013316f, -0.055865f, -0.013700f, 0.001994f, 0.055188f, 0.073069f, 0.004761f, 0.019995f, 0.005236f, 0.002598f, -0.002879f, 0.010155f, -0.029872f, 0.102728f, 0.025189f, -0.033135f, -0.032846f, -0.014594f, 0.005146f, 0.050343f, -0.023585f, -0.007324f, 0.000678f, 0.025598f, -0.023636f, 0.013600f, 0.002420f, -0.005412f, -0.083851f, -0.026273f, + 0.027884f, 0.044056f, 0.016353f, -0.009230f, -0.023594f, -0.055645f, -0.005271f, 0.009316f, -0.012422f, 0.001149f, -0.013698f, -0.035832f, 0.037159f, -0.008212f, 0.013892f, -0.038347f, -0.007124f, 0.098606f, 0.008373f, -0.010798f, 0.012498f, 0.012968f, 0.010304f, 0.049692f, -0.017136f, -0.022331f, 0.038048f, -0.004100f, 0.023019f, 0.013776f, 0.033339f, -0.012376f, -0.035474f, 0.018594f, -0.015741f, 0.002981f, 0.140347f, 0.134057f, 0.061409f, -0.011877f, -0.005645f, 0.017009f, 0.064325f, 0.029220f, -0.017481f, -0.002037f, -0.007013f, -0.035525f, -0.036473f, 0.020787f, 0.011767f, 0.005425f, 0.032886f, -0.004158f, -0.016182f, 0.018768f, 0.009351f, 0.027677f, -0.038740f, -0.032711f, -0.039359f, 0.006114f, -0.016842f, 0.002328f, -0.006652f, 0.014809f, 0.018056f, 0.034318f, 0.021484f, -0.036365f, -0.025213f, 0.013103f, -0.020736f, -0.012745f, 0.004482f, 0.011869f, -0.013344f, -0.035803f, -0.002261f, 0.001255f, -0.001318f, 0.015908f, 0.006049f, -0.028911f, 0.010772f, 0.046770f, 0.055652f, 0.040065f, 0.047817f, 0.032836f, 0.043362f, -0.011170f, -0.000521f, 0.035734f, 0.066211f, 0.007157f, + -0.074069f, -0.020964f, 0.013922f, 0.008725f, -0.019332f, 0.052369f, 0.024966f, 0.019147f, -0.020070f, 0.061618f, -0.005910f, -0.000427f, -0.019203f, 0.031930f, 0.020385f, -0.050716f, -0.073245f, -0.021892f, 0.009821f, 0.002129f, -0.015723f, -0.067360f, -0.008659f, 0.021365f, 0.003163f, -0.023990f, -0.011177f, -0.021650f, -0.027261f, 0.013374f, 0.016494f, -0.043937f, -0.049103f, -0.018348f, -0.060404f, 0.013801f, 0.049004f, -0.046885f, 0.047027f, -0.025173f, -0.029229f, -0.052407f, -0.072193f, -0.081007f, -0.076721f, -0.040566f, -0.002147f, 0.026132f, 0.010955f, 0.025991f, -0.041481f, -0.090175f, -0.036798f, -0.086779f, -0.150342f, -0.058741f, 0.117305f, 0.202267f, 0.117784f, -0.052466f, -0.042422f, -0.184128f, -0.165362f, 0.111186f, 0.017720f, 0.146770f, 0.152397f, 0.158231f, 0.051993f, -0.066479f, -0.081616f, -0.091193f, -0.103590f, -0.017215f, 0.099086f, 0.168601f, 0.052670f, 0.015282f, -0.009843f, -0.087828f, -0.127088f, -0.086901f, 0.014307f, 0.115528f, 0.053143f, 0.073879f, 0.060259f, 0.020175f, -0.046848f, -0.052495f, 0.000143f, -0.030345f, 0.007607f, 0.055008f, 0.059340f, 0.042327f, + 0.006992f, 0.020108f, -0.001057f, -0.041896f, 0.006276f, 0.012917f, -0.008161f, 0.003648f, -0.013159f, 0.080692f, 0.046607f, 0.049963f, 0.030031f, -0.032180f, -0.075842f, -0.107837f, 0.013679f, 0.033048f, 0.068481f, 0.067597f, 0.089290f, 0.040942f, -0.069779f, -0.088041f, -0.104891f, -0.021849f, -0.002338f, 0.051856f, 0.029812f, 0.013603f, 0.027801f, -0.055346f, -0.154021f, -0.105763f, -0.095902f, -0.025701f, 0.009590f, 0.030558f, -0.011884f, -0.025075f, -0.037511f, -0.006608f, 0.014233f, -0.046518f, 0.065133f, 0.031317f, 0.057831f, -0.127168f, 0.028802f, 0.017215f, -0.039154f, 0.028537f, -0.029308f, -0.014414f, -0.008787f, -0.018151f, 0.054716f, 0.100973f, -0.029392f, 0.020328f, -0.014137f, 0.024230f, 0.051244f, -0.015653f, -0.009458f, -0.027893f, 0.014650f, -0.017674f, -0.055789f, 0.040715f, 0.068529f, -0.008968f, -0.036080f, -0.032860f, -0.072464f, -0.019823f, 0.054666f, 0.037343f, 0.018930f, -0.079529f, -0.046412f, -0.034603f, 0.070270f, 0.061307f, 0.053419f, -0.155342f, -0.103724f, -0.012421f, 0.076639f, 0.164353f, 0.000405f, -0.197236f, -0.072780f, 0.006804f, 0.066312f, -0.005218f, + 0.036268f, 0.027861f, -0.086521f, -0.037522f, -0.024152f, -0.051456f, 0.003273f, -0.096829f, 0.014870f, 0.038744f, -0.117700f, -0.074822f, -0.036955f, -0.014696f, 0.129520f, -0.000427f, -0.199765f, 0.019526f, 0.027692f, 0.030828f, 0.078127f, 0.037039f, -0.085615f, 0.004713f, -0.003727f, 0.171032f, 0.119872f, -0.099557f, 0.090674f, -0.052835f, 0.035764f, 0.094714f, 0.033351f, -0.051165f, 0.046783f, -0.020124f, 0.011593f, 0.033247f, -0.004072f, -0.034403f, 0.063926f, -0.040866f, 0.046675f, -0.021497f, 0.024808f, -0.007075f, 0.051261f, -0.017460f, 0.040120f, -0.070372f, -0.012982f, -0.000058f, -0.010074f, 0.023683f, 0.043468f, -0.044372f, 0.090396f, -0.034822f, -0.032205f, -0.061275f, 0.044683f, 0.096799f, 0.018063f, -0.125323f, 0.009297f, -0.027403f, 0.060455f, 0.031244f, 0.026707f, -0.049690f, -0.004513f, -0.031206f, 0.029534f, -0.012013f, -0.021365f, -0.006232f, 0.040342f, -0.008757f, -0.026720f, -0.029971f, 0.022296f, 0.005001f, 0.021137f, -0.012570f, -0.000762f, -0.022594f, -0.003183f, -0.003547f, 0.009934f, 0.005187f, 0.023871f, 0.044015f, -0.105174f, 0.014919f, -0.077226f, 0.014063f, + 0.065553f, 0.057956f, 0.018976f, -0.037588f, 0.007520f, -0.022340f, -0.005532f, -0.027718f, -0.020481f, 0.014224f, 0.003827f, -0.040346f, -0.004651f, 0.020975f, -0.004489f, 0.002358f, 0.007594f, -0.025741f, -0.025492f, -0.000679f, 0.016856f, 0.002228f, -0.041024f, 0.003410f, 0.021028f, 0.006596f, 0.004882f, 0.042897f, -0.004737f, -0.011452f, 0.015373f, 0.016418f, -0.029031f, -0.032193f, 0.023854f, 0.004607f, -0.024722f, 0.016583f, 0.007177f, 0.008029f, -0.017298f, 0.006954f, 0.019439f, 0.002335f, -0.024339f, 0.032994f, -0.004019f, -0.037012f, 0.001106f, 0.028943f, 0.009017f, -0.024225f, 0.022023f, 0.007291f, -0.033768f, 0.013871f, 0.001728f, 0.034459f, -0.031250f, 0.002804f, 0.023738f, -0.054711f, 0.001737f, 0.023611f, -0.000918f, 0.016363f, -0.009105f, -0.035026f, 0.004641f, -0.037062f, 0.034776f, 0.017956f, 0.009798f, -0.013775f, -0.014530f, 0.028733f, -0.024776f, 0.025640f, 0.028159f, -0.040283f, -0.013083f, 0.001724f, 0.031181f, 0.000488f, -0.018089f, 0.011553f, -0.021907f, -0.001312f, 0.003165f, 0.018416f, 0.001253f, 0.003030f, -0.011324f, 0.019169f, -0.006422f, -0.022362f, + 0.020334f, -0.009029f, 0.008766f, -0.005063f, 0.014660f, 0.018531f, -0.021283f, 0.003728f, -0.011537f, 0.005020f, -0.011723f, 0.041205f, -0.011653f, -0.023105f, 0.018580f, -0.010402f, -0.003508f, -0.011749f, 0.012144f, 0.011229f, -0.016672f, 0.009338f, 0.016215f, -0.008383f, 0.001071f, -0.022979f, -0.052039f, 0.085341f, 0.012067f, 0.038610f, -0.033179f, 0.014774f, -0.007162f, 0.010351f, 0.009364f, -0.014200f, 0.005776f, 0.015686f, -0.008949f, 0.034078f, 0.001589f, 0.001183f, 0.011630f, 0.011202f, -0.001200f, -0.008583f, 0.014592f, -0.002163f, -0.009957f, -0.001966f, 0.014666f, -0.015650f, 0.003452f, 0.007231f, -0.019952f, 0.025151f, -0.004887f, -0.011950f, 0.038548f, -0.015711f, -0.022532f, 0.017785f, 0.009883f, -0.010492f, 0.016799f, 0.013473f, -0.004504f, -0.005282f, -0.002852f, 0.005144f, 0.009736f, 0.005749f, 0.000091f, -0.006504f, 0.019961f, -0.020953f, 0.019150f, 0.003106f, -0.002143f, 0.005437f, 0.006194f, 0.006301f, 0.001043f, -0.018633f, 0.005458f, 0.016323f, -0.011325f, 0.000087f, 0.000211f, 0.012468f, -0.001039f, -0.004648f, 0.018826f, -0.009320f, 0.010209f, -0.019152f, + -0.006926f, 0.018833f, -0.017563f, 0.018112f, -0.004440f, 0.011974f, 0.014666f, -0.016246f, -0.005338f, 0.020423f, -0.016705f, -0.000753f, 0.002364f, 0.006274f, 0.001753f, -0.002173f, 0.000992f, 0.001651f, 0.009608f, -0.007858f, 0.002310f, 0.006101f, -0.000351f, -0.004004f, 0.001293f, 0.003635f, -0.000556f, 0.001335f, -0.003281f, 0.004348f, 0.006095f, -0.010080f, -0.001367f, 0.017788f, -0.008292f, 0.005168f, -0.001042f, 0.010190f, 0.003115f, -0.005445f, 0.001393f, -0.000978f, -0.005616f, -0.003963f, 0.021097f, -0.003427f, -0.004513f, 0.003101f, 0.002590f, -0.001507f, 0.004696f, 0.008699f, 0.000543f, 0.002347f, 0.001068f, -0.001717f, 0.001557f, 0.002632f, -0.003697f, 0.002878f, 0.000016f, 0.019856f, -0.070468f, -0.225166f, -0.011522f, 0.121246f, 0.054382f, 0.258364f, 0.021980f, 0.054513f, 0.002212f, -0.075422f, -0.094988f, -0.064362f, -0.115743f, -0.081002f, -0.050961f, 0.001777f, 0.088273f, 0.173938f, 0.127998f, 0.111385f, 0.036245f, -0.060641f, -0.089026f, -0.080056f, -0.094333f, -0.104627f, -0.042434f, -0.020120f, -0.009188f, 0.050951f, 0.067672f, 0.050999f, 0.094627f, 0.061057f, + 0.022632f, 0.063451f, 0.001440f, -0.027681f, -0.018295f, -0.057115f, -0.116994f, -0.071178f, -0.068507f, -0.069900f, 0.003616f, 0.032437f, 0.022447f, 0.085863f, 0.070454f, 0.048489f, 0.069298f, 0.073628f, 0.020866f, 0.022008f, -0.007875f, -0.063588f, -0.088266f, -0.067535f, -0.088465f, -0.063000f, -0.021980f, -0.015668f, 0.005443f, 0.048055f, 0.037693f, 0.033918f, 0.067998f, 0.056100f, 0.041320f, 0.070117f, 0.019249f, -0.014528f, -0.002905f, -0.028305f, -0.061022f, -0.035610f, -0.077198f, -0.097706f, -0.057516f, -0.048693f, -0.021089f, 0.056515f, 0.076468f, 0.071165f, 0.082268f, 0.067547f, 0.038498f, 0.036955f, 0.018007f, -0.008106f, -0.020897f, -0.039402f, -0.057988f, -0.058230f, -0.065629f, -0.069089f, -0.058928f, -0.020258f, -0.006939f, 0.023030f, 0.059300f, 0.065820f, 0.065319f, 0.076112f, 0.060709f, 0.045264f, 0.037827f, 0.012224f, -0.029447f, -0.052713f, -0.085528f, -0.109450f, -0.102270f, -0.081287f, -0.040771f, 0.010145f, 0.054880f, 0.075077f, 0.086689f, 0.090106f, 0.077975f, 0.054871f, 0.028150f, -0.018179f, -0.044269f, -0.058833f, -0.067946f, -0.059747f, -0.044748f, -0.031156f, + -0.012741f, 0.014045f, 0.018985f, 0.025538f, 0.029719f, 0.026124f, 0.021056f, 0.016497f, 0.011347f, 0.009634f, 0.004452f, -0.003667f, -0.005652f, -0.006129f, -0.009131f, -0.010399f, -0.013026f, -0.015639f, -0.016897f, -0.013914f, -0.010305f, -0.005734f, 0.000142f, 0.008219f, 0.011113f, 0.008551f, 0.005297f, 0.003626f, 0.003020f}, + {-0.005147f, 0.001241f, 0.006039f, -0.000524f, 0.000548f, -0.008937f, -0.004491f, 0.001329f, 0.011865f, -0.007639f, 0.002484f, -0.012307f, 0.012649f, 0.000842f, 0.004641f, -0.001444f, 0.002012f, -0.002363f, -0.004330f, -0.010696f, 0.004543f, -0.010724f, -0.005005f, -0.006044f, 0.006106f, 0.004858f, 0.002347f, 0.005063f, 0.009538f, 0.000639f, -0.008630f, 0.005704f, 0.000945f, -0.000388f, 0.004678f, -0.001698f, -0.003118f, -0.012618f, 0.002070f, -0.003599f, 0.002785f, 0.005333f, -0.006837f, -0.002706f, 0.006266f, 0.001987f, 0.000764f, -0.006411f, 0.016254f, 0.009810f, 0.001614f, 0.007882f, 0.006480f, 0.006293f, -0.014809f, 0.000959f, -0.001413f, -0.003894f, 0.003667f, 0.002497f, -0.002351f, -0.002734f, -0.000767f, -0.004401f, 0.004409f, -0.001636f, 0.008665f, -0.000278f, -0.002174f, -0.004055f, -0.007521f, -0.001338f, 0.005850f, -0.000208f, 0.001365f, 0.006891f, 0.001904f, 0.007964f, -0.000123f, 0.001248f, -0.000781f, 0.008560f, 0.007593f, 0.007683f, 0.001698f, 0.000041f, 0.003433f, -0.000120f, 0.001087f, 0.000212f, 0.000423f, -0.000585f, -0.002326f, -0.001953f, -0.000400f, -0.002244f, + 0.001129f, 0.001215f, -0.000940f, 0.002549f, -0.000945f, -0.000672f, -0.000472f, 0.001079f, 0.000327f, 0.002287f, 0.000235f, 0.000087f, 0.000223f, 0.002951f, 0.001467f, -0.000164f, -0.000734f, 0.000191f, -0.000363f, 0.000765f, 0.003042f, 0.000705f, 0.003867f, 0.013453f, -0.006514f, 0.004496f, -0.003704f, -0.005824f, -0.002385f, -0.004032f, 0.007352f, -0.006063f, -0.011252f, -0.002872f, 0.002973f, -0.009381f, -0.005663f, 0.010601f, 0.018319f, -0.003084f, 0.007008f, -0.006277f, -0.006601f, -0.000291f, 0.001941f, -0.000804f, -0.000178f, 0.006797f, -0.011599f, 0.003790f, -0.000844f, -0.002432f, -0.009774f, 0.000853f, 0.000242f, 0.005515f, 0.001665f, -0.007659f, 0.010117f, -0.008040f, 0.009441f, -0.001060f, 0.001726f, 0.003832f, -0.001092f, -0.004718f, 0.007388f, 0.001809f, 0.009866f, 0.001497f, -0.008665f, 0.015744f, 0.012539f, -0.004369f, -0.001264f, -0.003038f, -0.010924f, -0.005924f, -0.001781f, -0.001891f, 0.004443f, -0.006032f, 0.000509f, 0.004309f, 0.000045f, -0.000175f, -0.000671f, -0.001045f, -0.005948f, 0.009511f, 0.000338f, -0.000219f, -0.002970f, -0.001074f, -0.008702f, -0.007783f, + 0.002608f, 0.006341f, -0.000761f, -0.001665f, 0.000035f, -0.000083f, -0.004432f, 0.008514f, 0.001214f, 0.002804f, -0.002170f, 0.002308f, 0.001513f, -0.000376f, -0.000101f, -0.000398f, 0.000174f, 0.001998f, -0.001064f, 0.001256f, 0.001430f, -0.000291f, -0.000281f, 0.001031f, 0.002348f, 0.002009f, -0.001390f, 0.000536f, 0.000773f, -0.001159f, -0.000562f, 0.003170f, -0.000375f, -0.000192f, -0.002434f, -0.002346f, -0.003779f, -0.001468f, -0.014112f, 0.017170f, -0.003857f, -0.002120f, 0.012240f, -0.004913f, 0.006266f, 0.027318f, -0.003385f, 0.000726f, -0.010583f, -0.008560f, -0.013160f, 0.007481f, -0.005494f, 0.003608f, 0.007099f, -0.008319f, -0.007127f, -0.005245f, 0.000489f, 0.002610f, -0.010257f, -0.004073f, 0.004337f, 0.003717f, -0.004130f, -0.001744f, 0.006103f, -0.006496f, 0.000897f, -0.003273f, -0.001260f, -0.004550f, 0.003702f, -0.004182f, 0.001586f, 0.003549f, -0.001780f, 0.011433f, 0.000383f, -0.001653f, -0.008620f, 0.000926f, 0.012219f, 0.001613f, 0.004057f, -0.011365f, -0.016202f, -0.005940f, -0.013953f, -0.012323f, -0.000424f, -0.005369f, -0.000583f, -0.014930f, 0.012591f, -0.013829f, + 0.001917f, 0.009327f, -0.008606f, -0.014445f, -0.010313f, -0.003104f, 0.009433f, 0.008373f, 0.012659f, -0.007599f, -0.006696f, -0.005370f, -0.004625f, 0.009144f, 0.002277f, -0.003904f, -0.002143f, 0.004308f, 0.004903f, 0.001434f, 0.002208f, 0.003118f, -0.000791f, -0.005393f, -0.000957f, -0.003598f, 0.001238f, 0.000378f, 0.001075f, 0.000978f, 0.000190f, 0.002151f, 0.000210f, 0.002522f, 0.000171f, -0.002035f, 0.002569f, -0.003147f, -0.002084f, 0.000546f, -0.000889f, 0.002587f, -0.001697f, -0.001288f, -0.000610f, 0.000282f, -0.001122f, -0.001914f, 0.001626f, -0.000651f, 0.001181f, -0.001626f, -0.001567f, -0.001912f, -0.002208f, -0.001411f, -0.002015f, 0.014940f, 0.001551f, -0.006009f, 0.000845f, -0.004974f, -0.001110f, 0.010456f, 0.017535f, -0.005997f, -0.006141f, -0.015914f, 0.002010f, 0.003996f, 0.009050f, -0.006001f, 0.009758f, 0.001548f, 0.015030f, -0.012064f, 0.001926f, -0.022782f, -0.002518f, 0.002725f, -0.005579f, -0.005122f, -0.002024f, 0.008401f, -0.006890f, -0.011973f, 0.003385f, -0.017568f, -0.003846f, -0.008436f, 0.003860f, -0.001865f, 0.005928f, 0.000789f, -0.013415f, -0.014463f, + 0.000378f, 0.007717f, 0.014307f, -0.002835f, -0.005850f, 0.012011f, -0.013254f, -0.007185f, 0.006364f, 0.005719f, 0.009459f, -0.009035f, 0.000313f, 0.003685f, -0.005734f, -0.001905f, 0.005574f, -0.008195f, 0.010676f, -0.004633f, -0.002018f, -0.011396f, -0.009522f, 0.004613f, -0.000054f, 0.000245f, -0.001645f, -0.006979f, 0.006598f, -0.004374f, 0.008211f, -0.000108f, -0.010939f, -0.011406f, 0.004152f, -0.005717f, 0.002009f, -0.016247f, -0.015589f, -0.002440f, 0.014604f, 0.000148f, -0.003056f, 0.000775f, 0.002073f, 0.001612f, -0.000710f, 0.002388f, -0.007673f, 0.001478f, 0.001247f, 0.002371f, 0.002899f, 0.003321f, 0.001678f, -0.004220f, 0.000269f, 0.003837f, 0.001698f, 0.001083f, -0.002177f, -0.002546f, 0.000562f, 0.000064f, -0.000924f, 0.003618f, -0.000119f, -0.000172f, -0.002508f, 0.004503f, 0.003598f, -0.000136f, 0.000269f, -0.002093f, 0.001223f, 0.001468f, 0.000562f, 0.000290f, 0.001403f, -0.001874f, 0.008999f, -0.024294f, 0.005697f, -0.010527f, 0.008998f, 0.010273f, -0.011458f, -0.021296f, 0.003050f, -0.002805f, 0.013573f, -0.008079f, 0.019633f, -0.008203f, 0.013009f, -0.015984f, + -0.005888f, 0.006738f, 0.009686f, 0.002741f, -0.000017f, -0.009791f, -0.001240f, -0.007695f, -0.009619f, 0.005403f, -0.008202f, 0.003269f, 0.001947f, 0.004019f, -0.004640f, 0.009153f, -0.001658f, 0.007883f, -0.001717f, -0.014978f, -0.002452f, -0.004765f, 0.001572f, 0.015033f, 0.001000f, -0.001252f, -0.000725f, -0.006040f, 0.005244f, -0.005692f, 0.007975f, 0.008605f, 0.003169f, 0.003333f, 0.015166f, -0.003703f, -0.002671f, -0.012049f, 0.008669f, 0.007632f, 0.001660f, 0.001994f, 0.001652f, 0.000671f, 0.004486f, 0.009244f, 0.006216f, 0.003550f, 0.003420f, -0.002305f, 0.012072f, 0.004135f, -0.002407f, -0.009185f, 0.004755f, -0.002699f, 0.017599f, 0.009992f, 0.002287f, -0.008041f, -0.002942f, 0.013400f, -0.005113f, 0.001795f, 0.007821f, -0.004262f, -0.005301f, -0.010559f, 0.001426f, 0.003926f, -0.000759f, 0.005151f, -0.004071f, -0.001507f, -0.003155f, 0.003793f, -0.000240f, -0.001126f, -0.005004f, 0.001276f, 0.001388f, 0.003111f, 0.003687f, -0.001160f, 0.000681f, 0.004039f, -0.000222f, 0.004098f, -0.000197f, 0.001283f, 0.006027f, 0.001295f, 0.006193f, -0.000397f, -0.001249f, -0.000315f, + -0.000448f, 0.000274f, 0.000519f, -0.004538f, 0.001796f, 0.003762f, 0.000472f, 0.001560f, -0.001024f, -0.031332f, -0.017006f, 0.006330f, -0.006095f, 0.012644f, 0.012616f, 0.019024f, 0.007889f, 0.007712f, 0.004715f, -0.022832f, -0.005087f, -0.003137f, 0.002078f, -0.002267f, 0.007141f, 0.005074f, -0.008759f, -0.006997f, 0.005898f, 0.011149f, 0.014068f, 0.012123f, 0.015976f, -0.008726f, -0.008698f, -0.011578f, 0.012325f, -0.007100f, 0.010188f, -0.002562f, -0.000502f, -0.010846f, -0.006478f, -0.006202f, 0.009257f, 0.011383f, 0.002035f, 0.011378f, 0.016305f, -0.006466f, 0.004143f, 0.019106f, -0.009582f, 0.006201f, 0.006506f, 0.000715f, 0.014392f, 0.018406f, 0.014025f, 0.031925f, 0.005958f, -0.004539f, -0.005886f, -0.005481f, -0.000320f, 0.005611f, 0.009708f, -0.001777f, -0.003102f, -0.003391f, -0.008531f, 0.003580f, 0.004650f, 0.008259f, -0.019907f, -0.002753f, 0.005067f, 0.013205f, 0.009247f, -0.017046f, -0.012587f, 0.003195f, 0.003210f, 0.013774f, -0.012125f, 0.000742f, -0.001202f, 0.001434f, -0.017263f, -0.004707f, -0.005929f, -0.004228f, -0.007079f, -0.003019f, 0.000571f, 0.006602f, + 0.000013f, 0.000337f, 0.002615f, 0.003136f, -0.006576f, -0.001085f, 0.000521f, -0.000016f, 0.002387f, -0.002325f, -0.004287f, -0.002976f, -0.003266f, 0.004650f, -0.004490f, -0.002230f, -0.005172f, 0.001249f, -0.001085f, 0.003283f, -0.004731f, 0.001938f, -0.001581f, 0.001900f, 0.001814f, 0.000271f, 0.004159f, -0.003988f, 0.002067f, 0.002197f, 0.000722f, 0.004732f, 0.007616f, 0.015199f, -0.001912f, 0.003145f, 0.013001f, 0.019067f, 0.010758f, -0.020937f, 0.000118f, -0.022279f, -0.015788f, -0.009540f, -0.001807f, -0.013612f, 0.016362f, 0.006087f, 0.009705f, -0.027725f, -0.001944f, 0.018224f, 0.009290f, -0.008097f, -0.011629f, -0.007077f, 0.007135f, -0.021196f, -0.001191f, -0.013601f, 0.020961f, -0.002698f, -0.006066f, 0.002287f, -0.000698f, -0.003527f, 0.003740f, -0.005467f, 0.009760f, 0.006967f, 0.014006f, -0.000974f, 0.000760f, 0.021607f, -0.006770f, 0.014484f, -0.002296f, -0.002471f, 0.038001f, 0.004586f, -0.004024f, -0.008507f, -0.029314f, 0.003161f, -0.030045f, -0.004997f, 0.031727f, -0.008874f, -0.006116f, -0.021949f, -0.006414f, 0.000853f, -0.011793f, 0.006435f, -0.001109f, -0.016066f, + 0.017187f, 0.006207f, 0.005623f, 0.004792f, -0.011900f, 0.013172f, -0.020425f, 0.005995f, 0.007899f, 0.000940f, -0.002672f, -0.008205f, -0.006470f, -0.008358f, -0.002669f, 0.006878f, 0.008784f, -0.002125f, -0.007118f, -0.004153f, 0.009787f, 0.004086f, 0.018699f, -0.000241f, 0.001445f, 0.007686f, -0.000738f, -0.003349f, -0.002549f, -0.002267f, -0.002023f, -0.002986f, 0.002229f, -0.003421f, -0.000099f, 0.003901f, 0.001433f, 0.003977f, 0.003783f, 0.003108f, 0.000372f, 0.005733f, 0.004110f, 0.002533f, 0.001766f, 0.001811f, -0.005851f, -0.004891f, 0.004307f, 0.000718f, -0.003595f, 0.000757f, -0.004093f, 0.001307f, 0.004752f, 0.001836f, -0.000761f, 0.001850f, 0.004081f, 0.001027f, -0.003242f, 0.001878f, 0.012545f, -0.024759f, 0.010927f, -0.008623f, -0.012432f, -0.011844f, 0.009650f, 0.012281f, 0.007235f, 0.021168f, 0.015665f, 0.003305f, 0.006496f, -0.016284f, 0.003516f, 0.007584f, 0.016460f, 0.003324f, -0.007633f, 0.006121f, 0.007785f, -0.014579f, 0.002334f, -0.014959f, 0.011987f, 0.010934f, 0.014032f, -0.013294f, 0.008411f, 0.015007f, -0.006526f, 0.003999f, 0.019873f, -0.000435f, + -0.012006f, -0.009536f, 0.004575f, -0.003090f, -0.012204f, -0.004929f, 0.000421f, 0.003057f, 0.006917f, -0.008372f, 0.013931f, 0.008521f, -0.002952f, 0.016753f, -0.001856f, 0.006456f, 0.021933f, -0.022941f, 0.042836f, -0.019462f, 0.006056f, 0.013024f, -0.004256f, -0.002214f, 0.005594f, 0.029048f, -0.001380f, -0.003834f, -0.000665f, -0.006694f, 0.014230f, 0.015906f, -0.004843f, 0.006898f, 0.005794f, 0.005296f, 0.009835f, 0.012560f, 0.001221f, 0.013569f, 0.003089f, -0.011352f, -0.017524f, 0.004398f, 0.001946f, 0.008291f, 0.003671f, 0.026897f, -0.002497f, 0.015094f, 0.012243f, -0.008124f, -0.015032f, -0.001625f, 0.001929f, 0.004114f, -0.003934f, 0.007040f, 0.003440f, -0.006403f, -0.001594f, -0.006107f, -0.002103f, 0.004063f, -0.001811f, 0.005922f, -0.001257f, 0.002225f, 0.001680f, -0.002519f, 0.003256f, 0.003654f, -0.005117f, 0.003728f, 0.002580f, 0.001272f, 0.001462f, -0.000029f, 0.001232f, 0.006554f, 0.002193f, -0.002112f, 0.001356f, 0.001915f, 0.003365f, 0.004096f, -0.001012f, -0.004269f, -0.001082f, -0.003711f, -0.002704f, 0.004885f, 0.014084f, 0.018575f, 0.011383f, -0.019906f, + 0.037909f, -0.012031f, 0.007108f, -0.027959f, 0.010983f, -0.024732f, 0.018995f, 0.001909f, -0.005413f, -0.014020f, 0.017945f, 0.002353f, 0.011405f, 0.011838f, 0.005984f, -0.020828f, 0.010496f, -0.012628f, -0.002432f, 0.009319f, 0.010062f, 0.002322f, -0.003998f, -0.020859f, 0.002763f, 0.019127f, 0.002002f, 0.012369f, 0.013736f, -0.021771f, 0.011823f, -0.011086f, -0.011061f, 0.016003f, 0.017610f, 0.009200f, 0.009838f, 0.002742f, 0.009420f, -0.022425f, -0.010160f, -0.007177f, 0.000473f, 0.023824f, 0.011271f, 0.009428f, -0.001942f, 0.010465f, -0.000718f, 0.026249f, 0.009507f, 0.009947f, 0.003824f, -0.001482f, -0.039058f, 0.014395f, 0.008986f, -0.003607f, -0.002960f, -0.029028f, 0.000055f, -0.011099f, 0.006717f, 0.025269f, -0.004470f, -0.014467f, 0.029239f, -0.001320f, 0.016406f, -0.009820f, -0.000144f, -0.018380f, -0.001954f, 0.000364f, -0.032106f, -0.009460f, -0.005761f, -0.014308f, -0.006917f, -0.002799f, 0.001726f, 0.015978f, 0.000891f, -0.000354f, -0.003378f, -0.008200f, -0.001628f, 0.001510f, -0.003339f, 0.001173f, 0.000072f, 0.004318f, -0.007798f, -0.002895f, -0.001336f, -0.006828f, + 0.000030f, -0.004405f, -0.003167f, -0.002192f, -0.005923f, -0.002797f, 0.006145f, -0.002110f, 0.000779f, -0.001708f, 0.006673f, -0.000240f, 0.002798f, -0.004508f, -0.010754f, -0.003052f, -0.000876f, 0.004559f, 0.001428f, 0.006459f, -0.000874f, -0.001919f, 0.004947f, -0.006570f, 0.007970f, -0.000140f, 0.024946f, -0.021376f, 0.003187f, 0.009113f, 0.011320f, -0.037146f, 0.024757f, 0.006963f, -0.026391f, -0.016855f, 0.014496f, 0.033217f, -0.011614f, -0.005965f, -0.022842f, 0.047529f, 0.018499f, 0.003016f, 0.007968f, -0.024865f, -0.016080f, -0.000988f, 0.002131f, 0.024681f, 0.005400f, 0.019041f, 0.021399f, -0.000873f, 0.001383f, 0.014921f, -0.003859f, -0.015797f, -0.015103f, -0.003801f, 0.021184f, -0.011358f, 0.026783f, -0.012342f, 0.039303f, 0.017508f, 0.031710f, -0.008520f, 0.005177f, 0.025456f, -0.019721f, 0.011893f, 0.011518f, 0.010825f, -0.011272f, 0.013577f, 0.003328f, 0.004362f, 0.011600f, 0.024203f, 0.020362f, -0.020567f, -0.004772f, 0.010658f, -0.020056f, -0.012731f, -0.005262f, -0.041107f, 0.011058f, -0.020302f, -0.012708f, 0.004004f, -0.005057f, 0.014118f, 0.026269f, 0.016842f, + 0.010644f, -0.014134f, -0.003308f, -0.000835f, -0.027802f, 0.005113f, 0.002401f, 0.034436f, 0.007440f, 0.007760f, -0.007427f, 0.026606f, -0.000210f, -0.000747f, 0.000107f, -0.008639f, -0.003931f, 0.001124f, -0.001565f, -0.009369f, 0.000884f, -0.002408f, 0.001712f, -0.011181f, -0.012116f, -0.003985f, 0.009682f, -0.001609f, 0.003774f, 0.003658f, 0.002994f, -0.000803f, -0.002564f, -0.003359f, -0.006722f, -0.011230f, 0.003852f, 0.000574f, -0.002751f, -0.013272f, 0.009760f, 0.006637f, 0.003770f, -0.001118f, 0.000815f, -0.004539f, 0.003313f, -0.002411f, -0.004380f, 0.001525f, 0.005636f, 0.003393f, -0.003526f, -0.000890f, -0.001449f, 0.004133f, -0.029670f, -0.043771f, 0.023642f, -0.017833f, 0.019376f, 0.006332f, 0.009361f, 0.011480f, -0.029429f, -0.053480f, 0.004694f, 0.007728f, 0.030086f, -0.029710f, -0.032619f, 0.028111f, -0.011279f, 0.012790f, -0.006199f, 0.006700f, 0.004399f, 0.007421f, -0.014898f, 0.007178f, -0.002206f, -0.004631f, 0.018503f, 0.006955f, -0.002746f, -0.024102f, -0.003372f, -0.000666f, -0.004527f, -0.001123f, -0.013143f, -0.031966f, -0.014313f, 0.023523f, -0.010100f, 0.011620f, + -0.018240f, 0.013481f, 0.006821f, -0.000196f, -0.009243f, -0.039640f, 0.021827f, 0.021349f, 0.027266f, -0.019095f, -0.008238f, 0.037279f, 0.032770f, 0.015262f, 0.006942f, 0.021102f, 0.007605f, 0.018972f, -0.010283f, 0.016492f, -0.031523f, -0.001916f, 0.008609f, -0.008088f, 0.037194f, 0.001542f, 0.020265f, -0.012088f, -0.020233f, 0.043256f, -0.000893f, 0.017232f, -0.005883f, 0.000713f, -0.050942f, -0.004168f, 0.010617f, -0.019481f, 0.023730f, 0.018253f, 0.004276f, -0.010269f, -0.038870f, -0.000702f, -0.008068f, 0.009765f, 0.011539f, 0.002094f, -0.004926f, 0.009234f, 0.000181f, 0.004610f, -0.002685f, -0.011551f, -0.004514f, -0.010530f, 0.018467f, 0.005897f, -0.000632f, -0.000229f, 0.002083f, 0.017451f, -0.003256f, -0.003970f, 0.002394f, -0.001180f, -0.000066f, 0.007935f, 0.003937f, 0.007158f, -0.005294f, -0.000460f, -0.008307f, 0.001755f, -0.000193f, 0.007505f, 0.006965f, -0.007877f, 0.012707f, 0.013485f, -0.010710f, 0.001034f, -0.021924f, -0.028725f, -0.008334f, -0.006722f, -0.049195f, -0.046147f, -0.012084f, 0.000233f, 0.034750f, 0.028270f, 0.027979f, -0.010808f, -0.004487f, -0.006992f, + 0.029873f, 0.012841f, -0.012521f, -0.002208f, -0.009967f, 0.021609f, 0.016775f, -0.012458f, -0.017451f, -0.016016f, -0.032723f, 0.013681f, 0.000923f, 0.000938f, 0.007155f, -0.004884f, 0.012424f, 0.046043f, -0.026192f, 0.013890f, 0.002758f, -0.017731f, -0.010149f, -0.021055f, 0.007999f, -0.009351f, -0.010572f, 0.023848f, 0.002940f, -0.007938f, 0.024080f, -0.003260f, -0.010613f, 0.008390f, 0.017573f, -0.009652f, 0.018885f, 0.033910f, 0.032705f, -0.022330f, -0.000296f, 0.008183f, 0.018437f, -0.028281f, -0.005881f, -0.007798f, 0.035275f, 0.015044f, -0.003786f, -0.021427f, -0.023782f, -0.021140f, 0.031862f, 0.026391f, -0.050431f, -0.042070f, -0.031902f, -0.022461f, 0.007631f, -0.020255f, 0.012333f, 0.003385f, 0.005026f, -0.040561f, -0.012988f, 0.036717f, 0.028323f, -0.012267f, -0.026022f, 0.025374f, 0.013307f, -0.003022f, 0.000446f, -0.003205f, -0.006150f, 0.014437f, -0.012897f, 0.003185f, 0.002241f, -0.000505f, -0.009310f, -0.017009f, 0.003321f, 0.013886f, -0.001329f, 0.001560f, -0.005924f, 0.013193f, 0.014430f, 0.001456f, -0.001876f, 0.004895f, -0.000482f, 0.005864f, 0.006313f, 0.009112f, + -0.012136f, -0.001125f, 0.004497f, 0.000048f, -0.007514f, 0.002079f, 0.015305f, 0.014259f, -0.005370f, 0.010942f, -0.016622f, 0.004236f, -0.005332f, -0.004563f, -0.006627f, -0.010349f, 0.040573f, 0.031957f, 0.019794f, 0.002990f, -0.026677f, -0.013906f, -0.004211f, 0.010831f, 0.016783f, -0.023617f, 0.006012f, 0.001363f, -0.020196f, -0.009605f, 0.016078f, -0.012041f, 0.012755f, 0.005437f, 0.015019f, -0.018859f, -0.000193f, -0.041990f, 0.006160f, -0.053083f, 0.021675f, 0.021436f, -0.020703f, 0.024216f, 0.028876f, 0.000746f, 0.008128f, -0.034267f, 0.020017f, 0.001900f, -0.014313f, 0.018406f, -0.004508f, 0.000152f, -0.000469f, 0.002155f, 0.035554f, -0.004147f, -0.000202f, 0.043679f, -0.000589f, -0.020348f, -0.058011f, -0.047705f, 0.052728f, 0.032800f, 0.012876f, 0.013179f, -0.022280f, -0.044723f, -0.022061f, 0.006925f, -0.017284f, 0.034728f, -0.002027f, 0.004493f, 0.037458f, -0.007864f, -0.011847f, -0.008603f, -0.023860f, -0.040394f, -0.032123f, 0.090823f, -0.044347f, -0.020155f, 0.025934f, -0.046226f, -0.033350f, 0.032845f, 0.046107f, 0.015089f, -0.008589f, 0.054294f, 0.026132f, -0.043962f, + -0.015369f, -0.024622f, -0.024034f, 0.049344f, 0.003407f, -0.033139f, -0.022962f, -0.025831f, 0.007047f, -0.005459f, 0.014916f, -0.000534f, -0.007795f, -0.012205f, 0.000928f, 0.013535f, -0.007562f, 0.006164f, -0.007374f, 0.006656f, 0.006019f, 0.018911f, -0.007628f, -0.002956f, 0.016176f, 0.001130f, 0.008170f, 0.008350f, 0.011484f, 0.002013f, -0.007039f, -0.004021f, -0.001960f, -0.002925f, 0.006954f, -0.002407f, -0.007870f, 0.015195f, 0.015684f, -0.008965f, 0.003837f, -0.010183f, 0.003397f, 0.003538f, 0.009586f, -0.002689f, -0.001203f, -0.005137f, 0.004826f, 0.011183f, -0.037266f, -0.027481f, -0.019150f, -0.034096f, -0.002992f, 0.032475f, -0.002259f, 0.006750f, 0.016031f, 0.010670f, -0.027429f, -0.013233f, -0.022652f, -0.012087f, 0.029254f, -0.008822f, -0.003093f, -0.003911f, 0.017773f, 0.017724f, 0.052726f, 0.008475f, 0.038836f, -0.002176f, 0.013165f, -0.021017f, -0.015806f, 0.013974f, -0.026767f, -0.029770f, 0.001068f, 0.009495f, -0.015236f, 0.012347f, -0.017853f, 0.005563f, -0.047119f, 0.026440f, 0.014835f, 0.021641f, 0.002773f, -0.019108f, -0.039465f, -0.014021f, -0.003440f, 0.032695f, + -0.024753f, -0.014617f, 0.009196f, 0.074660f, -0.020527f, 0.075897f, -0.046422f, 0.018449f, -0.017064f, 0.033352f, -0.013110f, 0.057603f, -0.054018f, 0.082458f, -0.007708f, 0.017024f, 0.035735f, -0.061008f, 0.054550f, -0.065171f, 0.044120f, -0.106244f, 0.057721f, -0.054579f, 0.048514f, -0.071229f, 0.062766f, 0.002188f, 0.040712f, 0.017663f, -0.033173f, 0.028995f, -0.023733f, 0.072117f, -0.032742f, 0.011931f, -0.042914f, 0.011711f, -0.002807f, 0.007964f, -0.015304f, 0.020064f, -0.019674f, 0.014232f, -0.006928f, 0.004628f, 0.006131f, 0.006426f, 0.008411f, -0.004845f, -0.011296f, -0.009161f, -0.010823f, -0.024947f, 0.014502f, 0.003753f, -0.017126f, -0.007945f, -0.005140f, 0.011179f, -0.019075f, 0.018232f, -0.014601f, 0.003668f, -0.007810f, 0.008887f, 0.002998f, -0.000136f, 0.027658f, -0.024438f, 0.014981f, -0.023613f, 0.035651f, -0.006749f, 0.034827f, -0.013685f, 0.010892f, 0.015749f, 0.005282f, 0.005444f, -0.000019f, 0.016683f, -0.024862f, 0.027279f, -0.018965f, 0.017955f, -0.032725f, -0.029647f, 0.034531f, 0.059559f, -0.049319f, 0.075499f, -0.004371f, 0.000005f, -0.002891f, 0.013125f, + -0.022452f, -0.016485f, -0.033643f, -0.007504f, 0.001085f, 0.000098f, -0.000172f, 0.029697f, 0.005082f, 0.032557f, 0.031842f, -0.020225f, 0.011716f, 0.067878f, 0.022163f, 0.014566f, 0.010171f, -0.058814f, 0.002990f, -0.009502f, -0.007387f, -0.053932f, -0.011430f, 0.031060f, 0.008745f, 0.010359f, 0.015581f, 0.039345f, 0.010232f, -0.012077f, -0.004052f, -0.003336f, 0.014713f, -0.026692f, -0.016489f, 0.040633f, 0.025150f, 0.018952f, 0.031331f, 0.023229f, -0.013691f, -0.006787f, -0.046834f, -0.020494f, 0.018995f, 0.015081f, 0.035291f, -0.025400f, -0.012729f, -0.008865f, 0.025927f, 0.015274f, 0.023268f, 0.009699f, -0.018516f, -0.017064f, 0.058370f, -0.017793f, -0.056827f, 0.013205f, 0.041008f, 0.028227f, -0.000810f, -0.004826f, 0.005007f, 0.009496f, 0.005738f, 0.052277f, -0.062925f, -0.053581f, 0.006167f, 0.021295f, -0.027130f, -0.013861f, 0.004494f, -0.021188f, 0.010002f, -0.010298f, -0.002771f, 0.005724f, -0.004174f, -0.014189f, 0.000434f, 0.012009f, -0.007751f, 0.000249f, -0.020916f, -0.003504f, -0.018421f, 0.013605f, -0.005940f, 0.012494f, -0.007581f, 0.007869f, 0.003077f, 0.010580f, + 0.016158f, -0.016358f, -0.007558f, -0.004761f, 0.012698f, -0.007837f, -0.015090f, -0.027183f, -0.000260f, -0.010743f, -0.004261f, 0.004361f, 0.002557f, 0.000988f, 0.005185f, 0.009183f, -0.001958f, 0.027837f, 0.003207f, -0.001975f, -0.021579f, 0.003949f, -0.004153f, -0.000943f, -0.023121f, -0.119406f, 0.033019f, -0.014534f, -0.007567f, 0.029314f, -0.020230f, 0.031455f, -0.004220f, -0.051735f, -0.009425f, 0.005049f, 0.018180f, 0.023130f, 0.005390f, -0.036657f, 0.036308f, -0.014221f, -0.003293f, -0.022521f, -0.010128f, 0.019482f, -0.003883f, 0.017381f, 0.029276f, -0.006757f, -0.037790f, 0.008406f, 0.041485f, -0.038601f, 0.014214f, 0.032220f, -0.005852f, -0.025525f, -0.047662f, -0.032141f, 0.033629f, 0.086198f, -0.026532f, -0.034356f, 0.097097f, -0.006322f, -0.013978f, 0.069902f, 0.040688f, 0.034745f, 0.028060f, 0.011540f, -0.020544f, 0.035526f, 0.033067f, 0.022809f, 0.010548f, -0.064228f, 0.040132f, 0.035548f, -0.067838f, -0.039204f, -0.024376f, -0.018971f, -0.018692f, 0.074056f, 0.036956f, -0.042296f, 0.039562f, -0.015638f, -0.039584f, 0.017269f, 0.020131f, -0.017456f, -0.016782f, -0.062063f, + 0.006975f, 0.010637f, 0.045411f, 0.021790f, 0.005614f, 0.038008f, -0.030188f, 0.078592f, -0.083523f, -0.097388f, 0.068762f, -0.042014f, -0.002622f, 0.048270f, -0.030413f, -0.020891f, -0.006033f, -0.005714f, 0.005979f, 0.029626f, 0.014512f, -0.024206f, -0.001509f, 0.011553f, -0.002923f, 0.016471f, -0.000679f, 0.009117f, 0.001747f, -0.012839f, 0.006872f, 0.026286f, 0.018054f, -0.001125f, 0.003479f, 0.017582f, -0.002863f, -0.002072f, 0.004413f, 0.040690f, 0.020832f, -0.006519f, 0.008847f, -0.036060f, -0.001628f, 0.009529f, -0.016664f, -0.022357f, 0.021048f, -0.009664f, -0.000680f, 0.021698f, -0.018892f, 0.008346f, -0.003280f, -0.005394f, 0.026860f, -0.015231f, -0.031929f, -0.130108f, 0.039801f, 0.073137f, -0.045607f, -0.009632f, -0.035504f, 0.075251f, 0.050549f, 0.031672f, -0.006187f, -0.026552f, 0.005246f, 0.030223f, 0.013981f, -0.013301f, -0.003060f, 0.041407f, -0.002913f, -0.015506f, -0.055903f, -0.026606f, 0.046832f, 0.027142f, -0.029833f, 0.023564f, -0.021654f, -0.006998f, 0.013920f, 0.013040f, -0.013120f, 0.008350f, -0.049039f, 0.013788f, 0.065855f, -0.008593f, -0.013061f, -0.065106f, + -0.039205f, 0.031279f, -0.051391f, -0.028022f, 0.011514f, 0.012812f, -0.016036f, 0.042325f, 0.039942f, -0.041555f, 0.015230f, 0.022829f, 0.066343f, 0.060752f, -0.009853f, 0.019730f, -0.001841f, 0.069487f, 0.030077f, 0.028052f, 0.065826f, -0.029709f, -0.043375f, -0.022323f, -0.055467f, 0.046365f, 0.021744f, 0.022538f, 0.011864f, 0.078831f, -0.052576f, -0.012444f, 0.033521f, -0.018893f, 0.037224f, -0.002036f, 0.004140f, 0.017211f, -0.045951f, -0.069531f, 0.008481f, 0.013119f, 0.075973f, 0.057773f, 0.001144f, -0.056466f, -0.009153f, -0.061654f, -0.000621f, -0.002172f, -0.017521f, -0.015968f, 0.008065f, -0.005540f, -0.004904f, -0.015810f, -0.010412f, -0.014070f, -0.008541f, 0.001894f, -0.016747f, -0.015259f, -0.002801f, 0.015099f, 0.007527f, -0.020205f, 0.017843f, -0.010355f, 0.033375f, -0.010784f, -0.030270f, -0.011223f, 0.014591f, -0.009532f, -0.023050f, 0.025722f, -0.005925f, -0.023929f, -0.037007f, 0.005430f, -0.006242f, 0.004077f, 0.007751f, -0.014327f, -0.012407f, -0.032336f, -0.007495f, -0.008718f, 0.001883f, 0.005709f, 0.011442f, 0.010022f, -0.024842f, 0.030442f, 0.051564f, 0.045045f, + 0.046394f, 0.059658f, -0.033970f, 0.047043f, -0.091227f, -0.039720f, 0.034836f, 0.008468f, 0.067011f, 0.030740f, 0.057177f, -0.024539f, 0.007751f, -0.049200f, 0.033768f, 0.055654f, 0.050601f, 0.005331f, 0.035920f, -0.087577f, -0.056999f, 0.054777f, 0.016072f, -0.054487f, -0.028091f, 0.006955f, 0.080742f, 0.025135f, -0.032600f, -0.041109f, 0.008381f, -0.011815f, 0.049723f, 0.053756f, -0.005116f, -0.008435f, 0.010792f, -0.014919f, 0.064248f, 0.018677f, -0.015042f, 0.013168f, -0.030346f, -0.017847f, -0.143442f, -0.048558f, 0.025746f, -0.022212f, -0.021346f, -0.000453f, -0.025763f, -0.025692f, 0.065955f, 0.044285f, -0.033011f, 0.060268f, 0.124550f, 0.025826f, 0.088753f, 0.012494f, 0.018143f, 0.065254f, 0.043075f, -0.034776f, -0.039589f, -0.069665f, -0.043326f, -0.004354f, -0.068841f, 0.025803f, -0.008181f, -0.066536f, -0.047770f, -0.047539f, -0.059920f, -0.036197f, -0.024013f, -0.031691f, 0.009558f, 0.057217f, 0.069673f, 0.036921f, -0.007130f, -0.050484f, -0.006370f, 0.002242f, 0.004421f, -0.024452f, -0.004326f, -0.016424f, 0.013682f, 0.019870f, 0.002258f, 0.014630f, -0.000378f, -0.009574f, + 0.016710f, -0.017664f, 0.002341f, 0.016113f, 0.034142f, 0.004984f, -0.000254f, 0.023287f, 0.009786f, 0.061949f, -0.015395f, -0.049838f, -0.002540f, 0.034173f, 0.006078f, -0.013322f, -0.015252f, -0.040445f, -0.038535f, -0.021507f, -0.015327f, -0.006754f, -0.023133f, -0.033091f, -0.035554f, -0.019134f, -0.002866f, 0.005275f, 0.047119f, 0.034474f, -0.012640f, 0.055218f, 0.097466f, 0.067844f, 0.047458f, 0.030070f, 0.018621f, -0.023546f, -0.015548f, -0.023476f, -0.021704f, -0.000847f, 0.057124f, -0.005855f, 0.048577f, -0.030865f, 0.013199f, -0.106631f, 0.030484f, -0.015906f, 0.055338f, -0.013332f, -0.063634f, 0.064683f, -0.023824f, 0.010199f, 0.036976f, 0.027737f, 0.059257f, -0.008637f, 0.009336f, -0.010855f, 0.067512f, -0.013911f, 0.013125f, 0.047114f, -0.053502f, 0.046463f, -0.013096f, 0.028564f, 0.045120f, -0.011677f, 0.010450f, 0.007850f, 0.005038f, -0.014057f, 0.020357f, 0.019707f, -0.007434f, -0.025905f, -0.004392f, -0.030258f, -0.009561f, -0.005448f, 0.025540f, -0.012482f, -0.048289f, -0.031707f, 0.051834f, 0.052352f, -0.048621f, -0.040697f, 0.061979f, 0.072763f, -0.027487f, -0.006729f, + 0.052575f, 0.002555f, 0.027276f, 0.038379f, -0.087099f, -0.025430f, -0.005478f, 0.085313f, 0.008252f, -0.005564f, -0.082978f, 0.017040f, 0.033249f, 0.021964f, 0.003435f, 0.022938f, 0.009097f, 0.012074f, 0.106852f, -0.002778f, 0.006043f, 0.063134f, -0.037074f, 0.042119f, 0.008239f, 0.031908f, 0.020931f, -0.047762f, -0.015477f, 0.057921f, 0.038453f, 0.022511f, -0.013182f, 0.020591f, 0.010458f, 0.000507f, 0.008061f, 0.015157f, -0.006552f, 0.025564f, -0.016036f, -0.003875f, 0.026252f, 0.015822f, 0.005656f, -0.053586f, 0.005285f, 0.027319f, -0.019920f, 0.010109f, -0.047679f, -0.029901f, 0.034182f, 0.017014f, 0.028176f, 0.024832f, -0.018758f, -0.052060f, -0.014290f, 0.018689f, 0.046286f, 0.028550f, -0.006437f, -0.009456f, -0.015726f, 0.038450f, -0.000332f, -0.006878f, -0.015043f, 0.020739f, 0.008796f, -0.007481f, -0.037951f, -0.023465f, 0.024581f, 0.024977f, 0.017565f, -0.025548f, -0.036684f, 0.019389f, 0.049093f, 0.023615f, 0.003585f, -0.023588f, -0.005694f, 0.012311f, -0.000434f, 0.001901f, 0.002856f, -0.005002f, -0.011256f, 0.061482f, -0.104279f, -0.007253f, -0.088235f, -0.081790f, + 0.020487f, 0.017175f, 0.014917f, 0.001991f, 0.077707f, 0.044245f, 0.100062f, 0.109494f, -0.012094f, -0.053951f, 0.011408f, -0.014705f, -0.010045f, 0.023662f, 0.010580f, -0.008866f, -0.050459f, -0.055246f, 0.059755f, 0.027531f, -0.006813f, 0.009060f, 0.009712f, 0.005385f, 0.011008f, -0.005762f, -0.014308f, -0.081668f, 0.001797f, 0.046664f, -0.013710f, -0.063000f, -0.020601f, 0.051438f, -0.095714f, -0.033103f, 0.060569f, 0.036449f, 0.072333f, -0.002291f, 0.005322f, -0.066876f, -0.067256f, -0.085021f, 0.071464f, 0.100871f, -0.133084f, -0.066600f, -0.006885f, 0.067371f, -0.052735f, -0.008875f, 0.122216f, 0.049399f, 0.031086f, 0.080545f, 0.059175f, 0.088440f, -0.031924f, 0.087922f, -0.013308f, -0.069517f, -0.101639f, -0.024188f, 0.039129f, -0.080960f, -0.015638f, 0.017013f, -0.016861f, -0.028745f, 0.017365f, 0.015209f, -0.055282f, 0.040953f, 0.020397f, 0.059671f, -0.014269f, -0.059231f, 0.073570f, 0.014432f, -0.066689f, -0.000036f, -0.015352f, 0.027458f, -0.029397f, -0.030818f, -0.015368f, -0.003551f, -0.000735f, -0.023486f, -0.027658f, 0.021211f, -0.028859f, -0.000708f, -0.028510f, 0.015350f, + 0.027599f, 0.003833f, 0.041139f, 0.027570f, -0.040878f, -0.015819f, 0.000308f, -0.037530f, 0.006501f, -0.006770f, 0.015023f, -0.010269f, 0.013289f, 0.035258f, 0.000427f, 0.006387f, -0.024754f, 0.037951f, 0.024825f, -0.027755f, -0.007643f, 0.026904f, 0.026166f, -0.004353f, -0.039218f, -0.005694f, -0.077324f, 0.059457f, -0.005108f, 0.018136f, 0.022976f, 0.022242f, 0.000670f, -0.026107f, 0.042154f, 0.010516f, 0.040687f, -0.008838f, -0.086497f, -0.007923f, 0.024896f, -0.028492f, -0.031705f, -0.019447f, -0.029228f, 0.035140f, -0.009109f, -0.030800f, -0.001807f, 0.032686f, -0.044092f, 0.030771f, -0.015337f, 0.016340f, -0.043435f, -0.010877f, 0.017524f, -0.003788f, -0.004056f, 0.005293f, 0.024294f, -0.004373f, -0.003992f, -0.030370f, 0.015061f, -0.008377f, 0.004832f, 0.009324f, 0.003149f, 0.022419f, -0.032931f, -0.025177f, 0.034419f, 0.029660f, -0.041339f, 0.019651f, -0.033413f, 0.038456f, -0.032283f, 0.014477f, 0.009913f, -0.027358f, 0.060495f, 0.005837f, -0.067365f, 0.030990f, 0.008127f, -0.052128f, 0.029198f, -0.019166f, 0.031100f, -0.045199f, 0.023151f, -0.047875f, 0.021938f, 0.033992f, + -0.030831f, 0.017632f, -0.032757f, 0.001105f, 0.001094f, 0.003091f, -0.021528f, 0.000384f, 0.016381f, -0.000952f, -0.029569f, 0.022272f, -0.018529f, -0.039821f, 0.017137f, -0.017697f, 0.008663f, 0.018497f, -0.014082f, -0.008539f, 0.003331f, -0.002642f, 0.012028f, -0.006342f, -0.004392f, 0.010704f, 0.013645f, 0.004556f, -0.013721f, -0.008220f, 0.013178f, 0.007860f, -0.031051f, 0.028322f, -0.004067f, -0.010637f, 0.003956f, -0.002252f, 0.006706f, 0.015179f, -0.003754f, 0.028774f, -0.008501f, -0.012555f, -0.014037f, -0.005666f, 0.002773f, -0.013649f, 0.003632f, -0.004655f, -0.005547f, 0.003448f, 0.004660f, -0.005693f, -0.000129f, -0.001629f, -0.006021f, 0.005862f, 0.003961f, -0.006682f, 0.018012f, 0.038617f, -0.017628f, -0.206704f, -0.373995f, -0.123498f, -0.289581f, -0.286461f, 0.156174f, 0.033446f, 0.216722f, 0.488154f, 0.439969f, 0.360973f, 0.440603f, 0.270119f, 0.061316f, 0.085799f, -0.061285f, -0.324961f, -0.321177f, -0.240027f, -0.312042f, -0.213567f, -0.043257f, -0.143750f, -0.198812f, -0.085590f, -0.023782f, -0.102735f, -0.048243f, -0.000803f, -0.050768f, -0.091304f, 0.020676f, 0.081163f, + -0.025857f, 0.112159f, 0.166901f, 0.005302f, 0.033202f, 0.225292f, 0.112265f, 0.002591f, 0.211174f, 0.172922f, -0.039065f, 0.082536f, 0.197238f, -0.002508f, 0.017237f, 0.277902f, 0.149807f, 0.063027f, 0.335741f, 0.369898f, 0.182476f, 0.350739f, 0.435821f, 0.115215f, 0.059518f, 0.178240f, -0.069620f, -0.209103f, -0.121585f, -0.272455f, -0.484326f, -0.483215f, -0.548812f, -0.731184f, -0.736582f, -0.706680f, -0.723192f, -0.646882f, -0.554583f, -0.443939f, -0.290693f, -0.147320f, 0.072513f, 0.321037f, 0.422874f, 0.515930f, 0.698246f, 0.614282f, 0.549035f, 0.613342f, 0.452849f, 0.212002f, 0.248860f, 0.281244f, 0.104262f, 0.136066f, 0.281494f, 0.138665f, 0.026511f, 0.121241f, 0.109003f, -0.061265f, 0.000226f, 0.075983f, -0.111283f, -0.141916f, 0.032490f, -0.028065f, -0.046331f, 0.157076f, 0.134700f, 0.014209f, 0.122439f, 0.177756f, 0.031224f, -0.013237f, 0.009943f, -0.181776f, -0.329184f, -0.343646f, -0.438814f, -0.552043f, -0.523405f, -0.468011f, -0.426661f, -0.380236f, -0.279442f, -0.264826f, -0.289650f, -0.193693f, -0.063475f, 0.017640f, 0.071444f, 0.190000f, 0.227349f, 0.257519f, + 0.461124f, 0.537802f, 0.496705f, 0.458484f, 0.364995f, 0.231271f, 0.197783f, 0.168539f, 0.102917f, 0.073684f, 0.067664f, 0.027072f, -0.006517f, -0.009208f, -0.019947f, -0.040694f, -0.050921f, -0.041722f, -0.057807f, -0.078598f, -0.075995f, -0.073647f, -0.083311f, -0.079173f, -0.060201f, -0.048258f, -0.035726f, -0.029050f, -0.027559f} + }, + { + {-0.015794f, 0.001746f, 0.010395f, 0.003553f, 0.006774f, -0.009882f, -0.005415f, 0.000446f, -0.001751f, 0.002647f, 0.008233f, -0.019798f, -0.000139f, 0.006507f, 0.003909f, 0.005998f, -0.005732f, -0.008002f, 0.008653f, -0.000147f, 0.002412f, 0.005393f, 0.007160f, 0.002640f, 0.001494f, 0.006439f, -0.000951f, -0.002063f, -0.005565f, 0.002997f, -0.001566f, -0.000907f, -0.002889f, 0.003700f, 0.009419f, 0.000038f, -0.001957f, 0.004431f, -0.006025f, -0.009017f, -0.004983f, -0.001829f, -0.005847f, 0.000525f, -0.001352f, 0.003784f, -0.003648f, 0.001050f, -0.007316f, -0.000706f, -0.006016f, -0.000289f, -0.002755f, -0.002378f, 0.003063f, -0.003473f, -0.000353f, 0.004950f, -0.002603f, 0.005904f, 0.007157f, 0.000519f, 0.009674f, -0.004949f, -0.000330f, 0.004624f, -0.001673f, 0.003120f, 0.004397f, 0.002375f, -0.005088f, 0.002002f, 0.002329f, 0.001636f, 0.000310f, -0.004256f, 0.005646f, -0.001524f, 0.002698f, -0.000930f, -0.001169f, 0.000355f, -0.005874f, -0.000486f, -0.004564f, -0.002129f, -0.000200f, -0.000797f, -0.000156f, -0.000456f, -0.002453f, 0.002919f, 0.000342f, 0.000817f, 0.000205f, 0.001630f, + -0.000995f, 0.002059f, -0.000151f, 0.000876f, -0.000337f, -0.000898f, 0.001162f, 0.000112f, -0.000344f, -0.000026f, 0.001640f, 0.000351f, -0.000286f, 0.001011f, 0.000532f, -0.000212f, 0.026251f, -0.007436f, 0.002515f, -0.005746f, -0.000484f, -0.002412f, 0.003009f, 0.002020f, 0.008990f, 0.002747f, 0.001559f, 0.003467f, -0.002197f, -0.018175f, -0.017390f, -0.005452f, 0.002304f, 0.005295f, -0.004426f, 0.000966f, -0.005666f, -0.002040f, 0.000265f, 0.003053f, -0.007726f, -0.008417f, -0.002501f, -0.000562f, 0.004506f, 0.001462f, -0.001906f, -0.006085f, 0.001047f, -0.003364f, 0.000148f, 0.004212f, -0.006168f, 0.002924f, 0.005437f, -0.004293f, -0.011304f, -0.002974f, 0.004077f, -0.000701f, 0.003306f, -0.000580f, 0.002858f, -0.000554f, 0.003143f, 0.000588f, -0.010554f, 0.002043f, 0.004281f, -0.001693f, 0.002893f, 0.000466f, -0.000636f, -0.002115f, 0.000079f, -0.006230f, -0.000580f, -0.001731f, -0.007858f, -0.001348f, -0.000274f, 0.006926f, -0.006907f, 0.011411f, 0.013277f, 0.010443f, -0.004568f, -0.002153f, -0.002446f, 0.005048f, -0.001956f, -0.002900f, 0.003146f, -0.007564f, -0.006879f, 0.000809f, + 0.006046f, -0.000218f, -0.003105f, -0.006768f, -0.004007f, -0.005166f, -0.002738f, -0.004769f, 0.001744f, -0.002868f, -0.000787f, -0.003008f, -0.001592f, 0.000137f, 0.001554f, 0.000107f, 0.001600f, -0.001123f, 0.000096f, 0.001262f, 0.000650f, 0.000990f, 0.001005f, 0.000578f, -0.001275f, 0.001265f, -0.024789f, -0.000161f, -0.003823f, 0.001710f, -0.000856f, -0.012834f, -0.002455f, -0.002711f, 0.004011f, 0.006235f, -0.008592f, 0.006860f, -0.002188f, 0.004725f, 0.004748f, -0.002587f, 0.010320f, 0.000623f, 0.000458f, -0.001799f, 0.001793f, -0.002570f, 0.001905f, -0.002887f, 0.000385f, -0.006751f, 0.000725f, 0.007426f, 0.000001f, 0.003123f, 0.007831f, -0.007708f, -0.008113f, 0.003378f, -0.003684f, 0.006255f, -0.006335f, -0.001922f, -0.013247f, -0.010225f, -0.008852f, 0.003854f, 0.001143f, 0.004699f, -0.004812f, -0.003439f, -0.000999f, 0.008303f, -0.009197f, 0.003787f, 0.001606f, 0.000672f, 0.004666f, -0.003223f, -0.004212f, -0.005549f, 0.003384f, 0.001786f, -0.008135f, -0.008983f, -0.010428f, -0.000318f, -0.002238f, 0.003384f, -0.000471f, -0.001985f, 0.000980f, 0.001388f, 0.004670f, -0.012482f, + 0.001547f, 0.007083f, 0.010537f, 0.010800f, 0.008942f, -0.001591f, -0.006586f, 0.009678f, 0.002966f, 0.001865f, -0.004835f, 0.002784f, 0.002009f, 0.000278f, -0.001193f, -0.002885f, -0.000416f, 0.003298f, -0.002555f, -0.004256f, -0.001725f, -0.001843f, 0.000723f, -0.000374f, -0.001023f, 0.002872f, 0.000241f, 0.003672f, -0.000332f, 0.001043f, 0.002482f, 0.002300f, 0.001821f, 0.001291f, -0.001459f, -0.001652f, -0.000515f, 0.001442f, -0.000270f, 0.001408f, -0.000988f, 0.002478f, 0.002115f, -0.002198f, 0.000150f, 0.000151f, -0.003538f, 0.002666f, -0.014475f, 0.008990f, -0.007671f, 0.010713f, 0.013950f, 0.008697f, -0.000148f, 0.004142f, 0.000955f, 0.011425f, -0.006224f, -0.006252f, 0.003281f, -0.001735f, 0.004687f, 0.008794f, -0.012552f, 0.003999f, 0.011285f, 0.005323f, -0.000807f, -0.000088f, 0.001375f, -0.005237f, -0.000075f, -0.004948f, -0.006900f, -0.001799f, 0.010693f, -0.004006f, 0.004972f, -0.003700f, -0.006520f, 0.012800f, -0.011148f, 0.008595f, 0.009402f, 0.001863f, 0.005963f, -0.008260f, -0.002256f, -0.003269f, -0.002604f, 0.005969f, 0.001809f, -0.008884f, 0.001452f, -0.000857f, + 0.001690f, -0.001915f, 0.003206f, 0.003076f, 0.010663f, -0.011151f, 0.005375f, 0.004244f, -0.001122f, 0.004216f, 0.001180f, 0.006561f, 0.006139f, 0.003892f, -0.003603f, 0.005228f, 0.009229f, -0.000232f, 0.005409f, -0.003906f, 0.010941f, 0.011293f, 0.012395f, -0.003563f, -0.008682f, 0.002803f, -0.001211f, 0.004422f, 0.003190f, -0.000048f, -0.000659f, -0.012419f, -0.003251f, -0.002881f, -0.000985f, -0.002547f, -0.003730f, 0.004265f, 0.001632f, 0.001347f, 0.004997f, -0.000297f, 0.005053f, 0.003193f, 0.001634f, -0.000708f, 0.000867f, -0.001107f, -0.002125f, 0.001497f, 0.000374f, 0.002451f, -0.000742f, 0.000590f, -0.000169f, -0.001652f, 0.002749f, -0.000104f, -0.002371f, 0.000966f, 0.002226f, 0.000261f, -0.003086f, 0.000768f, -0.001431f, 0.004234f, 0.003094f, 0.003087f, -0.000355f, 0.000955f, 0.002409f, 0.000249f, 0.001236f, 0.020307f, -0.001861f, -0.006341f, 0.019317f, -0.007628f, 0.008681f, -0.004642f, -0.018446f, 0.003294f, -0.005298f, 0.000587f, 0.022136f, -0.008564f, -0.010459f, 0.000852f, 0.011647f, -0.018709f, -0.006924f, 0.014040f, -0.004913f, 0.004537f, 0.006662f, -0.005008f, + 0.006067f, -0.003915f, -0.006454f, 0.001304f, -0.001796f, -0.002277f, -0.002368f, 0.007821f, -0.006237f, 0.015232f, 0.003834f, 0.000325f, -0.008700f, -0.002596f, 0.009354f, -0.010696f, 0.002316f, 0.003698f, -0.001627f, -0.014914f, 0.010241f, 0.002705f, 0.002553f, 0.001314f, -0.002008f, 0.007685f, -0.004519f, 0.010510f, 0.006039f, -0.004101f, -0.018117f, 0.008073f, 0.004927f, -0.000464f, -0.005091f, 0.004375f, 0.011785f, 0.011898f, -0.001246f, 0.007032f, -0.010651f, 0.007768f, -0.001835f, -0.003714f, 0.004699f, 0.009197f, -0.006406f, 0.009103f, 0.001701f, -0.003877f, -0.003153f, 0.007420f, -0.006161f, 0.017647f, -0.009022f, 0.007290f, -0.006037f, 0.001563f, -0.005386f, 0.007043f, -0.006266f, 0.000288f, 0.004104f, -0.001254f, 0.000848f, -0.005490f, -0.001784f, -0.000783f, 0.000108f, 0.001457f, -0.002294f, 0.003033f, -0.000225f, -0.002174f, 0.003207f, -0.006303f, -0.006239f, -0.003650f, 0.000193f, -0.000661f, -0.001178f, 0.000138f, -0.004224f, 0.005235f, 0.000431f, -0.000395f, 0.003792f, -0.003085f, -0.000520f, 0.004120f, 0.001888f, 0.001410f, 0.006734f, 0.006037f, 0.019075f, 0.002528f, + -0.004801f, -0.024364f, 0.007548f, 0.013842f, 0.008288f, 0.005421f, -0.002042f, 0.007051f, 0.026540f, -0.003211f, 0.012274f, 0.001214f, 0.006875f, 0.002627f, 0.000505f, 0.005333f, -0.002199f, -0.011318f, -0.003147f, -0.008410f, -0.002171f, -0.011868f, 0.004309f, 0.000364f, 0.013939f, 0.002744f, -0.006451f, 0.004617f, -0.001951f, -0.003385f, 0.008943f, 0.003221f, 0.006690f, 0.003912f, -0.003829f, -0.015506f, 0.000985f, 0.009052f, -0.000591f, -0.002955f, 0.004078f, -0.008181f, -0.003464f, -0.014440f, -0.017892f, 0.009314f, 0.010365f, 0.008104f, -0.002506f, -0.002911f, 0.000163f, -0.000269f, 0.005317f, -0.000877f, 0.005821f, 0.005228f, -0.000142f, 0.005388f, -0.004947f, 0.001482f, -0.002595f, 0.003216f, 0.003925f, 0.016878f, 0.000081f, 0.013821f, -0.005137f, -0.014118f, -0.001248f, -0.001862f, -0.005347f, 0.011345f, -0.000861f, 0.004725f, 0.001094f, -0.007998f, -0.009642f, -0.003355f, -0.002001f, 0.001153f, 0.010013f, 0.003348f, 0.001119f, 0.004292f, 0.006735f, -0.002739f, 0.005097f, -0.000510f, 0.004349f, 0.002779f, 0.001150f, 0.006038f, -0.000570f, 0.003567f, 0.002063f, 0.001889f, + -0.001009f, -0.001479f, -0.003392f, -0.001482f, 0.003576f, 0.005477f, -0.001247f, 0.000566f, -0.002942f, -0.000340f, 0.000301f, -0.002907f, 0.002236f, -0.005556f, 0.000316f, -0.000180f, 0.000082f, 0.008777f, -0.021629f, -0.000712f, 0.022024f, 0.030280f, -0.012587f, 0.003398f, 0.004803f, -0.010524f, -0.006144f, 0.001186f, -0.008783f, -0.009151f, 0.021191f, 0.002958f, -0.014071f, -0.002249f, -0.009188f, -0.005236f, 0.013777f, -0.004344f, -0.006126f, 0.012505f, 0.007716f, 0.012634f, -0.005387f, 0.002593f, 0.012323f, 0.000534f, -0.007428f, 0.003369f, -0.001092f, 0.001528f, -0.015645f, -0.010664f, 0.004651f, -0.001126f, 0.003699f, -0.014404f, 0.006735f, 0.005246f, 0.003344f, -0.025382f, -0.014872f, -0.006449f, -0.003193f, 0.003585f, -0.011114f, -0.007443f, 0.002463f, 0.019415f, 0.012787f, 0.006860f, -0.003468f, -0.002162f, -0.007375f, 0.005585f, -0.002153f, -0.014414f, -0.011011f, -0.001363f, -0.000243f, 0.020332f, 0.011264f, -0.010126f, -0.011288f, 0.014043f, 0.002799f, -0.008534f, 0.000071f, 0.012595f, 0.004781f, 0.000330f, -0.016461f, 0.018071f, -0.006386f, 0.012030f, 0.015834f, 0.016621f, + 0.001471f, -0.006206f, -0.005007f, 0.008512f, 0.009815f, -0.008642f, 0.006902f, 0.009253f, 0.006580f, -0.002902f, -0.002206f, 0.001257f, 0.005659f, 0.004567f, -0.004913f, -0.007686f, -0.007166f, 0.003475f, -0.003435f, -0.002334f, -0.004970f, -0.001065f, -0.003560f, 0.001764f, -0.002936f, 0.002116f, 0.001747f, -0.000661f, 0.000015f, 0.004000f, -0.002968f, -0.006158f, -0.001086f, 0.005494f, -0.003352f, -0.003099f, -0.003171f, -0.002366f, -0.000386f, -0.000216f, -0.003744f, -0.000210f, -0.002722f, -0.001431f, 0.001050f, 0.003631f, -0.002440f, -0.000214f, -0.000783f, -0.001767f, 0.003430f, 0.004161f, -0.005866f, 0.008976f, -0.011464f, 0.013098f, -0.001200f, -0.003540f, 0.006965f, -0.013216f, 0.004515f, 0.007207f, 0.001448f, 0.005038f, 0.006239f, -0.003569f, 0.014592f, -0.006859f, -0.024902f, -0.014807f, -0.003276f, 0.000985f, -0.005276f, -0.010629f, -0.011636f, -0.007887f, 0.024461f, -0.006778f, -0.001930f, 0.003543f, -0.005084f, 0.002933f, 0.020067f, -0.009641f, 0.009525f, -0.006244f, -0.012900f, 0.011573f, 0.008349f, 0.005348f, 0.017985f, 0.000421f, 0.008471f, -0.000768f, 0.002148f, -0.000685f, + -0.005907f, 0.003983f, -0.001367f, 0.013048f, 0.002606f, -0.008955f, -0.002307f, -0.002568f, -0.000613f, -0.014609f, 0.005885f, -0.014402f, 0.003511f, 0.019433f, -0.012653f, -0.024240f, 0.005638f, 0.003388f, 0.011134f, -0.004894f, -0.000219f, 0.011382f, -0.006998f, 0.005592f, 0.008381f, 0.002378f, -0.005082f, 0.011240f, 0.002429f, 0.014426f, 0.003068f, -0.008910f, -0.008459f, 0.009386f, 0.015746f, 0.005565f, -0.000132f, -0.012908f, -0.002601f, -0.004128f, 0.009350f, 0.002399f, -0.017663f, 0.002821f, 0.004712f, 0.001336f, 0.001812f, 0.006913f, -0.003085f, 0.002942f, -0.004801f, 0.003070f, 0.002790f, 0.002263f, 0.003649f, 0.001629f, 0.002425f, 0.002240f, -0.004056f, 0.001383f, -0.001212f, -0.000593f, 0.004043f, 0.001734f, 0.002272f, 0.004571f, -0.001331f, -0.014134f, 0.001423f, -0.000893f, 0.001100f, -0.001230f, -0.000814f, 0.004021f, 0.002666f, -0.002224f, -0.002620f, -0.019393f, 0.044543f, -0.010482f, 0.019977f, 0.001819f, 0.008302f, 0.005986f, -0.000182f, -0.025069f, 0.021210f, -0.031237f, 0.010021f, 0.007408f, 0.028028f, -0.013240f, 0.012593f, -0.019901f, 0.012882f, -0.006489f, + -0.021423f, -0.010308f, 0.004960f, 0.005394f, 0.007732f, 0.003893f, 0.011151f, 0.007269f, 0.016939f, -0.005353f, -0.014000f, -0.012634f, 0.004821f, -0.000235f, -0.006951f, 0.011298f, 0.004898f, -0.002421f, 0.006717f, 0.014003f, -0.001370f, 0.003557f, -0.002177f, 0.006877f, 0.004029f, -0.018134f, -0.007920f, -0.023732f, -0.005514f, -0.004110f, -0.000619f, 0.011251f, 0.010027f, 0.001406f, -0.006600f, -0.000229f, -0.003629f, -0.005714f, 0.003083f, 0.033157f, 0.002918f, -0.000831f, 0.010499f, -0.000902f, 0.012040f, -0.005306f, 0.000080f, -0.008004f, 0.033290f, 0.007760f, -0.013795f, -0.015806f, -0.010569f, 0.001197f, -0.000782f, -0.021449f, 0.001122f, 0.004289f, 0.001396f, 0.023171f, -0.006108f, 0.003309f, -0.014501f, -0.004851f, -0.039293f, -0.006905f, 0.001979f, 0.001377f, -0.015131f, 0.003820f, -0.007304f, 0.004795f, 0.002230f, -0.007260f, -0.000930f, 0.005028f, 0.007917f, 0.014684f, 0.003854f, -0.005523f, -0.005119f, -0.012053f, -0.004677f, 0.000983f, 0.001945f, -0.006992f, -0.002665f, 0.006322f, 0.002251f, -0.001921f, -0.001685f, -0.005221f, -0.004786f, -0.002445f, 0.001320f, -0.010070f, + -0.007060f, 0.001712f, 0.003935f, -0.000106f, -0.002595f, 0.002314f, 0.008102f, 0.001212f, 0.000620f, -0.000838f, -0.003598f, 0.000093f, -0.011649f, 0.023428f, 0.002111f, 0.019520f, 0.011883f, 0.019145f, 0.006478f, -0.019181f, 0.018998f, -0.012240f, 0.032800f, -0.021043f, -0.006165f, -0.029143f, -0.006088f, -0.003003f, 0.013089f, -0.013503f, 0.019165f, 0.015487f, -0.009182f, 0.001185f, 0.021899f, 0.030809f, -0.009705f, 0.000875f, -0.003936f, 0.009725f, 0.000218f, -0.003492f, 0.004523f, 0.008517f, -0.014570f, 0.011137f, 0.002164f, 0.012754f, 0.004893f, 0.002031f, -0.024935f, -0.003940f, 0.029061f, -0.003372f, 0.009762f, 0.022333f, 0.006470f, -0.001629f, -0.007711f, -0.010145f, -0.006086f, 0.001115f, -0.009487f, -0.005622f, 0.016856f, 0.015641f, 0.004920f, 0.025911f, 0.017189f, -0.005308f, -0.002539f, 0.003633f, 0.006017f, -0.007791f, -0.020547f, 0.026942f, 0.011845f, -0.005411f, 0.024591f, 0.025787f, 0.028649f, 0.012514f, 0.004336f, -0.010284f, 0.000738f, -0.014430f, -0.011643f, -0.007320f, -0.028709f, 0.011628f, -0.003638f, 0.024588f, -0.005811f, -0.019152f, -0.003630f, 0.001938f, + -0.002864f, -0.025580f, 0.004092f, 0.006939f, 0.011672f, 0.012463f, -0.008694f, 0.004070f, -0.005947f, -0.016607f, 0.003254f, 0.006549f, -0.001315f, -0.004853f, -0.012635f, 0.013295f, 0.007421f, -0.011698f, -0.013414f, -0.007408f, 0.007620f, -0.001284f, -0.003856f, 0.003650f, -0.006005f, 0.003780f, -0.001595f, 0.002359f, 0.005703f, -0.008448f, -0.004053f, 0.003890f, -0.001903f, 0.000224f, 0.017023f, 0.005675f, 0.001040f, -0.001093f, 0.003956f, -0.005626f, -0.003355f, -0.000488f, 0.005475f, 0.025513f, 0.001453f, 0.004616f, -0.003894f, 0.002056f, -0.003333f, -0.038799f, 0.004439f, -0.000435f, -0.007015f, -0.002951f, -0.019090f, 0.021785f, 0.022359f, 0.024989f, -0.040701f, 0.013060f, 0.008363f, 0.000952f, 0.040053f, 0.016394f, -0.019987f, -0.002395f, 0.039546f, 0.004604f, 0.007025f, 0.008008f, -0.011669f, 0.006540f, 0.008126f, 0.024509f, 0.012443f, -0.018872f, -0.030954f, 0.011624f, 0.007301f, -0.015661f, -0.002960f, 0.001428f, -0.019038f, 0.002088f, 0.023183f, 0.009805f, 0.012985f, 0.018771f, 0.030512f, 0.002804f, 0.026873f, 0.005228f, -0.010700f, -0.001642f, -0.015936f, -0.008422f, + 0.006645f, 0.009015f, 0.006953f, 0.013425f, -0.019154f, -0.008748f, 0.034263f, -0.002637f, -0.007381f, -0.019258f, 0.016243f, 0.014624f, 0.005089f, 0.006046f, -0.000279f, 0.009340f, -0.014917f, 0.024364f, -0.012347f, -0.014726f, -0.011915f, -0.008304f, 0.033177f, 0.008820f, 0.006902f, -0.036247f, -0.019867f, -0.029828f, 0.002151f, -0.003325f, -0.002950f, -0.028315f, -0.039134f, -0.001291f, 0.017566f, -0.009833f, 0.004996f, -0.002752f, -0.002694f, 0.009634f, -0.013640f, -0.006031f, -0.006228f, 0.011662f, 0.001954f, -0.008935f, -0.000154f, -0.001626f, -0.000237f, -0.004366f, -0.008219f, 0.001807f, 0.013067f, -0.006611f, -0.004314f, -0.008636f, -0.003833f, -0.006131f, -0.002899f, 0.005465f, -0.001945f, 0.008786f, -0.003003f, -0.002236f, -0.005206f, -0.004128f, 0.013743f, -0.001711f, -0.000940f, -0.006807f, -0.001059f, 0.007824f, 0.002213f, -0.010321f, 0.002248f, 0.000443f, 0.002894f, 0.036084f, 0.042466f, -0.011000f, 0.011856f, -0.003204f, -0.012551f, 0.002366f, -0.028620f, -0.017712f, -0.001360f, -0.005834f, 0.056985f, -0.025782f, 0.007204f, -0.036366f, -0.005434f, 0.022051f, -0.009410f, -0.020280f, + -0.021290f, -0.007835f, 0.008630f, 0.011194f, -0.001525f, -0.001901f, -0.023917f, 0.005533f, 0.016563f, 0.008336f, 0.010114f, 0.002968f, 0.003622f, -0.013980f, -0.004657f, 0.009243f, 0.003315f, -0.000101f, 0.000948f, -0.016847f, 0.007367f, -0.017726f, -0.002966f, -0.000543f, 0.005029f, -0.019674f, -0.002122f, 0.009526f, 0.013959f, -0.022407f, -0.011816f, 0.039564f, -0.015339f, -0.031337f, 0.026162f, -0.025513f, -0.008123f, -0.011335f, -0.004672f, -0.019608f, -0.013649f, -0.004188f, -0.019775f, -0.028161f, 0.045160f, 0.024888f, 0.020067f, 0.013716f, -0.017693f, -0.006963f, -0.011970f, 0.012631f, -0.021416f, 0.015007f, -0.011481f, 0.006401f, 0.015058f, 0.009800f, 0.002966f, -0.029003f, 0.028223f, -0.034630f, -0.009173f, -0.033577f, -0.013707f, 0.021952f, -0.001395f, 0.012413f, 0.025225f, 0.007961f, -0.002687f, 0.004840f, -0.008966f, 0.000395f, -0.002813f, -0.009681f, 0.011330f, -0.004083f, -0.005416f, 0.012985f, 0.006825f, -0.003578f, 0.000780f, 0.000494f, 0.001969f, -0.006010f, 0.005589f, 0.001683f, 0.002960f, -0.007173f, 0.004706f, -0.003393f, 0.012297f, -0.005675f, 0.008657f, -0.002776f, + -0.004448f, 0.013033f, -0.008917f, -0.003951f, -0.007990f, 0.005177f, 0.012895f, 0.005873f, -0.003831f, 0.006022f, -0.005370f, 0.006154f, 0.008937f, -0.009962f, -0.023798f, -0.001884f, 0.059742f, -0.026889f, 0.025927f, -0.053558f, 0.014627f, -0.034078f, -0.006454f, 0.018868f, -0.001773f, 0.012061f, 0.019775f, 0.015751f, -0.023405f, 0.017298f, 0.003508f, 0.012758f, -0.005094f, 0.017741f, 0.016463f, -0.003753f, 0.003394f, 0.010618f, 0.012024f, -0.017288f, -0.005972f, -0.025162f, -0.003175f, 0.021956f, 0.000520f, -0.010618f, 0.002202f, 0.008038f, 0.001472f, -0.009245f, -0.017928f, 0.004410f, -0.012147f, 0.011411f, -0.011481f, 0.042421f, -0.004069f, -0.023282f, -0.026193f, 0.005748f, -0.014419f, 0.013258f, -0.029369f, -0.023064f, -0.029837f, 0.006706f, -0.025215f, -0.006134f, -0.036152f, 0.025636f, 0.005194f, 0.017203f, 0.010600f, -0.039040f, 0.002880f, -0.003619f, -0.014677f, -0.021881f, -0.006060f, -0.018654f, -0.023466f, -0.013025f, 0.010704f, 0.015244f, 0.022268f, -0.013055f, 0.003005f, 0.009554f, -0.032808f, 0.014856f, -0.022522f, -0.002186f, 0.018300f, 0.007698f, 0.007310f, 0.003278f, + 0.037729f, -0.021846f, -0.008115f, -0.008408f, 0.009784f, -0.032465f, 0.002409f, -0.002778f, -0.000479f, 0.020823f, 0.012018f, 0.010219f, 0.003580f, -0.008032f, 0.001102f, -0.004065f, 0.015075f, -0.006046f, -0.002157f, -0.008760f, 0.017108f, 0.006772f, -0.006274f, 0.004585f, -0.015535f, 0.010385f, 0.005165f, 0.008134f, 0.001118f, -0.003231f, 0.009480f, 0.017466f, 0.005773f, -0.008742f, -0.011945f, -0.004955f, 0.004223f, -0.012104f, -0.002975f, -0.018319f, -0.013493f, -0.007320f, -0.000277f, -0.010157f, 0.007016f, -0.008043f, 0.017517f, -0.014211f, -0.000583f, -0.000259f, -0.049756f, -0.014306f, 0.056098f, 0.049652f, 0.027957f, -0.023844f, 0.024659f, 0.037169f, -0.024390f, 0.032851f, -0.026262f, 0.030342f, 0.007255f, -0.001896f, 0.010088f, -0.000521f, 0.016033f, -0.023743f, -0.006654f, -0.010643f, 0.012246f, -0.022507f, -0.020200f, 0.031952f, -0.002932f, -0.006511f, 0.003143f, -0.030638f, -0.000547f, 0.049603f, 0.027122f, 0.005748f, -0.000330f, 0.010663f, 0.046958f, 0.020099f, 0.000858f, 0.008007f, -0.012811f, -0.005446f, -0.011006f, 0.020228f, -0.010281f, 0.013547f, 0.002684f, 0.024137f, + -0.028318f, -0.000489f, -0.001560f, 0.000841f, -0.007872f, 0.013515f, 0.021734f, -0.004981f, -0.005983f, 0.021880f, 0.002658f, 0.002801f, 0.049508f, 0.007861f, 0.000836f, -0.022515f, 0.010150f, -0.016724f, 0.023021f, -0.026336f, -0.023244f, 0.003676f, -0.022892f, -0.024572f, -0.037477f, 0.010173f, -0.012389f, 0.019511f, -0.006202f, 0.011043f, -0.054813f, 0.011285f, -0.018415f, -0.033287f, 0.017569f, 0.023104f, 0.012256f, 0.007197f, 0.004381f, 0.009729f, 0.014907f, -0.007054f, -0.008311f, -0.010064f, -0.000442f, -0.011046f, 0.007166f, 0.001515f, -0.015669f, -0.010926f, 0.009339f, 0.005478f, 0.000952f, 0.016300f, -0.005446f, -0.001652f, -0.012699f, -0.002699f, 0.000336f, 0.006777f, 0.004516f, -0.010836f, -0.006395f, -0.002971f, -0.012850f, -0.002443f, -0.012047f, 0.004988f, 0.003615f, 0.014661f, 0.010258f, -0.001008f, -0.005635f, 0.000020f, 0.000389f, -0.004152f, -0.000609f, -0.015267f, -0.002421f, 0.006278f, 0.007093f, 0.001952f, -0.002269f, 0.014743f, 0.002768f, 0.041585f, -0.064002f, 0.026849f, 0.027988f, -0.045500f, -0.004644f, -0.038988f, -0.012868f, -0.035003f, -0.015833f, 0.040028f, + -0.013710f, -0.002938f, -0.028158f, -0.005471f, 0.006460f, -0.041740f, -0.001633f, 0.026646f, -0.051533f, 0.001879f, -0.035189f, -0.019008f, 0.000698f, 0.003779f, -0.023308f, -0.018734f, -0.019532f, -0.005647f, -0.016794f, -0.001101f, 0.008933f, -0.005087f, 0.013063f, -0.025159f, -0.016035f, 0.033556f, -0.015720f, 0.018160f, -0.019992f, 0.018894f, 0.017306f, 0.002928f, 0.004612f, 0.017595f, 0.000827f, 0.025084f, 0.031775f, -0.006022f, 0.004700f, 0.047189f, 0.002799f, 0.024233f, -0.001711f, -0.018826f, -0.037234f, 0.006219f, 0.025852f, -0.041114f, 0.000538f, -0.024192f, -0.012694f, -0.053306f, 0.023017f, 0.035111f, -0.009190f, 0.016897f, -0.008628f, 0.038185f, 0.042307f, -0.003444f, -0.041893f, -0.040750f, 0.058057f, -0.045263f, 0.016938f, 0.006657f, 0.006034f, 0.043389f, -0.018494f, 0.070717f, -0.001179f, -0.016101f, -0.018441f, -0.012820f, 0.011322f, -0.004491f, -0.005395f, -0.000486f, 0.018285f, -0.004598f, -0.011488f, 0.015264f, -0.005514f, 0.007670f, -0.014063f, -0.008549f, 0.013391f, 0.000973f, 0.020008f, -0.006658f, 0.008525f, -0.014775f, -0.004190f, -0.020198f, 0.004182f, 0.008145f, + 0.010006f, 0.001877f, 0.010280f, 0.000917f, -0.003124f, 0.010849f, -0.017037f, 0.011225f, -0.014447f, -0.005228f, 0.008805f, -0.017842f, -0.004467f, -0.010268f, -0.029805f, -0.008062f, 0.001985f, 0.010710f, -0.014544f, -0.007664f, -0.012786f, -0.004247f, 0.003156f, 0.011733f, 0.069500f, 0.078326f, -0.004630f, -0.059078f, 0.058345f, -0.064588f, 0.009098f, 0.027386f, 0.006784f, -0.006916f, -0.029804f, 0.033553f, -0.015028f, -0.012028f, -0.030351f, -0.017654f, -0.009468f, -0.037882f, -0.020849f, -0.016933f, -0.009481f, -0.006227f, 0.026299f, -0.000387f, 0.022730f, 0.000167f, -0.009836f, -0.033182f, -0.036358f, -0.009182f, -0.001335f, -0.000490f, -0.005528f, -0.013592f, -0.015713f, 0.017391f, 0.041859f, -0.022751f, 0.014412f, -0.014206f, -0.014649f, 0.016632f, -0.016228f, -0.026274f, 0.058768f, -0.006493f, 0.005395f, 0.002883f, -0.032852f, -0.007224f, -0.006899f, 0.016648f, -0.042438f, -0.018792f, 0.044870f, 0.007216f, -0.019092f, 0.024390f, 0.045602f, -0.025947f, -0.032138f, 0.016689f, -0.027246f, 0.000441f, -0.050983f, 0.016454f, 0.043327f, -0.004436f, 0.022591f, 0.013199f, 0.007565f, 0.049718f, + 0.015589f, -0.000220f, 0.028651f, -0.004160f, -0.003993f, 0.017548f, 0.018783f, -0.072101f, 0.006572f, -0.031355f, 0.025477f, -0.001172f, 0.000959f, 0.017939f, -0.005449f, -0.006882f, -0.009508f, 0.009666f, 0.003659f, -0.007045f, 0.009608f, -0.010309f, 0.001023f, -0.005467f, -0.013940f, 0.006411f, -0.006992f, 0.015597f, 0.008548f, -0.000238f, 0.000048f, 0.004300f, -0.004159f, 0.009247f, 0.004501f, 0.002910f, 0.003746f, -0.002586f, 0.003392f, -0.006206f, -0.012110f, -0.006604f, -0.003162f, 0.001695f, -0.015746f, 0.012829f, 0.008575f, 0.000671f, 0.004650f, -0.010526f, 0.014714f, 0.001832f, -0.008778f, 0.005388f, 0.006337f, -0.018804f, -0.003922f, 0.001926f, -0.001535f, 0.000306f, 0.003416f, 0.002396f, -0.095306f, -0.066752f, 0.027872f, -0.028275f, -0.026644f, -0.081070f, -0.023383f, 0.017315f, 0.006722f, -0.015950f, -0.045071f, -0.000557f, 0.022887f, -0.001648f, 0.003134f, 0.023710f, 0.042090f, -0.036457f, 0.095786f, -0.024620f, -0.031763f, -0.009653f, -0.005348f, 0.000460f, -0.037864f, 0.000892f, -0.006638f, 0.020254f, -0.012764f, 0.028655f, -0.011820f, -0.024338f, 0.010025f, 0.011829f, + -0.021724f, 0.023775f, -0.072903f, 0.000604f, -0.005803f, 0.029135f, 0.035229f, -0.025475f, 0.032855f, -0.012579f, 0.009420f, -0.015672f, -0.005230f, -0.009631f, 0.026295f, -0.003497f, 0.034610f, 0.054036f, -0.046984f, -0.013129f, 0.025385f, -0.031665f, 0.019203f, -0.035974f, -0.019832f, -0.017905f, -0.021056f, -0.036726f, -0.018820f, 0.017124f, 0.013997f, 0.028180f, 0.036579f, 0.026568f, -0.044286f, 0.005535f, 0.008206f, 0.010538f, 0.008957f, 0.028307f, -0.013855f, -0.029963f, 0.017150f, -0.007810f, -0.023411f, 0.004552f, -0.040110f, -0.016620f, -0.034941f, 0.003171f, 0.020593f, -0.012757f, 0.019792f, 0.010591f, -0.001197f, -0.007625f, -0.000592f, -0.031178f, -0.011692f, 0.010273f, 0.005178f, 0.006753f, 0.002145f, 0.003444f, 0.002771f, 0.009622f, 0.002610f, -0.020969f, -0.002948f, 0.003084f, -0.002132f, 0.005335f, -0.009608f, -0.008835f, -0.020470f, 0.005176f, 0.018050f, -0.020615f, -0.014473f, 0.010462f, -0.005242f, -0.021041f, 0.013755f, -0.010306f, -0.008441f, 0.012418f, -0.001000f, -0.004039f, -0.006469f, -0.009425f, -0.012480f, -0.013269f, -0.003472f, -0.011318f, -0.006760f, -0.005904f, + 0.008921f, -0.000778f, 0.013311f, -0.019820f, -0.064922f, 0.048994f, -0.083106f, 0.058402f, -0.008380f, -0.037176f, -0.031723f, -0.035409f, -0.023982f, -0.018671f, 0.001776f, 0.042813f, -0.003478f, -0.035904f, 0.038123f, 0.054033f, -0.082948f, -0.022159f, 0.005772f, -0.006874f, -0.012952f, -0.004167f, -0.011522f, -0.014755f, -0.024125f, 0.030754f, -0.010807f, -0.023043f, -0.039480f, -0.039243f, 0.038629f, 0.010044f, -0.007093f, -0.004297f, 0.000015f, -0.008677f, -0.010545f, 0.008490f, -0.034737f, 0.018887f, 0.039485f, 0.029466f, 0.018375f, 0.037693f, 0.043870f, -0.025269f, 0.009328f, -0.036359f, 0.039244f, -0.022519f, -0.006492f, -0.000271f, -0.057319f, 0.018539f, 0.047132f, 0.007972f, -0.019426f, -0.015826f, 0.061628f, -0.024898f, -0.026669f, 0.017233f, -0.062943f, -0.007428f, -0.031245f, 0.001272f, -0.061548f, 0.025624f, 0.010644f, 0.025110f, -0.099841f, -0.085674f, 0.013944f, -0.029996f, -0.020113f, -0.012484f, -0.066885f, 0.022033f, -0.039564f, -0.043194f, 0.032464f, -0.029102f, -0.017174f, 0.013773f, -0.007054f, -0.013152f, -0.002458f, -0.003721f, 0.013942f, -0.033061f, -0.015605f, -0.031904f, + 0.000025f, -0.014079f, 0.006346f, -0.004666f, -0.025178f, -0.010418f, 0.008819f, -0.001749f, 0.001779f, 0.006601f, -0.027566f, 0.003395f, -0.034917f, 0.015948f, 0.005258f, -0.025443f, 0.008033f, -0.030241f, -0.006524f, -0.011154f, 0.002235f, 0.015829f, -0.011913f, 0.016382f, -0.008835f, 0.027984f, -0.012889f, 0.017532f, -0.009880f, -0.003267f, -0.000919f, -0.003565f, 0.005698f, -0.003054f, -0.000022f, -0.002454f, -0.006395f, -0.000095f, 0.010090f, -0.002978f, -0.004353f, -0.003674f, 0.003227f, -0.003738f, -0.003795f, -0.002860f, -0.001803f, 0.000700f, -0.001797f, -0.001400f, -0.001607f, -0.003624f, -0.001504f, 0.001738f, -0.000079f, 0.006110f, 0.073975f, -0.101856f, 0.104533f, 0.031038f, -0.003081f, 0.009055f, -0.074728f, 0.015996f, 0.035734f, -0.012739f, 0.089098f, -0.024780f, 0.038778f, -0.030724f, 0.098104f, -0.003003f, -0.012748f, -0.036829f, -0.013261f, 0.014797f, -0.009447f, 0.040164f, 0.031157f, -0.009835f, 0.003034f, -0.037866f, 0.015044f, 0.039798f, 0.040118f, -0.042723f, 0.018498f, -0.007999f, 0.042803f, -0.010938f, 0.027951f, -0.025065f, -0.019752f, -0.057168f, 0.004233f, -0.036014f, + -0.053725f, 0.077281f, -0.033716f, -0.006197f, -0.014330f, -0.017836f, 0.010657f, 0.006930f, 0.027392f, -0.012234f, 0.041928f, 0.004504f, 0.075873f, 0.029639f, 0.083952f, 0.071740f, -0.006876f, 0.048170f, 0.036550f, -0.011922f, 0.042955f, 0.058745f, -0.024778f, -0.057439f, 0.033234f, 0.022050f, 0.047690f, 0.025020f, -0.004526f, 0.000045f, -0.061940f, -0.005260f, -0.018168f, -0.021899f, 0.082691f, -0.008819f, -0.000820f, 0.103215f, 0.068676f, 0.037599f, 0.045899f, 0.024245f, 0.003003f, 0.012412f, 0.059572f, 0.001422f, -0.015552f, 0.018362f, 0.050057f, 0.024245f, 0.028549f, 0.014827f, 0.034642f, -0.001108f, 0.009993f, 0.013651f, 0.024260f, 0.009040f, 0.006174f, 0.005117f, 0.002763f, 0.020396f, 0.029470f, 0.013329f, 0.038942f, 0.003633f, 0.024036f, 0.024674f, 0.043898f, 0.000172f, 0.030050f, 0.027526f, 0.005700f, 0.023367f, 0.001252f, 0.005896f, -0.007431f, 0.010199f, 0.012206f, 0.006978f, 0.006321f, 0.002553f, -0.005249f, 0.002228f, 0.010276f, -0.004441f, 0.005581f, 0.020975f, -0.004400f, 0.031791f, -0.071480f, 0.137238f, -0.018617f, -0.015274f, -0.008751f, 0.099843f, + -0.061311f, 0.050075f, -0.067126f, 0.063600f, 0.012884f, -0.012418f, 0.001639f, 0.037243f, -0.015994f, 0.034719f, -0.016124f, -0.000331f, 0.070161f, 0.021485f, -0.017938f, -0.000307f, 0.017537f, 0.013717f, -0.068005f, 0.018088f, -0.024747f, -0.006255f, -0.035813f, 0.034580f, 0.033009f, 0.005027f, 0.015682f, 0.058436f, -0.019369f, -0.093354f, 0.022362f, 0.060885f, -0.023579f, -0.061466f, 0.016375f, 0.043521f, 0.014898f, -0.000186f, -0.073306f, -0.035464f, -0.043348f, 0.040535f, 0.016693f, 0.041748f, -0.088241f, 0.005342f, -0.016135f, -0.098019f, -0.025133f, 0.014007f, 0.044449f, 0.061140f, -0.032518f, 0.114511f, 0.022612f, 0.001562f, -0.023437f, -0.046837f, -0.031812f, 0.021186f, -0.052964f, 0.107844f, -0.034378f, 0.003928f, 0.064435f, -0.042777f, 0.039467f, -0.041818f, -0.023265f, 0.089296f, -0.045140f, 0.058325f, 0.054737f, 0.019104f, 0.025165f, -0.078536f, -0.008898f, -0.004788f, -0.026797f, 0.035937f, 0.033539f, 0.012672f, 0.010556f, 0.034911f, -0.007994f, 0.013127f, -0.003781f, 0.009838f, -0.014806f, 0.011807f, -0.002094f, 0.009816f, 0.008862f, 0.001459f, -0.025957f, -0.005479f, + 0.004255f, -0.010499f, -0.002509f, 0.017935f, 0.011153f, 0.030190f, -0.013503f, 0.005508f, -0.050430f, -0.044060f, -0.005491f, -0.003754f, 0.031192f, 0.021732f, -0.013752f, -0.011890f, -0.040011f, -0.001338f, 0.014872f, -0.007820f, 0.000770f, 0.008495f, -0.011998f, 0.007889f, -0.029210f, 0.000400f, -0.009206f, -0.013107f, 0.020762f, -0.080691f, 0.046035f, 0.029453f, 0.046044f, -0.018398f, -0.013105f, 0.018641f, 0.000111f, 0.005297f, 0.001700f, 0.009093f, 0.002152f, -0.012705f, 0.059563f, -0.013921f, -0.041112f, 0.017358f, -0.001108f, -0.036196f, 0.012568f, 0.008342f, 0.024564f, -0.016712f, -0.027405f, 0.029411f, -0.023699f, -0.003260f, -0.007081f, 0.024133f, -0.041705f, 0.014193f, -0.025885f, 0.021087f, -0.036743f, 0.013011f, -0.012343f, 0.006278f, 0.080437f, -0.055386f, 0.010457f, 0.017659f, -0.049912f, 0.018047f, 0.022959f, -0.037017f, -0.007734f, -0.014216f, 0.066894f, 0.005574f, -0.077442f, 0.046281f, -0.062607f, 0.011311f, 0.032362f, -0.030105f, 0.037022f, -0.044913f, -0.037004f, 0.050817f, -0.008686f, 0.021550f, -0.076300f, 0.014203f, 0.016457f, -0.004135f, -0.011795f, -0.000724f, + 0.030924f, 0.001076f, -0.101457f, 0.061350f, -0.006418f, 0.023502f, -0.026673f, -0.031113f, 0.096695f, -0.002679f, -0.061892f, 0.005254f, 0.031208f, 0.007030f, -0.094077f, 0.003236f, 0.087211f, -0.016085f, -0.040385f, 0.009439f, 0.042174f, -0.005756f, 0.000115f, -0.007551f, -0.004390f, 0.005911f, -0.015294f, -0.009051f, 0.028629f, -0.012578f, -0.000811f, -0.016997f, 0.016783f, 0.025432f, -0.004613f, -0.003987f, 0.027055f, 0.008723f, -0.018634f, -0.004579f, 0.011645f, 0.007660f, -0.015832f, 0.008322f, 0.018610f, -0.015704f, 0.003979f, 0.004509f, 0.011986f, -0.029106f, 0.001821f, 0.017989f, 0.006830f, -0.020334f, 0.001118f, 0.014110f, 0.002338f, -0.015138f, -0.010118f, 0.038158f, -0.013250f, -0.199444f, -0.424355f, -0.169316f, -0.319495f, -0.389120f, 0.137805f, -0.001597f, 0.141345f, 0.537615f, 0.469506f, 0.267086f, 0.514492f, 0.286862f, 0.032368f, 0.177750f, 0.109350f, -0.194681f, -0.137618f, -0.040588f, -0.215793f, -0.260956f, -0.086919f, -0.132190f, -0.206588f, -0.052003f, -0.009489f, -0.263034f, -0.181274f, -0.027586f, -0.159927f, -0.207016f, -0.060439f, -0.101679f, -0.225049f, -0.043341f, + 0.022736f, -0.126287f, -0.096336f, 0.094931f, -0.034386f, -0.135426f, 0.028219f, 0.089363f, -0.066905f, 0.054718f, 0.196772f, -0.029118f, -0.052722f, 0.194725f, 0.103870f, -0.048877f, 0.323533f, 0.439819f, 0.273695f, 0.463777f, 0.693863f, 0.533694f, 0.507882f, 0.742260f, 0.643457f, 0.473544f, 0.581050f, 0.528199f, 0.335954f, 0.297159f, 0.159864f, -0.055420f, -0.232052f, -0.415095f, -0.589653f, -0.701664f, -0.879748f, -0.939935f, -0.991156f, -1.122854f, -1.122060f, -0.848078f, -0.867799f, -0.790320f, -0.355994f, -0.275494f, -0.267950f, 0.118657f, 0.226578f, 0.004782f, 0.236157f, 0.327784f, 0.112149f, 0.156196f, 0.307401f, 0.229737f, 0.133736f, 0.216973f, 0.268660f, 0.114152f, 0.167238f, 0.333440f, 0.198278f, 0.130527f, 0.307283f, 0.230436f, 0.093025f, 0.199701f, 0.228157f, 0.029283f, 0.117815f, 0.274657f, 0.157462f, 0.188930f, 0.387213f, 0.364269f, 0.383872f, 0.497068f, 0.500559f, 0.401536f, 0.379795f, 0.324163f, 0.197938f, 0.142726f, 0.075936f, -0.011900f, -0.078181f, -0.211934f, -0.289544f, -0.391358f, -0.521464f, -0.580657f, -0.656066f, -0.763698f, -0.727281f, -0.653239f, + -0.576915f, -0.421855f, -0.276582f, -0.146732f, -0.054147f, 0.022660f, 0.048169f, 0.058921f, 0.076058f, 0.080560f, 0.068103f, 0.072660f, 0.080289f, 0.077719f, 0.087095f, 0.112465f, 0.126145f, 0.134377f, 0.149375f, 0.152491f, 0.150510f, 0.143710f, 0.107506f, 0.067336f, 0.043131f, 0.036376f, 0.036406f}, + {-0.013341f, 0.000386f, 0.010605f, 0.007285f, 0.007329f, 0.004608f, 0.002910f, -0.004182f, 0.000159f, -0.004759f, 0.011346f, 0.006942f, 0.002724f, 0.001640f, 0.001638f, -0.000144f, -0.003590f, 0.005569f, 0.007806f, 0.007499f, 0.004596f, -0.005719f, -0.008243f, -0.009028f, -0.008566f, -0.000908f, 0.004472f, -0.008827f, 0.007359f, -0.001783f, 0.012864f, -0.002154f, 0.008173f, 0.000098f, -0.010670f, 0.003043f, -0.001374f, 0.008621f, 0.000596f, -0.001019f, -0.004354f, -0.007319f, 0.000658f, 0.004115f, -0.009369f, -0.012821f, 0.008948f, -0.007431f, -0.006838f, -0.006465f, 0.005043f, -0.005102f, 0.002145f, -0.002287f, -0.000632f, -0.007555f, -0.002279f, -0.005143f, -0.007502f, 0.002461f, 0.005821f, -0.002171f, -0.008253f, -0.001619f, -0.001685f, -0.004149f, -0.007135f, -0.000558f, -0.005804f, -0.006841f, -0.001237f, 0.000466f, 0.001607f, -0.002322f, 0.001003f, -0.001272f, -0.009647f, -0.002134f, 0.001187f, -0.002670f, -0.002477f, -0.003030f, 0.003084f, -0.003699f, 0.003176f, -0.000267f, 0.000548f, 0.001217f, -0.002362f, 0.002317f, 0.000019f, -0.001293f, 0.000573f, -0.000636f, -0.002006f, 0.000325f, + 0.001500f, -0.001034f, -0.000878f, -0.000097f, 0.002425f, 0.001094f, 0.000340f, 0.000373f, 0.001307f, 0.000885f, 0.001519f, 0.000430f, 0.001955f, -0.001632f, -0.000720f, -0.000739f, 0.025123f, -0.008780f, -0.005748f, -0.007827f, -0.005378f, 0.000586f, -0.016812f, 0.002838f, -0.008341f, -0.016459f, -0.003517f, 0.014107f, -0.010146f, 0.002751f, -0.001198f, 0.004733f, 0.007126f, 0.007624f, 0.012322f, -0.002639f, -0.007061f, 0.003143f, 0.002976f, -0.005660f, -0.000818f, -0.003825f, -0.002489f, 0.001515f, -0.006469f, -0.004044f, -0.000941f, -0.008144f, -0.009559f, 0.004884f, 0.007390f, -0.004383f, -0.010985f, -0.001926f, -0.002576f, 0.001555f, 0.008875f, 0.000587f, -0.003677f, -0.000591f, 0.011882f, 0.001481f, -0.007271f, -0.007011f, 0.003076f, 0.002250f, 0.009484f, 0.005385f, -0.000622f, -0.009055f, 0.000507f, -0.000533f, 0.007784f, -0.008334f, -0.002799f, 0.004578f, 0.009047f, -0.002551f, 0.000804f, -0.006853f, -0.003848f, 0.004200f, 0.000261f, 0.000885f, 0.002457f, -0.002665f, 0.003295f, 0.000976f, 0.004031f, 0.002479f, 0.001559f, 0.015729f, 0.004819f, -0.000645f, -0.002120f, -0.004637f, + 0.006746f, 0.004185f, 0.007291f, 0.005192f, 0.001830f, 0.001933f, -0.001522f, 0.001444f, -0.002945f, -0.003146f, -0.002414f, 0.000826f, -0.001113f, -0.000770f, -0.000476f, 0.002538f, 0.000421f, 0.003317f, 0.000314f, -0.001051f, -0.000414f, -0.000318f, -0.000458f, 0.001081f, 0.000780f, 0.001341f, -0.018430f, -0.004322f, -0.008691f, 0.008456f, 0.002150f, 0.000218f, 0.006018f, -0.003550f, -0.014243f, -0.007501f, 0.009489f, -0.000500f, 0.009775f, -0.000708f, -0.005508f, 0.010836f, 0.004081f, 0.023732f, -0.004446f, 0.010315f, 0.001520f, -0.011151f, 0.002832f, -0.009468f, 0.006164f, 0.002198f, 0.002437f, -0.010119f, 0.005094f, -0.001745f, -0.003564f, 0.004184f, 0.016163f, 0.006025f, -0.000072f, -0.012931f, 0.011254f, -0.002344f, 0.000071f, 0.007972f, -0.011763f, -0.002180f, 0.008149f, -0.004796f, -0.004184f, -0.013278f, -0.014505f, -0.001082f, 0.008820f, 0.005204f, -0.005806f, -0.000138f, 0.005753f, 0.007204f, 0.002881f, -0.001452f, -0.002777f, -0.012722f, 0.006016f, 0.015879f, 0.007232f, -0.004551f, -0.002216f, 0.005041f, 0.007586f, -0.000574f, -0.002342f, 0.001909f, -0.010470f, -0.001923f, + -0.007332f, -0.003415f, -0.000661f, -0.004495f, 0.012103f, 0.010554f, -0.003128f, 0.005305f, 0.003930f, -0.001998f, -0.007122f, 0.001699f, -0.005509f, -0.002076f, 0.001648f, -0.007110f, -0.001505f, 0.000727f, -0.002054f, 0.002041f, 0.003065f, -0.004544f, -0.001621f, -0.000289f, 0.000322f, -0.003563f, 0.000957f, -0.001643f, 0.002705f, -0.003159f, 0.002988f, -0.002157f, 0.000728f, 0.000498f, -0.001537f, 0.001210f, 0.000542f, -0.001145f, 0.001054f, 0.001178f, 0.001215f, -0.002343f, -0.001097f, 0.000058f, -0.003325f, 0.000446f, 0.001981f, -0.000653f, -0.013862f, 0.015490f, -0.013345f, 0.014146f, -0.000130f, -0.011274f, -0.026595f, -0.010471f, -0.007631f, 0.003990f, 0.013947f, 0.010920f, -0.003353f, -0.002130f, -0.003237f, -0.007622f, -0.002192f, -0.008566f, 0.002947f, 0.003166f, 0.005291f, 0.008779f, 0.005207f, 0.016786f, 0.000061f, 0.003401f, -0.005899f, -0.001368f, -0.003991f, 0.006179f, 0.001876f, -0.007786f, -0.011274f, 0.000482f, -0.008090f, 0.001035f, 0.007685f, -0.012751f, 0.009016f, -0.021467f, -0.005895f, -0.015917f, 0.002752f, -0.000957f, 0.000299f, -0.006222f, -0.008394f, 0.003007f, + 0.007651f, 0.005488f, 0.002051f, -0.012780f, 0.003948f, -0.008816f, -0.003328f, -0.002507f, -0.017414f, -0.006780f, 0.005276f, 0.006791f, -0.000551f, -0.011984f, 0.002123f, 0.004610f, -0.002272f, -0.002344f, 0.001499f, 0.010520f, 0.003818f, -0.002299f, -0.003301f, 0.001900f, -0.024824f, 0.001848f, 0.006371f, 0.005980f, 0.017598f, 0.002487f, -0.009769f, 0.011077f, -0.003792f, 0.001719f, 0.003939f, 0.003712f, -0.002472f, -0.008135f, 0.000529f, 0.004876f, 0.004664f, 0.007515f, -0.002271f, -0.002383f, 0.001369f, -0.001363f, -0.000877f, 0.001245f, -0.002058f, 0.000758f, 0.001774f, -0.000968f, -0.003941f, -0.003017f, -0.000093f, 0.000525f, 0.001114f, -0.001866f, 0.003855f, -0.001927f, -0.001034f, 0.002499f, 0.002916f, -0.000783f, -0.004374f, -0.002285f, 0.001827f, -0.002206f, -0.001150f, -0.001322f, 0.001012f, 0.003501f, -0.000584f, 0.017713f, -0.004584f, 0.000185f, 0.011663f, -0.006120f, -0.005722f, 0.017473f, -0.013432f, -0.031690f, -0.020821f, -0.012294f, 0.018932f, 0.008017f, 0.002565f, -0.018384f, 0.019319f, -0.008430f, 0.005369f, -0.005087f, 0.007548f, 0.009264f, -0.000834f, 0.000170f, + -0.000239f, -0.003220f, -0.010090f, -0.008154f, -0.002529f, 0.000985f, 0.008735f, 0.004919f, 0.013682f, 0.006496f, -0.006067f, -0.003272f, 0.012171f, -0.008882f, 0.014949f, -0.012083f, 0.003163f, 0.006523f, 0.004191f, -0.009813f, 0.013170f, -0.001362f, 0.014156f, 0.018673f, 0.002807f, -0.007561f, -0.007328f, 0.007851f, -0.009081f, -0.019120f, -0.004976f, 0.003926f, -0.012288f, 0.006901f, 0.005595f, -0.004134f, -0.007664f, -0.003319f, -0.002969f, 0.003590f, -0.001530f, -0.010802f, -0.004143f, 0.018443f, 0.014832f, 0.007937f, -0.022122f, -0.021752f, -0.011897f, 0.020716f, 0.010488f, -0.001714f, 0.002848f, -0.010341f, 0.013093f, -0.000674f, -0.010268f, -0.003635f, 0.001315f, -0.001093f, -0.005169f, -0.000832f, -0.004103f, -0.002232f, 0.003848f, 0.005653f, -0.003402f, -0.000142f, 0.000471f, 0.000882f, 0.000783f, -0.005781f, 0.006511f, -0.000537f, -0.006550f, -0.003933f, -0.000943f, -0.002107f, 0.000074f, -0.000555f, -0.000853f, -0.000760f, 0.001518f, 0.000246f, -0.003039f, -0.000272f, 0.001119f, -0.000808f, -0.004700f, -0.003247f, -0.004388f, -0.001598f, 0.003076f, 0.008917f, 0.013132f, -0.000735f, + 0.005062f, -0.020670f, -0.006977f, 0.003375f, 0.007069f, -0.025635f, -0.002839f, 0.011024f, -0.007722f, -0.016683f, 0.010388f, -0.019404f, -0.014229f, -0.007701f, 0.001695f, -0.007054f, -0.004788f, -0.000645f, 0.014413f, -0.012262f, 0.003197f, -0.003900f, -0.005093f, -0.010326f, -0.002849f, -0.015067f, -0.004486f, -0.000467f, 0.002870f, -0.010543f, -0.002224f, -0.006661f, 0.000953f, -0.003412f, -0.004670f, 0.002737f, 0.011858f, 0.002988f, -0.006183f, 0.005868f, -0.009058f, -0.002278f, 0.003469f, -0.003476f, 0.005908f, -0.001959f, -0.000669f, -0.041774f, 0.002770f, -0.014500f, 0.007065f, 0.006007f, 0.009221f, -0.023007f, -0.023440f, 0.003132f, 0.000818f, 0.005443f, 0.000153f, 0.012460f, -0.005067f, 0.006758f, 0.008409f, -0.004040f, 0.019614f, -0.006170f, -0.012773f, -0.002755f, -0.010573f, -0.000400f, -0.020918f, 0.000276f, 0.010346f, 0.004815f, 0.015612f, -0.004360f, -0.004275f, 0.006862f, -0.008258f, 0.001922f, 0.005080f, 0.010046f, -0.005402f, 0.005749f, -0.008196f, 0.001589f, 0.000322f, 0.001052f, -0.004042f, -0.001957f, -0.003014f, 0.003183f, -0.003749f, -0.005989f, -0.000126f, -0.002845f, + -0.003726f, -0.001371f, -0.002920f, -0.001306f, -0.001838f, 0.001670f, -0.002921f, 0.001657f, -0.005894f, -0.000663f, -0.003529f, -0.001531f, 0.000470f, 0.000361f, -0.000838f, -0.002852f, 0.000257f, 0.016164f, -0.032600f, 0.008728f, 0.001390f, 0.009048f, 0.013122f, 0.002376f, -0.012646f, -0.027773f, 0.001978f, -0.011230f, 0.021091f, -0.008592f, 0.004351f, 0.001530f, 0.004505f, 0.015910f, -0.007030f, -0.000491f, -0.007384f, -0.004163f, 0.004156f, -0.004018f, 0.014930f, 0.011119f, 0.003189f, -0.003170f, 0.000205f, 0.009994f, -0.001030f, 0.004824f, -0.000231f, -0.008241f, 0.007283f, -0.002119f, -0.006172f, 0.008827f, 0.014953f, 0.000041f, 0.005846f, 0.001047f, -0.009924f, -0.006189f, 0.018157f, -0.008771f, 0.008684f, 0.013226f, -0.017550f, 0.012518f, 0.006693f, 0.006355f, -0.007793f, 0.012837f, 0.003695f, -0.002219f, 0.016417f, 0.000607f, -0.000205f, -0.007695f, -0.004388f, -0.000008f, -0.007192f, -0.017564f, -0.004631f, 0.017939f, 0.013520f, 0.014759f, -0.001659f, -0.015565f, 0.006448f, 0.018819f, -0.003526f, -0.013327f, -0.000695f, -0.009416f, -0.002431f, -0.001563f, 0.014640f, -0.001404f, + 0.007509f, -0.001928f, 0.000666f, -0.010330f, 0.002715f, -0.001778f, 0.004035f, 0.004014f, -0.007133f, 0.004833f, -0.011280f, 0.001109f, 0.004038f, 0.000296f, -0.002925f, -0.000194f, 0.002216f, -0.007805f, -0.001460f, -0.007345f, 0.002267f, -0.004644f, -0.002943f, -0.004500f, -0.007555f, -0.004970f, -0.001952f, 0.001090f, -0.002329f, -0.000184f, 0.002364f, 0.000798f, -0.001993f, -0.001400f, -0.002280f, 0.004321f, 0.000124f, 0.001561f, 0.002780f, 0.001740f, 0.001949f, -0.001010f, 0.003668f, -0.000560f, 0.000065f, 0.001536f, -0.001469f, -0.002029f, 0.000946f, 0.003891f, -0.015481f, -0.004569f, -0.024958f, -0.007300f, -0.014479f, -0.017072f, -0.016188f, -0.005737f, 0.021767f, 0.023687f, 0.032637f, 0.007295f, -0.012461f, -0.007670f, 0.027013f, -0.000107f, -0.006309f, 0.020694f, -0.002177f, 0.000897f, -0.032352f, 0.014620f, 0.008125f, -0.021589f, 0.029895f, -0.004174f, 0.013423f, -0.003639f, 0.007011f, 0.013286f, 0.000015f, 0.023494f, 0.008997f, 0.006661f, -0.002737f, -0.008344f, 0.002240f, 0.014230f, -0.003836f, 0.004220f, 0.006654f, 0.018849f, -0.000899f, -0.005718f, 0.012141f, -0.014292f, + -0.008990f, 0.006448f, 0.020799f, -0.009239f, -0.011175f, -0.003533f, 0.017137f, 0.000145f, 0.002409f, -0.006420f, -0.002947f, 0.006143f, 0.009031f, 0.000789f, -0.007417f, -0.023737f, 0.002798f, 0.006978f, 0.022571f, 0.006552f, -0.001838f, 0.017336f, 0.030984f, -0.006397f, 0.010845f, 0.007305f, 0.012828f, -0.002511f, -0.010916f, 0.006377f, -0.025717f, -0.007001f, -0.003913f, -0.008349f, -0.005213f, 0.013370f, 0.004603f, -0.016651f, -0.009835f, 0.000463f, -0.005450f, -0.000607f, -0.012749f, -0.000400f, -0.004379f, -0.003220f, -0.001767f, 0.001267f, -0.003563f, -0.000898f, -0.001746f, 0.002715f, -0.001015f, 0.002490f, -0.003496f, -0.000116f, 0.000523f, 0.001147f, 0.005151f, 0.000144f, -0.001997f, 0.004811f, 0.007035f, -0.000576f, -0.004339f, -0.002742f, -0.006106f, -0.005339f, 0.007305f, -0.001255f, 0.001962f, 0.002671f, 0.002580f, 0.002411f, -0.005624f, 0.002731f, -0.002050f, -0.028256f, 0.039568f, -0.019949f, 0.008983f, -0.001465f, -0.013648f, 0.030160f, 0.007102f, 0.003743f, -0.031879f, 0.008274f, -0.012715f, -0.014510f, 0.003542f, -0.014163f, 0.016128f, 0.009761f, -0.002711f, 0.003233f, + -0.007811f, -0.003528f, -0.011585f, -0.007449f, -0.013914f, -0.021486f, -0.005294f, -0.015034f, -0.004036f, 0.008180f, -0.006076f, -0.008093f, 0.017015f, 0.010693f, 0.017077f, -0.014001f, -0.001579f, -0.002813f, -0.015381f, 0.000152f, -0.008178f, -0.038290f, 0.003353f, 0.000692f, -0.005921f, 0.013286f, -0.001387f, 0.014657f, 0.012418f, 0.004583f, 0.023038f, 0.020497f, -0.020239f, -0.005548f, 0.000170f, -0.000748f, 0.007205f, 0.002756f, 0.019588f, -0.004183f, 0.031286f, -0.000042f, -0.018449f, -0.014973f, 0.002396f, 0.005646f, 0.006401f, 0.022741f, 0.005975f, 0.005693f, 0.021378f, 0.028466f, 0.001166f, -0.017465f, -0.016540f, -0.001566f, -0.005549f, -0.004035f, 0.036778f, 0.002637f, -0.016704f, 0.011949f, -0.014625f, 0.013982f, 0.002309f, -0.002903f, -0.004373f, -0.011236f, 0.003128f, 0.003719f, -0.001665f, 0.003288f, 0.006204f, 0.003453f, 0.004228f, -0.001652f, -0.001563f, 0.000406f, -0.002056f, -0.001734f, 0.004169f, 0.001647f, 0.002958f, 0.003719f, 0.006593f, 0.000373f, -0.003096f, 0.006136f, 0.003490f, 0.001184f, 0.001403f, -0.001272f, 0.000932f, -0.000234f, 0.006567f, 0.010247f, + -0.005533f, 0.004889f, -0.001213f, 0.004261f, 0.000554f, 0.000908f, 0.008741f, -0.000456f, 0.000847f, 0.000750f, 0.007181f, 0.004766f, 0.005254f, 0.023736f, 0.001819f, 0.015996f, -0.017510f, 0.007829f, 0.001401f, -0.001303f, 0.010564f, 0.025098f, -0.006928f, -0.002285f, 0.023108f, -0.030569f, -0.017040f, -0.013354f, -0.035016f, 0.006872f, -0.011109f, -0.004941f, 0.004198f, -0.023904f, 0.026177f, 0.019738f, 0.027806f, 0.012468f, -0.017323f, 0.001624f, 0.001103f, 0.020796f, -0.003856f, -0.000688f, -0.000819f, -0.012941f, 0.001029f, -0.007620f, 0.011626f, -0.013731f, -0.005194f, -0.004648f, -0.005936f, -0.016081f, 0.007545f, -0.023574f, -0.003603f, -0.001688f, 0.014785f, 0.008728f, 0.001964f, 0.000223f, -0.004132f, 0.001691f, 0.000219f, 0.012246f, 0.002837f, 0.003528f, -0.001968f, -0.036898f, -0.017147f, 0.004242f, 0.015276f, 0.018286f, -0.028885f, 0.019293f, 0.005733f, -0.011407f, 0.002777f, 0.006220f, -0.006847f, 0.027946f, 0.000260f, 0.005334f, -0.006599f, -0.039012f, -0.013372f, -0.017783f, -0.004623f, 0.000688f, -0.010816f, 0.005582f, 0.008301f, -0.008032f, -0.001672f, 0.025043f, + 0.000708f, 0.012748f, -0.015373f, 0.001919f, -0.000250f, 0.014404f, 0.012745f, 0.009161f, -0.003471f, 0.002960f, 0.010465f, 0.006337f, -0.000461f, 0.011013f, 0.010709f, 0.011695f, 0.001523f, 0.004450f, 0.004018f, 0.001890f, -0.001517f, -0.001515f, 0.010120f, 0.001894f, -0.005337f, 0.000892f, -0.000776f, 0.005559f, -0.003883f, 0.001759f, 0.005280f, -0.004122f, 0.008207f, 0.002831f, -0.001121f, 0.000676f, -0.007084f, 0.005206f, 0.005262f, -0.000856f, -0.001571f, -0.004351f, -0.005867f, 0.036123f, 0.005741f, 0.014591f, -0.021786f, -0.019727f, 0.011316f, 0.018740f, 0.002178f, -0.006655f, 0.034665f, 0.010894f, 0.000116f, -0.009627f, 0.007527f, -0.002709f, -0.003862f, -0.001313f, -0.005990f, 0.001598f, -0.011567f, -0.027533f, 0.009039f, 0.002807f, 0.008361f, 0.002710f, 0.015265f, 0.004634f, -0.016486f, -0.033515f, 0.000848f, 0.002484f, -0.002716f, -0.029333f, -0.014328f, -0.004434f, 0.008187f, -0.006424f, 0.003260f, -0.025663f, 0.001227f, -0.005754f, 0.000143f, 0.002543f, 0.007096f, -0.002793f, -0.024145f, -0.022218f, -0.013847f, 0.009291f, 0.006870f, -0.005944f, -0.005029f, -0.038712f, + -0.021908f, -0.000815f, -0.037740f, 0.034685f, -0.035634f, -0.009820f, -0.023080f, 0.037201f, 0.011921f, -0.026272f, 0.013173f, -0.003085f, 0.014058f, -0.022393f, -0.007422f, 0.000932f, 0.015128f, -0.021263f, -0.008505f, -0.007258f, -0.021595f, 0.001486f, 0.014312f, -0.002750f, -0.003982f, 0.025766f, -0.040925f, 0.032163f, -0.005363f, 0.006755f, -0.018468f, 0.012897f, -0.002092f, 0.010264f, -0.009381f, 0.000473f, 0.008158f, 0.008839f, -0.002582f, -0.004536f, 0.000027f, 0.000856f, 0.001052f, -0.003067f, 0.010061f, 0.010526f, 0.007449f, 0.001887f, 0.007552f, -0.000783f, 0.009289f, -0.003498f, 0.001690f, -0.000471f, -0.003525f, -0.003657f, 0.000625f, -0.007755f, -0.009315f, -0.002773f, -0.000595f, 0.009342f, -0.000585f, -0.001618f, -0.002593f, -0.006574f, 0.004559f, -0.002167f, -0.003410f, -0.002418f, 0.004841f, -0.001112f, -0.010557f, -0.001501f, 0.003734f, 0.000799f, -0.001018f, 0.031729f, 0.069527f, -0.009465f, -0.021817f, -0.020451f, -0.018064f, -0.025876f, 0.004155f, -0.043980f, -0.000491f, -0.034027f, -0.015787f, 0.010339f, 0.021179f, 0.012094f, -0.015375f, -0.002213f, 0.020140f, -0.001508f, + 0.023261f, -0.014048f, -0.014179f, -0.012528f, 0.010908f, -0.008297f, -0.010787f, 0.003626f, -0.012910f, -0.013153f, 0.015727f, 0.037299f, 0.013998f, 0.015883f, 0.006963f, -0.022156f, -0.005351f, -0.018002f, -0.017032f, -0.002807f, -0.003195f, -0.014173f, -0.022635f, -0.045317f, -0.004364f, -0.016530f, 0.005712f, -0.008470f, 0.016787f, 0.015580f, 0.008764f, 0.016313f, 0.011412f, -0.001857f, 0.031502f, 0.045044f, 0.010645f, -0.053005f, 0.010612f, -0.009593f, -0.031128f, 0.004198f, 0.014979f, 0.007405f, 0.001186f, 0.014418f, -0.001036f, -0.025312f, 0.001372f, 0.011835f, -0.025427f, -0.013376f, -0.023837f, -0.043977f, 0.034349f, 0.004668f, -0.002740f, 0.023997f, 0.018636f, 0.001242f, 0.001213f, 0.023719f, -0.032560f, -0.014188f, 0.003455f, 0.017474f, 0.014652f, 0.022492f, 0.016090f, -0.013434f, -0.007921f, -0.003037f, -0.005320f, -0.002008f, -0.003419f, -0.006556f, -0.008671f, -0.013238f, -0.013452f, -0.009561f, -0.005256f, -0.001484f, 0.006355f, -0.003640f, -0.002878f, -0.015149f, -0.010513f, 0.001510f, 0.007735f, 0.005408f, 0.003074f, 0.003139f, 0.002069f, -0.002170f, -0.007908f, -0.003795f, + -0.005010f, -0.004326f, 0.001296f, -0.008351f, 0.001519f, -0.005965f, 0.006098f, -0.000750f, -0.002384f, -0.005713f, 0.005004f, -0.005256f, -0.001867f, 0.010446f, -0.004537f, -0.000360f, 0.051348f, -0.037997f, 0.044387f, -0.003705f, -0.005311f, -0.022575f, -0.008329f, -0.022427f, -0.019053f, 0.023718f, -0.021066f, 0.012269f, 0.053233f, 0.019803f, -0.007863f, -0.023998f, -0.020137f, 0.023757f, -0.019380f, -0.032822f, -0.013502f, 0.003390f, 0.003165f, -0.037474f, 0.002690f, -0.011352f, 0.019589f, -0.011822f, -0.000516f, 0.004373f, 0.055984f, -0.013504f, -0.017836f, 0.027170f, -0.021567f, 0.032634f, -0.019027f, 0.023904f, 0.004043f, -0.017216f, -0.015742f, 0.030338f, -0.039103f, 0.029849f, -0.016834f, 0.003089f, -0.009334f, 0.016322f, -0.013501f, -0.006881f, -0.000498f, -0.012025f, 0.057098f, -0.016376f, 0.038973f, 0.015140f, 0.017889f, -0.000244f, 0.014764f, 0.025014f, 0.028019f, -0.007654f, -0.027131f, 0.000174f, 0.023137f, 0.009340f, -0.004108f, -0.034127f, 0.045676f, -0.009534f, -0.030207f, -0.008350f, -0.018525f, 0.014311f, 0.019718f, 0.000825f, 0.033055f, -0.008911f, 0.016951f, -0.037542f, + -0.006646f, -0.040060f, -0.012492f, -0.014642f, -0.000922f, 0.002249f, -0.007742f, 0.014335f, 0.004685f, -0.010795f, -0.018467f, -0.013670f, -0.003988f, -0.001690f, -0.009269f, -0.001966f, -0.003297f, 0.011344f, -0.003377f, 0.000505f, -0.004318f, -0.017334f, -0.005275f, -0.006954f, 0.002103f, -0.002869f, -0.009777f, -0.015139f, 0.005977f, -0.010227f, 0.004702f, 0.006752f, -0.010643f, -0.025965f, -0.006244f, -0.004053f, -0.006970f, -0.009254f, 0.001022f, -0.004317f, 0.002754f, 0.003067f, -0.011850f, -0.001512f, -0.011931f, 0.011043f, 0.006719f, -0.006216f, 0.002931f, -0.010380f, -0.058193f, -0.024833f, 0.035736f, -0.007037f, -0.014601f, 0.041536f, 0.004007f, -0.021536f, 0.015776f, 0.022627f, 0.019200f, 0.003029f, -0.035782f, -0.014760f, 0.005511f, 0.005330f, 0.018764f, 0.012432f, 0.021162f, -0.018252f, -0.014402f, 0.007139f, -0.004921f, 0.017361f, -0.033629f, -0.005650f, -0.036378f, -0.011727f, 0.006650f, -0.004969f, -0.004518f, 0.039029f, 0.008179f, -0.028833f, -0.004321f, 0.002371f, -0.029452f, -0.003950f, 0.001514f, 0.017790f, 0.044887f, -0.015858f, 0.015053f, -0.024969f, 0.003839f, -0.014674f, + -0.018875f, 0.018309f, 0.039269f, -0.031026f, 0.003076f, 0.034955f, -0.015696f, -0.003190f, -0.013034f, 0.022887f, 0.005587f, -0.028361f, -0.000276f, -0.009893f, -0.009143f, -0.002802f, -0.013877f, 0.021176f, -0.050128f, 0.010653f, 0.004278f, -0.021094f, 0.028192f, 0.043141f, 0.030518f, 0.082164f, 0.024986f, -0.021058f, -0.029107f, -0.024109f, -0.013100f, 0.030167f, -0.010809f, 0.041886f, 0.003913f, 0.051002f, -0.060542f, -0.038869f, 0.018325f, -0.009956f, -0.006206f, 0.024461f, -0.016446f, -0.001882f, 0.026079f, 0.011592f, 0.019362f, 0.028495f, 0.022325f, -0.004832f, 0.009151f, -0.017439f, 0.000684f, -0.000684f, -0.012179f, -0.013400f, 0.008976f, -0.018461f, -0.001521f, 0.027879f, 0.002597f, -0.016675f, -0.021702f, 0.004023f, -0.027282f, -0.010087f, 0.029462f, 0.015258f, -0.004763f, -0.006765f, 0.005711f, -0.005483f, -0.009234f, 0.001947f, -0.006730f, -0.010491f, -0.001753f, -0.014396f, 0.010201f, 0.008784f, 0.009770f, -0.005381f, -0.003791f, 0.006183f, 0.015079f, 0.041146f, -0.095427f, -0.003508f, 0.054885f, -0.072428f, -0.003005f, 0.014607f, -0.074822f, 0.033936f, 0.009474f, 0.060509f, + -0.005702f, 0.021574f, 0.018071f, -0.065814f, -0.054424f, -0.021022f, -0.004985f, -0.032798f, -0.040371f, -0.021236f, 0.037922f, 0.026653f, 0.023103f, 0.002716f, 0.004561f, 0.012164f, 0.002656f, -0.047715f, -0.017644f, -0.061335f, -0.019361f, 0.034731f, 0.010577f, 0.023552f, 0.077815f, 0.020429f, 0.029611f, -0.000947f, 0.015836f, 0.068520f, 0.051652f, 0.014583f, 0.034003f, 0.031181f, 0.068425f, 0.056214f, -0.073863f, 0.046733f, -0.003813f, 0.044734f, 0.045599f, 0.019122f, 0.082088f, 0.072486f, -0.039451f, 0.036007f, -0.000156f, 0.034326f, -0.059365f, 0.006087f, 0.006825f, 0.002497f, -0.013142f, 0.038117f, 0.041363f, -0.039441f, -0.013056f, -0.023061f, 0.014795f, -0.032655f, -0.040479f, 0.038674f, 0.065919f, 0.024298f, 0.068589f, -0.019403f, 0.093060f, 0.090982f, 0.025767f, 0.047828f, -0.013484f, -0.023581f, 0.021739f, 0.021283f, 0.010593f, 0.007444f, 0.005967f, 0.012460f, -0.012519f, -0.023180f, -0.016359f, -0.043737f, -0.045690f, -0.018386f, 0.021889f, -0.000372f, 0.019351f, 0.003545f, 0.011945f, 0.028202f, 0.034743f, -0.010921f, 0.016159f, -0.001465f, -0.013788f, -0.011590f, + -0.009683f, -0.028774f, -0.012908f, 0.000635f, -0.024623f, -0.008709f, -0.022120f, -0.012310f, 0.005293f, 0.031643f, -0.014429f, 0.011474f, 0.009320f, -0.005196f, 0.017826f, 0.010277f, 0.013715f, 0.000484f, 0.023539f, 0.014925f, 0.010510f, -0.009155f, -0.013547f, -0.030390f, 0.044622f, 0.080134f, -0.010712f, -0.109075f, -0.034666f, 0.011269f, -0.008291f, -0.017995f, -0.023721f, 0.000485f, -0.062209f, -0.037355f, -0.051593f, -0.008269f, -0.014857f, 0.017400f, -0.036718f, -0.010551f, 0.010319f, 0.017444f, -0.000081f, 0.019390f, 0.038115f, 0.007880f, 0.054844f, -0.035015f, 0.013522f, 0.002252f, 0.052368f, 0.013683f, -0.009759f, -0.052291f, 0.035226f, -0.008974f, 0.047855f, -0.039772f, -0.031132f, -0.030127f, -0.015586f, -0.048208f, -0.006130f, -0.008325f, -0.044878f, 0.025024f, 0.052235f, -0.024994f, 0.008222f, -0.067113f, 0.065112f, -0.020347f, -0.034547f, 0.029480f, 0.026388f, -0.038375f, 0.003983f, -0.023912f, 0.009100f, -0.017510f, 0.081453f, -0.002958f, -0.006239f, -0.019885f, 0.143307f, 0.003679f, -0.018630f, 0.061135f, 0.049789f, -0.051784f, 0.041213f, -0.063455f, -0.034508f, -0.066316f, + 0.051490f, -0.045633f, 0.025283f, 0.034868f, 0.028587f, -0.058802f, 0.075094f, -0.013387f, -0.096361f, -0.110890f, -0.042808f, -0.013652f, -0.031305f, 0.025842f, 0.026391f, 0.043859f, 0.008134f, 0.003811f, -0.032013f, 0.033122f, 0.052977f, 0.076220f, 0.021076f, -0.021889f, 0.008430f, 0.064840f, 0.011835f, -0.035868f, -0.007815f, 0.069182f, 0.016947f, -0.041023f, -0.009532f, 0.034096f, 0.020861f, 0.031030f, 0.022079f, 0.043749f, 0.001519f, 0.023973f, 0.009741f, 0.030906f, 0.015899f, 0.049202f, 0.017631f, 0.031018f, -0.004853f, 0.009607f, 0.003611f, -0.003869f, 0.014468f, -0.004592f, 0.018414f, 0.030536f, 0.006044f, 0.017622f, 0.003685f, 0.022964f, -0.051074f, -0.012480f, 0.042032f, -0.030672f, -0.146775f, 0.010583f, 0.094488f, -0.056947f, -0.037935f, 0.075884f, -0.055048f, -0.003500f, -0.015558f, 0.072832f, -0.124836f, 0.069923f, 0.041571f, -0.035189f, 0.013164f, 0.068307f, 0.048853f, -0.023831f, 0.028014f, 0.012580f, -0.018902f, 0.032151f, -0.000552f, 0.019513f, 0.029679f, -0.012547f, 0.007285f, -0.003139f, 0.014241f, -0.018035f, -0.014399f, -0.001115f, 0.025512f, -0.074052f, + -0.036510f, 0.036888f, -0.008150f, -0.049092f, -0.057846f, 0.010079f, 0.072377f, -0.031292f, -0.045936f, 0.035526f, 0.054045f, -0.011754f, 0.013739f, -0.009494f, 0.050363f, -0.027221f, 0.075420f, -0.010153f, 0.000355f, 0.041232f, 0.001091f, 0.009505f, -0.053201f, 0.083971f, -0.043174f, -0.052566f, 0.040099f, -0.055664f, -0.018168f, 0.009418f, 0.028004f, 0.077576f, -0.027282f, 0.048372f, -0.009607f, 0.025324f, -0.131128f, -0.100487f, -0.018203f, -0.039171f, 0.020322f, 0.018156f, 0.050145f, -0.007874f, -0.010188f, 0.059497f, -0.064882f, -0.001445f, 0.041953f, 0.041157f, -0.014874f, 0.045855f, 0.006073f, -0.009774f, 0.000067f, -0.010184f, 0.044227f, -0.024409f, -0.002185f, 0.042804f, 0.010156f, -0.009716f, 0.017206f, -0.021270f, 0.005820f, -0.001630f, 0.001079f, 0.017290f, 0.008450f, -0.024337f, -0.005205f, 0.007519f, -0.018556f, -0.027789f, -0.000002f, 0.020296f, 0.036106f, -0.030181f, 0.035296f, 0.011919f, -0.034487f, 0.028902f, 0.033525f, -0.016714f, -0.039099f, 0.036301f, -0.017627f, 0.006664f, 0.020441f, -0.019950f, -0.051888f, 0.017066f, 0.014519f, -0.029010f, -0.026921f, 0.001980f, + 0.020242f, -0.023035f, -0.011015f, -0.049379f, -0.023382f, 0.035541f, -0.061493f, 0.059442f, -0.052419f, -0.065647f, 0.036511f, -0.031950f, -0.021729f, 0.037314f, -0.028746f, 0.031095f, -0.022696f, 0.014233f, 0.073090f, -0.066217f, -0.005200f, -0.010488f, 0.061492f, 0.007923f, 0.005377f, -0.059332f, -0.055746f, -0.020106f, -0.016628f, -0.009058f, -0.018309f, 0.010462f, 0.002737f, -0.006498f, 0.008676f, 0.012806f, 0.005871f, 0.009833f, -0.011870f, 0.028477f, -0.019302f, 0.027227f, -0.052877f, 0.001373f, -0.042934f, -0.055491f, -0.032949f, 0.072650f, -0.032039f, -0.032665f, -0.024434f, 0.016319f, -0.015097f, 0.032058f, 0.046896f, -0.050248f, 0.044023f, 0.007478f, -0.069301f, -0.034950f, 0.141641f, 0.073237f, -0.108290f, -0.020797f, 0.067930f, -0.035230f, -0.039868f, 0.027044f, -0.034532f, -0.074987f, 0.052933f, 0.023870f, -0.101813f, 0.041177f, 0.050775f, -0.060074f, -0.039860f, 0.059933f, -0.015347f, -0.046012f, 0.009835f, 0.029468f, -0.073950f, 0.013361f, 0.012401f, 0.020564f, -0.056594f, -0.017233f, -0.005459f, -0.018526f, -0.004464f, 0.003063f, 0.005616f, -0.034871f, 0.004777f, 0.050016f, + 0.016899f, 0.002585f, 0.016029f, -0.001496f, -0.009059f, -0.028433f, -0.009300f, -0.015683f, -0.021121f, -0.048266f, 0.012008f, -0.027822f, -0.008263f, 0.057833f, -0.052440f, -0.034444f, 0.042357f, -0.031798f, -0.012065f, -0.014135f, 0.018661f, -0.034403f, -0.013031f, 0.053248f, 0.027769f, -0.026980f, 0.029512f, 0.016328f, -0.023251f, -0.014911f, 0.072561f, -0.059271f, -0.046371f, 0.077415f, -0.001254f, -0.062988f, 0.007716f, 0.037755f, -0.037743f, -0.078496f, 0.051079f, 0.005722f, -0.087150f, 0.014139f, 0.023208f, -0.063733f, -0.002239f, 0.041597f, -0.012684f, -0.028767f, 0.021366f, 0.016959f, -0.044307f, -0.005168f, 0.031093f, 0.089721f, 0.126905f, -0.050178f, 0.142017f, -0.010768f, -0.038357f, -0.029578f, -0.047541f, -0.003635f, 0.024192f, 0.083931f, 0.003282f, 0.026123f, -0.020808f, -0.071661f, 0.001767f, 0.003030f, 0.047893f, 0.009410f, -0.054060f, 0.101651f, -0.042858f, 0.019301f, 0.045902f, -0.050083f, -0.040583f, -0.071637f, -0.031166f, 0.044876f, 0.055823f, 0.068881f, -0.025492f, -0.167225f, 0.037524f, 0.087896f, 0.112544f, 0.096815f, -0.001150f, -0.047602f, -0.059127f, 0.020658f, + 0.057539f, -0.036120f, -0.019003f, -0.148111f, -0.090686f, 0.080203f, 0.134587f, 0.027938f, -0.003419f, -0.032214f, -0.058503f, -0.013381f, 0.037508f, -0.051611f, 0.020617f, -0.006996f, 0.085142f, -0.003238f, 0.033341f, -0.165661f, -0.020885f, 0.002444f, 0.102206f, 0.079453f, -0.001944f, -0.049333f, -0.013534f, 0.121764f, 0.055027f, -0.142004f, -0.176273f, -0.068486f, 0.035627f, 0.274371f, 0.029763f, -0.047153f, 0.037880f, -0.072899f, 0.194769f, 0.059854f, -0.154820f, -0.096488f, -0.019180f, 0.137889f, 0.020777f, -0.056774f, -0.052914f, -0.048588f, 0.039270f, 0.074471f, 0.037233f, -0.079234f, -0.006490f, -0.026922f, 0.065927f, -0.006644f, 0.039926f, -0.013488f, -0.016634f, -0.052371f, 0.020739f, -0.015690f, -0.005502f, 0.041634f, -0.064470f, 0.038292f, -0.009623f, -0.009328f, 0.000420f, 0.030372f, 0.064214f, 0.032932f, 0.004483f, -0.012104f, 0.013699f, -0.000000f, 0.026140f, 0.009127f, 0.028830f, 0.007711f, 0.007381f, -0.031902f, 0.015206f, 0.017717f, 0.011798f, 0.000831f, 0.009726f, 0.006651f, 0.028542f, 0.014045f, -0.022956f, 0.058475f, -0.067251f, 0.002149f, -0.027012f, 0.015608f, + -0.041614f, 0.039180f, 0.010900f, -0.022157f, -0.041967f, -0.020616f, -0.007892f, 0.012285f, -0.057295f, 0.013279f, -0.028012f, -0.010903f, -0.044836f, -0.021126f, 0.036529f, -0.038294f, -0.013442f, -0.005239f, 0.017920f, 0.012076f, -0.014811f, 0.020661f, -0.032764f, -0.002589f, 0.000535f, 0.017683f, -0.021408f, 0.031275f, 0.023477f, -0.023752f, -0.027370f, -0.010502f, 0.044607f, -0.031986f, 0.014204f, 0.033037f, 0.007539f, -0.032175f, -0.012145f, 0.013865f, -0.020016f, 0.015010f, 0.001663f, 0.007265f, -0.029524f, 0.006255f, -0.023963f, -0.001046f, 0.022697f, 0.028386f, 0.022324f, -0.016418f, 0.021319f, 0.002668f, -0.026184f, -0.003925f, 0.000190f, 0.031572f, -0.008401f, 0.006650f, 0.027731f, -0.005932f, -0.035466f, 0.049934f, -0.019991f, 0.029528f, 0.021989f, 0.005068f, 0.007317f, -0.021136f, -0.025550f, 0.034376f, 0.005675f, 0.030233f, 0.009578f, 0.016445f, 0.008856f, -0.001018f, -0.001117f, -0.026539f, 0.003485f, 0.006997f, 0.009845f, 0.010368f, -0.002746f, 0.012083f, 0.002635f, -0.001710f, 0.003905f, 0.001419f, 0.013168f, -0.003593f, 0.010409f, -0.012316f, -0.002504f, -0.000180f, + 0.001581f, -0.007023f, -0.003257f, 0.023184f, 0.015371f, -0.004185f, -0.016084f, -0.019155f, -0.006357f, -0.007874f, 0.022070f, 0.001908f, -0.005764f, -0.014387f, -0.006571f, 0.001740f, -0.011029f, 0.024381f, 0.003013f, -0.010295f, 0.004946f, -0.000760f, -0.003719f, 0.006658f, -0.006458f, 0.021093f, -0.019355f, 0.014379f, -0.018797f, -0.054238f, 0.101659f, 0.009295f, 0.005629f, -0.040965f, 0.023643f, -0.003386f, 0.026741f, 0.020391f, 0.031284f, 0.003515f, 0.008032f, -0.017484f, 0.005139f, 0.028669f, -0.002721f, 0.015721f, -0.002405f, 0.005056f, 0.006411f, 0.011674f, -0.012035f, 0.021722f, -0.014659f, 0.002068f, -0.002291f, 0.007422f, -0.001849f, 0.004434f, 0.016546f, 0.018140f, -0.008639f, 0.008052f, 0.003607f, -0.003955f, -0.007672f, 0.024134f, -0.007307f, 0.005177f, -0.006755f, 0.012665f, 0.000011f, -0.011433f, 0.024260f, -0.014935f, -0.005113f, 0.006503f, -0.011282f, -0.006787f, -0.003442f, 0.001100f, -0.004262f, 0.000511f, -0.002226f, -0.006144f, 0.008309f, -0.015453f, 0.009908f, 0.006766f, -0.005227f, 0.010430f, -0.007738f, 0.012336f, -0.006191f, 0.002471f, 0.002499f, -0.007225f, + 0.012146f, 0.000146f, 0.001790f, -0.003664f, 0.016321f, -0.019100f, 0.020633f, -0.014389f, 0.002587f, 0.003681f, -0.000441f, 0.003947f, -0.003140f, 0.012027f, -0.011017f, 0.000953f, 0.010345f, -0.012135f, 0.007861f, 0.007128f, -0.001666f, 0.001688f, 0.007111f, 0.003481f, -0.003081f, 0.004811f, 0.001415f, -0.001403f, 0.001112f, 0.004247f, 0.000637f, -0.004996f, 0.001568f, 0.002301f, -0.002491f, 0.006138f, -0.001147f, 0.005078f, -0.002988f, 0.000990f, 0.004029f, -0.002338f, 0.000796f, 0.002844f, -0.003668f, 0.006715f, -0.000454f, 0.003414f, -0.000667f, 0.007059f, -0.002259f, 0.001009f, 0.006621f, -0.005464f, 0.007633f, -0.004115f, 0.003419f, -0.004237f, 0.007502f, 0.019470f, -0.092675f, -0.230794f, 0.035923f, 0.175847f, 0.163388f, 0.283403f, -0.072274f, -0.075816f, -0.192883f, -0.263385f, -0.054261f, 0.095296f, 0.101993f, 0.192019f, 0.104346f, 0.008262f, -0.049801f, -0.134007f, -0.095231f, -0.016430f, -0.014859f, 0.047785f, 0.044364f, 0.025635f, 0.016409f, 0.012897f, -0.007008f, -0.032919f, -0.002494f, 0.038062f, 0.000353f, 0.008019f, -0.002116f, -0.028520f, -0.021780f, -0.048515f, + -0.047473f, 0.021563f, 0.019961f, 0.044099f, 0.067128f, 0.050245f, 0.024618f, 0.008878f, -0.072318f, -0.051206f, -0.039540f, -0.039698f, -0.044197f, 0.009235f, 0.028309f, 0.049074f, 0.062782f, 0.051863f, 0.011387f, -0.006144f, -0.041510f, -0.042478f, -0.025150f, -0.012314f, 0.004161f, 0.006977f, 0.014150f, 0.001218f, -0.013494f, 0.004586f, -0.021590f, 0.011292f, 0.018522f, 0.002090f, 0.036987f, 0.044576f, 0.013894f, -0.008501f, -0.048966f, -0.064656f, -0.025922f, -0.011955f, -0.007437f, 0.032844f, 0.025580f, -0.006738f, 0.028998f, 0.031326f, 0.017657f, 0.021630f, -0.011889f, -0.023335f, -0.018620f, -0.026843f, -0.021163f, -0.003997f, -0.020310f, -0.008124f, 0.001226f, 0.016332f, 0.023255f, 0.033321f, 0.028930f, 0.026503f, 0.021207f, -0.011020f, -0.024901f, -0.042046f, -0.051638f, -0.030177f, -0.022346f, 0.002852f, 0.024797f, 0.036307f, 0.042284f, 0.033269f, 0.030823f, 0.019725f, -0.026021f, -0.046712f, -0.041989f, -0.020673f, -0.005910f, -0.001984f, 0.003273f, 0.017745f, 0.015812f, 0.007432f, 0.003688f, 0.014503f, 0.008386f, 0.012606f, 0.003650f, -0.019620f, -0.021346f, -0.014201f, + -0.005584f, 0.006635f, 0.004859f, -0.007168f, -0.003907f, 0.006593f, 0.003574f, 0.002793f, 0.009007f, 0.014227f, 0.006596f, 0.000224f, -0.007140f, -0.008394f, -0.006949f, -0.008627f, -0.011085f, -0.008566f, -0.000854f, 0.005780f, 0.008011f, 0.009306f, 0.007544f, 0.002291f, 0.000112f, 0.000180f, 0.000436f} + }, + { + {-0.010872f, -0.000147f, 0.002381f, 0.001806f, 0.007759f, 0.001020f, -0.000950f, -0.005003f, 0.011403f, 0.007043f, 0.000372f, -0.001405f, 0.011327f, 0.003845f, -0.003618f, -0.009934f, 0.006340f, -0.002862f, 0.004924f, -0.009455f, 0.000611f, -0.002262f, -0.007023f, -0.001907f, -0.003533f, -0.001310f, 0.000540f, 0.000044f, -0.005120f, -0.003148f, -0.000812f, -0.000990f, -0.003183f, 0.003408f, -0.000326f, -0.003412f, 0.006076f, -0.010108f, -0.004791f, 0.004820f, -0.006065f, 0.000831f, -0.003764f, -0.005552f, 0.003775f, 0.003420f, -0.002974f, 0.003789f, 0.007313f, 0.004110f, -0.003789f, -0.004442f, 0.000802f, 0.001432f, -0.004468f, 0.004837f, 0.008066f, -0.006883f, -0.002194f, 0.003963f, 0.002973f, -0.001644f, -0.002101f, -0.003364f, 0.004447f, 0.001346f, -0.005321f, 0.006050f, 0.002953f, -0.004981f, -0.003725f, 0.006362f, -0.004800f, -0.006146f, -0.011566f, -0.010067f, 0.005482f, 0.006328f, 0.000514f, 0.002775f, -0.001093f, 0.002270f, -0.004280f, 0.006492f, -0.000535f, 0.003001f, -0.002973f, 0.001671f, -0.002707f, -0.002126f, 0.000109f, 0.004157f, -0.000913f, -0.001068f, -0.001858f, 0.000613f, + -0.001402f, 0.000280f, 0.000495f, -0.000868f, -0.001004f, 0.000125f, -0.000047f, -0.000345f, -0.001102f, 0.000556f, -0.000401f, 0.014515f, -0.001393f, -0.002930f, -0.005941f, 0.009291f, -0.004944f, -0.000527f, -0.007547f, -0.008053f, -0.010128f, -0.004765f, 0.007945f, -0.008220f, -0.003073f, -0.002892f, 0.002755f, -0.002047f, -0.011284f, 0.005882f, 0.002828f, 0.021940f, -0.002240f, 0.010265f, -0.002046f, -0.000542f, -0.000993f, 0.001134f, -0.004625f, 0.008497f, -0.002231f, -0.001711f, -0.005127f, -0.000939f, -0.001833f, 0.013167f, 0.002445f, -0.001332f, -0.012339f, -0.001261f, -0.002373f, 0.003723f, -0.007842f, -0.002171f, 0.002123f, 0.001770f, -0.002169f, -0.001324f, -0.004873f, -0.001835f, -0.005857f, -0.002636f, 0.011369f, -0.003346f, 0.003600f, 0.006347f, -0.001536f, -0.006179f, -0.008108f, 0.002106f, 0.001903f, 0.002449f, 0.005040f, 0.005974f, 0.004920f, 0.002844f, -0.002253f, -0.002185f, -0.002607f, -0.011415f, -0.002730f, -0.001161f, 0.005529f, 0.004714f, -0.002821f, -0.000277f, 0.006073f, -0.006333f, 0.002496f, 0.000181f, -0.001582f, -0.003664f, -0.005582f, -0.000069f, 0.003322f, 0.003359f, + 0.003539f, -0.001479f, 0.001455f, -0.001322f, 0.000296f, 0.004978f, 0.002019f, 0.000386f, 0.000043f, -0.000759f, -0.000118f, 0.000318f, 0.000991f, -0.000632f, -0.000695f, 0.002160f, 0.001107f, 0.002200f, 0.002255f, 0.000463f, 0.001253f, -0.000323f, 0.000363f, 0.000164f, -0.001009f, -0.002555f, -0.000465f, -0.019239f, -0.004701f, -0.000391f, -0.004120f, -0.002861f, 0.006724f, -0.013520f, -0.011333f, -0.006642f, -0.004433f, 0.001908f, 0.015169f, -0.003312f, -0.000047f, 0.001810f, -0.010901f, -0.002866f, -0.009107f, -0.001426f, 0.016066f, -0.001261f, -0.007842f, -0.005109f, 0.000185f, 0.003261f, 0.003204f, -0.004533f, -0.020390f, -0.009772f, -0.002745f, -0.007885f, 0.000706f, 0.000348f, 0.008232f, -0.005347f, 0.007309f, 0.001768f, -0.003791f, -0.010932f, -0.009157f, 0.012613f, -0.010461f, 0.006921f, 0.002011f, -0.006715f, -0.002529f, -0.005998f, -0.004311f, 0.005930f, -0.011234f, 0.005781f, 0.001953f, -0.000198f, 0.001862f, 0.000769f, -0.001136f, 0.000234f, -0.005702f, -0.007811f, 0.000541f, -0.002391f, -0.005773f, -0.002341f, -0.008917f, 0.010332f, 0.007068f, 0.001774f, 0.008454f, 0.000992f, + -0.003619f, 0.010500f, -0.005565f, -0.003494f, -0.003588f, 0.007990f, -0.007829f, 0.003464f, 0.005610f, 0.000305f, 0.003470f, 0.008704f, 0.003180f, -0.000272f, 0.000540f, 0.001849f, 0.001437f, -0.001725f, -0.001055f, 0.000103f, -0.000459f, 0.002792f, 0.001349f, 0.002953f, 0.002190f, 0.000840f, -0.002679f, -0.003135f, 0.001881f, -0.000114f, -0.000189f, 0.002859f, -0.002005f, -0.001594f, -0.000056f, 0.000685f, 0.000931f, -0.000285f, -0.003226f, 0.002676f, 0.000709f, -0.012928f, 0.015852f, 0.017987f, 0.004932f, 0.004844f, -0.005141f, 0.008396f, 0.004211f, -0.010499f, 0.003298f, 0.006783f, -0.012553f, -0.010950f, 0.011038f, -0.009591f, -0.001385f, -0.006174f, 0.011125f, 0.002450f, -0.001261f, -0.004066f, -0.000071f, -0.007179f, 0.006704f, -0.003569f, 0.004066f, -0.001706f, -0.000044f, 0.007261f, 0.002858f, 0.001048f, -0.002785f, 0.007117f, 0.004517f, 0.002142f, -0.000592f, 0.007362f, -0.000554f, 0.001374f, -0.004606f, 0.008968f, 0.002028f, 0.003597f, 0.006560f, -0.017911f, -0.005808f, -0.003504f, -0.006403f, -0.006213f, 0.001845f, 0.010048f, -0.004298f, -0.002637f, -0.005457f, -0.002418f, + 0.002191f, 0.004442f, -0.012324f, -0.000705f, 0.004344f, 0.000541f, -0.000949f, 0.005406f, 0.003527f, -0.011539f, -0.003208f, -0.002480f, 0.007198f, -0.007575f, 0.010155f, 0.010992f, 0.005766f, 0.002302f, -0.005074f, -0.000228f, 0.000908f, 0.007364f, -0.001932f, 0.000924f, 0.000912f, 0.001152f, 0.010853f, 0.001226f, 0.011563f, 0.004302f, 0.000198f, -0.005480f, -0.003130f, 0.004770f, -0.000940f, 0.000037f, 0.000489f, 0.000328f, 0.001082f, 0.004856f, 0.001402f, 0.001924f, 0.000214f, 0.001860f, -0.003814f, -0.000283f, 0.001244f, 0.001575f, -0.000956f, -0.000574f, 0.000054f, 0.001572f, -0.001116f, -0.000803f, 0.001636f, 0.001589f, 0.002940f, 0.001392f, 0.002723f, -0.001558f, 0.000243f, 0.000360f, -0.001033f, 0.002589f, 0.019897f, -0.003709f, -0.000297f, 0.007258f, 0.004695f, 0.003511f, 0.006702f, 0.017671f, -0.004946f, -0.001634f, -0.017051f, 0.000326f, -0.014654f, -0.018583f, 0.000648f, 0.007903f, -0.024001f, 0.008133f, 0.007833f, 0.004293f, -0.007298f, -0.005767f, -0.007958f, -0.003023f, 0.000447f, 0.000498f, 0.007614f, 0.010069f, -0.001395f, -0.009926f, -0.006034f, 0.007453f, + -0.010675f, -0.005311f, -0.009025f, 0.001939f, -0.014576f, 0.007251f, 0.001137f, -0.000990f, 0.002327f, -0.000473f, -0.003347f, 0.000009f, 0.009360f, -0.010825f, 0.013091f, -0.009956f, -0.001176f, 0.002414f, -0.006617f, -0.005398f, 0.005113f, 0.002524f, -0.002106f, -0.005063f, 0.009765f, 0.004078f, -0.006835f, -0.013661f, 0.001567f, 0.003160f, 0.007976f, -0.000333f, -0.003553f, 0.000689f, 0.004216f, -0.003253f, 0.018979f, -0.006358f, -0.003109f, -0.013552f, -0.009000f, 0.021434f, 0.008680f, -0.004762f, -0.001249f, -0.007452f, -0.008367f, -0.000666f, 0.002958f, 0.000570f, -0.004075f, 0.004629f, 0.002521f, 0.006415f, -0.000707f, -0.004638f, 0.001843f, 0.000192f, -0.002147f, 0.001878f, 0.001779f, -0.000485f, 0.000804f, 0.002537f, 0.000804f, -0.000600f, -0.001960f, 0.001065f, 0.000630f, -0.001790f, 0.003488f, 0.002976f, 0.000927f, -0.001748f, -0.004554f, 0.000328f, -0.000394f, -0.000170f, 0.001957f, -0.002227f, 0.001415f, 0.002377f, -0.001458f, 0.005482f, 0.012819f, -0.017123f, -0.010116f, 0.011974f, -0.008973f, -0.009556f, -0.010491f, -0.012542f, 0.009013f, -0.003171f, -0.000374f, -0.002888f, + 0.000470f, -0.013955f, -0.002787f, 0.006381f, 0.006979f, 0.001583f, -0.007369f, -0.010712f, -0.008889f, -0.011304f, 0.002289f, 0.013473f, 0.001813f, 0.004355f, 0.004617f, 0.004490f, -0.007926f, 0.008299f, 0.005165f, -0.005941f, -0.004777f, -0.018303f, 0.002811f, 0.004074f, -0.014372f, -0.001152f, 0.004416f, -0.002710f, 0.001773f, -0.001310f, -0.015419f, 0.013096f, -0.014365f, 0.011278f, 0.000605f, 0.005675f, -0.016168f, -0.009061f, -0.014478f, -0.011432f, 0.002104f, -0.004090f, -0.005147f, -0.006454f, -0.000050f, 0.007180f, -0.013397f, -0.000252f, 0.003883f, -0.004350f, -0.014937f, -0.009376f, -0.003131f, 0.002788f, 0.007241f, 0.003121f, -0.012304f, 0.013098f, -0.004238f, -0.002896f, 0.013039f, -0.017145f, -0.005641f, -0.003442f, -0.003068f, 0.020455f, -0.007482f, -0.000381f, -0.007764f, -0.006458f, 0.003709f, 0.002789f, -0.000483f, 0.002160f, -0.001653f, -0.002922f, 0.003809f, 0.000020f, 0.001545f, 0.001605f, 0.004931f, -0.001974f, 0.001422f, 0.001067f, 0.000322f, 0.001265f, -0.005654f, 0.007304f, 0.006642f, -0.002308f, -0.001171f, 0.001010f, -0.000987f, 0.001224f, 0.000192f, -0.000549f, + -0.002731f, 0.001628f, -0.001422f, 0.000610f, 0.006462f, 0.004106f, 0.003461f, -0.002705f, 0.004603f, 0.001811f, -0.001895f, 0.002070f, 0.000680f, 0.001522f, 0.026487f, -0.023465f, -0.012331f, -0.015607f, 0.011409f, 0.004343f, -0.007929f, 0.005396f, -0.000044f, 0.015786f, 0.001070f, 0.000231f, -0.015077f, 0.010774f, 0.017434f, 0.018270f, 0.015217f, -0.008370f, -0.001209f, 0.002404f, -0.009591f, -0.006555f, 0.002629f, 0.001165f, -0.013856f, -0.006769f, -0.005787f, 0.006879f, -0.000964f, -0.010470f, -0.004753f, 0.003528f, 0.008474f, 0.001099f, -0.002824f, 0.000198f, -0.007305f, -0.000144f, -0.000359f, 0.001205f, -0.015846f, 0.009379f, 0.011084f, 0.002331f, 0.005768f, 0.006608f, -0.012803f, 0.018550f, 0.016758f, 0.003155f, -0.011381f, 0.006686f, -0.003950f, -0.016989f, -0.004220f, -0.005297f, -0.000133f, 0.001146f, -0.000190f, -0.010221f, -0.009079f, -0.021121f, -0.017552f, 0.000356f, 0.010870f, -0.009611f, 0.004667f, 0.001501f, -0.006414f, -0.017180f, -0.001560f, 0.010233f, -0.006551f, 0.009198f, 0.018017f, 0.005553f, -0.007207f, 0.010430f, 0.000134f, -0.000949f, 0.005057f, 0.008152f, + -0.000521f, -0.001256f, 0.002406f, 0.005315f, -0.002672f, -0.011488f, 0.000864f, -0.000182f, 0.001429f, 0.001592f, 0.004095f, 0.008663f, -0.002851f, -0.001347f, 0.006636f, 0.005994f, 0.001463f, 0.001001f, -0.003928f, 0.008360f, 0.001139f, -0.000397f, 0.005136f, 0.001697f, 0.002014f, 0.000991f, 0.004658f, 0.004107f, 0.004638f, 0.007412f, 0.000805f, 0.004489f, 0.000846f, 0.004982f, 0.002528f, 0.002899f, 0.002114f, 0.004729f, 0.004267f, -0.025140f, 0.002691f, -0.009370f, -0.033682f, -0.025909f, 0.006517f, 0.000266f, -0.005779f, 0.006034f, 0.016251f, -0.002554f, 0.009754f, 0.008634f, 0.005042f, -0.002561f, -0.008737f, 0.007190f, -0.007435f, 0.000928f, -0.006377f, 0.010161f, 0.018587f, -0.016654f, -0.004761f, 0.001060f, 0.006785f, 0.001826f, -0.005149f, -0.003006f, -0.006167f, -0.000455f, -0.007643f, 0.009830f, 0.002206f, -0.011701f, 0.013102f, -0.013055f, -0.004134f, 0.016046f, 0.014170f, 0.011937f, -0.013551f, -0.008903f, -0.012134f, 0.014153f, 0.019202f, -0.000259f, -0.003917f, 0.015218f, -0.022326f, 0.002779f, 0.006048f, -0.002135f, -0.018752f, 0.016944f, 0.005978f, 0.008625f, + 0.015930f, 0.000872f, -0.022635f, 0.005984f, 0.009364f, -0.005779f, -0.001639f, 0.015666f, -0.016158f, -0.015185f, -0.013079f, 0.001618f, 0.020208f, 0.010927f, -0.002858f, 0.023107f, -0.030652f, -0.011298f, 0.000415f, 0.014802f, 0.006933f, -0.004409f, -0.024349f, -0.003780f, -0.009736f, 0.002747f, 0.009337f, 0.023809f, 0.004110f, -0.006684f, 0.003172f, -0.004018f, -0.001524f, -0.007834f, 0.000096f, -0.006450f, 0.002283f, 0.006517f, 0.003742f, 0.006002f, 0.006810f, 0.002174f, 0.001516f, 0.000085f, 0.001268f, -0.003228f, -0.003337f, 0.000340f, 0.007189f, 0.002723f, -0.000793f, 0.001298f, 0.002944f, 0.005753f, 0.000846f, -0.001872f, 0.001062f, -0.001828f, 0.004683f, -0.008463f, -0.005063f, -0.003719f, 0.005425f, 0.004650f, -0.027083f, 0.027424f, 0.011161f, -0.000644f, -0.002760f, 0.002329f, 0.004733f, 0.014869f, -0.002790f, 0.001664f, -0.004722f, -0.003403f, 0.008402f, 0.004341f, 0.009751f, 0.004304f, 0.005642f, -0.018492f, -0.007646f, 0.031094f, 0.003176f, 0.009259f, 0.013085f, 0.004926f, -0.010501f, -0.019510f, 0.006112f, -0.008127f, 0.000765f, 0.006894f, -0.009693f, -0.011412f, + 0.013962f, 0.016375f, -0.008489f, -0.006032f, 0.012696f, -0.015543f, 0.006846f, -0.011958f, 0.005423f, -0.011573f, 0.016858f, 0.002365f, -0.002200f, 0.005940f, 0.028942f, 0.007994f, 0.011228f, -0.003247f, 0.001498f, 0.004945f, 0.021379f, -0.001835f, 0.030628f, 0.000924f, 0.014565f, -0.000515f, 0.027649f, 0.009792f, 0.020640f, 0.015658f, -0.003457f, -0.009233f, -0.002474f, -0.010550f, -0.011635f, 0.016206f, -0.003256f, -0.006322f, 0.002527f, 0.000243f, -0.008272f, -0.004030f, 0.002535f, 0.007255f, 0.002016f, -0.013854f, -0.013724f, -0.007132f, -0.014012f, -0.000365f, -0.000290f, -0.004119f, 0.003889f, -0.000276f, 0.005704f, -0.000836f, -0.005713f, 0.001182f, -0.002411f, -0.010562f, -0.006659f, 0.001511f, 0.014133f, -0.005955f, 0.005235f, -0.001596f, -0.000149f, 0.006551f, -0.004911f, 0.002227f, 0.003213f, -0.003589f, -0.002446f, -0.001765f, -0.004041f, 0.001992f, -0.005054f, -0.006596f, -0.002512f, -0.007147f, 0.008964f, -0.002517f, 0.000550f, -0.000771f, -0.000530f, 0.000948f, -0.002964f, 0.001323f, 0.002272f, 0.001164f, 0.003657f, 0.004848f, 0.000864f, 0.003613f, -0.002696f, -0.007733f, + 0.001548f, -0.002143f, 0.003247f, -0.003164f, 0.031777f, -0.008347f, -0.000283f, -0.039172f, -0.001399f, 0.020928f, -0.010967f, 0.018184f, -0.024924f, 0.003611f, 0.002492f, -0.000729f, -0.033050f, -0.001498f, -0.055063f, 0.002588f, -0.006087f, -0.023066f, -0.004039f, 0.003079f, -0.012100f, 0.002084f, 0.013895f, 0.002128f, -0.012625f, 0.002328f, -0.003927f, 0.012195f, -0.013576f, 0.000775f, 0.017625f, 0.003964f, 0.001432f, -0.002648f, 0.013498f, -0.008724f, 0.001387f, -0.000069f, 0.010350f, 0.001993f, -0.018614f, -0.009910f, -0.013141f, 0.015347f, -0.034838f, 0.016829f, 0.013811f, 0.011884f, 0.006605f, 0.002581f, -0.015274f, 0.010842f, -0.022602f, -0.005356f, -0.004785f, -0.004691f, -0.001043f, 0.001418f, 0.007199f, -0.017361f, -0.006862f, 0.029260f, 0.012218f, -0.010681f, -0.012456f, 0.003177f, -0.005205f, 0.008917f, -0.006002f, -0.001810f, -0.009525f, 0.026536f, 0.013466f, -0.009112f, 0.001609f, -0.013519f, 0.003081f, -0.010206f, -0.003582f, 0.010538f, 0.009776f, -0.003066f, 0.019312f, -0.007609f, 0.009551f, -0.012689f, 0.013465f, 0.001977f, -0.007928f, -0.010684f, -0.015966f, 0.004035f, + -0.001812f, 0.007250f, -0.002101f, -0.004699f, 0.002853f, 0.002974f, 0.004745f, 0.003884f, 0.008810f, -0.000336f, 0.002785f, -0.006854f, 0.005469f, -0.004920f, -0.002550f, -0.003690f, -0.000805f, -0.008725f, -0.001578f, 0.003415f, 0.007807f, -0.007498f, -0.003704f, -0.005417f, 0.005329f, 0.004172f, -0.003550f, -0.000676f, -0.005917f, 0.004494f, 0.020169f, 0.020379f, 0.011832f, 0.010566f, -0.009906f, 0.011753f, 0.019591f, -0.014551f, -0.000519f, -0.037766f, 0.021641f, 0.014768f, -0.005379f, 0.008750f, -0.002428f, 0.003020f, 0.013475f, -0.008456f, 0.021077f, -0.019003f, 0.001836f, 0.023732f, 0.010397f, 0.001461f, 0.018320f, -0.006478f, 0.008419f, 0.004830f, 0.009818f, 0.016216f, -0.009576f, -0.001941f, 0.029912f, 0.014954f, -0.000649f, 0.004130f, -0.020257f, 0.027524f, -0.023166f, -0.001459f, 0.024107f, 0.007482f, 0.025954f, -0.016284f, 0.004168f, -0.001053f, -0.006343f, 0.003482f, -0.025058f, -0.017582f, 0.023632f, -0.011767f, -0.005054f, -0.007991f, -0.026648f, 0.018929f, -0.006277f, -0.004416f, -0.011803f, 0.011644f, 0.027092f, -0.021354f, -0.004340f, 0.018260f, -0.020051f, -0.008752f, + 0.016324f, 0.022763f, -0.037624f, -0.010040f, -0.003222f, 0.016056f, -0.000563f, 0.018751f, -0.004548f, -0.013744f, 0.000920f, 0.009979f, 0.024307f, 0.012251f, -0.016325f, -0.000855f, 0.011963f, -0.024229f, -0.014824f, -0.004643f, -0.012400f, -0.012620f, -0.001476f, 0.011490f, -0.010865f, 0.002685f, 0.011990f, 0.003323f, 0.002157f, 0.008372f, -0.002063f, 0.005387f, 0.005218f, 0.005098f, 0.002946f, -0.000965f, -0.007284f, -0.002497f, -0.002018f, -0.006659f, -0.002992f, 0.001020f, 0.000870f, -0.001010f, 0.001056f, 0.007320f, -0.006032f, -0.001975f, -0.004476f, 0.003498f, 0.003461f, -0.001459f, -0.004993f, -0.011106f, 0.005608f, 0.004201f, 0.007225f, 0.001947f, 0.001779f, -0.000811f, -0.006867f, 0.002749f, -0.002748f, -0.003183f, -0.001984f, 0.019694f, 0.041734f, 0.008068f, -0.024668f, -0.008792f, 0.008195f, -0.054739f, 0.001730f, 0.000335f, -0.008568f, -0.002686f, 0.025290f, -0.041313f, 0.009090f, 0.019314f, -0.015190f, 0.017117f, 0.031934f, 0.007917f, -0.029501f, 0.007988f, -0.007425f, -0.000535f, -0.028917f, -0.008736f, 0.026388f, -0.002964f, 0.024197f, -0.006368f, -0.008472f, 0.003959f, + -0.020464f, -0.011510f, -0.014729f, -0.010930f, -0.008045f, 0.019739f, -0.021801f, 0.003545f, 0.038112f, 0.025724f, 0.008602f, -0.038735f, 0.006448f, 0.025414f, 0.010646f, 0.001511f, -0.013804f, -0.016820f, -0.041341f, -0.028568f, 0.005919f, -0.014138f, -0.014124f, -0.000816f, 0.017681f, 0.012513f, -0.012419f, 0.000542f, 0.025152f, -0.009679f, -0.004240f, 0.001141f, 0.033064f, 0.001256f, -0.001645f, 0.016807f, 0.005282f, -0.037613f, 0.010569f, 0.010894f, -0.000164f, -0.031150f, 0.013167f, 0.018245f, -0.013669f, -0.009767f, -0.025518f, 0.006799f, -0.009350f, 0.009668f, 0.004887f, -0.006018f, -0.010797f, 0.007049f, 0.003269f, 0.010885f, -0.005381f, 0.016978f, 0.006046f, -0.011655f, 0.001446f, -0.000608f, -0.015953f, 0.000297f, 0.001348f, -0.000059f, -0.000273f, -0.008439f, -0.007241f, -0.003402f, -0.000141f, 0.010642f, 0.003598f, 0.005563f, 0.008690f, -0.003944f, -0.005042f, 0.004088f, -0.008254f, -0.007470f, -0.000232f, -0.000420f, 0.002683f, -0.002474f, 0.001975f, 0.005235f, 0.005673f, 0.000690f, -0.003208f, -0.000800f, -0.000332f, -0.000944f, 0.000172f, -0.001389f, 0.000780f, -0.000192f, + 0.007373f, -0.004169f, -0.005082f, 0.013215f, 0.009595f, -0.001276f, 0.003813f, -0.012280f, 0.043152f, 0.002402f, -0.008664f, -0.000560f, 0.019095f, -0.009153f, 0.005292f, -0.004600f, 0.004542f, 0.016383f, -0.029757f, 0.031518f, 0.035694f, 0.010077f, 0.015134f, -0.012036f, 0.020265f, 0.046992f, 0.001578f, -0.005327f, -0.008590f, 0.020036f, -0.007021f, -0.011306f, -0.003897f, 0.007142f, -0.023313f, 0.010461f, -0.020524f, 0.023617f, 0.005431f, 0.023783f, -0.014810f, 0.021684f, 0.006520f, 0.028365f, 0.004772f, 0.006023f, -0.010046f, 0.017690f, 0.004504f, -0.005525f, 0.025516f, -0.009840f, -0.018025f, 0.036036f, 0.028781f, 0.010670f, 0.027210f, 0.039425f, 0.047788f, -0.014761f, -0.014858f, -0.016758f, 0.006061f, -0.021832f, 0.025942f, -0.003122f, -0.002261f, -0.036598f, 0.008620f, 0.041691f, 0.042484f, -0.001561f, -0.005450f, -0.029008f, 0.000561f, 0.027704f, -0.014000f, -0.017151f, 0.015734f, 0.002537f, -0.014959f, 0.005432f, -0.002338f, -0.009115f, -0.001968f, -0.007805f, -0.000207f, 0.016113f, 0.012033f, -0.003176f, 0.002981f, -0.003788f, -0.015895f, -0.020779f, -0.003773f, 0.010487f, + 0.004329f, 0.014805f, -0.002845f, -0.013780f, -0.003673f, 0.015349f, -0.007049f, 0.008773f, 0.014178f, -0.014051f, -0.003638f, -0.001289f, 0.003722f, -0.000676f, 0.009512f, 0.006962f, 0.003524f, -0.014006f, 0.003704f, 0.007803f, 0.002479f, 0.003258f, 0.005231f, -0.012420f, -0.005704f, 0.000093f, -0.000501f, -0.006552f, -0.016092f, -0.005182f, 0.001578f, 0.008495f, 0.002004f, -0.006575f, -0.007600f, -0.056588f, -0.039578f, 0.020610f, 0.007924f, -0.029731f, 0.002927f, 0.012948f, -0.027114f, -0.017119f, -0.011767f, 0.032031f, 0.014293f, 0.010143f, -0.010359f, -0.008005f, -0.008259f, -0.020188f, -0.026861f, -0.047239f, 0.024409f, 0.020863f, -0.010110f, 0.053030f, 0.025435f, 0.050913f, 0.034932f, 0.003123f, -0.016458f, 0.013389f, 0.006172f, 0.023081f, 0.026583f, 0.029342f, -0.004333f, -0.005326f, 0.012475f, -0.013469f, -0.003175f, -0.011889f, -0.022132f, -0.036380f, -0.010647f, 0.036759f, -0.009223f, -0.014878f, -0.020966f, 0.014537f, 0.022269f, 0.014726f, 0.001397f, 0.021601f, 0.042323f, -0.025434f, -0.011603f, -0.019612f, -0.014186f, -0.040996f, -0.010053f, 0.010179f, -0.018648f, -0.014694f, + -0.047100f, -0.067142f, 0.007288f, -0.044291f, -0.069510f, -0.050411f, -0.021194f, 0.044807f, 0.015495f, 0.027282f, 0.020528f, -0.046460f, -0.019594f, 0.003842f, 0.023171f, -0.023166f, -0.027326f, -0.026536f, -0.008252f, 0.013611f, -0.015727f, -0.057873f, -0.036364f, -0.008475f, -0.011735f, -0.004328f, -0.008602f, 0.032410f, 0.029704f, 0.030647f, 0.031402f, 0.010281f, -0.000300f, 0.011636f, 0.003267f, -0.001170f, 0.009263f, -0.026183f, -0.010075f, 0.011109f, 0.015201f, -0.000884f, -0.008492f, -0.009585f, 0.003802f, -0.014343f, -0.020601f, 0.018730f, -0.015352f, -0.007959f, 0.001690f, -0.018090f, -0.016900f, -0.030731f, -0.011932f, -0.007368f, 0.002164f, 0.025319f, -0.006567f, -0.003977f, -0.008093f, 0.012816f, -0.006869f, 0.000507f, 0.012427f, 0.000808f, -0.008778f, 0.005514f, 0.012399f, -0.007811f, -0.001858f, -0.000595f, 0.006565f, -0.107417f, -0.016865f, 0.034514f, -0.036571f, 0.015001f, -0.014255f, -0.058281f, -0.018163f, 0.062385f, 0.078574f, -0.041737f, 0.001449f, -0.014390f, -0.064129f, -0.051080f, -0.048266f, -0.051516f, -0.027549f, -0.033652f, -0.002797f, 0.010977f, -0.008988f, 0.013101f, + 0.012079f, -0.021115f, -0.005804f, -0.028965f, 0.012110f, -0.045586f, -0.041071f, 0.009795f, 0.007030f, -0.012464f, -0.015095f, 0.035668f, -0.010581f, 0.049550f, 0.010905f, 0.045923f, -0.031204f, 0.019958f, 0.012921f, 0.055634f, 0.029686f, 0.019454f, 0.005234f, 0.008350f, -0.006700f, 0.016283f, 0.022844f, -0.018107f, -0.025251f, 0.038899f, -0.005513f, -0.049030f, -0.094008f, -0.113024f, -0.081549f, 0.013384f, -0.000281f, -0.105270f, 0.034009f, 0.017756f, 0.026165f, -0.036008f, 0.004385f, 0.012207f, 0.004512f, 0.053773f, 0.054794f, 0.109694f, 0.036314f, -0.058773f, -0.075421f, -0.046427f, -0.041759f, -0.048290f, -0.043003f, -0.001702f, 0.023221f, 0.031323f, -0.020535f, 0.041299f, -0.035849f, -0.049934f, -0.038917f, -0.025928f, -0.019587f, -0.039085f, 0.024074f, -0.002952f, 0.023011f, 0.017611f, 0.002408f, 0.040522f, -0.021696f, -0.009626f, -0.040912f, 0.013376f, 0.021311f, -0.003700f, -0.004003f, 0.011965f, -0.039321f, 0.001109f, -0.014248f, 0.007116f, -0.019165f, -0.027096f, 0.015812f, -0.001122f, -0.011542f, -0.004600f, 0.018649f, -0.015365f, 0.009432f, -0.014333f, 0.010797f, 0.009386f, + -0.005954f, -0.014240f, 0.008289f, 0.009180f, -0.029171f, 0.011567f, -0.007789f, -0.008860f, -0.009308f, 0.005766f, -0.019116f, -0.008752f, 0.060267f, -0.016122f, -0.113780f, -0.032538f, 0.093754f, -0.012992f, 0.020958f, 0.013338f, 0.017564f, 0.032800f, 0.026949f, 0.009355f, -0.018487f, -0.006924f, 0.004745f, -0.020294f, -0.004618f, 0.034386f, -0.030708f, -0.018388f, -0.030776f, -0.007443f, 0.005438f, 0.003916f, 0.008313f, 0.016050f, -0.023357f, 0.020893f, 0.051453f, -0.000973f, -0.029791f, 0.002689f, -0.019432f, -0.006801f, 0.030602f, -0.032150f, 0.003809f, 0.010104f, 0.037400f, 0.053860f, -0.034087f, -0.019601f, 0.021078f, 0.002839f, 0.006097f, 0.006219f, -0.022526f, -0.058116f, -0.010164f, -0.027069f, 0.053068f, -0.100385f, -0.065756f, -0.027194f, -0.010708f, 0.028964f, 0.006308f, -0.035457f, -0.005733f, -0.040846f, -0.043846f, -0.015813f, -0.031634f, 0.005784f, 0.026411f, 0.120618f, 0.022609f, -0.017965f, -0.077373f, -0.063852f, 0.019185f, -0.001994f, -0.072608f, 0.039294f, 0.039382f, -0.074161f, -0.001125f, 0.019236f, 0.021672f, 0.079880f, 0.035380f, 0.016647f, -0.078718f, -0.040789f, + -0.054226f, 0.049553f, -0.004711f, -0.016324f, -0.008535f, 0.015413f, 0.052630f, 0.044350f, -0.023092f, -0.046950f, -0.068180f, 0.016535f, 0.040841f, -0.014384f, -0.006690f, 0.035593f, 0.020741f, 0.031005f, 0.008223f, 0.010976f, -0.026024f, -0.007998f, -0.012104f, 0.013329f, 0.014416f, -0.003835f, -0.005727f, -0.004082f, 0.019326f, 0.021094f, -0.030655f, 0.017846f, 0.014077f, 0.025512f, -0.016024f, -0.011612f, 0.016567f, 0.005515f, -0.021983f, -0.002536f, 0.026855f, 0.004801f, -0.019012f, -0.039910f, -0.135071f, 0.019152f, 0.020840f, -0.004591f, -0.002282f, -0.010521f, -0.038959f, 0.015122f, -0.008669f, 0.068710f, -0.071160f, -0.014639f, 0.072411f, -0.003491f, -0.049169f, -0.006182f, 0.042662f, 0.051891f, 0.031826f, -0.009514f, 0.037099f, -0.028334f, 0.025008f, -0.011614f, -0.009810f, -0.024546f, 0.040646f, 0.027594f, -0.026832f, -0.012456f, -0.004086f, 0.041212f, -0.004112f, 0.004196f, -0.026806f, 0.027697f, 0.017904f, -0.030888f, 0.055419f, 0.002267f, -0.050270f, 0.043972f, -0.054597f, -0.028913f, 0.049270f, -0.105896f, -0.067583f, 0.057208f, -0.036735f, 0.042347f, -0.067234f, 0.014693f, + 0.024327f, -0.037079f, 0.001160f, -0.003154f, -0.069389f, -0.016298f, 0.071150f, 0.075110f, -0.085997f, -0.028722f, 0.025919f, -0.069007f, 0.088518f, 0.088643f, 0.012483f, -0.127506f, -0.067043f, 0.135056f, -0.071733f, -0.014519f, 0.109503f, -0.064654f, -0.131627f, -0.029739f, 0.118424f, -0.025797f, -0.086857f, -0.021535f, -0.158364f, -0.007463f, 0.127872f, -0.046925f, -0.128049f, -0.013229f, -0.036120f, -0.017458f, 0.037835f, -0.004781f, -0.001712f, -0.046809f, -0.030682f, -0.015071f, 0.051020f, -0.065248f, 0.003001f, 0.010225f, -0.020564f, 0.002084f, 0.060769f, -0.039216f, -0.049213f, -0.006693f, 0.016988f, 0.038048f, -0.015403f, 0.019052f, 0.028963f, 0.003150f, -0.044446f, -0.023805f, 0.000822f, -0.035466f, -0.017326f, 0.067316f, -0.025653f, -0.066047f, -0.017837f, 0.038230f, 0.015716f, -0.005165f, 0.008365f, -0.059739f, -0.034517f, 0.045188f, 0.067035f, 0.007988f, -0.050007f, -0.024498f, 0.001977f, 0.017633f, 0.033519f, -0.019672f, -0.074646f, -0.070449f, -0.002155f, -0.088781f, -0.026442f, -0.038046f, -0.035765f, -0.027185f, 0.057098f, -0.006796f, -0.018676f, -0.024725f, 0.010933f, -0.031490f, + -0.073933f, 0.056569f, 0.017678f, 0.048810f, 0.015167f, 0.050503f, -0.020544f, -0.031940f, 0.011033f, -0.053737f, 0.041137f, -0.048703f, -0.010482f, 0.031399f, -0.036901f, -0.008140f, -0.022517f, -0.058847f, 0.008535f, -0.044520f, -0.032125f, -0.038885f, -0.028815f, -0.017968f, -0.039475f, 0.006564f, 0.043175f, -0.029737f, -0.010753f, 0.005043f, 0.039761f, -0.018559f, 0.013899f, -0.041365f, 0.066404f, 0.020577f, 0.028307f, 0.017997f, 0.063672f, -0.004020f, -0.075480f, 0.016336f, 0.026999f, -0.021133f, -0.000550f, 0.039352f, -0.052605f, -0.052079f, -0.061006f, 0.052210f, 0.015217f, -0.074847f, 0.028769f, -0.049455f, -0.009955f, -0.069838f, 0.030499f, 0.049333f, 0.009909f, -0.077323f, 0.042994f, 0.035678f, -0.010205f, -0.067961f, 0.017949f, -0.041042f, -0.014386f, -0.003045f, -0.021097f, 0.033523f, -0.030718f, -0.055100f, 0.026927f, -0.012348f, 0.022704f, -0.000361f, -0.002477f, -0.000408f, -0.015371f, -0.017175f, 0.011191f, 0.049093f, -0.006432f, -0.069414f, -0.019659f, 0.028863f, -0.034766f, -0.014627f, 0.032833f, -0.012560f, -0.005275f, -0.027745f, 0.053926f, 0.031980f, -0.016556f, 0.024493f, + -0.004868f, 0.011024f, 0.043628f, -0.007971f, -0.039205f, 0.016205f, 0.024665f, -0.019902f, 0.031270f, -0.005087f, 0.019076f, 0.002338f, -0.014955f, 0.026644f, 0.038086f, -0.022048f, -0.041290f, 0.016042f, 0.024445f, -0.019964f, -0.004658f, 0.023360f, 0.007443f, 0.065779f, 0.123501f, -0.029616f, 0.061282f, 0.012000f, -0.029085f, -0.055073f, -0.032081f, 0.071884f, -0.023458f, 0.013430f, 0.027930f, -0.007156f, 0.066242f, -0.009636f, 0.051998f, 0.054383f, -0.066561f, 0.034442f, -0.017385f, 0.001726f, 0.024499f, 0.020389f, -0.002211f, 0.010940f, 0.019839f, 0.066569f, 0.068388f, 0.052838f, -0.038530f, -0.013037f, -0.090775f, -0.002611f, 0.021508f, 0.041128f, 0.009510f, -0.075015f, 0.032976f, -0.044968f, 0.058360f, -0.052519f, -0.036784f, 0.003953f, -0.044026f, -0.007408f, -0.025400f, 0.089915f, -0.049012f, -0.023857f, -0.094031f, -0.030440f, -0.049349f, 0.132998f, 0.080793f, -0.027822f, -0.089451f, -0.095774f, -0.056984f, 0.066257f, 0.086259f, 0.043901f, 0.012746f, -0.114947f, -0.053431f, 0.038033f, 0.032341f, 0.005203f, 0.041675f, -0.023691f, -0.075771f, 0.036077f, -0.128565f, 0.140064f, + -0.013062f, -0.090196f, 0.210386f, 0.030390f, 0.073221f, 0.126306f, -0.208832f, -0.150244f, 0.041691f, -0.012176f, 0.031937f, 0.045966f, -0.130557f, -0.009435f, 0.026356f, 0.002863f, 0.109377f, 0.008002f, -0.057276f, -0.005738f, 0.058787f, -0.033876f, 0.025679f, 0.030465f, 0.001191f, -0.023668f, 0.028743f, -0.075763f, 0.058011f, -0.014576f, -0.024231f, 0.033013f, 0.008699f, 0.002594f, 0.034347f, -0.007857f, 0.020558f, -0.003946f, 0.013178f, -0.009658f, -0.039973f, 0.024504f, 0.016834f, 0.023188f, -0.000283f, 0.000952f, 0.015647f, 0.009010f, 0.006034f, 0.046758f, 0.051569f, 0.003241f, 0.033766f, -0.031543f, 0.004730f, -0.020620f, 0.039049f, 0.035979f, 0.005436f, -0.010048f, -0.023594f, -0.054880f, 0.004525f, -0.054683f, 0.037013f, -0.077255f, 0.047830f, -0.031786f, 0.078486f, -0.035384f, -0.003646f, 0.044726f, 0.007954f, 0.003943f, -0.020230f, -0.017494f, 0.002043f, -0.030029f, 0.033116f, -0.003828f, 0.035165f, -0.027537f, -0.027186f, 0.009293f, 0.001384f, -0.027913f, 0.017617f, -0.003478f, 0.015374f, -0.008533f, -0.007562f, 0.014749f, -0.014029f, -0.001085f, 0.010951f, -0.005638f, + -0.006700f, 0.055751f, -0.003833f, -0.018578f, -0.009981f, 0.026516f, -0.002424f, -0.030256f, 0.016093f, 0.032666f, 0.006577f, 0.000865f, -0.019297f, 0.006936f, -0.015631f, 0.015031f, 0.039582f, -0.013961f, 0.018092f, -0.014828f, -0.004463f, -0.016249f, -0.007748f, 0.010550f, 0.012791f, -0.023027f, 0.013928f, 0.004254f, -0.002959f, -0.023017f, 0.003951f, 0.008532f, -0.017167f, 0.024989f, 0.020838f, -0.041667f, 0.010654f, -0.038231f, -0.043630f, 0.030125f, -0.015551f, 0.036361f, 0.019701f, 0.001241f, 0.018529f, -0.005642f, -0.022525f, -0.005227f, 0.001322f, 0.025395f, -0.011412f, 0.007891f, 0.010371f, -0.014346f, -0.002669f, 0.008930f, -0.004412f, -0.002635f, 0.014578f, 0.000001f, 0.005571f, -0.011867f, 0.004997f, -0.001060f, -0.012449f, 0.023694f, 0.002037f, 0.019378f, -0.009413f, 0.015950f, -0.007929f, 0.001298f, -0.012411f, 0.010733f, -0.006047f, 0.023482f, -0.007289f, 0.022221f, -0.022675f, 0.005220f, 0.001453f, -0.004548f, 0.000747f, 0.002981f, 0.017475f, -0.000553f, -0.020633f, 0.013842f, -0.011647f, 0.002424f, 0.012449f, -0.012528f, 0.021791f, -0.045377f, 0.096115f, 0.018204f, + 0.023680f, -0.012130f, 0.008873f, -0.002717f, 0.018285f, 0.005814f, 0.041020f, 0.002888f, -0.022110f, 0.013550f, -0.014393f, 0.006382f, 0.008480f, -0.018712f, 0.001095f, 0.004606f, -0.020202f, 0.018585f, 0.004853f, -0.008260f, 0.025000f, -0.008826f, 0.009944f, -0.007541f, 0.004744f, 0.004823f, 0.002383f, -0.003054f, -0.007254f, -0.003323f, 0.003594f, 0.000693f, -0.004039f, -0.012031f, 0.009151f, -0.008054f, 0.004623f, 0.008032f, -0.008171f, 0.001840f, -0.007623f, 0.002302f, -0.012159f, -0.019817f, 0.020667f, -0.010954f, -0.005207f, 0.008805f, 0.004130f, -0.003424f, 0.002457f, 0.017752f, -0.019357f, 0.008516f, -0.007221f, 0.015392f, -0.016249f, 0.009405f, 0.004709f, -0.002796f, 0.003703f, 0.000479f, 0.000342f, 0.007583f, -0.010232f, 0.005926f, 0.005252f, -0.002711f, -0.000893f, 0.013472f, -0.001938f, 0.004654f, -0.015400f, 0.021033f, -0.016112f, -0.000149f, 0.010595f, -0.009348f, 0.007271f, 0.002440f, 0.002648f, -0.009778f, 0.008099f, 0.008399f, -0.005089f, 0.003387f, 0.004246f, -0.006937f, 0.002600f, 0.003566f, -0.001401f, 0.007389f, 0.000446f, -0.000059f, -0.000661f, 0.006644f, + 0.005164f, -0.004044f, 0.005806f, -0.002818f, 0.002669f, 0.002984f, -0.000591f, 0.008239f, -0.003544f, 0.000168f, 0.005311f, -0.006319f, 0.000635f, -0.000543f, -0.004426f, 0.000754f, 0.004766f, -0.001265f, -0.003701f, 0.008209f, -0.005056f, 0.018169f, -0.085318f, -0.211811f, 0.045761f, 0.176141f, 0.119073f, 0.248437f, -0.081247f, -0.069457f, -0.142926f, -0.228440f, -0.022571f, 0.071204f, 0.093868f, 0.122498f, 0.061767f, 0.006775f, -0.020017f, -0.052964f, -0.075531f, -0.011445f, -0.020168f, 0.007439f, 0.017351f, -0.000900f, 0.004369f, 0.009133f, 0.004065f, 0.029915f, 0.035536f, 0.022075f, -0.004060f, 0.004102f, -0.026273f, -0.055161f, -0.058765f, -0.028828f, -0.038538f, 0.031746f, 0.058540f, 0.062108f, 0.068212f, 0.037367f, -0.011010f, -0.026939f, -0.050102f, -0.052960f, -0.036773f, -0.020714f, -0.002359f, 0.013359f, 0.025737f, 0.027591f, 0.023245f, 0.019992f, -0.003408f, 0.005362f, -0.005889f, 0.002636f, -0.004417f, -0.002755f, -0.001560f, -0.018794f, -0.019643f, -0.014273f, -0.029623f, 0.000018f, -0.005548f, 0.003715f, 0.050488f, 0.066438f, 0.022479f, 0.022499f, -0.018185f, -0.036552f, + -0.025203f, -0.044009f, -0.035276f, 0.012426f, -0.002980f, -0.021349f, 0.016447f, 0.017530f, 0.020996f, 0.049718f, 0.020764f, 0.021793f, 0.005496f, -0.026815f, -0.026330f, -0.021640f, -0.023510f, -0.029890f, -0.025420f, -0.015222f, 0.004779f, 0.033189f, 0.050156f, 0.046853f, 0.019099f, 0.009437f, -0.012120f, -0.022738f, -0.020321f, -0.022538f, -0.025886f, -0.011924f, -0.010716f, -0.000929f, 0.008875f, 0.006694f, 0.020308f, 0.026764f, 0.019505f, 0.013177f, 0.004775f, -0.001739f, -0.012576f, -0.013179f, -0.020352f, -0.023095f, -0.017985f, -0.016211f, -0.003951f, 0.017159f, 0.025872f, 0.027664f, 0.024779f, 0.009978f, 0.004716f, -0.012431f, -0.019465f, -0.010533f, -0.014339f, -0.019795f, -0.014752f, 0.002645f, 0.013588f, 0.012514f, 0.007260f, 0.007931f, 0.007420f, 0.005456f, 0.001834f, -0.001491f, -0.001901f, -0.005353f, -0.006562f, -0.006374f, -0.007128f, -0.008736f, -0.004519f, 0.003454f, 0.006645f, 0.007334f, 0.004841f, 0.002075f, 0.000634f, 0.000526f, 0.000558f}, + {-0.011968f, 0.001523f, 0.003811f, 0.003691f, 0.018853f, 0.005127f, 0.003987f, -0.005577f, 0.000728f, -0.009551f, 0.002249f, 0.008786f, -0.004447f, 0.000426f, -0.001847f, -0.004698f, -0.007569f, 0.005856f, -0.012665f, -0.006388f, -0.006354f, 0.006879f, 0.007534f, 0.003974f, 0.001807f, 0.005459f, 0.004508f, 0.009012f, -0.003123f, 0.003160f, 0.005607f, 0.001197f, 0.001851f, -0.006559f, -0.002824f, -0.002738f, -0.002466f, 0.006096f, -0.011650f, 0.001958f, -0.004033f, 0.012224f, 0.000298f, -0.002190f, -0.003058f, -0.005026f, -0.001671f, -0.005246f, -0.015367f, -0.004856f, -0.003004f, -0.002473f, -0.003442f, 0.001600f, -0.002875f, -0.000713f, -0.000985f, 0.005394f, 0.002413f, -0.000685f, 0.003444f, -0.003000f, 0.006605f, -0.004313f, -0.007151f, 0.006925f, 0.007253f, -0.003120f, -0.006868f, 0.000672f, 0.003771f, 0.002854f, 0.003278f, -0.003242f, 0.000045f, 0.002670f, 0.003590f, 0.001578f, -0.000981f, 0.000451f, 0.004461f, 0.008599f, 0.004162f, -0.001048f, -0.000099f, -0.002023f, -0.002148f, 0.001807f, -0.002830f, 0.001756f, 0.002124f, -0.000820f, -0.000276f, 0.000950f, 0.000828f, -0.000851f, + 0.000719f, 0.000503f, -0.003940f, 0.000638f, 0.000311f, 0.001236f, 0.000705f, -0.001496f, 0.001429f, 0.001140f, -0.000099f, 0.017054f, -0.003188f, -0.001630f, 0.001833f, 0.004707f, -0.012563f, 0.007827f, -0.014912f, -0.000671f, -0.007217f, -0.001060f, -0.004769f, -0.001125f, -0.001159f, 0.007498f, -0.006315f, 0.008121f, -0.008461f, -0.009245f, 0.003923f, 0.012411f, -0.014624f, -0.004061f, -0.007071f, 0.000105f, -0.003676f, 0.003957f, 0.005252f, 0.002655f, 0.005350f, -0.008499f, 0.000315f, 0.011934f, 0.004693f, 0.001522f, -0.008656f, -0.012371f, -0.007440f, 0.001901f, -0.006324f, -0.003572f, 0.002424f, 0.008038f, -0.007236f, -0.007132f, 0.002898f, -0.005214f, 0.009235f, 0.003094f, -0.000943f, 0.006510f, 0.006187f, -0.000005f, 0.010379f, 0.005134f, 0.003255f, 0.002751f, 0.006807f, 0.010708f, -0.007043f, 0.002049f, 0.002949f, -0.007525f, 0.000677f, 0.006117f, -0.002372f, 0.015464f, -0.004768f, -0.004101f, -0.003212f, 0.005704f, 0.007875f, -0.010026f, -0.004078f, 0.002732f, -0.001813f, 0.002464f, 0.000976f, -0.004393f, 0.001968f, 0.000940f, -0.003230f, -0.005314f, 0.002197f, 0.001492f, + 0.004882f, 0.000411f, 0.001511f, 0.002239f, -0.000212f, -0.001595f, 0.003580f, 0.000214f, -0.000009f, 0.003080f, -0.001665f, 0.001492f, 0.004114f, -0.000346f, -0.000883f, 0.000778f, -0.000609f, 0.001269f, -0.002512f, -0.000789f, -0.001167f, 0.000167f, -0.000378f, 0.001608f, 0.000175f, -0.001574f, 0.000075f, -0.021921f, -0.003564f, -0.004901f, -0.003921f, -0.001980f, -0.002698f, 0.011634f, 0.013912f, -0.003201f, 0.011349f, 0.004316f, -0.006300f, 0.002942f, -0.009539f, 0.001659f, 0.001999f, -0.012823f, -0.001911f, 0.001967f, 0.002221f, 0.008832f, -0.001721f, 0.007668f, -0.005171f, -0.009843f, -0.010384f, -0.002991f, -0.005262f, -0.007889f, 0.008125f, -0.003217f, -0.001590f, -0.001451f, 0.001685f, 0.004405f, -0.012576f, 0.000022f, 0.001737f, -0.005981f, 0.014953f, 0.001144f, -0.003707f, -0.003273f, 0.015967f, -0.001171f, 0.002015f, 0.009425f, 0.000266f, 0.005749f, 0.002235f, 0.000505f, 0.008805f, -0.000080f, -0.006185f, 0.007887f, 0.004233f, 0.005056f, 0.007162f, 0.002342f, -0.005840f, 0.004119f, 0.005875f, 0.005687f, 0.008821f, 0.000022f, -0.008194f, -0.006572f, 0.010347f, 0.014388f, + -0.013173f, 0.002612f, -0.003495f, -0.002352f, 0.003009f, 0.005474f, 0.005273f, -0.004242f, -0.001705f, -0.004101f, -0.006800f, -0.005968f, -0.002192f, -0.003807f, -0.005846f, 0.001296f, -0.001604f, 0.002179f, 0.001873f, -0.001848f, 0.001036f, 0.000321f, -0.004752f, 0.001563f, -0.003217f, -0.005795f, 0.000374f, -0.001736f, -0.002432f, -0.002625f, -0.000748f, 0.001002f, -0.000889f, 0.001620f, -0.001119f, -0.001985f, -0.002682f, -0.002509f, -0.001074f, 0.000399f, 0.001891f, -0.016105f, 0.017208f, 0.015944f, 0.012024f, -0.008353f, 0.009404f, 0.016966f, -0.004243f, 0.013264f, 0.005003f, 0.002012f, -0.002044f, 0.014623f, 0.006919f, -0.003394f, -0.010454f, 0.006098f, -0.004322f, -0.005574f, 0.005932f, 0.007012f, 0.003081f, -0.010369f, 0.001703f, 0.009361f, -0.004538f, 0.003193f, -0.020433f, 0.002974f, -0.001631f, 0.009881f, 0.002424f, -0.004213f, -0.006152f, 0.012638f, -0.010841f, 0.000910f, -0.008754f, 0.001056f, -0.002673f, 0.007075f, -0.001457f, -0.002264f, -0.010731f, -0.002544f, -0.001884f, 0.013371f, 0.000675f, -0.012167f, -0.000442f, -0.000640f, 0.004180f, 0.006413f, -0.005421f, 0.000059f, + -0.006920f, 0.007430f, -0.001615f, 0.008973f, -0.004816f, 0.013342f, 0.006614f, -0.014647f, 0.015566f, -0.002206f, -0.010746f, 0.001868f, 0.014223f, 0.002927f, 0.002192f, -0.011461f, -0.000748f, -0.004417f, -0.006214f, -0.005985f, 0.000549f, 0.005462f, 0.007002f, 0.003845f, 0.003827f, -0.004448f, 0.003378f, -0.003849f, -0.000444f, -0.000167f, -0.001797f, -0.000706f, 0.004046f, -0.006352f, 0.001741f, -0.000582f, 0.000560f, 0.002192f, 0.001746f, -0.000129f, 0.002779f, 0.000348f, -0.004211f, -0.004514f, 0.002676f, 0.001278f, -0.000185f, -0.002965f, -0.000597f, 0.000771f, -0.000409f, -0.001270f, -0.002937f, 0.001896f, -0.000053f, -0.001782f, 0.002032f, -0.001171f, -0.000808f, -0.002296f, -0.001445f, -0.000837f, -0.002971f, 0.002133f, 0.018517f, -0.006438f, -0.013489f, -0.000749f, -0.020206f, -0.000072f, -0.017370f, -0.006072f, 0.011858f, -0.012407f, -0.013685f, 0.004035f, 0.001082f, 0.001172f, -0.003245f, -0.004518f, -0.009920f, 0.006631f, -0.019364f, -0.005989f, 0.001908f, 0.011924f, 0.000655f, 0.012099f, 0.004269f, 0.026643f, 0.010174f, -0.000328f, 0.001125f, 0.012665f, -0.003087f, -0.003852f, + -0.002439f, 0.002062f, -0.008464f, -0.004225f, -0.014235f, -0.001037f, -0.006568f, -0.003950f, 0.017420f, 0.000241f, 0.010879f, -0.004422f, 0.004406f, -0.001145f, 0.006469f, -0.002223f, 0.006018f, -0.006043f, -0.007486f, -0.001237f, 0.002048f, -0.007543f, -0.007557f, 0.000623f, 0.003806f, 0.008081f, -0.001224f, -0.003834f, -0.001709f, 0.007667f, 0.013079f, 0.000686f, -0.009001f, -0.012834f, 0.000128f, 0.003478f, 0.001285f, 0.017427f, -0.011003f, -0.000631f, 0.007764f, -0.002927f, -0.009226f, 0.012272f, 0.005581f, 0.002149f, -0.006150f, -0.006612f, -0.010998f, -0.004324f, -0.001231f, -0.005711f, -0.002900f, -0.004952f, 0.000877f, 0.001235f, 0.002677f, 0.000315f, 0.000751f, -0.006138f, -0.003218f, -0.006578f, -0.002334f, -0.001925f, -0.005046f, -0.003204f, 0.001655f, -0.000615f, -0.002169f, -0.000601f, 0.001560f, -0.004131f, 0.001991f, -0.002989f, -0.000400f, -0.001266f, -0.002301f, -0.000820f, -0.000118f, 0.001813f, -0.002953f, -0.004327f, 0.002160f, 0.001122f, 0.016567f, -0.012773f, -0.002622f, 0.001024f, -0.001019f, -0.000508f, -0.010516f, -0.008111f, -0.001160f, 0.006924f, 0.002505f, 0.002757f, + 0.002905f, 0.007277f, -0.001526f, 0.006651f, 0.005401f, -0.017300f, -0.006652f, -0.020298f, 0.005235f, -0.007178f, 0.010175f, -0.006609f, -0.008963f, -0.006605f, 0.005281f, -0.013547f, -0.011240f, 0.015640f, -0.008584f, 0.016961f, -0.004037f, 0.005067f, -0.006005f, -0.011508f, 0.012609f, -0.009770f, -0.010924f, -0.001148f, -0.005947f, -0.012876f, -0.009883f, -0.016222f, 0.000658f, 0.010333f, 0.005974f, -0.006343f, 0.017948f, 0.006522f, -0.006605f, -0.008406f, -0.012997f, 0.000503f, -0.004873f, -0.009154f, -0.004587f, -0.003922f, -0.006404f, 0.003353f, 0.014364f, -0.000938f, 0.000942f, -0.009800f, 0.004571f, 0.004794f, -0.008465f, -0.006793f, 0.003437f, 0.017391f, 0.006962f, -0.004407f, -0.002310f, -0.003745f, -0.017980f, -0.014233f, -0.011935f, 0.012420f, 0.013287f, -0.002008f, -0.006202f, 0.005730f, -0.003957f, 0.005021f, -0.002641f, 0.002336f, 0.000419f, 0.000183f, -0.005826f, 0.003826f, -0.003405f, -0.002530f, -0.000911f, 0.003414f, 0.002627f, -0.000427f, -0.004862f, 0.003013f, -0.000701f, 0.002191f, -0.001642f, -0.001164f, -0.004290f, -0.001959f, -0.000150f, -0.000609f, 0.000841f, 0.000752f, + -0.000539f, 0.000652f, -0.003556f, 0.001523f, 0.000362f, 0.000437f, -0.001279f, 0.004348f, 0.002830f, -0.000269f, -0.001736f, 0.000356f, -0.002699f, 0.004927f, 0.023847f, -0.004498f, -0.000028f, -0.003897f, 0.015529f, 0.014722f, 0.005096f, -0.024500f, -0.004059f, -0.029760f, 0.017649f, 0.007463f, 0.000516f, 0.030766f, 0.014570f, -0.002682f, -0.013751f, 0.012694f, -0.005867f, 0.003167f, 0.004335f, 0.002022f, 0.010108f, -0.008930f, 0.017259f, 0.006580f, 0.001713f, -0.005190f, -0.008725f, 0.011709f, 0.009888f, -0.001871f, 0.006445f, -0.014637f, 0.002793f, -0.019553f, 0.008030f, 0.001132f, 0.010035f, -0.016051f, 0.003383f, -0.005223f, 0.003602f, 0.018324f, 0.015551f, 0.000762f, 0.004535f, -0.011340f, 0.014996f, 0.000455f, 0.031856f, 0.033651f, -0.004410f, -0.008936f, -0.009105f, -0.007246f, -0.019437f, -0.005419f, -0.025400f, 0.001575f, -0.002071f, -0.001382f, -0.005133f, 0.008978f, 0.015109f, 0.023618f, 0.021980f, 0.016918f, -0.027698f, -0.019765f, -0.000806f, 0.001431f, 0.029186f, -0.020470f, 0.015713f, -0.001055f, -0.005814f, -0.002966f, -0.000645f, -0.005728f, -0.016060f, -0.010509f, + -0.002968f, 0.004761f, 0.001587f, -0.000363f, -0.004325f, 0.002587f, -0.005642f, -0.000510f, -0.002963f, 0.006224f, 0.006973f, -0.001621f, -0.001232f, 0.006477f, 0.004984f, 0.000874f, -0.000872f, 0.002408f, 0.000496f, 0.001017f, -0.001174f, 0.002828f, -0.000134f, -0.001570f, -0.002511f, 0.000867f, 0.002843f, 0.004174f, 0.008974f, 0.006974f, -0.003283f, 0.000891f, -0.006233f, -0.001135f, 0.002912f, -0.000459f, -0.001165f, 0.000232f, 0.001379f, -0.008601f, 0.017131f, 0.003697f, -0.012615f, -0.006964f, 0.032154f, 0.031620f, 0.035436f, -0.003454f, -0.001469f, -0.006005f, 0.005985f, 0.017350f, 0.019961f, 0.005813f, -0.008533f, -0.017022f, -0.034643f, 0.010311f, -0.020481f, -0.004472f, -0.002057f, -0.004410f, 0.002379f, -0.001005f, -0.006322f, -0.000735f, -0.020057f, -0.007933f, 0.001255f, -0.003689f, -0.022416f, -0.009445f, 0.001976f, 0.016356f, -0.004559f, 0.000503f, -0.017830f, -0.006001f, 0.000276f, 0.011878f, -0.007196f, 0.007316f, -0.019929f, -0.005535f, 0.004717f, 0.007618f, -0.005410f, 0.026880f, -0.005447f, -0.003372f, -0.013908f, -0.004580f, 0.010885f, 0.003711f, -0.001151f, 0.014037f, + 0.019477f, 0.022661f, -0.003910f, -0.011301f, -0.012766f, 0.000210f, 0.002763f, 0.005336f, -0.009034f, 0.007327f, 0.009721f, 0.008133f, 0.007996f, 0.022657f, 0.015359f, 0.010136f, -0.001125f, 0.005115f, -0.022443f, -0.004202f, 0.002465f, 0.011558f, 0.018342f, -0.003440f, -0.010209f, 0.003235f, 0.006379f, -0.005253f, 0.009449f, 0.007524f, 0.010209f, 0.001585f, 0.004520f, -0.000467f, -0.000703f, -0.007303f, 0.005825f, -0.002273f, 0.003863f, 0.003356f, 0.001166f, 0.005374f, 0.000579f, 0.008642f, 0.006203f, 0.003915f, 0.002545f, 0.002439f, 0.000131f, -0.001106f, 0.000812f, -0.003595f, -0.000143f, -0.004498f, -0.007135f, -0.002880f, 0.001617f, 0.001271f, 0.003270f, -0.001483f, 0.002193f, -0.002981f, 0.001482f, 0.003827f, -0.032790f, 0.040925f, -0.001098f, 0.006065f, 0.022403f, 0.000455f, -0.007790f, 0.001233f, -0.039825f, -0.024202f, -0.011355f, 0.006437f, -0.007808f, 0.004623f, -0.018602f, 0.012979f, -0.006471f, -0.000102f, 0.024645f, -0.023918f, -0.015922f, 0.023096f, -0.007178f, -0.033659f, 0.002428f, -0.020724f, 0.004333f, -0.001652f, 0.012669f, 0.005518f, 0.006402f, 0.002648f, + -0.004043f, 0.015074f, -0.001643f, 0.019345f, 0.011804f, -0.006770f, -0.011533f, -0.010756f, 0.005269f, -0.005244f, 0.005300f, 0.003810f, 0.011363f, 0.003394f, -0.021270f, 0.001342f, 0.007254f, -0.007275f, 0.000922f, -0.014598f, -0.003245f, 0.001382f, 0.000975f, 0.033800f, -0.005875f, 0.024043f, 0.028681f, -0.007799f, 0.015358f, -0.004632f, -0.000834f, -0.015861f, 0.010138f, 0.024473f, 0.017050f, 0.003877f, 0.006704f, 0.015204f, -0.000982f, 0.012617f, -0.005095f, -0.006909f, -0.012166f, 0.006726f, 0.031158f, 0.007060f, -0.004028f, 0.002563f, -0.021909f, -0.007320f, 0.000521f, 0.020713f, 0.015046f, 0.006592f, 0.013359f, -0.003746f, 0.013120f, -0.000051f, 0.008252f, 0.001128f, -0.000644f, -0.001493f, 0.009143f, -0.000890f, -0.005773f, -0.003463f, -0.002300f, -0.001314f, -0.002334f, -0.004519f, 0.006595f, -0.004193f, -0.005733f, -0.001571f, -0.007527f, -0.005078f, -0.006429f, -0.003590f, -0.004497f, -0.005660f, 0.001928f, 0.001436f, 0.002431f, 0.002141f, -0.003429f, -0.001680f, -0.005944f, -0.007635f, -0.000732f, -0.004207f, 0.002488f, -0.001967f, 0.000622f, 0.003872f, 0.003920f, 0.002828f, + 0.006759f, -0.001729f, -0.000650f, 0.005273f, 0.039189f, 0.005705f, 0.009772f, -0.009263f, -0.004698f, 0.026621f, -0.017569f, -0.004050f, -0.034576f, 0.032396f, 0.016915f, 0.002344f, -0.011751f, -0.032621f, 0.003297f, -0.008669f, 0.003991f, -0.036577f, 0.013045f, 0.019345f, -0.021273f, -0.005068f, 0.003173f, 0.002272f, 0.007068f, 0.021001f, 0.025805f, 0.000107f, -0.000065f, 0.004865f, 0.000975f, -0.015620f, -0.017909f, -0.011827f, -0.023598f, -0.011572f, 0.020085f, 0.009392f, -0.007530f, -0.009921f, -0.006602f, -0.041415f, 0.008992f, 0.009998f, -0.019423f, 0.031806f, 0.001122f, 0.023736f, -0.008551f, 0.015414f, -0.005092f, -0.020454f, 0.001831f, 0.018923f, -0.010431f, 0.010413f, 0.012095f, 0.033791f, 0.009321f, 0.010657f, 0.032317f, 0.018517f, 0.012223f, -0.044683f, 0.009237f, 0.006911f, 0.008652f, 0.000978f, -0.018288f, 0.032498f, -0.024123f, 0.018568f, 0.019354f, -0.029116f, -0.006414f, 0.040010f, -0.035613f, 0.006111f, -0.008377f, -0.003775f, -0.012858f, 0.015626f, -0.006709f, -0.013201f, -0.011387f, 0.007032f, 0.015067f, -0.014027f, 0.017503f, -0.014477f, -0.006419f, 0.020048f, + 0.007304f, -0.001564f, -0.008836f, -0.009262f, -0.000306f, -0.003623f, -0.015245f, -0.001660f, -0.003290f, -0.004167f, -0.001439f, 0.012087f, -0.001076f, -0.010972f, 0.000968f, 0.004779f, 0.011390f, 0.007262f, 0.009037f, -0.003554f, 0.004742f, -0.006500f, 0.000263f, -0.002140f, 0.004724f, 0.009638f, -0.007110f, 0.004496f, 0.004440f, -0.000396f, 0.002561f, 0.002081f, -0.021163f, -0.031609f, -0.014283f, -0.013543f, -0.042225f, 0.027736f, 0.003830f, 0.029651f, 0.001122f, 0.003772f, -0.015010f, -0.008065f, 0.014128f, -0.001674f, 0.014630f, -0.015678f, -0.005430f, 0.002176f, -0.007444f, -0.012929f, 0.017561f, -0.019048f, 0.021036f, -0.008104f, 0.006442f, -0.005198f, -0.015287f, -0.013727f, 0.005717f, -0.005306f, -0.000761f, 0.010629f, 0.042704f, 0.002591f, -0.006139f, -0.015127f, 0.005629f, 0.034442f, -0.007024f, -0.006218f, -0.020941f, -0.007530f, 0.002336f, -0.019749f, -0.007621f, -0.027961f, 0.017090f, -0.034117f, -0.061387f, -0.006851f, 0.001376f, 0.028527f, -0.030590f, 0.027375f, 0.017572f, -0.014723f, -0.028909f, -0.004991f, 0.004102f, 0.007835f, 0.000469f, 0.017154f, -0.012317f, -0.004848f, + -0.060571f, -0.008467f, 0.061426f, 0.005623f, -0.010961f, -0.008670f, -0.032673f, 0.023734f, -0.010864f, -0.009565f, -0.008464f, -0.005059f, -0.014442f, -0.021118f, 0.005683f, 0.011512f, -0.001132f, 0.008686f, -0.017978f, -0.032361f, -0.001658f, -0.017239f, -0.005330f, 0.000195f, -0.017162f, 0.003488f, -0.012647f, -0.021820f, -0.016349f, -0.008104f, 0.006432f, 0.009436f, -0.002346f, -0.025741f, -0.006822f, 0.001230f, -0.012969f, -0.005940f, -0.001538f, -0.012002f, -0.007297f, 0.002733f, -0.000984f, -0.009518f, -0.004114f, 0.003813f, 0.001083f, -0.012531f, -0.005294f, -0.000117f, 0.010732f, 0.012031f, 0.002872f, -0.004145f, -0.004989f, -0.001860f, 0.007888f, -0.002200f, -0.001278f, 0.000260f, 0.002692f, -0.010591f, 0.009030f, -0.002493f, 0.005942f, 0.029095f, 0.026020f, -0.007946f, -0.010257f, -0.002260f, -0.041056f, 0.027531f, -0.025865f, -0.021248f, -0.016448f, 0.010548f, 0.004423f, 0.025557f, 0.003322f, -0.013516f, -0.015946f, -0.016432f, 0.013240f, -0.006138f, -0.008761f, 0.023394f, 0.025996f, 0.009077f, -0.017152f, 0.021587f, 0.034507f, -0.012803f, -0.007312f, 0.030008f, 0.007831f, 0.006249f, + -0.019175f, 0.000271f, 0.028419f, -0.041349f, 0.028861f, -0.005934f, 0.004063f, 0.017506f, 0.020923f, 0.000138f, 0.010533f, -0.019308f, -0.015861f, 0.011100f, 0.039620f, 0.010896f, 0.009779f, 0.015266f, -0.019767f, 0.004509f, 0.017662f, 0.010463f, -0.003144f, 0.014432f, 0.008901f, -0.023338f, 0.019358f, -0.022735f, 0.005312f, 0.017203f, -0.018212f, 0.014292f, -0.022256f, -0.008569f, 0.004203f, 0.001156f, 0.014398f, -0.008821f, 0.012359f, -0.009025f, 0.001816f, 0.004922f, -0.004088f, -0.008832f, -0.018011f, 0.048692f, 0.005232f, 0.014845f, -0.021013f, -0.048977f, 0.034863f, -0.033188f, -0.014502f, 0.000144f, -0.007715f, -0.004698f, -0.002896f, -0.013526f, 0.008657f, 0.007302f, 0.003741f, -0.012473f, 0.015843f, 0.012509f, -0.005302f, -0.005107f, 0.004664f, -0.004137f, 0.004384f, -0.004175f, 0.016785f, 0.006501f, 0.001547f, 0.012233f, 0.012545f, -0.006974f, 0.000038f, 0.006339f, 0.008699f, 0.003893f, 0.004136f, -0.007590f, -0.010415f, 0.008672f, 0.010785f, 0.016009f, -0.002230f, -0.013940f, -0.002089f, 0.001697f, 0.006980f, -0.021621f, 0.008212f, -0.006958f, -0.003305f, 0.005500f, + 0.005061f, -0.005040f, 0.007537f, 0.001037f, 0.005963f, -0.003113f, 0.014377f, -0.027069f, 0.028908f, -0.010473f, -0.028344f, -0.036789f, -0.010203f, -0.003630f, 0.021809f, -0.032369f, -0.005106f, -0.003694f, 0.017208f, 0.032404f, 0.026869f, 0.016768f, 0.002674f, -0.008152f, -0.004855f, -0.003196f, 0.022851f, 0.018784f, -0.004259f, 0.003076f, -0.004812f, 0.014743f, -0.035159f, 0.021183f, 0.011753f, 0.016608f, 0.005745f, 0.003921f, 0.030575f, -0.011873f, -0.025744f, 0.000262f, -0.008369f, 0.001892f, -0.035763f, -0.019765f, -0.001951f, 0.030144f, -0.020124f, -0.006295f, 0.005108f, -0.001095f, 0.001045f, 0.029627f, 0.012059f, -0.004462f, 0.002783f, 0.014554f, 0.009720f, 0.034497f, -0.009924f, 0.015819f, 0.017686f, 0.009467f, -0.005374f, 0.005740f, -0.037225f, 0.016112f, -0.006793f, 0.001812f, -0.008380f, -0.020487f, -0.027475f, 0.005742f, -0.012989f, -0.037494f, 0.009249f, -0.031841f, -0.023287f, -0.005418f, -0.047950f, -0.029083f, 0.007443f, 0.020659f, -0.023826f, 0.005298f, 0.002155f, 0.055452f, 0.052742f, 0.049648f, -0.001258f, 0.002888f, -0.025815f, -0.015615f, 0.020928f, -0.011078f, + -0.007084f, 0.003522f, -0.006377f, 0.011723f, -0.013997f, -0.006988f, -0.000266f, 0.004516f, -0.008303f, 0.010760f, 0.010974f, 0.000590f, -0.004308f, 0.003057f, 0.010740f, -0.008381f, -0.010930f, -0.002755f, 0.009699f, -0.012642f, 0.021871f, 0.012527f, -0.000702f, 0.009912f, -0.003151f, -0.008832f, -0.013924f, -0.007595f, -0.012307f, -0.006706f, 0.007707f, 0.001435f, 0.022111f, -0.004934f, -0.006625f, -0.048781f, -0.053973f, 0.032211f, 0.028953f, 0.009754f, 0.031368f, 0.052482f, 0.014979f, -0.019930f, 0.016989f, -0.007905f, -0.014725f, 0.024027f, 0.001798f, -0.021415f, 0.013251f, 0.017307f, 0.004059f, 0.006121f, 0.001390f, 0.002712f, 0.048077f, -0.000988f, 0.010353f, 0.004519f, 0.029864f, 0.001799f, 0.047694f, -0.000182f, -0.020881f, 0.038129f, 0.007864f, -0.016804f, -0.005872f, 0.020205f, -0.004100f, -0.000317f, 0.015863f, -0.028922f, 0.028976f, -0.006071f, -0.042244f, -0.011820f, 0.004234f, -0.042280f, -0.004663f, -0.004389f, 0.018687f, 0.018015f, 0.031912f, -0.022295f, 0.004942f, 0.005093f, 0.006707f, 0.013631f, -0.020184f, -0.022820f, 0.012068f, -0.000538f, 0.024420f, 0.019810f, + 0.006206f, 0.050850f, -0.008383f, -0.007786f, -0.034649f, 0.051883f, 0.009261f, 0.036010f, 0.022130f, -0.057843f, 0.008398f, 0.005292f, 0.035575f, -0.018789f, 0.015225f, 0.000354f, -0.015292f, -0.001886f, -0.012338f, 0.028610f, -0.054656f, -0.006628f, -0.003826f, 0.000245f, 0.002582f, 0.008824f, 0.013507f, -0.000170f, 0.025386f, -0.000965f, -0.003515f, -0.008093f, -0.005148f, 0.001658f, -0.008688f, 0.003001f, -0.002295f, 0.007653f, 0.005457f, -0.002587f, 0.002217f, -0.002944f, -0.015171f, -0.000812f, 0.000866f, 0.003888f, -0.015498f, 0.008364f, -0.003109f, 0.008784f, 0.007031f, 0.012404f, -0.012537f, 0.014492f, -0.007771f, 0.004684f, 0.010554f, 0.009450f, -0.003143f, 0.000337f, -0.005601f, 0.008179f, -0.000388f, 0.003984f, -0.000095f, -0.001699f, 0.021179f, 0.011809f, 0.000395f, 0.009762f, 0.003024f, 0.010139f, 0.031944f, -0.067485f, 0.040060f, 0.040762f, -0.017407f, 0.009687f, 0.005656f, 0.011030f, 0.000267f, 0.032456f, -0.023681f, -0.005109f, -0.025406f, -0.000208f, -0.014371f, 0.002293f, 0.006794f, -0.037010f, 0.016621f, 0.040232f, -0.027712f, -0.026506f, -0.027117f, 0.053567f, + -0.023441f, -0.013125f, 0.004935f, -0.018325f, -0.055543f, 0.009782f, 0.040233f, -0.055285f, -0.025118f, 0.019144f, 0.029620f, 0.008090f, -0.008473f, 0.012845f, -0.019689f, -0.009158f, -0.001092f, 0.027434f, -0.037709f, -0.029887f, 0.021175f, 0.034452f, 0.013473f, -0.042939f, -0.013994f, 0.001121f, -0.002074f, -0.007416f, 0.022363f, -0.006609f, 0.033796f, -0.027514f, -0.006104f, 0.000019f, -0.031663f, 0.020086f, -0.036847f, -0.025201f, 0.011634f, -0.016356f, 0.035634f, 0.051757f, 0.030391f, -0.034091f, 0.018008f, -0.009961f, -0.010345f, -0.024029f, -0.007613f, -0.039219f, 0.029961f, 0.022237f, 0.010592f, 0.001293f, -0.018705f, -0.010324f, 0.012047f, -0.040925f, 0.033019f, -0.007706f, -0.005754f, 0.017466f, 0.002979f, 0.015923f, -0.004584f, -0.002340f, -0.014129f, -0.003906f, 0.001228f, 0.002952f, -0.011107f, -0.003708f, -0.005351f, -0.003798f, 0.018509f, 0.002143f, -0.000408f, -0.008738f, 0.007460f, 0.007584f, -0.006712f, 0.004276f, 0.008426f, 0.002091f, 0.014256f, -0.004950f, -0.010208f, 0.002269f, -0.016581f, 0.008713f, 0.006042f, 0.002329f, -0.000612f, 0.006769f, -0.001501f, 0.010932f, + 0.003338f, 0.007851f, -0.013139f, -0.003710f, 0.012057f, 0.000906f, 0.004853f, 0.006459f, -0.012256f, 0.002014f, 0.012391f, 0.039156f, 0.065289f, -0.000498f, -0.049479f, 0.010448f, -0.059035f, 0.010079f, 0.026766f, 0.012569f, 0.003525f, 0.035447f, 0.026198f, -0.001613f, -0.005444f, -0.048804f, -0.026325f, 0.000698f, -0.022868f, 0.066050f, -0.012093f, -0.015006f, -0.028567f, 0.003533f, 0.024812f, 0.017365f, -0.000946f, 0.012752f, 0.019318f, -0.029333f, 0.009989f, 0.056671f, 0.020033f, -0.038931f, -0.027474f, 0.018389f, -0.019286f, -0.002650f, 0.013766f, -0.008644f, -0.032159f, -0.007689f, 0.003851f, 0.054000f, -0.011741f, 0.011982f, -0.014422f, -0.043667f, 0.007590f, 0.054785f, -0.014789f, -0.032870f, 0.009526f, -0.020136f, 0.013368f, -0.011512f, -0.013420f, 0.037649f, -0.009679f, -0.004309f, 0.018380f, -0.032468f, 0.011674f, 0.039846f, -0.016533f, 0.003418f, -0.023399f, 0.070074f, -0.012784f, 0.008350f, 0.022715f, -0.016286f, -0.003928f, -0.018720f, 0.009802f, -0.021153f, -0.017867f, -0.016688f, 0.026825f, -0.036443f, 0.005330f, -0.005402f, -0.010885f, 0.028317f, 0.000623f, -0.009681f, + -0.012041f, 0.001474f, 0.010622f, 0.008262f, -0.016234f, -0.002961f, 0.000723f, -0.004537f, -0.020086f, -0.012085f, -0.003660f, 0.004771f, 0.001611f, 0.001606f, 0.002807f, 0.016341f, -0.016516f, 0.017179f, 0.003391f, 0.004950f, 0.001151f, 0.013616f, -0.007735f, 0.022369f, -0.004930f, -0.000369f, 0.017154f, 0.022469f, -0.011780f, 0.014680f, -0.007362f, 0.004903f, -0.013059f, 0.011342f, 0.009542f, -0.019436f, -0.000984f, -0.007797f, -0.002675f, -0.009739f, 0.007002f, -0.011979f, 0.010732f, -0.019022f, -0.108109f, -0.037872f, -0.001950f, 0.034561f, -0.018122f, -0.054103f, -0.020378f, -0.007917f, 0.026515f, 0.006910f, -0.007218f, -0.026750f, 0.028272f, 0.050198f, -0.022776f, 0.037951f, 0.009525f, -0.071833f, 0.026810f, 0.033737f, -0.011828f, -0.029202f, -0.005468f, 0.044291f, 0.047262f, -0.003901f, -0.035823f, 0.002517f, -0.004082f, -0.004620f, -0.029852f, 0.007397f, 0.013634f, -0.047364f, 0.032714f, 0.027814f, -0.033404f, 0.006210f, -0.037477f, 0.013296f, 0.091635f, -0.081844f, 0.084723f, 0.038345f, 0.003843f, 0.051832f, 0.025768f, -0.052969f, 0.031877f, -0.039822f, -0.008917f, 0.043568f, + 0.002063f, 0.012506f, -0.022231f, -0.038778f, 0.118078f, -0.027703f, 0.001737f, 0.046547f, -0.022438f, 0.009114f, 0.003587f, 0.028775f, 0.066535f, 0.063230f, 0.059848f, 0.003769f, -0.001132f, -0.009580f, 0.003075f, -0.016119f, 0.004528f, 0.050794f, -0.013404f, -0.017563f, 0.005114f, 0.007066f, 0.029504f, 0.034368f, 0.009827f, 0.009671f, 0.024429f, 0.010409f, -0.018583f, 0.006126f, -0.009566f, -0.027527f, -0.012340f, 0.014541f, -0.020736f, -0.029885f, -0.022686f, -0.000996f, 0.002788f, -0.017111f, 0.008855f, 0.019469f, 0.003068f, -0.006233f, -0.001109f, -0.021823f, 0.025972f, -0.003760f, -0.005600f, 0.018003f, -0.014787f, 0.012258f, -0.011055f, -0.008835f, 0.030563f, -0.000051f, -0.022593f, 0.028976f, -0.017702f, 0.017494f, 0.008227f, -0.011284f, 0.008770f, -0.003925f, 0.021124f, -0.009588f, 0.007414f, 0.001105f, 0.001825f, -0.002170f, 0.022483f, -0.011448f, -0.002565f, -0.001555f, 0.004056f, -0.003188f, 0.009844f, 0.027669f, -0.007321f, -0.079779f, 0.036232f, -0.057965f, 0.081494f, 0.009601f, -0.070866f, 0.015965f, 0.000635f, 0.033252f, 0.015706f, -0.017183f, 0.060312f, 0.014688f, + 0.003076f, 0.040234f, -0.032179f, -0.044807f, 0.001480f, 0.023400f, 0.081289f, -0.011476f, 0.000231f, -0.008557f, 0.058595f, 0.006332f, -0.046497f, -0.027548f, 0.008836f, -0.005202f, 0.025961f, -0.045264f, 0.021753f, 0.007322f, 0.013426f, -0.004101f, -0.017629f, 0.010227f, 0.018213f, 0.000119f, 0.054460f, -0.087814f, 0.007716f, -0.031022f, -0.019187f, -0.011400f, -0.064108f, -0.093312f, -0.096452f, -0.070242f, 0.007501f, 0.000265f, -0.055918f, -0.000549f, -0.010140f, 0.005936f, -0.034674f, -0.089926f, 0.088580f, -0.001695f, -0.013006f, 0.017920f, -0.087742f, -0.006151f, -0.021792f, 0.016359f, 0.025866f, 0.120450f, 0.089939f, -0.010209f, -0.001029f, -0.002982f, 0.023762f, 0.036315f, 0.022201f, 0.016486f, -0.003297f, -0.014715f, -0.085347f, 0.015978f, -0.001678f, -0.033483f, -0.014854f, 0.055638f, -0.007758f, -0.010358f, 0.026729f, -0.002442f, 0.029314f, -0.011559f, 0.014771f, -0.001830f, -0.006010f, 0.020436f, 0.025316f, -0.011721f, 0.003647f, 0.010955f, -0.004612f, 0.005041f, 0.001412f, -0.000547f, 0.017332f, -0.007554f, -0.008641f, 0.014000f, -0.016531f, 0.021801f, 0.000004f, 0.011665f, + 0.018512f, -0.009506f, 0.004695f, 0.015723f, -0.003702f, -0.010820f, -0.003743f, 0.001494f, -0.002756f, 0.004066f, -0.021553f, -0.001704f, -0.017033f, 0.017762f, 0.002866f, 0.011839f, 0.008814f, -0.002950f, 0.000722f, -0.001559f, 0.008451f, 0.010888f, 0.009441f, -0.022649f, 0.109770f, -0.104521f, 0.018059f, -0.020022f, 0.004187f, 0.044420f, -0.032182f, 0.011210f, 0.001809f, -0.113090f, 0.002933f, -0.012558f, 0.005623f, 0.013239f, -0.050465f, -0.018710f, -0.083625f, -0.021432f, -0.003968f, 0.004736f, -0.031582f, -0.023670f, -0.036364f, -0.015048f, 0.036308f, 0.008051f, 0.073215f, 0.018064f, -0.024612f, -0.025769f, 0.045030f, -0.049801f, 0.086100f, -0.067022f, 0.019677f, -0.054038f, 0.001225f, 0.051904f, -0.093867f, 0.088706f, 0.015743f, 0.010410f, -0.064425f, -0.012723f, -0.012133f, 0.000184f, 0.031079f, 0.031092f, 0.039092f, -0.074322f, -0.001769f, -0.029111f, -0.025271f, -0.028494f, -0.040051f, -0.027593f, 0.001523f, 0.042870f, -0.045458f, 0.012470f, -0.083795f, -0.027883f, 0.021348f, 0.025191f, 0.004667f, -0.095270f, -0.051532f, -0.033815f, -0.048505f, -0.040076f, 0.003523f, -0.031526f, + 0.050944f, 0.015464f, 0.025604f, -0.017402f, -0.026176f, 0.085366f, -0.028396f, 0.023114f, -0.016951f, 0.006860f, 0.064124f, 0.008803f, 0.011726f, -0.035573f, 0.036525f, 0.021359f, -0.014834f, 0.034004f, -0.025137f, 0.009570f, -0.009196f, 0.023117f, 0.004791f, -0.007352f, 0.012617f, 0.029381f, -0.009722f, 0.009603f, 0.010588f, 0.009010f, -0.003208f, 0.008143f, -0.003902f, 0.020282f, -0.006354f, 0.003644f, 0.019171f, -0.003594f, -0.007078f, 0.006160f, 0.008473f, -0.012670f, -0.002574f, -0.035793f, 0.022972f, 0.015816f, 0.000465f, -0.019685f, -0.007863f, 0.002165f, 0.007920f, 0.027949f, -0.004153f, -0.007155f, 0.009984f, 0.007480f, -0.003755f, 0.028291f, 0.005681f, -0.033595f, 0.009300f, 0.034044f, 0.047696f, -0.088330f, 0.135970f, -0.101449f, -0.010224f, -0.061011f, 0.012643f, 0.001831f, -0.036672f, -0.052120f, 0.062075f, 0.041861f, 0.019852f, -0.026368f, 0.027680f, 0.008920f, 0.058644f, -0.045514f, -0.029881f, 0.036606f, 0.060946f, -0.076621f, 0.031644f, -0.002301f, 0.037152f, -0.027342f, 0.011216f, -0.033725f, 0.007518f, -0.063577f, 0.021482f, 0.069088f, -0.001818f, -0.004845f, + 0.085786f, 0.015287f, -0.038870f, -0.082916f, 0.071742f, -0.037254f, 0.032614f, -0.030178f, 0.085671f, 0.038003f, -0.008903f, 0.009166f, -0.048852f, 0.006990f, 0.021680f, -0.023424f, 0.024269f, -0.102713f, 0.040928f, 0.093910f, 0.073594f, -0.040085f, -0.041523f, -0.041824f, 0.047808f, 0.004211f, -0.014519f, 0.004212f, 0.121262f, -0.058546f, -0.027016f, 0.047146f, -0.039728f, -0.108670f, 0.046825f, 0.024758f, -0.077425f, 0.044104f, 0.075998f, 0.066968f, -0.019830f, -0.029412f, -0.052635f, 0.028870f, -0.032278f, -0.020652f, 0.048966f, 0.033328f, 0.015519f, 0.042847f, 0.024533f, -0.016109f, -0.014764f, -0.054514f, 0.013370f, -0.022715f, 0.019581f, -0.020008f, 0.039708f, 0.027334f, 0.006565f, -0.007041f, 0.037796f, -0.020043f, -0.002282f, 0.005093f, 0.014891f, 0.008905f, 0.017802f, 0.016045f, 0.001908f, -0.008718f, -0.004713f, 0.013497f, 0.007623f, 0.005570f, 0.002469f, 0.021083f, 0.068046f, -0.001809f, -0.004664f, 0.010289f, -0.022747f, 0.008508f, 0.024938f, -0.034542f, 0.015974f, 0.018148f, -0.012604f, -0.009570f, 0.016548f, 0.009074f, -0.019332f, -0.087430f, 0.046632f, -0.005171f, + 0.012142f, -0.032089f, 0.027942f, 0.000518f, 0.015322f, 0.004572f, 0.005074f, -0.018296f, 0.013918f, 0.047198f, -0.060370f, 0.051792f, -0.008852f, -0.031994f, 0.010692f, -0.021811f, 0.014078f, -0.022350f, -0.018223f, 0.015208f, -0.048112f, -0.005100f, 0.064194f, -0.092781f, 0.026185f, 0.004237f, -0.015429f, -0.028656f, -0.033596f, -0.022099f, 0.067388f, -0.055634f, -0.007843f, 0.021536f, -0.056207f, 0.014062f, 0.031025f, 0.020437f, 0.010710f, 0.009495f, -0.031631f, 0.024758f, -0.082696f, 0.000897f, 0.072687f, -0.030602f, -0.007983f, -0.016557f, -0.020283f, -0.000872f, -0.058447f, 0.030777f, 0.023766f, -0.048795f, 0.045703f, 0.012351f, -0.055047f, 0.022407f, -0.010497f, 0.039754f, 0.035196f, -0.051756f, 0.018214f, 0.056750f, -0.053519f, 0.029736f, -0.038021f, 0.029790f, 0.035231f, -0.055003f, 0.031070f, -0.004336f, -0.028626f, 0.041272f, 0.002528f, -0.066106f, 0.020539f, 0.028806f, 0.009183f, -0.018698f, 0.003559f, 0.049369f, -0.022643f, -0.047007f, 0.049962f, -0.002542f, 0.004174f, -0.002610f, -0.005820f, 0.030033f, -0.022315f, -0.011373f, 0.022028f, 0.007791f, -0.004843f, -0.022795f, + 0.033386f, -0.012990f, -0.021075f, 0.001299f, 0.017825f, -0.010834f, -0.007468f, -0.005660f, 0.026251f, -0.020583f, -0.009824f, 0.001321f, 0.014535f, -0.012909f, 0.010607f, -0.001038f, 0.026109f, -0.016701f, 0.004677f, 0.001564f, 0.003168f, 0.044870f, -0.015607f, -0.198215f, -0.436910f, -0.171812f, -0.289616f, -0.395274f, 0.152581f, 0.055748f, 0.132066f, 0.593700f, 0.494953f, 0.327030f, 0.510133f, 0.347351f, 0.043343f, 0.087996f, 0.064316f, -0.268843f, -0.172681f, -0.118327f, -0.307860f, -0.314285f, -0.085536f, -0.086463f, -0.194581f, -0.056680f, -0.040370f, -0.234803f, -0.201615f, -0.064259f, -0.110074f, -0.221678f, -0.052681f, -0.035689f, -0.173254f, -0.018482f, 0.123704f, -0.051064f, -0.040848f, 0.181689f, 0.112204f, -0.071635f, 0.161203f, 0.264671f, 0.031165f, 0.149654f, 0.324449f, 0.159570f, 0.083338f, 0.349824f, 0.256277f, 0.191057f, 0.424394f, 0.573489f, 0.454026f, 0.526990f, 0.682395f, 0.446247f, 0.292730f, 0.383364f, 0.247652f, -0.066689f, -0.015039f, -0.167490f, -0.417786f, -0.591425f, -0.636369f, -0.852434f, -0.969938f, -1.029890f, -0.996240f, -0.957358f, -0.951830f, -0.794754f, + -0.607901f, -0.570375f, -0.371663f, 0.031538f, 0.160057f, 0.207077f, 0.624050f, 0.612434f, 0.422938f, 0.622205f, 0.570427f, 0.310240f, 0.301554f, 0.397390f, 0.241042f, 0.114277f, 0.278441f, 0.284011f, 0.128481f, 0.229757f, 0.346069f, 0.229952f, 0.137516f, 0.294596f, 0.244284f, 0.050237f, 0.150206f, 0.216972f, 0.025543f, 0.042259f, 0.237369f, 0.145671f, 0.079078f, 0.251482f, 0.249334f, 0.091816f, 0.198900f, 0.171828f, -0.043170f, -0.122414f, -0.126897f, -0.293807f, -0.398192f, -0.393268f, -0.454069f, -0.500762f, -0.519297f, -0.508481f, -0.521601f, -0.580279f, -0.600304f, -0.574445f, -0.640849f, -0.548826f, -0.373733f, -0.285945f, -0.097316f, 0.165611f, 0.346888f, 0.507801f, 0.655718f, 0.666493f, 0.570764f, 0.518145f, 0.425676f, 0.321882f, 0.259478f, 0.217868f, 0.175933f, 0.137005f, 0.124075f, 0.114340f, 0.084049f, 0.069875f, 0.061516f, 0.029737f, -0.006509f, -0.029541f, -0.064277f, -0.097353f, -0.102401f, -0.081711f, -0.060102f, -0.044858f, -0.039543f} + }, + { + {-0.007421f, 0.004520f, 0.007240f, -0.002552f, 0.006434f, -0.001045f, 0.006791f, 0.003417f, -0.001493f, -0.002659f, 0.006879f, 0.000582f, 0.001372f, -0.007819f, -0.001254f, -0.000562f, -0.000349f, 0.010692f, 0.005223f, -0.000389f, -0.008021f, -0.005832f, -0.003451f, 0.000980f, -0.000184f, 0.002317f, 0.004915f, 0.001498f, 0.001813f, -0.008094f, -0.001246f, -0.007878f, 0.000316f, -0.004356f, 0.005159f, 0.005153f, -0.002056f, -0.004250f, 0.005393f, 0.001156f, -0.002025f, -0.007283f, -0.000990f, -0.004671f, 0.001307f, 0.004456f, -0.007392f, -0.003606f, -0.001237f, -0.002890f, 0.018863f, 0.004495f, 0.010889f, 0.000794f, 0.003571f, -0.000080f, -0.005453f, -0.005055f, -0.006438f, 0.003042f, -0.005312f, 0.003821f, 0.000117f, 0.004664f, 0.004767f, 0.011584f, 0.003492f, -0.000959f, -0.000590f, -0.006879f, 0.011215f, 0.010323f, 0.001801f, 0.003184f, 0.002920f, 0.003195f, -0.000659f, -0.005759f, 0.001710f, 0.003332f, -0.002170f, 0.000964f, -0.001779f, -0.005264f, 0.002499f, -0.004391f, -0.002989f, -0.001368f, 0.000342f, -0.001965f, -0.002140f, -0.002503f, -0.000064f, -0.000140f, -0.000404f, 0.000504f, + -0.000889f, 0.001673f, -0.000944f, -0.001567f, -0.000164f, 0.002099f, 0.000778f, -0.000864f, -0.002838f, -0.000836f, 0.002599f, 0.000172f, 0.001164f, 0.001030f, 0.026068f, -0.006168f, -0.005454f, -0.002118f, -0.005164f, 0.001196f, -0.012395f, 0.000966f, 0.002467f, 0.000630f, 0.008422f, 0.000964f, -0.001741f, -0.007443f, 0.004764f, -0.010492f, -0.009046f, 0.003265f, -0.004413f, -0.002110f, -0.001565f, 0.001748f, 0.007070f, 0.009677f, 0.000726f, -0.001502f, 0.011503f, 0.004147f, -0.000671f, 0.000419f, -0.004703f, 0.000145f, 0.012626f, 0.000005f, -0.005870f, -0.004747f, -0.001365f, 0.004284f, -0.005845f, -0.007203f, -0.007359f, -0.006020f, 0.005761f, -0.005664f, 0.002154f, -0.006882f, 0.002420f, 0.008331f, 0.000543f, 0.005920f, -0.002519f, -0.004698f, -0.002326f, 0.004107f, -0.000252f, 0.006356f, 0.009295f, 0.001363f, -0.002814f, -0.004810f, -0.000244f, -0.000712f, 0.000424f, 0.000295f, -0.008199f, -0.000866f, -0.003833f, -0.004170f, 0.003970f, 0.000842f, 0.002547f, 0.003018f, -0.009756f, -0.005437f, 0.004040f, -0.001825f, 0.007205f, 0.001309f, 0.006070f, -0.001242f, -0.001552f, -0.001678f, + -0.003535f, -0.000829f, -0.003893f, -0.001565f, 0.000108f, 0.005684f, -0.001375f, -0.000128f, -0.000987f, 0.001801f, -0.000053f, 0.002191f, 0.000435f, -0.000479f, -0.001438f, 0.001765f, -0.002794f, 0.000013f, 0.000143f, -0.001586f, 0.001306f, 0.001672f, -0.002360f, 0.000790f, -0.001167f, 0.001016f, 0.000984f, -0.000007f, 0.001672f, 0.000179f, -0.000874f, -0.018612f, -0.009196f, -0.004034f, -0.012731f, -0.004436f, -0.012223f, 0.003552f, -0.001108f, -0.007629f, -0.008792f, -0.001342f, -0.007189f, -0.000212f, 0.005907f, -0.000488f, -0.010917f, -0.004080f, 0.000123f, -0.004297f, -0.003564f, 0.003107f, 0.010213f, 0.013096f, -0.002155f, -0.003551f, 0.007342f, 0.008349f, -0.002654f, -0.001990f, -0.001710f, -0.005970f, 0.001767f, 0.002692f, -0.005377f, -0.004044f, -0.001281f, 0.005024f, 0.011180f, 0.000690f, -0.003816f, -0.000038f, -0.005693f, -0.002129f, -0.009030f, -0.004276f, -0.004028f, -0.014266f, -0.001549f, -0.006500f, -0.004519f, -0.015658f, 0.009655f, -0.006842f, -0.006064f, 0.002732f, -0.001008f, -0.001170f, 0.002009f, -0.013018f, -0.003406f, -0.004696f, -0.001064f, -0.007537f, -0.001058f, -0.003575f, + 0.003405f, 0.004458f, -0.004257f, -0.002301f, -0.006235f, 0.002152f, -0.000959f, -0.001314f, -0.000012f, -0.009653f, -0.000257f, -0.008729f, 0.001304f, -0.000636f, -0.002763f, 0.002515f, 0.010528f, 0.004984f, -0.002509f, 0.000527f, -0.001870f, -0.004151f, 0.000384f, 0.001588f, -0.002086f, -0.000342f, -0.002578f, 0.000023f, -0.001074f, -0.003228f, 0.001261f, 0.001181f, -0.003371f, -0.001616f, 0.000894f, -0.001454f, 0.000441f, -0.002234f, -0.001721f, -0.001824f, -0.003148f, -0.003442f, -0.000276f, 0.000817f, -0.001745f, -0.002097f, -0.000015f, -0.001017f, -0.000443f, -0.001155f, -0.000033f, -0.000677f, -0.001153f, -0.002851f, 0.001494f, -0.001038f, -0.001356f, -0.001412f, -0.034422f, -0.002704f, -0.016958f, 0.015260f, -0.008821f, 0.027456f, -0.017538f, 0.017314f, -0.015542f, -0.000920f, -0.000209f, -0.011977f, 0.009354f, 0.000359f, -0.004444f, 0.002827f, -0.003885f, -0.001555f, -0.011655f, -0.000092f, -0.008787f, 0.006999f, 0.002472f, 0.008564f, -0.004981f, 0.012769f, 0.011510f, -0.011124f, 0.003170f, -0.009456f, 0.010119f, 0.000110f, -0.007009f, 0.000608f, -0.000954f, -0.000348f, 0.007438f, 0.001102f, + -0.010958f, 0.004555f, 0.007957f, -0.000507f, 0.009390f, -0.004332f, 0.007665f, -0.011389f, -0.005759f, 0.007496f, -0.006515f, 0.001908f, 0.010110f, -0.009145f, 0.014917f, 0.005896f, -0.014642f, 0.003585f, -0.014103f, 0.005104f, 0.007937f, 0.005346f, 0.007644f, 0.010940f, 0.003736f, -0.001331f, -0.000833f, 0.000737f, 0.003510f, 0.007866f, -0.002664f, 0.014852f, 0.002928f, 0.010181f, 0.005574f, 0.002966f, 0.000781f, 0.010214f, 0.001894f, 0.002544f, -0.005792f, -0.007949f, 0.004118f, 0.005516f, 0.000658f, 0.008782f, -0.000979f, -0.000060f, -0.001561f, 0.010426f, 0.003213f, -0.003714f, 0.002428f, 0.001786f, 0.001567f, 0.003559f, 0.000612f, 0.006491f, -0.000947f, 0.002241f, 0.001296f, 0.002487f, -0.001569f, 0.001244f, 0.000685f, 0.000153f, 0.000649f, -0.002202f, -0.001916f, 0.000827f, -0.002375f, -0.001084f, -0.002580f, 0.001701f, 0.000038f, 0.022749f, 0.000128f, -0.006191f, -0.002075f, -0.008485f, -0.010130f, 0.016613f, -0.003224f, -0.002419f, 0.015248f, -0.001181f, -0.002942f, 0.006742f, 0.011867f, 0.003384f, 0.005897f, -0.000305f, -0.012944f, -0.003433f, 0.009739f, -0.014761f, + -0.014611f, -0.005484f, 0.003210f, -0.010411f, -0.006246f, 0.000202f, -0.001449f, 0.010220f, -0.003933f, -0.002249f, 0.010794f, 0.014991f, -0.012986f, 0.003390f, -0.003086f, 0.005464f, 0.001509f, -0.005779f, -0.001242f, 0.006228f, 0.009580f, -0.002580f, -0.013482f, -0.003051f, -0.001174f, -0.003576f, -0.006720f, 0.000965f, -0.000839f, 0.002445f, -0.001842f, 0.001862f, 0.012633f, -0.009345f, 0.001227f, -0.007122f, -0.005741f, -0.009784f, -0.002925f, -0.005661f, -0.013481f, -0.000503f, 0.000945f, -0.005276f, -0.001015f, -0.005584f, 0.005229f, 0.006539f, -0.001011f, 0.001931f, -0.004842f, -0.001372f, 0.016323f, -0.002181f, -0.006739f, -0.022158f, -0.010058f, -0.000318f, -0.007543f, 0.005080f, -0.002126f, 0.001875f, -0.000006f, -0.004479f, -0.000821f, 0.006414f, -0.005426f, 0.001234f, -0.001517f, 0.000592f, 0.000031f, -0.004670f, -0.003414f, -0.001988f, -0.003560f, -0.000752f, -0.005646f, -0.001219f, -0.003195f, 0.000587f, -0.002224f, -0.000773f, -0.003037f, -0.003331f, -0.003218f, -0.000872f, -0.000330f, 0.001118f, 0.000849f, -0.000488f, 0.000938f, 0.000709f, -0.000161f, 0.003118f, 0.002758f, -0.000088f, + 0.001641f, -0.001352f, -0.001704f, 0.000344f, 0.029490f, 0.033140f, 0.006308f, -0.012053f, 0.007551f, 0.013069f, 0.013109f, 0.007399f, 0.009904f, 0.004438f, 0.016212f, -0.001636f, -0.001978f, -0.006602f, 0.010181f, -0.005956f, -0.014259f, -0.019652f, 0.002275f, -0.009419f, -0.008102f, 0.006966f, -0.002052f, -0.005218f, 0.016568f, -0.001175f, 0.020580f, 0.000232f, -0.008104f, -0.005543f, 0.007239f, 0.004807f, -0.004024f, -0.016263f, 0.023507f, 0.013592f, 0.000166f, 0.012746f, 0.007633f, 0.008296f, -0.007665f, 0.009365f, 0.004806f, 0.001901f, -0.002798f, -0.004168f, -0.010313f, -0.014585f, 0.004175f, 0.007098f, -0.011338f, 0.004598f, 0.009883f, 0.014697f, 0.003936f, 0.013281f, 0.006207f, 0.011320f, -0.016533f, 0.004963f, 0.001590f, 0.003368f, 0.000484f, -0.001099f, 0.007114f, 0.006440f, 0.006294f, 0.009087f, -0.002917f, 0.004435f, 0.002675f, 0.013058f, 0.016020f, -0.008022f, -0.009368f, 0.001471f, -0.003773f, -0.008430f, 0.003635f, 0.008872f, -0.005370f, 0.003786f, -0.015865f, -0.011667f, 0.002786f, -0.008037f, -0.003719f, -0.002565f, -0.007160f, 0.000076f, -0.000009f, 0.000972f, + -0.000084f, 0.003222f, 0.003848f, -0.000197f, 0.001991f, 0.000709f, 0.002936f, 0.003078f, 0.000135f, 0.000284f, -0.000097f, 0.003361f, 0.001770f, 0.001885f, 0.004180f, -0.000645f, -0.001983f, 0.003138f, -0.000784f, 0.000054f, 0.004787f, 0.002956f, 0.004538f, 0.006136f, 0.001049f, 0.002790f, 0.001738f, 0.004089f, 0.027083f, 0.008566f, 0.011963f, -0.009899f, 0.003932f, -0.024505f, 0.001328f, -0.017699f, 0.013424f, 0.009041f, -0.007454f, 0.011311f, 0.006426f, -0.011975f, -0.002969f, 0.017365f, -0.000559f, 0.011967f, -0.003264f, 0.002427f, 0.013840f, -0.017175f, -0.001320f, 0.002850f, 0.005062f, 0.001186f, 0.005568f, 0.000762f, 0.016781f, -0.007738f, -0.004819f, -0.005028f, 0.012688f, 0.001655f, -0.005957f, 0.007749f, 0.021394f, -0.014891f, 0.002644f, 0.002929f, -0.001300f, 0.008688f, -0.004328f, 0.016397f, 0.005491f, 0.004193f, -0.013405f, -0.001270f, -0.003559f, 0.007640f, 0.005692f, 0.008250f, -0.009213f, -0.005943f, 0.007775f, -0.015981f, -0.009003f, 0.003715f, 0.017247f, 0.010540f, 0.015249f, -0.016568f, -0.005291f, -0.016836f, -0.004404f, 0.005217f, -0.001468f, -0.015876f, + 0.002069f, -0.009693f, -0.000168f, -0.017377f, -0.021202f, -0.008550f, -0.015315f, 0.000976f, 0.005367f, 0.003146f, -0.006575f, 0.008552f, 0.013531f, 0.003917f, 0.003963f, 0.007919f, -0.002499f, -0.012897f, -0.000841f, -0.008833f, 0.004634f, 0.001613f, -0.000930f, 0.002550f, 0.001161f, -0.009405f, -0.004932f, -0.002578f, 0.004723f, 0.000828f, -0.003408f, -0.001005f, -0.000357f, -0.001249f, 0.000722f, -0.001792f, -0.000956f, 0.000825f, 0.004284f, 0.001264f, 0.001340f, 0.001148f, -0.000927f, 0.001453f, 0.002830f, 0.001673f, 0.003705f, 0.001309f, 0.001876f, 0.000407f, 0.002913f, -0.004483f, -0.031929f, -0.028794f, -0.020721f, 0.006284f, 0.006364f, 0.023859f, -0.010590f, 0.022658f, -0.009307f, -0.037473f, -0.003374f, -0.003520f, -0.014527f, -0.024260f, -0.008890f, -0.000571f, -0.014978f, -0.000171f, -0.023021f, 0.001637f, -0.024267f, 0.013824f, -0.006149f, 0.010058f, -0.004806f, -0.000478f, -0.007584f, -0.008791f, 0.014898f, 0.002882f, -0.004418f, 0.016913f, 0.001836f, 0.002677f, 0.005761f, 0.015559f, 0.013647f, 0.010401f, 0.000193f, -0.018541f, -0.002003f, 0.008820f, 0.002616f, 0.011268f, + -0.005512f, 0.004986f, -0.027222f, 0.008518f, 0.016283f, -0.020621f, 0.012011f, 0.004162f, 0.019273f, 0.014742f, -0.000141f, -0.005188f, -0.000588f, 0.013068f, 0.006365f, -0.017402f, -0.014215f, -0.024034f, -0.011723f, -0.016164f, -0.003778f, -0.019981f, -0.004375f, -0.006766f, 0.020129f, -0.009555f, 0.009874f, -0.005356f, -0.003110f, -0.006710f, -0.014163f, -0.007599f, -0.004655f, -0.004775f, 0.012610f, -0.038462f, -0.008332f, 0.017824f, 0.000663f, 0.003325f, 0.009438f, 0.018048f, -0.011566f, 0.002050f, 0.004655f, -0.000969f, -0.000347f, -0.002787f, 0.004797f, 0.007387f, -0.003464f, 0.000481f, -0.000915f, 0.008265f, -0.003298f, -0.000386f, 0.008271f, 0.001593f, 0.002790f, 0.003774f, 0.003781f, -0.001533f, 0.000518f, -0.002407f, -0.003480f, -0.002008f, -0.006019f, 0.001537f, 0.003619f, 0.002490f, 0.001330f, -0.007726f, -0.000172f, -0.001158f, -0.000559f, -0.003704f, 0.001901f, 0.003239f, -0.002038f, -0.000522f, 0.003805f, 0.004108f, -0.041933f, 0.032485f, -0.008928f, 0.019277f, 0.011287f, -0.000605f, -0.027680f, 0.022115f, 0.003156f, -0.001762f, 0.014027f, 0.009994f, -0.011339f, -0.000033f, + 0.023798f, 0.008002f, -0.010519f, 0.016931f, -0.009027f, -0.007230f, -0.004913f, 0.005536f, 0.000264f, -0.002914f, 0.002424f, 0.007343f, 0.006579f, 0.006763f, -0.017259f, 0.010900f, -0.014316f, 0.019819f, -0.012097f, 0.019726f, 0.006441f, 0.002008f, -0.019072f, -0.019383f, -0.006337f, -0.006369f, 0.022922f, 0.006577f, 0.018358f, 0.007777f, -0.016153f, 0.000753f, -0.003579f, 0.007946f, 0.000571f, 0.007011f, -0.001912f, -0.010829f, -0.006293f, 0.011693f, 0.028999f, 0.020947f, 0.002457f, 0.007278f, -0.001983f, -0.003929f, 0.014925f, 0.012550f, -0.005205f, 0.018410f, 0.025909f, 0.036193f, 0.000874f, -0.020562f, -0.024812f, 0.008807f, 0.004621f, -0.000925f, 0.006369f, 0.000247f, -0.007879f, -0.000806f, 0.021904f, -0.003847f, -0.009418f, 0.038946f, 0.009916f, -0.006441f, 0.011530f, 0.000395f, -0.000288f, -0.001093f, -0.006034f, -0.000739f, 0.011933f, 0.005995f, -0.003659f, -0.005545f, 0.008415f, 0.006848f, -0.000406f, 0.015911f, 0.004708f, 0.003122f, 0.001870f, 0.007230f, 0.002889f, 0.006785f, 0.004746f, 0.002478f, 0.001507f, 0.008513f, 0.004825f, 0.004619f, 0.001435f, 0.008455f, + -0.000846f, 0.003423f, 0.005164f, 0.003616f, -0.000418f, 0.009433f, 0.010844f, 0.003466f, -0.001429f, 0.011249f, 0.001164f, -0.004872f, -0.000558f, 0.008292f, 0.000779f, -0.000413f, -0.001339f, -0.001184f, 0.000788f, 0.002384f, 0.005617f, 0.019561f, -0.028556f, 0.024074f, 0.009921f, -0.019496f, 0.045732f, 0.006894f, -0.023292f, 0.005431f, 0.012772f, 0.001243f, 0.009242f, 0.032819f, -0.031311f, 0.020497f, -0.012625f, 0.018183f, -0.006855f, 0.003901f, -0.028984f, 0.004964f, -0.003076f, 0.011704f, -0.011056f, 0.001648f, 0.002319f, 0.000326f, -0.016964f, 0.016390f, 0.001823f, -0.001757f, 0.007819f, -0.003252f, 0.007711f, -0.004049f, 0.023192f, 0.018220f, 0.022963f, 0.022733f, -0.003548f, 0.007945f, 0.009980f, 0.001009f, -0.011800f, 0.016071f, -0.018912f, 0.005880f, 0.019050f, -0.011247f, 0.010171f, -0.021126f, 0.006911f, -0.001856f, -0.004854f, -0.001844f, 0.001796f, 0.006502f, 0.006465f, 0.022216f, -0.014402f, -0.000742f, 0.014919f, 0.031658f, -0.027894f, 0.007161f, -0.006695f, 0.009589f, -0.004953f, 0.046238f, -0.028273f, 0.010112f, -0.015652f, -0.008865f, 0.004368f, 0.004779f, + 0.002802f, -0.040549f, -0.021093f, 0.033372f, 0.018587f, -0.003758f, -0.017824f, -0.021020f, -0.008026f, 0.007382f, -0.022235f, -0.012388f, 0.011372f, 0.006096f, -0.000162f, -0.000755f, -0.015454f, 0.002827f, -0.004272f, -0.006067f, 0.007535f, -0.004009f, -0.004532f, -0.001998f, -0.013452f, 0.004525f, -0.003227f, -0.004846f, -0.004662f, 0.006101f, -0.006290f, 0.007463f, -0.000829f, -0.002165f, 0.002999f, 0.002494f, 0.010286f, -0.010428f, -0.001778f, -0.008004f, -0.001251f, 0.004692f, 0.004168f, 0.012714f, -0.003833f, 0.006874f, 0.002040f, -0.005068f, 0.021342f, -0.028185f, -0.006019f, 0.039744f, -0.011994f, -0.000843f, 0.021269f, 0.004960f, 0.013106f, -0.029743f, 0.028441f, 0.001810f, 0.002079f, -0.007585f, -0.017916f, -0.002505f, -0.002816f, -0.019180f, -0.011598f, 0.021175f, -0.006798f, 0.004030f, -0.010469f, -0.046700f, 0.015744f, 0.002078f, -0.014465f, 0.008868f, 0.018019f, -0.001736f, 0.001944f, -0.003691f, 0.004492f, 0.012206f, 0.003844f, 0.019639f, 0.013423f, 0.003040f, 0.017150f, -0.013904f, -0.013710f, -0.019484f, 0.007288f, 0.011199f, 0.003212f, -0.030882f, 0.008687f, -0.026392f, + 0.038123f, -0.009093f, 0.013510f, 0.032536f, -0.012900f, 0.020659f, 0.005105f, 0.022496f, 0.009013f, -0.010912f, -0.033503f, -0.024039f, -0.018772f, -0.002614f, -0.019704f, -0.003957f, -0.017234f, -0.011179f, 0.033566f, 0.007258f, -0.014409f, -0.012763f, 0.006715f, 0.012464f, -0.002994f, 0.004850f, -0.061228f, 0.024589f, 0.004093f, -0.019646f, -0.024189f, -0.006317f, -0.040466f, 0.004336f, 0.020000f, 0.002196f, -0.017434f, 0.010702f, 0.008959f, -0.014283f, 0.007060f, 0.004227f, -0.003639f, 0.000457f, -0.009216f, 0.002386f, 0.003092f, 0.002350f, -0.011988f, -0.006531f, 0.004808f, -0.007473f, 0.001636f, -0.004517f, -0.002963f, 0.002858f, 0.009950f, -0.012735f, 0.004351f, 0.009883f, -0.011934f, -0.011168f, 0.001388f, -0.010250f, 0.002273f, -0.006809f, 0.006985f, 0.003819f, -0.011952f, 0.006647f, -0.007879f, -0.005056f, 0.008108f, 0.001893f, 0.018351f, 0.005704f, -0.000112f, -0.001159f, 0.001363f, -0.004834f, 0.013224f, -0.037922f, -0.046470f, 0.027838f, -0.022899f, -0.026622f, -0.007719f, 0.017423f, 0.036024f, -0.023952f, 0.001780f, 0.017086f, -0.005345f, -0.007641f, 0.009147f, 0.005917f, + 0.027034f, 0.008966f, -0.026331f, -0.001131f, -0.013443f, -0.001037f, -0.015719f, -0.020629f, 0.002980f, 0.020370f, -0.001681f, 0.009012f, -0.017186f, 0.004854f, 0.020099f, 0.015582f, 0.002199f, 0.001466f, 0.012490f, 0.011887f, 0.007480f, 0.018413f, -0.023658f, 0.025589f, 0.018326f, 0.006192f, -0.019590f, 0.001282f, 0.014765f, -0.015489f, 0.017183f, -0.012330f, 0.019486f, -0.005400f, 0.025500f, -0.040533f, 0.042668f, 0.009892f, 0.040224f, 0.002446f, -0.008757f, -0.002988f, 0.014399f, 0.000792f, -0.033955f, 0.001150f, -0.002602f, -0.035193f, 0.010856f, 0.024704f, -0.033442f, 0.027508f, -0.029467f, 0.008929f, 0.011074f, 0.005880f, -0.036825f, -0.017865f, -0.018192f, 0.003329f, 0.002500f, -0.021587f, -0.031573f, 0.005916f, -0.027798f, 0.018593f, -0.013541f, -0.007445f, 0.009246f, -0.017429f, -0.013502f, -0.017881f, -0.007496f, -0.010076f, 0.000315f, -0.014355f, -0.010754f, -0.013123f, -0.019278f, -0.009533f, -0.004213f, -0.004571f, -0.005051f, -0.005829f, -0.003931f, -0.009353f, -0.010167f, 0.006303f, -0.012125f, -0.006760f, -0.003282f, 0.008903f, -0.004716f, 0.000006f, -0.015424f, -0.011254f, + -0.005190f, -0.000587f, -0.003686f, -0.013288f, -0.002032f, -0.001422f, 0.010319f, 0.006484f, -0.008782f, -0.008334f, 0.001493f, -0.004600f, 0.007552f, -0.004678f, 0.003941f, -0.008354f, -0.021449f, 0.032491f, 0.006557f, 0.021382f, 0.020725f, 0.005817f, -0.016003f, 0.003526f, 0.054844f, -0.037726f, 0.009075f, -0.006642f, -0.020600f, 0.001218f, 0.007364f, 0.008844f, -0.000262f, 0.000126f, -0.010807f, -0.015851f, -0.024659f, -0.012472f, 0.018629f, -0.015634f, -0.024775f, 0.014239f, -0.008878f, 0.005457f, -0.003277f, 0.011064f, -0.010545f, 0.023328f, -0.008415f, 0.002519f, -0.000525f, 0.002461f, 0.021508f, 0.007310f, -0.009977f, 0.011460f, -0.009130f, 0.017614f, -0.010591f, 0.007222f, -0.025209f, -0.018437f, -0.013499f, 0.004401f, -0.012591f, -0.022002f, 0.009274f, 0.016301f, 0.004795f, -0.011705f, 0.007546f, 0.011513f, 0.013106f, 0.035249f, 0.048665f, 0.066096f, -0.006676f, 0.010535f, 0.016033f, 0.009342f, 0.009005f, 0.010623f, -0.013419f, 0.026228f, -0.003587f, 0.034241f, 0.042380f, 0.030999f, 0.012710f, 0.017450f, 0.005996f, 0.059109f, 0.017173f, -0.010823f, -0.009182f, -0.008403f, + -0.003187f, -0.003805f, 0.003361f, -0.004719f, -0.010808f, 0.009886f, -0.017241f, 0.005202f, -0.003686f, 0.005489f, -0.008410f, -0.006954f, -0.005143f, 0.013404f, -0.012722f, -0.012554f, -0.000587f, 0.005527f, -0.006223f, -0.016117f, -0.004994f, 0.000929f, -0.007286f, 0.008608f, 0.016724f, -0.009306f, -0.000635f, 0.003474f, -0.001197f, 0.005495f, 0.009932f, -0.004411f, -0.010785f, -0.001846f, 0.005973f, -0.005474f, 0.015306f, 0.017646f, 0.011307f, -0.005011f, -0.011353f, -0.001517f, 0.017829f, 0.002028f, 0.000126f, 0.007768f, 0.003049f, -0.000092f, -0.002251f, 0.004373f, 0.005045f, -0.011604f, -0.000515f, 0.065981f, 0.052806f, -0.023063f, -0.010643f, -0.027503f, 0.015782f, 0.007694f, 0.032270f, -0.005715f, -0.014073f, -0.006356f, -0.021026f, 0.004705f, 0.000726f, 0.030480f, -0.011502f, 0.011357f, -0.041135f, 0.022606f, -0.003310f, 0.015910f, -0.000294f, 0.014420f, 0.002363f, -0.023366f, -0.012159f, -0.020042f, -0.015325f, 0.016888f, 0.040592f, 0.017738f, -0.004951f, -0.012609f, -0.000665f, -0.003408f, 0.010035f, 0.013769f, -0.026148f, -0.000494f, -0.009198f, -0.008686f, -0.028390f, -0.021800f, + -0.045932f, 0.000872f, -0.002436f, 0.016540f, -0.013868f, 0.029395f, -0.022447f, -0.009782f, 0.058624f, 0.058241f, -0.040398f, 0.009036f, 0.033598f, -0.019539f, -0.009505f, 0.017412f, -0.006649f, -0.024546f, 0.065202f, -0.016216f, -0.099473f, 0.033103f, -0.001450f, -0.051126f, 0.038990f, 0.041881f, -0.015012f, 0.029347f, 0.037024f, -0.017511f, 0.001118f, 0.023681f, -0.025770f, 0.010792f, 0.020310f, -0.036524f, -0.005247f, -0.011980f, 0.001780f, -0.013302f, -0.000016f, 0.005238f, -0.015706f, 0.012590f, -0.018182f, -0.008150f, 0.008501f, 0.017816f, -0.010449f, 0.001138f, 0.003302f, -0.002529f, 0.005758f, -0.012789f, 0.018758f, -0.009525f, 0.019819f, 0.019614f, -0.000751f, 0.001165f, 0.012915f, -0.009497f, 0.002565f, -0.000347f, 0.016237f, -0.012210f, 0.009714f, 0.003242f, -0.039066f, 0.007686f, -0.005164f, -0.007080f, 0.001760f, -0.000883f, 0.003799f, -0.021658f, 0.002630f, -0.005474f, -0.019682f, 0.003545f, 0.032766f, -0.030930f, 0.009866f, 0.018437f, -0.027011f, 0.000133f, 0.014139f, -0.024826f, -0.012383f, 0.004482f, 0.011431f, 0.021784f, 0.010505f, -0.017923f, -0.003474f, 0.016066f, + -0.018840f, 0.018497f, -0.009497f, -0.024069f, 0.021274f, 0.010894f, 0.010475f, -0.006185f, -0.006247f, -0.008671f, -0.001417f, 0.017857f, -0.037614f, 0.018344f, -0.001046f, 0.030940f, -0.019934f, -0.000165f, -0.024723f, 0.010417f, -0.040070f, 0.004165f, 0.001504f, -0.016069f, -0.012266f, 0.006146f, -0.027069f, -0.046541f, 0.027784f, -0.002845f, 0.008166f, -0.027633f, 0.016521f, -0.004687f, 0.017773f, 0.019078f, 0.009330f, -0.019572f, 0.015702f, -0.009524f, -0.004500f, -0.036048f, 0.004889f, -0.025736f, -0.028197f, -0.041032f, -0.016997f, 0.006258f, 0.011040f, -0.042350f, -0.021061f, 0.001994f, -0.015332f, -0.056783f, -0.045079f, -0.046346f, -0.009820f, -0.027823f, 0.024137f, 0.034094f, 0.009155f, -0.034345f, -0.039773f, -0.046351f, -0.004586f, -0.003705f, 0.024853f, -0.022532f, -0.038686f, -0.019181f, -0.025863f, 0.008395f, 0.000185f, 0.008783f, 0.004294f, -0.012995f, 0.002434f, 0.009049f, -0.010231f, -0.004530f, -0.008716f, -0.005647f, -0.006385f, -0.012649f, -0.000878f, 0.014842f, 0.000212f, 0.004067f, 0.004133f, -0.003024f, 0.011124f, -0.007819f, 0.017366f, 0.015458f, -0.006566f, -0.014639f, + -0.001014f, -0.005874f, -0.008264f, -0.009366f, -0.008252f, 0.012333f, 0.000258f, 0.011588f, -0.012826f, -0.014018f, -0.002789f, 0.006190f, -0.022068f, 0.003310f, 0.001884f, -0.016375f, 0.003187f, -0.013562f, -0.028739f, 0.017081f, -0.007090f, 0.001724f, -0.005021f, 0.002521f, -0.014842f, -0.004261f, -0.028834f, 0.050152f, 0.055732f, -0.013183f, 0.037639f, -0.010450f, -0.014473f, -0.014383f, 0.036660f, -0.031582f, -0.007071f, -0.014919f, 0.058035f, 0.002413f, 0.021386f, 0.007832f, -0.005159f, 0.029081f, 0.016412f, 0.023857f, 0.007723f, -0.003416f, -0.009826f, 0.022845f, -0.003465f, -0.021882f, 0.027952f, -0.000483f, 0.024523f, -0.026793f, 0.019194f, 0.006980f, -0.027207f, -0.020973f, 0.050585f, 0.032906f, -0.002746f, 0.018295f, 0.015404f, -0.031676f, -0.020600f, 0.010846f, 0.008405f, 0.022617f, 0.003158f, 0.005178f, 0.009105f, 0.027539f, 0.011614f, 0.007270f, -0.026781f, 0.075424f, 0.050857f, 0.006068f, -0.033403f, 0.017086f, -0.010969f, 0.009633f, -0.007327f, 0.016371f, -0.010648f, 0.002812f, 0.041890f, -0.028459f, -0.013438f, -0.038344f, 0.011219f, -0.010243f, -0.006348f, 0.035567f, + 0.011555f, 0.004741f, 0.003488f, -0.014311f, -0.028353f, 0.021081f, 0.000411f, 0.000650f, 0.022836f, 0.022445f, -0.001322f, -0.016123f, -0.018505f, 0.036731f, -0.003350f, -0.001937f, -0.006644f, 0.027653f, -0.001750f, -0.019019f, 0.013052f, 0.010373f, 0.017678f, 0.007994f, 0.006556f, 0.025539f, -0.004704f, -0.009137f, 0.009353f, -0.000510f, 0.001535f, 0.002346f, 0.012170f, -0.006453f, 0.000459f, -0.008264f, 0.003282f, 0.012301f, -0.005146f, 0.002969f, 0.015869f, -0.005350f, 0.003834f, 0.011192f, 0.001331f, -0.002986f, -0.023088f, 0.015404f, -0.012664f, 0.010098f, -0.015226f, -0.003453f, 0.006972f, -0.009972f, -0.003364f, 0.022511f, 0.016984f, 0.001909f, -0.002878f, 0.021018f, 0.004821f, 0.010009f, 0.009977f, 0.004676f, -0.003136f, 0.008988f, -0.018086f, -0.039203f, 0.101946f, -0.114330f, -0.013196f, -0.060151f, 0.073941f, 0.019969f, 0.013071f, -0.028674f, 0.006956f, -0.023383f, 0.066238f, -0.011594f, -0.004219f, 0.006899f, -0.003251f, -0.025773f, 0.009928f, 0.015174f, 0.020053f, -0.044561f, -0.023439f, -0.022878f, 0.009198f, -0.013386f, -0.012009f, -0.001284f, -0.000392f, 0.029488f, + -0.015112f, 0.001619f, 0.022178f, -0.002591f, -0.029466f, 0.003886f, 0.023336f, -0.002609f, -0.046463f, 0.034927f, 0.004186f, 0.000831f, -0.000064f, -0.019419f, 0.015332f, -0.085799f, -0.060044f, -0.008172f, -0.021503f, 0.004123f, 0.006577f, -0.040057f, 0.063324f, -0.024857f, 0.087234f, -0.012079f, -0.030557f, 0.030123f, 0.004982f, 0.026920f, 0.040383f, 0.013075f, -0.041518f, -0.011232f, 0.046620f, 0.108542f, 0.003573f, -0.027391f, 0.045095f, 0.004208f, 0.053187f, 0.008924f, 0.072009f, -0.018270f, -0.002925f, -0.001609f, 0.016785f, 0.002832f, 0.027634f, 0.050987f, 0.002952f, -0.010342f, -0.009091f, 0.016505f, -0.013812f, -0.005525f, 0.032977f, 0.024551f, 0.003552f, -0.005768f, -0.012553f, -0.013580f, -0.008661f, -0.010956f, 0.023721f, -0.014304f, -0.010382f, 0.012249f, 0.004119f, -0.004069f, 0.010535f, 0.012614f, -0.006901f, 0.010899f, 0.016769f, -0.008266f, 0.000946f, -0.023477f, 0.030111f, 0.000371f, 0.024169f, 0.002151f, -0.025615f, 0.000705f, 0.002414f, 0.007233f, 0.002483f, 0.000561f, -0.022076f, -0.019642f, -0.001483f, -0.011172f, 0.015828f, 0.006505f, -0.007751f, -0.000127f, + 0.012366f, 0.003230f, -0.007639f, 0.001372f, 0.008849f, 0.000770f, -0.004779f, 0.004147f, 0.148822f, 0.045960f, 0.016181f, -0.005026f, -0.016334f, -0.021751f, 0.048378f, 0.044312f, -0.051767f, 0.030187f, 0.022868f, 0.004902f, -0.015846f, -0.027720f, -0.070481f, -0.026720f, 0.022139f, 0.006874f, -0.022873f, 0.041945f, -0.014066f, 0.016715f, 0.016669f, -0.010691f, -0.010225f, 0.043777f, 0.000865f, -0.017297f, 0.027322f, -0.024559f, 0.053982f, -0.027084f, -0.016465f, -0.003438f, 0.020868f, 0.010749f, 0.054600f, -0.017384f, -0.033147f, -0.012177f, 0.014207f, 0.003261f, 0.029108f, 0.007563f, 0.002270f, -0.012485f, 0.023392f, 0.102542f, 0.043496f, -0.038841f, 0.032747f, -0.020635f, -0.031617f, 0.024880f, -0.001469f, 0.006861f, -0.002416f, 0.017759f, -0.027663f, -0.042108f, -0.110475f, -0.029563f, 0.038915f, -0.015137f, -0.038180f, 0.015929f, -0.009201f, 0.015855f, -0.044511f, -0.039268f, -0.018631f, 0.015975f, 0.017133f, 0.051913f, 0.008818f, -0.004334f, -0.041556f, -0.058836f, -0.007683f, -0.026816f, 0.004625f, 0.020324f, -0.028195f, -0.029183f, -0.006598f, -0.036152f, -0.059684f, -0.020374f, + -0.016204f, -0.032350f, -0.007856f, 0.016891f, -0.017003f, -0.009426f, -0.019481f, -0.005140f, -0.042674f, -0.027598f, -0.027358f, 0.000038f, 0.003419f, 0.014525f, -0.024096f, 0.012541f, -0.032328f, 0.000581f, -0.019247f, -0.003189f, 0.009347f, -0.010600f, 0.014444f, -0.042622f, -0.008832f, 0.013463f, 0.005427f, 0.012303f, -0.005865f, -0.012237f, 0.019940f, -0.004890f, -0.004832f, 0.013469f, -0.021494f, -0.017468f, -0.003671f, 0.003076f, -0.028349f, -0.014081f, -0.015729f, -0.009349f, -0.002983f, -0.001274f, 0.001729f, -0.013450f, 0.000612f, -0.023257f, 0.033160f, -0.026393f, 0.091142f, 0.076532f, 0.035908f, -0.020766f, -0.031923f, 0.054744f, 0.046939f, -0.061240f, -0.012315f, -0.037466f, 0.052888f, -0.008788f, -0.074695f, -0.032451f, 0.026829f, 0.046982f, -0.086372f, 0.034912f, -0.059747f, 0.022391f, -0.035208f, -0.008953f, 0.041817f, -0.013818f, 0.006518f, 0.026823f, 0.055666f, -0.036092f, -0.060755f, 0.013878f, -0.004624f, 0.006876f, 0.057055f, 0.014579f, 0.042621f, -0.053541f, -0.009765f, 0.017520f, -0.047833f, 0.078694f, -0.008991f, 0.047268f, -0.006402f, -0.010742f, 0.038711f, 0.038825f, + -0.022010f, 0.086669f, -0.020074f, -0.037299f, 0.041834f, 0.074521f, 0.004370f, 0.013755f, 0.003757f, 0.033051f, -0.034763f, 0.026582f, 0.112810f, 0.052149f, -0.003366f, 0.049546f, 0.060783f, -0.044566f, -0.137667f, 0.010798f, 0.083271f, 0.094313f, 0.025859f, -0.008678f, -0.040456f, 0.049164f, 0.103926f, 0.048848f, 0.025458f, -0.101260f, 0.019345f, -0.057166f, -0.035726f, -0.089202f, 0.076357f, 0.017055f, -0.026124f, -0.035183f, 0.026948f, -0.025278f, 0.014663f, 0.010748f, 0.013674f, -0.032687f, -0.006922f, -0.003569f, 0.017896f, -0.010866f, 0.015153f, 0.013707f, -0.014994f, -0.009169f, 0.020985f, 0.001553f, 0.022515f, -0.008844f, 0.008453f, -0.013985f, 0.008078f, 0.042936f, 0.008095f, 0.008658f, -0.005232f, -0.044633f, -0.022851f, -0.027240f, 0.015115f, 0.077333f, 0.072231f, 0.066048f, -0.004992f, -0.046565f, -0.044799f, -0.020474f, 0.030384f, 0.034746f, -0.002432f, -0.014813f, -0.024208f, -0.034368f, 0.009405f, 0.020782f, 0.016515f, 0.016506f, 0.012151f, 0.001347f, 0.062995f, -0.125437f, 0.095299f, 0.019600f, -0.057662f, 0.000566f, 0.053164f, -0.035802f, 0.001224f, 0.029433f, + -0.037567f, 0.002964f, -0.033800f, -0.021468f, 0.035068f, -0.030583f, -0.017613f, -0.064014f, 0.027289f, 0.061839f, 0.017081f, -0.028078f, -0.047730f, -0.007746f, 0.035189f, 0.019080f, -0.040850f, -0.001240f, 0.048307f, -0.006609f, 0.002886f, -0.016774f, -0.012377f, 0.114340f, -0.055419f, -0.014168f, -0.013253f, 0.019101f, 0.052676f, -0.056665f, -0.032258f, 0.075202f, -0.009449f, -0.004962f, -0.090727f, -0.074656f, 0.030601f, 0.050546f, 0.027071f, -0.092438f, 0.062653f, -0.001803f, -0.014794f, 0.013123f, -0.066704f, -0.018396f, -0.009274f, -0.032816f, 0.058657f, -0.046460f, -0.026510f, -0.049943f, -0.029576f, -0.065819f, 0.019036f, -0.102860f, -0.029637f, 0.011979f, -0.052014f, 0.012577f, 0.027609f, 0.012439f, -0.001619f, -0.018481f, -0.037868f, 0.054352f, -0.012733f, -0.005291f, -0.020511f, 0.032905f, 0.065014f, 0.009882f, -0.090141f, 0.007851f, -0.040722f, 0.005939f, 0.007222f, -0.016272f, 0.005170f, -0.026694f, -0.010094f, -0.002247f, -0.021326f, 0.000400f, -0.006914f, 0.015701f, 0.012824f, -0.004846f, 0.005872f, 0.029223f, -0.014363f, -0.010428f, 0.028622f, -0.021604f, 0.018574f, -0.010440f, + -0.011310f, 0.002290f, -0.013964f, -0.006034f, 0.016863f, -0.035286f, 0.009345f, 0.008454f, 0.011784f, 0.025484f, -0.019206f, 0.003195f, 0.017550f, 0.007069f, -0.007882f, -0.016531f, -0.004769f, -0.003835f, -0.001030f, -0.016923f, 0.003644f, -0.002754f, -0.071860f, 0.043824f, -0.001184f, 0.056682f, -0.011500f, 0.058626f, 0.007475f, -0.007313f, 0.026294f, 0.068002f, 0.032637f, 0.017550f, 0.013700f, 0.008830f, 0.026828f, -0.033986f, -0.002634f, -0.025447f, -0.026762f, 0.041890f, 0.026098f, 0.016132f, -0.011876f, -0.010326f, -0.004816f, 0.043803f, 0.006812f, -0.019159f, -0.031428f, -0.001280f, -0.007338f, 0.032981f, 0.005118f, 0.027607f, 0.051686f, -0.014215f, -0.130492f, 0.008730f, 0.106278f, 0.011222f, -0.077742f, -0.009944f, 0.030118f, 0.023686f, 0.041829f, 0.038042f, -0.002972f, -0.024516f, -0.025127f, 0.033303f, -0.020058f, 0.003816f, 0.011745f, -0.135541f, -0.023389f, -0.025995f, 0.021665f, 0.106681f, -0.001824f, 0.008633f, -0.024614f, 0.007309f, 0.022112f, 0.044779f, 0.023486f, -0.026384f, -0.013777f, -0.065812f, -0.003865f, 0.045307f, -0.019848f, -0.009375f, 0.016802f, 0.046013f, + 0.037405f, -0.009904f, -0.046678f, 0.000295f, 0.017222f, 0.005220f, -0.030970f, 0.003847f, 0.003911f, -0.002358f, -0.026716f, -0.034818f, 0.030374f, 0.024822f, -0.001115f, -0.005455f, -0.026120f, 0.020821f, 0.008766f, 0.004736f, 0.008253f, 0.006632f, 0.012228f, 0.000769f, -0.028940f, 0.016265f, 0.000975f, -0.001831f, 0.001845f, 0.007734f, 0.003873f, -0.003955f, 0.000137f, 0.001122f, -0.009358f, -0.005655f, -0.040058f, 0.006317f, 0.028653f, -0.020012f, 0.010371f, -0.032609f, 0.018588f, 0.008478f, -0.004610f, -0.009039f, -0.003040f, -0.003229f, 0.004112f, -0.007191f, 0.036487f, -0.004508f, -0.214414f, -0.403075f, -0.162144f, -0.272890f, -0.313610f, 0.194619f, 0.067858f, 0.178798f, 0.538112f, 0.352155f, 0.284086f, 0.425919f, 0.212474f, 0.013514f, 0.168270f, 0.041742f, -0.170824f, -0.120063f, -0.136191f, -0.312503f, -0.253958f, -0.109841f, -0.227441f, -0.250548f, -0.103793f, -0.154296f, -0.258764f, -0.133813f, 0.019690f, -0.162776f, -0.149073f, 0.032592f, -0.032539f, -0.148455f, 0.165788f, 0.108207f, -0.124833f, 0.122999f, 0.186618f, 0.028102f, 0.106551f, 0.375404f, 0.178049f, 0.112383f, + 0.441516f, 0.309393f, 0.178912f, 0.435353f, 0.583579f, 0.361288f, 0.523263f, 0.677995f, 0.484290f, 0.321184f, 0.423281f, 0.222775f, -0.216164f, -0.142359f, -0.285416f, -0.664324f, -0.666290f, -0.674731f, -1.018542f, -1.005603f, -1.010484f, -1.052519f, -0.993834f, -0.966629f, -0.761146f, -0.609198f, -0.460908f, -0.190017f, 0.055460f, 0.147467f, 0.375563f, 0.652913f, 0.552991f, 0.741616f, 1.054446f, 0.886441f, 0.827678f, 1.008003f, 0.746515f, 0.382930f, 0.414784f, 0.389349f, 0.145797f, 0.103869f, 0.208687f, 0.077123f, -0.018712f, 0.069799f, 0.024516f, -0.145540f, -0.130304f, -0.078529f, -0.260346f, -0.298821f, -0.130731f, -0.227397f, -0.313201f, -0.129454f, -0.083501f, -0.170732f, -0.002874f, 0.054816f, -0.056753f, -0.008707f, -0.041990f, -0.238944f, -0.344345f, -0.385754f, -0.481941f, -0.567170f, -0.509275f, -0.465417f, -0.433583f, -0.325399f, -0.207459f, -0.147681f, -0.027179f, 0.114634f, 0.178183f, 0.258602f, 0.425824f, 0.517842f, 0.603846f, 0.647283f, 0.613128f, 0.546617f, 0.418021f, 0.285864f, 0.159457f, 0.022286f, -0.027186f, -0.046115f, -0.075241f, -0.084670f, -0.086381f, -0.099991f, + -0.106186f, -0.095822f, -0.086290f, -0.095753f, -0.102771f, -0.097821f, -0.102681f, -0.111933f, -0.107625f, -0.101584f, -0.078251f, -0.046440f, -0.028979f, -0.007332f, 0.009120f, 0.007347f, 0.003072f, 0.000817f}, + {-0.012942f, -0.001200f, 0.012109f, -0.010826f, 0.004172f, -0.018233f, 0.000179f, -0.006606f, 0.007318f, -0.006167f, 0.001657f, -0.004187f, -0.007634f, -0.001971f, -0.000739f, 0.005521f, 0.006916f, -0.006585f, -0.011469f, 0.005991f, 0.002037f, 0.004184f, 0.002519f, 0.004732f, -0.006650f, -0.004999f, 0.001178f, -0.001281f, 0.005962f, 0.004288f, -0.005089f, -0.001109f, 0.004541f, 0.008430f, 0.005187f, 0.000048f, -0.006642f, 0.003546f, -0.001152f, -0.003548f, 0.004648f, 0.001998f, -0.006102f, -0.005114f, -0.004148f, 0.003384f, -0.005979f, -0.003227f, 0.004995f, 0.001911f, -0.000197f, -0.006264f, 0.002281f, -0.005389f, -0.013858f, 0.001344f, -0.004730f, -0.008954f, 0.004085f, -0.002566f, -0.002570f, -0.003087f, 0.000174f, 0.006781f, 0.004083f, 0.002269f, 0.003086f, 0.005112f, -0.010442f, 0.005404f, -0.004165f, -0.004031f, -0.002323f, 0.003432f, 0.000646f, 0.007287f, 0.010630f, 0.004128f, 0.000807f, 0.001179f, -0.000176f, 0.006778f, -0.002894f, -0.000278f, 0.003313f, 0.000208f, -0.002836f, -0.002919f, 0.000951f, -0.000110f, -0.003199f, -0.001628f, 0.000984f, -0.000197f, -0.000437f, -0.001300f, + -0.001590f, 0.001026f, 0.000669f, 0.001115f, -0.000482f, 0.000368f, -0.000338f, -0.002984f, -0.001152f, 0.001312f, 0.002348f, -0.001361f, -0.001576f, 0.000501f, 0.027683f, -0.002312f, 0.005093f, 0.006110f, -0.002810f, 0.002890f, 0.011042f, -0.008571f, -0.001497f, 0.003172f, -0.004251f, -0.000820f, 0.008118f, -0.002594f, -0.001802f, -0.000541f, 0.003161f, -0.001527f, 0.003922f, -0.002715f, -0.002666f, -0.001219f, -0.006255f, -0.010705f, -0.001996f, -0.003421f, -0.001414f, 0.006336f, -0.011335f, 0.013983f, 0.000110f, 0.000262f, 0.000506f, 0.002655f, -0.000311f, -0.005350f, 0.000872f, 0.004322f, 0.010565f, 0.000543f, -0.000050f, -0.001588f, -0.003526f, 0.007022f, 0.003355f, -0.002543f, 0.003894f, -0.006963f, 0.001220f, 0.002242f, -0.005251f, -0.018128f, -0.005650f, -0.000440f, -0.001037f, -0.000851f, -0.001566f, -0.002298f, -0.001284f, -0.003437f, 0.004478f, 0.013381f, 0.007608f, 0.000597f, 0.000009f, -0.000347f, 0.004707f, -0.002724f, -0.012156f, -0.000412f, -0.006314f, 0.004005f, -0.007168f, 0.004083f, -0.017557f, -0.000102f, -0.002469f, 0.005982f, 0.009625f, -0.001462f, -0.002245f, 0.001446f, + -0.000002f, 0.005160f, 0.001930f, 0.000868f, 0.007020f, -0.005140f, -0.000638f, 0.000890f, 0.002539f, 0.000015f, 0.002589f, 0.000144f, 0.001673f, 0.000746f, -0.000294f, 0.000522f, -0.000582f, -0.000075f, 0.001512f, 0.002218f, 0.000313f, -0.000609f, -0.000818f, 0.000291f, -0.000335f, 0.001255f, 0.000950f, 0.000610f, -0.000363f, 0.000229f, 0.000899f, -0.024358f, -0.023488f, -0.008840f, -0.003479f, -0.003352f, 0.000020f, 0.005940f, 0.001418f, 0.004825f, -0.011030f, 0.005455f, 0.006873f, 0.006642f, 0.007789f, -0.006026f, 0.001675f, 0.018328f, -0.011336f, -0.000400f, -0.008075f, -0.011712f, -0.001401f, -0.000832f, 0.010155f, -0.004925f, 0.001069f, -0.008748f, 0.005609f, 0.003503f, 0.004404f, -0.019611f, 0.003025f, -0.003587f, -0.006878f, -0.001852f, -0.000094f, -0.014550f, -0.009420f, -0.008125f, -0.000653f, 0.012157f, 0.004218f, 0.004027f, 0.005843f, -0.005439f, 0.003440f, -0.004880f, 0.010396f, 0.015992f, -0.001496f, -0.001471f, 0.004550f, 0.001119f, 0.004139f, 0.008986f, -0.004213f, 0.009297f, -0.001452f, -0.000286f, 0.005505f, 0.007530f, -0.002846f, -0.010878f, -0.010003f, 0.003865f, + -0.001364f, -0.001869f, -0.004406f, 0.004938f, -0.008328f, 0.003096f, 0.006252f, 0.010553f, -0.006131f, 0.010119f, 0.006615f, 0.003291f, 0.005064f, 0.001221f, -0.001707f, -0.006817f, 0.004857f, -0.003208f, -0.006358f, -0.008042f, 0.003343f, -0.002651f, 0.004857f, 0.000852f, -0.003089f, -0.003754f, -0.001907f, 0.001599f, -0.001976f, -0.000708f, -0.002542f, -0.001128f, -0.000144f, 0.002473f, 0.001310f, -0.000080f, 0.001446f, 0.004875f, -0.000460f, 0.000013f, 0.002859f, -0.001540f, 0.000813f, -0.001074f, -0.000822f, 0.001402f, 0.002062f, 0.002062f, 0.001333f, -0.000031f, -0.000628f, 0.001521f, 0.000737f, 0.003337f, 0.004011f, -0.003184f, -0.000316f, 0.001755f, -0.026709f, 0.011460f, -0.011994f, 0.021337f, -0.019999f, 0.015590f, 0.007916f, -0.008349f, -0.010417f, -0.005831f, 0.004018f, 0.003611f, -0.005654f, 0.012554f, -0.004605f, -0.012134f, -0.002523f, 0.012987f, 0.008889f, -0.013276f, 0.002053f, -0.001725f, -0.013892f, -0.005801f, -0.008955f, -0.002151f, -0.010648f, -0.002886f, -0.004473f, -0.014664f, -0.005256f, 0.007338f, 0.010579f, -0.002123f, -0.012557f, -0.002601f, 0.008818f, -0.002795f, + 0.000263f, 0.000534f, 0.000155f, -0.012507f, -0.000412f, -0.001559f, -0.003197f, -0.000654f, 0.002155f, -0.008976f, 0.005048f, -0.009606f, -0.000248f, -0.000134f, 0.000160f, 0.007007f, 0.000109f, -0.003358f, 0.002847f, 0.004838f, 0.011658f, 0.005272f, 0.002623f, -0.003455f, -0.007289f, -0.006902f, -0.002880f, -0.007532f, -0.005398f, 0.004334f, 0.007621f, -0.005699f, -0.009468f, -0.006518f, 0.002959f, 0.001587f, -0.008882f, -0.003098f, 0.001070f, -0.007497f, -0.003452f, 0.000969f, 0.002248f, 0.002962f, -0.003466f, -0.004169f, -0.005680f, 0.000156f, -0.000721f, -0.002224f, 0.001716f, -0.001916f, -0.000670f, -0.004360f, -0.000993f, -0.001501f, 0.003751f, 0.001814f, -0.001572f, 0.001804f, -0.000260f, 0.000537f, -0.001876f, 0.000167f, -0.001127f, -0.000137f, -0.001566f, -0.002915f, 0.002034f, -0.000243f, -0.002770f, -0.001758f, -0.000296f, -0.002547f, -0.002942f, 0.032686f, 0.013069f, -0.002068f, 0.007492f, -0.005118f, 0.018366f, 0.007838f, 0.032995f, 0.000745f, -0.031717f, 0.008287f, 0.019404f, -0.011347f, 0.003485f, 0.013419f, -0.010112f, 0.009505f, -0.008181f, -0.001659f, -0.010112f, -0.009585f, + -0.002981f, 0.002846f, -0.000962f, 0.004554f, -0.004283f, 0.014253f, -0.008342f, 0.004139f, 0.002692f, 0.009331f, -0.016729f, -0.008609f, -0.006545f, -0.001828f, -0.005870f, 0.001750f, 0.010348f, 0.007493f, 0.016383f, -0.002216f, -0.001132f, -0.009117f, -0.002977f, 0.010464f, -0.009965f, 0.008676f, -0.009319f, -0.003767f, 0.015036f, 0.021792f, 0.015559f, 0.002905f, -0.011332f, 0.008186f, 0.006009f, -0.005878f, 0.012647f, -0.008106f, 0.002546f, 0.002185f, -0.022923f, -0.000001f, -0.021727f, -0.008567f, 0.003533f, -0.005559f, -0.010343f, -0.008675f, 0.001873f, 0.015179f, 0.003787f, -0.005901f, -0.007549f, -0.006471f, 0.001555f, 0.002648f, 0.007207f, -0.011114f, -0.010167f, 0.000926f, -0.001927f, 0.000910f, -0.002895f, -0.001451f, -0.001785f, -0.000743f, 0.003432f, 0.001118f, 0.001594f, -0.001232f, -0.002327f, -0.002056f, 0.000700f, 0.006221f, 0.002020f, 0.004594f, 0.001408f, -0.006587f, 0.005186f, 0.002584f, 0.000964f, 0.001274f, 0.003004f, -0.000412f, 0.002590f, 0.000782f, -0.000047f, -0.001854f, -0.001563f, -0.002665f, 0.000881f, 0.003137f, -0.000542f, -0.001108f, -0.001599f, -0.009415f, + -0.001090f, -0.000885f, 0.000330f, -0.001219f, 0.020236f, 0.040957f, -0.017802f, -0.013224f, -0.003566f, -0.004790f, 0.014290f, -0.013609f, -0.024808f, -0.008592f, 0.001757f, -0.006067f, 0.007150f, 0.003385f, 0.012392f, 0.005199f, -0.004937f, 0.017812f, 0.016703f, -0.007680f, 0.001229f, -0.011472f, -0.001935f, 0.000642f, -0.007056f, -0.001363f, 0.012467f, 0.017879f, 0.000730f, 0.002950f, 0.007365f, 0.004710f, 0.002887f, 0.001231f, -0.006751f, -0.012830f, 0.001491f, -0.018459f, 0.000678f, 0.004250f, -0.005874f, 0.007262f, -0.004667f, -0.010202f, -0.000786f, 0.009948f, 0.004409f, -0.004447f, 0.030171f, -0.000081f, 0.009739f, -0.017948f, -0.003994f, 0.012326f, -0.005763f, -0.013287f, 0.007829f, -0.015572f, -0.013964f, 0.003191f, 0.017117f, -0.013994f, -0.007869f, -0.004129f, 0.000716f, -0.006332f, -0.006313f, 0.023094f, 0.013506f, -0.002081f, 0.001289f, -0.010857f, -0.007783f, -0.004409f, 0.006942f, 0.009138f, 0.000802f, 0.007329f, 0.004733f, -0.001472f, 0.006796f, -0.006234f, 0.023050f, 0.013074f, 0.002542f, 0.000752f, 0.002126f, -0.003882f, -0.001489f, -0.003864f, -0.004092f, -0.000108f, + -0.000149f, -0.003718f, 0.001991f, -0.005617f, -0.001696f, 0.004408f, -0.001576f, 0.004518f, 0.002570f, 0.004276f, 0.000180f, 0.002958f, 0.003359f, 0.003065f, 0.000579f, 0.005075f, 0.001665f, 0.000727f, -0.003655f, 0.000392f, -0.001354f, -0.000026f, 0.000252f, 0.001847f, -0.000244f, 0.001687f, -0.003485f, -0.000117f, 0.016164f, -0.029109f, -0.003957f, -0.021875f, -0.012478f, -0.019821f, -0.005080f, -0.003084f, -0.003017f, -0.007649f, 0.008792f, -0.027909f, 0.014285f, -0.009549f, 0.008479f, 0.003679f, 0.011588f, 0.000607f, 0.004785f, -0.011277f, -0.004802f, 0.005160f, -0.011223f, -0.008164f, 0.013660f, 0.003734f, 0.006169f, 0.005460f, -0.001434f, 0.003642f, 0.020353f, -0.007348f, 0.001933f, -0.009230f, 0.016364f, -0.009939f, -0.036443f, 0.011237f, 0.005705f, 0.015291f, 0.008262f, 0.021087f, -0.014289f, -0.005689f, 0.012729f, -0.005333f, -0.012220f, -0.005797f, 0.006615f, -0.017728f, 0.017469f, -0.000644f, 0.011638f, -0.014970f, -0.006575f, -0.005452f, -0.016215f, -0.003323f, -0.012895f, -0.005894f, 0.001355f, 0.018631f, 0.015004f, -0.001716f, -0.022889f, -0.013059f, -0.004226f, 0.018098f, + 0.014972f, 0.010898f, 0.010083f, -0.006436f, -0.026492f, -0.006790f, -0.000790f, 0.006187f, -0.008377f, -0.002617f, 0.013532f, -0.002602f, 0.015997f, 0.000190f, 0.011078f, 0.004235f, 0.000518f, -0.004099f, -0.000442f, 0.006028f, 0.001595f, -0.002820f, 0.000534f, -0.007323f, -0.001273f, -0.000429f, -0.009805f, -0.005869f, -0.006274f, -0.003060f, 0.001915f, -0.003943f, 0.001567f, -0.005282f, -0.000705f, -0.001550f, -0.002881f, 0.004283f, 0.002057f, -0.000910f, -0.006681f, -0.002588f, 0.002641f, 0.004364f, 0.000057f, -0.006484f, -0.003451f, 0.001468f, 0.003323f, 0.000922f, 0.001597f, 0.000492f, -0.038306f, -0.046237f, -0.026205f, 0.018708f, 0.001342f, -0.008780f, -0.009936f, -0.014900f, -0.001733f, 0.004804f, -0.025865f, -0.002642f, 0.016057f, -0.010102f, -0.007224f, 0.017943f, 0.004602f, -0.012135f, 0.004405f, -0.011749f, 0.026729f, -0.008867f, -0.006556f, 0.008520f, -0.014147f, -0.008948f, -0.008362f, 0.004374f, -0.009870f, -0.003815f, 0.004349f, 0.003073f, -0.031732f, 0.013945f, 0.013609f, -0.009270f, 0.024303f, 0.009226f, 0.002187f, 0.023279f, 0.013242f, 0.004018f, 0.003144f, 0.025185f, + -0.002665f, -0.004491f, -0.001844f, 0.015413f, 0.008584f, -0.023138f, 0.008775f, 0.007036f, -0.000299f, -0.012398f, -0.037202f, 0.016203f, -0.002565f, -0.009286f, -0.023374f, -0.013275f, 0.014164f, -0.003181f, -0.006891f, -0.015630f, -0.030271f, 0.002911f, -0.004289f, -0.016144f, -0.006850f, -0.028645f, -0.004665f, -0.006543f, -0.005496f, -0.001353f, 0.010125f, 0.021761f, 0.009287f, -0.007452f, -0.015750f, 0.005945f, 0.001006f, 0.009006f, 0.005658f, -0.003659f, 0.006590f, 0.002310f, -0.000804f, -0.008612f, 0.000702f, -0.013938f, -0.000901f, -0.003162f, 0.002222f, -0.005463f, 0.006458f, 0.003725f, -0.001590f, -0.001258f, -0.001378f, 0.000817f, -0.003190f, -0.000928f, 0.003701f, -0.001609f, -0.001424f, 0.007017f, -0.002857f, -0.001953f, 0.005692f, -0.004532f, 0.003427f, -0.011681f, -0.007548f, -0.004371f, -0.006172f, -0.000743f, -0.006129f, -0.008258f, -0.006090f, -0.001841f, -0.001276f, 0.002627f, -0.000302f, -0.005094f, 0.002879f, 0.000961f, -0.039431f, 0.031735f, 0.001788f, 0.016224f, -0.002887f, -0.001312f, 0.002995f, 0.017526f, 0.001748f, -0.002169f, -0.023808f, 0.008491f, -0.002597f, -0.018396f, + 0.004834f, -0.012015f, -0.009225f, 0.034179f, 0.009737f, 0.010534f, -0.007347f, 0.012252f, 0.014801f, 0.014295f, -0.008257f, 0.012484f, 0.006504f, -0.014367f, 0.009407f, -0.013972f, -0.004796f, 0.008955f, 0.004274f, -0.001428f, -0.007721f, -0.007274f, 0.022765f, -0.006590f, -0.009932f, -0.006366f, 0.004691f, 0.004961f, -0.010806f, -0.018305f, -0.001282f, -0.019643f, -0.002266f, -0.017709f, -0.006633f, -0.004188f, 0.003550f, -0.009015f, -0.015285f, 0.019413f, -0.007946f, -0.021337f, 0.013733f, 0.022813f, -0.010957f, -0.007285f, 0.011620f, 0.008394f, 0.022685f, 0.014634f, 0.002383f, -0.000198f, -0.023128f, 0.005630f, 0.022365f, 0.017923f, -0.015703f, 0.017089f, 0.018592f, -0.012342f, -0.034381f, -0.011109f, -0.030779f, 0.005215f, 0.017853f, 0.008959f, 0.002273f, -0.009258f, -0.012367f, -0.001376f, 0.001768f, 0.005382f, -0.002680f, 0.010126f, -0.004386f, -0.003547f, 0.004117f, 0.010720f, -0.015600f, -0.002082f, -0.001833f, -0.004794f, 0.000281f, 0.004316f, -0.000709f, -0.000487f, -0.002306f, -0.000304f, -0.002326f, 0.000887f, -0.000008f, -0.000335f, 0.001702f, 0.005597f, -0.004647f, -0.002787f, + 0.003413f, 0.003597f, 0.011991f, -0.001143f, 0.005150f, 0.004649f, -0.004830f, 0.004203f, 0.002136f, -0.004418f, 0.001405f, 0.001741f, 0.001648f, 0.004785f, 0.010538f, 0.002195f, -0.003172f, 0.006883f, -0.001860f, -0.003835f, 0.000880f, 0.007722f, -0.062732f, 0.030263f, 0.008672f, -0.002819f, 0.042549f, -0.002366f, 0.021609f, -0.018817f, -0.004294f, 0.003485f, 0.000417f, 0.024381f, 0.015565f, -0.032782f, 0.020707f, 0.001691f, 0.012494f, -0.029515f, -0.001008f, 0.017273f, -0.028957f, 0.036558f, 0.010020f, -0.000254f, -0.012859f, 0.002313f, 0.015928f, -0.025980f, 0.002561f, 0.006806f, 0.004772f, -0.015968f, -0.005810f, 0.015370f, 0.008775f, -0.001505f, 0.002421f, -0.010459f, -0.017961f, 0.007627f, -0.030471f, -0.001139f, 0.044030f, 0.042963f, -0.013557f, 0.005440f, -0.001731f, 0.012389f, 0.030978f, 0.002723f, 0.014894f, 0.005024f, -0.016050f, -0.001092f, -0.002951f, -0.046402f, -0.020874f, 0.028922f, 0.001466f, 0.009003f, -0.011104f, -0.002732f, 0.010374f, 0.014065f, -0.001138f, 0.035964f, 0.000647f, 0.028078f, 0.003610f, 0.006016f, 0.003779f, -0.018181f, -0.022865f, 0.028433f, + 0.006685f, -0.014649f, 0.020673f, -0.016717f, 0.001650f, 0.017505f, 0.002942f, -0.004336f, 0.008220f, -0.007353f, -0.007050f, 0.008821f, 0.012056f, 0.000968f, -0.015893f, -0.007591f, -0.017132f, -0.006047f, 0.004383f, 0.005671f, 0.002898f, -0.006562f, -0.003018f, -0.012297f, 0.009073f, -0.000034f, -0.004902f, -0.002156f, 0.003879f, 0.002202f, 0.011224f, 0.010071f, 0.006554f, 0.006591f, 0.002302f, 0.008026f, -0.005199f, 0.003761f, 0.004347f, 0.004173f, -0.004529f, 0.008110f, 0.004313f, -0.001060f, -0.001343f, -0.001949f, -0.001880f, -0.003514f, 0.021058f, -0.045817f, 0.018408f, 0.028867f, -0.003997f, 0.008586f, 0.012987f, -0.007007f, -0.004440f, 0.017815f, -0.006715f, 0.027034f, -0.025736f, 0.014064f, 0.033415f, -0.035813f, 0.001444f, -0.017032f, 0.021104f, 0.008911f, 0.017502f, -0.018121f, -0.014165f, -0.000205f, 0.045156f, 0.000524f, 0.022842f, -0.010133f, 0.001374f, -0.003104f, -0.004024f, -0.020044f, -0.000787f, -0.005620f, 0.009188f, -0.008945f, -0.013019f, -0.010918f, -0.000844f, -0.003799f, 0.020388f, 0.003518f, -0.011300f, -0.010223f, -0.010406f, -0.003792f, -0.004969f, 0.033319f, + 0.001429f, 0.016741f, 0.001122f, -0.007987f, -0.007315f, 0.027716f, 0.020642f, -0.007961f, -0.026125f, 0.014755f, 0.010110f, -0.057515f, 0.003311f, 0.032482f, 0.031628f, 0.007404f, 0.025142f, -0.034690f, 0.056842f, 0.005013f, 0.010849f, 0.011278f, 0.027094f, -0.002102f, -0.024362f, -0.007367f, -0.028779f, 0.032733f, -0.014502f, -0.009660f, 0.028493f, -0.000823f, -0.011273f, -0.008653f, -0.021512f, 0.020372f, -0.035084f, -0.005105f, 0.003320f, -0.000817f, 0.004933f, -0.007226f, -0.015095f, -0.009531f, 0.004616f, 0.003900f, -0.007169f, 0.001874f, -0.006843f, -0.007262f, -0.005464f, 0.006493f, 0.003297f, -0.008247f, 0.007664f, 0.001631f, -0.010180f, 0.004645f, -0.001929f, -0.003487f, -0.007792f, -0.008680f, 0.001573f, 0.004329f, 0.018045f, -0.007869f, 0.010646f, 0.001401f, -0.003721f, -0.001217f, -0.002248f, -0.004690f, 0.002659f, -0.000418f, -0.005524f, -0.001709f, -0.003870f, 0.001564f, 0.003546f, 0.003077f, 0.017322f, -0.034221f, -0.027408f, 0.024052f, 0.020204f, 0.049683f, -0.017853f, -0.013445f, -0.009128f, 0.009170f, -0.021424f, -0.002795f, 0.008054f, -0.001732f, 0.026594f, 0.017041f, + -0.021727f, 0.001699f, 0.006045f, 0.015259f, -0.024712f, 0.025453f, -0.000678f, 0.011138f, -0.004586f, -0.011974f, -0.025913f, 0.008813f, -0.004696f, -0.011080f, 0.004914f, -0.016005f, -0.015567f, -0.003692f, 0.007798f, 0.030886f, -0.046611f, -0.028306f, -0.025259f, -0.028351f, -0.008225f, 0.032035f, -0.019357f, -0.001146f, 0.031534f, -0.004932f, -0.014602f, -0.027831f, -0.007705f, -0.012144f, -0.057279f, -0.044521f, -0.012757f, 0.009729f, -0.005716f, 0.009699f, -0.012936f, -0.009399f, 0.026804f, 0.016079f, -0.028782f, -0.014997f, -0.032182f, -0.012959f, 0.002341f, 0.012493f, -0.005994f, 0.003143f, -0.027502f, -0.022058f, -0.020161f, -0.000835f, 0.004369f, 0.001442f, -0.026045f, 0.000568f, 0.034376f, 0.014680f, 0.039281f, -0.031436f, 0.048070f, 0.004008f, -0.030342f, -0.005271f, 0.001105f, 0.008214f, -0.005329f, 0.012897f, -0.018666f, 0.008457f, -0.016565f, 0.007413f, 0.010842f, -0.003776f, 0.024476f, -0.002338f, 0.005560f, -0.006945f, -0.009227f, -0.005312f, 0.000436f, 0.005332f, -0.009744f, -0.001949f, 0.002902f, -0.002369f, 0.009238f, -0.003110f, -0.005035f, -0.016249f, 0.006799f, 0.000766f, + 0.008101f, 0.003302f, -0.005629f, -0.015303f, 0.004590f, -0.019491f, 0.004624f, -0.005253f, -0.001053f, 0.001799f, -0.004392f, 0.001270f, 0.002778f, 0.013117f, 0.004982f, -0.006028f, -0.024444f, 0.004657f, -0.002694f, 0.056252f, 0.006129f, 0.027078f, -0.023476f, -0.015971f, -0.005776f, -0.026534f, -0.016837f, -0.025632f, -0.011911f, -0.016624f, 0.030533f, 0.007640f, 0.007707f, 0.031433f, -0.000835f, -0.001832f, 0.014222f, 0.028278f, 0.044278f, 0.032333f, -0.006639f, -0.012053f, -0.050965f, 0.014013f, 0.015996f, 0.006183f, -0.031771f, 0.036717f, 0.014680f, 0.021555f, -0.006005f, 0.002003f, 0.020914f, 0.045869f, 0.044739f, 0.025738f, 0.005442f, 0.047690f, 0.001273f, -0.014296f, 0.015534f, 0.028898f, 0.023558f, 0.042884f, 0.022729f, 0.000907f, 0.005216f, -0.025966f, 0.011286f, -0.064817f, -0.011050f, -0.006567f, 0.014414f, 0.050839f, 0.028698f, 0.007440f, 0.037044f, -0.026932f, -0.024292f, 0.005160f, -0.062794f, -0.015101f, 0.002661f, 0.011975f, 0.014631f, 0.016539f, -0.003707f, 0.027499f, 0.003527f, 0.014173f, 0.051020f, -0.031468f, -0.016231f, -0.008775f, 0.009790f, -0.006088f, + -0.048001f, -0.009204f, 0.032872f, -0.002506f, 0.041670f, -0.022452f, 0.001230f, 0.017071f, -0.003943f, 0.004687f, -0.017271f, -0.008649f, -0.013390f, -0.009143f, -0.014866f, -0.012432f, 0.003337f, 0.002398f, -0.029912f, -0.014115f, -0.016818f, -0.004701f, 0.005607f, 0.008869f, -0.013299f, -0.000761f, 0.004086f, -0.021319f, 0.003214f, -0.008714f, -0.013756f, -0.007479f, 0.001145f, 0.004916f, -0.009419f, -0.002653f, -0.014446f, -0.001414f, -0.003833f, -0.004996f, -0.010526f, -0.015831f, 0.003983f, 0.004851f, -0.008424f, -0.006219f, -0.006174f, -0.005049f, 0.002860f, 0.009925f, 0.002935f, 0.002901f, -0.043286f, -0.013577f, 0.007978f, 0.032893f, 0.060344f, -0.024128f, 0.001154f, 0.010053f, -0.010959f, 0.055939f, 0.009992f, -0.027416f, 0.049021f, -0.009995f, -0.016330f, 0.035120f, -0.031694f, -0.018491f, 0.002226f, 0.003167f, 0.004450f, 0.023039f, 0.012359f, 0.018716f, -0.005613f, 0.009975f, 0.028137f, 0.001812f, 0.019211f, 0.003610f, 0.000820f, 0.031097f, -0.040401f, -0.014613f, -0.013649f, 0.027081f, -0.020558f, -0.005265f, -0.012080f, 0.026821f, -0.011263f, 0.059546f, 0.043552f, -0.040406f, + 0.019922f, -0.048570f, 0.007062f, 0.017681f, 0.009547f, 0.010616f, -0.061950f, -0.011941f, -0.059746f, 0.008030f, 0.005010f, 0.007388f, -0.009374f, -0.010751f, 0.028687f, -0.051569f, 0.017841f, -0.022277f, -0.097243f, -0.036347f, -0.031779f, 0.016109f, -0.014105f, 0.014899f, 0.048777f, 0.052020f, 0.029485f, 0.027415f, 0.025430f, 0.007471f, -0.038628f, 0.040725f, 0.000136f, -0.044852f, -0.035700f, -0.056392f, -0.074759f, -0.038494f, -0.007510f, 0.059944f, 0.021638f, 0.003741f, 0.022993f, -0.018186f, -0.000365f, 0.011610f, 0.009627f, -0.004721f, 0.008832f, 0.002932f, 0.006144f, 0.002607f, -0.018443f, 0.015026f, 0.009970f, 0.007432f, 0.003028f, -0.009570f, 0.005307f, -0.014278f, -0.005080f, -0.022234f, 0.018656f, 0.014149f, -0.003020f, 0.002132f, 0.014935f, 0.023740f, -0.010584f, -0.022958f, -0.006945f, 0.018883f, -0.004120f, -0.013663f, 0.020115f, -0.001631f, -0.011609f, 0.013953f, 0.005603f, 0.001011f, -0.003400f, -0.000408f, -0.009854f, 0.006872f, -0.006271f, -0.002738f, 0.014419f, -0.077926f, -0.036612f, -0.027553f, 0.013505f, -0.059624f, 0.020337f, -0.035948f, 0.049352f, -0.059297f, + -0.074993f, -0.016837f, -0.011446f, 0.057470f, 0.027693f, 0.025177f, -0.015685f, 0.006030f, -0.036732f, -0.029691f, 0.005994f, 0.011455f, -0.047130f, -0.043910f, -0.030993f, -0.004609f, 0.022667f, 0.016092f, -0.033307f, -0.041854f, -0.024559f, -0.025018f, -0.056446f, -0.032928f, 0.023945f, -0.016267f, -0.001074f, -0.008420f, 0.017386f, 0.027999f, -0.008272f, -0.084215f, 0.034524f, 0.069087f, 0.025335f, -0.002260f, -0.084465f, -0.020707f, 0.035849f, -0.011139f, 0.092928f, -0.010704f, -0.076173f, 0.011759f, -0.013419f, 0.005558f, 0.001381f, -0.015785f, 0.019568f, 0.024412f, -0.080329f, -0.021938f, 0.003673f, 0.027540f, -0.015500f, -0.041230f, 0.035441f, 0.002969f, -0.027712f, -0.080007f, -0.092752f, -0.048026f, -0.006590f, 0.006161f, 0.073026f, 0.103529f, 0.052957f, 0.040249f, 0.017144f, -0.061001f, 0.021353f, -0.000849f, -0.032281f, -0.009639f, -0.100217f, -0.021499f, -0.001344f, 0.000238f, 0.002825f, 0.042907f, 0.015610f, 0.012450f, -0.018552f, -0.006214f, 0.037029f, -0.026194f, -0.001116f, -0.002051f, 0.006617f, -0.019556f, -0.032092f, -0.035595f, 0.014891f, -0.016850f, -0.006418f, 0.020110f, + 0.000055f, 0.002882f, -0.027475f, 0.008626f, 0.007971f, 0.004213f, -0.022738f, -0.011595f, -0.015214f, -0.023591f, 0.002427f, -0.013868f, 0.024253f, 0.009357f, -0.017716f, 0.002827f, -0.006999f, 0.016808f, -0.024116f, -0.003500f, -0.001724f, 0.011827f, 0.010318f, 0.005240f, 0.012610f, -0.000611f, 0.006353f, 0.140002f, 0.128588f, -0.054347f, 0.066684f, 0.059059f, -0.016675f, -0.010082f, -0.030755f, -0.016692f, -0.036140f, -0.025462f, 0.106694f, -0.005899f, 0.062151f, 0.000654f, 0.003009f, 0.000719f, -0.042133f, 0.009930f, 0.008720f, -0.092698f, 0.013791f, 0.022288f, -0.048703f, -0.010323f, -0.015004f, -0.006791f, 0.013722f, -0.002920f, 0.002852f, 0.040608f, 0.016570f, -0.020020f, 0.012611f, 0.064816f, 0.001126f, 0.029762f, -0.001546f, 0.024244f, -0.035774f, -0.043482f, -0.024158f, -0.079664f, 0.021331f, 0.008681f, -0.035237f, -0.096769f, -0.062991f, -0.090491f, 0.065840f, -0.047102f, 0.010354f, 0.016043f, 0.015036f, 0.012298f, 0.070269f, -0.067761f, 0.000504f, -0.038096f, 0.074388f, -0.166881f, 0.034307f, 0.012610f, 0.053424f, 0.048231f, 0.000378f, -0.015654f, -0.025362f, -0.007652f, + -0.048277f, 0.035260f, 0.098294f, -0.007768f, 0.020411f, 0.061661f, -0.043110f, 0.024307f, 0.030359f, -0.054819f, -0.037634f, -0.101394f, 0.083889f, -0.016585f, -0.073580f, 0.049157f, -0.012227f, 0.031992f, -0.002095f, 0.027679f, 0.004931f, -0.022012f, 0.034835f, 0.032879f, 0.005550f, 0.018681f, 0.031698f, 0.018395f, -0.021057f, -0.009477f, -0.020562f, -0.009536f, 0.026740f, 0.050502f, -0.002090f, -0.009812f, -0.001954f, 0.032260f, -0.051407f, 0.029120f, -0.013862f, 0.068411f, 0.013760f, -0.041455f, -0.008227f, 0.030080f, -0.015900f, -0.022010f, -0.015980f, -0.012942f, -0.015711f, 0.016232f, 0.012013f, 0.043469f, -0.036719f, 0.001706f, -0.004142f, 0.023475f, 0.001666f, -0.003731f, 0.014398f, 0.016739f, 0.013490f, 0.027967f, 0.003666f, 0.032314f, -0.048605f, -0.046088f, 0.056914f, -0.116019f, 0.079947f, -0.047866f, -0.033462f, -0.021059f, 0.007255f, -0.033615f, -0.026176f, 0.036339f, -0.011197f, -0.079361f, 0.027340f, -0.004890f, 0.014010f, -0.017892f, 0.070499f, -0.057574f, 0.002419f, 0.029253f, -0.020009f, 0.022155f, -0.046991f, 0.003851f, -0.040438f, -0.020482f, 0.043921f, 0.005634f, + 0.017586f, -0.024970f, 0.042459f, -0.012231f, -0.019849f, 0.016305f, -0.026037f, -0.021639f, -0.013922f, -0.014291f, -0.043883f, -0.058719f, -0.016369f, 0.032654f, 0.000504f, -0.018346f, -0.058672f, 0.002318f, -0.046374f, -0.003025f, 0.018669f, -0.045807f, -0.011295f, 0.033853f, 0.034290f, 0.024981f, -0.056937f, -0.026869f, 0.039258f, 0.012871f, -0.001088f, 0.031898f, -0.186870f, -0.043137f, -0.020822f, -0.084798f, 0.008378f, 0.023437f, -0.004958f, 0.015782f, 0.040098f, -0.022982f, -0.039694f, 0.010249f, -0.036031f, -0.010798f, 0.038940f, 0.061832f, -0.023358f, -0.074353f, -0.044901f, 0.004965f, -0.039689f, 0.006357f, -0.030774f, -0.028965f, 0.007829f, -0.059528f, 0.000784f, -0.037089f, -0.011363f, -0.020248f, 0.008448f, 0.015255f, -0.005826f, -0.036793f, 0.008285f, -0.002267f, -0.023219f, 0.029112f, -0.001095f, -0.027034f, -0.009249f, -0.006925f, -0.010139f, -0.018656f, 0.010396f, -0.017007f, 0.014302f, 0.019827f, -0.007518f, 0.002525f, -0.011281f, -0.025531f, -0.036283f, 0.006837f, 0.005108f, 0.017260f, -0.041998f, 0.009237f, 0.000127f, -0.026902f, 0.021350f, -0.010879f, 0.015405f, 0.034816f, + -0.076370f, 0.015990f, 0.011222f, 0.022773f, -0.012294f, -0.007257f, 0.025846f, 0.001428f, 0.125310f, -0.016094f, -0.034944f, 0.004581f, -0.014184f, 0.061994f, 0.011493f, -0.005459f, 0.058833f, 0.059720f, 0.019449f, 0.022994f, 0.032623f, -0.074028f, -0.041088f, 0.061075f, -0.008633f, -0.060797f, -0.030952f, -0.027687f, 0.041494f, 0.022208f, -0.022541f, -0.087713f, 0.026922f, 0.013567f, 0.011308f, 0.014208f, -0.010878f, 0.008724f, -0.065987f, 0.058554f, 0.040430f, 0.021505f, -0.033244f, -0.028086f, -0.000484f, 0.029253f, -0.006797f, 0.030432f, 0.012943f, -0.069375f, -0.031193f, 0.010826f, -0.070114f, 0.004025f, 0.012914f, -0.061433f, -0.086836f, -0.012191f, 0.025649f, -0.050315f, -0.105368f, -0.046026f, -0.027920f, 0.068053f, -0.041831f, 0.076814f, -0.016303f, 0.003582f, 0.032384f, 0.004480f, -0.118048f, -0.007844f, 0.004442f, 0.054934f, -0.105124f, -0.144617f, 0.010003f, -0.009411f, -0.092661f, 0.052063f, 0.024029f, -0.003415f, -0.000782f, 0.085165f, -0.122298f, 0.100038f, 0.020658f, 0.013452f, 0.040062f, -0.043774f, -0.040212f, -0.007519f, 0.018422f, -0.024841f, -0.002303f, 0.051448f, + -0.043974f, -0.034741f, 0.044928f, -0.025539f, -0.013263f, 0.019196f, 0.012045f, -0.050723f, 0.025461f, -0.016855f, -0.005094f, 0.018218f, 0.017222f, -0.053999f, -0.009284f, -0.041920f, 0.023137f, 0.033097f, 0.001717f, -0.069489f, 0.048955f, -0.011788f, -0.001570f, 0.030180f, -0.007962f, -0.025090f, -0.005048f, 0.039814f, -0.059944f, 0.041005f, 0.001763f, -0.004122f, 0.014485f, 0.008236f, -0.037671f, 0.017573f, -0.000625f, 0.002125f, -0.048963f, 0.033770f, -0.032215f, 0.037249f, 0.005053f, -0.043978f, 0.003209f, 0.006033f, -0.013192f, 0.006532f, 0.058915f, 0.023099f, 0.138647f, -0.057967f, -0.060469f, -0.025016f, -0.002187f, 0.131684f, -0.017994f, 0.109085f, -0.076108f, -0.029839f, 0.046350f, -0.082946f, -0.027130f, -0.078039f, 0.013214f, 0.079647f, -0.108980f, -0.039898f, -0.009021f, 0.033305f, -0.000545f, 0.012312f, 0.030670f, -0.007567f, -0.068920f, -0.063863f, 0.003625f, 0.045364f, 0.121904f, -0.026832f, 0.033370f, -0.034810f, 0.060402f, 0.002178f, 0.007451f, -0.016660f, -0.071271f, 0.002516f, 0.066574f, -0.011217f, -0.003422f, -0.024530f, -0.062102f, 0.082543f, 0.031829f, 0.055125f, + 0.074083f, -0.003460f, 0.004798f, 0.045875f, -0.117133f, 0.040817f, -0.058896f, 0.139399f, -0.012650f, 0.013887f, 0.021402f, -0.040431f, -0.040502f, 0.014186f, -0.058704f, 0.088541f, -0.051138f, -0.064895f, -0.065345f, 0.092583f, 0.031849f, 0.053740f, -0.011379f, 0.053691f, 0.054753f, -0.055110f, -0.015445f, -0.051093f, -0.026538f, 0.096497f, 0.068705f, 0.009271f, 0.019199f, -0.145466f, 0.100431f, 0.131448f, 0.015606f, -0.010266f, -0.024392f, -0.077907f, 0.113770f, -0.006256f, 0.008181f, -0.021931f, 0.003804f, -0.049039f, 0.106528f, -0.024936f, 0.052194f, 0.008638f, -0.017868f, -0.005771f, 0.102643f, -0.056013f, 0.050854f, 0.017216f, -0.042794f, 0.006452f, -0.013385f, 0.028629f, 0.008673f, 0.041837f, -0.016662f, 0.004839f, 0.008366f, 0.000048f, 0.041549f, 0.070708f, -0.021050f, -0.003012f, 0.008615f, 0.039126f, 0.011622f, -0.053350f, -0.035588f, 0.076576f, 0.015416f, 0.037891f, -0.073901f, -0.088875f, 0.083338f, 0.055604f, 0.026447f, -0.005648f, -0.068726f, -0.000756f, 0.012288f, -0.103395f, 0.070737f, -0.073532f, 0.008932f, -0.033883f, 0.027301f, -0.002854f, 0.038901f, -0.006258f, + -0.033649f, 0.057959f, -0.020352f, -0.008107f, 0.008916f, -0.024329f, -0.021143f, 0.066914f, -0.015788f, -0.009187f, -0.007835f, -0.003432f, 0.030701f, -0.023406f, 0.007231f, -0.017125f, 0.015325f, -0.014950f, -0.011402f, -0.035884f, 0.052490f, -0.032413f, 0.017404f, 0.008432f, 0.036364f, -0.040847f, 0.009137f, -0.016695f, 0.041248f, 0.005434f, 0.003270f, 0.032665f, 0.009715f, -0.054088f, -0.008016f, -0.009253f, 0.015017f, 0.023718f, 0.019785f, -0.049164f, 0.021043f, -0.037131f, 0.026255f, -0.021152f, 0.005559f, -0.012122f, 0.025916f, -0.010118f, 0.007485f, -0.054993f, 0.012969f, 0.026774f, -0.025262f, 0.025062f, 0.003376f, 0.009249f, 0.015544f, -0.022136f, 0.037987f, 0.015071f, -0.002192f, -0.011910f, 0.018429f, -0.011525f, 0.034448f, -0.028821f, -0.008679f, -0.027425f, 0.035668f, -0.035284f, 0.032391f, -0.029397f, 0.039402f, -0.033490f, 0.020630f, -0.033014f, 0.028964f, -0.002178f, 0.002947f, -0.009480f, 0.001498f, -0.005660f, -0.005176f, -0.010069f, 0.017182f, 0.006879f, -0.002447f, 0.005785f, -0.005334f, -0.009177f, 0.017253f, 0.002804f, 0.006503f, -0.011060f, 0.000625f, 0.017458f, + -0.020031f, -0.004718f, 0.011529f, 0.000416f, -0.006033f, -0.012696f, 0.031308f, -0.009766f, -0.015899f, 0.008337f, 0.002750f, -0.004814f, 0.003267f, -0.001634f, 0.002975f, -0.005173f, 0.004421f, -0.009079f, 0.015312f, -0.012582f, 0.017669f, 0.007940f, -0.043085f, 0.086971f, 0.007233f, 0.010913f, -0.034825f, -0.025660f, -0.055277f, 0.037008f, -0.015537f, -0.011314f, -0.024049f, -0.000979f, -0.021447f, -0.002703f, -0.002874f, 0.009671f, 0.010810f, -0.001746f, -0.002621f, -0.015750f, 0.014585f, 0.013638f, -0.013082f, 0.006093f, -0.029629f, 0.011738f, 0.005689f, -0.005228f, -0.004656f, -0.009920f, 0.009353f, 0.002023f, -0.021124f, -0.005709f, -0.006244f, -0.017529f, 0.028599f, 0.002956f, -0.018383f, 0.002751f, -0.007250f, 0.024929f, -0.008739f, -0.011731f, 0.004771f, -0.014953f, 0.029082f, 0.000791f, -0.016196f, 0.004568f, -0.006646f, 0.014211f, -0.018464f, -0.003694f, 0.005989f, -0.006730f, 0.012733f, -0.007340f, 0.003633f, 0.005766f, -0.016665f, 0.002277f, 0.016409f, -0.025245f, -0.001732f, 0.007605f, -0.023468f, 0.042571f, -0.039063f, 0.019419f, 0.006972f, -0.022310f, 0.043979f, -0.030015f, + 0.006995f, 0.005586f, -0.018711f, 0.014487f, -0.007692f, -0.014412f, 0.013975f, -0.017163f, 0.011064f, -0.007904f, -0.005884f, 0.012631f, -0.010615f, 0.004041f, -0.004351f, -0.000157f, 0.002393f, -0.005789f, 0.002628f, -0.000345f, -0.005701f, 0.011946f, -0.010269f, 0.008898f, 0.000255f, -0.008399f, 0.008113f, -0.014797f, -0.001502f, 0.003871f, -0.002510f, -0.002058f, 0.002009f, -0.007701f, 0.009337f, -0.004794f, -0.003424f, 0.000984f, 0.000902f, -0.006010f, -0.000982f, -0.003478f, 0.003179f, 0.004711f, -0.006836f, 0.005888f, -0.006529f, -0.001266f, 0.006166f, -0.004673f, 0.020324f, -0.093170f, -0.215098f, 0.056455f, 0.199125f, 0.168356f, 0.225905f, -0.111348f, -0.144298f, -0.217006f, -0.221800f, 0.015274f, 0.165390f, 0.182606f, 0.200034f, 0.066541f, -0.043509f, -0.158666f, -0.262704f, -0.143913f, 0.066854f, 0.103570f, 0.175241f, 0.132848f, 0.036311f, -0.023510f, -0.055323f, -0.131570f, -0.085247f, -0.081108f, -0.014848f, 0.069383f, 0.106335f, 0.056002f, 0.070999f, 0.035941f, -0.039958f, -0.006194f, -0.085480f, -0.118986f, -0.020338f, -0.027714f, 0.021023f, 0.112351f, 0.064743f, 0.055798f, + 0.016500f, -0.042012f, -0.043281f, -0.037269f, -0.061613f, -0.016095f, 0.002765f, 0.026498f, 0.032287f, 0.053769f, 0.015348f, -0.001836f, -0.027085f, -0.049955f, -0.004244f, 0.018059f, 0.018517f, 0.031552f, -0.007997f, -0.025059f, -0.012016f, -0.025093f, -0.019693f, 0.005410f, 0.014208f, 0.040399f, 0.034254f, 0.032739f, 0.001936f, -0.017499f, -0.065515f, -0.060906f, -0.024795f, 0.003951f, 0.050695f, 0.054372f, 0.022461f, 0.023080f, -0.002530f, -0.043773f, -0.026768f, -0.003123f, -0.010221f, 0.002393f, 0.004664f, 0.010575f, 0.008853f, -0.005628f, -0.014251f, 0.008496f, 0.013259f, 0.010866f, 0.011316f, -0.000995f, -0.008183f, -0.005101f, -0.022186f, -0.009131f, -0.012218f, -0.020898f, 0.012440f, 0.030408f, 0.035507f, 0.011761f, 0.012846f, -0.006885f, -0.008231f, -0.031743f, -0.047117f, -0.018185f, 0.005463f, 0.014752f, 0.018393f, 0.038695f, 0.036047f, 0.017444f, -0.014199f, -0.030285f, -0.034079f, -0.031986f, -0.023570f, -0.001620f, 0.028771f, 0.044395f, 0.035299f, 0.010190f, -0.016667f, -0.020152f, -0.019996f, -0.011676f, -0.007575f, -0.008782f, 0.008804f, 0.020289f, 0.015094f, 0.003186f, + -0.002527f, -0.001637f, -0.005110f, -0.006020f, -0.008297f, -0.003786f, 0.005035f, 0.004001f, 0.002673f, 0.002685f, 0.002606f, 0.001782f, -0.003517f, -0.003687f, -0.000575f, 0.000225f, -0.000056f, -0.000117f} + }, + { + {-0.010320f, -0.009100f, 0.011321f, -0.002316f, 0.009039f, 0.002637f, 0.013444f, -0.003134f, -0.006956f, -0.004792f, 0.008213f, 0.000228f, -0.002991f, -0.000797f, 0.009287f, -0.002474f, 0.001684f, 0.003258f, -0.006243f, -0.004751f, -0.002037f, 0.001712f, -0.006480f, 0.001645f, 0.001311f, -0.007506f, -0.002446f, -0.004492f, 0.000627f, -0.003283f, 0.001192f, 0.012236f, 0.006266f, -0.003584f, 0.000572f, -0.005817f, 0.004450f, -0.001569f, 0.007221f, -0.015015f, -0.001661f, 0.002316f, -0.005357f, 0.000955f, 0.007260f, 0.005546f, -0.006773f, -0.005005f, -0.005449f, -0.001017f, -0.004322f, -0.002194f, -0.006613f, 0.002509f, -0.000605f, -0.007636f, -0.003976f, -0.003089f, -0.000412f, 0.001563f, -0.001694f, -0.000802f, 0.003251f, 0.001288f, -0.003629f, 0.001875f, 0.008094f, -0.004182f, -0.001109f, -0.008748f, -0.003363f, -0.000692f, 0.003583f, -0.003707f, 0.001017f, 0.001459f, 0.001180f, 0.002804f, -0.006784f, -0.000242f, -0.003839f, 0.003184f, -0.002470f, -0.006527f, -0.001887f, -0.000223f, -0.000148f, -0.002895f, -0.003062f, 0.003149f, -0.001464f, -0.000604f, 0.001139f, 0.001830f, 0.000054f, -0.000448f, + 0.000327f, 0.001079f, 0.000040f, -0.000745f, 0.001413f, 0.000237f, -0.001294f, -0.001179f, 0.001318f, -0.000505f, 0.000458f, -0.000889f, 0.001188f, -0.001152f, -0.000762f, -0.000213f, -0.000276f, 0.000403f, 0.014044f, -0.005234f, 0.004579f, 0.011744f, -0.009502f, -0.010722f, -0.001561f, -0.002670f, -0.000111f, 0.005986f, 0.003349f, -0.014912f, 0.002353f, -0.008553f, -0.011757f, -0.000752f, 0.004343f, 0.004679f, -0.003819f, -0.000493f, -0.001234f, 0.006417f, -0.001303f, 0.005277f, -0.002438f, 0.000618f, 0.001184f, 0.001609f, -0.007432f, 0.003142f, 0.005799f, -0.002703f, 0.007383f, -0.004071f, -0.000772f, -0.009188f, 0.006564f, 0.001650f, -0.002396f, -0.007125f, -0.007030f, -0.003205f, -0.002380f, 0.003569f, -0.000745f, 0.003082f, 0.003082f, -0.006321f, 0.003974f, -0.008492f, 0.003074f, 0.004947f, 0.009411f, 0.009030f, -0.007746f, 0.003859f, -0.000461f, -0.002056f, 0.005526f, -0.004188f, -0.004962f, -0.003761f, 0.004513f, 0.002230f, 0.005872f, -0.005800f, 0.008823f, -0.002849f, -0.000406f, 0.002647f, 0.001495f, 0.005154f, -0.003861f, 0.007343f, 0.009310f, 0.016220f, 0.007572f, 0.005159f, + -0.009538f, -0.001753f, -0.006210f, -0.004524f, 0.005936f, -0.000775f, 0.007325f, 0.002975f, -0.000535f, -0.001457f, -0.001220f, 0.004204f, -0.003141f, 0.003352f, 0.004013f, -0.003133f, 0.001945f, 0.001449f, 0.000468f, 0.002395f, -0.001435f, -0.000446f, -0.003092f, -0.017182f, -0.018490f, 0.002111f, -0.001514f, 0.004401f, 0.004108f, 0.012217f, 0.005529f, 0.005838f, 0.002961f, -0.005970f, 0.002310f, 0.015434f, -0.010304f, -0.001151f, 0.000485f, 0.012392f, 0.007460f, 0.001733f, 0.005503f, -0.000972f, 0.004254f, 0.005717f, 0.012705f, 0.007043f, 0.007140f, 0.003840f, 0.003069f, 0.006197f, 0.002258f, -0.008838f, 0.005448f, 0.007318f, -0.002583f, 0.005325f, 0.007032f, -0.002434f, 0.002227f, 0.008774f, 0.003259f, -0.002097f, 0.003170f, 0.008955f, -0.000434f, -0.000082f, -0.001738f, 0.002470f, 0.008402f, -0.002458f, -0.004697f, 0.002438f, -0.002875f, 0.004445f, 0.005285f, -0.006218f, 0.001368f, -0.004010f, 0.000353f, 0.002573f, 0.007078f, 0.005821f, -0.014802f, -0.000012f, 0.007293f, -0.003755f, -0.006152f, 0.000854f, 0.001166f, 0.007326f, -0.000580f, -0.015802f, -0.006887f, 0.005147f, + -0.004369f, 0.007478f, -0.002042f, 0.000064f, 0.001924f, 0.009373f, 0.005895f, 0.003989f, -0.004781f, 0.007703f, -0.000889f, 0.004728f, 0.002343f, 0.000954f, 0.001640f, 0.001625f, -0.000088f, -0.001204f, 0.001060f, -0.000640f, -0.003806f, -0.001603f, -0.001547f, -0.000463f, -0.000853f, 0.000011f, -0.001128f, -0.002752f, 0.001412f, 0.000609f, -0.001380f, 0.000339f, 0.002643f, 0.001934f, 0.000935f, -0.000347f, -0.000408f, -0.000255f, -0.000109f, 0.002496f, -0.031272f, 0.004404f, 0.003249f, 0.014613f, -0.000547f, 0.011414f, 0.005866f, 0.002921f, -0.018319f, 0.000043f, -0.000262f, -0.014210f, 0.002298f, 0.010653f, 0.002040f, -0.000188f, -0.001324f, -0.005659f, -0.006490f, 0.002921f, 0.004215f, -0.000487f, 0.002818f, 0.003287f, 0.012797f, 0.001482f, 0.005677f, 0.005983f, -0.006687f, 0.001466f, -0.001564f, -0.001832f, -0.000841f, 0.004725f, -0.000714f, -0.003185f, -0.005109f, -0.003048f, 0.001653f, -0.009080f, -0.006452f, 0.003852f, -0.007227f, 0.002385f, -0.011880f, -0.014219f, -0.003623f, 0.017628f, -0.004647f, -0.001020f, 0.010401f, 0.003502f, 0.000774f, 0.011137f, -0.001569f, 0.001262f, + -0.001405f, 0.003279f, 0.007150f, -0.002777f, -0.011113f, 0.007122f, -0.006478f, -0.012319f, -0.004914f, -0.003432f, -0.000012f, 0.004557f, 0.013362f, 0.000111f, -0.000134f, -0.005209f, -0.000496f, 0.007904f, -0.003729f, -0.004055f, 0.009529f, -0.008030f, -0.000620f, 0.004382f, -0.009747f, -0.001888f, -0.003380f, -0.003276f, 0.001087f, -0.005199f, -0.007354f, 0.000474f, 0.004561f, -0.002099f, -0.003175f, -0.004145f, -0.004212f, -0.000568f, 0.003039f, 0.001390f, -0.000416f, -0.001212f, -0.003278f, 0.000176f, -0.001098f, -0.003981f, -0.005886f, -0.005002f, -0.000070f, -0.000625f, 0.002378f, -0.003887f, -0.000188f, -0.000550f, 0.001893f, -0.000286f, 0.000813f, 0.027881f, 0.000927f, -0.001678f, -0.010555f, -0.006067f, 0.014720f, -0.005940f, 0.011496f, 0.009893f, -0.011203f, -0.001815f, 0.008626f, -0.006267f, -0.003014f, -0.002923f, -0.004050f, 0.001861f, 0.003109f, 0.000541f, 0.005397f, -0.002433f, 0.000866f, 0.002042f, -0.002231f, -0.005261f, -0.005476f, -0.006200f, 0.000520f, 0.007268f, 0.003185f, -0.006121f, 0.000601f, 0.002879f, 0.013871f, -0.004081f, 0.012421f, -0.011263f, 0.005142f, 0.008954f, + -0.005859f, -0.003575f, -0.011473f, 0.005457f, -0.000076f, -0.008055f, 0.008046f, -0.009992f, 0.011276f, -0.000589f, 0.015943f, 0.003681f, 0.001779f, 0.003873f, 0.006668f, 0.003559f, -0.005090f, 0.007871f, -0.001409f, -0.008345f, -0.013047f, -0.003540f, 0.005612f, -0.006539f, -0.004205f, 0.005140f, -0.007270f, 0.014396f, -0.013763f, -0.000040f, 0.009302f, -0.007865f, -0.003072f, -0.014472f, -0.001022f, -0.005654f, -0.003116f, -0.004327f, 0.012611f, 0.004961f, 0.001345f, 0.000542f, 0.010890f, 0.001097f, -0.000860f, 0.008699f, 0.007209f, 0.006530f, 0.013515f, -0.002842f, 0.001384f, -0.003761f, 0.003872f, 0.004459f, 0.000979f, 0.001325f, -0.002194f, -0.000063f, -0.003136f, -0.001576f, 0.000390f, 0.001245f, 0.002217f, -0.001030f, -0.000389f, 0.004348f, 0.002089f, -0.001586f, 0.008416f, -0.000427f, -0.001990f, -0.003393f, -0.002156f, 0.003083f, -0.002778f, 0.000315f, -0.000262f, -0.002895f, 0.001376f, 0.000921f, -0.000707f, 0.002140f, 0.002289f, -0.002191f, 0.002373f, 0.013457f, 0.023816f, -0.006949f, -0.010353f, 0.002739f, -0.004219f, 0.006576f, 0.021685f, 0.000145f, -0.004973f, 0.006889f, + 0.003747f, 0.006428f, 0.003909f, -0.011783f, 0.000462f, -0.010515f, 0.005890f, 0.005103f, 0.003125f, 0.019825f, -0.000923f, 0.014783f, -0.000363f, -0.000352f, 0.004523f, -0.000112f, 0.015574f, 0.002069f, 0.009818f, -0.003604f, 0.013291f, -0.005968f, 0.007102f, 0.026283f, -0.004266f, -0.006621f, 0.018553f, 0.003909f, 0.012099f, -0.000284f, -0.011484f, 0.003601f, -0.006611f, 0.007950f, -0.013842f, -0.001845f, -0.007177f, 0.007838f, -0.001142f, 0.001625f, 0.014346f, -0.006944f, -0.014350f, 0.004040f, -0.001205f, -0.000668f, 0.011675f, 0.002261f, 0.001695f, -0.005238f, -0.009425f, -0.010021f, -0.003316f, -0.008272f, -0.006218f, 0.008587f, -0.004279f, -0.000806f, -0.003095f, 0.001019f, 0.000086f, 0.007666f, 0.004832f, -0.008759f, -0.012614f, -0.002950f, 0.000449f, 0.003499f, -0.003407f, -0.003097f, 0.010448f, 0.005942f, 0.005170f, 0.001521f, -0.008426f, -0.003906f, 0.004633f, 0.000210f, -0.002749f, 0.003717f, -0.001117f, 0.002271f, -0.002703f, 0.000234f, -0.001526f, -0.004797f, -0.005651f, -0.001503f, -0.004993f, 0.001348f, -0.000693f, 0.000509f, 0.003518f, -0.000909f, -0.002648f, 0.004265f, + 0.000978f, 0.002725f, 0.001653f, 0.000279f, -0.001518f, 0.002113f, -0.000462f, -0.000474f, -0.000089f, -0.000453f, 0.000253f, -0.000865f, 0.001257f, 0.002707f, -0.003231f, 0.000906f, -0.003821f, 0.000612f, -0.001809f, 0.032670f, -0.017148f, 0.011464f, 0.000448f, 0.005651f, -0.007889f, -0.006183f, -0.003593f, 0.007103f, 0.009151f, 0.001944f, -0.005013f, -0.009499f, 0.004967f, 0.009031f, -0.001765f, 0.002834f, -0.004831f, 0.009845f, 0.003651f, -0.018508f, -0.006075f, 0.005953f, -0.001076f, -0.007870f, -0.000368f, 0.008414f, -0.006175f, 0.002852f, -0.012028f, 0.007016f, 0.015223f, -0.006306f, 0.016102f, 0.000539f, -0.002927f, 0.010715f, -0.000458f, 0.000819f, 0.009704f, -0.020956f, 0.003151f, 0.006341f, 0.008917f, 0.006013f, 0.006967f, -0.009411f, -0.007283f, -0.000340f, 0.003345f, -0.010192f, 0.003369f, 0.009882f, 0.008888f, 0.003278f, 0.027128f, -0.008557f, -0.003397f, -0.012292f, -0.005258f, -0.008063f, -0.011286f, 0.013964f, 0.005835f, 0.013638f, -0.002131f, -0.021859f, 0.012722f, -0.007726f, 0.006993f, 0.006250f, 0.003055f, 0.003755f, -0.017249f, 0.020430f, 0.004467f, -0.009491f, + -0.016552f, -0.010391f, -0.010368f, 0.001435f, 0.008458f, -0.007725f, 0.000648f, 0.005183f, 0.004444f, -0.000008f, -0.003590f, 0.000833f, -0.000359f, 0.003210f, 0.003443f, 0.003679f, 0.002578f, 0.002426f, 0.001278f, -0.006037f, -0.005397f, 0.000245f, -0.001981f, 0.001952f, 0.002460f, -0.002816f, 0.003924f, -0.000969f, 0.001435f, 0.003223f, 0.001404f, 0.002497f, 0.000753f, -0.006421f, -0.000439f, -0.000104f, 0.002264f, 0.001644f, 0.000782f, -0.001468f, -0.001720f, 0.003443f, -0.001008f, 0.008414f, 0.001461f, 0.003627f, -0.039157f, -0.032963f, -0.030391f, 0.006781f, 0.006242f, 0.002544f, 0.001364f, -0.002170f, -0.002367f, 0.000813f, -0.005184f, -0.011028f, -0.007666f, -0.019305f, -0.008528f, -0.009371f, 0.011537f, -0.014839f, -0.006569f, -0.008401f, 0.002490f, 0.000168f, -0.003851f, 0.004327f, -0.001289f, -0.015407f, -0.000313f, 0.014135f, 0.001826f, -0.013744f, -0.012149f, 0.005308f, -0.004914f, 0.011863f, 0.008342f, -0.012986f, 0.012817f, 0.020232f, -0.016964f, -0.017376f, -0.009293f, 0.006382f, 0.016084f, -0.011460f, -0.011850f, 0.006085f, -0.006843f, 0.001251f, -0.001525f, -0.001477f, + -0.018454f, 0.003524f, 0.011171f, -0.005737f, 0.006396f, -0.009177f, -0.010912f, -0.010833f, -0.005362f, -0.018661f, 0.031958f, -0.006777f, -0.002158f, 0.005580f, 0.003476f, 0.006807f, 0.004352f, 0.009970f, 0.004552f, 0.008656f, 0.019780f, -0.025531f, 0.017863f, -0.006091f, -0.004855f, -0.000878f, -0.028495f, -0.001305f, 0.008719f, 0.000790f, 0.001123f, 0.007961f, 0.002913f, -0.000707f, 0.004737f, -0.009634f, 0.011153f, -0.004033f, -0.006494f, 0.006054f, -0.003950f, -0.003564f, 0.001141f, 0.004941f, -0.003814f, -0.006049f, 0.002057f, 0.004796f, 0.000188f, -0.002056f, -0.005273f, -0.002900f, 0.000727f, -0.007456f, -0.004982f, -0.002603f, 0.003555f, -0.001688f, 0.000267f, 0.003929f, 0.000067f, -0.007428f, -0.001692f, -0.006326f, -0.005625f, -0.005307f, -0.003276f, -0.005863f, 0.004963f, -0.001754f, 0.000326f, 0.010644f, -0.002124f, -0.003248f, -0.002881f, 0.005756f, 0.001444f, -0.001984f, -0.038506f, 0.029514f, 0.007820f, 0.006433f, -0.007129f, 0.028888f, -0.004547f, 0.013610f, -0.000041f, 0.012245f, -0.017194f, 0.006804f, 0.006746f, 0.002629f, -0.008459f, 0.025713f, -0.006972f, 0.007836f, + 0.005917f, 0.026686f, -0.018007f, -0.001175f, 0.007425f, -0.004645f, -0.013213f, 0.007970f, -0.012428f, 0.003210f, 0.003405f, -0.014601f, 0.005651f, 0.001190f, 0.000736f, 0.029349f, 0.018356f, -0.002465f, -0.012010f, -0.009395f, 0.006554f, -0.001570f, -0.017602f, 0.004988f, -0.001546f, 0.005176f, 0.013259f, 0.019517f, -0.013406f, 0.013268f, 0.006651f, -0.008812f, 0.006348f, 0.005097f, -0.013865f, -0.007515f, -0.008692f, 0.013967f, -0.015111f, -0.012850f, -0.034637f, -0.025397f, 0.007038f, -0.004784f, -0.004981f, -0.013361f, -0.026875f, 0.010292f, 0.002072f, -0.000813f, 0.013168f, 0.011194f, 0.015837f, 0.009383f, 0.003833f, -0.000475f, 0.002535f, 0.017877f, -0.013219f, 0.024488f, -0.009009f, -0.006968f, -0.022386f, 0.003551f, -0.004109f, -0.011433f, -0.002020f, 0.002708f, -0.005630f, 0.006504f, -0.002703f, 0.000265f, -0.002752f, -0.000909f, -0.002363f, -0.000561f, 0.004049f, 0.006400f, 0.000519f, 0.005281f, -0.005969f, -0.004264f, -0.003024f, 0.002189f, 0.004611f, -0.006107f, -0.002288f, -0.002857f, 0.000897f, -0.003417f, 0.002745f, -0.000634f, 0.002390f, 0.004031f, 0.000068f, -0.006510f, + 0.009184f, 0.008799f, 0.003678f, 0.000040f, -0.003961f, -0.000271f, -0.002062f, -0.000980f, 0.010387f, -0.046543f, 0.043063f, 0.030934f, -0.012615f, -0.010650f, 0.011629f, 0.000106f, 0.001060f, 0.020552f, 0.014547f, 0.000599f, -0.003025f, 0.008278f, -0.004774f, -0.002972f, 0.005803f, -0.009209f, 0.011573f, 0.007932f, -0.009611f, 0.012476f, -0.001335f, 0.003367f, -0.000900f, -0.020510f, -0.001136f, 0.014936f, 0.015486f, 0.006079f, 0.006640f, 0.008304f, -0.009546f, -0.012083f, 0.005232f, 0.009308f, -0.000377f, -0.004660f, -0.010528f, 0.004388f, -0.003079f, 0.013194f, 0.015538f, -0.001725f, 0.017910f, -0.009300f, 0.019959f, 0.010817f, 0.024053f, 0.001747f, 0.003526f, -0.006909f, -0.009806f, -0.001849f, 0.018466f, 0.030141f, 0.001844f, 0.022978f, -0.009882f, -0.022014f, 0.002967f, 0.008335f, -0.019237f, 0.020089f, -0.006614f, 0.007114f, -0.042402f, -0.018227f, -0.000250f, -0.010174f, 0.008242f, 0.014053f, 0.029496f, 0.006164f, 0.000251f, -0.014409f, -0.025576f, 0.006637f, 0.001137f, -0.021463f, 0.008846f, 0.004682f, -0.015475f, -0.004377f, 0.003747f, 0.017016f, 0.000426f, 0.005167f, + 0.005240f, 0.008885f, 0.007312f, -0.014341f, 0.005163f, -0.000221f, -0.002813f, 0.000349f, -0.000661f, -0.002270f, 0.006162f, 0.005820f, -0.005944f, -0.002432f, -0.000033f, 0.004168f, -0.002245f, 0.005930f, 0.000932f, 0.004332f, 0.003883f, -0.004642f, 0.003585f, 0.004344f, 0.011140f, 0.001051f, 0.006390f, 0.006981f, 0.001772f, 0.008189f, 0.003017f, 0.004247f, 0.001934f, 0.001075f, 0.003014f, 0.009615f, -0.004024f, -0.008767f, 0.002218f, 0.011461f, -0.018087f, 0.031060f, -0.013327f, 0.003734f, 0.023218f, 0.024028f, -0.001774f, -0.013806f, -0.007404f, -0.007321f, 0.001782f, -0.017847f, -0.014157f, 0.014949f, 0.003757f, 0.009611f, 0.011714f, 0.013844f, -0.006189f, 0.008981f, -0.003393f, 0.010754f, 0.044796f, 0.010551f, -0.021592f, 0.020972f, 0.024086f, 0.001050f, -0.003971f, 0.001273f, -0.011912f, -0.016423f, -0.008594f, 0.024561f, 0.016498f, 0.013601f, 0.020892f, 0.004235f, -0.003596f, -0.009603f, -0.026529f, 0.012296f, 0.013997f, 0.007770f, -0.004202f, -0.003285f, -0.009151f, 0.003691f, 0.021601f, 0.014884f, -0.024747f, 0.016349f, -0.020864f, 0.021999f, 0.004698f, 0.008236f, + 0.009837f, -0.003681f, -0.011792f, -0.003589f, 0.008858f, 0.038062f, -0.006059f, 0.019012f, -0.008453f, -0.017213f, 0.020212f, 0.018192f, 0.004619f, 0.004161f, 0.018330f, 0.006410f, 0.001082f, -0.002091f, -0.011651f, -0.003595f, -0.017093f, 0.005490f, -0.013270f, -0.006646f, 0.026978f, -0.001429f, 0.000736f, 0.000533f, 0.012446f, -0.004068f, 0.003716f, 0.008233f, 0.012534f, 0.013544f, 0.011300f, 0.004423f, 0.005939f, 0.006191f, 0.011355f, -0.001759f, -0.009058f, 0.012826f, 0.005103f, 0.007070f, 0.007797f, 0.000325f, -0.000899f, 0.000799f, -0.005652f, 0.003521f, 0.012174f, 0.001363f, 0.001569f, -0.002565f, -0.004513f, 0.010159f, 0.010941f, 0.002118f, 0.019389f, -0.002410f, 0.008372f, 0.014829f, 0.000958f, 0.004114f, -0.002137f, -0.005684f, 0.001540f, 0.003219f, 0.005382f, 0.010679f, 0.004673f, 0.008000f, 0.002989f, 0.001916f, 0.011139f, 0.015842f, -0.007995f, 0.016101f, 0.020569f, -0.023590f, 0.015888f, 0.009194f, -0.005702f, 0.001471f, 0.010931f, -0.009872f, -0.020839f, 0.031305f, 0.006767f, 0.005995f, 0.005851f, 0.018582f, 0.005416f, -0.018700f, 0.019979f, -0.026817f, + -0.031329f, 0.002786f, 0.003770f, -0.017300f, -0.005670f, -0.051240f, -0.036280f, -0.027322f, -0.009231f, -0.028109f, -0.013841f, 0.010662f, -0.025269f, 0.017734f, 0.016312f, -0.020582f, 0.026577f, 0.014178f, -0.005198f, -0.002674f, -0.013752f, 0.000597f, -0.024558f, 0.053895f, 0.015761f, 0.008399f, -0.026899f, 0.006553f, -0.008304f, 0.035740f, -0.007187f, -0.000931f, -0.032617f, 0.031921f, 0.002138f, 0.012502f, 0.010362f, 0.018617f, 0.010554f, -0.007228f, 0.010675f, -0.015896f, 0.016138f, -0.005834f, 0.009513f, -0.025446f, 0.057634f, 0.008792f, -0.026716f, 0.014501f, 0.016836f, 0.013156f, 0.019619f, 0.016739f, -0.025945f, 0.020693f, -0.000508f, 0.016687f, -0.013124f, 0.004960f, -0.033386f, 0.014047f, 0.014565f, 0.004226f, -0.008006f, -0.025260f, -0.001625f, 0.017291f, -0.022409f, -0.003061f, -0.002635f, -0.000108f, 0.006874f, 0.005203f, -0.005037f, 0.009716f, -0.000548f, -0.004763f, 0.007699f, 0.005906f, -0.006998f, -0.005661f, -0.014626f, -0.000918f, -0.013605f, 0.008185f, 0.002309f, 0.001367f, 0.010743f, 0.016524f, 0.010502f, 0.007774f, 0.005280f, -0.005879f, -0.002271f, 0.000170f, + -0.010609f, -0.008791f, -0.002410f, -0.003561f, 0.005787f, 0.013419f, 0.004273f, 0.008488f, -0.001893f, -0.000166f, -0.041657f, 0.011692f, -0.005702f, -0.004048f, 0.024737f, -0.004543f, -0.004211f, 0.002408f, 0.022148f, -0.005758f, 0.012920f, -0.010804f, -0.012743f, -0.016284f, -0.020652f, 0.035894f, 0.018715f, 0.013032f, -0.011267f, -0.032852f, -0.040324f, 0.019431f, 0.013384f, -0.014296f, 0.009617f, -0.009709f, 0.000967f, 0.035729f, 0.015605f, -0.010103f, 0.019268f, -0.006480f, 0.010002f, -0.011872f, 0.012095f, -0.026348f, -0.038760f, -0.015037f, -0.017287f, -0.002911f, 0.045373f, -0.036900f, 0.021361f, 0.012303f, 0.009278f, -0.008127f, 0.017864f, 0.008010f, -0.035452f, -0.045063f, -0.016045f, -0.020531f, 0.051075f, 0.037064f, -0.012363f, -0.022732f, -0.001893f, -0.023327f, -0.004933f, 0.037222f, 0.034435f, 0.019582f, -0.030365f, 0.006612f, -0.023719f, 0.037322f, 0.017704f, -0.003885f, 0.000133f, 0.012606f, -0.022015f, 0.005011f, 0.032882f, 0.017924f, -0.029743f, 0.032381f, -0.016493f, 0.019380f, 0.051307f, 0.019658f, -0.012081f, -0.015121f, 0.043910f, 0.004918f, -0.002676f, -0.019869f, + 0.007736f, -0.009323f, 0.002825f, -0.005787f, -0.001037f, -0.001215f, -0.021872f, 0.002849f, -0.002725f, -0.006144f, 0.009617f, -0.001603f, -0.007739f, 0.001490f, -0.004601f, 0.001315f, -0.005711f, -0.008418f, 0.007577f, -0.009341f, -0.006045f, 0.004581f, 0.011414f, -0.000461f, 0.008059f, 0.006760f, -0.001523f, 0.000079f, -0.011002f, 0.001623f, 0.003718f, -0.009198f, 0.012486f, 0.006286f, -0.007628f, -0.004991f, -0.005328f, -0.002245f, -0.012287f, 0.007392f, 0.011633f, 0.000666f, -0.009152f, -0.005176f, 0.006038f, -0.002517f, 0.005803f, 0.008348f, 0.000584f, 0.003168f, -0.033096f, -0.012958f, 0.055449f, 0.025678f, 0.031958f, 0.007806f, -0.046051f, 0.014246f, -0.037360f, 0.024591f, 0.069300f, 0.024647f, 0.043485f, -0.019558f, 0.012566f, 0.020210f, -0.002072f, 0.005227f, -0.017761f, 0.004548f, 0.027262f, 0.001457f, -0.007249f, -0.024581f, 0.013559f, 0.010183f, -0.025050f, 0.013099f, -0.009502f, 0.019208f, 0.027406f, 0.029142f, 0.035100f, 0.003552f, -0.027188f, 0.007391f, 0.016595f, -0.000273f, 0.047784f, 0.004238f, -0.054882f, -0.034414f, 0.015643f, -0.013933f, -0.064774f, 0.002391f, + 0.027640f, 0.010233f, 0.002919f, -0.005854f, 0.034153f, -0.026774f, -0.033226f, -0.006379f, -0.011882f, -0.032320f, -0.001774f, 0.002414f, -0.018828f, -0.027821f, -0.017045f, 0.001422f, 0.004057f, -0.040207f, 0.012045f, -0.016733f, 0.009811f, 0.046524f, -0.006324f, -0.016101f, 0.032407f, -0.005576f, 0.026986f, -0.025479f, 0.017435f, 0.001200f, -0.029533f, -0.032939f, 0.059584f, 0.005862f, 0.008068f, 0.002889f, 0.000086f, 0.059785f, 0.048817f, 0.015491f, -0.004468f, 0.023489f, -0.011446f, 0.008068f, 0.013986f, -0.002504f, 0.018373f, 0.007970f, 0.005374f, -0.027123f, 0.016218f, 0.008772f, -0.001496f, 0.002561f, -0.009179f, 0.007927f, 0.021107f, -0.003394f, -0.006807f, -0.011599f, -0.012729f, 0.012776f, 0.014990f, 0.000914f, 0.000105f, -0.011419f, -0.012330f, 0.002322f, -0.017724f, 0.002638f, -0.005864f, 0.018745f, 0.006688f, 0.000924f, -0.011692f, -0.020426f, -0.004618f, -0.009846f, -0.013778f, 0.008113f, 0.008349f, 0.016108f, 0.046884f, 0.006094f, -0.064207f, -0.029042f, 0.039844f, -0.057425f, 0.032639f, -0.054345f, 0.004422f, -0.008677f, -0.078600f, -0.010354f, 0.035386f, 0.072348f, + 0.023046f, -0.010506f, 0.017568f, -0.027743f, -0.009301f, -0.063107f, -0.003508f, -0.042861f, -0.006171f, -0.009381f, -0.029624f, -0.031431f, -0.010438f, 0.018071f, -0.028471f, 0.019627f, 0.036133f, -0.037233f, 0.013503f, 0.012030f, 0.006396f, -0.039624f, -0.006050f, -0.000406f, -0.041512f, 0.010831f, 0.052879f, -0.004010f, -0.076767f, 0.027194f, -0.046367f, -0.118365f, 0.033383f, -0.048948f, -0.060876f, 0.003249f, -0.027876f, 0.008456f, 0.020927f, -0.011659f, 0.031171f, -0.026048f, 0.027229f, -0.021491f, -0.052975f, 0.000318f, 0.037907f, 0.036348f, -0.068837f, 0.010135f, -0.008233f, -0.051237f, -0.013706f, -0.012689f, 0.089172f, 0.044527f, 0.052309f, 0.023840f, 0.022750f, 0.055193f, 0.079277f, -0.018090f, -0.037560f, -0.040979f, 0.007197f, -0.050914f, -0.015667f, 0.026370f, 0.042827f, 0.006026f, 0.003890f, 0.037193f, -0.008609f, -0.021094f, -0.028706f, 0.022411f, 0.025413f, 0.024972f, 0.005830f, 0.028646f, 0.011878f, -0.017559f, -0.003901f, -0.017007f, 0.026123f, 0.004225f, -0.003054f, -0.029292f, 0.008889f, 0.023484f, 0.002578f, 0.000449f, 0.022941f, -0.018306f, -0.012248f, 0.012702f, + 0.001295f, -0.009236f, -0.017636f, -0.005627f, 0.026995f, -0.001300f, -0.059768f, -0.005546f, -0.001478f, -0.013688f, -0.011654f, -0.015781f, -0.009676f, 0.013036f, 0.011657f, 0.006946f, 0.004138f, -0.009814f, -0.012399f, 0.103780f, 0.112191f, -0.065862f, -0.026093f, 0.050089f, -0.022725f, 0.020204f, -0.031256f, 0.009349f, -0.032114f, -0.060152f, 0.081958f, 0.011949f, 0.025738f, 0.021078f, 0.007675f, 0.010765f, 0.002463f, 0.016608f, 0.020365f, -0.058206f, -0.047985f, -0.042041f, -0.039690f, -0.029734f, -0.018739f, -0.015533f, -0.031205f, -0.017680f, -0.026446f, 0.030073f, 0.022868f, 0.011563f, -0.014573f, 0.006110f, -0.061585f, -0.030944f, 0.016754f, -0.055970f, -0.005173f, 0.027242f, 0.048321f, 0.007082f, 0.009366f, -0.020672f, -0.036141f, -0.042630f, 0.034249f, -0.004635f, 0.033908f, -0.119527f, 0.007468f, -0.013897f, 0.013764f, 0.073086f, 0.008979f, 0.012199f, 0.008250f, -0.021407f, -0.024615f, 0.000673f, -0.004856f, -0.067104f, 0.014404f, -0.024610f, 0.060200f, 0.004017f, -0.065944f, -0.089771f, -0.055775f, -0.011332f, -0.063039f, -0.061734f, -0.038299f, 0.043545f, -0.011273f, -0.042514f, + -0.057324f, 0.047915f, -0.006157f, 0.028355f, -0.032248f, 0.017401f, 0.047246f, -0.031367f, -0.045481f, -0.019103f, -0.023480f, 0.049411f, 0.010422f, -0.021661f, 0.019478f, 0.014500f, 0.043006f, 0.026689f, 0.012528f, -0.038176f, -0.038043f, -0.008361f, 0.004477f, -0.009985f, 0.006902f, 0.026488f, -0.005771f, -0.002216f, -0.019303f, -0.014151f, -0.010515f, -0.020093f, -0.003762f, 0.008273f, 0.012187f, 0.062456f, 0.004212f, -0.015637f, -0.004918f, 0.008376f, 0.019572f, -0.001107f, 0.030963f, 0.012985f, 0.071417f, 0.011084f, -0.000471f, 0.002641f, 0.013130f, -0.019763f, -0.030702f, 0.116891f, -0.067756f, 0.044390f, 0.082837f, -0.039682f, 0.011799f, 0.066207f, -0.083665f, 0.003415f, 0.009497f, 0.040835f, -0.093836f, 0.005307f, 0.006450f, 0.030981f, -0.040877f, 0.000612f, 0.016959f, -0.055167f, 0.008353f, -0.004102f, -0.010199f, 0.030525f, -0.009010f, -0.008239f, 0.012991f, -0.007142f, -0.009270f, 0.029950f, -0.027755f, 0.008337f, -0.011359f, 0.007737f, -0.017734f, -0.009788f, -0.021658f, 0.000430f, 0.004375f, 0.058523f, 0.019552f, 0.028507f, -0.005769f, 0.000794f, 0.043422f, -0.001696f, + -0.016239f, 0.024416f, 0.018029f, -0.019367f, -0.056529f, 0.052080f, -0.056339f, 0.009397f, 0.027256f, 0.035762f, -0.055441f, 0.059544f, 0.095576f, -0.052007f, -0.096842f, 0.129985f, 0.046038f, -0.063933f, 0.029804f, -0.061536f, -0.076466f, -0.038021f, -0.013848f, -0.079860f, 0.064969f, -0.111395f, 0.033683f, 0.053460f, -0.044127f, -0.148978f, 0.141279f, -0.024337f, -0.036206f, 0.094244f, -0.093556f, 0.048653f, 0.080434f, -0.023846f, -0.021838f, 0.025145f, 0.027748f, -0.014835f, 0.010123f, 0.008462f, 0.025628f, -0.012318f, -0.009067f, 0.028716f, 0.000118f, 0.006626f, -0.002830f, 0.005597f, 0.022966f, 0.017105f, -0.002904f, -0.020080f, 0.033571f, 0.036365f, -0.006642f, -0.030767f, -0.003105f, 0.015577f, 0.003504f, 0.022524f, 0.000301f, 0.019751f, 0.008444f, 0.028841f, 0.021302f, 0.024284f, -0.035421f, 0.009471f, -0.000495f, 0.001773f, 0.000333f, -0.021404f, -0.038278f, 0.056648f, -0.008897f, -0.051707f, 0.019119f, 0.012994f, 0.005632f, -0.008202f, -0.035775f, -0.028384f, 0.064856f, -0.042913f, -0.034329f, -0.068453f, -0.031562f, 0.040546f, 0.031449f, -0.018329f, -0.022836f, 0.021553f, + 0.053785f, -0.023242f, 0.040555f, 0.048567f, -0.034619f, -0.005056f, 0.029638f, -0.007796f, -0.000268f, -0.009929f, 0.002475f, -0.049811f, 0.013496f, -0.011128f, 0.001555f, 0.011871f, -0.010128f, 0.010152f, -0.020759f, -0.041741f, -0.019832f, -0.072600f, 0.008940f, -0.000264f, -0.010944f, 0.013342f, 0.006782f, -0.004831f, -0.016650f, 0.029036f, 0.045922f, -0.048495f, 0.070629f, -0.008083f, 0.009325f, 0.010149f, 0.062421f, 0.028597f, 0.045646f, -0.057535f, -0.014360f, -0.010875f, 0.081412f, -0.076183f, -0.026106f, 0.037092f, -0.002855f, -0.087958f, 0.005842f, -0.018225f, -0.015133f, 0.040012f, 0.043855f, 0.002989f, -0.033100f, 0.070894f, -0.030010f, 0.118293f, 0.001464f, -0.055026f, -0.000173f, -0.009633f, -0.062250f, 0.118851f, 0.023810f, -0.017833f, -0.140904f, -0.070461f, 0.039584f, -0.051923f, -0.046739f, 0.055054f, -0.206495f, 0.005119f, 0.040599f, 0.029781f, -0.016773f, 0.057967f, -0.035590f, -0.004689f, 0.000205f, 0.030156f, -0.008653f, 0.006099f, 0.041078f, -0.002949f, -0.010428f, -0.013095f, -0.014850f, -0.000727f, 0.004567f, -0.002813f, -0.006271f, 0.026511f, -0.037259f, -0.008417f, + 0.004394f, 0.006145f, -0.022327f, -0.037778f, -0.009624f, -0.011638f, -0.005420f, -0.003199f, 0.007285f, -0.041893f, 0.003203f, 0.031687f, -0.019781f, 0.024223f, 0.018600f, -0.018275f, 0.001139f, -0.013384f, 0.005289f, 0.008898f, -0.019496f, 0.054795f, -0.026602f, -0.024572f, -0.031716f, 0.026523f, 0.035981f, 0.021964f, 0.089422f, -0.017183f, 0.020280f, -0.008527f, -0.046106f, 0.023151f, -0.029377f, -0.016536f, 0.018460f, 0.040129f, -0.042267f, 0.046233f, 0.005334f, -0.002298f, 0.094225f, -0.019102f, -0.010446f, 0.070640f, -0.045124f, 0.062407f, 0.026937f, -0.014752f, 0.024897f, 0.026308f, 0.058214f, 0.060541f, 0.017597f, -0.049094f, 0.102828f, -0.103109f, 0.003490f, 0.093891f, -0.050508f, 0.020821f, -0.011131f, -0.012127f, -0.108727f, 0.073874f, 0.019541f, 0.032815f, 0.034638f, -0.022554f, -0.054121f, -0.040664f, -0.032979f, 0.005186f, 0.103325f, 0.000734f, 0.081043f, -0.026926f, -0.062368f, 0.003464f, 0.023307f, -0.051195f, 0.083163f, 0.033860f, 0.040868f, 0.082162f, 0.053184f, -0.087844f, 0.033523f, -0.126015f, -0.155715f, 0.003292f, 0.131129f, 0.082261f, 0.010611f, -0.092737f, + -0.331353f, -0.060897f, 0.102463f, 0.117109f, 0.165935f, -0.008406f, -0.210432f, -0.118674f, -0.109622f, 0.168271f, 0.128602f, -0.023193f, -0.084090f, -0.049178f, -0.102261f, -0.013028f, 0.131747f, -0.012759f, 0.030820f, 0.022028f, -0.021603f, -0.047700f, 0.071803f, -0.029111f, 0.040059f, 0.029396f, -0.002724f, -0.066651f, 0.091438f, -0.036028f, -0.017264f, 0.026506f, 0.023727f, -0.049459f, 0.000826f, -0.015478f, -0.018671f, 0.006339f, -0.001778f, 0.036650f, -0.065392f, 0.034693f, -0.078700f, -0.012400f, -0.013120f, 0.093613f, 0.002789f, 0.025436f, -0.057107f, 0.029907f, -0.021469f, 0.041401f, 0.049469f, -0.023872f, -0.056800f, 0.020523f, 0.014720f, 0.047938f, 0.013443f, -0.081234f, 0.068225f, -0.051076f, -0.008836f, -0.033073f, 0.031710f, -0.037152f, -0.001581f, -0.003907f, -0.010079f, 0.007624f, 0.034937f, -0.036903f, 0.016238f, 0.002897f, -0.008544f, 0.000515f, 0.024637f, -0.031195f, -0.008534f, -0.004572f, 0.051169f, -0.051818f, 0.013742f, -0.022709f, 0.033907f, -0.037831f, -0.010763f, 0.012973f, -0.007329f, 0.007183f, -0.024476f, -0.004328f, 0.022129f, -0.006721f, 0.008548f, 0.007024f, + 0.004628f, 0.027689f, -0.025652f, 0.017376f, 0.019960f, 0.024722f, -0.003476f, -0.057329f, 0.007339f, 0.006830f, 0.023347f, 0.021353f, -0.004188f, 0.005744f, -0.009676f, -0.026044f, -0.004457f, 0.011982f, -0.004936f, 0.034862f, -0.028378f, -0.009351f, -0.056605f, 0.016934f, 0.006087f, -0.008884f, 0.012612f, 0.011083f, -0.000848f, -0.029181f, 0.009072f, 0.028601f, -0.005599f, -0.004115f, 0.011182f, -0.011473f, 0.021280f, -0.013102f, 0.003574f, -0.026774f, 0.012646f, 0.005132f, -0.004321f, -0.007282f, 0.015481f, -0.007370f, -0.011331f, -0.016112f, 0.016841f, -0.000610f, -0.008555f, -0.003542f, 0.016753f, -0.006573f, 0.007361f, -0.009239f, -0.005702f, -0.000785f, 0.000518f, -0.000077f, -0.009346f, 0.001117f, 0.000193f, -0.007687f, 0.007870f, -0.007285f, 0.021886f, 0.003611f, 0.002841f, -0.030321f, 0.008485f, -0.000478f, -0.012262f, 0.013934f, 0.025689f, -0.018560f, -0.004333f, -0.000559f, -0.013584f, 0.020618f, -0.003530f, 0.003092f, -0.013625f, 0.007236f, -0.003024f, 0.002700f, -0.008762f, -0.046267f, 0.112342f, 0.030662f, 0.027794f, -0.014797f, -0.035904f, -0.034531f, 0.009863f, 0.021860f, + 0.003483f, -0.001222f, -0.000078f, -0.016343f, -0.002945f, 0.007949f, -0.004310f, 0.003461f, -0.001719f, -0.016367f, -0.000820f, 0.008210f, 0.012860f, -0.011367f, 0.003182f, 0.008291f, -0.016348f, 0.026957f, -0.016292f, -0.014164f, -0.014121f, 0.003754f, 0.007887f, 0.012553f, -0.013587f, 0.017484f, -0.025047f, 0.016699f, 0.014840f, -0.010952f, -0.001119f, -0.000710f, -0.002862f, 0.013039f, -0.013923f, 0.004158f, -0.004439f, -0.017946f, 0.025578f, -0.014186f, -0.000467f, -0.010483f, -0.003294f, 0.017918f, -0.023248f, 0.009570f, 0.006462f, -0.010058f, 0.008557f, -0.019743f, 0.005768f, 0.008363f, -0.014736f, 0.000463f, 0.007929f, -0.013527f, 0.013697f, -0.018713f, 0.005228f, 0.019406f, -0.028237f, 0.008243f, -0.010791f, 0.002068f, 0.011091f, -0.008311f, -0.004324f, 0.002120f, 0.002411f, -0.001561f, 0.007922f, -0.005901f, -0.005215f, 0.004003f, -0.004665f, 0.002673f, -0.001808f, 0.003474f, 0.003111f, -0.004418f, 0.002264f, -0.000719f, 0.004079f, -0.003614f, -0.001088f, 0.002921f, 0.000057f, -0.002019f, -0.006600f, 0.004317f, 0.004315f, -0.000817f, -0.004580f, 0.004497f, -0.000269f, -0.001866f, + 0.004408f, -0.009172f, -0.001954f, 0.005468f, -0.006800f, 0.009992f, -0.006074f, 0.000650f, 0.016205f, -0.004538f, 0.011652f, -0.006465f, -0.000725f, 0.013143f, -0.009148f, 0.016812f, -0.086799f, -0.203621f, 0.057606f, 0.199284f, 0.137047f, 0.216704f, -0.120684f, -0.128460f, -0.175157f, -0.202756f, 0.004333f, 0.156398f, 0.161585f, 0.168699f, 0.033103f, -0.055778f, -0.110656f, -0.158816f, -0.134609f, 0.010461f, 0.104533f, 0.123993f, 0.111566f, 0.026676f, -0.030854f, -0.019282f, -0.087150f, -0.097480f, -0.041133f, -0.002680f, 0.037468f, 0.082153f, 0.040123f, 0.029783f, 0.041143f, -0.020581f, -0.048898f, -0.008031f, -0.078162f, -0.036686f, 0.000841f, 0.012375f, 0.059536f, 0.069317f, 0.006134f, -0.010538f, -0.006534f, -0.051205f, -0.013885f, -0.000749f, -0.010668f, 0.017683f, 0.034247f, -0.007341f, -0.002739f, -0.013484f, -0.021418f, 0.004355f, 0.002093f, -0.002371f, 0.038644f, 0.026140f, 0.009649f, -0.001021f, -0.036487f, -0.052758f, -0.041715f, 0.002974f, 0.039216f, 0.033650f, 0.044185f, 0.005977f, 0.001126f, 0.010018f, -0.054891f, -0.031266f, -0.025825f, -0.004728f, 0.042075f, 0.009484f, + 0.014100f, 0.039239f, -0.022692f, -0.033014f, -0.007702f, -0.005667f, 0.012151f, 0.014123f, 0.004404f, 0.007869f, 0.003437f, -0.020280f, -0.021001f, -0.005151f, -0.000031f, 0.015050f, 0.021805f, 0.007129f, -0.003108f, -0.004773f, -0.006236f, 0.005436f, -0.006150f, -0.025775f, -0.004065f, 0.006039f, 0.011907f, 0.025603f, 0.006221f, -0.005345f, -0.012340f, -0.021106f, -0.004632f, 0.002098f, 0.006851f, 0.012031f, 0.015044f, 0.011841f, -0.006100f, -0.018287f, -0.019268f, -0.016821f, -0.001943f, 0.008340f, 0.009243f, 0.024745f, 0.025411f, 0.012378f, -0.005501f, -0.031272f, -0.033072f, -0.015336f, -0.011594f, 0.011675f, 0.030861f, 0.022869f, 0.009893f, 0.000132f, -0.002447f, -0.004014f, -0.009422f, -0.015502f, -0.014897f, -0.006334f, 0.002246f, 0.006532f, 0.010442f, 0.015147f, 0.014493f, 0.005686f, -0.005294f, -0.011670f, -0.012142f, -0.007793f, -0.001710f, 0.001194f, 0.001018f, 0.000329f, 0.000141f}, + {-0.008192f, -0.005439f, 0.002300f, -0.002093f, -0.002582f, -0.003986f, 0.000979f, 0.007943f, -0.002541f, 0.000040f, 0.000817f, 0.013597f, -0.000262f, 0.002610f, -0.005584f, -0.003874f, -0.001383f, -0.003648f, -0.003925f, -0.003679f, -0.002502f, -0.003495f, -0.004624f, 0.003905f, 0.006463f, -0.003537f, 0.000987f, 0.000275f, -0.007326f, 0.000220f, -0.000159f, -0.005188f, 0.009817f, -0.005001f, 0.005583f, 0.002142f, -0.001503f, -0.005617f, -0.005201f, 0.005063f, -0.002625f, -0.001886f, -0.007752f, -0.001960f, -0.000719f, -0.003642f, 0.010351f, -0.002245f, -0.000651f, 0.004342f, -0.000755f, -0.008609f, -0.004432f, -0.007587f, -0.005108f, 0.011817f, -0.003318f, 0.013140f, -0.000056f, -0.000526f, -0.002382f, 0.001546f, 0.000549f, -0.007785f, -0.008320f, 0.006076f, 0.000687f, 0.004137f, -0.000561f, 0.004815f, 0.002941f, -0.007542f, -0.000053f, 0.002538f, 0.004075f, 0.000009f, 0.003439f, 0.006290f, -0.008361f, 0.002226f, 0.002146f, -0.004162f, -0.000005f, 0.001922f, 0.005994f, 0.003972f, -0.004184f, -0.001243f, -0.000231f, 0.001426f, 0.001904f, 0.001475f, 0.001566f, -0.001075f, 0.000812f, -0.002252f, + -0.001461f, -0.000011f, 0.003051f, 0.001367f, -0.000094f, -0.000196f, -0.002074f, 0.001240f, -0.000162f, -0.000684f, -0.000180f, 0.001107f, 0.000455f, 0.000802f, 0.001966f, -0.000630f, 0.000863f, 0.002393f, 0.017987f, -0.001348f, -0.002116f, -0.004543f, -0.009756f, -0.012047f, -0.011018f, 0.001286f, 0.009916f, 0.003505f, 0.013222f, 0.004579f, -0.005927f, 0.001645f, -0.015628f, -0.013228f, 0.006221f, -0.004614f, 0.008742f, -0.000763f, -0.006918f, -0.003420f, 0.017312f, 0.003905f, 0.007348f, -0.000282f, 0.005638f, -0.002525f, -0.002072f, 0.003468f, -0.002330f, -0.007490f, -0.000507f, 0.002810f, -0.000830f, -0.000403f, 0.011030f, 0.006842f, -0.011755f, 0.000319f, -0.007439f, 0.012489f, 0.007405f, 0.000569f, -0.004370f, -0.004495f, 0.005774f, 0.003242f, 0.009333f, -0.008572f, 0.014786f, 0.018129f, -0.004931f, 0.017665f, 0.000025f, 0.009281f, 0.005789f, -0.003209f, 0.003103f, 0.014168f, -0.001602f, -0.009480f, 0.008210f, 0.002682f, -0.000055f, -0.001048f, -0.001627f, 0.000653f, 0.008290f, -0.005246f, 0.003044f, 0.002258f, 0.004413f, -0.006783f, 0.007818f, 0.001847f, -0.000636f, 0.002505f, + 0.001180f, 0.000802f, -0.000281f, 0.001803f, 0.004615f, -0.003174f, 0.001890f, 0.001258f, 0.001969f, -0.002894f, 0.000256f, -0.004672f, 0.000868f, 0.002261f, -0.002680f, -0.001699f, 0.000673f, 0.001346f, 0.001581f, 0.000471f, 0.001443f, 0.000040f, 0.000069f, -0.015575f, -0.012184f, 0.003783f, -0.006911f, 0.004871f, -0.008628f, -0.012251f, -0.011317f, 0.001534f, -0.008460f, 0.007678f, 0.005633f, -0.010879f, -0.002254f, 0.004369f, 0.001013f, 0.005382f, -0.003215f, 0.005569f, 0.006896f, -0.009664f, 0.003061f, 0.003123f, -0.007742f, 0.004496f, 0.000780f, -0.009160f, 0.006754f, 0.006481f, -0.003253f, 0.007085f, 0.001013f, 0.005773f, 0.005261f, 0.002155f, -0.003436f, -0.000901f, -0.010936f, -0.003345f, -0.005439f, 0.005704f, 0.006055f, 0.002340f, -0.017514f, 0.003293f, 0.007377f, -0.004011f, 0.012310f, -0.010121f, -0.013357f, 0.000964f, -0.003963f, 0.004217f, -0.009535f, 0.017334f, -0.000913f, -0.005876f, 0.001705f, 0.000160f, 0.009905f, -0.000623f, -0.005773f, -0.000444f, -0.003918f, -0.005405f, -0.006762f, 0.003120f, -0.012226f, 0.001193f, 0.000452f, 0.003527f, 0.008179f, 0.002623f, + 0.005822f, 0.008942f, -0.006155f, -0.001156f, 0.002020f, -0.007778f, 0.005274f, -0.002699f, 0.004496f, 0.003507f, -0.002380f, -0.001897f, 0.006616f, -0.002221f, -0.006016f, 0.000776f, -0.000631f, -0.000305f, -0.003242f, 0.004730f, -0.003702f, 0.001747f, 0.001811f, 0.002368f, -0.000950f, -0.001088f, 0.000301f, -0.001937f, 0.000733f, -0.001357f, 0.000126f, -0.000878f, -0.001806f, 0.002264f, -0.000914f, 0.000422f, -0.000315f, 0.000053f, 0.000042f, 0.000326f, -0.037450f, -0.000836f, -0.004771f, 0.025998f, 0.000348f, 0.001355f, 0.005367f, -0.003886f, 0.012983f, 0.003028f, -0.014353f, -0.007829f, -0.016800f, 0.002709f, -0.001393f, -0.005924f, -0.005029f, -0.006307f, -0.004104f, 0.020168f, -0.009623f, -0.004875f, -0.005552f, -0.015788f, -0.000901f, -0.004059f, 0.005071f, 0.007475f, -0.002764f, -0.000347f, 0.004305f, -0.005011f, -0.001540f, -0.002273f, -0.005871f, 0.005990f, 0.012332f, -0.001753f, -0.002321f, 0.009692f, -0.013394f, 0.008294f, -0.010743f, -0.021434f, -0.013665f, -0.021349f, -0.003452f, -0.012281f, -0.008320f, 0.001971f, 0.008184f, 0.004022f, 0.005783f, -0.003361f, 0.007066f, -0.009212f, + -0.002254f, 0.007401f, -0.000259f, 0.010374f, -0.004658f, 0.003028f, -0.007670f, -0.005871f, 0.005300f, -0.013138f, 0.003237f, 0.009442f, -0.012787f, 0.001075f, -0.003545f, -0.006055f, -0.008460f, -0.007654f, -0.002680f, -0.003482f, 0.001779f, 0.008826f, -0.004574f, 0.002633f, -0.007774f, -0.008288f, -0.006556f, 0.002889f, 0.004110f, 0.000957f, -0.002194f, -0.002538f, -0.003592f, 0.001697f, -0.003075f, -0.002716f, -0.001359f, -0.002533f, -0.000494f, 0.000283f, -0.004299f, -0.001125f, -0.000684f, -0.003277f, -0.000999f, -0.001555f, -0.000177f, -0.000695f, -0.005801f, 0.000533f, 0.002171f, -0.001220f, -0.002398f, -0.000381f, 0.003293f, 0.001648f, -0.001550f, 0.023815f, 0.000129f, -0.013326f, -0.012813f, -0.004407f, -0.009356f, -0.003617f, -0.007045f, 0.001802f, 0.001119f, -0.010537f, -0.006225f, -0.011570f, 0.021862f, 0.009273f, 0.001982f, -0.001255f, 0.011836f, -0.017736f, -0.000322f, -0.000385f, -0.011244f, -0.014922f, 0.013305f, 0.000266f, 0.009478f, -0.014964f, -0.006595f, -0.005213f, 0.005148f, -0.000530f, 0.006339f, -0.010316f, 0.003064f, 0.004234f, -0.011228f, -0.010736f, -0.009780f, 0.002341f, + -0.003264f, -0.002990f, 0.009374f, -0.002745f, 0.000979f, 0.000199f, -0.001932f, -0.010639f, -0.006574f, -0.001195f, -0.016103f, -0.010438f, -0.008520f, 0.004503f, 0.002993f, 0.006454f, -0.001663f, 0.002854f, -0.000261f, -0.001588f, 0.007377f, -0.005734f, 0.012910f, 0.001884f, 0.003847f, -0.001648f, -0.004381f, 0.005241f, 0.003927f, 0.010337f, -0.003193f, 0.001685f, 0.006171f, -0.003623f, 0.000028f, -0.013474f, 0.006286f, -0.010349f, 0.006511f, -0.007623f, -0.007613f, -0.014524f, -0.002961f, 0.003809f, 0.001494f, -0.002359f, 0.003296f, 0.001590f, 0.006569f, 0.001206f, -0.002146f, 0.005971f, 0.003080f, -0.005082f, 0.001156f, -0.004105f, 0.004476f, -0.001724f, 0.000655f, -0.001022f, -0.000656f, -0.003592f, -0.000266f, 0.000358f, 0.000576f, -0.002038f, 0.001613f, -0.002982f, 0.001101f, -0.000411f, -0.001704f, -0.002615f, 0.000584f, -0.001698f, 0.003800f, 0.001287f, -0.001197f, -0.001551f, -0.001741f, 0.003250f, 0.001895f, 0.003121f, 0.000143f, 0.000520f, 0.001370f, 0.028038f, 0.026535f, 0.019778f, -0.006850f, 0.007172f, 0.009947f, 0.005793f, 0.005560f, -0.010010f, -0.008762f, -0.013066f, + 0.011402f, -0.012268f, -0.001626f, -0.008957f, 0.015166f, -0.017093f, -0.012809f, -0.006445f, -0.002879f, -0.009469f, -0.014194f, 0.003887f, 0.000594f, 0.000698f, -0.017183f, -0.009513f, 0.004300f, 0.003445f, 0.004684f, -0.004746f, -0.006924f, 0.000409f, 0.004967f, 0.006418f, -0.004956f, 0.006097f, -0.009206f, -0.002531f, -0.022302f, 0.007984f, 0.002498f, -0.003945f, -0.004367f, -0.016460f, -0.007633f, 0.001921f, -0.004137f, -0.023066f, 0.012195f, 0.004968f, -0.000210f, -0.006333f, -0.005000f, -0.009843f, 0.002775f, -0.003587f, 0.006413f, -0.001589f, -0.003493f, -0.013187f, -0.002725f, -0.001458f, -0.007392f, 0.014168f, -0.010596f, 0.000040f, 0.008288f, -0.003728f, -0.011448f, -0.006473f, 0.009440f, 0.013839f, 0.006696f, -0.001232f, -0.000643f, 0.007245f, -0.015324f, 0.005986f, -0.001832f, -0.000899f, 0.000464f, 0.003086f, -0.001108f, -0.000797f, 0.000514f, -0.003122f, -0.009360f, -0.002632f, -0.003035f, 0.002608f, 0.001691f, 0.000883f, -0.003786f, -0.002027f, -0.004336f, -0.005199f, -0.001514f, -0.000366f, 0.005751f, 0.000395f, 0.000552f, 0.000568f, -0.002368f, -0.001396f, 0.002495f, -0.003338f, + -0.000769f, 0.000907f, 0.001453f, -0.003953f, -0.000236f, -0.000514f, 0.001935f, -0.002892f, -0.000936f, -0.001780f, -0.002926f, -0.005982f, -0.002960f, -0.000465f, -0.002823f, -0.000179f, -0.000003f, -0.000466f, -0.003509f, 0.034126f, 0.011482f, -0.004922f, -0.003921f, 0.012021f, -0.022968f, -0.004274f, 0.018692f, 0.009408f, -0.012946f, -0.000225f, -0.008770f, 0.003665f, 0.014382f, 0.035279f, 0.011667f, 0.027495f, -0.009676f, -0.001968f, -0.026647f, 0.009130f, -0.007749f, 0.007588f, -0.011653f, -0.000538f, 0.001160f, -0.004081f, 0.009611f, -0.004211f, 0.004604f, 0.011874f, -0.009008f, 0.005406f, 0.015083f, -0.004019f, 0.005059f, 0.000106f, 0.006073f, 0.008338f, 0.008493f, -0.045181f, 0.016570f, -0.005139f, -0.021190f, -0.003610f, 0.012956f, 0.004058f, -0.016371f, 0.008935f, 0.012915f, -0.026563f, 0.002143f, -0.007425f, 0.015688f, 0.003686f, 0.012957f, -0.003063f, -0.009336f, -0.018618f, 0.001141f, -0.011218f, 0.035338f, 0.006641f, -0.005821f, 0.011893f, 0.001469f, 0.011513f, -0.027832f, -0.003549f, 0.004272f, 0.008736f, 0.002025f, -0.012896f, -0.002077f, 0.004872f, 0.012348f, 0.010564f, + -0.008664f, 0.000352f, 0.012143f, -0.000410f, 0.005697f, -0.004124f, -0.002135f, 0.008662f, 0.000788f, -0.000543f, -0.001211f, 0.000554f, 0.004138f, -0.003907f, -0.001836f, -0.000389f, 0.003200f, 0.003281f, -0.000471f, -0.000997f, 0.008361f, -0.002554f, -0.001506f, -0.004314f, 0.000522f, 0.002413f, -0.002279f, 0.000284f, 0.002519f, 0.003566f, -0.003079f, -0.001242f, -0.005068f, 0.000500f, 0.003864f, -0.001762f, 0.000648f, 0.001954f, 0.001956f, 0.006918f, 0.000776f, 0.003455f, -0.000307f, -0.002817f, 0.004328f, 0.001218f, -0.040425f, -0.044335f, -0.015175f, -0.003448f, 0.000823f, 0.009437f, -0.018933f, 0.005991f, 0.022334f, -0.012794f, 0.011890f, 0.015475f, -0.010767f, 0.000351f, -0.005243f, 0.018925f, 0.026372f, -0.012611f, -0.014886f, 0.013284f, 0.001277f, -0.012637f, 0.005995f, 0.000237f, 0.003306f, 0.003798f, -0.006770f, -0.004904f, -0.028179f, -0.001420f, -0.008061f, -0.000618f, -0.000836f, 0.019190f, 0.005686f, -0.034358f, 0.000575f, 0.016617f, -0.018811f, 0.004987f, 0.020227f, -0.004414f, 0.007119f, 0.000447f, -0.005310f, -0.013032f, 0.026004f, 0.021924f, -0.016646f, 0.008754f, + -0.006193f, -0.000823f, 0.008091f, -0.005734f, 0.006785f, -0.010257f, -0.001178f, 0.022013f, -0.006245f, 0.004691f, 0.010373f, -0.007459f, -0.018063f, -0.000729f, 0.006197f, 0.003254f, -0.008683f, 0.001193f, 0.004864f, 0.007861f, 0.016062f, 0.009991f, 0.017675f, 0.009393f, 0.003412f, 0.008272f, -0.002907f, 0.015996f, -0.000527f, -0.012549f, -0.016969f, 0.002135f, 0.005503f, -0.002918f, 0.012679f, -0.006504f, -0.006856f, 0.005094f, -0.001605f, 0.001410f, 0.000638f, -0.007792f, -0.001103f, -0.004675f, 0.005760f, 0.002639f, 0.004630f, 0.009104f, 0.001121f, -0.003153f, -0.013140f, -0.000959f, 0.003039f, -0.003303f, -0.001366f, 0.001377f, -0.002934f, 0.002857f, 0.002908f, 0.000426f, -0.003107f, -0.002153f, 0.006416f, -0.000855f, 0.003006f, 0.001651f, 0.002068f, -0.004552f, -0.004895f, -0.002825f, 0.001107f, 0.002270f, 0.003834f, 0.002912f, 0.001869f, 0.001853f, 0.004821f, -0.001207f, -0.043529f, 0.048609f, -0.002797f, 0.031285f, 0.002409f, -0.018108f, -0.005410f, -0.010473f, -0.012706f, -0.001624f, 0.000894f, 0.022645f, -0.003552f, 0.015574f, -0.015602f, -0.000782f, 0.003888f, 0.003634f, + 0.001811f, 0.019696f, 0.019626f, 0.007218f, 0.003162f, -0.002414f, -0.003773f, -0.001060f, -0.003216f, -0.032659f, -0.011107f, 0.015154f, 0.009798f, -0.003573f, 0.001722f, -0.015412f, 0.007903f, -0.018915f, 0.004221f, 0.030265f, 0.003350f, 0.006639f, -0.025030f, 0.013495f, 0.011769f, 0.003315f, -0.016766f, -0.007273f, -0.007774f, 0.001478f, -0.015040f, 0.015553f, 0.018960f, 0.011500f, -0.001586f, 0.028401f, 0.010123f, 0.041521f, 0.016278f, -0.010959f, 0.034597f, 0.000899f, -0.012481f, 0.025099f, -0.003965f, 0.008373f, 0.015848f, -0.011234f, -0.009620f, 0.023235f, 0.024946f, 0.014808f, -0.020033f, 0.007794f, -0.000080f, -0.009165f, -0.016431f, 0.012426f, 0.022096f, 0.013433f, 0.032031f, 0.004556f, -0.006912f, -0.006953f, -0.019543f, -0.007293f, 0.012312f, 0.002072f, -0.003476f, 0.000959f, -0.012142f, -0.008410f, 0.001849f, 0.003333f, -0.000281f, 0.013398f, 0.010565f, 0.004831f, 0.000557f, 0.004073f, 0.006394f, 0.003439f, -0.005983f, -0.002258f, 0.001932f, -0.001182f, -0.001967f, 0.005790f, 0.000639f, -0.001332f, 0.004611f, 0.001950f, 0.001572f, 0.002005f, -0.003902f, 0.001285f, + 0.011694f, -0.004972f, 0.007424f, 0.003667f, 0.000446f, -0.004922f, -0.005638f, -0.002671f, 0.010692f, -0.023405f, 0.031075f, -0.009002f, -0.020459f, 0.006824f, 0.013496f, -0.013573f, -0.006905f, -0.028646f, 0.011959f, -0.010509f, -0.003492f, -0.026257f, -0.011577f, -0.008910f, -0.004532f, -0.011841f, 0.006150f, -0.005315f, -0.006512f, 0.006174f, 0.008626f, 0.015287f, 0.014932f, -0.006479f, -0.005466f, -0.021151f, 0.008285f, 0.000410f, 0.013871f, 0.003829f, 0.003676f, -0.004789f, 0.005516f, -0.013217f, -0.011260f, 0.006231f, 0.003112f, 0.006326f, -0.025867f, 0.008646f, 0.016814f, -0.000047f, -0.022795f, -0.023721f, -0.018565f, -0.054710f, 0.007662f, -0.006292f, 0.026409f, -0.012950f, 0.021925f, 0.007079f, 0.001417f, 0.028389f, 0.004237f, -0.003257f, 0.020302f, 0.007571f, -0.027897f, -0.013798f, 0.003229f, -0.008843f, -0.015880f, -0.009572f, 0.035747f, 0.016519f, -0.016975f, -0.002018f, -0.009581f, -0.004601f, 0.005135f, 0.025353f, 0.000354f, -0.006759f, 0.033386f, -0.011964f, -0.030537f, -0.028990f, -0.034546f, -0.006074f, 0.002523f, -0.000856f, -0.006172f, -0.004167f, -0.014839f, -0.002847f, + 0.004194f, -0.004518f, -0.004475f, 0.002960f, 0.002701f, -0.021598f, -0.009020f, -0.016901f, 0.000691f, -0.005688f, -0.005612f, -0.009018f, -0.002960f, 0.002489f, 0.013030f, 0.000200f, 0.016007f, 0.008001f, 0.011725f, 0.001324f, 0.005460f, -0.005462f, 0.010681f, 0.000002f, -0.007887f, -0.011531f, 0.006570f, 0.001131f, 0.003587f, -0.002963f, 0.002014f, -0.003583f, 0.003624f, -0.001243f, 0.004318f, -0.000857f, -0.002005f, 0.002929f, -0.000712f, 0.013652f, -0.022416f, -0.005579f, -0.005956f, -0.002873f, -0.001495f, 0.059818f, 0.009850f, 0.021919f, -0.010533f, 0.019154f, 0.038561f, -0.032915f, 0.050075f, 0.029730f, -0.013318f, 0.000532f, 0.003092f, -0.017898f, -0.030106f, 0.002163f, -0.017433f, -0.026825f, -0.012010f, 0.002483f, 0.000096f, -0.003215f, -0.012049f, -0.001929f, -0.011731f, -0.000723f, -0.013572f, -0.000895f, 0.009378f, -0.021050f, 0.011665f, 0.017916f, -0.013823f, -0.012783f, 0.009236f, 0.007055f, -0.001167f, 0.053753f, 0.004774f, 0.035871f, -0.025668f, -0.002380f, -0.031132f, -0.022767f, 0.005551f, -0.022833f, -0.031474f, -0.020892f, -0.023897f, -0.005099f, -0.006338f, -0.026456f, + -0.028850f, 0.037821f, 0.005954f, 0.002499f, -0.005074f, 0.019658f, 0.010875f, 0.023687f, -0.002303f, 0.022399f, -0.012416f, 0.005211f, -0.041622f, 0.034171f, 0.016487f, 0.002815f, -0.022846f, -0.001582f, 0.010362f, 0.002314f, 0.004012f, 0.016960f, 0.023481f, -0.018016f, -0.023323f, -0.015220f, -0.003626f, -0.000235f, 0.002584f, -0.013563f, 0.001594f, 0.004089f, 0.009692f, 0.012723f, -0.001561f, -0.007601f, 0.013120f, 0.006632f, -0.009745f, -0.000505f, 0.004757f, -0.005671f, -0.010301f, 0.002038f, -0.003477f, -0.003228f, -0.000289f, -0.004352f, 0.012029f, -0.012483f, 0.006993f, -0.000179f, 0.013304f, -0.013682f, -0.003338f, 0.002519f, -0.003491f, -0.005093f, -0.002201f, -0.010799f, -0.012056f, -0.002090f, 0.001298f, 0.003767f, 0.004416f, -0.008001f, 0.008351f, 0.006496f, -0.004911f, 0.007644f, -0.001427f, 0.004484f, 0.000405f, 0.004445f, -0.003317f, 0.029033f, -0.011950f, -0.009756f, 0.032421f, -0.027421f, -0.020928f, -0.005183f, -0.016663f, -0.002723f, -0.032640f, 0.007231f, -0.020127f, 0.015314f, 0.002093f, 0.005173f, 0.018538f, 0.005277f, 0.013060f, 0.017977f, 0.017057f, 0.014076f, + 0.023932f, 0.002774f, 0.016241f, 0.014555f, -0.017609f, 0.030245f, 0.007342f, 0.013938f, -0.016448f, 0.023584f, 0.010578f, 0.016536f, 0.004119f, 0.005845f, -0.003163f, -0.021914f, 0.005462f, 0.012257f, 0.014458f, 0.015810f, 0.003322f, -0.026634f, -0.016886f, 0.019006f, 0.010288f, 0.004254f, -0.010193f, 0.013127f, -0.009757f, -0.026698f, 0.038956f, 0.023762f, 0.017331f, -0.015128f, -0.007510f, -0.019915f, -0.061877f, -0.001966f, -0.008739f, 0.007878f, -0.014546f, -0.015605f, -0.027358f, 0.004719f, 0.008613f, 0.034469f, -0.027387f, 0.010959f, 0.000381f, 0.015817f, -0.024132f, -0.029559f, -0.018075f, 0.018937f, 0.005677f, 0.005859f, 0.009987f, -0.008182f, 0.003243f, 0.022215f, 0.007806f, 0.011205f, 0.014108f, -0.005782f, -0.005321f, -0.009446f, 0.000096f, 0.009658f, 0.011947f, 0.000361f, 0.004872f, 0.002348f, 0.001822f, 0.009071f, -0.005807f, -0.004960f, -0.008136f, -0.004585f, -0.008417f, -0.000347f, -0.012713f, -0.005162f, -0.013434f, -0.000835f, -0.008143f, -0.002388f, -0.001977f, -0.004699f, 0.003674f, -0.003415f, -0.017222f, -0.002650f, 0.006683f, 0.007371f, 0.013915f, -0.002200f, + -0.008518f, 0.003891f, -0.003458f, -0.012537f, 0.011301f, 0.009588f, 0.009153f, 0.021635f, 0.014078f, -0.001315f, -0.049731f, 0.028834f, 0.030676f, -0.014994f, 0.026185f, 0.009125f, -0.041913f, -0.007261f, 0.055490f, -0.007689f, -0.036616f, -0.005569f, -0.003357f, -0.031786f, 0.022566f, 0.004838f, -0.015940f, 0.024315f, 0.016194f, 0.057236f, 0.033621f, 0.001082f, 0.004386f, 0.054013f, -0.013613f, 0.013821f, -0.021794f, -0.031439f, -0.009243f, -0.021291f, 0.005037f, -0.001362f, 0.011043f, -0.001434f, -0.003664f, -0.008891f, 0.042617f, 0.002273f, -0.033229f, -0.026303f, -0.005840f, -0.006657f, -0.000994f, 0.014076f, 0.038916f, 0.024973f, 0.008383f, -0.023264f, 0.030318f, 0.055272f, -0.011437f, 0.025239f, 0.023600f, 0.066559f, 0.012820f, 0.012893f, 0.020263f, 0.028518f, 0.015881f, -0.022509f, -0.021681f, 0.015522f, -0.040451f, -0.024226f, -0.028930f, 0.027904f, 0.024393f, 0.017170f, -0.006395f, 0.020649f, 0.042771f, -0.023995f, 0.034114f, 0.034039f, -0.004325f, 0.033469f, -0.030978f, -0.013478f, -0.010663f, 0.069813f, -0.033717f, 0.034470f, 0.021591f, 0.012897f, 0.009940f, -0.030452f, + -0.002821f, -0.023874f, 0.026210f, 0.025016f, -0.000160f, 0.002164f, -0.012187f, 0.018800f, -0.006994f, 0.002201f, 0.007190f, 0.007928f, 0.000181f, 0.011628f, -0.007529f, -0.003801f, -0.002856f, -0.007348f, 0.003750f, 0.007185f, -0.005497f, 0.003505f, 0.008236f, 0.014502f, 0.002406f, -0.012579f, 0.005750f, -0.013663f, 0.002766f, 0.013128f, 0.008526f, 0.013869f, -0.002084f, 0.022105f, -0.008339f, 0.016442f, -0.003950f, -0.004735f, -0.002605f, 0.001360f, 0.017716f, -0.012235f, 0.008632f, 0.000100f, 0.008742f, -0.009861f, 0.002963f, 0.004699f, -0.004486f, 0.023458f, 0.011095f, 0.038143f, 0.067992f, 0.007346f, -0.006982f, 0.007253f, -0.003596f, -0.011124f, 0.002073f, 0.007164f, -0.016537f, -0.022036f, 0.007559f, -0.011404f, -0.006209f, 0.017393f, -0.000806f, 0.034094f, -0.017838f, 0.033431f, 0.016439f, 0.003380f, -0.019297f, 0.006402f, 0.033312f, 0.009740f, -0.016834f, 0.006692f, -0.003960f, 0.001065f, 0.019592f, -0.026927f, -0.014254f, 0.030338f, 0.000702f, -0.007317f, 0.026284f, -0.001145f, 0.009341f, 0.006118f, -0.025037f, -0.045587f, -0.009627f, 0.016041f, 0.029385f, 0.006517f, + -0.022441f, 0.029467f, -0.009532f, 0.059595f, -0.030017f, 0.040170f, -0.023294f, 0.014509f, 0.034349f, -0.050448f, -0.052295f, -0.000135f, -0.014756f, 0.013758f, 0.016762f, 0.002643f, -0.007644f, -0.030732f, 0.020946f, -0.004235f, 0.037236f, 0.017063f, 0.034676f, 0.009715f, 0.020207f, -0.008167f, 0.026634f, 0.009887f, -0.015849f, 0.003527f, -0.000406f, -0.076285f, -0.002223f, 0.013788f, 0.018571f, 0.032709f, 0.027504f, -0.008626f, 0.002344f, -0.005359f, 0.005167f, 0.000318f, -0.008491f, -0.019961f, 0.008844f, -0.011498f, 0.026580f, 0.003489f, 0.005199f, 0.013416f, 0.007740f, -0.007982f, 0.007676f, 0.019633f, 0.016887f, -0.005357f, -0.003052f, 0.003163f, -0.004078f, -0.002374f, -0.012006f, -0.001759f, -0.025161f, -0.003077f, 0.008633f, -0.020561f, 0.014565f, -0.015405f, -0.012862f, 0.004216f, -0.013083f, 0.013775f, 0.005164f, -0.004540f, 0.008685f, -0.000530f, -0.001448f, 0.006065f, 0.018470f, -0.012351f, 0.002867f, 0.003275f, 0.044315f, 0.057326f, -0.012553f, -0.002247f, 0.020195f, 0.075846f, 0.002087f, -0.044904f, -0.018000f, 0.009106f, 0.008589f, -0.014210f, 0.014459f, -0.010267f, + 0.023464f, -0.038079f, 0.001951f, 0.023695f, -0.015945f, -0.017183f, 0.003257f, -0.037634f, -0.011650f, -0.012264f, -0.059959f, -0.050587f, -0.029372f, 0.022074f, 0.025919f, -0.004559f, -0.042694f, 0.004799f, 0.001446f, -0.001506f, 0.008474f, -0.021401f, 0.051105f, -0.014604f, 0.006445f, 0.056707f, -0.049710f, 0.023941f, 0.008316f, -0.017305f, 0.020542f, -0.013402f, -0.040326f, 0.000846f, 0.034735f, -0.015567f, -0.025368f, 0.014516f, 0.004610f, 0.033212f, 0.000167f, -0.051156f, 0.004011f, -0.030237f, 0.050329f, -0.018273f, 0.007536f, 0.012413f, 0.005957f, -0.007224f, -0.032820f, 0.013685f, 0.034241f, 0.009993f, 0.035330f, -0.051863f, -0.028655f, -0.008531f, -0.000561f, 0.005607f, -0.040136f, 0.035876f, -0.005026f, -0.038143f, -0.012832f, 0.024161f, 0.022361f, -0.021112f, -0.029453f, 0.029012f, -0.023468f, -0.014612f, -0.000644f, -0.003563f, -0.003298f, -0.001864f, -0.008648f, -0.001588f, 0.014443f, -0.003270f, 0.013264f, -0.015281f, 0.010519f, 0.014003f, -0.003856f, 0.007585f, 0.002172f, -0.002782f, 0.000083f, 0.001953f, 0.024800f, 0.001366f, -0.004862f, 0.002191f, 0.005439f, -0.012363f, + 0.004365f, -0.015826f, -0.001356f, 0.018482f, -0.006697f, -0.014401f, -0.005443f, 0.008342f, 0.000192f, 0.000704f, 0.010784f, 0.000969f, -0.014593f, -0.007441f, 0.026370f, 0.019426f, -0.006442f, -0.001018f, -0.039321f, 0.057894f, 0.001686f, -0.099059f, 0.039732f, -0.013584f, 0.007759f, 0.010149f, 0.013341f, 0.024364f, 0.008904f, -0.017904f, -0.004299f, 0.024536f, 0.016599f, -0.019639f, -0.001019f, -0.015574f, -0.008061f, -0.048636f, -0.006178f, 0.023465f, 0.029126f, 0.006578f, -0.011514f, 0.032266f, -0.033166f, 0.036760f, -0.021126f, -0.011846f, 0.004408f, -0.011356f, 0.009821f, -0.029255f, -0.039519f, -0.044221f, -0.014138f, 0.022959f, -0.008824f, 0.000264f, 0.026983f, 0.007526f, 0.004737f, -0.000806f, 0.000942f, -0.009282f, 0.000388f, 0.029092f, 0.017909f, 0.030699f, 0.026026f, 0.030798f, 0.020952f, -0.018246f, -0.011642f, 0.007598f, -0.001939f, -0.035302f, 0.023785f, -0.006354f, -0.033376f, 0.041961f, -0.000457f, 0.006857f, -0.001152f, -0.015204f, -0.005020f, 0.017648f, 0.025513f, 0.021257f, 0.000659f, 0.013037f, -0.042764f, -0.006030f, -0.015238f, 0.023321f, 0.008038f, -0.011875f, + -0.013605f, 0.053909f, -0.016421f, -0.018404f, -0.005840f, 0.008735f, -0.013342f, -0.035444f, -0.002013f, -0.006030f, -0.019192f, 0.033317f, 0.006772f, 0.012574f, -0.010243f, -0.001727f, 0.007724f, 0.002053f, 0.009758f, 0.010607f, -0.003488f, 0.006528f, -0.006440f, 0.007392f, 0.002753f, -0.005823f, -0.004500f, 0.005493f, 0.007604f, 0.002144f, -0.006819f, -0.005547f, -0.006141f, -0.004422f, 0.000093f, 0.003874f, -0.005581f, -0.006604f, 0.001510f, -0.000455f, -0.001281f, 0.005852f, -0.002794f, 0.009229f, 0.002681f, 0.026882f, -0.002371f, -0.003277f, -0.006021f, -0.011538f, -0.015081f, 0.134734f, -0.132627f, -0.006793f, -0.144184f, -0.022446f, -0.054935f, -0.006823f, 0.034981f, -0.018011f, -0.040040f, 0.062685f, -0.017182f, -0.011104f, 0.001896f, 0.019214f, -0.002434f, 0.052072f, 0.034388f, 0.020569f, -0.031025f, 0.001898f, -0.021229f, -0.021558f, -0.014503f, 0.000619f, -0.006781f, -0.005934f, -0.017613f, -0.004042f, 0.028670f, 0.003390f, 0.018904f, 0.018910f, -0.001741f, 0.025298f, 0.036902f, 0.001820f, -0.007814f, -0.019540f, -0.023346f, 0.009074f, 0.009922f, -0.019370f, 0.031237f, -0.041741f, + -0.042261f, 0.004454f, -0.014931f, 0.022303f, -0.039198f, 0.016452f, -0.075180f, -0.040142f, -0.060229f, -0.005400f, -0.029838f, -0.002885f, -0.018296f, -0.022749f, -0.019830f, -0.001998f, 0.004869f, -0.058840f, 0.006472f, -0.013049f, 0.006518f, 0.000058f, -0.027314f, -0.047909f, 0.032778f, -0.028915f, -0.005327f, 0.029300f, -0.003192f, -0.009468f, 0.019328f, 0.024251f, -0.005243f, 0.024157f, 0.015765f, 0.029236f, 0.016054f, 0.029588f, 0.013928f, -0.017874f, -0.005102f, -0.015771f, 0.000529f, -0.013094f, 0.002577f, 0.010589f, 0.015090f, 0.016516f, -0.007594f, 0.007566f, 0.005411f, 0.010763f, -0.002769f, -0.004387f, 0.005565f, 0.012946f, 0.001573f, 0.002860f, 0.014341f, 0.007241f, 0.014771f, -0.002324f, 0.000539f, -0.001734f, 0.007134f, 0.010141f, -0.002021f, -0.017365f, 0.009279f, -0.003055f, 0.003523f, -0.005577f, 0.002257f, -0.005065f, -0.002667f, 0.000720f, -0.014437f, 0.000055f, 0.019482f, -0.012429f, -0.013042f, 0.001516f, 0.006580f, 0.006656f, 0.002206f, -0.012858f, 0.109891f, 0.055504f, 0.027164f, -0.025818f, -0.013069f, -0.056427f, 0.013185f, 0.046370f, -0.008321f, -0.010261f, + 0.075542f, -0.012810f, -0.016057f, 0.037709f, 0.055460f, 0.010107f, 0.056548f, -0.013387f, 0.008740f, 0.033653f, 0.037896f, 0.059525f, 0.048215f, -0.001905f, -0.020694f, 0.018316f, 0.022023f, 0.020897f, 0.025786f, 0.044673f, 0.022094f, 0.056649f, -0.021215f, -0.000885f, 0.016896f, 0.015814f, 0.047956f, 0.028193f, 0.051353f, -0.036068f, -0.011056f, 0.020902f, -0.039043f, 0.032519f, 0.032878f, 0.031653f, 0.013680f, -0.039228f, -0.014107f, 0.076141f, 0.019883f, 0.051529f, 0.042676f, 0.046927f, -0.009096f, 0.062003f, 0.096544f, 0.033709f, 0.008870f, 0.068043f, 0.046974f, -0.025371f, -0.015626f, -0.032060f, -0.025765f, 0.028981f, 0.033333f, 0.003453f, -0.027479f, 0.001161f, -0.024547f, -0.000579f, -0.010805f, 0.016845f, -0.058187f, -0.006104f, 0.006183f, -0.029058f, 0.022612f, 0.004516f, -0.018021f, 0.016189f, -0.036569f, -0.023379f, -0.040555f, -0.013080f, -0.019462f, 0.014976f, 0.004685f, -0.018412f, 0.004480f, 0.027199f, 0.008034f, -0.008179f, -0.016035f, -0.024625f, -0.009588f, 0.008888f, -0.035509f, -0.016078f, -0.002937f, 0.029171f, 0.009696f, -0.011639f, 0.006064f, -0.018686f, + -0.005208f, -0.005388f, -0.015878f, -0.009758f, 0.026791f, -0.005676f, -0.001894f, -0.006037f, 0.006299f, 0.017604f, 0.012131f, 0.015146f, 0.036855f, 0.000517f, 0.029672f, 0.001851f, 0.002937f, 0.019104f, 0.015828f, -0.024080f, -0.014381f, -0.001497f, 0.005540f, 0.003016f, -0.000015f, -0.034869f, 0.016883f, -0.041980f, 0.072718f, 0.103331f, 0.060073f, -0.026910f, -0.057205f, -0.021306f, 0.051004f, -0.015521f, -0.042694f, 0.076908f, -0.053783f, 0.045782f, 0.025809f, -0.061048f, -0.025379f, -0.006746f, -0.100384f, 0.003599f, 0.011303f, -0.048697f, 0.098487f, -0.034303f, 0.091466f, -0.069070f, 0.010010f, 0.003994f, 0.066845f, 0.098286f, -0.008283f, 0.033095f, 0.046467f, -0.055009f, 0.036498f, -0.074315f, -0.020488f, 0.139922f, -0.008009f, -0.039184f, -0.007678f, -0.079024f, 0.003317f, -0.025209f, 0.087765f, 0.032917f, 0.040833f, -0.013956f, -0.023249f, -0.044227f, -0.040483f, 0.009679f, 0.005589f, -0.000290f, 0.058476f, -0.014723f, 0.011166f, -0.061212f, -0.031440f, 0.040005f, -0.090362f, -0.036174f, -0.027146f, -0.031449f, 0.084460f, 0.005593f, 0.091260f, 0.064826f, 0.029152f, 0.034412f, + -0.020360f, -0.048771f, 0.040941f, -0.066182f, -0.039974f, 0.080343f, 0.024704f, -0.049351f, -0.080275f, -0.049270f, -0.057081f, 0.045333f, -0.049245f, 0.024987f, -0.035515f, -0.003757f, -0.030469f, 0.031956f, 0.019202f, 0.002181f, -0.026390f, -0.005623f, -0.018156f, 0.004681f, -0.035932f, -0.025790f, -0.013399f, 0.007203f, 0.020402f, -0.001500f, -0.014492f, -0.021381f, -0.033332f, -0.024841f, 0.021583f, 0.028324f, -0.008917f, 0.019261f, 0.041150f, 0.018667f, -0.037677f, -0.012070f, -0.013661f, 0.023074f, -0.022859f, -0.016194f, -0.005145f, 0.007877f, -0.030117f, -0.042117f, -0.028906f, -0.010782f, 0.017243f, -0.001588f, 0.004176f, -0.006880f, 0.023511f, 0.006153f, 0.065970f, -0.108958f, 0.116300f, -0.002730f, 0.009126f, -0.037024f, 0.093948f, 0.022187f, 0.060569f, 0.022988f, -0.039394f, 0.013662f, 0.033725f, -0.057229f, 0.040338f, 0.000868f, 0.026828f, -0.076454f, -0.005789f, 0.018929f, 0.070716f, -0.029279f, -0.057992f, -0.002415f, 0.070333f, 0.037152f, -0.026611f, -0.060345f, -0.002794f, 0.050776f, 0.006818f, 0.003656f, 0.014233f, 0.036947f, 0.093163f, -0.130934f, -0.021421f, 0.012789f, + 0.073094f, 0.016442f, -0.039512f, -0.009715f, 0.027975f, 0.066839f, -0.006530f, 0.003368f, -0.125483f, 0.036514f, 0.019861f, 0.034411f, -0.090985f, 0.080780f, 0.069672f, 0.026273f, -0.041038f, -0.004070f, -0.045429f, 0.034252f, 0.059705f, 0.025085f, 0.028061f, -0.005061f, 0.045315f, -0.065582f, 0.062524f, -0.018314f, -0.021994f, 0.073362f, 0.060576f, 0.004033f, -0.022578f, -0.060069f, 0.044324f, 0.048397f, -0.128713f, -0.010083f, 0.074392f, 0.018613f, -0.000578f, -0.045979f, -0.019606f, 0.126190f, -0.009411f, -0.042975f, -0.005212f, -0.023110f, -0.027801f, 0.042055f, -0.035191f, 0.012928f, 0.019387f, 0.025716f, -0.017451f, 0.002645f, -0.017721f, -0.021450f, -0.014131f, 0.019447f, 0.019613f, -0.019626f, -0.003684f, 0.009788f, -0.015422f, 0.038265f, -0.036355f, 0.009672f, -0.006320f, -0.011741f, 0.013826f, 0.063289f, 0.004421f, 0.000245f, -0.009864f, -0.022109f, 0.000380f, 0.034515f, 0.008475f, -0.001466f, -0.006385f, -0.016056f, 0.029561f, -0.007423f, -0.001428f, -0.017052f, 0.017076f, -0.097133f, 0.047828f, 0.009436f, 0.030558f, 0.036786f, 0.053389f, 0.019115f, 0.017372f, -0.025036f, + 0.027685f, 0.005327f, 0.063323f, -0.006962f, -0.018481f, 0.049803f, 0.038347f, -0.008037f, 0.003630f, -0.020882f, 0.001016f, 0.015975f, -0.004516f, -0.012357f, 0.028619f, -0.022207f, 0.003295f, 0.038530f, -0.007866f, 0.022360f, -0.038579f, -0.007659f, 0.005619f, -0.015766f, -0.005795f, 0.004748f, 0.028301f, -0.006811f, -0.046183f, 0.002112f, 0.093410f, 0.019547f, -0.049910f, 0.015335f, -0.050885f, -0.034893f, -0.026024f, -0.006921f, 0.059841f, -0.006172f, -0.046731f, 0.096208f, -0.103242f, 0.017902f, 0.106528f, 0.011487f, 0.075072f, -0.056639f, -0.105607f, 0.034561f, 0.004253f, 0.084922f, 0.005106f, -0.047440f, 0.039940f, -0.010406f, -0.008144f, -0.020013f, -0.002721f, -0.029414f, 0.015516f, 0.004422f, 0.023322f, -0.035979f, -0.030488f, -0.012117f, 0.038259f, 0.048563f, -0.015376f, 0.025992f, -0.003135f, 0.040704f, 0.029359f, -0.050519f, 0.041369f, -0.010101f, 0.006802f, -0.008296f, -0.014996f, 0.000159f, 0.000576f, 0.005846f, -0.003067f, 0.004618f, 0.004473f, 0.003236f, 0.006674f, -0.016408f, 0.001703f, 0.009701f, -0.013159f, -0.001458f, 0.009805f, -0.008608f, 0.012601f, 0.013316f, + -0.018261f, 0.023462f, 0.010298f, 0.024290f, -0.004415f, 0.011459f, 0.020189f, -0.036099f, 0.000482f, 0.011529f, 0.022224f, -0.012673f, -0.008723f, -0.012177f, -0.008106f, 0.041269f, -0.018879f, -0.198359f, -0.454772f, -0.180704f, -0.274016f, -0.400895f, 0.214368f, 0.058701f, 0.123047f, 0.569092f, 0.438548f, 0.255471f, 0.468413f, 0.349251f, 0.059117f, 0.114926f, 0.095592f, -0.223102f, -0.190921f, -0.093996f, -0.340683f, -0.325938f, -0.125180f, -0.167869f, -0.236532f, -0.099438f, -0.085379f, -0.240899f, -0.201022f, -0.017480f, -0.114784f, -0.195488f, -0.067485f, 0.061235f, -0.142002f, 0.041720f, 0.209827f, -0.016887f, -0.030767f, 0.284940f, 0.227650f, -0.010851f, 0.333327f, 0.386059f, 0.156566f, 0.362661f, 0.509533f, 0.303460f, 0.263835f, 0.611272f, 0.488006f, 0.366429f, 0.434915f, 0.576649f, 0.205973f, 0.081037f, 0.241295f, -0.191609f, -0.547770f, -0.397631f, -0.605760f, -0.981053f, -0.878396f, -0.932653f, -1.084023f, -1.105269f, -0.952714f, -0.830145f, -0.832054f, -0.585572f, -0.259411f, -0.176328f, -0.027012f, 0.282722f, 0.520917f, 0.525341f, 0.652962f, 0.939038f, 0.821290f, 0.750167f, + 1.037605f, 0.824013f, 0.465926f, 0.679515f, 0.476158f, 0.184016f, 0.167075f, 0.218857f, 0.022319f, -0.070385f, 0.042369f, 0.005284f, -0.154425f, -0.083130f, 0.013425f, -0.123736f, -0.227691f, -0.110192f, -0.156293f, -0.332232f, -0.209062f, -0.081682f, -0.247810f, -0.167429f, 0.033145f, -0.079676f, -0.115821f, 0.055716f, -0.068579f, -0.273779f, -0.209171f, -0.335830f, -0.566164f, -0.534045f, -0.511285f, -0.532028f, -0.466800f, -0.314614f, -0.245065f, -0.148489f, -0.028618f, 0.123723f, 0.221301f, 0.338515f, 0.428406f, 0.531015f, 0.553684f, 0.586103f, 0.654309f, 0.619517f, 0.569224f, 0.537309f, 0.356927f, 0.124772f, 0.012386f, -0.054136f, -0.151744f, -0.180295f, -0.156015f, -0.177570f, -0.197831f, -0.175482f, -0.175621f, -0.173389f, -0.144685f, -0.142426f, -0.147556f, -0.143501f, -0.123306f, -0.102567f, -0.084419f, -0.053044f, -0.024985f, 0.005979f, 0.018668f, 0.024489f, 0.017908f, 0.010913f, 0.007588f} + }, + { + {-0.015949f, 0.009434f, -0.012132f, 0.001472f, -0.005142f, -0.001607f, 0.004718f, -0.007524f, -0.013668f, -0.003497f, 0.001154f, -0.007839f, -0.004520f, 0.006625f, -0.003935f, 0.003063f, -0.017114f, -0.001474f, 0.011575f, 0.006162f, -0.019147f, -0.006600f, -0.005025f, -0.005093f, 0.006464f, -0.002801f, -0.009974f, -0.006273f, -0.007131f, -0.007266f, 0.012614f, 0.003936f, 0.008124f, -0.005275f, 0.010672f, 0.009692f, 0.006913f, -0.003850f, -0.009059f, -0.007126f, 0.000752f, 0.001797f, 0.014519f, 0.005138f, 0.002763f, -0.006850f, 0.001578f, 0.000617f, 0.001661f, 0.005744f, 0.003409f, -0.009870f, -0.008382f, -0.004343f, 0.005307f, 0.001225f, -0.001857f, -0.010551f, -0.003221f, 0.004123f, 0.004775f, -0.004265f, -0.001607f, 0.000223f, 0.005057f, -0.001103f, -0.005576f, -0.000007f, 0.000807f, -0.007205f, 0.015314f, 0.000949f, -0.010387f, -0.000031f, -0.001597f, 0.009814f, 0.000795f, 0.006636f, 0.009191f, 0.003427f, -0.000621f, 0.000425f, -0.003330f, -0.002196f, -0.002211f, 0.005814f, -0.001873f, -0.000778f, -0.002625f, 0.001989f, 0.000715f, -0.001158f, -0.000229f, -0.001552f, 0.000319f, -0.000251f, + 0.001198f, 0.001157f, 0.001965f, -0.010515f, -0.009515f, 0.010805f, 0.009911f, -0.008004f, 0.005971f, 0.000605f, 0.003082f, -0.026302f, 0.010185f, -0.003903f, -0.017957f, -0.023420f, 0.000642f, 0.016947f, 0.001035f, 0.010991f, 0.000422f, -0.021180f, -0.007300f, 0.002452f, 0.007425f, -0.003722f, -0.001799f, -0.008911f, 0.001197f, -0.001610f, 0.014991f, 0.007623f, 0.003198f, 0.002699f, 0.004085f, 0.005212f, 0.013670f, 0.008288f, -0.012047f, -0.001011f, 0.002821f, 0.002933f, -0.014332f, 0.004682f, -0.004251f, -0.009061f, -0.002553f, -0.000369f, 0.009831f, 0.002539f, -0.005470f, 0.009957f, 0.015510f, -0.003267f, -0.005863f, 0.003764f, -0.001095f, 0.008490f, 0.008652f, 0.006781f, -0.010346f, -0.007868f, 0.007445f, -0.003118f, -0.002588f, -0.007927f, 0.000874f, -0.011782f, 0.007042f, 0.006354f, 0.008331f, 0.002160f, 0.009680f, -0.010439f, -0.006559f, 0.013604f, 0.000723f, 0.005060f, 0.016049f, 0.006223f, 0.001590f, -0.006433f, 0.009419f, 0.001158f, -0.004761f, 0.002718f, -0.011328f, 0.000352f, -0.001184f, 0.001720f, 0.003055f, -0.001263f, -0.005042f, -0.002738f, -0.000813f, 0.002504f, + 0.002325f, 0.000816f, -0.001387f, 0.001419f, 0.003211f, 0.000601f, -0.001051f, 0.013413f, 0.001209f, 0.005208f, -0.011247f, -0.009550f, 0.005507f, -0.002631f, -0.004097f, -0.005213f, -0.004872f, 0.004091f, -0.013017f, -0.007455f, -0.016081f, -0.019329f, -0.003555f, 0.016131f, 0.010414f, -0.006484f, -0.001786f, -0.002216f, -0.003723f, -0.013916f, 0.010068f, -0.003477f, -0.003553f, 0.000903f, 0.006591f, -0.003119f, 0.000611f, -0.000461f, 0.009533f, -0.008765f, 0.009563f, 0.005225f, 0.011460f, -0.003879f, 0.008873f, 0.003951f, -0.005440f, 0.007992f, -0.005378f, 0.004609f, 0.008504f, -0.006376f, 0.008930f, -0.005296f, -0.004259f, -0.001327f, -0.002603f, 0.004499f, -0.002562f, -0.006751f, 0.002752f, -0.005859f, 0.001320f, 0.000816f, 0.000947f, 0.013436f, 0.002639f, -0.003070f, 0.000107f, -0.005488f, -0.007647f, 0.003983f, -0.001818f, 0.012825f, 0.013096f, 0.005312f, -0.003595f, -0.002004f, -0.000061f, -0.005137f, -0.005925f, 0.006602f, 0.010387f, 0.000345f, -0.001094f, 0.006380f, 0.006904f, -0.000887f, 0.002461f, 0.002217f, -0.004961f, 0.004747f, -0.000873f, 0.006808f, -0.003338f, -0.001294f, + -0.000223f, -0.002824f, -0.000275f, 0.004960f, -0.001050f, 0.001505f, 0.001487f, -0.003499f, 0.001133f, -0.000640f, -0.000671f, 0.001417f, 0.001333f, -0.002241f, 0.002592f, -0.000866f, -0.001062f, 0.000186f, -0.000251f, -0.000423f, -0.002007f, -0.001520f, 0.025522f, -0.010833f, 0.010449f, -0.013048f, -0.010979f, 0.000029f, -0.003066f, -0.002795f, 0.003535f, -0.005502f, 0.011022f, 0.010756f, 0.009209f, -0.002794f, -0.001231f, -0.004832f, -0.011818f, 0.001822f, -0.007111f, -0.001330f, 0.001266f, -0.003968f, 0.006691f, 0.002523f, -0.000834f, -0.019481f, -0.008153f, -0.012284f, 0.000432f, -0.008042f, -0.012366f, -0.005423f, -0.006846f, -0.007557f, 0.012253f, -0.009828f, 0.008628f, 0.000738f, -0.003514f, 0.004837f, 0.004137f, -0.008810f, -0.002440f, 0.000171f, 0.009455f, -0.000913f, -0.012998f, -0.016462f, -0.017157f, 0.004448f, -0.006287f, 0.000369f, -0.001388f, 0.002471f, 0.005758f, 0.009514f, -0.006608f, -0.003488f, 0.003103f, 0.003270f, 0.001188f, 0.011936f, -0.006711f, 0.007381f, -0.013747f, 0.026880f, 0.003273f, -0.002862f, 0.005194f, 0.002574f, 0.005108f, -0.007471f, -0.001349f, 0.002044f, + -0.000861f, -0.001605f, -0.013597f, -0.004505f, -0.009251f, -0.002738f, -0.001111f, -0.006640f, -0.006530f, 0.004838f, 0.005609f, 0.001730f, 0.001078f, -0.000608f, 0.004735f, 0.002815f, 0.005441f, -0.002724f, 0.000453f, 0.000187f, 0.004998f, -0.001998f, -0.000325f, -0.000286f, 0.000532f, -0.003957f, 0.000951f, -0.002856f, 0.001425f, 0.002034f, -0.000981f, -0.003323f, 0.000642f, 0.001062f, -0.001061f, -0.001122f, -0.003629f, 0.000985f, -0.000447f, -0.001803f, 0.002250f, 0.002655f, -0.000358f, -0.012410f, 0.001904f, 0.002405f, 0.000917f, -0.001887f, -0.007394f, 0.004539f, 0.003651f, -0.011202f, 0.013347f, -0.016448f, 0.020487f, -0.001915f, 0.006896f, 0.003094f, -0.000329f, -0.002112f, 0.004285f, 0.019204f, 0.021534f, -0.004027f, 0.003949f, -0.002502f, -0.002957f, 0.002925f, 0.004641f, 0.014788f, -0.001778f, 0.004538f, -0.007353f, 0.008145f, 0.001879f, 0.011677f, 0.005706f, 0.010943f, -0.015568f, 0.006687f, 0.005799f, -0.004846f, -0.000071f, 0.011874f, 0.000144f, 0.001008f, 0.003681f, 0.007258f, -0.002340f, -0.000935f, 0.022838f, 0.010909f, 0.002110f, 0.002157f, -0.004659f, 0.010414f, + -0.013649f, -0.020054f, -0.024287f, -0.001414f, 0.012914f, -0.000308f, 0.006486f, 0.017420f, 0.006945f, -0.002983f, -0.006003f, 0.009328f, -0.001701f, 0.022375f, 0.010111f, 0.003392f, 0.003209f, -0.012079f, 0.002679f, 0.009271f, -0.004584f, -0.013611f, 0.002499f, 0.005014f, -0.000504f, -0.004672f, -0.001655f, 0.002417f, -0.004358f, 0.002663f, 0.002629f, 0.002414f, -0.000793f, 0.002773f, -0.004276f, -0.003982f, -0.001250f, -0.002496f, 0.001488f, -0.003997f, 0.002452f, 0.004096f, 0.002724f, 0.003111f, 0.003117f, 0.001043f, 0.002031f, -0.005544f, -0.004668f, -0.001685f, -0.002409f, -0.002854f, -0.000524f, 0.001976f, 0.001130f, -0.000114f, 0.003614f, 0.002004f, -0.000186f, 0.004541f, 0.002850f, -0.029679f, 0.003213f, -0.002216f, 0.020408f, -0.015226f, 0.008974f, -0.031427f, 0.012413f, -0.002938f, -0.016002f, -0.017584f, -0.012291f, 0.009425f, 0.007371f, 0.023909f, 0.003203f, 0.007986f, 0.022890f, -0.003939f, -0.016593f, 0.002531f, -0.012776f, 0.003168f, 0.018673f, 0.003501f, -0.005186f, -0.002183f, -0.003526f, 0.005516f, 0.007259f, -0.001499f, 0.004867f, 0.009639f, -0.005950f, 0.003078f, + -0.011224f, -0.000837f, -0.014057f, -0.002175f, 0.001971f, -0.006651f, 0.010455f, 0.007144f, 0.008918f, 0.017717f, 0.001181f, 0.021434f, 0.016434f, 0.007958f, -0.011076f, 0.024575f, 0.010614f, 0.004346f, 0.021561f, -0.002325f, 0.000536f, 0.001825f, 0.007193f, -0.004453f, -0.006226f, -0.014706f, -0.014206f, -0.011608f, 0.000186f, -0.009154f, 0.018929f, -0.011348f, 0.007866f, 0.011807f, -0.006555f, 0.000630f, -0.005348f, -0.003141f, -0.018477f, -0.021200f, 0.009770f, -0.003680f, -0.007054f, -0.006275f, 0.001882f, 0.002500f, 0.001505f, 0.004171f, -0.007344f, 0.017369f, 0.001296f, 0.005233f, -0.003483f, 0.000977f, 0.005245f, -0.008450f, 0.002932f, 0.000334f, 0.003007f, 0.003941f, 0.000061f, 0.003079f, 0.006015f, 0.000018f, 0.001797f, 0.004275f, 0.004804f, 0.006143f, -0.000167f, 0.001054f, -0.003050f, -0.000875f, 0.000411f, -0.001468f, -0.004349f, 0.000315f, -0.001181f, -0.001925f, 0.000592f, 0.024925f, 0.001005f, 0.000358f, -0.002243f, -0.004804f, 0.004525f, 0.001090f, -0.012632f, -0.016205f, -0.021981f, -0.011493f, -0.023001f, -0.014607f, -0.007798f, -0.017009f, -0.010734f, -0.007410f, + -0.008812f, -0.023013f, 0.015879f, 0.009963f, 0.000643f, 0.008389f, 0.003888f, -0.006358f, 0.028696f, 0.001807f, -0.009838f, -0.005152f, -0.019354f, -0.008307f, 0.021386f, 0.001079f, -0.017835f, -0.017848f, 0.002669f, -0.018067f, 0.005865f, 0.006388f, -0.014042f, 0.000596f, 0.004472f, 0.001038f, 0.021055f, 0.006323f, -0.009519f, 0.002156f, -0.011425f, 0.010631f, 0.001576f, 0.004727f, -0.025599f, 0.017736f, -0.008751f, 0.007410f, 0.000666f, 0.003467f, 0.004287f, 0.000695f, -0.007402f, -0.000558f, -0.009949f, 0.000054f, -0.020161f, -0.000079f, -0.021754f, 0.028814f, -0.004817f, 0.018344f, -0.013387f, -0.006265f, -0.002812f, -0.013864f, -0.007679f, 0.011277f, -0.000321f, -0.000398f, 0.008418f, 0.010842f, 0.001817f, 0.017684f, 0.015366f, 0.021262f, 0.011393f, 0.004545f, 0.002679f, 0.009673f, 0.005238f, 0.003242f, 0.004013f, 0.002219f, 0.004826f, -0.001298f, 0.007826f, 0.001388f, -0.000399f, -0.001587f, 0.006121f, 0.002490f, 0.004387f, 0.002191f, -0.002727f, 0.002099f, 0.002482f, 0.002038f, -0.004557f, 0.008937f, 0.004902f, -0.000818f, -0.006682f, -0.000698f, -0.000911f, -0.004836f, + 0.001892f, 0.000934f, 0.005176f, -0.004114f, -0.009263f, -0.012770f, -0.000066f, 0.009373f, -0.024514f, -0.000020f, -0.010604f, -0.008491f, 0.017338f, -0.028273f, -0.026708f, 0.006947f, 0.035583f, 0.000902f, 0.003373f, 0.002727f, -0.005437f, 0.019481f, 0.018914f, 0.010923f, 0.005357f, -0.005143f, -0.028946f, 0.017141f, 0.000134f, -0.023192f, -0.007492f, 0.005365f, -0.001184f, 0.000183f, 0.002357f, -0.005594f, -0.022839f, -0.001298f, 0.000921f, -0.004185f, -0.009550f, 0.006837f, 0.019786f, -0.025556f, 0.015879f, -0.009590f, -0.004824f, 0.001504f, 0.012597f, 0.041491f, -0.026856f, -0.006780f, 0.002621f, -0.002677f, -0.004927f, 0.001356f, -0.010305f, 0.003565f, -0.009308f, 0.028519f, 0.009799f, 0.005329f, 0.007860f, -0.006049f, -0.001662f, 0.015087f, -0.002389f, 0.006547f, -0.012574f, 0.021888f, 0.000959f, -0.015527f, 0.030624f, -0.019543f, 0.014092f, 0.004000f, 0.006943f, 0.022262f, -0.008897f, 0.009467f, -0.001100f, 0.000023f, 0.002671f, -0.001514f, -0.015056f, -0.007990f, -0.000983f, -0.006671f, -0.002376f, -0.003646f, -0.009242f, -0.009452f, -0.007097f, 0.004372f, -0.008095f, 0.004632f, + -0.002175f, -0.000354f, -0.007105f, -0.004873f, -0.005246f, 0.004145f, -0.009804f, 0.000959f, 0.000932f, 0.005919f, 0.009283f, -0.003671f, -0.001785f, -0.008396f, -0.007166f, 0.000476f, -0.006306f, 0.001745f, -0.001182f, -0.005594f, 0.000089f, -0.001714f, 0.002517f, 0.003322f, -0.002352f, 0.030376f, 0.002390f, 0.007934f, 0.009024f, -0.005063f, -0.017460f, -0.013685f, 0.002117f, 0.030388f, 0.017232f, 0.003759f, -0.027141f, 0.003936f, -0.014920f, 0.000112f, 0.030401f, 0.029245f, 0.014778f, 0.019776f, -0.017805f, -0.036884f, -0.019310f, -0.026576f, 0.014766f, -0.000239f, -0.004481f, -0.000076f, -0.020116f, -0.005951f, 0.006242f, -0.003756f, -0.007635f, -0.007414f, 0.021544f, -0.001364f, 0.005872f, -0.006091f, 0.014129f, 0.003022f, -0.008132f, -0.017092f, -0.013140f, 0.039005f, -0.001666f, -0.008781f, 0.012464f, -0.022238f, 0.006996f, -0.012713f, -0.038902f, -0.008696f, -0.005052f, 0.011813f, 0.004523f, 0.010383f, 0.003296f, 0.015435f, 0.000587f, 0.001108f, 0.008533f, -0.037993f, -0.006000f, -0.010177f, -0.002708f, 0.003734f, 0.021848f, 0.024169f, 0.008704f, -0.006272f, -0.016630f, -0.021813f, + -0.007331f, -0.012815f, 0.002761f, -0.006351f, -0.006809f, -0.015007f, 0.022526f, 0.016278f, 0.006603f, 0.020758f, -0.004926f, 0.008319f, 0.012707f, -0.008040f, 0.007570f, -0.005161f, 0.001660f, 0.007605f, -0.002296f, -0.004957f, -0.002079f, -0.002713f, -0.001965f, -0.000121f, 0.000513f, 0.007540f, 0.000304f, 0.000949f, 0.002302f, -0.004102f, -0.011510f, 0.000522f, -0.002682f, -0.001436f, -0.002082f, -0.006714f, -0.000768f, 0.002319f, 0.010240f, 0.008478f, -0.004750f, 0.001245f, 0.006738f, -0.001362f, 0.001552f, -0.002356f, 0.001546f, 0.006531f, 0.000814f, 0.007161f, -0.043999f, -0.028777f, -0.006685f, -0.010498f, 0.022436f, 0.015403f, -0.003712f, 0.038657f, -0.039125f, -0.009143f, -0.014783f, 0.041293f, 0.019797f, -0.013604f, 0.015207f, 0.005772f, -0.016108f, 0.028513f, -0.031498f, 0.015559f, -0.014519f, 0.002439f, 0.003407f, -0.010526f, 0.027532f, -0.019387f, 0.016898f, -0.008085f, -0.040564f, -0.006744f, 0.028299f, -0.017163f, -0.027702f, 0.000362f, -0.003473f, -0.041434f, -0.007765f, 0.016604f, 0.007028f, 0.022075f, 0.016225f, -0.004693f, 0.039821f, -0.009546f, -0.012287f, -0.019606f, + -0.018262f, -0.017658f, 0.010919f, 0.014867f, -0.012842f, -0.014477f, 0.004756f, -0.012558f, 0.016689f, -0.004610f, 0.009052f, -0.006793f, -0.010373f, -0.007959f, -0.000244f, -0.023452f, 0.006335f, 0.016901f, -0.003967f, 0.007307f, 0.010147f, 0.012000f, 0.021631f, -0.015495f, 0.006951f, 0.016875f, -0.002187f, -0.035954f, -0.038280f, 0.004213f, -0.003647f, 0.002844f, -0.014015f, -0.005817f, 0.002813f, -0.013860f, -0.025156f, -0.007682f, 0.018975f, 0.015404f, -0.007569f, -0.003060f, 0.005838f, 0.005213f, -0.002997f, -0.006102f, 0.000455f, -0.000796f, -0.009887f, -0.003653f, 0.010513f, -0.003010f, 0.008449f, 0.001540f, -0.002621f, -0.005157f, 0.006792f, 0.006707f, 0.007861f, 0.000964f, -0.004394f, 0.004583f, -0.011765f, -0.007040f, 0.005826f, 0.002742f, 0.005004f, 0.009206f, -0.004664f, 0.001936f, 0.003627f, 0.004511f, 0.000887f, -0.005339f, -0.007701f, 0.003501f, -0.004176f, -0.002532f, 0.031769f, -0.019652f, -0.049898f, 0.000464f, 0.036021f, 0.045894f, 0.008801f, -0.016590f, -0.012357f, 0.004932f, -0.007872f, -0.006973f, 0.020342f, 0.020586f, -0.009689f, 0.019871f, -0.024603f, -0.002812f, + 0.018257f, -0.008532f, 0.022049f, 0.010468f, -0.002715f, -0.029693f, 0.011754f, -0.006775f, -0.006802f, 0.001761f, -0.001920f, -0.002963f, 0.041374f, -0.019962f, 0.021277f, 0.035402f, 0.024729f, 0.013060f, 0.000788f, -0.023038f, 0.023598f, -0.012807f, 0.022503f, -0.012292f, 0.005465f, -0.024237f, -0.004359f, -0.022898f, -0.014820f, 0.003700f, -0.021145f, -0.005757f, -0.007131f, -0.000695f, 0.019517f, -0.022370f, -0.019029f, -0.006897f, -0.010764f, -0.004396f, -0.018851f, -0.024672f, -0.030715f, 0.003318f, 0.024519f, -0.001499f, -0.014930f, 0.002757f, 0.005549f, 0.019343f, -0.020684f, -0.011903f, -0.006317f, -0.000366f, 0.014802f, 0.000426f, 0.004460f, -0.014376f, -0.005627f, 0.007764f, 0.029581f, 0.013238f, 0.020591f, 0.023589f, 0.030897f, 0.012036f, -0.003624f, -0.010497f, 0.007929f, 0.009603f, 0.013956f, 0.006019f, 0.001839f, 0.000315f, 0.019008f, 0.006912f, -0.006257f, 0.001783f, 0.010932f, 0.004499f, 0.003108f, -0.006448f, -0.006012f, -0.004396f, -0.008592f, 0.000958f, 0.009345f, 0.008706f, 0.002487f, -0.004621f, 0.012808f, 0.007366f, 0.016061f, 0.008392f, 0.001137f, 0.010667f, + 0.000823f, -0.007650f, 0.012507f, 0.000266f, -0.000887f, -0.004143f, 0.003065f, -0.002467f, 0.000502f, 0.010690f, -0.084133f, -0.039993f, 0.028068f, -0.068698f, -0.047624f, -0.003067f, -0.028032f, -0.019214f, 0.020962f, 0.023984f, 0.007341f, -0.004397f, 0.008679f, 0.068621f, -0.008416f, 0.010991f, 0.026405f, 0.030118f, -0.031297f, -0.016218f, -0.014828f, 0.025353f, 0.027641f, 0.013916f, 0.005078f, 0.025923f, -0.007623f, -0.012947f, 0.018173f, 0.035079f, 0.002482f, 0.011361f, 0.035632f, 0.026334f, 0.021426f, -0.015959f, 0.006737f, 0.010844f, -0.000086f, -0.000539f, 0.022862f, -0.007452f, -0.000380f, -0.002261f, 0.015259f, 0.000629f, -0.025048f, -0.016691f, 0.004995f, -0.033919f, 0.025719f, -0.007484f, 0.056853f, 0.002334f, 0.031167f, 0.006258f, -0.001394f, -0.018270f, -0.000916f, 0.007367f, -0.024091f, -0.012305f, -0.028139f, -0.003472f, 0.014334f, 0.019664f, -0.008588f, -0.045646f, 0.016518f, -0.007181f, 0.015549f, -0.016309f, -0.019644f, 0.014448f, -0.029682f, -0.022575f, 0.044082f, 0.000757f, 0.020263f, -0.004062f, -0.019187f, 0.005409f, 0.025926f, 0.006437f, 0.020598f, -0.033396f, + -0.001748f, -0.002164f, -0.005641f, -0.028692f, 0.028029f, -0.016659f, 0.001966f, -0.003171f, 0.003293f, -0.010565f, -0.001151f, 0.006027f, 0.008510f, -0.007009f, 0.018311f, -0.004420f, -0.006006f, -0.010668f, -0.009329f, -0.009187f, 0.008733f, -0.003455f, -0.006638f, -0.002603f, 0.002213f, -0.006956f, 0.012749f, -0.003721f, 0.014442f, -0.009004f, 0.006051f, 0.002388f, 0.005682f, 0.009577f, 0.001776f, 0.034149f, -0.015523f, -0.039443f, 0.016966f, -0.020587f, 0.008671f, -0.000497f, -0.019612f, 0.036350f, -0.048538f, -0.001979f, -0.058600f, 0.001457f, 0.047435f, 0.066327f, 0.031414f, -0.011361f, 0.030702f, -0.002302f, -0.004199f, 0.003321f, -0.005142f, 0.016328f, -0.001957f, -0.031007f, 0.001879f, -0.043099f, 0.015249f, -0.013323f, -0.009549f, 0.028942f, -0.000517f, -0.033137f, -0.036999f, 0.008617f, 0.005195f, -0.018452f, -0.015313f, 0.027787f, -0.040108f, -0.000196f, -0.008026f, 0.014204f, -0.010702f, -0.008697f, -0.032062f, -0.013646f, -0.014103f, -0.005980f, 0.023269f, -0.027472f, 0.009991f, -0.003332f, -0.004670f, 0.003629f, 0.010092f, -0.046518f, -0.004848f, 0.006331f, -0.004004f, 0.017240f, + -0.014552f, -0.020544f, -0.009267f, -0.052055f, -0.022857f, -0.022682f, 0.001207f, 0.022255f, 0.033598f, -0.015815f, 0.025456f, -0.043401f, 0.069730f, 0.004798f, -0.012373f, 0.036439f, -0.043057f, 0.036573f, 0.016469f, -0.009748f, 0.000894f, 0.012222f, 0.001107f, 0.005867f, 0.033432f, -0.014208f, 0.014350f, -0.007681f, 0.010426f, 0.016633f, 0.016502f, 0.020014f, -0.006732f, 0.016881f, 0.004133f, 0.002562f, -0.002635f, -0.022390f, 0.001019f, -0.015876f, 0.007503f, 0.010366f, -0.003274f, -0.002454f, 0.003175f, 0.002310f, 0.011403f, 0.005222f, -0.007934f, 0.012214f, 0.000046f, 0.001480f, 0.015243f, 0.010328f, 0.006234f, 0.027346f, -0.022201f, 0.000223f, 0.010222f, 0.000087f, -0.017373f, 0.004339f, -0.010946f, -0.010510f, 0.042545f, 0.002271f, -0.030636f, -0.000831f, -0.004761f, 0.019654f, 0.012909f, -0.018750f, 0.021340f, 0.000245f, -0.048128f, -0.052403f, -0.005140f, -0.015889f, 0.012907f, -0.002392f, -0.018585f, -0.047248f, -0.041216f, 0.022263f, -0.035086f, -0.007992f, 0.002091f, 0.010919f, 0.002497f, 0.033436f, 0.002701f, -0.017125f, 0.022389f, -0.003136f, 0.003182f, 0.020631f, + -0.027481f, -0.001942f, 0.005833f, -0.028083f, 0.016842f, 0.023068f, 0.010023f, 0.020512f, 0.010694f, 0.031848f, 0.008641f, 0.023148f, -0.032813f, -0.010358f, -0.005309f, -0.044063f, -0.000322f, -0.004889f, 0.018303f, -0.003078f, 0.020995f, -0.003649f, -0.025575f, -0.017492f, -0.001394f, -0.040759f, 0.017737f, 0.000991f, -0.007968f, 0.023627f, 0.014977f, 0.019606f, 0.020408f, 0.006142f, -0.002528f, 0.017108f, -0.055153f, 0.016586f, 0.006872f, 0.024543f, -0.009804f, -0.039011f, 0.024430f, -0.005993f, 0.042033f, -0.062202f, -0.022163f, -0.043594f, 0.029696f, -0.012790f, -0.040019f, -0.044661f, -0.029401f, -0.013290f, 0.014149f, 0.011074f, -0.012274f, -0.012764f, -0.006698f, -0.000903f, -0.013545f, -0.005215f, 0.022685f, 0.003434f, -0.002214f, 0.006586f, 0.004932f, 0.004083f, 0.012303f, -0.009651f, -0.012710f, -0.000401f, -0.022055f, -0.000079f, -0.007761f, -0.003216f, -0.014243f, -0.003904f, -0.019424f, -0.017434f, 0.021967f, -0.012349f, -0.000811f, 0.007341f, 0.010576f, -0.001915f, 0.018441f, -0.015400f, -0.004972f, 0.007593f, -0.018097f, -0.004992f, 0.021172f, 0.007581f, 0.004746f, -0.007262f, + -0.010932f, 0.008171f, 0.029169f, 0.027043f, 0.098929f, 0.074747f, 0.010132f, 0.021671f, 0.006285f, 0.057427f, 0.001591f, 0.027950f, -0.026074f, 0.068012f, -0.026929f, 0.061677f, -0.002757f, 0.039394f, -0.004567f, 0.027797f, -0.027637f, 0.006650f, 0.013916f, -0.015179f, -0.004932f, -0.008166f, -0.006354f, 0.018378f, 0.000475f, -0.015903f, -0.021834f, -0.033039f, -0.041940f, -0.020219f, -0.007025f, 0.000222f, 0.013260f, -0.035406f, 0.015046f, -0.019504f, -0.029972f, -0.006287f, -0.021882f, 0.009979f, -0.005285f, -0.046070f, -0.010885f, -0.023449f, -0.027667f, -0.029174f, 0.026523f, 0.035285f, -0.073830f, 0.016711f, 0.006647f, 0.020701f, 0.007407f, -0.009378f, 0.044799f, 0.025093f, 0.023487f, -0.061914f, -0.027587f, -0.000878f, 0.015346f, 0.051142f, 0.002019f, -0.006995f, 0.002583f, 0.043309f, 0.039076f, -0.037005f, 0.041811f, 0.003013f, 0.009474f, -0.007139f, 0.024584f, -0.052721f, -0.018326f, 0.054162f, -0.008214f, -0.003620f, -0.020779f, 0.036079f, 0.023757f, -0.018806f, -0.031537f, -0.005564f, -0.001239f, 0.003105f, 0.000596f, -0.006885f, -0.029386f, -0.010214f, 0.023137f, 0.030045f, + 0.018833f, -0.016788f, -0.004277f, -0.005007f, -0.014142f, 0.004498f, 0.004906f, 0.013808f, -0.002931f, -0.009996f, 0.008863f, 0.003227f, 0.005398f, 0.027158f, 0.003849f, -0.007757f, -0.010240f, 0.004535f, 0.009946f, 0.021101f, 0.004417f, -0.020853f, -0.010909f, -0.015707f, 0.006309f, 0.007744f, -0.016961f, -0.036624f, 0.011934f, -0.003175f, -0.005981f, -0.012934f, -0.022295f, 0.026644f, -0.011261f, 0.023150f, 0.036295f, -0.042103f, 0.012403f, -0.024278f, 0.068843f, -0.041584f, 0.038673f, 0.035599f, -0.014261f, -0.065315f, -0.038225f, -0.004797f, -0.017756f, -0.002453f, -0.030223f, -0.047727f, -0.063317f, -0.036521f, -0.042333f, 0.017519f, -0.036282f, 0.014366f, 0.003735f, -0.004643f, -0.004218f, -0.029985f, -0.009624f, -0.030791f, 0.008363f, 0.026500f, 0.034894f, 0.000105f, -0.010461f, -0.031600f, -0.007919f, 0.002548f, -0.018984f, 0.004728f, -0.025989f, -0.017154f, -0.004158f, -0.025847f, 0.019508f, -0.022895f, -0.066470f, 0.001891f, -0.002549f, -0.022346f, 0.027608f, 0.021460f, 0.031530f, 0.011724f, 0.024703f, 0.050424f, 0.008077f, -0.051307f, -0.012079f, 0.023293f, -0.011657f, -0.042753f, + 0.023069f, 0.032842f, 0.010770f, -0.000825f, -0.057534f, 0.050367f, -0.002924f, 0.040997f, -0.035010f, 0.041521f, 0.102728f, -0.009739f, -0.003447f, -0.051025f, 0.026668f, -0.041624f, 0.034123f, 0.016968f, -0.023055f, -0.005669f, -0.056218f, 0.012221f, -0.030873f, -0.000148f, 0.020979f, 0.020863f, -0.001235f, -0.015043f, -0.012914f, 0.014687f, 0.037259f, -0.018959f, -0.003406f, 0.005153f, -0.016903f, -0.005440f, -0.005647f, 0.007263f, -0.002279f, 0.015187f, -0.007701f, -0.018762f, -0.010499f, 0.004814f, 0.013827f, -0.018589f, -0.006025f, -0.000954f, 0.002022f, 0.012639f, 0.002438f, -0.005192f, 0.004313f, -0.031102f, -0.017861f, -0.002536f, -0.003227f, 0.005653f, 0.001371f, 0.001804f, -0.000987f, -0.005922f, 0.015115f, -0.001498f, 0.011165f, -0.001421f, -0.003756f, -0.011904f, -0.008119f, -0.081031f, 0.027691f, -0.106323f, 0.070431f, 0.025314f, -0.018069f, 0.075068f, -0.007081f, -0.038018f, 0.066576f, -0.025442f, -0.003505f, 0.014205f, 0.023358f, 0.061592f, 0.002612f, -0.004836f, 0.043481f, 0.018582f, 0.036529f, 0.044765f, 0.033177f, 0.003238f, 0.023219f, 0.003845f, -0.002226f, -0.024222f, + 0.015724f, 0.023598f, 0.005749f, -0.001197f, -0.026266f, 0.012868f, -0.024603f, 0.029944f, 0.029420f, 0.005330f, 0.034741f, -0.021108f, 0.022965f, 0.036181f, 0.023009f, -0.048244f, -0.052042f, 0.061510f, -0.005856f, 0.038577f, 0.059560f, 0.001681f, 0.000138f, -0.005914f, 0.011775f, 0.034651f, 0.032727f, 0.003701f, 0.027198f, 0.000314f, -0.030869f, -0.038323f, -0.057142f, 0.001315f, -0.023162f, 0.001134f, 0.032500f, 0.030687f, -0.053457f, 0.004916f, 0.020826f, -0.046620f, 0.007857f, 0.065642f, -0.028270f, -0.032248f, 0.035109f, -0.037342f, 0.008727f, -0.010249f, 0.068541f, -0.019569f, 0.042350f, -0.020642f, 0.035596f, -0.002989f, 0.013246f, 0.028774f, -0.044720f, -0.013270f, 0.017068f, -0.029279f, 0.021749f, -0.026238f, -0.007354f, -0.014656f, -0.013687f, 0.002290f, -0.007354f, -0.011824f, 0.007170f, 0.020739f, -0.010255f, 0.005944f, 0.007429f, -0.017288f, 0.003117f, 0.002799f, -0.004555f, -0.012109f, -0.005170f, -0.009262f, -0.028761f, -0.011024f, 0.006152f, -0.037356f, 0.013649f, -0.018952f, 0.014549f, -0.008393f, -0.003679f, -0.026075f, -0.013860f, 0.000723f, 0.007290f, -0.011288f, + -0.025851f, 0.004707f, 0.001726f, 0.014264f, 0.005915f, 0.000439f, 0.016753f, 0.013879f, 0.001382f, 0.007702f, -0.037235f, 0.008230f, -0.043127f, 0.088475f, 0.021671f, -0.047352f, 0.017944f, -0.011052f, -0.042140f, -0.049676f, -0.050381f, 0.014822f, -0.002518f, 0.044333f, 0.065838f, 0.031571f, 0.015928f, -0.008073f, 0.021846f, 0.001993f, -0.082928f, 0.036255f, 0.086080f, -0.056485f, -0.059279f, -0.051298f, -0.072450f, 0.052259f, -0.071340f, 0.031971f, 0.000426f, -0.009055f, -0.000503f, -0.023303f, -0.027623f, 0.035243f, -0.073392f, 0.075258f, 0.043227f, 0.009855f, -0.048305f, -0.036631f, -0.032010f, 0.006592f, 0.012548f, -0.031394f, -0.004375f, -0.023230f, 0.051873f, 0.023359f, -0.009433f, -0.001756f, 0.021295f, 0.004610f, 0.024314f, -0.042654f, -0.016880f, -0.004265f, -0.007587f, -0.039698f, -0.027862f, 0.023260f, -0.075187f, -0.044530f, 0.005652f, 0.087610f, 0.042310f, -0.026981f, -0.001866f, -0.066991f, 0.032417f, 0.101643f, 0.003534f, -0.022145f, -0.015381f, -0.048357f, 0.062683f, -0.020427f, -0.024309f, -0.002367f, 0.037132f, 0.023104f, -0.032322f, -0.029355f, -0.010453f, 0.032500f, + -0.008796f, 0.009324f, -0.002609f, -0.026293f, -0.008485f, 0.041237f, 0.023729f, 0.003113f, -0.019310f, -0.003369f, -0.002962f, 0.032082f, 0.026332f, 0.012891f, 0.011879f, -0.038708f, 0.014663f, 0.013519f, -0.005771f, 0.008401f, -0.006027f, -0.005808f, -0.033641f, -0.003892f, -0.001731f, -0.005085f, -0.010735f, 0.008690f, 0.012335f, 0.006145f, -0.039544f, -0.034368f, -0.016759f, -0.000452f, 0.002426f, -0.040241f, 0.014254f, 0.049806f, 0.010140f, -0.014261f, 0.000980f, 0.007423f, 0.000203f, -0.000069f, -0.041384f, -0.028563f, -0.082556f, 0.017834f, -0.060875f, -0.090927f, 0.021151f, 0.050016f, 0.012176f, 0.013307f, -0.038592f, -0.048216f, -0.012665f, -0.071356f, -0.035168f, 0.018431f, -0.059764f, 0.093696f, 0.018090f, -0.023226f, 0.019996f, -0.045145f, -0.089093f, -0.029986f, -0.068187f, 0.010629f, 0.019674f, -0.025110f, -0.048557f, -0.024694f, -0.030035f, 0.025917f, -0.035678f, -0.013115f, -0.004806f, 0.039998f, -0.029255f, -0.005480f, -0.013792f, 0.010093f, 0.016580f, 0.002886f, -0.012221f, 0.041271f, 0.053981f, 0.034486f, -0.027964f, -0.022909f, -0.079926f, -0.044531f, -0.018441f, 0.020944f, + 0.133704f, -0.023053f, 0.001351f, 0.059457f, -0.005639f, 0.025227f, -0.030693f, -0.031880f, -0.025876f, 0.028124f, -0.075844f, 0.000404f, -0.010263f, -0.001131f, 0.065188f, -0.028935f, 0.098802f, 0.008602f, 0.074813f, -0.095826f, -0.028940f, 0.027519f, -0.002150f, -0.041667f, -0.035226f, 0.077489f, -0.080290f, -0.066179f, 0.095009f, 0.016639f, 0.082456f, -0.032998f, -0.005765f, -0.005884f, 0.026359f, 0.011251f, -0.007850f, 0.028037f, 0.027950f, -0.001647f, 0.013004f, 0.008775f, 0.002714f, -0.009900f, -0.018088f, -0.004163f, -0.012061f, -0.015887f, 0.014432f, 0.008455f, -0.013648f, 0.009506f, -0.029489f, -0.002955f, 0.020367f, 0.035978f, -0.003163f, -0.022775f, -0.001994f, -0.025909f, 0.014520f, 0.024730f, -0.017550f, -0.014242f, 0.013643f, 0.016498f, -0.037197f, 0.013202f, 0.001359f, 0.024089f, -0.015975f, -0.016181f, -0.000450f, 0.007660f, 0.010951f, -0.041523f, 0.006481f, -0.017563f, 0.032691f, -0.011438f, -0.004933f, -0.082201f, 0.039102f, 0.060263f, -0.043764f, -0.035985f, -0.012321f, -0.039525f, -0.047602f, 0.012665f, 0.014043f, 0.036920f, 0.001600f, 0.032254f, 0.057444f, 0.059922f, + 0.039771f, 0.013723f, -0.043996f, 0.004270f, 0.022843f, 0.030278f, 0.046605f, 0.000433f, -0.024153f, -0.035171f, -0.013281f, 0.047217f, -0.019417f, 0.018527f, 0.041067f, 0.003971f, 0.080710f, 0.009225f, -0.051532f, 0.044444f, 0.043968f, 0.012595f, 0.018957f, 0.040711f, 0.006520f, 0.003361f, -0.047286f, 0.102051f, -0.108891f, -0.080161f, -0.092885f, -0.030866f, 0.019230f, -0.054723f, 0.028064f, 0.060802f, -0.018054f, 0.005840f, 0.053741f, 0.017029f, -0.058191f, -0.020350f, -0.045028f, -0.006608f, 0.003380f, 0.002809f, 0.051973f, 0.050909f, -0.011709f, -0.013063f, 0.032665f, 0.078467f, 0.013686f, 0.064518f, -0.054524f, 0.057323f, -0.025188f, 0.018868f, -0.011459f, -0.036895f, -0.025487f, -0.006027f, 0.026083f, 0.015731f, 0.064222f, -0.083268f, 0.042315f, -0.033098f, -0.020461f, -0.016432f, 0.030809f, -0.014893f, -0.002836f, 0.006422f, -0.033251f, 0.020581f, -0.016247f, -0.001418f, -0.025229f, 0.007512f, -0.005068f, 0.000799f, -0.028417f, 0.003899f, -0.002563f, 0.005349f, -0.002736f, -0.031379f, 0.012445f, -0.018035f, -0.016042f, -0.007695f, 0.023186f, 0.026406f, 0.029657f, -0.025794f, + 0.050948f, -0.038764f, -0.011513f, 0.002483f, -0.004091f, -0.028783f, -0.015175f, -0.002093f, -0.021189f, 0.005607f, -0.001683f, -0.001407f, -0.002454f, -0.021505f, 0.002788f, -0.004021f, -0.046487f, -0.093536f, -0.094146f, -0.068136f, 0.013992f, 0.174922f, 0.044214f, -0.024119f, -0.052877f, -0.126387f, -0.177780f, 0.040147f, 0.073641f, 0.088402f, -0.018594f, 0.007669f, -0.052126f, -0.090689f, 0.026157f, 0.016475f, 0.029518f, 0.004273f, -0.076056f, -0.023232f, 0.018590f, -0.015284f, -0.002996f, -0.014383f, 0.099111f, 0.087035f, 0.058688f, -0.005362f, -0.042535f, -0.072240f, -0.047819f, -0.043225f, 0.067703f, -0.011209f, 0.049543f, 0.022413f, 0.023205f, -0.030446f, -0.164670f, -0.113368f, 0.055993f, -0.089203f, -0.030440f, 0.190007f, 0.130646f, 0.098175f, -0.074402f, 0.053779f, -0.051529f, 0.003785f, 0.003783f, 0.027591f, 0.080602f, 0.142052f, -0.054370f, -0.005047f, -0.093642f, -0.075649f, -0.123932f, 0.013472f, -0.005103f, -0.133434f, -0.031954f, 0.085986f, 0.032144f, 0.060024f, 0.081348f, 0.146576f, -0.106737f, -0.064049f, 0.008498f, -0.087114f, -0.011207f, 0.048756f, 0.114182f, 0.058066f, + 0.017852f, -0.069630f, -0.066761f, 0.045122f, -0.018987f, 0.067313f, 0.059184f, -0.015932f, 0.027135f, 0.010926f, -0.011344f, -0.022342f, -0.012992f, -0.008399f, 0.020135f, 0.005874f, -0.000469f, 0.007044f, -0.002039f, 0.009762f, 0.000315f, 0.042629f, 0.035059f, 0.055553f, 0.010055f, -0.030440f, -0.064152f, -0.052398f, 0.021410f, 0.049930f, 0.057195f, -0.007096f, -0.036439f, -0.147624f, -0.075831f, -0.069844f, 0.001752f, 0.007562f, 0.015171f, -0.000444f, 0.011083f, -0.016640f, 0.000008f, -0.024663f, -0.022040f, 0.031326f, 0.027655f, 0.016114f, 0.016280f, 0.008230f, 0.003788f, 0.043330f, -0.070261f, -0.232704f, -0.216543f, -0.124283f, -0.135165f, -0.033678f, 0.224208f, 0.113939f, 0.230674f, 0.204713f, 0.320849f, 0.229166f, 0.197121f, 0.031842f, -0.085531f, -0.193386f, -0.309932f, -0.263180f, -0.265074f, -0.138506f, -0.066488f, -0.015570f, 0.002238f, 0.007673f, 0.054754f, 0.073199f, 0.184495f, 0.112087f, 0.217720f, 0.141874f, 0.186632f, 0.067577f, 0.180333f, 0.062705f, 0.044130f, 0.042739f, -0.010711f, -0.050554f, -0.122050f, -0.140791f, -0.261484f, -0.179066f, -0.331353f, -0.262102f, + -0.402167f, -0.238368f, -0.189195f, -0.045581f, 0.110525f, 0.058856f, 0.009934f, 0.110406f, 0.235826f, 0.315103f, 0.413032f, 0.492411f, 0.421274f, 0.307830f, 0.383779f, 0.316737f, 0.177505f, 0.079913f, -0.019692f, -0.131952f, -0.305488f, -0.362737f, -0.485894f, -0.627235f, -0.725990f, -0.655043f, -0.577414f, -0.410847f, -0.280587f, 0.086045f, 0.270586f, 0.329908f, 0.507880f, 0.424163f, 0.529662f, 0.556768f, 0.546060f, 0.629623f, 0.413234f, 0.107448f, -0.104066f, -0.201662f, -0.249751f, -0.161599f, -0.233906f, -0.200411f, -0.234098f, -0.316656f, -0.320430f, -0.372895f, -0.220911f, -0.171848f, -0.146649f, -0.081833f, -0.005044f, 0.022103f, 0.090516f, 0.246019f, 0.259060f, 0.368024f, 0.320192f, 0.420889f, 0.309344f, 0.206865f, 0.213257f, 0.081432f, -0.056075f, -0.091262f, -0.405984f, -0.523181f, -0.487361f, -0.429882f, -0.251888f, -0.197509f, -0.108200f, 0.009526f, 0.109542f, 0.167268f, 0.227143f, 0.271422f, 0.322529f, 0.306463f, 0.289496f, 0.255079f, 0.142338f, -0.000567f, -0.072406f, -0.168279f, -0.176298f, -0.150816f, -0.123358f, -0.128319f, -0.130115f, -0.102088f, -0.073510f, -0.043437f, + -0.018375f, -0.016628f, -0.012075f, 0.003653f, -0.012774f, -0.014846f, 0.017627f, 0.041846f, 0.046475f, 0.030613f, 0.021475f, 0.035935f, 0.043311f, 0.031792f, 0.028928f, 0.026921f, 0.016867f, 0.011463f, 0.009708f}, + {-0.022382f, 0.008214f, -0.012780f, 0.006803f, -0.007245f, -0.014779f, -0.025478f, 0.004400f, 0.000678f, 0.006315f, 0.005545f, -0.001848f, -0.001942f, 0.001843f, 0.015282f, -0.010980f, -0.019535f, 0.006374f, -0.008126f, -0.013117f, 0.000154f, -0.002024f, 0.007981f, 0.002794f, 0.005671f, -0.005939f, -0.001532f, -0.003922f, 0.013006f, -0.003649f, -0.005366f, -0.004741f, -0.002384f, -0.003244f, -0.005331f, -0.004724f, -0.003298f, 0.002505f, 0.001031f, 0.001625f, 0.000368f, 0.003319f, 0.005474f, 0.002731f, -0.005023f, -0.014861f, -0.000227f, -0.010362f, 0.001413f, -0.000788f, -0.004760f, 0.006518f, 0.000369f, -0.000046f, -0.014800f, -0.006106f, 0.001890f, -0.001247f, 0.005060f, 0.000282f, 0.004494f, -0.004368f, 0.001816f, -0.001948f, 0.008999f, -0.003314f, 0.004699f, -0.008221f, -0.008172f, -0.010324f, 0.000425f, -0.002524f, -0.003067f, -0.000029f, -0.003658f, -0.000161f, -0.004252f, 0.000788f, 0.000101f, -0.001854f, -0.006525f, 0.000546f, 0.000586f, 0.003609f, 0.003179f, -0.000065f, 0.003392f, -0.000465f, -0.002782f, -0.000987f, -0.001359f, 0.001259f, -0.000112f, 0.000094f, 0.001876f, 0.001328f, + -0.000334f, 0.001690f, -0.001280f, -0.016016f, -0.003346f, -0.002140f, -0.004575f, -0.002087f, -0.005506f, 0.005251f, -0.002210f, -0.001898f, -0.000508f, 0.000080f, -0.000377f, -0.003881f, 0.014099f, 0.009074f, 0.014737f, -0.006956f, 0.014666f, -0.008751f, -0.006183f, 0.005701f, 0.016245f, -0.000384f, -0.009955f, -0.014621f, -0.010558f, -0.002041f, 0.011555f, 0.004547f, 0.003861f, 0.005140f, -0.005187f, 0.007894f, 0.000929f, 0.005895f, -0.002967f, -0.013318f, 0.003536f, -0.009220f, -0.006391f, -0.006472f, -0.001626f, -0.016901f, -0.000874f, 0.000785f, -0.007151f, 0.015765f, -0.003090f, -0.005110f, -0.006441f, -0.000167f, 0.001638f, -0.006768f, 0.000127f, -0.008298f, -0.003227f, 0.000223f, -0.003527f, 0.011339f, 0.000241f, -0.003059f, 0.006244f, 0.004074f, 0.010394f, 0.004223f, 0.012516f, 0.003113f, 0.010210f, -0.011779f, 0.002939f, 0.009423f, -0.003346f, -0.008409f, -0.011713f, -0.000219f, -0.001036f, -0.002306f, 0.002721f, 0.003421f, -0.002592f, 0.009043f, -0.007903f, 0.003015f, 0.003016f, -0.005769f, 0.004086f, 0.000970f, -0.004376f, 0.002289f, -0.001213f, 0.000918f, -0.004115f, 0.001259f, + 0.000346f, 0.000766f, -0.000597f, -0.000249f, 0.001808f, 0.000542f, 0.003475f, 0.018138f, -0.008159f, -0.006265f, 0.001864f, -0.003975f, -0.002946f, 0.009127f, -0.007006f, 0.008792f, 0.004059f, 0.000252f, 0.004510f, -0.005790f, -0.005525f, -0.010202f, -0.011009f, 0.014634f, 0.006938f, 0.005191f, 0.007841f, -0.005030f, -0.003353f, -0.003682f, 0.018450f, -0.007049f, 0.020189f, -0.000606f, -0.005079f, -0.004775f, -0.010620f, -0.011396f, -0.013873f, -0.000782f, -0.003461f, 0.002599f, 0.013495f, -0.001064f, -0.006260f, -0.018674f, 0.000697f, 0.014988f, 0.021918f, -0.010179f, 0.005689f, 0.004119f, -0.005525f, -0.004859f, 0.005746f, 0.020818f, -0.004908f, 0.003358f, -0.001741f, -0.002929f, -0.001906f, 0.010041f, 0.014384f, -0.010766f, -0.005863f, 0.004552f, 0.018847f, 0.003244f, 0.013358f, -0.010782f, -0.010066f, -0.000447f, -0.001639f, 0.003922f, 0.002888f, -0.000134f, 0.001209f, 0.002063f, -0.004873f, 0.002399f, 0.006118f, 0.004790f, -0.003658f, 0.012141f, -0.003040f, 0.007675f, -0.003924f, -0.004029f, 0.004542f, 0.003919f, 0.004108f, 0.001038f, 0.004282f, 0.000936f, -0.006228f, -0.004126f, + 0.001240f, -0.000179f, 0.002327f, -0.001053f, 0.003465f, -0.000029f, 0.001944f, -0.001740f, -0.000326f, -0.000041f, -0.000897f, -0.002044f, -0.000179f, -0.001197f, -0.000314f, -0.001464f, -0.001344f, 0.003528f, -0.000031f, -0.001505f, 0.003707f, 0.000202f, 0.029583f, -0.020574f, -0.004657f, -0.008630f, 0.002182f, 0.007777f, 0.014133f, -0.014408f, 0.009642f, -0.003864f, -0.015247f, -0.024562f, -0.005152f, -0.010511f, 0.001587f, -0.002463f, -0.010479f, -0.005406f, 0.005547f, 0.005905f, 0.018947f, 0.010474f, 0.009566f, 0.000881f, 0.002874f, -0.010014f, -0.006851f, 0.015232f, 0.011600f, 0.007865f, 0.003547f, 0.007253f, 0.001425f, -0.000041f, -0.012967f, -0.018235f, 0.011981f, -0.004937f, -0.012355f, -0.005918f, -0.007823f, 0.006390f, -0.006908f, 0.015314f, 0.003406f, -0.008974f, -0.004479f, -0.006894f, -0.006048f, 0.007438f, 0.011168f, -0.001060f, 0.007478f, -0.005682f, -0.006395f, -0.000041f, 0.001378f, -0.006049f, -0.002472f, 0.008816f, -0.000045f, -0.003753f, -0.004529f, 0.004768f, 0.005251f, -0.000764f, 0.006378f, 0.000832f, -0.004777f, 0.015298f, -0.002343f, 0.001620f, 0.000588f, -0.018590f, + 0.007074f, 0.005738f, 0.009459f, 0.006194f, -0.006934f, -0.001619f, -0.016860f, -0.007749f, -0.015486f, -0.005694f, -0.007030f, -0.000007f, 0.001304f, -0.010173f, 0.000283f, -0.002508f, -0.000131f, 0.004241f, -0.001693f, -0.001931f, -0.000500f, -0.002863f, 0.000335f, -0.001492f, 0.000991f, -0.001786f, -0.003936f, -0.001964f, -0.001125f, -0.006385f, -0.000746f, -0.000357f, 0.001137f, -0.000457f, 0.000603f, -0.000409f, -0.000023f, -0.003442f, -0.004550f, 0.000377f, -0.000816f, -0.002015f, 0.000640f, -0.020138f, 0.005365f, 0.000350f, -0.005871f, -0.010967f, 0.004777f, -0.010474f, -0.001814f, 0.018483f, 0.027926f, 0.013824f, 0.015410f, -0.001006f, -0.007585f, 0.011625f, 0.010412f, 0.004479f, 0.005619f, 0.013836f, -0.001893f, 0.010100f, 0.009789f, 0.014352f, 0.013750f, -0.011020f, 0.009256f, -0.000582f, 0.003326f, -0.010258f, 0.003286f, -0.001254f, 0.009429f, -0.003470f, -0.002523f, -0.007203f, 0.006890f, -0.011244f, -0.009138f, 0.001056f, 0.009892f, 0.005481f, -0.005791f, -0.002923f, -0.001714f, -0.003766f, 0.006014f, -0.013556f, 0.012699f, 0.000075f, 0.015771f, -0.022114f, 0.001668f, -0.019903f, + -0.006229f, -0.006252f, 0.005561f, -0.001962f, -0.004472f, 0.004533f, 0.001749f, 0.005535f, 0.008747f, 0.014342f, -0.001673f, -0.011279f, 0.002542f, 0.019280f, 0.003996f, -0.005408f, -0.001316f, 0.011941f, -0.006142f, 0.007321f, -0.005931f, -0.020321f, 0.011911f, 0.012676f, 0.011714f, -0.009972f, -0.015089f, -0.010803f, 0.012946f, -0.001240f, -0.001881f, 0.009244f, 0.003451f, 0.002390f, 0.001652f, -0.000498f, 0.003627f, 0.004889f, -0.001497f, -0.002446f, 0.002762f, 0.000429f, -0.000811f, 0.001758f, -0.002479f, 0.000891f, 0.004219f, -0.001563f, 0.004427f, -0.001674f, -0.003134f, 0.001680f, -0.000010f, 0.000173f, 0.002283f, 0.001837f, 0.002317f, 0.001905f, 0.001688f, 0.000032f, 0.002239f, -0.030559f, 0.000469f, -0.006816f, 0.002761f, -0.017139f, 0.002040f, 0.002769f, 0.022608f, -0.018181f, 0.000185f, -0.024372f, 0.005498f, -0.014751f, -0.003623f, 0.000835f, -0.008002f, 0.006970f, 0.003075f, -0.012794f, 0.000200f, -0.000258f, 0.011738f, -0.007761f, 0.018931f, -0.000298f, -0.016468f, -0.008460f, 0.020152f, -0.002014f, 0.008051f, 0.005298f, -0.003359f, 0.011993f, -0.013381f, -0.012715f, + -0.009858f, 0.001303f, -0.012814f, 0.013518f, -0.007513f, 0.008642f, -0.012406f, -0.000227f, -0.015068f, 0.009804f, 0.001306f, 0.011759f, 0.010564f, -0.010111f, 0.019881f, 0.016882f, 0.016005f, 0.003082f, 0.016808f, 0.013736f, -0.014286f, 0.012163f, 0.005842f, 0.001039f, -0.013261f, 0.006016f, -0.011286f, 0.011089f, -0.004856f, -0.008991f, -0.001089f, 0.016588f, 0.005932f, -0.019306f, 0.018308f, -0.001611f, -0.006481f, -0.011079f, 0.018651f, 0.016033f, -0.013907f, 0.013657f, -0.000997f, -0.016684f, 0.000205f, -0.009531f, -0.005169f, 0.009004f, -0.007986f, 0.006394f, -0.000664f, 0.002765f, -0.003821f, 0.004838f, -0.000678f, -0.000634f, -0.001098f, -0.001962f, 0.001769f, 0.000833f, -0.004627f, 0.001523f, 0.002325f, -0.000140f, 0.001738f, 0.001887f, -0.004339f, 0.000798f, -0.000505f, -0.000054f, -0.003654f, 0.001157f, -0.001485f, -0.002373f, -0.004867f, 0.005472f, 0.001197f, -0.002821f, -0.000732f, 0.043555f, 0.007410f, -0.001728f, -0.015007f, -0.028200f, 0.007210f, -0.004145f, -0.041398f, 0.036336f, -0.017591f, -0.026267f, 0.005561f, -0.001667f, 0.004903f, -0.001685f, 0.007050f, 0.010488f, + 0.000147f, -0.000655f, -0.021153f, -0.001744f, -0.002000f, 0.024966f, -0.004549f, 0.000664f, 0.009192f, -0.004362f, -0.003064f, -0.010136f, 0.021315f, -0.015968f, 0.015404f, -0.003781f, -0.012758f, 0.002409f, -0.014264f, -0.007236f, -0.023171f, 0.004104f, 0.010651f, -0.006247f, -0.011556f, -0.009132f, 0.014021f, -0.021705f, -0.005129f, -0.010692f, -0.000294f, -0.003091f, 0.002839f, -0.018825f, 0.018373f, -0.025711f, -0.017589f, 0.007008f, 0.003118f, -0.000949f, 0.006885f, -0.013321f, -0.019197f, 0.002410f, -0.005212f, -0.000850f, 0.009442f, -0.011452f, 0.008561f, 0.005982f, 0.021201f, -0.005839f, 0.003054f, -0.001599f, 0.000320f, 0.029414f, 0.002477f, 0.029124f, -0.007008f, -0.010888f, 0.003331f, -0.014925f, -0.001318f, 0.014905f, 0.001213f, -0.017367f, -0.015220f, 0.004315f, -0.001601f, 0.000110f, 0.014951f, 0.001207f, -0.002788f, 0.006249f, -0.000831f, -0.000555f, -0.006955f, 0.002633f, 0.003288f, -0.003455f, -0.000073f, -0.001671f, 0.005790f, -0.002554f, -0.001143f, 0.003018f, 0.000793f, 0.001857f, -0.000520f, 0.003363f, -0.001058f, 0.000080f, 0.001791f, -0.003589f, 0.004571f, -0.002810f, + 0.001714f, 0.003886f, 0.002112f, 0.003678f, 0.001027f, -0.032104f, -0.004340f, -0.006651f, -0.026074f, -0.044780f, 0.013608f, 0.023026f, -0.016510f, -0.008013f, 0.012955f, -0.004960f, 0.027649f, -0.003241f, -0.015009f, -0.008994f, -0.041749f, 0.013923f, 0.004542f, -0.003927f, -0.029371f, 0.006774f, -0.016404f, -0.004415f, -0.014419f, -0.007432f, 0.020613f, -0.020056f, 0.008441f, -0.029633f, 0.018742f, 0.003641f, 0.000225f, -0.008636f, 0.002079f, -0.003975f, -0.016647f, -0.031189f, 0.005879f, -0.000064f, 0.006503f, 0.012911f, -0.007700f, -0.002604f, -0.020137f, -0.010393f, -0.005505f, 0.008353f, 0.005572f, 0.014625f, 0.023374f, 0.018290f, 0.009312f, 0.013931f, 0.004113f, 0.014526f, 0.013009f, -0.012932f, 0.014924f, 0.016935f, -0.003659f, 0.022717f, -0.002536f, 0.026672f, -0.012003f, -0.028862f, -0.004860f, 0.018253f, 0.020034f, 0.023113f, -0.004640f, -0.040229f, -0.004194f, -0.002223f, 0.001359f, -0.001445f, -0.010033f, 0.005672f, -0.029449f, 0.022717f, 0.014217f, 0.013744f, -0.015500f, -0.014568f, -0.003363f, 0.008401f, -0.001205f, -0.016284f, -0.000025f, -0.007994f, -0.013346f, -0.005370f, + -0.002352f, -0.006383f, 0.000419f, -0.005406f, 0.002496f, -0.003400f, -0.001996f, 0.004156f, 0.000621f, 0.001856f, -0.002278f, -0.005862f, -0.006601f, 0.004418f, -0.005303f, -0.000251f, -0.002053f, 0.002692f, -0.002273f, -0.001381f, -0.002254f, 0.006670f, 0.003383f, 0.001993f, -0.002284f, 0.042743f, -0.009394f, -0.010254f, 0.014258f, 0.023019f, -0.001648f, 0.010719f, 0.026649f, 0.019261f, -0.043748f, -0.040188f, 0.000328f, -0.003853f, 0.005895f, -0.017956f, -0.031919f, 0.007591f, 0.025583f, 0.016917f, -0.018533f, 0.030114f, 0.024314f, 0.022844f, -0.038354f, 0.010873f, 0.020101f, 0.001049f, 0.003049f, 0.017136f, 0.039494f, -0.007619f, -0.018072f, 0.012002f, 0.008941f, -0.005364f, 0.021338f, 0.031899f, 0.005937f, 0.033046f, 0.014420f, -0.024771f, 0.002776f, 0.027408f, -0.002977f, -0.011226f, 0.014166f, 0.002311f, 0.005374f, 0.028767f, 0.018434f, 0.009802f, 0.003385f, -0.033353f, -0.034026f, -0.002821f, 0.005361f, 0.008904f, -0.010521f, -0.001457f, -0.008821f, 0.003009f, 0.004210f, -0.012710f, 0.004791f, -0.007794f, -0.002018f, -0.010796f, 0.001185f, 0.021268f, -0.012601f, -0.030663f, + -0.004833f, -0.026076f, 0.005709f, -0.009288f, -0.000723f, -0.003474f, 0.012280f, -0.004581f, 0.008877f, -0.000084f, 0.007604f, 0.003650f, -0.003606f, -0.004129f, -0.005377f, -0.015106f, 0.005453f, 0.002011f, 0.003731f, 0.000546f, -0.011776f, 0.005928f, -0.009230f, -0.007662f, -0.002743f, -0.009850f, -0.002163f, -0.003189f, -0.003774f, -0.003066f, 0.006345f, -0.002794f, 0.004199f, -0.000349f, 0.003358f, 0.000665f, 0.008209f, -0.003528f, 0.002148f, -0.006642f, -0.001804f, -0.005687f, -0.005359f, -0.001032f, -0.003984f, 0.012826f, 0.005267f, 0.000546f, -0.001900f, -0.001731f, -0.071686f, -0.044835f, -0.013800f, 0.012654f, -0.004702f, -0.018133f, 0.002862f, -0.017682f, 0.049634f, -0.020563f, 0.031719f, 0.048985f, 0.026394f, 0.023962f, -0.019643f, 0.017134f, -0.009930f, -0.023218f, 0.019554f, 0.022907f, 0.015046f, 0.032870f, -0.000176f, -0.002092f, -0.015065f, -0.015402f, -0.013244f, -0.021073f, -0.020568f, -0.014213f, 0.007337f, 0.002407f, -0.000588f, -0.013405f, -0.007508f, -0.020465f, 0.007956f, -0.017734f, -0.016175f, -0.007450f, 0.007992f, -0.000514f, -0.011054f, -0.029618f, 0.003082f, -0.009066f, + 0.010161f, -0.034863f, -0.027089f, 0.029769f, -0.005041f, -0.006279f, -0.014406f, -0.009012f, 0.022206f, 0.006891f, -0.005126f, 0.011961f, -0.003830f, 0.012463f, 0.009810f, 0.014284f, -0.011016f, -0.017837f, -0.044240f, 0.002585f, -0.042923f, -0.003347f, -0.036406f, -0.005653f, 0.033540f, -0.004760f, 0.005561f, -0.024724f, -0.010970f, -0.012987f, 0.002248f, -0.016050f, -0.009535f, 0.014840f, 0.018542f, -0.002451f, -0.002421f, 0.001684f, -0.009174f, 0.002744f, -0.001481f, -0.009005f, -0.003991f, -0.007777f, -0.003373f, -0.004632f, -0.020211f, 0.002950f, -0.003816f, -0.003049f, 0.000703f, -0.005881f, -0.006903f, -0.014050f, -0.003697f, -0.008336f, -0.009894f, -0.002245f, -0.012328f, -0.005985f, 0.001420f, -0.007892f, -0.009137f, 0.000582f, -0.007731f, 0.001913f, 0.002260f, 0.008001f, -0.005677f, 0.005448f, 0.002270f, -0.008227f, -0.003473f, -0.002344f, -0.004141f, 0.001069f, -0.002271f, -0.002728f, 0.049130f, 0.000943f, -0.035602f, -0.030207f, 0.030825f, 0.024144f, -0.022785f, -0.022046f, 0.041341f, 0.026229f, 0.001524f, -0.024580f, 0.002975f, -0.010367f, 0.019620f, -0.015280f, 0.002351f, -0.006509f, + -0.004490f, 0.042681f, -0.006017f, -0.011706f, 0.007960f, 0.007204f, 0.012816f, 0.013131f, 0.001491f, -0.016946f, 0.012813f, 0.006382f, 0.014679f, 0.032978f, 0.015186f, -0.047689f, -0.013574f, -0.007852f, -0.036388f, 0.014015f, -0.006273f, 0.000647f, -0.020255f, 0.017066f, -0.007835f, 0.003178f, -0.026352f, 0.017806f, -0.021453f, 0.001656f, 0.021270f, -0.003521f, 0.022437f, -0.017587f, 0.027969f, -0.035891f, 0.017938f, 0.000277f, -0.012814f, 0.046659f, 0.012554f, -0.009865f, -0.027827f, 0.012001f, -0.005658f, 0.003708f, -0.004161f, 0.016974f, 0.025611f, 0.034251f, -0.021689f, 0.015313f, -0.008548f, 0.030614f, 0.011363f, 0.004242f, -0.002748f, 0.018288f, 0.003377f, -0.012386f, 0.015071f, -0.010814f, -0.017921f, -0.007972f, -0.024403f, 0.000147f, -0.027348f, -0.002506f, -0.018401f, 0.020971f, -0.006617f, 0.013415f, -0.014713f, 0.000372f, -0.008198f, 0.012644f, -0.003981f, -0.001422f, -0.008116f, 0.004139f, -0.006064f, -0.010123f, -0.005620f, 0.004089f, -0.009476f, 0.005606f, -0.007488f, 0.003356f, -0.004814f, -0.004982f, -0.004809f, -0.010786f, -0.006054f, 0.000040f, -0.007610f, -0.007233f, + 0.009857f, 0.008235f, 0.004701f, -0.005138f, -0.012312f, -0.001556f, 0.005502f, -0.000688f, -0.009528f, -0.005986f, -0.071788f, -0.046590f, 0.038214f, -0.028528f, -0.026784f, 0.014534f, 0.033423f, -0.055814f, -0.009494f, 0.012956f, 0.003314f, -0.029272f, -0.043721f, 0.081331f, -0.035446f, 0.010811f, -0.040264f, 0.021776f, -0.014194f, 0.037884f, 0.033647f, 0.003153f, 0.005755f, -0.045599f, -0.000312f, 0.021161f, -0.018618f, -0.027297f, 0.021235f, 0.005813f, 0.022917f, 0.018142f, -0.004092f, 0.007461f, -0.005342f, -0.003154f, 0.033919f, -0.029307f, -0.017306f, 0.027135f, -0.001353f, -0.022188f, 0.028775f, -0.001141f, -0.006601f, -0.019860f, -0.008876f, 0.010446f, -0.015529f, -0.002005f, 0.009995f, -0.019707f, -0.020142f, -0.013224f, 0.014497f, -0.042471f, 0.019964f, -0.002187f, 0.039956f, -0.037985f, 0.012362f, -0.028948f, 0.010411f, -0.017481f, -0.022155f, 0.035959f, -0.020188f, -0.009067f, -0.019654f, 0.015404f, -0.022454f, 0.012930f, -0.007748f, 0.026233f, 0.026991f, -0.003658f, -0.042501f, 0.016668f, 0.017456f, -0.002278f, -0.001506f, -0.024419f, -0.016868f, -0.004262f, -0.020987f, -0.016999f, + -0.006047f, -0.000746f, -0.010516f, -0.014020f, 0.015610f, 0.005036f, -0.009973f, -0.008474f, -0.010184f, -0.010877f, 0.011326f, 0.003983f, 0.002634f, -0.016224f, -0.006226f, 0.013494f, -0.008111f, -0.010053f, 0.006330f, -0.007269f, -0.000059f, 0.004758f, 0.007905f, -0.003522f, -0.013320f, 0.002395f, 0.007796f, -0.017911f, 0.000322f, 0.004334f, 0.000342f, -0.009558f, -0.005389f, 0.000206f, -0.004264f, 0.035950f, 0.017466f, -0.040483f, 0.013795f, 0.043551f, -0.003851f, 0.000099f, 0.020086f, -0.013026f, 0.030522f, 0.027637f, -0.036555f, -0.022404f, -0.006757f, 0.019301f, 0.034850f, 0.006198f, 0.018505f, 0.039367f, 0.029431f, -0.041396f, -0.004480f, 0.065793f, 0.016208f, -0.004372f, -0.007808f, -0.012368f, -0.019366f, 0.005814f, 0.016076f, 0.017979f, 0.016673f, -0.011749f, -0.028142f, 0.007572f, -0.014660f, 0.015450f, 0.045357f, -0.012051f, -0.045654f, 0.054603f, -0.016512f, -0.030044f, 0.044152f, -0.007947f, -0.013249f, -0.047300f, -0.008589f, 0.019596f, 0.009259f, -0.010252f, -0.020059f, 0.018317f, 0.001863f, -0.021895f, 0.018712f, -0.004365f, 0.043056f, -0.031719f, 0.004407f, -0.006167f, + 0.049334f, 0.016883f, -0.070331f, 0.022056f, -0.029455f, -0.012282f, -0.025218f, 0.030420f, 0.100406f, 0.036763f, 0.005717f, 0.023302f, 0.029138f, -0.037029f, -0.015856f, -0.010389f, -0.021300f, -0.012761f, -0.023566f, 0.022169f, -0.051767f, -0.013640f, 0.004515f, 0.006220f, -0.017078f, 0.003263f, 0.008940f, -0.005003f, -0.006724f, 0.017615f, 0.003052f, 0.011779f, 0.009566f, -0.010534f, 0.002809f, 0.008739f, 0.003118f, 0.007320f, -0.005502f, 0.004516f, -0.010238f, 0.001399f, -0.003255f, -0.009537f, -0.005285f, -0.002114f, 0.015507f, 0.000937f, 0.003847f, 0.000709f, -0.003518f, -0.003166f, 0.001070f, -0.001339f, -0.014849f, -0.001699f, 0.002094f, -0.003399f, -0.011522f, -0.026165f, -0.009812f, -0.007888f, 0.015154f, -0.002618f, 0.003085f, -0.015207f, -0.053090f, -0.022519f, 0.003759f, -0.021482f, -0.066856f, 0.058198f, -0.011044f, 0.026299f, 0.005053f, -0.030583f, -0.052728f, -0.050787f, 0.057201f, 0.034898f, 0.013204f, -0.020008f, -0.038092f, -0.028486f, -0.045253f, -0.011528f, 0.017008f, -0.006929f, 0.003798f, 0.007365f, -0.007353f, -0.023366f, -0.022501f, -0.038422f, -0.013747f, -0.007275f, + 0.019042f, 0.013365f, 0.020925f, -0.010202f, -0.017177f, -0.007095f, 0.027322f, 0.004018f, 0.024197f, -0.080463f, -0.018915f, 0.000038f, 0.017763f, -0.025570f, -0.001060f, -0.029617f, 0.023395f, 0.020690f, 0.003992f, 0.099725f, 0.001641f, 0.031275f, 0.041032f, 0.001939f, 0.013290f, 0.000786f, -0.007114f, -0.011809f, 0.020700f, 0.030482f, 0.039692f, -0.000718f, -0.007442f, 0.002899f, 0.026088f, 0.023846f, 0.000884f, 0.019367f, 0.016611f, 0.013096f, -0.005271f, 0.039156f, -0.011213f, 0.050196f, -0.049409f, -0.024534f, -0.060779f, -0.018754f, 0.010895f, 0.001649f, -0.015740f, 0.003437f, -0.000196f, 0.027409f, -0.005513f, 0.032803f, -0.014924f, -0.011938f, -0.016400f, 0.008603f, 0.018336f, -0.002808f, -0.008909f, -0.009728f, 0.011318f, 0.000332f, 0.038040f, -0.005867f, -0.002612f, 0.006985f, 0.010679f, 0.015840f, -0.013154f, -0.001015f, 0.005099f, 0.007899f, -0.018158f, 0.006472f, 0.006926f, 0.023482f, -0.023084f, 0.013281f, 0.008803f, -0.009681f, 0.019799f, -0.011014f, -0.013565f, 0.000236f, -0.004600f, 0.010300f, 0.005083f, -0.007989f, -0.000241f, 0.008491f, 0.001942f, 0.020479f, + -0.000948f, 0.013447f, 0.037791f, -0.006968f, 0.001666f, 0.009953f, -0.051718f, 0.002169f, 0.007422f, 0.032556f, 0.049664f, -0.042266f, 0.009364f, -0.026646f, 0.035401f, 0.032095f, 0.004066f, 0.061616f, 0.019224f, 0.024540f, -0.022454f, -0.003608f, -0.039323f, 0.061563f, -0.035770f, 0.009624f, 0.037673f, -0.008959f, -0.024217f, 0.019028f, -0.005530f, 0.009630f, 0.040446f, 0.001055f, -0.012809f, -0.003718f, 0.007595f, -0.001270f, -0.023977f, 0.017777f, -0.002279f, -0.006799f, 0.069051f, -0.053044f, 0.049964f, 0.032256f, 0.062348f, 0.025406f, -0.044048f, 0.034116f, 0.000710f, 0.031704f, 0.082101f, -0.059192f, -0.024511f, -0.007605f, 0.001616f, 0.055821f, -0.033086f, 0.002921f, -0.035531f, 0.002809f, 0.062945f, -0.007071f, 0.065321f, 0.018425f, 0.011191f, 0.029708f, -0.039866f, -0.006580f, 0.028734f, 0.040661f, -0.066003f, -0.002333f, -0.056549f, 0.025367f, -0.029395f, -0.000952f, 0.013408f, 0.018451f, 0.001427f, -0.020102f, -0.016009f, -0.061834f, -0.007014f, -0.043922f, 0.035665f, 0.003109f, -0.002760f, 0.027778f, 0.001576f, -0.000119f, 0.026680f, 0.019925f, 0.013425f, 0.000352f, + -0.008969f, 0.012600f, -0.020876f, -0.001538f, -0.014316f, 0.014355f, 0.014932f, -0.012603f, -0.002414f, -0.026819f, 0.011920f, -0.001645f, -0.000011f, -0.000712f, -0.026042f, -0.031385f, -0.010379f, 0.010180f, 0.023832f, 0.012134f, 0.010761f, -0.003775f, 0.019963f, 0.013898f, -0.000868f, -0.010141f, 0.017369f, -0.024716f, -0.006943f, 0.005168f, 0.027996f, 0.023151f, 0.005020f, -0.011261f, -0.039986f, 0.011232f, -0.069971f, -0.061669f, 0.000891f, 0.000832f, -0.039169f, 0.031764f, 0.009184f, -0.010713f, -0.036349f, 0.049389f, -0.011540f, 0.073528f, -0.010769f, 0.015776f, 0.026526f, -0.035905f, -0.011986f, 0.011123f, -0.042725f, -0.024148f, -0.037369f, 0.031948f, -0.029946f, -0.008263f, -0.009859f, 0.027629f, -0.025254f, -0.042746f, -0.059451f, -0.001913f, 0.049364f, 0.002767f, -0.027284f, -0.011805f, -0.034533f, -0.011773f, 0.000244f, 0.020377f, -0.038888f, -0.004583f, -0.008515f, -0.027940f, -0.038222f, 0.001569f, 0.006329f, 0.024424f, 0.008410f, 0.042152f, 0.011714f, 0.053257f, -0.022385f, 0.043920f, -0.011322f, -0.034791f, -0.009056f, 0.071592f, -0.031097f, 0.032466f, -0.022810f, 0.052444f, + -0.027948f, 0.017497f, 0.033417f, -0.002301f, -0.013850f, 0.006078f, -0.019132f, 0.047650f, -0.044000f, -0.016884f, 0.047834f, -0.006216f, -0.039984f, 0.001562f, 0.036560f, 0.020014f, 0.036564f, -0.037285f, -0.031440f, -0.020292f, -0.004075f, 0.035746f, 0.043614f, -0.077586f, 0.004070f, 0.022015f, -0.042408f, 0.006649f, 0.026764f, 0.020492f, 0.019634f, 0.018828f, 0.012820f, -0.006270f, 0.001412f, 0.014340f, 0.016444f, 0.013037f, 0.033005f, -0.010383f, 0.017356f, 0.006968f, 0.035732f, 0.020899f, -0.027573f, -0.035241f, 0.011113f, 0.037159f, -0.010676f, -0.010774f, -0.023900f, -0.041136f, 0.004710f, -0.035166f, -0.010912f, 0.007574f, -0.023135f, 0.021208f, 0.006205f, -0.007630f, -0.019099f, -0.004080f, -0.019797f, -0.002020f, 0.011036f, 0.004796f, 0.003145f, -0.003877f, -0.004825f, -0.066349f, 0.073166f, -0.024184f, 0.062319f, -0.012846f, 0.050085f, 0.004341f, -0.015495f, -0.034008f, -0.024018f, -0.004360f, 0.000885f, 0.036861f, -0.013840f, -0.002661f, 0.010665f, -0.033231f, 0.054077f, 0.020329f, 0.002154f, -0.044210f, 0.030600f, 0.016228f, -0.035273f, 0.034849f, 0.003172f, -0.005229f, + 0.008893f, -0.000848f, 0.045679f, -0.010193f, -0.057081f, 0.062089f, -0.031743f, -0.004778f, 0.046130f, -0.020049f, -0.009904f, -0.027229f, 0.072724f, -0.032273f, -0.008827f, -0.045142f, -0.008680f, 0.005799f, 0.065020f, -0.030125f, 0.012347f, 0.020929f, 0.038714f, -0.009881f, -0.041025f, 0.045116f, 0.027345f, 0.036680f, -0.017641f, -0.008449f, 0.004726f, 0.040616f, -0.022240f, -0.047035f, -0.052673f, 0.028404f, -0.036853f, 0.009753f, 0.039592f, 0.036920f, -0.025668f, -0.008541f, 0.053245f, -0.084413f, -0.001887f, 0.011996f, 0.029420f, -0.003619f, -0.030802f, -0.005864f, 0.048568f, -0.009099f, 0.099603f, 0.039243f, -0.028338f, -0.003526f, 0.003053f, -0.011665f, -0.035906f, -0.043815f, -0.032193f, 0.027994f, -0.020802f, -0.008247f, -0.000721f, 0.043719f, 0.018929f, -0.014701f, 0.019276f, 0.014341f, -0.000469f, 0.006725f, 0.008184f, -0.000184f, 0.006150f, 0.044781f, 0.036728f, 0.035715f, 0.024234f, 0.003752f, -0.021744f, 0.012161f, -0.016960f, 0.021666f, -0.026157f, 0.028942f, 0.041879f, 0.014251f, 0.053013f, 0.057394f, 0.023278f, -0.000155f, 0.030075f, 0.010683f, -0.005314f, -0.017770f, + 0.031260f, -0.007708f, -0.024742f, 0.000068f, 0.015226f, -0.006714f, 0.013275f, 0.024880f, 0.009444f, 0.025386f, -0.014153f, -0.016146f, -0.093703f, 0.031915f, 0.018244f, 0.083569f, 0.073230f, -0.010828f, -0.027030f, -0.086105f, 0.002538f, 0.028841f, -0.036854f, 0.028172f, 0.050441f, 0.049075f, -0.022717f, 0.059075f, 0.052809f, 0.002566f, -0.031834f, -0.034089f, 0.053925f, 0.046152f, -0.065472f, -0.089247f, 0.118744f, 0.006244f, -0.008369f, 0.015681f, 0.008836f, 0.044146f, 0.043826f, -0.017494f, -0.014935f, 0.061974f, 0.029468f, -0.010941f, -0.041068f, 0.025080f, 0.005012f, 0.003485f, 0.022100f, 0.003251f, -0.001863f, -0.024521f, 0.013932f, -0.007216f, -0.030173f, 0.055734f, -0.088329f, 0.061855f, 0.051250f, -0.083530f, -0.005739f, 0.042896f, 0.010867f, 0.048917f, -0.011320f, 0.007062f, 0.044712f, -0.005663f, 0.022882f, -0.041068f, -0.065299f, 0.184342f, -0.075209f, -0.105670f, -0.023051f, 0.205277f, 0.088646f, -0.087176f, -0.019670f, 0.036441f, 0.025160f, -0.001640f, -0.052668f, 0.077326f, 0.043266f, 0.032573f, 0.007743f, -0.103852f, -0.016953f, 0.017170f, 0.031130f, -0.042520f, + -0.070572f, 0.006469f, 0.022509f, 0.010005f, -0.033222f, -0.035107f, 0.017163f, 0.009733f, 0.025800f, -0.004529f, -0.008424f, -0.002350f, 0.027565f, 0.035025f, 0.024228f, -0.052184f, -0.020068f, 0.037193f, 0.027468f, -0.026188f, 0.000325f, 0.030364f, 0.053784f, 0.021134f, -0.028018f, -0.038040f, -0.049760f, 0.023805f, -0.015756f, 0.022153f, -0.042012f, 0.023956f, 0.012571f, 0.026963f, -0.019087f, -0.010016f, -0.033654f, -0.014225f, 0.033778f, 0.006334f, -0.027522f, 0.015574f, 0.050909f, 0.013435f, -0.036619f, -0.023114f, 0.046112f, 0.079855f, 0.005579f, 0.132623f, -0.058805f, -0.022616f, 0.076964f, 0.003800f, -0.004332f, -0.039578f, -0.079005f, 0.065681f, -0.041138f, -0.044844f, 0.034154f, -0.049780f, 0.024780f, -0.047203f, -0.052198f, -0.008821f, 0.011550f, 0.007398f, -0.012206f, 0.062825f, 0.015868f, 0.038304f, 0.018528f, 0.001059f, 0.001112f, -0.028402f, -0.060198f, 0.019282f, 0.060317f, -0.049167f, 0.042172f, -0.050121f, -0.005064f, -0.002775f, -0.077343f, 0.055140f, -0.026702f, 0.021455f, 0.001681f, -0.022839f, 0.001488f, -0.056085f, 0.057742f, -0.040618f, 0.019412f, -0.065293f, + -0.039481f, -0.085635f, 0.032518f, -0.040063f, -0.044822f, -0.036435f, -0.018522f, -0.000012f, 0.091285f, 0.032520f, 0.045240f, -0.012538f, -0.042405f, -0.053987f, 0.014446f, 0.003218f, -0.092650f, -0.043316f, -0.163076f, -0.076962f, -0.062940f, -0.009593f, -0.075035f, -0.062086f, -0.013434f, 0.059630f, 0.068328f, -0.055558f, -0.069873f, -0.080722f, 0.040789f, 0.096228f, 0.005132f, 0.077357f, 0.002203f, 0.046658f, 0.019013f, 0.005510f, 0.022804f, 0.008151f, -0.001628f, -0.028138f, 0.040259f, 0.032907f, 0.018029f, -0.033594f, -0.012999f, -0.004647f, 0.017392f, 0.017831f, -0.006391f, 0.019365f, -0.008373f, -0.022665f, -0.038937f, 0.004664f, 0.054794f, 0.019421f, -0.006199f, 0.015148f, -0.017334f, 0.028988f, -0.010435f, 0.037958f, 0.037284f, 0.004111f, -0.039578f, 0.006349f, 0.009156f, 0.043039f, 0.010828f, 0.048948f, -0.032687f, -0.020579f, 0.045687f, 0.046790f, 0.012853f, -0.012599f, -0.008319f, -0.046900f, -0.021913f, -0.093383f, 0.021989f, 0.032974f, -0.080859f, 0.044822f, 0.008932f, -0.023462f, 0.004838f, -0.022865f, -0.002261f, 0.017403f, 0.023606f, 0.041381f, -0.048706f, 0.004742f, + 0.056162f, -0.006241f, -0.026774f, 0.050509f, -0.022199f, 0.003538f, -0.029910f, -0.012140f, -0.059723f, 0.015569f, 0.001439f, 0.033742f, -0.023570f, 0.002503f, 0.041953f, -0.019860f, 0.000671f, 0.043291f, -0.084985f, 0.005528f, -0.097288f, -0.030951f, -0.065179f, 0.052034f, 0.018396f, -0.003818f, 0.021827f, -0.019092f, 0.023813f, 0.066130f, 0.017783f, 0.102674f, -0.057219f, -0.065642f, 0.060480f, 0.016466f, -0.044395f, -0.041672f, -0.017023f, 0.037914f, -0.036451f, -0.001407f, -0.031527f, -0.040698f, 0.023871f, 0.029882f, -0.060691f, -0.035281f, 0.052140f, -0.000927f, 0.018392f, -0.011309f, 0.028561f, 0.012686f, 0.052629f, -0.030675f, -0.022793f, 0.013348f, 0.012108f, -0.015233f, -0.055068f, -0.040251f, -0.043579f, 0.058250f, -0.027122f, -0.045108f, 0.013032f, -0.011812f, -0.014908f, -0.029742f, 0.011162f, 0.013319f, -0.005001f, -0.008859f, -0.016234f, -0.027413f, -0.004859f, -0.006231f, -0.020048f, 0.000715f, -0.009857f, -0.018817f, 0.011330f, -0.011113f, 0.010417f, -0.010966f, -0.009378f, 0.027493f, -0.010996f, 0.012985f, 0.009542f, -0.026224f, 0.011602f, 0.003450f, -0.010693f, -0.031799f, + 0.043111f, 0.028377f, -0.012359f, 0.006682f, -0.021361f, -0.016178f, 0.013057f, -0.000400f, -0.027415f, 0.009533f, -0.011059f, 0.024763f, -0.006771f, -0.004628f, 0.004630f, 0.011532f, -0.063054f, -0.127599f, -0.063727f, -0.024228f, 0.055947f, 0.072881f, -0.139275f, 0.024127f, -0.055242f, -0.075480f, -0.015382f, 0.087352f, 0.055924f, 0.047662f, -0.029938f, -0.033560f, -0.040066f, 0.044085f, 0.031200f, 0.067986f, 0.009013f, -0.088192f, -0.034417f, 0.066383f, -0.010035f, 0.019503f, 0.059570f, -0.028367f, -0.040979f, -0.064513f, -0.064478f, 0.000432f, 0.042293f, 0.090977f, 0.067521f, 0.044672f, 0.018457f, -0.093037f, -0.098957f, 0.034671f, -0.068216f, 0.016158f, 0.087530f, 0.034744f, 0.006110f, -0.044080f, -0.078878f, -0.013559f, -0.033881f, 0.026524f, 0.020852f, 0.014811f, 0.054952f, -0.008562f, -0.010394f, 0.014361f, 0.039943f, 0.064395f, 0.066961f, 0.022589f, 0.059657f, 0.019935f, 0.021570f, -0.013146f, -0.066355f, -0.026216f, -0.028651f, -0.054676f, 0.041335f, 0.038325f, 0.028801f, 0.028324f, -0.012442f, -0.065647f, 0.011101f, 0.019467f, -0.000785f, 0.043505f, 0.028319f, 0.022742f, + -0.004931f, 0.002865f, 0.006683f, 0.044783f, 0.045519f, 0.034219f, 0.010244f, -0.008443f, -0.032938f, -0.006312f, 0.019648f, 0.005473f, -0.009539f, -0.000349f, -0.026101f, -0.012468f, -0.014976f, -0.017538f, 0.013981f, 0.048874f, 0.024411f, -0.009190f, -0.004646f, -0.036908f, -0.003481f, 0.012632f, 0.025085f, 0.027290f, -0.008369f, -0.011979f, -0.056839f, -0.033266f, -0.007961f, 0.000151f, 0.023283f, 0.018856f, -0.010944f, -0.014037f, 0.009579f, 0.003369f, 0.006240f, 0.013793f, -0.015634f, -0.005984f, -0.002873f, 0.009058f, 0.015547f, 0.001163f, -0.005010f, -0.004578f, -0.023585f, 0.039474f, -0.112413f, -0.226147f, -0.116772f, 0.021830f, 0.088209f, 0.215084f, 0.210435f, 0.087623f, 0.089502f, 0.064231f, 0.003428f, -0.107239f, -0.181646f, -0.273697f, -0.081736f, -0.114546f, -0.019986f, 0.111586f, 0.198981f, 0.167269f, 0.147733f, 0.081374f, -0.001873f, -0.052191f, -0.069949f, -0.015031f, -0.121105f, -0.096220f, -0.091377f, -0.059930f, -0.049168f, -0.022872f, -0.004329f, 0.041614f, 0.098114f, 0.100993f, 0.099311f, 0.072658f, 0.094612f, 0.050127f, 0.054109f, -0.017775f, -0.003971f, -0.044730f, + -0.117278f, -0.169931f, -0.205241f, -0.099491f, -0.040024f, 0.031876f, -0.005289f, 0.021620f, 0.047729f, 0.062342f, 0.133150f, 0.153456f, 0.203468f, 0.129718f, 0.013116f, 0.059247f, -0.030726f, -0.112430f, -0.098284f, -0.195718f, -0.228251f, -0.170703f, -0.105475f, -0.045419f, -0.035741f, 0.082086f, 0.092806f, 0.257370f, 0.210826f, 0.154187f, 0.151035f, 0.072280f, -0.009207f, -0.102319f, -0.147844f, -0.108006f, -0.129449f, -0.177849f, -0.084427f, 0.004857f, -0.017360f, 0.004997f, 0.077763f, 0.108280f, 0.080093f, 0.041711f, 0.040498f, 0.068978f, 0.029501f, -0.005181f, -0.008243f, -0.033908f, -0.005669f, -0.030261f, -0.079626f, -0.042174f, -0.059370f, -0.096551f, -0.016948f, -0.016803f, 0.077179f, 0.070231f, 0.042363f, 0.075563f, 0.130945f, 0.093617f, -0.022931f, -0.015858f, -0.063073f, -0.056250f, -0.131721f, -0.136737f, -0.066051f, -0.027962f, 0.011425f, 0.046310f, 0.054982f, 0.081767f, 0.093317f, 0.090064f, 0.094746f, 0.024092f, -0.009560f, -0.050438f, -0.061449f, -0.081330f, -0.089872f, -0.090358f, -0.038813f, 0.020201f, 0.027171f, 0.039164f, 0.041110f, 0.028424f, 0.030490f, 0.031748f, + 0.010341f, 0.007421f, -0.010486f, -0.011239f, 0.019397f, -0.012832f, -0.031007f, 0.001906f, 0.007310f, -0.003752f, -0.009013f, -0.012802f, 0.001342f, -0.002205f, -0.012790f, -0.002648f, 0.001367f, 0.000123f, -0.000143f} + }, + { + {-0.008477f, -0.013211f, -0.009609f, 0.003730f, -0.001463f, -0.022610f, -0.012845f, -0.000988f, 0.003229f, -0.006959f, 0.002377f, -0.008396f, 0.001635f, -0.006069f, 0.015860f, -0.012931f, -0.005680f, -0.005688f, 0.010104f, 0.006978f, 0.016146f, 0.004260f, 0.003351f, -0.007390f, 0.007615f, 0.000969f, 0.002059f, -0.000904f, 0.006109f, 0.008382f, 0.000618f, 0.008355f, 0.007925f, -0.003862f, 0.004428f, -0.004720f, -0.005268f, 0.000588f, -0.004307f, 0.002688f, -0.006752f, -0.012211f, 0.003282f, 0.004359f, -0.003042f, 0.003397f, -0.005843f, 0.005497f, 0.007476f, -0.012897f, 0.002505f, -0.000713f, 0.004839f, 0.004147f, 0.000664f, -0.012729f, -0.003831f, -0.005594f, 0.004207f, -0.000150f, 0.001265f, -0.004086f, 0.002343f, -0.006529f, 0.000299f, 0.007085f, 0.004506f, 0.000480f, -0.003638f, 0.002346f, -0.010428f, -0.005845f, -0.007665f, 0.001387f, 0.001299f, -0.000650f, 0.010986f, 0.000054f, 0.009575f, 0.000140f, 0.001002f, 0.000897f, -0.000047f, -0.005194f, 0.003884f, -0.000314f, 0.001916f, -0.001111f, 0.001231f, 0.001822f, -0.000717f, -0.001812f, -0.000717f, -0.000544f, -0.000560f, -0.000301f, + -0.002798f, 0.000482f, 0.002876f, 0.001666f, 0.000028f, 0.000326f, -0.000788f, -0.001263f, 0.001217f, -0.026098f, -0.000831f, 0.001375f, 0.000369f, 0.004281f, -0.009216f, 0.006759f, 0.003792f, -0.004840f, -0.015558f, 0.010223f, 0.010483f, -0.002476f, 0.008722f, 0.006296f, -0.008629f, 0.017123f, 0.003558f, -0.007760f, 0.009195f, 0.000656f, 0.008591f, 0.001257f, -0.014933f, 0.005664f, -0.002842f, -0.005529f, -0.005808f, -0.004537f, 0.009755f, 0.007567f, 0.000598f, 0.007918f, 0.002853f, -0.007495f, -0.009287f, -0.000851f, -0.002183f, 0.003985f, 0.002696f, -0.007297f, 0.001725f, 0.003792f, 0.003572f, -0.006416f, -0.005392f, -0.008499f, -0.002997f, -0.002123f, 0.001689f, -0.002084f, 0.011388f, 0.004878f, -0.001781f, -0.005782f, 0.002123f, 0.004745f, 0.002445f, 0.012276f, -0.002062f, 0.006183f, -0.000744f, -0.004039f, -0.007474f, 0.005259f, -0.001704f, -0.003460f, 0.007187f, -0.002223f, 0.002383f, -0.001610f, -0.001506f, -0.008288f, 0.001805f, -0.002350f, 0.009729f, 0.012058f, -0.007272f, -0.007380f, -0.005200f, 0.002030f, -0.004668f, -0.002375f, -0.003017f, -0.002999f, -0.003256f, 0.001931f, + 0.004480f, -0.000292f, 0.001149f, 0.001341f, -0.000484f, 0.000144f, -0.002211f, -0.004928f, -0.007729f, -0.017762f, -0.010618f, -0.003879f, 0.012724f, 0.001615f, 0.002361f, 0.007774f, 0.002088f, 0.003331f, -0.018607f, -0.017100f, -0.010894f, -0.002891f, -0.000086f, 0.007833f, -0.005598f, 0.006119f, -0.003207f, -0.011514f, 0.003566f, -0.001724f, -0.007875f, -0.000171f, 0.010998f, 0.015973f, 0.007245f, -0.007381f, 0.004283f, 0.000467f, 0.011530f, -0.000098f, -0.009207f, -0.000360f, -0.005380f, 0.011310f, 0.004952f, 0.005281f, 0.011480f, -0.002031f, 0.000829f, 0.015381f, 0.013470f, -0.000550f, -0.000072f, 0.001018f, -0.000863f, 0.004063f, 0.001122f, -0.011279f, -0.014930f, -0.005305f, -0.001902f, 0.000010f, -0.004953f, -0.016664f, -0.001774f, 0.004573f, -0.009065f, -0.004453f, -0.005907f, -0.005074f, 0.001756f, 0.002098f, 0.005480f, -0.011624f, -0.009282f, 0.008906f, -0.003789f, -0.002058f, 0.001838f, -0.000723f, 0.005823f, -0.011195f, 0.004418f, 0.004107f, -0.004441f, -0.004286f, 0.004452f, -0.004909f, 0.007101f, -0.002823f, 0.000062f, -0.000032f, -0.002805f, 0.001379f, 0.005248f, 0.002891f, + 0.000591f, 0.003163f, 0.000900f, -0.001483f, -0.002869f, -0.001602f, -0.001655f, 0.000624f, 0.000801f, -0.000507f, -0.000422f, 0.000757f, -0.000259f, 0.023739f, -0.009109f, -0.007217f, -0.001155f, 0.000407f, -0.008877f, 0.000080f, -0.006211f, 0.011419f, -0.002794f, -0.014120f, -0.019666f, -0.005050f, -0.013027f, 0.018153f, 0.001474f, 0.012882f, 0.010852f, -0.017213f, -0.000969f, 0.007226f, 0.005226f, 0.009151f, 0.001703f, -0.001108f, -0.001562f, 0.004293f, -0.005706f, 0.006574f, 0.003630f, -0.006139f, 0.003798f, 0.000280f, 0.004435f, 0.009871f, -0.005330f, 0.003922f, -0.000631f, 0.005640f, 0.004853f, -0.002020f, 0.006689f, -0.001895f, 0.005818f, -0.004446f, 0.005306f, -0.013942f, -0.005927f, -0.005091f, 0.003922f, 0.012058f, -0.008857f, -0.005853f, -0.003269f, 0.000735f, -0.004048f, -0.005342f, -0.002830f, 0.004883f, 0.003956f, 0.006974f, -0.002314f, 0.003975f, -0.004108f, -0.004329f, -0.000406f, -0.002601f, 0.004826f, -0.000064f, -0.007284f, 0.004097f, -0.004253f, -0.007170f, -0.002663f, -0.004460f, 0.003154f, -0.005232f, -0.014200f, -0.002012f, -0.006139f, -0.006051f, 0.003080f, -0.003918f, + -0.008548f, -0.001739f, 0.001808f, -0.000613f, 0.000515f, -0.000084f, -0.005368f, 0.000172f, 0.002834f, -0.002030f, -0.002244f, 0.000570f, -0.000109f, 0.001026f, 0.000911f, 0.002786f, 0.000810f, -0.002418f, 0.001606f, -0.000429f, -0.000858f, -0.000935f, -0.002403f, -0.002253f, -0.002451f, 0.004035f, 0.006231f, -0.002406f, 0.009446f, -0.014751f, 0.006632f, -0.008805f, -0.009722f, 0.014319f, 0.005344f, -0.016831f, 0.001783f, 0.000138f, 0.005111f, -0.012102f, -0.007738f, -0.001026f, -0.009801f, -0.017889f, -0.017325f, -0.011417f, -0.017290f, 0.007479f, -0.001776f, 0.002667f, 0.009412f, -0.015171f, 0.010055f, -0.004259f, 0.004724f, 0.003133f, -0.001516f, 0.001613f, -0.002168f, -0.002146f, -0.009884f, -0.005898f, 0.012986f, -0.004735f, -0.010743f, -0.009871f, -0.000934f, -0.004410f, 0.004067f, -0.009433f, -0.014644f, 0.002290f, 0.013668f, -0.002031f, 0.008295f, -0.004674f, 0.004533f, -0.007284f, 0.005586f, 0.002321f, -0.010006f, 0.014789f, 0.002648f, -0.003059f, 0.003464f, 0.013603f, 0.012527f, 0.006620f, -0.001325f, -0.015083f, -0.002541f, -0.012566f, 0.003642f, -0.002728f, 0.002112f, 0.002223f, + 0.003523f, -0.011420f, -0.000088f, -0.000816f, 0.005539f, 0.011743f, -0.014650f, 0.001983f, -0.004289f, -0.013693f, -0.001550f, 0.004036f, -0.001402f, -0.000306f, -0.001317f, 0.004541f, 0.000886f, -0.003960f, -0.002732f, -0.002860f, -0.001757f, -0.004721f, 0.000162f, -0.000377f, 0.002655f, -0.005697f, -0.004015f, -0.000423f, -0.000767f, -0.000696f, 0.000259f, -0.000426f, 0.000914f, -0.002061f, -0.002148f, -0.000541f, -0.000366f, -0.001497f, -0.000390f, -0.000395f, 0.002537f, 0.002379f, -0.000049f, 0.000070f, -0.002650f, -0.004278f, -0.001534f, 0.000227f, -0.016801f, -0.016097f, -0.010457f, -0.017728f, -0.021008f, -0.020028f, 0.008486f, 0.009268f, -0.012883f, -0.003413f, -0.011663f, -0.019038f, 0.010192f, -0.004998f, -0.016510f, 0.005663f, -0.001123f, 0.000828f, 0.001679f, 0.005592f, 0.001842f, -0.000613f, 0.004256f, 0.005693f, -0.009492f, -0.009149f, -0.002454f, -0.011152f, -0.000785f, -0.011887f, -0.020518f, -0.001662f, 0.012431f, -0.014896f, -0.011386f, 0.008015f, -0.007834f, 0.000889f, 0.003167f, -0.007703f, -0.006168f, -0.006542f, -0.022105f, -0.009638f, 0.004759f, -0.006387f, -0.007320f, -0.014005f, + 0.006232f, 0.012370f, -0.004492f, 0.019112f, -0.010615f, -0.005085f, -0.000081f, -0.004711f, -0.016210f, -0.001227f, 0.003719f, -0.000622f, -0.003410f, -0.014246f, -0.002330f, 0.013846f, 0.007029f, 0.004018f, 0.007232f, 0.005074f, -0.003667f, 0.026558f, -0.008375f, -0.010447f, -0.009855f, -0.011921f, 0.004704f, 0.015045f, 0.010342f, 0.001061f, -0.002460f, -0.007749f, -0.002735f, -0.000332f, -0.003586f, 0.000541f, -0.004811f, 0.001753f, 0.011105f, 0.007077f, -0.005454f, -0.001268f, -0.001975f, 0.003898f, -0.002300f, 0.004251f, -0.004614f, -0.002442f, 0.000694f, 0.000771f, -0.001146f, 0.001368f, -0.002664f, 0.002763f, 0.000115f, 0.002150f, 0.001871f, 0.001232f, -0.001297f, -0.002259f, -0.000551f, -0.002282f, 0.029931f, 0.020388f, -0.000846f, 0.018626f, -0.001479f, 0.002794f, 0.003631f, -0.010063f, 0.016995f, 0.000260f, 0.015004f, 0.014379f, -0.011485f, 0.018653f, 0.000366f, -0.014092f, -0.023290f, 0.021411f, 0.010423f, 0.021271f, -0.017690f, 0.012247f, 0.006681f, -0.019501f, -0.019251f, -0.011381f, -0.005412f, 0.020494f, -0.019381f, 0.017292f, -0.001595f, -0.001877f, 0.012489f, 0.011758f, + 0.016028f, 0.005914f, -0.008651f, 0.007837f, 0.015069f, -0.009053f, 0.015066f, 0.022836f, 0.009767f, 0.013867f, 0.005818f, 0.003936f, 0.003956f, 0.000610f, -0.012348f, 0.004609f, 0.001331f, 0.000930f, 0.010534f, -0.007377f, 0.006315f, 0.007003f, -0.002958f, 0.019918f, -0.011601f, -0.007081f, -0.004421f, 0.017203f, -0.003052f, 0.014208f, 0.007258f, 0.009605f, 0.008694f, 0.001674f, -0.024215f, -0.003764f, -0.019395f, -0.010573f, 0.025389f, 0.013207f, -0.011209f, -0.000679f, -0.013836f, -0.012464f, -0.006410f, 0.021046f, 0.001972f, 0.007245f, 0.004207f, -0.003295f, 0.004422f, 0.007536f, 0.013298f, -0.003739f, 0.007826f, 0.005552f, 0.004892f, -0.004543f, -0.002768f, 0.002084f, -0.002226f, -0.000115f, 0.003724f, 0.004863f, 0.002156f, 0.002098f, 0.006001f, 0.005731f, 0.002281f, 0.000160f, 0.002959f, -0.001243f, 0.005121f, 0.007586f, 0.003760f, 0.000199f, 0.008492f, -0.026146f, 0.016632f, 0.015969f, 0.047117f, 0.001919f, 0.004144f, -0.002290f, -0.006383f, -0.003006f, 0.015983f, 0.014566f, 0.012705f, 0.018352f, 0.007487f, 0.028943f, 0.008520f, -0.011386f, 0.002827f, 0.025230f, + 0.010005f, 0.002609f, 0.003973f, -0.012894f, -0.018564f, 0.011989f, -0.009194f, -0.018195f, -0.038580f, -0.000569f, 0.015422f, -0.001138f, 0.009114f, -0.013339f, -0.007035f, -0.004961f, 0.002933f, -0.004199f, -0.011539f, -0.005618f, -0.031071f, -0.008088f, -0.026368f, 0.002261f, -0.013883f, 0.010643f, -0.015117f, 0.005797f, -0.014533f, -0.005032f, -0.000890f, 0.000466f, 0.002275f, 0.002976f, -0.019264f, 0.009350f, -0.002885f, 0.004298f, -0.010059f, 0.000290f, 0.015417f, 0.006219f, 0.021300f, 0.011938f, -0.006480f, -0.001245f, -0.004373f, -0.002160f, -0.004980f, -0.006763f, -0.000318f, 0.008749f, 0.005672f, 0.006506f, 0.004193f, -0.030433f, 0.020116f, 0.019737f, -0.007364f, 0.011308f, 0.008862f, -0.016082f, 0.007786f, 0.004835f, 0.001060f, -0.003408f, 0.002851f, 0.010407f, -0.009097f, 0.006070f, -0.002526f, 0.000536f, -0.000652f, 0.002302f, 0.005626f, -0.004642f, -0.002015f, 0.007729f, -0.005396f, 0.000396f, 0.000325f, 0.002937f, -0.003488f, -0.006457f, 0.004048f, 0.000261f, -0.001924f, -0.001926f, 0.001085f, -0.000226f, 0.003796f, 0.004281f, 0.004905f, 0.000072f, -0.004998f, 0.050712f, + 0.018284f, -0.008466f, 0.025051f, -0.016446f, 0.017474f, 0.011622f, -0.023860f, 0.005094f, -0.030016f, 0.000617f, -0.010192f, -0.021138f, 0.011324f, 0.000386f, 0.008672f, 0.012401f, 0.015397f, 0.024689f, 0.010324f, -0.001752f, -0.006353f, -0.016806f, -0.030251f, 0.010746f, 0.011890f, 0.003294f, -0.010539f, 0.016366f, 0.002168f, 0.017291f, 0.010318f, -0.031577f, -0.011951f, 0.004257f, -0.023199f, 0.001201f, -0.001625f, -0.004411f, 0.006885f, 0.005136f, -0.005431f, 0.023288f, -0.013405f, 0.000926f, 0.013105f, -0.011474f, 0.009019f, -0.005008f, -0.014067f, 0.009471f, -0.000057f, -0.001822f, 0.013474f, 0.008880f, 0.000562f, -0.006962f, 0.027831f, 0.001245f, 0.015689f, 0.001577f, -0.008576f, -0.009622f, -0.023197f, -0.008988f, 0.009801f, -0.000610f, 0.008379f, -0.002628f, -0.018049f, 0.007254f, 0.006084f, -0.026580f, 0.007830f, 0.013725f, -0.006998f, 0.014639f, 0.003551f, -0.015080f, -0.015255f, 0.017453f, -0.000237f, -0.034903f, 0.004494f, 0.003781f, 0.001616f, -0.003531f, 0.002206f, -0.004777f, 0.001027f, 0.010450f, -0.003040f, 0.001694f, 0.002786f, 0.003103f, -0.008632f, 0.002681f, + -0.002978f, 0.002451f, 0.006663f, 0.006896f, 0.005126f, 0.002413f, -0.005597f, 0.002652f, -0.000325f, -0.000493f, 0.002518f, -0.006408f, 0.000109f, 0.004444f, 0.006240f, -0.003988f, -0.002253f, -0.007509f, 0.001537f, 0.007951f, -0.007578f, 0.003210f, 0.002996f, -0.052684f, -0.017490f, 0.055060f, 0.015289f, 0.008792f, -0.008285f, -0.001482f, -0.008460f, 0.011230f, -0.017798f, 0.024070f, 0.013776f, 0.011285f, 0.011602f, -0.008527f, -0.000829f, -0.000993f, 0.007748f, 0.016200f, -0.024373f, -0.014473f, -0.007781f, 0.018523f, 0.006698f, 0.010331f, 0.011130f, -0.002546f, -0.017470f, 0.005727f, 0.001376f, 0.033630f, 0.026481f, 0.006953f, 0.020113f, 0.001092f, -0.009679f, 0.004161f, -0.002767f, -0.004622f, 0.012971f, 0.015922f, 0.013128f, 0.032537f, 0.015738f, 0.012760f, 0.014312f, -0.014769f, -0.024162f, -0.011349f, 0.011042f, -0.020628f, -0.010181f, 0.020034f, 0.021393f, 0.011714f, -0.009645f, 0.018902f, -0.007425f, 0.002053f, 0.004551f, 0.010854f, -0.005537f, -0.011806f, 0.006786f, -0.010648f, -0.033326f, 0.001441f, 0.010813f, -0.018190f, 0.002403f, -0.003286f, -0.004686f, -0.003337f, + -0.010765f, 0.027128f, -0.002804f, 0.015504f, -0.038876f, -0.037015f, -0.031313f, -0.014302f, 0.003222f, 0.003800f, -0.000990f, 0.002137f, -0.000631f, -0.008273f, 0.004089f, -0.009094f, -0.002646f, -0.003991f, 0.009521f, 0.001500f, 0.003465f, -0.007306f, -0.001316f, -0.006504f, -0.002325f, 0.005152f, 0.008230f, 0.008797f, 0.008490f, -0.000125f, -0.005629f, 0.004595f, 0.007484f, 0.004605f, 0.007452f, 0.002588f, -0.000674f, 0.003127f, 0.001098f, 0.001524f, -0.002197f, -0.005095f, 0.006025f, 0.006682f, -0.002174f, -0.001927f, -0.001448f, -0.001126f, 0.027113f, 0.042637f, -0.062846f, -0.008920f, 0.003724f, -0.000508f, -0.007554f, -0.015696f, 0.017180f, -0.020140f, -0.031986f, -0.003283f, 0.031184f, -0.004501f, -0.018273f, 0.005763f, -0.025555f, -0.013899f, 0.000987f, 0.016355f, -0.026786f, 0.002941f, 0.029172f, 0.029931f, 0.000749f, 0.010580f, 0.026144f, -0.014998f, -0.023413f, -0.032717f, 0.003138f, -0.032613f, -0.006993f, 0.013689f, 0.012870f, -0.028862f, -0.027238f, -0.016568f, 0.011684f, -0.007690f, -0.005116f, -0.007601f, 0.025959f, -0.038650f, -0.011331f, 0.005980f, -0.020861f, -0.007213f, + 0.000037f, -0.024395f, 0.001096f, 0.009992f, -0.001363f, 0.031913f, -0.002199f, -0.012968f, 0.002675f, -0.001647f, -0.010528f, 0.006098f, 0.015683f, -0.014576f, 0.022380f, -0.011105f, -0.041773f, 0.001929f, -0.016328f, -0.008969f, -0.001199f, -0.004497f, -0.055098f, -0.009276f, 0.025200f, 0.021765f, 0.015207f, 0.032835f, 0.033439f, -0.045334f, -0.005131f, 0.002892f, 0.009375f, -0.013193f, -0.022605f, -0.000451f, 0.010185f, 0.012050f, 0.010276f, 0.008021f, 0.003790f, 0.006466f, -0.012151f, 0.000044f, 0.007175f, -0.003834f, -0.002862f, 0.001326f, 0.002286f, 0.006504f, -0.007287f, 0.001310f, -0.002995f, 0.003038f, 0.004173f, -0.009689f, 0.001312f, -0.001008f, -0.006731f, 0.002815f, -0.001618f, 0.001256f, 0.000206f, -0.000178f, -0.008495f, 0.004276f, 0.000484f, 0.002226f, -0.005701f, -0.004206f, -0.003821f, -0.003550f, -0.060114f, 0.016755f, -0.011206f, 0.020461f, -0.019258f, -0.000228f, 0.031401f, -0.010538f, 0.044627f, 0.010244f, 0.008576f, -0.019224f, 0.008419f, 0.022112f, -0.013669f, -0.002796f, 0.028851f, 0.018588f, 0.021709f, 0.003051f, -0.033417f, 0.021210f, -0.021586f, -0.002036f, + -0.013023f, 0.003285f, -0.016621f, 0.009637f, -0.004352f, 0.009392f, 0.008938f, 0.015955f, 0.016176f, 0.017957f, -0.021334f, 0.005075f, 0.034016f, 0.007252f, -0.006133f, -0.006839f, -0.017113f, -0.013795f, -0.000092f, 0.001250f, 0.006107f, 0.028631f, 0.002450f, 0.015794f, 0.015294f, -0.001082f, -0.007317f, -0.006969f, 0.025972f, -0.030355f, -0.006622f, -0.026862f, -0.022150f, -0.006218f, 0.000167f, -0.045070f, 0.011697f, -0.014169f, 0.027584f, -0.005717f, 0.001184f, 0.019157f, 0.003899f, 0.046279f, 0.038204f, 0.055126f, 0.020828f, 0.002343f, -0.006428f, -0.005589f, -0.009321f, -0.002703f, -0.011082f, -0.030346f, 0.020535f, 0.025165f, 0.011967f, -0.004103f, 0.002782f, -0.021369f, -0.029110f, 0.013518f, 0.003562f, 0.004032f, -0.009411f, -0.003997f, -0.010210f, -0.005487f, 0.008879f, 0.002976f, 0.011649f, -0.000748f, 0.002529f, -0.006683f, 0.008094f, -0.024068f, -0.006451f, -0.000823f, -0.001065f, -0.004506f, 0.004128f, 0.001128f, 0.001440f, -0.001637f, -0.005993f, -0.001152f, -0.002574f, -0.001583f, 0.007376f, 0.000923f, 0.000792f, -0.004921f, 0.001466f, 0.001238f, -0.000536f, -0.010714f, + -0.007975f, -0.017605f, 0.023743f, -0.006931f, -0.005170f, 0.055384f, -0.011408f, -0.012159f, 0.061579f, -0.000858f, 0.035045f, 0.025869f, 0.002073f, 0.014524f, -0.008259f, 0.011394f, 0.010694f, 0.006802f, 0.008680f, 0.028471f, -0.019611f, 0.034306f, -0.018880f, -0.000562f, 0.007027f, -0.004613f, -0.024865f, -0.022190f, -0.000663f, -0.036034f, -0.011524f, -0.039366f, -0.002722f, -0.023377f, -0.017514f, -0.012791f, -0.011258f, 0.005898f, -0.031688f, 0.036794f, 0.005764f, -0.023860f, -0.017840f, -0.001112f, -0.004633f, -0.005826f, 0.009505f, 0.005073f, 0.036150f, 0.004174f, -0.000419f, -0.018450f, 0.003038f, 0.007515f, -0.001364f, -0.019683f, -0.008546f, 0.022714f, 0.024735f, -0.001443f, -0.021027f, 0.008621f, -0.004147f, 0.032297f, 0.035937f, -0.014015f, -0.009308f, -0.006618f, 0.004076f, -0.013784f, 0.014525f, -0.044713f, -0.004205f, 0.052899f, -0.047715f, -0.023493f, -0.011061f, 0.003449f, 0.004220f, 0.006332f, -0.004321f, 0.014180f, -0.008460f, -0.002365f, 0.025744f, -0.004037f, 0.018658f, -0.012612f, 0.018796f, -0.016439f, 0.012874f, 0.010508f, 0.025553f, -0.000519f, -0.004323f, 0.010803f, + 0.016821f, 0.001506f, -0.004028f, -0.002636f, 0.001712f, -0.009131f, -0.002785f, 0.008616f, 0.011354f, 0.003580f, -0.003680f, 0.011031f, -0.008613f, 0.009064f, 0.007569f, 0.008271f, 0.004554f, 0.000304f, -0.013429f, 0.013506f, 0.007983f, 0.006253f, 0.002966f, 0.006373f, 0.011815f, 0.002721f, -0.009269f, 0.004627f, -0.007554f, -0.005819f, 0.009779f, -0.002378f, 0.008466f, 0.009177f, -0.003581f, -0.006673f, 0.003776f, -0.032220f, -0.017657f, -0.005040f, 0.024936f, 0.030057f, 0.020600f, -0.019126f, -0.049087f, 0.084982f, 0.021379f, -0.053332f, -0.053509f, -0.008017f, 0.012958f, 0.036195f, -0.046553f, -0.008218f, 0.008693f, -0.000673f, -0.006695f, 0.048701f, 0.010450f, -0.028590f, 0.015266f, 0.002010f, -0.001367f, 0.025640f, -0.004678f, 0.014012f, -0.031741f, -0.010754f, 0.055776f, 0.020603f, 0.043984f, 0.013879f, 0.039766f, 0.006951f, -0.014606f, 0.027958f, 0.025483f, 0.039939f, 0.019669f, -0.045111f, -0.017105f, 0.009752f, 0.023316f, -0.018124f, 0.006878f, -0.017464f, -0.029167f, 0.002943f, -0.003372f, -0.017459f, 0.013569f, 0.018892f, 0.016408f, 0.011979f, 0.011249f, -0.008610f, + 0.030188f, -0.000249f, -0.029993f, -0.021789f, 0.027151f, 0.014709f, -0.047106f, 0.020474f, 0.008363f, 0.015133f, -0.041160f, -0.028148f, 0.026467f, 0.040873f, 0.023114f, -0.009204f, -0.044016f, 0.009946f, -0.001947f, 0.037520f, -0.012532f, -0.050481f, 0.021153f, 0.029424f, -0.011158f, 0.030624f, 0.025218f, 0.010379f, -0.020157f, 0.002626f, -0.000266f, 0.005873f, 0.002210f, -0.001388f, -0.010725f, -0.004528f, -0.013461f, -0.001417f, -0.002660f, 0.007012f, -0.008223f, -0.004956f, -0.002763f, -0.006186f, -0.003761f, -0.003301f, -0.003759f, 0.015615f, 0.004703f, 0.000159f, 0.015216f, -0.003809f, -0.014357f, -0.009671f, -0.007695f, -0.006237f, 0.000660f, -0.010501f, 0.004396f, 0.006333f, 0.005378f, 0.003973f, -0.013790f, -0.005395f, 0.011570f, 0.009510f, -0.001428f, 0.020299f, 0.039647f, 0.015284f, 0.041856f, 0.007018f, 0.019204f, 0.014305f, 0.069720f, 0.094859f, 0.007422f, 0.018987f, -0.060364f, -0.019179f, 0.036521f, -0.030760f, 0.071814f, -0.014287f, 0.011325f, 0.019346f, 0.042060f, 0.023329f, -0.010014f, -0.030467f, -0.035708f, -0.011784f, -0.005870f, -0.044781f, -0.021222f, -0.017819f, + 0.028737f, -0.016665f, 0.008560f, -0.028722f, 0.003828f, -0.011295f, -0.041903f, 0.043549f, 0.030208f, 0.035057f, 0.015444f, -0.021387f, -0.020705f, -0.048780f, 0.000901f, -0.043971f, -0.013356f, -0.003757f, 0.005797f, 0.022485f, 0.017743f, -0.014292f, -0.010125f, 0.018620f, 0.041185f, 0.011036f, 0.015747f, 0.030032f, -0.038306f, 0.027111f, -0.021759f, -0.020145f, -0.038676f, -0.016983f, 0.017686f, 0.014916f, 0.002465f, 0.045178f, -0.009901f, -0.016816f, 0.006926f, 0.011785f, 0.062116f, -0.020483f, 0.024901f, 0.024483f, -0.059713f, 0.000016f, 0.007461f, -0.013212f, -0.008800f, 0.020590f, -0.011851f, 0.001702f, 0.025301f, 0.013021f, -0.036749f, -0.044164f, -0.042594f, -0.019996f, -0.015855f, 0.035465f, 0.030963f, -0.008548f, -0.013538f, 0.001760f, 0.003931f, 0.023376f, -0.002644f, -0.007387f, 0.014532f, -0.002728f, -0.002424f, -0.006197f, 0.010526f, 0.014383f, -0.007654f, 0.013767f, 0.013010f, 0.013315f, 0.002351f, -0.005669f, 0.011771f, -0.008162f, 0.007052f, 0.014995f, 0.001106f, 0.008941f, 0.012005f, -0.020395f, -0.000890f, 0.009923f, 0.011097f, 0.014947f, 0.001759f, 0.013382f, + 0.000705f, 0.000862f, -0.004600f, 0.007684f, 0.011253f, 0.059425f, -0.014095f, 0.008686f, -0.026574f, -0.007613f, -0.035425f, 0.028147f, -0.050967f, 0.002342f, -0.041041f, 0.008121f, 0.017572f, 0.006377f, -0.024566f, 0.084186f, -0.005916f, -0.011326f, 0.007644f, -0.047915f, 0.002749f, -0.032376f, 0.001112f, 0.009098f, -0.009708f, -0.001104f, 0.019826f, -0.017594f, 0.000755f, 0.025478f, 0.002080f, 0.006446f, -0.041232f, 0.005249f, -0.003489f, -0.002572f, -0.010448f, -0.051149f, -0.028472f, 0.012639f, 0.004177f, 0.022709f, -0.059274f, 0.006462f, -0.055167f, 0.027969f, -0.037628f, -0.060181f, 0.030468f, 0.055486f, 0.009558f, 0.027292f, -0.041570f, 0.041157f, -0.010215f, 0.006144f, -0.025502f, 0.034280f, 0.013799f, 0.035596f, 0.011166f, 0.043189f, -0.039139f, 0.007473f, 0.002147f, -0.006709f, -0.031038f, -0.025301f, -0.029175f, 0.033096f, -0.008834f, 0.044980f, -0.027971f, -0.021455f, 0.005016f, 0.005991f, -0.025024f, 0.012985f, -0.014731f, -0.058589f, 0.025724f, 0.038812f, 0.064422f, 0.022537f, 0.045686f, -0.026421f, 0.000049f, -0.029788f, 0.048941f, 0.016508f, -0.009427f, -0.019522f, + 0.023210f, -0.016751f, -0.004760f, 0.002476f, -0.014828f, -0.024950f, -0.016678f, -0.011833f, -0.009969f, -0.033227f, -0.014516f, -0.027699f, 0.021274f, -0.005297f, 0.012609f, 0.024849f, 0.006482f, -0.018856f, -0.001903f, -0.018871f, -0.008194f, -0.028194f, -0.015672f, -0.029843f, -0.005334f, 0.048817f, 0.009843f, -0.003773f, 0.010841f, 0.014611f, -0.028386f, -0.013031f, -0.001785f, -0.003833f, -0.011868f, 0.012355f, -0.005720f, -0.043273f, -0.003882f, -0.009998f, -0.098361f, 0.012074f, -0.031423f, 0.091016f, -0.017132f, -0.045970f, 0.018275f, -0.002644f, -0.045797f, -0.007851f, 0.007622f, -0.027589f, 0.068717f, 0.009739f, 0.006592f, 0.031162f, -0.038645f, -0.059506f, -0.036661f, 0.083837f, -0.006694f, -0.017874f, 0.055421f, 0.031211f, -0.026435f, -0.026336f, -0.014809f, 0.066438f, 0.009322f, -0.016299f, -0.026009f, -0.012639f, -0.051947f, 0.034960f, -0.006052f, 0.014114f, 0.033417f, -0.011912f, -0.053798f, -0.006688f, 0.069382f, -0.003081f, -0.017304f, 0.033330f, -0.015193f, 0.041384f, 0.027243f, -0.003635f, -0.051266f, -0.026237f, -0.007028f, -0.047570f, -0.027843f, -0.027451f, 0.003722f, -0.006621f, + 0.040066f, -0.027975f, -0.009661f, -0.000265f, 0.103005f, 0.035718f, -0.017726f, 0.020768f, 0.012152f, -0.006134f, 0.052314f, 0.025361f, -0.019790f, 0.008132f, 0.042298f, 0.047717f, -0.029155f, -0.020874f, -0.069939f, -0.056222f, 0.031976f, -0.021034f, 0.034519f, -0.000995f, -0.041116f, 0.010012f, -0.003247f, 0.013007f, -0.027354f, -0.020924f, 0.038733f, 0.009751f, 0.005145f, -0.003883f, -0.004516f, 0.025678f, -0.012332f, 0.013209f, -0.006572f, 0.016010f, 0.032542f, 0.008616f, -0.023508f, 0.003845f, -0.009030f, 0.017697f, 0.014645f, 0.004824f, 0.021185f, 0.032907f, -0.012932f, 0.026541f, -0.002570f, -0.035288f, -0.009118f, 0.001103f, -0.019717f, 0.007917f, 0.025688f, -0.000507f, -0.013000f, 0.001571f, -0.004804f, 0.033480f, 0.028723f, 0.002909f, 0.013596f, 0.017245f, 0.009022f, 0.022363f, -0.028707f, -0.021377f, 0.010275f, 0.005765f, -0.006101f, -0.002553f, -0.004726f, -0.010740f, -0.010589f, -0.111164f, 0.038147f, -0.023810f, 0.059134f, 0.060123f, -0.034874f, 0.028379f, -0.059540f, -0.089399f, 0.002168f, -0.062881f, 0.008251f, -0.007892f, 0.048617f, -0.036132f, 0.034684f, 0.029750f, + 0.048762f, -0.074287f, 0.008089f, -0.045475f, -0.041667f, 0.004483f, -0.053786f, -0.034709f, 0.048795f, -0.014271f, 0.018522f, 0.056972f, -0.011316f, 0.018746f, -0.046973f, 0.005383f, -0.051790f, 0.047985f, -0.042932f, -0.028520f, -0.031693f, 0.053529f, 0.042908f, -0.030755f, 0.058676f, 0.038847f, -0.012417f, 0.058221f, -0.003248f, -0.061627f, -0.017028f, -0.007273f, -0.048012f, 0.010806f, -0.101583f, 0.010186f, -0.025843f, -0.048763f, -0.039371f, 0.045403f, -0.027120f, 0.094142f, 0.069967f, -0.105261f, 0.000048f, -0.002754f, 0.005056f, 0.048656f, -0.082630f, -0.057635f, 0.056852f, -0.047373f, -0.059185f, -0.068169f, 0.004623f, 0.140003f, 0.069609f, -0.065154f, -0.040993f, 0.005677f, 0.050989f, 0.019485f, -0.068093f, 0.010131f, -0.045475f, -0.026744f, -0.002372f, -0.008202f, 0.002677f, 0.044941f, 0.010679f, 0.026650f, 0.017726f, -0.052407f, 0.014142f, 0.023529f, -0.007344f, -0.018885f, 0.002834f, -0.044720f, 0.039879f, 0.014458f, 0.010954f, -0.059313f, 0.009970f, 0.030601f, 0.008706f, -0.014010f, -0.011021f, 0.026306f, -0.043203f, -0.002785f, -0.032199f, -0.017846f, 0.042479f, -0.044814f, + -0.001758f, 0.026719f, -0.022413f, 0.020950f, 0.025521f, 0.006629f, 0.003890f, 0.018683f, 0.006181f, -0.023844f, 0.034901f, -0.026868f, -0.020971f, -0.012192f, -0.036703f, -0.012682f, -0.034393f, -0.032969f, 0.011998f, 0.051605f, -0.059088f, 0.028396f, -0.098664f, -0.015528f, -0.038947f, -0.033998f, 0.050855f, -0.067630f, -0.105126f, 0.060074f, 0.090779f, 0.021426f, -0.018692f, -0.084069f, 0.004722f, 0.031828f, 0.031662f, -0.014732f, -0.034339f, 0.003417f, -0.009203f, -0.011659f, 0.009643f, -0.013022f, -0.028940f, -0.055286f, 0.005928f, -0.033555f, 0.007140f, -0.030150f, -0.063207f, 0.037934f, 0.027431f, 0.046814f, 0.000654f, 0.050696f, 0.027774f, 0.007047f, -0.017701f, -0.026945f, -0.043865f, -0.031220f, -0.018267f, 0.011507f, 0.028493f, -0.020444f, -0.010711f, -0.071517f, 0.065497f, 0.078232f, 0.042825f, -0.040779f, 0.041046f, -0.055456f, -0.001910f, 0.012080f, -0.121055f, 0.009279f, 0.010902f, 0.056219f, -0.072649f, 0.091961f, 0.035303f, -0.066697f, -0.038529f, 0.027410f, -0.012539f, -0.048964f, -0.060482f, -0.064521f, -0.088396f, 0.063951f, -0.028487f, 0.009750f, -0.134642f, -0.053560f, + 0.007303f, 0.001112f, 0.029753f, -0.021643f, 0.004510f, 0.022493f, 0.023080f, -0.064186f, -0.015568f, 0.010086f, 0.034502f, 0.025408f, -0.006417f, -0.024815f, -0.011382f, -0.005578f, 0.032148f, 0.005377f, -0.021600f, -0.002703f, -0.016991f, -0.006447f, 0.029659f, 0.013812f, -0.016040f, 0.032447f, -0.033423f, -0.019218f, -0.025172f, 0.031392f, -0.013462f, 0.003661f, -0.015426f, 0.013684f, -0.046142f, 0.006629f, 0.018021f, 0.007092f, -0.008818f, -0.019804f, -0.017886f, -0.023148f, 0.022052f, 0.004931f, -0.008518f, -0.026467f, 0.026535f, 0.001552f, 0.001136f, 0.003925f, -0.046961f, -0.022597f, -0.031027f, 0.003956f, -0.016113f, -0.009669f, -0.091649f, -0.012443f, 0.033008f, -0.043151f, -0.040269f, 0.037511f, 0.037956f, 0.007563f, -0.036427f, -0.123876f, -0.018510f, 0.024000f, 0.014409f, 0.053453f, -0.001525f, 0.031006f, -0.008428f, -0.000950f, -0.015941f, 0.002155f, 0.032362f, 0.003629f, 0.000946f, 0.031665f, -0.008896f, -0.007814f, -0.042229f, -0.003991f, -0.007155f, -0.004810f, 0.006752f, 0.025258f, 0.034219f, -0.006921f, -0.000455f, 0.027098f, -0.006635f, -0.052513f, -0.004092f, -0.046623f, + 0.006275f, 0.006254f, -0.061520f, 0.044161f, -0.084583f, 0.018746f, 0.022598f, -0.036934f, -0.003144f, 0.108940f, -0.031421f, 0.036739f, -0.023588f, 0.019423f, -0.082230f, 0.008755f, 0.047191f, -0.001323f, 0.040625f, -0.009636f, 0.003672f, -0.002691f, 0.052068f, -0.033937f, -0.041388f, 0.046748f, -0.043866f, -0.053357f, -0.001366f, -0.085206f, 0.056155f, 0.047261f, -0.017773f, 0.018250f, 0.007141f, -0.000500f, -0.073300f, -0.011933f, -0.006302f, 0.031995f, 0.011228f, -0.030575f, 0.028027f, -0.002049f, -0.037761f, -0.025034f, -0.023799f, 0.004953f, 0.004187f, -0.004997f, -0.001678f, 0.023235f, -0.023759f, -0.006532f, 0.015102f, -0.024363f, -0.014078f, 0.018873f, -0.025960f, 0.001727f, 0.021309f, 0.001480f, -0.007150f, 0.009746f, -0.001783f, 0.002304f, 0.018452f, -0.006970f, -0.006837f, -0.014702f, 0.005521f, -0.009233f, -0.009894f, 0.008627f, 0.009671f, -0.020712f, 0.002415f, -0.019325f, 0.017874f, -0.022014f, 0.011387f, -0.000004f, -0.004944f, 0.002377f, -0.005838f, -0.002418f, -0.001883f, -0.045345f, -0.136788f, -0.064387f, -0.021547f, 0.044479f, 0.100500f, -0.092358f, 0.019999f, -0.026836f, + -0.093142f, -0.013158f, 0.083404f, 0.022352f, 0.068680f, -0.058230f, 0.017129f, -0.020240f, 0.003916f, 0.040511f, 0.006727f, 0.021966f, -0.013300f, -0.118609f, 0.034993f, 0.005725f, -0.050449f, 0.051557f, 0.039285f, -0.035901f, 0.036305f, 0.004300f, -0.038735f, 0.011762f, -0.023988f, 0.074056f, 0.008958f, 0.029961f, 0.001297f, -0.076096f, -0.061043f, -0.020569f, -0.045270f, 0.049450f, 0.070963f, 0.073065f, 0.058697f, -0.020390f, 0.008070f, -0.059787f, -0.009156f, -0.006034f, -0.025299f, -0.031512f, 0.004935f, 0.005760f, -0.082289f, -0.024067f, -0.032271f, -0.002265f, 0.036625f, -0.040423f, -0.009496f, 0.014204f, -0.000088f, 0.042281f, -0.047029f, -0.001909f, -0.053256f, -0.027894f, -0.039423f, 0.021616f, 0.013917f, 0.042240f, -0.005918f, -0.004393f, -0.050229f, -0.015002f, -0.023972f, -0.006300f, 0.020896f, 0.028928f, 0.059205f, -0.038142f, 0.010578f, -0.033049f, 0.011609f, 0.022268f, 0.005946f, -0.018192f, -0.007720f, -0.006395f, -0.007728f, -0.002703f, 0.015393f, 0.016504f, -0.005008f, -0.001951f, -0.008272f, -0.011715f, 0.007301f, 0.016426f, 0.005227f, 0.001823f, 0.004096f, -0.013868f, + -0.016512f, -0.015111f, 0.024591f, -0.000715f, 0.016887f, 0.014246f, -0.002780f, -0.019463f, -0.021278f, 0.003102f, 0.005422f, -0.016152f, -0.005594f, -0.014059f, 0.009952f, -0.010190f, 0.003100f, 0.002946f, 0.010406f, -0.005502f, -0.006868f, 0.002651f, 0.003458f, 0.035520f, -0.057500f, -0.226750f, -0.119596f, 0.024483f, 0.095318f, 0.213397f, 0.163020f, 0.091835f, 0.030876f, 0.047889f, -0.015260f, -0.089787f, -0.173664f, -0.230975f, -0.058491f, -0.066958f, 0.003408f, 0.112470f, 0.160386f, 0.107574f, 0.143693f, 0.033081f, 0.030400f, -0.016828f, -0.072803f, -0.082384f, -0.066684f, -0.070793f, -0.087596f, -0.070189f, -0.030079f, -0.004516f, -0.001154f, 0.056096f, 0.072716f, 0.139180f, 0.065687f, 0.021654f, 0.057064f, 0.088827f, 0.028234f, 0.016952f, -0.071757f, -0.098103f, -0.160429f, -0.074100f, -0.084188f, -0.060860f, -0.036321f, -0.028436f, 0.011778f, 0.019759f, 0.067320f, 0.138051f, 0.110956f, 0.121202f, 0.089629f, 0.109962f, 0.081710f, -0.066132f, -0.060750f, -0.152793f, -0.118469f, -0.086605f, -0.194732f, -0.150514f, -0.092215f, 0.007320f, 0.117842f, 0.112447f, 0.132726f, 0.166136f, + 0.141916f, 0.076526f, 0.092062f, 0.003681f, -0.036237f, -0.097434f, -0.141674f, -0.142106f, -0.117444f, -0.070458f, -0.015365f, 0.020281f, 0.034131f, 0.039456f, 0.065527f, 0.047511f, 0.076672f, 0.048680f, 0.019043f, 0.012608f, -0.003139f, -0.007500f, -0.002032f, -0.053098f, -0.037334f, -0.007440f, -0.024927f, -0.063430f, -0.018055f, -0.022719f, -0.023852f, -0.004317f, 0.047234f, 0.089823f, 0.074182f, 0.007932f, 0.072904f, 0.051641f, -0.009840f, -0.060120f, -0.095598f, -0.088546f, -0.040414f, -0.043797f, -0.027733f, -0.015134f, 0.025004f, 0.055715f, 0.076832f, 0.087766f, 0.062847f, 0.024808f, 0.026731f, -0.016684f, -0.048214f, -0.080638f, -0.072657f, -0.031919f, -0.003550f, -0.023539f, -0.008044f, 0.023347f, 0.029196f, 0.030596f, 0.028668f, 0.007583f, 0.011745f, 0.018701f, -0.003557f, -0.016711f, 0.000197f, 0.006129f, -0.012697f, -0.013741f, -0.002277f, 0.005599f, 0.003718f, -0.008548f, -0.004716f, 0.004309f, 0.001632f, -0.005942f, -0.007926f, -0.003263f, 0.000861f, -0.000134f, -0.000168f}, + {-0.002911f, -0.004136f, -0.007931f, 0.004600f, 0.007370f, 0.013094f, 0.003518f, -0.009232f, -0.016407f, 0.003534f, -0.007678f, 0.000630f, 0.005118f, 0.001980f, 0.013230f, -0.010984f, -0.002727f, -0.001512f, -0.000896f, -0.009432f, 0.005771f, 0.002436f, 0.001183f, 0.000234f, -0.004624f, -0.003555f, -0.003358f, -0.001093f, 0.000432f, 0.002198f, -0.003496f, 0.005031f, 0.011839f, -0.000397f, 0.005243f, -0.008433f, -0.004915f, -0.010089f, -0.004891f, 0.010681f, 0.000481f, -0.002199f, 0.001871f, 0.011333f, 0.001192f, 0.005692f, -0.001465f, -0.005340f, -0.001702f, 0.006464f, -0.005600f, 0.010153f, 0.006228f, 0.011450f, 0.005626f, 0.000717f, -0.003543f, -0.007613f, -0.004247f, -0.006619f, -0.001054f, -0.004833f, 0.001872f, 0.000414f, -0.002634f, 0.001671f, -0.002269f, 0.004092f, -0.001064f, -0.001138f, 0.005754f, -0.000583f, -0.000455f, 0.000768f, -0.005651f, 0.002550f, -0.004148f, -0.006621f, -0.003855f, -0.002913f, 0.002835f, -0.000548f, -0.000506f, -0.007507f, -0.001295f, 0.001957f, 0.001430f, -0.002981f, 0.000234f, -0.002946f, 0.001272f, 0.002111f, 0.001522f, 0.000597f, -0.000570f, -0.001195f, + 0.000296f, -0.002315f, -0.001306f, 0.000518f, 0.000294f, 0.001038f, 0.000950f, 0.000937f, 0.000152f, -0.022863f, -0.005182f, 0.009372f, 0.001638f, 0.012779f, 0.006812f, -0.010526f, 0.002768f, -0.000232f, 0.004180f, -0.003771f, -0.017561f, 0.010130f, 0.006199f, 0.011608f, 0.014502f, 0.012493f, 0.004370f, 0.000167f, -0.017894f, -0.001846f, 0.008200f, -0.008156f, -0.007088f, -0.018676f, -0.001267f, -0.003126f, -0.002174f, -0.004755f, 0.002199f, -0.011149f, 0.005070f, -0.001957f, 0.004703f, 0.001387f, -0.007509f, 0.005782f, 0.004811f, 0.012951f, -0.001523f, -0.010376f, -0.005375f, 0.005614f, 0.002242f, -0.002597f, 0.000521f, 0.004133f, 0.000521f, -0.007582f, -0.000089f, 0.001596f, -0.000825f, 0.000480f, -0.004803f, -0.002098f, -0.006390f, -0.001312f, 0.007826f, 0.002804f, -0.002700f, 0.003352f, -0.001040f, -0.000404f, 0.001170f, -0.009103f, -0.000858f, -0.000451f, 0.005070f, 0.009858f, -0.002937f, -0.000993f, -0.006381f, -0.004923f, 0.002494f, 0.011218f, -0.009950f, -0.001552f, 0.002524f, -0.000537f, -0.002721f, -0.000171f, -0.002653f, 0.003655f, 0.003808f, 0.002030f, 0.006207f, -0.002960f, + -0.001944f, -0.000634f, 0.001438f, -0.001421f, 0.000231f, 0.001014f, 0.000860f, -0.000736f, -0.002650f, 0.001956f, -0.002639f, 0.012643f, 0.004745f, 0.004273f, -0.004240f, 0.000333f, 0.001189f, 0.001212f, -0.021709f, -0.011739f, -0.000984f, -0.005400f, -0.006719f, -0.000333f, -0.005657f, -0.022091f, 0.013167f, 0.003030f, 0.005960f, -0.002322f, 0.004535f, -0.005838f, 0.000280f, 0.000798f, 0.011383f, -0.004044f, -0.002398f, -0.001899f, -0.001924f, -0.001817f, -0.000806f, 0.012340f, -0.002389f, -0.000181f, -0.007026f, -0.000391f, -0.003392f, 0.004012f, 0.002029f, -0.011949f, 0.009269f, -0.012095f, -0.000231f, 0.010611f, -0.001519f, 0.000398f, 0.000809f, -0.000244f, -0.007412f, -0.005267f, 0.012181f, 0.007044f, -0.015095f, -0.008067f, 0.002389f, -0.008863f, -0.006431f, 0.006461f, -0.010864f, 0.002112f, 0.002632f, 0.006213f, 0.012974f, 0.009946f, 0.006085f, 0.004648f, -0.008839f, -0.009216f, -0.007891f, 0.002565f, 0.011290f, 0.004364f, -0.001936f, -0.005042f, 0.003702f, -0.004262f, -0.001858f, 0.002630f, -0.004185f, -0.006344f, -0.000853f, 0.005086f, -0.000921f, -0.004330f, 0.000577f, 0.000042f, + 0.004956f, 0.002064f, 0.004578f, 0.001043f, -0.002098f, -0.002152f, -0.001721f, -0.000899f, -0.000575f, 0.001472f, 0.002880f, 0.003422f, 0.003600f, 0.016594f, -0.004063f, -0.004241f, -0.004974f, 0.004680f, -0.005565f, 0.008114f, -0.015740f, -0.002017f, 0.011676f, 0.006113f, -0.011838f, 0.008759f, 0.014378f, 0.013569f, 0.008653f, 0.001659f, -0.000540f, -0.008875f, -0.011445f, 0.004854f, -0.001101f, 0.011471f, -0.000901f, 0.006859f, -0.007150f, -0.004758f, -0.003837f, 0.001135f, 0.003654f, -0.000651f, -0.013977f, 0.002947f, 0.004840f, 0.003515f, 0.006024f, 0.003695f, -0.007586f, -0.018677f, -0.006015f, 0.002733f, 0.003600f, 0.000877f, -0.000803f, 0.003541f, -0.007664f, -0.000128f, -0.013917f, 0.006501f, -0.014359f, -0.003789f, -0.006090f, -0.009450f, 0.006891f, 0.003045f, 0.002921f, -0.008252f, -0.004014f, -0.002431f, -0.008276f, 0.000780f, -0.000705f, 0.004418f, -0.003549f, -0.006969f, -0.005320f, -0.016529f, 0.005247f, 0.001912f, 0.007096f, 0.010465f, 0.013367f, 0.005215f, -0.005270f, -0.007877f, -0.003719f, 0.007261f, 0.007244f, -0.008209f, 0.008948f, 0.000378f, -0.005821f, 0.012902f, + -0.002504f, 0.002908f, 0.002188f, 0.003784f, -0.000232f, -0.002885f, 0.000836f, 0.004008f, 0.001439f, -0.000637f, 0.004343f, -0.002277f, -0.001783f, -0.003154f, 0.001489f, 0.000390f, -0.001613f, 0.002374f, -0.002304f, -0.004154f, -0.001742f, 0.003147f, -0.000758f, -0.000725f, 0.001135f, 0.008308f, 0.007676f, -0.001316f, 0.005436f, -0.016031f, 0.001907f, -0.007652f, 0.000862f, 0.002397f, -0.010063f, 0.003689f, 0.029534f, 0.003234f, -0.002585f, -0.016606f, 0.023781f, -0.000045f, 0.010003f, 0.001189f, -0.000471f, -0.012904f, 0.012565f, 0.003226f, -0.006905f, 0.001647f, 0.000976f, -0.005148f, 0.005097f, 0.013223f, -0.003818f, 0.014061f, -0.004133f, 0.006018f, -0.000195f, 0.009274f, 0.008263f, 0.009235f, 0.000130f, -0.005025f, 0.007260f, -0.005296f, 0.006398f, -0.001818f, 0.006450f, 0.006248f, 0.006012f, -0.000775f, -0.001812f, 0.002402f, -0.005166f, -0.007507f, -0.019167f, 0.012546f, -0.012383f, 0.008682f, 0.001137f, 0.003657f, -0.002211f, -0.022892f, -0.004930f, -0.006179f, -0.011125f, 0.001518f, 0.006967f, -0.014704f, -0.004625f, 0.006639f, 0.001252f, 0.010404f, 0.018186f, -0.000494f, + -0.004889f, -0.004341f, -0.018849f, 0.005792f, 0.003679f, -0.004218f, 0.001018f, 0.007498f, 0.007716f, 0.002230f, 0.001988f, 0.005429f, 0.000652f, -0.000829f, 0.008124f, 0.004774f, -0.004423f, 0.008288f, 0.006084f, 0.008137f, 0.002527f, -0.001381f, 0.000614f, -0.000525f, -0.000518f, -0.003001f, 0.001093f, -0.001820f, 0.001917f, -0.002301f, 0.003824f, 0.001369f, 0.000396f, 0.003150f, 0.000310f, -0.000946f, 0.000919f, -0.000671f, -0.000240f, -0.001071f, 0.003809f, 0.002323f, 0.000808f, 0.002704f, -0.000818f, 0.004298f, 0.000596f, 0.001385f, -0.008373f, -0.010114f, -0.000981f, 0.005448f, -0.003240f, -0.004879f, -0.007374f, 0.002158f, 0.013409f, 0.006020f, 0.002108f, -0.030481f, -0.013998f, -0.004242f, 0.006233f, -0.003631f, 0.010310f, 0.034805f, 0.010817f, -0.012765f, 0.001980f, -0.015103f, -0.004906f, 0.010608f, -0.012043f, -0.003042f, 0.015514f, 0.003762f, -0.003894f, 0.002224f, 0.008771f, -0.005262f, 0.004249f, 0.004633f, 0.004550f, -0.008617f, 0.003939f, -0.004023f, -0.004944f, -0.012739f, -0.004975f, -0.007439f, -0.014219f, 0.006236f, 0.000483f, -0.000948f, 0.014342f, 0.010497f, + 0.003672f, 0.011539f, 0.000063f, -0.014576f, 0.012283f, -0.001374f, -0.010002f, -0.007866f, -0.014519f, 0.000677f, 0.017472f, 0.001212f, -0.007702f, 0.007445f, -0.013023f, -0.008131f, 0.006731f, -0.010515f, -0.014024f, -0.007345f, -0.004425f, 0.007921f, -0.012392f, -0.003809f, -0.005771f, 0.015944f, 0.002292f, -0.005509f, 0.007809f, -0.004766f, -0.005812f, 0.000918f, 0.012611f, -0.002357f, 0.000833f, 0.006996f, 0.003994f, -0.016090f, -0.000616f, 0.009836f, 0.004670f, 0.005737f, -0.001313f, -0.003114f, 0.007223f, -0.004299f, 0.001245f, -0.003523f, 0.002059f, 0.002723f, 0.003734f, -0.008155f, 0.000048f, 0.000855f, 0.002055f, 0.000503f, 0.000087f, 0.003822f, -0.000716f, -0.000726f, -0.003602f, 0.002809f, 0.010595f, 0.007651f, -0.019786f, 0.018755f, -0.007078f, 0.001720f, -0.008654f, 0.016061f, -0.002289f, -0.010839f, -0.035324f, -0.004723f, 0.018318f, 0.004528f, -0.027541f, 0.012539f, -0.000028f, -0.005650f, -0.008838f, -0.007167f, -0.002728f, -0.016389f, -0.002771f, 0.013227f, 0.017231f, 0.020502f, 0.012446f, 0.018694f, -0.006137f, 0.014722f, 0.007095f, -0.029095f, -0.000693f, 0.007556f, + 0.010322f, 0.005024f, -0.010034f, 0.000557f, -0.002100f, 0.010250f, -0.017439f, -0.006283f, 0.012953f, -0.004294f, 0.007281f, 0.003811f, -0.011618f, -0.012915f, -0.006666f, -0.019344f, -0.005507f, -0.005954f, 0.007931f, 0.002860f, -0.011186f, -0.002588f, -0.023881f, -0.006039f, 0.009745f, -0.006999f, -0.023598f, -0.000375f, 0.013398f, -0.028650f, 0.008300f, 0.004739f, 0.009096f, -0.013599f, -0.006314f, -0.012928f, 0.000996f, -0.003903f, -0.014620f, -0.003876f, -0.002461f, 0.008760f, 0.004958f, 0.021374f, 0.001357f, 0.000193f, 0.003411f, -0.001659f, -0.010849f, 0.013495f, 0.004716f, -0.005611f, 0.011857f, 0.002110f, -0.005895f, 0.001912f, -0.000371f, 0.007168f, 0.001653f, 0.001370f, 0.004492f, -0.003893f, 0.000163f, -0.004178f, -0.000010f, -0.003342f, 0.003300f, -0.001399f, 0.001430f, 0.003989f, 0.000576f, -0.002628f, 0.003760f, 0.000876f, 0.004002f, 0.001013f, -0.001155f, -0.021898f, 0.004923f, 0.017601f, 0.022670f, 0.016905f, 0.017264f, 0.006690f, -0.011919f, 0.012104f, 0.020953f, -0.030928f, 0.015563f, 0.015564f, -0.033139f, -0.008667f, 0.008183f, 0.035809f, -0.002757f, -0.002239f, + -0.008492f, -0.009987f, 0.044291f, 0.021981f, 0.006187f, 0.005573f, 0.022987f, -0.000382f, -0.003463f, -0.008544f, 0.003461f, -0.019870f, -0.017944f, -0.004066f, 0.005593f, 0.013357f, 0.006072f, 0.003061f, -0.006757f, 0.001327f, -0.014590f, 0.006121f, -0.021638f, 0.021264f, -0.002352f, -0.010534f, -0.012431f, -0.014170f, -0.021832f, 0.003820f, -0.021133f, -0.007071f, 0.014541f, -0.003330f, -0.007226f, -0.006919f, -0.003368f, -0.018047f, -0.012553f, -0.008109f, -0.007693f, -0.004086f, 0.006670f, 0.003759f, 0.001119f, 0.001011f, -0.015972f, 0.027571f, 0.015836f, 0.000432f, -0.002010f, 0.036250f, -0.004350f, -0.006208f, -0.008872f, -0.018300f, -0.005011f, 0.012150f, 0.011655f, -0.001744f, 0.014179f, -0.028110f, 0.008343f, -0.010694f, 0.002712f, 0.010884f, -0.003760f, -0.000205f, 0.001779f, 0.000968f, 0.003492f, -0.004384f, 0.005261f, 0.006790f, -0.006324f, 0.002657f, 0.003567f, 0.004443f, 0.011522f, -0.008611f, -0.000777f, 0.001261f, -0.000203f, 0.002735f, 0.001289f, 0.002854f, 0.003638f, -0.003103f, 0.002341f, -0.000942f, 0.000289f, -0.006130f, -0.001324f, -0.001415f, 0.005257f, 0.040783f, + 0.013930f, 0.008630f, 0.019795f, -0.022339f, -0.013442f, 0.012780f, 0.013594f, 0.030272f, 0.004381f, 0.008444f, -0.020379f, -0.001163f, 0.010058f, -0.026714f, -0.008620f, 0.010745f, -0.008934f, 0.000371f, 0.007309f, 0.019804f, -0.006717f, 0.007760f, 0.004035f, 0.004383f, 0.016865f, 0.014735f, 0.017974f, -0.014135f, -0.009497f, 0.019523f, -0.024757f, -0.008188f, -0.008231f, -0.001634f, -0.006729f, -0.015784f, 0.015346f, -0.000531f, -0.017097f, 0.000826f, -0.006765f, -0.017756f, -0.022189f, -0.012302f, -0.013323f, 0.026182f, -0.008387f, -0.006649f, -0.015558f, -0.001276f, -0.007947f, 0.004057f, 0.030806f, -0.005776f, -0.010150f, 0.005258f, -0.001887f, 0.017807f, -0.020720f, 0.034972f, 0.006955f, -0.033650f, -0.024519f, 0.008872f, -0.022707f, 0.000368f, -0.024309f, 0.000107f, 0.005128f, -0.003109f, 0.026140f, 0.032829f, -0.015672f, 0.003974f, -0.006497f, -0.024307f, -0.009135f, -0.013244f, -0.015914f, -0.003660f, 0.011872f, -0.008261f, -0.018745f, 0.012356f, 0.000748f, -0.010138f, -0.008616f, 0.004062f, 0.006869f, -0.003031f, -0.002024f, -0.009549f, 0.000449f, -0.008819f, -0.001836f, -0.004426f, + 0.006069f, 0.006914f, 0.001589f, -0.008759f, 0.000859f, 0.000544f, 0.005570f, -0.000146f, -0.002242f, 0.000450f, -0.011049f, -0.001229f, -0.006267f, -0.004418f, 0.000772f, 0.002449f, -0.005848f, 0.004455f, -0.003439f, -0.003169f, 0.007367f, -0.003005f, -0.007354f, -0.035587f, 0.013658f, 0.074054f, -0.012638f, -0.000696f, -0.032204f, -0.013458f, 0.022100f, -0.003040f, 0.042537f, 0.025614f, 0.023677f, 0.000318f, 0.018307f, -0.034533f, 0.031716f, 0.016514f, 0.001652f, 0.004283f, -0.019955f, 0.008897f, -0.000142f, 0.032332f, 0.018106f, 0.021598f, -0.007642f, 0.002249f, 0.005752f, -0.021453f, -0.017283f, -0.007782f, 0.010028f, 0.037691f, -0.010252f, -0.012508f, -0.012626f, -0.006987f, 0.005031f, -0.023701f, -0.006777f, -0.001413f, -0.012621f, -0.025096f, -0.005187f, -0.031879f, -0.011502f, 0.019027f, -0.022133f, -0.009566f, -0.004241f, 0.001971f, -0.035962f, -0.021595f, -0.004559f, -0.003591f, -0.006743f, 0.022964f, 0.010169f, 0.001705f, 0.013894f, 0.023655f, -0.014286f, -0.005781f, -0.019541f, 0.009173f, -0.015334f, 0.013406f, 0.015312f, 0.018423f, 0.033257f, 0.009604f, -0.024756f, -0.003831f, + 0.055631f, 0.018301f, 0.031349f, 0.015274f, 0.009635f, -0.001907f, 0.003956f, -0.012888f, -0.016613f, 0.007816f, 0.005698f, -0.016415f, 0.004601f, 0.011896f, 0.010699f, -0.015746f, 0.012695f, 0.004528f, 0.009197f, 0.010742f, 0.000094f, 0.005328f, 0.008897f, 0.003866f, 0.010416f, -0.000757f, 0.002384f, -0.002948f, -0.006756f, 0.001778f, 0.009116f, 0.001621f, -0.003726f, 0.014718f, 0.009380f, 0.008150f, 0.000493f, -0.001442f, -0.002194f, -0.000071f, 0.000669f, -0.002040f, 0.005244f, 0.004269f, 0.004168f, 0.004706f, 0.002400f, -0.007363f, 0.038151f, 0.041809f, -0.042148f, 0.010368f, 0.030970f, 0.018726f, -0.011736f, -0.022408f, -0.019388f, 0.043577f, 0.003596f, 0.016419f, 0.022863f, -0.012969f, 0.006469f, 0.009598f, -0.026626f, -0.028281f, 0.023041f, 0.007865f, -0.041212f, -0.009477f, 0.053619f, 0.025742f, -0.000088f, -0.030536f, 0.010049f, 0.008084f, 0.032610f, 0.010816f, -0.015878f, 0.021376f, 0.003789f, -0.008935f, -0.003086f, -0.006408f, -0.025416f, -0.011976f, 0.003905f, 0.004434f, -0.030344f, -0.032714f, -0.019384f, -0.009353f, -0.036040f, 0.021472f, -0.002250f, -0.025551f, + 0.004884f, 0.000663f, -0.011106f, -0.003046f, 0.007739f, -0.000148f, 0.008145f, 0.009514f, 0.014523f, -0.014191f, -0.016915f, 0.022409f, 0.045307f, 0.020580f, 0.012369f, 0.033116f, -0.006207f, 0.018077f, 0.044033f, 0.027000f, 0.004139f, 0.004989f, -0.013781f, -0.026885f, 0.026190f, -0.025606f, 0.011526f, -0.010212f, 0.008000f, -0.033540f, 0.016109f, -0.000365f, -0.011006f, -0.006266f, 0.019091f, -0.018049f, -0.009138f, -0.004620f, 0.002890f, -0.000368f, 0.005638f, -0.007117f, -0.000926f, -0.012870f, -0.003298f, -0.000688f, 0.002362f, -0.003810f, 0.004462f, -0.004785f, 0.003867f, -0.004277f, 0.014638f, 0.004652f, -0.003784f, -0.006742f, 0.005532f, 0.000684f, 0.005073f, 0.004674f, -0.003515f, 0.004217f, 0.005384f, -0.003543f, 0.001406f, 0.006736f, -0.002023f, 0.002432f, 0.007326f, 0.007785f, 0.013394f, -0.008605f, -0.039558f, 0.011099f, -0.019073f, -0.008799f, -0.014743f, -0.002490f, 0.033859f, 0.033532f, -0.067852f, 0.020986f, 0.021531f, -0.021087f, -0.034521f, -0.045016f, 0.007937f, -0.013235f, 0.008329f, -0.015723f, -0.012360f, -0.007323f, 0.041997f, 0.010619f, -0.003661f, -0.000742f, + -0.006694f, -0.012576f, 0.010620f, 0.006964f, -0.000200f, 0.016825f, 0.003659f, -0.003580f, 0.005999f, 0.015266f, 0.043343f, 0.004331f, 0.005333f, -0.021449f, -0.009173f, -0.010171f, -0.010788f, -0.001345f, -0.003614f, 0.014324f, 0.020732f, 0.000949f, 0.023952f, -0.005602f, -0.004056f, -0.004948f, -0.002675f, -0.042056f, 0.047381f, 0.001181f, 0.003352f, -0.003529f, -0.012324f, 0.012534f, -0.003254f, 0.019194f, 0.001085f, -0.018442f, 0.004975f, 0.020351f, -0.014514f, 0.018896f, 0.004602f, -0.029023f, -0.004953f, -0.006245f, -0.052708f, -0.018044f, 0.013472f, 0.013569f, -0.021539f, -0.012431f, 0.012578f, 0.001704f, 0.035223f, -0.028113f, 0.012783f, 0.015680f, -0.002281f, 0.013707f, 0.012771f, 0.015543f, 0.006001f, 0.006892f, 0.006303f, 0.005120f, -0.002346f, -0.002923f, -0.009098f, 0.003579f, 0.013164f, 0.002294f, -0.009659f, -0.003810f, -0.005458f, 0.003068f, -0.004232f, -0.003635f, -0.006434f, 0.008469f, 0.004835f, 0.005757f, 0.000622f, -0.015398f, 0.006126f, -0.015650f, 0.001195f, 0.002430f, 0.005500f, -0.007460f, -0.003569f, -0.002379f, 0.005047f, 0.009266f, 0.004221f, 0.003864f, + 0.001311f, -0.011055f, 0.034452f, 0.009851f, 0.010544f, -0.025426f, 0.018774f, -0.010243f, 0.017882f, -0.014250f, 0.023092f, -0.021242f, -0.017349f, 0.031785f, 0.003853f, 0.008041f, -0.019127f, -0.042626f, -0.004201f, 0.012303f, 0.003167f, 0.018120f, -0.015322f, 0.002239f, -0.000352f, -0.031858f, -0.023027f, 0.010390f, -0.036000f, -0.023606f, 0.011278f, 0.000036f, -0.037640f, -0.005475f, -0.018838f, 0.023775f, 0.014166f, 0.004198f, -0.008907f, -0.023592f, -0.050067f, 0.017485f, -0.022526f, 0.027198f, -0.008418f, -0.009240f, -0.004803f, -0.013354f, 0.007414f, 0.007038f, -0.040068f, -0.017719f, 0.039079f, 0.034223f, -0.035652f, 0.045966f, 0.002194f, 0.033816f, -0.008323f, -0.008262f, -0.004470f, -0.013511f, 0.017440f, -0.013318f, -0.037404f, -0.019884f, 0.044018f, -0.010026f, -0.009086f, -0.002599f, 0.013500f, 0.008645f, 0.022140f, -0.050928f, 0.014793f, 0.034453f, 0.027057f, -0.011269f, -0.003047f, -0.011096f, -0.023197f, 0.002450f, 0.020911f, 0.032621f, -0.020328f, -0.020542f, -0.023280f, -0.002507f, -0.003972f, 0.001984f, -0.011275f, 0.005567f, 0.005566f, -0.004079f, -0.001826f, -0.005125f, + -0.010289f, 0.009656f, 0.000005f, 0.001309f, -0.015516f, -0.013077f, -0.003643f, -0.016904f, -0.006718f, -0.008576f, 0.001657f, -0.006132f, -0.000191f, 0.012675f, -0.005433f, 0.005167f, -0.000397f, -0.012217f, 0.002132f, -0.006267f, -0.001789f, 0.004961f, 0.011062f, 0.001386f, 0.004503f, 0.010337f, 0.010253f, 0.013698f, -0.004656f, -0.004002f, -0.002772f, 0.014048f, -0.002460f, -0.023276f, -0.001556f, 0.023827f, 0.018487f, -0.018025f, -0.030698f, -0.025756f, -0.015138f, -0.029845f, -0.001683f, 0.014093f, 0.032714f, -0.005689f, -0.001588f, -0.054818f, 0.032797f, 0.040852f, -0.006508f, -0.022243f, -0.022610f, -0.014013f, 0.061494f, -0.037486f, -0.000163f, -0.004442f, 0.016575f, -0.002776f, 0.070843f, 0.001710f, -0.038608f, -0.010172f, -0.036694f, 0.047831f, 0.041567f, -0.033593f, 0.039098f, 0.009791f, 0.031465f, 0.011773f, -0.059208f, 0.018549f, 0.031612f, -0.040990f, -0.011417f, -0.046508f, -0.023287f, 0.001608f, -0.042890f, -0.036555f, -0.001096f, -0.029615f, -0.000471f, 0.010416f, -0.010660f, -0.029372f, 0.024062f, 0.021874f, -0.048427f, -0.036960f, 0.020159f, 0.008541f, 0.012933f, 0.024536f, + 0.031976f, -0.011772f, -0.017456f, -0.000977f, -0.011339f, -0.000591f, -0.003662f, -0.016202f, 0.006373f, -0.067119f, 0.022810f, 0.032690f, -0.034706f, -0.028505f, 0.021586f, -0.021817f, -0.019879f, -0.009406f, 0.012046f, 0.001755f, 0.041596f, 0.000372f, 0.024273f, -0.002339f, -0.017046f, 0.009100f, 0.012498f, 0.013104f, -0.011024f, 0.000351f, 0.001279f, -0.001461f, -0.007102f, -0.016551f, 0.010911f, 0.017584f, -0.009032f, -0.029180f, 0.007392f, 0.002603f, 0.030950f, -0.002889f, -0.012183f, 0.009672f, 0.003397f, 0.015597f, -0.000070f, -0.009361f, 0.000178f, 0.012747f, 0.009376f, 0.003258f, -0.003382f, 0.002499f, -0.005817f, -0.004742f, -0.014609f, 0.007418f, 0.006924f, -0.009839f, 0.004770f, 0.004518f, 0.002628f, -0.001558f, -0.004943f, 0.001404f, -0.014007f, 0.015611f, 0.037881f, 0.070725f, 0.111310f, 0.003843f, -0.044273f, -0.057148f, -0.013025f, 0.002793f, -0.013265f, 0.054310f, 0.040835f, 0.028414f, 0.047249f, 0.034540f, 0.027993f, 0.002359f, 0.022645f, -0.028300f, 0.040984f, 0.047358f, 0.003648f, 0.049252f, -0.019608f, 0.004511f, 0.011769f, -0.044956f, -0.030107f, -0.010263f, + -0.026585f, -0.031352f, -0.004263f, 0.050617f, -0.000219f, -0.009136f, 0.006700f, 0.011240f, -0.006332f, -0.067383f, -0.008850f, 0.018309f, -0.009568f, -0.020265f, 0.008837f, 0.026819f, 0.047088f, 0.012059f, 0.024225f, 0.033565f, 0.041111f, -0.055590f, -0.038496f, 0.022655f, -0.015874f, 0.072012f, -0.006964f, 0.062002f, -0.049080f, 0.029885f, 0.050526f, 0.002487f, 0.008609f, 0.030629f, -0.053695f, -0.024575f, 0.001892f, 0.031536f, 0.001356f, 0.036214f, 0.014927f, 0.013999f, 0.036775f, 0.013719f, -0.004325f, -0.014664f, -0.042392f, -0.009300f, 0.002981f, 0.012009f, 0.001356f, 0.001577f, 0.001452f, -0.022741f, 0.012661f, 0.008808f, 0.020757f, -0.006329f, 0.015737f, 0.025567f, 0.015301f, 0.006959f, 0.000415f, -0.002323f, 0.005752f, -0.007965f, 0.005600f, -0.007583f, 0.000748f, 0.005791f, 0.005573f, -0.006628f, 0.011687f, 0.011506f, 0.014113f, 0.002188f, 0.001577f, 0.006360f, -0.004392f, 0.009947f, -0.006434f, 0.010040f, 0.022005f, -0.001951f, -0.003640f, 0.002312f, 0.019196f, -0.010843f, 0.004893f, -0.001576f, -0.002292f, -0.002894f, 0.003052f, 0.005818f, 0.008902f, 0.007054f, + 0.006904f, 0.017992f, -0.011733f, 0.021226f, -0.009554f, 0.079981f, 0.027006f, 0.028464f, 0.058470f, -0.003674f, 0.012847f, 0.025783f, 0.037770f, -0.040800f, -0.032616f, -0.013529f, -0.035830f, -0.005803f, -0.048337f, 0.025733f, 0.039622f, 0.029105f, 0.039353f, -0.025546f, -0.013932f, 0.030552f, 0.023856f, -0.015794f, 0.039904f, 0.024220f, -0.008468f, -0.047527f, 0.027313f, 0.029846f, -0.023885f, -0.003081f, 0.014624f, 0.007489f, -0.038209f, 0.045257f, 0.012536f, 0.048538f, 0.026790f, 0.019348f, -0.025476f, 0.022926f, -0.013247f, 0.073680f, -0.057023f, 0.006840f, 0.022699f, -0.010426f, -0.036587f, 0.024266f, 0.023930f, -0.004064f, 0.023558f, -0.021801f, 0.060291f, -0.027150f, 0.016370f, 0.013463f, -0.037223f, -0.015949f, -0.051642f, 0.022715f, 0.015972f, -0.038436f, 0.036981f, 0.031524f, -0.026255f, 0.022731f, -0.002229f, 0.060964f, 0.020450f, -0.029838f, -0.021516f, -0.021246f, 0.019742f, -0.012209f, 0.016936f, -0.007327f, 0.004271f, 0.020661f, 0.013503f, 0.010496f, -0.019220f, 0.052400f, 0.006472f, -0.019828f, -0.028872f, 0.025480f, 0.013228f, 0.024058f, -0.012841f, 0.007261f, + 0.019569f, 0.039560f, 0.010717f, -0.006194f, 0.033427f, -0.008567f, -0.008739f, -0.004388f, 0.003944f, 0.009055f, -0.018797f, -0.016929f, 0.008181f, -0.014621f, -0.008284f, 0.002035f, -0.006374f, -0.001897f, -0.001775f, -0.014388f, 0.010890f, 0.005966f, -0.027372f, 0.006871f, -0.020271f, -0.013000f, -0.005940f, 0.010388f, 0.006262f, 0.019415f, 0.009236f, -0.000550f, 0.006250f, 0.007135f, 0.009019f, 0.000744f, 0.003084f, 0.004432f, 0.017231f, -0.005401f, -0.070886f, 0.030895f, -0.060537f, 0.061667f, 0.074182f, -0.004470f, 0.012587f, -0.061204f, -0.001017f, -0.014053f, 0.005740f, 0.034795f, 0.035678f, -0.011195f, 0.018288f, 0.028852f, 0.004210f, 0.011836f, 0.008030f, 0.011683f, -0.008121f, 0.042306f, -0.006408f, 0.009259f, -0.024294f, 0.047687f, 0.009998f, -0.004950f, -0.002008f, 0.042897f, 0.016175f, 0.020045f, 0.047478f, -0.011065f, -0.030001f, 0.058427f, -0.062897f, -0.027348f, -0.011233f, 0.013522f, 0.040985f, 0.009307f, -0.017383f, -0.017774f, -0.030562f, -0.000905f, -0.005880f, 0.011762f, 0.065965f, 0.064232f, 0.040605f, 0.057945f, -0.005652f, 0.087375f, -0.029601f, 0.024257f, + -0.021110f, 0.001943f, 0.027247f, -0.013597f, 0.002957f, -0.026379f, -0.034183f, 0.000508f, -0.021569f, 0.017850f, -0.029202f, 0.043215f, -0.032763f, -0.052423f, -0.021902f, -0.013465f, -0.004955f, 0.063045f, -0.038282f, -0.008779f, -0.005586f, -0.039574f, -0.010191f, 0.023070f, 0.049374f, -0.004345f, -0.002346f, 0.001949f, -0.016439f, -0.033981f, 0.001201f, -0.001437f, -0.005360f, -0.003482f, -0.000170f, -0.019595f, 0.015654f, -0.016761f, 0.019382f, -0.007689f, -0.015161f, -0.016372f, 0.003885f, 0.015639f, -0.011115f, -0.013998f, -0.005137f, 0.012997f, 0.014122f, -0.010213f, 0.006552f, 0.008723f, 0.004940f, 0.008706f, -0.008317f, -0.007237f, 0.003851f, 0.000994f, 0.008850f, -0.010933f, 0.007764f, 0.014468f, -0.000766f, -0.004528f, -0.007504f, 0.012707f, -0.025572f, -0.011823f, 0.025018f, -0.015020f, -0.001891f, -0.003810f, 0.004756f, -0.015421f, 0.011220f, -0.004768f, 0.023060f, 0.019995f, 0.000329f, -0.024842f, 0.109064f, 0.151431f, 0.046435f, 0.118050f, -0.025845f, -0.082081f, -0.057534f, -0.040204f, 0.019913f, 0.021723f, -0.027374f, -0.044076f, 0.038201f, 0.051404f, 0.030013f, 0.051286f, + 0.039531f, 0.009784f, 0.015717f, 0.007767f, -0.002587f, -0.033710f, 0.014865f, -0.039950f, 0.028146f, 0.000280f, -0.037440f, 0.043394f, 0.026205f, 0.020769f, 0.074879f, 0.046062f, -0.021517f, -0.014445f, -0.027007f, -0.031946f, -0.039184f, -0.015431f, 0.001500f, -0.030945f, -0.009658f, 0.064730f, 0.098113f, 0.072328f, 0.009845f, 0.049365f, 0.052589f, 0.080495f, 0.036801f, -0.042645f, -0.070089f, -0.043669f, -0.044746f, 0.026450f, 0.022150f, -0.095731f, -0.065725f, -0.016901f, 0.040301f, 0.087125f, -0.065315f, -0.002579f, -0.056700f, -0.007355f, 0.071147f, -0.039199f, 0.026764f, -0.056865f, -0.009349f, -0.016994f, 0.047951f, -0.053306f, -0.030456f, 0.000860f, 0.021125f, -0.043282f, 0.099286f, -0.023418f, -0.001645f, 0.056484f, -0.024918f, 0.042456f, -0.013643f, -0.035118f, -0.027376f, 0.016471f, 0.001520f, 0.014033f, 0.008699f, -0.031371f, 0.000745f, -0.013281f, 0.037936f, 0.022215f, 0.006588f, 0.020723f, 0.023578f, 0.001237f, -0.000448f, -0.007628f, -0.023887f, 0.048420f, -0.015168f, 0.010062f, 0.000221f, -0.028241f, 0.000954f, 0.002948f, -0.009067f, -0.018629f, -0.004217f, -0.011009f, + 0.002476f, 0.007053f, -0.008461f, 0.001461f, 0.032849f, 0.023409f, -0.004494f, -0.005529f, 0.031094f, -0.013352f, -0.004225f, -0.026714f, -0.038390f, -0.014567f, -0.010356f, -0.004543f, -0.010755f, -0.043290f, -0.083644f, 0.009779f, 0.046028f, -0.038964f, 0.071514f, -0.029075f, 0.028241f, -0.009996f, -0.083336f, -0.042956f, -0.004331f, -0.049289f, -0.112375f, -0.031891f, 0.040147f, 0.061720f, -0.030635f, -0.048460f, -0.100287f, -0.030217f, 0.029254f, -0.020378f, -0.029247f, -0.050198f, 0.011545f, -0.011736f, -0.008670f, -0.009850f, 0.019972f, 0.039652f, -0.031489f, 0.030528f, 0.026255f, -0.032124f, -0.091493f, 0.006923f, 0.007189f, 0.023022f, 0.010819f, 0.059174f, 0.005849f, -0.091296f, 0.000427f, -0.100492f, -0.000624f, 0.034126f, 0.041685f, -0.008323f, 0.005397f, 0.045859f, -0.024426f, -0.018285f, -0.031428f, 0.029465f, 0.021756f, -0.014997f, 0.035724f, -0.011793f, 0.014983f, 0.016063f, 0.058559f, 0.007190f, -0.020921f, -0.063437f, -0.021725f, 0.031936f, 0.028197f, 0.049206f, 0.072575f, 0.125095f, 0.062532f, 0.029576f, -0.032832f, -0.126970f, -0.034690f, -0.018931f, 0.096491f, -0.016937f, + 0.005945f, -0.001140f, -0.030532f, 0.003409f, 0.028254f, 0.012766f, -0.000724f, 0.000619f, 0.000474f, -0.000604f, 0.046785f, -0.017701f, -0.013985f, -0.016346f, 0.032455f, 0.011616f, 0.016415f, -0.013613f, -0.039946f, 0.012316f, 0.016888f, -0.019049f, -0.002678f, 0.009284f, -0.002282f, 0.002207f, -0.007068f, -0.058340f, -0.018804f, -0.005534f, 0.026394f, 0.040379f, 0.004969f, -0.035319f, -0.033460f, 0.014368f, 0.005656f, -0.004144f, -0.005591f, 0.000893f, -0.003453f, -0.002713f, 0.030812f, -0.034785f, 0.004430f, -0.030059f, 0.030855f, -0.017943f, 0.000837f, -0.042856f, -0.006351f, 0.027038f, -0.008560f, 0.014047f, -0.023764f, 0.006600f, -0.081541f, -0.024918f, 0.056450f, -0.028011f, -0.023546f, -0.006158f, -0.018429f, -0.065376f, -0.072725f, -0.106256f, -0.033685f, 0.000095f, -0.008397f, 0.069371f, 0.018933f, 0.090645f, 0.055799f, 0.028005f, -0.012868f, -0.033627f, -0.006448f, 0.127171f, 0.007703f, 0.036593f, 0.020473f, -0.016061f, 0.063203f, -0.026538f, 0.050973f, -0.055969f, -0.005767f, -0.040353f, 0.047953f, -0.067934f, -0.014510f, 0.020666f, 0.021151f, 0.021711f, -0.059528f, 0.042138f, + -0.068104f, 0.013727f, -0.033481f, -0.022838f, 0.067326f, 0.003937f, 0.004214f, 0.023197f, -0.025870f, -0.001563f, 0.017425f, -0.082433f, 0.001991f, 0.018955f, -0.012219f, 0.053028f, -0.023985f, -0.010424f, 0.089036f, -0.033857f, -0.074520f, 0.000155f, -0.028298f, 0.005978f, -0.005870f, -0.003939f, -0.059868f, 0.031844f, -0.009960f, -0.081345f, 0.048695f, -0.100739f, 0.019301f, -0.023111f, -0.040138f, -0.063685f, -0.008471f, 0.017208f, 0.029022f, 0.002584f, 0.023447f, 0.029358f, -0.035032f, 0.061345f, -0.014471f, 0.016387f, -0.001097f, 0.029272f, -0.001616f, -0.003325f, -0.010257f, 0.017304f, -0.036955f, -0.004750f, 0.011711f, 0.007918f, -0.014547f, -0.000253f, -0.016252f, -0.021254f, 0.010634f, 0.008675f, 0.015845f, 0.010324f, -0.004937f, 0.012447f, 0.036181f, -0.018074f, -0.019295f, 0.006340f, -0.002094f, 0.007118f, 0.026749f, -0.003898f, 0.014431f, 0.013758f, 0.013664f, -0.018408f, -0.022353f, -0.005483f, -0.002098f, -0.023123f, -0.001644f, -0.004610f, 0.009438f, -0.025257f, 0.007226f, -0.035250f, -0.124304f, -0.127739f, -0.109051f, -0.054984f, 0.225378f, 0.070572f, -0.028198f, -0.029432f, + -0.111598f, -0.236249f, -0.026702f, 0.063381f, 0.079106f, 0.033935f, -0.036458f, -0.027314f, -0.069745f, -0.076792f, 0.057508f, -0.055369f, 0.141988f, 0.106417f, -0.165964f, 0.053441f, 0.021583f, -0.034941f, 0.012676f, 0.118821f, 0.016819f, 0.081896f, 0.162707f, -0.035717f, -0.134042f, 0.006025f, -0.023072f, -0.124957f, -0.034271f, 0.059978f, -0.005763f, 0.073886f, 0.119515f, 0.010424f, -0.104142f, -0.203613f, -0.174875f, -0.156344f, -0.016703f, 0.150926f, 0.042801f, 0.040055f, 0.022427f, -0.041409f, -0.204126f, -0.127825f, -0.065605f, -0.025162f, 0.012184f, 0.045751f, 0.044426f, 0.057170f, 0.058591f, 0.072924f, -0.088135f, -0.031938f, -0.072227f, -0.006428f, -0.078970f, 0.048600f, 0.048557f, 0.099868f, 0.110957f, 0.052831f, 0.001391f, -0.029986f, -0.020832f, -0.137472f, -0.109458f, 0.095551f, 0.149704f, 0.101832f, 0.119574f, -0.029152f, -0.053789f, -0.108854f, -0.062035f, 0.031733f, 0.000016f, 0.007092f, 0.033471f, 0.010986f, 0.008287f, -0.026635f, -0.035114f, -0.017598f, -0.026575f, 0.000644f, 0.026230f, 0.007179f, 0.010041f, -0.006358f, 0.015221f, -0.029018f, 0.019026f, -0.008884f, + -0.026876f, -0.026472f, -0.008120f, -0.043818f, -0.013605f, -0.026897f, 0.027388f, 0.030873f, 0.014866f, 0.011785f, -0.028568f, -0.058433f, -0.057789f, 0.015058f, -0.005617f, 0.025931f, 0.022823f, 0.012044f, -0.042164f, -0.021570f, -0.040155f, -0.061810f, 0.018293f, 0.042728f, -0.016524f, -0.226811f, -0.253925f, -0.172748f, -0.177688f, -0.047666f, 0.198477f, 0.133598f, 0.214166f, 0.238583f, 0.362532f, 0.240684f, 0.249076f, 0.160618f, -0.012691f, -0.179658f, -0.310446f, -0.366586f, -0.318307f, -0.251108f, -0.181837f, -0.044220f, -0.009637f, -0.026552f, 0.008794f, 0.078524f, 0.129436f, 0.179843f, 0.156214f, 0.213212f, 0.205830f, 0.266247f, 0.243377f, 0.068187f, 0.163206f, -0.035826f, 0.044302f, 0.032683f, 0.008786f, -0.022949f, -0.238114f, -0.285569f, -0.365186f, -0.428101f, -0.389447f, -0.216485f, -0.192638f, -0.158356f, -0.198510f, -0.229421f, -0.049623f, 0.055770f, 0.143328f, 0.210521f, 0.304611f, 0.364287f, 0.467479f, 0.617345f, 0.599182f, 0.455223f, 0.368984f, 0.307287f, 0.162096f, 0.258016f, -0.105338f, -0.210895f, -0.504688f, -0.577491f, -0.718246f, -0.689687f, -0.631185f, -0.597784f, + -0.577846f, -0.355669f, -0.220874f, -0.120086f, 0.321649f, 0.328123f, 0.501281f, 0.644527f, 0.558311f, 0.504751f, 0.510096f, 0.401110f, 0.305293f, 0.167904f, 0.021406f, -0.002726f, -0.095402f, -0.115352f, -0.167769f, -0.216601f, -0.298028f, -0.321519f, -0.293372f, -0.337408f, -0.261499f, -0.239500f, -0.226790f, -0.198609f, -0.103268f, -0.020458f, 0.104655f, 0.217388f, 0.203219f, 0.317900f, 0.350543f, 0.387434f, 0.456530f, 0.369958f, 0.215082f, 0.107703f, -0.066644f, -0.168663f, -0.169670f, -0.326170f, -0.303126f, -0.413731f, -0.330464f, -0.342958f, -0.221335f, -0.230397f, -0.135825f, -0.017401f, 0.115086f, 0.174568f, 0.306778f, 0.358350f, 0.346615f, 0.337822f, 0.327954f, 0.252898f, 0.088927f, -0.058198f, -0.084830f, -0.109163f, -0.121794f, -0.136902f, -0.163123f, -0.150598f, -0.112571f, -0.120995f, -0.110585f, -0.095146f, -0.069474f, -0.030835f, -0.022092f, -0.015661f, 0.003355f, 0.020054f, 0.012604f, 0.018728f, 0.047881f, 0.057591f, 0.051324f, 0.034162f, 0.023304f, 0.017519f, 0.016969f} + }, + { + {0.024972f, 0.002931f, -0.010883f, 0.003851f, -0.006848f, 0.001910f, -0.004429f, -0.002761f, -0.005952f, 0.004374f, 0.007482f, 0.002236f, 0.002394f, -0.013486f, 0.002761f, 0.000334f, 0.004320f, 0.005279f, 0.002938f, 0.007899f, -0.001552f, -0.004266f, 0.000919f, 0.009422f, 0.000154f, -0.007043f, -0.000623f, 0.008038f, 0.004409f, 0.000957f, 0.000175f, 0.002337f, -0.000105f, 0.000710f, 0.001635f, -0.000148f, -0.002735f, -0.000230f, 0.000170f, 0.003223f, -0.004548f, -0.010827f, 0.008171f, 0.008166f, 0.007146f, 0.006705f, -0.000237f, 0.003708f, 0.006405f, -0.006522f, -0.001387f, -0.000065f, -0.008715f, 0.002102f, 0.000756f, 0.008096f, 0.000938f, 0.004587f, 0.000246f, 0.010153f, 0.005212f, -0.001360f, 0.007170f, 0.004379f, -0.002175f, -0.008091f, 0.002168f, 0.002252f, -0.002050f, 0.000726f, -0.004541f, -0.001108f, 0.004314f, 0.003036f, 0.003606f, 0.008393f, -0.001254f, -0.002499f, 0.001253f, 0.005037f, 0.011492f, -0.006573f, 0.003155f, 0.003186f, 0.003437f, -0.000230f, -0.000639f, 0.003625f, -0.001835f, 0.000207f, 0.001793f, -0.002029f, -0.000243f, 0.000434f, 0.000724f, -0.001286f, + -0.001981f, 0.001440f, -0.000387f, 0.000372f, -0.000642f, 0.002190f, -0.000133f, 0.002585f, -0.000459f, 0.021112f, -0.014079f, 0.004774f, 0.011894f, 0.002793f, 0.008390f, 0.010151f, -0.009188f, 0.001950f, -0.000818f, 0.003958f, -0.011654f, -0.009258f, -0.001703f, 0.009093f, 0.012335f, -0.004707f, -0.004049f, 0.005911f, -0.009966f, -0.013357f, -0.002439f, -0.015711f, 0.005412f, 0.005222f, 0.001454f, -0.009761f, -0.009906f, 0.003537f, -0.005753f, 0.001346f, -0.000262f, 0.010360f, 0.010967f, 0.009876f, -0.001574f, 0.006920f, -0.010788f, 0.004708f, -0.006348f, -0.000589f, 0.000606f, 0.008449f, -0.009092f, -0.008109f, 0.000095f, 0.011113f, 0.004617f, 0.004337f, -0.006700f, 0.003759f, 0.002789f, -0.003286f, -0.013862f, -0.002263f, -0.004680f, -0.006116f, -0.005463f, 0.006360f, -0.005813f, -0.001903f, 0.001483f, 0.003943f, 0.010014f, -0.003840f, -0.000200f, -0.007544f, -0.003610f, 0.001543f, -0.010391f, -0.000664f, 0.002888f, 0.007116f, -0.002225f, -0.005428f, -0.002691f, -0.010880f, 0.005185f, 0.003163f, 0.000675f, -0.000908f, -0.009339f, 0.003840f, 0.000825f, -0.003369f, 0.003463f, -0.001362f, + 0.000882f, 0.003086f, 0.000360f, 0.000618f, 0.003674f, 0.001587f, 0.000803f, 0.000068f, 0.002959f, 0.001041f, -0.000490f, 0.001168f, 0.001761f, -0.007454f, -0.013502f, -0.003372f, 0.002316f, -0.004170f, -0.006838f, -0.003794f, -0.013460f, -0.007585f, 0.014212f, -0.000580f, -0.006312f, 0.007530f, -0.011400f, -0.002620f, -0.014217f, -0.002964f, -0.011206f, -0.005866f, 0.013144f, 0.000679f, -0.002689f, -0.014853f, -0.009268f, -0.003361f, -0.006371f, 0.002500f, -0.007914f, 0.000762f, 0.004904f, 0.015723f, 0.007707f, 0.005890f, 0.006803f, 0.012726f, -0.010713f, -0.000136f, -0.003216f, -0.008262f, 0.003397f, -0.001698f, -0.003222f, -0.008647f, 0.004496f, 0.009069f, 0.000945f, -0.006604f, -0.004232f, 0.023231f, 0.000094f, -0.006687f, -0.009306f, -0.013944f, -0.018575f, -0.002326f, -0.009633f, 0.002223f, -0.001889f, 0.005182f, 0.000963f, 0.002503f, -0.008536f, 0.001270f, 0.001394f, 0.011240f, 0.003799f, -0.008418f, 0.000471f, -0.002622f, -0.002500f, -0.002011f, 0.004019f, 0.006025f, 0.005904f, -0.005514f, -0.005366f, 0.003380f, 0.001606f, 0.002210f, 0.002432f, -0.002147f, -0.008238f, -0.009676f, + -0.001144f, 0.001743f, -0.002309f, 0.001005f, 0.000067f, -0.001315f, -0.002040f, -0.003034f, -0.001178f, -0.000584f, -0.001822f, -0.003371f, 0.000286f, 0.001097f, -0.001823f, 0.000639f, -0.001604f, 0.000317f, -0.002007f, -0.001007f, 0.000396f, 0.000527f, -0.002419f, 0.000359f, -0.000921f, -0.004349f, 0.000451f, -0.001530f, 0.002442f, -0.032469f, 0.012862f, -0.005802f, 0.005441f, -0.013433f, -0.005403f, -0.010516f, -0.009615f, 0.000661f, -0.003021f, -0.006587f, 0.016554f, 0.004295f, -0.001524f, -0.010028f, -0.003163f, 0.004660f, -0.011483f, -0.006079f, -0.010936f, -0.006086f, 0.015823f, 0.001547f, 0.010554f, -0.001002f, -0.000097f, -0.002649f, 0.002998f, 0.002929f, -0.008380f, 0.000111f, 0.002521f, 0.004737f, 0.017167f, -0.008963f, -0.010392f, -0.002050f, 0.018987f, 0.005981f, 0.020206f, 0.001795f, 0.001865f, -0.003562f, 0.009982f, -0.001724f, 0.014715f, -0.001486f, -0.001710f, -0.002635f, -0.006120f, 0.006264f, 0.001899f, -0.005238f, 0.004278f, 0.005554f, 0.010215f, -0.005891f, -0.000517f, -0.001819f, 0.009097f, -0.003704f, -0.001535f, -0.003410f, -0.002330f, 0.002206f, -0.002982f, 0.001074f, + 0.001534f, -0.002206f, 0.002249f, -0.015053f, 0.001441f, 0.009812f, 0.003433f, 0.013136f, 0.001061f, 0.001413f, 0.003155f, 0.008378f, 0.013379f, -0.008832f, 0.001280f, -0.000675f, 0.003155f, -0.000396f, -0.000340f, 0.004035f, 0.008672f, 0.003364f, 0.004251f, 0.000494f, -0.001514f, -0.002233f, 0.001170f, 0.004427f, -0.001549f, 0.002029f, 0.002002f, 0.002113f, -0.000091f, 0.000933f, 0.003682f, -0.000612f, 0.000963f, -0.000105f, 0.004249f, 0.002519f, -0.001390f, -0.000212f, 0.004571f, 0.002385f, -0.001386f, 0.003408f, 0.001861f, -0.006951f, -0.003430f, -0.000148f, -0.016054f, -0.002683f, 0.000151f, -0.007991f, -0.028413f, -0.006890f, -0.006127f, -0.012382f, -0.002416f, -0.003185f, 0.017793f, -0.006173f, 0.013457f, 0.006303f, 0.009707f, -0.018270f, -0.008208f, -0.018462f, -0.017151f, -0.000015f, 0.003229f, 0.010740f, -0.005179f, -0.008072f, -0.004961f, -0.012487f, 0.002673f, 0.005680f, 0.006538f, 0.004023f, -0.003783f, 0.004649f, -0.008329f, 0.000895f, -0.015025f, 0.005422f, -0.003873f, 0.002053f, 0.003314f, 0.005609f, 0.005994f, -0.005748f, 0.000229f, 0.014549f, -0.007798f, 0.007048f, + 0.007407f, -0.000491f, 0.004437f, 0.007153f, -0.002952f, 0.002812f, 0.007058f, 0.000378f, 0.012444f, -0.006525f, -0.008609f, -0.004178f, 0.004071f, -0.000046f, -0.016536f, -0.008403f, -0.018321f, -0.019958f, -0.003396f, 0.005384f, -0.016253f, 0.007235f, -0.002638f, -0.000301f, -0.005564f, 0.005432f, -0.009669f, -0.001562f, -0.003378f, -0.013664f, -0.012031f, -0.004002f, 0.007148f, 0.000215f, 0.006130f, -0.002595f, 0.003968f, 0.003158f, -0.007552f, 0.000026f, -0.001496f, 0.004256f, -0.005091f, -0.008538f, -0.002785f, 0.001143f, -0.000006f, -0.003298f, 0.001451f, -0.002053f, -0.000774f, 0.001341f, -0.000453f, 0.000078f, -0.000175f, -0.001954f, -0.000423f, -0.001897f, -0.001258f, -0.001232f, -0.000043f, 0.000861f, 0.000104f, 0.002406f, 0.000932f, -0.001190f, 0.009174f, -0.026446f, -0.001275f, 0.008217f, 0.005186f, -0.014037f, -0.001709f, -0.008932f, 0.002299f, 0.002682f, 0.001920f, -0.015331f, -0.020522f, -0.013990f, 0.002404f, -0.011184f, 0.012242f, 0.003873f, -0.019759f, 0.014278f, 0.012523f, 0.009905f, 0.008876f, -0.009822f, 0.016099f, 0.004249f, -0.000115f, -0.006265f, 0.005445f, 0.009643f, + -0.008831f, -0.012980f, 0.004811f, -0.004898f, -0.016076f, -0.002149f, -0.015512f, -0.005660f, 0.028123f, -0.007501f, -0.012622f, -0.015670f, 0.000889f, 0.002561f, 0.011199f, 0.004454f, -0.010279f, 0.009365f, -0.001180f, -0.008089f, -0.010687f, -0.011370f, 0.017338f, 0.007749f, 0.010933f, -0.008253f, -0.011277f, 0.005098f, 0.002821f, -0.011628f, -0.000570f, -0.007131f, 0.011216f, -0.002162f, 0.001017f, -0.013741f, 0.008792f, 0.007342f, -0.007797f, -0.005034f, -0.004832f, 0.015549f, 0.000205f, 0.002280f, -0.004475f, 0.010654f, -0.010867f, -0.018516f, -0.008243f, 0.001600f, -0.003529f, 0.010080f, -0.002056f, -0.001173f, -0.010775f, -0.005708f, 0.004691f, 0.000605f, -0.007664f, -0.005032f, 0.006572f, 0.003520f, -0.002068f, 0.000268f, 0.000113f, -0.000020f, -0.002100f, 0.002824f, 0.001278f, 0.004401f, 0.000718f, 0.000744f, 0.000171f, 0.001890f, -0.000891f, 0.002739f, -0.003616f, 0.003763f, -0.014200f, -0.000624f, 0.003497f, -0.003567f, -0.011353f, -0.016845f, -0.013498f, 0.013573f, 0.001572f, 0.016641f, 0.019871f, 0.019293f, 0.002918f, 0.026486f, 0.006352f, -0.002953f, 0.012248f, 0.009345f, + 0.024481f, 0.003521f, 0.014075f, -0.019332f, 0.031805f, 0.023393f, 0.011311f, -0.009663f, -0.007656f, 0.011484f, 0.002655f, 0.008237f, -0.004726f, 0.013710f, -0.004092f, -0.003568f, 0.012345f, 0.010017f, -0.012554f, 0.008453f, -0.003351f, 0.013353f, 0.014524f, -0.028474f, -0.005237f, 0.017549f, 0.005308f, 0.009556f, 0.007543f, 0.017377f, -0.008377f, 0.006972f, 0.000347f, -0.014630f, -0.007112f, -0.000400f, 0.003076f, -0.021482f, -0.001792f, 0.013592f, -0.010704f, 0.022814f, 0.017129f, -0.006886f, -0.000165f, 0.004380f, 0.008596f, 0.013324f, -0.005117f, -0.004295f, 0.021624f, -0.005092f, -0.000399f, 0.009402f, 0.000490f, 0.012634f, 0.010103f, 0.004163f, 0.007000f, 0.007288f, 0.006993f, 0.003225f, 0.003005f, -0.002995f, -0.004982f, -0.002106f, -0.004532f, -0.000532f, -0.003147f, 0.002402f, 0.002219f, -0.004564f, -0.003553f, -0.000535f, 0.003546f, 0.007068f, 0.005960f, 0.003353f, 0.000740f, 0.003519f, -0.006005f, -0.002733f, -0.003191f, 0.001359f, -0.002291f, 0.003158f, -0.006988f, 0.000781f, -0.000045f, 0.006106f, 0.002518f, 0.000313f, 0.001139f, 0.006329f, 0.002023f, -0.005441f, + 0.001894f, -0.000492f, 0.001566f, 0.055313f, -0.028928f, 0.004033f, 0.022811f, -0.002193f, 0.000829f, 0.030188f, 0.033103f, 0.003930f, -0.002511f, 0.006963f, -0.001576f, 0.007480f, 0.009527f, -0.012098f, -0.003687f, 0.019540f, 0.017279f, -0.008065f, -0.015704f, -0.016826f, -0.017427f, -0.009433f, 0.014544f, -0.011179f, 0.006399f, 0.000769f, -0.020365f, -0.001387f, -0.013521f, -0.001646f, 0.005891f, 0.008934f, -0.026416f, -0.012456f, -0.021022f, -0.006568f, 0.031972f, 0.004574f, -0.002826f, 0.002808f, -0.002840f, 0.001545f, 0.009486f, 0.005500f, 0.015998f, -0.000890f, 0.011973f, 0.007059f, -0.011048f, 0.007012f, -0.016844f, 0.000441f, -0.016917f, -0.017751f, 0.006768f, -0.019528f, 0.008274f, -0.000268f, 0.010004f, 0.007854f, 0.007239f, -0.010448f, 0.012211f, -0.017718f, -0.000285f, -0.008189f, -0.002669f, 0.022143f, 0.000883f, 0.011059f, 0.011095f, -0.002306f, -0.004123f, 0.008531f, -0.018248f, 0.007297f, 0.017557f, -0.026053f, -0.019006f, -0.005357f, 0.013306f, -0.001275f, -0.015872f, 0.005981f, -0.002219f, 0.006801f, -0.005769f, 0.002050f, -0.003225f, 0.011418f, -0.002018f, 0.010494f, + 0.005963f, 0.009795f, 0.003545f, 0.002675f, -0.005046f, 0.006613f, 0.003112f, -0.000287f, 0.004065f, 0.003319f, -0.001766f, 0.004915f, 0.004063f, -0.002487f, -0.002451f, -0.008566f, -0.001604f, -0.004920f, 0.000002f, -0.000279f, -0.002700f, 0.004307f, -0.001314f, 0.002497f, 0.001122f, 0.008807f, -0.006822f, -0.033023f, 0.006147f, 0.007977f, -0.022306f, 0.010076f, -0.000147f, 0.023382f, -0.006169f, -0.011896f, 0.009901f, -0.028908f, -0.009937f, 0.024371f, 0.010701f, -0.014848f, -0.035690f, 0.015880f, -0.004959f, 0.008714f, -0.022766f, -0.030204f, -0.020474f, 0.026098f, 0.002153f, 0.014386f, -0.002497f, -0.013857f, -0.020510f, 0.009655f, -0.005459f, -0.017891f, -0.020868f, 0.001482f, -0.018625f, -0.014368f, -0.007805f, -0.003721f, -0.020179f, 0.011282f, 0.013525f, 0.018231f, -0.008717f, 0.016200f, -0.013057f, 0.025658f, -0.004758f, -0.001411f, 0.019600f, 0.010035f, -0.004827f, -0.013203f, -0.006572f, 0.018863f, 0.004394f, -0.014089f, 0.006738f, 0.020039f, 0.019008f, 0.008121f, -0.023180f, -0.025665f, -0.002269f, 0.004939f, 0.001618f, -0.018487f, 0.005553f, 0.020318f, 0.005920f, -0.008719f, + -0.032792f, 0.008732f, -0.014253f, -0.032052f, 0.001026f, 0.001670f, -0.018064f, 0.025978f, -0.001856f, -0.010742f, -0.035457f, -0.000259f, -0.010418f, -0.001688f, 0.013346f, -0.007984f, -0.013545f, -0.000950f, 0.003079f, 0.003177f, -0.010734f, -0.010945f, -0.010806f, 0.003961f, -0.009325f, 0.000553f, -0.001665f, 0.001492f, -0.002578f, 0.002587f, 0.004790f, 0.004205f, 0.005472f, 0.002665f, 0.009820f, 0.012427f, 0.000723f, 0.003633f, 0.002308f, -0.004891f, -0.001336f, -0.003992f, 0.001546f, 0.001333f, 0.000754f, -0.012136f, 0.001450f, -0.001062f, -0.004395f, -0.000611f, -0.003949f, 0.003616f, -0.004831f, -0.005124f, -0.040859f, 0.025658f, 0.019795f, 0.021792f, 0.003117f, 0.023031f, 0.002367f, -0.014719f, -0.017029f, 0.002617f, 0.018493f, -0.012694f, 0.004337f, -0.027511f, 0.018951f, 0.020098f, -0.010041f, -0.005635f, 0.004695f, 0.022008f, 0.016080f, -0.011277f, -0.010063f, 0.015076f, -0.017936f, 0.006309f, -0.024546f, 0.000052f, -0.007170f, -0.032933f, -0.033962f, 0.006711f, 0.019786f, 0.009220f, -0.028970f, -0.015586f, 0.022391f, -0.024552f, -0.010087f, 0.019883f, -0.005174f, 0.024831f, + -0.008529f, -0.017135f, 0.006669f, -0.024972f, 0.029071f, -0.002944f, 0.005296f, -0.013401f, -0.006691f, -0.001042f, -0.026933f, -0.016425f, 0.002361f, -0.004264f, 0.002889f, -0.008637f, -0.028591f, 0.005566f, -0.023639f, 0.010794f, -0.005818f, 0.017364f, -0.028529f, 0.013093f, 0.005102f, -0.008004f, 0.021593f, -0.002529f, -0.014523f, -0.028043f, -0.003615f, 0.006382f, -0.022580f, 0.017001f, -0.015197f, 0.011094f, -0.029791f, -0.030481f, 0.014765f, 0.011796f, -0.012075f, -0.009483f, 0.009921f, 0.006805f, -0.006340f, -0.005305f, -0.008079f, -0.010484f, -0.000803f, -0.016950f, -0.001640f, -0.002338f, 0.001452f, 0.004867f, -0.002999f, 0.004919f, -0.003129f, -0.000944f, -0.009077f, -0.004470f, -0.002346f, -0.001092f, 0.013809f, -0.003944f, -0.001751f, 0.007983f, -0.008362f, 0.006001f, 0.003568f, -0.003216f, -0.001904f, -0.008493f, -0.007777f, -0.000271f, -0.004480f, -0.005422f, 0.013371f, -0.012946f, 0.004463f, 0.015918f, 0.023467f, -0.006152f, 0.002621f, -0.008274f, -0.031290f, -0.006635f, -0.006689f, 0.013657f, -0.027489f, -0.000022f, -0.015858f, 0.017128f, -0.019233f, -0.026166f, 0.017448f, 0.008081f, + 0.011347f, 0.036201f, -0.005963f, -0.010284f, 0.010185f, -0.023062f, -0.027002f, 0.002307f, 0.034561f, 0.010604f, 0.019394f, -0.013704f, -0.016992f, -0.027396f, 0.005472f, 0.035204f, -0.015758f, 0.018452f, 0.004190f, 0.027402f, -0.041793f, -0.013168f, -0.000734f, 0.005019f, 0.023750f, 0.011591f, -0.031867f, -0.008500f, -0.014814f, -0.001138f, -0.036692f, -0.005634f, -0.013240f, 0.002664f, -0.019339f, -0.001146f, 0.004423f, -0.053359f, 0.006074f, -0.016631f, 0.003225f, -0.021029f, -0.001217f, 0.013308f, 0.006655f, -0.007048f, -0.006849f, -0.028055f, 0.028291f, 0.027416f, 0.008914f, 0.006962f, -0.024557f, 0.037543f, 0.012937f, 0.019440f, -0.007440f, -0.058653f, 0.022848f, -0.001833f, 0.044051f, 0.041648f, 0.012991f, -0.005134f, 0.018177f, 0.001163f, 0.015905f, 0.001063f, 0.001739f, -0.010205f, 0.004884f, -0.009300f, -0.005182f, -0.002436f, 0.019141f, -0.000054f, 0.001059f, 0.005168f, -0.001327f, -0.010160f, -0.005454f, 0.002007f, 0.007693f, -0.003435f, 0.003772f, -0.005854f, 0.008006f, -0.006131f, -0.009930f, -0.004738f, -0.001539f, 0.004847f, 0.001653f, -0.001839f, -0.001834f, -0.001882f, + 0.012570f, -0.002496f, 0.000600f, 0.002385f, 0.006199f, 0.050692f, 0.017896f, 0.034704f, -0.033612f, 0.007853f, 0.035386f, -0.010592f, -0.012707f, 0.005031f, -0.021828f, 0.016726f, 0.004264f, -0.025499f, -0.033398f, -0.002479f, 0.028391f, -0.000701f, -0.002250f, 0.018586f, -0.027668f, -0.007026f, -0.022770f, 0.012842f, -0.038828f, 0.000673f, -0.008274f, 0.014167f, -0.040554f, -0.028011f, -0.017701f, 0.011928f, 0.013098f, 0.009074f, -0.013131f, 0.009895f, -0.009760f, 0.012066f, -0.008000f, -0.003524f, -0.002759f, -0.011367f, 0.007758f, 0.017994f, 0.010731f, 0.018114f, -0.001453f, -0.017511f, 0.002536f, -0.017436f, 0.046569f, -0.011731f, -0.045737f, -0.014230f, 0.012548f, 0.039789f, -0.039758f, -0.016378f, -0.002557f, 0.025595f, 0.001674f, -0.056287f, -0.006878f, 0.026020f, 0.053714f, 0.002018f, 0.037406f, 0.053867f, -0.003969f, 0.017360f, 0.025476f, -0.007012f, 0.045919f, -0.006137f, 0.055444f, 0.008853f, -0.015185f, -0.048023f, -0.030061f, 0.000387f, 0.014491f, 0.006932f, -0.007275f, -0.009310f, -0.014893f, -0.020353f, -0.018073f, 0.022068f, 0.006486f, -0.000241f, -0.031555f, -0.003543f, + 0.001202f, -0.005741f, -0.017928f, 0.004715f, 0.009551f, -0.002696f, -0.009272f, -0.006769f, -0.017564f, -0.010606f, -0.005136f, 0.011113f, -0.002134f, -0.009562f, 0.009646f, -0.013748f, 0.009941f, 0.010016f, -0.008587f, -0.016669f, 0.015293f, 0.022678f, 0.003511f, 0.000713f, 0.001420f, 0.013220f, -0.003896f, -0.015767f, 0.001904f, 0.015318f, 0.012721f, -0.015657f, -0.013262f, 0.002455f, 0.002557f, 0.000237f, 0.004578f, -0.002441f, 0.021347f, 0.025832f, -0.044202f, -0.043002f, 0.011455f, -0.010000f, 0.001417f, -0.017088f, 0.040233f, -0.018002f, -0.011479f, 0.014005f, 0.010124f, 0.000430f, -0.018307f, -0.013403f, -0.022291f, 0.009052f, -0.001230f, -0.010769f, -0.001718f, 0.026757f, 0.040184f, -0.043343f, -0.002704f, -0.042281f, -0.004442f, -0.010898f, 0.042023f, -0.017674f, -0.016864f, -0.008109f, 0.025602f, 0.008522f, 0.007114f, 0.010750f, 0.010287f, -0.007536f, 0.000573f, -0.005449f, 0.006889f, -0.004964f, 0.039347f, -0.010186f, 0.010497f, 0.027702f, -0.014330f, -0.031694f, 0.007137f, 0.010866f, -0.011091f, -0.012124f, -0.002578f, 0.006578f, 0.020000f, -0.027139f, 0.036519f, 0.053642f, + 0.036084f, -0.014991f, -0.021605f, -0.049569f, -0.063951f, -0.023507f, -0.000162f, -0.011533f, -0.003162f, -0.007241f, 0.015395f, -0.001278f, -0.024646f, 0.013038f, -0.010865f, -0.002307f, 0.023588f, 0.039244f, -0.009505f, 0.011064f, -0.006804f, 0.002196f, 0.035779f, 0.018075f, 0.030616f, 0.031116f, -0.024731f, -0.007592f, -0.005588f, 0.000930f, -0.000467f, 0.011106f, 0.000869f, 0.006826f, 0.031402f, 0.001350f, 0.014733f, -0.006586f, -0.006754f, -0.012771f, -0.003816f, 0.001870f, 0.014377f, -0.003910f, -0.011735f, -0.005532f, 0.006994f, -0.004880f, -0.002522f, -0.003627f, 0.004476f, 0.001178f, -0.004457f, -0.002437f, 0.003354f, 0.001634f, 0.001797f, 0.018098f, -0.007223f, 0.000497f, 0.002516f, 0.000312f, -0.009777f, 0.004606f, 0.005810f, 0.011577f, -0.022757f, 0.043163f, 0.019447f, 0.024584f, 0.036869f, 0.056935f, -0.021791f, 0.029494f, -0.058497f, -0.007142f, -0.026208f, -0.057474f, 0.023350f, 0.013697f, 0.017585f, 0.007766f, 0.022870f, 0.007032f, -0.041355f, 0.034947f, 0.061670f, -0.009148f, -0.009856f, 0.015160f, 0.006177f, -0.012799f, -0.054875f, 0.004572f, 0.000246f, -0.004923f, + 0.000793f, 0.018760f, -0.039220f, 0.008574f, 0.011201f, -0.008006f, -0.022604f, -0.010971f, -0.025199f, 0.025780f, -0.056343f, -0.008105f, -0.036225f, 0.020215f, 0.008194f, 0.020499f, -0.007137f, 0.005635f, -0.014379f, 0.034582f, 0.010428f, 0.028402f, -0.025737f, 0.027919f, -0.000595f, -0.027192f, 0.056354f, -0.009261f, 0.006932f, 0.038109f, -0.036515f, 0.042708f, 0.025513f, -0.033342f, 0.014132f, -0.012701f, 0.018768f, -0.046219f, 0.033869f, 0.004873f, 0.011920f, -0.004268f, 0.010987f, -0.037518f, 0.023966f, 0.042769f, -0.084791f, 0.008747f, 0.081837f, -0.052763f, -0.016938f, 0.005858f, 0.039902f, 0.028363f, 0.009860f, 0.024792f, -0.011133f, 0.014983f, -0.006184f, -0.018013f, 0.008974f, -0.003964f, -0.003023f, 0.015469f, 0.022342f, -0.001830f, -0.008661f, -0.007361f, 0.006624f, 0.014325f, -0.018875f, -0.006994f, -0.012912f, -0.007958f, -0.016877f, 0.016985f, 0.022333f, -0.004619f, 0.010290f, -0.006262f, 0.004189f, 0.014296f, 0.016050f, -0.018374f, 0.001587f, 0.006932f, -0.009678f, 0.014775f, 0.000774f, -0.000198f, 0.013316f, 0.006896f, -0.015973f, -0.013281f, 0.004566f, 0.002233f, + -0.004810f, 0.002827f, 0.034248f, -0.020890f, -0.025137f, -0.000894f, -0.024072f, -0.010993f, -0.063433f, -0.054148f, -0.007581f, -0.031103f, -0.037341f, -0.026940f, 0.016401f, -0.009650f, -0.018974f, -0.030347f, 0.027813f, 0.001794f, -0.045851f, -0.007291f, -0.000402f, -0.021834f, -0.006990f, 0.018480f, 0.013188f, -0.003288f, 0.000018f, 0.000798f, -0.011627f, 0.009687f, 0.021188f, -0.008067f, -0.005250f, 0.032706f, -0.061719f, -0.010089f, 0.017165f, 0.065585f, -0.027345f, -0.017085f, -0.024655f, -0.033364f, 0.014362f, 0.069606f, 0.012767f, 0.043100f, 0.008739f, -0.007133f, -0.003814f, -0.005200f, -0.033786f, 0.007325f, 0.007429f, -0.027403f, 0.005885f, 0.054370f, -0.009006f, -0.016816f, 0.008942f, -0.019569f, -0.004666f, 0.047964f, 0.070768f, 0.019122f, 0.042409f, 0.049208f, -0.017661f, -0.020582f, 0.005420f, -0.016286f, 0.002607f, -0.048716f, -0.000629f, -0.037963f, 0.011344f, 0.007908f, 0.022923f, -0.039516f, -0.014966f, -0.013484f, -0.015684f, -0.012377f, -0.014061f, 0.022000f, 0.004533f, 0.028360f, -0.007413f, 0.010815f, 0.028140f, -0.005203f, 0.000788f, -0.004104f, -0.011476f, -0.009042f, + -0.001762f, -0.006827f, -0.010571f, -0.000162f, 0.004069f, -0.005338f, 0.001686f, 0.013266f, -0.013510f, -0.012064f, 0.000684f, 0.009958f, 0.004924f, -0.006351f, -0.019912f, -0.019114f, -0.002578f, 0.004533f, -0.011910f, -0.006466f, 0.003896f, -0.003918f, 0.001831f, 0.001452f, 0.013228f, 0.004577f, 0.003189f, -0.014688f, 0.016094f, -0.006802f, 0.050497f, 0.057030f, -0.022731f, 0.128893f, -0.017591f, 0.003058f, -0.023722f, 0.015273f, -0.009973f, 0.015075f, 0.033183f, 0.009482f, -0.030741f, -0.016645f, -0.032125f, -0.000427f, -0.021776f, -0.039821f, 0.005469f, 0.026016f, -0.004268f, 0.007648f, 0.012411f, 0.015301f, -0.000118f, -0.011413f, -0.014932f, 0.007756f, 0.000021f, -0.019800f, 0.007935f, 0.055469f, 0.039254f, 0.022351f, -0.046826f, 0.033820f, 0.026484f, -0.012277f, -0.014199f, -0.014262f, -0.018651f, -0.007982f, 0.015351f, -0.033891f, 0.003387f, 0.004335f, 0.020537f, 0.052878f, 0.010334f, 0.011038f, 0.003014f, -0.006221f, -0.010535f, 0.022986f, -0.013731f, 0.053393f, 0.017296f, -0.005059f, 0.023499f, 0.004530f, -0.035768f, -0.025750f, 0.030458f, 0.035027f, 0.013144f, -0.008649f, + 0.023396f, 0.025082f, 0.035774f, 0.069667f, 0.007642f, -0.019914f, -0.035593f, -0.023807f, 0.018262f, 0.004021f, 0.006046f, -0.003221f, 0.024669f, 0.002688f, -0.002775f, -0.032386f, -0.015798f, 0.033911f, 0.038149f, -0.013431f, -0.025559f, -0.030693f, -0.008697f, 0.016610f, 0.010628f, 0.003134f, -0.010181f, 0.002771f, 0.000233f, -0.013537f, 0.000379f, -0.030010f, -0.007570f, -0.001052f, 0.021873f, -0.003793f, -0.006267f, 0.000263f, 0.017803f, -0.010392f, 0.012845f, -0.006419f, -0.013844f, 0.012350f, 0.017615f, 0.011259f, 0.012555f, -0.001460f, 0.013427f, 0.024985f, 0.011172f, 0.010741f, 0.007451f, -0.009057f, -0.003821f, 0.000814f, -0.001879f, 0.007601f, -0.006665f, 0.012333f, 0.016104f, 0.009448f, 0.001507f, -0.011840f, 0.005081f, 0.004497f, 0.013078f, 0.020895f, -0.020001f, 0.092100f, -0.013689f, 0.003916f, 0.010214f, -0.006945f, -0.001275f, 0.023106f, -0.017118f, -0.020238f, -0.010620f, 0.029818f, 0.026627f, -0.071154f, 0.013745f, 0.012226f, 0.029138f, -0.018152f, -0.028076f, -0.026698f, 0.020387f, 0.018503f, -0.028685f, -0.015599f, -0.011763f, 0.048012f, 0.024132f, 0.013581f, + -0.009265f, -0.049499f, 0.014091f, 0.012633f, 0.025616f, -0.006000f, 0.013629f, -0.013609f, 0.004869f, -0.042947f, 0.017937f, 0.017814f, 0.000663f, -0.010503f, -0.027010f, -0.053426f, 0.034805f, -0.022382f, 0.017911f, 0.018562f, 0.030753f, 0.004514f, -0.032646f, 0.054623f, 0.010682f, -0.052915f, -0.024634f, 0.032077f, 0.007598f, 0.041923f, 0.017645f, 0.007154f, -0.037866f, -0.018432f, 0.021176f, -0.065602f, 0.070996f, -0.050375f, 0.002891f, 0.042913f, -0.011428f, 0.084764f, 0.012673f, 0.015655f, -0.030570f, 0.098709f, 0.010272f, 0.064356f, -0.043428f, -0.019060f, -0.013657f, 0.025365f, -0.002635f, -0.009560f, 0.044641f, -0.036449f, 0.043056f, -0.050645f, 0.011042f, 0.005686f, 0.009366f, -0.009394f, 0.037963f, -0.004040f, 0.019377f, 0.017571f, 0.025234f, 0.014862f, 0.007449f, 0.018189f, 0.019722f, 0.001260f, 0.007295f, 0.002761f, -0.013213f, 0.017442f, 0.000597f, 0.012184f, 0.023865f, 0.012531f, 0.001608f, -0.000598f, 0.018295f, 0.020194f, 0.009885f, -0.010534f, 0.039939f, -0.001187f, -0.007892f, -0.007152f, 0.025664f, -0.018813f, 0.008966f, -0.003679f, 0.013828f, 0.001476f, + 0.005780f, 0.008163f, -0.005392f, -0.003759f, 0.003963f, 0.008247f, 0.006671f, 0.008600f, 0.010322f, -0.011421f, 0.032305f, 0.075925f, 0.025210f, 0.047676f, 0.060780f, -0.002615f, 0.069701f, -0.053721f, -0.019234f, -0.020238f, -0.017755f, 0.007435f, 0.011392f, -0.004633f, -0.023713f, -0.046229f, 0.044336f, 0.041788f, 0.017769f, 0.037732f, -0.061890f, -0.053673f, 0.018106f, 0.025532f, -0.028589f, -0.040279f, 0.025727f, -0.012774f, -0.057667f, -0.021323f, -0.010945f, 0.028431f, -0.053008f, 0.029239f, 0.019996f, 0.023132f, -0.024760f, -0.001629f, -0.024485f, -0.010936f, -0.070607f, -0.017385f, 0.034337f, -0.112176f, -0.035415f, -0.004466f, -0.002428f, 0.003697f, -0.067301f, -0.016954f, -0.101397f, -0.008649f, 0.020146f, -0.029095f, -0.031659f, -0.013339f, 0.030628f, -0.010523f, -0.036491f, -0.041943f, -0.105784f, -0.037979f, 0.049672f, -0.047094f, -0.071159f, 0.059439f, -0.018625f, -0.080369f, 0.024353f, 0.072129f, -0.038580f, -0.017804f, 0.008883f, -0.052810f, 0.065328f, 0.028664f, 0.041869f, -0.022122f, -0.004491f, 0.021154f, 0.062237f, 0.028635f, 0.009933f, -0.020200f, -0.004191f, 0.070148f, + 0.007008f, 0.010650f, -0.005024f, -0.041880f, -0.018287f, 0.032741f, -0.000567f, 0.001718f, -0.006561f, -0.037480f, -0.002638f, 0.015661f, -0.022829f, 0.026907f, -0.035299f, -0.023189f, 0.007507f, -0.012887f, 0.018653f, 0.007039f, -0.032081f, 0.012816f, 0.016455f, 0.008268f, 0.006405f, -0.013586f, 0.007988f, -0.000809f, -0.007627f, -0.023410f, 0.011675f, 0.008799f, -0.002377f, 0.016757f, -0.025112f, 0.002315f, -0.024018f, 0.000092f, 0.006784f, -0.009197f, -0.003871f, -0.001824f, 0.009973f, 0.000780f, 0.088654f, 0.122201f, -0.018029f, -0.002833f, -0.046566f, -0.046869f, -0.081446f, 0.035856f, -0.013054f, 0.122054f, -0.024641f, -0.051502f, -0.072014f, 0.005115f, 0.023623f, -0.026090f, 0.023797f, 0.080087f, -0.030480f, -0.013266f, -0.054416f, -0.024328f, 0.054493f, 0.062634f, -0.061350f, -0.016820f, 0.032758f, -0.012633f, 0.014973f, -0.017790f, 0.078678f, 0.063168f, 0.133506f, 0.044016f, 0.059526f, -0.025328f, 0.042926f, 0.090462f, 0.029960f, -0.004954f, 0.021772f, -0.002259f, 0.059316f, 0.031344f, 0.086109f, 0.024786f, -0.085149f, 0.030968f, 0.034063f, 0.071601f, -0.038794f, -0.032994f, + 0.041912f, 0.045262f, -0.020339f, 0.071966f, -0.024035f, 0.029950f, -0.077390f, 0.050289f, -0.017456f, 0.027913f, 0.028787f, 0.063183f, 0.055029f, -0.042300f, -0.043990f, -0.013711f, 0.066410f, 0.066926f, -0.024005f, -0.036008f, -0.069554f, -0.007297f, 0.050641f, 0.057046f, 0.038497f, -0.015747f, -0.045668f, -0.043420f, -0.006551f, 0.031373f, -0.029449f, 0.043458f, 0.011677f, 0.030551f, 0.006445f, -0.014568f, 0.035049f, 0.022067f, -0.003918f, -0.013763f, 0.011821f, 0.029433f, -0.040506f, 0.017429f, 0.022115f, 0.028681f, 0.016628f, 0.040287f, -0.011846f, 0.014573f, -0.017328f, -0.026666f, 0.017032f, 0.033976f, 0.030689f, 0.045413f, 0.000864f, -0.000092f, 0.014809f, 0.012405f, 0.081451f, 0.015813f, -0.002050f, -0.034608f, 0.001540f, 0.051615f, 0.027408f, 0.039933f, 0.024427f, -0.000818f, 0.002086f, -0.008607f, 0.001047f, 0.049535f, 0.042293f, 0.004472f, 0.016683f, -0.004852f, -0.006727f, 0.001886f, 0.022200f, 0.015825f, 0.015201f, -0.010682f, -0.009041f, 0.011853f, 0.003049f, -0.029611f, -0.098279f, 0.007009f, 0.150961f, 0.090199f, -0.020905f, -0.220947f, -0.031464f, -0.022370f, + 0.017440f, -0.025090f, 0.004342f, 0.023109f, -0.008285f, 0.010001f, -0.047925f, 0.030754f, 0.037126f, 0.068352f, -0.049218f, -0.062382f, 0.064756f, 0.102284f, 0.025971f, -0.045435f, -0.060349f, -0.013000f, 0.015415f, 0.005732f, 0.016373f, 0.000389f, 0.022714f, 0.009067f, 0.066973f, -0.021327f, -0.091484f, -0.039740f, 0.029701f, 0.010789f, -0.031497f, -0.040140f, 0.005558f, 0.043239f, 0.077023f, 0.070467f, -0.001286f, 0.001172f, 0.029138f, -0.027260f, -0.078901f, 0.024036f, -0.049125f, 0.095006f, 0.104465f, -0.002131f, 0.029692f, 0.014882f, 0.021056f, -0.046104f, -0.006350f, 0.099054f, -0.037036f, 0.000882f, -0.134317f, -0.017923f, 0.015551f, 0.031104f, 0.029648f, 0.027833f, -0.032983f, -0.021000f, 0.061307f, 0.089178f, -0.015376f, -0.003907f, 0.009052f, 0.035873f, 0.043943f, -0.020298f, 0.015063f, -0.048622f, -0.056912f, 0.005813f, 0.016168f, 0.021171f, -0.006554f, -0.009040f, -0.010401f, -0.012410f, 0.039641f, -0.000303f, -0.006864f, -0.020691f, -0.001148f, 0.024124f, 0.022445f, -0.011828f, 0.030525f, 0.006787f, 0.046189f, 0.003674f, 0.008605f, 0.001409f, -0.015515f, -0.013798f, + -0.007491f, -0.010759f, -0.002562f, -0.013891f, -0.009055f, 0.003367f, 0.038543f, 0.042841f, 0.013335f, 0.022181f, 0.008979f, 0.007651f, 0.037715f, -0.026977f, 0.028779f, 0.009979f, 0.046830f, -0.012595f, 0.012666f, 0.008308f, -0.018200f, 0.014442f, -0.008345f, 0.014736f, -0.004637f, 0.025302f, -0.008404f, -0.016177f, 0.013276f, 0.005291f, 0.006801f, 0.009794f, 0.006991f, 0.017832f, 0.004114f, 0.006455f, 0.003914f, 0.006033f, 0.006931f, 0.005095f, 0.012422f, 0.008186f, 0.001885f, 0.001203f, 0.003176f, 0.011065f, 0.008959f, 0.008250f, 0.010203f, -0.011708f, -0.099537f, -0.041292f, 0.079254f, 0.087399f, 0.082958f, 0.112603f, 0.019165f, -0.048706f, -0.149012f, -0.113107f, -0.021503f, 0.031382f, 0.094068f, 0.102457f, 0.048274f, 0.002160f, -0.050205f, -0.043356f, -0.019455f, 0.031923f, 0.087757f, 0.049907f, -0.011891f, 0.003112f, -0.007472f, -0.048427f, -0.066452f, -0.054222f, 0.009841f, 0.080990f, 0.060568f, 0.121831f, 0.078942f, 0.078440f, 0.110114f, -0.032230f, -0.076679f, -0.086878f, -0.115681f, -0.142049f, -0.053985f, -0.016789f, 0.041781f, 0.078158f, 0.112506f, 0.105497f, + 0.085321f, 0.054235f, 0.108037f, -0.021234f, -0.069036f, -0.003229f, -0.017939f, 0.028700f, 0.032341f, 0.129500f, 0.112582f, -0.042046f, 0.019774f, -0.029442f, -0.087113f, -0.025534f, 0.022454f, -0.052103f, 0.079933f, -0.032205f, 0.026190f, 0.006888f, -0.009762f, 0.069671f, 0.096154f, 0.077192f, 0.053680f, -0.040157f, -0.098463f, -0.111307f, 0.031156f, -0.046900f, 0.007930f, -0.005314f, 0.062199f, 0.009871f, 0.034906f, -0.029991f, -0.069245f, -0.063579f, -0.100578f, -0.086806f, 0.036201f, 0.020825f, 0.049609f, 0.075783f, 0.058224f, 0.002314f, -0.045330f, -0.071861f, -0.098284f, -0.053324f, -0.025668f, -0.035856f, 0.015343f, -0.013002f, -0.012095f, -0.011521f, -0.030408f, 0.000314f, -0.013952f, -0.019649f, -0.024327f, -0.014940f, -0.003968f, 0.015616f, -0.029280f, -0.017780f, 0.041552f, 0.004159f, -0.222520f, -0.234203f, -0.243610f, -0.249698f, -0.329950f, -0.035806f, -0.093332f, -0.022576f, 0.030829f, 0.150327f, 0.170836f, 0.176647f, 0.247251f, 0.341804f, 0.327505f, 0.321876f, 0.258607f, 0.186807f, 0.135746f, 0.040840f, -0.155939f, -0.074797f, -0.092124f, -0.057017f, -0.187280f, -0.031032f, + -0.077504f, -0.085344f, -0.154964f, -0.119058f, -0.121147f, -0.109721f, -0.114639f, -0.201457f, -0.178411f, -0.105239f, -0.095172f, -0.119540f, -0.165661f, -0.025115f, -0.145057f, -0.274953f, -0.235609f, -0.206825f, -0.109020f, -0.140481f, -0.025059f, -0.284584f, -0.126004f, -0.126006f, -0.058218f, -0.042402f, -0.146532f, 0.006593f, -0.146808f, -0.017636f, 0.022937f, 0.068930f, 0.006222f, 0.070844f, 0.105664f, 0.166155f, 0.177056f, 0.243618f, 0.159170f, 0.382231f, 0.241524f, 0.444894f, 0.302449f, 0.443221f, 0.514019f, 0.610416f, 0.501359f, 0.504827f, 0.568877f, 0.510524f, 0.518411f, 0.504615f, 0.437480f, 0.253233f, 0.202313f, 0.142871f, 0.104158f, 0.121982f, 0.181857f, 0.100378f, -0.036819f, -0.063084f, -0.072908f, -0.125213f, -0.162633f, -0.198217f, -0.182622f, -0.300092f, -0.290791f, -0.299418f, -0.362835f, -0.319416f, -0.403046f, -0.356776f, -0.418772f, -0.429987f, -0.405158f, -0.446967f, -0.404279f, -0.451332f, -0.358307f, -0.350959f, -0.290963f, -0.310434f, -0.320107f, -0.224889f, -0.201470f, -0.153801f, -0.078341f, 0.026640f, 0.085905f, 0.075473f, 0.096153f, 0.086246f, 0.097203f, 0.111847f, + 0.159486f, 0.191824f, 0.173252f, 0.156089f, 0.190557f, 0.177570f, 0.219173f, 0.199804f, 0.145945f, 0.133140f, 0.115604f, 0.102153f, 0.064259f, 0.049145f, 0.045518f, 0.029038f, 0.031555f, 0.013021f, 0.020615f, 0.018404f, 0.012527f, 0.018469f, 0.013294f, 0.008353f, 0.003073f, -0.006444f, -0.000925f, 0.000163f, -0.019177f, -0.029965f, -0.017185f, -0.013525f, -0.012390f, -0.008534f, -0.006057f, -0.005530f}, + {0.031749f, 0.004210f, -0.010404f, 0.004958f, 0.005622f, 0.001958f, -0.013180f, 0.006046f, 0.009380f, -0.010065f, -0.003006f, -0.012336f, -0.002700f, -0.005230f, -0.004512f, -0.001759f, 0.000700f, -0.000408f, 0.001273f, 0.004464f, -0.005489f, 0.002483f, -0.012642f, 0.004378f, 0.007796f, 0.001677f, -0.003312f, -0.010243f, 0.006725f, -0.004488f, 0.010866f, 0.009277f, -0.000383f, -0.004288f, 0.008862f, 0.010333f, 0.008311f, 0.008408f, 0.002101f, -0.006413f, 0.002032f, 0.007954f, -0.003314f, -0.006702f, 0.006053f, 0.009586f, -0.004187f, 0.005014f, -0.010874f, -0.000881f, -0.009537f, 0.006535f, -0.012699f, -0.003417f, -0.002356f, 0.004369f, 0.006351f, 0.004507f, -0.000351f, -0.006723f, 0.000837f, -0.009307f, -0.006142f, 0.001722f, -0.001143f, -0.005605f, 0.003084f, 0.003174f, 0.000814f, 0.005900f, -0.005227f, 0.002548f, -0.007064f, -0.002793f, -0.002998f, 0.003914f, -0.003657f, -0.007475f, -0.003345f, -0.002776f, 0.010319f, 0.008875f, 0.002262f, -0.004690f, 0.000625f, -0.000534f, 0.001816f, 0.003572f, 0.000670f, 0.000215f, 0.000643f, -0.000132f, 0.000167f, -0.001311f, 0.001046f, -0.003932f, + 0.000202f, -0.000287f, 0.001643f, 0.000865f, -0.001201f, -0.001713f, 0.000376f, 0.000726f, 0.000770f, 0.018102f, -0.018241f, 0.000693f, 0.000324f, -0.004617f, -0.005473f, -0.005830f, 0.001891f, -0.010279f, -0.010139f, 0.001435f, 0.004928f, -0.000375f, 0.005841f, 0.004552f, -0.005573f, 0.002300f, -0.020006f, -0.004893f, -0.004469f, -0.004654f, -0.006304f, -0.006955f, -0.017631f, -0.013698f, 0.001886f, 0.004132f, -0.000942f, 0.009552f, 0.007642f, 0.003217f, -0.003391f, -0.001898f, 0.008952f, -0.003449f, 0.001117f, -0.001297f, -0.009386f, 0.003151f, -0.003136f, -0.006393f, -0.002463f, 0.007689f, 0.018570f, -0.007069f, 0.002084f, 0.004526f, -0.003420f, 0.005853f, 0.002625f, -0.006476f, 0.003795f, -0.015327f, -0.007087f, 0.000183f, 0.006288f, 0.009753f, -0.005957f, -0.002759f, -0.000652f, -0.022217f, 0.003813f, 0.011504f, 0.000636f, 0.001681f, 0.006304f, -0.003605f, 0.009832f, 0.013248f, -0.001658f, 0.003774f, 0.007972f, 0.007565f, 0.001518f, 0.000426f, -0.003674f, -0.005298f, -0.003300f, 0.002357f, -0.005037f, 0.011066f, 0.007445f, -0.000235f, -0.005385f, -0.002756f, 0.006385f, 0.007500f, + -0.003730f, 0.005823f, -0.003521f, 0.001592f, -0.003590f, -0.002175f, -0.002455f, 0.000709f, 0.000186f, 0.000441f, 0.000514f, -0.000402f, -0.001182f, -0.004793f, -0.015628f, 0.003616f, 0.000567f, -0.015116f, 0.002310f, 0.008467f, 0.012460f, 0.003200f, -0.008971f, 0.021124f, -0.002840f, -0.004163f, 0.009926f, -0.006139f, -0.005983f, 0.001016f, -0.007719f, 0.009415f, 0.009407f, -0.003809f, -0.014218f, -0.007024f, 0.007068f, -0.009151f, 0.020092f, 0.017343f, -0.013869f, -0.016964f, 0.000602f, 0.003173f, -0.016148f, -0.001057f, 0.006665f, 0.004527f, -0.007908f, -0.004597f, 0.018523f, -0.001967f, 0.012748f, -0.001266f, -0.004148f, -0.004308f, -0.009548f, 0.001662f, -0.001362f, 0.009997f, -0.008539f, 0.002314f, -0.002243f, 0.001858f, -0.005032f, -0.000660f, 0.008428f, 0.006704f, -0.010567f, 0.016455f, 0.001354f, -0.000074f, -0.000267f, -0.001507f, 0.004459f, -0.002267f, -0.014735f, -0.002090f, -0.007783f, 0.012832f, 0.005371f, 0.000336f, 0.015757f, -0.008718f, 0.010539f, 0.010370f, 0.000949f, -0.007668f, -0.001572f, -0.001631f, -0.000171f, -0.002181f, -0.003183f, 0.004361f, 0.004615f, -0.006964f, + 0.003337f, -0.000410f, 0.004884f, 0.004319f, -0.001431f, 0.000677f, -0.002164f, -0.003271f, 0.002331f, -0.003010f, -0.002546f, 0.001293f, 0.003301f, -0.003040f, -0.002272f, -0.003957f, -0.001703f, 0.002383f, -0.001516f, -0.000575f, 0.000043f, 0.001210f, -0.002199f, -0.001245f, 0.003045f, 0.001015f, -0.000654f, -0.000958f, -0.003438f, -0.037659f, 0.008639f, 0.002012f, 0.026825f, -0.001458f, 0.010777f, -0.014440f, 0.003102f, -0.010823f, -0.002594f, -0.005308f, -0.001710f, 0.004921f, -0.002906f, 0.004595f, 0.009040f, 0.006898f, 0.025470f, 0.017572f, -0.011569f, 0.005832f, -0.000624f, 0.004693f, 0.003003f, -0.003261f, -0.025313f, 0.006400f, -0.001296f, -0.000256f, 0.009604f, -0.001517f, -0.007063f, -0.004920f, -0.001198f, -0.007870f, -0.004228f, -0.020236f, -0.004748f, 0.000522f, -0.007147f, -0.001280f, 0.008381f, 0.011987f, -0.003883f, 0.014815f, -0.011094f, 0.002429f, 0.005062f, 0.001930f, -0.003444f, -0.007817f, 0.005518f, -0.001974f, 0.003397f, -0.005812f, -0.008256f, 0.001527f, 0.004801f, -0.008344f, 0.007942f, -0.005706f, 0.018919f, 0.020065f, -0.006109f, 0.007317f, 0.007705f, -0.001055f, + -0.002609f, -0.002709f, -0.024533f, 0.010238f, 0.009963f, 0.000289f, -0.004134f, -0.010258f, 0.001071f, -0.003021f, -0.012505f, -0.028012f, 0.001831f, -0.006955f, 0.007175f, -0.000015f, -0.000121f, -0.004691f, -0.003174f, -0.005286f, -0.000533f, 0.002857f, -0.003663f, 0.004250f, -0.004509f, -0.002622f, -0.001910f, -0.001134f, 0.002278f, 0.001888f, -0.001529f, 0.000865f, 0.000617f, 0.001521f, 0.002485f, 0.001916f, -0.001326f, -0.002985f, 0.002091f, -0.001269f, -0.002233f, 0.000800f, 0.000706f, -0.001325f, 0.001542f, 0.002519f, 0.000846f, -0.008060f, -0.012306f, 0.012284f, 0.006999f, -0.001070f, 0.014198f, -0.007612f, 0.012737f, -0.014344f, -0.013771f, 0.006707f, -0.021976f, -0.007783f, 0.005545f, 0.013382f, 0.017487f, -0.003050f, 0.013053f, -0.000451f, 0.012432f, 0.004599f, 0.002021f, -0.002043f, 0.000681f, 0.012408f, -0.005913f, -0.001303f, 0.002257f, 0.001079f, -0.012224f, -0.001519f, -0.006632f, 0.025277f, -0.012082f, -0.012242f, -0.002974f, 0.011915f, 0.011987f, 0.010297f, 0.013771f, -0.002381f, 0.002529f, -0.003052f, -0.006837f, 0.005216f, -0.000618f, -0.001300f, -0.007819f, 0.019828f, + 0.012223f, -0.006123f, 0.003776f, 0.005863f, -0.010458f, 0.002225f, 0.007703f, -0.001947f, 0.014867f, -0.006000f, -0.001932f, -0.016160f, -0.006101f, -0.013739f, 0.000611f, 0.018962f, -0.007464f, 0.005358f, 0.003245f, 0.000659f, -0.005178f, -0.001751f, 0.000165f, -0.004629f, 0.009099f, -0.009350f, -0.004416f, -0.000826f, 0.019984f, 0.003171f, -0.000125f, 0.006318f, -0.005448f, -0.014992f, 0.003713f, 0.001516f, -0.002395f, 0.001092f, 0.003677f, -0.000987f, 0.000751f, 0.007295f, 0.001373f, -0.000581f, 0.001726f, 0.000111f, -0.000985f, -0.001737f, 0.006758f, -0.000327f, 0.000558f, -0.006184f, 0.003744f, 0.000961f, 0.003727f, -0.000912f, -0.002557f, -0.000759f, 0.001886f, 0.003068f, 0.001970f, -0.005040f, 0.000234f, 0.003575f, -0.001121f, -0.006359f, -0.004122f, -0.035498f, 0.025750f, 0.002715f, -0.013058f, -0.031351f, -0.003120f, 0.000799f, -0.018548f, -0.001671f, 0.008641f, 0.007365f, 0.000681f, -0.005360f, 0.006841f, 0.022414f, 0.022737f, -0.009738f, -0.010687f, -0.024652f, 0.004929f, -0.004442f, 0.023951f, -0.009757f, -0.000529f, -0.005617f, 0.009015f, -0.002684f, -0.024550f, 0.008066f, + -0.001152f, -0.014546f, 0.000014f, 0.002302f, -0.001993f, -0.002475f, -0.010091f, -0.014046f, 0.008541f, 0.002118f, 0.011170f, -0.009704f, 0.018801f, 0.008929f, -0.003884f, -0.016651f, -0.003308f, 0.006028f, 0.018387f, 0.005711f, -0.010400f, -0.004735f, 0.008544f, 0.005525f, -0.005342f, -0.002599f, 0.009006f, 0.007386f, 0.009507f, 0.018230f, 0.020334f, 0.009948f, 0.010826f, 0.012513f, -0.007323f, 0.001827f, -0.013463f, 0.013474f, 0.002120f, 0.006816f, -0.009618f, -0.014938f, 0.003415f, -0.019100f, -0.006890f, -0.008321f, 0.014031f, 0.014725f, 0.015395f, 0.004064f, -0.004367f, -0.004862f, 0.014381f, 0.002943f, -0.002014f, 0.003640f, -0.004534f, 0.009205f, 0.000475f, -0.000120f, 0.003017f, 0.003790f, -0.001432f, 0.007549f, -0.000006f, 0.001294f, -0.003615f, -0.002156f, 0.002074f, 0.005895f, -0.000362f, 0.002150f, 0.003402f, 0.001979f, 0.001133f, -0.001753f, 0.002812f, -0.002333f, -0.012769f, -0.000758f, 0.023889f, 0.014688f, 0.020196f, 0.003844f, -0.022100f, -0.007284f, 0.023456f, -0.006765f, -0.014864f, -0.015482f, -0.015248f, -0.016128f, 0.008867f, 0.009015f, 0.005783f, 0.005302f, + 0.005470f, 0.022572f, -0.002794f, 0.009798f, -0.019389f, -0.021810f, 0.014603f, -0.000774f, -0.011910f, 0.000856f, -0.030391f, -0.009920f, -0.010243f, 0.003735f, -0.001075f, -0.002803f, -0.021384f, -0.013991f, 0.002364f, 0.014766f, 0.023981f, -0.009512f, -0.009421f, 0.012786f, -0.016483f, -0.001179f, -0.000852f, 0.005517f, 0.010485f, 0.008566f, 0.016617f, -0.008923f, 0.024096f, 0.011377f, -0.026064f, 0.013020f, -0.014494f, -0.017275f, -0.014387f, -0.020898f, 0.018905f, 0.004450f, -0.022295f, 0.002553f, 0.004686f, 0.002071f, 0.003514f, -0.004080f, 0.015674f, -0.009099f, 0.012045f, -0.019380f, 0.014686f, -0.009831f, -0.008978f, 0.001921f, 0.006508f, -0.000751f, 0.010605f, 0.030437f, -0.002573f, -0.016315f, 0.009625f, 0.019949f, 0.001575f, -0.002163f, -0.015829f, -0.006893f, 0.014672f, -0.002492f, -0.001007f, 0.000506f, 0.002950f, -0.004114f, -0.002380f, -0.000359f, 0.004320f, -0.002506f, -0.000536f, -0.002880f, 0.008270f, -0.006067f, 0.001264f, -0.005702f, -0.007148f, 0.001884f, 0.002286f, -0.002227f, 0.001100f, -0.002066f, -0.001577f, -0.000448f, -0.000818f, -0.000172f, -0.003034f, -0.001781f, + 0.008490f, -0.000438f, 0.000049f, 0.049526f, -0.044644f, 0.020649f, 0.021546f, -0.020066f, -0.003621f, 0.029629f, 0.010743f, 0.018818f, 0.005628f, -0.006519f, 0.044573f, -0.001790f, -0.008339f, -0.000048f, 0.000152f, 0.021395f, 0.033530f, 0.012694f, -0.000229f, 0.000674f, 0.005035f, 0.011520f, -0.000158f, 0.006113f, -0.023432f, 0.011095f, 0.018270f, -0.003831f, 0.007454f, 0.000002f, 0.003397f, -0.015107f, -0.011784f, 0.000851f, -0.000515f, 0.020689f, 0.010224f, 0.008558f, -0.008710f, -0.010716f, -0.010700f, 0.011909f, 0.017314f, 0.000146f, -0.005561f, 0.033807f, 0.017516f, 0.022591f, -0.012171f, -0.025225f, -0.004798f, -0.026416f, -0.017374f, -0.007959f, -0.011009f, -0.001518f, 0.019780f, -0.006257f, 0.000769f, -0.016176f, -0.017265f, 0.019702f, -0.000988f, 0.009190f, 0.009845f, -0.010278f, 0.018936f, 0.004929f, 0.001704f, -0.006577f, -0.012669f, 0.014859f, -0.004546f, -0.026310f, 0.015217f, 0.012853f, 0.015911f, 0.007173f, -0.018529f, -0.003886f, 0.001734f, -0.019351f, 0.011065f, 0.011100f, -0.001805f, 0.008382f, 0.007012f, 0.007492f, -0.001811f, 0.011841f, 0.001766f, -0.000467f, + -0.006001f, 0.002942f, -0.000117f, 0.009433f, 0.002036f, -0.000263f, 0.001931f, -0.000091f, 0.006940f, -0.002953f, -0.000855f, -0.004598f, 0.002357f, -0.001226f, -0.003602f, 0.000784f, 0.000970f, -0.001369f, 0.001073f, 0.007642f, 0.005769f, -0.003304f, -0.002155f, -0.004930f, 0.001282f, -0.001062f, -0.000662f, -0.034615f, 0.004255f, 0.011428f, -0.017002f, 0.014180f, -0.029377f, 0.006711f, 0.008961f, -0.003866f, -0.011633f, -0.014929f, -0.017406f, -0.029474f, 0.003766f, 0.033521f, -0.011024f, 0.016169f, 0.008993f, 0.024929f, 0.013248f, -0.009419f, -0.021399f, 0.011031f, -0.005396f, -0.007609f, -0.022175f, -0.003314f, -0.002969f, -0.008849f, -0.009488f, -0.005100f, -0.015575f, -0.020478f, 0.023905f, -0.002344f, -0.013845f, 0.018747f, 0.006637f, -0.016351f, 0.002483f, -0.001200f, 0.010691f, -0.021727f, 0.006153f, 0.007470f, -0.032057f, 0.010720f, 0.010516f, -0.016523f, 0.004790f, 0.001252f, -0.005150f, 0.011858f, 0.001144f, -0.002237f, 0.001467f, 0.008033f, 0.021700f, 0.017231f, 0.022144f, 0.015259f, 0.007927f, -0.005719f, 0.032939f, -0.008360f, -0.016791f, 0.036473f, 0.002484f, 0.022043f, + 0.004793f, -0.007069f, -0.033806f, -0.031294f, -0.007727f, 0.001980f, -0.012319f, -0.005992f, -0.009662f, 0.021520f, -0.018796f, -0.005489f, -0.003153f, 0.005254f, -0.018345f, 0.013277f, -0.001411f, 0.004199f, -0.001537f, -0.007134f, -0.011922f, -0.008030f, -0.009380f, -0.007635f, -0.002226f, 0.001220f, -0.005751f, -0.004113f, -0.003190f, 0.007871f, -0.009109f, -0.008053f, -0.006538f, -0.007754f, -0.000284f, 0.006316f, -0.002757f, -0.003091f, 0.004560f, 0.001110f, -0.002248f, 0.003090f, -0.005685f, -0.006288f, 0.004862f, -0.007333f, -0.011778f, 0.004159f, 0.010630f, -0.005626f, 0.001186f, 0.007114f, -0.002391f, -0.005847f, -0.057632f, 0.028190f, 0.049653f, 0.003449f, -0.028179f, 0.012841f, -0.005205f, -0.001975f, 0.008140f, 0.004795f, 0.012782f, -0.015041f, 0.001736f, 0.044484f, 0.034187f, 0.029885f, -0.032635f, -0.001399f, 0.008019f, 0.017059f, -0.015659f, -0.017557f, -0.004469f, 0.005613f, 0.015466f, 0.007669f, -0.041969f, -0.047653f, 0.014822f, -0.001593f, 0.026846f, 0.027499f, -0.017753f, 0.022757f, 0.018334f, 0.024309f, -0.001656f, -0.014515f, -0.015090f, 0.011612f, -0.015981f, -0.006142f, + -0.000005f, -0.000698f, 0.014554f, 0.030914f, 0.017393f, -0.008475f, -0.007296f, -0.015321f, -0.003902f, 0.001357f, 0.008371f, -0.003304f, -0.005447f, 0.015196f, 0.009575f, -0.023360f, -0.000310f, 0.000965f, 0.028078f, -0.014132f, -0.016116f, -0.030619f, -0.010389f, 0.005242f, 0.002054f, 0.015814f, -0.003408f, 0.003957f, -0.013690f, -0.020345f, -0.018448f, -0.018642f, -0.010722f, 0.008897f, -0.038414f, 0.004588f, -0.005379f, -0.006029f, -0.008121f, 0.007599f, 0.021045f, 0.015328f, 0.002439f, -0.003445f, -0.019514f, -0.006226f, -0.001797f, -0.003970f, 0.012895f, 0.006581f, 0.003938f, 0.002838f, 0.006705f, 0.007823f, -0.002988f, -0.003272f, 0.000200f, -0.003544f, 0.000684f, 0.000862f, 0.002577f, 0.004300f, -0.012480f, 0.001927f, -0.001613f, 0.009470f, 0.002573f, -0.012556f, -0.000699f, -0.007950f, -0.006090f, -0.003135f, -0.002803f, -0.003336f, -0.001584f, 0.007098f, 0.006502f, 0.005482f, 0.009392f, 0.029043f, 0.002373f, 0.025202f, -0.003449f, 0.032713f, 0.016320f, 0.025509f, 0.015680f, 0.007432f, -0.012633f, -0.001278f, -0.007907f, 0.017484f, 0.005150f, 0.015355f, -0.014661f, -0.002564f, + 0.027128f, -0.033440f, -0.018691f, 0.026065f, -0.044109f, -0.019447f, 0.003290f, -0.008420f, -0.021840f, 0.044423f, -0.007939f, 0.030686f, 0.012312f, -0.026733f, -0.004090f, -0.010054f, -0.032322f, -0.041986f, 0.033537f, -0.000305f, -0.012217f, 0.008296f, 0.000611f, -0.005574f, 0.012214f, 0.004793f, -0.004329f, -0.015445f, 0.002966f, 0.031682f, 0.026862f, -0.022156f, 0.008793f, 0.001740f, 0.025061f, -0.011408f, 0.016986f, -0.036022f, -0.008718f, 0.024596f, 0.008265f, -0.008245f, 0.029354f, -0.009337f, 0.020580f, -0.039991f, -0.046111f, -0.016625f, 0.000905f, -0.032668f, 0.035304f, 0.024913f, 0.035865f, -0.016442f, -0.012100f, -0.012436f, 0.001868f, -0.018187f, -0.000186f, -0.027797f, -0.025230f, 0.001156f, 0.007119f, 0.025755f, 0.012183f, -0.002712f, -0.009489f, 0.008106f, 0.014878f, 0.009750f, 0.005954f, -0.009156f, 0.010760f, 0.009606f, 0.012126f, 0.008977f, 0.006572f, 0.009716f, -0.013329f, 0.011248f, -0.008060f, -0.004092f, 0.017639f, 0.015588f, 0.010489f, -0.001854f, 0.000637f, -0.004707f, 0.009050f, 0.002838f, -0.003702f, 0.004912f, 0.009181f, 0.001387f, 0.007139f, 0.006934f, + -0.009179f, 0.003051f, -0.006936f, -0.002029f, 0.002184f, 0.040214f, 0.028919f, 0.045315f, -0.040244f, -0.030249f, -0.068941f, 0.029705f, -0.007676f, -0.058913f, -0.011427f, 0.005589f, 0.008677f, -0.022014f, 0.023982f, 0.020261f, 0.002275f, -0.000267f, 0.003744f, -0.009762f, -0.020514f, 0.004521f, -0.011667f, -0.019199f, -0.000252f, 0.044662f, 0.001386f, -0.006780f, -0.035716f, 0.015066f, 0.028203f, -0.014593f, -0.043094f, -0.007819f, 0.014525f, 0.005151f, -0.009148f, 0.009390f, 0.003069f, 0.015500f, -0.004358f, 0.025565f, 0.039071f, 0.014780f, -0.025980f, 0.029445f, 0.013258f, -0.033277f, -0.035412f, 0.038491f, 0.018616f, -0.014991f, -0.017280f, -0.000856f, -0.031388f, 0.022975f, 0.030269f, -0.000722f, 0.001706f, 0.007621f, -0.003877f, 0.033126f, 0.011138f, 0.008611f, -0.013737f, 0.005352f, 0.011186f, 0.040907f, -0.009821f, 0.015674f, -0.031695f, -0.036104f, 0.032192f, -0.004859f, -0.003011f, 0.003324f, 0.030685f, 0.000671f, -0.001445f, 0.019363f, -0.009268f, 0.003858f, 0.017771f, 0.021688f, -0.010375f, -0.013517f, -0.029116f, -0.014369f, 0.009509f, -0.012870f, 0.010133f, -0.000330f, + 0.010753f, -0.005832f, 0.007930f, 0.001637f, -0.004487f, 0.003488f, 0.016277f, 0.004004f, 0.016203f, 0.004877f, -0.010260f, 0.000647f, 0.006759f, 0.005596f, -0.010069f, -0.009241f, -0.009809f, -0.004225f, -0.007708f, -0.007555f, -0.011979f, -0.005176f, 0.006663f, 0.004217f, -0.001227f, -0.001973f, 0.003639f, -0.007981f, -0.000202f, 0.010216f, -0.002896f, -0.001691f, -0.004940f, -0.004189f, -0.002162f, -0.015215f, -0.002144f, -0.005927f, -0.006524f, -0.009507f, -0.013537f, -0.046658f, -0.003847f, -0.030529f, -0.061930f, -0.063827f, -0.027590f, -0.048734f, -0.022096f, -0.007874f, 0.008753f, 0.027254f, 0.030406f, 0.003113f, -0.016453f, 0.032749f, -0.016652f, 0.016141f, -0.061144f, -0.006016f, -0.041946f, -0.028154f, 0.028410f, 0.019945f, 0.019407f, 0.006452f, 0.040912f, -0.004138f, -0.002561f, -0.029472f, -0.010217f, -0.005938f, -0.020059f, -0.020260f, -0.050245f, -0.019761f, -0.005549f, -0.008105f, -0.031087f, 0.027487f, 0.010947f, 0.016399f, -0.013687f, -0.005274f, -0.076248f, -0.021981f, -0.021017f, 0.017653f, 0.039077f, -0.024080f, -0.003693f, -0.044427f, -0.003208f, 0.022858f, -0.007281f, -0.015007f, + 0.009994f, 0.032785f, 0.055952f, 0.011757f, 0.001774f, -0.003098f, -0.015011f, -0.022402f, 0.014962f, -0.014763f, 0.050753f, 0.009977f, 0.021852f, 0.103500f, -0.020600f, -0.017621f, -0.026149f, -0.036284f, -0.004923f, 0.035356f, 0.015916f, 0.005053f, 0.011766f, -0.014957f, -0.011595f, -0.031581f, -0.007562f, 0.017752f, -0.002900f, -0.006985f, -0.002965f, -0.007365f, 0.003721f, -0.001166f, 0.006884f, 0.006975f, 0.007117f, 0.009339f, 0.010227f, 0.026363f, 0.016096f, -0.009773f, 0.015346f, -0.000410f, 0.000980f, 0.011028f, -0.012755f, 0.000240f, -0.014716f, -0.008902f, -0.020143f, -0.014964f, -0.021009f, -0.017438f, -0.011681f, 0.023037f, -0.014337f, -0.008094f, -0.016911f, 0.001055f, 0.005026f, -0.003660f, 0.006945f, 0.002793f, -0.000426f, -0.014292f, -0.051798f, 0.029384f, 0.048443f, -0.028681f, 0.001444f, 0.010852f, -0.016771f, -0.004056f, -0.036247f, -0.000775f, -0.020349f, 0.052590f, -0.000050f, -0.009960f, 0.042200f, -0.010770f, 0.012234f, -0.048508f, 0.025094f, 0.007453f, 0.032710f, -0.015341f, 0.024343f, 0.043018f, 0.046216f, 0.025917f, 0.041655f, 0.021318f, -0.006701f, 0.040486f, + -0.019690f, -0.026751f, -0.008621f, 0.016218f, 0.027421f, -0.066046f, -0.004578f, -0.042720f, 0.033774f, 0.015264f, -0.000917f, 0.011586f, 0.047326f, 0.001968f, 0.042228f, 0.018006f, 0.063990f, 0.005700f, -0.007376f, 0.027997f, 0.009195f, -0.032732f, 0.006945f, -0.003875f, -0.043904f, 0.030687f, -0.026512f, -0.042842f, -0.087553f, 0.006725f, -0.010862f, 0.051382f, -0.028735f, 0.068783f, 0.022648f, -0.001223f, -0.010605f, 0.026784f, 0.028246f, -0.050438f, -0.021586f, -0.037293f, 0.012904f, -0.016869f, 0.037750f, 0.011960f, 0.012652f, 0.018207f, -0.008774f, 0.003172f, -0.013304f, -0.004675f, 0.001004f, -0.005058f, -0.038971f, 0.015299f, -0.000123f, 0.011457f, 0.000328f, -0.011534f, 0.001201f, 0.015835f, -0.025940f, 0.022250f, -0.009534f, -0.000141f, 0.002495f, -0.021816f, -0.001898f, 0.013070f, 0.006613f, -0.015692f, -0.006495f, -0.003849f, -0.018358f, 0.006083f, -0.005255f, 0.026629f, -0.021442f, 0.009443f, 0.018582f, 0.006605f, -0.007924f, -0.005927f, 0.009027f, 0.004371f, 0.005595f, -0.004802f, 0.009361f, -0.028627f, 0.007627f, 0.006788f, 0.012258f, -0.008734f, -0.013367f, 0.000953f, + 0.011999f, 0.001605f, 0.033265f, -0.022242f, -0.024888f, -0.024485f, 0.031989f, 0.016596f, 0.041655f, 0.011564f, 0.128870f, -0.038273f, 0.000693f, 0.000970f, 0.059987f, 0.024840f, 0.027775f, -0.039350f, 0.017282f, -0.015515f, 0.001114f, -0.018201f, 0.004006f, 0.043357f, -0.011409f, 0.013753f, 0.083779f, 0.026302f, -0.037945f, -0.044428f, 0.005168f, 0.054640f, 0.028495f, 0.010387f, -0.021141f, 0.046516f, 0.007897f, -0.006898f, -0.051112f, 0.015630f, -0.008121f, 0.022032f, -0.046399f, -0.028317f, 0.002419f, -0.011799f, 0.006107f, -0.043262f, -0.001492f, -0.026387f, 0.012261f, 0.038367f, 0.030667f, 0.010042f, -0.059365f, 0.000506f, 0.005870f, -0.053492f, -0.047779f, -0.031659f, -0.026122f, -0.026074f, 0.042345f, 0.009679f, -0.001211f, 0.027616f, 0.044030f, 0.011755f, 0.038133f, 0.001040f, 0.025247f, 0.168371f, -0.038415f, 0.027750f, 0.019329f, -0.029577f, 0.006268f, -0.112177f, 0.002262f, 0.055716f, 0.014584f, -0.030856f, 0.042894f, 0.010348f, 0.016320f, -0.027983f, -0.006351f, -0.023905f, 0.008408f, 0.002095f, 0.002136f, 0.009619f, -0.034757f, 0.012882f, -0.019063f, -0.013858f, + -0.047589f, 0.011828f, 0.010942f, 0.009503f, 0.012267f, 0.059589f, 0.009008f, 0.006390f, 0.006853f, 0.004678f, 0.035623f, 0.004201f, 0.015052f, 0.012473f, 0.027181f, 0.010939f, -0.001615f, -0.006002f, -0.004925f, 0.004525f, 0.017247f, 0.020584f, 0.006105f, -0.031259f, -0.014347f, -0.006917f, -0.006911f, -0.010325f, -0.032641f, -0.007929f, 0.025086f, 0.068172f, -0.031690f, -0.001613f, -0.045729f, -0.033210f, 0.010835f, 0.029884f, -0.037831f, 0.045189f, 0.018954f, -0.059280f, 0.036489f, -0.023992f, -0.029358f, -0.002435f, -0.035507f, 0.008378f, -0.015886f, 0.045863f, -0.026397f, -0.002066f, 0.025255f, -0.088478f, 0.012699f, 0.027496f, -0.026687f, 0.021824f, -0.053455f, 0.053489f, 0.005869f, 0.009239f, -0.101172f, 0.091368f, 0.039193f, 0.030027f, 0.002038f, -0.057672f, 0.052927f, -0.003344f, -0.026185f, 0.093438f, -0.018573f, -0.040981f, -0.021581f, 0.011317f, 0.027058f, 0.025629f, 0.006843f, -0.015710f, -0.109948f, -0.012384f, 0.027541f, 0.001644f, 0.040408f, -0.057689f, 0.059611f, 0.006091f, 0.020176f, -0.058636f, -0.016931f, 0.009488f, 0.075972f, -0.031543f, 0.017776f, -0.054321f, + 0.048115f, 0.026995f, 0.045408f, -0.017455f, 0.020138f, 0.007887f, -0.059390f, -0.056700f, 0.031237f, 0.025549f, 0.048435f, 0.010420f, 0.062152f, -0.093565f, -0.122465f, 0.019611f, -0.025819f, 0.069268f, -0.045132f, -0.009728f, 0.008004f, -0.052106f, 0.002605f, -0.031084f, 0.027150f, 0.038528f, 0.003867f, 0.031272f, 0.034370f, 0.010263f, -0.031003f, -0.015606f, 0.055278f, 0.028821f, 0.007193f, 0.009732f, -0.016553f, 0.001393f, 0.033664f, 0.018934f, -0.027217f, -0.015322f, 0.031324f, -0.004350f, 0.019526f, 0.019692f, -0.012021f, -0.015904f, -0.016136f, 0.000226f, 0.016724f, 0.007660f, 0.021389f, 0.030740f, 0.002536f, -0.000864f, 0.025018f, 0.001659f, 0.005047f, 0.008022f, -0.010437f, 0.008682f, -0.018267f, 0.010537f, 0.003774f, 0.000550f, 0.007686f, -0.009112f, -0.085617f, 0.077965f, -0.016901f, -0.018911f, -0.030509f, -0.008963f, -0.067522f, -0.126031f, 0.043447f, 0.036102f, -0.005603f, -0.026035f, -0.051368f, -0.008542f, -0.015964f, -0.027353f, 0.049591f, -0.112714f, -0.048182f, -0.059533f, -0.017777f, -0.085834f, -0.007945f, -0.012979f, -0.003113f, -0.014424f, -0.017431f, 0.013767f, + -0.000883f, -0.038014f, -0.011922f, -0.000908f, -0.051981f, -0.027799f, -0.015354f, 0.003748f, 0.039968f, -0.020561f, 0.080137f, -0.041918f, -0.006023f, 0.033676f, -0.035768f, 0.021710f, 0.004545f, -0.054972f, -0.082216f, -0.020174f, 0.020984f, 0.074953f, 0.032511f, -0.057448f, -0.024304f, -0.164892f, -0.055183f, -0.011905f, 0.034687f, 0.089526f, -0.004747f, -0.095920f, 0.005333f, 0.052087f, -0.019165f, -0.004540f, 0.055236f, 0.058125f, 0.133370f, -0.147365f, -0.028567f, 0.020885f, 0.037299f, -0.046514f, -0.055217f, -0.078799f, -0.078227f, -0.043766f, -0.036367f, -0.010246f, -0.005592f, -0.091038f, -0.037725f, -0.033366f, 0.033710f, -0.017182f, -0.008965f, 0.082002f, 0.062115f, 0.004986f, -0.011704f, -0.003757f, -0.050644f, -0.002250f, 0.018054f, -0.036592f, -0.019597f, 0.006941f, 0.023147f, -0.015509f, -0.017926f, -0.012130f, 0.025829f, -0.017082f, 0.027067f, 0.001940f, 0.027954f, 0.019862f, 0.020152f, -0.015387f, 0.010207f, -0.038355f, 0.019808f, -0.005039f, 0.011685f, -0.033911f, -0.026252f, -0.003798f, 0.008782f, -0.019089f, 0.000518f, -0.042984f, -0.007517f, -0.005150f, 0.018430f, 0.022777f, + -0.027340f, 0.056144f, 0.001196f, 0.020842f, 0.012522f, 0.040681f, 0.040802f, -0.001966f, 0.025968f, -0.048649f, 0.011389f, -0.019842f, -0.117168f, 0.026189f, -0.020265f, 0.034291f, -0.032592f, -0.033526f, 0.002194f, -0.049162f, 0.008039f, -0.049566f, -0.001298f, -0.008845f, -0.019642f, 0.023474f, -0.037121f, -0.048245f, -0.044149f, -0.056608f, -0.009767f, -0.006404f, 0.062143f, 0.013588f, -0.045941f, -0.068008f, 0.008545f, -0.001665f, 0.015775f, -0.013432f, 0.037501f, -0.044793f, -0.018085f, -0.062812f, -0.040441f, -0.018218f, 0.001690f, -0.026644f, 0.064815f, -0.023007f, -0.056132f, 0.017099f, 0.067281f, 0.048903f, 0.019650f, -0.048072f, -0.031579f, -0.005088f, 0.061048f, 0.117469f, -0.001482f, 0.022962f, -0.022973f, -0.115335f, -0.025698f, 0.010276f, 0.043026f, 0.098079f, -0.054823f, -0.066818f, 0.038697f, 0.018379f, -0.023537f, 0.002940f, -0.037014f, 0.022453f, -0.097731f, -0.011367f, 0.005183f, 0.023484f, -0.059080f, 0.067550f, -0.095588f, -0.108489f, -0.100416f, 0.050360f, -0.020915f, 0.095213f, -0.133310f, -0.058042f, 0.010297f, 0.135608f, -0.011270f, -0.024277f, -0.075038f, -0.027449f, + -0.009081f, 0.065359f, -0.005901f, -0.000379f, 0.003570f, 0.011289f, 0.000962f, -0.001049f, -0.028597f, -0.024154f, 0.030905f, 0.013725f, 0.003468f, -0.071136f, 0.017505f, -0.018329f, -0.008718f, -0.036839f, 0.001353f, -0.003334f, -0.007026f, -0.083673f, 0.007439f, -0.018529f, -0.009870f, -0.007261f, 0.013894f, -0.000291f, 0.004891f, -0.000574f, 0.000221f, -0.000268f, 0.000108f, -0.030507f, -0.006183f, -0.019626f, -0.017117f, 0.014572f, 0.014897f, -0.024463f, 0.000674f, -0.017423f, 0.022525f, -0.008413f, 0.069562f, 0.021342f, -0.123912f, -0.021894f, -0.085463f, 0.038301f, 0.007245f, -0.170423f, 0.011726f, -0.052352f, -0.110384f, -0.085836f, -0.125983f, 0.078166f, -0.038370f, -0.099109f, -0.044510f, 0.032390f, -0.059054f, -0.050916f, -0.039734f, -0.023506f, -0.043814f, -0.043472f, -0.080418f, -0.058105f, -0.110364f, -0.062154f, -0.056074f, -0.018371f, -0.051897f, -0.010457f, -0.024185f, -0.001261f, 0.004413f, 0.014962f, 0.031187f, -0.030227f, 0.025987f, 0.003409f, 0.056986f, 0.025010f, 0.035698f, 0.036071f, -0.103358f, -0.026940f, 0.083516f, -0.013967f, -0.051240f, -0.057803f, -0.042729f, 0.033657f, + 0.134634f, -0.008580f, -0.001663f, -0.089752f, -0.091549f, -0.019062f, 0.019351f, 0.080634f, -0.005133f, 0.073528f, 0.027505f, -0.088154f, 0.160161f, 0.003410f, 0.124734f, 0.000665f, -0.031298f, 0.067107f, -0.089045f, -0.115255f, -0.073636f, -0.255734f, -0.154928f, -0.050597f, 0.117826f, 0.072355f, -0.102258f, -0.067237f, -0.156519f, 0.078232f, 0.104416f, -0.079871f, -0.079731f, 0.018804f, 0.069198f, 0.098105f, 0.027959f, 0.056412f, -0.051551f, -0.028343f, -0.038690f, -0.059378f, -0.023824f, -0.005097f, 0.006452f, 0.002741f, -0.031872f, 0.005388f, 0.023016f, 0.007562f, -0.004334f, -0.023380f, -0.015156f, -0.026687f, -0.009150f, -0.039573f, -0.007612f, 0.024792f, -0.037785f, -0.062706f, -0.008234f, -0.041070f, -0.027123f, -0.004630f, -0.052118f, -0.040840f, -0.009617f, 0.025671f, 0.027523f, 0.029586f, 0.000601f, -0.022475f, -0.002519f, 0.009731f, -0.012230f, 0.039674f, 0.003317f, 0.029302f, 0.003225f, 0.000130f, 0.030646f, 0.022777f, 0.034293f, 0.070988f, 0.046337f, 0.053022f, 0.046004f, -0.043528f, -0.105703f, 0.122929f, 0.117548f, -0.074333f, -0.096450f, -0.000448f, 0.105474f, -0.011432f, + -0.006124f, -0.032858f, 0.092231f, -0.010222f, -0.024617f, -0.002241f, 0.025471f, 0.047361f, 0.001267f, -0.035550f, -0.040474f, 0.056920f, 0.004223f, -0.024447f, -0.060868f, 0.034620f, 0.019092f, -0.006906f, -0.047978f, 0.015102f, 0.020636f, 0.017151f, -0.030350f, -0.018190f, 0.005352f, 0.046974f, -0.013821f, 0.016887f, -0.069084f, -0.019199f, 0.000100f, 0.045516f, -0.096165f, -0.017152f, 0.009342f, 0.069238f, -0.033279f, 0.010761f, -0.049147f, 0.006728f, 0.020324f, -0.033764f, -0.025781f, -0.003974f, 0.011225f, 0.021141f, -0.021937f, 0.001517f, -0.085717f, 0.046411f, -0.014351f, 0.080317f, -0.049805f, 0.035854f, -0.033908f, 0.037277f, 0.006931f, 0.025014f, 0.021140f, -0.062329f, 0.070506f, 0.013985f, 0.040661f, -0.068795f, 0.019095f, -0.017468f, 0.010903f, -0.019581f, 0.002692f, -0.004724f, 0.009342f, 0.023428f, -0.003718f, -0.027473f, -0.016414f, 0.007079f, -0.003759f, 0.001774f, -0.010771f, -0.026761f, 0.008932f, 0.007169f, -0.008375f, -0.007543f, -0.000561f, -0.008360f, 0.001198f, -0.014536f, -0.000531f, -0.007079f, 0.011980f, 0.007078f, -0.005064f, -0.010780f, 0.003678f, 0.000339f, + -0.009585f, 0.006997f, -0.029481f, -0.000226f, -0.003520f, 0.013140f, -0.000566f, 0.033928f, -0.022565f, -0.022832f, -0.007862f, 0.017929f, -0.024428f, 0.036390f, -0.030622f, 0.015458f, -0.015053f, 0.033175f, -0.029733f, 0.036496f, -0.020795f, 0.028540f, -0.025834f, 0.044344f, -0.041792f, 0.032119f, -0.009679f, 0.024177f, -0.022537f, 0.023757f, -0.025505f, 0.026795f, -0.025652f, 0.021497f, -0.017145f, 0.023752f, -0.018382f, 0.019811f, -0.018228f, 0.005776f, -0.005939f, 0.011937f, -0.008862f, 0.009644f, -0.007594f, 0.007536f, -0.004940f, 0.009866f, -0.036048f, -0.080117f, -0.106523f, 0.077635f, 0.051501f, -0.060768f, -0.086573f, -0.042447f, 0.040051f, 0.020982f, 0.053286f, 0.057346f, 0.011224f, -0.028978f, -0.008454f, 0.020034f, -0.019753f, -0.001660f, 0.011856f, 0.003210f, 0.032110f, 0.022411f, 0.009727f, -0.028961f, -0.001083f, -0.017954f, 0.018630f, -0.030343f, -0.026254f, 0.021946f, -0.007001f, -0.012384f, -0.012118f, -0.021114f, -0.028878f, 0.002154f, 0.023578f, 0.021463f, 0.018038f, -0.006911f, -0.023811f, -0.020738f, -0.014466f, 0.025660f, 0.034977f, -0.016361f, -0.024451f, -0.010634f, + 0.029025f, 0.014935f, 0.038831f, -0.027507f, -0.010442f, 0.015285f, -0.007321f, 0.001222f, -0.004163f, 0.013726f, 0.008263f, 0.011077f, 0.002336f, -0.026325f, 0.010873f, 0.004832f, -0.000974f, 0.020293f, -0.010570f, -0.005250f, 0.003511f, -0.003801f, 0.002607f, -0.007657f, 0.034468f, 0.008619f, -0.002791f, 0.032798f, 0.032895f, -0.033479f, -0.050627f, -0.018594f, -0.034676f, 0.000999f, 0.022931f, 0.006517f, -0.020742f, -0.025054f, -0.006677f, -0.004862f, 0.019927f, 0.009481f, 0.012419f, 0.018638f, 0.011393f, -0.010447f, 0.011536f, 0.008154f, -0.024371f, -0.032687f, 0.009778f, -0.008641f, 0.016246f, 0.011900f, -0.017915f, -0.004816f, -0.006088f, -0.006591f, -0.020817f, -0.011444f, -0.001298f, 0.006554f, 0.009937f, 0.027659f, -0.013786f, -0.010334f, 0.007089f, -0.006450f, 0.036523f, -0.088720f, -0.233572f, -0.085866f, 0.041896f, 0.121509f, 0.256637f, 0.171733f, 0.044203f, 0.065085f, -0.034293f, -0.104465f, -0.173477f, -0.150948f, -0.119999f, -0.034615f, 0.004624f, 0.083483f, 0.092054f, 0.195935f, 0.095134f, 0.062713f, -0.004912f, -0.041780f, -0.094305f, -0.048988f, -0.076254f, -0.087965f, + -0.054142f, -0.045352f, -0.003371f, 0.024486f, 0.073322f, 0.045301f, 0.052635f, 0.047814f, 0.048363f, 0.072701f, 0.006292f, 0.050365f, -0.009329f, -0.022644f, -0.061354f, -0.036590f, -0.091506f, -0.134747f, -0.117700f, 0.001365f, -0.020004f, 0.036922f, 0.063312f, 0.034683f, 0.097653f, 0.085228f, 0.123418f, 0.070218f, 0.083709f, 0.004117f, 0.004138f, -0.066016f, -0.107792f, -0.126020f, -0.151230f, -0.099447f, -0.123586f, -0.010427f, -0.000466f, 0.059471f, 0.062438f, 0.149380f, 0.117397f, 0.166866f, 0.067769f, 0.077994f, 0.032570f, -0.000739f, -0.099561f, -0.162488f, -0.108753f, -0.129820f, -0.080826f, -0.087919f, -0.008181f, 0.013552f, 0.051897f, 0.068003f, 0.092228f, 0.094066f, 0.090527f, 0.059210f, 0.064835f, 0.016827f, -0.011708f, -0.022310f, -0.072938f, -0.066585f, -0.087332f, -0.061793f, -0.087300f, -0.066603f, -0.006909f, 0.015546f, 0.046082f, 0.069454f, 0.062043f, 0.063845f, 0.105318f, 0.038066f, 0.064320f, 0.049290f, -0.066344f, -0.120215f, -0.052060f, -0.106009f, -0.066766f, -0.036415f, -0.007538f, 0.009379f, 0.033779f, 0.061077f, 0.042588f, 0.065708f, 0.041779f, 0.035741f, + 0.014472f, -0.004106f, -0.038187f, -0.012633f, -0.017898f, -0.067123f, -0.062625f, -0.017357f, -0.007059f, 0.003473f, 0.022056f, 0.025675f, 0.032704f, 0.026010f, 0.025855f, 0.009588f, 0.008724f, -0.000494f, -0.014676f, -0.007435f, -0.005390f, -0.015113f, -0.023948f, -0.008361f, -0.012079f, -0.014281f, -0.001866f, 0.005924f, 0.006823f, 0.009928f, 0.011066f, 0.010288f, 0.004310f, 0.001968f, 0.001330f, 0.001369f} + }, + { + {0.014252f, 0.001519f, -0.003851f, -0.004029f, 0.002484f, -0.006883f, -0.000100f, -0.013414f, 0.009628f, 0.012208f, 0.008530f, 0.012014f, -0.014405f, 0.001171f, 0.003302f, -0.005134f, -0.003951f, -0.003509f, -0.016872f, -0.002835f, 0.010042f, -0.017274f, -0.014036f, 0.008179f, 0.007415f, -0.011098f, -0.003866f, 0.007355f, 0.000949f, 0.008941f, 0.003836f, 0.009313f, -0.005837f, 0.001786f, 0.001298f, -0.002468f, 0.004342f, 0.003412f, 0.006326f, 0.002657f, -0.002782f, 0.000611f, 0.007067f, -0.001904f, -0.003202f, -0.001190f, -0.008528f, -0.018836f, 0.011210f, 0.005442f, -0.005886f, 0.008270f, -0.003301f, 0.000919f, -0.000281f, 0.003845f, -0.004963f, -0.001289f, 0.011141f, -0.010480f, -0.004195f, 0.003645f, 0.001827f, -0.001619f, -0.000508f, 0.004883f, 0.000567f, 0.004323f, -0.007463f, 0.007606f, 0.003921f, -0.009738f, 0.007769f, 0.000691f, 0.002821f, -0.001161f, -0.002887f, -0.011367f, -0.003509f, -0.000849f, 0.005853f, -0.001499f, 0.004789f, -0.002856f, 0.000577f, 0.001426f, 0.000582f, 0.003393f, -0.000596f, 0.000236f, -0.000405f, -0.002301f, -0.001040f, 0.000454f, -0.001227f, 0.000164f, + -0.000047f, -0.000522f, 0.003119f, 0.003129f, 0.001637f, 0.001305f, 0.001143f, 0.000405f, 0.000022f, 0.000419f, 0.000181f, -0.000472f, -0.001378f, -0.001559f, 0.022253f, -0.012816f, 0.003898f, -0.014164f, 0.001692f, 0.003300f, -0.014279f, -0.018053f, 0.004496f, -0.019586f, 0.004304f, -0.005116f, -0.001362f, -0.012017f, -0.001751f, -0.013493f, -0.006941f, 0.000043f, -0.014274f, 0.015147f, 0.005327f, -0.023669f, 0.002237f, -0.001315f, -0.004295f, -0.010139f, 0.005078f, 0.012262f, 0.000234f, -0.000917f, 0.011511f, -0.006782f, 0.000137f, -0.004322f, 0.007625f, -0.008957f, 0.002613f, 0.010756f, -0.009385f, 0.009404f, 0.003301f, 0.010173f, -0.000886f, 0.002296f, -0.001554f, -0.004318f, 0.013334f, -0.016582f, 0.003810f, -0.007350f, -0.003197f, -0.002180f, -0.006044f, -0.004479f, -0.013218f, -0.008320f, -0.002077f, 0.008577f, -0.000746f, 0.003206f, 0.012019f, -0.000305f, -0.010448f, -0.001367f, 0.000363f, 0.003239f, -0.005108f, -0.000011f, -0.010277f, 0.000190f, -0.004194f, 0.003363f, 0.005319f, 0.007818f, 0.002781f, -0.004459f, -0.005780f, 0.007673f, -0.002594f, -0.003559f, 0.001422f, 0.004253f, + 0.008858f, 0.001050f, 0.002531f, -0.000611f, 0.005187f, -0.001043f, -0.004138f, -0.002140f, -0.002056f, -0.000219f, 0.003513f, 0.000657f, -0.000249f, -0.001907f, 0.003403f, -0.000040f, -0.001296f, -0.000990f, -0.000890f, -0.001028f, 0.001610f, -0.000717f, -0.000185f, -0.002008f, -0.005358f, -0.018434f, -0.000218f, -0.011110f, -0.003506f, -0.001812f, -0.012956f, -0.001776f, -0.003018f, 0.006427f, 0.015110f, 0.015195f, 0.001807f, -0.006499f, 0.006077f, -0.014724f, -0.002105f, -0.005637f, 0.005132f, -0.021941f, 0.007746f, 0.003711f, -0.000801f, -0.006317f, -0.009457f, -0.004328f, -0.007802f, -0.006717f, 0.004104f, -0.001474f, -0.008409f, -0.002459f, 0.001703f, 0.014318f, -0.000553f, -0.014478f, 0.001133f, 0.006225f, -0.000181f, -0.004562f, 0.001201f, 0.005442f, -0.015726f, -0.001231f, -0.006838f, 0.011041f, 0.006727f, 0.001866f, -0.014538f, 0.001637f, 0.005600f, 0.008908f, 0.008342f, -0.009562f, -0.004493f, 0.000427f, -0.002986f, -0.003002f, 0.007771f, -0.004828f, 0.004757f, 0.001299f, -0.006109f, -0.001384f, -0.008393f, 0.010106f, 0.003798f, -0.009996f, -0.006890f, 0.001682f, 0.005302f, -0.007931f, + -0.009996f, -0.001706f, 0.000497f, -0.006653f, 0.001431f, -0.002733f, 0.003374f, -0.006341f, 0.009423f, 0.005044f, 0.007104f, 0.002027f, 0.000938f, 0.006388f, 0.008647f, 0.001006f, 0.002458f, -0.000828f, 0.001231f, 0.000145f, -0.000359f, 0.000964f, 0.000729f, 0.001001f, -0.001364f, 0.000048f, 0.000666f, -0.000484f, 0.000154f, 0.002880f, -0.001675f, 0.000656f, -0.002006f, -0.001610f, -0.001344f, 0.000296f, 0.001094f, 0.000735f, 0.000102f, -0.001868f, -0.001235f, -0.031374f, 0.010128f, 0.009057f, 0.015175f, -0.003954f, 0.009524f, -0.027063f, -0.007412f, 0.008461f, 0.000988f, -0.013395f, -0.003504f, -0.004469f, -0.023714f, -0.009619f, 0.002383f, -0.001105f, -0.016914f, 0.010535f, 0.014975f, -0.015418f, 0.011667f, -0.020186f, -0.006883f, -0.001828f, 0.006919f, -0.000128f, -0.008203f, 0.005514f, 0.002732f, -0.001367f, 0.008985f, -0.004382f, -0.005834f, -0.001832f, -0.003343f, -0.005989f, 0.008836f, -0.006833f, 0.002481f, 0.006617f, -0.001381f, -0.005296f, -0.009935f, -0.001224f, -0.007099f, -0.002181f, -0.008254f, -0.002247f, 0.018259f, 0.000351f, 0.011089f, -0.010232f, 0.009299f, -0.002940f, + -0.014979f, -0.008842f, 0.008241f, -0.005457f, -0.007635f, 0.005434f, -0.008972f, 0.007418f, 0.001967f, -0.002773f, 0.009696f, 0.008763f, 0.003843f, -0.009677f, -0.010963f, -0.000780f, 0.014514f, 0.002869f, 0.002171f, -0.008271f, 0.002114f, 0.005205f, -0.011134f, -0.004085f, 0.003573f, 0.007729f, 0.003810f, 0.006540f, -0.000406f, 0.000043f, 0.002381f, 0.000290f, -0.001284f, 0.000378f, -0.000985f, -0.001420f, -0.004947f, -0.003944f, 0.001160f, -0.002379f, -0.001443f, 0.001638f, 0.000710f, 0.001195f, -0.000345f, 0.001996f, -0.001338f, 0.000084f, -0.001765f, 0.000008f, -0.002134f, 0.001039f, 0.000323f, 0.001428f, -0.002773f, -0.016854f, -0.016025f, -0.010617f, 0.001904f, -0.002765f, 0.006460f, -0.005856f, -0.000064f, 0.001082f, -0.004836f, -0.001883f, 0.003946f, -0.004795f, 0.018589f, -0.012320f, 0.008567f, -0.003290f, -0.001355f, -0.008769f, -0.002469f, -0.001281f, 0.013530f, -0.009377f, 0.001138f, 0.002555f, -0.013431f, -0.008245f, -0.009201f, -0.007836f, -0.015558f, -0.005418f, 0.005484f, 0.010410f, 0.006566f, -0.012442f, -0.017513f, -0.003915f, 0.000449f, -0.008962f, 0.001542f, -0.006118f, + -0.009178f, -0.021663f, -0.010931f, -0.015211f, 0.008629f, -0.004001f, 0.006995f, -0.008776f, -0.021122f, -0.011244f, 0.000953f, -0.004375f, -0.006990f, -0.003230f, -0.008371f, 0.011144f, 0.000919f, 0.006450f, 0.008664f, 0.002126f, -0.000452f, -0.007386f, 0.000234f, 0.009420f, -0.001732f, -0.007134f, -0.009853f, 0.015563f, -0.013116f, -0.018277f, -0.012936f, -0.007490f, -0.010194f, 0.011296f, 0.018082f, -0.014578f, -0.010083f, 0.002140f, 0.008725f, 0.013456f, 0.010624f, 0.008273f, 0.008161f, -0.003016f, -0.003699f, -0.004215f, -0.004362f, 0.003261f, -0.002708f, 0.000819f, -0.003284f, -0.005233f, -0.002187f, -0.003795f, 0.002626f, -0.002405f, -0.004672f, -0.002768f, -0.002736f, -0.004696f, -0.005181f, -0.003277f, -0.001374f, 0.000927f, 0.000830f, 0.002305f, 0.000219f, -0.007998f, 0.000852f, -0.001307f, -0.003267f, 0.000841f, -0.001468f, -0.002479f, -0.005269f, -0.004363f, 0.000060f, -0.000076f, -0.001826f, -0.002091f, -0.000081f, 0.004301f, -0.034423f, 0.010615f, -0.002447f, 0.006085f, 0.018863f, 0.007403f, -0.004684f, 0.006383f, -0.014218f, 0.008778f, 0.010291f, -0.018755f, -0.004022f, -0.009499f, + 0.010559f, 0.009196f, 0.014334f, 0.016641f, -0.021646f, -0.011147f, 0.003548f, 0.018576f, -0.007067f, 0.008635f, -0.020696f, -0.006251f, -0.007270f, -0.004391f, -0.012537f, 0.003099f, -0.020491f, 0.014183f, -0.004038f, -0.003636f, 0.010347f, -0.000620f, 0.002349f, 0.011014f, 0.000282f, 0.009016f, 0.006023f, -0.002552f, -0.003571f, -0.001217f, -0.014393f, -0.010537f, -0.013153f, -0.000828f, 0.027292f, 0.006345f, 0.005264f, -0.000638f, -0.003832f, -0.000225f, 0.016302f, -0.003486f, 0.005089f, -0.031484f, 0.028957f, -0.007017f, -0.005194f, 0.001670f, 0.017728f, 0.006464f, -0.002990f, -0.010792f, 0.031028f, -0.005981f, -0.000397f, 0.009953f, -0.007885f, -0.000044f, 0.004431f, -0.006988f, 0.006112f, 0.006096f, 0.025619f, -0.012754f, -0.016081f, -0.002945f, 0.007653f, -0.009643f, 0.002130f, 0.006638f, 0.002098f, -0.005630f, 0.002519f, 0.006807f, -0.004311f, 0.000619f, -0.007359f, -0.002294f, -0.002180f, -0.005981f, 0.007848f, -0.005688f, -0.004856f, 0.003608f, -0.000251f, -0.006745f, -0.000634f, 0.001647f, 0.002883f, 0.000346f, 0.003396f, -0.002435f, -0.002118f, -0.001981f, 0.002273f, -0.002482f, + 0.004059f, 0.000465f, -0.001748f, 0.001888f, 0.004239f, -0.000095f, -0.001956f, 0.014898f, 0.008358f, 0.016579f, -0.006628f, -0.003938f, 0.009556f, -0.015287f, 0.013771f, 0.015715f, -0.007866f, -0.001317f, -0.024679f, 0.001178f, 0.008506f, 0.006885f, -0.005219f, -0.016788f, -0.034066f, 0.000557f, -0.005783f, -0.016164f, 0.003783f, 0.010880f, -0.014784f, -0.006296f, -0.016125f, 0.008173f, 0.000937f, -0.002394f, -0.005354f, -0.006988f, 0.017409f, 0.020308f, 0.007907f, 0.009681f, -0.004511f, -0.010183f, 0.028319f, 0.007049f, -0.004814f, -0.016614f, 0.012266f, 0.000521f, 0.016290f, -0.001425f, 0.020128f, 0.010074f, 0.014090f, 0.011919f, 0.006083f, 0.015673f, 0.019558f, -0.000548f, 0.003628f, -0.006228f, -0.000187f, 0.010680f, 0.004480f, 0.005815f, -0.017267f, -0.006331f, -0.003629f, -0.015035f, -0.014373f, -0.009464f, 0.008080f, 0.016629f, 0.021739f, 0.028438f, 0.006349f, 0.002504f, 0.022923f, -0.009109f, -0.017237f, -0.005992f, -0.008716f, 0.014844f, 0.012141f, 0.004664f, -0.016320f, -0.004430f, 0.002950f, 0.002398f, -0.003145f, -0.007510f, 0.002346f, 0.001950f, 0.009499f, -0.002240f, + -0.005188f, 0.001125f, 0.001884f, 0.002349f, 0.000227f, 0.000169f, 0.001929f, 0.004368f, -0.003008f, -0.002946f, 0.000343f, -0.000335f, -0.004240f, -0.000947f, -0.005423f, 0.006036f, 0.001992f, -0.004078f, -0.000109f, 0.004111f, -0.002062f, -0.000313f, -0.003190f, 0.001851f, 0.002210f, -0.001386f, 0.005267f, 0.004003f, 0.026315f, -0.024920f, -0.011710f, -0.003333f, 0.010091f, -0.023311f, 0.014767f, -0.022966f, 0.011327f, -0.000054f, 0.012017f, 0.019021f, -0.007764f, 0.017374f, 0.018997f, 0.018065f, -0.010446f, 0.015241f, -0.016377f, -0.013052f, -0.002016f, -0.010083f, -0.000146f, -0.008668f, 0.014929f, -0.011022f, 0.003295f, -0.010881f, -0.019123f, -0.008900f, -0.004018f, 0.023148f, -0.019380f, 0.018237f, 0.008031f, -0.026840f, 0.030821f, 0.007612f, 0.003449f, 0.021661f, 0.003854f, 0.000998f, -0.012244f, -0.000037f, -0.006833f, 0.024697f, 0.010430f, 0.017320f, -0.006727f, -0.004055f, 0.011916f, 0.020577f, -0.021472f, 0.021323f, 0.003900f, -0.003433f, -0.003996f, -0.020207f, 0.009764f, -0.009520f, 0.004129f, 0.000930f, -0.018335f, 0.006226f, 0.015541f, -0.014078f, 0.009861f, 0.006485f, + 0.021749f, 0.002343f, -0.001459f, 0.013228f, 0.019021f, 0.001579f, -0.010901f, 0.012799f, -0.014713f, -0.007636f, 0.003933f, -0.005929f, 0.003980f, -0.004747f, 0.001897f, 0.008253f, 0.006012f, -0.005975f, 0.005254f, -0.003060f, 0.004236f, -0.004185f, 0.013244f, 0.001368f, 0.012645f, -0.001485f, 0.003172f, -0.002639f, -0.001094f, -0.004003f, 0.008014f, 0.003398f, -0.006602f, 0.006937f, 0.008030f, -0.000856f, -0.001104f, 0.004934f, -0.000350f, -0.000383f, 0.006684f, -0.000172f, 0.001640f, 0.004349f, 0.002821f, -0.001005f, 0.005103f, -0.004192f, -0.000781f, 0.001018f, 0.001377f, 0.001170f, -0.000293f, -0.000570f, -0.005091f, 0.002452f, 0.007557f, -0.021243f, -0.015197f, 0.023118f, -0.029603f, 0.007468f, -0.015754f, 0.017601f, -0.018803f, 0.028748f, 0.009977f, 0.002787f, -0.024926f, 0.012716f, 0.021129f, 0.005584f, -0.012805f, -0.008332f, -0.007321f, 0.019604f, 0.010681f, -0.027354f, 0.003891f, -0.019353f, -0.001044f, 0.002216f, -0.016516f, 0.021685f, 0.021793f, -0.009884f, 0.004800f, 0.014765f, -0.018006f, -0.002747f, -0.005523f, -0.014937f, 0.031787f, -0.011548f, -0.007072f, -0.016000f, + -0.026682f, -0.004245f, 0.000528f, -0.009239f, 0.004004f, -0.022118f, 0.001985f, 0.001552f, -0.004395f, 0.017467f, -0.003605f, -0.013606f, 0.007118f, -0.000022f, -0.010134f, 0.008716f, 0.037690f, -0.007545f, 0.009008f, 0.002040f, -0.025526f, -0.004172f, 0.022865f, 0.010273f, 0.022701f, -0.002335f, 0.013148f, -0.018059f, 0.008153f, 0.007962f, 0.002722f, -0.015352f, 0.014239f, 0.004999f, -0.039732f, 0.003089f, -0.007126f, 0.026599f, -0.010154f, 0.020650f, 0.019205f, 0.015371f, -0.001838f, 0.005890f, 0.000974f, 0.001536f, -0.002520f, -0.004400f, 0.010471f, 0.004181f, -0.000064f, -0.006914f, -0.009561f, -0.002263f, 0.004213f, 0.006735f, 0.004923f, 0.008646f, 0.000393f, -0.002363f, -0.003485f, -0.002810f, 0.003228f, 0.005161f, -0.000381f, 0.004067f, 0.002782f, 0.000733f, 0.003853f, -0.000743f, 0.004027f, -0.006528f, -0.007936f, -0.010617f, -0.000389f, 0.004793f, 0.002306f, -0.005004f, -0.001687f, -0.003515f, -0.003730f, 0.006442f, 0.002107f, 0.002849f, -0.046490f, 0.052570f, 0.006200f, 0.020752f, -0.038140f, 0.020826f, 0.027100f, -0.031229f, 0.011902f, 0.015467f, 0.011965f, -0.020178f, + 0.002650f, 0.003566f, -0.006811f, 0.011787f, 0.024275f, -0.019483f, -0.016215f, -0.005927f, 0.020578f, 0.017800f, 0.025166f, -0.001209f, 0.010630f, -0.018748f, -0.004913f, -0.004867f, 0.004115f, 0.011835f, 0.032166f, 0.019158f, 0.011693f, 0.006122f, -0.001068f, 0.015372f, -0.005690f, -0.027597f, -0.005362f, 0.008120f, 0.008814f, -0.016149f, -0.012236f, -0.020001f, 0.003862f, -0.001584f, 0.007022f, -0.013110f, 0.023483f, 0.022964f, -0.019883f, 0.047276f, 0.002166f, -0.004339f, -0.000271f, -0.009836f, -0.002130f, -0.003022f, -0.019118f, 0.000322f, 0.000056f, 0.012554f, -0.039781f, 0.009750f, -0.014102f, 0.028901f, 0.034895f, 0.015110f, 0.014497f, 0.006525f, 0.002328f, 0.031509f, -0.005912f, -0.023292f, 0.019935f, -0.010488f, 0.005343f, 0.015568f, 0.028382f, 0.003993f, 0.002798f, -0.022719f, -0.000991f, 0.006652f, 0.018014f, -0.007825f, 0.009784f, 0.004724f, -0.006900f, 0.018302f, 0.003085f, 0.008208f, -0.005335f, -0.001683f, -0.005287f, 0.000898f, 0.002101f, -0.002785f, -0.000163f, 0.005516f, -0.003047f, 0.005590f, 0.003758f, -0.003893f, -0.000419f, 0.002600f, -0.001653f, 0.000450f, + -0.003754f, -0.012337f, -0.003553f, -0.001873f, 0.012897f, 0.015979f, 0.001562f, 0.002358f, -0.004596f, -0.005335f, 0.001338f, 0.001752f, -0.006687f, -0.005178f, -0.003479f, -0.003014f, 0.004281f, -0.007387f, -0.000366f, -0.005426f, 0.019119f, 0.003660f, -0.013314f, 0.012396f, 0.018605f, 0.016160f, 0.010198f, 0.019279f, -0.023461f, -0.014969f, 0.002603f, -0.021225f, -0.005304f, -0.003624f, 0.004657f, -0.005516f, -0.013790f, -0.017328f, -0.010429f, 0.008445f, 0.014511f, -0.025573f, 0.005340f, -0.002749f, -0.000746f, -0.030799f, -0.027662f, -0.004889f, -0.021473f, 0.010023f, -0.024479f, 0.001490f, 0.012987f, 0.018703f, -0.016719f, 0.022240f, 0.005619f, -0.002288f, -0.005003f, 0.033024f, -0.009307f, -0.001721f, -0.026682f, -0.015026f, 0.021598f, -0.001723f, 0.008123f, -0.025668f, -0.028114f, -0.007731f, -0.015905f, -0.002823f, 0.001133f, -0.010408f, -0.013350f, 0.007821f, -0.012401f, 0.001022f, -0.018232f, -0.009866f, -0.000561f, -0.029949f, 0.002653f, 0.019619f, 0.003650f, 0.010281f, 0.021323f, 0.036670f, -0.035538f, 0.006411f, -0.021969f, -0.021303f, -0.011996f, -0.016197f, -0.010485f, -0.009575f, + 0.035824f, 0.019734f, 0.019781f, 0.004097f, 0.005734f, -0.026011f, 0.001161f, -0.009180f, 0.004047f, -0.011308f, 0.015792f, 0.020967f, 0.001943f, -0.009530f, -0.006567f, -0.017948f, 0.001516f, 0.011005f, 0.005991f, -0.004355f, 0.011256f, 0.005468f, 0.011921f, -0.002598f, -0.002328f, 0.001965f, 0.007712f, -0.005004f, 0.003222f, -0.007354f, -0.010332f, 0.007375f, 0.002532f, 0.001517f, 0.001517f, -0.013914f, -0.008404f, -0.000072f, 0.010563f, -0.009006f, 0.005221f, -0.012067f, -0.004172f, -0.001927f, 0.004139f, 0.002904f, -0.003735f, -0.002942f, -0.016187f, 0.036910f, 0.039135f, 0.043005f, -0.032161f, 0.002242f, 0.023139f, 0.018204f, -0.018837f, -0.035926f, -0.004286f, -0.005439f, -0.028296f, -0.016392f, 0.053367f, 0.004114f, 0.003537f, 0.019921f, -0.002437f, 0.008466f, -0.007493f, -0.021308f, 0.013856f, 0.011596f, -0.028842f, -0.040909f, -0.031754f, -0.025225f, -0.024066f, 0.002216f, 0.006841f, 0.012062f, -0.016048f, 0.015522f, 0.003616f, -0.007895f, -0.016978f, -0.000647f, 0.000814f, -0.026096f, -0.020494f, 0.002908f, -0.004828f, 0.003473f, -0.015893f, 0.012667f, 0.003838f, -0.014921f, + -0.031966f, -0.012665f, -0.010878f, -0.042421f, -0.013480f, 0.003877f, 0.020794f, -0.002110f, 0.024647f, -0.004460f, -0.002221f, -0.036165f, -0.007806f, 0.014097f, 0.006629f, -0.060459f, 0.017168f, 0.005146f, -0.016971f, -0.010322f, -0.017698f, -0.019905f, -0.000931f, 0.000830f, -0.019289f, -0.006256f, 0.012083f, 0.017524f, 0.027589f, -0.021283f, 0.000875f, 0.015570f, -0.000844f, -0.046251f, -0.036942f, -0.000507f, -0.009879f, 0.011479f, -0.000479f, -0.011437f, -0.016670f, 0.007549f, -0.004900f, 0.006851f, 0.018735f, -0.000589f, -0.009472f, -0.015807f, -0.028996f, -0.009924f, 0.001623f, -0.004853f, -0.005004f, 0.001818f, 0.001754f, 0.012758f, -0.006712f, 0.001272f, 0.004688f, 0.002475f, -0.010563f, 0.001137f, -0.002783f, -0.025176f, 0.002433f, -0.009355f, -0.011470f, 0.004016f, 0.002957f, -0.007666f, -0.002520f, 0.008991f, 0.002503f, 0.002353f, -0.009407f, -0.010566f, -0.003825f, -0.000840f, 0.000424f, 0.006398f, 0.014799f, -0.012554f, 0.042015f, -0.035959f, -0.022138f, -0.007311f, -0.067989f, -0.035516f, -0.000187f, -0.043343f, 0.033653f, -0.015246f, -0.014047f, 0.003848f, 0.077062f, 0.037184f, + 0.002381f, 0.015817f, -0.003586f, -0.020692f, -0.002063f, -0.032011f, -0.023165f, 0.011006f, 0.011179f, 0.013815f, -0.022246f, 0.028478f, 0.017431f, 0.032220f, -0.032763f, 0.005249f, 0.047762f, 0.004450f, 0.001950f, 0.009409f, -0.045818f, 0.011674f, -0.011587f, 0.007514f, -0.018457f, -0.043273f, -0.002661f, 0.017454f, 0.021289f, 0.005489f, -0.006771f, 0.003113f, -0.001999f, 0.014302f, -0.032679f, -0.047563f, 0.008484f, -0.017384f, 0.028354f, -0.011391f, -0.011835f, 0.037025f, 0.008320f, 0.015900f, 0.002935f, -0.031374f, -0.012878f, -0.003791f, 0.016883f, 0.048844f, 0.037597f, -0.011275f, -0.043248f, -0.000942f, -0.005003f, 0.015956f, -0.026679f, -0.033443f, -0.018994f, 0.015757f, -0.033873f, -0.005342f, -0.028428f, 0.000118f, 0.022843f, -0.000761f, -0.042592f, -0.009422f, 0.005609f, 0.011130f, 0.005269f, -0.026598f, -0.017923f, -0.028462f, 0.004366f, -0.006029f, -0.012375f, -0.009548f, -0.012368f, 0.002333f, -0.005179f, -0.011859f, -0.003377f, 0.008245f, -0.000080f, -0.000461f, -0.014472f, -0.000426f, -0.001388f, -0.009274f, 0.000728f, 0.017663f, 0.005902f, 0.003141f, -0.018309f, 0.007013f, + -0.002054f, -0.002204f, 0.002829f, -0.000532f, -0.000400f, -0.003859f, -0.010917f, -0.012234f, -0.009998f, 0.012207f, 0.010709f, -0.005112f, -0.027180f, -0.010166f, -0.010116f, -0.002344f, -0.077320f, 0.029891f, 0.024533f, -0.011324f, -0.051093f, -0.011251f, -0.019664f, -0.020697f, 0.022581f, 0.027894f, -0.002819f, 0.007651f, -0.058053f, 0.020499f, -0.072667f, -0.018358f, -0.006267f, 0.014525f, 0.036635f, 0.058147f, 0.024169f, -0.033591f, 0.007878f, 0.040640f, 0.005462f, 0.012395f, 0.022091f, -0.034143f, -0.013129f, -0.005351f, 0.010440f, -0.024041f, -0.012886f, -0.007259f, -0.018020f, -0.013757f, 0.024755f, 0.024267f, 0.006299f, 0.002061f, 0.041860f, -0.007815f, 0.019595f, -0.047192f, 0.031412f, 0.009006f, -0.042740f, 0.004422f, 0.013817f, -0.040214f, -0.005101f, -0.039329f, 0.013272f, 0.016633f, 0.017792f, -0.026464f, -0.002171f, 0.026516f, -0.021951f, 0.000359f, -0.003445f, 0.043738f, -0.025751f, 0.032236f, 0.016426f, -0.040657f, 0.035861f, -0.029922f, 0.023124f, 0.030357f, -0.030487f, 0.017324f, -0.025991f, -0.032444f, -0.048852f, -0.040813f, -0.044659f, -0.010646f, 0.008125f, -0.013433f, + 0.039303f, 0.040725f, -0.017059f, 0.035897f, -0.005357f, -0.007506f, 0.045731f, -0.010092f, -0.030403f, 0.021307f, -0.004436f, -0.023809f, -0.018206f, 0.018073f, 0.003357f, 0.009393f, 0.014427f, 0.002575f, 0.011901f, 0.018182f, -0.004673f, 0.020381f, 0.014152f, 0.010192f, 0.011735f, 0.001749f, 0.007282f, 0.017327f, 0.014107f, 0.017566f, 0.002816f, 0.014594f, -0.002514f, 0.001060f, 0.012895f, -0.006234f, -0.022581f, 0.010841f, 0.003866f, 0.000076f, 0.000705f, 0.010352f, -0.019946f, 0.010412f, 0.014450f, 0.011579f, -0.013128f, 0.012705f, -0.061099f, -0.028814f, -0.029995f, 0.053710f, 0.001757f, 0.020165f, -0.008580f, 0.076109f, 0.012126f, -0.050602f, 0.003848f, 0.055960f, -0.020545f, 0.012576f, -0.009091f, 0.004983f, -0.032498f, -0.043869f, 0.069951f, 0.049840f, -0.018999f, 0.038289f, 0.015116f, 0.049763f, 0.056539f, -0.016347f, -0.013203f, 0.050312f, 0.036894f, 0.004221f, -0.015749f, -0.024793f, -0.026053f, 0.023368f, 0.044353f, 0.020939f, -0.007971f, 0.029878f, -0.015544f, 0.028364f, -0.012531f, 0.041297f, 0.073011f, 0.055656f, -0.059293f, 0.027268f, -0.010033f, -0.024067f, + -0.000702f, 0.020812f, 0.020071f, 0.133305f, -0.013371f, -0.001279f, -0.021606f, -0.023532f, 0.026018f, 0.048225f, -0.011711f, 0.036684f, 0.031310f, -0.004091f, 0.001184f, -0.025825f, 0.026481f, 0.022290f, 0.070932f, 0.072154f, 0.087586f, 0.036446f, -0.022276f, -0.018027f, -0.040153f, 0.039351f, -0.059424f, 0.043116f, -0.055776f, 0.032898f, -0.019633f, -0.033516f, 0.024345f, -0.090350f, -0.071465f, 0.013095f, 0.014108f, -0.025815f, -0.025032f, 0.042229f, 0.021077f, -0.038740f, 0.005820f, -0.008786f, -0.021188f, 0.007001f, 0.010927f, 0.003364f, 0.011072f, 0.012997f, 0.022834f, -0.010507f, 0.004495f, -0.012716f, -0.022555f, -0.013772f, 0.005467f, 0.002005f, 0.031297f, 0.006709f, -0.007505f, -0.025283f, 0.004072f, -0.010002f, -0.008091f, -0.011228f, 0.008797f, 0.018876f, 0.006733f, 0.016387f, 0.013765f, 0.021654f, -0.009035f, 0.016505f, 0.002240f, 0.004834f, -0.001420f, 0.001444f, -0.012647f, 0.015222f, 0.036328f, 0.019493f, -0.003766f, -0.004010f, 0.028887f, 0.024214f, -0.022260f, 0.007148f, 0.014553f, -0.011161f, 0.041785f, 0.009439f, -0.097950f, 0.022463f, 0.012831f, -0.072866f, + 0.004289f, -0.012504f, 0.003017f, 0.026685f, -0.003543f, -0.067350f, -0.011970f, -0.021478f, -0.003786f, 0.047665f, 0.057222f, -0.032593f, -0.008227f, -0.027362f, 0.014076f, -0.051615f, -0.100098f, -0.035881f, -0.030247f, 0.005229f, 0.001617f, 0.045482f, -0.068444f, 0.032569f, -0.015945f, -0.007598f, 0.028064f, 0.013163f, 0.047541f, 0.010808f, 0.018274f, 0.050864f, -0.058218f, 0.072541f, 0.057575f, 0.030004f, 0.053994f, -0.021042f, 0.020460f, -0.050685f, -0.010150f, -0.025540f, 0.044707f, -0.039746f, 0.009498f, -0.085288f, -0.105783f, 0.070508f, -0.003361f, 0.045472f, -0.032204f, 0.030081f, -0.021081f, 0.006482f, -0.012147f, -0.069311f, -0.022021f, -0.046355f, -0.022115f, 0.025011f, 0.102526f, 0.036589f, -0.090750f, -0.020567f, 0.023816f, -0.021061f, -0.013754f, -0.059924f, -0.031157f, 0.046176f, -0.017527f, 0.011133f, 0.008876f, -0.037369f, 0.023375f, -0.005510f, 0.001582f, -0.076631f, -0.022549f, -0.001687f, -0.035257f, -0.019910f, 0.002632f, -0.051877f, 0.005123f, 0.011543f, -0.042226f, -0.033047f, -0.059507f, -0.044202f, -0.004432f, -0.024506f, -0.012053f, 0.001427f, -0.017306f, -0.016783f, + -0.007315f, -0.026202f, -0.012916f, 0.003306f, 0.017402f, -0.023117f, -0.008650f, -0.039541f, 0.013537f, 0.009646f, 0.022802f, -0.016406f, 0.023717f, -0.051144f, -0.003483f, -0.000065f, -0.004062f, 0.007745f, -0.008792f, 0.005349f, -0.024211f, -0.024941f, 0.007173f, 0.006162f, -0.060045f, 0.031908f, 0.031879f, 0.056481f, -0.027323f, 0.020798f, -0.031428f, -0.036561f, 0.016539f, 0.074948f, 0.121366f, -0.007405f, -0.007861f, 0.002696f, -0.002514f, -0.053861f, 0.084982f, 0.040878f, 0.045290f, 0.034915f, -0.024376f, 0.029584f, -0.047621f, -0.068677f, -0.011703f, 0.051670f, 0.033694f, -0.024488f, -0.015716f, -0.003283f, 0.041874f, 0.001892f, 0.030573f, 0.029902f, 0.049551f, 0.016585f, -0.030884f, -0.029374f, 0.028410f, -0.033085f, -0.024583f, 0.014740f, 0.054410f, 0.050112f, -0.056946f, -0.044078f, 0.029648f, 0.035262f, 0.106790f, -0.024640f, -0.057867f, -0.060060f, 0.051200f, -0.038401f, 0.048319f, 0.054524f, 0.109883f, 0.232887f, -0.051865f, -0.029578f, -0.087047f, -0.138790f, -0.044100f, -0.069853f, 0.008207f, 0.096642f, -0.013999f, 0.051218f, 0.073132f, 0.047883f, -0.026762f, -0.085945f, + -0.140669f, 0.078708f, -0.005337f, 0.089513f, -0.045763f, -0.122087f, 0.042840f, -0.072330f, -0.096210f, -0.049435f, -0.030478f, 0.030776f, 0.030483f, 0.054995f, -0.003875f, -0.026680f, -0.004035f, -0.002194f, -0.049670f, -0.048295f, 0.024827f, -0.017075f, 0.049517f, 0.044949f, -0.021242f, 0.044749f, -0.035004f, 0.001009f, 0.044312f, 0.004758f, -0.068393f, 0.018325f, -0.034325f, -0.006006f, -0.010875f, -0.009199f, -0.050351f, -0.041419f, 0.008301f, 0.060021f, 0.064590f, -0.060258f, -0.006870f, 0.073282f, 0.070437f, 0.000083f, 0.015075f, -0.066372f, -0.034949f, 0.009822f, 0.039067f, -0.057384f, 0.014968f, 0.044677f, 0.022754f, 0.016892f, 0.005389f, 0.028166f, -0.047001f, 0.008745f, -0.042845f, -0.118152f, 0.029745f, -0.049367f, 0.049036f, 0.007210f, 0.027377f, 0.023998f, -0.108090f, -0.076577f, -0.037934f, -0.023815f, -0.025131f, -0.044175f, -0.013747f, -0.073390f, -0.046753f, 0.035303f, -0.047796f, 0.090956f, -0.067681f, 0.006963f, 0.018738f, -0.007193f, 0.007991f, -0.003903f, 0.021724f, -0.021093f, -0.022747f, -0.003935f, 0.016274f, -0.002864f, 0.038997f, -0.036818f, 0.008293f, 0.057000f, + 0.018249f, 0.008548f, 0.029007f, 0.003598f, -0.023237f, -0.014791f, 0.046234f, 0.010373f, -0.073129f, -0.032416f, -0.059343f, -0.027008f, 0.078593f, 0.073306f, -0.075751f, -0.008379f, -0.086126f, -0.020754f, -0.007184f, 0.019857f, 0.043145f, -0.070536f, 0.047026f, -0.060051f, -0.010188f, -0.040685f, 0.090490f, -0.018302f, 0.063814f, 0.059712f, 0.132866f, -0.061225f, 0.054776f, 0.008918f, 0.052041f, 0.018181f, 0.039693f, -0.066601f, -0.061212f, 0.088779f, 0.004290f, -0.003352f, -0.062916f, 0.071677f, -0.024312f, 0.036769f, -0.066223f, 0.139090f, -0.074579f, 0.077373f, -0.093369f, 0.036860f, -0.070392f, 0.038847f, -0.064861f, 0.048036f, -0.041108f, 0.028212f, -0.022982f, 0.015532f, -0.034995f, -0.021606f, -0.016617f, -0.004370f, 0.012264f, 0.002140f, 0.009868f, 0.000798f, 0.009690f, -0.005294f, -0.017935f, -0.028266f, 0.012697f, 0.014025f, 0.003945f, 0.012845f, -0.010688f, 0.004994f, -0.008505f, 0.005249f, 0.047679f, -0.012097f, -0.034486f, 0.004803f, -0.019622f, -0.036686f, 0.011449f, -0.020068f, 0.014418f, -0.016843f, 0.011937f, -0.032072f, 0.012759f, -0.041448f, 0.057931f, 0.008914f, + -0.106552f, -0.046931f, -0.066047f, 0.003594f, -0.015501f, -0.143856f, -0.065371f, -0.037769f, -0.076682f, -0.047784f, -0.144968f, -0.122388f, -0.022421f, 0.051958f, -0.079918f, -0.047808f, -0.011880f, -0.068102f, -0.015862f, -0.005719f, -0.065920f, -0.017803f, 0.013126f, 0.002939f, -0.087396f, -0.049864f, -0.049995f, -0.027926f, -0.031166f, -0.009230f, -0.060788f, 0.050057f, 0.032510f, 0.071597f, 0.104286f, 0.090645f, 0.022887f, 0.095851f, 0.038201f, 0.016772f, -0.043133f, 0.033314f, 0.034666f, 0.027323f, -0.011544f, -0.033370f, -0.015673f, 0.023678f, 0.042397f, 0.219569f, 0.029430f, 0.044891f, 0.031930f, 0.089521f, 0.034412f, 0.078566f, 0.143426f, -0.069872f, -0.141293f, 0.017052f, 0.089572f, 0.160294f, 0.070826f, -0.139368f, 0.018328f, -0.035150f, 0.202389f, 0.148752f, 0.181016f, 0.165909f, -0.145079f, -0.095934f, 0.118139f, 0.141901f, -0.042060f, -0.083389f, -0.100499f, 0.224070f, 0.149085f, -0.010292f, -0.193897f, 0.045676f, -0.007962f, -0.043689f, 0.052706f, 0.013627f, -0.017476f, -0.042250f, -0.001378f, 0.029668f, 0.082862f, 0.058509f, -0.050412f, -0.020932f, -0.014004f, -0.011605f, + 0.046482f, 0.033308f, 0.035890f, -0.000507f, 0.018913f, 0.075878f, 0.051397f, 0.009699f, 0.029972f, -0.022246f, 0.037550f, 0.048507f, 0.064350f, 0.081984f, 0.064034f, 0.048541f, -0.000304f, -0.012604f, -0.017826f, -0.007032f, -0.037870f, -0.021784f, -0.018582f, -0.047312f, -0.060484f, -0.069184f, -0.117799f, -0.067775f, -0.044301f, -0.071859f, -0.131025f, -0.091992f, -0.077575f, -0.090808f, -0.107367f, -0.113794f, -0.039433f, -0.044653f, -0.062577f, -0.036070f, -0.039314f, -0.027002f, -0.036964f, -0.036501f, -0.035666f, -0.035289f, -0.104105f, 0.167007f, 0.134841f, -0.116665f, 0.026081f, -0.002642f, 0.018769f, -0.004482f, -0.011559f, 0.043059f, -0.043224f, 0.042065f, -0.017147f, 0.000232f, 0.016564f, 0.013621f, 0.014938f, -0.000035f, -0.024543f, -0.015561f, 0.026789f, -0.021976f, -0.002914f, 0.026008f, -0.014236f, -0.014660f, -0.020687f, -0.037545f, -0.037967f, 0.027824f, -0.013948f, 0.010468f, -0.023957f, 0.004931f, -0.050657f, -0.008931f, 0.013636f, 0.032694f, -0.020867f, 0.007303f, 0.022045f, 0.035811f, -0.008780f, 0.029700f, -0.024200f, 0.094121f, -0.035155f, 0.032633f, 0.004009f, 0.018610f, + -0.017921f, 0.025180f, -0.010332f, 0.067194f, -0.011295f, 0.021036f, -0.047105f, 0.061704f, -0.032691f, -0.002155f, -0.009509f, 0.009294f, -0.018770f, 0.037232f, -0.042993f, 0.035023f, -0.039465f, 0.051000f, -0.053432f, 0.064579f, -0.043189f, -0.022604f, -0.027301f, -0.013018f, 0.001974f, -0.041778f, 0.026901f, -0.024577f, 0.023496f, 0.002404f, 0.032692f, 0.013022f, 0.022380f, 0.041087f, 0.016824f, -0.013616f, 0.010209f, 0.010426f, -0.006541f, 0.007806f, -0.013488f, 0.015202f, -0.007946f, 0.000608f, -0.013275f, 0.029141f, -0.029116f, 0.003234f, -0.003458f, 0.023784f, -0.005341f, 0.005404f, -0.006369f, 0.009976f, -0.014375f, 0.010989f, -0.012478f, -0.005286f, 0.020785f, 0.020469f, -0.007070f, -0.019017f, 0.011624f, 0.018266f, 0.017531f, -0.016290f, 0.013323f, -0.010961f, 0.009640f, 0.003612f, 0.002836f, -0.017427f, 0.018276f, -0.006232f, -0.024631f, 0.020340f, 0.016719f, -0.014360f, -0.004781f, -0.002109f, 0.003334f, -0.013761f, 0.019336f, -0.018185f, 0.005456f, -0.019940f, 0.017323f, -0.013926f, 0.014483f, -0.010818f, 0.018164f, -0.020616f, 0.022226f, -0.020206f, 0.009547f, -0.016431f, + 0.016340f, -0.019016f, 0.014753f, -0.011325f, 0.019331f, -0.021929f, 0.022680f, -0.019251f, -0.040948f, -0.084613f, -0.093099f, 0.079144f, 0.019993f, -0.024505f, -0.126165f, -0.050717f, 0.070274f, 0.014325f, 0.050750f, 0.056612f, -0.020457f, -0.035583f, 0.001657f, 0.013414f, 0.010385f, 0.009384f, -0.022347f, -0.016402f, -0.012431f, 0.000059f, 0.034090f, 0.018443f, -0.001704f, 0.007675f, -0.009891f, -0.016508f, -0.010602f, -0.008642f, 0.000550f, 0.010084f, -0.007832f, 0.013014f, 0.013588f, -0.046327f, -0.020666f, -0.020495f, 0.024653f, 0.017222f, -0.001649f, -0.021557f, -0.029261f, 0.025422f, 0.005509f, 0.017054f, 0.023603f, -0.042948f, -0.028709f, 0.007861f, 0.034495f, 0.017496f, -0.049007f, -0.030107f, -0.039839f, -0.018923f, 0.010104f, 0.009001f, -0.016485f, 0.018000f, -0.007514f, -0.017111f, 0.007529f, 0.016411f, -0.012375f, 0.003931f, -0.000625f, -0.015279f, -0.001554f, -0.005374f, -0.034866f, -0.035010f, -0.002321f, -0.037347f, -0.028206f, 0.001227f, 0.011170f, -0.008104f, 0.041078f, 0.030516f, 0.017178f, 0.001360f, -0.004132f, -0.018295f, 0.022671f, 0.011264f, 0.013150f, 0.012953f, + -0.011739f, -0.004781f, -0.001058f, 0.006645f, -0.021803f, -0.026220f, -0.003813f, 0.011687f, 0.001525f, 0.014769f, 0.010031f, -0.013607f, 0.004329f, 0.008191f, 0.005497f, -0.004284f, 0.014475f, -0.018126f, -0.011081f, 0.033769f, 0.019128f, -0.020531f, -0.015733f, -0.010365f, -0.018642f, 0.020590f, -0.000877f, 0.003115f, 0.009184f, 0.006265f, -0.000406f, -0.000570f, -0.013940f, 0.008985f, 0.005060f, 0.012275f, -0.006970f, -0.001756f, 0.007643f, 0.032850f, -0.081694f, -0.222703f, -0.084618f, 0.050787f, 0.107345f, 0.253070f, 0.148766f, 0.040512f, 0.053019f, -0.043771f, -0.081831f, -0.179134f, -0.120772f, -0.092573f, -0.030258f, 0.036810f, 0.098685f, 0.076724f, 0.095804f, 0.092582f, 0.062770f, -0.021070f, -0.072958f, -0.063143f, -0.064905f, -0.052139f, -0.075249f, 0.023212f, -0.047556f, 0.003585f, 0.035064f, 0.064804f, 0.036576f, 0.060668f, 0.079940f, 0.001593f, 0.023872f, 0.001870f, -0.001202f, -0.044548f, -0.005883f, -0.039627f, -0.077524f, -0.122324f, -0.068163f, -0.037244f, 0.009899f, 0.009427f, 0.072812f, 0.101141f, 0.097168f, 0.115736f, 0.016856f, 0.075995f, 0.030097f, -0.006724f, + -0.071123f, -0.069591f, -0.094600f, -0.124103f, -0.084674f, -0.096137f, -0.060937f, 0.000488f, 0.029855f, 0.069295f, 0.111757f, 0.164711f, 0.131898f, 0.119612f, 0.064716f, -0.024526f, -0.024355f, -0.064479f, -0.137437f, -0.105468f, -0.173680f, -0.114072f, -0.050588f, -0.038378f, 0.054288f, 0.104405f, 0.142894f, 0.100996f, 0.077233f, 0.047095f, 0.053532f, 0.047195f, -0.007524f, -0.053958f, -0.051613f, -0.081251f, -0.090099f, -0.071543f, -0.049063f, -0.045447f, -0.043368f, 0.020030f, 0.042222f, 0.074914f, 0.088687f, 0.072937f, 0.063921f, 0.036666f, 0.001252f, 0.002030f, 0.008233f, -0.053718f, -0.091469f, -0.037278f, -0.079892f, -0.090338f, -0.003094f, 0.022823f, 0.050412f, 0.052378f, 0.033309f, 0.055350f, 0.032000f, 0.044324f, -0.009366f, -0.000733f, -0.038774f, -0.023085f, -0.020633f, -0.025411f, -0.029408f, -0.023459f, 0.003831f, -0.009651f, -0.000028f, 0.027076f, 0.037195f, 0.023689f, 0.020349f, -0.004969f, -0.006645f, -0.000142f, -0.000684f, -0.011175f, -0.013588f, -0.002040f, -0.008126f, -0.007949f, -0.005068f, 0.000332f, -0.008575f, -0.002637f, 0.016111f, 0.005882f, 0.007048f, 0.010590f, + 0.007471f, 0.002264f, 0.000367f, -0.001858f, -0.002210f, -0.001332f, -0.000878f}, + {0.015042f, 0.009628f, 0.000264f, 0.000504f, 0.011849f, 0.002948f, -0.005897f, 0.004024f, 0.007887f, -0.004000f, -0.006537f, -0.023512f, 0.001258f, -0.007913f, 0.015702f, -0.007796f, 0.007877f, 0.006336f, -0.000811f, 0.005119f, 0.008694f, 0.002361f, 0.002040f, -0.004296f, -0.005151f, -0.004012f, -0.006492f, 0.005656f, 0.003396f, -0.003086f, 0.005126f, -0.003550f, -0.005182f, -0.006228f, -0.002978f, -0.004926f, 0.000440f, 0.000057f, -0.000891f, 0.010731f, -0.006195f, 0.008772f, -0.003150f, -0.002264f, 0.005935f, -0.003686f, 0.001877f, -0.003689f, 0.006508f, -0.001944f, -0.018336f, 0.005428f, 0.000682f, 0.002217f, 0.009282f, 0.004736f, 0.000710f, -0.002139f, -0.006031f, 0.015683f, -0.008270f, 0.006069f, 0.003252f, -0.006557f, 0.006675f, 0.002894f, -0.007632f, 0.006040f, -0.007871f, 0.000395f, -0.000759f, 0.006875f, 0.001206f, 0.007186f, -0.002729f, -0.016299f, -0.003403f, -0.003989f, -0.007640f, -0.006983f, -0.006768f, 0.005525f, 0.002546f, 0.001882f, 0.003485f, 0.003314f, 0.000762f, 0.001524f, -0.001815f, 0.001047f, -0.001313f, -0.000738f, -0.003869f, -0.000150f, -0.001219f, 0.002901f, + -0.000193f, -0.001054f, -0.000503f, 0.000211f, -0.001948f, 0.000594f, -0.000783f, 0.000998f, -0.000543f, 0.000089f, -0.002252f, -0.000415f, -0.002839f, -0.001944f, 0.028570f, -0.014160f, 0.001546f, -0.000897f, -0.000875f, 0.006467f, -0.005187f, -0.020586f, -0.018973f, 0.008867f, -0.006030f, -0.001801f, 0.004793f, 0.001002f, 0.004731f, 0.005278f, -0.009062f, 0.004820f, 0.003318f, -0.006443f, 0.007435f, 0.011213f, -0.007403f, -0.002476f, 0.000511f, -0.012219f, -0.005547f, 0.001162f, 0.014477f, -0.002409f, -0.000872f, -0.012176f, 0.007109f, -0.000063f, -0.010918f, -0.004713f, 0.003718f, -0.001721f, 0.002051f, -0.009468f, -0.000287f, 0.000564f, -0.003890f, 0.009960f, 0.002478f, 0.002175f, 0.009631f, -0.001089f, 0.012527f, -0.004313f, -0.016070f, 0.006384f, 0.006201f, -0.005718f, -0.002522f, -0.002047f, 0.001922f, 0.000631f, 0.004397f, -0.003752f, 0.002888f, -0.008817f, -0.000455f, 0.005650f, -0.008414f, -0.001067f, 0.004851f, 0.001475f, -0.004429f, 0.002789f, -0.003368f, 0.000820f, 0.008135f, 0.002865f, -0.011323f, 0.013603f, 0.005080f, 0.004959f, -0.001224f, 0.007799f, 0.008693f, -0.003868f, + -0.000593f, 0.001869f, 0.002200f, 0.002679f, 0.003643f, -0.000436f, 0.000259f, 0.002692f, -0.000437f, 0.000339f, 0.001683f, 0.004210f, -0.000725f, 0.004289f, -0.000203f, 0.000995f, 0.002185f, 0.000531f, -0.001296f, -0.000407f, 0.001484f, 0.001427f, -0.000288f, -0.001988f, -0.006987f, -0.016763f, -0.002070f, 0.001721f, 0.018343f, -0.007093f, 0.015710f, 0.003885f, -0.000617f, 0.000906f, 0.014046f, -0.003357f, -0.003944f, -0.004159f, 0.009875f, 0.020150f, 0.005216f, -0.014013f, -0.019002f, -0.026987f, 0.003446f, -0.007100f, -0.011399f, -0.006279f, -0.017630f, -0.000150f, -0.008227f, 0.001258f, 0.008343f, 0.008811f, -0.010089f, -0.009023f, -0.006449f, 0.001063f, -0.014974f, -0.001686f, 0.004545f, -0.006803f, -0.002540f, 0.001506f, 0.005918f, -0.008423f, 0.002099f, 0.019624f, -0.000901f, -0.001011f, -0.007339f, 0.008142f, -0.003737f, 0.000671f, 0.006169f, 0.008099f, 0.012022f, -0.001984f, 0.001701f, -0.003696f, -0.000249f, -0.002117f, 0.001515f, 0.018863f, -0.021095f, 0.000424f, 0.003996f, 0.011129f, -0.004735f, -0.005602f, -0.001324f, -0.005290f, 0.015019f, -0.008363f, -0.019893f, -0.001409f, + -0.005999f, -0.008328f, 0.004827f, -0.019637f, 0.007153f, -0.002130f, -0.005534f, 0.000365f, 0.013752f, -0.004131f, -0.005299f, -0.005368f, 0.006544f, -0.006250f, -0.001782f, 0.001146f, -0.000661f, 0.002367f, 0.000126f, 0.000914f, 0.004015f, 0.000317f, 0.000979f, -0.001042f, 0.003208f, 0.000714f, -0.000754f, -0.003737f, -0.002100f, -0.000289f, -0.002054f, 0.003826f, 0.002236f, -0.002188f, 0.002761f, 0.000290f, 0.000325f, -0.002028f, 0.000967f, -0.000886f, -0.000010f, -0.030749f, 0.011486f, -0.009617f, 0.012890f, -0.011583f, -0.001052f, 0.008926f, -0.017787f, -0.003052f, 0.005421f, -0.004838f, 0.025910f, -0.010869f, -0.003288f, -0.010368f, -0.008679f, 0.013320f, 0.014800f, 0.005738f, -0.017453f, -0.021048f, 0.019461f, 0.003274f, -0.019744f, 0.007381f, 0.000712f, 0.009348f, -0.005868f, 0.008921f, -0.011823f, 0.005769f, 0.019040f, 0.007890f, 0.008143f, 0.004343f, 0.000312f, -0.004835f, 0.003958f, 0.001505f, -0.013031f, 0.000238f, -0.004152f, -0.009533f, -0.009565f, -0.003598f, 0.007500f, -0.013688f, 0.001838f, -0.009894f, -0.001054f, -0.001488f, 0.004488f, 0.008164f, 0.017181f, 0.006113f, + -0.000142f, 0.007435f, -0.009249f, -0.013509f, -0.000288f, 0.003193f, 0.001359f, 0.016404f, -0.003774f, -0.001958f, -0.005285f, -0.002271f, 0.002273f, 0.007994f, -0.002213f, 0.003371f, -0.008177f, 0.013293f, -0.003535f, -0.004575f, -0.003119f, 0.004346f, -0.007252f, 0.000282f, 0.008125f, -0.000524f, -0.002418f, 0.001272f, 0.006437f, 0.005190f, -0.001086f, 0.004198f, -0.003594f, 0.002684f, -0.002205f, 0.001088f, 0.004581f, -0.001570f, 0.001912f, 0.002058f, -0.003260f, 0.003269f, 0.001872f, 0.000791f, -0.001449f, -0.002809f, -0.000779f, 0.003655f, 0.002285f, -0.001159f, 0.001344f, -0.000604f, 0.005761f, -0.000438f, -0.001731f, -0.015341f, -0.003556f, -0.009947f, -0.000989f, 0.020445f, 0.013079f, 0.009147f, -0.001522f, -0.017939f, 0.002538f, -0.011793f, -0.019015f, -0.006293f, 0.013738f, -0.010728f, -0.016858f, 0.004441f, 0.001480f, -0.008384f, 0.001835f, 0.009640f, 0.002677f, -0.022482f, -0.006350f, 0.014174f, 0.016693f, 0.008338f, -0.018626f, -0.006741f, 0.008531f, -0.003152f, -0.003987f, 0.001237f, 0.006275f, 0.001032f, 0.002337f, 0.019171f, 0.000065f, 0.011607f, 0.009004f, -0.000121f, + -0.008593f, -0.000186f, -0.005058f, 0.011440f, -0.006500f, -0.010864f, 0.000052f, 0.017933f, 0.001032f, 0.017815f, 0.009615f, 0.001750f, 0.011521f, -0.001914f, 0.024726f, 0.002017f, 0.012245f, 0.013945f, 0.001314f, -0.011488f, -0.001741f, -0.013749f, 0.007055f, -0.009847f, -0.005511f, -0.009078f, -0.005978f, -0.004346f, 0.004544f, 0.001550f, 0.006828f, -0.000262f, -0.007846f, -0.006829f, 0.002580f, 0.012742f, -0.003749f, 0.003166f, -0.013637f, 0.004345f, 0.011819f, 0.018134f, -0.006222f, -0.001332f, 0.003017f, -0.006214f, -0.000455f, 0.005996f, -0.001817f, 0.011002f, 0.000739f, 0.002515f, 0.000289f, 0.000536f, 0.004066f, -0.002666f, -0.001728f, -0.001417f, -0.000814f, 0.001121f, 0.001372f, -0.002059f, 0.001808f, -0.000622f, -0.002184f, -0.002663f, 0.000914f, -0.002529f, -0.001663f, -0.003173f, 0.001553f, 0.002206f, -0.000456f, 0.006199f, -0.004015f, 0.001094f, -0.000436f, -0.003513f, 0.005898f, -0.001703f, -0.000838f, 0.018626f, -0.027849f, -0.005138f, 0.023315f, -0.011587f, 0.004260f, -0.018008f, 0.007924f, 0.032796f, -0.004441f, 0.001720f, -0.001389f, -0.023196f, 0.001871f, -0.001494f, + 0.034813f, -0.011004f, -0.001704f, 0.015199f, -0.009595f, 0.021557f, -0.014547f, -0.002196f, -0.021994f, 0.024847f, 0.000345f, -0.009811f, 0.000319f, 0.009086f, -0.011560f, 0.017264f, -0.001835f, 0.015296f, -0.000105f, 0.007999f, -0.024036f, -0.015502f, -0.011210f, -0.003635f, 0.014500f, -0.021820f, 0.011656f, 0.008967f, 0.003049f, -0.009056f, -0.013127f, 0.029922f, 0.005963f, -0.003435f, 0.011634f, -0.010624f, 0.006314f, -0.014132f, -0.013827f, -0.005810f, -0.009278f, 0.032312f, 0.009679f, -0.006473f, -0.009599f, -0.012388f, 0.010190f, 0.008355f, 0.003078f, -0.011433f, -0.001371f, -0.004663f, 0.013845f, 0.001198f, 0.011204f, -0.026180f, 0.014233f, -0.002346f, 0.000725f, -0.002964f, 0.004621f, -0.011591f, -0.005336f, -0.018179f, -0.005904f, 0.006530f, 0.011083f, 0.011622f, 0.004352f, 0.004194f, 0.002759f, -0.006550f, 0.003898f, 0.002593f, -0.000448f, -0.004417f, -0.007201f, 0.003794f, 0.003646f, -0.005601f, 0.002889f, 0.000320f, -0.004527f, 0.002923f, 0.000868f, -0.002026f, -0.001044f, 0.000215f, 0.000924f, -0.003437f, 0.002375f, 0.001218f, -0.005215f, -0.001302f, -0.002659f, 0.000354f, + 0.003740f, 0.002465f, -0.000516f, 0.000082f, -0.002399f, 0.000286f, -0.002211f, 0.011789f, 0.005802f, 0.009715f, 0.002871f, 0.000105f, -0.003705f, -0.014925f, -0.004650f, -0.009632f, 0.005857f, -0.000575f, 0.022409f, -0.018864f, -0.024294f, -0.006166f, 0.007528f, -0.007609f, -0.005910f, 0.019046f, 0.003789f, -0.010592f, -0.012198f, -0.012649f, 0.020825f, -0.010578f, 0.014057f, -0.006867f, 0.015384f, -0.015465f, 0.003334f, 0.023632f, 0.008054f, -0.032366f, 0.007373f, 0.000650f, -0.004201f, -0.002955f, 0.003248f, -0.003941f, 0.003067f, -0.005355f, 0.002517f, -0.001397f, -0.014504f, 0.014369f, 0.014756f, -0.004509f, 0.016354f, -0.014104f, -0.002503f, -0.004127f, -0.006751f, 0.017993f, -0.013091f, -0.023152f, -0.013001f, 0.004249f, -0.018887f, -0.017615f, -0.008838f, -0.006008f, -0.012126f, -0.001094f, 0.015352f, 0.016164f, 0.002411f, 0.017433f, 0.005402f, 0.002263f, 0.013203f, -0.014294f, -0.002573f, -0.000084f, -0.011748f, -0.000204f, -0.011383f, 0.013594f, -0.004007f, -0.002586f, 0.011304f, -0.002175f, -0.003656f, -0.002441f, 0.013511f, -0.001749f, 0.004669f, -0.013313f, -0.004764f, 0.007310f, + -0.008653f, 0.000542f, 0.000168f, 0.001382f, -0.006611f, -0.004606f, -0.003512f, 0.000127f, -0.003654f, -0.004349f, 0.001293f, -0.000738f, -0.003906f, -0.001768f, 0.000431f, -0.000492f, -0.001264f, -0.001387f, -0.002276f, 0.000619f, -0.007170f, -0.005027f, -0.004851f, -0.004821f, -0.000007f, -0.000351f, -0.001752f, 0.001646f, 0.036000f, -0.017780f, -0.017115f, 0.011591f, 0.029258f, 0.005687f, 0.026351f, 0.015039f, 0.023932f, 0.010602f, -0.004477f, -0.010869f, 0.008571f, -0.017891f, -0.013609f, 0.019970f, 0.016705f, 0.041733f, -0.001076f, 0.005805f, -0.015459f, 0.016118f, 0.007303f, -0.018604f, -0.004410f, 0.023635f, -0.000077f, -0.026045f, -0.010519f, -0.014700f, -0.004987f, 0.014525f, 0.013345f, -0.009880f, -0.004787f, 0.018118f, -0.017555f, 0.008062f, 0.015273f, 0.018246f, -0.009735f, 0.015706f, -0.006629f, -0.023723f, 0.008390f, 0.021774f, -0.005811f, 0.006287f, 0.005333f, -0.007381f, 0.002679f, 0.006525f, -0.006748f, 0.002429f, 0.017657f, -0.010383f, -0.005463f, 0.016275f, -0.003466f, -0.003288f, -0.026960f, -0.009552f, -0.016266f, -0.026781f, -0.018006f, 0.013445f, -0.008745f, -0.011449f, + 0.023241f, 0.023202f, -0.005819f, 0.024954f, 0.010049f, 0.016394f, -0.004557f, -0.012905f, 0.010838f, -0.013383f, -0.026680f, -0.016104f, -0.006816f, 0.013188f, 0.006143f, 0.022108f, 0.003967f, -0.004771f, -0.003518f, -0.000015f, 0.003904f, -0.006880f, 0.000514f, -0.004001f, -0.000508f, 0.003875f, -0.000598f, 0.000615f, 0.007230f, -0.002607f, -0.001217f, 0.007100f, -0.005148f, -0.002688f, -0.003381f, 0.002089f, -0.003778f, 0.002580f, 0.001677f, 0.001093f, 0.003832f, 0.004765f, 0.002266f, 0.008613f, 0.001153f, 0.005879f, 0.002109f, 0.004411f, 0.005198f, -0.004500f, 0.004161f, 0.004326f, -0.003034f, -0.001007f, -0.000334f, -0.006287f, 0.001922f, -0.018175f, -0.019443f, 0.026336f, -0.004386f, 0.060164f, -0.024777f, -0.011651f, -0.001380f, 0.014681f, -0.008386f, -0.008195f, -0.024783f, -0.028680f, 0.012958f, 0.002490f, 0.039599f, 0.012827f, -0.004034f, -0.004521f, 0.026308f, 0.026848f, -0.022175f, 0.016114f, -0.021181f, 0.005570f, -0.009115f, -0.010927f, -0.006491f, 0.004507f, -0.003433f, 0.013941f, 0.007006f, 0.015600f, -0.001928f, -0.007454f, -0.014634f, -0.002844f, 0.017075f, 0.001519f, + -0.022639f, -0.002860f, 0.005537f, -0.009687f, 0.017976f, 0.015158f, 0.003182f, 0.005267f, -0.049455f, -0.018964f, 0.017322f, -0.001169f, 0.027805f, 0.007742f, 0.031339f, -0.003527f, -0.016902f, 0.016706f, -0.009434f, 0.011392f, 0.002072f, 0.045598f, 0.037760f, 0.004441f, 0.010718f, -0.006229f, 0.015047f, 0.015897f, 0.017254f, 0.018584f, 0.030303f, -0.000569f, 0.005487f, -0.011612f, -0.010045f, 0.009459f, -0.014085f, -0.035099f, -0.025952f, -0.000628f, 0.021859f, -0.011018f, -0.019773f, -0.011419f, -0.010629f, -0.001209f, -0.023615f, -0.000975f, 0.004477f, -0.000184f, -0.003112f, -0.002356f, 0.002540f, 0.005090f, -0.000560f, 0.003829f, -0.017604f, -0.010879f, -0.005560f, -0.012576f, 0.001204f, -0.004564f, -0.007215f, -0.004951f, -0.002883f, 0.007128f, 0.003029f, -0.006760f, 0.002303f, 0.015807f, 0.008261f, -0.003388f, -0.005541f, -0.007257f, -0.004086f, -0.005860f, -0.012278f, 0.004508f, -0.004663f, -0.001043f, 0.009119f, 0.002895f, -0.001657f, 0.001685f, -0.052257f, 0.041185f, -0.001213f, 0.004660f, -0.014497f, 0.023079f, -0.049617f, -0.031814f, -0.010052f, -0.012762f, -0.001231f, -0.044487f, + 0.008673f, 0.000885f, -0.001225f, -0.020330f, -0.020695f, 0.008383f, 0.028302f, 0.004364f, -0.037842f, -0.008220f, -0.030991f, 0.024434f, 0.015755f, 0.001206f, -0.013738f, -0.006507f, -0.007028f, 0.020133f, -0.002903f, -0.000429f, -0.004394f, -0.027415f, 0.014209f, 0.019184f, -0.011511f, -0.006152f, 0.014912f, -0.029837f, -0.021756f, -0.032915f, -0.011173f, 0.008259f, -0.021007f, -0.010037f, -0.000915f, -0.034083f, 0.010391f, 0.021002f, 0.037183f, 0.005343f, -0.003713f, 0.002272f, -0.024487f, -0.019202f, 0.028465f, -0.002044f, -0.010845f, -0.006742f, -0.043624f, -0.023410f, 0.008520f, -0.009224f, -0.005100f, -0.003412f, 0.028519f, -0.004960f, -0.027128f, 0.002165f, 0.021116f, -0.000554f, -0.013311f, -0.000272f, 0.001450f, -0.011214f, -0.019024f, 0.014932f, -0.034970f, -0.017311f, -0.000267f, 0.016894f, -0.021375f, 0.013512f, 0.008950f, 0.012311f, 0.013118f, -0.013428f, -0.003397f, 0.016099f, 0.003079f, -0.009845f, 0.009237f, 0.013325f, -0.012457f, 0.004631f, 0.011954f, 0.011290f, 0.017735f, 0.001199f, -0.005417f, -0.003027f, 0.002913f, 0.000246f, 0.007801f, 0.006575f, 0.000610f, -0.001607f, + -0.005655f, -0.001919f, 0.003913f, 0.007929f, -0.013097f, 0.001708f, -0.002476f, 0.005447f, 0.012665f, 0.000649f, 0.008877f, -0.004702f, 0.005906f, 0.007264f, 0.010689f, 0.008344f, 0.010435f, -0.000739f, 0.006007f, -0.001884f, 0.005106f, 0.027683f, 0.025424f, 0.009250f, 0.043056f, -0.019197f, -0.008937f, 0.007012f, -0.011230f, -0.003277f, 0.014090f, 0.046135f, -0.007397f, 0.009409f, -0.000246f, -0.002787f, -0.000719f, 0.050880f, -0.024588f, 0.026429f, -0.000227f, -0.033278f, 0.011095f, -0.033010f, -0.020161f, 0.019168f, -0.017371f, 0.013583f, 0.000779f, 0.001897f, 0.022830f, 0.018317f, -0.027334f, -0.030972f, -0.023273f, -0.007742f, 0.008936f, 0.009043f, 0.003409f, 0.006229f, -0.037241f, 0.005798f, -0.019966f, -0.046895f, 0.032058f, -0.009161f, 0.030151f, 0.032246f, 0.001924f, 0.012103f, -0.017105f, -0.020830f, -0.036930f, 0.008589f, 0.033987f, 0.006073f, -0.014819f, 0.002097f, -0.007422f, 0.005288f, -0.019851f, -0.016217f, -0.019820f, 0.003526f, -0.002333f, -0.006407f, 0.021940f, 0.019745f, 0.011922f, 0.031926f, 0.003677f, -0.033396f, 0.043370f, -0.031516f, -0.009631f, -0.007832f, + -0.008260f, 0.036355f, -0.005686f, -0.051834f, 0.044291f, -0.017159f, -0.010453f, 0.012208f, 0.011331f, 0.034146f, 0.021867f, 0.014355f, 0.016770f, 0.015150f, 0.011512f, 0.000758f, 0.014436f, 0.017303f, 0.004709f, 0.000341f, 0.018568f, -0.003161f, 0.002293f, -0.016814f, -0.003911f, -0.005280f, -0.008636f, 0.001528f, -0.001201f, 0.011223f, 0.008256f, 0.003419f, -0.001207f, 0.005469f, 0.002488f, 0.004019f, 0.007681f, -0.002195f, -0.002680f, 0.001691f, -0.002631f, 0.005699f, 0.002810f, 0.002727f, 0.004637f, 0.002674f, 0.017225f, 0.012559f, 0.003771f, 0.039436f, 0.044571f, 0.010417f, -0.083769f, 0.003040f, 0.023718f, -0.027643f, 0.016897f, 0.033549f, 0.001703f, 0.009137f, 0.021226f, 0.016305f, 0.006384f, 0.030158f, 0.006913f, -0.004142f, 0.056682f, 0.021098f, 0.007500f, 0.024508f, -0.018591f, 0.030056f, -0.020910f, -0.001791f, -0.002243f, -0.006893f, -0.030896f, 0.010449f, -0.021810f, 0.040367f, -0.003435f, -0.007887f, 0.059439f, 0.007958f, 0.008845f, 0.019765f, 0.002420f, 0.011408f, -0.013106f, -0.025796f, -0.002739f, 0.017469f, -0.030383f, 0.035534f, 0.032261f, 0.023685f, + 0.006420f, 0.014114f, -0.020914f, -0.021934f, -0.034607f, -0.015363f, -0.018562f, -0.017889f, 0.008534f, -0.003358f, -0.033868f, -0.015109f, 0.030264f, -0.000488f, -0.027886f, 0.015982f, -0.001293f, -0.019151f, -0.045429f, 0.003209f, -0.068988f, 0.040290f, -0.023300f, 0.036648f, 0.002062f, 0.010238f, 0.001490f, -0.013588f, 0.018721f, 0.061961f, 0.005989f, 0.017677f, -0.010526f, -0.048255f, 0.004590f, -0.005189f, 0.035641f, 0.020582f, -0.007993f, -0.001686f, -0.006984f, -0.003795f, 0.012347f, -0.013795f, 0.011619f, -0.001606f, -0.011795f, -0.012209f, 0.013400f, -0.014958f, -0.014387f, -0.020745f, -0.003825f, -0.014910f, 0.005074f, 0.013084f, 0.001277f, -0.003757f, -0.009288f, 0.019095f, -0.017482f, 0.004727f, 0.002740f, 0.001630f, -0.010069f, 0.007616f, 0.019219f, -0.000808f, -0.008871f, -0.002258f, 0.017601f, 0.017800f, -0.013757f, 0.017044f, -0.000725f, -0.004423f, 0.003238f, -0.001072f, 0.019389f, 0.004912f, 0.023097f, 0.017182f, 0.045651f, -0.062795f, 0.024741f, -0.036784f, 0.031322f, -0.015623f, -0.026405f, -0.007585f, -0.030409f, -0.012796f, -0.006822f, 0.010948f, 0.013945f, -0.008889f, + 0.043828f, -0.002091f, -0.007610f, -0.005919f, -0.039804f, -0.004429f, 0.000105f, -0.033476f, 0.010664f, -0.028554f, -0.036019f, -0.011674f, 0.021585f, -0.059582f, -0.040487f, -0.027059f, 0.002995f, -0.041793f, -0.035530f, -0.028775f, -0.014504f, -0.011703f, -0.005557f, -0.028269f, 0.030081f, 0.005108f, -0.003017f, -0.021119f, -0.021735f, 0.040716f, -0.035570f, -0.024341f, 0.010630f, 0.010800f, 0.014570f, -0.020689f, -0.028758f, -0.012183f, -0.005412f, 0.013274f, -0.020680f, -0.008341f, -0.008517f, -0.024666f, -0.042017f, -0.053073f, 0.050052f, -0.054991f, -0.003143f, 0.003826f, -0.009674f, -0.010219f, -0.049199f, 0.018960f, -0.011867f, -0.051574f, -0.001268f, -0.011369f, 0.048398f, 0.011954f, 0.034418f, 0.032786f, -0.009871f, 0.012811f, -0.005486f, -0.009416f, 0.024190f, -0.006173f, 0.013865f, -0.018645f, 0.001369f, -0.018776f, 0.015918f, 0.012482f, 0.002204f, 0.011425f, -0.004973f, -0.001803f, 0.012064f, 0.005785f, -0.011937f, 0.008767f, 0.019724f, -0.003064f, 0.004502f, -0.010778f, -0.025402f, -0.002671f, -0.002290f, -0.000847f, -0.017648f, -0.003816f, 0.002762f, -0.002539f, -0.009428f, 0.012027f, + -0.002250f, -0.006766f, -0.020551f, -0.020724f, 0.000268f, 0.011429f, 0.006680f, 0.004451f, -0.001418f, 0.015001f, 0.016944f, -0.007551f, 0.003643f, 0.004187f, -0.001139f, 0.005148f, -0.055872f, 0.064638f, 0.010236f, 0.006519f, -0.011208f, 0.032818f, 0.000405f, 0.054038f, -0.014736f, 0.037068f, 0.019985f, -0.053304f, 0.023104f, 0.008731f, 0.025306f, -0.004374f, -0.014193f, -0.021247f, -0.007810f, 0.026008f, 0.057292f, 0.006032f, -0.008367f, -0.036278f, 0.013691f, -0.039237f, -0.006195f, 0.039529f, -0.035738f, 0.000018f, 0.002525f, -0.006213f, -0.013481f, -0.015250f, 0.063505f, -0.013762f, -0.015581f, -0.007746f, 0.014415f, 0.021248f, 0.007999f, 0.001000f, -0.012922f, -0.000242f, 0.009520f, 0.038518f, -0.008838f, 0.055128f, 0.032275f, 0.016385f, -0.013250f, 0.048042f, 0.054685f, -0.004562f, -0.014461f, -0.002926f, -0.017748f, 0.005379f, -0.017572f, 0.027512f, 0.009426f, 0.039663f, 0.030731f, -0.048717f, -0.054781f, 0.065679f, 0.048895f, 0.007692f, -0.009255f, -0.026149f, -0.036059f, -0.014189f, 0.037073f, -0.034910f, -0.037635f, -0.005384f, -0.010107f, -0.060375f, -0.013360f, 0.013312f, + -0.023280f, 0.003153f, -0.000063f, 0.003118f, 0.005001f, 0.009947f, -0.017674f, -0.011041f, -0.018161f, -0.006703f, 0.000042f, 0.002618f, -0.009843f, -0.004836f, -0.001625f, -0.029853f, -0.009760f, -0.014271f, -0.006397f, -0.000898f, 0.002797f, 0.001125f, 0.005157f, -0.002030f, 0.001285f, -0.015779f, 0.009202f, -0.013607f, -0.015369f, 0.010952f, 0.004971f, -0.028047f, -0.002811f, -0.008876f, 0.014008f, 0.026452f, 0.000818f, -0.022835f, 0.018458f, -0.005340f, 0.005025f, 0.006203f, -0.007087f, -0.005486f, 0.001953f, -0.012305f, -0.015692f, 0.028580f, -0.023483f, -0.007631f, -0.004970f, 0.005623f, 0.000866f, -0.035274f, -0.102153f, 0.051137f, -0.049140f, 0.019989f, 0.072844f, 0.011106f, -0.030569f, 0.021010f, 0.025370f, -0.010624f, -0.023131f, -0.004817f, -0.050333f, 0.016592f, -0.052314f, -0.031773f, 0.020967f, 0.002150f, 0.009027f, -0.047263f, -0.009645f, -0.034121f, -0.028986f, -0.042098f, -0.014716f, 0.014401f, -0.025093f, -0.025453f, 0.024697f, 0.003404f, -0.002106f, 0.007851f, -0.048437f, -0.002993f, -0.037678f, 0.032222f, 0.008859f, -0.092156f, 0.023175f, 0.049368f, -0.010588f, 0.029444f, + 0.024754f, 0.016717f, 0.013378f, 0.047148f, 0.036938f, 0.001346f, -0.033791f, -0.007155f, 0.037332f, 0.024235f, -0.031324f, 0.002233f, -0.036585f, -0.011796f, 0.002421f, 0.026487f, 0.035444f, -0.065198f, -0.051590f, -0.028871f, 0.005438f, -0.019399f, -0.007219f, 0.060614f, 0.009923f, 0.014333f, 0.047169f, -0.019190f, 0.009688f, -0.012075f, 0.048262f, -0.024626f, 0.001916f, 0.004791f, 0.035736f, -0.010000f, -0.003862f, 0.013075f, 0.014628f, -0.001893f, 0.007108f, 0.023352f, 0.000866f, -0.000763f, -0.001027f, 0.022737f, -0.011608f, -0.007404f, 0.005403f, 0.009821f, 0.006608f, 0.002972f, 0.010653f, -0.005025f, -0.000044f, -0.010456f, -0.000388f, -0.007789f, -0.001249f, -0.010714f, 0.017353f, -0.013207f, -0.019463f, 0.018218f, 0.011864f, 0.012529f, -0.013782f, -0.017618f, -0.000141f, -0.031565f, -0.008785f, -0.016293f, -0.016664f, 0.006361f, -0.000342f, -0.016872f, 0.005483f, 0.006793f, -0.002042f, -0.010008f, -0.009803f, 0.007260f, 0.004346f, 0.014968f, 0.033763f, 0.032628f, -0.057095f, 0.011853f, -0.012348f, -0.015081f, -0.013313f, 0.038171f, 0.020262f, -0.027994f, -0.015975f, 0.029102f, + -0.052503f, 0.002882f, 0.019040f, 0.029152f, -0.006270f, 0.006374f, -0.061251f, -0.000332f, -0.027150f, 0.020372f, 0.007499f, 0.033869f, -0.053861f, -0.027266f, -0.007853f, 0.006532f, -0.004651f, 0.010403f, 0.003838f, 0.029254f, 0.055340f, -0.035158f, -0.045275f, 0.011811f, -0.047178f, -0.014027f, 0.019759f, -0.034414f, -0.033310f, 0.002661f, 0.020539f, 0.028689f, 0.020461f, -0.012997f, -0.002876f, -0.060194f, -0.040475f, 0.053200f, -0.036980f, 0.071855f, -0.030488f, 0.014523f, 0.010583f, -0.000703f, -0.052857f, 0.066147f, -0.030819f, -0.006423f, -0.011858f, 0.025735f, 0.049994f, -0.050650f, -0.028645f, 0.059125f, -0.043792f, -0.000250f, -0.016472f, 0.011945f, 0.068709f, 0.000213f, -0.004944f, -0.042631f, 0.052596f, -0.017285f, 0.013770f, 0.017169f, -0.033062f, -0.040214f, 0.004053f, 0.022896f, -0.011835f, 0.011638f, -0.094808f, -0.044488f, -0.013429f, -0.048630f, -0.023700f, 0.007888f, 0.031657f, -0.006839f, -0.008447f, -0.024973f, 0.000860f, -0.002577f, -0.017883f, -0.006463f, 0.011340f, 0.000707f, 0.015131f, 0.006759f, 0.014364f, -0.018903f, -0.002398f, -0.004152f, 0.019909f, 0.015300f, + -0.011485f, 0.035780f, 0.013588f, -0.014761f, 0.022168f, 0.005730f, -0.001826f, -0.011679f, 0.008620f, -0.008529f, -0.007380f, 0.015822f, 0.001754f, -0.007372f, -0.005941f, 0.013202f, -0.003323f, 0.011900f, -0.002341f, 0.021886f, 0.005082f, 0.002908f, 0.003237f, 0.033071f, -0.037062f, 0.010722f, 0.031280f, 0.030910f, 0.069784f, -0.043871f, 0.064133f, -0.010959f, -0.041472f, -0.040619f, 0.010832f, 0.026936f, -0.018151f, -0.008259f, -0.028438f, -0.011570f, 0.054405f, -0.037879f, -0.003200f, 0.043741f, -0.013707f, 0.026212f, -0.017006f, -0.008017f, 0.046454f, -0.001371f, 0.002711f, 0.044738f, 0.031194f, 0.011142f, -0.005113f, 0.037818f, 0.051652f, -0.052019f, 0.048568f, -0.045927f, 0.024802f, -0.033093f, 0.007350f, 0.039960f, 0.013974f, -0.090014f, 0.040448f, 0.025835f, 0.000097f, 0.045957f, -0.071231f, -0.013631f, 0.049116f, 0.041661f, 0.007343f, 0.065355f, -0.034248f, 0.000947f, -0.007914f, -0.009883f, 0.028376f, 0.011732f, 0.049253f, 0.040859f, -0.030079f, 0.027163f, -0.056209f, -0.017388f, 0.004978f, -0.002727f, -0.003948f, -0.009061f, -0.088209f, -0.048782f, -0.068020f, -0.046359f, + 0.051388f, -0.031537f, -0.007205f, 0.005943f, 0.083850f, -0.019828f, -0.028884f, 0.067035f, 0.041470f, -0.001846f, 0.054671f, 0.008314f, 0.010764f, -0.025248f, 0.000611f, -0.021111f, -0.021875f, -0.011468f, 0.018089f, -0.021354f, -0.010667f, 0.010427f, 0.004532f, 0.016819f, -0.006170f, -0.002787f, 0.022214f, 0.012639f, 0.001859f, -0.017127f, -0.013266f, -0.002118f, -0.004742f, 0.012905f, 0.022200f, -0.001606f, 0.004452f, 0.004996f, -0.008133f, 0.053812f, 0.017264f, 0.003810f, 0.002811f, -0.017621f, 0.014974f, -0.031480f, -0.001663f, 0.027067f, -0.001207f, -0.007215f, 0.020353f, 0.011203f, 0.006736f, -0.000530f, -0.016815f, 0.011608f, 0.013477f, 0.004139f, -0.022240f, 0.021447f, 0.055045f, -0.030399f, 0.021235f, 0.027170f, -0.039688f, 0.005082f, -0.048809f, 0.018552f, -0.005232f, -0.026015f, 0.038633f, 0.001128f, 0.060272f, -0.003708f, -0.045153f, 0.076308f, -0.013745f, 0.007607f, 0.010506f, -0.071637f, 0.021536f, 0.061648f, 0.021958f, -0.026814f, -0.046933f, 0.004875f, 0.011408f, 0.052720f, 0.033973f, -0.017195f, -0.010289f, -0.041084f, 0.000361f, 0.059655f, -0.081120f, 0.024609f, + 0.056658f, -0.051002f, 0.018685f, 0.005298f, 0.019622f, 0.059679f, 0.019896f, 0.023036f, -0.011084f, -0.058595f, 0.060641f, -0.011260f, -0.031051f, 0.127229f, 0.062567f, 0.032465f, 0.005538f, 0.002893f, -0.059901f, -0.049084f, -0.022298f, 0.037410f, -0.001300f, -0.034728f, -0.024555f, 0.047189f, -0.028851f, 0.032507f, 0.018407f, -0.023289f, 0.034682f, 0.015911f, -0.050434f, -0.025162f, -0.029604f, 0.008313f, 0.031509f, -0.063029f, 0.020689f, -0.064583f, -0.081659f, -0.051312f, 0.078241f, -0.027056f, 0.016139f, -0.018295f, -0.027236f, -0.003898f, -0.032458f, -0.022442f, -0.017309f, 0.004003f, -0.031121f, 0.003666f, 0.018139f, -0.000017f, -0.027411f, -0.020303f, 0.009493f, 0.003100f, 0.034692f, 0.004670f, -0.040092f, -0.015540f, -0.023019f, 0.032863f, -0.006778f, -0.013285f, -0.031765f, -0.000401f, 0.018905f, 0.008681f, 0.021549f, -0.010973f, -0.003682f, 0.006411f, 0.021939f, 0.014062f, -0.000747f, -0.012515f, 0.016292f, -0.015326f, -0.001744f, 0.008914f, -0.014429f, -0.000380f, 0.024524f, -0.000801f, 0.004422f, -0.027142f, -0.019260f, -0.020655f, 0.012118f, -0.021976f, 0.078078f, 0.130083f, + -0.021540f, -0.004224f, -0.106436f, -0.035661f, -0.078216f, -0.052138f, 0.072779f, 0.005248f, 0.019899f, -0.060234f, 0.019730f, -0.052881f, -0.119059f, 0.017475f, 0.057477f, -0.004637f, 0.007610f, 0.061763f, -0.081552f, 0.093414f, 0.046731f, 0.029219f, -0.046033f, 0.062832f, 0.121217f, -0.023971f, 0.037637f, 0.091965f, 0.077828f, 0.136991f, 0.030003f, 0.049236f, 0.037517f, 0.033418f, 0.117867f, -0.030508f, -0.013682f, 0.043434f, 0.026051f, -0.012682f, 0.064987f, 0.003996f, 0.013952f, -0.038272f, -0.104674f, 0.004181f, 0.070435f, 0.010776f, 0.042826f, -0.075691f, 0.005115f, -0.100682f, 0.000612f, -0.108209f, 0.007897f, 0.076094f, -0.009182f, -0.032179f, -0.102818f, 0.135398f, 0.025068f, 0.009196f, 0.140607f, -0.001565f, -0.031513f, -0.023528f, 0.007760f, 0.028153f, -0.007203f, 0.000624f, -0.010566f, -0.073961f, 0.044473f, 0.017182f, -0.045868f, -0.028340f, 0.037257f, -0.044639f, -0.076894f, -0.037690f, 0.017431f, 0.074193f, -0.076973f, 0.061784f, -0.002508f, 0.033006f, -0.013028f, 0.026952f, -0.018080f, -0.002637f, 0.007206f, 0.007620f, 0.025341f, 0.022607f, 0.005135f, 0.047408f, + -0.002010f, 0.019496f, 0.025387f, 0.014576f, 0.011347f, 0.011320f, 0.041319f, 0.030456f, 0.015125f, -0.016001f, -0.006329f, 0.035487f, -0.046907f, 0.018203f, -0.027870f, 0.006749f, -0.010193f, 0.031998f, 0.037261f, 0.075017f, 0.042251f, 0.070759f, 0.040868f, 0.014813f, 0.074670f, 0.077117f, 0.073730f, 0.042008f, -0.012403f, 0.043959f, 0.049011f, 0.030000f, 0.058940f, 0.044209f, 0.000183f, 0.013328f, 0.010184f, 0.009600f, 0.017366f, 0.012429f, -0.014950f, -0.015226f, 0.000801f, 0.012267f, -0.003589f, -0.040803f, -0.135672f, 0.006848f, 0.184060f, 0.027010f, -0.037124f, -0.035232f, -0.083323f, -0.054441f, 0.002900f, 0.114977f, 0.020634f, -0.076370f, -0.005066f, 0.031495f, 0.008001f, 0.002529f, -0.007056f, 0.020180f, -0.054229f, -0.020323f, 0.028525f, 0.063774f, 0.064694f, -0.060319f, -0.022657f, 0.004812f, 0.009188f, 0.016339f, -0.068941f, 0.006892f, 0.012046f, -0.018161f, 0.050776f, -0.000364f, 0.058505f, 0.087134f, 0.042398f, 0.018170f, 0.038670f, -0.049218f, 0.045679f, -0.039725f, 0.067949f, 0.118712f, 0.039899f, -0.063902f, -0.054370f, 0.053892f, 0.020532f, 0.101216f, + 0.076916f, 0.023380f, -0.017981f, -0.022498f, 0.004122f, 0.005435f, -0.034129f, 0.039467f, 0.035472f, 0.006722f, 0.092418f, 0.062697f, -0.007255f, 0.044754f, 0.050843f, 0.023351f, 0.050877f, 0.002296f, -0.085593f, -0.010586f, -0.019647f, -0.019924f, 0.100068f, 0.045651f, 0.017364f, 0.078702f, 0.047884f, 0.050214f, 0.062870f, 0.021374f, -0.061328f, -0.031023f, -0.000034f, -0.001004f, -0.020665f, -0.018304f, -0.036559f, 0.023779f, 0.016829f, 0.036996f, -0.015742f, 0.041265f, 0.013168f, 0.042720f, 0.030181f, -0.009361f, -0.020097f, 0.006477f, 0.013214f, 0.000481f, 0.006633f, 0.031299f, 0.004798f, 0.048923f, 0.067232f, 0.018817f, -0.003670f, 0.004870f, 0.048888f, 0.010895f, -0.012994f, -0.012435f, 0.039093f, -0.001886f, -0.009592f, -0.007169f, 0.014265f, 0.026405f, 0.054626f, -0.027670f, 0.006306f, -0.017932f, 0.006456f, 0.002128f, 0.045080f, -0.023003f, 0.023396f, 0.026027f, 0.017755f, -0.019505f, 0.008312f, 0.030276f, 0.006174f, 0.000889f, 0.031674f, 0.003998f, 0.020113f, 0.011053f, 0.005455f, -0.005677f, 0.007871f, -0.004125f, 0.009342f, 0.002075f, 0.009854f, 0.001679f, + 0.017073f, 0.003960f, 0.008687f, 0.002954f, 0.013350f, 0.002564f, 0.013962f, 0.002972f, -0.000980f, -0.027114f, -0.129342f, -0.028023f, 0.072057f, 0.038915f, 0.157756f, 0.008537f, -0.023004f, -0.070842f, -0.138668f, -0.152268f, -0.025469f, 0.065514f, 0.073595f, 0.047170f, -0.077012f, -0.101651f, -0.000872f, -0.012523f, 0.040376f, 0.105887f, 0.053773f, -0.010023f, -0.063729f, -0.086277f, -0.054386f, 0.003466f, -0.053295f, 0.020624f, -0.044653f, -0.021994f, 0.070378f, 0.058381f, 0.051706f, 0.020278f, -0.072892f, -0.020273f, -0.069761f, -0.053428f, -0.028280f, 0.040968f, -0.008108f, 0.043518f, 0.106748f, 0.111789f, -0.047074f, 0.012875f, -0.083001f, -0.056416f, -0.039913f, -0.007136f, 0.014866f, 0.064860f, 0.068587f, 0.095387f, 0.067182f, 0.024387f, -0.047842f, -0.043446f, -0.011087f, 0.030707f, -0.078564f, 0.005737f, 0.090322f, 0.072675f, -0.019787f, 0.098473f, 0.087046f, 0.049643f, 0.090975f, -0.173873f, 0.040508f, -0.049359f, -0.054541f, 0.029955f, -0.029715f, -0.002393f, 0.174491f, 0.148575f, 0.051620f, -0.045734f, -0.005129f, -0.069659f, -0.014810f, -0.093711f, -0.034458f, -0.015634f, + 0.035037f, 0.115095f, 0.059005f, 0.024261f, 0.019225f, -0.018354f, -0.058985f, -0.074101f, -0.001136f, -0.048853f, 0.037883f, -0.004085f, -0.001712f, 0.044288f, 0.034565f, 0.013813f, 0.035804f, 0.013417f, 0.056747f, -0.040466f, -0.002447f, -0.044631f, 0.016983f, -0.038780f, -0.037508f, 0.006516f, -0.012587f, 0.031289f, 0.053290f, 0.003655f, -0.052987f, -0.085750f, -0.027876f, -0.049577f, 0.003717f, 0.022674f, 0.038687f, -0.032950f, -0.013940f, 0.043922f, 0.003786f, -0.223460f, -0.253377f, -0.272436f, -0.275268f, -0.373245f, -0.022117f, -0.133665f, -0.043178f, 0.049561f, 0.124783f, 0.175092f, 0.180573f, 0.368993f, 0.395621f, 0.322124f, 0.239603f, 0.253850f, 0.242020f, 0.093368f, -0.035956f, -0.166189f, -0.166554f, -0.255561f, -0.083034f, -0.138435f, -0.103250f, -0.009534f, -0.216979f, -0.062278f, -0.193800f, -0.052605f, -0.222693f, -0.209842f, -0.096902f, -0.173215f, -0.017655f, -0.087400f, -0.080879f, -0.129480f, -0.085765f, -0.195594f, -0.138336f, -0.073355f, -0.067351f, -0.103383f, -0.063400f, -0.007433f, -0.083756f, 0.028409f, 0.125294f, -0.097376f, 0.148211f, 0.089002f, 0.197818f, 0.198851f, + 0.173504f, 0.214095f, 0.180761f, 0.298556f, 0.296422f, 0.236548f, 0.316286f, 0.271367f, 0.414220f, 0.408050f, 0.480678f, 0.374270f, 0.402698f, 0.438981f, 0.396401f, 0.474126f, 0.351226f, 0.513394f, 0.410189f, 0.156520f, 0.200582f, 0.053056f, 0.079464f, -0.277466f, -0.233016f, -0.259958f, -0.276877f, -0.291749f, -0.377180f, -0.354953f, -0.390362f, -0.428441f, -0.503904f, -0.420979f, -0.385658f, -0.428485f, -0.467517f, -0.557198f, -0.447132f, -0.494885f, -0.498354f, -0.377917f, -0.426297f, -0.245768f, -0.305325f, -0.208759f, -0.194057f, -0.102562f, -0.075199f, -0.106202f, -0.018434f, 0.050336f, 0.241971f, 0.229554f, 0.166433f, 0.188470f, 0.202450f, 0.274796f, 0.281172f, 0.304399f, 0.320721f, 0.276123f, 0.280233f, 0.206182f, 0.291563f, 0.298491f, 0.227063f, 0.159989f, 0.123195f, 0.179355f, 0.177060f, 0.138126f, 0.082407f, 0.045841f, 0.069324f, -0.018169f, 0.009033f, -0.032706f, -0.026455f, -0.132490f, -0.121834f, -0.088461f, -0.061817f, -0.080751f, -0.062516f, -0.029686f, -0.025136f, -0.032194f, -0.060541f, -0.055091f, -0.028240f, -0.035578f, -0.024448f, -0.019988f, 0.002779f, 0.009119f, + 0.000590f, -0.008130f, -0.002561f, 0.000811f, -0.001943f, -0.001991f, -0.001969f} + }, + { + {-0.005288f, 0.009776f, -0.000395f, 0.004012f, 0.001553f, -0.008552f, -0.006433f, 0.002231f, -0.005796f, -0.008599f, 0.004903f, -0.001018f, 0.001279f, -0.004936f, 0.003625f, 0.000350f, -0.007620f, -0.000346f, 0.008790f, 0.007144f, -0.005472f, -0.009639f, -0.008786f, 0.001293f, -0.002027f, -0.001722f, -0.007478f, 0.008134f, -0.002167f, 0.002292f, -0.003413f, -0.002070f, -0.000750f, 0.003085f, -0.002216f, -0.004282f, -0.016411f, 0.005580f, -0.001251f, 0.005303f, 0.003142f, 0.002229f, -0.000431f, 0.010939f, 0.002048f, 0.002186f, 0.001519f, -0.005597f, -0.003587f, -0.000519f, 0.000796f, -0.005603f, -0.001334f, 0.002181f, -0.000779f, -0.005294f, -0.002796f, 0.000195f, 0.005169f, -0.008106f, -0.011004f, -0.013626f, 0.004816f, 0.007807f, 0.000781f, 0.006457f, 0.004729f, 0.000907f, -0.012500f, -0.000325f, -0.003278f, -0.004382f, 0.000207f, 0.000698f, 0.005166f, -0.001115f, 0.007356f, 0.005215f, -0.002340f, -0.007481f, -0.003649f, -0.001336f, 0.001900f, 0.000572f, 0.002404f, 0.002803f, 0.005133f, -0.000109f, -0.000503f, -0.002422f, -0.002109f, -0.002005f, -0.000904f, -0.004174f, -0.001983f, -0.002360f, + 0.001287f, -0.000276f, -0.000537f, -0.001283f, 0.001945f, -0.002938f, 0.005896f, 0.007712f, -0.001795f, -0.000118f, -0.011066f, 0.009842f, -0.012673f, 0.004875f, 0.021301f, -0.004583f, -0.007953f, 0.001194f, 0.011105f, 0.001166f, -0.003183f, -0.001559f, -0.003208f, -0.002034f, -0.010038f, -0.003919f, 0.004918f, -0.007973f, -0.004570f, 0.000435f, -0.000463f, 0.008775f, -0.005389f, 0.001626f, -0.002099f, 0.001905f, -0.001139f, -0.005151f, 0.009715f, 0.016542f, 0.004174f, -0.000959f, -0.003125f, 0.017904f, 0.000815f, -0.007509f, 0.000482f, -0.013378f, 0.000030f, 0.006961f, -0.010275f, -0.001317f, 0.002183f, -0.008206f, -0.002482f, 0.009424f, 0.001328f, -0.001026f, 0.009092f, -0.006071f, -0.009592f, 0.005409f, 0.003582f, -0.006700f, -0.003328f, -0.007172f, -0.008405f, -0.009041f, -0.005007f, -0.005174f, 0.007310f, 0.005196f, 0.001425f, -0.000217f, -0.005088f, 0.004697f, -0.001109f, -0.003476f, 0.006194f, 0.006845f, -0.004898f, -0.000986f, -0.002320f, -0.003129f, 0.000956f, 0.007844f, -0.003971f, 0.001751f, 0.007480f, 0.004942f, -0.001722f, 0.001891f, -0.001313f, -0.000214f, 0.003169f, -0.000457f, + 0.000047f, 0.003225f, -0.003458f, 0.001395f, 0.000709f, -0.001113f, -0.003186f, 0.002433f, 0.000279f, -0.001429f, 0.000749f, 0.000344f, -0.001142f, 0.000358f, -0.000585f, -0.001066f, -0.001860f, 0.010891f, -0.015877f, -0.010482f, -0.003781f, -0.002310f, 0.000536f, 0.002042f, -0.015140f, 0.010513f, -0.004783f, 0.003435f, 0.002166f, 0.003499f, 0.006611f, -0.000048f, -0.002193f, -0.005039f, 0.010896f, -0.000862f, 0.007082f, 0.013458f, -0.002923f, 0.011443f, 0.009759f, -0.008463f, 0.005654f, 0.005723f, 0.006138f, -0.014933f, -0.001488f, 0.000892f, -0.004697f, -0.009393f, 0.000142f, 0.010958f, -0.002577f, -0.004695f, -0.003690f, 0.003351f, 0.010157f, 0.005017f, -0.005196f, -0.000087f, -0.004286f, 0.000430f, -0.001367f, -0.005065f, 0.009485f, -0.012266f, -0.010139f, -0.009310f, 0.002874f, -0.001310f, -0.000340f, -0.011444f, -0.012088f, 0.002942f, -0.000260f, 0.000682f, -0.001197f, -0.000644f, -0.009025f, -0.005340f, -0.009867f, 0.001931f, 0.008446f, -0.002636f, 0.007494f, 0.001403f, 0.006662f, -0.014404f, 0.000056f, 0.002079f, -0.004811f, -0.002175f, 0.001918f, -0.005134f, -0.000637f, 0.003771f, + 0.004069f, -0.003197f, -0.009640f, 0.008480f, 0.001324f, 0.000206f, -0.002135f, -0.001233f, -0.007720f, 0.000339f, 0.000526f, -0.001359f, 0.001386f, 0.000248f, -0.002728f, 0.001162f, 0.001243f, -0.000779f, -0.001116f, -0.000385f, -0.000466f, -0.000522f, 0.000419f, 0.004060f, 0.000062f, -0.001220f, 0.003355f, 0.001499f, -0.000271f, -0.001121f, -0.000339f, -0.005440f, 0.001342f, -0.001092f, 0.009348f, 0.014869f, 0.000943f, -0.005654f, -0.012644f, 0.005786f, 0.003755f, 0.003509f, 0.015751f, -0.010297f, 0.000364f, 0.001919f, -0.002855f, -0.005151f, 0.002330f, 0.000994f, 0.009495f, 0.020949f, -0.001844f, 0.003627f, 0.008760f, -0.003797f, 0.007814f, 0.013617f, -0.009501f, -0.000353f, -0.003540f, -0.000195f, 0.006075f, -0.010604f, 0.011460f, 0.002558f, 0.000135f, 0.006044f, -0.000992f, 0.008368f, -0.004533f, -0.001923f, -0.002353f, 0.013144f, 0.006127f, 0.008373f, -0.001584f, 0.006900f, -0.012751f, 0.014747f, -0.005705f, 0.005803f, -0.013423f, 0.005423f, 0.009750f, 0.017973f, 0.006601f, 0.003362f, -0.011820f, -0.004522f, 0.003269f, -0.008944f, -0.010643f, -0.002519f, 0.021233f, 0.024591f, + 0.004719f, 0.005791f, -0.007010f, -0.003109f, 0.013752f, 0.002688f, 0.006025f, -0.000825f, 0.004190f, 0.003691f, -0.001812f, 0.003150f, -0.002006f, 0.002376f, 0.001663f, 0.008691f, 0.007073f, -0.010899f, 0.009723f, -0.003184f, 0.005003f, -0.003429f, 0.003679f, -0.002893f, -0.004048f, -0.000071f, -0.006466f, 0.001021f, 0.004744f, 0.001083f, 0.002450f, -0.002294f, -0.002854f, -0.001469f, 0.001191f, 0.000208f, 0.001088f, -0.000415f, 0.000757f, -0.001825f, 0.000689f, 0.000702f, 0.003457f, 0.000208f, 0.002357f, -0.001103f, 0.002112f, 0.010371f, 0.000292f, 0.001296f, 0.014550f, -0.012249f, -0.014420f, 0.022486f, -0.005819f, -0.003594f, 0.014705f, 0.008804f, 0.001093f, -0.025786f, 0.027871f, -0.005096f, -0.003513f, -0.002919f, -0.001509f, 0.001116f, 0.001732f, 0.008722f, 0.013009f, 0.008573f, -0.001854f, 0.014594f, 0.009265f, 0.004697f, 0.003939f, -0.005354f, 0.006673f, -0.010472f, 0.008389f, -0.001587f, 0.003523f, -0.008862f, -0.012879f, 0.001670f, -0.001612f, 0.004747f, 0.007802f, -0.003816f, -0.012324f, -0.007187f, 0.003064f, -0.014799f, 0.009606f, 0.002997f, -0.023600f, 0.010698f, + 0.001663f, 0.006129f, 0.001563f, 0.003698f, 0.004046f, -0.000939f, -0.006629f, -0.005759f, -0.016089f, -0.011820f, -0.006543f, -0.008206f, -0.001775f, 0.000994f, -0.011762f, -0.016673f, -0.002446f, 0.010900f, 0.018770f, -0.000919f, -0.012416f, 0.002109f, -0.019552f, 0.001384f, -0.001284f, -0.007671f, 0.016596f, 0.015592f, 0.005294f, -0.000560f, -0.003938f, -0.001138f, -0.008627f, 0.004127f, 0.015921f, 0.008522f, 0.013170f, 0.002687f, -0.005915f, 0.006138f, 0.003236f, -0.000402f, 0.001322f, 0.000754f, 0.000454f, 0.002872f, 0.002988f, 0.002849f, -0.000817f, 0.004972f, 0.001406f, 0.009779f, 0.003875f, 0.002647f, 0.000531f, 0.000872f, 0.002643f, -0.000667f, 0.004643f, 0.001716f, 0.001843f, -0.002573f, 0.005758f, 0.001451f, -0.001952f, -0.000819f, -0.025305f, 0.013097f, -0.004820f, -0.008994f, -0.007131f, -0.008603f, -0.012024f, 0.023216f, -0.029536f, 0.006985f, 0.007153f, 0.009685f, 0.014452f, 0.002389f, 0.004024f, 0.005455f, 0.003923f, 0.003027f, 0.004904f, 0.012725f, 0.002305f, -0.006977f, -0.000003f, -0.001209f, -0.009087f, -0.008210f, 0.004222f, 0.008533f, 0.009171f, 0.001262f, + 0.006541f, -0.015375f, -0.001782f, -0.000200f, -0.000840f, -0.014568f, -0.008732f, -0.005233f, 0.009542f, 0.008577f, -0.000146f, -0.015946f, 0.000092f, -0.008628f, -0.006186f, -0.003119f, -0.004294f, 0.010048f, 0.013647f, 0.004163f, 0.014196f, -0.022694f, -0.015868f, 0.007576f, 0.004638f, 0.000792f, 0.003004f, 0.001506f, -0.007365f, -0.014267f, -0.009873f, 0.007594f, -0.006399f, 0.011602f, 0.011403f, -0.004136f, 0.010805f, -0.017174f, -0.008504f, -0.004817f, -0.005804f, 0.001278f, 0.031313f, -0.004481f, 0.008854f, -0.004976f, -0.004536f, -0.003169f, 0.006643f, 0.007146f, -0.000833f, 0.005773f, 0.003927f, -0.009747f, 0.002690f, 0.000770f, 0.004189f, 0.000933f, 0.000510f, -0.004903f, 0.003152f, -0.000182f, 0.003194f, 0.001046f, 0.001651f, -0.000888f, -0.001874f, 0.000958f, -0.002858f, -0.004088f, 0.001392f, -0.002227f, -0.003539f, -0.001021f, 0.001053f, 0.001421f, 0.001391f, 0.001558f, -0.000211f, 0.001126f, 0.002211f, 0.001875f, 0.000616f, 0.000566f, -0.000740f, -0.001161f, 0.002062f, 0.025913f, -0.004965f, 0.000723f, 0.010922f, -0.024638f, 0.016962f, 0.008610f, -0.013880f, 0.015440f, + 0.017273f, 0.005809f, -0.026602f, 0.016472f, 0.000732f, -0.002495f, 0.013491f, 0.014572f, -0.000810f, -0.004283f, 0.000441f, -0.010315f, 0.009683f, -0.005633f, -0.009827f, -0.020692f, 0.004853f, -0.022492f, 0.006060f, -0.005501f, -0.002501f, 0.006506f, -0.018323f, -0.007520f, 0.015265f, -0.001317f, -0.007102f, 0.009347f, 0.000637f, -0.007989f, 0.006924f, 0.002519f, 0.000696f, -0.003417f, 0.005285f, -0.011150f, -0.001153f, -0.016290f, 0.015445f, 0.015439f, -0.019184f, 0.012848f, -0.013681f, -0.005157f, 0.013277f, 0.018555f, -0.001327f, -0.009222f, 0.005624f, -0.001151f, 0.002692f, -0.022648f, -0.017900f, 0.003593f, 0.003235f, -0.004886f, -0.004639f, 0.005893f, -0.000680f, -0.008018f, 0.009600f, -0.009245f, 0.003265f, 0.006947f, -0.001568f, 0.010887f, -0.010878f, 0.011009f, -0.000057f, 0.017507f, -0.005981f, 0.005325f, 0.009894f, 0.001132f, -0.006253f, -0.001771f, -0.000632f, 0.005145f, -0.001695f, -0.008217f, 0.006958f, 0.001522f, -0.003434f, 0.003081f, -0.002304f, -0.000090f, -0.003222f, -0.000914f, 0.002389f, -0.002743f, 0.001794f, 0.004811f, -0.002469f, 0.001182f, 0.000351f, -0.001575f, + 0.003053f, 0.000827f, 0.002601f, -0.003851f, 0.001589f, -0.003943f, -0.004509f, 0.001700f, -0.000704f, 0.001855f, 0.001926f, 0.000587f, 0.007166f, 0.003122f, -0.009432f, 0.018181f, -0.006228f, 0.008845f, -0.018363f, -0.001304f, -0.004850f, -0.016671f, 0.000577f, 0.011771f, 0.020923f, 0.027376f, -0.015598f, -0.000440f, -0.019441f, -0.001457f, -0.012383f, 0.011049f, -0.011595f, -0.022925f, 0.001480f, -0.014694f, -0.001381f, 0.019003f, -0.011273f, -0.011246f, 0.020392f, 0.000627f, 0.003500f, -0.002137f, -0.011999f, 0.005090f, 0.004347f, 0.024576f, -0.016966f, 0.012051f, -0.014390f, 0.003582f, 0.004767f, -0.014198f, -0.008745f, 0.023599f, 0.006449f, -0.017562f, -0.004540f, -0.006429f, -0.014102f, -0.000599f, 0.023131f, 0.012389f, 0.016094f, 0.003675f, 0.006431f, -0.021122f, -0.003062f, 0.026849f, 0.002120f, -0.016695f, 0.008923f, 0.008873f, -0.012256f, -0.010672f, -0.005912f, -0.027594f, -0.004263f, 0.008187f, 0.013623f, 0.024217f, -0.006079f, -0.013258f, -0.003842f, -0.008255f, 0.019658f, -0.007323f, -0.017178f, -0.011707f, -0.005081f, -0.002351f, -0.005329f, -0.009932f, 0.021402f, -0.012279f, + -0.001500f, 0.001969f, 0.001015f, 0.006983f, 0.004350f, -0.006315f, -0.008479f, 0.006355f, 0.007631f, 0.008071f, -0.001859f, 0.003647f, -0.002249f, -0.001343f, 0.003602f, -0.000802f, -0.003766f, 0.003799f, 0.001774f, -0.000118f, -0.002470f, -0.000832f, -0.006269f, 0.000575f, -0.001564f, -0.005390f, -0.002759f, 0.002439f, 0.002120f, 0.000092f, 0.002491f, 0.011780f, -0.040896f, -0.028189f, -0.018069f, 0.002157f, -0.034266f, 0.005121f, 0.025471f, 0.008428f, 0.026226f, -0.014074f, -0.006491f, -0.002849f, -0.013632f, -0.005102f, -0.020464f, 0.036371f, 0.020765f, 0.014500f, -0.030729f, -0.005940f, -0.009891f, -0.019994f, 0.006914f, -0.002105f, 0.006483f, -0.024834f, -0.001710f, -0.002226f, -0.017836f, 0.010374f, 0.002951f, 0.018225f, 0.007329f, -0.015242f, 0.024010f, -0.011355f, 0.009743f, 0.005057f, -0.000205f, 0.019001f, 0.017657f, 0.004455f, -0.022917f, 0.027951f, -0.014154f, 0.020041f, 0.009133f, -0.010372f, -0.011539f, 0.022473f, 0.003294f, -0.002620f, 0.005846f, -0.018985f, -0.006810f, 0.010947f, -0.001594f, 0.019873f, -0.011495f, -0.017969f, 0.007360f, 0.005084f, 0.000605f, 0.019764f, + 0.008512f, 0.004018f, -0.012617f, 0.014383f, 0.005634f, -0.011026f, -0.001524f, -0.001184f, -0.006346f, -0.004612f, -0.005353f, 0.008651f, 0.021701f, 0.036583f, 0.016994f, -0.006172f, 0.001849f, -0.008399f, 0.008409f, 0.011256f, -0.000187f, -0.009348f, -0.005506f, -0.012202f, 0.007517f, -0.006667f, 0.001778f, -0.005765f, -0.001588f, 0.008117f, -0.000974f, 0.000879f, -0.007436f, 0.007938f, -0.004200f, -0.003563f, 0.004350f, -0.007302f, 0.007990f, -0.005595f, 0.004273f, -0.003955f, -0.000757f, 0.001791f, -0.005459f, -0.003877f, -0.002400f, -0.008883f, -0.008931f, -0.003917f, -0.000479f, -0.003148f, 0.007054f, 0.006519f, 0.003802f, -0.025822f, 0.034713f, 0.014394f, 0.039695f, -0.017795f, -0.021314f, 0.037827f, 0.001286f, -0.003896f, 0.008299f, 0.002911f, 0.022150f, 0.029511f, 0.003859f, -0.027390f, -0.043874f, 0.006176f, -0.012102f, 0.002698f, 0.001255f, -0.018977f, -0.001202f, 0.023928f, 0.019563f, 0.015394f, 0.030798f, -0.006930f, 0.026098f, -0.018299f, 0.023114f, 0.007626f, 0.017912f, -0.011973f, 0.031544f, 0.018178f, 0.023038f, -0.036513f, -0.000161f, 0.033270f, 0.018943f, 0.006067f, + -0.007870f, 0.050034f, 0.021124f, -0.019574f, -0.012069f, 0.012228f, -0.019058f, -0.001822f, -0.009140f, 0.002614f, 0.042006f, 0.044014f, 0.031956f, 0.011767f, 0.000386f, 0.016594f, -0.014579f, -0.003649f, 0.018036f, -0.018629f, 0.044480f, 0.027761f, 0.021841f, 0.008642f, -0.001693f, -0.020955f, 0.026418f, 0.001000f, 0.023047f, -0.010246f, 0.008968f, -0.014774f, -0.008473f, -0.000337f, 0.011635f, -0.017385f, 0.041414f, 0.017885f, -0.004530f, -0.020238f, -0.038983f, 0.019241f, 0.003443f, -0.012638f, -0.001169f, 0.004883f, -0.009088f, 0.005719f, 0.015085f, -0.002555f, -0.005151f, 0.000524f, -0.003162f, -0.003830f, 0.003432f, -0.004658f, -0.003423f, -0.006402f, 0.006779f, 0.003901f, -0.009769f, 0.005562f, 0.006316f, 0.006147f, -0.000175f, -0.002849f, -0.001079f, -0.000025f, 0.003281f, -0.000788f, 0.002431f, -0.005754f, 0.009578f, -0.011950f, 0.000220f, 0.004184f, 0.010735f, 0.042814f, -0.002576f, -0.021270f, -0.009629f, -0.016694f, -0.000709f, -0.026737f, 0.006843f, -0.023053f, 0.012933f, 0.002872f, -0.006271f, -0.018165f, -0.021665f, -0.032834f, -0.034026f, -0.010174f, 0.029389f, -0.002298f, + -0.019284f, 0.007835f, -0.018392f, 0.013962f, -0.015723f, 0.027495f, -0.028419f, 0.006527f, -0.020179f, -0.020686f, -0.003851f, 0.003398f, -0.006078f, 0.012923f, -0.040872f, 0.016324f, 0.003856f, -0.009939f, -0.002901f, -0.002818f, -0.020269f, -0.032486f, -0.034778f, 0.024853f, 0.012264f, -0.013683f, 0.021529f, 0.000575f, -0.009098f, -0.025651f, -0.053737f, -0.044301f, 0.024941f, -0.007847f, 0.000480f, -0.005436f, -0.002608f, -0.002690f, -0.036427f, 0.013684f, -0.043018f, -0.023038f, 0.001881f, -0.001488f, -0.009271f, -0.005915f, -0.005812f, 0.044136f, -0.013796f, -0.014588f, -0.012110f, 0.046181f, -0.008457f, -0.018765f, 0.029259f, -0.023196f, -0.014758f, -0.019147f, -0.016104f, -0.059919f, 0.011861f, 0.009400f, -0.020137f, -0.003081f, 0.013851f, -0.007977f, -0.005496f, -0.011324f, -0.010335f, -0.001634f, -0.005468f, -0.005489f, 0.020730f, -0.001923f, -0.002370f, 0.013744f, 0.016464f, -0.008412f, -0.006143f, -0.001575f, -0.003057f, 0.004016f, -0.010254f, 0.000926f, 0.001047f, 0.001663f, -0.006148f, -0.007662f, -0.003175f, 0.006565f, -0.002894f, -0.005764f, -0.000882f, 0.004065f, -0.013181f, -0.002314f, + 0.007283f, 0.000229f, -0.005321f, 0.006758f, -0.004658f, 0.005958f, -0.000137f, 0.005681f, 0.006225f, 0.006217f, -0.011529f, -0.001433f, -0.063313f, -0.047809f, -0.027350f, 0.055278f, -0.002817f, -0.009215f, -0.006755f, -0.004360f, -0.018218f, 0.019563f, 0.015123f, 0.049473f, -0.045659f, -0.008902f, 0.014060f, -0.033400f, -0.013367f, -0.011818f, 0.056988f, -0.000836f, 0.013136f, 0.029008f, 0.002624f, 0.027918f, -0.030148f, -0.037894f, -0.025359f, -0.006976f, -0.006447f, 0.004521f, 0.017807f, -0.000878f, -0.031920f, -0.022026f, -0.001636f, -0.017043f, -0.035810f, 0.031958f, -0.005345f, -0.017864f, -0.000228f, 0.010259f, 0.010151f, 0.005967f, -0.016184f, 0.003256f, -0.033300f, -0.014583f, -0.049384f, 0.023200f, 0.014917f, -0.005846f, -0.015507f, 0.018247f, -0.024607f, -0.006294f, 0.053272f, -0.005618f, 0.045147f, 0.020188f, 0.012104f, -0.011832f, -0.056706f, -0.023594f, -0.010909f, -0.030540f, -0.022829f, -0.014565f, 0.025380f, -0.011617f, 0.000578f, -0.022802f, 0.048351f, -0.017305f, 0.019944f, 0.013513f, -0.032991f, -0.013294f, 0.007275f, 0.030552f, 0.055818f, 0.046416f, 0.020120f, -0.003192f, + 0.019165f, 0.000117f, 0.001667f, -0.010974f, 0.005640f, -0.011345f, -0.007869f, -0.000239f, 0.003287f, -0.006865f, -0.009068f, -0.016385f, -0.013023f, 0.006909f, 0.005367f, 0.005622f, -0.006023f, -0.002574f, -0.032484f, -0.000682f, -0.014980f, -0.007110f, 0.005885f, 0.004432f, 0.001879f, 0.013348f, 0.000334f, -0.001984f, 0.001340f, -0.005512f, -0.023569f, -0.002334f, -0.013396f, 0.006605f, -0.011887f, -0.013058f, 0.001515f, 0.014915f, 0.006859f, -0.004415f, -0.008802f, -0.008289f, -0.003868f, 0.007936f, 0.002124f, -0.003793f, 0.032873f, -0.001521f, -0.018615f, 0.020307f, 0.011667f, 0.068679f, 0.002450f, 0.000855f, 0.024275f, -0.030837f, -0.021252f, -0.006031f, 0.005743f, 0.011223f, -0.008212f, 0.029151f, -0.017710f, 0.004178f, 0.027401f, 0.012436f, 0.010230f, 0.010273f, -0.020039f, 0.003979f, -0.000486f, -0.009685f, 0.004305f, -0.014445f, -0.025888f, -0.013398f, 0.002189f, -0.025427f, 0.033267f, -0.002215f, 0.003459f, -0.004338f, 0.022947f, 0.025932f, -0.004704f, -0.018762f, -0.001583f, -0.005829f, 0.030502f, 0.039167f, -0.027510f, -0.018782f, -0.013819f, 0.009987f, 0.029104f, -0.025609f, + 0.008835f, -0.000874f, 0.006268f, -0.013186f, -0.017809f, 0.005918f, 0.019280f, 0.003823f, -0.023356f, 0.021623f, 0.062902f, -0.020006f, 0.011901f, -0.004440f, 0.005087f, 0.024486f, 0.007093f, 0.028817f, 0.024108f, -0.005994f, 0.036819f, 0.066750f, 0.002959f, -0.024293f, 0.065350f, -0.001025f, 0.062501f, -0.021261f, -0.030173f, 0.028968f, 0.011356f, 0.043712f, -0.006764f, 0.061450f, 0.019626f, 0.014444f, -0.018010f, 0.029235f, 0.003694f, 0.003153f, 0.007132f, 0.023916f, 0.005310f, 0.027276f, 0.003629f, 0.006953f, 0.001275f, 0.004306f, 0.004682f, 0.008875f, -0.002384f, 0.009919f, 0.023120f, 0.009771f, 0.010787f, 0.003467f, 0.006484f, -0.012422f, 0.011506f, 0.004529f, 0.005481f, 0.008423f, 0.004735f, -0.000558f, 0.000242f, 0.006628f, -0.005974f, 0.002457f, 0.000719f, 0.005925f, 0.016661f, 0.006090f, -0.000104f, -0.007973f, 0.008994f, 0.001731f, 0.002504f, -0.001285f, 0.008801f, 0.005128f, 0.012809f, -0.043058f, -0.013885f, 0.067229f, 0.011257f, -0.031040f, 0.009270f, -0.023512f, 0.008728f, 0.012901f, -0.005437f, -0.035548f, -0.013352f, -0.053149f, 0.022090f, 0.018249f, + -0.020408f, 0.019794f, 0.030906f, 0.006361f, -0.008257f, -0.031041f, 0.007120f, 0.049687f, -0.023727f, 0.029823f, 0.028514f, 0.004508f, 0.021463f, 0.019862f, 0.000975f, 0.024769f, 0.016567f, -0.047306f, -0.006650f, -0.019060f, 0.048406f, 0.032076f, -0.033670f, 0.020759f, -0.003821f, 0.025533f, 0.080684f, -0.007611f, -0.013578f, 0.008073f, 0.072624f, 0.029810f, -0.004403f, 0.009298f, 0.013207f, 0.041906f, 0.037029f, -0.025269f, 0.044440f, 0.020377f, 0.041201f, -0.029116f, 0.004481f, 0.008276f, 0.008816f, 0.025458f, 0.037814f, -0.024550f, -0.019474f, 0.029929f, 0.015004f, -0.010143f, -0.010634f, 0.000122f, 0.045375f, -0.085446f, 0.020173f, -0.030368f, -0.022390f, 0.004140f, -0.029241f, -0.027187f, -0.003875f, -0.046714f, 0.033777f, -0.009914f, 0.035685f, -0.001264f, 0.031220f, -0.020565f, 0.012581f, 0.000779f, 0.010357f, -0.000937f, -0.011988f, 0.009472f, 0.006687f, 0.007572f, 0.015250f, -0.007400f, 0.007734f, 0.010524f, -0.008712f, 0.000844f, 0.014573f, 0.005429f, -0.007800f, 0.016259f, -0.010651f, 0.002217f, 0.008484f, -0.010391f, -0.007842f, 0.003353f, 0.003265f, 0.018134f, + 0.015000f, 0.010778f, 0.005462f, -0.001680f, 0.011704f, 0.002683f, 0.005165f, 0.005213f, 0.009714f, 0.011858f, -0.009775f, -0.008128f, -0.015820f, 0.012530f, 0.004943f, 0.001072f, 0.003947f, -0.016662f, -0.015969f, 0.011169f, 0.014536f, 0.015350f, -0.018907f, -0.022580f, -0.058448f, 0.002776f, -0.032594f, 0.053366f, 0.006555f, -0.013706f, -0.007857f, 0.032079f, 0.009260f, 0.052019f, 0.021000f, -0.013342f, 0.002214f, 0.011092f, 0.023685f, 0.039173f, -0.043614f, -0.037669f, -0.007874f, 0.065791f, -0.020166f, 0.008523f, 0.018788f, 0.028911f, 0.034956f, 0.050046f, 0.043167f, 0.003940f, -0.010211f, 0.046752f, 0.003688f, -0.029546f, 0.015868f, -0.027400f, 0.019974f, 0.005117f, -0.024484f, 0.022622f, 0.087722f, 0.048979f, -0.030881f, -0.023287f, -0.003113f, -0.024163f, -0.024022f, -0.020679f, 0.015131f, -0.011714f, -0.020427f, 0.004715f, 0.024198f, 0.014567f, 0.008079f, 0.034593f, 0.009322f, -0.008186f, 0.036459f, 0.030789f, -0.026203f, 0.018000f, -0.029590f, -0.023037f, -0.026226f, 0.000080f, -0.063468f, -0.018666f, 0.044314f, 0.032791f, -0.015043f, 0.022068f, -0.005255f, 0.001724f, + -0.038977f, 0.008933f, 0.023521f, 0.037373f, 0.021010f, 0.024803f, 0.013597f, 0.011950f, -0.016592f, -0.014543f, -0.017653f, 0.010094f, -0.003765f, 0.001536f, 0.007601f, 0.007927f, -0.000754f, 0.019386f, -0.006005f, -0.008363f, -0.009147f, 0.013631f, -0.017639f, -0.007068f, -0.021769f, -0.001083f, 0.004324f, -0.009331f, 0.000879f, -0.005131f, 0.013636f, -0.002543f, -0.028730f, 0.000506f, -0.001958f, 0.008636f, 0.011261f, 0.003707f, 0.012793f, -0.000751f, 0.020792f, 0.004307f, -0.001642f, -0.000506f, 0.002269f, 0.000927f, 0.001056f, -0.023863f, 0.019733f, 0.015930f, -0.030308f, -0.012953f, -0.065904f, -0.005244f, 0.054970f, 0.000691f, -0.040268f, 0.006523f, 0.001895f, -0.027025f, 0.036645f, 0.021218f, -0.014718f, 0.010466f, 0.016613f, 0.022658f, 0.012580f, 0.003957f, -0.016261f, 0.008905f, 0.013046f, 0.035057f, 0.052345f, -0.014339f, -0.035227f, -0.018523f, 0.009991f, 0.010927f, 0.043080f, -0.016440f, -0.033735f, -0.026258f, -0.026991f, 0.052144f, 0.095531f, 0.034720f, 0.004796f, 0.104818f, 0.006305f, 0.043470f, 0.024795f, -0.008799f, -0.021970f, 0.018648f, -0.029746f, -0.019812f, + 0.021245f, 0.001447f, -0.063138f, -0.065384f, -0.016357f, 0.027334f, -0.034115f, -0.042784f, -0.023559f, -0.031673f, -0.026079f, 0.022112f, -0.018161f, -0.048515f, 0.021824f, 0.001929f, -0.014144f, 0.011366f, -0.010933f, 0.024480f, 0.098328f, -0.060222f, 0.049571f, -0.068473f, -0.038829f, -0.022694f, -0.015494f, 0.038082f, 0.015387f, 0.018266f, -0.007396f, 0.021161f, 0.044129f, 0.011044f, 0.001035f, 0.000579f, -0.012801f, 0.006074f, 0.012100f, 0.035360f, -0.002124f, -0.017516f, -0.002614f, 0.027012f, 0.017364f, -0.007630f, 0.010246f, 0.012261f, -0.009747f, -0.000335f, -0.004168f, 0.033896f, 0.012284f, 0.016072f, 0.011932f, 0.009700f, -0.013954f, -0.009891f, -0.002193f, 0.008702f, -0.017075f, 0.002513f, -0.016840f, -0.011618f, 0.002749f, 0.001806f, -0.019355f, 0.018996f, 0.025955f, -0.002540f, -0.003303f, 0.015789f, 0.000233f, -0.006778f, 0.022976f, -0.009424f, 0.015945f, 0.001488f, 0.053224f, 0.034231f, 0.030863f, 0.045330f, -0.052897f, 0.020345f, -0.055404f, -0.002221f, 0.072413f, 0.064401f, 0.027454f, 0.001001f, 0.012531f, 0.008183f, -0.020765f, 0.016784f, 0.020851f, -0.091242f, + 0.005595f, 0.013416f, 0.027749f, -0.033434f, -0.051375f, 0.037689f, 0.017832f, 0.009592f, -0.021958f, 0.044703f, -0.006278f, 0.034751f, 0.028876f, -0.003440f, 0.004412f, -0.010092f, 0.035193f, -0.020875f, 0.010747f, 0.021178f, -0.001840f, 0.044976f, 0.026043f, -0.002511f, 0.023078f, 0.026224f, -0.001346f, -0.020291f, -0.068437f, -0.012613f, 0.007319f, -0.040523f, 0.003929f, 0.032354f, -0.062189f, -0.027586f, 0.009554f, -0.026726f, -0.004317f, 0.032841f, 0.001919f, -0.023207f, -0.030291f, 0.013511f, 0.013170f, -0.062866f, -0.020951f, -0.005202f, 0.000279f, 0.039518f, 0.019370f, 0.004439f, 0.069023f, -0.008672f, -0.002218f, 0.002749f, -0.039342f, 0.037308f, 0.000338f, 0.061210f, -0.023698f, -0.010203f, 0.018429f, 0.009273f, -0.052131f, 0.001730f, -0.007178f, -0.020833f, -0.016832f, 0.006555f, 0.002188f, -0.014686f, -0.001281f, -0.009109f, -0.006421f, 0.001936f, -0.022283f, 0.006476f, 0.003095f, -0.003079f, 0.008569f, 0.002389f, -0.014697f, 0.003049f, 0.004250f, 0.003963f, -0.014217f, 0.020869f, 0.004127f, 0.027140f, -0.019943f, 0.002579f, -0.016799f, -0.005885f, -0.003062f, -0.029931f, + 0.006414f, 0.002849f, -0.001220f, -0.003994f, -0.005383f, 0.011179f, -0.013480f, -0.010359f, 0.013092f, 0.017534f, -0.017334f, -0.064582f, -0.056287f, 0.010315f, -0.028969f, -0.009066f, -0.043371f, -0.054030f, -0.056848f, -0.037356f, 0.040564f, 0.055371f, 0.001494f, -0.045570f, 0.003629f, 0.002144f, 0.000631f, 0.021062f, 0.035350f, 0.035349f, 0.000902f, -0.022881f, -0.056713f, -0.032511f, -0.049641f, -0.010637f, 0.000241f, 0.004216f, 0.005155f, 0.007013f, 0.013710f, 0.017764f, 0.033456f, -0.052455f, 0.023065f, 0.009201f, 0.011612f, 0.028182f, 0.049814f, 0.055928f, -0.032179f, 0.024939f, -0.044488f, -0.013878f, -0.040367f, -0.003913f, -0.015724f, 0.092961f, 0.032991f, 0.066976f, 0.002834f, -0.035892f, -0.015419f, 0.042901f, 0.046419f, -0.027250f, 0.085744f, -0.035894f, 0.005355f, 0.003793f, 0.014896f, 0.031515f, 0.095383f, -0.006653f, 0.023359f, 0.053132f, 0.012131f, -0.042064f, 0.026745f, 0.097612f, -0.017812f, -0.023596f, -0.057560f, -0.004777f, 0.036003f, 0.022242f, 0.003021f, -0.055240f, -0.041865f, 0.007052f, -0.043686f, 0.013177f, 0.001933f, -0.054993f, -0.006237f, 0.005685f, + -0.008651f, 0.039755f, 0.037316f, 0.000849f, -0.010898f, -0.023678f, 0.025832f, -0.010936f, 0.044895f, -0.010214f, 0.000581f, 0.030781f, 0.030867f, 0.043956f, 0.033931f, -0.024768f, -0.009725f, 0.005946f, -0.008212f, 0.003031f, -0.018908f, -0.018138f, -0.018414f, 0.009657f, -0.022551f, -0.026222f, 0.015574f, 0.020397f, 0.001831f, -0.022515f, 0.014353f, 0.008059f, -0.005566f, -0.005683f, -0.015362f, -0.000237f, 0.008760f, -0.003805f, -0.013736f, -0.017793f, -0.003414f, -0.011653f, 0.014676f, 0.008341f, -0.007619f, -0.009854f, 0.018783f, 0.086671f, -0.004549f, -0.000539f, 0.036737f, 0.007091f, -0.119726f, -0.037664f, 0.084918f, 0.028222f, -0.025003f, -0.047723f, -0.006761f, -0.031547f, 0.043754f, 0.022711f, 0.008159f, -0.025311f, -0.056716f, 0.012098f, -0.097643f, -0.011978f, 0.047643f, 0.065074f, -0.007595f, -0.055361f, -0.037745f, -0.114249f, 0.033446f, -0.019884f, 0.044647f, 0.033745f, -0.032530f, -0.023677f, -0.101410f, -0.076171f, 0.039551f, 0.107924f, 0.043040f, 0.051232f, -0.036047f, -0.064244f, -0.061675f, -0.025880f, 0.091696f, 0.123572f, 0.064396f, -0.143746f, -0.052761f, -0.110165f, + -0.058962f, 0.136458f, 0.033196f, 0.030223f, -0.018210f, -0.131511f, -0.107727f, -0.108064f, -0.020168f, 0.010428f, 0.067998f, -0.025320f, 0.051708f, -0.104298f, 0.064735f, 0.025892f, 0.007823f, 0.131039f, 0.008338f, -0.012151f, -0.006350f, -0.177872f, -0.054414f, -0.012118f, 0.055934f, 0.029175f, 0.025529f, 0.078453f, -0.083985f, 0.005376f, -0.055601f, 0.060520f, 0.043660f, 0.004165f, 0.012016f, 0.012870f, -0.009984f, 0.035986f, 0.019227f, 0.009547f, 0.030589f, -0.020930f, -0.039156f, 0.009483f, 0.027975f, 0.042577f, 0.035030f, 0.023152f, -0.029417f, -0.047583f, -0.066739f, -0.005968f, 0.004697f, 0.053939f, 0.066779f, -0.010068f, -0.050982f, -0.087507f, -0.042086f, 0.006241f, 0.066807f, 0.107369f, 0.027897f, -0.105027f, -0.107889f, -0.110034f, -0.001293f, 0.089770f, 0.078942f, 0.083400f, -0.028102f, -0.040606f, -0.078369f, -0.078992f, 0.028861f, 0.053424f, 0.069533f, 0.035374f, -0.055308f, -0.052133f, -0.029612f, -0.008220f, 0.064510f, 0.034301f, 0.010561f, -0.002883f, -0.039754f, -0.028531f, -0.006038f, 0.007951f, -0.051391f, 0.098622f, 0.042326f, 0.045204f, -0.122174f, 0.024497f, + -0.170190f, -0.037625f, -0.000513f, 0.024025f, 0.009743f, -0.109088f, 0.059022f, -0.030301f, -0.019701f, -0.020600f, -0.023268f, -0.026814f, -0.033801f, 0.071316f, -0.020508f, -0.061454f, 0.019506f, -0.017472f, 0.007425f, 0.034334f, -0.069377f, -0.024904f, -0.004363f, 0.028954f, 0.002890f, 0.078458f, -0.006774f, -0.045055f, 0.103623f, -0.087884f, 0.051201f, -0.081509f, -0.027026f, 0.039612f, -0.066229f, 0.004735f, 0.047835f, -0.025118f, -0.005814f, -0.005023f, 0.061622f, 0.094091f, 0.054383f, -0.031784f, -0.013159f, -0.014814f, 0.005858f, 0.030166f, -0.012602f, -0.018823f, 0.018199f, 0.009622f, -0.170886f, -0.006961f, -0.006447f, 0.024773f, 0.021090f, 0.001033f, 0.000140f, 0.048500f, -0.053892f, -0.013893f, -0.005385f, 0.036944f, -0.137241f, -0.019298f, 0.123740f, -0.031831f, -0.050143f, -0.000527f, 0.093593f, -0.017336f, -0.022621f, 0.025467f, -0.037102f, -0.038713f, 0.057728f, 0.089627f, -0.032699f, -0.045648f, 0.015244f, 0.026835f, -0.014445f, -0.048115f, -0.001260f, 0.006920f, -0.010027f, -0.007046f, -0.015295f, -0.020972f, 0.009565f, 0.000641f, -0.019513f, -0.003504f, -0.001035f, -0.000733f, + -0.018021f, 0.010182f, -0.024034f, -0.025167f, -0.015047f, -0.015383f, 0.022950f, -0.003402f, -0.005259f, -0.000548f, -0.013638f, 0.019238f, -0.025541f, 0.007268f, 0.000337f, 0.001822f, 0.017066f, -0.000808f, -0.030640f, 0.003491f, -0.008401f, 0.005704f, 0.003711f, -0.027187f, 0.042432f, -0.011254f, -0.004502f, -0.004076f, 0.003480f, 0.010914f, -0.001464f, -0.009963f, -0.022765f, -0.041557f, -0.125027f, -0.102708f, 0.089755f, 0.076513f, 0.007001f, 0.081743f, -0.089613f, -0.005444f, -0.172778f, -0.061545f, -0.030827f, 0.083290f, 0.075802f, 0.046359f, -0.069729f, -0.024165f, -0.003336f, -0.033390f, 0.016097f, 0.029951f, 0.038963f, 0.052139f, -0.040257f, 0.029105f, -0.074930f, -0.047499f, -0.012107f, -0.016146f, 0.001697f, 0.049139f, -0.059219f, 0.050628f, -0.023058f, -0.033006f, -0.013310f, 0.004535f, -0.074270f, -0.001883f, -0.067268f, -0.025254f, -0.026300f, -0.063913f, 0.087264f, 0.039965f, 0.019604f, 0.021169f, -0.017213f, -0.089523f, -0.132591f, -0.077563f, -0.078090f, 0.052589f, 0.012359f, 0.056702f, 0.079134f, 0.065205f, -0.021687f, 0.015479f, -0.045956f, -0.035328f, -0.042003f, 0.032534f, + -0.044501f, -0.002331f, -0.042482f, -0.043898f, -0.027722f, 0.051332f, -0.041752f, -0.011907f, 0.003943f, -0.006134f, -0.060109f, -0.064658f, -0.039314f, -0.023310f, -0.087079f, -0.051889f, 0.012902f, 0.052086f, 0.054353f, 0.069408f, -0.004782f, -0.056952f, -0.073747f, -0.056749f, 0.028598f, 0.009036f, -0.009357f, 0.033685f, 0.085556f, 0.022592f, 0.022648f, -0.021894f, -0.016525f, -0.028429f, -0.017481f, -0.009286f, -0.027577f, -0.006503f, 0.032303f, -0.007173f, -0.014652f, -0.026622f, -0.029629f, -0.033281f, -0.010117f, 0.015993f, -0.009149f, 0.006778f, 0.003723f, -0.059803f, 0.006173f, -0.028571f, 0.024690f, 0.047861f, -0.024456f, 0.033037f, -0.004514f, 0.007993f, 0.000822f, -0.047295f, -0.007818f, -0.015452f, -0.012577f, 0.043052f, -0.027456f, -0.186219f, -0.252401f, -0.238497f, -0.226844f, -0.271955f, -0.045485f, -0.075187f, 0.048280f, 0.076965f, 0.243561f, 0.156475f, 0.206492f, 0.284566f, 0.312888f, 0.213615f, 0.271829f, 0.154735f, 0.072132f, -0.010854f, -0.051030f, -0.069331f, -0.114757f, -0.112634f, -0.155654f, -0.065806f, -0.057258f, -0.146436f, -0.109346f, -0.104699f, -0.119082f, -0.193754f, + -0.131974f, -0.101587f, -0.081590f, -0.149109f, -0.020782f, -0.044648f, -0.061999f, -0.144390f, -0.133372f, -0.109943f, -0.094010f, -0.068249f, -0.027760f, -0.091784f, 0.026582f, 0.047671f, -0.071860f, 0.080617f, 0.111961f, 0.107585f, 0.195229f, 0.158664f, 0.122219f, 0.134520f, 0.135339f, 0.134312f, 0.205304f, 0.231027f, 0.227031f, 0.155387f, 0.244862f, 0.241798f, 0.251908f, 0.256168f, 0.290874f, 0.258210f, 0.272652f, 0.361795f, 0.184574f, 0.186398f, 0.188916f, 0.176055f, -0.008285f, 0.080469f, 0.101207f, -0.057899f, -0.031222f, -0.099833f, -0.183200f, -0.165777f, -0.175096f, -0.315409f, -0.231549f, -0.140778f, -0.246707f, -0.261083f, -0.215610f, -0.229635f, -0.227481f, -0.273048f, -0.250365f, -0.252662f, -0.236616f, -0.220670f, -0.201378f, -0.186289f, -0.186682f, -0.154981f, -0.130736f, -0.206620f, -0.031597f, -0.092848f, -0.106848f, -0.023980f, -0.013269f, -0.104523f, -0.013284f, -0.040307f, -0.015033f, 0.038660f, 0.046270f, 0.121532f, 0.072069f, 0.101625f, 0.112625f, 0.122649f, 0.111250f, 0.155381f, 0.151522f, 0.161391f, 0.150542f, 0.180696f, 0.185490f, 0.182178f, 0.147263f, 0.190493f, + 0.200058f, 0.155346f, 0.104665f, 0.101449f, 0.061446f, 0.053326f, 0.014509f, -0.006362f, -0.006027f, -0.032861f, -0.029664f, -0.022541f, -0.013109f, -0.029180f, -0.031515f, -0.029154f, -0.013646f, -0.029152f, -0.037362f, -0.021682f, -0.007412f, -0.025508f, -0.035189f, -0.028119f, -0.023837f, -0.037304f, -0.037951f, -0.028523f, -0.018317f, -0.015898f, -0.014920f}, + {-0.011750f, 0.014856f, -0.001147f, 0.005983f, 0.003010f, 0.007047f, -0.012611f, -0.006811f, 0.008090f, 0.003912f, 0.000082f, -0.007015f, 0.001429f, -0.019566f, -0.012601f, -0.000686f, -0.007514f, -0.008498f, 0.003480f, 0.015281f, 0.002558f, 0.011635f, -0.002704f, 0.011498f, -0.006877f, -0.006138f, -0.000774f, -0.010391f, 0.002053f, 0.005155f, -0.003761f, -0.000259f, 0.002687f, 0.000481f, 0.004677f, -0.000565f, -0.011122f, 0.003968f, -0.006898f, -0.005203f, 0.003110f, -0.006855f, -0.010380f, 0.010307f, -0.010891f, 0.009808f, 0.009156f, 0.006024f, -0.000508f, -0.012779f, -0.007445f, 0.001423f, -0.002429f, 0.016414f, -0.010078f, 0.003980f, -0.001319f, 0.002155f, -0.012457f, -0.020781f, -0.003688f, -0.006253f, -0.006954f, -0.001654f, 0.008748f, -0.001924f, -0.009388f, 0.008191f, 0.003462f, -0.004185f, 0.006833f, -0.001363f, 0.002030f, -0.009580f, -0.000817f, -0.002410f, -0.000186f, 0.003636f, -0.004408f, 0.002940f, -0.008776f, 0.005876f, -0.001406f, 0.000600f, -0.003232f, -0.002919f, -0.000006f, 0.003558f, 0.001269f, -0.000153f, 0.001333f, -0.000093f, -0.005309f, 0.001493f, 0.000380f, 0.003281f, + -0.000582f, 0.000086f, -0.000065f, 0.000049f, -0.000387f, -0.001916f, 0.007975f, 0.007954f, 0.001127f, 0.014345f, -0.000163f, 0.006194f, 0.007709f, -0.000094f, -0.007001f, 0.000732f, -0.009947f, -0.012741f, -0.004836f, -0.014519f, -0.014985f, -0.004882f, 0.009850f, -0.003524f, -0.003413f, -0.007806f, -0.001975f, -0.013647f, 0.006668f, -0.003825f, 0.003368f, 0.008186f, 0.002777f, -0.002877f, 0.005629f, 0.005335f, -0.006660f, 0.004622f, 0.000614f, 0.001232f, 0.004991f, -0.011906f, -0.005137f, 0.008427f, -0.005406f, -0.000398f, -0.003439f, 0.009353f, -0.011991f, -0.001002f, -0.010043f, 0.006507f, -0.000597f, -0.000741f, 0.009073f, -0.003926f, -0.004360f, -0.003140f, -0.008480f, 0.000602f, -0.003841f, -0.000678f, 0.000561f, 0.005768f, 0.005864f, 0.001971f, -0.002605f, -0.010014f, -0.016376f, -0.005081f, -0.001138f, -0.004051f, 0.008802f, -0.003555f, -0.005049f, 0.007023f, -0.004526f, -0.007028f, 0.015541f, -0.003381f, -0.008693f, -0.000785f, 0.001427f, -0.002608f, 0.007666f, -0.000997f, -0.006852f, 0.000098f, 0.000301f, -0.001480f, -0.002064f, 0.006095f, 0.001377f, 0.000859f, -0.003637f, 0.000757f, + -0.001108f, 0.000411f, 0.002378f, -0.000535f, 0.001348f, 0.002828f, 0.000357f, -0.000574f, -0.000610f, 0.001198f, -0.003455f, -0.001292f, -0.000691f, -0.001595f, 0.001437f, 0.001191f, -0.000567f, 0.016649f, -0.010586f, -0.004991f, -0.007660f, 0.006186f, 0.001199f, -0.000742f, 0.012010f, 0.002893f, 0.003521f, -0.017399f, 0.003213f, -0.008109f, -0.009443f, -0.012265f, -0.000197f, 0.000457f, 0.014581f, -0.011897f, 0.005518f, -0.004980f, 0.018028f, -0.006483f, -0.005968f, 0.012842f, -0.004900f, 0.004445f, 0.001939f, -0.000832f, 0.002123f, -0.008580f, 0.001401f, 0.000426f, 0.003641f, 0.016962f, 0.005908f, 0.001604f, -0.007230f, 0.005950f, -0.013162f, -0.003631f, -0.002518f, 0.007234f, 0.006167f, 0.010259f, 0.006717f, -0.007651f, -0.011285f, -0.004901f, 0.008628f, -0.001033f, 0.004481f, -0.001789f, -0.001242f, 0.017249f, 0.004067f, -0.001280f, -0.020554f, -0.009142f, 0.000539f, 0.007180f, 0.011004f, 0.015507f, 0.008674f, -0.003709f, 0.002780f, -0.003762f, -0.005255f, 0.011136f, -0.006993f, 0.011465f, 0.000527f, -0.010292f, 0.003727f, -0.005288f, 0.008930f, -0.007630f, -0.000872f, 0.007790f, + 0.008908f, -0.008895f, -0.003420f, -0.001648f, -0.003653f, 0.005397f, -0.001196f, -0.003783f, 0.002478f, 0.001328f, 0.001365f, 0.001540f, 0.002162f, 0.001205f, 0.001294f, 0.000610f, -0.000639f, -0.000741f, -0.003302f, 0.005179f, -0.000196f, 0.000346f, 0.000593f, 0.000117f, 0.000822f, 0.002784f, 0.002674f, -0.000083f, -0.000697f, 0.003462f, 0.002610f, 0.002085f, 0.008730f, -0.002091f, -0.001463f, -0.003222f, -0.010219f, 0.000397f, 0.007339f, 0.007311f, 0.013676f, 0.006269f, -0.017960f, -0.015002f, -0.013019f, 0.000538f, -0.002206f, 0.000953f, -0.007093f, -0.004407f, -0.001104f, 0.005452f, -0.000074f, -0.011507f, 0.012433f, -0.001777f, -0.011553f, 0.002365f, 0.002728f, -0.000237f, -0.001110f, 0.004998f, 0.006583f, -0.004121f, 0.010062f, 0.000499f, 0.005895f, -0.013724f, 0.009762f, 0.003472f, 0.005629f, -0.009446f, -0.001038f, 0.006905f, 0.005909f, 0.014987f, -0.000561f, -0.020698f, -0.005662f, -0.009915f, 0.004849f, 0.003352f, -0.000859f, -0.005527f, 0.001579f, -0.008489f, -0.003009f, -0.015457f, -0.009099f, -0.000522f, 0.008605f, 0.009604f, -0.006937f, -0.005938f, -0.006079f, 0.009871f, + -0.003372f, -0.001217f, -0.014845f, 0.008944f, -0.014652f, -0.005089f, -0.000640f, -0.003099f, -0.003983f, 0.015583f, -0.001331f, -0.003624f, -0.004176f, 0.003091f, -0.009398f, 0.001080f, -0.016295f, -0.013096f, 0.004767f, -0.004573f, -0.002438f, 0.005820f, -0.002955f, 0.007765f, 0.001526f, 0.003566f, 0.005464f, -0.001463f, 0.002637f, 0.001782f, 0.001005f, -0.001150f, 0.001994f, 0.000807f, 0.000488f, -0.001214f, -0.001287f, 0.000317f, -0.004778f, -0.000091f, 0.002989f, 0.000716f, -0.000190f, 0.000566f, -0.002935f, -0.000949f, 0.001783f, -0.000878f, 0.004156f, -0.005401f, 0.007648f, -0.006150f, 0.000006f, 0.010556f, 0.019220f, 0.013297f, 0.002854f, -0.015049f, -0.011292f, 0.004039f, -0.002584f, -0.009651f, -0.003169f, -0.012432f, -0.005346f, 0.024980f, 0.002887f, -0.002661f, -0.004654f, 0.000015f, -0.005814f, -0.004020f, 0.016889f, -0.017526f, -0.002068f, 0.001731f, -0.003750f, 0.004400f, 0.010215f, -0.004694f, -0.005771f, 0.002584f, -0.007179f, -0.007004f, -0.016297f, -0.006036f, 0.004389f, -0.014589f, -0.002446f, 0.007240f, 0.010990f, 0.003911f, -0.022886f, -0.006905f, 0.004598f, 0.011536f, + -0.008979f, 0.019908f, -0.002321f, -0.010104f, -0.005638f, -0.004310f, -0.007868f, 0.010822f, -0.008095f, -0.002159f, -0.010690f, -0.008386f, -0.003925f, -0.008528f, 0.011442f, -0.004212f, -0.022943f, 0.008762f, 0.015391f, 0.000205f, 0.005561f, -0.027882f, 0.021757f, 0.000394f, -0.018284f, 0.001844f, -0.012352f, -0.002620f, 0.001928f, -0.013270f, -0.015571f, 0.010339f, 0.004830f, -0.013482f, -0.000929f, 0.000334f, -0.008350f, -0.001057f, -0.003093f, 0.002072f, -0.007413f, -0.003825f, -0.001477f, -0.003692f, -0.001889f, -0.005450f, 0.001771f, -0.000371f, 0.002782f, -0.005926f, 0.001375f, 0.003329f, -0.000102f, -0.003375f, 0.002147f, -0.003277f, 0.003085f, 0.002517f, -0.002527f, 0.002454f, -0.000485f, -0.001744f, -0.000832f, 0.000844f, 0.001166f, 0.000698f, -0.020632f, 0.004657f, -0.015187f, 0.016241f, 0.004146f, -0.006171f, -0.012255f, -0.021483f, -0.009328f, -0.015551f, 0.005391f, 0.030070f, 0.005151f, -0.007787f, -0.000430f, -0.004096f, -0.004598f, -0.013516f, -0.008875f, -0.013916f, 0.003813f, -0.001022f, 0.003100f, -0.004852f, 0.002355f, -0.014707f, -0.000969f, 0.003399f, -0.009976f, -0.003664f, + 0.001310f, -0.005437f, 0.001493f, -0.005003f, 0.022242f, -0.027098f, -0.004782f, 0.002225f, 0.007347f, -0.002775f, -0.011093f, -0.016612f, -0.011750f, 0.008947f, -0.002323f, 0.009923f, -0.008393f, 0.025737f, 0.003425f, -0.004966f, -0.000196f, -0.015256f, -0.019475f, -0.009847f, 0.007467f, -0.016655f, -0.000949f, 0.019601f, -0.000482f, -0.009258f, -0.018525f, -0.031414f, 0.001372f, 0.016138f, -0.004397f, 0.018516f, -0.001606f, -0.005789f, -0.011539f, -0.010260f, 0.001874f, 0.007356f, -0.005854f, 0.026845f, 0.008183f, -0.008615f, 0.004206f, -0.011027f, 0.004130f, 0.005077f, -0.003614f, 0.005819f, 0.010955f, 0.004624f, 0.000580f, -0.007205f, -0.019650f, 0.001327f, -0.004405f, -0.001989f, -0.002934f, 0.001419f, 0.000501f, -0.000259f, -0.008644f, 0.001375f, -0.004926f, 0.001637f, -0.004852f, -0.001639f, -0.001211f, -0.000455f, -0.000372f, -0.000955f, -0.003464f, -0.003172f, -0.003802f, -0.005704f, -0.005992f, -0.002541f, 0.000383f, 0.001595f, -0.003111f, -0.000098f, 0.000257f, 0.000589f, -0.002350f, 0.017643f, -0.007749f, -0.020407f, -0.005582f, -0.015242f, -0.007933f, -0.006624f, 0.021616f, -0.005435f, + -0.007236f, -0.009128f, 0.013898f, 0.012480f, 0.011034f, 0.030483f, 0.031950f, 0.014783f, 0.019864f, -0.007489f, -0.009180f, 0.013199f, 0.019601f, -0.008519f, 0.008624f, 0.006037f, -0.017003f, -0.016121f, 0.009524f, -0.002375f, -0.000196f, -0.016088f, -0.020403f, -0.004874f, -0.016536f, 0.018718f, 0.035033f, 0.007218f, 0.013837f, 0.004012f, -0.004102f, 0.012497f, -0.023903f, -0.006407f, 0.004994f, 0.013317f, -0.007859f, -0.019331f, 0.028228f, -0.000066f, -0.008646f, -0.006906f, 0.011594f, -0.003470f, 0.010338f, -0.007064f, 0.016214f, -0.001366f, -0.000406f, 0.020000f, 0.006237f, 0.009223f, 0.003613f, -0.003055f, 0.014961f, -0.022767f, -0.009113f, 0.008514f, 0.025771f, -0.015669f, -0.001809f, -0.003197f, -0.003617f, -0.010737f, -0.002354f, -0.005571f, -0.007373f, -0.001054f, 0.001742f, 0.007281f, -0.003017f, 0.020679f, 0.007544f, -0.011866f, -0.002855f, 0.001550f, 0.007902f, 0.002800f, -0.003581f, -0.007156f, -0.001556f, 0.004576f, -0.004601f, -0.004027f, -0.003520f, 0.004247f, 0.002648f, 0.004195f, 0.002189f, -0.003800f, -0.001505f, 0.000133f, -0.003839f, -0.000654f, 0.003010f, 0.001873f, + -0.000473f, -0.004260f, 0.005648f, -0.000761f, 0.003516f, -0.002370f, 0.001725f, -0.004950f, -0.000480f, -0.000714f, 0.000239f, -0.003294f, 0.012772f, -0.012498f, -0.004837f, 0.011532f, -0.008951f, 0.005001f, 0.008696f, -0.017061f, -0.018204f, 0.005224f, 0.014000f, -0.004729f, 0.012782f, -0.009255f, -0.004069f, 0.024317f, -0.027514f, 0.016629f, -0.007810f, 0.000219f, 0.000776f, 0.030022f, -0.006637f, 0.005948f, 0.009575f, 0.016551f, 0.009704f, 0.014502f, -0.002372f, -0.002307f, 0.004763f, 0.002352f, 0.002445f, -0.014461f, 0.022544f, -0.030001f, -0.006577f, -0.007882f, 0.016804f, -0.003360f, 0.020471f, -0.000918f, 0.001960f, -0.035703f, -0.009772f, 0.021801f, 0.037057f, -0.000315f, -0.018346f, -0.015459f, 0.015238f, 0.012255f, 0.009228f, 0.008750f, -0.015723f, -0.007187f, -0.009090f, 0.004836f, 0.000701f, -0.009655f, 0.005732f, 0.005000f, -0.004488f, -0.004931f, -0.021529f, -0.005658f, -0.007881f, 0.030841f, 0.002852f, 0.005836f, 0.011711f, 0.000954f, -0.024097f, 0.001232f, -0.014496f, 0.012075f, 0.028802f, -0.015226f, 0.008926f, -0.004360f, -0.014906f, 0.007252f, -0.012491f, -0.002135f, + 0.005251f, 0.003901f, 0.006614f, 0.002811f, -0.001016f, -0.005442f, 0.006258f, 0.013519f, 0.002293f, 0.006714f, 0.011121f, 0.004969f, 0.012570f, -0.003761f, 0.011890f, 0.000624f, 0.000302f, 0.002614f, 0.001350f, 0.003438f, -0.000341f, -0.005805f, -0.003224f, 0.000278f, 0.003199f, 0.003371f, -0.002261f, 0.005777f, 0.005469f, -0.004563f, 0.007724f, 0.013009f, -0.022385f, -0.008618f, -0.008422f, 0.004255f, -0.001291f, 0.033299f, -0.004187f, 0.001156f, 0.021139f, -0.018863f, -0.013696f, -0.017686f, -0.018511f, -0.004503f, -0.000683f, 0.008302f, 0.035621f, -0.003280f, -0.020508f, 0.036870f, 0.000604f, 0.010298f, 0.025212f, 0.017363f, 0.023529f, -0.006185f, 0.018587f, -0.012036f, 0.024632f, 0.021507f, -0.005844f, 0.011189f, -0.009919f, -0.009244f, 0.009301f, 0.028155f, 0.012693f, 0.011104f, 0.003989f, -0.009043f, -0.015584f, -0.015906f, 0.002569f, 0.019335f, -0.011288f, -0.013636f, -0.016688f, -0.006394f, -0.033075f, -0.007820f, 0.006335f, -0.024367f, 0.011745f, 0.001658f, -0.011092f, -0.028616f, -0.019088f, -0.000045f, -0.037865f, 0.011787f, 0.008376f, -0.000928f, 0.010544f, 0.006767f, + -0.003700f, -0.019821f, -0.011955f, -0.002325f, -0.012503f, 0.011551f, -0.013102f, 0.031243f, -0.021117f, 0.001001f, 0.013762f, 0.001094f, -0.009445f, -0.036306f, 0.006299f, 0.017605f, 0.004289f, 0.000904f, 0.019619f, 0.010689f, -0.011253f, -0.000130f, -0.001313f, 0.001321f, -0.000805f, -0.006407f, -0.012751f, -0.003964f, -0.013775f, 0.000611f, 0.003441f, 0.001518f, -0.003570f, -0.007289f, -0.003302f, -0.004927f, 0.005980f, 0.001625f, 0.007825f, 0.005394f, 0.004494f, 0.001536f, -0.000648f, -0.002908f, -0.002424f, -0.006439f, 0.002873f, 0.000200f, 0.002862f, -0.003229f, -0.000416f, -0.005441f, 0.000333f, -0.004310f, 0.001613f, -0.046225f, 0.016240f, 0.021118f, 0.037146f, -0.000101f, -0.027583f, 0.007796f, 0.013295f, -0.028552f, -0.029699f, -0.018552f, -0.000730f, 0.015873f, -0.000816f, -0.011620f, -0.000604f, -0.010165f, -0.006849f, -0.018398f, 0.030753f, 0.024037f, 0.009047f, -0.037687f, -0.011294f, 0.006087f, -0.002141f, -0.008373f, 0.047738f, 0.017514f, 0.015005f, 0.014077f, 0.022663f, 0.017028f, 0.004148f, 0.017828f, -0.001206f, -0.029601f, 0.016044f, -0.030450f, 0.009323f, -0.030145f, + 0.025501f, -0.007945f, 0.030790f, -0.016761f, 0.007490f, -0.013549f, 0.011105f, 0.018044f, 0.046993f, 0.009972f, -0.059733f, -0.003124f, -0.008304f, 0.012872f, 0.026117f, -0.005241f, -0.011593f, 0.019230f, -0.003380f, -0.009375f, 0.025727f, 0.001678f, -0.001130f, 0.001354f, 0.011024f, 0.020621f, 0.016301f, -0.017628f, -0.013133f, -0.011102f, -0.017925f, 0.004258f, -0.001650f, 0.020391f, 0.014627f, -0.027385f, -0.006610f, -0.015466f, 0.013325f, -0.007499f, -0.007323f, 0.004865f, 0.000900f, -0.010511f, 0.009076f, 0.002276f, 0.001514f, -0.001496f, 0.005163f, 0.005409f, 0.000856f, -0.015466f, 0.004343f, 0.002784f, -0.001993f, -0.002667f, -0.005163f, 0.000274f, -0.006909f, 0.003281f, 0.007796f, -0.002294f, -0.002317f, 0.007729f, 0.001194f, -0.007051f, -0.005471f, -0.001203f, 0.003722f, -0.003024f, -0.000748f, -0.004302f, 0.001170f, -0.002847f, 0.000029f, 0.007439f, -0.004932f, 0.050323f, -0.019099f, -0.033569f, -0.010701f, 0.013088f, -0.008317f, 0.024175f, 0.034983f, -0.014098f, 0.032082f, 0.020642f, 0.016116f, -0.005322f, -0.003893f, -0.006487f, 0.031118f, 0.005678f, 0.003728f, -0.018147f, + 0.007868f, -0.009491f, -0.000819f, -0.029960f, 0.020267f, -0.027493f, 0.000101f, -0.019396f, 0.032460f, -0.016617f, 0.000700f, 0.032083f, 0.024373f, 0.016481f, -0.001989f, -0.012753f, 0.014893f, -0.000480f, -0.002910f, -0.041000f, -0.012199f, -0.024769f, -0.020141f, -0.015711f, -0.007429f, 0.021302f, 0.013366f, 0.012419f, 0.000026f, 0.031357f, -0.016640f, 0.033182f, 0.029156f, 0.031299f, 0.054742f, -0.021184f, -0.016551f, 0.024070f, 0.004507f, -0.021262f, 0.033020f, -0.010884f, -0.015983f, 0.010711f, -0.004116f, -0.011475f, -0.009489f, 0.014179f, -0.019196f, 0.008675f, -0.011906f, 0.030333f, -0.012944f, 0.000454f, 0.008827f, 0.022110f, 0.030048f, 0.002384f, -0.026308f, -0.028573f, 0.009294f, -0.019048f, -0.061292f, -0.032276f, 0.009734f, -0.000729f, 0.017676f, 0.002224f, -0.010086f, -0.001207f, -0.005875f, 0.002556f, -0.010672f, -0.004725f, -0.007341f, -0.003122f, 0.000789f, -0.001378f, -0.019182f, -0.005086f, -0.012583f, -0.011321f, -0.008893f, 0.003823f, -0.000942f, 0.000707f, -0.013987f, -0.009788f, -0.000581f, -0.000613f, 0.002658f, 0.007099f, 0.005839f, 0.004293f, -0.010087f, 0.000395f, + 0.002221f, -0.013063f, 0.004500f, 0.000662f, 0.005571f, 0.002457f, 0.007124f, 0.003942f, -0.003013f, 0.005968f, -0.004727f, -0.003590f, -0.046957f, -0.039694f, -0.001922f, 0.008335f, -0.027104f, 0.001198f, 0.002394f, 0.043644f, -0.028476f, -0.032579f, 0.010552f, -0.013734f, -0.000058f, -0.023808f, 0.022668f, -0.024189f, -0.032404f, -0.019610f, 0.037437f, -0.025551f, -0.020873f, -0.004819f, 0.015196f, -0.011209f, -0.026863f, 0.008319f, -0.010883f, 0.000144f, 0.012216f, -0.035440f, -0.002676f, 0.019605f, 0.031524f, -0.004806f, 0.048190f, 0.021115f, -0.005499f, 0.002126f, 0.021913f, -0.009044f, -0.019604f, 0.003701f, 0.026103f, 0.002892f, 0.012529f, 0.000568f, -0.021385f, 0.007372f, -0.046941f, 0.004253f, 0.002546f, -0.005998f, -0.027650f, -0.025116f, 0.003043f, -0.011467f, -0.018986f, -0.012733f, -0.015286f, 0.017946f, -0.030918f, -0.017664f, -0.008919f, 0.013431f, -0.018194f, 0.037887f, -0.005712f, -0.031879f, -0.002766f, -0.018987f, -0.050548f, -0.015137f, 0.003340f, -0.001559f, -0.032841f, -0.017553f, -0.007502f, 0.007464f, -0.019521f, -0.009707f, 0.032389f, -0.011546f, -0.044222f, -0.015576f, + 0.005717f, 0.003365f, 0.014524f, 0.012272f, 0.009162f, -0.010292f, -0.012854f, -0.003080f, -0.008984f, 0.006436f, 0.001937f, -0.005687f, 0.009456f, 0.003928f, 0.005555f, -0.003839f, 0.004550f, 0.003401f, -0.000036f, -0.001899f, -0.003283f, -0.004120f, 0.000072f, 0.002550f, -0.015727f, 0.003354f, -0.009054f, 0.010088f, 0.003731f, -0.011641f, -0.010306f, -0.000913f, -0.008160f, -0.001208f, 0.003308f, -0.002962f, -0.005513f, -0.008638f, -0.006566f, 0.004532f, 0.001671f, -0.009782f, 0.003637f, 0.001003f, -0.006513f, -0.005546f, 0.035853f, 0.032045f, 0.009609f, 0.065598f, -0.012183f, -0.022912f, -0.020528f, -0.009614f, -0.035334f, 0.047746f, -0.028597f, -0.010438f, -0.023162f, -0.011950f, -0.010885f, 0.005637f, -0.033602f, 0.000528f, 0.000394f, -0.004632f, 0.009560f, -0.035523f, -0.009016f, 0.024375f, -0.024181f, 0.001334f, -0.031294f, 0.030055f, 0.000195f, -0.053376f, -0.027680f, -0.009662f, -0.001125f, 0.014849f, -0.032398f, -0.018174f, 0.022287f, -0.003801f, 0.015404f, 0.014151f, 0.013990f, -0.019449f, 0.002204f, 0.023619f, 0.008765f, -0.044061f, 0.028449f, 0.020520f, -0.023775f, 0.067688f, + -0.001150f, -0.048570f, 0.013530f, 0.015356f, -0.000989f, 0.036128f, -0.010975f, -0.060341f, 0.017126f, 0.008663f, 0.018197f, 0.021429f, -0.027466f, 0.043674f, 0.016564f, 0.013589f, -0.010243f, 0.066135f, -0.004930f, 0.001150f, 0.045279f, -0.007701f, 0.020742f, 0.035731f, 0.012407f, 0.005338f, -0.008407f, 0.017179f, 0.000914f, 0.030212f, -0.013090f, 0.029409f, 0.027157f, 0.001654f, 0.026877f, 0.015984f, 0.021459f, -0.010827f, 0.000140f, 0.024409f, 0.017803f, 0.013115f, 0.008077f, 0.008357f, -0.015887f, -0.001882f, 0.001014f, -0.007516f, 0.001254f, -0.002725f, -0.006658f, 0.014145f, -0.014271f, -0.002749f, -0.013991f, 0.012327f, -0.005802f, 0.014772f, -0.012313f, 0.002060f, -0.008489f, -0.012434f, 0.008930f, -0.004744f, -0.000023f, -0.012136f, -0.017723f, -0.013376f, 0.014252f, 0.001334f, -0.005428f, 0.001470f, 0.017678f, 0.012593f, -0.004924f, 0.006107f, 0.000571f, -0.004875f, 0.018290f, 0.000634f, 0.013213f, -0.046805f, -0.045939f, 0.094207f, 0.030382f, -0.058862f, -0.029609f, -0.027007f, -0.053908f, -0.004018f, -0.028459f, 0.039231f, -0.022205f, 0.000181f, 0.048928f, 0.001040f, + 0.008110f, -0.036060f, 0.045108f, 0.033624f, -0.000614f, -0.010900f, -0.003548f, -0.028037f, 0.002098f, 0.003549f, 0.005692f, -0.038522f, -0.005641f, -0.002240f, -0.011627f, -0.008586f, -0.026583f, 0.025140f, 0.049785f, 0.059839f, -0.004913f, -0.024253f, -0.010153f, -0.012406f, -0.008428f, -0.036741f, 0.012457f, 0.014346f, 0.013134f, -0.038286f, -0.051138f, 0.055225f, 0.020816f, 0.030927f, 0.040074f, 0.037617f, -0.016354f, -0.025725f, 0.036257f, -0.036946f, 0.018695f, -0.027652f, -0.021261f, -0.012335f, 0.043145f, -0.014320f, 0.008727f, 0.014852f, -0.007927f, -0.034930f, 0.072175f, -0.043667f, 0.004429f, 0.052330f, -0.047420f, -0.021420f, 0.005512f, 0.019156f, 0.053730f, 0.009660f, -0.031260f, 0.000918f, 0.006494f, -0.007279f, -0.013165f, 0.007778f, -0.021917f, 0.016784f, -0.018156f, -0.025358f, 0.013631f, 0.007749f, 0.019289f, 0.008764f, -0.000782f, -0.008759f, 0.002110f, 0.005479f, 0.005897f, 0.020774f, -0.001275f, 0.002934f, 0.012786f, -0.030588f, 0.004327f, -0.013740f, 0.003283f, 0.003497f, -0.005039f, -0.011526f, -0.014471f, -0.003433f, -0.014524f, 0.005750f, 0.007747f, 0.017804f, + -0.001654f, -0.011766f, 0.011202f, 0.013824f, 0.008258f, 0.008490f, -0.022163f, 0.000870f, 0.005462f, -0.005371f, 0.018883f, -0.007020f, 0.001325f, 0.002126f, 0.017426f, -0.008257f, 0.005139f, 0.024448f, -0.015739f, 0.015314f, 0.062728f, 0.037784f, -0.005724f, -0.040261f, 0.004156f, 0.064326f, 0.051208f, 0.010743f, -0.051015f, -0.019682f, -0.044051f, -0.003336f, 0.034380f, 0.042482f, -0.003175f, 0.016114f, 0.050502f, 0.053750f, 0.083434f, 0.083987f, -0.042018f, 0.018233f, -0.045369f, -0.008251f, -0.036790f, -0.013254f, 0.028909f, -0.006540f, 0.012625f, 0.011331f, -0.026158f, -0.019178f, 0.021259f, 0.023708f, 0.030778f, 0.021859f, -0.001098f, 0.022537f, 0.033977f, -0.018076f, 0.017179f, 0.020014f, 0.005921f, 0.019544f, 0.065058f, -0.048996f, -0.042187f, -0.009547f, 0.040178f, 0.038494f, -0.022967f, -0.000356f, 0.061754f, 0.049928f, -0.035088f, -0.023428f, 0.021182f, -0.042845f, 0.011839f, -0.020654f, -0.038866f, 0.012470f, -0.045656f, 0.047297f, 0.017339f, 0.052399f, -0.022100f, -0.030767f, -0.059342f, -0.012909f, 0.019300f, -0.052022f, -0.044503f, -0.024415f, 0.023143f, 0.013657f, + 0.010853f, -0.022970f, 0.009859f, -0.016468f, 0.006228f, 0.048158f, -0.020613f, 0.005565f, -0.027447f, 0.020615f, -0.011364f, -0.023098f, 0.016147f, 0.022412f, -0.012615f, -0.006597f, -0.007508f, 0.016055f, 0.035900f, -0.011655f, -0.024289f, 0.000395f, -0.000540f, -0.009101f, -0.003945f, -0.033685f, 0.004545f, -0.017972f, -0.008097f, 0.011996f, -0.011064f, -0.006128f, -0.001112f, -0.009467f, 0.014661f, -0.014910f, -0.023374f, -0.021243f, -0.017888f, 0.018682f, 0.009793f, -0.004513f, 0.008205f, 0.005420f, -0.015208f, -0.016646f, 0.005967f, -0.029357f, 0.024770f, 0.063113f, -0.004057f, -0.019523f, 0.040532f, 0.008343f, -0.002315f, -0.060067f, 0.052792f, -0.026037f, -0.057062f, -0.019384f, 0.003889f, 0.065815f, 0.006331f, 0.047167f, 0.019146f, -0.055835f, -0.012114f, -0.049464f, 0.007972f, -0.049305f, -0.035432f, -0.021163f, 0.002513f, 0.010380f, -0.038193f, 0.037523f, -0.012075f, 0.022806f, 0.024537f, 0.024265f, 0.045541f, 0.083025f, 0.048745f, -0.015834f, -0.040806f, -0.001420f, 0.087443f, 0.054466f, -0.029733f, 0.043525f, -0.016736f, 0.053164f, -0.026377f, 0.005169f, -0.019739f, -0.009802f, + -0.002947f, -0.014930f, 0.131405f, -0.024986f, -0.036231f, -0.041911f, -0.058918f, -0.022675f, -0.045404f, -0.002020f, 0.050801f, -0.020217f, 0.015025f, -0.016901f, -0.025882f, 0.046192f, -0.012820f, 0.077813f, 0.014444f, 0.062244f, -0.076002f, 0.031323f, 0.133587f, 0.048611f, -0.074466f, 0.044359f, 0.040640f, 0.002461f, 0.008646f, -0.022818f, 0.025472f, 0.117261f, 0.062380f, 0.026330f, 0.035592f, -0.036658f, 0.067891f, -0.007079f, 0.010464f, 0.010789f, 0.016788f, 0.007893f, 0.044671f, -0.036855f, -0.009169f, 0.003240f, 0.056942f, -0.009575f, 0.013995f, 0.065940f, -0.005146f, -0.036642f, -0.008437f, 0.024272f, 0.004045f, -0.015473f, -0.037130f, 0.021667f, 0.015557f, -0.025555f, -0.014991f, 0.017787f, -0.031402f, -0.026115f, 0.008556f, 0.013142f, -0.000057f, 0.009149f, 0.006235f, 0.010691f, -0.011471f, 0.011182f, -0.006961f, -0.009323f, 0.010323f, 0.004471f, 0.014263f, 0.002210f, 0.091285f, 0.042595f, 0.010136f, -0.002913f, -0.099757f, 0.046400f, 0.062583f, -0.045215f, -0.032881f, 0.077275f, 0.050418f, -0.062061f, -0.065808f, 0.002180f, -0.038476f, 0.016584f, 0.006343f, 0.015816f, + -0.061839f, 0.015994f, -0.012030f, -0.030966f, 0.054927f, -0.004005f, -0.009145f, 0.018280f, 0.046071f, 0.041197f, 0.028336f, -0.053110f, 0.001176f, -0.026031f, -0.056362f, 0.020323f, 0.015998f, 0.034502f, -0.011872f, -0.026543f, 0.072208f, -0.052062f, 0.022933f, 0.024798f, 0.020455f, 0.015214f, -0.008890f, 0.042359f, -0.039471f, -0.068619f, -0.011384f, -0.078568f, 0.068793f, 0.041888f, 0.067515f, -0.005785f, 0.013382f, -0.054775f, 0.056731f, 0.071026f, 0.025738f, -0.030733f, -0.079873f, -0.018792f, -0.105409f, 0.001152f, -0.019514f, -0.072004f, -0.060593f, 0.027376f, 0.004597f, 0.043594f, -0.033904f, 0.050027f, 0.042643f, -0.060366f, 0.012862f, -0.036263f, -0.009947f, -0.054607f, 0.007064f, 0.157034f, 0.039490f, 0.045703f, 0.057915f, 0.025218f, -0.044515f, -0.006690f, -0.000434f, 0.036824f, -0.008374f, 0.037843f, -0.017194f, -0.024260f, 0.001150f, -0.003272f, -0.043949f, 0.037376f, -0.006799f, -0.011450f, -0.013473f, -0.031577f, 0.004680f, -0.015251f, -0.019527f, -0.029412f, -0.022392f, 0.013374f, -0.016101f, 0.013073f, 0.015923f, -0.011702f, -0.018160f, -0.025525f, 0.011638f, -0.005177f, + 0.010860f, 0.037309f, 0.023960f, -0.001130f, -0.002870f, 0.011471f, 0.024045f, -0.024201f, 0.021248f, -0.024402f, -0.010283f, -0.062411f, 0.028139f, 0.021600f, -0.029125f, 0.010959f, -0.014781f, -0.094118f, -0.024583f, 0.024048f, -0.010554f, 0.011078f, -0.052288f, 0.069504f, -0.090172f, 0.007824f, -0.065942f, 0.046807f, 0.051296f, 0.017301f, 0.042992f, 0.005437f, -0.043347f, 0.075401f, -0.034447f, 0.008611f, 0.001558f, -0.042207f, 0.071253f, 0.005694f, 0.018776f, 0.016305f, 0.022511f, 0.012586f, 0.053485f, 0.063393f, 0.021531f, 0.073941f, -0.063123f, -0.004048f, 0.000450f, 0.094327f, -0.017448f, 0.075388f, 0.042045f, 0.103283f, 0.020591f, -0.022356f, -0.032217f, 0.041581f, -0.076130f, 0.073161f, -0.043148f, -0.024877f, -0.011666f, 0.015482f, 0.055239f, -0.011913f, -0.098831f, -0.026684f, 0.161327f, 0.012835f, -0.100804f, 0.025949f, -0.066594f, 0.020867f, 0.158959f, -0.042668f, -0.042898f, 0.110938f, -0.118203f, 0.060892f, 0.027728f, 0.036807f, 0.103702f, 0.066214f, -0.091254f, 0.113905f, 0.074937f, 0.004379f, 0.120981f, -0.048525f, -0.015934f, 0.088183f, 0.058135f, 0.011433f, + 0.024094f, 0.000910f, -0.000480f, 0.011568f, 0.030652f, -0.026005f, 0.032363f, 0.033516f, -0.026273f, 0.015136f, 0.022786f, -0.037650f, -0.002793f, 0.015564f, -0.002809f, 0.008455f, 0.049966f, 0.001915f, 0.033580f, -0.016170f, 0.001318f, 0.024885f, -0.014007f, -0.011242f, -0.031360f, 0.006690f, 0.030366f, 0.020844f, 0.028666f, -0.050675f, 0.029969f, 0.035089f, 0.016369f, 0.007150f, 0.015056f, -0.001154f, 0.031892f, 0.056347f, 0.014574f, 0.027844f, 0.026307f, -0.011465f, -0.013329f, 0.027521f, 0.040123f, 0.054541f, 0.103982f, 0.051776f, -0.049859f, 0.066497f, 0.019930f, 0.059994f, -0.017282f, -0.111047f, 0.112909f, 0.098050f, 0.060248f, 0.185111f, -0.017265f, -0.155298f, -0.080299f, -0.073282f, 0.164174f, 0.120702f, 0.029180f, -0.010412f, -0.030006f, -0.108559f, -0.051582f, -0.035147f, -0.062403f, 0.167116f, 0.135548f, 0.188485f, 0.003498f, -0.215505f, -0.335706f, -0.163646f, 0.187043f, 0.252487f, 0.257751f, 0.103997f, -0.213655f, -0.392435f, -0.240710f, -0.121362f, 0.181108f, 0.308064f, 0.174886f, 0.095261f, 0.025450f, -0.138725f, -0.186651f, -0.139496f, -0.010526f, 0.108495f, + 0.219552f, 0.262673f, 0.046681f, 0.051579f, -0.208288f, -0.344995f, -0.184078f, 0.172355f, 0.288862f, 0.274111f, 0.171004f, -0.100115f, -0.335815f, -0.217121f, -0.281600f, 0.001428f, 0.191172f, 0.206989f, 0.103572f, -0.081571f, -0.176815f, -0.156293f, -0.123902f, 0.037185f, 0.117749f, 0.083333f, 0.238225f, 0.086647f, -0.053338f, -0.140215f, -0.052328f, 0.159443f, 0.231892f, 0.079025f, -0.009136f, -0.141152f, -0.028932f, -0.031082f, 0.091457f, 0.035597f, -0.023522f, -0.097133f, -0.029624f, 0.006498f, -0.016002f, -0.028354f, -0.006677f, 0.024391f, 0.049333f, 0.085085f, 0.040128f, -0.081270f, -0.073899f, -0.067557f, 0.016153f, 0.089688f, 0.097714f, 0.046909f, 0.010040f, -0.061187f, -0.027547f, -0.121293f, -0.109228f, -0.007720f, 0.031715f, 0.136898f, 0.202662f, 0.079096f, -0.071401f, -0.165559f, -0.209417f, -0.085564f, 0.163221f, 0.272700f, 0.185046f, 0.058719f, -0.136526f, -0.219047f, -0.109218f, 0.001847f, 0.039555f, 0.042535f, 0.093458f, 0.050695f, 0.020050f, -0.053549f, -0.120388f, -0.087259f, 0.011646f, -0.023407f, -0.060251f, 0.069727f, 0.010105f, -0.100807f, 0.013095f, -0.026171f, + -0.040360f, 0.030445f, -0.030870f, -0.012253f, -0.053796f, 0.003230f, -0.020398f, -0.040215f, 0.016422f, -0.004444f, 0.013823f, 0.006653f, 0.033859f, -0.032786f, -0.010723f, 0.010275f, 0.004057f, 0.015706f, -0.013619f, 0.033922f, -0.023377f, 0.023425f, 0.011507f, -0.010744f, -0.024549f, -0.010591f, -0.046387f, 0.051241f, -0.004090f, 0.001953f, -0.008322f, -0.011934f, 0.003390f, -0.001240f, 0.001921f, 0.019969f, 0.012384f, -0.000334f, 0.029259f, -0.024495f, 0.009486f, -0.023253f, 0.026394f, 0.015950f, -0.018760f, 0.013888f, -0.023038f, -0.026507f, -0.020942f, -0.041005f, -0.003788f, 0.031190f, -0.027567f, -0.055871f, -0.037745f, 0.003517f, 0.034842f, 0.000847f, 0.026141f, -0.053196f, -0.013386f, -0.006091f, -0.004243f, -0.052040f, -0.012477f, 0.001813f, 0.008180f, -0.018627f, 0.054889f, 0.021908f, -0.017077f, 0.050100f, -0.004502f, -0.089623f, -0.003294f, -0.013076f, -0.007633f, 0.017230f, 0.011773f, 0.023750f, -0.027609f, 0.038432f, -0.065485f, 0.018911f, 0.012029f, -0.002901f, 0.000368f, -0.004431f, -0.004164f, 0.021921f, -0.003776f, 0.003723f, -0.009552f, -0.001179f, -0.018959f, 0.004714f, + 0.000489f, 0.038228f, 0.000019f, 0.016793f, -0.017394f, 0.001885f, -0.008574f, -0.023000f, 0.007375f, -0.000867f, -0.010930f, 0.027124f, -0.004883f, -0.007446f, -0.010783f, 0.019782f, -0.007313f, -0.038452f, 0.008162f, -0.007928f, 0.012124f, -0.016638f, 0.002058f, -0.005149f, -0.022932f, 0.021003f, -0.020247f, 0.014293f, -0.019325f, 0.009900f, -0.001448f, -0.007926f, -0.054442f, -0.089327f, -0.140335f, 0.005158f, 0.115860f, -0.044277f, -0.071071f, -0.075966f, -0.071780f, 0.015034f, 0.014924f, 0.133542f, -0.019290f, -0.019126f, -0.059372f, 0.006697f, 0.018099f, 0.042080f, -0.044623f, 0.022660f, -0.032446f, 0.052319f, 0.016701f, 0.017159f, 0.006325f, -0.032498f, -0.017666f, -0.021169f, -0.006970f, 0.018959f, -0.019583f, -0.017254f, 0.036907f, -0.033648f, -0.020977f, 0.030496f, -0.028979f, -0.010647f, -0.024872f, -0.040623f, 0.014394f, 0.026674f, 0.004930f, 0.025130f, -0.038189f, -0.009732f, -0.001105f, 0.022158f, 0.027473f, 0.033999f, 0.002405f, -0.003578f, -0.057448f, -0.059081f, -0.021821f, -0.019179f, -0.012902f, 0.027087f, 0.037174f, 0.052423f, 0.005809f, -0.023991f, 0.052612f, -0.037626f, + -0.016781f, 0.023352f, -0.016449f, 0.069001f, 0.003537f, -0.011574f, 0.011721f, -0.025305f, 0.020051f, 0.047765f, 0.039227f, -0.014244f, 0.014856f, -0.046580f, -0.030329f, -0.017351f, -0.011460f, 0.034371f, -0.004449f, 0.033548f, 0.008968f, -0.011229f, 0.004065f, 0.005888f, -0.040282f, 0.023819f, -0.029812f, 0.018373f, -0.013674f, -0.008596f, -0.002080f, 0.021788f, -0.020919f, 0.002398f, 0.003715f, 0.018979f, 0.033704f, -0.017390f, -0.005008f, -0.027050f, -0.010749f, 0.008973f, -0.010518f, 0.007059f, -0.008218f, -0.011288f, -0.018587f, -0.029580f, -0.016088f, 0.026304f, -0.010446f, 0.012754f, -0.019151f, -0.004850f, -0.001508f, -0.006500f, -0.017167f, -0.008185f, 0.001968f, -0.002467f, 0.000263f, -0.000454f, -0.025982f, 0.036575f, -0.090420f, -0.211368f, -0.161532f, -0.018644f, 0.069922f, 0.182362f, 0.153947f, 0.147005f, 0.150095f, 0.099079f, 0.041702f, -0.054096f, -0.096013f, -0.183177f, -0.135029f, -0.132622f, -0.132295f, -0.082235f, 0.079742f, 0.107571f, 0.157978f, 0.121372f, 0.101587f, 0.033582f, 0.067736f, -0.015213f, -0.017641f, -0.021253f, -0.037182f, -0.069328f, -0.056932f, -0.116797f, + -0.042663f, -0.092744f, -0.044323f, -0.021884f, 0.030280f, 0.006150f, 0.043369f, 0.010136f, 0.060780f, 0.044860f, 0.073545f, 0.098021f, 0.121526f, 0.077907f, 0.052141f, 0.086551f, 0.006534f, -0.029320f, -0.106940f, -0.125128f, -0.172431f, -0.153455f, -0.143736f, -0.054897f, -0.094400f, -0.049198f, 0.005608f, 0.026107f, 0.060648f, 0.116166f, 0.123490f, 0.138353f, 0.208612f, 0.117684f, 0.159776f, 0.111068f, 0.025088f, -0.016836f, -0.065763f, -0.166931f, -0.182936f, -0.173825f, -0.193241f, -0.141587f, -0.099091f, -0.079193f, -0.021943f, 0.040805f, 0.067898f, 0.086712f, 0.128533f, 0.136901f, 0.143776f, 0.136213f, 0.084580f, 0.059388f, 0.027911f, 0.003261f, -0.000604f, -0.040890f, -0.067406f, -0.096864f, -0.115661f, -0.122326f, -0.116178f, -0.081274f, -0.036846f, -0.032632f, -0.012663f, 0.021933f, 0.057491f, 0.072149f, 0.136003f, 0.096275f, 0.075613f, 0.076031f, 0.027112f, -0.002959f, -0.019914f, -0.023977f, -0.025912f, -0.065901f, -0.059604f, -0.042718f, -0.045216f, -0.032695f, 0.004113f, 0.010448f, 0.012827f, -0.007814f, 0.021444f, 0.000776f, 0.025415f, 0.026630f, 0.008430f, -0.009015f, + -0.001335f, 0.005821f, 0.003428f, 0.004235f, 0.011911f, 0.002768f, -0.006342f, -0.019124f, -0.004636f, 0.004359f, -0.000714f, 0.011876f, 0.009076f, -0.002015f, -0.001966f, -0.008177f, -0.006682f, -0.004432f, -0.003074f, -0.003653f, 0.002603f, -0.002224f, -0.001733f, -0.000508f, -0.004054f, -0.005399f, 0.000514f, 0.001086f, 0.001652f, 0.001186f, 0.000798f} + }, + { + {-0.017318f, 0.013452f, 0.000685f, 0.006191f, 0.006143f, 0.017404f, 0.008199f, -0.006398f, -0.008086f, -0.011289f, 0.008127f, -0.009873f, -0.007173f, 0.001639f, 0.002513f, 0.001094f, 0.010220f, -0.003309f, 0.009554f, -0.002419f, 0.008578f, -0.008080f, 0.003775f, -0.003557f, -0.008636f, -0.000589f, -0.016492f, 0.002499f, 0.004074f, 0.007406f, -0.006011f, -0.000076f, 0.006465f, -0.004722f, 0.007259f, 0.006835f, -0.004071f, 0.004914f, -0.005463f, -0.002531f, -0.004034f, -0.005904f, -0.007506f, 0.006758f, 0.009974f, -0.007431f, 0.004437f, 0.008023f, 0.006497f, 0.009818f, 0.001251f, -0.001454f, 0.005726f, 0.004349f, -0.010341f, -0.000378f, 0.001218f, 0.000677f, 0.003308f, 0.006732f, 0.001525f, 0.002451f, -0.003577f, -0.002261f, 0.004772f, 0.006688f, 0.003739f, -0.003522f, -0.006170f, 0.006894f, -0.005568f, -0.001802f, 0.003869f, -0.001149f, -0.000234f, 0.002944f, 0.000712f, 0.000198f, 0.006254f, -0.006095f, 0.004663f, 0.002539f, 0.003063f, 0.005769f, -0.002303f, -0.000660f, -0.001932f, -0.000801f, 0.000253f, 0.002827f, -0.002225f, -0.000403f, -0.001533f, -0.000887f, 0.000108f, -0.000217f, + -0.000888f, -0.000635f, 0.000648f, 0.000837f, -0.000005f, -0.000364f, -0.000612f, 0.000092f, -0.000187f, 0.000097f, -0.000884f, -0.000201f, 0.000908f, -0.001991f, 0.006860f, -0.003643f, 0.005025f, 0.000477f, -0.000430f, -0.013985f, 0.002240f, 0.011905f, -0.007316f, 0.004917f, -0.014851f, -0.015026f, -0.004955f, -0.012219f, -0.010667f, -0.001609f, 0.002198f, 0.008389f, 0.001331f, -0.004047f, 0.001896f, 0.005709f, -0.007389f, 0.010229f, -0.006937f, -0.007501f, 0.008665f, -0.004317f, 0.009983f, 0.012691f, 0.001754f, -0.009158f, 0.006403f, 0.004185f, 0.002564f, -0.004661f, -0.003381f, 0.005330f, 0.004448f, 0.000905f, -0.010353f, -0.002987f, -0.009564f, 0.008634f, -0.008633f, -0.005628f, 0.006352f, 0.000301f, 0.005513f, 0.001580f, 0.002113f, 0.009398f, 0.001586f, 0.010541f, -0.013593f, -0.006975f, -0.003146f, 0.006736f, 0.009518f, 0.010886f, 0.014804f, 0.001611f, -0.004224f, -0.001414f, -0.001993f, -0.000450f, -0.009630f, -0.004211f, -0.004193f, -0.001167f, 0.001480f, -0.007802f, -0.004629f, -0.001757f, -0.003331f, -0.006099f, 0.007328f, -0.007332f, -0.002509f, 0.004891f, -0.012579f, 0.003807f, + 0.006846f, 0.007610f, 0.003993f, 0.002212f, 0.004548f, -0.002224f, -0.004885f, -0.001221f, 0.001305f, -0.000515f, 0.001305f, 0.000250f, -0.001366f, 0.000107f, -0.001964f, -0.002287f, 0.002789f, 0.001271f, -0.000270f, -0.000009f, -0.000033f, 0.002138f, 0.000976f, -0.000816f, -0.000881f, -0.000852f, 0.000146f, 0.001586f, -0.001878f, -0.000298f, -0.000118f, -0.000330f, 0.001023f, -0.000034f, -0.000770f, 0.015925f, -0.011762f, -0.004398f, -0.002298f, 0.009801f, 0.008851f, -0.008882f, -0.000785f, -0.016509f, -0.003584f, 0.020073f, 0.007582f, -0.008040f, 0.014424f, 0.004723f, 0.005566f, 0.001495f, -0.004798f, -0.015755f, 0.002150f, -0.007081f, -0.004467f, -0.002858f, -0.009587f, -0.003378f, -0.007414f, 0.005222f, -0.003339f, -0.004331f, 0.009035f, -0.016958f, 0.015657f, -0.005482f, 0.002252f, -0.005292f, 0.004908f, -0.000607f, -0.001531f, -0.000394f, 0.006681f, 0.000356f, 0.004234f, -0.006044f, 0.011735f, -0.009078f, 0.013660f, 0.002930f, -0.001322f, -0.007606f, -0.008927f, 0.018555f, 0.003221f, -0.017343f, 0.017789f, 0.016769f, -0.009067f, -0.003306f, 0.005282f, -0.006830f, -0.001253f, -0.004199f, + 0.004228f, 0.010706f, -0.006474f, 0.002468f, -0.004844f, -0.004421f, 0.001772f, 0.014403f, -0.013163f, 0.008025f, -0.013568f, -0.010423f, -0.009795f, -0.001707f, 0.000286f, 0.000018f, 0.008240f, 0.012754f, 0.003337f, 0.003114f, 0.006230f, 0.005066f, 0.002797f, 0.003185f, 0.003740f, -0.001355f, 0.004024f, -0.001812f, -0.003934f, 0.006798f, -0.000333f, 0.000957f, -0.001224f, -0.001987f, -0.001174f, 0.000068f, 0.002869f, -0.000702f, 0.000646f, 0.000311f, -0.002547f, 0.000047f, 0.001412f, 0.001827f, -0.000208f, 0.001601f, 0.004541f, -0.006094f, 0.000737f, -0.012038f, 0.011600f, -0.016921f, 0.000722f, 0.017788f, -0.032133f, 0.022490f, 0.009034f, -0.008492f, 0.007133f, -0.000583f, 0.019617f, -0.001969f, -0.016086f, -0.011218f, 0.006652f, 0.007653f, 0.002263f, 0.000617f, 0.008393f, 0.002570f, 0.001459f, 0.011352f, 0.004709f, 0.003311f, 0.008220f, 0.005933f, 0.027948f, -0.007559f, 0.007517f, -0.000301f, -0.004462f, 0.007329f, 0.004603f, 0.002932f, 0.003649f, -0.004457f, -0.007594f, 0.000617f, 0.000105f, 0.000506f, 0.004148f, 0.008606f, -0.008550f, -0.009098f, 0.004097f, -0.002096f, + -0.003402f, -0.005402f, 0.011454f, -0.008022f, 0.016501f, 0.007808f, 0.000849f, 0.003958f, 0.001509f, 0.004591f, 0.020935f, 0.017596f, 0.001459f, 0.001104f, 0.004129f, -0.004069f, 0.007920f, -0.001597f, 0.007157f, 0.002283f, 0.000593f, 0.000131f, -0.008739f, 0.008622f, 0.006642f, -0.001775f, -0.004961f, 0.000831f, 0.008324f, 0.000929f, -0.002151f, 0.000596f, -0.006047f, 0.004617f, 0.001842f, 0.005849f, -0.001363f, 0.001830f, 0.002556f, 0.002523f, 0.002168f, 0.003569f, 0.001795f, 0.001669f, -0.007389f, -0.000297f, 0.003113f, 0.004383f, -0.002418f, 0.002897f, 0.002705f, 0.002409f, 0.002720f, 0.001236f, 0.002147f, 0.002621f, 0.002944f, 0.000592f, 0.001243f, 0.000953f, 0.001450f, 0.000558f, 0.000896f, 0.001881f, 0.000855f, -0.000171f, -0.001484f, -0.002026f, 0.004151f, -0.001864f, 0.009068f, 0.000246f, 0.010462f, -0.003951f, 0.009285f, -0.006954f, 0.019371f, -0.014746f, -0.005468f, -0.007021f, 0.019975f, 0.011308f, 0.007376f, 0.012678f, -0.011380f, -0.002285f, 0.018439f, 0.010460f, 0.008683f, 0.008952f, 0.004820f, 0.006157f, -0.002051f, 0.017656f, -0.001776f, -0.008098f, + -0.005978f, 0.006203f, -0.006593f, 0.004060f, -0.016618f, 0.006196f, -0.003138f, 0.000346f, -0.017858f, 0.007745f, -0.003783f, 0.016839f, -0.002683f, 0.005341f, 0.004677f, -0.007073f, -0.001699f, 0.007679f, 0.001118f, 0.005271f, -0.003729f, 0.009344f, 0.013291f, 0.001687f, -0.009163f, 0.003556f, 0.009367f, 0.006664f, 0.001298f, -0.006312f, -0.012937f, 0.010910f, -0.014411f, -0.006117f, 0.008189f, -0.019193f, -0.004327f, 0.011919f, -0.008799f, 0.002512f, 0.000239f, -0.001073f, -0.002494f, 0.004851f, -0.009500f, 0.000537f, -0.015912f, -0.008271f, -0.021774f, 0.001658f, -0.006051f, 0.000487f, -0.004154f, -0.000674f, -0.005477f, 0.005014f, 0.004871f, 0.001939f, -0.003370f, 0.004629f, -0.000439f, 0.001810f, -0.006213f, 0.001612f, 0.001378f, 0.002024f, 0.001469f, 0.004331f, -0.000468f, 0.004886f, -0.002049f, -0.000322f, 0.003483f, 0.004586f, 0.000807f, 0.002539f, -0.002854f, -0.001112f, -0.000739f, -0.001141f, -0.002022f, 0.001427f, 0.003670f, 0.000977f, 0.003868f, -0.003576f, -0.002049f, -0.002004f, -0.004865f, -0.005698f, 0.005226f, -0.035321f, 0.006163f, -0.011143f, -0.006492f, 0.008079f, + 0.006109f, 0.004296f, 0.001510f, -0.025954f, -0.002786f, 0.008065f, -0.013991f, -0.003665f, -0.019123f, -0.009721f, 0.004186f, -0.002281f, -0.017620f, 0.018262f, 0.010955f, -0.005607f, 0.001889f, 0.014365f, -0.009383f, 0.003848f, -0.006456f, -0.010049f, -0.006948f, -0.018162f, -0.006885f, 0.013668f, 0.006332f, 0.017470f, -0.008977f, -0.028637f, -0.012500f, 0.006972f, -0.009322f, -0.018677f, -0.003300f, -0.003539f, 0.016875f, 0.008648f, -0.020013f, 0.013219f, -0.014218f, -0.000909f, -0.010321f, -0.009840f, -0.009472f, -0.022035f, -0.013182f, 0.001534f, 0.013948f, 0.021228f, 0.013477f, 0.003883f, 0.008309f, -0.009833f, -0.016492f, -0.010176f, 0.010138f, -0.005103f, 0.010948f, -0.003479f, -0.010554f, -0.000632f, 0.000764f, -0.005123f, -0.011870f, 0.000606f, 0.008607f, -0.028687f, -0.019069f, 0.026541f, -0.008846f, 0.000419f, -0.014891f, 0.006917f, 0.003761f, -0.001854f, -0.001336f, 0.009631f, 0.007018f, 0.002069f, -0.003246f, -0.003765f, -0.000861f, -0.004191f, 0.002095f, 0.002742f, -0.005837f, -0.002971f, 0.001891f, 0.000507f, -0.000196f, 0.001543f, 0.005344f, -0.006051f, -0.002927f, -0.010957f, + -0.004613f, -0.001763f, -0.002233f, 0.000407f, 0.001330f, 0.002937f, 0.000008f, 0.003805f, -0.004896f, -0.003501f, 0.000618f, 0.000815f, 0.001362f, 0.013494f, -0.000379f, 0.006829f, -0.009255f, 0.006788f, -0.012648f, -0.000890f, 0.021965f, -0.010349f, 0.020750f, 0.021046f, 0.025938f, 0.006496f, 0.010380f, 0.022379f, 0.017514f, 0.012900f, -0.017343f, 0.002269f, 0.005487f, 0.015014f, -0.002951f, -0.012855f, 0.016662f, 0.016905f, -0.004787f, 0.011269f, -0.005602f, -0.005869f, 0.010598f, 0.009164f, -0.001277f, 0.010872f, 0.000964f, -0.017729f, -0.014180f, 0.015367f, 0.022275f, -0.001731f, -0.007702f, 0.004724f, 0.000694f, -0.010592f, -0.019892f, 0.010412f, -0.018809f, -0.009139f, 0.014401f, 0.003070f, 0.012742f, 0.000566f, 0.020396f, 0.002854f, 0.022397f, -0.026016f, 0.023635f, -0.004565f, -0.000878f, 0.007139f, 0.012503f, -0.009994f, -0.021531f, -0.006093f, 0.019783f, -0.003824f, -0.023040f, -0.013604f, -0.014106f, 0.003845f, 0.008376f, -0.020064f, 0.010189f, 0.011646f, 0.020901f, 0.006449f, 0.006608f, 0.000098f, 0.005909f, 0.001107f, 0.004632f, 0.003187f, -0.015178f, -0.001662f, + 0.007290f, 0.005118f, 0.012358f, -0.008045f, -0.002443f, -0.000104f, 0.001040f, 0.005910f, 0.000797f, 0.004888f, 0.002010f, -0.002325f, -0.001008f, 0.004661f, 0.004288f, 0.001672f, 0.004670f, 0.001330f, 0.002074f, 0.006147f, 0.000095f, -0.003247f, -0.001685f, 0.001379f, 0.002996f, -0.000376f, -0.001407f, 0.004978f, 0.002556f, 0.001139f, -0.005051f, -0.001588f, -0.002888f, -0.002482f, -0.000234f, 0.005317f, 0.000295f, 0.005061f, 0.007010f, 0.022452f, 0.002891f, 0.009387f, 0.026689f, 0.028768f, 0.008583f, 0.007253f, -0.021240f, -0.010705f, 0.023494f, -0.017409f, 0.024010f, 0.006809f, -0.000091f, -0.004745f, -0.008388f, -0.013831f, 0.002547f, 0.010680f, -0.025819f, -0.011644f, -0.010981f, 0.005783f, 0.005187f, 0.005715f, 0.000797f, 0.004446f, -0.000946f, 0.007846f, 0.006322f, -0.006784f, -0.012116f, -0.022259f, 0.003929f, -0.011993f, 0.020148f, 0.000882f, -0.011200f, -0.013972f, -0.004306f, 0.009439f, -0.017544f, 0.011053f, -0.005879f, 0.003702f, -0.000219f, -0.012400f, 0.012383f, 0.015786f, -0.010782f, 0.013300f, 0.003749f, -0.000919f, 0.037625f, -0.009370f, -0.024445f, 0.004732f, + 0.009155f, -0.005999f, 0.002009f, -0.010517f, 0.025531f, 0.014983f, -0.002572f, -0.005349f, 0.018117f, 0.017469f, -0.003672f, -0.014665f, -0.010785f, 0.035691f, -0.003320f, -0.004764f, -0.014388f, -0.009172f, -0.002913f, 0.003600f, -0.003772f, -0.009319f, 0.015266f, -0.004704f, 0.018124f, 0.005424f, -0.005789f, -0.001854f, 0.003193f, 0.000055f, -0.003177f, -0.003016f, 0.006340f, -0.007924f, -0.002053f, -0.002004f, 0.010436f, 0.001132f, -0.002361f, -0.000094f, -0.005431f, -0.004824f, -0.000742f, 0.001237f, 0.010936f, -0.002411f, 0.006449f, 0.002683f, -0.003667f, 0.002446f, 0.000364f, -0.005150f, 0.004024f, -0.002468f, 0.005589f, -0.000361f, -0.005905f, -0.004078f, -0.003415f, -0.004101f, -0.000168f, -0.001158f, -0.001939f, 0.002181f, 0.001921f, 0.003291f, 0.009172f, -0.019709f, -0.005642f, -0.006264f, 0.001543f, 0.008266f, 0.019253f, 0.016819f, -0.027107f, 0.000536f, 0.003085f, -0.002819f, -0.008155f, -0.018694f, -0.001999f, 0.006197f, 0.010967f, 0.008915f, -0.017183f, -0.003059f, -0.021758f, 0.020220f, 0.000792f, -0.002095f, 0.009658f, -0.009730f, -0.001868f, -0.023152f, 0.003768f, -0.013854f, + 0.009404f, -0.001884f, -0.003974f, -0.007884f, -0.015428f, -0.014974f, -0.001883f, -0.018451f, -0.030067f, -0.005651f, -0.013772f, -0.028868f, -0.002468f, -0.002560f, -0.015884f, 0.010231f, 0.015674f, -0.002051f, 0.007396f, -0.002081f, -0.002647f, 0.004200f, 0.004522f, -0.023399f, -0.007024f, 0.012698f, -0.011387f, 0.027796f, 0.004881f, 0.007351f, -0.018152f, -0.000262f, -0.008287f, -0.018449f, -0.002121f, 0.025796f, 0.011839f, 0.019580f, 0.010755f, -0.008659f, -0.021042f, -0.032708f, 0.021726f, 0.022360f, -0.002851f, 0.011514f, -0.025613f, 0.012093f, 0.010239f, 0.018193f, 0.002573f, -0.021854f, -0.002983f, -0.020376f, -0.007225f, 0.001605f, -0.006776f, 0.004224f, -0.004705f, -0.006815f, -0.001943f, 0.001884f, -0.001204f, -0.002282f, 0.005783f, -0.001942f, 0.002120f, -0.014811f, 0.000063f, -0.001289f, -0.002539f, -0.006762f, -0.003050f, 0.004346f, -0.006420f, -0.007299f, -0.002815f, -0.002677f, -0.003199f, -0.000114f, -0.001986f, -0.008070f, -0.006670f, -0.004067f, 0.002027f, 0.002586f, 0.004449f, 0.002140f, 0.004060f, 0.001385f, -0.006015f, 0.001080f, -0.001195f, -0.003644f, 0.001895f, -0.006791f, + 0.002598f, -0.003723f, -0.050496f, -0.012635f, 0.040151f, 0.013418f, 0.016378f, -0.010465f, 0.016542f, 0.027991f, 0.002061f, -0.004721f, -0.046632f, -0.010890f, -0.002186f, 0.026726f, 0.007530f, 0.010707f, -0.034933f, -0.009421f, -0.012986f, -0.008334f, 0.021728f, -0.012275f, -0.004246f, 0.003750f, 0.006228f, -0.011052f, -0.004814f, 0.005592f, -0.009752f, 0.021336f, -0.023930f, 0.002574f, 0.015789f, -0.020540f, 0.016851f, 0.028604f, 0.033348f, 0.015983f, 0.016328f, 0.021855f, -0.014989f, -0.027544f, 0.010999f, 0.011932f, 0.018212f, 0.014444f, -0.031083f, -0.008883f, 0.016362f, 0.009410f, 0.005963f, 0.019482f, 0.004404f, 0.022697f, -0.008437f, -0.004940f, 0.013030f, 0.011984f, 0.003649f, -0.020073f, -0.010686f, -0.021561f, -0.024617f, -0.001480f, -0.026926f, 0.001381f, -0.015667f, 0.001069f, -0.014248f, -0.008480f, -0.034593f, 0.023828f, 0.006321f, -0.005207f, -0.006187f, -0.003958f, 0.004649f, -0.012872f, -0.001778f, -0.030188f, -0.016489f, 0.010411f, 0.013647f, 0.005536f, 0.004592f, 0.001095f, -0.015782f, 0.007147f, 0.007230f, 0.005521f, -0.015080f, 0.003357f, 0.000600f, -0.012114f, + -0.004044f, 0.001989f, 0.001904f, -0.006298f, -0.009014f, 0.002862f, -0.004427f, -0.005645f, -0.001363f, 0.001186f, -0.001118f, -0.000807f, 0.003067f, -0.002938f, 0.004267f, -0.000864f, 0.006084f, -0.002832f, 0.005436f, 0.008371f, -0.006041f, 0.004597f, 0.000418f, 0.003149f, -0.003725f, -0.000522f, 0.004916f, 0.003789f, -0.007443f, 0.003790f, 0.003904f, 0.031657f, -0.015446f, -0.013218f, -0.011719f, 0.021793f, 0.027666f, -0.017396f, 0.044408f, 0.009312f, -0.019019f, 0.022723f, 0.006456f, -0.018531f, -0.021783f, -0.017581f, -0.001454f, -0.009452f, -0.006502f, -0.029009f, 0.011584f, 0.012048f, 0.040036f, 0.005402f, -0.006885f, -0.018116f, -0.018998f, 0.004771f, -0.002293f, -0.025379f, 0.004442f, -0.009432f, 0.001163f, 0.019545f, -0.015200f, 0.025858f, -0.022783f, -0.019130f, -0.001349f, -0.029764f, -0.035631f, 0.005740f, -0.004137f, -0.041087f, 0.002780f, 0.000439f, -0.019599f, 0.010223f, -0.009553f, 0.005148f, -0.027808f, -0.045334f, 0.029679f, -0.027752f, 0.046014f, 0.025119f, -0.032999f, -0.004258f, -0.033438f, -0.009036f, -0.004299f, 0.013814f, -0.012090f, 0.021103f, 0.026584f, 0.025270f, + -0.018339f, -0.014925f, 0.002295f, -0.022437f, -0.002165f, -0.007339f, -0.029639f, 0.017641f, 0.013017f, -0.015779f, 0.023193f, -0.034604f, -0.003400f, 0.002047f, -0.009135f, -0.005853f, 0.029955f, 0.022166f, 0.014688f, -0.001833f, -0.015767f, -0.012725f, -0.011908f, 0.005183f, 0.004753f, -0.000973f, 0.003313f, -0.000929f, -0.001479f, 0.000623f, -0.001353f, 0.001201f, 0.005899f, -0.007147f, 0.002753f, -0.000515f, 0.006500f, -0.003852f, -0.000783f, 0.003809f, 0.008717f, 0.003495f, 0.007017f, -0.008476f, -0.009350f, 0.004402f, -0.006260f, 0.001494f, -0.000135f, -0.009875f, -0.005612f, -0.005889f, 0.000008f, 0.003248f, 0.002835f, 0.001996f, 0.002220f, -0.026913f, -0.020467f, 0.013429f, 0.016268f, 0.017984f, 0.030402f, -0.011196f, 0.055934f, -0.001713f, -0.028936f, 0.012669f, 0.027582f, 0.007590f, 0.014505f, -0.012214f, -0.030991f, 0.046683f, 0.025918f, 0.019164f, 0.009079f, -0.016091f, 0.015046f, 0.038898f, -0.014250f, 0.008395f, -0.000360f, 0.008246f, 0.006720f, 0.027742f, -0.007939f, 0.009485f, -0.009736f, 0.008495f, -0.002600f, -0.001405f, 0.017218f, 0.003738f, -0.034270f, -0.022931f, + -0.032111f, -0.021941f, -0.017013f, -0.008387f, -0.024571f, -0.013841f, -0.012043f, -0.021254f, -0.014784f, 0.009513f, -0.022233f, -0.007591f, -0.017248f, 0.041467f, 0.021096f, 0.036115f, -0.032575f, -0.002965f, -0.029759f, -0.006200f, 0.033465f, 0.018483f, 0.039417f, 0.018875f, 0.024418f, -0.025773f, 0.011750f, 0.011590f, 0.036509f, 0.037120f, 0.011144f, 0.033598f, -0.028781f, -0.013667f, 0.021538f, -0.075557f, 0.001420f, 0.012552f, 0.001639f, 0.018902f, 0.012190f, 0.042787f, -0.003245f, -0.005782f, 0.046287f, 0.014087f, -0.004046f, -0.020582f, -0.000360f, 0.000479f, 0.037943f, 0.005154f, 0.001082f, 0.003187f, 0.007720f, 0.011940f, -0.002054f, -0.002024f, 0.012287f, 0.006004f, 0.004040f, 0.006592f, 0.008937f, 0.006996f, -0.000393f, 0.001639f, 0.001274f, 0.012785f, -0.002176f, 0.006815f, 0.012272f, 0.009147f, 0.013684f, -0.005812f, -0.004458f, 0.003385f, 0.004480f, -0.004440f, 0.000454f, 0.008009f, 0.012713f, -0.000620f, 0.003845f, 0.032560f, 0.021159f, -0.021374f, 0.041636f, 0.024688f, -0.002125f, -0.010440f, -0.005253f, 0.024968f, 0.061521f, 0.032825f, 0.008837f, 0.002513f, + 0.020209f, -0.005003f, 0.049668f, 0.028015f, 0.031024f, 0.001192f, -0.015815f, 0.010452f, 0.003741f, -0.026498f, -0.006509f, -0.001754f, -0.006239f, -0.007621f, 0.010089f, 0.005402f, -0.021666f, -0.010487f, -0.038287f, -0.004028f, -0.011898f, -0.049373f, -0.022121f, 0.001395f, 0.018447f, -0.025462f, 0.031719f, -0.008889f, -0.007567f, -0.004426f, -0.007736f, 0.022957f, -0.015517f, 0.016012f, -0.050513f, 0.015520f, 0.022046f, 0.016887f, 0.033670f, -0.033362f, 0.028834f, -0.029963f, -0.022281f, 0.024822f, -0.014608f, -0.004562f, 0.020945f, -0.033969f, 0.030022f, 0.047983f, -0.000973f, -0.007123f, 0.061391f, -0.013352f, 0.011828f, 0.034470f, -0.073771f, -0.037909f, 0.002518f, 0.002105f, 0.010022f, 0.017605f, 0.035905f, 0.021440f, -0.028203f, -0.022758f, -0.006682f, -0.008217f, -0.038099f, -0.003878f, -0.007581f, 0.009242f, -0.039808f, 0.000290f, -0.011983f, 0.016028f, -0.005993f, 0.020452f, 0.005558f, 0.000004f, -0.011775f, -0.008841f, -0.011070f, -0.011931f, -0.008979f, 0.007932f, -0.024188f, 0.017169f, -0.002862f, 0.009475f, 0.000617f, -0.001740f, -0.016501f, 0.008882f, -0.011710f, 0.002804f, + -0.012442f, -0.007003f, -0.000054f, -0.005718f, -0.014279f, 0.000858f, -0.004453f, 0.001379f, -0.009709f, -0.010952f, -0.011422f, 0.001864f, 0.002492f, 0.014300f, 0.015528f, -0.000330f, 0.000388f, -0.011236f, -0.058615f, -0.035298f, 0.042980f, 0.042735f, 0.004502f, -0.010238f, 0.036225f, -0.058795f, -0.031613f, -0.063608f, 0.027673f, 0.007604f, 0.002717f, 0.012210f, -0.028999f, 0.014530f, 0.019995f, 0.026250f, 0.044552f, 0.045795f, 0.038450f, -0.001660f, 0.008612f, 0.000402f, -0.016888f, -0.003571f, -0.014119f, -0.007339f, 0.053110f, -0.012531f, -0.049042f, -0.012471f, -0.010179f, 0.004273f, 0.076567f, -0.027827f, -0.027602f, 0.025844f, -0.041640f, 0.014252f, -0.046194f, 0.060087f, 0.016893f, -0.001797f, 0.015325f, -0.023340f, -0.029512f, 0.041129f, -0.050281f, -0.040190f, -0.036169f, 0.009875f, 0.014946f, 0.018645f, -0.033568f, 0.034188f, -0.010725f, 0.002459f, 0.052738f, -0.003739f, -0.009119f, 0.015435f, 0.042534f, -0.027750f, 0.070624f, 0.002494f, -0.081669f, -0.010052f, -0.003272f, -0.027360f, -0.007992f, -0.000151f, -0.007770f, -0.022372f, -0.018849f, 0.039978f, 0.026739f, -0.010016f, + 0.025868f, -0.046974f, 0.012996f, 0.020849f, 0.012910f, 0.001374f, 0.024901f, -0.004272f, -0.001265f, 0.009236f, 0.024336f, -0.010288f, -0.010844f, -0.008500f, 0.000965f, 0.009111f, -0.004883f, -0.019466f, -0.020934f, 0.000871f, -0.009918f, 0.007057f, -0.000422f, 0.004934f, 0.010852f, -0.013667f, -0.009107f, 0.023197f, -0.005573f, 0.004066f, -0.001980f, 0.000458f, -0.008155f, -0.009044f, -0.004683f, -0.003146f, -0.012601f, 0.005835f, 0.011158f, 0.006186f, -0.000414f, 0.000883f, 0.004920f, -0.009707f, 0.001980f, 0.010686f, -0.001301f, 0.009137f, -0.005500f, -0.017133f, -0.023166f, 0.000347f, 0.010169f, -0.016508f, -0.007505f, 0.077843f, 0.046149f, -0.062697f, -0.050649f, 0.062663f, 0.059741f, 0.037394f, 0.042948f, -0.074655f, -0.016350f, -0.020554f, 0.019752f, 0.007288f, -0.030106f, -0.055134f, -0.083517f, 0.024481f, 0.022103f, 0.006515f, 0.023034f, -0.011381f, -0.004145f, -0.019799f, 0.016644f, 0.028958f, 0.026015f, 0.006817f, 0.034548f, 0.011097f, -0.003853f, -0.014032f, -0.050742f, -0.002700f, -0.021315f, -0.017682f, 0.017725f, -0.054467f, 0.004941f, 0.002228f, -0.025370f, 0.022286f, + 0.020460f, 0.010113f, -0.036610f, -0.034086f, -0.089833f, -0.022853f, 0.000699f, -0.028772f, 0.005137f, 0.019017f, 0.018977f, 0.050296f, 0.024731f, -0.022183f, -0.015508f, -0.033378f, 0.042344f, -0.017750f, 0.073246f, 0.061181f, 0.017013f, -0.039051f, 0.080862f, 0.037201f, -0.032670f, 0.005039f, 0.040660f, 0.094029f, -0.038782f, -0.071828f, -0.037008f, 0.001013f, -0.025852f, 0.011369f, 0.025989f, 0.021673f, -0.018797f, -0.029359f, -0.016175f, -0.024431f, -0.026794f, 0.007483f, 0.029276f, 0.023362f, 0.013195f, 0.011654f, 0.004327f, 0.019654f, 0.002736f, 0.003183f, 0.028627f, 0.022415f, -0.001235f, -0.009354f, 0.006529f, -0.014853f, 0.015962f, -0.005644f, 0.016338f, -0.008310f, 0.006588f, 0.004271f, 0.010827f, 0.013865f, 0.008238f, 0.006459f, -0.013397f, -0.026540f, 0.003233f, -0.013469f, -0.006745f, 0.008019f, 0.002487f, -0.003921f, -0.005065f, 0.019190f, 0.006412f, 0.025958f, -0.008235f, 0.013887f, 0.014049f, -0.017655f, 0.018446f, 0.000967f, -0.014748f, 0.031206f, 0.011233f, -0.010719f, -0.030016f, 0.025406f, -0.050965f, -0.047124f, -0.016870f, 0.036799f, -0.020858f, -0.026721f, + -0.000104f, 0.042379f, 0.004626f, 0.043788f, -0.014426f, 0.052828f, 0.006253f, 0.028389f, -0.018279f, -0.012161f, 0.016848f, -0.054122f, -0.014948f, 0.020683f, -0.009474f, -0.007098f, -0.043493f, -0.041071f, 0.019400f, -0.024963f, -0.017847f, 0.034096f, 0.046681f, -0.006590f, 0.030791f, -0.054684f, 0.003612f, -0.014661f, 0.071603f, -0.029159f, 0.024028f, 0.043990f, 0.041899f, 0.012463f, -0.028737f, 0.018807f, 0.013589f, 0.012965f, 0.023351f, -0.069938f, 0.130024f, 0.041815f, -0.011051f, 0.007195f, 0.014900f, 0.036398f, -0.009645f, 0.028114f, 0.075991f, -0.003910f, -0.093131f, 0.039494f, 0.032923f, -0.032792f, 0.044323f, -0.009253f, -0.019198f, -0.049704f, 0.097296f, -0.049466f, 0.108286f, -0.070611f, 0.027089f, -0.000923f, 0.117613f, 0.052452f, -0.049674f, 0.048524f, 0.002518f, -0.030668f, 0.023975f, 0.004122f, 0.011024f, 0.026700f, 0.011585f, -0.029644f, -0.007407f, 0.036233f, 0.010012f, 0.020723f, -0.016025f, 0.022855f, -0.037381f, 0.014557f, -0.001700f, -0.011707f, 0.023951f, -0.012552f, -0.006924f, 0.017447f, -0.002453f, 0.003050f, -0.002555f, 0.028985f, -0.018210f, 0.028299f, + -0.015976f, 0.026220f, 0.036366f, 0.013886f, 0.010168f, 0.020407f, -0.004753f, -0.013604f, -0.013341f, 0.017682f, 0.006364f, -0.002313f, 0.000174f, -0.003936f, -0.025407f, -0.019312f, -0.003595f, 0.001347f, -0.015741f, 0.088721f, 0.010369f, 0.048050f, 0.024375f, -0.049216f, 0.002783f, 0.028786f, -0.009019f, -0.042891f, -0.008449f, -0.093236f, -0.026317f, -0.034893f, -0.020345f, 0.020045f, -0.003022f, 0.033029f, -0.016621f, 0.003357f, 0.032106f, -0.029139f, 0.002803f, 0.018243f, -0.002152f, -0.031944f, -0.000391f, -0.022017f, 0.063809f, -0.011486f, 0.036828f, 0.005789f, -0.000990f, 0.065554f, 0.047017f, -0.029193f, -0.034385f, 0.016455f, 0.029386f, 0.035884f, 0.043437f, -0.001032f, 0.015053f, 0.041357f, -0.002683f, -0.016947f, 0.012585f, 0.001238f, -0.037298f, -0.001057f, 0.023824f, -0.036478f, -0.049321f, -0.004836f, -0.003436f, -0.005449f, -0.016887f, -0.017856f, -0.058709f, -0.000235f, 0.056632f, 0.017407f, 0.031265f, 0.018594f, -0.008211f, -0.075411f, -0.055725f, 0.014649f, 0.048120f, 0.015722f, 0.024027f, 0.098654f, 0.102030f, 0.086663f, -0.007505f, 0.042993f, -0.028145f, -0.073063f, + -0.122180f, 0.020984f, 0.014335f, -0.005568f, 0.016218f, -0.038587f, 0.007566f, -0.009505f, 0.043861f, -0.003483f, 0.035069f, -0.044169f, 0.020966f, -0.054208f, -0.011228f, 0.022710f, 0.003123f, -0.027659f, 0.005685f, -0.022802f, -0.025338f, -0.010591f, 0.005690f, 0.020543f, 0.025868f, 0.034968f, -0.009295f, -0.002021f, 0.008218f, -0.009746f, 0.010415f, -0.036492f, -0.031911f, -0.021710f, -0.029936f, -0.028136f, -0.030568f, 0.019150f, 0.013102f, -0.005081f, -0.020401f, -0.029798f, 0.017074f, 0.000172f, 0.027514f, -0.007115f, 0.024259f, 0.018457f, 0.000142f, 0.007860f, 0.029243f, -0.036372f, -0.035046f, 0.020663f, -0.004114f, -0.026905f, -0.057325f, 0.017195f, -0.034116f, 0.017705f, -0.014448f, -0.040238f, -0.012006f, 0.000475f, 0.020976f, -0.016565f, 0.011010f, -0.059382f, 0.056955f, -0.125278f, -0.011921f, -0.030723f, -0.025131f, 0.017676f, 0.072838f, 0.012388f, 0.026877f, -0.061278f, 0.014620f, 0.023702f, 0.050290f, -0.024978f, -0.039426f, -0.027030f, -0.012902f, -0.001058f, -0.000354f, 0.030835f, 0.022549f, -0.016829f, -0.090319f, -0.042372f, -0.073311f, 0.009469f, 0.131300f, -0.091488f, + -0.035854f, -0.013309f, 0.076199f, -0.024333f, 0.032649f, -0.023205f, 0.037119f, -0.013480f, -0.021281f, -0.045944f, 0.024943f, -0.053387f, 0.051034f, 0.091714f, 0.012439f, -0.015785f, -0.016195f, 0.076245f, 0.020757f, 0.000290f, 0.040584f, 0.014039f, 0.015177f, -0.013510f, 0.087831f, -0.135838f, 0.099862f, -0.082375f, 0.040367f, 0.098828f, -0.077704f, 0.159636f, 0.108880f, -0.039650f, -0.012784f, 0.110118f, 0.040623f, -0.009323f, 0.072638f, 0.065431f, -0.082975f, 0.113603f, -0.067305f, 0.021083f, 0.022358f, -0.029113f, 0.022503f, 0.037854f, -0.021956f, -0.040114f, 0.014166f, -0.021112f, 0.010341f, 0.010547f, -0.010528f, -0.031189f, 0.013667f, 0.012651f, -0.012419f, 0.014708f, 0.011729f, -0.024855f, 0.064553f, 0.008074f, 0.002126f, 0.002493f, -0.012114f, 0.010902f, 0.009394f, 0.004534f, -0.019969f, 0.011970f, 0.003732f, -0.007904f, -0.017410f, 0.040554f, -0.014095f, 0.033219f, 0.037352f, -0.002496f, -0.012730f, 0.010874f, 0.009798f, 0.015415f, 0.044857f, 0.039154f, -0.033212f, 0.017080f, -0.013012f, -0.000728f, 0.019817f, -0.003044f, 0.092673f, 0.088361f, -0.074892f, 0.073639f, + 0.067744f, -0.063105f, -0.095482f, -0.141154f, 0.033191f, 0.212701f, 0.087481f, 0.000689f, 0.044048f, -0.202746f, -0.083665f, -0.006887f, 0.031144f, 0.153080f, 0.149659f, 0.026122f, -0.057445f, -0.112181f, -0.065782f, 0.007956f, 0.048431f, 0.073372f, 0.117691f, 0.071303f, -0.094567f, -0.223515f, -0.182319f, -0.017575f, 0.203189f, 0.221265f, 0.139696f, 0.043010f, -0.046792f, -0.089802f, -0.136177f, -0.077328f, -0.082798f, 0.162901f, 0.135312f, 0.085832f, 0.075721f, -0.114545f, -0.160980f, -0.186483f, -0.167304f, 0.064893f, 0.226748f, 0.279557f, 0.094416f, -0.084132f, -0.198684f, -0.237913f, -0.064824f, 0.038823f, 0.024652f, 0.149617f, 0.058529f, -0.055873f, -0.033403f, -0.114326f, -0.025071f, -0.130766f, 0.056815f, 0.156091f, 0.291023f, -0.017180f, -0.155654f, -0.337554f, -0.013267f, -0.113788f, -0.012204f, 0.162569f, 0.032039f, -0.014341f, -0.072375f, -0.151747f, -0.099908f, 0.073687f, 0.117981f, 0.039410f, -0.020735f, -0.051311f, -0.062237f, 0.061108f, 0.069447f, 0.043574f, 0.037122f, 0.017253f, 0.034595f, -0.002751f, 0.003144f, -0.033194f, -0.015819f, 0.004482f, 0.087619f, 0.077419f, + -0.004153f, -0.032269f, -0.008734f, -0.077708f, -0.052849f, -0.001313f, 0.029715f, 0.081738f, 0.062234f, 0.045026f, 0.003808f, -0.108459f, -0.098604f, -0.065825f, 0.025524f, 0.106107f, 0.203890f, 0.125816f, -0.094446f, -0.168708f, -0.150045f, -0.059486f, 0.003937f, 0.140699f, 0.175622f, 0.132186f, 0.022748f, -0.103531f, -0.237651f, -0.148540f, 0.047919f, 0.148262f, 0.167815f, 0.050194f, -0.025070f, -0.064255f, -0.077785f, 0.001317f, -0.019485f, 0.095631f, 0.055908f, -0.008534f, 0.020272f, 0.010267f, -0.068254f, -0.007221f, -0.005620f, 0.007335f, 0.002052f, 0.005351f, -0.025003f, -0.010080f, -0.009268f, -0.006388f, -0.011410f, 0.040689f, -0.014724f, 0.017413f, -0.030776f, -0.003213f, 0.012619f, -0.001576f, -0.009390f, 0.070345f, 0.009697f, -0.040026f, -0.046416f, 0.009617f, 0.009695f, -0.027382f, 0.007510f, 0.035259f, 0.018337f, 0.033175f, -0.034146f, 0.010177f, -0.001251f, 0.007856f, -0.024047f, 0.004414f, 0.026592f, 0.037553f, 0.009507f, -0.009981f, 0.011019f, 0.004097f, -0.008822f, 0.025541f, -0.038022f, 0.008401f, -0.061907f, -0.019556f, 0.025519f, -0.021187f, -0.024904f, 0.033447f, + -0.021496f, -0.057953f, -0.044744f, 0.039393f, -0.004980f, -0.008063f, 0.009063f, 0.019845f, 0.050133f, -0.032937f, -0.042653f, 0.001582f, -0.005892f, 0.033737f, 0.000209f, 0.019622f, 0.009047f, -0.003611f, 0.052076f, -0.068149f, -0.009995f, -0.009850f, -0.039924f, 0.009944f, 0.022271f, 0.000713f, -0.023804f, 0.010264f, -0.005416f, 0.006493f, -0.020593f, 0.014790f, -0.001127f, 0.002163f, -0.001886f, -0.005329f, 0.026367f, -0.026876f, 0.001993f, -0.004851f, -0.009633f, -0.008814f, 0.003008f, -0.011825f, 0.012041f, 0.015234f, -0.016271f, -0.004440f, -0.006284f, 0.013916f, 0.015699f, -0.008310f, 0.019370f, 0.001554f, -0.002909f, -0.013490f, 0.013931f, 0.004481f, -0.005676f, -0.022085f, 0.010126f, -0.020084f, 0.012559f, -0.011045f, -0.009680f, 0.017559f, 0.017801f, -0.024932f, 0.002793f, -0.006185f, -0.024166f, 0.007316f, -0.014196f, 0.015256f, -0.013997f, -0.056045f, -0.061808f, -0.147023f, 0.042492f, 0.042031f, -0.003006f, -0.123945f, -0.080134f, -0.011801f, -0.020346f, 0.082800f, 0.055847f, 0.026855f, -0.054884f, -0.022661f, -0.014561f, 0.051841f, 0.005673f, -0.014793f, -0.032226f, 0.021249f, + 0.009419f, 0.025782f, -0.001441f, -0.010554f, -0.013208f, -0.029681f, -0.014842f, -0.017969f, 0.049509f, 0.026464f, 0.005802f, 0.007412f, -0.032654f, -0.001765f, 0.003933f, 0.045209f, -0.003302f, 0.021063f, -0.016842f, -0.011730f, 0.009181f, -0.018658f, 0.012284f, 0.005394f, 0.013214f, 0.044100f, -0.003898f, 0.038698f, -0.000548f, 0.024845f, -0.019269f, 0.001616f, -0.028318f, -0.036631f, -0.038557f, -0.032989f, 0.010826f, 0.005701f, 0.002802f, -0.048573f, 0.023956f, -0.042279f, -0.004805f, 0.002182f, -0.026508f, -0.028690f, -0.015176f, 0.000507f, -0.050506f, -0.034166f, 0.031327f, -0.015255f, 0.029164f, 0.004627f, -0.008129f, -0.027308f, -0.031544f, -0.002062f, 0.044686f, 0.055402f, -0.013837f, -0.005690f, -0.020874f, -0.027790f, -0.019204f, 0.017655f, 0.009360f, 0.006785f, 0.017308f, -0.003441f, -0.011518f, 0.012000f, 0.006592f, 0.009986f, 0.015139f, -0.008514f, 0.005084f, -0.001692f, 0.000323f, -0.011567f, 0.020013f, 0.006342f, 0.004542f, -0.006021f, 0.002875f, -0.000437f, 0.031214f, 0.003980f, 0.009344f, -0.017526f, 0.001155f, -0.011348f, 0.020422f, 0.001413f, 0.000294f, -0.007197f, + 0.004729f, -0.002352f, 0.000244f, 0.009789f, 0.000915f, 0.012830f, -0.008737f, 0.004170f, 0.001340f, -0.016440f, -0.000900f, 0.009405f, 0.003605f, -0.003382f, 0.033056f, -0.071065f, -0.176229f, -0.168918f, -0.025624f, 0.051103f, 0.169986f, 0.146897f, 0.138487f, 0.148750f, 0.082825f, 0.020043f, -0.075075f, -0.075441f, -0.156782f, -0.121760f, -0.106737f, -0.067715f, -0.085163f, 0.117327f, 0.096544f, 0.127051f, 0.073298f, 0.103845f, -0.003733f, 0.027355f, -0.016648f, -0.040506f, -0.023135f, -0.048432f, -0.056305f, -0.056124f, -0.055326f, -0.065541f, -0.047942f, -0.038970f, -0.004378f, 0.010324f, 0.092152f, 0.077304f, 0.040788f, 0.043779f, 0.060811f, 0.056394f, 0.027212f, 0.131122f, 0.017110f, 0.001714f, 0.024659f, -0.048983f, -0.150384f, -0.043045f, -0.120536f, -0.129346f, -0.136592f, -0.096674f, -0.086027f, 0.004295f, 0.071454f, 0.072821f, 0.089024f, 0.161812f, 0.116538f, 0.142000f, 0.139639f, 0.089037f, 0.095824f, 0.032684f, -0.033619f, -0.109338f, -0.143365f, -0.163908f, -0.106540f, -0.147109f, -0.123528f, -0.141251f, -0.082334f, -0.009859f, 0.038775f, 0.114272f, 0.109147f, 0.110710f, + 0.184471f, 0.128450f, 0.152503f, 0.094919f, 0.015875f, -0.017926f, -0.046092f, -0.076353f, -0.085392f, -0.090602f, -0.088168f, -0.101778f, -0.087115f, -0.063842f, -0.039114f, -0.020344f, -0.015271f, 0.044118f, 0.042027f, 0.059073f, 0.095613f, 0.107596f, 0.068348f, 0.082191f, 0.050797f, -0.003183f, -0.022289f, -0.049702f, -0.062001f, -0.053297f, -0.045900f, -0.055710f, -0.020282f, -0.013857f, 0.001296f, 0.015630f, 0.017513f, 0.004308f, 0.002426f, 0.015298f, -0.002211f, -0.013522f, 0.012356f, 0.007176f, 0.008817f, 0.013498f, 0.004067f, 0.003498f, 0.008306f, 0.018802f, 0.016252f, 0.007283f, 0.001587f, -0.004347f, -0.016176f, -0.012473f, -0.014722f, -0.013014f, -0.005137f, -0.010124f, -0.008673f, -0.005064f, -0.003862f, -0.005597f, -0.001544f, 0.005774f, 0.005904f, 0.007069f, 0.011723f, 0.007457f, 0.005274f, 0.006603f, 0.001728f, 0.001194f, 0.000630f, 0.000011f, 0.000049f, 0.000121f}, + {-0.008237f, 0.013810f, 0.004811f, -0.002529f, 0.003495f, 0.004431f, 0.008280f, 0.013830f, -0.006657f, 0.004585f, -0.005673f, -0.004416f, 0.002769f, 0.000018f, 0.001145f, -0.009788f, -0.004760f, 0.003432f, 0.006883f, -0.000934f, 0.005798f, -0.010495f, -0.009309f, 0.005838f, 0.003732f, 0.001594f, 0.004248f, -0.003594f, 0.007498f, 0.008390f, 0.008148f, 0.011687f, -0.006503f, -0.005380f, 0.000407f, 0.001471f, -0.011233f, -0.000725f, -0.000985f, 0.003066f, 0.001093f, -0.007037f, -0.001741f, 0.009542f, -0.005117f, 0.001857f, -0.005868f, 0.002791f, 0.002942f, 0.001896f, -0.008736f, 0.007027f, 0.000633f, 0.001571f, -0.001213f, -0.002886f, -0.003630f, -0.005969f, 0.012649f, -0.002248f, -0.002344f, -0.002856f, 0.005612f, 0.001295f, -0.011983f, 0.003025f, -0.005479f, -0.008233f, 0.004838f, -0.005096f, -0.012971f, 0.005154f, 0.001892f, 0.000551f, -0.011953f, -0.014501f, -0.005926f, -0.007156f, 0.006706f, -0.001964f, -0.000028f, -0.003293f, -0.003926f, -0.003276f, 0.000090f, 0.005916f, 0.001070f, -0.002664f, -0.000225f, -0.002783f, -0.001238f, 0.002615f, 0.000791f, -0.002523f, -0.003401f, -0.001191f, + -0.001400f, 0.001288f, -0.000859f, 0.000475f, 0.000471f, 0.001406f, 0.000362f, 0.002022f, -0.000859f, 0.000465f, -0.000475f, 0.001420f, -0.000092f, 0.001302f, 0.008097f, 0.000964f, 0.000699f, 0.007204f, -0.010750f, 0.001801f, -0.008970f, -0.011356f, 0.003279f, 0.010655f, -0.006585f, 0.005059f, -0.004955f, -0.002394f, 0.002151f, 0.000537f, -0.005269f, -0.015659f, -0.015548f, 0.000281f, -0.003933f, -0.000140f, 0.008141f, 0.001306f, 0.009966f, 0.013461f, -0.007088f, 0.011625f, 0.001459f, 0.011800f, 0.000752f, 0.014002f, 0.001790f, -0.007832f, -0.002147f, 0.000790f, 0.006385f, -0.001724f, -0.002097f, 0.001392f, 0.004847f, -0.005817f, -0.000346f, -0.001794f, 0.004289f, 0.005219f, 0.000296f, -0.005300f, -0.000368f, -0.000958f, 0.003071f, 0.005481f, 0.009824f, -0.003422f, 0.006378f, -0.002868f, -0.008533f, -0.007623f, -0.005148f, 0.004836f, 0.005253f, -0.002882f, 0.008500f, 0.000283f, 0.003093f, 0.000446f, 0.010334f, 0.006850f, 0.007618f, 0.003095f, 0.004491f, 0.002771f, 0.004168f, 0.008441f, -0.001779f, -0.000431f, 0.011927f, 0.002397f, 0.000356f, 0.002484f, -0.004419f, 0.000667f, + 0.003528f, -0.000264f, -0.011124f, 0.003496f, 0.001197f, -0.001783f, -0.003853f, 0.002579f, 0.000774f, 0.006070f, -0.002227f, -0.001099f, -0.002309f, -0.001883f, 0.001546f, 0.000444f, 0.002444f, 0.001153f, 0.000575f, -0.002188f, -0.001726f, -0.001022f, -0.001067f, 0.000958f, -0.002883f, 0.002554f, -0.001029f, 0.000757f, -0.000689f, -0.001031f, -0.001596f, 0.000986f, -0.001285f, -0.000976f, -0.003141f, 0.011966f, -0.012386f, -0.008375f, -0.006892f, -0.010046f, 0.003072f, 0.004212f, -0.008092f, 0.001776f, 0.016381f, -0.012074f, 0.008269f, 0.014110f, 0.013960f, -0.008743f, -0.002446f, 0.006871f, 0.001259f, 0.002072f, -0.006375f, 0.003371f, -0.021432f, 0.016687f, 0.026208f, 0.004568f, 0.008783f, -0.004356f, -0.000424f, 0.013871f, -0.007401f, -0.016941f, -0.002868f, 0.000167f, -0.000112f, -0.013702f, 0.000949f, 0.003303f, -0.016243f, -0.007689f, 0.007454f, 0.002464f, -0.005813f, -0.001583f, 0.005555f, -0.007978f, 0.016706f, 0.005145f, 0.000724f, -0.010841f, -0.001112f, 0.005697f, -0.003700f, 0.000273f, -0.003888f, -0.000301f, -0.001648f, -0.008703f, 0.000494f, -0.008420f, 0.012534f, -0.012236f, + -0.008131f, -0.002808f, -0.014593f, 0.009668f, -0.007870f, -0.020341f, -0.003765f, -0.008822f, 0.002435f, 0.009226f, -0.009503f, 0.001092f, -0.006465f, 0.006527f, 0.000877f, -0.006778f, 0.005704f, -0.007337f, -0.009625f, 0.010594f, -0.006935f, 0.002966f, 0.000223f, 0.000887f, 0.003696f, -0.002191f, -0.003296f, -0.003724f, -0.005875f, 0.001876f, -0.008287f, 0.000390f, -0.001705f, 0.002514f, -0.002489f, -0.000283f, -0.000022f, 0.000141f, -0.004414f, 0.003845f, 0.000157f, 0.000661f, -0.002393f, -0.001739f, -0.001801f, -0.000202f, 0.002605f, -0.009446f, 0.006033f, -0.000273f, -0.001850f, 0.007161f, -0.006776f, -0.023807f, -0.004649f, -0.001461f, 0.010408f, 0.014742f, 0.013058f, 0.006284f, -0.005124f, -0.001600f, -0.014681f, -0.012442f, 0.004299f, 0.016751f, -0.004793f, 0.017160f, 0.010915f, -0.010579f, 0.005692f, -0.001621f, 0.005952f, -0.011824f, -0.007980f, 0.001959f, 0.008546f, -0.001073f, 0.005095f, 0.007127f, -0.013377f, -0.002676f, -0.006172f, -0.018207f, 0.011328f, 0.001816f, 0.004114f, 0.007909f, 0.014447f, 0.005051f, 0.000678f, 0.011347f, -0.002650f, -0.005782f, 0.011654f, -0.006122f, + 0.019696f, 0.009094f, 0.007831f, 0.000429f, -0.005668f, -0.006872f, 0.009653f, 0.013143f, -0.009756f, 0.002393f, 0.012526f, -0.002203f, 0.004070f, 0.027704f, -0.008377f, -0.003310f, 0.005375f, -0.013853f, -0.000568f, 0.002510f, -0.006195f, 0.006769f, -0.004490f, 0.004185f, 0.013732f, 0.000510f, -0.003173f, -0.009326f, -0.000780f, -0.011589f, 0.004904f, -0.004282f, -0.005722f, -0.002351f, 0.002195f, -0.003311f, -0.003362f, -0.002786f, 0.000619f, 0.004313f, 0.003155f, 0.000905f, -0.001004f, -0.001263f, -0.000999f, -0.000609f, -0.001944f, -0.003386f, -0.000679f, -0.001025f, 0.001792f, 0.000045f, 0.000893f, -0.003423f, 0.001449f, 0.001865f, -0.001313f, -0.002993f, -0.001146f, -0.003140f, -0.001699f, -0.001376f, 0.002328f, 0.000298f, -0.000524f, -0.000200f, 0.000528f, -0.004745f, -0.000942f, 0.001715f, -0.005947f, -0.033968f, -0.002641f, -0.000599f, -0.006695f, -0.010452f, -0.003337f, 0.018413f, -0.012839f, -0.019281f, 0.007415f, -0.007762f, 0.002904f, 0.003571f, 0.012406f, -0.008260f, -0.002394f, 0.002530f, 0.011546f, -0.005227f, -0.007360f, -0.002131f, -0.006313f, 0.008525f, 0.015544f, 0.007867f, + 0.000275f, -0.001162f, -0.008691f, -0.000418f, 0.024379f, 0.004377f, -0.002872f, 0.028122f, -0.001536f, 0.020943f, -0.006154f, 0.000278f, 0.014280f, 0.004403f, 0.003658f, 0.005156f, 0.002624f, 0.007888f, 0.004676f, -0.013194f, 0.024877f, 0.015140f, 0.020455f, 0.013727f, 0.009114f, -0.013426f, 0.006134f, 0.007001f, 0.001193f, -0.008191f, 0.023112f, 0.014008f, 0.020896f, 0.003803f, -0.003982f, -0.005003f, 0.015431f, -0.007338f, -0.015615f, 0.018664f, 0.005964f, -0.010083f, -0.005752f, 0.001032f, -0.004609f, 0.001927f, -0.001997f, 0.002731f, -0.006278f, -0.001652f, -0.014764f, 0.005843f, -0.001675f, -0.000274f, 0.005651f, -0.001722f, -0.002629f, 0.008896f, -0.000415f, 0.006938f, 0.009308f, 0.007610f, 0.004996f, 0.004918f, 0.002100f, 0.002924f, 0.000215f, -0.001777f, -0.001570f, 0.004130f, -0.000954f, -0.002335f, -0.002385f, 0.002029f, -0.002712f, -0.000625f, -0.000395f, 0.005123f, 0.002265f, 0.003708f, -0.003175f, 0.001191f, -0.002509f, -0.000815f, 0.003636f, -0.000334f, -0.001220f, -0.000975f, -0.000722f, -0.008545f, -0.001136f, -0.022247f, -0.008718f, -0.024892f, -0.017016f, 0.001943f, + -0.016123f, -0.012671f, 0.001625f, -0.002748f, 0.016852f, -0.011033f, 0.018665f, 0.022859f, 0.002461f, -0.019241f, -0.013466f, 0.020541f, -0.010250f, -0.005497f, 0.011597f, -0.014875f, -0.026451f, 0.010748f, 0.023073f, -0.011708f, 0.005995f, -0.000334f, 0.010141f, -0.027636f, 0.005667f, -0.011048f, 0.006840f, 0.000652f, -0.011493f, 0.019427f, 0.008980f, 0.008258f, 0.025890f, 0.012094f, 0.005465f, 0.014681f, 0.003068f, 0.004816f, 0.007497f, 0.002547f, 0.001320f, 0.004073f, 0.003663f, 0.029414f, 0.016637f, 0.000023f, 0.024749f, 0.015499f, 0.018308f, 0.028483f, -0.014369f, -0.012037f, 0.025020f, -0.008587f, -0.000812f, -0.014688f, -0.006106f, 0.008929f, 0.013344f, -0.011175f, -0.001179f, 0.003827f, -0.003037f, 0.006930f, -0.011767f, -0.002163f, -0.013633f, 0.026853f, -0.008507f, 0.014695f, -0.004009f, -0.007087f, 0.019845f, 0.003518f, -0.005617f, 0.006467f, -0.002284f, 0.000622f, -0.005419f, 0.007509f, -0.001248f, 0.002739f, 0.008134f, 0.004631f, 0.002543f, 0.004550f, 0.000510f, -0.000666f, 0.003363f, 0.000862f, -0.005292f, 0.001222f, -0.000978f, -0.002505f, 0.005111f, 0.000038f, + 0.002586f, 0.002064f, -0.000938f, 0.000982f, -0.003029f, 0.000702f, -0.002750f, 0.000281f, -0.001016f, 0.003605f, 0.001135f, 0.003100f, 0.001014f, 0.008482f, -0.009049f, 0.002923f, 0.001316f, 0.002897f, -0.012997f, 0.016917f, 0.009831f, 0.022982f, 0.004466f, -0.003108f, -0.025918f, -0.013861f, -0.009703f, 0.006625f, -0.013453f, -0.022453f, -0.006233f, 0.005757f, 0.002523f, -0.025075f, 0.020379f, 0.001567f, -0.001497f, -0.021360f, -0.012259f, 0.005039f, 0.002665f, -0.023732f, -0.007348f, 0.008673f, 0.000996f, 0.002393f, 0.012201f, 0.014209f, 0.008341f, -0.003676f, 0.007205f, 0.002214f, -0.008471f, -0.017569f, 0.030311f, -0.007602f, -0.014693f, 0.000285f, 0.007558f, 0.009777f, 0.022681f, 0.003714f, -0.000357f, -0.008512f, -0.000197f, 0.012542f, -0.001528f, 0.015672f, 0.030110f, 0.002516f, -0.006454f, 0.000901f, 0.025936f, 0.032346f, -0.016060f, 0.004504f, 0.004587f, 0.017482f, 0.009317f, 0.003072f, 0.005454f, -0.012898f, 0.008103f, 0.008329f, 0.008410f, -0.005584f, 0.000556f, 0.006337f, 0.009717f, -0.001377f, 0.003394f, 0.002209f, -0.010859f, 0.005260f, 0.000606f, -0.009889f, + -0.007082f, 0.010445f, -0.004608f, 0.007219f, -0.010407f, -0.008047f, -0.003485f, 0.002359f, -0.000063f, 0.009417f, 0.004416f, 0.001665f, 0.000568f, 0.004693f, 0.004466f, 0.001341f, -0.007864f, 0.000316f, -0.003237f, 0.001244f, -0.002408f, -0.001980f, 0.000020f, -0.000839f, -0.001014f, -0.002754f, -0.007691f, -0.002212f, 0.000976f, -0.005309f, -0.003226f, -0.003383f, 0.000274f, -0.003389f, -0.005374f, -0.001338f, 0.002752f, 0.004200f, -0.008360f, 0.011979f, -0.010548f, -0.019194f, 0.013417f, -0.001492f, -0.004617f, 0.005149f, 0.011433f, -0.032251f, 0.002064f, 0.024856f, -0.002801f, 0.044656f, 0.021381f, -0.013533f, -0.009915f, -0.004098f, -0.012800f, -0.005639f, 0.019979f, -0.007576f, -0.006451f, 0.020028f, 0.016266f, 0.005430f, 0.009360f, 0.018727f, 0.012413f, 0.014037f, -0.010148f, -0.006904f, 0.017774f, -0.003388f, 0.016096f, 0.000194f, -0.019062f, -0.012211f, 0.005253f, 0.015218f, -0.020741f, 0.001395f, -0.011041f, 0.005925f, -0.012629f, 0.017786f, 0.017711f, -0.017122f, -0.001763f, 0.005133f, -0.000488f, -0.023186f, -0.010372f, 0.004099f, 0.015513f, 0.025519f, 0.008709f, -0.018720f, + -0.004085f, -0.004472f, -0.002141f, 0.016095f, 0.002608f, 0.012921f, -0.019189f, 0.008760f, 0.001381f, -0.015153f, 0.018150f, 0.007802f, -0.002377f, -0.003935f, 0.003188f, -0.000561f, -0.015511f, 0.011855f, -0.003541f, 0.007119f, -0.012042f, -0.021281f, -0.011808f, 0.005189f, 0.009612f, 0.000356f, 0.005334f, 0.019343f, 0.000257f, -0.004784f, 0.012141f, -0.003611f, 0.011431f, 0.000804f, 0.003750f, -0.009627f, 0.001054f, 0.000393f, 0.005273f, 0.005876f, 0.008115f, 0.005262f, -0.001931f, -0.002218f, -0.003697f, 0.009701f, -0.004423f, 0.005124f, 0.001094f, 0.003150f, 0.003971f, 0.005501f, 0.002410f, -0.001685f, 0.004871f, 0.002047f, 0.001664f, -0.001699f, 0.006535f, 0.003226f, 0.001409f, -0.006286f, 0.002393f, -0.002378f, -0.000021f, 0.004576f, 0.020725f, -0.025328f, -0.003946f, -0.008023f, 0.026172f, -0.011549f, 0.021582f, -0.006602f, 0.020154f, 0.027294f, -0.011956f, 0.008681f, -0.006819f, 0.015593f, -0.005788f, 0.013001f, 0.010807f, 0.010196f, -0.002211f, 0.010719f, -0.005257f, -0.013384f, -0.006381f, 0.015169f, -0.017525f, 0.002895f, 0.000036f, 0.013526f, 0.027270f, -0.024756f, + 0.000975f, 0.024460f, -0.000496f, 0.022373f, 0.003140f, 0.009892f, -0.002973f, -0.001780f, 0.006108f, -0.034237f, 0.003481f, -0.000715f, -0.013568f, 0.009197f, 0.005721f, 0.025036f, 0.012499f, -0.002367f, 0.047433f, 0.011905f, -0.024856f, 0.006709f, 0.002484f, 0.016642f, -0.010663f, 0.003283f, 0.014054f, 0.001210f, 0.008592f, -0.002379f, -0.027167f, -0.027801f, 0.000134f, -0.009328f, 0.022499f, -0.037822f, 0.048840f, -0.000182f, 0.027222f, 0.031159f, 0.007536f, -0.008124f, -0.006138f, -0.014485f, -0.019263f, -0.001553f, 0.006294f, -0.004801f, 0.009819f, -0.006425f, -0.015506f, -0.009730f, -0.007814f, 0.002900f, -0.002386f, 0.001813f, 0.010486f, 0.005347f, 0.004992f, 0.003922f, -0.004325f, -0.005270f, 0.000342f, -0.001044f, 0.003022f, 0.000806f, 0.001233f, 0.003382f, 0.006084f, 0.003706f, -0.012065f, 0.002295f, -0.002268f, 0.008884f, 0.008882f, 0.005219f, -0.000809f, -0.002487f, 0.003488f, 0.002858f, -0.004270f, -0.004423f, -0.001115f, -0.002999f, 0.000847f, -0.003211f, -0.005855f, 0.002412f, 0.009768f, -0.002442f, 0.003932f, -0.007419f, 0.000962f, 0.004393f, 0.004474f, -0.000149f, + 0.002867f, 0.006370f, -0.045202f, -0.003287f, 0.015256f, 0.002435f, -0.017041f, -0.041984f, -0.000120f, 0.004692f, -0.007450f, -0.001846f, -0.012440f, 0.006400f, -0.010375f, 0.021484f, 0.007507f, -0.012949f, -0.016184f, -0.027627f, 0.020510f, -0.008874f, 0.001302f, 0.026753f, 0.036804f, 0.022417f, -0.003537f, 0.001848f, -0.025422f, -0.010908f, -0.010288f, 0.006718f, -0.036024f, 0.009307f, 0.009704f, 0.001980f, -0.018573f, 0.017657f, 0.027470f, -0.004517f, -0.000590f, 0.003147f, -0.016111f, -0.016987f, 0.009631f, 0.006602f, 0.020752f, -0.022995f, 0.024782f, -0.013169f, 0.013611f, -0.021290f, -0.016868f, -0.008453f, -0.000653f, -0.002569f, 0.008976f, -0.004631f, -0.037231f, -0.027889f, -0.007946f, 0.000942f, -0.037332f, 0.000474f, 0.018297f, -0.009894f, -0.004415f, 0.005602f, 0.015540f, -0.032787f, 0.016620f, -0.005796f, -0.005043f, -0.000192f, 0.013262f, 0.016684f, -0.019795f, -0.010070f, -0.013351f, -0.006449f, -0.004904f, 0.009696f, 0.003098f, -0.011890f, -0.005458f, -0.009121f, 0.006183f, 0.021754f, 0.014211f, -0.000128f, -0.000769f, -0.012166f, 0.000320f, -0.007435f, 0.010103f, -0.001869f, + 0.017727f, 0.005965f, 0.006088f, -0.006420f, 0.000223f, 0.000213f, -0.014452f, 0.015266f, 0.000984f, -0.002688f, 0.007797f, -0.002811f, -0.002580f, -0.000716f, 0.001006f, -0.012386f, 0.005282f, 0.007567f, 0.007831f, -0.001275f, -0.003109f, 0.002736f, 0.004345f, -0.004418f, -0.002819f, 0.004418f, -0.009624f, 0.001064f, -0.000429f, 0.008882f, -0.000880f, 0.040510f, 0.000989f, -0.008213f, 0.031508f, -0.006877f, -0.012806f, -0.003381f, -0.002891f, 0.039080f, 0.044689f, -0.005805f, 0.009514f, 0.011401f, -0.005699f, -0.021202f, 0.010454f, 0.041562f, 0.031698f, 0.027115f, -0.009831f, 0.011763f, 0.022318f, -0.028937f, -0.021560f, 0.025315f, -0.012900f, -0.014148f, -0.000968f, 0.031645f, -0.004756f, 0.029134f, 0.001918f, 0.026148f, -0.015632f, 0.035920f, 0.010925f, -0.011102f, -0.018304f, 0.006588f, -0.025899f, 0.003147f, -0.030733f, -0.010448f, -0.011022f, 0.017635f, -0.017596f, 0.029032f, -0.035489f, -0.061363f, 0.038374f, 0.017217f, -0.007544f, 0.000368f, 0.042325f, 0.019921f, 0.003363f, -0.011061f, 0.009143f, -0.004879f, 0.000507f, -0.027454f, -0.027905f, 0.016474f, -0.009371f, 0.009127f, + 0.052544f, -0.013694f, 0.011299f, -0.034252f, 0.040598f, -0.013535f, -0.018144f, -0.008632f, -0.005684f, 0.017014f, -0.034422f, 0.028834f, -0.033740f, 0.024386f, -0.017378f, -0.023458f, 0.023457f, -0.000953f, 0.007676f, -0.009471f, 0.013866f, -0.007553f, -0.010633f, -0.004681f, -0.016111f, 0.011150f, -0.000548f, -0.010412f, -0.004478f, 0.003980f, 0.017138f, 0.003320f, 0.002421f, 0.004650f, -0.000463f, -0.002860f, 0.008680f, -0.004833f, 0.003902f, 0.003706f, -0.004499f, -0.001191f, -0.001040f, 0.012396f, 0.010727f, -0.003894f, -0.006014f, -0.012821f, -0.000298f, -0.002562f, -0.001913f, -0.002031f, 0.000320f, 0.011886f, 0.003483f, -0.001353f, 0.014841f, -0.046053f, -0.034233f, -0.033193f, 0.046334f, 0.001549f, 0.019886f, 0.011845f, -0.040822f, -0.035696f, 0.023994f, -0.063684f, 0.018605f, 0.018904f, -0.004094f, -0.025345f, -0.023304f, 0.039663f, -0.021337f, -0.002813f, -0.006674f, -0.020573f, 0.030173f, 0.009598f, 0.027299f, 0.015866f, 0.018835f, -0.005984f, 0.030652f, -0.002834f, -0.020046f, -0.023619f, -0.005434f, 0.013289f, -0.017895f, 0.023788f, 0.015283f, -0.017958f, -0.064467f, -0.005430f, + -0.005295f, -0.001611f, 0.046845f, 0.001047f, -0.036691f, -0.021786f, -0.022435f, 0.019220f, -0.014140f, -0.030573f, -0.034099f, -0.021232f, -0.016579f, -0.076034f, 0.001827f, 0.009465f, 0.024979f, -0.039726f, 0.013007f, -0.032828f, -0.026837f, -0.009209f, 0.031787f, 0.008109f, 0.029505f, 0.055682f, 0.016772f, 0.012763f, 0.036338f, -0.028342f, -0.003605f, -0.013473f, -0.015527f, 0.029083f, 0.026930f, 0.042733f, 0.021028f, -0.039177f, -0.026065f, 0.030724f, -0.046237f, -0.050978f, -0.016003f, 0.037099f, 0.005905f, -0.009106f, 0.025337f, 0.020631f, -0.000196f, 0.005865f, 0.021488f, -0.014080f, 0.012721f, -0.010386f, -0.001959f, -0.010822f, -0.001985f, 0.002797f, 0.015060f, -0.009580f, -0.012053f, -0.000064f, 0.008509f, 0.002680f, 0.007740f, -0.001238f, -0.012048f, -0.002925f, -0.007972f, 0.000591f, -0.006657f, -0.001351f, -0.000921f, -0.013622f, 0.011042f, 0.001645f, 0.011239f, 0.014057f, 0.019508f, -0.007354f, -0.010342f, -0.000866f, 0.001906f, 0.022440f, -0.019692f, -0.041740f, 0.012151f, -0.000067f, -0.000287f, 0.002094f, 0.006421f, 0.009508f, 0.019069f, 0.006564f, 0.016130f, 0.009129f, + 0.019013f, 0.048460f, 0.002091f, -0.061953f, -0.022396f, 0.016340f, 0.001097f, -0.012488f, -0.039675f, -0.025947f, 0.008923f, 0.033045f, 0.013081f, -0.030628f, 0.017115f, 0.013691f, -0.034733f, -0.006167f, -0.043064f, 0.034636f, -0.017686f, -0.022235f, 0.031991f, -0.030100f, 0.008974f, 0.066207f, -0.007286f, 0.011153f, 0.019833f, 0.000324f, 0.009997f, -0.038104f, 0.009790f, 0.007238f, 0.006649f, 0.086819f, 0.058900f, -0.006025f, -0.029735f, -0.019525f, 0.027548f, 0.031916f, -0.034231f, -0.018886f, -0.046077f, 0.074150f, 0.020714f, 0.008946f, -0.011500f, -0.007640f, -0.016073f, -0.008709f, 0.053402f, -0.013795f, 0.014710f, 0.053363f, 0.009254f, -0.014554f, -0.038975f, 0.001404f, 0.016064f, -0.078665f, 0.017520f, 0.009033f, 0.054370f, 0.037309f, 0.029123f, 0.048642f, 0.027582f, -0.009176f, 0.005046f, 0.017215f, -0.005181f, 0.002745f, -0.003154f, 0.008054f, 0.004515f, 0.045478f, -0.001058f, 0.018912f, -0.007712f, 0.018284f, -0.001277f, 0.024278f, 0.005278f, 0.007063f, 0.021949f, -0.001363f, 0.009217f, 0.015067f, 0.000570f, 0.012264f, 0.016907f, 0.007788f, 0.013509f, 0.019900f, + 0.011359f, -0.006847f, -0.001255f, 0.004729f, 0.004933f, 0.000608f, -0.007666f, 0.004319f, 0.005245f, 0.002755f, 0.010495f, -0.000999f, 0.016382f, 0.009278f, -0.006528f, 0.017362f, -0.002186f, -0.010997f, -0.050519f, -0.007229f, 0.034851f, 0.019542f, -0.056594f, -0.074630f, 0.008617f, 0.050674f, 0.020523f, 0.030971f, -0.017564f, 0.023921f, 0.004049f, 0.000642f, -0.027051f, -0.009689f, -0.042146f, 0.062665f, 0.021049f, -0.050873f, -0.034855f, 0.022774f, 0.002472f, 0.012551f, -0.015172f, 0.031254f, 0.018320f, 0.021511f, 0.041080f, 0.036324f, 0.007555f, 0.035511f, -0.018626f, 0.020379f, -0.000023f, 0.024771f, 0.011468f, -0.005977f, -0.014857f, 0.017084f, -0.022100f, 0.058428f, -0.015610f, -0.011091f, 0.012092f, 0.028859f, 0.028684f, -0.019403f, 0.050471f, 0.049851f, 0.029143f, 0.012017f, 0.004314f, -0.016119f, -0.037791f, -0.064961f, -0.010403f, 0.022995f, -0.001251f, 0.028152f, 0.030936f, 0.032901f, 0.011657f, 0.018281f, 0.107926f, -0.053098f, -0.022965f, 0.010548f, 0.021006f, -0.002869f, -0.083934f, 0.019587f, -0.012881f, 0.012443f, 0.015128f, 0.037101f, 0.007697f, 0.000440f, + -0.033593f, 0.034879f, -0.012323f, 0.004842f, 0.030985f, 0.013727f, -0.032530f, -0.007340f, -0.018156f, -0.006552f, -0.013867f, 0.002027f, 0.001590f, 0.012919f, -0.002859f, 0.015811f, 0.016140f, 0.020586f, 0.000116f, -0.000531f, -0.012373f, -0.006086f, -0.016669f, -0.011869f, -0.004720f, 0.021843f, 0.007484f, -0.003936f, 0.001876f, -0.009173f, 0.003595f, 0.019057f, 0.022303f, -0.004861f, -0.019841f, -0.000888f, 0.001641f, 0.008934f, -0.005176f, 0.005990f, -0.009189f, 0.014261f, -0.027890f, 0.002265f, -0.008253f, -0.010633f, 0.000446f, 0.004960f, -0.017797f, 0.008132f, -0.003005f, 0.008018f, -0.009447f, -0.016614f, 0.006359f, 0.028234f, 0.027792f, -0.015285f, -0.020802f, 0.006220f, -0.019988f, -0.064090f, 0.066313f, -0.019313f, 0.018664f, 0.006174f, 0.055625f, 0.044362f, 0.027889f, -0.026481f, -0.004355f, 0.038067f, 0.020208f, 0.044798f, 0.119329f, -0.007346f, -0.047000f, -0.012217f, 0.035692f, -0.005284f, -0.055519f, 0.084910f, 0.044000f, -0.029880f, -0.046480f, -0.005691f, 0.010448f, -0.014734f, 0.033728f, 0.028688f, 0.033094f, 0.063402f, 0.010627f, 0.017945f, 0.011342f, -0.024496f, + -0.058962f, 0.034720f, -0.040118f, -0.030102f, 0.046565f, 0.024447f, 0.026271f, 0.013826f, 0.009602f, -0.002620f, -0.058226f, -0.051649f, 0.000975f, 0.030970f, -0.038491f, 0.036520f, -0.017071f, -0.043134f, 0.013628f, 0.037942f, -0.006996f, 0.007346f, 0.037639f, 0.037137f, 0.038509f, 0.002890f, -0.023492f, 0.021999f, 0.091491f, 0.011086f, 0.037208f, 0.052317f, 0.002559f, -0.016517f, -0.045974f, -0.018539f, -0.072455f, -0.024795f, -0.018135f, -0.008887f, 0.016471f, 0.002868f, -0.003293f, -0.020774f, -0.013721f, -0.012044f, 0.017901f, -0.018582f, -0.003725f, -0.016388f, 0.005355f, -0.010391f, -0.017853f, 0.000760f, -0.025696f, -0.009009f, 0.000438f, -0.023159f, -0.004390f, -0.020172f, -0.011680f, 0.002283f, -0.037106f, -0.003546f, 0.001740f, -0.000370f, 0.017531f, -0.023575f, -0.007782f, 0.025368f, 0.000493f, -0.009936f, -0.001100f, -0.008484f, 0.004877f, -0.010844f, -0.008230f, 0.012644f, -0.000870f, 0.000892f, 0.033841f, 0.027897f, 0.000988f, -0.021832f, -0.032375f, -0.057420f, 0.010593f, 0.035741f, 0.048782f, -0.040946f, -0.043676f, 0.054213f, 0.024508f, -0.001835f, -0.005182f, -0.022086f, + 0.010557f, -0.010147f, -0.023069f, 0.025009f, 0.030429f, 0.021140f, 0.002284f, -0.004118f, -0.016593f, 0.003898f, 0.012938f, 0.007936f, -0.018784f, -0.067062f, 0.015292f, -0.015046f, -0.019941f, 0.004009f, -0.008444f, 0.005909f, -0.066840f, 0.031548f, 0.024789f, -0.048053f, 0.034074f, 0.045162f, 0.037833f, -0.009820f, 0.006559f, -0.005745f, 0.024759f, -0.005277f, 0.000120f, 0.120212f, -0.035764f, 0.010238f, -0.031903f, -0.018404f, 0.067995f, 0.025049f, 0.023390f, 0.043599f, -0.054907f, -0.045400f, 0.068365f, -0.042850f, 0.035016f, 0.043271f, 0.004365f, 0.011742f, 0.016616f, 0.077535f, -0.026013f, -0.029242f, -0.070663f, -0.014922f, -0.030293f, 0.024290f, -0.044131f, 0.075367f, 0.041108f, 0.046144f, 0.022834f, 0.040367f, 0.021265f, 0.071960f, 0.017880f, 0.034772f, 0.026564f, -0.034948f, -0.016638f, -0.013342f, 0.006494f, 0.004372f, 0.035342f, 0.015606f, 0.000197f, -0.001354f, 0.008235f, 0.003567f, -0.013436f, -0.026554f, -0.014115f, -0.019861f, 0.025574f, -0.008626f, -0.014244f, 0.008490f, -0.005392f, 0.031608f, 0.014674f, -0.005261f, 0.017777f, -0.019833f, 0.009877f, 0.016072f, + -0.005493f, 0.030629f, 0.031162f, 0.021009f, -0.014322f, 0.025915f, 0.014925f, -0.024926f, -0.004661f, 0.002945f, -0.015071f, 0.002040f, 0.022311f, -0.025080f, -0.029158f, 0.013267f, 0.006021f, -0.002499f, -0.019278f, 0.049657f, -0.028699f, 0.026278f, 0.084362f, 0.041921f, 0.031952f, -0.047075f, 0.013335f, 0.047016f, -0.040065f, 0.066541f, 0.023891f, 0.035630f, 0.031900f, -0.020387f, 0.033044f, 0.028472f, 0.012026f, 0.065972f, 0.050023f, -0.003724f, -0.112706f, -0.013157f, 0.052468f, 0.050620f, 0.052031f, 0.012526f, 0.029079f, 0.002640f, 0.014682f, -0.003661f, -0.034842f, 0.072301f, -0.001797f, 0.068896f, 0.031086f, 0.049745f, -0.069373f, 0.047221f, 0.023581f, 0.021307f, -0.018115f, 0.016476f, -0.012847f, 0.015735f, 0.069253f, 0.027690f, 0.090331f, 0.004587f, 0.020054f, 0.052864f, -0.010552f, 0.083022f, 0.040947f, 0.007417f, -0.054793f, -0.034156f, 0.030318f, 0.003647f, -0.009061f, 0.001997f, -0.009280f, 0.006698f, -0.039911f, 0.026935f, -0.042507f, -0.063217f, -0.023666f, -0.003338f, -0.021121f, -0.016130f, 0.053799f, -0.006195f, 0.048998f, -0.046377f, 0.053831f, 0.007449f, + -0.059484f, 0.059167f, 0.049256f, -0.018206f, -0.008280f, 0.014308f, 0.025877f, 0.016839f, -0.002469f, -0.026787f, 0.017055f, -0.011428f, -0.001718f, 0.034243f, -0.006949f, -0.005337f, -0.027505f, -0.007103f, 0.007603f, 0.005567f, -0.001854f, 0.025814f, 0.022635f, -0.017622f, 0.006116f, -0.000172f, 0.000937f, 0.023767f, 0.007180f, -0.025376f, 0.017247f, -0.021670f, 0.011109f, -0.017481f, -0.007126f, -0.005373f, -0.004033f, 0.003256f, 0.004907f, 0.003375f, 0.001326f, -0.004840f, 0.004279f, -0.012079f, 0.008491f, 0.010020f, -0.002136f, -0.009867f, 0.007463f, -0.002059f, 0.012687f, -0.006936f, -0.006172f, -0.017541f, -0.000842f, -0.015556f, -0.050301f, -0.048089f, -0.019352f, -0.020830f, 0.038936f, -0.062965f, -0.078459f, -0.085306f, -0.103034f, 0.046034f, 0.050543f, -0.002943f, -0.008310f, -0.000322f, -0.024530f, 0.005970f, 0.012780f, -0.021724f, 0.070114f, 0.066067f, 0.043144f, 0.047262f, -0.043553f, 0.028920f, 0.002352f, 0.034440f, -0.013612f, -0.017746f, -0.064381f, 0.057563f, -0.058182f, -0.070429f, -0.018550f, -0.014796f, 0.075534f, -0.041533f, 0.010112f, -0.039205f, -0.011014f, 0.072870f, + 0.013467f, 0.023054f, 0.036031f, 0.066923f, 0.004068f, -0.007495f, -0.081810f, -0.015091f, -0.006605f, -0.002324f, 0.044747f, 0.024082f, 0.152204f, 0.007625f, -0.004755f, -0.050499f, -0.004108f, 0.060526f, 0.055472f, -0.005002f, -0.026807f, -0.075224f, 0.018751f, 0.047623f, -0.024436f, -0.054859f, -0.023282f, 0.046936f, -0.014367f, 0.034453f, -0.109024f, -0.060993f, -0.087155f, -0.023584f, 0.034981f, 0.018579f, -0.037968f, -0.036243f, -0.042662f, 0.017115f, 0.089797f, 0.027175f, -0.000385f, -0.031866f, -0.002577f, -0.024825f, -0.006776f, 0.010614f, 0.010623f, -0.028585f, -0.012904f, -0.002569f, 0.019496f, -0.048581f, -0.033031f, -0.011361f, 0.023895f, -0.003342f, 0.031436f, 0.010033f, 0.003736f, -0.010996f, -0.005389f, -0.021887f, -0.004595f, -0.032972f, -0.007291f, 0.036163f, 0.013050f, 0.016450f, -0.025212f, -0.045591f, 0.022620f, 0.021365f, -0.013135f, -0.000055f, -0.018724f, -0.003547f, 0.005778f, -0.002511f, 0.017144f, 0.010548f, 0.011253f, 0.021628f, 0.012131f, 0.017069f, 0.018597f, -0.003731f, 0.014963f, 0.007910f, -0.012468f, -0.030453f, -0.015801f, 0.074057f, 0.002429f, 0.000432f, + 0.131094f, 0.012980f, -0.097083f, -0.074550f, 0.091928f, 0.081603f, 0.005194f, -0.064663f, -0.080318f, -0.046063f, 0.016055f, 0.079384f, 0.070789f, 0.047423f, -0.028793f, 0.009398f, -0.028920f, 0.025989f, 0.060288f, 0.092919f, 0.101528f, -0.012591f, -0.053966f, -0.085476f, -0.127734f, -0.001215f, 0.068474f, 0.277294f, -0.035930f, -0.014673f, -0.133658f, -0.055293f, 0.011607f, 0.032117f, 0.165286f, 0.119156f, 0.073869f, -0.083700f, -0.047139f, -0.081777f, -0.004599f, 0.138315f, 0.128044f, 0.155884f, -0.042719f, -0.153224f, -0.111373f, -0.154712f, 0.039020f, 0.142211f, 0.125149f, 0.230464f, -0.109764f, -0.133693f, -0.117081f, -0.019446f, 0.102098f, 0.135910f, 0.190065f, 0.086064f, -0.039691f, -0.073776f, 0.017697f, -0.005551f, 0.054224f, 0.152010f, -0.033216f, 0.094497f, -0.033506f, -0.087334f, 0.001473f, 0.013724f, 0.082473f, 0.003980f, -0.007453f, 0.007902f, -0.021344f, -0.075532f, 0.031745f, -0.010361f, 0.025974f, -0.021325f, -0.062023f, -0.015032f, -0.014478f, 0.007067f, 0.041531f, 0.005813f, -0.011743f, 0.015930f, -0.014905f, -0.019346f, -0.003444f, 0.060277f, 0.015497f, 0.055353f, + -0.003842f, 0.006347f, -0.015624f, 0.007236f, 0.006566f, 0.011206f, 0.042924f, 0.073946f, -0.001984f, -0.019933f, -0.067498f, -0.089341f, 0.003735f, 0.005427f, 0.108382f, 0.069800f, 0.011929f, -0.037417f, -0.152221f, -0.085738f, -0.012926f, 0.069077f, 0.135110f, 0.070113f, -0.040622f, -0.050242f, -0.157816f, -0.058603f, 0.075546f, 0.138940f, 0.112281f, 0.007400f, -0.071328f, -0.080809f, -0.007852f, -0.002759f, 0.065735f, -0.011942f, -0.067815f, 0.088635f, -0.020696f, 0.104675f, -0.096622f, 0.000987f, -0.042285f, -0.100371f, 0.073211f, -0.052786f, 0.067765f, -0.053981f, -0.020877f, -0.005018f, 0.034836f, 0.007601f, -0.038533f, -0.020709f, -0.001776f, 0.054084f, -0.050583f, 0.062066f, 0.044582f, -0.034188f, 0.007695f, -0.042873f, -0.042993f, 0.072298f, -0.071661f, -0.036327f, 0.048076f, 0.110557f, -0.000886f, 0.014729f, -0.010253f, -0.048801f, -0.013655f, 0.044944f, -0.015759f, -0.073509f, 0.010281f, -0.016317f, -0.012467f, 0.021768f, -0.066819f, 0.033300f, -0.000267f, 0.022704f, 0.051394f, -0.116710f, -0.086187f, -0.028911f, -0.002661f, 0.119436f, -0.063600f, 0.043042f, 0.094136f, -0.052081f, + -0.030619f, -0.003648f, 0.051043f, 0.074056f, -0.040742f, 0.021133f, -0.015026f, 0.029086f, 0.115908f, -0.043445f, -0.130721f, 0.027409f, 0.059822f, 0.015169f, -0.069872f, 0.043177f, 0.018266f, 0.043345f, -0.013701f, -0.002375f, -0.048808f, -0.039165f, 0.028710f, 0.006887f, -0.052013f, 0.014859f, 0.035924f, -0.017847f, -0.000267f, -0.058113f, 0.008458f, -0.014772f, -0.063422f, -0.002624f, 0.028381f, 0.024190f, 0.010244f, -0.002137f, 0.015730f, -0.043784f, -0.010689f, 0.014903f, -0.020997f, 0.032834f, -0.020253f, -0.008949f, -0.019146f, -0.000428f, -0.020398f, 0.031370f, 0.005845f, -0.025692f, -0.021543f, -0.001543f, -0.000856f, 0.052043f, -0.018294f, 0.018096f, -0.009473f, -0.001561f, 0.011542f, -0.023283f, -0.020029f, 0.002881f, -0.044400f, -0.012940f, 0.013126f, -0.038476f, 0.001880f, -0.007666f, -0.013007f, 0.007495f, 0.024856f, -0.000683f, 0.003747f, -0.013917f, -0.009034f, -0.134905f, -0.042815f, 0.057914f, 0.079289f, 0.065839f, -0.067291f, 0.021454f, -0.187853f, -0.122157f, -0.103808f, -0.016535f, 0.087899f, 0.056570f, -0.004005f, -0.041306f, -0.051047f, 0.024884f, -0.031261f, -0.003198f, + 0.067172f, 0.018310f, 0.003077f, -0.066594f, -0.032134f, -0.006788f, -0.031599f, 0.020342f, -0.005642f, 0.036096f, -0.009549f, -0.000367f, -0.011914f, -0.002148f, -0.008689f, -0.038013f, -0.028866f, -0.063801f, -0.045143f, 0.032596f, 0.062362f, 0.068054f, 0.037774f, 0.059314f, -0.009101f, 0.050477f, -0.011863f, -0.023058f, -0.079743f, -0.003018f, -0.044081f, 0.034168f, 0.012984f, 0.100835f, -0.081430f, 0.028974f, 0.056424f, -0.031048f, -0.043307f, -0.024981f, -0.020229f, -0.020576f, 0.007238f, 0.071669f, 0.045926f, -0.018973f, -0.002751f, 0.051482f, -0.059530f, -0.065587f, 0.027064f, -0.076138f, -0.058791f, -0.051062f, 0.006314f, 0.024905f, 0.029535f, 0.088653f, 0.060062f, -0.009429f, 0.044689f, -0.025590f, 0.001727f, 0.011244f, 0.033098f, 0.053898f, 0.057950f, 0.041049f, 0.033812f, 0.027472f, 0.002262f, -0.074149f, -0.021114f, -0.038182f, -0.009682f, 0.043644f, -0.001945f, 0.006813f, -0.016262f, -0.032870f, 0.003623f, -0.016115f, -0.013583f, -0.035804f, 0.015854f, 0.027326f, -0.012101f, 0.010707f, 0.023908f, 0.013479f, 0.015570f, 0.003033f, 0.015328f, -0.010352f, 0.010524f, -0.004716f, + -0.019013f, 0.014787f, 0.018098f, -0.014591f, -0.021866f, 0.002245f, -0.014792f, -0.025095f, 0.019576f, 0.021473f, 0.008194f, 0.027578f, -0.002508f, -0.024752f, 0.042782f, -0.017575f, -0.161115f, -0.238003f, -0.292118f, -0.230868f, -0.344293f, -0.061108f, -0.125919f, 0.037801f, 0.071957f, 0.248747f, 0.145168f, 0.257691f, 0.262031f, 0.358838f, 0.261849f, 0.266199f, 0.196004f, 0.008165f, -0.057148f, -0.104226f, -0.064208f, -0.214762f, -0.146862f, -0.117020f, -0.119592f, -0.118332f, -0.118111f, -0.114640f, -0.123692f, -0.135705f, -0.101234f, -0.157745f, -0.129051f, -0.112493f, -0.050663f, -0.132592f, -0.041151f, 0.048427f, -0.098585f, -0.047752f, 0.026195f, 0.021340f, -0.083499f, 0.069139f, 0.088908f, 0.112672f, 0.152907f, 0.155444f, -0.012468f, 0.092332f, 0.150302f, 0.213441f, 0.168156f, 0.336346f, 0.315854f, 0.278970f, 0.225984f, 0.286220f, 0.141962f, 0.227834f, 0.277352f, 0.213579f, 0.136472f, 0.231658f, 0.074984f, 0.077678f, 0.142196f, 0.142697f, 0.101228f, 0.029212f, 0.082700f, -0.027833f, 0.004684f, 0.072407f, -0.082952f, -0.208024f, -0.310843f, -0.122941f, -0.425479f, -0.372147f, + -0.327394f, -0.378488f, -0.421138f, -0.352969f, -0.305631f, -0.294770f, -0.203314f, -0.267186f, -0.137354f, -0.169710f, -0.180477f, -0.273459f, -0.221109f, -0.159429f, -0.130706f, -0.110587f, -0.103775f, -0.065028f, 0.025525f, -0.000414f, -0.006504f, 0.076855f, 0.160518f, 0.133980f, 0.135550f, 0.216433f, 0.184883f, 0.192303f, 0.244019f, 0.230291f, 0.195759f, 0.186387f, 0.223400f, 0.190393f, 0.184389f, 0.195917f, 0.203063f, 0.172919f, 0.150959f, 0.139144f, 0.129804f, 0.170025f, 0.133090f, 0.100084f, 0.104340f, 0.078301f, 0.045414f, -0.026972f, -0.056563f, -0.073633f, -0.132445f, -0.112967f, -0.117381f, -0.139271f, -0.147678f, -0.135457f, -0.088667f, -0.098971f, -0.090010f, -0.091014f, -0.047272f, -0.051838f, -0.062948f, -0.042553f, -0.013963f, -0.015065f, -0.029420f, -0.017985f, 0.001851f, -0.009709f, -0.014410f, -0.010791f, -0.000557f, -0.000743f, -0.000813f, 0.000744f, 0.001311f, 0.000232f} + } +}; +const float CRendBin_Combined_BRIR_coeff_im_32kHz[15][BINAURAL_CHANNELS][2819]={ + { + {0.009763f, 0.004826f, -0.006570f, 0.009881f, -0.005791f, -0.002002f, 0.000151f, -0.003400f, -0.003805f, -0.007681f, 0.001838f, 0.011624f, 0.001194f, 0.002073f, 0.004945f, 0.001187f, -0.004128f, -0.001297f, -0.002453f, -0.002488f, 0.007055f, 0.001924f, 0.000928f, -0.002418f, 0.001304f, -0.000306f, -0.002679f, -0.004405f, 0.006838f, 0.005246f, 0.000978f, -0.001469f, 0.007930f, -0.011047f, -0.004108f, 0.004685f, -0.004570f, 0.009484f, 0.000974f, 0.006690f, 0.000864f, 0.000762f, 0.004341f, -0.003817f, -0.001583f, -0.000144f, -0.000106f, -0.002982f, -0.002374f, 0.004178f, -0.000209f, -0.010189f, 0.009547f, -0.001355f, 0.001625f, -0.008609f, 0.004085f, -0.003819f, 0.003384f, 0.000247f, -0.000296f, -0.003242f, -0.000332f, -0.004984f, 0.005131f, -0.009678f, -0.001093f, 0.007056f, -0.005603f, 0.002624f, 0.010545f, 0.003199f, 0.001057f, -0.005259f, 0.000556f, 0.002804f, -0.001992f, 0.003516f, -0.002220f, -0.001537f, -0.002978f, 0.003182f, -0.003473f, -0.005549f, 0.001757f, 0.000922f, -0.001396f, 0.006788f, -0.001729f, -0.001473f, -0.001665f, 0.002253f, 0.002466f, -0.000178f, 0.000264f, 0.001227f, + -0.001368f, 0.001216f, -0.002631f, -0.001082f, -0.000443f, -0.000548f, -0.001426f, -0.000049f, -0.000095f, -0.000291f, -0.000845f, -0.000062f, -0.001432f, 0.000753f, -0.000730f, 0.001637f, -0.001088f, 0.001220f, 0.001645f, 0.020362f, 0.003762f, -0.002850f, 0.006224f, -0.003076f, -0.002546f, -0.003260f, -0.001325f, -0.007645f, 0.010824f, 0.006253f, 0.004673f, 0.005031f, 0.004786f, -0.005016f, -0.006759f, 0.009111f, -0.001958f, -0.007069f, -0.013458f, 0.002204f, -0.003984f, 0.004224f, 0.000085f, -0.001142f, -0.003012f, 0.004236f, -0.004986f, -0.002520f, 0.006652f, 0.012636f, 0.003292f, 0.005749f, 0.001096f, 0.006355f, -0.001316f, 0.006761f, 0.004266f, 0.000764f, 0.003782f, 0.000336f, 0.001111f, 0.000348f, 0.009236f, 0.001956f, 0.002430f, -0.002087f, 0.001368f, -0.000655f, -0.001292f, 0.007494f, 0.008579f, -0.003085f, -0.003158f, 0.001729f, 0.007895f, -0.012851f, -0.000674f, -0.003491f, -0.009512f, -0.003872f, 0.001323f, -0.004056f, 0.004228f, 0.003425f, 0.000283f, -0.005801f, 0.002699f, -0.001237f, -0.005548f, 0.007116f, -0.009823f, -0.004645f, -0.010477f, -0.005187f, -0.001489f, 0.001558f, + 0.010569f, -0.004571f, -0.002756f, 0.003266f, -0.001669f, -0.002516f, 0.005005f, -0.000831f, -0.000208f, -0.002289f, -0.003546f, -0.004398f, -0.001175f, 0.003732f, 0.001485f, 0.001813f, 0.001731f, 0.001323f, 0.000131f, -0.000627f, -0.000274f, 0.000296f, 0.002634f, 0.001281f, 0.001386f, -0.000905f, 0.000215f, 0.000903f, 0.000745f, -0.000002f, 0.000168f, 0.000006f, -0.000203f, -0.000366f, -0.001846f, -0.001419f, -0.000960f, 0.001017f, 0.000852f, -0.000416f, 0.006145f, 0.002721f, -0.012411f, -0.001154f, 0.001828f, 0.008837f, -0.002669f, -0.015367f, 0.012384f, -0.014519f, 0.000761f, -0.006326f, -0.005048f, -0.015396f, -0.010259f, -0.005988f, -0.003900f, 0.006378f, 0.002140f, -0.010124f, 0.001428f, -0.005399f, 0.000068f, -0.000324f, 0.004173f, 0.000890f, -0.004445f, 0.000761f, 0.001075f, 0.002531f, -0.003146f, -0.002130f, -0.000951f, -0.004987f, -0.007643f, 0.010372f, 0.004779f, 0.001441f, -0.001438f, 0.008843f, 0.007597f, -0.008643f, 0.002416f, 0.000871f, -0.001673f, -0.005018f, 0.001130f, -0.008930f, 0.001998f, -0.001664f, -0.007349f, 0.009094f, 0.000132f, -0.000660f, 0.011308f, -0.009801f, + 0.008889f, 0.003335f, -0.001349f, -0.007251f, 0.002094f, -0.001011f, -0.007736f, -0.006382f, 0.000030f, -0.002771f, -0.003491f, -0.010612f, 0.000463f, 0.002317f, 0.004963f, -0.003051f, 0.004613f, 0.001455f, -0.001919f, -0.001444f, -0.006332f, 0.005483f, 0.001077f, 0.000839f, -0.010499f, 0.005528f, -0.000958f, 0.000786f, -0.005446f, 0.000210f, -0.009651f, 0.001210f, 0.002011f, 0.001338f, -0.000879f, 0.000989f, -0.000239f, 0.000115f, -0.001727f, 0.000571f, -0.000554f, 0.002161f, 0.001152f, 0.000926f, 0.001895f, 0.000078f, 0.000608f, 0.002012f, 0.001118f, -0.001308f, -0.000615f, 0.003166f, -0.001165f, 0.000670f, -0.001136f, 0.001217f, -0.003641f, -0.000836f, -0.001160f, 0.001522f, -0.000714f, -0.022861f, -0.021660f, 0.008398f, 0.014326f, 0.008683f, -0.019512f, 0.013897f, -0.004725f, -0.001770f, 0.001222f, -0.009028f, -0.006866f, 0.016395f, -0.000236f, -0.000020f, 0.001238f, -0.000383f, 0.005343f, -0.008144f, 0.004943f, -0.004311f, 0.004430f, 0.007510f, -0.004980f, -0.001341f, 0.004340f, -0.001243f, 0.007816f, -0.002430f, 0.003393f, 0.000686f, -0.000803f, 0.000661f, -0.006673f, -0.009267f, + 0.008749f, 0.001150f, -0.001692f, 0.000080f, -0.008698f, -0.010815f, -0.000307f, 0.000212f, 0.005630f, -0.010054f, -0.008579f, -0.001827f, -0.017877f, 0.006941f, -0.001414f, 0.003648f, -0.001379f, -0.004301f, 0.002728f, 0.022899f, 0.012704f, 0.006647f, -0.006868f, 0.009026f, -0.000109f, -0.011759f, 0.000028f, -0.012274f, 0.010425f, 0.001438f, 0.001226f, -0.006993f, 0.000059f, 0.007138f, 0.002607f, 0.001427f, 0.000887f, 0.000798f, 0.007659f, 0.005346f, 0.000976f, 0.005208f, 0.003087f, 0.004159f, 0.011213f, 0.004658f, 0.005511f, -0.005204f, 0.004206f, 0.003143f, -0.001356f, 0.008845f, 0.002672f, -0.000027f, -0.000810f, 0.002640f, 0.004690f, 0.000574f, -0.000075f, -0.001749f, 0.001115f, 0.003880f, 0.002126f, -0.000887f, 0.000364f, -0.003192f, 0.000896f, 0.000800f, -0.001443f, 0.000307f, -0.000220f, -0.000064f, 0.002151f, -0.000423f, 0.002245f, 0.003113f, 0.001100f, -0.001834f, -0.003546f, 0.000575f, -0.002245f, 0.001694f, 0.001506f, -0.002241f, 0.000890f, -0.032844f, -0.002500f, -0.007901f, -0.001149f, -0.005490f, -0.018632f, -0.000794f, -0.005012f, -0.007682f, -0.017467f, -0.002155f, + 0.012401f, -0.008668f, 0.008157f, -0.001446f, 0.011501f, -0.003899f, 0.009344f, -0.003082f, -0.009255f, -0.002485f, 0.000993f, -0.004061f, -0.008322f, -0.006688f, -0.008181f, 0.000262f, -0.007465f, 0.002718f, 0.000879f, 0.000744f, 0.003529f, -0.005617f, -0.007521f, 0.010846f, -0.000992f, 0.003214f, 0.000110f, -0.008521f, -0.005406f, -0.006017f, 0.000290f, -0.004321f, 0.007561f, 0.007685f, 0.001267f, -0.010438f, -0.003423f, 0.019189f, 0.004772f, -0.008123f, -0.006462f, -0.004115f, -0.007118f, -0.003765f, 0.014991f, 0.009120f, -0.010890f, 0.006656f, 0.008841f, 0.013053f, -0.003373f, 0.005303f, -0.000806f, 0.000111f, -0.005291f, -0.010877f, -0.001972f, 0.008017f, 0.000821f, 0.015532f, 0.011020f, 0.000733f, 0.003604f, 0.013100f, -0.010441f, -0.004787f, -0.003083f, -0.006432f, 0.004615f, 0.002027f, 0.002115f, -0.005638f, 0.003824f, -0.004097f, 0.004239f, -0.008015f, -0.000377f, -0.000743f, -0.003147f, -0.000197f, -0.000690f, 0.003935f, 0.001074f, 0.000882f, -0.003437f, -0.002324f, -0.001110f, -0.003237f, -0.000140f, -0.004669f, -0.002719f, 0.000189f, -0.000365f, 0.002909f, -0.001987f, 0.000796f, + -0.000962f, 0.001583f, 0.001142f, 0.004025f, -0.003328f, 0.042097f, 0.028257f, -0.008700f, -0.001586f, 0.000109f, -0.001146f, -0.004810f, 0.005880f, 0.014416f, 0.012167f, 0.006323f, -0.022083f, -0.009809f, 0.002840f, 0.001288f, 0.009385f, -0.016618f, 0.003361f, 0.022546f, 0.015172f, -0.002582f, 0.005406f, -0.001974f, -0.007610f, -0.010386f, 0.000580f, -0.008849f, -0.005167f, 0.002599f, 0.006999f, -0.006484f, -0.012088f, -0.005739f, 0.002078f, 0.011107f, 0.015501f, -0.002945f, -0.016394f, -0.003463f, -0.005863f, -0.016443f, -0.000993f, -0.000492f, -0.007897f, 0.002726f, 0.004429f, 0.009619f, -0.013800f, 0.005642f, 0.007112f, 0.001557f, -0.013346f, -0.009906f, 0.004541f, 0.000589f, 0.003459f, -0.001450f, -0.001311f, -0.000458f, -0.007402f, 0.003650f, 0.003856f, -0.005161f, 0.009254f, 0.010959f, 0.014973f, 0.003600f, 0.001114f, 0.014117f, 0.022999f, 0.003678f, 0.003140f, 0.003925f, 0.013521f, 0.001536f, 0.007997f, 0.022718f, 0.006731f, 0.004188f, 0.000618f, -0.004288f, -0.019423f, 0.002599f, -0.000531f, -0.003152f, -0.003728f, 0.002389f, -0.002708f, 0.004799f, 0.002119f, -0.002568f, + -0.001431f, -0.000657f, 0.003899f, 0.002493f, -0.001100f, -0.000756f, 0.002647f, 0.005770f, 0.000024f, -0.001448f, 0.001995f, 0.000220f, -0.002717f, -0.005368f, 0.003874f, -0.005055f, 0.003059f, 0.002134f, 0.003726f, -0.000254f, -0.000651f, 0.000077f, 0.001198f, -0.007051f, 0.000176f, 0.001027f, -0.000698f, 0.022154f, 0.000490f, 0.004617f, 0.005389f, 0.010684f, -0.004165f, 0.006804f, -0.005756f, -0.003672f, -0.018250f, 0.007284f, 0.012474f, -0.011292f, 0.009469f, -0.004673f, -0.015989f, 0.016658f, 0.009894f, -0.002967f, 0.010004f, 0.019508f, 0.013689f, -0.010062f, -0.005596f, 0.009834f, 0.003136f, -0.002221f, 0.007601f, 0.006949f, 0.010162f, 0.000642f, -0.004407f, -0.008699f, -0.015419f, -0.000507f, -0.012793f, 0.001579f, -0.004146f, 0.007164f, -0.010167f, -0.023455f, 0.005192f, -0.005818f, 0.010859f, 0.002729f, 0.000883f, -0.006492f, -0.013784f, -0.011595f, -0.001060f, -0.001187f, -0.010385f, 0.014674f, 0.019022f, 0.019709f, 0.008005f, -0.014114f, -0.001204f, 0.018674f, 0.001836f, -0.003221f, 0.008734f, -0.002444f, -0.004668f, -0.017729f, 0.009806f, 0.005136f, 0.025733f, 0.011877f, + -0.017417f, 0.005861f, 0.006601f, -0.001849f, -0.000282f, 0.006236f, -0.004209f, 0.001430f, -0.007443f, -0.018386f, 0.016657f, 0.003040f, 0.009945f, 0.004799f, -0.008627f, 0.014068f, -0.003082f, 0.003353f, 0.000800f, -0.003111f, 0.000579f, 0.000431f, 0.001161f, 0.007361f, 0.002480f, 0.001406f, 0.000678f, -0.002514f, -0.002916f, -0.003844f, -0.002229f, 0.002539f, -0.001174f, -0.000192f, -0.001423f, 0.002327f, -0.002108f, -0.001125f, 0.000270f, -0.000280f, 0.001035f, -0.004053f, 0.004761f, -0.001982f, 0.004196f, 0.001371f, -0.002117f, -0.002673f, 0.005904f, -0.005346f, 0.004751f, -0.001295f, -0.006824f, -0.011383f, -0.003071f, -0.002906f, -0.019650f, 0.000986f, 0.002413f, 0.009838f, -0.003715f, -0.008465f, 0.003528f, 0.001077f, 0.004652f, 0.000159f, 0.010678f, 0.004294f, 0.007376f, 0.001266f, -0.000822f, 0.006354f, 0.003716f, -0.019340f, -0.005977f, -0.027651f, 0.001256f, -0.005146f, 0.003199f, 0.004917f, 0.000374f, 0.013235f, 0.003368f, 0.018892f, 0.002324f, -0.022425f, 0.000461f, -0.009012f, -0.003709f, -0.001047f, -0.003362f, -0.001134f, -0.017788f, 0.003893f, -0.008561f, 0.021455f, + -0.022245f, 0.012369f, -0.004829f, -0.018985f, -0.003550f, -0.013342f, -0.002870f, -0.004046f, -0.020216f, 0.005829f, 0.006203f, -0.003679f, -0.003338f, -0.001265f, 0.007166f, -0.016038f, 0.000418f, 0.015092f, 0.002794f, 0.020985f, 0.034234f, 0.014169f, -0.030983f, -0.041336f, 0.020078f, 0.009019f, 0.030908f, -0.006369f, 0.014839f, 0.003200f, 0.014738f, 0.020650f, 0.026566f, -0.014081f, 0.007674f, 0.019791f, -0.016161f, 0.003047f, -0.002062f, -0.001997f, 0.001505f, 0.014144f, -0.002132f, 0.004858f, -0.009120f, 0.003347f, -0.007027f, -0.007395f, -0.003262f, -0.006170f, 0.001045f, -0.003621f, -0.010415f, -0.000345f, 0.006946f, 0.004350f, -0.001918f, -0.001890f, -0.001528f, 0.000195f, 0.003247f, 0.003432f, -0.002672f, -0.004025f, -0.001776f, 0.006046f, -0.001441f, 0.005860f, 0.000949f, 0.000904f, -0.001446f, 0.001460f, 0.001752f, 0.000543f, 0.001639f, 0.000337f, -0.004905f, -0.004753f, -0.003092f, 0.001600f, 0.005021f, -0.006967f, -0.004638f, -0.002156f, 0.002952f, -0.003241f, -0.037832f, 0.028247f, 0.005249f, -0.005034f, -0.000503f, -0.017184f, -0.014002f, 0.014724f, -0.003909f, -0.004851f, + 0.015367f, -0.011424f, -0.012191f, 0.000642f, 0.015287f, 0.006439f, -0.004841f, 0.000413f, -0.008636f, -0.001213f, 0.001279f, 0.008123f, 0.000445f, -0.019393f, -0.019154f, 0.004289f, -0.002488f, 0.004599f, -0.001833f, 0.007694f, 0.015047f, 0.027842f, -0.000341f, 0.017255f, -0.004158f, 0.004841f, 0.012026f, -0.011648f, 0.022869f, -0.003322f, -0.014043f, -0.020041f, -0.003711f, -0.016638f, -0.020805f, -0.005845f, 0.009753f, -0.006525f, -0.016132f, 0.008055f, 0.011700f, 0.018038f, 0.023503f, -0.019133f, 0.007395f, -0.005378f, -0.017412f, 0.006516f, -0.019475f, -0.003668f, -0.031879f, 0.012729f, -0.009413f, 0.004687f, -0.005624f, 0.004994f, -0.034277f, -0.034365f, -0.020676f, -0.008104f, 0.019198f, -0.018509f, 0.036308f, -0.012790f, 0.003763f, -0.003401f, 0.006913f, -0.003331f, -0.025398f, 0.003677f, 0.003172f, 0.006957f, 0.006129f, 0.002976f, 0.010105f, -0.005706f, -0.008576f, 0.000016f, 0.000608f, -0.008561f, 0.004095f, -0.011012f, 0.006443f, 0.003674f, 0.005269f, -0.001632f, 0.000247f, -0.003374f, -0.008257f, -0.006190f, -0.003244f, -0.003849f, 0.005898f, -0.003819f, -0.010012f, 0.003540f, + 0.004653f, -0.001902f, 0.007234f, -0.000596f, -0.001780f, -0.000049f, 0.001929f, -0.003000f, -0.002636f, 0.003698f, 0.005350f, 0.003777f, 0.002017f, -0.007477f, -0.005027f, -0.001622f, -0.005602f, 0.002199f, 0.000894f, -0.000070f, -0.004983f, 0.031777f, 0.002058f, 0.011874f, 0.008615f, 0.003174f, 0.018831f, 0.002376f, -0.025900f, 0.012376f, 0.003938f, 0.011807f, -0.000991f, -0.019522f, 0.027843f, 0.014750f, 0.011550f, -0.002820f, -0.008194f, 0.003352f, -0.001825f, -0.015538f, 0.010121f, 0.006717f, -0.008336f, 0.010896f, 0.017787f, 0.000247f, 0.006817f, 0.017291f, -0.018877f, 0.004348f, -0.006232f, 0.007628f, -0.035677f, 0.010719f, 0.017455f, -0.006268f, 0.004789f, 0.017054f, 0.009442f, 0.000027f, 0.005909f, -0.018212f, 0.004817f, -0.010828f, 0.001000f, 0.004941f, 0.003039f, -0.008467f, 0.034556f, -0.006454f, -0.006319f, -0.008316f, -0.029779f, -0.012463f, -0.018170f, -0.021590f, -0.003902f, 0.029228f, 0.032620f, -0.003515f, 0.010215f, 0.012643f, -0.026883f, -0.009095f, 0.022208f, 0.017828f, -0.010556f, -0.007951f, -0.026472f, -0.009035f, -0.009889f, -0.013231f, -0.014843f, 0.003635f, + -0.027009f, 0.004099f, 0.025757f, 0.035316f, 0.011199f, -0.010898f, -0.000524f, 0.018543f, -0.006416f, -0.013286f, 0.001465f, -0.002058f, -0.005452f, -0.009058f, 0.001492f, -0.001303f, 0.004448f, 0.005238f, 0.003501f, -0.003505f, 0.001870f, 0.002592f, 0.002582f, -0.000933f, -0.004993f, -0.011852f, 0.003482f, -0.001149f, -0.004435f, 0.008216f, 0.002943f, 0.004409f, -0.004627f, 0.006902f, -0.004973f, -0.004451f, -0.005626f, 0.005367f, 0.001397f, 0.003836f, 0.008832f, -0.001221f, -0.004192f, -0.002873f, 0.004552f, 0.001443f, -0.000132f, -0.000270f, 0.001435f, 0.000731f, -0.000251f, -0.002247f, 0.004625f, 0.005346f, 0.007447f, -0.002924f, -0.010066f, 0.006291f, 0.001700f, -0.013404f, -0.019826f, -0.021354f, -0.008491f, -0.020877f, -0.008637f, -0.008467f, 0.000381f, -0.019858f, 0.004499f, 0.008365f, 0.000985f, -0.022664f, 0.007118f, -0.028116f, 0.008765f, 0.015718f, 0.000525f, 0.024424f, 0.000824f, -0.007237f, -0.004366f, 0.016487f, -0.005827f, 0.022686f, 0.008167f, -0.007802f, -0.007656f, 0.004032f, -0.011434f, -0.006192f, 0.000979f, 0.021474f, -0.000585f, 0.011379f, 0.006582f, 0.002004f, + 0.015182f, -0.006677f, -0.013627f, 0.006180f, -0.009710f, -0.004508f, -0.026760f, 0.015244f, -0.009290f, -0.007879f, -0.005282f, -0.029602f, 0.035692f, 0.009299f, -0.004048f, 0.015558f, 0.005249f, 0.007624f, -0.015530f, -0.023538f, -0.026697f, -0.012882f, 0.001605f, -0.027065f, 0.010344f, 0.019806f, -0.030268f, -0.011014f, 0.011396f, -0.013913f, 0.007578f, 0.033992f, 0.001307f, -0.005364f, -0.008777f, 0.007775f, -0.018186f, 0.012176f, 0.006739f, -0.016490f, 0.005690f, 0.011941f, -0.006467f, -0.019546f, -0.016581f, -0.008672f, -0.000378f, 0.005525f, 0.004850f, 0.003824f, -0.003167f, -0.004782f, -0.002181f, 0.004488f, 0.000504f, -0.002638f, -0.010851f, -0.013117f, -0.003351f, 0.001058f, -0.009195f, -0.011214f, -0.007566f, -0.004627f, -0.004050f, -0.009817f, -0.008302f, -0.004477f, -0.005901f, -0.012571f, 0.002516f, 0.012097f, -0.000902f, -0.000968f, -0.004480f, -0.003460f, 0.004295f, -0.004330f, 0.001228f, -0.009873f, 0.000695f, -0.002751f, -0.005062f, 0.000138f, -0.004722f, 0.003287f, 0.005020f, -0.004054f, 0.007421f, -0.004781f, -0.001580f, -0.004946f, -0.000028f, 0.000972f, 0.021754f, 0.053626f, + 0.056697f, 0.016941f, 0.035263f, -0.024177f, -0.024062f, -0.005802f, -0.003369f, 0.001891f, 0.008186f, 0.017885f, 0.032668f, 0.010491f, 0.030257f, 0.003173f, 0.009329f, 0.004317f, -0.008044f, 0.013547f, -0.000100f, 0.005303f, 0.002587f, -0.015456f, -0.001628f, -0.008370f, -0.016299f, -0.010495f, 0.000542f, 0.001481f, -0.021698f, -0.009231f, 0.027982f, 0.019777f, 0.014688f, 0.023274f, -0.014240f, -0.000028f, -0.039966f, 0.001688f, 0.034869f, -0.006933f, -0.006575f, 0.003966f, -0.003397f, 0.026864f, -0.001832f, -0.004704f, 0.021180f, -0.025083f, -0.040006f, -0.016453f, 0.003936f, -0.021886f, 0.016373f, 0.022247f, -0.031422f, -0.012229f, 0.000612f, -0.000796f, -0.045231f, -0.029234f, 0.014969f, 0.006098f, -0.003046f, 0.014467f, -0.019523f, -0.012416f, -0.027775f, 0.006485f, 0.009430f, 0.002126f, 0.002343f, -0.018918f, -0.030643f, 0.025462f, -0.041803f, 0.012116f, -0.015053f, 0.040086f, 0.004616f, 0.016584f, -0.011061f, -0.016141f, 0.012140f, 0.005221f, 0.018521f, -0.017428f, -0.002648f, 0.012021f, -0.000340f, -0.009757f, -0.008414f, -0.009597f, 0.001385f, 0.009186f, 0.010854f, -0.011827f, + -0.004328f, -0.002120f, -0.014924f, -0.005719f, 0.003329f, -0.001926f, 0.001881f, -0.008322f, -0.013015f, -0.002163f, 0.000893f, 0.010384f, 0.003847f, -0.006807f, 0.008766f, 0.001168f, 0.004747f, -0.015176f, 0.003638f, -0.009158f, 0.007678f, 0.001083f, 0.008103f, 0.011774f, 0.004321f, -0.008665f, -0.016212f, 0.005038f, 0.006272f, -0.052489f, -0.037749f, 0.026148f, -0.005445f, 0.047546f, -0.011585f, 0.039143f, -0.031484f, 0.000948f, 0.014079f, -0.003119f, 0.001703f, 0.004598f, -0.002439f, -0.023633f, 0.008305f, 0.008892f, 0.010359f, 0.011778f, -0.007256f, 0.019426f, -0.017639f, -0.013035f, -0.010078f, 0.027324f, -0.015070f, -0.005083f, 0.002462f, -0.000570f, -0.014175f, 0.012184f, -0.015818f, -0.018843f, -0.035508f, 0.003241f, 0.006521f, -0.024123f, -0.011245f, 0.011620f, -0.004873f, 0.006210f, 0.001939f, 0.028052f, 0.001962f, 0.021113f, 0.009425f, 0.000909f, 0.016928f, 0.003844f, 0.005870f, -0.031818f, 0.032779f, 0.011607f, 0.025685f, -0.015603f, 0.006827f, -0.017077f, 0.026646f, 0.020209f, 0.032507f, 0.005182f, -0.008499f, -0.023620f, -0.001457f, 0.004166f, -0.020092f, 0.028560f, + 0.004620f, 0.004442f, 0.030770f, 0.006882f, -0.009200f, -0.012280f, -0.000983f, 0.018283f, 0.022087f, -0.007176f, 0.027541f, -0.032929f, -0.034478f, -0.015098f, 0.008045f, -0.010518f, 0.015072f, -0.003752f, 0.008106f, 0.026364f, -0.001144f, 0.013086f, -0.010946f, -0.010039f, 0.011562f, -0.001016f, 0.018526f, -0.005716f, -0.000082f, -0.005678f, -0.011381f, 0.002314f, -0.006679f, -0.002675f, 0.007663f, 0.002588f, -0.010336f, -0.009517f, 0.005602f, 0.013994f, 0.014578f, -0.001473f, 0.011953f, 0.012909f, -0.018052f, 0.008442f, 0.017186f, 0.013460f, 0.007661f, -0.013533f, -0.016318f, -0.017097f, -0.017152f, -0.017108f, 0.001506f, -0.005978f, -0.002319f, 0.001927f, -0.012515f, 0.008934f, 0.008194f, -0.006491f, 0.009738f, 0.003422f, 0.004655f, -0.011993f, 0.024190f, -0.057049f, -0.002593f, 0.029730f, -0.018988f, -0.006334f, 0.021919f, -0.023743f, -0.048229f, 0.009612f, 0.008223f, 0.007501f, -0.006264f, -0.028508f, 0.007239f, 0.008144f, 0.002194f, 0.015883f, -0.051089f, 0.023510f, -0.011828f, 0.012262f, -0.029083f, 0.023763f, -0.036811f, -0.023488f, 0.014380f, -0.009596f, -0.004222f, -0.027960f, + 0.022099f, 0.029065f, 0.000003f, 0.003313f, -0.013251f, 0.043571f, 0.010877f, 0.011951f, -0.007798f, -0.037525f, -0.007984f, 0.020890f, -0.003671f, 0.031216f, 0.000384f, -0.011150f, 0.007635f, -0.002044f, 0.019645f, -0.037090f, -0.004352f, -0.028408f, 0.031029f, -0.011346f, 0.010512f, -0.000705f, -0.000933f, -0.033573f, -0.011675f, 0.029817f, 0.009654f, 0.002837f, -0.008739f, 0.001069f, 0.003987f, -0.043042f, -0.044566f, 0.047886f, -0.020947f, -0.051558f, 0.021296f, 0.024693f, -0.041448f, -0.054302f, -0.037815f, -0.036310f, 0.006747f, 0.014750f, -0.004303f, -0.034877f, -0.000869f, -0.018547f, -0.008571f, -0.025203f, -0.001134f, 0.002833f, 0.002858f, -0.004805f, 0.024422f, -0.012808f, 0.009800f, -0.010822f, -0.000226f, 0.006916f, -0.005807f, -0.000627f, -0.013916f, 0.019158f, -0.004042f, 0.006945f, -0.010089f, -0.014900f, -0.002784f, 0.007740f, 0.008846f, 0.003019f, -0.014453f, 0.009183f, -0.001715f, -0.011544f, 0.012091f, -0.017663f, -0.003162f, -0.010760f, 0.018579f, -0.007541f, -0.019636f, 0.009198f, -0.007489f, -0.008208f, -0.026216f, -0.000929f, 0.006488f, 0.022889f, 0.009676f, -0.012710f, + -0.006250f, 0.002744f, -0.003050f, -0.006494f, 0.004677f, -0.000464f, -0.004553f, -0.004434f, -0.001183f, 0.022822f, -0.031766f, -0.016974f, -0.033193f, -0.002556f, 0.006202f, -0.043461f, 0.006525f, -0.021016f, 0.060580f, 0.003682f, -0.055498f, -0.012169f, 0.026124f, 0.016768f, 0.012463f, 0.028163f, 0.027291f, -0.039204f, -0.010675f, -0.014877f, 0.036647f, -0.012605f, 0.042876f, 0.000417f, -0.025659f, -0.019509f, -0.039406f, -0.044044f, 0.002059f, 0.005665f, -0.007875f, -0.022458f, -0.010374f, 0.003490f, 0.006446f, 0.015778f, -0.022397f, 0.011561f, -0.026235f, -0.029616f, 0.005252f, -0.005918f, -0.008661f, -0.030900f, -0.030435f, -0.013823f, -0.009849f, 0.043195f, 0.003294f, 0.014868f, 0.023321f, -0.000204f, 0.052992f, 0.022286f, -0.018551f, 0.003314f, 0.026950f, -0.010244f, 0.034296f, -0.008640f, 0.003699f, 0.002979f, -0.048175f, -0.048029f, 0.006479f, 0.034540f, 0.000019f, -0.010021f, -0.053823f, 0.003991f, 0.017428f, 0.011976f, -0.018948f, -0.014265f, -0.011286f, 0.007069f, -0.023670f, 0.056983f, 0.031082f, 0.035166f, 0.006134f, -0.039244f, 0.013750f, 0.018747f, 0.055435f, 0.013531f, + 0.005005f, 0.023135f, 0.008898f, -0.008589f, -0.000226f, 0.017861f, -0.002344f, 0.002930f, 0.004852f, -0.013681f, -0.010739f, 0.017383f, -0.000265f, -0.013003f, 0.016946f, -0.010397f, -0.004812f, -0.007833f, -0.008902f, 0.016297f, -0.010898f, -0.003978f, 0.007589f, -0.016378f, 0.006379f, -0.000980f, -0.010430f, 0.021294f, -0.008224f, 0.000559f, -0.027199f, 0.016714f, -0.008826f, -0.006342f, -0.017802f, -0.023679f, 0.003092f, -0.009225f, 0.016312f, -0.000012f, 0.009378f, 0.007056f, -0.000355f, -0.009557f, -0.000458f, -0.026399f, -0.024087f, 0.050858f, -0.015778f, -0.018823f, -0.002710f, -0.014006f, -0.034658f, 0.000753f, 0.023923f, -0.059409f, -0.001061f, 0.015431f, 0.018920f, -0.020253f, 0.013417f, -0.034012f, 0.002557f, -0.008771f, 0.010581f, -0.030463f, 0.018899f, -0.051878f, 0.008429f, 0.001432f, 0.029313f, 0.027654f, 0.013675f, -0.019375f, 0.021512f, -0.006317f, 0.024036f, -0.026271f, 0.004054f, 0.030766f, 0.024283f, -0.014445f, 0.004904f, 0.000772f, -0.006931f, 0.014923f, -0.005920f, -0.017916f, -0.020085f, 0.014227f, -0.036191f, 0.023819f, 0.005433f, -0.038683f, 0.036301f, 0.034870f, + 0.032675f, 0.011831f, -0.017204f, 0.042201f, 0.004918f, 0.018125f, -0.026084f, -0.022511f, -0.025017f, 0.007697f, 0.009457f, 0.015107f, -0.035038f, 0.003363f, 0.025446f, -0.066941f, 0.002311f, -0.022003f, 0.041733f, 0.027020f, 0.020845f, -0.005953f, 0.027578f, -0.026277f, -0.001615f, -0.018310f, -0.040485f, -0.001730f, -0.037309f, -0.031045f, 0.017883f, 0.049401f, -0.046743f, -0.011075f, -0.008771f, 0.049590f, -0.012562f, 0.021660f, -0.014530f, -0.008769f, -0.002210f, 0.017502f, -0.010697f, -0.004394f, 0.001108f, 0.011898f, 0.008478f, 0.006221f, -0.006960f, 0.001741f, 0.004831f, 0.024511f, -0.019820f, 0.020437f, -0.004838f, 0.014924f, -0.000352f, 0.003899f, 0.004838f, 0.009354f, -0.013273f, -0.003017f, -0.002906f, -0.016102f, -0.014718f, -0.014305f, 0.009415f, 0.007799f, -0.003360f, -0.006495f, -0.008695f, -0.011323f, -0.007402f, 0.000797f, -0.005455f, -0.000262f, 0.014322f, -0.000497f, -0.027600f, 0.012566f, -0.016368f, -0.002581f, 0.044219f, 0.009597f, 0.022390f, -0.063714f, 0.029534f, -0.035613f, 0.048237f, -0.004746f, 0.018755f, 0.036654f, -0.039525f, 0.070493f, 0.050453f, 0.038191f, + -0.017368f, 0.010394f, 0.048193f, -0.011972f, -0.015605f, -0.011112f, -0.002641f, -0.036313f, 0.009552f, -0.019244f, -0.044349f, 0.042998f, 0.014050f, 0.011945f, 0.005241f, 0.010107f, 0.016450f, 0.045261f, 0.009334f, -0.027925f, -0.002547f, -0.028983f, 0.005623f, 0.004412f, -0.051460f, -0.001982f, 0.027775f, 0.002240f, -0.003836f, -0.015452f, 0.054371f, 0.011450f, 0.023056f, 0.012222f, -0.029618f, -0.020823f, -0.016269f, 0.034109f, 0.019829f, -0.006568f, 0.020383f, -0.002804f, -0.037332f, 0.036265f, 0.004198f, 0.041539f, 0.004379f, 0.004479f, 0.000625f, -0.054608f, 0.007278f, 0.001688f, 0.005869f, 0.034330f, -0.013685f, 0.053893f, -0.081748f, -0.014244f, 0.060604f, -0.024389f, 0.019905f, -0.027524f, -0.043622f, -0.034722f, 0.024970f, -0.023654f, 0.023263f, -0.037319f, -0.008268f, 0.006579f, -0.009480f, -0.014514f, -0.004985f, -0.004163f, 0.016155f, 0.038038f, 0.003751f, 0.022684f, -0.007572f, -0.003495f, 0.027306f, -0.003732f, -0.008119f, 0.007909f, -0.014030f, 0.012538f, 0.023735f, -0.015737f, -0.002717f, -0.005950f, 0.004128f, 0.004812f, 0.011117f, 0.042982f, -0.008021f, 0.015352f, + 0.000494f, 0.010583f, 0.015230f, 0.008122f, 0.002116f, 0.024098f, 0.025402f, -0.006815f, -0.003900f, 0.010977f, 0.005282f, 0.009560f, -0.033349f, -0.002352f, 0.031096f, -0.006637f, 0.006216f, 0.012732f, -0.002060f, 0.032399f, 0.011428f, -0.066026f, -0.078991f, -0.006983f, -0.037021f, 0.005011f, 0.022497f, -0.031617f, 0.009234f, -0.048291f, 0.021015f, -0.026600f, -0.132016f, -0.008505f, 0.080555f, -0.034723f, -0.014916f, 0.080927f, -0.018977f, 0.004361f, 0.096977f, -0.023205f, 0.021459f, 0.009065f, -0.014140f, 0.078079f, -0.062849f, -0.008120f, -0.001692f, -0.011064f, -0.012625f, -0.012874f, -0.001532f, 0.025430f, -0.014279f, -0.042607f, 0.000519f, 0.000851f, 0.012631f, 0.015533f, 0.002863f, 0.035064f, -0.001295f, 0.016136f, -0.009521f, -0.042273f, 0.029522f, -0.005190f, -0.043465f, 0.001671f, 0.025166f, 0.076911f, 0.038972f, 0.064657f, 0.001430f, 0.015922f, 0.030936f, 0.007296f, -0.003697f, 0.060446f, -0.003106f, -0.023543f, 0.070839f, 0.012370f, 0.012592f, 0.000518f, -0.009894f, 0.040438f, 0.000078f, -0.023502f, -0.026452f, -0.005482f, -0.005157f, 0.061227f, -0.041423f, 0.005380f, + 0.007982f, -0.010863f, 0.071990f, 0.000622f, -0.045876f, 0.007743f, 0.023602f, -0.033753f, -0.001504f, 0.034448f, 0.028522f, -0.017340f, 0.002855f, -0.019598f, 0.016715f, -0.005254f, 0.002411f, -0.019282f, 0.018109f, 0.000276f, -0.001820f, -0.028037f, 0.011777f, 0.009647f, -0.018149f, 0.001499f, 0.006815f, -0.009400f, -0.006068f, 0.021768f, 0.003571f, 0.012176f, -0.007784f, 0.006447f, 0.037794f, -0.034043f, -0.015357f, -0.011098f, 0.040865f, 0.015262f, 0.021741f, -0.024444f, -0.022212f, -0.009000f, -0.002461f, -0.029656f, -0.033209f, 0.040275f, 0.016475f, -0.023377f, -0.021670f, -0.013241f, 0.000050f, -0.023162f, -0.020177f, 0.000530f, 0.006512f, 0.015464f, -0.003603f, -0.007206f, 0.003955f, 0.044871f, 0.036233f, -0.074052f, -0.036167f, 0.056851f, -0.010450f, -0.055515f, -0.000487f, 0.001096f, 0.020112f, 0.060115f, 0.053531f, -0.033015f, 0.009922f, -0.007547f, 0.000488f, -0.000634f, -0.034639f, 0.052124f, -0.015488f, -0.034312f, 0.012191f, -0.024661f, 0.029670f, 0.002501f, 0.042188f, -0.013099f, -0.040011f, -0.036273f, 0.031964f, -0.015493f, 0.041611f, -0.011285f, 0.026954f, -0.027480f, + -0.021272f, -0.013133f, 0.002980f, -0.034468f, 0.008420f, 0.001691f, 0.000559f, 0.033445f, -0.000394f, 0.011086f, -0.023330f, 0.016511f, -0.036817f, 0.039270f, -0.035420f, 0.023286f, 0.011894f, 0.032987f, -0.055432f, 0.001754f, 0.004653f, -0.016891f, -0.040058f, -0.067979f, -0.011368f, -0.058031f, -0.022277f, -0.046470f, -0.021600f, -0.084810f, -0.026331f, 0.038267f, 0.048629f, 0.026332f, 0.028302f, -0.004727f, 0.030750f, -0.060472f, -0.013811f, 0.009206f, 0.038944f, 0.010595f, -0.082983f, -0.003430f, -0.036491f, -0.024438f, 0.096986f, 0.065040f, -0.046011f, -0.018880f, -0.032315f, 0.010653f, -0.085520f, 0.005094f, 0.017826f, -0.024602f, -0.025386f, 0.015391f, 0.004980f, 0.000663f, -0.016433f, -0.014576f, -0.014076f, -0.014416f, 0.026674f, 0.024323f, -0.001762f, -0.007022f, -0.026332f, -0.030369f, -0.006431f, -0.007731f, 0.010160f, 0.025939f, -0.050981f, -0.004030f, 0.025489f, -0.000273f, 0.032622f, -0.011562f, -0.031277f, 0.016714f, 0.035261f, 0.017658f, -0.021214f, 0.002421f, 0.032629f, -0.041751f, -0.029638f, 0.054950f, 0.003005f, -0.002080f, -0.005641f, 0.008548f, 0.012671f, 0.016553f, + -0.006976f, -0.013627f, -0.097628f, 0.028567f, 0.015205f, -0.051275f, 0.020149f, 0.019152f, -0.037379f, -0.028542f, 0.043719f, 0.005523f, 0.023233f, -0.011706f, 0.028859f, -0.009142f, -0.004693f, 0.022903f, 0.010921f, 0.007568f, 0.000517f, -0.015330f, -0.026603f, -0.016058f, 0.041327f, -0.014524f, -0.036064f, 0.061193f, 0.037636f, 0.004928f, 0.027761f, 0.008372f, -0.031693f, -0.093219f, 0.038094f, -0.003009f, -0.050560f, 0.042448f, -0.004612f, -0.067909f, -0.057352f, -0.029623f, 0.044517f, 0.018050f, 0.046146f, 0.058459f, 0.017286f, -0.047003f, 0.014780f, 0.017098f, -0.060170f, -0.009542f, 0.033692f, -0.018585f, -0.065553f, -0.049464f, -0.079879f, -0.050670f, -0.011664f, 0.050570f, 0.072820f, 0.035339f, -0.004959f, 0.050430f, -0.012671f, -0.122968f, -0.097795f, 0.021664f, -0.049332f, -0.058160f, 0.083564f, 0.011296f, -0.112687f, -0.086767f, 0.029616f, 0.005466f, 0.019169f, 0.042140f, 0.100728f, 0.058114f, -0.008549f, 0.112564f, 0.035736f, -0.117462f, 0.001004f, -0.024778f, 0.060853f, 0.018631f, -0.038690f, 0.019280f, -0.029045f, -0.016861f, -0.025265f, 0.038676f, -0.007091f, 0.028396f, + 0.023489f, 0.030734f, -0.006778f, -0.029981f, -0.009859f, 0.021376f, -0.013090f, 0.018061f, 0.011362f, 0.013165f, -0.026377f, 0.003675f, 0.010704f, 0.001073f, 0.047485f, -0.001063f, 0.021113f, 0.005242f, -0.007829f, 0.025967f, 0.006147f, -0.003154f, 0.028241f, -0.012838f, -0.004274f, 0.017943f, 0.007124f, -0.001977f, -0.011411f, -0.015266f, 0.001849f, -0.017614f, -0.013620f, 0.010645f, 0.013608f, 0.092404f, 0.089382f, -0.027976f, 0.031039f, -0.036510f, 0.022299f, 0.001447f, 0.012849f, -0.043547f, 0.003360f, -0.037163f, -0.033484f, 0.000590f, -0.077203f, 0.002179f, -0.032925f, 0.008873f, 0.022547f, -0.000306f, 0.026139f, -0.037590f, 0.057311f, -0.028088f, -0.001155f, 0.040035f, -0.037543f, 0.014936f, 0.028530f, 0.035564f, 0.004931f, 0.013059f, 0.008575f, -0.055027f, -0.030973f, -0.008583f, 0.008009f, 0.008922f, -0.008407f, 0.037094f, -0.012019f, -0.000118f, -0.007188f, -0.015504f, 0.012802f, 0.007709f, -0.043978f, 0.013296f, -0.035382f, 0.010046f, -0.084743f, -0.003687f, -0.002305f, 0.000222f, 0.034332f, -0.013522f, -0.031025f, -0.013365f, 0.031521f, 0.000305f, -0.081919f, 0.114748f, + -0.010197f, -0.021461f, 0.024716f, -0.004584f, -0.017028f, -0.021028f, -0.022971f, -0.024105f, 0.078224f, -0.029924f, -0.045634f, 0.039274f, 0.003595f, -0.061493f, -0.014807f, 0.026272f, 0.020383f, -0.020007f, 0.042099f, -0.007061f, -0.011804f, 0.039524f, -0.029010f, -0.026070f, 0.049282f, -0.021507f, -0.008022f, -0.002305f, 0.020772f, 0.010525f, -0.000708f, -0.003089f, 0.001036f, 0.009749f, -0.010358f, -0.000387f, 0.009503f, 0.010666f, 0.012108f, -0.029984f, 0.007646f, 0.015693f, -0.029713f, 0.002867f, 0.006001f, -0.004877f, -0.012134f, 0.012290f, 0.003207f, -0.010309f, 0.001532f, -0.000649f, -0.005156f, -0.036844f, 0.020962f, -0.021658f, 0.006494f, 0.006657f, -0.033840f, -0.001523f, 0.001472f, 0.000148f, -0.000652f, -0.011023f, -0.001836f, 0.009888f, -0.001545f, -0.072586f, -0.107567f, -0.103111f, 0.228437f, 0.189876f, 0.215850f, 0.488305f, 0.127567f, -0.122178f, 0.038432f, -0.391412f, -0.415290f, -0.102628f, -0.261056f, -0.201625f, 0.123281f, -0.064041f, 0.025584f, 0.311162f, 0.154253f, 0.230674f, 0.442700f, 0.295266f, 0.077032f, 0.064306f, -0.130653f, -0.403059f, -0.308189f, -0.235682f, + -0.476458f, -0.192643f, 0.011301f, -0.084223f, -0.038068f, 0.241059f, 0.063773f, 0.032459f, 0.298323f, 0.037066f, 0.071250f, 0.424080f, 0.311577f, 0.197450f, 0.400716f, 0.199757f, -0.070494f, -0.005988f, -0.127014f, -0.624376f, -0.545060f, -0.440241f, -0.684428f, -0.521333f, -0.184891f, -0.246963f, 0.055539f, 0.475215f, 0.424202f, 0.587394f, 0.741393f, 0.551785f, 0.430169f, 0.418602f, 0.231369f, -0.078447f, -0.149510f, -0.340607f, -0.486475f, -0.477657f, -0.414102f, -0.474187f, -0.485424f, -0.390214f, -0.218500f, -0.158348f, 0.058520f, 0.371539f, 0.535607f, 0.764897f, 0.860173f, 0.513460f, 0.124230f, -0.073992f, -0.519084f, -0.493899f, -0.376592f, -0.292721f, -0.109399f, 0.054255f, 0.039877f, 0.052168f, 0.065318f, 0.030170f, 0.076996f, 0.108601f, 0.080243f, 0.131240f, 0.074065f, -0.034757f, -0.042350f, -0.117770f, -0.214542f, -0.059716f, -0.068114f, -0.078299f, 0.065425f, 0.055980f, -0.074059f, -0.094941f, -0.175354f, -0.285276f, -0.120947f, 0.159996f, 0.273548f, 0.532502f, 0.642740f, 0.436360f, 0.269884f, 0.070656f, -0.244208f, -0.356191f, -0.402866f, -0.470650f, -0.442619f, -0.340352f, + -0.276505f, -0.229417f, -0.140510f, -0.037888f, 0.114358f, 0.404628f, 0.566067f, 0.501938f, 0.359618f, 0.220305f, 0.044583f, -0.092457f, -0.138875f, -0.175045f, -0.126414f, -0.038056f, -0.011547f, -0.041284f, -0.064633f, -0.100537f, -0.157002f, -0.202540f, -0.196351f, -0.198117f, -0.120746f, 0.005950f, 0.056511f, 0.112177f, 0.147845f, 0.132421f, 0.076330f, 0.028348f, 0.008473f, 0.002222f, 0.001551f}, + {0.016671f, -0.002219f, 0.001353f, 0.013061f, -0.001661f, -0.000641f, -0.003788f, 0.014250f, 0.000860f, 0.006911f, 0.004244f, 0.004169f, -0.005871f, 0.002927f, -0.009106f, -0.001030f, 0.007097f, 0.001398f, 0.004164f, 0.006626f, -0.011252f, -0.007911f, 0.002700f, -0.000600f, 0.008381f, 0.005052f, -0.000418f, -0.004684f, -0.002906f, -0.005786f, -0.000900f, -0.000810f, -0.000848f, 0.001547f, 0.002200f, -0.005043f, 0.008396f, -0.001973f, -0.001296f, 0.002819f, -0.010675f, -0.002514f, 0.004635f, 0.001587f, 0.010556f, -0.000089f, -0.000762f, 0.002010f, 0.000728f, 0.004339f, 0.007310f, 0.009233f, -0.000529f, -0.001010f, 0.000175f, -0.005394f, -0.006772f, 0.003689f, 0.006061f, -0.004305f, -0.004072f, -0.002810f, 0.007726f, 0.004492f, -0.001059f, 0.001147f, -0.009102f, -0.002680f, 0.004736f, 0.003867f, 0.006735f, -0.009848f, 0.002224f, 0.003644f, -0.002041f, 0.006845f, -0.000445f, 0.005958f, 0.002863f, 0.001874f, 0.007633f, 0.003727f, 0.001924f, -0.000001f, 0.000896f, -0.001884f, 0.000636f, 0.000997f, -0.000608f, -0.002778f, 0.001334f, 0.001255f, -0.002016f, -0.000348f, -0.001364f, 0.001351f, + 0.002186f, 0.000021f, -0.000292f, -0.000192f, -0.002048f, 0.000930f, -0.000733f, 0.001622f, 0.000784f, 0.000449f, 0.000346f, -0.000981f, 0.000534f, 0.000178f, 0.000850f, -0.001690f, -0.000791f, -0.000431f, 0.000200f, 0.021638f, 0.006032f, -0.005027f, 0.011119f, -0.005432f, 0.011572f, -0.003882f, -0.005186f, 0.005802f, 0.010827f, -0.000382f, -0.005259f, 0.002825f, 0.002326f, -0.000490f, -0.015259f, 0.003544f, 0.004558f, 0.001184f, 0.009642f, 0.012843f, 0.006988f, 0.012648f, 0.008700f, 0.007692f, -0.001990f, 0.008548f, 0.004212f, -0.006548f, 0.002515f, 0.003931f, -0.008308f, -0.010683f, -0.001557f, 0.004164f, 0.000247f, -0.003874f, -0.005067f, -0.005045f, -0.002404f, 0.005717f, 0.011600f, 0.009728f, 0.003769f, 0.007468f, -0.012004f, 0.000740f, -0.002995f, 0.000096f, -0.013788f, 0.005127f, -0.001241f, -0.003291f, -0.000445f, -0.003784f, -0.006765f, -0.004836f, 0.004965f, 0.001152f, 0.003833f, -0.005071f, 0.009569f, 0.002425f, -0.010863f, 0.004523f, 0.001496f, 0.003043f, 0.006114f, 0.001819f, 0.011133f, -0.003519f, 0.001318f, -0.012875f, 0.002559f, 0.001244f, 0.000481f, 0.000309f, + -0.002311f, 0.009166f, -0.002686f, -0.004250f, 0.007066f, -0.007189f, -0.003394f, -0.002961f, -0.001219f, -0.003343f, 0.002444f, 0.000630f, 0.001335f, -0.000076f, -0.000193f, 0.000139f, -0.001188f, 0.000812f, 0.001334f, -0.000441f, -0.000434f, -0.000036f, -0.002251f, -0.003858f, 0.001566f, 0.000506f, -0.002933f, -0.000374f, -0.000203f, -0.000634f, -0.003577f, 0.000990f, 0.000122f, -0.000079f, 0.000396f, 0.000690f, 0.000546f, -0.001364f, 0.000091f, -0.002513f, 0.001206f, -0.004521f, -0.004291f, -0.001559f, 0.004155f, -0.007557f, 0.002292f, -0.014800f, 0.002873f, 0.002643f, -0.001589f, 0.010357f, 0.000784f, -0.001294f, 0.001062f, 0.005426f, -0.008877f, 0.001159f, 0.002873f, 0.005619f, -0.012678f, -0.006606f, -0.004711f, 0.004568f, 0.002037f, -0.004140f, -0.012813f, 0.003012f, -0.012745f, -0.000911f, 0.005223f, -0.002506f, 0.004006f, -0.002345f, 0.008783f, 0.012729f, 0.006908f, -0.006774f, 0.001364f, 0.009618f, 0.006134f, -0.006145f, 0.005176f, 0.001386f, -0.009907f, 0.003403f, 0.013896f, 0.006341f, 0.004738f, 0.015247f, 0.001496f, -0.005954f, -0.011643f, -0.000635f, -0.006484f, -0.008039f, + -0.003634f, 0.008330f, -0.007904f, 0.002679f, -0.004670f, -0.004600f, 0.009968f, -0.001411f, 0.001752f, 0.007731f, 0.010817f, -0.004871f, -0.009702f, 0.012377f, 0.009710f, 0.006000f, 0.000702f, -0.007631f, 0.001321f, 0.009756f, -0.009894f, 0.002930f, -0.006405f, -0.000338f, 0.006236f, -0.005857f, -0.000199f, -0.011161f, -0.002790f, -0.001092f, 0.001801f, -0.000708f, -0.004054f, -0.000619f, 0.002236f, -0.003381f, -0.000719f, 0.001392f, 0.001390f, 0.000827f, 0.001036f, -0.000290f, -0.000679f, -0.004477f, 0.002469f, -0.000361f, 0.002540f, -0.001808f, -0.002740f, 0.000894f, 0.002417f, -0.001625f, 0.002151f, -0.000467f, -0.000002f, -0.000304f, -0.000319f, 0.002300f, -0.001279f, 0.000819f, -0.001292f, -0.029090f, -0.010609f, -0.004503f, 0.015930f, -0.006062f, -0.002361f, -0.009422f, -0.007920f, -0.001384f, -0.020930f, 0.011723f, 0.003913f, -0.000620f, -0.007712f, 0.011543f, -0.003224f, 0.005851f, -0.004652f, 0.003688f, 0.007409f, -0.009237f, 0.001008f, 0.010149f, 0.005783f, 0.004076f, 0.010913f, 0.009709f, -0.006067f, -0.007803f, -0.009673f, -0.000179f, -0.012729f, 0.003031f, -0.016824f, -0.003245f, + 0.012461f, 0.006516f, -0.004236f, -0.001328f, -0.012645f, 0.005749f, -0.005382f, 0.011170f, -0.006399f, -0.011492f, -0.002314f, -0.004744f, -0.009386f, 0.003642f, -0.002115f, -0.006015f, -0.006071f, -0.020345f, 0.002827f, -0.006109f, -0.015021f, -0.004019f, 0.009342f, 0.004757f, -0.007744f, 0.006430f, 0.008331f, 0.007989f, 0.003023f, -0.010403f, -0.001680f, -0.002315f, 0.007255f, -0.007312f, -0.002753f, 0.003787f, 0.003909f, -0.011384f, -0.013496f, -0.024343f, -0.004106f, -0.014140f, 0.004712f, -0.000550f, -0.003317f, 0.007155f, -0.001451f, -0.003259f, 0.003183f, 0.004880f, 0.004754f, 0.003647f, 0.008537f, -0.003618f, -0.002915f, -0.002289f, 0.001312f, 0.000427f, -0.001858f, 0.002336f, 0.003432f, -0.000747f, 0.000861f, -0.001483f, -0.001853f, -0.000358f, -0.001177f, 0.000352f, 0.000813f, 0.000102f, -0.002059f, 0.000333f, -0.001362f, -0.000550f, 0.001295f, 0.002733f, -0.001133f, 0.003274f, 0.004069f, 0.000630f, -0.001070f, -0.003460f, -0.000612f, 0.002332f, 0.001638f, -0.025258f, -0.010152f, -0.004498f, -0.007527f, 0.008638f, 0.011214f, 0.010637f, -0.021155f, -0.015739f, 0.006036f, 0.025757f, + 0.015173f, 0.000014f, 0.003623f, 0.007355f, -0.009289f, 0.006128f, -0.008616f, 0.006213f, 0.009097f, 0.001432f, 0.007291f, 0.002308f, -0.000558f, 0.003824f, 0.002212f, -0.006881f, -0.008783f, 0.012087f, 0.004847f, -0.008801f, 0.008597f, -0.004796f, -0.000941f, 0.020763f, -0.009956f, 0.011758f, 0.023150f, 0.009476f, -0.001376f, 0.000900f, -0.008420f, 0.010853f, -0.011134f, -0.006055f, -0.018680f, 0.003512f, 0.014310f, -0.000360f, -0.013240f, -0.004700f, -0.018749f, -0.009495f, -0.003528f, -0.026592f, -0.014526f, -0.002635f, 0.002760f, -0.011649f, 0.005839f, -0.003095f, -0.009251f, 0.009941f, 0.029329f, 0.002720f, 0.014919f, 0.010149f, 0.008746f, -0.009322f, 0.003849f, -0.015873f, 0.001628f, 0.004537f, 0.003489f, -0.006182f, 0.000077f, -0.016122f, -0.005675f, -0.005675f, -0.001212f, 0.007794f, 0.008316f, -0.000407f, 0.003195f, 0.004527f, -0.002373f, -0.001795f, -0.001554f, 0.001469f, 0.000116f, 0.001088f, 0.000808f, 0.002529f, -0.001435f, -0.000131f, -0.003935f, -0.000523f, -0.000674f, 0.002710f, 0.001503f, -0.001745f, -0.002407f, -0.002303f, -0.002266f, -0.000792f, -0.002767f, 0.000908f, + 0.004880f, -0.003982f, -0.000589f, 0.001636f, 0.002740f, 0.039319f, 0.025151f, -0.013770f, 0.005253f, 0.012530f, -0.005063f, 0.007092f, -0.002287f, 0.011675f, 0.006126f, 0.003610f, 0.010943f, 0.005898f, 0.005505f, -0.003542f, -0.026254f, 0.012470f, -0.004322f, -0.006205f, 0.020862f, 0.012613f, 0.007327f, 0.009350f, 0.007262f, 0.005074f, -0.003867f, 0.002875f, 0.001020f, -0.006957f, 0.005646f, 0.008756f, -0.014733f, 0.002665f, -0.009473f, 0.006943f, 0.008434f, -0.023503f, -0.000206f, -0.027934f, 0.000654f, 0.003274f, 0.002531f, 0.007380f, 0.019102f, -0.002508f, -0.009634f, -0.005002f, -0.005091f, -0.007490f, 0.005623f, 0.005672f, 0.002006f, -0.003275f, -0.003229f, 0.018197f, -0.005929f, -0.003878f, -0.009870f, 0.016140f, -0.002310f, 0.013531f, -0.006292f, 0.014473f, -0.013962f, -0.029918f, -0.008663f, 0.001657f, 0.006185f, 0.009841f, -0.009835f, -0.007660f, 0.004243f, 0.002473f, -0.004469f, -0.007959f, 0.018747f, -0.007481f, 0.017842f, 0.004458f, 0.012656f, 0.004705f, 0.009266f, 0.007456f, -0.003029f, -0.001419f, 0.003742f, -0.000745f, 0.009807f, 0.000028f, -0.003028f, 0.000657f, + -0.010641f, -0.002366f, -0.002337f, 0.000524f, -0.003448f, -0.001613f, -0.001053f, -0.000488f, -0.001083f, -0.005901f, -0.004436f, 0.001143f, 0.000555f, -0.006599f, -0.000220f, 0.000699f, 0.001100f, 0.002355f, 0.001266f, 0.006015f, 0.000441f, -0.002359f, -0.000092f, -0.001099f, -0.002739f, -0.003673f, -0.001192f, 0.018428f, -0.007005f, -0.012347f, -0.000511f, 0.001889f, -0.017507f, -0.013797f, -0.004328f, 0.004708f, -0.002574f, 0.022728f, 0.013724f, 0.000528f, 0.021809f, 0.007774f, 0.006405f, -0.018741f, 0.017538f, -0.003360f, -0.004365f, -0.015826f, -0.007085f, 0.013881f, 0.013819f, -0.004028f, 0.009170f, -0.019023f, -0.002644f, 0.012611f, 0.009586f, -0.007180f, -0.013427f, -0.007656f, -0.008296f, -0.010480f, -0.008622f, 0.001953f, -0.014121f, -0.001484f, 0.019524f, -0.009523f, 0.002255f, -0.000866f, -0.004495f, 0.007481f, -0.003118f, 0.012623f, 0.000010f, 0.017854f, -0.004629f, -0.011479f, 0.006496f, -0.009103f, -0.008891f, -0.009107f, -0.025562f, 0.002814f, 0.010556f, 0.015055f, 0.010943f, 0.019830f, -0.002074f, -0.007850f, 0.011526f, -0.014370f, 0.003274f, 0.002026f, -0.002166f, 0.012779f, + 0.012051f, -0.003289f, -0.015468f, 0.002905f, -0.008010f, -0.014880f, -0.013660f, 0.007320f, 0.013150f, 0.008078f, -0.028589f, 0.006241f, 0.002993f, -0.001618f, 0.013415f, 0.007068f, 0.010966f, 0.003965f, -0.001124f, 0.014251f, 0.001887f, 0.006358f, 0.005194f, 0.000929f, -0.006553f, 0.000841f, -0.003683f, -0.008172f, 0.001448f, 0.002190f, 0.003707f, -0.001181f, 0.000957f, 0.000659f, 0.000630f, 0.002594f, 0.001769f, 0.001712f, -0.000377f, -0.005267f, 0.003474f, -0.002280f, -0.002338f, -0.002144f, -0.003660f, 0.006297f, 0.007326f, 0.006028f, 0.002449f, 0.000425f, 0.000987f, -0.001785f, 0.004795f, -0.022483f, -0.013162f, 0.002375f, -0.012843f, -0.033279f, 0.025222f, -0.000551f, -0.001653f, 0.003197f, 0.001998f, -0.022009f, 0.015401f, -0.022945f, 0.002053f, 0.010504f, -0.003011f, 0.003833f, 0.003712f, -0.024683f, -0.008303f, -0.010990f, -0.002274f, 0.005084f, -0.008102f, -0.005132f, -0.000988f, -0.001431f, 0.002278f, 0.010358f, 0.005550f, 0.022248f, -0.008047f, 0.030530f, -0.002118f, 0.000861f, -0.019926f, -0.002925f, 0.014843f, -0.002907f, -0.030656f, 0.012427f, 0.014281f, -0.009086f, + 0.007565f, -0.011416f, 0.021279f, 0.011809f, -0.000584f, -0.001203f, -0.013623f, -0.008653f, -0.014910f, 0.014037f, 0.013819f, 0.006124f, 0.001594f, 0.006358f, -0.012016f, -0.031595f, -0.011556f, 0.011164f, 0.004884f, -0.023410f, 0.000614f, 0.002852f, 0.003236f, -0.011182f, 0.008099f, 0.016767f, 0.008634f, 0.000439f, 0.006775f, 0.011574f, -0.006460f, 0.017191f, 0.000287f, -0.000344f, -0.016916f, -0.021511f, 0.013911f, -0.006472f, 0.006906f, 0.007152f, -0.001169f, -0.004503f, -0.004733f, -0.003481f, 0.002205f, -0.005180f, 0.007010f, 0.001774f, -0.001955f, 0.001943f, -0.002512f, 0.000445f, -0.008860f, 0.002386f, 0.000663f, -0.001362f, -0.004956f, 0.001838f, -0.004393f, -0.000048f, 0.001362f, -0.000704f, -0.002901f, 0.000152f, -0.002914f, 0.010898f, 0.008070f, 0.003255f, -0.001312f, -0.000689f, -0.003161f, 0.000295f, -0.001297f, 0.007069f, -0.002382f, -0.000667f, 0.006429f, 0.001781f, 0.002628f, 0.005034f, -0.003449f, -0.001541f, 0.004767f, 0.003212f, -0.001484f, -0.000480f, -0.035002f, 0.018790f, -0.004715f, 0.006868f, -0.010312f, -0.005753f, 0.014823f, -0.017151f, 0.016660f, -0.010406f, + -0.019834f, 0.008930f, -0.010657f, 0.042341f, 0.006369f, -0.014924f, -0.020553f, -0.003796f, -0.025505f, -0.011846f, -0.027476f, -0.001721f, 0.018470f, -0.013157f, 0.011416f, 0.018479f, -0.017168f, -0.000049f, -0.020049f, 0.011169f, 0.004023f, -0.000852f, 0.011903f, -0.012654f, -0.017977f, -0.015348f, 0.001096f, 0.003279f, 0.015197f, -0.021934f, 0.015578f, 0.002916f, -0.032164f, -0.017850f, -0.025952f, -0.010807f, 0.009928f, -0.008896f, -0.008630f, -0.049621f, -0.000985f, -0.011002f, -0.004486f, -0.031881f, -0.011007f, -0.004338f, 0.002504f, 0.025745f, 0.023637f, 0.019820f, 0.011531f, 0.024809f, -0.026817f, 0.020791f, 0.002954f, 0.009617f, 0.007083f, -0.019335f, 0.029886f, 0.018353f, 0.011814f, -0.013264f, -0.017571f, -0.012828f, 0.017368f, 0.001844f, 0.000120f, 0.009233f, 0.004573f, 0.009715f, -0.008644f, 0.026070f, 0.013821f, -0.002965f, -0.004235f, 0.005729f, 0.005338f, 0.003046f, -0.001525f, -0.001756f, 0.002482f, -0.000570f, -0.000415f, -0.011024f, 0.000687f, -0.006439f, 0.000440f, 0.003297f, 0.001251f, -0.000820f, 0.000102f, 0.001990f, 0.001943f, -0.010504f, -0.002692f, 0.003495f, + -0.002945f, -0.004208f, -0.000196f, 0.001218f, 0.001757f, 0.001834f, -0.001448f, -0.002317f, 0.001851f, -0.004689f, -0.007611f, -0.002120f, -0.001841f, -0.002689f, 0.001485f, -0.000785f, 0.006916f, 0.003020f, -0.002684f, 0.002823f, -0.001529f, 0.013271f, 0.024630f, 0.026681f, 0.010917f, 0.018665f, 0.015123f, 0.009027f, -0.004886f, 0.001993f, -0.007287f, 0.000615f, -0.002518f, -0.016135f, 0.020532f, 0.032571f, 0.012980f, -0.008924f, 0.014597f, 0.013872f, -0.000578f, 0.008611f, -0.015381f, -0.029638f, -0.019725f, -0.013499f, 0.008558f, -0.003601f, -0.015498f, 0.011558f, -0.005341f, -0.013865f, -0.000195f, 0.023990f, 0.012074f, 0.017770f, 0.006204f, 0.013078f, 0.014516f, -0.003345f, 0.013291f, -0.005196f, -0.015260f, 0.006412f, -0.017669f, 0.006568f, 0.006984f, -0.025953f, -0.016888f, 0.010622f, 0.026840f, -0.013947f, 0.018691f, 0.026127f, -0.021653f, 0.000878f, 0.023795f, 0.002563f, -0.008758f, -0.002023f, -0.012276f, -0.021387f, 0.000208f, -0.006505f, -0.011267f, 0.014665f, 0.000679f, -0.024482f, 0.031285f, -0.012980f, 0.025359f, -0.030108f, -0.020634f, 0.014660f, -0.018567f, 0.010180f, + -0.012513f, -0.009119f, -0.017451f, -0.010689f, -0.014225f, -0.035551f, 0.005766f, 0.021627f, -0.010104f, -0.001682f, 0.014948f, 0.015969f, 0.011295f, -0.002327f, -0.001407f, -0.009296f, -0.002998f, -0.004146f, -0.004935f, 0.003704f, -0.001103f, -0.003497f, 0.005068f, 0.004574f, -0.002367f, -0.000609f, -0.006512f, 0.002634f, -0.005755f, -0.010337f, -0.000885f, 0.009339f, -0.000098f, -0.005494f, -0.001600f, 0.015523f, 0.007665f, 0.000357f, -0.004914f, -0.005885f, -0.004372f, 0.000762f, 0.000866f, -0.004981f, -0.002013f, -0.000022f, 0.001625f, 0.006045f, 0.001263f, 0.009654f, 0.005687f, 0.006848f, 0.002450f, 0.002938f, -0.001716f, 0.000784f, -0.022430f, 0.014484f, -0.009760f, -0.023836f, 0.034453f, 0.018067f, -0.024495f, 0.017570f, 0.015505f, 0.004865f, 0.029021f, -0.059465f, 0.004184f, 0.024912f, 0.008315f, 0.002557f, 0.025960f, 0.001375f, 0.014153f, -0.034230f, -0.004799f, 0.009780f, 0.000305f, -0.016950f, 0.006617f, 0.014285f, 0.006597f, 0.006962f, 0.018299f, 0.015710f, 0.024363f, 0.019630f, -0.007697f, -0.007498f, 0.018820f, -0.011284f, 0.013159f, -0.021091f, -0.011808f, -0.027088f, + -0.012660f, 0.015539f, 0.005148f, -0.005952f, 0.022442f, -0.026408f, -0.036342f, -0.058213f, 0.018044f, 0.020634f, 0.015713f, 0.012784f, -0.013979f, 0.009711f, -0.008180f, 0.022529f, 0.058966f, -0.008818f, -0.012633f, -0.025335f, -0.008332f, 0.022533f, -0.015262f, 0.013080f, 0.021630f, 0.003948f, -0.000662f, -0.016788f, -0.005151f, 0.008532f, -0.041151f, -0.037456f, 0.003617f, 0.005507f, -0.014731f, 0.021158f, 0.015678f, 0.030286f, 0.048214f, 0.019669f, -0.011451f, -0.005514f, 0.010010f, 0.000113f, -0.026920f, 0.013077f, 0.010988f, 0.009920f, 0.002941f, 0.012823f, -0.000741f, 0.007271f, 0.005494f, 0.004224f, -0.006322f, 0.000883f, -0.000883f, -0.000453f, 0.009640f, 0.003323f, -0.000434f, 0.005560f, -0.010896f, 0.003421f, 0.001607f, -0.000950f, 0.010147f, 0.002463f, -0.003369f, -0.001384f, -0.006783f, 0.018942f, 0.000907f, 0.003581f, 0.007452f, -0.002333f, -0.003111f, 0.010845f, -0.011665f, 0.010790f, -0.008631f, 0.009016f, -0.000941f, -0.000322f, -0.002367f, 0.003920f, -0.002106f, 0.009310f, -0.007689f, -0.002589f, 0.002350f, -0.001213f, -0.002898f, -0.005168f, 0.006088f, 0.088737f, + 0.050044f, 0.032037f, -0.008266f, -0.008942f, -0.001185f, -0.007460f, -0.009203f, -0.013658f, -0.016650f, -0.028350f, 0.001179f, -0.001915f, 0.006870f, 0.012500f, 0.023554f, 0.035842f, -0.004854f, -0.046406f, -0.018256f, 0.040012f, -0.006297f, 0.015057f, -0.005243f, -0.000572f, 0.026517f, 0.009308f, 0.020119f, 0.011979f, -0.000906f, -0.001099f, -0.000447f, 0.013527f, 0.017081f, -0.006555f, -0.026267f, 0.034406f, 0.024512f, 0.017568f, 0.006357f, 0.009001f, -0.013998f, -0.025856f, 0.035690f, 0.020060f, 0.009136f, -0.016487f, -0.018527f, -0.025796f, -0.016020f, -0.004499f, -0.016273f, 0.009084f, -0.033205f, 0.004691f, 0.024383f, -0.015799f, 0.008555f, 0.001590f, 0.003513f, -0.037711f, 0.013331f, -0.016130f, 0.027522f, -0.060631f, 0.010351f, -0.015763f, -0.020584f, 0.005141f, -0.012450f, 0.012607f, 0.011771f, -0.039460f, 0.000358f, 0.027780f, 0.004065f, 0.008228f, 0.017330f, 0.007217f, 0.028792f, 0.011890f, 0.006034f, 0.002049f, -0.004258f, 0.018707f, -0.036800f, -0.000584f, -0.002216f, -0.003256f, 0.001375f, -0.000941f, -0.000351f, -0.003081f, -0.005475f, -0.006949f, 0.011358f, 0.009685f, + -0.005095f, -0.000706f, -0.017657f, 0.001841f, -0.001168f, -0.017245f, -0.000150f, -0.025634f, -0.019633f, 0.008790f, 0.003210f, 0.013667f, -0.015367f, 0.006690f, 0.013260f, 0.003055f, -0.000640f, 0.003570f, 0.007079f, 0.000716f, -0.003903f, 0.014227f, 0.000037f, 0.004705f, -0.008350f, -0.006109f, 0.005808f, 0.008574f, 0.001433f, -0.054407f, -0.028051f, 0.004091f, -0.047937f, 0.011043f, 0.034681f, -0.016659f, 0.042172f, 0.049609f, 0.006238f, 0.024816f, 0.030492f, 0.013764f, -0.029387f, 0.019193f, 0.023251f, -0.001088f, 0.005827f, 0.016510f, 0.014480f, 0.035027f, 0.005899f, -0.013422f, 0.022257f, 0.008064f, -0.003542f, 0.000566f, 0.014897f, -0.020383f, -0.009316f, -0.008594f, 0.012416f, 0.006531f, -0.028902f, 0.008569f, 0.024008f, 0.000697f, 0.028950f, -0.027399f, -0.051935f, 0.004198f, 0.023194f, 0.035238f, 0.032560f, 0.016897f, 0.015409f, 0.012459f, -0.035317f, -0.010262f, -0.001555f, 0.026489f, 0.041719f, -0.014397f, 0.008921f, -0.015336f, 0.009804f, 0.006697f, 0.025361f, 0.039455f, -0.015277f, -0.017221f, -0.003519f, 0.021638f, 0.027647f, 0.038885f, 0.000867f, -0.041930f, + -0.039678f, -0.006417f, 0.005034f, 0.000169f, -0.018240f, 0.000454f, -0.047825f, -0.030769f, -0.028300f, -0.032069f, 0.013596f, 0.004968f, 0.038368f, 0.030776f, 0.011497f, -0.018348f, -0.018448f, -0.017055f, -0.015615f, -0.026637f, 0.012490f, 0.008393f, 0.004843f, 0.017975f, 0.019852f, 0.000149f, 0.016923f, 0.003531f, 0.018077f, -0.006288f, 0.014976f, -0.004785f, -0.001463f, 0.004507f, -0.005638f, 0.025245f, 0.011260f, 0.015000f, 0.006670f, 0.017982f, 0.003921f, 0.008637f, 0.025651f, 0.022356f, 0.011859f, -0.001413f, -0.009977f, -0.008443f, -0.018317f, -0.010208f, -0.012060f, -0.007119f, -0.011130f, -0.013351f, -0.007834f, 0.007799f, 0.017061f, 0.004778f, -0.004126f, 0.000641f, -0.002645f, 0.010732f, 0.012576f, 0.010527f, -0.001220f, 0.004736f, 0.023079f, -0.050984f, 0.004642f, -0.010237f, 0.027942f, -0.015013f, -0.002298f, 0.008570f, 0.021168f, -0.028500f, -0.047837f, -0.008386f, -0.018735f, 0.001266f, -0.021581f, 0.012640f, 0.012572f, 0.001173f, -0.025809f, 0.016039f, 0.001623f, 0.043049f, -0.006883f, 0.023533f, -0.019931f, 0.044457f, 0.012849f, 0.027706f, 0.018673f, 0.030233f, + 0.044606f, -0.010978f, 0.017308f, -0.031318f, 0.032907f, 0.031882f, -0.000745f, 0.010283f, 0.032222f, -0.020747f, -0.019935f, -0.003410f, 0.064872f, 0.010425f, -0.018154f, 0.032092f, 0.004204f, 0.024580f, 0.035510f, 0.010226f, -0.002420f, 0.003209f, 0.005524f, 0.023303f, -0.008225f, 0.024997f, -0.017379f, 0.024394f, -0.013611f, 0.055237f, -0.008078f, 0.047475f, -0.043232f, -0.047598f, 0.065982f, -0.055436f, -0.029617f, 0.002058f, -0.017844f, -0.034484f, 0.030119f, -0.004206f, -0.042579f, -0.020316f, -0.021895f, -0.062763f, -0.023257f, 0.007519f, 0.014008f, -0.048479f, -0.012388f, 0.029076f, -0.005910f, 0.016605f, 0.028830f, -0.020867f, -0.004777f, 0.004477f, 0.018795f, 0.013306f, 0.014162f, -0.004926f, -0.002800f, 0.011422f, -0.001091f, -0.008029f, 0.006337f, 0.013195f, 0.002476f, 0.009082f, -0.000359f, -0.008964f, -0.000107f, 0.012124f, 0.004603f, -0.006632f, -0.015708f, -0.009748f, 0.018218f, -0.008731f, -0.024702f, 0.005535f, -0.014219f, -0.027128f, -0.000077f, 0.009753f, 0.000850f, -0.007290f, -0.002084f, 0.007010f, -0.005715f, -0.000005f, 0.009535f, -0.000896f, -0.004586f, -0.006145f, + 0.017266f, 0.032951f, 0.001718f, -0.012134f, -0.009844f, -0.005835f, -0.015839f, -0.003789f, -0.006698f, 0.006555f, -0.042696f, -0.028533f, 0.008368f, -0.055895f, -0.032539f, -0.038833f, -0.039438f, 0.048162f, -0.001107f, 0.001680f, 0.014432f, -0.014008f, -0.061345f, -0.045926f, -0.044912f, -0.091754f, 0.006755f, 0.010487f, 0.039802f, 0.023262f, 0.013889f, 0.019881f, 0.013882f, 0.004389f, -0.028819f, -0.042474f, -0.024355f, 0.033211f, -0.004008f, -0.024779f, -0.009867f, 0.032556f, -0.039004f, -0.025146f, -0.040060f, -0.019857f, -0.003224f, -0.038456f, 0.014598f, -0.031892f, 0.034945f, 0.024541f, -0.005143f, 0.024225f, -0.023362f, -0.048331f, 0.021480f, 0.028554f, -0.024790f, -0.055469f, 0.042262f, -0.003360f, 0.030698f, 0.025809f, -0.079389f, -0.056332f, 0.000849f, -0.012627f, 0.052212f, -0.029449f, -0.034074f, -0.008915f, 0.019481f, 0.003269f, -0.004447f, -0.017720f, 0.069261f, -0.033438f, -0.055743f, -0.075495f, 0.054790f, -0.012603f, -0.062088f, 0.029520f, 0.030035f, 0.018000f, 0.063209f, 0.067629f, 0.069404f, 0.029981f, -0.015231f, -0.005867f, -0.010265f, 0.023395f, -0.043714f, 0.028893f, + 0.005872f, 0.006073f, 0.021993f, 0.021361f, -0.017751f, 0.027221f, -0.020443f, 0.009479f, -0.029221f, -0.016346f, -0.011041f, -0.014795f, -0.005627f, -0.015965f, -0.003608f, 0.012056f, 0.031708f, 0.036940f, 0.002055f, 0.029145f, -0.016474f, 0.004833f, 0.017376f, 0.002989f, -0.031007f, 0.004624f, 0.008319f, -0.007979f, -0.022867f, -0.014226f, -0.013827f, 0.038460f, 0.024062f, 0.013029f, 0.018364f, 0.032632f, -0.004362f, -0.036948f, -0.023120f, -0.020830f, -0.026499f, -0.034206f, 0.006884f, -0.028502f, -0.050907f, -0.011649f, -0.010470f, 0.008442f, -0.051033f, -0.019445f, 0.022836f, 0.038829f, 0.077151f, 0.013373f, 0.040042f, 0.020338f, 0.018988f, -0.017142f, -0.006354f, -0.014529f, -0.043349f, -0.049547f, -0.071080f, -0.025037f, -0.064105f, -0.024347f, -0.033885f, -0.011818f, 0.033399f, 0.008959f, 0.022506f, 0.040661f, -0.000635f, 0.027652f, 0.007184f, 0.001946f, -0.001618f, -0.004733f, -0.054213f, 0.020035f, -0.007385f, -0.059915f, -0.038144f, 0.018206f, -0.039509f, -0.014349f, 0.013414f, 0.044430f, 0.052549f, 0.019062f, -0.011792f, 0.007857f, 0.034936f, 0.019603f, 0.006795f, -0.000539f, + -0.106196f, -0.020762f, 0.022606f, 0.027274f, 0.009951f, -0.003536f, -0.036298f, 0.025157f, -0.032465f, -0.023426f, -0.006986f, 0.006959f, -0.018389f, -0.055856f, 0.029361f, -0.006742f, 0.069327f, 0.027120f, 0.023192f, 0.027391f, 0.050758f, 0.116017f, 0.001002f, 0.002418f, -0.005624f, -0.033976f, 0.019765f, -0.023445f, 0.083256f, -0.007052f, -0.030926f, -0.026700f, 0.034729f, -0.045173f, -0.031573f, -0.005597f, 0.071088f, 0.002803f, 0.033499f, 0.053494f, 0.009924f, 0.043375f, 0.031787f, -0.005567f, 0.029075f, 0.032767f, 0.000264f, -0.021776f, -0.024673f, 0.007031f, 0.007386f, 0.027525f, 0.016631f, -0.000832f, -0.004901f, 0.005156f, 0.010222f, -0.019841f, -0.005053f, -0.004636f, -0.003493f, -0.031321f, 0.019073f, -0.022660f, 0.007176f, -0.004376f, -0.014581f, 0.004092f, 0.037652f, 0.033938f, -0.000794f, -0.002022f, -0.025368f, -0.009783f, -0.025224f, -0.003419f, -0.029217f, -0.040207f, 0.010976f, 0.028187f, 0.001045f, 0.001763f, 0.058622f, -0.007600f, 0.010315f, -0.064199f, -0.022264f, 0.076041f, -0.050831f, -0.013396f, -0.044075f, -0.128629f, -0.018731f, 0.039909f, 0.032242f, 0.006601f, + 0.008974f, -0.006647f, 0.071872f, -0.077572f, -0.000481f, -0.022112f, -0.052487f, -0.043787f, -0.006981f, 0.015097f, 0.012559f, 0.017726f, 0.046243f, 0.030570f, -0.033475f, -0.033331f, 0.092395f, 0.076126f, -0.006535f, 0.009161f, -0.010624f, 0.024999f, -0.000811f, 0.054403f, 0.019259f, 0.029043f, 0.007649f, 0.004457f, -0.096440f, 0.040052f, -0.004590f, -0.055038f, -0.028618f, 0.005732f, -0.015367f, -0.054782f, 0.052513f, -0.009108f, -0.039651f, -0.007957f, 0.005309f, 0.047192f, 0.052117f, 0.040219f, 0.014957f, 0.047057f, 0.049566f, -0.037368f, -0.041560f, -0.026053f, -0.007194f, 0.048738f, 0.064407f, 0.011331f, 0.022911f, 0.062417f, 0.036902f, -0.058130f, 0.042629f, 0.015884f, -0.013324f, 0.002499f, 0.119187f, -0.079044f, 0.060502f, 0.070022f, -0.070783f, -0.003933f, -0.046181f, -0.014567f, -0.101480f, 0.029229f, 0.044165f, -0.060641f, 0.036184f, -0.052455f, -0.038523f, 0.046158f, -0.029174f, -0.004101f, -0.017756f, 0.002368f, -0.025816f, 0.007913f, 0.011116f, -0.019043f, -0.027638f, -0.002016f, -0.029979f, 0.038645f, 0.006357f, -0.036115f, 0.007339f, -0.006008f, -0.020257f, -0.018940f, + 0.011852f, 0.024630f, 0.030236f, 0.012689f, -0.028371f, 0.071027f, -0.013760f, 0.007084f, -0.005240f, -0.037580f, 0.013704f, 0.020483f, -0.019723f, 0.030254f, 0.007059f, 0.022576f, -0.005965f, -0.036420f, 0.011573f, 0.054476f, -0.035106f, -0.051055f, -0.082637f, 0.016319f, -0.015810f, -0.026410f, -0.033413f, 0.018242f, -0.020272f, -0.009650f, 0.054388f, -0.017081f, -0.003033f, -0.042769f, 0.003502f, 0.027092f, -0.059727f, -0.037856f, -0.035725f, -0.017728f, 0.021758f, -0.080719f, -0.044797f, -0.116432f, 0.020256f, -0.001331f, -0.029513f, -0.013118f, -0.017144f, 0.024692f, 0.037368f, -0.041465f, 0.001585f, -0.014583f, -0.013952f, -0.072810f, 0.016013f, 0.055599f, 0.014785f, 0.042020f, 0.052997f, 0.047279f, -0.063658f, -0.019655f, -0.019198f, -0.030004f, 0.053630f, -0.054942f, -0.031535f, 0.001747f, 0.077863f, 0.017407f, -0.027274f, 0.078240f, -0.044043f, -0.041590f, 0.093587f, 0.089404f, 0.008696f, 0.022652f, -0.025403f, -0.085031f, -0.026054f, 0.085340f, -0.041378f, 0.077335f, -0.027882f, -0.122132f, -0.032082f, -0.057190f, 0.065139f, 0.000456f, 0.014676f, 0.058171f, -0.009202f, 0.047945f, + -0.062623f, -0.074064f, 0.057006f, -0.014942f, -0.124468f, 0.076852f, -0.039531f, 0.020899f, 0.025410f, -0.043672f, 0.082828f, -0.056535f, 0.030158f, -0.000947f, 0.022195f, 0.083657f, -0.021078f, -0.026524f, 0.003474f, -0.017497f, -0.022497f, -0.018978f, 0.009796f, 0.018775f, 0.004955f, -0.012058f, 0.010920f, -0.039922f, 0.036302f, 0.025098f, 0.020629f, 0.007955f, 0.000683f, -0.018683f, -0.019821f, -0.019433f, 0.017403f, 0.032680f, -0.031530f, 0.028340f, 0.066612f, 0.022172f, -0.056043f, 0.005465f, 0.021241f, -0.021036f, -0.036796f, 0.035175f, -0.031062f, -0.000725f, -0.002166f, -0.033833f, -0.042935f, -0.000453f, 0.025445f, -0.014456f, 0.057546f, -0.019085f, -0.036912f, 0.026269f, 0.022292f, 0.043050f, 0.003216f, -0.077554f, 0.045750f, 0.052723f, -0.064070f, 0.035023f, -0.000339f, -0.023209f, -0.027400f, -0.092474f, -0.040764f, 0.032454f, 0.005879f, 0.084808f, -0.068095f, -0.038559f, 0.015993f, -0.009402f, 0.054450f, -0.075634f, 0.000150f, 0.007738f, -0.063822f, 0.063880f, 0.035120f, 0.019487f, -0.029873f, 0.043748f, -0.051695f, 0.028623f, 0.022371f, 0.013466f, -0.003564f, -0.028927f, + 0.012131f, 0.058128f, -0.030428f, -0.011114f, 0.011512f, -0.045491f, 0.046576f, 0.001846f, 0.012323f, -0.062327f, 0.033807f, 0.008302f, 0.011603f, -0.146295f, 0.020247f, -0.041535f, 0.068578f, 0.056722f, 0.060301f, 0.030827f, -0.118847f, -0.020787f, 0.025703f, 0.002664f, 0.008099f, 0.083970f, -0.012301f, -0.050329f, -0.060335f, 0.002601f, -0.067125f, -0.058925f, -0.052129f, 0.025382f, -0.098007f, 0.069998f, 0.133773f, -0.034820f, -0.015778f, -0.104034f, -0.022479f, 0.040168f, 0.024913f, -0.034433f, -0.006845f, -0.125876f, -0.044014f, 0.126922f, 0.054241f, -0.039015f, 0.037397f, -0.071243f, -0.052510f, 0.014286f, 0.003196f, 0.008899f, -0.048086f, -0.016472f, -0.009745f, 0.000328f, -0.069858f, 0.015519f, -0.008569f, -0.021633f, 0.009835f, 0.029468f, -0.037894f, -0.018789f, -0.005503f, 0.014297f, -0.028964f, -0.007405f, -0.004528f, -0.027394f, 0.000984f, -0.051130f, 0.068037f, 0.022297f, -0.017072f, -0.006274f, -0.019211f, -0.002227f, 0.043926f, 0.013544f, -0.007331f, 0.023225f, -0.013356f, -0.063651f, 0.003661f, 0.003596f, 0.014293f, 0.029191f, -0.016101f, -0.011401f, 0.028786f, 0.034586f, + 0.015234f, -0.030223f, -0.095496f, 0.025952f, -0.041877f, -0.028499f, 0.029008f, -0.023395f, -0.033585f, 0.026575f, -0.044158f, -0.002721f, -0.050336f, 0.072676f, 0.001275f, -0.053153f, -0.015694f, 0.001200f, -0.005345f, 0.016879f, -0.035499f, -0.024621f, 0.007969f, 0.014606f, 0.008529f, 0.007080f, 0.027586f, -0.032021f, -0.012270f, -0.073585f, 0.027289f, 0.006794f, -0.022453f, 0.053009f, 0.029055f, -0.021895f, 0.081305f, 0.017874f, -0.051084f, 0.038413f, 0.006693f, 0.024922f, 0.053699f, -0.005213f, -0.013121f, 0.008147f, 0.044276f, 0.024729f, 0.001049f, -0.004803f, 0.047371f, -0.004509f, -0.054886f, -0.009836f, 0.010223f, 0.043061f, -0.019159f, 0.074370f, 0.082652f, -0.052801f, 0.043211f, 0.092400f, -0.024939f, 0.140496f, 0.079672f, -0.035714f, -0.031943f, -0.053540f, -0.059939f, -0.034424f, 0.018932f, -0.010982f, -0.010516f, -0.002341f, -0.008986f, -0.098970f, -0.037983f, -0.097728f, 0.022952f, 0.086657f, -0.032435f, -0.005797f, -0.047231f, 0.023094f, 0.006082f, 0.016274f, 0.024515f, 0.072606f, -0.003417f, 0.032696f, 0.034185f, -0.055464f, 0.002543f, -0.000659f, 0.012191f, 0.023492f, + -0.002914f, -0.013545f, 0.023044f, -0.003931f, -0.012439f, 0.002336f, -0.022547f, -0.006030f, 0.016963f, 0.002572f, -0.009559f, -0.053147f, 0.002914f, -0.024813f, -0.001761f, -0.021013f, 0.044175f, -0.015357f, 0.021664f, 0.025837f, -0.020724f, 0.031297f, 0.020702f, -0.000317f, -0.011105f, -0.020739f, 0.005198f, -0.002951f, -0.011252f, -0.002709f, 0.022101f, -0.017569f, 0.009749f, -0.006815f, 0.016008f, 0.124291f, 0.032942f, -0.044625f, 0.005073f, -0.058571f, -0.007563f, 0.020441f, -0.024180f, -0.031154f, -0.034547f, -0.013201f, 0.013452f, -0.007709f, -0.011015f, 0.015753f, 0.009242f, 0.021376f, -0.021979f, -0.013921f, 0.016080f, -0.005766f, 0.002988f, -0.032352f, 0.022076f, -0.037862f, 0.018312f, 0.012479f, -0.008001f, -0.001707f, 0.001546f, -0.021972f, 0.003849f, 0.004475f, -0.017344f, 0.031645f, -0.016852f, 0.007666f, 0.000351f, 0.001111f, 0.016175f, -0.015598f, -0.024088f, -0.007274f, 0.036758f, -0.027112f, 0.018107f, -0.049728f, -0.029397f, 0.009479f, -0.010561f, -0.000751f, -0.003086f, -0.029909f, 0.031982f, 0.025434f, 0.002525f, -0.021875f, -0.000871f, -0.013273f, 0.006759f, -0.016574f, + -0.000305f, -0.015899f, 0.012197f, -0.004327f, 0.003352f, 0.040344f, -0.033817f, -0.002807f, 0.006285f, 0.002571f, -0.007143f, 0.001080f, -0.015907f, 0.001054f, -0.013289f, 0.008425f, 0.016144f, -0.024236f, -0.019989f, 0.011837f, 0.001778f, -0.005612f, -0.019028f, 0.008508f, 0.002850f, -0.000635f, -0.004119f, 0.000371f, -0.004159f, 0.013649f, -0.008675f, -0.002270f, 0.006531f, -0.004284f, -0.000445f, 0.011008f, -0.006925f, -0.004491f, -0.002479f, 0.002551f, 0.011418f, -0.003526f, -0.012227f, 0.001035f, -0.007764f, 0.029264f, -0.011395f, 0.003865f, 0.006934f, -0.007047f, 0.023431f, -0.002994f, -0.019717f, 0.007526f, -0.011116f, 0.014604f, 0.007348f, -0.002812f, -0.000879f, -0.004945f, -0.005110f, 0.014469f, -0.008953f, -0.003847f, -0.001149f, -0.011888f, 0.016209f, -0.059631f, -0.088158f, 0.061438f, 0.282308f, 0.123681f, 0.129386f, -0.000827f, -0.261314f, -0.189126f, -0.098394f, -0.205926f, 0.099976f, 0.122882f, 0.063865f, 0.266350f, 0.119747f, -0.011530f, 0.088310f, -0.172299f, -0.219752f, -0.125384f, -0.153955f, -0.033139f, 0.118999f, 0.121939f, 0.051030f, 0.204822f, 0.101609f, -0.014175f, + 0.098469f, -0.090566f, -0.155556f, -0.089109f, -0.117035f, -0.183536f, 0.067588f, -0.001478f, -0.065968f, 0.197880f, 0.119029f, 0.067167f, 0.202390f, 0.049117f, -0.102881f, 0.099894f, -0.146667f, -0.166945f, -0.034286f, -0.175592f, -0.178460f, 0.070784f, -0.029596f, 0.043390f, 0.224819f, 0.154344f, 0.160272f, 0.151591f, 0.018264f, -0.084505f, -0.098123f, -0.163779f, -0.215416f, -0.112597f, -0.061465f, -0.044213f, 0.082113f, 0.128563f, 0.120292f, 0.170860f, 0.153882f, -0.023378f, -0.027341f, -0.027297f, -0.158250f, -0.047018f, -0.078008f, -0.117087f, 0.026146f, 0.048617f, 0.007660f, 0.109956f, 0.048728f, 0.001457f, 0.068438f, -0.052304f, -0.058270f, 0.002088f, -0.037924f, -0.011401f, 0.028484f, -0.005394f, 0.031641f, 0.042990f, -0.023524f, 0.033944f, 0.013470f, -0.050773f, 0.004743f, -0.023911f, -0.097587f, -0.000799f, -0.024886f, -0.040981f, 0.093976f, 0.028814f, 0.035240f, 0.124195f, 0.048904f, 0.036926f, 0.027121f, -0.060584f, -0.089693f, -0.082353f, -0.139566f, -0.113334f, -0.050853f, 0.005559f, 0.062712f, 0.144287f, 0.151925f, 0.140365f, 0.123621f, 0.077223f, -0.030424f, -0.086635f, + -0.174556f, -0.220259f, -0.170706f, -0.101514f, -0.036057f, 0.094137f, 0.172532f, 0.199253f, 0.203308f, 0.099085f, -0.024019f, -0.065708f, -0.081959f, -0.104886f, -0.076246f, -0.077385f, -0.063134f, -0.007723f, 0.020122f, 0.033231f, 0.054904f, 0.059901f, 0.054342f, 0.050691f, 0.028112f, 0.009877f, -0.005506f, -0.023450f, -0.037672f, -0.032073f, -0.020393f, -0.006436f, -0.001998f, 0.001574f, -0.001046f} + }, + { + {0.008957f, 0.005154f, -0.008124f, -0.001854f, -0.003005f, -0.000260f, 0.012161f, 0.000699f, -0.005208f, 0.006412f, 0.001303f, 0.000656f, 0.002136f, 0.001348f, 0.000104f, 0.009152f, 0.005154f, -0.006192f, -0.002392f, -0.000710f, -0.002181f, 0.002568f, 0.003901f, 0.002625f, -0.002658f, -0.003955f, 0.001516f, -0.007968f, -0.003630f, 0.005986f, 0.000520f, 0.004820f, 0.002460f, -0.003887f, 0.002939f, 0.000053f, -0.003439f, 0.008405f, -0.005630f, -0.002643f, 0.001066f, 0.002892f, -0.003852f, -0.001010f, -0.005529f, -0.010929f, 0.010217f, -0.002050f, -0.005708f, 0.000603f, 0.009392f, 0.000010f, 0.003629f, -0.004672f, -0.002741f, -0.001927f, 0.002880f, -0.003695f, 0.007509f, 0.001188f, 0.006774f, -0.009847f, 0.004157f, -0.002559f, 0.001637f, 0.004183f, -0.001708f, -0.001097f, -0.007286f, 0.000051f, 0.003924f, 0.000893f, -0.002038f, -0.000343f, 0.003491f, -0.001853f, -0.001950f, 0.005519f, -0.002529f, 0.001752f, -0.001061f, -0.000331f, -0.006804f, -0.002791f, -0.001865f, 0.002479f, -0.000522f, -0.003028f, -0.000536f, -0.000617f, -0.001924f, 0.001807f, -0.002300f, 0.000150f, 0.000496f, 0.001162f, + 0.001826f, -0.000807f, -0.001663f, 0.001729f, 0.000330f, -0.001246f, 0.000207f, 0.002946f, -0.000417f, -0.000285f, 0.001158f, 0.000102f, 0.000372f, 0.000478f, -0.000925f, -0.001596f, -0.000939f, 0.001261f, -0.000325f, 0.000142f, 0.000592f, -0.000855f, 0.000792f, 0.000020f, -0.000550f, 0.025675f, 0.008802f, -0.002032f, 0.006952f, 0.000355f, 0.012668f, 0.007960f, -0.001777f, 0.006513f, 0.011375f, 0.014878f, -0.008782f, -0.008595f, 0.003656f, -0.003468f, -0.002874f, 0.010639f, 0.008599f, 0.008190f, 0.005847f, 0.001101f, -0.000335f, -0.003715f, 0.004060f, 0.002835f, 0.013554f, 0.001371f, -0.000293f, -0.005995f, 0.002822f, 0.003969f, -0.000772f, -0.001848f, -0.002120f, 0.003675f, -0.000537f, -0.002186f, -0.004963f, 0.005263f, -0.001766f, -0.001782f, 0.007485f, 0.010618f, -0.002738f, -0.001303f, 0.006141f, 0.005494f, 0.009729f, 0.006026f, 0.002674f, 0.001000f, 0.008284f, 0.004686f, -0.011420f, 0.000010f, 0.003506f, -0.006582f, 0.000172f, 0.001074f, -0.008147f, 0.004147f, -0.003956f, 0.006107f, -0.001317f, -0.001057f, 0.003287f, 0.001055f, -0.005620f, -0.000504f, 0.003121f, -0.001107f, + -0.001391f, -0.001634f, 0.000606f, 0.006498f, 0.001147f, -0.006549f, -0.001557f, 0.001536f, -0.001953f, -0.000836f, 0.009617f, -0.001952f, 0.001169f, -0.001131f, -0.002461f, 0.002171f, 0.003577f, -0.000931f, 0.001625f, 0.001748f, -0.001783f, 0.000846f, 0.001600f, 0.000370f, -0.001187f, -0.003382f, -0.001051f, -0.002037f, -0.000947f, -0.000250f, 0.001071f, -0.000632f, 0.001289f, 0.000703f, -0.000295f, 0.008883f, -0.000692f, -0.016768f, -0.007806f, -0.003253f, -0.003629f, -0.009127f, -0.008384f, -0.005264f, 0.009088f, -0.009985f, -0.004663f, -0.004741f, 0.001828f, 0.015162f, -0.002276f, -0.001202f, 0.003708f, 0.008679f, -0.013268f, -0.002162f, 0.002708f, -0.005855f, 0.004685f, 0.007421f, -0.008181f, -0.000502f, 0.001055f, -0.004754f, -0.012042f, 0.002099f, -0.005070f, 0.001637f, -0.004668f, 0.006897f, -0.008314f, -0.007757f, -0.019112f, -0.005147f, 0.006573f, -0.001061f, -0.007333f, -0.003608f, -0.000922f, -0.007681f, 0.000388f, -0.001289f, 0.005282f, 0.004184f, -0.001979f, 0.000247f, -0.001955f, -0.008108f, 0.009911f, 0.001735f, 0.006699f, -0.002451f, 0.000025f, 0.001752f, 0.002899f, 0.007686f, + -0.002459f, -0.001845f, 0.002271f, -0.000207f, 0.008381f, 0.004489f, -0.007245f, -0.002865f, -0.001807f, -0.011461f, -0.001289f, -0.001073f, 0.006825f, -0.004385f, 0.006220f, 0.001081f, -0.000217f, -0.000626f, -0.001095f, -0.001226f, 0.001327f, -0.004616f, 0.002151f, -0.002656f, 0.002338f, 0.002008f, 0.000900f, 0.000587f, 0.006681f, 0.004917f, -0.001227f, 0.006097f, -0.000826f, -0.002033f, -0.001932f, 0.001206f, -0.000435f, 0.004179f, -0.001077f, 0.002616f, 0.002111f, -0.000353f, 0.001770f, 0.000016f, 0.001854f, 0.001851f, 0.000537f, 0.000648f, 0.002007f, 0.001357f, -0.002745f, -0.001492f, -0.000289f, 0.003400f, 0.003765f, 0.000031f, -0.000400f, 0.002065f, -0.036890f, -0.011556f, -0.003257f, -0.002985f, -0.003080f, 0.014236f, -0.013135f, 0.006318f, -0.003060f, 0.002886f, -0.003747f, -0.003060f, -0.010572f, 0.001725f, -0.003848f, 0.000788f, -0.015349f, 0.000295f, -0.001558f, -0.002766f, -0.000234f, 0.002871f, 0.002345f, -0.001472f, -0.001033f, -0.006177f, 0.001921f, -0.004963f, 0.003275f, -0.000025f, 0.002801f, 0.009574f, -0.002487f, -0.011013f, -0.004676f, -0.012893f, 0.001809f, 0.002299f, + -0.001138f, 0.002207f, -0.004466f, 0.004290f, 0.002249f, -0.005724f, 0.000526f, -0.015496f, -0.003264f, -0.010372f, 0.005700f, 0.010210f, -0.008977f, -0.000730f, 0.002975f, 0.001547f, -0.014720f, 0.002440f, 0.007632f, -0.007111f, -0.003329f, -0.016868f, 0.005764f, -0.002460f, 0.007012f, 0.012455f, 0.007165f, -0.010054f, 0.002179f, 0.002348f, 0.000607f, -0.011176f, 0.002939f, -0.004778f, 0.007486f, -0.003025f, -0.000296f, 0.003462f, 0.003094f, 0.008754f, 0.010053f, 0.006807f, -0.000435f, 0.002504f, 0.006022f, 0.002987f, -0.005806f, -0.001233f, -0.003845f, -0.003964f, 0.001880f, -0.000189f, 0.001048f, 0.000079f, -0.001080f, -0.000348f, 0.003688f, -0.001199f, -0.001084f, 0.000088f, -0.000920f, -0.002658f, 0.003362f, 0.000112f, 0.001650f, 0.003939f, -0.000382f, 0.000428f, -0.002996f, 0.001994f, 0.001496f, 0.000309f, -0.003007f, 0.001024f, 0.000167f, -0.022757f, 0.002443f, 0.004162f, -0.008254f, -0.000936f, 0.022255f, 0.017419f, 0.009344f, -0.002417f, -0.004119f, 0.011186f, 0.006901f, 0.003636f, 0.004143f, -0.008881f, 0.003002f, 0.000945f, 0.010435f, -0.009942f, -0.004643f, -0.001835f, + 0.001260f, -0.001973f, -0.011623f, -0.007762f, -0.008197f, -0.009539f, 0.005266f, 0.006526f, 0.004088f, 0.002937f, 0.000152f, 0.002872f, -0.001510f, -0.001172f, 0.000678f, -0.003422f, -0.001055f, 0.005141f, 0.003898f, -0.007784f, -0.008818f, -0.000744f, -0.008844f, 0.005337f, -0.002719f, -0.014795f, 0.001748f, 0.007631f, 0.010665f, 0.007482f, 0.000371f, 0.007073f, -0.010652f, -0.003340f, -0.004781f, -0.000676f, 0.000706f, 0.004824f, -0.003695f, -0.009651f, 0.011793f, -0.010674f, -0.005182f, 0.007380f, 0.017070f, 0.004105f, 0.003348f, -0.016643f, 0.018034f, 0.002219f, 0.012560f, 0.019451f, -0.004313f, 0.002125f, 0.002229f, -0.007885f, 0.016034f, 0.003814f, -0.005297f, 0.004485f, -0.002277f, 0.007979f, -0.013242f, -0.006993f, -0.013531f, -0.002573f, -0.006017f, 0.005462f, -0.003453f, 0.002351f, -0.006358f, -0.001575f, -0.001265f, -0.004018f, -0.000303f, -0.001483f, 0.001631f, -0.000251f, -0.001797f, -0.000894f, -0.000828f, 0.003237f, 0.000833f, -0.002392f, -0.005526f, 0.003115f, 0.003021f, 0.000600f, -0.000034f, -0.000052f, -0.002311f, 0.001010f, -0.001556f, 0.003372f, 0.000593f, 0.001914f, + -0.001944f, -0.002176f, -0.004395f, 0.034528f, 0.024324f, -0.008672f, -0.012673f, 0.019174f, 0.012502f, 0.020181f, 0.029639f, -0.014932f, 0.010285f, 0.004971f, 0.008621f, 0.003893f, 0.005189f, 0.012289f, 0.003072f, 0.012549f, 0.000436f, -0.007962f, 0.003385f, -0.002544f, 0.004244f, -0.001451f, 0.023016f, 0.003921f, 0.005089f, 0.003154f, 0.000930f, 0.008084f, 0.003439f, 0.000508f, -0.001461f, 0.005796f, -0.004430f, 0.011038f, -0.008563f, 0.013282f, -0.006245f, 0.008047f, 0.004205f, 0.004932f, 0.003898f, 0.019482f, 0.014876f, 0.000968f, -0.004178f, -0.010509f, 0.011531f, -0.012818f, 0.003234f, -0.005588f, 0.005676f, 0.012207f, 0.001471f, -0.020347f, -0.016535f, 0.001740f, -0.010287f, -0.011129f, -0.006435f, -0.012838f, 0.004592f, 0.022333f, 0.011193f, -0.008188f, 0.000516f, 0.002599f, -0.005847f, -0.006552f, -0.001090f, 0.010976f, 0.012178f, -0.012905f, 0.006120f, 0.014317f, 0.002841f, 0.004721f, 0.006895f, 0.011157f, -0.001929f, -0.007596f, 0.002953f, -0.003265f, -0.000662f, -0.007290f, 0.006735f, 0.010543f, 0.001598f, 0.001893f, 0.001442f, -0.007383f, -0.001088f, -0.000122f, + -0.000842f, 0.000749f, -0.001184f, 0.001216f, 0.000883f, 0.003610f, 0.000355f, -0.000067f, 0.000308f, 0.002317f, 0.003956f, 0.002073f, 0.004189f, 0.002300f, 0.000742f, 0.001234f, -0.000934f, -0.006888f, -0.007172f, 0.001441f, 0.005211f, 0.001336f, -0.001609f, 0.001270f, -0.000966f, 0.003305f, -0.002695f, -0.002452f, -0.004518f, 0.001936f, 0.015120f, 0.002982f, 0.021928f, -0.001853f, -0.000346f, -0.007221f, -0.005981f, 0.007473f, 0.016576f, -0.004770f, 0.004336f, 0.001286f, 0.017968f, 0.007563f, -0.008481f, -0.007661f, 0.001106f, 0.003887f, 0.016324f, 0.016184f, 0.024406f, 0.004558f, 0.006741f, -0.004184f, 0.009911f, 0.011462f, -0.004473f, -0.005500f, 0.008730f, -0.006628f, -0.009441f, 0.008936f, 0.002595f, -0.010728f, -0.013377f, 0.020381f, 0.010093f, -0.000542f, 0.012858f, 0.002668f, -0.009125f, 0.019372f, -0.004560f, 0.000741f, -0.000521f, 0.005148f, -0.007054f, 0.005151f, -0.007063f, 0.005021f, -0.006563f, 0.006056f, -0.005374f, 0.008184f, -0.006763f, -0.006649f, 0.017862f, -0.022241f, 0.001221f, 0.002845f, -0.007740f, 0.001688f, -0.025231f, -0.012192f, 0.012009f, -0.009852f, + 0.007368f, -0.002482f, 0.004963f, 0.002393f, 0.004254f, 0.002859f, -0.011449f, 0.006355f, -0.006663f, -0.000550f, -0.014533f, -0.007649f, -0.003651f, -0.003250f, 0.004121f, 0.013903f, 0.007907f, -0.010794f, 0.004245f, 0.002386f, 0.000090f, -0.005062f, 0.000748f, -0.000764f, 0.002684f, 0.001521f, -0.002799f, -0.003482f, -0.001460f, -0.000776f, -0.002120f, 0.008180f, 0.001476f, -0.002756f, -0.001692f, 0.002174f, -0.003234f, 0.000628f, 0.001608f, 0.000399f, 0.000455f, -0.008057f, -0.003360f, -0.001777f, 0.001292f, -0.002012f, -0.000303f, 0.005610f, -0.017828f, -0.015457f, -0.000002f, 0.006635f, 0.012593f, -0.014639f, 0.004264f, -0.013158f, 0.010899f, 0.008258f, -0.017958f, -0.003777f, 0.002007f, -0.021177f, -0.011952f, 0.012832f, -0.001593f, -0.000952f, 0.003122f, -0.001367f, -0.022055f, 0.020204f, 0.001383f, -0.014368f, -0.006896f, 0.002660f, -0.001773f, -0.013809f, -0.004044f, -0.007948f, 0.002377f, -0.000719f, -0.004302f, 0.004391f, -0.019098f, -0.008555f, 0.005053f, 0.025068f, -0.004101f, -0.014770f, -0.010332f, -0.008235f, 0.017181f, -0.018218f, -0.003538f, -0.001284f, -0.019343f, -0.024251f, + 0.006067f, -0.016814f, -0.002564f, 0.002494f, 0.012885f, 0.007132f, 0.001158f, 0.002758f, 0.015367f, -0.006597f, -0.004649f, 0.022609f, -0.014990f, 0.011776f, -0.005066f, -0.005654f, -0.002182f, -0.002730f, 0.024258f, 0.000565f, 0.009509f, -0.024837f, -0.017899f, 0.000611f, -0.003474f, 0.027769f, 0.001028f, 0.018940f, 0.008104f, 0.023685f, 0.014494f, -0.003571f, -0.016341f, -0.006175f, 0.011212f, 0.004849f, 0.007617f, -0.009122f, -0.010170f, -0.002830f, -0.003332f, 0.004929f, -0.002406f, -0.006635f, -0.001068f, -0.001594f, 0.000074f, -0.000792f, 0.001034f, -0.002690f, -0.003545f, 0.004550f, -0.000192f, 0.000319f, -0.001129f, -0.001971f, -0.001434f, 0.001265f, 0.003984f, -0.004005f, 0.001045f, -0.002441f, -0.003541f, 0.002645f, -0.000962f, -0.003380f, -0.003873f, -0.000733f, 0.003891f, 0.000440f, 0.000611f, 0.001473f, 0.006919f, -0.005691f, -0.004653f, -0.002868f, 0.000674f, 0.002803f, -0.029704f, 0.002813f, -0.002911f, 0.020287f, 0.002367f, -0.021609f, 0.025735f, 0.008231f, -0.015097f, -0.033171f, -0.013791f, 0.032667f, 0.001633f, -0.004209f, -0.005470f, 0.003316f, 0.001087f, 0.010038f, + 0.005353f, 0.010759f, -0.002340f, 0.019258f, -0.009963f, -0.022813f, 0.000972f, 0.001005f, -0.005412f, -0.000876f, 0.008538f, -0.005892f, -0.003473f, -0.002029f, 0.018209f, 0.014087f, 0.007324f, -0.001384f, -0.024776f, -0.000516f, -0.001284f, -0.001069f, -0.004109f, -0.000434f, -0.010835f, -0.020246f, -0.003156f, 0.013876f, 0.013540f, -0.005117f, 0.014547f, -0.004715f, 0.006293f, 0.015952f, 0.015297f, -0.033762f, 0.011590f, 0.012154f, 0.005068f, -0.008244f, -0.029569f, 0.017934f, 0.010619f, 0.005723f, -0.010532f, -0.005914f, -0.011928f, 0.006621f, -0.013234f, -0.002471f, 0.000266f, 0.012070f, -0.007462f, 0.006144f, 0.003376f, -0.021641f, -0.002945f, -0.014465f, 0.023749f, 0.010999f, -0.027819f, -0.005907f, 0.022122f, 0.011006f, -0.011428f, -0.005725f, -0.012626f, -0.004275f, 0.006650f, -0.003863f, -0.001470f, -0.004830f, -0.006026f, -0.010584f, 0.002120f, 0.000847f, -0.003333f, -0.001066f, 0.005505f, 0.003676f, -0.006613f, -0.002355f, 0.004997f, -0.001284f, 0.003844f, -0.004391f, -0.002977f, -0.000840f, 0.001083f, 0.005706f, -0.005943f, -0.004263f, 0.003142f, -0.006824f, -0.000439f, -0.004803f, + 0.003035f, -0.003805f, 0.006681f, -0.002287f, -0.001068f, -0.003346f, 0.004303f, 0.002868f, 0.007604f, 0.002368f, 0.018340f, 0.022855f, 0.023005f, 0.017972f, 0.022551f, -0.028424f, -0.018939f, -0.009679f, -0.009511f, -0.013511f, -0.010729f, -0.022779f, -0.008019f, 0.001739f, 0.013467f, 0.000174f, -0.013382f, -0.000431f, 0.013452f, 0.000851f, -0.011586f, -0.005145f, 0.030895f, 0.003200f, 0.011461f, 0.003765f, 0.012621f, 0.002793f, 0.003926f, -0.018986f, 0.010430f, 0.000880f, 0.004166f, -0.019915f, 0.006683f, -0.030675f, -0.000282f, -0.009601f, 0.007370f, -0.002676f, -0.022802f, -0.000403f, -0.022700f, 0.004247f, -0.018914f, 0.017144f, -0.009942f, 0.026871f, 0.000542f, -0.000366f, 0.013179f, 0.003020f, -0.004537f, -0.003814f, 0.005151f, -0.009023f, 0.006009f, 0.016614f, 0.008132f, -0.012166f, -0.006737f, 0.035470f, 0.002396f, 0.028311f, -0.026464f, -0.005399f, -0.003088f, 0.020617f, -0.023137f, 0.003317f, 0.010611f, -0.022607f, 0.015531f, -0.014170f, 0.003827f, 0.022145f, 0.002057f, 0.012507f, 0.005553f, 0.028904f, 0.012150f, -0.011893f, -0.009754f, -0.011460f, 0.001404f, 0.001158f, + 0.011783f, -0.007160f, -0.001719f, 0.007961f, 0.000208f, 0.006146f, 0.007952f, 0.001190f, -0.007042f, 0.008014f, 0.005759f, -0.000753f, 0.002115f, 0.002699f, -0.003318f, -0.002382f, -0.009844f, 0.006331f, -0.004917f, -0.004248f, -0.002246f, -0.004931f, 0.004243f, -0.003369f, -0.001539f, -0.005296f, -0.001704f, -0.001222f, 0.006252f, 0.004718f, -0.000643f, -0.001121f, -0.000827f, 0.003725f, 0.004132f, 0.003948f, 0.008117f, -0.001060f, -0.008717f, -0.028542f, 0.004255f, 0.027941f, 0.020798f, 0.022844f, -0.007634f, -0.005793f, 0.005641f, -0.003891f, 0.028138f, 0.009504f, 0.013371f, 0.023828f, -0.001786f, 0.008962f, -0.016207f, 0.023732f, 0.011759f, -0.005890f, -0.014586f, -0.013433f, 0.015807f, -0.027399f, 0.010650f, 0.015879f, -0.011560f, -0.015269f, -0.008846f, 0.014813f, 0.005422f, -0.005504f, -0.010165f, 0.000263f, -0.017040f, -0.025389f, 0.004516f, -0.024368f, -0.036539f, -0.004517f, 0.001274f, 0.036957f, -0.016059f, -0.012520f, 0.016280f, 0.027241f, 0.027053f, 0.014549f, -0.001822f, 0.006365f, -0.011908f, 0.002153f, -0.012480f, 0.030441f, 0.026622f, 0.017432f, -0.001436f, -0.031028f, + -0.000402f, -0.026496f, 0.029062f, 0.022790f, 0.013905f, -0.021993f, 0.017939f, 0.010387f, 0.012336f, -0.004086f, -0.018937f, -0.013547f, -0.015211f, 0.005103f, -0.021280f, -0.038424f, 0.007249f, 0.026099f, 0.013478f, 0.025622f, -0.008132f, -0.007034f, 0.025521f, 0.008632f, 0.003137f, 0.017203f, 0.005321f, 0.000506f, 0.014433f, 0.009322f, -0.001764f, 0.006765f, 0.006027f, 0.003889f, -0.005313f, -0.008498f, -0.011641f, 0.002994f, 0.006807f, 0.004189f, 0.014504f, 0.000367f, 0.010201f, -0.003384f, 0.003909f, 0.008408f, 0.000692f, -0.003898f, -0.002785f, -0.012440f, -0.011136f, 0.003704f, 0.002202f, 0.004903f, 0.012467f, 0.001873f, 0.009346f, -0.003780f, -0.002690f, 0.001651f, -0.010047f, -0.007544f, -0.003308f, -0.008095f, 0.003254f, -0.002730f, 0.002520f, 0.007167f, 0.009591f, 0.014255f, 0.023592f, 0.049709f, 0.022567f, 0.017120f, 0.016607f, -0.031347f, -0.004550f, -0.011696f, 0.039915f, -0.040603f, -0.037853f, 0.010570f, 0.026157f, -0.001100f, 0.031919f, 0.028301f, -0.001071f, 0.010656f, -0.018672f, -0.014071f, 0.030351f, -0.012241f, 0.020944f, 0.006917f, -0.013084f, -0.007381f, + -0.005642f, -0.007024f, -0.013668f, 0.011274f, 0.012750f, 0.010022f, 0.001252f, -0.016016f, -0.019795f, 0.025572f, -0.025284f, 0.019708f, 0.002124f, -0.031910f, 0.016140f, 0.029612f, -0.000348f, -0.008568f, -0.003551f, 0.002024f, 0.001984f, 0.020068f, -0.000825f, -0.015816f, -0.006174f, 0.017011f, -0.031515f, 0.007247f, -0.005082f, 0.025403f, 0.027486f, 0.017766f, 0.021564f, 0.027652f, 0.020413f, 0.006911f, -0.018020f, -0.021002f, 0.010172f, 0.013268f, -0.000762f, 0.011434f, 0.016406f, 0.042360f, -0.023931f, 0.026644f, -0.015836f, -0.010694f, 0.029656f, 0.004051f, -0.017372f, -0.015763f, -0.016014f, -0.026838f, -0.008809f, -0.013345f, 0.021334f, 0.000079f, -0.016688f, 0.008814f, 0.006069f, -0.004045f, 0.010115f, -0.020575f, 0.013350f, 0.000419f, -0.001689f, -0.002606f, 0.011369f, 0.001489f, 0.003134f, 0.011220f, -0.004664f, 0.001461f, 0.008707f, -0.013338f, 0.009273f, 0.000076f, 0.003566f, -0.006213f, 0.007424f, -0.003026f, 0.001024f, 0.009499f, 0.000205f, -0.002855f, 0.002704f, 0.006256f, 0.008626f, 0.013674f, 0.011673f, 0.003741f, -0.006393f, -0.005906f, -0.019953f, 0.003976f, + -0.016599f, -0.005426f, -0.007155f, -0.007366f, 0.008061f, -0.033324f, -0.005943f, 0.019385f, -0.023919f, 0.000756f, -0.015046f, -0.026325f, 0.038291f, 0.032725f, 0.027371f, 0.012968f, 0.007140f, 0.010766f, 0.028114f, 0.015523f, 0.028823f, -0.010674f, 0.024143f, -0.018187f, 0.029238f, 0.039257f, 0.024626f, 0.019622f, 0.010002f, 0.020268f, 0.020430f, -0.006071f, 0.040645f, 0.009755f, -0.024501f, 0.011625f, -0.024806f, -0.017068f, -0.005078f, -0.038595f, 0.000670f, -0.008230f, -0.010458f, -0.018764f, -0.009751f, -0.005391f, -0.001198f, -0.003808f, 0.001682f, 0.001613f, -0.022145f, -0.014631f, 0.004597f, -0.011699f, 0.009207f, 0.038009f, -0.019157f, -0.001547f, -0.003606f, 0.001405f, -0.018163f, 0.009792f, -0.008722f, 0.029423f, 0.006268f, 0.017575f, 0.027521f, 0.004699f, -0.001821f, -0.018146f, -0.040395f, 0.005336f, 0.030080f, 0.021832f, -0.005685f, -0.026923f, 0.022692f, 0.002393f, 0.013672f, -0.034468f, -0.024743f, -0.022696f, -0.034180f, -0.021161f, -0.025006f, 0.011654f, 0.003703f, 0.008756f, 0.011414f, 0.015787f, -0.007715f, 0.016070f, 0.018270f, 0.000583f, 0.009823f, -0.005856f, + -0.012128f, -0.012478f, -0.013131f, -0.005247f, -0.009575f, -0.000574f, 0.002885f, -0.001254f, 0.000863f, 0.002448f, -0.011115f, -0.010260f, -0.017598f, -0.006013f, -0.004089f, -0.009770f, 0.003857f, 0.001477f, -0.005210f, -0.015894f, -0.007336f, -0.005853f, -0.004124f, 0.013296f, 0.004037f, -0.005776f, -0.007363f, -0.002653f, -0.019123f, 0.005235f, -0.003920f, 0.009892f, 0.001095f, -0.005988f, -0.011297f, 0.011774f, 0.016734f, -0.057130f, -0.036651f, -0.017358f, 0.040815f, 0.029814f, -0.022179f, 0.025561f, 0.022980f, 0.019694f, 0.019190f, -0.019111f, 0.001929f, 0.011160f, -0.019099f, -0.057538f, -0.010539f, -0.015908f, -0.035340f, 0.003277f, -0.012065f, -0.008953f, 0.010792f, 0.006516f, -0.007866f, 0.001791f, 0.027001f, 0.028980f, -0.053109f, 0.012730f, 0.002709f, 0.024676f, 0.008372f, 0.001449f, -0.033065f, 0.010209f, -0.008468f, -0.009073f, -0.022730f, -0.016801f, 0.042573f, -0.019199f, -0.000742f, 0.005192f, -0.011222f, 0.047188f, 0.022379f, -0.020829f, -0.012640f, -0.036702f, -0.005275f, 0.035332f, 0.010377f, 0.010783f, -0.011511f, 0.021642f, -0.005014f, -0.009140f, 0.019858f, -0.011582f, + 0.032892f, -0.007565f, 0.024525f, -0.049698f, -0.016812f, 0.028722f, 0.007100f, -0.004423f, 0.008118f, -0.054988f, -0.025994f, 0.008556f, -0.021915f, 0.008605f, 0.002342f, 0.006308f, 0.033939f, -0.012475f, 0.013766f, -0.002488f, -0.027372f, -0.004582f, 0.020944f, 0.030337f, -0.000834f, -0.012430f, -0.023169f, 0.000848f, -0.032397f, -0.010380f, 0.002967f, 0.038500f, 0.034318f, 0.004885f, 0.014514f, 0.004525f, -0.005557f, 0.019206f, 0.014501f, -0.007284f, 0.015905f, 0.012134f, 0.006483f, -0.012925f, -0.000738f, -0.006568f, 0.011668f, 0.008300f, 0.010405f, -0.000563f, -0.015409f, 0.014996f, 0.000869f, -0.006958f, -0.014991f, -0.000410f, -0.001022f, -0.014012f, 0.010270f, -0.010083f, -0.016361f, 0.019079f, -0.007268f, -0.005961f, -0.008154f, 0.004568f, 0.002897f, 0.015415f, 0.003536f, -0.002129f, 0.006460f, 0.009737f, -0.016551f, 0.005101f, 0.011153f, -0.025692f, -0.070820f, -0.006860f, -0.007878f, -0.008552f, 0.011711f, -0.029370f, 0.056846f, -0.011056f, 0.003209f, 0.061073f, -0.072144f, -0.008405f, -0.013564f, -0.007780f, -0.082751f, 0.003813f, -0.012252f, -0.016979f, 0.028942f, -0.029503f, + 0.005031f, 0.004607f, 0.014116f, -0.003494f, -0.029791f, 0.019926f, -0.019366f, 0.042476f, -0.006873f, -0.050047f, -0.003044f, -0.002554f, -0.024239f, -0.050431f, 0.022803f, 0.024307f, -0.040920f, 0.032946f, -0.036963f, -0.030093f, -0.017418f, 0.002340f, 0.003533f, 0.004647f, 0.024456f, -0.005490f, -0.022337f, -0.054957f, 0.011500f, -0.073966f, -0.038325f, -0.026069f, -0.058047f, -0.035628f, -0.016415f, -0.004575f, -0.027025f, 0.040832f, 0.043458f, 0.008565f, -0.012544f, 0.046507f, 0.021840f, -0.006433f, -0.010311f, 0.033191f, 0.025624f, -0.012696f, 0.045629f, -0.039008f, -0.019090f, 0.048434f, 0.023644f, 0.068347f, -0.037527f, -0.043698f, 0.011406f, -0.033490f, 0.035296f, 0.002695f, 0.012517f, 0.064886f, -0.036000f, -0.040040f, -0.013992f, 0.012626f, 0.015407f, 0.015525f, 0.017240f, 0.018013f, -0.019940f, 0.006935f, 0.003471f, -0.002553f, -0.001986f, -0.014723f, -0.010484f, 0.018113f, -0.020462f, -0.002187f, 0.004574f, -0.011218f, 0.002958f, -0.011489f, -0.000391f, -0.002293f, 0.004678f, -0.017867f, 0.008857f, 0.019613f, 0.006502f, 0.003793f, 0.023335f, 0.015668f, -0.001285f, -0.023448f, + 0.020658f, 0.003881f, -0.007375f, -0.017846f, 0.021416f, 0.001829f, 0.000954f, 0.011500f, 0.016650f, -0.022449f, 0.011216f, 0.005446f, -0.014827f, -0.007695f, -0.023897f, 0.015405f, -0.003234f, -0.026166f, -0.013628f, 0.006958f, 0.055360f, 0.031944f, -0.005508f, 0.075597f, -0.009033f, 0.031181f, -0.035927f, 0.044223f, 0.041108f, -0.003539f, -0.033619f, 0.003745f, 0.011683f, -0.018353f, 0.019327f, -0.026889f, -0.000782f, -0.008106f, -0.009241f, -0.030587f, -0.022875f, -0.013794f, -0.002219f, -0.009753f, -0.024542f, 0.036187f, 0.024348f, 0.006900f, -0.010376f, 0.006360f, 0.034301f, 0.016532f, 0.025127f, 0.016241f, -0.019249f, -0.029077f, 0.058891f, -0.007523f, -0.032655f, -0.013260f, -0.014191f, -0.007504f, 0.042552f, 0.002075f, -0.033300f, -0.012378f, -0.082356f, -0.019978f, -0.009892f, 0.050809f, 0.034658f, -0.099520f, -0.043227f, -0.024028f, -0.000759f, 0.005250f, -0.040074f, 0.029569f, 0.015442f, 0.025767f, 0.049799f, -0.065196f, 0.063797f, 0.046225f, -0.021029f, -0.043700f, 0.002581f, -0.010714f, 0.016833f, 0.058542f, -0.030407f, -0.033545f, 0.047332f, -0.055733f, -0.062852f, -0.024987f, + 0.006230f, -0.017704f, -0.068846f, -0.027529f, -0.022373f, 0.001293f, 0.003602f, -0.019422f, -0.001539f, 0.003189f, 0.000680f, 0.006077f, -0.043547f, -0.015030f, -0.014512f, 0.003013f, 0.012007f, -0.003006f, -0.013997f, -0.007868f, 0.004507f, 0.022363f, 0.023574f, -0.003087f, -0.020652f, -0.005143f, 0.030037f, 0.001992f, -0.007917f, 0.006482f, -0.040939f, -0.011836f, -0.019340f, 0.002897f, 0.007017f, -0.039452f, -0.040443f, 0.010263f, 0.035114f, -0.014910f, 0.022981f, 0.007284f, -0.011330f, -0.003119f, 0.009339f, 0.007235f, -0.003310f, 0.007187f, 0.052112f, 0.007196f, 0.019493f, -0.040642f, -0.064589f, 0.093259f, 0.046468f, 0.004387f, 0.005953f, -0.020790f, -0.054971f, 0.019388f, -0.004422f, 0.047160f, 0.010356f, 0.017600f, 0.051381f, 0.028657f, -0.000740f, -0.005345f, 0.008552f, -0.031270f, -0.026004f, -0.033258f, -0.018808f, 0.031078f, -0.008633f, 0.002102f, 0.038513f, -0.006500f, 0.016802f, -0.053580f, -0.048437f, -0.032607f, 0.027737f, 0.011496f, -0.001959f, 0.012924f, -0.017258f, -0.048170f, 0.060818f, -0.057799f, 0.026521f, 0.027686f, 0.021512f, 0.009820f, 0.036748f, -0.023687f, + -0.059453f, 0.043951f, 0.124047f, -0.021769f, 0.059905f, -0.072163f, -0.039207f, 0.044818f, 0.025954f, -0.066990f, -0.019122f, -0.005537f, 0.058060f, -0.014368f, -0.006538f, -0.091137f, -0.058888f, -0.020843f, -0.067254f, 0.056153f, 0.059474f, 0.094357f, -0.083703f, 0.035998f, 0.010199f, -0.046287f, -0.002932f, -0.002082f, -0.096678f, 0.068883f, -0.028905f, 0.032587f, -0.010174f, 0.005472f, 0.130203f, -0.035126f, 0.044978f, 0.030039f, -0.031910f, 0.057001f, -0.000392f, -0.010822f, 0.003152f, 0.014813f, 0.036418f, 0.022637f, 0.014280f, -0.001144f, 0.034437f, -0.032459f, -0.016430f, 0.002909f, 0.008329f, 0.016318f, -0.009324f, 0.028278f, 0.003385f, 0.012672f, -0.005891f, 0.021487f, -0.002223f, -0.031000f, 0.017495f, -0.038116f, -0.023102f, -0.008685f, 0.015956f, -0.003853f, 0.019126f, 0.045089f, 0.068753f, 0.050246f, 0.013242f, 0.032436f, -0.019097f, 0.016658f, -0.001726f, -0.001082f, -0.003515f, 0.007048f, -0.014936f, 0.019353f, -0.018407f, -0.083125f, -0.047130f, -0.001718f, -0.012589f, -0.027861f, 0.010101f, 0.026801f, 0.002781f, -0.029446f, -0.001478f, -0.028228f, 0.076450f, -0.023484f, + 0.001759f, 0.057947f, -0.003249f, -0.059454f, -0.041353f, -0.040639f, -0.017993f, -0.021639f, 0.063695f, 0.006596f, 0.010515f, 0.031740f, -0.017444f, -0.017779f, -0.010689f, -0.018124f, -0.038828f, -0.009130f, 0.073013f, 0.023554f, 0.017365f, -0.048518f, 0.017914f, 0.003799f, -0.034540f, -0.004036f, -0.017300f, 0.079212f, -0.062637f, -0.054089f, -0.019043f, 0.009879f, -0.018647f, 0.002413f, 0.021407f, -0.041241f, -0.011057f, 0.067102f, -0.054051f, 0.009496f, -0.013527f, -0.032874f, -0.057329f, -0.043826f, 0.002151f, -0.079864f, -0.096547f, 0.022920f, 0.019808f, 0.015505f, -0.086269f, 0.066637f, 0.080981f, -0.027492f, -0.023419f, 0.005046f, -0.003348f, -0.018255f, -0.044811f, 0.032479f, 0.122185f, 0.031707f, -0.030163f, 0.000586f, 0.019418f, 0.040748f, 0.011057f, -0.072302f, -0.064454f, 0.069839f, -0.013358f, -0.028594f, -0.042102f, 0.014490f, 0.079860f, 0.024441f, -0.025234f, 0.014706f, -0.003089f, -0.014235f, -0.006975f, -0.004289f, 0.035340f, 0.019515f, -0.012004f, -0.019564f, 0.015999f, 0.009255f, -0.002964f, -0.008110f, 0.012934f, -0.018925f, 0.011746f, 0.030594f, -0.002814f, -0.016965f, + -0.005088f, -0.010934f, -0.018532f, -0.034315f, 0.005002f, 0.026136f, -0.017505f, -0.021658f, 0.010683f, -0.027026f, 0.000160f, -0.043943f, 0.021081f, 0.027334f, 0.069955f, -0.022310f, -0.009529f, -0.029008f, -0.029714f, 0.008351f, 0.015414f, 0.029058f, -0.003505f, -0.006343f, -0.029334f, 0.011750f, 0.007223f, 0.008754f, 0.018503f, 0.021286f, -0.026427f, -0.069767f, 0.019325f, 0.027253f, -0.103287f, 0.056581f, 0.002475f, -0.029451f, 0.009949f, 0.037693f, -0.053353f, 0.032971f, -0.049537f, 0.013382f, -0.002821f, -0.025001f, -0.013830f, -0.006774f, -0.036450f, 0.026151f, 0.022955f, -0.001069f, 0.012691f, 0.001587f, 0.020318f, 0.026412f, 0.025622f, 0.037883f, 0.032627f, -0.020143f, 0.005149f, -0.041338f, 0.043905f, -0.033890f, 0.010815f, -0.006531f, 0.009020f, 0.002150f, -0.031221f, 0.028478f, -0.015780f, -0.030256f, 0.063571f, -0.050789f, 0.015349f, -0.014639f, -0.025149f, 0.025632f, -0.006514f, 0.007617f, 0.039654f, -0.047799f, 0.002037f, -0.058567f, -0.115325f, -0.002922f, 0.036884f, -0.013839f, 0.148471f, 0.030235f, -0.057877f, 0.016332f, -0.080786f, 0.028125f, 0.057974f, 0.068396f, + -0.023401f, -0.013447f, -0.089823f, -0.103041f, -0.008570f, -0.064222f, 0.015329f, -0.004011f, -0.055991f, -0.013086f, -0.027674f, -0.061350f, 0.050412f, 0.099032f, -0.027676f, 0.007042f, 0.021456f, -0.026194f, 0.030726f, 0.039087f, -0.027010f, 0.004600f, 0.000197f, -0.049213f, 0.024715f, 0.004230f, 0.015064f, 0.018106f, -0.034722f, 0.013711f, -0.018376f, -0.027862f, -0.031553f, 0.026995f, -0.019543f, 0.011154f, -0.030499f, -0.010946f, -0.001990f, -0.037223f, 0.036650f, -0.023556f, 0.007408f, 0.011263f, -0.034681f, -0.005557f, 0.026905f, -0.003058f, 0.003914f, 0.006090f, -0.010067f, 0.016598f, 0.034700f, -0.004011f, 0.020193f, 0.023831f, -0.029485f, -0.055993f, 0.019077f, 0.008003f, 0.032501f, 0.038990f, -0.050666f, -0.049683f, 0.008807f, -0.073590f, 0.015131f, -0.005305f, -0.042969f, 0.019373f, -0.027914f, -0.018765f, -0.034685f, 0.017728f, -0.037766f, 0.048379f, -0.005173f, 0.017955f, -0.011173f, 0.064967f, -0.017667f, 0.035713f, -0.000613f, 0.042567f, -0.011889f, -0.021384f, 0.013852f, -0.024209f, -0.025685f, 0.003568f, 0.048333f, 0.031177f, -0.032935f, 0.035249f, -0.024705f, -0.037723f, + 0.010652f, 0.051809f, -0.019903f, -0.020983f, 0.027658f, 0.012510f, -0.025767f, 0.002987f, 0.035191f, -0.014569f, -0.033853f, 0.018552f, 0.014117f, 0.021735f, 0.039636f, 0.008423f, -0.023905f, -0.007751f, 0.087066f, 0.091566f, -0.025263f, -0.075616f, 0.058101f, -0.025202f, 0.016406f, 0.008364f, 0.098053f, 0.013607f, -0.050852f, -0.018460f, -0.012298f, 0.002899f, 0.015208f, 0.023806f, 0.031901f, -0.037700f, 0.012206f, 0.008763f, 0.056885f, -0.014019f, 0.040100f, 0.043246f, 0.023913f, 0.020716f, 0.012486f, 0.034481f, -0.032811f, 0.037096f, 0.047055f, 0.034076f, 0.005818f, -0.066372f, -0.009850f, -0.042733f, 0.002097f, 0.029028f, 0.009799f, -0.014466f, -0.023271f, -0.013479f, -0.003609f, -0.001479f, 0.012331f, -0.013570f, 0.003875f, -0.001209f, -0.010306f, 0.020507f, 0.008043f, -0.017940f, -0.008433f, -0.004426f, 0.024917f, 0.000234f, 0.005231f, -0.023594f, -0.016907f, -0.031375f, -0.014724f, -0.001669f, -0.002838f, 0.000697f, -0.005343f, -0.028078f, 0.007489f, -0.009408f, -0.004462f, 0.004498f, -0.007724f, -0.000107f, -0.024374f, -0.005550f, 0.001237f, 0.000694f, 0.000735f, -0.005952f, + -0.005975f, -0.001828f, -0.009515f, -0.013492f, 0.103720f, 0.043080f, -0.046302f, 0.010892f, -0.048388f, -0.026835f, -0.002973f, 0.017265f, -0.007414f, 0.037489f, -0.044719f, -0.001782f, 0.018164f, -0.001896f, 0.018877f, -0.003069f, 0.006869f, 0.003949f, -0.031937f, -0.010529f, 0.008875f, -0.030535f, -0.029988f, 0.002175f, 0.008205f, -0.021824f, 0.015742f, 0.014450f, -0.008647f, -0.015538f, -0.002026f, 0.002908f, -0.004910f, 0.012363f, 0.003674f, 0.009659f, -0.012910f, -0.006024f, 0.024044f, -0.000360f, 0.001628f, 0.011042f, -0.007218f, 0.012258f, -0.011646f, -0.022772f, -0.014125f, 0.022748f, -0.017955f, -0.013886f, 0.001862f, -0.018593f, -0.019245f, 0.027758f, -0.027561f, 0.044098f, 0.010194f, -0.020093f, 0.019922f, 0.002715f, -0.032516f, 0.002507f, -0.005448f, -0.006156f, 0.016111f, -0.000881f, -0.018884f, 0.037460f, -0.022232f, -0.009185f, 0.020059f, 0.005920f, -0.007772f, 0.000598f, 0.006537f, -0.001005f, -0.001112f, -0.004288f, 0.009187f, 0.015344f, -0.000118f, -0.026599f, 0.019265f, -0.013902f, -0.001535f, 0.022062f, -0.000984f, -0.007243f, -0.000422f, -0.019768f, 0.009881f, 0.006334f, + -0.001657f, 0.000051f, 0.008415f, -0.019259f, 0.001881f, -0.006849f, 0.002411f, 0.007433f, 0.002514f, -0.008405f, 0.019024f, -0.028529f, 0.004199f, 0.002948f, -0.001489f, 0.003107f, -0.003631f, -0.016274f, 0.018044f, -0.008516f, 0.013038f, -0.000169f, -0.001532f, 0.016139f, 0.006686f, -0.014206f, 0.005739f, -0.007350f, -0.005502f, 0.002794f, 0.010978f, 0.010269f, -0.003655f, -0.014027f, 0.007507f, -0.008144f, -0.062538f, -0.075206f, 0.063432f, 0.256890f, 0.100519f, 0.117856f, 0.001619f, -0.240515f, -0.177107f, -0.092588f, -0.141128f, 0.063333f, 0.121575f, 0.050131f, 0.214906f, 0.121602f, -0.008052f, 0.050517f, -0.108605f, -0.219157f, -0.087427f, -0.152215f, -0.024295f, 0.105483f, 0.088892f, 0.080451f, 0.133978f, 0.082660f, 0.022772f, 0.036819f, -0.009925f, -0.155929f, -0.068869f, -0.056142f, -0.215427f, 0.039996f, 0.028306f, -0.095660f, 0.155273f, 0.153633f, -0.005179f, 0.194377f, 0.095623f, -0.090239f, 0.060372f, -0.089711f, -0.186731f, -0.014781f, -0.112766f, -0.163426f, 0.028961f, 0.017530f, -0.009686f, 0.152460f, 0.147051f, 0.087823f, 0.130914f, 0.079562f, -0.050797f, -0.057295f, + -0.101878f, -0.174692f, -0.128853f, -0.061477f, -0.057573f, 0.031397f, 0.098773f, 0.067500f, 0.108513f, 0.163771f, 0.063802f, -0.021477f, -0.020377f, -0.113199f, -0.091342f, 0.008444f, -0.104862f, -0.047607f, 0.057076f, 0.014101f, 0.071424f, 0.057412f, -0.029101f, 0.019184f, -0.005761f, -0.039041f, 0.008794f, -0.017390f, -0.017533f, 0.036279f, 0.012716f, 0.015409f, 0.048360f, -0.027609f, -0.010579f, 0.026273f, -0.035757f, -0.029395f, 0.013845f, -0.085945f, -0.014121f, 0.029641f, -0.069150f, 0.034087f, 0.043547f, 0.004760f, 0.109045f, 0.103657f, 0.024047f, 0.042180f, -0.029972f, -0.092328f, -0.046129f, -0.122923f, -0.139469f, -0.079078f, -0.033426f, 0.026701f, 0.133573f, 0.154601f, 0.162073f, 0.143875f, 0.082390f, -0.017625f, -0.089962f, -0.142717f, -0.199087f, -0.170387f, -0.093493f, -0.024013f, 0.080935f, 0.144724f, 0.144592f, 0.129207f, 0.084328f, -0.015257f, -0.025241f, -0.040827f, -0.061691f, -0.043854f, -0.038289f, -0.045626f, -0.024071f, -0.012222f, -0.010065f, 0.010202f, 0.028290f, 0.036998f, 0.048388f, 0.044559f, 0.035706f, 0.016673f, 0.004294f, -0.014880f, -0.019821f, -0.021536f, + -0.012019f, -0.006727f, 0.000043f, -0.001458f}, + {0.001000f, 0.006407f, -0.008711f, -0.007089f, -0.001217f, 0.006868f, 0.010120f, -0.004765f, 0.005910f, -0.003272f, -0.008428f, -0.002310f, -0.004711f, 0.002771f, -0.001160f, -0.004072f, 0.003734f, 0.005669f, 0.001270f, 0.006853f, -0.012556f, -0.013566f, -0.008717f, 0.001264f, -0.000034f, -0.002318f, 0.000654f, 0.004143f, -0.001357f, 0.005594f, 0.004620f, -0.005925f, 0.002255f, -0.000442f, 0.007242f, 0.006681f, 0.002518f, -0.007095f, 0.004652f, -0.004226f, 0.002365f, 0.004659f, -0.011341f, 0.012393f, 0.018195f, 0.002385f, 0.008244f, -0.006697f, -0.001356f, -0.006287f, -0.003271f, 0.005641f, -0.001887f, -0.006502f, -0.001728f, -0.004092f, 0.003132f, -0.003991f, -0.003635f, 0.000369f, 0.003323f, -0.003308f, -0.003743f, -0.001616f, 0.006461f, 0.005826f, -0.004924f, -0.001805f, -0.005818f, 0.001344f, 0.007676f, 0.002140f, -0.002817f, -0.003664f, 0.002885f, -0.001026f, -0.005238f, -0.001905f, -0.003539f, -0.000502f, -0.001900f, 0.003043f, 0.002838f, 0.001534f, -0.001687f, -0.002313f, 0.005172f, -0.000695f, 0.001403f, 0.002694f, -0.000777f, -0.000065f, -0.001079f, 0.001587f, 0.000204f, 0.000405f, + -0.001521f, 0.000222f, -0.000486f, -0.001497f, 0.000068f, -0.000225f, 0.001112f, 0.002736f, -0.001522f, 0.000644f, -0.000301f, 0.001337f, 0.001619f, -0.000384f, -0.000676f, -0.000331f, -0.000091f, -0.001445f, -0.000618f, 0.000663f, -0.000565f, 0.000288f, -0.000040f, 0.001225f, 0.000256f, 0.027993f, 0.012883f, -0.000972f, 0.005860f, 0.005320f, -0.006716f, -0.003295f, 0.007761f, 0.003528f, 0.008446f, -0.006146f, 0.012283f, 0.004611f, -0.012131f, 0.009618f, 0.000505f, -0.000225f, -0.006407f, 0.007035f, -0.013118f, -0.011257f, -0.002421f, -0.004008f, -0.002189f, -0.004027f, 0.001505f, -0.002449f, -0.005465f, -0.003951f, 0.004545f, -0.004989f, 0.003168f, 0.002000f, 0.001258f, -0.005507f, 0.007691f, -0.016152f, -0.002862f, -0.000103f, -0.002854f, -0.002044f, 0.001364f, 0.002996f, -0.005206f, 0.004099f, -0.006304f, 0.005984f, 0.001868f, 0.001294f, 0.006157f, -0.004389f, -0.001088f, 0.002486f, 0.009651f, 0.002375f, 0.004025f, -0.002259f, -0.008448f, -0.011769f, 0.002118f, 0.006348f, 0.008280f, -0.003441f, -0.013176f, 0.001923f, -0.005415f, -0.003694f, -0.003086f, 0.003608f, 0.000336f, 0.012805f, + -0.000432f, 0.004287f, 0.002467f, -0.001980f, -0.003395f, -0.003619f, -0.013467f, -0.003980f, -0.002247f, -0.001865f, -0.002623f, 0.002454f, 0.006664f, 0.001834f, 0.006318f, -0.000115f, -0.000661f, -0.002083f, 0.001694f, 0.002278f, -0.000701f, -0.002646f, 0.002200f, -0.001387f, 0.000828f, -0.001185f, 0.001113f, -0.001978f, -0.001254f, 0.001769f, 0.000526f, 0.000974f, -0.000762f, 0.000577f, -0.001297f, 0.015061f, 0.003529f, -0.012754f, -0.014423f, 0.003940f, -0.004374f, -0.011987f, 0.013617f, -0.006690f, -0.002187f, -0.001873f, 0.010689f, 0.002224f, -0.006135f, 0.007458f, -0.005755f, 0.011282f, -0.015575f, -0.010320f, 0.012482f, -0.012995f, -0.013060f, -0.005277f, 0.010676f, 0.004643f, 0.005135f, -0.001264f, 0.009572f, 0.005753f, -0.000946f, -0.012598f, 0.003446f, -0.003515f, 0.004571f, 0.003976f, 0.003472f, 0.010904f, 0.002972f, -0.010777f, 0.001035f, 0.007473f, 0.011047f, 0.003691f, -0.005978f, -0.001441f, -0.008839f, 0.003784f, -0.015716f, -0.000632f, 0.017076f, 0.000898f, 0.001877f, -0.008748f, -0.010758f, 0.001646f, 0.002414f, 0.012510f, -0.002671f, 0.001066f, 0.001375f, -0.001863f, + 0.001346f, 0.004152f, 0.000805f, 0.008800f, -0.002328f, 0.005843f, 0.000930f, 0.001575f, 0.001125f, 0.010329f, 0.000499f, -0.001446f, 0.001979f, -0.002208f, -0.006918f, -0.003724f, -0.007133f, -0.000166f, 0.013086f, 0.002731f, -0.004183f, -0.001459f, -0.007350f, 0.004230f, -0.005736f, -0.004078f, 0.001494f, 0.000225f, 0.000520f, -0.003343f, -0.004662f, -0.000969f, 0.001263f, -0.001581f, 0.002813f, -0.000287f, 0.000086f, 0.002684f, 0.001761f, 0.002705f, 0.002315f, -0.000007f, 0.000980f, -0.002154f, 0.000222f, -0.001907f, -0.001974f, 0.001487f, 0.001851f, 0.003110f, 0.002343f, -0.001459f, -0.000273f, 0.001665f, -0.001084f, -0.002316f, 0.001447f, 0.000377f, -0.034626f, -0.022715f, -0.004934f, 0.003709f, 0.005639f, 0.000523f, 0.000012f, -0.013307f, -0.000759f, -0.002950f, -0.002157f, 0.000226f, -0.003310f, -0.001592f, -0.009734f, 0.005018f, -0.020547f, -0.007601f, 0.001912f, -0.004205f, -0.006234f, -0.003675f, -0.011661f, -0.006014f, -0.004805f, -0.005634f, 0.002663f, -0.009148f, -0.004924f, 0.011184f, 0.007406f, 0.000695f, 0.005476f, 0.003906f, -0.003611f, -0.007603f, 0.004549f, 0.016735f, + 0.001981f, 0.002044f, -0.006545f, -0.005980f, 0.005018f, -0.014447f, -0.007578f, 0.015888f, -0.014498f, 0.004348f, -0.003395f, -0.007407f, 0.003453f, 0.001021f, -0.003973f, 0.000893f, 0.002532f, -0.005098f, 0.000132f, -0.001049f, 0.009923f, 0.008679f, 0.001375f, 0.002305f, 0.004353f, -0.000334f, -0.001831f, -0.003438f, -0.020149f, 0.009758f, 0.006201f, -0.005552f, -0.000132f, -0.008509f, -0.002216f, 0.001168f, -0.006104f, 0.002774f, -0.007424f, -0.004215f, -0.008657f, -0.013009f, 0.008628f, -0.002500f, 0.000476f, -0.010998f, -0.002646f, 0.001391f, 0.001913f, -0.002917f, -0.000411f, -0.000630f, -0.002931f, -0.005700f, 0.001004f, -0.002937f, 0.002542f, -0.000473f, -0.001333f, -0.001188f, -0.000495f, 0.002758f, 0.000584f, -0.004222f, 0.000898f, -0.001283f, -0.000246f, 0.001334f, 0.000734f, -0.001111f, 0.001098f, -0.003316f, 0.001876f, -0.003015f, -0.000828f, -0.029965f, 0.004614f, 0.007031f, -0.001894f, -0.002625f, -0.016598f, -0.006788f, 0.004543f, -0.014815f, -0.014207f, 0.002902f, -0.013516f, -0.006953f, -0.000356f, -0.008153f, 0.004589f, -0.006427f, 0.010119f, -0.005347f, -0.003527f, 0.003199f, + 0.007070f, 0.013110f, 0.008175f, -0.014612f, -0.000814f, -0.001085f, 0.007181f, 0.010803f, 0.018333f, -0.008159f, -0.007242f, 0.009514f, -0.010056f, 0.002326f, 0.002850f, 0.015509f, 0.005655f, 0.008656f, -0.011575f, -0.005104f, -0.015793f, 0.012466f, 0.013019f, 0.015005f, -0.000275f, -0.003229f, -0.010096f, -0.002110f, 0.010047f, -0.004681f, -0.006521f, -0.005969f, -0.007940f, 0.001706f, 0.001809f, 0.002367f, -0.010853f, -0.000145f, -0.010636f, -0.000573f, -0.001637f, 0.004313f, 0.003673f, -0.003249f, -0.004861f, -0.013416f, -0.000844f, -0.001075f, 0.008206f, -0.005182f, 0.013676f, -0.007833f, 0.001647f, 0.006369f, 0.012416f, -0.009656f, 0.002820f, 0.006542f, -0.011289f, 0.005620f, -0.000073f, 0.013815f, 0.004535f, 0.003092f, 0.008419f, -0.000861f, 0.002250f, 0.006531f, 0.002565f, 0.000069f, -0.002494f, 0.000106f, 0.002673f, -0.000894f, 0.003416f, 0.005349f, 0.004294f, -0.002028f, 0.002343f, 0.000337f, -0.001540f, 0.002139f, 0.002730f, -0.000005f, 0.001200f, 0.003422f, 0.002426f, 0.002759f, 0.001231f, -0.001349f, -0.002324f, 0.002637f, -0.002489f, 0.002625f, -0.001480f, 0.000190f, + 0.003200f, 0.002508f, -0.000888f, 0.037072f, 0.031805f, -0.001155f, 0.000957f, 0.016528f, 0.002267f, 0.008088f, -0.004950f, 0.009066f, -0.006986f, 0.016685f, 0.005726f, 0.000012f, 0.003418f, 0.001151f, 0.021147f, 0.014259f, -0.013849f, -0.011556f, 0.004502f, 0.002218f, -0.004433f, -0.003027f, 0.002689f, 0.010118f, 0.007534f, 0.004608f, 0.001094f, 0.005331f, -0.003523f, -0.000300f, 0.011653f, -0.012817f, 0.005144f, 0.015529f, 0.011673f, 0.021120f, -0.002074f, -0.003241f, -0.001837f, 0.001308f, -0.006743f, 0.022952f, 0.021069f, 0.015022f, -0.006999f, -0.002125f, 0.008963f, 0.007268f, -0.006424f, 0.001404f, 0.012061f, -0.004540f, -0.005639f, 0.007636f, -0.022333f, -0.002632f, 0.001241f, 0.003249f, -0.007556f, -0.014642f, 0.005968f, 0.009949f, -0.011875f, -0.004465f, -0.012914f, 0.004772f, 0.000912f, -0.002762f, -0.002774f, -0.011316f, 0.018887f, -0.005020f, 0.002544f, -0.019258f, -0.004557f, -0.009225f, 0.022459f, -0.004020f, -0.003081f, 0.009942f, 0.004627f, -0.000124f, -0.007163f, 0.006583f, -0.004712f, -0.006759f, 0.010415f, 0.009628f, -0.000143f, 0.005985f, 0.000223f, -0.002839f, + 0.005528f, -0.000937f, 0.002160f, -0.001872f, -0.002434f, -0.000702f, 0.004302f, -0.003277f, -0.002432f, -0.000232f, -0.003255f, 0.001070f, -0.002934f, -0.001794f, 0.000284f, -0.000635f, 0.004275f, 0.000030f, 0.001258f, 0.002618f, 0.002745f, 0.000614f, 0.001423f, 0.002139f, 0.005697f, 0.000964f, 0.005370f, 0.000786f, 0.002663f, 0.003781f, 0.024407f, -0.000930f, 0.015419f, 0.021105f, -0.011152f, -0.025952f, 0.001077f, 0.019770f, -0.015302f, 0.013887f, -0.004141f, -0.018778f, -0.008688f, 0.018945f, -0.018505f, -0.016310f, 0.011879f, -0.018863f, 0.006277f, 0.009016f, 0.007394f, -0.005344f, 0.011422f, 0.003234f, 0.002136f, 0.007365f, -0.012069f, 0.016442f, 0.008077f, 0.007144f, -0.003404f, -0.001827f, 0.030622f, -0.010721f, 0.001891f, 0.007978f, 0.015404f, -0.020946f, -0.017258f, -0.016063f, 0.000608f, 0.001189f, -0.001087f, 0.009749f, 0.003022f, 0.017401f, 0.006992f, 0.010197f, -0.001651f, 0.001363f, -0.008615f, 0.015550f, -0.007055f, 0.015337f, -0.008379f, -0.013236f, 0.022810f, 0.018532f, -0.026258f, -0.023171f, -0.015241f, -0.011917f, 0.008250f, 0.001301f, -0.005328f, 0.012068f, + 0.013306f, -0.015993f, 0.009398f, -0.001305f, -0.032011f, -0.010584f, -0.016147f, -0.014649f, 0.005529f, -0.004996f, 0.010497f, -0.002436f, 0.001567f, 0.019126f, 0.019484f, -0.001827f, 0.005116f, -0.001716f, 0.003022f, 0.002737f, -0.006607f, 0.005469f, 0.001590f, -0.000271f, 0.016439f, 0.004922f, -0.000130f, 0.000470f, -0.002951f, 0.004838f, -0.000551f, 0.003176f, -0.003573f, -0.000221f, -0.003768f, 0.000976f, 0.004269f, 0.001324f, -0.000026f, -0.000541f, 0.003733f, 0.002386f, -0.002380f, 0.000297f, -0.000117f, 0.000536f, 0.001889f, 0.000810f, -0.013917f, -0.019393f, 0.011623f, -0.011125f, -0.008255f, -0.006887f, -0.022648f, -0.002313f, 0.010048f, -0.006049f, -0.001405f, -0.008189f, 0.018591f, 0.002950f, 0.011829f, 0.009135f, -0.015047f, 0.015498f, 0.023054f, -0.006993f, -0.009462f, 0.002569f, -0.004040f, 0.010057f, -0.028580f, 0.011029f, 0.024703f, -0.003194f, -0.008118f, -0.006952f, 0.010732f, 0.022250f, -0.005276f, 0.005695f, -0.009903f, 0.015279f, -0.018304f, -0.006901f, 0.003540f, -0.002750f, -0.014204f, 0.026238f, 0.018409f, 0.013913f, -0.005829f, -0.019568f, -0.002433f, -0.027845f, + 0.004823f, -0.001912f, -0.000900f, -0.000459f, -0.004222f, 0.015285f, 0.012832f, -0.019300f, 0.010860f, -0.011502f, 0.016071f, -0.001341f, -0.003257f, -0.001198f, -0.017020f, -0.003113f, -0.015526f, -0.034241f, -0.001558f, 0.004167f, 0.002720f, -0.013053f, -0.000441f, -0.003628f, -0.025674f, 0.000672f, 0.022313f, -0.013940f, 0.005849f, 0.007436f, -0.002816f, 0.001742f, -0.006588f, -0.003745f, 0.005252f, 0.006512f, 0.007011f, -0.001611f, -0.004461f, -0.001541f, -0.004795f, 0.004107f, 0.001952f, -0.003883f, -0.001151f, -0.003555f, -0.004039f, -0.000362f, -0.003627f, -0.005363f, 0.003436f, -0.000974f, -0.004222f, 0.003549f, -0.002949f, 0.002961f, 0.004268f, 0.001979f, 0.004104f, 0.003076f, -0.000017f, 0.002920f, 0.009237f, 0.004634f, -0.004547f, -0.002947f, -0.005224f, 0.000221f, -0.006768f, 0.003804f, -0.000363f, 0.005472f, -0.001360f, 0.004314f, -0.000666f, -0.002680f, 0.008731f, 0.004405f, -0.035975f, 0.002400f, 0.021192f, 0.011361f, -0.016320f, -0.013515f, 0.026532f, 0.005964f, 0.006068f, -0.005337f, 0.006966f, -0.000405f, -0.017519f, -0.004738f, -0.018407f, 0.008637f, -0.010911f, -0.001822f, + -0.017931f, -0.020132f, -0.026749f, 0.016689f, 0.011492f, -0.008758f, -0.009449f, 0.007421f, -0.024552f, -0.002387f, 0.001997f, 0.005831f, 0.010989f, 0.005167f, 0.000832f, -0.008676f, 0.003731f, -0.007978f, 0.006654f, -0.007658f, 0.004442f, 0.002154f, -0.007681f, -0.010289f, -0.019210f, -0.012898f, 0.005034f, -0.033152f, -0.008863f, 0.017986f, 0.009779f, -0.004114f, 0.043246f, -0.006372f, 0.020108f, 0.019622f, -0.031281f, 0.001918f, -0.004037f, -0.026668f, -0.013745f, -0.014735f, 0.000600f, 0.002979f, 0.029928f, -0.004923f, 0.003001f, 0.020066f, 0.015115f, -0.003650f, 0.020248f, -0.009663f, -0.007245f, -0.013565f, -0.017688f, -0.026080f, -0.009725f, 0.014685f, -0.028131f, -0.014543f, 0.021985f, 0.015807f, -0.009387f, 0.019849f, -0.008752f, -0.001499f, -0.000748f, 0.009488f, -0.006107f, 0.009456f, -0.005842f, 0.008074f, -0.002225f, 0.003269f, -0.003700f, 0.006513f, 0.006503f, 0.002643f, -0.000970f, 0.007368f, -0.004685f, -0.005591f, 0.005995f, -0.001745f, 0.006530f, 0.004540f, 0.003320f, 0.004193f, 0.002779f, 0.001116f, -0.010738f, -0.002121f, 0.000060f, 0.002936f, -0.002735f, -0.004711f, + -0.003680f, -0.010538f, 0.004127f, -0.000317f, 0.006756f, 0.003616f, 0.006583f, 0.004778f, 0.001538f, 0.002125f, 0.024777f, -0.004263f, 0.007960f, -0.012067f, 0.007113f, 0.010474f, -0.006393f, 0.008971f, -0.013785f, -0.015031f, 0.022996f, 0.012630f, 0.014845f, 0.018448f, -0.000101f, -0.015027f, 0.019866f, -0.017322f, -0.023402f, 0.000428f, 0.021936f, -0.003056f, -0.019013f, 0.002698f, 0.025820f, -0.003619f, 0.007090f, 0.002607f, 0.036227f, 0.002400f, 0.007755f, 0.017988f, -0.002271f, -0.009135f, -0.017351f, 0.002574f, -0.002402f, -0.016555f, 0.000550f, -0.009699f, 0.006660f, 0.024694f, 0.000254f, -0.014677f, -0.004383f, -0.013596f, -0.007300f, -0.001995f, -0.005785f, 0.003472f, -0.018302f, 0.019819f, -0.010374f, 0.033379f, -0.008361f, -0.023979f, 0.001400f, 0.001337f, 0.011810f, 0.005202f, 0.006402f, -0.024590f, -0.020049f, 0.014682f, -0.020877f, -0.028932f, 0.008382f, 0.005965f, -0.006586f, 0.031661f, -0.025579f, -0.035300f, 0.013313f, -0.024039f, 0.002364f, 0.003548f, 0.000732f, -0.023101f, -0.014147f, -0.030102f, 0.010438f, -0.002835f, -0.001626f, -0.004460f, -0.013449f, -0.005845f, + -0.010189f, -0.004828f, -0.003921f, 0.011807f, -0.008797f, 0.009129f, 0.003295f, 0.009422f, 0.001597f, 0.001441f, -0.012309f, -0.004254f, 0.003423f, -0.003717f, -0.013436f, 0.002935f, -0.002122f, -0.004991f, -0.004683f, 0.004583f, -0.005354f, 0.006094f, -0.003034f, 0.007343f, -0.001280f, 0.003893f, -0.006968f, -0.006604f, -0.000151f, 0.000839f, -0.002431f, 0.010962f, -0.009221f, -0.008530f, -0.005749f, 0.005495f, 0.005684f, -0.006837f, 0.001645f, -0.019432f, 0.010839f, 0.000967f, 0.026488f, 0.027530f, 0.040043f, 0.018103f, 0.008615f, 0.005428f, 0.013306f, -0.013669f, 0.015360f, -0.024150f, 0.011865f, -0.002463f, -0.001880f, -0.046195f, -0.017675f, -0.007672f, 0.015852f, -0.002076f, 0.003965f, 0.004892f, 0.004337f, -0.023660f, 0.024528f, -0.001026f, 0.010076f, 0.000708f, 0.022902f, -0.024546f, 0.017143f, -0.012118f, -0.000433f, 0.018329f, -0.020778f, -0.009454f, -0.022657f, -0.009179f, -0.025248f, 0.023028f, 0.017147f, 0.030972f, -0.001382f, 0.007250f, -0.028162f, 0.006344f, -0.029203f, 0.028410f, 0.008207f, -0.004738f, 0.027143f, 0.027452f, 0.014220f, -0.016526f, -0.024381f, -0.035415f, + -0.001434f, -0.012607f, -0.017667f, 0.019055f, -0.005146f, 0.044510f, -0.032927f, -0.012160f, 0.025632f, -0.026717f, -0.010459f, 0.006024f, 0.000587f, -0.003989f, -0.025427f, 0.011553f, 0.004457f, -0.014007f, 0.012754f, 0.026783f, -0.023007f, 0.025848f, 0.032430f, -0.009790f, -0.017012f, 0.013202f, -0.013035f, 0.012189f, 0.007968f, -0.013645f, -0.010439f, -0.002798f, -0.004115f, 0.018843f, 0.006489f, -0.003330f, -0.009112f, -0.015163f, -0.008424f, 0.004653f, -0.009542f, 0.004499f, 0.009213f, 0.005745f, -0.006395f, 0.004845f, -0.005223f, 0.007124f, 0.004776f, 0.007962f, 0.004958f, 0.000269f, -0.008429f, 0.005456f, 0.008540f, -0.008673f, 0.000406f, 0.002859f, 0.003211f, 0.007218f, 0.000718f, -0.001046f, 0.008113f, 0.009811f, 0.001980f, -0.004620f, -0.007698f, -0.000287f, 0.006900f, 0.008366f, 0.005866f, 0.041474f, -0.009440f, 0.005805f, -0.002177f, -0.013741f, 0.018667f, -0.006879f, 0.006941f, 0.002172f, 0.026718f, -0.008463f, 0.031148f, 0.000452f, 0.015524f, 0.013681f, -0.002419f, -0.010158f, -0.030266f, 0.014312f, 0.031575f, 0.001579f, -0.000182f, 0.021810f, 0.018598f, -0.001428f, + 0.003456f, 0.037464f, 0.023549f, -0.006892f, 0.008201f, 0.024597f, -0.006202f, -0.027440f, 0.000672f, -0.019954f, -0.003114f, -0.012689f, 0.001174f, -0.037927f, -0.011284f, -0.013890f, 0.000647f, 0.007803f, 0.007968f, 0.036674f, 0.040659f, 0.021325f, -0.028132f, -0.016715f, 0.022846f, 0.031939f, 0.006771f, -0.029408f, -0.004826f, -0.007066f, -0.030555f, -0.019417f, -0.023142f, 0.028128f, -0.010586f, 0.003739f, -0.028771f, 0.041684f, 0.030838f, -0.003613f, 0.012731f, 0.069277f, -0.003545f, -0.014381f, -0.026725f, -0.001769f, 0.018411f, 0.014453f, -0.010785f, 0.020768f, 0.041495f, -0.017964f, 0.026447f, -0.012240f, 0.008622f, -0.016852f, -0.009110f, -0.014569f, -0.018910f, -0.009876f, 0.012277f, -0.000238f, -0.004214f, 0.002815f, 0.005048f, 0.022208f, -0.002564f, 0.002027f, -0.000350f, -0.010570f, -0.001215f, -0.003922f, 0.001979f, 0.008840f, -0.005975f, -0.003015f, -0.007384f, -0.003692f, 0.002431f, 0.002512f, -0.002753f, -0.015055f, -0.013946f, -0.005001f, -0.017152f, -0.015137f, -0.002846f, 0.012917f, 0.011532f, 0.009798f, 0.002110f, -0.002630f, 0.000441f, 0.005316f, 0.004533f, -0.002146f, + 0.003062f, 0.001996f, 0.021084f, 0.001691f, -0.013155f, -0.018137f, -0.029737f, 0.038705f, -0.024188f, 0.029121f, -0.021223f, -0.032439f, 0.001814f, 0.040096f, 0.026224f, -0.030155f, -0.019723f, 0.006600f, 0.006187f, 0.013359f, -0.002126f, 0.026630f, 0.014577f, 0.035185f, -0.012721f, -0.006258f, -0.001037f, -0.007191f, -0.033987f, -0.025534f, -0.007688f, 0.035365f, 0.007633f, 0.002476f, 0.001408f, -0.033588f, -0.037670f, -0.029602f, 0.015315f, 0.016945f, -0.012762f, -0.008884f, 0.003492f, 0.003763f, -0.020013f, 0.005475f, 0.037815f, 0.006255f, 0.023750f, 0.022826f, 0.016826f, 0.040046f, 0.058157f, 0.018689f, 0.001168f, 0.007990f, 0.023057f, -0.012468f, -0.006287f, 0.015038f, -0.005076f, 0.007869f, -0.005214f, 0.024671f, 0.009025f, 0.017362f, -0.004787f, -0.007048f, 0.012863f, 0.033080f, -0.002301f, -0.027828f, 0.017695f, -0.043333f, -0.049678f, -0.017455f, 0.025894f, -0.017040f, -0.049133f, -0.030526f, -0.012412f, 0.017572f, 0.012400f, -0.027058f, 0.047918f, -0.015791f, -0.033401f, 0.008321f, 0.013189f, -0.011457f, 0.016717f, -0.017732f, -0.006705f, 0.005749f, 0.004588f, -0.009543f, + 0.008540f, 0.001127f, 0.015172f, -0.008826f, -0.017954f, -0.010986f, 0.003091f, -0.004485f, -0.003573f, -0.001941f, 0.000200f, -0.001970f, 0.012305f, -0.002628f, 0.002093f, -0.005493f, 0.005699f, 0.009570f, 0.002023f, 0.009146f, 0.003057f, -0.015627f, -0.006622f, -0.000504f, -0.012994f, -0.015963f, 0.007437f, 0.010239f, -0.008421f, -0.017004f, -0.018037f, 0.006788f, 0.003017f, -0.001397f, 0.011658f, -0.007370f, 0.015665f, -0.069447f, 0.003697f, 0.035253f, -0.006557f, -0.008223f, 0.042689f, -0.022888f, -0.023753f, -0.030152f, -0.010090f, -0.010167f, -0.020201f, 0.005996f, 0.009710f, 0.016509f, 0.011550f, -0.009627f, -0.007716f, -0.003379f, -0.008638f, 0.002891f, 0.007949f, 0.034833f, -0.015027f, -0.045067f, 0.023997f, 0.000213f, -0.001446f, -0.037482f, 0.016599f, 0.007299f, -0.004010f, 0.042738f, -0.012359f, 0.004662f, -0.004093f, 0.018855f, 0.022589f, -0.024983f, -0.002600f, -0.014012f, -0.001774f, 0.012790f, -0.009603f, 0.019578f, -0.030664f, -0.025470f, -0.016270f, -0.027214f, -0.004887f, 0.002480f, 0.004066f, -0.038067f, -0.025181f, 0.018124f, 0.030548f, -0.014580f, -0.017334f, 0.016142f, + -0.035002f, -0.031586f, -0.030735f, 0.033592f, -0.056869f, 0.018404f, -0.003236f, -0.033465f, -0.010856f, 0.028222f, 0.071894f, -0.009682f, -0.020100f, 0.023732f, 0.055077f, 0.019827f, -0.012676f, -0.013440f, -0.002742f, 0.015095f, -0.001251f, 0.007018f, 0.032692f, 0.002114f, -0.012526f, -0.023300f, 0.019060f, -0.027482f, -0.018934f, -0.013719f, 0.009465f, -0.011381f, -0.020100f, -0.012655f, -0.012322f, -0.000256f, -0.014892f, 0.004942f, -0.011595f, -0.001113f, -0.003959f, 0.013851f, -0.010794f, -0.008409f, -0.021873f, -0.006573f, -0.004088f, -0.007421f, 0.020307f, -0.015295f, -0.019692f, -0.001394f, -0.017314f, -0.015764f, -0.007387f, 0.002149f, 0.015152f, -0.002192f, -0.006843f, -0.003153f, -0.010456f, 0.007011f, -0.020838f, -0.001977f, 0.021013f, 0.009914f, 0.013658f, -0.005588f, 0.005014f, 0.006593f, -0.005382f, -0.008319f, -0.011886f, 0.003890f, 0.009975f, -0.004402f, -0.038846f, -0.062601f, -0.003405f, 0.071238f, -0.011234f, -0.005380f, -0.047059f, -0.003835f, -0.002960f, 0.004653f, 0.015829f, 0.001880f, 0.013187f, 0.000658f, -0.000596f, -0.033954f, 0.004970f, 0.030365f, -0.020525f, 0.037725f, + -0.015858f, -0.002636f, -0.033540f, 0.021301f, -0.016636f, -0.011194f, -0.038737f, -0.052999f, 0.027064f, -0.026018f, -0.025199f, 0.008959f, 0.005536f, -0.011641f, 0.002712f, 0.029560f, -0.008742f, -0.028772f, -0.017582f, -0.036763f, -0.004370f, 0.010142f, 0.025346f, 0.004893f, -0.007349f, -0.006536f, -0.015029f, 0.008468f, 0.026307f, 0.004061f, -0.016351f, 0.029561f, -0.028518f, 0.002786f, -0.049194f, -0.014784f, -0.009601f, 0.060433f, -0.038330f, 0.012130f, -0.012429f, 0.007702f, -0.007040f, -0.007053f, 0.001201f, 0.024419f, 0.007508f, -0.045072f, 0.049277f, 0.014780f, 0.017605f, 0.006094f, -0.019624f, -0.015275f, -0.005619f, 0.005954f, -0.001091f, 0.009564f, -0.026640f, -0.028031f, -0.004533f, 0.013243f, 0.029928f, -0.018827f, 0.025380f, -0.006537f, 0.009883f, -0.020359f, 0.011420f, -0.033001f, 0.036571f, 0.001298f, 0.004054f, 0.011701f, 0.016476f, 0.001288f, -0.022869f, -0.011343f, 0.006119f, -0.021992f, 0.005834f, 0.009848f, 0.009102f, -0.013223f, -0.008062f, 0.021584f, 0.003942f, -0.022615f, -0.003287f, 0.018662f, -0.007252f, -0.027752f, 0.030920f, -0.008798f, 0.011882f, -0.005612f, + -0.009021f, -0.014978f, 0.009408f, 0.002248f, 0.009782f, 0.001110f, 0.016506f, 0.001580f, 0.011814f, -0.006215f, 0.000637f, 0.007093f, -0.004433f, -0.007003f, -0.031020f, -0.017934f, 0.066114f, -0.007918f, 0.005479f, -0.034112f, 0.030839f, -0.017502f, 0.022701f, -0.017664f, 0.039930f, 0.004364f, 0.004051f, -0.019041f, -0.015916f, 0.023682f, 0.051761f, -0.021155f, -0.031574f, 0.015300f, -0.012440f, 0.034578f, 0.043132f, 0.021721f, -0.006489f, 0.027146f, -0.017739f, -0.016029f, 0.036237f, 0.050373f, -0.055846f, 0.005066f, 0.008330f, 0.009954f, -0.018899f, -0.000813f, 0.022549f, -0.055937f, 0.016964f, 0.033496f, 0.012414f, -0.024597f, -0.006943f, 0.041020f, 0.033177f, 0.011551f, -0.019067f, -0.024377f, -0.048851f, 0.070217f, 0.012619f, 0.036362f, -0.005213f, -0.014306f, 0.007806f, 0.021393f, 0.000658f, -0.000585f, -0.056777f, 0.009337f, 0.053554f, -0.009024f, 0.051318f, -0.030243f, -0.013833f, -0.020919f, 0.011964f, 0.048833f, -0.015216f, -0.000838f, 0.043662f, 0.053891f, -0.017407f, -0.038407f, -0.034778f, -0.029739f, -0.014128f, -0.012228f, 0.030667f, -0.036986f, 0.020447f, 0.023721f, + -0.008556f, 0.003247f, 0.024024f, -0.004058f, -0.013882f, 0.015068f, 0.010193f, 0.008321f, 0.022078f, 0.005475f, -0.004010f, 0.020653f, 0.007089f, 0.009097f, 0.010084f, -0.002819f, 0.001119f, -0.003932f, 0.008578f, -0.036197f, -0.010347f, 0.002198f, -0.007312f, 0.015001f, -0.027803f, -0.002477f, 0.000179f, 0.010476f, -0.000835f, 0.016266f, 0.010677f, -0.006775f, 0.021928f, 0.011963f, -0.007900f, 0.016652f, 0.017083f, 0.000862f, -0.011396f, 0.009124f, 0.016605f, 0.010933f, -0.002754f, -0.015524f, -0.008151f, 0.004982f, 0.002300f, 0.003348f, 0.026369f, 0.019397f, 0.046537f, -0.014077f, 0.033705f, -0.017839f, -0.007114f, 0.031325f, -0.001055f, 0.042698f, -0.051537f, 0.032289f, 0.005886f, 0.014339f, -0.020733f, 0.015627f, 0.038445f, 0.074759f, -0.017217f, 0.018979f, -0.001057f, -0.049633f, 0.045475f, 0.004581f, 0.017766f, -0.009098f, -0.023247f, -0.008667f, -0.001930f, -0.019295f, -0.012135f, 0.063433f, 0.004400f, 0.024358f, -0.018212f, 0.044935f, 0.000198f, 0.021761f, 0.009166f, -0.026399f, -0.005679f, -0.016320f, 0.000414f, 0.008043f, 0.053121f, 0.026977f, 0.002159f, 0.006206f, + -0.001980f, -0.004536f, 0.008619f, 0.005181f, 0.033210f, 0.026990f, 0.013539f, -0.015999f, 0.023010f, 0.048497f, -0.046095f, 0.042476f, 0.006691f, 0.012639f, -0.046342f, -0.022130f, -0.058199f, -0.047037f, -0.009436f, 0.030996f, 0.025841f, -0.080679f, -0.000816f, -0.036538f, 0.018821f, 0.080019f, 0.040045f, -0.051941f, 0.027964f, -0.021556f, -0.026931f, 0.043919f, 0.022051f, -0.023083f, -0.012996f, 0.038581f, 0.031551f, 0.017061f, 0.049186f, -0.013750f, 0.030020f, 0.026339f, -0.031970f, 0.043804f, 0.011744f, 0.050894f, 0.015230f, -0.005229f, 0.029804f, -0.003625f, 0.007440f, -0.036570f, 0.026679f, -0.018108f, 0.013655f, -0.013623f, 0.005753f, 0.016168f, 0.040399f, 0.010136f, 0.024347f, 0.005680f, 0.007414f, -0.014065f, -0.003578f, -0.005458f, 0.002785f, 0.019846f, 0.016960f, 0.030159f, 0.010823f, -0.004445f, 0.004331f, -0.007992f, -0.004685f, -0.031785f, -0.005848f, 0.006912f, 0.009162f, 0.025789f, 0.023080f, 0.020919f, 0.026131f, -0.067552f, -0.103699f, -0.027198f, -0.011670f, -0.025754f, 0.005769f, 0.034853f, -0.036554f, 0.052644f, 0.019321f, -0.076258f, -0.058386f, -0.011878f, + 0.041629f, 0.001321f, 0.003495f, -0.008149f, -0.024111f, -0.073848f, 0.003041f, -0.062081f, -0.051259f, 0.024932f, 0.019964f, 0.017980f, -0.008654f, -0.024218f, 0.055827f, 0.033236f, -0.023676f, -0.048496f, 0.036866f, 0.018394f, 0.008696f, -0.022948f, -0.056504f, 0.021246f, -0.026517f, 0.008228f, -0.048126f, 0.058263f, 0.001476f, -0.023711f, 0.005737f, 0.014455f, 0.048298f, 0.029893f, -0.012336f, -0.002707f, 0.016936f, 0.016426f, 0.018632f, -0.011298f, -0.075470f, -0.059695f, 0.012046f, -0.008496f, 0.044231f, -0.008807f, -0.018923f, -0.053612f, 0.061926f, 0.023402f, -0.043081f, -0.044850f, 0.063526f, 0.059143f, -0.000579f, 0.043286f, -0.005785f, 0.001131f, -0.017993f, -0.011347f, -0.034051f, 0.041688f, -0.007730f, -0.009942f, -0.018173f, 0.016953f, -0.053604f, 0.024912f, -0.015658f, -0.010503f, 0.038169f, -0.001255f, 0.006082f, 0.009147f, 0.035043f, 0.017458f, -0.014218f, 0.025531f, -0.007690f, 0.030910f, 0.012444f, -0.035664f, 0.008804f, -0.018337f, 0.016768f, -0.014968f, 0.000416f, -0.023852f, -0.011970f, 0.012403f, -0.023112f, 0.009394f, 0.007972f, 0.009663f, -0.020658f, -0.015267f, + -0.026598f, -0.023792f, 0.031105f, -0.011658f, 0.020092f, 0.012174f, -0.019009f, -0.003135f, -0.016623f, 0.000229f, -0.010541f, 0.038853f, 0.033149f, 0.022007f, 0.030963f, -0.008044f, -0.034364f, -0.039797f, -0.005637f, 0.011474f, 0.057268f, 0.034548f, -0.013223f, -0.011135f, -0.015435f, -0.028958f, -0.001769f, 0.012520f, 0.005786f, 0.036378f, 0.003564f, -0.025639f, -0.065873f, 0.103868f, 0.002618f, -0.080343f, -0.006081f, -0.029909f, 0.013587f, 0.039863f, 0.036209f, -0.044699f, -0.071729f, 0.012252f, -0.034331f, 0.010941f, -0.006995f, 0.031626f, -0.010383f, 0.004525f, 0.018789f, -0.029303f, -0.035933f, 0.003797f, 0.009432f, 0.031314f, -0.000718f, -0.050099f, 0.032953f, -0.027942f, 0.025898f, -0.024286f, -0.016534f, -0.002735f, -0.007951f, -0.053861f, 0.010118f, 0.015049f, -0.052076f, 0.022028f, -0.020468f, 0.010433f, -0.017377f, 0.050312f, 0.039175f, -0.050732f, -0.026929f, 0.034650f, 0.043417f, -0.051913f, 0.068532f, 0.004446f, 0.055182f, 0.040095f, 0.065118f, -0.020144f, -0.027639f, 0.014623f, -0.054038f, 0.008253f, 0.006826f, 0.094883f, -0.029420f, -0.089191f, 0.150566f, -0.071141f, + -0.054728f, 0.086809f, 0.039207f, -0.050651f, 0.084346f, 0.009387f, -0.068710f, 0.085443f, 0.010310f, 0.007649f, -0.014942f, 0.012551f, 0.056689f, -0.013873f, -0.019783f, -0.029523f, 0.042202f, -0.015385f, -0.010846f, -0.005944f, -0.017073f, -0.018217f, -0.026513f, 0.025329f, -0.003832f, -0.002388f, -0.009653f, -0.006555f, 0.003132f, -0.011460f, -0.019964f, 0.002502f, -0.016180f, -0.029860f, -0.031135f, 0.038532f, -0.016881f, 0.003544f, 0.035479f, -0.017178f, -0.016464f, 0.002462f, 0.017510f, 0.007550f, 0.007356f, 0.034196f, -0.021327f, 0.004898f, -0.015779f, -0.009787f, -0.007070f, 0.056585f, 0.027896f, -0.009272f, 0.007822f, -0.030092f, 0.009375f, -0.027548f, -0.017328f, 0.013212f, -0.007553f, -0.056790f, 0.034664f, 0.014207f, -0.010851f, -0.093609f, 0.013056f, 0.027918f, -0.070036f, 0.032008f, 0.018688f, -0.024689f, -0.006876f, -0.001316f, -0.017061f, -0.005722f, -0.009936f, -0.031347f, 0.001022f, -0.015666f, -0.003293f, -0.007740f, 0.015390f, 0.055816f, 0.046930f, -0.043153f, -0.004597f, 0.058751f, -0.010131f, -0.011069f, -0.059963f, 0.006929f, 0.019920f, -0.009851f, 0.051428f, 0.122845f, + -0.041141f, -0.051777f, 0.087657f, -0.005835f, -0.046969f, 0.054591f, 0.036132f, -0.028297f, -0.042165f, -0.052343f, 0.016175f, 0.028118f, -0.023115f, 0.082450f, 0.053989f, -0.102762f, -0.098427f, 0.057556f, -0.046205f, -0.060082f, 0.078228f, 0.012606f, 0.104647f, 0.050169f, -0.012426f, -0.013986f, -0.075096f, -0.058687f, 0.171745f, 0.047417f, -0.036543f, -0.082923f, 0.002569f, -0.033744f, -0.073862f, -0.011481f, 0.087101f, 0.037012f, 0.001376f, 0.071556f, 0.062762f, -0.019726f, -0.079298f, 0.012423f, 0.048000f, -0.019673f, -0.018315f, 0.099699f, 0.057577f, 0.009989f, -0.010155f, -0.051128f, -0.049895f, -0.012870f, 0.047754f, 0.019215f, -0.018935f, -0.009036f, -0.021958f, 0.018757f, -0.013989f, -0.019094f, -0.012021f, -0.002276f, 0.014618f, 0.019276f, 0.017393f, 0.007230f, -0.045180f, -0.015823f, -0.008523f, 0.017295f, -0.017301f, 0.003252f, -0.004283f, 0.042007f, -0.026593f, -0.018695f, 0.043737f, 0.012197f, -0.021417f, 0.034218f, -0.011397f, 0.010087f, 0.003209f, 0.007894f, -0.025595f, -0.006933f, 0.036155f, 0.035018f, 0.015055f, -0.013699f, 0.009917f, -0.015745f, -0.012184f, -0.009628f, + 0.019317f, -0.029077f, -0.005500f, 0.023353f, 0.093124f, 0.077307f, -0.020572f, 0.054907f, 0.005831f, -0.042831f, 0.027513f, 0.046885f, 0.015863f, 0.020213f, -0.061390f, -0.012644f, 0.007383f, 0.012343f, -0.008892f, -0.053640f, -0.019107f, 0.019190f, -0.012858f, -0.005805f, -0.045108f, 0.069405f, 0.008890f, -0.057487f, 0.032683f, 0.081501f, -0.041933f, -0.024681f, 0.012142f, 0.026786f, -0.026127f, -0.051547f, 0.044297f, 0.074095f, -0.005739f, -0.029351f, 0.009857f, 0.020861f, 0.034039f, 0.047402f, 0.003352f, 0.086419f, -0.001714f, -0.096606f, 0.000979f, -0.011035f, 0.031684f, -0.010273f, -0.078509f, -0.002360f, -0.033775f, -0.033397f, 0.047503f, 0.024666f, 0.027198f, 0.033770f, -0.070330f, -0.037097f, -0.012151f, -0.001129f, 0.028741f, 0.000810f, -0.014180f, 0.001800f, -0.023912f, -0.048285f, 0.004917f, 0.074620f, -0.038205f, 0.006940f, -0.029631f, -0.021582f, 0.051416f, -0.063109f, -0.000442f, 0.027461f, -0.021994f, 0.010137f, 0.008113f, 0.015471f, 0.018401f, -0.033429f, -0.039546f, 0.066779f, -0.013656f, -0.021928f, 0.034773f, -0.034579f, 0.021807f, 0.004101f, -0.013859f, 0.010339f, + 0.029261f, -0.005725f, 0.004192f, -0.014507f, 0.007248f, 0.001584f, -0.001647f, -0.012985f, 0.016117f, 0.007690f, -0.001311f, -0.001597f, 0.013567f, 0.010797f, -0.012082f, -0.022533f, 0.012469f, -0.001607f, 0.006491f, 0.001025f, -0.005491f, 0.011215f, 0.000611f, 0.009252f, -0.003401f, -0.002098f, -0.006183f, 0.001514f, 0.011058f, -0.002713f, 0.027135f, -0.011210f, -0.007842f, 0.000907f, -0.011388f, 0.007128f, -0.080510f, -0.115491f, -0.102131f, 0.205442f, 0.196113f, 0.195720f, 0.552552f, 0.196311f, -0.022749f, 0.036365f, -0.382052f, -0.465382f, -0.156345f, -0.261137f, -0.361876f, 0.046536f, -0.020068f, -0.060560f, 0.398572f, 0.243270f, 0.101645f, 0.622390f, 0.293871f, 0.054328f, 0.283814f, -0.067307f, -0.338580f, -0.324287f, -0.308900f, -0.428151f, -0.419142f, -0.098448f, -0.151255f, -0.246826f, 0.288292f, 0.132728f, -0.103721f, 0.416231f, 0.134534f, -0.048883f, 0.470713f, 0.428781f, 0.098871f, 0.444966f, 0.451598f, -0.017320f, 0.112226f, 0.051110f, -0.434426f, -0.504439f, -0.375560f, -0.710138f, -0.672402f, -0.403909f, -0.539308f, -0.405788f, 0.046121f, 0.333618f, 0.378714f, 0.813520f, + 0.739799f, 0.652238f, 0.702877f, 0.518345f, 0.263329f, 0.080382f, -0.056853f, -0.395940f, -0.477217f, -0.511002f, -0.575758f, -0.546403f, -0.465616f, -0.300983f, -0.218504f, -0.213814f, 0.041031f, 0.129659f, 0.254777f, 0.605463f, 0.628945f, 0.429950f, 0.537557f, 0.227234f, -0.073977f, -0.177895f, -0.275398f, -0.377711f, -0.273357f, -0.182919f, -0.181871f, -0.062742f, -0.016884f, 0.001562f, 0.097170f, 0.123163f, 0.117576f, 0.179756f, 0.113433f, 0.073254f, 0.090937f, -0.053543f, -0.049283f, 0.015322f, -0.145408f, -0.103061f, -0.037662f, -0.140699f, -0.086613f, -0.009700f, -0.141355f, -0.149580f, -0.099028f, -0.146771f, -0.096043f, 0.110666f, 0.207056f, 0.328873f, 0.485363f, 0.452733f, 0.387790f, 0.364282f, 0.197378f, -0.060051f, -0.302543f, -0.536194f, -0.636418f, -0.574216f, -0.464536f, -0.350892f, -0.164195f, 0.052837f, 0.208811f, 0.292450f, 0.315993f, 0.278708f, 0.249180f, 0.231517f, 0.233790f, 0.162606f, 0.077700f, 0.036015f, -0.019143f, -0.065578f, -0.058700f, -0.106877f, -0.114473f, -0.080750f, -0.059453f, -0.079311f, -0.075018f, -0.096653f, -0.108201f, -0.100722f, -0.068209f, -0.032261f, + 0.013400f, 0.020041f, 0.014214f, 0.000959f} + }, + { + {-0.006839f, 0.025744f, 0.013624f, 0.011354f, 0.006323f, -0.002728f, -0.000811f, -0.002637f, -0.005362f, -0.007433f, -0.005263f, -0.007596f, -0.003214f, 0.007232f, 0.002463f, -0.000378f, -0.000010f, 0.004741f, 0.002204f, -0.003000f, -0.003231f, -0.002432f, -0.013423f, 0.005563f, 0.001405f, 0.000130f, -0.002771f, 0.001742f, 0.000235f, -0.003710f, 0.001935f, 0.004912f, -0.000021f, -0.006129f, -0.001562f, -0.002650f, -0.002854f, 0.000755f, 0.005904f, -0.001530f, 0.001393f, -0.007017f, 0.004503f, -0.008670f, 0.005523f, 0.001223f, 0.000326f, 0.000066f, 0.005494f, -0.006656f, -0.004943f, -0.009071f, 0.002404f, 0.001629f, 0.000443f, 0.005175f, -0.005599f, 0.001206f, -0.000771f, 0.000147f, -0.004086f, 0.003590f, 0.001634f, -0.003011f, 0.005583f, -0.008921f, 0.004077f, -0.004871f, 0.009077f, 0.004134f, 0.001587f, 0.000644f, -0.001830f, -0.011131f, 0.008461f, -0.002677f, -0.000294f, 0.001447f, 0.002349f, 0.002013f, 0.002222f, 0.002672f, -0.000831f, 0.000770f, -0.001262f, 0.002607f, -0.000218f, 0.001478f, -0.003402f, 0.001136f, -0.000558f, 0.000721f, 0.001318f, 0.003608f, -0.000238f, -0.000636f, + 0.001192f, 0.001416f, -0.001504f, 0.001855f, -0.002253f, 0.001810f, 0.000351f, 0.001609f, 0.000083f, 0.001031f, -0.000621f, 0.000393f, 0.001377f, 0.000680f, -0.000285f, 0.001058f, -0.000287f, 0.024601f, 0.011721f, 0.016061f, 0.004401f, 0.005463f, -0.000932f, 0.006285f, 0.000661f, 0.005586f, -0.004117f, 0.010891f, -0.002762f, -0.012447f, -0.003410f, 0.000253f, 0.000686f, -0.003954f, 0.009547f, 0.000525f, 0.003731f, 0.009220f, 0.004518f, 0.000102f, -0.000009f, 0.002194f, -0.008410f, -0.005570f, 0.003348f, 0.004009f, -0.003057f, 0.000874f, 0.004119f, -0.008352f, 0.011774f, -0.001214f, 0.001739f, -0.001874f, 0.004375f, 0.006065f, 0.000309f, -0.006389f, -0.006506f, 0.012761f, 0.000289f, -0.003740f, -0.000537f, 0.007346f, 0.005441f, -0.003809f, -0.005122f, -0.011273f, -0.003494f, -0.004631f, 0.000471f, -0.004184f, 0.001008f, -0.010954f, -0.004470f, 0.001257f, -0.004459f, 0.002396f, 0.004414f, -0.002231f, -0.000294f, 0.002059f, -0.002780f, 0.004295f, -0.000316f, 0.005407f, 0.000067f, -0.001879f, -0.006296f, 0.000699f, -0.007809f, 0.002442f, 0.000143f, 0.004407f, 0.000080f, 0.004526f, + 0.005851f, 0.004970f, 0.000190f, -0.003253f, -0.000247f, -0.001200f, 0.006458f, -0.001757f, 0.000828f, 0.004114f, 0.004320f, -0.000318f, 0.002436f, 0.000855f, 0.002226f, -0.000928f, 0.002695f, -0.001038f, 0.003973f, 0.000893f, 0.000760f, -0.000345f, 0.000356f, 0.000386f, 0.005203f, -0.016608f, -0.005352f, -0.003798f, 0.002897f, 0.003254f, -0.011338f, -0.005111f, -0.002240f, 0.002699f, 0.006042f, 0.001875f, 0.008281f, -0.006851f, -0.009858f, 0.002834f, 0.000346f, -0.001796f, -0.006748f, 0.021902f, -0.001131f, 0.005809f, 0.001322f, 0.000659f, -0.000480f, -0.003403f, -0.008323f, -0.006568f, -0.002035f, 0.005578f, -0.004643f, 0.011456f, -0.003873f, -0.001095f, -0.009395f, -0.011223f, -0.000950f, -0.007167f, -0.003957f, 0.015247f, -0.008332f, -0.002338f, -0.008088f, 0.002946f, 0.000403f, -0.002963f, -0.008499f, -0.001647f, 0.000089f, -0.009691f, 0.001159f, -0.005227f, 0.007753f, 0.005062f, -0.004432f, -0.002393f, -0.002440f, 0.002346f, -0.000401f, 0.006119f, -0.003155f, -0.004060f, -0.004122f, 0.013903f, 0.012600f, -0.004340f, -0.012089f, 0.001619f, 0.003774f, -0.000412f, 0.003587f, -0.005055f, + 0.001019f, -0.005859f, 0.004194f, 0.000295f, 0.013403f, 0.008222f, 0.012745f, -0.011601f, 0.005045f, 0.007724f, 0.000331f, 0.005855f, 0.004271f, 0.000851f, 0.008782f, -0.001634f, -0.000893f, 0.002215f, 0.001254f, -0.003619f, 0.003529f, -0.002779f, -0.002317f, -0.000274f, 0.000932f, -0.000420f, 0.001370f, -0.002084f, 0.001070f, -0.000291f, 0.000320f, 0.001105f, 0.001658f, 0.000739f, 0.001915f, 0.001719f, -0.001282f, -0.001793f, 0.001439f, 0.000480f, -0.003091f, -0.001317f, 0.002587f, -0.001575f, -0.054568f, -0.008837f, -0.015724f, -0.017840f, 0.004801f, -0.006038f, -0.015511f, -0.012858f, 0.002159f, -0.012667f, 0.001806f, 0.018889f, -0.004687f, 0.008109f, 0.006154f, 0.015928f, 0.004151f, -0.011092f, 0.002557f, 0.017313f, -0.008066f, 0.008621f, -0.012756f, -0.011638f, 0.003837f, 0.004970f, 0.013627f, 0.000804f, -0.008321f, 0.007905f, -0.005573f, 0.006068f, -0.000674f, 0.008592f, -0.007248f, -0.004716f, -0.008087f, 0.000113f, 0.001513f, -0.003174f, 0.006278f, -0.014323f, 0.001887f, 0.014462f, 0.003175f, -0.004090f, 0.005613f, -0.007381f, -0.003698f, -0.018084f, -0.005310f, -0.000591f, + 0.002885f, 0.000316f, 0.009777f, -0.014517f, 0.001469f, -0.001983f, 0.007378f, 0.003925f, -0.002748f, 0.010362f, -0.009015f, -0.001210f, -0.007220f, -0.013948f, -0.005813f, -0.003199f, -0.003876f, 0.010512f, -0.009328f, -0.015069f, 0.000671f, 0.004955f, -0.001433f, -0.004336f, 0.005268f, 0.005782f, -0.004136f, -0.003387f, -0.005778f, -0.002404f, 0.012228f, -0.005620f, 0.006785f, -0.001987f, -0.000117f, -0.001098f, -0.000311f, -0.006271f, 0.001641f, -0.003746f, -0.000078f, -0.000425f, -0.000801f, 0.000171f, -0.001340f, -0.001948f, -0.001821f, -0.000507f, 0.000729f, -0.001192f, 0.002134f, 0.000922f, -0.027104f, 0.015445f, 0.017498f, -0.000989f, 0.009841f, 0.004413f, 0.020662f, 0.027359f, 0.003571f, 0.003547f, 0.007915f, 0.003366f, 0.004609f, -0.003933f, 0.005476f, -0.004555f, 0.007255f, 0.008346f, -0.023420f, 0.012127f, -0.002522f, -0.004389f, -0.007211f, -0.009545f, 0.003888f, 0.006633f, 0.010736f, 0.002048f, 0.001867f, -0.013746f, 0.000646f, -0.004040f, -0.004533f, -0.002070f, 0.001876f, 0.000751f, -0.001007f, 0.013435f, -0.000661f, -0.004513f, 0.004491f, -0.005278f, 0.006944f, 0.009063f, + 0.010220f, 0.005250f, 0.001152f, -0.005713f, 0.011409f, 0.003570f, 0.001564f, 0.001146f, 0.001529f, 0.000775f, -0.006552f, -0.009319f, 0.008448f, -0.008691f, 0.008093f, 0.007312f, 0.005432f, -0.001246f, -0.006083f, 0.005458f, 0.007189f, 0.015840f, 0.007360f, 0.005943f, 0.003745f, -0.015608f, -0.004765f, 0.001849f, -0.002525f, 0.006628f, -0.013454f, 0.000612f, 0.004462f, -0.012668f, -0.001176f, 0.004158f, -0.003046f, 0.001544f, -0.007381f, 0.002715f, 0.000952f, -0.003227f, 0.005811f, 0.003342f, 0.000229f, 0.006295f, -0.002891f, -0.002888f, -0.000648f, 0.001244f, 0.002595f, 0.009579f, 0.001566f, 0.003216f, 0.002264f, -0.000170f, 0.002092f, -0.001675f, -0.001854f, -0.002680f, 0.001681f, -0.001513f, -0.001262f, 0.001001f, 0.000998f, -0.001271f, 0.003245f, -0.002007f, 0.002257f, 0.002020f, -0.001000f, 0.003081f, 0.000874f, 0.001258f, 0.001540f, 0.000117f, 0.000294f, 0.003591f, -0.000318f, 0.050347f, 0.015185f, 0.003722f, 0.009851f, 0.025168f, 0.010145f, 0.030348f, 0.007437f, -0.006697f, -0.002176f, -0.002548f, -0.002896f, 0.008233f, 0.013009f, -0.006048f, 0.002795f, 0.009064f, + -0.003370f, -0.012619f, 0.010025f, -0.001192f, 0.004767f, -0.004302f, -0.006330f, 0.010309f, 0.002407f, -0.000953f, -0.002933f, -0.011498f, -0.005682f, 0.006218f, 0.001564f, -0.003960f, -0.002013f, 0.001734f, 0.004330f, 0.011555f, 0.003658f, -0.010663f, -0.002441f, 0.000681f, -0.003343f, 0.003826f, 0.005487f, -0.010747f, -0.012959f, -0.000762f, 0.003258f, -0.001385f, 0.010026f, -0.018492f, -0.003916f, -0.008394f, -0.010392f, -0.001153f, -0.000794f, 0.002719f, 0.009910f, -0.000110f, 0.001501f, 0.003186f, -0.001589f, 0.013187f, 0.008436f, -0.010851f, -0.009495f, 0.007221f, 0.016003f, -0.001399f, -0.007470f, 0.015756f, 0.008353f, 0.003638f, -0.006923f, -0.007542f, 0.007808f, 0.000383f, 0.005909f, -0.003592f, -0.011443f, -0.006337f, -0.007785f, -0.004965f, 0.004536f, -0.006414f, 0.000891f, 0.002705f, -0.002287f, 0.002622f, 0.001936f, 0.002228f, 0.001338f, -0.004162f, 0.002304f, -0.001336f, -0.002168f, -0.001036f, 0.003093f, 0.002380f, 0.000419f, -0.003584f, 0.003166f, -0.001441f, 0.005460f, -0.000895f, 0.000759f, -0.005238f, -0.006677f, 0.002183f, -0.006285f, -0.001268f, -0.000965f, -0.003605f, + -0.001704f, 0.000717f, -0.005643f, -0.002407f, -0.000572f, 0.000573f, -0.001178f, 0.003922f, 0.000564f, -0.001564f, 0.024705f, 0.012002f, 0.022245f, -0.007505f, 0.000178f, -0.005658f, 0.022411f, -0.023059f, -0.003280f, 0.005906f, -0.004423f, -0.004567f, 0.007499f, -0.002592f, -0.007115f, 0.019666f, 0.011109f, 0.002265f, 0.033221f, -0.009081f, -0.002220f, -0.007035f, 0.000245f, 0.005487f, -0.008586f, -0.001105f, -0.004461f, 0.012680f, -0.010732f, 0.002853f, 0.000736f, -0.003371f, 0.001147f, 0.007453f, 0.005072f, -0.010091f, -0.017608f, 0.000413f, 0.003611f, 0.014569f, 0.017089f, 0.017018f, 0.001541f, -0.009815f, 0.012235f, -0.029707f, -0.004899f, -0.011669f, -0.017300f, 0.012092f, -0.003989f, -0.005602f, 0.009418f, -0.003426f, -0.005076f, 0.025919f, 0.000297f, -0.007652f, 0.009016f, 0.000694f, 0.006858f, 0.005059f, 0.003369f, 0.015702f, -0.009428f, -0.005779f, 0.000910f, -0.013485f, -0.000121f, 0.002549f, -0.003435f, 0.004623f, 0.007749f, 0.016511f, -0.006244f, 0.005505f, 0.014248f, 0.008660f, 0.004211f, 0.002693f, -0.004930f, -0.010426f, 0.005318f, 0.007955f, -0.001753f, 0.000798f, + -0.001669f, -0.001331f, -0.005957f, 0.001165f, -0.001841f, 0.001021f, -0.005566f, -0.002791f, -0.000005f, -0.000970f, 0.005113f, 0.002237f, -0.000005f, -0.007139f, -0.003265f, 0.003549f, -0.004196f, -0.000072f, 0.002721f, 0.002805f, -0.004855f, 0.004490f, 0.003466f, 0.001155f, 0.004589f, 0.004170f, -0.008309f, -0.001471f, -0.003224f, 0.002249f, 0.004433f, 0.005462f, -0.001189f, -0.003041f, 0.000661f, -0.001651f, -0.038519f, -0.057906f, -0.009755f, 0.002858f, -0.000998f, 0.001590f, -0.002703f, -0.011622f, -0.006536f, -0.009266f, -0.002484f, 0.009403f, 0.011237f, -0.010205f, -0.015030f, 0.012850f, 0.002671f, -0.008264f, 0.000679f, -0.001378f, -0.009162f, -0.007698f, 0.021365f, 0.010867f, -0.011474f, 0.005832f, 0.002425f, 0.009136f, -0.011131f, 0.012400f, -0.012381f, 0.008523f, 0.005580f, -0.002622f, -0.005770f, 0.005506f, -0.023091f, -0.011464f, 0.014163f, 0.022794f, 0.012661f, -0.015950f, 0.000386f, -0.011309f, 0.015167f, 0.003138f, 0.003943f, 0.001081f, -0.012477f, 0.006069f, 0.018555f, 0.002100f, 0.014032f, 0.009932f, 0.006435f, 0.010730f, 0.022760f, -0.006304f, -0.022884f, 0.011111f, + 0.000081f, -0.005415f, 0.001184f, 0.019695f, -0.008024f, -0.013672f, 0.006730f, -0.003613f, -0.002311f, -0.005169f, -0.003055f, -0.006146f, -0.010683f, -0.005370f, 0.013223f, -0.017979f, -0.011264f, -0.006624f, -0.012896f, -0.012560f, -0.000723f, 0.007822f, -0.011819f, -0.000201f, -0.004350f, -0.004990f, -0.010642f, -0.006736f, -0.012224f, -0.000641f, -0.009386f, -0.000714f, -0.000186f, 0.008639f, 0.006185f, -0.004354f, -0.004617f, -0.006248f, -0.001832f, -0.004414f, -0.004166f, 0.005248f, -0.008281f, 0.003181f, 0.000810f, -0.005296f, 0.000672f, -0.003457f, 0.002116f, -0.001777f, -0.006734f, -0.008339f, 0.000034f, 0.002225f, 0.003589f, -0.001559f, 0.001596f, 0.002673f, 0.000128f, -0.004339f, -0.000459f, -0.005566f, 0.000725f, 0.002629f, 0.002561f, -0.022271f, -0.014511f, 0.003764f, 0.003568f, 0.029698f, -0.025958f, -0.017759f, -0.010024f, -0.004905f, -0.003217f, 0.009608f, 0.009284f, -0.013741f, 0.014129f, -0.003269f, 0.006409f, -0.009895f, 0.021062f, -0.004089f, -0.007928f, 0.013618f, 0.009824f, 0.007925f, -0.014315f, -0.013467f, 0.017831f, -0.009328f, 0.005268f, 0.004364f, -0.006449f, 0.015156f, + 0.004621f, -0.000009f, 0.003381f, 0.011127f, 0.014288f, 0.004404f, -0.012674f, 0.002959f, -0.018092f, 0.010813f, 0.004743f, -0.020271f, 0.014399f, 0.003351f, -0.010521f, 0.018576f, 0.005933f, -0.005026f, 0.010860f, -0.001677f, 0.020539f, -0.004685f, -0.005103f, -0.004343f, -0.002652f, 0.026688f, 0.005671f, 0.000462f, 0.007299f, -0.022419f, -0.013967f, -0.015234f, 0.001712f, 0.014200f, 0.001934f, 0.017611f, -0.022714f, -0.009359f, -0.014395f, -0.013385f, 0.033260f, -0.003380f, 0.011919f, 0.008514f, -0.007068f, -0.001667f, -0.004566f, 0.002514f, 0.001813f, 0.009065f, 0.005594f, 0.018158f, -0.009726f, 0.001505f, -0.003037f, 0.003943f, -0.000058f, -0.000360f, 0.000014f, -0.003878f, -0.017075f, 0.006378f, 0.004072f, 0.002536f, -0.004482f, -0.001622f, -0.002129f, -0.009578f, -0.000536f, -0.003436f, -0.006146f, 0.003472f, -0.005174f, 0.002226f, 0.003140f, 0.002395f, 0.004008f, -0.006673f, -0.003545f, -0.004527f, -0.004018f, 0.002375f, 0.004845f, 0.002779f, -0.001490f, -0.000920f, -0.001098f, -0.002094f, 0.007008f, -0.002401f, 0.005016f, 0.003059f, -0.001787f, 0.002059f, -0.001272f, -0.000021f, + 0.001825f, 0.001830f, -0.030054f, 0.009371f, -0.012898f, 0.007301f, -0.009016f, 0.024274f, 0.004114f, -0.017045f, 0.002698f, -0.017376f, 0.014102f, 0.026833f, -0.022878f, 0.015104f, 0.005622f, -0.000694f, 0.011095f, 0.028604f, -0.010923f, -0.000051f, 0.008779f, -0.031276f, 0.001858f, 0.014198f, -0.008662f, 0.010172f, 0.011126f, -0.005722f, 0.028078f, -0.013999f, -0.025343f, -0.010931f, 0.003087f, 0.000662f, -0.005161f, -0.010956f, 0.007680f, 0.007068f, 0.000046f, -0.017879f, -0.004158f, -0.004539f, 0.011974f, -0.007836f, 0.047077f, -0.005926f, 0.006773f, -0.002173f, -0.001960f, -0.022832f, 0.002384f, 0.016921f, 0.013736f, 0.045873f, -0.004891f, -0.004446f, -0.009459f, -0.001813f, -0.012872f, -0.000981f, 0.018442f, -0.009797f, -0.001857f, 0.003331f, 0.004386f, 0.018087f, 0.014764f, 0.004163f, 0.035562f, -0.006717f, -0.032847f, -0.032929f, -0.023177f, -0.004781f, 0.010438f, -0.003245f, -0.008597f, 0.015672f, -0.000905f, 0.013917f, -0.008526f, -0.001626f, 0.011349f, 0.009592f, -0.003433f, -0.003359f, 0.001205f, 0.002942f, -0.003603f, -0.007684f, -0.011001f, -0.003721f, -0.004644f, -0.001387f, + -0.007827f, 0.005899f, -0.002315f, 0.001778f, -0.003936f, -0.005660f, 0.007649f, 0.003412f, -0.003823f, -0.001042f, -0.003123f, -0.003374f, 0.003370f, -0.002098f, -0.003703f, -0.007474f, 0.005969f, 0.002352f, -0.003155f, -0.005658f, -0.007476f, -0.001401f, -0.005121f, -0.005225f, 0.006422f, -0.003754f, 0.001327f, 0.000271f, -0.002679f, 0.002747f, 0.001307f, -0.001018f, -0.001339f, -0.001653f, 0.053509f, -0.038564f, -0.029254f, -0.009360f, -0.018484f, -0.021140f, 0.025957f, 0.010531f, 0.005206f, -0.008156f, -0.005175f, 0.031495f, -0.009137f, -0.013232f, -0.037662f, -0.005433f, -0.000906f, 0.017795f, 0.006589f, -0.007642f, 0.002349f, 0.015606f, 0.007079f, 0.009767f, 0.024148f, 0.030298f, 0.008425f, -0.011263f, 0.007825f, -0.018168f, 0.012491f, 0.010231f, -0.006484f, 0.000630f, -0.014070f, 0.005706f, 0.000396f, -0.027302f, 0.026635f, -0.002383f, -0.012379f, 0.016442f, -0.025261f, -0.005836f, 0.027811f, 0.015866f, -0.000348f, 0.001046f, -0.035002f, 0.012292f, 0.019561f, 0.011162f, 0.006500f, -0.001915f, -0.025837f, -0.075924f, -0.006059f, 0.015478f, 0.021335f, -0.001949f, -0.022271f, 0.037509f, + -0.017378f, 0.017119f, 0.028395f, 0.023399f, 0.004349f, 0.028306f, 0.003217f, 0.010088f, 0.005987f, 0.017176f, 0.003374f, 0.005448f, 0.036051f, -0.012097f, -0.007883f, 0.030480f, 0.015887f, 0.008258f, -0.012606f, 0.003050f, 0.024789f, -0.002709f, 0.019859f, 0.004548f, 0.004313f, 0.012491f, -0.006752f, -0.000638f, 0.001304f, -0.001338f, -0.005639f, 0.009721f, 0.004497f, -0.013604f, 0.007414f, 0.005026f, 0.007134f, 0.003493f, -0.003947f, -0.000065f, -0.004379f, -0.005027f, 0.005945f, 0.007575f, 0.003113f, 0.004559f, -0.004118f, -0.004020f, -0.002770f, -0.004932f, -0.006468f, -0.009649f, 0.001304f, -0.006230f, 0.004457f, -0.002358f, 0.002540f, -0.008942f, -0.005939f, -0.001987f, -0.003026f, -0.002754f, -0.004174f, 0.000995f, 0.008335f, 0.008709f, 0.003158f, 0.000541f, -0.005143f, 0.006834f, 0.026733f, 0.025427f, -0.006727f, -0.013034f, -0.002535f, -0.007692f, 0.029250f, 0.019013f, -0.051086f, -0.005605f, 0.004090f, -0.023964f, 0.009425f, -0.034954f, 0.026465f, 0.006419f, -0.004213f, 0.014499f, 0.007106f, -0.007361f, -0.011853f, -0.008581f, 0.037390f, 0.001495f, -0.000421f, 0.008287f, + -0.005214f, 0.015020f, 0.044059f, 0.018000f, -0.006605f, -0.007817f, -0.006650f, 0.025596f, 0.008938f, 0.025917f, 0.017764f, 0.012930f, 0.007292f, -0.011294f, -0.012604f, 0.011560f, -0.026434f, 0.004483f, -0.014138f, -0.011660f, 0.000687f, 0.018122f, 0.002331f, 0.001458f, 0.006280f, -0.005702f, 0.030099f, 0.039329f, 0.044776f, -0.000212f, 0.020307f, -0.026715f, 0.010079f, 0.015482f, -0.012497f, 0.022902f, -0.018574f, -0.036589f, 0.004604f, -0.019172f, -0.003133f, 0.001733f, -0.019712f, 0.004901f, 0.026324f, -0.016144f, -0.016044f, 0.013412f, 0.024358f, -0.001080f, -0.009351f, 0.022678f, 0.001725f, 0.005099f, -0.015861f, -0.003188f, -0.001369f, 0.018730f, -0.009791f, 0.001558f, -0.004704f, 0.004142f, -0.000679f, 0.003672f, 0.004417f, 0.003379f, -0.000304f, 0.001901f, 0.003737f, 0.005322f, -0.004614f, -0.008411f, -0.001886f, -0.001199f, -0.008238f, -0.009528f, -0.001117f, -0.004339f, 0.006478f, -0.006412f, 0.004817f, 0.009163f, -0.001057f, -0.014907f, -0.002055f, 0.003052f, -0.005802f, -0.006965f, 0.000484f, 0.004295f, 0.022811f, 0.007933f, 0.006618f, -0.000575f, -0.000062f, -0.001864f, + 0.006206f, -0.001507f, 0.006636f, 0.019768f, 0.017206f, -0.002127f, -0.001715f, -0.003166f, 0.000203f, -0.031863f, 0.057983f, 0.003621f, 0.015106f, 0.044263f, -0.016333f, 0.004488f, -0.008412f, 0.011643f, -0.012734f, 0.012747f, -0.031140f, -0.037012f, -0.001088f, -0.021934f, -0.001633f, -0.002078f, -0.002440f, -0.006280f, 0.002410f, -0.010283f, 0.009284f, -0.029423f, -0.011705f, -0.039682f, -0.001959f, 0.009074f, 0.019067f, 0.042809f, 0.023796f, 0.007388f, 0.005518f, 0.012285f, 0.009546f, 0.007216f, 0.017352f, 0.018122f, -0.005701f, -0.036240f, -0.035865f, -0.024640f, -0.014662f, 0.003595f, 0.012173f, -0.013276f, -0.020994f, -0.036759f, 0.001129f, -0.014042f, 0.033616f, -0.014959f, 0.008501f, -0.025505f, -0.012235f, -0.004466f, -0.010413f, -0.049285f, -0.051277f, 0.014094f, 0.005334f, 0.001345f, 0.026412f, 0.015042f, 0.021219f, 0.017053f, -0.031910f, -0.006942f, 0.060101f, -0.011094f, -0.022618f, 0.008848f, -0.013120f, 0.006161f, -0.036954f, 0.015041f, -0.016902f, 0.002566f, -0.002343f, 0.024392f, 0.001540f, 0.009811f, -0.020977f, 0.004046f, -0.011783f, -0.005300f, -0.014354f, -0.010887f, + 0.007665f, 0.008536f, -0.019160f, -0.006401f, 0.001509f, 0.003717f, 0.004910f, 0.002629f, -0.007353f, 0.008519f, 0.003601f, 0.002994f, -0.000877f, -0.000432f, 0.002780f, 0.008652f, -0.009034f, 0.008748f, -0.002156f, -0.000159f, -0.003125f, 0.005625f, -0.005250f, -0.002993f, 0.007729f, -0.014119f, -0.000143f, 0.002971f, -0.008552f, -0.002802f, -0.019879f, 0.014615f, 0.017163f, -0.000939f, 0.004176f, 0.004758f, 0.005965f, -0.008686f, 0.009649f, 0.006318f, 0.007574f, -0.006232f, 0.004222f, 0.006000f, 0.008776f, 0.034399f, 0.026207f, 0.003416f, 0.027845f, -0.005214f, -0.011320f, 0.015237f, -0.021183f, -0.041492f, -0.061958f, 0.005194f, 0.001378f, 0.023972f, 0.017586f, -0.023118f, -0.011764f, -0.060585f, -0.004003f, -0.028219f, 0.006649f, -0.014204f, -0.006714f, -0.011662f, -0.004429f, -0.004726f, -0.020982f, -0.009472f, -0.024464f, 0.019561f, -0.004867f, 0.016739f, 0.043460f, -0.022928f, 0.012543f, -0.003565f, -0.010725f, 0.011180f, -0.023174f, -0.039498f, 0.019005f, 0.009276f, 0.018902f, 0.011795f, -0.082691f, -0.037558f, 0.011063f, -0.027541f, -0.002302f, -0.023531f, 0.034654f, 0.041703f, + -0.002017f, 0.046098f, 0.006528f, 0.020940f, -0.006066f, -0.001527f, -0.025766f, 0.016331f, 0.033345f, 0.007221f, 0.055510f, 0.001311f, 0.007654f, -0.016296f, -0.024382f, 0.032847f, 0.052091f, 0.018179f, 0.010124f, 0.005132f, 0.019705f, 0.001700f, 0.003773f, -0.048741f, -0.035743f, -0.003702f, 0.002605f, 0.006460f, 0.036654f, 0.039414f, -0.007255f, 0.002589f, -0.013527f, 0.008207f, -0.025242f, 0.000646f, -0.026714f, -0.022634f, 0.011687f, -0.000660f, 0.002943f, -0.015027f, 0.009647f, 0.011799f, 0.007937f, 0.011949f, 0.014111f, 0.001224f, -0.008010f, 0.006191f, -0.010942f, -0.002671f, -0.006753f, -0.016037f, -0.004607f, -0.008871f, -0.007142f, 0.013309f, 0.007350f, -0.004743f, -0.010547f, -0.015883f, -0.010403f, 0.010718f, -0.010557f, -0.001044f, 0.000848f, 0.007336f, -0.014989f, -0.011970f, 0.005308f, 0.018611f, 0.011860f, 0.004790f, -0.000030f, -0.011195f, -0.001371f, -0.006806f, -0.012980f, 0.022166f, -0.032445f, -0.015987f, -0.060619f, -0.075537f, -0.056012f, -0.025572f, 0.017130f, -0.000484f, -0.013285f, -0.027591f, 0.000060f, 0.049862f, 0.024415f, -0.043594f, -0.007174f, -0.009001f, + -0.030812f, -0.005481f, 0.002282f, 0.021003f, 0.015464f, -0.032515f, 0.023386f, -0.018360f, 0.009933f, -0.017101f, 0.005195f, -0.024903f, -0.009307f, 0.012372f, -0.045024f, -0.008581f, -0.016969f, 0.014821f, -0.011199f, -0.041577f, 0.048963f, 0.047240f, 0.000652f, -0.019034f, 0.026678f, -0.063725f, -0.019967f, 0.019040f, -0.021447f, -0.013501f, -0.001636f, -0.020560f, 0.004097f, -0.005254f, -0.042738f, 0.018404f, -0.005437f, -0.013080f, -0.014614f, -0.011228f, -0.002665f, -0.011640f, -0.018115f, 0.035540f, -0.016878f, -0.016696f, 0.016883f, -0.000376f, 0.058219f, -0.011571f, -0.036074f, 0.020716f, -0.018834f, -0.015926f, -0.028142f, 0.019611f, 0.035911f, -0.069954f, 0.005509f, 0.059221f, -0.009608f, -0.003568f, -0.023382f, 0.040409f, -0.002841f, -0.021808f, -0.002906f, -0.020465f, -0.016504f, 0.029311f, -0.017531f, -0.001363f, -0.009726f, -0.012092f, -0.020486f, 0.008786f, 0.006863f, 0.010803f, -0.002434f, -0.016400f, -0.011326f, 0.000727f, 0.002909f, -0.025036f, -0.007204f, -0.016057f, 0.025050f, -0.008236f, 0.001798f, 0.003701f, 0.003109f, 0.002800f, -0.020349f, 0.013886f, 0.000698f, -0.007629f, + 0.018278f, 0.002980f, 0.023913f, -0.004080f, 0.027629f, 0.006565f, 0.011161f, 0.013689f, -0.017863f, -0.011620f, 0.008747f, -0.014531f, -0.011462f, 0.004549f, 0.000084f, -0.010151f, -0.024147f, 0.012004f, -0.047802f, 0.095496f, 0.068115f, -0.001296f, -0.018206f, 0.015160f, -0.057249f, 0.000962f, 0.071273f, -0.012549f, -0.024759f, 0.001186f, 0.080783f, -0.011542f, 0.017754f, -0.017152f, -0.036498f, -0.029508f, -0.007439f, -0.013462f, 0.014921f, 0.020689f, 0.001165f, -0.030350f, -0.042508f, -0.039102f, -0.006268f, -0.008552f, -0.021054f, 0.019837f, 0.016073f, -0.017048f, -0.020807f, -0.022715f, 0.012902f, 0.004545f, 0.015846f, 0.040459f, -0.000146f, -0.034356f, 0.023513f, 0.009347f, 0.008015f, 0.002583f, -0.000530f, -0.016478f, 0.029997f, 0.015445f, -0.011833f, -0.014113f, -0.009333f, -0.038998f, 0.010946f, 0.028879f, 0.008864f, -0.027242f, 0.032252f, 0.023727f, 0.013440f, 0.003783f, -0.016691f, 0.009044f, -0.055661f, 0.008954f, -0.003294f, 0.050048f, -0.017711f, -0.024417f, 0.010763f, -0.012615f, -0.000848f, -0.035733f, -0.006322f, -0.009379f, 0.048578f, -0.031166f, -0.058444f, -0.037950f, + -0.076004f, 0.015256f, -0.015293f, -0.004750f, -0.040458f, -0.025650f, -0.067134f, -0.029519f, -0.023323f, -0.003152f, 0.016761f, -0.021411f, -0.003560f, -0.003765f, -0.003177f, -0.005638f, 0.014702f, -0.024905f, 0.011242f, -0.009553f, -0.019395f, 0.003438f, -0.005396f, 0.018504f, 0.009646f, 0.000789f, -0.009576f, 0.023800f, 0.022110f, 0.013616f, -0.008143f, -0.011191f, -0.011241f, -0.010181f, 0.024835f, 0.040585f, 0.005027f, 0.037351f, 0.040836f, 0.014031f, 0.001057f, -0.035673f, -0.003534f, 0.007322f, 0.005659f, -0.002818f, -0.009589f, -0.030062f, -0.000327f, 0.021219f, 0.003686f, -0.022378f, -0.005461f, -0.016643f, 0.091126f, 0.003176f, 0.015449f, -0.015566f, -0.029380f, -0.040460f, -0.012861f, 0.010891f, 0.026954f, 0.021578f, -0.018855f, -0.000542f, -0.039678f, -0.015074f, 0.014715f, -0.034171f, -0.017733f, -0.013225f, 0.049320f, 0.025118f, 0.027303f, 0.025027f, -0.028035f, 0.004776f, 0.010641f, 0.011125f, -0.002400f, 0.032594f, -0.006942f, 0.014100f, 0.025958f, 0.009372f, 0.007444f, 0.021206f, 0.030064f, -0.017983f, -0.034652f, 0.022916f, -0.003487f, -0.000357f, -0.036653f, -0.034868f, + 0.008207f, -0.017682f, -0.013097f, 0.029741f, -0.030854f, 0.039483f, 0.026075f, -0.018227f, 0.021314f, -0.023913f, -0.023347f, -0.029080f, 0.041535f, -0.029431f, 0.013257f, 0.012106f, -0.047062f, 0.003988f, 0.005709f, -0.037842f, -0.064130f, -0.058041f, 0.042120f, -0.043755f, -0.000600f, -0.039398f, -0.008799f, -0.028321f, -0.002172f, 0.017464f, 0.011159f, -0.028820f, 0.029470f, 0.033535f, 0.071320f, 0.018115f, -0.047774f, 0.016369f, -0.029377f, 0.015442f, -0.042032f, 0.022087f, -0.017968f, 0.002661f, -0.008595f, 0.016733f, -0.005170f, -0.017626f, -0.040388f, -0.040792f, 0.004495f, 0.003385f, 0.025510f, -0.018684f, -0.001746f, 0.039302f, 0.011256f, 0.027090f, 0.008344f, -0.007719f, -0.003079f, -0.009974f, -0.026692f, 0.009048f, -0.032203f, -0.019497f, 0.006839f, 0.026125f, -0.035175f, 0.019038f, 0.003569f, 0.024672f, -0.008652f, 0.013584f, 0.025312f, 0.027472f, 0.028026f, -0.013344f, 0.013590f, 0.021422f, 0.023529f, 0.004108f, 0.013963f, 0.006866f, -0.011011f, 0.043138f, 0.020017f, 0.021489f, -0.018304f, 0.001640f, -0.039920f, -0.000634f, 0.006706f, 0.007801f, -0.035207f, -0.036627f, + -0.057985f, 0.040285f, 0.004116f, 0.013877f, -0.009554f, 0.021374f, -0.015896f, -0.015572f, 0.011967f, 0.030704f, 0.007163f, 0.020215f, 0.062401f, -0.008970f, -0.037709f, -0.079993f, -0.011427f, -0.030861f, -0.015249f, -0.018987f, -0.037219f, -0.026110f, -0.055584f, -0.006360f, -0.000887f, 0.019550f, 0.057588f, -0.047855f, -0.018490f, -0.007780f, 0.018853f, 0.020521f, 0.057063f, 0.007887f, -0.065199f, -0.014843f, 0.013369f, 0.051125f, 0.013383f, -0.078819f, -0.031657f, 0.071615f, 0.006516f, 0.071447f, -0.041934f, 0.002470f, 0.005599f, 0.043324f, -0.003992f, 0.039445f, 0.059195f, 0.008558f, 0.050231f, 0.035402f, 0.008557f, 0.069715f, 0.059451f, 0.019478f, 0.092686f, 0.071362f, 0.044682f, -0.074835f, -0.004797f, 0.029635f, 0.017165f, -0.000643f, -0.054317f, -0.064810f, -0.033548f, -0.092865f, -0.014596f, -0.068990f, -0.026285f, -0.017545f, -0.099551f, -0.094318f, -0.065662f, 0.032791f, 0.001182f, -0.021576f, -0.000997f, -0.006888f, -0.001822f, -0.018102f, -0.009549f, 0.023502f, 0.009467f, 0.004338f, -0.002906f, 0.004014f, -0.004278f, 0.014704f, -0.002141f, -0.024545f, 0.043564f, 0.007346f, + 0.010735f, -0.012492f, 0.002435f, -0.001150f, 0.023032f, -0.000793f, 0.013598f, -0.007414f, -0.023274f, 0.009887f, 0.018741f, 0.048291f, 0.042988f, 0.003245f, 0.000040f, 0.031000f, 0.015706f, 0.036149f, 0.030195f, -0.009019f, 0.034768f, 0.019632f, 0.007488f, 0.021995f, 0.014527f, -0.011699f, -0.004902f, -0.026863f, 0.017432f, -0.023910f, -0.010169f, 0.013601f, -0.051617f, 0.055097f, -0.023900f, 0.036094f, 0.017565f, -0.046156f, 0.006707f, 0.028833f, -0.018341f, -0.048213f, 0.031822f, -0.012986f, 0.027190f, -0.016101f, 0.006799f, 0.011291f, -0.029947f, -0.003393f, -0.013312f, -0.000502f, -0.048884f, -0.038137f, 0.047152f, 0.002317f, 0.018950f, -0.037217f, 0.038514f, 0.034756f, -0.026250f, 0.022207f, -0.038015f, -0.007953f, -0.021390f, 0.027628f, 0.067117f, -0.000993f, 0.081481f, -0.020469f, -0.004134f, 0.004132f, 0.008123f, -0.005343f, -0.046332f, 0.080428f, 0.052026f, -0.005971f, 0.043655f, 0.034644f, 0.045323f, -0.016986f, -0.001319f, -0.081117f, 0.036550f, 0.038707f, -0.010882f, -0.013560f, 0.050690f, 0.027322f, 0.026587f, 0.063832f, 0.010307f, -0.032181f, -0.039608f, 0.012326f, + -0.012656f, -0.046415f, 0.038452f, -0.053828f, 0.001989f, 0.012504f, -0.038931f, -0.059826f, -0.041355f, -0.014883f, 0.003944f, 0.049158f, 0.032269f, 0.016033f, -0.092811f, -0.025481f, 0.055314f, -0.003907f, -0.020506f, 0.016967f, -0.050478f, -0.030706f, 0.041754f, 0.000332f, 0.000216f, -0.017264f, -0.000123f, 0.026184f, -0.008347f, -0.018344f, 0.014161f, -0.005976f, -0.036037f, -0.018804f, 0.003105f, -0.002100f, -0.002588f, 0.001144f, -0.016041f, 0.000610f, -0.024881f, -0.032332f, 0.004031f, -0.002473f, -0.054550f, -0.005502f, -0.033199f, -0.018341f, -0.006425f, 0.008783f, 0.009478f, 0.030286f, -0.027794f, -0.018050f, 0.005587f, 0.029528f, -0.030721f, -0.031847f, 0.045242f, -0.006534f, -0.002981f, -0.008133f, -0.000700f, -0.018552f, 0.007729f, 0.021973f, 0.011348f, 0.019199f, 0.000923f, 0.007567f, 0.000065f, 0.003242f, -0.068514f, 0.038899f, 0.060813f, -0.001330f, 0.070061f, 0.020982f, -0.060580f, -0.037574f, -0.004639f, -0.021304f, -0.036791f, 0.038883f, 0.045838f, -0.004585f, 0.031950f, 0.042660f, -0.033677f, 0.030036f, 0.051516f, -0.003307f, -0.069201f, 0.027060f, -0.001810f, -0.013947f, + 0.019305f, 0.052194f, -0.016559f, -0.026569f, 0.013026f, -0.023153f, -0.029900f, -0.002288f, 0.046215f, 0.039113f, -0.065189f, 0.020599f, 0.028179f, -0.044094f, -0.027850f, 0.052805f, -0.014211f, -0.077258f, -0.009618f, 0.064622f, -0.020910f, -0.111540f, 0.117043f, -0.033409f, -0.013211f, -0.057757f, 0.075731f, 0.024412f, -0.025716f, 0.054727f, -0.031985f, -0.024297f, -0.013781f, 0.140339f, 0.047223f, -0.058987f, -0.051715f, 0.053730f, -0.012143f, 0.078291f, 0.001803f, 0.058723f, -0.080692f, 0.064610f, 0.112026f, 0.010390f, -0.011631f, -0.019829f, -0.019099f, -0.044717f, 0.105737f, 0.070658f, -0.062619f, 0.017532f, -0.065834f, -0.011501f, 0.007566f, 0.013651f, 0.009735f, 0.019389f, 0.002280f, -0.072770f, 0.034420f, 0.004268f, -0.007084f, -0.001732f, 0.033847f, -0.014644f, 0.007865f, -0.010771f, 0.017787f, -0.007046f, 0.004953f, -0.011775f, 0.022292f, 0.000703f, -0.003890f, 0.012238f, 0.018017f, -0.039923f, 0.005316f, 0.024866f, 0.010048f, -0.028820f, 0.015823f, 0.044848f, -0.043582f, -0.068669f, 0.013992f, 0.008330f, 0.027358f, 0.026113f, -0.003065f, -0.062046f, -0.020382f, 0.016751f, + 0.009119f, 0.017237f, -0.008772f, 0.002424f, -0.001922f, -0.020823f, 0.018596f, -0.016329f, 0.050372f, 0.115200f, 0.022271f, -0.044548f, -0.010616f, -0.010927f, 0.020202f, 0.017335f, -0.035975f, -0.051294f, 0.013680f, -0.043408f, 0.008629f, -0.027022f, -0.031083f, -0.006758f, 0.005256f, 0.014723f, -0.034644f, -0.013994f, -0.013742f, -0.043111f, 0.036147f, -0.013563f, 0.002321f, -0.006399f, -0.028767f, 0.011407f, 0.008083f, 0.000999f, -0.006221f, 0.000319f, -0.001061f, -0.017005f, -0.036594f, 0.015645f, -0.018169f, 0.015868f, 0.011150f, -0.036572f, -0.029613f, -0.003365f, -0.004260f, -0.004169f, -0.007863f, 0.029811f, -0.020630f, 0.003051f, -0.038843f, 0.033163f, -0.038056f, -0.020141f, 0.018922f, 0.000537f, -0.030498f, 0.024252f, -0.041005f, 0.003131f, 0.012353f, -0.001077f, 0.004495f, 0.019664f, 0.009338f, -0.042245f, 0.021399f, 0.003018f, -0.025484f, 0.036268f, 0.014297f, -0.040085f, -0.004370f, -0.031954f, -0.004189f, 0.013053f, 0.010745f, -0.040804f, 0.052042f, -0.027464f, -0.015078f, 0.028994f, 0.019252f, 0.004790f, 0.019375f, -0.001553f, 0.027100f, -0.011978f, 0.005592f, -0.003283f, + 0.013150f, 0.010304f, -0.007706f, -0.009306f, 0.010477f, -0.012897f, 0.001454f, 0.002347f, 0.001802f, -0.007527f, 0.001371f, -0.007009f, -0.011643f, -0.006251f, -0.012671f, -0.000541f, 0.009687f, 0.016850f, 0.006323f, 0.002137f, 0.008955f, 0.011101f, -0.015090f, 0.023608f, 0.006277f, -0.000556f, -0.015300f, -0.008580f, 0.007485f, 0.018740f, -0.003464f, -0.000164f, -0.008957f, 0.003280f, 0.002823f, -0.007400f, -0.010212f, -0.008960f, -0.023969f, -0.008543f, -0.069148f, -0.086330f, -0.031656f, 0.260818f, 0.208748f, 0.138445f, 0.252441f, -0.100236f, -0.238829f, -0.076549f, -0.386005f, -0.150398f, 0.010923f, -0.090443f, 0.177047f, 0.241896f, 0.039568f, 0.153796f, 0.264084f, 0.005816f, 0.072796f, -0.017122f, -0.310374f, -0.256711f, -0.194028f, -0.192663f, -0.094971f, 0.147341f, 0.079142f, 0.114044f, 0.324170f, 0.137589f, 0.020126f, 0.194206f, 0.090232f, -0.111063f, 0.037868f, -0.093146f, -0.314556f, -0.075588f, -0.164357f, -0.323944f, -0.053874f, 0.007606f, -0.079197f, 0.219345f, 0.253036f, 0.099916f, 0.297543f, 0.301232f, 0.056183f, 0.116184f, 0.052210f, -0.190269f, -0.213444f, -0.199654f, + -0.359349f, -0.317424f, -0.121042f, -0.147375f, 0.031055f, 0.192561f, 0.263496f, 0.217861f, 0.336592f, 0.249822f, 0.133983f, 0.018615f, -0.042063f, -0.194107f, -0.236557f, -0.174586f, -0.207869f, -0.173264f, -0.007649f, -0.009762f, 0.039357f, 0.187031f, 0.090075f, 0.114257f, 0.179091f, -0.003741f, -0.055903f, -0.029620f, -0.112426f, -0.064253f, -0.037762f, -0.041482f, 0.045906f, 0.094692f, 0.036625f, 0.052394f, 0.059565f, -0.043580f, -0.015643f, -0.018599f, -0.114707f, 0.015717f, 0.047726f, -0.124267f, -0.001655f, -0.011615f, -0.125450f, 0.046432f, 0.020997f, -0.142069f, 0.089459f, 0.133357f, 0.031232f, 0.268836f, 0.167181f, -0.003626f, 0.142993f, 0.025515f, -0.182117f, -0.151400f, -0.237112f, -0.336437f, -0.252600f, -0.164616f, -0.088587f, 0.114316f, 0.248439f, 0.291118f, 0.362648f, 0.355257f, 0.251471f, 0.055188f, -0.027041f, -0.181187f, -0.330079f, -0.321106f, -0.285327f, -0.239839f, -0.052033f, 0.025199f, 0.041203f, 0.164198f, 0.174608f, 0.121000f, 0.124680f, 0.096655f, 0.041778f, 0.058983f, 0.042726f, -0.011092f, -0.022313f, -0.052497f, -0.104861f, -0.113731f, -0.112529f, -0.113930f, + -0.085341f, -0.017130f, 0.008478f, 0.030067f, 0.036100f, 0.020430f, 0.008192f, 0.002036f}, + {-0.009431f, 0.029314f, 0.011241f, 0.007123f, 0.002320f, -0.006218f, 0.000085f, 0.005619f, 0.010585f, 0.000141f, 0.001033f, 0.000614f, -0.003867f, 0.001025f, 0.003598f, -0.000729f, 0.003514f, 0.005404f, 0.007217f, 0.003021f, 0.002967f, 0.003791f, 0.003378f, -0.006636f, 0.006730f, 0.012614f, -0.005978f, 0.003576f, 0.001991f, 0.003511f, 0.000660f, 0.007461f, -0.004860f, -0.001752f, -0.004373f, 0.004297f, 0.012528f, -0.002128f, 0.006084f, -0.000189f, -0.002820f, -0.010339f, 0.003870f, -0.005368f, 0.004765f, 0.002386f, 0.005322f, -0.000618f, -0.003186f, 0.001652f, -0.002192f, 0.007142f, 0.000935f, -0.005709f, 0.007285f, -0.001624f, 0.005688f, 0.004350f, -0.000221f, 0.004173f, 0.008211f, -0.002344f, -0.002866f, -0.002365f, 0.004090f, -0.003392f, -0.004416f, 0.005066f, 0.000068f, 0.003387f, -0.005456f, 0.008029f, 0.000486f, -0.002317f, -0.000939f, -0.000938f, 0.003221f, -0.003068f, -0.004835f, 0.002816f, 0.004340f, 0.004057f, -0.003834f, -0.005784f, 0.002314f, -0.000251f, -0.000679f, -0.002261f, -0.002092f, 0.002821f, -0.000745f, -0.000475f, -0.001775f, -0.002163f, 0.000422f, -0.001572f, + 0.000658f, 0.000387f, 0.002130f, 0.001420f, -0.000630f, 0.000704f, 0.001214f, -0.001344f, -0.000531f, 0.000019f, -0.000583f, -0.001045f, 0.000741f, 0.001996f, 0.001180f, 0.001474f, 0.000030f, 0.022772f, 0.017871f, 0.008957f, 0.001317f, -0.003384f, 0.010363f, -0.006073f, -0.006493f, -0.001513f, -0.011352f, 0.006849f, 0.000476f, -0.004734f, 0.002707f, 0.006581f, 0.011359f, -0.005284f, 0.006560f, 0.014713f, -0.004186f, 0.000077f, 0.003397f, 0.007634f, -0.001909f, 0.008319f, 0.005931f, 0.008416f, 0.001969f, 0.006420f, -0.006538f, 0.011226f, -0.001318f, 0.010830f, 0.005414f, -0.001229f, 0.001380f, -0.001832f, -0.000220f, -0.003961f, -0.001822f, -0.004886f, -0.003543f, 0.003750f, -0.000985f, -0.010557f, -0.002327f, 0.001075f, -0.000259f, -0.005910f, -0.006028f, -0.003120f, -0.002587f, 0.008184f, -0.003258f, -0.009080f, -0.012033f, -0.013333f, -0.004548f, -0.005899f, -0.000441f, 0.002001f, 0.006454f, -0.008739f, -0.003911f, 0.000968f, -0.000844f, -0.003945f, 0.001003f, -0.009197f, -0.000828f, -0.010831f, 0.005796f, -0.005922f, -0.002825f, 0.007421f, -0.001053f, 0.005077f, 0.001516f, 0.001814f, + 0.005824f, 0.001388f, -0.004625f, -0.002192f, 0.000497f, -0.004603f, 0.002453f, 0.004570f, 0.002281f, -0.003619f, 0.002709f, 0.003812f, 0.000789f, 0.002039f, -0.001104f, -0.002152f, -0.001431f, -0.002152f, 0.001522f, -0.000276f, 0.001398f, -0.001808f, -0.001266f, 0.001427f, 0.012068f, -0.026164f, -0.007037f, -0.013250f, -0.002474f, 0.000003f, 0.014401f, -0.006998f, -0.023472f, -0.008253f, -0.000610f, 0.008947f, 0.002775f, -0.008689f, -0.020379f, -0.005226f, 0.005573f, -0.002267f, 0.011463f, 0.000468f, 0.005018f, -0.001116f, -0.009049f, -0.009817f, 0.005920f, 0.007254f, 0.000841f, 0.002370f, -0.000365f, 0.004446f, 0.001021f, -0.012076f, 0.000640f, 0.017069f, 0.002291f, -0.004206f, -0.001575f, -0.004497f, 0.001043f, -0.003874f, -0.007405f, 0.011442f, -0.003547f, -0.004717f, 0.010358f, -0.005382f, -0.009191f, 0.000459f, 0.000065f, 0.000338f, -0.013256f, 0.010821f, -0.004104f, -0.000215f, 0.009952f, 0.009088f, -0.014211f, -0.003562f, 0.002761f, 0.003498f, -0.001249f, 0.007836f, 0.002157f, 0.003917f, 0.005411f, 0.000857f, 0.004327f, 0.006576f, 0.001435f, 0.000091f, 0.006101f, -0.016166f, + -0.003577f, 0.000463f, 0.008281f, 0.004641f, -0.001980f, -0.001583f, 0.006028f, 0.005657f, -0.006450f, -0.000864f, -0.002285f, 0.000259f, 0.003576f, 0.004592f, 0.000925f, 0.005661f, -0.000545f, -0.003949f, -0.001876f, 0.000516f, 0.000438f, 0.000599f, -0.001486f, 0.003967f, -0.000778f, 0.001471f, -0.000571f, -0.001705f, 0.001173f, 0.000017f, -0.000749f, -0.001383f, 0.000349f, -0.001296f, -0.000199f, -0.002382f, -0.001869f, 0.000581f, -0.000345f, -0.001845f, -0.003758f, -0.001310f, 0.000858f, 0.003282f, -0.051986f, -0.020650f, -0.010391f, -0.014873f, 0.004772f, -0.005200f, -0.004863f, -0.000706f, 0.006704f, -0.006055f, -0.006994f, -0.010432f, 0.002203f, 0.009210f, 0.002200f, -0.007178f, -0.008685f, 0.002548f, 0.007882f, 0.007095f, -0.009890f, -0.014843f, 0.001243f, -0.013882f, 0.007485f, -0.000174f, 0.005263f, -0.000471f, 0.005083f, -0.005513f, -0.002151f, 0.014352f, -0.017334f, 0.007955f, 0.004206f, 0.001873f, -0.006063f, 0.003779f, 0.008735f, 0.002213f, -0.010508f, 0.002066f, -0.006617f, 0.005124f, -0.014391f, -0.000631f, -0.013024f, 0.010050f, -0.000940f, -0.002690f, -0.003600f, 0.005498f, + -0.021947f, 0.010106f, -0.006231f, -0.013447f, 0.005483f, 0.010680f, 0.012303f, 0.007094f, 0.002737f, -0.000939f, 0.001587f, -0.001178f, 0.007992f, -0.004552f, 0.002367f, 0.006104f, 0.015349f, 0.002355f, 0.000447f, -0.010989f, 0.007110f, -0.005497f, 0.001392f, 0.000239f, 0.008242f, -0.007245f, 0.000573f, 0.007370f, -0.000510f, -0.008883f, -0.011995f, 0.009979f, 0.000997f, 0.001822f, 0.005218f, -0.001104f, 0.002619f, 0.002107f, 0.000082f, 0.001755f, -0.000691f, 0.000246f, 0.002855f, 0.002444f, 0.002817f, -0.004464f, 0.001895f, -0.003365f, -0.001276f, -0.002843f, 0.002770f, -0.003218f, -0.029642f, 0.014523f, 0.023101f, 0.004516f, 0.001803f, 0.012876f, 0.004315f, 0.003954f, 0.007005f, 0.000988f, 0.007330f, 0.007419f, -0.005994f, -0.001074f, 0.000977f, -0.007245f, -0.004531f, -0.000073f, 0.003548f, -0.004265f, 0.024021f, 0.012798f, -0.003536f, 0.001741f, 0.007609f, 0.009636f, 0.010949f, -0.004575f, 0.007702f, 0.009022f, 0.000479f, 0.002646f, 0.002567f, 0.005146f, 0.003688f, 0.002281f, 0.005055f, 0.004874f, -0.010433f, -0.008023f, -0.016048f, 0.001752f, -0.005703f, -0.007990f, + 0.008213f, -0.002325f, 0.005160f, -0.019829f, 0.021828f, -0.001569f, -0.010422f, -0.001912f, 0.017298f, 0.012556f, -0.002790f, 0.000466f, 0.008362f, -0.003973f, 0.003581f, -0.006372f, -0.013668f, 0.001623f, 0.001249f, -0.010946f, -0.004364f, -0.010790f, 0.001903f, 0.004009f, 0.002417f, -0.005238f, -0.009576f, -0.014539f, -0.017367f, -0.012455f, -0.004885f, 0.001011f, -0.004244f, 0.001703f, 0.005735f, 0.005125f, -0.007233f, -0.000761f, -0.007886f, 0.002882f, -0.002764f, 0.002270f, -0.000128f, -0.003200f, 0.002274f, 0.002637f, -0.002337f, -0.001081f, -0.003036f, 0.004075f, -0.004842f, 0.001060f, 0.001522f, 0.001439f, -0.000510f, -0.001111f, 0.001008f, 0.002171f, 0.002138f, 0.001779f, 0.001337f, 0.001832f, 0.000578f, 0.003475f, -0.000817f, 0.003850f, -0.002413f, 0.001224f, -0.000731f, -0.000975f, -0.002775f, -0.002122f, -0.001852f, -0.002487f, 0.000968f, -0.001995f, -0.000285f, 0.001839f, 0.000594f, 0.054604f, 0.014480f, 0.004050f, -0.002024f, 0.032911f, 0.003863f, 0.015637f, 0.003228f, 0.010400f, 0.017143f, 0.006048f, -0.009515f, 0.010114f, 0.011784f, 0.001857f, -0.000860f, 0.002512f, + 0.021571f, 0.001490f, -0.007372f, -0.013122f, -0.003853f, -0.000404f, -0.014984f, 0.002505f, 0.004446f, 0.008589f, 0.003663f, 0.006059f, 0.016520f, -0.005171f, -0.002629f, 0.010138f, -0.001591f, -0.004491f, -0.000861f, -0.014791f, 0.009552f, 0.006243f, 0.000333f, 0.009490f, -0.004759f, -0.012959f, -0.027981f, -0.010262f, 0.010322f, 0.011401f, 0.000349f, 0.007995f, -0.007914f, -0.008603f, 0.022746f, -0.013194f, 0.010299f, -0.011622f, 0.002406f, -0.016933f, -0.017772f, 0.019243f, -0.007381f, -0.006954f, 0.026560f, 0.001976f, -0.003011f, -0.012516f, 0.009719f, 0.015326f, 0.000721f, -0.008305f, -0.015689f, -0.002490f, 0.011349f, -0.003676f, 0.003823f, -0.006953f, 0.005567f, -0.002670f, 0.001774f, 0.012090f, -0.013127f, 0.004052f, -0.003749f, 0.000768f, 0.001459f, -0.001552f, 0.013963f, 0.004339f, 0.002008f, -0.004215f, 0.000087f, -0.003353f, 0.005846f, -0.002917f, 0.004621f, 0.004638f, -0.004988f, -0.000037f, -0.000856f, -0.003262f, 0.006590f, 0.001048f, 0.003042f, 0.000173f, -0.002428f, 0.001269f, -0.000051f, 0.000037f, 0.001823f, 0.002864f, 0.001014f, 0.003780f, 0.001130f, -0.000393f, + 0.002083f, 0.001376f, -0.001603f, 0.000364f, -0.000750f, 0.000738f, 0.003355f, 0.003724f, 0.000516f, -0.000471f, 0.027735f, 0.009322f, 0.022976f, -0.014039f, 0.004576f, 0.012972f, -0.017596f, -0.005910f, -0.006895f, 0.001925f, -0.008908f, -0.005312f, 0.013607f, -0.004048f, -0.002602f, -0.000863f, 0.017036f, -0.006130f, -0.007945f, 0.018336f, 0.002919f, -0.012784f, 0.005404f, -0.002718f, 0.002883f, 0.007000f, -0.010489f, -0.002303f, -0.007892f, -0.013988f, 0.001678f, 0.000467f, 0.002641f, -0.013761f, -0.014490f, 0.005704f, -0.001296f, 0.005555f, -0.000629f, 0.008029f, 0.002282f, -0.000250f, -0.009277f, -0.008826f, 0.002425f, 0.009018f, 0.004273f, -0.002491f, 0.026106f, 0.006325f, 0.004416f, 0.012004f, 0.004340f, 0.008956f, 0.008939f, 0.006003f, 0.003550f, 0.004627f, -0.003869f, -0.001954f, 0.001919f, -0.010993f, 0.002864f, -0.017785f, 0.004813f, -0.011737f, 0.009197f, -0.006555f, 0.005016f, -0.002207f, -0.008757f, 0.003025f, -0.002375f, 0.009444f, -0.008217f, 0.025088f, 0.020974f, 0.009820f, -0.018088f, 0.005760f, 0.007918f, -0.007585f, 0.003240f, 0.002328f, 0.012165f, 0.011745f, + 0.004795f, -0.000164f, -0.001764f, -0.002406f, -0.007213f, 0.010951f, -0.000919f, -0.001215f, -0.000069f, -0.003025f, 0.001080f, 0.003716f, -0.003090f, 0.005748f, -0.002260f, -0.004563f, -0.004981f, -0.000082f, 0.003215f, 0.003320f, -0.001008f, -0.001076f, -0.003962f, -0.001573f, 0.001911f, -0.004532f, 0.005029f, 0.005410f, -0.003510f, 0.001040f, -0.004412f, -0.001331f, 0.000597f, 0.001817f, -0.003398f, 0.005726f, -0.034464f, -0.066318f, -0.002828f, -0.013291f, 0.011505f, -0.003419f, -0.018359f, -0.001780f, -0.014866f, -0.016399f, -0.014054f, 0.021689f, 0.011265f, -0.014485f, -0.008323f, 0.016508f, 0.009565f, 0.014733f, -0.010129f, 0.009530f, -0.008982f, -0.009078f, -0.002790f, -0.003964f, -0.028037f, 0.007667f, 0.016034f, 0.006903f, -0.016660f, -0.003827f, 0.002976f, 0.004280f, -0.014857f, -0.003308f, -0.021330f, 0.004720f, -0.010099f, -0.000937f, -0.007414f, 0.004096f, 0.022876f, -0.002451f, -0.004215f, 0.011462f, 0.016735f, -0.010089f, 0.004592f, 0.006329f, -0.014049f, 0.007562f, 0.007072f, -0.016525f, 0.002644f, 0.010726f, -0.002484f, -0.017399f, -0.010930f, -0.011214f, 0.015872f, 0.006157f, + 0.015546f, -0.009140f, -0.017848f, 0.004276f, 0.008990f, -0.003776f, -0.012755f, 0.008552f, 0.012589f, 0.011908f, -0.014628f, -0.007601f, -0.002980f, 0.023785f, -0.004970f, 0.014216f, 0.004248f, -0.016666f, -0.013531f, -0.002554f, 0.009407f, -0.015787f, -0.000846f, -0.002896f, 0.008805f, -0.001852f, 0.019734f, 0.002516f, -0.004393f, -0.005807f, -0.004868f, -0.005598f, -0.003557f, -0.001856f, 0.001921f, 0.000017f, -0.002187f, -0.007130f, -0.000573f, -0.006929f, -0.002935f, 0.002948f, -0.002315f, 0.001216f, -0.001896f, -0.005215f, 0.003337f, -0.000777f, 0.008556f, -0.001558f, -0.006678f, -0.004721f, 0.002841f, -0.001199f, 0.000466f, -0.001820f, -0.004224f, 0.001585f, 0.004889f, -0.004098f, -0.001140f, 0.006518f, 0.003163f, -0.003867f, 0.005325f, -0.033927f, -0.000032f, 0.000939f, 0.019566f, 0.004739f, -0.007801f, 0.011571f, -0.005560f, 0.005062f, -0.018375f, -0.005411f, -0.011639f, -0.006465f, -0.023233f, -0.008827f, -0.013870f, 0.032045f, 0.018431f, 0.019528f, -0.022789f, -0.019529f, -0.009328f, 0.010915f, -0.001028f, -0.000269f, 0.000683f, 0.006548f, -0.001535f, 0.009298f, -0.013248f, -0.011413f, + -0.000193f, -0.003257f, -0.016347f, -0.016501f, -0.013148f, -0.009575f, -0.007077f, -0.006588f, -0.020715f, 0.009493f, 0.025469f, -0.005546f, 0.011962f, 0.016316f, -0.011931f, 0.014116f, 0.009007f, 0.003332f, 0.023268f, -0.001145f, 0.019497f, 0.007181f, 0.002569f, -0.018296f, 0.007384f, 0.008978f, -0.004729f, 0.026708f, 0.021413f, 0.004113f, -0.007856f, -0.013381f, 0.007827f, -0.013156f, 0.005415f, -0.000311f, 0.015935f, -0.000091f, -0.023452f, 0.001644f, -0.009164f, -0.003811f, -0.017536f, 0.020587f, 0.010844f, 0.007423f, 0.005049f, 0.022981f, -0.006493f, -0.024214f, -0.003640f, 0.015116f, 0.000566f, -0.012509f, -0.003052f, 0.001655f, -0.005224f, 0.002869f, 0.007460f, -0.000150f, 0.000389f, -0.001634f, 0.002533f, -0.000485f, 0.008958f, 0.002599f, 0.002785f, -0.002162f, 0.003569f, 0.004554f, 0.008152f, -0.006801f, 0.004588f, 0.004523f, 0.000110f, 0.001353f, 0.008212f, 0.004349f, 0.002253f, -0.004990f, 0.007006f, -0.002115f, -0.003795f, -0.004727f, -0.000132f, -0.012110f, 0.007759f, 0.003747f, 0.001551f, -0.005793f, 0.006864f, 0.006588f, 0.012066f, 0.007314f, 0.002202f, 0.001948f, + 0.000790f, 0.009751f, -0.030714f, 0.013842f, 0.010150f, 0.013131f, -0.014351f, -0.025470f, 0.007362f, 0.007637f, 0.001259f, -0.021481f, 0.020510f, 0.005877f, -0.010979f, -0.018921f, 0.008509f, -0.008379f, 0.032845f, 0.038262f, 0.005624f, -0.006145f, -0.014315f, 0.021718f, -0.024770f, -0.008875f, 0.030494f, 0.007571f, -0.005974f, -0.016532f, -0.015254f, -0.008625f, 0.000499f, -0.020215f, 0.004508f, 0.021490f, -0.002784f, 0.008058f, -0.015816f, -0.014427f, -0.004932f, -0.011933f, 0.031214f, -0.011503f, 0.013988f, 0.011521f, 0.012634f, 0.003321f, 0.006178f, -0.021710f, -0.021800f, -0.020876f, -0.004708f, 0.015615f, 0.035987f, -0.014556f, -0.026105f, -0.006051f, -0.012065f, 0.006639f, 0.005527f, 0.020040f, -0.012331f, -0.000290f, -0.016318f, -0.003128f, 0.028801f, -0.003724f, -0.015795f, 0.020624f, 0.006697f, 0.003307f, 0.010774f, -0.023200f, 0.003463f, -0.007879f, 0.002164f, 0.010570f, 0.025305f, 0.007066f, -0.029579f, 0.010749f, 0.002500f, -0.004610f, -0.012378f, 0.000542f, -0.003230f, -0.001645f, -0.000882f, 0.004131f, 0.006710f, 0.008141f, 0.002618f, 0.000524f, -0.004855f, 0.001510f, + -0.001573f, 0.005835f, -0.010111f, 0.003714f, 0.003797f, -0.000249f, 0.000780f, 0.001647f, -0.007684f, -0.000238f, -0.005136f, 0.008223f, 0.007557f, 0.001871f, 0.009095f, -0.003631f, 0.001158f, 0.006991f, -0.001601f, 0.005532f, 0.001246f, 0.005118f, 0.001609f, -0.011687f, -0.000842f, -0.004203f, -0.000794f, 0.001543f, 0.000551f, -0.004148f, 0.000254f, -0.004880f, -0.000142f, -0.002396f, 0.049847f, -0.021629f, -0.017074f, -0.005133f, 0.010444f, -0.029134f, 0.011613f, -0.007820f, 0.014664f, -0.013045f, -0.006057f, 0.018170f, 0.013344f, 0.005171f, -0.009204f, -0.003251f, 0.024701f, 0.024439f, -0.005161f, 0.021343f, -0.006278f, 0.031358f, -0.014739f, -0.007652f, 0.005518f, 0.032844f, 0.023857f, 0.007966f, -0.017691f, -0.001200f, -0.036548f, -0.005478f, 0.005582f, 0.016787f, 0.019416f, 0.034599f, 0.008943f, -0.000612f, -0.001793f, -0.013256f, -0.022850f, -0.001618f, -0.019838f, 0.014266f, 0.004342f, 0.022051f, 0.012137f, -0.007524f, 0.021716f, -0.026012f, 0.011625f, -0.005802f, 0.001746f, -0.004527f, 0.027672f, 0.016293f, 0.007820f, 0.004951f, -0.050627f, -0.008044f, 0.029796f, 0.015103f, + 0.001712f, -0.000955f, 0.001372f, 0.024125f, 0.010096f, -0.038200f, -0.012603f, -0.014756f, 0.003425f, 0.000794f, -0.038084f, 0.001453f, -0.035611f, -0.023545f, -0.003230f, -0.015275f, -0.016668f, 0.022129f, 0.027834f, -0.003047f, -0.013753f, -0.001533f, 0.008444f, -0.003470f, 0.007183f, 0.011422f, -0.001076f, 0.012693f, 0.018496f, -0.005997f, -0.010534f, 0.001693f, -0.004578f, 0.005612f, 0.003527f, -0.002971f, -0.002751f, 0.000216f, 0.000133f, 0.005240f, -0.000714f, -0.006444f, 0.001164f, 0.006322f, 0.002218f, 0.005615f, -0.005046f, 0.008530f, -0.000142f, -0.003172f, 0.001965f, -0.005433f, 0.002033f, -0.010867f, -0.007085f, -0.008507f, 0.004247f, 0.000397f, -0.008197f, -0.001625f, 0.006772f, 0.004526f, 0.005860f, -0.003985f, 0.003169f, 0.000050f, -0.001468f, -0.010385f, -0.005457f, -0.011008f, 0.018087f, 0.035231f, -0.008918f, -0.014329f, 0.001972f, 0.013633f, 0.007762f, -0.021539f, -0.001406f, -0.017448f, -0.001024f, -0.023751f, -0.002690f, -0.020412f, 0.000867f, 0.021164f, 0.001568f, 0.046710f, -0.019700f, -0.009358f, -0.016766f, 0.019088f, 0.030997f, -0.024858f, -0.008447f, -0.038574f, + 0.007150f, -0.000262f, 0.010441f, 0.009586f, -0.021751f, -0.012759f, 0.016778f, -0.006256f, -0.004902f, -0.020939f, 0.042258f, -0.005566f, -0.045485f, 0.012858f, -0.012078f, -0.013369f, 0.016196f, 0.012829f, -0.013236f, -0.014324f, -0.004513f, -0.026082f, -0.015881f, 0.008886f, 0.005738f, 0.009269f, -0.008124f, -0.018791f, -0.022123f, -0.021881f, 0.018076f, -0.032209f, 0.000379f, 0.008019f, -0.010132f, 0.001069f, -0.000346f, -0.004166f, -0.025855f, -0.004522f, -0.010592f, 0.016612f, 0.020797f, -0.003633f, 0.032408f, -0.001599f, -0.000475f, -0.009718f, -0.002221f, 0.047071f, 0.004394f, -0.020869f, -0.008586f, 0.018472f, 0.013414f, -0.025715f, 0.000382f, 0.003977f, -0.017766f, 0.014961f, 0.003304f, 0.016715f, 0.002397f, 0.002773f, 0.002378f, 0.001555f, 0.007026f, 0.010172f, 0.000731f, 0.005232f, 0.015775f, 0.001511f, -0.005837f, 0.003046f, 0.007492f, -0.005778f, -0.001888f, 0.001182f, -0.007638f, 0.007192f, 0.006226f, 0.008270f, 0.001411f, -0.008403f, 0.001832f, -0.002696f, 0.001265f, -0.001546f, -0.001781f, 0.001043f, -0.005050f, 0.007199f, -0.003761f, -0.004502f, -0.005988f, 0.014270f, + -0.000046f, -0.014886f, 0.010898f, 0.008964f, 0.003565f, -0.000712f, 0.008290f, 0.006692f, -0.017072f, -0.022626f, 0.057293f, -0.014661f, -0.005147f, 0.005201f, 0.024360f, 0.017682f, -0.037386f, -0.015111f, -0.035526f, 0.007862f, 0.001914f, -0.010866f, -0.039097f, 0.001704f, -0.018321f, 0.008182f, 0.008455f, 0.019760f, 0.000867f, 0.014404f, 0.067306f, 0.014738f, 0.016695f, -0.010514f, -0.003889f, 0.029522f, -0.002716f, 0.002387f, 0.007662f, 0.001993f, -0.004475f, -0.015326f, 0.027019f, -0.028771f, 0.011852f, -0.042804f, -0.013205f, -0.019999f, -0.026621f, -0.022684f, -0.000207f, -0.046780f, -0.016105f, 0.006479f, 0.026650f, 0.015474f, -0.046181f, 0.026142f, 0.017192f, 0.019061f, -0.029391f, 0.021520f, -0.013881f, -0.033465f, -0.011574f, -0.033299f, 0.016113f, 0.039883f, 0.009908f, -0.003793f, -0.026180f, 0.021100f, -0.027873f, 0.041643f, -0.007856f, -0.004469f, -0.025203f, -0.027394f, 0.003946f, 0.032519f, 0.010627f, -0.022363f, -0.009145f, 0.005451f, -0.004686f, -0.008952f, 0.021258f, 0.010996f, -0.009971f, 0.027519f, -0.002271f, -0.039069f, 0.048947f, 0.026064f, 0.020149f, 0.009242f, + -0.006619f, -0.002416f, -0.004100f, 0.014625f, 0.003310f, 0.002145f, 0.032215f, 0.012579f, 0.000566f, 0.001535f, 0.004570f, 0.016823f, -0.013497f, 0.009483f, 0.000919f, 0.003166f, 0.003078f, 0.010833f, 0.005296f, 0.000667f, 0.018154f, 0.013888f, 0.001207f, -0.006355f, -0.006458f, -0.002388f, 0.014859f, 0.007432f, 0.008339f, 0.008011f, 0.009883f, -0.012299f, 0.012291f, -0.003271f, -0.003286f, 0.011386f, 0.017857f, -0.002604f, -0.004975f, -0.000120f, 0.016995f, 0.019578f, 0.007490f, 0.012061f, 0.009244f, 0.031489f, 0.005871f, -0.020123f, 0.009114f, -0.005805f, 0.009392f, 0.034539f, -0.048591f, -0.021983f, -0.039071f, 0.022244f, -0.007878f, 0.003894f, -0.012900f, 0.028200f, -0.027704f, -0.027872f, -0.012723f, -0.006448f, -0.019953f, -0.034510f, -0.016694f, 0.006549f, 0.022698f, -0.031750f, 0.020979f, -0.011908f, 0.002511f, 0.041292f, 0.031551f, -0.000457f, 0.016628f, 0.008043f, -0.006563f, -0.004912f, -0.055969f, 0.007833f, -0.005680f, 0.005585f, 0.010902f, -0.004329f, 0.001526f, 0.056618f, -0.050766f, 0.004845f, 0.061255f, 0.008057f, 0.016918f, -0.023959f, -0.006559f, 0.032084f, + 0.056233f, 0.002907f, 0.049869f, -0.019389f, 0.045115f, -0.015801f, 0.033394f, 0.033918f, -0.008382f, 0.066050f, -0.010985f, -0.002750f, -0.019604f, -0.029787f, -0.031608f, -0.014465f, -0.018973f, -0.045888f, -0.021437f, -0.009713f, 0.016985f, 0.016830f, 0.002154f, -0.023561f, -0.003941f, -0.006638f, 0.029537f, 0.009186f, -0.015401f, 0.025322f, 0.005696f, -0.003117f, -0.003570f, -0.018411f, -0.002835f, -0.007317f, 0.007708f, -0.018644f, -0.008916f, -0.013004f, -0.012940f, 0.023540f, 0.009089f, -0.007815f, 0.007109f, -0.006017f, 0.004498f, -0.014171f, 0.021095f, 0.000990f, 0.005916f, -0.000563f, -0.014226f, 0.013013f, -0.001733f, 0.004768f, 0.014984f, 0.010371f, 0.006383f, 0.001150f, -0.022134f, 0.010545f, -0.008490f, -0.001053f, 0.019034f, -0.000455f, 0.007048f, 0.004516f, 0.009088f, 0.012750f, -0.004626f, -0.010384f, -0.006850f, -0.008334f, 0.003960f, 0.011425f, 0.019594f, 0.011255f, -0.022906f, -0.002985f, -0.025094f, -0.021216f, -0.072760f, -0.051439f, -0.036602f, -0.003451f, 0.049214f, -0.032185f, -0.004203f, -0.024726f, -0.036088f, -0.029609f, -0.036866f, -0.038157f, -0.015265f, -0.045066f, + -0.049349f, -0.042650f, 0.012036f, -0.029400f, -0.015543f, -0.036690f, 0.035046f, 0.057696f, 0.004906f, -0.006485f, -0.020361f, 0.004866f, -0.003669f, -0.001372f, -0.004702f, 0.018273f, 0.003742f, 0.039389f, -0.034294f, 0.003138f, -0.029184f, 0.059794f, 0.014561f, -0.034853f, 0.027419f, -0.024940f, 0.022262f, -0.033534f, 0.019672f, 0.003024f, -0.020216f, 0.018221f, -0.031942f, -0.010515f, 0.010056f, 0.032739f, 0.014200f, 0.058007f, -0.013031f, -0.037195f, 0.003463f, -0.010524f, 0.004367f, -0.024605f, -0.021464f, -0.039706f, 0.005007f, -0.042222f, -0.008540f, -0.006501f, -0.037152f, 0.024925f, 0.031387f, -0.018156f, -0.002021f, -0.054480f, 0.062747f, 0.076255f, 0.012174f, -0.029920f, 0.010374f, 0.067120f, -0.031466f, -0.014155f, -0.035885f, -0.020773f, -0.039388f, 0.016290f, -0.001911f, -0.022086f, 0.017168f, -0.022124f, 0.009236f, -0.013723f, -0.006381f, 0.009226f, 0.004762f, -0.000053f, -0.014771f, -0.002824f, 0.012911f, 0.007657f, -0.024617f, 0.019549f, -0.017158f, 0.009074f, 0.011221f, -0.007627f, -0.014495f, 0.007897f, -0.011730f, 0.009702f, 0.006885f, -0.015176f, 0.005572f, -0.001957f, + 0.005871f, -0.008997f, -0.024834f, 0.006879f, 0.004301f, -0.010075f, 0.006382f, -0.009015f, 0.017620f, -0.000164f, 0.007174f, 0.002143f, 0.022907f, 0.003156f, -0.030842f, 0.017459f, 0.011378f, 0.005353f, -0.058631f, 0.107311f, 0.040619f, -0.008815f, -0.032334f, -0.009033f, -0.034341f, 0.036926f, 0.093121f, 0.002016f, -0.061761f, -0.028281f, 0.033602f, 0.012485f, -0.012283f, 0.044369f, -0.008571f, 0.005566f, 0.025457f, -0.002683f, -0.025605f, -0.008352f, 0.020969f, -0.026848f, -0.024395f, -0.009915f, 0.008730f, 0.001325f, -0.004642f, -0.011274f, 0.019759f, 0.002052f, 0.029242f, 0.023083f, -0.030118f, 0.014804f, 0.035940f, 0.020106f, -0.027834f, 0.010760f, 0.005978f, 0.024238f, 0.000626f, 0.008451f, 0.006541f, 0.009997f, 0.050668f, 0.047951f, 0.029720f, 0.064991f, -0.032014f, 0.033504f, -0.038571f, 0.024626f, -0.000426f, 0.022506f, 0.028223f, 0.009101f, 0.007341f, 0.034268f, 0.015929f, -0.009120f, 0.021752f, 0.000134f, 0.029176f, -0.030936f, -0.017691f, 0.002702f, 0.070333f, -0.048516f, 0.004693f, -0.061008f, -0.007251f, 0.007097f, 0.024038f, -0.029675f, -0.005871f, -0.030583f, + 0.007917f, 0.037751f, -0.023143f, -0.054545f, -0.011635f, -0.005347f, -0.014825f, 0.013269f, 0.009483f, -0.015421f, 0.005445f, -0.013189f, -0.012927f, 0.012261f, -0.001976f, -0.007342f, -0.024668f, 0.013406f, -0.001073f, -0.015588f, -0.012529f, 0.011677f, 0.033183f, 0.003248f, -0.009555f, -0.004391f, 0.012068f, 0.029838f, 0.005921f, 0.002613f, 0.024817f, -0.000704f, 0.006731f, -0.002294f, -0.004922f, -0.001122f, 0.008978f, 0.014136f, 0.008448f, -0.003975f, -0.005310f, 0.012597f, 0.008928f, -0.018689f, 0.017742f, 0.004828f, 0.034506f, -0.008581f, 0.008737f, 0.020813f, -0.014295f, -0.008729f, 0.011680f, -0.019611f, 0.089841f, 0.007364f, 0.006512f, -0.019779f, -0.012596f, 0.014856f, 0.013725f, 0.008192f, 0.034666f, 0.014444f, -0.014614f, 0.018306f, 0.036989f, -0.001550f, 0.040552f, -0.004015f, 0.019696f, -0.041360f, 0.074809f, -0.011225f, -0.008762f, 0.012452f, -0.056617f, -0.014665f, -0.027255f, 0.039803f, 0.021927f, 0.022489f, -0.026446f, 0.009529f, 0.009553f, -0.035323f, 0.009773f, 0.030034f, 0.025638f, 0.008709f, -0.008712f, 0.003500f, -0.016955f, 0.056746f, 0.008606f, 0.025584f, + 0.020961f, 0.030560f, -0.050608f, -0.004166f, -0.015241f, 0.009313f, -0.018776f, -0.022319f, 0.041937f, -0.040107f, 0.030739f, -0.025508f, 0.032359f, -0.007435f, -0.033871f, -0.003373f, -0.050904f, 0.031376f, 0.029227f, 0.035211f, -0.105293f, 0.030209f, 0.019032f, -0.032541f, -0.021662f, -0.030268f, 0.054271f, -0.077738f, 0.046590f, 0.108908f, 0.002105f, -0.052251f, -0.020848f, 0.031478f, 0.064059f, 0.017514f, -0.021824f, -0.047102f, -0.078834f, -0.006521f, -0.000404f, 0.031175f, -0.023555f, -0.010798f, -0.018034f, 0.053927f, 0.003542f, -0.001706f, -0.015419f, 0.011130f, 0.003192f, -0.000166f, 0.002229f, -0.000696f, 0.010248f, 0.034373f, 0.042231f, 0.022137f, -0.006162f, -0.003482f, 0.016881f, 0.004168f, -0.010250f, 0.004922f, -0.016574f, -0.010158f, -0.020218f, -0.029705f, -0.062164f, -0.024688f, 0.009794f, 0.003029f, 0.035290f, -0.024963f, -0.017521f, 0.044963f, 0.016949f, -0.011664f, -0.018283f, 0.014648f, -0.004258f, -0.017138f, 0.044780f, 0.005247f, -0.001789f, -0.013915f, 0.001644f, -0.017677f, -0.023553f, 0.014807f, -0.050692f, 0.007045f, -0.030243f, 0.045775f, 0.004188f, 0.012071f, + -0.025433f, 0.019972f, -0.006463f, -0.019255f, 0.009644f, -0.019795f, -0.010409f, -0.016878f, -0.040354f, -0.024399f, 0.031213f, 0.024558f, 0.020302f, 0.020827f, -0.048993f, -0.015077f, 0.010732f, -0.015338f, 0.030150f, 0.020042f, 0.002652f, 0.017031f, 0.050544f, -0.015524f, -0.050121f, 0.096356f, -0.041548f, -0.054866f, 0.060870f, -0.029699f, -0.016318f, 0.012789f, 0.031623f, -0.036740f, -0.010551f, 0.003096f, -0.022957f, 0.125678f, -0.000302f, -0.021226f, -0.007174f, 0.000559f, 0.032238f, -0.062404f, -0.046214f, -0.026948f, -0.023917f, -0.002686f, -0.052446f, -0.000640f, -0.003868f, 0.019057f, 0.080843f, 0.080209f, -0.030381f, 0.061884f, -0.060313f, -0.055077f, 0.033931f, 0.050002f, -0.016325f, 0.013474f, 0.007444f, 0.034121f, 0.043949f, -0.000426f, 0.003881f, 0.055960f, -0.049375f, -0.100618f, -0.010055f, -0.040376f, 0.023386f, 0.046704f, -0.003535f, -0.032097f, 0.065402f, 0.018613f, 0.014105f, -0.017804f, -0.051581f, -0.030027f, 0.006898f, -0.023294f, 0.031506f, -0.003157f, -0.017731f, -0.003147f, -0.020209f, -0.022478f, 0.031342f, -0.010089f, 0.013435f, -0.022480f, 0.033325f, -0.003195f, + -0.000581f, 0.020132f, 0.032042f, -0.003775f, -0.005018f, -0.021427f, 0.004115f, -0.018476f, -0.015053f, -0.013127f, -0.003892f, -0.031937f, 0.001463f, -0.014736f, -0.003880f, -0.032020f, 0.010716f, 0.036137f, 0.015444f, -0.022685f, -0.044656f, -0.003800f, -0.002532f, 0.024537f, -0.060663f, -0.013146f, 0.016312f, -0.013064f, 0.030732f, -0.000816f, 0.019367f, 0.004691f, -0.036506f, 0.039452f, 0.000376f, 0.024174f, -0.024954f, -0.037934f, 0.035224f, -0.037553f, 0.011525f, -0.008531f, 0.033090f, 0.000334f, 0.007141f, -0.019872f, 0.006179f, -0.013986f, -0.049346f, -0.038588f, 0.016254f, -0.002820f, -0.001552f, 0.008277f, 0.036323f, -0.016165f, -0.011497f, -0.030504f, 0.012942f, 0.011563f, -0.004136f, -0.005777f, -0.082745f, 0.004085f, 0.022782f, -0.029138f, 0.020108f, -0.045319f, -0.009003f, 0.003363f, 0.028115f, 0.036458f, 0.003900f, -0.016865f, 0.010988f, 0.065395f, 0.056246f, 0.056813f, -0.003091f, -0.004800f, 0.011505f, 0.007153f, -0.026512f, 0.017171f, 0.070775f, -0.050498f, -0.017183f, -0.014365f, -0.000498f, 0.003086f, 0.008597f, -0.037456f, -0.058378f, -0.021298f, -0.004158f, 0.116592f, + 0.058343f, 0.039835f, -0.006191f, -0.009800f, -0.030385f, 0.050913f, 0.006556f, 0.032718f, -0.012747f, -0.015324f, -0.024261f, -0.020388f, -0.086716f, -0.037705f, -0.046157f, 0.035982f, -0.004179f, -0.016416f, -0.003559f, -0.034928f, -0.017356f, 0.037674f, 0.055333f, -0.008456f, 0.048685f, 0.027013f, 0.019893f, 0.003305f, 0.022610f, 0.029961f, 0.024092f, -0.006036f, -0.002452f, 0.000642f, 0.032897f, -0.026509f, -0.035369f, -0.016449f, 0.017637f, -0.002993f, -0.025151f, -0.015575f, -0.025196f, 0.014543f, -0.006402f, 0.030941f, 0.060398f, 0.011692f, 0.036900f, 0.049314f, 0.023034f, 0.030649f, 0.014458f, 0.009831f, 0.012676f, -0.022356f, 0.031471f, -0.026539f, -0.018789f, 0.007248f, 0.001866f, -0.018921f, 0.008888f, 0.017616f, 0.031607f, 0.013358f, -0.038141f, 0.020559f, 0.014829f, 0.004079f, 0.016446f, -0.010027f, -0.079572f, 0.044738f, 0.038845f, -0.002020f, 0.063949f, 0.028940f, -0.043921f, -0.043019f, 0.018540f, -0.017604f, -0.039215f, 0.002638f, 0.003648f, 0.017586f, -0.009940f, 0.022914f, -0.005902f, 0.021701f, 0.027327f, -0.025341f, -0.103099f, 0.055348f, -0.015780f, -0.032117f, + 0.023184f, 0.036599f, 0.001042f, -0.068981f, -0.009301f, -0.002684f, -0.071342f, -0.044268f, 0.037208f, -0.010710f, -0.029133f, -0.024330f, 0.015843f, -0.069090f, -0.049354f, 0.093610f, -0.008204f, -0.054121f, 0.021016f, 0.050919f, 0.021542f, -0.076712f, 0.109619f, 0.044560f, -0.067956f, 0.037780f, 0.049428f, 0.008072f, -0.046101f, 0.047756f, 0.052951f, 0.032484f, -0.042508f, 0.040086f, 0.074266f, 0.004157f, 0.075026f, 0.093241f, -0.050058f, -0.029569f, -0.034928f, 0.088106f, 0.055803f, -0.038076f, 0.021238f, -0.022973f, -0.056200f, 0.048311f, 0.109474f, 0.015959f, -0.033197f, -0.027437f, 0.065688f, -0.006047f, -0.073980f, -0.052699f, 0.013218f, -0.002632f, 0.060897f, -0.010792f, 0.047001f, -0.091594f, -0.014245f, 0.003767f, 0.015568f, -0.018994f, 0.019291f, -0.000771f, 0.001718f, 0.010607f, 0.002445f, -0.023876f, 0.007121f, -0.011322f, 0.014647f, 0.005880f, -0.033523f, 0.029266f, 0.009384f, -0.027741f, -0.019980f, 0.005357f, -0.024227f, 0.004778f, 0.021931f, 0.024292f, 0.003336f, -0.022744f, -0.007511f, 0.007523f, -0.031334f, 0.018261f, 0.023025f, 0.007534f, 0.001831f, 0.023121f, + 0.008372f, -0.010391f, 0.011187f, -0.008383f, 0.001849f, -0.015977f, 0.009991f, 0.036982f, 0.064708f, 0.103699f, 0.041932f, -0.043131f, -0.015772f, -0.036191f, 0.022187f, -0.017646f, 0.028567f, 0.018722f, -0.047573f, 0.024175f, -0.048476f, -0.016424f, 0.000477f, -0.017932f, 0.002825f, 0.025282f, 0.019924f, 0.001342f, -0.038617f, 0.008678f, 0.031209f, -0.011825f, 0.004737f, -0.014065f, -0.045174f, 0.045791f, -0.027239f, 0.031702f, -0.046520f, -0.027526f, -0.006456f, -0.038323f, -0.011261f, 0.038904f, -0.037832f, 0.051299f, 0.003455f, 0.041837f, 0.016641f, -0.020841f, -0.055990f, 0.046037f, 0.028680f, 0.019176f, 0.011950f, 0.047468f, -0.035028f, -0.017866f, -0.020211f, 0.014848f, 0.017956f, -0.004638f, -0.044164f, -0.001990f, -0.005974f, -0.044729f, -0.017594f, 0.007098f, 0.012273f, 0.035343f, -0.004043f, -0.031409f, 0.042097f, -0.008043f, -0.007097f, 0.050473f, 0.024177f, -0.041329f, 0.013607f, -0.025306f, 0.016265f, -0.013239f, 0.019954f, -0.035678f, 0.020217f, -0.012328f, 0.039802f, 0.006861f, 0.015434f, -0.013355f, 0.000153f, -0.028931f, 0.011875f, 0.001959f, 0.001569f, -0.000679f, + 0.008585f, -0.011611f, -0.010579f, -0.001325f, 0.004996f, -0.003170f, 0.007918f, -0.014673f, -0.002523f, 0.011407f, -0.002414f, -0.000452f, -0.002048f, 0.000384f, 0.001031f, -0.023193f, 0.004771f, 0.018768f, 0.000750f, -0.002626f, -0.004635f, -0.002191f, -0.016897f, 0.001346f, -0.003911f, -0.002047f, -0.008560f, -0.014174f, -0.002769f, 0.014114f, -0.007635f, -0.004177f, 0.007026f, 0.003088f, 0.011200f, -0.010543f, -0.003606f, -0.001480f, -0.007967f, -0.012323f, -0.076850f, -0.090521f, -0.048479f, 0.268574f, 0.236102f, 0.142890f, 0.313292f, -0.066759f, -0.235338f, -0.082743f, -0.443705f, -0.232592f, -0.004577f, -0.114830f, 0.158712f, 0.290874f, 0.040849f, 0.170924f, 0.333269f, 0.055945f, 0.116320f, 0.011138f, -0.342220f, -0.285904f, -0.252416f, -0.278087f, -0.168509f, 0.138081f, 0.058565f, 0.138257f, 0.360217f, 0.217060f, 0.056320f, 0.267237f, 0.122111f, -0.163700f, 0.089064f, -0.119462f, -0.313314f, -0.038648f, -0.193651f, -0.356230f, -0.160604f, -0.036961f, -0.186658f, 0.208425f, 0.224396f, 0.106187f, 0.357297f, 0.403536f, 0.153281f, 0.199553f, 0.188434f, -0.209907f, -0.136611f, -0.268442f, + -0.419249f, -0.385730f, -0.247140f, -0.248310f, -0.071094f, 0.161280f, 0.208924f, 0.278989f, 0.393332f, 0.353135f, 0.206627f, 0.150703f, 0.027369f, -0.163634f, -0.237676f, -0.174341f, -0.226281f, -0.279752f, -0.094457f, -0.105617f, -0.051071f, 0.174552f, 0.121209f, 0.128984f, 0.271814f, 0.069320f, -0.011649f, 0.044834f, -0.074707f, -0.117356f, -0.064969f, -0.118590f, -0.035231f, 0.076107f, 0.029361f, 0.041957f, 0.096622f, -0.022559f, 0.020545f, 0.052512f, -0.088117f, -0.008813f, 0.111861f, -0.105331f, 0.009682f, 0.017753f, -0.209570f, -0.010608f, -0.003472f, -0.250921f, 0.020672f, 0.088486f, -0.031557f, 0.258666f, 0.235625f, 0.043161f, 0.252115f, 0.124160f, -0.010188f, 0.041904f, -0.066982f, -0.270961f, -0.281743f, -0.349375f, -0.396985f, -0.200310f, -0.031595f, 0.080714f, 0.250580f, 0.415360f, 0.476980f, 0.379173f, 0.281324f, 0.128541f, -0.051373f, -0.157795f, -0.346702f, -0.435036f, -0.319499f, -0.256749f, -0.243660f, 0.016175f, 0.121460f, 0.147900f, 0.242618f, 0.216148f, 0.143419f, 0.140582f, 0.102297f, 0.033270f, 0.042203f, 0.001044f, -0.073620f, -0.084969f, -0.106837f, -0.137669f, + -0.119599f, -0.080359f, -0.046544f, -0.003850f, 0.026200f, 0.015073f, 0.009636f, 0.000465f} + }, + { + {-0.000983f, 0.012034f, -0.001255f, 0.003665f, -0.002216f, 0.016058f, -0.006321f, -0.001542f, -0.000590f, 0.002001f, -0.002856f, 0.007361f, -0.001293f, -0.004943f, -0.000902f, 0.010059f, 0.000722f, -0.005074f, 0.004688f, 0.003483f, 0.006592f, 0.002720f, -0.005063f, -0.003322f, 0.011205f, 0.001572f, -0.002901f, -0.002212f, -0.002315f, 0.002216f, 0.002364f, -0.001440f, -0.014327f, -0.003573f, 0.000662f, 0.009878f, 0.003500f, -0.001218f, -0.000070f, -0.005690f, 0.007832f, -0.008024f, -0.010708f, 0.001387f, 0.000074f, -0.003614f, -0.002490f, -0.002980f, 0.001497f, 0.000975f, 0.000911f, -0.003737f, 0.009293f, 0.000286f, 0.012465f, -0.002013f, -0.005986f, 0.002739f, -0.000697f, 0.001785f, 0.002868f, 0.006314f, 0.004263f, -0.001618f, -0.003465f, -0.002927f, 0.008074f, -0.008259f, 0.000287f, 0.000228f, -0.001485f, -0.007086f, 0.006209f, -0.003576f, 0.000789f, 0.005415f, -0.003855f, -0.005125f, -0.004293f, 0.005490f, -0.000544f, -0.001723f, -0.001565f, 0.000171f, -0.001069f, -0.002244f, 0.002692f, 0.002785f, 0.002004f, 0.001261f, 0.000660f, 0.003808f, 0.000578f, -0.000096f, 0.000765f, -0.000392f, + 0.000097f, -0.000902f, -0.000515f, -0.000477f, 0.002541f, 0.000603f, -0.001768f, 0.002196f, -0.004770f, 0.004171f, 0.002469f, -0.005560f, -0.003098f, -0.000406f, 0.000495f, -0.000262f, -0.000850f, -0.002800f, 0.005036f, 0.001007f, -0.002205f, -0.002929f, -0.000175f, 0.010502f, -0.001489f, -0.004884f, 0.006680f, -0.002572f, -0.006335f, -0.000602f, 0.005340f, 0.004047f, -0.003481f, 0.000988f, -0.004345f, 0.002560f, 0.002435f, -0.002021f, 0.005333f, -0.001418f, -0.009697f, 0.001843f, 0.004987f, 0.004727f, 0.000632f, -0.000668f, -0.007038f, -0.002314f, -0.000951f, -0.003022f, 0.006302f, 0.008941f, 0.004112f, -0.012075f, 0.004076f, 0.014326f, 0.005876f, -0.000644f, -0.000124f, 0.006628f, -0.003281f, 0.002207f, -0.006048f, -0.005389f, 0.005495f, 0.006300f, 0.002982f, 0.001728f, 0.001074f, 0.001311f, 0.002919f, 0.000618f, -0.000597f, -0.002095f, 0.001466f, -0.004184f, -0.000832f, -0.001771f, -0.008692f, -0.004273f, 0.001781f, 0.003277f, 0.002625f, 0.005916f, 0.004588f, 0.004923f, 0.006974f, -0.004415f, -0.002855f, -0.001243f, 0.002191f, 0.002620f, 0.004100f, -0.000836f, -0.001423f, -0.000733f, + 0.002489f, -0.001788f, 0.002249f, 0.000619f, -0.000990f, -0.000723f, 0.000718f, -0.000379f, 0.001355f, 0.000617f, 0.000185f, -0.000535f, 0.000732f, 0.000740f, -0.000344f, 0.001164f, 0.000242f, 0.000321f, -0.000957f, 0.000239f, -0.000299f, 0.000064f, 0.001429f, 0.000205f, 0.000583f, 0.000579f, 0.008295f, -0.000581f, 0.003419f, -0.005342f, -0.007983f, -0.004981f, 0.004330f, -0.003623f, -0.003711f, -0.003930f, -0.005275f, 0.005077f, 0.000705f, 0.003726f, -0.001654f, 0.001099f, -0.010837f, -0.006955f, -0.004956f, 0.006946f, 0.001310f, 0.001548f, 0.003781f, -0.003831f, -0.001965f, -0.000862f, 0.001237f, -0.008203f, -0.001602f, -0.005534f, -0.006052f, 0.000350f, -0.005342f, 0.003579f, 0.003351f, 0.014308f, -0.003579f, 0.007277f, -0.004861f, 0.003008f, -0.003343f, 0.000749f, 0.012492f, 0.002007f, 0.005401f, -0.005927f, 0.003793f, -0.005332f, -0.002554f, -0.000826f, 0.007928f, -0.003924f, -0.002065f, -0.007074f, -0.003779f, -0.008353f, -0.001143f, 0.007892f, 0.001866f, 0.000585f, 0.001347f, 0.007235f, -0.007156f, -0.012518f, 0.002879f, 0.003937f, -0.008192f, -0.000604f, 0.001077f, -0.002029f, + 0.003279f, 0.009782f, 0.002027f, -0.002490f, 0.000206f, -0.003489f, 0.000631f, 0.000591f, -0.002812f, -0.000845f, -0.000905f, -0.003961f, -0.000946f, -0.002263f, 0.000824f, -0.000863f, -0.001571f, 0.003234f, -0.000626f, -0.003192f, 0.001355f, -0.002275f, 0.000090f, -0.002461f, -0.003586f, 0.002079f, -0.000656f, -0.000261f, 0.001133f, 0.001520f, 0.000457f, 0.003315f, -0.001581f, -0.000279f, 0.000554f, -0.001195f, -0.000511f, -0.000377f, -0.001653f, -0.000867f, 0.002730f, 0.000912f, 0.003890f, 0.000477f, 0.001747f, -0.001543f, 0.004604f, -0.012781f, 0.002134f, -0.004475f, -0.009399f, -0.006808f, 0.003836f, -0.001887f, -0.000421f, 0.009326f, 0.003114f, -0.001305f, 0.000832f, 0.007931f, -0.003716f, 0.005855f, -0.002640f, 0.001749f, -0.008376f, -0.001483f, 0.005710f, -0.001915f, 0.007089f, 0.007928f, 0.002631f, 0.004995f, 0.010406f, -0.002429f, -0.014602f, 0.003327f, -0.006485f, 0.000457f, -0.017889f, 0.000490f, 0.005774f, -0.003590f, 0.006711f, 0.000951f, -0.006437f, 0.002325f, -0.013446f, -0.008617f, -0.003260f, -0.003308f, -0.011153f, 0.005669f, 0.006225f, 0.000367f, 0.005796f, 0.000446f, + 0.001594f, -0.003622f, 0.005259f, 0.003987f, -0.002061f, 0.012340f, -0.002290f, 0.010195f, 0.008762f, -0.000501f, -0.001388f, 0.000027f, 0.002829f, 0.004165f, 0.001362f, 0.004662f, 0.001587f, 0.001584f, 0.013687f, 0.005212f, -0.005928f, -0.002741f, -0.000047f, -0.003289f, 0.002061f, -0.002380f, 0.013807f, 0.002300f, 0.006506f, -0.004947f, 0.005626f, -0.000062f, -0.002678f, 0.001183f, -0.004420f, -0.002904f, -0.000727f, -0.003201f, -0.001931f, -0.001939f, 0.001727f, -0.003004f, -0.000663f, -0.002116f, -0.001052f, -0.001031f, 0.003824f, -0.001614f, 0.002013f, -0.000544f, -0.003180f, -0.000537f, 0.002033f, 0.000799f, 0.000395f, 0.001238f, -0.001904f, 0.001665f, 0.001136f, 0.000975f, 0.001910f, -0.001074f, 0.000489f, -0.003151f, -0.000180f, 0.002415f, 0.002214f, 0.000524f, 0.000455f, 0.000301f, 0.001819f, -0.024377f, 0.000080f, -0.000059f, 0.006256f, 0.010717f, 0.003759f, -0.005380f, -0.008911f, -0.001410f, 0.011593f, -0.002186f, -0.002209f, -0.008576f, -0.000199f, -0.003560f, 0.008585f, 0.010218f, -0.017514f, 0.011444f, 0.007301f, -0.006626f, -0.001421f, -0.009169f, 0.000058f, -0.002756f, + 0.000219f, 0.006035f, 0.011649f, -0.004358f, 0.002693f, -0.003034f, -0.003985f, 0.004339f, 0.008039f, 0.005434f, -0.005050f, -0.008277f, 0.005780f, 0.004026f, -0.002985f, -0.001494f, 0.001013f, -0.010672f, 0.003886f, 0.003248f, -0.004278f, -0.007131f, 0.002763f, -0.005415f, 0.009505f, 0.004198f, -0.016690f, 0.007634f, -0.007148f, -0.018366f, -0.005330f, -0.001358f, 0.003688f, -0.007522f, -0.000350f, 0.004072f, -0.008119f, -0.007981f, -0.008356f, -0.002539f, 0.002092f, 0.017465f, 0.002743f, 0.003336f, -0.003756f, -0.009100f, 0.011885f, -0.003587f, -0.013959f, 0.000710f, -0.014089f, 0.001085f, -0.001368f, -0.005113f, -0.015434f, 0.004727f, 0.000206f, -0.003370f, 0.003769f, 0.009385f, 0.004291f, -0.001753f, -0.001603f, -0.000021f, 0.005101f, 0.000852f, 0.001244f, 0.002899f, 0.004966f, -0.000405f, -0.002341f, -0.002951f, -0.003093f, 0.001223f, -0.000254f, -0.002399f, -0.002490f, 0.002290f, 0.002165f, 0.004380f, 0.000899f, -0.000069f, -0.000267f, 0.001659f, -0.000783f, -0.000041f, -0.000715f, 0.002784f, -0.000339f, 0.001504f, -0.000431f, 0.015187f, 0.004055f, 0.003299f, 0.006622f, 0.009559f, + -0.002138f, 0.023348f, -0.003424f, 0.016705f, -0.019731f, 0.006783f, 0.011485f, -0.004174f, 0.001575f, -0.005554f, -0.000560f, 0.008992f, 0.016390f, -0.004659f, -0.008187f, -0.002414f, 0.007622f, 0.001615f, 0.016666f, 0.007882f, -0.001832f, 0.002383f, -0.000152f, -0.007826f, 0.001523f, -0.001762f, -0.002450f, 0.007277f, 0.009557f, -0.015150f, 0.017443f, -0.013323f, -0.007266f, 0.002950f, -0.005418f, 0.008779f, 0.000197f, -0.005078f, 0.012313f, 0.017280f, -0.012920f, -0.002349f, -0.001290f, 0.005336f, -0.012235f, -0.020127f, -0.009410f, -0.006170f, 0.005884f, -0.013966f, -0.008083f, -0.001647f, 0.014411f, 0.009060f, -0.010101f, 0.007172f, 0.003790f, -0.005507f, -0.008308f, -0.001335f, -0.005127f, -0.005928f, 0.000564f, -0.003952f, 0.010765f, -0.008199f, -0.001742f, 0.009123f, -0.007291f, 0.009861f, 0.011780f, 0.001586f, -0.001262f, 0.001015f, -0.014642f, -0.012987f, -0.003279f, 0.008114f, 0.000310f, -0.005704f, 0.005338f, 0.011972f, -0.008040f, -0.003749f, 0.003224f, -0.001105f, -0.005727f, -0.000053f, 0.001495f, -0.005533f, 0.000254f, -0.001541f, 0.002426f, 0.000708f, 0.004295f, 0.000580f, + 0.003361f, -0.002191f, -0.000947f, 0.000137f, 0.000348f, -0.000250f, 0.003004f, 0.001283f, 0.003511f, 0.003374f, 0.000288f, 0.000991f, -0.000563f, 0.002291f, 0.003491f, -0.001765f, 0.008900f, 0.007235f, 0.009722f, -0.009392f, -0.012426f, -0.006718f, 0.008441f, 0.000381f, 0.034950f, -0.002672f, -0.000868f, -0.008455f, -0.015809f, -0.023234f, -0.005139f, 0.007630f, 0.012278f, -0.007705f, -0.014882f, 0.001886f, 0.000119f, 0.014858f, -0.005002f, -0.006155f, 0.018384f, -0.010076f, 0.001184f, -0.014240f, 0.009076f, -0.002899f, 0.000058f, -0.003210f, -0.021624f, -0.013617f, 0.001135f, 0.011934f, 0.008004f, 0.000917f, -0.022406f, 0.014810f, -0.009063f, -0.009297f, -0.009676f, -0.012865f, -0.002020f, 0.012111f, -0.009939f, -0.010992f, 0.007500f, -0.003635f, 0.004301f, 0.022346f, -0.009798f, 0.000421f, 0.001099f, 0.009452f, -0.006648f, -0.006139f, -0.003112f, 0.014176f, -0.003226f, -0.007579f, -0.001339f, 0.011039f, 0.014413f, -0.014384f, -0.016299f, -0.005605f, -0.002426f, -0.005520f, 0.003448f, -0.011500f, -0.004055f, -0.010859f, -0.021530f, -0.008569f, -0.004985f, 0.002793f, -0.019801f, -0.005557f, + 0.000295f, 0.013931f, 0.000409f, -0.012248f, -0.000240f, -0.000584f, -0.003736f, -0.006812f, 0.000298f, 0.002809f, -0.001295f, 0.002061f, 0.001965f, -0.002765f, 0.004023f, -0.001741f, -0.004018f, 0.004293f, 0.005352f, -0.002397f, -0.005136f, -0.000238f, -0.001010f, 0.000821f, 0.004286f, 0.001523f, 0.000078f, 0.002943f, -0.001631f, -0.002661f, -0.002065f, -0.002912f, 0.004185f, -0.011406f, 0.009667f, 0.011813f, -0.008688f, -0.010516f, -0.008895f, 0.004820f, -0.000900f, 0.017119f, 0.029810f, -0.016729f, 0.001100f, -0.000688f, -0.002086f, 0.002787f, 0.008620f, -0.024474f, 0.021981f, -0.017243f, -0.008547f, 0.022144f, -0.005131f, -0.010571f, 0.007324f, 0.008192f, 0.000484f, -0.001223f, -0.017092f, 0.010678f, -0.002448f, 0.003719f, -0.011318f, 0.014111f, -0.001306f, -0.023546f, -0.025169f, 0.008425f, -0.004629f, -0.012977f, 0.006364f, -0.001061f, 0.038957f, 0.006556f, -0.007142f, -0.011586f, -0.022995f, -0.008132f, 0.004447f, -0.005575f, 0.017931f, -0.003780f, -0.026780f, -0.002572f, 0.018388f, -0.008021f, 0.002396f, 0.015922f, 0.010724f, -0.009003f, -0.001702f, 0.012899f, 0.017188f, -0.007825f, + 0.003346f, 0.002480f, -0.008315f, 0.003753f, -0.003840f, -0.001126f, 0.002546f, -0.003976f, -0.004865f, -0.016555f, -0.018157f, -0.015302f, 0.015272f, 0.008571f, 0.009941f, 0.004244f, 0.000095f, 0.006134f, -0.013256f, -0.007281f, -0.018544f, 0.009231f, -0.002365f, -0.002521f, -0.003793f, -0.002723f, -0.009475f, -0.005570f, 0.001908f, -0.003801f, 0.000540f, 0.000755f, 0.000634f, 0.003679f, 0.000440f, 0.004407f, -0.000511f, 0.003262f, -0.004338f, 0.002514f, -0.006490f, 0.000592f, -0.003103f, 0.005430f, 0.000223f, -0.003360f, -0.001047f, 0.001752f, -0.002816f, -0.003083f, -0.007586f, -0.007525f, -0.004239f, 0.007762f, 0.000471f, 0.002777f, 0.004802f, -0.019972f, 0.007575f, -0.021560f, 0.000835f, 0.007850f, -0.003487f, -0.016134f, -0.007594f, -0.003289f, 0.014448f, 0.011480f, -0.008605f, -0.008904f, 0.015406f, 0.006431f, -0.008926f, -0.009627f, -0.007514f, -0.001017f, 0.014897f, -0.002526f, 0.001351f, -0.000828f, -0.000184f, 0.019142f, 0.009485f, 0.012832f, -0.000900f, -0.000917f, 0.006602f, -0.009875f, -0.016661f, 0.013637f, 0.021908f, -0.014791f, 0.018834f, -0.005494f, -0.001908f, -0.008411f, + 0.009706f, 0.000634f, -0.010544f, 0.006462f, 0.017811f, 0.013978f, 0.006438f, -0.013331f, -0.005483f, -0.027034f, 0.004502f, 0.014158f, -0.008702f, -0.002121f, -0.010718f, 0.002862f, -0.006379f, 0.010570f, -0.006683f, 0.003567f, 0.012551f, 0.007218f, 0.023643f, 0.012431f, 0.008000f, 0.015187f, -0.012678f, 0.022764f, 0.007032f, 0.013870f, -0.004527f, -0.015565f, -0.024115f, -0.004504f, -0.004038f, -0.006215f, -0.005652f, 0.009070f, -0.016573f, 0.025172f, -0.004290f, -0.020196f, 0.011573f, 0.018842f, 0.007796f, 0.002514f, 0.003934f, 0.007137f, 0.002402f, -0.004054f, 0.004838f, -0.003702f, -0.000043f, 0.007984f, -0.000006f, -0.000184f, 0.008640f, 0.001351f, 0.004747f, -0.000599f, -0.004019f, 0.001437f, 0.000873f, -0.003315f, 0.002716f, 0.003661f, 0.000965f, -0.002318f, 0.002105f, 0.000858f, 0.006703f, 0.001619f, -0.001186f, 0.004373f, -0.005689f, 0.001828f, 0.001338f, -0.006078f, -0.009077f, -0.002387f, -0.003529f, -0.002177f, -0.004479f, -0.003016f, -0.001861f, -0.000605f, 0.011190f, -0.023811f, 0.017514f, 0.006064f, -0.003599f, 0.025849f, 0.020003f, -0.032825f, -0.021979f, 0.020712f, + 0.035554f, -0.003283f, 0.005254f, -0.003026f, -0.004478f, -0.003552f, -0.001466f, 0.009000f, 0.005362f, 0.021488f, 0.005301f, 0.020563f, 0.005819f, 0.008950f, -0.002782f, -0.011617f, 0.004999f, 0.001613f, -0.009472f, 0.015743f, 0.001631f, 0.006317f, 0.003689f, -0.003251f, -0.014586f, 0.001907f, -0.016549f, -0.005583f, -0.019154f, -0.012815f, -0.007740f, 0.016113f, 0.002313f, 0.007942f, 0.019730f, -0.008521f, -0.001636f, 0.002324f, 0.007094f, 0.002142f, 0.000495f, -0.005529f, 0.014609f, 0.032176f, 0.015488f, -0.025604f, -0.018247f, -0.018948f, 0.022228f, -0.003366f, -0.020573f, 0.012022f, -0.011528f, -0.001257f, -0.003361f, -0.001429f, -0.001580f, 0.000705f, 0.019487f, 0.032207f, 0.012183f, 0.027739f, 0.017793f, 0.008997f, 0.003616f, 0.006989f, -0.008926f, 0.029524f, 0.009559f, -0.015489f, -0.020737f, 0.009160f, 0.006825f, -0.005683f, 0.014796f, 0.027918f, 0.006443f, -0.010782f, 0.017396f, -0.001632f, -0.012792f, 0.002653f, 0.009755f, 0.001584f, -0.001694f, 0.001106f, 0.005357f, 0.009411f, 0.004179f, 0.004167f, 0.001070f, 0.006138f, -0.002604f, -0.001213f, -0.003624f, -0.001048f, + 0.012879f, -0.006849f, 0.004767f, -0.002030f, 0.003072f, 0.000302f, -0.003434f, 0.001907f, 0.004566f, 0.005594f, -0.002663f, 0.002283f, -0.005199f, -0.000159f, 0.002588f, -0.009326f, 0.003955f, -0.013318f, 0.003715f, 0.032026f, 0.006120f, 0.011247f, -0.010275f, 0.008207f, -0.015777f, -0.027908f, 0.000647f, 0.014845f, 0.004456f, 0.011909f, 0.016821f, 0.018447f, 0.001102f, -0.020258f, -0.017158f, -0.026818f, -0.041433f, -0.000782f, -0.004988f, 0.018261f, 0.013623f, -0.015616f, -0.008666f, 0.010684f, 0.021679f, -0.027187f, -0.017499f, -0.005277f, -0.014856f, -0.010187f, -0.005550f, 0.008331f, 0.016835f, 0.000696f, -0.010221f, -0.012623f, 0.017012f, -0.013648f, -0.005718f, -0.000469f, 0.023945f, -0.001745f, 0.001967f, -0.037648f, -0.002836f, 0.009112f, 0.019314f, 0.025032f, 0.005411f, -0.024275f, 0.011428f, 0.000418f, 0.011374f, 0.015734f, 0.002663f, 0.007872f, 0.018159f, 0.031654f, -0.021093f, -0.008408f, -0.001855f, 0.009645f, 0.033759f, 0.014138f, 0.011279f, 0.018858f, -0.006496f, -0.011230f, -0.020263f, -0.025605f, -0.015148f, -0.001066f, 0.016385f, 0.037507f, -0.023438f, -0.017305f, + -0.002403f, 0.036778f, -0.020630f, -0.012057f, -0.018426f, -0.003466f, -0.016514f, 0.005211f, 0.003157f, 0.008698f, 0.019582f, 0.003541f, 0.012546f, -0.008209f, -0.008065f, -0.010503f, 0.000851f, -0.005337f, -0.012206f, -0.011025f, -0.005339f, -0.002955f, -0.002528f, 0.012374f, -0.009314f, -0.002886f, -0.003501f, 0.008831f, 0.002251f, 0.006418f, -0.004193f, -0.004318f, 0.008915f, 0.002894f, 0.002366f, -0.007503f, 0.011486f, -0.005857f, -0.000294f, -0.004108f, 0.003663f, -0.004258f, 0.001210f, 0.007493f, 0.009136f, 0.016674f, 0.009421f, 0.023489f, -0.027782f, -0.019828f, -0.003094f, 0.040768f, 0.016484f, 0.001035f, 0.022059f, -0.013731f, 0.033100f, -0.007767f, -0.029056f, -0.005627f, -0.028874f, 0.023484f, 0.014031f, 0.009221f, 0.009144f, 0.000555f, -0.009259f, 0.011379f, 0.016921f, 0.008535f, -0.005894f, 0.015173f, 0.020267f, 0.018165f, -0.002259f, -0.015733f, 0.027462f, 0.006485f, -0.001676f, -0.004585f, 0.003305f, -0.017892f, 0.017823f, -0.003347f, -0.004935f, -0.022810f, -0.012423f, -0.014070f, 0.032038f, 0.011450f, 0.000350f, 0.004259f, 0.016565f, 0.023817f, 0.012147f, -0.030719f, + 0.028006f, -0.003264f, 0.016206f, 0.006943f, 0.024613f, -0.005601f, -0.032181f, 0.010144f, -0.001453f, 0.013371f, -0.005698f, -0.013118f, 0.011999f, -0.005081f, 0.008151f, 0.040596f, -0.004898f, -0.018606f, 0.000127f, 0.005395f, -0.019643f, 0.032737f, -0.014497f, -0.019636f, 0.028868f, -0.016708f, 0.014746f, 0.002028f, -0.020841f, -0.014763f, -0.020844f, 0.006679f, 0.017563f, -0.010332f, 0.010206f, 0.019504f, -0.010712f, 0.013798f, -0.004385f, 0.023070f, -0.008067f, 0.006975f, 0.007572f, -0.006175f, 0.000179f, 0.001036f, -0.010314f, -0.001199f, 0.009611f, -0.014450f, -0.002708f, 0.010902f, 0.005620f, 0.000506f, -0.008809f, 0.004649f, -0.002268f, 0.003811f, -0.009209f, -0.008863f, -0.004927f, 0.002136f, 0.002476f, -0.010698f, -0.006650f, 0.010432f, 0.001520f, 0.004692f, -0.010909f, 0.005322f, 0.001177f, -0.004782f, 0.002423f, 0.001828f, 0.003825f, -0.005649f, 0.000676f, -0.002616f, -0.000372f, -0.011628f, 0.008701f, -0.026831f, -0.005816f, 0.014456f, 0.002893f, -0.026240f, 0.006477f, -0.009197f, 0.018866f, 0.004691f, 0.009446f, -0.043829f, 0.012954f, 0.000833f, 0.016566f, 0.028286f, + 0.001040f, -0.003559f, 0.001897f, -0.014246f, 0.028230f, -0.027263f, 0.008414f, 0.017265f, 0.011327f, 0.015899f, -0.007725f, -0.013139f, -0.015737f, -0.028218f, 0.010710f, 0.004302f, 0.015960f, 0.029971f, -0.011796f, 0.025699f, 0.013509f, -0.024794f, -0.014603f, -0.000388f, 0.002210f, 0.001317f, -0.000725f, 0.012710f, 0.021560f, 0.020410f, 0.008125f, -0.051803f, 0.012300f, 0.015375f, 0.014815f, -0.034145f, 0.020132f, -0.017539f, 0.017396f, 0.002120f, 0.008938f, -0.004668f, 0.012908f, -0.004169f, 0.043492f, 0.021114f, -0.020253f, 0.002433f, -0.055915f, 0.009260f, -0.016887f, -0.016801f, 0.014974f, 0.011136f, -0.028399f, -0.055134f, 0.034252f, 0.021426f, -0.052323f, 0.020212f, -0.012301f, 0.019797f, -0.004947f, 0.004765f, 0.007485f, 0.000566f, -0.035470f, -0.012994f, -0.005679f, 0.011087f, -0.000966f, -0.008774f, 0.014013f, -0.018592f, -0.007998f, 0.019412f, -0.002332f, -0.001630f, 0.006074f, 0.004095f, 0.006938f, 0.003539f, -0.011059f, 0.004376f, -0.016214f, 0.009731f, -0.007486f, 0.005601f, 0.003431f, -0.004034f, -0.003063f, -0.002696f, -0.006229f, 0.002960f, -0.009632f, -0.001307f, + -0.008275f, -0.005471f, -0.013191f, 0.006539f, -0.004451f, -0.003170f, -0.007912f, 0.003456f, 0.005468f, 0.004279f, 0.002613f, 0.001391f, 0.001074f, 0.004894f, -0.001083f, 0.005303f, 0.003501f, 0.012116f, -0.007160f, -0.006425f, -0.011206f, 0.020340f, -0.015534f, 0.000172f, 0.003022f, 0.052217f, -0.007099f, 0.037712f, 0.009287f, 0.028403f, 0.001805f, 0.008128f, 0.009223f, 0.050348f, 0.050437f, -0.026037f, -0.023805f, 0.028825f, -0.036534f, 0.000045f, 0.009884f, -0.036410f, 0.020746f, 0.002951f, -0.002906f, -0.006600f, -0.011101f, 0.004417f, 0.003931f, 0.006856f, -0.022380f, 0.000211f, -0.005459f, -0.029405f, 0.015022f, 0.020532f, -0.032882f, -0.024453f, -0.012021f, 0.017763f, 0.017227f, 0.016518f, -0.001772f, -0.006639f, 0.015468f, 0.052429f, 0.028249f, -0.010285f, -0.006824f, -0.007111f, 0.035376f, -0.028257f, 0.013071f, 0.007529f, -0.044117f, -0.018255f, -0.001983f, 0.006036f, -0.037392f, 0.025786f, 0.016775f, 0.007535f, 0.007122f, 0.017891f, -0.035410f, -0.004264f, -0.029372f, 0.001330f, 0.018238f, 0.030697f, 0.018889f, -0.019385f, -0.010315f, -0.001522f, 0.001034f, -0.022276f, + 0.049874f, -0.003948f, 0.006645f, -0.011747f, 0.017114f, -0.003786f, 0.010013f, -0.004510f, 0.006229f, 0.004698f, 0.010862f, -0.001265f, 0.000197f, -0.004066f, 0.002588f, -0.000773f, -0.002793f, 0.014705f, -0.004374f, -0.010858f, -0.000610f, -0.001224f, 0.007542f, -0.011070f, 0.002543f, -0.009185f, -0.014372f, 0.008868f, -0.002650f, -0.009852f, 0.000824f, -0.000215f, 0.001734f, -0.008680f, 0.011524f, 0.002955f, 0.014146f, -0.017481f, -0.001176f, 0.008150f, -0.004368f, -0.014207f, -0.000224f, 0.015228f, 0.006933f, -0.004704f, 0.024055f, 0.037299f, -0.002598f, 0.002426f, -0.023102f, 0.001941f, -0.001018f, -0.016514f, -0.027587f, -0.005296f, -0.012774f, -0.020673f, -0.015113f, 0.023377f, -0.019816f, 0.016953f, -0.005973f, -0.004732f, 0.032740f, -0.022668f, -0.012647f, 0.005001f, 0.013207f, 0.001920f, -0.043316f, -0.026628f, 0.004955f, -0.006990f, 0.007027f, -0.006074f, -0.013596f, 0.027600f, 0.005915f, -0.002401f, -0.011342f, -0.062313f, 0.037410f, -0.011292f, -0.000679f, -0.005328f, 0.002382f, 0.017832f, -0.010375f, -0.017023f, -0.029074f, -0.002770f, 0.012838f, -0.017978f, -0.023037f, 0.009469f, + 0.036579f, -0.006241f, 0.034019f, 0.025016f, -0.024900f, 0.045767f, 0.030277f, -0.030235f, -0.046664f, -0.013454f, -0.020336f, 0.002467f, -0.014785f, -0.003660f, 0.022354f, -0.039053f, 0.019116f, -0.006375f, -0.021923f, -0.024520f, -0.024456f, -0.029672f, 0.006179f, 0.017758f, -0.015921f, 0.025389f, -0.003304f, -0.014870f, -0.030565f, 0.000467f, -0.003423f, 0.011788f, 0.036486f, -0.013223f, -0.027638f, -0.009679f, 0.000810f, 0.009350f, 0.024972f, 0.006537f, -0.003087f, -0.020491f, -0.000149f, 0.000736f, 0.009294f, 0.003835f, 0.000058f, 0.006871f, 0.010237f, -0.007696f, 0.012779f, -0.007389f, 0.005858f, 0.014798f, 0.013376f, 0.000786f, -0.020888f, -0.008617f, 0.003197f, 0.005128f, -0.014516f, 0.023561f, -0.014284f, 0.010754f, 0.012771f, -0.009709f, 0.001292f, 0.002564f, -0.005504f, -0.020027f, 0.004277f, 0.008951f, 0.001619f, 0.016774f, 0.011753f, -0.011456f, -0.039542f, 0.071956f, 0.101266f, -0.009770f, 0.012338f, 0.006503f, 0.024527f, 0.049106f, -0.046872f, 0.000565f, 0.008120f, 0.000933f, -0.016905f, 0.002537f, -0.020885f, 0.024653f, 0.060324f, -0.012731f, 0.001295f, 0.003449f, + 0.018273f, 0.001684f, 0.007082f, 0.023209f, -0.046483f, -0.003455f, 0.045602f, 0.046867f, -0.054768f, -0.011611f, 0.007874f, 0.007722f, 0.016296f, 0.041254f, 0.011598f, 0.083201f, 0.013841f, 0.025686f, 0.012249f, -0.013054f, -0.017268f, -0.000979f, -0.058386f, -0.083961f, -0.028442f, -0.027237f, -0.087500f, 0.013714f, -0.002095f, -0.048846f, -0.023860f, -0.081839f, -0.008969f, -0.011251f, 0.055776f, -0.054650f, 0.034086f, -0.037337f, -0.003063f, -0.024548f, -0.019410f, 0.021968f, 0.050119f, -0.038621f, -0.014520f, -0.003484f, -0.011460f, -0.004080f, 0.021128f, 0.040223f, 0.042901f, -0.030611f, 0.086313f, 0.057932f, 0.007522f, -0.032723f, -0.071062f, -0.016096f, -0.026465f, -0.019371f, 0.004666f, 0.022835f, -0.014933f, 0.008532f, 0.026780f, 0.004373f, -0.008529f, 0.027256f, 0.018112f, 0.009363f, 0.011926f, 0.028615f, 0.028815f, 0.000251f, 0.002336f, 0.011591f, 0.010788f, -0.004679f, -0.008616f, -0.004909f, 0.005252f, -0.000678f, -0.003657f, 0.001836f, -0.005762f, 0.004020f, 0.018783f, -0.000774f, 0.006614f, 0.022996f, -0.006024f, -0.008190f, -0.008807f, -0.000933f, -0.012769f, -0.002523f, + 0.010866f, -0.005924f, -0.003503f, 0.002249f, 0.000058f, 0.002009f, -0.001829f, 0.009087f, -0.006136f, -0.006273f, 0.014853f, 0.010579f, -0.011614f, -0.000541f, -0.006223f, -0.036161f, 0.066247f, 0.110277f, -0.025902f, -0.005616f, 0.019645f, 0.049385f, 0.016689f, -0.028636f, 0.018034f, -0.024451f, 0.006443f, 0.015657f, -0.005819f, -0.032986f, 0.010047f, 0.035215f, -0.008654f, -0.050248f, 0.039495f, -0.011474f, 0.032266f, -0.011811f, -0.007820f, -0.012321f, -0.020221f, -0.000716f, 0.035838f, 0.020051f, 0.006050f, 0.028984f, -0.013567f, -0.011327f, 0.011156f, -0.015300f, 0.020141f, 0.011782f, 0.030732f, 0.052519f, 0.046072f, -0.032918f, -0.061379f, -0.022333f, -0.003693f, 0.048313f, -0.018266f, 0.008718f, 0.019605f, -0.018941f, -0.028182f, -0.045219f, -0.046417f, 0.036883f, 0.039347f, -0.031103f, -0.111987f, 0.009453f, -0.007700f, -0.015195f, 0.008916f, -0.010998f, -0.044802f, -0.020819f, -0.010347f, -0.031075f, -0.013170f, 0.047954f, 0.018302f, 0.027735f, -0.010572f, -0.015404f, -0.009913f, 0.026768f, 0.004691f, 0.005202f, 0.023061f, 0.066463f, -0.005541f, -0.009490f, -0.033207f, -0.031392f, + -0.045944f, -0.004721f, 0.026387f, 0.018093f, -0.018601f, 0.014083f, -0.008455f, -0.010706f, -0.019009f, -0.017257f, 0.016215f, -0.013292f, 0.015829f, 0.007602f, 0.009057f, -0.009584f, -0.014138f, 0.016541f, 0.010330f, -0.003760f, 0.012548f, -0.016657f, 0.007413f, -0.001981f, 0.010390f, -0.005276f, -0.009420f, -0.005142f, -0.004530f, 0.011773f, 0.005943f, -0.000165f, -0.011639f, -0.002443f, 0.024161f, -0.016717f, -0.000148f, -0.016214f, 0.020777f, -0.010632f, -0.004307f, -0.014925f, 0.002497f, -0.006138f, 0.002498f, 0.017795f, 0.017782f, 0.004072f, 0.000578f, -0.006199f, -0.023452f, -0.003489f, -0.019336f, 0.010270f, -0.027495f, -0.045728f, -0.009647f, -0.007833f, 0.008749f, -0.015756f, 0.035374f, -0.021083f, -0.071071f, -0.038926f, 0.025057f, -0.033876f, 0.040022f, 0.035206f, -0.015313f, -0.005614f, 0.005497f, -0.021997f, 0.000469f, 0.011386f, -0.002743f, 0.006097f, 0.050605f, 0.041654f, -0.010797f, -0.066776f, -0.050107f, 0.003538f, 0.035637f, -0.026970f, -0.011121f, -0.031655f, -0.039904f, 0.003489f, -0.010993f, -0.047436f, -0.051049f, -0.075652f, 0.030707f, 0.010175f, 0.002030f, 0.043282f, + 0.058738f, -0.002520f, -0.043266f, -0.033353f, -0.034929f, -0.020176f, -0.012143f, 0.013049f, 0.022950f, -0.020395f, -0.031781f, -0.039431f, 0.021121f, 0.018058f, -0.038198f, -0.036941f, -0.014428f, -0.006633f, -0.022177f, 0.013679f, 0.094929f, 0.056586f, 0.110809f, 0.036721f, -0.058481f, 0.068621f, -0.002765f, -0.035487f, 0.003645f, -0.033424f, -0.072273f, -0.030225f, 0.016830f, 0.034341f, -0.007979f, 0.031617f, 0.018568f, 0.070139f, 0.076947f, 0.062946f, 0.021109f, -0.017988f, -0.010996f, -0.010656f, 0.013506f, 0.017617f, -0.026577f, -0.010117f, 0.004503f, 0.057148f, -0.007917f, 0.004711f, -0.006182f, 0.020514f, 0.020948f, 0.024288f, -0.001201f, 0.000232f, 0.000440f, 0.005084f, -0.002225f, 0.003219f, -0.020904f, -0.006952f, -0.007156f, -0.019858f, -0.020260f, -0.009621f, 0.007351f, 0.024016f, -0.015701f, 0.003409f, 0.008503f, 0.027325f, 0.037325f, 0.025309f, 0.023852f, 0.026334f, 0.005852f, -0.010234f, -0.020566f, -0.029861f, -0.036864f, -0.029274f, -0.017166f, -0.035223f, -0.035574f, -0.014016f, -0.006301f, 0.065893f, -0.037418f, 0.004297f, 0.019381f, -0.008315f, -0.048838f, 0.049399f, + 0.047200f, -0.027157f, -0.037337f, 0.005100f, 0.065356f, -0.034277f, 0.018648f, 0.041856f, 0.012845f, -0.015775f, -0.031184f, -0.020532f, 0.014535f, -0.004989f, 0.011091f, -0.018326f, 0.012245f, -0.040568f, 0.059375f, -0.005764f, 0.013382f, -0.002831f, -0.074713f, 0.023269f, -0.020634f, 0.038526f, 0.023292f, 0.041165f, -0.016018f, -0.072140f, 0.051851f, 0.023275f, -0.024441f, -0.044926f, 0.037196f, 0.019855f, 0.039552f, 0.039817f, -0.034687f, 0.015958f, 0.041738f, -0.061116f, 0.056048f, 0.027508f, -0.001698f, 0.017762f, -0.031596f, 0.070067f, -0.007827f, 0.046097f, 0.020791f, 0.081366f, -0.005634f, -0.014317f, 0.011539f, 0.033074f, 0.022058f, 0.023007f, 0.082309f, 0.004784f, 0.020175f, 0.048015f, -0.031706f, 0.032934f, 0.003974f, -0.054740f, 0.020434f, -0.018480f, 0.061929f, -0.045611f, -0.054681f, -0.057030f, 0.048741f, 0.079855f, -0.025439f, 0.020288f, -0.094155f, 0.008931f, 0.004608f, -0.003654f, -0.044059f, 0.007322f, 0.018742f, -0.014628f, -0.012064f, -0.011905f, 0.029917f, 0.013934f, -0.018760f, -0.020372f, -0.011653f, -0.004860f, -0.005831f, 0.008497f, -0.032415f, -0.019543f, + 0.017336f, 0.007058f, 0.006218f, 0.000971f, 0.014949f, -0.002611f, -0.001646f, -0.019161f, 0.025670f, 0.031842f, -0.013566f, -0.049759f, -0.033485f, -0.000448f, 0.000145f, 0.009441f, 0.002605f, -0.015755f, -0.024327f, -0.013502f, 0.009307f, 0.014252f, 0.039916f, 0.013366f, 0.002187f, 0.000562f, -0.029577f, -0.006203f, 0.030959f, 0.018117f, -0.120909f, 0.006640f, -0.014839f, 0.003779f, 0.093553f, 0.077061f, 0.110793f, 0.058549f, -0.029515f, -0.022561f, -0.045961f, -0.061199f, 0.021506f, 0.005385f, 0.016031f, 0.019478f, -0.017879f, 0.027878f, 0.047214f, 0.008701f, -0.012700f, -0.016002f, -0.033520f, -0.022250f, -0.020278f, 0.009245f, 0.015006f, -0.048067f, -0.028484f, -0.006628f, 0.032203f, -0.014558f, 0.020723f, 0.025806f, -0.068355f, -0.067302f, 0.012717f, 0.019506f, 0.014937f, -0.050805f, -0.023410f, -0.045634f, -0.022140f, -0.020896f, 0.043951f, -0.057841f, -0.080582f, -0.030281f, 0.015917f, 0.013686f, -0.062169f, -0.049885f, -0.039259f, -0.029702f, 0.033503f, 0.047299f, 0.002070f, -0.016083f, -0.019722f, -0.010984f, -0.010549f, -0.021392f, -0.069012f, 0.022665f, 0.051725f, 0.047055f, + 0.014579f, 0.064275f, 0.086872f, -0.007596f, -0.011264f, 0.066553f, -0.016207f, -0.040545f, -0.091667f, -0.031222f, 0.012388f, -0.050289f, -0.033739f, 0.023513f, -0.008325f, 0.032613f, 0.057018f, -0.034805f, -0.054053f, -0.017903f, -0.023253f, -0.013436f, -0.014748f, -0.014566f, 0.005970f, 0.008239f, 0.006567f, 0.011576f, -0.019493f, 0.016866f, -0.026887f, -0.003264f, 0.016532f, 0.022261f, -0.024042f, -0.033432f, 0.018993f, -0.007662f, 0.001111f, -0.023356f, 0.027414f, -0.016192f, -0.005934f, -0.006484f, 0.025358f, -0.021643f, 0.027518f, -0.012345f, -0.013050f, 0.018225f, 0.004682f, 0.014500f, -0.011691f, 0.001217f, 0.005270f, 0.029735f, -0.003647f, 0.007000f, 0.079369f, 0.027887f, 0.006401f, 0.029006f, -0.032934f, 0.002170f, -0.016841f, -0.024562f, 0.014650f, 0.005825f, -0.020570f, -0.034097f, -0.019663f, -0.031648f, -0.025819f, 0.010430f, -0.019936f, -0.009650f, 0.014847f, -0.009788f, 0.003320f, -0.010896f, 0.039416f, -0.030810f, 0.032302f, 0.011818f, 0.003584f, -0.029796f, -0.012935f, 0.023902f, 0.009591f, -0.000468f, 0.018967f, -0.003301f, -0.007975f, -0.012152f, -0.010399f, -0.008117f, + 0.003481f, -0.000075f, 0.003909f, -0.034912f, 0.018296f, -0.014550f, -0.013821f, 0.012289f, 0.008265f, 0.004664f, -0.006721f, 0.024646f, 0.021014f, -0.030541f, 0.027288f, -0.003747f, 0.018466f, 0.037072f, -0.007903f, 0.020107f, 0.018920f, -0.018302f, -0.013258f, -0.024423f, 0.002038f, 0.004309f, -0.039466f, 0.016314f, 0.005800f, 0.030696f, -0.012224f, -0.069629f, 0.043541f, 0.002742f, 0.001091f, 0.000991f, -0.030960f, -0.009633f, -0.008296f, -0.010318f, -0.045048f, 0.025641f, 0.012657f, 0.027647f, -0.020186f, 0.012218f, -0.022624f, -0.020372f, 0.000734f, 0.017580f, 0.013914f, 0.000546f, -0.002789f, -0.006210f, 0.001334f, -0.010207f, -0.002342f, 0.029812f, -0.012309f, 0.005991f, 0.002996f, 0.008525f, -0.018482f, 0.019872f, -0.000973f, -0.003688f, 0.004394f, -0.001891f, 0.004282f, 0.006708f, -0.016851f, -0.002211f, 0.000030f, -0.003042f, -0.003311f, 0.009144f, -0.010876f, 0.013308f, 0.018956f, 0.007325f, -0.012280f, -0.000535f, -0.002796f, -0.011122f, 0.013736f, -0.003831f, 0.007368f, -0.040940f, -0.115896f, -0.172578f, 0.036293f, 0.135465f, 0.005703f, 0.370960f, 0.342116f, 0.234898f, + 0.404212f, 0.310830f, 0.042352f, 0.006608f, -0.041880f, -0.296417f, -0.302215f, -0.229880f, -0.395870f, -0.369271f, -0.105517f, -0.123250f, -0.124513f, 0.029550f, 0.074978f, -0.061859f, -0.020578f, 0.118688f, 0.075664f, -0.004124f, 0.088323f, 0.061184f, 0.004634f, 0.073880f, 0.175048f, 0.115100f, 0.040144f, 0.179312f, 0.132754f, 0.010350f, 0.154123f, 0.208890f, 0.050167f, 0.022609f, 0.213119f, 0.058367f, -0.082979f, 0.107299f, 0.164160f, -0.083897f, 0.038346f, 0.229439f, 0.021795f, 0.037911f, 0.276989f, 0.217682f, 0.018384f, 0.172719f, 0.229086f, -0.079549f, -0.047137f, 0.065186f, -0.187417f, -0.313122f, -0.211329f, -0.345296f, -0.512926f, -0.471124f, -0.526955f, -0.671169f, -0.708180f, -0.626480f, -0.662043f, -0.623547f, -0.468169f, -0.373939f, -0.194777f, -0.048576f, 0.110108f, 0.384060f, 0.446984f, 0.485273f, 0.752987f, 0.736162f, 0.494250f, 0.636368f, 0.497283f, 0.197777f, 0.218611f, 0.309146f, 0.151191f, 0.098502f, 0.230987f, 0.164737f, -0.001056f, 0.078892f, 0.179492f, 0.044669f, 0.012399f, 0.133750f, 0.030799f, -0.139557f, 0.044959f, 0.109523f, -0.032225f, 0.098059f, + 0.261389f, 0.103389f, 0.058585f, 0.230055f, 0.125435f, -0.045520f, 0.026659f, -0.059858f, -0.276351f, -0.338432f, -0.336275f, -0.423989f, -0.478946f, -0.396251f, -0.380962f, -0.434352f, -0.392035f, -0.324221f, -0.373407f, -0.341858f, -0.230492f, -0.183543f, -0.175757f, -0.072643f, 0.040874f, 0.048861f, 0.155287f, 0.262841f, 0.276421f, 0.273273f, 0.308792f, 0.285204f, 0.203592f, 0.172427f, 0.153389f, 0.105381f, 0.085696f, 0.105797f, 0.093664f, 0.062624f, 0.065071f, 0.071356f, 0.059524f, 0.057886f, 0.074784f, 0.065060f, 0.043208f, 0.031964f, 0.023129f, -0.010026f, -0.020698f, -0.020894f, -0.020117f, -0.009408f, -0.002847f}, + {0.006995f, 0.009644f, -0.005667f, 0.000385f, 0.000319f, -0.006929f, 0.009254f, -0.003701f, -0.003609f, 0.002632f, -0.009536f, -0.004290f, 0.010232f, 0.002311f, -0.004163f, 0.007257f, 0.002256f, 0.001544f, -0.001492f, 0.003533f, -0.000056f, -0.012246f, -0.000579f, -0.004552f, -0.000544f, -0.000278f, -0.011708f, 0.000170f, -0.007525f, 0.000398f, 0.001188f, 0.005219f, 0.006259f, 0.002053f, 0.001558f, 0.001138f, 0.005408f, -0.002969f, 0.001852f, 0.000335f, 0.000853f, 0.001119f, -0.001618f, 0.004819f, 0.007225f, -0.013881f, 0.006450f, -0.003636f, -0.008339f, -0.005344f, 0.010649f, 0.005330f, -0.003590f, 0.006038f, 0.001764f, -0.003822f, 0.003756f, 0.000075f, 0.000000f, 0.000553f, 0.000733f, -0.001451f, 0.000087f, 0.000783f, -0.000609f, 0.004571f, -0.002839f, -0.006412f, -0.006203f, -0.000041f, 0.002094f, -0.000396f, 0.000304f, 0.003497f, -0.001373f, 0.006141f, -0.006484f, -0.001938f, 0.005003f, 0.005393f, -0.003703f, 0.006080f, 0.002145f, -0.001574f, -0.004097f, -0.001902f, -0.001746f, -0.001634f, -0.001618f, -0.000808f, -0.000226f, -0.000892f, -0.001705f, 0.000524f, 0.001234f, -0.002440f, + -0.000632f, -0.000783f, 0.001275f, -0.002121f, -0.000478f, 0.000306f, 0.005155f, 0.000370f, -0.004109f, 0.002569f, -0.002213f, -0.003295f, 0.000811f, -0.006932f, -0.000828f, -0.005198f, 0.001820f, 0.003230f, 0.003116f, 0.002466f, -0.005405f, -0.000394f, -0.004479f, 0.004782f, -0.009241f, -0.005258f, 0.004662f, -0.010142f, -0.001146f, -0.000684f, 0.002581f, 0.002207f, 0.004975f, 0.010494f, 0.004845f, -0.001328f, -0.000040f, -0.003780f, -0.002936f, -0.018583f, -0.017098f, -0.001164f, 0.012643f, -0.003163f, 0.010097f, 0.000863f, 0.002881f, -0.003164f, -0.014379f, 0.007410f, 0.002266f, -0.004346f, 0.003531f, -0.007640f, -0.001560f, 0.004293f, 0.001892f, 0.013452f, -0.009256f, 0.008153f, -0.004248f, -0.010636f, -0.004940f, -0.002917f, -0.002926f, 0.003736f, 0.003160f, -0.008579f, -0.003828f, -0.004895f, -0.001831f, 0.008241f, 0.008807f, 0.009465f, -0.006964f, 0.001168f, -0.004372f, -0.000590f, -0.003679f, -0.004695f, -0.005693f, -0.006394f, 0.003511f, 0.000990f, -0.000993f, -0.002330f, 0.000833f, 0.003580f, -0.003666f, -0.003220f, -0.001649f, 0.004103f, -0.001436f, -0.000790f, -0.001803f, -0.002087f, + -0.000526f, 0.000895f, -0.000060f, -0.000350f, 0.000679f, 0.000899f, -0.000274f, -0.000400f, 0.002625f, -0.002079f, -0.001320f, 0.001008f, -0.001281f, 0.002031f, -0.001284f, -0.001413f, -0.000289f, -0.000259f, 0.001269f, -0.000669f, -0.000648f, 0.000761f, 0.000160f, -0.002070f, 0.000665f, 0.000483f, 0.006908f, -0.006545f, -0.008447f, -0.007337f, 0.000219f, -0.002906f, -0.002335f, -0.005808f, 0.001263f, -0.006487f, -0.000463f, -0.002677f, 0.009942f, -0.006406f, -0.007001f, -0.015648f, -0.020286f, -0.004924f, -0.009039f, -0.008334f, -0.001979f, 0.004188f, -0.005144f, -0.012192f, 0.007561f, -0.017677f, 0.005318f, -0.002982f, -0.003163f, 0.011405f, 0.008066f, 0.004209f, 0.001594f, -0.001984f, -0.001804f, -0.004312f, 0.001864f, 0.007734f, -0.006221f, 0.007333f, 0.006809f, 0.001957f, 0.001028f, 0.003042f, 0.005224f, -0.011503f, -0.004956f, 0.010933f, -0.008462f, 0.000698f, -0.000141f, 0.006681f, -0.000807f, -0.002569f, 0.001302f, 0.011344f, 0.006328f, 0.003938f, 0.003704f, 0.006315f, -0.009992f, 0.007733f, -0.008147f, 0.007160f, 0.004771f, -0.002144f, -0.001393f, -0.003430f, -0.004448f, -0.007321f, + -0.000323f, -0.002296f, -0.005773f, -0.006461f, -0.003578f, -0.003764f, -0.000602f, -0.000448f, -0.001717f, 0.008613f, -0.003510f, -0.001629f, -0.005811f, 0.005967f, 0.000086f, -0.001335f, 0.001325f, -0.002526f, -0.004172f, 0.000082f, 0.002440f, -0.000296f, -0.000356f, -0.002755f, 0.000847f, -0.000917f, -0.002413f, 0.000151f, 0.000608f, 0.001350f, -0.000254f, 0.000883f, 0.000810f, 0.002016f, 0.000761f, -0.002220f, 0.000154f, 0.001134f, -0.000262f, -0.001948f, -0.001155f, 0.002834f, 0.001531f, -0.001542f, -0.000611f, -0.000617f, 0.004071f, -0.010753f, -0.000257f, -0.005046f, -0.009876f, -0.004593f, -0.001838f, -0.006886f, -0.002326f, -0.006353f, -0.002479f, 0.005003f, 0.006731f, -0.011158f, -0.006348f, 0.003655f, -0.002223f, -0.012191f, 0.008109f, 0.014521f, 0.003044f, -0.003421f, -0.006789f, 0.001606f, 0.007013f, 0.013136f, -0.006680f, -0.002783f, -0.008422f, -0.006753f, 0.007260f, 0.007288f, -0.010222f, 0.006004f, -0.003268f, -0.006521f, 0.010328f, -0.000027f, 0.005632f, -0.014149f, 0.000973f, -0.009073f, 0.002051f, -0.011272f, -0.007080f, -0.001842f, -0.002634f, 0.023510f, 0.007460f, 0.006096f, + 0.004586f, -0.017504f, 0.009785f, 0.006810f, -0.003869f, -0.000440f, 0.007629f, -0.001084f, 0.008061f, 0.009335f, 0.009281f, -0.005385f, 0.000677f, -0.003006f, 0.004938f, -0.004413f, -0.004671f, 0.003074f, -0.004388f, 0.002073f, 0.002902f, 0.000161f, 0.005464f, 0.002169f, -0.010385f, -0.001255f, -0.001328f, 0.003263f, -0.011771f, -0.003782f, -0.002992f, 0.008297f, -0.002533f, -0.001379f, -0.006366f, -0.001682f, 0.000408f, -0.000598f, -0.002970f, 0.000086f, -0.001931f, 0.002146f, 0.000751f, 0.000019f, 0.000337f, 0.000792f, -0.001531f, -0.004377f, 0.002311f, 0.000980f, -0.002528f, 0.001216f, -0.001387f, 0.000524f, 0.000531f, 0.001571f, -0.000362f, -0.000525f, -0.001110f, 0.001006f, -0.001822f, 0.001711f, -0.002072f, -0.000105f, -0.000181f, 0.001366f, -0.001380f, -0.000529f, -0.002000f, -0.001147f, -0.001847f, -0.014548f, -0.008119f, 0.005956f, -0.006375f, 0.017073f, 0.007506f, 0.016715f, -0.000260f, -0.008166f, -0.008711f, -0.011725f, 0.017837f, -0.004368f, 0.008146f, 0.009117f, 0.001880f, 0.006420f, 0.005816f, 0.005679f, 0.002253f, -0.011779f, -0.000680f, -0.004550f, -0.001773f, 0.008083f, + -0.000741f, -0.000719f, 0.005622f, 0.003560f, 0.005823f, -0.005117f, -0.018594f, -0.011084f, -0.007050f, 0.013688f, -0.012376f, -0.003739f, 0.008371f, -0.000941f, 0.001548f, -0.010369f, 0.017983f, 0.000985f, -0.007021f, 0.014214f, -0.008743f, 0.022017f, 0.011363f, -0.004965f, 0.002536f, -0.006268f, -0.004300f, -0.020276f, 0.007175f, -0.009234f, -0.001448f, -0.000788f, -0.004451f, 0.008697f, -0.003402f, -0.008848f, -0.008640f, 0.002016f, -0.007895f, -0.008677f, 0.004950f, 0.000777f, 0.006250f, -0.003383f, -0.018521f, 0.006405f, 0.008039f, 0.010359f, -0.009968f, -0.011198f, 0.001454f, 0.018364f, 0.002949f, -0.009473f, -0.004352f, -0.001593f, 0.005029f, 0.000935f, 0.005356f, -0.005381f, -0.002050f, -0.001042f, -0.006641f, -0.005417f, 0.008157f, -0.001337f, 0.003200f, -0.000685f, -0.002323f, -0.005167f, -0.000498f, 0.000232f, 0.002030f, -0.000940f, 0.001888f, -0.001314f, -0.004221f, -0.001661f, -0.000581f, -0.000062f, -0.000760f, 0.003215f, 0.000185f, 0.003479f, -0.001155f, -0.000204f, -0.000529f, -0.003702f, -0.000005f, 0.001987f, 0.001946f, 0.014687f, -0.013514f, 0.006749f, 0.017239f, -0.012429f, + 0.003410f, -0.006984f, -0.013554f, 0.020059f, 0.007493f, 0.018643f, 0.017165f, 0.002533f, -0.013703f, -0.008371f, 0.007104f, -0.000873f, 0.002959f, -0.014799f, 0.001545f, -0.026311f, -0.011073f, -0.020519f, 0.012658f, -0.011648f, -0.000430f, 0.003805f, -0.003405f, -0.005294f, 0.006222f, 0.006275f, 0.018201f, -0.002510f, -0.004052f, -0.013918f, -0.011923f, 0.011662f, 0.002492f, 0.004042f, 0.021770f, -0.006558f, 0.000141f, 0.011626f, -0.005215f, 0.005394f, 0.003982f, 0.011636f, 0.010428f, -0.007195f, -0.001145f, -0.014751f, 0.015371f, -0.010062f, -0.013358f, -0.012799f, 0.008113f, -0.004723f, -0.007047f, 0.015184f, -0.004730f, 0.015738f, -0.009675f, -0.007310f, -0.002020f, 0.010323f, 0.013322f, -0.000969f, -0.014413f, 0.005247f, -0.009218f, 0.018790f, 0.003873f, 0.011058f, -0.015096f, -0.006615f, 0.004027f, -0.003822f, 0.009075f, 0.001389f, -0.005149f, 0.005486f, 0.012032f, 0.017040f, 0.013097f, 0.000247f, -0.003088f, -0.000155f, 0.002821f, 0.000314f, -0.002960f, 0.002045f, -0.002495f, -0.000364f, 0.004833f, 0.000307f, -0.002397f, 0.005240f, -0.001676f, -0.002714f, 0.001343f, 0.001866f, + -0.000109f, -0.003214f, 0.001187f, -0.002199f, 0.000454f, -0.004391f, -0.005491f, 0.001415f, 0.002057f, -0.000114f, 0.004241f, -0.001495f, 0.001914f, 0.008687f, -0.022997f, 0.008000f, 0.006871f, 0.004559f, -0.017379f, 0.013260f, 0.021948f, -0.021409f, 0.008175f, -0.013178f, 0.008649f, 0.001129f, 0.007774f, -0.006371f, -0.000449f, 0.005016f, -0.014522f, -0.007252f, -0.006242f, 0.011486f, 0.012133f, -0.004007f, 0.005716f, -0.002994f, 0.008974f, 0.011381f, 0.004480f, 0.003415f, -0.011544f, -0.004377f, -0.014424f, -0.016044f, -0.011170f, 0.001042f, -0.005333f, -0.000782f, -0.006666f, -0.015977f, -0.005378f, 0.003213f, 0.001470f, -0.001005f, 0.024154f, -0.019568f, 0.007225f, -0.009766f, -0.002794f, -0.006101f, -0.006127f, 0.010217f, -0.006100f, 0.000744f, -0.007394f, -0.004988f, -0.008987f, 0.012271f, -0.011304f, 0.010059f, -0.002614f, 0.010048f, -0.000900f, 0.001486f, -0.001030f, 0.009710f, 0.005652f, -0.000326f, 0.020948f, 0.000789f, -0.010474f, 0.005470f, -0.009420f, -0.011630f, -0.013951f, 0.013536f, 0.004817f, 0.012053f, 0.012348f, 0.014417f, 0.008513f, -0.001787f, -0.002581f, -0.002659f, + 0.013926f, -0.002091f, 0.015612f, 0.003280f, -0.000657f, -0.002429f, 0.005361f, 0.007898f, 0.002087f, 0.003217f, 0.001104f, -0.001106f, 0.001562f, -0.002671f, 0.004203f, 0.000141f, 0.003606f, -0.001119f, 0.003422f, -0.000418f, -0.005444f, 0.002651f, 0.003758f, -0.000057f, 0.003058f, -0.001016f, 0.000178f, -0.003207f, 0.002641f, -0.000809f, 0.001295f, 0.005731f, 0.005778f, -0.024193f, -0.001923f, 0.003131f, -0.005603f, -0.019056f, 0.021787f, -0.001420f, 0.000794f, 0.018507f, -0.005192f, -0.019074f, 0.006709f, 0.012479f, 0.023631f, -0.001532f, 0.009976f, 0.002033f, -0.020832f, -0.006129f, -0.010841f, 0.010585f, 0.006018f, 0.005524f, -0.007812f, -0.001436f, -0.000901f, 0.001892f, -0.007062f, 0.009857f, 0.002714f, -0.008390f, 0.012190f, 0.001709f, -0.013697f, -0.011495f, 0.003168f, 0.014768f, 0.013241f, -0.018540f, 0.036215f, -0.001812f, 0.000656f, 0.009957f, -0.001468f, -0.004773f, -0.000352f, 0.023281f, -0.011685f, 0.011508f, -0.002837f, 0.016113f, 0.004835f, 0.014441f, -0.005519f, -0.011380f, 0.007999f, 0.012347f, -0.006155f, -0.013831f, -0.015046f, -0.013244f, -0.006009f, -0.002682f, + 0.013761f, 0.000333f, 0.011959f, -0.001446f, -0.003969f, 0.011879f, -0.010389f, -0.020050f, -0.005345f, -0.012804f, -0.012063f, -0.022294f, 0.016617f, 0.014501f, 0.005954f, -0.034570f, 0.008119f, 0.007279f, -0.002593f, -0.001016f, -0.012064f, 0.016516f, 0.008454f, 0.006539f, 0.004036f, 0.015168f, -0.001323f, -0.001087f, 0.001118f, -0.000156f, 0.003523f, 0.001720f, 0.000068f, 0.004649f, -0.002802f, -0.000629f, -0.003579f, 0.001038f, 0.001202f, 0.005122f, -0.003585f, -0.000563f, -0.001410f, 0.003946f, -0.001830f, 0.001467f, 0.002334f, 0.003158f, -0.002742f, 0.007579f, -0.000021f, -0.000233f, -0.002793f, 0.002958f, -0.004751f, 0.001673f, 0.000194f, -0.006940f, -0.001629f, -0.001152f, -0.013783f, -0.000931f, 0.001074f, 0.010039f, -0.014505f, 0.000736f, -0.002224f, -0.006055f, -0.030131f, -0.003651f, 0.014254f, 0.011000f, 0.014606f, 0.001688f, -0.016181f, 0.042807f, 0.018034f, 0.029113f, 0.003069f, -0.012749f, -0.005057f, -0.004137f, -0.018136f, -0.001147f, -0.007095f, 0.009122f, 0.000089f, 0.000942f, -0.005781f, -0.007772f, -0.015324f, 0.005178f, 0.001561f, 0.000756f, 0.007978f, -0.000656f, + 0.003417f, -0.001533f, -0.013302f, -0.010368f, 0.008134f, 0.000049f, 0.019505f, -0.024579f, 0.019732f, 0.012070f, -0.008616f, -0.017770f, -0.027695f, 0.005873f, 0.021975f, -0.011211f, 0.021275f, -0.001661f, -0.000877f, 0.004879f, -0.006155f, -0.024635f, 0.003031f, 0.011655f, 0.005271f, -0.010696f, -0.002724f, -0.006707f, 0.005529f, 0.011957f, -0.000544f, 0.003060f, -0.001538f, 0.011514f, -0.005067f, -0.003919f, 0.007937f, -0.006797f, 0.018194f, -0.004828f, -0.009082f, 0.006743f, -0.016301f, -0.008352f, 0.000232f, 0.006499f, -0.007010f, 0.003061f, -0.002488f, 0.003624f, 0.000221f, 0.004304f, 0.003826f, -0.001451f, 0.002329f, -0.007759f, 0.004318f, -0.001051f, -0.010386f, -0.003640f, -0.002864f, -0.006311f, 0.000110f, 0.001836f, -0.004795f, -0.003508f, -0.000115f, -0.006649f, 0.000597f, 0.001706f, -0.001330f, -0.007038f, 0.000750f, -0.000105f, -0.005197f, 0.002192f, 0.004062f, -0.004328f, -0.000150f, 0.001266f, 0.000557f, 0.002051f, 0.006352f, 0.005171f, -0.005195f, -0.004281f, 0.004771f, -0.033133f, 0.023707f, 0.021374f, 0.025243f, -0.008160f, -0.022510f, 0.007851f, 0.009052f, -0.033715f, + -0.030607f, 0.029603f, 0.003245f, -0.014557f, 0.011229f, -0.021094f, -0.023910f, 0.003339f, 0.062288f, 0.028852f, 0.011563f, -0.016995f, 0.000281f, -0.006110f, 0.000492f, -0.007179f, -0.003462f, -0.007965f, 0.002244f, 0.017657f, 0.003518f, 0.021787f, -0.008660f, -0.007322f, 0.004004f, 0.015202f, -0.002920f, -0.002280f, -0.032569f, -0.001462f, -0.018343f, -0.001056f, 0.025254f, 0.017940f, -0.006677f, 0.017534f, 0.035044f, -0.016762f, 0.010122f, 0.028956f, -0.021320f, 0.030610f, -0.002558f, 0.012551f, -0.007276f, 0.001226f, -0.004148f, 0.004193f, 0.007112f, 0.030367f, -0.011665f, -0.003904f, 0.007913f, -0.014246f, 0.008948f, 0.004640f, -0.008165f, -0.013880f, 0.029978f, -0.002044f, -0.016463f, -0.005500f, 0.018590f, -0.007874f, 0.012619f, -0.000135f, 0.000908f, -0.019826f, -0.021532f, -0.010405f, -0.018366f, -0.016645f, -0.017994f, -0.001138f, -0.004288f, 0.008719f, -0.001130f, 0.001549f, -0.001641f, 0.010986f, 0.007014f, 0.000765f, -0.013640f, 0.000481f, -0.002553f, -0.010168f, -0.002899f, -0.005243f, 0.005332f, 0.002017f, -0.006934f, -0.002334f, -0.005317f, -0.004182f, -0.000489f, 0.003800f, + 0.003721f, 0.003888f, 0.006678f, -0.004109f, 0.000849f, 0.004188f, -0.002903f, -0.004001f, 0.004906f, -0.006907f, -0.002717f, -0.002122f, 0.003094f, 0.001324f, 0.004969f, 0.000868f, 0.000510f, -0.001951f, -0.004991f, 0.040415f, 0.007240f, 0.005727f, -0.021033f, -0.012167f, 0.001048f, 0.004676f, 0.008167f, 0.009396f, -0.040093f, 0.001833f, 0.002518f, 0.028975f, 0.004619f, 0.007391f, -0.002766f, 0.026363f, -0.043053f, 0.001351f, 0.022034f, -0.025609f, 0.006401f, 0.005057f, 0.020749f, 0.004113f, 0.002199f, -0.007016f, 0.000657f, -0.021980f, 0.007446f, -0.005463f, 0.003890f, 0.006023f, -0.003781f, -0.016661f, 0.006102f, -0.013143f, -0.022943f, 0.012986f, -0.012977f, 0.008557f, -0.021572f, -0.013553f, -0.002292f, -0.006646f, 0.005138f, -0.009120f, 0.023625f, -0.000229f, 0.022526f, -0.023747f, -0.020122f, -0.006406f, 0.000320f, -0.000349f, -0.007005f, 0.020332f, 0.016554f, 0.042355f, -0.006802f, 0.027112f, -0.015865f, -0.002663f, 0.008147f, -0.032056f, 0.036637f, -0.000926f, 0.022808f, -0.000845f, -0.032002f, -0.019228f, 0.013461f, -0.042763f, 0.022291f, 0.006214f, 0.032541f, 0.041085f, + 0.005332f, -0.030354f, -0.023013f, -0.009424f, 0.023364f, -0.002794f, -0.005663f, 0.001350f, -0.008569f, 0.001301f, -0.006272f, -0.009162f, -0.003188f, -0.014774f, -0.000729f, 0.000719f, -0.006880f, -0.006137f, -0.008396f, -0.005937f, -0.002880f, 0.003772f, 0.007136f, 0.002697f, -0.001184f, 0.006560f, -0.004472f, -0.002449f, 0.001521f, 0.003488f, 0.004167f, -0.004127f, 0.005273f, -0.005390f, -0.002545f, -0.007886f, -0.013842f, 0.008601f, 0.001486f, -0.007835f, -0.007924f, -0.001490f, -0.010987f, 0.001529f, 0.000117f, 0.008191f, 0.020519f, 0.031783f, 0.010877f, -0.013073f, 0.029979f, -0.032206f, -0.003511f, -0.009854f, 0.003843f, 0.025825f, -0.023459f, 0.058131f, 0.007548f, 0.014442f, -0.017263f, -0.023371f, 0.007945f, 0.000252f, 0.049179f, -0.007024f, -0.017244f, -0.028147f, -0.019165f, 0.013802f, 0.008666f, 0.008095f, -0.003715f, -0.027705f, -0.042962f, 0.003265f, -0.025960f, 0.034390f, 0.004328f, 0.027940f, -0.017380f, 0.011718f, -0.011292f, 0.014509f, 0.040120f, -0.006624f, -0.004407f, -0.006019f, 0.010370f, 0.013454f, 0.006745f, 0.003017f, 0.004019f, 0.017546f, 0.015580f, -0.008986f, + -0.013957f, -0.012368f, -0.013976f, 0.046115f, 0.018051f, -0.026937f, 0.020693f, -0.006072f, -0.022224f, -0.015787f, 0.008007f, 0.016928f, -0.031623f, -0.041032f, 0.004468f, -0.018281f, 0.053874f, 0.028129f, -0.009392f, -0.006061f, 0.011319f, 0.024433f, 0.006115f, -0.004050f, -0.007295f, -0.037190f, -0.001865f, -0.009042f, -0.040583f, 0.015416f, 0.025369f, -0.004047f, 0.012650f, 0.007156f, 0.025879f, -0.014191f, -0.003952f, 0.009432f, -0.004168f, -0.011634f, -0.013364f, -0.000256f, -0.008114f, -0.019641f, -0.004181f, -0.008994f, 0.008485f, -0.003727f, -0.011014f, 0.007669f, 0.002910f, 0.001201f, -0.006865f, 0.007654f, 0.001969f, -0.012282f, 0.004204f, 0.005043f, -0.005892f, -0.017095f, -0.008581f, -0.003032f, -0.001962f, -0.000094f, -0.006596f, -0.000740f, -0.004919f, 0.002510f, 0.001940f, -0.003254f, 0.000689f, -0.000133f, -0.005246f, -0.010537f, -0.001504f, 0.002416f, 0.006106f, 0.003270f, -0.008146f, -0.005102f, 0.001917f, -0.015130f, -0.025692f, 0.014841f, -0.008634f, 0.022417f, 0.009973f, -0.023859f, -0.010312f, -0.011969f, 0.005015f, -0.032210f, 0.021792f, 0.030899f, -0.012660f, 0.019356f, + -0.004820f, -0.008226f, 0.014767f, -0.022495f, 0.013971f, 0.025144f, 0.006714f, 0.043207f, 0.020732f, -0.017779f, 0.018234f, 0.008031f, 0.016007f, 0.000979f, 0.022986f, 0.020335f, 0.030842f, 0.011909f, -0.012285f, -0.014298f, -0.019346f, -0.001592f, 0.047923f, 0.001265f, 0.020178f, -0.030031f, 0.062652f, -0.018395f, -0.049396f, -0.023036f, 0.039494f, 0.003379f, -0.005694f, -0.005196f, -0.003080f, 0.029796f, -0.021883f, 0.017358f, -0.004589f, 0.037456f, 0.056667f, 0.029506f, 0.027228f, -0.019960f, 0.032146f, 0.019788f, 0.019019f, 0.022228f, 0.032143f, -0.006479f, -0.056631f, -0.035961f, -0.041194f, 0.010893f, 0.014421f, 0.011961f, -0.009706f, 0.019350f, 0.049651f, 0.003753f, 0.003681f, 0.012409f, -0.002985f, -0.043462f, -0.047223f, -0.015827f, 0.009155f, 0.005279f, -0.002195f, -0.026627f, 0.006652f, 0.001601f, 0.002028f, 0.014394f, -0.003306f, 0.009253f, 0.002886f, 0.017707f, -0.004578f, 0.011920f, -0.009406f, 0.002369f, 0.001639f, 0.020510f, 0.009098f, 0.020476f, 0.002086f, 0.010571f, -0.003804f, 0.002564f, 0.008465f, -0.005298f, -0.013333f, 0.003326f, -0.008026f, -0.014509f, + -0.011867f, -0.002929f, -0.003396f, 0.019996f, 0.003931f, 0.000255f, -0.006176f, 0.003388f, -0.000085f, -0.006790f, -0.008245f, -0.005583f, 0.004273f, 0.012899f, -0.001780f, 0.001484f, 0.001404f, 0.005969f, 0.003790f, -0.012911f, 0.008201f, 0.020786f, 0.024340f, 0.008841f, 0.011414f, 0.019011f, -0.014989f, 0.044171f, 0.017381f, 0.008562f, -0.012628f, -0.033832f, -0.013692f, 0.018500f, -0.001872f, -0.047957f, 0.064586f, -0.022664f, -0.012695f, 0.019940f, 0.000946f, -0.006422f, 0.004650f, -0.012518f, -0.015204f, -0.003285f, -0.035191f, 0.008721f, -0.037816f, 0.001070f, -0.029986f, -0.033703f, -0.006801f, -0.007153f, -0.007433f, -0.024651f, 0.010788f, 0.026432f, 0.007046f, 0.020243f, -0.035104f, 0.034597f, 0.062968f, 0.006540f, -0.025340f, 0.039380f, -0.032327f, -0.051135f, 0.085121f, -0.008721f, 0.006004f, -0.005914f, -0.038123f, 0.029394f, -0.034565f, 0.014957f, 0.051993f, -0.001028f, 0.071426f, -0.055762f, 0.053795f, 0.015702f, -0.035411f, -0.018523f, 0.006703f, -0.033976f, -0.016983f, 0.037872f, -0.037177f, 0.024666f, -0.025016f, 0.013691f, 0.039508f, -0.086834f, -0.038323f, 0.040001f, + -0.074581f, 0.026350f, 0.023064f, 0.042644f, 0.037653f, 0.016983f, -0.003080f, 0.025034f, 0.037347f, -0.040600f, 0.040528f, -0.000747f, 0.013991f, -0.002130f, 0.012682f, 0.003299f, -0.007768f, 0.002810f, -0.011834f, -0.003858f, 0.002995f, -0.002091f, -0.020482f, 0.012876f, -0.003656f, 0.016768f, 0.009983f, -0.014458f, 0.011376f, 0.013995f, 0.010112f, 0.004219f, 0.007224f, 0.004397f, 0.009220f, -0.028367f, 0.015869f, -0.003704f, -0.007785f, 0.020172f, -0.016232f, -0.013154f, 0.006744f, -0.016752f, -0.013698f, -0.016508f, 0.009135f, -0.025026f, -0.074692f, -0.019438f, 0.024470f, 0.057665f, -0.018372f, 0.029118f, 0.000791f, 0.013756f, 0.029861f, 0.019347f, 0.051720f, -0.013370f, 0.002179f, 0.014223f, -0.045851f, -0.029462f, -0.013688f, -0.014810f, 0.010516f, 0.000797f, 0.003855f, -0.023869f, -0.003984f, -0.031605f, -0.025746f, 0.012386f, 0.063869f, 0.036786f, -0.016833f, -0.020431f, 0.030423f, 0.036513f, -0.021766f, 0.009657f, 0.028045f, -0.011094f, 0.061088f, 0.020827f, 0.008945f, -0.047123f, 0.029059f, 0.006011f, 0.022891f, -0.004807f, 0.005883f, -0.007748f, -0.010196f, -0.074317f, + 0.019674f, 0.051457f, 0.025367f, 0.006920f, -0.001478f, 0.025970f, -0.041861f, -0.077202f, 0.005707f, 0.102455f, 0.024606f, 0.081290f, 0.076991f, 0.001071f, 0.006682f, -0.048945f, -0.043925f, -0.004634f, -0.037688f, 0.051342f, -0.111839f, 0.021176f, -0.041929f, -0.089230f, 0.019789f, 0.041850f, 0.089214f, 0.008065f, 0.004410f, -0.056824f, 0.018530f, 0.026938f, -0.039823f, -0.003649f, 0.002757f, 0.041779f, -0.011243f, -0.026542f, 0.063083f, 0.013440f, -0.022633f, -0.000735f, -0.036619f, 0.004903f, -0.034666f, -0.006900f, -0.001263f, -0.016823f, 0.005186f, -0.013571f, -0.014583f, -0.007838f, -0.000237f, -0.006809f, 0.011607f, 0.032829f, -0.001940f, 0.000486f, 0.012107f, -0.029517f, -0.018004f, -0.003452f, 0.008867f, 0.009483f, -0.025905f, -0.014484f, 0.020382f, 0.012200f, 0.007022f, 0.005063f, 0.021523f, -0.000696f, 0.000251f, 0.002354f, -0.014739f, 0.002775f, -0.019382f, 0.054456f, 0.095565f, 0.002332f, 0.026243f, 0.017052f, -0.049949f, -0.014361f, 0.050191f, 0.015619f, 0.022234f, -0.012688f, 0.014721f, 0.008383f, -0.017543f, 0.000650f, 0.026136f, 0.027368f, 0.033721f, -0.014956f, + -0.003941f, -0.074243f, -0.069339f, 0.009452f, -0.042802f, 0.001352f, 0.037471f, 0.008889f, 0.004621f, -0.013011f, -0.008126f, 0.023785f, 0.058540f, -0.042528f, -0.024159f, -0.005674f, -0.041026f, -0.003145f, -0.039534f, -0.012490f, -0.041981f, 0.037110f, -0.050911f, -0.004304f, 0.009381f, 0.024608f, 0.089525f, 0.118993f, 0.031036f, -0.031473f, -0.063376f, -0.005758f, -0.043291f, -0.017214f, -0.067416f, 0.009967f, 0.065371f, 0.047938f, 0.039307f, 0.004555f, 0.009669f, 0.066642f, 0.065058f, 0.047514f, -0.003709f, 0.029935f, 0.011306f, 0.014715f, -0.076703f, 0.023041f, 0.008710f, -0.017890f, 0.046569f, 0.062806f, -0.008552f, -0.001224f, -0.030720f, -0.131538f, -0.002342f, 0.038700f, -0.018886f, 0.090787f, 0.064808f, -0.030191f, 0.006216f, -0.033643f, 0.022825f, 0.006116f, -0.011987f, -0.020200f, -0.008945f, -0.002025f, 0.014330f, 0.017416f, 0.027108f, 0.000593f, -0.016001f, -0.035197f, 0.002239f, -0.016689f, 0.013577f, -0.015758f, -0.021160f, -0.005485f, -0.005340f, 0.015698f, 0.006849f, -0.006176f, 0.008553f, 0.004432f, 0.006832f, 0.001398f, -0.011936f, -0.019517f, -0.009594f, 0.007144f, + 0.016428f, -0.001569f, 0.013438f, -0.000328f, -0.019182f, -0.020343f, 0.005839f, -0.024859f, -0.013688f, -0.000107f, -0.010634f, -0.003185f, 0.007175f, 0.009963f, -0.008987f, -0.023210f, 0.059460f, 0.042429f, -0.028358f, 0.028739f, 0.044163f, 0.005003f, -0.055368f, -0.066053f, 0.061697f, 0.021029f, 0.014259f, 0.048610f, 0.001060f, -0.021138f, 0.052132f, 0.013767f, -0.039589f, -0.020054f, -0.014369f, 0.017628f, 0.001072f, -0.023668f, 0.009132f, -0.026185f, -0.002665f, -0.011798f, -0.012788f, 0.035560f, 0.066194f, -0.022516f, 0.013702f, 0.031246f, -0.015554f, -0.013291f, 0.012761f, 0.037747f, 0.012022f, -0.028910f, -0.036688f, -0.044062f, 0.023622f, 0.024901f, 0.060074f, -0.028438f, -0.027043f, 0.021159f, 0.035771f, 0.056092f, -0.001643f, -0.103761f, -0.022277f, 0.033527f, 0.033330f, 0.015081f, -0.020335f, -0.000719f, -0.041577f, 0.006296f, -0.018007f, 0.043212f, 0.061793f, -0.018648f, 0.001294f, -0.036179f, -0.039324f, -0.015105f, -0.079571f, -0.015951f, -0.040490f, 0.035300f, -0.032420f, 0.036616f, 0.045295f, -0.091963f, -0.007751f, -0.038887f, 0.039343f, -0.016176f, 0.013828f, -0.028580f, + 0.004600f, -0.024341f, 0.027077f, 0.030274f, 0.052134f, 0.050432f, 0.024895f, 0.048522f, 0.022429f, 0.002913f, 0.025574f, 0.016524f, -0.007316f, 0.021613f, -0.024061f, 0.011585f, -0.012345f, 0.010032f, -0.030311f, 0.017937f, 0.000066f, 0.014208f, -0.022347f, -0.012643f, 0.014359f, -0.005811f, -0.007555f, 0.026032f, -0.020591f, -0.004710f, 0.020981f, 0.010413f, -0.014265f, -0.004480f, 0.008485f, 0.048038f, 0.025692f, 0.020938f, 0.028200f, 0.001916f, 0.030664f, 0.010366f, 0.009290f, 0.016090f, -0.000122f, 0.025827f, 0.007017f, -0.044455f, -0.020919f, -0.011883f, -0.021844f, -0.030178f, -0.049907f, -0.011313f, -0.027764f, -0.050624f, -0.076489f, 0.037417f, 0.039608f, 0.023357f, -0.051109f, -0.069560f, -0.053413f, -0.030285f, 0.012541f, -0.002271f, -0.067748f, -0.040426f, -0.046425f, 0.065799f, 0.020484f, 0.028696f, -0.020680f, -0.037370f, 0.083376f, 0.020681f, 0.026020f, -0.015880f, 0.004959f, 0.024719f, -0.017027f, 0.019670f, -0.006116f, 0.039858f, 0.056199f, 0.002586f, -0.045299f, -0.036263f, 0.044529f, 0.030629f, 0.039013f, 0.011416f, 0.009817f, -0.019926f, -0.008765f, 0.006625f, + 0.027282f, 0.059032f, -0.000446f, -0.109560f, -0.101692f, 0.001696f, -0.024804f, 0.066110f, 0.067076f, -0.074297f, -0.050298f, -0.031078f, 0.092870f, 0.082956f, -0.044708f, 0.013512f, -0.058568f, -0.056209f, 0.034545f, -0.025670f, 0.000468f, -0.008327f, -0.040592f, 0.029447f, 0.029991f, 0.024141f, 0.094111f, -0.068479f, -0.018381f, -0.005968f, 0.024251f, 0.008077f, 0.038830f, -0.137078f, -0.079755f, 0.029246f, 0.043344f, 0.043099f, 0.012296f, -0.044897f, -0.046206f, 0.001339f, 0.027659f, 0.080045f, 0.019552f, -0.025883f, 0.008381f, -0.050878f, 0.032176f, 0.028415f, 0.001864f, 0.045144f, 0.095677f, 0.023550f, -0.069774f, -0.036069f, -0.004699f, 0.008727f, 0.046357f, 0.040753f, 0.019269f, -0.020384f, -0.008305f, -0.013803f, -0.016249f, 0.042252f, -0.004573f, 0.004583f, -0.016203f, 0.041032f, -0.018321f, -0.006943f, -0.000685f, 0.035753f, 0.015695f, 0.013275f, -0.006985f, -0.043062f, -0.015297f, 0.015170f, 0.035507f, 0.006967f, -0.048274f, -0.066695f, -0.055867f, -0.000384f, 0.008754f, 0.011434f, 0.007393f, 0.092063f, -0.061119f, 0.057441f, 0.057310f, 0.036584f, -0.133364f, -0.053590f, + 0.044801f, -0.036286f, 0.025967f, -0.009542f, -0.055328f, 0.035489f, 0.010794f, 0.010573f, -0.024393f, -0.088361f, -0.008262f, -0.002700f, 0.000452f, -0.012617f, -0.064257f, 0.048121f, -0.039662f, 0.082187f, -0.008558f, -0.007188f, 0.040157f, 0.029809f, -0.039177f, -0.003647f, -0.029626f, 0.043914f, 0.069298f, 0.052651f, -0.058226f, 0.013081f, -0.038923f, 0.035205f, -0.033792f, -0.013925f, 0.005897f, -0.002972f, 0.037724f, -0.034540f, -0.080891f, 0.020838f, -0.028850f, 0.030256f, 0.031725f, -0.102535f, -0.017269f, -0.019557f, 0.003875f, 0.113541f, -0.030480f, -0.082631f, -0.021823f, 0.072165f, 0.034783f, -0.044750f, -0.014551f, 0.044767f, -0.000051f, 0.055269f, -0.082994f, -0.043910f, 0.050164f, -0.052185f, -0.126610f, -0.037392f, -0.017139f, 0.144641f, -0.039324f, -0.074729f, 0.039899f, -0.086210f, 0.227572f, 0.021537f, -0.211166f, -0.056263f, -0.037175f, 0.149988f, 0.081336f, -0.094291f, -0.049632f, -0.001225f, 0.110987f, 0.088394f, -0.013645f, -0.069503f, 0.027378f, -0.023514f, 0.100111f, -0.009679f, -0.050077f, -0.041577f, 0.065628f, -0.052414f, 0.034073f, -0.100367f, -0.000319f, -0.003845f, + -0.005715f, -0.005893f, 0.021229f, -0.055565f, 0.053939f, 0.004465f, 0.039597f, 0.001594f, -0.063257f, -0.048690f, 0.036234f, 0.042720f, 0.067240f, 0.025052f, -0.006718f, -0.043816f, 0.005969f, 0.010903f, -0.011445f, 0.002873f, 0.044113f, 0.006848f, -0.001964f, -0.050123f, 0.009763f, 0.035605f, 0.013273f, 0.001468f, -0.014545f, -0.036048f, -0.122102f, 0.034254f, -0.001971f, 0.041739f, 0.100926f, 0.032384f, 0.013877f, -0.056874f, -0.023635f, -0.056839f, -0.068134f, -0.022782f, 0.013361f, 0.038959f, 0.051484f, -0.005744f, 0.029931f, 0.036324f, -0.031642f, -0.064058f, 0.033918f, 0.012227f, -0.052117f, -0.017676f, 0.049441f, -0.016812f, -0.005578f, 0.045300f, 0.025339f, 0.020151f, 0.006262f, 0.025762f, -0.024680f, -0.059508f, -0.025933f, 0.016985f, -0.024439f, -0.014049f, 0.021760f, 0.001482f, -0.041981f, 0.043729f, 0.009389f, -0.038817f, 0.004929f, -0.009356f, 0.037568f, 0.020957f, -0.015230f, 0.017686f, -0.023237f, -0.052171f, 0.006945f, 0.012716f, -0.004793f, 0.000138f, 0.010993f, -0.022784f, 0.007160f, -0.019508f, 0.011671f, 0.037246f, -0.003997f, 0.016287f, 0.017169f, -0.014386f, + 0.000884f, -0.035524f, 0.012113f, 0.020970f, -0.064619f, 0.037498f, -0.040320f, 0.012710f, 0.001824f, -0.000179f, 0.017748f, 0.007214f, 0.042101f, 0.007698f, 0.011871f, -0.006085f, 0.021516f, -0.022655f, -0.014967f, 0.005226f, 0.003563f, -0.019824f, 0.007092f, -0.001767f, -0.005820f, -0.011450f, 0.004036f, -0.002257f, 0.022755f, -0.005843f, 0.002664f, 0.016337f, -0.011527f, 0.011351f, -0.007127f, 0.003984f, -0.011538f, -0.010005f, -0.011525f, -0.003012f, -0.005224f, 0.008628f, 0.006082f, -0.026737f, -0.007389f, -0.007812f, 0.018537f, -0.011034f, 0.006878f, 0.003198f, -0.029872f, 0.009910f, 0.019243f, 0.001269f, -0.007352f, 0.003223f, -0.008853f, -0.004413f, 0.098837f, -0.003598f, -0.003289f, -0.027444f, -0.026994f, 0.020346f, -0.001200f, 0.017614f, 0.000303f, -0.009659f, -0.013070f, 0.006699f, -0.018293f, 0.018542f, -0.017229f, 0.027016f, -0.021871f, 0.015743f, -0.018516f, -0.004120f, -0.003005f, -0.017221f, -0.013192f, 0.003895f, -0.007801f, -0.005438f, -0.000160f, -0.012949f, 0.001685f, -0.002572f, 0.004100f, -0.003045f, 0.007524f, -0.025961f, 0.023619f, -0.008888f, -0.007778f, 0.017923f, + -0.014414f, 0.000960f, -0.017995f, -0.015738f, 0.011428f, 0.010092f, -0.012652f, -0.008161f, 0.005062f, -0.000817f, -0.022000f, 0.005624f, 0.003843f, -0.000021f, 0.014410f, -0.005357f, -0.006221f, -0.005931f, -0.015027f, -0.004088f, 0.015727f, -0.016752f, 0.004298f, -0.008126f, -0.002076f, 0.001066f, -0.005107f, 0.003686f, 0.000080f, 0.010999f, -0.016011f, -0.001390f, 0.010320f, -0.020665f, 0.012026f, -0.009313f, 0.000129f, 0.009432f, -0.004588f, -0.009421f, 0.004252f, -0.001677f, -0.002708f, -0.000706f, -0.006731f, -0.000177f, 0.006972f, -0.000465f, -0.003288f, 0.001212f, -0.005833f, 0.004020f, 0.002936f, 0.001708f, -0.004711f, -0.001419f, 0.006041f, -0.007740f, 0.007709f, -0.003544f, 0.003350f, 0.008570f, -0.010335f, 0.002457f, 0.000690f, -0.013040f, 0.002365f, -0.004162f, 0.005362f, -0.001859f, 0.000387f, 0.007885f, -0.005213f, 0.001506f, -0.008394f, 0.001431f, 0.001204f, -0.002105f, -0.002031f, -0.001019f, -0.003031f, 0.000581f, -0.001536f, 0.000332f, 0.005804f, -0.008508f, 0.003710f, -0.046413f, -0.078364f, 0.029057f, 0.250978f, 0.062778f, 0.138384f, -0.005476f, -0.134827f, -0.043825f, + -0.132679f, -0.113395f, -0.040105f, -0.027377f, -0.009303f, 0.075112f, 0.100916f, 0.133401f, 0.168544f, 0.072702f, -0.043234f, -0.078172f, -0.165638f, -0.157481f, -0.064250f, -0.052685f, -0.035148f, 0.067909f, 0.092635f, 0.055323f, 0.085876f, 0.102994f, 0.034790f, 0.028166f, 0.019173f, -0.053538f, -0.024686f, -0.038373f, -0.083472f, -0.046133f, -0.062049f, -0.091918f, -0.050072f, 0.011259f, 0.009719f, 0.051164f, 0.124291f, 0.084982f, 0.070711f, 0.068887f, 0.021121f, 0.004980f, -0.007195f, -0.035934f, -0.051219f, -0.064793f, -0.092575f, -0.081859f, -0.045828f, -0.014461f, -0.031355f, 0.025666f, 0.047795f, 0.040600f, 0.070134f, 0.078203f, 0.050159f, 0.045432f, 0.044394f, -0.007062f, -0.021979f, -0.011099f, -0.063905f, -0.052944f, -0.013657f, -0.052406f, -0.056083f, -0.035545f, -0.050464f, -0.024570f, 0.014221f, 0.032044f, 0.058026f, 0.093135f, 0.057675f, 0.053483f, 0.059150f, 0.021822f, -0.007227f, -0.010940f, -0.032026f, -0.052816f, -0.054892f, -0.052288f, -0.057399f, -0.039914f, -0.036797f, -0.030545f, -0.012735f, 0.014172f, 0.035167f, 0.054658f, 0.082481f, 0.086922f, 0.084661f, 0.071980f, + 0.022616f, -0.018928f, -0.038864f, -0.062364f, -0.082598f, -0.093195f, -0.093138f, -0.073719f, -0.041723f, -0.010056f, 0.025282f, 0.076193f, 0.084657f, 0.084896f, 0.088821f, 0.073496f, 0.038436f, 0.012143f, -0.021185f, -0.059601f, -0.083458f, -0.073571f, -0.068976f, -0.054290f, -0.025521f, 0.002077f, 0.019953f, 0.040828f, 0.046085f, 0.045542f, 0.035997f, 0.016269f, 0.007218f, 0.002760f, -0.007138f, -0.008029f, -0.008278f, -0.010653f, -0.013359f, -0.010319f, -0.014733f, -0.009967f, -0.008525f, -0.005920f, -0.007543f, -0.002851f, -0.001730f, 0.003087f, 0.003135f, 0.007069f, 0.005689f, 0.005383f, 0.000642f, 0.001581f, -0.000869f} + }, + { + {0.005807f, 0.005797f, -0.005219f, -0.000924f, 0.008310f, 0.002729f, -0.004297f, 0.000896f, -0.004747f, -0.004229f, -0.003398f, -0.007449f, -0.002585f, 0.004541f, -0.000364f, 0.002515f, -0.001253f, -0.002112f, -0.002062f, -0.000905f, 0.006263f, -0.003956f, 0.000394f, -0.000283f, 0.000277f, 0.004969f, -0.000160f, 0.003418f, 0.010898f, 0.008495f, 0.008547f, 0.004427f, 0.001943f, -0.001379f, -0.010067f, 0.004135f, -0.003754f, 0.006460f, 0.002297f, -0.003419f, 0.003046f, -0.004497f, -0.008725f, -0.002691f, -0.003369f, -0.008268f, 0.000358f, -0.001016f, -0.001176f, -0.003873f, 0.000533f, 0.008629f, 0.003833f, 0.005865f, -0.000085f, 0.003607f, -0.003366f, -0.000243f, 0.004520f, -0.003728f, 0.003030f, -0.004622f, -0.004912f, 0.000501f, 0.010166f, 0.006693f, 0.003908f, -0.001976f, 0.001706f, 0.001090f, 0.000596f, -0.001833f, -0.003893f, -0.005965f, -0.004318f, 0.000136f, -0.003696f, -0.001851f, -0.003980f, 0.001322f, 0.000616f, 0.002064f, -0.001168f, 0.001698f, 0.002408f, 0.001974f, 0.000266f, 0.001240f, -0.000908f, -0.000994f, -0.000024f, -0.002483f, 0.002625f, 0.002149f, -0.000243f, 0.002715f, + 0.000808f, 0.000547f, -0.001218f, -0.000772f, -0.001559f, 0.000522f, 0.000886f, -0.000028f, -0.000486f, 0.000938f, -0.000593f, -0.002304f, -0.000644f, -0.001542f, -0.000085f, 0.000452f, 0.000577f, -0.002413f, 0.000440f, 0.003725f, 0.001915f, -0.006435f, 0.015197f, -0.000330f, 0.000916f, -0.001612f, -0.008029f, 0.005930f, -0.004191f, -0.004015f, -0.009357f, -0.007212f, -0.003037f, 0.005801f, 0.008344f, -0.001697f, 0.004932f, -0.001929f, 0.009051f, 0.009393f, -0.018776f, 0.003428f, 0.000080f, -0.001848f, 0.006340f, 0.009978f, -0.003093f, -0.001467f, 0.000191f, -0.000626f, -0.004781f, 0.003914f, -0.004820f, -0.003812f, -0.000402f, 0.004991f, -0.002845f, -0.010570f, -0.004706f, -0.007191f, 0.000826f, 0.000622f, -0.009386f, -0.001130f, -0.004105f, 0.001926f, -0.000295f, -0.001434f, 0.002287f, -0.003144f, 0.003163f, -0.005045f, 0.004911f, 0.007191f, 0.011060f, 0.004577f, -0.004858f, 0.003946f, 0.004630f, -0.001766f, -0.012558f, 0.000793f, 0.006512f, -0.005065f, 0.003747f, -0.007299f, -0.000101f, -0.004669f, -0.012759f, -0.003911f, -0.006682f, 0.003199f, 0.004715f, -0.004330f, 0.002010f, -0.002054f, + 0.005992f, 0.000439f, 0.003501f, 0.005004f, -0.002169f, 0.002044f, 0.000999f, 0.002090f, 0.004315f, -0.001055f, 0.001445f, 0.005382f, 0.003060f, 0.000688f, 0.003214f, 0.000535f, 0.001377f, -0.000275f, -0.000096f, -0.002995f, 0.001547f, 0.001810f, 0.002435f, 0.001626f, 0.000529f, 0.000737f, 0.000054f, 0.000878f, -0.000413f, -0.000884f, -0.000257f, 0.001934f, 0.001653f, 0.000453f, 0.001478f, 0.000291f, 0.001713f, 0.001428f, 0.012423f, 0.003422f, -0.016925f, 0.006019f, 0.008656f, 0.003183f, -0.001487f, 0.004422f, -0.010643f, 0.001511f, 0.004688f, -0.002370f, 0.004532f, -0.000717f, 0.005526f, 0.001346f, -0.007194f, 0.004512f, 0.006531f, 0.006481f, -0.001908f, 0.003098f, 0.003517f, 0.002461f, -0.019165f, 0.002689f, -0.008172f, -0.002411f, -0.002735f, 0.004470f, 0.002045f, -0.015621f, -0.005653f, -0.003501f, -0.002993f, 0.006350f, -0.005845f, -0.010933f, 0.002669f, 0.005064f, 0.003129f, -0.010879f, -0.005143f, 0.003481f, -0.010296f, -0.000833f, -0.011374f, 0.001662f, 0.005534f, -0.005820f, -0.001800f, 0.006486f, 0.008237f, -0.019288f, -0.001457f, -0.005362f, 0.005809f, 0.002386f, + 0.000930f, 0.001662f, -0.005462f, 0.004905f, 0.004215f, -0.014981f, 0.011470f, -0.001549f, 0.002797f, -0.007648f, -0.003230f, -0.006470f, -0.000841f, 0.001676f, -0.006032f, -0.008330f, 0.007351f, -0.002691f, 0.003007f, -0.000422f, -0.001543f, 0.002133f, 0.002470f, -0.003046f, -0.007738f, 0.004278f, 0.003846f, 0.000979f, 0.001762f, -0.000252f, 0.000540f, 0.001275f, -0.000103f, 0.001270f, 0.000851f, -0.000184f, 0.002917f, 0.000411f, 0.002223f, 0.002685f, 0.000108f, 0.003790f, -0.000150f, 0.000731f, 0.000977f, 0.001691f, 0.001320f, 0.001879f, -0.002893f, 0.001278f, -0.001342f, 0.000560f, 0.001212f, 0.000909f, 0.002186f, -0.000785f, -0.000726f, -0.008125f, -0.007624f, -0.006341f, -0.004018f, 0.012630f, -0.004412f, 0.001716f, -0.010262f, 0.010877f, 0.000731f, -0.007385f, -0.001940f, 0.006298f, -0.013141f, 0.004453f, -0.003876f, 0.002954f, 0.002125f, -0.006026f, -0.004268f, -0.015642f, -0.004205f, -0.017616f, 0.002283f, 0.003960f, -0.001886f, -0.002403f, -0.001606f, 0.002650f, -0.006888f, -0.012560f, -0.005830f, -0.004626f, -0.001935f, 0.004600f, -0.002889f, 0.007464f, 0.003322f, 0.005718f, + -0.007777f, -0.000448f, -0.000383f, -0.006516f, 0.001809f, 0.005117f, -0.000507f, -0.003255f, -0.007624f, -0.007064f, 0.004752f, 0.007094f, -0.000229f, 0.014057f, 0.011159f, -0.010088f, -0.002564f, 0.000015f, -0.010633f, -0.012178f, 0.018389f, -0.000312f, 0.000506f, 0.005755f, -0.011685f, -0.003857f, -0.007570f, 0.018146f, 0.004907f, 0.000930f, -0.014459f, -0.011495f, 0.001544f, -0.004745f, 0.009384f, -0.004828f, -0.000103f, 0.002560f, -0.005675f, 0.002046f, 0.005664f, -0.008521f, 0.000094f, -0.013580f, 0.001481f, 0.005094f, -0.003919f, 0.001969f, 0.001630f, 0.006640f, -0.000954f, 0.001056f, -0.001314f, -0.000270f, 0.002880f, 0.002947f, 0.002765f, -0.002061f, 0.000884f, -0.000145f, 0.001241f, 0.000080f, 0.001216f, -0.001993f, 0.004282f, 0.000026f, 0.001228f, 0.000637f, 0.001352f, 0.000995f, 0.001237f, -0.001153f, -0.001111f, -0.000978f, 0.000944f, 0.002863f, 0.003385f, 0.000591f, 0.001535f, -0.002802f, -0.021213f, 0.010620f, 0.006019f, 0.010829f, -0.005806f, 0.005938f, 0.006211f, 0.011129f, 0.002642f, -0.021173f, 0.005297f, 0.000919f, 0.008426f, 0.015379f, 0.000816f, 0.006683f, + 0.005857f, -0.012677f, 0.004463f, 0.001181f, 0.001764f, -0.003441f, -0.001755f, 0.007877f, 0.005224f, 0.000326f, -0.007752f, -0.000088f, -0.003695f, -0.004011f, 0.012696f, 0.005868f, -0.000525f, -0.001694f, -0.015326f, -0.013148f, -0.015056f, 0.004013f, 0.004079f, -0.015609f, 0.001116f, 0.001062f, -0.015465f, 0.000977f, 0.002397f, -0.002065f, 0.017791f, -0.002189f, -0.008733f, -0.002196f, 0.010220f, -0.000842f, -0.015836f, 0.017218f, 0.008926f, -0.010951f, 0.008385f, 0.001671f, 0.001616f, -0.000283f, 0.000972f, -0.004253f, -0.007950f, -0.007528f, 0.013767f, -0.000913f, -0.004013f, -0.000639f, 0.009903f, -0.009168f, -0.016190f, 0.000581f, 0.003694f, 0.003038f, -0.014151f, -0.007331f, 0.005456f, -0.001273f, 0.007919f, 0.003017f, -0.002509f, -0.002366f, -0.002158f, -0.001125f, 0.000280f, 0.012578f, 0.007334f, 0.004548f, 0.004029f, 0.004862f, 0.007328f, -0.003499f, -0.001166f, -0.003967f, -0.001205f, 0.001394f, 0.000365f, -0.002196f, -0.003540f, 0.003697f, 0.000567f, 0.001667f, -0.000058f, -0.002262f, 0.000811f, 0.001953f, -0.004473f, -0.000761f, 0.003584f, 0.000774f, 0.000213f, -0.001645f, + -0.000492f, -0.001070f, -0.001942f, 0.000479f, 0.001817f, 0.001449f, -0.001310f, 0.001478f, 0.000128f, 0.006352f, 0.024526f, 0.007254f, 0.019677f, -0.021645f, 0.000863f, -0.010707f, 0.000377f, 0.007133f, 0.008303f, -0.011142f, 0.004882f, -0.006472f, -0.005660f, -0.007758f, -0.012518f, -0.001883f, -0.029527f, -0.000323f, 0.009792f, -0.001345f, -0.001982f, 0.003209f, -0.015478f, 0.005417f, -0.014760f, -0.004710f, 0.015260f, 0.003045f, 0.005286f, 0.000321f, 0.004511f, 0.012949f, 0.011780f, 0.022591f, 0.011784f, -0.017155f, -0.001399f, 0.019026f, -0.002642f, -0.013992f, -0.002094f, 0.001730f, -0.006348f, 0.012736f, 0.009495f, -0.011013f, -0.003178f, 0.012213f, 0.013068f, -0.004681f, -0.008260f, 0.020634f, -0.008490f, -0.027901f, -0.018801f, 0.006105f, -0.028001f, -0.000594f, -0.008362f, 0.000103f, -0.002573f, -0.007869f, 0.010529f, 0.002969f, -0.002713f, -0.009195f, 0.008047f, -0.005522f, 0.014893f, 0.010123f, -0.004031f, -0.009886f, 0.002147f, 0.003855f, 0.001414f, 0.000526f, 0.003545f, -0.002083f, -0.010896f, -0.003196f, 0.015246f, -0.001791f, -0.006156f, -0.001675f, -0.003164f, -0.007893f, + -0.007607f, -0.004265f, -0.003638f, 0.000875f, -0.000038f, 0.007594f, -0.000632f, -0.002776f, 0.001103f, 0.002699f, -0.001798f, 0.001565f, -0.002589f, 0.005155f, -0.000133f, 0.003156f, 0.000509f, -0.005011f, -0.000472f, -0.000567f, -0.005203f, -0.001439f, -0.003153f, 0.002360f, 0.000189f, -0.000832f, 0.001833f, 0.000783f, -0.000491f, 0.000910f, -0.005823f, 0.001249f, 0.001705f, -0.023892f, 0.011341f, -0.002103f, 0.006075f, 0.007924f, 0.012958f, 0.002904f, -0.011310f, 0.015436f, -0.005696f, 0.006874f, -0.006851f, 0.005729f, -0.000995f, -0.028066f, -0.005760f, -0.004797f, -0.003248f, 0.001928f, -0.006685f, -0.004629f, 0.003810f, 0.006167f, 0.002184f, 0.015171f, 0.007056f, -0.014652f, -0.001020f, 0.000039f, -0.008194f, 0.017453f, -0.010371f, -0.010078f, 0.018432f, 0.019355f, -0.002340f, -0.000219f, -0.011977f, 0.004352f, 0.002686f, -0.006273f, 0.003280f, 0.011991f, 0.007470f, 0.014418f, -0.003515f, -0.011308f, 0.007109f, 0.001690f, 0.003532f, -0.013480f, -0.006918f, -0.007917f, 0.003250f, 0.007727f, 0.002897f, 0.002073f, 0.013917f, 0.016602f, 0.002548f, -0.007881f, 0.009517f, 0.007744f, + -0.011628f, 0.001640f, 0.002100f, -0.001332f, 0.001437f, -0.000261f, 0.009979f, -0.001077f, -0.007669f, 0.003952f, 0.013132f, 0.005812f, 0.007739f, 0.016190f, -0.010966f, 0.001977f, -0.003686f, 0.015364f, 0.008866f, 0.016455f, -0.007851f, -0.002100f, 0.002804f, -0.005841f, 0.000924f, 0.001625f, -0.001798f, 0.000020f, 0.003880f, 0.004408f, -0.001583f, 0.002412f, 0.001777f, 0.005715f, 0.005103f, -0.000669f, -0.000358f, -0.002560f, 0.000798f, -0.002578f, 0.001431f, -0.004545f, 0.004581f, -0.000066f, -0.001679f, -0.000059f, -0.000312f, 0.000191f, -0.001536f, -0.003535f, 0.005091f, -0.000616f, 0.000903f, -0.005597f, -0.004531f, -0.001227f, 0.004895f, -0.000498f, -0.000442f, 0.000486f, -0.000483f, 0.010008f, -0.020765f, -0.012369f, 0.008211f, -0.004814f, -0.019398f, 0.009890f, -0.010166f, -0.008807f, 0.012458f, -0.003749f, -0.004170f, -0.003058f, 0.003188f, 0.009294f, 0.004770f, 0.005020f, 0.005084f, -0.007662f, -0.004642f, -0.001562f, 0.011221f, 0.005841f, -0.019822f, 0.006346f, 0.006137f, -0.008254f, 0.018583f, 0.017127f, 0.009159f, 0.000708f, -0.006795f, -0.004334f, 0.000968f, -0.005758f, + -0.006993f, -0.011416f, 0.001634f, -0.013040f, 0.009470f, 0.003702f, 0.000085f, 0.002123f, 0.004983f, 0.004390f, 0.010140f, 0.015925f, -0.006048f, -0.025092f, -0.004416f, -0.017070f, 0.005871f, 0.002429f, -0.022798f, 0.008319f, -0.009590f, 0.028651f, 0.009457f, -0.017947f, -0.000651f, 0.018253f, 0.009450f, -0.014847f, -0.008915f, 0.019095f, 0.010894f, -0.013146f, 0.016220f, -0.013493f, -0.017921f, 0.002837f, -0.027117f, 0.016416f, 0.017547f, -0.003961f, -0.016338f, -0.002850f, 0.006370f, 0.003390f, 0.002693f, 0.001720f, 0.012563f, -0.017629f, 0.005662f, 0.019804f, 0.000292f, 0.000763f, -0.017415f, 0.008731f, 0.004815f, -0.015957f, -0.004044f, -0.008013f, -0.003879f, 0.000720f, 0.004976f, 0.004106f, 0.000525f, -0.004739f, 0.000447f, -0.005083f, 0.002098f, 0.003173f, -0.000706f, -0.002410f, -0.001776f, 0.003255f, 0.000955f, -0.000919f, -0.002757f, -0.005069f, -0.000641f, -0.004946f, 0.010013f, -0.009336f, -0.000081f, -0.000900f, 0.003803f, 0.002705f, -0.005494f, 0.001760f, -0.001744f, 0.008665f, -0.001138f, 0.002526f, 0.000189f, -0.004815f, -0.000552f, 0.005492f, -0.000059f, -0.016245f, + -0.011999f, 0.000384f, -0.019506f, 0.000058f, -0.045863f, -0.014436f, -0.005273f, -0.025062f, -0.008777f, -0.005249f, -0.010989f, -0.008495f, 0.005982f, -0.012081f, -0.022935f, 0.006107f, 0.014394f, -0.023428f, -0.006476f, 0.007219f, 0.011761f, 0.020208f, 0.012903f, 0.011903f, 0.013060f, 0.004720f, 0.023146f, -0.013775f, -0.005894f, 0.004899f, -0.011452f, 0.004356f, 0.006561f, 0.012114f, 0.001594f, 0.019810f, 0.004164f, 0.004882f, 0.013681f, -0.006048f, -0.011729f, 0.000207f, -0.017982f, -0.011504f, -0.020756f, -0.000874f, -0.000954f, -0.027294f, 0.009841f, -0.012369f, 0.005586f, -0.025781f, 0.003086f, -0.019513f, 0.029106f, 0.001455f, -0.025943f, 0.031124f, 0.038135f, 0.010698f, -0.012783f, -0.009482f, 0.009895f, -0.003333f, -0.001260f, 0.011254f, -0.018213f, 0.011851f, -0.018811f, 0.009944f, -0.007502f, -0.010615f, 0.004480f, 0.009986f, -0.005442f, -0.000599f, 0.011734f, 0.003056f, -0.005804f, 0.006585f, -0.002913f, -0.010788f, 0.001402f, 0.010028f, -0.001947f, -0.004001f, 0.003980f, 0.002896f, 0.008175f, 0.001611f, 0.000263f, 0.003500f, -0.002767f, 0.005681f, 0.001424f, 0.004699f, + 0.001616f, 0.003726f, 0.003017f, 0.003033f, 0.002443f, -0.003540f, 0.003921f, -0.004751f, -0.004401f, 0.000392f, 0.002563f, 0.000813f, 0.001270f, 0.002797f, 0.001846f, 0.000182f, -0.001557f, -0.003585f, 0.000013f, -0.003768f, 0.009921f, -0.004982f, 0.008937f, 0.013486f, 0.001986f, 0.012446f, -0.007038f, 0.019455f, -0.015129f, -0.014092f, -0.037074f, -0.008243f, -0.019225f, -0.045235f, 0.011346f, -0.026088f, -0.015842f, -0.021037f, 0.005770f, -0.040754f, 0.010894f, 0.003304f, -0.007829f, -0.000932f, -0.011723f, -0.004167f, 0.009763f, -0.013913f, -0.009903f, 0.000503f, 0.007440f, -0.012177f, -0.000949f, 0.013894f, -0.022363f, -0.005213f, 0.013039f, -0.012452f, -0.000766f, 0.000073f, -0.003543f, 0.018851f, -0.016531f, 0.011177f, -0.007524f, 0.015325f, 0.016209f, -0.016546f, -0.022042f, 0.020574f, -0.002234f, 0.004446f, 0.005386f, 0.001808f, -0.004734f, 0.011566f, -0.006297f, -0.025533f, 0.006647f, 0.005145f, -0.022082f, -0.002514f, -0.007905f, 0.013224f, 0.016154f, 0.007952f, 0.002724f, -0.006403f, -0.015687f, 0.016006f, 0.009928f, 0.014311f, -0.000985f, -0.022659f, -0.005285f, -0.003458f, + -0.009866f, -0.005622f, -0.002632f, 0.006486f, 0.010081f, -0.008781f, -0.007415f, -0.022514f, -0.010657f, 0.004290f, 0.009283f, 0.002459f, -0.001891f, 0.010246f, 0.009718f, 0.005760f, 0.011930f, -0.003705f, 0.009362f, 0.004193f, 0.006413f, 0.001033f, 0.000108f, -0.006240f, -0.004701f, -0.001180f, 0.003043f, -0.001518f, -0.005232f, -0.006651f, -0.000172f, -0.001132f, 0.001438f, -0.004538f, 0.001116f, -0.005403f, 0.001742f, 0.008916f, 0.002093f, -0.005179f, -0.005205f, 0.011360f, 0.006569f, -0.001455f, -0.000609f, -0.014471f, -0.001549f, -0.000213f, -0.012128f, 0.000269f, -0.004864f, -0.003831f, 0.003000f, 0.003757f, 0.001017f, -0.001446f, -0.011147f, 0.055062f, 0.031795f, 0.002119f, -0.017479f, -0.041694f, -0.005084f, 0.019387f, -0.009131f, -0.016845f, -0.031262f, -0.001827f, -0.006748f, 0.001010f, -0.010726f, 0.010026f, -0.000177f, 0.027217f, 0.010789f, -0.011470f, -0.000812f, -0.004950f, 0.002060f, -0.005707f, 0.005635f, 0.016842f, -0.019826f, 0.003762f, -0.011951f, 0.007803f, -0.008516f, -0.014524f, -0.028249f, -0.002355f, 0.016155f, 0.005345f, -0.003538f, 0.005890f, -0.002104f, 0.015344f, + 0.024381f, -0.008585f, -0.005569f, -0.028330f, -0.030643f, 0.008395f, 0.004536f, -0.013030f, -0.011212f, -0.025519f, -0.017498f, 0.010004f, -0.003309f, -0.000029f, 0.001287f, -0.002047f, 0.011619f, 0.006575f, -0.020954f, 0.000800f, -0.019097f, -0.001738f, -0.010305f, -0.006006f, 0.020266f, 0.041716f, 0.068841f, 0.002517f, 0.022141f, -0.020851f, -0.026464f, -0.037257f, -0.001964f, -0.000205f, 0.007534f, 0.007801f, -0.005088f, -0.047076f, 0.019507f, -0.008067f, -0.006490f, 0.002880f, -0.012325f, 0.001341f, -0.006702f, -0.019225f, 0.000240f, -0.007741f, 0.000181f, 0.001834f, 0.000734f, 0.013519f, 0.001975f, 0.001474f, -0.000731f, 0.000487f, -0.000568f, 0.005763f, 0.012820f, 0.003716f, -0.000452f, 0.002667f, 0.011625f, 0.000244f, 0.000150f, 0.004301f, -0.003845f, 0.001371f, -0.010621f, 0.003563f, 0.005567f, -0.010059f, 0.010222f, 0.000546f, 0.000896f, -0.003027f, -0.011105f, -0.003650f, 0.004990f, -0.000016f, -0.001117f, -0.002842f, 0.000400f, 0.020157f, 0.033546f, -0.016580f, 0.000042f, 0.006474f, -0.027399f, 0.000276f, -0.017698f, -0.017108f, 0.025769f, -0.007569f, -0.006497f, -0.013841f, + 0.029596f, 0.026050f, -0.000031f, 0.042784f, 0.004787f, 0.013376f, 0.009387f, -0.011902f, -0.013992f, -0.022240f, -0.011750f, 0.005233f, 0.000180f, 0.019183f, 0.001463f, -0.002073f, -0.003521f, 0.013560f, -0.019604f, -0.047814f, -0.016801f, 0.014124f, 0.004391f, -0.003913f, -0.014285f, 0.000866f, -0.023047f, -0.003442f, -0.021001f, -0.001434f, -0.002662f, -0.014758f, 0.014123f, 0.007049f, 0.026859f, -0.022203f, 0.041628f, 0.011200f, -0.008146f, -0.014733f, -0.007613f, 0.006578f, 0.023995f, -0.007384f, 0.013711f, -0.021225f, 0.017120f, -0.019274f, -0.021749f, 0.021416f, -0.031087f, 0.020359f, 0.017050f, 0.033035f, -0.033670f, 0.025566f, -0.003236f, 0.022793f, 0.008850f, -0.035326f, -0.006231f, -0.008293f, 0.009805f, -0.018741f, 0.055582f, -0.002729f, -0.019692f, 0.007899f, 0.025659f, 0.017472f, 0.011990f, 0.013284f, -0.001810f, 0.006332f, -0.002332f, -0.007367f, -0.004750f, 0.001967f, -0.000305f, -0.007308f, 0.002041f, -0.002143f, -0.011345f, -0.002339f, -0.004372f, 0.004753f, 0.005888f, 0.003248f, -0.001623f, 0.010990f, -0.001850f, 0.006086f, 0.002364f, 0.007779f, 0.002852f, -0.003918f, + -0.004960f, 0.001341f, -0.000657f, 0.005367f, -0.002247f, 0.000523f, 0.004472f, -0.002744f, 0.007713f, -0.003673f, -0.004381f, 0.002187f, -0.003307f, 0.008149f, 0.002861f, -0.002372f, 0.002396f, -0.023260f, -0.031201f, -0.063899f, -0.019626f, -0.037524f, 0.010446f, -0.001715f, -0.012797f, -0.018589f, -0.017706f, -0.015997f, -0.017345f, -0.016985f, 0.001758f, -0.013851f, -0.002517f, -0.030094f, -0.046179f, 0.056521f, -0.017651f, 0.030615f, -0.005890f, 0.007885f, 0.009726f, 0.016489f, 0.010855f, -0.002916f, -0.000969f, -0.024447f, -0.005566f, -0.005846f, -0.016464f, -0.025642f, 0.009950f, -0.002932f, 0.036139f, -0.025106f, 0.000610f, 0.050015f, -0.012124f, -0.041653f, -0.013480f, 0.001595f, -0.018918f, 0.029235f, 0.013398f, -0.016150f, 0.011817f, 0.015673f, -0.009771f, -0.000390f, 0.007839f, 0.019514f, -0.000805f, -0.019366f, -0.019067f, 0.023364f, 0.016681f, -0.012399f, -0.026800f, 0.016966f, 0.019645f, -0.017698f, -0.024129f, 0.016758f, -0.030578f, 0.058247f, 0.012455f, -0.004864f, 0.002282f, 0.014171f, 0.003120f, -0.010376f, 0.000842f, 0.004086f, 0.020846f, -0.013857f, 0.004087f, -0.041570f, + -0.037451f, -0.004292f, 0.002115f, -0.004195f, -0.018240f, 0.013070f, 0.030715f, -0.000988f, 0.007780f, -0.003026f, 0.006465f, 0.009190f, 0.010996f, -0.012058f, 0.013244f, -0.006320f, -0.003690f, 0.008719f, 0.016329f, -0.005007f, -0.016667f, 0.004563f, -0.001669f, 0.002607f, -0.001652f, -0.009018f, -0.002614f, -0.009320f, -0.005832f, -0.011469f, 0.011484f, 0.011753f, -0.007309f, -0.000185f, 0.014162f, 0.004371f, -0.006235f, 0.002823f, 0.017776f, 0.011622f, 0.012769f, 0.012858f, 0.011349f, 0.004094f, 0.016270f, 0.008490f, 0.006672f, 0.005911f, 0.015394f, -0.024052f, 0.000052f, 0.008893f, 0.006840f, -0.015763f, 0.037980f, 0.026779f, 0.054671f, 0.030193f, 0.020359f, 0.007911f, -0.047815f, -0.003949f, 0.006521f, -0.028196f, -0.007500f, 0.054056f, 0.004158f, -0.031387f, -0.030918f, 0.027981f, -0.042606f, -0.011103f, 0.001881f, 0.011363f, 0.004905f, -0.008186f, 0.013846f, -0.019306f, -0.000025f, -0.003964f, -0.012115f, -0.002747f, -0.008432f, -0.027910f, 0.014669f, -0.024207f, 0.014150f, 0.012512f, 0.016469f, 0.002882f, 0.010916f, -0.010196f, 0.044992f, 0.005915f, -0.047778f, -0.042141f, + 0.003856f, 0.018714f, 0.036569f, -0.012209f, -0.028702f, -0.012879f, -0.003803f, 0.003958f, 0.021474f, 0.004496f, -0.016943f, 0.049297f, -0.060666f, -0.010295f, 0.011483f, -0.042407f, -0.021863f, -0.011315f, 0.006234f, -0.068600f, -0.032389f, 0.048745f, -0.018571f, 0.014067f, -0.015928f, -0.055456f, -0.020913f, 0.026340f, -0.008173f, 0.010104f, 0.016894f, 0.034657f, -0.016671f, 0.003579f, -0.010473f, 0.021588f, 0.009870f, 0.009130f, 0.001343f, -0.001163f, 0.000511f, 0.018749f, 0.009703f, 0.010961f, -0.003034f, -0.000744f, 0.006963f, -0.013096f, -0.011799f, 0.004757f, 0.021948f, 0.010012f, 0.008455f, -0.021878f, 0.012554f, 0.039949f, -0.000331f, -0.000803f, -0.015612f, 0.010545f, 0.001644f, -0.009764f, -0.012720f, 0.001295f, 0.011771f, 0.013591f, 0.009942f, -0.012895f, 0.008193f, -0.008801f, 0.009317f, -0.016519f, -0.009074f, -0.003709f, -0.008701f, -0.010935f, -0.003435f, -0.026661f, -0.025118f, 0.003577f, -0.002062f, -0.004636f, 0.008573f, -0.000850f, -0.002708f, -0.000328f, 0.008479f, 0.028358f, -0.012507f, -0.087647f, -0.023466f, 0.005507f, 0.023962f, 0.024669f, 0.021179f, 0.022593f, + 0.038996f, 0.071988f, -0.041622f, 0.030460f, -0.011067f, -0.000776f, -0.011216f, -0.058168f, -0.044556f, -0.007845f, -0.003348f, 0.013090f, 0.022314f, 0.030590f, -0.010160f, -0.000520f, -0.016187f, 0.000600f, -0.003460f, 0.000168f, 0.030369f, 0.017074f, 0.009681f, 0.024335f, 0.027595f, -0.049133f, 0.023909f, -0.028369f, -0.037246f, -0.010375f, 0.022940f, 0.007232f, -0.025373f, 0.008591f, 0.002327f, 0.018100f, -0.002353f, -0.047760f, -0.035189f, -0.039540f, -0.040442f, 0.005619f, 0.032276f, -0.005771f, 0.118692f, -0.077652f, -0.059485f, 0.036319f, -0.011175f, -0.023576f, -0.008724f, -0.006181f, 0.000652f, -0.072753f, 0.007059f, -0.005043f, 0.009394f, 0.056196f, -0.004557f, 0.019839f, 0.020951f, 0.026936f, 0.091195f, -0.033836f, 0.115487f, 0.032563f, -0.003799f, 0.015537f, 0.006024f, -0.047464f, -0.042927f, -0.000525f, -0.011017f, 0.006200f, 0.017301f, 0.014506f, -0.008917f, -0.040673f, -0.034376f, 0.013732f, -0.023411f, 0.015049f, 0.015515f, 0.036477f, 0.034489f, 0.032488f, 0.005581f, 0.011503f, -0.001183f, -0.001320f, 0.023058f, -0.003652f, -0.002802f, 0.007891f, -0.035113f, -0.007895f, + 0.013795f, 0.000274f, -0.004211f, 0.022223f, 0.007560f, -0.031720f, 0.021348f, -0.017600f, -0.025746f, -0.013632f, -0.008498f, 0.006534f, 0.009647f, 0.011230f, -0.014110f, 0.016090f, 0.005869f, 0.010481f, 0.003651f, 0.013699f, -0.006296f, 0.008434f, -0.021522f, -0.003951f, -0.052482f, 0.019124f, 0.083798f, 0.002460f, 0.087448f, 0.046268f, -0.005458f, -0.033781f, 0.098631f, 0.014876f, -0.016819f, 0.012826f, -0.022707f, -0.006589f, -0.003603f, -0.006033f, 0.012239f, 0.027611f, 0.018958f, 0.003673f, 0.012415f, -0.019808f, -0.019462f, 0.006021f, -0.006145f, 0.032505f, 0.034920f, 0.022443f, -0.009376f, 0.002241f, -0.043160f, -0.026862f, -0.008302f, -0.029383f, -0.046683f, -0.027577f, 0.021694f, -0.026901f, -0.082086f, -0.037779f, 0.024554f, -0.033009f, -0.023710f, 0.001169f, -0.006440f, 0.038437f, 0.056074f, 0.074270f, -0.039794f, 0.021115f, -0.001034f, 0.002438f, -0.016466f, -0.049126f, -0.098524f, -0.064547f, 0.033521f, -0.065407f, -0.034817f, 0.017842f, 0.032710f, -0.024229f, 0.036947f, 0.107489f, 0.022095f, 0.020827f, -0.081794f, -0.108958f, -0.024145f, -0.033923f, -0.058690f, -0.016603f, + -0.049127f, 0.034667f, 0.019175f, 0.097435f, 0.039608f, -0.011295f, -0.020278f, -0.033859f, 0.022470f, 0.044268f, 0.087698f, 0.061730f, -0.043071f, -0.089206f, -0.044147f, -0.028477f, -0.053377f, -0.009874f, 0.044383f, 0.021538f, 0.055031f, 0.002350f, 0.038941f, 0.015717f, -0.013502f, -0.016714f, -0.019756f, 0.010696f, 0.023528f, 0.005953f, 0.030793f, 0.039159f, 0.023043f, 0.027893f, 0.012197f, 0.042287f, 0.036551f, 0.001437f, -0.001503f, 0.018473f, 0.041324f, -0.004250f, -0.011999f, -0.006436f, 0.035117f, 0.010885f, 0.000936f, -0.010815f, 0.021647f, 0.017067f, -0.006310f, 0.014133f, 0.016944f, 0.008639f, -0.004723f, 0.003740f, 0.011867f, 0.001398f, -0.021354f, 0.044901f, 0.089044f, -0.047530f, 0.067413f, 0.054111f, -0.009119f, -0.014091f, -0.030710f, 0.009006f, 0.060069f, 0.044571f, 0.070508f, -0.031127f, -0.014426f, -0.014775f, -0.004833f, -0.019391f, 0.018101f, -0.023746f, 0.051597f, 0.021769f, -0.086029f, -0.037297f, 0.000231f, 0.012479f, 0.036426f, -0.018031f, -0.032866f, 0.009218f, 0.009583f, -0.014142f, -0.016487f, 0.009212f, -0.024823f, -0.037668f, -0.017413f, 0.080207f, + 0.032886f, 0.013246f, -0.041401f, -0.013634f, -0.035204f, 0.019878f, 0.038608f, 0.012750f, 0.002107f, 0.022691f, -0.014190f, 0.051039f, 0.028734f, 0.002656f, 0.016613f, -0.002284f, 0.101468f, 0.020669f, -0.043864f, 0.016201f, 0.017167f, 0.009772f, 0.022634f, 0.000968f, -0.041870f, 0.048752f, 0.010395f, 0.008060f, 0.018847f, 0.008585f, -0.000486f, -0.030810f, 0.034721f, 0.039668f, 0.020304f, 0.114519f, 0.081284f, -0.044430f, -0.089050f, -0.062401f, -0.006472f, 0.007395f, -0.009427f, -0.075722f, -0.037758f, -0.027054f, -0.031380f, -0.031226f, 0.027700f, 0.021674f, -0.008239f, 0.004410f, -0.007063f, -0.042511f, 0.011899f, -0.008033f, -0.002591f, -0.043541f, -0.041916f, -0.007712f, 0.017435f, 0.020481f, 0.002333f, 0.021857f, 0.009228f, 0.027632f, 0.003837f, 0.005391f, -0.047440f, -0.028242f, 0.019958f, 0.005349f, -0.013239f, 0.024659f, 0.010384f, 0.004309f, -0.022858f, 0.021905f, 0.030116f, 0.021181f, 0.021849f, 0.027649f, -0.006184f, 0.030654f, 0.061455f, 0.048470f, 0.010928f, 0.006715f, -0.007876f, -0.010720f, -0.031605f, -0.039951f, 0.010509f, -0.004392f, -0.016650f, -0.104061f, + -0.013662f, 0.025814f, 0.029099f, -0.023974f, 0.036382f, 0.011077f, -0.015045f, -0.039213f, 0.008352f, -0.009846f, -0.058220f, -0.018909f, -0.020900f, 0.003758f, -0.080079f, -0.062928f, -0.011025f, 0.038602f, -0.005673f, -0.012709f, -0.048638f, 0.000300f, 0.040868f, 0.001273f, -0.029098f, -0.017239f, -0.006635f, -0.016939f, 0.009784f, 0.012966f, -0.041317f, -0.046295f, 0.006601f, -0.002349f, 0.009295f, 0.074325f, -0.046462f, -0.005565f, -0.003439f, -0.074014f, -0.022631f, -0.054379f, -0.008974f, -0.005320f, 0.051232f, 0.057578f, 0.070886f, 0.019670f, 0.011487f, -0.027960f, -0.063222f, 0.001710f, 0.024768f, -0.022531f, 0.087141f, 0.204501f, 0.196513f, 0.027967f, -0.126916f, -0.116692f, -0.046175f, -0.073687f, 0.241166f, 0.148831f, 0.093239f, 0.121386f, -0.002750f, -0.065621f, -0.173162f, -0.111279f, -0.043603f, -0.010058f, 0.068619f, 0.139659f, 0.124273f, -0.015696f, -0.104286f, -0.063477f, -0.094540f, -0.074473f, 0.012173f, 0.100915f, 0.147433f, 0.056669f, -0.008996f, 0.007481f, -0.057886f, -0.068152f, -0.067944f, 0.022593f, 0.009446f, 0.016685f, 0.058560f, 0.031051f, -0.007106f, -0.038961f, + -0.034178f, -0.022591f, -0.053420f, -0.011170f, 0.022007f, -0.020215f, 0.000230f, -0.007875f, 0.035159f, 0.026644f, -0.049802f, -0.030938f, -0.099460f, -0.079746f, -0.071464f, 0.044314f, 0.078323f, 0.029622f, 0.019374f, -0.029496f, -0.052177f, -0.154784f, -0.115266f, -0.069081f, 0.011973f, 0.042173f, 0.026180f, 0.005758f, -0.057916f, -0.047946f, -0.090946f, -0.149369f, -0.059793f, 0.016702f, 0.042263f, 0.075564f, 0.034005f, -0.000630f, -0.043149f, -0.016018f, -0.029062f, 0.053703f, -0.052531f, 0.060576f, 0.012454f, 0.006053f, -0.096439f, -0.032152f, 0.086181f, -0.057866f, 0.024413f, -0.000597f, -0.018434f, 0.025664f, 0.010689f, 0.044888f, 0.072895f, -0.042865f, -0.055531f, 0.014158f, -0.033445f, 0.044492f, -0.058053f, -0.031633f, -0.036360f, 0.003763f, -0.009148f, -0.034803f, 0.016448f, 0.068032f, -0.052888f, -0.060160f, -0.043072f, -0.014386f, -0.011966f, 0.091546f, 0.006542f, -0.003267f, -0.089735f, -0.023882f, 0.009401f, 0.076838f, 0.034475f, -0.014203f, -0.129771f, -0.093974f, 0.089503f, 0.096238f, 0.094306f, -0.043216f, -0.217083f, -0.043222f, 0.098473f, 0.081365f, 0.013020f, -0.025399f, + 0.014364f, -0.088107f, -0.051932f, 0.029624f, -0.025434f, 0.026814f, -0.015683f, 0.003572f, 0.092635f, -0.068578f, -0.035695f, 0.076474f, 0.060584f, 0.115394f, 0.049283f, -0.154025f, 0.048558f, 0.166432f, 0.036112f, 0.084296f, 0.021568f, -0.046679f, -0.001055f, 0.105934f, 0.073123f, 0.140680f, -0.184454f, 0.025344f, -0.000881f, -0.020869f, 0.073588f, 0.001003f, -0.095703f, 0.008220f, -0.003844f, -0.020060f, 0.014547f, -0.000770f, -0.058399f, 0.051035f, -0.023895f, -0.001848f, 0.003012f, -0.014382f, 0.002981f, 0.007256f, -0.015894f, -0.021862f, -0.031606f, -0.047543f, 0.046677f, -0.002878f, 0.017479f, 0.038774f, -0.044440f, 0.020760f, -0.001169f, -0.082362f, 0.000864f, 0.024619f, 0.088666f, -0.024119f, -0.121841f, -0.015387f, 0.059086f, 0.014663f, 0.052346f, -0.041544f, -0.033370f, -0.045696f, 0.021381f, -0.009078f, 0.032433f, -0.048357f, 0.024421f, 0.010596f, 0.015217f, -0.053754f, 0.006538f, 0.009675f, 0.038265f, -0.016345f, 0.009191f, -0.033477f, 0.013202f, -0.020714f, 0.033285f, -0.007579f, 0.027064f, -0.009956f, 0.012317f, -0.108557f, 0.012267f, 0.019414f, 0.010347f, 0.107031f, + 0.018028f, -0.008034f, -0.068334f, -0.011683f, -0.006727f, -0.016012f, -0.000687f, -0.012935f, 0.027378f, 0.012778f, -0.020151f, -0.003453f, 0.042494f, 0.000131f, -0.002401f, 0.004514f, -0.010650f, -0.018244f, 0.023840f, 0.021086f, 0.015994f, -0.026576f, 0.013957f, 0.039761f, 0.015581f, -0.002286f, 0.025635f, -0.004672f, -0.030448f, 0.008046f, 0.007699f, -0.024518f, -0.026660f, 0.026541f, 0.025832f, -0.025520f, 0.016336f, 0.015786f, -0.000242f, -0.009298f, 0.000173f, 0.020177f, -0.001132f, -0.022544f, 0.011714f, 0.013745f, -0.041884f, 0.010702f, 0.030941f, 0.010122f, -0.027238f, 0.004235f, 0.019197f, -0.035273f, 0.009563f, 0.016520f, 0.006960f, -0.009180f, -0.033643f, 0.039574f, -0.042862f, -0.003792f, 0.041213f, 0.000662f, -0.007128f, 0.000900f, -0.038768f, 0.017142f, -0.000589f, 0.022125f, 0.040983f, -0.018565f, -0.002970f, -0.023709f, 0.031340f, -0.006583f, -0.003524f, 0.032139f, -0.042004f, -0.018475f, 0.023290f, 0.019007f, 0.008327f, -0.034152f, 0.011782f, -0.007517f, -0.002166f, 0.016356f, 0.012424f, 0.002329f, -0.008712f, -0.004387f, 0.001564f, 0.009247f, -0.029824f, 0.021697f, + 0.004410f, -0.004159f, 0.008392f, -0.003924f, 0.018833f, -0.028052f, -0.005101f, 0.000561f, 0.001629f, 0.002780f, 0.012955f, 0.008572f, -0.047634f, 0.025161f, -0.005106f, -0.005554f, -0.002001f, 0.009671f, 0.013001f, -0.011818f, -0.004782f, 0.022135f, -0.018971f, -0.002451f, -0.014517f, 0.010516f, 0.100308f, 0.008798f, -0.012242f, -0.033545f, -0.022295f, 0.011752f, -0.014950f, 0.012936f, -0.019954f, -0.001589f, 0.015893f, -0.008992f, 0.007472f, 0.007319f, -0.027809f, 0.007678f, -0.009110f, -0.006059f, -0.022920f, 0.006463f, -0.006494f, -0.014459f, -0.006743f, 0.011070f, -0.010007f, -0.009911f, 0.014137f, -0.015714f, 0.007947f, 0.013440f, -0.027865f, 0.027457f, -0.006959f, -0.032783f, 0.017388f, 0.017293f, -0.015290f, 0.005306f, 0.009914f, -0.013854f, -0.012406f, 0.000074f, 0.001845f, 0.008918f, -0.004511f, -0.001698f, -0.013793f, 0.012636f, -0.010806f, -0.003506f, 0.015869f, -0.019187f, 0.005527f, -0.003497f, 0.000049f, -0.009047f, -0.012370f, -0.005061f, 0.021576f, -0.014778f, -0.005622f, 0.003463f, 0.004585f, 0.000595f, -0.013077f, 0.009931f, -0.005861f, -0.011315f, -0.000322f, -0.020720f, + 0.030254f, -0.013391f, 0.006132f, 0.006653f, -0.006221f, 0.010467f, -0.017994f, -0.014703f, 0.018424f, -0.009074f, -0.012480f, 0.012315f, -0.000819f, 0.003419f, -0.008315f, 0.002173f, -0.001834f, 0.005620f, -0.006630f, -0.005216f, 0.006993f, -0.004076f, -0.004828f, -0.001322f, 0.004421f, -0.002890f, -0.000390f, -0.002349f, 0.001190f, 0.004182f, -0.005882f, -0.005959f, 0.017348f, -0.005118f, -0.006181f, 0.005415f, -0.001965f, 0.005034f, -0.013879f, 0.000927f, -0.002286f, -0.000433f, -0.003655f, 0.016247f, 0.000247f, -0.014298f, 0.004720f, 0.001582f, -0.000577f, 0.000126f, 0.006364f, -0.004076f, -0.004068f, -0.001807f, -0.003662f, -0.001853f, 0.001844f, -0.004463f, -0.000052f, 0.001357f, -0.000562f, -0.049806f, -0.081434f, 0.037239f, 0.280845f, 0.043089f, 0.140272f, -0.032898f, -0.142824f, -0.051826f, -0.139194f, -0.091551f, -0.029166f, -0.015251f, 0.006527f, 0.082689f, 0.099247f, 0.137978f, 0.136877f, 0.043573f, -0.054248f, -0.087598f, -0.160905f, -0.123142f, -0.064903f, -0.025197f, -0.016543f, 0.049690f, 0.083233f, 0.064430f, 0.087702f, 0.085127f, 0.031264f, 0.027617f, 0.010310f, -0.062242f, + -0.023234f, -0.053513f, -0.092779f, -0.055997f, -0.054244f, -0.080315f, -0.017207f, 0.037577f, 0.028435f, 0.081986f, 0.107310f, 0.055944f, 0.071445f, 0.053872f, -0.007670f, -0.002317f, -0.005149f, -0.057749f, -0.071270f, -0.063433f, -0.095694f, -0.081394f, -0.028903f, -0.004758f, 0.011442f, 0.066343f, 0.060924f, 0.058859f, 0.073992f, 0.055363f, 0.018900f, 0.034995f, 0.019054f, -0.021551f, -0.010408f, -0.039858f, -0.084042f, -0.050448f, -0.047744f, -0.066071f, -0.031977f, -0.021163f, -0.037293f, 0.031435f, 0.059294f, 0.068638f, 0.109326f, 0.103157f, 0.043397f, 0.025620f, -0.001582f, -0.037376f, -0.044525f, -0.045765f, -0.066801f, -0.061028f, -0.056203f, -0.051378f, -0.032268f, -0.012750f, -0.000261f, 0.025027f, 0.058500f, 0.073120f, 0.067834f, 0.082050f, 0.056653f, 0.027545f, 0.011456f, -0.009529f, -0.042283f, -0.047557f, -0.066486f, -0.086510f, -0.087402f, -0.069301f, -0.058082f, -0.008827f, 0.034403f, 0.077399f, 0.103558f, 0.112295f, 0.086529f, 0.056491f, 0.024812f, -0.006801f, -0.043729f, -0.063753f, -0.086364f, -0.085523f, -0.061462f, -0.040211f, -0.012518f, 0.015438f, 0.030545f, 0.040811f, + 0.050824f, 0.044042f, 0.027208f, 0.023202f, 0.007909f, -0.000687f, -0.008576f, -0.010723f, -0.014199f, -0.013619f, -0.019867f, -0.016029f, -0.012979f, -0.010594f, -0.010968f, -0.007149f, -0.007377f, -0.001911f, 0.002202f, 0.009753f, 0.011182f, 0.015755f, 0.015405f, 0.014618f, 0.004749f, 0.001465f, -0.002053f, 0.000335f, -0.001275f}, + {-0.002126f, 0.011493f, -0.006458f, 0.001924f, -0.009600f, 0.002688f, 0.001081f, 0.014649f, -0.008772f, 0.000029f, -0.004614f, 0.007342f, 0.007498f, -0.004782f, -0.000909f, -0.004110f, -0.002356f, -0.004804f, -0.005980f, 0.004414f, 0.001445f, -0.003911f, 0.008180f, 0.007447f, 0.012729f, -0.000376f, 0.004823f, 0.002532f, -0.000209f, -0.011497f, 0.002995f, 0.004791f, -0.004535f, 0.002878f, -0.003342f, -0.003896f, -0.006306f, 0.003280f, 0.008128f, 0.000845f, 0.009484f, -0.003863f, -0.000801f, 0.009565f, 0.005008f, 0.000780f, -0.000111f, 0.009087f, 0.013646f, -0.010131f, 0.002281f, -0.003491f, -0.001563f, -0.015774f, -0.005594f, 0.006395f, -0.004894f, 0.004436f, 0.002053f, -0.002304f, -0.003819f, 0.002250f, -0.001300f, 0.004941f, 0.002683f, 0.002312f, 0.002534f, -0.008177f, 0.000324f, -0.003921f, 0.005056f, 0.008382f, 0.005880f, -0.001170f, 0.009074f, 0.000081f, 0.003859f, -0.001178f, -0.001995f, 0.000509f, 0.004561f, 0.005261f, -0.001693f, -0.003548f, -0.007358f, -0.000925f, -0.003234f, -0.003464f, -0.001947f, -0.002942f, -0.002104f, -0.003469f, -0.001812f, -0.000055f, -0.000025f, 0.000114f, + 0.002933f, -0.001980f, 0.001545f, -0.000692f, -0.001393f, 0.000117f, 0.001357f, 0.000527f, 0.001086f, 0.000041f, -0.000952f, 0.000060f, 0.001387f, 0.000494f, -0.001979f, -0.001512f, -0.000051f, 0.000066f, 0.000840f, 0.000167f, 0.001519f, -0.001961f, 0.006842f, -0.008387f, -0.008773f, 0.000332f, -0.011815f, 0.002169f, -0.003720f, 0.005742f, -0.003165f, -0.009372f, 0.001066f, 0.009188f, -0.001404f, 0.000317f, 0.012793f, 0.016080f, -0.006939f, -0.007378f, -0.002097f, -0.011953f, 0.005107f, 0.001092f, 0.002980f, -0.004203f, 0.006382f, -0.008328f, -0.001517f, 0.005704f, -0.004687f, -0.001708f, 0.000874f, 0.010362f, 0.000667f, 0.007498f, -0.009881f, 0.009709f, -0.001058f, 0.001405f, 0.006285f, -0.005422f, 0.005244f, -0.002461f, -0.002509f, 0.004518f, 0.005960f, -0.001008f, 0.003409f, -0.013104f, 0.007926f, 0.007694f, -0.013892f, -0.012227f, -0.003454f, -0.010140f, -0.002842f, 0.003870f, 0.002523f, 0.003695f, 0.000213f, -0.003378f, 0.008549f, -0.002861f, 0.000313f, -0.003415f, 0.002014f, -0.005174f, 0.007274f, 0.001786f, -0.005597f, -0.003126f, -0.002216f, -0.003241f, -0.002871f, 0.007370f, + 0.009652f, -0.000456f, -0.001968f, 0.000379f, 0.003091f, -0.002004f, 0.006743f, 0.003833f, -0.002756f, -0.000514f, -0.001722f, 0.002936f, -0.002827f, -0.000075f, -0.000746f, 0.000452f, 0.001068f, -0.000161f, -0.000829f, 0.001834f, -0.001416f, -0.000465f, 0.000379f, 0.001226f, 0.000096f, -0.002442f, -0.001690f, 0.000479f, -0.001613f, -0.001345f, 0.001618f, -0.000851f, -0.002993f, -0.001920f, -0.002408f, -0.000632f, 0.000381f, 0.002886f, 0.020666f, 0.003948f, -0.007642f, 0.009581f, 0.001220f, -0.006505f, 0.018877f, -0.012667f, -0.018145f, -0.010634f, -0.011002f, -0.003704f, 0.005369f, 0.006622f, -0.006271f, 0.009530f, -0.011957f, -0.006520f, -0.001446f, 0.003964f, 0.002983f, -0.003643f, -0.004699f, 0.010662f, 0.002053f, -0.000727f, -0.005977f, 0.007959f, -0.005821f, -0.001347f, -0.000012f, -0.000675f, -0.000836f, 0.003099f, 0.001656f, -0.001642f, 0.006646f, -0.003134f, 0.004052f, -0.000286f, -0.010841f, -0.004254f, -0.004330f, 0.011529f, -0.006391f, -0.007772f, -0.014079f, -0.016451f, -0.003006f, 0.000837f, -0.006569f, 0.012484f, 0.001686f, 0.006706f, -0.005042f, 0.010806f, 0.004609f, -0.006266f, + 0.017426f, -0.007896f, -0.008437f, 0.001349f, 0.010923f, 0.016012f, 0.011339f, 0.003754f, -0.005577f, -0.012602f, 0.005021f, -0.000155f, 0.012419f, 0.004994f, -0.003549f, -0.000430f, 0.006333f, 0.005087f, 0.000093f, -0.001187f, 0.000522f, -0.002481f, -0.005231f, -0.000495f, 0.001647f, 0.001296f, 0.004522f, -0.000161f, 0.002742f, -0.000960f, 0.002164f, -0.000551f, 0.000413f, -0.000466f, -0.003061f, 0.000287f, -0.000558f, -0.003926f, 0.003154f, -0.000725f, 0.001932f, -0.001067f, -0.002110f, 0.000292f, 0.000375f, -0.000153f, -0.001380f, 0.001454f, 0.000584f, -0.001038f, -0.000317f, -0.003021f, 0.000392f, -0.001705f, 0.001523f, -0.000568f, 0.003266f, -0.001476f, -0.019517f, 0.003033f, -0.007068f, 0.004512f, 0.001348f, 0.014030f, -0.018048f, -0.010351f, -0.013233f, 0.007090f, 0.005960f, 0.008515f, -0.009423f, 0.003239f, -0.002759f, 0.001184f, -0.014707f, -0.012615f, -0.009182f, -0.009175f, 0.014974f, -0.006029f, -0.001730f, -0.000292f, 0.005146f, -0.002398f, -0.015628f, 0.006595f, -0.006176f, -0.002072f, 0.007329f, 0.005434f, 0.008404f, 0.000517f, 0.004527f, -0.011017f, -0.004476f, 0.009841f, + 0.016450f, 0.009590f, -0.000639f, -0.012529f, 0.008993f, -0.004051f, -0.010729f, 0.014906f, 0.004508f, 0.005116f, -0.009106f, -0.005372f, 0.005201f, -0.003394f, -0.005034f, 0.007859f, -0.006126f, 0.002724f, 0.000475f, -0.010418f, -0.002123f, -0.006899f, 0.011013f, 0.005551f, -0.001431f, 0.001851f, -0.004939f, 0.006461f, 0.001172f, -0.000198f, 0.002010f, -0.012464f, -0.006399f, 0.007016f, 0.003480f, -0.002043f, -0.001516f, -0.008865f, 0.014609f, 0.017960f, 0.010015f, -0.008249f, 0.007460f, 0.001260f, 0.006381f, -0.002750f, 0.005261f, -0.003960f, 0.003438f, 0.006557f, 0.003631f, 0.003140f, 0.002476f, 0.000119f, -0.002121f, -0.000747f, 0.006528f, 0.000327f, 0.000518f, -0.002426f, -0.000372f, 0.001342f, 0.003961f, -0.000492f, 0.004639f, 0.000740f, 0.000206f, -0.000176f, 0.003782f, 0.004532f, -0.001894f, -0.000875f, -0.000422f, 0.000700f, 0.003334f, -0.000192f, 0.000964f, 0.000238f, 0.000866f, -0.001635f, -0.029517f, 0.009848f, 0.001498f, 0.007342f, 0.007951f, -0.005764f, -0.020875f, 0.016088f, 0.006835f, 0.015830f, -0.002910f, 0.008392f, -0.000164f, -0.005697f, -0.000391f, -0.014755f, + 0.018056f, 0.004123f, 0.001712f, -0.009293f, -0.005338f, -0.006294f, 0.005395f, -0.008287f, 0.013829f, 0.000608f, 0.004762f, 0.007704f, 0.004259f, -0.000887f, 0.004467f, 0.004267f, -0.003229f, 0.003591f, -0.015372f, 0.003998f, 0.007011f, 0.007173f, 0.013809f, 0.004795f, -0.009218f, 0.004623f, -0.004643f, 0.009391f, 0.001824f, 0.006834f, 0.010515f, 0.001723f, -0.002295f, 0.008238f, -0.005662f, -0.008951f, -0.003302f, 0.005747f, 0.014573f, -0.003453f, 0.000926f, 0.000261f, 0.001752f, 0.002861f, 0.006113f, 0.002073f, -0.003820f, -0.000687f, -0.005156f, 0.003752f, 0.001222f, -0.009231f, -0.008114f, 0.003244f, 0.005140f, 0.005141f, 0.009166f, -0.014097f, -0.007569f, -0.010276f, 0.012108f, -0.005332f, -0.007486f, 0.003919f, -0.006898f, -0.010048f, -0.003611f, 0.000281f, 0.010780f, -0.003803f, 0.003502f, -0.004283f, -0.002489f, -0.000625f, 0.003304f, 0.001424f, -0.001921f, -0.001633f, 0.002093f, 0.005344f, 0.001841f, 0.003081f, -0.001451f, -0.001016f, 0.003660f, -0.000144f, 0.000285f, 0.001362f, -0.002489f, 0.004774f, -0.001452f, -0.000333f, -0.002193f, -0.006088f, -0.000903f, -0.001341f, + -0.000407f, -0.000068f, -0.002243f, 0.000240f, 0.005502f, -0.001362f, -0.000478f, -0.001041f, -0.001967f, 0.007283f, 0.029978f, 0.015906f, 0.014243f, 0.020767f, 0.005652f, 0.003794f, -0.012700f, -0.000416f, -0.023751f, -0.004279f, 0.009052f, 0.006569f, 0.004225f, 0.005496f, 0.006542f, -0.005127f, -0.003470f, 0.013619f, 0.012284f, 0.010536f, -0.000793f, 0.001479f, -0.016959f, -0.014694f, -0.005558f, 0.010740f, 0.003483f, -0.002228f, 0.005841f, -0.009882f, 0.000944f, -0.005098f, 0.011822f, 0.009279f, 0.020757f, -0.002059f, 0.007837f, 0.006522f, -0.003329f, -0.010880f, 0.019530f, -0.011350f, -0.002565f, 0.008840f, 0.000434f, 0.005025f, 0.014084f, -0.004494f, 0.005260f, -0.013608f, -0.029079f, -0.016134f, -0.009641f, -0.003907f, 0.001360f, -0.001161f, -0.007489f, -0.015636f, -0.003246f, -0.011227f, 0.003461f, -0.000259f, 0.001399f, -0.017633f, -0.008015f, 0.011433f, 0.003961f, -0.000686f, -0.019535f, -0.017688f, 0.010542f, 0.001894f, 0.006423f, -0.012959f, -0.010329f, 0.000697f, -0.005263f, -0.011055f, -0.007846f, 0.006214f, -0.002385f, 0.002864f, 0.000832f, 0.007771f, 0.005706f, 0.002670f, + -0.003937f, 0.002105f, -0.000693f, -0.004704f, -0.004633f, 0.004475f, -0.001899f, 0.001329f, -0.002992f, -0.004539f, -0.000780f, -0.000357f, 0.004050f, -0.000440f, -0.003920f, 0.001074f, 0.001525f, 0.004476f, 0.000888f, 0.001089f, -0.001878f, 0.005602f, -0.002111f, 0.006377f, -0.003496f, 0.004735f, -0.004161f, 0.000748f, 0.002484f, 0.000239f, -0.000293f, 0.001043f, -0.000946f, -0.001660f, -0.015158f, 0.011469f, -0.006737f, -0.000569f, -0.039466f, -0.009331f, -0.014584f, -0.009662f, 0.001615f, 0.013022f, -0.002584f, 0.017222f, 0.009139f, -0.001031f, -0.016965f, -0.007042f, 0.025277f, 0.004212f, -0.015109f, -0.011066f, -0.004980f, 0.011831f, -0.009221f, 0.000127f, 0.008161f, 0.012873f, 0.014556f, -0.015959f, 0.010744f, 0.001438f, 0.003050f, 0.004539f, 0.005907f, 0.005112f, 0.014594f, 0.000385f, 0.004440f, -0.012794f, 0.017883f, -0.008996f, -0.004197f, 0.002985f, -0.014823f, 0.018333f, -0.002894f, -0.035889f, -0.011848f, -0.028821f, 0.001772f, -0.000441f, -0.008692f, 0.039035f, -0.006821f, -0.019361f, -0.006550f, -0.004779f, 0.017959f, -0.002483f, 0.008573f, 0.010499f, -0.007317f, 0.013378f, + 0.018509f, -0.009425f, 0.007053f, -0.016468f, 0.008030f, -0.005922f, -0.004636f, 0.018968f, -0.006942f, -0.001842f, -0.008434f, 0.000481f, 0.000334f, 0.007222f, 0.010735f, 0.011343f, -0.003020f, -0.003246f, 0.000459f, 0.014700f, 0.006992f, 0.007633f, 0.000306f, -0.012040f, 0.004840f, -0.005856f, -0.006530f, -0.003610f, -0.000108f, -0.000351f, 0.000793f, 0.002659f, 0.002819f, -0.000719f, 0.008012f, 0.001285f, 0.003510f, 0.001382f, 0.001596f, -0.002246f, 0.002135f, 0.000803f, -0.002350f, -0.003509f, -0.002260f, -0.006029f, -0.004695f, 0.004147f, 0.003361f, -0.005102f, 0.001410f, -0.000278f, 0.001454f, 0.005761f, 0.001246f, -0.002251f, 0.000650f, 0.001861f, 0.000153f, -0.004653f, 0.002089f, 0.017942f, -0.025054f, 0.005003f, 0.005128f, -0.007937f, 0.003370f, 0.018882f, 0.020247f, 0.007506f, 0.007246f, 0.009653f, -0.015654f, -0.002727f, -0.016714f, -0.000354f, 0.010691f, 0.006761f, -0.003512f, -0.013231f, -0.004276f, 0.008938f, -0.017325f, 0.000588f, -0.001226f, 0.007999f, 0.016523f, 0.001562f, -0.008885f, -0.006782f, 0.017681f, -0.011355f, -0.005466f, 0.010168f, -0.006309f, -0.020884f, + -0.007547f, 0.004754f, 0.003554f, -0.008349f, 0.001978f, 0.010881f, 0.007532f, 0.010496f, -0.001207f, 0.007915f, 0.015043f, -0.006614f, 0.007510f, 0.006463f, -0.010236f, 0.022284f, -0.021378f, 0.012776f, 0.005657f, -0.029751f, 0.028523f, -0.018418f, 0.004088f, -0.003277f, 0.022774f, -0.009634f, -0.016070f, -0.003413f, 0.000189f, 0.004141f, 0.017512f, -0.014824f, -0.000678f, 0.001082f, 0.001075f, -0.002648f, 0.005225f, -0.012047f, -0.001714f, -0.008583f, -0.016014f, -0.017781f, 0.009658f, 0.007808f, 0.007486f, 0.000207f, 0.011339f, -0.005163f, -0.012963f, 0.003428f, -0.023007f, -0.019202f, -0.003553f, 0.005685f, -0.000127f, -0.003514f, -0.002909f, 0.002817f, -0.012559f, -0.004159f, -0.002587f, -0.001992f, 0.005940f, -0.000542f, 0.001045f, 0.000553f, -0.004072f, 0.002158f, -0.004585f, 0.000438f, 0.002301f, -0.004964f, -0.000998f, 0.004381f, -0.003257f, 0.000129f, -0.002260f, -0.000084f, 0.001666f, 0.000269f, -0.006847f, -0.000970f, -0.000009f, -0.000214f, -0.001112f, -0.004101f, -0.007049f, -0.001568f, -0.000361f, -0.000837f, 0.005874f, 0.004454f, -0.019965f, 0.015827f, -0.045750f, 0.025045f, + -0.018213f, -0.012517f, -0.022371f, 0.002452f, -0.002693f, 0.003867f, 0.015959f, -0.013490f, -0.005172f, 0.012650f, 0.011614f, -0.003915f, 0.004510f, -0.006265f, -0.020972f, -0.002125f, 0.005263f, -0.010879f, 0.016895f, 0.002701f, -0.001987f, -0.010206f, -0.009901f, 0.002128f, 0.026041f, 0.000903f, -0.003674f, 0.006935f, -0.022535f, -0.004102f, 0.008217f, -0.015480f, 0.021880f, 0.013682f, -0.000797f, -0.006934f, -0.007345f, -0.008673f, -0.014983f, -0.018742f, 0.015549f, 0.000913f, 0.027630f, 0.002268f, -0.001440f, -0.012665f, 0.002294f, -0.005112f, 0.006203f, -0.000631f, -0.017419f, -0.013867f, -0.017750f, -0.030146f, -0.004164f, 0.026113f, -0.025205f, -0.001797f, -0.026392f, 0.003969f, 0.007439f, 0.005892f, 0.018842f, -0.002316f, -0.027130f, 0.019231f, -0.001880f, -0.013378f, -0.010943f, -0.023695f, -0.008022f, -0.018075f, 0.009786f, -0.027625f, -0.004556f, 0.010524f, -0.000200f, 0.001847f, 0.013108f, 0.006434f, 0.015742f, -0.000172f, -0.008501f, -0.003598f, -0.005821f, -0.000525f, 0.005820f, -0.001838f, 0.001031f, 0.000566f, 0.000644f, -0.004802f, -0.006653f, 0.003974f, -0.004654f, 0.001807f, + 0.000860f, -0.001182f, 0.002105f, 0.000471f, 0.000896f, 0.009223f, 0.001732f, -0.000786f, 0.001825f, 0.002761f, 0.002121f, -0.004986f, -0.000691f, -0.010244f, 0.003792f, 0.004955f, 0.007877f, 0.002591f, 0.002737f, -0.000386f, -0.005033f, 0.002818f, -0.000187f, 0.019590f, -0.007126f, 0.017414f, -0.016986f, -0.009103f, 0.012023f, 0.003774f, -0.022945f, 0.001438f, 0.030022f, -0.034544f, 0.002116f, 0.016067f, 0.038850f, -0.016620f, -0.009777f, -0.004289f, 0.030107f, 0.029435f, -0.031067f, -0.001501f, -0.023844f, -0.011496f, 0.015684f, 0.015648f, 0.020628f, 0.011629f, -0.003977f, 0.014407f, -0.017754f, -0.009654f, -0.001691f, -0.002770f, -0.025739f, 0.002266f, -0.000487f, 0.034167f, -0.005181f, 0.016832f, 0.004175f, 0.009974f, 0.022999f, -0.013868f, -0.006070f, -0.033774f, 0.023370f, -0.029765f, -0.005180f, 0.006831f, -0.003914f, -0.017190f, -0.004207f, 0.004883f, -0.012117f, 0.003354f, -0.001887f, -0.002599f, -0.037837f, -0.026874f, 0.001992f, -0.019481f, -0.026531f, 0.004926f, -0.024519f, 0.007860f, 0.016149f, -0.014452f, 0.027654f, 0.005800f, 0.017792f, 0.018981f, 0.004987f, -0.014041f, + -0.016555f, -0.020726f, 0.010790f, -0.021505f, 0.013080f, 0.015601f, 0.021602f, 0.003830f, -0.015167f, -0.009787f, 0.000558f, 0.002122f, -0.028364f, -0.000656f, -0.018319f, -0.003091f, -0.005084f, 0.001201f, -0.013372f, 0.001828f, -0.002951f, -0.000142f, -0.008630f, -0.006343f, 0.002249f, 0.014278f, 0.001655f, -0.001300f, 0.002088f, -0.001964f, -0.005107f, -0.005118f, -0.005536f, -0.002439f, -0.006597f, 0.007406f, 0.005539f, -0.000435f, -0.005422f, 0.008791f, 0.013244f, -0.002832f, -0.002079f, -0.003014f, -0.001140f, -0.000363f, 0.003417f, -0.004881f, 0.005400f, 0.004900f, 0.003521f, -0.004638f, -0.000490f, 0.002805f, 0.004034f, 0.009085f, -0.018281f, 0.047302f, 0.019829f, 0.008155f, 0.024440f, -0.009370f, 0.005203f, -0.025208f, -0.032321f, 0.020372f, 0.041728f, 0.012357f, -0.000119f, -0.041200f, 0.049751f, 0.007145f, 0.006192f, 0.007091f, 0.001917f, 0.008947f, 0.002911f, -0.007151f, -0.000232f, 0.012511f, -0.007627f, 0.015731f, 0.003101f, -0.012444f, -0.017148f, -0.004733f, 0.015804f, -0.004340f, 0.005206f, -0.007144f, -0.006245f, 0.000238f, 0.044639f, 0.007185f, 0.006515f, 0.005996f, + 0.003828f, 0.026690f, -0.009889f, 0.007664f, -0.017199f, 0.031806f, 0.044398f, 0.011536f, -0.002495f, -0.015800f, 0.046387f, 0.021756f, 0.000739f, -0.017943f, 0.006830f, -0.010769f, -0.001609f, -0.020581f, -0.007677f, -0.013737f, -0.018812f, 0.030482f, -0.009101f, 0.022462f, 0.004759f, -0.017532f, -0.000217f, -0.037508f, 0.035689f, -0.002590f, -0.017014f, -0.013324f, -0.021697f, -0.026788f, -0.014615f, 0.041481f, -0.012897f, 0.014943f, 0.018876f, -0.016765f, -0.015923f, -0.029929f, 0.004540f, 0.020180f, 0.006954f, 0.019297f, -0.004425f, -0.003809f, 0.000889f, 0.005490f, -0.008211f, 0.002313f, -0.014888f, 0.004853f, -0.000678f, 0.016934f, 0.011952f, -0.009141f, 0.000933f, -0.000489f, 0.010078f, -0.003408f, -0.013403f, 0.002990f, -0.000414f, -0.001073f, 0.004986f, 0.000941f, -0.002102f, -0.006704f, -0.007524f, -0.001428f, -0.001799f, 0.007985f, -0.000308f, 0.008010f, -0.010968f, 0.002674f, 0.008265f, -0.015526f, -0.011340f, 0.004121f, -0.004949f, 0.011678f, 0.014023f, -0.010442f, -0.011100f, 0.044099f, 0.043231f, 0.053406f, 0.032136f, 0.010606f, -0.013585f, -0.014099f, 0.007987f, 0.015516f, + 0.018977f, -0.028377f, -0.000844f, -0.003378f, 0.014232f, 0.011247f, -0.019700f, -0.024282f, -0.000099f, -0.009197f, 0.023147f, 0.027250f, -0.000016f, 0.014448f, 0.004750f, 0.005779f, 0.031459f, -0.019210f, -0.025474f, 0.020093f, -0.033359f, 0.002889f, -0.010284f, 0.018417f, 0.009391f, 0.000346f, 0.021528f, 0.019773f, -0.017975f, 0.022403f, -0.000053f, -0.009577f, 0.005295f, 0.024337f, -0.009410f, 0.010415f, 0.018037f, 0.008171f, -0.038883f, -0.022474f, 0.003827f, 0.002061f, -0.026437f, -0.018055f, 0.008777f, 0.012585f, 0.010688f, -0.036009f, -0.025160f, -0.025057f, -0.001992f, 0.015618f, 0.022764f, -0.057207f, -0.042053f, 0.007004f, 0.008789f, 0.033054f, 0.011650f, 0.012126f, 0.024059f, -0.002584f, -0.006178f, -0.008728f, 0.059070f, 0.020428f, -0.009324f, -0.030906f, 0.028239f, 0.018456f, -0.009240f, -0.008392f, 0.004357f, -0.008502f, 0.015082f, -0.005443f, -0.003234f, 0.008887f, -0.002204f, -0.003538f, -0.004660f, 0.009333f, 0.024212f, 0.000174f, 0.001719f, 0.000852f, 0.010526f, 0.013528f, -0.003453f, -0.008510f, 0.003653f, -0.000791f, 0.002717f, 0.001589f, 0.002066f, -0.011482f, + -0.006278f, 0.008142f, 0.000816f, -0.004671f, 0.003961f, 0.011330f, 0.008807f, -0.015193f, -0.003426f, -0.010100f, -0.009742f, 0.007214f, -0.011630f, 0.004558f, -0.006280f, 0.011287f, -0.013458f, -0.018767f, -0.036312f, -0.035352f, -0.029050f, 0.011207f, -0.003738f, 0.016393f, -0.032030f, -0.005287f, 0.001500f, -0.012367f, -0.014987f, 0.026036f, -0.009973f, 0.005266f, -0.000392f, 0.001805f, -0.026115f, -0.009619f, -0.022331f, 0.002964f, 0.002953f, 0.005796f, 0.061753f, -0.024063f, 0.017059f, 0.025987f, -0.013189f, -0.012457f, -0.018679f, -0.003783f, 0.028849f, -0.029439f, 0.020156f, -0.001938f, -0.004900f, 0.002698f, 0.002962f, 0.015806f, 0.001782f, -0.031231f, 0.023889f, -0.019458f, -0.044805f, -0.036281f, -0.018165f, 0.060650f, 0.051476f, -0.027986f, -0.008045f, -0.038417f, -0.032045f, -0.012666f, 0.037483f, 0.000966f, 0.025857f, 0.013501f, -0.017617f, 0.019694f, -0.013410f, -0.039986f, -0.003376f, -0.024250f, -0.004930f, -0.013000f, 0.078924f, 0.000712f, -0.065309f, 0.051275f, -0.020683f, -0.014574f, 0.051829f, 0.052653f, 0.000188f, -0.023072f, 0.010289f, 0.012869f, -0.070919f, -0.030531f, + 0.001898f, -0.010440f, 0.037155f, 0.015710f, -0.053795f, -0.008065f, -0.004302f, 0.024384f, 0.015538f, 0.010609f, 0.009666f, -0.011218f, 0.001938f, 0.004269f, 0.022537f, -0.002800f, 0.003117f, 0.004411f, 0.003867f, 0.013229f, 0.006297f, 0.000294f, -0.015357f, 0.019457f, -0.001742f, -0.000097f, 0.000926f, 0.000020f, -0.008288f, -0.012965f, -0.008861f, 0.001760f, -0.003185f, 0.005661f, -0.000861f, -0.005747f, 0.006210f, 0.014357f, -0.019084f, -0.006215f, -0.005808f, -0.002742f, 0.005468f, -0.000372f, -0.005439f, -0.010772f, -0.004016f, -0.002784f, 0.009730f, -0.031409f, -0.019529f, 0.009548f, 0.007455f, 0.017087f, 0.053771f, 0.009279f, -0.001363f, 0.012590f, 0.002823f, -0.022346f, -0.013719f, 0.012057f, 0.002784f, 0.043910f, 0.010385f, -0.002721f, 0.015901f, 0.023583f, 0.023909f, 0.025730f, 0.001411f, -0.018020f, -0.004983f, -0.041185f, -0.005577f, -0.046505f, 0.025974f, -0.028294f, -0.010937f, 0.000158f, 0.037695f, -0.021817f, 0.020987f, -0.015315f, 0.012728f, -0.019212f, 0.024069f, 0.036360f, 0.002503f, -0.007658f, -0.019526f, -0.028166f, 0.015803f, 0.018097f, 0.046106f, -0.006217f, + 0.002339f, 0.020333f, 0.073831f, -0.017194f, 0.011090f, -0.011916f, -0.041079f, 0.028892f, -0.005859f, 0.020555f, -0.002523f, 0.005121f, -0.024739f, 0.068363f, -0.102454f, 0.075475f, -0.117559f, 0.050731f, -0.060633f, 0.018889f, -0.047539f, 0.017170f, 0.031555f, -0.007494f, 0.023452f, -0.012011f, 0.085789f, -0.051980f, 0.056967f, -0.088202f, 0.044541f, -0.034565f, 0.042852f, -0.028742f, -0.031143f, -0.015209f, -0.007877f, 0.021667f, -0.005919f, -0.003782f, 0.002166f, 0.001356f, -0.011011f, 0.015421f, -0.016614f, 0.016296f, -0.012006f, 0.005009f, -0.019108f, -0.010675f, -0.014117f, 0.002554f, -0.012980f, 0.016091f, 0.017147f, -0.016226f, -0.000258f, 0.006518f, 0.015737f, -0.002360f, 0.005644f, 0.012909f, -0.012083f, 0.021335f, -0.005931f, 0.028212f, -0.016807f, 0.033792f, -0.024096f, 0.008701f, -0.001981f, 0.018851f, 0.015638f, -0.002987f, 0.009156f, -0.026027f, 0.029676f, -0.020386f, 0.007212f, -0.020715f, 0.015001f, -0.027635f, 0.009496f, -0.002327f, -0.010131f, 0.010448f, 0.026151f, 0.020887f, 0.082811f, -0.057588f, 0.024164f, 0.015124f, -0.049570f, -0.001394f, -0.009666f, -0.014130f, + -0.025422f, -0.001383f, 0.003031f, 0.032914f, 0.012380f, 0.017219f, 0.024849f, 0.020022f, 0.000854f, 0.027443f, -0.031554f, -0.004574f, 0.038260f, 0.004239f, -0.052246f, -0.012048f, -0.068402f, -0.012820f, 0.012062f, -0.012709f, -0.015858f, -0.002995f, 0.061356f, 0.015469f, 0.004807f, 0.007468f, 0.015447f, -0.004632f, -0.035014f, -0.010770f, -0.003782f, 0.006514f, -0.007983f, -0.016424f, 0.044466f, 0.023863f, -0.009049f, -0.002120f, -0.009411f, -0.040112f, -0.032798f, -0.024060f, -0.019870f, 0.044749f, 0.010903f, 0.016511f, -0.026853f, -0.026205f, 0.008548f, 0.018210f, 0.016926f, -0.007589f, -0.005181f, -0.030427f, -0.019976f, 0.026552f, 0.001324f, -0.073636f, 0.026023f, 0.040161f, 0.012980f, -0.032097f, -0.019614f, -0.015997f, 0.005401f, -0.023113f, 0.011531f, -0.054204f, -0.072314f, 0.029969f, 0.026251f, -0.014492f, -0.026511f, 0.020310f, -0.011804f, 0.005249f, 0.006411f, -0.010685f, 0.011712f, -0.006625f, -0.006697f, -0.003939f, 0.017529f, -0.012404f, -0.003545f, -0.013569f, -0.000080f, 0.001124f, 0.011754f, 0.012048f, -0.001248f, 0.007095f, -0.008454f, 0.014081f, -0.009717f, 0.011501f, + -0.026546f, -0.012143f, -0.003576f, 0.007686f, -0.008615f, -0.017395f, -0.013240f, 0.006343f, 0.013823f, -0.000524f, 0.017832f, 0.004978f, 0.007104f, 0.001084f, 0.011636f, -0.006542f, 0.011122f, -0.002670f, -0.021875f, -0.016893f, -0.006394f, 0.009994f, -0.012272f, 0.007264f, -0.068285f, 0.059770f, 0.072739f, -0.006846f, 0.052884f, 0.002117f, 0.008075f, 0.023004f, -0.046729f, 0.016954f, 0.034569f, 0.034082f, 0.014305f, 0.010532f, -0.033793f, 0.024677f, 0.014527f, -0.020533f, 0.010899f, -0.004112f, 0.040280f, 0.011073f, 0.010290f, 0.023778f, -0.009572f, -0.027479f, 0.007912f, 0.051295f, -0.018411f, -0.010027f, 0.046341f, -0.017072f, -0.020767f, -0.016928f, 0.015943f, 0.059597f, 0.082910f, -0.005196f, -0.053823f, 0.081316f, 0.027993f, -0.053612f, 0.060650f, 0.023203f, -0.015070f, -0.015591f, -0.022776f, -0.037784f, -0.002166f, 0.019804f, -0.032409f, -0.021231f, -0.068438f, -0.009314f, 0.039813f, -0.082904f, -0.044911f, 0.013075f, 0.013351f, 0.016340f, 0.050273f, 0.044489f, -0.073675f, 0.000599f, 0.002815f, -0.052141f, 0.014551f, 0.024803f, -0.026756f, -0.019097f, -0.022592f, 0.015106f, + 0.057888f, 0.018116f, 0.030104f, -0.039588f, 0.020172f, -0.044824f, 0.003920f, -0.030145f, -0.122471f, 0.093667f, 0.024071f, -0.034184f, 0.063403f, -0.021875f, -0.028891f, 0.017056f, 0.012957f, 0.016313f, 0.024792f, 0.010027f, -0.024906f, -0.007910f, 0.024323f, -0.000800f, 0.009359f, 0.003922f, -0.003994f, 0.005971f, -0.010925f, 0.008090f, 0.022725f, 0.008204f, -0.013410f, -0.009921f, 0.006938f, -0.006086f, -0.012167f, 0.004637f, 0.014177f, 0.008239f, -0.042359f, -0.012811f, -0.031196f, -0.016186f, 0.018182f, -0.013909f, -0.017437f, 0.016596f, 0.010723f, -0.018285f, 0.023226f, -0.017155f, -0.007507f, 0.008342f, -0.013465f, 0.015268f, -0.006792f, -0.025131f, -0.038859f, 0.044777f, 0.148460f, -0.047399f, 0.001308f, 0.011408f, 0.067031f, 0.059428f, -0.019451f, -0.025803f, -0.037439f, 0.001594f, 0.028393f, -0.000946f, -0.019141f, -0.019687f, 0.026794f, -0.014621f, -0.036015f, -0.032197f, -0.006504f, 0.054553f, 0.038264f, -0.043384f, 0.002915f, 0.000789f, -0.018916f, 0.021505f, 0.007957f, -0.015483f, -0.005111f, -0.012178f, -0.005818f, 0.069639f, -0.025934f, -0.046252f, -0.032374f, -0.026289f, + 0.061587f, 0.001702f, -0.014282f, 0.056710f, 0.038983f, 0.015494f, 0.028858f, 0.055764f, -0.033920f, 0.008595f, 0.054255f, 0.031720f, 0.041447f, -0.047092f, -0.013280f, -0.001766f, 0.019849f, 0.018699f, -0.044579f, 0.004246f, -0.058567f, -0.088082f, -0.004654f, -0.023310f, 0.040888f, 0.045473f, -0.011943f, -0.003622f, 0.009221f, -0.032036f, -0.085325f, 0.057402f, -0.041358f, 0.008863f, -0.015938f, -0.028864f, -0.016760f, -0.033470f, -0.067649f, 0.039921f, 0.035518f, 0.043107f, 0.008295f, -0.053765f, -0.094449f, -0.028058f, -0.026157f, -0.011576f, 0.029807f, -0.019342f, -0.004766f, 0.005673f, 0.003959f, -0.015051f, -0.006920f, -0.012098f, 0.001406f, -0.005410f, 0.009922f, -0.005961f, -0.007394f, 0.010915f, 0.014178f, 0.011246f, -0.022922f, 0.007439f, 0.001218f, -0.002109f, 0.000186f, -0.050240f, 0.002337f, 0.006893f, 0.007285f, -0.033124f, 0.021421f, -0.004799f, -0.027654f, -0.022589f, 0.013253f, 0.017647f, -0.003445f, 0.010452f, -0.017124f, -0.012013f, -0.011729f, 0.001273f, 0.020349f, 0.005121f, 0.019416f, -0.000563f, 0.008887f, -0.029256f, -0.004740f, 0.007041f, 0.003872f, -0.023207f, + -0.007033f, -0.072904f, -0.041792f, -0.033990f, -0.085829f, 0.099101f, -0.002272f, 0.052195f, -0.011911f, 0.002594f, -0.059821f, -0.032720f, -0.030866f, 0.006905f, 0.046873f, -0.002159f, -0.048805f, -0.036512f, -0.069767f, -0.077680f, 0.066615f, 0.024563f, -0.060457f, -0.018780f, 0.029829f, 0.055458f, 0.007772f, -0.068862f, -0.041860f, 0.013552f, 0.019260f, 0.017072f, 0.040191f, -0.042825f, -0.040621f, -0.006261f, -0.014416f, 0.005648f, 0.011970f, -0.082752f, -0.015247f, -0.057726f, -0.036954f, -0.076982f, -0.029172f, 0.105391f, 0.018180f, 0.003303f, 0.025860f, 0.026109f, 0.008261f, 0.078308f, 0.062023f, -0.020538f, 0.021073f, 0.105817f, -0.027727f, -0.024762f, -0.025279f, -0.078894f, -0.003038f, -0.043216f, -0.097948f, -0.102772f, -0.053855f, -0.053076f, 0.024002f, -0.039762f, 0.003477f, 0.020789f, -0.069795f, -0.025627f, 0.000445f, -0.000350f, 0.018021f, 0.045592f, 0.030353f, 0.054986f, 0.074540f, 0.054023f, -0.006658f, -0.039419f, -0.057101f, -0.004912f, 0.023634f, 0.006911f, -0.008034f, -0.000763f, 0.016191f, 0.013027f, 0.035109f, -0.004002f, 0.005598f, 0.000573f, -0.011699f, 0.011427f, + 0.001815f, -0.005707f, 0.030002f, 0.012925f, 0.006811f, -0.028177f, 0.018923f, -0.010151f, 0.014271f, -0.026746f, -0.074053f, -0.003536f, 0.029240f, -0.005593f, -0.039308f, -0.025298f, -0.028768f, -0.021767f, 0.009381f, 0.012839f, 0.014684f, 0.003932f, -0.002632f, 0.010941f, 0.028979f, 0.048293f, 0.045693f, 0.056730f, 0.048643f, -0.004750f, 0.032707f, 0.073998f, 0.005258f, -0.032640f, -0.046422f, -0.046858f, -0.063634f, -0.051799f, -0.024745f, -0.027884f, -0.003893f, 0.065606f, -0.042890f, 0.012960f, -0.049675f, -0.016843f, -0.054173f, 0.006958f, 0.065713f, -0.001511f, 0.040615f, -0.081242f, 0.071420f, 0.023935f, -0.014635f, 0.056610f, 0.007938f, 0.025754f, -0.022641f, -0.026724f, -0.000508f, 0.017346f, 0.013294f, -0.056727f, 0.052080f, -0.062864f, 0.007703f, 0.017596f, -0.021341f, 0.037057f, -0.039074f, -0.022196f, -0.004314f, -0.013941f, -0.019780f, -0.004364f, 0.008386f, -0.029027f, -0.034215f, -0.011084f, -0.005987f, -0.008398f, 0.020792f, 0.011301f, 0.008473f, -0.041505f, 0.011047f, 0.050504f, 0.066946f, -0.049382f, -0.024881f, 0.056926f, 0.077849f, -0.047196f, -0.029190f, 0.032833f, + 0.013780f, -0.037482f, 0.031124f, -0.088049f, -0.017340f, 0.035888f, 0.070391f, 0.009166f, -0.043665f, -0.039479f, 0.010685f, 0.084371f, 0.007355f, 0.012656f, 0.002532f, 0.028005f, -0.005404f, 0.062708f, -0.000686f, -0.069354f, 0.043777f, -0.045247f, -0.013878f, 0.019212f, -0.026485f, 0.006350f, -0.056468f, -0.021026f, 0.052362f, 0.024138f, -0.023459f, -0.033516f, -0.018349f, 0.004408f, -0.027223f, -0.008187f, -0.006002f, -0.016653f, -0.010229f, -0.008019f, -0.035345f, 0.022428f, -0.013210f, -0.015642f, -0.051196f, -0.012864f, 0.037661f, -0.026006f, -0.014382f, -0.013526f, -0.029238f, 0.056368f, 0.023117f, 0.002238f, -0.001849f, -0.031199f, -0.046865f, 0.003092f, 0.041923f, 0.034509f, 0.011547f, -0.035141f, -0.020597f, -0.015630f, 0.020453f, 0.003865f, -0.031346f, -0.007635f, 0.002037f, 0.012499f, -0.027881f, -0.018620f, -0.016446f, 0.043868f, 0.022422f, 0.002988f, -0.027081f, -0.023306f, 0.024515f, 0.052731f, -0.000527f, -0.022443f, -0.032346f, -0.010794f, 0.014620f, 0.001334f, -0.007454f, 0.002058f, -0.006453f, -0.004779f, 0.004979f, -0.105863f, -0.029621f, 0.018084f, -0.036006f, 0.104892f, + 0.076415f, 0.050450f, 0.026443f, 0.070815f, 0.049629f, 0.016772f, 0.033706f, -0.082966f, -0.111978f, -0.015378f, 0.000754f, -0.028591f, 0.014623f, -0.005187f, -0.029490f, -0.036476f, -0.030193f, 0.058022f, 0.050041f, -0.040172f, -0.005509f, -0.005470f, -0.010457f, -0.014185f, -0.021346f, -0.030370f, -0.043072f, -0.008009f, 0.075156f, -0.023981f, -0.042258f, -0.019866f, 0.070521f, -0.032928f, -0.032885f, 0.109811f, 0.038692f, 0.018633f, -0.026986f, -0.060052f, -0.042373f, -0.061946f, 0.016494f, 0.051465f, 0.138163f, -0.121468f, -0.051902f, 0.071590f, 0.098554f, 0.017459f, -0.006104f, 0.127118f, 0.060566f, -0.039830f, 0.040208f, -0.014399f, 0.000271f, -0.087671f, -0.044529f, -0.030496f, -0.144270f, -0.060889f, -0.023403f, 0.077802f, -0.042111f, -0.024056f, 0.057720f, -0.003627f, -0.007817f, 0.014075f, 0.040593f, -0.039139f, 0.028668f, 0.044293f, 0.000919f, -0.008160f, -0.081451f, 0.037767f, 0.029086f, -0.093809f, -0.006867f, 0.010413f, 0.006048f, -0.007771f, -0.041791f, 0.011351f, 0.007060f, 0.011975f, -0.006634f, -0.011836f, 0.030053f, 0.006653f, -0.006294f, 0.020970f, 0.008582f, 0.055505f, + -0.007580f, 0.018365f, 0.003483f, -0.043658f, -0.038252f, 0.027085f, -0.021297f, 0.016560f, 0.020636f, 0.013044f, 0.012741f, 0.000605f, 0.036525f, -0.011419f, -0.009150f, -0.014172f, 0.010482f, 0.028701f, -0.042854f, -0.015701f, 0.020581f, 0.009809f, -0.024279f, -0.043467f, -0.011174f, 0.012251f, 0.091814f, 0.033713f, -0.007667f, 0.023831f, -0.004661f, -0.008480f, -0.033842f, 0.016256f, 0.014015f, -0.026676f, -0.013005f, -0.097121f, -0.003953f, 0.040017f, -0.009383f, -0.040492f, 0.017732f, -0.009086f, 0.043705f, 0.008747f, -0.021169f, -0.000325f, 0.046788f, -0.026622f, 0.007530f, 0.016912f, -0.014233f, -0.000402f, -0.025309f, 0.051672f, -0.003101f, 0.007698f, 0.000829f, 0.024976f, -0.011304f, -0.009716f, -0.016148f, 0.010335f, 0.019419f, -0.008502f, 0.023069f, -0.009981f, 0.014216f, -0.024229f, -0.019090f, 0.029429f, 0.037737f, -0.048746f, 0.002281f, 0.000073f, 0.004572f, 0.015374f, -0.030671f, 0.047063f, -0.042145f, 0.037881f, 0.005305f, -0.065792f, -0.003585f, 0.051365f, -0.066973f, 0.031968f, 0.000295f, 0.008666f, -0.016078f, -0.010021f, 0.013538f, -0.019418f, 0.068595f, -0.050732f, + 0.007589f, -0.013606f, -0.006152f, 0.016928f, 0.000964f, -0.008316f, -0.001572f, 0.020753f, -0.000644f, -0.023793f, 0.006711f, 0.012092f, -0.039846f, 0.031011f, 0.013998f, 0.001470f, 0.028585f, -0.010454f, -0.008840f, 0.013466f, 0.006247f, 0.008544f, 0.004861f, -0.007878f, 0.016138f, 0.006955f, 0.001197f, -0.017427f, -0.002878f, 0.008522f, 0.015468f, -0.026455f, 0.013847f, 0.016490f, -0.023385f, 0.011098f, 0.003432f, 0.003986f, 0.012342f, -0.006955f, 0.002757f, -0.004359f, -0.033921f, -0.000510f, -0.008203f, 0.014818f, -0.009556f, 0.005658f, 0.003720f, -0.001399f, 0.004523f, 0.008585f, -0.005623f, 0.000008f, 0.001526f, -0.000244f, 0.002451f, 0.010308f, -0.010519f, 0.009658f, -0.007684f, -0.048940f, -0.138185f, -0.197370f, 0.066372f, 0.175533f, 0.038758f, 0.486518f, 0.400696f, 0.270736f, 0.458173f, 0.238667f, -0.016278f, -0.057163f, -0.180899f, -0.417714f, -0.344947f, -0.335486f, -0.466528f, -0.344912f, -0.101288f, -0.074698f, -0.012211f, 0.162345f, 0.075587f, -0.020167f, 0.102982f, 0.170327f, 0.083412f, 0.079811f, 0.155017f, 0.092355f, 0.071230f, 0.140456f, 0.220550f, 0.091829f, + 0.129473f, 0.207023f, 0.035535f, 0.014056f, 0.182930f, 0.108175f, -0.070128f, 0.088214f, 0.113675f, -0.118610f, -0.035385f, 0.131097f, -0.026405f, -0.078469f, 0.169341f, 0.089769f, -0.105051f, 0.090894f, 0.120560f, -0.160769f, -0.150498f, -0.064279f, -0.388264f, -0.515209f, -0.323133f, -0.455471f, -0.607134f, -0.423065f, -0.432947f, -0.559777f, -0.442663f, -0.306948f, -0.332812f, -0.198911f, 0.019010f, 0.124269f, 0.270123f, 0.441974f, 0.550919f, 0.678408f, 0.753754f, 0.823449f, 0.873157f, 0.784075f, 0.616558f, 0.569576f, 0.365097f, 0.110387f, 0.086709f, -0.058344f, -0.280318f, -0.220164f, -0.093426f, -0.208561f, -0.214424f, -0.045259f, -0.151049f, -0.289523f, -0.174844f, -0.126786f, -0.258976f, -0.220490f, -0.077907f, -0.195946f, -0.232790f, -0.018551f, -0.011621f, -0.104862f, 0.041663f, 0.024310f, -0.168790f, -0.125114f, -0.072618f, -0.240305f, -0.331107f, -0.270749f, -0.369819f, -0.458732f, -0.340311f, -0.273308f, -0.259242f, -0.113472f, 0.053175f, 0.137997f, 0.204730f, 0.282693f, 0.319020f, 0.286144f, 0.373073f, 0.478291f, 0.495797f, 0.463034f, 0.471564f, 0.454831f, 0.369279f, 0.416968f, + 0.376471f, 0.161857f, 0.021299f, -0.092382f, -0.203603f, -0.215223f, -0.177448f, -0.209600f, -0.204905f, -0.177372f, -0.174991f, -0.186551f, -0.153207f, -0.136814f, -0.130616f, -0.123318f, -0.095005f, -0.089971f, -0.093262f, -0.073794f, -0.048225f, -0.043355f, -0.027645f, -0.002970f, 0.011458f, 0.011913f, 0.014353f, 0.005395f, 0.003308f} + }, + { + {0.007552f, 0.018077f, 0.000306f, 0.000741f, -0.008639f, -0.006916f, 0.005212f, 0.003185f, 0.000467f, 0.007373f, -0.011144f, -0.003792f, 0.018044f, 0.001219f, 0.003508f, -0.004760f, -0.006105f, 0.008476f, 0.007088f, -0.002989f, 0.006976f, 0.000283f, 0.001127f, -0.006900f, 0.002465f, -0.006284f, -0.004907f, -0.006173f, 0.002081f, 0.000234f, -0.002021f, -0.000708f, 0.002093f, 0.005354f, -0.002583f, -0.009829f, 0.000152f, -0.007011f, -0.008961f, -0.002360f, 0.004015f, -0.001390f, 0.003582f, 0.002272f, 0.003282f, -0.001424f, -0.001277f, -0.001696f, -0.001466f, 0.003008f, -0.000123f, 0.006199f, -0.000854f, 0.007679f, 0.001261f, 0.001728f, 0.007300f, 0.002596f, 0.001856f, 0.009456f, -0.003868f, 0.003120f, -0.003310f, -0.006706f, 0.006126f, -0.002231f, -0.000002f, 0.002258f, -0.001143f, -0.005570f, -0.001735f, 0.003992f, -0.002613f, -0.000151f, -0.005419f, 0.002598f, 0.000339f, -0.003611f, 0.000414f, -0.005756f, 0.000841f, -0.005521f, -0.000519f, -0.000083f, -0.000764f, 0.003182f, 0.001514f, 0.000831f, 0.001729f, -0.000607f, 0.003193f, 0.002331f, -0.000291f, 0.000714f, 0.000690f, -0.000121f, + 0.000087f, 0.001067f, -0.001380f, 0.000738f, -0.001756f, 0.001474f, 0.000129f, -0.000272f, -0.000107f, 0.001221f, 0.000282f, -0.001127f, 0.000357f, -0.000059f, -0.000685f, -0.001702f, -0.023724f, -0.012320f, -0.005544f, -0.005150f, -0.000025f, 0.000059f, 0.001761f, 0.000334f, -0.001333f, -0.009722f, -0.004412f, -0.009963f, -0.015603f, -0.013035f, 0.007353f, 0.009070f, 0.009175f, -0.003620f, -0.001091f, -0.001038f, -0.002054f, 0.003376f, 0.001408f, -0.003323f, -0.007074f, 0.005089f, 0.004343f, 0.006359f, 0.001660f, -0.002145f, -0.003876f, 0.001802f, 0.003034f, -0.000728f, 0.006459f, -0.003148f, -0.000187f, 0.006278f, -0.004813f, -0.007633f, 0.000602f, 0.010550f, 0.002419f, 0.002332f, 0.001471f, 0.000089f, 0.001346f, -0.001636f, 0.001871f, -0.008341f, 0.001353f, 0.008650f, -0.001989f, 0.000125f, 0.000851f, -0.002956f, -0.001660f, -0.001203f, -0.001415f, -0.002318f, 0.005286f, -0.004971f, 0.005188f, 0.004423f, 0.009710f, -0.000677f, 0.005455f, 0.012404f, -0.002297f, -0.010002f, -0.011216f, -0.000543f, -0.001473f, 0.000601f, -0.009521f, 0.002756f, -0.006686f, -0.004972f, 0.002278f, 0.006939f, + -0.002865f, -0.005302f, -0.006350f, -0.001243f, -0.000704f, 0.001744f, 0.000553f, 0.003986f, 0.002353f, -0.000226f, 0.002007f, 0.000576f, 0.003930f, 0.002974f, 0.001865f, 0.000851f, 0.000852f, -0.000696f, 0.002627f, 0.000121f, 0.000783f, -0.000329f, 0.000049f, -0.001993f, -0.000008f, -0.000390f, 0.016484f, 0.013006f, 0.005529f, 0.006669f, -0.004304f, 0.003020f, 0.011398f, 0.005603f, 0.012276f, -0.004764f, 0.004949f, 0.007056f, -0.000356f, 0.009042f, -0.004670f, 0.005662f, 0.001027f, -0.005746f, -0.001468f, -0.001065f, -0.000362f, -0.001612f, 0.000673f, -0.002871f, 0.000905f, -0.002094f, 0.011228f, -0.002559f, -0.000621f, -0.000005f, -0.005068f, -0.014253f, 0.008122f, -0.003363f, 0.003135f, -0.005646f, -0.005367f, -0.006042f, -0.004023f, 0.003734f, 0.010771f, 0.008522f, 0.003577f, -0.000590f, -0.002316f, 0.003441f, 0.007741f, -0.001698f, -0.002544f, 0.009612f, -0.004251f, 0.004613f, -0.004782f, -0.003728f, -0.002293f, 0.003590f, 0.003797f, -0.006719f, -0.004639f, 0.000203f, 0.007205f, 0.009354f, 0.005065f, 0.007294f, -0.001003f, 0.006834f, 0.002679f, 0.007176f, -0.004032f, 0.002887f, + 0.016377f, 0.007648f, 0.006950f, -0.001667f, -0.004607f, -0.011156f, 0.006483f, 0.002805f, -0.004609f, -0.004615f, -0.001519f, 0.003420f, -0.003393f, -0.001555f, -0.003054f, 0.000114f, 0.002344f, -0.000985f, -0.004598f, 0.001341f, 0.001586f, 0.002650f, 0.002725f, 0.000382f, 0.003859f, 0.001910f, 0.001604f, 0.001202f, -0.001264f, 0.002731f, 0.000253f, -0.000000f, -0.001323f, -0.002007f, -0.002209f, 0.000547f, 0.001586f, 0.000664f, 0.000102f, 0.000498f, -0.000133f, 0.002454f, -0.003344f, -0.000788f, 0.001012f, -0.001328f, 0.001337f, 0.005131f, 0.018936f, 0.002699f, 0.006872f, 0.013718f, 0.000260f, -0.007839f, -0.003363f, -0.002352f, 0.000541f, -0.004938f, -0.013462f, 0.005406f, 0.000454f, 0.000294f, 0.005627f, -0.008927f, -0.004126f, 0.014064f, -0.003446f, -0.005307f, -0.008331f, 0.000289f, -0.007872f, -0.001311f, -0.002627f, -0.002365f, 0.001010f, 0.011365f, -0.000366f, -0.003562f, 0.003333f, -0.009029f, 0.012117f, -0.001541f, -0.002725f, 0.015153f, -0.008728f, 0.000724f, -0.010314f, -0.004712f, 0.000878f, 0.000485f, 0.003965f, 0.004786f, -0.009203f, 0.002745f, 0.003857f, 0.003143f, + 0.000883f, 0.004350f, 0.003154f, 0.006350f, -0.005826f, -0.003107f, 0.011955f, -0.004968f, 0.004569f, 0.001146f, 0.003435f, 0.003094f, -0.001017f, -0.004045f, -0.000627f, 0.008452f, -0.005027f, -0.000552f, -0.002672f, 0.001964f, 0.007539f, -0.004229f, -0.009404f, -0.018158f, 0.001135f, -0.000741f, -0.001564f, 0.000080f, -0.006986f, -0.004886f, -0.010132f, -0.003983f, 0.005044f, -0.000161f, 0.003139f, -0.001196f, 0.006312f, 0.004382f, -0.000058f, 0.003287f, -0.000253f, -0.000382f, 0.002192f, -0.003932f, -0.002104f, -0.003189f, -0.000020f, -0.003809f, 0.002280f, -0.000127f, 0.001089f, -0.001407f, -0.001223f, -0.000149f, -0.001371f, 0.000892f, 0.001444f, -0.003525f, 0.001695f, 0.001447f, 0.000840f, -0.003360f, 0.001797f, 0.001212f, 0.003199f, 0.003378f, -0.000295f, -0.001147f, -0.001751f, 0.001695f, -0.000878f, -0.000604f, 0.000642f, -0.008067f, -0.020422f, 0.010389f, -0.006805f, -0.011434f, 0.000391f, -0.021585f, 0.004552f, 0.006769f, -0.002530f, 0.015991f, -0.006210f, -0.018973f, 0.004444f, 0.007378f, -0.006789f, -0.013386f, 0.022952f, -0.001323f, -0.001523f, 0.005995f, -0.005250f, -0.002832f, + 0.002215f, -0.011179f, 0.006483f, -0.001075f, 0.003119f, -0.002244f, 0.010655f, -0.002608f, 0.005909f, 0.005445f, -0.010814f, -0.005110f, -0.006159f, 0.011214f, -0.005668f, -0.003193f, 0.008282f, -0.002820f, -0.006417f, 0.005007f, 0.015313f, -0.007735f, 0.007389f, -0.007995f, 0.010018f, -0.005491f, 0.005212f, 0.001142f, -0.005611f, -0.015710f, 0.008707f, 0.011510f, -0.001208f, -0.003526f, 0.006412f, 0.008100f, 0.007617f, -0.010781f, -0.001380f, -0.009499f, -0.001021f, 0.003488f, -0.006842f, 0.002687f, 0.007404f, -0.007919f, -0.000304f, 0.001644f, -0.007806f, -0.005500f, 0.007063f, -0.005044f, 0.005558f, -0.003251f, -0.009986f, 0.002098f, -0.009685f, 0.002570f, -0.003739f, 0.003430f, -0.010652f, 0.009797f, -0.008056f, 0.001074f, -0.007497f, -0.000175f, -0.000566f, 0.002063f, -0.000888f, 0.000018f, -0.002415f, 0.002625f, -0.007242f, 0.002564f, -0.005949f, -0.004647f, 0.000036f, 0.004354f, 0.001945f, 0.000851f, 0.001245f, 0.000328f, 0.002470f, 0.005523f, -0.004686f, 0.004599f, -0.003058f, -0.000569f, 0.002812f, 0.002354f, -0.003347f, 0.000013f, -0.008193f, 0.010351f, -0.011403f, -0.011350f, + -0.019411f, 0.008161f, 0.020544f, 0.003104f, -0.003670f, -0.001796f, -0.003444f, 0.017858f, -0.010711f, -0.009792f, -0.002297f, -0.010793f, -0.003297f, -0.011724f, -0.005041f, -0.008235f, -0.016245f, -0.004583f, -0.003571f, -0.000590f, -0.001771f, 0.004201f, 0.009716f, 0.003447f, 0.004820f, -0.014955f, 0.001869f, -0.000259f, -0.004660f, 0.005168f, 0.002784f, -0.004371f, -0.001905f, -0.010649f, -0.011771f, -0.001736f, 0.013098f, -0.003845f, -0.006700f, -0.001452f, -0.004336f, -0.009196f, 0.000182f, -0.009601f, 0.019647f, 0.016539f, 0.004311f, -0.005063f, -0.004564f, 0.001725f, 0.002985f, 0.003383f, 0.003265f, -0.001199f, 0.007336f, -0.006931f, 0.003265f, -0.006097f, 0.000224f, -0.000073f, 0.004136f, 0.002867f, 0.009244f, -0.003990f, -0.005618f, -0.005159f, -0.021269f, 0.000665f, 0.004480f, -0.002152f, 0.007766f, 0.003343f, -0.006369f, 0.001856f, -0.011142f, -0.004156f, 0.000972f, 0.008569f, 0.003695f, 0.011725f, 0.002401f, -0.001402f, 0.000115f, 0.004348f, -0.004807f, -0.000611f, 0.001168f, -0.002010f, 0.003048f, -0.004201f, 0.002258f, -0.003199f, -0.002567f, -0.000518f, -0.003540f, -0.003514f, + -0.004342f, -0.002309f, -0.001230f, 0.003303f, 0.002797f, -0.003250f, -0.004599f, -0.001408f, -0.003504f, 0.002478f, -0.003914f, 0.001961f, -0.002252f, -0.000643f, 0.004022f, 0.000290f, 0.003375f, -0.020058f, 0.003248f, 0.020450f, 0.019274f, -0.020715f, -0.018908f, 0.004885f, -0.015047f, -0.007992f, 0.002152f, -0.001057f, -0.006159f, 0.015518f, 0.006856f, -0.021883f, -0.001800f, 0.001297f, -0.000233f, 0.013973f, 0.005166f, -0.010171f, 0.014685f, 0.005480f, 0.001899f, -0.007896f, -0.008443f, 0.006292f, -0.005433f, -0.014825f, -0.002748f, -0.001938f, -0.006671f, -0.008849f, -0.012005f, 0.012723f, 0.000843f, 0.001879f, -0.008334f, 0.000204f, 0.008973f, -0.007117f, -0.015094f, -0.015245f, 0.015945f, 0.003595f, 0.015048f, -0.002406f, 0.004271f, 0.011126f, 0.022584f, 0.007310f, -0.002903f, -0.011556f, -0.005026f, -0.005760f, 0.003377f, 0.001227f, -0.009079f, -0.003660f, 0.013102f, 0.009301f, 0.017823f, 0.008377f, -0.012439f, -0.011835f, 0.014733f, 0.007873f, -0.007850f, 0.000092f, 0.015176f, 0.001194f, -0.000929f, -0.011840f, 0.013012f, 0.009809f, -0.002405f, 0.018218f, -0.002803f, -0.005246f, + -0.019117f, -0.002510f, 0.000869f, 0.010142f, -0.013223f, -0.000808f, 0.005777f, -0.003204f, -0.009540f, -0.008865f, -0.001286f, -0.000878f, -0.001821f, -0.011083f, -0.009899f, -0.005807f, 0.003447f, -0.000202f, -0.004608f, -0.001507f, -0.000708f, 0.000988f, 0.000824f, 0.001660f, -0.001042f, 0.003749f, -0.003175f, -0.000764f, -0.000010f, -0.002193f, -0.007436f, 0.000504f, 0.004156f, -0.001315f, -0.006581f, 0.000573f, -0.001666f, 0.002326f, 0.000274f, -0.000800f, -0.000685f, 0.002149f, -0.001105f, 0.003961f, 0.001931f, -0.000104f, -0.003692f, 0.002685f, -0.002935f, 0.002713f, 0.003340f, -0.008213f, 0.003251f, -0.003073f, -0.001656f, 0.010047f, -0.016741f, 0.010065f, -0.010977f, 0.001979f, 0.008776f, -0.000116f, -0.004464f, 0.003280f, -0.011496f, 0.000457f, -0.008955f, -0.025985f, -0.007955f, 0.010988f, 0.007104f, 0.003998f, -0.006330f, 0.005293f, 0.002363f, 0.027729f, 0.004750f, -0.009409f, 0.010303f, 0.002014f, 0.002178f, 0.018426f, -0.005340f, -0.005217f, 0.006389f, -0.013034f, 0.015614f, 0.014417f, -0.000377f, 0.008142f, -0.003081f, -0.007993f, -0.001083f, -0.010038f, 0.000793f, -0.009830f, + 0.003779f, -0.000171f, 0.002781f, 0.001098f, -0.016859f, -0.003494f, -0.002218f, 0.000901f, -0.008522f, 0.003635f, 0.003680f, -0.003262f, 0.022121f, -0.009718f, -0.019761f, 0.011732f, 0.019338f, 0.004369f, 0.004961f, -0.008594f, 0.016585f, -0.005709f, 0.002747f, 0.007442f, 0.002132f, -0.007573f, 0.007887f, 0.003406f, 0.000903f, -0.000083f, -0.015247f, -0.005399f, 0.007411f, 0.013470f, -0.005280f, -0.010016f, -0.013876f, -0.004537f, 0.004609f, 0.002524f, 0.006873f, -0.017085f, 0.003169f, 0.011465f, 0.001472f, -0.000685f, 0.004362f, -0.003580f, -0.001977f, -0.000495f, -0.000964f, 0.006009f, -0.001732f, 0.001900f, -0.001829f, -0.001264f, -0.001351f, -0.004376f, -0.002490f, 0.002057f, -0.003091f, 0.004138f, -0.000691f, -0.000757f, -0.002038f, -0.002461f, -0.012982f, 0.001213f, 0.006896f, -0.000354f, 0.002387f, -0.001251f, 0.004265f, 0.001442f, -0.002564f, -0.002991f, 0.002377f, 0.056604f, -0.015511f, 0.000341f, -0.005712f, -0.003621f, -0.012614f, -0.000286f, -0.033170f, 0.017224f, -0.011926f, -0.000843f, 0.019187f, 0.009475f, -0.012746f, -0.013676f, -0.005127f, -0.011696f, 0.010542f, -0.027442f, + 0.005053f, 0.011353f, 0.015683f, 0.003075f, 0.004664f, 0.000619f, 0.002541f, -0.003643f, -0.008643f, -0.025090f, -0.003725f, 0.003157f, 0.011510f, -0.009057f, 0.011097f, 0.004311f, -0.004591f, -0.001641f, 0.008586f, -0.009113f, -0.008616f, -0.004978f, -0.006594f, -0.001015f, -0.022229f, -0.010425f, -0.005334f, -0.000665f, 0.017548f, 0.003888f, 0.016738f, 0.005730f, -0.000810f, -0.010588f, 0.001243f, 0.000993f, 0.002513f, 0.005754f, 0.023474f, 0.002696f, -0.022065f, 0.005630f, -0.008682f, -0.000671f, -0.008354f, -0.009355f, -0.004407f, 0.008949f, 0.005779f, -0.039059f, -0.014689f, -0.011666f, 0.007333f, -0.001743f, -0.008431f, -0.005439f, 0.021956f, -0.009109f, 0.016855f, -0.016006f, -0.012043f, -0.017328f, -0.009477f, -0.018416f, -0.002937f, 0.024432f, 0.005665f, -0.003032f, 0.002858f, 0.010340f, -0.000286f, 0.012763f, -0.007308f, 0.004869f, 0.007102f, 0.008630f, 0.003360f, -0.001624f, -0.017083f, -0.006392f, -0.008818f, 0.000035f, 0.005418f, 0.004664f, -0.003532f, -0.001319f, 0.007076f, 0.002885f, -0.005708f, -0.002452f, -0.004035f, -0.001836f, 0.000210f, 0.003597f, -0.003087f, -0.003022f, + 0.009016f, 0.007593f, 0.002321f, -0.001188f, 0.003192f, 0.006190f, 0.000352f, -0.005699f, -0.000667f, -0.005815f, 0.001341f, -0.005234f, 0.002904f, -0.008737f, -0.009501f, 0.007094f, -0.017657f, 0.001039f, -0.041277f, 0.010001f, -0.013479f, 0.003984f, -0.014011f, -0.030543f, -0.004638f, -0.007146f, 0.021703f, 0.009127f, 0.007857f, -0.000777f, 0.028788f, -0.021631f, 0.005343f, 0.008115f, 0.022262f, -0.025608f, -0.014513f, -0.005105f, 0.002189f, -0.001753f, -0.007179f, -0.002415f, 0.007750f, -0.013805f, 0.002899f, 0.008106f, -0.001489f, 0.001075f, -0.011020f, -0.012759f, -0.007785f, 0.034310f, 0.000408f, -0.008381f, 0.013457f, -0.008278f, -0.017178f, -0.014183f, -0.009262f, -0.002507f, 0.006197f, 0.001249f, 0.001296f, 0.019049f, 0.017542f, -0.003166f, 0.006325f, 0.004190f, -0.021914f, -0.015136f, -0.000840f, -0.001776f, -0.005649f, -0.015039f, 0.018582f, 0.022289f, -0.018159f, 0.012032f, 0.011430f, -0.003580f, -0.017346f, -0.028210f, -0.027213f, -0.021090f, -0.012291f, -0.024343f, 0.002350f, -0.019927f, 0.012082f, 0.010754f, 0.001912f, 0.000241f, -0.033876f, 0.002228f, 0.000773f, 0.002510f, + -0.017293f, 0.005862f, 0.019472f, 0.002608f, 0.005049f, -0.015397f, -0.009400f, -0.001881f, -0.016087f, 0.003792f, 0.010254f, -0.004781f, -0.005878f, -0.007446f, 0.006464f, 0.010309f, -0.017868f, -0.009850f, -0.000733f, 0.012043f, 0.004615f, -0.005225f, 0.004382f, -0.000611f, -0.000032f, 0.005432f, -0.003301f, 0.006996f, -0.007830f, -0.002791f, 0.006007f, 0.005112f, -0.001815f, 0.013536f, 0.001040f, -0.008436f, -0.007016f, -0.001179f, -0.005745f, -0.005321f, 0.000908f, 0.003848f, -0.002330f, -0.016825f, -0.014301f, -0.009753f, -0.011214f, -0.003426f, -0.025341f, 0.001184f, 0.027447f, -0.009653f, 0.014400f, -0.005748f, 0.027362f, 0.023333f, 0.009486f, -0.028515f, -0.007476f, 0.038201f, -0.010019f, 0.028328f, 0.004269f, -0.027082f, -0.013914f, 0.031999f, 0.000516f, -0.021465f, 0.000330f, -0.018298f, -0.002697f, 0.006513f, 0.002449f, -0.003643f, -0.032043f, -0.028284f, 0.007639f, 0.020503f, -0.018379f, -0.001585f, 0.007811f, -0.001350f, 0.002957f, 0.034043f, 0.006093f, 0.004973f, 0.002777f, 0.011264f, -0.015233f, -0.010660f, -0.007899f, -0.035848f, -0.012335f, -0.013446f, -0.009447f, 0.009476f, + 0.006167f, -0.002258f, -0.003727f, -0.014178f, -0.021649f, 0.028069f, -0.006195f, -0.024649f, -0.011698f, 0.005021f, 0.018654f, -0.014891f, -0.004806f, -0.015806f, -0.003108f, -0.018887f, -0.003774f, -0.004022f, -0.038100f, 0.003487f, -0.012919f, 0.026304f, -0.006903f, -0.021372f, -0.040397f, -0.026555f, -0.005143f, 0.003344f, 0.014029f, -0.010417f, -0.009636f, -0.021943f, 0.019992f, 0.033953f, 0.003502f, -0.004025f, 0.011471f, -0.008869f, 0.012698f, -0.009576f, -0.004703f, 0.004371f, 0.009701f, 0.007047f, -0.011926f, 0.000413f, 0.002415f, -0.000157f, -0.000902f, -0.002981f, 0.003160f, 0.012054f, -0.005098f, -0.010599f, -0.000501f, -0.002378f, 0.005489f, -0.000088f, 0.011692f, 0.000812f, 0.004263f, 0.000412f, -0.007204f, 0.001881f, -0.002892f, 0.012581f, 0.000721f, -0.008025f, -0.001525f, -0.001954f, 0.008418f, 0.000825f, -0.009219f, -0.001429f, 0.006496f, -0.003015f, 0.001593f, 0.013106f, -0.046400f, -0.023748f, -0.015943f, -0.025432f, -0.013562f, -0.010432f, -0.026305f, 0.027641f, -0.007990f, 0.041740f, -0.021067f, -0.031567f, -0.006116f, -0.021207f, 0.035974f, -0.012418f, -0.018947f, -0.008824f, + 0.009656f, 0.018239f, 0.015713f, -0.003840f, -0.004208f, -0.008286f, 0.003975f, 0.029597f, -0.000779f, 0.002782f, -0.009535f, -0.003790f, -0.015515f, -0.005122f, 0.006894f, 0.005056f, -0.012826f, 0.000567f, -0.018984f, 0.003761f, -0.005667f, -0.005735f, 0.007765f, 0.003561f, -0.008837f, -0.003598f, 0.016239f, 0.006047f, -0.013435f, -0.017745f, 0.029535f, -0.001464f, -0.047012f, 0.024401f, -0.005208f, -0.020041f, 0.009482f, -0.002969f, 0.002165f, -0.004653f, 0.016364f, 0.006247f, 0.001685f, 0.045089f, 0.044600f, -0.015823f, 0.004879f, -0.033610f, -0.007113f, -0.006538f, 0.014248f, -0.005229f, 0.002325f, 0.013665f, -0.010132f, 0.025695f, -0.010894f, 0.002728f, -0.034933f, 0.014402f, -0.009084f, -0.024573f, 0.012295f, -0.005777f, 0.049212f, 0.011594f, 0.009391f, 0.018078f, 0.002049f, -0.017304f, -0.001356f, -0.007215f, -0.004211f, 0.004796f, -0.006079f, 0.009885f, 0.006160f, -0.007661f, 0.012554f, 0.006963f, -0.008211f, -0.002307f, 0.000768f, 0.001117f, -0.003358f, 0.002524f, 0.004416f, -0.001342f, -0.003668f, 0.000696f, 0.003930f, 0.002149f, 0.002983f, -0.008081f, 0.008055f, -0.016017f, + 0.014101f, -0.009489f, -0.005422f, -0.001257f, 0.007366f, 0.010300f, 0.002834f, -0.012223f, 0.000146f, -0.005055f, -0.002859f, 0.002684f, -0.011536f, -0.021215f, 0.006213f, 0.055829f, -0.041843f, -0.013374f, -0.026452f, -0.017585f, 0.021224f, -0.024056f, 0.051306f, -0.005973f, 0.015745f, 0.002883f, 0.012543f, -0.031801f, 0.005941f, 0.008404f, -0.002251f, -0.004745f, -0.002694f, 0.009457f, -0.019462f, -0.011819f, -0.002672f, -0.005494f, -0.024081f, -0.021433f, -0.005662f, -0.009887f, 0.029309f, -0.007563f, -0.013753f, -0.009960f, 0.010137f, -0.014957f, -0.006261f, -0.025923f, 0.012251f, -0.009877f, 0.010806f, -0.009148f, 0.013715f, -0.006912f, -0.044712f, -0.022778f, 0.006696f, -0.003452f, -0.002663f, -0.013933f, -0.026601f, -0.001495f, 0.011826f, 0.007940f, -0.005995f, 0.008832f, 0.013791f, 0.042515f, -0.018156f, 0.020161f, -0.047744f, 0.003048f, 0.007080f, -0.005646f, -0.013677f, 0.009729f, 0.001850f, 0.002248f, 0.010787f, 0.033799f, 0.022961f, 0.017335f, -0.009009f, -0.010867f, 0.016755f, -0.020325f, 0.005051f, 0.017114f, -0.012066f, 0.042272f, -0.000614f, 0.013138f, -0.011491f, 0.024390f, + -0.023157f, -0.022818f, 0.000776f, 0.008573f, -0.010449f, -0.002539f, 0.026414f, 0.000260f, 0.024050f, 0.008797f, -0.003692f, -0.003786f, -0.013689f, -0.001095f, -0.000707f, 0.006789f, -0.000874f, -0.011012f, 0.001929f, 0.004962f, 0.013635f, -0.019882f, 0.003442f, -0.010090f, 0.004210f, 0.011360f, -0.003881f, -0.000309f, -0.010378f, 0.003423f, 0.003880f, -0.006727f, -0.023945f, -0.014994f, -0.009464f, 0.004648f, -0.012655f, -0.007189f, -0.008488f, -0.007605f, 0.004816f, 0.009253f, -0.000265f, 0.007677f, 0.002948f, 0.004090f, 0.001402f, -0.017314f, 0.014689f, -0.012779f, 0.022423f, 0.066077f, 0.046809f, -0.012574f, -0.029303f, -0.019856f, 0.040119f, -0.047682f, 0.002553f, -0.012088f, -0.011694f, 0.019497f, -0.034952f, 0.004660f, -0.017881f, -0.000442f, -0.024321f, -0.018763f, 0.002835f, 0.001273f, 0.000977f, -0.023486f, 0.037439f, 0.007586f, -0.016752f, 0.006790f, -0.004949f, 0.003291f, 0.055820f, 0.017639f, -0.015586f, -0.013712f, 0.002708f, 0.017323f, 0.004670f, -0.041733f, -0.010278f, -0.028848f, -0.009638f, -0.013501f, 0.014097f, -0.007774f, -0.003967f, -0.000268f, -0.001440f, -0.020454f, + -0.023765f, 0.015491f, -0.009004f, 0.004203f, -0.001119f, 0.020792f, -0.016878f, -0.012053f, 0.005285f, 0.008697f, -0.022344f, 0.024953f, -0.015631f, -0.036364f, -0.033925f, -0.012109f, -0.009741f, -0.014694f, -0.007606f, -0.051702f, 0.018254f, -0.024524f, -0.007792f, -0.020470f, 0.028669f, 0.009332f, 0.013715f, 0.000008f, -0.004407f, -0.024993f, -0.007571f, 0.033788f, -0.027813f, 0.040941f, 0.031236f, 0.011008f, -0.007377f, 0.001447f, -0.005787f, 0.005917f, -0.018091f, -0.014504f, -0.009032f, 0.002535f, -0.002484f, 0.002641f, 0.007630f, -0.013088f, -0.003278f, 0.013273f, 0.013769f, -0.005367f, 0.008554f, -0.007266f, -0.011822f, -0.005152f, -0.003730f, 0.008818f, 0.002321f, 0.003364f, -0.011699f, -0.007574f, 0.003986f, -0.004244f, 0.003702f, 0.004949f, 0.008242f, 0.016479f, 0.006469f, 0.009298f, -0.011084f, -0.006233f, -0.003847f, 0.004947f, -0.005436f, 0.002344f, -0.005042f, 0.002452f, 0.016557f, 0.008002f, 0.004424f, -0.003033f, 0.010374f, 0.003487f, -0.004461f, -0.065192f, -0.008065f, 0.043435f, -0.053257f, -0.021186f, -0.001283f, -0.016280f, 0.019320f, -0.011043f, 0.060219f, -0.006002f, + -0.013082f, -0.009910f, -0.002653f, 0.017705f, -0.011957f, -0.011544f, 0.049141f, -0.035914f, -0.004371f, 0.011534f, -0.007951f, 0.030846f, 0.017343f, -0.002033f, -0.003853f, 0.013165f, 0.017471f, 0.019132f, 0.015589f, 0.032643f, 0.010365f, 0.014120f, 0.008464f, -0.010421f, 0.054417f, 0.006988f, 0.010157f, 0.013895f, 0.008093f, 0.039428f, -0.002818f, 0.009841f, 0.013529f, 0.011502f, 0.006404f, 0.026065f, -0.015364f, -0.012233f, 0.025781f, -0.004599f, -0.026072f, -0.006548f, -0.045569f, -0.015349f, -0.008771f, 0.043256f, -0.040840f, -0.005141f, 0.001743f, -0.001265f, -0.002379f, 0.025560f, 0.069620f, -0.012026f, 0.008704f, 0.008094f, 0.010531f, 0.033357f, -0.036045f, -0.036850f, -0.033640f, 0.059435f, 0.004358f, -0.022191f, 0.054428f, -0.020650f, 0.047448f, -0.025445f, 0.018186f, 0.002124f, -0.063174f, -0.009064f, -0.015819f, 0.018201f, -0.001339f, -0.005330f, 0.000376f, 0.011480f, -0.001726f, -0.019043f, 0.010290f, 0.000389f, -0.008967f, -0.000073f, -0.016836f, 0.022701f, -0.002463f, 0.008216f, -0.010758f, -0.009588f, -0.009621f, -0.012731f, -0.001239f, 0.000464f, 0.021529f, -0.000879f, + 0.002360f, -0.008538f, 0.002380f, -0.020347f, 0.006484f, -0.019610f, -0.003671f, -0.004173f, -0.017616f, 0.009409f, -0.013951f, -0.013926f, 0.003064f, -0.019458f, 0.005991f, 0.015697f, 0.014569f, -0.007281f, -0.006889f, 0.003837f, 0.005906f, 0.013654f, 0.017319f, 0.038621f, 0.003519f, -0.038923f, -0.114456f, 0.022932f, -0.027487f, -0.044245f, 0.049590f, -0.029698f, -0.015280f, -0.043571f, 0.011321f, -0.008618f, -0.042566f, -0.013780f, -0.025269f, 0.011952f, -0.023400f, 0.001202f, 0.009145f, 0.019211f, 0.009770f, 0.032498f, 0.005138f, -0.000166f, -0.003338f, -0.027238f, -0.020933f, -0.019374f, 0.015764f, 0.024315f, 0.011309f, 0.008691f, -0.000663f, 0.009438f, 0.019049f, 0.044399f, -0.020953f, -0.011599f, 0.007811f, -0.020062f, 0.021368f, 0.004714f, -0.019362f, 0.045188f, 0.016509f, -0.037890f, 0.015041f, -0.036445f, 0.004365f, 0.007060f, 0.019273f, -0.010299f, -0.012298f, 0.057436f, 0.022326f, -0.024579f, 0.015018f, 0.030425f, -0.023485f, -0.049922f, 0.027821f, -0.003933f, -0.000517f, 0.004197f, 0.012234f, 0.077695f, -0.007158f, 0.009799f, 0.014934f, -0.000154f, 0.017905f, 0.010520f, + -0.041107f, 0.008837f, -0.021835f, -0.019053f, -0.011455f, 0.009486f, -0.066426f, -0.007996f, 0.020845f, 0.003391f, 0.033147f, -0.024199f, 0.023508f, -0.015773f, -0.006865f, -0.008837f, 0.010582f, 0.004703f, -0.008046f, 0.000164f, 0.000087f, -0.011685f, 0.009509f, -0.014777f, 0.015753f, 0.002195f, 0.011007f, 0.009380f, -0.006615f, -0.005431f, 0.002853f, -0.004046f, 0.002386f, 0.003729f, -0.006419f, -0.002263f, -0.007392f, -0.005168f, -0.004813f, -0.013237f, 0.000363f, 0.001953f, 0.007871f, -0.004205f, 0.007586f, 0.018193f, -0.009375f, 0.003054f, -0.009407f, 0.004872f, 0.005858f, -0.015157f, 0.000270f, 0.004982f, -0.014298f, -0.007077f, 0.012642f, 0.000205f, 0.002600f, 0.002861f, 0.000579f, -0.035409f, -0.040747f, 0.087396f, 0.018696f, -0.005649f, -0.010520f, 0.019711f, 0.078988f, 0.036228f, 0.009461f, -0.002290f, 0.026490f, 0.065954f, 0.016426f, 0.022737f, 0.020583f, 0.047022f, -0.030301f, 0.030455f, 0.013556f, -0.090295f, 0.026765f, -0.012773f, 0.026789f, -0.028121f, 0.021256f, 0.014095f, 0.028069f, -0.000228f, 0.011920f, 0.004392f, -0.025601f, 0.012770f, 0.025428f, -0.021321f, + 0.012793f, -0.020704f, -0.012426f, 0.064728f, 0.006641f, 0.057309f, -0.040761f, 0.017843f, -0.002063f, -0.008211f, -0.001258f, -0.004990f, 0.008932f, 0.021001f, 0.014599f, -0.001605f, 0.032776f, -0.052214f, -0.049185f, 0.035690f, -0.027984f, -0.007227f, -0.006534f, -0.033771f, 0.017041f, -0.008910f, 0.009627f, 0.005224f, 0.055499f, 0.026930f, 0.029255f, 0.010967f, 0.007863f, -0.050473f, -0.011602f, 0.024808f, -0.000462f, 0.000618f, -0.000039f, -0.016206f, -0.043890f, 0.008386f, 0.004061f, -0.032878f, 0.004645f, -0.015808f, -0.012989f, 0.013777f, 0.009284f, 0.049776f, -0.007144f, 0.012642f, 0.011889f, -0.009610f, -0.012877f, -0.001424f, -0.012243f, -0.004741f, 0.029318f, 0.012230f, 0.005287f, 0.001435f, -0.000570f, 0.000668f, -0.000401f, -0.001783f, -0.019948f, -0.006126f, 0.012133f, -0.003523f, 0.001190f, -0.007430f, -0.010096f, -0.004151f, 0.003194f, 0.023758f, -0.015908f, -0.015392f, 0.013962f, 0.006812f, -0.017868f, 0.012520f, 0.007540f, -0.012700f, 0.015858f, 0.001255f, -0.009585f, -0.004509f, -0.006660f, -0.003063f, -0.003112f, 0.007830f, 0.003926f, 0.003877f, 0.008995f, 0.013086f, + 0.009713f, -0.002635f, 0.022689f, -0.079222f, 0.067586f, -0.028487f, 0.013354f, 0.043732f, -0.063330f, -0.001654f, -0.005089f, 0.015436f, 0.024129f, 0.027524f, 0.047810f, 0.008017f, -0.030117f, 0.016837f, 0.050897f, -0.071715f, -0.041776f, 0.048170f, 0.002899f, -0.000371f, 0.002706f, 0.004126f, -0.000866f, -0.001239f, 0.025056f, 0.015103f, -0.034010f, 0.002187f, -0.009255f, 0.059903f, 0.036666f, -0.012250f, 0.004061f, 0.007198f, 0.007891f, -0.000402f, 0.022212f, 0.002177f, 0.017168f, 0.061136f, 0.008882f, 0.006431f, -0.008806f, 0.015689f, -0.057711f, -0.025196f, -0.024006f, -0.002618f, 0.006588f, -0.051330f, 0.020572f, -0.045562f, 0.015740f, 0.047189f, -0.010028f, -0.042532f, -0.022525f, 0.017558f, -0.008079f, -0.086851f, 0.023949f, -0.060627f, -0.013037f, -0.007565f, 0.002142f, -0.024326f, 0.006288f, 0.030565f, -0.025031f, -0.057615f, -0.086458f, 0.067603f, 0.020635f, -0.010621f, 0.019346f, -0.020482f, 0.020670f, 0.037487f, -0.038953f, 0.067206f, 0.009274f, -0.007164f, 0.031229f, 0.017717f, -0.010830f, 0.017351f, 0.001271f, 0.018730f, -0.018228f, -0.009711f, 0.005059f, 0.013533f, + 0.023323f, 0.006931f, 0.021023f, -0.013921f, 0.011933f, 0.021842f, 0.019385f, -0.003252f, 0.017647f, -0.018969f, 0.007512f, 0.001789f, 0.008120f, 0.036418f, -0.024335f, 0.014474f, 0.001981f, -0.001389f, 0.028424f, 0.007760f, 0.037058f, -0.004889f, 0.018305f, 0.004842f, 0.014440f, 0.004128f, -0.007623f, 0.011086f, -0.019152f, 0.016523f, -0.007098f, 0.013680f, -0.003284f, 0.003664f, -0.001554f, 0.002747f, -0.000276f, 0.014323f, -0.003275f, -0.003574f, -0.001948f, 0.006100f, -0.000715f, -0.001606f, 0.000670f, 0.002980f, 0.002052f, 0.002473f, -0.001796f, 0.002471f, -0.002108f, 0.002335f, 0.001641f, 0.002613f, -0.004965f, 0.096578f, -0.103926f, 0.042017f, 0.052840f, -0.065110f, -0.020089f, -0.035051f, -0.019312f, 0.095892f, -0.043169f, 0.068054f, -0.031945f, -0.009158f, -0.017303f, 0.022311f, 0.008320f, -0.082912f, -0.015858f, -0.021940f, 0.035547f, 0.001875f, 0.014765f, 0.028878f, -0.040772f, -0.007461f, -0.026167f, 0.014593f, 0.033470f, 0.021108f, -0.052654f, -0.008995f, 0.010079f, 0.007150f, -0.003685f, -0.024475f, -0.010604f, -0.047010f, -0.009069f, -0.006365f, 0.043021f, -0.038329f, + 0.094447f, 0.021123f, -0.028149f, 0.042099f, 0.001073f, 0.054613f, 0.029270f, 0.051850f, 0.012266f, 0.047398f, 0.038057f, 0.046384f, 0.048252f, 0.007678f, 0.046683f, -0.059970f, -0.010781f, 0.012961f, -0.040094f, -0.006580f, 0.024628f, -0.046440f, -0.068833f, 0.027847f, 0.044112f, 0.001751f, 0.009931f, -0.047590f, -0.013205f, -0.039748f, -0.001851f, 0.046158f, 0.003524f, 0.085941f, 0.038558f, -0.021254f, 0.090085f, 0.048172f, -0.026839f, -0.009946f, -0.019229f, -0.028295f, -0.018402f, 0.022537f, -0.013045f, -0.044024f, 0.007138f, 0.031550f, 0.001023f, -0.014157f, -0.011805f, -0.008828f, -0.015056f, -0.026488f, 0.004626f, -0.005781f, -0.003649f, -0.020320f, -0.001996f, -0.006843f, 0.009059f, 0.015325f, -0.004576f, 0.003469f, -0.006033f, -0.015706f, 0.010495f, -0.003800f, -0.012612f, -0.030130f, 0.014210f, -0.041719f, -0.005946f, -0.028727f, -0.017912f, -0.023236f, -0.006202f, -0.003124f, -0.008692f, -0.016046f, -0.008251f, -0.018381f, -0.003559f, -0.001517f, -0.001464f, -0.012080f, 0.019402f, -0.014709f, 0.009184f, -0.134939f, 0.123038f, -0.027912f, -0.040786f, -0.035959f, 0.085288f, -0.064715f, + -0.010259f, -0.018586f, -0.000565f, 0.045644f, -0.050684f, -0.004671f, 0.020391f, -0.015364f, -0.006520f, 0.001158f, -0.028567f, 0.040804f, 0.002685f, -0.066804f, -0.016463f, -0.016258f, 0.004501f, -0.073214f, -0.000238f, 0.008601f, -0.014131f, 0.000514f, 0.020371f, 0.045006f, -0.018289f, -0.011517f, 0.010039f, -0.030334f, -0.093690f, 0.008024f, 0.075097f, -0.038229f, -0.057509f, 0.003859f, 0.060669f, -0.028250f, -0.017574f, -0.078168f, -0.012267f, 0.001468f, 0.056047f, 0.025690f, 0.007484f, -0.058979f, -0.033285f, 0.046208f, -0.055205f, 0.019511f, 0.092295f, 0.051901f, 0.071649f, -0.034504f, 0.041907f, 0.026385f, -0.079567f, -0.029445f, -0.042598f, -0.010606f, 0.047319f, -0.002264f, 0.051145f, 0.041261f, -0.079070f, 0.088418f, -0.053562f, -0.000257f, 0.004782f, -0.040663f, 0.087613f, -0.005939f, -0.020068f, 0.070137f, -0.056841f, -0.009888f, -0.081197f, -0.027792f, 0.037404f, -0.011634f, 0.033858f, 0.036118f, -0.008227f, -0.014312f, 0.006350f, -0.020008f, -0.022889f, -0.006533f, -0.016809f, -0.010274f, -0.013587f, 0.005779f, -0.016940f, 0.003308f, -0.021416f, -0.021333f, -0.018732f, 0.015789f, + -0.010991f, -0.001952f, 0.011167f, 0.002622f, -0.003744f, -0.023291f, -0.036115f, -0.023441f, -0.047131f, 0.034701f, 0.014547f, 0.030031f, 0.010949f, -0.025719f, -0.026007f, -0.013718f, -0.003544f, 0.038141f, -0.007871f, -0.000264f, 0.005202f, -0.006161f, -0.006169f, -0.003298f, -0.014254f, 0.026559f, -0.016671f, 0.034079f, -0.000176f, 0.080417f, 0.057072f, 0.008411f, -0.015387f, -0.041778f, 0.024474f, -0.003282f, -0.003727f, -0.002654f, -0.001371f, 0.000177f, -0.015963f, 0.020250f, -0.000384f, -0.071764f, 0.018039f, 0.006432f, -0.024792f, 0.000948f, 0.031039f, -0.010456f, 0.002113f, -0.051894f, 0.037826f, -0.018466f, -0.005558f, -0.005233f, 0.021552f, -0.028124f, -0.000999f, 0.006396f, 0.000897f, 0.005943f, -0.013297f, 0.038434f, -0.020098f, 0.067750f, -0.041640f, -0.044448f, 0.041939f, -0.046966f, 0.002524f, 0.035014f, -0.032369f, -0.014475f, 0.018728f, 0.021800f, 0.028937f, -0.103351f, 0.032982f, -0.000983f, -0.023567f, 0.065536f, -0.032812f, 0.004021f, 0.000418f, -0.055653f, 0.071411f, -0.003403f, -0.003027f, -0.037499f, -0.006677f, 0.058830f, -0.013629f, -0.002216f, 0.002431f, 0.016961f, + 0.009874f, -0.072654f, 0.035920f, 0.064739f, -0.033912f, 0.025938f, -0.050576f, 0.084872f, 0.003919f, -0.079214f, 0.001171f, 0.044187f, -0.004363f, -0.049210f, -0.010975f, 0.115636f, -0.017908f, -0.047632f, 0.008110f, 0.051013f, -0.013095f, -0.015945f, -0.005904f, -0.002263f, 0.003096f, 0.002302f, -0.012863f, 0.033676f, -0.005359f, -0.007912f, 0.001986f, 0.011503f, 0.028316f, -0.008424f, -0.013684f, 0.015546f, 0.003604f, -0.026097f, -0.009439f, 0.014008f, 0.003303f, -0.010902f, -0.005766f, 0.022499f, -0.020358f, -0.004115f, 0.003601f, 0.003239f, -0.019220f, -0.007799f, 0.025098f, -0.001352f, -0.017895f, -0.007615f, 0.018218f, -0.005324f, -0.013413f, -0.011465f, 0.015933f, -0.045099f, -0.149482f, -0.226614f, 0.015290f, 0.195996f, 0.003087f, 0.512756f, 0.464781f, 0.278253f, 0.536568f, 0.352054f, -0.058136f, 0.020366f, -0.068809f, -0.422378f, -0.239828f, -0.185862f, -0.412530f, -0.339270f, -0.100055f, -0.199164f, -0.228699f, -0.018637f, 0.013650f, -0.096749f, 0.021251f, 0.087534f, -0.111747f, -0.095009f, 0.149845f, 0.030654f, -0.036262f, 0.104562f, 0.140353f, -0.000177f, 0.143965f, 0.243653f, + 0.087363f, 0.066832f, 0.248454f, 0.167915f, 0.020343f, 0.182381f, 0.269142f, 0.118222f, 0.137646f, 0.306668f, 0.116510f, 0.041853f, 0.292951f, 0.288288f, 0.089155f, 0.347226f, 0.493838f, 0.184067f, 0.202761f, 0.344318f, 0.105095f, -0.111484f, 0.019802f, -0.114514f, -0.414853f, -0.395754f, -0.422600f, -0.678989f, -0.733859f, -0.784840f, -0.928142f, -0.971019f, -0.948387f, -0.923100f, -0.812624f, -0.729338f, -0.596309f, -0.394042f, -0.281196f, -0.097143f, 0.268073f, 0.434737f, 0.429483f, 0.795226f, 0.848073f, 0.660042f, 0.804393f, 0.842573f, 0.452384f, 0.471889f, 0.578726f, 0.280891f, 0.227249f, 0.375517f, 0.272549f, 0.127946f, 0.177408f, 0.237393f, 0.101047f, 0.082355f, 0.238594f, 0.125991f, -0.021624f, 0.130593f, 0.102106f, -0.074591f, 0.010399f, 0.093961f, -0.062012f, -0.027208f, 0.176419f, 0.069614f, 0.006696f, 0.169567f, 0.111547f, -0.016779f, 0.009220f, -0.074436f, -0.249732f, -0.340026f, -0.375796f, -0.493061f, -0.527310f, -0.526973f, -0.570600f, -0.576145f, -0.603146f, -0.605173f, -0.553032f, -0.549495f, -0.461063f, -0.356306f, -0.282023f, -0.118233f, 0.102660f, 0.220242f, + 0.367838f, 0.459937f, 0.487368f, 0.464364f, 0.423833f, 0.359710f, 0.292163f, 0.254092f, 0.222374f, 0.181837f, 0.163934f, 0.158788f, 0.144731f, 0.135148f, 0.141296f, 0.131086f, 0.109369f, 0.092388f, 0.071787f, 0.039073f, 0.014936f, -0.023538f, -0.052515f, -0.052787f, -0.033977f, -0.016373f, -0.003910f}, + {0.005473f, 0.017776f, 0.003983f, 0.002579f, -0.004035f, -0.001472f, -0.008775f, -0.000378f, -0.002241f, 0.006581f, 0.005838f, -0.005886f, -0.004232f, -0.003557f, -0.003370f, -0.004192f, 0.000460f, 0.005237f, -0.004162f, -0.004476f, -0.014653f, -0.010791f, -0.007927f, -0.000372f, 0.000789f, 0.010745f, -0.005921f, 0.005325f, 0.003295f, 0.002737f, 0.000646f, -0.008028f, 0.002058f, -0.017115f, 0.002088f, 0.000528f, 0.000808f, -0.001175f, -0.010554f, -0.004812f, -0.009098f, 0.000558f, 0.000586f, -0.005503f, -0.014128f, 0.009712f, -0.000682f, -0.008270f, -0.000039f, 0.005511f, 0.001200f, -0.002853f, 0.002008f, -0.004710f, -0.002031f, -0.004445f, 0.003422f, -0.004731f, 0.006661f, 0.005386f, -0.001069f, -0.009414f, 0.000492f, 0.001299f, -0.000837f, -0.003451f, 0.002384f, 0.001673f, -0.002147f, 0.005086f, 0.005541f, 0.003823f, 0.000366f, 0.000024f, 0.001772f, -0.005113f, 0.000709f, 0.007869f, 0.000920f, 0.001504f, 0.001457f, 0.005815f, 0.002235f, 0.001828f, 0.005219f, -0.001289f, 0.004109f, -0.001607f, 0.002682f, 0.001883f, -0.000716f, 0.001114f, 0.001515f, -0.000464f, 0.001917f, 0.002938f, + 0.000702f, 0.000063f, 0.002083f, 0.002769f, 0.002212f, -0.000333f, 0.000841f, 0.000908f, 0.001081f, 0.000318f, 0.000175f, -0.000214f, -0.000691f, -0.002188f, 0.001426f, 0.000160f, -0.018896f, -0.021209f, -0.001506f, -0.008383f, 0.006478f, -0.010390f, 0.002611f, 0.004811f, -0.007086f, 0.005799f, 0.021224f, 0.001198f, -0.001953f, 0.011641f, 0.001577f, 0.011689f, 0.000181f, 0.005341f, -0.008353f, -0.011061f, -0.000599f, 0.004212f, -0.007698f, -0.002467f, -0.000781f, -0.002160f, 0.002108f, -0.002250f, -0.004066f, 0.003860f, -0.001917f, -0.001599f, 0.008338f, 0.011906f, -0.003708f, -0.006377f, 0.002367f, 0.009533f, 0.003612f, 0.012214f, 0.000510f, -0.001696f, -0.000314f, 0.010903f, 0.000699f, -0.007765f, -0.004277f, 0.008566f, 0.006197f, 0.006670f, 0.001808f, -0.004216f, -0.008795f, 0.001765f, 0.004138f, 0.005164f, -0.001896f, -0.004579f, 0.009506f, 0.006417f, -0.001579f, -0.005288f, 0.000317f, -0.003669f, 0.009908f, 0.003076f, 0.001816f, 0.003205f, 0.001106f, 0.002099f, 0.006087f, 0.001122f, 0.006115f, -0.001138f, 0.009748f, 0.001244f, -0.009649f, -0.003763f, -0.003363f, 0.004848f, + 0.005956f, -0.000901f, 0.001590f, -0.006690f, -0.002457f, -0.006226f, -0.001913f, -0.004036f, -0.003496f, -0.001415f, 0.002045f, 0.000156f, 0.000054f, 0.000332f, 0.002696f, 0.000496f, 0.000612f, -0.000268f, -0.002897f, -0.000750f, 0.000150f, -0.000214f, 0.001168f, 0.000515f, 0.000499f, -0.001030f, 0.011136f, 0.007810f, 0.011726f, 0.012209f, -0.002927f, 0.006119f, -0.002617f, -0.006914f, -0.000645f, 0.018085f, 0.007915f, 0.004043f, 0.006433f, -0.007531f, 0.012889f, 0.005536f, 0.008636f, -0.002538f, -0.014309f, 0.006025f, -0.022326f, 0.004542f, -0.005703f, 0.004501f, 0.003518f, -0.000407f, -0.007686f, 0.001868f, 0.005014f, -0.002973f, 0.004702f, 0.011335f, -0.000813f, -0.009369f, -0.012792f, 0.002014f, 0.005717f, -0.011758f, 0.006547f, -0.011049f, -0.007221f, 0.008052f, -0.004670f, -0.009337f, -0.004561f, -0.006582f, 0.010334f, 0.014208f, 0.008036f, -0.005087f, 0.000061f, 0.007597f, 0.004527f, -0.000626f, -0.005801f, -0.002738f, -0.005091f, 0.005419f, 0.017550f, -0.000124f, -0.009520f, -0.007501f, 0.004071f, 0.001444f, -0.003568f, -0.010377f, -0.000193f, -0.008887f, -0.003497f, 0.001415f, + -0.001526f, 0.007077f, 0.001319f, 0.008883f, 0.010322f, -0.009043f, -0.003334f, 0.000519f, -0.007068f, -0.008471f, -0.001357f, 0.000053f, -0.005192f, 0.004986f, -0.004718f, -0.000577f, 0.003928f, 0.000801f, 0.000282f, 0.003892f, -0.004772f, -0.001640f, 0.001130f, 0.001804f, -0.002161f, 0.001557f, 0.000847f, 0.001758f, -0.000266f, -0.000030f, 0.001790f, -0.002430f, 0.003121f, -0.002434f, 0.001528f, 0.000485f, -0.000693f, -0.000186f, 0.001389f, -0.000998f, -0.001625f, -0.002751f, 0.001724f, -0.002019f, 0.000758f, 0.002635f, -0.000362f, -0.001677f, 0.024915f, -0.006694f, 0.002429f, 0.003557f, -0.016434f, -0.014003f, 0.000365f, 0.016284f, 0.012424f, 0.019684f, 0.006493f, -0.005556f, -0.008470f, 0.001451f, -0.004862f, 0.003880f, 0.001881f, 0.006651f, 0.012228f, 0.003895f, 0.009016f, -0.000254f, 0.005346f, -0.005426f, -0.011390f, -0.005970f, -0.008718f, 0.000118f, -0.002434f, 0.002658f, -0.013876f, -0.006928f, -0.001857f, 0.005134f, -0.006859f, 0.014378f, -0.016202f, 0.003476f, -0.010203f, -0.008276f, 0.004711f, 0.004128f, 0.013872f, -0.001541f, 0.003506f, -0.003961f, 0.009716f, 0.010268f, + 0.002855f, -0.002214f, -0.010440f, -0.001449f, 0.003603f, -0.008005f, 0.008023f, -0.008812f, 0.003780f, 0.014566f, 0.012209f, 0.000179f, -0.004705f, 0.002281f, 0.014563f, -0.001821f, 0.003580f, 0.002262f, 0.011900f, 0.000117f, -0.003178f, -0.007392f, 0.005189f, -0.011139f, 0.004053f, 0.023165f, 0.005694f, 0.010907f, 0.001080f, -0.015329f, 0.005540f, 0.002845f, -0.006050f, 0.006252f, -0.001944f, -0.001671f, -0.007647f, 0.003193f, 0.007519f, 0.003356f, 0.001444f, -0.003496f, -0.007527f, 0.001736f, -0.001501f, -0.001176f, 0.000482f, -0.000385f, -0.001426f, 0.002421f, -0.002569f, -0.002338f, -0.002214f, 0.003408f, 0.001362f, 0.002681f, -0.001518f, 0.002472f, 0.000135f, -0.002447f, 0.002617f, 0.001425f, -0.002173f, -0.004148f, -0.001516f, 0.003404f, 0.000208f, -0.000903f, 0.001709f, 0.001543f, 0.003700f, -0.000180f, -0.001457f, -0.009084f, -0.015538f, 0.007838f, -0.011079f, -0.011422f, 0.002354f, -0.005536f, -0.036553f, 0.003542f, 0.005648f, 0.033458f, 0.010841f, 0.002477f, -0.015189f, 0.013942f, 0.006047f, -0.006074f, 0.007313f, -0.001272f, 0.012166f, -0.007344f, -0.003760f, -0.002476f, + -0.003223f, -0.005045f, -0.002177f, 0.008633f, 0.007567f, 0.013065f, 0.004684f, 0.006406f, -0.000120f, -0.008516f, -0.009188f, 0.012374f, -0.006767f, 0.002743f, -0.001101f, -0.008754f, 0.012577f, -0.002109f, -0.005426f, 0.002178f, 0.009161f, -0.006096f, 0.013901f, -0.017610f, -0.014543f, -0.017860f, 0.004340f, -0.010068f, -0.015258f, -0.003532f, 0.014295f, -0.006069f, 0.004301f, 0.008452f, -0.006125f, -0.008077f, 0.000665f, 0.001295f, 0.004792f, 0.000851f, -0.004441f, -0.000537f, 0.018414f, 0.007781f, -0.007489f, -0.023186f, -0.018492f, 0.006739f, 0.021902f, 0.018380f, -0.014350f, 0.000338f, -0.009360f, 0.004117f, 0.003644f, -0.015726f, -0.001244f, 0.003077f, 0.001837f, -0.004294f, 0.000939f, 0.000905f, 0.000478f, 0.005286f, 0.004870f, -0.003173f, -0.003828f, 0.002571f, -0.001862f, 0.001181f, -0.005478f, 0.002205f, 0.001634f, -0.008782f, -0.001971f, 0.001834f, 0.001323f, 0.000674f, 0.001713f, -0.000587f, 0.000632f, 0.000598f, 0.000864f, -0.003241f, -0.000453f, 0.001070f, -0.001024f, -0.003930f, -0.001948f, 0.000468f, 0.000597f, 0.004162f, -0.006531f, 0.010830f, -0.018207f, -0.003030f, + -0.022563f, -0.006537f, 0.003345f, 0.007953f, -0.020567f, -0.005039f, 0.014087f, -0.001616f, -0.020586f, 0.010753f, -0.006590f, -0.011690f, 0.006449f, 0.010887f, 0.002444f, 0.002348f, 0.003722f, 0.014198f, -0.006699f, -0.005778f, 0.003689f, -0.006911f, -0.003567f, 0.000271f, -0.000795f, 0.000553f, 0.011313f, 0.005886f, -0.001316f, -0.000909f, 0.006611f, 0.002854f, 0.008120f, -0.000628f, 0.009167f, 0.009781f, 0.003868f, -0.010518f, 0.001531f, -0.001411f, -0.007536f, 0.010272f, -0.005783f, 0.004344f, -0.007001f, -0.002503f, -0.025210f, 0.002376f, 0.020465f, 0.001875f, 0.021756f, -0.003949f, -0.004890f, -0.022338f, 0.026288f, 0.012449f, 0.014979f, 0.002515f, 0.012278f, -0.000079f, -0.000096f, 0.010305f, -0.005989f, 0.003766f, -0.000042f, -0.025062f, 0.005764f, -0.005837f, 0.006638f, -0.003730f, 0.005991f, 0.023369f, 0.007032f, 0.006197f, -0.000283f, -0.014108f, 0.010627f, -0.005699f, 0.002132f, 0.005382f, 0.007007f, -0.007750f, -0.002060f, -0.003182f, -0.004220f, 0.004596f, -0.002654f, -0.001992f, -0.003315f, 0.000579f, 0.000851f, 0.000386f, -0.006522f, 0.002650f, 0.001131f, -0.001431f, + 0.001882f, 0.000942f, 0.001641f, 0.001390f, 0.003099f, 0.000057f, 0.000660f, -0.000370f, -0.001499f, 0.003932f, -0.000735f, 0.005530f, 0.000855f, 0.002316f, -0.001696f, 0.003053f, 0.001016f, -0.028948f, -0.000955f, 0.021761f, -0.004770f, 0.012879f, -0.013890f, -0.009584f, -0.025007f, 0.014275f, 0.007411f, 0.016575f, 0.007749f, -0.008184f, 0.013976f, -0.003546f, 0.013372f, -0.008819f, -0.008145f, 0.001000f, -0.002990f, 0.011568f, 0.002430f, 0.009752f, 0.010923f, -0.006563f, -0.005583f, -0.003884f, 0.007194f, -0.001503f, -0.004643f, 0.001460f, -0.009836f, 0.005058f, 0.003484f, -0.005202f, 0.007279f, 0.012758f, -0.005115f, -0.005831f, -0.001541f, -0.009688f, -0.004690f, 0.014666f, 0.002000f, -0.009133f, 0.017868f, -0.019676f, 0.003114f, 0.010490f, -0.004495f, -0.006501f, -0.001441f, 0.008356f, -0.014983f, 0.007476f, -0.006078f, -0.012908f, -0.009638f, -0.007815f, 0.000294f, -0.003714f, -0.008191f, 0.003501f, 0.022194f, 0.012199f, -0.002993f, -0.007665f, -0.021427f, 0.002226f, 0.011953f, -0.007041f, -0.023681f, 0.000585f, -0.003683f, 0.001139f, 0.003033f, 0.010826f, -0.000591f, -0.005589f, + -0.002056f, -0.008716f, -0.005060f, -0.004153f, 0.006585f, -0.005435f, 0.006116f, -0.012701f, 0.001126f, -0.005864f, -0.003800f, 0.007631f, -0.003599f, -0.003693f, -0.004350f, 0.001510f, -0.008006f, -0.003292f, -0.001784f, -0.000380f, 0.001805f, -0.005799f, 0.001700f, -0.004614f, 0.002591f, 0.002939f, 0.006721f, 0.001180f, 0.002482f, 0.003431f, 0.002759f, -0.001970f, 0.001161f, 0.000351f, 0.005025f, 0.002796f, -0.000421f, 0.002898f, -0.000161f, 0.000198f, -0.001944f, 0.000243f, 0.000103f, -0.003562f, 0.001125f, -0.002478f, -0.001765f, 0.000190f, 0.002711f, -0.000798f, 0.009631f, -0.004242f, 0.002450f, 0.014236f, 0.000925f, 0.016678f, 0.018079f, 0.040343f, 0.027512f, 0.016871f, -0.004289f, -0.021371f, -0.007456f, 0.019578f, 0.008464f, -0.020643f, 0.015400f, -0.003604f, -0.010247f, -0.012634f, 0.001879f, 0.034878f, -0.023648f, 0.025221f, 0.009837f, -0.005438f, 0.008277f, -0.006823f, 0.018042f, -0.006935f, 0.009525f, 0.001894f, -0.012538f, -0.008780f, -0.012216f, 0.000463f, 0.010313f, -0.002989f, -0.006894f, 0.006646f, 0.000847f, -0.002091f, -0.023608f, 0.007136f, -0.013232f, -0.010010f, + 0.006496f, 0.015547f, -0.011501f, -0.016550f, 0.000573f, 0.014035f, 0.001144f, -0.009438f, -0.003531f, -0.005621f, 0.006388f, 0.004662f, -0.005443f, -0.008921f, -0.013409f, 0.008279f, 0.021472f, 0.013160f, 0.006773f, -0.012473f, 0.006450f, 0.013596f, -0.015278f, -0.019937f, 0.003475f, -0.016462f, -0.007885f, -0.032270f, 0.000405f, -0.022161f, -0.011555f, 0.005957f, -0.002795f, -0.002134f, 0.009800f, 0.001668f, -0.018090f, -0.012543f, 0.008142f, -0.002505f, 0.000977f, -0.005629f, 0.000523f, 0.005278f, -0.000797f, 0.003498f, 0.003512f, 0.000723f, 0.000323f, 0.002596f, 0.003029f, 0.002016f, 0.000229f, 0.000625f, -0.001833f, 0.004775f, 0.000117f, 0.004395f, -0.000794f, -0.002926f, 0.001415f, 0.004091f, -0.005141f, -0.007543f, -0.003856f, -0.001092f, -0.002372f, 0.008577f, 0.003219f, -0.002699f, 0.003803f, -0.002173f, 0.000564f, -0.006912f, -0.000631f, 0.000502f, -0.003176f, 0.044143f, 0.000988f, -0.017279f, 0.019457f, -0.021283f, 0.024632f, 0.001998f, -0.015005f, -0.025696f, -0.006229f, 0.012610f, -0.020433f, 0.018134f, -0.002897f, 0.011692f, 0.013920f, -0.011949f, -0.004977f, -0.007190f, + -0.009525f, -0.003699f, -0.008899f, 0.001487f, -0.010876f, 0.011316f, 0.007140f, 0.009499f, 0.019256f, 0.009920f, -0.002877f, 0.022979f, 0.011705f, 0.004251f, -0.012335f, -0.013439f, 0.006886f, -0.010286f, 0.002362f, 0.007268f, -0.015347f, 0.013143f, 0.034995f, 0.002677f, 0.024887f, 0.011793f, 0.012038f, 0.017782f, 0.001030f, 0.009429f, 0.009942f, -0.022647f, -0.015373f, 0.015642f, 0.001040f, 0.014764f, 0.002621f, 0.015500f, -0.002508f, 0.005584f, 0.003849f, -0.032445f, -0.002143f, 0.008354f, 0.021712f, 0.004864f, 0.019042f, 0.001952f, -0.004495f, 0.006266f, 0.008542f, -0.018202f, -0.030813f, -0.016241f, 0.004234f, 0.007605f, 0.001028f, 0.022636f, 0.007971f, -0.035421f, 0.009020f, -0.005118f, 0.000187f, 0.010225f, -0.014227f, -0.000458f, -0.007666f, 0.006554f, 0.009165f, 0.000589f, 0.001979f, 0.006665f, 0.000270f, -0.000026f, -0.003071f, -0.003362f, 0.001206f, 0.000709f, 0.000228f, 0.005578f, 0.004020f, 0.001438f, 0.003337f, 0.002196f, 0.000159f, -0.005383f, 0.004348f, 0.003605f, -0.002126f, -0.000422f, -0.000739f, 0.000324f, 0.003187f, 0.002696f, 0.008419f, -0.006991f, + -0.001985f, 0.003221f, -0.001701f, 0.004482f, -0.003478f, 0.007449f, -0.001721f, -0.002165f, 0.001081f, 0.004307f, 0.003038f, -0.000945f, -0.000433f, -0.021294f, -0.001945f, -0.018947f, -0.009053f, 0.008139f, -0.009731f, 0.004407f, 0.006418f, -0.011303f, -0.028482f, 0.009246f, -0.028218f, -0.032212f, 0.006939f, -0.015762f, 0.014194f, 0.020515f, -0.005298f, 0.023916f, -0.005839f, 0.023632f, 0.031909f, 0.000209f, 0.001802f, -0.032143f, -0.006196f, 0.003685f, 0.005444f, -0.003592f, -0.021376f, 0.001673f, -0.018115f, 0.002489f, -0.004947f, 0.005103f, -0.007010f, -0.011750f, 0.002626f, -0.001934f, -0.006668f, 0.007776f, 0.000672f, -0.004733f, 0.023032f, 0.008780f, 0.017272f, -0.010769f, 0.003118f, -0.009049f, 0.006532f, -0.001869f, 0.009013f, -0.002852f, -0.006934f, -0.008668f, -0.020530f, -0.011871f, 0.032916f, 0.013555f, 0.021805f, -0.025126f, 0.005257f, 0.018923f, -0.016030f, 0.000343f, 0.012160f, -0.006431f, 0.012203f, 0.001952f, -0.022187f, -0.005550f, -0.034114f, -0.004012f, 0.013658f, 0.007297f, 0.022779f, 0.002786f, 0.015107f, 0.016390f, 0.005552f, -0.000814f, 0.029535f, 0.002709f, + 0.000699f, -0.004874f, -0.003000f, 0.015884f, 0.009110f, 0.015204f, -0.001859f, -0.002876f, -0.003918f, 0.011168f, 0.002147f, -0.002065f, 0.002877f, 0.007737f, -0.001886f, -0.004197f, -0.008804f, 0.000540f, -0.007048f, -0.002845f, -0.006030f, 0.005236f, -0.000823f, -0.009933f, -0.002011f, 0.001014f, 0.000614f, -0.000235f, -0.004956f, 0.007198f, -0.005763f, 0.002043f, 0.002465f, -0.007408f, -0.001591f, -0.004854f, 0.000880f, 0.006438f, -0.005646f, -0.004173f, -0.003581f, -0.003051f, 0.003260f, -0.020766f, -0.018910f, -0.019659f, -0.029155f, 0.019942f, 0.012583f, 0.001951f, -0.019693f, 0.017791f, -0.000379f, -0.024407f, -0.020330f, -0.006846f, -0.005236f, -0.015572f, -0.006431f, -0.009169f, -0.008146f, -0.005661f, -0.022972f, 0.011541f, 0.013084f, -0.001029f, -0.002354f, -0.003999f, -0.008643f, -0.026861f, -0.029705f, 0.001048f, 0.012543f, -0.007637f, -0.018394f, -0.010052f, 0.013565f, 0.010300f, 0.000418f, -0.005539f, -0.008054f, -0.007762f, 0.017213f, -0.008761f, 0.012020f, -0.008284f, 0.000097f, -0.029242f, -0.006668f, -0.002185f, 0.021904f, 0.006224f, -0.005467f, -0.016390f, -0.011761f, -0.022993f, + 0.037031f, -0.017036f, 0.035152f, 0.004636f, -0.015556f, 0.023495f, 0.022730f, 0.039894f, -0.039302f, 0.016265f, 0.006195f, 0.005371f, -0.008045f, -0.011103f, 0.016944f, 0.009034f, -0.003275f, -0.018205f, 0.020038f, -0.010588f, 0.021562f, 0.018164f, 0.016798f, -0.015403f, 0.033465f, -0.024855f, 0.013565f, 0.021876f, -0.012880f, 0.002816f, 0.000286f, 0.019016f, -0.005377f, 0.008500f, -0.010223f, 0.020311f, -0.000998f, 0.003636f, -0.011970f, 0.009319f, -0.001007f, 0.009609f, -0.003136f, 0.012921f, 0.005902f, 0.004133f, -0.007964f, 0.002509f, -0.006736f, 0.000449f, -0.005799f, -0.007210f, -0.001866f, -0.006360f, -0.004700f, -0.000609f, -0.003685f, -0.006339f, 0.003984f, 0.005421f, 0.007440f, 0.001908f, -0.007778f, 0.000770f, -0.005397f, 0.005051f, 0.001639f, -0.003533f, 0.000522f, 0.003553f, 0.001636f, -0.008196f, 0.001161f, 0.008375f, 0.002793f, -0.001231f, 0.001916f, 0.031520f, -0.052807f, -0.057096f, -0.035567f, -0.006152f, -0.024741f, 0.015130f, -0.020318f, 0.001943f, 0.010394f, -0.001695f, 0.037655f, 0.026848f, 0.009743f, -0.011154f, -0.008178f, 0.026069f, -0.004212f, 0.003898f, + -0.010567f, -0.023582f, 0.000247f, 0.009315f, 0.006459f, -0.013039f, 0.011528f, 0.001456f, -0.001347f, 0.022061f, 0.030786f, 0.002030f, -0.019389f, -0.008594f, -0.037359f, -0.014716f, -0.009528f, -0.011440f, 0.001867f, 0.006399f, -0.013474f, -0.005629f, -0.018917f, 0.020398f, 0.024852f, 0.020399f, 0.023216f, 0.017945f, 0.030328f, 0.003522f, 0.010518f, 0.006983f, -0.005310f, 0.011446f, 0.018141f, -0.018218f, -0.062180f, -0.014698f, 0.020873f, -0.032489f, 0.016628f, 0.020179f, 0.007523f, -0.010018f, 0.001720f, -0.007957f, -0.024881f, -0.007014f, 0.016448f, -0.020226f, -0.016794f, 0.005813f, -0.013609f, 0.040382f, 0.041429f, -0.015500f, 0.026727f, 0.006806f, -0.003764f, -0.018292f, 0.012848f, -0.024602f, -0.020026f, 0.021956f, 0.016890f, 0.011519f, -0.001438f, -0.002370f, -0.029586f, -0.021595f, -0.003798f, -0.006994f, -0.005421f, -0.004683f, -0.008679f, -0.007521f, -0.008087f, -0.004346f, 0.001179f, 0.006770f, 0.005639f, 0.009050f, -0.000695f, -0.004674f, -0.004368f, -0.003283f, 0.013485f, 0.012200f, 0.006514f, -0.001408f, -0.000784f, -0.003120f, -0.004951f, -0.008057f, -0.003385f, 0.001151f, + -0.002255f, 0.005158f, -0.002828f, 0.001774f, 0.002626f, 0.002029f, 0.005157f, -0.006238f, -0.000081f, 0.000936f, 0.004365f, -0.007468f, 0.012381f, -0.005404f, -0.003122f, 0.050812f, -0.042754f, -0.000887f, 0.007341f, -0.041089f, -0.012018f, -0.017407f, 0.006259f, -0.012621f, 0.035661f, 0.004462f, -0.000356f, 0.044288f, -0.002429f, -0.039508f, -0.031481f, -0.019472f, 0.015298f, -0.002459f, -0.038079f, 0.009603f, 0.010712f, 0.019870f, -0.022620f, 0.011333f, 0.019394f, 0.016598f, 0.013585f, -0.004871f, 0.023161f, 0.024707f, 0.008514f, -0.055798f, 0.040706f, -0.020169f, 0.015741f, -0.004301f, -0.005672f, 0.010386f, -0.024519f, -0.014337f, 0.026219f, -0.012222f, -0.003305f, 0.023335f, -0.026322f, 0.023465f, -0.009079f, 0.021760f, -0.029005f, 0.038539f, -0.017168f, 0.059786f, -0.007759f, 0.003453f, 0.015575f, -0.013635f, -0.009756f, -0.007653f, 0.005017f, -0.003437f, -0.030130f, -0.038371f, -0.010372f, 0.021689f, -0.011256f, -0.014192f, -0.038585f, 0.017446f, 0.004139f, -0.053323f, -0.000614f, 0.000291f, 0.007976f, 0.026798f, -0.018323f, 0.008073f, -0.023578f, -0.021219f, -0.031327f, -0.031871f, + -0.005405f, -0.018841f, 0.022913f, -0.004260f, 0.022386f, -0.011312f, 0.012830f, -0.002276f, -0.014040f, -0.020282f, -0.002094f, 0.001845f, 0.009850f, -0.005230f, 0.004439f, 0.001412f, 0.008095f, -0.001333f, -0.010320f, -0.002076f, -0.015708f, -0.001298f, 0.002761f, 0.002950f, 0.001082f, -0.006606f, -0.007523f, 0.008152f, 0.004234f, -0.003229f, 0.010128f, -0.013111f, -0.016467f, -0.000929f, 0.014984f, -0.000289f, 0.004478f, 0.005207f, 0.010311f, -0.000053f, 0.011517f, -0.009892f, 0.003835f, 0.001580f, 0.009402f, 0.014907f, -0.009507f, 0.001809f, -0.002084f, 0.001833f, 0.019329f, 0.059360f, 0.029209f, -0.017717f, 0.040458f, 0.013687f, -0.026256f, 0.010304f, 0.026062f, -0.003779f, -0.009201f, -0.035994f, -0.010075f, 0.022683f, 0.014394f, 0.010953f, 0.006360f, -0.006240f, -0.014787f, -0.033949f, 0.018015f, -0.011369f, 0.008870f, -0.025991f, -0.014451f, -0.000342f, -0.004260f, 0.034003f, 0.009949f, 0.005690f, 0.025592f, 0.012706f, -0.039219f, -0.004238f, 0.014078f, -0.006989f, 0.000621f, 0.033613f, 0.010767f, 0.038973f, -0.022681f, -0.013856f, -0.006523f, -0.014083f, 0.014984f, -0.014691f, + 0.028929f, 0.029315f, -0.012917f, -0.027969f, 0.047252f, -0.024059f, -0.010022f, -0.005338f, 0.013960f, 0.007576f, -0.026615f, -0.007540f, 0.016769f, -0.012224f, 0.021315f, -0.009800f, 0.030268f, -0.015443f, 0.006716f, 0.046884f, -0.001088f, 0.033141f, 0.056601f, 0.007552f, 0.027720f, -0.014021f, -0.068412f, -0.045882f, -0.009008f, -0.002532f, 0.038649f, -0.000872f, 0.012831f, 0.003694f, -0.009790f, -0.031227f, -0.070591f, 0.053720f, 0.003546f, 0.001987f, 0.017302f, 0.008725f, -0.017317f, 0.039828f, 0.001842f, 0.008743f, -0.000620f, 0.003080f, -0.034875f, -0.012478f, -0.023034f, -0.013391f, -0.001246f, -0.012480f, -0.013059f, 0.008512f, -0.002934f, -0.008446f, 0.025306f, -0.004286f, -0.025972f, -0.018029f, 0.006382f, 0.001736f, -0.007609f, 0.039836f, 0.011779f, -0.012694f, -0.015322f, 0.004572f, -0.003638f, -0.007671f, 0.001190f, 0.004118f, -0.008955f, 0.009846f, -0.000387f, 0.014003f, 0.017430f, 0.003947f, -0.001725f, -0.004761f, 0.011671f, 0.011911f, 0.010193f, -0.077011f, -0.018549f, 0.080650f, -0.030989f, -0.034405f, 0.071050f, -0.045485f, 0.040025f, 0.053707f, 0.021132f, 0.007528f, + -0.040693f, 0.015748f, -0.071353f, -0.034957f, 0.015621f, 0.037301f, 0.004218f, 0.008777f, 0.027077f, 0.072404f, 0.048837f, 0.015496f, 0.002757f, 0.000179f, 0.008109f, 0.006237f, -0.027914f, 0.000886f, 0.017968f, 0.022881f, 0.096436f, 0.054604f, 0.037252f, 0.069878f, 0.028570f, -0.009620f, 0.021062f, -0.000959f, 0.066816f, 0.024485f, -0.005248f, -0.010733f, 0.028053f, -0.003897f, 0.032196f, -0.098947f, 0.004530f, 0.034626f, -0.001799f, 0.041835f, -0.015219f, 0.011384f, 0.022345f, -0.092047f, -0.035448f, -0.006784f, -0.029308f, -0.037842f, -0.044837f, 0.042762f, -0.027286f, 0.008936f, -0.008095f, 0.042937f, -0.069124f, -0.018554f, -0.009405f, 0.022354f, 0.000083f, -0.005854f, 0.051665f, 0.089921f, -0.000007f, 0.028369f, -0.016475f, 0.008098f, 0.062984f, -0.065916f, -0.039043f, -0.055066f, -0.069745f, -0.005548f, -0.002314f, -0.027077f, -0.029282f, -0.027567f, -0.026269f, -0.033898f, -0.049575f, -0.021239f, -0.031963f, -0.019264f, 0.009270f, 0.044673f, 0.014623f, 0.007304f, 0.007172f, -0.003735f, 0.010371f, 0.004918f, -0.030739f, -0.027546f, -0.007548f, -0.039070f, -0.015214f, -0.016867f, + -0.013072f, -0.015003f, 0.018753f, -0.013813f, 0.001716f, 0.003340f, 0.008446f, 0.022509f, 0.033972f, 0.000254f, -0.007798f, 0.024863f, -0.011675f, 0.016077f, 0.006548f, 0.004008f, -0.005882f, 0.005048f, 0.003713f, -0.013612f, -0.018192f, -0.019742f, -0.002171f, 0.042483f, 0.036196f, -0.034035f, -0.123395f, -0.021583f, 0.049700f, 0.012033f, -0.014311f, -0.009285f, 0.003205f, -0.016555f, -0.023130f, 0.027482f, 0.019598f, 0.056235f, 0.019722f, 0.033971f, -0.013177f, 0.074695f, 0.012845f, 0.047507f, -0.007196f, 0.068940f, -0.026571f, 0.045062f, -0.044031f, 0.000810f, 0.004274f, 0.032321f, -0.013091f, -0.023360f, -0.058051f, 0.032479f, 0.003701f, 0.007014f, -0.028327f, -0.051149f, -0.003675f, 0.006450f, -0.006864f, 0.016282f, 0.032729f, 0.005494f, 0.023265f, 0.085356f, -0.036212f, 0.008991f, -0.028450f, 0.044322f, 0.037560f, -0.042097f, 0.039746f, 0.046393f, -0.033261f, 0.012152f, 0.010352f, 0.032304f, 0.015268f, 0.065127f, 0.019926f, -0.022425f, 0.003449f, 0.084031f, 0.026049f, -0.095000f, 0.027769f, 0.017608f, -0.082602f, -0.022342f, -0.026726f, -0.057556f, 0.003802f, 0.036355f, + 0.038912f, -0.022802f, 0.070290f, -0.017674f, -0.031048f, -0.015304f, 0.037012f, -0.138185f, -0.017280f, 0.002530f, 0.111537f, 0.015338f, 0.094530f, 0.046079f, 0.066258f, -0.001361f, 0.022542f, -0.012245f, 0.056117f, 0.057741f, 0.051075f, -0.011921f, -0.034496f, -0.013481f, 0.056093f, -0.006117f, -0.037079f, -0.015489f, 0.066528f, 0.009829f, -0.041775f, -0.013689f, 0.060016f, 0.017745f, 0.024877f, -0.000292f, 0.022562f, -0.016693f, -0.001370f, -0.000780f, 0.009691f, -0.001084f, 0.010504f, -0.007848f, -0.019689f, -0.022619f, -0.028418f, -0.003207f, -0.020764f, 0.000514f, -0.003779f, -0.007541f, 0.019911f, -0.022242f, -0.009373f, -0.022048f, -0.008406f, -0.040900f, -0.030894f, 0.042374f, 0.000743f, -0.076071f, 0.061680f, 0.133080f, 0.008862f, -0.073779f, 0.114621f, -0.025689f, -0.001714f, 0.016514f, 0.064994f, -0.037237f, 0.002750f, 0.130374f, -0.064592f, 0.031179f, 0.043839f, 0.042268f, -0.057771f, -0.005645f, 0.010319f, -0.028113f, 0.004909f, 0.013760f, -0.023498f, 0.023303f, -0.039827f, -0.011096f, -0.015958f, -0.002816f, -0.023917f, -0.020719f, -0.007736f, 0.012743f, -0.043428f, -0.040374f, + 0.060997f, 0.011284f, -0.038228f, -0.009803f, 0.036279f, 0.088299f, -0.007688f, -0.042731f, 0.045950f, 0.067775f, -0.019633f, -0.004792f, 0.001752f, 0.024686f, 0.000183f, 0.000295f, 0.030717f, -0.074384f, 0.051193f, -0.042811f, 0.000550f, -0.060780f, 0.034249f, -0.004535f, -0.091144f, 0.045230f, -0.006506f, -0.035025f, 0.061509f, 0.007476f, 0.060820f, -0.051196f, -0.019701f, -0.020534f, -0.047584f, -0.073590f, -0.097679f, 0.083157f, 0.033894f, 0.061285f, 0.056281f, 0.035083f, 0.013587f, -0.034868f, 0.053293f, -0.026228f, -0.022428f, 0.072406f, 0.024095f, -0.013318f, -0.006471f, 0.022260f, -0.051141f, 0.013449f, -0.020210f, 0.034137f, -0.013009f, -0.021585f, 0.032311f, 0.005775f, -0.038016f, 0.003357f, -0.018015f, -0.010292f, 0.008042f, -0.007994f, 0.006954f, -0.001769f, -0.027387f, -0.013528f, 0.011840f, -0.008792f, -0.017276f, 0.017444f, 0.026935f, 0.026797f, -0.021287f, -0.008371f, 0.030962f, -0.052195f, 0.015750f, 0.019604f, -0.022536f, -0.051853f, 0.026243f, 0.003648f, -0.023578f, 0.016705f, -0.025241f, -0.040264f, 0.010652f, 0.036859f, -0.030226f, -0.012630f, 0.012861f, 0.032237f, + -0.008785f, -0.003553f, 0.001735f, -0.021852f, 0.072163f, -0.029414f, 0.021377f, 0.016633f, -0.074850f, 0.067239f, 0.023529f, -0.019309f, 0.057777f, 0.004753f, 0.003846f, 0.028165f, -0.025118f, 0.073645f, -0.059220f, -0.031790f, 0.027465f, 0.025286f, 0.012518f, -0.055165f, -0.033556f, -0.061464f, 0.033859f, 0.008017f, 0.030918f, -0.000089f, 0.033204f, 0.013273f, 0.011071f, 0.001178f, 0.028286f, -0.012958f, 0.015533f, -0.028219f, 0.020942f, -0.026106f, -0.000325f, -0.034414f, -0.024425f, 0.001227f, -0.030560f, 0.014042f, 0.072445f, 0.017118f, -0.054530f, 0.028138f, 0.021692f, 0.038234f, 0.000934f, 0.063734f, -0.055160f, 0.008136f, 0.025367f, -0.053358f, -0.012559f, 0.106783f, 0.060101f, -0.142043f, -0.060373f, 0.075058f, -0.020792f, -0.067592f, 0.026300f, -0.007247f, -0.052114f, 0.037680f, 0.064216f, -0.087767f, 0.017028f, 0.077193f, -0.052846f, -0.047611f, 0.063173f, 0.008071f, -0.052511f, 0.008827f, 0.040943f, -0.046111f, -0.006666f, 0.049554f, -0.007690f, -0.022806f, -0.036195f, 0.045263f, -0.012468f, 0.024992f, 0.005557f, 0.025378f, -0.018177f, 0.016214f, 0.045788f, 0.017642f, + -0.034470f, 0.002171f, -0.024799f, -0.017125f, -0.034751f, -0.003759f, -0.009623f, -0.003106f, -0.023537f, 0.022872f, 0.019794f, -0.008761f, 0.052293f, -0.014102f, -0.056675f, 0.066828f, -0.008567f, -0.013627f, 0.011894f, 0.022874f, 0.002591f, -0.007091f, 0.056442f, 0.030516f, -0.040690f, 0.002532f, 0.015591f, -0.029965f, -0.024687f, 0.040355f, -0.021936f, -0.079173f, 0.074703f, 0.008670f, -0.076981f, -0.003210f, 0.039433f, -0.029651f, -0.064896f, 0.035992f, 0.048619f, -0.080116f, 0.010827f, 0.058502f, -0.035751f, -0.007182f, 0.064317f, -0.005913f, -0.027542f, 0.014187f, 0.026585f, -0.036829f, -0.010781f, 0.037125f, -0.009814f, 0.061760f, -0.134354f, -0.010475f, -0.023077f, -0.151157f, -0.026061f, -0.047209f, 0.015587f, 0.025006f, 0.045322f, -0.020679f, -0.057797f, -0.022993f, -0.083776f, 0.010505f, 0.031133f, 0.016698f, 0.014286f, -0.068882f, 0.042614f, 0.005814f, -0.080945f, 0.058943f, -0.087105f, -0.036780f, -0.032135f, 0.023084f, 0.064519f, 0.073034f, -0.005181f, -0.017400f, -0.141474f, 0.060357f, 0.145022f, 0.051776f, 0.004198f, -0.079957f, -0.115154f, -0.048427f, -0.008907f, 0.059858f, + -0.071786f, -0.044177f, -0.073767f, -0.024541f, 0.135544f, 0.144433f, -0.024399f, -0.067679f, -0.056776f, -0.031458f, -0.014434f, 0.072392f, -0.033858f, 0.021150f, 0.016147f, 0.047919f, -0.012470f, -0.033508f, -0.083885f, -0.037505f, 0.130081f, 0.054608f, 0.086881f, -0.079558f, -0.042806f, -0.037224f, 0.088768f, 0.001101f, -0.141989f, -0.138547f, 0.078134f, 0.132243f, 0.223883f, 0.038333f, -0.188398f, 0.031028f, -0.049056f, 0.063746f, 0.063050f, -0.232658f, -0.072998f, 0.044685f, 0.123270f, 0.029097f, -0.117061f, -0.027088f, -0.010762f, 0.068021f, 0.059666f, 0.015037f, -0.093509f, -0.015425f, 0.021877f, 0.041552f, 0.022137f, -0.025285f, 0.005227f, -0.052960f, -0.005432f, -0.001508f, 0.051834f, -0.035270f, 0.068746f, -0.043698f, 0.020541f, 0.038556f, -0.014850f, 0.031878f, 0.030097f, 0.052367f, 0.004098f, -0.026332f, -0.029134f, 0.004166f, 0.004020f, 0.008347f, 0.007009f, -0.002383f, -0.002063f, -0.019802f, -0.018704f, -0.004653f, 0.035039f, -0.009238f, 0.002522f, -0.007615f, 0.012820f, 0.001902f, 0.020324f, -0.067704f, 0.057694f, -0.060331f, -0.013888f, 0.002845f, 0.014786f, -0.010919f, + 0.013193f, 0.024260f, -0.039937f, -0.033171f, -0.001413f, 0.009478f, 0.024544f, -0.027861f, 0.003334f, 0.022273f, -0.017534f, 0.014096f, -0.009434f, 0.067017f, -0.001633f, -0.009505f, 0.037522f, 0.021453f, 0.033265f, -0.016654f, 0.020989f, -0.006385f, -0.001610f, 0.028518f, 0.019213f, 0.005176f, 0.007659f, 0.038276f, -0.035926f, -0.010124f, 0.003070f, 0.051463f, -0.001520f, -0.010960f, 0.046681f, -0.011530f, -0.021303f, -0.019987f, 0.038554f, -0.008793f, 0.016438f, 0.011027f, 0.005263f, -0.013260f, 0.006339f, 0.015842f, 0.004690f, 0.044882f, 0.021288f, 0.013151f, -0.019931f, -0.002326f, 0.016185f, -0.031062f, 0.010671f, 0.012631f, 0.031938f, 0.001045f, -0.004619f, 0.019094f, 0.003338f, -0.036131f, 0.040607f, 0.013260f, -0.010403f, 0.034969f, -0.024070f, -0.002257f, -0.018160f, -0.014586f, 0.033036f, 0.025379f, -0.003114f, 0.013031f, -0.020973f, 0.005367f, -0.028009f, -0.001925f, -0.025723f, 0.006238f, 0.015293f, 0.006542f, 0.002190f, -0.004718f, -0.004270f, 0.005453f, -0.015727f, 0.005035f, -0.007299f, 0.007769f, -0.010668f, -0.002749f, -0.009946f, -0.010867f, 0.004734f, -0.001292f, + -0.001660f, -0.003547f, 0.015120f, 0.006927f, -0.021202f, -0.020450f, -0.015377f, 0.005213f, 0.005708f, 0.016228f, 0.008248f, -0.018764f, -0.003833f, -0.006579f, 0.016993f, -0.003709f, 0.018393f, 0.008814f, -0.016797f, 0.000919f, 0.007628f, -0.008223f, 0.011380f, -0.006438f, 0.012986f, -0.008984f, -0.004122f, 0.005359f, -0.008864f, 0.107095f, 0.008556f, -0.039488f, -0.032815f, 0.005369f, 0.024139f, -0.001427f, 0.022031f, -0.008358f, -0.005982f, -0.029635f, -0.006591f, -0.020739f, 0.032981f, -0.020625f, -0.001746f, -0.013005f, -0.006219f, -0.007612f, 0.003562f, -0.021917f, 0.003315f, -0.009419f, -0.015530f, 0.004591f, -0.002515f, 0.001291f, -0.004238f, 0.007785f, 0.003686f, -0.018320f, -0.011845f, 0.000039f, -0.012498f, -0.010786f, 0.009074f, -0.002922f, -0.018812f, 0.001302f, -0.010475f, 0.008061f, -0.027767f, 0.013918f, -0.012085f, -0.020993f, 0.006372f, -0.009591f, -0.010938f, 0.002905f, -0.000204f, 0.001367f, -0.004636f, 0.004714f, -0.008502f, 0.009441f, -0.005840f, 0.001053f, 0.015450f, -0.011105f, 0.005177f, -0.002880f, -0.001651f, 0.004280f, -0.012797f, 0.011697f, -0.013451f, 0.011680f, + -0.002816f, -0.000494f, -0.008614f, 0.011049f, -0.012920f, 0.000925f, 0.004557f, -0.016899f, 0.016928f, -0.010257f, 0.007182f, -0.007746f, 0.006862f, -0.005947f, -0.007504f, 0.012677f, -0.007903f, -0.001463f, 0.012372f, -0.007893f, -0.000119f, 0.001130f, 0.001955f, -0.008731f, 0.000701f, -0.000677f, -0.003866f, -0.002361f, 0.002120f, -0.002652f, -0.004767f, -0.002235f, 0.005390f, -0.004797f, 0.004038f, -0.001258f, -0.000571f, -0.001438f, -0.003663f, 0.003593f, -0.002477f, -0.002724f, 0.003700f, -0.003716f, 0.002925f, 0.001529f, -0.002343f, 0.000748f, -0.000611f, 0.001202f, -0.007481f, 0.007347f, -0.007695f, 0.001516f, -0.001143f, -0.003835f, 0.001020f, -0.002021f, 0.005227f, -0.051473f, -0.083223f, 0.088220f, 0.306289f, 0.058822f, 0.091873f, -0.188610f, -0.262493f, -0.109521f, -0.137513f, 0.106184f, 0.245877f, 0.141527f, 0.094835f, 0.009605f, -0.135710f, -0.119919f, -0.120163f, -0.048987f, 0.067946f, 0.058184f, 0.061910f, 0.055880f, -0.002014f, -0.008925f, -0.014390f, -0.019234f, -0.028614f, -0.003737f, 0.037459f, -0.003232f, -0.022023f, -0.008457f, -0.031745f, -0.017647f, -0.005669f, -0.007739f, + 0.060200f, 0.056250f, 0.033025f, 0.035756f, 0.001646f, -0.043483f, -0.044644f, -0.081441f, -0.054523f, 0.007615f, 0.006465f, 0.016788f, 0.047940f, 0.068697f, 0.040952f, 0.034674f, -0.001778f, -0.038673f, -0.054225f, -0.046483f, -0.039334f, 0.005760f, 0.013742f, 0.025274f, 0.017139f, 0.011700f, 0.002288f, -0.013973f, 0.005327f, 0.001541f, 0.005690f, 0.034250f, -0.003419f, 0.015272f, 0.015267f, -0.025155f, -0.048155f, -0.049147f, -0.044727f, 0.012015f, 0.036237f, 0.026646f, 0.039670f, 0.035395f, -0.012055f, 0.009054f, 0.021511f, -0.013819f, -0.013408f, -0.030465f, -0.039802f, -0.015145f, -0.009608f, -0.003890f, 0.016473f, 0.008047f, 0.008768f, 0.026884f, 0.025073f, 0.026471f, 0.014697f, 0.006930f, -0.013424f, -0.016048f, -0.040912f, -0.044315f, -0.031874f, -0.022922f, 0.009765f, 0.029350f, 0.036332f, 0.049389f, 0.034819f, 0.022680f, 0.000041f, -0.014970f, -0.024322f, -0.050511f, -0.054143f, -0.018724f, 0.009332f, 0.026062f, 0.020271f, 0.018239f, 0.020291f, 0.015187f, -0.001292f, -0.003501f, 0.001884f, 0.000898f, -0.009229f, -0.007666f, -0.027502f, -0.017506f, -0.001044f, 0.010226f, + 0.013125f, 0.011013f, -0.004334f, -0.000055f, 0.009614f, 0.008209f, 0.000328f, 0.005854f, 0.004520f, -0.002699f, -0.013060f, -0.011052f, -0.011327f, -0.002052f, -0.003143f, 0.000322f, 0.002158f, 0.011912f, 0.012402f, 0.011776f, 0.004800f, 0.003328f, -0.004566f, -0.003270f, -0.003263f, 0.000555f, -0.001313f} + }, + { + {0.004058f, 0.011758f, 0.000993f, 0.007867f, -0.001811f, -0.001158f, -0.004253f, 0.008388f, 0.005298f, -0.004945f, -0.006519f, 0.004220f, -0.001670f, -0.010017f, -0.011604f, 0.002738f, 0.000564f, -0.003925f, -0.003967f, -0.007815f, 0.004968f, -0.009191f, 0.002333f, -0.000918f, 0.002063f, 0.000742f, 0.001950f, -0.004138f, -0.000619f, 0.001614f, 0.002620f, -0.000956f, 0.003209f, 0.002342f, -0.004093f, 0.003055f, -0.002485f, -0.007841f, 0.011092f, -0.002151f, 0.000484f, 0.002632f, -0.001416f, 0.006113f, 0.007813f, -0.001698f, 0.002917f, 0.005873f, 0.000471f, -0.006270f, -0.004812f, 0.001551f, 0.003701f, -0.001915f, 0.002011f, 0.007211f, -0.006392f, -0.005755f, 0.005980f, 0.001125f, -0.002411f, -0.003895f, -0.000198f, 0.001353f, 0.004528f, -0.007314f, 0.003556f, 0.001838f, -0.005723f, -0.006175f, 0.005220f, -0.003369f, -0.007575f, -0.003242f, -0.000744f, 0.011367f, 0.013114f, -0.001154f, 0.002145f, -0.001656f, 0.001983f, -0.002187f, 0.003454f, 0.002107f, -0.002211f, -0.000747f, -0.002346f, 0.001108f, -0.003115f, 0.002882f, 0.002542f, 0.000573f, -0.003643f, 0.000413f, -0.000217f, 0.001555f, + -0.000978f, 0.002421f, -0.001312f, 0.000421f, 0.000108f, 0.001499f, -0.000387f, 0.000513f, 0.000390f, 0.001549f, -0.000129f, -0.014467f, -0.006246f, -0.009983f, 0.006543f, -0.004846f, -0.006772f, -0.004598f, -0.006073f, -0.001216f, 0.002244f, 0.010931f, 0.001890f, -0.005854f, 0.009236f, 0.000352f, 0.009520f, -0.009158f, 0.014743f, 0.006831f, 0.015993f, -0.002880f, -0.005445f, -0.001110f, -0.008802f, -0.000760f, -0.000630f, -0.003200f, 0.002988f, 0.000284f, -0.006991f, -0.001707f, -0.000029f, 0.002152f, 0.006935f, 0.001588f, -0.010453f, -0.008716f, -0.003306f, 0.005856f, 0.000385f, 0.000275f, -0.005302f, 0.008687f, -0.000243f, 0.000623f, -0.003759f, 0.001094f, -0.002274f, 0.004551f, -0.001488f, 0.014490f, 0.000115f, -0.001926f, 0.005489f, -0.003680f, -0.006536f, -0.002719f, 0.004904f, 0.008736f, 0.001442f, 0.005343f, 0.001309f, 0.000886f, -0.004619f, -0.004520f, -0.007393f, -0.000350f, -0.007664f, 0.001880f, 0.006218f, 0.006630f, 0.004661f, -0.002391f, -0.003406f, 0.005949f, -0.004254f, -0.001794f, 0.003714f, -0.003434f, -0.000616f, -0.001798f, 0.003844f, 0.006843f, 0.003527f, 0.001989f, + -0.001754f, -0.000797f, 0.001222f, -0.000711f, 0.004582f, 0.000755f, -0.002262f, -0.001357f, -0.001048f, -0.000337f, 0.000627f, 0.000545f, 0.000056f, -0.000740f, 0.002114f, 0.001327f, 0.000086f, 0.000799f, -0.001682f, -0.001086f, -0.001347f, -0.001579f, -0.000571f, -0.001766f, -0.001727f, -0.000398f, 0.002164f, 0.010111f, 0.010939f, 0.005775f, 0.000018f, 0.008919f, -0.004806f, -0.007589f, 0.007407f, 0.007686f, 0.009769f, 0.014357f, 0.001400f, -0.009147f, 0.005358f, -0.008724f, -0.000527f, 0.002919f, 0.002158f, 0.015990f, 0.001334f, -0.012875f, -0.000518f, 0.002298f, 0.005491f, -0.000930f, -0.004286f, -0.014175f, -0.002696f, 0.012030f, 0.004252f, 0.007912f, 0.009362f, 0.007702f, 0.002243f, -0.001341f, 0.008333f, -0.010530f, -0.000225f, -0.007159f, 0.019309f, -0.001042f, 0.000635f, 0.008552f, -0.007029f, -0.001121f, 0.003101f, -0.001078f, 0.011554f, -0.001770f, 0.003556f, 0.010965f, -0.002040f, 0.003438f, 0.001003f, -0.000531f, -0.000018f, -0.001443f, -0.003080f, 0.004739f, 0.006453f, -0.001541f, 0.006423f, 0.002309f, 0.012622f, 0.014326f, -0.000678f, 0.003830f, 0.002454f, -0.007236f, + 0.007184f, -0.001772f, -0.005952f, 0.002526f, 0.007075f, 0.001975f, -0.001747f, 0.012695f, -0.001727f, 0.003447f, 0.003886f, 0.001880f, -0.006372f, -0.000374f, -0.001243f, 0.001024f, -0.003332f, -0.000703f, 0.000457f, 0.001348f, 0.001430f, 0.002336f, -0.000754f, 0.001142f, -0.003096f, -0.002148f, -0.003856f, 0.002987f, 0.001054f, -0.000584f, 0.001253f, -0.000541f, -0.003156f, 0.002024f, 0.000372f, 0.001466f, -0.000925f, -0.001127f, 0.000623f, 0.003774f, -0.003858f, 0.015984f, 0.015623f, -0.006138f, -0.008976f, -0.007806f, -0.005394f, 0.004044f, -0.017122f, -0.001632f, 0.002348f, -0.008148f, -0.015170f, 0.014749f, -0.003201f, -0.003655f, 0.002331f, 0.006829f, 0.006016f, -0.007451f, -0.003009f, -0.000245f, -0.000842f, 0.003601f, 0.005154f, -0.002782f, 0.006345f, -0.004698f, 0.009742f, -0.001092f, 0.000375f, -0.004916f, 0.005137f, 0.001989f, -0.001506f, -0.004893f, 0.002348f, -0.002737f, -0.004377f, -0.003567f, 0.000858f, 0.003314f, -0.009248f, 0.000894f, -0.017438f, -0.009972f, 0.006260f, -0.002519f, 0.002076f, 0.004000f, 0.011471f, -0.003585f, -0.005784f, -0.000290f, 0.000363f, 0.004943f, + 0.004645f, -0.005256f, -0.002359f, 0.012794f, 0.000490f, 0.002056f, 0.001085f, 0.005763f, -0.010563f, 0.000482f, 0.005364f, 0.009977f, 0.002076f, 0.004362f, 0.014990f, -0.003555f, -0.001399f, -0.007978f, 0.000119f, 0.002599f, 0.005258f, 0.000120f, -0.003217f, 0.004712f, -0.000379f, 0.008453f, 0.000097f, -0.000197f, 0.001040f, -0.010390f, -0.005405f, -0.006095f, 0.005885f, -0.000890f, -0.001674f, 0.000018f, 0.000798f, -0.000302f, 0.003105f, -0.000859f, -0.001725f, -0.002198f, -0.001109f, -0.003160f, -0.002094f, 0.002556f, 0.000184f, -0.000795f, -0.001622f, 0.000860f, 0.000683f, 0.000310f, -0.001419f, 0.002807f, 0.001200f, 0.001801f, -0.000361f, -0.000078f, -0.001855f, -0.001988f, 0.001418f, -0.000909f, 0.001903f, 0.002524f, -0.010122f, -0.015846f, 0.006802f, -0.005174f, 0.000325f, -0.008158f, 0.006355f, -0.018292f, -0.014991f, -0.017250f, -0.005781f, -0.003652f, -0.012014f, 0.006157f, 0.016524f, -0.012133f, 0.002579f, 0.019376f, -0.004447f, -0.005271f, -0.008876f, 0.001588f, -0.000017f, 0.008596f, 0.002840f, 0.006184f, 0.004358f, -0.006287f, -0.012269f, -0.005839f, 0.007382f, -0.004155f, + -0.007492f, 0.001918f, 0.003141f, 0.002438f, 0.001595f, 0.016874f, -0.007925f, 0.009195f, -0.004359f, 0.004626f, -0.004875f, 0.014043f, -0.010408f, 0.005743f, -0.000829f, -0.008317f, 0.007800f, -0.003076f, -0.002728f, 0.008380f, 0.004479f, -0.000703f, -0.003663f, 0.007618f, 0.003777f, -0.007805f, -0.009342f, 0.006431f, 0.010393f, 0.005850f, 0.000266f, -0.004498f, 0.000551f, 0.006625f, -0.002827f, 0.008004f, -0.001858f, -0.016262f, 0.000535f, -0.007136f, 0.023193f, 0.008102f, -0.013167f, -0.007418f, -0.002583f, -0.005962f, 0.005995f, 0.005804f, 0.004410f, -0.002834f, 0.005098f, 0.004099f, 0.001455f, -0.000970f, -0.006793f, 0.001353f, 0.002357f, -0.001941f, 0.001582f, 0.002374f, -0.000897f, -0.000284f, 0.001511f, -0.000430f, -0.002009f, -0.001688f, 0.000176f, 0.001781f, -0.001833f, 0.001685f, 0.001997f, -0.002549f, -0.003243f, -0.004102f, 0.000144f, 0.002440f, -0.001104f, 0.002167f, -0.001752f, -0.000168f, 0.001658f, -0.001166f, 0.000702f, 0.006077f, -0.013485f, -0.016445f, 0.014169f, -0.002953f, -0.013418f, 0.001215f, -0.003452f, 0.013855f, 0.006852f, -0.003399f, 0.002568f, -0.000577f, + -0.002043f, -0.002343f, 0.016000f, 0.003250f, 0.000875f, -0.010791f, -0.004971f, -0.002429f, 0.005623f, 0.007151f, 0.021540f, 0.000668f, 0.000730f, -0.000530f, 0.001488f, -0.009332f, 0.000451f, 0.004041f, -0.011742f, -0.008178f, -0.007596f, -0.000836f, 0.015752f, -0.012665f, 0.002203f, 0.007311f, 0.003136f, -0.005854f, 0.006572f, -0.015841f, 0.013080f, -0.002700f, 0.000022f, 0.007216f, -0.008056f, -0.009338f, -0.014653f, 0.003235f, -0.004782f, 0.014023f, 0.004849f, 0.000465f, 0.002665f, 0.004349f, 0.010920f, -0.004702f, -0.002385f, 0.011506f, -0.002326f, -0.006379f, -0.000226f, 0.011513f, 0.011562f, 0.010648f, 0.005714f, -0.006902f, 0.006775f, 0.009641f, -0.011247f, 0.014517f, -0.008799f, -0.008128f, 0.013070f, 0.001475f, 0.018853f, -0.000141f, -0.010571f, 0.004750f, -0.004706f, 0.012581f, 0.005964f, 0.003533f, 0.000847f, 0.004372f, -0.002199f, 0.007938f, 0.002738f, 0.003206f, 0.002372f, 0.004682f, -0.000367f, -0.000306f, 0.003596f, -0.000056f, 0.002640f, -0.001332f, 0.004352f, 0.008974f, -0.005180f, -0.002303f, 0.001567f, 0.001189f, 0.000570f, 0.002336f, -0.000451f, 0.000785f, + 0.001827f, 0.004433f, 0.000316f, 0.008265f, 0.001950f, 0.001024f, -0.003685f, 0.000999f, 0.002708f, -0.003616f, 0.000800f, 0.001676f, -0.000224f, 0.001117f, -0.029522f, -0.019450f, 0.005230f, 0.009484f, 0.020186f, -0.012302f, 0.010832f, 0.002018f, 0.011408f, -0.000582f, -0.005327f, -0.006934f, 0.007043f, 0.020914f, 0.001764f, -0.001831f, -0.019957f, -0.016690f, 0.000102f, -0.012267f, -0.007225f, 0.000717f, 0.002508f, -0.012572f, -0.003772f, 0.003056f, 0.007377f, 0.003946f, -0.008144f, -0.000018f, 0.009378f, 0.007653f, 0.001578f, -0.007705f, 0.001416f, -0.004709f, 0.002264f, 0.002646f, 0.004295f, -0.005928f, 0.007443f, 0.018229f, -0.001864f, -0.001342f, 0.003523f, -0.010138f, 0.004783f, 0.014687f, -0.014471f, -0.017036f, -0.008835f, 0.001433f, -0.022096f, 0.000572f, 0.000620f, 0.003108f, 0.000203f, -0.000297f, -0.010497f, -0.005622f, -0.006822f, -0.000899f, 0.015014f, 0.022214f, 0.000617f, 0.001494f, 0.010812f, -0.004500f, -0.001866f, 0.005059f, 0.024946f, 0.003192f, 0.008960f, 0.017565f, 0.003192f, -0.011333f, 0.004708f, 0.005280f, -0.005261f, 0.005434f, 0.004499f, -0.001128f, + -0.005440f, 0.002603f, 0.001585f, -0.001131f, -0.009287f, 0.004138f, 0.008502f, 0.003235f, 0.006192f, 0.003514f, 0.007475f, -0.001567f, -0.002821f, 0.006945f, 0.005714f, -0.001720f, -0.000392f, -0.002003f, 0.004919f, 0.005405f, -0.004322f, 0.005371f, 0.001421f, 0.000717f, 0.001328f, 0.002947f, 0.003982f, 0.000583f, 0.003479f, -0.002296f, -0.001267f, 0.000048f, -0.000629f, 0.001493f, -0.002327f, 0.000420f, -0.000702f, 0.001092f, -0.003134f, 0.015276f, 0.009445f, -0.013940f, -0.000693f, 0.030221f, 0.026538f, 0.005733f, 0.015974f, 0.019972f, 0.004934f, -0.000171f, 0.012964f, -0.005780f, 0.000070f, -0.011716f, 0.009601f, -0.000692f, 0.000407f, 0.004477f, 0.005077f, 0.016502f, -0.013890f, -0.012491f, 0.012453f, 0.002676f, 0.005645f, -0.009728f, 0.001699f, -0.003333f, 0.006367f, 0.000201f, 0.008967f, 0.008993f, -0.009129f, 0.007631f, 0.006202f, -0.010304f, 0.026621f, 0.004772f, 0.005111f, -0.020617f, -0.006740f, -0.001564f, 0.017219f, 0.016239f, -0.001745f, -0.017684f, 0.011514f, -0.015364f, -0.004911f, 0.013647f, -0.000503f, -0.010867f, 0.013117f, 0.016728f, -0.004348f, 0.005706f, + -0.006807f, -0.023210f, 0.000019f, 0.015047f, -0.006990f, -0.007873f, 0.009713f, -0.011081f, -0.017101f, 0.004320f, 0.011391f, 0.021081f, 0.010875f, -0.015621f, 0.006459f, -0.018369f, -0.021893f, 0.020187f, 0.009319f, 0.007450f, -0.013653f, -0.014501f, -0.002323f, 0.015241f, 0.004922f, 0.021732f, 0.009467f, 0.005558f, -0.023121f, 0.003814f, -0.006535f, 0.000971f, -0.005497f, 0.004881f, 0.001315f, 0.005888f, 0.009583f, 0.005165f, 0.000735f, 0.004378f, -0.003958f, -0.001802f, -0.004031f, 0.000032f, -0.003783f, -0.001002f, 0.001307f, 0.007333f, 0.001136f, -0.002940f, -0.001430f, 0.002398f, 0.000191f, -0.000570f, -0.007527f, 0.000482f, -0.003915f, 0.001476f, -0.005393f, -0.005720f, 0.003722f, 0.004637f, 0.007097f, -0.007040f, 0.031260f, 0.020053f, -0.013550f, -0.003712f, -0.000516f, 0.005466f, 0.004409f, -0.001980f, -0.012221f, 0.002955f, -0.008379f, 0.012996f, 0.000405f, 0.005003f, -0.004254f, -0.001944f, -0.012755f, -0.006800f, 0.026871f, 0.008872f, -0.016389f, 0.007744f, -0.016010f, -0.011320f, -0.025042f, 0.010872f, 0.000415f, 0.000373f, 0.005929f, -0.000712f, -0.011358f, 0.018860f, + 0.010797f, -0.004189f, -0.019028f, 0.019026f, -0.013065f, 0.005001f, -0.000496f, 0.006214f, 0.003757f, 0.012079f, 0.013960f, -0.003289f, 0.007729f, 0.022098f, 0.002835f, -0.006974f, -0.006336f, -0.003948f, 0.003434f, 0.014740f, -0.004063f, 0.005972f, 0.001160f, -0.013565f, 0.000517f, -0.003365f, 0.006599f, -0.020387f, -0.000344f, -0.033965f, -0.020572f, -0.018966f, -0.004792f, -0.018742f, 0.012578f, -0.004710f, -0.015485f, -0.004200f, -0.001740f, -0.012577f, -0.005447f, -0.000481f, 0.001260f, -0.007559f, -0.016269f, -0.016332f, 0.000879f, -0.003576f, 0.003982f, 0.009102f, -0.001455f, 0.004536f, 0.002279f, -0.000111f, -0.000266f, -0.008913f, -0.000378f, -0.000219f, -0.007125f, -0.000623f, 0.006720f, 0.012875f, -0.002230f, -0.006212f, 0.004843f, -0.008031f, 0.006768f, -0.006711f, -0.002484f, 0.001251f, -0.004854f, -0.006035f, -0.000031f, -0.003781f, 0.000942f, -0.001433f, -0.006026f, 0.002935f, -0.000235f, 0.007496f, 0.005084f, -0.005351f, 0.004560f, -0.003006f, 0.004243f, -0.002474f, 0.002889f, 0.002611f, 0.002070f, 0.000116f, 0.003034f, -0.003554f, -0.001866f, -0.003946f, -0.007856f, 0.001001f, + 0.002884f, -0.000862f, 0.001739f, -0.006225f, -0.021293f, -0.026768f, -0.012523f, -0.017818f, 0.046137f, -0.022339f, 0.010560f, -0.021097f, -0.005918f, 0.002217f, -0.003279f, -0.031435f, -0.000524f, -0.014941f, 0.001250f, 0.037008f, -0.011711f, 0.015525f, 0.020507f, 0.007356f, 0.008417f, 0.022255f, 0.006760f, -0.008674f, 0.006462f, 0.008721f, 0.009528f, 0.003980f, -0.004495f, 0.025901f, 0.001121f, -0.002091f, -0.004209f, 0.007017f, -0.002083f, -0.009028f, 0.008898f, -0.003348f, 0.006419f, -0.025108f, 0.001176f, -0.004862f, 0.022835f, -0.008973f, 0.007453f, 0.034034f, -0.002841f, 0.000701f, -0.008186f, -0.014083f, -0.000685f, -0.002321f, -0.014277f, 0.018073f, -0.003777f, 0.013110f, 0.001511f, 0.012380f, -0.007077f, -0.001350f, 0.027328f, 0.013302f, -0.021025f, -0.011078f, 0.005869f, 0.006529f, 0.003343f, 0.005788f, -0.006073f, 0.007688f, 0.010082f, 0.022594f, -0.028943f, 0.001733f, -0.012326f, 0.005907f, -0.000442f, 0.003307f, 0.010772f, 0.015516f, -0.010292f, 0.010958f, -0.007434f, -0.005112f, -0.004123f, -0.003886f, 0.008820f, -0.019772f, -0.003821f, -0.009134f, 0.011391f, 0.009152f, + 0.003964f, 0.004709f, -0.006570f, 0.007559f, 0.003519f, 0.005440f, -0.000731f, 0.004313f, -0.005830f, -0.003304f, -0.007325f, -0.000626f, -0.001172f, -0.006617f, -0.000087f, -0.000689f, -0.001757f, -0.000092f, 0.007842f, 0.004805f, -0.004316f, -0.007077f, 0.003692f, 0.002681f, 0.008987f, -0.006936f, 0.000541f, -0.002502f, 0.004031f, 0.004584f, -0.003771f, -0.007136f, -0.015273f, -0.013532f, -0.014776f, 0.016012f, -0.030909f, -0.008991f, -0.019393f, 0.009715f, 0.031896f, -0.017297f, 0.000873f, 0.001017f, -0.006329f, 0.012439f, -0.010356f, 0.005069f, -0.003258f, -0.013048f, 0.028454f, 0.001537f, -0.009359f, 0.000526f, -0.004228f, -0.012500f, 0.009898f, -0.009549f, 0.009290f, -0.017937f, -0.008441f, 0.012294f, 0.008896f, -0.030047f, -0.005459f, -0.025569f, 0.007616f, -0.004187f, -0.024741f, 0.030233f, -0.008458f, -0.000476f, -0.022887f, -0.024954f, 0.001432f, -0.022487f, -0.002976f, -0.019413f, -0.016691f, 0.019831f, 0.002161f, -0.025285f, 0.008320f, -0.022620f, 0.020251f, 0.007435f, -0.009833f, 0.000886f, 0.006508f, 0.021398f, -0.016477f, -0.023195f, 0.023575f, -0.016357f, -0.009393f, 0.012466f, + 0.017799f, -0.032918f, -0.016247f, 0.018887f, 0.013963f, 0.007391f, -0.001730f, 0.002432f, -0.023724f, 0.008256f, 0.007912f, 0.013194f, -0.004176f, -0.024997f, -0.018198f, 0.008989f, -0.021657f, -0.018860f, 0.007994f, -0.001152f, 0.000298f, 0.008012f, 0.018294f, 0.000128f, -0.000766f, 0.017138f, 0.001585f, -0.002672f, 0.002921f, -0.002222f, -0.003463f, 0.003771f, -0.004478f, -0.003063f, -0.008597f, -0.008132f, -0.005869f, 0.001612f, -0.004883f, 0.000171f, 0.003484f, 0.002873f, -0.000475f, -0.000004f, 0.003729f, -0.004213f, -0.006819f, 0.002154f, -0.000222f, 0.006620f, -0.006282f, -0.001694f, -0.007122f, 0.008374f, 0.008737f, 0.001987f, -0.000433f, -0.005288f, -0.002184f, -0.007478f, 0.000653f, 0.001331f, -0.004246f, 0.001426f, 0.001729f, 0.015709f, -0.024244f, -0.039527f, -0.031925f, 0.014384f, -0.038170f, -0.001846f, 0.028895f, -0.002561f, 0.002054f, 0.020749f, -0.013798f, -0.011737f, 0.045934f, -0.018202f, 0.010727f, 0.017488f, -0.003274f, -0.041665f, -0.003496f, 0.004395f, -0.010507f, -0.005775f, -0.009728f, 0.038876f, 0.000340f, 0.000441f, -0.001948f, -0.028004f, 0.005091f, -0.016124f, + -0.008138f, 0.001744f, 0.004646f, 0.008299f, 0.022537f, 0.005015f, -0.005858f, 0.044420f, 0.004635f, -0.010986f, -0.040660f, -0.005928f, 0.029753f, -0.006467f, -0.018684f, -0.024998f, -0.022063f, -0.018802f, -0.011877f, 0.031597f, 0.012239f, 0.001817f, 0.017513f, 0.026398f, 0.014673f, -0.005750f, -0.004682f, 0.027286f, -0.005438f, -0.008368f, 0.007875f, 0.020866f, 0.002920f, -0.021442f, 0.004877f, -0.002164f, -0.032106f, -0.002422f, 0.025451f, -0.012633f, -0.014792f, -0.003587f, 0.034234f, -0.027292f, -0.005529f, -0.015229f, 0.015605f, 0.009089f, 0.007200f, 0.010967f, -0.004554f, -0.005882f, 0.011553f, 0.009268f, 0.006354f, -0.001873f, 0.001374f, 0.007294f, -0.020207f, -0.003725f, 0.002582f, -0.010433f, 0.000211f, 0.011015f, -0.001173f, 0.002033f, -0.004389f, -0.001257f, 0.005981f, 0.007780f, 0.011623f, 0.006558f, -0.002013f, 0.004151f, -0.006733f, -0.008519f, 0.002387f, -0.001672f, -0.006979f, 0.007704f, 0.004049f, 0.005827f, 0.001190f, 0.002820f, 0.005944f, 0.003313f, -0.001778f, -0.004290f, -0.001173f, 0.002425f, -0.000030f, 0.002458f, 0.000462f, 0.003049f, 0.001813f, 0.005220f, + 0.000629f, -0.005026f, 0.011056f, 0.009074f, -0.008577f, -0.002897f, -0.004126f, 0.032345f, 0.003243f, -0.028873f, -0.001077f, 0.008675f, -0.001051f, -0.013155f, 0.012528f, -0.009729f, 0.025706f, -0.019769f, 0.017663f, 0.038640f, -0.010457f, -0.010274f, -0.009110f, -0.008020f, 0.034479f, -0.025538f, -0.028091f, -0.021412f, 0.007821f, -0.011161f, -0.018084f, -0.008297f, 0.012385f, -0.017310f, 0.009586f, 0.002296f, 0.013528f, 0.020113f, 0.002472f, -0.002541f, -0.003857f, 0.019827f, -0.005102f, 0.007025f, -0.024269f, -0.000187f, -0.008643f, 0.019335f, -0.025790f, 0.021210f, -0.008909f, -0.013263f, 0.021326f, 0.036980f, -0.020767f, 0.010548f, -0.004584f, 0.007528f, -0.055474f, -0.043954f, -0.026681f, 0.003881f, -0.016924f, 0.007345f, 0.001815f, -0.020576f, -0.016273f, 0.001826f, 0.044230f, 0.010461f, -0.027549f, -0.041165f, -0.021730f, -0.015175f, 0.027112f, -0.018747f, -0.026827f, 0.006467f, 0.005905f, -0.024779f, -0.001546f, -0.000363f, -0.012295f, -0.002778f, -0.000635f, -0.000982f, 0.012169f, 0.003051f, -0.014247f, -0.012602f, -0.006935f, -0.018193f, -0.009915f, 0.003105f, 0.020590f, 0.003534f, + 0.003887f, -0.005869f, -0.016836f, -0.002522f, 0.013859f, -0.000561f, -0.007807f, 0.012807f, -0.019198f, -0.009351f, 0.002942f, 0.003161f, -0.000267f, 0.002252f, 0.001411f, -0.006384f, -0.013419f, -0.004723f, 0.010341f, -0.005853f, -0.004735f, -0.005257f, -0.011964f, -0.013173f, 0.005046f, -0.004640f, -0.002841f, -0.012394f, 0.003170f, 0.008381f, 0.010028f, -0.000271f, -0.005911f, -0.006830f, 0.007251f, 0.006606f, 0.055551f, 0.036440f, -0.009604f, 0.003749f, 0.035919f, -0.014115f, 0.001173f, 0.015539f, 0.038884f, 0.022936f, -0.006856f, -0.008590f, -0.013540f, 0.003598f, -0.007496f, 0.000701f, 0.000903f, 0.041115f, 0.067758f, -0.003874f, 0.046709f, 0.029661f, 0.005957f, 0.007442f, -0.033462f, -0.032989f, -0.003871f, 0.008870f, -0.002498f, 0.008220f, -0.012567f, -0.024675f, -0.041926f, -0.003495f, -0.027024f, -0.022654f, -0.015197f, -0.023454f, -0.017051f, -0.000828f, 0.038689f, -0.001135f, -0.029606f, -0.002382f, 0.008246f, 0.028919f, -0.009194f, -0.007218f, -0.017745f, 0.013177f, -0.052995f, -0.047387f, -0.023004f, -0.023591f, -0.025546f, -0.015307f, 0.016682f, -0.021267f, -0.029779f, -0.024813f, + -0.044460f, 0.022805f, 0.011983f, -0.039270f, 0.020006f, 0.039861f, 0.077777f, 0.043101f, -0.000678f, 0.014327f, -0.045059f, -0.018264f, 0.023956f, 0.020505f, -0.011698f, -0.030263f, 0.003744f, 0.006460f, 0.027385f, -0.003421f, -0.028546f, -0.004866f, 0.044967f, 0.028950f, 0.032495f, 0.026108f, 0.045354f, 0.043002f, 0.012654f, 0.011757f, -0.010266f, -0.017941f, -0.005253f, -0.001481f, -0.015658f, 0.000039f, -0.018063f, -0.013204f, 0.020457f, 0.009285f, -0.005867f, -0.017876f, -0.007091f, -0.002055f, -0.000527f, -0.019909f, 0.019702f, 0.000350f, -0.016977f, 0.010117f, -0.010561f, -0.008571f, -0.002807f, 0.006338f, 0.027269f, 0.013564f, 0.032674f, 0.000242f, -0.006734f, 0.003861f, 0.012315f, 0.008478f, -0.004482f, 0.017477f, 0.000595f, -0.005502f, 0.002331f, 0.014490f, -0.007325f, -0.005964f, 0.005117f, -0.001100f, -0.057748f, -0.005209f, 0.092137f, -0.006513f, 0.003050f, 0.023321f, -0.034059f, 0.019174f, 0.065216f, 0.060733f, -0.061443f, -0.058342f, -0.000372f, -0.063319f, -0.024424f, 0.000110f, 0.006956f, 0.023373f, 0.034503f, 0.030977f, 0.054020f, 0.013035f, 0.021020f, 0.021855f, + -0.009623f, -0.003718f, 0.005492f, 0.007341f, 0.015630f, -0.029039f, 0.064959f, 0.028211f, 0.030076f, -0.005557f, 0.065957f, 0.008373f, 0.039560f, 0.016721f, 0.012035f, -0.015527f, -0.010662f, 0.033985f, 0.012510f, 0.015852f, -0.036229f, -0.019000f, -0.030350f, -0.017317f, -0.022232f, -0.000021f, -0.043778f, -0.046872f, -0.003314f, -0.018016f, -0.089136f, -0.065857f, -0.060276f, 0.017076f, 0.063948f, 0.083639f, -0.046791f, 0.057672f, 0.088997f, 0.015325f, 0.006936f, -0.005682f, 0.061029f, 0.004726f, 0.055140f, 0.024012f, 0.025461f, -0.037183f, -0.123741f, -0.097463f, -0.022701f, -0.003328f, 0.001909f, 0.004308f, 0.044773f, 0.042966f, 0.036704f, -0.023360f, 0.002252f, -0.012230f, -0.064211f, 0.006340f, 0.004271f, 0.031812f, 0.004146f, 0.046812f, 0.041575f, 0.010388f, 0.036044f, -0.015737f, 0.024126f, -0.022300f, -0.025792f, -0.009364f, 0.009020f, 0.040590f, -0.010077f, -0.011684f, 0.005093f, -0.020393f, -0.010817f, 0.020405f, -0.006825f, 0.014008f, -0.026672f, 0.034718f, 0.009597f, 0.000061f, -0.003436f, 0.026601f, -0.007666f, 0.001542f, 0.003326f, -0.000901f, 0.017204f, -0.013606f, + -0.007870f, -0.000597f, 0.016447f, -0.026620f, 0.002333f, 0.008883f, -0.013968f, 0.001476f, 0.003558f, 0.002744f, -0.007001f, 0.045172f, -0.010145f, -0.080768f, -0.007395f, 0.129357f, 0.023333f, -0.023806f, 0.033018f, -0.010303f, 0.021399f, -0.009961f, -0.014260f, -0.042120f, -0.016255f, -0.004248f, -0.007385f, -0.019965f, 0.030246f, -0.027187f, -0.029901f, -0.001643f, 0.004456f, 0.027431f, 0.011878f, 0.007839f, 0.011255f, -0.010626f, -0.000039f, 0.040772f, -0.020897f, -0.047687f, -0.009911f, 0.004642f, -0.016524f, 0.034013f, -0.017842f, -0.010892f, 0.028024f, 0.008387f, 0.021093f, -0.049272f, -0.056260f, 0.019058f, -0.011084f, -0.018594f, -0.024256f, -0.029122f, -0.061923f, 0.000631f, -0.005686f, 0.021048f, -0.039749f, -0.081835f, 0.061376f, 0.017449f, 0.057674f, 0.006942f, -0.018980f, -0.016953f, 0.014807f, -0.030494f, 0.047773f, 0.010065f, 0.057396f, 0.040756f, 0.085355f, -0.007963f, -0.082528f, -0.063429f, -0.036642f, 0.047824f, 0.047261f, -0.035645f, 0.037467f, 0.075396f, -0.044432f, -0.006305f, 0.080220f, 0.013019f, 0.061546f, -0.008693f, -0.031929f, -0.083286f, -0.032896f, 0.009935f, + 0.053132f, 0.047100f, -0.027867f, 0.023891f, 0.021678f, 0.044688f, 0.014911f, -0.043625f, -0.052507f, -0.020116f, 0.035700f, 0.077006f, -0.002291f, -0.006484f, 0.039479f, 0.021414f, 0.003264f, -0.006213f, -0.017131f, -0.020320f, -0.017073f, 0.013435f, 0.007644f, 0.024621f, -0.010540f, -0.002468f, 0.001940f, 0.015015f, 0.018543f, -0.023921f, 0.000057f, 0.027765f, -0.003486f, -0.007685f, -0.030814f, 0.022409f, -0.000420f, -0.012795f, -0.009719f, 0.030902f, -0.001813f, -0.019365f, -0.010884f, -0.068042f, 0.070546f, 0.095724f, 0.016669f, 0.004346f, 0.021258f, -0.014612f, 0.041758f, 0.023360f, 0.043638f, -0.008853f, -0.046115f, 0.102416f, 0.000571f, -0.038511f, 0.004717f, 0.069246f, 0.031689f, 0.013567f, -0.043909f, 0.004742f, -0.023524f, -0.017176f, 0.006836f, -0.032669f, 0.002724f, 0.008759f, 0.039330f, -0.055928f, -0.009556f, -0.006734f, 0.033205f, -0.012681f, -0.020700f, -0.019692f, -0.000319f, 0.021156f, -0.043530f, 0.003125f, 0.011390f, -0.088982f, 0.012189f, -0.024158f, -0.062759f, 0.041155f, -0.046411f, -0.081325f, 0.107214f, -0.000910f, 0.006118f, -0.008547f, -0.029946f, 0.064662f, + -0.045916f, -0.004402f, 0.009526f, -0.029664f, -0.002544f, 0.081720f, 0.042179f, -0.072299f, -0.078246f, 0.076918f, -0.036920f, 0.044756f, 0.073800f, -0.066516f, -0.114408f, -0.079236f, 0.131722f, -0.007993f, -0.103618f, 0.094390f, -0.069162f, -0.131367f, -0.002294f, 0.112936f, -0.005129f, -0.136339f, -0.002199f, -0.046037f, 0.000982f, 0.167633f, -0.025893f, -0.123820f, 0.017650f, 0.065533f, 0.001100f, 0.076670f, 0.004171f, 0.001264f, -0.024657f, 0.002861f, 0.017269f, 0.061823f, -0.013322f, -0.017040f, 0.061131f, -0.008516f, 0.014304f, 0.042765f, -0.007748f, -0.063019f, 0.040539f, 0.029346f, 0.047535f, -0.015197f, -0.001525f, 0.016707f, -0.014220f, -0.046501f, -0.020773f, 0.018696f, 0.001003f, -0.009444f, 0.060372f, -0.002193f, -0.068136f, 0.015437f, 0.054824f, 0.031684f, -0.024037f, 0.002652f, -0.027488f, -0.015435f, 0.066559f, 0.055863f, -0.015185f, -0.064896f, -0.021210f, 0.026062f, 0.021020f, 0.017149f, -0.012738f, -0.002802f, -0.045145f, 0.069381f, -0.013442f, 0.020440f, 0.045486f, 0.031235f, 0.034619f, 0.081757f, 0.036374f, -0.021184f, 0.013679f, 0.019458f, 0.027579f, -0.030858f, + 0.080093f, 0.074181f, 0.011047f, 0.025070f, -0.017781f, -0.000991f, -0.080559f, 0.036346f, -0.042259f, 0.027962f, -0.002720f, -0.030779f, 0.044570f, -0.018459f, -0.032237f, 0.016655f, -0.045767f, 0.029815f, 0.001908f, -0.009774f, 0.013399f, 0.018264f, 0.029374f, 0.028508f, 0.028639f, 0.083188f, -0.007667f, 0.008202f, 0.027205f, 0.055728f, -0.004969f, 0.014100f, 0.000823f, 0.043371f, 0.053246f, -0.018129f, 0.013292f, -0.003319f, -0.007956f, -0.097140f, 0.008341f, 0.040014f, -0.022346f, -0.024509f, 0.021957f, -0.041049f, -0.058965f, 0.004336f, 0.034499f, 0.070061f, -0.090594f, 0.033946f, -0.003998f, -0.003541f, 0.001091f, 0.034706f, 0.077184f, 0.000374f, -0.055133f, 0.017528f, 0.062769f, -0.034620f, -0.048415f, 0.003762f, 0.027928f, -0.027315f, 0.049857f, -0.010560f, 0.038484f, 0.002296f, -0.036985f, 0.045357f, 0.037971f, 0.005339f, 0.030104f, -0.017577f, 0.019065f, -0.010017f, 0.010416f, 0.014160f, 0.045496f, -0.010516f, -0.053589f, -0.008004f, 0.063615f, 0.003855f, -0.007287f, 0.054893f, 0.012391f, -0.001272f, 0.014168f, 0.037781f, 0.058400f, -0.038035f, 0.014945f, 0.006889f, + -0.002023f, 0.027331f, -0.007519f, -0.043005f, 0.014541f, 0.039058f, -0.016402f, 0.009466f, 0.014379f, -0.013999f, 0.016341f, -0.027702f, 0.019789f, 0.016133f, -0.022526f, -0.051282f, 0.022238f, 0.027646f, -0.012492f, -0.019311f, 0.027494f, -0.002987f, -0.015452f, 0.043238f, -0.082144f, -0.064982f, -0.000603f, -0.099968f, -0.033590f, -0.037344f, 0.077104f, -0.002779f, -0.027793f, 0.034670f, -0.017527f, 0.018971f, 0.005534f, -0.038504f, 0.045851f, -0.103014f, -0.009203f, 0.005676f, -0.025102f, 0.018349f, 0.005090f, -0.020536f, -0.003134f, 0.002476f, 0.026328f, 0.001020f, -0.029532f, -0.099953f, -0.072001f, -0.055767f, -0.026965f, 0.061114f, -0.011979f, 0.001806f, -0.099052f, 0.006953f, -0.006430f, -0.013987f, 0.003646f, -0.096755f, 0.052053f, -0.047223f, 0.024223f, -0.019613f, 0.066058f, -0.036272f, -0.062981f, -0.031010f, -0.000042f, 0.047079f, 0.087192f, 0.090608f, -0.111880f, -0.083628f, -0.056870f, 0.038294f, 0.092850f, 0.111303f, -0.018977f, -0.028498f, -0.097860f, -0.036924f, 0.088087f, 0.053079f, -0.000536f, -0.000397f, -0.001569f, -0.083535f, 0.056135f, -0.017102f, 0.054202f, 0.129568f, + -0.144674f, 0.175596f, 0.050254f, -0.095710f, 0.027205f, -0.191494f, -0.186220f, 0.137489f, 0.059367f, 0.013240f, 0.041671f, -0.071079f, -0.033419f, 0.128133f, -0.004327f, 0.086072f, -0.007911f, -0.069777f, -0.022087f, 0.076016f, -0.024811f, -0.001975f, 0.025360f, -0.006416f, -0.043895f, 0.024517f, -0.035519f, 0.016447f, 0.049277f, -0.050852f, 0.048553f, 0.015867f, -0.005796f, 0.017931f, -0.002296f, -0.011585f, 0.008625f, -0.017740f, 0.009685f, -0.036108f, 0.032559f, 0.033110f, 0.007470f, 0.000999f, -0.010374f, 0.016946f, 0.006940f, 0.006735f, 0.017208f, 0.031910f, -0.038920f, -0.013449f, -0.036061f, -0.028119f, 0.003668f, 0.001432f, 0.032394f, -0.041042f, -0.030672f, -0.039529f, -0.024200f, -0.010552f, -0.082967f, 0.068584f, -0.041119f, 0.042074f, 0.022419f, 0.026458f, 0.015756f, -0.053332f, 0.058138f, -0.008888f, -0.020621f, -0.019310f, -0.022886f, 0.017507f, -0.011971f, 0.025019f, 0.015151f, -0.003594f, -0.005969f, -0.044701f, 0.025916f, 0.010236f, -0.011304f, 0.009603f, 0.023535f, -0.006969f, 0.013402f, -0.022867f, 0.026771f, -0.010234f, 0.003530f, 0.010539f, 0.011448f, -0.012177f, + 0.041213f, -0.001911f, -0.038516f, -0.002875f, 0.017935f, 0.008477f, -0.029437f, 0.014053f, 0.034527f, -0.006787f, -0.016599f, -0.016640f, -0.002145f, 0.009157f, -0.004056f, 0.040099f, -0.027073f, -0.010725f, -0.009545f, -0.020620f, -0.001610f, -0.006509f, 0.014926f, 0.010408f, -0.016598f, -0.002825f, 0.015648f, -0.016642f, -0.008294f, -0.005178f, 0.025099f, -0.015749f, 0.010826f, 0.016502f, -0.038622f, -0.015886f, 0.012513f, -0.040675f, 0.061379f, 0.016112f, 0.019605f, 0.028009f, -0.017827f, -0.000732f, -0.005200f, -0.028079f, 0.005692f, 0.008946f, 0.022474f, -0.004670f, -0.009313f, 0.013415f, -0.014043f, -0.006035f, 0.013511f, -0.000063f, -0.003203f, 0.011128f, 0.003553f, -0.007443f, -0.000238f, -0.008192f, 0.017971f, -0.017108f, 0.027223f, 0.001026f, 0.006062f, -0.011493f, -0.000933f, -0.004286f, -0.008404f, -0.004624f, 0.006538f, 0.003118f, 0.007891f, -0.000303f, -0.006314f, -0.004422f, -0.020939f, 0.021101f, -0.016799f, 0.009497f, -0.003932f, 0.012287f, -0.006863f, -0.019713f, 0.001384f, 0.010095f, -0.016008f, 0.024064f, -0.019095f, 0.010499f, -0.007244f, 0.095946f, 0.012486f, -0.032495f, + -0.025268f, -0.018909f, -0.001859f, -0.003072f, 0.002075f, -0.002599f, -0.003742f, -0.054234f, 0.001146f, -0.010787f, -0.012563f, 0.006902f, -0.021341f, -0.009649f, 0.009839f, -0.014835f, 0.004188f, 0.016855f, -0.022800f, 0.014365f, -0.008466f, -0.012055f, -0.001971f, -0.012056f, 0.005607f, -0.011186f, -0.006017f, -0.013183f, -0.002619f, -0.000164f, -0.000347f, -0.007902f, -0.008284f, 0.002536f, 0.004288f, -0.009450f, 0.012805f, -0.015769f, -0.001439f, -0.006262f, -0.002051f, -0.002921f, -0.012585f, 0.017253f, 0.010521f, -0.017198f, 0.020959f, -0.002074f, 0.004448f, -0.009420f, 0.020112f, -0.020061f, 0.001487f, 0.001800f, 0.005299f, -0.003252f, -0.005236f, 0.015109f, -0.009993f, 0.002317f, 0.000779f, -0.002974f, 0.004790f, -0.006452f, -0.000923f, 0.008488f, -0.004235f, -0.003739f, 0.009503f, -0.003608f, -0.004163f, -0.008734f, 0.004587f, 0.004434f, -0.019595f, 0.023563f, -0.013244f, 0.005417f, 0.001609f, 0.000436f, -0.007594f, 0.003360f, 0.009644f, -0.007037f, -0.003631f, 0.005291f, -0.007214f, -0.000338f, 0.005907f, -0.002308f, 0.002353f, 0.001415f, -0.005346f, 0.001061f, 0.000691f, 0.004935f, + -0.008681f, 0.000847f, -0.000979f, -0.003290f, 0.003629f, -0.004137f, 0.002090f, -0.002632f, -0.007593f, 0.004387f, -0.006582f, -0.003651f, 0.002444f, -0.003987f, 0.001528f, 0.003963f, 0.000426f, -0.005608f, 0.006106f, -0.001032f, -0.003757f, -0.046882f, -0.076276f, 0.085179f, 0.286472f, 0.029157f, 0.065804f, -0.155847f, -0.238325f, -0.059885f, -0.124476f, 0.097009f, 0.199726f, 0.105253f, 0.066592f, -0.014920f, -0.077446f, -0.076179f, -0.057293f, -0.053207f, 0.019050f, 0.034077f, 0.019737f, 0.036679f, 0.004896f, 0.002944f, 0.014523f, 0.004166f, 0.016482f, 0.013113f, -0.009727f, -0.036476f, -0.026945f, -0.032147f, -0.043377f, -0.022920f, 0.024528f, 0.031613f, 0.058719f, 0.082888f, 0.030084f, 0.012014f, -0.027478f, -0.065669f, -0.063522f, -0.044373f, -0.030762f, 0.006340f, 0.024526f, 0.035195f, 0.037574f, 0.031659f, 0.021389f, 0.002510f, -0.002439f, -0.020849f, -0.014371f, -0.009184f, -0.010389f, -0.004039f, -0.011748f, -0.003364f, -0.013941f, -0.013639f, 0.005117f, -0.001066f, 0.018202f, 0.029864f, 0.017783f, 0.044402f, 0.039577f, -0.018974f, -0.038908f, -0.039000f, -0.058060f, -0.016323f, + -0.013929f, -0.003087f, 0.035829f, 0.031932f, -0.005567f, 0.027775f, 0.034650f, 0.011781f, 0.024228f, -0.002124f, -0.027849f, -0.020183f, -0.047852f, -0.030121f, -0.011302f, -0.002926f, -0.003492f, 0.008703f, 0.022672f, 0.035918f, 0.045295f, 0.038344f, 0.012829f, -0.020828f, -0.034170f, -0.032683f, -0.036481f, -0.016326f, -0.009246f, -0.003705f, 0.008120f, 0.018096f, 0.014350f, 0.025286f, 0.013808f, 0.016642f, 0.015083f, 0.000220f, -0.012430f, -0.016189f, -0.020352f, -0.019943f, -0.017820f, -0.009374f, -0.009814f, 0.005808f, 0.010312f, 0.020822f, 0.030081f, 0.029120f, 0.011065f, 0.002159f, -0.016523f, -0.019996f, -0.023682f, -0.023645f, -0.006949f, -0.000927f, -0.004563f, 0.005823f, 0.018474f, 0.024220f, 0.011905f, 0.002817f, -0.001298f, 0.000528f, -0.004861f, -0.005265f, -0.009110f, -0.005405f, -0.006938f, -0.004693f, -0.003039f, 0.000341f, 0.000003f, 0.005605f, 0.010353f, 0.011171f, 0.004990f, 0.002204f, -0.002870f, -0.001447f, -0.002179f, 0.000445f, -0.001016f}, + {0.007429f, 0.012093f, 0.003175f, 0.010678f, 0.000184f, -0.011008f, -0.007593f, -0.008016f, -0.001247f, -0.005503f, 0.012912f, -0.009651f, -0.002453f, -0.004379f, -0.001543f, -0.007739f, 0.007448f, -0.004561f, -0.003574f, 0.006269f, 0.010389f, 0.011760f, 0.001814f, -0.000835f, 0.002448f, 0.000630f, 0.001663f, -0.005311f, -0.005722f, 0.002808f, -0.005187f, -0.005191f, -0.006962f, -0.007316f, 0.002239f, -0.004842f, 0.006487f, -0.008076f, -0.001094f, 0.003578f, 0.003400f, 0.003003f, -0.012534f, -0.002240f, -0.006949f, -0.001198f, -0.002912f, -0.007636f, -0.000149f, 0.009145f, 0.002788f, 0.004450f, 0.004210f, 0.004952f, 0.000639f, 0.006209f, 0.003907f, 0.006928f, -0.003900f, 0.004631f, -0.002258f, 0.003205f, 0.000379f, -0.006361f, 0.007476f, 0.008458f, -0.004508f, -0.005643f, 0.002506f, 0.007776f, 0.001866f, 0.002093f, -0.002581f, -0.000488f, 0.004222f, 0.002651f, 0.000695f, -0.001513f, 0.000531f, 0.003574f, 0.004340f, -0.000500f, -0.006730f, -0.004106f, -0.002257f, -0.002849f, 0.001582f, -0.000621f, -0.000599f, 0.003230f, -0.002348f, -0.000767f, 0.000001f, 0.000589f, -0.001587f, -0.000435f, + 0.000253f, -0.002533f, -0.000280f, 0.003166f, -0.000451f, 0.001687f, -0.002260f, 0.001339f, 0.000683f, -0.000130f, -0.001481f, -0.018892f, -0.004963f, -0.008522f, 0.006252f, -0.017711f, 0.003880f, -0.007808f, -0.004126f, 0.002509f, 0.000348f, 0.001977f, 0.002644f, 0.001993f, 0.007681f, -0.003421f, 0.000799f, -0.000781f, -0.009357f, 0.006889f, 0.011511f, -0.009378f, -0.008804f, 0.006681f, 0.001713f, 0.008249f, 0.002610f, 0.011083f, -0.001546f, 0.003731f, -0.005877f, -0.001794f, 0.011299f, 0.000897f, -0.007382f, -0.009105f, -0.009835f, 0.000410f, 0.008134f, 0.004126f, -0.000060f, 0.009257f, 0.007378f, 0.000284f, -0.007581f, 0.011840f, 0.003018f, 0.009130f, 0.009282f, -0.001632f, 0.005912f, 0.006987f, -0.000854f, 0.004126f, 0.004788f, -0.004614f, 0.000946f, -0.001435f, 0.004550f, -0.010415f, -0.006669f, 0.003355f, -0.006448f, -0.002490f, 0.008921f, -0.003618f, 0.004900f, -0.002097f, -0.014014f, 0.002359f, -0.000071f, 0.007359f, -0.011542f, -0.006209f, 0.005213f, 0.001316f, -0.001112f, 0.002974f, -0.005442f, 0.001578f, 0.001385f, -0.001667f, -0.003431f, 0.004717f, 0.004288f, 0.002966f, + 0.000537f, -0.001778f, 0.001139f, -0.001317f, -0.002079f, 0.001553f, 0.001334f, -0.002815f, 0.002029f, -0.001574f, -0.001197f, 0.002533f, -0.001822f, -0.003746f, -0.000057f, -0.001397f, -0.000459f, -0.001775f, -0.001951f, 0.000784f, -0.000146f, 0.001141f, -0.000010f, 0.001120f, -0.002761f, 0.000802f, -0.000804f, 0.011882f, 0.012544f, 0.005519f, 0.009278f, 0.007246f, 0.012563f, 0.014319f, -0.005328f, -0.001538f, 0.004819f, -0.014307f, -0.000481f, -0.004718f, -0.002732f, 0.006549f, -0.008331f, -0.000976f, 0.010583f, 0.001955f, 0.006783f, -0.003358f, -0.002456f, -0.003567f, -0.013456f, -0.002206f, 0.000912f, 0.007114f, -0.002167f, 0.012243f, 0.004822f, -0.002117f, 0.004892f, 0.002536f, 0.006289f, -0.004552f, -0.000954f, 0.014296f, -0.001917f, 0.013506f, 0.006336f, -0.005930f, 0.001414f, 0.011893f, 0.006189f, -0.007850f, 0.010839f, -0.002979f, 0.000728f, 0.000560f, -0.002196f, 0.002077f, 0.001198f, -0.009810f, 0.006249f, 0.004568f, -0.000854f, 0.000351f, -0.002197f, -0.008863f, -0.000000f, 0.004974f, -0.001025f, -0.001050f, -0.005976f, -0.013031f, -0.004489f, 0.004843f, 0.010920f, -0.016615f, + -0.008871f, 0.003100f, -0.007265f, 0.004250f, -0.000353f, -0.000082f, -0.010014f, -0.007591f, -0.004461f, -0.006497f, -0.003224f, 0.000363f, 0.001102f, -0.002333f, 0.003744f, 0.002993f, 0.000591f, 0.002758f, -0.003064f, -0.001130f, 0.000049f, -0.004481f, -0.001007f, 0.000439f, -0.005709f, 0.002379f, 0.001341f, -0.001093f, 0.000133f, 0.001181f, 0.002695f, 0.000303f, 0.000349f, 0.000043f, -0.002802f, -0.000355f, -0.000877f, 0.002022f, 0.001363f, 0.002768f, -0.002010f, 0.017509f, 0.018702f, -0.003771f, -0.007772f, -0.008584f, 0.017935f, -0.015563f, 0.000473f, -0.002574f, -0.007187f, -0.009868f, 0.003544f, -0.002741f, -0.013335f, -0.016326f, 0.000669f, -0.001264f, -0.008458f, 0.003042f, 0.004566f, -0.006026f, -0.008971f, -0.008456f, 0.011948f, -0.012877f, -0.001499f, -0.015041f, 0.000228f, 0.008321f, 0.002900f, 0.001397f, -0.008363f, -0.008128f, 0.007419f, -0.005718f, -0.008548f, 0.001038f, -0.003076f, 0.005235f, 0.000161f, 0.002099f, -0.008522f, -0.003199f, -0.002364f, 0.008209f, 0.005702f, 0.005701f, -0.016927f, 0.002662f, 0.004790f, 0.003855f, 0.004844f, -0.004866f, -0.003037f, 0.000587f, + 0.003500f, 0.006698f, -0.001107f, 0.004419f, -0.004857f, 0.013095f, -0.023731f, 0.008340f, 0.000737f, -0.012675f, -0.000485f, 0.013976f, -0.004175f, -0.006578f, -0.012696f, -0.004319f, 0.001052f, -0.003558f, 0.000045f, 0.005725f, 0.007363f, 0.006089f, -0.001748f, -0.001020f, -0.007444f, -0.001541f, -0.001863f, -0.003788f, 0.001097f, -0.001544f, -0.001429f, 0.003042f, -0.003737f, -0.001763f, 0.003720f, -0.001835f, 0.002422f, -0.000565f, -0.001455f, -0.001324f, -0.000955f, -0.005498f, -0.003377f, 0.002388f, 0.002751f, -0.002611f, -0.002053f, -0.001777f, 0.002078f, -0.001299f, -0.000733f, -0.002159f, 0.001464f, 0.001499f, -0.002517f, 0.001028f, -0.000313f, -0.002341f, -0.000506f, -0.001326f, 0.001559f, -0.000778f, 0.002295f, 0.003177f, -0.008307f, -0.026351f, 0.004820f, -0.012026f, 0.002647f, 0.002180f, -0.001509f, 0.018663f, 0.001048f, -0.011978f, 0.015977f, 0.007668f, 0.005494f, -0.002426f, 0.003320f, -0.004888f, 0.012526f, -0.002106f, 0.001435f, 0.018823f, 0.018411f, 0.007845f, 0.008436f, 0.008075f, 0.009168f, 0.006083f, -0.018179f, -0.005714f, -0.000249f, -0.004817f, -0.015475f, -0.001742f, + -0.003669f, -0.004128f, -0.008315f, -0.000200f, -0.002443f, 0.013275f, -0.004278f, 0.023306f, -0.000147f, 0.001925f, -0.004334f, -0.003425f, 0.000168f, -0.000718f, -0.001881f, -0.004130f, -0.002750f, -0.011490f, 0.002770f, 0.001825f, -0.001383f, -0.005966f, 0.007971f, 0.005866f, 0.006905f, -0.002483f, -0.005034f, 0.000083f, 0.006011f, 0.006483f, -0.005286f, -0.015000f, -0.007662f, 0.001560f, 0.012431f, -0.001778f, 0.010156f, -0.008148f, -0.011786f, 0.008720f, -0.004146f, -0.009710f, 0.005571f, 0.005793f, -0.010859f, -0.008618f, -0.011948f, -0.004020f, -0.004145f, 0.006774f, -0.003770f, 0.002017f, -0.000813f, 0.004493f, 0.002771f, 0.002457f, -0.002301f, -0.001341f, -0.006252f, -0.003184f, -0.001713f, -0.000147f, 0.002689f, -0.000602f, 0.000126f, 0.005076f, 0.001946f, -0.000329f, -0.000017f, 0.003232f, -0.002249f, 0.000817f, 0.000880f, -0.001828f, 0.001918f, -0.001632f, 0.001234f, 0.000944f, 0.001385f, -0.001022f, -0.003940f, 0.003656f, -0.006580f, 0.009679f, -0.011463f, -0.012535f, 0.006033f, -0.003591f, -0.001049f, -0.006581f, -0.003762f, 0.006427f, 0.009135f, 0.004762f, -0.002054f, 0.001399f, + -0.001029f, -0.002082f, -0.008607f, 0.002937f, -0.023297f, -0.006759f, -0.007374f, 0.006475f, 0.008086f, 0.000699f, 0.004053f, -0.014519f, 0.004048f, 0.002274f, 0.004031f, -0.013085f, 0.024853f, -0.001083f, 0.004684f, 0.003287f, -0.011631f, 0.001885f, -0.016711f, 0.010823f, -0.003498f, -0.014018f, 0.002918f, 0.001115f, -0.006968f, 0.000806f, 0.001620f, 0.011145f, 0.020066f, 0.008693f, -0.003963f, 0.006514f, 0.008290f, -0.018556f, -0.006755f, -0.008479f, 0.005256f, 0.004298f, -0.003012f, 0.002988f, 0.006556f, 0.004168f, 0.008421f, 0.015631f, 0.000441f, -0.005761f, -0.001523f, -0.000625f, 0.012321f, -0.008767f, 0.000123f, 0.005688f, 0.016588f, 0.000098f, -0.010912f, -0.010685f, -0.000878f, -0.013132f, -0.001718f, 0.005021f, 0.020296f, 0.017447f, -0.001961f, -0.009220f, 0.007520f, 0.000580f, 0.002240f, 0.001910f, -0.000638f, 0.002576f, -0.000650f, -0.002536f, 0.002261f, 0.002924f, -0.002806f, 0.004087f, 0.003821f, 0.003690f, -0.001017f, -0.002974f, 0.002394f, 0.003284f, -0.000498f, 0.000980f, -0.002497f, 0.000406f, -0.000524f, 0.004760f, 0.001753f, 0.002972f, 0.002304f, 0.000743f, + 0.001546f, -0.000021f, 0.001869f, 0.004256f, 0.000894f, 0.001748f, 0.003038f, 0.004139f, -0.001985f, -0.001040f, 0.000988f, 0.001231f, 0.003117f, 0.004861f, -0.024268f, -0.006602f, -0.009021f, 0.010382f, 0.000298f, -0.004980f, -0.031184f, -0.004101f, -0.004235f, 0.012905f, 0.030746f, -0.008868f, 0.020631f, 0.003568f, -0.018296f, -0.018610f, 0.003163f, 0.004738f, -0.010666f, 0.011677f, -0.008446f, 0.009411f, -0.011667f, 0.005617f, 0.003927f, -0.011016f, -0.009347f, -0.007073f, 0.003592f, 0.012063f, -0.015790f, 0.000590f, -0.016599f, -0.000919f, -0.006356f, 0.004034f, 0.011999f, 0.001272f, -0.005289f, -0.004617f, 0.012994f, -0.000037f, 0.019843f, 0.006118f, -0.007573f, -0.007221f, -0.005831f, 0.002853f, 0.012428f, -0.000256f, 0.020644f, -0.036873f, -0.027258f, -0.022004f, -0.005155f, -0.018768f, 0.001155f, -0.007064f, 0.006614f, 0.016749f, 0.002945f, 0.006933f, 0.010678f, 0.017729f, 0.009054f, 0.002714f, -0.012290f, -0.030523f, -0.032229f, 0.017264f, 0.001106f, 0.021915f, -0.015672f, -0.011236f, 0.009542f, -0.022593f, 0.000388f, -0.008070f, -0.000912f, -0.014571f, 0.000515f, 0.004862f, + 0.013106f, 0.002380f, 0.002073f, -0.004201f, 0.004689f, -0.000962f, 0.001514f, 0.003677f, 0.005906f, 0.007675f, -0.002136f, -0.003223f, 0.005536f, 0.002830f, -0.002179f, -0.004047f, 0.000801f, -0.000675f, -0.000538f, -0.001714f, 0.000818f, 0.000059f, -0.002242f, -0.000747f, 0.002250f, 0.004151f, 0.003288f, 0.002852f, 0.001448f, -0.009358f, -0.005190f, -0.003579f, -0.003364f, 0.005028f, -0.000815f, -0.001550f, 0.000010f, 0.001434f, 0.000339f, 0.014619f, 0.006387f, -0.011645f, -0.000318f, 0.027837f, 0.023599f, -0.002181f, -0.020398f, -0.034418f, -0.003927f, -0.012082f, 0.012312f, -0.010314f, -0.010153f, -0.038976f, -0.016724f, -0.034910f, 0.012885f, -0.001141f, -0.008507f, 0.009304f, -0.001222f, 0.000215f, 0.002530f, -0.011203f, 0.000991f, -0.012869f, -0.002285f, 0.007826f, 0.005822f, -0.013126f, 0.004734f, 0.013410f, 0.021822f, -0.003295f, -0.003049f, -0.007251f, 0.001245f, 0.011337f, 0.016088f, -0.002299f, 0.002383f, -0.003457f, -0.002780f, 0.019173f, 0.013952f, 0.000575f, 0.014391f, 0.004180f, -0.017618f, 0.003343f, -0.001764f, 0.022821f, 0.008925f, 0.002890f, 0.011018f, 0.014814f, + 0.004087f, -0.012999f, -0.022280f, -0.005127f, 0.004666f, 0.011980f, 0.006124f, 0.000767f, 0.004687f, 0.017707f, 0.003914f, 0.005774f, 0.008165f, 0.004781f, -0.011349f, -0.012827f, -0.011147f, -0.012670f, -0.011601f, 0.019685f, 0.002790f, 0.015208f, -0.013330f, -0.011759f, -0.002247f, 0.012715f, -0.007924f, 0.006785f, 0.003905f, 0.002046f, -0.006727f, -0.004264f, -0.006214f, -0.004244f, -0.007085f, 0.002853f, 0.002313f, -0.001921f, 0.004690f, -0.003058f, 0.002220f, -0.001222f, 0.000532f, 0.002153f, -0.006269f, -0.003887f, -0.006291f, -0.004066f, -0.007668f, -0.002190f, -0.006355f, -0.003033f, -0.003676f, -0.004833f, -0.000299f, 0.005593f, 0.001839f, 0.002344f, -0.001979f, -0.000524f, -0.000679f, -0.001309f, 0.004361f, -0.002036f, 0.048824f, 0.010699f, -0.015047f, 0.008724f, -0.008755f, -0.028940f, -0.005840f, -0.028388f, -0.015534f, 0.014703f, 0.019621f, 0.007581f, 0.004088f, 0.001672f, 0.003693f, 0.018593f, -0.013106f, 0.026301f, -0.016893f, -0.017275f, 0.021095f, 0.009343f, -0.033722f, 0.014837f, 0.008795f, 0.010765f, 0.022483f, 0.011040f, 0.016778f, -0.001096f, 0.009196f, -0.005269f, + 0.014372f, 0.003756f, 0.003255f, 0.009492f, -0.018850f, -0.010275f, -0.005610f, 0.012269f, 0.005572f, 0.004430f, 0.009987f, 0.002877f, 0.003722f, -0.017199f, 0.000455f, 0.018720f, -0.003062f, 0.002359f, 0.002656f, 0.002471f, 0.022633f, 0.008672f, 0.030349f, 0.007007f, -0.003962f, 0.028633f, -0.024245f, -0.003111f, -0.003556f, -0.009718f, -0.001906f, 0.006077f, 0.028648f, 0.002815f, -0.005658f, -0.010897f, 0.006208f, -0.011461f, -0.004585f, -0.007336f, -0.015129f, -0.002376f, 0.004521f, 0.024328f, -0.001633f, -0.023275f, -0.006093f, -0.013923f, -0.006655f, 0.017030f, 0.014035f, 0.015963f, -0.012210f, 0.002743f, -0.013625f, -0.001990f, -0.004351f, -0.008324f, -0.004322f, -0.011462f, -0.006339f, -0.002036f, -0.004536f, -0.015081f, -0.005593f, -0.004222f, -0.002670f, -0.003296f, -0.004909f, 0.000830f, -0.002132f, -0.011824f, -0.000178f, -0.005605f, -0.003015f, -0.000836f, 0.000301f, 0.002291f, 0.000052f, 0.005561f, 0.005724f, 0.001101f, 0.001393f, -0.003657f, -0.002914f, -0.000705f, -0.003608f, 0.005704f, 0.003733f, 0.005372f, 0.005356f, 0.002309f, 0.007325f, 0.004756f, 0.002192f, 0.003405f, + -0.000463f, -0.002594f, 0.005335f, 0.007169f, -0.017501f, -0.027163f, -0.009708f, -0.026745f, 0.019228f, -0.022830f, -0.016676f, -0.013475f, 0.012181f, 0.030446f, -0.030891f, -0.011063f, -0.034823f, 0.009925f, 0.004945f, 0.003202f, -0.009951f, 0.002652f, 0.039364f, -0.020631f, -0.003377f, 0.014805f, 0.010237f, 0.007709f, 0.013897f, 0.009131f, -0.012849f, -0.021913f, -0.004005f, -0.012171f, -0.016409f, -0.020238f, 0.000398f, -0.004781f, 0.005040f, 0.025887f, 0.016514f, -0.014660f, -0.007804f, -0.001710f, -0.007458f, 0.006278f, 0.049452f, -0.016841f, 0.034519f, 0.010709f, 0.005864f, -0.002339f, -0.005509f, 0.005744f, -0.018839f, 0.008969f, 0.026884f, 0.001051f, 0.004356f, 0.021373f, 0.013998f, 0.008219f, -0.018018f, 0.015047f, -0.010715f, -0.016204f, -0.043537f, -0.013810f, 0.028406f, -0.016196f, 0.007417f, -0.030779f, 0.022038f, -0.011641f, -0.012023f, 0.019106f, -0.030530f, -0.022707f, 0.034740f, -0.024790f, -0.023197f, 0.013832f, -0.015891f, 0.003152f, 0.000126f, 0.009853f, -0.025031f, 0.007829f, 0.000728f, 0.024969f, -0.018563f, 0.006155f, -0.002576f, -0.014220f, 0.018627f, 0.003706f, + -0.015379f, -0.011253f, -0.010575f, 0.001586f, 0.000027f, -0.007823f, 0.000274f, 0.009642f, -0.000746f, 0.006823f, 0.007785f, 0.006090f, -0.013845f, 0.007698f, 0.007148f, 0.011135f, -0.000220f, 0.000796f, -0.010054f, -0.004067f, -0.004919f, -0.005269f, 0.002396f, -0.001188f, 0.006530f, -0.009220f, -0.005747f, 0.003453f, -0.008847f, -0.007520f, 0.003223f, -0.019716f, -0.014699f, -0.002000f, 0.022412f, -0.010623f, 0.039396f, 0.036696f, 0.007187f, 0.011746f, -0.021347f, 0.002628f, -0.017296f, 0.027536f, -0.005562f, 0.008098f, -0.013212f, -0.008541f, 0.004633f, 0.003687f, -0.012698f, 0.021082f, -0.006039f, 0.004438f, 0.007808f, -0.013882f, 0.005162f, -0.017705f, -0.000003f, 0.009983f, 0.011945f, 0.000218f, 0.015814f, 0.019999f, -0.001595f, -0.037665f, -0.006424f, -0.011205f, 0.026807f, -0.022797f, -0.028321f, -0.020220f, -0.013580f, 0.003820f, -0.016101f, -0.012660f, -0.008162f, -0.002418f, 0.004835f, -0.055211f, 0.034674f, 0.027012f, 0.039545f, -0.012727f, 0.006243f, 0.026461f, -0.025541f, -0.023670f, 0.004528f, 0.017239f, 0.011276f, -0.003123f, 0.005217f, -0.014058f, -0.016732f, -0.021319f, + -0.006371f, 0.073144f, 0.005738f, -0.040767f, -0.007428f, -0.022407f, 0.013813f, 0.010800f, -0.025354f, 0.005239f, -0.007907f, 0.001919f, -0.012611f, 0.015515f, 0.015796f, -0.002551f, -0.008308f, -0.009788f, -0.032115f, 0.009445f, 0.004942f, -0.001463f, 0.012972f, -0.006549f, 0.001891f, 0.004934f, -0.015364f, 0.005616f, 0.008818f, 0.020724f, 0.010883f, 0.001113f, -0.018236f, -0.000065f, 0.016161f, 0.000763f, -0.000266f, 0.012079f, -0.000017f, 0.003989f, 0.011824f, 0.010048f, -0.002164f, 0.005402f, 0.009947f, 0.009250f, -0.004829f, 0.003921f, 0.011985f, 0.014858f, 0.010817f, -0.000568f, -0.008261f, -0.002049f, 0.000001f, 0.009200f, -0.000385f, -0.002965f, 0.000267f, 0.003205f, -0.006303f, 0.003219f, 0.005475f, -0.006044f, 0.003350f, -0.010592f, -0.020973f, -0.040481f, 0.003270f, -0.033818f, 0.015928f, 0.005453f, -0.027221f, 0.015353f, 0.017664f, 0.024624f, 0.007121f, 0.009731f, -0.028251f, -0.000578f, -0.005635f, 0.026299f, 0.012241f, 0.001148f, 0.024599f, 0.027398f, -0.003304f, -0.013145f, 0.003130f, 0.033788f, -0.022015f, -0.017457f, 0.017416f, 0.009494f, -0.022395f, -0.004997f, + -0.020723f, 0.038641f, -0.033007f, 0.009129f, 0.020558f, -0.012487f, 0.018894f, 0.006763f, -0.009442f, -0.010081f, -0.010162f, -0.015805f, 0.021631f, 0.029105f, 0.005805f, -0.022445f, 0.002303f, -0.024786f, -0.009440f, 0.015997f, -0.003083f, -0.012367f, -0.009045f, 0.004023f, -0.032901f, 0.000879f, -0.003480f, -0.019078f, 0.025636f, -0.025412f, -0.001743f, -0.005970f, -0.018742f, 0.019666f, -0.001608f, 0.011305f, -0.009553f, -0.002123f, -0.001165f, -0.012161f, 0.009186f, -0.011224f, -0.002090f, -0.011058f, 0.029645f, 0.012561f, -0.035297f, -0.007950f, -0.058134f, 0.033314f, -0.000137f, -0.026416f, 0.023440f, 0.002300f, 0.003440f, 0.008345f, 0.000380f, 0.013209f, 0.016417f, 0.003452f, -0.004303f, 0.008795f, 0.017658f, -0.010388f, -0.006268f, 0.006897f, 0.002530f, 0.004069f, 0.005182f, 0.008678f, 0.012028f, -0.008173f, 0.006269f, 0.003504f, -0.009548f, -0.009031f, 0.007635f, 0.001279f, -0.001001f, -0.006694f, -0.005798f, -0.010730f, 0.010294f, 0.010304f, 0.001785f, -0.007285f, -0.021923f, 0.000134f, 0.001972f, 0.006798f, -0.014081f, 0.001206f, 0.011130f, -0.006447f, 0.012879f, 0.005470f, + -0.000851f, 0.003221f, 0.007005f, 0.000257f, 0.002547f, 0.003523f, 0.008610f, 0.035430f, 0.001335f, -0.026976f, -0.011596f, 0.015933f, 0.025807f, 0.027659f, 0.000994f, -0.006509f, 0.038888f, 0.016915f, 0.043222f, 0.005250f, 0.003665f, -0.020842f, -0.008572f, -0.012370f, 0.011530f, 0.006229f, 0.023376f, -0.026822f, 0.001810f, -0.015980f, 0.014338f, -0.023257f, 0.008820f, 0.025681f, -0.003876f, -0.000821f, -0.013445f, 0.003598f, -0.013533f, -0.046232f, 0.006335f, -0.007152f, 0.003202f, -0.020684f, -0.004546f, 0.017977f, 0.034859f, -0.003675f, -0.012677f, 0.020239f, 0.009528f, 0.004892f, 0.023991f, 0.008305f, -0.012833f, -0.006182f, 0.015483f, -0.002185f, 0.014131f, -0.016932f, -0.015066f, 0.005178f, -0.014159f, -0.027130f, -0.012538f, -0.030892f, -0.006905f, 0.010367f, -0.024258f, -0.003508f, -0.027859f, -0.012201f, -0.000214f, 0.010935f, -0.033197f, 0.014502f, 0.002451f, -0.019755f, 0.024717f, -0.008824f, 0.006539f, 0.043823f, 0.049616f, 0.003185f, 0.017443f, 0.036288f, 0.043393f, 0.043074f, -0.004254f, -0.028719f, -0.044031f, -0.016003f, -0.029194f, 0.027566f, -0.005942f, -0.012999f, + 0.007049f, -0.000707f, 0.003003f, -0.000515f, -0.013054f, 0.014011f, 0.003950f, 0.005262f, 0.001010f, 0.018944f, -0.010600f, -0.000185f, -0.005822f, 0.013153f, -0.012197f, -0.005166f, -0.001300f, 0.018719f, -0.004879f, 0.011323f, 0.015412f, -0.014114f, -0.003036f, -0.005938f, -0.016026f, -0.006428f, -0.003678f, 0.006970f, 0.000548f, 0.021942f, 0.005937f, 0.014875f, -0.001409f, -0.014027f, 0.003939f, 0.000437f, 0.059299f, 0.068596f, 0.003307f, 0.022153f, 0.020675f, -0.002620f, -0.049437f, -0.001043f, -0.002252f, -0.018389f, 0.013587f, 0.013114f, -0.027037f, 0.014834f, 0.018457f, 0.003348f, -0.007401f, 0.010429f, -0.007110f, 0.035050f, -0.006251f, -0.016052f, -0.000050f, 0.008141f, -0.003553f, -0.002068f, -0.000899f, -0.055260f, 0.015747f, -0.001044f, -0.038600f, -0.015679f, 0.006362f, -0.003392f, -0.026388f, 0.009284f, -0.031094f, -0.002580f, 0.002768f, -0.049272f, -0.009113f, 0.021438f, -0.016142f, 0.002511f, 0.030954f, 0.019333f, 0.023621f, 0.007636f, -0.013699f, -0.022907f, 0.023510f, -0.012062f, 0.013063f, -0.021754f, -0.011715f, 0.015974f, 0.026440f, 0.004117f, 0.031722f, -0.021220f, + 0.027413f, -0.023195f, -0.028423f, -0.019922f, 0.027324f, 0.029061f, -0.026885f, 0.014010f, -0.073825f, -0.006506f, 0.021401f, 0.007061f, -0.011778f, -0.029109f, 0.013280f, -0.041231f, 0.006463f, -0.021147f, 0.019432f, -0.031786f, -0.020652f, 0.032339f, 0.000503f, 0.016377f, 0.003430f, 0.014310f, -0.007441f, 0.006060f, -0.003854f, -0.023741f, -0.004558f, -0.010933f, 0.007254f, -0.007475f, 0.004052f, 0.001225f, 0.003780f, 0.002202f, -0.005497f, -0.007014f, 0.000806f, -0.014906f, 0.005210f, 0.004604f, 0.008515f, -0.009437f, 0.008456f, 0.008364f, 0.005109f, 0.007242f, 0.004900f, -0.010141f, 0.000902f, 0.005397f, -0.007923f, 0.014290f, -0.001464f, -0.005084f, -0.008190f, 0.000260f, 0.001044f, 0.006988f, -0.005287f, 0.006651f, -0.005114f, 0.015039f, 0.006255f, -0.012026f, -0.003424f, -0.002720f, -0.006037f, -0.004851f, -0.053983f, 0.003973f, 0.066842f, -0.045189f, -0.004228f, -0.003924f, 0.003571f, -0.017883f, 0.008554f, -0.028510f, -0.029167f, -0.009637f, -0.007953f, 0.007049f, -0.007324f, 0.015199f, -0.021860f, 0.000715f, 0.043004f, -0.035239f, -0.031072f, -0.007551f, 0.037634f, 0.005244f, + -0.047079f, 0.020038f, -0.017457f, -0.020162f, 0.004701f, 0.064724f, -0.036402f, -0.020323f, 0.046107f, 0.034116f, 0.002989f, -0.019081f, 0.001285f, -0.007110f, -0.014617f, 0.013165f, 0.012058f, -0.007872f, -0.037328f, 0.047819f, 0.022491f, 0.009028f, -0.050823f, -0.007812f, 0.015815f, 0.017565f, -0.006305f, 0.026708f, -0.004297f, 0.009064f, -0.011639f, -0.030654f, 0.019976f, -0.021881f, 0.013127f, 0.006771f, -0.026821f, 0.050663f, 0.007814f, 0.036478f, 0.036619f, 0.006504f, -0.055050f, -0.010589f, 0.000537f, -0.021892f, -0.011079f, 0.002065f, -0.001744f, 0.023901f, 0.044969f, -0.013006f, -0.004387f, -0.019851f, -0.008852f, 0.018670f, -0.012599f, 0.010847f, 0.033436f, -0.029232f, 0.033234f, -0.006533f, 0.009994f, -0.012638f, -0.006769f, -0.010609f, 0.001443f, 0.006203f, 0.007339f, -0.005560f, 0.000186f, 0.007584f, 0.004324f, 0.017566f, 0.008246f, -0.008865f, 0.000756f, 0.001603f, 0.016026f, -0.008878f, 0.004665f, 0.007404f, 0.002501f, -0.000624f, 0.000568f, -0.020897f, 0.010272f, -0.007691f, 0.010057f, 0.013114f, 0.001763f, -0.002117f, 0.006671f, -0.000684f, 0.005107f, 0.001738f, + -0.002175f, -0.007716f, -0.007850f, 0.015585f, 0.002666f, -0.003643f, 0.004376f, -0.009695f, -0.001824f, 0.015890f, 0.020844f, 0.002878f, -0.019186f, -0.096028f, 0.006308f, -0.025025f, 0.003311f, 0.048140f, 0.004594f, -0.009231f, 0.008763f, 0.001907f, -0.032625f, -0.035157f, -0.031720f, -0.030392f, 0.039621f, -0.007878f, 0.047291f, 0.004259f, -0.044680f, -0.001508f, 0.004927f, 0.038341f, 0.007536f, -0.006120f, -0.007610f, 0.011001f, -0.024060f, -0.009149f, 0.042331f, -0.008561f, -0.054976f, -0.041919f, 0.025092f, -0.005385f, -0.011428f, 0.012712f, -0.003946f, -0.028245f, 0.008539f, 0.016715f, 0.038116f, -0.007599f, -0.031643f, 0.000517f, -0.039909f, 0.015441f, 0.045179f, -0.007145f, -0.055450f, 0.017546f, -0.000635f, 0.003211f, 0.013366f, -0.017373f, 0.034127f, 0.002656f, -0.023022f, 0.018000f, -0.012464f, -0.007608f, 0.048766f, -0.024881f, -0.008386f, -0.008100f, 0.030727f, 0.012448f, -0.053935f, 0.027468f, -0.043462f, -0.010269f, -0.023447f, 0.005710f, -0.014297f, -0.013076f, -0.004481f, 0.024878f, -0.008043f, -0.015160f, 0.029327f, -0.016987f, 0.030107f, -0.000050f, -0.015885f, -0.009458f, + 0.007504f, 0.008396f, 0.005983f, -0.017977f, -0.005965f, 0.004561f, -0.000989f, -0.011718f, 0.000291f, 0.011282f, 0.017211f, 0.007280f, 0.008872f, 0.001525f, 0.016925f, -0.009438f, 0.005526f, 0.013481f, -0.005029f, 0.001804f, 0.005495f, -0.003211f, 0.002719f, 0.005421f, -0.016490f, 0.014111f, 0.006021f, -0.016516f, -0.013580f, 0.001102f, -0.019512f, 0.001842f, -0.014354f, 0.018829f, -0.033710f, 0.000065f, -0.007057f, 0.003699f, -0.008693f, 0.010689f, -0.005519f, 0.005055f, 0.003909f, -0.046917f, 0.009606f, 0.077449f, 0.050455f, 0.023073f, -0.038431f, 0.028793f, 0.036417f, 0.053873f, 0.026026f, 0.006362f, 0.001917f, 0.033749f, 0.058271f, -0.013155f, -0.007094f, 0.032992f, -0.065228f, 0.023735f, 0.058210f, -0.012073f, -0.020150f, 0.015104f, 0.045202f, 0.036393f, -0.024320f, -0.041692f, -0.002435f, 0.020968f, -0.007046f, 0.005050f, 0.000693f, 0.048894f, -0.027896f, 0.031323f, 0.047329f, -0.018931f, -0.005688f, 0.033393f, -0.004968f, 0.117090f, -0.049061f, 0.021085f, 0.080189f, -0.046148f, 0.015175f, 0.005368f, -0.064921f, -0.002011f, 0.012191f, -0.028648f, 0.063620f, 0.004816f, + -0.008658f, 0.004952f, -0.026358f, 0.087146f, 0.024117f, -0.069833f, 0.067483f, -0.028158f, 0.002598f, 0.020691f, 0.025135f, 0.044737f, 0.021918f, -0.012069f, -0.043543f, -0.058718f, -0.021925f, -0.023528f, -0.003906f, -0.018008f, 0.037061f, -0.022442f, -0.038793f, 0.004378f, 0.010902f, 0.007951f, 0.014332f, -0.022013f, -0.021321f, -0.013010f, -0.014044f, -0.046272f, -0.019400f, -0.015733f, -0.031809f, -0.015340f, 0.011626f, -0.013566f, -0.029807f, -0.001398f, 0.011848f, 0.020183f, -0.004550f, 0.009519f, 0.022138f, -0.001217f, -0.014687f, -0.000878f, -0.008821f, 0.012260f, 0.017716f, -0.024488f, 0.021814f, -0.012662f, 0.000504f, 0.003294f, -0.011146f, 0.022734f, 0.009005f, -0.031803f, 0.019874f, 0.003034f, -0.011052f, 0.023590f, -0.026496f, 0.010803f, -0.004721f, 0.011565f, -0.006086f, -0.007381f, 0.004780f, -0.004313f, -0.002392f, 0.008349f, -0.004505f, -0.018189f, 0.008828f, -0.001627f, 0.005939f, -0.000728f, 0.015669f, 0.019182f, -0.090132f, 0.052504f, 0.002349f, 0.031745f, 0.052255f, -0.086391f, 0.019715f, 0.044490f, 0.010034f, 0.033202f, -0.033321f, 0.036549f, 0.010609f, -0.033856f, + 0.000455f, -0.021331f, -0.063323f, 0.034747f, 0.019661f, 0.057879f, -0.032062f, -0.042365f, -0.014877f, 0.013595f, -0.008875f, -0.071716f, -0.035473f, 0.022079f, -0.005426f, 0.010759f, -0.030358f, -0.009359f, 0.023788f, -0.020198f, -0.010183f, -0.030599f, -0.007261f, 0.011188f, -0.034029f, 0.003612f, -0.074216f, -0.060957f, 0.018750f, -0.063408f, 0.005416f, -0.066339f, -0.046643f, -0.031981f, 0.031111f, 0.062008f, 0.076160f, -0.018006f, 0.033772f, 0.041410f, 0.019891f, 0.017989f, -0.029744f, 0.084991f, 0.086437f, -0.058774f, 0.058863f, -0.046223f, 0.029542f, 0.061008f, 0.057721f, 0.070685f, 0.084048f, 0.059814f, -0.067174f, -0.047477f, -0.000662f, 0.001790f, 0.025178f, -0.015835f, -0.013047f, -0.040024f, -0.022423f, -0.059432f, 0.012923f, 0.050160f, -0.020369f, 0.012409f, 0.052050f, 0.024763f, -0.035930f, 0.040283f, -0.002639f, 0.014354f, -0.004094f, -0.006915f, 0.011413f, -0.012444f, 0.017590f, 0.015183f, -0.013490f, -0.015923f, 0.015156f, -0.010785f, 0.000368f, 0.000685f, -0.001437f, 0.004588f, 0.001342f, -0.021256f, 0.019812f, -0.008893f, 0.009379f, 0.011710f, -0.008153f, 0.012599f, + -0.015516f, -0.011008f, 0.009980f, -0.012067f, -0.016022f, -0.006757f, 0.006108f, -0.005960f, 0.003725f, -0.014074f, 0.000306f, 0.005525f, 0.012982f, 0.020016f, -0.004897f, 0.011394f, -0.013288f, 0.000276f, -0.002643f, 0.006258f, 0.004341f, -0.000906f, -0.010338f, 0.111522f, -0.081633f, -0.041530f, 0.043969f, -0.026173f, 0.042001f, -0.032746f, -0.036535f, 0.012334f, -0.086337f, -0.003908f, 0.058034f, -0.014015f, 0.029822f, -0.049520f, -0.012183f, -0.019556f, 0.001955f, 0.061911f, 0.018712f, 0.013754f, -0.011065f, 0.033980f, 0.010920f, 0.084589f, 0.020796f, 0.049381f, 0.003501f, -0.038630f, -0.036538f, 0.049216f, -0.023956f, 0.022753f, -0.000495f, -0.063544f, 0.045786f, -0.056619f, 0.109911f, -0.081964f, 0.050003f, 0.044769f, -0.047074f, -0.039566f, -0.029237f, 0.040578f, -0.003127f, 0.042465f, -0.000564f, 0.005518f, -0.075201f, -0.040423f, 0.017459f, -0.036978f, 0.012200f, -0.022563f, 0.022044f, 0.012507f, 0.057695f, -0.034345f, -0.011858f, -0.014670f, -0.028345f, 0.078237f, 0.014445f, 0.007327f, -0.072952f, -0.023658f, 0.039162f, 0.023098f, 0.024923f, 0.067754f, 0.043339f, 0.059907f, + 0.069140f, -0.002072f, 0.030585f, -0.028835f, 0.091980f, 0.006871f, -0.015258f, 0.033482f, -0.007930f, 0.070573f, 0.001213f, -0.014287f, -0.014661f, 0.008397f, 0.049593f, -0.037742f, 0.025582f, -0.012063f, -0.004160f, 0.014663f, 0.009790f, 0.019256f, -0.012234f, 0.012505f, 0.023091f, -0.006175f, -0.008926f, 0.015611f, -0.002669f, -0.002557f, -0.001887f, 0.004122f, 0.002441f, 0.007451f, -0.016992f, 0.021985f, -0.013163f, -0.007329f, -0.003719f, 0.013387f, -0.019235f, 0.001796f, -0.013818f, 0.018336f, 0.033289f, -0.011345f, -0.009441f, -0.004604f, 0.022789f, 0.011139f, 0.023804f, -0.002101f, -0.014160f, 0.010799f, 0.011311f, -0.003625f, 0.011194f, 0.008722f, -0.032844f, 0.004854f, 0.037070f, -0.005206f, -0.168332f, 0.117026f, -0.072522f, -0.050716f, 0.001302f, 0.024060f, 0.030278f, 0.005500f, -0.026871f, 0.091133f, 0.046283f, 0.012791f, -0.045478f, 0.029951f, -0.001429f, 0.034044f, -0.043405f, -0.029999f, 0.023437f, 0.068178f, -0.077927f, 0.003293f, 0.025459f, 0.008405f, -0.019051f, -0.011438f, -0.009663f, 0.003250f, -0.003787f, 0.017750f, 0.086023f, 0.005655f, -0.038601f, 0.057857f, + -0.013279f, -0.055672f, -0.071795f, 0.068706f, 0.022637f, -0.009386f, 0.025757f, 0.015995f, 0.057275f, -0.077281f, -0.007974f, -0.039231f, -0.010952f, 0.044409f, -0.032388f, 0.017399f, -0.037377f, 0.018313f, 0.118579f, 0.009107f, -0.067465f, -0.075868f, -0.004427f, 0.036360f, 0.035811f, -0.030325f, 0.007640f, 0.057730f, -0.023892f, -0.111334f, 0.063853f, -0.038298f, -0.063110f, 0.027972f, 0.106018f, -0.072910f, 0.053576f, 0.073843f, 0.025728f, -0.063714f, -0.052967f, -0.032688f, 0.026918f, 0.023179f, -0.021709f, 0.066287f, 0.032660f, -0.004024f, -0.001513f, 0.004103f, -0.054834f, -0.020968f, -0.038676f, 0.020254f, 0.018285f, 0.013263f, 0.018486f, 0.013675f, 0.041191f, -0.020241f, -0.009431f, 0.007917f, 0.000687f, -0.031326f, 0.027709f, -0.001094f, 0.017607f, -0.007761f, 0.013440f, -0.020148f, -0.005553f, -0.012120f, 0.019822f, 0.003715f, 0.004659f, 0.000617f, 0.012279f, 0.029943f, -0.011021f, -0.056964f, 0.005513f, -0.028103f, -0.004624f, 0.017084f, -0.023215f, -0.015657f, 0.033363f, -0.030283f, -0.005745f, 0.000263f, 0.016607f, -0.032438f, 0.003411f, 0.097262f, 0.031185f, 0.007031f, + -0.007705f, 0.015941f, 0.026572f, -0.008043f, 0.012067f, -0.014016f, -0.000756f, -0.010948f, 0.044769f, -0.050318f, -0.006339f, 0.031065f, -0.071363f, 0.023509f, -0.017881f, 0.005943f, -0.008897f, -0.019193f, 0.012034f, -0.004862f, -0.029426f, 0.078122f, -0.059772f, -0.016044f, 0.054428f, -0.034678f, -0.006004f, -0.010530f, 0.011505f, 0.055047f, 0.003635f, -0.052528f, 0.072214f, -0.038749f, 0.025348f, 0.045963f, 0.019621f, -0.016364f, 0.003427f, -0.039420f, 0.009187f, -0.023648f, -0.019643f, 0.098098f, -0.023249f, -0.038304f, 0.012119f, -0.017585f, 0.022576f, -0.014588f, 0.024847f, 0.063321f, -0.035090f, 0.021341f, 0.047358f, -0.055790f, 0.025238f, 0.031234f, 0.013450f, 0.038950f, -0.044329f, -0.010963f, 0.066466f, -0.045706f, -0.010780f, 0.019710f, -0.019343f, 0.064531f, -0.064126f, 0.011369f, 0.022324f, -0.028794f, 0.021699f, 0.025016f, -0.061098f, 0.022110f, 0.050994f, 0.000011f, -0.016105f, -0.001864f, 0.032591f, -0.006285f, -0.057412f, 0.046766f, 0.021311f, -0.024390f, 0.008869f, -0.013181f, 0.019891f, -0.007413f, -0.026031f, 0.030523f, 0.001065f, -0.005929f, -0.022710f, 0.021393f, + 0.003350f, -0.028871f, 0.009930f, 0.020344f, -0.004682f, -0.009043f, 0.003713f, 0.018858f, -0.003302f, -0.018352f, 0.018784f, 0.013299f, 0.001770f, -0.000344f, 0.015610f, 0.003741f, 0.005091f, -0.021912f, 0.028046f, -0.015144f, 0.029953f, -0.054583f, -0.147069f, -0.231299f, 0.021111f, 0.221556f, 0.018314f, 0.501569f, 0.517857f, 0.257846f, 0.542173f, 0.361620f, -0.074732f, -0.007583f, -0.118933f, -0.434827f, -0.381559f, -0.235791f, -0.444094f, -0.347565f, -0.100713f, -0.217638f, -0.182043f, 0.065083f, 0.109843f, -0.052464f, 0.029157f, 0.098123f, -0.074614f, -0.043488f, 0.138203f, 0.122750f, 0.014709f, 0.137171f, 0.233753f, 0.078516f, 0.169330f, 0.319515f, 0.153910f, 0.081558f, 0.286497f, 0.239543f, 0.032713f, 0.172283f, 0.335669f, 0.067101f, 0.079768f, 0.271267f, 0.117491f, -0.028380f, 0.192187f, 0.181372f, -0.015836f, 0.160264f, 0.206745f, -0.002490f, -0.149625f, -0.069278f, -0.352904f, -0.583719f, -0.518941f, -0.553496f, -0.845752f, -0.759688f, -0.710741f, -0.864744f, -0.840053f, -0.689108f, -0.621188f, -0.558855f, -0.323137f, -0.123796f, 0.110477f, 0.234127f, 0.447637f, 0.666939f, + 0.728107f, 0.810900f, 1.057906f, 1.043998f, 0.821686f, 0.898741f, 0.794792f, 0.329442f, 0.358991f, 0.305142f, -0.011874f, -0.048917f, 0.089148f, -0.011394f, -0.135376f, 0.018563f, 0.092716f, -0.087557f, -0.034093f, 0.082008f, -0.041823f, -0.172260f, -0.056148f, -0.045886f, -0.249629f, -0.176687f, -0.046796f, -0.195637f, -0.221595f, -0.014388f, -0.077862f, -0.224190f, -0.107117f, -0.100868f, -0.315508f, -0.299167f, -0.270911f, -0.489372f, -0.529035f, -0.441027f, -0.470369f, -0.507699f, -0.363303f, -0.309743f, -0.268534f, -0.194147f, -0.103861f, -0.046080f, -0.011384f, 0.042471f, 0.175745f, 0.239379f, 0.368553f, 0.600005f, 0.678490f, 0.750495f, 0.876548f, 0.856700f, 0.755161f, 0.643957f, 0.452968f, 0.197610f, 0.053316f, -0.040684f, -0.138055f, -0.162889f, -0.159486f, -0.161158f, -0.164436f, -0.152670f, -0.136756f, -0.147401f, -0.150168f, -0.140723f, -0.150471f, -0.164408f, -0.153986f, -0.143525f, -0.131423f, -0.094664f, -0.043980f, -0.010207f, 0.002737f, 0.003902f, 0.000883f} + }, + { + {0.003031f, 0.012017f, -0.005986f, 0.003317f, -0.001243f, 0.000684f, 0.000563f, -0.004865f, -0.005516f, 0.003597f, -0.001010f, -0.004436f, -0.005656f, -0.003495f, 0.004980f, -0.000533f, 0.006685f, 0.001392f, -0.008487f, -0.008776f, -0.006224f, 0.002543f, 0.002165f, 0.004529f, -0.000681f, 0.005185f, -0.003977f, -0.000750f, -0.009178f, -0.001426f, -0.001713f, 0.001879f, 0.003451f, 0.003449f, 0.006776f, -0.003390f, -0.004539f, 0.003651f, 0.002068f, -0.004440f, -0.004514f, 0.000195f, 0.003152f, 0.001494f, 0.007524f, -0.002881f, -0.002386f, 0.008511f, 0.002607f, 0.015971f, 0.006796f, -0.004508f, -0.000154f, -0.009864f, 0.000184f, -0.011241f, -0.000740f, -0.004219f, 0.007752f, 0.000796f, 0.004161f, 0.005656f, 0.003073f, 0.005422f, 0.003622f, 0.000750f, -0.009413f, -0.001070f, -0.004718f, 0.006466f, 0.009473f, -0.006668f, -0.004730f, -0.002881f, -0.003835f, -0.005039f, -0.008070f, -0.001857f, 0.002420f, -0.004781f, -0.003933f, -0.001700f, -0.006634f, 0.000746f, -0.001334f, -0.004503f, 0.001431f, 0.000215f, -0.000026f, -0.002229f, 0.000396f, 0.000393f, 0.002467f, -0.000709f, 0.001592f, -0.000843f, + 0.001152f, -0.000344f, -0.001490f, 0.000383f, 0.001939f, 0.000304f, -0.001738f, -0.001813f, -0.000183f, 0.003280f, 0.000767f, -0.000664f, 0.000533f, -0.000995f, -0.018872f, -0.020175f, -0.001603f, -0.005786f, 0.000777f, -0.004378f, -0.001189f, 0.011226f, -0.002007f, 0.006035f, -0.002774f, -0.005396f, -0.007458f, 0.001370f, -0.001542f, -0.008908f, 0.010269f, 0.003085f, 0.000706f, 0.005474f, 0.005223f, 0.008467f, 0.005965f, -0.000562f, -0.006300f, 0.005882f, 0.001371f, -0.008493f, -0.003752f, -0.003830f, -0.002544f, 0.007592f, -0.002600f, -0.012952f, -0.004386f, -0.001481f, 0.002705f, -0.004026f, -0.008427f, 0.000275f, -0.000822f, 0.009790f, 0.001451f, -0.000079f, 0.003577f, -0.000225f, 0.013210f, -0.002279f, 0.001216f, -0.002920f, -0.005241f, 0.000005f, 0.005673f, 0.002565f, 0.001548f, 0.005361f, -0.004918f, -0.008196f, -0.005862f, -0.001180f, 0.001079f, -0.001912f, 0.000235f, -0.006152f, -0.001362f, 0.003224f, -0.001962f, 0.006417f, 0.003349f, -0.000362f, 0.001191f, -0.006017f, -0.005124f, 0.009958f, 0.002263f, 0.004242f, 0.002889f, -0.001770f, -0.000585f, -0.007563f, 0.000534f, -0.004321f, + 0.001857f, -0.001473f, 0.001926f, 0.002053f, 0.005856f, -0.000608f, -0.002047f, 0.000346f, 0.001255f, 0.000785f, 0.000210f, 0.000208f, -0.001764f, -0.001387f, 0.000711f, -0.000636f, -0.001520f, 0.002381f, -0.001204f, 0.001224f, 0.001811f, -0.001713f, -0.000511f, 0.001371f, -0.000517f, 0.002457f, -0.001477f, 0.001221f, -0.001177f, -0.000854f, -0.003069f, 0.002825f, 0.013047f, -0.000722f, 0.006695f, 0.003932f, 0.008928f, 0.010940f, -0.002487f, 0.000890f, 0.006747f, 0.006649f, 0.004462f, 0.012516f, 0.002550f, -0.004110f, 0.000555f, 0.010947f, 0.003868f, 0.005160f, 0.009516f, 0.012764f, 0.008445f, -0.002923f, -0.008751f, 0.006141f, 0.004211f, -0.005094f, -0.008453f, 0.000429f, -0.004934f, 0.002221f, 0.003246f, -0.003125f, -0.004217f, 0.004214f, 0.003366f, 0.007509f, -0.005049f, -0.010340f, -0.005163f, -0.004505f, -0.006863f, -0.002434f, -0.007840f, 0.004640f, -0.010733f, 0.004551f, 0.000914f, 0.002418f, -0.004774f, 0.010183f, 0.007815f, -0.007318f, 0.009004f, 0.003312f, -0.001335f, 0.002890f, -0.006531f, -0.002166f, 0.006155f, 0.002107f, 0.002577f, 0.001529f, 0.007351f, 0.002894f, + 0.009089f, -0.004553f, -0.000553f, -0.000682f, 0.003525f, 0.005173f, -0.002104f, 0.003409f, -0.004779f, 0.002318f, 0.003189f, 0.002775f, 0.009972f, 0.000270f, 0.007440f, 0.008243f, 0.004678f, -0.007703f, -0.001466f, -0.001289f, -0.001995f, 0.000573f, 0.004221f, -0.001860f, 0.000125f, -0.000422f, 0.000477f, 0.001427f, -0.001248f, 0.001695f, 0.002907f, -0.002149f, -0.001096f, 0.002661f, 0.000090f, -0.000085f, -0.000149f, -0.001692f, 0.000685f, -0.000881f, 0.000220f, 0.002032f, 0.003500f, 0.000037f, -0.000485f, 0.001655f, 0.001348f, 0.000440f, 0.000805f, 0.000560f, 0.000851f, -0.000249f, -0.000496f, 0.001441f, 0.001894f, -0.001881f, 0.000991f, -0.000755f, 0.036080f, 0.000301f, 0.031947f, 0.002573f, 0.020234f, -0.004341f, -0.003484f, 0.005546f, -0.015104f, 0.016519f, -0.009389f, 0.011086f, 0.008168f, -0.006031f, 0.004821f, -0.000428f, 0.000612f, -0.002775f, 0.004592f, 0.006544f, 0.008090f, 0.013361f, 0.003250f, 0.004281f, -0.000525f, 0.015713f, -0.018022f, 0.000467f, -0.001386f, 0.004354f, 0.007637f, -0.009446f, 0.003617f, 0.004313f, 0.002190f, 0.006310f, 0.003383f, -0.007278f, + 0.003470f, 0.014077f, -0.002649f, 0.004336f, -0.002389f, -0.002142f, -0.000694f, -0.010038f, 0.015519f, -0.000196f, 0.001485f, 0.011671f, -0.001665f, 0.000946f, 0.014385f, -0.021106f, 0.005768f, -0.000345f, 0.006288f, 0.017175f, 0.005065f, 0.004194f, 0.005886f, -0.001799f, -0.004839f, -0.003181f, 0.004130f, 0.001624f, 0.009135f, -0.003262f, 0.007495f, 0.003590f, -0.002643f, 0.001620f, -0.006112f, -0.003851f, 0.000731f, -0.001700f, -0.008415f, -0.005227f, -0.008609f, 0.005128f, 0.007456f, -0.001952f, 0.002239f, -0.001687f, -0.005757f, -0.000154f, 0.003031f, 0.003233f, -0.010263f, -0.000328f, 0.000853f, -0.001467f, 0.000477f, -0.001995f, 0.000109f, -0.002149f, -0.004996f, 0.000010f, -0.003341f, -0.002503f, -0.004147f, 0.000288f, -0.004058f, -0.001114f, -0.003939f, -0.002807f, -0.000222f, -0.001271f, -0.002143f, -0.000097f, 0.000419f, 0.001985f, -0.002156f, -0.014399f, -0.017746f, -0.007009f, -0.002686f, -0.006613f, 0.014160f, 0.006085f, -0.011348f, 0.012647f, -0.001795f, -0.009183f, 0.002722f, 0.005521f, -0.005155f, -0.008391f, -0.007608f, -0.015975f, -0.008105f, 0.006930f, -0.010172f, -0.016222f, + 0.004549f, 0.006596f, 0.001274f, -0.005954f, 0.012139f, 0.001527f, 0.011221f, -0.000683f, -0.002628f, 0.006452f, 0.010627f, -0.015145f, -0.007266f, 0.004157f, -0.003443f, 0.003740f, -0.009964f, -0.000699f, 0.002628f, 0.003617f, -0.008514f, -0.015381f, -0.004388f, 0.004520f, -0.002660f, -0.001917f, 0.000882f, 0.005005f, -0.001580f, 0.002790f, -0.005249f, 0.008961f, -0.011787f, -0.008744f, -0.003128f, -0.008565f, -0.002638f, -0.002295f, 0.003360f, -0.006276f, 0.004698f, 0.009729f, -0.000907f, 0.002307f, 0.002547f, 0.004684f, 0.009406f, -0.003573f, -0.001890f, -0.001766f, -0.004004f, 0.009894f, -0.004086f, -0.017145f, -0.011044f, -0.007225f, 0.016426f, 0.000321f, 0.009389f, 0.004379f, 0.001353f, 0.002594f, -0.001224f, -0.000332f, 0.007862f, -0.002602f, -0.001896f, 0.002612f, -0.001479f, 0.001319f, -0.003647f, -0.002117f, 0.001731f, -0.000439f, 0.001912f, -0.000470f, 0.001089f, 0.003024f, 0.002044f, 0.002830f, -0.000078f, 0.001985f, -0.000529f, 0.002900f, 0.003033f, 0.005136f, 0.003085f, 0.004087f, 0.000856f, 0.002744f, 0.002216f, 0.001720f, 0.002309f, 0.003396f, -0.001621f, 0.000310f, + -0.000761f, -0.001377f, 0.001278f, 0.002028f, -0.004118f, -0.015590f, -0.036245f, -0.003374f, 0.002511f, 0.000396f, -0.011751f, -0.005194f, -0.013336f, -0.003427f, -0.015729f, -0.018006f, -0.014079f, -0.003252f, -0.009326f, -0.020292f, -0.012705f, 0.004220f, 0.006285f, -0.005593f, 0.012219f, 0.006778f, -0.004518f, 0.015086f, 0.003229f, 0.001266f, 0.002425f, -0.020601f, -0.000755f, 0.003456f, 0.007769f, -0.006460f, -0.005740f, 0.012311f, 0.023910f, -0.017861f, 0.006439f, -0.005237f, -0.000920f, -0.015738f, -0.001385f, -0.000154f, -0.008035f, -0.010173f, -0.007403f, -0.008650f, -0.004615f, 0.005186f, 0.017558f, -0.008173f, 0.006589f, 0.011889f, 0.010743f, -0.003597f, 0.001222f, -0.003815f, -0.003401f, -0.016154f, -0.008003f, 0.009200f, -0.005827f, 0.002019f, -0.005562f, 0.004653f, 0.002465f, -0.001756f, -0.000602f, -0.007521f, -0.006216f, 0.001450f, -0.002237f, 0.003355f, -0.019137f, -0.020225f, -0.002166f, -0.002930f, -0.008688f, -0.000013f, 0.006442f, -0.009925f, -0.007648f, -0.008457f, -0.014721f, 0.010457f, -0.001050f, -0.002172f, 0.004022f, -0.000539f, 0.003612f, 0.006915f, 0.002409f, 0.003861f, + 0.002209f, 0.005093f, -0.001487f, 0.000950f, 0.000846f, 0.001197f, 0.001701f, -0.001271f, -0.001224f, 0.000330f, 0.001592f, 0.002003f, -0.001212f, 0.001652f, -0.001777f, -0.003414f, 0.001924f, 0.001417f, -0.001329f, 0.004579f, 0.002095f, 0.000357f, 0.001794f, -0.002689f, -0.002917f, -0.000722f, -0.001522f, -0.001180f, -0.022508f, -0.004434f, -0.027103f, -0.006079f, -0.019200f, -0.002295f, 0.003625f, 0.004887f, 0.020853f, -0.013009f, 0.004671f, 0.005626f, -0.011301f, -0.005108f, 0.016782f, 0.001777f, -0.004888f, 0.002105f, -0.013801f, 0.012531f, -0.017687f, -0.005848f, 0.007905f, 0.004909f, -0.001829f, 0.003021f, -0.003482f, 0.005796f, -0.007539f, -0.013297f, 0.000921f, 0.006431f, 0.005280f, -0.010634f, 0.002963f, 0.011948f, -0.012273f, -0.015578f, 0.012431f, -0.010624f, 0.008122f, -0.007647f, 0.004539f, -0.000317f, -0.011037f, -0.014386f, -0.008841f, 0.003916f, -0.000558f, 0.005371f, -0.007497f, -0.007332f, -0.018344f, 0.009570f, -0.013144f, -0.006021f, 0.007166f, 0.016292f, -0.002097f, -0.003386f, -0.024018f, -0.018941f, -0.006295f, -0.006754f, 0.009056f, -0.002565f, -0.014063f, -0.002261f, + 0.000761f, -0.007837f, -0.001908f, -0.016824f, 0.011225f, 0.004351f, 0.014151f, 0.017256f, 0.009115f, 0.000702f, 0.007536f, 0.015392f, -0.001264f, -0.003557f, -0.001036f, -0.004716f, -0.015289f, 0.000846f, 0.001149f, 0.003290f, 0.008220f, -0.003343f, 0.001831f, -0.000016f, -0.006003f, -0.003269f, 0.005617f, 0.005377f, 0.005114f, -0.003931f, 0.001556f, 0.002112f, 0.001964f, 0.001876f, 0.002262f, 0.000730f, 0.004281f, 0.004223f, 0.002901f, -0.000868f, 0.001985f, -0.000735f, 0.001706f, 0.003045f, 0.001106f, 0.001222f, 0.000096f, -0.001065f, -0.000933f, -0.000071f, -0.002636f, -0.001244f, 0.013369f, 0.007007f, 0.038825f, 0.018783f, 0.025153f, -0.007783f, -0.000957f, -0.000420f, -0.038293f, 0.002007f, 0.016548f, -0.007593f, -0.002952f, 0.001311f, 0.024170f, -0.004098f, 0.014012f, -0.002872f, 0.013420f, 0.007354f, 0.016569f, 0.023254f, 0.003013f, 0.015523f, -0.004790f, 0.013433f, -0.001801f, 0.024885f, 0.013265f, -0.000429f, 0.014184f, 0.011427f, -0.004176f, 0.010907f, 0.006589f, 0.009416f, -0.007437f, -0.005992f, -0.020106f, -0.001246f, 0.014279f, 0.002730f, 0.001829f, -0.004699f, + -0.007514f, -0.006024f, -0.006624f, 0.035017f, -0.022523f, 0.008914f, 0.010654f, 0.006017f, 0.003037f, -0.013471f, -0.017880f, -0.004599f, -0.002659f, -0.000854f, -0.030987f, -0.015400f, -0.015928f, 0.000733f, -0.000730f, 0.009184f, -0.001016f, 0.008154f, 0.010985f, 0.019815f, 0.003644f, -0.005148f, 0.006674f, -0.012533f, 0.003413f, -0.009205f, 0.003333f, 0.007638f, 0.004335f, 0.012600f, -0.008550f, -0.009753f, 0.045469f, 0.006180f, 0.008239f, 0.005704f, 0.015420f, -0.010981f, -0.005671f, 0.009660f, -0.001152f, -0.000327f, 0.001763f, 0.003134f, 0.008887f, -0.004494f, -0.000711f, 0.001611f, 0.005100f, 0.001098f, -0.004738f, 0.008558f, 0.000283f, -0.002121f, 0.000157f, -0.001086f, -0.004667f, -0.004421f, -0.002074f, -0.004910f, -0.000060f, -0.001985f, 0.002051f, 0.006087f, -0.000627f, -0.000712f, -0.006867f, -0.001544f, 0.003309f, -0.000866f, 0.000347f, 0.000511f, 0.005300f, -0.002901f, -0.000869f, 0.001601f, 0.001955f, -0.006072f, 0.059482f, 0.006414f, 0.008850f, 0.006735f, -0.003733f, -0.024086f, 0.016261f, 0.017233f, -0.009657f, 0.007577f, 0.007715f, -0.014409f, -0.002047f, 0.014224f, + 0.008115f, -0.025411f, 0.006463f, -0.006821f, -0.013069f, -0.000137f, 0.007467f, 0.002202f, -0.000261f, -0.000291f, 0.010994f, -0.003244f, 0.006196f, -0.019704f, 0.007972f, -0.001829f, 0.007829f, 0.004727f, -0.003632f, 0.014421f, -0.019354f, -0.008095f, -0.019112f, 0.016883f, 0.007879f, 0.027391f, 0.013426f, 0.000179f, 0.005837f, -0.021734f, -0.000182f, 0.006705f, 0.007025f, 0.006986f, 0.001476f, 0.004170f, -0.005817f, 0.006569f, 0.019502f, 0.026554f, 0.011370f, -0.011637f, -0.006578f, -0.002380f, -0.005177f, 0.010099f, 0.013279f, -0.008866f, 0.007861f, 0.015011f, 0.004515f, -0.019878f, -0.039931f, -0.019358f, 0.008030f, 0.017855f, -0.007517f, 0.005632f, -0.001499f, -0.003274f, -0.000128f, 0.018645f, 0.003358f, -0.014628f, 0.024695f, 0.011605f, -0.028602f, 0.001779f, -0.003426f, -0.008742f, -0.003192f, -0.003872f, -0.000002f, 0.010411f, 0.004192f, -0.007215f, -0.004078f, 0.006386f, 0.010691f, -0.004217f, 0.008142f, 0.002639f, -0.006620f, -0.001165f, 0.001097f, 0.000835f, -0.001207f, 0.001156f, -0.003257f, -0.001815f, 0.002418f, 0.001280f, -0.002880f, -0.002533f, 0.000249f, -0.001395f, + -0.004807f, 0.003682f, -0.001629f, -0.001880f, 0.001459f, 0.005762f, -0.005375f, -0.007937f, 0.000024f, -0.000546f, -0.012572f, -0.001459f, 0.003260f, 0.000741f, -0.007540f, -0.000145f, -0.002711f, 0.003236f, 0.001924f, 0.004795f, 0.003281f, -0.036389f, 0.010853f, 0.017442f, -0.019643f, 0.012752f, 0.021206f, -0.051833f, 0.011112f, 0.002358f, 0.011294f, -0.019243f, 0.029244f, -0.040862f, -0.000474f, -0.002788f, -0.003473f, -0.004054f, -0.012054f, -0.015348f, -0.002661f, 0.014854f, 0.001388f, 0.000568f, -0.007943f, 0.010508f, -0.001736f, -0.004897f, 0.007680f, 0.018308f, -0.012149f, 0.013256f, -0.002501f, 0.008122f, 0.003860f, 0.012469f, 0.018718f, -0.004164f, 0.004835f, -0.024207f, -0.012345f, -0.004839f, -0.009364f, -0.022022f, 0.002271f, -0.007883f, -0.014583f, 0.021563f, -0.020128f, -0.006446f, -0.009557f, -0.010587f, 0.014462f, -0.016325f, 0.009153f, -0.005549f, 0.014864f, -0.007657f, 0.016290f, -0.021409f, -0.006280f, 0.003066f, 0.019753f, -0.034716f, -0.013321f, 0.001593f, -0.000140f, -0.005919f, 0.013797f, -0.017843f, -0.035739f, 0.008048f, -0.031404f, 0.016179f, -0.011333f, 0.000443f, + -0.032830f, -0.012431f, 0.035019f, 0.020268f, -0.026691f, -0.021800f, -0.018971f, 0.001465f, 0.010461f, -0.004251f, -0.012082f, 0.023270f, 0.007944f, -0.003651f, -0.005232f, -0.008220f, -0.002044f, 0.009368f, -0.008664f, 0.010046f, -0.001413f, -0.006294f, 0.000936f, -0.004714f, 0.003244f, 0.008559f, -0.005165f, 0.004022f, 0.005664f, 0.004647f, -0.001040f, 0.009894f, -0.009343f, 0.009369f, -0.002872f, 0.008297f, -0.010824f, -0.005001f, 0.001203f, 0.001128f, 0.010491f, 0.004101f, 0.006154f, -0.003217f, -0.006607f, 0.004049f, -0.012375f, -0.000706f, -0.026962f, -0.011574f, 0.033968f, 0.001429f, -0.028010f, 0.026366f, -0.012342f, 0.001746f, -0.029208f, 0.004483f, 0.011586f, -0.025781f, -0.006290f, -0.023043f, -0.000159f, 0.001452f, -0.007759f, -0.006410f, 0.022489f, 0.003443f, -0.015228f, 0.003802f, -0.032631f, 0.019594f, 0.031099f, -0.010076f, 0.012989f, 0.022039f, -0.001645f, -0.004526f, 0.002716f, 0.002658f, 0.012924f, 0.002184f, 0.002989f, 0.006763f, -0.018242f, -0.001336f, -0.020971f, -0.021451f, -0.008790f, 0.008986f, 0.012725f, -0.000694f, -0.025232f, 0.004951f, 0.006616f, 0.012394f, + 0.026976f, -0.027681f, 0.040483f, -0.033593f, 0.001479f, -0.006785f, -0.005822f, -0.016256f, -0.031157f, -0.042050f, -0.016307f, -0.004832f, 0.010700f, -0.003209f, 0.001737f, 0.006165f, -0.000315f, 0.029581f, 0.013995f, -0.030389f, -0.004749f, -0.000640f, 0.019369f, -0.021010f, 0.001389f, -0.042323f, 0.007912f, 0.033030f, -0.029557f, -0.011620f, 0.004170f, -0.000343f, 0.008251f, 0.046292f, 0.000677f, -0.006133f, 0.002393f, 0.023557f, -0.016030f, 0.006292f, 0.008600f, -0.003523f, -0.001734f, -0.000335f, -0.000645f, 0.010472f, -0.003458f, -0.002436f, -0.009113f, 0.015259f, -0.003340f, 0.004473f, 0.001509f, 0.002664f, 0.003787f, 0.011087f, -0.007770f, -0.002017f, 0.011745f, -0.008577f, -0.012084f, 0.009908f, 0.000444f, 0.004820f, 0.006662f, 0.003746f, 0.012144f, -0.009511f, 0.005628f, 0.006701f, -0.004264f, 0.017203f, 0.005869f, 0.010509f, 0.003815f, -0.010422f, -0.003845f, -0.001801f, -0.001862f, -0.001882f, -0.017342f, -0.035178f, 0.042048f, 0.017965f, -0.020607f, 0.027299f, 0.027314f, 0.038798f, -0.014312f, -0.013394f, 0.028316f, -0.004163f, -0.005607f, 0.009875f, 0.012588f, 0.005031f, + 0.006019f, -0.038589f, -0.004103f, 0.000124f, 0.000318f, 0.002141f, -0.004370f, 0.016377f, 0.031735f, 0.003226f, 0.002163f, -0.000528f, 0.001510f, 0.029250f, 0.007758f, -0.002047f, -0.006395f, 0.007500f, 0.006457f, -0.004573f, 0.003344f, -0.016670f, -0.003496f, 0.025438f, -0.025246f, -0.012251f, -0.021775f, 0.028421f, -0.026050f, 0.013061f, -0.010678f, 0.008369f, -0.005678f, 0.006751f, -0.020938f, 0.004800f, 0.031551f, -0.020771f, 0.001628f, -0.055106f, -0.002477f, -0.019468f, 0.001464f, -0.051436f, -0.002306f, -0.002535f, -0.015899f, -0.011056f, 0.041954f, -0.045071f, 0.007481f, -0.012192f, -0.016854f, 0.012110f, -0.015291f, -0.035216f, -0.024737f, 0.003399f, 0.001811f, 0.007247f, -0.017492f, -0.023725f, 0.013446f, 0.001113f, 0.002583f, 0.015758f, -0.026341f, 0.019665f, -0.019180f, -0.009012f, -0.008283f, 0.004642f, 0.000614f, 0.005577f, -0.003468f, -0.006759f, 0.001566f, -0.003871f, 0.005459f, 0.012205f, 0.007064f, 0.004449f, 0.003380f, 0.003249f, 0.003159f, -0.001400f, 0.013244f, 0.002441f, -0.002662f, 0.009861f, 0.010117f, 0.003725f, -0.005794f, -0.000680f, -0.008403f, 0.013179f, + 0.004592f, 0.010569f, -0.005367f, 0.010844f, 0.009642f, 0.014228f, 0.006918f, -0.004207f, -0.007656f, 0.011923f, 0.002296f, 0.010285f, 0.002206f, 0.002644f, 0.002579f, 0.002932f, 0.035269f, 0.012416f, -0.004658f, 0.007635f, -0.017667f, -0.018603f, -0.015263f, 0.034374f, -0.030702f, -0.038148f, 0.018297f, -0.035490f, 0.013192f, 0.001420f, 0.009702f, -0.015835f, -0.003815f, -0.019283f, -0.008184f, -0.014870f, 0.007212f, 0.017725f, 0.012208f, -0.028633f, 0.033382f, 0.004111f, 0.011677f, 0.003115f, 0.016086f, -0.003384f, 0.015453f, 0.003859f, -0.006871f, 0.009926f, 0.003611f, 0.013132f, 0.009005f, -0.021703f, 0.008765f, -0.006308f, 0.006160f, -0.004359f, -0.008101f, -0.006659f, -0.015270f, 0.014327f, 0.015270f, 0.016030f, -0.002969f, 0.029261f, 0.034880f, 0.014033f, 0.004579f, 0.015908f, 0.036152f, 0.017922f, 0.039436f, 0.025412f, 0.029399f, -0.031505f, -0.031792f, 0.006550f, -0.006450f, -0.008479f, 0.002483f, -0.015836f, 0.013224f, 0.009970f, 0.006217f, 0.030104f, -0.007055f, -0.019346f, -0.016279f, -0.014286f, 0.003492f, -0.006773f, -0.064477f, -0.027973f, -0.025099f, -0.009044f, + -0.013037f, -0.006697f, -0.009787f, -0.018230f, 0.000665f, -0.010928f, -0.010548f, 0.004353f, -0.010583f, -0.003244f, -0.016265f, 0.001041f, 0.000836f, -0.002482f, -0.023175f, 0.009654f, -0.000081f, 0.001208f, -0.017439f, 0.005376f, 0.006171f, 0.006837f, 0.001883f, 0.020349f, -0.013095f, -0.004852f, 0.004105f, 0.002359f, -0.001502f, 0.008487f, -0.009284f, -0.007699f, -0.001717f, 0.014510f, -0.001506f, 0.010609f, 0.011850f, -0.002369f, -0.014982f, -0.013196f, -0.001662f, 0.015157f, 0.001109f, -0.010510f, 0.001468f, -0.002147f, -0.007337f, -0.005228f, -0.002369f, 0.001074f, -0.011221f, -0.009256f, 0.028680f, 0.019479f, -0.062808f, -0.046389f, -0.014445f, -0.000606f, 0.020701f, -0.008637f, -0.001473f, -0.050009f, 0.007081f, -0.026207f, 0.018706f, -0.003668f, 0.024783f, -0.021282f, -0.005282f, -0.025253f, 0.004383f, 0.020498f, -0.009828f, 0.005929f, -0.014418f, 0.001000f, -0.033745f, -0.009456f, -0.001613f, 0.002321f, 0.025050f, 0.032458f, 0.001151f, -0.030036f, -0.021025f, -0.009803f, 0.003092f, -0.008050f, 0.009543f, -0.034525f, -0.010646f, -0.004878f, -0.008897f, -0.019483f, -0.004500f, -0.009085f, + 0.023435f, 0.033773f, 0.022949f, 0.008173f, 0.014036f, 0.014027f, -0.016336f, 0.056524f, 0.034452f, -0.044975f, -0.038655f, 0.041449f, -0.032730f, -0.019172f, 0.006484f, 0.004353f, -0.031766f, 0.030566f, 0.002071f, -0.096375f, 0.025790f, 0.060014f, -0.041674f, 0.041250f, 0.055682f, -0.018850f, -0.005692f, 0.029371f, -0.034654f, -0.023352f, 0.011662f, -0.019275f, -0.021646f, 0.024834f, -0.042059f, -0.013198f, 0.005485f, 0.000574f, 0.002465f, -0.004467f, 0.015510f, -0.011448f, 0.006669f, 0.001847f, -0.011127f, 0.021868f, 0.011456f, -0.001172f, -0.014164f, 0.016759f, -0.010748f, 0.012825f, -0.011447f, 0.015695f, 0.001727f, 0.002882f, 0.016414f, -0.013156f, -0.014197f, 0.003819f, -0.013097f, -0.008573f, -0.000588f, 0.000919f, -0.008715f, -0.016249f, 0.007496f, -0.037491f, -0.000001f, 0.016533f, -0.013647f, 0.009524f, -0.004179f, 0.004524f, -0.015495f, -0.000154f, 0.008488f, -0.007788f, 0.005557f, 0.032675f, -0.014795f, -0.014465f, 0.032666f, -0.024180f, -0.003974f, 0.026907f, -0.019597f, -0.012396f, 0.020599f, 0.012720f, 0.013509f, -0.003333f, -0.020223f, -0.016145f, 0.019014f, -0.015185f, + -0.001445f, 0.005667f, -0.028597f, 0.018589f, 0.015128f, -0.011562f, -0.009408f, -0.022295f, 0.000539f, -0.013795f, 0.019206f, -0.031307f, 0.002316f, 0.011996f, -0.001738f, -0.014898f, -0.032523f, -0.007308f, -0.014196f, -0.003165f, -0.025191f, 0.034234f, -0.033527f, 0.005845f, -0.012248f, 0.008599f, -0.047452f, 0.048802f, 0.009187f, 0.004865f, -0.019631f, 0.011113f, 0.007853f, 0.002116f, 0.004337f, -0.008739f, -0.037478f, -0.006500f, -0.016289f, -0.023993f, -0.032222f, -0.011617f, -0.008213f, -0.031929f, -0.012333f, -0.001528f, 0.021920f, 0.010120f, -0.029011f, -0.025286f, 0.015421f, -0.006679f, -0.036799f, -0.015873f, 0.008870f, 0.030117f, 0.029849f, 0.030425f, 0.048527f, -0.009430f, -0.033158f, -0.031623f, -0.002158f, 0.021298f, 0.037751f, 0.016955f, 0.007983f, -0.038756f, 0.021597f, 0.008006f, 0.036805f, 0.025583f, 0.016576f, 0.012560f, -0.000180f, 0.003167f, 0.021573f, -0.005294f, 0.001321f, 0.003724f, 0.006079f, 0.007346f, 0.006782f, 0.010374f, 0.025903f, 0.008070f, 0.001656f, 0.008834f, -0.000901f, 0.008223f, 0.002132f, 0.001371f, 0.015937f, -0.019891f, -0.014329f, -0.005405f, + 0.007005f, -0.010176f, 0.006124f, -0.004564f, 0.020076f, 0.000551f, 0.003023f, -0.010897f, -0.013676f, 0.000928f, 0.011493f, -0.011484f, -0.001712f, 0.013574f, -0.011857f, -0.000914f, 0.006006f, -0.020042f, 0.023649f, 0.012712f, -0.004828f, 0.005518f, -0.001454f, -0.000533f, -0.006374f, 0.013396f, 0.022623f, 0.061227f, -0.054004f, -0.001561f, -0.021549f, -0.028568f, -0.017149f, 0.028019f, -0.015378f, -0.016630f, 0.014299f, 0.036084f, 0.022651f, -0.027071f, 0.017436f, -0.028406f, 0.020833f, 0.001186f, -0.003268f, -0.013728f, -0.021268f, -0.017062f, 0.003521f, 0.003927f, -0.033598f, 0.021314f, 0.003437f, -0.002979f, -0.012807f, -0.014174f, 0.023729f, -0.032482f, -0.001621f, 0.035473f, 0.041551f, -0.037253f, -0.002585f, -0.007341f, -0.024266f, -0.031183f, 0.034109f, 0.007875f, 0.021648f, -0.006611f, 0.002560f, -0.002854f, 0.021549f, -0.008326f, 0.001070f, -0.026699f, 0.038349f, 0.032186f, -0.046985f, -0.057179f, -0.012255f, 0.000823f, -0.018973f, 0.002068f, -0.014131f, 0.004542f, -0.029202f, 0.030999f, -0.037513f, -0.032585f, -0.012337f, 0.005592f, 0.025690f, -0.013289f, 0.037278f, 0.004153f, + -0.013481f, -0.012564f, -0.009941f, -0.023312f, 0.022663f, 0.017264f, -0.006320f, 0.014648f, 0.011176f, -0.018167f, -0.018548f, -0.015345f, 0.028859f, 0.007955f, -0.020876f, 0.003059f, 0.008044f, 0.010201f, -0.031070f, 0.016386f, 0.012229f, 0.006454f, -0.000455f, -0.008044f, 0.003991f, -0.008844f, -0.027659f, 0.006418f, -0.003795f, -0.004269f, -0.003356f, 0.003464f, -0.008477f, -0.009750f, -0.000705f, -0.003032f, 0.013623f, -0.006536f, -0.003952f, 0.008766f, -0.003809f, -0.012132f, 0.010734f, -0.012077f, -0.004344f, -0.021652f, 0.011920f, 0.003300f, -0.003330f, 0.004916f, -0.010214f, 0.020979f, -0.001381f, 0.004378f, 0.022525f, 0.017209f, -0.006368f, -0.006362f, 0.010802f, 0.007135f, -0.007842f, 0.005421f, -0.007195f, -0.005490f, -0.001437f, 0.006186f, -0.082865f, 0.122767f, -0.084348f, -0.021576f, 0.022213f, 0.066278f, 0.053880f, -0.019938f, -0.021576f, 0.003463f, 0.003077f, 0.034143f, 0.012609f, -0.045328f, 0.013584f, -0.009868f, -0.015898f, 0.004350f, 0.018521f, -0.000357f, -0.033920f, -0.030022f, 0.015839f, 0.012818f, 0.020975f, -0.011596f, 0.025964f, 0.005924f, 0.030452f, -0.003293f, + -0.010375f, 0.022394f, -0.002714f, -0.024225f, 0.004212f, 0.027837f, -0.001184f, -0.032083f, 0.015873f, 0.037045f, -0.034257f, 0.013378f, -0.036799f, 0.014419f, -0.046503f, -0.030550f, 0.051258f, 0.047616f, 0.022475f, 0.062054f, -0.011918f, 0.074109f, 0.027644f, 0.028477f, 0.039930f, -0.067424f, 0.056763f, 0.019209f, 0.022993f, 0.026018f, 0.006318f, -0.033005f, 0.005414f, 0.062501f, 0.071448f, -0.001027f, -0.080739f, 0.039539f, 0.002271f, 0.016713f, -0.002710f, 0.001723f, -0.017512f, -0.061115f, 0.012401f, -0.010328f, 0.013832f, -0.011564f, 0.030284f, -0.034460f, -0.036600f, -0.026059f, 0.005466f, -0.011369f, -0.016383f, 0.019419f, 0.007898f, -0.026541f, -0.027679f, -0.022264f, -0.016214f, -0.003207f, -0.004168f, 0.014249f, -0.000180f, -0.022818f, 0.018056f, 0.003223f, -0.005302f, 0.000672f, 0.009059f, -0.011560f, -0.005233f, 0.010845f, -0.019437f, -0.008747f, -0.013164f, 0.011226f, 0.014912f, -0.016951f, 0.005395f, -0.044859f, 0.001401f, 0.001813f, 0.002998f, -0.009072f, -0.007751f, -0.020464f, -0.014456f, 0.009798f, 0.007236f, 0.009374f, 0.016284f, -0.015226f, 0.001983f, 0.005619f, + 0.004776f, -0.014941f, 0.000928f, 0.003213f, 0.000363f, -0.012352f, -0.000820f, 0.081324f, -0.003119f, -0.096436f, -0.048938f, -0.056714f, -0.021838f, 0.000645f, 0.031740f, -0.082175f, -0.018563f, 0.013098f, -0.038500f, -0.044040f, -0.040371f, -0.043965f, -0.007244f, 0.048846f, 0.024870f, -0.019154f, 0.023255f, 0.009743f, -0.022460f, 0.025275f, -0.028335f, -0.006092f, 0.011588f, 0.016775f, -0.056136f, 0.028265f, -0.027711f, 0.016173f, -0.011197f, -0.044813f, 0.012291f, 0.014108f, 0.006742f, 0.007528f, -0.018889f, -0.063679f, 0.002358f, 0.013306f, 0.013660f, 0.000764f, 0.007710f, -0.026373f, -0.000576f, -0.002149f, 0.057676f, -0.008815f, -0.095574f, -0.042961f, -0.010641f, -0.079082f, 0.017731f, -0.024110f, -0.020511f, -0.038089f, -0.017400f, -0.056932f, -0.056187f, -0.068483f, -0.007156f, 0.072186f, 0.009566f, -0.045620f, 0.020672f, 0.000662f, -0.005430f, -0.025660f, -0.036469f, 0.015166f, 0.029319f, 0.022625f, 0.011888f, -0.013675f, -0.058856f, -0.041702f, -0.059260f, 0.008637f, 0.005992f, -0.002081f, 0.020455f, -0.031023f, -0.037966f, -0.005324f, -0.014424f, -0.038339f, 0.007780f, 0.022000f, + 0.002445f, 0.008014f, 0.036191f, -0.006693f, -0.008301f, -0.006367f, 0.001728f, -0.013286f, -0.008047f, 0.016367f, 0.024423f, 0.027413f, 0.017768f, -0.007712f, 0.000455f, 0.004187f, -0.012297f, 0.025356f, -0.011263f, 0.037047f, -0.013923f, 0.017319f, -0.018607f, -0.005083f, 0.036849f, 0.012368f, 0.004262f, -0.000338f, -0.015709f, 0.014702f, 0.002284f, -0.018543f, 0.007343f, -0.015899f, -0.021204f, 0.005661f, 0.005035f, -0.012677f, -0.013175f, 0.012676f, -0.000362f, 0.017894f, 0.002831f, 0.012118f, -0.007811f, 0.005223f, 0.003993f, 0.053071f, -0.005838f, 0.042437f, 0.055868f, -0.047313f, -0.058176f, -0.062278f, 0.016758f, 0.021138f, -0.084164f, -0.049447f, 0.002244f, 0.001913f, 0.026069f, -0.099044f, 0.011096f, 0.022260f, 0.068896f, -0.079444f, 0.009918f, 0.012425f, -0.009263f, 0.043009f, -0.024482f, 0.075759f, -0.003613f, 0.006204f, 0.023590f, 0.029109f, -0.028241f, -0.062129f, 0.036495f, 0.042982f, 0.010629f, 0.054523f, 0.011283f, -0.007513f, -0.019978f, -0.047075f, 0.072677f, -0.032756f, 0.068918f, 0.026470f, -0.004425f, 0.019705f, -0.028246f, 0.036428f, 0.037152f, -0.025979f, + 0.027804f, 0.013376f, -0.070945f, 0.051710f, 0.053787f, -0.007173f, -0.035834f, 0.006457f, -0.001073f, 0.001877f, -0.012184f, 0.098156f, -0.001118f, -0.057659f, -0.031330f, 0.010758f, -0.081840f, -0.108591f, 0.015568f, 0.134908f, 0.030683f, -0.009961f, -0.085640f, -0.022332f, -0.013553f, 0.091828f, -0.062266f, -0.040799f, -0.151094f, -0.022382f, -0.026962f, -0.036166f, -0.027628f, 0.055458f, 0.060489f, -0.059749f, -0.022158f, 0.019236f, 0.009187f, -0.011210f, 0.025430f, -0.010790f, -0.017782f, -0.019023f, 0.022090f, 0.008088f, 0.007873f, -0.007890f, 0.021722f, -0.021669f, -0.006177f, 0.017916f, 0.009520f, -0.001521f, 0.000304f, -0.016234f, 0.008881f, -0.010869f, 0.040578f, -0.011072f, -0.020189f, -0.017845f, -0.032441f, -0.011719f, 0.027281f, 0.029087f, 0.081431f, 0.030219f, -0.007736f, -0.061360f, -0.083098f, -0.039817f, 0.002698f, 0.034320f, 0.029438f, -0.022779f, -0.032137f, -0.017318f, -0.012240f, 0.020729f, 0.037942f, 0.007824f, 0.003680f, -0.004772f, -0.011305f, -0.011183f, -0.134865f, 0.039154f, 0.065275f, -0.086858f, -0.007425f, 0.048685f, -0.020569f, -0.039084f, 0.035314f, -0.037712f, + -0.020218f, 0.002859f, -0.027937f, 0.045787f, -0.015011f, -0.020931f, -0.007559f, 0.024185f, 0.083297f, -0.012922f, -0.037723f, -0.042638f, 0.015807f, 0.039588f, 0.024133f, -0.037690f, -0.005483f, 0.045055f, 0.001668f, -0.034168f, 0.011769f, -0.030503f, 0.077068f, -0.034694f, -0.082575f, 0.028616f, -0.013524f, 0.039564f, -0.055176f, -0.054775f, 0.055371f, -0.004494f, -0.070749f, -0.037919f, -0.067581f, 0.087993f, 0.042907f, 0.023664f, -0.092349f, 0.016400f, 0.038742f, -0.065171f, 0.004280f, -0.046853f, -0.034991f, 0.036225f, -0.031064f, 0.041581f, -0.025583f, -0.056661f, -0.012307f, -0.014145f, -0.007910f, 0.019288f, 0.007237f, -0.035473f, 0.110213f, -0.013692f, 0.049160f, 0.049694f, 0.030880f, -0.015170f, 0.012055f, -0.025149f, 0.062212f, 0.014953f, -0.015068f, 0.007110f, 0.026721f, 0.042547f, -0.010150f, -0.093439f, -0.005823f, 0.028718f, -0.008765f, 0.048854f, -0.020343f, 0.016623f, -0.006993f, 0.000916f, 0.020754f, 0.004527f, 0.012823f, 0.024703f, 0.015356f, 0.028732f, -0.006523f, 0.009047f, 0.015880f, 0.001588f, -0.029472f, 0.035421f, -0.014441f, -0.000244f, 0.005989f, -0.018404f, + 0.009663f, 0.001364f, -0.004350f, 0.024453f, -0.010856f, 0.001330f, 0.036446f, -0.000895f, 0.020468f, -0.018153f, -0.010987f, 0.018915f, -0.004209f, -0.013962f, -0.018522f, 0.000417f, 0.002897f, 0.003934f, -0.005992f, 0.004028f, 0.011539f, -0.004673f, 0.097570f, 0.020355f, 0.042106f, -0.003329f, 0.009957f, 0.015770f, -0.035871f, 0.015943f, 0.033868f, 0.000604f, -0.041233f, -0.021631f, -0.030666f, -0.012172f, -0.041324f, -0.039340f, 0.004659f, -0.031301f, 0.046042f, 0.015287f, -0.011099f, -0.033275f, -0.016400f, -0.010755f, 0.024662f, -0.007419f, -0.039101f, -0.031743f, 0.007810f, 0.008627f, 0.021931f, 0.008735f, -0.008875f, 0.010628f, -0.034141f, -0.102712f, 0.003986f, 0.125296f, -0.003989f, -0.090560f, -0.015094f, 0.059802f, 0.016241f, 0.010025f, -0.002010f, -0.039153f, -0.049517f, -0.029095f, 0.010867f, -0.002695f, -0.045829f, 0.017135f, -0.091836f, -0.016033f, 0.084409f, 0.025288f, 0.108678f, -0.013986f, -0.043359f, -0.012630f, -0.009941f, 0.029556f, 0.006007f, -0.000446f, -0.059802f, -0.029537f, -0.028781f, -0.003634f, 0.068663f, -0.008894f, -0.017223f, 0.023095f, 0.027606f, 0.004870f, + -0.037077f, -0.056927f, -0.004496f, 0.023634f, -0.002903f, -0.028045f, -0.007643f, 0.016439f, -0.012418f, -0.010287f, -0.019127f, 0.035039f, 0.036180f, -0.017936f, -0.009987f, -0.016441f, 0.014499f, 0.021996f, -0.010358f, 0.003563f, -0.004195f, -0.002554f, -0.007195f, -0.026957f, 0.002650f, 0.016112f, -0.016988f, 0.004565f, -0.004369f, 0.001703f, -0.015249f, -0.004540f, -0.006632f, -0.009285f, -0.011660f, -0.011121f, -0.003663f, 0.049435f, -0.024669f, 0.000773f, -0.009937f, 0.003178f, 0.026721f, -0.017802f, -0.002929f, -0.004745f, 0.008181f, -0.000771f, 0.007414f, -0.013552f, -0.043171f, -0.144375f, -0.222360f, 0.052273f, 0.199479f, 0.062624f, 0.487611f, 0.458819f, 0.204428f, 0.473100f, 0.200180f, -0.086074f, -0.001192f, -0.142615f, -0.389207f, -0.212877f, -0.203691f, -0.399397f, -0.290366f, -0.167156f, -0.251186f, -0.169320f, 0.037023f, -0.014939f, -0.080219f, 0.095037f, 0.089318f, -0.000661f, 0.095736f, 0.258977f, 0.109074f, 0.048547f, 0.248405f, 0.221769f, 0.074829f, 0.264238f, 0.323893f, -0.000814f, 0.191968f, 0.326000f, 0.123810f, 0.130144f, 0.332872f, 0.198420f, -0.026108f, 0.259302f, + 0.182444f, -0.071107f, 0.102134f, 0.206180f, -0.092251f, -0.164220f, -0.036814f, -0.346707f, -0.581270f, -0.563271f, -0.625726f, -1.001658f, -0.866514f, -0.715360f, -0.926421f, -0.794822f, -0.510352f, -0.605542f, -0.462344f, -0.128386f, -0.041171f, 0.195494f, 0.364744f, 0.600649f, 0.805387f, 0.877962f, 1.024662f, 1.112340f, 1.039608f, 0.984164f, 1.044645f, 0.794230f, 0.630174f, 0.747032f, 0.407789f, 0.064716f, 0.094243f, -0.151435f, -0.552153f, -0.464150f, -0.343011f, -0.495610f, -0.506269f, -0.316379f, -0.359504f, -0.453919f, -0.332308f, -0.302755f, -0.426533f, -0.383254f, -0.249605f, -0.318060f, -0.341036f, -0.112226f, -0.107436f, -0.201904f, -0.021281f, 0.075952f, -0.057759f, 0.010167f, 0.075912f, -0.109339f, -0.140686f, -0.134140f, -0.292477f, -0.323546f, -0.226237f, -0.170644f, -0.124064f, 0.041057f, 0.197702f, 0.268255f, 0.381031f, 0.487777f, 0.509941f, 0.540362f, 0.598248f, 0.566790f, 0.515682f, 0.536524f, 0.486262f, 0.360798f, 0.247529f, 0.063928f, -0.096958f, -0.248161f, -0.360048f, -0.403971f, -0.425017f, -0.380076f, -0.291161f, -0.255944f, -0.215568f, -0.177357f, -0.152950f, -0.135737f, + -0.102010f, -0.080437f, -0.073900f, -0.073093f, -0.051707f, -0.040916f, -0.033194f, -0.015331f, 0.010235f, 0.031010f, 0.059291f, 0.059421f, 0.057100f, 0.050854f, 0.032928f, 0.012507f, 0.007024f, 0.000373f}, + {-0.001031f, 0.020775f, -0.010300f, 0.000820f, -0.006145f, -0.000472f, 0.008781f, 0.004167f, 0.005509f, -0.004806f, 0.006824f, -0.007055f, 0.007661f, 0.003830f, 0.009233f, 0.003900f, -0.001758f, -0.010426f, 0.011212f, 0.007732f, 0.002841f, 0.001320f, 0.001038f, -0.004430f, -0.005079f, 0.005801f, 0.003548f, 0.003791f, 0.005562f, -0.005657f, -0.000442f, 0.005227f, 0.006181f, -0.000805f, -0.004628f, -0.008777f, 0.000021f, 0.001642f, -0.005319f, 0.001988f, 0.001399f, -0.007911f, -0.004294f, -0.000600f, 0.004005f, 0.000093f, -0.003873f, 0.007392f, 0.001360f, -0.002496f, -0.005490f, -0.001214f, 0.000627f, -0.010330f, 0.004748f, 0.006479f, -0.003618f, 0.008296f, 0.006765f, -0.001071f, 0.005590f, 0.003326f, 0.010951f, 0.003465f, 0.002024f, -0.001700f, 0.004104f, -0.008824f, 0.001104f, 0.004246f, -0.004412f, 0.004860f, 0.005811f, 0.006435f, 0.003970f, 0.008454f, -0.001852f, -0.005115f, -0.002703f, -0.002156f, 0.001078f, -0.001940f, -0.006603f, 0.003124f, -0.003140f, -0.003439f, -0.004025f, 0.001530f, -0.000051f, -0.002002f, -0.001638f, 0.002630f, 0.000146f, -0.000285f, -0.000752f, -0.000241f, + 0.001182f, 0.001772f, -0.000335f, -0.000085f, -0.001539f, 0.000436f, -0.002730f, 0.000276f, 0.001739f, 0.002393f, -0.001745f, -0.001776f, 0.000358f, 0.001568f, -0.019711f, -0.013786f, -0.001963f, -0.008876f, -0.007597f, 0.003739f, -0.011226f, -0.010823f, 0.003114f, -0.004902f, -0.004400f, 0.004507f, -0.003546f, -0.007666f, -0.000839f, -0.000578f, -0.002171f, -0.003506f, -0.002075f, -0.008792f, -0.000553f, -0.006340f, -0.004593f, -0.000239f, 0.007858f, -0.001744f, 0.011358f, -0.005904f, 0.006821f, 0.007846f, -0.008815f, 0.003074f, -0.002239f, 0.001711f, -0.006244f, 0.003094f, 0.004024f, 0.006055f, -0.003118f, -0.007388f, -0.002585f, -0.004049f, 0.002355f, 0.002876f, -0.008978f, -0.001121f, -0.006170f, -0.004939f, 0.001669f, -0.007336f, -0.011777f, -0.002194f, 0.011534f, 0.002567f, 0.004026f, 0.000642f, 0.002638f, 0.001594f, 0.004234f, 0.004581f, 0.012936f, 0.000988f, -0.005775f, -0.007416f, -0.001617f, -0.003521f, -0.000978f, -0.015014f, 0.003096f, -0.001047f, 0.004778f, -0.001987f, 0.001312f, -0.003564f, -0.001784f, 0.014740f, 0.002928f, 0.013519f, -0.004604f, -0.002434f, 0.001006f, 0.003866f, + 0.001283f, 0.004604f, -0.004515f, 0.004998f, -0.005260f, -0.003214f, 0.002655f, 0.001972f, -0.000224f, 0.000269f, 0.000080f, -0.001099f, 0.000339f, -0.001962f, -0.000216f, -0.000651f, -0.000359f, 0.000912f, 0.000990f, -0.001068f, -0.001938f, -0.001143f, 0.000092f, 0.000115f, 0.000290f, 0.000673f, -0.000827f, -0.000828f, -0.000842f, 0.000250f, -0.000345f, 0.001090f, 0.016001f, 0.018501f, 0.014192f, 0.010580f, 0.014920f, 0.006087f, 0.006469f, -0.001338f, 0.004219f, 0.015755f, 0.001651f, 0.004822f, -0.005874f, -0.003873f, 0.012027f, -0.008065f, -0.014777f, 0.004486f, -0.012351f, 0.010658f, 0.002479f, 0.012784f, -0.004093f, -0.000780f, -0.003176f, 0.004215f, 0.005080f, -0.000160f, -0.012583f, -0.002570f, 0.010725f, -0.007139f, 0.004819f, 0.002865f, -0.002455f, -0.003076f, 0.011921f, 0.009029f, 0.020818f, 0.008362f, 0.001700f, 0.005009f, -0.001794f, 0.001282f, 0.006536f, 0.003930f, 0.017738f, -0.007597f, -0.005103f, 0.001251f, 0.004544f, -0.002786f, 0.008204f, -0.007704f, 0.001567f, -0.000497f, -0.005958f, 0.001853f, 0.001750f, -0.008020f, -0.010898f, -0.006715f, 0.008568f, 0.004176f, + 0.000001f, -0.000692f, 0.006457f, 0.000497f, 0.002117f, 0.011265f, 0.005520f, -0.002680f, -0.001829f, 0.010014f, -0.008717f, 0.001153f, -0.007862f, -0.003520f, -0.010151f, 0.002757f, -0.002142f, -0.005995f, -0.003966f, 0.005869f, 0.003581f, 0.001049f, 0.003410f, -0.005617f, -0.000981f, -0.000479f, 0.004314f, 0.000126f, 0.000272f, 0.000804f, 0.001261f, 0.003201f, 0.003553f, 0.002833f, 0.000181f, 0.001514f, 0.003212f, 0.000183f, -0.002994f, 0.002735f, -0.001539f, -0.000585f, 0.000627f, -0.000498f, 0.002349f, 0.002171f, 0.001049f, -0.000005f, -0.000869f, -0.000861f, 0.000987f, 0.001367f, 0.000460f, 0.002087f, -0.004262f, -0.002699f, 0.002075f, -0.000149f, 0.034813f, -0.000618f, 0.017055f, -0.003094f, -0.002668f, 0.018291f, -0.017908f, -0.006206f, -0.001397f, 0.009032f, 0.006275f, -0.003841f, 0.003482f, 0.001685f, -0.016224f, 0.004095f, 0.008673f, 0.007697f, -0.018186f, -0.006404f, 0.002043f, -0.013049f, -0.003596f, 0.000983f, 0.000576f, 0.001758f, -0.002018f, 0.008287f, -0.005889f, 0.006585f, 0.013613f, 0.013595f, -0.003976f, -0.007834f, -0.001417f, 0.015314f, -0.000901f, -0.000853f, + 0.000089f, 0.001478f, -0.007997f, 0.001329f, 0.006426f, 0.000932f, 0.001501f, 0.006141f, -0.004126f, 0.004120f, 0.002382f, -0.001731f, 0.010749f, 0.001015f, 0.008537f, 0.001646f, -0.002914f, 0.003692f, 0.005690f, 0.004891f, -0.000294f, -0.008491f, -0.007725f, -0.010215f, -0.004573f, -0.000420f, -0.000041f, -0.001253f, 0.007502f, 0.006426f, -0.004967f, -0.010031f, 0.000262f, 0.005097f, 0.006163f, -0.006171f, -0.001196f, 0.005803f, -0.000591f, -0.000899f, 0.007755f, 0.003575f, 0.003638f, -0.003007f, -0.002586f, -0.000561f, 0.003298f, 0.004929f, 0.000037f, 0.003704f, 0.001291f, 0.000210f, 0.000653f, 0.001157f, 0.004593f, 0.003400f, 0.005177f, -0.002787f, 0.002392f, 0.000234f, 0.000570f, -0.000893f, 0.000452f, 0.000650f, 0.000132f, 0.000549f, -0.000966f, 0.002376f, 0.002362f, -0.002438f, 0.000497f, 0.001255f, 0.001437f, -0.000908f, 0.004755f, -0.009356f, -0.025957f, -0.006806f, -0.008788f, 0.001634f, 0.004330f, -0.004475f, -0.005199f, -0.049042f, 0.000981f, 0.015665f, -0.011435f, -0.018411f, 0.013719f, -0.020829f, -0.003147f, -0.009374f, -0.010918f, -0.006877f, -0.006862f, 0.000632f, + 0.008311f, -0.001636f, 0.004627f, -0.005415f, 0.006263f, -0.004931f, -0.007439f, 0.003144f, -0.002798f, -0.011842f, -0.014976f, 0.007019f, 0.000698f, 0.006927f, 0.002147f, 0.015662f, 0.002218f, 0.005343f, -0.007605f, -0.013291f, -0.003831f, -0.006670f, 0.013123f, -0.006276f, 0.000328f, 0.003270f, -0.006539f, 0.018231f, 0.012159f, 0.000118f, -0.014652f, -0.018717f, -0.006317f, 0.006035f, -0.016768f, -0.000567f, -0.008163f, -0.016094f, 0.001469f, -0.025118f, -0.005535f, -0.002806f, -0.009298f, 0.016640f, -0.001048f, -0.002794f, -0.000284f, 0.010368f, 0.013412f, 0.003885f, -0.013444f, -0.004495f, -0.003408f, 0.007088f, 0.003384f, 0.004006f, -0.007554f, -0.009773f, 0.007545f, 0.004996f, 0.001894f, 0.002391f, -0.000474f, 0.004166f, 0.001199f, 0.006352f, 0.001845f, 0.001369f, -0.000548f, -0.000335f, 0.001040f, 0.004047f, 0.005975f, 0.003525f, -0.001456f, 0.002240f, -0.007461f, 0.003722f, 0.004452f, -0.001388f, -0.000618f, 0.001237f, -0.001677f, -0.000602f, -0.000405f, -0.002430f, -0.002405f, -0.001447f, -0.000701f, 0.001278f, 0.002976f, -0.000589f, -0.003432f, -0.000145f, -0.004852f, 0.001538f, + 0.006686f, 0.002746f, 0.003955f, 0.002675f, 0.010391f, -0.028031f, -0.041317f, 0.005015f, -0.009467f, 0.009153f, -0.011600f, -0.020566f, 0.000466f, 0.018807f, 0.003810f, 0.011520f, 0.009194f, 0.007109f, 0.004542f, -0.006661f, 0.005007f, 0.012486f, -0.019677f, -0.009238f, -0.006575f, -0.004443f, 0.007151f, -0.001657f, 0.002433f, 0.012965f, 0.011286f, -0.004635f, -0.011114f, 0.002571f, -0.006241f, -0.004751f, -0.010772f, -0.007476f, -0.016383f, 0.003921f, -0.006145f, -0.000141f, 0.014489f, -0.002906f, 0.002754f, 0.003838f, -0.010442f, 0.008756f, 0.008627f, 0.012108f, -0.010638f, 0.019118f, -0.003131f, -0.013977f, -0.011827f, -0.015289f, 0.014239f, -0.005379f, -0.016258f, 0.004943f, -0.002508f, -0.011446f, 0.012192f, 0.016389f, -0.005656f, -0.013674f, 0.010157f, 0.003227f, 0.007966f, -0.001182f, 0.022044f, 0.012960f, -0.012848f, -0.006374f, -0.006054f, -0.005006f, 0.007374f, 0.010093f, 0.013096f, -0.000017f, 0.001754f, 0.005026f, -0.005166f, 0.004781f, -0.001401f, 0.008456f, 0.012038f, -0.016282f, -0.007238f, -0.008207f, -0.005081f, -0.008385f, -0.000606f, -0.005943f, 0.002794f, -0.000360f, + -0.000472f, -0.000732f, 0.002239f, -0.004046f, 0.010251f, -0.001312f, 0.004411f, 0.001496f, 0.002190f, -0.002032f, 0.000477f, 0.000233f, 0.000688f, -0.003486f, 0.000813f, -0.002286f, -0.003472f, -0.005424f, -0.001482f, -0.000376f, -0.000780f, 0.000145f, 0.000757f, -0.001148f, -0.000600f, -0.002079f, -0.001741f, 0.003138f, -0.038582f, -0.000026f, -0.007008f, 0.002558f, -0.000070f, 0.014559f, 0.010678f, 0.015080f, -0.002445f, 0.020570f, -0.009559f, 0.013989f, 0.017124f, 0.003159f, 0.017068f, 0.003689f, 0.004439f, -0.004781f, -0.001742f, -0.007171f, 0.013533f, -0.000831f, -0.001536f, 0.019064f, 0.011517f, 0.000187f, 0.005140f, -0.001613f, -0.000635f, 0.012402f, -0.007081f, -0.012251f, -0.000007f, -0.001691f, 0.006299f, -0.034662f, 0.020856f, 0.022501f, 0.008883f, 0.004387f, 0.000601f, -0.011015f, -0.023117f, 0.015284f, -0.009314f, -0.010506f, -0.007036f, 0.013719f, -0.009650f, 0.008467f, 0.008591f, -0.008206f, -0.005435f, -0.019963f, 0.009199f, -0.012984f, 0.007713f, 0.001293f, 0.006907f, 0.012143f, 0.019384f, 0.008317f, -0.008937f, -0.021316f, -0.003755f, 0.013046f, 0.021360f, 0.016034f, + -0.003236f, -0.004239f, -0.013730f, -0.022831f, -0.002417f, 0.015790f, 0.007048f, 0.004977f, -0.005067f, 0.020955f, -0.000715f, 0.007043f, 0.002028f, -0.004071f, 0.001980f, -0.010717f, -0.005214f, -0.005431f, 0.003561f, -0.002711f, -0.007649f, -0.004535f, -0.005287f, -0.005740f, 0.002282f, -0.008159f, -0.003391f, 0.001537f, 0.001396f, 0.006258f, 0.000327f, 0.000860f, 0.001072f, -0.001741f, 0.005124f, -0.001656f, 0.005828f, 0.002072f, -0.001685f, -0.004527f, -0.000248f, 0.005590f, 0.003992f, -0.000756f, -0.005504f, -0.001496f, 0.004836f, 0.004299f, 0.000601f, -0.001048f, -0.000683f, -0.003383f, 0.003717f, 0.014762f, 0.050423f, 0.027558f, -0.002427f, 0.004900f, 0.004506f, 0.011231f, 0.019959f, -0.002660f, 0.003954f, 0.033859f, 0.003488f, -0.001340f, 0.020391f, 0.014330f, -0.013996f, 0.008514f, 0.002089f, 0.013712f, 0.009392f, -0.023289f, 0.017885f, -0.010707f, -0.001491f, 0.002148f, 0.014013f, 0.002642f, 0.003837f, 0.010757f, 0.012235f, -0.011479f, 0.012567f, 0.037403f, -0.006518f, 0.017100f, 0.017458f, -0.009133f, 0.013705f, 0.003747f, -0.008910f, -0.009574f, 0.006676f, -0.008545f, + -0.023123f, -0.002871f, -0.001034f, 0.002509f, -0.029615f, -0.007120f, 0.009165f, -0.018646f, -0.012594f, -0.030792f, 0.010261f, 0.014338f, -0.021102f, -0.007428f, -0.010164f, 0.022484f, 0.000569f, -0.012697f, -0.008939f, -0.014155f, 0.007184f, 0.018824f, -0.013291f, 0.007311f, -0.005645f, 0.009120f, 0.021184f, 0.008981f, 0.016688f, 0.017039f, 0.021149f, 0.003314f, -0.011853f, -0.011758f, 0.008476f, 0.013468f, 0.001931f, 0.009068f, -0.009488f, 0.003852f, -0.001172f, -0.002887f, -0.009966f, 0.001420f, -0.004434f, 0.000620f, 0.008075f, 0.003472f, 0.003390f, 0.002780f, 0.008915f, -0.005512f, 0.000292f, -0.001466f, 0.002629f, -0.001023f, 0.000271f, 0.003844f, 0.000972f, -0.003131f, 0.004747f, -0.001033f, -0.006919f, 0.004289f, -0.004960f, -0.003928f, -0.005144f, -0.010314f, 0.005522f, -0.002365f, 0.004659f, -0.000550f, -0.001041f, 0.001375f, 0.007606f, 0.005159f, 0.006775f, 0.003176f, -0.000172f, 0.002792f, 0.007811f, -0.003233f, 0.051833f, 0.013948f, 0.002101f, -0.002904f, -0.007519f, 0.000413f, 0.009693f, -0.006201f, -0.011997f, -0.017650f, 0.001323f, 0.012767f, -0.015801f, 0.007863f, + 0.010365f, -0.004350f, 0.034979f, 0.012474f, -0.008729f, -0.005873f, -0.002650f, 0.012674f, -0.005202f, -0.011566f, -0.012869f, 0.008153f, -0.028063f, 0.001100f, -0.007942f, -0.010132f, 0.008936f, 0.002098f, -0.010317f, -0.006231f, -0.009918f, 0.014107f, -0.004662f, -0.022083f, -0.002746f, 0.000631f, 0.001603f, -0.012755f, -0.018171f, 0.001836f, -0.003448f, -0.002334f, 0.006090f, -0.003713f, 0.016901f, 0.003634f, 0.010052f, -0.010703f, 0.024631f, 0.007307f, -0.012414f, 0.016486f, 0.031176f, -0.008834f, -0.007771f, 0.016150f, 0.014693f, 0.006300f, 0.008905f, -0.019142f, -0.005235f, -0.020706f, 0.006039f, 0.019707f, 0.008752f, -0.024297f, -0.005073f, 0.007903f, -0.024262f, -0.037735f, -0.003390f, 0.001409f, 0.010657f, 0.034579f, 0.002638f, -0.003751f, -0.010861f, -0.007975f, 0.005277f, 0.008895f, 0.007209f, -0.000359f, 0.003761f, 0.000507f, -0.007722f, 0.004887f, 0.005816f, -0.009513f, -0.009388f, 0.010623f, -0.003627f, 0.006318f, 0.004533f, 0.003275f, -0.002764f, 0.002425f, -0.000397f, 0.003798f, 0.000741f, 0.005678f, 0.000005f, 0.005039f, 0.003252f, 0.001275f, -0.004622f, 0.010295f, + 0.003067f, 0.009417f, -0.002094f, -0.002894f, 0.003211f, -0.005991f, -0.001211f, 0.004585f, -0.005974f, 0.001693f, 0.003193f, 0.002251f, 0.002032f, 0.005139f, -0.002111f, -0.008803f, -0.000286f, -0.000745f, -0.009716f, 0.001605f, -0.004174f, -0.040228f, 0.018914f, 0.053473f, -0.021995f, 0.037529f, -0.008490f, -0.008087f, -0.011757f, -0.019386f, 0.014370f, 0.000552f, 0.009805f, 0.009719f, -0.035139f, 0.000468f, 0.016315f, -0.014236f, -0.007561f, -0.022118f, 0.039113f, -0.024411f, 0.019282f, 0.018230f, -0.023335f, -0.009595f, -0.008166f, 0.016430f, -0.018675f, -0.007597f, 0.018944f, -0.003297f, -0.005111f, -0.009233f, 0.023114f, 0.004091f, -0.003773f, -0.009504f, 0.000585f, -0.017596f, 0.019053f, -0.002250f, 0.008752f, 0.047594f, 0.031912f, -0.027381f, -0.019403f, 0.007490f, -0.002489f, 0.019921f, -0.010958f, -0.016048f, -0.005722f, -0.029844f, -0.011537f, -0.003529f, -0.022939f, -0.013089f, 0.050857f, 0.012151f, 0.000176f, -0.002481f, -0.000564f, 0.014989f, 0.017919f, -0.003761f, 0.017702f, 0.001442f, -0.009718f, 0.001938f, -0.027131f, -0.002020f, -0.025138f, -0.013554f, 0.015164f, 0.022228f, + -0.033333f, 0.013559f, -0.008532f, -0.010556f, 0.016170f, -0.002337f, -0.015332f, -0.000842f, -0.005997f, -0.011991f, 0.006187f, 0.004501f, -0.008370f, -0.020653f, -0.009946f, -0.002025f, -0.001609f, 0.016414f, 0.004884f, 0.004153f, -0.008877f, 0.000222f, -0.003637f, 0.008848f, 0.009845f, -0.005157f, 0.004228f, 0.007495f, 0.008107f, 0.006443f, 0.009216f, -0.003526f, 0.000681f, -0.006194f, 0.000546f, -0.007227f, -0.003870f, 0.002943f, -0.001989f, -0.005791f, -0.001358f, 0.003301f, -0.009766f, -0.004669f, -0.005274f, -0.002774f, -0.003698f, -0.004278f, -0.042601f, 0.007229f, 0.039609f, -0.010486f, -0.010045f, 0.008459f, -0.012231f, -0.010111f, 0.011212f, -0.001588f, -0.002177f, -0.000588f, -0.026798f, 0.045451f, -0.048384f, -0.004777f, -0.001062f, 0.016477f, 0.010032f, 0.000474f, -0.018339f, -0.013341f, 0.005842f, 0.035458f, -0.002845f, -0.015816f, -0.010680f, -0.025383f, -0.001673f, -0.014964f, -0.011754f, -0.005335f, 0.007967f, -0.000978f, 0.001234f, -0.017239f, 0.003488f, 0.004716f, 0.010983f, 0.008957f, 0.011059f, -0.023352f, 0.000156f, -0.004881f, 0.015307f, 0.003720f, 0.031004f, 0.006544f, + -0.007114f, 0.002589f, -0.016781f, -0.000275f, 0.013574f, 0.017297f, -0.026512f, -0.020757f, -0.001874f, 0.027573f, -0.043310f, 0.011242f, 0.050137f, 0.027383f, -0.013319f, 0.004482f, -0.026839f, 0.011207f, 0.024814f, -0.042486f, 0.009551f, -0.020775f, -0.005742f, -0.057546f, 0.000386f, -0.024327f, 0.022473f, 0.001401f, -0.026575f, 0.017593f, -0.001605f, -0.034545f, -0.004487f, -0.021896f, 0.014302f, -0.012260f, -0.017863f, 0.024333f, -0.004616f, 0.004204f, -0.008039f, -0.010742f, -0.002785f, 0.010326f, 0.007938f, -0.006007f, -0.001365f, 0.000315f, -0.005937f, 0.003677f, 0.006065f, 0.008527f, -0.008624f, 0.003328f, 0.004762f, -0.010507f, 0.000779f, 0.004448f, -0.007320f, 0.000599f, -0.004693f, 0.011376f, 0.006288f, 0.013871f, -0.006497f, -0.005341f, 0.004815f, -0.013444f, -0.001285f, -0.003944f, -0.001960f, -0.000813f, 0.002964f, -0.007595f, 0.000616f, -0.001116f, 0.002752f, 0.002453f, 0.000608f, -0.007665f, -0.011608f, -0.032340f, 0.051165f, 0.015047f, 0.026761f, -0.030142f, -0.034015f, -0.006037f, 0.008948f, -0.009215f, -0.004603f, 0.017432f, 0.004658f, 0.005597f, 0.015121f, -0.037419f, + -0.004188f, 0.000767f, 0.009515f, -0.025942f, 0.003379f, 0.004729f, -0.018302f, -0.009798f, -0.025189f, -0.018617f, -0.000205f, 0.008336f, -0.020402f, 0.001786f, -0.009290f, -0.017810f, 0.006945f, 0.000213f, 0.014352f, -0.039687f, -0.041790f, 0.008896f, -0.003672f, 0.015893f, 0.034884f, 0.004113f, -0.022107f, 0.031459f, -0.015688f, -0.029203f, -0.022742f, -0.009504f, 0.002396f, -0.031033f, -0.012170f, 0.030799f, 0.041497f, 0.017680f, 0.011533f, 0.008790f, -0.004934f, 0.026613f, 0.014861f, -0.030873f, -0.017021f, 0.000243f, 0.002956f, 0.029105f, 0.018525f, 0.004711f, -0.004610f, -0.003547f, -0.014400f, 0.019324f, 0.014977f, 0.033566f, 0.007512f, 0.009798f, 0.003919f, 0.060237f, 0.006666f, 0.023344f, -0.025088f, 0.002157f, 0.022722f, -0.054565f, 0.004299f, 0.007215f, 0.015193f, -0.005669f, 0.007990f, -0.007144f, -0.002040f, 0.009345f, -0.004726f, 0.028901f, -0.011815f, 0.016882f, -0.004675f, -0.010299f, -0.005718f, -0.011142f, 0.000092f, 0.004486f, 0.005447f, -0.002358f, -0.005827f, 0.012007f, -0.003864f, 0.008013f, -0.004550f, -0.004685f, -0.009065f, 0.008990f, 0.009621f, 0.002029f, + 0.000664f, -0.007488f, -0.013070f, 0.005860f, -0.001418f, 0.000291f, 0.014873f, -0.004407f, 0.012981f, -0.002194f, 0.007441f, 0.005122f, 0.009902f, 0.002156f, -0.009840f, -0.001967f, 0.034505f, 0.002299f, 0.042877f, -0.001542f, -0.019945f, -0.021706f, -0.040591f, 0.007301f, -0.017260f, -0.001245f, 0.003219f, 0.014394f, 0.020917f, 0.035621f, 0.036806f, -0.005863f, 0.032736f, -0.002586f, -0.003120f, 0.012341f, 0.027545f, 0.011968f, 0.007525f, -0.044375f, -0.022969f, -0.036109f, 0.017977f, 0.035909f, 0.006745f, -0.015699f, 0.024911f, 0.036022f, -0.005145f, 0.005486f, -0.008715f, 0.030267f, 0.025435f, 0.021676f, -0.013154f, -0.023048f, -0.003898f, -0.006071f, -0.051271f, 0.008782f, 0.006732f, 0.004429f, -0.013221f, -0.006890f, -0.057146f, -0.020253f, -0.051889f, -0.009155f, -0.038919f, -0.020160f, 0.037061f, 0.009787f, 0.039060f, 0.002505f, -0.032414f, -0.015758f, -0.033717f, -0.064067f, 0.008800f, -0.039626f, -0.011764f, 0.037642f, 0.015517f, 0.014763f, 0.002887f, -0.007243f, -0.002982f, 0.007361f, -0.027761f, 0.022040f, -0.047202f, -0.048479f, -0.002904f, -0.004159f, -0.006264f, -0.035607f, + -0.008303f, 0.047070f, -0.002779f, 0.002955f, -0.012757f, -0.040669f, 0.020500f, -0.027320f, -0.010966f, -0.027192f, -0.017074f, -0.012657f, -0.008907f, -0.009731f, -0.006266f, 0.000756f, 0.004642f, -0.025416f, -0.011194f, 0.005062f, 0.004385f, 0.014429f, 0.006497f, -0.008344f, -0.010951f, 0.009487f, -0.017447f, -0.002452f, 0.005164f, -0.013057f, 0.004016f, 0.004198f, 0.009444f, -0.008858f, -0.003319f, -0.004639f, -0.000872f, 0.006583f, -0.003951f, -0.000375f, -0.005241f, 0.010360f, 0.013883f, -0.004432f, -0.002427f, 0.003994f, 0.004556f, 0.009032f, 0.012287f, 0.002492f, -0.002278f, -0.002793f, 0.020168f, 0.040633f, 0.035366f, 0.038104f, -0.021961f, -0.038225f, 0.029399f, -0.017373f, 0.030385f, 0.009134f, -0.048811f, 0.012312f, 0.009093f, -0.054951f, 0.029549f, -0.025018f, -0.025585f, 0.015042f, 0.016725f, 0.002676f, 0.019853f, 0.001556f, 0.000992f, -0.012839f, -0.007445f, 0.012130f, -0.007634f, -0.018791f, 0.001267f, -0.035361f, 0.012805f, -0.044967f, -0.027377f, 0.001749f, 0.017874f, -0.006071f, -0.018618f, 0.007065f, 0.014100f, 0.010571f, 0.000833f, 0.036358f, -0.083369f, -0.018847f, + -0.022827f, -0.027604f, 0.036180f, -0.029073f, -0.003980f, -0.067160f, -0.018805f, -0.007893f, 0.003516f, 0.044945f, -0.010811f, 0.005773f, -0.027071f, 0.022850f, -0.033685f, -0.021718f, 0.017524f, -0.077978f, 0.011378f, 0.041849f, 0.054225f, 0.041522f, 0.026231f, 0.061080f, 0.033682f, -0.000609f, -0.015067f, -0.015528f, -0.023566f, -0.052439f, -0.005686f, 0.005044f, -0.074330f, -0.029283f, -0.022462f, -0.016642f, 0.023813f, 0.062425f, 0.072778f, 0.048341f, -0.024402f, 0.020035f, -0.015725f, -0.003255f, 0.016492f, 0.011361f, -0.006329f, 0.004103f, 0.005439f, -0.001277f, 0.002523f, -0.011263f, 0.006565f, 0.020614f, -0.009595f, 0.002918f, -0.018004f, 0.004626f, -0.008426f, -0.001025f, -0.000873f, 0.015988f, 0.027990f, -0.009822f, 0.001767f, 0.007028f, 0.011407f, -0.016700f, -0.026178f, 0.000730f, 0.020404f, 0.006167f, -0.016694f, 0.015896f, 0.008246f, -0.016723f, 0.011911f, 0.007865f, -0.006521f, -0.004939f, -0.001800f, -0.002892f, 0.003088f, 0.006646f, -0.005943f, 0.011726f, -0.071581f, 0.000097f, 0.011946f, 0.050196f, -0.016342f, 0.023200f, 0.021110f, 0.011105f, 0.011524f, -0.078302f, + 0.061740f, 0.033624f, 0.076496f, 0.028062f, -0.003339f, -0.028482f, -0.018076f, -0.017862f, -0.027748f, 0.019719f, 0.014510f, -0.028220f, -0.032048f, 0.016836f, 0.022902f, 0.039877f, 0.011135f, -0.024929f, -0.037154f, 0.007747f, 0.006197f, 0.002442f, 0.004355f, 0.070847f, 0.023915f, 0.013427f, 0.023251f, 0.025530f, 0.028764f, 0.000506f, -0.045177f, 0.031528f, 0.098846f, -0.010299f, -0.027754f, -0.060447f, -0.013143f, 0.079628f, 0.009130f, 0.032820f, 0.010846f, -0.110606f, 0.022543f, 0.019573f, 0.002079f, 0.011092f, -0.007976f, 0.001428f, 0.022255f, -0.059700f, -0.024942f, 0.050135f, 0.018419f, 0.006608f, -0.045044f, 0.031655f, 0.011546f, -0.040650f, -0.044095f, -0.029720f, 0.039734f, 0.082985f, 0.077208f, 0.085070f, 0.086289f, 0.003077f, -0.038970f, -0.032133f, -0.076157f, -0.025245f, 0.023557f, -0.061898f, -0.000959f, -0.050528f, 0.000257f, 0.066905f, 0.025819f, 0.027294f, 0.033000f, 0.020412f, -0.020996f, -0.007305f, -0.025799f, 0.036120f, -0.022626f, -0.020048f, 0.006112f, -0.004769f, -0.013683f, -0.024748f, -0.007562f, 0.024391f, 0.022959f, -0.011538f, 0.035783f, -0.002272f, + 0.000354f, -0.017074f, 0.004778f, 0.018149f, -0.005345f, -0.014917f, -0.014485f, 0.008710f, -0.008311f, 0.019823f, 0.012276f, 0.015903f, 0.023541f, -0.025408f, 0.005595f, 0.001411f, 0.010389f, -0.005889f, -0.011309f, 0.021007f, 0.004465f, 0.016979f, -0.010373f, 0.005667f, -0.015334f, -0.005647f, 0.034471f, 0.073210f, -0.147344f, -0.050634f, 0.010454f, -0.084503f, -0.079394f, -0.032925f, -0.048592f, 0.006459f, -0.036033f, 0.093805f, -0.010830f, -0.031820f, -0.014278f, -0.069943f, -0.020632f, -0.056224f, -0.024811f, 0.011114f, -0.074849f, -0.011275f, 0.056294f, -0.046816f, -0.014742f, 0.017645f, -0.001221f, 0.025040f, 0.004078f, 0.001249f, 0.020419f, 0.009095f, -0.037646f, -0.005696f, 0.031764f, -0.015330f, -0.046656f, -0.013823f, -0.056379f, -0.026095f, -0.098069f, 0.010710f, -0.067093f, 0.033204f, 0.010916f, -0.023013f, -0.086605f, 0.009208f, -0.010029f, 0.106894f, 0.041076f, 0.003246f, 0.056419f, 0.026155f, -0.000356f, 0.047916f, -0.055855f, -0.024819f, 0.003229f, 0.042545f, -0.046411f, -0.026321f, 0.152211f, -0.013312f, 0.078425f, -0.060497f, -0.001013f, -0.042836f, 0.032419f, -0.014346f, + 0.051058f, 0.082850f, 0.001315f, -0.056517f, 0.048682f, -0.060294f, -0.028796f, 0.021957f, -0.064716f, -0.041482f, -0.021203f, 0.047620f, 0.087735f, -0.104170f, 0.087964f, 0.018991f, 0.025138f, 0.011033f, 0.011649f, 0.010696f, -0.013925f, 0.017294f, 0.045187f, -0.022004f, 0.007271f, -0.003253f, 0.005210f, -0.048643f, -0.009757f, -0.014012f, 0.014266f, 0.016693f, 0.048354f, -0.029389f, -0.018570f, -0.022612f, 0.033323f, -0.042243f, 0.009720f, 0.017385f, 0.014028f, 0.017536f, -0.072499f, -0.015737f, 0.025122f, -0.010987f, -0.031405f, -0.002651f, 0.007728f, 0.003209f, 0.029675f, 0.016809f, 0.023413f, -0.022744f, -0.022266f, 0.025925f, 0.006488f, 0.017926f, -0.016864f, 0.018053f, 0.010610f, 0.004655f, 0.005487f, -0.005233f, -0.008137f, 0.001915f, -0.055285f, 0.114250f, -0.065657f, 0.042017f, 0.037436f, -0.059444f, 0.032558f, 0.017959f, 0.012794f, -0.010564f, 0.045082f, 0.023332f, -0.057502f, 0.040735f, 0.047331f, 0.009212f, 0.007953f, 0.028661f, -0.000843f, -0.057130f, 0.074133f, -0.042405f, 0.016688f, -0.031548f, -0.007387f, 0.009300f, -0.014031f, 0.060455f, 0.013464f, -0.008042f, + -0.014689f, -0.003219f, 0.011703f, -0.061632f, 0.019363f, -0.031988f, -0.021735f, -0.014853f, -0.000317f, -0.030294f, -0.014554f, 0.007249f, 0.063731f, 0.000589f, -0.013601f, -0.040833f, 0.016811f, 0.011137f, 0.001681f, 0.049494f, -0.012287f, -0.005289f, 0.058789f, 0.018437f, 0.003201f, -0.057076f, -0.030047f, 0.036618f, 0.020301f, -0.053484f, 0.001439f, -0.121372f, -0.060318f, 0.108541f, -0.025749f, 0.058644f, 0.076726f, 0.021762f, 0.012804f, 0.034712f, -0.015184f, -0.042727f, 0.022546f, 0.007011f, -0.003098f, 0.048882f, 0.031545f, -0.035395f, -0.084989f, -0.017685f, 0.034125f, 0.010824f, -0.002425f, 0.027274f, -0.032362f, 0.047312f, -0.023660f, 0.017600f, 0.021759f, 0.009543f, 0.032166f, 0.024549f, 0.039072f, 0.004314f, -0.010700f, 0.014128f, 0.037849f, -0.010208f, 0.033077f, 0.019941f, -0.022148f, 0.006593f, 0.017359f, 0.011829f, 0.006882f, 0.023887f, 0.019665f, 0.008653f, 0.039694f, -0.012901f, 0.004148f, -0.005959f, -0.003045f, -0.010375f, 0.035183f, 0.029307f, 0.023198f, -0.011306f, 0.004079f, 0.041839f, -0.011375f, 0.030632f, 0.027221f, -0.000083f, 0.047750f, -0.043711f, + 0.005746f, 0.065924f, 0.008086f, 0.018581f, -0.014102f, 0.046369f, 0.008634f, 0.064852f, -0.020018f, -0.108398f, 0.018432f, -0.013083f, 0.037336f, 0.011394f, -0.036749f, 0.019023f, 0.022373f, -0.041925f, -0.046002f, -0.030827f, -0.076813f, -0.077342f, 0.053192f, -0.012365f, -0.079440f, -0.024402f, 0.008130f, 0.026237f, 0.025147f, -0.048711f, -0.052776f, 0.005133f, 0.073393f, -0.035169f, 0.028309f, -0.049454f, 0.017525f, -0.055786f, 0.036254f, 0.038245f, -0.027365f, -0.057413f, -0.039509f, -0.006456f, 0.022452f, -0.024681f, -0.016292f, -0.020559f, -0.073033f, -0.063119f, 0.032984f, -0.053002f, -0.010913f, 0.018805f, -0.043812f, -0.070663f, 0.026858f, 0.036991f, -0.004838f, -0.085056f, 0.037910f, 0.033304f, 0.107377f, 0.000446f, 0.028100f, 0.020995f, -0.046041f, 0.017537f, -0.014402f, -0.092951f, -0.014367f, 0.056748f, 0.013376f, -0.047044f, -0.116730f, 0.073588f, 0.093956f, -0.028023f, 0.075963f, 0.088556f, 0.004406f, 0.003968f, 0.069854f, -0.045397f, 0.003350f, 0.117237f, -0.086632f, 0.050245f, -0.074237f, -0.020371f, -0.006203f, 0.050469f, -0.017321f, 0.007305f, 0.028153f, -0.000916f, + -0.065735f, 0.072191f, -0.013285f, -0.008494f, 0.010920f, 0.030139f, -0.049461f, 0.021566f, 0.012505f, -0.007445f, 0.014844f, 0.017553f, -0.045853f, -0.006191f, 0.010475f, 0.024003f, 0.049694f, -0.004206f, -0.043939f, 0.022255f, 0.051007f, -0.040722f, 0.049747f, -0.023642f, -0.005495f, -0.017545f, 0.056120f, -0.038918f, 0.013163f, 0.035199f, -0.024528f, 0.008855f, 0.006012f, -0.032432f, 0.006901f, 0.014031f, -0.006376f, -0.024614f, 0.015815f, 0.020486f, -0.011679f, 0.040709f, -0.061370f, 0.015115f, 0.017605f, 0.000894f, 0.003433f, 0.042028f, -0.009443f, 0.023576f, -0.048800f, -0.154522f, 0.041787f, -0.017859f, 0.115415f, -0.039730f, -0.025342f, -0.046375f, -0.132183f, 0.060423f, -0.077022f, -0.045093f, 0.002374f, -0.000217f, 0.101995f, -0.073021f, -0.051054f, 0.067091f, 0.040006f, 0.034944f, -0.012634f, 0.033383f, -0.023613f, -0.033707f, -0.030931f, 0.078681f, 0.065544f, 0.102316f, -0.032536f, -0.038404f, 0.001860f, -0.006842f, 0.037647f, -0.061729f, 0.013273f, -0.064878f, 0.034675f, 0.063476f, 0.021879f, -0.052423f, 0.035734f, -0.046224f, 0.103972f, 0.052830f, 0.014773f, 0.013921f, + -0.015987f, -0.081564f, 0.046120f, -0.110614f, 0.023160f, 0.020519f, 0.054079f, 0.042804f, -0.095420f, 0.028741f, -0.060081f, -0.035760f, 0.026078f, -0.009530f, 0.035710f, 0.022782f, -0.087233f, 0.035649f, 0.080283f, 0.106009f, -0.030692f, 0.031310f, -0.043221f, 0.074401f, -0.105648f, -0.005598f, -0.019178f, 0.033378f, 0.069643f, 0.099886f, -0.079877f, 0.019917f, -0.106913f, 0.068785f, 0.141055f, -0.035801f, -0.095978f, -0.007720f, -0.072363f, 0.092574f, 0.023588f, -0.047250f, -0.013275f, 0.005394f, -0.015733f, 0.066126f, 0.024994f, -0.037336f, 0.035676f, -0.052872f, 0.003546f, 0.049646f, -0.010257f, -0.060938f, 0.067692f, -0.097244f, 0.028299f, -0.014647f, 0.038988f, -0.002409f, 0.024259f, -0.022383f, -0.011899f, 0.009945f, 0.008649f, 0.010373f, 0.046247f, -0.047144f, -0.039548f, 0.002259f, 0.010755f, -0.010843f, -0.049122f, -0.035940f, 0.072207f, 0.019513f, -0.031944f, -0.036888f, -0.082191f, 0.098606f, 0.077239f, -0.029956f, -0.026302f, -0.057385f, 0.002285f, 0.073707f, -0.121385f, 0.086680f, -0.011231f, -0.003413f, 0.028843f, 0.024145f, 0.034343f, 0.009498f, 0.016828f, -0.042774f, + 0.040601f, 0.011008f, -0.043458f, 0.029293f, -0.017220f, -0.000803f, 0.039702f, 0.022817f, -0.061870f, 0.034703f, -0.029214f, 0.051508f, -0.037475f, 0.012940f, -0.019084f, 0.023900f, -0.018181f, 0.010914f, -0.027136f, 0.059254f, -0.005110f, 0.001480f, 0.017827f, 0.019767f, -0.029924f, -0.006415f, 0.013747f, 0.019660f, 0.018266f, -0.021037f, 0.007715f, 0.000711f, -0.060150f, -0.005179f, 0.015855f, 0.022035f, 0.009870f, 0.014062f, -0.054079f, 0.008475f, -0.002934f, 0.005304f, 0.012723f, -0.010923f, 0.012048f, 0.008880f, 0.005361f, -0.013308f, -0.012018f, -0.004371f, 0.063105f, -0.022283f, 0.012763f, 0.023177f, -0.012903f, 0.022044f, -0.025005f, 0.021237f, 0.011387f, -0.017108f, -0.025155f, 0.015793f, -0.015354f, 0.012344f, -0.022596f, -0.019932f, -0.008785f, 0.028692f, -0.007195f, 0.002587f, 0.006031f, -0.002284f, 0.007131f, -0.023073f, 0.017558f, -0.014957f, 0.038269f, -0.035571f, 0.016762f, -0.021300f, 0.019142f, -0.017431f, 0.015352f, 0.000233f, 0.025914f, -0.022446f, 0.012210f, -0.011578f, 0.001493f, 0.004356f, 0.015348f, -0.016171f, 0.003919f, -0.017435f, 0.024564f, -0.020648f, + -0.005546f, 0.012171f, 0.005189f, -0.010169f, -0.002833f, 0.013772f, 0.009349f, -0.033915f, 0.018980f, 0.001494f, 0.000317f, -0.003736f, 0.006936f, -0.004385f, 0.003712f, -0.002784f, 0.004485f, 0.000959f, 0.008908f, -0.009713f, 0.024218f, -0.030819f, 0.096578f, -0.006981f, -0.031249f, -0.047700f, -0.021656f, -0.026787f, 0.035051f, 0.020236f, -0.025451f, 0.002097f, 0.003019f, 0.011417f, 0.001587f, 0.024230f, 0.008387f, 0.019077f, -0.006539f, -0.000717f, -0.005721f, 0.008926f, 0.020722f, -0.019261f, -0.000113f, -0.009549f, 0.000685f, 0.025217f, -0.014315f, 0.002428f, -0.006465f, 0.009915f, 0.005142f, -0.013888f, -0.005129f, 0.014828f, -0.004561f, 0.024198f, 0.017242f, -0.025323f, 0.008110f, 0.005326f, 0.013270f, 0.005573f, -0.023898f, 0.016141f, -0.004474f, 0.015696f, 0.012587f, -0.028569f, 0.007828f, 0.000046f, 0.006423f, -0.003223f, -0.012535f, 0.020304f, -0.005003f, 0.009194f, 0.000484f, -0.006150f, 0.009414f, -0.012187f, -0.001710f, 0.016925f, -0.011662f, -0.014031f, 0.028276f, -0.018304f, 0.026378f, -0.002792f, -0.021378f, 0.043685f, -0.040157f, 0.034863f, -0.012385f, -0.020968f, + 0.022107f, -0.020602f, 0.006085f, 0.007078f, -0.020125f, 0.016893f, -0.003632f, -0.001346f, 0.010808f, -0.014038f, 0.018294f, -0.005982f, -0.001420f, 0.004460f, -0.003136f, 0.006378f, -0.003079f, 0.000982f, 0.005326f, -0.005209f, 0.008522f, -0.001054f, -0.004879f, 0.010444f, -0.016298f, 0.008594f, -0.007259f, -0.003403f, 0.010133f, 0.000788f, -0.003081f, 0.005207f, -0.003887f, 0.005168f, 0.002645f, -0.007610f, 0.005030f, 0.000960f, -0.001739f, -0.001354f, 0.004539f, 0.000914f, 0.008403f, -0.006717f, 0.002369f, 0.001011f, -0.004795f, 0.009271f, -0.002739f, -0.001557f, -0.047306f, -0.081142f, 0.102355f, 0.293207f, 0.046342f, 0.028416f, -0.214370f, -0.265014f, -0.084947f, -0.052099f, 0.179234f, 0.273425f, 0.140667f, 0.040770f, -0.092066f, -0.197830f, -0.180487f, -0.151145f, 0.011916f, 0.226517f, 0.189400f, 0.108643f, 0.036835f, -0.096937f, -0.125790f, -0.099859f, -0.096581f, -0.034037f, 0.045714f, 0.062915f, 0.130053f, 0.093163f, 0.022534f, -0.031544f, -0.018635f, -0.104728f, -0.050958f, -0.052920f, -0.071772f, 0.042696f, 0.080386f, 0.046543f, 0.117058f, 0.031126f, -0.027891f, -0.044983f, + -0.077950f, -0.061530f, -0.009713f, -0.019014f, 0.023838f, 0.048490f, 0.043110f, 0.030880f, 0.020944f, -0.010632f, -0.042832f, -0.030210f, -0.035635f, 0.011479f, 0.041408f, 0.013713f, 0.010118f, -0.017977f, -0.037266f, -0.006926f, -0.000161f, -0.000509f, 0.030052f, 0.027017f, 0.030123f, 0.011956f, -0.010476f, -0.032331f, -0.046963f, -0.047952f, -0.031285f, 0.033302f, 0.049167f, 0.061120f, 0.042169f, -0.010590f, -0.023957f, -0.025310f, -0.050331f, -0.022161f, 0.018272f, 0.009700f, 0.009034f, 0.014693f, 0.006969f, 0.005658f, -0.007855f, -0.010048f, 0.007864f, 0.017495f, -0.000435f, -0.001472f, -0.012089f, -0.016497f, -0.008664f, -0.010007f, -0.005970f, 0.012981f, -0.002348f, 0.027110f, 0.033357f, 0.019363f, -0.011639f, -0.018946f, -0.021344f, -0.026849f, -0.019718f, -0.026571f, 0.014178f, 0.036708f, 0.033391f, 0.019845f, 0.020834f, 0.007951f, -0.020606f, -0.040141f, -0.041168f, -0.020846f, -0.004297f, 0.013050f, 0.029249f, 0.043066f, 0.035251f, 0.006691f, -0.022769f, -0.037818f, -0.027793f, -0.009167f, 0.000231f, 0.010401f, 0.006563f, 0.016272f, 0.020732f, 0.006194f, -0.009014f, -0.012223f, + -0.006915f, -0.005084f, -0.005010f, -0.001387f, 0.001462f, 0.009676f, 0.005820f, 0.000693f, -0.000119f, -0.000576f, -0.001858f, -0.004215f, -0.004414f, 0.001334f, 0.001359f, 0.000827f, -0.000331f, 0.000400f} + }, + { + {-0.005343f, 0.020366f, 0.002374f, 0.005529f, 0.001946f, 0.002922f, -0.004913f, -0.012293f, -0.002380f, 0.006525f, 0.002318f, -0.006075f, -0.000860f, 0.004995f, -0.001288f, -0.007318f, 0.002209f, -0.008438f, -0.005245f, -0.000243f, 0.002323f, -0.002386f, -0.001915f, 0.005261f, -0.007297f, -0.000155f, 0.000921f, 0.003546f, 0.002792f, 0.002703f, 0.008906f, 0.004042f, -0.011082f, -0.002807f, -0.005042f, 0.001420f, -0.000294f, -0.000821f, -0.006982f, -0.009075f, 0.012036f, -0.005544f, 0.002937f, 0.003521f, 0.003010f, -0.011414f, -0.006505f, -0.002979f, 0.001252f, -0.000881f, -0.000366f, -0.001036f, 0.001917f, 0.004372f, -0.005986f, -0.000002f, 0.003194f, 0.003742f, 0.004441f, 0.001651f, 0.000072f, 0.004320f, 0.001519f, -0.001860f, -0.000560f, 0.007006f, -0.005203f, -0.005484f, -0.002975f, -0.002196f, 0.005966f, 0.003540f, 0.001412f, -0.002226f, 0.005748f, -0.002563f, 0.002973f, -0.006805f, -0.000662f, 0.000527f, 0.001403f, 0.001415f, -0.005511f, 0.001489f, 0.003878f, 0.001959f, 0.000645f, -0.000495f, 0.005077f, 0.002425f, -0.000528f, 0.003263f, 0.001925f, 0.000847f, -0.000761f, 0.001094f, + 0.000862f, 0.000708f, -0.000987f, 0.001239f, 0.000335f, -0.001026f, -0.000830f, 0.001763f, 0.000372f, -0.000174f, 0.000005f, 0.000068f, 0.000279f, -0.001646f, 0.001160f, -0.000463f, 0.000907f, -0.001296f, -0.011577f, -0.006970f, 0.004932f, -0.011325f, -0.016014f, 0.003115f, 0.001376f, 0.001976f, 0.002341f, 0.002255f, -0.013767f, -0.002248f, 0.003998f, -0.008729f, 0.009173f, 0.008918f, 0.007652f, -0.003094f, 0.000703f, 0.002072f, 0.005860f, 0.001337f, -0.000199f, 0.001154f, -0.003984f, 0.003699f, -0.001439f, -0.001450f, -0.001873f, 0.011312f, -0.006749f, 0.003916f, -0.004260f, -0.003668f, -0.003826f, 0.003002f, 0.006186f, -0.006601f, -0.003292f, -0.003576f, 0.004527f, 0.004264f, 0.006878f, 0.004676f, 0.000918f, 0.006028f, -0.005134f, 0.003624f, 0.001377f, 0.001575f, 0.012623f, 0.002987f, 0.006241f, -0.010359f, -0.002798f, 0.004273f, -0.005184f, 0.004916f, -0.002241f, -0.003812f, 0.001349f, 0.007576f, 0.005108f, 0.003495f, -0.001854f, 0.001552f, 0.005645f, -0.006831f, 0.009011f, -0.001228f, 0.007385f, -0.003000f, 0.006093f, 0.007276f, 0.006126f, -0.003421f, -0.009090f, -0.013416f, + -0.009064f, 0.000876f, -0.004756f, 0.008864f, 0.001469f, 0.001389f, 0.002370f, -0.006325f, -0.001960f, -0.002845f, 0.003182f, -0.001711f, -0.001219f, 0.003905f, -0.004769f, -0.001683f, 0.001887f, -0.002646f, 0.000219f, -0.002953f, -0.002361f, -0.001870f, -0.000531f, -0.003149f, 0.019453f, 0.013978f, 0.011453f, 0.009532f, 0.010742f, 0.004538f, -0.000847f, -0.000237f, -0.003989f, -0.001189f, 0.014133f, -0.006168f, -0.006358f, 0.009753f, 0.007240f, 0.009377f, -0.006554f, 0.002840f, -0.002478f, 0.002120f, 0.004178f, 0.005855f, 0.000857f, -0.004272f, -0.003175f, -0.005497f, -0.001964f, -0.003396f, -0.010024f, -0.001214f, 0.008441f, -0.006568f, -0.001143f, 0.003123f, -0.005164f, -0.004676f, 0.004775f, -0.002576f, -0.006695f, -0.003585f, 0.003816f, -0.005718f, -0.007365f, -0.003355f, -0.002186f, 0.002490f, -0.005138f, -0.010645f, 0.000757f, -0.001749f, -0.001489f, 0.003092f, -0.008739f, -0.004249f, 0.000164f, -0.003639f, 0.004823f, -0.001213f, 0.002084f, -0.015677f, -0.004752f, 0.008901f, -0.003493f, -0.008621f, 0.002581f, 0.001554f, 0.002442f, -0.003192f, -0.012438f, -0.005624f, 0.014013f, 0.000981f, + 0.005171f, 0.002992f, -0.002002f, 0.004300f, 0.005846f, 0.002486f, -0.002887f, -0.006667f, -0.000002f, 0.001707f, -0.005063f, 0.002334f, -0.006565f, -0.000634f, -0.004182f, -0.002010f, -0.005540f, -0.001014f, -0.003161f, -0.003986f, -0.003097f, 0.000662f, -0.001370f, 0.000765f, -0.001503f, 0.000604f, -0.002786f, 0.002057f, 0.001093f, -0.000714f, -0.000499f, 0.002663f, -0.000045f, -0.000878f, -0.002474f, -0.001218f, -0.001113f, -0.000125f, 0.000255f, 0.000127f, 0.027586f, 0.016947f, 0.016041f, 0.000295f, 0.001613f, 0.001291f, -0.006558f, -0.014595f, -0.005501f, 0.011035f, -0.008317f, 0.005001f, 0.014925f, 0.001211f, -0.004703f, -0.001857f, -0.002996f, -0.001573f, 0.006052f, 0.008577f, 0.000333f, 0.002532f, 0.003526f, 0.005592f, 0.000366f, -0.007842f, 0.002450f, -0.012640f, -0.003778f, -0.001597f, -0.003484f, -0.002298f, 0.001610f, -0.003027f, -0.006601f, -0.005175f, -0.002353f, 0.000542f, -0.002811f, -0.007674f, 0.009154f, -0.003430f, 0.000703f, -0.002381f, -0.005936f, 0.007470f, 0.020872f, 0.005000f, -0.007203f, 0.012293f, 0.002862f, -0.003827f, 0.003798f, -0.002168f, -0.007978f, -0.000004f, + -0.003318f, 0.003067f, -0.006905f, -0.012081f, 0.000520f, 0.001952f, -0.014551f, 0.004310f, 0.003065f, 0.008103f, 0.004678f, 0.010725f, -0.003607f, -0.007331f, -0.004228f, -0.002321f, 0.005294f, -0.001979f, -0.009341f, 0.006341f, -0.004534f, -0.008597f, 0.005871f, -0.008588f, -0.004627f, 0.002635f, -0.003044f, 0.002893f, -0.001994f, -0.003582f, 0.002869f, 0.007176f, -0.001635f, -0.003626f, -0.001258f, -0.000068f, 0.002574f, 0.005025f, 0.001499f, -0.001547f, -0.001862f, -0.001926f, -0.000586f, 0.001144f, -0.003650f, -0.001353f, -0.001054f, 0.005515f, 0.002866f, 0.003884f, -0.000635f, 0.000245f, 0.003082f, 0.001990f, 0.001502f, -0.000234f, 0.000541f, -0.014195f, -0.022437f, -0.006889f, -0.011226f, 0.016077f, -0.003669f, -0.001968f, 0.006021f, -0.014841f, -0.010456f, 0.008907f, -0.007190f, -0.006678f, -0.000369f, -0.000607f, 0.001583f, 0.005868f, -0.002467f, 0.002670f, -0.003868f, -0.002878f, -0.000274f, -0.002547f, -0.006502f, -0.000585f, -0.001396f, 0.006791f, 0.006878f, 0.006031f, -0.008054f, 0.003739f, 0.002730f, 0.011265f, -0.005676f, -0.000421f, -0.003860f, -0.008621f, 0.012279f, -0.011647f, + -0.005714f, -0.004536f, 0.002901f, 0.010186f, -0.009424f, 0.010537f, -0.001136f, 0.005680f, 0.008790f, 0.001425f, 0.006779f, -0.012546f, 0.002775f, -0.004732f, 0.000660f, -0.013288f, 0.000263f, -0.004580f, -0.011884f, -0.009141f, 0.000729f, 0.008780f, 0.000478f, -0.006398f, 0.010012f, -0.003433f, 0.005803f, -0.000786f, -0.012332f, 0.017287f, -0.010770f, -0.002137f, -0.006118f, 0.004323f, 0.007037f, 0.004651f, 0.006494f, 0.014000f, 0.010703f, -0.001780f, 0.002255f, 0.006615f, 0.004188f, -0.004975f, 0.007132f, 0.005546f, -0.001023f, 0.003157f, -0.006950f, -0.009609f, -0.001004f, -0.003090f, 0.005428f, -0.005628f, -0.001148f, -0.005409f, -0.001228f, -0.002478f, -0.000782f, 0.001637f, 0.002034f, 0.001120f, -0.000214f, -0.001349f, 0.003273f, 0.001665f, -0.003330f, 0.002442f, 0.000184f, -0.008313f, -0.000718f, -0.002980f, 0.004789f, -0.001255f, -0.000537f, 0.001756f, -0.000887f, 0.001676f, 0.003762f, -0.000230f, 0.002450f, 0.002607f, -0.000475f, 0.000987f, 0.005295f, 0.006048f, -0.015886f, -0.022655f, 0.002548f, 0.001907f, 0.001283f, 0.014612f, -0.004719f, -0.015892f, 0.001696f, 0.001862f, + -0.004182f, -0.000902f, -0.013968f, -0.002747f, 0.001761f, 0.002095f, 0.015670f, -0.002721f, 0.014046f, -0.003370f, -0.003596f, 0.001194f, -0.013893f, 0.005963f, -0.005220f, 0.008502f, -0.002319f, -0.003556f, -0.005143f, -0.002501f, 0.000526f, -0.010378f, 0.018026f, -0.012443f, -0.020204f, 0.006080f, 0.000962f, -0.014180f, -0.004167f, -0.027241f, 0.000505f, -0.009680f, -0.000097f, -0.010512f, -0.008519f, 0.001515f, 0.001005f, 0.004735f, -0.008588f, 0.006924f, -0.009695f, -0.018794f, 0.002284f, 0.005253f, -0.005667f, 0.006211f, -0.003188f, -0.010410f, -0.009163f, -0.012665f, -0.005989f, -0.001312f, 0.002126f, -0.003760f, 0.011836f, 0.000080f, -0.003637f, 0.001068f, 0.000758f, 0.002498f, 0.001881f, 0.001430f, -0.011267f, -0.010533f, 0.002290f, 0.007543f, 0.004476f, 0.001288f, -0.002449f, 0.009360f, 0.005169f, -0.004292f, -0.003156f, -0.010374f, -0.004259f, 0.004701f, 0.002238f, -0.005631f, 0.002335f, -0.001532f, -0.001639f, -0.002612f, -0.003251f, -0.001084f, -0.004303f, -0.003239f, 0.001828f, 0.000918f, 0.002637f, 0.004535f, 0.000388f, 0.003987f, 0.000228f, -0.002531f, 0.003752f, 0.002391f, + -0.000722f, 0.000607f, -0.002099f, -0.002064f, -0.000031f, 0.000257f, -0.002356f, 0.000176f, -0.000703f, -0.000042f, 0.000000f, -0.000448f, 0.002447f, -0.003823f, -0.000599f, -0.001088f, 0.000220f, 0.001423f, 0.002505f, -0.034983f, -0.008828f, 0.001423f, -0.008976f, -0.006499f, -0.011220f, 0.002915f, 0.003884f, 0.007996f, -0.006061f, -0.007442f, -0.008497f, 0.004248f, 0.009371f, -0.004666f, -0.004077f, -0.002374f, -0.001495f, 0.004491f, -0.019572f, -0.004799f, 0.010986f, 0.003619f, -0.005765f, 0.002111f, 0.009727f, -0.000939f, -0.002538f, 0.003440f, -0.000660f, 0.023988f, -0.010356f, 0.005884f, 0.001886f, -0.010073f, 0.003279f, 0.002275f, -0.011524f, 0.008128f, -0.016357f, -0.001566f, 0.014400f, 0.003194f, -0.000458f, -0.003020f, -0.011192f, -0.009613f, 0.002537f, 0.006228f, -0.004234f, 0.003043f, 0.011930f, 0.005949f, -0.005001f, 0.007394f, -0.010651f, -0.024961f, -0.003336f, -0.010953f, 0.006919f, -0.007010f, 0.017714f, 0.008902f, -0.000843f, -0.002894f, -0.023029f, 0.007274f, 0.008769f, -0.007038f, 0.014036f, -0.010904f, 0.004269f, -0.018286f, 0.008475f, 0.006441f, -0.020864f, -0.013246f, + -0.004292f, 0.005171f, 0.006910f, 0.015215f, -0.002121f, -0.000710f, 0.009851f, 0.002312f, 0.000042f, -0.004376f, 0.002251f, 0.002313f, 0.002957f, 0.003262f, 0.000803f, -0.000375f, -0.001899f, -0.002128f, -0.005624f, -0.004641f, 0.003744f, 0.002688f, 0.001929f, 0.004680f, -0.001881f, 0.002278f, 0.002370f, -0.001148f, 0.004004f, -0.000499f, -0.000032f, -0.000917f, -0.004519f, -0.000952f, 0.005216f, 0.001210f, 0.003877f, -0.001399f, 0.001432f, -0.002009f, 0.006204f, 0.000631f, 0.005207f, 0.002336f, -0.002533f, 0.001399f, 0.008793f, 0.014766f, 0.034164f, 0.036427f, 0.007319f, 0.010917f, 0.000119f, 0.005207f, 0.000343f, 0.003845f, -0.009731f, 0.004529f, -0.006046f, 0.008077f, 0.007655f, 0.018760f, 0.002905f, -0.003786f, 0.011768f, 0.008486f, 0.014151f, 0.000706f, 0.008808f, 0.005122f, -0.004351f, 0.004408f, 0.021056f, 0.003355f, -0.009078f, -0.004894f, 0.015584f, 0.009637f, 0.007501f, 0.014487f, -0.011132f, 0.004352f, 0.017268f, -0.017193f, -0.020547f, 0.006798f, 0.011026f, 0.017927f, -0.007762f, -0.013373f, 0.010854f, 0.003937f, -0.001621f, 0.006742f, -0.002714f, -0.001636f, + -0.000098f, 0.025512f, -0.009223f, 0.005173f, -0.006152f, -0.003953f, -0.003004f, 0.013302f, -0.001760f, 0.029690f, 0.014240f, -0.014257f, 0.016595f, 0.003617f, 0.007736f, 0.003566f, 0.003606f, 0.004045f, -0.005435f, 0.010015f, -0.023487f, -0.006209f, 0.010749f, -0.023926f, 0.008192f, -0.019335f, 0.004541f, 0.021332f, 0.005276f, -0.000149f, 0.005864f, 0.002026f, -0.005744f, 0.001433f, -0.006105f, 0.000695f, 0.004917f, -0.014386f, 0.008239f, -0.002625f, -0.003422f, 0.000957f, 0.004460f, -0.003784f, -0.005733f, 0.001920f, 0.005181f, -0.002755f, -0.004851f, -0.004790f, -0.002806f, 0.001977f, -0.003428f, -0.003088f, 0.003226f, 0.004490f, 0.002105f, -0.002408f, 0.002937f, -0.002152f, -0.007414f, -0.003377f, -0.000121f, -0.003797f, 0.002108f, 0.001506f, 0.003095f, 0.005016f, 0.007390f, -0.003534f, 0.010426f, -0.003690f, -0.006110f, -0.002115f, 0.003689f, 0.000760f, -0.006213f, -0.004066f, 0.056326f, 0.009822f, 0.008845f, -0.016481f, 0.024274f, -0.008051f, -0.001081f, -0.006369f, 0.001332f, -0.015775f, -0.001219f, 0.007491f, 0.001754f, -0.012846f, 0.016010f, -0.003834f, -0.008345f, 0.002351f, + 0.005001f, -0.016542f, -0.023322f, 0.009707f, -0.009648f, -0.013718f, 0.002679f, -0.000026f, -0.007099f, 0.012189f, -0.012259f, 0.004086f, 0.011784f, -0.002039f, 0.017183f, 0.005478f, -0.021839f, -0.022741f, -0.009778f, 0.001536f, 0.004121f, -0.017956f, 0.006485f, 0.006618f, 0.003399f, 0.005862f, 0.007925f, -0.018663f, -0.009373f, 0.005499f, -0.020911f, -0.007486f, -0.000527f, -0.021557f, -0.011614f, -0.007325f, 0.004354f, -0.011006f, -0.023536f, -0.011074f, -0.012589f, 0.027314f, 0.013132f, -0.002147f, 0.003703f, -0.007221f, 0.021633f, 0.026071f, 0.002897f, 0.017502f, 0.012681f, 0.005100f, 0.003110f, -0.009973f, -0.002206f, -0.008799f, 0.012602f, -0.016536f, 0.000542f, -0.003921f, -0.025519f, -0.007649f, -0.003694f, 0.013920f, -0.012637f, 0.007018f, 0.005942f, 0.002672f, 0.001317f, 0.006079f, -0.006110f, 0.004866f, -0.003689f, 0.005394f, -0.001361f, 0.007943f, 0.002292f, 0.000747f, -0.004139f, -0.001461f, -0.009972f, 0.005410f, -0.001391f, 0.008536f, -0.008138f, 0.000053f, -0.000848f, 0.005116f, -0.000894f, 0.004578f, 0.001910f, 0.002523f, 0.002400f, 0.001341f, -0.005453f, 0.006369f, + 0.008016f, -0.004012f, -0.005781f, -0.006704f, -0.002809f, -0.000376f, -0.002435f, 0.000755f, -0.038426f, 0.025943f, 0.041640f, -0.031234f, -0.018603f, 0.008580f, 0.007471f, -0.006336f, 0.013683f, 0.003722f, -0.011642f, -0.014225f, -0.000291f, -0.004569f, -0.010157f, 0.005203f, -0.004668f, 0.000670f, 0.011520f, -0.015488f, 0.003267f, 0.002085f, -0.009195f, 0.001328f, -0.014606f, 0.002864f, 0.021459f, 0.010954f, -0.002140f, -0.006880f, -0.001749f, -0.012231f, -0.013025f, 0.006430f, 0.010862f, -0.003405f, -0.005990f, -0.004254f, 0.006504f, 0.010832f, 0.005206f, 0.019830f, -0.010643f, 0.008177f, -0.005119f, 0.001979f, 0.012379f, -0.004415f, -0.003888f, -0.023543f, -0.003590f, -0.018221f, 0.009203f, 0.006302f, 0.023503f, -0.020086f, -0.007391f, -0.019439f, -0.032028f, -0.005347f, 0.013403f, -0.022101f, 0.004941f, -0.002412f, -0.016125f, -0.019006f, -0.023979f, 0.032281f, 0.001248f, 0.019191f, 0.014108f, 0.016311f, -0.007331f, -0.021399f, -0.016201f, -0.020022f, 0.007046f, 0.015779f, -0.014994f, 0.007145f, 0.016816f, -0.011306f, 0.001959f, 0.013659f, 0.015673f, 0.003813f, -0.005564f, 0.006760f, + -0.002765f, 0.003637f, -0.016630f, -0.001466f, 0.006436f, -0.005594f, 0.002175f, 0.001101f, 0.000754f, 0.003796f, 0.006321f, -0.006527f, -0.002318f, 0.003897f, 0.005636f, 0.001645f, 0.002758f, 0.005544f, -0.001141f, 0.005986f, -0.004941f, 0.004126f, 0.006016f, 0.006746f, 0.000776f, -0.002444f, 0.005243f, -0.004160f, 0.001326f, -0.000878f, -0.003577f, -0.001704f, -0.003528f, -0.000882f, 0.001707f, -0.004318f, -0.012144f, 0.004383f, 0.006683f, -0.030059f, 0.021713f, -0.002735f, -0.011273f, 0.018595f, 0.006567f, -0.018109f, -0.025932f, -0.010019f, 0.000067f, 0.000529f, 0.001241f, -0.009245f, 0.029461f, 0.012210f, 0.008892f, 0.006801f, 0.009254f, -0.008971f, 0.002216f, 0.005854f, 0.004292f, 0.026472f, 0.002741f, -0.039455f, 0.004839f, 0.016416f, -0.014738f, -0.022184f, -0.004719f, -0.012047f, -0.007140f, 0.001845f, 0.027872f, 0.016706f, -0.002853f, -0.000642f, -0.008438f, -0.024432f, -0.008290f, -0.020181f, 0.014379f, 0.019709f, 0.000224f, -0.010948f, -0.004018f, -0.004526f, 0.009008f, 0.012550f, 0.013285f, -0.030775f, 0.005908f, 0.001067f, 0.002690f, 0.021406f, -0.012516f, 0.008770f, + -0.011424f, -0.008205f, 0.002231f, 0.014013f, 0.025179f, -0.003989f, -0.016329f, 0.005290f, -0.029373f, 0.023454f, 0.012629f, -0.002890f, -0.012148f, 0.006351f, -0.006803f, -0.014473f, -0.012072f, -0.013118f, -0.006290f, -0.002739f, 0.000872f, 0.012436f, -0.009502f, 0.034170f, 0.001420f, -0.005163f, 0.001957f, 0.010216f, 0.000459f, -0.000359f, 0.011074f, 0.007655f, 0.005713f, 0.000459f, -0.005371f, -0.004120f, -0.001277f, -0.000717f, -0.004954f, -0.013813f, 0.007339f, 0.007019f, -0.005232f, 0.001983f, -0.007685f, -0.005683f, -0.002651f, -0.001430f, -0.000192f, 0.012298f, -0.002506f, -0.003745f, -0.001971f, -0.000621f, 0.007519f, 0.013700f, -0.004427f, 0.007729f, -0.002044f, -0.008398f, 0.009856f, -0.009100f, -0.007426f, -0.004801f, -0.007494f, 0.001726f, 0.005819f, 0.003085f, 0.005967f, 0.000222f, -0.002197f, -0.000414f, -0.006056f, 0.003794f, -0.003456f, -0.013018f, -0.003185f, 0.014419f, -0.025835f, -0.007331f, 0.016726f, -0.021002f, -0.002155f, -0.002085f, -0.002797f, -0.024461f, 0.024320f, 0.010546f, -0.016926f, -0.002909f, -0.007254f, -0.006199f, -0.037172f, -0.005211f, -0.016979f, -0.041958f, + 0.008976f, 0.006500f, -0.019079f, -0.015778f, -0.022485f, -0.025601f, 0.021838f, 0.012326f, 0.022990f, 0.000824f, 0.048232f, 0.002278f, 0.025199f, 0.034672f, -0.004005f, 0.010608f, 0.035721f, -0.024044f, 0.011026f, -0.014484f, 0.024578f, -0.007705f, 0.047854f, 0.021750f, -0.014881f, -0.022483f, 0.003748f, 0.011103f, 0.019968f, 0.005376f, -0.017292f, -0.003979f, 0.015853f, 0.035563f, -0.014837f, 0.023854f, -0.008674f, 0.014562f, -0.027824f, 0.010999f, -0.015122f, 0.011018f, 0.001831f, 0.003676f, -0.005039f, 0.021984f, 0.030694f, -0.055740f, 0.016932f, 0.011621f, 0.008300f, -0.010163f, 0.007355f, -0.039989f, 0.003429f, 0.000718f, -0.006217f, -0.015274f, -0.013261f, -0.013211f, -0.003831f, 0.028538f, -0.016416f, -0.009645f, -0.023101f, 0.000850f, 0.020523f, -0.010265f, -0.011452f, 0.015890f, -0.000565f, 0.011542f, 0.002573f, -0.002814f, 0.000292f, 0.005098f, -0.011031f, 0.005603f, 0.002238f, -0.009487f, -0.007942f, -0.004635f, 0.002792f, 0.006441f, 0.006629f, 0.019345f, -0.002040f, 0.014655f, 0.007209f, 0.004782f, -0.009653f, -0.002997f, -0.014582f, -0.006579f, -0.002422f, -0.004880f, + -0.006918f, 0.008118f, 0.004711f, 0.009697f, 0.012426f, 0.002340f, -0.002795f, -0.001567f, -0.007931f, 0.004837f, 0.027791f, 0.029536f, -0.006442f, 0.030710f, -0.001576f, -0.006405f, 0.002427f, 0.017268f, -0.006465f, -0.007821f, -0.003586f, -0.021828f, 0.003585f, -0.006255f, 0.034388f, 0.022636f, -0.016389f, -0.017365f, -0.032645f, -0.011952f, 0.023710f, 0.042711f, -0.019436f, 0.013194f, 0.002863f, 0.005621f, 0.023270f, 0.016653f, -0.033444f, 0.006644f, -0.011938f, -0.006797f, -0.013795f, -0.007541f, -0.014559f, -0.032238f, 0.005653f, 0.021558f, 0.008270f, 0.050494f, -0.012269f, -0.006965f, 0.035088f, -0.012792f, -0.001950f, -0.007831f, 0.009301f, -0.038532f, -0.024722f, 0.013386f, 0.028830f, 0.042000f, 0.050142f, -0.036847f, -0.019107f, -0.001938f, 0.016780f, -0.001658f, 0.056894f, 0.015827f, 0.008513f, -0.044141f, 0.003074f, 0.000318f, 0.021354f, 0.027847f, -0.020744f, -0.006886f, 0.008717f, -0.009053f, 0.000011f, 0.031640f, 0.011429f, -0.031288f, 0.008177f, 0.016499f, -0.015009f, 0.049208f, -0.017005f, -0.026317f, -0.036926f, 0.027304f, -0.005897f, -0.031007f, -0.024562f, -0.005631f, + -0.001129f, -0.012339f, 0.000753f, -0.013433f, 0.002634f, -0.018702f, 0.001330f, 0.009136f, -0.006427f, 0.007195f, 0.001455f, -0.011311f, 0.001292f, -0.000179f, -0.002142f, 0.001206f, -0.007650f, 0.009290f, 0.000128f, -0.004743f, 0.010661f, 0.010787f, 0.000526f, -0.002977f, 0.004792f, -0.010167f, -0.004182f, -0.008169f, -0.001491f, 0.008391f, -0.006558f, 0.003672f, 0.008327f, -0.015292f, -0.005412f, -0.003153f, 0.002581f, -0.002891f, 0.006654f, 0.014807f, -0.004117f, -0.008852f, -0.004246f, 0.009562f, 0.002788f, 0.000900f, 0.007742f, -0.004445f, -0.003101f, -0.002791f, 0.006841f, 0.058331f, 0.027670f, -0.015324f, -0.004913f, -0.053820f, 0.004212f, 0.014248f, 0.003778f, 0.080286f, -0.010124f, -0.006074f, -0.035236f, -0.030467f, 0.012540f, -0.024911f, -0.015185f, -0.016705f, -0.011205f, 0.019950f, -0.012988f, -0.022902f, -0.019718f, 0.001794f, 0.020171f, -0.025900f, 0.005883f, 0.011719f, 0.002649f, 0.028972f, -0.003309f, 0.002280f, -0.029386f, -0.041433f, -0.017008f, 0.018996f, -0.022803f, 0.005554f, -0.019135f, -0.072339f, -0.038892f, 0.021695f, 0.001614f, -0.041448f, 0.006457f, 0.057757f, + -0.002601f, -0.001490f, -0.022481f, 0.012645f, -0.024814f, -0.044591f, 0.001194f, 0.006789f, -0.017236f, 0.008575f, 0.016860f, -0.004121f, -0.014511f, 0.012048f, 0.015688f, 0.028991f, -0.016595f, 0.021793f, 0.027988f, 0.011780f, 0.048620f, 0.005471f, -0.030100f, 0.035422f, 0.002223f, 0.005954f, -0.006364f, -0.007095f, 0.021964f, -0.021611f, -0.003011f, 0.053893f, 0.042342f, -0.026103f, 0.027143f, -0.007765f, 0.050091f, 0.021104f, -0.017216f, -0.039869f, -0.001618f, -0.014546f, -0.017205f, 0.011314f, -0.015486f, -0.000414f, -0.003863f, -0.013891f, -0.023236f, -0.004512f, 0.019930f, -0.021222f, 0.000266f, -0.013152f, 0.002185f, 0.008410f, -0.008453f, -0.024833f, -0.004224f, -0.011713f, 0.015343f, 0.009267f, -0.005892f, -0.016400f, -0.006662f, -0.017648f, 0.010868f, -0.008621f, 0.005996f, 0.007063f, 0.010377f, 0.008223f, -0.013582f, -0.009670f, -0.015279f, 0.004689f, 0.010164f, 0.001411f, 0.020021f, 0.021114f, 0.011634f, 0.008653f, -0.041907f, -0.044476f, -0.053132f, 0.073243f, -0.040553f, 0.009623f, -0.002246f, -0.023304f, 0.037196f, -0.043754f, 0.018923f, 0.077884f, 0.047947f, 0.011100f, + -0.063157f, -0.003576f, -0.041671f, -0.021169f, -0.038053f, -0.003646f, 0.010816f, -0.006883f, 0.029924f, -0.014417f, 0.004977f, 0.014760f, 0.041820f, 0.005784f, 0.005774f, 0.050583f, -0.033322f, -0.004759f, 0.022324f, -0.009802f, -0.025844f, -0.017213f, 0.025504f, -0.022274f, 0.010696f, 0.043288f, -0.012060f, -0.078161f, -0.004775f, 0.019509f, -0.095956f, 0.057854f, 0.044648f, -0.036451f, 0.059507f, 0.040282f, 0.026554f, 0.061677f, 0.001327f, 0.031660f, 0.003656f, 0.003677f, 0.022237f, -0.039309f, 0.039151f, 0.053114f, 0.040928f, -0.042318f, -0.008268f, 0.058378f, -0.028379f, 0.046269f, 0.042496f, 0.099260f, 0.059930f, 0.003321f, 0.006872f, -0.012946f, 0.012462f, 0.017202f, -0.057593f, -0.082520f, -0.028707f, 0.007054f, 0.003074f, -0.011964f, 0.064489f, 0.030280f, 0.012149f, -0.028486f, 0.025572f, -0.020228f, -0.025476f, -0.013150f, 0.029195f, 0.033873f, 0.006560f, -0.006268f, -0.006552f, 0.000869f, -0.039956f, -0.009616f, -0.010320f, 0.012766f, 0.007424f, -0.020897f, -0.015797f, -0.001139f, 0.031497f, -0.008954f, -0.012141f, 0.000655f, -0.012574f, -0.032104f, 0.015974f, -0.007075f, + -0.012489f, -0.018915f, 0.000110f, 0.010397f, 0.002085f, -0.056956f, -0.003218f, 0.027745f, -0.004248f, 0.000897f, 0.004669f, 0.007878f, 0.023799f, 0.018701f, 0.000831f, -0.000505f, -0.009141f, -0.003196f, 0.044722f, 0.055321f, -0.108540f, -0.099392f, 0.043350f, -0.028564f, -0.031302f, -0.013030f, -0.037828f, 0.013441f, -0.061279f, 0.077374f, 0.029089f, -0.032237f, -0.000693f, -0.031534f, -0.023718f, -0.025417f, -0.029101f, -0.018857f, -0.073918f, -0.066413f, -0.012390f, -0.015079f, 0.004225f, 0.006315f, 0.012851f, -0.004659f, 0.009428f, 0.012386f, 0.032888f, 0.036433f, -0.013742f, -0.018395f, -0.021573f, -0.018285f, -0.041833f, 0.062264f, -0.021990f, 0.015197f, 0.046221f, 0.043710f, -0.016591f, -0.018707f, -0.034834f, -0.022856f, -0.028605f, 0.047858f, 0.005088f, 0.005916f, -0.059220f, -0.020990f, 0.085568f, -0.008291f, 0.079662f, -0.016088f, -0.029868f, -0.018822f, -0.033763f, -0.034555f, -0.006359f, 0.000386f, -0.047541f, 0.003996f, 0.022694f, -0.001922f, 0.017832f, -0.109686f, -0.044350f, -0.030708f, 0.058226f, -0.013919f, 0.009565f, 0.019899f, 0.091420f, 0.025943f, -0.008452f, -0.009316f, + 0.078718f, 0.047561f, 0.011591f, 0.015362f, -0.004055f, 0.062519f, -0.026086f, -0.035655f, 0.019250f, 0.029384f, 0.052160f, 0.048549f, -0.028479f, 0.032947f, 0.024620f, 0.026550f, 0.007874f, -0.018987f, -0.037521f, -0.031840f, 0.019805f, 0.027477f, 0.014653f, 0.009876f, 0.032424f, -0.003206f, -0.009009f, -0.001865f, -0.002737f, 0.016893f, 0.010118f, 0.022047f, 0.038524f, 0.027209f, 0.044072f, 0.011897f, -0.039701f, 0.012578f, 0.010559f, 0.034461f, -0.000689f, 0.027001f, 0.011487f, 0.025965f, 0.000561f, -0.049892f, -0.006487f, -0.010977f, -0.003391f, -0.057345f, 0.119110f, -0.038461f, -0.023909f, 0.070588f, -0.044746f, -0.067564f, 0.062671f, -0.090950f, -0.026301f, 0.021442f, 0.015621f, -0.063441f, -0.024880f, 0.054459f, 0.000355f, -0.010731f, -0.035415f, 0.042745f, -0.042398f, 0.002812f, 0.033654f, -0.011227f, 0.030901f, 0.000222f, -0.015255f, 0.010352f, 0.007345f, -0.018421f, 0.029383f, -0.016163f, -0.006547f, 0.008777f, -0.000575f, 0.001830f, -0.005514f, 0.008726f, 0.018649f, 0.030145f, 0.043392f, 0.021286f, -0.017917f, -0.004996f, -0.027518f, 0.025443f, -0.009150f, -0.039760f, + 0.009342f, 0.000171f, -0.022651f, -0.054353f, 0.038279f, 0.002906f, -0.025153f, 0.061451f, 0.003538f, -0.019009f, -0.011082f, 0.091015f, -0.085129f, -0.091634f, 0.055886f, 0.087241f, -0.160943f, 0.000798f, -0.059574f, -0.054076f, -0.023941f, 0.058579f, -0.045237f, 0.077520f, -0.010970f, -0.001899f, 0.104158f, -0.029396f, -0.080635f, 0.100138f, 0.117926f, -0.114513f, 0.128024f, -0.043124f, 0.003155f, 0.105853f, -0.035422f, -0.040486f, 0.029022f, 0.028465f, -0.013612f, -0.005329f, 0.019642f, 0.003933f, 0.002506f, -0.025169f, 0.034808f, 0.000227f, -0.002278f, 0.000693f, 0.004671f, 0.015755f, 0.009512f, -0.012668f, -0.013885f, 0.014675f, 0.034707f, -0.030017f, -0.027863f, -0.007447f, 0.036342f, -0.001229f, 0.019411f, -0.005219f, 0.008089f, 0.000203f, 0.008278f, -0.004084f, -0.006392f, -0.042880f, -0.018045f, 0.010835f, -0.015526f, -0.004249f, -0.015277f, -0.023120f, 0.036277f, 0.022777f, -0.063183f, 0.025313f, 0.032736f, -0.006317f, -0.000277f, -0.022137f, 0.032400f, 0.070874f, -0.033128f, -0.044900f, -0.012343f, 0.011250f, 0.072036f, 0.053810f, -0.018808f, -0.005732f, 0.022495f, 0.058620f, + -0.019526f, -0.003284f, 0.035953f, -0.046075f, -0.039618f, 0.031587f, -0.021036f, -0.015695f, -0.019373f, -0.001743f, -0.031918f, 0.002561f, 0.021880f, -0.013409f, 0.016896f, -0.015010f, -0.009442f, -0.009453f, -0.044148f, 0.006608f, -0.017886f, 0.027100f, 0.057784f, 0.003231f, 0.028791f, 0.023935f, 0.002192f, 0.010970f, 0.018072f, 0.061371f, -0.043402f, 0.029684f, 0.026044f, -0.031354f, 0.020997f, 0.020516f, 0.006509f, -0.027821f, -0.055755f, -0.056316f, 0.018571f, 0.020263f, -0.021304f, -0.094149f, 0.076584f, -0.025750f, -0.041287f, -0.023795f, 0.077038f, -0.036205f, 0.084247f, 0.000045f, 0.028288f, -0.079278f, 0.074953f, -0.034310f, 0.033198f, -0.010114f, -0.108541f, -0.034170f, 0.021361f, -0.067008f, 0.068917f, 0.007432f, -0.099514f, -0.111855f, -0.057583f, 0.077796f, 0.019197f, -0.069428f, 0.084657f, -0.091041f, -0.004494f, 0.164447f, 0.024597f, 0.009366f, 0.016342f, 0.012483f, -0.043167f, 0.044961f, 0.003327f, 0.022983f, -0.028975f, 0.043218f, -0.023875f, -0.022738f, -0.019072f, -0.002409f, -0.001195f, 0.013100f, -0.004344f, -0.006340f, 0.008475f, -0.015045f, -0.031151f, 0.028344f, + -0.010467f, -0.004861f, -0.036965f, 0.016898f, 0.008202f, 0.016038f, 0.004385f, 0.018504f, -0.013724f, 0.004369f, 0.051122f, -0.005946f, 0.000532f, 0.027106f, -0.029065f, -0.006119f, 0.001494f, -0.002908f, 0.019881f, -0.020566f, 0.022321f, -0.007808f, -0.057816f, 0.003736f, -0.015120f, 0.016997f, -0.019244f, 0.022361f, -0.035900f, -0.068619f, 0.000289f, -0.072891f, 0.020012f, -0.006514f, -0.013036f, 0.024346f, 0.040265f, -0.025843f, 0.005785f, 0.044223f, -0.034668f, 0.059989f, -0.007999f, -0.066041f, 0.056646f, -0.027267f, -0.012108f, 0.050415f, -0.064608f, 0.017017f, 0.001107f, 0.023431f, -0.010140f, -0.023737f, -0.098607f, 0.022604f, -0.040691f, -0.099078f, 0.119763f, -0.080633f, -0.033569f, -0.016021f, -0.027247f, -0.060864f, 0.034163f, 0.082631f, -0.051133f, 0.023183f, -0.074179f, -0.041985f, -0.042257f, 0.037337f, 0.006745f, 0.108433f, -0.018637f, -0.009060f, -0.032333f, -0.093558f, 0.000128f, 0.045469f, -0.034554f, 0.038166f, 0.045936f, -0.038757f, 0.003893f, -0.033052f, -0.138167f, -0.072503f, -0.042506f, -0.145214f, 0.092842f, 0.122263f, 0.057538f, -0.123129f, -0.098939f, -0.220876f, + 0.031964f, 0.262570f, 0.121486f, 0.046387f, -0.069000f, -0.242265f, -0.055000f, 0.056084f, 0.165619f, 0.166051f, -0.112818f, -0.095462f, -0.044304f, 0.021670f, 0.011466f, 0.180391f, 0.003058f, -0.021986f, 0.014710f, -0.017883f, -0.044021f, 0.063461f, 0.011418f, -0.013608f, 0.035143f, -0.028772f, -0.049102f, 0.034832f, 0.030166f, -0.083659f, 0.056372f, -0.012516f, -0.018409f, -0.044573f, 0.047348f, -0.045037f, 0.054189f, -0.026652f, 0.055464f, -0.065379f, 0.026175f, -0.018273f, 0.000880f, 0.047268f, 0.077321f, 0.021907f, -0.028723f, -0.020426f, -0.004808f, 0.042733f, -0.006824f, 0.061447f, -0.048050f, -0.037822f, 0.017686f, 0.060915f, 0.007165f, 0.037139f, -0.103956f, 0.075413f, -0.014800f, -0.016509f, 0.001872f, 0.033964f, 0.000644f, -0.006508f, 0.025132f, 0.008641f, 0.008371f, 0.040066f, -0.025391f, -0.000283f, 0.020806f, -0.007255f, -0.003782f, 0.025262f, -0.023457f, -0.005694f, 0.007105f, 0.039710f, -0.026255f, -0.018639f, 0.022230f, -0.001056f, 0.012478f, -0.039348f, 0.051600f, -0.012309f, 0.017411f, -0.011288f, 0.006645f, 0.028109f, 0.012372f, -0.006621f, 0.024189f, -0.009234f, + 0.024448f, -0.019294f, -0.001447f, 0.025210f, -0.005821f, -0.010530f, -0.050951f, 0.005127f, 0.039371f, 0.004078f, 0.018449f, -0.025839f, -0.008192f, -0.015497f, -0.016209f, -0.006705f, 0.028479f, -0.010464f, 0.017352f, -0.022515f, -0.026829f, -0.011582f, 0.006369f, 0.052016f, -0.019991f, 0.023611f, 0.001556f, 0.005102f, -0.025474f, 0.013832f, 0.027032f, 0.001370f, -0.024628f, 0.018938f, -0.016414f, 0.012664f, -0.010018f, -0.007339f, -0.009585f, 0.003435f, 0.018959f, -0.009652f, -0.004875f, 0.008673f, -0.001143f, -0.014510f, -0.003093f, 0.014050f, 0.012002f, -0.012598f, 0.002113f, 0.012829f, 0.000525f, -0.007970f, 0.002076f, -0.012680f, 0.009408f, -0.000885f, 0.004804f, -0.005815f, 0.002444f, 0.008132f, -0.004124f, 0.009546f, 0.001833f, 0.008698f, 0.006701f, -0.014314f, -0.014445f, -0.004984f, 0.025218f, -0.016158f, 0.017515f, 0.013938f, -0.010265f, -0.026144f, 0.019732f, -0.016817f, 0.022296f, -0.002171f, -0.003724f, -0.009266f, 0.003697f, 0.003631f, -0.001380f, -0.003060f, 0.001869f, 0.098955f, 0.019685f, -0.053078f, -0.037654f, -0.058621f, -0.018549f, 0.011244f, 0.031150f, -0.009754f, + -0.012544f, -0.010869f, -0.010406f, -0.009908f, 0.014258f, -0.007258f, -0.001952f, -0.003173f, -0.010272f, -0.002502f, 0.015672f, 0.002198f, -0.004481f, -0.015666f, 0.017982f, -0.023309f, 0.013722f, -0.008353f, -0.022790f, 0.000052f, 0.010458f, 0.011663f, 0.009213f, -0.013539f, 0.003059f, -0.004375f, -0.007334f, 0.027452f, -0.024434f, -0.004521f, -0.000938f, -0.001745f, 0.002639f, -0.004151f, -0.014323f, 0.012055f, -0.022734f, 0.021688f, -0.003118f, -0.015328f, 0.005345f, -0.007935f, 0.019416f, -0.011370f, -0.006765f, 0.020828f, -0.018639f, 0.006455f, -0.008879f, -0.002115f, 0.016101f, -0.011496f, -0.004462f, 0.014303f, -0.009767f, 0.003723f, 0.001569f, -0.011714f, 0.028452f, -0.024823f, -0.002019f, 0.010864f, -0.006204f, 0.018071f, -0.008122f, -0.004049f, 0.004841f, 0.005934f, -0.001854f, 0.003971f, -0.001503f, -0.008076f, 0.007305f, -0.000049f, 0.000807f, 0.003909f, -0.000412f, 0.005618f, -0.005604f, 0.001623f, 0.001242f, 0.001236f, -0.000598f, -0.003564f, 0.004733f, -0.000700f, -0.001115f, -0.003381f, 0.004197f, 0.006634f, -0.002155f, -0.003445f, 0.002185f, 0.003866f, -0.004806f, 0.004036f, + -0.003600f, -0.003223f, 0.010778f, -0.001661f, 0.004044f, 0.005599f, -0.007280f, 0.018131f, -0.005859f, -0.000975f, -0.000813f, -0.010500f, 0.010945f, -0.006792f, -0.010758f, -0.046850f, -0.070402f, 0.092275f, 0.287858f, 0.024648f, 0.025062f, -0.196236f, -0.248225f, -0.051718f, -0.052574f, 0.146219f, 0.248871f, 0.127710f, 0.024587f, -0.090046f, -0.175216f, -0.123678f, -0.088425f, -0.004587f, 0.121251f, 0.177180f, 0.095755f, 0.021943f, -0.062117f, -0.110414f, -0.061825f, -0.059484f, -0.055709f, 0.035214f, 0.072193f, 0.071154f, 0.071684f, 0.017237f, -0.031071f, -0.012749f, -0.047225f, -0.073929f, -0.008188f, -0.022043f, -0.014917f, 0.066759f, 0.038575f, 0.055773f, 0.033829f, -0.025281f, -0.060833f, -0.014648f, -0.039538f, -0.006104f, 0.027659f, 0.008480f, 0.014946f, 0.030173f, -0.015290f, -0.021399f, -0.004924f, -0.012571f, 0.012179f, 0.019484f, 0.001060f, 0.024052f, 0.014272f, -0.025239f, -0.024281f, -0.038691f, -0.033089f, 0.001476f, 0.039927f, 0.060522f, 0.029154f, 0.007661f, -0.014064f, -0.040502f, -0.006948f, -0.045669f, -0.028021f, 0.021514f, 0.016876f, 0.051167f, 0.017238f, -0.013013f, + 0.015077f, -0.026516f, -0.046022f, 0.008109f, 0.011674f, 0.015439f, 0.014265f, -0.002873f, -0.005751f, -0.004396f, -0.019136f, -0.014660f, 0.010037f, 0.015621f, 0.015705f, 0.015940f, -0.004416f, -0.015398f, -0.010210f, -0.005910f, 0.000407f, -0.000317f, -0.017424f, 0.004465f, 0.021938f, 0.011842f, 0.013651f, -0.004064f, -0.022082f, -0.012826f, -0.013039f, 0.005099f, 0.015479f, 0.010215f, 0.009560f, 0.004140f, -0.003168f, -0.016748f, -0.022071f, -0.010101f, 0.001340f, 0.013636f, 0.021746f, 0.013319f, 0.013396f, 0.008458f, -0.013860f, -0.025697f, -0.032994f, -0.021388f, 0.009194f, 0.018457f, 0.023937f, 0.033222f, 0.010066f, -0.010005f, -0.016845f, -0.013658f, -0.010169f, -0.009592f, -0.009776f, -0.002875f, 0.007341f, 0.014590f, 0.012818f, 0.010056f, 0.006927f, 0.001490f, -0.009461f, -0.016307f, -0.015792f, -0.008083f, -0.000509f, 0.005885f, 0.005922f, 0.003451f, 0.000632f, 0.000498f, -0.000173f}, + {0.002348f, 0.006368f, 0.005018f, -0.001687f, 0.003852f, 0.001794f, 0.011038f, -0.001952f, -0.000264f, 0.001356f, 0.008087f, -0.001625f, -0.008375f, -0.003941f, -0.008038f, 0.001932f, -0.002842f, -0.000709f, -0.000989f, 0.001913f, 0.000809f, 0.001602f, 0.004705f, 0.008555f, -0.003788f, -0.002150f, 0.001746f, -0.004093f, -0.000529f, 0.006665f, -0.003610f, 0.008247f, 0.000885f, -0.003013f, 0.005534f, -0.007552f, -0.001893f, -0.005274f, 0.007377f, -0.000260f, -0.002680f, -0.002039f, 0.000121f, 0.006785f, 0.000309f, 0.008175f, 0.003190f, -0.006796f, 0.005504f, -0.002995f, -0.005011f, -0.004164f, 0.005656f, -0.001214f, 0.017952f, 0.001860f, 0.004539f, 0.003219f, -0.008317f, 0.000083f, -0.001198f, 0.002145f, -0.004708f, -0.003246f, 0.009371f, 0.007610f, 0.000726f, 0.003140f, -0.000822f, 0.004722f, -0.007671f, 0.000748f, 0.005818f, 0.003609f, 0.000621f, -0.000631f, 0.004155f, -0.006571f, -0.002981f, 0.006924f, -0.004544f, 0.001447f, 0.003418f, 0.004082f, 0.001294f, -0.005258f, -0.003455f, 0.002723f, 0.000636f, 0.002700f, -0.000802f, 0.000756f, -0.002583f, -0.000177f, -0.001274f, -0.000797f, + 0.001513f, 0.002836f, 0.001230f, -0.001692f, -0.000623f, -0.001153f, 0.000698f, 0.001726f, -0.001015f, 0.001268f, 0.000970f, 0.001798f, -0.000239f, 0.002163f, -0.000868f, 0.000525f, 0.001360f, 0.001691f, -0.013665f, -0.012346f, -0.007671f, -0.006998f, -0.006051f, 0.002319f, 0.008636f, 0.017581f, 0.003383f, 0.004532f, -0.000025f, -0.012555f, -0.005242f, -0.004664f, -0.011264f, 0.017547f, 0.004678f, 0.006970f, 0.004833f, -0.003880f, 0.001803f, 0.016802f, 0.006723f, -0.003951f, -0.000306f, -0.004073f, 0.000372f, -0.007773f, 0.004698f, -0.002448f, -0.003463f, 0.000671f, 0.008951f, 0.000951f, 0.003139f, 0.005603f, 0.007766f, -0.013860f, 0.000207f, 0.003534f, 0.008100f, 0.012416f, -0.006871f, -0.001386f, -0.003311f, 0.010361f, 0.005637f, 0.006688f, -0.001069f, 0.003112f, 0.020727f, -0.013050f, 0.002660f, 0.001240f, -0.008697f, 0.003745f, -0.012165f, -0.001618f, 0.003177f, -0.002616f, -0.018360f, 0.005189f, 0.001321f, -0.004948f, -0.005051f, -0.000822f, -0.002716f, 0.006247f, -0.005784f, -0.002554f, 0.001869f, -0.000162f, -0.005623f, -0.000241f, 0.004715f, -0.007673f, 0.000746f, -0.002068f, + -0.001784f, -0.002364f, -0.001292f, 0.001212f, -0.004426f, -0.003349f, 0.000737f, -0.002653f, -0.003483f, -0.003620f, -0.001179f, -0.002391f, 0.004547f, -0.003902f, -0.001035f, 0.000672f, 0.002328f, -0.000220f, 0.000236f, -0.001333f, 0.000357f, -0.002321f, 0.001864f, -0.003330f, 0.018464f, 0.001703f, 0.006573f, -0.000700f, -0.005058f, 0.000469f, 0.012947f, 0.006737f, 0.008324f, 0.013536f, -0.006034f, 0.000204f, 0.012990f, 0.004248f, 0.005657f, 0.000811f, 0.001520f, 0.007729f, -0.007026f, -0.001978f, 0.009633f, -0.006554f, 0.003708f, 0.005600f, -0.004239f, 0.004133f, 0.012944f, -0.006116f, 0.004719f, 0.001100f, 0.000409f, 0.000232f, -0.002815f, -0.008833f, -0.002858f, -0.007391f, -0.000889f, 0.003184f, 0.006139f, 0.006667f, -0.001296f, -0.011098f, -0.001133f, 0.016364f, -0.006157f, 0.003357f, -0.003043f, -0.017081f, 0.009896f, 0.002585f, 0.007314f, -0.001177f, 0.008344f, 0.008323f, -0.014720f, 0.005897f, 0.000308f, 0.005540f, -0.001221f, -0.010159f, -0.000632f, -0.001369f, -0.002027f, -0.001854f, 0.006380f, 0.000046f, 0.001123f, 0.013325f, 0.002412f, 0.010611f, 0.000183f, 0.001105f, + 0.001859f, -0.005694f, -0.009258f, 0.006314f, -0.007047f, 0.004181f, 0.002392f, -0.000270f, 0.004174f, -0.004508f, -0.002782f, 0.003003f, -0.000017f, -0.008697f, 0.002663f, 0.001129f, 0.000968f, -0.001687f, 0.003640f, 0.000455f, -0.001695f, 0.004337f, -0.001144f, -0.000275f, -0.003711f, 0.001356f, -0.001942f, 0.000703f, -0.000153f, -0.000430f, 0.000666f, -0.001251f, 0.002110f, 0.000622f, -0.001087f, 0.000756f, -0.000727f, 0.000343f, -0.000293f, -0.001317f, 0.030346f, 0.017074f, 0.025962f, 0.008446f, -0.010795f, 0.005534f, -0.004849f, 0.000748f, 0.002496f, -0.022134f, -0.005934f, -0.006084f, 0.005689f, 0.008719f, -0.003620f, -0.000496f, 0.002892f, 0.000715f, 0.015818f, -0.001736f, -0.016660f, 0.005426f, -0.009649f, 0.007397f, 0.008388f, 0.006733f, 0.009777f, -0.002353f, -0.003435f, 0.003990f, -0.002983f, -0.003860f, 0.002786f, -0.002577f, 0.005850f, 0.008442f, -0.003687f, -0.012798f, 0.004083f, -0.012449f, -0.008062f, -0.001568f, -0.025942f, 0.000252f, -0.004416f, 0.010153f, 0.009645f, 0.004678f, 0.015822f, 0.015960f, 0.007029f, 0.003549f, -0.001201f, 0.000769f, 0.000855f, -0.007250f, + 0.014773f, -0.001988f, 0.005107f, -0.004712f, -0.005696f, -0.002052f, -0.008514f, 0.007455f, -0.003963f, -0.003150f, 0.014486f, -0.012123f, -0.003761f, 0.003060f, -0.005598f, -0.001701f, -0.000493f, 0.005073f, 0.005966f, 0.004016f, 0.010303f, -0.003411f, -0.002861f, -0.001526f, -0.006557f, 0.003418f, 0.006603f, 0.009101f, -0.000208f, -0.001405f, -0.001976f, 0.000087f, 0.001933f, 0.001899f, -0.002774f, 0.003009f, -0.000071f, 0.002162f, 0.001828f, -0.000397f, -0.000750f, 0.003893f, -0.001160f, 0.001953f, 0.001584f, 0.001794f, 0.001594f, -0.001150f, 0.001443f, 0.006593f, -0.000517f, 0.000301f, 0.000754f, 0.004859f, 0.000853f, -0.001124f, -0.003501f, -0.011560f, -0.026610f, -0.009519f, -0.002764f, 0.003766f, -0.003286f, 0.008038f, -0.001750f, 0.012989f, -0.011699f, 0.006855f, -0.002871f, 0.023910f, 0.010075f, -0.005299f, -0.010225f, 0.005474f, -0.014562f, -0.007888f, 0.005674f, -0.005230f, -0.008666f, 0.016501f, 0.006964f, -0.001051f, -0.007606f, -0.010464f, 0.007087f, 0.005304f, 0.005308f, -0.000564f, -0.002516f, -0.006514f, 0.009828f, -0.012858f, -0.005395f, -0.000714f, 0.009131f, 0.006807f, + -0.000575f, 0.009860f, 0.001339f, -0.004803f, 0.002114f, -0.004785f, -0.004763f, -0.005757f, 0.007121f, -0.005296f, -0.000077f, 0.009162f, 0.013980f, 0.014076f, 0.005921f, 0.004896f, -0.000822f, 0.007909f, -0.003128f, 0.011436f, -0.001900f, 0.007239f, 0.005808f, -0.004915f, 0.000714f, -0.005371f, 0.005755f, 0.004768f, 0.002096f, -0.001938f, -0.009609f, 0.006729f, -0.010467f, -0.001418f, -0.011335f, 0.004076f, -0.000711f, -0.001235f, 0.002323f, -0.009872f, 0.000595f, 0.002406f, 0.015965f, 0.005006f, 0.002816f, 0.003626f, 0.006327f, 0.002597f, 0.003364f, -0.004836f, 0.003714f, 0.002569f, -0.006313f, -0.000670f, 0.000523f, 0.001259f, 0.002949f, -0.003322f, 0.002236f, -0.002195f, 0.000629f, -0.000517f, 0.004183f, 0.000296f, 0.000693f, 0.000357f, 0.001538f, -0.000956f, 0.003817f, -0.002104f, 0.001556f, 0.001284f, 0.003689f, 0.001539f, 0.005045f, -0.003629f, 0.002005f, -0.000950f, 0.005788f, 0.002022f, 0.002195f, -0.000845f, -0.000579f, 0.000316f, -0.000884f, -0.003766f, -0.012385f, -0.026109f, -0.021027f, 0.001283f, -0.017964f, -0.008892f, -0.025454f, -0.013597f, -0.015509f, 0.006146f, + -0.008280f, -0.011071f, -0.003766f, 0.000570f, -0.006540f, -0.024778f, 0.006655f, -0.004414f, 0.002495f, -0.011239f, 0.011174f, 0.004097f, 0.000260f, -0.010006f, -0.004432f, 0.012619f, 0.008639f, 0.000517f, -0.001882f, -0.008541f, 0.005300f, 0.002700f, 0.005487f, -0.010219f, -0.000946f, -0.008312f, -0.007414f, -0.008134f, 0.000838f, 0.016352f, -0.013384f, 0.000234f, -0.012752f, 0.001250f, 0.005929f, 0.007385f, -0.013449f, 0.013462f, 0.016405f, -0.005472f, -0.003915f, -0.002928f, -0.000660f, 0.005154f, 0.006611f, 0.001575f, 0.004492f, -0.008069f, -0.001573f, -0.003041f, 0.014104f, -0.004495f, 0.015609f, -0.000474f, -0.004821f, 0.012395f, -0.001328f, -0.007537f, 0.002638f, 0.013433f, 0.015530f, -0.001249f, -0.004904f, -0.008558f, 0.005325f, -0.011397f, -0.001161f, 0.007485f, -0.005837f, 0.003322f, -0.000445f, -0.000161f, -0.004706f, 0.000009f, -0.003662f, -0.005756f, -0.000631f, 0.004691f, 0.002475f, 0.004671f, -0.002196f, -0.001645f, -0.003882f, 0.001390f, -0.003153f, 0.004863f, 0.002455f, 0.006834f, 0.000581f, -0.001725f, -0.000697f, -0.001337f, -0.002541f, 0.003071f, -0.002262f, -0.001362f, + 0.001211f, 0.000956f, -0.003516f, -0.001304f, 0.000814f, -0.000007f, -0.001993f, -0.003424f, -0.000317f, -0.003168f, -0.002225f, -0.001396f, 0.003876f, -0.000411f, 0.001256f, 0.001080f, 0.000037f, -0.002509f, -0.000855f, -0.020203f, -0.019987f, -0.023211f, 0.006868f, -0.018808f, -0.007749f, 0.017974f, 0.008850f, -0.020408f, -0.001308f, 0.000148f, 0.009007f, 0.013260f, 0.022800f, -0.006201f, -0.008110f, -0.022403f, -0.027374f, -0.016262f, -0.005455f, 0.011138f, -0.011065f, 0.005334f, -0.015743f, 0.016385f, -0.011796f, 0.013148f, -0.006053f, 0.001799f, 0.003515f, -0.002705f, -0.011631f, 0.018490f, -0.015935f, -0.000865f, -0.008466f, 0.002211f, -0.009875f, 0.002230f, -0.040018f, 0.000588f, 0.018746f, -0.023930f, 0.005539f, 0.016241f, 0.005947f, -0.012497f, -0.001288f, 0.019561f, -0.024093f, -0.000153f, 0.010003f, 0.009426f, 0.009411f, -0.003567f, -0.003395f, -0.015721f, -0.007655f, 0.006335f, 0.010787f, 0.016921f, 0.020845f, -0.030608f, 0.011730f, -0.009293f, 0.002354f, -0.021605f, -0.008634f, 0.017646f, 0.004449f, 0.002355f, -0.011702f, -0.000068f, 0.011557f, 0.008239f, 0.005226f, -0.010741f, + -0.006763f, 0.011013f, -0.002820f, -0.004785f, -0.002272f, -0.007931f, 0.006819f, -0.001382f, -0.006071f, -0.002463f, -0.001996f, 0.001512f, -0.003876f, -0.004355f, 0.001609f, 0.001425f, 0.001844f, -0.002523f, -0.003406f, 0.002932f, -0.002127f, -0.008203f, -0.000575f, -0.002514f, 0.005054f, -0.003864f, 0.000397f, 0.000285f, 0.002109f, -0.005181f, -0.002705f, -0.001944f, 0.000687f, 0.005272f, -0.000482f, -0.001399f, 0.003469f, -0.000057f, 0.003415f, -0.001662f, -0.003457f, -0.001485f, -0.005966f, 0.001258f, 0.000105f, -0.004387f, 0.002440f, 0.023901f, 0.040019f, 0.022176f, 0.026104f, 0.003910f, 0.009302f, 0.034993f, -0.001047f, 0.000992f, 0.024042f, -0.011786f, 0.000108f, 0.006843f, 0.012011f, 0.019736f, -0.016056f, -0.023022f, 0.012712f, 0.006978f, -0.013284f, 0.002807f, 0.008243f, -0.005168f, 0.004759f, -0.012417f, -0.002743f, -0.014493f, 0.004496f, 0.015690f, 0.004947f, 0.013739f, 0.010713f, 0.011172f, -0.027260f, 0.001386f, 0.031848f, -0.003828f, -0.000512f, 0.029586f, -0.003849f, -0.001090f, 0.004446f, -0.003947f, -0.000813f, 0.016361f, 0.025820f, -0.025347f, -0.004068f, 0.005015f, + -0.007711f, 0.011914f, -0.003965f, 0.001142f, 0.001935f, -0.005549f, 0.022739f, -0.002935f, -0.008203f, 0.008472f, -0.008508f, -0.014176f, 0.004939f, 0.015431f, 0.005901f, -0.001740f, 0.003190f, 0.014767f, 0.007784f, 0.013229f, 0.004056f, 0.001632f, -0.000092f, -0.013010f, -0.002631f, -0.010194f, -0.002271f, -0.004286f, -0.023091f, -0.010034f, 0.001552f, 0.014924f, -0.006077f, 0.005768f, -0.003910f, -0.012244f, 0.005491f, 0.001329f, -0.003835f, 0.001923f, -0.007398f, 0.000376f, 0.001912f, 0.004579f, 0.006572f, -0.001554f, 0.004255f, -0.005613f, -0.008268f, -0.009956f, -0.000998f, 0.009023f, -0.001571f, -0.000702f, 0.003069f, 0.000501f, 0.001052f, 0.004863f, -0.002296f, -0.000890f, -0.002594f, 0.006992f, 0.000219f, -0.001029f, 0.000877f, -0.001758f, -0.003667f, -0.004464f, 0.001905f, 0.003977f, 0.004997f, 0.002736f, 0.002015f, -0.000861f, -0.000262f, 0.000086f, -0.001557f, -0.006863f, 0.067447f, 0.009351f, -0.001439f, -0.000408f, -0.032369f, -0.009469f, 0.003126f, -0.007550f, 0.014284f, 0.006284f, 0.023152f, -0.002947f, 0.000038f, -0.004994f, -0.009785f, 0.015532f, 0.002922f, 0.005943f, + 0.008723f, 0.012160f, -0.011433f, -0.011515f, -0.013308f, -0.009262f, -0.007623f, -0.003341f, -0.018283f, -0.003587f, 0.029530f, 0.013922f, -0.005616f, -0.001995f, -0.003470f, 0.002466f, 0.010461f, -0.005114f, 0.042199f, -0.007334f, -0.001148f, -0.019152f, 0.007655f, 0.018411f, -0.003165f, -0.014092f, -0.001828f, 0.007093f, 0.014133f, 0.006106f, 0.019867f, 0.029676f, 0.009668f, -0.000630f, 0.017628f, 0.014403f, 0.005385f, 0.011133f, -0.036988f, 0.008588f, 0.000978f, -0.032726f, 0.012023f, -0.000763f, -0.014101f, 0.009229f, -0.014954f, -0.014548f, 0.017359f, 0.013662f, -0.007710f, -0.028953f, -0.013105f, 0.006965f, -0.016645f, -0.003385f, 0.007282f, 0.028459f, -0.004611f, 0.005764f, -0.014826f, -0.031241f, -0.016781f, -0.014962f, -0.006782f, 0.014948f, 0.002046f, -0.010353f, -0.003140f, -0.006446f, -0.006303f, 0.009573f, 0.007954f, 0.003093f, 0.006794f, 0.008084f, -0.006776f, -0.004952f, -0.005033f, 0.001117f, -0.005520f, -0.008177f, -0.007962f, 0.003500f, -0.002696f, -0.001137f, 0.001137f, 0.002994f, -0.006760f, 0.003888f, -0.001450f, -0.000768f, -0.002991f, -0.001046f, -0.004248f, 0.010719f, + -0.006579f, -0.002243f, 0.001902f, -0.006792f, -0.006590f, -0.004964f, 0.000418f, 0.005487f, -0.035747f, 0.022513f, -0.004142f, -0.023097f, -0.000915f, 0.020941f, -0.023959f, -0.005090f, -0.019317f, 0.012768f, 0.004154f, -0.007155f, -0.008225f, -0.003009f, 0.012863f, 0.009786f, 0.005525f, 0.013325f, 0.011748f, 0.001137f, 0.014187f, 0.016212f, 0.006734f, 0.008939f, -0.016591f, -0.008195f, -0.011552f, 0.010185f, 0.013384f, 0.004695f, 0.004140f, -0.007963f, -0.005771f, -0.004920f, -0.004281f, -0.014190f, 0.012899f, 0.002858f, 0.000838f, -0.015185f, -0.004505f, 0.023841f, -0.017248f, -0.018522f, -0.028230f, 0.009738f, -0.021174f, 0.030602f, 0.035550f, 0.024364f, 0.014336f, 0.001234f, 0.027787f, -0.014835f, 0.021838f, -0.002992f, -0.015583f, 0.000997f, 0.001271f, -0.033591f, -0.014884f, 0.012383f, 0.001908f, -0.005831f, 0.005044f, 0.027868f, 0.019169f, -0.032404f, -0.008163f, -0.000669f, -0.000867f, 0.009099f, 0.013704f, -0.000851f, -0.025861f, 0.010192f, -0.015016f, -0.048147f, -0.013970f, -0.009969f, 0.014858f, 0.023990f, 0.008153f, 0.000985f, 0.001215f, 0.000507f, 0.002138f, 0.017017f, + 0.000040f, 0.002336f, 0.002197f, 0.008481f, -0.015276f, -0.001041f, 0.004663f, 0.011144f, 0.013681f, 0.004620f, 0.008114f, 0.011902f, 0.015981f, 0.020402f, 0.007858f, 0.009980f, 0.010063f, 0.000271f, -0.000963f, -0.003982f, -0.002568f, -0.000137f, 0.004188f, -0.012312f, -0.003007f, 0.006789f, 0.011292f, -0.001461f, 0.003155f, -0.001798f, 0.004732f, -0.000174f, 0.007237f, -0.001425f, 0.006939f, -0.005437f, 0.008892f, -0.000083f, 0.008398f, -0.029980f, 0.002988f, 0.003334f, 0.018752f, 0.004039f, 0.047910f, 0.007625f, -0.019774f, -0.006400f, -0.016650f, 0.030273f, -0.038840f, -0.003473f, 0.026846f, -0.058670f, -0.023155f, -0.019802f, -0.020512f, -0.038916f, 0.003677f, -0.006826f, -0.016691f, -0.002132f, 0.018405f, 0.002311f, 0.002439f, -0.011484f, 0.004561f, -0.003890f, 0.004533f, 0.000017f, 0.002908f, 0.015002f, -0.003649f, -0.000936f, 0.030527f, -0.019753f, -0.003980f, 0.005268f, 0.026293f, -0.013813f, 0.037544f, -0.011374f, -0.015171f, -0.032152f, -0.041831f, -0.012211f, -0.031136f, 0.015180f, -0.009450f, -0.023383f, 0.003189f, 0.003770f, 0.017219f, 0.014560f, 0.006085f, -0.002966f, + 0.053135f, 0.029402f, -0.003359f, 0.005177f, 0.018194f, 0.013598f, 0.008835f, -0.007202f, -0.001041f, -0.009542f, -0.012392f, -0.011467f, 0.008006f, 0.041436f, -0.028978f, -0.007103f, -0.016505f, 0.029859f, -0.007873f, 0.009249f, -0.004266f, 0.014017f, -0.032822f, -0.024552f, -0.008481f, 0.013943f, 0.004416f, 0.012039f, -0.007266f, 0.007425f, 0.011229f, 0.009861f, 0.004673f, -0.001963f, -0.014007f, 0.008811f, 0.003283f, -0.011886f, -0.008346f, 0.007434f, -0.007826f, -0.005924f, -0.000260f, 0.008005f, -0.007457f, 0.009647f, -0.006056f, 0.013782f, -0.007689f, 0.001542f, 0.004793f, 0.002507f, -0.006663f, -0.012594f, 0.009742f, -0.003783f, -0.002853f, -0.000984f, -0.001335f, -0.003981f, 0.009236f, 0.011556f, 0.007995f, 0.007071f, -0.001403f, 0.004079f, 0.013233f, -0.007149f, 0.005211f, 0.002304f, -0.000346f, 0.002922f, -0.000893f, 0.000718f, -0.004832f, -0.023885f, -0.022960f, 0.012946f, -0.010295f, -0.043007f, 0.021295f, -0.012811f, 0.017004f, -0.012359f, 0.021403f, 0.014602f, 0.017792f, 0.028540f, 0.004601f, 0.024155f, 0.009676f, 0.006266f, 0.016353f, 0.005692f, 0.004462f, 0.001212f, + -0.000717f, -0.015284f, 0.013621f, -0.031076f, 0.013581f, 0.003302f, -0.008954f, -0.016721f, -0.000479f, 0.012086f, -0.013937f, -0.005748f, -0.020821f, -0.007991f, -0.025622f, 0.001683f, 0.014038f, -0.000190f, -0.003358f, -0.016165f, -0.028286f, -0.020438f, 0.022035f, 0.007448f, -0.009243f, -0.016145f, -0.004017f, -0.001213f, -0.027655f, 0.023471f, 0.021240f, -0.027108f, -0.026473f, -0.043220f, -0.006633f, -0.051727f, 0.013925f, 0.020291f, 0.010582f, -0.003120f, -0.006656f, -0.005237f, 0.021233f, 0.021627f, 0.024775f, -0.016035f, -0.012890f, 0.016726f, -0.007205f, -0.007606f, -0.030431f, 0.013639f, 0.024793f, 0.028581f, -0.006739f, 0.015725f, -0.008785f, 0.004835f, 0.015516f, 0.008187f, -0.010998f, 0.005315f, -0.018801f, -0.011249f, -0.007821f, 0.002967f, 0.007884f, 0.006979f, -0.007472f, -0.006627f, -0.002809f, -0.008216f, -0.001697f, -0.011387f, -0.014468f, -0.007370f, -0.006052f, -0.004214f, -0.001960f, -0.003982f, -0.005775f, 0.001485f, -0.000302f, 0.008596f, -0.002932f, 0.010922f, -0.002851f, 0.008775f, 0.000540f, -0.004569f, 0.002141f, 0.021860f, 0.006653f, 0.011280f, -0.005016f, -0.008460f, + 0.001742f, 0.008138f, -0.007583f, 0.015948f, 0.015709f, 0.004800f, 0.007357f, 0.003581f, -0.018051f, -0.009180f, 0.041322f, 0.047888f, -0.018977f, -0.001001f, 0.012843f, -0.038622f, -0.007242f, 0.048178f, 0.001617f, -0.052338f, 0.005692f, 0.016178f, -0.001315f, 0.018278f, 0.042987f, -0.017586f, 0.038850f, 0.021151f, 0.033154f, 0.009378f, -0.025475f, -0.027023f, 0.021669f, -0.024515f, -0.038650f, -0.011146f, -0.045911f, 0.010164f, -0.003124f, 0.016357f, 0.013968f, 0.010084f, 0.005148f, -0.001781f, 0.001264f, 0.023380f, 0.011355f, -0.044906f, -0.005286f, 0.015132f, 0.028894f, 0.016181f, 0.035803f, 0.032379f, 0.025291f, -0.011896f, -0.004333f, 0.006764f, 0.065204f, -0.027240f, 0.004772f, 0.013892f, 0.025575f, -0.010473f, -0.036255f, -0.007538f, -0.009143f, -0.021759f, -0.040096f, -0.043716f, 0.012023f, -0.024489f, -0.018537f, 0.011401f, 0.034483f, 0.042551f, 0.000807f, -0.002332f, -0.000512f, 0.032702f, -0.022129f, -0.011238f, 0.038628f, -0.042027f, 0.004677f, -0.033186f, -0.022303f, 0.002556f, 0.044795f, -0.007190f, -0.030629f, 0.040025f, -0.040884f, 0.001745f, -0.049356f, -0.004271f, + -0.006190f, 0.014625f, 0.027468f, -0.020236f, -0.011545f, -0.014279f, 0.003707f, 0.001107f, -0.015280f, 0.008781f, -0.004511f, -0.004220f, -0.006509f, -0.005168f, -0.018093f, 0.004183f, -0.008706f, 0.006530f, 0.004904f, -0.001207f, -0.003985f, 0.011117f, 0.000027f, 0.000286f, -0.021336f, 0.003325f, -0.001797f, -0.000581f, 0.019948f, 0.002134f, 0.005653f, -0.008183f, 0.003247f, -0.004662f, -0.011579f, 0.005234f, -0.023628f, 0.008043f, -0.008128f, 0.017877f, -0.014048f, -0.001755f, 0.003300f, -0.001810f, -0.003651f, -0.007198f, 0.013191f, -0.008522f, 0.014361f, -0.004905f, 0.008479f, 0.022479f, -0.026419f, -0.059151f, -0.013956f, -0.020640f, -0.019489f, -0.012238f, 0.002747f, -0.020282f, -0.017155f, 0.005643f, 0.013178f, -0.012743f, 0.031314f, -0.003417f, 0.020979f, -0.010618f, -0.001250f, 0.018044f, -0.025814f, -0.016186f, -0.008789f, 0.026928f, -0.006502f, -0.029625f, -0.011183f, 0.004444f, -0.014359f, 0.012264f, -0.019850f, -0.019985f, 0.029001f, 0.008398f, -0.022990f, 0.013928f, -0.002777f, -0.018145f, -0.001764f, -0.030066f, -0.025835f, 0.005094f, 0.045029f, 0.018127f, 0.014027f, -0.036125f, + 0.027798f, -0.003226f, 0.021296f, -0.012611f, -0.025134f, 0.012187f, -0.046356f, 0.038686f, -0.062761f, -0.039805f, 0.014530f, 0.034520f, 0.002670f, 0.041340f, -0.018104f, 0.010820f, -0.028715f, 0.038778f, 0.012472f, 0.028833f, 0.013284f, 0.006750f, -0.009114f, -0.009698f, -0.018956f, -0.006646f, -0.001140f, -0.033471f, -0.019973f, 0.002900f, -0.050696f, 0.002826f, 0.056927f, 0.016945f, 0.020500f, 0.005456f, -0.025829f, -0.019467f, -0.005269f, -0.006259f, -0.001837f, -0.010065f, -0.013589f, 0.011315f, 0.007444f, 0.010265f, 0.016082f, -0.016272f, 0.010556f, -0.006197f, -0.008778f, -0.006650f, 0.014321f, -0.004868f, -0.015628f, -0.023694f, -0.000165f, -0.014276f, -0.006713f, -0.014635f, -0.004061f, -0.009603f, -0.005760f, 0.022260f, -0.012172f, 0.005073f, 0.006904f, -0.017901f, 0.020393f, 0.000168f, 0.012193f, 0.016042f, -0.007472f, 0.007923f, 0.003598f, -0.000742f, 0.004962f, 0.013423f, -0.007794f, -0.007637f, 0.012377f, 0.001041f, 0.009840f, -0.044453f, -0.041457f, 0.004092f, 0.017087f, -0.020962f, -0.093790f, -0.019605f, -0.000479f, 0.012259f, -0.031724f, 0.002743f, -0.017689f, -0.003688f, + -0.025274f, -0.028222f, 0.025072f, -0.027445f, -0.033673f, -0.005695f, -0.023568f, -0.025921f, 0.008928f, -0.037655f, -0.012461f, 0.022720f, 0.052034f, 0.042025f, -0.002004f, -0.025639f, 0.008997f, 0.037827f, -0.001744f, 0.025157f, -0.007217f, 0.031690f, 0.017823f, -0.032552f, 0.051812f, -0.039488f, -0.020849f, 0.034872f, -0.038421f, 0.011597f, -0.008823f, -0.028922f, 0.003417f, 0.043835f, -0.009087f, -0.025766f, 0.016424f, 0.021510f, -0.000607f, 0.008903f, -0.063031f, 0.015223f, 0.002650f, 0.031807f, 0.015416f, -0.027653f, 0.027482f, -0.014733f, -0.002375f, -0.025628f, 0.013638f, 0.036941f, -0.007589f, -0.007309f, -0.037841f, -0.053550f, 0.030489f, -0.003874f, 0.024571f, -0.029286f, 0.022312f, 0.017808f, -0.038087f, 0.002199f, 0.033964f, 0.019386f, -0.017766f, -0.030642f, 0.027785f, 0.004526f, -0.023781f, 0.022601f, 0.003766f, 0.010077f, 0.002722f, 0.009365f, 0.001795f, 0.025253f, 0.000392f, 0.008696f, -0.001667f, 0.001050f, 0.022466f, -0.007225f, 0.000601f, 0.005102f, -0.005833f, 0.004094f, 0.002053f, 0.015490f, -0.000752f, -0.017235f, -0.002077f, 0.002196f, -0.010210f, -0.003052f, + 0.001150f, -0.006882f, 0.023263f, -0.005476f, -0.013277f, 0.001477f, 0.014816f, 0.006948f, -0.000749f, 0.008423f, 0.001225f, -0.009662f, -0.001176f, 0.024401f, 0.016694f, -0.016499f, -0.012050f, 0.003526f, 0.035352f, 0.035468f, -0.095639f, 0.036058f, 0.048476f, -0.012336f, 0.033721f, -0.000341f, 0.017475f, -0.007764f, -0.019670f, -0.012704f, 0.020338f, 0.004799f, -0.027631f, -0.017947f, -0.002559f, -0.012958f, -0.007079f, -0.002969f, 0.059155f, 0.011894f, 0.013095f, -0.036600f, 0.025468f, -0.026062f, 0.000380f, 0.004584f, -0.040000f, 0.018678f, -0.014833f, 0.002085f, -0.016199f, -0.028915f, 0.000781f, 0.019194f, 0.054813f, 0.019716f, 0.005691f, 0.033909f, 0.014348f, -0.004093f, 0.005565f, 0.000855f, 0.009564f, 0.005556f, 0.037177f, 0.016275f, 0.011232f, 0.006136f, -0.004776f, -0.011558f, -0.036617f, -0.030735f, 0.004260f, -0.004394f, -0.022596f, 0.003209f, 0.027450f, -0.041887f, 0.040459f, 0.010429f, -0.014915f, -0.001682f, -0.010846f, -0.003358f, 0.024502f, 0.010718f, 0.007975f, -0.028463f, -0.005800f, -0.038903f, -0.012014f, 0.010834f, 0.014210f, 0.014174f, -0.016860f, -0.013524f, + 0.030136f, -0.003555f, -0.048884f, 0.007022f, -0.000909f, -0.000533f, -0.028874f, 0.009460f, 0.021561f, -0.002980f, 0.031042f, 0.020943f, -0.010468f, -0.000575f, -0.013496f, 0.016776f, -0.001475f, 0.005529f, 0.002520f, -0.007063f, -0.005932f, -0.001295f, -0.006149f, 0.006804f, -0.013417f, -0.001313f, 0.000756f, 0.007237f, -0.006935f, -0.008029f, -0.009595f, 0.000522f, -0.002372f, 0.005330f, 0.003028f, -0.000283f, -0.006014f, 0.006470f, 0.004850f, 0.000955f, 0.007037f, 0.001290f, 0.005017f, 0.004688f, 0.006673f, -0.001861f, -0.024563f, -0.000928f, -0.007043f, -0.085000f, 0.131732f, -0.130244f, -0.058902f, -0.029763f, -0.008891f, 0.076197f, 0.022391f, 0.085301f, 0.021299f, -0.017442f, 0.067208f, 0.029081f, -0.022758f, 0.031507f, 0.028514f, 0.015945f, 0.026677f, 0.025873f, -0.023070f, -0.037249f, -0.026526f, 0.004292f, -0.024395f, 0.012864f, 0.007639f, 0.016680f, -0.002613f, 0.011524f, 0.003882f, 0.041874f, 0.009916f, 0.003928f, 0.012874f, -0.009782f, -0.000610f, 0.014766f, -0.026304f, -0.037391f, -0.025434f, -0.021764f, 0.003691f, 0.011063f, -0.026378f, -0.004313f, -0.015886f, -0.064812f, + 0.032598f, -0.011737f, 0.016481f, -0.034105f, -0.011612f, -0.031594f, -0.043297f, 0.016316f, 0.011434f, 0.042069f, -0.001853f, 0.037062f, -0.015742f, 0.031040f, 0.003623f, 0.044314f, -0.031449f, 0.027408f, 0.032919f, 0.018207f, 0.019079f, 0.001590f, -0.013509f, 0.051894f, 0.034704f, -0.003476f, 0.062597f, 0.014973f, 0.007292f, 0.026786f, 0.040335f, 0.000457f, 0.018522f, 0.023281f, 0.010610f, 0.010147f, -0.004728f, 0.002019f, -0.036660f, -0.009410f, -0.004987f, 0.005775f, 0.007634f, 0.007193f, 0.024293f, 0.010711f, 0.012359f, -0.009593f, -0.001387f, 0.009508f, 0.000959f, 0.000738f, -0.008759f, 0.009943f, 0.008432f, 0.004747f, -0.006851f, 0.012648f, -0.001995f, 0.002189f, -0.009929f, -0.009246f, -0.003742f, 0.000920f, 0.001070f, -0.006091f, -0.020200f, 0.004574f, 0.004309f, -0.005557f, -0.001071f, -0.005271f, 0.001460f, -0.007486f, 0.004902f, -0.007217f, 0.000247f, 0.017940f, -0.005193f, -0.018018f, 0.011563f, 0.008291f, 0.007014f, -0.004441f, -0.002446f, 0.080423f, 0.006968f, -0.048450f, -0.071172f, -0.037757f, -0.029691f, 0.009550f, 0.058937f, -0.000977f, -0.024899f, 0.052703f, + 0.004361f, -0.042599f, 0.038338f, 0.041565f, -0.007594f, -0.000787f, -0.004010f, -0.037710f, 0.041928f, 0.002356f, 0.023821f, -0.013300f, -0.033514f, -0.058639f, 0.010711f, 0.007400f, 0.009098f, -0.008279f, 0.018462f, -0.019501f, -0.000203f, -0.037583f, -0.046798f, 0.016444f, -0.005896f, 0.014905f, -0.006734f, -0.017373f, -0.042371f, -0.065815f, 0.033786f, -0.036780f, 0.015129f, 0.031656f, -0.002181f, -0.016943f, -0.032281f, -0.023285f, 0.075819f, 0.017225f, -0.003419f, 0.009852f, -0.009975f, -0.030633f, -0.010017f, 0.043948f, -0.042455f, -0.071487f, -0.024939f, -0.022689f, -0.100142f, -0.078265f, -0.042112f, -0.043522f, 0.010792f, -0.000451f, -0.034829f, -0.066822f, -0.026411f, -0.031577f, -0.022652f, -0.018274f, -0.013433f, -0.039965f, -0.038290f, 0.030317f, -0.034002f, 0.002165f, 0.005189f, -0.041872f, -0.007310f, -0.030550f, -0.038274f, -0.009281f, -0.006213f, 0.017799f, 0.007498f, 0.023930f, -0.024441f, 0.006332f, 0.014098f, -0.000060f, -0.032885f, -0.018575f, -0.022054f, -0.002088f, 0.010775f, -0.011130f, -0.015986f, 0.028608f, 0.017031f, 0.020616f, -0.033617f, 0.005813f, -0.016340f, -0.001777f, + 0.001461f, 0.003463f, -0.003993f, 0.034115f, 0.002720f, -0.005860f, 0.004342f, 0.012047f, 0.017208f, 0.014257f, -0.002203f, 0.020295f, -0.014464f, -0.007578f, -0.006203f, -0.026184f, -0.000705f, -0.007872f, -0.033828f, -0.028164f, 0.004946f, 0.001613f, -0.000518f, -0.008478f, -0.007411f, 0.055260f, -0.006569f, 0.052643f, 0.077913f, -0.014353f, -0.084588f, -0.081845f, -0.017723f, 0.039263f, 0.005263f, -0.064229f, 0.050315f, -0.010975f, -0.042236f, 0.051775f, -0.097414f, -0.020418f, 0.000307f, -0.017198f, -0.015123f, 0.118011f, -0.049673f, 0.110592f, -0.005710f, 0.023302f, -0.008433f, -0.043626f, 0.070553f, 0.018846f, 0.073364f, -0.050398f, -0.050000f, 0.016135f, -0.080487f, -0.023971f, -0.013186f, -0.055708f, 0.115719f, -0.010040f, -0.120692f, -0.001763f, -0.053992f, 0.015751f, 0.029304f, 0.048332f, 0.038848f, -0.047473f, -0.030112f, -0.073905f, -0.022037f, -0.034190f, 0.031333f, 0.021029f, -0.004394f, 0.021885f, -0.015191f, -0.052404f, -0.021885f, -0.061167f, 0.062411f, -0.047274f, -0.033131f, 0.056463f, 0.012932f, 0.095398f, 0.045802f, 0.008441f, 0.049905f, -0.067306f, -0.025570f, -0.069495f, + -0.068047f, -0.010310f, -0.010252f, -0.084803f, 0.087143f, -0.015278f, -0.068352f, -0.101021f, 0.006221f, -0.019927f, 0.073711f, -0.004575f, 0.003446f, 0.010108f, -0.013684f, 0.014215f, 0.016279f, 0.034958f, -0.023700f, -0.023315f, -0.015416f, 0.001223f, -0.004656f, -0.004708f, -0.022405f, 0.024736f, 0.014802f, 0.029474f, -0.007278f, -0.015684f, -0.013957f, -0.005022f, 0.005117f, 0.039417f, 0.041331f, -0.006633f, 0.001927f, 0.022828f, -0.006681f, -0.052093f, -0.025733f, 0.003423f, 0.006832f, -0.003947f, -0.033659f, 0.011827f, -0.004297f, -0.007773f, -0.038485f, 0.015098f, 0.012593f, 0.045600f, 0.007132f, 0.011342f, -0.002539f, 0.018838f, 0.002993f, -0.010696f, -0.157769f, 0.081510f, 0.018647f, -0.033952f, -0.025795f, 0.050399f, 0.027556f, -0.030347f, -0.008445f, -0.074106f, -0.031200f, 0.031669f, -0.064306f, 0.002587f, 0.011357f, -0.019474f, -0.042950f, -0.029069f, 0.057452f, 0.023278f, -0.011744f, -0.082687f, 0.027871f, 0.052262f, 0.029907f, -0.063990f, -0.042909f, 0.000418f, 0.069619f, 0.006374f, -0.017074f, 0.011156f, 0.002065f, 0.035829f, -0.093205f, -0.080303f, 0.099406f, 0.015620f, + 0.041478f, -0.094559f, 0.020451f, -0.004089f, 0.069258f, -0.062084f, -0.012087f, -0.094783f, 0.033042f, 0.068643f, 0.015877f, -0.041994f, 0.027040f, 0.099549f, -0.044689f, -0.047173f, -0.037340f, 0.014343f, 0.003985f, 0.087369f, -0.026181f, 0.006918f, -0.047141f, 0.015662f, -0.051676f, -0.001440f, 0.032934f, -0.064110f, 0.061409f, 0.018951f, -0.044846f, -0.069360f, -0.042410f, -0.003231f, 0.061963f, -0.112040f, -0.024596f, 0.101970f, 0.013275f, -0.045537f, -0.021676f, -0.032012f, 0.095643f, -0.010268f, -0.100472f, -0.011301f, -0.000150f, -0.024374f, 0.040816f, -0.006633f, -0.014176f, 0.031447f, -0.002900f, -0.020175f, -0.026408f, -0.002327f, -0.023293f, 0.007493f, 0.016954f, 0.023005f, -0.020275f, -0.014389f, 0.020793f, -0.013199f, 0.019692f, -0.009982f, -0.020206f, 0.028113f, -0.015217f, 0.025384f, 0.034148f, 0.002752f, -0.049651f, -0.002820f, -0.029616f, 0.012877f, 0.018259f, 0.012546f, -0.034701f, 0.000954f, -0.026211f, 0.025081f, -0.007393f, -0.014370f, -0.010024f, 0.005947f, 0.008368f, 0.104286f, 0.053247f, 0.024267f, 0.023999f, 0.025314f, -0.016675f, -0.016104f, -0.035254f, 0.004729f, + 0.011202f, 0.009504f, -0.002201f, -0.059595f, 0.028551f, 0.012077f, -0.041779f, -0.035014f, -0.018191f, -0.020333f, 0.015362f, -0.015102f, -0.017818f, 0.005483f, -0.001618f, -0.031458f, 0.040616f, -0.028902f, -0.009626f, -0.030041f, -0.027743f, 0.020217f, -0.011917f, -0.003613f, 0.010096f, 0.013342f, -0.003490f, -0.040083f, 0.009490f, 0.063556f, 0.013323f, -0.098623f, -0.006426f, -0.021073f, -0.030947f, 0.021297f, 0.022185f, 0.051711f, 0.024530f, -0.064159f, 0.069915f, -0.016905f, -0.048721f, 0.146382f, -0.029557f, -0.012022f, -0.048277f, -0.115536f, 0.052988f, 0.059399f, 0.019305f, 0.022724f, -0.099306f, 0.029314f, -0.007878f, -0.023551f, -0.017582f, 0.004457f, -0.009538f, 0.016010f, 0.018781f, 0.004590f, -0.014804f, -0.027896f, 0.030003f, 0.038284f, 0.052554f, -0.025532f, -0.005403f, 0.011683f, -0.007804f, 0.028087f, -0.068125f, 0.007094f, 0.012002f, -0.031402f, 0.005244f, -0.026077f, 0.010396f, 0.000985f, 0.008341f, -0.003893f, 0.001872f, 0.003125f, -0.001375f, -0.000414f, -0.009059f, -0.006557f, 0.018198f, -0.009554f, -0.000663f, 0.013956f, 0.003016f, 0.001116f, 0.022273f, -0.017835f, + 0.013668f, 0.016479f, -0.000936f, -0.002691f, -0.018766f, 0.015758f, -0.035131f, -0.009368f, 0.023061f, 0.007152f, -0.009508f, -0.023297f, 0.007316f, -0.005016f, 0.028712f, -0.058831f, -0.141937f, -0.239180f, 0.019166f, 0.243897f, 0.023079f, 0.518107f, 0.522984f, 0.190146f, 0.524829f, 0.304648f, -0.088781f, -0.008070f, -0.047818f, -0.397697f, -0.330154f, -0.231353f, -0.413332f, -0.394342f, -0.112828f, -0.248094f, -0.216603f, 0.049290f, 0.068854f, -0.053264f, 0.076525f, 0.113039f, -0.000456f, 0.008241f, 0.224245f, 0.150098f, 0.056876f, 0.166339f, 0.310264f, 0.146523f, 0.170880f, 0.384515f, 0.151725f, 0.069438f, 0.331989f, 0.320674f, 0.013761f, 0.205248f, 0.362196f, 0.001069f, 0.091738f, 0.215274f, -0.008738f, -0.175277f, 0.086690f, -0.036275f, -0.338343f, -0.314845f, -0.289938f, -0.562535f, -0.832397f, -0.578894f, -0.809885f, -1.078273f, -0.761467f, -0.616577f, -0.834321f, -0.532344f, -0.256711f, -0.246777f, -0.047299f, 0.248831f, 0.500935f, 0.567925f, 0.759267f, 1.034058f, 1.015367f, 0.961258f, 1.082026f, 1.081117f, 0.882190f, 0.710818f, 0.760393f, 0.505955f, 0.179460f, 0.241351f, + 0.058701f, -0.443528f, -0.285866f, -0.301417f, -0.619889f, -0.522872f, -0.376663f, -0.440183f, -0.510167f, -0.316934f, -0.277660f, -0.385261f, -0.318570f, -0.164973f, -0.265146f, -0.348178f, -0.210017f, -0.147563f, -0.276908f, -0.155737f, 0.035857f, -0.086301f, -0.099403f, 0.111080f, -0.004453f, -0.140042f, -0.018521f, -0.088134f, -0.317523f, -0.220325f, -0.167297f, -0.293895f, -0.132187f, 0.073322f, 0.140175f, 0.260351f, 0.432589f, 0.503807f, 0.527904f, 0.592827f, 0.630337f, 0.621475f, 0.572207f, 0.533234f, 0.452033f, 0.359886f, 0.219959f, 0.165356f, 0.018603f, -0.141650f, -0.248591f, -0.396133f, -0.570266f, -0.553786f, -0.472488f, -0.427510f, -0.372036f, -0.254468f, -0.215697f, -0.192117f, -0.140173f, -0.092185f, -0.083834f, -0.036115f, -0.024264f, -0.017373f, -0.003801f, 0.030033f, 0.050725f, 0.067396f, 0.078476f, 0.092364f, 0.085115f, 0.076594f, 0.046140f, 0.031854f, 0.006745f, 0.007675f, -0.002778f} + }, + { + {0.019095f, -0.000790f, -0.001011f, 0.006083f, -0.002474f, 0.006948f, -0.003677f, -0.008916f, 0.003142f, 0.008958f, 0.001328f, -0.001390f, 0.011901f, 0.000405f, 0.000497f, -0.004058f, -0.002258f, 0.018540f, 0.002584f, -0.012583f, -0.009302f, 0.013077f, -0.001187f, 0.013561f, 0.000956f, -0.002576f, -0.001272f, 0.010243f, 0.002031f, 0.021502f, 0.009472f, 0.005921f, -0.001154f, 0.004778f, 0.009730f, -0.002390f, -0.007246f, -0.009104f, -0.001742f, 0.008212f, 0.007063f, 0.010956f, 0.003080f, -0.006123f, -0.006368f, -0.002650f, 0.004578f, -0.001465f, 0.002519f, -0.001245f, -0.009747f, -0.007523f, 0.002986f, 0.007121f, 0.004383f, -0.003524f, -0.004021f, -0.000269f, 0.010632f, 0.005411f, -0.001165f, -0.002376f, 0.004930f, 0.003329f, 0.002116f, -0.005419f, 0.002727f, 0.005099f, -0.000654f, 0.007787f, 0.009188f, -0.016046f, 0.005895f, 0.003282f, 0.010476f, 0.003163f, 0.000834f, 0.004783f, -0.002123f, -0.007480f, -0.002780f, -0.004506f, -0.001504f, -0.000927f, 0.004556f, -0.000229f, -0.003647f, 0.000057f, 0.000537f, 0.002722f, -0.002369f, 0.000443f, -0.000459f, 0.000974f, 0.001392f, 0.000975f, + 0.001797f, 0.000182f, 0.001110f, 0.005368f, 0.008358f, 0.018064f, -0.014683f, 0.003306f, -0.003223f, 0.000205f, -0.018867f, 0.001893f, 0.011351f, -0.016785f, -0.003478f, 0.011211f, 0.029759f, 0.004263f, -0.000200f, 0.002114f, -0.018636f, -0.000603f, 0.013742f, 0.012193f, 0.000338f, -0.000390f, 0.001135f, 0.006399f, 0.010722f, 0.011294f, 0.012215f, -0.005457f, 0.002645f, -0.000745f, 0.004714f, 0.001318f, 0.003042f, -0.018915f, -0.005177f, 0.002948f, 0.001552f, -0.010462f, -0.000328f, 0.007135f, -0.008313f, 0.006569f, 0.006073f, 0.011195f, 0.005252f, -0.004283f, 0.005598f, 0.012512f, -0.006998f, -0.011302f, 0.003802f, 0.002620f, 0.002218f, 0.005930f, -0.004999f, -0.009139f, -0.013609f, 0.010999f, -0.002014f, -0.002577f, -0.004419f, 0.004827f, -0.000156f, 0.007133f, 0.014117f, 0.002854f, 0.000973f, -0.000760f, -0.003391f, -0.011002f, 0.017124f, 0.004210f, -0.002027f, 0.008843f, -0.001374f, -0.010142f, -0.008901f, -0.001981f, 0.003383f, -0.014791f, 0.001236f, -0.008769f, -0.001638f, 0.004513f, -0.000239f, 0.002373f, -0.002628f, -0.004837f, -0.001008f, 0.002444f, 0.003371f, 0.002483f, + -0.000495f, -0.001484f, -0.000067f, 0.002417f, -0.001254f, -0.002463f, -0.001819f, -0.008856f, -0.007687f, -0.009608f, -0.013653f, 0.007642f, -0.000178f, -0.006523f, -0.002598f, -0.003334f, 0.002962f, -0.005419f, -0.009375f, 0.002133f, -0.006097f, 0.016013f, 0.021284f, 0.016834f, -0.011649f, -0.000448f, -0.000770f, 0.004503f, -0.006467f, 0.013207f, 0.008280f, -0.001884f, 0.006394f, 0.010017f, 0.000809f, 0.002429f, 0.003494f, 0.009733f, -0.000932f, 0.003622f, 0.011645f, 0.001188f, -0.000134f, -0.005085f, 0.008379f, -0.012654f, 0.005112f, -0.001769f, -0.002602f, 0.008438f, -0.008150f, -0.001026f, 0.000287f, -0.010998f, 0.004571f, -0.002215f, 0.005096f, -0.000351f, -0.004755f, 0.003346f, 0.003501f, -0.000575f, 0.009775f, -0.000693f, 0.011277f, -0.000163f, -0.007495f, -0.003330f, 0.000434f, -0.005112f, 0.010057f, 0.005254f, 0.008634f, 0.009797f, -0.004278f, -0.009685f, -0.006331f, -0.000004f, -0.001796f, -0.002058f, 0.007982f, 0.010077f, -0.001503f, -0.005508f, 0.003507f, 0.002757f, -0.003854f, -0.005255f, 0.001811f, -0.007552f, 0.001848f, -0.000135f, -0.000233f, -0.002014f, -0.007155f, 0.001630f, + -0.002815f, 0.000308f, 0.003209f, 0.000012f, -0.003653f, 0.001849f, -0.005011f, -0.000075f, 0.000327f, -0.001136f, 0.000426f, 0.000979f, -0.002738f, 0.000066f, 0.000340f, -0.003232f, 0.000694f, -0.000958f, -0.000195f, -0.001689f, -0.000041f, 0.000929f, -0.028150f, -0.006645f, -0.008763f, -0.015233f, 0.005197f, 0.003982f, -0.001808f, 0.007075f, -0.000973f, 0.005970f, 0.008448f, -0.003716f, -0.009839f, -0.012416f, -0.004726f, -0.011563f, 0.000914f, 0.001273f, -0.005027f, 0.006557f, -0.005650f, 0.003515f, -0.002578f, -0.006599f, -0.017520f, -0.006825f, 0.001568f, 0.002752f, 0.004612f, -0.006521f, 0.004659f, 0.007042f, 0.002337f, 0.015986f, 0.003983f, -0.000413f, 0.012385f, -0.008754f, 0.007155f, 0.001173f, -0.004161f, -0.005929f, 0.007988f, 0.001070f, 0.002527f, -0.018880f, -0.003478f, -0.006242f, 0.018968f, 0.008125f, 0.006833f, 0.007693f, 0.008708f, 0.006886f, 0.009656f, -0.005113f, -0.002070f, 0.005914f, 0.009485f, -0.001281f, 0.011077f, -0.005968f, 0.002423f, -0.002409f, 0.009382f, 0.014046f, -0.021953f, 0.005747f, -0.005433f, 0.000695f, -0.010359f, -0.005332f, 0.001728f, -0.003152f, + -0.004453f, -0.008796f, -0.003967f, 0.004128f, -0.000219f, 0.009388f, -0.000997f, 0.003613f, 0.008138f, 0.012935f, -0.000494f, 0.003408f, -0.001526f, 0.006014f, 0.000955f, 0.002919f, -0.004031f, -0.001427f, 0.000416f, 0.002740f, -0.001809f, -0.002951f, 0.000128f, 0.000147f, -0.002289f, 0.000329f, 0.001299f, 0.000037f, 0.003757f, -0.001677f, -0.001783f, 0.000411f, 0.003270f, -0.001351f, 0.000053f, -0.001215f, 0.001938f, 0.003010f, -0.000446f, 0.002878f, 0.003147f, -0.000791f, -0.001390f, 0.010990f, 0.006748f, 0.003984f, -0.002086f, 0.000904f, 0.001200f, 0.014195f, -0.011269f, 0.014240f, -0.001885f, 0.007761f, 0.014601f, -0.009135f, 0.011315f, -0.007068f, 0.005811f, 0.002214f, 0.017166f, 0.007591f, -0.009545f, -0.015723f, 0.003592f, -0.011787f, 0.009709f, -0.002414f, 0.012650f, -0.009414f, -0.001521f, -0.007537f, 0.004370f, 0.002814f, 0.003627f, -0.000937f, -0.001332f, -0.013721f, -0.006009f, 0.011297f, -0.008983f, -0.001819f, 0.007353f, 0.000357f, -0.007029f, 0.002308f, 0.000649f, -0.001568f, -0.006091f, 0.012352f, 0.003952f, -0.017559f, -0.007913f, -0.014172f, -0.002465f, -0.012528f, + -0.021611f, -0.004911f, 0.009460f, 0.026666f, 0.005848f, 0.002220f, 0.012580f, -0.000311f, -0.009807f, -0.008571f, 0.007036f, 0.002758f, 0.004760f, 0.007717f, -0.018826f, -0.004607f, -0.017313f, -0.003779f, 0.004894f, -0.006840f, -0.015998f, 0.001658f, 0.006974f, -0.003392f, -0.005924f, -0.002785f, 0.002826f, -0.002340f, -0.000632f, 0.003558f, -0.002157f, -0.002324f, -0.003190f, -0.002303f, -0.007297f, 0.002685f, -0.001867f, 0.003442f, -0.001195f, 0.002043f, 0.004688f, 0.000720f, -0.001201f, -0.000361f, -0.003863f, -0.002521f, -0.006148f, -0.005558f, 0.000918f, 0.000762f, 0.000059f, 0.002300f, 0.003692f, 0.002633f, 0.000063f, 0.002410f, 0.002020f, -0.001593f, 0.001489f, 0.001585f, -0.003168f, 0.030640f, 0.007293f, 0.022185f, -0.010402f, -0.001443f, -0.007401f, -0.001708f, 0.023570f, -0.020107f, 0.006747f, 0.002283f, 0.030867f, 0.016437f, 0.020483f, 0.003743f, -0.005097f, 0.009669f, -0.006741f, -0.025593f, 0.004866f, 0.001456f, 0.003000f, 0.020171f, 0.001915f, -0.011851f, -0.001048f, 0.000531f, 0.006394f, 0.006982f, -0.000609f, -0.002641f, 0.008230f, -0.009642f, -0.002661f, -0.004882f, + -0.002479f, 0.002490f, 0.000365f, 0.017769f, 0.002554f, 0.013953f, 0.016078f, 0.004453f, 0.014180f, -0.001051f, 0.004689f, 0.008625f, -0.009317f, -0.013903f, 0.001737f, 0.014005f, -0.022379f, 0.006661f, -0.017175f, -0.016039f, -0.009848f, -0.004445f, -0.015114f, -0.014628f, -0.015497f, -0.007940f, -0.003865f, 0.010398f, 0.000242f, 0.012458f, 0.001875f, -0.010258f, 0.015697f, -0.016330f, -0.006207f, -0.006759f, -0.006721f, -0.008656f, -0.011415f, 0.016305f, 0.012671f, -0.007125f, 0.006216f, 0.005134f, 0.012874f, 0.000053f, 0.009295f, -0.004572f, 0.011687f, 0.005914f, -0.006918f, 0.000404f, -0.006252f, 0.007456f, -0.007132f, 0.000796f, 0.005746f, 0.000445f, 0.004393f, -0.001248f, 0.000696f, 0.003072f, -0.001041f, -0.003122f, 0.002892f, -0.000831f, 0.000491f, -0.006009f, -0.005006f, -0.004792f, -0.003771f, -0.000621f, -0.002113f, -0.004148f, -0.000206f, 0.000886f, -0.001971f, 0.000505f, -0.000156f, -0.016441f, -0.016735f, -0.009697f, -0.010310f, -0.005351f, -0.004299f, -0.019740f, -0.016036f, -0.013382f, -0.002152f, -0.001066f, -0.002584f, 0.013859f, 0.001300f, 0.007202f, 0.010477f, 0.012451f, + 0.001860f, 0.024249f, 0.030159f, -0.000534f, 0.008674f, 0.006916f, -0.003758f, 0.013319f, 0.007088f, -0.027092f, -0.000993f, -0.009315f, 0.001488f, 0.021110f, 0.008279f, -0.021647f, -0.005860f, 0.009761f, 0.009510f, 0.001418f, 0.027741f, -0.011442f, 0.011134f, 0.011443f, 0.012308f, 0.007341f, 0.014351f, -0.024404f, 0.008884f, -0.009472f, 0.014461f, 0.000628f, 0.006179f, -0.018301f, 0.013411f, 0.009865f, -0.002464f, 0.009555f, -0.001679f, 0.002729f, -0.000272f, -0.009505f, 0.002402f, -0.006046f, 0.005911f, -0.007479f, 0.009321f, 0.003047f, 0.023482f, 0.017715f, -0.005653f, 0.006385f, -0.019539f, 0.017015f, -0.005417f, 0.010470f, 0.018183f, 0.018054f, 0.000738f, 0.018439f, 0.012567f, 0.008768f, 0.009199f, 0.016951f, 0.001557f, 0.003731f, -0.013887f, -0.002299f, -0.004073f, 0.003254f, -0.010054f, 0.001580f, -0.007362f, 0.002348f, -0.007335f, 0.002301f, -0.002779f, -0.004416f, -0.004384f, 0.003074f, 0.000178f, -0.002179f, -0.001837f, -0.005756f, -0.002031f, 0.001131f, -0.001843f, -0.004123f, 0.000487f, 0.004474f, -0.010192f, -0.006119f, -0.005690f, 0.004156f, -0.006308f, 0.003890f, + -0.000102f, 0.002278f, -0.005252f, -0.007422f, -0.001843f, 0.001490f, 0.015914f, -0.014180f, -0.003772f, 0.012747f, -0.006825f, 0.021808f, -0.007003f, -0.015356f, 0.028885f, 0.039363f, 0.008687f, -0.015503f, 0.010806f, -0.008165f, 0.016098f, 0.009423f, -0.003585f, -0.016447f, -0.010837f, -0.027984f, 0.007268f, 0.011957f, -0.024771f, -0.002926f, 0.014292f, 0.003760f, -0.001268f, 0.000600f, -0.003099f, -0.013366f, 0.003179f, 0.016601f, 0.000604f, 0.003597f, 0.005929f, 0.023509f, -0.015559f, -0.000413f, 0.016996f, -0.015599f, 0.022853f, 0.001216f, 0.032149f, -0.026793f, -0.024249f, 0.013325f, 0.001113f, -0.003189f, 0.006847f, -0.002188f, 0.008891f, 0.005541f, 0.017840f, 0.017110f, -0.014197f, 0.002617f, -0.009308f, -0.005531f, 0.010642f, -0.001297f, -0.005605f, -0.002349f, 0.000424f, 0.016074f, -0.030714f, 0.023382f, -0.007401f, -0.010385f, 0.017230f, -0.013937f, 0.013795f, -0.018766f, -0.010656f, -0.003445f, -0.014061f, -0.004784f, -0.009956f, -0.015595f, -0.010628f, 0.003466f, -0.003659f, -0.003710f, -0.000323f, -0.007235f, -0.002425f, -0.001032f, 0.009599f, -0.000447f, 0.001308f, 0.003958f, + -0.004188f, -0.001542f, -0.003563f, 0.002408f, 0.004640f, 0.001355f, -0.002059f, 0.011453f, -0.000043f, 0.008513f, -0.009292f, -0.005875f, -0.005564f, -0.003865f, 0.004236f, 0.002176f, 0.000197f, 0.006691f, -0.005052f, 0.005124f, 0.001885f, 0.004772f, 0.002547f, 0.000729f, -0.005946f, -0.019502f, -0.014851f, -0.006552f, -0.013926f, -0.021259f, -0.004443f, 0.007705f, 0.026104f, 0.004216f, -0.015719f, -0.029185f, -0.006063f, 0.009024f, -0.005077f, 0.031292f, 0.009877f, -0.011100f, -0.022123f, -0.027703f, -0.052406f, -0.004305f, -0.005760f, 0.020063f, 0.014887f, -0.010764f, 0.001390f, -0.008334f, -0.004511f, 0.018828f, -0.000470f, 0.000979f, -0.002270f, 0.021364f, 0.003650f, -0.006440f, -0.001035f, -0.000814f, 0.005816f, -0.019485f, -0.006102f, -0.007677f, 0.030823f, 0.007159f, -0.032358f, 0.008332f, -0.016779f, -0.009482f, 0.004800f, -0.030163f, 0.009410f, 0.021708f, 0.019302f, 0.015007f, 0.003702f, 0.006050f, -0.000942f, 0.003180f, -0.018975f, 0.006885f, -0.029726f, -0.005733f, 0.017079f, 0.006209f, 0.017497f, 0.017203f, 0.014276f, -0.009767f, -0.021928f, -0.019234f, -0.014820f, 0.004806f, + 0.005986f, 0.010147f, 0.010150f, 0.002171f, 0.006799f, 0.021461f, 0.030129f, -0.007242f, 0.010769f, -0.007514f, -0.008043f, 0.009171f, -0.013152f, -0.004700f, 0.000596f, -0.008403f, 0.007885f, -0.007307f, -0.006276f, -0.003527f, 0.001940f, -0.001949f, 0.004325f, 0.000034f, 0.006233f, -0.001503f, -0.003681f, -0.001775f, -0.003601f, -0.009554f, 0.002611f, 0.005062f, -0.000391f, 0.003310f, -0.000849f, 0.004545f, 0.008833f, 0.008348f, 0.006610f, -0.006780f, -0.003336f, 0.006408f, -0.001890f, -0.002639f, 0.000688f, -0.001141f, 0.006576f, -0.001524f, -0.000290f, -0.001059f, 0.015350f, 0.027139f, 0.031456f, 0.022724f, 0.038883f, -0.018207f, 0.027637f, -0.023690f, -0.018551f, 0.020443f, 0.026170f, 0.030872f, -0.031875f, -0.000211f, 0.008044f, -0.023648f, 0.011196f, -0.010415f, -0.016727f, 0.019049f, -0.024819f, 0.026904f, -0.025513f, 0.025200f, -0.018311f, -0.006788f, -0.001671f, -0.033420f, -0.004628f, 0.036761f, -0.009407f, -0.026348f, 0.005633f, 0.017042f, -0.019175f, 0.009453f, 0.039801f, 0.021348f, 0.008061f, 0.017552f, -0.021047f, 0.014001f, -0.012642f, -0.036314f, -0.010995f, -0.009546f, + 0.002693f, 0.016374f, 0.020313f, -0.009066f, -0.015895f, 0.014401f, 0.000101f, 0.011003f, 0.006917f, -0.005987f, 0.001979f, -0.014504f, 0.002190f, 0.004499f, -0.000200f, 0.004642f, 0.032730f, -0.004150f, 0.003228f, 0.009267f, 0.001940f, 0.003928f, -0.016667f, -0.018324f, 0.012643f, -0.021796f, -0.029491f, -0.031021f, 0.024022f, 0.015461f, 0.004608f, -0.001781f, -0.003603f, 0.011373f, -0.001848f, -0.008784f, 0.010987f, 0.030167f, 0.020434f, -0.008121f, -0.005184f, 0.009261f, 0.005382f, -0.002244f, -0.004841f, 0.003303f, 0.004225f, -0.001395f, 0.001192f, 0.016312f, 0.003883f, 0.002222f, 0.006388f, -0.005479f, 0.001144f, 0.005098f, 0.010900f, -0.001192f, 0.000725f, -0.010854f, 0.003409f, -0.005720f, -0.004140f, 0.011048f, 0.008918f, 0.000434f, 0.006972f, -0.006231f, -0.003009f, 0.003206f, -0.000013f, -0.003386f, -0.006255f, -0.006834f, 0.004182f, 0.001750f, -0.002986f, 0.003660f, -0.025214f, -0.039964f, 0.014208f, 0.051966f, 0.025403f, -0.009711f, -0.040190f, -0.013929f, 0.002541f, 0.005634f, -0.007825f, 0.019748f, 0.013287f, -0.014566f, -0.007567f, -0.001930f, -0.026594f, 0.036955f, + -0.016835f, 0.013183f, -0.003096f, -0.008677f, -0.032394f, 0.010640f, 0.006717f, -0.004008f, 0.003907f, 0.014537f, -0.005296f, 0.036145f, -0.008092f, -0.005476f, 0.030117f, -0.003327f, -0.021625f, -0.019299f, -0.037355f, 0.005175f, -0.008293f, -0.011564f, -0.008143f, -0.027361f, -0.011475f, -0.025619f, 0.002744f, -0.022542f, 0.020419f, -0.012718f, -0.000414f, 0.006401f, 0.002543f, 0.011845f, -0.010839f, -0.027676f, 0.012084f, -0.003136f, 0.006914f, -0.006141f, -0.002782f, 0.000885f, 0.026732f, 0.040036f, 0.010883f, -0.012480f, 0.013842f, 0.014582f, 0.015910f, -0.006457f, -0.013328f, 0.020458f, 0.009690f, 0.027317f, 0.006381f, 0.007357f, 0.000822f, 0.008275f, 0.024580f, 0.033577f, 0.016537f, 0.005746f, 0.012646f, 0.005389f, -0.006932f, -0.022847f, -0.014478f, 0.002706f, 0.011193f, 0.001851f, -0.000496f, -0.008493f, -0.003101f, 0.004810f, 0.003287f, -0.018032f, -0.003344f, 0.004199f, -0.000658f, -0.008926f, -0.007444f, -0.009989f, 0.002027f, -0.001672f, 0.007003f, 0.012958f, 0.007682f, 0.000533f, -0.004150f, 0.007973f, 0.009589f, 0.000745f, 0.003297f, -0.012546f, -0.000326f, -0.004173f, + -0.012834f, 0.002850f, 0.002512f, -0.011477f, -0.001042f, -0.002597f, 0.004529f, -0.004385f, 0.011069f, 0.000179f, 0.015146f, 0.077258f, 0.002239f, -0.021044f, 0.064870f, 0.032401f, 0.028890f, 0.055853f, 0.056222f, 0.015712f, 0.018155f, 0.013762f, 0.061074f, 0.002832f, -0.021001f, 0.025913f, 0.006012f, -0.024002f, -0.026259f, 0.023039f, 0.023048f, 0.043300f, -0.003848f, 0.002851f, 0.001016f, 0.005655f, -0.025479f, 0.028839f, 0.020721f, 0.008630f, -0.019691f, 0.030538f, -0.008920f, -0.001967f, -0.040554f, -0.009287f, -0.002663f, -0.002944f, -0.021181f, 0.013815f, -0.019670f, -0.011852f, -0.011339f, 0.005500f, -0.013490f, -0.019230f, -0.025724f, 0.027295f, -0.019473f, 0.029050f, 0.013446f, 0.023793f, 0.007901f, -0.024932f, -0.000801f, -0.039867f, -0.017867f, -0.021901f, 0.008688f, -0.027805f, -0.014547f, -0.005363f, 0.000592f, 0.028076f, 0.003332f, -0.004842f, -0.045192f, 0.017663f, 0.015767f, -0.001470f, -0.000103f, -0.023450f, 0.017978f, 0.001521f, -0.019492f, 0.053524f, 0.012411f, -0.007435f, -0.000376f, -0.022149f, 0.003875f, 0.026602f, -0.006881f, -0.002663f, -0.029716f, -0.018188f, + 0.011146f, -0.004637f, -0.013981f, 0.017058f, 0.010965f, -0.018300f, 0.016155f, -0.006634f, 0.005297f, -0.006433f, 0.015821f, 0.002897f, -0.002188f, -0.000030f, 0.004030f, -0.021974f, 0.000495f, -0.008417f, 0.006639f, 0.006897f, 0.010781f, -0.009311f, 0.007938f, 0.005292f, 0.004878f, 0.007411f, 0.009574f, -0.001166f, 0.007441f, -0.010847f, 0.018453f, -0.008730f, 0.015657f, -0.011151f, 0.007085f, -0.023616f, -0.043310f, 0.013301f, 0.013044f, -0.013401f, 0.028191f, -0.031172f, 0.033860f, -0.024427f, -0.014227f, 0.010899f, 0.007836f, 0.087389f, 0.034146f, 0.013091f, -0.054535f, -0.001451f, -0.012944f, -0.028905f, -0.008399f, -0.010565f, -0.009568f, -0.003236f, -0.045351f, -0.000873f, -0.017159f, 0.000562f, 0.022078f, -0.024057f, 0.028650f, -0.009393f, -0.031709f, -0.028290f, 0.022697f, 0.017411f, -0.007092f, -0.015620f, 0.028950f, -0.015622f, -0.014754f, 0.022754f, -0.000650f, 0.007001f, -0.023444f, -0.000792f, -0.013784f, 0.029185f, -0.004400f, 0.041866f, -0.015660f, 0.006290f, 0.012617f, -0.001199f, 0.001602f, 0.012770f, -0.026995f, -0.004332f, 0.034406f, 0.002787f, 0.009445f, -0.000324f, + -0.027898f, 0.011921f, -0.019474f, 0.009913f, 0.030080f, 0.039016f, 0.042558f, 0.044797f, -0.009664f, 0.015717f, -0.000357f, 0.024035f, 0.054304f, -0.059647f, 0.046370f, -0.027581f, 0.012466f, 0.037265f, -0.023515f, 0.002389f, 0.011711f, 0.010153f, -0.002777f, 0.025932f, -0.010046f, -0.008219f, 0.010981f, -0.006238f, 0.025006f, -0.003724f, 0.009487f, -0.020164f, -0.003261f, -0.000621f, -0.016214f, -0.006847f, -0.020455f, 0.000193f, 0.005939f, 0.001967f, 0.022752f, -0.007528f, 0.001558f, 0.002426f, 0.009689f, 0.002348f, 0.009775f, -0.013503f, 0.010170f, 0.003083f, -0.000537f, 0.007190f, 0.009977f, -0.011365f, 0.010366f, -0.021823f, -0.019207f, 0.013395f, -0.006406f, -0.015498f, -0.002170f, 0.006279f, -0.009875f, 0.017490f, -0.020780f, -0.046239f, -0.008818f, 0.009156f, 0.000779f, 0.010642f, -0.034093f, -0.004807f, -0.006880f, -0.048875f, -0.037584f, 0.019210f, 0.020348f, 0.009195f, 0.014063f, -0.025101f, -0.012122f, -0.017839f, 0.053372f, 0.012634f, 0.001575f, 0.039747f, 0.023058f, 0.019911f, 0.018152f, 0.015538f, -0.028032f, 0.020075f, 0.008283f, -0.008790f, 0.015965f, -0.014328f, + -0.013939f, 0.027680f, -0.012030f, 0.017391f, 0.036792f, 0.001146f, 0.007089f, -0.000788f, 0.002430f, -0.008132f, -0.021511f, -0.027361f, -0.044215f, 0.018002f, -0.037450f, 0.013942f, 0.014618f, 0.018731f, 0.000154f, 0.001016f, -0.005227f, -0.028974f, -0.013671f, 0.014521f, -0.009985f, 0.014988f, 0.036776f, -0.011433f, 0.028134f, 0.012755f, 0.003132f, -0.001736f, -0.010023f, -0.026846f, -0.001122f, -0.036233f, -0.012537f, 0.038541f, -0.020667f, 0.006000f, -0.063806f, 0.030144f, -0.011821f, 0.009616f, -0.049238f, -0.043940f, 0.004134f, 0.011602f, 0.022519f, -0.050973f, -0.005390f, 0.000490f, 0.034630f, 0.028225f, 0.032049f, -0.010378f, 0.000668f, 0.004711f, 0.016753f, 0.003833f, 0.009208f, 0.026335f, 0.015033f, -0.010269f, 0.009600f, 0.002416f, 0.001881f, -0.000748f, -0.005646f, -0.022052f, 0.007670f, -0.010773f, 0.003256f, 0.008489f, -0.000294f, 0.001764f, -0.000311f, 0.008504f, -0.005415f, 0.035540f, 0.009690f, -0.001603f, 0.019914f, 0.011874f, 0.001644f, 0.005779f, -0.000624f, -0.016157f, 0.020934f, -0.007077f, 0.002804f, 0.024830f, 0.013903f, -0.008041f, 0.000085f, -0.010211f, + 0.016486f, 0.011198f, 0.013777f, 0.012638f, 0.037861f, -0.089946f, -0.022378f, -0.053346f, 0.017872f, -0.047888f, -0.016319f, -0.054298f, 0.014385f, -0.028221f, -0.021992f, -0.004459f, -0.046473f, -0.016634f, -0.049777f, -0.024847f, -0.057603f, 0.012582f, -0.053306f, -0.020806f, -0.027781f, -0.015268f, -0.014768f, -0.012208f, -0.050885f, -0.028796f, -0.038751f, -0.019596f, -0.011311f, 0.022102f, -0.003337f, 0.016551f, -0.031723f, -0.004932f, 0.001662f, -0.036160f, 0.006877f, -0.002341f, 0.002933f, 0.009734f, -0.036959f, -0.001871f, 0.013435f, -0.004342f, 0.015166f, 0.030780f, 0.055247f, -0.045794f, 0.002697f, 0.061774f, 0.000170f, 0.030432f, -0.021702f, 0.038364f, 0.006852f, -0.008892f, -0.051302f, -0.029922f, 0.042388f, 0.026458f, 0.041394f, 0.001739f, -0.029058f, 0.010796f, 0.014895f, 0.029903f, -0.055756f, 0.000622f, 0.010450f, -0.030500f, -0.010329f, -0.013057f, -0.018718f, -0.044380f, 0.068901f, -0.012449f, -0.022240f, -0.013931f, 0.014230f, 0.016790f, -0.039054f, -0.036012f, -0.001501f, 0.011772f, 0.001751f, 0.000348f, -0.007657f, -0.012939f, -0.000216f, 0.034987f, 0.021494f, 0.000003f, + -0.028663f, -0.019581f, 0.003184f, -0.010814f, 0.007558f, 0.009405f, 0.004658f, -0.002789f, -0.014780f, 0.006267f, 0.007311f, -0.003858f, 0.011080f, -0.006220f, -0.025415f, -0.011852f, -0.001440f, 0.007605f, -0.001870f, -0.007957f, -0.037169f, -0.014654f, -0.008485f, 0.003026f, 0.004709f, -0.015865f, -0.028762f, 0.011493f, 0.017363f, -0.015083f, 0.000759f, -0.013240f, 0.014650f, -0.004624f, -0.025652f, 0.038439f, -0.064829f, -0.000598f, -0.012929f, 0.028066f, -0.014353f, -0.039817f, 0.034745f, -0.069956f, -0.060496f, -0.049771f, 0.028472f, -0.014758f, 0.001494f, -0.027115f, -0.025844f, -0.029997f, 0.016781f, 0.014696f, 0.048715f, 0.023047f, 0.009768f, 0.045526f, -0.012202f, 0.016547f, -0.016508f, 0.014275f, 0.008111f, 0.027145f, 0.043675f, 0.022929f, -0.009226f, -0.026729f, -0.016097f, -0.005419f, 0.024473f, -0.008064f, 0.006739f, 0.000976f, -0.011427f, 0.023303f, -0.001600f, 0.019136f, 0.014046f, -0.037249f, 0.030623f, 0.056538f, 0.008669f, 0.047297f, 0.045616f, 0.020780f, 0.015010f, 0.000135f, 0.024034f, -0.015032f, -0.055096f, -0.017872f, 0.040667f, 0.000418f, -0.020356f, 0.021037f, + 0.057810f, -0.013222f, 0.004284f, -0.041934f, 0.041164f, 0.037053f, -0.002851f, 0.011927f, -0.019091f, 0.095114f, -0.059849f, -0.051821f, -0.049074f, 0.004147f, 0.001571f, -0.014397f, 0.042234f, -0.059552f, -0.001189f, -0.038067f, 0.014379f, 0.016867f, -0.002854f, 0.041320f, 0.009350f, -0.003503f, -0.022553f, -0.000279f, 0.010255f, 0.030104f, -0.020819f, -0.026572f, 0.010900f, -0.015838f, -0.004348f, 0.003675f, 0.007040f, 0.002452f, -0.000012f, -0.002000f, -0.025170f, 0.002364f, 0.005810f, 0.017152f, -0.014974f, -0.008403f, 0.009496f, 0.004542f, 0.006548f, 0.000573f, -0.016520f, -0.001884f, -0.018728f, -0.014161f, 0.018464f, 0.009414f, 0.010314f, 0.007244f, -0.000827f, 0.003559f, -0.005248f, 0.011232f, 0.001358f, -0.005154f, -0.001291f, -0.016375f, -0.006317f, -0.010914f, 0.006380f, 0.103992f, -0.022923f, 0.057922f, 0.099927f, -0.034083f, 0.047911f, 0.021133f, -0.062933f, 0.057448f, 0.008740f, -0.027580f, 0.042401f, 0.017995f, 0.039840f, -0.000409f, -0.033592f, 0.031718f, 0.010952f, 0.000095f, 0.010031f, -0.009694f, -0.035531f, -0.021272f, -0.017001f, -0.030842f, -0.022815f, -0.005898f, + 0.023674f, -0.021253f, -0.012697f, -0.030377f, 0.006446f, 0.002530f, 0.004882f, 0.041536f, -0.024872f, 0.009964f, -0.023071f, -0.013117f, 0.023913f, -0.019133f, -0.042655f, -0.054914f, 0.063205f, 0.028005f, -0.015632f, 0.043492f, -0.040013f, -0.035147f, -0.021283f, -0.003574f, 0.006449f, 0.000238f, -0.037235f, -0.027482f, -0.029102f, -0.064176f, -0.039996f, -0.034603f, 0.012448f, 0.021452f, -0.001697f, 0.037169f, 0.007150f, -0.038420f, -0.033012f, 0.050169f, -0.042988f, 0.005984f, 0.044101f, -0.005872f, -0.075683f, 0.052841f, -0.027844f, 0.008306f, 0.003522f, 0.043687f, -0.010416f, -0.017023f, -0.002102f, -0.025330f, 0.013284f, -0.043539f, 0.014873f, -0.055926f, -0.035527f, 0.021314f, -0.023469f, -0.007068f, -0.002893f, -0.033321f, 0.011013f, -0.019578f, 0.016023f, -0.005323f, -0.000413f, 0.001410f, 0.020818f, -0.015171f, -0.011638f, 0.003338f, -0.020684f, -0.009529f, 0.003411f, -0.013953f, -0.014405f, -0.010372f, -0.005980f, -0.016232f, -0.008643f, 0.022177f, -0.018022f, 0.008369f, 0.013851f, -0.003608f, 0.014803f, -0.019673f, 0.002442f, -0.013928f, 0.028595f, 0.004973f, 0.010499f, -0.020128f, + 0.025174f, 0.016742f, 0.019362f, 0.007695f, 0.002797f, 0.005746f, 0.014205f, -0.013926f, 0.001877f, -0.050279f, 0.030130f, -0.014071f, 0.050998f, 0.035390f, -0.081610f, -0.010018f, 0.008615f, -0.049414f, -0.008129f, -0.007889f, 0.060198f, 0.043710f, 0.040203f, 0.050371f, -0.001911f, -0.034911f, -0.027250f, -0.027747f, 0.001281f, -0.077619f, 0.009296f, 0.066868f, -0.060814f, -0.109477f, 0.011116f, -0.040841f, 0.080862f, -0.000342f, 0.002593f, 0.054448f, -0.024928f, 0.011336f, -0.002585f, -0.014555f, 0.047042f, -0.013416f, 0.023757f, 0.079387f, -0.058381f, -0.033098f, -0.053222f, 0.026615f, 0.004312f, 0.053192f, -0.030516f, 0.021048f, 0.002718f, 0.048451f, 0.028337f, -0.023477f, -0.015844f, 0.018413f, -0.008867f, -0.002019f, -0.034259f, -0.033527f, 0.017520f, -0.007391f, -0.010074f, -0.019021f, 0.043579f, -0.016482f, -0.017737f, 0.073467f, 0.078257f, 0.050903f, -0.066828f, -0.005822f, -0.021132f, 0.025985f, 0.097480f, -0.012273f, -0.074625f, -0.004800f, -0.030861f, 0.043919f, 0.019417f, -0.049821f, 0.026071f, 0.019433f, 0.025423f, -0.048081f, -0.017559f, 0.003621f, 0.042416f, 0.002672f, + -0.007085f, 0.007029f, -0.014843f, 0.003391f, 0.042377f, 0.020719f, -0.017985f, -0.021306f, -0.005092f, 0.013439f, 0.016795f, 0.022515f, -0.021532f, -0.008088f, -0.039260f, -0.008195f, 0.024432f, -0.024514f, -0.004114f, -0.015159f, -0.014291f, -0.023046f, -0.005091f, 0.015616f, -0.003782f, -0.001727f, 0.003646f, 0.009913f, -0.010630f, -0.029432f, -0.030729f, 0.018281f, 0.013846f, 0.025569f, -0.013113f, 0.018725f, 0.054863f, 0.002765f, -0.033302f, -0.005452f, 0.002695f, -0.003119f, -0.020950f, -0.047945f, 0.007242f, -0.039356f, 0.036248f, 0.020783f, -0.038398f, 0.065490f, 0.099383f, 0.002765f, -0.004574f, -0.034047f, -0.034336f, 0.005731f, 0.005786f, -0.016814f, 0.089901f, -0.008165f, 0.067068f, 0.053640f, -0.067639f, -0.002202f, -0.022641f, -0.072487f, 0.018319f, 0.016708f, 0.039610f, 0.067687f, -0.002000f, -0.019441f, 0.022343f, 0.024486f, 0.053399f, 0.022254f, 0.004943f, 0.043821f, 0.046268f, 0.015809f, -0.010587f, 0.040175f, 0.017993f, 0.048297f, 0.010403f, 0.013855f, 0.030316f, 0.051156f, -0.008520f, -0.040742f, -0.046942f, -0.015438f, -0.016306f, 0.080521f, 0.044212f, 0.124349f, + -0.005783f, -0.062851f, 0.055250f, -0.019070f, -0.021480f, -0.018925f, -0.042331f, 0.006137f, 0.023792f, -0.001034f, -0.023714f, 0.088312f, -0.017651f, 0.104233f, -0.028576f, 0.056037f, 0.004913f, -0.017740f, -0.056947f, -0.081428f, 0.076240f, -0.007495f, -0.013026f, -0.023482f, 0.070851f, -0.000149f, -0.074358f, 0.136204f, 0.042854f, 0.014725f, -0.015656f, -0.057351f, 0.028659f, 0.001410f, 0.028846f, -0.026735f, 0.020572f, 0.010226f, -0.012876f, -0.019798f, 0.003516f, -0.023905f, -0.011165f, -0.027139f, 0.003139f, -0.004904f, -0.000377f, 0.008779f, 0.022247f, -0.022834f, 0.008691f, -0.011248f, -0.000706f, 0.029735f, 0.019915f, -0.010903f, -0.037497f, -0.001404f, -0.002271f, 0.004771f, 0.034151f, -0.022407f, -0.013178f, 0.008366f, 0.021395f, -0.031380f, 0.001997f, 0.020295f, -0.000567f, -0.002644f, -0.032633f, 0.016616f, -0.001147f, 0.015103f, -0.034113f, 0.003587f, 0.014276f, 0.011119f, 0.016671f, -0.032885f, -0.034445f, 0.022337f, 0.092375f, -0.054895f, -0.035330f, 0.007505f, 0.016641f, -0.010447f, 0.065353f, 0.050936f, 0.051397f, 0.017390f, 0.025347f, 0.043289f, 0.026668f, -0.015649f, + -0.025844f, -0.058082f, -0.009470f, 0.031958f, 0.010858f, 0.006930f, -0.021717f, -0.054929f, -0.016119f, -0.007673f, 0.055971f, 0.000815f, -0.006773f, 0.042550f, -0.006830f, 0.011805f, 0.008992f, -0.094612f, 0.024200f, 0.025622f, -0.016616f, -0.040417f, 0.007619f, -0.053331f, -0.027252f, -0.081712f, 0.024648f, -0.068213f, -0.135412f, 0.015771f, -0.001930f, 0.095364f, -0.003353f, 0.032434f, 0.078613f, -0.012835f, -0.020477f, 0.035024f, -0.000772f, -0.068604f, -0.024070f, 0.009084f, 0.011360f, 0.050719f, 0.021013f, 0.045172f, 0.039009f, -0.028046f, -0.021105f, 0.019281f, 0.057441f, -0.023893f, -0.012136f, -0.052751f, -0.036537f, 0.014077f, -0.071365f, 0.020730f, -0.080147f, 0.015273f, -0.021190f, 0.056897f, -0.024899f, 0.040346f, -0.085891f, -0.017430f, 0.011646f, -0.051015f, 0.012826f, 0.009104f, 0.008745f, -0.038467f, 0.020149f, -0.037666f, 0.010680f, -0.002832f, -0.016150f, -0.006841f, -0.003866f, 0.012118f, -0.013235f, -0.005961f, -0.010633f, 0.024608f, -0.016068f, 0.014404f, -0.036327f, 0.019144f, -0.002191f, -0.002855f, 0.005105f, 0.035165f, 0.012115f, 0.015063f, -0.042099f, 0.005532f, + -0.017320f, -0.051820f, 0.020741f, -0.016562f, -0.013302f, -0.019110f, 0.019231f, -0.009288f, 0.009219f, 0.010938f, -0.005124f, 0.002336f, -0.012834f, 0.003706f, 0.010504f, -0.002434f, -0.001691f, -0.019765f, 0.072589f, 0.077367f, 0.180809f, 0.021312f, -0.101191f, -0.075978f, -0.055925f, -0.064555f, 0.126566f, 0.168923f, 0.057282f, -0.016113f, -0.053110f, 0.001883f, -0.064277f, 0.070760f, 0.066908f, 0.019856f, 0.009700f, -0.041901f, -0.006057f, 0.077865f, 0.018166f, 0.031289f, 0.026370f, 0.081706f, 0.068750f, -0.026490f, -0.060743f, -0.080310f, -0.054126f, -0.008045f, 0.022393f, 0.073456f, 0.044061f, -0.015323f, 0.039815f, -0.055741f, -0.018973f, -0.125355f, -0.019797f, 0.123398f, 0.095369f, -0.019195f, 0.250029f, 0.078439f, 0.007336f, -0.137076f, -0.023360f, -0.011754f, -0.032158f, 0.035021f, 0.019439f, 0.029675f, 0.052474f, -0.111853f, -0.120498f, -0.060537f, -0.081292f, -0.011596f, 0.027529f, 0.101215f, -0.060537f, 0.037035f, 0.157745f, 0.078872f, 0.027459f, 0.044235f, 0.032185f, -0.095278f, -0.157715f, 0.080675f, -0.039025f, 0.034743f, 0.084442f, 0.093448f, 0.008232f, -0.056498f, + -0.074480f, -0.060697f, 0.065264f, 0.037760f, 0.011352f, 0.065181f, -0.064993f, -0.011279f, -0.010441f, -0.028748f, -0.033662f, -0.002863f, -0.001010f, 0.021148f, 0.006515f, -0.009321f, 0.000127f, -0.000819f, 0.001022f, 0.005580f, 0.012011f, 0.018825f, -0.018904f, -0.025721f, -0.088335f, -0.048304f, -0.043713f, 0.052092f, 0.030742f, 0.018614f, -0.072363f, -0.070772f, -0.114118f, -0.031122f, 0.044684f, 0.057270f, 0.074421f, 0.029223f, 0.021655f, 0.008672f, 0.007055f, -0.002168f, 0.016563f, -0.004037f, 0.053222f, 0.037778f, 0.007387f, 0.000375f, 0.000161f, -0.009232f, -0.000349f, -0.038457f, -0.165541f, -0.039445f, 0.092284f, 0.176712f, 0.155687f, 0.373256f, 0.195359f, 0.132561f, 0.116635f, 0.053087f, -0.020873f, -0.188551f, -0.236703f, -0.353119f, -0.270416f, -0.277399f, -0.105532f, 0.001404f, 0.106242f, 0.197655f, 0.163054f, 0.168517f, 0.116145f, 0.158562f, 0.124120f, 0.175561f, 0.083609f, 0.065492f, 0.031323f, -0.045109f, -0.069424f, -0.106330f, -0.064283f, -0.231010f, -0.097572f, -0.218643f, -0.157754f, -0.250251f, -0.148763f, -0.232937f, -0.082718f, -0.115443f, -0.037579f, 0.017901f, + 0.118303f, 0.310213f, 0.295392f, 0.413894f, 0.280146f, 0.191134f, 0.248147f, 0.338938f, 0.298272f, 0.250552f, 0.174820f, 0.021156f, -0.169400f, -0.168138f, -0.208471f, -0.396763f, -0.438060f, -0.477119f, -0.476472f, -0.523169f, -0.452493f, -0.381139f, -0.336163f, -0.218847f, 0.025224f, 0.249170f, 0.433328f, 0.572828f, 0.713996f, 0.794505f, 0.553876f, 0.528282f, 0.342832f, 0.207782f, 0.196309f, -0.011638f, -0.064784f, -0.304204f, -0.583212f, -0.628058f, -0.509907f, -0.394053f, -0.232184f, -0.187789f, -0.191308f, -0.105423f, -0.164287f, -0.066369f, -0.018234f, 0.126350f, 0.239674f, 0.197000f, 0.256200f, 0.275462f, 0.293726f, 0.259547f, 0.346274f, 0.257473f, 0.210864f, 0.109091f, 0.022414f, -0.058306f, -0.268206f, -0.237405f, -0.318417f, -0.422038f, -0.382509f, -0.438311f, -0.450635f, -0.131222f, 0.014758f, 0.229208f, 0.280336f, 0.298759f, 0.346533f, 0.362148f, 0.307051f, 0.267287f, 0.204812f, 0.155522f, 0.056172f, -0.039806f, -0.119426f, -0.215171f, -0.316481f, -0.296218f, -0.264675f, -0.197723f, -0.093227f, -0.040770f, -0.019498f, -0.011357f, 0.029165f, 0.061253f, 0.073917f, 0.079862f, + 0.065641f, 0.052875f, 0.056920f, 0.046689f, 0.034522f, 0.063773f, 0.071031f, 0.054793f, 0.026045f, 0.013525f, 0.020838f, 0.027059f, 0.006411f, -0.001161f, -0.002481f, -0.007501f, -0.011974f, -0.004983f, -0.003283f}, + {0.024074f, 0.001085f, 0.004053f, 0.003381f, -0.009811f, -0.005067f, 0.013338f, 0.023226f, 0.003744f, 0.012381f, -0.005017f, 0.002354f, -0.000638f, 0.010487f, -0.008297f, -0.018913f, 0.007657f, 0.008875f, -0.011034f, 0.012811f, 0.006303f, 0.011688f, 0.003696f, 0.002791f, -0.005097f, -0.001619f, 0.000611f, 0.007795f, 0.000704f, -0.011704f, 0.000517f, -0.000936f, 0.002536f, -0.001620f, 0.002089f, 0.002823f, 0.006984f, 0.005079f, 0.001668f, 0.002196f, 0.000693f, 0.003436f, -0.003609f, -0.005835f, -0.012982f, 0.002517f, 0.002852f, 0.001059f, 0.009941f, -0.003514f, 0.007724f, 0.002143f, -0.003090f, -0.006124f, -0.003975f, 0.013934f, 0.002975f, 0.007777f, 0.001287f, 0.003069f, -0.002683f, 0.000479f, 0.000922f, 0.004006f, -0.001215f, -0.005188f, -0.002821f, -0.010802f, 0.001187f, 0.002110f, 0.009224f, -0.002970f, 0.007046f, -0.001233f, 0.004606f, 0.000078f, 0.004146f, 0.003228f, 0.001922f, -0.001738f, 0.004768f, 0.006600f, 0.004592f, 0.004306f, -0.000175f, 0.000923f, 0.001053f, -0.003661f, 0.001505f, 0.000809f, 0.003182f, 0.001640f, 0.001292f, 0.001691f, 0.002265f, -0.001315f, + 0.001354f, -0.001010f, -0.000166f, 0.008924f, 0.008618f, 0.003933f, 0.003524f, 0.004705f, 0.005697f, 0.008424f, -0.003677f, 0.008741f, 0.000095f, 0.009340f, -0.002052f, 0.016631f, 0.005650f, 0.005490f, -0.011343f, -0.001598f, -0.002576f, -0.014761f, 0.008058f, 0.006784f, -0.004664f, -0.019335f, -0.008806f, -0.002916f, 0.009411f, 0.012941f, 0.008163f, -0.005195f, 0.002758f, -0.008302f, 0.000386f, 0.000701f, -0.006754f, -0.003376f, -0.017490f, 0.001424f, -0.002203f, -0.007338f, 0.000750f, 0.000988f, -0.002382f, -0.000575f, 0.016719f, -0.004044f, 0.013615f, 0.002631f, -0.010549f, 0.000759f, 0.001008f, 0.007641f, -0.003458f, 0.002151f, 0.001798f, 0.000564f, 0.010416f, 0.003598f, 0.010693f, 0.007855f, -0.005520f, 0.009743f, 0.004734f, 0.007107f, 0.000647f, 0.002304f, -0.002527f, -0.004675f, -0.008848f, -0.010891f, 0.011288f, -0.011315f, -0.008737f, -0.009365f, 0.005202f, 0.004697f, 0.002049f, 0.002019f, 0.006599f, -0.004306f, 0.004958f, -0.003260f, -0.004554f, 0.007207f, -0.006701f, 0.001089f, 0.003353f, -0.005650f, 0.001321f, 0.000778f, -0.000913f, -0.000917f, -0.000535f, 0.003762f, + -0.001288f, 0.001378f, -0.001728f, 0.002879f, -0.000859f, 0.001594f, -0.002065f, -0.015076f, -0.014017f, 0.003019f, 0.000280f, -0.003040f, 0.008401f, -0.001107f, -0.001461f, 0.008716f, -0.009598f, 0.001878f, -0.008378f, -0.005429f, -0.003024f, 0.000090f, 0.014247f, 0.016178f, -0.007515f, 0.006338f, -0.011654f, -0.001117f, -0.004562f, 0.015718f, -0.004648f, -0.000893f, 0.001646f, -0.022139f, -0.003850f, -0.010934f, -0.003603f, -0.002715f, 0.008247f, 0.010954f, 0.004489f, 0.014806f, -0.001895f, -0.006743f, -0.006841f, 0.008551f, 0.022222f, 0.015534f, -0.008665f, -0.010133f, 0.011119f, -0.009971f, 0.001902f, 0.003548f, 0.018211f, -0.006699f, -0.008966f, 0.001987f, -0.005559f, 0.003485f, 0.004648f, 0.011577f, -0.012666f, -0.008218f, 0.007444f, 0.013986f, -0.001273f, -0.006487f, -0.008224f, -0.019765f, 0.007521f, -0.000032f, 0.005913f, 0.000928f, 0.000536f, -0.003105f, 0.003653f, -0.005044f, 0.003158f, 0.004275f, 0.004335f, -0.007014f, 0.005183f, -0.001282f, -0.004898f, 0.000478f, -0.010352f, 0.006512f, 0.001013f, 0.000829f, -0.004093f, -0.001413f, -0.003457f, -0.007235f, -0.005462f, 0.003856f, + 0.000397f, 0.001564f, -0.001312f, 0.000514f, -0.000368f, -0.002065f, -0.001592f, -0.003019f, 0.000360f, -0.001730f, -0.001251f, -0.000419f, 0.000729f, -0.000529f, 0.001042f, -0.000552f, 0.003691f, 0.001414f, -0.002059f, 0.002482f, 0.001550f, -0.002838f, -0.036658f, -0.012079f, -0.001942f, 0.006247f, 0.004198f, 0.009111f, -0.017516f, -0.005256f, -0.000806f, -0.018172f, -0.012987f, 0.004543f, 0.010966f, 0.006425f, 0.012101f, -0.001572f, 0.006940f, 0.016113f, 0.014219f, 0.013356f, 0.007690f, -0.005189f, -0.004132f, -0.008325f, -0.003701f, -0.008365f, 0.017195f, 0.007973f, -0.002677f, -0.007674f, -0.004688f, -0.007837f, -0.011387f, -0.012292f, -0.015423f, 0.009229f, 0.006608f, -0.017129f, 0.003987f, -0.000956f, 0.011748f, 0.001732f, 0.005762f, 0.007566f, -0.016183f, -0.002597f, -0.000638f, 0.002049f, 0.008424f, 0.012767f, -0.005198f, -0.001961f, -0.003825f, -0.010264f, 0.003075f, 0.001924f, -0.001121f, -0.002883f, 0.009702f, 0.000420f, -0.005440f, -0.001940f, 0.004573f, 0.006117f, -0.002568f, -0.000401f, 0.001579f, -0.008959f, 0.006504f, -0.000809f, -0.013331f, 0.001399f, -0.016260f, 0.002445f, + 0.011993f, -0.004155f, -0.000543f, -0.018337f, -0.008943f, -0.013662f, -0.008267f, -0.001264f, -0.001459f, 0.008257f, 0.001577f, 0.009716f, -0.005979f, 0.003173f, 0.005293f, 0.001632f, 0.005207f, 0.000453f, -0.003602f, 0.001881f, -0.001643f, 0.001529f, 0.000098f, 0.000535f, -0.000724f, -0.002673f, -0.000980f, 0.002047f, -0.002465f, 0.001475f, 0.004115f, 0.001946f, 0.001021f, -0.000084f, 0.000081f, -0.001079f, -0.001678f, -0.002900f, 0.001950f, 0.002459f, -0.001639f, 0.001541f, -0.001729f, 0.020116f, 0.007600f, 0.003394f, -0.005014f, 0.014819f, 0.005764f, 0.008373f, 0.023509f, 0.025434f, 0.000992f, -0.004136f, -0.009000f, -0.013833f, 0.005100f, 0.010050f, -0.005180f, -0.001035f, 0.001461f, -0.002424f, -0.008097f, 0.009537f, -0.009305f, 0.004401f, -0.026900f, -0.003888f, -0.006527f, -0.006541f, -0.013277f, -0.002775f, -0.001692f, 0.000207f, -0.006789f, -0.009740f, -0.007644f, 0.001069f, -0.005053f, -0.010332f, 0.006214f, 0.008883f, 0.000760f, -0.008475f, -0.009481f, 0.003500f, -0.007292f, 0.008378f, -0.010438f, 0.006757f, 0.002480f, -0.000124f, -0.014887f, -0.013813f, 0.003241f, -0.010007f, + 0.016288f, 0.002909f, 0.013674f, -0.007060f, 0.013764f, 0.002681f, 0.008874f, 0.003014f, 0.008410f, -0.007703f, -0.010993f, -0.000218f, 0.017688f, -0.001718f, -0.011857f, -0.006298f, 0.007729f, -0.004929f, -0.006763f, 0.001798f, -0.018925f, 0.012814f, 0.015456f, -0.000952f, -0.013125f, -0.016593f, -0.000480f, 0.013975f, 0.010117f, -0.007900f, 0.010746f, 0.001126f, -0.001534f, -0.002079f, -0.001083f, -0.000889f, 0.002976f, -0.004675f, -0.004028f, 0.000369f, 0.001624f, -0.003511f, 0.001308f, -0.001640f, -0.000471f, 0.003717f, -0.001467f, -0.000796f, 0.000622f, -0.005843f, 0.003122f, 0.000784f, 0.000558f, 0.001363f, 0.001876f, -0.000245f, 0.000520f, -0.001140f, -0.001112f, -0.000871f, -0.000653f, 0.028933f, 0.005930f, 0.015906f, -0.006236f, 0.011923f, 0.008874f, 0.018554f, -0.013707f, -0.009769f, -0.003121f, 0.001105f, 0.013196f, -0.006159f, 0.020023f, -0.001454f, 0.011390f, 0.009852f, -0.005571f, 0.004074f, 0.011541f, 0.010688f, 0.002751f, 0.002981f, 0.010516f, -0.021651f, 0.003569f, 0.016813f, 0.013132f, -0.011687f, 0.014660f, -0.017254f, 0.010524f, -0.015215f, -0.007678f, -0.003976f, + 0.015902f, -0.003221f, 0.016650f, 0.003715f, 0.003598f, 0.000840f, -0.000548f, 0.006597f, 0.009776f, 0.021682f, 0.003418f, 0.018713f, -0.009191f, 0.013681f, 0.018011f, -0.000558f, -0.003220f, -0.006486f, 0.006970f, -0.025714f, -0.002128f, 0.002543f, -0.009625f, -0.015256f, -0.000851f, -0.000963f, -0.002056f, 0.006745f, -0.015708f, 0.007957f, 0.006938f, 0.009997f, -0.024773f, 0.008540f, 0.005966f, -0.014640f, -0.001715f, 0.008086f, 0.018245f, -0.023096f, -0.002857f, 0.001785f, -0.021833f, -0.001910f, 0.003215f, -0.006048f, 0.014360f, -0.003193f, 0.001254f, 0.004058f, -0.002509f, -0.000698f, -0.000975f, 0.002587f, -0.005649f, 0.000875f, -0.002929f, 0.001769f, 0.000520f, -0.003183f, -0.000348f, 0.004009f, -0.001758f, -0.000756f, 0.000102f, -0.004576f, -0.001751f, 0.000947f, -0.001770f, -0.002057f, -0.000660f, 0.000935f, -0.002557f, -0.001026f, 0.003230f, 0.004407f, -0.005595f, -0.000086f, 0.000916f, -0.025711f, -0.031512f, -0.025231f, -0.022786f, -0.000783f, 0.016053f, -0.033261f, 0.023677f, 0.015300f, -0.037345f, 0.023508f, 0.009981f, 0.008031f, 0.003712f, 0.003599f, 0.008463f, -0.005889f, + -0.006084f, -0.012296f, -0.000352f, 0.014308f, 0.012128f, 0.007037f, -0.021257f, 0.014512f, -0.015189f, 0.000391f, -0.013355f, 0.016658f, -0.008827f, -0.006927f, 0.005282f, -0.025041f, 0.002512f, -0.008315f, -0.007465f, -0.002697f, 0.001805f, 0.024572f, -0.011589f, -0.003798f, -0.009351f, 0.018679f, -0.011367f, -0.006167f, 0.005779f, 0.005593f, 0.005288f, 0.006587f, -0.007754f, 0.008989f, 0.002312f, -0.020556f, 0.028218f, 0.011183f, 0.004567f, 0.002902f, -0.000135f, -0.013185f, 0.016153f, 0.013485f, 0.005659f, 0.018056f, 0.001934f, 0.007920f, 0.018200f, 0.009217f, 0.003919f, -0.012593f, 0.014996f, -0.006637f, 0.028644f, -0.003181f, 0.000763f, -0.007880f, -0.030046f, 0.003859f, -0.007287f, -0.003646f, 0.015419f, -0.001387f, -0.016301f, -0.009365f, 0.013252f, 0.011006f, 0.001728f, 0.012764f, 0.003384f, -0.009534f, 0.004479f, -0.001004f, -0.003164f, -0.002725f, 0.001041f, 0.007504f, -0.003601f, 0.000833f, 0.001346f, 0.004169f, 0.001619f, -0.003573f, 0.005555f, 0.000692f, 0.001476f, -0.000452f, 0.001433f, 0.000562f, -0.002181f, 0.003053f, -0.002204f, 0.002488f, 0.002046f, -0.001760f, + 0.006258f, -0.000994f, 0.001539f, -0.002277f, -0.001425f, 0.018368f, 0.012497f, -0.002117f, -0.011529f, 0.030176f, 0.047954f, -0.006329f, -0.006677f, 0.023201f, 0.005625f, 0.007654f, 0.006135f, -0.034548f, 0.003785f, -0.022340f, 0.017851f, 0.025484f, -0.006712f, -0.012313f, 0.004140f, 0.016138f, -0.009715f, 0.019494f, -0.007681f, 0.037627f, -0.011034f, 0.007274f, -0.001877f, 0.010204f, 0.026777f, -0.010134f, 0.002606f, -0.002379f, 0.007718f, -0.009956f, -0.004839f, 0.015246f, 0.032849f, 0.002732f, 0.024036f, -0.008933f, 0.003277f, -0.004548f, 0.007982f, 0.017580f, 0.026198f, 0.020440f, 0.019389f, 0.020188f, 0.012734f, -0.003716f, 0.003066f, -0.002808f, 0.000454f, 0.003988f, -0.013186f, -0.003811f, 0.021089f, -0.018607f, 0.007344f, -0.008200f, -0.004957f, -0.009688f, -0.038345f, 0.004248f, 0.020695f, 0.013105f, -0.004787f, -0.018191f, -0.044192f, -0.007144f, 0.017890f, -0.003748f, 0.007018f, -0.013791f, 0.010195f, -0.012722f, 0.011583f, 0.024984f, -0.011058f, -0.013567f, -0.025043f, 0.007496f, 0.003007f, 0.004064f, -0.019819f, 0.001389f, 0.000039f, -0.006015f, 0.001055f, 0.009278f, + 0.000326f, 0.006367f, 0.002754f, 0.004111f, 0.004982f, -0.000912f, 0.007884f, 0.001870f, 0.000716f, -0.001692f, -0.002687f, -0.002235f, 0.007501f, 0.002528f, -0.000366f, 0.005068f, 0.002575f, 0.003649f, -0.000818f, 0.004190f, 0.005033f, 0.006938f, -0.003031f, 0.000712f, -0.002959f, -0.033144f, -0.026043f, 0.003233f, 0.015618f, -0.014994f, -0.009548f, 0.001757f, -0.007808f, -0.049534f, -0.042419f, 0.018402f, 0.017282f, 0.002994f, 0.002695f, -0.018233f, 0.028504f, 0.034267f, 0.021404f, -0.017899f, 0.016754f, 0.022450f, -0.003337f, -0.028808f, -0.012747f, 0.039475f, -0.011583f, 0.003834f, 0.002598f, 0.022119f, -0.017668f, -0.031955f, 0.007096f, 0.014487f, -0.007635f, 0.009224f, 0.020808f, -0.010137f, -0.007727f, -0.001068f, -0.044251f, -0.013003f, 0.015485f, -0.008574f, -0.029502f, 0.005248f, -0.000591f, -0.009473f, 0.006102f, -0.002934f, -0.027959f, -0.023997f, -0.041947f, -0.033627f, 0.006738f, 0.014642f, 0.001582f, -0.010155f, -0.013862f, 0.000221f, -0.009413f, 0.008867f, -0.020042f, 0.000565f, -0.006963f, -0.005970f, -0.006648f, -0.001953f, 0.008125f, -0.009328f, -0.040220f, 0.005950f, + -0.005604f, 0.009866f, 0.011305f, 0.000642f, 0.007924f, 0.009252f, 0.003203f, -0.002430f, 0.005155f, -0.005866f, 0.002503f, -0.012724f, -0.006443f, -0.005772f, -0.006693f, 0.002754f, 0.011381f, -0.005946f, 0.002003f, -0.014445f, 0.001901f, -0.001549f, -0.010364f, 0.004523f, -0.003124f, 0.002569f, 0.004611f, 0.002383f, 0.002204f, 0.008919f, 0.002239f, 0.001063f, 0.003282f, -0.000089f, 0.001511f, 0.001138f, -0.002305f, -0.006946f, -0.001080f, -0.007030f, 0.003550f, -0.005375f, 0.008041f, -0.000029f, 0.011402f, 0.005010f, -0.006402f, -0.004532f, -0.003354f, -0.000521f, 0.016120f, 0.051744f, 0.045991f, 0.035924f, -0.003826f, 0.035121f, 0.011404f, 0.049018f, 0.020777f, -0.001012f, 0.059824f, -0.012456f, -0.003121f, -0.038095f, -0.010037f, -0.000784f, -0.026852f, 0.016069f, 0.024015f, -0.007816f, -0.000329f, -0.021638f, -0.037081f, -0.021900f, -0.028271f, -0.008269f, -0.017078f, -0.005398f, -0.002686f, 0.016970f, 0.004313f, -0.003561f, -0.015283f, -0.005307f, -0.010203f, 0.005395f, 0.000399f, -0.015180f, 0.008001f, 0.010032f, 0.003975f, -0.011746f, -0.015382f, 0.005090f, 0.014206f, -0.002073f, + -0.000537f, -0.027237f, 0.048753f, 0.008129f, -0.009281f, -0.001386f, 0.004317f, 0.020813f, 0.017711f, -0.018403f, 0.010327f, -0.007238f, 0.002203f, -0.003165f, -0.004649f, -0.027944f, -0.024897f, -0.033452f, 0.005029f, -0.001481f, -0.007078f, 0.020864f, -0.006700f, 0.059058f, -0.005868f, -0.003288f, -0.014614f, -0.006611f, 0.007629f, 0.010070f, 0.007098f, -0.000606f, 0.025402f, 0.018138f, -0.003825f, -0.012431f, 0.003310f, -0.007464f, -0.000099f, 0.002271f, -0.008268f, -0.002835f, 0.000144f, -0.002885f, 0.003925f, -0.010215f, 0.005921f, 0.011126f, -0.003532f, 0.005768f, -0.003567f, -0.002924f, -0.004643f, 0.001706f, 0.006143f, -0.002807f, 0.008273f, 0.001429f, 0.002846f, 0.011415f, 0.004868f, -0.001703f, 0.012028f, 0.005314f, 0.008296f, 0.010794f, 0.008311f, 0.000762f, -0.000177f, 0.007943f, -0.007619f, 0.000072f, 0.004788f, 0.002531f, 0.005497f, 0.005062f, 0.002654f, 0.006545f, -0.031832f, -0.044664f, -0.025278f, 0.033671f, 0.026006f, -0.022711f, -0.024058f, 0.036086f, 0.021329f, -0.022441f, -0.031281f, -0.004882f, 0.004921f, 0.003611f, 0.004027f, -0.017881f, 0.018527f, -0.013301f, + 0.036612f, -0.005601f, -0.026366f, 0.006187f, 0.009093f, -0.000098f, 0.002462f, -0.011332f, -0.017274f, -0.000825f, 0.014666f, -0.009105f, 0.011081f, -0.018073f, -0.048927f, -0.039299f, 0.024578f, -0.030593f, 0.024230f, 0.007269f, 0.002502f, -0.010176f, 0.014079f, 0.004713f, -0.004221f, -0.006963f, 0.006394f, 0.014866f, -0.013724f, 0.041170f, -0.010750f, 0.013898f, -0.012773f, 0.003689f, -0.003862f, -0.016043f, 0.039297f, -0.030986f, 0.042782f, -0.001500f, -0.021847f, -0.032571f, 0.016296f, 0.005908f, 0.005027f, 0.001978f, 0.017159f, 0.011821f, 0.015513f, -0.033534f, -0.010574f, 0.000959f, 0.000068f, 0.008538f, -0.025849f, -0.012276f, -0.008804f, -0.004301f, -0.032265f, -0.006444f, -0.011129f, -0.035777f, -0.002402f, -0.020261f, 0.004733f, -0.009474f, 0.002217f, 0.004688f, 0.015191f, 0.009353f, -0.006512f, -0.000937f, -0.013697f, 0.007332f, -0.001464f, 0.006372f, -0.015998f, 0.000915f, -0.006751f, 0.003807f, -0.014800f, 0.002869f, 0.002668f, 0.000779f, -0.003752f, 0.005051f, -0.008952f, 0.006447f, -0.013642f, 0.005063f, -0.009956f, 0.004625f, 0.001857f, 0.006460f, -0.005475f, 0.016448f, + 0.005813f, 0.000304f, -0.010521f, -0.008093f, -0.002207f, 0.010996f, -0.002914f, -0.005305f, -0.005775f, 0.007546f, 0.006585f, 0.076853f, 0.025608f, -0.017119f, 0.039447f, 0.036777f, -0.019046f, -0.024218f, 0.059319f, -0.005317f, 0.013012f, -0.035208f, 0.086359f, 0.003008f, -0.024248f, 0.012530f, 0.004265f, 0.041938f, 0.000666f, 0.052965f, -0.038146f, 0.000792f, -0.041667f, 0.003177f, 0.029170f, 0.001326f, -0.025565f, 0.036080f, 0.019224f, 0.010594f, 0.008610f, -0.012672f, -0.012268f, 0.003235f, -0.018135f, 0.023592f, -0.021189f, -0.028178f, 0.024716f, 0.009336f, -0.032726f, 0.017637f, 0.002027f, -0.023792f, -0.013425f, -0.008012f, 0.012336f, -0.002895f, -0.014426f, 0.017315f, -0.021229f, -0.008471f, -0.007385f, 0.029038f, -0.019302f, 0.013968f, 0.022223f, 0.010238f, -0.013418f, -0.027373f, 0.017088f, -0.023433f, 0.031312f, -0.039827f, 0.052148f, -0.015646f, -0.007563f, -0.007600f, 0.023624f, -0.001886f, 0.008432f, 0.014076f, 0.008356f, 0.020072f, -0.019999f, -0.037832f, 0.002404f, 0.031800f, -0.021594f, -0.010310f, -0.022566f, -0.013596f, 0.005627f, -0.002421f, -0.006684f, 0.013621f, + 0.009690f, 0.007091f, -0.003795f, 0.020867f, 0.012636f, -0.010038f, -0.005455f, 0.003915f, 0.000828f, 0.017614f, 0.011020f, -0.001710f, -0.006128f, -0.004798f, 0.019188f, 0.001535f, -0.010329f, 0.012076f, 0.003368f, 0.000229f, 0.009963f, 0.004384f, -0.002169f, -0.010817f, 0.002577f, 0.012516f, -0.009884f, -0.002688f, 0.014236f, -0.001266f, -0.003404f, -0.004008f, 0.008232f, 0.001334f, -0.000157f, -0.004197f, -0.045603f, -0.006035f, 0.042377f, -0.012614f, -0.025849f, 0.011284f, -0.011944f, -0.002583f, 0.019415f, -0.045961f, -0.026449f, 0.017332f, 0.023855f, 0.031716f, -0.001895f, -0.006351f, 0.013280f, -0.003390f, -0.044749f, -0.031200f, 0.053459f, -0.004322f, -0.046120f, -0.027288f, -0.018329f, -0.015667f, 0.004707f, 0.015333f, 0.001236f, -0.008043f, -0.022815f, -0.035773f, 0.005175f, 0.004452f, -0.000846f, 0.028761f, -0.019412f, -0.055950f, 0.022986f, 0.016123f, -0.064636f, 0.038583f, -0.010116f, -0.033099f, -0.026657f, -0.002696f, 0.037426f, 0.008605f, -0.011850f, -0.013652f, 0.010984f, 0.019216f, -0.026977f, 0.020732f, 0.003794f, 0.015214f, -0.011444f, -0.028723f, 0.025695f, -0.000145f, + 0.028767f, -0.088252f, 0.011610f, 0.013376f, -0.012600f, 0.024251f, 0.028837f, 0.083476f, 0.002795f, -0.055465f, -0.025052f, -0.014638f, -0.053281f, -0.052921f, 0.003163f, -0.030134f, 0.000815f, -0.020084f, 0.020151f, -0.020431f, -0.019473f, 0.035137f, 0.009099f, -0.001367f, -0.001514f, 0.020561f, -0.003951f, -0.002229f, 0.012432f, 0.009705f, -0.007193f, 0.006591f, -0.018456f, -0.004299f, 0.005693f, -0.003699f, -0.005057f, -0.009225f, -0.009253f, -0.005086f, -0.011511f, 0.004675f, -0.014745f, 0.003179f, -0.002196f, 0.014130f, -0.002924f, -0.007528f, -0.005885f, -0.008653f, -0.008731f, -0.002538f, -0.005972f, -0.011226f, -0.007807f, 0.008093f, -0.010603f, -0.005752f, -0.019304f, 0.006036f, 0.008372f, 0.020338f, 0.005042f, -0.002658f, 0.001098f, -0.038388f, 0.006108f, 0.023699f, 0.021085f, -0.034067f, 0.060636f, 0.042294f, -0.019500f, 0.025300f, -0.049164f, -0.010891f, -0.016505f, 0.077567f, 0.049645f, -0.018454f, -0.029635f, -0.036189f, -0.008089f, 0.002074f, 0.014205f, 0.052046f, 0.011025f, 0.008862f, 0.011213f, 0.001461f, -0.017200f, 0.002118f, -0.003290f, 0.024002f, 0.032317f, 0.041054f, + 0.026663f, 0.017432f, -0.004072f, -0.007543f, 0.006486f, 0.037229f, 0.005854f, 0.006644f, -0.037839f, -0.019172f, 0.063823f, 0.025968f, 0.019175f, 0.000529f, 0.038237f, 0.020491f, 0.080596f, -0.004455f, 0.083100f, 0.005967f, -0.025790f, 0.026968f, -0.022450f, -0.016719f, -0.002934f, -0.015270f, 0.000929f, 0.015504f, 0.033264f, 0.005861f, -0.007061f, -0.036332f, 0.011773f, 0.003098f, 0.024050f, -0.028471f, 0.007649f, -0.012520f, 0.004343f, -0.036231f, 0.018488f, -0.031864f, -0.003840f, -0.043405f, -0.059801f, -0.009869f, -0.009302f, 0.049401f, 0.013330f, -0.001407f, 0.009288f, 0.015505f, 0.019263f, 0.003392f, -0.000677f, 0.000943f, -0.034624f, 0.011145f, 0.000557f, 0.032487f, -0.013062f, -0.001410f, -0.008580f, 0.023149f, 0.004643f, 0.021170f, -0.000181f, -0.024188f, 0.011959f, -0.001060f, 0.008139f, -0.018321f, -0.008317f, 0.004677f, 0.005188f, -0.013545f, 0.001395f, 0.012883f, 0.007938f, -0.011867f, -0.013400f, 0.024019f, -0.023839f, 0.010244f, -0.007307f, -0.019206f, 0.006249f, 0.004768f, 0.006300f, 0.008429f, -0.008864f, -0.000798f, 0.011471f, 0.001267f, 0.008004f, -0.003008f, + -0.009062f, -0.008927f, -0.020280f, -0.031094f, 0.009510f, -0.035665f, -0.000019f, 0.042943f, 0.013545f, 0.036591f, -0.042530f, -0.019739f, 0.020909f, 0.004178f, 0.060966f, -0.031076f, 0.036474f, -0.013901f, -0.018402f, -0.045527f, -0.017601f, -0.024533f, 0.030490f, 0.006993f, -0.040417f, 0.050558f, -0.026163f, -0.024516f, 0.004958f, 0.019614f, -0.014779f, 0.034922f, -0.016971f, -0.024510f, -0.012524f, 0.011500f, -0.004253f, -0.006839f, 0.003826f, 0.034802f, -0.023659f, 0.063819f, -0.024809f, -0.000977f, 0.059293f, -0.012054f, 0.010456f, -0.080993f, 0.003612f, 0.014297f, -0.018230f, 0.035505f, -0.064844f, -0.079500f, 0.030131f, -0.014241f, 0.043893f, -0.032921f, -0.030922f, 0.003368f, -0.010166f, 0.067283f, -0.008202f, -0.003259f, 0.015037f, -0.062830f, 0.003575f, -0.063491f, -0.025361f, 0.003475f, 0.015137f, -0.079225f, -0.035285f, -0.009880f, -0.003857f, 0.025413f, -0.033913f, 0.040300f, -0.016622f, 0.004373f, -0.051939f, -0.002806f, -0.045889f, 0.017164f, 0.009937f, 0.033981f, 0.043538f, -0.016395f, 0.028555f, 0.003689f, -0.009337f, 0.014422f, 0.009137f, -0.014191f, -0.014185f, -0.025273f, + -0.000891f, -0.015106f, -0.015596f, 0.005236f, -0.003662f, 0.021462f, -0.029031f, -0.005239f, -0.018239f, 0.007031f, 0.010621f, -0.010272f, -0.001310f, -0.015644f, -0.015395f, 0.017169f, 0.028514f, 0.031854f, 0.006638f, 0.001891f, -0.008551f, 0.005897f, 0.005369f, -0.012292f, -0.019212f, 0.006421f, -0.010078f, -0.014325f, 0.021751f, 0.014911f, 0.012746f, -0.020003f, -0.022807f, -0.048934f, 0.039902f, -0.034980f, -0.010044f, 0.032040f, 0.073206f, -0.020664f, 0.060004f, 0.021554f, 0.015495f, -0.027653f, 0.066476f, 0.010689f, 0.031034f, 0.003183f, -0.038946f, 0.014475f, -0.039108f, -0.038667f, 0.024369f, -0.038517f, -0.008324f, -0.008779f, 0.039420f, 0.003693f, -0.013173f, 0.013079f, 0.017564f, -0.007791f, -0.037089f, -0.008385f, 0.028610f, 0.069510f, 0.015985f, -0.038642f, 0.004329f, -0.007152f, 0.016623f, 0.021336f, 0.035112f, -0.015173f, 0.000835f, 0.023044f, 0.005260f, -0.000856f, 0.046300f, 0.042130f, 0.049793f, 0.017502f, 0.041837f, 0.006056f, 0.025089f, -0.019356f, -0.003528f, 0.005886f, -0.038930f, 0.003267f, 0.065783f, -0.008031f, -0.014467f, 0.014181f, -0.001044f, 0.018027f, + -0.039268f, 0.052200f, -0.032627f, -0.014212f, -0.008995f, 0.002982f, 0.006015f, 0.006995f, -0.057109f, 0.072243f, -0.015706f, -0.022696f, -0.008643f, 0.061391f, -0.007083f, 0.013030f, -0.048440f, -0.033303f, 0.000843f, 0.025730f, 0.023218f, 0.039364f, -0.062909f, -0.019340f, 0.059922f, -0.021270f, 0.006471f, 0.051727f, 0.012079f, 0.011556f, -0.003523f, 0.002074f, -0.019815f, -0.001226f, 0.004725f, 0.014974f, -0.009073f, 0.012512f, -0.022848f, -0.012440f, 0.001027f, -0.006112f, -0.004108f, -0.052432f, -0.041052f, 0.003619f, 0.026307f, -0.024615f, -0.042818f, -0.017143f, -0.035221f, 0.010068f, 0.001266f, -0.013143f, 0.033245f, -0.009414f, 0.013404f, 0.015587f, -0.018563f, -0.012648f, -0.003372f, 0.004344f, -0.001685f, 0.025540f, -0.000726f, 0.001820f, -0.012610f, -0.002551f, -0.019653f, 0.117547f, -0.006900f, 0.023543f, -0.000981f, -0.012112f, 0.003323f, -0.054404f, -0.023208f, -0.016745f, 0.021147f, 0.015063f, 0.026610f, 0.003019f, -0.028607f, 0.029959f, -0.024296f, 0.034544f, 0.025449f, -0.028004f, -0.029971f, 0.003539f, 0.042298f, -0.043392f, 0.018169f, 0.019957f, -0.024768f, 0.011005f, + -0.003196f, 0.015114f, -0.001919f, -0.063247f, 0.035463f, 0.021763f, -0.053267f, 0.064249f, -0.034063f, -0.008207f, -0.021085f, 0.051862f, -0.010280f, -0.044153f, -0.000074f, 0.000653f, 0.042894f, 0.043598f, 0.002908f, -0.033639f, 0.048916f, -0.007899f, 0.008659f, -0.062027f, 0.048872f, 0.019923f, 0.002983f, -0.035577f, -0.026923f, -0.003771f, 0.017039f, -0.028579f, -0.051079f, -0.021735f, 0.040448f, 0.025072f, -0.005915f, 0.065619f, 0.003979f, -0.010596f, -0.047223f, 0.057927f, -0.053695f, -0.017281f, 0.059170f, 0.018762f, 0.007751f, -0.022125f, 0.009277f, 0.058363f, 0.013037f, 0.025664f, 0.036997f, -0.095181f, -0.020763f, -0.015690f, -0.007768f, -0.039373f, -0.006875f, -0.004514f, 0.058046f, 0.015877f, 0.004063f, 0.029632f, 0.041532f, 0.029188f, -0.020336f, 0.011267f, 0.024937f, -0.004669f, 0.009764f, 0.010932f, 0.013421f, 0.008817f, 0.041331f, 0.022541f, 0.002782f, -0.011678f, -0.018292f, -0.035310f, 0.005439f, 0.000360f, 0.009885f, 0.012028f, 0.005837f, 0.062253f, -0.008205f, 0.022755f, 0.013723f, -0.016471f, -0.048819f, -0.007554f, -0.017862f, -0.030195f, -0.032652f, 0.006122f, + -0.005088f, -0.039395f, 0.000508f, 0.015644f, -0.003541f, -0.003417f, 0.014330f, -0.009320f, -0.030040f, -0.047135f, 0.001495f, -0.052768f, 0.049356f, 0.077127f, 0.035807f, 0.043871f, -0.067346f, -0.060034f, -0.047185f, 0.004500f, 0.083448f, -0.015493f, 0.031001f, 0.054231f, 0.027317f, -0.030028f, 0.001751f, 0.039575f, -0.051174f, -0.042787f, -0.036717f, 0.041467f, 0.028898f, -0.053675f, -0.075747f, 0.102570f, 0.063250f, -0.073292f, 0.033077f, -0.008657f, 0.030297f, 0.003146f, -0.022214f, -0.050944f, 0.046362f, -0.001356f, -0.037759f, -0.056533f, 0.014372f, 0.013083f, -0.014329f, 0.001388f, -0.005292f, -0.027956f, -0.012306f, -0.014781f, 0.026118f, -0.049560f, 0.054486f, -0.037423f, 0.001948f, 0.085721f, -0.082866f, -0.020101f, 0.078099f, 0.005596f, 0.018219f, -0.011714f, -0.024542f, 0.024429f, -0.009163f, -0.034561f, 0.004394f, -0.078690f, 0.133186f, -0.013201f, -0.147073f, 0.055539f, 0.144883f, 0.085459f, -0.179298f, -0.052210f, 0.033795f, 0.012880f, -0.027406f, -0.041394f, 0.022239f, 0.054698f, -0.067552f, -0.018676f, -0.117770f, -0.020351f, 0.040494f, 0.014774f, -0.036089f, -0.058924f, + 0.023023f, 0.051564f, -0.001244f, -0.015941f, -0.028365f, 0.040983f, 0.024236f, 0.016649f, -0.003606f, -0.012401f, 0.004732f, 0.022890f, 0.017650f, -0.004198f, -0.047300f, -0.029386f, 0.048893f, 0.020999f, -0.025440f, -0.017160f, 0.035029f, 0.011757f, -0.005084f, -0.071523f, -0.032954f, -0.035672f, 0.039975f, 0.010999f, 0.008606f, -0.007430f, 0.000843f, 0.039048f, -0.008115f, -0.006940f, -0.034263f, 0.006760f, -0.011204f, 0.054523f, 0.011392f, -0.012198f, 0.006451f, 0.055046f, -0.007346f, -0.037164f, 0.008553f, 0.036581f, 0.085434f, -0.035787f, 0.027837f, -0.045173f, -0.119821f, 0.064721f, -0.030186f, -0.065484f, -0.045435f, -0.066943f, 0.032114f, 0.022409f, -0.090161f, 0.057963f, -0.031440f, -0.002171f, -0.001123f, -0.046162f, 0.035662f, 0.035667f, 0.031329f, -0.002848f, 0.040991f, 0.021564f, -0.024909f, 0.002400f, -0.051433f, -0.018478f, -0.045638f, -0.031663f, -0.002279f, 0.074273f, -0.061955f, -0.013065f, -0.013391f, -0.055315f, 0.032479f, -0.062411f, 0.032372f, 0.028284f, -0.042528f, 0.033664f, -0.068337f, 0.019797f, -0.059425f, 0.038710f, -0.022302f, -0.031193f, -0.032608f, -0.048197f, + -0.013117f, 0.024566f, 0.042115f, -0.048918f, 0.032754f, 0.018594f, 0.051299f, 0.063384f, 0.036545f, -0.052294f, -0.024469f, -0.098527f, -0.025046f, -0.028456f, 0.032746f, -0.115020f, -0.021961f, -0.068319f, -0.006054f, 0.068980f, 0.063170f, 0.041814f, 0.014617f, 0.092810f, 0.101286f, 0.090493f, -0.031133f, -0.040344f, 0.034189f, 0.088591f, 0.163262f, 0.012040f, 0.038125f, 0.020160f, -0.008880f, 0.030439f, -0.029587f, 0.018048f, -0.007796f, -0.000191f, -0.019122f, 0.030883f, 0.035305f, -0.012130f, -0.029463f, -0.021996f, 0.026704f, 0.012122f, 0.030300f, -0.016457f, 0.011651f, -0.005803f, -0.013661f, -0.008464f, 0.030085f, 0.060022f, 0.028401f, -0.030771f, 0.015600f, -0.010479f, 0.021235f, 0.009823f, 0.010409f, 0.029481f, -0.019018f, -0.039119f, 0.003088f, 0.030507f, 0.023549f, 0.008394f, -0.006068f, -0.013317f, -0.054262f, 0.053367f, 0.014661f, -0.012273f, -0.056411f, -0.012906f, -0.038821f, 0.019506f, -0.018878f, 0.013907f, 0.106861f, -0.063105f, 0.039811f, 0.048828f, -0.022734f, 0.004596f, 0.018411f, -0.005802f, 0.051705f, 0.002824f, 0.037366f, -0.047929f, -0.007043f, 0.041958f, + 0.006642f, -0.065101f, 0.041986f, -0.025921f, -0.021494f, -0.024784f, -0.006735f, -0.024176f, 0.024478f, 0.034687f, 0.016571f, -0.005927f, -0.018423f, 0.030098f, -0.010048f, -0.047827f, 0.038974f, -0.080820f, -0.020656f, -0.016581f, -0.018053f, 0.046237f, 0.050255f, 0.090694f, -0.026859f, 0.038831f, -0.001714f, 0.017531f, 0.059141f, -0.004288f, 0.006076f, -0.039583f, -0.125111f, 0.061845f, 0.011630f, -0.060240f, -0.041579f, 0.006124f, 0.032361f, -0.005727f, -0.035648f, 0.018365f, -0.036547f, 0.047717f, 0.026332f, -0.020785f, -0.043784f, 0.086478f, 0.009230f, 0.004597f, -0.008215f, 0.011993f, 0.005823f, 0.003774f, -0.029362f, -0.061458f, 0.016706f, -0.009004f, -0.022163f, -0.056646f, -0.014226f, -0.001686f, 0.050224f, 0.020825f, -0.063941f, 0.037092f, 0.006320f, -0.002437f, -0.007357f, 0.020679f, 0.026226f, -0.005279f, -0.012194f, -0.004542f, -0.011558f, 0.009766f, 0.015462f, -0.000731f, 0.008738f, 0.017656f, -0.006835f, 0.025505f, 0.010557f, 0.007803f, 0.013118f, -0.007242f, 0.031682f, 0.005352f, -0.007083f, 0.020833f, -0.025563f, 0.008074f, 0.014220f, -0.006042f, -0.011111f, 0.028752f, + 0.041209f, -0.037229f, -0.007194f, -0.013165f, -0.013049f, 0.014774f, 0.012554f, -0.023424f, 0.012617f, 0.010303f, 0.008948f, 0.010784f, -0.021274f, 0.014896f, -0.001917f, 0.008745f, -0.006923f, 0.005972f, 0.118911f, 0.060648f, 0.119655f, -0.110491f, 0.009554f, 0.057432f, -0.022277f, 0.065416f, 0.126252f, 0.069282f, 0.004026f, -0.034019f, -0.035080f, 0.006545f, 0.054717f, 0.058594f, 0.013313f, -0.000147f, -0.087136f, -0.017960f, 0.085931f, 0.028429f, -0.023969f, 0.047459f, -0.040377f, -0.056481f, -0.015515f, -0.003771f, 0.066438f, 0.086773f, 0.077954f, 0.029537f, -0.030222f, -0.046458f, -0.086188f, -0.085701f, 0.074645f, 0.031305f, 0.006117f, 0.115284f, 0.006984f, -0.035300f, -0.047177f, -0.047933f, 0.023316f, 0.049254f, 0.039199f, 0.075621f, 0.005370f, 0.054413f, -0.003568f, -0.009780f, 0.027565f, 0.050380f, 0.036855f, 0.032017f, -0.028737f, -0.010886f, -0.022666f, -0.051102f, -0.040942f, -0.074475f, -0.024928f, 0.019967f, -0.012227f, 0.054182f, 0.065135f, -0.001061f, 0.000618f, -0.026668f, -0.047612f, 0.009823f, 0.062939f, -0.003626f, 0.034837f, 0.015280f, -0.004569f, -0.019716f, + -0.009065f, 0.005761f, 0.021977f, 0.017135f, -0.016818f, -0.035230f, -0.043551f, -0.040866f, -0.015833f, 0.016607f, -0.004250f, -0.025679f, -0.013137f, -0.017816f, -0.015061f, 0.008437f, -0.002271f, 0.024137f, 0.034531f, 0.007763f, -0.041975f, -0.021569f, -0.025143f, -0.005696f, 0.028332f, 0.006854f, 0.006976f, -0.034316f, -0.032511f, -0.037041f, -0.019019f, 0.032377f, 0.022053f, 0.027954f, 0.015017f, -0.013486f, -0.016717f, 0.011886f, 0.010732f, -0.002858f, 0.007280f, -0.014133f, -0.011391f, 0.008461f, 0.005929f, 0.011707f, -0.006813f, -0.014039f, -0.006483f, -0.010745f, -0.002031f, -0.063164f, -0.123185f, 0.048606f, 0.200874f, 0.204245f, 0.172882f, 0.125268f, -0.077322f, -0.088180f, -0.095292f, -0.126731f, -0.193939f, -0.156231f, -0.135704f, 0.062990f, 0.145763f, 0.108407f, 0.234429f, 0.181190f, 0.094462f, -0.034872f, -0.063208f, -0.157617f, -0.123066f, -0.121848f, -0.024938f, -0.074670f, -0.060659f, 0.018060f, 0.032952f, 0.066384f, 0.066613f, 0.091417f, 0.090662f, 0.116989f, 0.068205f, 0.029990f, -0.017072f, -0.019789f, -0.051536f, -0.077940f, -0.094130f, -0.115043f, -0.075383f, -0.141293f, + -0.094171f, -0.070672f, 0.070646f, 0.134020f, 0.144506f, 0.099972f, 0.068080f, 0.106698f, 0.081607f, 0.102398f, 0.080438f, 0.028180f, -0.038096f, -0.179431f, -0.126933f, -0.129365f, -0.200754f, -0.125953f, -0.109040f, -0.105806f, 0.038361f, 0.106329f, 0.168852f, 0.139039f, 0.198516f, 0.178172f, 0.174201f, 0.124187f, -0.067908f, -0.061460f, -0.139600f, -0.184568f, -0.203382f, -0.166815f, -0.080136f, -0.022812f, -0.042239f, 0.054915f, 0.145354f, 0.102458f, 0.069163f, 0.116570f, 0.097935f, 0.034942f, -0.023218f, -0.023387f, -0.007709f, -0.028672f, -0.078429f, -0.049318f, -0.056088f, -0.030360f, -0.025251f, -0.058456f, -0.021772f, 0.019958f, -0.019728f, 0.064457f, 0.085099f, 0.093509f, 0.098914f, 0.006014f, 0.029393f, 0.028758f, -0.008652f, -0.135913f, -0.108504f, -0.084817f, -0.075782f, -0.059713f, -0.056656f, 0.062291f, 0.093131f, 0.101236f, 0.096878f, 0.079836f, 0.054674f, 0.049182f, -0.000986f, -0.014880f, -0.078747f, -0.106216f, -0.095140f, -0.079411f, -0.050754f, -0.033145f, 0.003545f, 0.047454f, 0.096582f, 0.072208f, 0.045836f, 0.033064f, 0.008821f, -0.001022f, -0.000310f, -0.019750f, + -0.025628f, -0.021343f, -0.025085f, 0.005387f, -0.009736f, -0.034471f, 0.003959f, 0.015582f, -0.006601f, -0.009174f, -0.007624f, 0.003133f, 0.005732f, -0.007803f, 0.001490f, 0.008673f, 0.002502f, 0.000940f, 0.000034f} + }, + { + {-0.006192f, 0.006233f, 0.005383f, 0.011961f, -0.016344f, 0.003472f, 0.010816f, 0.019685f, -0.002106f, 0.011068f, -0.000443f, 0.010044f, 0.002462f, 0.015432f, -0.000290f, -0.005075f, 0.010451f, 0.014785f, 0.014081f, 0.008243f, 0.002291f, -0.005784f, -0.004492f, 0.001334f, 0.007197f, -0.003707f, 0.003358f, 0.000822f, 0.008179f, -0.004010f, -0.000203f, 0.001968f, -0.009709f, -0.005726f, -0.002837f, -0.010234f, 0.002460f, -0.002942f, -0.000059f, -0.001457f, -0.008433f, 0.006511f, 0.010117f, -0.002164f, 0.000840f, 0.000849f, -0.001581f, 0.010625f, -0.012959f, -0.000123f, 0.005407f, 0.001355f, 0.001748f, -0.003208f, -0.010727f, -0.002839f, 0.004218f, 0.004858f, 0.005535f, -0.001071f, 0.000224f, -0.000024f, 0.002216f, -0.001925f, 0.011303f, 0.000216f, -0.000955f, -0.007486f, 0.001036f, -0.005392f, -0.004041f, 0.004341f, 0.004881f, 0.011510f, 0.000449f, 0.011314f, 0.001337f, 0.001128f, 0.000808f, -0.006147f, 0.000413f, -0.002259f, -0.003030f, 0.001122f, 0.003696f, -0.002422f, 0.001517f, -0.002503f, 0.002943f, -0.003146f, -0.000898f, -0.001674f, 0.001721f, -0.001087f, 0.001610f, -0.001474f, + 0.001890f, 0.003127f, 0.001662f, -0.001709f, -0.000383f, -0.000939f, -0.000748f, 0.000805f, 0.000737f, 0.012926f, 0.020968f, 0.002802f, 0.010439f, -0.003792f, 0.006201f, 0.008089f, -0.002488f, -0.006493f, 0.010995f, 0.018957f, -0.003717f, 0.002101f, 0.007337f, -0.009082f, 0.005653f, 0.008091f, -0.016575f, 0.004659f, 0.001621f, -0.003733f, 0.000004f, -0.017265f, 0.000705f, 0.004832f, -0.008204f, 0.001515f, 0.000292f, 0.011054f, 0.007901f, -0.004155f, -0.001179f, -0.001054f, -0.011750f, -0.007906f, 0.001295f, 0.004744f, 0.001065f, 0.005271f, -0.007762f, 0.001169f, 0.003880f, 0.000798f, -0.007186f, -0.005267f, -0.001591f, 0.002498f, 0.005818f, 0.006012f, 0.004015f, 0.007019f, 0.006876f, -0.007719f, -0.002359f, 0.000309f, 0.009773f, -0.001491f, 0.007013f, -0.004615f, -0.004770f, -0.001481f, -0.008778f, -0.004056f, 0.001802f, 0.005120f, -0.007492f, 0.007332f, -0.002073f, -0.002194f, -0.001462f, -0.002975f, -0.003788f, 0.001513f, 0.005708f, 0.002124f, 0.009527f, -0.013217f, -0.010650f, -0.002350f, 0.003950f, -0.000145f, -0.002170f, 0.002016f, 0.000299f, 0.002446f, 0.004022f, 0.006729f, + 0.000123f, -0.000401f, 0.001597f, -0.000629f, -0.000095f, 0.001034f, -0.003073f, -0.001656f, -0.006378f, 0.002517f, 0.012185f, 0.017168f, 0.009994f, -0.004345f, 0.007403f, -0.004526f, -0.003005f, -0.014724f, -0.011680f, 0.005279f, 0.011278f, 0.010991f, 0.011497f, 0.002541f, 0.000641f, 0.007090f, -0.009456f, 0.009516f, 0.007744f, 0.000695f, 0.006655f, 0.017021f, 0.011612f, 0.003231f, -0.012223f, 0.000339f, 0.004137f, 0.002625f, 0.002041f, -0.013432f, 0.003233f, 0.002452f, 0.008999f, 0.009894f, -0.003094f, 0.006348f, -0.004806f, -0.005374f, 0.007236f, 0.004077f, -0.012823f, -0.012171f, -0.005306f, -0.006847f, -0.005065f, -0.005443f, -0.014818f, -0.013444f, -0.001199f, 0.004828f, -0.000070f, -0.001436f, -0.009981f, 0.001313f, 0.011880f, -0.003349f, -0.003734f, 0.004450f, -0.000010f, 0.008562f, 0.004327f, 0.004365f, -0.005523f, -0.006854f, 0.012754f, 0.005809f, -0.005088f, 0.008373f, -0.001106f, 0.006522f, -0.005523f, 0.001009f, 0.009417f, -0.003595f, -0.003038f, 0.006759f, 0.000841f, 0.002678f, 0.004047f, -0.004704f, 0.005285f, -0.002224f, 0.004331f, 0.004328f, 0.003375f, -0.003028f, + 0.001108f, -0.001523f, -0.002545f, -0.003295f, 0.000189f, 0.000360f, 0.002132f, 0.001794f, 0.000500f, -0.000199f, 0.001674f, 0.000488f, 0.001166f, -0.023761f, -0.013971f, -0.004391f, 0.004512f, -0.009804f, 0.002995f, -0.002695f, 0.006843f, -0.001676f, -0.013290f, -0.010593f, 0.009207f, 0.007512f, 0.019034f, 0.016786f, -0.002549f, 0.012139f, -0.018289f, -0.002996f, 0.014223f, 0.004265f, 0.003301f, -0.001895f, -0.005975f, -0.002808f, 0.001967f, -0.001654f, -0.000556f, 0.007175f, -0.008971f, 0.001978f, 0.003257f, -0.000239f, 0.005659f, -0.006189f, -0.005057f, 0.003233f, -0.003935f, 0.005037f, -0.010032f, 0.001637f, -0.006030f, -0.002396f, -0.006716f, -0.005048f, -0.007629f, -0.011328f, 0.006917f, -0.000102f, 0.011799f, -0.011075f, -0.009469f, -0.000109f, 0.002249f, -0.001329f, -0.002285f, 0.000748f, 0.007099f, 0.003374f, 0.001515f, -0.004893f, -0.004706f, -0.002694f, -0.008841f, 0.001367f, -0.002306f, 0.000998f, -0.000437f, -0.009535f, -0.000820f, -0.000792f, -0.010081f, 0.000238f, -0.001922f, 0.001128f, -0.001722f, -0.011241f, 0.000985f, 0.004991f, -0.002253f, 0.007356f, 0.002018f, -0.004002f, + 0.003088f, 0.007719f, 0.002525f, 0.001294f, 0.001726f, -0.001692f, 0.000933f, 0.006027f, -0.000508f, -0.001012f, 0.002202f, 0.002447f, 0.000930f, 0.001963f, 0.000396f, 0.000794f, -0.004101f, 0.000400f, -0.000363f, -0.002044f, -0.001502f, -0.001520f, -0.002114f, 0.000264f, -0.001745f, 0.008253f, -0.012686f, 0.005160f, -0.014188f, -0.002484f, 0.000772f, -0.010531f, 0.009979f, 0.007553f, -0.021104f, -0.002147f, 0.003627f, -0.001962f, -0.009198f, -0.012423f, 0.002625f, -0.006257f, -0.010270f, -0.005104f, 0.006186f, 0.005424f, 0.015076f, 0.019523f, -0.001640f, 0.017444f, -0.010649f, 0.006853f, 0.007661f, -0.001566f, 0.007546f, -0.004311f, 0.000218f, -0.001157f, -0.003541f, -0.001887f, -0.003972f, 0.014521f, -0.000762f, -0.010865f, -0.002537f, 0.007258f, 0.004580f, 0.005797f, 0.001214f, -0.005097f, 0.010679f, 0.021622f, 0.001401f, 0.002151f, 0.001319f, -0.001646f, 0.003478f, -0.001491f, 0.012421f, -0.009499f, 0.011882f, 0.008165f, -0.007475f, 0.003815f, 0.007752f, 0.005235f, -0.008971f, -0.009806f, -0.019251f, -0.003200f, -0.001785f, 0.002401f, 0.007494f, -0.001863f, 0.004891f, -0.001690f, + -0.005093f, -0.005159f, 0.009994f, -0.002325f, 0.010597f, -0.015643f, -0.006124f, 0.003530f, -0.009860f, 0.002516f, 0.010655f, 0.000954f, -0.000052f, 0.000725f, 0.002291f, 0.001404f, -0.005968f, -0.001976f, -0.000955f, 0.000813f, -0.001044f, 0.001890f, 0.002746f, 0.001344f, -0.001717f, -0.004090f, 0.004425f, 0.001635f, 0.001732f, 0.001085f, 0.001296f, 0.000251f, 0.000126f, -0.002016f, 0.001851f, 0.000793f, 0.000730f, 0.000244f, 0.001941f, 0.001216f, 0.002323f, -0.002767f, -0.001629f, -0.003236f, -0.002926f, -0.000865f, 0.002323f, -0.001928f, 0.000218f, 0.005607f, 0.002482f, 0.000285f, 0.007534f, 0.021865f, 0.025771f, -0.006691f, -0.000599f, 0.005434f, -0.003902f, 0.016697f, 0.016287f, -0.010255f, 0.015965f, 0.012557f, 0.004829f, 0.007284f, 0.006501f, 0.003331f, -0.001411f, 0.001166f, 0.002134f, -0.008810f, -0.010796f, 0.002832f, -0.003032f, -0.000132f, 0.001850f, -0.009530f, 0.009602f, 0.019311f, -0.000620f, -0.011586f, 0.018863f, 0.002295f, 0.000559f, 0.007411f, -0.003338f, -0.005665f, 0.002724f, -0.007105f, 0.002809f, 0.019277f, 0.008234f, -0.000147f, 0.006864f, 0.010473f, + 0.027182f, -0.004459f, 0.011709f, -0.002346f, -0.011867f, 0.007765f, 0.000667f, -0.003947f, 0.005312f, 0.016672f, 0.004239f, 0.002951f, -0.000292f, 0.006667f, 0.024039f, 0.010785f, 0.002958f, 0.002427f, 0.006285f, -0.006965f, 0.012265f, -0.003198f, -0.023906f, 0.002886f, -0.002624f, 0.014346f, 0.016850f, 0.007300f, -0.007308f, -0.006596f, -0.006248f, -0.000873f, 0.005184f, 0.000470f, 0.003480f, 0.002404f, 0.003648f, 0.010762f, 0.004576f, -0.008588f, -0.003812f, 0.001155f, 0.002882f, 0.000517f, -0.000320f, 0.000287f, -0.004808f, 0.004934f, 0.001057f, 0.000969f, 0.000421f, 0.000966f, 0.000336f, 0.003677f, -0.001644f, 0.002666f, -0.002844f, -0.000849f, -0.004417f, 0.000810f, -0.001785f, -0.000289f, 0.001440f, -0.029027f, -0.003347f, -0.012277f, -0.014652f, -0.003792f, -0.010472f, 0.000567f, 0.008860f, -0.013594f, 0.014078f, -0.030157f, 0.004216f, -0.008876f, -0.016188f, -0.021547f, 0.022483f, 0.011340f, 0.001370f, -0.019083f, -0.012613f, 0.007230f, -0.024963f, -0.017319f, 0.005822f, 0.005361f, 0.025186f, -0.003202f, 0.002021f, 0.018802f, -0.011220f, 0.018471f, 0.006227f, 0.006820f, + -0.003667f, -0.010995f, -0.001378f, 0.015397f, -0.008341f, 0.001386f, 0.019156f, -0.006938f, -0.005748f, -0.009224f, -0.011500f, -0.009793f, -0.007479f, -0.015449f, -0.001971f, 0.004753f, -0.005390f, 0.003503f, -0.005156f, -0.007864f, 0.010746f, -0.013782f, 0.008369f, -0.011702f, -0.014920f, 0.000807f, 0.012172f, 0.000884f, -0.003735f, 0.004940f, -0.009966f, -0.004911f, -0.013940f, -0.024677f, -0.011746f, 0.003611f, -0.007550f, 0.028376f, 0.011213f, -0.019657f, -0.009991f, -0.002841f, -0.007155f, 0.009172f, 0.019149f, 0.012692f, -0.009314f, 0.008965f, -0.011037f, 0.006714f, 0.000972f, 0.008988f, -0.009770f, -0.002222f, 0.000850f, -0.004203f, -0.008330f, -0.006871f, 0.001286f, -0.000365f, -0.001939f, 0.004459f, 0.001675f, 0.000772f, -0.002749f, 0.002706f, -0.000533f, -0.002047f, -0.006041f, -0.000041f, -0.003093f, 0.000626f, 0.002718f, -0.001897f, -0.006704f, -0.000684f, -0.002826f, 0.031503f, 0.020495f, 0.021559f, -0.006320f, -0.030644f, -0.002479f, -0.015705f, 0.003892f, 0.006781f, 0.016438f, -0.007755f, 0.007181f, -0.012614f, 0.002101f, -0.011129f, -0.028529f, -0.015386f, 0.010847f, -0.010420f, + -0.022618f, -0.021250f, -0.019780f, -0.030845f, 0.003785f, -0.010822f, -0.023506f, -0.021136f, 0.003656f, 0.029643f, -0.004016f, -0.004979f, -0.009970f, -0.018019f, 0.003665f, -0.007187f, 0.001922f, -0.022471f, 0.001385f, -0.023405f, 0.003216f, -0.001925f, 0.012516f, 0.009713f, 0.010410f, 0.005355f, -0.000933f, 0.008664f, -0.005785f, 0.017063f, 0.004758f, 0.008631f, 0.005140f, -0.005599f, 0.006037f, 0.017197f, -0.002292f, 0.009603f, -0.002488f, 0.027055f, 0.003442f, 0.010163f, 0.001281f, -0.015177f, -0.011653f, 0.000534f, -0.005420f, 0.003500f, -0.003967f, 0.008971f, 0.007958f, 0.010429f, -0.004831f, 0.005953f, -0.020798f, 0.011058f, 0.030318f, -0.014627f, -0.003116f, 0.008082f, -0.017511f, -0.001180f, 0.010905f, -0.006844f, -0.001114f, -0.003610f, 0.009485f, -0.009738f, -0.002350f, 0.002671f, -0.005474f, 0.002672f, -0.001912f, 0.004044f, -0.005064f, -0.005005f, 0.005589f, -0.002494f, -0.005559f, 0.003956f, -0.002202f, 0.000156f, -0.007844f, 0.006027f, 0.001998f, -0.001259f, -0.001304f, 0.003454f, 0.001209f, 0.003351f, 0.002409f, 0.000636f, -0.003358f, -0.005874f, -0.001727f, -0.015177f, + -0.044175f, -0.007263f, -0.015454f, -0.023181f, 0.012450f, -0.044282f, -0.005806f, -0.015727f, -0.008644f, 0.012837f, -0.014170f, 0.018784f, 0.016104f, 0.002612f, 0.014515f, 0.001327f, 0.007644f, -0.011519f, -0.020452f, -0.022416f, -0.012624f, -0.020541f, 0.015974f, 0.021047f, -0.000969f, -0.011040f, 0.006001f, 0.006090f, -0.007805f, 0.001576f, -0.035122f, -0.018509f, 0.016233f, -0.008908f, 0.000404f, 0.016025f, -0.001590f, 0.009924f, 0.008396f, -0.004536f, 0.009617f, -0.000088f, -0.018759f, 0.020830f, -0.014699f, 0.001028f, 0.001075f, -0.011454f, 0.007572f, 0.012429f, -0.007389f, 0.014197f, 0.001522f, -0.001082f, -0.013028f, 0.016035f, -0.000160f, -0.012948f, -0.004366f, -0.025963f, -0.010970f, -0.014813f, -0.001945f, 0.017892f, 0.005092f, -0.001677f, 0.000232f, -0.016795f, 0.003719f, 0.012957f, -0.017028f, 0.000998f, 0.025917f, -0.010672f, 0.002489f, 0.001992f, -0.018528f, -0.011088f, 0.011760f, 0.009922f, -0.030109f, 0.006078f, 0.022419f, -0.000089f, 0.002628f, 0.000157f, 0.005364f, -0.001692f, 0.014135f, -0.003225f, -0.000639f, 0.001841f, 0.002676f, -0.006411f, 0.001584f, 0.005022f, + 0.001494f, 0.008457f, 0.003053f, -0.000155f, -0.003141f, -0.006616f, -0.001963f, 0.003182f, -0.004155f, 0.003011f, -0.004259f, -0.000094f, 0.005803f, 0.003166f, -0.004156f, -0.005557f, 0.000255f, 0.000220f, 0.012398f, -0.004985f, 0.000985f, 0.006838f, 0.002719f, 0.006681f, 0.078588f, 0.017488f, -0.010310f, -0.015768f, -0.001545f, -0.004987f, 0.013910f, -0.003105f, 0.011753f, 0.022287f, -0.009018f, 0.001121f, -0.014781f, -0.010100f, 0.004708f, -0.002434f, 0.011419f, -0.022033f, -0.012951f, 0.010400f, 0.022041f, 0.014578f, -0.000729f, 0.005232f, -0.005458f, -0.013268f, 0.009543f, 0.017261f, 0.018050f, 0.021845f, -0.018145f, -0.004285f, -0.010433f, -0.022438f, -0.002893f, 0.001167f, -0.004976f, 0.010316f, 0.013548f, -0.000029f, 0.006655f, -0.004024f, -0.023906f, -0.012973f, -0.031953f, -0.032355f, -0.009511f, 0.010846f, -0.004799f, -0.014326f, 0.027054f, 0.010266f, -0.001175f, -0.025426f, -0.001234f, -0.007824f, -0.018263f, 0.000240f, -0.008396f, -0.011772f, -0.025264f, -0.003214f, -0.009381f, -0.027678f, -0.000083f, 0.021208f, -0.014314f, -0.006731f, 0.007748f, -0.011889f, 0.004661f, -0.011778f, + 0.017178f, -0.005495f, -0.016756f, -0.025857f, -0.042601f, 0.008439f, 0.007107f, 0.032543f, 0.013003f, 0.011306f, -0.000237f, 0.009922f, -0.007730f, 0.010515f, -0.001046f, 0.003752f, 0.005123f, 0.012469f, 0.005596f, 0.000578f, -0.002351f, -0.000535f, 0.004831f, 0.003154f, 0.012803f, 0.010201f, 0.006682f, 0.002296f, -0.002705f, -0.006710f, 0.003637f, 0.008461f, 0.000665f, 0.000643f, -0.001650f, -0.005911f, -0.001121f, -0.000774f, -0.002971f, -0.002022f, -0.004734f, 0.004007f, 0.005604f, -0.005192f, -0.005507f, -0.000163f, -0.000792f, 0.003127f, 0.017680f, -0.062270f, -0.035481f, 0.033012f, -0.008577f, 0.002123f, -0.017104f, 0.014404f, -0.005900f, -0.024025f, 0.011553f, 0.033373f, 0.004291f, -0.029197f, 0.008249f, -0.006355f, -0.006669f, 0.019217f, 0.019938f, -0.002684f, -0.004041f, 0.042024f, 0.009404f, -0.006037f, -0.025810f, 0.011442f, -0.037022f, -0.030476f, -0.028077f, 0.011405f, -0.005298f, -0.003005f, 0.024159f, 0.009637f, -0.024505f, -0.020485f, 0.005353f, 0.023853f, 0.008182f, -0.002714f, 0.001374f, 0.015907f, -0.011470f, -0.025890f, 0.033815f, -0.009923f, 0.003526f, 0.013656f, + 0.002126f, 0.004693f, 0.034774f, 0.000614f, 0.022157f, 0.001011f, -0.023275f, 0.003382f, 0.004991f, -0.004817f, 0.004455f, 0.015828f, -0.011765f, -0.003567f, 0.004056f, -0.046031f, 0.012223f, 0.009422f, -0.000258f, 0.011055f, 0.008616f, -0.017077f, 0.008102f, 0.063236f, 0.027184f, 0.015626f, 0.004586f, 0.015361f, -0.048615f, -0.023043f, 0.024602f, 0.000986f, -0.000227f, -0.018653f, 0.016439f, 0.019901f, 0.016661f, 0.002777f, 0.003489f, -0.006677f, 0.000263f, -0.011569f, -0.004209f, 0.009128f, -0.002067f, -0.005837f, 0.004738f, 0.000367f, 0.004545f, -0.006752f, -0.002871f, 0.002255f, -0.001244f, 0.004598f, -0.008084f, -0.002803f, 0.005726f, -0.006455f, 0.004625f, 0.001667f, 0.000574f, 0.000156f, 0.000028f, -0.005243f, 0.002577f, 0.004790f, -0.002452f, -0.002458f, -0.005627f, 0.002417f, -0.000382f, -0.041753f, 0.029344f, 0.031349f, 0.010149f, 0.017281f, -0.011566f, 0.050054f, -0.005853f, 0.019076f, 0.013104f, -0.023128f, -0.009434f, -0.010688f, 0.029145f, -0.017334f, -0.005340f, 0.018303f, 0.015469f, -0.017038f, -0.004562f, -0.049203f, 0.009250f, -0.005484f, -0.014380f, 0.004226f, + 0.001390f, 0.003599f, 0.004582f, 0.016617f, 0.000742f, 0.018205f, 0.002233f, 0.008857f, -0.004648f, -0.015876f, -0.016830f, 0.031742f, -0.011255f, -0.023043f, -0.019305f, -0.008815f, -0.010592f, 0.013752f, 0.008618f, 0.010583f, 0.014118f, 0.004180f, -0.017350f, 0.009946f, -0.028335f, -0.009330f, -0.024751f, 0.017040f, -0.029888f, -0.021534f, -0.006293f, -0.010124f, 0.009012f, 0.020114f, -0.015948f, 0.018987f, 0.031382f, 0.015515f, 0.030233f, -0.012690f, 0.040562f, 0.003671f, 0.034374f, 0.019423f, 0.004336f, -0.018327f, -0.045949f, -0.031114f, -0.025213f, -0.014384f, -0.014105f, -0.004535f, -0.021363f, 0.016128f, 0.026971f, -0.010372f, -0.020568f, -0.018835f, -0.014828f, -0.028015f, 0.017695f, 0.012738f, -0.007380f, -0.007231f, -0.010814f, 0.001425f, -0.006102f, 0.015079f, 0.000099f, 0.003860f, -0.007988f, -0.006912f, -0.011286f, -0.002096f, -0.013530f, -0.013051f, 0.013428f, -0.000946f, 0.001688f, 0.000330f, 0.004957f, -0.005337f, -0.000452f, -0.008017f, 0.000322f, 0.000047f, -0.000299f, 0.004128f, 0.000489f, -0.006561f, -0.004260f, -0.004708f, 0.001368f, -0.007050f, -0.007629f, -0.009695f, + 0.002671f, 0.023250f, 0.011852f, -0.013229f, 0.039148f, 0.004427f, -0.038206f, 0.047718f, 0.003203f, -0.020322f, 0.016846f, -0.039187f, -0.007497f, -0.024948f, -0.007785f, -0.004414f, -0.007650f, -0.017831f, 0.005005f, -0.033854f, -0.013089f, -0.012202f, -0.045684f, 0.005559f, -0.033128f, -0.023545f, -0.037167f, 0.007470f, -0.028040f, -0.008457f, -0.009284f, 0.000316f, 0.014151f, -0.011388f, 0.019917f, 0.001044f, 0.026426f, -0.006137f, 0.022987f, 0.028967f, -0.034735f, -0.000503f, 0.009334f, 0.021271f, 0.000843f, 0.025574f, 0.008572f, 0.024660f, -0.000503f, -0.018807f, -0.011823f, -0.001790f, 0.015961f, -0.003649f, -0.007320f, -0.001578f, 0.029547f, 0.018668f, -0.007006f, -0.024316f, 0.008174f, 0.013396f, 0.009524f, 0.026211f, -0.035057f, -0.025920f, -0.007396f, 0.002498f, -0.009859f, 0.000309f, -0.010053f, -0.021902f, 0.061547f, -0.030364f, -0.035255f, 0.026358f, 0.015181f, 0.022903f, 0.007035f, 0.008441f, 0.004749f, 0.013405f, -0.012623f, 0.035377f, -0.006166f, 0.008703f, -0.006818f, 0.004766f, 0.002136f, -0.001902f, 0.022549f, 0.002858f, 0.001987f, -0.022180f, 0.010075f, 0.003360f, + -0.003247f, -0.018056f, -0.001839f, -0.003705f, 0.000492f, -0.005724f, 0.016248f, 0.003793f, 0.004551f, -0.013038f, 0.008945f, -0.006176f, 0.001832f, 0.007867f, -0.000312f, -0.003829f, -0.004186f, -0.011597f, 0.006781f, 0.011932f, -0.005646f, -0.001279f, -0.004187f, 0.001806f, -0.006738f, -0.015624f, -0.004722f, -0.000491f, -0.010713f, 0.011157f, -0.000950f, -0.001479f, 0.003775f, -0.010497f, -0.011905f, 0.004887f, -0.008197f, -0.010436f, 0.031020f, 0.022844f, 0.036679f, -0.012212f, -0.009083f, -0.050376f, 0.058493f, 0.026811f, -0.077910f, -0.041698f, 0.024962f, 0.034679f, 0.034885f, -0.022410f, -0.018193f, 0.042212f, 0.010009f, 0.009688f, 0.029262f, 0.023656f, -0.043083f, 0.013201f, 0.018149f, -0.003226f, 0.020325f, 0.003910f, -0.005542f, 0.004213f, -0.014035f, 0.071921f, 0.018822f, 0.009369f, -0.001988f, -0.008894f, -0.004847f, -0.040795f, 0.007809f, 0.011990f, -0.009620f, -0.013375f, -0.066057f, -0.031552f, 0.013807f, 0.011516f, -0.021693f, -0.021200f, -0.003013f, -0.031441f, 0.012985f, 0.011674f, -0.004600f, 0.013134f, 0.026015f, 0.001309f, -0.001383f, -0.008340f, -0.013947f, -0.004547f, + 0.002306f, -0.048675f, -0.006513f, 0.011437f, 0.029647f, -0.052682f, 0.011669f, 0.018887f, -0.004181f, -0.024801f, -0.022429f, 0.039784f, 0.039283f, -0.005750f, -0.024588f, -0.046578f, 0.009769f, 0.018684f, 0.009739f, 0.000777f, -0.050826f, 0.021427f, 0.046183f, -0.015648f, 0.005176f, 0.014525f, -0.019065f, -0.030341f, -0.016091f, 0.004631f, -0.009464f, -0.002409f, -0.014357f, -0.012325f, -0.010503f, -0.004427f, -0.004172f, 0.006180f, -0.001171f, -0.000925f, -0.013095f, 0.005376f, -0.006188f, 0.002803f, 0.000030f, 0.004216f, 0.007829f, 0.009209f, -0.014630f, 0.005850f, -0.011326f, -0.018936f, -0.010028f, 0.002720f, -0.001998f, 0.008277f, -0.001923f, 0.005391f, 0.011094f, 0.000562f, -0.000607f, -0.009817f, -0.005573f, 0.014809f, 0.007417f, -0.006196f, -0.003885f, 0.023175f, -0.017067f, 0.006324f, -0.014223f, -0.012541f, 0.002178f, 0.015711f, 0.031355f, -0.057753f, -0.075371f, -0.052374f, -0.067429f, 0.058555f, -0.039057f, 0.023585f, -0.006604f, -0.047350f, 0.008473f, -0.012837f, -0.017603f, -0.061474f, -0.056336f, -0.042045f, -0.016055f, 0.002223f, -0.032597f, -0.009411f, 0.008611f, 0.026517f, + 0.002100f, -0.016439f, 0.000067f, -0.017580f, 0.025413f, -0.031926f, 0.044184f, 0.038112f, -0.009104f, -0.012071f, -0.052388f, -0.030511f, -0.031857f, 0.003882f, 0.007050f, -0.008489f, 0.042824f, 0.012252f, 0.034717f, 0.006896f, -0.004080f, -0.015692f, 0.031238f, 0.021622f, 0.009816f, -0.031301f, 0.016814f, -0.052972f, -0.005900f, -0.005568f, -0.035183f, -0.005730f, 0.000464f, 0.040623f, 0.026903f, 0.000843f, 0.018792f, -0.000672f, -0.039948f, 0.020445f, 0.005694f, 0.033430f, -0.018844f, -0.038398f, 0.022996f, -0.069063f, -0.015817f, 0.024554f, -0.010334f, -0.010926f, 0.016987f, -0.004423f, -0.013582f, 0.012893f, -0.005712f, -0.044280f, -0.038956f, -0.006365f, 0.018322f, 0.029608f, 0.041591f, 0.041692f, -0.017567f, -0.014048f, 0.008263f, 0.015179f, 0.013682f, 0.005784f, -0.018404f, 0.016356f, 0.000397f, -0.003332f, 0.002192f, 0.010189f, 0.016971f, -0.004815f, 0.002954f, 0.016071f, -0.003589f, -0.000197f, -0.015983f, 0.008169f, -0.003388f, -0.000986f, 0.013403f, -0.002465f, -0.005797f, 0.006099f, -0.018164f, -0.006627f, 0.018761f, 0.005481f, 0.006191f, -0.006426f, -0.004180f, -0.002591f, + -0.014428f, -0.001759f, -0.007958f, 0.011249f, -0.031547f, -0.075343f, -0.007042f, -0.047964f, 0.002928f, -0.035321f, 0.032139f, -0.025222f, -0.002711f, 0.006348f, 0.011976f, 0.038795f, 0.012971f, -0.017533f, 0.041840f, 0.013070f, -0.071319f, 0.011796f, -0.042813f, -0.002986f, 0.008096f, -0.005913f, 0.035135f, -0.010369f, 0.006342f, 0.008972f, 0.003045f, -0.022793f, 0.035655f, -0.020608f, -0.002026f, -0.041701f, -0.000099f, 0.007158f, -0.006676f, -0.014622f, -0.019237f, -0.021750f, 0.054067f, 0.002244f, 0.027956f, -0.048142f, 0.005357f, -0.000530f, 0.016463f, 0.028855f, -0.033255f, 0.058971f, 0.084697f, -0.003799f, 0.008072f, -0.029531f, 0.013452f, 0.019810f, -0.016511f, 0.004298f, 0.015829f, 0.032981f, -0.001224f, 0.002007f, -0.010365f, -0.028564f, -0.043177f, 0.021977f, -0.032432f, -0.013568f, -0.021315f, 0.009399f, 0.028768f, 0.026036f, -0.005350f, 0.009813f, -0.058584f, 0.038622f, -0.007412f, 0.008446f, -0.017379f, 0.037733f, -0.052629f, 0.062537f, 0.045214f, 0.052108f, -0.021312f, -0.001210f, -0.051621f, -0.027807f, -0.019391f, 0.016902f, 0.013956f, -0.042482f, -0.031503f, 0.001202f, + -0.011181f, -0.030999f, -0.000480f, -0.021457f, -0.025877f, -0.009535f, -0.004237f, 0.001959f, -0.017274f, 0.003003f, 0.005229f, 0.025738f, 0.022580f, -0.003600f, 0.021246f, -0.010721f, -0.027634f, -0.015041f, -0.006336f, -0.013711f, -0.002630f, -0.010203f, 0.014795f, 0.004612f, 0.058699f, 0.007802f, -0.021018f, -0.007051f, 0.004689f, -0.031022f, -0.019991f, 0.007333f, 0.000572f, -0.008074f, 0.002402f, -0.000027f, -0.034548f, -0.003598f, 0.021904f, -0.016747f, 0.094617f, 0.027089f, 0.068797f, 0.022020f, -0.071817f, 0.028885f, 0.019891f, -0.023842f, 0.004808f, 0.046410f, 0.001977f, 0.044423f, 0.039215f, -0.046019f, 0.025280f, -0.046038f, -0.031238f, -0.004312f, 0.092585f, 0.028551f, -0.041944f, 0.039567f, 0.025332f, -0.050956f, -0.022630f, -0.003425f, 0.051760f, 0.007729f, -0.047584f, -0.026631f, -0.001608f, -0.012931f, 0.028675f, 0.041622f, -0.015154f, 0.036619f, -0.023673f, -0.031786f, -0.001232f, 0.075364f, 0.006871f, -0.043152f, 0.024459f, -0.001950f, -0.004437f, 0.021157f, -0.049206f, -0.042317f, -0.040402f, 0.029593f, -0.026509f, 0.009607f, 0.012416f, 0.045104f, 0.022127f, 0.046368f, + 0.004788f, -0.001902f, 0.037593f, 0.069380f, 0.041031f, -0.068423f, 0.001276f, 0.006769f, -0.011756f, 0.013331f, 0.018860f, -0.052808f, -0.008132f, 0.010600f, 0.009011f, -0.062914f, -0.059905f, -0.033375f, -0.036466f, 0.062716f, 0.022983f, 0.003037f, 0.027439f, -0.050928f, 0.020900f, 0.014282f, 0.009150f, -0.004371f, -0.011881f, 0.043391f, 0.025787f, -0.017146f, 0.007183f, -0.012888f, 0.028009f, -0.007979f, 0.001755f, 0.006097f, 0.003950f, 0.021214f, -0.003580f, -0.033997f, -0.001694f, 0.006593f, 0.008699f, 0.017770f, -0.005047f, 0.001768f, 0.012869f, -0.026294f, -0.016003f, -0.002255f, -0.048514f, -0.007181f, 0.013030f, -0.003350f, 0.004880f, 0.027811f, -0.004298f, -0.019009f, 0.003740f, 0.006923f, 0.017534f, 0.021631f, -0.021038f, -0.012490f, -0.001797f, -0.017282f, -0.011865f, -0.033349f, -0.040471f, 0.011372f, 0.000154f, -0.017760f, -0.015612f, -0.018124f, -0.036006f, 0.026964f, -0.071948f, 0.052069f, 0.058150f, 0.016122f, 0.063325f, -0.064900f, -0.031775f, -0.017554f, -0.093291f, 0.052566f, 0.005237f, 0.032547f, 0.042753f, 0.041851f, 0.003198f, -0.001297f, 0.042499f, -0.006713f, + -0.050542f, -0.052419f, 0.031706f, -0.059229f, 0.057784f, -0.016576f, 0.012636f, 0.057304f, 0.051621f, -0.025982f, 0.078627f, -0.045590f, 0.005049f, -0.047406f, 0.007619f, -0.016192f, 0.030923f, 0.010542f, -0.033697f, 0.030198f, 0.045824f, 0.067411f, -0.039023f, 0.014432f, 0.041316f, -0.056833f, 0.002561f, -0.022833f, -0.082270f, -0.035356f, 0.021881f, -0.045139f, 0.016014f, -0.037893f, -0.000985f, 0.055369f, -0.026344f, 0.023461f, 0.063709f, 0.045563f, 0.016991f, 0.084818f, -0.132187f, -0.024890f, 0.044024f, -0.005085f, 0.025619f, -0.040908f, -0.071481f, 0.086729f, -0.001337f, -0.043690f, 0.018624f, 0.054884f, 0.136095f, 0.051575f, -0.103098f, -0.056226f, 0.034992f, 0.038086f, 0.016414f, -0.071948f, -0.006380f, 0.015769f, -0.022345f, 0.048568f, 0.017266f, 0.030998f, 0.036794f, 0.027678f, -0.019014f, 0.021367f, -0.057281f, 0.008204f, 0.030400f, -0.003705f, -0.030470f, 0.017680f, -0.018668f, 0.030271f, 0.033344f, -0.014385f, -0.028077f, -0.007571f, 0.061675f, -0.011130f, -0.007452f, -0.024305f, 0.027763f, -0.024140f, -0.015065f, 0.017805f, -0.011787f, 0.058196f, -0.004702f, -0.014525f, + 0.058344f, -0.005336f, 0.013404f, 0.035795f, -0.003034f, -0.003173f, 0.003119f, 0.005222f, -0.027910f, 0.012417f, 0.001155f, -0.040108f, 0.026809f, -0.012527f, 0.051156f, -0.028087f, 0.016139f, 0.004807f, 0.069743f, -0.061314f, -0.005553f, -0.029308f, -0.036337f, 0.055889f, -0.021753f, 0.073383f, -0.007285f, -0.056630f, 0.088033f, 0.127252f, -0.018172f, -0.040660f, -0.061493f, 0.014597f, 0.067597f, 0.013277f, -0.014268f, -0.042201f, 0.009995f, 0.009932f, -0.009368f, 0.010395f, -0.006052f, -0.020764f, -0.021192f, 0.019445f, 0.027743f, -0.002183f, 0.037510f, -0.036268f, 0.076977f, 0.057982f, 0.033394f, -0.002866f, 0.004504f, 0.010906f, -0.040846f, -0.035748f, -0.039602f, -0.020845f, -0.010919f, 0.024604f, 0.021582f, 0.041723f, -0.020293f, -0.005069f, -0.018002f, 0.047470f, 0.092716f, -0.022008f, -0.059845f, -0.038540f, -0.002568f, -0.080938f, 0.062714f, -0.109907f, 0.031527f, 0.046437f, 0.047641f, -0.047968f, 0.010995f, 0.048354f, -0.111376f, -0.052679f, 0.022627f, -0.011882f, -0.055931f, -0.049307f, -0.006596f, -0.025897f, 0.082455f, 0.035341f, -0.030538f, -0.028003f, -0.046175f, 0.126546f, + 0.026952f, 0.066046f, -0.005043f, 0.019191f, 0.023641f, 0.028264f, -0.041761f, -0.005453f, 0.052273f, 0.036113f, 0.021342f, -0.017539f, -0.022953f, -0.000156f, 0.016007f, 0.024098f, 0.016042f, -0.032859f, 0.004222f, 0.000161f, 0.007998f, 0.023362f, 0.023123f, -0.034418f, 0.015416f, -0.021295f, -0.026425f, 0.002507f, 0.026186f, 0.010661f, -0.016743f, 0.003455f, -0.002976f, -0.005128f, -0.014476f, 0.050341f, -0.015725f, -0.000117f, -0.031071f, 0.006841f, -0.012046f, 0.033077f, 0.009897f, -0.007437f, -0.018771f, 0.018664f, 0.014756f, -0.023602f, 0.000582f, -0.038235f, -0.016009f, 0.008621f, 0.014475f, 0.021031f, -0.001413f, -0.047835f, 0.014407f, 0.073407f, 0.002429f, -0.025062f, 0.061623f, 0.043785f, -0.012549f, -0.039652f, -0.059598f, 0.011229f, 0.117767f, 0.025643f, 0.060477f, -0.005497f, 0.005459f, -0.004967f, -0.013628f, -0.000220f, 0.005592f, 0.028251f, 0.009607f, -0.023077f, 0.019767f, -0.020236f, -0.021794f, -0.025132f, 0.000821f, 0.023329f, 0.005321f, 0.018590f, 0.020446f, 0.016070f, -0.016328f, -0.029471f, 0.009460f, -0.020524f, -0.050342f, -0.015295f, 0.011684f, -0.017969f, + 0.059282f, -0.061305f, 0.049839f, -0.016095f, 0.000591f, 0.073049f, -0.011296f, -0.002397f, 0.096121f, -0.015129f, -0.038807f, 0.006636f, -0.033220f, -0.008017f, -0.031352f, 0.106378f, -0.029989f, 0.025316f, -0.025440f, -0.011970f, -0.014415f, 0.017267f, -0.026655f, -0.065966f, 0.029133f, -0.008012f, -0.072407f, 0.037499f, -0.018803f, 0.039917f, 0.091465f, -0.046243f, -0.000747f, -0.005227f, -0.013260f, -0.049731f, -0.008336f, 0.044494f, 0.018329f, 0.027083f, -0.041148f, 0.011724f, 0.007625f, -0.040588f, -0.010615f, 0.008339f, 0.020873f, 0.025101f, 0.002412f, 0.004322f, 0.017063f, -0.004599f, -0.019607f, 0.028361f, -0.011124f, -0.009385f, 0.026661f, 0.002951f, -0.006959f, 0.038643f, -0.002312f, -0.003608f, 0.000641f, 0.012183f, -0.011474f, 0.019176f, -0.014987f, -0.008316f, -0.011777f, 0.009658f, -0.000013f, -0.002106f, 0.006014f, 0.017559f, -0.021361f, 0.004029f, -0.002600f, 0.012402f, 0.004207f, -0.004861f, 0.022689f, -0.014321f, 0.012386f, -0.004547f, 0.006933f, 0.000856f, 0.017063f, -0.026040f, 0.000075f, 0.122449f, 0.062222f, 0.128469f, -0.071842f, -0.018665f, 0.042516f, -0.040183f, + 0.030808f, 0.132155f, 0.031463f, 0.019112f, -0.034730f, -0.032866f, 0.038025f, -0.020025f, 0.053708f, -0.008792f, -0.012055f, -0.015538f, -0.075785f, 0.018297f, 0.091547f, -0.048253f, 0.055442f, 0.048193f, -0.030725f, -0.009312f, 0.038218f, -0.060700f, 0.030497f, -0.004293f, 0.045996f, 0.015514f, -0.037770f, -0.012228f, -0.076191f, -0.039176f, 0.036021f, 0.026956f, 0.059572f, 0.092644f, 0.010090f, 0.001478f, -0.080021f, -0.049010f, -0.047707f, -0.039445f, 0.021198f, -0.032724f, -0.009174f, -0.007514f, 0.024211f, -0.061272f, -0.009712f, 0.031732f, 0.016558f, 0.050521f, -0.006588f, -0.024199f, 0.050428f, -0.009109f, 0.030974f, -0.038707f, -0.023193f, -0.005998f, -0.012762f, 0.024637f, 0.036726f, 0.051671f, 0.014758f, 0.004243f, -0.035543f, -0.010069f, -0.018173f, 0.043259f, 0.000622f, 0.064838f, 0.011415f, 0.048828f, -0.047390f, -0.017072f, -0.000208f, -0.001204f, 0.035501f, -0.005671f, -0.017474f, -0.009618f, 0.008801f, 0.002401f, 0.009305f, 0.016302f, 0.014728f, -0.009048f, -0.010489f, 0.000608f, -0.006171f, 0.013725f, 0.014816f, 0.003379f, -0.012254f, 0.000458f, -0.016097f, -0.006860f, + -0.003481f, 0.027794f, 0.010049f, -0.003733f, 0.007313f, -0.018760f, -0.021996f, -0.015017f, 0.007023f, 0.015194f, -0.013098f, -0.001415f, 0.000258f, 0.011292f, 0.006366f, -0.001871f, 0.012179f, 0.001776f, -0.000614f, -0.012144f, 0.005770f, 0.003378f, -0.004904f, -0.033676f, -0.125775f, 0.003264f, 0.202395f, 0.182518f, 0.171671f, 0.072738f, -0.072908f, -0.101083f, -0.100213f, -0.089628f, -0.164509f, -0.117495f, -0.114507f, 0.088534f, 0.136079f, 0.110969f, 0.177104f, 0.147292f, 0.031268f, -0.006901f, -0.063363f, -0.123523f, -0.073677f, -0.129795f, -0.070448f, -0.043498f, 0.000716f, -0.017417f, 0.032566f, 0.055603f, 0.094650f, 0.059450f, 0.099446f, 0.075591f, 0.079018f, 0.006043f, -0.065020f, -0.029735f, 0.002290f, -0.071175f, -0.093838f, -0.122178f, -0.119961f, -0.085237f, -0.011952f, 0.059433f, 0.023570f, 0.086524f, 0.061338f, 0.098698f, 0.088042f, 0.095697f, 0.111221f, 0.059680f, -0.008503f, -0.018106f, -0.072558f, -0.059570f, -0.195977f, -0.156969f, -0.125633f, -0.098390f, 0.011479f, -0.043050f, 0.002822f, 0.133710f, 0.165380f, 0.226025f, 0.143088f, 0.085816f, 0.058560f, 0.013473f, + -0.086628f, -0.079629f, -0.120785f, -0.156401f, -0.132265f, -0.123620f, -0.057880f, 0.008659f, 0.062567f, 0.102573f, 0.101557f, 0.086168f, 0.054527f, 0.057747f, 0.024937f, 0.015377f, -0.002765f, -0.048252f, -0.041784f, -0.038453f, -0.042518f, -0.022917f, -0.047524f, -0.034291f, 0.011804f, 0.003787f, -0.027615f, 0.014739f, 0.039216f, 0.021964f, 0.044741f, 0.069381f, 0.072531f, 0.031675f, -0.044778f, -0.019704f, -0.006237f, -0.091748f, -0.096392f, -0.084436f, -0.035055f, 0.025746f, 0.041339f, 0.034081f, 0.057954f, 0.065113f, 0.080847f, 0.053223f, 0.033103f, -0.012781f, -0.054115f, -0.055473f, -0.061298f, -0.083026f, -0.058590f, -0.032987f, 0.028284f, 0.044369f, 0.029110f, 0.017155f, 0.052428f, 0.034855f, 0.021570f, 0.004436f, -0.007719f, -0.017292f, 0.001808f, -0.020681f, -0.023797f, -0.009424f, 0.008156f, -0.014592f, -0.010328f, 0.001518f, 0.010905f, 0.000599f, -0.005209f, -0.008015f, 0.008244f, -0.000863f, -0.003639f, -0.008184f, 0.003551f, 0.002458f, 0.005033f, -0.002333f, 0.003005f}, + {0.002045f, -0.002350f, 0.008276f, 0.009304f, 0.004997f, -0.003601f, -0.014059f, -0.012897f, 0.004673f, 0.007399f, -0.002735f, 0.013819f, -0.002680f, 0.008243f, -0.009823f, -0.008665f, 0.003773f, 0.000338f, -0.002554f, 0.003649f, 0.008958f, -0.003907f, 0.001238f, -0.005129f, -0.000518f, 0.000471f, 0.003667f, 0.003413f, 0.004597f, 0.000757f, 0.002734f, 0.010232f, -0.003958f, -0.004797f, -0.005179f, -0.009282f, 0.002661f, -0.001957f, 0.016958f, 0.003292f, -0.001285f, 0.001329f, 0.010285f, -0.000957f, -0.002252f, -0.002631f, -0.006046f, -0.001113f, 0.007906f, -0.001223f, 0.003274f, 0.007998f, -0.002521f, -0.000582f, -0.012883f, -0.007573f, -0.011749f, -0.002303f, -0.003420f, 0.001728f, 0.000630f, 0.001686f, 0.004177f, -0.002821f, 0.002013f, 0.000125f, 0.001026f, 0.001783f, -0.004296f, 0.004046f, -0.001399f, -0.004887f, -0.000632f, -0.004928f, -0.001512f, 0.000454f, -0.007683f, 0.002026f, 0.000334f, 0.005906f, 0.000608f, -0.000109f, -0.003538f, 0.000785f, 0.005880f, 0.002875f, -0.001483f, 0.000650f, 0.001296f, 0.001427f, 0.004481f, 0.000531f, 0.000265f, -0.001093f, -0.000692f, 0.000445f, + 0.000162f, -0.000468f, 0.002952f, 0.001612f, 0.001747f, 0.001248f, 0.000909f, 0.000375f, 0.000879f, 0.009535f, 0.022561f, 0.008881f, 0.005355f, 0.006244f, -0.013223f, -0.001576f, 0.005737f, -0.001813f, 0.002257f, -0.012103f, 0.011901f, 0.016074f, 0.002797f, 0.007170f, -0.003368f, -0.009447f, -0.014585f, -0.016011f, -0.010612f, 0.012657f, -0.011945f, -0.007623f, -0.010106f, 0.003228f, 0.008442f, 0.001571f, 0.001161f, 0.004689f, -0.000457f, 0.002955f, 0.010398f, -0.001477f, 0.008648f, -0.008238f, 0.007892f, 0.005459f, 0.005025f, -0.004349f, -0.013404f, -0.002876f, 0.007704f, 0.004532f, -0.003733f, -0.000468f, 0.002677f, -0.000587f, -0.006459f, -0.001377f, 0.005510f, -0.001904f, 0.000626f, -0.003219f, -0.000692f, 0.000380f, 0.001852f, 0.009461f, 0.003981f, -0.004877f, 0.000836f, 0.000766f, -0.003203f, 0.001710f, -0.004673f, -0.000568f, 0.007706f, 0.002484f, 0.008644f, -0.006182f, -0.005275f, -0.003183f, -0.001349f, 0.004373f, 0.009796f, -0.005661f, -0.007062f, 0.008401f, -0.000777f, -0.000181f, 0.000306f, 0.002887f, 0.002096f, 0.007058f, -0.001978f, 0.003280f, -0.004301f, -0.004060f, + 0.000332f, 0.001894f, -0.000284f, 0.000126f, 0.001639f, 0.001752f, 0.001368f, -0.003662f, 0.004112f, -0.000859f, 0.006606f, 0.002811f, -0.007418f, -0.006988f, -0.007949f, -0.001237f, -0.006489f, -0.013655f, -0.013017f, 0.013446f, -0.000295f, 0.002840f, -0.000101f, 0.008195f, -0.012107f, 0.018000f, 0.015975f, 0.000839f, 0.000852f, 0.000036f, 0.000475f, -0.001765f, 0.006256f, 0.004879f, 0.000396f, -0.010227f, 0.004438f, -0.003165f, 0.004924f, -0.001416f, 0.010910f, -0.002530f, -0.006349f, -0.002866f, -0.001712f, 0.004054f, -0.000068f, 0.006758f, -0.010832f, 0.005852f, 0.001889f, -0.006001f, 0.017047f, -0.002696f, -0.002441f, -0.000347f, -0.000266f, -0.004483f, -0.001451f, 0.009110f, 0.007448f, -0.015965f, -0.007537f, 0.008134f, 0.002339f, -0.003810f, 0.013901f, 0.000520f, 0.003116f, 0.013699f, 0.005652f, 0.010757f, 0.003036f, -0.004115f, -0.005581f, -0.010740f, -0.010418f, 0.001526f, 0.005545f, 0.013332f, 0.000508f, -0.005419f, -0.006796f, 0.002330f, -0.000125f, -0.003708f, 0.004323f, -0.001489f, -0.003418f, 0.003130f, 0.007219f, 0.002353f, -0.003620f, 0.003632f, 0.003760f, 0.004728f, + 0.003025f, 0.000252f, 0.000450f, -0.004459f, -0.000940f, -0.000048f, 0.002292f, 0.001946f, 0.003677f, 0.003570f, 0.002954f, 0.001136f, -0.000290f, -0.018225f, -0.006365f, -0.008862f, 0.008272f, -0.006050f, 0.005370f, -0.006543f, -0.002719f, 0.015472f, 0.007549f, -0.010256f, 0.004673f, 0.014757f, 0.002152f, -0.005163f, -0.010367f, -0.012435f, -0.008540f, -0.012504f, 0.008297f, 0.001896f, 0.004561f, -0.002395f, -0.005672f, -0.005968f, -0.011031f, 0.000579f, -0.000351f, 0.002624f, -0.002697f, -0.010018f, 0.000154f, 0.010711f, -0.002382f, 0.000128f, -0.005344f, -0.010672f, -0.015806f, -0.001356f, 0.011376f, 0.004141f, 0.001190f, -0.005354f, 0.001449f, -0.008569f, -0.002816f, -0.006447f, 0.000813f, 0.001459f, -0.009769f, 0.011021f, -0.006212f, 0.014023f, 0.005296f, 0.001334f, -0.006378f, -0.003343f, 0.003596f, -0.000802f, 0.003402f, 0.007528f, 0.001523f, 0.002987f, -0.008338f, 0.004920f, -0.004195f, 0.012890f, 0.015957f, 0.007324f, 0.010722f, 0.004995f, -0.001643f, -0.011197f, -0.007237f, 0.000924f, 0.008247f, 0.008318f, -0.006660f, 0.000874f, 0.007837f, -0.010255f, 0.010123f, 0.000650f, + -0.005201f, 0.003339f, -0.002186f, -0.000491f, -0.005784f, 0.001135f, 0.001634f, 0.000998f, -0.004641f, 0.001229f, -0.003281f, -0.004351f, -0.001524f, 0.000309f, 0.001917f, -0.002839f, 0.000698f, -0.001231f, -0.004037f, 0.000432f, 0.003321f, 0.001394f, -0.002891f, 0.001869f, -0.002176f, 0.006102f, -0.014716f, 0.001933f, -0.015736f, -0.000070f, 0.002419f, 0.001464f, 0.007108f, 0.000712f, 0.001136f, 0.027845f, -0.003482f, -0.012299f, -0.013253f, 0.013987f, 0.009383f, -0.010552f, 0.002564f, -0.011768f, -0.005030f, 0.000395f, 0.013334f, -0.016512f, 0.004830f, -0.000643f, 0.002649f, -0.001257f, 0.016927f, -0.008742f, 0.004787f, -0.002642f, -0.004457f, 0.002575f, -0.000792f, 0.005075f, -0.005154f, -0.004799f, -0.014287f, 0.002250f, -0.004729f, -0.003073f, 0.001157f, -0.005059f, 0.004245f, -0.008064f, -0.004778f, -0.014193f, -0.000402f, -0.012600f, -0.005295f, -0.014987f, 0.011172f, 0.002276f, -0.004570f, 0.009811f, -0.011334f, -0.000042f, -0.021624f, -0.001149f, 0.007522f, -0.000573f, 0.006455f, 0.013800f, -0.004800f, -0.001920f, 0.017283f, 0.007299f, 0.006699f, 0.010553f, -0.005407f, -0.015913f, + -0.001646f, -0.009516f, 0.007012f, 0.015907f, -0.002810f, 0.004689f, 0.008502f, 0.007145f, -0.000792f, -0.001300f, 0.002022f, 0.000342f, -0.002879f, 0.004318f, 0.003893f, -0.006570f, 0.002262f, 0.005630f, -0.002742f, -0.001967f, -0.009756f, -0.002228f, -0.004064f, -0.001304f, -0.004218f, 0.000922f, -0.000967f, 0.000830f, -0.000367f, 0.000733f, 0.002613f, -0.002826f, 0.001106f, -0.001118f, -0.002869f, -0.000324f, -0.000417f, -0.000819f, 0.000307f, 0.001763f, 0.002876f, -0.002660f, 0.001055f, -0.002236f, 0.000506f, -0.000181f, -0.002987f, -0.001132f, -0.002005f, 0.007866f, 0.008896f, 0.003217f, -0.005355f, 0.003849f, 0.002338f, 0.016937f, -0.002565f, -0.003643f, -0.022835f, -0.006462f, 0.017199f, 0.016772f, 0.010810f, 0.008498f, 0.024476f, 0.001504f, -0.029188f, -0.007497f, -0.004847f, -0.007084f, 0.015592f, -0.002479f, -0.005644f, 0.018144f, 0.002858f, -0.007496f, -0.002578f, 0.007237f, -0.006424f, -0.002557f, 0.002236f, -0.002332f, -0.010155f, -0.004626f, -0.000459f, -0.009845f, -0.004486f, -0.004141f, 0.006884f, -0.004628f, 0.013243f, 0.012844f, 0.001269f, 0.012217f, 0.008599f, -0.005535f, + -0.001861f, -0.004204f, -0.018963f, 0.002124f, 0.003941f, -0.018070f, -0.002572f, -0.005130f, 0.006490f, 0.016491f, 0.002536f, -0.016744f, 0.002483f, -0.006461f, -0.011253f, 0.009123f, -0.002613f, -0.011995f, 0.005464f, 0.004607f, 0.013278f, -0.001065f, -0.001610f, 0.009754f, 0.011575f, 0.012688f, -0.012999f, 0.009197f, -0.001627f, -0.002219f, 0.003466f, 0.013698f, -0.000571f, -0.003664f, 0.004381f, 0.002083f, -0.011574f, -0.001538f, 0.016009f, 0.003516f, -0.000971f, -0.002007f, -0.007148f, 0.005137f, -0.002586f, -0.003280f, 0.000606f, -0.000478f, 0.003760f, -0.000247f, -0.004883f, -0.003557f, 0.006723f, -0.000829f, 0.002702f, -0.003004f, 0.003298f, -0.002481f, -0.001766f, -0.002454f, 0.001764f, 0.003544f, 0.011660f, -0.029881f, 0.012434f, -0.003256f, -0.006816f, -0.006133f, 0.005128f, -0.002831f, -0.017719f, -0.018868f, 0.002308f, 0.029450f, 0.008118f, -0.021411f, 0.004838f, 0.017479f, -0.012563f, 0.002277f, -0.003169f, 0.010427f, -0.000062f, 0.009623f, 0.025761f, 0.018766f, 0.011716f, -0.000427f, -0.002122f, -0.011894f, -0.012747f, 0.005088f, -0.033359f, -0.005265f, 0.015826f, 0.001782f, + -0.001678f, -0.015969f, -0.005689f, -0.000669f, -0.000715f, -0.007754f, -0.016514f, 0.018528f, -0.006390f, -0.004048f, -0.002976f, -0.015297f, -0.017208f, -0.000529f, -0.008393f, 0.001207f, 0.008206f, 0.006287f, 0.006946f, -0.013654f, -0.003541f, -0.006703f, -0.004263f, 0.021991f, -0.002311f, -0.010025f, 0.000714f, 0.028198f, -0.015031f, 0.004748f, 0.020756f, 0.000657f, -0.004758f, -0.010449f, 0.006321f, 0.001208f, 0.014950f, -0.008028f, 0.012651f, 0.010273f, 0.019581f, 0.009484f, 0.014667f, 0.001564f, -0.009594f, 0.002074f, -0.000390f, -0.005528f, 0.008865f, 0.012626f, -0.010460f, 0.006896f, 0.003780f, -0.009399f, 0.001240f, 0.003353f, 0.002643f, 0.003431f, -0.005372f, 0.003063f, -0.005889f, -0.001767f, -0.001627f, 0.000424f, 0.001106f, 0.002546f, 0.003227f, -0.000656f, 0.004833f, -0.000349f, -0.002153f, 0.001684f, 0.003217f, -0.001080f, 0.001953f, -0.005025f, 0.002002f, 0.017178f, 0.024659f, 0.015060f, 0.002516f, -0.005296f, -0.009227f, -0.020487f, -0.005927f, 0.013503f, -0.027857f, -0.011441f, 0.025381f, -0.035178f, -0.006362f, 0.019645f, 0.024690f, -0.002554f, -0.024793f, 0.003416f, + -0.009487f, 0.033141f, 0.014702f, -0.022801f, -0.014666f, -0.003527f, -0.014060f, -0.028690f, -0.014349f, -0.012744f, -0.010383f, -0.023239f, 0.011672f, 0.004097f, 0.014330f, -0.008863f, -0.004295f, -0.020446f, -0.002102f, -0.017744f, 0.001836f, -0.011804f, 0.002598f, 0.006172f, -0.027371f, -0.009009f, -0.010428f, -0.007286f, 0.005884f, 0.005818f, -0.008748f, 0.026948f, -0.001762f, -0.007076f, -0.005074f, 0.002582f, -0.006346f, -0.002250f, 0.010021f, 0.008528f, 0.011220f, 0.014779f, 0.014030f, 0.001091f, 0.009196f, -0.004514f, 0.021026f, 0.022488f, -0.011336f, -0.005908f, 0.013798f, -0.000416f, -0.034154f, 0.001551f, -0.017353f, 0.010565f, 0.010781f, 0.019287f, -0.014663f, 0.008200f, -0.020569f, -0.002016f, 0.011730f, -0.005036f, 0.018331f, -0.004797f, -0.002250f, 0.003668f, 0.001189f, 0.002559f, -0.001229f, 0.001065f, 0.007788f, -0.005797f, -0.001491f, 0.007487f, -0.001167f, 0.005877f, -0.008790f, -0.007642f, 0.005154f, -0.001238f, 0.001609f, 0.000807f, -0.001057f, 0.001343f, -0.005261f, -0.001381f, -0.000921f, -0.002292f, -0.003558f, -0.001241f, 0.002781f, 0.003343f, -0.000172f, -0.018926f, + -0.022901f, -0.011217f, -0.022125f, -0.031572f, 0.022337f, 0.002209f, 0.012499f, -0.017449f, -0.018156f, -0.025039f, -0.016939f, 0.007729f, -0.018571f, -0.016676f, 0.022713f, -0.005688f, 0.001068f, 0.005492f, 0.012975f, -0.010090f, -0.007654f, 0.003746f, -0.006130f, 0.003549f, -0.001157f, -0.011214f, -0.021465f, -0.033598f, 0.011097f, -0.024133f, -0.022134f, 0.001163f, -0.005839f, -0.001552f, -0.012463f, 0.005631f, 0.006395f, -0.027388f, -0.000608f, -0.006015f, -0.010731f, -0.015228f, 0.008647f, 0.001851f, 0.027359f, 0.003264f, -0.015372f, -0.000956f, 0.002529f, 0.011289f, 0.004712f, 0.024271f, -0.002100f, -0.026412f, 0.011289f, -0.005605f, 0.011914f, -0.015793f, 0.003428f, 0.008962f, -0.046717f, -0.022183f, 0.016493f, -0.001435f, -0.005030f, 0.007173f, -0.002394f, 0.029492f, -0.001056f, 0.018678f, 0.016213f, -0.023906f, -0.027762f, 0.001615f, -0.030754f, -0.000707f, -0.001536f, 0.000622f, 0.004450f, 0.019264f, -0.000693f, -0.012098f, 0.011026f, 0.014496f, -0.013549f, 0.002375f, 0.004340f, 0.014582f, -0.007146f, 0.000512f, -0.007246f, 0.004932f, -0.000419f, 0.003088f, 0.004830f, 0.007857f, + 0.007933f, -0.000241f, -0.007660f, 0.000342f, 0.005635f, 0.001775f, 0.001167f, -0.006981f, 0.000741f, -0.006992f, -0.001044f, 0.003785f, -0.001142f, 0.006870f, 0.005083f, -0.000294f, 0.001435f, 0.005563f, -0.005182f, 0.009811f, -0.000221f, -0.004301f, 0.004388f, 0.015944f, 0.065488f, -0.016197f, -0.043927f, -0.004010f, -0.019193f, 0.047496f, 0.003712f, 0.026566f, 0.014436f, -0.008379f, -0.021015f, -0.009527f, -0.022900f, -0.005986f, 0.032065f, -0.035773f, 0.001548f, -0.029200f, 0.007939f, 0.002338f, 0.014256f, 0.003207f, -0.013930f, -0.023679f, -0.027469f, -0.005185f, -0.026947f, -0.021206f, 0.003492f, 0.006207f, 0.020099f, -0.018841f, -0.039089f, -0.008271f, -0.013551f, 0.004623f, -0.018360f, -0.012497f, 0.005675f, -0.009861f, -0.015531f, -0.001129f, 0.001734f, -0.008026f, 0.038161f, -0.007882f, -0.006223f, 0.009568f, 0.009996f, -0.011374f, -0.004773f, 0.028152f, 0.023696f, 0.015476f, 0.029789f, 0.023250f, 0.000083f, 0.009712f, 0.016939f, -0.012613f, -0.011780f, 0.003434f, 0.012217f, 0.019756f, 0.008152f, 0.040129f, 0.004442f, 0.026903f, -0.007596f, -0.015571f, -0.009983f, 0.056971f, + 0.010164f, -0.007410f, -0.006836f, -0.020474f, -0.019546f, -0.014114f, -0.013695f, -0.016389f, 0.006582f, 0.013131f, -0.013920f, 0.004487f, 0.014204f, 0.007040f, -0.012850f, 0.002615f, 0.014488f, -0.003616f, 0.008034f, -0.007214f, -0.001992f, 0.003237f, -0.002416f, -0.001619f, -0.004303f, -0.009214f, -0.001407f, -0.008345f, 0.004454f, 0.006991f, 0.003595f, -0.006957f, 0.009276f, 0.006008f, -0.005089f, -0.006078f, -0.009409f, -0.002804f, -0.002578f, 0.002490f, -0.002033f, 0.004403f, 0.003302f, 0.000827f, -0.000891f, 0.000166f, -0.007500f, 0.003149f, 0.012689f, -0.057639f, -0.020990f, 0.028460f, -0.006554f, -0.029576f, -0.027181f, -0.009537f, 0.031436f, 0.016322f, -0.024748f, 0.013610f, -0.033033f, -0.013934f, -0.003733f, -0.022142f, -0.029648f, 0.024905f, 0.014089f, -0.026901f, -0.009135f, 0.057232f, 0.013602f, -0.025629f, -0.034736f, 0.000492f, 0.019082f, 0.003104f, 0.003470f, -0.040163f, -0.000952f, -0.004603f, -0.028566f, -0.016845f, -0.011398f, -0.023103f, -0.010710f, 0.006651f, 0.001100f, -0.024376f, -0.024141f, 0.003087f, 0.015488f, -0.000418f, 0.020688f, 0.034315f, -0.023953f, 0.021264f, + 0.016225f, 0.006760f, 0.004806f, 0.025872f, 0.008237f, 0.015954f, 0.010836f, 0.014380f, -0.004684f, -0.003113f, 0.029689f, 0.046186f, 0.007798f, -0.010741f, 0.005809f, -0.006639f, -0.017351f, 0.029397f, -0.014226f, -0.024770f, -0.039035f, -0.013459f, -0.045510f, 0.022831f, -0.018484f, -0.007871f, -0.002532f, -0.006558f, -0.016282f, -0.002724f, 0.018299f, -0.020770f, -0.001712f, 0.009607f, -0.005851f, -0.020251f, 0.010296f, 0.001679f, 0.005780f, -0.001326f, -0.002287f, -0.007227f, -0.000678f, -0.003734f, 0.010981f, 0.002886f, 0.003123f, 0.001794f, 0.003670f, 0.000178f, 0.005653f, 0.003782f, 0.009750f, -0.013447f, -0.001462f, 0.001149f, 0.009058f, -0.003655f, 0.007570f, -0.008089f, 0.002933f, 0.002025f, -0.001635f, -0.004457f, 0.007940f, -0.003513f, -0.000490f, 0.004548f, 0.001522f, 0.000487f, -0.010813f, -0.025267f, 0.021472f, 0.012905f, -0.003829f, 0.014379f, 0.010644f, 0.030590f, 0.023541f, -0.049652f, -0.016507f, 0.055269f, -0.043549f, -0.012828f, -0.026390f, 0.039396f, 0.017510f, 0.018176f, 0.007624f, 0.005809f, 0.015741f, 0.041793f, 0.019858f, -0.018345f, -0.000377f, 0.001426f, + -0.001182f, 0.016572f, 0.018568f, 0.002304f, 0.010984f, 0.010556f, -0.009591f, 0.012981f, 0.007762f, 0.025844f, -0.012396f, -0.024765f, -0.021316f, -0.016556f, 0.004909f, -0.002115f, 0.009846f, 0.011233f, 0.011243f, 0.022766f, -0.009966f, 0.004841f, -0.010045f, -0.017670f, -0.007178f, 0.001929f, -0.020423f, 0.026136f, 0.031571f, -0.034266f, 0.011692f, -0.023724f, 0.019410f, -0.003841f, 0.007544f, -0.002563f, -0.018997f, -0.004586f, 0.021845f, -0.017051f, -0.005262f, 0.003906f, -0.035034f, -0.013354f, 0.007337f, -0.027064f, -0.001885f, 0.043387f, 0.021558f, -0.002893f, -0.009927f, 0.034624f, 0.009083f, 0.024941f, -0.007839f, -0.011156f, 0.036118f, -0.012240f, 0.011272f, 0.004828f, 0.005128f, -0.007423f, -0.005452f, -0.006635f, -0.004605f, -0.012144f, -0.007512f, -0.008460f, 0.001212f, 0.007828f, -0.002883f, -0.017063f, -0.005491f, -0.002347f, 0.001924f, -0.000516f, -0.004257f, 0.000080f, 0.004812f, 0.008342f, -0.006661f, -0.000199f, -0.018418f, 0.003120f, -0.002302f, -0.003477f, 0.012416f, -0.000218f, -0.001204f, -0.007330f, 0.007592f, 0.002087f, 0.011245f, -0.003844f, -0.000665f, -0.007546f, + -0.000833f, 0.034499f, -0.002807f, -0.008057f, -0.028675f, 0.001216f, 0.002734f, -0.007737f, -0.000607f, -0.013339f, 0.005045f, -0.041238f, 0.037617f, -0.007638f, -0.013303f, -0.026117f, -0.029439f, -0.003083f, 0.035887f, -0.006548f, 0.009952f, -0.022215f, -0.012800f, -0.006232f, -0.021576f, -0.026096f, 0.023825f, -0.014762f, -0.011982f, 0.021068f, 0.020539f, -0.029078f, 0.010126f, 0.010935f, 0.025151f, 0.020722f, -0.007578f, -0.018421f, -0.011585f, -0.028277f, 0.031070f, 0.020387f, 0.010319f, 0.022111f, -0.022938f, 0.015665f, -0.003325f, 0.014356f, 0.015965f, -0.015072f, -0.001182f, 0.050512f, 0.042383f, -0.032086f, 0.012835f, 0.026202f, -0.020169f, 0.006203f, -0.047247f, 0.014110f, -0.025563f, 0.021087f, -0.014830f, -0.016382f, -0.011548f, 0.056360f, 0.003226f, -0.016478f, 0.005004f, 0.018926f, 0.002495f, 0.011241f, -0.030394f, -0.003503f, 0.050659f, -0.001706f, -0.019895f, -0.031024f, 0.000958f, -0.022975f, 0.014318f, 0.014571f, 0.017707f, -0.031686f, -0.033050f, -0.008863f, 0.005564f, 0.010830f, 0.003451f, 0.000132f, 0.000811f, 0.012008f, -0.008109f, -0.003292f, -0.002511f, -0.005367f, + 0.005937f, 0.004992f, -0.010109f, -0.007002f, -0.015529f, 0.009457f, -0.005696f, 0.004110f, 0.006801f, 0.009957f, 0.007949f, 0.003392f, 0.015601f, 0.000951f, -0.003636f, 0.007431f, -0.011593f, 0.006435f, 0.004490f, 0.003133f, 0.010326f, 0.011024f, 0.002049f, -0.001575f, 0.006525f, 0.000703f, -0.001002f, -0.012247f, -0.015998f, -0.003070f, -0.001235f, -0.002026f, -0.031186f, -0.001618f, -0.003710f, 0.009090f, -0.045282f, -0.020974f, -0.025369f, 0.021396f, -0.010744f, 0.031838f, 0.019418f, 0.040537f, -0.020073f, -0.001702f, -0.031770f, 0.027017f, 0.049297f, -0.015361f, -0.039015f, 0.003807f, -0.007903f, 0.060380f, -0.014788f, -0.023720f, 0.023120f, 0.012670f, 0.009738f, 0.022729f, 0.007846f, -0.075941f, 0.000383f, -0.005117f, 0.029758f, 0.053308f, -0.050265f, 0.001975f, 0.015226f, -0.024184f, -0.004781f, -0.068860f, -0.015467f, 0.035089f, -0.056535f, -0.033922f, -0.017269f, -0.022186f, 0.022709f, -0.013742f, -0.020065f, 0.030323f, 0.009347f, 0.011048f, 0.031401f, 0.003428f, -0.010642f, 0.022239f, 0.032944f, -0.031943f, -0.023668f, 0.048819f, 0.033706f, 0.011320f, 0.015640f, 0.011527f, + -0.021855f, -0.031748f, 0.000087f, 0.000409f, -0.006400f, 0.009987f, -0.019084f, 0.013627f, -0.026479f, 0.010783f, 0.062231f, -0.028917f, -0.023755f, 0.034147f, 0.009973f, -0.011640f, 0.021741f, 0.030012f, 0.022445f, 0.026522f, 0.013277f, -0.013492f, 0.011077f, -0.032748f, 0.017637f, 0.007414f, 0.009387f, -0.016619f, -0.004827f, 0.003473f, -0.001411f, -0.003322f, -0.004850f, 0.010746f, 0.021173f, -0.008222f, -0.020182f, 0.012888f, 0.024467f, 0.012704f, 0.009708f, -0.028807f, 0.017586f, 0.001872f, 0.009580f, -0.004620f, -0.009721f, -0.002302f, 0.014849f, 0.001340f, -0.002575f, -0.012430f, -0.000879f, -0.007248f, -0.003437f, -0.005745f, 0.006688f, 0.013897f, -0.008217f, 0.000550f, 0.008916f, -0.003435f, -0.001383f, -0.007593f, 0.001530f, -0.005088f, -0.005524f, 0.018013f, 0.016267f, 0.026528f, -0.061446f, -0.113488f, -0.052308f, -0.007956f, 0.038627f, 0.002735f, 0.042596f, 0.039349f, -0.011902f, 0.006378f, -0.009640f, -0.021584f, -0.035486f, -0.020652f, -0.025616f, -0.014899f, 0.040466f, -0.052598f, -0.009145f, -0.043838f, -0.054372f, -0.009522f, -0.054874f, -0.044151f, 0.005406f, -0.011551f, + -0.006333f, 0.009985f, 0.048156f, 0.003362f, -0.034947f, 0.001992f, -0.004192f, -0.010515f, -0.045381f, -0.002975f, 0.054094f, 0.005004f, -0.000923f, 0.021917f, 0.042024f, 0.028289f, 0.007350f, -0.017114f, 0.014653f, -0.014376f, -0.038519f, -0.070637f, 0.067194f, -0.008506f, 0.055975f, -0.004713f, 0.000745f, -0.020115f, -0.032344f, 0.059007f, -0.033529f, -0.027244f, -0.002833f, -0.042994f, -0.040394f, 0.033586f, 0.024632f, 0.012928f, -0.004287f, 0.017110f, -0.029828f, 0.011607f, -0.024206f, -0.034170f, -0.037295f, -0.029085f, -0.011992f, 0.028899f, 0.001840f, 0.010387f, -0.017253f, 0.010234f, -0.022574f, 0.016453f, 0.012779f, 0.011723f, -0.007351f, -0.000927f, 0.014561f, -0.003946f, -0.017608f, -0.013270f, -0.017429f, -0.001489f, -0.012862f, -0.002959f, -0.004514f, -0.004666f, 0.005155f, 0.002137f, -0.006912f, 0.003016f, 0.009170f, -0.002380f, -0.005808f, -0.013625f, -0.000089f, -0.009348f, -0.001267f, -0.001481f, -0.006467f, 0.015996f, -0.014953f, -0.013984f, -0.006600f, 0.008523f, -0.013233f, -0.013295f, 0.001939f, -0.011101f, -0.000051f, -0.001922f, 0.006278f, -0.001384f, 0.002133f, -0.008934f, + 0.003674f, -0.018594f, -0.009381f, -0.002734f, -0.039422f, -0.028863f, -0.043747f, -0.000451f, -0.041845f, -0.048590f, -0.008221f, -0.022198f, -0.053369f, -0.073892f, 0.008372f, -0.027959f, 0.013627f, -0.005324f, 0.027708f, 0.062257f, 0.003145f, 0.006452f, -0.031589f, -0.033793f, 0.028141f, 0.015738f, -0.022879f, 0.000138f, 0.018353f, -0.042091f, -0.032398f, -0.002249f, 0.053422f, -0.045910f, 0.000597f, 0.001136f, 0.024585f, -0.039203f, 0.040884f, 0.021519f, 0.011574f, -0.001022f, -0.017053f, -0.045495f, -0.000481f, -0.010846f, 0.016453f, -0.024661f, -0.060453f, 0.049859f, -0.036432f, -0.016173f, -0.002557f, 0.048797f, -0.037082f, 0.017164f, -0.030462f, 0.018938f, -0.011045f, -0.044744f, 0.021425f, -0.057028f, -0.012618f, -0.016310f, 0.019937f, 0.046892f, -0.027095f, 0.017418f, 0.047421f, -0.037889f, 0.006260f, 0.011552f, 0.011137f, 0.014114f, -0.069203f, -0.020618f, -0.011720f, 0.025015f, 0.005231f, -0.000002f, 0.012637f, -0.012053f, 0.027616f, -0.004920f, 0.006288f, -0.026489f, 0.023049f, 0.006045f, -0.042655f, -0.019331f, 0.020088f, 0.025276f, -0.003559f, -0.006252f, -0.016684f, 0.023702f, + 0.002974f, 0.000544f, -0.044365f, 0.007404f, -0.021341f, -0.033421f, -0.010158f, -0.006592f, -0.004322f, -0.019582f, -0.025448f, 0.009337f, -0.005854f, -0.012331f, 0.007333f, -0.002361f, -0.003637f, 0.001692f, -0.006804f, 0.002636f, 0.013746f, -0.025657f, 0.002627f, 0.005094f, -0.008507f, 0.018880f, 0.017390f, 0.019998f, 0.007963f, 0.012167f, -0.012432f, 0.005423f, 0.000673f, 0.005918f, -0.005634f, 0.000507f, -0.000347f, 0.008524f, -0.004997f, -0.011309f, 0.081530f, 0.007891f, 0.034660f, 0.092682f, -0.043137f, -0.024820f, -0.036090f, -0.013971f, 0.043237f, 0.002440f, 0.053167f, 0.013821f, -0.001578f, -0.020096f, 0.040249f, -0.025260f, 0.009400f, -0.017006f, 0.016796f, -0.026738f, 0.030734f, -0.015193f, -0.006803f, -0.017765f, 0.023693f, 0.015655f, -0.025475f, -0.006510f, 0.024925f, 0.007066f, -0.016258f, 0.001272f, -0.020994f, -0.070286f, 0.030589f, -0.037108f, -0.053500f, 0.032855f, 0.014982f, 0.035564f, -0.003130f, -0.035382f, -0.012855f, -0.009749f, 0.021105f, 0.027519f, 0.031239f, 0.051369f, 0.051266f, -0.023022f, 0.007257f, -0.054404f, 0.000760f, -0.039714f, -0.070091f, -0.007288f, + -0.057111f, 0.018224f, -0.045574f, -0.030502f, -0.030122f, -0.043295f, 0.004438f, -0.010542f, 0.003796f, -0.013140f, -0.005246f, -0.004106f, -0.074167f, 0.011520f, 0.011464f, 0.016610f, 0.035847f, -0.007088f, -0.058947f, 0.033889f, -0.038127f, 0.021788f, 0.021964f, 0.047946f, -0.026063f, -0.024326f, -0.015739f, -0.009684f, -0.034182f, 0.013469f, 0.008059f, 0.004068f, -0.008088f, 0.011886f, -0.017005f, 0.017149f, -0.002731f, 0.003377f, 0.005284f, -0.021421f, 0.000016f, 0.008094f, 0.021114f, -0.005713f, -0.012512f, 0.009027f, 0.014661f, 0.017818f, -0.011123f, -0.000030f, 0.010191f, -0.001368f, -0.001822f, -0.006817f, -0.013234f, 0.009300f, -0.000138f, 0.005904f, -0.007344f, -0.001147f, 0.012380f, -0.008233f, -0.012445f, -0.007305f, 0.002088f, -0.005440f, -0.021955f, 0.035418f, -0.008912f, -0.007388f, 0.003184f, 0.006728f, -0.005834f, 0.006465f, 0.008616f, -0.003542f, -0.000877f, -0.004875f, -0.007134f, 0.058026f, 0.108572f, -0.059602f, -0.048141f, -0.084143f, -0.171045f, -0.042360f, -0.017922f, 0.038180f, 0.023105f, -0.014853f, -0.033012f, 0.046679f, 0.057113f, 0.004889f, -0.002765f, 0.000264f, + -0.045129f, -0.026671f, -0.032008f, -0.024640f, -0.047736f, -0.000711f, -0.012062f, -0.005829f, 0.032745f, -0.044892f, 0.035923f, 0.033640f, -0.010521f, 0.017289f, -0.001973f, -0.079832f, -0.056837f, -0.031782f, -0.029056f, -0.013446f, 0.006298f, 0.030683f, 0.009965f, 0.016464f, 0.077025f, 0.069976f, 0.015861f, -0.052108f, -0.027074f, -0.002335f, -0.026757f, -0.049416f, -0.123169f, -0.103574f, -0.046560f, -0.011165f, 0.005084f, 0.026896f, -0.085441f, -0.049301f, 0.044313f, 0.051349f, 0.061734f, -0.056324f, -0.068296f, 0.022195f, -0.041659f, 0.101300f, -0.051095f, -0.005881f, -0.030062f, -0.016319f, 0.014016f, 0.029939f, -0.014938f, -0.040104f, 0.037230f, 0.036054f, -0.008156f, 0.041308f, 0.036767f, -0.080324f, 0.071871f, -0.046585f, 0.000250f, -0.013727f, -0.047970f, -0.013495f, 0.024337f, 0.018097f, -0.003870f, 0.009369f, -0.029239f, 0.000659f, 0.014752f, 0.019844f, 0.031366f, -0.023540f, 0.004798f, -0.006737f, -0.012738f, -0.033324f, -0.004050f, -0.032103f, 0.028351f, -0.005233f, -0.034067f, 0.005425f, -0.039028f, -0.002626f, 0.004757f, -0.009082f, -0.016857f, 0.001144f, 0.003175f, 0.004085f, + 0.012794f, -0.002424f, -0.000556f, 0.022786f, 0.007478f, -0.023000f, -0.026314f, 0.007182f, -0.017440f, -0.037193f, -0.012722f, -0.034988f, 0.011548f, 0.011055f, 0.027529f, 0.003734f, -0.028314f, -0.020319f, 0.020098f, 0.102047f, -0.034013f, 0.032900f, -0.001436f, -0.045417f, 0.007011f, -0.091697f, -0.020657f, 0.019715f, 0.001801f, -0.053375f, 0.031593f, 0.093487f, 0.065576f, -0.028926f, -0.058540f, -0.024925f, 0.006576f, 0.098238f, 0.013213f, 0.002479f, 0.000372f, 0.045425f, 0.046699f, 0.012213f, 0.035702f, 0.028960f, 0.054899f, -0.015643f, 0.006265f, 0.035080f, -0.032017f, -0.048729f, 0.027370f, 0.080605f, 0.017463f, 0.039064f, 0.003739f, 0.023983f, -0.107904f, 0.019970f, -0.004226f, 0.024371f, 0.105771f, 0.042684f, 0.014294f, -0.010506f, 0.047396f, -0.010831f, -0.022240f, 0.016749f, 0.029449f, 0.062252f, -0.020080f, 0.038689f, 0.007036f, 0.010728f, 0.024485f, 0.031495f, -0.000996f, -0.041241f, -0.025603f, 0.009630f, 0.079774f, 0.054642f, 0.042442f, 0.045960f, 0.038475f, -0.011048f, -0.098811f, -0.070991f, -0.135542f, -0.001919f, 0.041310f, 0.077993f, 0.012133f, -0.056941f, + 0.018786f, -0.035256f, 0.011293f, 0.026910f, 0.008135f, -0.016541f, -0.009168f, 0.000240f, -0.007658f, 0.021806f, -0.015001f, -0.039468f, 0.000739f, 0.013061f, 0.017517f, -0.025558f, -0.011584f, -0.047481f, 0.011739f, 0.020552f, -0.018227f, -0.016439f, 0.011843f, -0.009383f, -0.011730f, -0.010356f, -0.036865f, -0.008021f, 0.038003f, 0.023693f, 0.034408f, -0.018678f, -0.038965f, -0.029012f, 0.025274f, 0.019808f, -0.009184f, -0.001874f, -0.002381f, 0.006925f, -0.010969f, 0.022666f, -0.026000f, -0.014862f, 0.001805f, 0.004133f, 0.014967f, -0.032317f, 0.006633f, -0.023802f, 0.062660f, -0.018609f, 0.013663f, -0.020688f, 0.007225f, -0.038852f, -0.016265f, 0.083389f, -0.003397f, -0.039016f, 0.009535f, -0.007578f, -0.031703f, -0.025784f, 0.004644f, 0.043871f, 0.119685f, 0.053466f, 0.106082f, 0.055200f, 0.047112f, 0.044588f, -0.031581f, -0.026722f, -0.030220f, 0.012944f, 0.086920f, 0.027644f, -0.072721f, 0.030995f, -0.078185f, 0.038748f, -0.049611f, -0.010891f, -0.043563f, -0.047126f, -0.002317f, 0.005645f, -0.000767f, -0.058873f, 0.076113f, -0.015860f, 0.028546f, -0.074361f, 0.019716f, -0.017590f, + -0.022879f, 0.037959f, -0.031510f, 0.076310f, 0.008939f, -0.030648f, 0.003843f, -0.023191f, -0.031532f, 0.021179f, -0.052089f, -0.011571f, 0.065219f, -0.014681f, 0.026632f, -0.003951f, -0.047446f, 0.051469f, -0.028066f, -0.108216f, 0.013326f, 0.007657f, -0.000528f, 0.011439f, -0.014957f, -0.021446f, -0.006126f, 0.048347f, -0.092731f, 0.054294f, -0.021939f, -0.013348f, 0.060853f, -0.037966f, 0.017820f, 0.022028f, 0.088388f, 0.030346f, 0.039013f, -0.006743f, 0.052776f, -0.042716f, 0.041839f, 0.006418f, -0.016316f, 0.010764f, 0.002414f, 0.001269f, -0.022960f, -0.006402f, 0.003965f, -0.010203f, -0.017220f, 0.035492f, 0.000484f, -0.003048f, -0.010729f, 0.011521f, -0.014237f, 0.031588f, 0.018506f, 0.016768f, 0.003831f, -0.000623f, -0.003195f, 0.026363f, -0.021650f, -0.028012f, 0.010438f, 0.013601f, -0.001481f, 0.023622f, -0.010510f, -0.005298f, 0.001040f, -0.008668f, -0.026984f, -0.027274f, -0.002721f, 0.008525f, -0.013521f, 0.004193f, 0.008368f, 0.009124f, -0.007446f, -0.001091f, 0.017359f, -0.025375f, -0.045034f, 0.073925f, 0.068874f, 0.239792f, 0.096949f, -0.130644f, -0.061262f, -0.063996f, + -0.100267f, 0.069975f, 0.215709f, 0.086319f, 0.041036f, -0.054041f, -0.014743f, -0.003617f, -0.002407f, 0.103519f, 0.071047f, 0.045175f, 0.155903f, -0.186526f, 0.012289f, 0.097540f, -0.023485f, 0.020075f, 0.102340f, 0.017941f, -0.029023f, 0.055141f, -0.102718f, -0.206358f, -0.019531f, 0.020307f, -0.079873f, -0.009050f, 0.110765f, 0.018679f, 0.006685f, 0.042066f, -0.087141f, -0.177797f, -0.162285f, -0.073896f, 0.053924f, 0.105727f, 0.234323f, 0.058849f, -0.029746f, -0.029415f, -0.063264f, -0.140002f, -0.042362f, 0.102484f, 0.103300f, 0.108189f, 0.105662f, 0.066240f, 0.055119f, 0.015934f, 0.024204f, -0.089962f, -0.055101f, 0.013401f, 0.025355f, 0.046149f, 0.056713f, 0.139161f, 0.036607f, 0.081000f, -0.053137f, -0.052582f, -0.094266f, -0.020527f, -0.072061f, -0.017231f, 0.145237f, 0.186310f, 0.004173f, -0.007552f, -0.115909f, -0.133798f, -0.075234f, -0.031815f, 0.074434f, 0.039567f, -0.008043f, 0.027598f, -0.010207f, -0.019156f, -0.034931f, -0.033161f, -0.004374f, 0.008392f, 0.006926f, 0.040913f, -0.002928f, -0.000925f, -0.020923f, 0.000664f, -0.026061f, -0.008811f, 0.000096f, -0.038503f, + -0.017312f, 0.000767f, -0.010500f, -0.002760f, 0.022500f, 0.019939f, 0.046982f, -0.020757f, -0.008537f, -0.047677f, -0.038569f, -0.029307f, 0.048663f, 0.030814f, 0.015253f, 0.016117f, -0.015115f, -0.042362f, -0.034143f, 0.001471f, -0.024078f, 0.041325f, 0.061379f, -0.015865f, -0.170373f, -0.106176f, 0.062160f, 0.160489f, 0.188230f, 0.389793f, 0.238771f, 0.160973f, 0.143432f, 0.110437f, -0.018659f, -0.169804f, -0.184502f, -0.359977f, -0.381421f, -0.362862f, -0.230865f, -0.081491f, 0.081156f, 0.138433f, 0.232371f, 0.227009f, 0.160437f, 0.157154f, 0.202376f, 0.192921f, 0.174328f, 0.109492f, 0.077224f, 0.066924f, -0.006281f, -0.012441f, -0.222845f, -0.159909f, -0.199335f, -0.242752f, -0.101214f, -0.237077f, -0.190262f, -0.348964f, -0.304217f, -0.216760f, -0.143798f, -0.022196f, 0.181687f, 0.218719f, 0.185442f, 0.196842f, 0.183444f, 0.338254f, 0.441852f, 0.393682f, 0.391710f, 0.344503f, 0.333812f, 0.247084f, 0.248225f, 0.052405f, -0.166680f, -0.348562f, -0.332252f, -0.498488f, -0.414828f, -0.605274f, -0.719689f, -0.640709f, -0.607377f, -0.366622f, -0.254375f, 0.045882f, 0.121140f, 0.283508f, + 0.423010f, 0.650766f, 0.564671f, 0.813885f, 0.704002f, 0.503313f, 0.496057f, 0.224887f, 0.016660f, -0.046063f, -0.176358f, -0.309124f, -0.368192f, -0.441077f, -0.381274f, -0.346505f, -0.333282f, -0.271834f, -0.278976f, -0.230234f, -0.201647f, -0.062353f, -0.042866f, 0.054645f, 0.130095f, 0.148426f, 0.194916f, 0.276120f, 0.335334f, 0.356427f, 0.374168f, 0.273765f, 0.227520f, 0.219479f, 0.081789f, 0.052935f, -0.124404f, -0.298864f, -0.396660f, -0.406972f, -0.454241f, -0.289686f, -0.329137f, -0.220696f, -0.158524f, -0.045087f, 0.078520f, 0.153784f, 0.235626f, 0.243387f, 0.368329f, 0.377122f, 0.363342f, 0.306781f, 0.276258f, 0.108457f, 0.027658f, -0.070726f, -0.157010f, -0.300183f, -0.352209f, -0.294060f, -0.198994f, -0.177297f, -0.123428f, -0.114161f, -0.059607f, -0.009612f, 0.013690f, 0.008045f, 0.052104f, 0.057900f, 0.094101f, 0.078453f, 0.073878f, 0.067391f, 0.078304f, 0.052772f, 0.050564f, 0.055861f, 0.056861f, 0.020775f, 0.006321f, -0.013502f, -0.002813f, -0.008730f, 0.004202f} + }, + { + {-0.009636f, -0.025798f, -0.002176f, -0.004122f, -0.003524f, 0.000383f, -0.004304f, 0.001608f, 0.002528f, 0.010573f, -0.003571f, -0.000425f, -0.009753f, 0.000719f, 0.009802f, 0.000683f, 0.007084f, -0.002091f, 0.002973f, -0.004095f, -0.006160f, 0.000208f, 0.006734f, -0.000864f, -0.008442f, -0.000347f, 0.008170f, 0.002666f, -0.003504f, -0.002915f, -0.000388f, -0.001121f, -0.001913f, 0.000102f, -0.001386f, -0.002807f, -0.000362f, 0.001684f, 0.001140f, -0.000366f, -0.006433f, 0.009567f, 0.013019f, 0.000429f, 0.001512f, -0.005252f, -0.002994f, 0.001046f, -0.006805f, -0.007532f, 0.004506f, -0.006115f, 0.004453f, 0.005794f, 0.005749f, 0.002177f, -0.000876f, 0.001579f, 0.001199f, 0.004367f, -0.009364f, 0.000833f, -0.001213f, -0.006786f, -0.009222f, 0.000299f, 0.004600f, -0.003480f, -0.000492f, -0.001038f, -0.000654f, 0.006532f, 0.003218f, 0.000907f, 0.002541f, -0.002082f, -0.007589f, 0.002989f, 0.001226f, 0.006539f, -0.007802f, -0.005866f, 0.004398f, -0.003444f, -0.001627f, -0.005762f, 0.001314f, -0.003365f, -0.003173f, 0.000130f, -0.002544f, -0.002715f, 0.000760f, -0.001443f, -0.000702f, -0.003096f, + 0.001945f, -0.000335f, 0.000183f, -0.000784f, 0.001589f, -0.000242f, 0.000515f, -0.000503f, -0.000497f, -0.023631f, -0.005584f, 0.009208f, -0.001422f, -0.007267f, 0.002972f, -0.017518f, -0.006888f, -0.002523f, -0.003299f, -0.009051f, -0.009713f, 0.005200f, 0.007823f, 0.006859f, -0.009093f, -0.013178f, 0.001362f, -0.007707f, -0.014226f, 0.003248f, -0.001029f, 0.004012f, 0.015707f, -0.005193f, -0.001806f, -0.009982f, 0.013554f, 0.001080f, 0.006697f, 0.004740f, 0.011105f, 0.005737f, 0.003343f, -0.011129f, -0.001396f, -0.010231f, -0.002959f, 0.000470f, -0.004436f, 0.003467f, 0.002780f, -0.004829f, -0.009646f, 0.006084f, 0.009794f, 0.002813f, -0.004852f, -0.007328f, -0.004684f, 0.002375f, -0.008395f, -0.010458f, -0.003102f, 0.005207f, -0.003012f, 0.002578f, 0.006473f, 0.004182f, -0.005007f, 0.009572f, 0.000746f, 0.008156f, -0.006922f, -0.005716f, -0.003428f, -0.003986f, 0.005578f, -0.003175f, 0.000239f, 0.009664f, 0.003335f, 0.000263f, -0.009220f, 0.002509f, -0.003732f, 0.006786f, 0.009737f, -0.001672f, 0.000727f, -0.004462f, 0.003641f, 0.008671f, -0.003148f, 0.005413f, 0.002370f, 0.001170f, + 0.004379f, 0.001799f, 0.000147f, 0.003579f, 0.001280f, -0.000258f, -0.000044f, 0.001599f, 0.001375f, -0.001573f, 0.001136f, 0.001227f, 0.001765f, -0.004828f, 0.006094f, 0.008424f, 0.003394f, -0.005245f, 0.003664f, -0.002453f, 0.002536f, 0.015828f, 0.009745f, -0.013336f, 0.009058f, -0.007331f, -0.003633f, -0.001915f, 0.000260f, 0.006739f, 0.000246f, 0.018508f, 0.005336f, -0.007081f, -0.004670f, -0.004590f, 0.013015f, 0.003079f, 0.012534f, 0.004129f, 0.008436f, 0.013098f, 0.014998f, 0.005722f, -0.001704f, -0.001488f, 0.002255f, -0.012016f, -0.011201f, 0.003587f, -0.008506f, 0.004839f, 0.002310f, -0.002870f, -0.001265f, 0.003537f, 0.012512f, -0.004095f, -0.004268f, -0.006431f, 0.015986f, -0.002156f, -0.019966f, -0.009946f, -0.007925f, -0.007250f, 0.008228f, 0.007930f, 0.006951f, 0.010436f, 0.004613f, 0.006544f, -0.000307f, -0.000619f, -0.000311f, 0.010495f, 0.003392f, 0.006161f, -0.013904f, 0.000917f, 0.000623f, 0.000760f, 0.000900f, 0.006050f, 0.004215f, 0.001759f, -0.006747f, -0.006694f, 0.003877f, 0.003251f, -0.002000f, -0.000411f, -0.005439f, -0.006882f, -0.005650f, 0.003841f, + 0.006651f, 0.000824f, 0.000367f, 0.002335f, -0.001951f, -0.000234f, -0.001547f, 0.001217f, 0.001160f, 0.000706f, -0.000941f, 0.002012f, 0.003183f, -0.000462f, 0.000299f, 0.000718f, -0.000530f, 0.000857f, -0.001341f, 0.002347f, -0.000002f, -0.000441f, -0.001528f, 0.002075f, -0.004046f, 0.002280f, 0.000644f, 0.001719f, -0.000316f, 0.035122f, 0.007783f, 0.005358f, -0.004197f, -0.002434f, 0.003493f, 0.002461f, 0.009456f, 0.012396f, -0.000481f, 0.018250f, 0.007368f, -0.006436f, -0.005936f, -0.000461f, 0.008822f, -0.001030f, -0.004673f, 0.009658f, 0.001450f, 0.026317f, 0.006986f, 0.005209f, 0.001180f, -0.002543f, 0.001338f, 0.003981f, 0.005202f, -0.001197f, 0.000153f, 0.014119f, 0.002076f, 0.015543f, -0.007717f, -0.007476f, 0.005232f, 0.023339f, 0.006867f, 0.005636f, -0.001918f, -0.010100f, -0.003861f, 0.003152f, 0.000802f, -0.000236f, 0.000965f, -0.014331f, 0.001125f, -0.006309f, 0.005849f, 0.004514f, -0.005543f, 0.003290f, 0.005140f, 0.003371f, -0.006615f, -0.006920f, 0.001765f, 0.002439f, 0.000141f, -0.008895f, 0.002446f, -0.003467f, 0.005826f, -0.000828f, 0.001235f, 0.003612f, + -0.001243f, 0.001993f, -0.003043f, 0.000969f, 0.020621f, 0.002314f, 0.007393f, 0.000238f, -0.005509f, 0.003360f, 0.001359f, 0.006341f, -0.011259f, -0.007949f, 0.004037f, -0.001678f, 0.002483f, -0.002974f, 0.004484f, 0.003635f, 0.000604f, -0.005053f, -0.001762f, -0.006873f, -0.001074f, -0.001585f, 0.004565f, -0.003173f, -0.000687f, 0.000743f, -0.000452f, -0.001657f, -0.001495f, 0.001279f, -0.001596f, -0.002312f, 0.000136f, 0.000081f, 0.001403f, -0.004655f, -0.001640f, 0.001170f, 0.000844f, -0.005067f, -0.001058f, -0.000345f, -0.006333f, -0.000740f, 0.005173f, -0.007745f, -0.001344f, 0.007878f, -0.003991f, -0.012215f, -0.000080f, 0.020156f, -0.001402f, 0.015825f, 0.008099f, 0.021891f, 0.002628f, 0.002049f, 0.007947f, -0.006147f, -0.013071f, -0.017156f, 0.004022f, -0.008730f, 0.020157f, 0.011557f, 0.014231f, -0.002661f, -0.005965f, 0.001808f, 0.003167f, 0.006697f, 0.018856f, 0.002292f, 0.007833f, -0.008604f, 0.005977f, -0.006097f, 0.002537f, -0.003274f, 0.006171f, 0.010847f, 0.001410f, 0.010365f, 0.003735f, 0.005203f, -0.003051f, -0.002468f, 0.013757f, -0.003199f, -0.003525f, 0.010440f, + -0.006300f, -0.000560f, 0.001414f, -0.004532f, -0.006120f, 0.004635f, -0.007010f, -0.001301f, -0.008930f, -0.018855f, -0.002204f, -0.002848f, -0.000585f, -0.019650f, -0.007607f, -0.005985f, -0.005195f, 0.007413f, 0.019278f, -0.004922f, 0.006122f, 0.010151f, -0.002939f, 0.001920f, 0.001600f, 0.001163f, -0.007179f, 0.007719f, -0.009078f, 0.002348f, 0.006311f, 0.018170f, 0.005548f, 0.005384f, 0.001519f, -0.000235f, 0.005343f, -0.006565f, -0.000196f, 0.003748f, 0.001632f, 0.000322f, -0.007502f, 0.004385f, 0.005208f, 0.005384f, -0.001176f, 0.004006f, 0.002025f, 0.001126f, 0.003491f, 0.002105f, 0.000270f, 0.002059f, -0.000679f, 0.001594f, 0.000860f, 0.001340f, 0.001934f, 0.002631f, 0.002944f, 0.002154f, 0.001911f, 0.002334f, -0.001584f, 0.002108f, -0.025561f, 0.002239f, 0.013688f, 0.007249f, -0.014357f, -0.001055f, 0.000634f, 0.003402f, 0.005207f, -0.000800f, -0.011191f, -0.010656f, 0.001611f, 0.018113f, 0.008551f, 0.010749f, 0.018152f, -0.012304f, 0.012933f, 0.024050f, -0.002277f, 0.005434f, -0.013704f, 0.004696f, 0.004840f, -0.011679f, -0.006382f, -0.002508f, 0.005443f, -0.011801f, + -0.015693f, 0.003004f, 0.001604f, -0.013357f, 0.000945f, 0.004244f, -0.002860f, 0.028508f, -0.001762f, -0.020161f, -0.001528f, 0.007000f, 0.015881f, 0.005943f, 0.007025f, -0.012917f, 0.003400f, 0.004115f, -0.011729f, -0.000730f, -0.002159f, 0.019807f, 0.011906f, -0.003257f, -0.007001f, -0.015295f, 0.006390f, 0.006170f, -0.009268f, -0.000284f, 0.003446f, 0.006022f, 0.005927f, -0.007778f, -0.000453f, -0.001678f, 0.018320f, -0.015574f, 0.001674f, -0.004041f, 0.016466f, -0.001179f, -0.004338f, -0.006989f, 0.001839f, -0.007234f, -0.017279f, 0.000491f, 0.012681f, 0.003892f, 0.007848f, 0.002040f, -0.006401f, -0.002421f, -0.003365f, 0.011037f, 0.004103f, -0.002981f, -0.000688f, 0.010023f, 0.007204f, -0.002813f, 0.000791f, 0.001588f, 0.001872f, -0.000183f, 0.003723f, 0.002788f, 0.002162f, 0.000263f, -0.001694f, -0.000634f, 0.000503f, -0.001431f, 0.000182f, -0.001998f, -0.000961f, 0.001641f, 0.009712f, 0.008842f, 0.003107f, -0.006489f, 0.001799f, 0.004232f, 0.029886f, 0.019852f, 0.014847f, 0.021054f, 0.008476f, -0.001828f, 0.002947f, 0.007782f, -0.021296f, 0.010880f, 0.000247f, 0.011697f, + -0.008636f, -0.004356f, -0.013768f, 0.003864f, 0.024031f, -0.023618f, -0.015066f, -0.025109f, 0.012613f, -0.005757f, 0.000698f, -0.011455f, 0.001368f, -0.004300f, -0.011531f, 0.004316f, 0.005487f, -0.017879f, -0.002548f, 0.003173f, -0.004045f, 0.009359f, -0.025970f, -0.012579f, 0.026338f, 0.002592f, -0.000576f, -0.002681f, 0.000824f, -0.013503f, -0.014378f, 0.000776f, -0.020868f, -0.004860f, 0.001984f, 0.005493f, -0.009033f, -0.002124f, 0.025665f, -0.001733f, 0.008942f, 0.019105f, -0.017965f, -0.006278f, 0.004095f, 0.004474f, 0.003340f, -0.005543f, -0.012865f, 0.014574f, -0.001713f, -0.013687f, 0.009917f, -0.002506f, 0.002255f, 0.003763f, -0.007444f, -0.004500f, -0.003204f, -0.005605f, -0.008058f, -0.009627f, -0.009298f, -0.011794f, -0.003644f, -0.005002f, -0.001248f, -0.001543f, -0.000228f, 0.001540f, -0.004917f, -0.003849f, 0.002701f, 0.003271f, 0.005309f, -0.000293f, -0.002258f, -0.006921f, -0.002032f, -0.007998f, -0.005183f, -0.001057f, 0.001510f, -0.000553f, 0.001030f, -0.001992f, -0.001241f, 0.006009f, 0.002260f, 0.004188f, -0.004064f, 0.001114f, 0.000941f, 0.001626f, -0.008183f, 0.000680f, + 0.002408f, 0.000092f, 0.004331f, -0.049578f, -0.027788f, 0.022573f, -0.008798f, -0.010441f, 0.013445f, 0.011964f, -0.021397f, -0.028557f, -0.009358f, -0.010113f, -0.010955f, -0.001795f, -0.019911f, -0.014080f, 0.007054f, 0.000933f, -0.026731f, -0.029116f, -0.016582f, -0.007862f, -0.001660f, 0.015161f, -0.001262f, -0.010769f, 0.008049f, -0.024205f, 0.000551f, -0.000970f, 0.000850f, 0.008686f, 0.004487f, -0.017585f, -0.013553f, 0.010834f, 0.003536f, 0.039804f, 0.009522f, -0.013014f, 0.001587f, 0.001474f, 0.000191f, 0.010650f, 0.001783f, 0.004561f, -0.004296f, -0.008515f, 0.002357f, -0.022589f, -0.004489f, -0.009733f, -0.012288f, 0.002834f, -0.018371f, 0.021337f, -0.002961f, 0.009043f, 0.014875f, 0.004699f, 0.007772f, -0.000769f, -0.010053f, -0.000194f, -0.001505f, -0.011972f, 0.015620f, -0.006342f, 0.027987f, -0.000693f, -0.000893f, 0.001556f, -0.007576f, -0.015043f, 0.004517f, -0.011748f, -0.005113f, 0.016794f, -0.021606f, -0.020736f, 0.013824f, 0.013654f, 0.011236f, -0.017524f, 0.012591f, 0.005629f, 0.007239f, -0.000258f, 0.003032f, 0.003782f, 0.009738f, 0.004556f, 0.002209f, 0.007708f, + -0.001229f, -0.000152f, -0.006315f, -0.004410f, -0.001215f, 0.005359f, -0.006762f, 0.001216f, -0.000988f, -0.003507f, -0.002600f, 0.002008f, -0.008632f, -0.004787f, -0.006498f, -0.000753f, 0.002475f, 0.000311f, 0.005992f, -0.001725f, 0.006280f, 0.000934f, 0.002190f, 0.001406f, 0.004813f, -0.003539f, -0.003402f, 0.010256f, 0.036718f, -0.020423f, 0.017418f, 0.007400f, 0.012949f, -0.005060f, -0.020189f, 0.003040f, -0.005378f, -0.018583f, 0.037886f, -0.002506f, -0.010675f, -0.037287f, 0.022912f, 0.006565f, -0.000530f, -0.013828f, -0.016315f, 0.000599f, 0.038472f, 0.014529f, -0.001616f, -0.003646f, -0.016673f, -0.013323f, 0.011023f, 0.005085f, -0.013069f, -0.008963f, 0.013346f, 0.003516f, -0.000678f, 0.011720f, 0.017692f, 0.002945f, 0.023393f, 0.026817f, 0.016065f, -0.006015f, 0.005751f, 0.002313f, 0.004273f, 0.014049f, -0.019903f, 0.020928f, -0.001570f, -0.010452f, -0.016167f, 0.000217f, 0.013516f, 0.009683f, -0.019060f, 0.004261f, 0.014801f, 0.002409f, -0.013850f, -0.029442f, -0.027033f, 0.007193f, 0.011731f, 0.002103f, -0.010583f, -0.001287f, 0.021308f, -0.009752f, -0.016368f, -0.031110f, + 0.003132f, 0.006154f, -0.023454f, 0.008840f, 0.023102f, -0.010499f, 0.017927f, 0.006382f, -0.021744f, -0.015896f, 0.001488f, 0.022232f, -0.002491f, 0.023348f, -0.004235f, -0.008073f, 0.004698f, 0.011941f, 0.002956f, -0.003896f, -0.006456f, 0.004062f, 0.010300f, 0.008606f, 0.001225f, 0.013887f, 0.002336f, 0.009979f, 0.002234f, 0.013620f, 0.001812f, 0.008431f, -0.000378f, 0.006746f, 0.003359f, -0.003293f, -0.010162f, 0.000902f, -0.011846f, -0.001575f, -0.005006f, 0.001859f, -0.001785f, -0.000407f, -0.010564f, -0.000930f, 0.004535f, -0.004999f, 0.000386f, -0.001192f, 0.000441f, -0.000659f, -0.007739f, 0.001157f, 0.044214f, 0.029519f, 0.006368f, -0.008645f, -0.005055f, -0.005961f, -0.030842f, -0.012091f, -0.000693f, 0.019763f, -0.014342f, -0.007601f, -0.006869f, 0.000587f, 0.031874f, -0.024766f, -0.007008f, -0.001140f, 0.014800f, -0.004988f, -0.018786f, -0.030697f, 0.010762f, -0.021140f, -0.010090f, -0.013103f, -0.014738f, 0.004761f, -0.024541f, -0.011549f, 0.021182f, 0.032409f, 0.001168f, -0.019936f, -0.018273f, 0.029899f, -0.003626f, -0.015879f, 0.030688f, 0.001164f, 0.001600f, 0.001506f, + -0.034109f, 0.013951f, -0.012830f, 0.012482f, 0.011058f, -0.022794f, -0.002810f, -0.023128f, 0.008755f, -0.022427f, -0.004155f, 0.009651f, 0.012550f, -0.007379f, 0.007507f, -0.027264f, 0.018580f, -0.001966f, 0.012578f, 0.010982f, 0.007516f, -0.005931f, -0.006053f, 0.027504f, -0.019223f, 0.013735f, -0.004952f, -0.023138f, -0.014358f, -0.001410f, 0.024273f, -0.013929f, 0.011212f, 0.003440f, -0.007879f, 0.000447f, -0.027689f, 0.034754f, 0.020986f, -0.003967f, -0.009720f, 0.017090f, 0.007061f, -0.004879f, -0.009181f, 0.002032f, -0.006219f, 0.008854f, -0.002116f, 0.004704f, 0.014078f, 0.005268f, 0.011085f, 0.000081f, 0.003748f, 0.001784f, -0.002407f, 0.000394f, -0.001346f, 0.009924f, 0.003592f, 0.013734f, 0.002006f, -0.007572f, 0.009672f, -0.003910f, -0.000569f, 0.007547f, -0.007476f, -0.002308f, -0.004080f, -0.003002f, 0.005884f, 0.003825f, 0.002921f, 0.012768f, -0.004090f, -0.004345f, 0.017400f, 0.003328f, -0.011518f, -0.026423f, -0.001444f, -0.034342f, 0.005912f, 0.003060f, 0.016799f, -0.013715f, -0.003276f, 0.008908f, 0.007415f, 0.009799f, -0.023238f, 0.032867f, 0.023315f, 0.004296f, + 0.017240f, -0.007769f, -0.033103f, 0.007818f, -0.013935f, -0.015506f, 0.015611f, 0.038093f, 0.006677f, -0.010505f, -0.013801f, -0.030553f, 0.000078f, 0.001424f, 0.046997f, -0.018490f, -0.000721f, 0.001410f, -0.001410f, -0.028301f, -0.031920f, 0.025286f, 0.001016f, 0.014372f, -0.004085f, -0.036173f, -0.020810f, 0.002892f, -0.006025f, -0.007649f, -0.010302f, 0.023679f, -0.004970f, 0.015383f, -0.016562f, 0.032982f, -0.038913f, 0.019283f, 0.020232f, 0.012052f, 0.010718f, 0.009766f, 0.030852f, 0.015836f, -0.002196f, 0.006578f, 0.000285f, 0.030448f, 0.045799f, -0.005275f, 0.003703f, -0.013445f, 0.019195f, 0.030724f, -0.020963f, 0.006457f, -0.052893f, 0.034606f, 0.035797f, 0.023850f, 0.033309f, -0.015157f, -0.026475f, -0.001906f, -0.003783f, -0.007844f, -0.005495f, -0.015921f, -0.010985f, -0.005887f, -0.001311f, -0.008905f, 0.005430f, 0.009728f, 0.003880f, -0.014961f, 0.003097f, -0.008312f, -0.008630f, -0.005526f, 0.006364f, 0.005760f, -0.002487f, -0.003726f, -0.001168f, -0.002597f, 0.001771f, -0.014477f, 0.004986f, 0.002095f, 0.009552f, 0.002095f, -0.000439f, -0.000423f, 0.002252f, 0.008202f, + 0.003039f, -0.007494f, 0.006192f, 0.000005f, 0.001089f, -0.038496f, -0.005730f, -0.049244f, -0.025313f, 0.019397f, -0.020204f, -0.043793f, 0.004034f, -0.023609f, 0.001052f, 0.000864f, -0.028134f, -0.026691f, 0.012039f, 0.025807f, 0.007745f, -0.029977f, 0.014309f, -0.033721f, -0.011868f, -0.012414f, 0.010520f, -0.013848f, -0.006360f, 0.016228f, 0.002730f, -0.011088f, -0.024058f, 0.025445f, 0.024615f, 0.032062f, 0.004142f, -0.003550f, 0.001091f, 0.010286f, -0.002467f, 0.013159f, -0.014504f, 0.017298f, -0.006849f, 0.019924f, 0.015919f, 0.012035f, -0.005832f, 0.000846f, -0.031019f, 0.010561f, -0.007847f, 0.023315f, 0.004187f, -0.054130f, 0.008267f, 0.026710f, 0.035850f, -0.020633f, -0.028267f, 0.033787f, 0.015275f, 0.023760f, -0.042350f, 0.020930f, 0.052890f, 0.055788f, 0.003492f, 0.001343f, 0.031676f, -0.021947f, -0.029329f, 0.018767f, -0.032467f, 0.012184f, -0.015156f, -0.012736f, -0.007223f, -0.069783f, -0.040373f, -0.033978f, 0.025009f, 0.009530f, 0.006981f, -0.024781f, -0.010158f, -0.018719f, -0.003620f, -0.010050f, 0.027333f, 0.006527f, -0.010979f, -0.024341f, -0.005503f, 0.015781f, + -0.002600f, -0.006724f, 0.004758f, 0.016518f, -0.005965f, -0.009744f, -0.004767f, -0.003609f, -0.001216f, 0.012847f, 0.012801f, 0.011215f, -0.011422f, 0.014696f, -0.000850f, 0.004205f, 0.016684f, -0.007539f, -0.007684f, 0.014645f, 0.026167f, -0.006142f, -0.008699f, -0.004182f, 0.003040f, -0.004736f, -0.018232f, 0.002924f, 0.013091f, 0.003566f, -0.018368f, -0.017463f, 0.008094f, 0.005918f, -0.001123f, -0.001122f, -0.003340f, -0.012990f, -0.008856f, -0.029033f, -0.055661f, 0.042555f, 0.004484f, 0.014280f, -0.007194f, 0.030135f, 0.000821f, -0.025724f, 0.019916f, 0.008087f, -0.009085f, -0.015529f, -0.012143f, 0.003825f, 0.007288f, 0.026695f, -0.015181f, 0.020949f, 0.006697f, 0.038069f, -0.054606f, -0.014665f, -0.008633f, 0.007033f, 0.022330f, 0.032361f, 0.007377f, -0.026282f, 0.017776f, 0.025462f, 0.021463f, -0.005992f, 0.007509f, 0.001546f, -0.008942f, -0.003670f, 0.001584f, 0.008244f, 0.002998f, 0.018830f, 0.003138f, -0.023741f, 0.022220f, -0.024615f, -0.031399f, 0.004893f, 0.022762f, -0.011046f, -0.008120f, 0.008269f, 0.011129f, 0.019600f, -0.011151f, 0.009299f, 0.044286f, -0.017647f, + -0.046980f, -0.060891f, -0.030739f, -0.041253f, 0.018784f, 0.035827f, 0.022947f, 0.008769f, 0.021588f, 0.012678f, 0.023856f, -0.020371f, 0.026961f, 0.014002f, 0.010965f, 0.028069f, 0.036497f, -0.011325f, -0.008095f, 0.009982f, -0.002350f, 0.032831f, 0.012753f, -0.004990f, 0.005579f, -0.040004f, -0.027950f, 0.005571f, -0.001535f, 0.007143f, 0.002744f, 0.008439f, -0.007439f, 0.021125f, -0.011103f, -0.012849f, -0.012396f, -0.021022f, -0.007594f, -0.004132f, 0.006961f, 0.005654f, -0.003106f, -0.018048f, -0.001007f, 0.006026f, 0.002063f, -0.007218f, 0.004331f, 0.000295f, 0.007039f, -0.007522f, 0.003161f, 0.001505f, 0.008482f, -0.003976f, 0.013027f, -0.007976f, -0.009194f, 0.002808f, -0.001517f, -0.006705f, 0.002207f, 0.009032f, 0.000827f, -0.001309f, 0.055798f, 0.005323f, 0.008814f, -0.011626f, 0.020313f, -0.063798f, -0.028066f, -0.043619f, -0.044889f, 0.017802f, -0.039162f, 0.038524f, 0.043981f, 0.001882f, 0.009597f, -0.006802f, 0.008112f, -0.041728f, 0.017212f, 0.046097f, -0.026205f, -0.053706f, 0.007178f, -0.020217f, -0.017041f, -0.052382f, 0.009144f, 0.019200f, -0.000129f, -0.007128f, + 0.016914f, -0.029880f, -0.004898f, 0.019405f, -0.010637f, -0.026481f, 0.003278f, -0.013225f, 0.027429f, -0.018136f, -0.009987f, 0.025607f, 0.022302f, 0.047295f, 0.006340f, 0.011414f, -0.004279f, 0.012697f, 0.016923f, 0.029221f, -0.008351f, -0.000960f, -0.018091f, 0.038555f, -0.048520f, 0.052208f, 0.001935f, -0.020808f, 0.024537f, -0.018971f, -0.013896f, 0.048023f, -0.069242f, 0.011316f, -0.014549f, 0.013572f, -0.026815f, 0.012962f, 0.027577f, -0.014230f, -0.002463f, -0.007305f, -0.011402f, -0.006145f, 0.051177f, -0.057946f, -0.019714f, 0.097453f, -0.036599f, -0.042991f, 0.042263f, 0.025253f, 0.028239f, -0.024520f, 0.002028f, -0.024371f, -0.013565f, -0.003810f, -0.027762f, 0.006119f, 0.003857f, -0.007240f, 0.010132f, 0.008993f, -0.012520f, -0.023676f, -0.005990f, -0.001972f, 0.009423f, -0.020891f, -0.014570f, 0.000578f, -0.001980f, 0.005305f, 0.013168f, 0.031056f, -0.013994f, -0.000674f, -0.003273f, -0.003211f, 0.009050f, 0.003539f, -0.018325f, -0.013889f, 0.014961f, -0.011979f, 0.005741f, 0.003870f, -0.011096f, 0.004326f, -0.002430f, -0.018826f, -0.015322f, 0.009309f, 0.006242f, -0.002804f, + -0.000183f, 0.011846f, -0.027691f, -0.042851f, 0.004192f, -0.016276f, -0.014468f, -0.024147f, -0.030158f, 0.038020f, 0.016415f, 0.002363f, 0.017903f, 0.045038f, 0.026685f, -0.003153f, 0.009238f, 0.030255f, 0.038726f, -0.034409f, 0.016075f, 0.032322f, 0.014131f, 0.011800f, 0.044716f, 0.021465f, 0.009359f, -0.001432f, 0.020141f, -0.002319f, 0.022786f, 0.018726f, 0.010323f, -0.020996f, 0.039557f, -0.032563f, -0.004029f, 0.049397f, 0.048953f, -0.011726f, -0.043336f, 0.016248f, -0.000630f, 0.042365f, 0.073081f, 0.016242f, -0.011160f, 0.005085f, -0.041885f, -0.005034f, -0.011048f, -0.009095f, 0.000869f, 0.037194f, -0.015970f, 0.016320f, 0.044883f, 0.007530f, -0.041469f, 0.027367f, -0.002096f, 0.017374f, 0.042172f, 0.059263f, -0.016721f, -0.015834f, -0.005069f, -0.047115f, -0.068824f, 0.001787f, -0.031290f, -0.005165f, -0.037939f, -0.003995f, 0.001242f, 0.005074f, 0.028196f, -0.000889f, -0.019603f, -0.032719f, 0.023856f, -0.010161f, 0.020414f, 0.000657f, 0.038009f, 0.013994f, 0.014038f, 0.000046f, -0.011797f, 0.021245f, -0.016267f, -0.018955f, -0.005670f, -0.014276f, -0.005479f, 0.000991f, + 0.001522f, -0.005190f, 0.005859f, 0.008279f, 0.000708f, -0.002251f, 0.011075f, -0.009604f, -0.013466f, 0.008145f, 0.009754f, 0.001851f, -0.011641f, -0.014113f, -0.008164f, 0.011196f, 0.015206f, 0.001895f, -0.002132f, 0.016732f, 0.004622f, 0.007932f, 0.006995f, 0.011935f, 0.003403f, -0.002317f, -0.008877f, 0.004736f, 0.009598f, -0.019825f, 0.046452f, -0.087169f, 0.047944f, -0.036668f, -0.086077f, -0.025398f, -0.021733f, -0.002970f, -0.019896f, 0.010525f, -0.023840f, -0.053202f, -0.032237f, -0.015842f, -0.004906f, 0.006207f, -0.021981f, 0.021550f, 0.041724f, 0.001657f, -0.002657f, 0.011559f, 0.002537f, -0.007676f, -0.015529f, -0.008624f, 0.011276f, 0.012539f, -0.003727f, 0.011933f, 0.051285f, 0.014254f, -0.015014f, -0.050765f, -0.008139f, 0.036090f, -0.043792f, -0.020452f, -0.016683f, 0.000666f, -0.003346f, 0.027761f, -0.009113f, 0.003453f, 0.038025f, 0.013718f, 0.042185f, -0.005790f, -0.019900f, -0.008996f, -0.010806f, -0.010787f, 0.020363f, 0.002359f, 0.013779f, 0.025861f, -0.045183f, 0.006797f, -0.011938f, -0.027979f, -0.021193f, 0.044322f, 0.031850f, 0.001773f, -0.021528f, 0.009100f, + 0.018691f, 0.002110f, 0.012952f, -0.030174f, -0.074953f, -0.034565f, -0.027406f, 0.027655f, 0.002847f, -0.003263f, -0.012602f, 0.005581f, -0.008387f, -0.023499f, -0.024503f, -0.012603f, 0.030438f, 0.023150f, -0.033795f, -0.042117f, -0.016454f, 0.003191f, 0.025804f, 0.010651f, -0.008093f, -0.011112f, -0.008598f, 0.006248f, -0.018663f, 0.003070f, -0.012701f, 0.001354f, 0.019529f, 0.020980f, 0.005630f, -0.010426f, 0.006831f, 0.015211f, -0.000333f, -0.002906f, 0.011217f, -0.014896f, 0.021344f, 0.019297f, 0.007568f, -0.000031f, -0.000684f, -0.001806f, 0.017951f, -0.006629f, -0.009159f, -0.010359f, -0.015007f, -0.014593f, 0.005038f, -0.005159f, 0.006695f, -0.003924f, 0.003473f, 0.011572f, -0.005237f, -0.010424f, -0.015432f, -0.003972f, 0.007569f, -0.010772f, 0.025179f, -0.034404f, 0.041394f, -0.003287f, -0.065431f, 0.013394f, -0.031535f, -0.006494f, -0.004717f, -0.007702f, -0.041645f, 0.013160f, 0.002212f, 0.033080f, -0.071216f, 0.001210f, 0.035175f, 0.004290f, -0.016860f, -0.035995f, -0.002751f, 0.020746f, 0.030817f, -0.025476f, -0.009045f, 0.016677f, 0.035220f, 0.032169f, -0.030909f, -0.006250f, + -0.050151f, 0.023490f, 0.025589f, 0.015866f, -0.014221f, -0.003853f, -0.013569f, -0.005264f, -0.016641f, 0.004914f, 0.036754f, -0.013504f, -0.014314f, -0.012497f, -0.020658f, 0.041676f, 0.035883f, -0.003413f, 0.050483f, -0.002204f, 0.018032f, -0.044373f, 0.036639f, 0.016300f, -0.049850f, -0.016090f, 0.057392f, 0.023815f, 0.015661f, 0.011213f, -0.026787f, -0.021152f, -0.028730f, 0.049776f, -0.025558f, 0.038467f, 0.039891f, -0.045006f, 0.104454f, -0.022270f, 0.064847f, 0.002896f, -0.014485f, -0.027870f, 0.048764f, 0.018827f, -0.037540f, -0.022977f, -0.080862f, 0.032476f, -0.010959f, 0.037334f, -0.049716f, 0.055819f, -0.042566f, 0.016515f, -0.016400f, -0.012734f, 0.036854f, 0.003487f, 0.003589f, 0.020482f, 0.014479f, -0.009340f, 0.024240f, -0.002915f, 0.007235f, -0.016758f, 0.003451f, -0.002271f, -0.010457f, -0.016846f, 0.000783f, -0.018701f, 0.009154f, 0.008088f, -0.004199f, 0.016210f, -0.005627f, -0.009712f, -0.013395f, 0.009562f, 0.002180f, -0.002239f, -0.026644f, 0.012183f, -0.005137f, -0.032319f, -0.010070f, 0.009301f, -0.008940f, -0.016716f, 0.011439f, -0.009069f, 0.009491f, -0.017012f, + 0.008284f, -0.017336f, -0.002760f, -0.002597f, 0.009668f, -0.004077f, 0.001984f, -0.005622f, -0.005710f, 0.025015f, 0.042908f, 0.003558f, -0.035981f, 0.017433f, -0.069487f, -0.018428f, -0.063124f, -0.087315f, 0.003002f, -0.033522f, 0.011260f, -0.006402f, -0.013678f, -0.033164f, -0.022848f, 0.019628f, 0.052633f, -0.043753f, -0.009387f, -0.075444f, -0.066295f, 0.018381f, 0.026601f, -0.041384f, -0.043395f, 0.002827f, 0.009646f, -0.070082f, 0.003766f, 0.001600f, 0.036500f, -0.031404f, 0.001410f, 0.030333f, -0.019677f, -0.036440f, -0.040853f, -0.019663f, -0.037254f, -0.030461f, -0.038893f, 0.054569f, -0.069237f, -0.042854f, 0.062611f, -0.001929f, 0.017656f, -0.052339f, -0.009165f, -0.014875f, 0.001364f, 0.088332f, -0.012537f, -0.001675f, 0.008689f, 0.041410f, 0.000928f, -0.039047f, -0.017368f, -0.028146f, 0.009458f, 0.105660f, 0.020490f, -0.037194f, 0.079542f, 0.057542f, -0.051161f, 0.059344f, 0.097287f, 0.000852f, -0.038068f, 0.066266f, -0.011594f, 0.069711f, 0.062726f, 0.005280f, -0.003362f, -0.018723f, 0.043754f, 0.035657f, 0.020195f, -0.037219f, -0.012504f, -0.024031f, 0.055425f, -0.007051f, + -0.038341f, -0.018615f, -0.038551f, -0.016541f, 0.037848f, 0.004305f, -0.020215f, -0.006826f, -0.024714f, -0.004134f, 0.033791f, -0.016411f, 0.008148f, -0.003419f, -0.032662f, 0.035117f, 0.004013f, 0.014087f, 0.016801f, -0.022652f, 0.006752f, 0.032266f, -0.006025f, 0.001272f, -0.017584f, -0.000072f, 0.002376f, -0.010629f, -0.010043f, 0.006098f, 0.023711f, -0.015398f, 0.009215f, -0.020560f, -0.010078f, 0.001219f, -0.007121f, 0.023572f, -0.009349f, 0.001010f, 0.001971f, 0.008605f, 0.000488f, -0.011267f, 0.049117f, -0.124808f, -0.075416f, -0.081011f, -0.027864f, -0.053879f, 0.067131f, 0.025705f, 0.055044f, -0.007903f, -0.106649f, -0.015956f, 0.017183f, 0.073612f, -0.003113f, 0.017356f, 0.067245f, -0.024836f, -0.048797f, 0.005339f, -0.003316f, 0.085440f, 0.055318f, -0.027411f, -0.038647f, 0.090756f, 0.006341f, 0.045609f, 0.021797f, 0.084704f, 0.072841f, 0.056553f, 0.005953f, -0.047214f, -0.025898f, -0.035978f, 0.070488f, -0.033455f, -0.048125f, -0.025897f, 0.002609f, -0.001639f, 0.031219f, -0.030251f, 0.011268f, -0.142854f, 0.016155f, 0.022575f, 0.023641f, -0.059563f, -0.055424f, 0.017440f, + 0.050563f, -0.061496f, 0.024199f, -0.034830f, -0.027268f, -0.041192f, -0.003584f, 0.044351f, -0.029352f, 0.048701f, -0.012150f, 0.019288f, -0.089121f, -0.057060f, -0.002081f, 0.047797f, 0.033347f, -0.064582f, -0.069822f, -0.032133f, 0.006773f, 0.074613f, 0.030777f, -0.006761f, -0.051932f, -0.059776f, -0.020239f, 0.012965f, 0.052740f, -0.004222f, 0.017652f, 0.035590f, -0.013204f, 0.013127f, -0.034549f, 0.022016f, 0.012667f, -0.021086f, -0.017608f, 0.002361f, 0.027276f, -0.025439f, -0.000715f, 0.043425f, 0.007070f, 0.006767f, 0.000353f, -0.011745f, -0.028847f, 0.007994f, -0.032067f, 0.038613f, 0.033035f, 0.025364f, 0.003327f, -0.002474f, -0.037592f, 0.024598f, -0.007269f, 0.044988f, -0.010340f, -0.049578f, -0.030492f, -0.005604f, 0.049292f, 0.014399f, -0.010028f, -0.004327f, -0.038891f, -0.018310f, -0.015399f, -0.001673f, 0.022547f, 0.021983f, -0.039210f, -0.021160f, -0.023828f, -0.023021f, -0.008154f, 0.008222f, -0.002882f, -0.012770f, -0.023707f, -0.024005f, 0.003782f, -0.000475f, -0.012116f, -0.011905f, 0.022126f, 0.161650f, 0.016336f, -0.086391f, -0.194186f, -0.017673f, 0.115081f, 0.028865f, + 0.050180f, -0.005398f, 0.069983f, -0.011881f, 0.030744f, -0.016342f, 0.039638f, 0.055876f, 0.029807f, -0.027237f, -0.064138f, 0.075338f, 0.085586f, -0.019358f, -0.084837f, -0.051691f, 0.008822f, 0.049298f, 0.016366f, 0.017631f, 0.003097f, 0.012558f, 0.005623f, 0.012448f, -0.016718f, -0.098265f, -0.000621f, 0.060718f, 0.046651f, -0.019342f, 0.004671f, 0.037383f, 0.081805f, 0.050293f, 0.040080f, -0.048224f, -0.033760f, -0.008213f, -0.008955f, -0.073177f, 0.051789f, 0.030839f, 0.053804f, 0.110104f, -0.056665f, -0.036202f, -0.005133f, -0.030390f, -0.026489f, -0.047960f, 0.085245f, -0.051582f, -0.055853f, -0.057200f, -0.020059f, 0.109168f, 0.027820f, 0.042675f, -0.002386f, -0.008901f, -0.025272f, 0.068007f, 0.054691f, -0.027773f, -0.063683f, 0.022319f, -0.008378f, 0.026586f, -0.059709f, -0.022879f, -0.034751f, -0.044837f, 0.027516f, 0.045388f, 0.008370f, 0.002162f, -0.024069f, 0.013843f, -0.009428f, 0.042249f, 0.003316f, -0.013834f, -0.008302f, 0.014427f, 0.026789f, 0.030024f, -0.017154f, 0.018864f, 0.009562f, 0.010063f, -0.001374f, -0.030840f, -0.004125f, -0.024897f, -0.010166f, 0.002098f, + 0.004267f, 0.009260f, 0.009121f, 0.011194f, 0.027397f, 0.041166f, 0.036247f, -0.002574f, -0.008916f, 0.005387f, -0.017737f, 0.023078f, -0.024933f, -0.002188f, 0.020307f, -0.000387f, -0.004910f, -0.039670f, 0.020305f, -0.039563f, 0.013536f, -0.008195f, 0.006483f, -0.002644f, 0.004712f, -0.001009f, -0.025021f, 0.014976f, 0.012563f, -0.001191f, 0.008543f, -0.000525f, 0.007360f, -0.002417f, -0.006374f, -0.000321f, -0.001872f, 0.002314f, -0.001011f, 0.002371f, 0.001287f, -0.007618f, -0.003264f, -0.000784f, 0.006026f, 0.002501f, -0.001571f, -0.004100f, -0.002769f, -0.047289f, 0.004766f, 0.123336f, 0.096071f, 0.014282f, 0.007878f, -0.068009f, -0.129141f, -0.114176f, -0.054973f, 0.092430f, 0.102414f, 0.105057f, 0.059142f, -0.016204f, -0.066802f, -0.062916f, -0.040340f, 0.025907f, 0.041798f, 0.071664f, 0.007115f, -0.055763f, -0.046124f, -0.010887f, -0.046216f, -0.022439f, 0.010639f, 0.074229f, 0.107344f, 0.068567f, 0.033453f, 0.029622f, -0.066601f, -0.008657f, -0.134318f, -0.151314f, -0.093947f, -0.046161f, -0.040981f, 0.069665f, 0.110647f, 0.121495f, 0.110850f, 0.094972f, 0.040003f, 0.005715f, + -0.045874f, -0.013461f, -0.074116f, -0.132749f, -0.010605f, 0.011561f, 0.013152f, 0.043083f, 0.026437f, 0.043718f, -0.147542f, -0.081528f, -0.052566f, -0.086382f, -0.036078f, 0.062697f, -0.037577f, 0.041991f, 0.006156f, -0.039745f, 0.031748f, -0.033329f, 0.035657f, 0.040552f, -0.031226f, -0.064165f, -0.130727f, -0.127623f, -0.094523f, 0.045705f, 0.016546f, -0.018855f, 0.024668f, 0.006155f, 0.000631f, -0.061282f, -0.042407f, -0.113436f, -0.037238f, -0.042256f, -0.004388f, 0.081741f, 0.088302f, 0.012212f, 0.045660f, -0.027998f, -0.060989f, -0.110374f, -0.072151f, -0.068451f, -0.002259f, 0.032849f, 0.019292f, 0.026647f, 0.029520f, -0.020896f, 0.017933f, -0.019747f, 0.018601f, 0.003958f, -0.000575f, -0.004675f, 0.015382f, 0.012842f, 0.029266f, -0.007306f, -0.006790f, 0.026671f, 0.021678f, -0.222005f, -0.113538f, -0.059099f, 0.074740f, 0.017355f, 0.284895f, 0.292032f, 0.220130f, 0.284724f, 0.298311f, 0.271074f, 0.194573f, 0.176653f, 0.195978f, 0.078062f, -0.011625f, -0.121195f, -0.187389f, -0.258915f, -0.251603f, -0.375001f, -0.227579f, -0.147974f, -0.117591f, -0.167149f, -0.087988f, -0.024030f, + -0.125331f, -0.097221f, -0.102781f, -0.023132f, -0.061728f, -0.021874f, -0.083570f, -0.042323f, 0.049795f, 0.051700f, 0.015396f, -0.015307f, 0.054266f, 0.044094f, -0.126445f, 0.026417f, 0.085455f, 0.187295f, 0.137254f, 0.178329f, 0.073060f, 0.070961f, 0.296819f, 0.160900f, 0.303739f, 0.101891f, 0.284868f, 0.196885f, 0.248702f, 0.335678f, 0.317752f, 0.257890f, 0.289349f, 0.321693f, 0.349847f, 0.299040f, 0.344858f, 0.235539f, 0.349802f, 0.281129f, 0.249187f, 0.265982f, 0.145043f, 0.297753f, 0.143904f, 0.087613f, -0.109504f, 0.007474f, -0.161737f, -0.181434f, -0.277971f, -0.327811f, -0.504394f, -0.492155f, -0.465267f, -0.434693f, -0.410138f, -0.346207f, -0.422872f, -0.520031f, -0.513311f, -0.425356f, -0.450734f, -0.423410f, -0.425356f, -0.362574f, -0.395367f, -0.378614f, -0.282872f, -0.311882f, -0.240079f, -0.223702f, -0.206735f, -0.131344f, -0.170347f, -0.038450f, -0.063446f, 0.029524f, 0.039238f, 0.124291f, 0.183077f, 0.192472f, 0.221628f, 0.197403f, 0.296697f, 0.336968f, 0.333264f, 0.385802f, 0.402268f, 0.399224f, 0.303875f, 0.271955f, 0.238068f, 0.221390f, 0.214889f, 0.221298f, + 0.207331f, 0.158562f, 0.101663f, 0.116242f, 0.089243f, 0.070168f, 0.046279f, -0.035160f, -0.046788f, -0.048401f, -0.060196f, -0.072783f, -0.082835f, -0.057441f, -0.064093f, -0.050362f, -0.052182f, -0.044364f, -0.032377f, -0.038020f, -0.031643f, -0.029837f, -0.037579f, -0.033576f, -0.038148f, -0.028839f, -0.023912f, -0.031544f, -0.036839f, -0.012652f, -0.003020f, -0.002551f, -0.000954f, 0.002805f, 0.000016f, 0.001218f}, + {-0.014319f, -0.028270f, -0.004980f, 0.000408f, -0.006512f, -0.013286f, -0.004421f, 0.009792f, -0.015688f, -0.008620f, -0.005211f, -0.003035f, 0.004949f, -0.002204f, 0.005513f, 0.002567f, 0.004826f, -0.000507f, 0.005980f, -0.005204f, 0.000953f, -0.002264f, 0.001112f, 0.015142f, -0.003239f, -0.000895f, -0.007512f, 0.009374f, 0.005774f, 0.004529f, 0.011629f, -0.005921f, -0.003408f, 0.004022f, 0.010411f, -0.002777f, -0.000717f, -0.008384f, -0.009248f, -0.006133f, 0.006568f, -0.008152f, -0.007044f, -0.000847f, 0.009365f, -0.012660f, -0.002720f, -0.010570f, -0.005165f, -0.002995f, 0.001443f, -0.000914f, -0.007623f, 0.009795f, 0.001648f, 0.008820f, -0.003564f, -0.002181f, -0.010949f, -0.000193f, -0.003849f, -0.004078f, 0.006288f, 0.003588f, -0.001971f, 0.003438f, 0.006961f, -0.001939f, 0.002985f, -0.004947f, -0.002894f, -0.001161f, -0.004721f, 0.004231f, 0.001447f, 0.003234f, -0.007481f, 0.005413f, 0.003080f, 0.012149f, 0.007189f, -0.001931f, -0.007696f, -0.000576f, 0.001669f, 0.001008f, 0.002385f, -0.000303f, -0.002610f, 0.000158f, -0.001775f, 0.000068f, -0.002146f, 0.000818f, -0.002087f, -0.000084f, + 0.002328f, 0.000842f, 0.001201f, -0.001435f, -0.001049f, 0.001161f, 0.001601f, 0.000785f, -0.000238f, -0.023263f, -0.008386f, 0.006733f, -0.006188f, -0.002742f, -0.002632f, 0.003192f, -0.001212f, -0.006113f, 0.009673f, 0.008705f, 0.002871f, -0.001058f, 0.004470f, -0.011926f, -0.001776f, -0.011785f, -0.005978f, 0.008748f, -0.001480f, 0.001587f, -0.001218f, -0.001323f, 0.000173f, 0.018269f, 0.016672f, 0.007490f, 0.008889f, 0.010597f, -0.002063f, -0.001184f, -0.003662f, 0.009354f, -0.000932f, -0.003505f, 0.002597f, -0.005399f, 0.003704f, 0.006742f, -0.003453f, 0.007596f, 0.008524f, 0.016706f, -0.006546f, -0.007835f, 0.007119f, -0.004278f, 0.000218f, 0.003545f, -0.009714f, 0.000614f, -0.005092f, -0.005656f, 0.012826f, 0.007580f, 0.009227f, -0.005255f, -0.006990f, 0.004926f, -0.008134f, 0.005728f, 0.024770f, 0.001430f, 0.001684f, 0.005598f, 0.002404f, 0.002314f, 0.014093f, -0.007523f, -0.001931f, 0.002617f, 0.001825f, -0.007002f, -0.005179f, -0.007148f, -0.003422f, -0.002598f, 0.006472f, -0.001081f, 0.006501f, 0.006701f, -0.006716f, -0.007147f, -0.001862f, 0.004548f, 0.006269f, -0.007495f, + -0.001476f, -0.002213f, -0.005179f, -0.000609f, -0.004907f, 0.001294f, -0.000339f, 0.002635f, -0.001509f, 0.001023f, -0.001912f, -0.000464f, -0.001472f, -0.006812f, 0.007375f, 0.011862f, -0.005694f, 0.005866f, 0.018692f, 0.006227f, 0.004280f, -0.013095f, 0.010834f, 0.002822f, -0.016817f, 0.007105f, -0.004719f, -0.010126f, 0.004070f, -0.001433f, 0.003922f, 0.009743f, -0.010263f, -0.010814f, -0.004797f, 0.014635f, 0.000414f, 0.007248f, 0.015186f, -0.022613f, -0.018212f, 0.002933f, 0.011130f, -0.008192f, 0.000724f, 0.015046f, 0.003892f, -0.001976f, -0.004528f, 0.018011f, 0.002215f, -0.004419f, 0.002533f, -0.016392f, 0.001869f, -0.009052f, 0.008346f, 0.001433f, 0.008865f, -0.004484f, -0.002209f, 0.003978f, 0.000279f, 0.001140f, 0.000523f, 0.008473f, 0.006853f, -0.009345f, 0.005351f, 0.007497f, -0.012782f, 0.001502f, -0.005753f, 0.002380f, -0.002921f, -0.009913f, 0.000174f, 0.008506f, 0.007425f, 0.016433f, -0.010178f, 0.012720f, -0.008412f, -0.001716f, 0.007572f, -0.008268f, -0.012277f, -0.004464f, 0.000598f, -0.000796f, -0.000611f, -0.001348f, 0.002454f, 0.005226f, -0.007133f, -0.000111f, + 0.003424f, -0.000676f, 0.002943f, -0.005879f, -0.003345f, -0.002342f, -0.004289f, 0.001247f, -0.000913f, -0.003393f, 0.001872f, 0.001898f, -0.002806f, -0.004344f, -0.000208f, -0.001024f, 0.004483f, -0.000240f, -0.000708f, 0.000800f, 0.000980f, -0.000795f, -0.001315f, 0.002984f, 0.001020f, -0.002416f, -0.001191f, -0.001854f, 0.000293f, 0.037582f, 0.016848f, 0.022766f, -0.001843f, -0.006299f, -0.008210f, -0.008235f, 0.004478f, -0.006917f, 0.010481f, -0.001192f, 0.014383f, 0.000866f, 0.007608f, 0.009440f, 0.007300f, 0.006246f, 0.008277f, -0.027925f, -0.008257f, -0.002631f, -0.005887f, -0.005173f, -0.008791f, -0.019895f, 0.000893f, 0.013618f, -0.008389f, 0.008173f, -0.006738f, -0.009934f, -0.007493f, 0.001122f, -0.006325f, -0.002358f, -0.006486f, -0.000462f, 0.016432f, 0.000865f, 0.007385f, 0.010376f, 0.013509f, -0.006360f, 0.003163f, -0.003035f, -0.010429f, 0.011828f, -0.006628f, -0.000497f, -0.010323f, 0.007531f, -0.000104f, 0.000158f, -0.002852f, -0.004820f, 0.003491f, 0.010564f, -0.004443f, 0.005945f, 0.005641f, 0.004730f, 0.018186f, -0.018322f, -0.007744f, 0.000425f, -0.010087f, -0.013082f, + -0.005190f, -0.016008f, 0.002389f, 0.018723f, -0.012941f, -0.006192f, -0.014778f, 0.000930f, -0.004661f, -0.007089f, -0.017324f, 0.010149f, 0.013273f, 0.005230f, 0.009271f, -0.004743f, 0.001481f, -0.003524f, 0.003836f, 0.000132f, 0.009175f, -0.002412f, 0.003940f, -0.000221f, -0.002369f, 0.003165f, 0.002182f, 0.004175f, 0.003516f, -0.000641f, 0.000828f, 0.002264f, 0.000914f, 0.001757f, -0.000172f, -0.001801f, -0.003339f, 0.001607f, 0.000846f, -0.002319f, 0.001616f, 0.001760f, -0.000584f, 0.000739f, 0.002161f, -0.000717f, -0.001998f, -0.000725f, 0.011680f, 0.016655f, -0.009228f, 0.008657f, -0.007532f, -0.003680f, -0.002989f, -0.020692f, 0.015024f, -0.004407f, -0.002199f, 0.023811f, 0.014833f, 0.015903f, -0.006478f, 0.000575f, 0.002848f, -0.003709f, 0.005310f, -0.012197f, -0.000319f, -0.008358f, 0.009738f, -0.009501f, -0.006516f, -0.001034f, 0.001663f, -0.011724f, 0.002253f, 0.001196f, 0.015349f, 0.000066f, -0.020967f, 0.012039f, 0.011325f, 0.016085f, -0.002560f, 0.004015f, -0.011595f, -0.008793f, -0.003659f, -0.008538f, 0.003336f, 0.002171f, -0.003164f, -0.001323f, 0.008776f, 0.013618f, + -0.018708f, -0.004092f, -0.000007f, -0.007721f, -0.007991f, 0.012314f, -0.009952f, 0.004618f, -0.009767f, -0.012991f, -0.009633f, -0.006443f, 0.004472f, 0.001768f, 0.023141f, -0.003965f, -0.006209f, 0.006850f, -0.006949f, -0.002081f, -0.006169f, 0.006402f, -0.005708f, 0.008265f, -0.004155f, -0.003873f, 0.005717f, 0.013852f, 0.003866f, -0.013096f, 0.000080f, -0.006477f, -0.013232f, 0.003710f, 0.009371f, -0.003158f, 0.002171f, 0.003220f, 0.000465f, -0.001470f, 0.004826f, 0.000053f, -0.005362f, -0.000004f, -0.001929f, -0.001046f, -0.002786f, 0.004356f, -0.001037f, -0.003657f, -0.003866f, 0.000495f, 0.004074f, -0.001870f, -0.000272f, -0.005471f, 0.000512f, 0.000928f, 0.001837f, -0.001030f, -0.004588f, -0.002440f, 0.004036f, -0.001694f, -0.004952f, 0.001955f, -0.028745f, 0.027649f, 0.014841f, -0.016497f, -0.016637f, 0.006821f, 0.021949f, -0.000318f, 0.006439f, 0.025560f, 0.008572f, 0.007695f, -0.004319f, 0.013322f, 0.012176f, 0.014033f, -0.025300f, -0.015540f, -0.015349f, 0.012120f, 0.010458f, 0.013330f, 0.000639f, -0.015444f, 0.006351f, -0.002343f, 0.006989f, -0.022201f, 0.008581f, 0.013450f, + -0.010412f, 0.005817f, 0.010885f, 0.003048f, -0.000323f, 0.002333f, -0.003487f, 0.019436f, 0.013211f, 0.010399f, 0.000393f, 0.006754f, 0.015005f, -0.013392f, -0.007201f, 0.000661f, 0.019840f, 0.012691f, 0.007811f, -0.014943f, 0.000558f, 0.010157f, 0.011852f, -0.004169f, 0.003679f, 0.011570f, 0.014335f, 0.004523f, 0.013256f, 0.005258f, -0.001472f, -0.012227f, -0.000068f, -0.020363f, -0.008331f, -0.009769f, 0.001717f, 0.006714f, -0.011783f, -0.004779f, -0.021524f, 0.009368f, -0.005967f, -0.000157f, 0.011441f, 0.016658f, 0.020144f, 0.002500f, -0.002078f, -0.012489f, -0.003715f, 0.006379f, 0.006894f, -0.013251f, 0.004179f, -0.005963f, 0.004876f, 0.000889f, -0.004456f, 0.000085f, 0.002386f, -0.004200f, 0.001900f, -0.001109f, -0.004996f, -0.002577f, -0.003137f, 0.003163f, 0.003876f, -0.000674f, -0.002890f, 0.002082f, -0.002216f, -0.001605f, -0.003881f, -0.000537f, -0.000817f, -0.004541f, 0.003776f, 0.024357f, 0.007637f, -0.004131f, -0.011038f, -0.028862f, -0.013989f, 0.017712f, -0.006184f, -0.026525f, -0.007065f, -0.004186f, 0.004083f, 0.014708f, 0.022457f, -0.001282f, 0.006634f, -0.005103f, + 0.011210f, -0.012481f, -0.013292f, -0.014307f, -0.025452f, 0.013653f, 0.007797f, -0.021256f, 0.000696f, -0.015512f, -0.005893f, 0.013774f, 0.007820f, 0.011248f, -0.003110f, -0.002912f, -0.003612f, 0.024251f, 0.018898f, 0.020014f, -0.009038f, -0.017047f, 0.013559f, -0.002268f, -0.006005f, 0.017250f, 0.003116f, 0.016971f, -0.000490f, 0.009500f, -0.011856f, -0.000597f, 0.008568f, -0.036293f, -0.005429f, 0.001771f, -0.026537f, 0.006919f, -0.006726f, 0.024832f, 0.015871f, -0.015187f, 0.001253f, 0.022671f, -0.002296f, 0.011557f, -0.007556f, 0.015585f, -0.007188f, 0.003084f, -0.005957f, 0.000388f, 0.010960f, -0.014753f, 0.015981f, 0.008169f, 0.009202f, 0.002605f, 0.021222f, -0.008313f, -0.024162f, 0.004192f, 0.016854f, -0.007952f, -0.014983f, -0.010864f, -0.007622f, 0.017370f, 0.000437f, -0.007453f, 0.000787f, 0.000413f, -0.003313f, -0.003338f, 0.001156f, 0.003335f, -0.001876f, -0.002288f, -0.001197f, 0.003713f, -0.001877f, -0.006544f, 0.001898f, -0.007244f, 0.006686f, 0.004286f, -0.000013f, -0.000756f, 0.001839f, -0.002122f, 0.003006f, 0.000267f, 0.002105f, 0.000368f, 0.000979f, 0.007661f, + 0.002761f, -0.004053f, 0.002250f, -0.058507f, -0.012362f, 0.031373f, -0.025322f, -0.009184f, 0.026673f, 0.010039f, -0.008439f, 0.002818f, -0.022057f, 0.019695f, -0.002481f, -0.035581f, 0.002566f, -0.001866f, 0.013470f, 0.013200f, -0.007049f, -0.027871f, -0.011921f, -0.010641f, 0.000614f, -0.014860f, -0.008144f, -0.018949f, -0.005424f, 0.020662f, -0.016941f, -0.008516f, -0.006498f, -0.011028f, -0.011625f, -0.015809f, 0.010827f, 0.002202f, 0.013460f, 0.002357f, -0.009882f, -0.015317f, -0.015100f, -0.003106f, 0.010104f, 0.014879f, -0.005220f, -0.013536f, 0.014261f, 0.005933f, -0.021272f, -0.023727f, -0.048378f, -0.004267f, -0.015432f, -0.009342f, 0.007214f, 0.007375f, 0.004470f, 0.021765f, -0.002229f, -0.010369f, -0.001271f, -0.011175f, 0.024841f, 0.013202f, -0.004782f, 0.013275f, -0.013913f, 0.006974f, 0.005750f, -0.013619f, -0.005949f, -0.012211f, 0.008789f, 0.006171f, -0.022474f, 0.014875f, 0.022824f, -0.001471f, -0.001047f, -0.023034f, -0.008932f, 0.010178f, -0.007115f, 0.006732f, 0.022631f, -0.007534f, 0.005018f, 0.002308f, 0.001806f, -0.007125f, 0.001381f, -0.001137f, -0.009378f, -0.005656f, + -0.000805f, 0.003378f, 0.000604f, 0.002665f, -0.009780f, 0.001199f, -0.005209f, 0.002527f, -0.005636f, -0.005478f, -0.003291f, -0.000306f, 0.001307f, -0.004180f, 0.001365f, 0.002445f, -0.000520f, 0.001038f, 0.004260f, 0.002395f, -0.007745f, -0.005109f, -0.002371f, 0.000870f, 0.002992f, -0.001207f, 0.003035f, 0.010445f, 0.038804f, -0.018110f, 0.014747f, -0.009486f, -0.000091f, 0.022268f, -0.006419f, -0.009885f, -0.005246f, -0.002048f, 0.003914f, 0.015148f, 0.051132f, -0.002790f, 0.003086f, 0.014212f, 0.003312f, 0.000264f, -0.023919f, -0.024863f, 0.003833f, 0.003431f, -0.015639f, -0.007956f, -0.003607f, 0.014196f, -0.006282f, 0.002777f, -0.000326f, 0.006213f, -0.006404f, 0.029881f, 0.016578f, -0.013922f, 0.016418f, 0.014897f, -0.018067f, 0.003184f, 0.007687f, 0.006006f, -0.005029f, -0.006095f, 0.024860f, -0.021746f, 0.009207f, 0.027529f, -0.009597f, 0.003449f, 0.017618f, -0.001899f, 0.015317f, 0.008461f, 0.000217f, 0.008453f, 0.013136f, 0.018126f, 0.011358f, 0.001499f, -0.000694f, -0.012450f, -0.013842f, 0.000546f, 0.001498f, -0.043370f, 0.028304f, -0.006636f, -0.013462f, -0.015058f, + -0.031862f, -0.035924f, -0.023390f, 0.004386f, 0.017748f, -0.006496f, 0.002150f, -0.002884f, 0.017630f, -0.006582f, -0.014369f, 0.008154f, 0.004191f, -0.005950f, 0.002114f, 0.012075f, -0.011728f, 0.002341f, -0.014898f, -0.004957f, -0.006729f, 0.003567f, -0.001807f, 0.007634f, 0.004654f, 0.001623f, -0.002231f, 0.003889f, 0.005117f, -0.000116f, -0.010839f, 0.006029f, -0.000633f, 0.009177f, 0.008648f, 0.004373f, -0.004522f, 0.007951f, 0.001608f, -0.001248f, -0.000413f, 0.000474f, -0.007320f, 0.007977f, -0.000886f, -0.005274f, 0.007514f, 0.015331f, -0.003204f, -0.003268f, 0.007695f, -0.003100f, -0.005668f, -0.002047f, 0.052518f, 0.052781f, -0.001521f, -0.043632f, 0.008505f, 0.008981f, -0.005039f, 0.011484f, 0.006539f, 0.003865f, -0.000524f, -0.007335f, 0.042607f, 0.007942f, -0.006876f, -0.047421f, -0.026713f, 0.011287f, -0.002968f, -0.016436f, -0.028493f, 0.004063f, 0.004812f, 0.007403f, -0.007115f, -0.031128f, -0.033323f, 0.036200f, 0.034160f, 0.010765f, 0.031371f, -0.026725f, 0.003638f, 0.014166f, -0.005665f, -0.016901f, -0.030600f, -0.015016f, 0.005399f, -0.001179f, -0.014364f, 0.014890f, + 0.000270f, 0.014458f, 0.011617f, 0.000925f, -0.032898f, -0.018990f, -0.015476f, -0.002524f, 0.003377f, 0.004482f, -0.005601f, -0.009175f, 0.002258f, 0.005447f, -0.029418f, -0.007273f, 0.004804f, 0.006752f, -0.013360f, -0.036655f, -0.008596f, -0.009110f, 0.027164f, -0.000917f, 0.012222f, -0.012162f, -0.009339f, -0.016329f, -0.018410f, -0.010640f, 0.002967f, -0.001237f, 0.022804f, -0.013412f, 0.003953f, 0.026502f, -0.001842f, 0.013311f, 0.011793f, 0.025751f, 0.005685f, -0.007293f, -0.013119f, -0.011384f, -0.004519f, 0.015629f, 0.002391f, 0.015755f, 0.008295f, -0.001075f, -0.000423f, 0.000915f, 0.001260f, -0.006808f, -0.008732f, 0.000178f, -0.002168f, -0.000684f, 0.002527f, -0.001536f, 0.001978f, -0.009980f, -0.002367f, 0.006386f, -0.000376f, 0.004099f, -0.017364f, -0.001783f, -0.000711f, -0.003225f, 0.003535f, 0.002872f, 0.002212f, 0.003191f, 0.003947f, -0.007963f, 0.009490f, -0.006103f, 0.022876f, -0.011761f, 0.003997f, -0.008860f, 0.001771f, 0.006012f, -0.014396f, -0.009740f, -0.025701f, -0.028417f, -0.018664f, -0.007308f, -0.001302f, 0.000712f, -0.015725f, -0.014569f, -0.029468f, 0.014178f, + -0.029533f, -0.038005f, 0.024549f, -0.022782f, -0.029002f, 0.027017f, 0.005132f, -0.006089f, 0.028976f, 0.016731f, -0.022514f, 0.020825f, -0.057406f, -0.003873f, -0.014753f, -0.006118f, -0.026989f, 0.047253f, 0.022123f, -0.013823f, 0.006936f, 0.014904f, -0.009889f, 0.016453f, 0.000248f, 0.000746f, -0.013499f, 0.015980f, 0.018392f, 0.024881f, -0.038945f, -0.001334f, -0.000270f, 0.011553f, -0.017658f, -0.006716f, -0.017973f, -0.017642f, 0.030954f, 0.010032f, -0.023190f, 0.011975f, -0.014347f, -0.015192f, -0.024903f, -0.045235f, 0.011819f, 0.029931f, 0.002028f, 0.030150f, 0.040906f, -0.002411f, -0.016760f, -0.038757f, 0.003021f, -0.004945f, 0.002478f, -0.009656f, 0.008010f, -0.017020f, 0.036623f, 0.020302f, 0.032036f, 0.006517f, -0.003952f, -0.009724f, 0.013078f, 0.015145f, 0.006817f, -0.002740f, -0.004584f, 0.001456f, 0.017238f, -0.003019f, 0.007228f, -0.010850f, 0.004694f, -0.017945f, 0.001752f, 0.002238f, -0.007904f, 0.016957f, 0.009803f, -0.004338f, -0.011140f, -0.009730f, -0.003214f, -0.000887f, 0.005444f, -0.011395f, 0.002951f, 0.002056f, -0.000834f, -0.007872f, 0.002987f, -0.017092f, + -0.003462f, -0.004048f, -0.004773f, 0.002964f, -0.000311f, -0.032771f, 0.004391f, -0.073099f, -0.049110f, -0.035205f, 0.019051f, 0.036257f, -0.051715f, 0.011998f, 0.036662f, 0.022645f, -0.000524f, 0.013420f, 0.034567f, -0.015879f, -0.002067f, -0.010070f, 0.001019f, -0.022463f, 0.015969f, 0.000331f, 0.001888f, 0.005900f, 0.046335f, -0.002349f, -0.020444f, -0.019914f, 0.011045f, 0.034111f, -0.013779f, -0.034554f, 0.010255f, 0.034615f, 0.020209f, -0.004675f, 0.016809f, 0.011351f, 0.016195f, 0.003595f, 0.013718f, 0.023478f, -0.002933f, -0.039602f, 0.001983f, 0.012204f, -0.037108f, -0.027098f, 0.036296f, 0.028473f, -0.028028f, -0.018371f, 0.008865f, -0.001888f, 0.017803f, 0.044134f, -0.009491f, -0.008554f, 0.008392f, -0.002293f, 0.016341f, 0.008155f, -0.016093f, -0.012652f, -0.006075f, 0.012918f, 0.011745f, -0.011761f, -0.031993f, -0.005658f, -0.048143f, 0.045538f, 0.007680f, -0.008374f, 0.004334f, 0.018860f, -0.000980f, -0.021176f, 0.007857f, -0.009218f, -0.013727f, 0.010703f, -0.002881f, -0.020957f, -0.034440f, -0.011267f, -0.014045f, 0.028420f, -0.004539f, 0.009365f, 0.005409f, 0.003458f, + -0.002679f, -0.002492f, 0.004434f, -0.007657f, 0.001237f, 0.010278f, -0.001246f, -0.005410f, -0.003088f, -0.023501f, -0.007254f, -0.000652f, -0.004413f, -0.017115f, -0.015353f, -0.006465f, -0.003516f, -0.001559f, -0.005028f, -0.000926f, 0.000284f, 0.012856f, 0.004551f, -0.002138f, -0.005235f, 0.002005f, -0.004631f, -0.003918f, 0.008348f, -0.004229f, -0.009993f, -0.002948f, -0.007532f, 0.000884f, -0.009263f, 0.000246f, 0.006110f, 0.001914f, -0.008889f, -0.002965f, -0.028243f, -0.001222f, 0.004885f, -0.034620f, -0.009098f, 0.026028f, 0.033856f, 0.023961f, 0.063178f, 0.038109f, 0.057248f, 0.021371f, 0.015085f, -0.029580f, 0.032129f, -0.010818f, -0.003621f, -0.023688f, -0.015775f, 0.031044f, -0.010170f, 0.070410f, 0.032757f, 0.020317f, -0.003773f, 0.016280f, -0.011087f, -0.032872f, -0.016633f, -0.020405f, 0.014830f, -0.019241f, -0.000448f, -0.020590f, 0.012038f, 0.028640f, 0.025845f, -0.001709f, 0.037380f, 0.031232f, 0.001447f, -0.010887f, -0.014303f, -0.025634f, -0.008830f, 0.058944f, 0.022843f, 0.067855f, -0.021897f, 0.000333f, -0.002328f, 0.015814f, 0.054441f, 0.018652f, 0.001277f, 0.035005f, + 0.040095f, 0.042369f, -0.003874f, -0.025059f, -0.009245f, -0.006931f, -0.007270f, 0.028082f, 0.019134f, 0.026650f, 0.040652f, -0.025397f, 0.061509f, -0.041361f, -0.077647f, -0.012016f, -0.024264f, 0.015801f, 0.037384f, 0.018313f, -0.021019f, -0.002156f, -0.022823f, -0.017027f, -0.011337f, 0.000272f, 0.030904f, 0.005211f, -0.008854f, 0.004834f, 0.002232f, 0.009271f, 0.009791f, 0.006725f, 0.012032f, 0.003278f, 0.007528f, 0.002769f, 0.008358f, 0.000524f, -0.025105f, -0.009673f, -0.000379f, -0.023344f, 0.002451f, -0.024373f, -0.012931f, -0.014802f, -0.013800f, -0.011558f, -0.008588f, -0.003274f, 0.001279f, 0.006984f, 0.025518f, 0.003471f, -0.016376f, 0.007425f, 0.001377f, 0.023186f, -0.004537f, 0.009999f, -0.000341f, 0.000284f, -0.012601f, 0.002920f, 0.036751f, 0.059756f, -0.029753f, -0.023561f, 0.021494f, -0.018027f, -0.003278f, -0.008576f, 0.008023f, 0.025950f, 0.028141f, 0.041348f, -0.045666f, 0.051026f, -0.018587f, 0.004170f, -0.023771f, 0.020837f, 0.038755f, 0.015291f, 0.007086f, 0.002052f, 0.047214f, 0.010960f, -0.001690f, -0.016340f, -0.007352f, -0.049358f, -0.006705f, -0.024399f, + -0.058667f, 0.004213f, -0.003664f, 0.023099f, -0.061102f, -0.012771f, 0.014148f, 0.021698f, 0.050592f, -0.014825f, 0.014619f, 0.026818f, 0.004016f, -0.007969f, 0.014180f, -0.014404f, -0.003641f, -0.077068f, 0.006510f, -0.033352f, -0.038318f, -0.043403f, 0.016993f, -0.069124f, 0.022308f, -0.026432f, -0.034446f, -0.047293f, 0.041785f, 0.044783f, 0.044582f, 0.008705f, 0.007995f, 0.042003f, -0.058972f, -0.005793f, -0.018341f, 0.023795f, -0.070030f, -0.024059f, -0.007447f, 0.022355f, 0.017511f, 0.014345f, 0.027956f, -0.026115f, 0.010084f, -0.031522f, -0.009529f, -0.018899f, -0.007629f, -0.006426f, 0.000632f, -0.029870f, 0.013409f, 0.018762f, -0.003463f, 0.001320f, -0.014869f, -0.004578f, 0.014139f, -0.019265f, -0.000615f, 0.009477f, -0.024083f, 0.010952f, -0.021603f, 0.000301f, 0.013173f, 0.003230f, -0.017750f, -0.011466f, 0.006562f, -0.009700f, 0.010661f, 0.007689f, 0.012332f, -0.001548f, -0.015575f, 0.029372f, -0.014130f, -0.006947f, -0.019160f, 0.013159f, -0.006665f, 0.001955f, -0.017793f, 0.002450f, -0.021572f, -0.003282f, 0.015454f, -0.004838f, -0.009280f, -0.022292f, 0.002382f, 0.003113f, + -0.003183f, -0.029290f, -0.055293f, -0.000948f, -0.019828f, 0.065375f, 0.013483f, 0.046255f, -0.015287f, 0.063124f, -0.039802f, -0.074253f, 0.016600f, 0.012638f, 0.008304f, -0.036889f, -0.042246f, -0.032916f, 0.012163f, -0.033152f, 0.014421f, -0.017563f, 0.049335f, -0.016102f, -0.007650f, 0.035747f, 0.000936f, -0.088862f, -0.037117f, -0.001152f, 0.058419f, -0.006681f, -0.018544f, -0.050927f, 0.008685f, -0.012527f, -0.044031f, -0.051898f, -0.006185f, 0.009573f, -0.018043f, -0.019727f, -0.052143f, 0.034103f, -0.013048f, 0.012295f, -0.026030f, 0.001202f, 0.015282f, 0.009477f, 0.045754f, 0.000527f, -0.015929f, -0.059598f, -0.021172f, 0.028902f, -0.040973f, -0.020755f, 0.015002f, 0.032896f, 0.025498f, 0.065511f, 0.049825f, 0.001017f, 0.037788f, 0.038933f, 0.013131f, 0.001616f, 0.022637f, -0.019311f, 0.098679f, -0.045333f, -0.107963f, 0.028783f, -0.091909f, -0.003450f, -0.071956f, -0.000389f, 0.087853f, 0.011131f, -0.041969f, 0.014056f, 0.014880f, -0.027251f, -0.022558f, -0.030845f, 0.006664f, -0.009233f, 0.028122f, -0.022116f, 0.018783f, -0.037126f, 0.010377f, -0.001107f, -0.006145f, -0.008320f, + 0.025497f, 0.049009f, 0.015253f, 0.020016f, 0.033741f, 0.010467f, -0.033749f, 0.010010f, -0.012523f, 0.022754f, -0.007033f, -0.010307f, -0.001302f, -0.002080f, -0.009071f, -0.027568f, -0.018239f, -0.012083f, -0.001530f, 0.004201f, -0.002011f, -0.017369f, -0.039744f, -0.024598f, 0.006000f, -0.006736f, -0.000678f, -0.014921f, 0.005382f, 0.029033f, 0.041344f, -0.062665f, -0.041683f, -0.025881f, -0.022002f, 0.025206f, 0.039125f, -0.023008f, 0.002610f, 0.034921f, -0.070684f, 0.005230f, 0.016569f, -0.053319f, 0.027623f, -0.017750f, 0.024370f, 0.009176f, 0.027464f, 0.002983f, -0.034554f, 0.035795f, -0.045035f, -0.009804f, 0.087221f, -0.035781f, 0.031955f, -0.020757f, 0.035913f, 0.032743f, -0.011442f, -0.038250f, 0.040647f, 0.105727f, -0.057928f, 0.015056f, -0.076882f, 0.038897f, 0.023398f, -0.041653f, 0.046150f, 0.004333f, -0.092316f, 0.013253f, 0.004541f, 0.042142f, -0.011304f, -0.006551f, -0.048503f, -0.047224f, -0.024227f, 0.115246f, -0.017593f, 0.058474f, -0.051389f, 0.038437f, 0.018862f, -0.010687f, -0.039505f, -0.007440f, 0.032535f, 0.064716f, -0.023470f, -0.021890f, -0.006848f, 0.012574f, + 0.056443f, -0.014477f, -0.013320f, -0.042060f, 0.012894f, -0.063249f, -0.028052f, 0.044816f, 0.054525f, 0.005930f, -0.004485f, -0.029803f, -0.048441f, -0.140948f, 0.087847f, 0.033137f, 0.050474f, 0.004709f, -0.045736f, 0.050100f, -0.028310f, 0.021032f, 0.030036f, 0.028920f, 0.067835f, -0.001578f, 0.015893f, 0.018434f, -0.007528f, -0.029993f, -0.009777f, 0.049210f, 0.030634f, -0.028091f, -0.005988f, -0.019217f, -0.004762f, 0.022796f, 0.006943f, -0.032834f, -0.020902f, 0.030740f, 0.007349f, -0.010173f, 0.016227f, -0.027834f, -0.016645f, -0.006069f, 0.013692f, 0.021584f, 0.014360f, 0.003839f, 0.017441f, -0.014331f, -0.018264f, 0.002915f, -0.001672f, -0.025067f, 0.003128f, -0.025849f, -0.000815f, -0.015966f, -0.003558f, 0.003574f, -0.012937f, -0.024783f, 0.008477f, -0.059247f, 0.041389f, 0.040516f, -0.080275f, 0.007552f, -0.042175f, 0.004990f, -0.088375f, 0.088608f, 0.077273f, -0.008172f, -0.040316f, -0.014252f, -0.016157f, 0.042857f, -0.044203f, 0.055345f, -0.073895f, -0.043117f, 0.021079f, 0.025898f, 0.006009f, 0.024989f, 0.070401f, 0.019979f, 0.032482f, 0.008333f, 0.033754f, 0.023683f, + -0.015802f, 0.006701f, 0.028589f, -0.002327f, -0.002405f, 0.055871f, 0.025260f, 0.073428f, -0.006724f, 0.041690f, 0.000143f, -0.054337f, 0.055214f, -0.028918f, -0.006165f, 0.016609f, -0.051138f, -0.035014f, 0.019897f, 0.079857f, 0.043887f, 0.028547f, -0.103436f, -0.024558f, -0.072520f, -0.001199f, 0.116063f, 0.075810f, 0.087814f, 0.006339f, -0.085147f, 0.025926f, 0.086431f, 0.017558f, -0.021602f, 0.076312f, 0.008337f, 0.050800f, -0.132444f, -0.110525f, 0.079009f, -0.006357f, -0.035630f, -0.084848f, -0.018319f, -0.032289f, 0.036033f, 0.032681f, 0.039453f, 0.039786f, -0.016690f, 0.011905f, 0.073208f, 0.066883f, 0.070713f, 0.005121f, 0.101600f, 0.049934f, -0.017973f, -0.040996f, 0.000664f, -0.020602f, 0.006081f, 0.050865f, -0.008098f, 0.001459f, 0.037656f, 0.040653f, 0.004043f, -0.000624f, 0.016115f, 0.045100f, 0.016225f, 0.020694f, 0.031310f, 0.010294f, 0.024373f, -0.002033f, -0.013664f, -0.006857f, -0.005187f, 0.001044f, 0.032371f, -0.013250f, 0.005760f, -0.027363f, 0.039166f, 0.018052f, 0.017151f, -0.001386f, 0.019793f, -0.000918f, 0.067075f, 0.016290f, 0.068864f, -0.019563f, + 0.060249f, 0.026648f, 0.008958f, 0.025229f, 0.025966f, 0.028408f, -0.007784f, -0.006392f, 0.041242f, 0.013222f, 0.034566f, -0.076695f, 0.045212f, 0.060324f, 0.004576f, 0.020529f, -0.054663f, 0.042566f, -0.024892f, 0.020327f, 0.001931f, 0.000036f, 0.036063f, -0.011333f, 0.023451f, -0.007734f, -0.043921f, 0.011521f, -0.003120f, 0.048827f, 0.042729f, 0.060751f, 0.020213f, -0.046896f, -0.038642f, 0.039334f, 0.044325f, 0.020318f, 0.003771f, 0.013790f, -0.012297f, -0.038541f, 0.006346f, -0.014470f, 0.053968f, 0.037519f, 0.032847f, 0.042594f, 0.043825f, -0.061124f, 0.066716f, 0.065452f, 0.047999f, -0.033040f, -0.029320f, -0.042638f, 0.058059f, 0.033713f, 0.095495f, -0.058697f, -0.057993f, -0.045011f, -0.084968f, -0.022491f, 0.091205f, 0.014145f, 0.071550f, -0.077077f, -0.082287f, 0.017436f, 0.051709f, -0.072129f, 0.010882f, -0.057551f, 0.022387f, -0.066367f, -0.005586f, 0.030824f, 0.032727f, -0.060410f, 0.023230f, -0.046084f, -0.091209f, -0.003527f, 0.107049f, 0.055135f, 0.043081f, -0.030578f, -0.077397f, 0.116312f, 0.094008f, 0.025997f, -0.105565f, -0.004675f, -0.025230f, 0.074271f, + 0.037659f, 0.045812f, -0.055199f, 0.040454f, -0.025122f, 0.026287f, -0.038453f, 0.012783f, -0.042962f, 0.060542f, -0.012788f, 0.009433f, -0.073717f, 0.020507f, 0.008379f, -0.004027f, -0.017156f, 0.014181f, 0.006840f, 0.006976f, -0.046040f, 0.018350f, 0.045158f, 0.002236f, 0.026771f, 0.022779f, 0.018345f, 0.002380f, 0.008107f, 0.000271f, 0.001456f, 0.001332f, -0.015471f, -0.002341f, 0.013394f, -0.000950f, 0.027825f, 0.023840f, -0.014292f, -0.003265f, 0.012154f, 0.005035f, 0.021108f, -0.042812f, -0.001293f, -0.147437f, -0.030258f, -0.002958f, 0.001731f, 0.052425f, -0.137805f, -0.014867f, 0.062239f, -0.100750f, 0.022786f, -0.022295f, 0.118207f, 0.063439f, -0.072557f, 0.018670f, 0.079425f, 0.008939f, -0.031959f, 0.027068f, 0.018841f, 0.011291f, -0.001823f, -0.007117f, 0.005799f, 0.013843f, 0.026940f, 0.082805f, 0.065249f, 0.072509f, 0.048521f, 0.091096f, 0.043450f, 0.093121f, 0.037472f, 0.082693f, 0.000575f, 0.051654f, 0.045140f, 0.051191f, 0.037934f, -0.002910f, 0.014431f, -0.062055f, -0.038147f, 0.120394f, 0.000847f, -0.047029f, -0.014059f, 0.038317f, 0.062348f, 0.129491f, + -0.018085f, -0.070092f, -0.036367f, -0.051477f, 0.072633f, 0.084638f, 0.093264f, 0.029923f, -0.004136f, 0.064331f, -0.108791f, 0.099102f, 0.036544f, -0.051150f, -0.001708f, -0.167405f, 0.003240f, -0.110414f, -0.154867f, -0.037662f, -0.091343f, -0.038619f, 0.173814f, 0.160001f, 0.149024f, -0.117187f, -0.012862f, -0.012758f, 0.117005f, 0.185279f, -0.041920f, -0.051421f, 0.101486f, 0.105740f, 0.089593f, -0.010081f, -0.015363f, -0.050446f, -0.065129f, 0.010022f, -0.024452f, 0.028978f, 0.043625f, 0.039280f, 0.026002f, 0.003266f, 0.016568f, 0.050042f, 0.007671f, 0.000892f, -0.014785f, 0.003406f, 0.002584f, 0.014039f, 0.009384f, 0.010677f, 0.050352f, -0.003893f, -0.031238f, 0.031887f, 0.036382f, 0.009256f, 0.058584f, 0.014597f, 0.027947f, 0.065482f, 0.086081f, 0.064072f, 0.045711f, 0.019343f, 0.007997f, 0.025872f, 0.058779f, 0.026751f, 0.060284f, 0.045805f, 0.028579f, 0.043127f, 0.014974f, 0.058369f, 0.049827f, 0.041709f, 0.062103f, 0.036634f, 0.011104f, 0.018085f, -0.003926f, -0.040983f, 0.105886f, 0.128672f, -0.106579f, -0.097764f, 0.032888f, 0.112489f, 0.002795f, -0.052732f, + 0.000369f, 0.030522f, 0.033756f, -0.093051f, 0.034590f, -0.012427f, 0.049104f, -0.051095f, -0.024600f, -0.059871f, 0.063191f, -0.008626f, -0.027956f, -0.055982f, 0.040995f, 0.024205f, -0.009712f, -0.047315f, 0.022105f, 0.020948f, 0.011145f, -0.041809f, -0.006063f, -0.002100f, 0.048304f, -0.036441f, -0.008920f, -0.053291f, -0.014067f, 0.018438f, 0.042386f, -0.055448f, -0.021228f, 0.059100f, 0.050541f, -0.015521f, -0.035831f, -0.000219f, -0.018316f, 0.049378f, -0.028290f, -0.015556f, 0.023811f, 0.017945f, 0.030077f, -0.027078f, 0.008475f, -0.037317f, 0.043043f, 0.051068f, 0.024104f, 0.008005f, -0.040042f, 0.045395f, -0.032227f, 0.070251f, -0.051456f, 0.056484f, -0.088595f, 0.059859f, 0.007418f, -0.004994f, -0.062359f, -0.018382f, 0.020116f, -0.015695f, 0.005916f, -0.015163f, 0.017464f, -0.007541f, 0.019556f, -0.019116f, -0.026801f, -0.016681f, 0.018565f, 0.001690f, -0.002488f, -0.004344f, -0.014905f, 0.009526f, 0.021729f, -0.010993f, -0.002978f, 0.001730f, 0.002792f, -0.000775f, 0.003694f, -0.003469f, 0.015654f, 0.000921f, 0.020341f, -0.018231f, 0.003205f, -0.008148f, 0.020510f, -0.021924f, + 0.020186f, -0.022606f, 0.013422f, 0.007369f, 0.025598f, -0.005539f, 0.024192f, -0.021968f, -0.018463f, -0.003059f, 0.039466f, -0.018729f, 0.030295f, -0.010335f, 0.003704f, 0.005138f, 0.021142f, -0.008698f, 0.010332f, 0.005035f, -0.000635f, -0.000566f, 0.006571f, -0.001403f, -0.014800f, 0.028867f, -0.017602f, 0.005664f, -0.014367f, 0.010082f, -0.013715f, 0.015658f, -0.020326f, 0.023623f, -0.019073f, 0.020318f, -0.025596f, 0.023158f, -0.032192f, 0.031050f, -0.020326f, 0.022568f, -0.023891f, 0.024026f, -0.024334f, 0.025087f, -0.022964f, 0.024040f, -0.003417f, -0.022962f, 0.102616f, 0.109204f, -0.064262f, -0.038061f, 0.021650f, 0.104289f, 0.064787f, 0.038864f, 0.037375f, -0.016604f, -0.043644f, -0.013206f, 0.024501f, -0.000376f, -0.010285f, 0.031113f, 0.000536f, 0.021929f, 0.002683f, -0.011663f, -0.039107f, -0.010378f, -0.002295f, 0.002887f, -0.001555f, -0.031771f, 0.035459f, 0.005918f, -0.014285f, -0.000803f, -0.001105f, 0.000499f, 0.022886f, 0.042053f, 0.017926f, 0.004250f, -0.015154f, -0.021771f, -0.005659f, 0.013660f, 0.028178f, 0.037955f, -0.021200f, -0.020930f, 0.004722f, 0.038367f, + 0.017294f, 0.008549f, -0.017354f, -0.034837f, 0.029688f, -0.006137f, 0.000818f, 0.002006f, 0.009550f, 0.009164f, -0.004244f, -0.001285f, -0.022729f, 0.003471f, 0.020003f, -0.009530f, 0.011941f, -0.006731f, -0.016205f, 0.010258f, -0.003098f, 0.005539f, -0.001262f, 0.017390f, 0.011785f, -0.025988f, 0.007633f, 0.001215f, -0.047129f, -0.062619f, 0.001765f, 0.003636f, 0.014232f, 0.038081f, 0.004147f, -0.016815f, -0.016459f, 0.014978f, 0.016361f, 0.024842f, 0.016927f, 0.001026f, 0.007202f, -0.002705f, -0.018930f, -0.007894f, 0.002845f, -0.025976f, -0.024853f, 0.015943f, 0.016937f, -0.000446f, 0.019054f, -0.027110f, -0.004952f, -0.001316f, 0.001309f, -0.008412f, 0.004250f, 0.014572f, 0.020252f, 0.009845f, 0.017048f, -0.010865f, -0.021271f, 0.012395f, 0.001943f, -0.005271f, -0.036276f, -0.135419f, 0.057499f, 0.208843f, 0.192554f, 0.164381f, 0.065562f, -0.155954f, -0.097630f, -0.140202f, -0.157131f, -0.140471f, -0.040931f, 0.030391f, 0.118413f, 0.123371f, 0.147719f, 0.097874f, 0.098678f, 0.002472f, -0.103817f, -0.099117f, -0.122246f, -0.095586f, -0.053245f, -0.003559f, -0.034310f, 0.037187f, + 0.045779f, 0.074282f, 0.081520f, 0.082865f, 0.049321f, 0.004210f, 0.021898f, -0.018205f, 0.011717f, -0.056653f, -0.041247f, -0.052389f, -0.085734f, -0.067949f, -0.052150f, -0.036749f, -0.060974f, 0.008508f, 0.103971f, 0.117575f, 0.065568f, 0.122938f, 0.030414f, 0.071763f, 0.036835f, 0.021115f, -0.030950f, -0.065555f, -0.089967f, -0.126242f, -0.096905f, -0.144022f, -0.059725f, -0.064094f, 0.041287f, 0.041465f, 0.120442f, 0.138927f, 0.123601f, 0.110186f, 0.107599f, 0.067421f, 0.008191f, -0.037640f, -0.115255f, -0.072202f, -0.150532f, -0.128235f, -0.178518f, -0.028831f, -0.016071f, 0.044029f, 0.056369f, 0.101757f, 0.119565f, 0.100176f, 0.089320f, 0.066353f, 0.039022f, 0.005575f, -0.033332f, -0.047833f, -0.064588f, -0.099529f, -0.070059f, -0.086652f, -0.060406f, -0.030883f, -0.009034f, 0.019690f, 0.019020f, 0.095173f, 0.087594f, 0.086949f, 0.067678f, 0.049763f, 0.005820f, 0.030952f, -0.034568f, -0.057079f, -0.044614f, -0.123606f, -0.144263f, -0.027783f, -0.009828f, -0.006210f, 0.070198f, 0.057604f, 0.076622f, 0.053818f, 0.070009f, 0.021429f, 0.018012f, -0.005396f, -0.029827f, -0.038174f, + -0.049499f, -0.054656f, -0.033785f, -0.007048f, -0.042796f, -0.022471f, 0.033984f, 0.048675f, 0.032501f, 0.042168f, 0.028631f, 0.020929f, 0.005303f, -0.003773f, -0.014959f, -0.020870f, -0.016358f, -0.026098f, -0.013855f, -0.005119f, -0.009984f, -0.013247f, 0.002810f, 0.010100f, 0.002006f, 0.015343f, 0.019259f, 0.014616f, 0.009736f, 0.008503f, 0.002560f, -0.001576f, -0.005496f, -0.001396f, -0.002080f, 0.000734f} + }, + { + {-0.009620f, -0.009836f, -0.008129f, 0.002252f, -0.004664f, -0.000752f, -0.001333f, 0.004711f, 0.018830f, -0.005038f, 0.001896f, -0.017939f, -0.009798f, 0.005466f, -0.008528f, -0.006655f, -0.002517f, -0.007580f, -0.002008f, 0.015622f, -0.006711f, -0.010009f, 0.016884f, 0.013513f, -0.004769f, -0.003137f, 0.015455f, 0.004394f, 0.005994f, 0.002981f, 0.000757f, -0.003959f, -0.006513f, 0.006123f, -0.004852f, 0.004575f, 0.001663f, 0.001760f, -0.002163f, -0.005315f, -0.004166f, 0.003771f, -0.004796f, -0.007581f, -0.003416f, -0.003391f, -0.009650f, 0.010918f, 0.016878f, -0.009712f, 0.005509f, 0.000464f, -0.003788f, 0.002672f, -0.000418f, 0.000136f, -0.005651f, 0.010436f, -0.006192f, -0.007653f, 0.008688f, 0.002649f, -0.000454f, -0.000978f, 0.004774f, 0.000300f, -0.000135f, -0.003000f, -0.001503f, 0.009170f, -0.013396f, 0.004557f, 0.002466f, -0.003262f, -0.003202f, -0.004682f, -0.006817f, 0.000049f, 0.006581f, 0.006719f, 0.001960f, -0.000133f, 0.001524f, -0.003740f, 0.004898f, -0.001861f, 0.002883f, -0.002089f, -0.001341f, -0.001013f, -0.001219f, -0.000980f, 0.002262f, -0.000113f, 0.000935f, 0.001361f, + 0.000832f, 0.002342f, 0.002967f, -0.000986f, -0.000681f, -0.001335f, -0.000915f, -0.001893f, -0.000555f, -0.001266f, -0.001031f, -0.001926f, -0.000753f, -0.000225f, -0.029660f, -0.004685f, -0.010836f, -0.002668f, 0.002399f, -0.008088f, -0.018078f, 0.013251f, -0.004438f, 0.003084f, 0.008874f, -0.002822f, -0.000902f, -0.001108f, 0.004087f, -0.003141f, 0.014928f, -0.000623f, 0.011516f, 0.016877f, -0.020260f, 0.004241f, 0.014080f, 0.000963f, 0.002808f, 0.009738f, 0.018010f, 0.002567f, -0.004049f, 0.009056f, -0.002410f, -0.004705f, 0.004062f, 0.003194f, 0.004018f, -0.005084f, 0.018352f, -0.008484f, 0.004631f, 0.006833f, -0.000083f, -0.000912f, -0.008955f, 0.001442f, -0.010376f, 0.008698f, -0.010600f, -0.008157f, 0.005869f, -0.009901f, 0.006776f, -0.006919f, 0.002845f, -0.005591f, 0.003765f, 0.007963f, 0.015635f, 0.004775f, 0.001768f, 0.007584f, 0.000114f, -0.013544f, 0.001791f, 0.003767f, 0.005140f, -0.003433f, 0.000705f, -0.001896f, 0.002566f, 0.007501f, 0.004543f, 0.010260f, 0.003550f, 0.001328f, -0.006281f, -0.003251f, 0.006064f, 0.004683f, -0.006015f, 0.007155f, 0.003515f, 0.007827f, + -0.002468f, -0.001947f, -0.002476f, 0.000306f, -0.001534f, -0.006383f, -0.001173f, 0.000977f, 0.001046f, 0.004016f, 0.000446f, -0.001285f, -0.001566f, 0.001654f, 0.000862f, -0.003165f, -0.000472f, -0.000310f, 0.000018f, 0.001164f, 0.000330f, -0.001517f, -0.000209f, -0.001443f, -0.010830f, 0.008082f, 0.005178f, 0.001695f, 0.010120f, -0.000467f, 0.005651f, 0.013920f, 0.008531f, 0.018231f, 0.003462f, -0.002601f, -0.018638f, 0.003008f, -0.011446f, -0.003729f, 0.001387f, 0.004274f, -0.007185f, 0.000081f, 0.017834f, -0.009064f, -0.000524f, -0.009050f, 0.004301f, 0.000173f, 0.003428f, 0.007384f, 0.008565f, -0.005336f, 0.006416f, 0.006754f, 0.012891f, 0.000576f, -0.012731f, 0.001314f, 0.013668f, -0.001267f, -0.000898f, -0.001814f, 0.009178f, -0.010654f, 0.000864f, 0.007121f, 0.009186f, 0.011128f, -0.004198f, -0.007161f, -0.000964f, 0.015960f, 0.001448f, 0.005811f, -0.012956f, -0.005707f, 0.003103f, 0.002739f, -0.002243f, 0.008488f, -0.000612f, -0.001678f, 0.004694f, -0.008060f, 0.000488f, -0.001210f, 0.005524f, 0.008590f, -0.012584f, -0.002755f, 0.004041f, 0.008467f, -0.005402f, -0.005101f, + 0.003462f, 0.010020f, -0.000902f, 0.006750f, 0.004732f, 0.006919f, 0.002867f, 0.007712f, 0.011528f, 0.000500f, 0.003219f, -0.003141f, 0.004687f, 0.003407f, -0.002215f, -0.005156f, -0.000992f, -0.003642f, 0.001200f, -0.003328f, 0.001454f, -0.001494f, 0.000804f, -0.002694f, 0.000062f, -0.000229f, 0.000566f, -0.001605f, 0.002567f, -0.002415f, -0.001071f, -0.001060f, -0.001319f, 0.000352f, 0.001445f, 0.001535f, 0.000827f, -0.000706f, -0.000546f, -0.001114f, 0.003474f, 0.032246f, 0.015655f, 0.012708f, -0.011991f, -0.002123f, -0.016735f, -0.011965f, 0.017974f, 0.001621f, -0.011306f, -0.005271f, 0.003870f, -0.010718f, -0.000940f, 0.018258f, 0.007335f, -0.000759f, 0.005893f, 0.026775f, -0.017796f, 0.004273f, -0.003308f, -0.008664f, 0.015432f, 0.007821f, 0.008025f, -0.005999f, 0.006935f, 0.008837f, -0.002682f, 0.005670f, -0.001767f, -0.007640f, 0.001631f, 0.002864f, -0.001286f, 0.009063f, 0.002281f, -0.003281f, 0.010077f, -0.004589f, -0.004683f, -0.005818f, 0.002863f, 0.003842f, 0.000777f, 0.007199f, 0.001013f, 0.022659f, 0.001536f, -0.000020f, -0.005218f, -0.004738f, 0.005485f, -0.016877f, + 0.000748f, 0.010111f, 0.008089f, -0.009116f, 0.013405f, 0.000218f, 0.006024f, 0.010663f, -0.002978f, 0.008253f, 0.006462f, -0.002943f, -0.009574f, -0.007357f, 0.006085f, 0.015159f, 0.004377f, -0.006606f, -0.003194f, -0.003748f, 0.010489f, -0.008856f, -0.000453f, 0.008602f, 0.010038f, 0.001371f, 0.001307f, -0.002773f, -0.004132f, 0.000170f, -0.000925f, -0.003520f, -0.000679f, -0.001609f, -0.001695f, -0.002709f, -0.001313f, 0.003537f, 0.002455f, -0.000719f, 0.004642f, 0.001350f, 0.001900f, -0.000603f, 0.001611f, -0.000817f, -0.000359f, -0.000193f, 0.000575f, 0.000563f, 0.001330f, 0.002495f, 0.000678f, 0.000284f, -0.000722f, 0.007764f, 0.002094f, 0.021091f, 0.005289f, 0.012569f, -0.000532f, 0.002783f, 0.003573f, 0.003500f, -0.003452f, 0.012852f, -0.005378f, 0.013906f, -0.006793f, -0.005395f, 0.003693f, -0.009205f, -0.002585f, -0.002904f, 0.003970f, 0.005778f, -0.003636f, -0.013474f, 0.006178f, -0.016290f, -0.006516f, -0.002777f, -0.000318f, -0.002565f, 0.003246f, 0.014576f, 0.008306f, 0.000977f, -0.015107f, -0.014591f, 0.000568f, 0.009825f, -0.005130f, 0.001526f, -0.001796f, -0.006480f, + -0.009680f, 0.000994f, 0.006668f, 0.014056f, 0.012762f, -0.001642f, 0.004146f, -0.017658f, 0.006096f, 0.011708f, 0.013383f, -0.001658f, 0.012208f, 0.002585f, 0.017742f, 0.010442f, 0.003443f, 0.007983f, -0.000744f, -0.004638f, -0.003085f, -0.001811f, 0.011152f, -0.004274f, -0.006226f, -0.007756f, 0.011128f, -0.002701f, -0.019411f, 0.003849f, 0.007404f, 0.010879f, 0.014138f, 0.024092f, -0.010090f, -0.008300f, 0.014287f, 0.015054f, 0.011898f, 0.005070f, -0.002500f, -0.002775f, -0.009413f, -0.010580f, -0.002959f, -0.003841f, 0.003138f, -0.000463f, -0.003100f, -0.000463f, -0.005872f, 0.001222f, -0.000825f, 0.002709f, 0.000323f, -0.004500f, -0.000423f, 0.000434f, -0.000807f, -0.000448f, 0.002044f, 0.003907f, 0.003906f, 0.003211f, 0.000790f, 0.000770f, -0.006051f, 0.000228f, 0.004070f, -0.002755f, 0.002188f, 0.000455f, -0.001787f, -0.001476f, -0.000865f, 0.004057f, 0.002960f, 0.000573f, -0.000510f, 0.002195f, 0.000052f, -0.028013f, 0.013608f, 0.019194f, 0.002592f, 0.015976f, 0.002261f, -0.014322f, -0.001291f, -0.006686f, -0.003466f, 0.014749f, -0.019139f, -0.005358f, 0.006781f, 0.007540f, + 0.017442f, -0.003429f, 0.007584f, -0.027238f, -0.013787f, 0.006969f, 0.016184f, -0.010608f, -0.007539f, -0.011371f, -0.013633f, 0.007169f, -0.001620f, 0.000137f, 0.005181f, 0.002488f, 0.005403f, 0.021131f, -0.012726f, 0.020507f, -0.001068f, 0.004194f, 0.004616f, 0.004458f, -0.006120f, 0.007133f, -0.014444f, -0.002761f, -0.007838f, -0.001531f, -0.010712f, 0.013066f, 0.002376f, 0.036187f, 0.001226f, -0.002319f, -0.009092f, 0.001601f, -0.007603f, 0.018912f, -0.011605f, 0.002506f, -0.021100f, 0.015878f, 0.014681f, -0.017529f, 0.010781f, 0.010878f, 0.004604f, -0.009500f, -0.009589f, 0.015931f, 0.004196f, -0.023057f, 0.011131f, -0.010948f, -0.005859f, 0.005212f, -0.005671f, 0.002060f, 0.004751f, 0.006211f, -0.011914f, -0.029213f, 0.004345f, 0.006551f, -0.000804f, -0.006282f, 0.011625f, -0.004978f, -0.003640f, -0.005413f, 0.007768f, -0.009458f, -0.003631f, -0.005379f, -0.003871f, 0.002370f, -0.003497f, 0.005006f, 0.000836f, -0.008412f, 0.006273f, 0.000802f, -0.004195f, -0.000268f, 0.005668f, 0.001799f, 0.000386f, -0.000758f, -0.001405f, -0.004466f, 0.000496f, 0.001222f, 0.000689f, -0.000463f, + 0.002675f, -0.005054f, 0.000678f, 0.000940f, -0.005479f, -0.005011f, 0.012316f, 0.002374f, -0.000223f, -0.010398f, -0.017439f, 0.006174f, -0.009347f, -0.003782f, 0.016922f, -0.023023f, -0.009566f, -0.016964f, -0.001703f, 0.014542f, -0.001326f, -0.012001f, -0.016628f, -0.018700f, 0.007313f, 0.019779f, -0.005643f, 0.012358f, 0.018630f, -0.005151f, -0.004267f, 0.007286f, 0.010372f, 0.022086f, -0.003175f, 0.012417f, 0.001827f, 0.026261f, 0.019336f, 0.005288f, -0.006156f, 0.002655f, -0.014528f, 0.025497f, 0.005953f, -0.011242f, -0.012454f, 0.014707f, 0.012446f, 0.008943f, 0.006395f, 0.004370f, 0.013229f, -0.005700f, 0.005853f, -0.008727f, 0.001290f, 0.000720f, -0.013226f, -0.017705f, -0.006254f, -0.012503f, 0.008072f, -0.007629f, -0.005642f, -0.019310f, -0.012124f, 0.003711f, -0.006571f, -0.002307f, 0.009315f, 0.019361f, 0.024437f, 0.012700f, 0.010133f, -0.008988f, -0.019843f, 0.000356f, -0.013879f, -0.032120f, 0.000312f, -0.002248f, 0.012018f, 0.008096f, -0.007833f, -0.017891f, -0.009699f, 0.008671f, -0.000395f, -0.001983f, -0.007379f, 0.003975f, 0.004119f, 0.003248f, -0.001874f, -0.010180f, + 0.002184f, 0.001355f, 0.001031f, -0.002291f, -0.001220f, -0.001364f, 0.001309f, -0.004975f, -0.005100f, -0.000524f, 0.000661f, -0.004133f, 0.000401f, -0.000813f, 0.003875f, 0.005144f, -0.005503f, -0.000183f, 0.004056f, -0.000662f, -0.002288f, 0.000956f, 0.000621f, 0.005579f, -0.001687f, 0.003596f, 0.002848f, -0.002370f, -0.037047f, -0.011473f, 0.002045f, 0.018035f, -0.012994f, 0.008791f, 0.005789f, -0.000792f, 0.027206f, -0.003691f, 0.025604f, -0.015125f, 0.007520f, 0.008052f, 0.000321f, -0.023442f, -0.009668f, -0.008787f, -0.026562f, 0.009012f, -0.006607f, 0.005584f, -0.001659f, 0.009580f, -0.000034f, -0.010448f, 0.005545f, -0.017152f, 0.012619f, 0.007328f, 0.029125f, -0.001293f, 0.000881f, 0.026545f, -0.023504f, 0.020594f, 0.025316f, -0.015891f, 0.016305f, -0.006867f, -0.007647f, -0.013347f, 0.003356f, 0.002997f, 0.018005f, 0.011509f, -0.004639f, -0.007566f, -0.015303f, 0.008311f, 0.009550f, -0.017638f, -0.007893f, 0.016342f, -0.028797f, 0.002599f, -0.022244f, 0.012470f, 0.001231f, -0.000530f, 0.006730f, -0.007655f, 0.002560f, 0.026432f, -0.010938f, 0.005698f, 0.012920f, 0.008041f, + 0.001423f, -0.014099f, 0.006188f, 0.005080f, -0.008139f, -0.022784f, 0.000249f, -0.005282f, -0.017970f, 0.013526f, -0.004893f, 0.004923f, -0.000716f, 0.002494f, 0.005725f, 0.005478f, -0.010039f, 0.002454f, -0.001000f, 0.002218f, -0.000801f, 0.006702f, 0.003393f, -0.001753f, -0.001242f, -0.009867f, -0.000382f, -0.006768f, 0.001178f, 0.001040f, 0.007106f, -0.010426f, 0.003858f, 0.005529f, -0.003918f, -0.006497f, 0.002315f, -0.000996f, -0.003792f, 0.003051f, -0.000811f, -0.004079f, 0.001444f, -0.001415f, -0.004637f, -0.001353f, -0.002996f, -0.006281f, 0.002959f, -0.001953f, 0.000594f, -0.003459f, -0.000700f, -0.003534f, 0.001683f, 0.006635f, -0.000861f, -0.015145f, 0.044032f, -0.016374f, 0.008513f, 0.006333f, 0.015682f, 0.004944f, 0.009498f, 0.021997f, -0.017045f, -0.010445f, -0.001441f, 0.030601f, -0.011851f, -0.013022f, -0.015226f, 0.007564f, 0.005066f, 0.016747f, -0.034978f, 0.000331f, 0.000694f, -0.002373f, 0.017909f, -0.004358f, 0.013800f, 0.025683f, -0.018714f, -0.008379f, 0.007274f, -0.014012f, -0.017664f, 0.011847f, -0.016412f, 0.024150f, -0.004169f, -0.024871f, -0.003332f, -0.014283f, + 0.007855f, 0.019696f, -0.000424f, 0.009959f, -0.001264f, 0.003824f, 0.023429f, 0.000715f, 0.016982f, 0.006718f, -0.012793f, 0.013277f, 0.011325f, 0.001560f, 0.009507f, 0.033671f, -0.005628f, -0.015161f, 0.007964f, -0.019187f, 0.001462f, 0.032159f, 0.010887f, 0.005061f, -0.006170f, -0.009233f, -0.006240f, -0.011402f, 0.019361f, -0.012763f, -0.003434f, -0.007964f, 0.021976f, -0.040484f, 0.013806f, 0.014242f, 0.024317f, 0.005757f, 0.001819f, 0.021436f, -0.006104f, -0.009302f, -0.012183f, 0.000284f, -0.010139f, -0.001032f, -0.008728f, 0.007020f, 0.000620f, -0.007771f, -0.008199f, -0.006862f, 0.002575f, 0.008373f, 0.006702f, 0.001430f, 0.000463f, -0.003596f, -0.008872f, -0.002969f, -0.002314f, 0.003628f, 0.003699f, -0.001498f, -0.002210f, 0.001718f, -0.005332f, -0.000033f, -0.005175f, -0.002614f, -0.006803f, -0.009150f, -0.002573f, 0.003109f, 0.010125f, 0.001620f, -0.002850f, -0.002727f, 0.003955f, -0.000995f, 0.009709f, 0.004388f, 0.001668f, 0.001351f, 0.065080f, 0.019422f, -0.011861f, -0.015806f, -0.013315f, 0.047150f, -0.040633f, 0.003234f, 0.015916f, 0.002354f, -0.022029f, -0.004983f, + 0.011060f, -0.002360f, 0.002570f, 0.019559f, -0.020239f, -0.017003f, 0.008347f, 0.025495f, 0.015716f, 0.006585f, -0.012350f, -0.012072f, -0.011620f, -0.013540f, 0.012630f, 0.005016f, 0.018098f, 0.014516f, 0.008274f, -0.019204f, -0.009127f, -0.020458f, -0.004054f, -0.013421f, -0.030898f, -0.005758f, 0.013819f, 0.003071f, -0.014328f, -0.014452f, 0.000374f, 0.007478f, 0.019357f, 0.002461f, 0.009821f, 0.002804f, 0.037395f, -0.032436f, 0.021236f, 0.003982f, -0.033090f, -0.005977f, -0.009966f, -0.008187f, 0.005099f, -0.014488f, 0.008760f, 0.006363f, 0.014837f, -0.018068f, 0.006417f, 0.028943f, 0.013571f, 0.045985f, -0.010269f, -0.001141f, -0.011285f, -0.005780f, 0.001268f, -0.000913f, -0.043584f, 0.019439f, -0.001815f, -0.002550f, 0.011849f, 0.011710f, -0.012343f, -0.018569f, -0.020303f, -0.007549f, 0.014446f, 0.006152f, -0.004722f, -0.011996f, 0.010609f, -0.018865f, 0.009902f, -0.003088f, -0.008524f, -0.010662f, -0.011560f, -0.004173f, -0.003840f, 0.001839f, -0.004815f, -0.003263f, 0.002414f, -0.003461f, -0.003222f, 0.002010f, -0.009445f, -0.004307f, -0.000641f, -0.003214f, -0.005399f, -0.002410f, + -0.009592f, 0.001367f, 0.007211f, 0.009706f, 0.011395f, -0.008256f, -0.010106f, -0.007170f, -0.009137f, 0.000353f, -0.000006f, -0.005605f, -0.006374f, 0.002463f, -0.000837f, 0.006332f, -0.001953f, -0.000455f, 0.004914f, 0.004919f, -0.003939f, -0.021783f, 0.005297f, 0.011852f, -0.000453f, -0.013384f, -0.009288f, -0.028932f, -0.034378f, 0.007138f, -0.015234f, -0.007256f, 0.005064f, -0.000287f, -0.003593f, -0.015341f, -0.007609f, -0.000147f, 0.012079f, 0.012869f, -0.018881f, -0.010834f, 0.011899f, -0.016922f, -0.008306f, -0.027715f, 0.026838f, -0.003492f, 0.024179f, 0.002116f, 0.009074f, 0.025686f, 0.019419f, -0.011404f, 0.005857f, 0.013061f, -0.013712f, -0.005583f, 0.012729f, -0.004719f, -0.030783f, -0.005722f, -0.021567f, 0.031651f, -0.003340f, -0.008401f, -0.018089f, -0.026400f, 0.009468f, 0.005599f, 0.006233f, 0.013029f, 0.000309f, -0.004812f, 0.013636f, 0.003483f, -0.002600f, 0.004797f, -0.007615f, 0.020917f, -0.004937f, 0.013198f, 0.039049f, 0.008708f, 0.007339f, 0.009145f, 0.014411f, -0.033987f, -0.027508f, 0.010474f, -0.030024f, 0.020795f, -0.004237f, 0.023825f, 0.006295f, 0.046450f, + 0.018242f, 0.003163f, -0.013496f, -0.005988f, -0.023885f, -0.001610f, 0.007454f, 0.004666f, 0.005079f, 0.008211f, 0.021198f, -0.008816f, -0.017190f, -0.005976f, -0.004777f, 0.006672f, 0.019235f, 0.006803f, -0.004637f, 0.005546f, 0.005642f, -0.000991f, -0.004446f, -0.011196f, 0.000753f, 0.001262f, -0.005464f, -0.007409f, -0.001412f, -0.011873f, 0.008328f, 0.004728f, -0.005583f, -0.001810f, -0.011794f, -0.005781f, 0.005452f, 0.010322f, -0.005185f, -0.004792f, -0.000218f, -0.009477f, 0.010049f, -0.000476f, 0.007238f, -0.009804f, 0.000004f, -0.010158f, 0.005946f, -0.012054f, -0.002735f, -0.055456f, -0.038837f, 0.014410f, -0.015469f, -0.032073f, -0.048684f, -0.001186f, 0.003883f, -0.009440f, -0.007776f, 0.046433f, 0.012184f, -0.033577f, 0.007026f, -0.020490f, -0.017236f, -0.016639f, -0.029987f, -0.004953f, 0.002765f, -0.041294f, -0.039102f, -0.014855f, 0.006469f, 0.003851f, 0.023692f, 0.020053f, 0.012459f, -0.009942f, -0.000386f, 0.009165f, -0.021178f, -0.011806f, -0.007226f, 0.007014f, -0.019896f, -0.012152f, 0.013598f, 0.008238f, -0.000539f, -0.003053f, -0.003716f, 0.011337f, -0.028651f, -0.016325f, + -0.014106f, 0.019009f, -0.022209f, 0.015099f, 0.025454f, 0.034873f, -0.002319f, 0.010038f, -0.008268f, -0.016634f, -0.021839f, -0.005882f, 0.021531f, 0.008104f, -0.039096f, 0.001737f, 0.040460f, -0.026863f, 0.001308f, -0.005727f, 0.002157f, 0.009627f, 0.020634f, -0.004268f, 0.006556f, 0.024777f, 0.017035f, 0.010919f, -0.018951f, -0.022801f, 0.016670f, -0.016496f, -0.031241f, -0.030001f, 0.032696f, 0.012457f, 0.018061f, 0.007763f, -0.005149f, -0.006292f, 0.015600f, 0.011063f, 0.002941f, 0.015037f, -0.005993f, -0.019682f, -0.010170f, -0.013713f, 0.005516f, 0.019929f, 0.009702f, 0.002423f, 0.011792f, 0.006557f, 0.010995f, -0.002088f, -0.005642f, 0.006781f, -0.002458f, -0.007613f, -0.006494f, 0.005262f, -0.018192f, 0.004015f, 0.010670f, -0.006401f, 0.013200f, 0.009064f, -0.000761f, -0.001425f, 0.012444f, 0.001556f, -0.002878f, -0.007914f, -0.007788f, 0.002192f, 0.006560f, 0.001509f, 0.005282f, -0.007886f, -0.032411f, 0.017885f, -0.026237f, -0.046767f, 0.008437f, -0.028433f, -0.016528f, 0.055264f, 0.003748f, 0.041382f, 0.037226f, -0.007463f, 0.039203f, 0.054263f, 0.038572f, -0.048524f, + -0.006491f, -0.022550f, -0.022863f, -0.013971f, 0.000960f, -0.020001f, 0.042329f, 0.012590f, 0.023221f, -0.019821f, 0.022226f, 0.017132f, 0.005678f, -0.025246f, -0.019666f, 0.040319f, -0.007384f, -0.037591f, -0.002585f, -0.043510f, -0.006302f, 0.012125f, -0.015633f, 0.000989f, -0.035548f, 0.016343f, 0.032174f, 0.017476f, -0.004774f, -0.017395f, -0.006542f, -0.004348f, -0.006077f, -0.016288f, -0.043674f, 0.029526f, 0.016543f, 0.015450f, 0.018432f, -0.024747f, 0.038456f, 0.004895f, -0.011676f, -0.008523f, -0.030752f, -0.013472f, 0.019838f, 0.012375f, 0.032873f, -0.003486f, -0.037772f, -0.066120f, -0.003969f, -0.000396f, 0.000188f, -0.023782f, -0.033427f, -0.006281f, 0.021990f, -0.011564f, -0.013578f, 0.008850f, -0.003067f, 0.033697f, -0.006728f, -0.029825f, -0.010798f, 0.031386f, 0.001903f, 0.006031f, -0.030567f, -0.010747f, -0.005853f, 0.012676f, 0.016199f, -0.007980f, 0.005562f, 0.001327f, 0.012099f, 0.008053f, -0.001348f, 0.005516f, 0.016246f, 0.004061f, -0.000403f, -0.005368f, 0.001728f, 0.010879f, -0.000486f, 0.005562f, 0.018588f, 0.002814f, -0.006557f, -0.013794f, -0.001646f, 0.010105f, + -0.009730f, 0.005185f, -0.004444f, -0.002911f, -0.006528f, -0.008280f, -0.006427f, 0.000175f, 0.011698f, 0.009257f, -0.012678f, -0.023055f, -0.006948f, 0.008652f, 0.002994f, 0.003138f, 0.070553f, 0.044499f, -0.006317f, -0.041094f, 0.008647f, 0.020490f, 0.011806f, 0.029945f, 0.044943f, -0.019832f, 0.003700f, -0.040170f, 0.011374f, 0.003316f, -0.015592f, 0.072389f, 0.027428f, 0.062462f, 0.025780f, 0.016115f, -0.054430f, 0.000844f, 0.030347f, 0.005538f, -0.028981f, 0.012253f, -0.044298f, -0.017286f, 0.003032f, 0.013353f, -0.013279f, -0.008604f, 0.009584f, 0.007835f, 0.003181f, 0.039224f, 0.024346f, 0.006462f, -0.015719f, 0.027018f, -0.017583f, -0.012603f, -0.025843f, -0.008588f, 0.033664f, -0.053204f, -0.000838f, 0.023893f, -0.026573f, -0.008338f, 0.010108f, 0.008993f, 0.049118f, -0.002820f, -0.000578f, -0.022923f, 0.048022f, -0.021389f, 0.006043f, 0.005059f, 0.033245f, -0.007745f, -0.012040f, 0.031686f, -0.053462f, 0.013946f, 0.005094f, -0.022133f, 0.042699f, -0.053384f, -0.006806f, -0.017833f, -0.035888f, -0.017924f, -0.003214f, 0.015225f, 0.033536f, 0.055384f, 0.026979f, 0.036607f, + 0.055690f, -0.022650f, 0.010238f, 0.014041f, -0.023844f, 0.032246f, 0.000606f, -0.042639f, 0.022349f, 0.011861f, -0.015661f, 0.001525f, 0.032913f, 0.024951f, 0.007310f, 0.019700f, 0.005809f, 0.006462f, 0.018050f, -0.003186f, 0.007650f, 0.016216f, -0.003984f, 0.003617f, -0.003006f, -0.000839f, 0.011353f, 0.002337f, 0.001164f, -0.009892f, -0.005987f, -0.006821f, -0.014158f, 0.003167f, -0.007844f, -0.022454f, 0.008601f, 0.013647f, -0.004727f, -0.000123f, 0.005993f, -0.007680f, -0.000335f, 0.023956f, -0.003675f, -0.006535f, -0.015137f, -0.068379f, 0.018946f, 0.003602f, 0.082586f, 0.018862f, 0.015526f, -0.002267f, 0.040280f, 0.010874f, -0.060541f, -0.009294f, 0.064773f, -0.019190f, -0.013639f, 0.005465f, -0.004479f, 0.001472f, -0.011794f, 0.067456f, 0.076740f, -0.041263f, 0.018629f, 0.020664f, 0.011221f, 0.021803f, -0.033776f, -0.046654f, 0.035913f, 0.009872f, -0.025805f, -0.044601f, -0.013390f, -0.015143f, 0.040803f, 0.033352f, 0.018719f, -0.037759f, 0.020771f, -0.016355f, 0.013244f, 0.002278f, 0.017531f, 0.038478f, 0.008856f, -0.085992f, -0.026353f, 0.015811f, -0.034452f, 0.010491f, + 0.036496f, 0.012278f, 0.063551f, -0.021011f, -0.095454f, -0.002189f, -0.038051f, 0.033233f, 0.028830f, -0.010393f, -0.020300f, 0.029518f, -0.045838f, -0.008162f, -0.024765f, 0.021672f, 0.029854f, 0.025516f, 0.027737f, -0.020652f, -0.038842f, -0.115606f, -0.055278f, -0.067266f, 0.010637f, -0.045581f, -0.022097f, -0.009260f, -0.050156f, 0.026919f, -0.090302f, 0.028151f, -0.064935f, -0.047031f, 0.046323f, 0.054741f, -0.016807f, -0.002194f, 0.029648f, 0.038604f, -0.052997f, 0.001178f, 0.008689f, -0.007598f, 0.009361f, 0.028522f, -0.003629f, 0.012628f, -0.002400f, 0.011162f, -0.023427f, -0.012259f, -0.010679f, -0.015399f, -0.003347f, 0.022389f, 0.009297f, 0.020159f, 0.000763f, -0.021262f, -0.019333f, 0.003398f, 0.011744f, -0.004375f, 0.012471f, 0.013036f, 0.031406f, 0.003112f, 0.010810f, 0.003447f, 0.007492f, -0.013798f, -0.004229f, 0.005780f, -0.011228f, 0.000604f, -0.005142f, 0.001355f, 0.005835f, 0.032827f, -0.003012f, -0.019432f, -0.021565f, 0.002163f, -0.001220f, -0.034288f, -0.020107f, 0.014196f, -0.022550f, -0.001111f, -0.000291f, -0.089430f, -0.013154f, 0.059552f, -0.070687f, 0.007137f, + 0.026434f, 0.000956f, 0.018540f, -0.005075f, -0.055994f, -0.004466f, 0.030542f, 0.010484f, 0.045493f, 0.031041f, -0.048028f, -0.051769f, -0.006895f, -0.022273f, -0.007373f, -0.085474f, 0.032061f, 0.034192f, 0.059963f, 0.027476f, 0.054580f, -0.023397f, 0.007501f, 0.056269f, -0.017706f, 0.061219f, 0.016996f, 0.032463f, 0.010916f, -0.015367f, 0.030176f, -0.036883f, 0.001808f, 0.077308f, -0.059893f, 0.005670f, -0.077903f, -0.034949f, -0.056027f, -0.037974f, -0.009820f, 0.004216f, -0.018428f, -0.059268f, -0.010751f, -0.098521f, 0.111353f, 0.039164f, 0.000625f, -0.015009f, -0.026963f, 0.006246f, -0.049062f, 0.009115f, -0.073503f, 0.001724f, 0.003695f, 0.016453f, 0.047023f, 0.067839f, 0.002286f, -0.113738f, -0.052323f, 0.048757f, -0.024867f, -0.022723f, -0.027611f, -0.015137f, 0.056073f, 0.011657f, -0.031596f, 0.023544f, -0.052769f, 0.009147f, -0.010063f, -0.023440f, -0.053279f, -0.030178f, 0.033571f, -0.016075f, -0.012977f, 0.018043f, -0.019879f, -0.006240f, 0.033400f, -0.039264f, -0.026679f, -0.011530f, -0.008282f, 0.041976f, 0.019503f, 0.011320f, 0.024771f, 0.009668f, -0.004251f, 0.019302f, + -0.000572f, 0.014132f, 0.020182f, 0.031561f, -0.012491f, -0.000377f, -0.003701f, 0.023231f, 0.035347f, 0.013036f, -0.008713f, -0.002700f, -0.010973f, -0.025930f, 0.045210f, -0.013471f, 0.023195f, -0.013570f, 0.006995f, -0.014418f, -0.010522f, 0.011436f, 0.020525f, -0.044356f, 0.031424f, 0.050877f, 0.018737f, -0.023238f, -0.030949f, 0.014833f, -0.039955f, 0.063240f, 0.052655f, 0.080149f, -0.057171f, -0.070389f, -0.017705f, -0.001602f, -0.035643f, 0.047149f, 0.057151f, -0.042261f, -0.000179f, -0.075371f, -0.022293f, -0.035677f, -0.068107f, 0.021567f, 0.056148f, 0.034082f, -0.044285f, -0.017102f, 0.005150f, 0.037925f, 0.005629f, -0.002657f, 0.014184f, -0.004181f, -0.019185f, -0.060901f, -0.041407f, 0.015843f, -0.005734f, -0.033068f, 0.035999f, 0.032182f, 0.020398f, -0.062308f, -0.056974f, 0.054017f, 0.032502f, 0.040204f, -0.040675f, -0.103881f, -0.019674f, 0.043997f, 0.043485f, -0.010464f, 0.105240f, -0.012875f, 0.105793f, -0.158865f, -0.197258f, -0.080813f, -0.118850f, 0.001631f, 0.046286f, 0.024631f, 0.128480f, -0.014350f, -0.008439f, 0.024199f, -0.025716f, -0.101126f, -0.090360f, -0.100251f, + 0.080312f, 0.066093f, -0.024928f, -0.006514f, -0.168182f, 0.047138f, -0.002256f, -0.074744f, 0.031082f, 0.048401f, 0.074220f, 0.058593f, 0.026859f, -0.004858f, -0.050041f, 0.001812f, 0.002373f, -0.013664f, -0.021598f, 0.059651f, 0.036462f, 0.023426f, 0.060365f, -0.046250f, 0.011019f, -0.012712f, -0.028991f, 0.038209f, -0.006066f, -0.065796f, -0.000569f, 0.021189f, -0.023836f, 0.031711f, -0.012713f, 0.008726f, -0.014740f, 0.073735f, 0.057207f, 0.068337f, -0.057445f, -0.012689f, 0.070325f, 0.052414f, -0.050067f, -0.030559f, -0.050428f, -0.029342f, 0.041002f, 0.047010f, -0.016501f, -0.004433f, 0.078431f, 0.003619f, 0.007210f, -0.010010f, 0.013953f, 0.013850f, 0.012874f, 0.022594f, -0.076190f, 0.066479f, 0.050865f, 0.020700f, 0.062941f, -0.037032f, 0.023299f, -0.104087f, -0.050074f, 0.027190f, 0.038553f, 0.017476f, 0.013582f, 0.012778f, 0.027070f, -0.012787f, 0.118450f, 0.010507f, 0.073832f, 0.020996f, -0.035349f, 0.089963f, -0.012078f, 0.035225f, 0.002060f, 0.032131f, -0.003220f, -0.002116f, 0.019982f, 0.045049f, 0.013368f, 0.032860f, 0.002510f, -0.006996f, 0.071339f, 0.007913f, + -0.014812f, 0.001038f, -0.005412f, -0.036007f, -0.010065f, 0.019851f, 0.013418f, -0.080473f, -0.019434f, 0.009950f, 0.018752f, 0.083752f, 0.068585f, -0.083208f, -0.045578f, 0.006665f, -0.018207f, 0.092246f, 0.009187f, 0.085068f, -0.059866f, 0.042732f, 0.008814f, 0.004545f, 0.039753f, 0.087434f, 0.057009f, 0.011513f, 0.077613f, 0.030264f, -0.036330f, -0.078289f, 0.068616f, -0.062471f, 0.041535f, -0.082212f, 0.000461f, -0.130274f, 0.135113f, -0.033570f, 0.004727f, -0.091271f, 0.082032f, -0.031980f, 0.025995f, -0.067012f, 0.079226f, -0.041446f, -0.037210f, -0.027246f, -0.049772f, 0.015324f, -0.027892f, 0.023464f, -0.025866f, 0.043231f, -0.048628f, 0.043316f, -0.051203f, 0.028065f, -0.059957f, 0.047776f, -0.020743f, 0.053046f, -0.018615f, 0.027750f, -0.022676f, 0.017873f, -0.025867f, 0.000840f, -0.028270f, 0.032174f, 0.013107f, 0.009050f, -0.011338f, 0.003035f, -0.022611f, 0.017274f, -0.023233f, 0.040625f, -0.033805f, -0.040210f, -0.018216f, 0.016175f, -0.047798f, 0.036758f, -0.011914f, 0.020174f, -0.013700f, 0.011473f, -0.022081f, 0.010234f, -0.011477f, 0.012269f, -0.003782f, -0.130310f, + -0.032561f, -0.010102f, 0.013741f, 0.011698f, -0.081110f, -0.047126f, 0.073301f, -0.028427f, 0.027039f, -0.032436f, 0.007166f, 0.092084f, 0.148425f, 0.010293f, -0.005285f, 0.074554f, 0.032480f, 0.030881f, 0.091892f, 0.002071f, 0.055624f, 0.067502f, 0.064775f, -0.025397f, 0.027986f, 0.058352f, 0.081190f, 0.066483f, 0.099856f, 0.056432f, 0.127522f, 0.135387f, 0.097779f, 0.107954f, 0.073501f, -0.008042f, 0.035962f, 0.019152f, -0.028023f, -0.027613f, 0.021141f, 0.063038f, 0.014270f, 0.002919f, -0.000460f, 0.031162f, 0.093695f, 0.072957f, 0.157423f, 0.031791f, -0.081943f, 0.032674f, 0.001435f, 0.033408f, -0.042188f, 0.062637f, -0.114432f, -0.147340f, 0.041005f, 0.148159f, 0.064250f, 0.029603f, -0.183876f, 0.001061f, 0.069573f, 0.110949f, 0.148786f, -0.063352f, 0.008965f, -0.256936f, -0.169675f, 0.068627f, 0.095961f, -0.143123f, -0.122386f, -0.076163f, 0.140164f, 0.093654f, -0.168350f, -0.217045f, -0.044248f, 0.088317f, -0.104210f, 0.049352f, -0.016316f, -0.037634f, -0.056520f, 0.007658f, 0.021837f, 0.036420f, -0.007008f, -0.089947f, -0.078181f, 0.009432f, -0.024729f, 0.037517f, + 0.004569f, -0.009527f, -0.034743f, -0.022835f, 0.013565f, -0.002254f, -0.075302f, -0.037862f, -0.057188f, -0.029532f, 0.009485f, -0.029145f, -0.021920f, -0.067211f, -0.089672f, -0.122814f, -0.123067f, -0.103645f, -0.088544f, -0.097244f, -0.097054f, -0.074014f, -0.102357f, -0.108092f, -0.092459f, -0.103895f, -0.067769f, -0.018505f, -0.060283f, -0.086915f, -0.058175f, 0.002128f, -0.032487f, -0.017797f, -0.021680f, 0.044142f, 0.046641f, 0.000865f, 0.020185f, 0.023790f, 0.012762f, 0.013132f, -0.001344f, 0.009937f, 0.006606f, -0.049979f, 0.124657f, 0.137316f, -0.154968f, -0.066215f, 0.061613f, -0.044979f, 0.031556f, -0.058545f, 0.053649f, -0.049781f, 0.013688f, -0.001418f, -0.021484f, 0.010570f, 0.004621f, -0.016233f, -0.009103f, -0.040085f, -0.008363f, 0.007078f, 0.006697f, -0.040832f, 0.039456f, -0.037581f, -0.010507f, -0.032789f, 0.005575f, -0.031456f, 0.063194f, -0.002892f, 0.018175f, -0.018076f, 0.018124f, -0.019128f, 0.019418f, 0.035770f, 0.052865f, -0.015461f, 0.019062f, 0.017103f, 0.046647f, -0.029594f, 0.030711f, -0.026594f, 0.055645f, -0.015933f, -0.028611f, 0.015667f, -0.011517f, -0.018035f, + 0.007991f, -0.006530f, 0.024922f, -0.014102f, -0.028814f, -0.031581f, 0.006469f, 0.003937f, -0.051533f, 0.014393f, -0.006481f, -0.007177f, 0.010984f, -0.016912f, -0.007327f, 0.003556f, -0.006768f, 0.005468f, -0.026956f, 0.031730f, -0.093593f, 0.048402f, -0.038902f, 0.061937f, -0.041053f, 0.055229f, 0.001047f, 0.029072f, 0.019803f, 0.023241f, 0.013395f, 0.002191f, 0.012797f, -0.004108f, -0.038346f, -0.010505f, 0.003731f, -0.018392f, -0.005706f, -0.010680f, -0.002387f, 0.000059f, -0.013334f, -0.003483f, 0.007742f, -0.003723f, -0.022985f, 0.024565f, -0.002386f, 0.012014f, -0.024520f, 0.010523f, -0.014288f, 0.008597f, -0.017002f, 0.019739f, -0.025880f, 0.037570f, -0.005251f, 0.003025f, -0.038928f, 0.026105f, 0.000456f, 0.018224f, -0.036727f, 0.007263f, -0.013812f, 0.003364f, -0.005378f, 0.000938f, -0.023086f, 0.009932f, -0.002424f, -0.018964f, 0.004524f, 0.028976f, -0.033217f, -0.000876f, -0.011059f, 0.015499f, -0.022159f, 0.020606f, -0.017002f, 0.002788f, -0.011089f, 0.014600f, -0.003164f, 0.005895f, -0.003775f, 0.006802f, -0.010237f, 0.003473f, -0.002113f, -0.008251f, 0.003285f, 0.001041f, + 0.002795f, -0.003670f, 0.009750f, -0.002627f, 0.002308f, -0.007480f, 0.013788f, -0.018405f, 0.006187f, -0.025270f, 0.118374f, 0.071784f, -0.039027f, -0.044895f, -0.003932f, 0.147082f, 0.061453f, 0.020624f, 0.040716f, -0.035665f, -0.045022f, 0.012547f, 0.028554f, 0.007449f, 0.002591f, -0.015662f, -0.012204f, 0.013840f, 0.014111f, 0.034242f, 0.015240f, -0.018461f, -0.008139f, -0.009128f, -0.018608f, -0.000207f, 0.003283f, 0.009121f, 0.011611f, 0.000355f, -0.004940f, 0.013666f, -0.039479f, -0.015004f, 0.017563f, 0.025182f, 0.031223f, -0.017576f, -0.010226f, -0.018686f, 0.031936f, 0.022092f, -0.006047f, 0.010146f, -0.036909f, -0.031943f, 0.029470f, 0.022918f, 0.007229f, -0.055938f, -0.028759f, 0.002295f, 0.009318f, 0.036812f, 0.026319f, -0.004138f, 0.010824f, 0.013075f, -0.017487f, 0.015982f, 0.017341f, -0.005135f, -0.010672f, 0.010300f, -0.018724f, 0.001747f, -0.003205f, -0.013144f, -0.020059f, 0.027822f, 0.005685f, 0.006156f, 0.038328f, 0.046624f, 0.016504f, 0.037729f, 0.035321f, -0.005588f, -0.009551f, -0.010634f, -0.006823f, 0.014720f, 0.024092f, -0.009371f, 0.007409f, -0.021655f, + -0.007879f, -0.001082f, 0.005135f, -0.011820f, -0.014107f, 0.014564f, 0.027885f, 0.012049f, 0.007727f, 0.011669f, -0.013421f, 0.001077f, 0.013262f, 0.002586f, -0.004181f, 0.003333f, -0.001378f, -0.016265f, 0.033067f, 0.010766f, -0.026479f, -0.025011f, 0.010050f, -0.004968f, 0.026073f, 0.013796f, -0.003348f, 0.009735f, 0.003339f, -0.005405f, -0.001216f, -0.007546f, 0.007632f, 0.011959f, 0.001846f, -0.003141f, -0.010370f, 0.008861f, -0.002065f, -0.042465f, -0.117106f, 0.040564f, 0.215367f, 0.169339f, 0.162175f, 0.051849f, -0.150729f, -0.090426f, -0.133615f, -0.134055f, -0.122150f, -0.042640f, 0.065922f, 0.084939f, 0.133634f, 0.119675f, 0.072119f, 0.012118f, 0.011818f, -0.057891f, -0.091491f, -0.131015f, -0.050326f, -0.035555f, 0.011851f, -0.007368f, 0.066586f, 0.044940f, 0.019190f, 0.088936f, 0.050014f, 0.038081f, -0.007671f, 0.033420f, -0.060282f, -0.045490f, -0.037549f, -0.043936f, -0.057818f, -0.034867f, -0.023010f, -0.058878f, -0.040655f, 0.015677f, 0.086785f, 0.083716f, 0.095152f, 0.074692f, 0.108779f, 0.018842f, 0.027939f, -0.072208f, -0.053386f, -0.045830f, -0.108289f, -0.107905f, + -0.096750f, -0.045744f, -0.056653f, 0.013353f, 0.042137f, 0.060555f, 0.121726f, 0.119517f, 0.114464f, 0.102641f, 0.089893f, 0.019224f, -0.052674f, -0.085932f, -0.153465f, -0.131889f, -0.096115f, -0.131088f, -0.060752f, -0.027331f, 0.005888f, 0.128722f, 0.100960f, 0.148066f, 0.146322f, 0.106880f, 0.030007f, -0.029477f, -0.043619f, -0.050640f, -0.045111f, -0.087078f, -0.107684f, -0.075247f, -0.051350f, -0.045425f, 0.005823f, 0.030341f, 0.048279f, 0.041570f, 0.086800f, 0.094856f, 0.071737f, 0.057053f, 0.009623f, -0.019976f, -0.040789f, -0.066815f, -0.057375f, -0.040699f, -0.064092f, -0.086891f, -0.009088f, 0.005116f, -0.014206f, 0.075015f, 0.099003f, 0.063385f, 0.055703f, 0.004245f, 0.015828f, -0.010195f, -0.017300f, -0.043139f, -0.050710f, -0.033251f, -0.037873f, 0.005534f, -0.015043f, 0.005038f, 0.000875f, 0.034270f, 0.018492f, 0.017777f, 0.032048f, 0.032750f, 0.000204f, -0.008360f, -0.023002f, -0.022891f, -0.006421f, -0.004967f, -0.010993f, -0.010766f, 0.002418f, 0.003138f, -0.002499f, 0.006000f, 0.006444f, 0.006217f, 0.002059f, 0.021662f, 0.008178f, 0.000235f, 0.003860f, 0.000070f, + -0.006743f, -0.005685f, -0.005704f, -0.003118f, -0.001942f, 0.000467f, -0.000715f}, + {-0.006247f, -0.007775f, -0.011480f, 0.003879f, -0.005610f, -0.011332f, -0.007258f, 0.005155f, -0.014317f, -0.007933f, -0.017510f, 0.006085f, 0.007822f, 0.009960f, 0.005430f, -0.006128f, 0.013263f, -0.009081f, 0.002677f, 0.000278f, -0.001911f, -0.009596f, -0.004918f, -0.010554f, 0.000409f, -0.004486f, 0.005906f, 0.003913f, -0.005040f, -0.001609f, -0.001155f, -0.009687f, -0.000409f, -0.002153f, 0.004300f, -0.000172f, 0.008757f, -0.003118f, 0.011081f, -0.004800f, 0.000136f, 0.001785f, -0.008103f, 0.005629f, -0.002492f, -0.003108f, 0.000907f, -0.002190f, 0.004234f, -0.016968f, 0.007852f, 0.010222f, 0.001417f, 0.005811f, 0.003097f, -0.007509f, -0.001068f, -0.008149f, 0.011048f, -0.002933f, -0.007024f, 0.006715f, -0.010306f, 0.000458f, 0.003837f, -0.011575f, 0.001258f, -0.002697f, -0.004550f, 0.004015f, 0.000725f, 0.001092f, -0.005633f, -0.003467f, -0.018791f, -0.002231f, 0.003862f, -0.002922f, 0.000728f, 0.002403f, 0.009746f, 0.008580f, 0.000313f, 0.002926f, 0.001008f, -0.001454f, -0.001575f, -0.002339f, -0.001520f, -0.000630f, -0.002097f, -0.001541f, -0.000272f, 0.001992f, 0.001005f, 0.001406f, + -0.003082f, 0.000184f, -0.000298f, -0.000614f, -0.000404f, 0.000890f, -0.000618f, 0.000304f, -0.001595f, -0.000897f, -0.001447f, 0.000151f, -0.001372f, 0.001943f, -0.026588f, -0.015937f, 0.002921f, -0.008598f, 0.001613f, -0.008871f, -0.015286f, -0.010132f, 0.017288f, 0.010105f, -0.002714f, 0.011757f, 0.002731f, 0.002910f, 0.003261f, -0.005656f, -0.001577f, 0.009562f, -0.007707f, 0.004358f, 0.006926f, -0.007412f, -0.011798f, 0.005422f, -0.009649f, 0.001100f, 0.005485f, 0.014160f, -0.003213f, -0.006783f, -0.005989f, 0.002232f, 0.007659f, -0.010408f, -0.000113f, 0.008622f, 0.003357f, 0.000938f, -0.000594f, -0.000770f, 0.011132f, -0.000391f, 0.010196f, 0.006753f, -0.002620f, 0.006729f, -0.002381f, -0.000573f, -0.001069f, -0.018623f, 0.006434f, 0.010584f, -0.006129f, -0.003442f, 0.002547f, 0.002908f, 0.002971f, 0.001686f, -0.001039f, -0.002214f, 0.000607f, -0.004655f, 0.012752f, -0.005690f, 0.001462f, 0.006979f, 0.005522f, -0.004528f, 0.005021f, 0.001636f, 0.003263f, 0.007050f, 0.006162f, -0.009227f, 0.009574f, 0.010677f, -0.003630f, 0.000223f, -0.000693f, 0.006989f, -0.008523f, -0.004380f, + 0.001848f, 0.001261f, 0.000308f, 0.000505f, -0.001826f, -0.002811f, 0.001695f, -0.001304f, -0.000744f, 0.000544f, 0.002423f, -0.001757f, -0.000438f, 0.000106f, -0.003346f, 0.001190f, -0.001988f, -0.001996f, -0.001613f, 0.001302f, 0.000172f, -0.000904f, -0.002001f, 0.000530f, -0.010436f, 0.013369f, 0.008894f, 0.020731f, -0.003370f, 0.002151f, 0.006460f, -0.010201f, -0.002014f, 0.003949f, -0.004097f, -0.013826f, -0.000735f, 0.001398f, 0.009303f, -0.011185f, -0.027040f, -0.021982f, -0.013410f, 0.005131f, 0.012970f, -0.013066f, 0.007375f, -0.006453f, 0.010036f, 0.007653f, 0.006824f, 0.011853f, 0.006722f, -0.009457f, -0.008578f, 0.001527f, 0.006454f, -0.000590f, 0.000610f, 0.016611f, -0.000068f, 0.002808f, 0.008381f, 0.008678f, 0.001517f, 0.000144f, 0.020719f, -0.001555f, -0.007704f, -0.002445f, 0.004748f, 0.005914f, -0.003955f, 0.010992f, 0.002229f, 0.005846f, -0.007900f, -0.007163f, -0.002667f, -0.004778f, 0.002736f, -0.003817f, 0.012140f, -0.014087f, -0.012423f, 0.014969f, -0.001545f, -0.000762f, -0.017513f, 0.005322f, -0.008477f, 0.009335f, -0.007270f, -0.019575f, -0.000862f, 0.009860f, + -0.008294f, 0.012783f, -0.007750f, 0.005807f, 0.012100f, -0.003566f, 0.005074f, 0.012003f, -0.000776f, -0.009131f, 0.000770f, 0.005780f, 0.002768f, -0.004507f, 0.008386f, 0.000391f, 0.004426f, 0.001494f, 0.001211f, 0.002997f, 0.000581f, -0.001440f, -0.000085f, 0.000260f, 0.001281f, -0.003562f, -0.001721f, -0.001949f, 0.003212f, 0.000198f, 0.003271f, 0.003218f, -0.003182f, 0.000583f, 0.000818f, -0.002031f, -0.001375f, -0.000858f, 0.000598f, -0.001870f, 0.000655f, 0.032323f, 0.007708f, 0.008566f, 0.003785f, -0.007473f, 0.015625f, -0.007426f, -0.004326f, 0.019713f, -0.001412f, 0.015841f, -0.001603f, -0.018255f, 0.006510f, -0.006234f, 0.020144f, 0.010502f, -0.001324f, -0.018030f, -0.012490f, 0.016538f, 0.019762f, -0.023041f, 0.011591f, 0.009153f, 0.006999f, -0.001564f, 0.002307f, 0.001856f, -0.001670f, 0.022696f, -0.000960f, -0.003961f, -0.006201f, -0.007695f, -0.009667f, -0.003274f, -0.000445f, -0.013177f, -0.004597f, 0.003360f, -0.009065f, 0.000446f, 0.000598f, 0.013556f, -0.005036f, 0.000364f, 0.006407f, 0.000475f, 0.013090f, 0.005815f, 0.013607f, 0.006632f, 0.004193f, -0.014377f, + 0.001575f, -0.010669f, -0.009848f, 0.002312f, 0.013873f, -0.000600f, 0.011924f, -0.005030f, -0.008896f, -0.002142f, 0.000636f, 0.003430f, 0.008207f, -0.003822f, -0.000009f, -0.004512f, 0.004612f, 0.003055f, -0.011611f, 0.002214f, 0.002486f, 0.001493f, -0.003225f, 0.012158f, -0.001236f, -0.002444f, 0.001368f, 0.005676f, 0.002575f, -0.004068f, -0.001241f, -0.001681f, -0.002881f, 0.002344f, -0.003456f, 0.005708f, -0.003423f, -0.000739f, 0.000753f, -0.002778f, -0.000731f, 0.003151f, -0.003723f, -0.000914f, -0.004013f, 0.001527f, 0.001745f, 0.003219f, -0.004390f, 0.000832f, -0.001771f, 0.002196f, -0.001472f, -0.005358f, -0.001666f, 0.009143f, 0.006401f, 0.007355f, 0.020834f, 0.010908f, -0.009044f, -0.008078f, -0.022426f, -0.001448f, -0.000497f, -0.011959f, 0.004552f, 0.018008f, 0.002185f, -0.014168f, 0.013172f, 0.012525f, -0.001299f, 0.005016f, 0.012688f, 0.003020f, -0.011514f, -0.001762f, 0.026878f, 0.013235f, 0.002789f, -0.017707f, -0.006333f, 0.016190f, 0.005575f, -0.002394f, 0.009118f, 0.008162f, 0.008539f, -0.000046f, 0.016693f, -0.000127f, -0.002122f, 0.004228f, -0.008268f, -0.010830f, + -0.000530f, 0.001864f, 0.006220f, 0.003434f, -0.010124f, 0.010332f, 0.018105f, 0.009313f, -0.000474f, 0.013461f, -0.015267f, 0.008754f, -0.009085f, 0.009616f, -0.002528f, -0.010968f, -0.000533f, -0.014298f, -0.023437f, -0.008529f, -0.009295f, -0.001106f, -0.000069f, -0.012246f, 0.002414f, -0.003736f, 0.007160f, 0.004744f, 0.008475f, -0.001304f, 0.003433f, -0.011786f, 0.002088f, 0.001919f, 0.016524f, -0.006323f, -0.000479f, -0.005676f, 0.003524f, 0.014876f, 0.007664f, -0.008560f, -0.013726f, 0.004406f, -0.005462f, -0.001836f, 0.007216f, -0.000959f, 0.002459f, 0.001742f, -0.008149f, 0.000450f, -0.006204f, 0.001839f, -0.005889f, -0.003942f, -0.002108f, -0.000186f, -0.000741f, 0.001148f, -0.003746f, -0.000328f, -0.001219f, -0.002968f, -0.002498f, 0.000986f, -0.000600f, -0.001501f, 0.000477f, 0.001486f, 0.004633f, -0.001537f, 0.002743f, -0.001894f, -0.004516f, 0.003488f, -0.004946f, 0.004916f, -0.000373f, -0.003156f, -0.000465f, -0.021940f, -0.014547f, 0.031098f, -0.006822f, -0.006793f, 0.001804f, -0.001064f, 0.033295f, -0.009713f, -0.017994f, 0.000465f, -0.017751f, 0.004447f, 0.014124f, 0.015230f, + 0.004790f, -0.030895f, 0.025402f, -0.019982f, 0.010615f, -0.013652f, -0.010412f, -0.007631f, 0.012677f, 0.013673f, -0.020474f, 0.001646f, 0.008923f, -0.006324f, 0.004085f, 0.006032f, -0.007408f, 0.000972f, -0.016863f, -0.011299f, -0.026021f, 0.015428f, -0.003649f, 0.026246f, -0.012225f, 0.005716f, 0.017500f, -0.004350f, -0.005209f, -0.007727f, 0.020060f, 0.014676f, -0.024647f, 0.007054f, -0.013943f, -0.004655f, -0.005419f, -0.013815f, 0.008307f, 0.004432f, 0.021695f, 0.015296f, -0.027262f, -0.004445f, -0.011712f, 0.015947f, 0.005539f, 0.001392f, -0.015908f, 0.002404f, -0.001676f, 0.013405f, -0.002239f, 0.001697f, -0.018294f, -0.000397f, 0.012986f, -0.011958f, 0.002009f, -0.003760f, -0.003572f, -0.009661f, 0.001946f, -0.001255f, 0.023024f, 0.010172f, 0.010530f, -0.004198f, -0.002573f, -0.003984f, -0.006273f, -0.003349f, 0.005137f, -0.007031f, -0.002242f, -0.006897f, 0.005227f, 0.004403f, -0.003759f, -0.002102f, 0.004861f, -0.006495f, 0.003229f, 0.001003f, -0.001748f, -0.002056f, 0.001748f, -0.000170f, -0.000588f, -0.001238f, 0.004253f, -0.006269f, 0.000839f, 0.000574f, 0.003186f, 0.003448f, + 0.003449f, -0.003180f, 0.000950f, -0.002243f, 0.004607f, 0.001078f, 0.003378f, 0.007565f, -0.008340f, 0.000554f, -0.017599f, -0.002222f, -0.020311f, 0.003159f, -0.005084f, 0.011642f, -0.000817f, 0.009873f, -0.013915f, -0.026228f, 0.005563f, 0.017606f, 0.002304f, -0.002153f, 0.013751f, 0.009227f, -0.021431f, -0.000373f, -0.008081f, 0.027098f, -0.001209f, 0.003128f, 0.002128f, 0.000245f, -0.000853f, -0.009767f, 0.021495f, -0.001862f, -0.030482f, -0.005759f, 0.018464f, -0.011938f, 0.003074f, -0.000525f, 0.002462f, -0.003857f, 0.002934f, -0.005650f, 0.007276f, -0.011734f, 0.011000f, 0.015399f, -0.012118f, -0.003135f, -0.007178f, -0.021272f, 0.008485f, -0.015119f, 0.013102f, -0.013297f, -0.022915f, -0.006313f, 0.013597f, -0.004309f, -0.008196f, 0.009040f, 0.012571f, 0.007140f, 0.013778f, 0.023537f, 0.018991f, -0.001289f, 0.003682f, 0.003153f, -0.012681f, 0.002347f, -0.013260f, -0.014497f, 0.007853f, -0.011077f, 0.003560f, -0.000726f, 0.008278f, 0.008358f, -0.010972f, 0.012644f, -0.003505f, -0.005297f, -0.002371f, 0.008865f, -0.001670f, -0.008346f, -0.005659f, -0.011786f, 0.013348f, -0.006801f, + -0.001785f, 0.002215f, -0.000583f, -0.005049f, -0.004249f, 0.000804f, 0.001741f, 0.000488f, -0.002370f, 0.002989f, 0.002240f, -0.002733f, 0.000208f, 0.001883f, 0.001183f, -0.001710f, -0.000073f, -0.002261f, 0.000805f, -0.003715f, -0.003353f, 0.001924f, 0.000995f, 0.004334f, 0.004835f, 0.000297f, 0.003314f, -0.000079f, -0.030131f, -0.024908f, 0.014462f, 0.027025f, -0.000144f, -0.001388f, 0.004979f, -0.012698f, -0.006390f, -0.030802f, -0.016645f, -0.008580f, -0.000429f, -0.022345f, 0.032118f, 0.006620f, 0.017812f, -0.020350f, -0.024672f, -0.018241f, -0.007328f, 0.005125f, -0.027988f, -0.012252f, 0.012752f, -0.005305f, -0.034012f, -0.011267f, 0.004417f, 0.000581f, 0.020861f, 0.007289f, -0.006748f, -0.015834f, 0.019837f, -0.011371f, -0.001314f, 0.015291f, 0.004311f, -0.016170f, -0.008566f, -0.001041f, -0.027558f, 0.007138f, 0.021177f, -0.009044f, -0.011906f, 0.003348f, -0.014012f, -0.004884f, 0.002623f, -0.008602f, -0.006892f, 0.007470f, -0.010473f, -0.021623f, 0.010687f, -0.012224f, -0.016433f, -0.022160f, -0.011322f, 0.002485f, -0.009065f, 0.003979f, 0.027454f, 0.015827f, -0.003462f, 0.026537f, + 0.026586f, -0.011294f, 0.003615f, 0.007678f, -0.013922f, -0.008707f, -0.029376f, 0.003289f, -0.009467f, -0.023405f, -0.000321f, 0.012746f, 0.021958f, 0.013843f, 0.006396f, 0.002743f, -0.019974f, -0.002210f, -0.004607f, 0.005505f, -0.007591f, -0.000580f, 0.000409f, 0.000008f, 0.004740f, 0.001226f, -0.001853f, 0.004575f, -0.001816f, -0.005972f, 0.005009f, -0.003901f, -0.005668f, 0.001164f, 0.002035f, 0.002198f, 0.000417f, 0.006425f, -0.000649f, 0.004227f, 0.002269f, 0.000784f, 0.001215f, 0.000285f, -0.004769f, 0.001394f, -0.006547f, 0.001843f, -0.010447f, -0.002270f, -0.000466f, -0.006550f, -0.008182f, -0.000739f, -0.008086f, -0.001169f, -0.001721f, -0.018973f, 0.048496f, -0.001809f, 0.029698f, -0.014887f, -0.042641f, 0.012258f, 0.003586f, -0.001574f, -0.020030f, -0.001847f, -0.013218f, 0.033813f, 0.024613f, 0.022166f, 0.016056f, -0.026322f, -0.000229f, 0.003738f, 0.023393f, -0.040015f, -0.004625f, -0.009715f, -0.011797f, 0.006132f, -0.013290f, 0.005257f, 0.008864f, 0.006750f, 0.007069f, 0.009406f, -0.002863f, -0.003841f, -0.019584f, -0.004540f, -0.003053f, 0.019270f, -0.000075f, -0.017432f, + -0.004199f, 0.020960f, -0.002502f, 0.012241f, 0.015515f, -0.011191f, -0.006762f, -0.025734f, -0.015096f, 0.050693f, 0.013250f, 0.022622f, 0.012023f, 0.003044f, 0.001829f, -0.031943f, 0.018927f, 0.003118f, 0.005505f, 0.016479f, 0.017778f, 0.027906f, -0.032062f, -0.013097f, -0.017824f, -0.002129f, 0.004367f, -0.004111f, -0.009036f, -0.005136f, -0.026898f, -0.033605f, -0.021966f, -0.031488f, -0.004169f, -0.020541f, -0.035449f, -0.014843f, 0.011434f, 0.019495f, -0.007434f, -0.030148f, -0.001137f, -0.004458f, 0.007108f, -0.008209f, 0.001889f, 0.017506f, 0.000744f, -0.001168f, -0.001135f, 0.002323f, 0.003007f, -0.005032f, -0.004675f, -0.012054f, -0.013682f, 0.007368f, -0.003790f, 0.006604f, 0.005832f, -0.002114f, 0.003959f, 0.005463f, 0.009755f, 0.007053f, -0.004302f, 0.002254f, 0.012446f, 0.002504f, -0.012664f, -0.010344f, -0.005738f, -0.002542f, 0.000917f, -0.004349f, 0.007198f, 0.008066f, -0.001948f, 0.012124f, 0.001559f, -0.003272f, -0.002607f, 0.002880f, 0.065267f, 0.014766f, -0.009418f, -0.013555f, 0.002097f, -0.020958f, -0.040931f, 0.030116f, 0.000131f, 0.019377f, -0.014664f, 0.014013f, + 0.033501f, -0.003331f, 0.003733f, -0.008456f, 0.029155f, 0.024534f, 0.009518f, -0.039537f, 0.002848f, 0.005792f, 0.024408f, 0.035517f, -0.010509f, -0.007301f, -0.004719f, 0.009502f, 0.012670f, 0.010522f, -0.017998f, 0.008182f, -0.020745f, 0.015816f, 0.021133f, -0.010152f, -0.020987f, 0.013191f, -0.022836f, -0.020905f, -0.000912f, 0.006013f, 0.029671f, 0.003539f, -0.004113f, 0.025262f, -0.004740f, 0.022683f, 0.041966f, 0.021003f, 0.000429f, -0.026736f, -0.002591f, -0.015428f, -0.012511f, 0.026780f, 0.010430f, -0.027120f, -0.000377f, -0.020751f, -0.005307f, 0.035516f, 0.016302f, 0.005116f, 0.015168f, 0.021359f, 0.011041f, -0.028770f, 0.014715f, 0.023862f, 0.008131f, -0.019690f, 0.008006f, 0.002192f, 0.004022f, -0.015431f, 0.023582f, -0.006604f, -0.005776f, 0.028367f, 0.030073f, 0.004355f, 0.008491f, 0.032698f, 0.001833f, 0.016093f, -0.011599f, -0.000451f, 0.018790f, 0.010842f, -0.008470f, 0.009647f, 0.016945f, -0.004723f, 0.000030f, 0.021628f, 0.004380f, 0.009145f, -0.006545f, -0.010974f, -0.003411f, 0.005958f, 0.003043f, 0.004892f, 0.005020f, -0.003666f, -0.003517f, -0.002936f, + 0.001555f, 0.006403f, 0.007752f, -0.005400f, -0.001715f, 0.013431f, 0.001861f, 0.018045f, -0.003393f, 0.004830f, -0.002593f, 0.002210f, 0.008051f, 0.004878f, 0.000534f, -0.000243f, -0.007821f, -0.005516f, -0.004021f, -0.008343f, 0.010422f, 0.009512f, -0.015926f, -0.000738f, -0.020322f, -0.047591f, 0.016409f, -0.018911f, 0.005219f, 0.001768f, 0.033360f, -0.022933f, -0.020405f, -0.008464f, -0.009359f, -0.012211f, 0.024640f, -0.021774f, -0.030912f, 0.009332f, -0.057731f, 0.001797f, -0.010897f, -0.024296f, 0.031011f, -0.001875f, -0.001857f, 0.013177f, -0.012319f, 0.009937f, -0.003134f, -0.034334f, -0.037627f, -0.000247f, 0.007939f, 0.022183f, 0.010651f, -0.002374f, -0.003961f, -0.021530f, -0.010255f, 0.021905f, -0.034015f, 0.047103f, 0.027907f, 0.006429f, 0.034747f, -0.023019f, -0.009899f, -0.021057f, -0.021663f, -0.009218f, 0.015897f, 0.044509f, 0.000443f, -0.022735f, -0.003804f, 0.002338f, -0.002419f, -0.002192f, -0.014023f, 0.012141f, 0.011053f, 0.030080f, -0.000474f, 0.033990f, 0.017501f, 0.009483f, -0.000758f, 0.007409f, -0.050389f, 0.026824f, -0.006323f, -0.029336f, 0.021188f, 0.000183f, + 0.027864f, 0.012528f, -0.046660f, 0.036517f, 0.028469f, -0.024259f, 0.039542f, 0.015391f, 0.029584f, 0.011900f, -0.003942f, -0.001408f, -0.001076f, -0.005278f, -0.010135f, -0.002919f, 0.004536f, -0.010065f, -0.015491f, 0.000392f, -0.010029f, -0.018170f, -0.010791f, -0.013542f, 0.008971f, -0.008220f, 0.010992f, 0.003144f, 0.011223f, 0.005465f, -0.000950f, -0.005600f, 0.002163f, 0.001328f, -0.000546f, 0.001818f, -0.002946f, -0.007356f, 0.004006f, -0.000404f, 0.004835f, 0.005168f, 0.000554f, 0.004420f, 0.002290f, 0.007405f, 0.006486f, -0.010782f, -0.006250f, -0.018031f, -0.013659f, -0.088952f, -0.007257f, 0.053165f, -0.010120f, 0.001848f, 0.045818f, -0.010453f, 0.000149f, 0.005920f, 0.011934f, -0.013619f, 0.011906f, -0.004502f, -0.015818f, 0.015173f, 0.017162f, -0.051865f, 0.005763f, -0.046126f, -0.001658f, -0.023761f, -0.026618f, -0.005469f, -0.008282f, -0.025181f, 0.012356f, 0.004495f, 0.015690f, 0.022236f, -0.032050f, 0.040106f, 0.002348f, -0.036965f, 0.002658f, -0.025425f, -0.013398f, -0.027367f, -0.025595f, -0.010567f, 0.025989f, -0.022430f, 0.012168f, 0.027030f, -0.016429f, -0.028183f, + -0.026700f, -0.038216f, -0.041977f, -0.024088f, -0.012249f, 0.003567f, -0.006702f, 0.011785f, 0.007456f, -0.024308f, -0.002223f, 0.028059f, 0.015501f, -0.040619f, 0.015662f, -0.002771f, -0.011831f, -0.037606f, 0.025198f, -0.013269f, 0.034938f, 0.045076f, 0.000748f, 0.042893f, -0.023834f, 0.025029f, -0.018851f, 0.026891f, 0.033355f, 0.003291f, -0.044896f, -0.001009f, -0.061115f, 0.020021f, 0.012714f, 0.024473f, 0.011007f, -0.023406f, -0.021107f, -0.000005f, -0.014299f, 0.014116f, -0.015434f, -0.000114f, -0.001368f, -0.014515f, -0.012121f, 0.010665f, -0.006286f, -0.016462f, -0.002047f, 0.005690f, 0.012145f, 0.007191f, 0.026857f, -0.002385f, 0.001858f, -0.007671f, 0.018705f, -0.002245f, -0.004595f, 0.017273f, -0.001371f, 0.002996f, 0.003551f, 0.023137f, -0.004088f, -0.008714f, 0.001901f, 0.016149f, 0.014332f, -0.014368f, -0.001896f, 0.010859f, -0.017693f, 0.010175f, -0.003233f, 0.012895f, 0.000281f, -0.014111f, -0.042051f, 0.033908f, -0.080572f, -0.005206f, -0.007363f, -0.007178f, 0.007852f, -0.046897f, 0.003585f, -0.009593f, -0.003651f, 0.020769f, 0.008659f, 0.024231f, -0.018766f, 0.017009f, + -0.008810f, -0.041744f, -0.016351f, -0.030770f, -0.018568f, 0.019509f, -0.035787f, 0.004244f, -0.013097f, -0.027787f, -0.004621f, 0.026212f, -0.035598f, -0.034966f, 0.014353f, 0.020220f, -0.000929f, -0.016811f, 0.019552f, 0.019921f, 0.025223f, 0.021039f, 0.009140f, 0.028983f, 0.035159f, -0.019301f, 0.005434f, -0.017090f, 0.044045f, -0.004095f, -0.030169f, 0.036037f, 0.016219f, 0.008239f, -0.017216f, -0.023645f, 0.005548f, 0.013358f, 0.014153f, -0.001813f, -0.018959f, 0.013926f, -0.022108f, 0.000039f, -0.021823f, 0.067145f, 0.010570f, -0.020098f, 0.055751f, -0.007443f, 0.017119f, -0.015063f, 0.028036f, 0.040906f, -0.025738f, 0.039037f, 0.042200f, 0.054336f, 0.042304f, 0.003260f, 0.031424f, -0.025286f, -0.004813f, 0.005196f, -0.013597f, 0.023566f, 0.001114f, -0.002303f, -0.002412f, -0.007824f, 0.011839f, 0.005212f, 0.033332f, -0.011711f, 0.012304f, -0.008129f, 0.000188f, 0.005473f, 0.009799f, -0.014875f, 0.005141f, 0.013116f, -0.006112f, -0.016625f, -0.003122f, -0.026170f, 0.008685f, 0.006996f, 0.006782f, -0.007573f, 0.004102f, 0.012361f, 0.007396f, -0.004147f, 0.012646f, 0.004774f, + -0.008421f, -0.005204f, -0.002786f, 0.019852f, 0.026985f, 0.013425f, 0.006126f, 0.003851f, 0.009132f, 0.015066f, -0.010933f, -0.005405f, 0.007123f, -0.002785f, 0.001315f, 0.006327f, 0.083275f, 0.021943f, -0.014362f, -0.011992f, 0.019234f, 0.005773f, 0.008114f, -0.001760f, -0.033488f, 0.028269f, -0.076265f, 0.008626f, 0.016572f, -0.003065f, -0.014061f, -0.028876f, -0.013555f, 0.003806f, 0.022421f, 0.034843f, -0.020585f, -0.043991f, -0.035977f, -0.004770f, 0.001162f, -0.025802f, 0.053559f, -0.024741f, -0.016574f, 0.022497f, -0.007713f, 0.004307f, -0.004981f, 0.046413f, 0.007530f, -0.045905f, 0.018145f, 0.006172f, 0.031819f, -0.011108f, 0.003296f, -0.018805f, 0.015721f, 0.007352f, 0.040155f, -0.009519f, 0.018027f, 0.019436f, -0.024547f, -0.026569f, 0.001741f, 0.024788f, -0.047642f, -0.055841f, -0.016698f, -0.022758f, -0.003208f, -0.007845f, 0.005409f, 0.013030f, -0.011560f, 0.002221f, -0.065008f, -0.054774f, 0.043617f, 0.046813f, -0.056333f, -0.042869f, -0.054225f, -0.028003f, -0.022558f, 0.028295f, -0.029686f, -0.051834f, 0.001349f, 0.002524f, -0.032064f, -0.006520f, 0.045208f, -0.006580f, + 0.002342f, 0.014857f, -0.000646f, 0.002851f, -0.002182f, -0.015822f, -0.020115f, -0.000833f, -0.005838f, 0.013295f, -0.002282f, -0.001031f, -0.014611f, 0.007455f, -0.022505f, -0.000317f, 0.006647f, 0.007611f, 0.010561f, 0.012353f, 0.002083f, 0.007073f, -0.005143f, 0.001327f, -0.011542f, 0.004302f, 0.000972f, -0.012680f, 0.012990f, 0.013303f, -0.020828f, 0.001412f, 0.014908f, 0.012579f, 0.023135f, -0.004720f, -0.027261f, 0.007631f, 0.008680f, -0.013282f, 0.008429f, -0.014812f, -0.007181f, -0.002253f, -0.004883f, -0.012603f, 0.004422f, -0.046453f, -0.005653f, -0.011253f, 0.013988f, -0.022013f, -0.005972f, -0.072230f, 0.063962f, 0.041076f, -0.006924f, 0.087677f, -0.008594f, -0.048114f, -0.004414f, 0.019666f, -0.029710f, -0.039248f, -0.008225f, -0.026800f, -0.001240f, 0.007432f, -0.040280f, 0.059117f, 0.001993f, 0.006332f, -0.037160f, -0.010751f, 0.004029f, -0.010663f, 0.009506f, 0.013433f, 0.048638f, 0.008670f, -0.002466f, 0.039248f, 0.032436f, -0.011531f, 0.019137f, -0.024863f, 0.007018f, 0.021932f, 0.021386f, 0.054921f, -0.054333f, 0.033353f, 0.100826f, 0.000681f, 0.016566f, 0.034438f, + 0.003957f, 0.006802f, 0.016301f, 0.012494f, -0.033678f, -0.040216f, -0.014588f, 0.032227f, 0.009638f, -0.041794f, -0.022595f, -0.001899f, -0.020035f, 0.037030f, 0.003415f, 0.028579f, -0.063640f, -0.039509f, 0.018566f, 0.043573f, 0.026746f, 0.017502f, 0.060526f, 0.035263f, -0.025415f, 0.041597f, -0.031411f, -0.006495f, -0.004515f, 0.023336f, -0.004938f, -0.026123f, 0.022596f, 0.009723f, 0.002161f, -0.029952f, 0.020666f, -0.000581f, 0.000401f, -0.013447f, 0.017416f, -0.014349f, -0.011473f, -0.011041f, 0.008300f, -0.011521f, -0.021859f, 0.007178f, 0.001533f, -0.000315f, -0.011899f, -0.002482f, -0.014901f, -0.012931f, -0.011919f, -0.007697f, -0.004602f, -0.005787f, -0.004539f, 0.001914f, 0.000422f, -0.028425f, 0.018960f, 0.007265f, -0.008927f, -0.021097f, -0.029758f, -0.000943f, -0.016213f, -0.011148f, 0.010742f, -0.008077f, 0.018428f, 0.008955f, -0.006506f, 0.002974f, 0.017234f, -0.007999f, -0.002878f, -0.008535f, 0.014521f, 0.003174f, 0.006027f, -0.014970f, 0.029312f, -0.083496f, 0.001256f, -0.000054f, -0.003227f, -0.010156f, 0.038701f, 0.003599f, -0.023119f, -0.041634f, 0.042103f, -0.037393f, + 0.000441f, 0.027834f, 0.021481f, -0.029315f, -0.008518f, -0.047493f, -0.000759f, 0.014144f, 0.016176f, 0.019816f, 0.004555f, -0.030804f, -0.039459f, 0.032394f, 0.015967f, 0.016323f, 0.005714f, 0.016594f, 0.004304f, 0.023940f, -0.042523f, -0.070656f, 0.019132f, -0.010368f, -0.015691f, 0.039970f, -0.007515f, -0.020777f, 0.034455f, 0.033377f, 0.026861f, -0.002200f, -0.018446f, -0.030227f, -0.008483f, -0.040090f, 0.094396f, -0.007785f, 0.033608f, 0.007653f, -0.032148f, 0.026207f, -0.012675f, -0.029938f, 0.029061f, 0.023854f, -0.052872f, 0.036733f, -0.006196f, 0.050836f, -0.051761f, -0.038301f, 0.050930f, -0.001826f, -0.042393f, 0.042929f, -0.016298f, 0.073123f, -0.031581f, -0.024753f, -0.044643f, 0.028207f, 0.004500f, -0.035510f, 0.013600f, -0.046238f, -0.034637f, 0.003337f, 0.029480f, -0.026406f, -0.017019f, -0.052563f, -0.048587f, 0.056483f, -0.007191f, 0.024775f, 0.038723f, 0.053607f, -0.000459f, -0.005111f, -0.004860f, 0.014372f, 0.020682f, 0.004288f, 0.009089f, 0.033128f, 0.013646f, 0.018392f, 0.009988f, 0.008537f, -0.007186f, -0.002742f, 0.019439f, 0.015697f, 0.025707f, -0.012224f, + 0.016673f, 0.018740f, -0.029695f, 0.007690f, 0.006474f, -0.015433f, -0.008863f, 0.000277f, 0.006461f, -0.012478f, 0.020002f, 0.001472f, -0.005649f, -0.005619f, 0.016830f, 0.000995f, 0.004656f, 0.001940f, 0.004088f, 0.004337f, -0.017064f, -0.007723f, 0.011474f, -0.010244f, -0.024101f, 0.062353f, -0.014261f, 0.042248f, -0.066026f, -0.011536f, -0.001573f, -0.078673f, -0.017351f, 0.011466f, 0.038648f, -0.019309f, -0.018498f, 0.001788f, -0.006102f, 0.055349f, -0.005285f, -0.027708f, 0.058600f, -0.007186f, -0.003033f, 0.011153f, -0.023417f, 0.050758f, 0.003356f, -0.010234f, 0.024285f, 0.020904f, -0.027624f, -0.009360f, -0.012798f, 0.039571f, -0.078808f, -0.001219f, -0.015244f, -0.027692f, 0.013557f, -0.028152f, 0.045971f, -0.011888f, -0.056747f, -0.005738f, 0.086408f, -0.052198f, 0.037917f, -0.058207f, -0.016709f, 0.058315f, 0.042589f, -0.031162f, 0.014865f, -0.038040f, -0.050137f, 0.010914f, -0.021970f, 0.022133f, 0.006475f, -0.003286f, 0.008706f, -0.073386f, -0.028627f, -0.037289f, -0.053642f, 0.025252f, -0.020248f, -0.014728f, -0.029647f, -0.052045f, -0.043783f, 0.034733f, -0.006669f, 0.107763f, + 0.019074f, 0.010210f, 0.038622f, 0.067890f, 0.009095f, -0.048470f, 0.059570f, 0.045187f, -0.037658f, 0.010348f, -0.009333f, -0.037466f, -0.029485f, -0.025209f, -0.002631f, -0.022979f, 0.009069f, 0.016160f, 0.005837f, -0.017819f, 0.031895f, 0.005266f, 0.014912f, -0.003972f, -0.005181f, 0.015317f, 0.009503f, -0.014769f, -0.013259f, -0.012710f, 0.014855f, 0.007281f, 0.017886f, 0.018946f, 0.001100f, -0.009569f, 0.014486f, -0.007641f, 0.030637f, 0.014730f, -0.035896f, -0.006762f, -0.026358f, 0.003659f, -0.008342f, -0.012521f, 0.038300f, -0.001598f, -0.011341f, 0.010133f, 0.012335f, -0.013348f, -0.002332f, -0.018521f, 0.008901f, 0.014170f, -0.002168f, -0.005527f, 0.018093f, 0.041343f, -0.024290f, -0.032082f, 0.035970f, -0.056875f, -0.006165f, -0.012055f, 0.003786f, 0.039341f, -0.025568f, 0.043707f, 0.019368f, 0.009616f, 0.013644f, -0.072436f, 0.049392f, 0.008727f, -0.050192f, 0.019422f, -0.053268f, 0.008762f, 0.072559f, -0.009348f, -0.042219f, -0.045822f, 0.019850f, 0.032353f, 0.026905f, 0.013703f, -0.047098f, -0.032963f, -0.014277f, -0.009220f, 0.062043f, -0.039373f, -0.022944f, 0.091331f, + -0.050513f, -0.004296f, 0.036797f, -0.000186f, 0.038738f, -0.005945f, -0.030443f, -0.021048f, -0.055687f, 0.028321f, 0.040354f, -0.060217f, 0.089970f, 0.029481f, -0.067090f, -0.061914f, -0.058299f, -0.070699f, -0.056498f, 0.002624f, 0.028538f, 0.005222f, -0.047013f, -0.018249f, 0.032073f, -0.001143f, -0.029306f, 0.032413f, -0.063437f, 0.003785f, -0.014300f, -0.059290f, -0.054690f, 0.009273f, -0.021531f, 0.041392f, -0.075996f, -0.010538f, -0.026680f, -0.056187f, 0.004191f, 0.089792f, 0.023456f, -0.040102f, 0.019711f, -0.049312f, 0.020260f, -0.020178f, 0.002078f, 0.002450f, 0.025834f, -0.002973f, 0.009052f, 0.031851f, 0.000662f, -0.018010f, -0.007864f, 0.025496f, 0.018526f, 0.011624f, 0.006600f, -0.050757f, -0.004844f, 0.003608f, 0.028600f, 0.013942f, -0.025910f, -0.000701f, 0.003278f, 0.043947f, 0.002734f, 0.013982f, -0.013388f, -0.008889f, 0.006766f, 0.014221f, -0.001568f, -0.013215f, -0.024544f, 0.003461f, -0.009163f, -0.017306f, 0.008661f, -0.012120f, -0.012035f, 0.016934f, -0.013532f, -0.019927f, -0.027164f, -0.024334f, -0.004299f, 0.006981f, 0.000255f, -0.021169f, 0.043746f, -0.109513f, + -0.101285f, -0.087786f, -0.056741f, 0.022960f, -0.023980f, 0.112927f, 0.029811f, -0.012034f, -0.025908f, -0.014244f, 0.031946f, -0.073419f, 0.085967f, 0.113791f, 0.045199f, -0.006833f, 0.089909f, -0.028497f, 0.054362f, 0.103432f, -0.018903f, 0.005757f, 0.019335f, 0.137643f, -0.034925f, -0.008618f, 0.081732f, 0.031093f, 0.026253f, -0.022472f, -0.083891f, 0.005869f, -0.066496f, 0.031802f, -0.082388f, -0.096348f, -0.001189f, -0.005426f, -0.067366f, -0.003468f, -0.032782f, -0.068915f, -0.055196f, -0.089948f, -0.004324f, 0.092032f, -0.029363f, -0.017494f, -0.084786f, -0.045300f, -0.031249f, -0.028962f, 0.028648f, -0.020647f, 0.153006f, -0.036093f, -0.002156f, -0.055742f, 0.115468f, 0.095049f, -0.067152f, 0.077334f, -0.027036f, -0.112037f, -0.020094f, -0.010614f, 0.023579f, -0.025903f, -0.025508f, -0.013911f, -0.045534f, 0.013372f, 0.056271f, -0.066332f, -0.009493f, 0.019496f, 0.011645f, -0.077044f, 0.050267f, 0.035772f, 0.116041f, -0.049138f, 0.031843f, 0.049372f, -0.002901f, 0.013928f, -0.001486f, 0.017446f, -0.012848f, 0.038236f, 0.015991f, 0.031155f, 0.026076f, 0.003050f, 0.026864f, 0.009314f, + -0.009938f, 0.029238f, -0.001590f, 0.005837f, 0.003198f, 0.020841f, 0.014671f, -0.019585f, -0.016132f, -0.025134f, 0.040460f, -0.025935f, 0.006186f, 0.026102f, 0.010624f, 0.046263f, 0.038717f, 0.068308f, 0.045955f, 0.039532f, 0.002893f, 0.026643f, -0.034777f, 0.033969f, 0.024403f, -0.006079f, -0.033366f, -0.061657f, -0.024393f, 0.020421f, -0.034965f, -0.011230f, -0.025234f, -0.060131f, -0.053451f, -0.023358f, -0.039613f, -0.021702f, -0.033978f, -0.041695f, -0.045977f, -0.012111f, -0.012714f, -0.018357f, -0.033488f, -0.033767f, 0.045531f, 0.195491f, 0.021919f, -0.121142f, -0.031034f, -0.042244f, 0.008650f, 0.061680f, 0.108528f, 0.032157f, -0.092328f, -0.000793f, 0.062816f, 0.014770f, 0.000785f, -0.001847f, 0.015986f, -0.007743f, -0.011686f, 0.076451f, 0.046744f, 0.043180f, -0.064610f, -0.040531f, 0.043167f, 0.017966f, 0.025321f, -0.021142f, 0.007616f, 0.085148f, 0.001586f, 0.072384f, 0.037078f, 0.040019f, 0.069294f, 0.011253f, -0.037289f, 0.009733f, -0.042631f, 0.011811f, 0.029215f, 0.008698f, 0.113631f, -0.036802f, -0.073638f, -0.069547f, 0.087757f, 0.041800f, 0.046674f, 0.033265f, + -0.050541f, -0.062001f, -0.038666f, -0.000917f, 0.019059f, -0.012567f, 0.030975f, 0.059561f, -0.004062f, 0.043547f, 0.038378f, -0.057765f, -0.011697f, 0.018105f, -0.027655f, -0.023696f, -0.029006f, -0.096099f, -0.016400f, 0.043422f, 0.003804f, 0.086314f, 0.056798f, -0.039948f, 0.030226f, 0.001760f, -0.028103f, -0.022586f, -0.046906f, -0.103940f, -0.055909f, 0.005593f, 0.002171f, -0.022002f, -0.005987f, -0.009650f, 0.034020f, 0.036450f, 0.018584f, -0.005091f, 0.002979f, 0.027944f, -0.012786f, 0.018016f, -0.046963f, -0.021252f, -0.005723f, 0.026689f, -0.006040f, 0.011293f, 0.017207f, 0.017651f, 0.002782f, 0.046694f, -0.035833f, -0.031713f, -0.032457f, 0.024904f, -0.020767f, -0.033198f, -0.033130f, 0.025173f, -0.010431f, -0.023901f, -0.012187f, 0.019175f, 0.005494f, 0.027529f, -0.043369f, -0.028077f, -0.004157f, -0.001845f, 0.009862f, 0.021569f, -0.008627f, -0.016590f, 0.030971f, -0.014644f, -0.017357f, -0.015515f, 0.030142f, -0.006846f, -0.013822f, 0.009282f, -0.000291f, -0.015034f, 0.001883f, -0.020388f, -0.011481f, -0.008946f, 0.000589f, -0.006286f, 0.006835f, -0.005203f, 0.004701f, -0.002040f, + 0.006303f, -0.011216f, 0.004818f, -0.004902f, 0.005683f, -0.007795f, 0.007347f, -0.012406f, -0.010955f, -0.047332f, 0.005291f, 0.153387f, 0.039434f, 0.064440f, -0.032092f, -0.140043f, -0.071056f, -0.103143f, -0.034798f, 0.069121f, 0.158813f, 0.070747f, 0.017601f, -0.075695f, -0.071254f, 0.049920f, 0.078974f, 0.039037f, 0.095924f, -0.004241f, -0.062853f, -0.092067f, -0.044788f, -0.014368f, 0.071255f, 0.008552f, 0.041170f, 0.036534f, 0.006169f, 0.095076f, 0.066776f, -0.007555f, -0.009160f, -0.088042f, -0.021427f, -0.002085f, 0.001783f, 0.050100f, 0.089854f, 0.054791f, 0.043130f, 0.084168f, 0.048717f, -0.087807f, -0.070434f, -0.022214f, -0.055209f, 0.058314f, 0.039750f, 0.086385f, 0.067459f, 0.076388f, 0.022657f, 0.013346f, -0.062919f, -0.066019f, -0.061786f, 0.021601f, 0.031472f, -0.000357f, -0.008385f, 0.136387f, 0.034589f, -0.009580f, -0.012896f, 0.093336f, -0.099653f, 0.020801f, -0.189751f, -0.042607f, 0.047498f, -0.066552f, 0.061974f, 0.034898f, 0.000984f, 0.136227f, 0.064717f, -0.077598f, -0.153998f, -0.074273f, -0.069743f, -0.038075f, -0.025900f, -0.020082f, 0.067369f, 0.042595f, + 0.090871f, 0.010751f, -0.066848f, -0.046252f, -0.070147f, -0.065494f, -0.064902f, 0.028514f, 0.006114f, 0.028199f, 0.038751f, -0.018446f, 0.035841f, 0.018783f, -0.024983f, -0.003106f, -0.027680f, -0.009097f, -0.059845f, -0.063533f, -0.023710f, -0.027698f, 0.001094f, -0.059530f, 0.031626f, -0.004423f, 0.011000f, 0.016498f, -0.039657f, -0.082301f, -0.074366f, -0.004129f, 0.016303f, 0.016886f, 0.048880f, 0.012041f, -0.024564f, -0.046378f, 0.015357f, 0.010853f, -0.221464f, -0.135362f, -0.073799f, 0.065249f, 0.018635f, 0.302160f, 0.322438f, 0.195941f, 0.357554f, 0.292176f, 0.309272f, 0.214192f, 0.261679f, 0.212247f, 0.003973f, -0.101243f, -0.144247f, -0.138752f, -0.289806f, -0.347936f, -0.363389f, -0.253819f, -0.199475f, -0.078574f, 0.013961f, -0.102791f, 0.062881f, -0.129544f, -0.046743f, -0.008915f, -0.039962f, 0.030660f, -0.118750f, 0.163366f, 0.028018f, 0.148928f, 0.095826f, 0.055668f, 0.039042f, 0.082395f, 0.053845f, 0.084505f, 0.194651f, 0.184826f, 0.147565f, 0.180627f, 0.228739f, 0.208032f, 0.196383f, 0.359893f, 0.126478f, 0.253222f, 0.330242f, 0.226757f, 0.300011f, 0.159132f, + 0.213861f, 0.166959f, 0.200781f, 0.216949f, 0.080649f, 0.140468f, 0.106843f, 0.131472f, 0.127540f, 0.034749f, -0.024549f, -0.137902f, -0.050675f, -0.183984f, -0.160379f, -0.272138f, -0.307624f, -0.310274f, -0.654123f, -0.554366f, -0.594635f, -0.590573f, -0.688473f, -0.697039f, -0.429313f, -0.500271f, -0.371825f, -0.441407f, -0.334903f, -0.317865f, -0.276017f, -0.277721f, -0.158936f, -0.070631f, -0.100867f, -0.102823f, -0.083217f, 0.015846f, 0.133243f, 0.069204f, 0.277028f, 0.237800f, 0.350046f, 0.358916f, 0.332018f, 0.413617f, 0.384094f, 0.443906f, 0.347828f, 0.424700f, 0.450868f, 0.503070f, 0.440841f, 0.262764f, 0.263668f, 0.262443f, 0.267445f, 0.245874f, 0.173714f, 0.161771f, 0.068027f, 0.047439f, -0.005033f, 0.007709f, 0.033532f, -0.091221f, -0.133711f, -0.145631f, -0.089117f, -0.079577f, -0.149017f, -0.174044f, -0.202422f, -0.147373f, -0.187389f, -0.173816f, -0.146069f, -0.157385f, -0.160046f, -0.160443f, -0.041448f, -0.037802f, -0.019486f, -0.036063f, 0.021088f, -0.004977f, -0.003713f, -0.033861f, -0.011852f, 0.011944f, 0.021730f, 0.007507f, 0.030084f, 0.020716f, 0.036278f, 0.001196f, + 0.006179f, -0.004607f, 0.015418f, -0.004623f, 0.007741f, -0.006052f, 0.007177f} + }, + { + {0.010258f, 0.000177f, -0.003781f, -0.000892f, -0.009139f, -0.006321f, 0.004095f, 0.000335f, -0.005747f, 0.007150f, 0.004833f, -0.001585f, 0.000457f, -0.001003f, 0.005798f, -0.008047f, 0.003030f, 0.005977f, 0.005321f, -0.011568f, -0.008066f, -0.005763f, 0.007771f, 0.001846f, 0.002551f, -0.003245f, 0.008287f, 0.003074f, -0.002032f, 0.000187f, -0.002336f, 0.001590f, 0.003116f, -0.001869f, -0.002359f, -0.006980f, 0.007412f, 0.012281f, 0.001474f, 0.007788f, -0.001434f, 0.001541f, 0.002825f, 0.003367f, -0.009326f, 0.000623f, -0.009744f, -0.002276f, -0.001370f, 0.003035f, -0.004910f, -0.000199f, 0.002148f, 0.000944f, -0.005680f, 0.000185f, 0.000654f, 0.004617f, -0.006041f, -0.007630f, -0.001016f, 0.010258f, 0.016527f, -0.000008f, 0.002710f, 0.001106f, -0.003539f, -0.009971f, -0.002527f, 0.006883f, -0.003170f, 0.006856f, 0.002672f, 0.006982f, -0.000384f, 0.002689f, 0.002484f, -0.005972f, -0.008023f, -0.000887f, 0.003024f, 0.004562f, 0.002227f, 0.002016f, 0.001371f, 0.001506f, -0.002757f, -0.004423f, -0.002993f, -0.002428f, -0.001155f, 0.000039f, -0.001660f, -0.000270f, 0.001456f, 0.002322f, + 0.002078f, -0.000376f, 0.000134f, 0.001358f, -0.000047f, -0.001781f, 0.004698f, -0.010364f, -0.002352f, -0.009830f, 0.005683f, 0.000636f, -0.004531f, 0.020952f, -0.008190f, -0.015016f, 0.001143f, 0.006952f, -0.001270f, -0.011301f, -0.003221f, -0.004913f, -0.001853f, -0.005361f, -0.001766f, 0.007769f, -0.000549f, -0.005074f, 0.008912f, 0.001307f, 0.008657f, -0.002308f, -0.002133f, 0.003328f, 0.000219f, 0.003877f, -0.001630f, 0.008170f, 0.013350f, -0.003685f, -0.008989f, -0.006585f, 0.005502f, -0.000021f, -0.020577f, -0.001959f, -0.008205f, -0.003057f, 0.010062f, -0.007035f, -0.005350f, 0.006940f, -0.004549f, -0.000998f, 0.009227f, 0.003181f, -0.007291f, 0.003258f, -0.005254f, -0.012155f, 0.003877f, 0.004762f, -0.009233f, -0.005344f, -0.002674f, -0.003883f, -0.000092f, 0.003950f, 0.006294f, 0.009535f, 0.010662f, -0.002552f, 0.001087f, -0.004216f, 0.004596f, 0.002925f, -0.002375f, 0.004461f, 0.006848f, -0.006551f, -0.003343f, 0.001100f, 0.000128f, 0.002634f, 0.007868f, -0.000999f, -0.002112f, 0.007131f, 0.001044f, -0.004955f, -0.003102f, -0.000381f, -0.003042f, 0.002179f, -0.001265f, -0.002742f, + 0.001117f, -0.003110f, -0.002450f, 0.001537f, -0.003124f, -0.002117f, 0.000087f, 0.002065f, -0.003865f, 0.000440f, -0.000942f, -0.001351f, -0.001865f, -0.000179f, -0.003016f, -0.000862f, -0.002888f, -0.016868f, -0.008567f, 0.005182f, 0.007473f, 0.002911f, 0.008107f, -0.006937f, 0.008485f, 0.010408f, -0.002925f, 0.011518f, -0.001572f, 0.008483f, -0.004034f, 0.000256f, -0.003618f, 0.010849f, 0.004237f, -0.000446f, 0.009698f, -0.005170f, -0.004101f, 0.007091f, -0.016845f, -0.002940f, 0.000923f, -0.003593f, -0.015012f, -0.009179f, 0.006231f, -0.005891f, -0.003913f, 0.000207f, 0.011749f, -0.002831f, -0.008220f, -0.000658f, 0.003025f, 0.006633f, -0.001008f, -0.010662f, -0.006865f, -0.001970f, -0.005456f, 0.001760f, -0.009271f, 0.004593f, -0.008723f, -0.012835f, 0.000412f, 0.004485f, 0.005217f, -0.004115f, -0.002945f, -0.008429f, 0.010889f, 0.006283f, 0.001521f, 0.000098f, -0.000302f, -0.003710f, -0.001980f, 0.003669f, 0.004651f, 0.016415f, -0.001849f, 0.004122f, 0.001081f, -0.000507f, -0.008042f, -0.006127f, 0.011138f, -0.004803f, 0.001097f, 0.002750f, 0.001614f, -0.001764f, 0.008419f, 0.000431f, + 0.000309f, -0.009150f, 0.008829f, 0.004936f, -0.003411f, -0.002048f, -0.000989f, -0.002670f, 0.001221f, 0.006349f, -0.000087f, 0.002511f, 0.001928f, -0.000912f, 0.001477f, 0.003271f, -0.000343f, -0.000015f, 0.001012f, 0.001513f, 0.001318f, 0.001860f, 0.003403f, 0.001254f, -0.002498f, 0.002597f, 0.001213f, -0.001859f, -0.001441f, -0.000319f, 0.000389f, 0.004085f, 0.005028f, 0.004490f, 0.010742f, -0.007126f, -0.010634f, -0.008593f, 0.005385f, 0.011870f, -0.002219f, 0.009090f, -0.008104f, -0.009857f, 0.008130f, -0.004110f, 0.000829f, 0.003025f, 0.010192f, 0.003775f, 0.016191f, -0.007073f, -0.008652f, 0.003771f, -0.004799f, -0.004528f, 0.009172f, -0.014342f, -0.008849f, 0.001425f, -0.002782f, 0.006517f, -0.004876f, 0.001787f, 0.011512f, -0.010739f, 0.008002f, -0.006484f, 0.005181f, -0.006075f, -0.001734f, -0.000988f, 0.011932f, 0.002239f, 0.000417f, -0.008748f, 0.000423f, -0.010407f, 0.003895f, 0.002562f, -0.006956f, -0.000172f, -0.002883f, 0.018011f, 0.002420f, 0.001150f, -0.015639f, -0.009170f, -0.013190f, 0.010296f, -0.006722f, -0.000744f, 0.005426f, 0.022981f, 0.016223f, -0.006488f, + -0.014142f, -0.005889f, -0.012278f, 0.012984f, -0.002492f, -0.003587f, -0.005682f, -0.003769f, -0.001065f, -0.005929f, -0.003931f, -0.000980f, -0.004812f, 0.003468f, -0.003366f, 0.004861f, -0.017873f, 0.001234f, -0.001474f, -0.005631f, -0.002648f, -0.005979f, -0.001201f, -0.009359f, 0.000768f, -0.003863f, -0.000313f, 0.005726f, -0.001801f, -0.001975f, -0.004006f, -0.004422f, -0.001249f, 0.001315f, -0.000249f, -0.000339f, -0.001594f, -0.000642f, -0.001886f, -0.000255f, 0.000460f, 0.001164f, -0.001335f, -0.001523f, -0.002125f, -0.001877f, -0.001626f, -0.002852f, -0.009066f, 0.006515f, -0.009381f, -0.016659f, 0.016995f, 0.007713f, -0.017859f, 0.017860f, -0.002878f, -0.001022f, -0.025090f, 0.014952f, 0.009940f, -0.020258f, 0.006021f, -0.003322f, 0.007671f, 0.001803f, 0.008842f, 0.005707f, 0.002247f, -0.009405f, 0.000868f, 0.003504f, -0.012484f, -0.005283f, -0.014729f, -0.002490f, -0.009161f, -0.004862f, 0.001660f, -0.011488f, -0.004258f, -0.016945f, 0.006411f, 0.001728f, 0.001454f, 0.001535f, -0.007316f, -0.014744f, -0.004628f, 0.005246f, -0.002406f, -0.001235f, 0.015475f, -0.022921f, 0.009643f, 0.011780f, + -0.001710f, 0.000786f, -0.004477f, -0.001768f, -0.007453f, -0.011298f, -0.007746f, -0.008891f, -0.005988f, 0.005751f, 0.003145f, 0.005126f, 0.007743f, -0.001797f, -0.004139f, 0.011110f, 0.021117f, 0.014953f, -0.000325f, -0.017931f, 0.004935f, -0.002707f, 0.002638f, 0.019103f, -0.000131f, 0.019243f, 0.017119f, -0.002298f, -0.005750f, -0.004552f, 0.001334f, 0.001707f, 0.006376f, 0.019512f, 0.005181f, 0.000827f, -0.002010f, -0.012011f, 0.001424f, 0.003775f, -0.004096f, -0.000541f, 0.000605f, -0.000104f, 0.002231f, 0.001748f, 0.001364f, -0.001461f, 0.002344f, 0.002214f, 0.002094f, 0.002452f, -0.006547f, -0.000993f, -0.004707f, 0.001922f, -0.003680f, 0.001599f, -0.001059f, -0.001631f, -0.003938f, 0.000798f, 0.000968f, -0.005669f, -0.001836f, 0.001395f, 0.027068f, 0.006924f, -0.004808f, -0.001310f, 0.008328f, -0.002843f, 0.026221f, -0.002783f, -0.004027f, 0.033226f, 0.000209f, 0.016801f, -0.006245f, 0.000463f, -0.001448f, 0.002736f, -0.004249f, 0.002308f, -0.000519f, -0.000949f, -0.018027f, -0.001724f, -0.004295f, -0.003226f, -0.007512f, 0.011540f, 0.005398f, 0.006867f, -0.010112f, -0.001121f, + -0.015981f, -0.006398f, 0.003003f, -0.001301f, -0.009715f, -0.002994f, 0.005342f, 0.012057f, 0.007298f, -0.003824f, -0.014858f, -0.000522f, 0.004231f, -0.002497f, 0.007873f, 0.005230f, 0.010673f, 0.014711f, -0.004784f, -0.000098f, -0.015867f, -0.019291f, 0.018206f, 0.009773f, -0.000658f, -0.000812f, -0.000603f, -0.007038f, -0.007714f, -0.000154f, 0.014574f, 0.008420f, 0.002646f, 0.017780f, -0.013631f, 0.003994f, -0.011180f, -0.008630f, 0.007651f, 0.007856f, 0.006473f, 0.026782f, -0.000966f, -0.012108f, 0.002104f, -0.011870f, 0.005376f, 0.003120f, 0.009784f, -0.005288f, 0.000156f, 0.001202f, -0.008997f, -0.001613f, 0.006297f, -0.000947f, 0.001633f, -0.003915f, -0.001992f, -0.000594f, 0.004362f, -0.002310f, 0.002756f, -0.004153f, 0.000392f, -0.005369f, 0.001719f, -0.002856f, -0.001835f, 0.000849f, 0.002712f, -0.003327f, 0.003594f, 0.002287f, 0.004386f, 0.000259f, 0.002604f, -0.001130f, 0.001594f, 0.000786f, 0.001613f, -0.001677f, -0.000025f, -0.001571f, -0.000213f, 0.000778f, 0.002276f, -0.014860f, -0.019955f, 0.007748f, -0.018650f, 0.000006f, 0.020760f, -0.021722f, 0.007950f, 0.009752f, + -0.005829f, -0.026811f, 0.000353f, 0.015685f, -0.017349f, 0.010790f, -0.001216f, -0.007688f, -0.022497f, -0.000631f, -0.016232f, 0.002877f, -0.008243f, -0.012645f, -0.015791f, 0.006494f, -0.002242f, -0.000921f, 0.015006f, -0.009079f, 0.012659f, -0.009612f, -0.003851f, 0.019405f, 0.006646f, -0.010346f, 0.007962f, 0.004690f, -0.008980f, 0.004740f, 0.004877f, -0.003436f, -0.003837f, 0.000784f, -0.004330f, -0.005107f, 0.003174f, 0.003561f, 0.026399f, -0.024849f, 0.004017f, 0.001597f, -0.008913f, 0.017884f, 0.010169f, -0.006123f, -0.019277f, 0.001727f, -0.001956f, -0.005806f, -0.012168f, -0.014237f, 0.017382f, 0.011287f, 0.001438f, -0.001725f, 0.009258f, 0.004714f, -0.004214f, 0.007423f, 0.005320f, -0.004809f, 0.018494f, -0.006855f, 0.011312f, -0.007561f, 0.005626f, 0.005831f, 0.004166f, -0.000546f, -0.010297f, 0.009851f, -0.008018f, -0.008327f, -0.005729f, 0.002881f, -0.000022f, 0.001236f, -0.009767f, 0.005321f, 0.004100f, -0.006165f, 0.000633f, -0.000226f, -0.003092f, 0.000599f, -0.002050f, 0.004739f, -0.001366f, 0.000741f, 0.003947f, -0.001775f, -0.003005f, 0.002643f, -0.003425f, 0.002784f, + -0.000618f, -0.000018f, -0.003943f, -0.001743f, -0.000138f, -0.004282f, 0.004241f, 0.002427f, 0.000955f, 0.002840f, -0.000916f, 0.001942f, 0.008807f, -0.020124f, 0.014768f, -0.008423f, -0.003691f, -0.011553f, -0.008287f, 0.007032f, -0.006607f, 0.005751f, 0.022559f, 0.007715f, 0.012405f, -0.028758f, -0.019007f, -0.010251f, -0.006858f, 0.003107f, -0.000112f, 0.004954f, -0.024112f, 0.012911f, 0.005402f, 0.003220f, 0.023042f, 0.000382f, -0.013032f, 0.021606f, 0.008522f, -0.009652f, 0.004433f, -0.012404f, 0.011376f, 0.005347f, 0.015155f, -0.012986f, -0.009199f, 0.003827f, -0.013106f, 0.016540f, -0.015161f, -0.000274f, 0.014720f, 0.013538f, -0.027998f, -0.000801f, 0.001381f, 0.003250f, 0.004643f, 0.030592f, 0.007075f, 0.001905f, -0.009357f, -0.007745f, -0.016535f, -0.008967f, 0.022629f, 0.000540f, -0.026998f, 0.000401f, 0.006259f, -0.015345f, -0.016874f, 0.001998f, -0.010943f, 0.004483f, 0.024798f, 0.012159f, 0.010439f, -0.010180f, -0.026490f, 0.002128f, -0.004531f, 0.012152f, -0.002379f, -0.022199f, -0.002696f, 0.005781f, 0.006116f, 0.005983f, -0.001871f, 0.018780f, 0.003549f, -0.011961f, + 0.015503f, -0.001154f, 0.009278f, -0.000319f, -0.002314f, -0.008076f, 0.011456f, 0.007871f, 0.004480f, -0.005865f, -0.002288f, -0.001549f, -0.003868f, 0.002167f, -0.000025f, -0.004987f, 0.002478f, 0.001500f, -0.002800f, -0.003714f, -0.001545f, -0.002809f, -0.000410f, 0.003475f, -0.003564f, 0.001787f, 0.004381f, 0.005239f, -0.001351f, 0.002230f, -0.002794f, -0.035468f, -0.010548f, 0.010014f, 0.027418f, 0.003897f, 0.014236f, 0.048633f, 0.008118f, 0.008290f, -0.007487f, -0.023330f, 0.013255f, -0.011319f, 0.012217f, -0.002943f, 0.032219f, 0.023444f, -0.012375f, -0.026355f, -0.020909f, 0.015886f, -0.013913f, 0.019476f, 0.008607f, 0.006340f, -0.006690f, -0.002577f, 0.023201f, -0.004579f, 0.020481f, 0.020448f, 0.010615f, 0.014341f, -0.015864f, 0.015531f, 0.008421f, -0.008339f, 0.022677f, -0.009983f, 0.020607f, 0.001539f, 0.002370f, -0.030181f, 0.018232f, 0.001656f, -0.005626f, 0.014900f, -0.020984f, -0.008352f, 0.012651f, 0.010294f, -0.019329f, 0.003116f, -0.012346f, -0.007132f, 0.019244f, 0.002573f, 0.005844f, -0.002035f, -0.022053f, 0.014833f, 0.014141f, 0.000959f, 0.011192f, 0.004993f, + -0.009738f, -0.010291f, -0.000777f, 0.011785f, -0.019962f, -0.000727f, 0.001343f, 0.000865f, -0.000130f, 0.008762f, 0.011573f, 0.023643f, 0.013332f, 0.000782f, -0.033166f, -0.010927f, -0.012378f, -0.001114f, 0.002523f, -0.009335f, -0.019632f, -0.006205f, -0.008809f, 0.005196f, 0.000831f, -0.005613f, 0.002175f, -0.005755f, 0.009229f, -0.003292f, -0.003851f, -0.005428f, 0.000174f, 0.002648f, -0.011772f, 0.007434f, -0.007545f, 0.003092f, -0.001884f, -0.004369f, 0.000284f, -0.007293f, 0.002436f, -0.006578f, -0.004719f, -0.000936f, -0.003723f, -0.003498f, 0.004148f, 0.007009f, 0.004278f, 0.006749f, 0.008858f, -0.001813f, 0.001388f, 0.043848f, 0.012926f, 0.005784f, -0.016203f, -0.039607f, 0.028692f, 0.008873f, -0.026151f, 0.007786f, -0.002755f, 0.006690f, 0.005647f, -0.018999f, -0.040455f, -0.031781f, 0.010805f, 0.024822f, -0.004837f, 0.026065f, -0.012002f, 0.020333f, 0.024951f, 0.033650f, -0.007329f, 0.024864f, -0.021992f, 0.008409f, -0.011949f, 0.002983f, 0.013525f, -0.000590f, -0.007071f, 0.006051f, 0.016961f, -0.012020f, -0.022290f, -0.022678f, 0.047603f, 0.000082f, -0.002248f, -0.021429f, + 0.022144f, 0.007161f, -0.043695f, -0.025380f, 0.009959f, -0.006167f, -0.007629f, 0.017114f, 0.005926f, 0.042408f, 0.023554f, -0.001503f, -0.024506f, -0.024184f, -0.013591f, -0.009940f, -0.027817f, 0.025852f, -0.018978f, 0.020460f, 0.017725f, -0.017694f, -0.022675f, -0.022050f, -0.032050f, 0.007851f, -0.000387f, -0.011564f, -0.014418f, -0.023613f, -0.008308f, -0.023256f, 0.005055f, 0.002830f, -0.007763f, 0.003186f, 0.019231f, -0.048679f, -0.018754f, -0.039721f, 0.020226f, 0.013996f, -0.016897f, -0.005734f, 0.008330f, -0.007477f, -0.000081f, 0.009440f, -0.007207f, -0.015889f, -0.001607f, -0.004564f, -0.004849f, -0.000178f, -0.001901f, -0.006741f, 0.000434f, 0.001430f, 0.008666f, -0.011710f, 0.003282f, 0.006465f, -0.000555f, -0.004834f, -0.007343f, -0.002167f, -0.000973f, 0.001692f, -0.002416f, -0.000618f, -0.004380f, 0.002266f, -0.001647f, -0.007467f, 0.013517f, 0.001405f, 0.004213f, -0.023579f, -0.045452f, -0.010096f, -0.011795f, 0.002520f, -0.010548f, 0.001977f, 0.004806f, -0.004882f, 0.019534f, -0.025167f, -0.007621f, -0.023884f, -0.001155f, -0.011885f, 0.027686f, 0.030950f, 0.024741f, -0.034504f, + 0.024492f, -0.012455f, 0.018606f, -0.007129f, 0.013742f, -0.011448f, -0.014738f, 0.005325f, -0.019043f, 0.012269f, 0.014784f, -0.001825f, 0.008883f, -0.017457f, -0.002190f, 0.029572f, -0.023503f, 0.001130f, -0.006971f, -0.009637f, -0.018949f, -0.001055f, 0.029213f, 0.038496f, -0.024285f, 0.011640f, -0.003049f, -0.023354f, -0.023884f, -0.025652f, -0.011744f, 0.048730f, 0.029416f, -0.009108f, 0.015639f, -0.010343f, 0.013543f, -0.026663f, 0.015652f, -0.000803f, -0.014595f, 0.037092f, 0.019098f, 0.007573f, 0.012100f, 0.010615f, 0.034699f, 0.004600f, -0.029513f, 0.011991f, 0.022444f, 0.017611f, -0.051489f, 0.031403f, -0.021889f, -0.019428f, -0.009668f, 0.003194f, -0.020246f, 0.022218f, 0.049237f, -0.008574f, 0.006985f, 0.025189f, 0.004213f, -0.004136f, 0.005924f, 0.002564f, 0.014302f, 0.012910f, 0.007699f, 0.023626f, 0.012043f, -0.006597f, 0.016005f, 0.009983f, -0.007195f, -0.014403f, 0.008028f, -0.002009f, 0.008695f, -0.004144f, 0.002532f, 0.007129f, 0.002715f, -0.002077f, -0.001876f, 0.003206f, 0.010966f, 0.002390f, -0.002720f, 0.002421f, 0.008392f, -0.003777f, 0.000337f, 0.014301f, + 0.005415f, -0.003852f, 0.007719f, 0.002427f, 0.001958f, 0.005857f, -0.000283f, 0.004821f, -0.002389f, -0.009187f, -0.008443f, 0.007066f, 0.031623f, 0.020818f, 0.085941f, 0.024198f, -0.014521f, 0.005667f, 0.014416f, 0.000502f, 0.028591f, 0.021467f, 0.019788f, -0.025439f, -0.042791f, 0.042885f, -0.024265f, 0.004213f, 0.014727f, 0.047047f, 0.018753f, -0.028245f, 0.025565f, -0.025532f, -0.005387f, -0.035162f, -0.046449f, -0.005038f, 0.012436f, 0.012654f, 0.009248f, 0.011979f, -0.003757f, -0.031677f, -0.011855f, 0.010380f, 0.010662f, -0.016704f, 0.035240f, 0.022563f, -0.021268f, 0.011866f, 0.017499f, 0.007042f, 0.000985f, -0.019395f, -0.002517f, -0.013561f, -0.008180f, 0.002146f, 0.021887f, 0.054843f, -0.014945f, 0.005114f, 0.007970f, 0.020535f, -0.019672f, 0.069475f, -0.006090f, 0.006843f, 0.005700f, -0.031351f, -0.030957f, -0.049689f, -0.021255f, 0.027384f, -0.009648f, 0.013826f, 0.010943f, 0.047831f, 0.007533f, 0.008672f, 0.002426f, 0.037711f, 0.018063f, -0.015624f, 0.034414f, -0.031322f, 0.004942f, 0.031899f, 0.040918f, 0.037834f, 0.014786f, -0.021433f, -0.035194f, -0.015073f, + -0.011318f, -0.025558f, -0.014371f, -0.014514f, -0.004148f, -0.021457f, 0.005339f, -0.007348f, -0.003630f, -0.018707f, -0.002308f, -0.011650f, 0.018445f, 0.001958f, 0.003953f, -0.016651f, -0.003322f, -0.022886f, 0.001489f, 0.009823f, -0.000839f, 0.016778f, 0.010469f, 0.000051f, 0.006825f, -0.003468f, -0.010442f, -0.006064f, -0.004750f, -0.019635f, 0.001706f, 0.003922f, 0.004572f, 0.005852f, -0.009817f, 0.013854f, 0.014911f, 0.006609f, -0.011761f, -0.007856f, -0.004004f, 0.003351f, 0.008186f, 0.004474f, -0.007920f, -0.004051f, -0.009049f, -0.035807f, 0.020168f, 0.009567f, 0.024757f, -0.006665f, -0.054756f, 0.004347f, -0.036742f, -0.032586f, 0.009626f, 0.007767f, 0.015212f, -0.009537f, 0.010930f, -0.001958f, -0.018781f, 0.029807f, -0.004878f, -0.009904f, -0.012018f, -0.020961f, -0.018019f, 0.010832f, -0.022695f, 0.005504f, -0.014555f, -0.009970f, -0.006339f, 0.029252f, -0.005844f, 0.031402f, 0.019543f, -0.008259f, 0.010325f, 0.010858f, 0.022211f, -0.015429f, -0.021177f, 0.003158f, 0.013035f, 0.017135f, 0.029359f, -0.032529f, -0.031670f, 0.013524f, 0.010398f, 0.036353f, -0.018013f, -0.002600f, + 0.017964f, 0.000107f, 0.004980f, -0.006715f, 0.023718f, 0.029892f, 0.013652f, -0.003801f, 0.018708f, 0.062694f, -0.013908f, -0.018295f, 0.023240f, -0.002574f, 0.036584f, 0.008804f, 0.017058f, 0.020639f, -0.006726f, 0.014447f, 0.042350f, -0.011565f, -0.050922f, 0.035813f, 0.010452f, -0.016776f, 0.004879f, -0.077586f, 0.051745f, -0.000516f, 0.032080f, -0.020375f, 0.016738f, 0.002365f, -0.030934f, -0.029486f, -0.004057f, 0.005723f, -0.022860f, 0.000122f, 0.003512f, -0.004200f, -0.007605f, -0.004764f, -0.025004f, -0.004154f, -0.015010f, 0.000215f, -0.007848f, -0.002268f, -0.008989f, 0.015047f, -0.011165f, -0.008524f, -0.016132f, -0.007800f, -0.018407f, -0.003396f, 0.004128f, -0.010243f, -0.001158f, -0.008389f, -0.009151f, -0.009912f, -0.000606f, -0.008206f, -0.006114f, 0.002961f, -0.002633f, 0.008007f, -0.005707f, -0.011759f, -0.012869f, 0.000084f, 0.002233f, -0.008102f, -0.001652f, -0.003647f, 0.003954f, -0.017297f, -0.033169f, -0.001638f, 0.051663f, 0.025360f, -0.066540f, 0.010186f, -0.012006f, 0.005552f, 0.010881f, -0.003475f, -0.034303f, 0.004546f, -0.005308f, 0.029550f, 0.057797f, -0.009809f, + 0.018613f, 0.037832f, -0.001700f, -0.010961f, -0.009774f, 0.014803f, 0.057724f, -0.001456f, -0.003995f, 0.047178f, -0.019303f, 0.012507f, 0.000134f, -0.001081f, -0.012369f, 0.017558f, -0.052953f, 0.001352f, 0.016789f, 0.038403f, 0.041177f, -0.034175f, 0.001461f, 0.036890f, -0.002215f, 0.068928f, -0.025089f, -0.034214f, 0.004697f, 0.050002f, 0.008929f, -0.038884f, -0.018050f, 0.011182f, -0.000079f, 0.021632f, -0.056169f, 0.006627f, 0.002607f, -0.012001f, -0.040712f, -0.036410f, 0.009707f, -0.011223f, -0.002406f, 0.001807f, -0.042363f, -0.044784f, 0.009599f, 0.006776f, -0.044898f, -0.015450f, -0.029129f, 0.026029f, -0.071045f, -0.027128f, 0.023522f, -0.043396f, 0.023830f, -0.011841f, -0.017202f, 0.023433f, -0.007122f, 0.035293f, 0.033811f, 0.007424f, 0.021041f, -0.009615f, 0.004395f, -0.025248f, 0.027311f, -0.019606f, 0.016316f, -0.026434f, 0.019596f, 0.001207f, 0.008822f, -0.002385f, 0.000277f, -0.015225f, 0.018133f, -0.019923f, 0.003582f, 0.002173f, 0.010269f, -0.021844f, 0.011459f, -0.008883f, -0.005939f, 0.006790f, -0.004467f, -0.010281f, 0.014799f, 0.006108f, 0.015808f, 0.006848f, + -0.001455f, -0.007419f, -0.007309f, -0.002025f, 0.003091f, -0.010386f, 0.003823f, -0.007583f, 0.003834f, -0.020891f, -0.010731f, -0.008563f, 0.010879f, 0.012350f, -0.006687f, 0.002779f, -0.002922f, -0.017362f, 0.037571f, 0.000045f, 0.020780f, -0.039221f, -0.002957f, -0.037121f, 0.038930f, 0.017304f, 0.050939f, 0.035970f, -0.018092f, 0.006945f, 0.040234f, 0.020748f, 0.020474f, 0.013212f, -0.034207f, -0.009697f, 0.016794f, 0.002795f, 0.019838f, -0.043513f, -0.032376f, 0.019810f, 0.065284f, 0.008998f, -0.021615f, 0.041364f, 0.011735f, 0.025895f, 0.006799f, 0.005156f, -0.036878f, -0.037425f, 0.000638f, 0.000737f, -0.064561f, 0.005334f, -0.013289f, -0.003206f, 0.020388f, -0.025068f, 0.015402f, 0.050806f, 0.005290f, -0.082522f, -0.059455f, -0.009573f, -0.018326f, -0.020436f, -0.000654f, 0.015158f, 0.013057f, -0.020149f, 0.022862f, 0.021827f, 0.019641f, -0.012670f, 0.016899f, -0.009213f, -0.021544f, -0.004972f, 0.018874f, -0.061562f, -0.014128f, -0.027734f, -0.032204f, -0.012687f, 0.008634f, -0.016265f, -0.001741f, 0.068037f, 0.038584f, -0.025988f, 0.000182f, 0.000883f, -0.011761f, -0.011988f, + 0.005917f, 0.045675f, 0.016603f, 0.007024f, -0.014179f, -0.010131f, -0.023690f, -0.027124f, -0.029099f, -0.006531f, 0.003677f, 0.009146f, -0.010225f, 0.008187f, -0.002469f, -0.006500f, -0.002566f, -0.007651f, -0.025559f, -0.006223f, -0.000282f, -0.006314f, -0.022115f, 0.002934f, -0.008040f, 0.024193f, -0.012204f, 0.008291f, -0.002495f, 0.010076f, -0.000164f, -0.019312f, 0.001617f, 0.023494f, 0.003527f, 0.021151f, -0.005827f, 0.010907f, -0.006758f, 0.006985f, -0.001483f, -0.014284f, -0.006449f, -0.001373f, -0.002618f, -0.002688f, -0.000133f, 0.013937f, 0.026614f, -0.037051f, -0.009458f, -0.015727f, 0.009786f, 0.077344f, 0.012156f, -0.038119f, 0.009996f, 0.034144f, -0.007415f, 0.031900f, 0.040583f, -0.021033f, 0.009531f, 0.020491f, 0.013928f, 0.000873f, -0.006074f, -0.012617f, 0.005980f, 0.024085f, 0.012350f, 0.022493f, -0.033852f, -0.052069f, -0.005622f, 0.023189f, 0.020387f, 0.016642f, -0.006006f, -0.048034f, 0.015383f, 0.010623f, 0.071829f, 0.075582f, 0.017886f, -0.056277f, 0.040615f, -0.021445f, -0.057573f, -0.013460f, -0.068121f, -0.051858f, -0.022962f, -0.024995f, -0.052843f, 0.009179f, + -0.021342f, -0.060438f, -0.055361f, 0.015961f, 0.035825f, -0.005937f, -0.046745f, 0.013857f, 0.001265f, 0.014920f, 0.029309f, 0.028620f, -0.036183f, 0.046596f, 0.031952f, 0.004060f, 0.012805f, 0.032422f, -0.001765f, 0.084810f, -0.060549f, -0.028923f, -0.002098f, -0.069007f, 0.056564f, 0.004127f, 0.071121f, 0.021974f, 0.015860f, -0.003606f, 0.014038f, 0.030168f, 0.001117f, -0.028095f, -0.000520f, -0.014999f, 0.011227f, 0.010866f, 0.020292f, -0.008542f, -0.026062f, -0.000175f, 0.024093f, 0.011429f, -0.015482f, -0.007715f, 0.012644f, -0.017322f, -0.000136f, 0.000373f, 0.022132f, 0.008680f, -0.012144f, -0.005262f, -0.013789f, -0.022248f, -0.019306f, -0.001069f, 0.004182f, -0.011030f, -0.008128f, 0.002588f, -0.011140f, 0.017429f, 0.008484f, -0.000209f, 0.010461f, 0.035201f, -0.013405f, -0.006700f, 0.003963f, 0.009453f, -0.018993f, 0.020632f, -0.006953f, -0.000637f, 0.003522f, 0.015429f, 0.025964f, -0.037701f, 0.009893f, -0.075290f, -0.020404f, -0.004665f, -0.018531f, 0.082659f, 0.026045f, -0.021956f, -0.051938f, -0.026327f, -0.021385f, -0.032897f, -0.024153f, 0.012643f, -0.075820f, -0.016318f, + 0.055633f, -0.006583f, -0.006264f, -0.057919f, 0.055237f, 0.027389f, 0.001231f, -0.021963f, 0.023532f, 0.011687f, -0.013210f, 0.025226f, -0.039162f, -0.010380f, -0.020011f, 0.011233f, -0.009161f, -0.024657f, 0.027986f, -0.021031f, 0.011661f, 0.000816f, -0.038052f, -0.023676f, -0.005957f, -0.047592f, -0.046759f, -0.062568f, -0.016178f, 0.028710f, -0.021037f, -0.011456f, 0.036079f, -0.044030f, -0.036234f, 0.039041f, -0.000343f, -0.002250f, 0.035121f, 0.000526f, -0.030109f, -0.017266f, 0.011832f, 0.025437f, -0.038894f, -0.012193f, 0.047262f, 0.020456f, 0.045603f, 0.023673f, -0.009377f, 0.024057f, -0.001872f, -0.061789f, 0.019382f, -0.046738f, 0.033854f, 0.005950f, 0.012392f, -0.019655f, -0.053500f, 0.011281f, -0.008015f, -0.046368f, -0.018638f, 0.020855f, -0.023589f, 0.001008f, 0.007272f, 0.015198f, -0.015151f, 0.000856f, 0.002211f, -0.003958f, 0.009646f, -0.006914f, 0.005384f, 0.019077f, -0.003561f, 0.006568f, 0.004957f, -0.012295f, 0.003849f, 0.009182f, 0.005157f, -0.009169f, 0.012486f, 0.008743f, -0.000962f, -0.012855f, -0.026432f, 0.005487f, -0.020925f, 0.017019f, -0.021364f, 0.014042f, + 0.017410f, 0.000885f, 0.000966f, 0.000567f, 0.009876f, 0.001608f, -0.009131f, 0.020601f, 0.016381f, -0.008070f, -0.012908f, -0.021507f, 0.056412f, 0.019695f, 0.002082f, 0.006888f, -0.014733f, 0.022367f, 0.034762f, 0.088063f, 0.076916f, 0.006651f, -0.033862f, 0.015665f, 0.044599f, 0.012747f, 0.034535f, 0.024908f, 0.016724f, -0.026102f, -0.033519f, -0.040283f, -0.002808f, 0.014966f, 0.028372f, 0.057209f, 0.030275f, 0.036690f, 0.021335f, 0.034017f, 0.017165f, 0.032768f, -0.021884f, 0.006178f, 0.061850f, -0.001663f, 0.047583f, 0.012612f, 0.038482f, -0.061057f, -0.009930f, -0.017998f, -0.017991f, 0.014240f, 0.023781f, 0.044222f, 0.071541f, 0.059926f, -0.021242f, 0.010642f, -0.079446f, 0.019299f, 0.018294f, 0.069999f, -0.055647f, 0.044271f, -0.014448f, -0.039010f, 0.029894f, 0.009225f, 0.024949f, 0.043849f, -0.014267f, -0.056157f, 0.029066f, -0.036103f, -0.049507f, -0.023532f, 0.066237f, -0.057497f, -0.081613f, -0.041186f, -0.013523f, 0.043047f, -0.004494f, -0.029349f, -0.056328f, -0.042526f, 0.026936f, -0.003848f, -0.001054f, 0.036486f, -0.039743f, 0.011364f, 0.040808f, 0.015895f, + 0.027319f, 0.039526f, -0.026769f, -0.013488f, -0.022624f, 0.030231f, 0.006712f, 0.015566f, 0.011019f, -0.027204f, 0.033785f, 0.008350f, 0.005354f, -0.013327f, -0.049397f, -0.047188f, 0.004703f, -0.022458f, -0.009321f, -0.021302f, -0.018527f, -0.008132f, 0.008704f, -0.000283f, -0.020836f, 0.026606f, 0.022297f, -0.003001f, -0.023652f, 0.003877f, 0.014243f, -0.016902f, -0.007658f, -0.009707f, 0.000197f, 0.011498f, -0.005310f, -0.011684f, -0.009460f, 0.008085f, 0.006764f, 0.012970f, 0.016177f, -0.008482f, 0.009243f, 0.010010f, 0.055335f, -0.017455f, -0.061149f, 0.004291f, -0.025540f, -0.087419f, -0.044216f, 0.114647f, 0.016034f, -0.051780f, -0.056851f, 0.006398f, 0.001015f, 0.023675f, 0.029765f, -0.040104f, -0.026626f, -0.063976f, 0.014895f, -0.023215f, -0.015357f, 0.097745f, 0.020993f, -0.013534f, -0.100899f, -0.006531f, -0.053876f, 0.053384f, 0.065962f, 0.006901f, 0.051319f, -0.060473f, -0.023784f, -0.038215f, -0.009020f, 0.099812f, 0.124329f, 0.019837f, -0.033183f, -0.044422f, -0.089760f, 0.001207f, 0.011617f, 0.108507f, 0.060571f, -0.015884f, -0.178413f, -0.092442f, 0.015366f, -0.017152f, + 0.156717f, 0.052504f, -0.075209f, -0.031317f, -0.134271f, -0.042519f, 0.004735f, 0.087806f, 0.090623f, 0.101716f, 0.004854f, 0.024086f, -0.010692f, 0.008769f, 0.125151f, -0.046199f, 0.091933f, -0.022278f, -0.094386f, -0.028277f, -0.100056f, -0.032157f, 0.131038f, 0.059565f, 0.093567f, -0.031021f, 0.073379f, -0.082160f, -0.013087f, 0.019523f, 0.039118f, 0.077817f, -0.026258f, -0.001699f, 0.004917f, -0.007381f, 0.012033f, 0.020756f, -0.022260f, 0.003384f, -0.023407f, -0.042354f, 0.019048f, 0.034405f, 0.019195f, -0.004472f, -0.025423f, -0.056666f, -0.055796f, -0.029438f, 0.018891f, 0.052147f, 0.029394f, 0.040337f, -0.054849f, -0.071921f, -0.055467f, 0.006229f, 0.063002f, 0.069951f, 0.053748f, -0.032120f, -0.136973f, -0.088039f, 0.002671f, 0.068946f, 0.148855f, 0.057670f, 0.012240f, -0.067781f, -0.089288f, -0.031033f, -0.028412f, 0.078005f, 0.086215f, 0.032223f, -0.005110f, -0.074827f, -0.056118f, 0.017090f, 0.025779f, 0.063444f, 0.030840f, -0.032796f, -0.022947f, -0.039269f, -0.018686f, 0.018429f, 0.016853f, -0.079486f, 0.088155f, 0.000149f, -0.022973f, -0.136964f, -0.036870f, -0.036987f, + -0.061795f, 0.132593f, 0.001421f, 0.059403f, -0.090631f, 0.050321f, 0.042258f, -0.040784f, 0.026538f, -0.007844f, 0.023724f, -0.000021f, 0.067842f, 0.023950f, -0.065805f, 0.039738f, 0.032810f, -0.000234f, 0.045815f, -0.033882f, -0.017373f, 0.057460f, 0.040315f, 0.038259f, 0.019147f, 0.033283f, -0.099174f, 0.086554f, -0.049759f, -0.031718f, 0.018982f, -0.069595f, 0.101655f, -0.028947f, 0.010253f, 0.073321f, 0.002643f, -0.011231f, 0.040000f, 0.040724f, 0.072041f, -0.017631f, -0.066655f, -0.068129f, 0.007695f, -0.024656f, 0.031668f, -0.041246f, -0.019877f, -0.027956f, 0.020516f, -0.127969f, 0.002236f, 0.094843f, 0.026426f, 0.038553f, -0.003422f, -0.010554f, 0.025171f, -0.033866f, -0.038482f, 0.023714f, 0.013369f, -0.041735f, -0.046122f, 0.176115f, -0.018908f, -0.057419f, 0.016167f, 0.082481f, -0.002151f, -0.065199f, 0.026943f, -0.012342f, -0.024498f, 0.053045f, 0.067649f, -0.049544f, -0.080711f, 0.018143f, 0.019597f, -0.018791f, -0.048226f, 0.002269f, 0.024513f, -0.007579f, -0.007738f, -0.003347f, -0.008225f, 0.012830f, 0.014520f, -0.016752f, 0.001933f, 0.007112f, 0.003728f, -0.010134f, + 0.003818f, -0.000699f, -0.022295f, 0.015983f, 0.006984f, 0.031061f, 0.015571f, -0.011990f, 0.012829f, -0.006314f, 0.018467f, -0.001457f, -0.004701f, 0.025308f, -0.006236f, 0.017296f, -0.005026f, -0.020156f, -0.001664f, 0.022768f, -0.006364f, 0.025937f, -0.024632f, 0.032602f, 0.007765f, -0.023668f, 0.009962f, 0.000386f, 0.012111f, -0.004091f, -0.009409f, -0.002505f, 0.025611f, -0.068324f, 0.024333f, 0.107814f, 0.169806f, -0.075080f, 0.055351f, -0.112107f, -0.033038f, -0.068296f, -0.009305f, 0.104343f, 0.110746f, 0.088002f, -0.002752f, -0.070277f, -0.042486f, 0.038263f, 0.002891f, 0.019192f, 0.057891f, -0.001063f, 0.028827f, -0.073667f, -0.018771f, -0.042612f, -0.051878f, 0.028482f, 0.023747f, 0.001607f, 0.051923f, -0.044073f, -0.001560f, 0.011691f, -0.062115f, -0.001716f, 0.004379f, -0.039280f, -0.014805f, 0.014729f, -0.026220f, 0.058510f, -0.019119f, 0.088630f, 0.067048f, -0.043698f, -0.012247f, -0.060742f, -0.069407f, -0.090153f, 0.028845f, 0.041553f, 0.120511f, 0.091893f, 0.042953f, 0.058397f, 0.011200f, -0.066382f, -0.043869f, -0.037191f, -0.045184f, -0.009614f, 0.025303f, -0.002447f, + -0.031049f, 0.008076f, -0.031328f, 0.019688f, 0.044896f, 0.008740f, -0.046836f, 0.036588f, -0.022458f, -0.023858f, -0.046873f, 0.024237f, 0.020781f, 0.010618f, 0.005740f, 0.106223f, 0.081191f, 0.066390f, 0.011265f, -0.015447f, -0.090012f, -0.018880f, -0.009427f, 0.088473f, 0.050691f, 0.023030f, 0.026724f, 0.076617f, -0.012254f, -0.030577f, -0.041453f, -0.034729f, -0.016375f, -0.007820f, 0.006925f, 0.000877f, 0.000488f, 0.039721f, -0.004697f, -0.023826f, -0.014643f, -0.008226f, 0.000755f, 0.019600f, 0.035387f, 0.015452f, -0.004602f, 0.021877f, -0.036868f, 0.014263f, 0.033638f, 0.013672f, 0.066424f, -0.027414f, 0.000282f, 0.011250f, -0.027949f, 0.007112f, -0.044369f, -0.002430f, 0.015262f, 0.000377f, 0.017792f, -0.012803f, -0.184350f, -0.106790f, -0.061480f, 0.105984f, 0.049767f, 0.282069f, 0.265205f, 0.273899f, 0.277180f, 0.296835f, 0.208933f, 0.108960f, 0.158240f, 0.094966f, -0.047194f, -0.087927f, -0.135411f, -0.263548f, -0.237297f, -0.246223f, -0.178332f, -0.180912f, -0.133935f, -0.111195f, -0.058975f, 0.005946f, -0.104187f, -0.053428f, -0.021542f, -0.016563f, -0.056337f, 0.014451f, + 0.070650f, 0.079105f, 0.029611f, 0.093476f, 0.119217f, 0.029421f, 0.023560f, 0.023470f, 0.117154f, 0.121836f, 0.154032f, 0.172171f, 0.150915f, 0.170984f, 0.259996f, 0.105243f, 0.203035f, 0.276753f, 0.178189f, 0.210056f, 0.165392f, 0.082661f, 0.098869f, 0.109081f, 0.097243f, 0.131797f, 0.130125f, 0.080563f, 0.015933f, 0.040016f, 0.076760f, -0.004878f, 0.009058f, -0.036901f, -0.042232f, -0.130691f, -0.058631f, -0.226439f, -0.284257f, -0.227902f, -0.259335f, -0.353236f, -0.340841f, -0.202299f, -0.380732f, -0.345735f, -0.315275f, -0.356920f, -0.300893f, -0.229792f, -0.288318f, -0.212427f, -0.058609f, -0.141107f, -0.174199f, -0.069044f, -0.068730f, -0.056785f, -0.062344f, -0.027874f, 0.017482f, 0.035815f, 0.069888f, 0.090152f, 0.103608f, 0.116440f, 0.120632f, 0.169842f, 0.104385f, 0.200098f, 0.224307f, 0.106678f, 0.208383f, 0.197906f, 0.125869f, 0.151692f, 0.220484f, 0.149757f, 0.248834f, 0.187668f, 0.235977f, 0.165044f, 0.150336f, 0.155562f, 0.145682f, 0.114188f, 0.131107f, 0.113757f, 0.090385f, 0.067868f, 0.066587f, 0.053865f, 0.023825f, -0.016587f, -0.012484f, -0.009354f, + -0.077637f, -0.127255f, -0.121694f, -0.125372f, -0.136017f, -0.126474f, -0.140720f, -0.102217f, -0.105152f, -0.086418f, -0.063171f, -0.049754f, -0.055931f, -0.055690f, -0.041457f, -0.029327f, -0.031470f, -0.042738f, -0.020701f, -0.010020f, -0.022534f, -0.036217f, -0.018511f, -0.012201f, -0.015503f, -0.017286f, 0.002300f, 0.006880f, 0.009664f, 0.001125f, 0.003365f}, + {0.020074f, 0.001053f, -0.001324f, -0.000691f, -0.001576f, -0.010276f, -0.010429f, 0.009985f, 0.002398f, -0.005964f, -0.009108f, -0.004384f, -0.006883f, -0.011866f, 0.015180f, 0.001840f, 0.005499f, 0.007572f, 0.021869f, -0.000558f, 0.003492f, -0.005267f, -0.001945f, -0.004051f, -0.014256f, 0.003183f, -0.004362f, 0.001410f, 0.009907f, -0.003911f, -0.000975f, 0.002158f, 0.001047f, -0.002354f, 0.000462f, -0.013169f, 0.002731f, -0.000316f, -0.004729f, 0.004120f, 0.001887f, -0.008864f, 0.013988f, 0.000491f, 0.002007f, 0.013020f, -0.005060f, -0.005624f, -0.012843f, -0.006504f, 0.008859f, 0.000556f, 0.009443f, -0.004630f, -0.010508f, 0.004567f, -0.009796f, -0.004380f, -0.018901f, 0.007766f, 0.006598f, 0.004027f, 0.005673f, 0.012960f, 0.003347f, -0.005692f, 0.006978f, 0.010764f, -0.007062f, 0.005329f, -0.000060f, -0.002274f, -0.003675f, -0.002902f, 0.007231f, -0.001470f, 0.008026f, -0.004072f, 0.003205f, -0.002514f, 0.002895f, 0.005866f, -0.003215f, 0.002137f, -0.002232f, 0.004740f, 0.003814f, 0.003247f, -0.001671f, 0.001124f, 0.000086f, -0.002644f, 0.001276f, 0.004631f, 0.000773f, 0.001570f, + -0.002787f, 0.001819f, -0.001544f, 0.001077f, -0.002153f, 0.000460f, 0.002681f, -0.007941f, 0.002140f, -0.004915f, -0.010071f, -0.000981f, -0.011896f, -0.014418f, -0.009117f, -0.006905f, -0.015914f, 0.000644f, -0.005752f, -0.003197f, 0.004888f, 0.016951f, 0.001545f, -0.004024f, -0.001950f, 0.002728f, -0.000337f, 0.007043f, 0.012024f, -0.001015f, 0.013502f, -0.001553f, -0.000890f, -0.001616f, 0.007688f, -0.010169f, 0.001578f, 0.001234f, -0.002503f, -0.000579f, -0.006080f, -0.010106f, 0.013880f, -0.004724f, -0.001039f, -0.002475f, 0.006121f, -0.006605f, -0.005691f, 0.002420f, 0.002054f, 0.009700f, -0.006659f, 0.007989f, -0.004674f, -0.007999f, -0.000636f, -0.003305f, 0.002165f, 0.004353f, -0.000180f, 0.005649f, 0.002682f, 0.004118f, -0.005360f, -0.006291f, -0.010430f, -0.007660f, 0.000971f, 0.012446f, 0.001565f, 0.010109f, 0.002617f, -0.005205f, 0.006944f, 0.003301f, -0.007517f, 0.013171f, 0.002189f, -0.012403f, 0.003225f, 0.005622f, 0.001108f, 0.003734f, 0.003219f, -0.008787f, 0.003197f, 0.003078f, 0.002160f, -0.000505f, 0.006462f, 0.002176f, -0.001662f, -0.002122f, -0.000052f, 0.002588f, + -0.000081f, 0.003514f, -0.000117f, 0.000171f, 0.002020f, -0.000840f, -0.001935f, -0.001241f, 0.000343f, -0.001716f, -0.001841f, 0.002262f, -0.000222f, 0.002171f, 0.001901f, -0.000529f, -0.000196f, -0.014763f, -0.013121f, 0.002782f, 0.001476f, 0.010984f, -0.008507f, 0.011299f, -0.005771f, -0.002563f, -0.017800f, -0.001183f, 0.001134f, -0.006146f, -0.001115f, 0.009485f, 0.008934f, 0.013450f, -0.003361f, -0.002114f, 0.008355f, 0.003900f, 0.007494f, -0.018375f, 0.018067f, -0.003971f, -0.000336f, 0.002815f, -0.002305f, -0.000206f, -0.001717f, -0.001319f, 0.011165f, -0.000396f, 0.014686f, -0.002612f, -0.006155f, -0.012366f, 0.001332f, -0.005639f, -0.004985f, 0.008428f, 0.006463f, 0.008815f, 0.000187f, 0.001028f, -0.013208f, -0.009519f, -0.000255f, 0.011850f, 0.004009f, -0.001610f, 0.003875f, -0.005045f, 0.012583f, -0.000755f, -0.011086f, -0.013999f, -0.005091f, 0.015529f, 0.011671f, 0.011977f, 0.005483f, 0.000381f, -0.013174f, -0.005908f, -0.001959f, -0.007709f, 0.007937f, -0.001442f, -0.003767f, 0.006817f, -0.018710f, 0.005505f, -0.002489f, 0.004358f, -0.001533f, -0.005382f, 0.008374f, 0.003149f, + -0.008902f, -0.009425f, 0.004691f, -0.002486f, 0.005484f, 0.001460f, -0.004062f, 0.002848f, 0.003471f, -0.000195f, 0.001307f, -0.000029f, 0.000357f, -0.001599f, -0.000072f, -0.002614f, -0.000015f, -0.002280f, 0.003652f, 0.001995f, -0.002846f, 0.001387f, -0.000757f, 0.000961f, 0.000954f, 0.001271f, -0.002124f, -0.001832f, 0.000627f, 0.001358f, -0.003873f, 0.003723f, -0.004202f, -0.008097f, -0.001338f, -0.006273f, 0.002868f, 0.010150f, 0.003975f, 0.000357f, -0.004141f, -0.023602f, -0.015560f, -0.000513f, 0.006828f, 0.008261f, 0.000472f, 0.001665f, -0.003335f, 0.008190f, 0.003626f, 0.006561f, -0.010293f, 0.009749f, 0.005595f, -0.011096f, 0.004150f, 0.010164f, -0.000564f, 0.003282f, 0.001650f, 0.009216f, -0.007176f, 0.005467f, -0.000943f, -0.001251f, -0.008827f, 0.000532f, 0.009434f, -0.006030f, -0.004369f, -0.008269f, 0.011074f, -0.001091f, 0.002150f, -0.008699f, -0.024782f, -0.007232f, 0.003633f, 0.002277f, 0.009147f, -0.006601f, -0.004078f, -0.003768f, -0.001663f, -0.007973f, 0.000242f, -0.007200f, 0.016228f, 0.005702f, 0.013237f, -0.013422f, -0.002649f, -0.005574f, 0.012403f, -0.003789f, + -0.002295f, -0.010340f, 0.006405f, -0.000225f, -0.006913f, 0.010555f, 0.003267f, 0.001279f, 0.012112f, 0.002582f, -0.010633f, -0.001498f, 0.001280f, -0.002902f, -0.003594f, 0.000065f, -0.009032f, 0.017895f, 0.007373f, 0.002590f, 0.011154f, 0.004830f, 0.004404f, 0.008187f, -0.002355f, 0.006926f, -0.003986f, 0.001182f, 0.000710f, 0.000403f, -0.002079f, 0.001240f, 0.000530f, -0.000672f, -0.001219f, -0.001173f, 0.000853f, -0.000930f, 0.000072f, 0.005926f, 0.000616f, -0.000188f, -0.000108f, -0.000093f, -0.000809f, 0.004700f, 0.001211f, 0.006589f, -0.005248f, 0.004182f, 0.000396f, -0.002713f, 0.011200f, 0.008519f, -0.000863f, -0.015278f, -0.020381f, -0.015756f, 0.005833f, 0.000004f, -0.008803f, -0.002305f, 0.001033f, -0.002013f, 0.022936f, 0.003951f, -0.016571f, -0.004416f, -0.004953f, 0.000824f, -0.007800f, 0.012962f, -0.009695f, -0.012719f, 0.011876f, -0.005005f, 0.003261f, 0.003142f, -0.005432f, -0.014973f, 0.001994f, -0.007986f, -0.007044f, -0.007341f, -0.000914f, 0.011633f, -0.001611f, -0.002655f, 0.017211f, 0.003143f, 0.002635f, -0.022225f, -0.002480f, 0.011827f, 0.013864f, -0.007687f, + 0.003760f, 0.001878f, -0.021917f, -0.002953f, -0.001347f, -0.002256f, 0.005516f, 0.000225f, -0.012299f, 0.001577f, -0.009837f, 0.009400f, -0.003353f, 0.012105f, 0.002411f, -0.013952f, 0.006159f, 0.026099f, -0.010162f, 0.000197f, -0.019489f, 0.004683f, 0.016364f, -0.029398f, 0.004173f, -0.002128f, -0.002565f, 0.007257f, -0.004762f, -0.007710f, 0.013754f, 0.013127f, -0.011414f, -0.001432f, 0.008600f, -0.003891f, 0.002007f, 0.004012f, 0.002524f, 0.000779f, -0.003356f, 0.007289f, -0.000227f, 0.004743f, 0.000169f, 0.006503f, 0.004435f, 0.004077f, -0.000385f, 0.001349f, 0.007272f, 0.000719f, -0.001544f, 0.002496f, 0.002233f, 0.000794f, 0.006031f, -0.003447f, 0.001886f, 0.000891f, -0.001399f, 0.000359f, 0.002143f, 0.001441f, 0.000686f, -0.000666f, 0.019643f, 0.002444f, 0.008809f, 0.013919f, -0.017162f, -0.005267f, -0.013097f, 0.006589f, 0.007600f, 0.015116f, 0.029261f, 0.004607f, -0.022316f, -0.002086f, -0.005610f, -0.002315f, -0.009651f, 0.000036f, -0.001080f, 0.011062f, 0.008806f, 0.003206f, -0.000791f, 0.000443f, -0.003437f, -0.002553f, 0.012674f, -0.004134f, -0.001698f, 0.009472f, + -0.001190f, 0.005581f, -0.000946f, 0.012056f, -0.009205f, -0.018226f, 0.022670f, -0.001336f, 0.005382f, -0.017061f, 0.001257f, -0.005191f, 0.025153f, 0.003963f, 0.011386f, -0.002382f, 0.010097f, 0.006795f, -0.022766f, -0.003589f, -0.012784f, -0.010991f, 0.001534f, 0.016043f, 0.002013f, -0.003224f, 0.024904f, -0.002639f, -0.014075f, -0.010748f, -0.007365f, 0.012223f, 0.037628f, -0.000078f, 0.010441f, 0.002699f, -0.011995f, -0.002634f, 0.000206f, 0.011165f, 0.017105f, 0.001573f, 0.013748f, 0.012266f, -0.022533f, 0.000746f, -0.004027f, -0.000574f, 0.011290f, -0.005040f, 0.002933f, 0.005332f, -0.001738f, -0.011571f, -0.008034f, -0.016901f, 0.004042f, 0.006737f, -0.000853f, 0.002601f, 0.002485f, 0.002054f, -0.000208f, -0.005248f, 0.001109f, 0.002490f, -0.000300f, 0.002306f, -0.002745f, 0.004502f, -0.000392f, 0.002262f, -0.001249f, -0.000810f, -0.002180f, 0.000572f, -0.001173f, 0.000792f, 0.003717f, 0.005978f, 0.004938f, 0.000749f, 0.001287f, 0.003662f, 0.002030f, 0.000115f, 0.002062f, -0.006698f, -0.029061f, 0.006586f, -0.002941f, 0.009966f, 0.006384f, 0.027043f, 0.005438f, -0.005126f, + 0.006476f, 0.020690f, 0.022901f, 0.009451f, 0.016126f, 0.016495f, -0.012811f, -0.009957f, -0.020753f, -0.022424f, 0.002437f, 0.009654f, -0.018975f, -0.013500f, -0.001047f, -0.021947f, -0.018198f, 0.009203f, 0.002933f, -0.009762f, -0.006509f, -0.014407f, 0.011927f, 0.008707f, 0.019624f, 0.037323f, -0.004166f, -0.010613f, -0.004012f, -0.018430f, -0.000243f, -0.014367f, -0.015895f, 0.019111f, 0.002157f, 0.002606f, -0.024616f, 0.025365f, 0.005020f, -0.015844f, -0.005108f, 0.013042f, 0.000850f, 0.002802f, -0.000459f, 0.002096f, 0.007404f, -0.012144f, 0.014183f, 0.000283f, -0.010004f, -0.002818f, -0.017123f, 0.002628f, -0.017580f, -0.015609f, 0.013433f, 0.013867f, -0.013988f, -0.022217f, 0.005619f, -0.010731f, -0.001632f, -0.005949f, 0.007431f, -0.006387f, 0.009816f, 0.003118f, 0.011890f, -0.002737f, 0.008872f, 0.004555f, -0.019945f, -0.007001f, 0.004863f, 0.002584f, 0.000323f, -0.009879f, -0.005591f, -0.002977f, 0.006547f, -0.003837f, -0.003339f, 0.000260f, 0.005237f, 0.004069f, -0.000264f, -0.000314f, -0.005745f, -0.003102f, 0.001062f, -0.001375f, -0.000611f, 0.004657f, 0.000476f, -0.000350f, + -0.004230f, 0.004019f, 0.001258f, -0.001551f, -0.000847f, -0.002843f, -0.000570f, -0.003144f, 0.004232f, -0.001071f, 0.001931f, -0.001250f, -0.011083f, -0.012094f, 0.014612f, -0.004505f, -0.003474f, 0.008459f, -0.012223f, -0.012837f, 0.014730f, 0.019739f, 0.000291f, -0.001206f, 0.006637f, -0.016992f, 0.028934f, -0.017796f, 0.002051f, 0.013861f, -0.006645f, 0.012931f, 0.015581f, 0.005144f, -0.016474f, 0.017688f, -0.002694f, 0.006640f, -0.012930f, -0.002420f, -0.024537f, 0.008410f, -0.014600f, 0.005594f, -0.025252f, 0.014776f, -0.018474f, -0.012879f, 0.010485f, 0.014585f, 0.004861f, 0.001597f, 0.000560f, -0.015862f, -0.014747f, -0.009415f, 0.038293f, 0.021011f, -0.006072f, -0.035552f, -0.005049f, 0.009953f, 0.020640f, -0.011736f, 0.001652f, -0.024590f, -0.008465f, -0.003085f, 0.006362f, 0.003547f, -0.005529f, -0.000498f, 0.010756f, -0.012207f, -0.000681f, -0.013908f, 0.007530f, 0.008995f, 0.026487f, 0.011186f, -0.012870f, 0.005400f, -0.007161f, -0.020079f, -0.002520f, 0.011508f, 0.001659f, 0.032912f, -0.018858f, -0.009276f, 0.005118f, -0.017250f, 0.008798f, 0.002685f, -0.003214f, 0.016688f, + 0.004179f, 0.007335f, 0.000164f, 0.000544f, -0.002574f, 0.008220f, 0.012384f, 0.002917f, -0.003513f, 0.008991f, -0.004672f, 0.002783f, -0.008467f, -0.002905f, 0.000035f, -0.011267f, -0.000139f, -0.004418f, -0.001932f, -0.004409f, -0.007215f, -0.003418f, 0.002558f, 0.002781f, 0.002021f, -0.002415f, -0.000293f, 0.004903f, -0.008126f, 0.000804f, 0.000777f, -0.025277f, -0.003716f, 0.005187f, 0.014922f, 0.007268f, 0.019482f, 0.003553f, -0.023288f, 0.014832f, -0.019701f, -0.021084f, 0.000590f, -0.001909f, 0.016053f, 0.019961f, 0.018357f, 0.026776f, 0.006551f, -0.027607f, 0.030245f, 0.016547f, -0.012208f, 0.023279f, -0.002996f, 0.002857f, -0.020392f, -0.007039f, -0.005870f, -0.009023f, 0.019518f, -0.032738f, -0.007393f, -0.015366f, -0.014618f, 0.002737f, 0.015814f, -0.007446f, -0.018889f, -0.020024f, -0.026100f, -0.026372f, -0.013397f, -0.004456f, 0.011414f, -0.020692f, -0.026852f, -0.015845f, -0.006748f, -0.013149f, -0.008794f, 0.023457f, -0.013141f, 0.002246f, 0.012451f, -0.021199f, -0.012598f, -0.014272f, 0.023087f, -0.009793f, 0.015046f, 0.033089f, -0.003186f, 0.007462f, 0.003255f, -0.010077f, + -0.013250f, -0.009028f, 0.015636f, -0.002278f, 0.017899f, 0.001124f, 0.013520f, 0.003193f, -0.022667f, 0.028160f, -0.012100f, -0.003538f, -0.024081f, 0.014841f, 0.031651f, 0.005390f, -0.004301f, 0.008442f, 0.003692f, -0.020199f, -0.009417f, 0.001243f, -0.004759f, -0.002133f, -0.008694f, -0.008493f, -0.001379f, 0.001552f, 0.001293f, 0.014744f, -0.001672f, 0.001910f, -0.007254f, 0.005628f, 0.000632f, 0.011090f, 0.004827f, 0.005026f, 0.002118f, -0.001289f, -0.004729f, -0.003974f, -0.006578f, -0.001402f, -0.004948f, 0.003349f, 0.001725f, -0.000077f, -0.003440f, -0.002904f, -0.002514f, -0.000979f, 0.001178f, -0.001155f, 0.006081f, 0.046849f, 0.029538f, 0.021497f, -0.015534f, -0.033721f, -0.009103f, 0.020533f, -0.031942f, -0.017402f, 0.000616f, 0.025092f, 0.017982f, 0.014580f, -0.018508f, 0.013968f, -0.004987f, 0.013964f, -0.003662f, 0.036279f, 0.021744f, -0.001789f, -0.033368f, -0.003432f, 0.025288f, 0.021521f, 0.000892f, 0.043979f, 0.019887f, -0.008831f, -0.000021f, 0.003044f, -0.005205f, -0.012273f, -0.016940f, -0.002655f, -0.047555f, 0.013481f, -0.016316f, 0.002269f, -0.001678f, 0.012427f, + 0.017689f, 0.000455f, 0.004706f, -0.021213f, 0.015119f, -0.007704f, 0.031483f, 0.000728f, 0.004495f, -0.076698f, -0.003300f, 0.020472f, 0.010564f, 0.021774f, -0.007466f, -0.021472f, 0.011932f, 0.004171f, -0.017595f, 0.016756f, 0.003396f, -0.016861f, 0.000247f, 0.000728f, 0.005884f, -0.006193f, -0.028079f, -0.028128f, -0.001155f, -0.010117f, 0.009433f, 0.009922f, 0.004173f, 0.010560f, -0.034381f, -0.011783f, 0.001772f, 0.007629f, 0.008303f, -0.013688f, 0.010801f, 0.002523f, -0.004920f, 0.003638f, 0.009744f, -0.006475f, 0.001310f, -0.002089f, 0.004031f, -0.006588f, -0.010304f, -0.003478f, 0.012259f, -0.009267f, 0.001308f, -0.006925f, 0.004912f, -0.002865f, 0.004349f, 0.007065f, -0.000850f, -0.007029f, 0.005754f, -0.001190f, -0.008219f, -0.005245f, 0.002957f, 0.003800f, 0.000454f, -0.003323f, 0.001638f, -0.000671f, 0.005073f, -0.002397f, 0.009832f, -0.003363f, -0.000631f, -0.032367f, -0.052074f, 0.008399f, 0.018025f, 0.018723f, 0.000437f, 0.043273f, -0.030789f, 0.010145f, 0.005915f, -0.008783f, -0.027333f, -0.011516f, -0.015551f, 0.018347f, -0.008069f, -0.016837f, -0.027821f, -0.002580f, + -0.010291f, -0.005324f, -0.020989f, 0.011173f, -0.001332f, -0.009829f, 0.011281f, 0.014369f, 0.017004f, -0.022114f, 0.040355f, 0.002441f, -0.005824f, -0.024812f, -0.023331f, -0.004755f, -0.003083f, -0.024203f, -0.025234f, -0.019367f, 0.016237f, -0.011225f, 0.026940f, 0.008617f, 0.044968f, 0.015422f, 0.017052f, -0.005794f, 0.024097f, -0.004218f, 0.005774f, 0.034170f, -0.010455f, 0.012384f, -0.041148f, -0.052369f, 0.011372f, -0.002496f, -0.033271f, 0.002050f, 0.000775f, -0.045204f, 0.012668f, -0.013333f, -0.008989f, -0.017670f, 0.016997f, -0.016512f, 0.000886f, -0.001846f, 0.008165f, 0.000019f, -0.024787f, 0.014487f, -0.003624f, 0.005753f, -0.031249f, -0.043081f, -0.038389f, 0.002104f, -0.009149f, -0.043622f, -0.009237f, 0.041858f, 0.022015f, 0.009689f, 0.007930f, -0.019384f, 0.000584f, -0.004470f, 0.001817f, -0.006400f, -0.005215f, -0.000250f, -0.000531f, 0.001644f, -0.000116f, -0.013542f, -0.003308f, 0.003541f, -0.002593f, 0.006491f, 0.010627f, 0.008927f, -0.000151f, -0.001524f, -0.004697f, 0.014166f, 0.008120f, 0.009318f, 0.007731f, 0.005703f, -0.001104f, -0.005424f, -0.004910f, 0.011051f, + -0.008615f, 0.006586f, 0.009264f, 0.003625f, 0.004547f, 0.000743f, 0.002706f, -0.007487f, 0.000638f, -0.002167f, -0.006453f, 0.003083f, 0.008386f, 0.031690f, 0.041365f, -0.001136f, 0.011018f, 0.026165f, 0.021449f, -0.002150f, -0.052632f, 0.036085f, -0.003535f, 0.009855f, -0.010716f, 0.018519f, -0.001282f, -0.022741f, 0.006436f, 0.041459f, 0.006365f, -0.027153f, 0.023984f, 0.017157f, 0.011241f, -0.020418f, 0.022072f, 0.016372f, 0.001973f, 0.026353f, -0.010465f, 0.007069f, 0.042449f, 0.030928f, 0.001289f, 0.009794f, 0.020875f, -0.040025f, -0.008027f, -0.002554f, -0.006211f, -0.035075f, 0.009041f, 0.010599f, 0.002082f, -0.027206f, -0.000361f, -0.046570f, 0.002555f, -0.033286f, -0.006516f, 0.017118f, -0.014136f, -0.020163f, -0.016135f, 0.009858f, 0.008194f, -0.018610f, 0.007426f, -0.006740f, 0.023017f, -0.011982f, -0.013434f, 0.011932f, 0.021508f, -0.002108f, 0.009398f, 0.008250f, -0.050799f, -0.001217f, -0.003708f, -0.025969f, 0.002726f, 0.033057f, 0.010122f, -0.009339f, -0.004058f, 0.024141f, 0.016999f, 0.010523f, -0.006818f, 0.038331f, 0.000401f, -0.031913f, 0.004288f, 0.038360f, + 0.019927f, 0.019463f, 0.011536f, 0.002071f, -0.009477f, -0.010893f, 0.006927f, 0.006220f, 0.009117f, 0.014392f, -0.003584f, 0.011361f, 0.006922f, 0.001109f, -0.001974f, -0.001193f, 0.005081f, -0.005212f, -0.002027f, -0.005169f, -0.000149f, -0.002452f, 0.005594f, -0.011600f, 0.001954f, 0.003929f, 0.001210f, 0.008819f, -0.015695f, -0.006555f, 0.002607f, 0.002978f, -0.001616f, 0.009025f, -0.003380f, -0.003028f, -0.004397f, 0.001017f, 0.005764f, 0.006837f, -0.008775f, 0.001267f, 0.003968f, -0.008010f, -0.005141f, -0.004435f, 0.020225f, -0.046566f, 0.019788f, -0.048222f, -0.057211f, -0.037011f, 0.002425f, -0.031579f, 0.030751f, -0.009683f, -0.038464f, -0.001339f, -0.009774f, 0.005186f, 0.007179f, -0.009012f, -0.004956f, 0.025337f, -0.007565f, 0.009643f, -0.013819f, -0.013809f, 0.040390f, -0.013635f, -0.004624f, -0.001250f, 0.009216f, 0.024849f, -0.050683f, -0.003469f, 0.027173f, 0.026175f, 0.024600f, 0.003206f, -0.009163f, 0.052124f, 0.017718f, 0.016398f, 0.020398f, 0.009225f, -0.007321f, 0.000323f, 0.030759f, 0.009891f, -0.021675f, 0.011447f, 0.056613f, -0.029917f, 0.039142f, 0.014293f, + -0.059673f, 0.014415f, 0.040165f, -0.004394f, 0.018101f, -0.000259f, -0.045207f, 0.022847f, 0.056425f, 0.003159f, 0.038396f, -0.023238f, 0.033981f, 0.028032f, -0.000836f, -0.005091f, 0.031203f, 0.016476f, -0.040852f, 0.040916f, -0.010037f, -0.009353f, 0.024920f, -0.012033f, -0.014633f, -0.018264f, 0.006474f, 0.002126f, 0.006912f, -0.001717f, -0.008196f, 0.030748f, -0.027380f, 0.004743f, -0.005591f, -0.008971f, -0.022357f, -0.021298f, 0.012652f, -0.001612f, -0.013740f, -0.018999f, -0.015871f, -0.027068f, -0.019152f, -0.001054f, -0.013232f, -0.007956f, -0.001894f, -0.014023f, 0.005996f, -0.012340f, -0.012672f, -0.003426f, 0.003224f, 0.004530f, -0.006335f, -0.000772f, -0.019888f, 0.007988f, -0.020865f, 0.016031f, -0.005289f, -0.001297f, -0.009106f, -0.004965f, -0.000952f, 0.024001f, 0.012083f, -0.002416f, 0.005785f, 0.016539f, 0.009038f, -0.008984f, -0.004217f, 0.006527f, -0.008128f, 0.013515f, 0.003091f, -0.005125f, -0.018130f, -0.032180f, 0.077282f, 0.038239f, -0.090116f, -0.037148f, 0.009565f, -0.014938f, 0.026034f, 0.030650f, 0.032889f, 0.037622f, -0.023113f, 0.071278f, -0.010727f, 0.001801f, + -0.023330f, 0.026862f, 0.035794f, -0.025793f, -0.029423f, -0.006187f, -0.016945f, 0.003173f, 0.014276f, 0.002211f, -0.018522f, -0.006992f, 0.029353f, -0.002331f, 0.014833f, 0.003592f, 0.035322f, 0.052951f, 0.020083f, -0.025440f, -0.059642f, -0.004988f, -0.010125f, 0.006733f, -0.013804f, 0.019697f, 0.033059f, 0.003012f, -0.012255f, -0.027226f, 0.065206f, 0.057047f, -0.007567f, 0.027870f, -0.015522f, -0.020811f, -0.062814f, 0.034749f, -0.029311f, -0.006726f, -0.001880f, -0.019603f, 0.011002f, 0.038611f, 0.005898f, -0.016993f, 0.018310f, -0.007846f, -0.025932f, 0.039483f, 0.008010f, -0.054641f, 0.070055f, -0.047427f, -0.025426f, 0.027126f, 0.027804f, 0.023337f, 0.000394f, -0.058364f, -0.005028f, 0.005163f, -0.003396f, -0.019154f, 0.011310f, -0.010000f, 0.004134f, 0.007286f, -0.024243f, 0.028042f, 0.019509f, 0.009422f, 0.003762f, -0.011459f, -0.008514f, -0.000536f, 0.009883f, 0.000893f, 0.007623f, -0.004552f, -0.018779f, 0.005706f, -0.027525f, -0.008703f, 0.008754f, -0.008116f, 0.015054f, -0.012739f, -0.001886f, -0.010823f, 0.011995f, 0.001062f, 0.014753f, 0.017165f, 0.011792f, 0.000508f, + -0.012994f, 0.009439f, 0.015957f, -0.003151f, -0.001867f, -0.017093f, -0.007545f, 0.019854f, -0.006787f, 0.013409f, -0.001165f, -0.007463f, 0.007036f, 0.006664f, -0.000410f, -0.011262f, 0.020507f, -0.024867f, 0.002773f, 0.035555f, 0.010544f, -0.048238f, -0.038693f, -0.009262f, 0.060354f, 0.006312f, -0.028984f, -0.077848f, -0.021657f, -0.003534f, 0.018485f, 0.053584f, 0.041050f, -0.005729f, 0.000509f, 0.035252f, 0.028686f, 0.001339f, 0.007866f, -0.105050f, -0.066236f, -0.032274f, -0.051905f, 0.004514f, -0.028953f, 0.046489f, -0.010642f, -0.003643f, -0.000227f, -0.018721f, -0.021377f, 0.033686f, 0.020991f, 0.011924f, -0.004763f, -0.016040f, -0.014367f, 0.016782f, -0.037646f, -0.014105f, 0.006660f, -0.013051f, -0.018334f, 0.015702f, -0.054414f, -0.076140f, 0.018109f, 0.023792f, 0.029551f, -0.044462f, -0.023642f, 0.024621f, 0.009348f, -0.074224f, -0.065191f, 0.003962f, -0.031550f, -0.032636f, 0.012140f, -0.059965f, 0.030431f, -0.023196f, 0.025009f, 0.023999f, -0.014876f, -0.033797f, -0.078099f, -0.027379f, -0.023463f, 0.043840f, -0.037892f, -0.024713f, 0.013367f, 0.044815f, 0.026124f, 0.000251f, + -0.015254f, -0.005019f, 0.013409f, -0.013439f, 0.045289f, -0.028063f, -0.021996f, -0.010630f, -0.003936f, 0.012452f, -0.033363f, 0.019650f, 0.015063f, -0.013976f, -0.023362f, 0.005435f, -0.001354f, 0.022747f, -0.029178f, -0.038059f, -0.009655f, 0.006023f, -0.021055f, -0.003170f, -0.025461f, 0.001102f, 0.006211f, -0.011457f, 0.017765f, -0.004786f, -0.012590f, 0.005518f, -0.008510f, 0.005183f, -0.007251f, -0.026450f, -0.001163f, 0.001942f, 0.025251f, 0.019806f, -0.012154f, 0.000091f, -0.001361f, -0.014933f, -0.019105f, 0.009266f, -0.004854f, 0.030880f, 0.042629f, -0.006877f, -0.057109f, 0.025858f, -0.008473f, -0.023922f, -0.049215f, 0.014679f, 0.021218f, -0.073191f, 0.027753f, 0.025972f, 0.066110f, 0.005948f, -0.016403f, 0.004073f, -0.080608f, -0.023463f, -0.009673f, 0.001046f, 0.014917f, -0.027605f, 0.049628f, 0.019817f, 0.061311f, -0.012286f, 0.053947f, 0.034550f, 0.021410f, 0.049046f, 0.024965f, 0.032367f, 0.041804f, 0.001825f, -0.054432f, -0.051480f, 0.010613f, 0.058942f, 0.042691f, -0.078531f, -0.002151f, -0.013301f, -0.010934f, -0.008243f, -0.054301f, 0.013936f, -0.038651f, 0.034884f, + -0.025822f, 0.078713f, -0.020597f, -0.112924f, -0.011901f, -0.038915f, 0.022567f, 0.016770f, 0.032280f, 0.073288f, 0.016492f, -0.009954f, 0.040246f, -0.023688f, 0.082009f, 0.013787f, 0.054909f, 0.025762f, 0.005120f, -0.020756f, -0.018658f, 0.134402f, 0.000931f, -0.092767f, -0.018521f, 0.074154f, -0.044180f, 0.009735f, -0.020307f, 0.032562f, 0.068220f, 0.039319f, -0.078414f, -0.005060f, -0.077191f, 0.010760f, -0.010522f, -0.045769f, -0.005259f, -0.012362f, -0.020133f, -0.000096f, -0.039455f, -0.043459f, 0.015203f, 0.016452f, -0.002000f, -0.048637f, 0.035324f, -0.043089f, -0.066609f, -0.028408f, 0.016797f, -0.016522f, -0.029586f, -0.038278f, 0.007216f, 0.016241f, -0.034586f, -0.026508f, 0.013067f, -0.015341f, -0.027865f, 0.022969f, 0.018482f, -0.001608f, -0.003319f, 0.001366f, -0.006218f, -0.011422f, -0.012026f, 0.004520f, -0.025689f, 0.015252f, -0.009041f, 0.005829f, -0.032714f, 0.036997f, 0.016022f, -0.076777f, -0.028803f, -0.087189f, 0.013292f, 0.076855f, -0.056630f, -0.053104f, 0.050782f, 0.023875f, -0.086917f, -0.082370f, 0.026411f, 0.004360f, 0.012094f, 0.028042f, -0.003431f, -0.024730f, + -0.012574f, 0.052636f, -0.037684f, 0.064995f, 0.010595f, -0.015219f, 0.013896f, 0.037551f, -0.000123f, -0.011242f, -0.069549f, -0.030524f, 0.007733f, -0.037273f, 0.032174f, 0.048041f, 0.003482f, 0.007956f, -0.049751f, 0.059354f, -0.020827f, -0.026528f, 0.048421f, -0.018593f, 0.000119f, -0.034711f, -0.003507f, -0.024401f, -0.085521f, 0.029370f, -0.009560f, 0.063595f, 0.081579f, -0.001185f, -0.014536f, -0.051684f, -0.016317f, -0.014379f, 0.077633f, -0.073769f, -0.052059f, -0.122284f, 0.002893f, -0.050619f, 0.014069f, 0.042444f, -0.022850f, -0.006370f, 0.083456f, 0.053822f, 0.038079f, 0.006586f, 0.003847f, 0.063330f, -0.068623f, -0.002979f, 0.019533f, -0.008100f, 0.037919f, 0.018188f, 0.161032f, 0.025466f, -0.043946f, -0.002462f, -0.030101f, -0.079342f, -0.031416f, 0.002961f, 0.013513f, -0.015277f, -0.016421f, -0.015016f, -0.056661f, -0.000709f, -0.004634f, -0.030097f, 0.008065f, 0.020218f, -0.048570f, 0.003193f, -0.032941f, 0.012927f, -0.002214f, -0.011442f, -0.006504f, 0.002832f, 0.028681f, 0.016729f, 0.001327f, 0.031737f, -0.019445f, -0.004095f, -0.009225f, 0.029873f, 0.020027f, 0.014225f, + 0.030749f, 0.014309f, -0.021852f, -0.010491f, -0.003532f, 0.015241f, -0.027504f, -0.007070f, 0.000952f, -0.031058f, -0.009599f, 0.005675f, 0.074445f, -0.054685f, 0.018975f, -0.018776f, -0.026542f, -0.025881f, 0.112524f, -0.015093f, 0.055250f, -0.044615f, 0.076780f, -0.026636f, 0.001153f, 0.041352f, 0.044358f, 0.105863f, 0.005085f, 0.017300f, 0.015583f, -0.044981f, 0.054701f, 0.016920f, -0.032076f, 0.053258f, -0.022205f, 0.067080f, 0.051327f, -0.015874f, 0.044676f, 0.002059f, 0.041728f, 0.008371f, 0.070713f, -0.043132f, 0.035350f, -0.071373f, -0.017731f, 0.023968f, 0.076669f, -0.003352f, 0.006356f, 0.032971f, -0.000063f, -0.025784f, -0.091914f, -0.056933f, 0.015967f, -0.039538f, -0.001517f, 0.029116f, -0.080035f, 0.049142f, -0.003267f, 0.058439f, -0.027534f, -0.054606f, -0.009255f, 0.151004f, 0.034564f, -0.137327f, 0.024490f, 0.035011f, 0.008864f, 0.149512f, -0.008717f, -0.110057f, 0.114554f, -0.038479f, -0.007039f, 0.125140f, -0.013107f, 0.082340f, 0.013607f, -0.074282f, 0.003519f, 0.127949f, -0.103997f, 0.054875f, -0.063579f, -0.072037f, 0.053861f, 0.032292f, -0.065589f, -0.024073f, + -0.040575f, -0.022133f, -0.023537f, 0.012069f, -0.039968f, -0.008160f, 0.016574f, -0.041290f, -0.029273f, 0.021711f, -0.048121f, -0.011646f, 0.017669f, 0.006941f, -0.010682f, 0.036688f, -0.015245f, -0.012113f, -0.017071f, -0.032752f, 0.016598f, -0.021020f, -0.023949f, -0.005521f, 0.004866f, 0.048944f, 0.000836f, 0.014077f, -0.039537f, 0.004444f, 0.052227f, -0.009297f, -0.005458f, -0.003733f, 0.003223f, 0.003965f, 0.036721f, -0.018672f, -0.021413f, -0.010653f, -0.033677f, -0.040485f, 0.011651f, -0.019942f, 0.008999f, 0.013328f, -0.005274f, -0.110403f, -0.008387f, 0.017399f, -0.041257f, -0.011691f, -0.115874f, 0.073770f, 0.112787f, -0.049148f, 0.016068f, -0.085370f, -0.250249f, -0.047491f, 0.011744f, 0.127530f, 0.106843f, -0.104074f, -0.093002f, -0.093449f, -0.076979f, -0.053982f, 0.066399f, -0.010981f, 0.146110f, 0.099341f, -0.029225f, -0.120197f, -0.301726f, -0.194869f, 0.013809f, 0.335670f, 0.255193f, 0.047303f, -0.131314f, -0.329217f, -0.337640f, -0.023978f, 0.196919f, 0.304910f, 0.333831f, 0.035043f, -0.107685f, -0.135913f, -0.180901f, -0.162437f, 0.011172f, 0.113456f, 0.210252f, 0.145297f, + 0.115787f, -0.149828f, -0.184240f, -0.216013f, -0.260730f, 0.029940f, 0.313079f, 0.309027f, 0.062997f, -0.110626f, -0.293115f, -0.384056f, -0.129791f, 0.030308f, 0.143349f, 0.351700f, 0.129591f, -0.000225f, -0.193288f, -0.157818f, -0.066386f, 0.080397f, 0.137634f, 0.241585f, 0.063382f, 0.126408f, -0.009833f, -0.161123f, -0.133406f, 0.008007f, 0.155933f, 0.170213f, -0.077035f, -0.147250f, -0.180680f, -0.045012f, 0.029926f, 0.043257f, 0.027953f, -0.090103f, -0.077963f, -0.032134f, 0.058160f, 0.000229f, 0.001244f, 0.013140f, 0.046597f, 0.037606f, 0.029207f, -0.015707f, -0.109870f, -0.073062f, 0.008571f, 0.056989f, 0.105576f, 0.051161f, -0.029413f, -0.069656f, -0.091984f, -0.057639f, -0.036764f, -0.048197f, 0.105888f, 0.110496f, 0.121359f, 0.100694f, -0.046386f, -0.192847f, -0.163313f, -0.088040f, 0.074774f, 0.244135f, 0.236756f, 0.013376f, -0.149039f, -0.233417f, -0.209940f, -0.013601f, 0.117013f, 0.109968f, 0.053630f, 0.048353f, 0.003074f, -0.062589f, -0.074889f, -0.094936f, -0.014010f, 0.088896f, 0.109335f, -0.029740f, 0.053864f, 0.041415f, -0.094987f, 0.001037f, 0.048856f, -0.039245f, + 0.054002f, -0.002193f, -0.009904f, -0.003874f, 0.010883f, 0.041057f, -0.016138f, 0.048382f, 0.032886f, 0.019710f, 0.021881f, 0.016625f, -0.004204f, -0.027679f, 0.045220f, -0.000594f, 0.027585f, -0.016444f, 0.024559f, -0.008435f, -0.003543f, 0.016726f, -0.022398f, -0.023577f, 0.003452f, -0.010122f, 0.036599f, 0.036223f, -0.033192f, 0.016590f, -0.019781f, 0.022799f, 0.000452f, 0.014985f, 0.005659f, 0.019440f, -0.023647f, 0.016422f, -0.027211f, -0.011744f, -0.003803f, -0.003016f, 0.021919f, -0.041412f, -0.008226f, -0.017059f, -0.036949f, -0.003211f, -0.014548f, 0.008887f, 0.035119f, -0.010503f, -0.048797f, 0.007904f, 0.030209f, 0.059101f, -0.002636f, 0.005266f, -0.031872f, -0.024118f, 0.027438f, 0.002561f, -0.010477f, 0.000893f, 0.048140f, 0.021396f, 0.015154f, 0.026090f, 0.044354f, -0.050272f, 0.020031f, -0.008536f, -0.075152f, -0.008695f, 0.058041f, -0.010717f, 0.051631f, -0.002258f, 0.032040f, -0.037949f, 0.023429f, -0.025799f, -0.007747f, 0.050958f, -0.014704f, 0.004740f, 0.000999f, -0.000177f, 0.018540f, -0.000036f, -0.007698f, -0.004292f, -0.001483f, -0.003564f, 0.009241f, 0.014634f, + 0.021251f, 0.002443f, -0.018338f, -0.008207f, -0.023688f, 0.008894f, -0.024559f, 0.013229f, 0.009968f, -0.007553f, 0.013596f, 0.004364f, -0.025472f, 0.000398f, -0.000142f, 0.008075f, -0.043671f, 0.015192f, 0.009546f, 0.003771f, -0.001309f, -0.012074f, 0.014130f, -0.022079f, 0.022087f, -0.001793f, -0.002820f, 0.005914f, -0.010783f, 0.018703f, -0.021212f, 0.005812f, 0.010555f, -0.034650f, 0.088562f, 0.152586f, 0.013041f, -0.099828f, 0.033504f, -0.007518f, 0.123733f, 0.058121f, 0.121629f, -0.011450f, -0.057761f, -0.015731f, 0.027004f, 0.051101f, 0.040022f, -0.022552f, 0.003962f, 0.021689f, 0.015798f, 0.048273f, -0.033717f, 0.008125f, -0.045482f, -0.007394f, 0.000700f, 0.011678f, 0.023788f, 0.005183f, -0.019358f, 0.036958f, -0.003347f, -0.032717f, 0.044669f, -0.007657f, -0.015885f, 0.011811f, -0.006560f, 0.034688f, 0.055464f, 0.001326f, 0.014546f, -0.018667f, -0.011550f, 0.032009f, 0.023287f, 0.026501f, 0.005345f, -0.016862f, -0.034747f, -0.035789f, -0.038773f, 0.031061f, 0.034257f, 0.033460f, 0.050044f, 0.053483f, 0.023233f, 0.002797f, -0.046646f, 0.028621f, -0.004920f, -0.042457f, + 0.052501f, -0.003878f, 0.034560f, 0.018036f, -0.052431f, 0.014506f, -0.015510f, 0.011204f, 0.035620f, 0.006616f, -0.043809f, -0.031211f, -0.025800f, -0.046046f, 0.028122f, -0.002849f, 0.048458f, -0.000519f, 0.007981f, 0.000944f, -0.026043f, -0.016846f, 0.009261f, -0.039507f, 0.012012f, -0.000430f, -0.007594f, 0.014213f, -0.021871f, 0.013335f, 0.008744f, -0.001797f, -0.018512f, 0.024344f, -0.006096f, 0.021591f, -0.036438f, -0.026906f, -0.015816f, -0.014169f, 0.017291f, -0.007289f, -0.004468f, -0.004672f, -0.018222f, -0.009947f, -0.011185f, 0.000010f, 0.033857f, 0.004495f, -0.008568f, -0.000567f, -0.019654f, 0.014321f, -0.010928f, -0.001946f, -0.007483f, 0.016048f, -0.001381f, 0.002112f, -0.003405f, -0.011653f, -0.007903f, -0.053928f, -0.120350f, 0.008092f, 0.166909f, 0.220475f, 0.189432f, 0.130488f, -0.005429f, 0.008017f, -0.096354f, -0.114900f, -0.192755f, -0.145851f, -0.154738f, -0.050291f, 0.013197f, 0.050334f, 0.084873f, 0.210253f, 0.175156f, 0.117766f, 0.038302f, -0.018673f, -0.075929f, -0.056752f, -0.078951f, -0.100688f, -0.055822f, -0.057637f, -0.070680f, -0.033085f, -0.046463f, 0.009750f, + 0.033037f, 0.027531f, 0.089741f, 0.082605f, 0.073536f, 0.047891f, 0.055731f, 0.034867f, 0.066721f, 0.015923f, 0.057747f, 0.002431f, -0.014922f, -0.100676f, -0.043602f, -0.121317f, -0.140758f, -0.157705f, -0.123402f, -0.092935f, -0.032761f, 0.023648f, 0.090699f, 0.096353f, 0.076214f, 0.156421f, 0.127047f, 0.135475f, 0.125761f, 0.117057f, 0.047206f, 0.075652f, -0.030262f, -0.075559f, -0.078909f, -0.186297f, -0.185857f, -0.179874f, -0.191087f, -0.157869f, -0.053754f, -0.026710f, 0.042643f, 0.106587f, 0.116467f, 0.141946f, 0.171333f, 0.152532f, 0.119183f, 0.107968f, 0.079810f, 0.029590f, -0.002774f, -0.064238f, -0.094109f, -0.095270f, -0.108301f, -0.091194f, -0.101864f, -0.106568f, -0.089604f, -0.070148f, -0.034842f, 0.003930f, 0.046545f, 0.089036f, 0.083795f, 0.082219f, 0.097435f, 0.107195f, 0.083398f, 0.083066f, 0.037426f, -0.039341f, -0.028320f, -0.068973f, -0.087161f, -0.073257f, -0.059743f, -0.042485f, -0.052796f, -0.038727f, 0.004901f, 0.010831f, 0.018871f, 0.046838f, 0.041794f, 0.026020f, 0.006819f, 0.017428f, 0.018401f, 0.005013f, 0.023209f, -0.014671f, -0.015454f, -0.013126f, + 0.008961f, -0.003020f, 0.000760f, -0.001714f, -0.002669f, -0.017645f, -0.011616f, -0.005574f, 0.016843f, -0.000677f, 0.007961f, 0.001837f, -0.008613f, -0.011707f, -0.005322f, -0.008485f, 0.002721f, -0.001242f, 0.003175f, 0.000858f, 0.004170f, -0.005234f, 0.004205f, -0.003965f, 0.001143f, 0.000845f, 0.007884f, -0.000970f, 0.004468f, -0.002981f, 0.003164f} + }, + { + {0.019357f, 0.010286f, -0.001158f, 0.006752f, 0.001689f, 0.001541f, -0.021194f, -0.009223f, -0.010498f, 0.008258f, -0.001136f, -0.006887f, 0.007508f, 0.007751f, 0.000509f, 0.007442f, -0.003109f, -0.000256f, -0.000437f, -0.004595f, -0.002392f, -0.010186f, 0.005264f, -0.015060f, 0.006289f, -0.007856f, 0.006412f, 0.011973f, 0.005466f, -0.002282f, -0.003386f, 0.008847f, -0.001427f, 0.000409f, 0.008374f, -0.008973f, -0.000262f, -0.003037f, -0.005167f, 0.001097f, -0.001257f, 0.001853f, 0.008583f, 0.014144f, -0.004495f, 0.000253f, 0.011748f, 0.000891f, 0.003090f, -0.004329f, -0.006584f, -0.000970f, 0.001974f, -0.011100f, -0.002914f, 0.005798f, 0.000754f, 0.002093f, 0.003444f, -0.001595f, -0.003469f, -0.003283f, -0.003891f, 0.004291f, 0.003516f, -0.002048f, -0.006360f, -0.007821f, 0.003864f, 0.000068f, -0.006491f, 0.006847f, -0.001496f, -0.000457f, 0.001044f, 0.001932f, -0.003239f, 0.004095f, -0.004361f, -0.001476f, 0.005358f, -0.003703f, 0.002135f, -0.006267f, -0.004792f, -0.002309f, -0.001552f, -0.000403f, 0.000847f, -0.002529f, -0.003164f, -0.000320f, -0.001802f, 0.000705f, -0.000668f, -0.000576f, + -0.000863f, 0.000667f, 0.000186f, -0.000665f, -0.001292f, -0.000782f, -0.000481f, -0.000122f, -0.000700f, -0.000451f, -0.000988f, 0.000903f, -0.001448f, -0.000899f, -0.006957f, -0.001912f, 0.000055f, -0.006590f, -0.006667f, -0.004000f, 0.015998f, -0.011237f, -0.004620f, -0.007847f, -0.014288f, 0.005336f, 0.002450f, 0.000556f, 0.012266f, 0.011613f, 0.011638f, 0.003758f, -0.002177f, 0.001800f, 0.008773f, -0.003753f, 0.003784f, 0.004432f, -0.010350f, 0.014737f, 0.002859f, 0.004583f, 0.010899f, -0.004193f, -0.010875f, 0.000733f, 0.007386f, -0.005207f, -0.002362f, -0.006942f, 0.007351f, -0.000191f, -0.000749f, -0.012065f, -0.000523f, -0.001468f, 0.007428f, 0.003792f, -0.006616f, 0.013195f, 0.004870f, 0.002744f, 0.004623f, -0.002155f, 0.007399f, -0.002885f, 0.000365f, -0.009213f, -0.011003f, 0.008818f, 0.006907f, 0.012217f, 0.001193f, 0.003294f, -0.009464f, -0.014651f, -0.007192f, -0.004398f, -0.004268f, -0.006771f, -0.005831f, 0.003017f, -0.001697f, 0.004442f, -0.005500f, -0.002110f, 0.002414f, 0.002731f, -0.001654f, 0.007452f, 0.002264f, -0.005602f, 0.011253f, -0.004417f, 0.003461f, 0.014197f, + 0.003028f, 0.001945f, -0.004404f, 0.000195f, -0.004836f, -0.005780f, -0.000932f, 0.003265f, -0.000067f, 0.000417f, 0.000176f, -0.001569f, -0.000503f, 0.000139f, -0.001420f, 0.003327f, 0.002133f, -0.001249f, -0.000308f, 0.000093f, 0.000873f, 0.000469f, -0.002214f, -0.001198f, -0.000534f, 0.000243f, 0.000985f, -0.001033f, -0.001593f, 0.001367f, -0.000820f, 0.001048f, -0.000571f, -0.000884f, -0.001108f, -0.013779f, -0.012835f, 0.007521f, 0.001720f, 0.010535f, -0.016281f, -0.002300f, -0.006468f, 0.001748f, 0.019403f, 0.011069f, -0.016951f, 0.006417f, 0.001620f, -0.007072f, -0.007857f, -0.009618f, -0.015606f, 0.000557f, 0.001885f, -0.005790f, 0.002789f, -0.003337f, 0.000612f, 0.004711f, 0.003655f, 0.010069f, -0.008791f, 0.015853f, -0.009648f, 0.009207f, 0.007321f, -0.005936f, 0.004292f, 0.000770f, 0.006607f, -0.002636f, 0.003463f, 0.006047f, 0.002040f, 0.000943f, -0.002400f, 0.004714f, 0.001437f, -0.002102f, 0.011301f, -0.014740f, 0.001039f, -0.008927f, 0.017780f, 0.006275f, -0.015473f, 0.006030f, 0.020326f, -0.019074f, -0.009071f, 0.002305f, -0.001540f, -0.007228f, 0.006079f, -0.002527f, + 0.013545f, -0.011363f, -0.001105f, -0.003752f, -0.000761f, -0.000680f, 0.013090f, -0.012110f, -0.004000f, -0.001304f, -0.012495f, 0.006761f, 0.005244f, 0.013516f, 0.005521f, 0.011510f, 0.010386f, 0.001718f, -0.004162f, 0.003269f, -0.000345f, -0.001428f, -0.003097f, -0.000282f, -0.004754f, -0.001894f, -0.001059f, -0.006668f, 0.004266f, 0.000371f, -0.004644f, -0.000773f, -0.003762f, 0.000368f, -0.000146f, 0.002588f, -0.000884f, -0.001494f, 0.000335f, -0.002133f, -0.000059f, 0.002237f, 0.000833f, -0.000469f, -0.001494f, 0.006140f, -0.009486f, 0.001205f, -0.005961f, 0.006287f, 0.002240f, -0.009548f, 0.027592f, -0.017553f, 0.005515f, 0.029890f, -0.021135f, 0.009837f, -0.000580f, 0.009775f, -0.002622f, -0.018065f, -0.003983f, 0.014918f, 0.013343f, 0.003699f, -0.000156f, 0.007553f, 0.003675f, 0.000273f, 0.006223f, 0.006281f, -0.005216f, 0.008003f, -0.002249f, 0.012614f, -0.010190f, -0.015685f, 0.003322f, -0.013693f, 0.004701f, 0.000257f, -0.003942f, -0.004383f, -0.006278f, -0.009319f, 0.001785f, 0.003285f, 0.000308f, 0.002370f, 0.002690f, -0.005746f, -0.012048f, 0.009455f, 0.002095f, 0.001551f, + -0.000611f, 0.013894f, 0.002775f, 0.005818f, 0.014660f, -0.009019f, 0.003537f, 0.000587f, 0.004410f, 0.010280f, 0.008037f, -0.013399f, -0.011758f, -0.003027f, -0.006726f, -0.001544f, 0.000461f, -0.005771f, 0.003048f, -0.010715f, 0.000509f, -0.010310f, 0.005082f, 0.005047f, -0.005982f, -0.007843f, 0.000860f, 0.004303f, 0.000788f, -0.009065f, 0.001268f, -0.005190f, 0.003889f, 0.003229f, 0.001444f, -0.001701f, -0.002550f, 0.001802f, -0.000269f, -0.000976f, -0.000064f, -0.002338f, -0.001970f, -0.006221f, -0.001544f, 0.005669f, 0.002479f, -0.001627f, -0.001128f, 0.003958f, -0.001364f, 0.001189f, -0.001755f, 0.000071f, -0.000441f, 0.000212f, -0.002254f, -0.001497f, -0.000860f, -0.000644f, -0.000813f, -0.000938f, 0.000189f, -0.000619f, -0.001423f, -0.001168f, 0.000750f, 0.008712f, -0.003725f, 0.007889f, -0.001488f, 0.003933f, -0.004533f, 0.000540f, -0.002977f, 0.002620f, -0.001433f, -0.017223f, 0.013080f, 0.008393f, 0.021574f, -0.014157f, 0.008834f, -0.017515f, -0.003010f, 0.010684f, 0.011561f, -0.012293f, 0.003517f, -0.014241f, 0.001052f, -0.016698f, 0.005468f, -0.012509f, -0.015524f, -0.013889f, + 0.006971f, -0.011222f, 0.000483f, -0.013161f, 0.001708f, 0.001933f, -0.001987f, -0.009635f, 0.006046f, 0.008457f, 0.005035f, 0.003938f, -0.010301f, 0.005601f, -0.010803f, -0.003416f, 0.006623f, 0.000214f, -0.001502f, -0.002909f, -0.000422f, 0.006851f, -0.007971f, -0.015360f, -0.003252f, 0.004727f, -0.003251f, -0.011389f, -0.011521f, -0.016333f, 0.003899f, -0.004711f, -0.015298f, 0.010933f, -0.009808f, -0.009612f, 0.018471f, -0.006680f, -0.003656f, 0.001511f, -0.003357f, -0.006028f, 0.001483f, -0.010140f, -0.005034f, -0.008531f, -0.006738f, -0.002800f, 0.005494f, 0.013991f, 0.000699f, 0.008409f, 0.000690f, 0.006275f, 0.004347f, 0.011303f, -0.000840f, -0.000254f, 0.001147f, 0.004179f, -0.002319f, 0.000484f, -0.001127f, 0.008266f, -0.000345f, 0.003993f, 0.000573f, 0.001593f, -0.001439f, 0.001848f, -0.005098f, 0.005541f, 0.000101f, 0.000110f, -0.004176f, -0.001052f, -0.005632f, 0.002659f, -0.002897f, 0.001905f, -0.000791f, 0.005590f, -0.002762f, 0.001107f, -0.004910f, -0.003905f, -0.000407f, -0.001698f, 0.001313f, 0.014272f, -0.020560f, 0.003702f, 0.017986f, -0.006672f, 0.019698f, 0.005488f, + 0.001242f, -0.005713f, -0.013757f, -0.009050f, 0.023450f, -0.012598f, -0.000110f, -0.004354f, 0.001832f, 0.014115f, 0.012680f, -0.007685f, 0.018318f, 0.018291f, -0.008624f, -0.004510f, 0.011140f, -0.009413f, -0.008241f, -0.000591f, -0.012658f, -0.000285f, -0.003737f, 0.001633f, 0.021977f, 0.007503f, 0.001185f, -0.010075f, -0.029237f, -0.003563f, 0.016425f, 0.004032f, -0.010959f, 0.008405f, 0.013351f, 0.011666f, 0.014106f, -0.023103f, 0.004668f, 0.001123f, -0.011467f, 0.006216f, -0.010321f, 0.007350f, -0.005824f, 0.009116f, 0.020490f, 0.027085f, 0.017094f, 0.007855f, -0.011238f, -0.003101f, -0.013413f, -0.014098f, -0.002970f, 0.015881f, 0.003905f, 0.000250f, 0.003737f, -0.015545f, 0.004037f, 0.001934f, -0.000143f, -0.007868f, 0.004209f, 0.008507f, -0.008995f, -0.016951f, 0.038604f, 0.004988f, -0.006917f, 0.002382f, 0.004154f, 0.017590f, -0.003544f, 0.004840f, 0.005995f, 0.008731f, -0.006076f, -0.002979f, -0.006560f, 0.003115f, -0.001818f, 0.003435f, 0.003201f, -0.002279f, -0.003592f, 0.006547f, 0.000871f, 0.001731f, -0.001250f, 0.003957f, -0.006793f, -0.004845f, -0.003270f, -0.001205f, + 0.007545f, 0.002779f, 0.005044f, 0.003850f, 0.003954f, 0.000280f, 0.000876f, -0.001680f, -0.004760f, 0.004654f, 0.001121f, 0.001968f, -0.003318f, -0.010635f, -0.002987f, -0.006525f, -0.002481f, 0.004943f, -0.006697f, 0.030446f, -0.002992f, 0.008578f, 0.021869f, 0.002858f, -0.003240f, -0.014304f, 0.008057f, -0.007726f, -0.009631f, -0.028905f, -0.012894f, 0.005806f, -0.001501f, -0.005601f, -0.020826f, 0.007279f, 0.011547f, -0.016436f, -0.008537f, -0.004423f, -0.017143f, 0.006842f, 0.001278f, -0.009107f, -0.007414f, -0.003144f, -0.023177f, -0.008292f, 0.011585f, 0.019308f, -0.014565f, -0.018298f, -0.005239f, -0.001080f, -0.014783f, -0.012220f, 0.004729f, 0.008129f, -0.016199f, 0.032592f, 0.000245f, 0.013249f, -0.007330f, 0.012449f, -0.008345f, 0.003745f, -0.023046f, -0.004882f, 0.009545f, -0.023153f, 0.006458f, -0.005239f, -0.011682f, -0.026290f, -0.000468f, 0.014577f, 0.000333f, -0.027730f, -0.004064f, 0.005033f, 0.011281f, 0.020327f, -0.007351f, 0.009092f, 0.023888f, 0.007921f, 0.003045f, -0.010815f, -0.001904f, -0.006752f, 0.001563f, -0.008046f, 0.001998f, -0.015189f, -0.001851f, 0.011622f, + 0.003488f, 0.002253f, -0.006439f, -0.011778f, 0.006709f, -0.002183f, 0.006921f, -0.002513f, 0.001063f, -0.001535f, -0.003218f, -0.003138f, 0.004566f, 0.001699f, -0.000689f, -0.001560f, 0.000334f, -0.004580f, 0.002334f, -0.004677f, -0.005643f, -0.003680f, 0.002257f, 0.000274f, 0.000224f, -0.004415f, 0.003666f, -0.000557f, -0.002075f, -0.006238f, -0.001756f, 0.000389f, 0.001032f, 0.002528f, 0.006838f, 0.002101f, 0.001751f, 0.003336f, 0.009006f, -0.002950f, -0.008989f, 0.010958f, 0.002010f, -0.016950f, -0.026463f, -0.021726f, -0.027390f, 0.023573f, -0.014292f, -0.003609f, 0.007837f, -0.026057f, -0.010710f, -0.018156f, -0.007976f, -0.005867f, 0.011829f, -0.022846f, -0.012070f, 0.007153f, 0.009087f, 0.013027f, -0.000129f, 0.000339f, -0.003987f, -0.000147f, -0.005272f, 0.003153f, -0.017970f, -0.009814f, -0.015795f, 0.010907f, 0.005543f, 0.008424f, 0.011134f, -0.022049f, -0.001508f, -0.002476f, 0.020034f, -0.007614f, 0.006357f, 0.010760f, -0.004019f, 0.011528f, -0.007554f, 0.012866f, 0.018280f, -0.007232f, -0.001187f, 0.015512f, -0.013290f, 0.021493f, -0.009186f, -0.034478f, 0.005409f, 0.017684f, + -0.006734f, 0.001936f, -0.000530f, 0.013541f, 0.017179f, -0.017479f, -0.007509f, 0.003945f, 0.011846f, -0.020540f, -0.015451f, -0.012516f, 0.024808f, -0.000699f, -0.028333f, -0.006271f, -0.011759f, 0.009591f, 0.001328f, 0.007217f, -0.010610f, 0.017438f, 0.000792f, 0.003036f, 0.005106f, -0.016338f, -0.005480f, 0.001102f, -0.001989f, -0.004195f, -0.004678f, 0.004437f, -0.004455f, -0.004490f, 0.003476f, 0.005072f, 0.002698f, -0.009641f, -0.000820f, -0.003906f, -0.002748f, 0.003851f, 0.003552f, 0.007906f, -0.001065f, -0.004041f, 0.003102f, -0.009059f, -0.001023f, -0.000172f, -0.005811f, 0.000700f, 0.000585f, -0.002316f, 0.001146f, -0.010283f, -0.001822f, -0.001319f, 0.001180f, 0.001207f, 0.004306f, -0.000635f, 0.004831f, 0.002637f, 0.002504f, 0.000234f, -0.015942f, -0.006453f, 0.010950f, 0.004054f, 0.015688f, 0.005381f, 0.007675f, -0.030810f, -0.012073f, 0.012022f, -0.008117f, -0.005813f, -0.010265f, 0.003156f, 0.016052f, 0.004211f, 0.003825f, -0.020642f, -0.006981f, -0.003768f, 0.007652f, 0.018126f, -0.022016f, 0.010379f, -0.017947f, -0.004773f, -0.016510f, 0.002118f, 0.002287f, -0.000842f, + 0.006896f, -0.015416f, -0.004442f, -0.014447f, -0.005941f, 0.000259f, -0.000668f, -0.018143f, 0.010397f, 0.011643f, -0.004340f, 0.013817f, 0.027177f, 0.002784f, 0.020586f, 0.026403f, 0.002076f, 0.000851f, 0.006368f, -0.005555f, 0.008751f, 0.001787f, -0.005783f, -0.008904f, 0.033167f, -0.003454f, 0.019381f, 0.008568f, -0.009782f, -0.011355f, -0.007906f, 0.009264f, -0.007580f, 0.012041f, 0.029213f, 0.014803f, -0.003885f, 0.000465f, -0.024504f, -0.016889f, -0.014951f, 0.022988f, 0.036091f, -0.015853f, -0.000146f, -0.014669f, -0.002425f, 0.022064f, -0.006989f, -0.001353f, -0.034828f, -0.004670f, -0.006354f, -0.003706f, 0.013205f, 0.000924f, 0.002734f, 0.004013f, -0.007001f, 0.005530f, 0.002940f, 0.004926f, -0.004187f, 0.007146f, -0.003462f, -0.000811f, -0.008839f, -0.002104f, 0.007658f, -0.002849f, -0.000250f, -0.001523f, 0.007350f, -0.001894f, -0.005368f, 0.003098f, 0.003251f, 0.001855f, 0.002553f, 0.002695f, -0.002922f, 0.000722f, 0.005177f, 0.008986f, 0.007778f, 0.005036f, 0.002709f, 0.000531f, 0.000654f, -0.005650f, -0.000541f, 0.003533f, -0.003486f, 0.003722f, -0.001305f, 0.001277f, + 0.004860f, -0.002143f, 0.020841f, 0.057787f, 0.025187f, -0.007854f, -0.002006f, -0.010736f, 0.026633f, -0.026682f, -0.015163f, -0.040793f, -0.000470f, 0.020115f, 0.025024f, 0.004507f, -0.009936f, -0.024456f, -0.017897f, 0.018022f, -0.003663f, 0.028624f, -0.000086f, -0.009194f, 0.013506f, 0.004922f, -0.000250f, -0.007119f, 0.018681f, -0.003475f, 0.016137f, -0.000258f, -0.008806f, 0.035216f, -0.008430f, 0.014283f, 0.034612f, 0.012171f, -0.001470f, -0.016923f, -0.003197f, -0.027564f, -0.032300f, 0.007028f, 0.020669f, -0.004966f, 0.002887f, -0.035247f, -0.013414f, 0.020413f, 0.011048f, -0.009138f, 0.006734f, -0.010460f, -0.005089f, -0.016077f, -0.027030f, 0.001626f, -0.006395f, -0.019081f, -0.031197f, -0.026894f, -0.008778f, -0.024705f, 0.011341f, -0.011065f, 0.003892f, 0.003190f, -0.000217f, 0.000588f, -0.004029f, -0.005540f, 0.015962f, 0.031782f, -0.021461f, 0.003877f, -0.009040f, 0.011489f, -0.011997f, -0.000478f, -0.008674f, -0.003908f, 0.029211f, 0.021251f, 0.004753f, -0.003297f, 0.000257f, -0.011966f, 0.004095f, 0.011909f, -0.002309f, -0.010350f, -0.005953f, 0.010311f, -0.012540f, 0.001139f, + 0.005285f, 0.004998f, -0.004440f, -0.003993f, 0.004424f, 0.005618f, -0.004352f, 0.006692f, 0.003822f, 0.005550f, -0.000644f, 0.007329f, -0.000833f, 0.004635f, 0.002228f, 0.002726f, 0.001631f, -0.001621f, 0.008566f, -0.008479f, -0.001317f, 0.001846f, -0.002608f, -0.002157f, -0.004054f, 0.003837f, 0.000278f, -0.007311f, -0.002815f, 0.004772f, -0.005324f, -0.023809f, -0.026934f, 0.006992f, 0.010344f, 0.032324f, -0.027311f, 0.008732f, 0.008402f, -0.045492f, -0.002092f, 0.000340f, -0.038003f, -0.020694f, -0.013426f, 0.009727f, -0.003016f, 0.002327f, -0.010704f, 0.016051f, 0.025227f, 0.013315f, -0.003553f, -0.038570f, -0.016783f, -0.020951f, 0.007870f, 0.002409f, -0.016903f, -0.001272f, 0.013333f, -0.011196f, 0.023012f, -0.020663f, -0.000580f, -0.012027f, -0.038556f, 0.006629f, -0.016393f, -0.018481f, 0.014406f, 0.021360f, -0.023882f, 0.009299f, 0.028260f, -0.009176f, 0.012403f, 0.009723f, -0.006583f, 0.003885f, -0.031300f, 0.047470f, 0.018707f, 0.011271f, 0.045334f, -0.055246f, -0.004111f, -0.007615f, 0.005899f, 0.022595f, 0.023468f, 0.009034f, 0.011209f, 0.029000f, -0.002733f, -0.019659f, + -0.034168f, 0.013270f, -0.012906f, 0.001303f, 0.009279f, -0.006815f, 0.014005f, 0.037137f, -0.022877f, 0.017317f, -0.011080f, -0.010619f, 0.028088f, 0.002138f, 0.008774f, 0.027231f, 0.022486f, -0.009881f, -0.011362f, -0.023956f, -0.006031f, 0.000119f, 0.012506f, 0.013099f, 0.000047f, 0.003106f, 0.001900f, -0.000480f, 0.002630f, 0.003011f, 0.001028f, 0.007393f, -0.003679f, 0.001104f, 0.005341f, 0.002947f, 0.001571f, -0.003330f, 0.007182f, 0.004656f, 0.001110f, -0.004093f, -0.005708f, -0.013589f, 0.008131f, -0.000559f, -0.001206f, 0.004093f, -0.006490f, -0.000802f, 0.004563f, 0.006210f, 0.009415f, 0.005260f, 0.002618f, 0.002566f, -0.000059f, 0.006785f, 0.029727f, 0.034798f, 0.008797f, 0.021438f, -0.013923f, 0.010057f, 0.009948f, -0.057317f, 0.016278f, 0.018480f, 0.003998f, -0.018310f, -0.000335f, -0.035402f, 0.041663f, 0.024979f, -0.012972f, -0.014054f, -0.020572f, -0.010859f, 0.030182f, -0.030512f, -0.017341f, -0.004627f, -0.004975f, -0.006622f, 0.004495f, -0.020220f, -0.020457f, -0.012174f, -0.015726f, -0.004336f, -0.020488f, -0.002889f, -0.013703f, -0.045295f, -0.028743f, -0.011208f, + -0.007042f, 0.006296f, 0.007711f, -0.000273f, 0.001484f, 0.013097f, 0.006470f, 0.006704f, 0.032023f, 0.006653f, 0.010939f, 0.019879f, 0.042964f, 0.036585f, 0.002115f, -0.014456f, -0.027883f, 0.025581f, -0.006090f, 0.069092f, 0.014146f, 0.030994f, -0.003172f, 0.003978f, -0.027230f, -0.001049f, 0.024182f, 0.013900f, 0.018389f, -0.020688f, -0.013484f, -0.026596f, -0.050351f, 0.029270f, -0.044404f, -0.005380f, 0.059116f, 0.004007f, 0.023844f, 0.011328f, 0.017610f, 0.000619f, -0.031524f, 0.031003f, -0.000262f, -0.027814f, -0.024709f, 0.001028f, 0.010006f, 0.020905f, 0.005860f, -0.024358f, 0.001575f, -0.004732f, 0.005260f, -0.009506f, -0.007729f, 0.004473f, 0.004248f, -0.007441f, 0.001052f, -0.002299f, -0.000384f, -0.009836f, -0.003345f, -0.003025f, 0.004970f, -0.002494f, -0.005786f, 0.008190f, -0.004600f, -0.001784f, -0.013812f, -0.014811f, 0.000385f, 0.000553f, -0.005837f, -0.003728f, 0.005270f, 0.003891f, -0.005926f, -0.009819f, -0.000251f, 0.006713f, -0.041041f, 0.012212f, 0.015255f, -0.027281f, -0.021345f, 0.000563f, 0.016750f, 0.040106f, -0.002192f, -0.030683f, -0.031250f, -0.001503f, + -0.017749f, 0.005348f, 0.005517f, -0.034276f, -0.029833f, -0.056084f, -0.016759f, -0.016178f, -0.038424f, -0.025809f, -0.000408f, -0.017676f, -0.011337f, -0.009955f, -0.003285f, -0.037708f, -0.020456f, -0.023138f, -0.011674f, 0.011770f, -0.032336f, 0.002511f, 0.026630f, 0.031990f, -0.007640f, 0.008823f, 0.018086f, -0.031453f, 0.017674f, -0.013571f, 0.027897f, -0.013491f, 0.002402f, -0.014548f, -0.003346f, 0.055790f, -0.011607f, 0.021050f, -0.040869f, -0.006658f, -0.000184f, -0.038554f, 0.035907f, 0.001449f, -0.013365f, 0.025950f, -0.010757f, 0.006721f, 0.050994f, -0.020233f, -0.028154f, 0.019338f, -0.005492f, -0.057406f, 0.023204f, -0.076121f, -0.041036f, 0.030608f, 0.023708f, 0.004942f, 0.016002f, 0.000134f, -0.000554f, -0.057421f, -0.031038f, -0.013495f, 0.005110f, -0.032624f, 0.007895f, 0.004567f, 0.013330f, -0.021295f, 0.001128f, 0.016512f, 0.012379f, 0.009506f, 0.000951f, 0.007827f, -0.018860f, -0.011952f, -0.012779f, -0.003511f, -0.002752f, -0.001643f, 0.014941f, -0.007737f, 0.007765f, 0.015087f, -0.007580f, 0.004668f, -0.012152f, -0.009124f, -0.000732f, 0.003888f, -0.010940f, 0.004727f, + -0.013673f, 0.011843f, -0.004929f, -0.002380f, 0.000338f, 0.010624f, -0.003529f, 0.004243f, -0.009666f, 0.008504f, 0.006264f, 0.019627f, 0.004439f, 0.016119f, -0.016107f, -0.005346f, -0.019129f, -0.009855f, -0.009478f, 0.077216f, 0.042286f, 0.000060f, -0.039755f, 0.020424f, -0.041456f, -0.033729f, 0.006135f, 0.034295f, 0.067806f, -0.010676f, 0.034283f, -0.012266f, 0.024337f, 0.041089f, 0.022989f, 0.026257f, 0.014092f, -0.007711f, -0.033632f, -0.034820f, -0.010530f, -0.032909f, -0.009673f, -0.006061f, -0.007401f, 0.026273f, -0.004478f, -0.067590f, 0.003968f, 0.016272f, 0.015610f, 0.040385f, -0.004170f, -0.080662f, 0.045854f, -0.036118f, 0.011807f, -0.007934f, 0.027131f, 0.039468f, -0.043963f, -0.003123f, -0.021967f, -0.038380f, 0.027751f, -0.019114f, -0.047210f, 0.018477f, 0.027574f, 0.045329f, 0.012018f, -0.007132f, 0.004963f, 0.037098f, -0.029900f, 0.058594f, -0.018441f, -0.016408f, -0.005280f, 0.035678f, -0.037184f, 0.003358f, 0.004537f, -0.103563f, -0.015350f, 0.031968f, -0.014903f, 0.005301f, 0.014370f, 0.007442f, -0.005082f, 0.008349f, 0.035493f, 0.042322f, -0.033576f, 0.012033f, + -0.024598f, -0.004274f, 0.041958f, -0.000976f, -0.004374f, 0.001468f, -0.002844f, -0.021839f, 0.005985f, 0.001369f, -0.012710f, -0.032309f, 0.000423f, -0.007790f, 0.009840f, -0.014974f, -0.013922f, -0.017601f, 0.014825f, 0.003330f, 0.009084f, 0.007212f, 0.000606f, 0.005296f, -0.007151f, -0.014861f, 0.022553f, -0.002374f, -0.010952f, -0.000454f, -0.007900f, -0.005049f, -0.009120f, 0.001045f, 0.002765f, -0.001441f, 0.006238f, 0.016325f, -0.000637f, -0.004119f, -0.006734f, 0.001376f, -0.008371f, -0.004859f, 0.009384f, -0.007320f, -0.006012f, -0.008934f, -0.021774f, -0.012304f, 0.003001f, 0.013953f, -0.011454f, -0.003019f, 0.044255f, 0.029358f, -0.082281f, -0.046778f, 0.056355f, 0.065316f, -0.035108f, -0.011896f, -0.092589f, -0.051177f, 0.013336f, -0.004200f, 0.012313f, -0.049216f, -0.030842f, -0.033730f, 0.049966f, 0.074249f, -0.003615f, 0.020046f, -0.012091f, -0.006503f, -0.000948f, 0.017054f, 0.032170f, 0.007832f, -0.011464f, -0.006156f, -0.007562f, -0.044351f, -0.025163f, -0.045090f, -0.006007f, 0.013942f, -0.018969f, 0.027827f, -0.020617f, -0.007713f, 0.043164f, -0.020924f, 0.024251f, 0.016870f, + -0.007934f, -0.041581f, -0.030124f, -0.024787f, 0.007474f, 0.077763f, 0.013666f, 0.041818f, 0.049254f, 0.038580f, 0.028529f, 0.025569f, -0.042923f, 0.001038f, -0.007048f, 0.057567f, 0.027321f, 0.033675f, 0.060063f, -0.029492f, -0.040454f, 0.014851f, 0.050795f, -0.086112f, -0.001585f, 0.006885f, 0.040029f, -0.069634f, -0.104996f, -0.018654f, 0.029385f, 0.007367f, 0.011869f, 0.032934f, 0.002074f, -0.023253f, -0.034485f, 0.001173f, 0.004705f, 0.006846f, 0.031752f, 0.047141f, 0.022257f, 0.003530f, 0.000140f, -0.000479f, 0.003860f, 0.004773f, -0.011918f, 0.017416f, 0.002146f, -0.015857f, -0.028001f, 0.003504f, -0.011947f, 0.006045f, 0.003034f, -0.002486f, 0.001757f, -0.011552f, 0.012033f, -0.006183f, 0.008074f, -0.012422f, -0.008077f, -0.022191f, -0.021947f, 0.001082f, 0.011535f, -0.009797f, 0.023108f, 0.000661f, 0.006875f, -0.006931f, 0.024699f, 0.002106f, 0.011316f, -0.012187f, -0.006691f, -0.003859f, -0.015379f, -0.002981f, 0.016651f, -0.028801f, 0.022199f, -0.001111f, -0.021131f, -0.037420f, 0.014100f, -0.018241f, -0.036489f, 0.026258f, 0.050655f, 0.015463f, -0.019171f, 0.029980f, + 0.050965f, 0.018738f, 0.010714f, 0.003537f, -0.005382f, 0.023835f, -0.042112f, 0.002462f, -0.060680f, 0.032535f, -0.048908f, -0.004190f, 0.026805f, 0.014581f, -0.027746f, 0.005881f, -0.032148f, 0.066580f, 0.008989f, 0.021570f, 0.035105f, 0.073461f, -0.029967f, 0.023835f, -0.034781f, 0.012674f, 0.026842f, 0.059060f, 0.014363f, -0.012038f, 0.060987f, 0.008160f, -0.003813f, -0.034869f, 0.002757f, 0.037942f, -0.012391f, 0.036473f, -0.044442f, 0.069202f, 0.072252f, -0.086287f, -0.001769f, -0.005444f, 0.019342f, -0.014698f, -0.010823f, 0.037126f, -0.030820f, -0.092038f, 0.001608f, 0.081861f, -0.064066f, 0.032444f, -0.014415f, -0.008169f, -0.038820f, 0.090376f, -0.005321f, 0.014983f, 0.008827f, -0.060741f, 0.079222f, 0.006190f, 0.070518f, -0.138433f, 0.013725f, -0.012978f, -0.041226f, -0.011168f, 0.024857f, -0.032195f, 0.022209f, -0.029010f, -0.018816f, -0.038195f, 0.048816f, -0.018488f, 0.003838f, -0.040726f, 0.002303f, -0.029901f, -0.009685f, 0.013990f, -0.020133f, 0.009723f, 0.001824f, -0.027583f, 0.025526f, -0.011264f, 0.004116f, -0.011753f, 0.023221f, -0.016981f, 0.004102f, 0.001660f, + -0.005779f, 0.030128f, -0.016816f, -0.020954f, -0.011641f, -0.023492f, -0.032299f, -0.016402f, 0.003719f, 0.002145f, -0.023105f, -0.013327f, -0.015341f, -0.022781f, -0.017565f, 0.008024f, 0.005880f, -0.000601f, 0.058531f, 0.006750f, -0.044433f, 0.004330f, -0.090583f, -0.020960f, 0.004793f, -0.017840f, -0.072167f, -0.008276f, -0.047303f, -0.012069f, 0.043793f, 0.009839f, 0.057348f, 0.023435f, 0.021775f, 0.013112f, -0.019291f, 0.045538f, -0.023054f, -0.000766f, 0.021859f, 0.009657f, -0.027882f, 0.022439f, 0.009525f, 0.053932f, 0.022542f, -0.010089f, 0.033019f, -0.026439f, 0.044512f, 0.014844f, -0.048444f, -0.050472f, 0.026130f, 0.032162f, 0.013764f, 0.004900f, -0.023406f, -0.032462f, 0.010039f, -0.031954f, -0.047407f, -0.015052f, -0.007807f, -0.044232f, -0.016043f, 0.015943f, -0.029725f, -0.049841f, 0.014184f, 0.017849f, 0.001981f, -0.006527f, -0.002625f, -0.008871f, 0.017991f, 0.083614f, 0.017406f, -0.003241f, -0.002934f, -0.030221f, -0.047726f, -0.021802f, 0.069503f, 0.073858f, 0.038387f, 0.006544f, 0.067787f, 0.031939f, -0.014997f, -0.094453f, -0.071337f, -0.059497f, -0.111911f, -0.065922f, + 0.016163f, 0.090603f, -0.040102f, 0.030279f, -0.044871f, 0.014208f, -0.003404f, 0.030753f, -0.014340f, -0.005862f, -0.040000f, -0.023713f, -0.009509f, -0.036526f, 0.046215f, -0.007749f, -0.023588f, -0.011951f, 0.005079f, -0.026602f, 0.018998f, 0.013134f, 0.030055f, 0.006221f, 0.008768f, -0.029803f, -0.033708f, -0.004572f, -0.024790f, -0.016504f, -0.028957f, -0.042927f, 0.002637f, -0.011685f, 0.003068f, 0.002420f, 0.032841f, 0.031762f, -0.011643f, -0.007087f, -0.013922f, 0.030655f, 0.021175f, 0.012965f, 0.005302f, -0.007030f, 0.018333f, -0.025421f, -0.009445f, -0.004693f, -0.027932f, -0.055589f, 0.029261f, -0.001682f, -0.017242f, -0.008060f, 0.020939f, 0.038761f, -0.016497f, 0.050003f, -0.057273f, 0.046189f, -0.005735f, 0.061725f, -0.039977f, 0.035551f, -0.059024f, 0.051290f, -0.047666f, -0.020451f, 0.071913f, 0.016284f, 0.057801f, 0.082085f, 0.008643f, -0.006916f, -0.034171f, -0.003024f, 0.052481f, 0.012897f, -0.018324f, -0.058181f, 0.005165f, 0.011174f, 0.027589f, 0.016459f, 0.023013f, 0.013960f, -0.033548f, -0.054148f, -0.022618f, 0.051930f, 0.020256f, 0.166237f, -0.052617f, -0.044726f, + 0.054572f, 0.085233f, 0.018226f, -0.001690f, 0.022788f, 0.005433f, 0.027760f, -0.025342f, 0.010240f, 0.039747f, 0.044493f, 0.029270f, 0.129571f, -0.016602f, -0.016311f, -0.008588f, 0.067059f, 0.039674f, -0.033390f, 0.034751f, -0.000307f, 0.011226f, -0.027386f, 0.059011f, -0.058561f, 0.003964f, 0.091722f, -0.067332f, 0.196400f, -0.090078f, 0.094276f, 0.085855f, -0.083876f, -0.077301f, 0.087742f, 0.003635f, -0.049686f, -0.021389f, 0.048784f, -0.132392f, 0.021415f, -0.015659f, -0.084445f, 0.055647f, -0.065932f, 0.005204f, 0.005785f, -0.026946f, -0.065010f, 0.017803f, -0.004213f, -0.003015f, 0.013607f, -0.013652f, -0.020778f, 0.011763f, 0.028622f, -0.010525f, 0.005227f, 0.021443f, -0.019086f, 0.029861f, 0.024121f, -0.047654f, 0.007947f, -0.026772f, 0.013286f, -0.001906f, 0.005046f, -0.024382f, 0.011329f, 0.006374f, 0.001101f, -0.012225f, 0.038087f, 0.008318f, -0.000044f, 0.035169f, -0.023521f, -0.022689f, 0.005142f, 0.015198f, 0.005220f, 0.016937f, 0.010202f, -0.048996f, -0.023895f, 0.012673f, -0.027244f, 0.042224f, -0.015525f, 0.032346f, 0.043617f, -0.101306f, -0.041933f, 0.061000f, + -0.129026f, -0.081107f, -0.053469f, 0.090127f, 0.194385f, 0.052841f, -0.150970f, -0.034929f, -0.154250f, -0.081634f, 0.127340f, 0.074908f, 0.119778f, 0.064721f, -0.089040f, -0.143375f, -0.107879f, -0.026751f, 0.065308f, 0.072552f, 0.044959f, 0.024050f, -0.036810f, -0.156656f, -0.186729f, -0.041255f, 0.144584f, 0.255564f, 0.174624f, -0.033364f, -0.119283f, -0.173111f, -0.127049f, -0.104118f, 0.001000f, 0.040732f, 0.140831f, 0.148764f, -0.079987f, -0.051247f, -0.186950f, -0.175252f, -0.061914f, 0.016616f, 0.182247f, 0.267166f, 0.119736f, -0.079654f, -0.279721f, -0.208623f, -0.151691f, 0.073110f, 0.160724f, 0.099127f, 0.064043f, 0.053064f, -0.166512f, -0.031368f, -0.094551f, 0.034886f, -0.012302f, 0.098565f, 0.156810f, 0.123149f, -0.144565f, -0.294146f, -0.219699f, 0.023889f, 0.172558f, -0.004837f, 0.238914f, 0.009308f, -0.060296f, -0.072185f, -0.051587f, 0.000086f, 0.172903f, 0.147790f, 0.028241f, -0.059660f, -0.020120f, -0.011471f, 0.091235f, 0.098986f, 0.012962f, 0.003749f, -0.014509f, -0.003218f, -0.018105f, -0.024862f, -0.014991f, -0.009411f, 0.035585f, 0.053269f, 0.045139f, -0.065535f, + -0.072582f, -0.028955f, -0.029453f, -0.029747f, 0.068205f, 0.054275f, 0.071681f, 0.020173f, -0.029166f, -0.053572f, -0.101418f, -0.065907f, 0.044171f, 0.089983f, 0.138315f, 0.093398f, 0.009002f, -0.212064f, -0.184772f, -0.063901f, 0.077601f, 0.118429f, 0.160267f, 0.119402f, -0.008139f, -0.120829f, -0.176000f, -0.171617f, -0.029925f, 0.185680f, 0.194051f, 0.097481f, -0.045100f, -0.129180f, -0.088382f, -0.060849f, 0.006804f, -0.034167f, 0.068281f, 0.021723f, -0.055936f, -0.052115f, -0.000186f, -0.084177f, -0.010801f, 0.012856f, 0.009315f, -0.007016f, 0.001758f, -0.028090f, -0.003901f, -0.003010f, 0.014225f, -0.009478f, 0.038595f, -0.010016f, -0.007861f, -0.010553f, -0.012597f, 0.024609f, 0.006582f, -0.011393f, 0.037360f, 0.002709f, -0.067443f, -0.033172f, 0.018103f, 0.033143f, -0.011547f, 0.004317f, 0.045585f, -0.000817f, 0.005894f, -0.037283f, -0.017176f, 0.011890f, -0.008558f, -0.008043f, -0.005378f, 0.030720f, 0.010620f, -0.011597f, -0.036372f, -0.014020f, -0.002506f, -0.032505f, 0.002744f, -0.037170f, -0.025481f, -0.017137f, -0.033709f, 0.052521f, -0.009814f, -0.023326f, 0.021682f, -0.000061f, + -0.051737f, -0.002703f, 0.050859f, 0.041882f, -0.024240f, 0.032496f, 0.004999f, 0.031016f, -0.034704f, -0.050269f, 0.018970f, 0.022589f, 0.019223f, 0.017309f, -0.019516f, 0.019075f, -0.038144f, 0.025837f, -0.051880f, -0.045002f, 0.033032f, -0.026211f, 0.022404f, 0.031622f, 0.001848f, -0.023942f, 0.007359f, 0.009146f, -0.002480f, -0.001701f, -0.001268f, 0.020699f, -0.017576f, 0.013541f, -0.018353f, 0.024212f, -0.021404f, -0.011143f, 0.008356f, -0.006968f, -0.001219f, 0.009737f, 0.001821f, 0.006599f, 0.017980f, -0.014440f, -0.009209f, 0.010848f, 0.005882f, 0.021357f, -0.017590f, 0.006136f, -0.002544f, -0.012902f, -0.013727f, 0.005696f, 0.002904f, -0.012758f, -0.019887f, 0.005877f, -0.000241f, -0.003352f, 0.011879f, -0.018260f, 0.020958f, 0.006716f, -0.019074f, -0.020389f, 0.016763f, -0.028767f, 0.019376f, -0.002963f, 0.013251f, -0.001179f, 0.004193f, 0.025700f, -0.041116f, 0.082509f, 0.126357f, -0.016669f, -0.046474f, -0.040272f, 0.116514f, 0.052402f, 0.112770f, 0.060535f, 0.000371f, -0.052446f, -0.011461f, 0.028549f, 0.053079f, 0.025123f, -0.024281f, -0.006211f, 0.025472f, 0.037052f, + 0.004820f, 0.008175f, -0.025836f, 0.004568f, -0.012368f, 0.016782f, 0.019237f, 0.049066f, 0.042632f, -0.022734f, 0.003889f, -0.025497f, 0.006796f, 0.022276f, 0.033777f, 0.002281f, -0.015774f, -0.000269f, -0.028665f, 0.023879f, -0.006456f, 0.009721f, 0.022694f, 0.000246f, 0.030163f, -0.014985f, -0.008023f, -0.007252f, -0.030628f, -0.018712f, -0.046818f, -0.009147f, -0.053415f, 0.003412f, -0.018247f, 0.043860f, 0.006754f, 0.012728f, -0.041257f, 0.017247f, 0.000495f, -0.018724f, 0.030589f, -0.016682f, -0.008336f, 0.007257f, 0.020296f, -0.002720f, -0.010816f, 0.068029f, 0.022436f, 0.015490f, 0.025866f, -0.018822f, -0.000707f, -0.006496f, 0.035931f, 0.049318f, 0.047907f, -0.028798f, -0.030913f, -0.004590f, -0.012170f, 0.012129f, 0.032358f, 0.033044f, 0.001685f, 0.018357f, -0.002034f, -0.005479f, 0.011144f, 0.020921f, -0.001821f, 0.016350f, -0.013803f, 0.002634f, 0.000460f, 0.005436f, -0.004597f, 0.018332f, 0.011107f, -0.002403f, -0.005026f, 0.005244f, 0.003536f, 0.019944f, 0.001369f, -0.012504f, -0.012869f, -0.007981f, 0.005972f, 0.006470f, 0.013294f, -0.016337f, 0.002443f, -0.004837f, + 0.010736f, -0.008284f, 0.015057f, -0.005522f, 0.005781f, -0.008854f, -0.006665f, 0.004164f, -0.012656f, -0.000480f, 0.014573f, 0.003022f, -0.005615f, 0.000759f, -0.047168f, -0.102222f, -0.013857f, 0.135170f, 0.208272f, 0.174937f, 0.138155f, -0.009261f, 0.016199f, -0.101450f, -0.115167f, -0.187626f, -0.108097f, -0.118143f, -0.037273f, 0.014936f, 0.081682f, 0.058251f, 0.177880f, 0.154983f, 0.051132f, 0.010894f, -0.027652f, -0.060382f, -0.095641f, -0.034930f, -0.098034f, -0.026027f, -0.047721f, -0.030754f, -0.022902f, 0.005253f, 0.001647f, 0.033326f, 0.048055f, 0.073189f, 0.079171f, 0.095187f, 0.082051f, -0.009786f, 0.007954f, -0.000918f, 0.015391f, -0.046978f, 0.018996f, -0.050218f, -0.125847f, -0.061672f, -0.094202f, -0.158143f, -0.046416f, -0.013655f, -0.064147f, 0.021823f, 0.048635f, 0.110603f, 0.130199f, 0.192329f, 0.121365f, 0.099056f, 0.098320f, 0.061295f, -0.019064f, 0.010110f, -0.096996f, -0.083420f, -0.140466f, -0.166836f, -0.192824f, -0.140272f, -0.108197f, -0.011150f, -0.005249f, 0.015424f, 0.056334f, 0.095506f, 0.171795f, 0.170044f, 0.169155f, 0.135779f, 0.058168f, 0.087652f, + 0.013731f, -0.043804f, -0.066175f, -0.156319f, -0.142278f, -0.125864f, -0.108666f, -0.086884f, -0.052616f, -0.031813f, -0.010900f, 0.007966f, 0.052702f, 0.062626f, 0.082374f, 0.068339f, 0.097644f, 0.088509f, 0.057876f, 0.066758f, 0.044822f, -0.012037f, -0.036134f, -0.041616f, -0.099522f, -0.086199f, -0.077695f, -0.058122f, -0.031691f, -0.001050f, -0.003781f, 0.025584f, 0.039236f, 0.030625f, 0.036409f, 0.023350f, 0.007362f, -0.000621f, 0.010611f, 0.002626f, -0.012121f, 0.013280f, 0.015918f, 0.001271f, 0.008607f, -0.002231f, -0.003445f, 0.001637f, 0.006005f, -0.000062f, -0.013383f, -0.017787f, -0.017476f, -0.020195f, -0.013656f, -0.003918f, -0.004553f, 0.006171f, 0.002538f, 0.001982f, 0.007075f, 0.008196f, 0.006545f, 0.008852f, 0.013615f, 0.011732f, 0.006740f, 0.008187f, 0.002974f, -0.002385f, -0.000607f, -0.003115f, -0.004784f, -0.001720f, -0.002591f, -0.000769f, -0.000979f, 0.000279f}, + {0.013781f, 0.005240f, -0.006918f, -0.001174f, 0.004798f, -0.000848f, 0.005105f, -0.012612f, -0.009000f, -0.002201f, -0.010630f, 0.004455f, -0.002374f, -0.001169f, -0.007185f, -0.003199f, 0.006666f, 0.006670f, -0.002622f, -0.002029f, -0.004438f, -0.010193f, 0.011356f, 0.006763f, 0.000281f, 0.001198f, -0.000636f, 0.000333f, 0.009142f, -0.004639f, 0.001667f, -0.014643f, -0.012022f, -0.003004f, 0.001073f, -0.010204f, -0.001912f, 0.003631f, 0.000861f, 0.000186f, -0.005142f, -0.003939f, 0.009560f, -0.004434f, -0.004106f, -0.001344f, -0.001373f, 0.004223f, -0.002236f, -0.006272f, -0.000244f, 0.005505f, -0.007862f, 0.000341f, -0.008421f, 0.000592f, -0.006175f, 0.009324f, -0.000557f, -0.009822f, -0.001457f, -0.000953f, 0.001142f, -0.014027f, -0.001727f, 0.001168f, -0.009410f, 0.004318f, 0.000170f, -0.010807f, 0.004884f, 0.006646f, -0.005802f, -0.006620f, -0.011914f, 0.006222f, 0.003554f, 0.011023f, 0.005399f, -0.001639f, 0.002101f, -0.001530f, 0.003299f, 0.003505f, 0.007561f, 0.001936f, -0.003359f, -0.000118f, 0.000844f, -0.000249f, 0.004298f, 0.001126f, -0.001548f, -0.002113f, 0.002063f, 0.001690f, + 0.003205f, 0.001627f, 0.001212f, 0.001950f, 0.001715f, 0.000730f, 0.001040f, -0.000207f, -0.000620f, 0.000695f, 0.000402f, 0.000827f, -0.000521f, 0.000976f, -0.000101f, -0.010197f, 0.004600f, -0.012720f, -0.003566f, -0.001767f, -0.006456f, 0.006148f, 0.014226f, -0.005812f, -0.001922f, 0.000688f, -0.005918f, 0.004112f, -0.000914f, -0.004775f, -0.008166f, -0.004310f, 0.012828f, 0.012430f, 0.006950f, 0.014437f, 0.008461f, 0.004608f, 0.013551f, -0.008417f, 0.002961f, 0.005827f, -0.000297f, 0.002363f, -0.004063f, 0.002626f, -0.018819f, 0.000425f, -0.001123f, 0.006810f, -0.004285f, -0.002363f, -0.001343f, 0.005224f, -0.005980f, -0.000934f, 0.001660f, 0.003688f, 0.003532f, -0.000973f, -0.006412f, 0.001236f, 0.002201f, 0.004631f, 0.003443f, 0.005382f, -0.006030f, -0.003532f, -0.001130f, -0.010611f, -0.001291f, 0.002858f, 0.009116f, 0.010246f, -0.001431f, 0.005665f, 0.004164f, -0.000729f, 0.003763f, 0.004555f, 0.006572f, -0.002612f, -0.000118f, -0.004912f, 0.000827f, -0.004227f, 0.002906f, -0.006276f, -0.005992f, 0.003617f, -0.000064f, -0.011754f, -0.001132f, -0.008792f, -0.002422f, -0.001215f, + -0.001516f, -0.011683f, 0.001107f, 0.004178f, -0.003480f, -0.003304f, 0.002003f, 0.001522f, 0.000831f, -0.002280f, -0.006319f, -0.000283f, -0.002777f, 0.002437f, 0.000072f, 0.000211f, -0.000718f, -0.002562f, -0.002904f, -0.003229f, 0.000222f, -0.001372f, 0.001411f, -0.002006f, 0.000803f, 0.000539f, -0.001878f, 0.000006f, -0.002089f, -0.000705f, 0.000116f, 0.000059f, -0.001857f, -0.000401f, -0.000317f, -0.012874f, -0.012175f, 0.004538f, -0.001451f, 0.010115f, 0.010129f, 0.000856f, 0.000215f, 0.019543f, -0.005311f, -0.000445f, 0.016369f, 0.000698f, -0.009518f, -0.013868f, 0.010041f, -0.004045f, 0.000025f, -0.008583f, 0.002627f, -0.006125f, 0.006804f, 0.030507f, -0.011175f, -0.008940f, -0.011041f, -0.011879f, 0.002128f, -0.009684f, -0.024072f, -0.000587f, 0.002359f, 0.000077f, -0.009604f, -0.001992f, 0.007752f, -0.009794f, -0.005842f, 0.014268f, 0.004636f, -0.003611f, -0.003454f, 0.009194f, -0.004610f, 0.006587f, 0.005943f, -0.012991f, -0.008689f, -0.007685f, 0.008447f, -0.006581f, -0.003988f, -0.003569f, -0.004396f, -0.000665f, -0.008839f, 0.000090f, -0.002717f, 0.002186f, -0.001284f, -0.019036f, + 0.008765f, -0.010637f, 0.008332f, 0.001589f, -0.015735f, 0.003198f, 0.010387f, 0.003246f, 0.017348f, -0.007354f, 0.000871f, 0.002055f, 0.003991f, 0.006257f, -0.006967f, 0.002624f, 0.002206f, -0.010115f, 0.013794f, 0.001016f, -0.002070f, 0.005913f, -0.002098f, 0.002659f, -0.002644f, -0.005279f, -0.000477f, -0.003394f, 0.004452f, -0.001174f, 0.000753f, 0.005429f, 0.001760f, 0.002072f, -0.001323f, 0.002956f, 0.000404f, -0.000789f, 0.001824f, 0.003946f, -0.002975f, 0.000259f, -0.003134f, 0.001880f, -0.001109f, 0.005697f, -0.008011f, 0.003733f, 0.004184f, -0.004429f, 0.002062f, -0.002217f, -0.017410f, 0.005329f, 0.016516f, 0.013613f, 0.015496f, 0.002641f, -0.003227f, -0.013281f, -0.006836f, -0.006272f, -0.004889f, 0.013613f, 0.019091f, 0.001309f, -0.001186f, 0.013481f, -0.021856f, 0.000371f, -0.001654f, -0.000456f, -0.007038f, -0.007450f, 0.008131f, 0.009818f, 0.000451f, -0.002261f, 0.004082f, -0.010748f, -0.007950f, 0.008111f, -0.008776f, 0.016983f, 0.015596f, 0.002510f, 0.009659f, 0.007963f, 0.001772f, -0.007061f, 0.002565f, -0.000460f, -0.011902f, 0.011604f, -0.000892f, 0.005381f, + 0.009653f, -0.011395f, -0.004244f, -0.013525f, -0.002891f, 0.002984f, 0.012758f, -0.013036f, -0.004993f, 0.009356f, -0.001840f, -0.008375f, 0.013983f, -0.011618f, -0.024059f, 0.003982f, -0.013485f, -0.006191f, 0.006740f, -0.005952f, 0.001319f, 0.001344f, -0.005757f, 0.010235f, -0.009309f, -0.010836f, -0.012746f, -0.001530f, -0.005443f, 0.000749f, 0.003581f, -0.007990f, 0.002239f, 0.002158f, 0.000735f, -0.003863f, 0.002241f, 0.001580f, 0.005550f, 0.000706f, -0.001582f, -0.003805f, -0.002229f, -0.001749f, -0.000813f, -0.001415f, -0.002143f, 0.000594f, 0.001206f, 0.001457f, 0.000644f, -0.000827f, -0.001683f, -0.000840f, 0.002838f, -0.002845f, -0.002705f, -0.000955f, 0.000077f, -0.000358f, 0.002209f, 0.002325f, 0.002431f, -0.001524f, 0.000957f, 0.000386f, 0.001056f, 0.005292f, -0.002631f, 0.000339f, -0.021910f, 0.004692f, 0.020616f, 0.001690f, 0.003212f, 0.006297f, 0.019312f, 0.002683f, -0.018608f, 0.020665f, 0.009051f, 0.007489f, 0.012547f, 0.010937f, 0.000076f, -0.003819f, 0.011836f, 0.009104f, 0.003090f, -0.008478f, 0.010295f, 0.004898f, 0.015246f, 0.017844f, 0.006765f, -0.004338f, + 0.000403f, -0.000077f, 0.007415f, 0.022642f, 0.013420f, -0.012480f, 0.021863f, 0.000934f, -0.002691f, 0.002949f, -0.016120f, 0.017978f, -0.002384f, 0.000386f, -0.002138f, 0.004633f, -0.002417f, 0.009317f, -0.012997f, 0.018370f, 0.015614f, -0.000515f, -0.002909f, -0.010108f, -0.019388f, -0.006584f, 0.007703f, -0.004443f, -0.007268f, 0.010361f, 0.012082f, -0.008104f, -0.007274f, -0.024799f, -0.008620f, -0.003001f, -0.001204f, -0.027757f, 0.014183f, 0.001636f, -0.016567f, -0.013547f, 0.004580f, -0.006384f, 0.001702f, -0.004035f, 0.000904f, -0.007245f, -0.001604f, -0.006453f, 0.004734f, 0.009378f, -0.002615f, 0.007156f, 0.000852f, -0.002858f, 0.008340f, 0.002985f, 0.000434f, 0.006946f, -0.000779f, -0.003046f, -0.004299f, -0.004783f, -0.005062f, -0.004743f, -0.005920f, -0.004257f, 0.000326f, -0.002312f, -0.005553f, -0.002669f, 0.000586f, -0.001104f, -0.002049f, 0.001281f, 0.002288f, 0.001178f, -0.002518f, -0.003545f, -0.004480f, 0.000573f, -0.004247f, 0.004037f, -0.002319f, -0.002377f, -0.002288f, 0.000171f, -0.001623f, 0.010265f, -0.012965f, -0.000104f, 0.000134f, 0.000481f, 0.020941f, 0.011520f, + -0.000182f, 0.026112f, 0.012061f, 0.023578f, 0.005623f, 0.007989f, 0.025151f, -0.009926f, -0.016763f, -0.010578f, 0.023517f, 0.005785f, -0.013267f, 0.017972f, -0.004909f, -0.010436f, 0.016033f, 0.038096f, -0.009821f, 0.001958f, 0.006081f, 0.007327f, -0.009897f, 0.001311f, 0.020953f, 0.002307f, 0.025765f, -0.005548f, 0.027668f, 0.019641f, 0.006630f, 0.016480f, 0.010394f, -0.009774f, 0.006882f, -0.002451f, -0.002462f, 0.002726f, 0.001881f, -0.001703f, 0.007301f, 0.005149f, 0.017878f, 0.012144f, -0.014942f, 0.005319f, 0.006732f, -0.010926f, 0.000660f, -0.025915f, -0.033723f, 0.013618f, -0.008638f, -0.021917f, -0.004727f, -0.011739f, 0.014528f, 0.003320f, -0.006847f, -0.016502f, 0.013033f, -0.011899f, 0.007952f, -0.013367f, 0.001988f, -0.005290f, 0.020437f, 0.003965f, -0.007975f, 0.008028f, -0.017424f, 0.016034f, 0.002588f, -0.014819f, 0.000687f, -0.001379f, -0.004299f, -0.001625f, 0.002138f, 0.004609f, -0.004358f, 0.007490f, -0.001619f, -0.002691f, -0.003318f, -0.002394f, -0.006452f, -0.000335f, -0.002291f, -0.006063f, -0.002310f, 0.002446f, -0.003878f, 0.004200f, 0.000619f, -0.002024f, + 0.001065f, -0.003953f, -0.000771f, -0.002695f, -0.000358f, 0.000083f, 0.000201f, 0.002270f, 0.002504f, 0.003010f, 0.000134f, 0.001639f, -0.000132f, -0.014757f, 0.001982f, 0.000598f, 0.003916f, -0.008991f, 0.010182f, 0.011248f, -0.001213f, -0.007478f, -0.025912f, -0.022191f, -0.017091f, 0.007995f, 0.002317f, 0.004161f, -0.021242f, 0.013499f, 0.009506f, 0.016792f, -0.018210f, 0.017318f, 0.013291f, -0.010421f, -0.008672f, -0.005244f, 0.017602f, 0.012183f, -0.007731f, 0.001787f, 0.026632f, 0.013538f, 0.006883f, 0.015476f, 0.010614f, 0.004199f, -0.008802f, 0.002046f, 0.001239f, -0.003699f, -0.009771f, 0.023702f, 0.011059f, -0.021954f, 0.014895f, 0.014856f, 0.014753f, 0.011610f, 0.003134f, -0.013659f, 0.000440f, -0.001767f, 0.020645f, 0.002804f, 0.009244f, 0.018792f, -0.003329f, -0.020374f, 0.004572f, 0.011079f, 0.020864f, -0.027703f, -0.015632f, 0.007688f, 0.000328f, 0.002641f, -0.016416f, -0.003986f, -0.015917f, -0.002136f, 0.007624f, -0.005166f, -0.008684f, -0.010523f, 0.004543f, -0.002543f, -0.005253f, -0.013030f, 0.000531f, -0.017474f, -0.000276f, -0.001613f, -0.008849f, -0.009805f, + 0.011330f, -0.003786f, -0.002758f, -0.005512f, -0.010766f, 0.003928f, 0.005271f, 0.003712f, 0.004139f, 0.003064f, -0.005922f, -0.003147f, -0.001764f, -0.001368f, -0.005562f, -0.010439f, -0.004622f, -0.000163f, -0.003521f, -0.000208f, -0.005592f, 0.000599f, -0.003008f, -0.002047f, -0.004048f, -0.004503f, -0.002362f, 0.004724f, -0.003276f, -0.001496f, 0.000753f, 0.001980f, 0.001279f, -0.002132f, 0.003566f, 0.005374f, 0.005369f, -0.001350f, 0.009844f, 0.001279f, -0.017226f, 0.017544f, 0.011277f, -0.005247f, 0.006977f, 0.010568f, -0.011644f, -0.003941f, 0.044900f, -0.001471f, 0.017520f, 0.012245f, -0.037452f, -0.019924f, -0.002093f, -0.001581f, -0.000420f, 0.021276f, 0.004797f, -0.010361f, 0.022013f, 0.013507f, -0.002730f, -0.003616f, 0.007043f, -0.003584f, -0.007747f, -0.016702f, -0.019763f, 0.010946f, -0.004311f, -0.009328f, -0.000937f, -0.030835f, -0.005700f, 0.002033f, 0.017048f, -0.020374f, -0.005856f, 0.002636f, 0.001408f, 0.004442f, 0.001560f, 0.021742f, -0.025295f, -0.008437f, 0.005683f, -0.000826f, -0.014906f, -0.003158f, 0.019776f, 0.016959f, 0.014721f, -0.004045f, -0.025180f, -0.011518f, + 0.009192f, -0.002876f, 0.017008f, -0.000991f, -0.000266f, -0.012584f, -0.007731f, 0.014796f, -0.018029f, 0.012392f, 0.009760f, -0.013050f, -0.006401f, -0.003035f, 0.002174f, -0.014050f, 0.006925f, 0.004866f, -0.006811f, -0.002151f, -0.019077f, 0.006949f, 0.014927f, 0.021205f, 0.001962f, 0.005703f, 0.010155f, 0.003118f, -0.016642f, 0.011509f, -0.003904f, 0.001913f, 0.000166f, -0.005364f, -0.005658f, -0.003081f, 0.007918f, 0.001413f, 0.006640f, -0.000687f, 0.001196f, -0.009287f, -0.003046f, -0.004254f, 0.007169f, -0.000679f, -0.002897f, 0.004906f, -0.003448f, 0.003854f, -0.002144f, 0.000666f, -0.007563f, 0.001847f, -0.001655f, -0.001556f, -0.004799f, 0.001816f, -0.000640f, -0.004301f, -0.007817f, -0.001734f, 0.000936f, -0.003153f, 0.003372f, -0.000782f, -0.033864f, -0.002231f, 0.004786f, 0.022737f, 0.002981f, -0.001057f, 0.013956f, -0.010138f, 0.030120f, -0.030062f, -0.002740f, -0.006532f, 0.005149f, -0.001579f, -0.002314f, 0.007578f, -0.005503f, -0.010294f, -0.006666f, -0.006129f, -0.017838f, -0.002954f, 0.012905f, -0.003044f, -0.007853f, 0.018902f, -0.000163f, 0.022759f, -0.022233f, -0.012918f, + 0.028434f, -0.002983f, -0.001591f, 0.001585f, -0.017684f, -0.002168f, -0.022110f, 0.006421f, -0.026566f, -0.000765f, 0.019980f, -0.006569f, 0.013660f, 0.017702f, 0.010474f, 0.013922f, -0.017922f, 0.017913f, 0.002136f, -0.047144f, -0.007774f, 0.006773f, -0.003707f, -0.005311f, -0.020039f, 0.015842f, -0.017058f, -0.003452f, -0.019363f, -0.018370f, -0.028183f, 0.025202f, 0.000325f, 0.029386f, -0.014519f, 0.022137f, 0.029580f, -0.019398f, 0.024133f, -0.029561f, -0.024383f, -0.026763f, -0.009136f, -0.018872f, 0.006194f, 0.008826f, -0.000876f, -0.003525f, 0.000008f, -0.021170f, 0.001818f, 0.000194f, 0.012369f, 0.004787f, 0.004948f, 0.008644f, 0.005082f, -0.004630f, -0.000009f, -0.008633f, -0.004948f, 0.000198f, 0.003696f, 0.000125f, 0.004157f, -0.002850f, 0.004457f, -0.001315f, 0.002450f, -0.013113f, 0.000990f, 0.004985f, 0.004001f, 0.007273f, -0.003941f, -0.005786f, -0.007477f, -0.000185f, -0.000450f, -0.006129f, -0.006466f, 0.000697f, -0.000870f, 0.001129f, 0.000256f, -0.001940f, 0.003696f, 0.010445f, -0.002333f, -0.002420f, -0.001099f, -0.002826f, 0.009600f, 0.000401f, 0.001359f, -0.003213f, + 0.005801f, -0.006046f, 0.022340f, 0.037306f, 0.005487f, -0.010088f, -0.020108f, 0.012445f, 0.034611f, 0.000198f, 0.010004f, 0.001651f, 0.013880f, 0.009361f, 0.010678f, 0.018659f, -0.022545f, -0.001939f, -0.008307f, 0.029481f, 0.022098f, -0.001225f, 0.034218f, 0.017878f, 0.003168f, -0.032229f, -0.015793f, -0.024614f, -0.011197f, 0.002327f, 0.009337f, -0.008934f, 0.001423f, 0.034521f, -0.006371f, -0.000135f, 0.001904f, 0.035472f, -0.021650f, -0.008941f, -0.008739f, -0.003669f, -0.021182f, 0.024377f, 0.001779f, 0.016291f, -0.025438f, 0.003307f, -0.002651f, -0.015408f, -0.005922f, -0.028401f, 0.008985f, 0.000352f, 0.006074f, -0.003652f, -0.001582f, -0.032946f, -0.011006f, 0.012610f, 0.020951f, -0.006232f, 0.005576f, 0.043359f, -0.002702f, 0.002331f, 0.008124f, 0.019438f, -0.018331f, 0.004039f, 0.022189f, -0.013284f, 0.016162f, 0.004508f, 0.016838f, -0.022426f, -0.011192f, 0.002818f, 0.005206f, 0.011062f, 0.012863f, 0.012006f, -0.008263f, 0.003336f, 0.007634f, 0.014567f, 0.023109f, 0.010461f, -0.010839f, -0.005296f, -0.008514f, 0.003511f, 0.004943f, 0.009823f, 0.009193f, 0.005303f, + 0.009705f, -0.010580f, -0.002014f, -0.010787f, 0.009177f, -0.012329f, 0.012343f, 0.008631f, -0.009145f, 0.005231f, -0.001068f, -0.005823f, 0.001416f, 0.001648f, -0.003266f, 0.002595f, 0.015294f, -0.000678f, 0.000008f, -0.009587f, 0.004837f, -0.000622f, -0.000275f, -0.008724f, 0.008760f, -0.007451f, 0.002750f, 0.003562f, 0.006941f, -0.000972f, -0.003292f, -0.020489f, -0.030886f, 0.008479f, -0.003195f, -0.031445f, 0.008712f, 0.003019f, 0.028514f, 0.024966f, -0.023148f, -0.028060f, 0.006385f, -0.021453f, -0.011103f, 0.000755f, 0.042414f, 0.000478f, -0.005258f, -0.037926f, -0.018815f, -0.003389f, -0.028080f, -0.042963f, 0.029509f, -0.011163f, -0.013415f, -0.002576f, 0.031993f, -0.010085f, 0.003601f, -0.006498f, -0.006288f, -0.018627f, -0.009767f, 0.003011f, -0.044643f, -0.028882f, -0.008162f, -0.016428f, -0.015046f, -0.005324f, -0.017451f, 0.015128f, 0.007078f, 0.004793f, -0.010599f, 0.007616f, -0.064494f, 0.059993f, 0.035368f, -0.006165f, -0.008089f, 0.033721f, 0.002145f, -0.020292f, -0.028684f, -0.003735f, -0.009996f, -0.012055f, -0.017216f, -0.017758f, 0.022212f, 0.020567f, -0.009242f, 0.045257f, + -0.025098f, -0.020753f, -0.018578f, 0.000061f, 0.014905f, -0.053126f, 0.015788f, -0.016829f, 0.027841f, -0.030119f, 0.013294f, -0.002767f, -0.010088f, 0.020733f, -0.038997f, 0.036713f, 0.002183f, -0.000516f, -0.008189f, 0.001062f, -0.000447f, -0.018576f, 0.003735f, -0.005149f, 0.009783f, 0.012353f, -0.011256f, 0.005648f, 0.007984f, 0.017346f, 0.000712f, -0.005664f, -0.000882f, -0.001550f, -0.006811f, 0.005086f, -0.002609f, -0.004155f, 0.004523f, -0.006884f, -0.002103f, 0.001689f, 0.005081f, 0.005961f, -0.013777f, -0.010604f, -0.009105f, 0.001580f, 0.005765f, 0.000009f, 0.003833f, 0.003245f, 0.009379f, 0.004862f, -0.007444f, 0.007009f, 0.001479f, 0.030806f, 0.002494f, 0.071766f, 0.023320f, -0.001417f, 0.003034f, -0.027719f, -0.036005f, 0.044829f, -0.013324f, 0.005107f, 0.059418f, -0.015472f, -0.002931f, -0.012701f, 0.046319f, 0.008939f, -0.019236f, 0.027395f, -0.010021f, 0.040682f, 0.021283f, 0.010141f, 0.005957f, -0.004499f, -0.015640f, -0.005074f, -0.004296f, -0.043602f, -0.011028f, -0.007029f, 0.024045f, -0.013512f, 0.004472f, 0.008011f, -0.031317f, -0.046551f, -0.001741f, 0.040166f, + -0.002766f, 0.035677f, -0.006266f, -0.049912f, -0.019405f, 0.002247f, 0.011221f, 0.008999f, -0.040671f, 0.000314f, -0.011708f, 0.029441f, -0.030206f, 0.037224f, 0.055009f, 0.035691f, -0.011309f, 0.006621f, 0.022135f, -0.007973f, 0.043079f, 0.049912f, 0.043959f, 0.014346f, 0.048210f, -0.001703f, -0.019561f, 0.006186f, -0.025360f, -0.031953f, 0.017305f, -0.013752f, 0.039377f, 0.020331f, 0.010368f, -0.013631f, -0.048714f, -0.044148f, 0.030828f, -0.019593f, -0.039440f, 0.026178f, 0.052338f, 0.031440f, -0.016926f, 0.024943f, 0.015266f, -0.005546f, -0.012505f, 0.014761f, -0.018755f, -0.005767f, -0.002112f, -0.012957f, 0.001590f, -0.002886f, 0.010684f, 0.006421f, -0.002619f, -0.017223f, 0.009425f, 0.008557f, 0.005872f, -0.003832f, 0.000442f, -0.016121f, 0.001174f, -0.000306f, 0.004033f, 0.003606f, 0.000297f, 0.009367f, -0.003440f, 0.013015f, 0.014758f, 0.003684f, 0.011962f, 0.000933f, -0.009679f, -0.022854f, 0.005013f, 0.000365f, 0.004762f, -0.016278f, -0.036211f, 0.021191f, 0.026542f, -0.000422f, 0.012999f, 0.008723f, 0.012865f, 0.010656f, 0.004919f, -0.002890f, 0.006298f, -0.007605f, + 0.013808f, -0.024622f, -0.068588f, -0.027532f, 0.037649f, 0.002171f, -0.011157f, -0.022976f, -0.000091f, 0.031636f, 0.040440f, 0.008610f, -0.024747f, -0.004373f, 0.032366f, -0.039109f, 0.003787f, -0.004873f, 0.028976f, 0.033001f, -0.026396f, 0.050070f, 0.009783f, 0.001994f, 0.070803f, 0.000348f, -0.022104f, 0.024766f, -0.011724f, 0.003532f, -0.015016f, 0.005254f, 0.047097f, 0.005421f, 0.059973f, 0.025269f, -0.052172f, -0.057220f, -0.012398f, 0.014882f, 0.032087f, -0.044368f, -0.015581f, -0.006413f, 0.054015f, 0.049370f, -0.042157f, -0.001630f, -0.025678f, 0.016301f, -0.008785f, 0.056448f, 0.000852f, -0.012395f, 0.037163f, -0.007523f, -0.043691f, -0.022090f, -0.007060f, 0.045529f, -0.040229f, 0.024454f, 0.070826f, 0.033513f, 0.047579f, -0.012670f, 0.019418f, -0.012763f, -0.029241f, -0.028185f, 0.014962f, -0.020023f, -0.001226f, -0.007160f, 0.013034f, -0.000281f, 0.028852f, -0.006400f, -0.013088f, -0.004641f, -0.005624f, 0.007122f, -0.004422f, 0.011121f, -0.019563f, 0.014617f, -0.012889f, -0.005882f, 0.004205f, -0.005106f, -0.005993f, 0.009269f, -0.008500f, -0.003200f, -0.002416f, -0.007054f, + -0.024068f, -0.013565f, -0.002193f, -0.002734f, -0.006994f, -0.009381f, -0.002066f, 0.007335f, -0.004053f, 0.004376f, -0.003560f, -0.000091f, 0.005672f, -0.018454f, 0.002240f, -0.002466f, -0.013872f, -0.032981f, 0.024488f, 0.036962f, 0.030154f, -0.052766f, -0.025717f, 0.033943f, 0.101280f, 0.006565f, 0.021690f, -0.029112f, 0.008782f, -0.001051f, -0.005173f, -0.027306f, 0.007978f, -0.009329f, 0.048384f, 0.039119f, -0.051417f, -0.022169f, 0.053502f, 0.027807f, 0.018958f, 0.006171f, 0.028712f, 0.034412f, 0.010396f, 0.020764f, 0.018292f, -0.024159f, 0.003200f, -0.023644f, -0.011243f, 0.007119f, -0.005170f, 0.004587f, -0.021241f, -0.018171f, 0.014016f, -0.003333f, 0.019493f, 0.016221f, -0.047586f, 0.035761f, 0.006609f, 0.028904f, -0.032262f, 0.018807f, 0.028202f, -0.021636f, -0.036784f, -0.036047f, -0.040693f, -0.039727f, -0.033800f, 0.012596f, 0.059142f, 0.016412f, 0.017931f, 0.028884f, 0.001550f, 0.000150f, -0.023664f, 0.040585f, -0.051020f, -0.100817f, 0.034350f, -0.022459f, 0.003991f, -0.085396f, 0.020848f, 0.028172f, 0.004269f, 0.018037f, 0.014076f, -0.011889f, -0.022456f, -0.033272f, + 0.010398f, 0.008522f, -0.026492f, 0.020005f, -0.010349f, -0.043115f, -0.024503f, 0.000504f, -0.008334f, 0.005686f, 0.002531f, 0.014125f, 0.005651f, 0.003429f, -0.001308f, 0.011452f, -0.006833f, -0.012999f, -0.025470f, -0.013918f, -0.016627f, -0.004511f, -0.009391f, 0.010358f, 0.013672f, 0.011706f, -0.020408f, -0.000502f, -0.008870f, 0.001286f, 0.010996f, 0.004659f, -0.018108f, -0.031451f, -0.003290f, 0.002561f, 0.002215f, -0.010427f, -0.005426f, -0.010944f, -0.002978f, -0.014661f, -0.017232f, 0.012054f, -0.016858f, 0.007984f, 0.002217f, -0.007183f, -0.003868f, 0.011630f, -0.009946f, 0.005244f, -0.011969f, 0.024131f, 0.017388f, 0.023048f, -0.032901f, -0.017112f, -0.004625f, 0.021068f, -0.043908f, 0.073053f, 0.034722f, -0.005987f, 0.039863f, 0.023927f, 0.037989f, -0.019997f, -0.025567f, -0.024867f, 0.046012f, 0.016319f, 0.008311f, 0.041473f, -0.036331f, -0.117653f, -0.007836f, 0.007833f, 0.013996f, -0.066238f, 0.051316f, 0.037292f, -0.071098f, -0.054754f, 0.001754f, 0.029278f, 0.002488f, 0.016623f, 0.037692f, -0.010017f, 0.023404f, -0.034366f, -0.039325f, -0.031373f, -0.040852f, -0.063619f, + 0.017723f, 0.006577f, -0.042701f, 0.056362f, 0.021915f, -0.013783f, -0.013437f, -0.033284f, -0.024923f, -0.057990f, -0.031496f, 0.020617f, 0.051454f, -0.019605f, 0.005162f, 0.021166f, -0.045636f, 0.032932f, 0.044590f, 0.006574f, -0.011427f, 0.038109f, 0.010437f, 0.004293f, -0.027318f, -0.031948f, -0.002343f, 0.056978f, -0.017522f, -0.052574f, -0.000924f, -0.066994f, -0.069790f, -0.072686f, -0.034858f, -0.038350f, -0.024495f, 0.031261f, -0.004392f, 0.028103f, -0.005809f, -0.009279f, -0.026304f, -0.007070f, -0.007754f, 0.015094f, -0.011563f, -0.016811f, -0.003331f, -0.006598f, 0.002463f, -0.024510f, 0.004631f, -0.011300f, -0.009823f, 0.012965f, -0.011754f, -0.003916f, 0.004232f, -0.008728f, 0.019080f, -0.012107f, 0.002844f, 0.030981f, 0.003785f, 0.018099f, -0.006940f, -0.010883f, 0.031388f, 0.004703f, -0.016658f, 0.000607f, 0.000297f, 0.002439f, 0.004435f, -0.008914f, 0.019594f, 0.001190f, -0.001509f, -0.009485f, -0.009872f, -0.025845f, -0.044406f, -0.023408f, -0.023801f, 0.028912f, 0.057165f, 0.021000f, -0.025889f, -0.055060f, 0.059140f, 0.031717f, -0.028323f, -0.015379f, -0.015041f, 0.003285f, + 0.014045f, -0.018200f, 0.030828f, 0.028508f, 0.001769f, -0.019172f, -0.017989f, -0.017105f, -0.002010f, 0.011100f, -0.008425f, -0.018921f, -0.044865f, 0.013909f, 0.039826f, -0.022726f, 0.035241f, 0.001102f, 0.023728f, -0.019611f, 0.026364f, 0.075877f, -0.028198f, 0.033144f, 0.066104f, 0.011489f, -0.011303f, -0.018235f, 0.019340f, 0.001485f, 0.033862f, -0.025659f, 0.090644f, -0.027911f, -0.060456f, 0.014016f, -0.027412f, 0.071616f, 0.023700f, -0.022294f, 0.004361f, -0.043076f, -0.058951f, 0.072729f, 0.008561f, -0.019463f, 0.072026f, -0.037080f, 0.009614f, -0.020900f, 0.041857f, -0.052963f, -0.059293f, -0.042403f, 0.013480f, 0.025715f, 0.047902f, 0.020459f, 0.050614f, 0.079032f, -0.009447f, 0.015998f, -0.010153f, 0.010095f, -0.002249f, 0.003307f, -0.057740f, 0.002294f, -0.079835f, -0.026616f, -0.015519f, 0.014317f, -0.002434f, 0.017679f, -0.006073f, -0.023822f, -0.024899f, -0.005628f, -0.016367f, -0.018325f, -0.031653f, 0.000133f, -0.003055f, 0.024401f, 0.010639f, -0.019528f, 0.018264f, 0.008557f, 0.015127f, 0.019736f, -0.025225f, 0.007295f, -0.010293f, -0.004682f, 0.025919f, -0.008380f, + 0.013083f, 0.017461f, -0.010002f, -0.027579f, -0.013821f, 0.010344f, -0.045351f, -0.014070f, 0.001389f, -0.006254f, -0.009963f, 0.020862f, -0.021221f, -0.023655f, 0.017119f, 0.027988f, -0.012338f, 0.023422f, 0.055652f, -0.008442f, 0.001847f, 0.066191f, 0.007457f, -0.036560f, -0.041959f, -0.037523f, 0.068422f, -0.046060f, 0.027300f, 0.031696f, -0.021662f, 0.006244f, -0.037236f, -0.008853f, 0.030700f, -0.027540f, 0.022247f, -0.009494f, -0.046837f, -0.103787f, -0.008962f, 0.092553f, 0.039246f, 0.009083f, -0.018071f, -0.028423f, -0.004719f, -0.037158f, 0.012280f, -0.052197f, 0.062348f, 0.004113f, 0.007915f, 0.004612f, -0.020448f, -0.062848f, -0.023393f, 0.049622f, -0.040429f, -0.010951f, -0.027817f, 0.021917f, -0.019780f, 0.068852f, -0.010669f, 0.013845f, -0.024751f, -0.065150f, 0.014866f, -0.049843f, -0.010593f, -0.004775f, -0.090062f, -0.076866f, -0.071694f, 0.023575f, -0.012758f, -0.039538f, -0.024868f, -0.025436f, -0.022492f, -0.035319f, -0.022961f, -0.006452f, -0.080751f, 0.022348f, 0.009712f, 0.029625f, -0.017420f, 0.070329f, -0.006777f, 0.013282f, -0.023906f, -0.010087f, 0.038742f, -0.075802f, + 0.032683f, 0.049132f, -0.050121f, -0.033176f, 0.003700f, 0.007696f, -0.012785f, -0.024699f, -0.039108f, -0.002735f, 0.001547f, -0.024237f, 0.021011f, -0.017943f, -0.031018f, -0.017760f, -0.012964f, 0.019794f, 0.000077f, 0.000425f, -0.000087f, 0.014730f, -0.038330f, -0.011400f, -0.004056f, -0.007807f, -0.002066f, 0.000441f, -0.046067f, 0.001264f, -0.014490f, -0.012531f, -0.003383f, -0.021124f, 0.006368f, -0.006141f, 0.004839f, 0.000664f, -0.003432f, -0.005386f, -0.011024f, -0.002097f, -0.008940f, -0.002405f, 0.007149f, -0.010756f, -0.016482f, 0.000361f, -0.003500f, -0.003982f, -0.010076f, -0.019107f, -0.012266f, -0.005022f, -0.001787f, -0.013609f, -0.015877f, 0.028129f, 0.017019f, 0.034038f, -0.012825f, -0.070750f, 0.020410f, 0.001019f, 0.117485f, 0.120244f, 0.014547f, 0.001189f, 0.028331f, 0.014213f, 0.030264f, 0.051897f, 0.019346f, 0.053888f, 0.081423f, -0.020258f, 0.010701f, -0.066857f, -0.009461f, 0.008778f, -0.008625f, -0.019877f, -0.040529f, -0.034081f, 0.018916f, 0.018802f, -0.088841f, 0.063447f, 0.017162f, 0.089528f, -0.005426f, -0.017672f, 0.029292f, -0.006146f, 0.094239f, 0.024047f, + -0.004796f, 0.018178f, 0.018670f, -0.025210f, -0.057502f, -0.045047f, -0.022587f, 0.070400f, 0.000970f, 0.077376f, 0.009535f, 0.075651f, -0.021769f, -0.103925f, -0.038876f, -0.030121f, 0.053872f, 0.006625f, -0.050496f, -0.073146f, -0.051108f, -0.010130f, 0.063261f, -0.054953f, -0.047876f, -0.031506f, 0.056464f, -0.027739f, -0.016410f, -0.072820f, -0.072487f, 0.022947f, 0.012282f, 0.097724f, 0.025135f, -0.010264f, -0.026395f, 0.030698f, 0.031734f, 0.104333f, 0.001918f, -0.033708f, -0.045133f, -0.002831f, -0.004627f, 0.002455f, 0.016241f, 0.015083f, -0.024264f, -0.005419f, 0.007890f, 0.021803f, -0.023301f, -0.018873f, 0.029320f, 0.043215f, 0.020079f, 0.013267f, 0.016798f, -0.018147f, -0.007732f, -0.011413f, -0.002361f, -0.002399f, 0.009494f, 0.000160f, 0.056336f, 0.011850f, -0.002401f, -0.017185f, -0.029561f, 0.028289f, 0.045721f, -0.016524f, 0.000757f, 0.001811f, 0.005724f, 0.026200f, 0.011415f, 0.019469f, 0.019863f, 0.005076f, 0.015462f, 0.005096f, -0.000972f, 0.005117f, -0.013919f, -0.004696f, 0.003416f, -0.008387f, 0.005588f, 0.001554f, 0.071902f, 0.027316f, -0.034946f, 0.067771f, + -0.004207f, -0.133103f, -0.040536f, 0.083970f, 0.093273f, -0.065612f, -0.065705f, -0.066778f, 0.037278f, 0.057137f, 0.114159f, 0.034577f, 0.014740f, -0.065083f, -0.006607f, -0.003990f, 0.025681f, 0.057165f, 0.041498f, 0.003392f, -0.069052f, -0.134124f, -0.035556f, -0.067838f, 0.100949f, 0.106932f, 0.186550f, -0.055832f, -0.179413f, -0.039055f, -0.061638f, 0.139484f, 0.047436f, 0.141469f, 0.036440f, -0.047224f, -0.136692f, -0.092385f, 0.004985f, 0.017066f, 0.153272f, 0.062307f, -0.005318f, -0.126089f, -0.220039f, -0.057480f, 0.004716f, 0.101722f, 0.231548f, 0.050524f, 0.069832f, -0.149144f, -0.228601f, 0.009940f, 0.052523f, 0.182119f, 0.107056f, 0.076570f, -0.042219f, -0.147243f, -0.120476f, -0.001093f, 0.034030f, -0.003080f, 0.091946f, -0.075794f, -0.070973f, -0.017501f, -0.162401f, 0.025489f, 0.007862f, 0.044443f, -0.032580f, -0.065548f, -0.035256f, -0.027628f, -0.074241f, 0.017231f, 0.021828f, -0.023608f, -0.003635f, -0.069581f, 0.010063f, 0.020416f, 0.023101f, 0.032714f, 0.010506f, -0.035484f, 0.012677f, -0.011027f, -0.006004f, 0.005535f, 0.056838f, 0.010067f, -0.001594f, -0.014128f, + -0.042884f, -0.008082f, -0.016980f, 0.017041f, -0.007566f, 0.018878f, 0.012281f, -0.039038f, -0.089140f, -0.043604f, -0.065388f, 0.054148f, 0.054410f, 0.064726f, 0.037222f, -0.082893f, -0.074807f, -0.115771f, -0.027673f, 0.094844f, 0.104791f, 0.102283f, 0.005455f, -0.111626f, -0.083529f, -0.064773f, -0.000855f, 0.168011f, 0.116649f, 0.048065f, -0.089200f, -0.103677f, -0.077674f, 0.039219f, 0.040410f, 0.058766f, 0.031082f, -0.076333f, 0.101439f, -0.002192f, 0.014723f, -0.042696f, -0.096621f, 0.057565f, -0.097298f, 0.103076f, 0.014786f, 0.009220f, 0.021508f, -0.061941f, 0.061198f, 0.006044f, 0.042449f, -0.059393f, 0.020699f, 0.000537f, 0.073500f, -0.029357f, 0.017822f, 0.049242f, -0.056319f, -0.032282f, 0.005042f, -0.051058f, 0.082506f, -0.018564f, -0.034588f, 0.074580f, 0.085262f, -0.022883f, -0.063851f, -0.015590f, -0.056341f, -0.010259f, 0.034056f, -0.005327f, -0.070069f, 0.008380f, 0.036965f, -0.024423f, 0.041750f, -0.034930f, 0.015801f, 0.045370f, -0.018687f, 0.029935f, -0.079766f, -0.079657f, 0.080597f, 0.045311f, 0.124677f, -0.005050f, -0.032379f, 0.106406f, -0.061277f, -0.053884f, + 0.036632f, 0.036015f, 0.059615f, -0.054594f, -0.026809f, 0.016344f, -0.012336f, 0.060360f, -0.048848f, -0.149003f, 0.038061f, 0.083605f, 0.000370f, -0.068936f, 0.012333f, 0.042654f, -0.017428f, -0.017880f, -0.056431f, -0.017772f, -0.046723f, 0.046444f, 0.010479f, -0.032253f, -0.009574f, 0.055429f, -0.039983f, -0.013732f, -0.036220f, -0.003949f, 0.025979f, -0.038705f, 0.019970f, 0.057915f, 0.021302f, -0.000593f, -0.017276f, -0.003023f, -0.022190f, -0.026691f, 0.042794f, -0.018015f, 0.018978f, -0.005914f, -0.023127f, 0.000029f, 0.003893f, 0.004334f, 0.015047f, 0.019427f, -0.034175f, -0.009963f, 0.015724f, 0.014082f, 0.032218f, -0.004208f, -0.029512f, 0.011495f, -0.034231f, 0.016113f, -0.031269f, -0.016931f, -0.000312f, -0.006417f, -0.021253f, 0.046980f, -0.021325f, 0.009759f, 0.019569f, 0.004519f, 0.015158f, 0.031207f, -0.001440f, -0.005442f, 0.000656f, -0.002994f, -0.039264f, -0.024745f, 0.151473f, 0.040988f, 0.042422f, -0.128358f, -0.031541f, -0.100629f, -0.084234f, 0.076068f, 0.080874f, 0.158861f, 0.074041f, -0.021521f, -0.030182f, -0.018715f, 0.050869f, 0.034810f, 0.001720f, 0.077207f, + 0.015748f, -0.030952f, -0.035902f, -0.029583f, 0.056274f, 0.000001f, 0.049305f, 0.022679f, 0.030032f, 0.007322f, -0.011547f, 0.005663f, 0.000344f, 0.007305f, -0.011998f, -0.003216f, 0.016602f, 0.013410f, 0.104937f, 0.083933f, 0.069271f, -0.006017f, 0.019416f, -0.042482f, -0.006368f, -0.026422f, -0.047214f, -0.049911f, 0.015732f, 0.027230f, 0.040299f, 0.048597f, 0.040729f, -0.025077f, -0.063350f, 0.097389f, -0.068911f, -0.030432f, -0.017170f, 0.033450f, 0.004990f, 0.047706f, 0.050304f, 0.043561f, -0.057980f, -0.020950f, 0.008570f, -0.022968f, -0.093895f, 0.063264f, -0.021594f, -0.016964f, 0.036283f, 0.073420f, 0.083799f, 0.060794f, 0.059989f, 0.051410f, -0.054199f, 0.007198f, -0.013489f, -0.016951f, 0.031770f, 0.024874f, 0.033812f, 0.016242f, -0.014724f, -0.027231f, -0.039029f, -0.042697f, -0.085352f, -0.034235f, 0.013125f, -0.004843f, 0.052758f, -0.000029f, -0.023419f, -0.007916f, -0.033737f, 0.013033f, 0.004398f, -0.002463f, -0.000047f, 0.022283f, 0.049433f, -0.005952f, 0.002831f, 0.027085f, 0.002346f, 0.000385f, -0.009445f, -0.003135f, -0.011289f, -0.011151f, 0.003298f, -0.023281f, + 0.010755f, 0.013446f, -0.016839f, -0.025344f, 0.007379f, 0.005208f, -0.008895f, 0.025033f, 0.033822f, -0.004473f, 0.005383f, -0.010794f, -0.033468f, -0.014158f, 0.005895f, -0.195214f, -0.097393f, -0.134050f, 0.096789f, 0.021470f, 0.277208f, 0.286641f, 0.285491f, 0.326370f, 0.321279f, 0.230931f, 0.143617f, 0.180129f, 0.079588f, 0.016832f, -0.151982f, -0.132192f, -0.331897f, -0.290116f, -0.260575f, -0.153436f, -0.193754f, -0.147536f, -0.012167f, -0.047104f, -0.019087f, -0.023220f, 0.001138f, -0.000306f, 0.008746f, 0.037905f, 0.040580f, 0.038856f, 0.114364f, 0.117488f, 0.124403f, 0.088977f, 0.248887f, 0.065151f, 0.104589f, 0.174341f, 0.194222f, 0.072284f, 0.195463f, 0.235359f, 0.185458f, 0.161162f, 0.163727f, 0.018095f, 0.098001f, 0.198096f, 0.195595f, 0.126177f, 0.164132f, 0.143638f, -0.002025f, -0.053092f, -0.037502f, -0.097838f, -0.120879f, -0.015487f, -0.135846f, -0.207020f, -0.161456f, -0.192822f, -0.285316f, -0.130499f, -0.192948f, -0.213721f, -0.302823f, -0.246130f, -0.279274f, -0.318910f, -0.212600f, -0.360605f, -0.426734f, -0.428150f, -0.233116f, -0.289712f, -0.365252f, -0.071763f, + -0.162733f, -0.076302f, -0.041087f, 0.119678f, 0.053131f, 0.175587f, 0.093103f, 0.165861f, 0.157754f, 0.103820f, 0.081700f, 0.128587f, 0.238035f, 0.242331f, 0.243035f, 0.248359f, 0.257924f, 0.313570f, 0.279984f, 0.232555f, 0.285835f, 0.322663f, 0.257734f, 0.193957f, 0.231322f, 0.194732f, 0.125610f, 0.158829f, 0.107224f, 0.053339f, 0.022726f, 0.049033f, 0.014115f, -0.020148f, -0.014161f, -0.025964f, -0.062343f, -0.094567f, -0.094231f, -0.102487f, -0.087836f, -0.109565f, -0.172517f, -0.154967f, -0.178290f, -0.200858f, -0.234201f, -0.233388f, -0.193555f, -0.194227f, -0.159448f, -0.101254f, -0.114372f, -0.077880f, -0.055108f, 0.005580f, -0.001480f, 0.000028f, 0.008599f, 0.034308f, 0.039283f, 0.012924f, 0.030750f, 0.049999f, 0.039235f, 0.017040f, 0.019409f, 0.036693f, 0.020619f, 0.008226f, 0.013541f, 0.019868f, 0.016744f, 0.009773f, 0.008455f, 0.006378f, 0.002691f, 0.000657f} + } +}; +const float CRendBin_Combined_BRIR_coeff_diffuse_re_32kHz[BINAURAL_CHANNELS][2870]={ {-0.000055f, -0.000016f, -0.000030f, -0.000018f, -0.000046f, -0.000008f, -0.000074f, -0.000017f, -0.000239f, 0.000164f, -0.000016f, 0.000165f, -0.000036f, 0.000073f, 0.000441f, -0.000049f, -0.000525f, -0.000519f, -0.000172f, -0.000319f, 0.000042f, -0.000258f, -0.000703f, 0.000200f, -0.000177f, -0.000125f, 0.000186f, 0.000060f, -0.000237f, -0.000368f, -0.000480f, 0.000065f, -0.000289f, -0.000175f, 0.000101f, -0.000504f, 0.000450f, 0.000472f, -0.000271f, -0.000032f, -0.000174f, -0.000470f, 0.000042f, -0.000423f, -0.000335f, 0.000326f, -0.000217f, 0.000489f, 0.002039f, -0.000885f, 0.000905f, -0.000382f, 0.000324f, -0.000012f, 0.000474f, -0.000204f, 0.000119f, 0.000203f, 0.000244f, 0.000260f, 0.000450f, -0.000109f, 0.000054f, 0.000822f, 0.000616f, -0.001615f, 0.000323f, -0.000206f, 0.000083f, -0.000549f, 0.000365f, -0.000692f, 0.000693f, 0.000575f, 0.000285f, -0.000088f, -0.000216f, -0.000253f, 0.000493f, 0.000452f, -0.000200f, 0.000104f, 0.000849f, -0.000315f, -0.000015f, -0.000287f, 0.000102f, 0.000132f, -0.000021f, -0.000238f, 0.000400f, 0.000062f, -0.000120f, 0.000303f, 0.008189f, -0.000591f, + 0.001141f, -0.000020f, 0.000362f, 0.000158f, 0.000276f, 0.000188f, 0.000784f, -0.000451f, 0.000331f, -0.000160f, 0.000136f, 0.000431f, 0.000671f, 0.000268f, 0.000130f, -0.000322f, 0.000611f, -0.000442f, 0.000233f, -0.000205f, -0.000644f, 0.000067f, 0.000224f, 0.000023f, -0.000201f, 0.000057f, -0.000225f, 0.000423f, -0.000869f, 0.000203f, -0.000201f, 0.000230f, -0.000009f, -0.001218f, -0.000423f, 0.000124f, 0.000193f, 0.000141f, -0.000211f, -0.000275f, -0.000238f, 0.000173f, 0.000472f, -0.000195f, 0.000209f, 0.004940f, -0.005836f, 0.001168f, -0.001401f, 0.000771f, -0.000907f, 0.000713f, -0.001241f, -0.000370f, -0.000765f, -0.000137f, -0.000637f, 0.000059f, 0.001149f, 0.001671f, 0.000701f, 0.000375f, 0.000033f, 0.000528f, 0.001196f, 0.000871f, -0.000541f, -0.000650f, -0.000870f, -0.000411f, -0.000501f, 0.000051f, -0.000079f, -0.000072f, 0.000027f, 0.000259f, -0.000403f, 0.000521f, -0.000531f, -0.000706f, 0.000263f, -0.000005f, 0.000055f, 0.000155f, -0.000491f, -0.000555f, 0.000173f, -0.000335f, -0.000457f, -0.000081f, 0.000067f, 0.000365f, -0.011317f, 0.002256f, -0.000570f, 0.000287f, + 0.000244f, -0.000948f, -0.000427f, 0.000900f, -0.000147f, 0.000077f, 0.001010f, 0.000327f, -0.000386f, -0.000704f, 0.000704f, 0.000061f, -0.000854f, -0.001223f, -0.001770f, 0.000571f, -0.000787f, 0.000182f, -0.000255f, 0.000331f, -0.000181f, 0.000125f, -0.000919f, -0.000907f, -0.000566f, -0.000242f, -0.000572f, 0.000171f, -0.000277f, 0.000323f, 0.001062f, 0.000183f, 0.000185f, 0.000703f, 0.000194f, 0.000163f, -0.000023f, -0.000138f, -0.000701f, -0.000166f, 0.000163f, -0.000129f, -0.000033f, -0.013529f, 0.005063f, -0.001263f, 0.001626f, -0.000794f, 0.001173f, -0.000647f, -0.000183f, -0.001153f, 0.000888f, -0.001365f, 0.000910f, -0.000233f, 0.001273f, -0.001728f, 0.000450f, 0.001612f, 0.000476f, -0.001357f, -0.000476f, -0.000816f, -0.000335f, 0.000516f, 0.000268f, 0.000382f, -0.000208f, -0.000461f, -0.000649f, -0.000637f, -0.000048f, -0.000731f, -0.000122f, -0.000679f, -0.000475f, -0.001889f, -0.000522f, -0.000264f, 0.000111f, 0.000045f, 0.000664f, 0.000282f, 0.000654f, -0.000066f, 0.000760f, 0.000179f, 0.000076f, 0.000188f, 0.001689f, 0.005892f, -0.001625f, 0.002614f, -0.001586f, 0.000684f, + -0.001711f, 0.001347f, -0.000123f, 0.001468f, -0.000117f, -0.000147f, 0.001443f, -0.000238f, -0.000200f, 0.001262f, -0.000616f, -0.001158f, -0.001846f, 0.001640f, -0.000133f, 0.001122f, 0.000131f, 0.000797f, 0.000386f, -0.001071f, 0.000456f, 0.000435f, -0.000072f, 0.000553f, 0.000845f, -0.001065f, 0.000141f, -0.000032f, -0.000090f, -0.000611f, -0.000275f, -0.000598f, 0.000163f, -0.000124f, 0.000462f, 0.001381f, 0.000054f, 0.000700f, -0.000124f, 0.000135f, -0.000148f, 0.000212f, 0.000559f, -0.000254f, 0.017789f, -0.004387f, 0.001691f, -0.000849f, 0.001497f, -0.000654f, 0.001149f, -0.000639f, 0.000395f, -0.001731f, 0.000804f, -0.001653f, 0.001266f, -0.000505f, 0.000374f, -0.000481f, 0.001783f, 0.000245f, 0.000449f, -0.000855f, 0.001165f, -0.000104f, -0.000537f, 0.000992f, -0.000768f, -0.001193f, 0.000031f, -0.000372f, 0.000570f, -0.000005f, -0.000178f, -0.000389f, 0.000174f, -0.000039f, 0.000225f, -0.000821f, 0.000194f, -0.000363f, 0.001282f, -0.000239f, 0.000614f, 0.000116f, 0.000516f, 0.000960f, -0.000659f, 0.000052f, 0.000223f, -0.000327f, 0.000754f, -0.000155f, 0.001499f, -0.009227f, + 0.003644f, -0.002847f, 0.001680f, -0.001418f, 0.000488f, -0.001869f, 0.001214f, -0.000747f, 0.001696f, -0.000189f, 0.000740f, -0.001491f, -0.000629f, -0.000097f, -0.000542f, -0.000506f, 0.001956f, -0.001442f, 0.000249f, 0.000911f, -0.001787f, 0.000460f, 0.000632f, -0.000448f, 0.000615f, 0.000206f, 0.000354f, -0.001138f, -0.000100f, -0.000365f, 0.000702f, -0.000567f, 0.000384f, -0.001343f, -0.000271f, 0.000983f, 0.000475f, 0.000312f, -0.000342f, -0.000202f, -0.001025f, -0.001090f, 0.000593f, 0.000221f, -0.000048f, -0.000160f, -0.000095f, 0.000097f, 0.000096f, -0.000228f, -0.000223f, 0.000135f, 0.000143f, -0.000374f, -0.014916f, 0.004886f, -0.002641f, 0.000678f, -0.000246f, 0.000834f, -0.001117f, 0.001208f, -0.000493f, -0.000420f, -0.000146f, 0.000874f, -0.000470f, -0.000698f, 0.000512f, 0.001681f, -0.000230f, 0.000071f, -0.002815f, 0.000243f, 0.000047f, 0.001374f, -0.000445f, -0.000211f, -0.002152f, -0.000737f, 0.000028f, 0.000041f, 0.000750f, 0.001029f, -0.001626f, -0.001492f, 0.000966f, 0.000243f, -0.001676f, -0.001287f, 0.000632f, 0.000365f, -0.000098f, -0.000049f, -0.000643f, 0.000659f, + -0.000202f, 0.000241f, 0.000087f, -0.000879f, -0.000371f, 0.000470f, -0.001357f, -0.000679f, -0.000271f, 0.000287f, -0.000272f, 0.000024f, -0.000678f, -0.000059f, -0.014890f, 0.006590f, -0.003641f, 0.002766f, -0.002540f, 0.001260f, -0.002891f, 0.000667f, -0.001885f, 0.002976f, -0.001506f, 0.001050f, -0.000184f, 0.000022f, -0.001364f, -0.000389f, -0.000564f, 0.002694f, -0.000512f, 0.001375f, 0.002183f, 0.001253f, 0.000323f, -0.000291f, 0.000524f, -0.000477f, 0.001222f, 0.001181f, 0.000168f, -0.000594f, 0.000208f, 0.000226f, -0.000814f, -0.000366f, 0.000618f, 0.000888f, -0.000670f, -0.000656f, -0.000679f, 0.000045f, -0.000282f, 0.000380f, -0.000655f, 0.000468f, -0.001030f, 0.000304f, -0.000565f, -0.000038f, 0.000105f, -0.000409f, -0.000560f, -0.000712f, -0.000668f, -0.000886f, 0.000111f, -0.000808f, 0.005531f, 0.005748f, -0.002123f, 0.001915f, -0.002331f, 0.000361f, 0.000710f, 0.000064f, -0.000931f, 0.001074f, 0.000276f, 0.002279f, 0.001190f, 0.002573f, -0.000391f, 0.001519f, -0.000410f, 0.000972f, 0.001356f, -0.000179f, -0.001874f, 0.001793f, -0.000193f, 0.000756f, -0.000417f, 0.000001f, + 0.000259f, 0.002192f, 0.000329f, -0.001185f, -0.000400f, 0.000292f, -0.000652f, 0.001654f, 0.000708f, -0.000254f, -0.000426f, -0.000931f, 0.000739f, -0.000912f, 0.000943f, 0.000990f, -0.000725f, 0.000570f, 0.000515f, 0.000267f, -0.000070f, 0.001606f, 0.000994f, 0.001177f, -0.000042f, 0.000147f, 0.000529f, -0.000337f, -0.000129f, -0.000105f, -0.000343f, -0.000004f, 0.000088f, 0.000151f, -0.000282f, -0.000660f, -0.000691f, 0.016813f, -0.006003f, 0.002085f, -0.002806f, 0.001914f, -0.001848f, 0.002460f, -0.000844f, 0.000115f, -0.001845f, 0.003693f, -0.000531f, 0.003328f, 0.000208f, 0.000570f, -0.002230f, 0.000796f, 0.003346f, -0.001029f, -0.002816f, 0.000416f, 0.000120f, 0.001306f, -0.002030f, 0.001664f, -0.000016f, 0.000146f, -0.000176f, -0.001960f, -0.000575f, 0.000327f, -0.002355f, 0.000391f, 0.000960f, 0.000788f, -0.000661f, -0.000187f, -0.000087f, 0.001105f, 0.000334f, -0.000188f, -0.000482f, 0.000861f, 0.000595f, 0.002138f, 0.000553f, -0.000318f, 0.001195f, 0.000479f, -0.000122f, 0.000395f, 0.000907f, 0.000598f, 0.000126f, 0.000144f, -0.000693f, 0.000150f, -0.000067f, 0.000886f, + -0.000091f, 0.000351f, -0.000096f, 0.000315f, 0.005629f, -0.008132f, 0.004872f, -0.003616f, 0.001521f, 0.000550f, -0.000369f, -0.000307f, 0.000967f, -0.002047f, -0.001302f, -0.001060f, -0.000826f, -0.002799f, 0.001418f, -0.002600f, -0.000105f, -0.002080f, 0.000764f, -0.001566f, -0.001234f, -0.000623f, 0.002365f, 0.000332f, 0.002301f, 0.001209f, 0.001577f, 0.002278f, 0.000118f, -0.000289f, -0.000349f, 0.000642f, 0.001750f, -0.000146f, -0.000128f, -0.001169f, 0.000888f, -0.000142f, -0.000699f, 0.000649f, 0.000540f, 0.001828f, 0.000746f, 0.000862f, -0.001295f, -0.000602f, -0.000076f, -0.000240f, 0.000891f, -0.002616f, 0.000565f, -0.000643f, -0.000442f, -0.000811f, -0.000919f, -0.000310f, -0.000909f, 0.000370f, -0.000636f, -0.000104f, -0.001381f, -0.001355f, -0.000001f, -0.017258f, -0.003771f, 0.000791f, -0.003274f, -0.001353f, 0.000139f, -0.000104f, -0.002790f, 0.000798f, -0.002779f, 0.000080f, 0.002235f, -0.000418f, -0.000372f, 0.001226f, 0.000804f, 0.001248f, 0.000073f, 0.001510f, -0.000838f, 0.000427f, 0.001753f, -0.000121f, -0.000110f, -0.001151f, 0.001669f, -0.001295f, -0.000710f, 0.000435f, + 0.000676f, 0.001272f, 0.003932f, -0.001079f, -0.000639f, -0.001697f, 0.000097f, -0.001251f, 0.000299f, -0.000501f, -0.001849f, -0.000118f, 0.002368f, 0.000664f, -0.001594f, -0.000796f, 0.000787f, -0.000970f, -0.001208f, 0.000223f, -0.000569f, 0.000136f, 0.000252f, 0.001487f, 0.000215f, 0.000728f, 0.000394f, -0.001258f, -0.000640f, 0.000783f, 0.000739f, -0.000509f, 0.000442f, -0.000103f, -0.021154f, 0.017460f, -0.006103f, 0.005188f, -0.003822f, 0.002922f, -0.001109f, 0.001861f, -0.002028f, 0.001249f, 0.001457f, 0.002107f, -0.001371f, 0.002551f, 0.001262f, 0.004340f, -0.000679f, 0.000366f, -0.002297f, 0.000583f, -0.000805f, -0.001435f, -0.001779f, -0.002047f, -0.001886f, 0.002814f, -0.000127f, 0.003379f, 0.000877f, 0.000620f, -0.000057f, 0.000431f, -0.001491f, 0.000240f, -0.000544f, 0.000704f, 0.002002f, 0.000359f, 0.000660f, 0.000119f, 0.000209f, -0.001521f, -0.000833f, -0.000058f, -0.000116f, 0.000204f, -0.000464f, -0.001401f, 0.000034f, 0.001505f, -0.000484f, 0.000444f, 0.000438f, -0.001242f, 0.000854f, 0.000368f, 0.000470f, -0.000255f, 0.000142f, -0.000135f, -0.000388f, 0.000111f, + 0.001352f, 0.012327f, -0.001896f, -0.003977f, -0.001382f, -0.000838f, -0.000639f, -0.003504f, -0.001840f, 0.000977f, 0.000601f, 0.001000f, 0.001247f, -0.002355f, 0.000952f, -0.000462f, 0.000847f, 0.003777f, -0.003817f, 0.001320f, 0.001324f, 0.001028f, -0.000983f, -0.002209f, 0.001725f, 0.000514f, 0.001236f, 0.002328f, 0.000007f, 0.003209f, 0.000283f, 0.001492f, 0.000130f, 0.001013f, -0.000876f, 0.001214f, 0.000880f, 0.001159f, -0.000441f, 0.000386f, -0.000086f, 0.001486f, 0.001837f, -0.002713f, 0.003667f, 0.000313f, 0.001029f, 0.000163f, 0.000644f, 0.000713f, -0.000766f, 0.002198f, 0.001192f, 0.000088f, 0.002017f, 0.000859f, -0.001099f, -0.000089f, -0.000733f, -0.000794f, -0.000594f, 0.000369f, -0.000149f, 0.000128f, -0.000041f, -0.002240f, 0.001163f, -0.000885f, 0.000325f, -0.000298f, -0.000123f, -0.000552f, -0.000311f, 0.009770f, 0.000855f, 0.001991f, -0.002527f, -0.000478f, -0.006278f, 0.001502f, -0.000300f, -0.004266f, 0.003579f, -0.001974f, 0.000128f, 0.002627f, 0.001182f, 0.001973f, -0.001509f, 0.000872f, -0.001979f, 0.000040f, -0.001693f, 0.000635f, -0.002573f, 0.003691f, + 0.002663f, 0.002180f, 0.002540f, 0.000567f, -0.000839f, -0.001593f, 0.000719f, 0.002028f, 0.000006f, 0.001383f, -0.000997f, 0.000283f, 0.001343f, 0.000950f, 0.001209f, 0.000088f, 0.000435f, -0.000150f, -0.000860f, 0.000859f, -0.000595f, 0.000403f, 0.000354f, -0.000879f, 0.001202f, -0.001625f, 0.001457f, -0.000761f, 0.001031f, 0.001572f, -0.001914f, 0.000194f, 0.000225f, -0.000781f, -0.001507f, 0.001069f, -0.002446f, -0.001891f, 0.001178f, 0.000497f, 0.000551f, 0.000476f, 0.001528f, 0.001468f, -0.000528f, 0.000207f, 0.000894f, -0.000352f, -0.000003f, 0.015411f, -0.012811f, 0.004347f, -0.003188f, 0.001129f, 0.004004f, 0.003256f, -0.002147f, 0.003904f, 0.002199f, 0.002359f, -0.001615f, 0.001099f, -0.000824f, 0.004635f, 0.001289f, 0.001311f, 0.001795f, 0.001963f, 0.001244f, 0.001342f, -0.003806f, 0.000612f, -0.006880f, -0.002393f, -0.000638f, -0.003941f, 0.000991f, 0.002115f, -0.001486f, -0.002137f, -0.002514f, -0.002414f, -0.001288f, 0.001388f, 0.001095f, -0.003504f, -0.004054f, -0.000311f, -0.002068f, 0.001107f, 0.000901f, 0.000387f, -0.000290f, 0.001919f, -0.001007f, 0.000098f, + -0.000267f, -0.000859f, -0.002604f, 0.002019f, 0.003427f, -0.000463f, -0.000429f, 0.001612f, -0.002415f, 0.002933f, 0.000757f, -0.001486f, -0.000055f, -0.001380f, -0.000581f, -0.000349f, -0.000987f, -0.000264f, -0.000667f, -0.002021f, 0.000527f, 0.000726f, 0.000683f, 0.000720f, 0.000232f, -0.023850f, 0.002367f, -0.002129f, 0.000875f, 0.002430f, 0.001744f, 0.004864f, -0.002001f, -0.000170f, 0.000391f, 0.005823f, 0.002021f, -0.004564f, -0.002983f, 0.002568f, 0.003443f, -0.000866f, -0.001304f, -0.000097f, 0.001587f, 0.003559f, 0.003615f, -0.000054f, -0.006480f, -0.001876f, -0.000672f, -0.000780f, 0.003754f, -0.001729f, 0.002190f, 0.000213f, -0.000416f, -0.003363f, 0.000261f, 0.002673f, -0.004304f, -0.002523f, -0.001017f, -0.000756f, -0.002045f, -0.001707f, -0.004025f, -0.000746f, -0.002732f, 0.000022f, 0.000582f, 0.002892f, -0.001983f, -0.001306f, 0.000241f, -0.000296f, 0.000443f, -0.002503f, 0.000971f, 0.000942f, 0.000303f, 0.000135f, -0.001898f, -0.001720f, -0.000964f, -0.000545f, -0.000159f, -0.003234f, 0.000646f, 0.000934f, -0.001404f, -0.002974f, 0.001175f, -0.000151f, -0.001499f, -0.000301f, + -0.000703f, -0.000503f, 0.001865f, -0.014008f, 0.014866f, -0.002124f, 0.000938f, 0.003502f, 0.004200f, -0.003165f, 0.002022f, 0.000799f, 0.002594f, 0.001757f, 0.003662f, 0.002069f, -0.002480f, -0.004122f, 0.000586f, 0.004361f, 0.008712f, -0.002107f, -0.002959f, 0.002280f, 0.001415f, -0.001667f, -0.004292f, -0.000876f, -0.000863f, -0.003886f, 0.003401f, 0.004048f, 0.000064f, 0.000939f, -0.000080f, 0.003182f, -0.002485f, -0.007704f, 0.003248f, -0.000928f, 0.002577f, 0.001231f, 0.000109f, -0.001911f, -0.002960f, 0.002047f, 0.002427f, 0.001768f, -0.000344f, -0.000162f, 0.002669f, 0.001494f, 0.000823f, -0.001594f, 0.002247f, 0.001872f, -0.000311f, -0.000587f, -0.001302f, 0.001535f, 0.000050f, -0.003804f, 0.003128f, 0.001867f, -0.000708f, 0.000893f, -0.000473f, 0.000098f, -0.000072f, 0.000924f, 0.000246f, 0.001137f, 0.001845f, 0.000982f, -0.000281f, -0.001121f, -0.000737f, 0.002657f, 0.001058f, -0.000503f, -0.000815f, -0.000134f, 0.004188f, 0.000172f, -0.003224f, -0.006604f, 0.001598f, -0.000344f, -0.005449f, 0.001842f, -0.001805f, 0.000255f, -0.002063f, -0.001608f, 0.001718f, 0.004149f, + 0.000512f, 0.005496f, 0.002494f, -0.002766f, -0.003635f, 0.006014f, -0.002607f, -0.000192f, 0.000538f, -0.005644f, -0.000042f, 0.002987f, -0.003275f, -0.000868f, 0.003780f, 0.000240f, 0.001975f, 0.000059f, 0.002489f, -0.000420f, -0.001689f, -0.000226f, 0.003305f, 0.004463f, -0.001463f, 0.000907f, 0.000776f, 0.002977f, -0.001772f, -0.000311f, 0.000580f, -0.000752f, 0.001931f, 0.000874f, 0.000160f, -0.001013f, 0.001545f, 0.001718f, 0.000089f, 0.000085f, 0.001285f, 0.002009f, -0.002412f, -0.000008f, 0.000673f, 0.001103f, -0.001235f, 0.001000f, 0.000495f, 0.000036f, 0.000700f, -0.000762f, 0.000336f, 0.000799f, 0.001666f, 0.002014f, -0.001624f, 0.000184f, 0.031279f, -0.002987f, 0.000540f, 0.001968f, -0.002784f, -0.004826f, -0.002796f, -0.001185f, -0.005491f, -0.005900f, 0.000476f, -0.005223f, -0.002282f, -0.001493f, -0.001268f, 0.003244f, 0.003780f, 0.001210f, 0.007888f, 0.001449f, -0.003870f, 0.006796f, -0.000654f, 0.004819f, -0.001508f, -0.000482f, -0.004436f, 0.000192f, 0.003975f, -0.000113f, -0.001898f, -0.000743f, 0.000430f, -0.000968f, -0.000808f, 0.001547f, -0.003526f, 0.001463f, + 0.000561f, -0.001663f, -0.003343f, -0.002264f, 0.002627f, 0.002581f, 0.003082f, -0.005132f, 0.002923f, 0.000816f, -0.000093f, 0.000255f, 0.000542f, 0.000589f, 0.000700f, -0.000419f, 0.000307f, 0.002744f, -0.000736f, 0.001091f, 0.001310f, -0.001116f, 0.002294f, 0.002608f, 0.000466f, -0.000212f, 0.002425f, 0.001724f, 0.001354f, 0.001629f, -0.001976f, -0.000913f, 0.000499f, -0.000205f, -0.000263f, 0.000150f, 0.001105f, 0.000304f, -0.001914f, -0.018376f, -0.030813f, 0.011131f, -0.000800f, 0.004619f, -0.005408f, 0.000235f, -0.006262f, -0.000830f, -0.009021f, 0.003870f, 0.004134f, -0.000222f, -0.000720f, -0.000134f, 0.000819f, -0.002176f, -0.007694f, 0.014109f, 0.000961f, -0.001834f, 0.004826f, 0.000838f, -0.002574f, 0.006761f, 0.007520f, -0.003264f, 0.004428f, 0.000839f, -0.000981f, -0.007096f, -0.003892f, 0.005499f, -0.002863f, 0.000753f, -0.000402f, 0.003729f, -0.005787f, -0.006512f, 0.000897f, 0.000066f, -0.004404f, 0.002616f, 0.000517f, -0.002766f, 0.001914f, -0.003044f, -0.002533f, 0.001164f, 0.001128f, 0.000127f, -0.000830f, -0.001454f, 0.001774f, 0.002987f, 0.000418f, 0.000915f, + -0.000891f, -0.000904f, 0.002616f, 0.000279f, 0.000568f, -0.002728f, -0.000644f, -0.001835f, 0.001460f, 0.002167f, -0.000004f, 0.001776f, -0.000050f, 0.002379f, -0.001981f, 0.001173f, -0.000052f, -0.000159f, -0.001873f, -0.000064f, -0.001609f, -0.000255f, -0.009906f, 0.029760f, -0.013222f, 0.002227f, 0.001946f, 0.007463f, -0.000949f, 0.004766f, -0.004710f, 0.000292f, -0.009030f, -0.001726f, 0.000043f, 0.003640f, 0.000602f, 0.003749f, -0.002590f, -0.005480f, 0.000707f, -0.008244f, -0.008693f, 0.000257f, -0.002858f, -0.000154f, 0.000741f, 0.001252f, -0.002157f, -0.001434f, -0.003105f, -0.004697f, 0.001892f, 0.002289f, -0.006129f, -0.002764f, -0.007703f, 0.000132f, -0.003404f, 0.002779f, 0.003237f, -0.006334f, 0.000999f, 0.005250f, 0.004713f, -0.002431f, 0.001716f, -0.001792f, -0.000898f, 0.001491f, -0.002874f, -0.000601f, 0.002673f, 0.002105f, 0.001831f, 0.002264f, 0.001199f, -0.000649f, 0.001764f, 0.001183f, -0.001324f, -0.000049f, 0.003600f, -0.000358f, -0.001661f, -0.000507f, 0.001483f, -0.001523f, -0.003688f, -0.000246f, -0.001290f, 0.000963f, 0.000781f, -0.000516f, -0.001496f, -0.002199f, + -0.002601f, 0.002654f, -0.000885f, -0.000082f, -0.000586f, -0.000165f, -0.000328f, -0.024587f, -0.007617f, 0.002768f, -0.003888f, 0.003509f, -0.001623f, 0.000034f, -0.007248f, -0.008707f, -0.001184f, -0.003048f, 0.003644f, 0.001039f, -0.001061f, -0.017996f, 0.009032f, 0.000642f, 0.007871f, 0.009792f, 0.006772f, -0.009408f, -0.002299f, -0.000910f, -0.002351f, 0.002031f, 0.002231f, -0.000161f, -0.003430f, 0.003807f, -0.006366f, -0.003401f, 0.005647f, 0.000292f, -0.002435f, 0.006612f, 0.000146f, 0.006936f, -0.002399f, -0.001108f, 0.000823f, 0.002174f, -0.004967f, -0.003665f, -0.000875f, 0.003908f, -0.001424f, 0.000636f, -0.001565f, 0.002613f, 0.003274f, 0.000638f, 0.000174f, -0.005758f, -0.000601f, 0.002822f, 0.003160f, -0.001801f, 0.003540f, 0.001169f, -0.000980f, 0.000927f, -0.003597f, -0.001122f, -0.002407f, 0.002376f, 0.000372f, -0.000838f, 0.000856f, -0.006141f, 0.000039f, 0.001175f, 0.002942f, 0.000974f, -0.001611f, 0.002850f, 0.000270f, -0.003868f, -0.001762f, -0.001981f, -0.000546f, 0.000822f, 0.015736f, 0.005306f, -0.009468f, -0.001618f, -0.004080f, 0.003295f, -0.005717f, 0.004777f, + -0.001067f, 0.005556f, 0.003858f, 0.006746f, -0.009074f, 0.010907f, -0.006694f, 0.006387f, -0.003664f, 0.003835f, 0.000716f, 0.003259f, -0.005806f, -0.013289f, 0.005161f, 0.009283f, -0.003365f, 0.003823f, -0.004715f, 0.001135f, -0.003097f, 0.009762f, -0.000095f, -0.000936f, 0.002323f, -0.004702f, -0.003293f, -0.002745f, 0.004271f, 0.000072f, -0.001575f, 0.000034f, -0.000843f, 0.006717f, 0.004484f, -0.002472f, 0.002168f, 0.002574f, -0.002777f, -0.001581f, -0.002501f, -0.005038f, -0.000698f, 0.000133f, -0.000686f, -0.001835f, -0.005140f, -0.000184f, 0.007852f, 0.004287f, -0.003279f, 0.004409f, -0.000468f, -0.000049f, 0.003681f, 0.001949f, -0.003743f, 0.001440f, 0.000837f, 0.003893f, 0.004637f, -0.003656f, 0.001674f, 0.002730f, 0.003541f, -0.000289f, -0.000101f, -0.001248f, -0.000645f, 0.002012f, -0.000322f, 0.003638f, -0.000810f, 0.033311f, -0.027211f, -0.004587f, 0.001331f, -0.000553f, -0.007542f, 0.002492f, 0.001938f, 0.010617f, -0.003515f, 0.002063f, 0.008720f, 0.000207f, 0.005232f, 0.017265f, -0.003788f, -0.001157f, -0.009031f, -0.008449f, 0.000356f, 0.002830f, -0.003827f, 0.001610f, + 0.015219f, 0.008790f, 0.001237f, 0.000545f, 0.001212f, 0.008408f, -0.007070f, -0.003146f, -0.000420f, 0.004321f, -0.000704f, 0.001015f, -0.003600f, 0.001317f, -0.006372f, -0.003763f, -0.004824f, 0.000046f, -0.004323f, 0.000996f, -0.007679f, 0.003498f, -0.015316f, -0.003946f, 0.002071f, 0.002792f, -0.000598f, -0.003557f, 0.001158f, 0.000419f, 0.001808f, -0.004216f, 0.001837f, -0.002482f, -0.002790f, -0.006781f, -0.005053f, -0.001518f, -0.000865f, 0.000297f, 0.001122f, 0.002128f, 0.000389f, 0.000998f, -0.004049f, -0.000064f, -0.004937f, -0.000777f, -0.000361f, 0.000094f, 0.001614f, 0.004869f, -0.003091f, -0.001407f, -0.000345f, -0.002656f, -0.004556f, 0.000975f, -0.021140f, -0.014733f, -0.001146f, -0.003034f, 0.010991f, 0.000300f, 0.001984f, -0.013896f, 0.000657f, 0.001838f, 0.000735f, 0.001003f, 0.008288f, -0.010465f, 0.002143f, -0.002284f, -0.007228f, -0.003541f, 0.006557f, -0.002379f, 0.005328f, -0.001904f, 0.003062f, 0.001627f, -0.001175f, -0.000884f, 0.003474f, -0.000541f, -0.000113f, -0.008969f, 0.004344f, 0.003926f, 0.003707f, 0.004278f, -0.008060f, -0.008307f, 0.004734f, 0.007086f, + -0.008662f, 0.003102f, 0.001166f, 0.007364f, 0.004206f, 0.000649f, 0.004925f, -0.002694f, -0.005258f, -0.000847f, -0.010073f, -0.007369f, -0.000891f, -0.000435f, 0.001510f, -0.004835f, 0.001583f, -0.003891f, -0.012890f, -0.003822f, -0.003537f, -0.012705f, -0.000063f, -0.002130f, -0.001562f, 0.001379f, 0.003849f, -0.003785f, 0.002340f, 0.001541f, -0.005796f, -0.003713f, -0.004476f, -0.001003f, -0.001389f, -0.000184f, -0.001901f, 0.002357f, -0.002867f, -0.000773f, -0.002450f, 0.004087f, -0.004687f, 0.002675f, -0.000818f, -0.001083f, 0.000159f, 0.001106f, -0.001173f, -0.013165f, 0.020018f, -0.010526f, -0.004497f, -0.006161f, 0.001575f, 0.001712f, 0.002943f, -0.001281f, 0.008734f, 0.006581f, -0.006288f, -0.011157f, 0.004165f, -0.004194f, 0.010246f, 0.000833f, 0.004371f, 0.005375f, -0.003888f, -0.003775f, 0.013617f, -0.007816f, -0.001891f, -0.003972f, 0.000472f, -0.001642f, 0.001802f, -0.002314f, -0.000913f, -0.010517f, 0.009267f, -0.003244f, -0.000832f, 0.010967f, -0.007523f, -0.009481f, 0.000852f, -0.004302f, -0.006242f, -0.000041f, -0.003203f, 0.002485f, -0.013681f, -0.004543f, -0.003364f, -0.000323f, + 0.004808f, 0.000068f, 0.000951f, 0.002500f, -0.002356f, 0.001913f, 0.003208f, 0.002791f, 0.003043f, -0.001738f, -0.002911f, -0.002520f, 0.003460f, -0.008260f, -0.001823f, -0.001934f, -0.002060f, 0.005431f, -0.003682f, -0.005771f, 0.005850f, 0.001809f, 0.003514f, 0.006979f, -0.002570f, -0.002299f, 0.003417f, -0.003736f, -0.004780f, -0.004360f, 0.002587f, 0.002024f, -0.002609f, 0.002428f, 0.000776f, 0.002860f, 0.000483f, -0.005198f, 0.003474f, -0.001706f, -0.027533f, 0.013750f, 0.014815f, 0.007582f, 0.006884f, -0.004940f, 0.006997f, -0.011906f, 0.000373f, -0.013986f, -0.001855f, -0.006117f, 0.006467f, -0.006699f, -0.005566f, -0.001540f, -0.010266f, 0.002987f, -0.004706f, 0.004501f, -0.009639f, 0.016011f, -0.005297f, 0.007551f, -0.006612f, 0.000620f, -0.006625f, -0.002137f, 0.003602f, 0.010241f, 0.011486f, -0.005798f, 0.000012f, -0.003437f, -0.006115f, -0.004674f, -0.016479f, -0.000428f, 0.002722f, -0.015506f, 0.005999f, 0.003015f, 0.004203f, 0.007367f, 0.004632f, 0.002445f, -0.005233f, -0.001739f, -0.005833f, -0.002983f, 0.003064f, -0.012413f, 0.004842f, 0.002379f, 0.000754f, -0.005890f, + -0.003487f, 0.003133f, 0.009935f, 0.004150f, 0.002540f, -0.003980f, 0.004120f, 0.000530f, -0.004774f, 0.001226f, -0.003465f, -0.005450f, -0.002855f, -0.001328f, -0.004933f, 0.005513f, 0.003113f, 0.004475f, 0.002474f, -0.004130f, 0.001299f, 0.006899f, -0.001419f, 0.006403f, 0.003385f, 0.002329f, 0.004311f, -0.002337f, -0.002656f, 0.001619f, 0.001087f, 0.022785f, -0.015698f, -0.006594f, -0.002015f, -0.000096f, 0.011082f, -0.002127f, 0.003613f, -0.006426f, 0.003415f, -0.004005f, -0.018046f, -0.012417f, -0.004643f, 0.006430f, -0.000800f, -0.009988f, -0.009364f, -0.019685f, -0.006372f, 0.002482f, 0.002628f, 0.000874f, -0.002055f, -0.001194f, -0.006126f, 0.001560f, 0.002526f, 0.003302f, 0.000732f, -0.000936f, -0.002389f, -0.009412f, -0.002426f, -0.002169f, 0.004681f, -0.001020f, -0.007518f, -0.002978f, 0.002129f, -0.008445f, 0.001404f, -0.008708f, 0.004788f, 0.006737f, -0.006479f, -0.012585f, -0.002467f, -0.003986f, -0.005787f, 0.000563f, 0.001092f, 0.001194f, 0.003037f, 0.000116f, -0.004972f, 0.007826f, 0.012172f, -0.005937f, 0.005020f, 0.002002f, 0.005742f, -0.008893f, 0.003289f, 0.001079f, + 0.003107f, -0.012773f, 0.010012f, 0.001175f, 0.001081f, -0.001594f, -0.007326f, 0.001845f, 0.000865f, 0.001738f, 0.002164f, -0.007979f, -0.004250f, 0.001518f, 0.003666f, -0.002053f, -0.000069f, 0.002902f, 0.001105f, -0.001477f, -0.003867f, 0.002706f, 0.037102f, -0.020680f, 0.001932f, -0.002051f, -0.004378f, -0.015425f, -0.000798f, -0.000828f, 0.012614f, 0.005777f, 0.025446f, -0.010079f, 0.001016f, 0.002803f, 0.006125f, -0.002577f, -0.001133f, 0.010322f, -0.006426f, 0.014845f, 0.009029f, -0.020589f, 0.019684f, 0.006942f, -0.007047f, -0.005104f, -0.007690f, -0.004018f, 0.001452f, 0.000915f, -0.005516f, 0.013063f, 0.001714f, -0.006245f, -0.005496f, 0.001282f, -0.006814f, -0.012106f, 0.000158f, 0.007236f, 0.002918f, 0.008797f, -0.004044f, 0.002739f, 0.009459f, 0.013551f, 0.003236f, -0.014021f, 0.004641f, -0.004514f, -0.007692f, 0.002041f, 0.005969f, 0.003407f, -0.001676f, -0.012730f, -0.011108f, 0.015695f, -0.002038f, 0.012128f, 0.001423f, -0.004784f, 0.005980f, -0.010527f, -0.004628f, 0.005067f, -0.001329f, 0.010428f, -0.008360f, -0.016628f, -0.004639f, -0.000824f, -0.005078f, -0.003995f, + 0.010365f, -0.003471f, 0.001927f, -0.009502f, -0.009245f, 0.004523f, 0.002405f, 0.003808f, -0.004015f, 0.003887f, 0.000421f, -0.002230f, -0.000457f, -0.041951f, -0.027308f, 0.009837f, -0.014256f, 0.004368f, -0.007193f, -0.025440f, -0.018860f, 0.033635f, -0.015684f, 0.015111f, 0.008476f, -0.008964f, 0.007728f, -0.005150f, 0.010494f, 0.011643f, -0.000902f, -0.003492f, 0.020100f, -0.006725f, -0.023014f, 0.000228f, -0.009722f, 0.002188f, 0.002022f, 0.013549f, 0.007117f, 0.002702f, 0.006562f, -0.006311f, -0.000143f, 0.014849f, 0.009444f, -0.002853f, 0.003718f, -0.013394f, -0.020622f, -0.015243f, -0.010701f, -0.003111f, -0.003061f, 0.003641f, -0.002059f, -0.005856f, 0.012976f, 0.003302f, -0.010015f, -0.009381f, -0.002810f, 0.003663f, -0.010090f, 0.003819f, 0.012095f, -0.000400f, 0.004436f, -0.008566f, 0.006378f, 0.004599f, 0.001355f, 0.004694f, -0.007556f, -0.011599f, -0.016266f, 0.007937f, 0.006192f, 0.000400f, 0.006144f, 0.001037f, -0.007549f, -0.001714f, 0.000408f, -0.013044f, -0.001329f, -0.020177f, -0.011163f, 0.003187f, -0.005272f, 0.003682f, 0.000315f, -0.002807f, -0.002892f, -0.002042f, + -0.003889f, 0.003391f, -0.000060f, -0.000752f, -0.049993f, 0.017027f, -0.003981f, -0.003287f, 0.008928f, 0.002184f, 0.004978f, 0.021769f, 0.012997f, 0.016437f, 0.008272f, 0.022449f, -0.003948f, -0.021891f, 0.003224f, -0.002474f, -0.009376f, -0.019397f, -0.008456f, 0.016928f, 0.003843f, -0.001191f, 0.003536f, -0.001311f, 0.000240f, 0.014259f, 0.001815f, 0.005276f, -0.002159f, 0.003510f, 0.014229f, -0.003960f, -0.009567f, 0.007203f, -0.016991f, -0.017103f, -0.010975f, -0.002190f, 0.000475f, 0.007044f, 0.016676f, 0.000225f, -0.005750f, -0.016653f, -0.027228f, -0.009618f, -0.003969f, -0.001663f, -0.000177f, 0.010016f, -0.012474f, 0.022441f, 0.011687f, -0.002174f, 0.006476f, -0.008891f, 0.001619f, 0.000146f, 0.010406f, 0.020045f, 0.013557f, -0.011860f, -0.004958f, 0.003321f, -0.001897f, -0.002557f, 0.001045f, -0.006143f, -0.019450f, -0.001511f, -0.003579f, -0.001433f, 0.003062f, -0.007616f, -0.002546f, -0.013317f, -0.001398f, 0.001828f, 0.013923f, 0.006789f, 0.001967f, 0.002209f, 0.003530f, 0.000402f, -0.011755f, 0.002392f, -0.002724f, 0.003109f, -0.001416f, -0.001584f, -0.006424f, 0.000969f, + -0.006770f, 0.020477f, 0.020727f, 0.007141f, 0.013919f, 0.010085f, 0.021742f, -0.018828f, 0.022598f, -0.027237f, -0.004655f, 0.025778f, 0.035288f, 0.007495f, -0.002072f, 0.012956f, -0.010637f, -0.012421f, 0.025574f, 0.004269f, -0.003753f, 0.006360f, 0.020593f, -0.005199f, 0.012695f, -0.003932f, -0.004953f, -0.002278f, 0.009388f, -0.023489f, -0.002719f, 0.011670f, -0.005081f, 0.001382f, -0.008203f, 0.005083f, 0.018910f, -0.017112f, 0.005757f, -0.004947f, 0.006301f, -0.008865f, 0.012765f, 0.001248f, 0.004728f, 0.005281f, -0.020775f, 0.010417f, -0.028994f, -0.005762f, 0.016722f, 0.001960f, -0.010235f, 0.018451f, -0.006119f, -0.010846f, 0.013448f, -0.005279f, -0.003597f, -0.001919f, 0.008202f, -0.001030f, 0.002310f, -0.015759f, 0.005988f, 0.001647f, 0.031360f, -0.023262f, -0.010009f, 0.002951f, -0.005828f, 0.007196f, 0.008990f, -0.011107f, 0.021997f, 0.008316f, 0.000107f, 0.003738f, 0.007508f, -0.003378f, -0.011610f, 0.004821f, -0.005887f, 0.002103f, -0.002194f, 0.005834f, -0.007281f, 0.002433f, 0.000289f, -0.003829f, 0.005228f, -0.001607f, -0.001113f, -0.000408f, 0.041784f, -0.026060f, + 0.001049f, -0.004139f, -0.006928f, 0.000898f, -0.009498f, -0.003991f, -0.030840f, -0.025804f, -0.025701f, 0.008661f, -0.005329f, 0.008560f, -0.005840f, -0.018674f, 0.029896f, 0.020845f, -0.013829f, -0.011609f, -0.016334f, -0.003387f, 0.006430f, 0.009888f, 0.012120f, -0.000816f, 0.009388f, -0.002653f, -0.011772f, -0.014376f, 0.009044f, -0.006528f, 0.027294f, 0.017113f, 0.025177f, 0.003573f, 0.009176f, 0.024794f, 0.017196f, -0.005401f, 0.004555f, -0.001070f, 0.000342f, 0.002656f, -0.011509f, -0.008276f, 0.004479f, -0.014401f, -0.014839f, 0.014429f, 0.016405f, -0.017922f, -0.000560f, 0.031929f, 0.022247f, -0.001109f, -0.010517f, -0.002290f, 0.006637f, 0.006027f, -0.004287f, -0.011848f, 0.014283f, -0.000925f, 0.003520f, 0.010242f, 0.012989f, -0.013538f, 0.005854f, -0.002194f, 0.005416f, -0.021063f, 0.003927f, 0.019076f, -0.018935f, -0.015546f, -0.008053f, 0.008489f, 0.015054f, -0.008458f, 0.008294f, -0.007287f, -0.000720f, 0.000467f, 0.003157f, 0.005660f, -0.002601f, -0.001131f, 0.003443f, 0.003191f, 0.000063f, -0.000397f, 0.002494f, 0.033849f, 0.013052f, -0.004486f, -0.001058f, 0.010637f, + -0.012626f, -0.016436f, 0.014157f, -0.019643f, -0.025434f, 0.006797f, -0.013629f, -0.017590f, -0.009151f, 0.016858f, 0.041329f, 0.017115f, -0.022425f, 0.042314f, 0.004955f, -0.006601f, 0.007669f, -0.024667f, 0.006330f, 0.003436f, -0.017650f, 0.015334f, -0.004708f, 0.003044f, -0.012691f, 0.007180f, -0.011593f, 0.021420f, -0.025290f, -0.009316f, -0.008699f, 0.012091f, 0.013992f, 0.012433f, -0.013411f, 0.003953f, -0.014022f, -0.004030f, 0.007567f, 0.017899f, 0.008320f, -0.008208f, 0.017487f, 0.008896f, 0.014120f, 0.000950f, 0.016450f, -0.007160f, 0.009126f, -0.024939f, 0.028093f, -0.002430f, 0.003971f, -0.007429f, -0.014542f, 0.000749f, 0.009432f, 0.022387f, 0.006655f, -0.026778f, 0.011492f, -0.010836f, 0.022132f, 0.001904f, -0.008347f, 0.004271f, -0.007207f, 0.004594f, -0.015516f, 0.006229f, 0.001564f, 0.001356f, 0.002575f, -0.003057f, 0.001688f, -0.004206f, -0.006455f, 0.008728f, 0.005557f, 0.005028f, -0.011479f, 0.003804f, -0.006188f, 0.005390f, 0.001298f, -0.000725f, 0.002789f, 0.001285f, -0.069152f, 0.003157f, 0.011692f, 0.027320f, 0.009043f, -0.042494f, 0.056852f, 0.020922f, + -0.025891f, 0.009468f, 0.056545f, 0.012807f, -0.013615f, -0.001584f, -0.034111f, 0.017702f, 0.001722f, -0.008615f, 0.005021f, 0.011845f, -0.022089f, 0.011995f, -0.027703f, 0.003075f, -0.025242f, -0.022635f, -0.009603f, 0.010852f, 0.016386f, -0.012307f, 0.014342f, -0.024555f, -0.003458f, 0.027897f, 0.002658f, -0.009855f, -0.003167f, 0.005578f, -0.006335f, -0.018163f, -0.020354f, -0.002546f, -0.009294f, 0.020208f, -0.028045f, 0.029976f, 0.009586f, 0.003994f, -0.009890f, -0.003092f, 0.013880f, -0.010982f, 0.018693f, 0.004807f, 0.016905f, -0.006009f, -0.009671f, -0.029258f, 0.010154f, -0.002770f, -0.030279f, 0.009320f, -0.001972f, 0.018695f, 0.029842f, -0.012360f, 0.006838f, 0.014897f, 0.015727f, 0.003430f, -0.009014f, -0.001550f, -0.036693f, -0.001568f, 0.003419f, 0.009312f, -0.000131f, 0.024944f, 0.005407f, 0.012527f, -0.013833f, -0.009692f, 0.018540f, -0.001644f, -0.003712f, 0.011450f, -0.002554f, -0.002881f, -0.000166f, -0.000351f, 0.001246f, -0.001732f, 0.010350f, 0.085614f, 0.038881f, 0.007884f, 0.013690f, -0.017862f, -0.012073f, -0.004425f, 0.032193f, -0.023260f, 0.003425f, -0.019398f, + -0.053057f, -0.025582f, 0.011853f, -0.013753f, 0.008463f, -0.021184f, -0.001315f, -0.022759f, 0.019046f, -0.023040f, -0.016638f, -0.049258f, -0.009392f, -0.007965f, -0.013128f, 0.025251f, -0.008546f, -0.020713f, 0.006403f, 0.019418f, 0.007055f, 0.006411f, -0.003187f, -0.004411f, -0.013198f, 0.009764f, -0.016918f, -0.004779f, -0.010606f, -0.029490f, 0.004205f, -0.020551f, 0.007942f, 0.002329f, -0.006192f, -0.000945f, -0.021526f, -0.001501f, -0.005085f, 0.030844f, -0.009202f, -0.001031f, 0.012427f, -0.017370f, -0.007816f, 0.031300f, -0.018677f, 0.011779f, 0.000595f, 0.027801f, 0.039702f, -0.002657f, 0.004933f, 0.003675f, 0.013590f, 0.006909f, -0.030690f, 0.002478f, 0.007480f, 0.010432f, -0.013261f, -0.020610f, 0.001911f, 0.005569f, -0.005523f, -0.008041f, -0.032896f, -0.016457f, -0.019011f, 0.000984f, 0.003915f, -0.006498f, -0.009193f, -0.010543f, -0.002714f, -0.005463f, -0.005926f, 0.006465f, -0.003413f, 0.002952f, -0.011961f, 0.000492f, -0.004743f, -0.008498f, 0.001712f, 0.004435f}, + {-0.000064f, -0.000019f, -0.000070f, 0.000004f, -0.000045f, 0.000103f, 0.000068f, -0.000324f, 0.000004f, -0.000211f, -0.000252f, 0.000067f, 0.000210f, 0.000205f, 0.000074f, -0.000463f, -0.000284f, 0.000093f, -0.000145f, 0.000025f, 0.000093f, 0.000121f, 0.000192f, -0.000140f, -0.000156f, -0.000287f, -0.000168f, -0.000000f, -0.000653f, -0.000012f, -0.000065f, -0.000187f, 0.000133f, -0.000371f, -0.000325f, -0.000655f, -0.000092f, -0.000575f, -0.000178f, -0.000012f, 0.000456f, 0.000128f, 0.000346f, -0.000175f, 0.000365f, -0.000094f, 0.000072f, 0.000319f, 0.001951f, -0.001521f, 0.000953f, -0.001201f, 0.000619f, -0.000584f, -0.000576f, -0.000345f, -0.000326f, 0.000356f, 0.000407f, -0.001488f, -0.000078f, 0.000224f, -0.000146f, -0.000246f, -0.000870f, -0.000314f, 0.000626f, 0.000948f, 0.000476f, 0.001492f, 0.000305f, -0.000260f, 0.000308f, 0.000262f, -0.000149f, 0.000491f, 0.001061f, -0.000401f, -0.000008f, 0.000456f, -0.000011f, -0.000097f, -0.000754f, -0.000024f, 0.000387f, 0.000313f, 0.000065f, 0.000027f, -0.000249f, 0.000273f, -0.000025f, 0.000039f, 0.000018f, -0.000253f, 0.007069f, -0.000456f, + 0.000620f, -0.000443f, 0.000460f, -0.000532f, 0.000117f, -0.000127f, -0.000121f, 0.000410f, -0.000369f, -0.001278f, 0.000374f, 0.000137f, 0.000401f, 0.000872f, 0.000468f, 0.000316f, -0.000112f, -0.000739f, -0.000251f, 0.000346f, -0.000097f, -0.000116f, 0.000729f, -0.000915f, -0.000288f, -0.000011f, -0.000153f, -0.000223f, 0.000353f, 0.000387f, 0.000477f, 0.000138f, 0.000173f, -0.000189f, 0.000660f, -0.000025f, 0.000508f, 0.000359f, -0.000113f, -0.000061f, 0.000243f, 0.000010f, -0.000137f, -0.000063f, 0.000012f, 0.005193f, -0.004960f, 0.000779f, -0.001340f, 0.000719f, -0.000090f, 0.000519f, -0.000475f, 0.000934f, -0.000396f, 0.000566f, -0.001184f, 0.000047f, -0.000687f, 0.000197f, -0.000108f, -0.000162f, -0.000318f, -0.000872f, -0.000088f, 0.000103f, -0.000429f, 0.000714f, -0.000322f, -0.000519f, -0.000655f, 0.000392f, -0.000419f, 0.001015f, -0.000106f, 0.000003f, 0.000300f, 0.000004f, 0.000023f, -0.000453f, -0.000380f, -0.000106f, 0.000104f, -0.000174f, -0.000436f, 0.000387f, 0.000279f, 0.000697f, -0.000161f, 0.000229f, -0.000096f, 0.000129f, -0.012182f, 0.001429f, -0.000914f, 0.000026f, + -0.000142f, -0.001022f, 0.001104f, -0.000273f, 0.000098f, 0.000467f, 0.000141f, 0.001280f, -0.000064f, -0.000523f, 0.001535f, 0.000620f, 0.001385f, -0.000029f, -0.001838f, -0.001100f, -0.000887f, 0.000758f, -0.000959f, 0.000080f, -0.000350f, -0.000325f, 0.000110f, 0.000285f, -0.000280f, -0.000577f, -0.000430f, 0.000371f, 0.000418f, 0.000801f, -0.000066f, -0.000112f, -0.000052f, 0.000496f, -0.000558f, 0.000144f, 0.000218f, 0.000367f, -0.000455f, 0.000474f, -0.000552f, -0.000098f, 0.000182f, -0.015385f, 0.005576f, -0.002247f, 0.002579f, -0.001791f, 0.001184f, -0.001941f, 0.001104f, -0.001441f, 0.000558f, 0.001073f, 0.000055f, 0.000412f, 0.000984f, -0.000632f, 0.000708f, -0.000811f, -0.000597f, -0.001790f, 0.001634f, -0.001051f, 0.001096f, 0.000083f, -0.000003f, -0.001717f, -0.000059f, 0.000333f, -0.000241f, -0.000055f, -0.000060f, 0.000719f, -0.000103f, -0.000502f, 0.000546f, 0.000167f, -0.000215f, 0.000038f, 0.000028f, 0.000064f, 0.000317f, -0.000462f, 0.001198f, -0.000094f, -0.000744f, -0.000075f, -0.000403f, -0.000040f, 0.000774f, 0.007013f, -0.001488f, 0.002671f, -0.001202f, 0.000927f, + -0.000972f, 0.003324f, -0.000621f, 0.001780f, -0.000186f, -0.000115f, 0.000464f, 0.000013f, -0.002257f, 0.000531f, -0.000188f, -0.001011f, -0.000231f, 0.000053f, -0.002843f, -0.000065f, 0.000254f, 0.000919f, -0.000004f, -0.000530f, -0.000092f, 0.000994f, 0.000199f, -0.000472f, -0.000943f, 0.001486f, -0.000894f, -0.000022f, -0.001341f, -0.000137f, 0.000024f, 0.000250f, -0.000310f, 0.000374f, 0.000609f, -0.000564f, 0.000488f, -0.000009f, 0.000394f, -0.000008f, 0.000696f, -0.000328f, -0.000183f, 0.000620f, 0.018465f, -0.005382f, 0.000805f, -0.000911f, 0.001216f, 0.000015f, -0.000012f, -0.002481f, 0.001115f, -0.001083f, 0.000763f, 0.000268f, 0.000393f, 0.000803f, 0.001251f, 0.000195f, 0.000438f, -0.002087f, 0.000771f, 0.000775f, -0.001341f, -0.000259f, 0.001419f, 0.000918f, 0.000908f, 0.002010f, 0.001129f, 0.000295f, 0.000538f, -0.000750f, 0.000643f, -0.000178f, 0.001161f, 0.001503f, -0.000206f, 0.000508f, 0.000950f, -0.000396f, 0.000332f, -0.001306f, -0.000346f, 0.001308f, 0.000028f, -0.000917f, -0.000308f, 0.000395f, 0.000975f, -0.000068f, 0.000555f, -0.000007f, 0.001309f, -0.009877f, + 0.004152f, -0.002883f, 0.001876f, -0.001716f, 0.002215f, -0.001449f, 0.000088f, -0.001234f, -0.001519f, -0.002122f, 0.000142f, -0.001262f, 0.000604f, 0.000703f, 0.001592f, -0.002618f, 0.001605f, -0.000630f, 0.002231f, 0.000486f, -0.000139f, 0.000171f, 0.000165f, -0.000534f, -0.000455f, 0.000334f, -0.001073f, 0.000695f, 0.001258f, -0.001725f, -0.000387f, -0.000109f, 0.000683f, -0.000662f, 0.001802f, -0.001894f, 0.000357f, -0.000009f, 0.000105f, -0.000818f, 0.000119f, -0.000516f, 0.000469f, 0.000067f, 0.000082f, -0.000584f, -0.000111f, -0.001204f, -0.000416f, -0.000075f, 0.000253f, 0.000086f, -0.000449f, -0.001522f, -0.015921f, 0.005041f, -0.003263f, -0.000222f, -0.000668f, 0.000991f, -0.002752f, 0.000189f, 0.000868f, 0.000717f, -0.000965f, 0.000539f, -0.001231f, -0.002019f, -0.000791f, 0.000247f, -0.001210f, 0.004215f, 0.000110f, -0.001178f, -0.000390f, -0.001418f, -0.000667f, 0.001283f, 0.000766f, 0.001666f, -0.000158f, 0.000739f, -0.000950f, 0.000381f, -0.000860f, -0.000298f, -0.000506f, 0.000274f, 0.000516f, -0.000275f, -0.000816f, 0.000193f, 0.000299f, 0.001151f, -0.000208f, -0.000433f, + -0.001514f, -0.001240f, -0.000593f, -0.000246f, 0.000278f, 0.000197f, -0.000623f, -0.000263f, 0.000107f, 0.000546f, 0.000282f, 0.000089f, -0.000276f, 0.000555f, -0.015328f, 0.007183f, -0.003396f, 0.003202f, -0.001680f, 0.001894f, 0.000935f, 0.000574f, -0.001750f, 0.000206f, -0.000895f, 0.000254f, -0.002289f, 0.000851f, 0.001422f, 0.000456f, -0.002436f, -0.001211f, -0.001229f, -0.001279f, -0.000841f, 0.001734f, 0.000411f, 0.001219f, 0.000976f, -0.000437f, -0.000106f, -0.001842f, 0.002361f, -0.000681f, -0.000246f, 0.000145f, -0.000514f, -0.000734f, -0.000865f, -0.000202f, -0.001936f, 0.000566f, -0.001030f, 0.000765f, 0.000667f, 0.001101f, -0.000306f, 0.000116f, -0.001259f, 0.000468f, 0.000918f, 0.000215f, -0.000211f, 0.000181f, 0.000717f, 0.001074f, 0.000464f, 0.000998f, 0.000041f, 0.000150f, 0.004975f, 0.006155f, -0.002780f, 0.001649f, -0.000855f, 0.000619f, -0.000661f, 0.000355f, 0.000543f, 0.003014f, -0.001066f, 0.001243f, 0.002833f, -0.000771f, -0.000114f, -0.000477f, 0.000689f, 0.001463f, 0.001501f, 0.001950f, 0.000528f, 0.001660f, -0.000422f, -0.000980f, -0.003318f, 0.000700f, + -0.000502f, -0.001666f, -0.001187f, -0.000056f, -0.000313f, 0.001072f, -0.000152f, -0.001926f, -0.001987f, 0.000536f, -0.001726f, 0.000233f, 0.001053f, -0.001552f, -0.001038f, -0.000659f, 0.000774f, 0.000701f, -0.000049f, -0.000204f, 0.001164f, 0.000249f, -0.000447f, 0.000468f, -0.001001f, 0.000128f, -0.000527f, -0.000754f, -0.000508f, 0.000792f, -0.000402f, 0.000598f, -0.000445f, -0.000968f, 0.000266f, 0.000538f, -0.000339f, 0.017709f, -0.006163f, 0.003344f, -0.002310f, 0.003324f, -0.002342f, 0.002039f, -0.000757f, 0.002071f, 0.000504f, 0.001458f, -0.001693f, 0.001739f, -0.000593f, -0.001443f, -0.000148f, -0.001550f, -0.002474f, -0.001306f, -0.000268f, 0.001257f, -0.001694f, -0.002267f, -0.002777f, -0.000498f, -0.000242f, 0.002224f, 0.001219f, 0.001429f, -0.000975f, 0.001156f, -0.000881f, -0.000866f, -0.000476f, 0.001467f, 0.001267f, 0.000396f, -0.000008f, -0.000052f, 0.000042f, -0.000410f, -0.000230f, 0.001016f, 0.000199f, 0.002498f, -0.000956f, -0.000300f, -0.002080f, 0.001364f, -0.000542f, -0.000323f, -0.000489f, -0.000129f, 0.000123f, -0.000346f, 0.000381f, -0.000557f, 0.000009f, -0.000790f, + -0.000347f, 0.000177f, 0.000816f, -0.000423f, 0.004975f, -0.007600f, 0.004456f, -0.002843f, 0.003461f, -0.000039f, 0.002149f, 0.000607f, -0.003332f, -0.001580f, -0.001123f, 0.000408f, 0.000835f, 0.000467f, 0.003762f, -0.002115f, 0.003006f, 0.000524f, 0.000382f, -0.002056f, -0.000446f, 0.002599f, -0.000171f, -0.002206f, 0.002512f, 0.001919f, 0.000425f, -0.001034f, -0.000817f, -0.000219f, -0.000175f, 0.001165f, -0.000571f, 0.000520f, -0.001407f, -0.000311f, 0.000811f, -0.002028f, 0.000776f, -0.000786f, 0.000726f, -0.000587f, -0.000180f, 0.002394f, 0.001033f, 0.001365f, -0.000106f, 0.000565f, 0.000877f, -0.000179f, -0.000660f, -0.001055f, 0.000361f, 0.000484f, 0.000850f, 0.001030f, 0.000241f, -0.000230f, -0.001059f, -0.000479f, -0.001071f, -0.000954f, 0.000123f, -0.018898f, -0.003853f, -0.000551f, -0.003191f, -0.001350f, 0.002777f, 0.001160f, -0.000866f, -0.000776f, -0.002307f, -0.001548f, -0.001880f, -0.002104f, -0.001752f, -0.001133f, -0.001589f, -0.002675f, -0.002293f, 0.000823f, -0.002327f, 0.000718f, -0.003116f, 0.000058f, -0.001313f, -0.001059f, 0.002638f, -0.000317f, -0.001342f, 0.001688f, + -0.001981f, 0.001787f, 0.000510f, 0.001888f, 0.001277f, -0.000079f, -0.000962f, 0.001989f, -0.000065f, -0.000351f, 0.001812f, -0.000808f, -0.002550f, -0.002882f, -0.000766f, 0.000906f, 0.000568f, -0.000884f, -0.000119f, -0.000821f, 0.000146f, 0.000003f, 0.000112f, 0.001745f, 0.000665f, -0.001323f, -0.000519f, 0.000196f, 0.001095f, 0.000225f, 0.001652f, 0.000427f, -0.000175f, -0.000899f, -0.022179f, 0.019303f, -0.007865f, 0.005356f, -0.005040f, 0.001232f, -0.002476f, 0.003264f, 0.000618f, 0.000378f, -0.001580f, 0.002210f, 0.000450f, -0.003989f, 0.000405f, 0.000584f, -0.002004f, -0.003076f, 0.003037f, 0.003761f, -0.001215f, -0.001000f, 0.000630f, 0.001729f, -0.001017f, 0.003424f, -0.000107f, 0.000861f, -0.002490f, -0.000893f, -0.001483f, 0.002228f, -0.000496f, 0.000478f, 0.000485f, -0.001293f, 0.002169f, 0.002069f, 0.000570f, 0.000704f, 0.002543f, -0.001561f, -0.000409f, -0.000336f, -0.001844f, 0.000385f, -0.001202f, 0.000438f, -0.000055f, 0.000152f, 0.002079f, -0.000093f, -0.000469f, 0.000446f, 0.000112f, 0.001343f, -0.001258f, 0.000462f, -0.000079f, 0.002645f, -0.000790f, -0.000122f, + -0.001043f, 0.014829f, -0.001760f, -0.003067f, -0.000710f, 0.002015f, 0.001052f, 0.000924f, -0.000084f, -0.002033f, 0.000534f, 0.001276f, 0.001441f, -0.000915f, -0.000861f, 0.003012f, 0.001046f, -0.002309f, 0.000526f, 0.003890f, -0.004803f, 0.003252f, 0.000416f, 0.004152f, -0.000248f, 0.000263f, 0.000836f, 0.000861f, 0.002196f, -0.001573f, -0.000579f, 0.000842f, 0.001586f, -0.000586f, -0.000014f, 0.000231f, 0.000393f, 0.001011f, -0.001952f, -0.000014f, 0.001185f, 0.000360f, -0.001061f, -0.000306f, 0.002585f, 0.001914f, 0.000927f, -0.000944f, -0.000683f, 0.000768f, -0.000295f, -0.000594f, 0.000484f, -0.000752f, -0.001194f, 0.002661f, 0.001066f, 0.001723f, 0.000302f, 0.001309f, 0.001071f, 0.001169f, 0.000163f, 0.001408f, 0.000723f, 0.001012f, -0.000757f, 0.000221f, 0.000405f, -0.001130f, 0.000459f, -0.000526f, -0.000075f, 0.007039f, 0.002049f, 0.001702f, -0.001023f, -0.000684f, -0.001902f, -0.001360f, 0.000357f, -0.000744f, -0.000931f, -0.002733f, 0.002341f, 0.001618f, -0.001695f, 0.002918f, -0.002734f, -0.000828f, 0.001235f, -0.002032f, 0.001193f, 0.001895f, 0.002903f, 0.002553f, + 0.002445f, 0.001264f, -0.005129f, 0.000001f, -0.001065f, 0.001030f, -0.000481f, 0.002011f, 0.001378f, -0.000664f, -0.001235f, 0.001319f, -0.000903f, 0.003392f, 0.000016f, 0.001120f, 0.003457f, 0.003291f, -0.002469f, 0.000205f, -0.001621f, -0.002964f, -0.000301f, 0.000551f, -0.000358f, -0.000613f, -0.000296f, 0.000249f, -0.001366f, 0.000177f, -0.001596f, -0.000460f, -0.000169f, 0.000422f, 0.000034f, -0.000953f, -0.000984f, 0.002054f, -0.000704f, 0.000306f, 0.000946f, 0.001130f, -0.000605f, -0.000654f, -0.000276f, -0.001642f, -0.001083f, 0.000164f, 0.000382f, 0.016619f, -0.011686f, 0.004260f, -0.004436f, -0.000338f, -0.003099f, 0.002812f, 0.002794f, 0.000903f, 0.000572f, 0.002642f, 0.007256f, -0.006369f, -0.000881f, -0.001653f, -0.002568f, 0.005629f, 0.004242f, -0.000863f, -0.003850f, 0.001566f, -0.003144f, -0.002514f, -0.004407f, 0.000568f, -0.004513f, -0.001489f, 0.002667f, 0.000388f, -0.001380f, -0.003725f, 0.000012f, -0.000897f, 0.002271f, 0.002087f, 0.000967f, -0.001691f, 0.000260f, -0.000104f, 0.000922f, 0.001801f, -0.001137f, -0.000574f, -0.002016f, 0.003067f, -0.000375f, 0.000455f, + 0.002739f, -0.000562f, -0.000244f, 0.001094f, -0.001369f, -0.000141f, 0.001191f, -0.002030f, 0.000467f, -0.000376f, -0.000173f, -0.002117f, 0.001034f, -0.000453f, 0.000187f, 0.000521f, -0.000778f, 0.001389f, -0.001088f, -0.000283f, -0.002262f, 0.000204f, -0.000310f, 0.000943f, 0.001000f, -0.025902f, 0.003552f, 0.000334f, 0.001790f, -0.002016f, -0.003257f, -0.000042f, 0.002139f, 0.003414f, -0.000237f, 0.005206f, 0.002889f, -0.003566f, -0.003184f, 0.002420f, 0.000415f, -0.002547f, -0.004710f, -0.005399f, -0.003470f, -0.003990f, -0.004463f, 0.000780f, 0.001392f, 0.001161f, -0.003308f, -0.003180f, 0.000461f, -0.000852f, -0.000560f, -0.000442f, -0.002643f, 0.002201f, -0.004536f, -0.001708f, -0.000708f, -0.000183f, 0.001425f, 0.000491f, -0.000330f, 0.002069f, -0.000653f, 0.002063f, 0.001177f, -0.001617f, 0.000239f, 0.003363f, -0.001367f, -0.001366f, 0.000070f, 0.001963f, 0.000495f, -0.001418f, -0.001821f, 0.001640f, 0.000071f, -0.002383f, 0.003238f, 0.003657f, 0.000427f, -0.001059f, 0.000421f, -0.000079f, 0.000762f, 0.001610f, -0.000175f, 0.002141f, 0.001352f, 0.001221f, 0.001063f, 0.000549f, + 0.000883f, -0.001086f, -0.000096f, -0.015846f, 0.013547f, -0.004530f, 0.002895f, -0.000074f, 0.002257f, -0.005485f, 0.002123f, -0.003739f, 0.000019f, -0.002530f, 0.005086f, 0.004327f, 0.001636f, 0.000352f, -0.004178f, -0.002772f, -0.000430f, -0.001680f, 0.004827f, -0.003944f, -0.000156f, -0.001953f, 0.007069f, -0.002246f, 0.000633f, -0.000197f, 0.001219f, 0.000558f, 0.001214f, 0.000894f, -0.001169f, 0.000640f, -0.000284f, 0.002472f, 0.000381f, 0.004683f, 0.002428f, -0.001505f, -0.000317f, -0.000578f, 0.000086f, -0.001781f, -0.001260f, -0.000442f, 0.000835f, 0.005710f, 0.000518f, 0.000388f, -0.001568f, 0.002334f, -0.000865f, -0.001212f, 0.000751f, -0.001177f, 0.000702f, -0.001463f, -0.003196f, 0.001592f, 0.001411f, -0.000436f, 0.003333f, 0.000719f, 0.000789f, 0.001208f, -0.000899f, 0.000405f, 0.001077f, -0.002752f, -0.001302f, -0.000202f, -0.001264f, 0.001282f, 0.001965f, -0.000738f, 0.003372f, 0.002235f, -0.000089f, -0.000914f, -0.000694f, -0.000248f, 0.010332f, -0.000241f, 0.002323f, -0.007036f, -0.001176f, 0.000879f, -0.005678f, 0.000444f, 0.007848f, -0.001378f, 0.000557f, -0.003553f, + -0.004864f, 0.001226f, -0.004445f, 0.006913f, -0.004815f, 0.001651f, 0.001629f, 0.003697f, 0.002874f, -0.000766f, -0.004297f, -0.000508f, -0.000404f, 0.002185f, -0.003015f, -0.000593f, -0.000891f, -0.001442f, -0.001028f, 0.002088f, 0.001282f, 0.005603f, 0.001897f, -0.002102f, 0.002320f, -0.001540f, -0.001619f, 0.001715f, 0.004798f, -0.000703f, -0.002491f, -0.002335f, 0.002546f, -0.000075f, -0.003491f, -0.003220f, 0.001633f, 0.001516f, -0.001455f, -0.002664f, -0.004410f, 0.001203f, 0.001628f, 0.001088f, -0.002495f, 0.001852f, 0.001137f, 0.000763f, -0.000893f, -0.000286f, 0.001351f, -0.003320f, -0.000442f, 0.001439f, 0.001704f, -0.000331f, 0.000824f, 0.000053f, 0.035220f, -0.002214f, 0.001445f, 0.003250f, -0.003055f, -0.001287f, -0.001028f, -0.008264f, 0.005597f, -0.000874f, -0.005116f, 0.001138f, -0.002611f, 0.003050f, 0.002419f, 0.003869f, -0.001342f, 0.005242f, 0.004494f, 0.002884f, -0.004575f, 0.003558f, -0.006285f, -0.003697f, -0.004269f, 0.001725f, -0.003274f, -0.000571f, -0.001100f, -0.004179f, -0.002259f, 0.003576f, -0.002616f, -0.001971f, -0.003990f, 0.001330f, 0.001321f, 0.003033f, + -0.001673f, 0.005201f, 0.001318f, 0.005926f, -0.000652f, 0.001099f, 0.001214f, -0.003231f, 0.002349f, 0.006066f, -0.002055f, -0.000140f, 0.001667f, -0.001728f, -0.002411f, 0.001461f, -0.002403f, -0.001281f, -0.003148f, -0.002052f, 0.002377f, 0.002129f, 0.001438f, 0.002284f, 0.002859f, 0.002729f, 0.004088f, 0.000694f, -0.001179f, 0.002137f, 0.001456f, 0.000012f, -0.000378f, 0.000206f, -0.001494f, -0.000288f, 0.000347f, 0.000409f, -0.000060f, -0.015588f, -0.030559f, 0.011318f, 0.000097f, 0.000612f, -0.003065f, -0.003278f, -0.000747f, 0.001035f, -0.001991f, 0.007963f, -0.003707f, -0.006989f, 0.000396f, 0.000422f, -0.000939f, -0.002477f, 0.005417f, 0.000967f, -0.002466f, 0.002511f, -0.004852f, 0.006098f, -0.003450f, -0.001807f, -0.004197f, 0.006810f, -0.002980f, -0.001013f, -0.004161f, -0.001938f, 0.003680f, -0.001757f, 0.003987f, -0.005217f, -0.006097f, 0.000472f, 0.001024f, 0.001025f, -0.000193f, -0.003169f, 0.000549f, 0.001593f, 0.000773f, 0.003140f, -0.000052f, 0.004939f, 0.000655f, 0.004627f, 0.006060f, 0.001241f, -0.000496f, 0.001121f, -0.003452f, -0.000904f, -0.005742f, -0.005112f, + 0.001455f, 0.001481f, 0.000961f, -0.000384f, -0.001665f, -0.000883f, -0.001430f, -0.000809f, -0.001428f, -0.000004f, -0.000166f, 0.001034f, -0.000388f, -0.000699f, -0.001989f, -0.000184f, -0.002303f, -0.000307f, -0.003045f, -0.000430f, -0.001158f, -0.000367f, -0.010243f, 0.029825f, -0.013612f, 0.006210f, -0.002902f, 0.009460f, -0.001512f, -0.004206f, -0.004387f, 0.002470f, -0.001320f, -0.000583f, 0.000199f, 0.001835f, -0.010048f, -0.004917f, -0.002604f, 0.003969f, 0.003336f, 0.005831f, 0.001055f, -0.000910f, -0.000940f, 0.007001f, -0.009135f, 0.005265f, -0.004402f, -0.000934f, -0.004636f, 0.007232f, 0.002900f, -0.004735f, 0.000616f, -0.002087f, 0.000772f, 0.003056f, -0.013103f, -0.005489f, 0.001070f, 0.004582f, -0.002701f, 0.000950f, 0.003353f, -0.001383f, -0.001484f, -0.000497f, 0.005064f, 0.001982f, 0.000865f, 0.000549f, 0.001951f, 0.005934f, -0.003615f, 0.002704f, -0.008360f, -0.001462f, 0.001883f, 0.004014f, 0.000756f, 0.000566f, 0.000195f, 0.002166f, -0.001635f, 0.000234f, -0.000587f, -0.001986f, -0.001715f, 0.003108f, 0.003043f, -0.001165f, -0.001578f, -0.005217f, -0.002198f, -0.001181f, + -0.000929f, 0.003776f, -0.001444f, -0.001435f, -0.002542f, -0.002314f, -0.000182f, -0.026788f, -0.005789f, 0.002609f, -0.006362f, 0.001588f, 0.001155f, 0.003913f, -0.000031f, 0.007469f, 0.004872f, 0.002694f, -0.002062f, -0.003681f, -0.000202f, 0.007903f, -0.006779f, -0.002595f, -0.005256f, -0.000125f, -0.014346f, -0.011311f, 0.000700f, 0.007006f, 0.009643f, 0.002221f, -0.003525f, 0.003285f, -0.003131f, -0.002091f, -0.002136f, 0.000948f, 0.002517f, 0.000610f, 0.003746f, -0.002858f, -0.005110f, 0.004214f, 0.002765f, 0.008858f, -0.001098f, 0.001438f, -0.001282f, 0.007144f, -0.007450f, -0.003741f, -0.001771f, -0.005651f, 0.003584f, -0.002334f, 0.003008f, -0.006053f, 0.006022f, 0.005848f, 0.005377f, -0.002199f, 0.004766f, 0.000254f, 0.001658f, 0.002797f, 0.001987f, -0.002531f, 0.000436f, -0.000789f, -0.000144f, 0.005497f, 0.002049f, -0.002418f, 0.004448f, -0.000723f, -0.003856f, -0.001276f, -0.000281f, -0.005421f, -0.000220f, 0.002263f, 0.002950f, 0.000471f, -0.000114f, -0.002239f, 0.000822f, 0.001315f, 0.019448f, 0.012657f, -0.003944f, 0.005757f, -0.012875f, 0.009100f, 0.003356f, 0.006856f, + -0.002310f, -0.001691f, -0.007035f, -0.003599f, -0.012046f, -0.002064f, -0.009585f, -0.002894f, -0.005895f, -0.006039f, -0.008140f, 0.003267f, -0.011132f, 0.001525f, 0.004850f, -0.002122f, 0.001546f, -0.004782f, -0.000039f, -0.001477f, -0.001568f, -0.006526f, -0.000860f, 0.000776f, -0.000425f, -0.000989f, -0.003407f, -0.002960f, 0.002040f, 0.002169f, 0.002851f, 0.014199f, -0.005698f, -0.000310f, 0.005762f, -0.001358f, -0.002342f, -0.005423f, 0.001698f, 0.004833f, 0.007980f, 0.002703f, 0.006656f, -0.006471f, -0.009735f, 0.000948f, 0.006410f, 0.003595f, -0.005248f, 0.006134f, -0.004596f, 0.002964f, 0.001236f, 0.005577f, 0.003157f, 0.002058f, 0.003780f, -0.003740f, 0.002416f, 0.002017f, 0.001155f, 0.005478f, 0.001272f, 0.004430f, -0.000643f, -0.001750f, 0.000717f, 0.001065f, 0.000934f, 0.005318f, -0.000832f, -0.002969f, -0.000268f, 0.039181f, -0.025388f, -0.001395f, 0.002923f, 0.000772f, 0.003071f, 0.005353f, -0.001101f, -0.000880f, 0.002994f, -0.004545f, -0.004345f, -0.000727f, 0.003456f, 0.014091f, 0.000574f, 0.004858f, -0.004563f, 0.000269f, -0.013968f, 0.008603f, -0.008456f, -0.012033f, + 0.002777f, 0.003359f, -0.004478f, 0.003998f, 0.001665f, 0.009301f, 0.010293f, -0.001728f, -0.003912f, -0.002952f, -0.015430f, -0.008414f, 0.012061f, 0.003971f, 0.004426f, -0.006966f, -0.007153f, 0.002100f, -0.001403f, -0.006153f, 0.005335f, -0.001181f, -0.003860f, -0.004450f, 0.003014f, -0.003988f, -0.002144f, 0.014149f, -0.008652f, 0.002607f, -0.003117f, 0.003268f, -0.003905f, -0.001611f, -0.010586f, 0.001764f, -0.003932f, -0.002650f, 0.008424f, 0.002020f, 0.002336f, 0.005091f, 0.006105f, 0.001805f, 0.004220f, -0.001908f, -0.000521f, -0.006962f, 0.003155f, 0.005708f, -0.001328f, 0.000354f, -0.000655f, -0.001466f, -0.001805f, 0.000619f, -0.001855f, -0.000859f, -0.024487f, -0.012104f, 0.004432f, -0.001603f, 0.008759f, -0.001344f, -0.002415f, -0.007139f, -0.007984f, 0.004084f, -0.008342f, -0.002950f, -0.004770f, -0.001018f, -0.005028f, -0.003481f, -0.004055f, -0.002134f, -0.005007f, -0.009432f, 0.005273f, -0.018615f, -0.000283f, 0.016482f, 0.003958f, -0.000186f, -0.004619f, 0.001076f, -0.016844f, 0.006818f, 0.004126f, 0.001056f, 0.005970f, 0.008900f, -0.007185f, -0.003841f, -0.007473f, 0.000983f, + 0.000179f, -0.004485f, -0.005087f, -0.005653f, -0.003374f, -0.000361f, 0.003599f, 0.000196f, 0.002938f, 0.001602f, 0.000295f, 0.011394f, 0.002689f, -0.001962f, 0.009044f, -0.004567f, -0.010436f, -0.003297f, -0.001288f, -0.001602f, -0.000740f, -0.003699f, -0.000872f, -0.004585f, -0.001140f, -0.004661f, 0.000398f, 0.002335f, -0.005033f, -0.001529f, -0.002800f, 0.000092f, -0.005101f, -0.006518f, -0.002827f, 0.002476f, 0.004477f, 0.001711f, -0.001551f, -0.000291f, 0.001687f, -0.000945f, -0.001104f, -0.002362f, 0.000980f, 0.002271f, 0.000447f, -0.000226f, -0.002867f, -0.015074f, 0.020182f, -0.010042f, -0.005012f, -0.016592f, 0.012843f, -0.004610f, 0.007540f, 0.000417f, 0.000398f, -0.005073f, 0.010049f, -0.002582f, 0.003226f, 0.002455f, -0.004704f, -0.001630f, -0.001571f, -0.008815f, 0.001675f, 0.001538f, -0.006849f, -0.011422f, -0.007136f, -0.010512f, -0.002618f, 0.005625f, 0.002898f, -0.006206f, -0.006201f, 0.009102f, 0.006223f, -0.007955f, 0.007200f, -0.003986f, 0.006361f, -0.010069f, -0.008000f, -0.007685f, 0.002642f, -0.006810f, 0.004210f, -0.003096f, 0.001737f, -0.001903f, -0.001043f, 0.001539f, + 0.007229f, -0.016011f, -0.002096f, 0.003152f, -0.001533f, -0.004892f, -0.011600f, -0.001061f, 0.010505f, -0.000062f, 0.009093f, 0.006724f, 0.001884f, -0.001339f, 0.006924f, -0.006973f, -0.005769f, 0.004437f, -0.001751f, -0.004340f, 0.002882f, 0.000837f, -0.003456f, -0.004981f, 0.008310f, -0.007840f, -0.004337f, -0.004694f, 0.004681f, 0.000221f, -0.003447f, -0.001919f, 0.002398f, -0.007236f, -0.000066f, 0.001919f, 0.001386f, 0.000156f, -0.002548f, -0.003524f, -0.034641f, 0.012869f, 0.005438f, -0.008735f, 0.004268f, -0.009878f, 0.008841f, 0.007617f, 0.006485f, -0.017768f, 0.010705f, 0.018752f, -0.002626f, 0.006350f, 0.000267f, -0.005888f, -0.007685f, 0.020658f, -0.000309f, -0.001867f, -0.011419f, -0.022547f, -0.012223f, 0.001098f, -0.009994f, 0.008257f, -0.014784f, -0.004949f, -0.008744f, 0.002339f, -0.003442f, -0.011055f, 0.001806f, -0.002593f, 0.007188f, -0.002490f, -0.008689f, -0.003377f, -0.026523f, 0.004686f, -0.000866f, 0.012181f, -0.007541f, -0.008369f, 0.011372f, 0.002335f, 0.001828f, -0.004642f, -0.007143f, 0.002457f, 0.005148f, 0.003698f, -0.001915f, 0.003932f, 0.002123f, 0.000390f, + -0.002376f, -0.002578f, -0.008795f, 0.000606f, -0.003532f, -0.005175f, 0.004527f, 0.002496f, 0.012828f, 0.002612f, -0.008749f, -0.008816f, 0.001856f, -0.005745f, -0.004220f, 0.001355f, -0.004340f, -0.000290f, -0.002035f, -0.002634f, 0.002393f, -0.003529f, 0.001196f, -0.000528f, -0.000756f, -0.001379f, -0.001964f, -0.004313f, -0.005174f, -0.001692f, -0.004468f, 0.028889f, -0.011377f, 0.000199f, 0.001621f, 0.012087f, -0.001530f, -0.002327f, 0.008296f, 0.014242f, -0.009576f, -0.011055f, 0.008657f, -0.001626f, 0.007533f, 0.010913f, 0.009087f, 0.007846f, 0.006287f, 0.007415f, 0.028053f, -0.002346f, 0.002083f, 0.005485f, 0.015484f, -0.003171f, -0.005651f, 0.005990f, -0.000401f, -0.005013f, -0.006208f, -0.005406f, 0.000163f, -0.007037f, 0.010708f, 0.016153f, -0.000822f, -0.003963f, 0.006760f, -0.003880f, 0.009669f, 0.006961f, 0.000265f, -0.008279f, 0.006365f, -0.000590f, -0.002696f, 0.001362f, -0.001114f, 0.018801f, -0.001553f, 0.008215f, -0.004096f, 0.016760f, -0.001524f, 0.001562f, -0.005769f, -0.010079f, 0.008563f, -0.004976f, 0.016888f, 0.003774f, 0.008024f, 0.000140f, 0.000125f, 0.004963f, + 0.001356f, 0.012126f, 0.006787f, 0.002276f, 0.006121f, -0.006981f, 0.002736f, 0.005632f, 0.000679f, -0.001917f, 0.009965f, 0.002544f, -0.003171f, -0.003156f, 0.004046f, -0.001737f, 0.000103f, 0.005679f, -0.001637f, 0.003498f, 0.001460f, -0.002992f, 0.037373f, -0.010780f, 0.003504f, -0.003578f, 0.001659f, 0.004817f, 0.012559f, -0.009744f, 0.005259f, -0.000204f, 0.000673f, 0.006818f, -0.005579f, 0.007290f, -0.019694f, -0.008926f, 0.003294f, 0.007333f, 0.005188f, 0.015662f, -0.015590f, 0.002434f, -0.002339f, -0.021358f, 0.009086f, -0.008308f, -0.005431f, -0.003115f, -0.017543f, 0.005691f, 0.006151f, 0.002728f, -0.009159f, -0.015330f, 0.005995f, -0.009499f, 0.008288f, -0.014688f, 0.000188f, -0.017573f, -0.004332f, -0.011739f, -0.010200f, 0.010384f, 0.016158f, 0.002245f, 0.005933f, -0.007469f, 0.002996f, -0.012526f, 0.005292f, -0.008229f, 0.002258f, 0.011983f, 0.006084f, -0.004229f, 0.007250f, 0.001197f, 0.006275f, -0.005410f, 0.010527f, 0.018024f, 0.000952f, -0.010913f, -0.007559f, -0.004884f, -0.002016f, 0.001146f, 0.008082f, 0.001591f, 0.013137f, -0.000062f, 0.005017f, -0.011965f, + -0.001782f, -0.008644f, -0.001656f, -0.001303f, 0.002685f, -0.010851f, 0.001463f, -0.000846f, 0.003239f, 0.001158f, 0.002017f, 0.001079f, 0.000841f, -0.038108f, -0.031968f, 0.013507f, -0.004010f, 0.015707f, -0.001222f, 0.005140f, -0.019100f, -0.017919f, -0.010897f, 0.005989f, -0.014786f, -0.010201f, -0.004371f, 0.002971f, 0.010816f, 0.003862f, -0.021678f, 0.005846f, 0.012128f, -0.030751f, -0.003665f, 0.001486f, -0.032645f, -0.011200f, 0.014542f, -0.030241f, 0.014820f, 0.015596f, 0.000200f, -0.004362f, -0.001233f, -0.007276f, -0.008027f, 0.005429f, 0.006681f, 0.022687f, -0.013404f, -0.007036f, -0.005634f, -0.010527f, 0.000622f, -0.017973f, -0.004481f, 0.001373f, -0.000507f, -0.005846f, -0.000913f, -0.009898f, -0.002008f, 0.005530f, -0.002472f, -0.006451f, 0.007504f, -0.003512f, -0.007345f, -0.010492f, 0.022339f, -0.000931f, 0.013611f, 0.001798f, 0.005108f, 0.014727f, 0.002130f, 0.010033f, -0.006677f, 0.011149f, 0.008093f, 0.002425f, 0.002927f, 0.002734f, 0.009718f, 0.004430f, 0.001808f, 0.009385f, -0.003985f, 0.001368f, -0.001087f, -0.014659f, 0.006861f, 0.003482f, 0.002007f, -0.008976f, + -0.002554f, 0.001665f, 0.002851f, -0.002583f, -0.061833f, 0.023317f, -0.006832f, -0.027738f, -0.006770f, 0.000698f, -0.007174f, 0.010709f, -0.024015f, 0.011563f, -0.001938f, -0.027615f, -0.019037f, 0.003778f, 0.010963f, 0.010355f, 0.007600f, 0.016257f, 0.004643f, 0.026740f, 0.014640f, 0.031342f, 0.004072f, 0.025459f, -0.019617f, -0.015456f, 0.005267f, 0.002209f, -0.015561f, 0.004347f, 0.003294f, -0.002174f, -0.005935f, 0.015085f, 0.002885f, -0.033307f, -0.014851f, 0.011154f, 0.003841f, -0.007073f, 0.009520f, 0.009707f, 0.015126f, 0.003245f, 0.004486f, 0.002818f, 0.004390f, 0.005514f, -0.011574f, 0.001750f, 0.002124f, -0.024637f, 0.011603f, 0.008534f, 0.010446f, -0.016891f, -0.009802f, 0.012301f, 0.000012f, -0.003286f, -0.002550f, -0.007233f, -0.006385f, 0.000028f, -0.008496f, -0.018945f, 0.006438f, 0.020176f, -0.014200f, 0.001955f, -0.008073f, -0.003291f, -0.005885f, -0.001848f, 0.010405f, 0.002481f, 0.008597f, 0.002489f, -0.009155f, -0.006523f, -0.007436f, -0.004469f, -0.006082f, 0.001438f, -0.003857f, -0.000849f, -0.005821f, 0.001837f, 0.003012f, 0.003292f, -0.001768f, -0.005835f, + 0.000097f, 0.025950f, 0.017542f, 0.012129f, 0.006593f, 0.000803f, -0.006048f, -0.009215f, 0.008134f, -0.025892f, 0.027317f, -0.016931f, 0.004391f, -0.028107f, -0.001040f, 0.026431f, 0.010370f, -0.009367f, 0.016757f, -0.026702f, 0.010653f, 0.004972f, 0.001853f, -0.032880f, -0.009876f, 0.002009f, 0.005274f, 0.021113f, -0.032362f, -0.004376f, -0.010763f, -0.030458f, -0.006700f, 0.007295f, 0.015194f, 0.022821f, 0.017716f, 0.017649f, -0.001531f, -0.011358f, 0.011604f, 0.003506f, -0.007001f, 0.004159f, -0.014903f, 0.023643f, 0.011042f, 0.007994f, -0.012366f, -0.027066f, -0.007266f, 0.000609f, -0.032829f, -0.026530f, -0.007012f, -0.023798f, 0.015244f, 0.005904f, 0.004712f, -0.010967f, -0.011815f, 0.004564f, 0.003273f, 0.001982f, 0.007299f, -0.004591f, 0.005502f, 0.015630f, 0.007059f, 0.002637f, 0.002069f, -0.010326f, -0.008700f, -0.007777f, 0.004495f, -0.002781f, -0.021058f, -0.016820f, -0.001746f, -0.013550f, -0.012051f, -0.003470f, -0.017400f, -0.010917f, -0.002798f, 0.000909f, -0.002558f, -0.001161f, 0.004064f, -0.003345f, -0.001339f, 0.000905f, 0.000536f, -0.005077f, 0.029861f, -0.023299f, + 0.006269f, -0.003295f, -0.003024f, 0.000547f, 0.008262f, -0.014513f, 0.019426f, -0.005605f, 0.013323f, -0.001297f, -0.010810f, 0.020665f, 0.020389f, 0.014590f, -0.006824f, 0.031315f, 0.011598f, -0.035010f, 0.036112f, 0.003298f, -0.000095f, 0.026100f, 0.001161f, -0.011318f, -0.015135f, 0.025762f, -0.016128f, -0.021518f, 0.020853f, 0.018184f, -0.011832f, -0.028618f, 0.011237f, -0.009819f, 0.003989f, -0.020129f, -0.016491f, -0.006834f, 0.019529f, 0.017530f, 0.002331f, 0.016088f, -0.023341f, 0.007540f, -0.006123f, -0.008695f, 0.011215f, 0.001581f, 0.003458f, -0.032689f, -0.008922f, 0.018204f, -0.023342f, -0.006071f, -0.029288f, -0.005451f, -0.010915f, 0.004955f, -0.007045f, 0.003326f, 0.003064f, -0.000992f, 0.002989f, -0.007828f, -0.026003f, -0.004899f, 0.013336f, -0.001756f, 0.009267f, -0.010016f, -0.022807f, -0.004041f, 0.005106f, 0.014557f, 0.003608f, 0.007973f, -0.000783f, 0.003284f, 0.005561f, 0.003362f, -0.007880f, 0.002031f, -0.003185f, 0.003447f, -0.006259f, 0.003779f, 0.001613f, 0.000455f, -0.000637f, -0.005462f, -0.002667f, 0.027055f, 0.002077f, -0.007877f, -0.019391f, -0.000662f, + -0.009271f, 0.007203f, -0.016018f, 0.010176f, 0.006479f, -0.014006f, -0.014366f, 0.021659f, -0.025550f, -0.001008f, 0.016486f, -0.018501f, 0.005953f, 0.021168f, -0.016854f, 0.014516f, 0.010660f, 0.015537f, -0.025588f, 0.022087f, -0.025694f, 0.007734f, -0.019561f, 0.002434f, -0.010009f, 0.017389f, 0.000525f, 0.010640f, 0.005484f, -0.018258f, -0.011137f, -0.025237f, 0.014709f, -0.017098f, 0.014791f, -0.020559f, -0.023407f, -0.039197f, 0.003817f, 0.020564f, -0.003147f, -0.000613f, 0.006497f, 0.017723f, -0.006016f, 0.004751f, -0.021652f, 0.005494f, 0.028743f, -0.002915f, 0.026060f, 0.034091f, -0.000224f, 0.005699f, 0.007010f, -0.014581f, 0.007564f, -0.017663f, -0.000886f, -0.018130f, -0.017564f, 0.001015f, -0.006653f, -0.029780f, 0.020174f, 0.000460f, 0.015009f, -0.017584f, -0.008964f, -0.006739f, 0.007699f, -0.000191f, -0.004640f, -0.004651f, -0.002994f, -0.001165f, 0.001720f, 0.001899f, -0.003527f, 0.004019f, -0.004046f, -0.004052f, -0.002236f, 0.005683f, 0.004263f, 0.004720f, -0.002308f, 0.003551f, -0.061278f, 0.015582f, 0.022986f, 0.006399f, -0.026534f, -0.003860f, 0.043266f, -0.049653f, + -0.001221f, -0.008350f, -0.032454f, -0.008162f, -0.021977f, 0.008102f, 0.008069f, 0.019033f, 0.007745f, -0.025942f, -0.009175f, 0.018762f, -0.029594f, -0.008387f, -0.031652f, 0.027091f, 0.008172f, 0.021199f, 0.036117f, -0.012668f, -0.007558f, -0.005908f, -0.018012f, 0.017344f, -0.008419f, -0.021481f, -0.024079f, -0.004184f, 0.009318f, -0.000628f, 0.004989f, 0.005935f, 0.014102f, -0.006122f, -0.000594f, 0.010462f, -0.009975f, 0.020470f, 0.023301f, 0.021970f, -0.017696f, 0.002436f, -0.005467f, 0.010543f, 0.043895f, 0.032926f, 0.062808f, 0.005040f, 0.024880f, 0.020132f, -0.009452f, -0.002094f, -0.003203f, -0.005788f, 0.008005f, 0.001914f, 0.022669f, 0.017077f, -0.007569f, -0.002242f, -0.013327f, -0.026265f, 0.010670f, -0.000310f, 0.009090f, -0.001844f, -0.018112f, -0.002596f, 0.002837f, -0.010091f, 0.006248f, -0.006409f, -0.008743f, 0.000321f, -0.008761f, 0.000031f, -0.002359f, -0.002119f, 0.000163f, 0.001426f, -0.005434f, 0.000851f, 0.000455f, 0.000042f, 0.002319f, 0.095118f, 0.045863f, 0.016303f, 0.014684f, -0.022672f, 0.014538f, -0.018327f, 0.021799f, 0.017838f, 0.016724f, 0.004228f, + -0.031215f, -0.017507f, 0.033926f, 0.005805f, -0.002028f, -0.007282f, 0.037984f, -0.041305f, -0.017399f, -0.010436f, -0.003136f, -0.029288f, 0.006894f, -0.025325f, -0.014156f, 0.004074f, -0.016055f, 0.023486f, -0.022799f, -0.009917f, -0.005660f, 0.025107f, -0.041941f, -0.008167f, -0.031233f, -0.001001f, -0.000231f, -0.027472f, 0.004408f, 0.021396f, 0.011583f, -0.000617f, -0.012937f, 0.001038f, 0.012853f, -0.017332f, 0.034530f, 0.046932f, -0.003050f, -0.029370f, -0.027644f, 0.019276f, -0.007081f, -0.006473f, 0.040394f, -0.008737f, 0.012829f, -0.001234f, 0.025365f, -0.005228f, 0.003227f, -0.005013f, -0.016220f, -0.045102f, -0.026972f, -0.004350f, -0.012170f, -0.031129f, -0.020495f, 0.011539f, 0.026020f, -0.002282f, -0.003449f, -0.002916f, -0.004293f, 0.014177f, 0.008954f, 0.001916f, -0.008876f, 0.009905f, -0.005889f, -0.020687f, -0.019790f, 0.002428f, 0.013427f, -0.016156f, 0.010462f, -0.001154f, -0.006245f, -0.005476f, 0.000324f, -0.009086f, -0.007026f, 0.000275f, -0.002771f, -0.001462f} +}; +const float CRendBin_Combined_BRIR_coeff_diffuse_im_32kHz[BINAURAL_CHANNELS][2870]={ {-0.004481f, 0.002514f, -0.001425f, 0.000635f, -0.000793f, 0.000202f, -0.000577f, -0.000144f, 0.000043f, 0.001204f, -0.000761f, 0.000531f, -0.001239f, 0.000940f, -0.001392f, -0.001895f, -0.001655f, 0.000398f, -0.000160f, 0.000274f, 0.000053f, -0.000833f, 0.000504f, 0.000853f, -0.000454f, 0.000677f, -0.000086f, -0.000273f, -0.000558f, -0.000091f, 0.000184f, 0.000458f, -0.000306f, 0.000668f, -0.000248f, 0.000422f, 0.000610f, -0.000419f, -0.000394f, 0.000036f, -0.000404f, 0.000121f, 0.000025f, -0.000176f, 0.000409f, 0.000071f, -0.000165f, 0.001707f, -0.001764f, -0.000327f, -0.000370f, -0.000411f, -0.000125f, -0.000029f, -0.000334f, -0.000244f, 0.000005f, 0.000072f, -0.000244f, 0.000142f, -0.000546f, -0.000163f, -0.000087f, 0.000331f, -0.001876f, -0.000178f, 0.000390f, -0.000180f, -0.000226f, 0.000163f, 0.000038f, 0.000132f, 0.000867f, -0.000418f, -0.000275f, -0.000463f, -0.000084f, 0.000254f, 0.000391f, -0.000397f, -0.000295f, 0.000461f, -0.000421f, -0.000630f, -0.000067f, -0.000172f, 0.000222f, -0.000187f, -0.000177f, 0.000104f, 0.000196f, -0.000388f, 0.000130f, 0.000147f, -0.006023f, -0.004100f, + -0.001658f, -0.001906f, -0.001056f, -0.000999f, -0.000936f, -0.000431f, -0.001130f, -0.000900f, -0.000385f, -0.000702f, -0.000086f, -0.000256f, -0.000602f, -0.000828f, -0.000916f, -0.000367f, -0.000528f, -0.000933f, -0.000115f, -0.001166f, 0.000011f, -0.000092f, -0.000154f, -0.000707f, -0.000114f, -0.000536f, 0.000011f, -0.000690f, -0.000431f, 0.000234f, -0.000498f, 0.000086f, -0.001166f, -0.000219f, 0.000580f, 0.000349f, -0.000014f, -0.000173f, -0.000330f, 0.000093f, 0.000115f, 0.000542f, -0.000318f, -0.000056f, -0.000160f, -0.007922f, -0.000437f, 0.001025f, -0.000022f, 0.000309f, -0.000060f, 0.000013f, -0.000640f, 0.000681f, 0.000261f, 0.000819f, 0.000575f, 0.001674f, 0.001221f, 0.000099f, -0.000665f, -0.000375f, -0.000161f, 0.000317f, -0.000229f, -0.001469f, -0.001329f, -0.000681f, -0.000210f, 0.000069f, 0.000182f, 0.000277f, -0.000058f, 0.000051f, 0.000157f, -0.000305f, -0.000047f, -0.000038f, -0.000913f, 0.000539f, 0.000215f, -0.000096f, -0.000015f, -0.000343f, -0.000509f, 0.000318f, 0.000115f, -0.000325f, 0.000310f, 0.000272f, 0.000379f, -0.000167f, 0.008884f, 0.006243f, 0.001224f, 0.002418f, + 0.000498f, 0.000801f, 0.001968f, 0.001016f, 0.000311f, 0.001187f, 0.000480f, -0.000520f, -0.000261f, 0.000413f, 0.000684f, -0.001204f, -0.000164f, -0.000722f, 0.001602f, 0.000798f, 0.000408f, 0.000798f, 0.000405f, 0.000413f, 0.000018f, -0.000078f, -0.000396f, 0.000628f, 0.000758f, 0.000648f, 0.000807f, 0.000978f, 0.000583f, 0.001429f, 0.000321f, -0.000081f, 0.000507f, 0.000094f, -0.000251f, -0.000113f, -0.000224f, -0.000283f, 0.000005f, 0.000663f, 0.000157f, 0.000109f, 0.000384f, 0.013257f, 0.005638f, 0.001703f, 0.001552f, 0.001084f, 0.000672f, 0.000213f, 0.000052f, 0.001453f, 0.000295f, 0.000805f, 0.001097f, 0.000578f, -0.000076f, -0.000405f, 0.002318f, -0.000211f, -0.001266f, -0.000727f, 0.000577f, 0.000031f, 0.001240f, 0.000405f, 0.000154f, -0.000230f, -0.000575f, -0.000165f, -0.000263f, 0.000542f, -0.000092f, 0.000224f, 0.000057f, 0.000083f, -0.000295f, 0.000439f, 0.001611f, 0.001016f, 0.001071f, 0.000961f, 0.000798f, 0.000433f, 0.000313f, 0.000181f, 0.000529f, -0.000447f, 0.000325f, -0.000212f, 0.004354f, -0.004589f, -0.001404f, -0.001974f, -0.001732f, -0.000924f, + -0.000289f, 0.000653f, -0.000652f, 0.000081f, -0.001715f, 0.000594f, -0.000632f, -0.001532f, 0.000397f, -0.001092f, -0.001484f, -0.001042f, 0.001398f, 0.001073f, -0.000507f, 0.000551f, -0.000986f, 0.000390f, -0.001786f, 0.000103f, 0.000283f, -0.000292f, -0.000426f, 0.000381f, -0.001415f, -0.000629f, 0.000172f, -0.000482f, -0.000424f, -0.000311f, 0.000106f, 0.000158f, 0.000701f, 0.000050f, 0.001215f, -0.000465f, -0.000344f, -0.000377f, -0.000613f, -0.000180f, -0.000311f, 0.000180f, -0.000529f, -0.000797f, -0.015738f, -0.007994f, -0.002855f, -0.002254f, -0.002436f, -0.001543f, -0.002105f, -0.001386f, -0.002293f, -0.000428f, -0.001033f, -0.000277f, 0.000110f, -0.000966f, -0.000258f, 0.000140f, 0.000016f, -0.001463f, -0.000960f, -0.000668f, 0.000140f, -0.001969f, 0.000198f, -0.000899f, -0.001738f, 0.000140f, -0.000021f, 0.000111f, -0.000042f, -0.000624f, -0.000469f, 0.000011f, -0.000131f, -0.000031f, -0.000649f, 0.000012f, 0.000177f, 0.000517f, 0.000201f, -0.000686f, 0.000388f, -0.000685f, 0.000459f, -0.001172f, -0.000793f, 0.000167f, -0.000643f, 0.000024f, -0.000243f, -0.000943f, -0.009307f, 0.004880f, + 0.002055f, 0.000756f, 0.001265f, 0.000229f, 0.000342f, 0.001103f, 0.001243f, 0.000665f, 0.000829f, -0.000633f, -0.000262f, -0.000984f, 0.001193f, 0.000243f, 0.000218f, 0.001618f, 0.000056f, -0.001094f, 0.001933f, -0.001286f, 0.000159f, 0.001589f, -0.000479f, 0.000413f, 0.000209f, -0.000042f, -0.000798f, -0.000196f, 0.000444f, 0.000455f, 0.000080f, -0.000290f, 0.000034f, -0.000569f, 0.001824f, 0.000150f, -0.000026f, -0.000722f, -0.000358f, -0.000469f, -0.000431f, 0.000980f, 0.000946f, -0.000250f, 0.000096f, -0.000068f, 0.000287f, 0.000063f, -0.000060f, -0.000200f, 0.000226f, 0.000142f, -0.000274f, -0.000263f, 0.014014f, 0.005953f, 0.001591f, 0.003214f, 0.001866f, 0.000799f, 0.001399f, 0.001205f, 0.000001f, 0.000879f, 0.001389f, 0.000321f, 0.000001f, 0.000711f, 0.001957f, -0.000663f, -0.000362f, -0.001549f, 0.000392f, 0.001786f, 0.000753f, 0.000083f, -0.001011f, -0.000542f, -0.000436f, 0.001881f, 0.000581f, 0.000984f, 0.000547f, -0.000893f, -0.001441f, 0.001631f, 0.000891f, -0.001002f, -0.000483f, 0.001585f, 0.001330f, -0.000067f, 0.000327f, -0.000166f, 0.000692f, 0.000445f, + -0.000160f, 0.000323f, -0.000565f, -0.000262f, 0.000848f, -0.000450f, -0.000355f, 0.000912f, 0.000773f, 0.000433f, 0.000149f, 0.000190f, 0.000185f, 0.000651f, 0.016574f, 0.003606f, 0.002758f, 0.001228f, 0.001262f, 0.000546f, 0.001299f, 0.001552f, 0.002450f, 0.001519f, -0.000471f, 0.001946f, -0.000380f, 0.000532f, 0.000424f, 0.001649f, 0.002410f, 0.001568f, -0.000426f, 0.002713f, -0.000521f, -0.000266f, -0.001430f, 0.000397f, -0.000432f, 0.000456f, 0.000719f, -0.000804f, -0.001143f, -0.000457f, 0.000213f, -0.000897f, -0.000309f, 0.000430f, 0.000591f, -0.001054f, -0.000921f, -0.000366f, 0.000340f, 0.000008f, 0.000272f, -0.000373f, -0.000019f, -0.000247f, -0.000372f, 0.000449f, -0.000627f, 0.000603f, -0.000672f, -0.000215f, -0.000515f, 0.000124f, -0.000194f, 0.000677f, 0.000284f, -0.000036f, 0.001906f, -0.007339f, -0.002373f, -0.002613f, -0.001706f, 0.000469f, -0.000432f, -0.001562f, 0.000889f, 0.000082f, 0.001096f, -0.000108f, 0.000104f, -0.001703f, -0.001225f, -0.000783f, -0.001260f, 0.000124f, -0.001340f, -0.002547f, 0.000497f, 0.000318f, -0.001201f, -0.000242f, -0.001091f, 0.000246f, + 0.000353f, -0.000191f, -0.002656f, -0.000731f, 0.000157f, -0.000276f, 0.000216f, 0.000731f, -0.001893f, -0.000546f, -0.001187f, 0.000630f, -0.000156f, -0.000081f, 0.001223f, -0.001230f, -0.000094f, 0.000405f, -0.000168f, -0.000392f, 0.000587f, 0.000335f, -0.000757f, -0.000898f, -0.001470f, -0.000203f, -0.001125f, -0.000885f, -0.000485f, -0.000606f, -0.000381f, -0.000153f, -0.000351f, -0.000544f, -0.000764f, -0.000412f, 0.000264f, -0.017218f, -0.005865f, -0.003510f, -0.000911f, -0.001809f, -0.000083f, -0.000971f, -0.001295f, -0.001563f, 0.001947f, 0.000063f, -0.000764f, -0.000168f, -0.002876f, -0.001611f, -0.001409f, 0.002356f, -0.001979f, -0.004140f, 0.000335f, 0.000529f, 0.000317f, -0.001510f, -0.000414f, 0.000896f, -0.001920f, -0.000178f, -0.001958f, -0.000562f, 0.001083f, -0.000917f, 0.000260f, 0.002145f, 0.000226f, -0.000418f, -0.000521f, 0.000599f, 0.000654f, 0.000555f, -0.000638f, -0.000095f, 0.000680f, 0.000959f, 0.000560f, 0.000340f, -0.001795f, 0.000363f, -0.000090f, -0.000883f, -0.000342f, 0.000201f, -0.000245f, -0.000893f, -0.000610f, -0.000927f, -0.000276f, 0.000075f, 0.000132f, -0.000118f, + -0.000667f, -0.000094f, -0.000519f, -0.000016f, -0.011435f, 0.002648f, 0.000174f, -0.001397f, 0.002054f, -0.001297f, -0.000998f, 0.000516f, -0.001928f, -0.001155f, -0.000407f, 0.000802f, -0.001520f, 0.002082f, 0.000049f, -0.000057f, 0.000978f, 0.000970f, 0.001531f, -0.000164f, 0.002107f, 0.003020f, 0.002187f, 0.000689f, 0.001872f, -0.000607f, 0.001191f, -0.001379f, -0.001401f, -0.000589f, 0.000179f, 0.000914f, -0.000734f, -0.001324f, -0.000709f, -0.000034f, 0.000823f, -0.001280f, 0.000929f, 0.000315f, 0.000718f, -0.000328f, -0.001160f, -0.001574f, -0.001863f, 0.000487f, -0.000950f, 0.000507f, -0.001976f, -0.000577f, 0.000898f, -0.001254f, 0.000213f, -0.000882f, 0.000606f, -0.000286f, 0.000589f, 0.000134f, -0.000346f, -0.000035f, -0.000791f, 0.001487f, 0.000635f, 0.007650f, 0.012631f, 0.003665f, 0.003285f, 0.004560f, 0.003697f, 0.000730f, 0.002934f, 0.002611f, 0.001424f, 0.005528f, 0.001321f, 0.000943f, 0.002397f, 0.002219f, 0.001171f, 0.000988f, 0.000588f, 0.000928f, -0.000706f, 0.002798f, -0.000740f, 0.000279f, -0.000870f, 0.001776f, 0.000096f, -0.000446f, 0.001469f, 0.001751f, + 0.000622f, 0.002321f, -0.001628f, -0.002696f, -0.000603f, -0.000147f, 0.000595f, -0.000176f, 0.001175f, -0.001072f, 0.001070f, 0.002339f, 0.001010f, -0.002061f, -0.000421f, 0.001068f, 0.000421f, -0.001004f, 0.001473f, 0.000587f, 0.000875f, 0.000974f, 0.001316f, 0.000440f, -0.000358f, 0.000331f, -0.001176f, -0.000302f, 0.001111f, 0.001020f, -0.000564f, -0.000007f, 0.000278f, -0.000491f, 0.029002f, 0.003003f, -0.000292f, 0.001814f, -0.000055f, 0.002498f, 0.000028f, 0.000686f, 0.000313f, 0.002632f, 0.001220f, -0.001056f, 0.000876f, 0.001273f, 0.000671f, -0.001558f, -0.003281f, -0.001484f, -0.001379f, 0.000602f, -0.002015f, -0.000333f, -0.000129f, 0.000562f, 0.003607f, 0.002026f, 0.000679f, 0.001468f, -0.002247f, -0.000115f, -0.001178f, -0.000428f, -0.000928f, 0.001377f, -0.000519f, 0.002291f, -0.001043f, -0.000386f, -0.001164f, -0.000495f, -0.001681f, -0.000758f, 0.000386f, 0.000391f, -0.000088f, 0.000045f, -0.000922f, 0.000549f, 0.001563f, 0.000153f, -0.000841f, 0.001008f, -0.001381f, 0.000632f, 0.000608f, -0.000108f, -0.000429f, -0.000265f, -0.000060f, -0.000231f, 0.000070f, 0.000966f, + -0.000103f, -0.008442f, -0.010046f, -0.001867f, -0.000560f, -0.000411f, -0.001597f, -0.000660f, 0.003048f, 0.001805f, 0.000643f, 0.000832f, -0.001330f, -0.000266f, 0.002289f, -0.000842f, 0.003725f, -0.002891f, -0.000789f, 0.003038f, -0.000585f, -0.000339f, -0.001765f, 0.002083f, 0.002302f, 0.000045f, 0.002269f, -0.000824f, 0.001007f, -0.000045f, -0.001268f, -0.000198f, -0.001003f, -0.000417f, -0.000650f, 0.001255f, -0.000921f, -0.000217f, -0.001418f, 0.000963f, -0.000736f, 0.002100f, -0.003309f, 0.001394f, 0.001156f, -0.001998f, 0.000044f, -0.001319f, 0.000358f, -0.001501f, 0.000480f, 0.000631f, -0.001908f, -0.000285f, -0.000693f, -0.002840f, -0.001645f, -0.000785f, -0.001411f, -0.000304f, -0.000235f, 0.000159f, -0.001153f, 0.000168f, -0.002232f, 0.000630f, 0.000278f, -0.000766f, 0.000284f, -0.000765f, -0.000203f, -0.000496f, -0.000229f, -0.007420f, -0.004255f, -0.005756f, -0.002955f, -0.003845f, -0.000435f, 0.003711f, -0.003877f, 0.002983f, 0.001903f, -0.002113f, 0.004230f, -0.000669f, 0.000823f, -0.002762f, -0.000298f, -0.001228f, -0.000177f, 0.000018f, 0.001042f, 0.000510f, 0.002207f, 0.004234f, + -0.001147f, 0.000584f, -0.002026f, -0.002115f, -0.001880f, 0.000428f, 0.001759f, -0.000620f, -0.000617f, -0.000562f, -0.001310f, 0.001468f, -0.000463f, -0.000098f, -0.001283f, -0.001008f, -0.000855f, -0.001321f, -0.000114f, -0.000058f, -0.001120f, 0.000732f, -0.001713f, 0.000632f, -0.000996f, -0.000178f, 0.000617f, -0.001263f, 0.001558f, -0.002715f, -0.000848f, 0.000256f, -0.000808f, -0.001449f, 0.000707f, -0.000400f, -0.001634f, 0.002676f, 0.001510f, 0.000370f, 0.000507f, 0.000537f, 0.000653f, -0.001353f, -0.000891f, 0.000344f, -0.000485f, -0.000938f, 0.001007f, -0.020663f, -0.002362f, 0.001673f, -0.001511f, 0.003433f, 0.001587f, -0.004179f, 0.000570f, 0.000708f, -0.001344f, -0.003499f, -0.001293f, -0.000849f, 0.001005f, 0.000256f, -0.003235f, -0.001219f, -0.001723f, -0.003114f, -0.002622f, -0.006109f, -0.003176f, -0.003566f, -0.004327f, 0.003447f, -0.002297f, 0.001264f, 0.002588f, -0.001862f, -0.002931f, -0.001127f, -0.000625f, 0.000709f, 0.001946f, 0.001132f, -0.002426f, -0.003017f, 0.002392f, 0.001497f, 0.001894f, 0.002659f, 0.000394f, -0.000005f, 0.001052f, -0.000120f, -0.001163f, 0.000679f, + -0.000623f, -0.000397f, 0.001569f, 0.003979f, -0.001307f, -0.001980f, 0.000936f, -0.001259f, -0.000109f, 0.002054f, -0.003917f, -0.000047f, -0.001284f, -0.000207f, -0.000071f, 0.000032f, -0.000455f, 0.000793f, -0.001157f, 0.001433f, 0.001561f, 0.000662f, -0.000079f, -0.000002f, -0.001312f, 0.016556f, 0.014438f, 0.003911f, 0.008779f, 0.002429f, 0.005056f, -0.000820f, -0.000802f, 0.002457f, 0.003322f, 0.001764f, -0.005733f, -0.001901f, 0.003574f, 0.004037f, -0.001489f, -0.001946f, 0.000655f, 0.001681f, 0.001909f, 0.000284f, -0.002983f, -0.006407f, -0.002408f, 0.003497f, -0.000311f, 0.003594f, -0.000852f, -0.001144f, 0.000726f, -0.002979f, -0.001727f, -0.001733f, 0.003291f, -0.004104f, -0.002832f, 0.000737f, 0.000686f, -0.001057f, -0.000132f, -0.001177f, 0.001231f, 0.001678f, 0.001439f, 0.003251f, 0.001892f, 0.000055f, -0.002663f, 0.002504f, -0.000239f, 0.001387f, -0.001303f, 0.000968f, 0.001979f, -0.000302f, -0.000533f, -0.001240f, -0.001472f, 0.000901f, 0.000199f, 0.001274f, -0.001274f, 0.001064f, 0.002570f, -0.000541f, -0.001413f, 0.001792f, 0.002328f, -0.000947f, 0.001037f, 0.001167f, + 0.000931f, 0.002225f, 0.001898f, 0.020077f, 0.003747f, -0.003936f, 0.003266f, 0.002107f, -0.003801f, -0.000868f, 0.001947f, 0.000098f, 0.000627f, -0.000331f, -0.000792f, -0.004226f, -0.004106f, 0.001800f, 0.003887f, 0.003982f, -0.003953f, -0.008046f, 0.001125f, -0.000157f, -0.003213f, -0.004134f, -0.000723f, 0.002012f, -0.001414f, 0.003003f, 0.004884f, -0.001870f, -0.001595f, -0.000697f, -0.000724f, -0.000992f, -0.007470f, 0.003861f, 0.003556f, -0.000179f, 0.002292f, -0.002307f, -0.000721f, -0.002103f, 0.003011f, 0.003177f, 0.000357f, -0.000848f, -0.001177f, 0.001751f, 0.000430f, -0.001095f, -0.001896f, -0.000039f, 0.001590f, -0.002467f, -0.001506f, -0.001364f, 0.000407f, 0.000728f, -0.003052f, 0.001508f, 0.003363f, -0.002793f, -0.000039f, -0.000708f, -0.000476f, -0.000068f, 0.000333f, 0.000142f, -0.000198f, 0.000556f, -0.000912f, -0.001846f, -0.002125f, -0.000981f, -0.000522f, -0.001130f, -0.002131f, -0.001604f, -0.000513f, 0.001487f, -0.000718f, -0.005505f, -0.003629f, 0.000518f, 0.004979f, -0.005014f, 0.003560f, 0.001625f, 0.000774f, 0.001012f, 0.000854f, 0.003245f, 0.005258f, 0.000137f, + 0.001579f, 0.000577f, -0.004535f, -0.004119f, 0.004008f, 0.000538f, -0.004686f, 0.002753f, -0.004002f, 0.000651f, 0.004902f, -0.000321f, -0.001350f, 0.005599f, 0.000865f, 0.000375f, 0.000452f, 0.000159f, 0.000496f, -0.002474f, 0.001469f, 0.002252f, 0.003690f, -0.002945f, -0.001465f, 0.000567f, 0.000505f, -0.001355f, -0.002662f, 0.001688f, -0.000977f, 0.001180f, 0.000620f, -0.000931f, -0.000867f, 0.000372f, 0.001674f, -0.001284f, -0.000572f, -0.000293f, 0.000958f, -0.002695f, -0.001263f, 0.001241f, 0.000260f, -0.000914f, -0.000476f, 0.001122f, -0.001142f, 0.000348f, -0.000775f, -0.000194f, 0.000904f, 0.000260f, 0.000526f, -0.002326f, -0.001659f, 0.000616f, -0.021590f, -0.019822f, -0.004433f, -0.009184f, -0.008065f, -0.004568f, -0.001387f, -0.003430f, -0.004131f, 0.002807f, 0.000749f, -0.000959f, 0.004709f, 0.001729f, 0.005658f, 0.004384f, 0.001259f, 0.001756f, 0.002062f, -0.008676f, 0.004088f, -0.000670f, -0.001840f, -0.001625f, -0.005136f, -0.001589f, -0.001785f, 0.004931f, -0.001652f, -0.002945f, -0.001471f, 0.000785f, -0.000647f, -0.000984f, 0.001083f, -0.001304f, -0.000850f, 0.003017f, + -0.002962f, -0.000258f, -0.000961f, 0.005427f, 0.002150f, 0.002170f, -0.004179f, 0.000322f, 0.003712f, -0.001952f, 0.000883f, 0.000018f, 0.000899f, 0.000024f, 0.000308f, -0.000285f, 0.002365f, -0.000309f, -0.000776f, 0.001725f, -0.001229f, 0.000967f, 0.002061f, -0.000966f, -0.001438f, 0.000639f, 0.000786f, -0.001551f, -0.000638f, -0.002862f, -0.002269f, 0.000751f, -0.000262f, -0.000504f, -0.000054f, 0.000377f, -0.000185f, -0.001816f, -0.000856f, -0.013522f, 0.028554f, 0.017910f, 0.005763f, 0.001739f, 0.001972f, 0.002010f, 0.003214f, 0.002800f, 0.006054f, 0.012065f, 0.000699f, 0.001361f, 0.002641f, 0.002461f, 0.003120f, -0.002269f, 0.011739f, 0.008342f, -0.007771f, 0.005736f, 0.001077f, -0.001267f, 0.002829f, 0.007071f, -0.006635f, -0.001906f, 0.000552f, -0.005532f, -0.003752f, -0.003956f, 0.008067f, -0.000366f, -0.001424f, 0.001063f, 0.000453f, -0.002416f, -0.006463f, 0.004480f, 0.003672f, -0.001105f, 0.002006f, 0.004594f, -0.003055f, 0.002500f, 0.000265f, -0.001204f, 0.003638f, 0.003095f, 0.000728f, 0.000415f, 0.000375f, 0.002493f, 0.003530f, 0.000026f, -0.000635f, -0.000038f, + -0.001115f, 0.002471f, 0.000520f, -0.001006f, -0.001234f, -0.000905f, 0.001881f, 0.000868f, 0.004273f, -0.001292f, 0.001528f, -0.000951f, 0.001066f, -0.001744f, -0.000619f, 0.000525f, -0.000948f, -0.001220f, 0.000108f, 0.000207f, 0.000548f, 0.001156f, 0.030926f, -0.010900f, -0.010707f, 0.004849f, 0.001192f, -0.004052f, -0.003568f, -0.005667f, -0.005617f, -0.004108f, -0.003481f, 0.005121f, 0.001194f, 0.000619f, -0.002904f, -0.002535f, -0.009053f, -0.000009f, -0.003578f, -0.006222f, 0.005185f, 0.003449f, 0.001070f, 0.003206f, 0.000901f, -0.001091f, -0.002005f, -0.000169f, -0.001694f, 0.002624f, 0.004444f, -0.004717f, -0.001736f, 0.000069f, 0.002428f, 0.006160f, 0.001855f, 0.008262f, -0.004236f, 0.002608f, 0.006890f, 0.004060f, -0.003428f, -0.001021f, 0.000811f, -0.001746f, 0.002986f, -0.000462f, 0.000180f, 0.004400f, 0.002428f, 0.000706f, 0.000439f, -0.000107f, -0.001821f, -0.000051f, 0.000559f, -0.001974f, -0.001086f, 0.001953f, -0.000727f, -0.003744f, -0.000509f, 0.000114f, -0.000611f, -0.003899f, 0.001057f, 0.000805f, 0.001020f, 0.001092f, -0.000769f, -0.001617f, -0.000506f, -0.000815f, + 0.003219f, 0.001359f, -0.001189f, 0.000886f, -0.000243f, 0.000672f, 0.000098f, 0.009930f, 0.018867f, 0.007414f, 0.005058f, 0.005916f, -0.001715f, 0.001908f, -0.005377f, 0.009387f, 0.003703f, 0.009018f, 0.002704f, 0.003444f, -0.008213f, 0.010281f, 0.015231f, 0.001946f, 0.009879f, -0.001966f, -0.007997f, -0.007914f, 0.007251f, -0.002316f, 0.005792f, 0.001087f, 0.002328f, -0.004421f, 0.004486f, -0.001538f, -0.001587f, 0.007408f, 0.005147f, -0.003854f, 0.006917f, 0.000800f, 0.001273f, -0.001366f, -0.005197f, 0.001475f, 0.000399f, -0.002872f, -0.003270f, 0.003082f, 0.004302f, 0.001437f, -0.001502f, 0.002055f, 0.000175f, 0.004598f, -0.002745f, -0.000371f, -0.004533f, 0.000562f, 0.004454f, 0.003022f, -0.002055f, 0.000016f, 0.001569f, -0.004003f, -0.000297f, -0.002723f, -0.001529f, 0.000873f, 0.001069f, 0.002744f, -0.003181f, 0.001412f, -0.003660f, 0.000353f, 0.004545f, 0.001629f, 0.000898f, -0.002844f, 0.000428f, 0.000376f, -0.004739f, -0.001225f, 0.000552f, 0.000841f, 0.001878f, 0.000797f, -0.000102f, -0.022037f, -0.001202f, -0.004978f, 0.006255f, -0.004766f, 0.005145f, 0.000155f, + 0.004124f, -0.000574f, 0.003557f, -0.011013f, 0.003236f, -0.001294f, -0.003974f, 0.001935f, -0.004840f, 0.002967f, -0.004886f, -0.002579f, -0.010794f, 0.006140f, 0.012924f, -0.005074f, -0.001721f, -0.001479f, -0.002124f, 0.001969f, 0.002558f, 0.003747f, -0.009602f, 0.002866f, -0.005985f, -0.001712f, -0.000345f, 0.004921f, 0.001857f, -0.002474f, 0.001019f, 0.001048f, 0.003498f, 0.003592f, -0.006007f, -0.001973f, 0.000842f, -0.004365f, -0.003916f, -0.000738f, -0.002805f, 0.001184f, 0.003323f, 0.000449f, 0.000555f, -0.000789f, 0.003097f, 0.008432f, 0.004732f, -0.005175f, 0.001020f, 0.001915f, -0.002591f, 0.002974f, 0.000748f, -0.003312f, -0.000340f, 0.003800f, 0.000381f, 0.003638f, -0.004915f, -0.001136f, 0.002911f, 0.000146f, -0.001632f, -0.003396f, -0.000282f, -0.001799f, 0.002786f, -0.000791f, 0.001732f, -0.000833f, -0.000383f, -0.040453f, -0.015181f, 0.008214f, 0.002961f, -0.005196f, 0.005749f, 0.004739f, 0.007590f, -0.001834f, -0.003312f, 0.006631f, 0.000294f, -0.004466f, 0.009031f, -0.010108f, -0.013153f, -0.006214f, -0.007051f, 0.004615f, 0.006650f, -0.000150f, 0.001730f, 0.010471f, + 0.004629f, -0.010604f, -0.004773f, -0.006522f, 0.001974f, -0.009846f, -0.008571f, -0.000518f, 0.001353f, -0.003764f, -0.004098f, -0.005999f, -0.003094f, -0.005488f, -0.005358f, -0.002015f, 0.000489f, -0.001955f, -0.000290f, -0.003698f, -0.000543f, -0.002831f, -0.006231f, 0.013535f, 0.001128f, 0.003211f, -0.005486f, 0.003595f, -0.000322f, 0.001846f, -0.004398f, -0.000165f, -0.000685f, -0.003668f, -0.002273f, -0.001663f, 0.004430f, 0.003226f, 0.003475f, 0.002157f, 0.002703f, -0.000606f, 0.000077f, -0.003172f, -0.000546f, -0.000137f, -0.000211f, 0.004173f, 0.001168f, 0.002455f, 0.002582f, -0.001859f, -0.004452f, 0.001943f, -0.001686f, -0.000781f, 0.001874f, 0.005345f, -0.000543f, 0.021219f, 0.007790f, 0.017098f, 0.002689f, 0.001165f, -0.006842f, 0.002644f, 0.010226f, 0.003868f, 0.000744f, 0.006891f, -0.006146f, -0.002724f, 0.005590f, -0.004230f, 0.001950f, 0.009856f, 0.003167f, 0.001371f, 0.003140f, -0.001759f, 0.004282f, -0.003216f, 0.000119f, 0.001703f, 0.000581f, -0.002473f, -0.002694f, 0.001100f, 0.010129f, -0.003236f, 0.002516f, -0.009288f, -0.004978f, 0.004310f, 0.010672f, -0.008152f, + 0.000077f, 0.005182f, 0.001305f, 0.002001f, -0.006767f, -0.002322f, -0.005847f, -0.010201f, -0.002695f, -0.005651f, -0.006008f, 0.004911f, 0.001956f, 0.001730f, -0.003508f, -0.002106f, -0.000689f, -0.009796f, -0.000913f, 0.005571f, -0.003892f, 0.004481f, 0.009105f, 0.001435f, 0.006033f, 0.004025f, 0.000350f, -0.001764f, 0.005236f, -0.006553f, -0.000302f, -0.000342f, 0.004167f, 0.002067f, 0.003840f, 0.000203f, 0.004258f, -0.000210f, 0.000889f, 0.000705f, 0.004532f, 0.000088f, 0.000055f, 0.004111f, -0.002179f, 0.002583f, 0.000903f, 0.000740f, -0.001303f, 0.025767f, -0.005654f, -0.007917f, 0.001269f, 0.005924f, 0.004823f, 0.004930f, -0.001434f, 0.005318f, 0.001673f, -0.006327f, -0.012654f, 0.008472f, 0.002281f, 0.006128f, 0.003666f, -0.003373f, 0.001495f, -0.004851f, -0.008274f, 0.008595f, -0.005376f, -0.010303f, 0.001103f, -0.001693f, 0.001281f, -0.001029f, -0.001031f, -0.002620f, -0.004071f, 0.003030f, 0.006957f, -0.010044f, 0.009830f, -0.008499f, -0.011072f, 0.001072f, 0.002987f, -0.006263f, 0.004944f, -0.000892f, 0.003143f, -0.005394f, -0.002653f, 0.009158f, 0.003771f, 0.009273f, + 0.002491f, 0.000698f, 0.002981f, -0.000033f, 0.000378f, 0.004855f, -0.000391f, 0.000852f, -0.004304f, -0.002963f, -0.002534f, 0.003417f, -0.003338f, -0.002886f, 0.005562f, -0.000169f, 0.006225f, 0.000938f, -0.004483f, 0.007401f, 0.005800f, -0.000480f, 0.003794f, -0.003803f, -0.006203f, 0.002393f, -0.002251f, -0.004500f, 0.000421f, 0.003950f, 0.005414f, -0.002037f, 0.001713f, 0.002599f, -0.000324f, 0.001109f, -0.005357f, 0.002061f, 0.001901f, -0.002700f, 0.021591f, 0.026307f, -0.004035f, 0.000161f, -0.013238f, -0.001497f, -0.009661f, -0.007224f, -0.002309f, -0.004940f, 0.007447f, 0.000004f, 0.005776f, -0.012354f, 0.010265f, -0.007780f, 0.010483f, 0.000373f, 0.008323f, -0.003008f, 0.010491f, 0.003451f, -0.004999f, 0.002214f, -0.007460f, 0.004948f, -0.004159f, 0.011815f, 0.003518f, 0.007766f, -0.012926f, -0.007401f, -0.003175f, -0.006548f, -0.002746f, -0.004481f, 0.000416f, 0.015971f, -0.007386f, 0.008031f, 0.013532f, 0.001919f, 0.005948f, 0.000080f, -0.003039f, -0.006319f, -0.004824f, 0.000673f, -0.003483f, 0.008172f, -0.005300f, 0.003747f, 0.009882f, -0.001301f, -0.000821f, -0.000792f, + 0.008081f, 0.008740f, 0.002733f, -0.004058f, -0.003562f, -0.002143f, 0.003412f, -0.008007f, 0.001499f, -0.001436f, -0.002209f, 0.000113f, 0.005281f, 0.000472f, 0.007480f, 0.006854f, 0.001353f, 0.001645f, -0.003261f, -0.000163f, 0.007690f, -0.000993f, 0.000451f, 0.003228f, -0.004114f, 0.000079f, -0.004708f, -0.005120f, 0.000738f, 0.000739f, -0.001031f, -0.020502f, -0.018371f, 0.008183f, -0.002437f, 0.010123f, -0.005760f, -0.004755f, -0.006875f, -0.005642f, -0.002609f, -0.016179f, -0.005932f, 0.006231f, 0.008700f, 0.003593f, -0.011273f, -0.003200f, -0.005410f, 0.004785f, 0.016313f, 0.009137f, 0.003990f, 0.000644f, 0.001241f, 0.000853f, 0.002871f, 0.008442f, 0.000691f, 0.002225f, -0.004794f, 0.000404f, -0.006874f, 0.002703f, 0.003372f, 0.006111f, 0.000802f, -0.004156f, -0.002081f, 0.008054f, -0.003727f, 0.003051f, 0.001661f, 0.002933f, 0.010287f, -0.005698f, -0.008666f, 0.003282f, 0.007339f, 0.001955f, 0.007335f, 0.008799f, 0.004257f, 0.006107f, 0.002368f, 0.001330f, 0.004845f, 0.014654f, -0.008127f, 0.000011f, 0.002425f, 0.001319f, -0.006299f, -0.001100f, 0.004889f, -0.000064f, + -0.005649f, 0.002273f, 0.010641f, -0.008625f, 0.002835f, -0.008168f, 0.004752f, 0.003231f, 0.001325f, 0.000333f, -0.003845f, -0.003832f, 0.007490f, 0.004051f, 0.001541f, -0.002268f, 0.005253f, -0.000736f, 0.000033f, -0.003626f, 0.003875f, 0.001448f, -0.041269f, -0.014405f, -0.000926f, -0.004118f, -0.010177f, 0.006217f, 0.008302f, 0.014006f, 0.004603f, 0.008806f, -0.008177f, -0.017255f, 0.008036f, -0.004078f, 0.000432f, -0.009291f, 0.009140f, -0.005489f, -0.000434f, 0.008494f, -0.023539f, 0.002268f, 0.012242f, -0.022847f, -0.006040f, -0.008098f, 0.001105f, 0.000846f, 0.005588f, -0.006358f, 0.007407f, 0.001050f, -0.011978f, -0.006179f, 0.001415f, -0.001544f, -0.005935f, 0.005214f, 0.013925f, 0.002967f, 0.003851f, -0.002244f, -0.003469f, 0.008115f, 0.001481f, -0.004092f, -0.020007f, -0.003199f, 0.002521f, -0.010156f, 0.004814f, 0.004084f, 0.000808f, -0.007853f, -0.007014f, -0.008372f, 0.017955f, 0.004749f, -0.002741f, 0.003460f, -0.015269f, 0.001775f, -0.007150f, -0.008230f, 0.007945f, -0.001377f, 0.000099f, -0.005198f, -0.019103f, 0.002555f, 0.005801f, 0.003334f, -0.001397f, 0.011275f, + 0.000374f, -0.004760f, -0.000759f, -0.007442f, 0.011703f, 0.006352f, 0.003273f, -0.001960f, 0.000795f, 0.003746f, -0.003485f, 0.001451f, 0.001613f, 0.000533f, 0.043790f, 0.011029f, 0.011302f, 0.009602f, -0.002796f, 0.000378f, 0.045032f, 0.013006f, -0.003726f, 0.027509f, -0.015431f, 0.011477f, 0.002412f, 0.007015f, 0.011243f, -0.003476f, -0.007849f, 0.008477f, -0.001542f, -0.027198f, 0.006954f, 0.007053f, 0.005757f, 0.012948f, 0.008202f, 0.008457f, -0.007662f, 0.001689f, -0.007399f, -0.003860f, 0.008061f, 0.002676f, -0.015877f, -0.009480f, -0.013307f, -0.019811f, -0.003034f, 0.004087f, 0.009677f, 0.008354f, 0.007197f, 0.006036f, -0.002934f, 0.010363f, 0.005765f, -0.012611f, -0.004825f, 0.003364f, 0.009498f, 0.000228f, 0.002048f, 0.016723f, -0.002995f, -0.001416f, -0.004333f, -0.000872f, 0.008522f, -0.007278f, 0.000126f, -0.010294f, -0.009147f, -0.005861f, 0.010714f, 0.014725f, -0.004273f, 0.001190f, -0.002838f, -0.009141f, -0.006196f, 0.002375f, -0.010589f, -0.002815f, -0.002830f, -0.006845f, 0.018758f, 0.004110f, 0.006275f, 0.005469f, -0.000544f, 0.000024f, 0.003241f, 0.000985f, + 0.005899f, 0.003718f, 0.000105f, -0.000597f, 0.044544f, 0.026341f, 0.001874f, 0.016732f, 0.012748f, 0.003666f, 0.019290f, 0.005463f, -0.000087f, -0.005979f, -0.004472f, -0.012568f, -0.034179f, -0.002510f, 0.003296f, -0.011634f, -0.006670f, -0.001288f, 0.023819f, 0.007834f, -0.006215f, 0.000273f, 0.001629f, -0.003386f, 0.010027f, -0.001665f, -0.006224f, -0.004196f, -0.005869f, 0.003799f, -0.008611f, -0.020936f, 0.000445f, -0.010913f, -0.016994f, 0.003357f, 0.007285f, 0.010652f, 0.005947f, 0.009432f, -0.006441f, -0.018029f, -0.011816f, -0.016214f, 0.006344f, 0.015261f, 0.012509f, 0.008143f, 0.015169f, 0.000421f, 0.009467f, 0.020674f, -0.017117f, 0.003111f, -0.007746f, 0.000110f, 0.005899f, 0.006186f, 0.010002f, -0.000875f, -0.020915f, -0.016100f, 0.003438f, -0.004530f, -0.005969f, -0.003952f, -0.004592f, -0.014265f, 0.001233f, 0.009718f, -0.001067f, 0.007411f, -0.004466f, -0.000351f, -0.000831f, 0.003721f, 0.014158f, 0.010033f, 0.008619f, -0.008167f, 0.000451f, -0.004902f, 0.000560f, -0.013106f, 0.002620f, 0.002196f, 0.001410f, -0.000245f, -0.001623f, -0.003760f, 0.003265f, 0.000168f, + 0.005910f, 0.010848f, -0.022256f, 0.002756f, -0.017035f, 0.007619f, -0.032524f, -0.000881f, -0.010791f, -0.016775f, 0.030030f, 0.016989f, -0.010714f, -0.026970f, -0.006827f, -0.009837f, -0.023575f, 0.018346f, 0.000978f, -0.016289f, -0.006061f, 0.009427f, -0.015429f, -0.010491f, -0.008107f, -0.018276f, -0.007017f, -0.000365f, -0.014793f, -0.013410f, 0.018832f, -0.007026f, -0.005879f, -0.001732f, -0.004210f, 0.016019f, -0.017743f, -0.008283f, 0.003747f, -0.004720f, -0.000020f, -0.004019f, 0.009236f, -0.016813f, 0.005992f, -0.026885f, 0.002737f, -0.007683f, -0.010738f, 0.028248f, 0.002935f, -0.010431f, 0.005386f, 0.005909f, -0.022799f, 0.015826f, -0.003858f, -0.004902f, -0.001726f, 0.009053f, -0.003770f, 0.000410f, -0.010917f, 0.005948f, 0.007400f, 0.012717f, -0.010976f, -0.028144f, 0.019658f, -0.002244f, 0.008118f, 0.009632f, -0.005829f, 0.005561f, 0.014536f, -0.018554f, 0.000999f, -0.006532f, -0.002018f, -0.019260f, 0.006577f, -0.002989f, 0.000778f, -0.000475f, 0.002555f, -0.003236f, -0.002910f, 0.005311f, -0.004876f, 0.003849f, 0.001133f, -0.003612f, 0.002181f, 0.000599f, -0.042512f, -0.023705f, + 0.005324f, -0.015120f, 0.001833f, -0.010931f, -0.005656f, -0.016026f, -0.011024f, 0.008063f, 0.023885f, 0.025087f, 0.003995f, 0.017699f, -0.012225f, 0.030926f, 0.022712f, -0.018101f, -0.016274f, 0.005116f, 0.005109f, 0.026138f, 0.009492f, 0.016733f, -0.006033f, 0.006701f, -0.003395f, -0.002815f, -0.005539f, 0.024437f, 0.010945f, 0.023406f, 0.021269f, 0.004077f, -0.001254f, -0.010363f, 0.010268f, -0.001237f, -0.021410f, -0.014288f, -0.004070f, -0.011078f, -0.002470f, -0.011385f, -0.009980f, 0.006745f, -0.003022f, -0.007211f, 0.017879f, 0.021058f, -0.012122f, -0.004065f, 0.028743f, 0.011709f, -0.019624f, -0.019312f, -0.006952f, 0.007249f, -0.000911f, -0.003608f, -0.013962f, 0.011780f, 0.003644f, -0.004565f, 0.003284f, 0.003225f, -0.017311f, -0.007647f, 0.001658f, -0.006552f, -0.008399f, -0.009107f, 0.023517f, -0.018437f, -0.016488f, 0.006757f, 0.012076f, 0.017162f, -0.008696f, -0.002809f, 0.001680f, -0.007934f, 0.008236f, -0.001255f, 0.006192f, -0.005187f, -0.002101f, 0.001574f, 0.002427f, -0.002988f, -0.002560f, -0.000251f, -0.003134f, -0.016170f, -0.023757f, -0.020397f, -0.000177f, -0.016048f, + -0.020658f, 0.005338f, -0.001781f, -0.028758f, 0.020546f, 0.003697f, -0.001759f, 0.010279f, 0.031671f, 0.030318f, 0.013044f, -0.037020f, 0.013758f, 0.009888f, -0.036333f, -0.000450f, -0.017546f, -0.008455f, 0.018699f, -0.021906f, 0.012748f, 0.000063f, -0.003789f, -0.007784f, 0.003764f, -0.001755f, 0.006285f, -0.004154f, -0.019460f, 0.018968f, 0.008931f, 0.022704f, -0.002364f, -0.007541f, -0.010948f, 0.009248f, -0.009867f, 0.026808f, 0.005620f, 0.016141f, -0.020824f, 0.016678f, 0.000640f, 0.005968f, -0.013518f, 0.004639f, -0.016054f, -0.002430f, -0.016467f, 0.006837f, 0.011386f, -0.021758f, 0.000886f, -0.017907f, 0.008436f, 0.010756f, 0.010367f, -0.001304f, -0.030903f, 0.000181f, 0.008165f, -0.002540f, 0.013743f, -0.029442f, 0.007589f, -0.012174f, 0.003977f, -0.010293f, 0.002160f, 0.007777f, -0.003318f, 0.000025f, -0.003204f, -0.003706f, 0.001196f, -0.007830f, 0.010037f, 0.002401f, -0.000237f, -0.012560f, -0.001157f, 0.001483f, -0.000889f, 0.005479f, -0.005460f, 0.001371f, -0.000555f, -0.002650f, 0.044506f, 0.053900f, 0.022604f, 0.018769f, -0.031053f, 0.029875f, 0.043472f, -0.047551f, + 0.005732f, 0.030784f, 0.005412f, -0.056707f, -0.005609f, -0.030798f, 0.009982f, 0.011243f, -0.014275f, -0.005637f, 0.010388f, -0.026050f, -0.002024f, -0.010222f, -0.012731f, 0.005054f, -0.019681f, 0.021239f, 0.015213f, 0.027475f, -0.013562f, 0.004474f, -0.002910f, -0.011233f, 0.034777f, -0.000703f, -0.015918f, -0.007569f, 0.007563f, -0.007498f, -0.009030f, -0.010688f, 0.017724f, 0.006541f, 0.024616f, -0.001760f, 0.009066f, 0.032207f, -0.020382f, 0.004258f, -0.013819f, 0.025553f, -0.009981f, 0.011944f, 0.005139f, -0.001038f, -0.009625f, -0.018234f, -0.012252f, 0.005117f, 0.023176f, -0.021762f, 0.019565f, 0.023043f, 0.011657f, 0.026934f, -0.013103f, -0.010735f, 0.017624f, -0.003057f, -0.003198f, -0.024877f, -0.001505f, -0.020527f, 0.004284f, 0.025974f, 0.012818f, 0.006532f, 0.011983f, 0.007077f, -0.011097f, -0.005047f, -0.019430f, 0.022045f, 0.000995f, -0.008777f, 0.005899f, 0.001976f, -0.010179f, 0.005352f, -0.001397f, 0.006317f, -0.000987f, 0.009591f, 0.004665f, -0.020561f, -0.070739f, -0.029435f, -0.050922f, -0.027246f, -0.021880f, 0.011854f, -0.032765f, -0.033147f, -0.016125f, -0.044348f, + -0.014669f, 0.033654f, -0.001235f, 0.001442f, -0.009283f, -0.007770f, -0.004426f, 0.003149f, -0.000768f, -0.029685f, -0.004961f, -0.005792f, 0.042936f, -0.005513f, 0.038145f, 0.003193f, -0.010571f, 0.010059f, 0.031353f, -0.001570f, 0.000072f, -0.012657f, -0.003977f, -0.013292f, 0.007248f, -0.005585f, -0.011628f, 0.005791f, -0.015618f, 0.012522f, 0.012389f, 0.002502f, 0.027393f, -0.012488f, 0.013819f, -0.011675f, 0.015276f, 0.010568f, 0.028861f, 0.004024f, -0.012185f, 0.015707f, -0.002306f, -0.009742f, 0.036720f, -0.002739f, -0.002552f, 0.021352f, 0.006256f, 0.028736f, -0.022697f, -0.021816f, -0.003660f, -0.009447f, -0.003349f, -0.035312f, -0.008376f, 0.012262f, -0.005142f, -0.015198f, -0.025203f, 0.001686f, 0.007236f, -0.012427f, -0.012268f, -0.021611f, -0.008071f, 0.009178f, 0.009091f, 0.019134f, -0.003455f, -0.001767f, -0.001072f, 0.006380f, 0.007244f, 0.001291f, 0.011716f, 0.003328f, 0.000893f, -0.001638f, -0.001573f, 0.008669f, -0.004133f, 0.008565f, 0.009231f, -0.000431f}, + {-0.005154f, 0.002787f, -0.001446f, 0.001705f, -0.001002f, 0.001433f, -0.002977f, 0.000142f, -0.000111f, -0.000330f, 0.000690f, 0.001478f, -0.000045f, -0.000131f, -0.001599f, -0.000630f, 0.000692f, 0.000401f, -0.000180f, 0.000629f, -0.000185f, 0.000223f, -0.000694f, -0.000466f, -0.000466f, -0.000152f, 0.000070f, -0.000340f, -0.000237f, 0.000800f, -0.000454f, 0.000483f, -0.000439f, -0.000068f, -0.000337f, 0.000427f, 0.000158f, 0.000346f, 0.000579f, 0.000719f, 0.000269f, 0.000194f, -0.000057f, 0.000082f, 0.000108f, -0.000130f, 0.000132f, 0.001823f, -0.002086f, -0.000280f, -0.000384f, -0.000519f, 0.000338f, -0.001036f, 0.000352f, -0.000024f, 0.000472f, 0.000414f, -0.000822f, -0.000292f, 0.001254f, -0.000132f, 0.000268f, -0.000233f, 0.000545f, 0.001150f, 0.001330f, 0.000226f, 0.000573f, -0.000020f, -0.001050f, -0.000032f, 0.000114f, -0.000228f, 0.000004f, 0.000578f, -0.000603f, -0.000811f, 0.000353f, -0.000392f, -0.000362f, -0.000569f, -0.000025f, 0.000597f, 0.000150f, -0.000177f, -0.000217f, -0.000239f, -0.000004f, 0.000132f, -0.000320f, 0.000117f, -0.000366f, 0.000220f, -0.005238f, -0.003708f, + -0.001823f, -0.001359f, -0.001056f, -0.001071f, -0.000380f, -0.000790f, -0.000255f, -0.000495f, -0.001302f, 0.000254f, 0.000654f, -0.000104f, 0.000370f, -0.000246f, -0.000679f, -0.000670f, -0.001022f, -0.000344f, 0.000236f, 0.000031f, -0.000579f, 0.000386f, -0.000698f, -0.000679f, 0.000439f, -0.000000f, 0.000014f, 0.000359f, 0.000398f, 0.000108f, -0.000166f, -0.000203f, -0.000277f, 0.000138f, 0.000062f, -0.000358f, 0.000182f, -0.000711f, -0.000316f, -0.000178f, -0.000084f, -0.000508f, -0.000112f, -0.000189f, -0.000021f, -0.007452f, -0.000981f, 0.000557f, 0.000129f, 0.000525f, 0.000077f, -0.000426f, 0.000288f, -0.000332f, -0.000331f, -0.000683f, -0.000544f, 0.000254f, -0.000191f, 0.000458f, -0.000439f, -0.000008f, -0.000424f, 0.000124f, 0.000774f, -0.000213f, 0.000580f, 0.000016f, -0.000498f, -0.000119f, 0.000703f, 0.000329f, 0.000464f, 0.000490f, -0.000694f, 0.000466f, -0.000272f, -0.000073f, -0.000366f, -0.000199f, 0.000227f, 0.000294f, 0.000185f, -0.000187f, 0.000571f, 0.000462f, 0.000306f, -0.000180f, -0.000337f, 0.000036f, -0.000274f, 0.000046f, 0.008773f, 0.006964f, 0.001664f, 0.003111f, + 0.000766f, 0.002404f, 0.001711f, 0.000510f, 0.001723f, 0.000675f, 0.001310f, 0.000552f, -0.000456f, 0.001291f, 0.000932f, -0.000365f, -0.000102f, -0.002427f, -0.000244f, 0.000115f, 0.001492f, 0.000160f, 0.000074f, 0.000745f, 0.000078f, 0.000674f, 0.000644f, 0.000095f, -0.000032f, 0.000235f, 0.001025f, 0.000767f, 0.000669f, -0.000068f, -0.000239f, 0.000039f, 0.000487f, -0.000178f, -0.000029f, 0.000520f, 0.000193f, -0.000259f, 0.000008f, 0.000112f, -0.000493f, 0.000642f, -0.000353f, 0.015448f, 0.005604f, 0.002767f, 0.001580f, 0.001027f, 0.000958f, 0.000984f, 0.001536f, 0.000427f, 0.002530f, 0.000394f, 0.000196f, 0.001146f, -0.000640f, 0.000310f, -0.000307f, -0.000231f, -0.000467f, 0.001697f, 0.000872f, -0.000087f, 0.001219f, -0.000815f, -0.000259f, -0.000254f, 0.001904f, -0.000130f, 0.000660f, 0.000208f, 0.000915f, 0.000220f, -0.000320f, 0.000557f, 0.000616f, -0.000243f, 0.000196f, 0.000325f, 0.000139f, 0.000455f, -0.000163f, 0.000514f, 0.000376f, -0.001187f, 0.000239f, 0.000209f, 0.000205f, 0.000919f, 0.005963f, -0.004425f, -0.001482f, -0.002076f, -0.001209f, -0.001257f, + 0.000860f, -0.000742f, -0.001777f, -0.000514f, -0.002379f, -0.000626f, -0.001011f, -0.002384f, -0.000547f, 0.000464f, -0.001429f, -0.000553f, 0.000268f, -0.001704f, -0.000035f, 0.001827f, 0.000462f, 0.000206f, -0.000830f, -0.000032f, 0.000697f, -0.000055f, -0.000762f, -0.000915f, 0.000905f, -0.000149f, -0.001090f, 0.000032f, -0.000443f, 0.001301f, -0.000005f, 0.000543f, -0.000188f, 0.001112f, -0.000749f, 0.000397f, 0.000192f, 0.000198f, 0.000047f, 0.000223f, -0.000002f, -0.000465f, 0.000757f, 0.000477f, -0.016282f, -0.009141f, -0.001923f, -0.002248f, -0.001621f, -0.001962f, -0.002873f, -0.000222f, 0.000024f, -0.000793f, 0.000653f, -0.000735f, 0.000064f, -0.000049f, -0.000982f, -0.000993f, -0.001671f, -0.000538f, 0.001534f, -0.001488f, -0.000229f, 0.001463f, 0.000860f, -0.000210f, 0.000469f, -0.000195f, -0.001625f, -0.000765f, -0.001347f, -0.000425f, -0.000003f, -0.000314f, 0.000681f, -0.001366f, -0.001149f, -0.000040f, -0.001398f, -0.001029f, -0.001009f, -0.001095f, 0.001084f, -0.000343f, -0.001473f, -0.000453f, 0.000316f, 0.000430f, -0.000546f, -0.000728f, -0.000395f, -0.001349f, -0.010083f, 0.005841f, + 0.002020f, 0.001061f, 0.000859f, 0.000997f, 0.000316f, -0.000942f, 0.000163f, -0.000509f, -0.000300f, 0.001908f, 0.000977f, 0.001662f, 0.001460f, 0.001749f, -0.001466f, 0.000814f, 0.001636f, 0.000410f, 0.001412f, -0.001668f, 0.000231f, -0.000324f, -0.000230f, -0.000542f, 0.000537f, -0.000101f, -0.000079f, 0.001719f, -0.001741f, -0.000361f, 0.000520f, 0.001048f, -0.000530f, 0.000897f, -0.000750f, -0.000938f, 0.001176f, -0.000500f, -0.000155f, -0.000218f, 0.000382f, -0.000023f, 0.000489f, -0.000494f, -0.000341f, -0.000433f, -0.000256f, -0.000359f, 0.000854f, 0.000235f, 0.000209f, -0.000442f, -0.000807f, 0.000196f, 0.014879f, 0.006006f, 0.001349f, 0.003317f, 0.002712f, 0.000452f, 0.001250f, 0.003135f, 0.001527f, -0.000137f, 0.000754f, 0.000339f, -0.000400f, 0.000857f, 0.002819f, 0.000587f, 0.003351f, 0.001536f, -0.002628f, 0.000451f, 0.000170f, 0.000502f, 0.002496f, 0.001310f, 0.001050f, -0.000265f, -0.000302f, -0.000379f, -0.000333f, 0.000327f, -0.000454f, 0.000758f, 0.000321f, 0.001051f, -0.000145f, -0.000328f, 0.000482f, 0.000852f, 0.000568f, -0.000142f, -0.001106f, -0.000543f, + -0.000578f, 0.001018f, 0.000849f, 0.001156f, 0.000744f, 0.000141f, 0.000255f, 0.000985f, 0.000893f, 0.000637f, 0.000193f, 0.000120f, 0.000596f, 0.000512f, 0.016606f, 0.004693f, 0.002123f, 0.002533f, 0.000481f, 0.002446f, -0.000350f, -0.001010f, 0.000002f, 0.000588f, 0.000322f, -0.000130f, 0.000531f, 0.002498f, -0.000319f, -0.001647f, -0.001060f, 0.001185f, 0.000372f, 0.001390f, 0.002339f, 0.001951f, -0.000079f, 0.001285f, -0.001394f, 0.000113f, -0.001070f, 0.001490f, 0.000937f, -0.001777f, 0.001067f, -0.000867f, 0.000179f, -0.000707f, 0.001081f, -0.000682f, 0.001341f, 0.000985f, 0.000886f, 0.001621f, 0.000599f, -0.000070f, -0.000351f, -0.000031f, 0.000280f, 0.001803f, 0.000006f, 0.000016f, 0.000186f, 0.000859f, 0.000648f, 0.000040f, -0.000172f, -0.000295f, -0.000915f, -0.000193f, 0.002348f, -0.007105f, -0.002799f, -0.001204f, -0.001549f, -0.000795f, -0.000545f, 0.000045f, 0.001072f, -0.001092f, -0.001842f, 0.001715f, -0.002226f, -0.002244f, -0.000338f, -0.000570f, 0.001057f, -0.000683f, 0.000015f, -0.002172f, -0.001196f, -0.002608f, -0.002732f, -0.003174f, -0.000369f, 0.000658f, + -0.002110f, -0.000651f, 0.000372f, 0.000167f, 0.000156f, -0.000347f, -0.002091f, -0.001406f, 0.000998f, 0.000294f, -0.000440f, 0.001971f, -0.001303f, -0.000681f, 0.000571f, 0.001182f, 0.001083f, -0.000245f, -0.000247f, 0.000423f, 0.000364f, -0.001390f, 0.000184f, -0.000845f, -0.000289f, 0.000034f, -0.000473f, 0.000005f, 0.000964f, 0.000131f, -0.000123f, 0.000159f, -0.000934f, 0.000540f, 0.000881f, -0.000242f, 0.000024f, -0.018019f, -0.005642f, -0.003423f, -0.001387f, -0.002469f, -0.001931f, -0.000598f, -0.001372f, -0.000604f, -0.001839f, -0.002537f, -0.001776f, -0.000638f, -0.003700f, -0.000914f, -0.001493f, -0.002280f, -0.000257f, 0.000365f, 0.001234f, -0.001344f, -0.001839f, -0.000711f, 0.001548f, 0.001936f, 0.002425f, 0.001266f, -0.000046f, -0.001211f, -0.000520f, -0.000009f, -0.001445f, 0.000590f, 0.001014f, 0.001232f, -0.000834f, -0.000751f, -0.000662f, -0.000357f, -0.000269f, -0.000533f, 0.000990f, -0.000302f, 0.000648f, -0.001261f, -0.002135f, -0.000923f, -0.000064f, 0.001062f, -0.001846f, 0.000600f, -0.000876f, 0.000859f, -0.000892f, 0.000506f, -0.000743f, -0.000058f, -0.000477f, -0.000069f, + 0.000334f, 0.000671f, -0.000450f, -0.000641f, -0.010335f, 0.002755f, 0.000764f, 0.000010f, 0.001809f, -0.001738f, 0.000461f, -0.003998f, -0.001304f, 0.001387f, 0.000980f, 0.002574f, -0.000194f, 0.002807f, -0.001646f, -0.000419f, 0.001338f, -0.002452f, -0.000906f, -0.001446f, 0.002732f, -0.000182f, -0.002281f, 0.001134f, 0.002175f, -0.001953f, -0.001492f, -0.001760f, 0.000495f, -0.000420f, 0.000931f, -0.000683f, -0.000568f, -0.000484f, -0.001075f, 0.001532f, -0.001260f, 0.000284f, 0.000999f, -0.000144f, 0.001156f, -0.000698f, 0.002548f, 0.000365f, -0.000274f, -0.000918f, -0.000908f, 0.000017f, -0.001043f, -0.001275f, -0.000796f, 0.000176f, 0.000858f, -0.000147f, 0.000223f, -0.001118f, -0.001112f, -0.001583f, -0.000639f, -0.000525f, -0.000428f, 0.000415f, 0.000620f, 0.008925f, 0.012845f, 0.004407f, 0.004475f, 0.006064f, 0.004422f, -0.000633f, 0.000911f, -0.000491f, 0.000861f, 0.000733f, 0.001164f, 0.000813f, 0.002240f, 0.000829f, 0.001426f, 0.000419f, 0.004381f, 0.001005f, 0.002181f, 0.001249f, 0.001177f, 0.003404f, 0.000874f, 0.004268f, 0.002277f, -0.000870f, 0.003085f, 0.000789f, + 0.001560f, 0.003013f, 0.000690f, 0.001795f, -0.000837f, -0.000312f, 0.000931f, 0.001356f, -0.001758f, 0.001576f, -0.000979f, -0.002000f, -0.001092f, 0.001659f, 0.002574f, 0.001887f, -0.000271f, 0.000612f, 0.000667f, 0.000933f, 0.001401f, 0.000754f, 0.001573f, 0.000899f, -0.001318f, -0.000039f, 0.001134f, 0.001433f, 0.000525f, 0.000466f, 0.000350f, -0.001420f, -0.000481f, -0.000878f, 0.030895f, 0.002251f, -0.001489f, 0.002405f, -0.001597f, 0.003414f, 0.001130f, 0.003589f, -0.001728f, 0.000276f, 0.000097f, 0.002130f, -0.003807f, 0.000694f, 0.002582f, -0.000595f, -0.000491f, 0.003152f, 0.005142f, -0.002170f, -0.001088f, 0.000554f, 0.002588f, -0.001175f, 0.001713f, 0.000022f, -0.001540f, -0.001418f, -0.001209f, 0.001014f, 0.001630f, 0.001716f, -0.001182f, 0.001901f, -0.001167f, 0.001846f, 0.001809f, -0.000490f, -0.001036f, 0.000603f, -0.001724f, -0.002628f, 0.000681f, -0.001811f, 0.000834f, 0.000136f, 0.000394f, 0.001056f, 0.000097f, 0.001293f, 0.000208f, -0.001793f, 0.000817f, -0.000496f, 0.000955f, -0.001318f, -0.000133f, 0.000165f, 0.001009f, -0.000733f, -0.002094f, -0.000408f, + -0.000839f, -0.010502f, -0.010212f, -0.002306f, 0.000782f, -0.000450f, -0.001551f, -0.001662f, -0.002292f, -0.000609f, 0.001674f, -0.000553f, -0.000591f, -0.002353f, 0.002459f, -0.000151f, -0.002053f, -0.001763f, 0.004272f, -0.003892f, 0.000383f, 0.002834f, -0.000356f, 0.000459f, -0.003768f, 0.001186f, -0.001629f, 0.000886f, -0.002627f, -0.001715f, 0.000405f, 0.000681f, -0.001241f, -0.001376f, 0.000106f, -0.000571f, 0.000162f, -0.001607f, -0.000927f, 0.001657f, -0.000207f, -0.000794f, -0.000498f, 0.002109f, 0.000912f, -0.001220f, -0.001870f, -0.001648f, 0.000526f, -0.000262f, -0.000804f, 0.000169f, 0.000324f, -0.000911f, 0.002492f, 0.001357f, -0.000290f, -0.000205f, -0.000682f, 0.000294f, -0.000762f, -0.000741f, -0.000785f, -0.000156f, -0.001451f, -0.001138f, -0.001939f, 0.000436f, -0.002073f, -0.000083f, -0.000543f, -0.000506f, -0.000136f, -0.004148f, -0.003490f, -0.004269f, -0.003000f, -0.002258f, -0.001435f, 0.000288f, 0.000003f, -0.001114f, -0.000379f, 0.000964f, 0.003710f, -0.003241f, 0.001651f, -0.001117f, -0.001968f, 0.002536f, -0.000173f, 0.000466f, 0.003444f, 0.000454f, 0.001478f, -0.002175f, + -0.000455f, -0.006243f, -0.000657f, 0.001131f, 0.000819f, 0.000494f, 0.000681f, 0.000831f, -0.001322f, -0.001898f, 0.001472f, -0.000203f, 0.001394f, 0.000636f, -0.001582f, 0.001311f, -0.000082f, -0.004434f, -0.003564f, -0.000645f, -0.003371f, 0.000409f, 0.001124f, -0.000270f, -0.000826f, -0.000429f, 0.000207f, -0.001045f, -0.000265f, -0.000234f, -0.000544f, 0.001029f, 0.000335f, 0.000318f, -0.000565f, -0.000479f, 0.001738f, 0.000408f, -0.001047f, 0.001137f, -0.000224f, -0.000818f, -0.001737f, 0.000014f, -0.000927f, -0.000334f, 0.001299f, 0.000979f, 0.001379f, -0.020058f, -0.004573f, 0.000297f, -0.003990f, 0.001612f, 0.000399f, 0.004813f, -0.002252f, 0.000288f, -0.001323f, 0.003227f, -0.006579f, -0.006310f, 0.002659f, -0.003057f, 0.004745f, 0.001719f, -0.003815f, -0.006683f, -0.000153f, -0.001890f, -0.003244f, -0.001328f, 0.000763f, 0.001084f, -0.001567f, 0.005724f, 0.000306f, -0.000568f, -0.002394f, 0.001950f, 0.002168f, 0.002337f, 0.002510f, -0.000310f, -0.001486f, -0.000561f, 0.001484f, -0.000115f, 0.001791f, -0.001683f, -0.000663f, -0.000578f, 0.002075f, 0.001668f, -0.001818f, 0.002361f, + -0.001315f, -0.001641f, 0.000202f, -0.000744f, -0.001562f, 0.001613f, -0.001849f, -0.000243f, 0.000470f, -0.000445f, -0.000753f, 0.000426f, 0.001548f, -0.000957f, 0.001484f, -0.001224f, 0.000996f, -0.000678f, -0.000767f, -0.000477f, 0.000299f, 0.001920f, 0.000347f, 0.001799f, -0.001141f, 0.018397f, 0.016163f, 0.003383f, 0.004321f, -0.000857f, 0.005283f, 0.004238f, 0.005322f, -0.000215f, 0.002141f, 0.001288f, -0.004987f, -0.004222f, 0.002328f, 0.000460f, -0.003568f, -0.003773f, -0.002102f, 0.000249f, 0.002156f, 0.000635f, 0.005063f, 0.004620f, 0.002036f, -0.001059f, -0.001105f, 0.003062f, 0.002876f, 0.000234f, 0.002523f, -0.000802f, 0.003222f, 0.000188f, -0.000669f, 0.004461f, 0.002341f, 0.003660f, 0.002383f, 0.000812f, 0.002588f, 0.001298f, 0.000917f, 0.002381f, -0.001271f, 0.000485f, 0.003181f, -0.000023f, -0.001998f, 0.001881f, 0.001891f, 0.001341f, -0.001393f, -0.000025f, 0.001870f, 0.002776f, -0.001349f, 0.003355f, 0.003857f, -0.000652f, -0.002031f, 0.000367f, 0.000915f, 0.000606f, 0.001715f, 0.000005f, 0.000639f, 0.001308f, -0.000890f, 0.000107f, -0.001281f, -0.000322f, + -0.001741f, -0.001006f, -0.000178f, 0.022313f, 0.001823f, -0.000633f, 0.001580f, 0.001076f, -0.003654f, 0.000957f, 0.001001f, 0.000003f, 0.002384f, 0.003411f, 0.005109f, -0.002275f, -0.002299f, -0.003605f, -0.002909f, 0.003294f, -0.000249f, 0.004756f, -0.001133f, -0.001152f, 0.001972f, 0.004133f, 0.001654f, -0.004147f, 0.003297f, -0.001209f, 0.002640f, -0.001367f, 0.002052f, -0.002496f, 0.001547f, -0.000197f, 0.002407f, 0.000295f, 0.001378f, 0.000739f, -0.004195f, -0.002310f, -0.000379f, -0.000846f, -0.000381f, -0.001307f, 0.002044f, 0.000777f, 0.004352f, -0.000666f, -0.002955f, -0.001725f, -0.000284f, 0.000265f, -0.003288f, 0.001119f, -0.001110f, -0.000142f, -0.000306f, -0.001923f, 0.001771f, 0.003364f, -0.001043f, 0.001734f, 0.000415f, -0.001880f, -0.000165f, -0.001789f, -0.001481f, 0.000306f, -0.002615f, -0.001863f, 0.001112f, -0.000129f, 0.000603f, 0.001810f, -0.002475f, 0.003013f, 0.000309f, -0.001221f, -0.002995f, 0.000875f, -0.001100f, 0.006445f, -0.001539f, -0.006152f, -0.004161f, -0.005546f, 0.005130f, -0.004097f, 0.001137f, 0.006269f, -0.000277f, -0.006358f, 0.000436f, -0.006674f, + 0.005563f, -0.001934f, 0.005545f, 0.000042f, -0.002111f, 0.004776f, 0.000179f, 0.000999f, -0.003588f, -0.004524f, -0.000728f, 0.001604f, 0.000975f, -0.000875f, -0.002091f, 0.002120f, -0.000646f, 0.001587f, 0.002425f, 0.002956f, 0.001363f, 0.001641f, -0.005973f, 0.000511f, -0.001354f, -0.002029f, 0.000819f, 0.002974f, -0.002495f, -0.004574f, -0.002026f, 0.001358f, 0.000523f, -0.004017f, -0.001643f, 0.001894f, 0.002750f, -0.002408f, -0.001577f, -0.001850f, 0.002813f, 0.003750f, 0.000755f, -0.001242f, 0.000423f, 0.002692f, -0.001283f, -0.000090f, -0.001759f, 0.001893f, -0.002201f, -0.000242f, 0.002611f, 0.001579f, -0.000761f, -0.000380f, -0.000065f, -0.000825f, -0.022514f, -0.022810f, -0.003697f, -0.011181f, -0.006940f, -0.003969f, -0.006206f, -0.000756f, 0.004680f, -0.010226f, 0.003734f, -0.002095f, 0.003406f, 0.000588f, 0.002087f, -0.004243f, 0.001075f, -0.000533f, -0.002214f, -0.009381f, -0.001914f, -0.004879f, -0.005966f, -0.000624f, 0.001505f, 0.000315f, -0.002031f, 0.001297f, -0.001928f, -0.000572f, 0.004979f, -0.000108f, -0.001661f, 0.000308f, 0.003257f, 0.004378f, 0.002933f, -0.000000f, + 0.002342f, 0.002707f, -0.000266f, 0.000024f, -0.004873f, 0.001788f, -0.004027f, 0.000752f, 0.003883f, -0.002676f, -0.004876f, 0.001407f, -0.002735f, -0.002617f, 0.000540f, -0.000041f, -0.002310f, 0.001121f, -0.000548f, 0.005253f, 0.002952f, 0.001607f, 0.000651f, 0.001926f, -0.000190f, 0.000579f, -0.002069f, -0.003727f, -0.000613f, 0.000321f, -0.002658f, -0.001847f, -0.001458f, -0.001246f, -0.001504f, 0.000832f, -0.000770f, -0.000228f, -0.001668f, -0.013345f, 0.024830f, 0.019552f, 0.001183f, 0.004006f, 0.001544f, 0.004364f, 0.006569f, 0.001547f, 0.006379f, 0.001191f, -0.006784f, 0.004528f, 0.005374f, 0.001639f, 0.001585f, 0.004079f, 0.005295f, -0.005297f, 0.004412f, -0.002780f, 0.003872f, 0.000617f, -0.003263f, 0.000657f, 0.004384f, 0.002534f, -0.005269f, 0.002567f, -0.002168f, 0.007644f, -0.000658f, 0.001804f, -0.001190f, -0.004894f, 0.004941f, 0.004948f, 0.002337f, 0.001275f, -0.000232f, 0.001791f, 0.005247f, 0.001239f, 0.003750f, 0.000487f, 0.002604f, 0.001439f, -0.000355f, 0.002859f, -0.003448f, -0.005340f, -0.002359f, -0.004070f, -0.003464f, -0.001762f, -0.003557f, 0.004791f, + 0.003395f, 0.000424f, -0.000857f, -0.001697f, -0.000563f, -0.000117f, 0.000036f, 0.000243f, 0.000665f, 0.001006f, 0.000552f, -0.000094f, -0.001262f, -0.001069f, -0.000179f, -0.000095f, -0.000458f, 0.000544f, -0.000554f, 0.002889f, -0.000648f, 0.003792f, 0.033314f, -0.013044f, -0.007067f, 0.001210f, -0.000069f, -0.001648f, -0.009243f, -0.003948f, 0.002370f, -0.000446f, -0.001316f, -0.001806f, 0.001435f, -0.007601f, -0.002161f, 0.003957f, 0.007420f, 0.004045f, 0.003337f, -0.002368f, -0.002237f, -0.004373f, 0.005124f, -0.007202f, -0.001245f, 0.001793f, -0.004736f, 0.001564f, 0.002057f, 0.005811f, -0.008860f, -0.000740f, -0.000143f, -0.001828f, 0.002372f, -0.008209f, -0.004274f, 0.009054f, 0.005969f, 0.001248f, -0.001539f, 0.005411f, -0.001569f, -0.000693f, 0.001022f, 0.004233f, 0.002449f, -0.002606f, 0.000570f, -0.001519f, 0.003478f, -0.005532f, -0.002481f, -0.003348f, -0.003514f, 0.006783f, 0.001873f, 0.000847f, -0.002979f, -0.000245f, -0.001001f, -0.001190f, -0.003124f, 0.000510f, -0.002961f, -0.000122f, 0.001038f, 0.002616f, -0.004500f, -0.003121f, -0.003976f, -0.001213f, 0.002164f, 0.000384f, + 0.002869f, -0.000379f, -0.003695f, -0.000388f, -0.001662f, 0.001730f, -0.000154f, 0.009896f, 0.022791f, 0.003742f, 0.008698f, 0.007856f, 0.007541f, 0.002518f, 0.005639f, 0.003472f, -0.001630f, -0.004625f, -0.002932f, -0.001334f, 0.006459f, -0.005511f, -0.006099f, -0.000416f, -0.000271f, -0.002495f, -0.004666f, 0.013818f, 0.012985f, 0.009770f, 0.000489f, -0.005571f, 0.000999f, 0.000930f, -0.002769f, 0.003184f, 0.002049f, 0.005579f, 0.000662f, 0.002281f, -0.000252f, -0.003832f, 0.006333f, 0.005242f, 0.003792f, -0.000900f, -0.004993f, 0.000313f, -0.000368f, -0.001393f, -0.010214f, 0.007377f, -0.004644f, 0.008507f, 0.000503f, 0.004603f, -0.000957f, 0.005075f, 0.007721f, 0.001543f, -0.003465f, -0.000255f, 0.001433f, -0.002536f, 0.001375f, -0.000983f, -0.003250f, -0.001787f, 0.001092f, -0.000792f, 0.003249f, 0.001146f, -0.005443f, 0.000349f, -0.000730f, -0.005877f, -0.001363f, 0.001200f, -0.002218f, 0.000648f, 0.005009f, 0.002052f, -0.000271f, -0.001725f, -0.001305f, 0.000108f, 0.002196f, -0.000599f, 0.002373f, -0.023931f, -0.003178f, -0.014917f, 0.000168f, 0.002625f, -0.005064f, -0.008724f, + -0.010090f, -0.009567f, -0.005664f, -0.007803f, -0.001913f, -0.000531f, -0.002016f, 0.002504f, -0.001556f, 0.000506f, 0.006124f, 0.002748f, -0.000606f, 0.014487f, -0.003181f, 0.002900f, -0.002119f, 0.001214f, 0.002103f, 0.000769f, -0.000814f, 0.002126f, 0.006785f, 0.002040f, 0.002402f, 0.000759f, 0.002714f, 0.005728f, 0.007897f, 0.002480f, 0.009582f, -0.002567f, -0.008261f, 0.008343f, -0.002646f, -0.001758f, -0.001682f, 0.004716f, 0.007321f, 0.005517f, -0.000141f, -0.001903f, -0.004189f, -0.010682f, 0.006580f, 0.007474f, 0.005291f, -0.006380f, 0.003861f, 0.000995f, -0.000642f, 0.006052f, 0.001023f, 0.004064f, -0.003381f, 0.001982f, -0.004215f, -0.000407f, 0.003657f, -0.001068f, 0.002751f, -0.000582f, -0.001539f, -0.001506f, -0.005134f, 0.000517f, 0.000385f, -0.000044f, 0.000988f, -0.001140f, -0.006333f, 0.000480f, 0.000332f, -0.041877f, -0.018801f, 0.008526f, -0.001637f, -0.001434f, 0.001485f, -0.005246f, -0.004612f, -0.001577f, -0.002086f, -0.007335f, 0.005169f, 0.000564f, 0.010938f, -0.006122f, -0.005265f, -0.008957f, -0.005021f, -0.009225f, 0.000740f, 0.003368f, -0.013779f, 0.008870f, + 0.007627f, -0.001103f, 0.001510f, 0.005775f, 0.000842f, 0.005080f, -0.010447f, -0.010510f, -0.005841f, -0.006898f, -0.005318f, 0.017000f, 0.005530f, -0.003761f, -0.006124f, -0.008727f, 0.004113f, 0.002325f, -0.004153f, 0.003381f, 0.003336f, -0.006161f, 0.000555f, 0.001356f, 0.004818f, -0.005724f, 0.013990f, -0.006156f, -0.004919f, 0.002169f, -0.001535f, -0.000096f, -0.004246f, -0.001612f, 0.000409f, 0.008883f, -0.002794f, 0.012809f, 0.002706f, 0.000815f, 0.001402f, 0.003405f, -0.003882f, -0.001407f, -0.005095f, -0.004115f, -0.003913f, -0.000040f, 0.006879f, -0.004527f, -0.003344f, -0.001929f, -0.002619f, -0.002431f, -0.000332f, -0.001616f, -0.002422f, -0.002121f, 0.006582f, 0.021207f, 0.010855f, 0.006791f, 0.004559f, -0.007416f, 0.000723f, -0.005993f, 0.009385f, -0.000988f, -0.001281f, 0.003235f, 0.002044f, 0.002221f, -0.000310f, 0.003351f, 0.001171f, 0.003536f, -0.002919f, 0.009234f, 0.001216f, -0.000805f, 0.027568f, 0.001536f, -0.002132f, -0.007032f, 0.004084f, -0.006539f, 0.006135f, 0.014895f, -0.001189f, 0.003670f, 0.003641f, -0.007623f, -0.008582f, 0.000284f, 0.000159f, 0.006558f, + -0.004256f, 0.000263f, -0.000474f, 0.004837f, 0.004934f, 0.008304f, 0.003091f, 0.002896f, 0.003408f, 0.000373f, 0.005439f, 0.002568f, -0.010074f, 0.002175f, -0.005204f, -0.012884f, -0.001137f, 0.003653f, 0.000047f, 0.001102f, -0.001735f, 0.000272f, -0.000435f, -0.000045f, 0.001605f, 0.000306f, 0.005860f, -0.003500f, -0.000568f, 0.001169f, 0.001216f, 0.000194f, -0.002278f, 0.004090f, 0.006891f, 0.006795f, 0.001402f, -0.001408f, -0.000712f, 0.002436f, -0.000339f, -0.000824f, -0.000157f, 0.001360f, 0.003175f, -0.000531f, -0.001247f, -0.002255f, -0.001427f, 0.031032f, -0.009047f, -0.003429f, -0.008416f, 0.015617f, 0.005746f, 0.001287f, 0.003162f, -0.002285f, -0.003653f, 0.005494f, 0.000502f, -0.005423f, 0.001395f, -0.007151f, -0.005417f, 0.000350f, -0.007249f, 0.000980f, 0.002356f, -0.005355f, -0.009419f, 0.000892f, 0.000498f, 0.006367f, 0.010454f, 0.007288f, -0.004914f, -0.000080f, 0.006489f, 0.011864f, -0.012436f, 0.004686f, -0.002341f, -0.000209f, -0.005679f, -0.007975f, 0.000671f, 0.007151f, 0.002093f, 0.003199f, 0.004512f, -0.000501f, 0.003011f, -0.000722f, 0.002151f, 0.004586f, + -0.008304f, -0.005818f, 0.012885f, -0.001033f, -0.000409f, -0.002927f, 0.005141f, 0.016682f, 0.004169f, 0.002507f, 0.005405f, -0.004403f, -0.004971f, -0.000007f, -0.003713f, -0.009574f, 0.006147f, 0.000780f, -0.004778f, 0.002616f, 0.001425f, -0.002720f, -0.004501f, 0.006075f, -0.002105f, -0.007275f, 0.003388f, 0.003357f, 0.005128f, -0.005074f, 0.000461f, 0.002206f, -0.000897f, -0.001945f, 0.007691f, -0.000630f, 0.001410f, -0.003434f, -0.000457f, -0.000107f, 0.026496f, 0.025105f, -0.008171f, 0.006850f, 0.002069f, 0.005323f, 0.013470f, -0.001656f, -0.007029f, -0.002461f, 0.026019f, -0.014616f, -0.002777f, -0.007240f, -0.005803f, -0.011841f, 0.013016f, -0.003746f, -0.017680f, -0.013172f, -0.016130f, -0.006179f, 0.014300f, -0.001686f, 0.006756f, -0.002511f, -0.007290f, 0.006388f, 0.001894f, 0.008086f, -0.007760f, 0.007198f, 0.005722f, 0.002966f, 0.003333f, -0.012685f, 0.003682f, -0.010584f, 0.008996f, 0.019013f, 0.005521f, 0.005737f, -0.012056f, 0.017030f, 0.004570f, -0.001733f, -0.002610f, -0.003413f, 0.005347f, 0.008535f, 0.002089f, -0.001941f, -0.000473f, 0.002337f, -0.004088f, -0.002901f, + -0.003933f, -0.003019f, -0.000302f, 0.006261f, -0.004148f, 0.009339f, 0.003367f, 0.005728f, -0.001914f, -0.013303f, -0.008927f, 0.003433f, 0.000922f, -0.003948f, 0.004990f, -0.000218f, -0.000445f, 0.002713f, -0.001864f, 0.003934f, -0.000655f, -0.000427f, 0.001909f, -0.002282f, -0.000397f, -0.002471f, -0.001502f, -0.003108f, 0.002052f, 0.000178f, 0.000664f, -0.024932f, -0.014862f, 0.003570f, 0.001949f, -0.000149f, -0.010969f, 0.006484f, 0.003657f, -0.006627f, -0.017944f, 0.014609f, 0.003571f, 0.005411f, 0.008259f, 0.004852f, -0.002376f, 0.002644f, -0.004543f, 0.012122f, -0.010145f, -0.017551f, -0.000600f, -0.000919f, -0.008326f, -0.019076f, 0.000575f, -0.003966f, -0.010022f, -0.005574f, -0.003153f, 0.004194f, 0.000696f, 0.006923f, 0.013978f, -0.006024f, -0.011587f, 0.003569f, -0.001375f, 0.000062f, 0.005714f, -0.008280f, -0.007507f, -0.001094f, 0.006745f, -0.008952f, 0.007364f, -0.002634f, 0.014216f, -0.002110f, -0.004473f, -0.001754f, 0.000065f, 0.002770f, -0.016287f, 0.002273f, -0.014094f, 0.014328f, 0.000049f, 0.008963f, 0.005375f, -0.005594f, -0.000727f, -0.007390f, 0.003572f, -0.000874f, + 0.002833f, 0.002616f, -0.009702f, -0.001555f, -0.009359f, -0.004209f, 0.004164f, -0.002921f, -0.005744f, 0.002663f, -0.000088f, -0.009771f, -0.004782f, 0.000952f, 0.000332f, -0.004081f, 0.004230f, -0.002252f, -0.002484f, 0.001984f, -0.005825f, 0.002966f, -0.034515f, -0.015936f, -0.005796f, -0.003888f, -0.001051f, 0.003588f, -0.011998f, -0.008662f, 0.003198f, -0.010117f, 0.003194f, -0.011234f, -0.003483f, -0.010864f, -0.013057f, 0.013795f, 0.005757f, 0.002041f, -0.000809f, -0.011458f, -0.019333f, 0.009618f, -0.025361f, 0.009165f, 0.000399f, -0.008176f, 0.001358f, -0.005088f, 0.001964f, 0.017639f, -0.008878f, -0.000989f, -0.019052f, 0.014956f, -0.004410f, 0.006784f, -0.006698f, -0.002289f, -0.001533f, -0.000766f, 0.008899f, 0.003007f, 0.018515f, 0.022183f, -0.002316f, 0.000278f, -0.007336f, 0.000772f, -0.002848f, 0.003420f, 0.007102f, 0.000827f, 0.016107f, 0.004506f, -0.005965f, 0.002520f, 0.003355f, 0.000044f, -0.001116f, 0.000453f, 0.012250f, -0.009177f, -0.018384f, -0.007607f, 0.000292f, 0.004291f, 0.003216f, 0.009201f, -0.000912f, 0.003901f, -0.004645f, -0.007454f, -0.010234f, -0.008245f, + 0.000714f, -0.002679f, 0.005016f, 0.001273f, -0.002807f, -0.001342f, 0.008839f, -0.000196f, 0.004917f, -0.002170f, 0.001695f, -0.002200f, -0.002013f, -0.003383f, 0.044002f, 0.019643f, 0.013575f, 0.005631f, -0.005010f, -0.008003f, -0.013734f, 0.007615f, 0.013165f, 0.005438f, -0.006163f, 0.015536f, 0.008747f, 0.015532f, 0.001055f, -0.011242f, -0.004363f, 0.023323f, -0.024351f, -0.005007f, 0.016100f, -0.009543f, -0.005351f, 0.037667f, -0.004727f, 0.010764f, 0.034156f, -0.005486f, -0.002248f, -0.001003f, 0.004244f, -0.001899f, 0.014808f, 0.009520f, 0.012205f, -0.008646f, -0.020179f, 0.008059f, -0.007963f, 0.009687f, -0.003783f, 0.003513f, 0.014380f, 0.008325f, 0.000841f, 0.006320f, 0.002914f, 0.006085f, 0.013902f, 0.007831f, -0.001485f, 0.013511f, 0.005665f, 0.001921f, 0.003213f, 0.024892f, 0.014934f, 0.000023f, 0.013566f, -0.005993f, 0.017151f, -0.004281f, 0.003780f, -0.004878f, 0.002052f, 0.009822f, -0.005455f, -0.000400f, -0.000975f, 0.003405f, 0.000379f, -0.006447f, 0.000257f, -0.005523f, -0.009860f, 0.001645f, -0.013126f, 0.005096f, 0.008048f, -0.003301f, -0.005621f, -0.003782f, + 0.007050f, 0.002079f, 0.000377f, -0.002955f, 0.056788f, 0.025665f, -0.011502f, 0.004963f, 0.029342f, 0.000692f, 0.021190f, -0.006225f, 0.008382f, 0.017666f, -0.013309f, 0.001610f, 0.030825f, 0.027690f, 0.022538f, 0.007964f, 0.019357f, 0.003261f, 0.016969f, 0.005922f, 0.005135f, -0.010608f, -0.012457f, -0.017716f, -0.035105f, 0.011191f, 0.000416f, -0.009529f, -0.003359f, 0.012148f, -0.007979f, -0.001206f, 0.001371f, 0.006831f, -0.031106f, -0.005031f, 0.022573f, 0.017382f, -0.006281f, 0.011485f, 0.009808f, 0.006362f, -0.003813f, -0.007229f, -0.003140f, -0.004863f, -0.003150f, -0.011489f, -0.009763f, 0.007967f, -0.019381f, 0.006417f, 0.015902f, -0.004714f, -0.011345f, -0.017676f, 0.016584f, -0.000517f, -0.008376f, -0.005473f, -0.003824f, -0.006065f, 0.003493f, -0.002800f, -0.006165f, 0.006301f, 0.025815f, -0.012900f, -0.007759f, 0.003299f, -0.005016f, 0.005961f, 0.000237f, 0.013313f, 0.002572f, -0.001293f, -0.001116f, -0.013824f, -0.006526f, -0.002147f, 0.001178f, 0.001069f, 0.004948f, 0.003059f, 0.000576f, 0.002224f, 0.002572f, 0.008157f, 0.000674f, 0.000226f, -0.005296f, 0.002676f, + 0.003941f, 0.001634f, -0.022438f, -0.006261f, -0.026972f, -0.005867f, -0.026956f, 0.012954f, -0.025684f, 0.013814f, -0.004461f, -0.014870f, -0.004509f, -0.006963f, 0.031396f, 0.004869f, -0.022895f, 0.000437f, -0.014957f, -0.011784f, 0.015458f, -0.017467f, -0.016166f, -0.018231f, 0.027381f, -0.003692f, 0.018070f, -0.027879f, -0.014881f, 0.011089f, -0.013011f, 0.010576f, 0.030309f, 0.019919f, 0.018748f, 0.003213f, -0.003238f, -0.014725f, -0.020954f, -0.001122f, 0.004639f, -0.019400f, 0.000407f, -0.011434f, 0.005596f, 0.008565f, -0.022212f, -0.018853f, -0.034798f, -0.005441f, 0.002379f, -0.014955f, -0.021525f, 0.021194f, 0.001070f, 0.021769f, 0.021350f, -0.002628f, -0.003031f, -0.008680f, 0.012313f, 0.010672f, 0.001530f, 0.005273f, -0.001758f, -0.001096f, 0.010413f, -0.002753f, -0.012215f, -0.009380f, -0.015377f, -0.012909f, -0.004782f, -0.000600f, -0.002120f, -0.019429f, -0.011274f, 0.006324f, 0.001464f, -0.006914f, 0.008354f, -0.001707f, 0.000424f, 0.013134f, 0.010847f, 0.006986f, 0.002764f, 0.008408f, 0.001240f, 0.000219f, 0.003890f, 0.002762f, -0.001856f, 0.000798f, -0.038326f, -0.006605f, + 0.003372f, -0.003536f, 0.000053f, 0.010376f, -0.008491f, 0.009227f, 0.008731f, -0.006050f, 0.011820f, -0.016429f, 0.020590f, 0.014126f, 0.000701f, -0.015133f, 0.001215f, 0.010051f, -0.044783f, 0.009290f, 0.018257f, -0.032069f, 0.013194f, -0.016419f, -0.023530f, -0.021444f, 0.010889f, -0.005361f, -0.033438f, 0.017969f, 0.009610f, -0.020243f, -0.033831f, 0.006845f, 0.003985f, -0.010651f, -0.002465f, -0.017383f, 0.016336f, 0.013495f, 0.023771f, -0.019031f, 0.003094f, -0.025276f, -0.009567f, 0.004360f, -0.016175f, 0.006723f, -0.002012f, -0.012690f, -0.019083f, -0.020621f, 0.030153f, -0.020330f, -0.009619f, -0.007652f, 0.001259f, 0.013854f, 0.008210f, 0.010105f, 0.000098f, 0.011824f, -0.003985f, 0.001891f, -0.005024f, -0.012502f, 0.002460f, 0.026775f, 0.004148f, 0.000616f, -0.000110f, -0.017249f, 0.011215f, 0.018014f, 0.018794f, 0.003757f, 0.001394f, -0.000823f, -0.001508f, 0.002718f, 0.000363f, -0.008582f, -0.000195f, 0.001726f, 0.001255f, 0.000128f, 0.000169f, 0.006648f, -0.002312f, 0.000849f, -0.001685f, 0.000351f, 0.011585f, -0.025449f, -0.013522f, -0.026874f, 0.007652f, -0.004773f, + 0.010668f, -0.007323f, 0.005055f, 0.008798f, -0.008997f, -0.015345f, 0.022898f, -0.006008f, -0.010209f, 0.026603f, -0.005478f, -0.006200f, 0.030405f, -0.017591f, 0.004474f, 0.007443f, 0.002369f, -0.026814f, 0.000086f, -0.003913f, -0.016121f, 0.009215f, -0.012665f, 0.017058f, -0.003008f, 0.018987f, -0.020783f, 0.012918f, -0.036796f, 0.000406f, -0.020079f, 0.022401f, -0.003458f, 0.003061f, -0.003864f, -0.020420f, -0.001490f, 0.017789f, 0.046946f, 0.003464f, 0.002944f, 0.009975f, 0.016039f, -0.002726f, -0.004532f, 0.001465f, -0.000816f, 0.041290f, -0.003754f, 0.006358f, 0.016569f, -0.016096f, -0.027521f, 0.000083f, -0.029086f, -0.003573f, -0.014941f, -0.010711f, -0.005850f, -0.012280f, 0.006889f, 0.010227f, -0.016950f, 0.021366f, 0.017737f, -0.002547f, -0.004418f, -0.017470f, 0.012175f, 0.004319f, 0.011547f, -0.009799f, 0.004760f, -0.001914f, 0.008726f, 0.000995f, 0.008442f, -0.004319f, 0.006183f, -0.001063f, 0.000126f, 0.002052f, 0.009575f, 0.004585f, 0.002913f, -0.003177f, 0.000215f, 0.000863f, 0.044242f, 0.048216f, 0.000336f, -0.014794f, -0.011897f, 0.040382f, -0.026570f, -0.030269f, + 0.031458f, -0.028595f, 0.018366f, 0.005588f, 0.025444f, 0.023474f, 0.015827f, 0.002536f, -0.016093f, -0.013878f, 0.033029f, -0.014058f, -0.001464f, 0.008051f, 0.028131f, 0.040762f, -0.001287f, 0.027841f, -0.022859f, -0.023842f, 0.002646f, -0.008821f, 0.013114f, 0.008322f, -0.020389f, 0.002753f, 0.012887f, 0.033517f, 0.011396f, 0.013723f, 0.012570f, 0.014979f, 0.003823f, -0.001202f, 0.021244f, 0.003721f, 0.016982f, 0.027236f, 0.005652f, -0.011237f, -0.009558f, 0.024547f, 0.006403f, 0.050382f, 0.011733f, 0.019842f, -0.020594f, -0.032353f, -0.003144f, -0.037770f, -0.024221f, -0.008633f, -0.012941f, 0.001391f, -0.001955f, 0.000276f, 0.000488f, -0.028253f, -0.023404f, -0.012371f, -0.024166f, 0.008796f, 0.009562f, -0.007331f, -0.001898f, -0.022425f, -0.003544f, 0.006580f, -0.006407f, -0.001948f, 0.002266f, -0.014163f, 0.005888f, -0.004370f, 0.001670f, 0.002484f, 0.000065f, 0.000944f, 0.003053f, -0.003401f, 0.000513f, 0.003267f, -0.000142f, 0.000763f, 0.000945f, -0.021037f, -0.074026f, -0.030548f, -0.060417f, -0.013550f, -0.021133f, -0.008534f, 0.005490f, -0.019809f, -0.024006f, -0.038365f, + -0.030519f, 0.027258f, -0.004872f, -0.024412f, -0.025958f, 0.005865f, -0.034537f, -0.048705f, 0.008013f, -0.011347f, -0.010463f, -0.010480f, 0.009340f, -0.029039f, 0.030517f, -0.017776f, 0.020717f, -0.014466f, -0.013902f, 0.000316f, 0.016725f, -0.023690f, -0.022640f, 0.012110f, -0.004311f, 0.033404f, -0.014684f, 0.019133f, 0.028780f, 0.013672f, -0.010535f, -0.004820f, -0.003049f, 0.023610f, -0.008334f, 0.015840f, 0.031862f, -0.026837f, -0.046802f, -0.018449f, 0.015820f, 0.019420f, -0.022107f, 0.036264f, -0.011732f, -0.013165f, -0.004432f, -0.004019f, -0.011290f, -0.029439f, -0.012475f, -0.030418f, -0.029136f, -0.018067f, 0.021415f, 0.005020f, -0.005215f, 0.001915f, 0.033137f, 0.031128f, 0.002152f, -0.014470f, 0.005893f, -0.003315f, 0.013612f, 0.004239f, -0.006009f, -0.013786f, -0.001289f, -0.002803f, -0.021865f, -0.005694f, 0.008246f, 0.022588f, -0.010185f, -0.000025f, 0.008581f, -0.012767f, -0.000458f, -0.000932f, 0.000324f, -0.006676f, 0.008426f, 0.000455f, 0.002150f, -0.001106f} +}; + +/* Sample Rate = 16000 */ + +const int16_t CRendBin_Combined_BRIR_max_num_iterations_16kHz = 23; +const uint16_t CRendBin_Combined_BRIR_num_iterations_16kHz[15][BINAURAL_CHANNELS]={{23, 23}, {23, 23}, {23, 23}, {23, 23}, {23, 23}, {23, 23}, {23, 23}, {23, 23}, {23, 23}, {23, 23}, {23, 23}, {23, 23}, {23, 23}, {23, 23}, {23, 23} }; +const uint16_t CRendBin_Combined_BRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS] = {40, 40}; +const uint16_t CRendBin_Combined_BRIR_pIndex_frequency_max_16kHz[15][BINAURAL_CHANNELS][23]={{{77, 76, 77, 77, 77, 76, 77, 76, 77, 76, 77, 77, 77, 78, 76, 76, 77, 77, 77, 77, 77, 76, 80},{77, 76, 77, 77, 77, 76, 77, 76, 77, 76, 77, 77, 77, 78, 76, 76, 77, 77, 77, 77, 77, 76, 80}},{{76, 77, 77, 75, 77, 78, 77, 76, 77, 77, 76, 77, 77, 77, 77, 77, 76, 77, 76, 76, 77, 78, 80},{76, 77, 77, 75, 77, 78, 77, 76, 77, 77, 76, 77, 77, 77, 77, 77, 76, 77, 76, 76, 77, 78, 80}},{{77, 76, 76, 78, 75, 76, 74, 78, 77, 76, 77, 77, 77, 76, 76, 77, 78, 78, 77, 77, 77, 77, 80},{77, 76, 76, 78, 75, 76, 74, 78, 77, 76, 77, 77, 77, 76, 76, 77, 78, 78, 77, 77, 77, 77, 80}},{{76, 76, 76, 76, 77, 77, 76, 78, 77, 77, 77, 77, 78, 78, 77, 77, 77, 77, 77, 78, 77, 78, 80},{76, 76, 76, 76, 77, 77, 76, 78, 77, 77, 77, 77, 78, 78, 77, 77, 77, 77, 77, 78, 77, 78, 80}},{{76, 77, 77, 76, 77, 77, 75, 77, 77, 77, 76, 77, 77, 77, 77, 78, 77, 77, 77, 77, 76, 76, 80},{76, 77, 77, 76, 77, 77, 75, 77, 77, 77, 76, 77, 77, 77, 77, 78, 77, 77, 77, 77, 76, 76, 80}},{{77, 76, 77, 77, 77, 77, 77, 77, 76, 78, 76, 78, 75, 76, 77, 77, 76, 76, 77, 78, 78, 77, 80},{77, 76, 77, 77, 77, 77, 77, 77, 76, 78, 76, 78, 75, 76, 77, 77, 76, 76, 77, 78, 78, 77, 80}},{{77, 77, 75, 76, 76, 77, 77, 77, 77, 77, 77, 75, 77, 76, 76, 76, 77, 77, 76, 77, 76, 77, 80},{77, 77, 75, 76, 76, 77, 77, 77, 77, 77, 77, 75, 77, 76, 76, 76, 77, 77, 76, 77, 76, 77, 80}},{{75, 76, 77, 77, 75, 77, 75, 76, 76, 77, 77, 77, 78, 78, 77, 77, 76, 77, 78, 78, 78, 76, 80},{75, 76, 77, 77, 75, 77, 75, 76, 76, 77, 77, 77, 78, 78, 77, 77, 76, 77, 78, 78, 78, 76, 80}},{{77, 77, 77, 76, 77, 77, 76, 76, 76, 77, 77, 75, 76, 78, 78, 77, 77, 78, 78, 77, 76, 76, 80},{77, 77, 77, 76, 77, 77, 76, 76, 76, 77, 77, 75, 76, 78, 78, 77, 77, 78, 78, 77, 76, 76, 80}},{{76, 75, 76, 76, 77, 77, 77, 77, 77, 77, 74, 78, 77, 78, 78, 77, 76, 77, 77, 77, 77, 76, 80},{76, 75, 76, 76, 77, 77, 77, 77, 77, 77, 74, 78, 77, 78, 78, 77, 76, 77, 77, 77, 77, 76, 80}},{{76, 76, 77, 76, 77, 77, 76, 76, 76, 76, 77, 77, 76, 76, 77, 75, 77, 76, 76, 76, 77, 77, 80},{76, 76, 77, 76, 77, 77, 76, 76, 76, 76, 77, 77, 76, 76, 77, 75, 77, 76, 76, 76, 77, 77, 80}},{{76, 76, 77, 75, 78, 77, 77, 77, 77, 77, 77, 77, 77, 76, 78, 77, 76, 78, 76, 77, 76, 77, 80},{76, 76, 77, 75, 78, 77, 77, 77, 77, 77, 77, 77, 77, 76, 78, 77, 76, 78, 76, 77, 76, 77, 80}},{{76, 77, 77, 76, 76, 77, 77, 75, 77, 77, 77, 77, 77, 77, 78, 78, 78, 78, 77, 76, 76, 78, 80},{76, 77, 77, 76, 76, 77, 77, 75, 77, 77, 77, 77, 77, 77, 78, 78, 78, 78, 77, 76, 76, 78, 80}},{{74, 76, 74, 76, 75, 76, 76, 76, 76, 77, 77, 78, 77, 78, 75, 76, 77, 76, 78, 76, 78, 77, 80},{74, 76, 74, 76, 75, 76, 76, 76, 76, 77, 77, 78, 77, 78, 75, 76, 77, 76, 78, 76, 78, 77, 80}},{{76, 77, 77, 77, 76, 78, 77, 76, 75, 77, 77, 77, 76, 78, 77, 78, 78, 78, 77, 76, 77, 75, 80},{76, 77, 77, 77, 76, 78, 77, 76, 75, 77, 77, 77, 76, 78, 77, 78, 78, 78, 77, 76, 77, 75, 80}}}; +const uint16_t CRendBin_Combined_BRIR_index_frequency_max_diffuse_16kHz = 77; +const float CRendBin_Combined_BRIR_inv_diffuse_weight_16kHz[15]={0.223532f, 0.226827f, 0.248830f, 0.208782f, 0.220391f, 0.219790f, 0.231187f, 0.248730f, 0.251408f, 0.263698f, 0.243858f, 0.281483f, 0.283080f, 0.261660f, 0.273527f}; +const uint16_t CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS][40]={{46, 46, 46, 46, 46, 46, 46, 49, 49, 53, 53, 53, 55, 55, 61, 61, 61, 65, 67, 67, 67, 67, 67, 67, 69, 72, 72, 72, 73, 73, 75, 75, 75, 75, 75, 75, 75, 75, 75, 77},{46, 46, 46, 46, 46, 46, 46, 49, 49, 53, 53, 53, 55, 55, 61, 61, 61, 65, 67, 67, 67, 67, 67, 67, 69, 72, 72, 72, 73, 73, 75, 75, 75, 75, 75, 75, 75, 75, 75, 77}}; +const float CRendBin_Combined_BRIR_coeff_re_16kHz[15][BINAURAL_CHANNELS][1774]={ + { + {0.010832f, 0.002712f, -0.004173f, 0.000188f, -0.002118f, 0.002726f, 0.010885f, -0.000914f, -0.007116f, -0.010756f, 0.001174f, -0.008083f, -0.002332f, -0.002440f, 0.001864f, 0.005777f, -0.008313f, -0.004040f, -0.002553f, 0.000455f, -0.004910f, -0.008631f, -0.003371f, -0.007258f, -0.003869f, 0.001568f, -0.000354f, -0.003350f, -0.000643f, -0.000920f, 0.000933f, -0.007724f, -0.001925f, 0.003126f, 0.006652f, 0.003422f, -0.000986f, -0.000941f, 0.000320f, -0.007324f, -0.004978f, 0.001622f, 0.000486f, 0.001950f, -0.001956f, 0.001611f, -0.001588f, 0.002919f, -0.001525f, 0.005462f, 0.005550f, -0.000510f, -0.000125f, 0.004259f, 0.001657f, -0.000296f, 0.000411f, -0.008943f, -0.005621f, -0.001358f, 0.003347f, -0.003679f, -0.007892f, -0.004968f, -0.003761f, -0.005550f, 0.003359f, -0.010204f, 0.003130f, 0.010428f, -0.005504f, -0.002617f, -0.005058f, 0.005816f, -0.002310f, -0.006421f, 0.001701f, -0.009205f, 0.009235f, -0.003556f, -0.000119f, 0.008653f, -0.005126f, 0.003328f, -0.000784f, 0.001148f, -0.006096f, -0.012503f, -0.002727f, 0.004827f, -0.003367f, 0.002923f, 0.004129f, 0.003619f, -0.002924f, 0.002040f, + -0.007896f, -0.001437f, 0.001716f, 0.003166f, -0.000481f, -0.000184f, 0.000726f, 0.001899f, -0.006684f, -0.005343f, 0.002006f, 0.004474f, -0.002488f, 0.004692f, 0.008633f, -0.011933f, 0.001419f, -0.005681f, -0.004175f, 0.002728f, -0.001795f, 0.007420f, -0.002599f, 0.006700f, 0.003149f, 0.001171f, -0.000820f, 0.003639f, -0.000148f, -0.000614f, -0.004107f, 0.010858f, -0.007844f, -0.002127f, 0.003367f, 0.004316f, -0.000613f, -0.003470f, 0.001619f, -0.003841f, 0.003699f, 0.000990f, 0.001028f, 0.000119f, -0.001937f, -0.001107f, 0.005025f, -0.014096f, 0.002796f, -0.001594f, -0.008915f, -0.001143f, 0.006375f, 0.003674f, 0.003685f, -0.005967f, 0.004348f, -0.017398f, 0.012247f, -0.006959f, 0.002170f, 0.001696f, -0.000326f, -0.004296f, -0.001011f, -0.010096f, -0.012397f, 0.002466f, -0.002965f, 0.002920f, 0.002952f, 0.009792f, -0.009331f, 0.000528f, 0.006426f, 0.006200f, -0.007716f, -0.008181f, -0.004684f, -0.007203f, -0.000139f, -0.002904f, -0.005772f, -0.004621f, -0.000715f, -0.012553f, -0.012018f, -0.003134f, 0.001492f, -0.001782f, 0.000175f, -0.002117f, 0.001792f, -0.006976f, 0.006378f, -0.003308f, + 0.003281f, -0.001682f, 0.002072f, -0.006462f, 0.001097f, 0.003108f, 0.003892f, 0.001219f, 0.000047f, 0.000846f, -0.002910f, -0.005557f, 0.008629f, 0.006321f, 0.002087f, -0.004483f, 0.010858f, 0.007065f, -0.004372f, 0.006554f, -0.001654f, -0.006902f, -0.002551f, -0.003185f, -0.006420f, 0.002309f, 0.002701f, 0.000716f, -0.005367f, 0.007097f, -0.006979f, 0.003533f, 0.005444f, -0.002855f, -0.001149f, -0.012072f, -0.006967f, -0.012810f, 0.000373f, 0.013930f, 0.006364f, -0.005457f, 0.002356f, 0.001740f, 0.022282f, -0.006678f, 0.006376f, 0.010766f, -0.002109f, 0.009775f, 0.004036f, 0.006602f, -0.008821f, -0.003416f, -0.010329f, -0.004943f, 0.007003f, -0.000369f, -0.004885f, 0.000999f, -0.007208f, -0.000763f, -0.004694f, 0.006419f, -0.002843f, -0.001138f, -0.002545f, 0.003282f, 0.001633f, -0.000181f, -0.000758f, 0.002617f, -0.010802f, -0.008698f, 0.003861f, 0.000684f, -0.000940f, -0.005866f, 0.013113f, 0.003368f, -0.001536f, 0.003907f, 0.005289f, -0.000400f, 0.002701f, 0.000783f, -0.006251f, 0.005351f, -0.007462f, -0.006276f, 0.007039f, -0.008686f, 0.007235f, 0.002582f, -0.005949f, 0.009969f, + 0.005940f, 0.003404f, -0.002649f, 0.008874f, 0.002490f, -0.002092f, -0.002517f, 0.002066f, 0.001412f, -0.002624f, -0.011000f, -0.002703f, -0.001859f, 0.002238f, -0.006249f, 0.007523f, -0.002645f, 0.005501f, -0.006974f, 0.023049f, -0.019580f, -0.017219f, -0.005712f, 0.017590f, -0.002731f, -0.009912f, 0.011974f, -0.008383f, 0.005533f, -0.000691f, -0.013528f, -0.009286f, 0.010980f, -0.007505f, 0.005328f, -0.007819f, 0.007186f, -0.003536f, -0.002271f, -0.001078f, -0.007540f, 0.003641f, 0.005163f, -0.007590f, 0.001608f, -0.003963f, 0.001329f, 0.003155f, -0.001259f, 0.004622f, 0.001285f, 0.003752f, 0.006089f, -0.008217f, -0.006060f, 0.007073f, 0.000228f, 0.005463f, 0.005361f, -0.005250f, -0.007705f, -0.003161f, 0.001206f, 0.009856f, -0.010873f, 0.004344f, -0.012115f, -0.014761f, -0.003509f, -0.008459f, -0.001442f, -0.009986f, -0.018927f, -0.010037f, 0.008784f, 0.008212f, 0.005353f, -0.006252f, 0.018162f, -0.005484f, 0.003142f, -0.009875f, -0.009321f, 0.002682f, 0.000158f, -0.000653f, -0.011718f, -0.003536f, -0.000435f, -0.001927f, -0.002016f, -0.005759f, -0.004816f, 0.002262f, -0.001272f, -0.002112f, + 0.030034f, -0.009616f, 0.014166f, -0.003566f, 0.018986f, -0.003499f, -0.002673f, 0.003299f, 0.004034f, -0.003062f, -0.021320f, 0.002226f, -0.001811f, -0.005658f, -0.000042f, -0.000963f, 0.007982f, -0.002411f, 0.018689f, -0.002392f, 0.002417f, -0.001298f, 0.010755f, -0.002043f, 0.003971f, -0.008608f, 0.000079f, -0.005939f, -0.005728f, -0.001818f, -0.001331f, -0.000004f, 0.007140f, -0.011894f, -0.003000f, 0.003876f, -0.000848f, 0.008005f, 0.002412f, -0.002244f, -0.004846f, -0.005583f, -0.005149f, -0.011022f, 0.004697f, 0.004302f, 0.004704f, -0.019102f, -0.002050f, 0.012933f, 0.008212f, -0.003391f, 0.000219f, -0.006245f, -0.012042f, -0.014161f, 0.014590f, -0.004743f, -0.008166f, -0.005708f, 0.008511f, 0.005259f, 0.001866f, 0.005898f, 0.004047f, 0.005589f, -0.001722f, -0.014348f, -0.002965f, -0.007106f, -0.005026f, 0.008648f, 0.008631f, -0.002555f, 0.013476f, 0.014636f, -0.045502f, 0.023720f, 0.008101f, -0.002889f, -0.002831f, -0.000703f, -0.007649f, -0.013262f, -0.003554f, 0.005270f, 0.018054f, 0.011900f, -0.018092f, -0.004089f, -0.011114f, 0.006221f, -0.001738f, -0.024063f, -0.007733f, 0.013514f, + 0.007962f, 0.004121f, 0.011249f, 0.006584f, -0.002106f, -0.002277f, 0.002710f, -0.009597f, -0.006106f, 0.001318f, 0.009698f, -0.005162f, -0.009758f, -0.013563f, -0.007348f, 0.005741f, 0.019950f, 0.000778f, -0.004513f, 0.003761f, -0.005155f, -0.016071f, 0.000288f, -0.011513f, -0.009434f, -0.010765f, 0.005480f, -0.001194f, -0.015326f, 0.002154f, 0.004634f, 0.005138f, -0.016503f, -0.009179f, -0.006671f, -0.004345f, -0.002540f, -0.006205f, -0.003625f, -0.007851f, -0.016014f, -0.002087f, -0.013713f, -0.015742f, -0.010396f, -0.002903f, 0.001893f, -0.009284f, -0.014380f, 0.004087f, 0.010178f, -0.000331f, -0.002746f, -0.000827f, 0.007192f, -0.011101f, 0.007947f, -0.019134f, 0.006288f, -0.009773f, -0.002283f, 0.001800f, 0.004724f, -0.001352f, 0.008800f, -0.000330f, -0.002700f, -0.026457f, 0.011212f, -0.005334f, -0.006331f, 0.008805f, -0.015871f, -0.021124f, 0.007554f, -0.007682f, -0.010585f, -0.003478f, 0.017721f, 0.011332f, -0.007778f, -0.004394f, 0.007694f, -0.002926f, -0.001941f, 0.002196f, 0.007429f, 0.015254f, 0.008825f, 0.012316f, -0.003030f, -0.000773f, -0.000828f, -0.008484f, 0.000948f, -0.003657f, + 0.019956f, -0.016311f, -0.010617f, -0.008655f, -0.009294f, 0.005029f, 0.001543f, 0.007557f, -0.002633f, -0.010671f, -0.015735f, -0.004082f, -0.019297f, -0.024720f, -0.006521f, 0.000820f, 0.017669f, 0.004020f, -0.016983f, -0.003676f, 0.012669f, -0.005823f, 0.002944f, 0.004719f, 0.006079f, -0.011056f, -0.019436f, -0.007116f, -0.011205f, 0.028392f, 0.000348f, -0.008244f, 0.002799f, 0.005408f, -0.006178f, 0.004361f, 0.000218f, 0.016233f, 0.005320f, -0.000982f, 0.011271f, -0.001731f, -0.013450f, -0.002173f, -0.000985f, 0.013892f, -0.007410f, -0.001400f, -0.003934f, 0.002627f, -0.004007f, 0.001304f, 0.004567f, 0.006874f, 0.009344f, 0.006554f, 0.003038f, 0.024228f, 0.009441f, 0.008368f, -0.000922f, -0.018053f, 0.001298f, -0.014900f, 0.004804f, -0.009857f, 0.002619f, 0.000769f, 0.006034f, 0.029887f, 0.008277f, -0.003716f, 0.010461f, -0.007380f, 0.008895f, -0.004207f, 0.015141f, -0.007339f, -0.000144f, -0.010404f, 0.006865f, 0.012634f, -0.013643f, 0.028524f, -0.006836f, 0.003239f, -0.004343f, -0.006045f, 0.002793f, -0.006805f, -0.023630f, 0.005498f, -0.006062f, 0.000340f, -0.014683f, 0.005216f, + -0.005331f, -0.022236f, -0.011151f, -0.004653f, -0.021578f, 0.014416f, 0.030556f, 0.039829f, -0.035772f, -0.024335f, -0.015271f, 0.004665f, 0.008652f, -0.007386f, 0.004933f, -0.008356f, 0.003264f, 0.021235f, 0.014997f, -0.023769f, 0.038320f, 0.002295f, 0.023101f, 0.009307f, -0.005963f, -0.006307f, 0.021546f, -0.010265f, 0.014215f, 0.017005f, -0.000375f, -0.009469f, 0.002263f, 0.017511f, 0.010710f, 0.009687f, 0.008847f, -0.000024f, 0.004271f, 0.006798f, 0.022076f, 0.015732f, -0.009175f, -0.007931f, 0.000067f, -0.003369f, -0.000516f, -0.009370f, -0.005374f, 0.011537f, 0.019746f, 0.005873f, 0.028903f, -0.006307f, 0.031457f, 0.002579f, 0.015793f, 0.033861f, 0.024983f, 0.008591f, 0.008556f, 0.015902f, -0.001318f, -0.012091f, 0.001856f, 0.014959f, -0.006039f, -0.014117f, 0.002570f, -0.001429f, 0.031900f, 0.024908f, 0.001798f, 0.034610f, -0.000847f, 0.018933f, 0.011804f, 0.015058f, 0.000424f, -0.011037f, 0.017547f, -0.002554f, 0.020243f, 0.012492f, 0.040132f, -0.020752f, -0.000712f, -0.042319f, 0.012171f, -0.021139f, 0.000782f, 0.018622f, -0.003629f, 0.006179f, -0.024180f, -0.017627f, + 0.009119f, -0.014142f, 0.008566f, -0.008345f, 0.002619f, 0.022989f, -0.003670f, -0.020779f, 0.005882f, -0.008412f, 0.021788f, -0.022167f, -0.015812f, 0.009841f, 0.010471f, 0.016470f, 0.000537f, -0.000911f, 0.010164f, -0.005526f, -0.015641f, 0.010390f, -0.006530f, -0.011625f, 0.003537f, 0.012955f, -0.009120f, 0.023682f, 0.008990f, 0.000064f, 0.002705f, 0.012118f, 0.004558f, -0.038009f, 0.015562f, -0.002972f, -0.004532f, -0.005658f, 0.020289f, 0.001242f, 0.021594f, 0.002094f, 0.001406f, 0.003659f, -0.006405f, -0.001086f, 0.010119f, -0.011138f, 0.002314f, 0.036862f, 0.002431f, 0.027559f, 0.001293f, -0.003722f, -0.003625f, -0.015881f, -0.037260f, -0.024774f, 0.011214f, 0.018629f, -0.008096f, 0.029938f, 0.011024f, -0.017710f, -0.012521f, 0.027981f, 0.017250f, 0.019667f, 0.004349f, -0.004682f, -0.000447f, 0.002480f, -0.015923f, 0.000426f, -0.007732f, 0.012530f, 0.025007f, 0.010569f, 0.009513f, 0.028450f, 0.024078f, 0.020360f, 0.002439f, 0.008630f, 0.003148f, -0.002672f, -0.003519f, 0.006060f, -0.000428f, -0.014368f, 0.005211f, 0.017396f, 0.001517f, -0.002874f, 0.006568f, -0.037528f, + 0.014745f, -0.013955f, 0.011429f, 0.014927f, 0.013686f, -0.013069f, 0.009640f, 0.000128f, 0.001388f, 0.024844f, 0.018682f, 0.001868f, 0.010807f, 0.008367f, -0.001423f, -0.011614f, 0.004958f, 0.012964f, 0.001955f, 0.018168f, 0.006691f, 0.016592f, 0.031219f, 0.003182f, 0.013646f, 0.014271f, 0.017560f, 0.000990f, -0.008362f, 0.027133f, -0.008089f, 0.022240f, -0.022444f, -0.018217f, 0.029695f, 0.000321f, 0.011018f, 0.018213f, 0.026162f, 0.033302f, 0.015106f, 0.006198f, -0.013533f, 0.008879f, -0.001271f, -0.026101f, 0.025829f, 0.017119f, -0.021048f, 0.001113f, 0.003566f, -0.026004f, 0.012079f, 0.026482f, 0.016571f, 0.004303f, -0.065736f, -0.041149f, 0.012336f, 0.013077f, 0.025782f, 0.043419f, -0.013085f, -0.007572f, -0.015035f, -0.013653f, -0.017605f, -0.018358f, 0.000373f, 0.006555f, 0.004469f, 0.027308f, 0.000052f, 0.026819f, -0.002594f, 0.008932f, 0.011382f, 0.009276f, 0.019019f, 0.014087f, -0.000340f, 0.017531f, -0.001647f, -0.002467f, -0.011795f, 0.011799f, -0.003168f, -0.026962f, -0.024665f, 0.014221f, -0.005002f, 0.031580f, 0.017269f, 0.020253f, 0.005776f, -0.040198f, + 0.007780f, 0.025015f, -0.005801f, 0.007197f, -0.008150f, 0.004895f, 0.029511f, -0.001174f, 0.024308f, 0.044109f, 0.000210f, -0.016695f, -0.002840f, 0.000460f, -0.030184f, 0.037505f, 0.015294f, -0.004938f, -0.004812f, 0.027221f, 0.010018f, -0.032838f, -0.029700f, 0.010660f, -0.014668f, 0.015849f, 0.008257f, 0.005111f, -0.016204f, -0.023254f, -0.004304f, 0.006052f, 0.001374f, 0.025389f, -0.036400f, 0.004809f, -0.002274f, 0.046377f, -0.054445f, -0.014992f, -0.026357f, -0.000791f, 0.009046f, 0.001780f, 0.037102f, -0.037586f, 0.018299f, -0.004854f, 0.007702f, -0.004271f, 0.020562f, -0.010807f, -0.018375f, -0.001254f, -0.005064f, 0.014574f, -0.000771f, 0.009954f, 0.021799f, -0.004136f, -0.015581f, -0.001831f, 0.024484f, -0.013829f, 0.006192f, 0.005721f, 0.001429f, -0.001868f, 0.024360f, -0.000585f, -0.005654f, -0.039551f, 0.013346f, -0.009543f, -0.024645f, -0.021583f, -0.005264f, -0.023957f, -0.013736f, -0.020756f, 0.010602f, -0.024549f, 0.025455f, -0.022497f, 0.016042f, -0.011449f, 0.030781f, -0.028803f, -0.016245f, -0.004019f, 0.018177f, 0.007570f, 0.000912f, -0.011605f, -0.023099f, 0.002844f, + 0.010181f, 0.034555f, 0.018774f, 0.007899f, -0.018587f, 0.012082f, -0.016335f, -0.019032f, 0.018066f, -0.018441f, 0.010112f, 0.022640f, 0.019578f, -0.004404f, -0.005891f, -0.015514f, 0.027761f, 0.002966f, 0.022202f, 0.032460f, 0.044195f, -0.042713f, 0.034810f, 0.024837f, 0.003100f, 0.018416f, 0.058094f, -0.013854f, -0.014169f, 0.007240f, 0.018506f, 0.025201f, 0.009670f, -0.020011f, 0.026777f, -0.007232f, 0.051560f, 0.000555f, -0.006196f, 0.017884f, 0.015011f, 0.014720f, 0.001447f, 0.048341f, -0.036686f, 0.011220f, 0.001263f, 0.014538f, -0.014169f, -0.030447f, 0.017960f, 0.014331f, 0.014997f, -0.009593f, -0.006644f, 0.040532f, 0.016499f, 0.050476f, 0.006362f, -0.016534f, -0.000069f, 0.012360f, -0.002399f, 0.052179f, -0.004558f, 0.028999f, -0.003120f, 0.046823f, 0.018370f, 0.013489f, -0.009314f, -0.001454f, 0.026757f, 0.001457f, 0.028482f, 0.021108f, 0.025303f, -0.030812f, 0.006574f, 0.022986f, 0.028495f, 0.020443f, 0.016825f, 0.036350f, 0.045891f, -0.034557f, -0.003069f, 0.066951f, -0.015567f, -0.020090f, 0.044348f, 0.056565f, 0.000833f, -0.004861f, -0.033860f, 0.021294f, + 0.044660f, 0.000029f, 0.015862f, -0.033302f, 0.036967f, -0.015693f, -0.008304f, -0.028956f, -0.017389f, 0.066669f, 0.003917f, -0.042982f, -0.017104f, 0.000898f, 0.003344f, -0.003783f, 0.052971f, 0.025370f, -0.000928f, -0.018674f, 0.001424f, 0.015126f, -0.002674f, 0.068245f, 0.017656f, 0.031086f, 0.013709f, -0.013002f, -0.033746f, 0.010702f, 0.003438f, 0.007724f, -0.025087f, -0.001264f, -0.015538f, 0.024124f, 0.004346f, 0.005426f, 0.027528f, -0.019253f, -0.010909f, 0.006304f, 0.005647f, 0.008608f, -0.027308f, -0.023501f, -0.050032f, -0.027043f, 0.007512f, -0.029663f, 0.009563f, -0.021014f, -0.008076f, 0.042661f, 0.018665f, -0.017966f, 0.018334f, 0.006624f, 0.006253f, 0.041409f, 0.000056f, 0.049896f, 0.025429f, -0.017933f, -0.050347f, 0.013020f, 0.017653f, 0.035546f, -0.008147f, -0.037654f, -0.004455f, 0.017271f, 0.014320f, -0.002917f, -0.014231f, 0.029341f, -0.034216f, -0.002874f, 0.050042f, -0.011835f, 0.014315f, 0.004342f, 0.006043f, -0.048587f, 0.038892f, -0.004971f, -0.038721f, -0.023402f, 0.019410f, -0.006828f, 0.009461f, -0.001420f, -0.016313f, -0.013011f, 0.006381f, -0.013079f, + -0.003199f, -0.002004f, -0.055654f, -0.015836f, -0.037426f, 0.006745f, 0.012803f, -0.001838f, -0.016640f, 0.004991f, -0.008110f, 0.020040f, -0.049163f, 0.001585f, 0.008265f, 0.026209f, -0.021517f, 0.024225f, -0.021174f, 0.014671f, 0.004252f, 0.018281f, -0.032076f, 0.007689f, -0.015950f, -0.036109f, 0.021938f, -0.029741f, -0.055270f, 0.005708f, -0.005248f, 0.040981f, -0.021050f, 0.003425f, 0.019961f, 0.026044f, 0.032664f, 0.000522f, -0.011194f, -0.023781f, 0.000674f, 0.012117f, 0.021554f, -0.046744f, 0.048225f, -0.004489f, -0.032483f, -0.028917f, -0.043237f, 0.012364f, 0.010555f, 0.010960f, 0.007702f, 0.037798f, -0.015818f, 0.036091f, -0.042942f, -0.002171f, 0.020532f, -0.010971f, -0.046373f, -0.009049f, -0.066839f, 0.029397f, -0.073668f, 0.040762f, -0.051595f, -0.045150f, 0.010184f, 0.035122f, 0.025546f, -0.026549f, 0.023812f, 0.044707f, 0.006098f, 0.005038f, 0.008757f, 0.002285f, -0.029732f, 0.031547f, -0.058431f, -0.036794f, 0.000847f, -0.005373f, -0.005947f, -0.009351f, -0.016374f, 0.005620f, 0.049259f, 0.011499f, 0.004714f, 0.002988f, -0.026838f, 0.028168f, -0.008006f, -0.053831f, + -0.010651f, -0.000701f, -0.001598f, -0.037379f, -0.027932f, 0.025582f, -0.011811f, 0.045196f, 0.005716f, -0.001723f, -0.041342f, -0.022692f, 0.010829f, 0.004349f, -0.013848f, 0.038548f, -0.035475f, -0.021022f, -0.005249f, -0.004000f, 0.033836f, 0.001473f, 0.039931f, -0.001570f, -0.041256f, 0.007496f, -0.036483f, 0.022084f, -0.010652f, 0.030690f, 0.053394f, -0.094962f, 0.022795f, 0.011666f, 0.005103f, 0.034194f, -0.011076f, 0.005465f, 0.073531f, 0.063213f, -0.022023f, -0.028514f, -0.004645f, -0.053221f, 0.026229f, -0.005708f, 0.007878f, 0.001127f, -0.028708f, 0.073647f, -0.036124f, -0.137452f, -0.023065f, 0.024234f, -0.094101f, -0.018159f, 0.024959f, -0.079412f, 0.007187f, 0.047508f, -0.038845f, 0.047436f, -0.051495f, 0.040452f, 0.049586f, -0.036363f, 0.010825f, -0.007236f, -0.002557f, -0.016680f, -0.024813f, -0.006114f, 0.028930f, -0.023288f, -0.039002f, -0.021320f, -0.032217f, -0.005068f, -0.026190f, -0.005646f, 0.007689f, -0.007243f, 0.027878f, -0.030123f, -0.038846f, 0.025794f, -0.040921f, -0.056187f, -0.074090f, -0.026016f, -0.006063f, 0.011932f, 0.034386f, -0.017806f, 0.012835f, 0.016723f, + -0.017501f, -0.007431f, 0.059235f, -0.043695f, -0.006611f, 0.042593f, 0.008445f, 0.033309f, -0.013981f, 0.011491f, 0.043005f, 0.024025f, -0.008654f, -0.006815f, -0.036546f, 0.011483f, 0.041325f, -0.046975f, -0.022137f, -0.015970f, 0.067134f, 0.045189f, -0.064967f, -0.013601f, 0.057938f, -0.018242f, -0.035812f, -0.026027f, -0.035858f, -0.022037f, 0.058721f, 0.034794f, -0.004429f, 0.025569f, -0.006031f, 0.031280f, -0.019938f, -0.012520f, 0.065508f, -0.028380f, 0.012321f, -0.020256f, -0.006384f, -0.002306f, 0.018493f, 0.051196f, 0.021165f, -0.037677f, -0.009659f, -0.003622f, -0.004505f, 0.027654f, 0.004977f, 0.050987f, -0.014631f, 0.006766f, -0.004355f, 0.012937f, -0.043436f, 0.024034f, -0.039900f, 0.024893f, -0.000823f, 0.037724f, -0.009242f, 0.026913f, -0.012485f, 0.005868f, 0.019008f, -0.021634f, 0.019718f, 0.037061f, 0.053368f, -0.031935f, 0.054730f, 0.017261f, 0.064680f, -0.023410f, 0.013872f, -0.008224f, -0.005574f, -0.018475f, -0.002059f, -0.027891f, -0.100433f, -0.072690f, -0.017339f, -0.010278f, 0.017398f, -0.003136f, 0.026851f, 0.026234f, -0.053149f, -0.019797f, -0.019428f, 0.049498f, + -0.075217f, 0.067901f, -0.021707f, -0.022273f, 0.016454f, 0.030746f, -0.059146f, -0.013162f, -0.000353f, 0.009913f, 0.001768f, -0.003303f, 0.027656f, -0.019258f, 0.002428f, 0.013517f, 0.015600f, 0.022423f, 0.018755f, 0.004912f, -0.032908f, -0.008186f, 0.041919f, -0.043705f, -0.036968f, 0.042810f, 0.014119f, 0.029669f, 0.047728f, 0.073795f, -0.018253f, -0.050118f, 0.063006f, -0.027861f, -0.011836f, 0.064746f, 0.019989f, -0.026559f, -0.070628f, -0.048080f, -0.007922f, -0.027849f, 0.031884f, 0.063653f, 0.032873f, -0.024766f, 0.066779f, 0.020527f, -0.025257f, 0.016406f, 0.074706f, 0.019563f, 0.013949f, -0.018202f, -0.061038f, -0.083429f, -0.065024f, -0.006972f, 0.048421f, 0.012628f, 0.030517f, 0.113331f, 0.056728f, -0.071480f, -0.046729f, 0.028496f, -0.095726f, -0.046056f, 0.082998f, 0.027773f, -0.105678f, -0.090011f, -0.039794f, -0.067781f, -0.061571f, -0.032106f, -0.100637f, 0.074109f, 0.033391f, 0.025659f, 0.031490f, -0.008625f, 0.038076f, 0.031370f, 0.044216f, -0.005514f, 0.059638f, -0.033370f, 0.046003f, -0.013461f, -0.029925f, -0.008302f, -0.050965f, 0.007709f, -0.016687f, 0.021141f, + -0.010485f, -0.018967f, 0.055172f, -0.057682f, 0.041830f, -0.000205f, -0.022497f, -0.008637f, 0.026527f, 0.027682f, 0.022407f, 0.050719f, 0.043308f, -0.026881f, -0.002101f, -0.023962f, 0.026003f, -0.021151f, 0.021268f, 0.024960f, 0.015015f, 0.014491f, 0.013122f, -0.012871f, 0.058677f, -0.004055f, 0.020760f, 0.006325f, 0.029808f, 0.014651f, -0.059769f, 0.004870f, -0.033499f, 0.010420f, 0.034145f, -0.004925f, -0.021617f, -0.024943f, 0.066581f, -0.063803f, -0.045035f, 0.094594f, -0.033188f, 0.024154f, 0.017107f, 0.029723f, -0.005872f, 0.014862f, -0.056563f, 0.003012f, 0.074800f, -0.036395f, -0.013230f, 0.052345f, 0.012193f, -0.049929f, 0.023293f, -0.070180f, -0.257008f, -0.276355f, -0.018995f, -0.162327f, 0.126407f, 0.481837f, 0.204525f, 0.287108f, 0.364389f, -0.149994f, -0.109337f, -0.048478f, -0.345265f, -0.243473f, -0.085693f, -0.376715f, -0.170040f, -0.041240f, -0.160117f, 0.027486f, 0.335938f, 0.305678f, 0.330087f, 0.432214f, 0.255670f, -0.031941f, 0.089278f, -0.106672f, -0.401570f, -0.220717f, -0.167263f, -0.333282f, -0.232979f, 0.004902f, -0.260417f, -0.089899f, 0.045609f, -0.257674f, + -0.138142f, 0.180388f, 0.063038f, 0.196442f, 0.496633f, 0.405009f, 0.323275f, 0.592511f, 0.425195f, -0.013328f, 0.053234f, -0.117484f, -0.545613f, -0.517944f, -0.537888f, -0.828601f, -0.566691f, -0.348893f, -0.345782f, 0.000958f, 0.260105f, 0.299377f, 0.415785f, 0.638892f, 0.586423f, 0.500960f, 0.489710f, 0.286589f, 0.098520f, 0.023999f, -0.026560f, -0.208883f, -0.373671f, -0.445265f, -0.477228f, -0.624737f, -0.476615f, -0.186451f, 0.054341f, 0.053551f}, + {0.016394f, 0.003508f, -0.000366f, -0.002725f, -0.005240f, -0.003985f, 0.004793f, 0.006277f, 0.003167f, 0.005132f, 0.000969f, -0.003613f, -0.000492f, 0.000282f, -0.003748f, -0.003799f, -0.007416f, 0.010633f, -0.004831f, 0.009252f, -0.006533f, -0.008086f, 0.001099f, 0.013007f, -0.000873f, 0.005309f, -0.001478f, 0.003674f, 0.005456f, 0.004156f, 0.006924f, 0.004429f, -0.012967f, 0.000752f, -0.007141f, 0.002178f, -0.003372f, -0.001600f, -0.002531f, 0.000472f, -0.001100f, -0.002449f, 0.000097f, -0.001281f, 0.006619f, 0.001953f, 0.000706f, 0.005540f, 0.005299f, 0.001018f, -0.002933f, -0.002556f, -0.002782f, 0.003073f, -0.000192f, 0.000415f, -0.005086f, 0.013371f, 0.006090f, 0.003227f, -0.002376f, -0.002842f, 0.005882f, 0.001541f, -0.000502f, 0.001817f, -0.002937f, 0.001690f, -0.004191f, 0.000138f, 0.003490f, -0.005721f, -0.003868f, -0.002079f, 0.000276f, 0.000751f, 0.003185f, -0.014805f, 0.006690f, -0.016793f, 0.002901f, 0.000858f, 0.000710f, -0.011572f, -0.004298f, 0.002746f, -0.002775f, 0.003311f, 0.005540f, 0.003180f, -0.000457f, 0.004255f, -0.012994f, -0.000050f, -0.000790f, -0.000673f, + 0.006684f, 0.010247f, -0.011415f, -0.002863f, -0.007032f, -0.002569f, 0.003686f, 0.006910f, 0.000909f, 0.001433f, -0.003006f, -0.004001f, -0.003211f, -0.002629f, -0.005317f, 0.002390f, -0.005350f, -0.003830f, 0.005575f, -0.005346f, 0.003943f, 0.000304f, -0.012782f, -0.004645f, -0.007133f, -0.002048f, 0.005139f, -0.004104f, -0.001286f, -0.004043f, -0.003953f, -0.003032f, 0.005058f, 0.007546f, 0.001318f, 0.004024f, 0.003380f, -0.004599f, -0.008094f, 0.003906f, 0.003451f, -0.002124f, -0.006925f, -0.006108f, 0.005164f, 0.000684f, 0.003904f, 0.001492f, -0.010481f, -0.003830f, -0.003768f, 0.005511f, 0.002637f, -0.010926f, 0.003252f, -0.005894f, -0.000942f, -0.019987f, 0.013961f, -0.009309f, 0.001780f, -0.000834f, -0.003313f, 0.010843f, -0.008709f, -0.005569f, 0.000391f, 0.011457f, -0.003678f, -0.000113f, -0.000798f, 0.009589f, -0.005097f, -0.013976f, -0.002866f, -0.006911f, -0.009798f, 0.000951f, -0.000466f, 0.002266f, 0.006203f, 0.010270f, 0.006353f, 0.001552f, 0.015102f, 0.006390f, 0.000807f, 0.011195f, 0.011360f, -0.000223f, -0.005671f, 0.001104f, 0.005167f, 0.004609f, 0.000186f, -0.001411f, + -0.008322f, -0.006828f, -0.003464f, 0.009225f, 0.003749f, 0.015360f, 0.008488f, 0.000160f, 0.005106f, 0.006776f, 0.002206f, -0.008192f, 0.010019f, -0.002990f, 0.005332f, 0.000546f, 0.003302f, -0.009823f, -0.001533f, -0.002410f, 0.004007f, -0.002221f, -0.003894f, 0.012412f, -0.000596f, -0.007250f, 0.003534f, -0.005136f, 0.005464f, -0.002214f, 0.008679f, 0.008856f, 0.008396f, 0.004523f, -0.007368f, 0.006442f, -0.000309f, 0.007016f, 0.003895f, 0.004409f, 0.000037f, -0.004148f, 0.004075f, 0.001509f, 0.001080f, 0.001874f, -0.016398f, 0.005094f, -0.010544f, 0.001571f, 0.003087f, 0.003379f, -0.004989f, 0.008464f, 0.001089f, -0.003295f, -0.001766f, 0.009916f, 0.006898f, -0.004464f, -0.005921f, -0.004697f, 0.003556f, 0.007028f, -0.004636f, -0.004776f, 0.001041f, -0.018398f, -0.000409f, -0.007881f, -0.003468f, -0.007831f, -0.010598f, -0.001294f, 0.008878f, 0.002529f, -0.008741f, -0.002228f, 0.007510f, 0.002396f, -0.005563f, 0.008999f, -0.004394f, -0.012537f, -0.004236f, 0.007070f, -0.003631f, 0.008374f, 0.015397f, 0.012939f, 0.001222f, -0.000115f, 0.003919f, -0.001878f, -0.010018f, 0.000193f, + 0.002904f, -0.006625f, 0.005007f, -0.013229f, -0.002703f, 0.000985f, -0.006412f, -0.004182f, 0.005044f, 0.011862f, -0.009941f, -0.009279f, 0.005078f, 0.006263f, 0.010111f, 0.003906f, -0.007190f, 0.009239f, 0.007290f, 0.027761f, -0.010473f, -0.004489f, -0.001538f, 0.020074f, -0.001749f, 0.015234f, -0.010691f, 0.013448f, -0.012869f, -0.011276f, 0.002990f, 0.006477f, -0.007506f, -0.001692f, 0.004176f, -0.000807f, 0.005375f, -0.007773f, 0.009427f, 0.003523f, -0.009645f, -0.000185f, 0.004183f, 0.003275f, 0.001986f, 0.018855f, 0.015106f, 0.011817f, 0.000218f, 0.007722f, 0.000926f, 0.002335f, 0.005809f, -0.017091f, -0.002422f, 0.010639f, 0.007047f, 0.008276f, 0.000016f, -0.002944f, 0.004012f, -0.000583f, 0.021272f, -0.003108f, 0.003757f, 0.002179f, 0.001234f, -0.006186f, 0.012837f, -0.001411f, 0.013339f, -0.007235f, -0.007383f, 0.005419f, -0.004847f, -0.017586f, -0.007864f, 0.003447f, -0.001444f, -0.012662f, 0.003735f, -0.000125f, 0.016572f, 0.001222f, 0.001694f, -0.005249f, 0.006259f, 0.005707f, -0.000962f, -0.001335f, 0.014805f, 0.010096f, 0.011091f, -0.007366f, -0.008926f, -0.008525f, + 0.019845f, -0.016425f, -0.000822f, -0.017147f, -0.011458f, -0.006890f, 0.014103f, 0.008201f, -0.020740f, -0.028035f, -0.011154f, 0.009470f, 0.006450f, -0.004447f, 0.008970f, -0.000187f, -0.002904f, 0.000815f, -0.015134f, 0.004139f, -0.002503f, 0.000983f, 0.004000f, 0.000767f, -0.000679f, 0.005918f, 0.004724f, -0.009868f, -0.010326f, 0.010850f, -0.004189f, -0.005576f, 0.006026f, -0.019093f, 0.003767f, 0.003838f, -0.018247f, 0.006255f, 0.017268f, 0.010868f, 0.011566f, 0.002482f, 0.005970f, 0.017123f, 0.002308f, 0.003251f, -0.020644f, 0.010401f, 0.013847f, 0.012173f, 0.001290f, 0.012392f, -0.015126f, 0.013900f, -0.005299f, -0.013688f, -0.022484f, -0.000060f, -0.014813f, -0.010725f, -0.006042f, -0.012731f, -0.033782f, 0.001691f, 0.000132f, -0.000730f, 0.003361f, 0.016341f, 0.004168f, 0.006959f, 0.002254f, -0.010857f, -0.000522f, 0.006340f, 0.002102f, 0.005519f, -0.043936f, 0.021284f, 0.002540f, -0.017218f, 0.003894f, -0.002110f, -0.005242f, -0.003711f, -0.009849f, 0.004919f, -0.005161f, 0.000766f, 0.006070f, 0.005557f, 0.018708f, -0.007905f, -0.018316f, 0.009591f, -0.023164f, -0.010146f, + 0.003524f, 0.002901f, 0.002399f, 0.007176f, 0.008992f, 0.007676f, -0.000380f, 0.010242f, 0.000473f, -0.004426f, 0.013735f, 0.008386f, -0.004453f, 0.008041f, -0.014626f, 0.027002f, 0.000829f, 0.004824f, -0.002754f, -0.023638f, -0.004247f, -0.008944f, -0.008389f, 0.003403f, 0.019310f, 0.000333f, 0.000631f, -0.002723f, -0.005564f, -0.012823f, 0.003815f, -0.002263f, 0.006804f, -0.016072f, 0.005194f, 0.008344f, 0.003560f, -0.011893f, -0.004354f, 0.003043f, 0.001359f, 0.009538f, 0.001719f, 0.033184f, -0.009609f, -0.013983f, -0.016192f, -0.004597f, 0.000214f, 0.012261f, -0.016079f, -0.001374f, -0.006874f, 0.008466f, -0.023166f, 0.001121f, -0.005066f, -0.006189f, 0.019143f, -0.006930f, -0.005319f, 0.003676f, 0.005205f, -0.016490f, -0.016699f, -0.015255f, -0.014456f, -0.023146f, 0.013588f, -0.013766f, 0.003331f, 0.004952f, 0.019859f, -0.003925f, -0.005572f, 0.015565f, 0.003024f, 0.002857f, -0.019603f, -0.012880f, 0.008557f, 0.003537f, 0.006641f, 0.010620f, -0.020652f, -0.000257f, 0.007723f, 0.018520f, -0.000982f, 0.001337f, -0.003664f, -0.000435f, -0.013801f, -0.002896f, -0.004873f, -0.024571f, + -0.002794f, 0.006968f, -0.014732f, 0.005535f, -0.015969f, -0.000471f, -0.011346f, -0.002514f, -0.004193f, 0.001010f, 0.018510f, -0.006013f, -0.000730f, 0.009665f, -0.006597f, 0.005553f, -0.017206f, -0.029070f, -0.016725f, -0.008971f, -0.005190f, 0.002860f, 0.018068f, -0.009206f, 0.003970f, 0.004556f, -0.015046f, 0.004605f, -0.011901f, -0.003744f, 0.005760f, 0.019586f, -0.004258f, -0.000837f, 0.005072f, -0.000057f, -0.018983f, 0.019723f, 0.020672f, -0.005666f, 0.002364f, 0.021680f, -0.021044f, -0.018631f, 0.016671f, -0.003346f, 0.002684f, 0.015244f, -0.002441f, -0.003474f, 0.015147f, -0.026652f, 0.012046f, -0.000662f, 0.005054f, 0.013818f, 0.014102f, -0.014653f, 0.003327f, -0.020342f, 0.006874f, -0.005700f, -0.001812f, -0.013958f, -0.000320f, -0.020263f, 0.002446f, -0.017472f, 0.013096f, -0.005713f, 0.002817f, 0.023235f, 0.010895f, 0.010769f, -0.017616f, 0.003987f, 0.021360f, -0.004280f, -0.029345f, 0.016658f, -0.003214f, 0.003606f, -0.005433f, -0.013102f, 0.020091f, 0.007776f, 0.016457f, 0.004716f, 0.002765f, -0.012501f, -0.016701f, 0.006898f, 0.008498f, 0.009323f, 0.011897f, 0.027049f, + -0.000371f, -0.019733f, -0.012767f, 0.016526f, -0.001726f, -0.016929f, -0.004020f, -0.000513f, -0.004145f, -0.021750f, 0.001047f, 0.003344f, 0.006298f, -0.008026f, 0.013576f, -0.001184f, 0.001990f, 0.015997f, 0.014966f, -0.018975f, 0.021479f, -0.005248f, 0.022736f, -0.019186f, 0.016734f, 0.001554f, -0.002165f, 0.028436f, -0.015386f, 0.001405f, -0.014948f, -0.004656f, 0.043460f, 0.020847f, 0.008934f, 0.006043f, 0.012091f, -0.007297f, -0.000436f, -0.037342f, 0.006503f, -0.001829f, -0.016407f, 0.017492f, 0.012945f, -0.000824f, 0.002779f, -0.021676f, 0.018482f, -0.010257f, 0.019651f, 0.012880f, 0.010311f, -0.015606f, -0.003091f, -0.013153f, 0.018855f, 0.004204f, -0.007392f, 0.033886f, 0.015919f, -0.004057f, 0.001413f, -0.028455f, 0.004424f, 0.001121f, 0.022077f, -0.010260f, -0.029094f, -0.005111f, -0.008295f, -0.005740f, -0.040944f, -0.020378f, -0.043568f, -0.022158f, -0.015742f, 0.004995f, -0.011123f, 0.020354f, 0.002348f, -0.023398f, 0.013955f, -0.015629f, 0.022036f, -0.019644f, -0.015903f, 0.011631f, 0.019925f, 0.019608f, 0.000614f, -0.017788f, -0.013363f, 0.009542f, -0.028256f, -0.033299f, + -0.022524f, -0.004481f, -0.001795f, -0.005594f, 0.006202f, 0.010053f, 0.006642f, -0.001503f, 0.002938f, -0.011635f, 0.005291f, -0.022075f, -0.029967f, -0.000667f, 0.020610f, 0.002250f, -0.009061f, 0.015941f, 0.009064f, 0.015347f, 0.027285f, 0.002031f, -0.010165f, -0.019954f, -0.015930f, 0.006605f, -0.018068f, -0.013403f, 0.002971f, -0.015086f, -0.030537f, -0.017893f, -0.002965f, -0.005328f, 0.005467f, -0.008560f, 0.014800f, 0.002644f, 0.004750f, 0.020264f, -0.004989f, 0.000466f, 0.003767f, -0.020131f, 0.019628f, 0.001117f, -0.020961f, -0.034335f, 0.006611f, 0.000313f, -0.024713f, 0.021854f, 0.014337f, -0.024284f, 0.005632f, 0.017662f, 0.009895f, 0.002402f, 0.015338f, -0.011159f, -0.008787f, -0.002262f, -0.011485f, -0.019015f, 0.023819f, -0.027339f, -0.004953f, 0.005090f, -0.000436f, 0.035218f, -0.038145f, 0.004746f, -0.008289f, -0.007392f, 0.005682f, -0.003066f, 0.004589f, -0.008861f, -0.021904f, 0.017243f, -0.038716f, -0.027789f, 0.018702f, -0.001997f, -0.035369f, 0.016500f, -0.021162f, 0.037715f, 0.006631f, -0.052092f, -0.007624f, 0.003590f, -0.014026f, 0.002796f, 0.007760f, 0.017077f, + 0.014374f, -0.030678f, -0.002437f, 0.001748f, -0.007286f, -0.028188f, -0.005337f, -0.006652f, -0.010466f, -0.009295f, -0.001523f, 0.001009f, 0.021999f, 0.024338f, -0.008972f, 0.012652f, 0.010675f, 0.010531f, 0.024149f, -0.000666f, 0.005704f, -0.030068f, -0.011067f, 0.009268f, -0.006803f, 0.013061f, 0.033629f, 0.004124f, -0.031338f, -0.068591f, -0.001125f, -0.021835f, 0.018263f, -0.013780f, -0.007776f, -0.014298f, -0.037356f, 0.014865f, 0.048056f, 0.001805f, 0.012113f, -0.039386f, 0.007355f, -0.005468f, -0.017684f, 0.003223f, 0.018481f, 0.008502f, 0.015134f, -0.017793f, 0.024659f, 0.012864f, -0.027130f, -0.043195f, -0.000221f, -0.031595f, -0.073943f, -0.046809f, 0.033268f, 0.026633f, 0.043675f, -0.000489f, 0.017175f, 0.003903f, 0.013787f, -0.000973f, 0.008920f, -0.019866f, -0.023220f, -0.014945f, -0.020740f, -0.013986f, -0.014706f, 0.017233f, 0.042284f, 0.008564f, -0.051151f, -0.012883f, 0.009278f, -0.014369f, 0.012874f, -0.030142f, -0.002006f, -0.001814f, 0.002132f, 0.013446f, 0.011332f, 0.001087f, -0.003006f, -0.007541f, 0.012547f, 0.022206f, -0.017980f, -0.029995f, 0.019937f, 0.007998f, + 0.025995f, 0.010293f, 0.037507f, -0.026653f, -0.007984f, 0.022046f, 0.035953f, 0.028934f, 0.019061f, 0.007028f, -0.006328f, 0.000693f, -0.003138f, -0.001568f, 0.013488f, -0.047474f, 0.026042f, -0.005507f, 0.008272f, -0.005040f, 0.036448f, -0.012727f, 0.001414f, -0.009881f, 0.024116f, 0.016263f, -0.036623f, 0.025404f, -0.030535f, -0.004356f, -0.013869f, -0.019430f, 0.018486f, 0.000112f, -0.047825f, -0.006383f, -0.000267f, 0.041501f, -0.044984f, -0.000462f, -0.025345f, -0.072412f, -0.008109f, -0.026329f, -0.057121f, 0.012155f, 0.000123f, -0.010544f, 0.004105f, 0.031649f, -0.001535f, -0.032041f, 0.011691f, 0.002042f, -0.010079f, -0.007134f, -0.005409f, 0.002422f, 0.036108f, -0.007218f, -0.000912f, 0.017026f, 0.012366f, -0.004290f, 0.017658f, 0.016695f, -0.007263f, -0.006584f, -0.013995f, 0.020809f, -0.004418f, -0.033215f, 0.005535f, -0.001240f, 0.012047f, 0.045886f, -0.029639f, -0.046867f, -0.030009f, -0.012846f, 0.006866f, 0.017233f, 0.008713f, 0.035402f, 0.017225f, -0.022687f, -0.013739f, -0.031363f, 0.028500f, 0.018986f, 0.003223f, 0.007640f, -0.018802f, 0.003700f, -0.019953f, 0.036229f, + 0.033628f, 0.004390f, -0.015920f, -0.006594f, 0.003030f, 0.033654f, 0.062052f, 0.041045f, -0.006497f, -0.011051f, 0.000089f, 0.023213f, 0.007627f, 0.022289f, 0.024056f, -0.020112f, -0.002513f, -0.040610f, -0.026240f, 0.016213f, 0.018892f, -0.032425f, -0.000935f, -0.015242f, 0.030101f, -0.026408f, 0.009021f, 0.005811f, 0.055777f, -0.029257f, -0.006205f, -0.030186f, -0.003899f, -0.029780f, -0.024377f, -0.016805f, 0.013702f, -0.032278f, -0.022357f, -0.035379f, -0.006450f, -0.002609f, -0.008379f, -0.014234f, -0.039540f, 0.014438f, -0.026908f, 0.015486f, -0.028372f, 0.042508f, 0.009600f, 0.020829f, -0.004002f, -0.033849f, 0.023484f, 0.014731f, -0.008809f, 0.023093f, 0.031490f, -0.011756f, -0.036172f, -0.018122f, 0.057370f, -0.019590f, 0.002151f, 0.004687f, -0.005112f, 0.015100f, 0.038752f, 0.009512f, 0.018904f, -0.007790f, 0.029074f, 0.003767f, 0.023923f, 0.009418f, 0.011143f, 0.002900f, 0.006669f, 0.046014f, 0.017719f, 0.105263f, -0.056959f, 0.043317f, 0.061054f, -0.010902f, 0.006981f, 0.032673f, -0.014635f, -0.001988f, 0.053501f, 0.022801f, 0.000211f, 0.029316f, -0.000153f, 0.054087f, + 0.060808f, -0.001624f, 0.043319f, 0.042820f, -0.004710f, 0.017782f, -0.047805f, -0.016895f, 0.038420f, 0.001039f, 0.037989f, 0.052995f, 0.044164f, -0.012225f, 0.028252f, -0.049881f, -0.074721f, -0.034392f, -0.028933f, 0.014365f, -0.001400f, 0.015503f, 0.018930f, 0.040588f, 0.032723f, 0.008365f, -0.036065f, -0.007845f, 0.033668f, 0.007491f, -0.018133f, 0.018580f, 0.047071f, -0.009341f, 0.015885f, -0.043230f, 0.018050f, -0.035107f, -0.008965f, -0.023948f, -0.041071f, 0.020457f, 0.002514f, 0.007547f, 0.048494f, -0.031066f, -0.029546f, 0.012627f, 0.050610f, -0.044711f, -0.026084f, 0.011087f, -0.012147f, 0.065688f, 0.053595f, -0.055813f, -0.017734f, -0.045558f, 0.003635f, 0.037219f, -0.018259f, -0.036659f, -0.011400f, -0.004124f, 0.013376f, -0.043214f, 0.012268f, 0.065134f, 0.009803f, -0.056275f, -0.068252f, 0.051796f, -0.063638f, -0.067895f, -0.023503f, 0.008746f, -0.016000f, 0.008158f, 0.002957f, -0.069698f, -0.042358f, -0.053232f, 0.008946f, 0.024081f, 0.005410f, 0.038916f, 0.033599f, 0.050364f, 0.012167f, 0.055397f, 0.021575f, 0.034720f, -0.023286f, -0.010320f, -0.023474f, -0.048047f, + -0.037312f, -0.072634f, -0.046453f, -0.016101f, -0.045830f, 0.006435f, -0.006800f, -0.003492f, 0.011364f, 0.011427f, 0.000897f, 0.031657f, -0.014069f, -0.030058f, 0.034775f, 0.001871f, -0.059399f, -0.024804f, -0.011784f, -0.065896f, -0.055001f, -0.048833f, -0.001936f, 0.021792f, -0.000296f, -0.025658f, -0.009848f, 0.026191f, 0.009611f, 0.063594f, 0.004730f, -0.086339f, -0.036217f, -0.014784f, 0.005924f, 0.013900f, -0.018113f, -0.022025f, 0.023274f, -0.046464f, -0.018025f, -0.036517f, 0.019184f, -0.072884f, -0.057195f, -0.058354f, -0.060921f, 0.006103f, -0.040861f, -0.016772f, -0.064590f, 0.030657f, 0.070266f, 0.004676f, 0.032132f, -0.024957f, -0.018409f, 0.048252f, 0.019380f, 0.048571f, -0.081738f, 0.033952f, 0.060380f, -0.007263f, 0.069743f, -0.038644f, -0.107365f, -0.056973f, -0.000940f, -0.012369f, 0.011744f, -0.040158f, 0.037050f, 0.050379f, -0.046921f, 0.039498f, -0.025498f, -0.033748f, -0.074320f, -0.032822f, -0.042389f, -0.030795f, -0.033652f, 0.031157f, 0.005883f, -0.069682f, -0.084768f, 0.061953f, 0.015815f, 0.020242f, -0.018737f, 0.002057f, -0.021726f, -0.002678f, 0.021370f, 0.026439f, + 0.028948f, 0.068915f, 0.004374f, -0.055882f, 0.072624f, -0.011462f, -0.015810f, -0.036894f, 0.032407f, -0.062331f, -0.035919f, 0.028168f, -0.026878f, -0.050031f, -0.053065f, -0.054808f, -0.006743f, 0.001090f, 0.009567f, -0.021199f, 0.065620f, 0.045657f, 0.000034f, -0.036354f, -0.045470f, -0.065834f, 0.020599f, 0.004454f, -0.004680f, -0.014383f, 0.091447f, -0.003963f, -0.015719f, 0.025372f, 0.027236f, -0.067364f, 0.051912f, 0.034108f, 0.102120f, 0.045441f, 0.003217f, -0.032866f, 0.049169f, 0.000261f, 0.004274f, -0.022108f, 0.044858f, -0.050044f, 0.038065f, 0.037107f, 0.038500f, 0.019543f, -0.013257f, 0.051450f, 0.063496f, -0.011516f, 0.026523f, -0.037645f, 0.063787f, 0.028431f, 0.021624f, -0.038913f, -0.087860f, 0.019095f, -0.026702f, -0.018603f, -0.035519f, -0.043515f, 0.027505f, 0.013904f, -0.021751f, 0.006769f, 0.002241f, -0.022065f, -0.107818f, -0.004892f, -0.022930f, -0.009164f, -0.001766f, 0.077988f, 0.051707f, -0.023316f, 0.019299f, -0.047980f, 0.005194f, 0.039671f, -0.057752f, -0.050829f, -0.044302f, 0.071177f, -0.050266f, 0.016775f, 0.054281f, -0.071919f, -0.070375f, 0.066435f, + 0.049297f, 0.056344f, 0.069805f, 0.029440f, -0.093469f, 0.023828f, 0.024627f, -0.004653f, 0.146412f, -0.011715f, -0.026417f, -0.063368f, -0.063088f, 0.034829f, -0.060265f, 0.040762f, 0.002168f, 0.046653f, -0.014685f, 0.025333f, 0.077791f, 0.009215f, -0.061107f, 0.094245f, 0.024951f, -0.003067f, 0.067806f, 0.035289f, 0.055346f, 0.022740f, -0.075555f, -0.014108f, -0.026603f, 0.039956f, 0.093784f, -0.054631f, 0.017308f, -0.024552f, 0.043141f, 0.049871f, -0.059019f, 0.054593f, -0.046960f, -0.041179f, 0.025016f, 0.045571f, 0.004155f, 0.017367f, 0.035221f, -0.046438f, 0.046210f, 0.006857f, 0.055835f, -0.006080f, -0.012071f, 0.020972f, 0.081485f, -0.032166f, 0.066136f, -0.027524f, 0.014786f, 0.020371f, 0.065896f, -0.000152f, -0.002542f, 0.025735f, 0.098198f, 0.010073f, -0.074231f, -0.002399f, -0.089804f, 0.058444f, 0.001218f, 0.153032f, 0.032755f, -0.039720f, -0.012667f, 0.036944f, -0.032727f, 0.056432f, 0.097305f, 0.070784f, 0.000990f, 0.032559f, 0.041180f, -0.000437f, -0.046980f, -0.001678f, -0.012881f, -0.150932f, 0.093246f, 0.077681f, 0.061042f, 0.021952f, -0.075556f, 0.059982f, + -0.034908f, 0.060946f, -0.053198f, 0.010381f, 0.030070f, -0.026973f, 0.005581f, 0.012268f, -0.013301f, -0.028339f, -0.053548f, 0.085093f, -0.017086f, -0.015725f, -0.026229f, -0.003918f, -0.009667f, 0.028100f, -0.054600f, -0.015646f, -0.033340f, 0.012782f, -0.033446f, 0.034753f, 0.002014f, 0.018131f, -0.036940f, -0.071089f, 0.005794f, -0.051887f, -0.052137f, 0.025117f, -0.039323f, -0.035150f, 0.071834f, -0.025315f, -0.037666f, 0.005417f, -0.038714f, 0.019710f, 0.029073f, -0.007444f, -0.030907f, -0.009775f, 0.022947f, 0.017537f, -0.012195f, -0.001368f, 0.064323f, -0.010784f, -0.034193f, -0.047719f, -0.003340f, -0.020862f, -0.068331f, 0.067642f, 0.027066f, -0.082460f, 0.054672f, -0.003432f, -0.030791f, 0.159266f, 0.093387f, 0.073696f, 0.042734f, 0.023107f, -0.033890f, 0.007034f, 0.021143f, 0.020476f, 0.010405f, 0.072350f, 0.018078f, -0.015808f, -0.033721f, -0.128221f, -0.071311f, 0.124376f, 0.017133f, 0.041792f, 0.023413f, -0.028930f, 0.024289f, 0.036167f, 0.010052f, -0.001947f, -0.028289f, -0.003611f, 0.009776f, -0.012271f, -0.009170f, 0.006788f, 0.015157f, 0.037403f, -0.023415f, 0.016712f, + 0.002781f, 0.030226f, -0.008770f, 0.007371f, 0.010686f, -0.031033f, 0.027915f, 0.006078f, 0.007842f, 0.011354f, 0.011067f, -0.018957f, 0.023339f, -0.016066f, 0.005705f, 0.023071f, -0.010409f, 0.022684f, -0.007869f, 0.028128f, 0.021405f, 0.013775f, -0.031459f, 0.026291f, 0.019462f, 0.016814f, 0.041463f, -0.036880f, -0.002495f, 0.001748f, -0.007421f, 0.014062f, -0.019316f, -0.030073f, 0.022880f, 0.027275f, 0.013229f, -0.000790f, 0.005914f, -0.001116f, 0.013530f, -0.008900f, 0.005693f, -0.021474f, 0.022102f, -0.034638f, 0.035273f, 0.022247f, -0.011810f, 0.002226f, 0.014379f, 0.003902f, 0.012672f, 0.003278f, 0.001030f, 0.002141f, 0.023543f, -0.098202f, -0.228618f, -0.036631f, 0.133471f, 0.121293f, 0.298624f, 0.156033f, -0.080702f, -0.024723f, -0.165795f, -0.280909f, -0.019727f, -0.127615f, -0.018154f, 0.204788f, 0.087017f, 0.158273f, 0.242346f, -0.028084f, -0.036032f, -0.123121f, -0.210201f, -0.166493f, -0.011283f, -0.062375f, -0.024309f, 0.174530f, 0.054641f, 0.113679f, 0.205299f, 0.034136f, -0.001524f, 0.021760f, -0.125987f, -0.189176f, 0.031824f, -0.195454f, -0.129020f, 0.044084f, + -0.020557f, 0.032495f, 0.251349f, 0.029633f, 0.095760f, 0.206710f, -0.042021f, 0.007204f, 0.044890f, -0.197680f, -0.166673f, -0.057726f, -0.227124f, -0.086490f, 0.027601f, 0.042934f, 0.154391f, 0.220462f, 0.154957f, 0.111661f, 0.094727f, -0.035018f, -0.133822f, -0.107030f, -0.165173f, -0.170050f, -0.075287f, -0.041371f, -0.000487f, 0.146936f, 0.170490f, 0.057180f, 0.132906f, 0.043652f, -0.043896f, 0.034991f, -0.092458f, -0.097676f, -0.014884f, -0.016038f} + }, + { + {0.014085f, 0.003015f, -0.003886f, -0.001391f, -0.012989f, -0.006968f, 0.003037f, -0.000664f, -0.000688f, 0.011340f, 0.009528f, 0.002088f, -0.002756f, -0.002327f, -0.006276f, 0.005696f, 0.000631f, -0.003797f, -0.001952f, -0.003632f, -0.001690f, -0.000933f, -0.008573f, -0.007868f, 0.007024f, 0.006528f, 0.002812f, -0.008093f, -0.003750f, -0.001893f, 0.003547f, -0.002993f, -0.004002f, -0.000711f, 0.000351f, 0.001679f, 0.003808f, 0.000765f, 0.005449f, -0.006988f, -0.006472f, -0.008698f, -0.006355f, -0.003515f, 0.000815f, -0.001142f, -0.001206f, -0.003676f, 0.001338f, -0.001025f, 0.000739f, 0.006166f, 0.004616f, -0.002338f, -0.004630f, -0.003376f, 0.001808f, 0.001424f, 0.000608f, -0.000514f, 0.012116f, 0.007436f, 0.001175f, -0.002393f, 0.000596f, -0.007037f, 0.000435f, -0.000466f, 0.001926f, -0.001106f, -0.003904f, 0.006675f, -0.008500f, 0.000402f, 0.000820f, -0.000836f, -0.008431f, 0.008433f, 0.001963f, -0.004904f, -0.002288f, -0.010673f, -0.002996f, 0.008553f, -0.004829f, -0.003591f, 0.002509f, -0.001582f, -0.000519f, 0.000337f, -0.002984f, -0.002467f, 0.010437f, 0.004945f, -0.001479f, 0.000295f, + -0.001765f, -0.003401f, 0.001279f, 0.003564f, 0.005663f, -0.001729f, 0.002053f, 0.002458f, -0.009588f, -0.003130f, -0.000202f, -0.002118f, 0.005584f, 0.000268f, -0.002164f, 0.004929f, -0.004146f, 0.001485f, 0.007870f, -0.004747f, 0.000321f, 0.000795f, 0.005924f, -0.002651f, 0.008241f, -0.012267f, -0.004568f, 0.004893f, -0.002580f, -0.010465f, 0.000512f, 0.001700f, 0.003154f, 0.003119f, -0.001328f, -0.004735f, 0.000133f, -0.004348f, -0.002951f, 0.000777f, 0.004750f, 0.004195f, -0.007050f, 0.005494f, -0.007711f, 0.006119f, 0.000032f, 0.005265f, -0.002640f, -0.005379f, -0.002562f, 0.003244f, -0.001261f, -0.001743f, -0.001779f, 0.004453f, -0.006406f, -0.028480f, 0.009344f, -0.010351f, -0.004133f, -0.008471f, -0.008714f, 0.004955f, -0.002918f, -0.007337f, -0.003966f, 0.010011f, 0.014835f, -0.008105f, -0.003047f, -0.000698f, -0.010725f, -0.010025f, 0.000726f, -0.000983f, 0.006506f, 0.002241f, 0.004836f, -0.004245f, -0.002720f, -0.005508f, 0.001529f, 0.009643f, 0.004124f, 0.001925f, -0.006223f, 0.004755f, 0.001375f, 0.002944f, -0.004080f, 0.000438f, 0.001371f, 0.002243f, -0.005530f, -0.003914f, + 0.001452f, -0.007463f, -0.007788f, 0.003435f, 0.005819f, -0.006473f, -0.003372f, -0.002407f, 0.000422f, 0.006001f, 0.004665f, 0.002205f, 0.000836f, 0.015312f, 0.005889f, -0.004584f, 0.005839f, 0.004413f, -0.004258f, 0.007387f, -0.002716f, -0.001531f, -0.000091f, -0.002824f, 0.006304f, -0.003248f, 0.001622f, 0.004204f, 0.003026f, -0.005225f, 0.002188f, 0.001562f, 0.001108f, -0.001366f, -0.002839f, -0.000403f, 0.008831f, 0.001667f, 0.003866f, 0.021828f, 0.008796f, -0.001355f, 0.001139f, 0.005121f, 0.002753f, -0.001311f, -0.009208f, 0.000458f, 0.008468f, -0.008370f, -0.000794f, -0.015844f, 0.004359f, 0.006671f, 0.000596f, -0.003656f, 0.011858f, 0.008378f, -0.007374f, 0.003800f, 0.000607f, -0.006452f, 0.010602f, 0.005912f, -0.000513f, 0.004375f, 0.010112f, -0.002922f, -0.001886f, 0.000828f, 0.000229f, 0.000403f, 0.002559f, 0.012379f, 0.002632f, 0.001992f, -0.019571f, -0.000872f, 0.001073f, 0.002535f, -0.008760f, 0.002247f, -0.007032f, -0.005349f, -0.007448f, -0.004794f, 0.000219f, 0.002485f, -0.004485f, 0.004853f, -0.011172f, -0.006314f, -0.000524f, 0.000058f, 0.003804f, -0.004331f, + -0.000898f, -0.003895f, 0.002617f, 0.006372f, -0.003572f, 0.000896f, -0.003088f, -0.000342f, 0.009634f, 0.007710f, -0.002928f, 0.007244f, -0.003312f, -0.005711f, -0.007477f, -0.000321f, -0.000844f, 0.034857f, -0.014233f, 0.003467f, -0.000600f, -0.005654f, 0.006084f, 0.010248f, -0.005577f, 0.010972f, 0.000083f, 0.011662f, 0.003698f, 0.004553f, -0.004088f, 0.006909f, 0.003062f, 0.007063f, -0.012805f, 0.007897f, -0.007303f, 0.003185f, -0.006025f, 0.009145f, -0.001644f, 0.009214f, -0.004335f, 0.003849f, -0.002608f, -0.000011f, 0.000297f, -0.000120f, 0.004023f, 0.018427f, 0.001467f, 0.005953f, -0.004200f, -0.007415f, 0.001046f, 0.000954f, 0.001056f, 0.003505f, -0.004958f, 0.012430f, -0.000004f, 0.010578f, 0.001423f, -0.003319f, -0.004555f, -0.013668f, 0.007944f, 0.005698f, -0.006016f, 0.001748f, 0.006671f, 0.004138f, -0.016126f, 0.011229f, 0.000323f, 0.008359f, -0.009261f, -0.009761f, -0.004335f, -0.009385f, -0.000895f, 0.013795f, 0.003737f, -0.003164f, 0.002033f, 0.008765f, -0.000872f, -0.003569f, -0.001150f, -0.003829f, 0.006770f, -0.006320f, 0.001650f, -0.002003f, 0.009023f, -0.020887f, + 0.004346f, -0.006515f, -0.019104f, -0.014665f, 0.007906f, 0.008876f, 0.011571f, -0.005578f, -0.002931f, 0.008074f, 0.003819f, 0.012008f, 0.003880f, -0.001164f, 0.001223f, 0.007740f, 0.014750f, -0.003595f, 0.004292f, 0.000013f, 0.011935f, 0.002954f, -0.000754f, -0.002180f, -0.009152f, -0.013636f, 0.000110f, -0.001750f, 0.004120f, -0.000528f, 0.003209f, 0.002701f, 0.000782f, 0.001177f, 0.002689f, -0.004432f, 0.000451f, 0.006914f, 0.010228f, -0.004712f, 0.001130f, -0.004094f, -0.006031f, 0.008898f, -0.006653f, -0.015894f, -0.006524f, -0.003756f, 0.007701f, 0.001094f, 0.008502f, 0.008362f, -0.004326f, 0.000843f, -0.006908f, -0.000415f, -0.003057f, 0.010672f, -0.012899f, 0.000228f, 0.004126f, -0.012850f, -0.015354f, 0.000923f, 0.004518f, 0.010361f, -0.006876f, -0.015246f, 0.008219f, -0.013918f, 0.017188f, 0.010809f, 0.002798f, 0.008594f, 0.000347f, -0.003371f, -0.046890f, 0.009075f, 0.001866f, -0.023796f, -0.029892f, -0.005223f, -0.023184f, 0.017967f, 0.004815f, -0.014187f, 0.000388f, -0.006870f, 0.001589f, -0.009848f, 0.000737f, -0.001037f, -0.000347f, 0.012510f, -0.005103f, -0.003541f, + -0.005874f, -0.005297f, -0.012715f, -0.008738f, 0.011881f, -0.005596f, 0.007360f, -0.007370f, 0.002949f, -0.000306f, 0.006623f, -0.007676f, 0.004925f, -0.007709f, 0.002743f, -0.003270f, -0.004875f, 0.003938f, -0.011849f, 0.003892f, -0.006203f, -0.002618f, -0.008688f, 0.019638f, 0.009265f, 0.017154f, -0.007847f, 0.006933f, 0.005708f, -0.004030f, 0.002878f, -0.008892f, 0.008641f, 0.018856f, 0.015114f, -0.011196f, -0.003030f, 0.004015f, -0.007852f, -0.005717f, -0.013601f, -0.025845f, -0.008593f, 0.012451f, 0.004748f, -0.006782f, 0.002756f, 0.000794f, -0.006565f, -0.012568f, -0.011596f, 0.008085f, 0.001873f, -0.019151f, 0.003426f, 0.001328f, 0.002087f, -0.017994f, -0.007402f, -0.004526f, 0.013896f, -0.003416f, 0.003414f, -0.013941f, -0.014642f, 0.000977f, 0.004419f, -0.008398f, -0.004839f, -0.007852f, 0.016932f, 0.003996f, -0.005543f, -0.011978f, -0.012030f, -0.011533f, -0.003224f, 0.006018f, 0.016954f, 0.005822f, 0.009592f, -0.007232f, 0.018022f, 0.010642f, 0.003329f, 0.000583f, 0.018505f, -0.010418f, 0.001751f, 0.006267f, 0.012499f, -0.019846f, -0.010353f, 0.009274f, 0.003508f, -0.002351f, + 0.021055f, -0.008774f, 0.005893f, 0.013215f, 0.003861f, 0.002631f, 0.009189f, 0.004286f, 0.004494f, 0.005259f, 0.001862f, 0.005996f, -0.000491f, 0.008596f, -0.002070f, 0.020299f, -0.014579f, 0.016820f, 0.012657f, -0.010654f, 0.012503f, 0.002974f, 0.010556f, 0.011625f, -0.024475f, 0.000016f, -0.001342f, -0.006582f, 0.003452f, -0.005829f, 0.006249f, -0.001953f, 0.014917f, -0.000781f, 0.001926f, 0.007426f, 0.003832f, 0.024475f, -0.006088f, -0.003467f, -0.005614f, 0.017495f, 0.009368f, 0.002104f, 0.006908f, -0.011395f, 0.026104f, 0.008776f, -0.001672f, 0.009957f, 0.012816f, -0.020802f, -0.001022f, 0.005194f, 0.002863f, 0.000180f, 0.018213f, -0.008357f, -0.010371f, 0.024680f, 0.004152f, -0.001556f, -0.001966f, 0.012971f, 0.001468f, -0.001693f, -0.001895f, -0.005788f, 0.006911f, -0.003537f, 0.009064f, 0.006131f, -0.014852f, -0.014488f, 0.002437f, 0.029033f, 0.000290f, 0.006019f, -0.017167f, 0.008914f, 0.012571f, -0.007277f, 0.009539f, 0.011017f, -0.017301f, -0.010952f, -0.001446f, -0.023083f, -0.011416f, -0.013754f, 0.005002f, -0.004676f, -0.004134f, -0.002488f, 0.017371f, -0.022286f, + 0.011040f, 0.004895f, -0.005966f, 0.013670f, -0.007319f, 0.001338f, -0.017189f, -0.000371f, 0.013118f, 0.010209f, 0.023398f, -0.025218f, -0.003848f, -0.027995f, -0.003008f, -0.000526f, -0.002606f, 0.003470f, 0.017064f, -0.017954f, 0.001184f, -0.010793f, 0.032278f, -0.012852f, -0.007108f, 0.028016f, 0.021311f, 0.004371f, -0.037717f, -0.008818f, 0.018241f, 0.001947f, -0.001223f, -0.004947f, -0.002394f, -0.002487f, 0.003310f, 0.006427f, 0.006053f, 0.005631f, 0.034600f, -0.006615f, -0.004272f, 0.000487f, 0.005096f, -0.009674f, 0.006638f, 0.004038f, -0.000589f, -0.010722f, -0.006314f, 0.012664f, 0.013829f, 0.025241f, 0.007064f, -0.009868f, 0.007002f, 0.000020f, 0.007099f, 0.000778f, 0.014540f, -0.011206f, -0.016383f, -0.017418f, 0.012350f, -0.004822f, 0.003216f, 0.004776f, -0.005498f, -0.001048f, 0.030348f, 0.010142f, -0.024017f, 0.017700f, 0.006561f, 0.029793f, -0.014594f, -0.014826f, 0.009634f, 0.015784f, 0.012159f, 0.005749f, -0.001631f, 0.000304f, 0.008896f, -0.010617f, -0.001465f, -0.000902f, 0.014191f, -0.010919f, 0.027267f, -0.003463f, 0.001951f, -0.017389f, -0.010893f, -0.023254f, + -0.019799f, -0.008042f, 0.006546f, 0.006687f, 0.034591f, 0.033495f, -0.004438f, 0.002176f, 0.001046f, -0.000326f, -0.000834f, -0.007637f, -0.023294f, -0.018139f, -0.009477f, 0.007479f, -0.006781f, -0.020511f, -0.006025f, 0.003147f, -0.001851f, -0.031128f, -0.009321f, 0.006105f, -0.003461f, 0.002234f, 0.001780f, 0.008505f, 0.013117f, 0.001509f, -0.010015f, 0.009230f, 0.010046f, 0.006579f, -0.000649f, 0.012687f, -0.026959f, 0.008286f, -0.023887f, 0.028854f, -0.021125f, 0.007396f, -0.022375f, -0.004355f, -0.024953f, -0.013791f, -0.015563f, -0.017407f, 0.011439f, -0.015375f, -0.002856f, 0.004554f, -0.000157f, -0.008464f, -0.005580f, -0.003164f, -0.024167f, 0.000242f, 0.001777f, 0.011536f, -0.037669f, 0.000431f, -0.000644f, 0.017294f, 0.021713f, -0.014748f, -0.008288f, 0.000623f, 0.017109f, -0.031355f, 0.021147f, -0.013796f, -0.007804f, 0.002412f, -0.028018f, 0.004243f, -0.019473f, -0.048377f, -0.020233f, -0.010337f, 0.006686f, 0.011303f, -0.016923f, -0.007194f, -0.020916f, -0.018444f, 0.007460f, -0.016349f, 0.013899f, 0.004995f, 0.009518f, -0.003146f, -0.016865f, 0.025361f, 0.008937f, 0.013661f, + -0.020713f, 0.006838f, 0.001784f, -0.028972f, 0.015441f, 0.009074f, -0.000721f, -0.020075f, -0.009037f, 0.008155f, 0.008100f, -0.001599f, 0.001598f, 0.012334f, -0.015020f, -0.010843f, 0.013989f, -0.032681f, -0.033064f, -0.042012f, -0.011124f, 0.012137f, -0.037914f, -0.031006f, -0.020195f, -0.000373f, 0.010912f, 0.003185f, 0.001589f, -0.000283f, -0.012501f, -0.015213f, -0.036088f, 0.017093f, 0.002876f, 0.040373f, -0.012073f, 0.000347f, -0.027766f, -0.031156f, 0.001525f, 0.019054f, -0.001062f, -0.019794f, 0.010188f, 0.004640f, 0.025456f, 0.002321f, 0.000798f, -0.013942f, -0.005482f, 0.011607f, -0.030681f, -0.051658f, -0.017965f, -0.012826f, -0.043003f, -0.032873f, -0.014541f, 0.024075f, -0.000976f, 0.040560f, 0.008948f, -0.002662f, -0.021160f, 0.008673f, 0.042138f, -0.042172f, -0.037342f, -0.012105f, -0.005118f, -0.026282f, 0.026818f, 0.008012f, 0.015206f, 0.016990f, -0.025462f, -0.002749f, 0.012328f, -0.016556f, 0.033347f, 0.000826f, 0.008793f, -0.008937f, 0.009555f, -0.020731f, -0.010191f, -0.007007f, 0.013801f, 0.005828f, 0.021241f, -0.031548f, 0.004844f, -0.000197f, -0.021492f, 0.025740f, + -0.013216f, -0.037725f, 0.009715f, 0.013440f, 0.005109f, -0.011442f, -0.000263f, -0.015945f, 0.005171f, 0.012498f, 0.008157f, -0.026149f, 0.012911f, -0.006358f, -0.025627f, -0.017480f, -0.032014f, 0.000103f, -0.002196f, -0.001723f, 0.008009f, 0.020639f, 0.030430f, 0.021226f, -0.007537f, -0.020658f, 0.010526f, -0.006374f, 0.001089f, -0.016711f, 0.032522f, 0.020997f, 0.000001f, 0.040259f, -0.022116f, 0.010864f, 0.031645f, 0.016232f, -0.037901f, 0.004987f, 0.000649f, -0.023938f, 0.003724f, -0.053449f, -0.046112f, -0.010982f, -0.000169f, 0.002091f, -0.000917f, -0.018975f, -0.000408f, -0.005395f, 0.017407f, 0.003374f, -0.000801f, 0.003223f, -0.040189f, 0.013975f, 0.007850f, 0.022422f, 0.009631f, 0.009656f, 0.026709f, 0.013039f, 0.004144f, 0.065894f, 0.014456f, 0.025229f, 0.035378f, 0.001422f, 0.025057f, 0.005933f, -0.013374f, 0.015740f, 0.001493f, 0.007368f, -0.013080f, 0.000590f, -0.008356f, 0.005126f, -0.008324f, 0.018032f, 0.002611f, -0.012176f, -0.014067f, 0.001284f, -0.038806f, 0.021977f, 0.015747f, -0.002907f, -0.003170f, 0.007917f, -0.010040f, -0.009824f, -0.012485f, -0.016872f, + 0.013317f, -0.013937f, 0.021756f, 0.023107f, 0.024740f, 0.023856f, -0.005733f, -0.041839f, 0.000864f, 0.013605f, 0.039813f, -0.012908f, -0.001534f, 0.014064f, 0.027189f, 0.034358f, -0.007194f, 0.007436f, 0.034080f, 0.043730f, -0.029467f, -0.030860f, -0.041421f, 0.040752f, -0.002329f, -0.013801f, 0.015258f, 0.015001f, 0.038141f, 0.032303f, 0.003744f, 0.035257f, 0.048996f, 0.015519f, -0.022272f, 0.024757f, -0.020489f, -0.010288f, -0.002835f, -0.013358f, -0.016930f, 0.011959f, -0.007670f, -0.006980f, -0.020806f, 0.053722f, 0.008193f, -0.024958f, 0.001759f, -0.001270f, 0.024775f, 0.026815f, 0.011361f, -0.013471f, 0.026301f, -0.004071f, 0.016906f, -0.044350f, 0.004223f, 0.022247f, -0.018410f, 0.009529f, -0.020161f, -0.015026f, 0.050279f, 0.023071f, 0.016388f, -0.000397f, -0.041243f, -0.007367f, 0.014194f, 0.012438f, 0.008703f, -0.006917f, 0.035952f, -0.020655f, 0.020747f, -0.007774f, 0.014304f, 0.017537f, 0.028819f, 0.040483f, -0.040841f, 0.002963f, 0.023529f, 0.014969f, 0.032341f, 0.034501f, -0.040914f, 0.005316f, -0.010421f, -0.015975f, -0.000424f, -0.015177f, 0.010019f, 0.032470f, + 0.064808f, 0.002664f, -0.031047f, 0.008624f, -0.020756f, 0.013265f, -0.018018f, -0.019603f, 0.058928f, -0.044915f, 0.074006f, 0.045076f, -0.010827f, 0.014671f, 0.035853f, 0.004926f, -0.055602f, 0.021625f, -0.044969f, 0.010456f, 0.004243f, -0.022621f, 0.001209f, -0.003380f, 0.032542f, -0.016503f, -0.001299f, -0.001633f, -0.009465f, 0.067735f, -0.003529f, -0.010686f, 0.009204f, 0.022481f, -0.022769f, -0.049545f, 0.039197f, -0.006725f, -0.002426f, 0.043554f, -0.025372f, -0.007775f, -0.030276f, 0.007632f, -0.020932f, 0.024251f, 0.023683f, 0.046247f, -0.012708f, 0.012380f, 0.032170f, -0.045302f, 0.006313f, -0.029199f, -0.043885f, -0.058149f, -0.029151f, -0.062861f, -0.068592f, -0.010758f, 0.005624f, -0.033866f, -0.034062f, 0.020644f, -0.001177f, -0.021105f, -0.036608f, 0.025929f, -0.018764f, 0.005379f, 0.036209f, -0.067201f, -0.016785f, -0.014980f, 0.031313f, 0.071998f, 0.003372f, -0.019625f, 0.020230f, -0.010082f, -0.030806f, -0.045274f, -0.034495f, 0.036756f, -0.031306f, 0.014423f, 0.034972f, 0.014515f, 0.022208f, -0.043258f, 0.060453f, 0.037708f, 0.032640f, -0.025384f, 0.043096f, -0.005618f, + 0.028233f, 0.018202f, 0.005671f, 0.014925f, 0.020476f, 0.012045f, -0.007975f, -0.011857f, -0.010620f, 0.003417f, -0.030358f, -0.035790f, 0.018607f, 0.007531f, 0.010361f, -0.029736f, 0.006751f, 0.007479f, 0.020309f, 0.030610f, 0.046833f, -0.028472f, 0.006038f, 0.066826f, 0.013423f, 0.005789f, 0.005213f, -0.015702f, 0.003529f, 0.066249f, 0.018133f, 0.042189f, 0.010843f, -0.049084f, -0.021472f, -0.036411f, 0.096711f, 0.037866f, -0.040330f, -0.026290f, -0.036411f, 0.003204f, -0.024952f, -0.056348f, 0.009411f, -0.043488f, 0.057190f, -0.007241f, -0.053721f, 0.062816f, 0.049166f, 0.004687f, -0.019523f, 0.006686f, -0.036608f, 0.040548f, -0.047785f, 0.017608f, -0.007463f, 0.045472f, -0.098125f, -0.067444f, 0.037256f, 0.017546f, 0.012716f, 0.031823f, -0.034328f, -0.043884f, -0.025026f, -0.036221f, 0.018782f, -0.038761f, 0.009779f, 0.024757f, 0.040213f, 0.000870f, 0.033434f, 0.019853f, 0.004259f, -0.011514f, -0.037989f, -0.026065f, 0.019693f, -0.044865f, 0.021099f, 0.005055f, 0.036340f, 0.028869f, -0.015911f, -0.055557f, -0.037842f, -0.003316f, -0.004574f, -0.014553f, 0.036147f, -0.066889f, + -0.007110f, 0.002664f, -0.072241f, -0.000933f, -0.010680f, -0.005068f, 0.005433f, 0.041813f, -0.042250f, -0.109664f, 0.039008f, 0.045967f, 0.024529f, 0.087279f, -0.073324f, -0.007809f, 0.045391f, 0.038120f, -0.047096f, -0.018957f, -0.014960f, 0.069863f, 0.010571f, 0.067076f, -0.096623f, 0.016313f, -0.114817f, -0.063916f, -0.067926f, 0.080361f, 0.021200f, -0.045530f, 0.042119f, 0.009807f, -0.045676f, 0.048542f, -0.061475f, 0.034280f, 0.083970f, 0.031270f, -0.029855f, -0.019284f, 0.011675f, -0.020932f, -0.024891f, -0.002585f, 0.039015f, -0.006344f, 0.007276f, -0.040979f, -0.008622f, 0.057752f, -0.041868f, 0.032211f, 0.074630f, 0.037969f, -0.003354f, -0.013646f, -0.024808f, -0.047151f, -0.035427f, 0.041901f, -0.023786f, 0.039402f, 0.027505f, 0.014050f, 0.001419f, 0.015916f, -0.012376f, -0.059945f, -0.021598f, 0.044413f, 0.033927f, 0.037109f, -0.039076f, 0.067386f, -0.017748f, 0.026853f, -0.049786f, 0.046032f, 0.076607f, -0.014443f, -0.028374f, -0.001685f, 0.001967f, -0.015989f, 0.015980f, 0.035098f, -0.064461f, 0.042972f, 0.039388f, -0.008553f, 0.045775f, 0.026225f, 0.019092f, -0.028299f, + 0.004972f, 0.043376f, -0.089713f, -0.077355f, -0.034038f, 0.022382f, -0.041925f, -0.118343f, 0.049120f, 0.034322f, -0.016470f, -0.019010f, 0.000334f, -0.005973f, -0.040876f, -0.109688f, -0.004426f, -0.002141f, 0.040643f, 0.053909f, 0.001096f, -0.061007f, 0.080535f, -0.022766f, -0.056420f, 0.050335f, -0.008229f, -0.030750f, 0.038854f, 0.010310f, -0.008309f, 0.032756f, -0.045258f, 0.042626f, -0.015461f, 0.001281f, -0.013308f, -0.011372f, -0.063084f, 0.024712f, -0.024237f, 0.009706f, -0.025467f, -0.002294f, -0.019082f, 0.017769f, -0.011332f, 0.067693f, 0.011648f, 0.044176f, -0.017694f, 0.010817f, 0.027656f, -0.012256f, 0.018928f, -0.004203f, 0.033393f, -0.002088f, -0.012014f, 0.053243f, -0.048622f, 0.026301f, 0.035918f, -0.022013f, 0.040666f, -0.025941f, -0.001971f, 0.020776f, -0.017286f, 0.048160f, 0.042517f, 0.008398f, 0.071388f, -0.045555f, -0.104131f, -0.018101f, -0.065139f, -0.042904f, 0.148028f, -0.004828f, 0.043835f, -0.008132f, -0.065760f, -0.002924f, 0.060087f, 0.087684f, 0.050798f, 0.088014f, -0.052516f, -0.016842f, -0.026999f, -0.054797f, 0.026295f, 0.046913f, -0.046932f, 0.059007f, + -0.033631f, 0.009103f, 0.001206f, 0.007112f, -0.043083f, -0.005792f, -0.038793f, -0.032203f, 0.001573f, -0.012079f, -0.028823f, -0.011089f, 0.023798f, -0.024907f, 0.022110f, -0.011263f, 0.063858f, -0.027846f, 0.020313f, 0.004714f, -0.013655f, -0.049001f, -0.016440f, 0.038954f, 0.008824f, -0.011536f, 0.051892f, -0.035987f, -0.035128f, -0.004180f, 0.049821f, -0.042405f, -0.003748f, 0.009392f, 0.015334f, -0.047324f, 0.017043f, 0.017657f, -0.014590f, -0.049510f, 0.003694f, -0.038226f, 0.019527f, 0.009858f, 0.018119f, -0.076100f, -0.029670f, 0.044975f, 0.122061f, -0.052637f, -0.003717f, 0.010657f, -0.016066f, -0.032321f, 0.003578f, 0.100308f, 0.027398f, -0.008759f, -0.003752f, -0.024731f, -0.000673f, -0.018450f, 0.044398f, 0.003805f, -0.017863f, -0.024323f, 0.008967f, 0.020097f, -0.030625f, 0.033556f, 0.020057f, 0.036753f, 0.016364f, 0.045091f, -0.074081f, 0.101338f, 0.015101f, 0.024037f, 0.025305f, -0.021868f, -0.025344f, 0.002196f, -0.008958f, 0.015461f, 0.034287f, -0.045078f, 0.016659f, -0.008552f, 0.013383f, 0.012472f, 0.009202f, 0.027583f, 0.022022f, -0.018552f, 0.019953f, 0.017320f, + -0.014611f, -0.026471f, 0.009875f, -0.008642f, -0.021488f, 0.014897f, 0.012742f, -0.000785f, -0.013507f, 0.001573f, -0.009420f, -0.004170f, 0.002593f, 0.007097f, 0.012094f, -0.019548f, -0.001483f, 0.017683f, -0.005770f, 0.015979f, 0.004501f, 0.011833f, 0.023434f, 0.007534f, -0.020460f, 0.003420f, 0.022531f, -0.010687f, 0.000754f, 0.011133f, -0.033387f, -0.001075f, -0.006753f, -0.031838f, 0.047549f, -0.010528f, 0.000252f, 0.028027f, 0.006900f, -0.019296f, 0.010424f, -0.018426f, -0.001331f, 0.015962f, -0.015378f, -0.005687f, 0.036747f, -0.034901f, 0.007352f, 0.003926f, 0.016405f, -0.015299f, 0.016171f, -0.004846f, 0.019167f, -0.006821f, 0.023609f, -0.098966f, -0.201561f, -0.025806f, 0.126632f, 0.097500f, 0.279449f, 0.134640f, -0.065125f, -0.056680f, -0.132487f, -0.231762f, -0.029367f, -0.089669f, -0.027974f, 0.164127f, 0.104350f, 0.111812f, 0.213116f, -0.007109f, -0.047328f, -0.080036f, -0.211023f, -0.115981f, -0.037631f, -0.038735f, 0.005663f, 0.096470f, 0.074112f, 0.079423f, 0.148563f, 0.087620f, -0.055003f, 0.079912f, -0.083676f, -0.193887f, 0.024542f, -0.129890f, -0.181988f, 0.071515f, + -0.016005f, -0.032932f, 0.222868f, 0.073917f, 0.058885f, 0.193284f, -0.021177f, -0.037007f, 0.058027f, -0.128084f, -0.160875f, -0.042143f, -0.137885f, -0.121628f, 0.025301f, 0.027685f, 0.054704f, 0.169111f, 0.147923f, 0.091372f, 0.105804f, 0.022019f, -0.085083f, -0.089088f, -0.113181f, -0.152452f, -0.073104f, -0.037201f, -0.053618f, 0.048840f, 0.147164f, 0.099735f, 0.094220f, 0.082421f, -0.057406f, 0.005118f, 0.011821f, -0.094694f, -0.026192f, -0.013995f}, + {0.010523f, 0.001233f, -0.009159f, -0.002329f, -0.002385f, -0.001025f, -0.002392f, 0.004557f, 0.010740f, 0.001637f, 0.008729f, 0.003248f, -0.002100f, -0.004759f, 0.004082f, -0.001445f, 0.008632f, 0.006097f, -0.002946f, -0.005422f, -0.006346f, 0.003188f, -0.002123f, 0.000742f, -0.004603f, -0.001929f, -0.001176f, 0.003696f, -0.004506f, 0.003654f, -0.001447f, -0.005044f, 0.006486f, 0.006559f, 0.001073f, 0.002454f, 0.001303f, -0.001286f, -0.004234f, -0.013756f, 0.003805f, -0.004438f, 0.004191f, -0.004394f, -0.005325f, 0.003961f, -0.004692f, 0.002290f, 0.002512f, -0.009690f, 0.000403f, 0.001455f, 0.002411f, -0.003813f, 0.005131f, -0.005090f, -0.003276f, -0.001706f, -0.002315f, 0.003380f, -0.000562f, 0.001633f, 0.002908f, 0.004279f, -0.000754f, -0.004583f, -0.004632f, 0.000302f, -0.009714f, -0.004214f, -0.000897f, 0.008788f, 0.002650f, 0.003527f, 0.002741f, 0.004923f, -0.002073f, 0.004902f, 0.008563f, -0.006586f, -0.005715f, -0.008775f, 0.007741f, 0.003805f, 0.000573f, 0.011506f, -0.001274f, -0.000253f, -0.003666f, -0.002982f, 0.002406f, -0.003214f, -0.006168f, 0.003297f, 0.000866f, 0.009591f, + 0.013137f, -0.003560f, -0.007919f, -0.009718f, -0.000727f, -0.005604f, -0.005419f, -0.003743f, -0.000865f, -0.007765f, 0.007242f, -0.002854f, -0.003024f, -0.005176f, -0.003868f, 0.001298f, 0.008143f, -0.000979f, -0.002533f, 0.002385f, -0.008284f, 0.005985f, -0.005228f, -0.018367f, 0.008891f, 0.005891f, 0.009887f, 0.010302f, 0.001812f, 0.005362f, -0.005627f, 0.001415f, 0.007709f, 0.000480f, -0.000301f, -0.002044f, -0.001271f, 0.004093f, -0.004095f, -0.002936f, -0.000066f, 0.003867f, -0.003639f, -0.004342f, -0.006433f, 0.007616f, 0.002721f, 0.000747f, -0.002349f, -0.008067f, -0.000812f, 0.005527f, 0.002940f, -0.001545f, -0.002417f, 0.005114f, -0.002144f, -0.027383f, 0.014247f, -0.001369f, 0.000378f, 0.004943f, 0.006964f, -0.010213f, -0.001328f, -0.001849f, 0.005782f, 0.002194f, -0.006274f, 0.019442f, -0.002126f, -0.001223f, 0.008615f, 0.007092f, 0.002278f, 0.004917f, 0.015835f, -0.007878f, 0.000447f, -0.004023f, 0.001536f, -0.004904f, 0.000339f, 0.000482f, 0.001724f, -0.008833f, 0.000693f, -0.002132f, -0.003388f, -0.000393f, 0.005468f, -0.003071f, 0.005074f, 0.007486f, -0.013030f, 0.001727f, + -0.005355f, -0.001451f, -0.008070f, 0.003954f, -0.004838f, -0.000836f, -0.002787f, -0.008125f, 0.002968f, -0.005465f, 0.003557f, 0.001994f, -0.004155f, -0.005938f, 0.000026f, 0.005424f, 0.003941f, 0.009889f, 0.004403f, -0.004373f, -0.012434f, -0.000908f, 0.001912f, 0.015299f, -0.005050f, -0.002475f, -0.000480f, -0.003175f, -0.008387f, -0.004058f, -0.007894f, -0.001321f, 0.005698f, -0.001866f, 0.006745f, 0.003974f, 0.002907f, 0.003360f, -0.004609f, 0.020586f, 0.011022f, -0.002621f, -0.007444f, 0.012048f, -0.012753f, -0.001611f, 0.008022f, -0.004895f, -0.003381f, -0.005128f, 0.013787f, -0.004026f, 0.004668f, 0.001731f, 0.004619f, 0.018650f, -0.017514f, 0.006021f, 0.009660f, -0.005398f, -0.016165f, -0.008096f, -0.000554f, 0.001697f, -0.001784f, -0.002377f, 0.007617f, 0.010872f, -0.000245f, -0.006567f, 0.001146f, -0.008490f, 0.003335f, -0.005069f, 0.003844f, 0.011607f, 0.004608f, -0.010244f, 0.000326f, 0.001399f, 0.016949f, 0.003799f, 0.008800f, -0.001586f, 0.004259f, 0.003646f, -0.019098f, 0.001127f, 0.010004f, 0.005167f, 0.011120f, -0.008398f, -0.005021f, -0.008325f, 0.003186f, 0.006855f, + -0.001191f, 0.003001f, 0.001220f, -0.003588f, 0.002483f, -0.002368f, 0.003888f, 0.004165f, 0.000089f, 0.006140f, 0.001788f, 0.000742f, 0.002965f, 0.013420f, 0.003046f, 0.008167f, 0.008640f, 0.041812f, -0.010028f, -0.003261f, -0.005626f, 0.009006f, 0.006265f, 0.014586f, 0.006216f, -0.001523f, 0.007382f, 0.000235f, 0.008190f, 0.003426f, 0.011133f, 0.000720f, 0.009464f, 0.011892f, -0.011949f, 0.002736f, 0.003990f, 0.002560f, 0.002723f, 0.003258f, -0.006784f, 0.000393f, -0.007913f, -0.000860f, 0.000450f, -0.014308f, -0.009201f, 0.004027f, 0.000723f, -0.000186f, 0.006643f, 0.006036f, -0.002176f, -0.012376f, 0.004619f, 0.011666f, 0.008351f, 0.010870f, -0.002017f, 0.005950f, 0.011423f, -0.017423f, 0.006457f, 0.007867f, -0.007800f, 0.010977f, -0.006671f, -0.001540f, 0.001999f, 0.002153f, -0.004914f, 0.005107f, -0.000584f, -0.002079f, -0.005112f, -0.005133f, 0.007101f, 0.005900f, 0.003791f, 0.005725f, 0.010441f, 0.004742f, 0.014138f, -0.003257f, -0.013541f, 0.013562f, 0.003522f, 0.006156f, 0.004242f, -0.003462f, 0.005146f, 0.001357f, 0.002380f, 0.007935f, 0.017481f, -0.021719f, + 0.013133f, 0.002209f, 0.013446f, 0.002594f, -0.008893f, 0.001948f, 0.010124f, -0.013806f, -0.003678f, 0.000861f, -0.015736f, -0.003550f, -0.012331f, -0.007567f, -0.009266f, -0.009674f, 0.002869f, -0.014699f, -0.009808f, -0.011798f, -0.003923f, 0.010392f, 0.002853f, -0.014035f, -0.006386f, -0.014631f, -0.004640f, 0.002679f, 0.019206f, -0.016792f, 0.005533f, -0.004533f, -0.007241f, -0.012552f, -0.000690f, 0.001793f, 0.011761f, 0.006607f, 0.000309f, -0.011306f, -0.020622f, -0.000463f, 0.004227f, 0.014981f, 0.003811f, 0.004759f, -0.012685f, 0.004037f, 0.007918f, 0.000750f, -0.000135f, -0.005902f, -0.007597f, -0.001850f, 0.003786f, 0.001220f, -0.005636f, 0.000442f, -0.014160f, -0.001321f, -0.012308f, 0.007102f, -0.004213f, 0.007266f, -0.012287f, -0.007642f, -0.016223f, -0.000385f, -0.011360f, -0.002225f, 0.001076f, -0.011276f, -0.008454f, 0.005058f, 0.005095f, -0.008884f, -0.051093f, 0.008031f, 0.005660f, -0.014892f, -0.003413f, -0.000265f, 0.000383f, -0.003031f, -0.005001f, -0.003992f, -0.015237f, 0.011410f, -0.007421f, 0.001355f, -0.012682f, -0.004747f, 0.018175f, 0.016249f, -0.010531f, -0.006617f, + 0.000492f, -0.000596f, -0.008625f, -0.010348f, -0.007121f, 0.000866f, 0.000787f, -0.000035f, -0.001016f, 0.003902f, -0.012394f, 0.003518f, 0.000473f, -0.022299f, -0.002572f, -0.006947f, 0.010100f, 0.014249f, 0.002378f, -0.002986f, 0.000804f, -0.013267f, -0.015974f, 0.008200f, 0.016052f, 0.017291f, -0.004636f, 0.002789f, 0.010501f, 0.010220f, -0.005356f, 0.009388f, 0.016226f, -0.001133f, 0.013699f, 0.010985f, -0.013253f, 0.003945f, 0.000990f, 0.014017f, -0.008660f, -0.009906f, 0.008554f, 0.010541f, -0.003169f, 0.000578f, -0.015669f, 0.010800f, -0.008713f, 0.011484f, -0.019615f, 0.001939f, 0.004714f, 0.009364f, 0.000553f, -0.008077f, -0.016634f, -0.020177f, 0.006549f, -0.017876f, 0.021617f, 0.020795f, 0.000193f, -0.029176f, 0.011442f, 0.001213f, -0.005833f, 0.019429f, -0.000391f, -0.017539f, -0.002305f, 0.021170f, -0.027545f, 0.000462f, -0.007264f, -0.021743f, -0.006440f, 0.000007f, -0.004711f, -0.011313f, 0.005784f, -0.009430f, 0.006846f, -0.008082f, -0.014996f, 0.007355f, -0.001617f, 0.010731f, -0.022086f, 0.008447f, 0.016403f, -0.007155f, 0.000835f, 0.016711f, 0.024355f, -0.006954f, + -0.005666f, -0.021321f, 0.000643f, -0.017639f, -0.002010f, -0.012366f, -0.000006f, 0.001393f, 0.009453f, 0.004538f, 0.008574f, -0.006921f, 0.001052f, 0.005433f, -0.001747f, 0.022743f, -0.015938f, -0.007790f, 0.029579f, 0.030163f, -0.006703f, -0.002137f, -0.019800f, -0.009953f, 0.000225f, -0.005471f, -0.013395f, 0.018215f, 0.004865f, -0.004885f, 0.026119f, 0.005185f, -0.013774f, -0.000291f, -0.025599f, -0.012169f, -0.014842f, 0.024345f, -0.006614f, -0.000361f, 0.016711f, -0.004095f, 0.009817f, -0.005517f, -0.021507f, -0.001431f, -0.000132f, -0.004425f, -0.012829f, -0.014147f, 0.007169f, -0.011200f, 0.019576f, -0.006081f, -0.014566f, 0.012247f, 0.024587f, -0.006150f, 0.006705f, -0.006647f, 0.014070f, 0.000354f, -0.030461f, 0.010792f, 0.016444f, 0.001728f, -0.005360f, -0.017478f, 0.014351f, 0.009920f, 0.009087f, 0.002014f, 0.005558f, 0.019783f, -0.014344f, 0.002560f, 0.003377f, -0.010847f, -0.021722f, 0.020322f, 0.010689f, 0.037727f, -0.002509f, 0.016720f, -0.006166f, -0.011678f, 0.001318f, -0.001706f, -0.001280f, -0.003218f, -0.013062f, 0.027150f, -0.000256f, 0.002258f, 0.002860f, -0.003620f, + 0.021161f, 0.002964f, 0.017436f, 0.007897f, 0.001836f, 0.019999f, -0.010832f, -0.022212f, -0.006044f, 0.004151f, 0.001001f, -0.009277f, 0.008700f, -0.006817f, -0.033817f, 0.002274f, 0.003013f, -0.018541f, 0.020792f, -0.031843f, 0.006387f, 0.015687f, 0.022892f, -0.022015f, -0.002305f, 0.016562f, 0.011879f, 0.014272f, 0.003372f, 0.029046f, 0.006235f, 0.012606f, -0.002453f, 0.002622f, 0.012633f, 0.007311f, 0.014431f, 0.002015f, -0.017503f, -0.026141f, 0.015446f, 0.007905f, -0.004069f, 0.004134f, 0.009184f, -0.024404f, 0.001353f, -0.015053f, 0.008616f, 0.000071f, 0.017764f, -0.004386f, 0.008589f, -0.002900f, 0.005490f, 0.003210f, 0.000503f, 0.010291f, 0.013721f, 0.005408f, 0.008491f, -0.018929f, 0.009508f, -0.002570f, -0.033313f, -0.022083f, 0.007258f, -0.024366f, -0.000341f, 0.021827f, -0.013804f, 0.042446f, 0.016515f, -0.007446f, 0.024103f, 0.001970f, -0.005740f, -0.015850f, -0.014873f, -0.022153f, -0.001753f, 0.014383f, -0.014538f, -0.001148f, 0.017082f, 0.007737f, 0.010772f, 0.031346f, 0.006349f, 0.020850f, 0.003119f, 0.004969f, -0.029144f, 0.010433f, 0.006488f, -0.017245f, + -0.000614f, 0.010632f, -0.000233f, 0.007404f, -0.017617f, 0.013468f, -0.001131f, 0.003777f, 0.012665f, -0.023900f, -0.016316f, 0.004063f, -0.000342f, 0.012734f, 0.026798f, -0.002777f, 0.006683f, 0.028479f, -0.010692f, -0.019860f, -0.001113f, 0.020723f, -0.004558f, -0.024702f, 0.001966f, 0.008535f, -0.004759f, -0.008075f, -0.001770f, 0.030717f, -0.005932f, 0.026331f, 0.020317f, 0.023934f, 0.001357f, 0.001368f, 0.014325f, 0.004127f, -0.004987f, 0.004321f, -0.019442f, 0.013850f, 0.024520f, 0.014567f, 0.002048f, 0.012793f, -0.010859f, 0.009542f, -0.010595f, 0.014332f, -0.014028f, -0.000882f, -0.001295f, -0.002325f, 0.043454f, -0.007888f, -0.002738f, -0.005274f, 0.005706f, 0.010443f, 0.022552f, 0.024507f, -0.014915f, 0.004354f, 0.025448f, -0.016819f, -0.019079f, 0.008528f, -0.009039f, 0.008526f, 0.048458f, -0.026821f, 0.001416f, 0.000653f, -0.015850f, -0.003379f, -0.017384f, -0.027178f, -0.020978f, -0.028282f, -0.011118f, 0.002566f, 0.021814f, 0.015889f, 0.005578f, 0.022807f, 0.006672f, 0.013680f, 0.012814f, -0.006982f, 0.019973f, 0.021340f, 0.015235f, -0.030370f, -0.016917f, -0.017898f, + 0.006223f, -0.012583f, 0.000594f, 0.007708f, -0.008836f, -0.021724f, 0.013373f, -0.010730f, 0.004655f, 0.003686f, 0.021246f, -0.023137f, 0.034556f, -0.035108f, 0.035331f, -0.000981f, 0.017717f, -0.018113f, 0.006234f, -0.039232f, -0.021298f, -0.019617f, 0.016916f, 0.006738f, 0.024539f, -0.003502f, 0.000028f, -0.013523f, -0.030526f, 0.018881f, -0.016561f, -0.009903f, 0.014829f, 0.033556f, 0.033950f, 0.014498f, -0.001919f, -0.024135f, 0.013780f, -0.036400f, -0.002294f, -0.021343f, 0.011757f, 0.036218f, -0.035701f, 0.011607f, 0.017415f, -0.024208f, -0.001597f, -0.005569f, 0.013288f, -0.016651f, -0.020958f, 0.002791f, -0.008767f, -0.031659f, -0.027311f, -0.031606f, -0.010212f, 0.017298f, -0.024567f, 0.013164f, -0.033056f, -0.007516f, -0.013774f, -0.012978f, -0.026525f, -0.004191f, -0.010949f, -0.016910f, 0.010276f, -0.018639f, 0.016250f, 0.001728f, 0.012360f, -0.024031f, -0.042648f, -0.005518f, 0.006914f, -0.019330f, -0.014119f, 0.004552f, 0.003858f, -0.022309f, -0.011014f, 0.026382f, 0.012455f, -0.006035f, 0.014250f, 0.038789f, 0.000093f, 0.002870f, 0.002879f, -0.005503f, -0.001967f, 0.003630f, + 0.004253f, -0.034052f, -0.012688f, -0.041113f, -0.013354f, -0.038570f, -0.018069f, -0.000689f, 0.040996f, 0.016907f, -0.021792f, -0.027230f, 0.014762f, 0.030326f, 0.020160f, -0.017833f, 0.024710f, -0.012779f, -0.002558f, -0.047794f, -0.013775f, -0.009112f, -0.005872f, -0.034036f, -0.049049f, 0.011896f, -0.000087f, -0.039787f, 0.009423f, 0.051512f, 0.008002f, 0.001413f, -0.034035f, -0.008890f, 0.001749f, 0.000544f, -0.034888f, 0.022490f, -0.034394f, -0.007092f, 0.007898f, -0.016521f, 0.039066f, -0.032528f, -0.033812f, -0.027193f, 0.037674f, 0.017071f, -0.022533f, -0.019801f, -0.013790f, -0.004008f, -0.012530f, -0.012123f, 0.001253f, 0.014452f, 0.036951f, -0.003889f, 0.015297f, 0.014286f, 0.012773f, -0.024753f, -0.032214f, -0.022113f, 0.025389f, -0.004092f, 0.030981f, 0.011135f, -0.004592f, -0.043145f, -0.036773f, -0.003058f, 0.001700f, -0.024669f, -0.017143f, -0.011164f, -0.013533f, -0.056538f, -0.013913f, -0.013130f, -0.022212f, -0.009176f, -0.015160f, -0.025301f, 0.016759f, 0.036884f, 0.018032f, 0.002176f, 0.019150f, 0.028150f, -0.011695f, 0.009898f, 0.004569f, 0.004149f, -0.003551f, -0.005227f, + 0.016224f, 0.009356f, 0.028765f, -0.005422f, 0.000015f, 0.013401f, 0.058834f, 0.001644f, 0.029283f, 0.044574f, -0.007969f, -0.033327f, -0.001879f, 0.040259f, -0.000780f, -0.025848f, -0.036112f, -0.026584f, 0.038116f, 0.028587f, -0.056005f, 0.021703f, 0.026471f, -0.007321f, 0.020023f, 0.059062f, 0.007536f, 0.015520f, -0.016654f, 0.016054f, -0.017775f, -0.010131f, -0.008120f, 0.007223f, 0.017312f, 0.023288f, -0.000004f, 0.011463f, -0.003218f, -0.000253f, -0.007942f, 0.018042f, 0.055759f, -0.014038f, -0.014185f, 0.022232f, 0.016238f, 0.005214f, -0.035604f, 0.028273f, -0.027806f, 0.020974f, 0.024934f, 0.005877f, 0.008470f, -0.002880f, 0.039250f, 0.031062f, 0.003194f, 0.022106f, -0.011681f, 0.027004f, 0.006801f, 0.030094f, 0.041432f, 0.002935f, 0.012690f, -0.001147f, -0.011268f, 0.002999f, 0.019755f, 0.023033f, -0.033819f, -0.018137f, 0.011658f, 0.044366f, -0.016298f, 0.031099f, 0.020923f, 0.009926f, -0.039660f, 0.010231f, 0.010021f, -0.045824f, 0.033648f, -0.022914f, -0.030335f, -0.058529f, 0.019786f, 0.046182f, -0.013295f, -0.028266f, 0.012763f, 0.052975f, 0.034000f, 0.013887f, + 0.040148f, 0.028859f, -0.010610f, -0.080052f, 0.008954f, 0.039018f, 0.018644f, 0.007859f, -0.035091f, -0.001049f, -0.024256f, 0.004691f, -0.002482f, 0.005621f, 0.011845f, 0.015621f, 0.007046f, -0.044252f, 0.024997f, -0.007163f, 0.007621f, 0.031556f, 0.012728f, 0.004838f, -0.011582f, 0.039299f, -0.001231f, 0.038981f, -0.048843f, -0.015948f, 0.015973f, -0.030202f, -0.024363f, 0.000067f, -0.006046f, -0.024143f, 0.003089f, 0.033886f, -0.000673f, 0.000456f, -0.018202f, -0.041043f, -0.024265f, -0.013251f, 0.016850f, -0.006491f, 0.004491f, -0.021493f, -0.020106f, -0.012639f, 0.031884f, -0.023868f, 0.018767f, 0.009402f, 0.010999f, 0.000723f, -0.031150f, -0.048679f, -0.002703f, 0.027662f, -0.036992f, 0.015243f, -0.031668f, 0.017232f, -0.033350f, -0.005194f, -0.032863f, 0.044571f, -0.042895f, -0.030086f, 0.012378f, 0.003917f, 0.022900f, 0.014246f, -0.010945f, -0.009262f, 0.013334f, -0.066704f, -0.008581f, 0.021296f, 0.005976f, -0.015111f, -0.023157f, 0.003269f, -0.021963f, -0.001102f, -0.034467f, 0.034274f, -0.012264f, 0.021856f, -0.045116f, -0.025107f, 0.000072f, 0.057633f, -0.045254f, -0.002924f, + -0.035193f, -0.027713f, -0.007766f, 0.036561f, -0.007190f, 0.016876f, 0.017637f, -0.017641f, -0.039115f, 0.057813f, 0.025727f, -0.031174f, 0.007370f, 0.005416f, 0.016728f, -0.030232f, 0.029389f, -0.001175f, -0.058065f, 0.007631f, 0.013015f, 0.016688f, -0.047871f, -0.010276f, 0.007396f, 0.044746f, 0.009461f, 0.025676f, -0.062023f, -0.036803f, 0.020709f, 0.001755f, 0.042629f, -0.009220f, -0.005617f, 0.005118f, 0.022385f, 0.021308f, 0.008762f, -0.078257f, 0.024120f, -0.006996f, 0.019887f, 0.045451f, -0.012088f, -0.001031f, -0.047547f, 0.018960f, 0.023577f, -0.022384f, -0.014034f, 0.048215f, 0.071034f, 0.022763f, 0.011535f, -0.014535f, -0.058942f, -0.038845f, -0.013923f, -0.001440f, -0.033928f, 0.025446f, -0.069491f, 0.002507f, -0.042972f, 0.021043f, -0.016439f, -0.047680f, -0.004946f, -0.013444f, -0.017297f, -0.054181f, -0.039727f, 0.010344f, 0.041312f, -0.029048f, 0.051192f, -0.045051f, -0.029843f, 0.008715f, -0.005051f, 0.022822f, -0.015424f, -0.016189f, -0.022166f, -0.006736f, -0.073585f, -0.021701f, 0.001471f, -0.003863f, -0.012766f, -0.029375f, 0.022321f, -0.026043f, 0.038405f, -0.012681f, + -0.005357f, -0.028194f, -0.025886f, -0.048844f, -0.021431f, 0.017343f, 0.007005f, -0.003359f, 0.002901f, -0.017761f, -0.013319f, -0.022726f, -0.018916f, 0.009577f, 0.014310f, 0.006541f, -0.041892f, 0.047867f, 0.006674f, -0.020881f, 0.038709f, 0.027500f, 0.046231f, -0.008561f, 0.027346f, -0.062471f, -0.033060f, -0.058874f, 0.061431f, -0.018921f, -0.040597f, -0.039764f, -0.083993f, -0.035047f, 0.061916f, -0.002859f, -0.027766f, 0.014855f, 0.074460f, 0.095565f, -0.009716f, -0.043121f, -0.010785f, -0.016547f, -0.043783f, 0.018183f, 0.000495f, -0.031588f, 0.091061f, 0.031541f, -0.022528f, -0.063931f, -0.006522f, 0.015107f, 0.015891f, 0.018438f, 0.043016f, -0.012811f, -0.022651f, 0.020485f, -0.080643f, -0.053345f, -0.021832f, -0.005795f, 0.007482f, -0.042587f, -0.039968f, 0.040957f, 0.031431f, -0.025045f, -0.049418f, 0.030644f, -0.000347f, 0.054054f, -0.045237f, -0.009994f, -0.016328f, -0.002611f, -0.036128f, -0.051610f, 0.042043f, -0.031925f, -0.021766f, -0.039364f, -0.010389f, 0.026338f, 0.022961f, -0.015726f, 0.001818f, 0.004830f, 0.031124f, 0.050476f, 0.035269f, -0.064158f, -0.032710f, -0.037991f, + -0.011367f, 0.022140f, 0.006205f, -0.043903f, -0.065118f, 0.053671f, 0.001582f, -0.052693f, -0.089017f, 0.043679f, -0.012967f, 0.023013f, 0.020594f, 0.021920f, 0.002497f, 0.014789f, -0.033078f, -0.017667f, 0.009090f, 0.034252f, 0.042273f, -0.051220f, -0.042918f, 0.124006f, -0.009434f, -0.011500f, -0.018010f, -0.038377f, -0.003738f, 0.045141f, 0.072074f, -0.032339f, -0.019404f, -0.006623f, -0.032057f, -0.007448f, -0.017852f, 0.029126f, -0.028916f, 0.033264f, 0.016043f, -0.010453f, -0.040521f, -0.002259f, -0.016375f, 0.062386f, -0.033303f, -0.000020f, 0.000660f, -0.005302f, 0.028446f, -0.016879f, -0.001732f, 0.013721f, -0.007817f, -0.059217f, 0.031338f, -0.026463f, -0.031101f, -0.006288f, -0.033177f, -0.018618f, -0.060823f, 0.060060f, 0.003539f, -0.038087f, -0.071281f, 0.043258f, -0.041601f, -0.040280f, 0.001630f, -0.031022f, 0.015785f, 0.028085f, 0.083403f, -0.021837f, 0.033612f, -0.005325f, -0.038039f, -0.032053f, -0.007957f, 0.125282f, -0.106743f, -0.006096f, 0.116002f, -0.101802f, -0.036287f, 0.060533f, -0.004858f, -0.044727f, 0.114419f, -0.052017f, -0.016390f, 0.060481f, -0.072153f, 0.068926f, + -0.009206f, -0.039269f, 0.038072f, 0.014809f, -0.004468f, 0.009738f, 0.007079f, -0.005793f, 0.015297f, -0.012114f, -0.016375f, -0.006210f, -0.023528f, -0.019193f, -0.046137f, -0.016231f, 0.043904f, 0.041566f, -0.057871f, 0.022472f, 0.034260f, 0.029134f, -0.007996f, -0.057002f, -0.002999f, -0.026966f, -0.067146f, 0.046356f, 0.113856f, -0.061420f, -0.004440f, 0.081743f, -0.019950f, -0.025601f, 0.066879f, 0.050431f, 0.026197f, -0.023180f, -0.049103f, 0.020120f, -0.018333f, -0.029825f, 0.119369f, 0.088757f, -0.067354f, -0.048645f, 0.065969f, -0.111545f, -0.037237f, -0.029141f, -0.016532f, 0.083763f, 0.056773f, 0.038785f, 0.042117f, -0.130960f, -0.043282f, 0.132636f, 0.078454f, 0.019656f, -0.030022f, 0.049044f, -0.040638f, -0.086416f, -0.056037f, 0.050478f, -0.027803f, -0.000627f, 0.058371f, 0.103819f, -0.003666f, -0.044500f, 0.018027f, 0.051667f, -0.113109f, 0.050477f, 0.001637f, -0.010636f, 0.059586f, -0.008889f, -0.043083f, 0.023270f, 0.021338f, 0.058266f, 0.033516f, -0.029882f, 0.002770f, 0.009900f, 0.040311f, 0.010144f, -0.043995f, -0.000684f, -0.001449f, 0.010256f, -0.040826f, -0.044721f, + 0.067484f, -0.022851f, -0.068193f, 0.036731f, 0.062752f, -0.033591f, -0.010587f, 0.005090f, 0.043425f, -0.049318f, -0.064903f, 0.019193f, 0.057116f, -0.011072f, -0.022530f, -0.012777f, -0.012304f, 0.025327f, 0.011701f, 0.015536f, 0.142172f, 0.008785f, -0.016570f, 0.002915f, 0.005893f, 0.077021f, 0.003932f, -0.026068f, 0.018721f, -0.058505f, -0.033249f, 0.016325f, 0.002052f, 0.066226f, 0.053736f, -0.032751f, -0.007855f, -0.030973f, 0.003635f, 0.024132f, 0.008258f, 0.007875f, 0.025986f, -0.016356f, -0.066372f, 0.017925f, 0.049968f, -0.022026f, 0.045036f, -0.064377f, 0.034796f, 0.018507f, -0.050279f, 0.008006f, 0.008500f, -0.022033f, 0.035526f, -0.077503f, -0.246333f, -0.290766f, -0.029615f, -0.202794f, 0.074387f, 0.481573f, 0.257237f, 0.390458f, 0.411570f, -0.048837f, -0.123547f, 0.031848f, -0.306396f, -0.373475f, -0.118104f, -0.410737f, -0.330674f, 0.079319f, -0.238933f, -0.067603f, 0.464840f, 0.166171f, 0.327535f, 0.568958f, 0.336902f, 0.148970f, 0.112212f, 0.037212f, -0.258731f, -0.320758f, -0.108456f, -0.436824f, -0.437544f, 0.054007f, -0.328087f, -0.269392f, 0.156520f, -0.276046f, + -0.284240f, 0.209026f, 0.082707f, -0.041548f, 0.497022f, 0.465836f, 0.295989f, 0.632666f, 0.595563f, 0.202160f, 0.235419f, 0.183577f, -0.303999f, -0.303979f, -0.384388f, -0.758024f, -0.894930f, -0.643369f, -0.640880f, -0.472231f, 0.015292f, 0.043676f, 0.311361f, 0.539493f, 0.664786f, 0.607021f, 0.704483f, 0.605433f, 0.359743f, 0.245404f, 0.088322f, -0.106947f, -0.250885f, -0.358890f, -0.297171f, -0.433306f, -0.462534f, -0.278542f, -0.133698f, -0.066015f} + }, + { + {-0.000387f, 0.003966f, 0.004430f, 0.012898f, -0.001574f, 0.002067f, 0.001524f, -0.000787f, 0.007292f, 0.005492f, -0.010060f, -0.005690f, -0.009159f, -0.005399f, -0.001026f, -0.006505f, 0.000105f, 0.000704f, 0.000466f, -0.000907f, -0.000582f, -0.008937f, -0.001421f, 0.002066f, 0.003452f, -0.004293f, 0.005535f, 0.001699f, -0.004441f, -0.002937f, 0.001016f, 0.005526f, -0.001841f, -0.001914f, -0.002757f, -0.007439f, 0.001494f, -0.009652f, -0.000804f, -0.004791f, -0.004409f, -0.003184f, 0.002028f, -0.003266f, -0.005482f, -0.003852f, -0.000562f, -0.002800f, -0.007660f, -0.003264f, -0.002159f, -0.001943f, -0.005691f, 0.000797f, -0.002763f, 0.006634f, 0.001325f, -0.007673f, -0.004419f, 0.009380f, -0.002790f, 0.002623f, -0.005097f, 0.002508f, 0.004292f, 0.003953f, -0.006923f, 0.003582f, 0.004978f, 0.003624f, -0.000348f, -0.004138f, -0.002657f, -0.003767f, 0.002586f, -0.001166f, 0.001968f, -0.017090f, -0.020271f, 0.009721f, 0.000125f, 0.014906f, 0.005068f, 0.006342f, 0.003847f, 0.005807f, -0.000696f, -0.000622f, -0.003988f, -0.010478f, -0.006351f, 0.002273f, -0.001054f, -0.002253f, -0.001759f, 0.004966f, + 0.003592f, -0.000320f, 0.004243f, -0.004886f, -0.012046f, 0.003284f, -0.003275f, 0.000928f, -0.006462f, 0.004235f, -0.005417f, -0.002731f, -0.002541f, 0.007877f, -0.002602f, -0.000415f, -0.004107f, -0.001258f, -0.009965f, 0.002817f, -0.002282f, 0.004708f, -0.005137f, 0.000302f, -0.002831f, -0.007722f, 0.001593f, -0.001013f, -0.002800f, 0.003049f, 0.005308f, -0.001521f, -0.004584f, -0.011125f, 0.000133f, -0.006702f, 0.002117f, -0.000115f, -0.005108f, -0.000382f, -0.002749f, -0.001723f, -0.008837f, 0.004885f, -0.007990f, 0.003661f, -0.003818f, -0.004827f, -0.005093f, -0.008540f, 0.003403f, 0.000239f, 0.001005f, 0.004808f, -0.006757f, -0.008895f, 0.003983f, -0.028955f, 0.000000f, -0.003549f, 0.008010f, 0.000496f, 0.003262f, -0.002059f, 0.004120f, 0.001121f, 0.003632f, -0.003000f, 0.019176f, -0.003710f, -0.002397f, -0.007701f, 0.002975f, -0.009371f, -0.002898f, 0.001178f, -0.004524f, 0.000394f, 0.007168f, 0.004449f, 0.002860f, 0.005166f, 0.006954f, -0.007691f, -0.002922f, 0.000369f, 0.004484f, -0.007191f, 0.007741f, -0.005908f, -0.003079f, 0.006634f, -0.000965f, 0.002009f, -0.004633f, 0.006220f, + 0.006012f, 0.006932f, -0.009467f, -0.002249f, 0.010562f, 0.000582f, -0.001418f, -0.001581f, 0.011488f, 0.008183f, 0.008915f, 0.000981f, -0.001920f, -0.001760f, -0.000496f, 0.000672f, 0.001412f, 0.004353f, -0.010847f, 0.000023f, -0.004992f, -0.005406f, -0.000734f, 0.003015f, -0.005575f, 0.002749f, -0.004231f, -0.000268f, -0.001632f, 0.001308f, 0.003941f, 0.005101f, -0.001805f, 0.000472f, -0.002218f, -0.006869f, -0.001573f, 0.010296f, 0.012132f, -0.007861f, 0.001402f, -0.006657f, 0.011150f, 0.002319f, -0.004113f, -0.005996f, -0.005244f, -0.000839f, 0.001730f, 0.003197f, 0.014736f, -0.008215f, -0.000990f, -0.003062f, 0.006007f, -0.015716f, -0.001498f, 0.010571f, 0.000104f, 0.008939f, 0.004198f, 0.007240f, 0.007582f, 0.003468f, -0.000992f, -0.007186f, 0.002909f, -0.001753f, 0.001389f, 0.012332f, 0.003462f, 0.010641f, -0.004939f, -0.002429f, 0.001255f, -0.013428f, 0.002105f, 0.010725f, -0.002530f, 0.001377f, -0.008113f, 0.006952f, 0.000400f, 0.003343f, -0.009654f, 0.006482f, -0.006271f, -0.003340f, -0.006547f, -0.007910f, 0.005516f, 0.002196f, -0.002032f, -0.003731f, -0.003336f, -0.002375f, + -0.001241f, 0.005447f, -0.003863f, -0.007821f, -0.012244f, 0.013017f, 0.010408f, 0.001418f, -0.012018f, 0.005043f, -0.004972f, 0.006393f, -0.002655f, 0.002367f, -0.006023f, -0.003335f, -0.007541f, -0.002354f, 0.005155f, 0.049793f, -0.018495f, 0.022308f, -0.017729f, 0.001521f, 0.005287f, 0.005236f, -0.014642f, -0.004968f, -0.004928f, -0.024499f, -0.000150f, 0.001296f, -0.008850f, -0.001429f, -0.000131f, 0.017516f, 0.003209f, -0.012220f, 0.008887f, 0.009738f, 0.002134f, 0.017755f, -0.013251f, -0.004837f, -0.007110f, 0.003744f, 0.014164f, -0.001040f, 0.000828f, 0.005283f, -0.002622f, 0.006345f, 0.002784f, 0.016239f, -0.002551f, 0.006354f, -0.010756f, 0.009696f, -0.007577f, 0.010824f, -0.000331f, -0.011368f, -0.001856f, 0.016355f, -0.000895f, 0.011052f, 0.006465f, 0.010623f, 0.000737f, -0.008482f, -0.007102f, 0.000127f, -0.005368f, 0.008697f, 0.005506f, -0.008726f, 0.000859f, -0.006840f, 0.011175f, -0.003223f, 0.008839f, 0.010977f, 0.001445f, 0.011306f, -0.001096f, -0.005651f, -0.002547f, -0.007188f, -0.000471f, 0.014831f, -0.010377f, -0.009823f, -0.004907f, 0.004009f, -0.005073f, -0.041562f, + 0.004447f, -0.012300f, -0.008829f, -0.013479f, -0.016333f, 0.006320f, 0.014419f, -0.002270f, 0.005545f, 0.002220f, 0.007353f, 0.001614f, 0.000443f, 0.004426f, -0.008993f, 0.020533f, -0.001178f, -0.012065f, 0.013416f, -0.004201f, 0.005632f, -0.013586f, -0.008523f, -0.009643f, 0.004039f, 0.002459f, 0.010472f, 0.000265f, -0.006685f, 0.001053f, -0.005981f, -0.006504f, -0.007270f, -0.002536f, -0.010078f, -0.005097f, 0.009181f, -0.008689f, -0.000720f, -0.006804f, -0.010684f, -0.004749f, 0.001221f, 0.003357f, 0.006614f, -0.005358f, -0.004983f, 0.006609f, 0.001064f, 0.002472f, 0.001672f, 0.004084f, 0.006142f, -0.010151f, -0.003470f, -0.001055f, -0.014264f, 0.003732f, -0.001062f, 0.008276f, -0.008372f, -0.006401f, -0.007814f, 0.001281f, 0.008785f, 0.006731f, 0.015535f, 0.010304f, -0.009562f, 0.003724f, -0.004270f, 0.007079f, 0.004745f, -0.010824f, -0.053484f, 0.013818f, -0.016426f, -0.013804f, -0.010114f, 0.001095f, -0.003422f, 0.030418f, 0.002390f, 0.006752f, -0.004141f, -0.000575f, -0.013452f, 0.011991f, 0.003031f, -0.002553f, 0.001873f, 0.015858f, -0.008978f, -0.003583f, 0.003144f, 0.000425f, + 0.007633f, -0.007970f, -0.003945f, 0.008403f, 0.002663f, 0.007675f, 0.000308f, -0.009692f, -0.006559f, 0.004276f, -0.001585f, -0.003809f, -0.006304f, -0.004007f, -0.001101f, 0.014908f, 0.003221f, -0.003647f, -0.000428f, 0.000343f, -0.005537f, 0.010484f, 0.007871f, -0.003540f, -0.012694f, 0.002118f, -0.007123f, 0.009893f, 0.007506f, -0.009277f, 0.002390f, -0.011767f, -0.010600f, -0.009436f, -0.011641f, -0.004635f, 0.001354f, -0.007389f, -0.000528f, -0.008080f, -0.007139f, 0.011392f, 0.006678f, -0.011536f, -0.015497f, 0.000537f, 0.010637f, -0.010414f, -0.008550f, 0.009088f, 0.006136f, 0.010479f, -0.027969f, -0.002922f, 0.004529f, 0.013352f, -0.002780f, -0.007265f, 0.003032f, 0.019689f, -0.025160f, 0.005612f, -0.005202f, -0.004843f, -0.011382f, 0.006570f, -0.020164f, -0.013264f, 0.006799f, -0.010699f, 0.006256f, 0.028361f, -0.005135f, 0.011331f, -0.013508f, 0.013576f, -0.003645f, 0.003889f, -0.012102f, 0.005398f, 0.003386f, -0.006693f, 0.002815f, -0.001538f, -0.006214f, -0.000650f, 0.007847f, 0.012065f, -0.009623f, -0.015603f, -0.012152f, -0.011517f, 0.001498f, 0.008784f, 0.023949f, -0.000509f, + 0.016159f, 0.016576f, -0.015558f, 0.011795f, -0.022904f, -0.008634f, 0.001570f, -0.010449f, -0.009405f, 0.006169f, -0.022126f, -0.004603f, 0.015664f, -0.006876f, -0.005643f, 0.001870f, -0.006600f, 0.006175f, -0.006526f, 0.010727f, 0.014288f, -0.004011f, 0.004633f, 0.000487f, -0.013924f, 0.001152f, -0.008880f, -0.006395f, -0.010869f, 0.006333f, 0.005352f, -0.010969f, 0.001865f, 0.005787f, 0.066203f, -0.002903f, -0.025752f, -0.002997f, -0.000816f, 0.002750f, 0.008644f, 0.003623f, -0.002665f, -0.002487f, -0.012758f, -0.006015f, 0.007739f, 0.016287f, -0.012803f, -0.008137f, 0.011157f, 0.001019f, -0.003452f, 0.004432f, -0.000621f, -0.015174f, -0.015115f, 0.021250f, -0.001520f, -0.001294f, -0.003074f, 0.010902f, -0.000369f, 0.001146f, 0.007408f, -0.011630f, 0.012799f, 0.005053f, 0.002510f, 0.004598f, 0.012812f, -0.029719f, -0.012719f, -0.007378f, 0.027788f, 0.003290f, 0.002578f, -0.008674f, -0.008705f, 0.007823f, -0.000678f, 0.009060f, -0.002812f, -0.019374f, 0.002587f, 0.001761f, -0.002301f, 0.008548f, 0.004688f, 0.001726f, 0.015672f, 0.035975f, -0.002359f, -0.004113f, 0.014576f, 0.003098f, + -0.003817f, 0.008273f, 0.029176f, -0.004831f, 0.005966f, 0.008451f, 0.008773f, 0.005112f, 0.007970f, 0.005587f, 0.006788f, -0.011410f, 0.011420f, 0.014922f, -0.005431f, 0.013037f, 0.014563f, -0.019149f, -0.005711f, -0.016314f, 0.015642f, 0.029406f, -0.014437f, -0.003666f, -0.016518f, -0.007439f, -0.019932f, 0.013728f, -0.012222f, -0.005277f, -0.001423f, -0.000247f, -0.007993f, -0.010082f, 0.017626f, -0.016519f, -0.006046f, 0.001407f, 0.012025f, 0.012475f, -0.018621f, -0.005922f, 0.007092f, -0.016446f, 0.009042f, -0.013163f, -0.005167f, 0.004149f, 0.000386f, -0.007464f, -0.001895f, 0.003261f, 0.020790f, 0.001991f, 0.004758f, -0.000588f, -0.017633f, 0.018758f, -0.009383f, -0.015161f, 0.011769f, -0.011012f, -0.011548f, 0.014589f, -0.006713f, 0.001250f, -0.003156f, 0.001322f, 0.020319f, -0.004191f, 0.004778f, -0.018334f, -0.001068f, 0.019614f, 0.004913f, 0.019394f, 0.017709f, -0.006585f, -0.004019f, -0.024460f, 0.004074f, -0.004909f, 0.016111f, 0.018141f, -0.010450f, 0.003746f, -0.033995f, -0.010498f, 0.012088f, -0.012984f, 0.018508f, 0.012209f, -0.014886f, 0.005490f, -0.013912f, -0.001236f, + -0.018896f, 0.031783f, -0.009016f, 0.002474f, -0.009698f, -0.028351f, 0.016769f, 0.006153f, -0.021202f, 0.013632f, -0.009444f, -0.006719f, 0.007686f, 0.030177f, -0.014679f, 0.029179f, -0.000392f, -0.019794f, 0.001014f, 0.007162f, -0.017638f, 0.020095f, -0.010160f, 0.015014f, 0.031743f, 0.003581f, -0.014644f, -0.003625f, -0.001574f, 0.007773f, -0.012459f, -0.006313f, -0.001607f, 0.016149f, -0.005486f, -0.005668f, -0.020628f, -0.000088f, -0.024413f, -0.003869f, 0.027763f, -0.005550f, 0.015814f, 0.002201f, 0.004226f, -0.035596f, 0.000501f, -0.022472f, 0.018717f, 0.033380f, 0.010021f, 0.009054f, 0.001984f, 0.005810f, -0.019040f, 0.007692f, 0.010082f, -0.007380f, -0.002442f, -0.006321f, -0.004857f, 0.015976f, 0.000255f, 0.019262f, 0.054483f, 0.021610f, 0.005428f, -0.016705f, -0.017314f, -0.008627f, 0.011131f, -0.013955f, -0.008288f, 0.055545f, -0.032323f, -0.002282f, -0.016802f, -0.030354f, -0.040077f, 0.009269f, -0.013862f, 0.009909f, -0.038024f, 0.005760f, 0.011521f, 0.010318f, -0.016854f, -0.034922f, -0.027924f, -0.023554f, -0.001248f, -0.014270f, -0.026007f, -0.018205f, -0.010106f, -0.021334f, + -0.015490f, 0.001977f, 0.023683f, -0.002020f, 0.002035f, -0.002252f, -0.023778f, 0.012338f, -0.003590f, 0.002690f, -0.006525f, -0.015995f, 0.010939f, -0.019600f, -0.027178f, 0.021688f, -0.026544f, 0.003705f, -0.001775f, -0.036228f, -0.022458f, 0.012518f, -0.002149f, 0.015705f, -0.012694f, -0.038280f, -0.001633f, 0.000248f, 0.012423f, 0.013836f, 0.033332f, -0.021065f, -0.072984f, -0.025896f, -0.025755f, 0.015258f, -0.047923f, -0.016453f, -0.008977f, -0.043314f, -0.015351f, -0.001150f, -0.009114f, -0.008275f, 0.008534f, -0.011573f, -0.001575f, -0.010582f, 0.009866f, -0.024513f, 0.009559f, 0.021524f, -0.022912f, -0.032214f, 0.013819f, 0.017191f, -0.004745f, -0.005438f, -0.015812f, -0.017184f, 0.042570f, 0.016334f, -0.038622f, 0.014667f, -0.020841f, -0.000863f, -0.018940f, -0.039007f, 0.012224f, -0.019670f, -0.008423f, 0.003036f, 0.001486f, -0.008805f, -0.033782f, -0.019594f, 0.016913f, -0.019283f, -0.000412f, -0.016798f, -0.028214f, -0.009286f, 0.031526f, 0.006872f, 0.005621f, -0.025514f, -0.009228f, -0.003611f, -0.003656f, 0.013251f, 0.013658f, 0.019978f, 0.021819f, -0.008432f, 0.012164f, 0.006757f, + -0.013000f, 0.010343f, -0.021705f, -0.015942f, -0.016491f, 0.009739f, -0.019049f, 0.003844f, -0.028472f, -0.021402f, -0.013224f, 0.032246f, 0.021959f, 0.025476f, 0.023542f, -0.018687f, 0.029603f, 0.004915f, 0.013099f, 0.046001f, -0.009625f, -0.003243f, 0.005669f, -0.015342f, 0.007021f, -0.004250f, -0.027476f, 0.009115f, 0.019573f, -0.018752f, -0.019914f, 0.004296f, 0.020398f, -0.009390f, -0.016504f, -0.037560f, 0.041475f, -0.033639f, 0.042970f, 0.023751f, 0.015928f, 0.008656f, 0.016449f, 0.017943f, 0.016515f, 0.046238f, -0.017156f, 0.002608f, -0.003871f, -0.008806f, -0.002168f, 0.005107f, -0.005114f, 0.008311f, -0.003810f, 0.013954f, 0.011538f, -0.003380f, -0.008922f, -0.047528f, -0.017474f, -0.034691f, -0.002391f, 0.017122f, 0.017207f, 0.004959f, 0.008333f, 0.012690f, 0.010260f, 0.012259f, 0.032598f, 0.049141f, 0.032593f, 0.005907f, -0.007321f, -0.010533f, -0.015346f, 0.016582f, 0.016776f, 0.019036f, -0.015923f, -0.012668f, -0.019536f, -0.004044f, 0.023190f, -0.000804f, 0.027967f, -0.018782f, 0.014356f, 0.008280f, 0.024846f, -0.055943f, -0.040630f, -0.017322f, -0.023517f, -0.023854f, + 0.005140f, -0.010629f, 0.032720f, 0.008675f, -0.040308f, -0.004860f, 0.060095f, -0.022822f, 0.017076f, -0.011469f, 0.022915f, -0.014229f, -0.010875f, -0.001607f, -0.027801f, -0.014333f, 0.021563f, 0.008940f, 0.015702f, 0.042202f, 0.002888f, 0.027912f, 0.041261f, 0.028341f, -0.019808f, -0.043635f, -0.002211f, -0.020514f, 0.045355f, 0.012385f, 0.035278f, -0.006051f, -0.020055f, -0.008033f, -0.021805f, 0.007391f, -0.016936f, 0.001017f, -0.018770f, 0.008449f, -0.013892f, -0.006519f, -0.029687f, -0.029723f, -0.003518f, -0.042171f, 0.021900f, 0.014529f, -0.012955f, 0.020062f, -0.010651f, 0.007159f, 0.022880f, -0.027094f, -0.034694f, 0.004989f, -0.007999f, 0.056189f, 0.023825f, -0.063996f, -0.017458f, -0.018997f, -0.032883f, -0.035513f, -0.070634f, 0.011174f, -0.025523f, -0.007830f, 0.009765f, 0.001278f, 0.014220f, -0.004105f, -0.008476f, -0.054595f, 0.006254f, -0.025619f, 0.006572f, 0.029728f, 0.006735f, 0.019371f, -0.031384f, -0.043750f, 0.009053f, 0.024337f, 0.018403f, 0.007896f, 0.017927f, 0.025039f, 0.035755f, 0.032536f, 0.075273f, 0.049443f, 0.069023f, 0.003735f, -0.014530f, -0.048199f, + -0.014663f, 0.007088f, 0.010330f, -0.012163f, -0.037270f, -0.014130f, 0.059626f, 0.023994f, -0.008955f, 0.017502f, -0.001966f, -0.023127f, -0.007060f, -0.015467f, 0.040507f, -0.004212f, 0.001842f, 0.016643f, 0.000607f, 0.018995f, -0.000759f, 0.027317f, -0.026755f, 0.031611f, 0.006113f, -0.016545f, -0.009776f, -0.018239f, 0.029112f, -0.042416f, -0.044857f, 0.026630f, 0.045856f, 0.000708f, 0.031497f, 0.042493f, -0.050086f, 0.014902f, 0.009612f, -0.004390f, -0.000973f, 0.005616f, -0.019134f, 0.032737f, -0.021514f, -0.018593f, 0.013415f, -0.000259f, -0.004313f, -0.010170f, -0.010918f, 0.002733f, -0.033350f, -0.012198f, 0.025732f, -0.034851f, -0.008117f, -0.024552f, 0.000096f, 0.062414f, -0.021320f, 0.000987f, 0.016622f, -0.003226f, -0.016039f, -0.044829f, 0.038707f, 0.013941f, -0.083862f, 0.014449f, 0.016795f, -0.034227f, -0.081667f, 0.072156f, 0.042890f, 0.022699f, 0.015858f, 0.035512f, -0.082444f, 0.033460f, 0.037613f, 0.015971f, -0.052925f, 0.028976f, 0.052800f, 0.024342f, 0.058231f, 0.021069f, 0.000583f, -0.002659f, -0.002292f, -0.010339f, 0.024346f, 0.041268f, 0.039131f, 0.013457f, + -0.012774f, -0.021132f, 0.004307f, -0.019316f, -0.022754f, 0.022680f, 0.015186f, 0.003851f, -0.022945f, -0.022124f, -0.005652f, -0.019372f, 0.008516f, 0.047128f, -0.009636f, -0.016288f, 0.014914f, 0.007784f, 0.012808f, 0.015737f, -0.005186f, -0.010741f, 0.036768f, 0.024253f, 0.010690f, 0.015651f, -0.005205f, -0.039687f, 0.006505f, 0.023812f, 0.000639f, -0.030275f, 0.035055f, 0.007872f, 0.049520f, -0.000356f, 0.043660f, 0.002445f, -0.020172f, -0.008109f, 0.006053f, 0.064223f, -0.014963f, 0.020171f, 0.008885f, 0.026949f, 0.006915f, -0.006225f, -0.015197f, 0.012264f, 0.076650f, -0.010651f, -0.010323f, -0.051870f, 0.059364f, 0.000268f, 0.052713f, 0.002393f, 0.004770f, -0.045638f, -0.013057f, -0.019964f, 0.037049f, 0.010118f, 0.017202f, 0.010441f, -0.034476f, 0.004527f, 0.004321f, -0.030569f, -0.043635f, -0.045182f, 0.017125f, -0.016255f, 0.043538f, 0.003267f, -0.011739f, -0.010081f, 0.010673f, -0.015472f, 0.004362f, 0.013065f, -0.015981f, 0.010645f, 0.015876f, 0.005513f, 0.005802f, 0.032416f, 0.055194f, -0.009844f, 0.001399f, 0.027414f, 0.023829f, 0.032683f, -0.021951f, -0.008841f, + 0.011609f, -0.031490f, 0.005078f, 0.003204f, -0.040448f, 0.055089f, -0.000662f, 0.027951f, 0.025884f, 0.017012f, -0.030209f, 0.003306f, 0.029689f, -0.022253f, 0.051220f, 0.013627f, -0.015830f, 0.040683f, 0.032731f, 0.021368f, -0.066278f, -0.013998f, 0.015632f, -0.023504f, 0.005577f, -0.038396f, -0.007878f, -0.058186f, -0.015298f, -0.009416f, -0.015613f, -0.064867f, -0.008223f, -0.017476f, 0.070446f, 0.033735f, 0.030111f, 0.023363f, -0.010412f, 0.015999f, 0.036687f, 0.035435f, 0.017823f, -0.034564f, -0.040524f, 0.023445f, -0.002187f, 0.017966f, -0.004227f, 0.041381f, -0.024159f, -0.002152f, -0.005711f, 0.036526f, -0.020697f, 0.061271f, 0.074901f, 0.075887f, 0.008507f, -0.009818f, 0.015810f, -0.005824f, 0.021778f, 0.000464f, 0.003708f, -0.017656f, -0.053891f, -0.015826f, -0.051424f, 0.035327f, 0.034131f, -0.030793f, -0.021469f, -0.030907f, -0.011877f, -0.001571f, 0.079924f, 0.004243f, -0.034477f, -0.038208f, 0.001659f, 0.056244f, 0.029463f, -0.102946f, -0.017534f, -0.015594f, 0.018063f, 0.043027f, -0.042064f, -0.011557f, -0.023479f, 0.015028f, -0.059035f, 0.034160f, -0.006731f, 0.001313f, + 0.021057f, 0.005165f, -0.027460f, 0.064465f, -0.003195f, 0.031603f, 0.069065f, 0.137926f, 0.083637f, -0.001039f, 0.046781f, 0.069385f, 0.088572f, 0.094742f, 0.023602f, 0.051044f, 0.020299f, -0.009680f, -0.026819f, 0.039066f, -0.040685f, 0.078089f, -0.005339f, -0.009376f, 0.004652f, 0.063257f, -0.036193f, -0.002509f, 0.001338f, 0.005365f, 0.024328f, -0.010561f, 0.033667f, 0.015532f, -0.003096f, 0.012120f, 0.006127f, 0.029326f, -0.071696f, -0.018148f, 0.000069f, 0.013234f, -0.005126f, -0.048505f, 0.046428f, 0.003238f, 0.008005f, 0.021925f, -0.033464f, -0.010035f, -0.080167f, 0.027897f, -0.017676f, 0.022095f, 0.061076f, -0.009770f, 0.013692f, -0.000860f, 0.029473f, -0.041778f, -0.064563f, 0.064593f, -0.004780f, 0.012535f, 0.010084f, 0.065512f, 0.042129f, 0.058239f, -0.000952f, -0.058292f, 0.039346f, 0.027675f, -0.016458f, -0.014179f, 0.036988f, 0.003071f, 0.046670f, 0.090007f, 0.060001f, 0.021835f, 0.003225f, 0.070722f, -0.014215f, 0.031153f, 0.044957f, -0.018389f, 0.051833f, 0.050168f, 0.015254f, -0.021069f, -0.024737f, -0.030662f, -0.005348f, -0.003460f, -0.103189f, 0.022922f, + -0.017364f, -0.004733f, 0.079961f, 0.033705f, -0.025337f, -0.020348f, -0.000394f, -0.052848f, -0.063577f, 0.004344f, 0.000650f, -0.036890f, 0.038156f, 0.003404f, -0.036407f, 0.021914f, 0.069403f, -0.010610f, -0.039271f, 0.023524f, -0.022819f, -0.027051f, 0.013585f, 0.054436f, -0.017434f, 0.006507f, 0.016302f, -0.019076f, -0.040680f, -0.029257f, 0.056525f, 0.017509f, -0.053271f, 0.044625f, 0.019745f, -0.039551f, -0.017974f, 0.074630f, -0.023287f, -0.061345f, -0.028445f, 0.099735f, -0.098844f, -0.049305f, 0.062058f, -0.029748f, -0.030062f, -0.098892f, 0.077554f, -0.064431f, 0.024802f, 0.000194f, -0.008569f, -0.111675f, -0.028888f, 0.089653f, 0.062018f, -0.076831f, -0.016435f, -0.035338f, -0.011122f, 0.011372f, 0.024353f, 0.020345f, -0.123840f, 0.066139f, 0.058334f, 0.052275f, 0.005381f, 0.025235f, -0.058867f, -0.060126f, 0.110727f, 0.041244f, -0.084115f, 0.015296f, 0.106476f, 0.033657f, 0.012036f, 0.003449f, 0.008650f, 0.045909f, 0.062852f, -0.013710f, 0.012351f, 0.016544f, -0.009931f, 0.037925f, -0.018970f, -0.004884f, -0.014141f, 0.029189f, 0.022215f, -0.011393f, 0.020515f, -0.027887f, + -0.022125f, 0.029069f, -0.017583f, 0.031885f, -0.020138f, -0.009094f, 0.000334f, 0.017506f, -0.000104f, 0.013058f, 0.006206f, 0.032359f, -0.021999f, -0.004456f, 0.001619f, -0.012683f, 0.032154f, 0.027049f, -0.021162f, -0.007839f, -0.012549f, 0.007180f, -0.027563f, 0.015509f, 0.010063f, 0.014209f, -0.010250f, -0.008761f, 0.036639f, -0.042582f, -0.006053f, 0.017837f, -0.010196f, -0.007853f, 0.019883f, -0.052385f, 0.014036f, -0.019068f, 0.004599f, -0.018684f, 0.046710f, -0.014872f, -0.017909f, 0.018405f, -0.008562f, -0.029708f, 0.059289f, -0.001581f, 0.007928f, -0.012631f, -0.019701f, -0.025441f, 0.032278f, -0.030915f, -0.009979f, 0.026240f, -0.080321f, -0.224455f, -0.184641f, 0.095419f, 0.026374f, 0.220224f, 0.394662f, 0.057369f, 0.123475f, 0.043965f, -0.317289f, -0.101364f, -0.215684f, -0.260450f, 0.005906f, 0.039882f, -0.109394f, 0.155065f, 0.203534f, 0.113520f, 0.325427f, 0.186971f, -0.043382f, -0.079049f, -0.152966f, -0.296623f, -0.234394f, -0.070184f, -0.209147f, -0.030446f, 0.178033f, 0.028468f, 0.040461f, 0.269634f, 0.137036f, 0.084088f, 0.281409f, 0.042095f, -0.079266f, 0.109062f, + -0.149251f, -0.294650f, -0.123898f, -0.248799f, -0.310780f, -0.005912f, -0.065792f, -0.082854f, 0.205106f, 0.225923f, 0.143556f, 0.341585f, 0.275648f, 0.129280f, 0.117099f, 0.067179f, -0.229950f, -0.211832f, -0.267625f, -0.353361f, -0.283130f, -0.120038f, -0.082267f, 0.006631f, 0.202540f, 0.246053f, 0.258287f, 0.247356f, 0.230211f, 0.049736f, 0.006617f, -0.036712f, -0.169894f, -0.186156f, -0.100231f, -0.181902f, -0.041978f, 0.022171f, 0.002014f}, + {-0.001329f, 0.002296f, 0.006628f, 0.008642f, 0.000113f, -0.004743f, 0.006038f, 0.003391f, 0.007143f, 0.008806f, -0.003533f, -0.001013f, -0.007112f, 0.003974f, 0.001243f, -0.002997f, -0.008503f, 0.002850f, 0.004328f, 0.005820f, 0.000336f, -0.008059f, -0.004587f, 0.004665f, -0.005540f, 0.004872f, -0.001200f, 0.001632f, 0.001913f, 0.001833f, -0.008173f, 0.002557f, 0.002996f, -0.005618f, -0.009468f, -0.009054f, 0.000491f, 0.000723f, 0.001863f, -0.000543f, 0.000070f, -0.002627f, 0.004379f, -0.000777f, 0.003823f, -0.005796f, -0.000726f, 0.006083f, 0.011223f, 0.000880f, -0.000236f, 0.001456f, 0.006569f, 0.004245f, -0.008038f, 0.002104f, 0.003937f, 0.002497f, 0.000020f, 0.004284f, 0.003871f, 0.002459f, 0.002503f, 0.001537f, -0.002070f, -0.004696f, 0.006075f, 0.002632f, -0.003753f, -0.000720f, -0.003076f, 0.004070f, -0.000081f, -0.002792f, 0.003409f, 0.002277f, 0.001675f, -0.019901f, -0.024173f, 0.011876f, -0.004587f, 0.010354f, -0.005445f, -0.005593f, -0.010912f, 0.002301f, 0.002089f, -0.000711f, -0.000006f, -0.001438f, -0.008377f, -0.001194f, -0.004861f, -0.005640f, -0.005278f, -0.000448f, + 0.000456f, -0.000665f, -0.001079f, 0.003807f, -0.001280f, -0.012676f, 0.007575f, 0.003566f, -0.004367f, 0.000962f, -0.000255f, -0.000151f, 0.001614f, 0.007688f, -0.004569f, 0.000176f, -0.014180f, 0.006707f, 0.001273f, 0.002857f, 0.004757f, 0.007583f, -0.004513f, -0.003680f, -0.001688f, -0.007401f, 0.000484f, -0.001401f, 0.006037f, -0.003632f, -0.000486f, -0.003776f, -0.003980f, 0.007082f, -0.005660f, -0.003085f, 0.000659f, -0.005475f, 0.004222f, -0.000583f, -0.002411f, 0.004198f, 0.008439f, 0.000110f, -0.000323f, -0.001621f, 0.007239f, -0.007629f, 0.000095f, -0.001597f, 0.003823f, -0.002270f, -0.003235f, 0.007312f, -0.000092f, 0.001044f, -0.002202f, -0.028829f, 0.004607f, 0.003132f, 0.009762f, -0.004169f, 0.002776f, 0.011408f, -0.004775f, 0.002947f, -0.007334f, -0.010604f, 0.003522f, -0.007292f, -0.008334f, -0.008315f, 0.002151f, 0.002854f, -0.014079f, 0.007880f, 0.005082f, -0.002573f, -0.005349f, 0.003001f, -0.001560f, -0.003366f, 0.000688f, 0.004347f, 0.003064f, 0.007078f, 0.001085f, -0.002449f, 0.007186f, -0.004007f, 0.016058f, 0.003465f, 0.009756f, 0.003665f, 0.008509f, 0.003716f, + 0.005747f, 0.003074f, 0.000360f, 0.000104f, 0.012028f, 0.001864f, -0.002380f, 0.000576f, 0.006154f, 0.004602f, 0.000305f, -0.000813f, -0.002970f, 0.001118f, 0.014705f, 0.004067f, 0.006551f, -0.007599f, -0.004222f, -0.008011f, -0.005351f, -0.007800f, 0.005134f, 0.003221f, -0.005294f, -0.003761f, 0.002841f, -0.003945f, 0.003209f, -0.002088f, -0.001718f, -0.005628f, -0.009351f, 0.003258f, -0.014851f, -0.002581f, -0.003766f, 0.016415f, 0.022490f, -0.006460f, 0.006283f, -0.010677f, -0.000262f, 0.000996f, 0.028640f, -0.002554f, -0.007163f, -0.011859f, 0.000605f, 0.008478f, 0.013346f, -0.002580f, -0.016775f, -0.004555f, -0.006198f, -0.004300f, 0.006130f, -0.000879f, 0.011197f, 0.001596f, -0.005832f, -0.013436f, 0.004470f, -0.000897f, 0.003536f, -0.001260f, 0.001886f, 0.007194f, 0.002812f, -0.016969f, 0.002423f, 0.011632f, 0.005835f, 0.001829f, 0.003012f, -0.002329f, 0.008090f, -0.009805f, -0.000666f, 0.008983f, -0.005512f, 0.000517f, 0.014130f, -0.005833f, -0.000304f, -0.004115f, 0.008833f, -0.008339f, -0.006265f, 0.004737f, -0.008892f, -0.003921f, 0.012399f, 0.007751f, -0.010392f, -0.003254f, + -0.001249f, -0.001912f, -0.004537f, 0.004674f, -0.003844f, 0.005301f, 0.000226f, 0.001598f, 0.002286f, 0.010105f, -0.000715f, 0.013640f, 0.006745f, -0.008397f, -0.004254f, -0.003376f, 0.007502f, 0.003398f, -0.000093f, 0.052424f, -0.019996f, 0.010276f, -0.015381f, -0.002002f, 0.000065f, -0.001537f, -0.008373f, 0.003884f, 0.005621f, 0.001033f, -0.006220f, -0.012696f, -0.000928f, 0.007042f, 0.004847f, -0.005829f, -0.009698f, -0.001184f, 0.007782f, 0.014646f, -0.008619f, -0.001532f, -0.006629f, -0.013640f, 0.000989f, -0.007077f, 0.003514f, -0.005351f, 0.009773f, -0.018460f, 0.011670f, -0.001228f, -0.011244f, 0.002188f, 0.004003f, -0.001696f, -0.006209f, -0.000069f, 0.013570f, -0.000950f, 0.001780f, -0.002407f, 0.004845f, 0.002079f, -0.003896f, -0.005700f, -0.012176f, 0.007120f, -0.003025f, -0.003803f, 0.003842f, -0.000304f, -0.020131f, 0.014605f, -0.021645f, -0.012467f, -0.015557f, 0.002857f, -0.002482f, 0.008576f, -0.005653f, 0.004428f, -0.009792f, 0.004018f, -0.003263f, -0.003911f, -0.010889f, 0.005830f, 0.005793f, 0.011713f, -0.004230f, -0.001240f, 0.001595f, -0.003650f, -0.000692f, -0.041691f, + 0.004303f, 0.000454f, -0.003481f, -0.006434f, 0.007373f, -0.005672f, 0.004942f, -0.001525f, 0.000023f, 0.006704f, 0.008888f, -0.005455f, 0.006585f, -0.001955f, -0.003438f, -0.011787f, -0.000435f, -0.015912f, -0.011460f, 0.013801f, 0.005127f, -0.005523f, -0.001801f, -0.001784f, 0.009839f, 0.004927f, -0.004778f, 0.008618f, 0.006058f, 0.003244f, 0.003255f, 0.003518f, 0.006926f, 0.005520f, 0.005925f, 0.015284f, 0.014241f, 0.005747f, 0.001797f, -0.010000f, 0.011022f, -0.014727f, 0.003104f, -0.004391f, 0.011935f, -0.009213f, -0.011157f, 0.019203f, -0.004291f, -0.011027f, -0.009096f, 0.014094f, 0.009288f, -0.000046f, 0.007835f, 0.009986f, 0.005192f, 0.016486f, -0.000698f, -0.003464f, 0.010079f, 0.005136f, 0.000913f, -0.000517f, -0.008586f, 0.004367f, 0.005936f, 0.012772f, 0.006029f, 0.007429f, -0.004893f, -0.008434f, -0.014563f, -0.004775f, -0.056389f, 0.014141f, -0.012672f, -0.018317f, -0.018169f, 0.010014f, -0.013709f, 0.008770f, -0.017022f, 0.008179f, 0.006754f, 0.003960f, -0.017902f, 0.010962f, -0.001091f, 0.006369f, -0.015011f, 0.007176f, 0.015781f, 0.012090f, -0.000468f, -0.006640f, + 0.001402f, -0.004254f, -0.018962f, -0.004281f, -0.009631f, 0.003497f, -0.012321f, 0.009113f, 0.008517f, -0.004363f, -0.001458f, 0.012797f, -0.003994f, 0.008510f, -0.008387f, -0.012214f, 0.004970f, -0.000739f, 0.005155f, 0.015937f, 0.008856f, -0.001117f, -0.029883f, -0.014242f, -0.005206f, 0.003518f, -0.005671f, 0.015360f, -0.026222f, 0.007471f, 0.002050f, -0.000646f, 0.006436f, -0.003596f, 0.010680f, -0.026467f, -0.013682f, 0.009828f, -0.027811f, -0.005124f, 0.010641f, 0.004187f, -0.007500f, -0.017659f, 0.004712f, 0.011247f, 0.006389f, -0.003074f, -0.020429f, -0.001360f, -0.002094f, -0.001565f, -0.025480f, 0.003471f, 0.005038f, 0.021117f, -0.018648f, 0.022987f, 0.007052f, -0.001195f, -0.004524f, -0.001816f, 0.002823f, -0.015769f, -0.002363f, 0.005814f, -0.004584f, -0.009036f, -0.001784f, 0.016021f, -0.015147f, -0.002934f, 0.016865f, 0.000607f, -0.005466f, 0.006172f, -0.006879f, 0.012301f, 0.006114f, 0.000364f, 0.006855f, -0.006329f, -0.009771f, -0.000265f, 0.001849f, 0.009317f, -0.017817f, -0.009679f, -0.007234f, -0.005332f, -0.004457f, -0.005220f, 0.004011f, 0.001431f, 0.002794f, -0.013577f, + -0.013195f, -0.010968f, 0.001742f, -0.017567f, -0.008615f, 0.011383f, -0.005887f, 0.002958f, 0.002666f, 0.000246f, 0.006110f, 0.007046f, 0.007797f, 0.007934f, 0.012444f, -0.001186f, 0.013427f, 0.000023f, 0.007841f, -0.000125f, -0.005270f, 0.000500f, -0.009637f, 0.008464f, -0.011451f, 0.014321f, -0.012780f, 0.001249f, -0.012857f, 0.003356f, -0.012273f, -0.013257f, 0.012850f, 0.021386f, 0.073791f, 0.001966f, -0.019880f, 0.004405f, -0.010303f, 0.030092f, -0.003670f, 0.009268f, 0.003190f, 0.002524f, -0.024407f, -0.011930f, 0.015187f, 0.013546f, -0.019014f, -0.002387f, 0.000444f, 0.019010f, 0.009835f, 0.007952f, 0.018562f, 0.003919f, 0.002193f, 0.016376f, -0.004276f, -0.021975f, 0.004464f, 0.018897f, 0.011519f, -0.005504f, 0.001388f, 0.013558f, 0.008562f, 0.004599f, 0.000371f, -0.011756f, 0.007351f, -0.012881f, 0.002435f, -0.025340f, 0.008002f, 0.009473f, -0.001127f, -0.010945f, 0.017915f, 0.010200f, -0.002476f, 0.014475f, 0.007082f, -0.009713f, 0.021303f, 0.003576f, -0.006164f, 0.006127f, 0.021819f, 0.004689f, 0.000489f, -0.015859f, -0.009094f, 0.003966f, 0.008075f, 0.025282f, + -0.006789f, -0.007750f, 0.003077f, 0.014648f, -0.007342f, -0.008479f, 0.000079f, 0.019122f, 0.013314f, -0.002277f, -0.012285f, 0.001446f, 0.015890f, -0.003874f, 0.031527f, 0.015414f, 0.007748f, -0.026856f, -0.003628f, -0.014103f, 0.025047f, -0.010806f, 0.011197f, 0.001237f, 0.015376f, 0.005315f, 0.001540f, -0.002461f, 0.005759f, -0.008575f, -0.011865f, -0.031742f, -0.023432f, 0.006288f, 0.019345f, 0.025802f, -0.010705f, -0.014435f, -0.012353f, 0.004768f, -0.007083f, -0.002662f, -0.001787f, 0.002331f, 0.003444f, 0.016707f, -0.010257f, 0.000337f, 0.003825f, 0.007428f, -0.009318f, -0.007886f, -0.014964f, -0.011193f, -0.010577f, -0.018601f, -0.044000f, -0.001999f, -0.006310f, -0.020213f, 0.003741f, -0.003665f, -0.024010f, 0.006335f, -0.020393f, 0.003506f, -0.002787f, -0.003299f, 0.009825f, 0.011445f, -0.000664f, -0.021249f, 0.005496f, -0.014033f, -0.013718f, 0.016937f, 0.016796f, 0.017017f, -0.006289f, 0.001103f, 0.002442f, -0.011685f, 0.001480f, -0.006755f, 0.029660f, -0.007108f, -0.002961f, -0.005256f, -0.000088f, -0.020505f, -0.022394f, 0.008552f, -0.028358f, 0.010656f, 0.003534f, 0.030222f, + -0.020185f, -0.011247f, -0.006709f, 0.016278f, -0.015338f, -0.014451f, 0.013242f, 0.009243f, -0.015571f, -0.015299f, -0.015407f, -0.033878f, 0.022340f, 0.021493f, 0.022212f, -0.009209f, 0.006883f, 0.022666f, -0.032401f, 0.000542f, 0.020873f, 0.020120f, 0.008606f, 0.000522f, -0.010614f, 0.002765f, -0.005306f, -0.027189f, 0.003154f, 0.008325f, 0.003677f, 0.019207f, -0.016721f, 0.002541f, -0.030900f, -0.003023f, 0.005493f, -0.015823f, 0.005902f, 0.006080f, 0.013003f, 0.017639f, 0.022491f, -0.003663f, -0.009784f, -0.026794f, -0.020689f, 0.009833f, 0.040230f, -0.011435f, -0.002580f, -0.017523f, -0.010965f, -0.013509f, 0.007817f, 0.010709f, -0.004273f, 0.003100f, -0.031263f, -0.002041f, 0.018965f, -0.014107f, -0.015602f, 0.014431f, -0.007187f, 0.020346f, 0.002261f, -0.009805f, -0.000577f, -0.015708f, -0.009509f, 0.000151f, -0.018406f, 0.040192f, -0.020885f, -0.011103f, -0.001540f, -0.002076f, -0.029765f, 0.001145f, -0.022110f, 0.014731f, -0.040920f, -0.006587f, -0.013575f, 0.012990f, -0.014554f, -0.014648f, -0.034741f, 0.022181f, -0.014715f, 0.008676f, -0.011676f, 0.006106f, 0.017372f, -0.013911f, + -0.023047f, -0.008254f, 0.014512f, 0.030901f, 0.009419f, 0.012483f, 0.000802f, -0.032682f, -0.017858f, -0.017992f, -0.009633f, 0.004768f, 0.028111f, 0.011639f, 0.016020f, 0.014954f, -0.005261f, -0.007592f, -0.010586f, -0.027538f, 0.000566f, -0.019504f, 0.027958f, -0.014123f, 0.018944f, 0.003309f, -0.011375f, 0.005685f, -0.007934f, -0.010057f, -0.016773f, 0.022658f, 0.005114f, 0.038962f, 0.007618f, -0.044285f, -0.011974f, 0.012601f, 0.009921f, 0.005004f, -0.003828f, 0.002423f, 0.043629f, 0.021046f, -0.009265f, 0.003169f, -0.013952f, 0.030787f, -0.003256f, -0.003573f, 0.010481f, -0.031940f, -0.014867f, -0.025362f, 0.014489f, 0.032906f, -0.003705f, -0.001875f, -0.001200f, 0.030552f, 0.009168f, 0.006994f, 0.004862f, 0.003227f, 0.004837f, -0.012646f, 0.001838f, -0.038831f, 0.005070f, -0.018943f, 0.015597f, 0.038816f, -0.005547f, 0.002411f, -0.031425f, 0.040938f, 0.019626f, 0.017129f, -0.005606f, -0.023221f, 0.002287f, -0.008232f, 0.020548f, 0.014592f, -0.019272f, 0.000526f, 0.010626f, 0.007347f, -0.015020f, -0.013427f, 0.060186f, -0.014569f, -0.011025f, 0.012268f, -0.015891f, -0.011789f, + 0.018834f, 0.018346f, 0.000302f, 0.006708f, 0.006427f, -0.024053f, -0.012110f, -0.001607f, 0.007572f, 0.019916f, 0.004665f, 0.004187f, -0.026913f, -0.003209f, 0.007440f, -0.036939f, 0.007574f, -0.010875f, -0.003986f, -0.007555f, 0.010351f, -0.011736f, -0.019885f, -0.022091f, -0.033406f, 0.002948f, -0.013533f, -0.007980f, 0.021397f, -0.009081f, 0.007332f, -0.040074f, 0.001151f, 0.029376f, -0.019105f, -0.019197f, 0.045846f, -0.027353f, 0.007239f, -0.017483f, 0.054066f, 0.011480f, 0.010108f, -0.017243f, -0.020259f, 0.001961f, 0.015583f, -0.016557f, -0.026187f, -0.015701f, -0.038144f, -0.014976f, -0.022285f, -0.000078f, -0.051290f, 0.003567f, 0.028212f, 0.017146f, 0.023139f, -0.015985f, 0.006297f, 0.024725f, -0.002496f, 0.017910f, 0.007092f, 0.027944f, -0.013605f, 0.023294f, 0.019059f, 0.013219f, 0.030876f, -0.017058f, 0.018650f, -0.009345f, -0.010175f, -0.007216f, 0.007379f, -0.058897f, -0.018095f, -0.036620f, 0.043128f, -0.026714f, -0.029274f, -0.006463f, 0.024815f, 0.000666f, -0.009769f, 0.033323f, -0.010821f, -0.010519f, -0.022995f, -0.059455f, 0.004172f, 0.005640f, 0.026208f, -0.024807f, + 0.001604f, -0.015006f, -0.018402f, 0.032124f, -0.004587f, 0.016341f, -0.032593f, -0.033166f, -0.018791f, 0.027289f, -0.000283f, -0.015715f, -0.015174f, 0.001021f, -0.023152f, -0.001193f, 0.028666f, 0.002838f, -0.009963f, 0.014233f, -0.025080f, 0.046896f, 0.029169f, -0.001402f, -0.022889f, -0.025961f, 0.009433f, -0.007409f, -0.003154f, -0.002487f, 0.042886f, -0.022689f, -0.000064f, -0.016169f, 0.015256f, -0.028436f, -0.025776f, -0.050333f, 0.010554f, -0.021224f, -0.028395f, -0.004668f, -0.047453f, -0.024252f, 0.012408f, 0.008603f, -0.007150f, 0.022926f, 0.001539f, 0.028054f, -0.013711f, -0.042013f, -0.006857f, -0.031189f, -0.006339f, -0.010416f, -0.039568f, 0.003574f, 0.031083f, -0.090834f, 0.010705f, -0.001365f, 0.021563f, -0.006059f, -0.028350f, -0.054651f, 0.020586f, -0.008220f, 0.019228f, 0.010054f, -0.006945f, 0.029097f, -0.038925f, 0.052036f, -0.013966f, 0.028129f, 0.062499f, 0.023152f, 0.044373f, 0.015500f, 0.011379f, -0.008292f, 0.023036f, -0.010949f, -0.024786f, -0.035261f, -0.021576f, -0.003284f, 0.018295f, -0.004559f, 0.076500f, 0.062542f, 0.056522f, -0.011412f, 0.001413f, -0.045773f, + 0.036370f, 0.044641f, 0.016121f, 0.043137f, 0.018124f, 0.015374f, 0.016120f, -0.006363f, 0.007205f, 0.012667f, -0.009302f, -0.044202f, -0.026011f, -0.000685f, -0.028575f, -0.034048f, -0.080731f, 0.019001f, 0.015726f, 0.022341f, -0.014202f, -0.004743f, -0.009372f, 0.001431f, -0.024118f, 0.000083f, -0.017968f, 0.023551f, 0.020601f, -0.010990f, -0.014258f, -0.042639f, 0.074742f, -0.022125f, 0.016166f, 0.000608f, 0.006482f, 0.012250f, -0.028375f, 0.036962f, -0.016519f, 0.012941f, 0.010047f, -0.026779f, -0.026123f, -0.004825f, -0.000495f, 0.017211f, 0.079076f, -0.006233f, 0.013501f, 0.002662f, 0.025326f, 0.016530f, 0.019437f, -0.013782f, -0.001906f, 0.006314f, -0.035062f, 0.006977f, -0.029662f, -0.051834f, 0.019971f, 0.000227f, 0.006254f, -0.039370f, -0.087430f, 0.035442f, 0.042454f, 0.022136f, -0.048133f, -0.044701f, -0.088656f, 0.072551f, 0.011220f, 0.012404f, -0.029879f, -0.021716f, -0.094256f, 0.025322f, 0.066529f, 0.019957f, -0.059866f, -0.030311f, 0.009156f, -0.023726f, -0.015149f, 0.026852f, -0.031376f, 0.016634f, 0.014941f, 0.012106f, -0.034861f, 0.011652f, 0.010203f, -0.016794f, + -0.032642f, -0.019294f, -0.012833f, -0.008991f, -0.031152f, -0.027154f, -0.015006f, -0.032338f, 0.024546f, -0.012491f, -0.041315f, -0.014785f, 0.024637f, -0.005855f, -0.028797f, -0.016272f, -0.014930f, -0.000764f, -0.022950f, -0.014214f, -0.037737f, -0.036033f, 0.014532f, -0.013235f, 0.045880f, 0.029893f, 0.002363f, 0.027096f, -0.041300f, 0.025644f, -0.039321f, 0.031798f, -0.006430f, 0.015992f, -0.018209f, 0.057006f, -0.015548f, 0.031703f, -0.009676f, 0.046843f, 0.017328f, 0.011046f, -0.051045f, 0.052570f, 0.039640f, 0.018080f, 0.015985f, -0.038457f, -0.012581f, 0.015392f, 0.017484f, -0.007127f, -0.011732f, -0.057036f, 0.056339f, -0.001882f, 0.029186f, -0.029507f, -0.006766f, -0.004087f, -0.003674f, -0.003529f, 0.034615f, 0.005287f, -0.021166f, 0.024829f, 0.007673f, 0.019190f, 0.029953f, 0.030540f, 0.005519f, -0.017931f, 0.096412f, -0.020705f, 0.075104f, 0.005213f, 0.008406f, -0.035453f, -0.013406f, 0.011455f, 0.038530f, 0.021840f, -0.006976f, 0.033046f, 0.009954f, -0.033842f, 0.010729f, 0.010743f, 0.044219f, 0.003660f, 0.028208f, -0.024244f, 0.004328f, 0.032335f, 0.017802f, 0.028008f, + 0.064403f, 0.053556f, -0.003068f, 0.030517f, 0.000725f, 0.052899f, -0.033335f, 0.037360f, 0.017408f, 0.004266f, 0.032981f, -0.008794f, 0.078251f, -0.006393f, 0.040346f, -0.020250f, -0.018848f, 0.007908f, 0.083347f, 0.032435f, -0.067515f, 0.071656f, 0.004020f, 0.030135f, -0.049325f, 0.026577f, 0.011952f, -0.101316f, 0.051842f, 0.092917f, 0.038031f, -0.025150f, -0.016323f, 0.029137f, 0.078921f, 0.018692f, 0.022074f, 0.014481f, -0.016269f, -0.008067f, -0.029171f, 0.037859f, 0.006479f, 0.025194f, -0.019463f, 0.050344f, -0.016757f, 0.023405f, 0.008759f, 0.010340f, 0.008416f, 0.004205f, -0.051520f, -0.030778f, 0.001532f, 0.004389f, 0.037267f, 0.029245f, -0.041575f, 0.003815f, -0.022207f, -0.022157f, 0.012128f, 0.001872f, -0.013092f, 0.016880f, 0.071199f, -0.047057f, -0.001870f, 0.105322f, -0.062886f, 0.006383f, 0.039992f, -0.020872f, -0.013580f, 0.020548f, 0.037296f, -0.039895f, 0.021147f, -0.071178f, -0.005059f, 0.101530f, 0.007071f, 0.027185f, -0.008291f, 0.054237f, 0.059634f, -0.018233f, 0.001935f, -0.029616f, 0.009605f, -0.022868f, -0.047289f, -0.035750f, -0.056908f, -0.048070f, + 0.070447f, 0.022933f, 0.023385f, 0.084673f, -0.059516f, -0.042402f, 0.015106f, 0.027708f, -0.021094f, 0.009661f, -0.023056f, 0.041514f, 0.032506f, 0.007230f, 0.036826f, 0.113663f, 0.012401f, -0.013014f, -0.029456f, 0.027404f, -0.005754f, 0.060234f, -0.051251f, 0.015272f, -0.002049f, -0.015122f, -0.013659f, -0.005759f, 0.019671f, 0.012946f, 0.013935f, -0.000864f, 0.034434f, 0.007688f, -0.040937f, -0.031654f, -0.002854f, -0.017755f, -0.022780f, 0.007647f, 0.028801f, -0.001725f, -0.004330f, -0.037062f, 0.021102f, -0.004150f, 0.041899f, -0.011469f, -0.075249f, 0.011635f, -0.021008f, -0.009379f, 0.001978f, -0.060245f, -0.031013f, -0.051388f, 0.002860f, -0.001541f, -0.013164f, -0.068693f, -0.026997f, -0.003749f, 0.039122f, 0.043625f, 0.005267f, 0.005727f, 0.022009f, 0.007205f, -0.046854f, 0.045572f, 0.060363f, -0.022507f, 0.010871f, -0.022465f, 0.012602f, 0.002806f, 0.046519f, -0.046759f, -0.034134f, -0.110840f, -0.038443f, 0.032218f, 0.047957f, 0.036387f, 0.031510f, -0.024161f, -0.007820f, 0.027117f, 0.022711f, 0.054457f, 0.022735f, 0.026891f, 0.030951f, 0.012653f, -0.089485f, 0.040161f, + -0.025349f, 0.005163f, 0.066959f, 0.056070f, -0.019500f, -0.007463f, 0.035562f, -0.019248f, -0.019789f, -0.016722f, 0.006717f, -0.004780f, -0.000169f, 0.009223f, -0.004807f, 0.033430f, 0.078744f, -0.030867f, -0.057309f, 0.061027f, -0.043759f, -0.011247f, 0.003085f, 0.075736f, 0.008493f, -0.021393f, 0.024758f, 0.021880f, -0.075049f, -0.021874f, 0.015893f, -0.002042f, -0.033884f, -0.001867f, 0.017920f, -0.113673f, -0.049589f, 0.057515f, -0.052946f, -0.062192f, -0.035119f, 0.046955f, -0.056264f, -0.093664f, 0.098946f, -0.027503f, -0.055020f, -0.003156f, 0.041620f, -0.036157f, -0.058851f, -0.001587f, 0.034167f, -0.003480f, -0.076435f, 0.018867f, 0.004722f, -0.037382f, 0.092559f, 0.080152f, 0.000771f, -0.034484f, -0.056392f, 0.096934f, 0.022089f, 0.014700f, 0.043401f, -0.028236f, -0.085640f, 0.037598f, 0.085084f, 0.050049f, -0.023191f, 0.006061f, -0.092700f, 0.012257f, 0.090996f, 0.050404f, 0.014315f, 0.000719f, -0.014300f, 0.025039f, -0.029606f, 0.075917f, -0.003828f, 0.021624f, 0.029168f, -0.023586f, 0.002807f, -0.001309f, -0.026405f, 0.001811f, 0.012508f, 0.043476f, 0.001655f, -0.023821f, + 0.014614f, 0.035401f, -0.003734f, 0.054975f, -0.039350f, 0.010616f, 0.013737f, 0.015872f, 0.047727f, -0.023086f, 0.005844f, 0.000367f, -0.058138f, 0.010646f, -0.017798f, -0.030581f, 0.015812f, -0.010258f, 0.048908f, 0.036187f, -0.022901f, -0.051454f, 0.027346f, 0.007548f, 0.012584f, 0.032434f, 0.067202f, -0.008673f, 0.015382f, -0.023999f, 0.039367f, 0.029499f, 0.029912f, -0.028410f, 0.044854f, -0.011870f, -0.016862f, -0.034564f, -0.001437f, -0.011619f, 0.057615f, -0.037993f, 0.005026f, 0.017563f, -0.010585f, -0.021098f, 0.079923f, 0.001420f, 0.020885f, -0.001414f, 0.012246f, 0.000812f, 0.025825f, 0.007873f, -0.000599f, 0.029754f, -0.083988f, -0.233402f, -0.221893f, 0.094458f, 0.008146f, 0.210646f, 0.448086f, 0.096902f, 0.179902f, 0.095086f, -0.334425f, -0.150715f, -0.225255f, -0.330749f, -0.023136f, 0.037297f, -0.156539f, 0.136569f, 0.234117f, 0.142298f, 0.403936f, 0.246795f, 0.001378f, -0.039191f, -0.144127f, -0.359385f, -0.290519f, -0.126635f, -0.275190f, -0.082805f, 0.156186f, 0.044775f, 0.039057f, 0.368980f, 0.142481f, 0.088415f, 0.342716f, 0.014301f, -0.017829f, 0.156270f, + -0.079220f, -0.285002f, -0.137353f, -0.284813f, -0.413327f, -0.047805f, -0.187817f, -0.155250f, 0.132161f, 0.254355f, 0.118667f, 0.451045f, 0.361172f, 0.207284f, 0.274481f, 0.090875f, -0.133913f, -0.209096f, -0.275398f, -0.444123f, -0.353560f, -0.239680f, -0.201359f, -0.064677f, 0.155777f, 0.232610f, 0.263157f, 0.349646f, 0.298501f, 0.138309f, 0.055323f, 0.077633f, -0.110385f, -0.176101f, -0.114121f, -0.250248f, -0.135718f, -0.003095f, -0.017737f} + }, + { + {-0.002684f, 0.000038f, 0.004022f, -0.007594f, -0.002239f, -0.004807f, -0.006689f, -0.000587f, 0.008250f, 0.001430f, -0.004459f, -0.004223f, 0.011405f, -0.005154f, 0.001089f, -0.003708f, -0.003806f, -0.005893f, -0.001447f, 0.014284f, 0.000939f, -0.000712f, 0.002677f, 0.003685f, 0.001215f, -0.004622f, 0.007917f, 0.000245f, -0.000277f, -0.003551f, 0.000999f, -0.002685f, 0.001182f, 0.005253f, 0.000387f, -0.000216f, -0.000298f, -0.000373f, -0.001242f, -0.006992f, 0.001633f, 0.005909f, -0.001762f, -0.003447f, 0.005516f, -0.006408f, -0.000491f, -0.002724f, 0.004046f, -0.010331f, 0.003815f, -0.000785f, 0.001553f, -0.002335f, -0.002149f, -0.000285f, -0.002916f, 0.000419f, 0.003121f, 0.002301f, -0.000635f, 0.002037f, 0.009214f, -0.005820f, -0.004625f, 0.000472f, -0.002183f, -0.004383f, 0.001216f, -0.004718f, 0.002588f, -0.005679f, 0.000587f, -0.002892f, -0.004781f, -0.000695f, -0.009260f, -0.003483f, 0.002330f, -0.001621f, -0.005267f, -0.000275f, 0.012684f, -0.006322f, 0.001618f, -0.002606f, 0.000020f, -0.004691f, 0.009187f, -0.004582f, -0.004815f, -0.005541f, 0.010927f, -0.006303f, -0.001489f, -0.002937f, + 0.003214f, 0.005040f, 0.006488f, -0.008802f, 0.000184f, 0.008563f, 0.003971f, 0.001516f, -0.000249f, -0.001005f, 0.004065f, 0.008713f, 0.002327f, -0.011078f, -0.005489f, -0.005946f, 0.009966f, -0.000962f, 0.007675f, -0.004632f, 0.003710f, 0.009736f, -0.004448f, -0.007308f, 0.002901f, -0.002736f, -0.000177f, -0.006555f, -0.002316f, -0.004910f, 0.002206f, -0.008906f, -0.002567f, -0.002310f, 0.000099f, 0.011967f, -0.003516f, -0.001872f, 0.000004f, -0.003231f, -0.000784f, -0.001234f, 0.007770f, 0.003643f, 0.004997f, -0.006399f, 0.005170f, 0.004638f, -0.003615f, 0.001773f, 0.003575f, -0.003490f, -0.003545f, 0.004761f, -0.006679f, 0.004925f, -0.000821f, -0.000101f, -0.000405f, -0.006036f, 0.006094f, 0.000601f, -0.002846f, -0.004154f, -0.001256f, -0.002170f, -0.000152f, -0.005107f, -0.003995f, 0.002710f, -0.000955f, -0.002028f, -0.008884f, -0.001410f, 0.007934f, -0.005567f, -0.001541f, 0.006010f, -0.003700f, -0.006630f, -0.005170f, 0.004080f, -0.000148f, -0.000715f, -0.001444f, -0.006340f, 0.001922f, -0.002854f, -0.001664f, 0.007036f, -0.004094f, -0.009651f, -0.003061f, 0.000499f, 0.002679f, 0.002502f, + 0.000622f, -0.007308f, -0.001890f, -0.008887f, -0.008287f, -0.002158f, 0.008254f, -0.001430f, -0.016945f, -0.000699f, 0.005418f, 0.004968f, -0.003674f, 0.003391f, 0.003375f, 0.000463f, 0.004748f, -0.008855f, -0.006612f, -0.000652f, 0.002379f, 0.000653f, 0.001622f, -0.000677f, 0.002109f, 0.002501f, 0.003225f, -0.000078f, 0.001883f, 0.002606f, -0.001953f, 0.004187f, -0.001130f, -0.007796f, -0.007457f, -0.003166f, -0.000932f, 0.007966f, 0.004602f, 0.011771f, 0.001089f, -0.001971f, -0.001083f, 0.008399f, -0.001876f, 0.004627f, -0.007091f, -0.000528f, 0.000152f, 0.004518f, 0.003325f, 0.007531f, 0.005493f, -0.003509f, -0.006966f, -0.005765f, 0.004477f, -0.002336f, 0.005985f, 0.003730f, 0.001142f, -0.000162f, 0.005057f, 0.003469f, -0.002975f, 0.004017f, -0.007478f, -0.000927f, -0.006893f, -0.006108f, -0.008372f, 0.002721f, 0.005472f, -0.000793f, 0.007447f, -0.005305f, 0.006944f, -0.012996f, 0.005522f, 0.002340f, 0.010191f, 0.002936f, 0.003989f, 0.005312f, 0.000284f, -0.003280f, 0.004156f, 0.008516f, 0.003427f, 0.004134f, -0.000804f, -0.000134f, -0.011425f, -0.000804f, 0.002510f, 0.002282f, + -0.001142f, 0.006348f, 0.012675f, -0.004114f, -0.007993f, 0.005637f, 0.001969f, -0.006316f, 0.000623f, -0.003094f, -0.005426f, 0.000414f, 0.009442f, 0.001670f, 0.003957f, 0.000695f, 0.006554f, 0.006321f, -0.005641f, 0.009522f, -0.003066f, -0.005891f, -0.008876f, 0.002385f, -0.011817f, -0.000472f, 0.001461f, 0.003619f, -0.007469f, 0.005259f, 0.000077f, 0.001413f, 0.003409f, 0.002294f, 0.002910f, -0.010029f, -0.000509f, -0.002004f, -0.006576f, 0.004303f, 0.002167f, 0.001917f, 0.005974f, 0.020784f, -0.001332f, 0.001440f, 0.003078f, 0.005448f, 0.002163f, -0.016329f, 0.003645f, -0.002346f, -0.001761f, 0.009628f, 0.000432f, 0.005037f, 0.006779f, -0.007773f, -0.004452f, -0.001873f, -0.007858f, -0.016659f, 0.000973f, -0.005925f, -0.000873f, -0.000918f, -0.000188f, -0.003378f, -0.008244f, 0.003026f, -0.007877f, -0.001888f, 0.001994f, -0.008272f, 0.009478f, 0.003950f, 0.002837f, -0.002986f, -0.000481f, -0.000634f, 0.002068f, -0.002003f, 0.005008f, -0.006405f, 0.002705f, 0.012234f, 0.009560f, -0.002096f, 0.005040f, -0.003106f, 0.002386f, -0.006734f, 0.000327f, 0.013593f, -0.017364f, 0.000682f, + -0.010717f, 0.005404f, 0.007805f, 0.009546f, -0.001556f, -0.009160f, 0.000161f, 0.009406f, 0.001939f, 0.001764f, -0.007189f, -0.000995f, -0.012531f, 0.016498f, -0.000970f, -0.012777f, 0.013691f, 0.003412f, 0.003982f, -0.000940f, -0.005086f, -0.001668f, -0.006688f, -0.006522f, 0.004968f, 0.007188f, -0.001610f, 0.006779f, -0.005770f, -0.003559f, -0.000156f, 0.009476f, 0.008847f, -0.002578f, -0.005262f, 0.007363f, 0.004537f, 0.000642f, 0.006068f, 0.001438f, -0.007602f, 0.007701f, 0.004599f, -0.000646f, -0.002828f, 0.002075f, -0.008239f, 0.021109f, -0.001411f, -0.000836f, 0.015440f, -0.001520f, -0.010034f, -0.005330f, -0.001556f, 0.003746f, -0.010497f, 0.006757f, 0.001559f, 0.000115f, -0.009692f, -0.007816f, -0.016763f, -0.001579f, 0.006755f, 0.003559f, 0.008222f, -0.005264f, -0.004647f, 0.018813f, -0.006649f, 0.002837f, -0.004514f, -0.008356f, -0.017896f, 0.000116f, -0.007355f, -0.008336f, 0.002918f, -0.010071f, 0.000577f, 0.007454f, 0.004152f, 0.015253f, -0.024599f, 0.016320f, -0.002390f, 0.007342f, -0.004515f, -0.003196f, -0.012827f, 0.012013f, 0.010498f, 0.002964f, -0.011394f, -0.000250f, + -0.006507f, -0.000404f, 0.012297f, 0.008828f, 0.002046f, 0.011942f, 0.000016f, 0.001019f, 0.001300f, 0.000034f, -0.007908f, 0.017678f, -0.001583f, 0.000618f, 0.020155f, -0.012451f, 0.004907f, -0.005681f, -0.001198f, 0.006822f, -0.002646f, -0.009683f, 0.019344f, 0.015548f, -0.000489f, 0.005418f, 0.008111f, 0.021375f, -0.002687f, -0.003176f, -0.011312f, 0.002578f, 0.003911f, -0.011332f, -0.012826f, -0.010566f, 0.013333f, 0.000990f, -0.005677f, 0.009956f, 0.006357f, 0.000881f, -0.003476f, 0.003821f, -0.007628f, -0.000977f, -0.008383f, -0.000815f, 0.006832f, -0.013528f, 0.002586f, -0.001827f, -0.011395f, 0.007724f, -0.004084f, 0.002285f, -0.003607f, -0.001839f, 0.002324f, 0.013313f, 0.014097f, 0.002036f, -0.012961f, -0.002089f, -0.012346f, 0.004597f, 0.030812f, 0.007362f, 0.021191f, 0.007608f, -0.000224f, -0.020574f, -0.005484f, 0.002976f, 0.019041f, -0.009013f, -0.004867f, -0.007897f, 0.001302f, 0.015376f, -0.012118f, 0.007340f, 0.012994f, 0.002656f, 0.004360f, -0.009289f, 0.016147f, -0.003993f, 0.021204f, -0.000605f, -0.007451f, -0.020979f, 0.001734f, -0.000350f, 0.023703f, -0.007847f, + -0.002874f, 0.015093f, -0.000810f, 0.001572f, -0.006038f, -0.016600f, 0.000682f, 0.008715f, -0.012662f, -0.009693f, 0.001215f, -0.019918f, 0.009307f, 0.010027f, -0.004635f, -0.001997f, 0.003941f, 0.010105f, -0.002565f, -0.007626f, -0.002061f, 0.015023f, -0.004056f, -0.003618f, -0.008327f, 0.019430f, 0.018433f, -0.000153f, -0.006847f, 0.001347f, -0.004575f, 0.002981f, 0.004982f, -0.004486f, 0.006646f, -0.012580f, 0.002948f, 0.000683f, -0.013501f, 0.014303f, 0.010926f, 0.001149f, -0.008875f, -0.009944f, -0.004205f, -0.020077f, 0.023973f, 0.018185f, -0.003573f, 0.006967f, 0.002381f, -0.003533f, 0.018212f, -0.001073f, -0.008141f, 0.026993f, -0.028630f, 0.007833f, 0.012624f, 0.000292f, -0.011607f, 0.013083f, 0.002135f, 0.018748f, -0.006935f, -0.001560f, 0.005038f, 0.007748f, 0.001373f, -0.002081f, 0.026804f, 0.011946f, -0.012099f, -0.017985f, 0.012901f, -0.017986f, -0.005287f, -0.020768f, -0.002708f, 0.032231f, 0.013017f, 0.015825f, 0.000105f, -0.016384f, -0.002841f, -0.007760f, -0.003729f, 0.024244f, -0.003804f, -0.025700f, -0.002256f, 0.005630f, -0.016849f, -0.002273f, 0.010502f, 0.008947f, + -0.011505f, -0.005361f, 0.011092f, 0.015672f, -0.004893f, 0.016295f, -0.000318f, 0.004435f, 0.005163f, 0.001771f, 0.005240f, 0.009880f, 0.007889f, 0.009274f, -0.006529f, -0.018669f, -0.023468f, 0.011859f, -0.001302f, 0.011072f, -0.021605f, 0.007984f, 0.006381f, 0.003372f, -0.014077f, -0.011768f, -0.015003f, 0.012018f, 0.006368f, -0.010693f, -0.010632f, 0.015066f, 0.005059f, -0.001024f, -0.008903f, -0.014905f, -0.005924f, 0.006303f, -0.009417f, 0.001326f, -0.017857f, -0.004889f, 0.002364f, 0.006383f, 0.012083f, -0.001720f, 0.007811f, 0.010501f, -0.010238f, -0.024951f, 0.017593f, 0.001010f, -0.003711f, 0.016710f, -0.002255f, 0.000899f, -0.010807f, 0.014747f, -0.008945f, -0.011480f, -0.004272f, 0.012183f, 0.018364f, 0.015478f, 0.005062f, 0.003419f, -0.031446f, 0.014866f, -0.001547f, 0.006533f, -0.010588f, -0.001575f, -0.011875f, -0.003707f, -0.002567f, -0.015705f, -0.007757f, -0.005968f, -0.008441f, 0.017785f, -0.004907f, 0.023015f, -0.002042f, -0.000087f, 0.014475f, 0.017151f, 0.027305f, 0.019916f, 0.000492f, -0.006481f, 0.000105f, 0.002866f, -0.010875f, 0.006920f, -0.006542f, -0.009112f, + -0.034434f, 0.006902f, -0.023883f, -0.014524f, 0.021434f, 0.016554f, -0.039231f, -0.036000f, 0.000602f, 0.014549f, -0.009579f, 0.008767f, -0.013344f, -0.001989f, -0.023016f, -0.006409f, -0.020831f, -0.001991f, -0.006122f, 0.000118f, 0.007205f, 0.005857f, 0.012038f, -0.002072f, -0.011312f, 0.008850f, -0.013374f, -0.005617f, 0.003572f, 0.000351f, 0.006004f, 0.012938f, -0.002682f, 0.001268f, 0.002572f, -0.005826f, -0.001911f, -0.019969f, -0.023689f, -0.022814f, -0.000434f, -0.022917f, 0.007140f, 0.002702f, -0.009348f, -0.010749f, -0.004914f, -0.003952f, -0.002307f, -0.013596f, -0.021593f, -0.001287f, 0.033449f, 0.018585f, -0.005025f, -0.020101f, -0.021049f, 0.023446f, -0.022047f, -0.006960f, -0.004016f, -0.014216f, -0.011138f, -0.014344f, -0.017404f, -0.023503f, -0.032681f, -0.003749f, -0.005086f, -0.003390f, 0.011307f, 0.012100f, 0.003220f, 0.011477f, -0.006145f, 0.002998f, -0.027039f, 0.003974f, 0.014716f, 0.016036f, 0.014792f, 0.006807f, 0.028482f, -0.010116f, -0.019639f, -0.004402f, 0.004163f, -0.003177f, 0.009421f, 0.019478f, 0.037933f, 0.024506f, 0.014223f, 0.018436f, -0.013955f, -0.026563f, + -0.009025f, -0.019605f, 0.023875f, 0.006420f, -0.004568f, -0.015633f, 0.026982f, 0.024047f, -0.008151f, -0.000491f, 0.000177f, -0.012561f, -0.011249f, -0.019482f, 0.006399f, 0.008470f, 0.012022f, -0.018266f, 0.001970f, 0.006999f, -0.008785f, -0.017619f, 0.000681f, 0.012581f, 0.014737f, 0.004024f, -0.037259f, -0.011735f, -0.018384f, 0.009301f, 0.022248f, 0.001705f, -0.020970f, 0.006776f, -0.020271f, 0.013059f, -0.004996f, 0.003729f, -0.014450f, 0.032124f, 0.023633f, -0.005338f, -0.007123f, -0.015155f, -0.001348f, 0.026402f, 0.005353f, 0.032049f, 0.028343f, 0.026408f, 0.013837f, 0.007733f, -0.019094f, -0.007417f, -0.025171f, 0.032719f, -0.015895f, -0.002062f, 0.016032f, 0.026126f, -0.022176f, -0.027364f, -0.023412f, 0.031120f, -0.009360f, 0.021702f, 0.002148f, 0.002997f, 0.048266f, -0.002811f, 0.005778f, -0.017542f, -0.029243f, 0.010691f, -0.002337f, 0.011365f, 0.007937f, 0.000337f, -0.015733f, 0.008040f, 0.009124f, 0.006137f, -0.014733f, 0.014327f, 0.010588f, 0.036505f, -0.013071f, 0.005405f, 0.020632f, 0.021867f, 0.003081f, 0.022110f, -0.002410f, 0.004048f, 0.019232f, 0.017614f, + 0.006189f, -0.003931f, -0.024540f, -0.016903f, 0.018181f, 0.003153f, -0.003763f, -0.001662f, 0.006418f, 0.039938f, 0.000197f, -0.008735f, 0.020855f, -0.004864f, 0.019865f, 0.008329f, 0.054642f, -0.005954f, 0.000827f, 0.004300f, 0.010283f, 0.022422f, -0.000924f, -0.001258f, 0.014175f, -0.019424f, 0.022555f, 0.042030f, 0.013467f, -0.002061f, 0.023054f, -0.001807f, 0.001407f, 0.047925f, -0.021677f, 0.015872f, 0.018789f, 0.001103f, 0.002640f, 0.003492f, 0.007262f, -0.027758f, -0.009267f, 0.016219f, -0.010484f, -0.015231f, -0.014005f, -0.014056f, 0.000360f, 0.016398f, -0.004198f, -0.041403f, -0.001921f, -0.031805f, 0.009801f, 0.011548f, -0.001772f, 0.004700f, -0.015391f, -0.003144f, 0.013999f, -0.039613f, 0.007564f, -0.009733f, 0.019119f, 0.013390f, 0.007338f, 0.000318f, -0.017534f, -0.035825f, -0.004195f, -0.031466f, 0.016218f, -0.001053f, -0.011587f, 0.030455f, 0.013921f, -0.013946f, -0.012666f, -0.007886f, -0.007535f, -0.010141f, -0.019874f, 0.001818f, 0.002048f, 0.044641f, -0.004500f, -0.034108f, -0.003073f, 0.021139f, -0.001508f, -0.018211f, 0.007388f, -0.026833f, 0.013624f, -0.012141f, + 0.007735f, -0.016259f, 0.003152f, -0.027550f, 0.064787f, 0.001057f, 0.043361f, -0.006225f, -0.017320f, 0.010572f, -0.019876f, -0.016936f, 0.021586f, 0.023636f, -0.027705f, -0.062055f, 0.051406f, -0.022422f, -0.021366f, -0.010856f, -0.003691f, -0.029692f, -0.010733f, -0.009303f, -0.025517f, -0.044814f, -0.011237f, 0.000278f, -0.023843f, 0.011092f, -0.010326f, 0.019280f, -0.017230f, -0.007606f, -0.024438f, 0.057295f, 0.048731f, -0.011501f, 0.010765f, 0.033036f, -0.035432f, 0.035241f, -0.014987f, -0.015514f, 0.012843f, 0.004119f, 0.006083f, -0.005896f, -0.007795f, 0.000362f, 0.011612f, 0.009350f, -0.015653f, 0.017306f, -0.016841f, -0.028855f, 0.020540f, 0.017257f, -0.023301f, -0.029869f, -0.033492f, -0.005694f, -0.005360f, 0.008645f, -0.021733f, -0.028353f, -0.013772f, 0.045298f, 0.016487f, 0.014851f, -0.019358f, 0.016930f, 0.024721f, -0.019824f, 0.045818f, 0.007509f, -0.015637f, -0.022173f, 0.012776f, -0.018796f, -0.038015f, 0.008459f, 0.000385f, -0.000137f, 0.022121f, 0.018685f, -0.015949f, 0.002156f, -0.048402f, -0.007303f, -0.018086f, 0.039885f, 0.004317f, 0.004446f, -0.021414f, 0.017764f, + -0.037034f, -0.008548f, -0.021648f, 0.027089f, 0.028503f, 0.025839f, 0.017311f, -0.000326f, 0.023557f, 0.021468f, 0.003368f, -0.004160f, 0.009323f, -0.000002f, -0.024520f, -0.002940f, 0.008900f, -0.018996f, 0.026741f, -0.028258f, 0.022248f, 0.024589f, -0.007463f, -0.005570f, 0.010024f, 0.032834f, 0.024165f, -0.029687f, -0.006955f, -0.007941f, -0.002878f, 0.007428f, -0.014395f, -0.014488f, 0.031634f, 0.000824f, 0.045641f, -0.030201f, -0.029339f, 0.023314f, -0.016165f, 0.008420f, -0.018948f, 0.015568f, 0.016903f, 0.011726f, -0.008166f, -0.026548f, 0.001639f, 0.008829f, -0.023157f, -0.040583f, -0.002567f, 0.003670f, -0.025217f, 0.043782f, -0.006392f, -0.012499f, 0.056705f, 0.054739f, 0.003790f, -0.007774f, -0.003922f, -0.011912f, 0.011102f, -0.029042f, 0.024582f, 0.003188f, -0.018366f, 0.032059f, 0.002057f, 0.005900f, -0.013066f, -0.018681f, -0.048391f, 0.008100f, -0.020985f, -0.010170f, -0.048562f, -0.111814f, 0.036804f, 0.034853f, -0.012955f, 0.007395f, -0.027313f, 0.047537f, 0.030205f, -0.027728f, 0.007243f, 0.006041f, 0.000169f, -0.012749f, -0.009358f, -0.057902f, 0.023755f, 0.027849f, + -0.007082f, -0.000512f, -0.003756f, 0.018578f, -0.014936f, 0.035903f, 0.010241f, -0.043765f, -0.025071f, 0.054442f, 0.035514f, -0.036314f, -0.008988f, -0.013240f, -0.022497f, 0.002908f, -0.009335f, 0.007312f, 0.070797f, 0.018928f, 0.074199f, 0.042185f, 0.047600f, 0.043377f, 0.085535f, -0.006216f, -0.008614f, 0.020026f, -0.006716f, -0.072859f, 0.057941f, -0.026004f, 0.032938f, -0.048414f, -0.038658f, -0.072024f, 0.013474f, -0.007292f, -0.024672f, 0.016638f, -0.034288f, -0.000700f, -0.048702f, -0.048749f, 0.012572f, 0.026954f, -0.039807f, -0.011427f, -0.027993f, -0.038710f, -0.043231f, -0.031710f, 0.021534f, -0.020116f, -0.054388f, 0.072842f, 0.044412f, 0.071775f, -0.015381f, -0.041853f, -0.107606f, 0.044710f, 0.053629f, -0.026190f, -0.012202f, -0.004053f, 0.060879f, 0.000722f, 0.011922f, 0.011858f, -0.016048f, 0.011101f, 0.027573f, -0.007083f, -0.029338f, 0.005684f, 0.051479f, -0.029329f, -0.019050f, 0.010332f, -0.008912f, 0.038364f, -0.011471f, 0.016589f, -0.022004f, -0.025824f, -0.026112f, 0.024686f, -0.009464f, 0.021757f, 0.025217f, -0.008271f, 0.001831f, -0.001177f, -0.023723f, 0.005920f, + -0.021725f, 0.022140f, 0.055782f, 0.093233f, -0.003073f, -0.004151f, -0.042029f, 0.020166f, 0.028963f, -0.002470f, 0.032712f, 0.048153f, 0.018777f, 0.026630f, -0.045856f, -0.027935f, 0.033957f, 0.092747f, -0.019710f, -0.057448f, 0.011667f, -0.020522f, -0.003586f, 0.023405f, -0.002214f, -0.027767f, -0.014927f, -0.015787f, -0.067270f, -0.029966f, -0.002671f, 0.007086f, 0.019187f, -0.008016f, -0.028150f, -0.019741f, 0.002471f, -0.017654f, -0.028521f, 0.012798f, 0.033692f, 0.011136f, 0.017650f, 0.006830f, 0.050856f, -0.016161f, -0.006388f, -0.020131f, 0.011820f, -0.012570f, 0.011229f, 0.057569f, 0.011464f, -0.061347f, -0.014843f, -0.018035f, -0.052221f, 0.033052f, 0.015841f, -0.006272f, 0.007560f, 0.003040f, -0.023301f, -0.000445f, -0.001439f, -0.023568f, -0.006734f, 0.050150f, 0.074375f, 0.034702f, -0.025483f, -0.041083f, 0.019660f, 0.033601f, 0.004219f, 0.026832f, -0.018361f, -0.013303f, 0.028371f, 0.008553f, 0.001012f, -0.062395f, -0.080358f, -0.002836f, -0.046622f, -0.027720f, 0.017829f, 0.067644f, 0.015684f, 0.003219f, -0.018552f, -0.023577f, -0.032747f, -0.029964f, 0.006970f, 0.020438f, + -0.005666f, -0.033638f, -0.052430f, 0.021691f, 0.003501f, -0.029954f, -0.048160f, -0.033850f, -0.052847f, -0.099855f, -0.057284f, -0.008227f, -0.008001f, 0.121932f, -0.009757f, -0.002839f, 0.076077f, 0.010625f, 0.013059f, 0.045416f, -0.009395f, -0.028693f, 0.038304f, -0.053993f, 0.013809f, 0.008767f, -0.023455f, -0.075762f, 0.051786f, 0.015524f, -0.004768f, -0.076694f, 0.020573f, 0.012141f, -0.040495f, 0.007010f, 0.035721f, 0.022122f, 0.010474f, -0.034562f, -0.006994f, -0.012732f, 0.006237f, -0.012832f, 0.003327f, -0.026675f, -0.038676f, 0.042843f, -0.029266f, 0.064964f, -0.039762f, -0.035793f, -0.024338f, -0.045066f, 0.004139f, -0.000520f, 0.068071f, -0.049953f, -0.052889f, 0.027739f, 0.017687f, -0.043546f, -0.058200f, -0.006086f, -0.032664f, 0.038264f, 0.008360f, -0.047969f, 0.031743f, -0.007860f, -0.073968f, 0.049221f, -0.032710f, 0.032250f, -0.054792f, -0.013188f, -0.000911f, -0.022951f, -0.008795f, 0.006632f, 0.070725f, -0.018677f, -0.005478f, -0.020024f, 0.021227f, -0.033182f, 0.027424f, 0.054194f, -0.001411f, 0.054098f, 0.045559f, -0.007965f, 0.091152f, -0.007654f, 0.014454f, -0.007320f, + 0.030851f, 0.075759f, 0.000651f, 0.050941f, -0.101392f, 0.002744f, -0.113977f, -0.038923f, -0.020279f, 0.033253f, 0.103122f, 0.087484f, 0.031510f, 0.051188f, -0.035122f, -0.029768f, 0.003896f, -0.008832f, 0.022965f, 0.006487f, -0.024748f, 0.033789f, 0.050290f, 0.041589f, 0.030763f, 0.025815f, -0.002133f, 0.003566f, -0.018801f, 0.047442f, 0.021439f, -0.010657f, -0.031394f, 0.008684f, 0.018618f, -0.006730f, 0.062358f, 0.065152f, -0.039992f, -0.030013f, -0.000087f, 0.050171f, 0.030708f, 0.006642f, 0.004733f, -0.014095f, -0.025008f, 0.011074f, 0.077834f, -0.034142f, -0.041194f, -0.044894f, 0.039693f, 0.014834f, -0.025826f, -0.039368f, -0.061485f, -0.072818f, 0.005552f, 0.012781f, 0.010412f, -0.018376f, -0.007628f, -0.022469f, 0.011308f, -0.059534f, -0.094978f, -0.045343f, -0.009413f, -0.019904f, -0.039275f, 0.041353f, 0.073489f, -0.022898f, 0.035660f, 0.078504f, 0.050648f, 0.011245f, -0.065153f, -0.004189f, -0.063201f, 0.052016f, -0.005965f, 0.044780f, 0.027364f, 0.001619f, 0.029857f, -0.012250f, -0.002749f, 0.025849f, 0.031465f, 0.005387f, 0.000683f, -0.000388f, -0.027645f, -0.017660f, + 0.008034f, -0.038613f, 0.001553f, -0.014110f, 0.001439f, -0.032629f, 0.006148f, 0.002516f, -0.029821f, 0.025952f, 0.011205f, 0.017787f, -0.037593f, -0.009589f, 0.007596f, -0.001310f, 0.003164f, 0.022504f, 0.005224f, 0.006803f, -0.003985f, -0.007733f, -0.005590f, -0.002419f, 0.014431f, -0.005667f, -0.023952f, 0.020379f, -0.033081f, -0.009773f, -0.011166f, 0.004721f, -0.016079f, -0.018651f, 0.025666f, -0.002523f, -0.025293f, 0.016307f, -0.035391f, 0.029210f, 0.009004f, 0.002053f, 0.029442f, 0.033365f, 0.004577f, 0.009995f, -0.024549f, 0.032348f, -0.015612f, -0.021047f, -0.002084f, 0.005261f, 0.059536f, -0.026436f, -0.044811f, 0.038219f, -0.015345f, 0.037891f, -0.007940f, 0.002047f, -0.018555f, 0.017348f, 0.027202f, -0.017814f, -0.170289f, -0.320998f, -0.116906f, -0.252163f, -0.286958f, 0.065399f, -0.013656f, 0.091089f, 0.362595f, 0.393777f, 0.276623f, 0.396670f, 0.324990f, 0.105557f, 0.111155f, 0.081659f, -0.225077f, -0.231102f, -0.130670f, -0.224347f, -0.242822f, -0.083346f, -0.074399f, -0.204522f, -0.155609f, -0.027747f, -0.093757f, -0.112889f, -0.031156f, -0.086954f, -0.152528f, -0.087407f, + 0.024033f, -0.062187f, -0.077128f, 0.085118f, -0.018299f, -0.084790f, 0.072095f, 0.137808f, -0.035409f, 0.033423f, 0.213449f, 0.028691f, -0.072000f, 0.142867f, 0.123107f, -0.124580f, 0.069291f, 0.158586f, -0.050822f, 0.018336f, 0.273252f, 0.211043f, 0.105167f, 0.387947f, 0.429381f, 0.223336f, 0.396606f, 0.515550f, 0.323212f, 0.309658f, 0.424308f, 0.279953f, 0.179179f, 0.204015f, 0.110233f, -0.095752f, -0.206051f, -0.274731f, -0.490449f, -0.586507f, -0.670406f, -0.735399f, -0.710309f, -0.591944f, -0.279099f, -0.175983f}, + {0.001818f, 0.002056f, 0.003999f, 0.004770f, 0.005359f, 0.003863f, 0.000813f, -0.000185f, -0.003831f, 0.003760f, -0.006051f, -0.004578f, 0.001901f, 0.001685f, -0.005802f, 0.010857f, -0.003356f, 0.003234f, -0.003473f, -0.003151f, 0.002335f, -0.000959f, -0.001879f, -0.001051f, 0.000673f, -0.003444f, -0.001604f, -0.006794f, 0.004090f, 0.003100f, -0.005362f, -0.002356f, -0.002338f, -0.005934f, 0.001897f, 0.001044f, -0.000234f, 0.001354f, 0.002233f, 0.000451f, 0.001939f, 0.006170f, -0.008732f, 0.001668f, -0.001377f, 0.005904f, 0.005052f, -0.004066f, 0.011634f, -0.007137f, -0.007577f, 0.001899f, 0.005189f, 0.003233f, -0.001327f, -0.001699f, -0.001204f, 0.001684f, 0.001931f, -0.000659f, -0.004529f, -0.003784f, -0.002390f, -0.005843f, 0.000760f, 0.003704f, 0.001135f, -0.001350f, -0.000885f, 0.007003f, 0.003098f, 0.002704f, 0.005273f, 0.001929f, 0.001999f, 0.002603f, -0.008114f, 0.006800f, 0.007275f, -0.003401f, 0.007299f, -0.004348f, -0.000931f, 0.009716f, -0.003935f, 0.004645f, 0.002835f, -0.010681f, -0.004813f, 0.008102f, -0.003113f, -0.001488f, 0.005091f, 0.003406f, 0.003633f, 0.001021f, + 0.012421f, 0.002173f, -0.003168f, 0.002838f, -0.004269f, 0.007743f, -0.002196f, -0.004164f, -0.001822f, -0.009978f, -0.003389f, -0.007332f, 0.002438f, -0.000060f, 0.002725f, -0.002894f, 0.004218f, 0.002061f, -0.000456f, 0.001364f, 0.000678f, 0.001050f, 0.001359f, -0.005229f, 0.013258f, 0.002042f, -0.004839f, 0.009914f, -0.002373f, -0.008387f, -0.009312f, 0.009169f, -0.001823f, -0.000619f, 0.005980f, 0.000787f, -0.001588f, 0.004813f, -0.000534f, 0.002848f, 0.000749f, 0.003596f, -0.001838f, 0.003916f, -0.001736f, 0.004640f, 0.006452f, 0.003722f, -0.003879f, -0.003728f, -0.001971f, 0.001999f, -0.004113f, 0.003201f, -0.001977f, 0.004002f, -0.000031f, 0.008536f, 0.001703f, 0.001968f, 0.007167f, 0.000122f, 0.005180f, 0.002485f, -0.000553f, 0.000582f, -0.005546f, 0.002641f, 0.000475f, 0.008778f, 0.003122f, 0.002903f, 0.000418f, 0.002620f, 0.009615f, -0.009019f, 0.005146f, 0.001389f, -0.005957f, -0.002643f, -0.003687f, -0.001178f, -0.003422f, 0.002461f, 0.011088f, 0.007001f, 0.008282f, 0.006599f, 0.011297f, 0.008251f, -0.010239f, -0.018558f, -0.002351f, 0.000892f, -0.004533f, 0.009809f, + -0.000421f, 0.014679f, -0.006857f, -0.006861f, 0.006309f, 0.000350f, 0.000508f, 0.005803f, -0.010736f, 0.002741f, -0.007699f, 0.010132f, 0.005947f, -0.000065f, 0.015381f, 0.000647f, -0.001520f, -0.001964f, -0.002760f, -0.003896f, 0.007244f, 0.003811f, -0.003820f, -0.001347f, -0.010806f, -0.004869f, -0.001494f, 0.011065f, 0.007602f, 0.001131f, 0.005574f, -0.000115f, 0.005929f, -0.000442f, 0.002350f, -0.007120f, 0.006326f, 0.014936f, 0.004073f, 0.000255f, 0.000040f, 0.003913f, 0.003593f, 0.000505f, 0.001976f, 0.003070f, -0.000692f, -0.000730f, 0.003931f, 0.016980f, 0.005346f, 0.013162f, -0.008163f, -0.006669f, -0.003029f, -0.008541f, -0.010029f, -0.004202f, 0.006557f, -0.012157f, -0.002155f, -0.001774f, -0.019024f, 0.003334f, -0.019223f, -0.006602f, -0.003029f, 0.004056f, -0.000489f, 0.003513f, -0.004210f, -0.000573f, -0.013191f, 0.004250f, -0.004769f, -0.007442f, 0.000732f, 0.003152f, -0.001202f, 0.000524f, 0.004768f, 0.009161f, -0.016761f, 0.003991f, 0.000428f, -0.005190f, -0.005819f, -0.001483f, 0.001518f, -0.002614f, -0.010426f, -0.002760f, 0.001882f, 0.004552f, -0.001451f, 0.011499f, + 0.000247f, -0.000031f, 0.004069f, -0.008315f, 0.010506f, 0.002965f, 0.005846f, 0.002279f, 0.004699f, -0.002029f, -0.002091f, 0.002389f, 0.000935f, -0.002777f, -0.004491f, -0.004355f, 0.009156f, 0.010002f, -0.000324f, 0.011031f, 0.000695f, -0.001460f, 0.001361f, 0.000901f, -0.002036f, -0.000134f, -0.007695f, -0.004430f, 0.006905f, 0.008065f, -0.009457f, -0.002301f, 0.003971f, -0.006365f, -0.018109f, 0.004467f, 0.006749f, 0.007833f, -0.004125f, -0.004869f, -0.006423f, 0.009830f, 0.011334f, 0.001862f, 0.004507f, -0.008940f, -0.007116f, 0.008297f, 0.003230f, -0.006736f, 0.011712f, -0.011780f, 0.002008f, 0.001003f, 0.010991f, 0.003892f, -0.002346f, 0.001650f, -0.003713f, 0.005850f, -0.014175f, -0.004379f, -0.020454f, -0.009133f, 0.010468f, -0.001056f, 0.016012f, -0.002379f, -0.013237f, 0.008200f, 0.001922f, -0.005691f, -0.000569f, 0.000368f, -0.005333f, 0.003224f, 0.009592f, 0.010404f, 0.000326f, 0.004738f, -0.000485f, 0.011770f, -0.006253f, 0.004739f, -0.001217f, -0.000889f, 0.000261f, 0.003381f, -0.001505f, 0.014151f, 0.001060f, -0.000436f, -0.003526f, 0.011660f, -0.014765f, -0.001647f, + -0.009860f, -0.010256f, 0.004295f, 0.002535f, 0.022621f, 0.001615f, 0.008618f, -0.018037f, -0.003963f, 0.004547f, -0.009147f, 0.006815f, 0.002318f, 0.002031f, 0.005872f, 0.006723f, 0.015006f, 0.006941f, -0.001832f, 0.005070f, -0.006776f, 0.002583f, 0.006338f, 0.000069f, 0.001689f, 0.006920f, 0.008809f, 0.020587f, 0.004409f, -0.002519f, -0.013288f, -0.000106f, 0.010928f, -0.015815f, 0.002281f, -0.000720f, 0.005601f, -0.007687f, -0.009145f, 0.017902f, -0.010651f, 0.004079f, -0.000222f, -0.010422f, 0.025653f, 0.006990f, 0.013675f, 0.007607f, 0.014906f, -0.002153f, -0.004962f, 0.009705f, -0.008017f, 0.007581f, -0.006304f, 0.004363f, 0.010393f, 0.006015f, -0.004032f, -0.000233f, 0.005492f, -0.008270f, -0.006136f, 0.001055f, -0.000701f, 0.015451f, -0.007904f, -0.013369f, -0.001889f, 0.008339f, 0.012601f, -0.007100f, -0.013436f, -0.001793f, -0.006504f, 0.006059f, -0.024736f, 0.013039f, 0.003368f, -0.006002f, 0.006676f, -0.020298f, -0.017095f, 0.001536f, -0.008781f, 0.018052f, 0.015888f, 0.017022f, -0.012429f, 0.006270f, -0.000423f, 0.016981f, 0.000551f, 0.011846f, 0.004273f, -0.005803f, + -0.016498f, -0.014865f, 0.003860f, -0.019620f, -0.001002f, -0.005038f, -0.009993f, -0.013268f, -0.008214f, -0.000405f, 0.014619f, -0.000453f, 0.005247f, -0.022331f, -0.012936f, -0.002815f, -0.014435f, 0.000465f, 0.012945f, -0.015299f, 0.005362f, -0.000656f, -0.005830f, -0.001846f, -0.003945f, 0.014623f, 0.007325f, 0.007063f, -0.004396f, -0.005043f, 0.019995f, -0.006727f, -0.006448f, -0.017568f, 0.011724f, -0.024752f, 0.002544f, -0.008431f, 0.003012f, 0.008204f, -0.006642f, -0.013414f, -0.008808f, 0.000442f, 0.016846f, -0.009316f, -0.002727f, -0.011920f, -0.009990f, 0.005182f, 0.005350f, 0.013320f, -0.017034f, -0.001011f, 0.003851f, 0.002059f, -0.023531f, 0.004898f, 0.001034f, 0.002617f, -0.031953f, 0.026484f, -0.000425f, -0.001798f, -0.001517f, -0.011257f, 0.002303f, -0.000878f, 0.008977f, -0.009925f, 0.010201f, 0.001891f, -0.007792f, -0.013215f, -0.015750f, 0.006148f, 0.000497f, -0.002641f, 0.000223f, -0.009971f, 0.008509f, 0.005529f, 0.016382f, 0.008749f, 0.006057f, 0.007992f, -0.002919f, -0.010942f, -0.007739f, -0.000951f, -0.005601f, 0.005858f, -0.008949f, -0.014238f, -0.014428f, -0.000805f, + -0.019495f, 0.007012f, 0.009460f, -0.013041f, 0.011148f, -0.015437f, 0.006501f, -0.021993f, 0.002391f, -0.005535f, 0.001201f, -0.007243f, -0.000522f, -0.020724f, -0.003301f, -0.008446f, -0.012010f, -0.005231f, -0.009316f, 0.000871f, -0.008300f, -0.007004f, -0.011849f, 0.003093f, -0.011192f, -0.003165f, 0.018986f, -0.005551f, 0.001244f, 0.003530f, -0.003159f, -0.021269f, -0.020075f, -0.005806f, -0.012639f, 0.001477f, 0.008685f, 0.005857f, -0.019416f, -0.000914f, 0.003237f, -0.018212f, -0.020503f, 0.010765f, -0.020101f, 0.003485f, 0.013229f, -0.010108f, -0.023023f, -0.010288f, 0.000517f, 0.014675f, -0.006146f, 0.026223f, -0.001804f, -0.002647f, -0.015360f, -0.011535f, -0.001720f, 0.004794f, 0.001641f, -0.006159f, -0.004470f, -0.001926f, -0.005556f, -0.012169f, 0.009668f, -0.010245f, -0.005547f, 0.009236f, 0.003277f, -0.017001f, -0.016858f, -0.016704f, 0.014066f, -0.015643f, -0.015468f, 0.024960f, -0.015812f, 0.010420f, -0.001760f, 0.005922f, -0.022837f, 0.009570f, 0.001953f, -0.005002f, -0.000488f, -0.005830f, 0.008282f, 0.004212f, 0.022827f, -0.006960f, -0.003337f, 0.008984f, 0.022229f, 0.004301f, + 0.005300f, -0.011735f, -0.005567f, -0.019302f, -0.002533f, -0.002285f, 0.001132f, 0.010786f, -0.002547f, 0.004762f, 0.023943f, -0.005563f, 0.001036f, -0.004745f, 0.001744f, -0.024499f, -0.022823f, 0.009320f, -0.001783f, 0.011072f, -0.001906f, -0.004961f, -0.007077f, 0.009361f, 0.005714f, -0.005519f, 0.004158f, 0.009526f, -0.005282f, -0.033284f, -0.014576f, -0.006698f, -0.003864f, 0.014565f, -0.026118f, -0.019250f, 0.015733f, 0.009656f, 0.039872f, 0.011071f, 0.009052f, 0.010787f, 0.004898f, -0.007411f, 0.000621f, -0.007802f, 0.012581f, 0.000323f, 0.012704f, 0.000131f, -0.000543f, -0.017852f, 0.008944f, -0.012210f, 0.009089f, -0.002129f, 0.009544f, 0.003536f, 0.012872f, -0.020675f, 0.002219f, -0.014465f, 0.016818f, 0.000664f, -0.017186f, 0.022115f, 0.016507f, 0.010264f, -0.010341f, -0.034756f, 0.009750f, -0.004230f, -0.004366f, 0.016246f, -0.001722f, 0.007162f, 0.016159f, -0.004273f, -0.020665f, -0.000944f, 0.009193f, 0.005129f, -0.005558f, -0.003317f, -0.015107f, 0.004403f, 0.002070f, 0.001726f, -0.002272f, 0.000297f, 0.012910f, -0.010524f, 0.005461f, -0.005519f, 0.009126f, -0.008862f, + -0.036754f, 0.008202f, 0.009688f, 0.038420f, -0.007331f, -0.005515f, 0.018523f, 0.024079f, -0.037719f, -0.021314f, 0.021575f, -0.010332f, 0.001336f, 0.009136f, -0.023783f, -0.052960f, -0.020359f, 0.030936f, 0.024830f, 0.020978f, -0.005557f, 0.011980f, -0.005580f, 0.011063f, -0.010478f, 0.004208f, -0.026315f, 0.007089f, -0.008842f, 0.014299f, 0.014141f, 0.000918f, -0.012045f, 0.013029f, 0.008647f, 0.022164f, -0.001538f, -0.013111f, -0.006001f, -0.033901f, -0.016791f, 0.008748f, -0.001554f, -0.022641f, 0.016332f, 0.021640f, -0.029509f, 0.029518f, -0.002023f, -0.003019f, 0.019194f, 0.003940f, 0.018205f, -0.002194f, 0.007042f, -0.006598f, -0.002702f, 0.008755f, 0.035833f, -0.012804f, 0.023154f, -0.002149f, 0.003001f, 0.007944f, 0.020349f, -0.018565f, 0.003090f, 0.027497f, 0.009548f, -0.014355f, 0.008729f, 0.009239f, 0.003908f, 0.019109f, 0.017517f, -0.002111f, -0.024689f, -0.006609f, 0.024800f, 0.015525f, 0.018647f, -0.012748f, -0.006461f, -0.002464f, -0.002885f, 0.026387f, 0.003269f, -0.028233f, -0.012520f, -0.009049f, 0.017607f, 0.002851f, 0.003700f, 0.014432f, 0.032928f, -0.049498f, + 0.032310f, -0.007153f, -0.005808f, -0.013379f, 0.009632f, 0.009160f, 0.019058f, 0.002118f, 0.018199f, -0.002763f, -0.004740f, 0.004698f, -0.002894f, 0.008289f, 0.016852f, 0.000948f, -0.001036f, 0.020846f, -0.016040f, -0.004168f, 0.005664f, -0.003108f, 0.019691f, -0.024078f, 0.002499f, -0.020856f, 0.003655f, -0.022106f, -0.002377f, -0.000849f, 0.011971f, 0.026459f, -0.015655f, -0.010686f, -0.016162f, -0.002769f, -0.023884f, -0.018005f, -0.015273f, 0.008967f, 0.021413f, -0.001924f, 0.041454f, -0.027785f, 0.037399f, -0.027812f, -0.004092f, 0.008315f, 0.010328f, 0.032563f, 0.023161f, -0.029785f, 0.017381f, -0.014289f, -0.031717f, -0.001599f, -0.022745f, -0.013655f, 0.002072f, 0.033315f, -0.003376f, 0.016142f, 0.031162f, -0.021672f, 0.012998f, -0.036172f, 0.025933f, -0.021242f, -0.009045f, 0.039926f, 0.015272f, 0.042845f, -0.014691f, 0.002730f, -0.015715f, 0.014130f, 0.054387f, 0.015755f, 0.020159f, -0.023726f, -0.002408f, 0.003735f, 0.022565f, 0.020054f, 0.035804f, -0.024528f, -0.006706f, -0.026908f, -0.022207f, 0.004289f, 0.004749f, 0.019819f, -0.014250f, 0.014609f, -0.037074f, 0.027426f, + 0.021774f, 0.011443f, -0.003915f, -0.002280f, 0.005469f, 0.014293f, 0.006845f, 0.005777f, 0.002770f, 0.029538f, 0.026252f, 0.012474f, 0.005174f, -0.018081f, -0.017040f, 0.058365f, 0.005320f, 0.009412f, 0.034519f, 0.016223f, -0.005375f, -0.004178f, 0.023417f, 0.042660f, -0.025449f, -0.009810f, -0.028964f, -0.028281f, 0.043567f, 0.019812f, 0.004881f, -0.005745f, 0.017955f, 0.031581f, 0.024633f, 0.031633f, 0.015033f, -0.011816f, 0.001059f, -0.001687f, 0.011638f, -0.026457f, -0.020011f, -0.007958f, -0.024839f, 0.027059f, -0.003687f, -0.007199f, -0.023758f, -0.004031f, -0.022204f, -0.053432f, 0.008530f, -0.006654f, -0.017581f, 0.012006f, -0.029073f, -0.001708f, -0.016295f, -0.042668f, -0.010678f, -0.018428f, -0.021171f, 0.034306f, -0.010112f, -0.012116f, -0.007226f, -0.000521f, -0.009724f, -0.011740f, -0.003040f, 0.009389f, 0.027749f, 0.022217f, -0.002022f, -0.001181f, -0.049738f, 0.003528f, 0.005329f, 0.020511f, -0.012542f, -0.009380f, 0.072175f, -0.011874f, -0.037425f, -0.034112f, 0.029001f, -0.019525f, 0.007231f, -0.040436f, 0.008663f, -0.010558f, -0.023884f, -0.018022f, -0.048919f, 0.008790f, + 0.011630f, 0.034804f, 0.007846f, -0.016772f, 0.024254f, 0.004563f, 0.022515f, 0.029099f, 0.076995f, 0.022849f, 0.002667f, -0.029450f, -0.037973f, -0.007979f, -0.000340f, -0.003474f, -0.036749f, 0.013971f, 0.028082f, 0.006684f, -0.010287f, -0.031769f, -0.013490f, -0.004642f, 0.010346f, -0.011435f, 0.019571f, -0.009635f, -0.012657f, 0.037367f, 0.019820f, 0.042436f, 0.001100f, -0.012034f, -0.016058f, 0.044938f, -0.037794f, -0.014152f, 0.052870f, -0.031332f, 0.011139f, 0.011017f, 0.014287f, 0.003201f, 0.030119f, -0.009036f, 0.027226f, -0.009915f, 0.006642f, 0.006396f, -0.012667f, 0.019685f, -0.028761f, -0.020637f, -0.018276f, -0.008824f, -0.025354f, -0.048662f, -0.007745f, -0.014562f, 0.008927f, -0.012539f, -0.063458f, 0.017989f, 0.041960f, -0.002351f, -0.007258f, 0.063605f, -0.077334f, -0.017066f, 0.045519f, -0.010786f, 0.035773f, -0.025068f, -0.013783f, 0.011837f, -0.073319f, 0.024339f, -0.023580f, 0.037635f, 0.029829f, -0.039943f, 0.081314f, 0.011724f, 0.006798f, -0.003927f, 0.033996f, -0.056930f, 0.026636f, -0.002418f, -0.005322f, 0.015718f, -0.032467f, 0.052925f, 0.052943f, -0.086409f, + 0.018374f, 0.017285f, 0.004324f, 0.050221f, -0.019756f, -0.060392f, -0.060648f, 0.006893f, 0.009625f, -0.025536f, 0.018187f, -0.032814f, 0.013030f, -0.013780f, 0.034033f, 0.043225f, 0.003207f, 0.041907f, 0.038138f, -0.018108f, 0.001354f, -0.023713f, -0.004607f, -0.003947f, 0.015880f, -0.000393f, -0.002101f, -0.002153f, -0.039889f, -0.060969f, -0.023503f, 0.035215f, 0.027399f, -0.024823f, -0.029265f, 0.020539f, 0.020387f, -0.038713f, 0.022683f, -0.024911f, -0.003118f, 0.034276f, 0.046144f, 0.002860f, -0.024134f, 0.019514f, 0.005430f, 0.030200f, 0.006870f, 0.025725f, 0.025843f, -0.003834f, -0.088333f, 0.013215f, 0.004628f, 0.039697f, -0.011017f, 0.040545f, 0.039426f, -0.021444f, -0.120180f, -0.012970f, 0.007632f, -0.011080f, 0.076529f, 0.081271f, 0.056924f, 0.081013f, -0.016747f, 0.040533f, -0.026890f, 0.056079f, 0.039920f, -0.055580f, 0.081100f, -0.073835f, -0.061524f, -0.056180f, -0.046284f, -0.089462f, 0.021587f, 0.036191f, -0.002675f, 0.048894f, 0.020063f, -0.055500f, -0.012379f, 0.014742f, 0.016463f, 0.018401f, -0.009501f, 0.029332f, 0.004476f, -0.014747f, -0.005743f, 0.012124f, + 0.040354f, 0.052428f, 0.039821f, 0.062397f, -0.055293f, -0.013260f, -0.012751f, -0.056037f, -0.011935f, 0.012897f, 0.005155f, 0.009377f, -0.021257f, -0.023612f, 0.032056f, 0.070098f, -0.029599f, 0.037672f, -0.020485f, 0.012089f, -0.018702f, -0.000444f, -0.050102f, -0.015849f, -0.000720f, -0.069224f, -0.040095f, -0.067596f, -0.057567f, 0.043171f, 0.095986f, 0.078227f, 0.004660f, -0.001048f, 0.002798f, -0.013075f, -0.029539f, -0.109611f, -0.035172f, -0.012297f, 0.012163f, 0.008963f, -0.036961f, -0.023749f, 0.018020f, 0.054307f, 0.033379f, 0.020597f, 0.036619f, 0.060628f, 0.026398f, -0.051358f, 0.048070f, -0.028496f, -0.011179f, 0.037739f, 0.082568f, 0.019781f, 0.102890f, -0.039345f, -0.064266f, 0.039385f, -0.006407f, -0.038970f, 0.018507f, 0.041733f, 0.036263f, -0.075167f, -0.064766f, 0.015779f, -0.030131f, 0.007271f, 0.036521f, -0.020314f, -0.014721f, 0.060053f, 0.016398f, -0.008895f, -0.019236f, -0.017665f, 0.022742f, -0.014131f, -0.002603f, -0.002330f, -0.024528f, -0.010094f, -0.040848f, -0.055160f, 0.019646f, 0.029150f, -0.034256f, 0.024523f, 0.017464f, -0.012598f, -0.023627f, 0.002954f, + 0.043444f, 0.024070f, 0.008134f, -0.043952f, -0.047856f, -0.024357f, 0.013511f, 0.053166f, -0.039979f, -0.022368f, -0.017830f, 0.031301f, 0.087723f, 0.022017f, -0.084433f, -0.020017f, -0.009218f, 0.042566f, 0.001876f, 0.021400f, -0.010136f, -0.021553f, -0.017772f, -0.049697f, 0.046161f, 0.045988f, 0.020549f, 0.048522f, -0.014232f, 0.030487f, -0.013350f, -0.038751f, -0.038223f, -0.045908f, 0.009946f, -0.084179f, 0.087300f, -0.008957f, -0.028060f, -0.052740f, 0.058778f, 0.042474f, 0.012224f, 0.003122f, 0.024225f, 0.021262f, -0.050837f, -0.070506f, 0.015235f, 0.043268f, 0.064897f, -0.006278f, -0.022501f, -0.051313f, -0.032741f, 0.023248f, -0.007405f, -0.044869f, -0.083340f, -0.083602f, 0.009593f, -0.029973f, 0.036446f, -0.095383f, -0.035853f, 0.010191f, 0.006057f, 0.009764f, -0.034703f, 0.005708f, -0.009136f, -0.023821f, -0.010108f, -0.048788f, 0.031419f, 0.039865f, 0.028169f, -0.063339f, -0.036883f, -0.008894f, 0.011853f, 0.020442f, 0.022893f, 0.016353f, -0.013624f, -0.011879f, -0.015000f, 0.031946f, 0.103339f, 0.061870f, -0.065485f, -0.065143f, -0.044037f, -0.081695f, 0.078072f, 0.037270f, + -0.035102f, -0.084848f, -0.081416f, 0.073546f, 0.041860f, 0.001640f, 0.054211f, -0.075854f, -0.017256f, -0.005952f, -0.027597f, -0.003932f, -0.035982f, -0.077577f, 0.004259f, -0.061977f, 0.054680f, 0.054186f, -0.040136f, -0.019138f, -0.017077f, -0.022412f, 0.044120f, -0.070179f, 0.062505f, 0.092193f, 0.099585f, -0.110691f, 0.020962f, -0.002442f, -0.009231f, 0.048417f, -0.019890f, -0.031972f, 0.032932f, 0.017953f, 0.068006f, -0.005588f, -0.053731f, 0.003033f, -0.024588f, 0.041600f, -0.061909f, -0.020315f, -0.029254f, -0.039522f, 0.056084f, -0.039537f, -0.006258f, 0.040624f, 0.022068f, -0.011833f, -0.022142f, -0.055870f, 0.006821f, 0.078155f, 0.045640f, -0.001193f, 0.021825f, -0.015024f, 0.061292f, -0.039700f, 0.027742f, -0.020848f, 0.037565f, 0.066566f, -0.015418f, -0.039287f, 0.019362f, -0.054399f, 0.092903f, 0.013578f, -0.051365f, -0.014544f, -0.079431f, 0.012556f, 0.110254f, -0.017718f, -0.067241f, -0.043289f, 0.066990f, 0.023061f, -0.037446f, 0.000712f, 0.016250f, 0.040859f, 0.092883f, -0.074573f, 0.033207f, 0.079092f, -0.012288f, -0.089769f, -0.088242f, -0.051000f, 0.155871f, -0.113314f, + 0.041259f, -0.113476f, -0.041612f, 0.040193f, -0.105279f, 0.017998f, -0.094601f, 0.041210f, 0.044283f, 0.087600f, 0.038692f, 0.019722f, 0.022783f, -0.027936f, -0.067539f, -0.047343f, -0.044406f, 0.018333f, 0.010790f, -0.012041f, 0.040100f, 0.061500f, -0.027914f, -0.039629f, 0.043023f, 0.007019f, -0.057522f, -0.013890f, 0.025968f, -0.048094f, -0.008396f, 0.009741f, 0.024133f, 0.012104f, 0.034158f, 0.057715f, 0.010396f, -0.038114f, -0.004214f, 0.010432f, -0.029502f, -0.014111f, 0.027512f, -0.021671f, -0.037318f, 0.051259f, -0.012355f, -0.013876f, -0.020491f, -0.021489f, 0.034142f, 0.007611f, 0.008092f, 0.043999f, -0.021117f, -0.035855f, -0.001561f, 0.002261f, -0.014243f, 0.010401f, -0.001878f, -0.013528f, -0.001604f, -0.045028f, 0.010493f, 0.007431f, -0.006678f, 0.022488f, 0.016837f, 0.007144f, 0.011537f, -0.046350f, 0.054719f, -0.020941f, -0.018264f, 0.016024f, -0.047920f, 0.016707f, -0.035958f, 0.008640f, -0.047856f, 0.079735f, -0.003143f, 0.045509f, -0.039544f, 0.005878f, -0.006360f, 0.014939f, 0.013734f, 0.024742f, -0.011204f, 0.018404f, -0.009916f, 0.010480f, -0.000712f, 0.008433f, + 0.020081f, -0.001619f, 0.030576f, -0.011136f, 0.023388f, 0.001861f, 0.000183f, -0.007672f, 0.015417f, -0.010720f, 0.014061f, -0.006972f, 0.002098f, -0.005705f, 0.008279f, -0.004577f, 0.018020f, -0.004700f, -0.010476f, 0.027389f, -0.017290f, 0.014529f, 0.012653f, 0.004573f, 0.014402f, -0.016081f, -0.010036f, 0.012700f, 0.012988f, -0.006936f, -0.000058f, 0.013427f, 0.000357f, -0.018126f, 0.009659f, -0.009165f, 0.011081f, 0.012868f, 0.007731f, 0.004391f, 0.005920f, -0.019812f, 0.011514f, 0.005395f, -0.004004f, 0.006941f, -0.007227f, 0.004084f, -0.002424f, -0.001490f, -0.000126f, 0.006089f, 0.015854f, -0.019492f, 0.019256f, -0.004699f, -0.003341f, 0.007466f, -0.009272f, 0.003263f, 0.012431f, -0.003385f, 0.019973f, -0.066082f, -0.206808f, -0.030069f, 0.100934f, 0.052444f, 0.244841f, 0.045894f, 0.052877f, 0.033523f, -0.065590f, -0.092332f, -0.065834f, -0.118474f, -0.101966f, -0.057505f, -0.023548f, 0.068565f, 0.185925f, 0.147805f, 0.127069f, 0.072641f, -0.056968f, -0.092455f, -0.068262f, -0.127605f, -0.121246f, -0.036659f, -0.016908f, -0.027752f, 0.047177f, 0.074197f, 0.048781f, 0.090372f, + 0.069445f, 0.021856f, 0.063866f, 0.013653f, -0.009449f, 0.006546f, -0.038448f, -0.100523f, -0.086034f, -0.072407f, -0.102612f, -0.042244f, 0.029937f, 0.021351f, 0.065647f, 0.075157f, 0.064950f, 0.067527f, 0.068066f, 0.044016f, 0.042137f, 0.005483f, -0.037965f, -0.069837f, -0.048398f, -0.065653f, -0.088126f, -0.042376f, -0.040488f, -0.031858f, 0.012361f, 0.034471f, 0.031877f, 0.063377f, 0.077735f, 0.038873f, 0.054860f, 0.048165f, -0.012849f, 0.006943f, 0.021269f, -0.024280f, -0.024220f, -0.036967f, -0.033727f, -0.018175f} + }, + { + {0.002918f, 0.005029f, 0.000714f, 0.002853f, 0.006330f, -0.001978f, 0.006738f, 0.001745f, 0.001243f, -0.007809f, -0.001932f, -0.007740f, -0.000934f, 0.007770f, 0.005638f, -0.000557f, 0.003545f, -0.001114f, 0.002949f, -0.000970f, 0.003689f, 0.003121f, 0.003992f, 0.009549f, 0.004008f, -0.007040f, -0.000639f, -0.007973f, 0.004108f, 0.002956f, -0.001205f, 0.000809f, 0.000887f, -0.001728f, -0.002500f, 0.004773f, -0.002182f, 0.001543f, 0.004268f, -0.004246f, 0.007171f, -0.001680f, -0.000003f, 0.003410f, -0.001536f, 0.001121f, 0.000808f, 0.003604f, 0.005625f, 0.000110f, 0.000861f, -0.002056f, -0.000272f, 0.000339f, -0.003171f, -0.003005f, 0.003559f, 0.009655f, -0.000884f, -0.005397f, -0.004841f, 0.003040f, 0.004768f, 0.005496f, 0.003106f, 0.007846f, 0.000459f, 0.005688f, -0.004512f, -0.002993f, 0.003590f, -0.001157f, 0.004790f, -0.000295f, -0.001576f, 0.002565f, -0.006599f, 0.005035f, 0.003170f, -0.006503f, -0.001134f, 0.008382f, 0.002490f, 0.002101f, 0.004612f, -0.001045f, 0.001265f, -0.002123f, -0.008725f, -0.003379f, -0.000435f, -0.001870f, 0.002503f, -0.002642f, -0.000856f, -0.007330f, + -0.000023f, 0.001341f, -0.005238f, -0.001066f, -0.006612f, -0.002270f, -0.002127f, -0.007898f, -0.003695f, 0.002622f, 0.003439f, 0.009026f, 0.005250f, 0.011511f, -0.001288f, -0.001769f, 0.001619f, -0.003843f, 0.009871f, 0.000686f, 0.004626f, 0.007978f, 0.001311f, -0.003080f, 0.003146f, -0.004095f, -0.005677f, -0.001291f, -0.002507f, -0.002980f, -0.010427f, -0.003223f, -0.000051f, 0.001737f, 0.002978f, 0.000989f, 0.005143f, -0.005734f, 0.004520f, 0.000093f, 0.001033f, 0.003412f, -0.004203f, -0.009001f, -0.004062f, 0.004024f, 0.005586f, 0.004462f, 0.000249f, 0.004539f, 0.003250f, 0.006112f, 0.002961f, 0.002663f, -0.003915f, 0.000272f, -0.000241f, -0.004951f, 0.004395f, -0.007530f, -0.004684f, 0.011697f, -0.002076f, 0.010320f, -0.005516f, 0.000850f, 0.005038f, 0.002137f, 0.000201f, -0.007214f, -0.010130f, -0.010594f, 0.000982f, 0.000091f, -0.003087f, 0.001235f, -0.009357f, 0.018188f, 0.001946f, -0.010401f, 0.002591f, -0.005539f, -0.005953f, 0.005291f, 0.007668f, -0.000308f, 0.001636f, 0.003525f, -0.000676f, -0.000158f, 0.006008f, -0.003554f, -0.001597f, 0.000161f, 0.011039f, -0.000430f, + -0.001394f, -0.004423f, -0.006665f, 0.003212f, -0.001702f, -0.006979f, -0.003123f, -0.008363f, 0.001027f, -0.007615f, 0.000112f, -0.005833f, -0.001890f, -0.005170f, -0.010257f, -0.004461f, -0.000665f, 0.009367f, 0.001412f, -0.003093f, 0.005270f, 0.008517f, 0.001361f, -0.012380f, 0.005592f, -0.000408f, 0.002326f, 0.003539f, -0.002689f, 0.007161f, -0.003653f, -0.007351f, -0.006890f, -0.013219f, 0.001470f, -0.005099f, -0.004044f, -0.006708f, -0.009669f, 0.014989f, -0.004304f, -0.014464f, 0.000656f, 0.004333f, 0.000036f, 0.003950f, 0.003201f, -0.011569f, 0.003574f, -0.003062f, -0.000832f, -0.000033f, -0.002404f, 0.007981f, -0.002986f, -0.006009f, -0.000843f, 0.006258f, 0.003910f, 0.001989f, 0.003635f, 0.015881f, 0.003992f, -0.006186f, 0.007081f, -0.007443f, 0.001948f, -0.006130f, 0.015113f, 0.001810f, -0.005345f, -0.003640f, -0.005352f, -0.002379f, 0.009933f, -0.008828f, -0.007197f, -0.002773f, 0.008184f, 0.004168f, -0.008141f, 0.001498f, 0.001480f, -0.005340f, -0.000058f, -0.017589f, 0.005315f, -0.004680f, -0.003487f, -0.011501f, 0.015890f, 0.000024f, -0.008693f, -0.007547f, -0.008530f, -0.000337f, + -0.002041f, -0.000123f, -0.000300f, -0.010781f, 0.012553f, -0.008385f, -0.006869f, 0.003831f, 0.001135f, 0.003701f, -0.003825f, -0.002203f, -0.008117f, -0.000883f, 0.001450f, -0.011808f, -0.007843f, -0.001377f, 0.013389f, 0.000399f, 0.002892f, -0.011107f, 0.003407f, 0.006342f, 0.004651f, -0.000497f, -0.005552f, 0.014373f, 0.002516f, -0.002915f, 0.006928f, 0.005598f, -0.006717f, 0.008775f, -0.005913f, 0.014500f, 0.002093f, 0.012929f, -0.001386f, 0.002217f, -0.005061f, -0.014799f, 0.001632f, 0.000211f, 0.000548f, -0.002642f, 0.003075f, 0.007663f, -0.001901f, -0.007674f, -0.004951f, -0.010876f, -0.002917f, -0.005429f, -0.005628f, 0.000844f, 0.003765f, 0.005681f, -0.006849f, 0.004654f, -0.004561f, -0.005931f, -0.000710f, 0.004739f, 0.000993f, 0.001014f, -0.010680f, -0.010597f, -0.001897f, -0.003320f, -0.007791f, 0.016864f, 0.008017f, -0.001370f, 0.003367f, 0.006572f, -0.017219f, -0.009082f, 0.011645f, -0.006834f, 0.010917f, 0.002055f, -0.002231f, -0.012055f, -0.008544f, 0.013272f, 0.007294f, 0.012446f, -0.013749f, -0.001645f, -0.009623f, -0.001600f, 0.003108f, -0.006126f, 0.000815f, 0.001331f, + -0.022524f, 0.001244f, -0.002855f, 0.006152f, -0.013611f, 0.004408f, -0.004560f, 0.022852f, -0.006005f, -0.011783f, -0.004280f, -0.009879f, 0.003140f, 0.008506f, -0.002652f, 0.015982f, 0.001684f, -0.004670f, 0.003896f, 0.001979f, 0.004208f, -0.005615f, -0.000940f, 0.005971f, 0.009418f, 0.003741f, -0.001809f, 0.004529f, -0.008297f, -0.002571f, 0.011836f, 0.008454f, 0.013890f, 0.009848f, -0.000162f, -0.006994f, -0.014670f, 0.010217f, -0.001535f, -0.010710f, 0.005664f, -0.002797f, -0.016427f, 0.000478f, -0.013675f, -0.001044f, 0.012545f, -0.002062f, -0.009153f, -0.004209f, 0.012001f, -0.010244f, -0.016739f, 0.017181f, -0.003091f, -0.004090f, 0.004160f, 0.002251f, 0.002191f, 0.004204f, 0.004308f, 0.002378f, -0.012219f, -0.004607f, 0.009840f, -0.001164f, -0.003405f, 0.003063f, 0.016821f, -0.008164f, -0.008720f, -0.003931f, 0.007333f, 0.003756f, -0.013911f, -0.006107f, -0.019650f, -0.000280f, 0.005430f, 0.019194f, 0.019824f, -0.006202f, 0.009938f, -0.012521f, 0.004298f, 0.008519f, 0.012776f, -0.003541f, 0.019096f, -0.003422f, 0.016214f, -0.008648f, 0.013602f, -0.006630f, -0.022304f, -0.004945f, + 0.005715f, -0.007592f, 0.008769f, -0.004708f, -0.005278f, 0.002574f, -0.024473f, -0.007799f, -0.000407f, -0.004126f, -0.001382f, -0.011733f, -0.004012f, -0.004093f, 0.003995f, 0.025201f, 0.014523f, -0.014426f, 0.008043f, 0.020182f, 0.005039f, -0.006885f, 0.005058f, -0.005145f, -0.005910f, 0.014567f, 0.010087f, -0.009889f, -0.001306f, 0.010426f, 0.021528f, -0.006777f, 0.011717f, 0.032050f, 0.013745f, -0.014567f, 0.005945f, 0.003846f, -0.017791f, 0.002797f, -0.014721f, 0.006695f, -0.016059f, -0.003647f, 0.000591f, 0.007691f, -0.010553f, -0.002781f, -0.005325f, -0.009401f, 0.012075f, 0.010625f, -0.000870f, -0.006918f, 0.001435f, 0.008229f, -0.004772f, -0.020490f, 0.004167f, -0.016555f, 0.002149f, -0.005801f, 0.020358f, -0.011034f, 0.002497f, 0.004997f, 0.001631f, 0.007074f, -0.003484f, 0.022290f, 0.001365f, -0.015245f, -0.003161f, -0.011368f, -0.002151f, -0.004023f, -0.010592f, -0.013278f, -0.003676f, -0.008721f, -0.004277f, 0.014092f, 0.005044f, -0.012789f, 0.004443f, -0.015178f, -0.003141f, 0.010236f, -0.020417f, -0.018182f, 0.009754f, 0.009020f, 0.004591f, -0.001052f, -0.012501f, 0.004390f, + -0.006309f, -0.011946f, -0.005606f, 0.000204f, 0.003375f, 0.018659f, -0.007772f, -0.002546f, 0.000770f, 0.008521f, 0.004459f, -0.006950f, -0.008730f, -0.015603f, -0.004853f, -0.003671f, -0.008579f, -0.010047f, 0.006097f, 0.012548f, -0.000195f, -0.008271f, 0.013990f, 0.002662f, -0.007063f, 0.001784f, -0.002157f, -0.001648f, -0.004959f, -0.002381f, 0.009017f, -0.006637f, -0.011186f, -0.005172f, 0.005016f, -0.005918f, 0.010531f, 0.019916f, -0.014552f, -0.000389f, 0.013675f, -0.006337f, -0.009427f, 0.012462f, -0.019274f, -0.001133f, 0.003891f, -0.002502f, -0.006984f, -0.008581f, -0.003810f, 0.003375f, -0.000701f, 0.009323f, 0.005083f, -0.003179f, -0.007046f, -0.005508f, 0.015811f, 0.000502f, -0.018370f, 0.008649f, -0.011431f, -0.011817f, 0.007649f, 0.013377f, 0.014342f, 0.010284f, 0.000221f, 0.006857f, 0.005406f, 0.006432f, -0.005553f, -0.000601f, -0.004914f, -0.013868f, 0.006378f, -0.003850f, -0.000024f, -0.003374f, 0.002075f, -0.002661f, 0.015763f, 0.027383f, 0.005428f, -0.005327f, 0.000808f, -0.020429f, 0.020242f, -0.014147f, -0.007801f, -0.013684f, -0.014927f, 0.026379f, 0.002614f, -0.015784f, + -0.004234f, 0.017874f, 0.010938f, -0.015022f, -0.009158f, 0.020468f, 0.003288f, 0.001196f, 0.029411f, -0.014318f, 0.009571f, -0.011113f, -0.025158f, 0.011642f, 0.016124f, 0.000874f, -0.011383f, 0.008644f, 0.011252f, 0.021463f, 0.019606f, -0.001541f, 0.016615f, 0.007052f, 0.016960f, 0.016332f, -0.029080f, 0.009537f, -0.009880f, -0.013023f, -0.009651f, -0.003434f, -0.018789f, -0.004550f, 0.003737f, -0.016236f, -0.032446f, 0.006494f, -0.002917f, -0.029388f, -0.021681f, -0.019525f, -0.011150f, 0.000233f, -0.006050f, 0.006003f, -0.004451f, 0.010576f, 0.021517f, -0.013511f, 0.006877f, -0.005809f, -0.010836f, -0.008221f, 0.000684f, -0.003008f, -0.001589f, 0.015690f, -0.001355f, 0.015813f, 0.020920f, 0.005590f, 0.008622f, 0.013422f, -0.002551f, 0.002009f, -0.022004f, 0.019034f, -0.018077f, -0.007034f, -0.006235f, 0.000836f, -0.005509f, -0.017542f, -0.015334f, -0.033028f, 0.028323f, -0.033743f, -0.032483f, 0.004345f, 0.029704f, 0.009753f, -0.004719f, -0.008755f, 0.013196f, -0.016511f, 0.016666f, -0.006307f, 0.001312f, 0.000555f, -0.012638f, 0.010890f, -0.014915f, -0.012605f, 0.003302f, 0.014052f, + 0.018109f, 0.018054f, 0.019651f, 0.045146f, 0.020779f, 0.026101f, -0.011699f, 0.041812f, -0.022611f, 0.001815f, 0.009946f, 0.000483f, -0.014564f, 0.005788f, -0.003356f, -0.034410f, 0.014219f, -0.008207f, 0.004720f, -0.002679f, -0.010638f, 0.000610f, 0.011418f, -0.013582f, -0.006334f, -0.001653f, 0.009276f, -0.020844f, 0.014601f, 0.005631f, -0.018522f, -0.001034f, 0.009088f, -0.017279f, 0.007772f, -0.020839f, 0.010971f, -0.001392f, -0.005725f, -0.000417f, -0.012723f, 0.018277f, 0.022356f, -0.019798f, -0.010281f, 0.009474f, -0.005915f, 0.005925f, 0.006392f, 0.001619f, 0.001996f, 0.024621f, -0.004809f, -0.016127f, 0.016478f, -0.000491f, -0.011442f, -0.010711f, -0.018852f, 0.003909f, 0.006966f, 0.010048f, 0.011180f, -0.009567f, -0.014306f, 0.008467f, 0.005821f, 0.029940f, 0.004554f, -0.004651f, 0.001937f, 0.000630f, -0.008227f, -0.006525f, -0.023674f, -0.026634f, 0.045280f, 0.031699f, 0.040499f, 0.002911f, -0.025532f, 0.009447f, 0.021249f, 0.015304f, -0.006336f, -0.015957f, -0.004570f, -0.005622f, -0.007703f, -0.013669f, -0.005434f, -0.011411f, 0.030178f, 0.005197f, 0.005127f, 0.000638f, + 0.001907f, 0.003602f, -0.010944f, 0.020271f, 0.011332f, -0.000756f, 0.007324f, -0.002395f, 0.020517f, 0.004202f, -0.001742f, -0.032985f, -0.002427f, 0.002542f, 0.003209f, -0.005817f, 0.004182f, -0.015391f, 0.027108f, 0.022419f, 0.021162f, 0.018953f, -0.014636f, -0.019723f, 0.015359f, 0.005194f, 0.007422f, -0.000909f, -0.023643f, -0.016569f, 0.001139f, -0.012845f, -0.000105f, -0.010747f, -0.005147f, 0.014417f, 0.004109f, -0.009745f, 0.003158f, -0.025684f, 0.000271f, -0.043783f, -0.022981f, -0.041432f, 0.035115f, 0.032360f, 0.033564f, 0.041711f, 0.019026f, -0.007255f, -0.020249f, -0.006283f, -0.003614f, 0.004852f, 0.027538f, -0.015721f, -0.021218f, 0.019149f, 0.024835f, -0.011864f, 0.023097f, 0.003403f, -0.009376f, 0.009343f, -0.032728f, -0.010102f, 0.009676f, -0.010392f, -0.019899f, -0.038082f, 0.019171f, -0.016304f, 0.004843f, 0.024854f, 0.006390f, 0.028951f, 0.022556f, 0.012630f, 0.005245f, -0.016977f, -0.004464f, -0.008866f, 0.002133f, 0.016120f, 0.008985f, 0.003355f, 0.014366f, 0.039267f, -0.001365f, -0.033354f, -0.013928f, 0.005404f, 0.008786f, -0.001907f, 0.001652f, 0.003158f, + -0.013357f, 0.000871f, -0.030473f, 0.007055f, -0.031856f, -0.011996f, -0.024368f, 0.012513f, -0.011535f, -0.020895f, 0.033111f, 0.008922f, 0.003950f, -0.014350f, -0.017644f, 0.004769f, 0.009181f, 0.002813f, 0.012145f, -0.016273f, 0.037770f, -0.043456f, 0.013491f, -0.018069f, -0.023943f, -0.014702f, 0.025611f, 0.006994f, -0.021457f, 0.017643f, -0.015734f, 0.048485f, 0.000574f, -0.005234f, -0.016114f, 0.002016f, 0.045347f, 0.046662f, 0.044014f, 0.009310f, -0.011914f, -0.007482f, -0.028498f, 0.022964f, 0.000599f, 0.013426f, -0.008579f, 0.004235f, -0.010463f, -0.008115f, -0.016500f, 0.008752f, -0.017175f, 0.027965f, -0.073388f, -0.021483f, 0.000466f, -0.022325f, 0.015703f, -0.022949f, 0.004637f, -0.008961f, 0.023010f, 0.003950f, 0.022151f, 0.001450f, -0.005285f, -0.000521f, 0.008083f, -0.025859f, -0.018496f, -0.020160f, -0.002867f, 0.024818f, -0.049355f, 0.016921f, 0.042857f, 0.005072f, -0.031589f, -0.001454f, -0.026610f, -0.025701f, 0.017612f, -0.003572f, -0.021744f, 0.011823f, 0.001773f, -0.008358f, -0.012303f, 0.006739f, 0.017792f, 0.010529f, -0.025265f, -0.018742f, 0.014371f, 0.021383f, + -0.017826f, -0.023865f, 0.011473f, 0.023910f, -0.029754f, -0.001545f, -0.026631f, -0.036916f, 0.042913f, -0.007935f, 0.006240f, -0.009050f, 0.026020f, -0.007579f, 0.005062f, -0.016107f, 0.018788f, -0.011349f, -0.003625f, -0.038003f, -0.019257f, -0.010983f, -0.032663f, -0.045663f, -0.010889f, -0.017210f, 0.037362f, 0.009163f, 0.056966f, 0.007873f, -0.020117f, 0.004954f, 0.008438f, -0.051910f, -0.000129f, 0.039984f, 0.024352f, -0.031513f, 0.000959f, 0.018462f, -0.042276f, -0.009339f, -0.022658f, 0.013653f, -0.018396f, 0.007936f, -0.000345f, -0.010866f, -0.000901f, -0.003224f, -0.015701f, 0.010241f, -0.029797f, -0.013627f, -0.014588f, -0.036771f, -0.010196f, -0.007701f, -0.002659f, -0.000921f, -0.012379f, -0.013954f, 0.057880f, 0.014945f, -0.027093f, -0.046821f, -0.019096f, 0.000782f, 0.040745f, -0.014422f, -0.009297f, -0.028526f, -0.010220f, -0.021326f, 0.032523f, -0.033554f, 0.028498f, 0.036755f, -0.045415f, 0.022927f, 0.006195f, -0.022248f, -0.019999f, 0.005101f, 0.014598f, -0.095673f, -0.016897f, -0.005816f, -0.017786f, 0.017707f, -0.018279f, -0.074171f, -0.033625f, -0.026002f, -0.012862f, 0.010160f, + 0.060116f, -0.001940f, -0.069988f, -0.039394f, -0.043225f, -0.008369f, -0.023789f, -0.001305f, -0.035323f, 0.058012f, 0.035016f, -0.006645f, 0.046290f, 0.000910f, 0.049946f, 0.011376f, -0.028038f, -0.039488f, -0.023951f, -0.032015f, -0.013370f, 0.007035f, 0.022094f, -0.007658f, 0.007815f, -0.026706f, 0.005348f, -0.038247f, -0.002393f, -0.003001f, 0.013946f, -0.014975f, 0.061170f, 0.006783f, -0.000287f, 0.038792f, -0.014079f, -0.029304f, -0.015072f, 0.023277f, -0.000254f, -0.017210f, 0.008425f, -0.001455f, 0.052918f, 0.011311f, 0.002184f, -0.021150f, -0.028615f, -0.079224f, 0.007415f, -0.063281f, 0.033897f, 0.104550f, -0.072998f, -0.017776f, 0.020225f, -0.014673f, -0.010023f, -0.022899f, 0.021388f, -0.023500f, -0.069306f, -0.021213f, -0.068667f, -0.017025f, 0.002804f, -0.047532f, -0.000950f, -0.067549f, 0.034863f, -0.007906f, -0.034817f, 0.102504f, 0.015530f, 0.044020f, -0.022680f, -0.124197f, -0.013700f, -0.032375f, -0.035345f, 0.044084f, 0.034814f, -0.044084f, -0.034997f, 0.083867f, -0.010419f, 0.026630f, 0.003556f, -0.005288f, -0.010581f, -0.010074f, -0.028321f, -0.001171f, 0.008981f, 0.014304f, + 0.009446f, 0.029417f, -0.024589f, -0.001451f, -0.023981f, -0.014691f, 0.008601f, 0.042098f, 0.026840f, 0.037071f, 0.033259f, -0.008517f, 0.011540f, 0.019545f, -0.000725f, -0.035707f, -0.007116f, 0.047384f, -0.009408f, -0.069797f, -0.031143f, 0.006694f, -0.059184f, -0.026123f, -0.060633f, -0.041986f, -0.038185f, 0.054474f, 0.037055f, -0.012847f, 0.037086f, 0.013756f, 0.052631f, 0.035108f, 0.016388f, -0.094737f, -0.021784f, 0.003520f, -0.083412f, -0.061075f, -0.024026f, -0.016647f, -0.097578f, 0.020369f, 0.052659f, 0.071370f, 0.085093f, -0.029109f, -0.056863f, -0.000603f, -0.057333f, -0.041750f, -0.079204f, -0.086684f, -0.062063f, -0.051293f, 0.058779f, -0.035244f, -0.089411f, 0.039011f, 0.007432f, -0.059813f, 0.061667f, 0.032200f, 0.021063f, -0.010630f, -0.053201f, -0.011008f, 0.004660f, 0.057888f, 0.075739f, 0.007470f, 0.022669f, 0.007954f, 0.005278f, -0.000151f, 0.012842f, -0.027133f, 0.105424f, 0.027939f, -0.030429f, -0.030083f, -0.011877f, 0.007922f, 0.053074f, -0.020795f, -0.004578f, 0.003483f, 0.028361f, -0.020816f, 0.016382f, 0.005256f, -0.002609f, -0.080997f, -0.023447f, 0.030754f, + 0.046909f, 0.019242f, -0.006347f, -0.020687f, -0.052729f, -0.002346f, 0.012268f, -0.009479f, 0.004143f, -0.010738f, -0.032793f, 0.040136f, -0.005122f, 0.016884f, -0.035199f, -0.004121f, 0.101818f, 0.011383f, -0.007513f, 0.015509f, 0.016335f, 0.013305f, 0.053156f, -0.014160f, -0.018756f, 0.040975f, -0.000394f, 0.025859f, 0.017645f, 0.036029f, -0.008297f, -0.033043f, 0.022968f, -0.013777f, 0.007833f, 0.141362f, 0.139740f, 0.058518f, 0.029876f, 0.060412f, 0.001237f, -0.079811f, -0.026948f, 0.008235f, 0.002673f, -0.024967f, 0.046246f, 0.019382f, 0.012950f, -0.025606f, 0.055343f, -0.011400f, -0.006783f, -0.024648f, 0.025487f, 0.014983f, -0.057248f, -0.078605f, -0.028519f, 0.004500f, -0.004598f, -0.021005f, -0.074192f, -0.013904f, 0.014422f, -0.002045f, -0.031051f, -0.016350f, -0.028835f, -0.032399f, 0.006057f, 0.011390f, -0.051395f, -0.054174f, -0.025956f, -0.065441f, 0.006034f, 0.044000f, -0.054824f, 0.042056f, -0.033295f, -0.034167f, -0.060728f, -0.077095f, -0.089541f, -0.081587f, -0.049332f, -0.006974f, 0.017114f, 0.006170f, 0.016698f, -0.046220f, -0.099771f, -0.041485f, -0.096709f, -0.154970f, + -0.069043f, 0.112746f, 0.191550f, 0.113306f, -0.063651f, -0.046801f, -0.195848f, -0.169619f, 0.098851f, 0.013617f, 0.133720f, 0.148494f, 0.144346f, 0.048358f, -0.081313f, -0.084854f, -0.106840f, -0.105852f, -0.028356f, -0.008364f, 0.012416f, -0.048211f, 0.063258f, 0.029689f, 0.055898f, -0.128731f, 0.026813f, 0.015719f, -0.041198f, 0.027111f, -0.031405f, -0.015769f, -0.010936f, -0.019434f, 0.052518f, 0.099765f, -0.031638f, 0.019197f, -0.016429f, 0.023179f, 0.048908f, -0.016622f, -0.011836f, -0.028778f, 0.012233f, -0.018472f, -0.058242f, 0.040008f, 0.066043f, -0.009581f, -0.038597f, -0.033376f, -0.075007f, -0.020237f, 0.052102f, 0.037035f, 0.016350f, -0.079727f, -0.049003f, -0.034685f, 0.067676f, 0.061347f, 0.050831f, -0.155174f, -0.106298f, -0.012118f, 0.074092f, 0.164801f, -0.002100f, -0.196634f, -0.075226f, 0.007571f, 0.063947f, -0.004271f, 0.034011f, 0.029004f, -0.088633f, -0.036162f, -0.026075f, -0.049854f, 0.001599f, -0.094949f, 0.013527f, 0.040950f, -0.118600f, -0.072218f, -0.037251f, -0.011577f, 0.130071f, 0.003418f, -0.197981f, 0.024550f, 0.031360f, 0.038287f, 0.084732f, 0.052091f, + 0.043731f, -0.105551f, 0.014728f, -0.077696f, 0.013964f, 0.064990f, 0.057951f, 0.018320f, -0.037497f, 0.006768f, -0.022153f, -0.006379f, -0.027435f, -0.021425f, 0.014606f, 0.002785f, -0.039864f, -0.005794f, 0.021560f, -0.005733f, 0.003048f, 0.006244f, -0.024942f, -0.026950f, 0.000231f, 0.015287f, 0.003253f, -0.042707f, 0.004554f, 0.019225f, 0.007863f, 0.002955f, 0.044294f, -0.006794f, -0.009920f, 0.013181f, 0.018092f, -0.031367f, -0.030370f, 0.021367f, 0.006588f, -0.027370f, 0.018732f, 0.004357f, 0.010358f, -0.020302f, 0.009476f, 0.016237f, 0.005066f, -0.027757f, 0.035951f, -0.007673f, -0.033808f, -0.002808f, 0.032419f, 0.004814f, -0.020446f, 0.017494f, 0.011410f, -0.038667f, 0.018376f, -0.003598f, 0.039408f, -0.037076f, 0.008273f, 0.017313f, -0.048621f, -0.005426f, 0.030464f, -0.009024f, 0.024187f, -0.018473f, -0.025902f, -0.006550f, -0.026081f, 0.020693f, -0.050893f, 0.086476f, 0.013224f, 0.039734f, -0.032010f, 0.015886f, -0.005982f, 0.011452f, 0.010556f, -0.013109f, 0.006979f, 0.016765f, -0.007733f, 0.035147f, 0.002817f, 0.002240f, 0.012871f, 0.012249f, 0.000053f, -0.007548f, + 0.015858f, -0.001139f, -0.008677f, -0.000953f, 0.015960f, -0.014649f, 0.004760f, 0.008220f, -0.018629f, 0.026129f, -0.003549f, -0.010985f, 0.039902f, -0.014757f, -0.021163f, 0.018725f, 0.011270f, -0.009564f, 0.018203f, 0.014387f, -0.003082f, -0.004381f, -0.001412f, 0.006030f, 0.011197f, 0.006620f, 0.001572f, -0.005648f, 0.021464f, -0.020114f, 0.020675f, 0.003928f, -0.000594f, 0.006241f, 0.007767f, 0.007084f, 0.002642f, -0.017870f, 0.007084f, 0.017063f, -0.009673f, 0.000802f, 0.001889f, 0.013155f, 0.000662f, -0.003990f, 0.020544f, -0.008696f, 0.011930f, -0.018564f, -0.005234f, 0.019381f, -0.015979f, 0.018629f, -0.003197f, 0.012532f, 0.019770f, -0.070532f, -0.225272f, -0.011565f, 0.121119f, 0.054361f, 0.258217f, 0.021981f, 0.054344f, 0.002235f, -0.075611f, -0.094942f, -0.064571f, -0.115674f, -0.081231f, -0.050869f, 0.001528f, 0.088389f, 0.173669f, 0.128139f, 0.111097f, 0.036410f, -0.060948f, -0.088836f, -0.080382f, -0.094116f, -0.104972f, -0.042190f, -0.020484f, -0.008916f, 0.050569f, 0.067972f, 0.050599f, 0.094957f, 0.060639f, 0.022993f, 0.063016f, 0.001833f, -0.028132f, -0.017867f, + -0.057581f, -0.116530f, -0.071658f, -0.068005f, -0.070392f, 0.004160f, 0.031934f, 0.023036f, 0.085352f, 0.071092f, 0.047973f, 0.069990f, 0.073112f, 0.021618f, 0.021497f, -0.007054f, -0.064086f, -0.087366f, -0.068009f, -0.087471f, -0.063435f, -0.020870f, -0.016041f, 0.006697f, 0.047776f, 0.039137f, 0.033784f, 0.069701f, 0.056193f, 0.043402f, 0.070577f, 0.021929f, -0.013445f, 0.000837f, -0.026097f, -0.054986f, -0.031575f, -0.053702f, -0.034234f, -0.014690f}, + {-0.000974f, -0.000544f, -0.001053f, 0.007468f, 0.004839f, 0.000821f, -0.002807f, 0.003869f, 0.006696f, -0.002052f, 0.007410f, -0.004715f, -0.001510f, 0.004824f, 0.001644f, -0.008346f, 0.002647f, 0.005176f, -0.011583f, -0.000211f, 0.009561f, -0.005616f, -0.008028f, 0.008018f, -0.006457f, 0.001631f, -0.004731f, 0.000691f, 0.000623f, 0.000710f, -0.000425f, -0.005849f, 0.008387f, -0.003795f, -0.001920f, -0.005160f, -0.005383f, 0.000329f, -0.001152f, -0.003904f, -0.006648f, -0.005349f, 0.010195f, -0.001120f, 0.003981f, 0.002811f, -0.000651f, 0.007783f, 0.002081f, 0.005424f, -0.000607f, -0.004044f, 0.005315f, -0.007496f, -0.004059f, 0.000068f, -0.000799f, 0.000762f, 0.001814f, 0.005628f, -0.001923f, -0.001122f, -0.002282f, 0.001571f, -0.000779f, -0.001392f, 0.003496f, -0.000117f, 0.004366f, -0.000820f, -0.003615f, -0.003065f, -0.000014f, 0.000885f, -0.001373f, 0.001829f, -0.004964f, 0.001424f, 0.006222f, -0.000341f, 0.000731f, -0.008753f, -0.004307f, 0.001512f, 0.012049f, -0.007454f, 0.002670f, -0.012122f, 0.012835f, 0.001028f, 0.004830f, -0.001257f, 0.002202f, -0.002175f, -0.004139f, -0.010507f, + 0.004737f, -0.010532f, -0.004810f, -0.005851f, 0.006305f, 0.005053f, 0.002548f, 0.005260f, 0.009743f, 0.000839f, -0.008422f, 0.005907f, 0.001157f, -0.000182f, 0.004894f, -0.001489f, -0.002897f, -0.012404f, 0.002297f, -0.003382f, 0.003018f, 0.005555f, -0.006597f, -0.002479f, 0.006513f, 0.002220f, 0.001020f, -0.006171f, 0.016520f, 0.010056f, 0.001891f, 0.008137f, 0.006770f, 0.006557f, -0.014505f, 0.001233f, -0.001092f, -0.003608f, 0.004008f, 0.002797f, -0.001987f, -0.002417f, -0.000374f, -0.004065f, 0.004836f, -0.001276f, 0.009135f, 0.000111f, -0.001648f, -0.003630f, -0.006919f, -0.000868f, 0.006563f, 0.000320f, 0.002266f, 0.007467f, 0.003241f, 0.000983f, 0.003262f, 0.000922f, 0.004089f, 0.013668f, -0.006290f, 0.004710f, -0.003478f, -0.005611f, -0.002157f, -0.003820f, 0.007583f, -0.005852f, -0.011018f, -0.002662f, 0.003210f, -0.009171f, -0.005423f, 0.010810f, 0.018562f, -0.002875f, 0.007254f, -0.006069f, -0.006352f, -0.000082f, 0.002195f, -0.000595f, 0.000080f, 0.007007f, -0.011336f, 0.004000f, -0.000577f, -0.002220f, -0.009503f, 0.001066f, 0.000520f, 0.005730f, 0.001948f, -0.007442f, + 0.010406f, -0.007821f, 0.009737f, -0.000837f, 0.002029f, 0.004058f, -0.000782f, -0.004487f, 0.007706f, 0.002045f, 0.010193f, 0.001739f, -0.008329f, 0.015994f, 0.012885f, -0.004110f, -0.000906f, -0.002768f, -0.010554f, -0.005640f, -0.001397f, -0.001590f, 0.004841f, -0.005709f, 0.000923f, 0.004660f, 0.000475f, 0.000215f, -0.000222f, -0.000602f, -0.005479f, 0.010032f, 0.000824f, 0.000428f, -0.002476f, -0.000185f, -0.008238f, -0.005972f, -0.014817f, 0.016466f, -0.004563f, -0.002824f, 0.011532f, -0.005616f, 0.005557f, 0.026616f, -0.004096f, 0.000024f, -0.011295f, -0.009261f, -0.013875f, 0.006779f, -0.006210f, 0.002906f, 0.006381f, -0.009020f, -0.007847f, -0.005947f, -0.000234f, 0.001907f, -0.010983f, -0.004777f, 0.003609f, 0.003011f, -0.004861f, -0.002452f, 0.005369f, -0.007205f, 0.000161f, -0.003985f, -0.001999f, -0.005265f, 0.002959f, -0.004900f, 0.000841f, 0.002828f, -0.002529f, 0.010707f, -0.000369f, -0.002384f, -0.009376f, 0.000190f, 0.011459f, 0.000870f, 0.003294f, -0.012116f, -0.016969f, -0.006699f, -0.014724f, -0.013093f, -0.001199f, -0.006150f, -0.001362f, -0.015725f, 0.011809f, -0.014641f, + 0.001132f, 0.008495f, -0.009395f, -0.015302f, -0.011106f, -0.003991f, 0.008637f, 0.007448f, 0.011861f, -0.008574f, -0.007497f, -0.006413f, -0.005430f, 0.008004f, 0.001466f, -0.005197f, -0.002961f, 0.002744f, 0.014912f, 0.001510f, -0.006023f, 0.000791f, -0.004973f, -0.001177f, 0.010471f, 0.017457f, -0.005967f, -0.006231f, -0.015869f, 0.001908f, 0.004058f, 0.008937f, -0.005922f, 0.009634f, 0.001644f, 0.014896f, -0.011950f, 0.001782f, -0.022649f, -0.002672f, 0.002878f, -0.005742f, -0.004949f, -0.002196f, 0.008595f, -0.007071f, -0.011757f, 0.003196f, -0.017328f, -0.004043f, -0.008172f, 0.003657f, -0.001574f, 0.005717f, 0.001108f, -0.013632f, -0.014115f, 0.000156f, 0.008095f, 0.014080f, -0.002424f, -0.006082f, 0.012458f, -0.013489f, -0.006700f, 0.006127f, 0.006245f, 0.009222f, -0.008464f, 0.000077f, 0.004304f, -0.005968f, -0.001231f, 0.005346f, -0.007462f, 0.010456f, -0.003834f, -0.002226f, -0.010521f, -0.009712f, 0.005576f, -0.000220f, 0.001309f, -0.001777f, -0.005792f, 0.006513f, -0.003035f, 0.008197f, 0.001429f, -0.010846f, -0.009590f, 0.004422f, -0.003451f, 0.002611f, -0.012728f, 0.009837f, + -0.023469f, 0.006547f, -0.009714f, 0.009861f, 0.011075f, -0.010581f, -0.020506f, 0.003941f, -0.002027f, 0.014478f, -0.007312f, 0.020553f, -0.007448f, 0.013944f, -0.015240f, -0.004937f, 0.007471f, 0.010653f, 0.003464f, 0.000967f, -0.009079f, -0.000237f, -0.006995f, -0.008597f, 0.006092f, -0.007160f, 0.003947f, 0.003010f, 0.004686f, -0.003555f, 0.009808f, -0.000550f, 0.008526f, -0.000584f, -0.014346f, -0.001293f, -0.004146f, 0.002759f, 0.015639f, 0.002217f, -0.000659f, 0.000525f, -0.005461f, 0.006530f, -0.005128f, 0.009299f, 0.009154f, 0.004536f, 0.003865f, 0.016579f, -0.003190f, -0.001207f, -0.011556f, 0.010189f, 0.008103f, 0.003245f, 0.002439f, 0.003310f, 0.001088f, 0.006227f, 0.009627f, 0.008054f, 0.003892f, 0.005372f, -0.002012f, 0.014162f, 0.004366f, -0.000146f, -0.009037f, 0.007234f, -0.002664f, 0.020370f, 0.009863f, 0.005464f, -0.008392f, 0.000579f, -0.030843f, -0.016498f, 0.006801f, -0.005569f, 0.013095f, 0.013160f, 0.019456f, 0.008451f, 0.008124f, 0.005295f, -0.022440f, -0.004490f, -0.002766f, 0.002693f, -0.001917f, 0.007773f, 0.005402f, -0.008109f, -0.006691f, 0.006565f, + 0.011431f, 0.014753f, 0.012381f, 0.016679f, -0.008494f, -0.007978f, -0.011372f, 0.013063f, -0.006922f, 0.010945f, -0.002412f, 0.000273f, -0.010727f, -0.005684f, -0.006115f, 0.010070f, 0.011437f, 0.002868f, 0.011397f, 0.017159f, -0.006486f, 0.005017f, 0.019046f, -0.008686f, 0.006098f, 0.007424f, 0.000565f, 0.015334f, 0.018206f, 0.014991f, 0.031669f, 0.006950f, -0.004855f, -0.004867f, -0.005863f, 0.000727f, 0.005155f, 0.010785f, -0.002315f, -0.001992f, -0.004022f, -0.007387f, 0.002842f, 0.005831f, 0.007398f, -0.018685f, -0.003759f, 0.006331f, 0.012022f, 0.010555f, -0.018449f, -0.011241f, 0.001503f, 0.004567f, 0.011668f, 0.007785f, 0.015385f, -0.001761f, 0.003348f, 0.013136f, 0.019289f, 0.010877f, -0.020697f, 0.000221f, -0.022020f, -0.015701f, -0.009261f, -0.001735f, -0.013312f, 0.016419f, 0.006407f, 0.009746f, -0.027384f, -0.001917f, 0.018587f, 0.009302f, -0.007710f, -0.011631f, -0.006666f, 0.007118f, -0.020760f, -0.001221f, -0.013138f, 0.020918f, -0.002208f, -0.006123f, 0.002806f, -0.000768f, -0.002977f, 0.003658f, -0.004884f, 0.009665f, 0.007584f, 0.013900f, -0.000320f, 0.000642f, + 0.022301f, -0.006898f, 0.015221f, -0.002434f, -0.001688f, 0.037855f, 0.005420f, -0.004178f, -0.007617f, -0.029474f, 0.004112f, -0.030209f, -0.003978f, 0.031562f, -0.007777f, -0.006280f, -0.020763f, -0.006572f, 0.002142f, -0.011940f, 0.007845f, -0.001238f, -0.014510f, 0.017089f, 0.007941f, 0.005571f, 0.006753f, -0.011881f, 0.015434f, -0.020295f, 0.008682f, 0.008219f, 0.004291f, -0.001981f, -0.003584f, -0.004583f, 0.002369f, 0.013037f, -0.024269f, 0.011420f, -0.008135f, -0.011938f, -0.011357f, 0.010145f, 0.012766f, 0.007729f, 0.021651f, 0.016159f, 0.003786f, 0.006990f, -0.015805f, 0.004010f, 0.008059f, 0.016954f, 0.003796f, -0.007140f, 0.006590f, 0.008278f, -0.014114f, 0.002825f, -0.014498f, 0.012477f, 0.011390f, 0.014521f, -0.012842f, 0.008897f, 0.015454f, -0.006041f, 0.004439f, 0.020355f, -0.000001f, -0.011528f, -0.009109f, 0.005050f, -0.002671f, -0.011733f, -0.004518f, 0.000888f, 0.003458f, 0.007379f, -0.007982f, 0.014387f, 0.008900f, -0.002503f, 0.017118f, -0.001416f, 0.006807f, 0.022365f, -0.022607f, 0.043256f, -0.019146f, 0.006463f, 0.013318f, -0.003866f, -0.001943f, 0.005965f, + 0.029290f, -0.001033f, -0.003624f, -0.000350f, -0.006520f, 0.014506f, 0.016036f, -0.004620f, 0.006976f, 0.005944f, 0.005310f, 0.009879f, 0.012494f, 0.001092f, 0.013387f, 0.002623f, -0.011687f, 0.014720f, 0.019223f, 0.012006f, -0.019247f, 0.038520f, -0.011361f, 0.007707f, -0.027278f, 0.011568f, -0.024040f, 0.019567f, 0.002611f, -0.004855f, -0.013308f, 0.018489f, 0.003074f, 0.011934f, 0.012568f, 0.006497f, -0.020089f, 0.010994f, -0.011881f, -0.001950f, 0.010074f, 0.010528f, 0.003086f, -0.003549f, -0.020088f, 0.003195f, 0.019905f, 0.002416f, 0.013154f, 0.014132f, -0.020981f, 0.012200f, -0.010290f, -0.010703f, 0.016804f, 0.017948f, 0.010005f, 0.010157f, 0.003552f, 0.009719f, -0.021612f, -0.009882f, -0.006362f, 0.000731f, 0.024640f, 0.011508f, 0.010245f, -0.001724f, 0.011281f, -0.000519f, 0.027063f, 0.009689f, 0.010757f, 0.003992f, -0.000677f, -0.038901f, 0.015193f, 0.009138f, -0.002819f, -0.002804f, -0.028251f, 0.000230f, -0.010338f, 0.006932f, 0.026013f, -0.004178f, -0.013741f, 0.029668f, -0.000607f, 0.017080f, -0.009087f, 0.000969f, -0.017414f, -0.000485f, -0.007391f, 0.007180f, + -0.000993f, 0.024186f, -0.022262f, 0.002457f, 0.008192f, 0.010619f, -0.038102f, 0.024085f, 0.005971f, -0.027036f, -0.017886f, 0.013878f, 0.032147f, -0.012205f, -0.007076f, -0.023406f, 0.046375f, 0.017960f, 0.001817f, 0.007454f, -0.026110f, -0.016567f, -0.002282f, 0.001668f, 0.023336f, 0.004962f, 0.017641f, 0.020986f, -0.002329f, 0.000995f, 0.013404f, -0.004222f, -0.017378f, -0.015441f, -0.005450f, 0.020871f, -0.013080f, 0.026496f, -0.014142f, 0.039042f, 0.015625f, 0.031477f, -0.010493f, 0.004971f, 0.023385f, -0.019897f, 0.009717f, 0.011372f, 0.008533f, -0.011385f, 0.011158f, 0.003250f, 0.001803f, 0.011562f, 0.021487f, 0.020369f, -0.023458f, -0.004713f, 0.007568f, -0.019936f, -0.016047f, -0.005064f, -0.044684f, 0.011355f, -0.024185f, -0.012275f, -0.000242f, -0.004422f, 0.009436f, 0.027229f, 0.011631f, 0.012218f, -0.019951f, -0.000228f, -0.029219f, -0.043323f, 0.024096f, -0.017387f, 0.019834f, 0.006776f, 0.009821f, 0.011921f, -0.028965f, -0.053041f, 0.005162f, 0.008165f, 0.030556f, -0.029276f, -0.032145f, 0.028542f, -0.010800f, 0.013219f, -0.005716f, 0.007128f, 0.004886f, 0.007847f, + -0.014406f, 0.007601f, -0.001710f, -0.004209f, 0.019004f, 0.007374f, -0.002239f, -0.023685f, -0.002860f, -0.000252f, -0.004008f, -0.000711f, -0.012617f, -0.031556f, -0.013782f, 0.023930f, -0.009561f, 0.012024f, -0.017693f, 0.013882f, 0.007375f, 0.000202f, -0.008679f, -0.039245f, 0.022400f, 0.021739f, 0.027849f, -0.018710f, -0.007645f, 0.037658f, 0.033375f, 0.015636f, 0.007559f, 0.021467f, 0.008235f, 0.019328f, -0.009640f, 0.016837f, -0.030865f, -0.001584f, 0.009281f, -0.007773f, 0.037882f, 0.001836f, 0.020968f, -0.011819f, -0.019517f, 0.043494f, -0.000170f, 0.017436f, -0.005167f, 0.000907f, -0.050259f, -0.003751f, 0.011530f, -0.022904f, -0.029695f, -0.009325f, -0.007681f, -0.050197f, -0.047094f, -0.013097f, -0.000702f, 0.033727f, 0.027347f, 0.026944f, -0.011718f, -0.005532f, -0.007889f, 0.028819f, 0.011958f, -0.013586f, -0.003077f, -0.011043f, 0.020754f, 0.015689f, -0.013298f, -0.018547f, -0.016840f, -0.033829f, 0.012873f, -0.000194f, 0.000147f, 0.006028f, -0.005657f, 0.011286f, 0.045289f, -0.027341f, 0.013157f, 0.001598f, -0.018442f, -0.011320f, -0.021743f, 0.006818f, -0.010014f, -0.011765f, + 0.023212f, 0.001735f, -0.008545f, 0.022864f, -0.003835f, -0.011840f, 0.007850f, 0.016334f, -0.010152f, 0.017635f, 0.033454f, 0.031444f, -0.022736f, -0.001567f, 0.007834f, 0.017158f, -0.028564f, -0.007167f, -0.008001f, 0.033987f, 0.014935f, -0.005072f, -0.021417f, -0.025057f, -0.020979f, 0.030615f, 0.026755f, -0.051623f, -0.041418f, -0.032989f, -0.021364f, 0.006754f, -0.018373f, 0.011897f, 0.007009f, 0.005101f, 0.040066f, 0.031415f, 0.019321f, 0.002411f, -0.027116f, -0.014521f, -0.004616f, 0.010179f, 0.016412f, -0.024307f, 0.005673f, 0.000634f, -0.020502f, -0.010374f, 0.015805f, -0.012852f, 0.012515f, 0.004584f, 0.014812f, -0.019757f, -0.000367f, -0.042933f, 0.006018f, -0.054074f, 0.021567f, 0.020396f, -0.020778f, 0.023124f, 0.028835f, -0.000400f, 0.008122f, -0.035471f, 0.020045f, 0.000637f, -0.014248f, 0.017079f, -0.004407f, -0.001242f, -0.000331f, 0.000688f, 0.035731f, -0.005691f, 0.000014f, 0.042052f, -0.000333f, -0.022066f, -0.057712f, -0.049521f, 0.053070f, 0.030877f, 0.013264f, 0.011136f, -0.021846f, -0.046899f, -0.021580f, 0.004598f, -0.016753f, 0.032226f, -0.001448f, 0.001788f, + 0.038085f, -0.010812f, -0.011178f, -0.011847f, -0.023159f, -0.044013f, -0.031411f, 0.086709f, -0.043668f, -0.024962f, 0.026487f, -0.052085f, -0.033138f, 0.025183f, 0.045399f, 0.003601f, -0.011968f, 0.004094f, 0.010459f, -0.038006f, -0.028196f, -0.019899f, -0.034804f, -0.003751f, 0.031775f, -0.003028f, 0.006057f, 0.015251f, 0.009985f, -0.028220f, -0.013911f, -0.023455f, -0.012758f, 0.028439f, -0.009486f, -0.003921f, -0.004568f, 0.016931f, 0.017075f, 0.051868f, 0.007832f, 0.037961f, -0.002811f, 0.012272f, -0.021645f, -0.016718f, 0.013353f, -0.027701f, -0.030383f, 0.000110f, 0.008890f, -0.016219f, 0.011751f, -0.018864f, 0.004975f, -0.048162f, 0.025861f, 0.013758f, 0.021071f, 0.001657f, -0.019668f, -0.040626f, -0.014569f, -0.004650f, 0.032158f, -0.026020f, -0.015141f, 0.007864f, 0.074148f, -0.021935f, 0.075400f, -0.047919f, 0.017969f, -0.018665f, 0.032890f, -0.014837f, 0.057162f, -0.055898f, 0.082041f, -0.009781f, 0.016635f, 0.033416f, -0.061362f, 0.051905f, -0.065480f, 0.041023f, -0.106491f, 0.053952f, -0.054732f, 0.043637f, -0.071225f, 0.055682f, 0.002429f, 0.025910f, -0.032066f, -0.029006f, + 0.035206f, 0.060181f, -0.048627f, 0.076102f, -0.003665f, 0.000587f, -0.002170f, 0.013685f, -0.021719f, -0.015948f, -0.032897f, -0.006993f, 0.001843f, 0.000584f, 0.000596f, 0.030155f, 0.005860f, 0.032986f, 0.032629f, -0.019827f, 0.012511f, 0.068242f, 0.022966f, 0.014895f, 0.010980f, -0.058523f, 0.003804f, -0.009251f, -0.006568f, -0.053726f, -0.010608f, 0.031220f, 0.009569f, 0.010467f, 0.016405f, 0.039398f, 0.011055f, -0.012084f, -0.003232f, -0.003410f, 0.015528f, -0.026839f, -0.015681f, 0.040406f, 0.025948f, 0.018634f, 0.032115f, 0.022810f, -0.012924f, -0.007321f, -0.046088f, -0.021160f, 0.019713f, 0.014263f, 0.035974f, -0.026397f, -0.012091f, -0.010074f, 0.026507f, 0.013807f, 0.023773f, 0.007912f, -0.018113f, -0.019261f, 0.058631f, -0.020536f, -0.056774f, 0.009695f, 0.040731f, 0.023555f, -0.001674f, -0.011503f, 0.002841f, -0.001619f, -0.001279f, 0.016623f, -0.022118f, -0.118373f, 0.033990f, -0.013470f, -0.006626f, 0.030408f, -0.019319f, 0.032580f, -0.003340f, -0.050578f, -0.008576f, 0.006237f, 0.018998f, 0.024350f, 0.006176f, -0.035406f, 0.037063f, -0.012937f, -0.002569f, -0.021204f, + -0.009437f, 0.020833f, -0.003224f, 0.018766f, 0.029902f, -0.005337f, -0.037197f, 0.009861f, 0.042045f, -0.037110f, 0.014740f, 0.033749f, -0.005361f, -0.023958f, -0.047206f, -0.030534f, 0.034049f, 0.087847f, -0.026148f, -0.032664f, 0.097445f, -0.004585f, -0.013669f, 0.071686f, 0.040959f, 0.036579f, 0.028293f, 0.013426f, -0.020350f, 0.037468f, 0.033221f, 0.024811f, 0.010663f, -0.062162f, 0.040206f, 0.037685f, -0.067804f, -0.036991f, -0.024382f, -0.016673f, -0.018738f, 0.076449f, 0.036872f, -0.039795f, 0.039440f, -0.013012f, -0.039744f, 0.020045f, 0.019931f, -0.014494f, -0.017035f, -0.058854f, 0.006619f, 0.014227f, 0.044758f, 0.026246f, 0.003424f, -0.032026f, -0.130165f, 0.039664f, 0.073118f, -0.045788f, -0.009614f, -0.035731f, 0.075304f, 0.050276f, 0.031758f, -0.006510f, -0.026433f, 0.004871f, 0.030372f, 0.013551f, -0.013121f, -0.003547f, 0.041615f, -0.003460f, -0.015270f, -0.056515f, -0.026344f, 0.046153f, 0.027430f, -0.030583f, 0.023876f, -0.022480f, -0.006663f, 0.013013f, 0.013398f, -0.014113f, 0.008730f, -0.050124f, 0.014188f, 0.064672f, -0.008174f, -0.014349f, -0.064669f, -0.040607f, + 0.031734f, -0.052915f, -0.027550f, 0.009856f, 0.013299f, -0.017839f, 0.042827f, 0.037981f, -0.041039f, 0.013094f, 0.023357f, 0.064015f, 0.061292f, -0.012394f, 0.020281f, -0.004621f, 0.070049f, 0.027028f, 0.028624f, 0.062472f, -0.029127f, -0.047078f, -0.021728f, -0.059573f, 0.046975f, 0.017165f, 0.023172f, 0.006727f, 0.079501f, -0.058385f, -0.011707f, 0.026902f, -0.018026f, 0.029636f, -0.000883f, -0.004450f, 0.019089f, -0.053102f, 0.032865f, 0.054022f, 0.047434f, 0.048887f, 0.062013f, -0.031440f, 0.049365f, -0.088660f, -0.037431f, 0.037441f, 0.010724f, 0.069655f, 0.032965f, 0.059860f, -0.022346f, 0.010476f, -0.047037f, 0.036536f, 0.057786f, 0.053412f, 0.007432f, 0.038776f, -0.085507f, -0.054095f, 0.056818f, 0.019025f, -0.052476f, -0.025087f, 0.008938f, 0.083800f, 0.027089f, -0.029486f, -0.039182f, 0.011555f, -0.009916f, 0.052961f, 0.055630f, -0.001812f, -0.006586f, 0.014168f, -0.013093f, 0.067701f, 0.020482f, -0.011506f, 0.014954f, -0.026721f, -0.016075f, -0.139720f, -0.046797f, 0.029576f, -0.020456f, -0.017397f, 0.001305f, -0.021682f, -0.023921f, 0.070186f, 0.046083f, -0.028609f, + 0.062110f, 0.129151f, 0.027741f, 0.093588f, 0.014521f, 0.023261f, 0.067450f, 0.048545f, -0.032321f, -0.033663f, -0.066805f, -0.036779f, -0.000835f, -0.061371f, 0.030466f, 0.000862f, -0.059642f, -0.035085f, -0.034694f, 0.002265f, 0.060283f, -0.002789f, 0.051783f, -0.027845f, 0.016453f, -0.103656f, 0.033785f, -0.012977f, 0.058689f, -0.010447f, -0.060233f, 0.067523f, -0.020373f, 0.012995f, 0.040478f, 0.030489f, 0.062812f, -0.005928f, 0.012944f, -0.008190f, 0.071174f, -0.011289f, 0.016843f, 0.049693f, -0.049728f, 0.049000f, -0.009264f, 0.031058f, 0.049011f, -0.009226f, 0.014403f, 0.010259f, 0.009054f, -0.011690f, 0.024437f, 0.022033f, -0.003287f, -0.023621f, -0.000176f, -0.028014f, -0.005274f, -0.003244f, 0.029901f, -0.010318f, -0.043850f, -0.029582f, 0.056354f, 0.054438f, -0.044017f, -0.038648f, 0.066673f, 0.074777f, -0.022699f, -0.004749f, 0.057464f, 0.004503f, 0.032273f, 0.040297f, -0.081983f, -0.023539f, -0.000231f, 0.087179f, 0.013650f, -0.003721f, -0.077402f, 0.018860f, 0.039049f, 0.023756f, 0.009545f, 0.024678f, 0.015696f, 0.013691f, 0.114402f, -0.001532f, 0.016239f, 0.061932f, + 0.060897f, -0.104794f, -0.007909f, -0.088681f, -0.082517f, 0.020111f, 0.016376f, 0.014610f, 0.001119f, 0.077468f, 0.043300f, 0.099893f, 0.108473f, -0.012195f, -0.055048f, 0.011376f, -0.015880f, -0.010006f, 0.022407f, 0.010689f, -0.010202f, -0.050280f, -0.056665f, 0.060005f, 0.026026f, -0.006491f, 0.007467f, 0.010108f, 0.003701f, 0.011478f, -0.007540f, -0.013763f, -0.083542f, 0.002419f, 0.044688f, -0.013008f, -0.065081f, -0.019819f, 0.049247f, -0.094849f, -0.035409f, 0.061518f, 0.034022f, 0.073371f, -0.004846f, 0.006451f, -0.069567f, -0.066033f, -0.087856f, 0.072786f, 0.097882f, -0.131659f, -0.069754f, -0.005350f, 0.064037f, -0.051085f, -0.012404f, 0.123989f, 0.045655f, 0.032992f, 0.076564f, 0.061225f, 0.084194f, -0.029715f, 0.083377f, -0.010920f, -0.074405f, -0.099044f, -0.029473f, 0.041975f, -0.086710f, -0.012465f, 0.010726f, -0.013201f, -0.035566f, 0.021978f, -0.077599f, 0.059177f, -0.005378f, 0.017851f, 0.022711f, 0.021952f, 0.000411f, -0.026403f, 0.041900f, 0.010216f, 0.040438f, -0.009143f, -0.086741f, -0.008234f, 0.024659f, -0.028809f, -0.031937f, -0.019770f, -0.029454f, 0.034812f, + -0.009329f, -0.031134f, -0.002019f, 0.032345f, -0.044297f, 0.030424f, -0.015535f, 0.015986f, -0.043625f, -0.011238f, 0.017342f, -0.004157f, -0.004227f, 0.004915f, 0.024132f, -0.004760f, -0.004142f, -0.030767f, 0.014923f, -0.008785f, 0.004708f, 0.008904f, 0.003041f, 0.021986f, -0.033022f, -0.025624f, 0.034349f, 0.029196f, -0.041386f, 0.019168f, -0.033433f, 0.037952f, -0.032271f, 0.013947f, 0.009964f, -0.027918f, 0.060592f, 0.005242f, -0.067210f, 0.030353f, 0.008355f, -0.052817f, 0.029520f, -0.019919f, 0.031546f, -0.046032f, 0.023769f, -0.048808f, 0.022804f, 0.032934f, -0.029578f, 0.016429f, -0.030834f, -0.000207f, 0.004421f, 0.002055f, 0.014145f, -0.042098f, -0.231169f, -0.398456f, -0.147947f, -0.314023f, -0.310886f, 0.131760f, 0.009054f, 0.192345f, 0.463806f, 0.415638f, 0.336677f, 0.416329f, 0.245885f, 0.037111f, 0.061639f, -0.085411f, -0.349035f, -0.345209f, -0.264003f, -0.335968f, -0.237430f, -0.067059f, -0.167484f, -0.222475f, -0.109178f, -0.047285f, -0.126158f, -0.071564f, -0.024037f, -0.073881f, -0.114324f, -0.002202f, 0.058386f, -0.048465f, 0.089658f, 0.144601f, -0.016882f, 0.011256f, + 0.203470f, 0.090726f, -0.018813f, 0.190105f, 0.152001f, -0.059587f, 0.062178f, 0.177356f, -0.022207f, -0.001890f, 0.258981f, 0.131575f, 0.045034f, 0.318583f, 0.353022f, 0.166619f, 0.335221f, 0.421561f, 0.101376f, 0.047246f, 0.166506f, -0.079373f, -0.218144f, -0.128078f, -0.277971f, -0.486486f, -0.483974f, -0.545019f, -0.725272f, -0.724235f, -0.690894f, -0.697735f, -0.615231f, -0.506852f, -0.382700f, -0.196101f, 0.001719f, 0.322431f, 0.383469f, 0.258023f} + }, + { + {0.013548f, -0.006997f, 0.003290f, -0.000917f, 0.001273f, -0.001926f, 0.006944f, 0.010525f, -0.005045f, 0.003679f, -0.001194f, 0.003670f, -0.004751f, -0.000556f, 0.002762f, -0.006361f, -0.006367f, 0.002066f, 0.003341f, -0.007454f, 0.003414f, -0.004137f, -0.005592f, 0.000365f, -0.002932f, -0.005570f, -0.007021f, -0.001256f, 0.005896f, -0.001273f, 0.002242f, 0.003896f, 0.002182f, 0.002802f, 0.003312f, 0.002856f, 0.006833f, -0.010079f, 0.002622f, -0.006562f, 0.003667f, 0.007104f, 0.000429f, -0.001520f, -0.006127f, 0.002419f, -0.001036f, 0.001077f, 0.002160f, 0.001185f, -0.002412f, -0.005300f, -0.003939f, -0.006843f, 0.001451f, 0.000007f, 0.000838f, 0.003220f, 0.004436f, 0.001317f, 0.007887f, 0.000451f, -0.004923f, 0.005366f, -0.001514f, -0.001001f, -0.001678f, -0.007289f, 0.006305f, 0.003100f, 0.005528f, -0.006518f, -0.010567f, -0.003182f, 0.004674f, 0.003495f, -0.005450f, -0.015743f, 0.001800f, 0.010441f, 0.003611f, 0.006817f, -0.009820f, -0.005376f, 0.000512f, -0.001715f, 0.002717f, 0.008264f, -0.019725f, -0.000112f, 0.006585f, 0.003932f, 0.006079f, -0.005713f, -0.007917f, 0.008667f, + -0.000057f, 0.002422f, 0.005487f, 0.007165f, 0.002738f, 0.001495f, 0.006542f, -0.000956f, -0.001956f, -0.005574f, 0.003109f, -0.001581f, -0.000790f, -0.002910f, 0.003823f, 0.009393f, 0.000166f, -0.001990f, 0.004564f, -0.006065f, -0.008877f, -0.005030f, -0.001683f, -0.005902f, 0.000678f, -0.001416f, 0.003944f, -0.003722f, 0.001218f, -0.007399f, -0.000529f, -0.006111f, -0.000103f, -0.002863f, -0.002182f, 0.002941f, -0.003266f, -0.000492f, 0.005170f, -0.002761f, 0.006137f, 0.006977f, 0.000768f, 0.009467f, -0.004682f, -0.000569f, 0.004912f, -0.001953f, 0.003432f, 0.004064f, 0.002716f, -0.005494f, 0.002378f, 0.001816f, 0.002052f, -0.000383f, -0.003796f, 0.025978f, -0.007706f, 0.002240f, -0.006014f, -0.000763f, -0.002678f, 0.002728f, 0.001756f, 0.008706f, 0.002485f, 0.001271f, 0.003206f, -0.002488f, -0.018434f, -0.017685f, -0.005708f, 0.002005f, 0.005039f, -0.004729f, 0.000712f, -0.005973f, -0.002293f, -0.000047f, 0.002801f, -0.008043f, -0.008668f, -0.002824f, -0.000812f, 0.004177f, 0.001213f, -0.002242f, -0.006333f, 0.000705f, -0.003612f, -0.000201f, 0.003965f, -0.006526f, 0.002677f, 0.005070f, + -0.004540f, -0.011681f, -0.003220f, 0.003689f, -0.000947f, 0.002906f, -0.000827f, 0.002446f, -0.000801f, 0.002716f, 0.000340f, -0.010997f, 0.001794f, 0.003819f, -0.001944f, 0.002410f, 0.000213f, -0.001144f, -0.002371f, -0.000456f, -0.006490f, -0.001149f, -0.001996f, -0.008466f, -0.001620f, -0.000930f, 0.006645f, -0.007622f, 0.011116f, 0.012487f, 0.010126f, -0.005457f, -0.002506f, -0.003473f, 0.004630f, -0.003198f, -0.003479f, 0.001337f, -0.024600f, 0.000024f, -0.003632f, 0.001894f, -0.000662f, -0.012653f, -0.002258f, -0.002531f, 0.004212f, 0.006414f, -0.008387f, 0.007038f, -0.001978f, 0.004902f, 0.004962f, -0.002410f, 0.010539f, 0.000799f, 0.000682f, -0.001622f, 0.002022f, -0.002393f, 0.002140f, -0.002709f, 0.000627f, -0.006571f, 0.000973f, 0.007607f, 0.000256f, 0.003306f, 0.008094f, -0.007521f, -0.007842f, 0.003567f, -0.003405f, 0.006449f, -0.006046f, -0.001724f, -0.012949f, -0.010021f, -0.008543f, 0.004064f, 0.001463f, 0.004916f, -0.004480f, -0.003213f, -0.000654f, 0.008537f, -0.008838f, 0.004031f, 0.001980f, 0.000929f, 0.005056f, -0.002953f, -0.003804f, -0.005263f, 0.003811f, 0.002089f, + -0.007687f, -0.008659f, -0.009956f, 0.000030f, -0.001740f, 0.003759f, 0.000056f, -0.001578f, 0.001540f, 0.001832f, 0.005267f, -0.011993f, 0.002187f, 0.007628f, 0.011226f, 0.011419f, 0.009680f, -0.000835f, -0.005796f, -0.013152f, 0.010313f, -0.006348f, 0.012037f, 0.015273f, 0.010022f, 0.001177f, 0.005468f, 0.002281f, 0.012753f, -0.004897f, -0.004923f, 0.004610f, -0.000403f, 0.006019f, 0.010129f, -0.011218f, 0.005337f, 0.012621f, 0.006665f, 0.000533f, 0.001258f, 0.002718f, -0.003885f, 0.001273f, -0.003591f, -0.005547f, -0.000435f, 0.012050f, -0.002636f, 0.006335f, -0.002322f, -0.005150f, 0.014187f, -0.009772f, 0.009991f, 0.010786f, 0.003271f, 0.007355f, -0.006841f, -0.000855f, -0.001836f, -0.001193f, 0.007417f, 0.003230f, -0.007419f, 0.002886f, 0.000627f, 0.003137f, -0.000409f, 0.004668f, 0.004607f, 0.012142f, -0.009592f, 0.006873f, 0.005835f, 0.000397f, 0.005845f, 0.002723f, 0.008234f, 0.007711f, 0.005618f, -0.001997f, 0.007017f, 0.010875f, 0.001634f, 0.007104f, -0.001945f, 0.012701f, 0.013375f, 0.014241f, -0.001324f, -0.006707f, 0.005251f, 0.000992f, 0.007134f, 0.006093f, + 0.020275f, -0.001862f, -0.006403f, 0.019346f, -0.007722f, 0.008740f, -0.004767f, -0.018357f, 0.003137f, -0.005179f, 0.000397f, 0.022285f, -0.008787f, -0.010280f, 0.000596f, 0.011857f, -0.019000f, -0.006685f, 0.013714f, -0.004642f, 0.004175f, 0.006963f, -0.005409f, 0.006400f, -0.004355f, -0.006089f, 0.000824f, -0.001398f, -0.002799f, -0.001937f, 0.007256f, -0.005772f, 0.014622f, 0.004333f, -0.000334f, -0.008165f, -0.003305f, 0.009926f, -0.011458f, 0.002926f, 0.002880f, -0.000977f, -0.015792f, 0.010932f, 0.001763f, 0.003288f, 0.000303f, -0.001227f, 0.006599f, -0.003691f, 0.009344f, 0.006919f, -0.005356f, -0.017182f, 0.006719f, 0.005921f, -0.001927f, -0.004033f, 0.002789f, 0.012915f, 0.010171f, -0.000037f, 0.005143f, -0.009353f, 0.005688f, -0.000433f, -0.006026f, 0.006224f, 0.006597f, -0.004728f, 0.006128f, 0.003577f, -0.007371f, -0.000994f, 0.003111f, -0.003538f, 0.011420f, 0.007544f, 0.006850f, 0.019881f, 0.003345f, -0.003998f, -0.023543f, 0.008348f, 0.014667f, 0.009086f, 0.006251f, -0.001247f, 0.007885f, 0.027333f, -0.002371f, 0.013064f, 0.002059f, 0.007663f, 0.003478f, 0.001292f, + 0.006190f, -0.001414f, -0.010455f, -0.002363f, -0.007541f, -0.001388f, -0.010992f, 0.005091f, 0.001248f, 0.014721f, 0.003636f, -0.005670f, 0.005518f, -0.001170f, -0.002475f, 0.009725f, 0.004140f, 0.007473f, 0.004843f, -0.003044f, -0.014564f, 0.001771f, 0.010007f, 0.000197f, -0.001987f, 0.004869f, -0.007198f, -0.002669f, -0.013441f, -0.017093f, 0.010330f, 0.011170f, 0.009140f, -0.001694f, -0.001853f, 0.000983f, 0.000814f, 0.006147f, 0.000232f, 0.006663f, 0.006368f, 0.000715f, 0.006564f, -0.004072f, 0.002700f, -0.001697f, 0.004481f, 0.004852f, 0.018199f, 0.001046f, 0.015207f, -0.004121f, -0.012657f, -0.000159f, -0.000327f, -0.004146f, 0.012869f, 0.000672f, 0.008863f, -0.021527f, -0.000643f, 0.022142f, 0.030333f, -0.012453f, 0.003434f, 0.004953f, -0.010505f, -0.005977f, 0.001188f, -0.008600f, -0.009166f, 0.021390f, 0.002926f, -0.013855f, -0.002299f, -0.008956f, -0.005305f, 0.014026f, -0.004431f, -0.005860f, 0.012399f, 0.008000f, 0.012508f, -0.005086f, 0.002448f, 0.012641f, 0.000368f, -0.007092f, 0.003182f, -0.000738f, 0.001319f, -0.015273f, -0.010896f, 0.005042f, -0.001382f, 0.004110f, + -0.014685f, 0.007165f, 0.004939f, 0.003794f, -0.025718f, -0.014401f, -0.006814f, -0.002700f, 0.003188f, -0.010599f, -0.007874f, 0.003001f, 0.018947f, 0.013349f, 0.006351f, -0.002881f, -0.002715f, -0.006763f, 0.004982f, -0.001515f, -0.015073f, -0.010345f, -0.002087f, 0.000453f, 0.019533f, 0.011991f, -0.011016f, -0.010528f, 0.013039f, 0.003595f, -0.009685f, 0.000904f, 0.011243f, 0.005652f, -0.001325f, -0.015556f, 0.015892f, -0.005474f, 0.008631f, 0.003807f, 0.004538f, -0.005490f, 0.009355f, -0.011089f, 0.013479f, -0.000825f, -0.003158f, 0.007340f, -0.012832f, 0.004890f, 0.007592f, 0.001823f, 0.005426f, 0.006615f, -0.003179f, 0.014969f, -0.006467f, -0.024524f, -0.014411f, -0.002896f, 0.001384f, -0.004894f, -0.010227f, -0.011253f, -0.007480f, 0.024847f, -0.006368f, -0.001541f, 0.003958f, -0.004690f, 0.003353f, 0.020465f, -0.009216f, 0.009928f, -0.005813f, -0.012492f, 0.012011f, 0.008764f, 0.005793f, 0.018408f, 0.000874f, 0.008903f, -0.000307f, 0.002591f, -0.000213f, -0.005451f, 0.004465f, -0.000898f, 0.013544f, 0.003092f, -0.008445f, -0.001801f, -0.002041f, -0.000083f, -0.014063f, 0.006444f, + -0.013832f, 0.004104f, 0.020032f, -0.012016f, -0.023608f, 0.006330f, 0.004064f, 0.011897f, -0.004163f, 0.000640f, 0.012184f, -0.006005f, 0.006493f, 0.009574f, 0.003422f, -0.003556f, 0.012507f, 0.004612f, 0.016067f, -0.018631f, 0.045316f, -0.009732f, 0.020761f, 0.002558f, 0.009096f, 0.006713f, 0.000624f, -0.024354f, 0.022027f, -0.030535f, 0.010848f, 0.008097f, 0.028865f, -0.012563f, 0.013441f, -0.019238f, 0.013741f, -0.005840f, -0.020554f, -0.009674f, 0.005840f, 0.006012f, 0.008624f, 0.004496f, 0.012053f, 0.007855f, 0.017853f, -0.004785f, -0.013074f, -0.012084f, 0.005758f, 0.000295f, -0.006002f, 0.011807f, 0.005860f, -0.001934f, 0.007692f, 0.014467f, -0.000381f, 0.003997f, -0.001174f, 0.007289f, 0.005048f, -0.017750f, -0.006885f, -0.023380f, -0.004463f, -0.003792f, 0.000451f, 0.011531f, 0.011116f, 0.001645f, -0.005491f, -0.000035f, -0.002498f, -0.005571f, 0.004239f, 0.033243f, 0.004100f, -0.000808f, 0.011708f, -0.000951f, 0.013280f, -0.005438f, 0.001351f, -0.008232f, 0.034594f, 0.007422f, -0.012461f, -0.016270f, -0.009216f, 0.000599f, 0.000555f, -0.022134f, 0.002349f, 0.004299f, + 0.001866f, 0.023033f, 0.001742f, 0.019097f, 0.011539f, 0.018694f, 0.006159f, -0.019662f, 0.018703f, -0.012751f, 0.032528f, -0.021586f, -0.006415f, -0.029719f, -0.006316f, -0.003614f, 0.012881f, -0.014150f, 0.018977f, 0.014802f, -0.009351f, 0.000459f, 0.021749f, 0.030041f, -0.009837f, 0.000063f, -0.004050f, 0.008867f, 0.000120f, -0.004399f, 0.004441f, 0.007557f, -0.014637f, 0.010121f, 0.002111f, 0.011679f, 0.004854f, 0.000893f, -0.024961f, -0.005147f, 0.029046f, -0.004652f, 0.009758f, 0.020973f, 0.006476f, -0.003075f, -0.007697f, -0.011685f, -0.006065f, -0.000529f, -0.009462f, -0.007381f, 0.016884f, 0.013755f, 0.004948f, 0.023882f, 0.017214f, -0.007499f, -0.002521f, 0.001256f, 0.006023f, -0.010384f, -0.020560f, 0.024095f, 0.011804f, -0.008564f, 0.024508f, 0.022257f, 0.028503f, 0.008503f, 0.004094f, -0.014936f, 0.000334f, -0.019994f, -0.012355f, -0.014332f, -0.030188f, 0.025154f, 0.001098f, 0.004252f, -0.004246f, 0.001685f, -0.003684f, -0.039177f, 0.004088f, -0.000821f, -0.007366f, -0.003347f, -0.019443f, 0.021377f, 0.022002f, 0.024569f, -0.041063f, 0.012627f, 0.007993f, 0.000503f, + 0.039676f, 0.015929f, -0.020375f, -0.002878f, 0.039147f, 0.004101f, 0.006611f, 0.007485f, -0.012098f, 0.005993f, 0.007677f, 0.023937f, 0.011974f, -0.019471f, -0.031447f, 0.010995f, 0.006780f, -0.016322f, -0.003512f, 0.000732f, -0.019626f, 0.001354f, 0.022556f, 0.009029f, 0.012312f, 0.017950f, 0.029787f, 0.001933f, 0.026089f, 0.004301f, -0.011552f, -0.002631f, -0.016868f, -0.009479f, 0.005622f, 0.007880f, 0.005823f, 0.012202f, -0.020412f, -0.010072f, 0.032852f, -0.004080f, -0.008980f, -0.020843f, 0.014412f, 0.012865f, 0.002962f, 0.004070f, -0.002798f, 0.007074f, -0.017976f, 0.021688f, -0.016205f, -0.018048f, -0.017094f, -0.012849f, 0.025263f, 0.000455f, -0.009608f, 0.035913f, 0.042312f, -0.011189f, 0.011721f, -0.003410f, -0.012668f, 0.002142f, -0.028720f, -0.017954f, -0.001441f, -0.006093f, 0.056923f, -0.026060f, 0.007161f, -0.036661f, -0.005458f, 0.021737f, -0.009414f, -0.020613f, -0.021274f, -0.008186f, 0.008666f, 0.010824f, -0.001467f, -0.002291f, -0.023838f, 0.005122f, 0.016665f, 0.007904f, 0.010239f, 0.002514f, 0.003771f, -0.014458f, -0.004483f, 0.008742f, 0.003515f, -0.000628f, + 0.001176f, -0.017401f, 0.007623f, -0.018308f, -0.002680f, -0.001156f, 0.005347f, -0.020319f, -0.001771f, 0.008846f, 0.014346f, -0.023126f, -0.011391f, 0.038802f, -0.014873f, -0.032147f, 0.026672f, -0.026377f, -0.007565f, -0.012261f, -0.004063f, -0.020606f, -0.012982f, -0.005272f, -0.019045f, -0.029350f, 0.045962f, 0.023569f, 0.020953f, 0.012226f, -0.016708f, -0.008689f, -0.010861f, 0.010556f, -0.020134f, 0.012355f, -0.009915f, 0.002581f, -0.003535f, 0.058082f, -0.028532f, 0.024258f, -0.055193f, 0.012949f, -0.035706f, -0.008141f, 0.017248f, -0.003471f, 0.010448f, 0.018067f, 0.014144f, -0.025124f, 0.015698f, 0.001778f, 0.011165f, -0.006836f, 0.016153f, 0.014710f, -0.005335f, 0.001629f, 0.009041f, 0.010245f, -0.018859f, -0.007764f, -0.026728f, -0.004981f, 0.020394f, -0.001301f, -0.012176f, 0.000366f, 0.006484f, -0.000380f, -0.010796f, -0.019796f, 0.002861f, -0.014032f, 0.009865f, -0.013383f, 0.040876f, -0.005990f, -0.024826f, -0.028132f, 0.004205f, -0.016377f, 0.011714f, -0.031347f, -0.024611f, -0.031835f, 0.005155f, -0.027233f, -0.007691f, -0.038190f, 0.024069f, 0.003136f, 0.015624f, 0.008525f, + -0.040636f, 0.000791f, -0.005241f, -0.016777f, -0.023537f, -0.008162f, -0.020361f, -0.025557f, -0.014805f, 0.008648f, 0.013354f, 0.020290f, -0.015121f, 0.001191f, 0.007184f, -0.034270f, 0.011875f, -0.023097f, -0.049211f, -0.013801f, 0.056683f, 0.050117f, 0.028581f, -0.023418f, 0.025323f, 0.037554f, -0.023687f, 0.033194f, -0.025519f, 0.030643f, 0.008037f, -0.001638f, 0.010911f, -0.000306f, 0.016897f, -0.023573f, -0.005748f, -0.010518f, 0.013193f, -0.022429f, -0.019210f, 0.031983f, -0.001898f, -0.006530f, 0.004223f, -0.030709f, 0.000580f, 0.049480f, 0.028297f, 0.005569f, 0.000895f, 0.010427f, 0.048236f, 0.019804f, 0.002190f, 0.007649f, -0.011421f, -0.005869f, -0.009554f, 0.019736f, -0.008765f, 0.012982f, 0.004271f, 0.023495f, -0.026655f, -0.001212f, 0.000185f, 0.000031f, -0.006035f, 0.012612f, 0.023672f, -0.005983f, -0.003930f, 0.020771f, 0.004842f, 0.001577f, 0.051845f, 0.006514f, 0.003353f, -0.023996f, 0.012887f, -0.018349f, 0.026035f, -0.028114f, -0.019870f, 0.001735f, -0.019026f, -0.026677f, -0.032889f, 0.007913f, -0.006630f, 0.017142f, 0.001812f, 0.008636f, -0.040089f, 0.040178f, + -0.065395f, 0.025427f, 0.026610f, -0.046938f, -0.006008f, -0.040442f, -0.014218f, -0.036473f, -0.017170f, 0.038542f, -0.015034f, -0.004441f, -0.029469f, -0.006992f, 0.005161f, -0.043278f, -0.002920f, 0.025088f, -0.052809f, 0.000302f, -0.036454f, -0.020605f, -0.000556f, 0.002161f, -0.024553f, -0.020373f, -0.020767f, -0.007309f, -0.018020f, -0.002787f, 0.007715f, -0.006798f, 0.011853f, -0.026895f, -0.017240f, 0.031792f, -0.016919f, 0.016367f, -0.021187f, 0.017068f, 0.016113f, 0.001069f, 0.003420f, 0.015699f, -0.000367f, 0.023149f, 0.030576f, -0.008002f, 0.003494f, 0.045160f, 0.001581f, 0.022150f, -0.002945f, -0.020971f, -0.038491f, 0.004003f, 0.024564f, -0.043413f, -0.000792f, -0.026589f, -0.014080f, -0.055822f, 0.021556f, 0.032448f, -0.010753f, 0.014046f, -0.010335f, 0.035089f, 0.040391f, -0.006873f, -0.044126f, -0.044646f, 0.055298f, -0.049793f, 0.013158f, 0.002109f, 0.012103f, 0.069838f, 0.078729f, -0.004325f, -0.058642f, 0.058618f, -0.064119f, 0.009339f, 0.027888f, 0.006992f, -0.006381f, -0.029629f, 0.034122f, -0.014885f, -0.011423f, -0.030242f, -0.017014f, -0.009392f, -0.037207f, -0.020807f, + -0.016222f, -0.009474f, -0.005478f, 0.026270f, 0.000400f, 0.022666f, 0.000994f, -0.009937f, -0.032316f, -0.036497f, -0.008274f, -0.001513f, 0.000462f, -0.005746f, -0.012595f, -0.015973f, 0.018434f, 0.041556f, -0.021659f, 0.014063f, -0.013062f, -0.015045f, 0.017828f, -0.016674f, -0.025021f, 0.058270f, -0.005180f, 0.004840f, 0.004260f, -0.033467f, -0.005779f, -0.007580f, 0.018166f, -0.043190f, -0.017195f, 0.044039f, 0.008898f, -0.020011f, 0.026166f, 0.044584f, -0.024068f, -0.033270f, 0.018683f, -0.028512f, 0.002562f, -0.052410f, 0.018718f, 0.041699f, -0.002014f, 0.020703f, 0.015793f, 0.005317f, 0.052482f, 0.012783f, 0.002633f, 0.024715f, 0.001146f, -0.096543f, -0.068017f, 0.026649f, -0.029555f, -0.027853f, -0.082365f, -0.024579f, 0.016005f, 0.005539f, -0.017276f, -0.046240f, -0.001901f, 0.021731f, -0.003009f, 0.001991f, 0.022331f, 0.040960f, -0.037855f, 0.094669f, -0.026038f, -0.032867f, -0.011092f, -0.006438f, -0.001001f, -0.038941f, -0.000594f, -0.007700f, 0.018743f, -0.013812f, 0.027118f, -0.012853f, -0.025904f, 0.009006f, 0.010232f, -0.022728f, 0.022144f, -0.073891f, -0.001063f, -0.006775f, + 0.027427f, 0.034274f, -0.027226f, 0.031917f, -0.014379f, 0.008499f, -0.017526f, -0.006133f, -0.011546f, 0.025411f, -0.005480f, 0.033745f, 0.051976f, -0.047830f, -0.015277f, 0.024557f, -0.033915f, 0.018393f, -0.038344f, -0.020627f, -0.020417f, -0.021839f, -0.039410f, -0.019601f, 0.014228f, 0.013202f, 0.025015f, 0.035740f, 0.023051f, -0.045232f, 0.001534f, 0.007014f, 0.005816f, 0.007159f, 0.022371f, -0.017481f, 0.011054f, -0.022100f, -0.067155f, 0.046690f, -0.085317f, 0.056073f, -0.010568f, -0.039530f, -0.033889f, -0.037789f, -0.026127f, -0.021076f, -0.000347f, 0.040381f, -0.005581f, -0.038364f, 0.036041f, 0.051545f, -0.085010f, -0.024676f, 0.003731f, -0.009420f, -0.014973f, -0.006743f, -0.013523f, -0.017363f, -0.026107f, 0.028114f, -0.012770f, -0.025715f, -0.041423f, -0.041949f, 0.036704f, 0.007302f, -0.008998f, -0.007075f, -0.001871f, -0.011492f, -0.012412f, 0.005637f, -0.036585f, 0.015994f, 0.037658f, 0.026532f, 0.016567f, 0.034717f, 0.042083f, -0.028289f, 0.007564f, -0.039424f, 0.037503f, -0.025630f, -0.008208f, -0.003429f, -0.059006f, 0.015335f, 0.045478f, 0.004721f, -0.021043f, -0.019122f, + 0.060059f, -0.028236f, -0.028178f, 0.013860f, -0.064372f, -0.010821f, -0.032560f, -0.002116f, -0.062695f, 0.022291f, 0.009769f, 0.021941f, -0.100236f, -0.088405f, 0.014532f, -0.031333f, -0.017136f, 0.009749f, 0.077583f, -0.098184f, 0.108112f, 0.034745f, 0.000470f, 0.012800f, -0.071202f, 0.019782f, 0.039237f, -0.008912f, 0.092580f, -0.020909f, 0.042242f, -0.026806f, 0.101552f, 0.000964f, -0.009314f, -0.032811f, -0.009839f, 0.018870f, -0.006033f, 0.044294f, 0.034565f, -0.005645f, 0.006440f, -0.033613f, 0.018450f, 0.044118f, 0.043528f, -0.038334f, 0.021916f, -0.003535f, 0.046233f, -0.006397f, 0.031398f, -0.020442f, -0.016283f, -0.052457f, 0.007731f, -0.031211f, -0.050193f, 0.082182f, -0.030142f, -0.001191f, -0.010705f, -0.012719f, 0.014344f, 0.012167f, 0.031151f, -0.006870f, 0.045774f, 0.010005f, 0.079824f, 0.035289f, 0.088028f, 0.077550f, -0.002649f, 0.054153f, 0.040961f, -0.005749f, 0.047594f, 0.065127f, -0.019853f, -0.050826f, 0.038529f, 0.028920f, 0.053476f, 0.032180f, 0.001950f, 0.007538f, -0.054421f, 0.002648f, -0.008848f, -0.013299f, 0.096125f, 0.003866f, 0.034463f, 0.033463f, + -0.069782f, 0.138885f, -0.016892f, -0.013653f, -0.007000f, 0.101438f, -0.059534f, 0.051645f, -0.065323f, 0.065146f, 0.014713f, -0.010898f, 0.003494f, 0.038739f, -0.014113f, 0.036192f, -0.014217f, 0.001117f, 0.072092f, 0.022910f, -0.015981f, 0.001096f, 0.019519f, 0.015098f, -0.065999f, 0.019448f, -0.022716f, -0.004915f, -0.033760f, 0.035901f, 0.035085f, 0.006331f, 0.017780f, 0.059723f, -0.017251f, -0.092081f, 0.024499f, 0.062146f, -0.021424f, -0.060215f, 0.018546f, 0.044764f, 0.017082f, 0.001055f, -0.071110f, -0.034223f, -0.041146f, 0.041782f, 0.018899f, 0.043007f, -0.086037f, 0.006621f, -0.013940f, -0.096711f, -0.022956f, 0.015356f, 0.046599f, 0.062545f, -0.030411f, 0.115992f, 0.024659f, 0.003145f, -0.021474f, -0.045118f, -0.029967f, 0.023093f, -0.051286f, 0.110012f, -0.032934f, 0.006478f, 0.065542f, -0.039627f, 0.040086f, -0.037557f, -0.023218f, 0.095934f, -0.032566f, -0.080489f, 0.046272f, 0.029620f, 0.046317f, -0.018266f, -0.012796f, 0.018738f, 0.000456f, 0.005359f, 0.002081f, 0.009120f, 0.002569f, -0.012712f, 0.060018f, -0.013964f, -0.040620f, 0.017281f, -0.000578f, -0.036309f, + 0.013137f, 0.008194f, 0.025172f, -0.016895f, -0.026757f, 0.029193f, -0.023010f, -0.003514f, -0.006350f, 0.023844f, -0.040931f, 0.013868f, -0.025067f, 0.020726f, -0.035879f, 0.012614f, -0.011433f, 0.005846f, 0.081395f, -0.055855f, 0.011466f, 0.017155f, -0.048851f, 0.017507f, 0.024075f, -0.037592f, -0.006561f, -0.014825f, 0.068128f, 0.004931f, -0.076143f, 0.045606f, -0.061240f, 0.010606f, 0.033804f, -0.030838f, 0.038544f, -0.045670f, -0.035393f, 0.050043f, -0.006977f, 0.020766f, -0.074479f, 0.013422f, 0.018408f, -0.004892f, -0.009690f, -0.001426f, 0.033222f, 0.000489f, -0.098905f, 0.060996f, -0.003486f, 0.023654f, -0.023036f, -0.029556f, 0.102458f, 0.005234f, 0.034075f, -0.017315f, -0.203540f, -0.428395f, -0.173420f, -0.323505f, -0.393224f, 0.133832f, -0.005698f, 0.137415f, 0.533525f, 0.465626f, 0.263012f, 0.510669f, 0.282811f, 0.028610f, 0.173729f, 0.105666f, -0.198664f, -0.141220f, -0.044525f, -0.219301f, -0.264839f, -0.090322f, -0.136009f, -0.209874f, -0.055746f, -0.012642f, -0.266690f, -0.184279f, -0.031140f, -0.162765f, -0.210452f, -0.063088f, -0.104980f, -0.227485f, -0.046485f, 0.020542f, + -0.129249f, -0.098254f, 0.092180f, -0.035988f, -0.137931f, 0.026980f, 0.087146f, -0.067722f, 0.052840f, 0.196445f, -0.030594f, -0.052472f, 0.193727f, 0.104804f, -0.049299f, 0.325286f, 0.440098f, 0.276439f, 0.464917f, 0.697823f, 0.535909f, 0.513360f, 0.745839f, 0.650861f, 0.478885f, 0.590955f, 0.535874f, 0.349197f, 0.308019f, 0.177718f, -0.040048f, -0.207534f, -0.392995f, -0.554872f, -0.668770f, -0.827554f, -0.887498f, -0.903782f, -1.015445f, -0.782287f, -0.328791f, -0.239100f}, + {0.015411f, -0.004835f, 0.003598f, 0.002703f, -0.005164f, 0.006210f, 0.004807f, -0.001574f, 0.008486f, -0.000062f, 0.003607f, -0.012048f, 0.004522f, 0.004561f, -0.006273f, 0.012698f, 0.001577f, 0.006213f, -0.000874f, -0.001550f, 0.000757f, 0.008771f, 0.009662f, -0.009656f, -0.003025f, -0.004316f, 0.006311f, -0.003000f, -0.002298f, 0.001390f, -0.005192f, -0.008012f, 0.004325f, -0.007579f, 0.004329f, 0.004266f, 0.004248f, -0.000168f, 0.002384f, -0.000085f, 0.006220f, -0.002180f, 0.000959f, -0.006256f, -0.001556f, -0.011929f, -0.005601f, 0.001504f, 0.004265f, -0.000517f, 0.005970f, -0.000565f, 0.003038f, -0.007430f, 0.002075f, 0.003668f, 0.004347f, 0.001095f, -0.003381f, 0.000296f, -0.001629f, 0.002803f, 0.003272f, 0.001405f, -0.000289f, -0.002635f, -0.001525f, 0.006098f, -0.001585f, 0.002727f, 0.005248f, 0.003306f, -0.002841f, 0.006124f, 0.000130f, 0.001911f, -0.001890f, -0.013352f, 0.000381f, 0.010588f, 0.007286f, 0.007307f, 0.004615f, 0.002884f, -0.004168f, 0.000127f, -0.004740f, 0.011309f, 0.006969f, 0.002682f, 0.001674f, 0.001592f, -0.000103f, -0.003641f, 0.005617f, 0.007751f, + 0.007556f, 0.004537f, -0.005655f, -0.008306f, -0.008955f, -0.008633f, -0.000825f, 0.004401f, -0.008735f, 0.007285f, -0.001681f, 0.012787f, -0.002042f, 0.008092f, 0.000222f, -0.010754f, 0.003179f, -0.001459f, 0.008769f, 0.000508f, -0.000858f, -0.004444f, -0.007142f, 0.000567f, 0.004308f, -0.009462f, -0.012612f, 0.008855f, -0.007203f, -0.006931f, -0.006217f, 0.004951f, -0.004831f, 0.002056f, -0.001991f, -0.000718f, -0.007230f, -0.002360f, -0.004786f, -0.007576f, 0.002856f, 0.005758f, -0.001734f, -0.008303f, -0.001131f, -0.001716f, -0.003599f, -0.007139f, 0.000068f, -0.005769f, -0.006118f, -0.001142f, 0.001316f, 0.001808f, -0.001296f, 0.001423f, 0.000008f, 0.025178f, -0.008730f, -0.005689f, -0.007782f, -0.005314f, 0.000627f, -0.016743f, 0.002875f, -0.008267f, -0.016425f, -0.003437f, 0.014136f, -0.010060f, 0.002776f, -0.001107f, 0.004755f, 0.007224f, 0.007642f, 0.012426f, -0.002625f, -0.006951f, 0.003153f, 0.003093f, -0.005654f, -0.000693f, -0.003822f, -0.002357f, 0.001514f, -0.006328f, -0.004049f, -0.000792f, -0.008153f, -0.009401f, 0.004872f, 0.007557f, -0.004400f, -0.010808f, -0.001947f, -0.002388f, + 0.001530f, 0.009074f, 0.000558f, -0.003466f, -0.000625f, 0.012105f, 0.001442f, -0.007034f, -0.007055f, 0.003328f, 0.002200f, 0.009751f, 0.005329f, -0.000338f, -0.009119f, 0.000808f, -0.000605f, 0.008104f, -0.008416f, -0.002459f, 0.004486f, 0.009408f, -0.002655f, 0.001188f, -0.006972f, -0.003440f, 0.004062f, 0.000694f, 0.000725f, 0.002914f, -0.002854f, 0.003773f, 0.000748f, 0.004521f, 0.002194f, 0.002032f, 0.015335f, 0.004952f, -0.018520f, -0.004415f, -0.008779f, 0.008360f, 0.002065f, 0.000119f, 0.005936f, -0.003653f, -0.014323f, -0.007608f, 0.009410f, -0.000611f, 0.009699f, -0.000822f, -0.005583f, 0.010717f, 0.004008f, 0.023608f, -0.004518f, 0.010186f, 0.001450f, -0.011286f, 0.002762f, -0.009609f, 0.006095f, 0.002051f, 0.002368f, -0.010273f, 0.005025f, -0.001905f, -0.003634f, 0.004016f, 0.016093f, 0.005848f, -0.000143f, -0.013117f, 0.011182f, -0.002540f, -0.000003f, 0.007765f, -0.011840f, -0.002398f, 0.008068f, -0.005028f, -0.004268f, -0.013523f, -0.014595f, -0.001344f, 0.008723f, 0.004924f, -0.005910f, -0.000439f, 0.005639f, 0.006879f, 0.002756f, -0.001805f, -0.002918f, -0.013107f, + 0.005857f, 0.015456f, 0.007050f, -0.005022f, -0.002429f, 0.004512f, 0.007333f, -0.001177f, -0.002650f, 0.001208f, -0.010855f, -0.002760f, -0.007832f, -0.004453f, -0.001350f, -0.005867f, 0.011054f, 0.008503f, -0.004962f, -0.014224f, 0.015127f, -0.013706f, 0.013782f, -0.000490f, -0.011638f, -0.026954f, -0.010835f, -0.007989f, 0.003626f, 0.013591f, 0.010556f, -0.003708f, -0.002495f, -0.003590f, -0.007986f, -0.002543f, -0.008929f, 0.002598f, 0.002803f, 0.004944f, 0.008417f, 0.004863f, 0.016424f, -0.000280f, 0.003041f, -0.006237f, -0.001727f, -0.004326f, 0.005821f, 0.001545f, -0.008143f, -0.011600f, 0.000127f, -0.008411f, 0.000683f, 0.007368f, -0.013101f, 0.008705f, -0.021815f, -0.006200f, -0.016263f, 0.002453f, -0.001299f, 0.000008f, -0.006560f, -0.008677f, 0.002673f, 0.007377f, 0.005159f, 0.001787f, -0.013104f, 0.003695f, -0.009134f, -0.003568f, -0.002817f, -0.017640f, -0.007082f, 0.005065f, 0.006498f, -0.000744f, -0.012267f, 0.001949f, 0.004340f, -0.002424f, -0.002599f, 0.001371f, 0.010283f, 0.003714f, -0.002514f, -0.003382f, 0.001709f, -0.024893f, 0.001683f, 0.006253f, 0.005809f, 0.016687f, + 0.017864f, -0.004444f, 0.000346f, 0.011793f, -0.005949f, -0.005602f, 0.017654f, -0.013324f, -0.031499f, -0.020724f, -0.012093f, 0.019018f, 0.008228f, 0.002639f, -0.018164f, 0.019382f, -0.008200f, 0.005419f, -0.004847f, 0.007586f, 0.009513f, -0.000810f, 0.000429f, -0.000227f, -0.002952f, -0.010092f, -0.007876f, -0.002545f, 0.001272f, 0.008704f, 0.005216f, 0.013635f, 0.006803f, -0.006130f, -0.002956f, 0.012091f, -0.008557f, 0.014852f, -0.011748f, 0.003046f, 0.006867f, 0.004054f, -0.009460f, 0.013012f, -0.001000f, 0.013975f, 0.019045f, 0.002601f, -0.007180f, -0.007560f, 0.008241f, -0.009343f, -0.018721f, -0.005271f, 0.004333f, -0.012619f, 0.007317f, 0.005223f, -0.003711f, -0.008083f, -0.002888f, -0.003442f, 0.004028f, -0.002066f, -0.010356f, -0.004755f, 0.018896f, 0.014127f, 0.008398f, -0.022946f, -0.021279f, -0.012884f, 0.021216f, 0.009262f, -0.001136f, 0.001193f, -0.009185f, 0.002344f, 0.008189f, 0.012395f, -0.001457f, 0.004320f, -0.021388f, -0.007723f, 0.002663f, 0.006318f, -0.026342f, -0.003594f, 0.010322f, -0.008482f, -0.017379f, 0.009624f, -0.020094f, -0.014998f, -0.008386f, 0.000922f, + -0.007733f, -0.005566f, -0.001317f, 0.013631f, -0.012928f, 0.002410f, -0.004560f, -0.005885f, -0.010979f, -0.003645f, -0.015712f, -0.005287f, -0.001105f, 0.002064f, -0.011173f, -0.003035f, -0.007283f, 0.000136f, -0.004024f, -0.005494f, 0.002134f, 0.011028f, 0.002395f, -0.007020f, 0.005285f, -0.009903f, -0.002850f, 0.002615f, -0.004036f, 0.005044f, -0.002505f, -0.001544f, -0.042306f, 0.001881f, -0.015016f, 0.006159f, 0.005508f, 0.008297f, -0.023486f, -0.024389f, 0.002675f, -0.000161f, 0.005012f, -0.000866f, 0.012060f, -0.006139f, 0.006395f, 0.007264f, -0.004359f, 0.018364f, -0.006431f, -0.014182f, -0.002944f, -0.012242f, -0.000497f, -0.023063f, 0.000242f, 0.007114f, 0.016392f, -0.032395f, 0.008977f, 0.001573f, 0.009318f, 0.013282f, 0.002668f, -0.012509f, -0.027460f, 0.002092f, -0.010896f, 0.021181f, -0.008237f, 0.004417f, 0.001906f, 0.004546f, 0.016307f, -0.007015f, -0.000073f, -0.007397f, -0.003725f, 0.004116f, -0.003559f, 0.014862f, 0.011599f, 0.003092f, -0.002669f, 0.000077f, 0.010516f, -0.001189f, 0.005368f, -0.000424f, -0.007676f, 0.007056f, -0.001532f, -0.006436f, 0.009437f, 0.014650f, + 0.000673f, 0.005502f, 0.001702f, -0.010311f, -0.005510f, 0.017723f, -0.008069f, 0.008201f, 0.013954f, -0.018087f, 0.013271f, 0.006097f, 0.007134f, -0.008453f, 0.013643f, 0.002964f, -0.001386f, 0.015608f, 0.001469f, -0.001103f, -0.006803f, -0.005386f, 0.000915f, -0.008306f, -0.016607f, -0.005882f, 0.018931f, 0.012105f, 0.015789f, -0.003276f, -0.014493f, 0.004573f, 0.019939f, -0.005750f, -0.012145f, -0.003433f, -0.008130f, -0.006079f, 0.000003f, -0.015200f, -0.004280f, -0.024685f, -0.007003f, -0.014214f, -0.016768f, -0.015933f, -0.005425f, 0.022013f, 0.024005f, 0.032873f, 0.007618f, -0.012236f, -0.007340f, 0.027227f, 0.000228f, -0.006106f, 0.021034f, -0.001986f, 0.001241f, -0.032173f, 0.014968f, 0.008291f, -0.021237f, 0.030047f, -0.003820f, 0.013561f, -0.003282f, 0.007135f, 0.013645f, 0.000123f, 0.023854f, 0.009089f, 0.007021f, -0.002663f, -0.007983f, 0.002296f, 0.014589f, -0.003798f, 0.004577f, 0.006671f, 0.019203f, -0.000904f, -0.005369f, 0.012113f, -0.013949f, -0.009042f, 0.006784f, 0.020721f, -0.008913f, -0.011280f, -0.003220f, 0.017001f, 0.000444f, 0.002241f, -0.006140f, -0.003150f, + 0.006401f, 0.008791f, 0.001020f, -0.007700f, -0.023540f, 0.002470f, 0.007133f, 0.022193f, 0.006655f, -0.002271f, 0.017373f, 0.030491f, -0.006446f, 0.010288f, 0.007137f, 0.012208f, -0.002862f, -0.011583f, 0.005583f, -0.027563f, 0.040277f, -0.019271f, 0.009710f, -0.000803f, -0.012904f, 0.030808f, 0.007863f, 0.004377f, -0.031098f, 0.008895f, -0.011915f, -0.013903f, 0.004362f, -0.013568f, 0.016970f, 0.010343f, -0.001848f, 0.003803f, -0.006924f, -0.002968f, -0.010675f, -0.006901f, -0.012979f, -0.020948f, -0.004332f, -0.014507f, -0.003047f, 0.008698f, -0.005058f, -0.007584f, 0.018063f, 0.011192f, 0.018158f, -0.013510f, -0.000465f, -0.002329f, -0.014231f, 0.000628f, -0.006989f, -0.037820f, 0.004582f, 0.001156f, -0.004649f, 0.013745f, -0.000070f, 0.015112f, 0.013785f, 0.005035f, 0.024458f, 0.020947f, -0.018764f, -0.005099f, 0.001707f, -0.000298f, 0.008808f, 0.003209f, 0.021261f, -0.003725f, 0.033036f, 0.000425f, -0.016615f, -0.014493f, 0.004319f, 0.006146f, 0.008418f, 0.023268f, 0.008090f, 0.006262f, 0.023585f, 0.029099f, 0.003441f, -0.016727f, -0.014286f, -0.000628f, -0.003620f, -0.002536f, + 0.030188f, 0.024598f, 0.002691f, 0.016850f, -0.016628f, 0.008676f, 0.002295f, -0.000463f, 0.011471f, 0.025933f, -0.006006f, -0.001455f, 0.024044f, -0.029742f, -0.016087f, -0.012530f, -0.034045f, 0.007694f, -0.010119f, -0.004118f, 0.005210f, -0.023081f, 0.027212f, 0.020563f, 0.028866f, 0.013296f, -0.016236f, 0.002457f, 0.002219f, 0.021635f, -0.002708f, 0.000159f, 0.000364f, -0.012084f, 0.002250f, -0.006751f, 0.012888f, -0.012848f, -0.003887f, -0.003748f, -0.004578f, -0.015161f, 0.008958f, -0.022631f, -0.002128f, -0.000717f, 0.016329f, 0.009730f, 0.003585f, 0.001264f, -0.002424f, 0.002777f, 0.002025f, 0.013386f, 0.004756f, 0.004732f, 0.000081f, -0.035615f, -0.014946f, 0.005621f, 0.017656f, 0.019784f, -0.026290f, 0.020943f, 0.008589f, -0.009560f, 0.005962f, 0.008330f, -0.003239f, 0.030423f, 0.004435f, 0.008349f, -0.001616f, -0.035133f, -0.007130f, -0.012293f, 0.003904f, 0.035115f, 0.004739f, 0.013576f, -0.022780f, -0.020748f, 0.010329f, 0.017712f, 0.001199f, -0.007689f, 0.033694f, 0.009854f, -0.000846f, -0.010671f, 0.006575f, -0.003759f, -0.004805f, -0.002367f, -0.006923f, 0.000538f, + -0.012490f, -0.028596f, 0.008128f, 0.001739f, 0.007461f, 0.001639f, 0.014378f, 0.003559f, -0.017360f, -0.034593f, -0.000011f, 0.001403f, -0.003560f, -0.030416f, -0.015155f, -0.005518f, 0.007377f, -0.007509f, 0.002471f, -0.026747f, 0.000458f, -0.006838f, -0.000602f, 0.001462f, 0.006376f, -0.003871f, -0.024836f, -0.023291f, -0.014507f, 0.008225f, 0.006245f, -0.007000f, -0.005613f, -0.039755f, -0.022447f, -0.001841f, -0.038227f, 0.033681f, -0.036060f, -0.010795f, -0.023437f, 0.036263f, 0.011647f, -0.027160f, 0.012998f, -0.003904f, 0.014004f, -0.023117f, -0.007329f, 0.000345f, 0.015405f, -0.021641f, -0.007999f, -0.007288f, -0.020824f, 0.002140f, 0.015221f, 0.000117f, -0.003944f, 0.029952f, 0.067723f, -0.011217f, -0.023648f, -0.022178f, -0.019922f, -0.027580f, 0.002267f, -0.045661f, -0.002408f, -0.035685f, -0.017736f, 0.008702f, 0.019198f, 0.010477f, -0.017389f, -0.003809f, 0.018090f, -0.003085f, 0.021175f, -0.015607f, -0.016303f, -0.014069f, 0.008745f, -0.009822f, -0.012993f, 0.002116f, -0.015159f, -0.014647f, 0.013432f, 0.035818f, 0.011654f, 0.014415f, 0.004568f, -0.023613f, -0.007801f, -0.019449f, + -0.019539f, -0.004245f, -0.005764f, -0.015605f, -0.025270f, -0.046745f, -0.007071f, -0.017956f, 0.002929f, -0.009897f, 0.013919f, 0.014148f, 0.005805f, 0.014872f, 0.008352f, -0.003311f, 0.028329f, 0.043569f, 0.007348f, -0.054508f, 0.007172f, -0.011134f, -0.034731f, 0.002605f, 0.011186f, 0.005741f, -0.002833f, 0.012660f, -0.005330f, -0.027200f, -0.003271f, 0.009764f, -0.030533f, -0.015716f, -0.029605f, -0.046740f, 0.027514f, 0.001151f, -0.001596f, 0.050077f, -0.039199f, 0.043079f, -0.004875f, -0.006658f, -0.023714f, -0.009717f, -0.023537f, -0.020484f, 0.022636f, -0.022542f, 0.011214f, 0.051710f, 0.018773f, -0.009436f, -0.025005f, -0.021763f, 0.022773f, -0.021060f, -0.033785f, -0.015241f, 0.002446f, 0.001364f, -0.038400f, 0.000824f, -0.012263f, 0.017653f, -0.012717f, -0.002526f, 0.003489f, 0.053894f, -0.014376f, -0.020010f, 0.026305f, -0.023832f, 0.031775f, -0.021391f, 0.023048f, 0.001573f, -0.018071f, -0.018328f, 0.029479f, -0.041815f, 0.028982f, -0.019684f, 0.002209f, -0.012337f, 0.015424f, -0.016673f, -0.007805f, -0.003859f, -0.012983f, 0.053524f, -0.017379f, 0.035157f, 0.014079f, 0.013794f, + -0.001382f, 0.010346f, 0.023778f, 0.023218f, -0.009021f, -0.032390f, -0.001368f, 0.017311f, 0.007557f, -0.010650f, -0.036251f, 0.038185f, -0.012173f, -0.039028f, -0.011828f, -0.029403f, 0.009245f, 0.004961f, -0.058765f, -0.025410f, 0.035169f, -0.007618f, -0.015163f, 0.040949f, 0.003449f, -0.022128f, 0.015222f, 0.022031f, 0.018650f, 0.002427f, -0.036327f, -0.015367f, 0.004970f, 0.004717f, 0.018227f, 0.011813f, 0.020629f, -0.018877f, -0.014931f, 0.006507f, -0.005445f, 0.016722f, -0.034149f, -0.006296f, -0.036895f, -0.012380f, 0.006138f, -0.005631f, -0.005027f, 0.038358f, 0.007674f, -0.029514f, -0.004822f, 0.001680f, -0.029949f, -0.004652f, 0.001020f, 0.017076f, 0.044396f, -0.016585f, 0.014565f, -0.025712f, 0.003354f, -0.015434f, -0.019358f, 0.017532f, 0.038788f, -0.031825f, 0.002597f, 0.034132f, -0.016176f, -0.004040f, -0.013514f, 0.022007f, 0.005105f, -0.029277f, -0.000762f, -0.010852f, -0.009635f, -0.003809f, -0.014378f, 0.020110f, -0.050642f, 0.009518f, 0.003746f, -0.022311f, 0.027639f, 0.041830f, 0.029939f, 0.080752f, 0.024390f, -0.022552f, -0.029667f, -0.025599f, -0.013619f, 0.036505f, + -0.100088f, -0.008132f, 0.050202f, -0.077039f, -0.007716f, 0.010006f, -0.079563f, 0.029342f, 0.004699f, 0.055919f, -0.010513f, 0.016984f, 0.013218f, -0.070407f, -0.059323f, -0.025622f, -0.009934f, -0.037408f, -0.045375f, -0.025860f, 0.032859f, 0.022010f, 0.017975f, -0.001950f, -0.000639f, 0.007471f, -0.002621f, -0.052440f, -0.023005f, -0.066098f, -0.024815f, 0.029924f, 0.005023f, 0.018695f, 0.072151f, 0.015514f, 0.023826f, -0.005928f, 0.009918f, 0.063464f, 0.045588f, 0.009442f, 0.027777f, 0.025943f, 0.062019f, 0.050866f, -0.080469f, 0.041260f, -0.010645f, 0.039116f, 0.038514f, 0.013337f, 0.074714f, 0.066509f, -0.047156f, 0.029805f, -0.008244f, 0.027859f, -0.067903f, -0.000696f, -0.002249f, -0.004667f, -0.022866f, 0.030485f, 0.030830f, -0.047662f, -0.024626f, -0.032044f, 0.001828f, -0.042667f, -0.055459f, 0.027192f, 0.047691f, 0.010543f, 0.043803f, -0.036338f, -0.029891f, 0.045062f, 0.080695f, -0.010329f, -0.108449f, -0.034339f, 0.011961f, -0.008018f, -0.017234f, -0.023500f, 0.001318f, -0.062038f, -0.036447f, -0.051471f, -0.007283f, -0.014782f, 0.018467f, -0.036689f, -0.009399f, 0.010304f, + 0.018686f, -0.000139f, 0.020725f, 0.038015f, 0.009313f, 0.054704f, -0.033478f, 0.013344f, 0.003898f, 0.052153f, 0.015444f, -0.010011f, -0.050407f, 0.034940f, -0.006959f, 0.047535f, -0.037618f, -0.031484f, -0.027824f, -0.015969f, -0.045745f, -0.006543f, -0.005689f, -0.045320f, 0.027848f, 0.051764f, -0.021966f, 0.007723f, -0.063861f, 0.064585f, -0.016849f, -0.035102f, 0.033252f, 0.025803f, -0.034295f, 0.003364f, -0.019486f, 0.008442f, -0.012687f, 0.080746f, 0.002324f, -0.007011f, -0.014063f, 0.142442f, 0.010151f, -0.019633f, 0.068407f, 0.048564f, -0.043492f, 0.039608f, -0.053798f, -0.036822f, -0.054697f, 0.047664f, -0.030821f, 0.017288f, -0.032541f, -0.148662f, 0.008733f, 0.092581f, -0.058779f, -0.039862f, 0.074070f, -0.056995f, -0.005297f, -0.017525f, 0.071051f, -0.126824f, 0.068159f, 0.039562f, -0.036937f, 0.011133f, 0.066574f, 0.046800f, -0.025550f, 0.025939f, 0.010875f, -0.021000f, 0.030459f, -0.002672f, 0.017833f, 0.027535f, -0.014215f, 0.005117f, -0.004797f, 0.012050f, -0.019685f, -0.016615f, -0.002757f, 0.023272f, -0.075688f, -0.038775f, 0.035257f, -0.010440f, -0.050720f, -0.060160f, + 0.008451f, 0.070038f, -0.032923f, -0.048300f, 0.033890f, 0.051656f, -0.013401f, 0.011325f, -0.011155f, 0.047926f, -0.028900f, 0.072961f, -0.011859f, -0.002126f, 0.039492f, -0.001409f, 0.007722f, -0.055718f, 0.082132f, -0.045705f, -0.054476f, 0.037560f, -0.057666f, -0.020709f, 0.007300f, 0.025469f, 0.075308f, -0.029802f, 0.045908f, -0.012103f, 0.022607f, -0.133599f, -0.103520f, -0.020692f, -0.042502f, 0.017588f, -0.015312f, -0.053727f, -0.027629f, 0.031141f, -0.065692f, 0.054987f, -0.056572f, -0.070158f, 0.032404f, -0.036519f, -0.025792f, 0.032685f, -0.032765f, 0.026403f, -0.026673f, 0.009475f, 0.069155f, -0.071044f, -0.009095f, -0.015386f, 0.057638f, 0.002950f, 0.001562f, -0.064383f, -0.059522f, -0.025240f, -0.020365f, -0.014278f, -0.022009f, 0.005150f, -0.000925f, -0.011907f, 0.005052f, 0.007294f, 0.002284f, 0.004211f, -0.015420f, 0.022739f, -0.022815f, 0.021364f, -0.056352f, -0.004624f, -0.046372f, -0.061632f, -0.036350f, 0.066352f, -0.035401f, -0.039134f, -0.027758f, 0.009665f, -0.018382f, 0.025200f, 0.043651f, -0.057332f, 0.040817f, 0.000143f, -0.072466f, -0.042567f, 0.138514f, 0.065300f, + -0.111380f, -0.029101f, 0.064871f, -0.043963f, -0.042908f, 0.017801f, -0.037578f, -0.084852f, 0.049830f, 0.013212f, -0.105088f, 0.029445f, 0.047046f, -0.073432f, -0.044851f, 0.043345f, -0.024624f, 0.091827f, 0.128941f, -0.048000f, 0.143982f, -0.008517f, -0.036462f, -0.027254f, -0.045715f, -0.001236f, 0.025949f, 0.086405f, 0.004969f, 0.028673f, -0.019190f, -0.069031f, 0.003316f, 0.005738f, 0.049373f, 0.012200f, -0.052650f, 0.104525f, -0.041519f, 0.022261f, 0.047171f, -0.047036f, -0.039385f, -0.068498f, -0.030040f, 0.048108f, 0.056876f, 0.072209f, -0.024513f, -0.163795f, 0.038428f, 0.091430f, 0.113370f, 0.100458f, -0.000402f, -0.043846f, -0.058460f, 0.024534f, 0.058123f, -0.032118f, -0.018504f, -0.143976f, -0.090277f, 0.084479f, 0.134902f, 0.032365f, -0.003202f, -0.027624f, -0.058390f, -0.008615f, 0.037509f, -0.046653f, 0.020498f, -0.001827f, 0.084889f, 0.002166f, 0.032941f, -0.159993f, -0.021455f, 0.008416f, 0.101440f, 0.085780f, -0.002947f, -0.042581f, -0.014830f, 0.129045f, 0.053352f, -0.134038f, -0.178453f, -0.059571f, 0.032782f, 0.284702f, 0.026446f, -0.035117f, 0.035627f, 0.013451f, + -0.023511f, 0.057841f, -0.067765f, 0.001475f, -0.027485f, 0.014895f, -0.042045f, 0.038429f, 0.010511f, -0.022948f, -0.042313f, -0.021445f, -0.008194f, 0.011416f, -0.057552f, 0.012371f, -0.028223f, -0.011850f, -0.045000f, -0.022113f, 0.036413f, -0.039322f, -0.013509f, -0.006307f, 0.017905f, 0.010966f, -0.014773f, 0.019509f, -0.032672f, -0.003783f, 0.000685f, 0.016445f, -0.021199f, 0.029991f, 0.023748f, -0.025083f, -0.027034f, -0.011881f, 0.045010f, -0.033416f, 0.014679f, 0.031555f, 0.008089f, -0.033713f, -0.011514f, 0.012269f, -0.019300f, 0.013352f, 0.002472f, 0.005541f, -0.028616f, 0.004460f, -0.022948f, -0.002918f, 0.023830f, 0.026430f, 0.023586f, -0.018466f, 0.022725f, 0.000518f, -0.024615f, -0.006189f, 0.001945f, 0.029181f, -0.006431f, 0.004119f, 0.029958f, -0.008614f, -0.032925f, 0.047105f, -0.017051f, 0.026608f, 0.025469f, 0.002343f, 0.011644f, -0.021523f, -0.016385f, -0.053199f, 0.102672f, 0.010360f, 0.006617f, -0.039875f, 0.024606f, -0.002270f, 0.027678f, 0.021534f, 0.032195f, 0.004685f, 0.008917f, -0.016288f, 0.005998f, 0.029892f, -0.001889f, 0.016972f, -0.001599f, 0.006334f, + 0.007190f, 0.012981f, -0.011284f, 0.023059f, -0.013936f, 0.003434f, -0.001597f, 0.008818f, -0.001184f, 0.005862f, 0.017182f, 0.019600f, -0.008034f, 0.009545f, 0.004180f, -0.002428f, -0.007131f, 0.025698f, -0.006801f, 0.006777f, -0.006284f, 0.014305f, 0.000445f, -0.009752f, 0.024655f, -0.013211f, -0.004758f, 0.008273f, -0.010971f, -0.004969f, -0.003177f, 0.002971f, -0.004048f, 0.002439f, -0.002067f, -0.004153f, 0.008409f, -0.013394f, 0.009942f, 0.008901f, -0.005269f, 0.012653f, -0.007867f, 0.014660f, -0.006423f, 0.004916f, 0.002144f, -0.004633f, 0.011634f, 0.002930f, 0.001071f, -0.000615f, 0.015306f, -0.015646f, 0.019147f, -0.010208f, 0.000195f, 0.009367f, 0.019110f, -0.093018f, -0.231172f, 0.035597f, 0.175452f, 0.163079f, 0.282991f, -0.072566f, -0.076245f, -0.193157f, -0.263831f, -0.054517f, 0.094834f, 0.101754f, 0.191540f, 0.104126f, 0.007767f, -0.050003f, -0.134519f, -0.095414f, -0.016958f, -0.015024f, 0.047241f, 0.044217f, 0.025074f, 0.016281f, 0.012321f, -0.007117f, -0.033511f, -0.002583f, 0.037454f, 0.000283f, 0.007396f, -0.002165f, -0.029158f, -0.021808f, -0.049168f, -0.047481f, + 0.020897f, 0.019975f, 0.043419f, 0.067164f, 0.049552f, 0.024676f, 0.008174f, -0.072237f, -0.051921f, -0.039434f, -0.040422f, -0.044065f, 0.008504f, 0.028468f, 0.048339f, 0.062971f, 0.051126f, 0.011607f, -0.006877f, -0.041254f, -0.043201f, -0.024854f, -0.013018f, 0.004504f, 0.006305f, 0.014553f, 0.000597f, -0.013016f, 0.004044f, -0.021007f, 0.010881f, 0.019261f, 0.001900f, 0.037985f, 0.044796f, 0.015386f, -0.007376f, -0.046282f, -0.059850f, -0.015115f, -0.000186f, -0.001366f} + }, + { + {0.013420f, -0.000209f, 0.005181f, 0.005615f, 0.001992f, 0.002040f, 0.002951f, 0.004505f, 0.008385f, 0.003966f, -0.000592f, -0.003196f, 0.000563f, -0.004413f, -0.004280f, 0.000795f, -0.000774f, 0.001794f, -0.000829f, -0.001739f, -0.004675f, 0.006127f, 0.001248f, -0.000221f, -0.008309f, 0.000727f, 0.005836f, 0.008334f, -0.005496f, -0.001211f, -0.001522f, 0.004249f, -0.000613f, -0.000284f, 0.001900f, 0.000669f, -0.001158f, 0.003107f, -0.003384f, 0.001505f, -0.008440f, -0.006124f, 0.002785f, 0.003340f, 0.012023f, -0.004514f, -0.004511f, -0.002546f, 0.004971f, -0.003818f, -0.007079f, -0.004891f, -0.008346f, 0.000921f, -0.005535f, 0.005018f, 0.006468f, 0.001583f, 0.002777f, -0.003821f, 0.002505f, -0.000577f, -0.009330f, 0.010984f, 0.007395f, 0.005305f, 0.001905f, -0.003562f, -0.001580f, 0.004679f, -0.002822f, 0.001426f, 0.000530f, 0.000330f, -0.000813f, -0.002734f, -0.007743f, -0.010960f, -0.000232f, 0.002290f, 0.001724f, 0.007665f, 0.000941f, -0.001047f, -0.005079f, 0.011303f, 0.006971f, 0.000269f, -0.001474f, 0.011222f, 0.003779f, -0.003726f, -0.009996f, 0.006230f, -0.002921f, 0.004811f, + -0.009510f, 0.000495f, -0.002313f, -0.007142f, -0.001953f, -0.003655f, -0.001352f, 0.000415f, 0.000006f, -0.005247f, -0.003181f, -0.000942f, -0.001018f, -0.003316f, 0.003385f, -0.000461f, -0.003430f, 0.005937f, -0.010120f, -0.004933f, 0.004814f, -0.006210f, 0.000832f, -0.003913f, -0.005544f, 0.003622f, 0.003435f, -0.003131f, 0.003812f, 0.007151f, 0.004143f, -0.003956f, -0.004401f, 0.000629f, 0.001484f, -0.004647f, 0.004902f, 0.007879f, -0.006805f, -0.002391f, 0.004056f, 0.002765f, -0.001532f, -0.002323f, -0.003230f, 0.004208f, 0.001509f, -0.005584f, 0.006251f, 0.002657f, -0.004728f, -0.004071f, 0.006694f, -0.005227f, -0.005676f, -0.012158f, -0.009275f, 0.004257f, 0.014873f, -0.001041f, -0.002566f, -0.005595f, 0.009663f, -0.004604f, -0.000148f, -0.007212f, -0.007667f, -0.009799f, -0.004371f, 0.008268f, -0.007819f, -0.002754f, -0.002481f, 0.003068f, -0.001627f, -0.010975f, 0.006310f, 0.003132f, 0.022378f, -0.001940f, 0.010714f, -0.001751f, -0.000082f, -0.000701f, 0.001606f, -0.004338f, 0.008981f, -0.001947f, -0.001214f, -0.004848f, -0.000427f, -0.001557f, 0.013694f, 0.002717f, -0.000789f, -0.012071f, + -0.000700f, -0.002108f, 0.004303f, -0.007580f, -0.001571f, 0.002382f, 0.002392f, -0.001913f, -0.000677f, -0.004620f, -0.001161f, -0.005607f, -0.001933f, 0.011615f, -0.002610f, 0.003843f, 0.007119f, -0.001295f, -0.005366f, -0.007870f, 0.002966f, 0.002138f, 0.003362f, 0.005272f, 0.006950f, 0.005147f, 0.003894f, -0.002031f, -0.001047f, -0.002393f, -0.010169f, -0.002529f, 0.000223f, 0.005707f, 0.006283f, -0.002700f, 0.001562f, -0.019505f, -0.004962f, -0.000661f, -0.004377f, -0.003134f, 0.006472f, -0.013797f, -0.011580f, -0.006922f, -0.004675f, 0.001625f, 0.014933f, -0.003598f, -0.000278f, 0.001521f, -0.011126f, -0.003157f, -0.009325f, -0.001719f, 0.015855f, -0.001556f, -0.008045f, -0.005405f, -0.000011f, 0.002963f, 0.003016f, -0.004833f, -0.020570f, -0.010073f, -0.002916f, -0.008186f, 0.000544f, 0.000047f, 0.008081f, -0.005648f, 0.007169f, 0.001467f, -0.003920f, -0.011233f, -0.009274f, 0.012313f, -0.010565f, 0.006622f, 0.001921f, -0.007012f, -0.002604f, -0.006293f, -0.004369f, 0.005638f, -0.011275f, 0.005493f, 0.001931f, -0.000482f, 0.001860f, 0.000490f, -0.001115f, -0.000039f, -0.005655f, -0.008077f, + 0.000616f, -0.002649f, -0.005666f, -0.002590f, -0.008774f, 0.010094f, 0.007253f, 0.001550f, 0.008689f, 0.000782f, -0.003322f, 0.010309f, -0.005186f, -0.003663f, -0.003086f, 0.007851f, -0.007072f, -0.012786f, 0.015983f, 0.018140f, 0.005052f, 0.005008f, -0.005032f, 0.008571f, 0.004310f, -0.010312f, 0.003387f, 0.006981f, -0.012474f, -0.010740f, 0.011106f, -0.009368f, -0.001327f, -0.005939f, 0.011173f, 0.002699f, -0.001223f, -0.003804f, -0.000043f, -0.006903f, 0.006722f, -0.003280f, 0.004074f, -0.001402f, -0.000045f, 0.007580f, 0.002847f, 0.001383f, -0.002806f, 0.007467f, 0.004486f, 0.002509f, -0.000632f, 0.007746f, -0.000604f, 0.001776f, -0.004666f, 0.009389f, 0.001958f, 0.004038f, 0.006481f, -0.017449f, -0.005897f, -0.003020f, -0.006502f, -0.005706f, 0.001737f, 0.010580f, -0.004416f, -0.002078f, -0.005585f, -0.001831f, 0.002053f, 0.005059f, -0.012470f, -0.000055f, 0.004188f, 0.001228f, -0.001115f, 0.006133f, 0.003352f, -0.010767f, -0.003393f, -0.001656f, 0.007004f, -0.006694f, 0.009952f, 0.011943f, 0.005555f, 0.003338f, -0.005291f, 0.000922f, 0.000697f, 0.019275f, -0.004332f, -0.000919f, + 0.006634f, 0.004074f, 0.002886f, 0.006081f, 0.017044f, -0.005567f, -0.002263f, -0.017672f, -0.000304f, -0.015275f, -0.019216f, 0.000027f, 0.007269f, -0.024623f, 0.007496f, 0.007210f, 0.003653f, -0.007921f, -0.006410f, -0.008583f, -0.003669f, -0.000178f, -0.000152f, 0.006987f, 0.009415f, -0.002023f, -0.010585f, -0.006664f, 0.006789f, -0.011307f, -0.005980f, -0.009659f, 0.001263f, -0.015213f, 0.006569f, 0.000498f, -0.001680f, 0.001685f, -0.001172f, -0.003991f, -0.000699f, 0.008713f, -0.011543f, 0.012441f, -0.010686f, -0.001830f, 0.001671f, -0.007276f, -0.006156f, 0.004450f, 0.001749f, -0.002774f, -0.005857f, 0.009091f, 0.003261f, -0.007514f, -0.014504f, 0.000880f, 0.002286f, 0.007282f, -0.001245f, -0.004257f, -0.000269f, 0.003500f, -0.004269f, 0.018246f, -0.007451f, -0.003866f, -0.014748f, -0.009803f, 0.020086f, 0.007774f, -0.006352f, -0.002531f, -0.002167f, 0.004762f, 0.012122f, -0.017853f, -0.010801f, 0.011234f, -0.009646f, -0.010307f, -0.011152f, -0.013303f, 0.008366f, -0.003941f, -0.001009f, -0.003667f, -0.000150f, -0.014744f, -0.003393f, 0.005584f, 0.006388f, 0.000777f, -0.007945f, -0.011527f, + -0.009448f, -0.012126f, 0.001746f, 0.012643f, 0.001288f, 0.003518f, 0.004110f, 0.003646f, -0.008413f, 0.007448f, 0.004698f, -0.006798f, -0.005223f, -0.019166f, 0.002388f, 0.003205f, -0.014771f, -0.002025f, 0.004042f, -0.003588f, 0.001426f, -0.002192f, -0.015737f, 0.012212f, -0.014651f, 0.010392f, 0.000353f, 0.004788f, -0.016384f, -0.009948f, -0.014654f, -0.012316f, 0.001972f, -0.004971f, -0.005230f, -0.007328f, -0.000080f, 0.006315f, -0.013365f, -0.001104f, 0.003983f, -0.005184f, -0.014758f, -0.010184f, -0.002860f, 0.002018f, 0.007620f, 0.002409f, -0.011796f, 0.012481f, -0.003577f, -0.003327f, 0.013860f, -0.017071f, -0.004921f, 0.027334f, -0.022642f, -0.011459f, -0.014806f, 0.012307f, 0.005122f, -0.007005f, 0.006153f, 0.000907f, 0.016522f, 0.002050f, 0.000946f, -0.014068f, 0.011470f, 0.018473f, 0.018947f, 0.016288f, -0.007711f, -0.000105f, 0.003046f, -0.008452f, -0.005930f, 0.003804f, 0.001774f, -0.012642f, -0.006176f, -0.004534f, 0.007457f, 0.000331f, -0.009906f, -0.003414f, 0.004078f, 0.009860f, 0.001637f, -0.001389f, 0.000724f, -0.005818f, 0.000372f, 0.001184f, 0.001711f, -0.014243f, + 0.009877f, 0.012751f, 0.002822f, 0.007503f, 0.007093f, -0.010993f, 0.019031f, 0.018649f, 0.003635f, -0.009402f, 0.007166f, -0.001874f, -0.016506f, -0.002037f, -0.004807f, 0.002170f, 0.001647f, 0.002248f, -0.009705f, -0.006488f, -0.020583f, -0.014784f, 0.000924f, 0.013844f, -0.009004f, 0.007890f, 0.002161f, -0.002888f, -0.016450f, 0.002354f, 0.011056f, -0.002114f, 0.010147f, 0.023231f, 0.006661f, -0.000519f, -0.024362f, 0.003474f, -0.008597f, -0.032893f, -0.025141f, 0.007313f, 0.001030f, -0.004977f, 0.006794f, 0.017062f, -0.001797f, 0.010572f, 0.009389f, 0.005869f, -0.001809f, -0.007901f, 0.007941f, -0.006589f, 0.001678f, -0.005521f, 0.010909f, 0.019455f, -0.015906f, -0.003881f, 0.001809f, 0.007678f, 0.002575f, -0.004243f, -0.002256f, -0.005246f, 0.000297f, -0.006707f, 0.010585f, 0.003159f, -0.010944f, 0.014072f, -0.012294f, -0.003144f, 0.016812f, 0.015180f, 0.012708f, -0.012519f, -0.008125f, -0.011079f, 0.014937f, 0.020282f, 0.000533f, -0.002809f, 0.016018f, -0.021189f, 0.003589f, 0.007217f, -0.001314f, -0.017547f, 0.017776f, 0.007222f, 0.009469f, 0.017217f, 0.001731f, -0.021302f, + 0.006857f, 0.010750f, -0.004891f, -0.000194f, 0.016570f, -0.014649f, -0.014266f, -0.011497f, 0.002549f, 0.021869f, 0.011862f, -0.001117f, 0.024028f, -0.028858f, -0.010454f, 0.002102f, 0.015117f, -0.026599f, 0.027913f, 0.011639f, -0.000149f, -0.002289f, 0.002829f, 0.005197f, 0.015373f, -0.002334f, 0.002172f, -0.004274f, -0.002891f, 0.008841f, 0.004856f, 0.010180f, 0.004822f, 0.006063f, -0.017972f, -0.007236f, 0.031616f, 0.003575f, 0.009782f, 0.013472f, 0.005450f, -0.010126f, -0.018986f, 0.006474f, -0.007603f, 0.001114f, 0.007417f, -0.009359f, -0.010891f, 0.014281f, 0.016893f, -0.008187f, -0.005516f, 0.012981f, -0.015031f, 0.007112f, -0.011451f, 0.005669f, -0.011071f, 0.017083f, 0.002860f, -0.001997f, 0.006428f, 0.029121f, 0.008474f, 0.011382f, -0.002776f, 0.001623f, 0.005406f, 0.021473f, -0.001386f, 0.030690f, 0.001361f, 0.014589f, -0.000091f, 0.027634f, 0.010202f, 0.020579f, 0.016056f, -0.003569f, -0.008847f, -0.002647f, -0.010171f, -0.011878f, 0.016585f, -0.003590f, -0.005925f, 0.002073f, 0.000692f, -0.008910f, -0.003451f, 0.001548f, 0.008148f, -0.000030f, 0.030956f, -0.009141f, + -0.001132f, -0.039939f, -0.002275f, 0.020188f, -0.011871f, 0.017471f, -0.025855f, 0.002926f, 0.001533f, -0.001386f, -0.034038f, -0.002127f, -0.056079f, 0.001987f, -0.007132f, -0.023638f, -0.005114f, 0.002535f, -0.013206f, 0.001570f, 0.012758f, 0.001645f, -0.013794f, 0.001876f, -0.005129f, 0.011774f, -0.014812f, 0.000386f, 0.016354f, 0.003609f, 0.000124f, -0.002968f, 0.012152f, -0.009008f, 0.000001f, -0.000315f, 0.008923f, 0.001786f, -0.020085f, -0.010076f, -0.014658f, 0.015224f, -0.036403f, 0.016752f, 0.012194f, 0.011855f, 0.004933f, 0.002604f, -0.017005f, 0.010919f, -0.024395f, -0.005218f, -0.006648f, -0.004489f, -0.002980f, 0.001692f, 0.005181f, -0.017008f, -0.008970f, 0.029703f, 0.010010f, -0.010134f, -0.014775f, 0.003845f, -0.007649f, 0.009732f, -0.008588f, -0.000804f, -0.012272f, 0.027805f, 0.010537f, -0.007419f, -0.001523f, -0.010916f, -0.000305f, 0.020586f, 0.020777f, 0.012267f, 0.010945f, -0.009452f, 0.012113f, 0.020063f, -0.014211f, -0.000030f, -0.037447f, 0.022147f, 0.015066f, -0.004856f, 0.009026f, -0.001889f, 0.003274f, 0.014031f, -0.008225f, 0.021650f, -0.018795f, 0.002425f, + 0.023917f, 0.011002f, 0.001621f, 0.018941f, -0.006344f, 0.009055f, 0.004938f, 0.010470f, 0.016296f, -0.008909f, -0.001889f, 0.030594f, 0.014976f, 0.000049f, 0.004122f, -0.019544f, 0.027483f, -0.022438f, -0.001533f, 0.024850f, 0.007374f, 0.026712f, -0.016429f, 0.004941f, -0.001236f, -0.005555f, 0.003258f, -0.024254f, -0.017848f, 0.024452f, -0.012079f, -0.004218f, -0.008350f, -0.025796f, 0.018519f, -0.005408f, -0.004880f, -0.010915f, 0.011121f, 0.027999f, -0.021940f, -0.003411f, 0.017605f, -0.019096f, -0.009483f, 0.017309f, 0.021949f, -0.036599f, -0.010949f, -0.002139f, 0.015040f, 0.000613f, 0.017619f, -0.003173f, 0.019230f, 0.041291f, 0.007582f, -0.025090f, -0.009298f, 0.007795f, -0.055267f, 0.001352f, -0.000214f, -0.008924f, -0.003257f, 0.024956f, -0.041906f, 0.008778f, 0.018699f, -0.015479f, 0.016480f, 0.031669f, 0.007258f, -0.029742f, 0.007306f, -0.007642f, -0.001240f, -0.029110f, -0.009465f, 0.026221f, -0.003717f, 0.024056f, -0.007145f, -0.008586f, 0.003155f, -0.020549f, -0.012340f, -0.014785f, -0.011787f, -0.008071f, 0.018854f, -0.021794f, 0.002631f, 0.038152f, 0.024779f, 0.008677f, + -0.039712f, 0.006560f, 0.024403f, 0.010798f, 0.000464f, -0.013610f, -0.017905f, -0.041101f, -0.029694f, 0.006208f, -0.015306f, -0.013781f, -0.002031f, 0.018084f, 0.011247f, -0.011949f, -0.000779f, 0.025696f, -0.011059f, -0.003610f, -0.000305f, 0.033793f, -0.000261f, -0.000800f, 0.015213f, 0.006268f, -0.039287f, 0.011728f, 0.009146f, 0.001213f, -0.032931f, 0.014820f, 0.016602f, -0.011737f, -0.010055f, -0.012003f, 0.043414f, 0.002692f, -0.008417f, -0.000256f, 0.019325f, -0.008838f, 0.005505f, -0.004275f, 0.004736f, 0.016719f, -0.029582f, 0.031862f, 0.035848f, 0.010430f, 0.015265f, -0.011676f, 0.020373f, 0.047358f, 0.001661f, -0.004956f, -0.008534f, 0.020411f, -0.006993f, -0.010928f, -0.003899f, 0.007522f, -0.023346f, 0.010842f, -0.020592f, 0.023998f, 0.005326f, 0.024163f, -0.014953f, 0.022060f, 0.006336f, 0.028736f, 0.004544f, 0.006388f, -0.010322f, 0.018046f, 0.004176f, -0.005179f, 0.025132f, -0.009507f, -0.018469f, 0.036353f, 0.028272f, 0.010969f, 0.026629f, 0.039702f, 0.047128f, -0.014510f, -0.015605f, -0.016538f, 0.005217f, -0.021647f, 0.024989f, -0.002980f, -0.003336f, -0.036505f, + 0.007406f, 0.041724f, 0.041108f, -0.001598f, -0.007013f, -0.029129f, -0.001225f, 0.027480f, -0.016058f, -0.017501f, 0.013339f, 0.002029f, -0.017783f, 0.004708f, -0.005674f, -0.058374f, -0.041344f, 0.018804f, 0.006179f, -0.031559f, 0.001202f, 0.011100f, -0.028819f, -0.018988f, -0.013452f, 0.030141f, 0.012627f, 0.008231f, -0.012004f, -0.009939f, -0.009884f, -0.022143f, -0.028468f, -0.049216f, 0.022823f, 0.018863f, -0.011677f, 0.051008f, 0.023888f, 0.048868f, 0.033404f, 0.001055f, -0.017966f, 0.011298f, 0.004684f, 0.020966f, 0.025114f, 0.027204f, -0.005781f, -0.007488f, 0.011047f, -0.015655f, -0.004583f, -0.014098f, -0.023521f, -0.038613f, -0.012015f, 0.034502f, -0.010570f, -0.017158f, -0.022293f, 0.012234f, 0.020964f, 0.012402f, 0.000112f, 0.019255f, 0.041059f, -0.027799f, -0.012844f, -0.021995f, -0.015406f, -0.043393f, -0.011251f, 0.007772f, -0.019824f, -0.017106f, -0.048255f, -0.069552f, 0.006153f, -0.046688f, -0.070627f, -0.052779f, -0.022299f, 0.042490f, 0.014393f, 0.025053f, 0.019410f, -0.048541f, -0.020766f, 0.002033f, 0.021873f, 0.004530f, -0.109491f, -0.018862f, 0.032401f, -0.038530f, + 0.012848f, -0.016176f, -0.060474f, -0.020047f, 0.060151f, 0.076727f, -0.044013f, -0.000360f, -0.016709f, -0.065902f, -0.053442f, -0.050002f, -0.053923f, -0.029248f, -0.036104f, -0.004459f, 0.008478f, -0.010613f, 0.010553f, 0.010491f, -0.023712f, -0.007355f, -0.031614f, 0.010596f, -0.048287f, -0.042548f, 0.007039f, 0.005591f, -0.015277f, -0.016497f, 0.032795f, -0.011944f, 0.046616f, 0.009579f, 0.042924f, -0.032490f, 0.016891f, 0.011673f, 0.052495f, 0.028477f, 0.016240f, 0.004064f, 0.005057f, -0.007832f, 0.012906f, 0.021750f, -0.021572f, -0.026307f, 0.035340f, -0.006531f, -0.052688f, -0.094990f, -0.116786f, -0.082498f, 0.009512f, -0.001200f, -0.109255f, 0.033117f, 0.013658f, 0.025292f, -0.040210f, 0.003522f, 0.007924f, 0.003646f, 0.049471f, 0.053911f, 0.105530f, 0.035406f, -0.062353f, -0.076295f, -0.047711f, -0.020250f, -0.009923f, 0.059170f, -0.017328f, -0.114839f, -0.033778f, 0.092734f, -0.014265f, 0.019978f, 0.012032f, 0.016626f, 0.031463f, 0.026054f, 0.007988f, -0.019337f, -0.008320f, 0.003940f, -0.021718f, -0.005376f, 0.032935f, -0.031417f, -0.019865f, -0.031436f, -0.008945f, 0.004830f, + 0.002392f, 0.007759f, 0.014504f, -0.023855f, 0.019327f, 0.051013f, -0.002557f, -0.030170f, 0.001089f, -0.019748f, -0.008414f, 0.030351f, -0.033773f, 0.003627f, 0.008473f, 0.037290f, 0.052226f, -0.034121f, -0.021234f, 0.021124f, 0.001213f, 0.006228f, 0.004607f, -0.022307f, -0.059707f, -0.009849f, -0.028628f, 0.053484f, -0.101901f, -0.065231f, -0.028649f, -0.010067f, 0.027590f, 0.007074f, -0.036723f, -0.004831f, -0.041965f, -0.042795f, -0.016733f, -0.030422f, 0.005141f, 0.027800f, 0.120371f, 0.024188f, -0.017623f, -0.075598f, -0.062567f, 0.021117f, 0.000968f, -0.070820f, 0.045835f, 0.037325f, -0.043088f, -0.138309f, 0.016031f, 0.017539f, -0.007655f, -0.005647f, -0.013531f, -0.042391f, 0.012164f, -0.012171f, 0.065802f, -0.074735f, -0.017499f, 0.068760f, -0.006303f, -0.052901f, -0.008948f, 0.038848f, 0.049170f, 0.027924f, -0.012193f, 0.033104f, -0.030971f, 0.020916f, -0.014211f, -0.014004f, -0.027104f, 0.036344f, 0.025073f, -0.031250f, -0.014941f, -0.008625f, 0.038762f, -0.008782f, 0.001780f, -0.031615f, 0.025313f, 0.012946f, -0.033242f, 0.050300f, -0.000059f, -0.055564f, 0.041674f, -0.060079f, + -0.031187f, 0.043580f, -0.108148f, -0.073498f, 0.054975f, -0.042902f, 0.040130f, -0.073679f, 0.012488f, 0.017570f, -0.039277f, -0.005951f, -0.005351f, -0.076905f, -0.018502f, 0.063165f, 0.072889f, -0.094537f, -0.030974f, 0.016711f, -0.071311f, 0.078484f, 0.086258f, 0.001392f, -0.130021f, -0.079555f, 0.132326f, -0.086299f, -0.017642f, 0.091611f, -0.068656f, -0.156088f, -0.036780f, -0.019201f, -0.074203f, -0.069949f, -0.001737f, -0.088249f, -0.026048f, -0.037481f, -0.035393f, -0.026586f, 0.057451f, -0.006159f, -0.018341f, -0.024050f, 0.011252f, -0.030774f, -0.073627f, 0.057329f, 0.017973f, 0.049615f, 0.015453f, 0.051356f, -0.020265f, -0.031037f, 0.011308f, -0.052780f, 0.041412f, -0.047690f, -0.010206f, 0.032470f, -0.036619f, -0.007006f, -0.022226f, -0.057648f, 0.008840f, -0.043252f, -0.031802f, -0.037544f, -0.028468f, -0.016549f, -0.039099f, 0.008065f, 0.043586f, -0.028149f, -0.010298f, 0.006724f, 0.040269f, -0.016779f, 0.014470f, -0.039478f, 0.067051f, 0.022578f, 0.029044f, 0.020120f, 0.064518f, -0.001763f, -0.074502f, 0.018739f, 0.028137f, -0.018571f, 0.000784f, 0.042091f, -0.051027f, -0.049142f, + -0.059118f, 0.055373f, 0.017506f, -0.071421f, 0.031597f, -0.045712f, -0.006374f, -0.065686f, 0.035205f, 0.054073f, 0.016468f, -0.071542f, 0.053059f, 0.066085f, 0.123797f, -0.029301f, 0.061567f, 0.012325f, -0.028810f, -0.054739f, -0.031818f, 0.072226f, -0.023206f, 0.013779f, 0.028171f, -0.006800f, 0.066472f, -0.009274f, 0.052217f, 0.054750f, -0.066354f, 0.034813f, -0.017189f, 0.002101f, 0.024684f, 0.020766f, -0.002037f, 0.011317f, 0.020004f, 0.066944f, 0.068542f, 0.053210f, -0.038385f, -0.012671f, -0.090639f, -0.002252f, 0.021636f, 0.041476f, 0.009632f, -0.074681f, 0.033092f, -0.044653f, 0.058472f, -0.052227f, -0.036675f, 0.004216f, -0.043917f, -0.007180f, -0.025289f, 0.090099f, -0.048895f, -0.023727f, -0.093906f, -0.030375f, -0.049210f, 0.132981f, 0.080950f, -0.027940f, -0.089269f, -0.096019f, -0.056770f, 0.065850f, 0.086513f, 0.043288f, 0.013052f, -0.115831f, -0.053064f, 0.036788f, 0.032779f, 0.003458f, 0.042190f, -0.026155f, -0.075193f, 0.032520f, -0.128001f, 0.134704f, -0.012828f, -0.098942f, 0.208685f, 0.013875f, 0.005205f, -0.053976f, 0.037667f, -0.076521f, 0.048457f, -0.031023f, + 0.079086f, -0.034592f, -0.003071f, 0.045548f, 0.008503f, 0.004796f, -0.019708f, -0.016609f, 0.002538f, -0.029112f, 0.033584f, -0.002876f, 0.035606f, -0.026549f, -0.026773f, 0.010318f, 0.001768f, -0.026848f, 0.017971f, -0.002371f, 0.015697f, -0.007381f, -0.007271f, 0.015948f, -0.013772f, 0.000166f, 0.011172f, -0.004332f, -0.006517f, 0.057116f, -0.003691f, -0.017149f, -0.009884f, 0.028015f, -0.002374f, -0.028679f, 0.016090f, 0.034327f, 0.006516f, 0.002620f, -0.019424f, 0.008798f, -0.015831f, 0.017011f, 0.039298f, -0.011846f, 0.017711f, -0.012558f, -0.004956f, -0.013799f, -0.008375f, 0.013211f, 0.012003f, -0.020115f, 0.012943f, 0.007468f, -0.004191f, -0.019430f, 0.002404f, 0.012587f, -0.019130f, 0.029647f, 0.018308f, -0.036205f, 0.007317f, -0.031655f, -0.048178f, 0.038304f, -0.022002f, 0.046766f, -0.044322f, 0.097181f, 0.019249f, 0.024758f, -0.011096f, 0.009962f, -0.001693f, 0.019385f, 0.006828f, 0.042132f, 0.003892f, -0.020985f, 0.014544f, -0.013256f, 0.007366f, 0.009631f, -0.017737f, 0.002260f, 0.005571f, -0.019023f, 0.019541f, 0.006047f, -0.007313f, 0.026210f, -0.007889f, 0.011170f, + -0.006614f, 0.005986f, 0.005741f, 0.003643f, -0.002146f, -0.005975f, -0.002423f, 0.004892f, 0.001583f, -0.002719f, -0.011151f, 0.010493f, -0.007184f, 0.005989f, 0.008891f, -0.006779f, 0.002690f, -0.006204f, 0.003140f, -0.010709f, -0.018990f, 0.022149f, -0.010139f, -0.003689f, 0.009608f, 0.005688f, -0.002634f, 0.004059f, 0.018527f, -0.017705f, 0.009274f, -0.005512f, 0.016132f, -0.014473f, 0.010123f, 0.006565f, -0.002103f, 0.005654f, 0.001139f, 0.002412f, 0.008201f, -0.008006f, 0.006489f, 0.007690f, -0.002229f, 0.001863f, 0.013832f, 0.001360f, 0.004820f, -0.010909f, 0.020685f, 0.017873f, -0.085595f, -0.212125f, 0.045502f, 0.175809f, 0.118833f, 0.248087f, -0.081468f, -0.069826f, -0.143128f, -0.228827f, -0.022754f, 0.070799f, 0.093704f, 0.122075f, 0.061622f, 0.006333f, -0.020142f, -0.053424f, -0.075636f, -0.011924f, -0.020252f, 0.006941f, 0.017288f, -0.001416f, 0.004327f, 0.008598f, 0.004045f, 0.029361f, 0.035538f, 0.021502f, -0.004034f, 0.003510f, -0.026224f, -0.055773f, -0.058691f, -0.029459f, -0.038438f, 0.031095f, 0.058666f, 0.061437f, 0.068366f, 0.036676f, -0.010827f, -0.027650f, + -0.049887f, -0.053692f, -0.036524f, -0.021466f, -0.002075f, 0.012587f, 0.026060f, 0.026799f, 0.023611f, 0.019181f, -0.002994f, 0.004533f, -0.005422f, 0.001791f, -0.003887f, -0.003614f, -0.000955f, -0.019662f, -0.018946f, -0.015143f, -0.028809f, -0.000842f, -0.004575f, 0.002887f, 0.051688f, 0.065685f, 0.024037f, 0.021911f, -0.015979f, -0.036729f, -0.021507f, -0.042052f, -0.020942f, 0.004099f, -0.000533f}, + {0.011661f, 0.000092f, 0.015194f, 0.000707f, -0.004832f, -0.001199f, 0.000104f, 0.001400f, 0.007083f, -0.002935f, 0.003623f, -0.007161f, 0.002410f, -0.000752f, 0.004930f, -0.003340f, 0.007122f, 0.001822f, -0.003633f, 0.000512f, -0.007243f, 0.008074f, -0.000753f, -0.001652f, -0.000004f, 0.001191f, 0.001695f, 0.001232f, 0.005961f, -0.010484f, 0.000784f, 0.006613f, 0.001309f, -0.000521f, -0.001165f, -0.000606f, -0.000243f, -0.000867f, -0.010733f, -0.000891f, 0.003172f, -0.003730f, 0.003613f, -0.008412f, 0.000042f, 0.004716f, -0.004945f, 0.009471f, 0.009166f, 0.006836f, 0.005827f, 0.007501f, 0.000927f, 0.003767f, -0.003558f, -0.001509f, -0.006177f, -0.002477f, -0.000342f, -0.005389f, -0.001810f, -0.007661f, 0.001078f, -0.006495f, -0.008498f, 0.001611f, -0.006217f, 0.004699f, 0.000685f, -0.006917f, 0.004759f, 0.003021f, -0.007686f, 0.002296f, 0.000166f, 0.008992f, 0.002643f, -0.011910f, 0.001583f, 0.003866f, 0.003755f, 0.018907f, 0.005193f, 0.004038f, -0.005508f, 0.000777f, -0.009480f, 0.002296f, 0.008860f, -0.004402f, 0.000504f, -0.001804f, -0.004616f, -0.007528f, 0.005941f, -0.012627f, + -0.006300f, -0.006317f, 0.006971f, 0.007569f, 0.004071f, 0.001841f, 0.005560f, 0.004539f, 0.009117f, -0.003094f, 0.003271f, 0.005635f, 0.001312f, 0.001877f, -0.006438f, -0.002800f, -0.002611f, -0.002444f, 0.006229f, -0.011629f, 0.002098f, -0.004014f, 0.012371f, 0.000315f, -0.002036f, -0.003043f, -0.004863f, -0.001659f, -0.005074f, -0.015357f, -0.004674f, -0.002998f, -0.002281f, -0.003439f, 0.001805f, -0.002876f, -0.000496f, -0.000991f, 0.005626f, 0.002401f, -0.000436f, 0.003424f, -0.002733f, 0.006575f, -0.004024f, -0.007195f, 0.007240f, 0.007190f, -0.002774f, -0.006960f, 0.001058f, 0.003635f, 0.003293f, 0.003068f, -0.002723f, -0.000316f, 0.003341f, 0.002768f, 0.017181f, -0.003063f, -0.001500f, 0.001956f, 0.004839f, -0.012442f, 0.007962f, -0.014793f, -0.000534f, -0.007100f, -0.000920f, -0.004655f, -0.000982f, -0.001046f, 0.007644f, -0.006204f, 0.008270f, -0.008352f, -0.009092f, 0.004030f, 0.012568f, -0.014519f, -0.003902f, -0.006968f, 0.000269f, -0.003575f, 0.004125f, 0.005352f, 0.002828f, 0.005448f, -0.008322f, 0.000411f, 0.012116f, 0.004786f, 0.001710f, -0.008564f, -0.012178f, -0.007351f, + 0.002101f, -0.006237f, -0.003365f, 0.002509f, 0.008252f, -0.007154f, -0.006910f, 0.002978f, -0.004984f, 0.009311f, 0.003333f, -0.000870f, 0.006760f, 0.006256f, 0.000256f, 0.010444f, 0.005408f, 0.003315f, 0.003040f, 0.006861f, 0.011013f, -0.006995f, 0.002373f, 0.002989f, -0.007181f, 0.000707f, 0.006487f, -0.002354f, 0.015863f, -0.004766f, -0.003666f, -0.003231f, 0.006183f, 0.007827f, -0.009492f, -0.004171f, 0.003329f, -0.021797f, -0.003438f, -0.004779f, -0.003794f, -0.001860f, -0.002569f, 0.011751f, 0.014042f, -0.003086f, 0.011479f, 0.004429f, -0.006170f, 0.003051f, -0.009408f, 0.001764f, 0.002129f, -0.012721f, -0.001781f, 0.002064f, 0.002351f, 0.008924f, -0.001592f, 0.007756f, -0.005043f, -0.009761f, -0.010258f, -0.002914f, -0.005139f, -0.007819f, 0.008246f, -0.003153f, -0.001472f, -0.001396f, 0.001799f, 0.004452f, -0.012466f, 0.000060f, 0.001841f, -0.005953f, 0.015051f, 0.001161f, -0.003616f, -0.003269f, 0.016050f, -0.001181f, 0.002089f, 0.009399f, 0.000328f, 0.005705f, 0.002284f, 0.000442f, 0.008838f, -0.000166f, -0.006171f, 0.007774f, 0.004226f, 0.004913f, 0.007128f, 0.002164f, + -0.005907f, 0.003898f, 0.005767f, 0.005416f, 0.008663f, -0.000311f, -0.008417f, -0.006982f, 0.010041f, 0.013878f, -0.013593f, 0.001967f, -0.004078f, -0.003192f, 0.002175f, 0.004309f, 0.003963f, -0.016194f, 0.017125f, 0.015849f, 0.011947f, -0.008454f, 0.009332f, 0.016859f, -0.004310f, 0.013149f, 0.004942f, 0.001891f, -0.002100f, 0.014494f, 0.006868f, -0.003531f, -0.010501f, 0.005953f, -0.004365f, -0.005728f, 0.005893f, 0.006849f, 0.003046f, -0.010542f, 0.001672f, 0.009179f, -0.004566f, 0.003000f, -0.020457f, 0.002770f, -0.001652f, 0.009665f, 0.002406f, -0.004441f, -0.006167f, 0.012397f, -0.010853f, 0.000654f, -0.008763f, 0.000785f, -0.002681f, 0.006787f, -0.001462f, -0.002569f, -0.010734f, -0.002869f, -0.001886f, 0.013025f, 0.000674f, -0.012537f, -0.000441f, -0.001036f, 0.004181f, 0.005988f, -0.005418f, -0.000398f, -0.006917f, 0.006936f, -0.001612f, 0.008436f, -0.004813f, 0.012755f, 0.006616f, -0.015294f, 0.015567f, -0.002926f, -0.010746f, 0.001057f, 0.014224f, 0.001997f, 0.002194f, -0.012558f, -0.000742f, -0.005765f, -0.006193f, -0.007773f, 0.000617f, 0.018357f, -0.006597f, -0.013650f, + -0.000907f, -0.020368f, -0.000230f, -0.017534f, -0.006231f, 0.011693f, -0.012566f, -0.013853f, 0.003874f, 0.000912f, 0.001010f, -0.003419f, -0.004682f, -0.010097f, 0.006464f, -0.019545f, -0.006159f, 0.001723f, 0.011751f, 0.000465f, 0.011922f, 0.004075f, 0.026461f, 0.009975f, -0.000515f, 0.000919f, 0.012472f, -0.003299f, -0.004052f, -0.002658f, 0.001853f, -0.008690f, -0.004442f, -0.014470f, -0.001265f, -0.006811f, -0.004190f, 0.017166f, -0.000013f, 0.010614f, -0.004691f, 0.004129f, -0.001432f, 0.006179f, -0.002530f, 0.005714f, -0.006374f, -0.007808f, -0.001595f, 0.001709f, -0.007933f, -0.007918f, 0.000196f, 0.003420f, 0.007609f, -0.001638f, -0.004361f, -0.002156f, 0.007074f, 0.012593f, 0.000011f, -0.009536f, -0.013614f, -0.000467f, 0.002560f, 0.000612f, 0.016320f, -0.011783f, -0.002018f, 0.006826f, -0.004774f, -0.010426f, 0.009467f, 0.003712f, 0.002208f, 0.001174f, 0.016612f, -0.012717f, -0.002580f, 0.001084f, -0.000978f, -0.000442f, -0.010478f, -0.008040f, -0.001124f, 0.007001f, 0.002540f, 0.002840f, 0.002940f, 0.007367f, -0.001492f, 0.006749f, 0.005435f, -0.017195f, -0.006618f, -0.020183f, + 0.005270f, -0.007053f, 0.010211f, -0.006474f, -0.008926f, -0.006459f, 0.005320f, -0.013388f, -0.011199f, 0.015813f, -0.008540f, 0.017147f, -0.003990f, 0.005270f, -0.005954f, -0.011287f, 0.012664f, -0.009530f, -0.010864f, -0.000886f, -0.005881f, -0.012590f, -0.009812f, -0.015910f, 0.000737f, 0.010674f, 0.006060f, -0.005968f, 0.018043f, 0.006934f, -0.006501f, -0.007951f, -0.012882f, 0.001007f, -0.004745f, -0.008592f, -0.004445f, -0.003292f, -0.006246f, 0.004064f, 0.014540f, -0.000127f, 0.001140f, -0.008865f, 0.004796f, 0.005892f, -0.008208f, -0.005472f, 0.003737f, 0.019037f, 0.007327f, -0.002228f, -0.001820f, -0.000473f, -0.016830f, 0.024803f, -0.003550f, 0.000935f, -0.002957f, 0.016499f, 0.015655f, 0.006075f, -0.023575f, -0.003073f, -0.028841f, 0.018643f, 0.008374f, 0.001518f, 0.031669f, 0.015581f, -0.001786f, -0.012732f, 0.013583f, -0.004839f, 0.004048f, 0.005371f, 0.002896f, 0.011153f, -0.008064f, 0.018313f, 0.007438f, 0.002776f, -0.004340f, -0.007653f, 0.012551f, 0.010971f, -0.001037f, 0.007538f, -0.013811f, 0.003896f, -0.018737f, 0.009143f, 0.001940f, 0.011159f, -0.015252f, 0.004519f, + -0.004434f, 0.004749f, 0.019103f, 0.016710f, 0.001530f, 0.005707f, -0.010584f, 0.016180f, 0.001199f, 0.033054f, 0.034381f, -0.003199f, -0.008220f, -0.007880f, -0.006546f, -0.018198f, -0.004737f, -0.024147f, 0.002237f, -0.000805f, -0.000744f, -0.003854f, 0.009588f, 0.016399f, 0.024195f, 0.023277f, 0.017452f, -0.026404f, -0.019285f, 0.000469f, 0.001839f, 0.030394f, -0.020157f, 0.016708f, -0.000810f, -0.005936f, -0.008538f, 0.017214f, 0.003740f, -0.012512f, -0.006941f, 0.032277f, 0.031622f, 0.035580f, -0.003472f, -0.001304f, -0.006044f, 0.006171f, 0.017291f, 0.020168f, 0.005734f, -0.008305f, -0.017122f, -0.034393f, 0.010189f, -0.020209f, -0.004614f, -0.001763f, -0.004574f, 0.002696f, -0.001191f, -0.005982f, -0.000943f, -0.019693f, -0.008165f, 0.001643f, -0.003944f, -0.022003f, -0.009724f, 0.002415f, 0.016052f, -0.004093f, 0.000173f, -0.017336f, -0.006358f, 0.000798f, 0.011494f, -0.006645f, 0.006901f, -0.019346f, -0.005980f, 0.005332f, 0.007140f, -0.004761f, 0.026366f, -0.004763f, -0.003924f, -0.013186f, -0.005173f, 0.011648f, 0.003072f, -0.000344f, 0.013348f, 0.020331f, 0.021913f, -0.003004f, + -0.012115f, -0.011803f, -0.000683f, 0.003791f, 0.004347f, -0.007932f, 0.006216f, 0.010912f, 0.006862f, 0.009300f, 0.021161f, 0.016815f, 0.008294f, 0.000566f, 0.002667f, -0.020236f, -0.007864f, -0.033920f, 0.039793f, -0.002226f, 0.004929f, 0.021276f, -0.000684f, -0.008915f, 0.000089f, -0.040951f, -0.025352f, -0.012481f, 0.005281f, -0.008935f, 0.003461f, -0.019731f, 0.011809f, -0.007602f, -0.001281f, 0.023511f, -0.025107f, -0.017060f, 0.021897f, -0.008320f, -0.034870f, 0.001281f, -0.021948f, 0.003179f, -0.002890f, 0.011508f, 0.004264f, 0.005233f, 0.001376f, -0.005222f, 0.013782f, -0.002832f, 0.018032f, 0.010603f, -0.008107f, -0.012747f, -0.012120f, 0.004041f, -0.006638f, 0.004055f, 0.002382f, 0.010099f, 0.001929f, -0.022556f, -0.000166f, 0.005943f, -0.008831f, -0.000416f, -0.016211f, -0.004615f, -0.000295f, -0.000432f, 0.032048f, -0.007325f, 0.022202f, 0.027181f, -0.009746f, 0.013798f, -0.006707f, -0.002465f, -0.018093f, 0.008419f, 0.022043f, 0.015220f, 0.001190f, 0.004730f, 0.012169f, -0.003153f, 0.009085f, -0.007561f, -0.011225f, -0.015164f, 0.000898f, 0.025919f, 0.038839f, 0.005336f, + 0.009440f, -0.009652f, -0.005011f, 0.026210f, -0.017865f, -0.004482f, -0.034855f, 0.031942f, 0.016653f, 0.001867f, -0.011997f, -0.033122f, 0.003067f, -0.009195f, 0.003776f, -0.037128f, 0.012845f, 0.018766f, -0.021458f, -0.005674f, 0.003002f, 0.001636f, 0.006910f, 0.020333f, 0.025660f, -0.000593f, -0.000198f, 0.004130f, 0.000854f, -0.016391f, -0.018018f, -0.012638f, -0.023696f, -0.012423f, 0.019998f, 0.008497f, -0.007607f, -0.010863f, -0.006670f, -0.042408f, 0.008933f, 0.008951f, -0.019474f, 0.030700f, 0.001079f, 0.022565f, -0.008588f, 0.014172f, -0.005124f, -0.021773f, 0.001803f, 0.017518f, -0.010456f, 0.008911f, 0.012072f, 0.032180f, 0.009299f, 0.008921f, 0.032293f, 0.016636f, 0.012195f, -0.046732f, 0.009205f, 0.004660f, 0.008614f, -0.001519f, -0.018333f, 0.029691f, -0.024170f, 0.015350f, 0.019321f, -0.032923f, -0.006360f, 0.035138f, -0.034535f, 0.001766f, 0.001288f, -0.021961f, -0.032400f, -0.015084f, -0.014332f, -0.043031f, 0.026949f, 0.003020f, 0.028864f, 0.000306f, 0.002985f, -0.015831f, -0.008851f, 0.013301f, -0.002462f, 0.013795f, -0.016467f, -0.006272f, 0.001385f, -0.008294f, + -0.013722f, 0.016702f, -0.019844f, 0.020167f, -0.008903f, 0.005563f, -0.006001f, -0.016179f, -0.014535f, 0.004813f, -0.006119f, -0.001679f, 0.009809f, 0.041771f, 0.001764f, -0.007088f, -0.015962f, 0.004662f, 0.033598f, -0.008011f, -0.007072f, -0.021950f, -0.008395f, 0.001303f, -0.020627f, -0.008680f, -0.028853f, 0.016001f, -0.035025f, -0.062508f, -0.007778f, 0.000218f, 0.027579f, -0.031789f, 0.026403f, 0.016326f, -0.015723f, -0.030208f, -0.006022f, 0.002741f, 0.006767f, -0.000964f, 0.016042f, -0.013834f, -0.006014f, -0.062189f, -0.009699f, 0.059684f, 0.004310f, -0.012853f, -0.010091f, -0.034751f, 0.022169f, -0.013150f, 0.031452f, 0.028376f, -0.005587f, -0.007903f, 0.000102f, -0.038701f, 0.029896f, -0.023509f, -0.018879f, -0.014091f, 0.012921f, 0.006782f, 0.027934f, 0.005684f, -0.011133f, -0.013580f, -0.014044f, 0.015611f, -0.003743f, -0.006384f, 0.025795f, 0.028381f, 0.011486f, -0.014759f, 0.024003f, 0.036909f, -0.010379f, -0.004898f, 0.032440f, 0.010258f, 0.008690f, -0.016732f, 0.002721f, 0.030878f, -0.038890f, 0.031340f, -0.003465f, 0.006564f, 0.019985f, 0.023450f, 0.002627f, 0.013089f, + -0.016809f, -0.013273f, 0.013609f, 0.042245f, 0.013415f, 0.012447f, 0.017793f, -0.017049f, 0.007045f, 0.020436f, 0.013006f, -0.000303f, 0.016981f, 0.011819f, -0.020787f, 0.022368f, -0.020186f, 0.008431f, 0.019743f, -0.014962f, 0.016813f, -0.018844f, -0.006082f, 0.007818f, 0.003582f, 0.018275f, -0.006499f, 0.016588f, -0.006893f, 0.006545f, 0.006680f, 0.001427f, -0.007939f, -0.010965f, 0.046151f, -0.027405f, 0.028623f, -0.010859f, -0.028579f, -0.037224f, -0.010385f, -0.004114f, 0.021680f, -0.032901f, -0.005181f, -0.004275f, 0.017189f, 0.031775f, 0.026906f, 0.016092f, 0.002770f, -0.008876f, -0.004699f, -0.003968f, 0.023069f, 0.017964f, -0.003977f, 0.002209f, -0.004464f, 0.013827f, -0.034742f, 0.020219f, 0.012242f, 0.015595f, 0.006309f, 0.002858f, 0.031218f, -0.012985f, -0.025018f, -0.000900f, -0.007555f, 0.000678f, -0.034856f, -0.021030f, -0.000945f, 0.028826f, -0.019012f, -0.007667f, 0.006334f, -0.002522f, 0.002395f, 0.028143f, 0.013544f, -0.006003f, 0.004415f, 0.012955f, 0.011516f, 0.032838f, -0.007945f, 0.014101f, 0.019872f, 0.007687f, -0.002952f, 0.003900f, -0.034530f, 0.014212f, + -0.003775f, -0.000144f, -0.004972f, -0.022492f, -0.023584f, 0.003704f, -0.008480f, -0.039535f, 0.014587f, -0.033819f, -0.016765f, -0.007178f, -0.039565f, -0.030176f, 0.019313f, -0.046909f, -0.052127f, 0.034110f, 0.030774f, 0.011679f, 0.033162f, 0.054434f, 0.016747f, -0.017951f, 0.018730f, -0.005898f, -0.013010f, 0.026062f, 0.003486f, -0.019351f, 0.014912f, 0.019401f, 0.005691f, 0.008245f, 0.002994f, 0.004867f, 0.049652f, 0.001200f, 0.011898f, 0.006740f, 0.031378f, 0.004055f, 0.049176f, 0.002111f, -0.019432f, 0.040461f, 0.009279f, -0.014432f, -0.004494f, 0.022621f, -0.002761f, 0.002145f, 0.017163f, -0.026411f, 0.030233f, -0.003506f, -0.041033f, -0.009198f, 0.005397f, -0.039596f, -0.003553f, -0.001636f, 0.019741f, 0.020843f, 0.032902f, -0.019383f, 0.005864f, 0.008099f, 0.007552f, 0.016743f, -0.019425f, -0.019586f, 0.012727f, 0.002837f, 0.024966f, 0.023350f, 0.006616f, 0.054588f, -0.008135f, -0.003808f, -0.034603f, 0.056163f, 0.009049f, 0.040679f, 0.021570f, -0.052649f, 0.007334f, 0.011241f, 0.033691f, -0.011649f, 0.011664f, 0.031213f, -0.068165f, 0.039278f, 0.040132f, -0.018239f, + 0.009109f, 0.004774f, 0.010503f, -0.000666f, 0.031981f, -0.024665f, -0.005532f, -0.026442f, -0.000578f, -0.015459f, 0.001976f, 0.005654f, -0.037272f, 0.015428f, 0.040025f, -0.028959f, -0.026656f, -0.028418f, 0.053476f, -0.024798f, -0.013157f, 0.003521f, -0.018296f, -0.057014f, 0.009875f, 0.038702f, -0.055127f, -0.026710f, 0.019370f, 0.027966f, 0.008387f, -0.010191f, 0.013216f, -0.021473f, -0.008710f, -0.002944f, 0.027964f, -0.039631f, -0.029271f, 0.019180f, 0.035160f, 0.011402f, -0.042132f, -0.016143f, 0.002034f, -0.004305f, -0.006388f, 0.020047f, -0.005457f, 0.031391f, -0.026223f, -0.008600f, 0.001463f, -0.034255f, 0.021703f, -0.039536f, -0.023385f, 0.008845f, -0.014309f, 0.032745f, 0.054078f, 0.027409f, -0.031432f, 0.014946f, -0.006871f, -0.013450f, -0.020356f, -0.010677f, -0.034678f, 0.027151f, 0.028345f, 0.011405f, 0.038166f, 0.064305f, -0.001492f, -0.050460f, 0.009448f, -0.060014f, 0.009074f, 0.025786f, 0.011558f, 0.002546f, 0.034430f, 0.025217f, -0.002638f, -0.006427f, -0.049837f, -0.027313f, -0.000343f, -0.023860f, 0.065001f, -0.013091f, -0.016064f, -0.029573f, 0.002466f, 0.023797f, + 0.016289f, -0.001972f, 0.011666f, 0.018279f, -0.030428f, 0.008934f, 0.055566f, 0.018961f, -0.040044f, -0.028566f, 0.017267f, -0.020401f, -0.003781f, 0.012624f, -0.009783f, -0.033331f, -0.008835f, 0.002645f, 0.052849f, -0.012986f, 0.010827f, -0.015713f, -0.044824f, 0.006247f, 0.053629f, -0.016192f, -0.034021f, 0.008055f, -0.021276f, 0.011816f, -0.012636f, -0.015066f, 0.036550f, -0.011435f, -0.005370f, 0.016492f, -0.033475f, 0.009628f, 0.038916f, -0.018774f, 0.002597f, -0.025883f, 0.069410f, -0.015580f, 0.007917f, 0.019504f, -0.016365f, -0.007721f, -0.018230f, 0.005137f, -0.019676f, -0.023517f, -0.018248f, -0.107338f, -0.037096f, -0.001183f, 0.035339f, -0.017358f, -0.053323f, -0.019617f, -0.007135f, 0.027271f, 0.007694f, -0.006466f, -0.025966f, 0.029019f, 0.050983f, -0.022034f, 0.038736f, 0.010261f, -0.071050f, 0.027540f, 0.034519f, -0.011105f, -0.028420f, -0.004751f, 0.045070f, 0.047972f, -0.003124f, -0.035121f, 0.003290f, -0.003388f, -0.003851f, -0.029167f, 0.008161f, 0.014311f, -0.046606f, 0.033381f, 0.028565f, -0.032748f, 0.006953f, -0.036833f, 0.014030f, 0.092268f, -0.081121f, 0.085342f, + 0.039056f, 0.004448f, 0.052529f, 0.026357f, -0.052289f, 0.032448f, -0.039160f, -0.008363f, 0.044210f, 0.002595f, 0.013125f, -0.021721f, -0.038185f, 0.118562f, -0.027139f, 0.002193f, 0.047079f, -0.022013f, 0.009612f, 0.003977f, 0.029238f, 0.066889f, 0.063663f, 0.060165f, 0.004183f, -0.000844f, -0.009148f, 0.003359f, -0.015577f, 0.004902f, 0.051727f, -0.012571f, -0.015060f, 0.028556f, -0.006396f, -0.078929f, 0.037197f, -0.057152f, 0.082501f, 0.010378f, -0.069817f, 0.016707f, 0.001728f, 0.033960f, 0.016845f, -0.016509f, 0.061499f, 0.015330f, 0.004312f, 0.040844f, -0.030892f, -0.044229f, 0.002821f, 0.023947f, 0.082687f, -0.010960f, 0.001689f, -0.008071f, 0.060115f, 0.006788f, -0.044912f, -0.027122f, 0.010491f, -0.004806f, 0.027690f, -0.044897f, 0.023560f, 0.007660f, 0.015317f, -0.003792f, -0.015649f, 0.010508f, 0.020288f, 0.000373f, 0.056638f, -0.087587f, 0.010005f, -0.030822f, -0.016779f, -0.011226f, -0.061570f, -0.093163f, -0.093772f, -0.070116f, 0.010337f, 0.000370f, -0.052911f, -0.000462f, -0.006943f, 0.006010f, -0.031266f, -0.089859f, 0.092225f, -0.001625f, -0.009093f, 0.018010f, + -0.083524f, -0.006018f, -0.017223f, 0.016575f, 0.030845f, 0.120822f, 0.095404f, -0.009545f, 0.005022f, -0.001737f, 0.030534f, 0.038876f, 0.029828f, -0.021005f, 0.111434f, -0.102892f, 0.019745f, -0.018405f, 0.005899f, 0.046030f, -0.030440f, 0.012814f, 0.003586f, -0.111486f, 0.004748f, -0.010952f, 0.007481f, 0.014850f, -0.048559f, -0.017090f, -0.081666f, -0.019800f, -0.001950f, 0.006385f, -0.029500f, -0.022001f, -0.034211f, -0.013356f, 0.038538f, 0.009770f, 0.075529f, 0.019815f, -0.022204f, -0.023983f, 0.047539f, -0.047975f, 0.088719f, -0.065152f, 0.022418f, -0.052119f, 0.004101f, 0.053877f, -0.090844f, 0.090739f, 0.018929f, 0.012508f, -0.061059f, -0.010554f, -0.008568f, 0.002430f, 0.034867f, 0.033422f, 0.043129f, -0.071901f, 0.002547f, -0.026592f, -0.020637f, -0.025869f, -0.035055f, -0.024855f, 0.006934f, 0.045728f, -0.039563f, 0.015456f, -0.077332f, -0.024766f, 0.028489f, 0.028440f, 0.012634f, -0.091894f, -0.042536f, -0.030332f, -0.038186f, -0.036530f, 0.015619f, -0.028010f, 0.065581f, 0.018793f, 0.044187f, -0.013175f, 0.046702f, -0.089391f, 0.135043f, -0.102576f, -0.011084f, -0.062206f, + 0.011852f, 0.000568f, -0.037395f, -0.053452f, 0.061422f, 0.040460f, 0.019269f, -0.027840f, 0.027168f, 0.007375f, 0.058206f, -0.047133f, -0.030243f, 0.034911f, 0.060660f, -0.078395f, 0.031439f, -0.004156f, 0.037030f, -0.029281f, 0.011180f, -0.035752f, 0.007572f, -0.065696f, 0.021630f, 0.066873f, -0.001572f, -0.007160f, 0.086137f, 0.012864f, -0.038410f, -0.085452f, 0.072320f, -0.039911f, 0.033317f, -0.032964f, 0.086509f, 0.035077f, -0.007920f, 0.006089f, -0.047712f, 0.003748f, 0.022992f, -0.026846f, 0.025770f, -0.106333f, 0.042638f, 0.090068f, 0.075536f, -0.044175f, -0.039319f, -0.046194f, 0.050309f, -0.000481f, -0.011676f, -0.000855f, 0.124503f, -0.064055f, -0.023303f, 0.041104f, -0.035442f, -0.115373f, 0.051827f, 0.017201f, -0.071492f, 0.035378f, 0.083225f, 0.056470f, -0.010578f, -0.043213f, -0.088477f, 0.045554f, -0.006186f, 0.011032f, -0.033073f, 0.026801f, -0.000434f, 0.014149f, 0.003653f, 0.003870f, -0.019183f, 0.012682f, 0.046346f, -0.061638f, 0.050973f, -0.010153f, -0.032778f, 0.009358f, -0.022559f, 0.012710f, -0.023062f, -0.019625f, 0.014533f, -0.049549f, -0.005737f, 0.062721f, + -0.093377f, 0.024675f, 0.003683f, -0.016977f, -0.029167f, -0.035184f, -0.022565f, 0.065760f, -0.056052f, -0.009515f, 0.021169f, -0.057923f, 0.013748f, 0.029262f, 0.020179f, 0.008898f, 0.009297f, -0.033496f, 0.024624f, -0.084616f, 0.000834f, 0.070707f, -0.030589f, -0.010026f, -0.016460f, -0.022395f, -0.000681f, -0.060634f, 0.031071f, 0.021497f, -0.048383f, 0.043345f, 0.012899f, -0.057504f, 0.023113f, -0.013063f, 0.040649f, 0.032508f, -0.050630f, 0.015394f, 0.058169f, -0.056478f, 0.031546f, -0.041110f, 0.032156f, 0.032081f, -0.051753f, 0.028173f, 0.000609f, -0.029682f, 0.049131f, 0.013960f, -0.046530f, -0.229101f, -0.467833f, -0.202659f, -0.320526f, -0.426071f, 0.121698f, 0.025014f, 0.101222f, 0.563044f, 0.464164f, 0.296465f, 0.479413f, 0.316894f, 0.012707f, 0.057662f, 0.033783f, -0.299037f, -0.203093f, -0.148361f, -0.338129f, -0.344138f, -0.115640f, -0.116113f, -0.224494f, -0.086101f, -0.070065f, -0.263966f, -0.231058f, -0.093131f, -0.139229f, -0.250221f, -0.081507f, -0.063862f, -0.201701f, -0.046235f, 0.095690f, -0.078340f, -0.068361f, 0.154957f, 0.085268f, -0.097743f, 0.134937f, 0.239281f, + 0.005680f, 0.125097f, 0.299879f, 0.135986f, 0.059849f, 0.327383f, 0.234072f, 0.169973f, 0.403730f, 0.554033f, 0.435232f, 0.509509f, 0.665895f, 0.431195f, 0.279088f, 0.371350f, 0.237630f, -0.074832f, -0.020378f, -0.170581f, -0.416907f, -0.587730f, -0.626955f, -0.839264f, -0.948278f, -1.002784f, -0.955856f, -0.908067f, -0.879758f, -0.704786f, -0.470026f, -0.362649f, 0.038999f, 0.300998f, 0.196537f} + }, + { + {0.021751f, -0.001344f, -0.000264f, 0.002367f, -0.002589f, -0.002741f, -0.001962f, 0.005069f, -0.013051f, 0.004925f, -0.003574f, 0.000009f, 0.000693f, -0.000520f, -0.001667f, 0.000794f, 0.002928f, 0.005473f, -0.002548f, 0.006101f, -0.004929f, -0.005469f, -0.003901f, 0.002747f, -0.005111f, -0.003286f, 0.003947f, 0.000769f, -0.001651f, 0.004862f, -0.001116f, 0.000007f, 0.003177f, 0.001717f, -0.002393f, -0.003334f, -0.003598f, -0.004090f, -0.009305f, 0.002470f, -0.002208f, -0.000736f, 0.014139f, 0.001233f, -0.002869f, 0.008104f, -0.002965f, 0.000140f, -0.003650f, -0.006742f, 0.008367f, -0.002690f, -0.001381f, 0.000095f, -0.005786f, 0.001855f, -0.000254f, 0.004249f, -0.000852f, 0.004260f, 0.001657f, -0.001172f, 0.005120f, -0.000664f, 0.001873f, 0.002498f, -0.000150f, -0.011651f, -0.000134f, -0.001703f, -0.004402f, 0.002948f, -0.000979f, -0.002507f, -0.001387f, -0.007215f, 0.004723f, 0.007449f, -0.002352f, 0.006645f, -0.000848f, 0.007004f, 0.003611f, -0.001277f, -0.002469f, 0.007096f, 0.000768f, 0.001592f, -0.007636f, -0.001032f, -0.000383f, -0.000126f, 0.010867f, 0.005449f, -0.000219f, -0.007794f, + -0.005667f, -0.003222f, 0.001140f, 0.000046f, 0.002471f, 0.005146f, 0.001646f, 0.002045f, -0.007952f, -0.001013f, -0.007743f, 0.000551f, -0.004228f, 0.005394f, 0.005273f, -0.001820f, -0.004139f, 0.005630f, 0.001257f, -0.001788f, -0.007192f, -0.000753f, -0.004591f, 0.001544f, 0.004524f, -0.007155f, -0.003553f, -0.001001f, -0.002852f, 0.019098f, 0.004517f, 0.011123f, 0.000796f, 0.003802f, -0.000100f, -0.005224f, -0.005100f, -0.006213f, 0.002968f, -0.005092f, 0.003715f, 0.000330f, 0.004519f, 0.004971f, 0.011393f, 0.003683f, -0.001207f, -0.000418f, -0.007194f, 0.011359f, 0.009927f, 0.001901f, 0.002693f, 0.002935f, 0.002632f, 0.025704f, -0.006521f, -0.005828f, -0.002462f, -0.005547f, 0.000861f, -0.012788f, 0.000641f, 0.002063f, 0.000313f, 0.008008f, 0.000656f, -0.002166f, -0.007741f, 0.004328f, -0.010781f, -0.009494f, 0.002985f, -0.004872f, -0.002381f, -0.002037f, 0.001487f, 0.006585f, 0.009425f, 0.000228f, -0.001744f, 0.010990f, 0.003914f, -0.001197f, 0.000196f, -0.005246f, -0.000068f, 0.012068f, -0.000197f, -0.006446f, -0.004939f, -0.001958f, 0.004104f, -0.006458f, -0.007372f, -0.007992f, + -0.006177f, 0.005106f, -0.005808f, 0.001475f, -0.007012f, 0.001716f, 0.008215f, -0.000190f, 0.005819f, -0.003282f, -0.004783f, -0.003123f, 0.004041f, -0.001086f, 0.006309f, 0.008419f, 0.001338f, -0.003738f, -0.004810f, -0.001221f, -0.000684f, -0.000617f, 0.000355f, -0.009315f, -0.000769f, -0.005039f, -0.004029f, 0.002651f, 0.001036f, 0.001081f, 0.003278f, -0.011426f, -0.005095f, 0.002049f, -0.001376f, 0.004410f, -0.019464f, -0.010054f, -0.004880f, -0.013595f, -0.005277f, -0.013092f, 0.002717f, -0.001983f, -0.008458f, -0.009673f, -0.002165f, -0.008076f, -0.001030f, 0.005015f, -0.001300f, -0.011816f, -0.004886f, -0.000782f, -0.005098f, -0.004475f, 0.002312f, 0.009296f, 0.012308f, -0.003079f, -0.004333f, 0.006412f, 0.007573f, -0.003591f, -0.002759f, -0.002653f, -0.006732f, 0.000817f, 0.001936f, -0.006335f, -0.004792f, -0.002245f, 0.004282f, 0.010207f, -0.000044f, -0.004796f, -0.000764f, -0.006681f, -0.002847f, -0.010026f, -0.004986f, -0.005032f, -0.014966f, -0.002563f, -0.007192f, -0.005542f, -0.016340f, 0.008623f, -0.007513f, -0.007107f, 0.002073f, -0.002061f, -0.001815f, 0.000945f, -0.013648f, -0.004481f, + -0.005308f, -0.002150f, -0.008129f, -0.002156f, -0.004141f, 0.002295f, 0.003924f, -0.005378f, -0.002791f, -0.007364f, 0.001729f, -0.002093f, -0.001625f, -0.001145f, -0.009729f, -0.001394f, -0.007883f, -0.034236f, -0.002539f, -0.016751f, 0.015405f, -0.008593f, 0.027579f, -0.017289f, 0.017416f, -0.015270f, -0.000838f, 0.000084f, -0.011918f, 0.009669f, 0.000398f, -0.004106f, 0.002843f, -0.003526f, -0.001560f, -0.011273f, -0.000119f, -0.008381f, 0.006950f, 0.002901f, 0.008493f, -0.004528f, 0.012674f, 0.011988f, -0.011243f, 0.003673f, -0.009599f, 0.010648f, -0.000057f, -0.006453f, 0.000415f, -0.000370f, -0.000567f, 0.008050f, 0.000856f, -0.010316f, 0.004281f, 0.008629f, -0.000810f, 0.010094f, -0.004665f, 0.008402f, -0.011754f, -0.004987f, 0.007097f, -0.005706f, 0.001474f, 0.010958f, -0.009617f, 0.015806f, 0.005384f, -0.013709f, 0.003030f, -0.013122f, 0.004502f, 0.008968f, 0.004693f, 0.008732f, 0.010230f, 0.004885f, -0.002103f, 0.000385f, -0.000107f, 0.004808f, 0.006940f, -0.001271f, 0.013828f, 0.004437f, 0.009039f, 0.007236f, 0.001672f, 0.002671f, 0.022336f, -0.000281f, -0.006609f, -0.002480f, + -0.008907f, -0.010531f, 0.016186f, -0.003620f, -0.002850f, 0.014855f, -0.001618f, -0.003331f, 0.006301f, 0.011482f, 0.002937f, 0.005516f, -0.000757f, -0.013321f, -0.003891f, 0.009366f, -0.015226f, -0.014979f, -0.005955f, 0.002846f, -0.010888f, -0.006607f, -0.000282f, -0.001806f, 0.009729f, -0.004286f, -0.002748f, 0.010446f, 0.014485f, -0.013330f, 0.002875f, -0.003425f, 0.004940f, 0.001175f, -0.006312f, -0.001571f, 0.005684f, 0.009256f, -0.003135f, -0.013800f, -0.003618f, -0.001486f, -0.004156f, -0.007025f, 0.000372f, -0.001138f, 0.001837f, -0.002132f, 0.001237f, 0.012351f, -0.009987f, 0.000955f, -0.007784f, -0.006001f, -0.010467f, -0.003173f, -0.006368f, -0.013713f, -0.001235f, 0.000731f, -0.006036f, -0.001206f, -0.006374f, 0.005068f, 0.005719f, -0.001132f, 0.001085f, -0.004903f, -0.002225f, 0.016360f, -0.002951f, -0.006493f, -0.021922f, 0.030264f, 0.033905f, 0.007090f, -0.011296f, 0.008342f, 0.013817f, 0.013907f, 0.008138f, 0.010710f, 0.005168f, 0.017027f, -0.000916f, -0.001156f, -0.005891f, 0.011010f, -0.005255f, -0.013422f, -0.018962f, 0.003120f, -0.008740f, -0.007250f, 0.007635f, -0.001192f, + -0.004560f, 0.017435f, -0.000529f, 0.021455f, 0.000866f, -0.007222f, -0.004922f, 0.008128f, 0.005414f, -0.003128f, -0.015669f, 0.024410f, 0.014171f, 0.001076f, 0.013310f, 0.008549f, 0.008843f, -0.006742f, 0.009894f, 0.005734f, 0.002412f, -0.001864f, -0.003678f, -0.009374f, -0.014117f, 0.005119f, 0.007543f, -0.010390f, 0.005016f, 0.010834f, 0.015087f, 0.004888f, 0.013639f, 0.007158f, 0.011642f, -0.015585f, 0.005244f, 0.002531f, 0.003601f, 0.001412f, -0.000922f, 0.008022f, 0.006550f, 0.007169f, 0.009115f, -0.002096f, 0.004357f, 0.003406f, 0.012843f, 0.016588f, -0.008420f, -0.009147f, 0.027587f, 0.009090f, 0.012449f, -0.009356f, 0.004399f, -0.023942f, 0.001776f, -0.017116f, 0.013854f, 0.009645f, -0.007043f, 0.011935f, 0.006819f, -0.011330f, -0.002594f, 0.018032f, -0.000202f, 0.012656f, -0.002925f, 0.003139f, 0.014161f, -0.016440f, -0.001016f, 0.003608f, 0.005349f, 0.001969f, 0.005837f, 0.001570f, 0.017034f, -0.006903f, -0.004583f, -0.004166f, 0.012907f, 0.002546f, -0.005755f, 0.008669f, 0.021580f, -0.013940f, 0.002814f, 0.003912f, -0.001145f, 0.009705f, -0.004188f, 0.017450f, + 0.005617f, 0.005285f, -0.013291f, -0.000136f, -0.003456f, 0.008818f, 0.005784f, 0.009476f, -0.009128f, -0.004663f, 0.007856f, -0.014644f, -0.008922f, 0.005118f, 0.017333f, 0.012016f, 0.015347f, -0.015008f, -0.005169f, -0.015177f, -0.004243f, 0.006996f, -0.001242f, -0.013948f, 0.002398f, -0.007569f, 0.000334f, -0.014975f, -0.020393f, -0.005700f, -0.013883f, 0.004769f, -0.033109f, -0.029965f, -0.021911f, 0.005123f, 0.005165f, 0.022708f, -0.011798f, 0.021516f, -0.010525f, -0.038605f, -0.004601f, -0.004642f, -0.015764f, -0.025372f, -0.010136f, -0.001673f, -0.016234f, -0.001263f, -0.024286f, 0.000555f, -0.025541f, 0.012753f, -0.007433f, 0.008998f, -0.006098f, -0.001527f, -0.008886f, -0.009828f, 0.013586f, 0.001856f, -0.005739f, 0.015900f, 0.000505f, 0.001676f, 0.004421f, 0.014571f, 0.012298f, 0.009427f, -0.001165f, -0.019501f, -0.003370f, 0.007876f, 0.001240f, 0.010340f, -0.006896f, 0.004075f, -0.028615f, 0.007626f, 0.014883f, -0.021493f, 0.010603f, 0.003312f, 0.017859f, 0.013917f, -0.001560f, -0.005986f, -0.002011f, 0.012301f, 0.004941f, -0.018133f, -0.015639f, -0.024724f, -0.013142f, -0.016805f, + -0.005189f, -0.020561f, -0.005774f, -0.007271f, 0.018750f, -0.009964f, 0.008520f, -0.005641f, -0.004434f, -0.006836f, -0.015469f, -0.007571f, -0.040245f, 0.034146f, -0.007213f, 0.020912f, 0.013030f, 0.001005f, -0.025908f, 0.023701f, 0.004959f, -0.000200f, 0.015861f, 0.011534f, -0.009473f, 0.001484f, 0.025697f, 0.009497f, -0.008585f, 0.018406f, -0.007058f, -0.005776f, -0.002906f, 0.006970f, 0.002310f, -0.001498f, 0.004511f, 0.008740f, 0.008709f, 0.008142f, -0.015085f, 0.012263f, -0.012096f, 0.021166f, -0.009828f, 0.021057f, 0.008762f, 0.003324f, -0.016697f, -0.018081f, -0.003906f, -0.005079f, 0.025414f, 0.007855f, 0.020915f, 0.009044f, -0.013527f, 0.002011f, -0.000879f, 0.009196f, 0.003350f, 0.008255f, 0.000953f, -0.009589f, -0.003335f, 0.012932f, 0.032059f, 0.022187f, 0.005628f, 0.008523f, 0.001311f, -0.002674f, 0.018357f, 0.013821f, -0.001617f, 0.019705f, 0.029676f, 0.037525f, 0.004847f, -0.019173f, -0.020592f, 0.010289f, 0.009143f, 0.000720f, 0.011281f, 0.002233f, -0.002420f, 0.002158f, 0.027874f, 0.019018f, -0.029077f, 0.023509f, 0.009421f, -0.020084f, 0.045251f, 0.006281f, + -0.023754f, 0.004793f, 0.012328f, 0.000579f, 0.008815f, 0.032127f, -0.031722f, 0.019776f, -0.013021f, 0.017431f, -0.007237f, 0.003118f, -0.029353f, 0.004148f, -0.003433f, 0.010853f, -0.011402f, 0.000761f, 0.001983f, -0.000600f, -0.017292f, 0.015423f, 0.001503f, -0.002766f, 0.007504f, -0.004306f, 0.007399f, -0.005150f, 0.022882f, 0.017067f, 0.022652f, 0.021526f, -0.003862f, 0.006680f, 0.009661f, -0.000318f, -0.012128f, 0.014677f, -0.019253f, 0.004414f, 0.018692f, -0.012792f, 0.009790f, -0.022758f, 0.006501f, -0.003582f, -0.005301f, -0.003675f, 0.001303f, 0.004554f, 0.005913f, 0.020136f, -0.015027f, -0.002973f, 0.014200f, 0.029254f, -0.028732f, 0.004555f, -0.007688f, 0.006740f, -0.006150f, 0.043093f, -0.029745f, 0.006593f, -0.017509f, -0.012872f, 0.001950f, 0.000133f, -0.000455f, -0.045044f, 0.020473f, -0.029058f, -0.006884f, 0.038865f, -0.012855f, -0.001728f, 0.020412f, 0.004070f, 0.012252f, -0.030639f, 0.027591f, 0.000906f, 0.001231f, -0.008495f, -0.018761f, -0.003424f, -0.003658f, -0.020108f, -0.012438f, 0.020238f, -0.007635f, 0.003083f, -0.011304f, -0.047659f, 0.014912f, 0.001106f, + -0.015295f, 0.007883f, 0.017191f, -0.002736f, 0.001119f, -0.004708f, 0.003669f, 0.011171f, 0.003024f, 0.018584f, 0.012605f, 0.001963f, 0.016334f, -0.015005f, -0.014523f, -0.020613f, 0.006478f, 0.010039f, 0.002405f, -0.032076f, 0.007884f, -0.027625f, 0.037324f, -0.010370f, 0.012716f, 0.031208f, -0.013689f, 0.019272f, 0.004322f, 0.021042f, 0.008237f, -0.012446f, -0.034270f, -0.025668f, -0.019529f, -0.004355f, -0.020448f, -0.005837f, -0.017963f, -0.013231f, 0.032855f, 0.004984f, -0.015098f, -0.015332f, 0.006052f, 0.009476f, -0.003631f, 0.001213f, -0.061869f, 0.019771f, 0.002833f, 0.011966f, -0.039200f, -0.047708f, 0.026538f, -0.024119f, -0.027945f, -0.008922f, 0.016076f, 0.034836f, -0.025325f, 0.000607f, 0.015684f, -0.006505f, -0.009072f, 0.007999f, 0.004454f, 0.025897f, 0.007470f, -0.027459f, -0.002662f, -0.014563f, -0.002606f, -0.016832f, -0.022237f, 0.001873f, 0.018720f, -0.002784f, 0.007316f, -0.018286f, 0.003110f, 0.019000f, 0.013786f, 0.001100f, -0.000385f, 0.011389f, 0.009977f, 0.006375f, 0.016440f, -0.024769f, 0.023548f, 0.017206f, 0.004076f, -0.020721f, -0.000914f, 0.013619f, + -0.017771f, 0.016020f, -0.014708f, 0.018301f, -0.007881f, 0.024288f, -0.043127f, 0.041424f, 0.007172f, 0.038942f, -0.000412f, -0.010085f, -0.006001f, 0.013014f, -0.002394f, -0.035408f, -0.002229f, -0.004139f, -0.038791f, 0.009213f, 0.020858f, -0.035222f, 0.023381f, -0.031429f, 0.004489f, 0.008856f, 0.001107f, -0.039442f, -0.022923f, -0.021567f, -0.001597f, -0.003439f, -0.021372f, -0.020791f, 0.033149f, 0.007215f, 0.022038f, 0.021383f, 0.006470f, -0.015346f, 0.004175f, 0.055498f, -0.037081f, 0.009726f, -0.006002f, -0.019953f, 0.001852f, 0.008006f, 0.009472f, 0.000374f, 0.000747f, -0.010179f, -0.015239f, -0.024039f, -0.011870f, 0.019239f, -0.015042f, -0.024177f, 0.014821f, -0.008293f, 0.006026f, -0.002706f, 0.011619f, -0.009992f, 0.023868f, -0.007881f, 0.003042f, -0.000013f, 0.002967f, 0.021996f, 0.007796f, -0.009517f, 0.011924f, -0.008701f, 0.018054f, -0.010198f, 0.007636f, -0.024857f, -0.018053f, -0.013193f, 0.004752f, -0.012339f, -0.021687f, 0.009465f, 0.016574f, 0.004915f, -0.011479f, 0.007583f, 0.011686f, 0.013044f, 0.035359f, 0.048487f, 0.066134f, -0.006994f, 0.010489f, 0.015543f, + 0.009196f, 0.008301f, 0.010355f, -0.014393f, 0.025811f, -0.004918f, 0.033639f, 0.040561f, 0.030161f, 0.010172f, 0.016307f, 0.002233f, 0.057521f, 0.009670f, -0.014529f, 0.000835f, 0.067374f, 0.054113f, -0.021627f, -0.009379f, -0.026024f, 0.017003f, 0.009218f, 0.033447f, -0.004146f, -0.012939f, -0.004743f, -0.019937f, 0.006364f, 0.001770f, 0.032186f, -0.010503f, 0.013112f, -0.040183f, 0.024410f, -0.002405f, 0.017765f, 0.000561f, 0.016327f, 0.003168f, -0.021405f, -0.011406f, -0.018025f, -0.014626f, 0.018964f, 0.041236f, 0.019875f, -0.004366f, -0.010409f, -0.000141f, -0.001140f, 0.010494f, 0.016108f, -0.025757f, 0.001919f, -0.008880f, -0.006193f, -0.028149f, -0.019223f, -0.045775f, 0.003540f, -0.002368f, 0.019305f, -0.013898f, 0.032266f, -0.022583f, -0.006797f, 0.058369f, 0.061351f, -0.040783f, 0.012282f, 0.033066f, -0.016143f, -0.010205f, 0.020974f, -0.007542f, -0.020800f, 0.064083f, -0.012263f, -0.100860f, 0.037286f, -0.003167f, -0.046687f, 0.036859f, 0.046600f, -0.017686f, 0.034349f, 0.033598f, -0.012304f, -0.003433f, 0.028622f, -0.031198f, 0.012587f, -0.026345f, -0.013968f, 0.002996f, + 0.009814f, 0.020331f, 0.008856f, -0.019342f, -0.005156f, 0.014681f, -0.020554f, 0.017147f, -0.011243f, -0.025384f, 0.019495f, 0.009614f, 0.008663f, -0.007428f, -0.008092f, -0.009877f, -0.003295f, 0.016690f, -0.039525f, 0.017217f, -0.002991f, 0.029853f, -0.021914f, -0.001210f, -0.026737f, 0.009416f, -0.042120f, 0.003210f, -0.000581f, -0.016976f, -0.014388f, 0.005288f, -0.029228f, -0.047346f, 0.025587f, -0.003594f, 0.005930f, -0.028323f, 0.014244f, -0.005314f, 0.015456f, 0.018519f, 0.006971f, -0.020057f, 0.013300f, -0.009930f, -0.006946f, -0.036365f, 0.002397f, -0.025955f, -0.030737f, -0.041142f, -0.019585f, 0.006273f, 0.008401f, -0.042191f, -0.023752f, 0.002321f, -0.018078f, -0.056255f, -0.047882f, -0.045572f, -0.012685f, -0.026735f, 0.021206f, 0.035599f, 0.006148f, -0.032249f, -0.042881f, -0.043328f, -0.007882f, 0.001094f, 0.020243f, -0.026397f, 0.052548f, 0.058211f, -0.010828f, 0.040161f, -0.008136f, -0.011908f, -0.012109f, 0.039269f, -0.029348f, -0.004417f, -0.012725f, 0.060736f, 0.004567f, 0.024134f, 0.009947f, -0.002364f, 0.031156f, 0.019256f, 0.025893f, 0.010619f, -0.001419f, -0.006879f, + 0.024802f, -0.000464f, -0.019965f, 0.031009f, 0.001395f, 0.027637f, -0.024956f, 0.022368f, 0.008777f, -0.023972f, -0.019217f, 0.053884f, 0.034621f, 0.000621f, 0.019968f, 0.018840f, -0.030045f, -0.017090f, 0.012434f, 0.011991f, 0.024162f, 0.006825f, 0.006679f, 0.012857f, 0.028995f, 0.015456f, 0.008681f, -0.022844f, 0.076789f, 0.054894f, 0.007388f, -0.029260f, 0.018361f, -0.006712f, 0.010863f, -0.002952f, 0.017558f, -0.006147f, 0.003961f, 0.046522f, -0.027342f, -0.008672f, -0.037246f, 0.016115f, -0.009142f, -0.001338f, 0.036714f, 0.016632f, 0.006024f, 0.008505f, -0.012672f, -0.023748f, 0.023805f, -0.016629f, -0.037706f, 0.103364f, -0.112793f, -0.011817f, -0.058573f, 0.075281f, 0.021588f, 0.014374f, -0.027013f, 0.008220f, -0.021680f, 0.067465f, -0.009848f, -0.003029f, 0.008689f, -0.002099f, -0.023939f, 0.011043f, 0.017052f, 0.021131f, -0.042636f, -0.022397f, -0.020908f, 0.010203f, -0.011368f, -0.011040f, 0.000782f, 0.000540f, 0.031603f, -0.014217f, 0.003784f, 0.023037f, -0.000375f, -0.028644f, 0.006154f, 0.024122f, -0.000289f, -0.045715f, 0.037300f, 0.004897f, 0.003259f, 0.000610f, + -0.016936f, 0.015968f, -0.083261f, -0.059446f, -0.005578f, -0.020945f, 0.006772f, 0.007094f, -0.037352f, 0.063799f, -0.022098f, 0.087663f, -0.009268f, -0.030176f, 0.032982f, 0.005310f, 0.029820f, 0.040651f, 0.016008f, -0.041320f, -0.008281f, 0.046732f, 0.111487f, 0.003573f, -0.024488f, 0.044939f, 0.007007f, 0.052796f, 0.011511f, 0.071223f, -0.016099f, -0.004481f, -0.000242f, 0.013259f, 0.002869f, 0.147570f, 0.044653f, 0.014953f, -0.006365f, -0.017542f, -0.023125f, 0.047188f, 0.042901f, -0.052942f, 0.028735f, 0.021706f, 0.003407f, -0.016998f, -0.029264f, -0.071627f, -0.028314f, 0.020997f, 0.005225f, -0.024014f, 0.040236f, -0.015210f, 0.014943f, 0.015518f, -0.012531f, -0.011386f, 0.041864f, -0.000311f, -0.019290f, 0.026128f, -0.026637f, 0.052763f, -0.029255f, -0.017713f, -0.005708f, 0.019584f, 0.008370f, 0.053274f, -0.019880f, -0.034524f, -0.014800f, 0.012771f, 0.000498f, 0.027602f, 0.004646f, 0.000682f, -0.015571f, 0.021708f, 0.099269f, 0.041699f, -0.042323f, 0.030816f, -0.024350f, -0.033708f, 0.020902f, -0.003751f, 0.002583f, -0.004929f, 0.013136f, -0.030459f, -0.047131f, -0.113621f, + -0.035059f, 0.035326f, -0.021202f, -0.042341f, 0.009164f, -0.014128f, 0.008201f, -0.050504f, -0.048106f, -0.026202f, 0.005436f, 0.006987f, 0.038550f, -0.006428f, -0.024757f, -0.061164f, -0.021972f, 0.034449f, -0.025114f, 0.092434f, 0.077804f, 0.037200f, -0.019501f, -0.030632f, 0.055999f, 0.048229f, -0.059996f, -0.011030f, -0.036235f, 0.054167f, -0.007570f, -0.073424f, -0.031249f, 0.028090f, 0.048167f, -0.085123f, 0.036079f, -0.058513f, 0.023536f, -0.033992f, -0.007830f, 0.043013f, -0.012720f, 0.007690f, 0.027893f, 0.056810f, -0.035052f, -0.059643f, 0.014886f, -0.003548f, 0.007847f, 0.058089f, 0.015511f, 0.043607f, -0.052653f, -0.008833f, 0.018358f, -0.046964f, 0.079477f, -0.008195f, 0.047990f, -0.005688f, -0.010091f, 0.039329f, 0.039395f, -0.021502f, 0.087147f, -0.019694f, -0.036928f, 0.042063f, 0.074765f, 0.004422f, 0.013848f, 0.003599f, 0.032960f, -0.035173f, 0.026263f, 0.112095f, 0.051543f, -0.004455f, 0.048565f, 0.059223f, -0.046052f, -0.139826f, 0.008598f, 0.080324f, 0.091033f, 0.021841f, -0.013769f, -0.046004f, 0.040378f, 0.096058f, 0.026437f, 0.007794f, 0.060991f, -0.127381f, + 0.093234f, 0.017718f, -0.059787f, -0.001256f, 0.050979f, -0.037561f, -0.001022f, 0.027737f, -0.039875f, 0.001332f, -0.036169f, -0.023035f, 0.032637f, -0.032085f, -0.020106f, -0.065448f, 0.024731f, 0.060475f, 0.014459f, -0.029372f, -0.050418f, -0.008966f, 0.032434f, 0.017935f, -0.043674f, -0.002306f, 0.045412f, -0.007594f, -0.000082f, -0.017674f, -0.015419f, 0.113530f, -0.058540f, -0.014886f, -0.016455f, 0.018482f, 0.049389f, -0.057180f, -0.035633f, 0.074799f, -0.012918f, -0.005245f, -0.094295f, -0.074812f, 0.026928f, 0.050529f, 0.023285f, -0.092304f, 0.058746f, -0.001503f, -0.018833f, 0.013608f, -0.070888f, -0.017706f, -0.013619f, -0.031892f, 0.054131f, -0.045267f, -0.031242f, -0.048437f, -0.034550f, -0.063942f, 0.013776f, -0.100529f, -0.035251f, 0.014881f, -0.058081f, 0.016232f, 0.020930f, 0.017152f, -0.009192f, -0.012115f, -0.046894f, 0.063853f, -0.023975f, 0.006790f, -0.071758f, 0.043873f, -0.001029f, 0.056677f, -0.011293f, 0.058567f, 0.007733f, -0.007428f, 0.026604f, 0.067831f, 0.032998f, 0.017321f, 0.014111f, 0.008542f, 0.027290f, -0.034335f, -0.002122f, -0.025857f, -0.026199f, 0.041416f, + 0.026712f, 0.015592f, -0.011212f, -0.010932f, -0.004101f, 0.043127f, 0.007578f, -0.019907f, -0.030610f, -0.002102f, -0.006468f, 0.032082f, 0.006040f, 0.026627f, 0.052661f, -0.015280f, -0.129463f, 0.007578f, 0.107361f, 0.009977f, -0.076604f, -0.011287f, 0.031312f, 0.022240f, 0.043080f, 0.036486f, -0.001662f, -0.026189f, -0.023758f, 0.031505f, -0.018628f, 0.001884f, 0.013237f, -0.137619f, -0.021833f, -0.028232f, 0.023285f, 0.104270f, -0.000138f, 0.006028f, -0.022861f, 0.004487f, 0.023932f, 0.041711f, 0.025373f, -0.029738f, -0.011825f, -0.069504f, -0.001853f, 0.041200f, -0.017790f, -0.014025f, 0.018867f, 0.040554f, 0.039281f, -0.017251f, 0.010106f, -0.030885f, -0.240792f, -0.429438f, -0.188509f, -0.299231f, -0.339953f, 0.168310f, 0.041546f, 0.152529f, 0.511839f, 0.325936f, 0.257865f, 0.399761f, 0.186314f, -0.012574f, 0.142185f, 0.015737f, -0.196823f, -0.145973f, -0.162090f, -0.338305f, -0.279741f, -0.135519f, -0.253092f, -0.276085f, -0.129292f, -0.179675f, -0.284090f, -0.159012f, -0.005439f, -0.187772f, -0.173976f, 0.007826f, -0.057185f, -0.172958f, 0.141435f, 0.084002f, -0.148849f, 0.099135f, + 0.162988f, 0.004630f, 0.083368f, 0.352382f, 0.155384f, 0.089883f, 0.419455f, 0.287502f, 0.157559f, 0.414177f, 0.563062f, 0.340957f, 0.503743f, 0.658674f, 0.465968f, 0.303083f, 0.406418f, 0.206165f, -0.231230f, -0.157120f, -0.298233f, -0.676755f, -0.676240f, -0.684163f, -1.024754f, -1.011077f, -1.011680f, -1.052600f, -0.988040f, -0.959040f, -0.745086f, -0.590007f, -0.428513f, -0.151438f, 0.117942f, 0.226351f, 0.521703f, 0.785957f, 0.557523f, 0.409130f}, + {0.023532f, 0.002482f, 0.004373f, 0.007645f, -0.010314f, -0.002805f, -0.005886f, -0.001249f, -0.002683f, -0.006388f, -0.000719f, -0.000947f, -0.006281f, 0.007830f, -0.005144f, -0.003243f, -0.000530f, -0.002877f, 0.006772f, -0.003076f, -0.004820f, 0.002004f, 0.002484f, 0.007150f, -0.000722f, 0.001520f, -0.004581f, -0.000902f, 0.000521f, 0.002130f, 0.000485f, -0.000192f, 0.007349f, -0.004303f, 0.001656f, 0.000445f, -0.004555f, -0.010538f, -0.004225f, 0.002260f, 0.003681f, 0.003798f, -0.010297f, 0.008021f, -0.003968f, -0.004321f, 0.004323f, 0.001737f, -0.009056f, 0.003479f, -0.009267f, -0.002719f, 0.003919f, -0.007238f, -0.002884f, 0.006243f, -0.002342f, -0.004110f, -0.005291f, -0.010321f, 0.007995f, 0.002852f, -0.003287f, -0.003163f, -0.006960f, -0.007903f, -0.009066f, -0.001970f, -0.005979f, -0.000097f, -0.000415f, -0.000505f, 0.000569f, -0.000573f, -0.005788f, -0.013216f, -0.001484f, 0.011844f, -0.011118f, 0.003915f, -0.018534f, -0.000068f, -0.006916f, 0.007079f, -0.006487f, 0.001427f, -0.004515f, -0.007855f, -0.002310f, -0.000951f, 0.005173f, 0.006714f, -0.006943f, -0.011662f, 0.005623f, 0.001853f, + 0.003806f, 0.002344f, 0.004343f, -0.006815f, -0.005399f, 0.001023f, -0.001692f, 0.005817f, 0.003865f, -0.005224f, -0.001545f, 0.004417f, 0.007982f, 0.005074f, -0.000414f, -0.006744f, 0.003070f, -0.001242f, -0.004039f, 0.004569f, 0.001492f, -0.006169f, -0.005637f, -0.004202f, 0.002842f, -0.006020f, -0.003788f, 0.004968f, 0.001330f, -0.000210f, -0.006868f, 0.002283f, -0.006018f, -0.013840f, 0.000688f, -0.004695f, -0.009641f, 0.004136f, -0.003287f, -0.002501f, -0.003847f, 0.000261f, 0.005976f, 0.004188f, 0.001410f, 0.003209f, 0.004190f, -0.010302f, 0.004404f, -0.004011f, -0.005128f, -0.002164f, 0.002205f, 0.000785f, 0.005867f, 0.027662f, -0.002339f, 0.005079f, 0.006077f, -0.002817f, 0.002850f, 0.011041f, -0.008617f, -0.001491f, 0.003120f, -0.004238f, -0.000879f, 0.008138f, -0.002658f, -0.001774f, -0.000612f, 0.003196f, -0.001604f, 0.003965f, -0.002798f, -0.002616f, -0.001308f, -0.006197f, -0.010800f, -0.001930f, -0.003522f, -0.001339f, 0.006228f, -0.011252f, 0.013870f, 0.000202f, 0.000142f, 0.000608f, 0.002529f, -0.000200f, -0.005482f, 0.000993f, 0.004184f, 0.010697f, 0.000399f, 0.000094f, + -0.001738f, -0.003370f, 0.006867f, 0.003523f, -0.002705f, 0.004075f, -0.007130f, 0.001415f, 0.002069f, -0.005040f, -0.018307f, -0.005423f, -0.000623f, -0.000792f, -0.001039f, -0.001301f, -0.002491f, -0.000997f, -0.003634f, 0.004789f, 0.013180f, 0.007947f, 0.000394f, 0.000379f, -0.000552f, 0.005114f, -0.002931f, -0.011704f, -0.000622f, -0.005803f, 0.003787f, -0.006572f, 0.003834f, -0.016801f, -0.000489f, -0.000908f, -0.024123f, -0.023256f, -0.008602f, -0.003250f, -0.003111f, 0.000246f, 0.006185f, 0.001641f, 0.005075f, -0.010809f, 0.005708f, 0.007091f, 0.006899f, 0.008005f, -0.005763f, 0.001888f, 0.018595f, -0.011125f, -0.000128f, -0.007866f, -0.011434f, -0.001194f, -0.000548f, 0.010360f, -0.004636f, 0.001272f, -0.008452f, 0.005810f, 0.003806f, 0.004602f, -0.019301f, 0.003221f, -0.003268f, -0.006684f, -0.001525f, 0.000097f, -0.014214f, -0.009232f, -0.007780f, -0.000468f, 0.012513f, 0.004401f, 0.004395f, 0.006021f, -0.005059f, 0.003614f, -0.004486f, 0.010565f, 0.016400f, -0.001333f, -0.001047f, 0.004706f, 0.001561f, 0.004286f, 0.009446f, -0.004076f, 0.009778f, -0.001328f, 0.000218f, 0.005612f, + 0.008059f, -0.002761f, -0.010322f, -0.009946f, 0.004451f, -0.001344f, -0.001251f, -0.004438f, 0.005588f, -0.008435f, 0.003778f, 0.006033f, 0.011253f, -0.006542f, 0.010796f, 0.005817f, 0.003708f, -0.026716f, 0.011457f, -0.012005f, 0.021338f, -0.020014f, 0.015596f, 0.007899f, -0.008338f, -0.010437f, -0.005815f, 0.003995f, 0.003633f, -0.005680f, 0.012582f, -0.004633f, -0.012099f, -0.002554f, 0.013028f, 0.008856f, -0.013227f, 0.002019f, -0.001667f, -0.013928f, -0.005735f, -0.008993f, -0.002076f, -0.010686f, -0.002801f, -0.004512f, -0.014568f, -0.005297f, 0.007446f, 0.010538f, -0.002003f, -0.012600f, -0.002467f, 0.008775f, -0.002647f, 0.000219f, 0.000699f, 0.000112f, -0.012325f, -0.000456f, -0.001358f, -0.003242f, -0.000431f, 0.002110f, -0.008731f, 0.005002f, -0.009334f, -0.000294f, 0.000166f, 0.000112f, 0.007340f, 0.000060f, -0.002988f, 0.002797f, 0.005250f, 0.011605f, 0.005732f, 0.002566f, -0.002938f, -0.007351f, -0.006318f, -0.002951f, -0.006866f, -0.005480f, 0.005101f, 0.007521f, -0.004804f, -0.009595f, -0.005450f, 0.002788f, 0.002899f, -0.009137f, 0.033385f, 0.013760f, -0.001361f, 0.008176f, + -0.004403f, 0.019043f, 0.008561f, 0.033665f, 0.001476f, -0.031054f, 0.009027f, 0.020062f, -0.010597f, 0.004136f, 0.014178f, -0.009467f, 0.010274f, -0.007542f, -0.000880f, -0.009479f, -0.008795f, -0.002354f, 0.003648f, -0.000340f, 0.005368f, -0.003666f, 0.015080f, -0.007730f, 0.004978f, 0.003298f, 0.010185f, -0.016127f, -0.007740f, -0.005947f, -0.000943f, -0.005277f, 0.002652f, 0.010937f, 0.008414f, 0.016968f, -0.001276f, -0.000550f, -0.008156f, -0.002398f, 0.011448f, -0.009389f, 0.009685f, -0.008745f, -0.002730f, 0.015608f, 0.022860f, 0.016130f, 0.004006f, -0.010761f, 0.009325f, 0.006581f, -0.004696f, 0.013220f, -0.006874f, 0.003123f, 0.003474f, -0.022339f, 0.001354f, -0.021135f, -0.007133f, 0.004137f, -0.004027f, -0.009721f, -0.007022f, 0.002519f, 0.016989f, 0.004468f, -0.003882f, -0.006823f, -0.004167f, 0.002322f, 0.005039f, 0.020590f, 0.041323f, -0.017459f, -0.012847f, -0.003235f, -0.004401f, 0.014611f, -0.013208f, -0.024498f, -0.008178f, 0.002056f, -0.005641f, 0.007439f, 0.003824f, 0.012671f, 0.005652f, -0.004669f, 0.018278f, 0.016961f, -0.007200f, 0.001477f, -0.010978f, -0.001697f, + 0.001151f, -0.006828f, -0.000839f, 0.012686f, 0.018419f, 0.000940f, 0.003507f, 0.007565f, 0.005284f, 0.003079f, 0.001822f, -0.006568f, -0.012220f, 0.001665f, -0.017829f, 0.000844f, 0.004901f, -0.005716f, 0.007934f, -0.004518f, -0.009507f, -0.000644f, 0.010667f, 0.004544f, -0.003702f, 0.030300f, 0.000693f, 0.009863f, -0.017143f, -0.003875f, 0.013164f, -0.005648f, -0.012411f, 0.007942f, -0.014653f, -0.013851f, 0.004158f, 0.017232f, -0.012971f, -0.007747f, -0.003039f, 0.000849f, -0.005160f, -0.006159f, 0.024371f, 0.013693f, -0.000663f, 0.001534f, -0.009237f, -0.007432f, -0.002466f, 0.007520f, 0.015965f, -0.029304f, -0.004159f, -0.022067f, -0.012683f, -0.020008f, -0.005288f, -0.003268f, -0.003229f, -0.007829f, 0.008577f, -0.028085f, 0.014067f, -0.009721f, 0.008258f, 0.003511f, 0.011364f, 0.000444f, 0.004559f, -0.011436f, -0.005031f, 0.005006f, -0.011454f, -0.008314f, 0.013426f, 0.003589f, 0.005932f, 0.005320f, -0.001672f, 0.003507f, 0.020113f, -0.007478f, 0.001691f, -0.009354f, 0.016120f, -0.010057f, -0.036688f, 0.011125f, 0.005459f, 0.015184f, 0.008016f, 0.020987f, -0.014537f, -0.005782f, + 0.012482f, -0.005420f, -0.012467f, -0.005876f, 0.006369f, -0.017799f, 0.017225f, -0.000707f, 0.011396f, -0.015025f, -0.006815f, -0.005498f, -0.016450f, -0.003360f, -0.013124f, -0.005921f, 0.001133f, 0.018613f, 0.014793f, -0.001724f, -0.023087f, -0.013059f, -0.004404f, 0.018104f, 0.014823f, 0.010902f, 0.009981f, -0.006451f, -0.026508f, -0.006874f, -0.000592f, 0.005850f, -0.039312f, -0.047250f, -0.027203f, 0.017687f, 0.000352f, -0.009809f, -0.010919f, -0.015936f, -0.002708f, 0.003760f, -0.026832f, -0.003695f, 0.015097f, -0.011163f, -0.008175f, 0.016874f, 0.003659f, -0.013213f, 0.003470f, -0.012836f, 0.025803f, -0.009964f, -0.007475f, 0.007415f, -0.015057f, -0.010063f, -0.009262f, 0.003248f, -0.010761f, -0.004952f, 0.003467f, 0.001925f, -0.032603f, 0.012785f, 0.012749f, -0.010443f, 0.023454f, 0.008040f, 0.001350f, 0.022079f, 0.012418f, 0.002803f, 0.002334f, 0.023952f, -0.003460f, -0.005742f, -0.002623f, 0.014143f, 0.007823f, -0.024431f, 0.008035f, 0.005720f, -0.001016f, -0.013742f, -0.037892f, 0.014828f, -0.003225f, -0.010696f, -0.023997f, -0.014727f, 0.013585f, -0.004681f, -0.007415f, -0.017188f, + -0.030726f, 0.001281f, -0.004652f, -0.017863f, -0.007086f, -0.030477f, -0.004717f, -0.008525f, -0.005261f, -0.003537f, 0.010858f, 0.019300f, -0.039251f, 0.031888f, 0.001994f, 0.016352f, -0.002654f, -0.001209f, 0.003255f, 0.017603f, 0.002035f, -0.002116f, -0.023493f, 0.008519f, -0.002254f, -0.018393f, 0.005205f, -0.012038f, -0.008823f, 0.034132f, 0.010169f, 0.010462f, -0.006884f, 0.012154f, 0.015296f, 0.014172f, -0.007730f, 0.012335f, 0.007066f, -0.014542f, 0.010003f, -0.014173f, -0.004163f, 0.008728f, 0.004944f, -0.001682f, -0.007012f, -0.007556f, 0.023515f, -0.006900f, -0.009140f, -0.006705f, 0.005528f, 0.004592f, -0.009923f, -0.018704f, -0.000350f, -0.020074f, -0.001282f, -0.018172f, -0.005595f, -0.004685f, 0.004646f, -0.009548f, -0.014128f, 0.018842f, -0.006723f, -0.021947f, 0.015026f, 0.022160f, -0.009589f, -0.007984f, 0.013068f, 0.007645f, 0.024219f, 0.013830f, 0.004010f, -0.001064f, -0.021401f, 0.004693f, 0.024196f, 0.016903f, -0.013763f, 0.015962f, 0.020635f, -0.013615f, -0.032253f, -0.012650f, -0.028102f, 0.008259f, -0.062202f, 0.030808f, 0.009195f, -0.002267f, 0.043063f, -0.001808f, + 0.022116f, -0.018251f, -0.003796f, 0.004058f, 0.000906f, 0.024961f, 0.016045f, -0.032195f, 0.021177f, 0.002284f, 0.012954f, -0.028914f, -0.000559f, 0.017881f, -0.028519f, 0.037173f, 0.010445f, 0.000369f, -0.012447f, 0.002943f, 0.016326f, -0.025342f, 0.002944f, 0.007452f, 0.005138f, -0.015314f, -0.005462f, 0.016033f, 0.009103f, -0.000833f, 0.002727f, -0.009776f, -0.017680f, 0.008319f, -0.030216f, -0.000436f, 0.044255f, 0.043679f, -0.013366f, 0.006167f, -0.001579f, 0.013131f, 0.031087f, 0.003480f, 0.014952f, 0.005797f, -0.016051f, -0.000299f, -0.003020f, -0.045588f, -0.021025f, 0.029761f, 0.001218f, 0.009871f, -0.011471f, -0.001828f, 0.009860f, 0.015014f, -0.001837f, 0.036972f, -0.000292f, 0.029170f, 0.002352f, 0.007237f, 0.002077f, -0.016734f, -0.025220f, 0.030362f, 0.003302f, -0.011499f, 0.021689f, -0.045174f, 0.019027f, 0.029522f, -0.003392f, 0.009252f, 0.013579f, -0.006330f, -0.003863f, 0.018501f, -0.006153f, 0.027730f, -0.025190f, 0.014768f, 0.033944f, -0.035100f, 0.001956f, -0.016311f, 0.021597f, 0.009639f, 0.017976f, -0.017386f, -0.013710f, 0.000536f, 0.045589f, 0.001270f, + 0.023253f, -0.009382f, 0.001761f, -0.002349f, -0.003661f, -0.019284f, -0.000450f, -0.004858f, 0.009497f, -0.008181f, -0.012739f, -0.010152f, -0.000594f, -0.003033f, 0.020605f, 0.004283f, -0.011119f, -0.009458f, -0.010262f, -0.003029f, -0.004865f, 0.034078f, 0.001489f, 0.017495f, 0.001135f, -0.007238f, -0.007352f, 0.028459f, 0.020549f, -0.007225f, -0.026280f, 0.015484f, 0.009889f, -0.056795f, 0.003016f, 0.033196f, 0.031250f, 0.008115f, 0.024673f, -0.033974f, 0.056269f, 0.005749f, 0.010161f, 0.012066f, 0.026282f, -0.001189f, -0.025290f, -0.006159f, -0.029725f, 0.034715f, -0.014367f, 0.017062f, -0.034443f, -0.027705f, 0.023869f, 0.019870f, 0.049539f, -0.018223f, -0.013548f, -0.009534f, 0.009110f, -0.021865f, -0.002812f, 0.007578f, -0.001705f, 0.026084f, 0.017115f, -0.022272f, 0.001821f, 0.005466f, 0.015431f, -0.025325f, 0.025676f, -0.001325f, 0.011416f, -0.005267f, -0.011639f, -0.026628f, 0.009207f, -0.005447f, -0.010623f, 0.004128f, -0.015482f, -0.016388f, -0.003097f, 0.006941f, 0.031555f, -0.047504f, -0.027556f, -0.026190f, -0.027515f, -0.009194f, 0.032963f, -0.020365f, -0.000118f, 0.030486f, + -0.003795f, -0.015692f, -0.026576f, -0.008839f, -0.010759f, -0.058458f, -0.042992f, -0.013983f, 0.011417f, -0.006992f, 0.011567f, -0.014265f, -0.007329f, 0.025419f, 0.018380f, -0.030229f, -0.012430f, -0.033695f, -0.010080f, 0.000756f, 0.015740f, -0.007660f, 0.006833f, -0.029258f, -0.017826f, -0.022015f, 0.004071f, 0.002420f, 0.007185f, -0.028004f, 0.007250f, 0.033242f, 0.018464f, -0.024581f, 0.004503f, -0.002816f, 0.056079f, 0.006020f, 0.026884f, -0.023574f, -0.016188f, -0.005865f, -0.026776f, -0.016919f, -0.025901f, -0.011988f, -0.016923f, 0.030460f, 0.007309f, 0.007635f, 0.031068f, -0.000908f, -0.002234f, 0.014146f, 0.027837f, 0.044196f, 0.031849f, -0.006730f, -0.012582f, -0.051067f, 0.013435f, 0.015881f, 0.005553f, -0.031904f, 0.036029f, 0.014527f, 0.020807f, -0.006182f, 0.001189f, 0.020707f, 0.044984f, 0.044499f, 0.024777f, 0.005163f, 0.046645f, 0.000950f, -0.015432f, 0.015161f, 0.027664f, 0.023126f, 0.041542f, 0.022230f, -0.000553f, 0.004641f, -0.027558f, 0.010621f, -0.066554f, -0.011817f, -0.008467f, 0.013528f, 0.048755f, 0.027673f, 0.005149f, 0.035856f, -0.029462f, -0.025674f, + 0.002351f, -0.064408f, -0.018240f, 0.000764f, 0.008435f, 0.012384f, 0.012496f, -0.006394f, 0.022795f, 0.000275f, 0.008521f, 0.047057f, -0.038735f, -0.020513f, -0.019596f, -0.042835f, -0.013091f, 0.008393f, 0.033417f, 0.060723f, -0.023568f, 0.001497f, 0.010650f, -0.010652f, 0.056574f, 0.010263f, -0.026744f, 0.049256f, -0.009284f, -0.016131f, 0.035869f, -0.031531f, -0.017701f, 0.002352f, 0.003997f, 0.004539f, 0.023910f, 0.012410f, 0.019630f, -0.005599f, 0.010932f, 0.028113f, 0.002815f, 0.019148f, 0.004658f, 0.000717f, 0.032193f, -0.040544f, -0.013468f, -0.013832f, 0.028277f, -0.020783f, -0.004015f, -0.012348f, 0.028127f, -0.011574f, 0.060911f, 0.043195f, -0.038979f, 0.019520f, -0.047078f, 0.006613f, 0.019243f, 0.009050f, 0.012253f, -0.062498f, -0.010223f, -0.060345f, 0.009834f, 0.004358f, 0.009287f, -0.010081f, -0.008748f, 0.027925f, -0.049449f, 0.017020f, -0.020025f, -0.098123f, -0.033943f, -0.032719f, 0.018692f, -0.015105f, 0.017699f, 0.047718f, 0.055094f, 0.028369f, 0.030854f, 0.024255f, 0.011429f, -0.039916f, 0.045388f, -0.002298f, 0.016817f, -0.075512f, -0.034227f, -0.025122f, + 0.015877f, -0.057174f, 0.022699f, -0.033477f, 0.051705f, -0.056804f, -0.072648f, -0.014319f, -0.009108f, 0.060015f, 0.030026f, 0.027750f, -0.013355f, 0.008634f, -0.034404f, -0.027054f, 0.008321f, 0.014129f, -0.044802f, -0.041196f, -0.028663f, -0.001854f, 0.025000f, 0.018893f, -0.030968f, -0.039003f, -0.022214f, -0.022113f, -0.054093f, -0.029964f, 0.026307f, -0.013241f, 0.001299f, -0.005325f, 0.019771f, 0.031169f, -0.005874f, -0.080962f, 0.036938f, 0.072430f, 0.027764f, 0.001184f, -0.082019f, -0.017153f, 0.038311f, -0.007462f, 0.095407f, -0.006890f, -0.073678f, 0.015727f, -0.010911f, 0.009702f, 0.003899f, -0.011440f, 0.022089f, 0.028989f, -0.077818f, -0.017089f, 0.006155f, 0.032714f, -0.013078f, -0.035662f, 0.037751f, 0.009027f, -0.025608f, -0.073320f, -0.091028f, -0.040496f, -0.005608f, 0.014887f, 0.072336f, 0.114018f, 0.045977f, 0.005181f, 0.138866f, 0.127380f, -0.055447f, 0.065440f, 0.057994f, -0.017956f, -0.011111f, -0.032073f, -0.017685f, -0.037496f, -0.026419f, 0.105300f, -0.006819f, 0.060717f, -0.000229f, 0.001534f, -0.000126f, -0.043649f, 0.009124f, 0.007160f, -0.093465f, 0.012187f, + 0.021562f, -0.050354f, -0.011007f, -0.016702f, -0.007432f, 0.011973f, -0.003516f, 0.001051f, 0.040060f, 0.014713f, -0.020519f, 0.010695f, 0.064368f, -0.000852f, 0.029369f, -0.003591f, 0.023910f, -0.037890f, -0.043753f, -0.026351f, -0.079868f, 0.019054f, 0.008549f, -0.037605f, -0.096823f, -0.065459f, -0.090458f, 0.063261f, -0.046974f, 0.007650f, 0.016276f, 0.012192f, 0.012649f, 0.067264f, -0.067277f, -0.002690f, -0.037461f, 0.070973f, -0.166072f, 0.030625f, 0.013620f, 0.049412f, 0.049475f, -0.004054f, -0.014139f, -0.030347f, -0.005829f, -0.054026f, 0.037403f, 0.091424f, -0.005444f, 0.011761f, 0.063050f, -0.043087f, -0.040591f, 0.062456f, -0.110538f, 0.085516f, -0.042399f, -0.027862f, -0.015602f, 0.012890f, -0.028164f, -0.020503f, 0.041787f, -0.005481f, -0.073913f, 0.033102f, 0.000562f, 0.019823f, -0.012431f, 0.076367f, -0.052099f, 0.008346f, 0.034744f, -0.014018f, 0.027667f, -0.040930f, 0.009390f, -0.034302f, -0.014910f, 0.050138f, 0.011243f, 0.023890f, -0.019318f, 0.048858f, -0.006528f, -0.013349f, 0.022066f, -0.019428f, -0.015812f, -0.007193f, -0.008389f, -0.037025f, -0.052733f, -0.009372f, + 0.038736f, 0.007653f, -0.012154f, -0.051358f, 0.008633f, -0.038879f, 0.003432f, 0.026364f, -0.039188f, -0.003383f, 0.040656f, 0.042445f, 0.031998f, -0.048513f, -0.019604f, 0.047983f, 0.020425f, 0.007979f, 0.039795f, -0.177416f, -0.034829f, -0.010920f, -0.075989f, 0.018804f, 0.032868f, 0.006096f, 0.026009f, 0.051932f, -0.011695f, -0.026824f, 0.023040f, -0.021539f, 0.004521f, 0.058009f, 0.000314f, 0.124291f, -0.017304f, -0.035867f, 0.003276f, -0.015010f, 0.060592f, 0.010765f, -0.006957f, 0.058204f, 0.058125f, 0.018920f, 0.021300f, 0.032197f, -0.075822f, -0.041409f, 0.059179f, -0.008847f, -0.062798f, -0.031055f, -0.029795f, 0.041505f, 0.019990f, -0.022411f, -0.090045f, 0.027175f, 0.011117f, 0.011689f, 0.011634f, -0.010363f, 0.006021f, -0.065331f, 0.055717f, 0.041235f, 0.018525f, -0.032283f, -0.031217f, 0.000646f, 0.025961f, -0.005489f, 0.026967f, 0.014444f, -0.073025f, -0.029485f, 0.006975f, -0.068180f, -0.000046f, 0.015095f, -0.065746f, -0.084381f, -0.016773f, 0.028407f, -0.055196f, -0.102270f, -0.051247f, -0.024437f, 0.062444f, -0.037906f, 0.070755f, -0.011862f, -0.003007f, 0.037435f, + -0.002745f, -0.112259f, -0.015846f, 0.011148f, 0.045952f, -0.097239f, -0.154872f, 0.019478f, -0.021393f, -0.080887f, 0.037599f, 0.039529f, -0.021726f, 0.022156f, 0.060470f, -0.056993f, 0.012264f, 0.064604f, 0.028879f, 0.144296f, -0.052137f, -0.054857f, -0.019130f, 0.003392f, 0.137628f, -0.012445f, 0.115092f, -0.070586f, -0.023765f, 0.051849f, -0.076800f, -0.021650f, -0.071816f, 0.018678f, 0.085952f, -0.103528f, -0.033505f, -0.003579f, 0.039791f, 0.004893f, 0.018898f, 0.036107f, -0.000873f, -0.063479f, -0.057056f, 0.009075f, 0.052295f, 0.127367f, -0.019769f, 0.038853f, -0.027606f, 0.065911f, 0.009535f, 0.012993f, -0.009137f, -0.065688f, 0.010217f, 0.072206f, -0.003321f, 0.002270f, -0.016423f, -0.056338f, 0.090881f, 0.037679f, 0.063716f, 0.080035f, 0.005411f, 0.010871f, 0.055056f, -0.110914f, 0.050342f, -0.052500f, 0.149310f, -0.006039f, 0.024235f, 0.028278f, -0.029584f, -0.033295f, 0.025606f, -0.051076f, 0.100633f, -0.042959f, -0.052003f, -0.056422f, 0.106450f, 0.041825f, 0.068838f, 0.000193f, 0.070443f, 0.069030f, -0.035835f, 0.004639f, -0.025261f, 0.020381f, 0.012084f, -0.103537f, + 0.070471f, -0.073612f, 0.008605f, -0.033901f, 0.026912f, -0.002810f, 0.038450f, -0.006151f, -0.034162f, 0.058130f, -0.020927f, -0.007873f, 0.008279f, -0.024030f, -0.021843f, 0.067277f, -0.016551f, -0.008758f, -0.008662f, -0.002937f, 0.029811f, -0.022844f, 0.006277f, -0.016496f, 0.014306f, -0.014252f, -0.012486f, -0.035116f, 0.051340f, -0.031575f, 0.016188f, 0.009342f, 0.035080f, -0.039864f, 0.007786f, -0.015637f, 0.039828f, 0.006567f, 0.001781f, 0.033875f, 0.008157f, -0.052800f, -0.009644f, -0.007885f, 0.013319f, 0.025167f, 0.018017f, -0.047632f, 0.019206f, -0.035516f, 0.024351f, -0.019454f, 0.003589f, -0.010340f, 0.023884f, -0.008254f, 0.005399f, -0.053049f, 0.010838f, 0.028791f, -0.027422f, 0.027142f, 0.001213f, 0.011371f, 0.013423f, -0.020008f, 0.035986f, 0.017134f, -0.003929f, -0.010059f, 0.017263f, -0.010238f, 0.034629f, -0.029198f, -0.004532f, -0.027508f, -0.043452f, 0.086600f, 0.006871f, 0.010538f, -0.035182f, -0.026040f, -0.055630f, 0.036623f, -0.015886f, -0.011703f, -0.024393f, -0.001373f, -0.021786f, -0.003101f, -0.003208f, 0.009268f, 0.010480f, -0.002153f, -0.002946f, -0.016162f, + 0.014264f, 0.013222f, -0.013397f, 0.005672f, -0.029940f, 0.011312f, 0.005383f, -0.005658f, -0.004957f, -0.010355f, 0.009057f, 0.001583f, -0.021415f, -0.006153f, -0.006530f, -0.017979f, 0.028318f, 0.002501f, -0.018659f, 0.002290f, -0.007521f, 0.024462f, -0.009005f, -0.012203f, 0.004510f, -0.015432f, 0.028826f, 0.000305f, -0.016446f, 0.004074f, -0.006891f, 0.013709f, -0.018703f, -0.004207f, 0.005756f, -0.007255f, 0.012507f, -0.007879f, 0.003415f, 0.005211f, -0.016873f, 0.001701f, 0.016213f, -0.025848f, -0.001910f, 0.006965f, -0.023617f, 0.041879f, -0.039168f, 0.018649f, 0.006948f, -0.023205f, 0.044116f, -0.031136f, 0.007516f, 0.004011f, 0.019997f, -0.093506f, -0.215416f, 0.056111f, 0.198816f, 0.168002f, 0.225606f, -0.111710f, -0.144588f, -0.217378f, -0.222080f, 0.014894f, 0.165119f, 0.182218f, 0.199773f, 0.066144f, -0.043760f, -0.159071f, -0.262945f, -0.144326f, 0.066623f, 0.103149f, 0.175021f, 0.132419f, 0.036102f, -0.023947f, -0.055521f, -0.132015f, -0.085434f, -0.081561f, -0.015024f, 0.068923f, 0.106172f, 0.055536f, 0.070847f, 0.035469f, -0.040097f, -0.006672f, -0.085606f, -0.119469f, + -0.020450f, -0.028201f, 0.020925f, 0.111861f, 0.064660f, 0.055305f, 0.016433f, -0.042505f, -0.043331f, -0.037760f, -0.061644f, -0.016582f, 0.002753f, 0.026019f, 0.032297f, 0.053303f, 0.015383f, -0.002282f, -0.027022f, -0.050373f, -0.004146f, 0.017684f, 0.018657f, 0.031239f, -0.007802f, -0.025281f, -0.011746f, -0.025172f, -0.019309f, 0.005560f, 0.014780f, 0.040948f, 0.035180f, 0.034066f, 0.003686f, -0.014302f, -0.060203f, -0.041094f, -0.003967f, -0.002504f} + }, + { + {0.020249f, 0.008776f, 0.009484f, 0.000073f, -0.003806f, -0.009247f, -0.003374f, -0.006663f, -0.006940f, 0.001440f, -0.005649f, -0.003511f, -0.000952f, 0.005654f, -0.000415f, 0.001909f, -0.006101f, -0.003127f, -0.007244f, -0.011766f, 0.006374f, 0.004600f, -0.004967f, 0.002559f, -0.003041f, -0.000623f, 0.007413f, -0.004352f, -0.000865f, -0.005601f, -0.003495f, 0.002938f, 0.004028f, 0.005674f, 0.004976f, -0.007998f, 0.001103f, 0.004212f, 0.000127f, 0.006028f, 0.000775f, 0.001878f, -0.006329f, -0.003385f, 0.001092f, -0.001790f, 0.001516f, 0.000503f, -0.003799f, 0.006675f, 0.004629f, -0.008090f, -0.000344f, -0.000441f, 0.002056f, 0.006981f, 0.002837f, -0.007655f, 0.001110f, 0.002649f, -0.005710f, 0.002140f, 0.002646f, -0.001057f, 0.003033f, -0.000809f, -0.001542f, -0.000643f, -0.004581f, -0.000970f, -0.001860f, -0.003502f, -0.000643f, 0.000066f, -0.000563f, -0.001215f, -0.001935f, -0.010394f, -0.009177f, 0.011250f, -0.002396f, 0.008971f, 0.002553f, 0.013378f, -0.003221f, -0.007018f, -0.004881f, 0.008154f, 0.000136f, -0.003046f, -0.000892f, 0.009235f, -0.002571f, 0.001636f, 0.003158f, -0.006287f, + -0.004854f, -0.002077f, 0.001606f, -0.006516f, 0.001536f, 0.001280f, -0.007619f, -0.002473f, -0.004608f, 0.000605f, -0.003403f, 0.001176f, 0.012113f, 0.006255f, -0.003710f, 0.000567f, -0.005948f, 0.004451f, -0.001704f, 0.007230f, -0.015155f, -0.001646f, 0.002171f, -0.005333f, 0.000804f, 0.007292f, 0.005390f, -0.006732f, -0.005168f, -0.005397f, -0.001188f, -0.004260f, -0.002373f, -0.006539f, 0.002319f, -0.000517f, -0.007837f, -0.003873f, -0.003304f, -0.000293f, 0.001331f, -0.001557f, -0.001055f, 0.003409f, 0.001010f, -0.003450f, 0.001565f, 0.008297f, -0.004535f, -0.000881f, -0.009160f, -0.003116f, -0.001189f, 0.003829f, -0.004335f, 0.001174f, 0.000611f, 0.000558f, 0.014554f, -0.004728f, 0.005094f, 0.012246f, -0.008983f, -0.010224f, -0.001037f, -0.002176f, 0.000418f, 0.006477f, 0.003884f, -0.014425f, 0.002893f, -0.008069f, -0.011211f, -0.000271f, 0.004895f, 0.005157f, -0.003261f, -0.000018f, -0.000670f, 0.006889f, -0.000732f, 0.005747f, -0.001859f, 0.001085f, 0.001771f, 0.002074f, -0.006836f, 0.003604f, 0.006402f, -0.002242f, 0.007997f, -0.003612f, -0.000149f, -0.008732f, 0.007198f, 0.002105f, + -0.001751f, -0.006672f, -0.006373f, -0.002753f, -0.001709f, 0.004020f, -0.000061f, 0.003531f, 0.003782f, -0.005872f, 0.004690f, -0.008044f, 0.003809f, 0.005394f, 0.010166f, 0.009477f, -0.006969f, 0.004305f, 0.000339f, -0.001610f, 0.006354f, -0.003741f, -0.004104f, -0.003313f, 0.005406f, 0.002678f, 0.006803f, -0.005352f, 0.009799f, -0.002401f, 0.000620f, 0.003091f, 0.002577f, 0.005588f, -0.002721f, 0.007748f, 0.010480f, 0.016508f, 0.008330f, -0.017160f, -0.018456f, 0.002121f, -0.001468f, 0.004398f, 0.004166f, 0.012201f, 0.005598f, 0.005808f, 0.003042f, -0.006013f, 0.002402f, 0.015377f, -0.010201f, -0.001223f, 0.000599f, 0.012305f, 0.007585f, 0.001630f, 0.005639f, -0.001092f, 0.004402f, 0.005580f, 0.012863f, 0.006888f, 0.007310f, 0.003667f, 0.003250f, 0.006004f, 0.002451f, -0.009051f, 0.005653f, 0.007083f, -0.002366f, 0.005067f, 0.007262f, -0.002717f, 0.002470f, 0.008465f, 0.003515f, -0.002434f, 0.003441f, 0.008588f, -0.000148f, -0.000481f, -0.001436f, 0.002036f, 0.008721f, -0.002930f, -0.004360f, 0.001925f, -0.002518f, 0.003887f, 0.005665f, -0.006826f, 0.001772f, -0.004675f, + 0.000785f, 0.001845f, 0.007543f, 0.005021f, -0.014300f, -0.000893f, 0.007841f, -0.004733f, -0.005550f, -0.000238f, 0.001837f, 0.006093f, 0.000180f, -0.017212f, -0.006005f, 0.003502f, -0.003303f, 0.005507f, -0.000633f, -0.031693f, 0.003988f, 0.002822f, 0.014202f, -0.000979f, 0.011008f, 0.005427f, 0.002519f, -0.018764f, -0.000355f, -0.000713f, -0.014604f, 0.001839f, 0.010262f, 0.001574f, -0.000576f, -0.001798f, -0.006044f, -0.006972f, 0.002538f, 0.003725f, -0.000868f, 0.002319f, 0.002908f, 0.012287f, 0.001104f, 0.005158f, 0.005606f, -0.007217f, 0.001088f, -0.002105f, -0.002210f, -0.001394f, 0.004346f, -0.001280f, -0.003566f, -0.005687f, -0.003432f, 0.001060f, -0.009467f, -0.007060f, 0.003461f, -0.007851f, 0.001988f, -0.012521f, -0.014624f, -0.004282f, 0.017214f, -0.005327f, -0.001444f, 0.009700f, 0.003064f, 0.000049f, 0.010683f, -0.002320f, 0.000788f, -0.002185f, 0.002781f, 0.006337f, -0.003305f, -0.011963f, 0.006557f, -0.007370f, -0.012932f, -0.005855f, -0.004106f, -0.001013f, 0.003801f, 0.012289f, -0.000756f, -0.001301f, -0.006234f, -0.001794f, 0.006632f, -0.005239f, -0.005787f, 0.007274f, + 0.027993f, 0.001036f, -0.001562f, -0.010450f, -0.005947f, 0.014823f, -0.005816f, 0.011596f, 0.010022f, -0.011106f, -0.001681f, 0.008721f, -0.006128f, -0.002921f, -0.002778f, -0.003958f, 0.002011f, 0.003199f, 0.000698f, 0.005486f, -0.002270f, 0.000954f, 0.002212f, -0.002143f, -0.005083f, -0.005388f, -0.006015f, 0.000609f, 0.007462f, 0.003274f, -0.005918f, 0.000692f, 0.003091f, 0.013964f, -0.003859f, 0.012517f, -0.011030f, 0.005241f, 0.009199f, -0.005756f, -0.003318f, -0.011365f, 0.005728f, 0.000038f, -0.007769f, 0.008167f, -0.009691f, 0.011406f, -0.000269f, 0.016083f, 0.004020f, 0.001932f, 0.004233f, 0.006836f, 0.003944f, -0.004905f, 0.008283f, -0.001203f, -0.007902f, -0.012815f, -0.003060f, 0.005876f, -0.006016f, -0.003900f, 0.005714f, -0.006914f, 0.015033f, -0.013341f, 0.000678f, 0.009815f, -0.007039f, -0.002430f, -0.013490f, -0.000179f, -0.004407f, -0.001896f, -0.002268f, 0.013397f, 0.023750f, -0.007004f, -0.010425f, 0.002689f, -0.004297f, 0.006531f, 0.021600f, 0.000105f, -0.005064f, 0.006852f, 0.003647f, 0.006395f, 0.003802f, -0.011812f, 0.000346f, -0.010540f, 0.005764f, 0.005081f, + 0.002990f, 0.019806f, -0.001069f, 0.014768f, -0.000519f, -0.000365f, 0.004355f, -0.000122f, 0.015393f, 0.002061f, 0.009623f, -0.003609f, 0.013082f, -0.005969f, 0.006877f, 0.026284f, -0.004508f, -0.006617f, 0.018293f, 0.003917f, 0.011819f, -0.000273f, -0.011786f, 0.003616f, -0.006936f, 0.007970f, -0.014192f, -0.001821f, -0.007555f, 0.007868f, -0.001551f, 0.001662f, 0.013904f, -0.006898f, -0.014829f, 0.004097f, -0.001725f, -0.000598f, 0.011109f, 0.002348f, 0.001077f, -0.005129f, -0.010102f, -0.009883f, -0.004060f, -0.008096f, -0.007041f, 0.008815f, -0.005193f, -0.000505f, -0.004118f, 0.001429f, -0.001070f, 0.008251f, 0.003511f, -0.007845f, -0.014148f, 0.033373f, -0.016439f, 0.012162f, 0.001164f, 0.006344f, -0.007168f, -0.005495f, -0.002865f, 0.007787f, 0.009886f, 0.002622f, -0.004270f, -0.008824f, 0.005718f, 0.009702f, -0.001006f, 0.003502f, -0.004064f, 0.010509f, 0.004428f, -0.017846f, -0.005289f, 0.006613f, -0.000281f, -0.007213f, 0.000438f, 0.009070f, -0.005358f, 0.003507f, -0.011199f, 0.007670f, 0.016063f, -0.005652f, 0.016955f, 0.001194f, -0.002060f, 0.011370f, 0.000424f, 0.001476f, + 0.010601f, -0.020296f, 0.004065f, 0.007004f, 0.009848f, 0.006681f, 0.007917f, -0.008737f, -0.006313f, 0.000340f, 0.004337f, -0.009503f, 0.004386f, 0.010582f, 0.009931f, 0.003991f, 0.028200f, -0.007828f, -0.002292f, -0.011544f, -0.004117f, -0.007291f, -0.010103f, 0.014766f, 0.007066f, 0.014477f, -0.000842f, -0.020971f, 0.014080f, -0.006773f, 0.008441f, 0.007293f, 0.004625f, 0.004930f, -0.015489f, 0.021824f, 0.006581f, -0.040925f, -0.034721f, -0.032170f, 0.005033f, 0.004452f, 0.000806f, -0.000438f, -0.003899f, -0.004181f, -0.000907f, -0.007011f, -0.012740f, -0.009506f, -0.021008f, -0.010382f, -0.011067f, 0.009669f, -0.016528f, -0.008452f, -0.010082f, 0.000592f, -0.001508f, -0.005765f, 0.002658f, -0.003220f, -0.017071f, -0.002262f, 0.012476f, -0.000142f, -0.015399f, -0.014136f, 0.003657f, -0.006922f, 0.010215f, 0.006311f, -0.014632f, 0.010763f, 0.018588f, -0.019042f, -0.019021f, -0.011398f, 0.004736f, 0.013950f, -0.013108f, -0.014015f, 0.004434f, -0.009041f, -0.000406f, -0.003759f, -0.003142f, -0.020727f, 0.001849f, 0.008854f, -0.007425f, 0.004031f, -0.010883f, -0.013330f, -0.012560f, -0.007842f, + -0.020417f, 0.029409f, -0.008568f, -0.004788f, 0.003744f, 0.000749f, 0.004913f, 0.001508f, 0.008001f, 0.001560f, 0.006588f, 0.016591f, -0.027729f, 0.014393f, -0.008458f, -0.008794f, -0.003438f, -0.038526f, 0.029457f, 0.007838f, 0.006339f, -0.007075f, 0.028755f, -0.004456f, 0.013439f, 0.000088f, 0.012035f, -0.017029f, 0.006555f, 0.006948f, 0.002339f, -0.008220f, 0.025383f, -0.006695f, 0.007464f, 0.006232f, 0.026271f, -0.017655f, -0.001634f, 0.007817f, -0.005148f, -0.012782f, 0.007421f, -0.011958f, 0.002613f, 0.003915f, -0.015247f, 0.006203f, 0.000493f, 0.001330f, 0.028599f, 0.018994f, -0.003270f, -0.011328f, -0.010258f, 0.007282f, -0.002493f, -0.016826f, 0.004001f, -0.000720f, 0.004121f, 0.014137f, 0.018390f, -0.012473f, 0.012064f, 0.007642f, -0.010099f, 0.007401f, 0.003720f, -0.012747f, -0.008990f, -0.007503f, 0.012384f, -0.013844f, -0.014554f, -0.033285f, -0.027236f, 0.008485f, -0.006779f, -0.003426f, -0.015538f, -0.025196f, 0.007897f, 0.003897f, -0.003478f, 0.015171f, 0.008181f, 0.018063f, 0.005889f, 0.006354f, -0.004702f, 0.005467f, 0.012263f, -0.009989f, 0.011168f, -0.045756f, + 0.043837f, 0.031727f, -0.011847f, -0.009851f, 0.012392f, 0.000912f, 0.001817f, 0.021365f, 0.015299f, 0.001420f, -0.002278f, 0.009106f, -0.004033f, -0.002136f, 0.006538f, -0.008365f, 0.012304f, 0.008785f, -0.008886f, 0.013338f, -0.000616f, 0.004239f, -0.000186f, -0.019627f, -0.000427f, 0.015829f, 0.016189f, 0.006984f, 0.007337f, 0.009220f, -0.008855f, -0.011154f, 0.005917f, 0.010251f, 0.000303f, -0.003702f, -0.009856f, 0.005363f, -0.002414f, 0.014187f, 0.016195f, -0.000713f, 0.018560f, -0.008267f, 0.020599f, 0.011874f, 0.024683f, 0.002830f, 0.004144f, -0.005796f, -0.009201f, -0.000703f, 0.019056f, 0.031326f, 0.002417f, 0.024207f, -0.009330f, -0.020733f, 0.003496f, 0.009678f, -0.018738f, 0.021508f, -0.006150f, 0.008627f, -0.041982f, -0.016594f, 0.000118f, -0.008381f, 0.008548f, 0.016068f, 0.029743f, 0.008509f, 0.000525f, -0.011537f, -0.024001f, 0.013326f, -0.016209f, 0.032913f, -0.011434f, 0.005576f, 0.025125f, 0.025860f, 0.000149f, -0.011984f, -0.005465f, -0.005509f, 0.003739f, -0.016042f, -0.012181f, 0.016746f, 0.005753f, 0.011402f, 0.013731f, 0.015630f, -0.004151f, 0.010762f, + -0.001332f, 0.012531f, 0.046882f, 0.012326f, -0.019479f, 0.022745f, 0.026226f, 0.002823f, -0.001802f, 0.003048f, -0.009711f, -0.014646f, -0.006359f, 0.026343f, 0.018769f, 0.015389f, 0.023202f, 0.006031f, -0.001244f, -0.007797f, -0.024132f, 0.014115f, 0.016444f, 0.009604f, -0.001702f, -0.001432f, -0.006591f, 0.005567f, 0.024227f, 0.016787f, -0.022048f, 0.018284f, -0.018082f, 0.023973f, 0.007574f, 0.010256f, 0.012822f, -0.001605f, -0.008680f, -0.001445f, 0.012122f, 0.040288f, -0.002610f, 0.021342f, -0.004772f, -0.014753f, 0.024196f, 0.020822f, 0.009017f, 0.007019f, 0.023336f, 0.009593f, 0.007080f, 0.001604f, 0.016092f, -0.007714f, 0.016321f, 0.020880f, -0.023400f, 0.016229f, 0.009354f, -0.005331f, 0.001601f, 0.011333f, -0.009773f, -0.020407f, 0.031373f, 0.007230f, 0.006031f, 0.006345f, 0.018587f, 0.005941f, -0.018727f, 0.020536f, -0.026877f, -0.030739f, 0.002692f, 0.004391f, -0.017428f, -0.005015f, -0.051402f, -0.035592f, -0.027521f, -0.008508f, -0.028345f, -0.013083f, 0.010388f, -0.024475f, 0.017419f, 0.017142f, -0.020938f, 0.027444f, 0.013779f, -0.004293f, -0.003118f, -0.012807f, + 0.000105f, -0.023573f, 0.053352f, 0.016788f, 0.007801f, -0.025830f, 0.005897f, -0.007191f, 0.035022f, -0.006029f, -0.001718f, -0.031412f, 0.031060f, 0.003391f, 0.011557f, 0.011665f, 0.017580f, 0.011908f, -0.008371f, 0.012083f, -0.017160f, 0.017600f, -0.007240f, 0.011030f, -0.027022f, 0.059207f, 0.007006f, -0.025088f, 0.012451f, 0.018517f, 0.010753f, 0.021348f, 0.013822f, -0.024167f, -0.039683f, 0.013673f, -0.003734f, -0.002060f, 0.026700f, -0.002547f, -0.002254f, 0.004412f, 0.024101f, -0.003745f, 0.014869f, -0.008782f, -0.010797f, -0.014251f, -0.018709f, 0.037939f, 0.020656f, 0.015089f, -0.009328f, -0.030782f, -0.038385f, 0.021516f, 0.015322f, -0.012195f, 0.011554f, -0.007592f, 0.002904f, 0.037864f, 0.017544f, -0.007948f, 0.021208f, -0.004305f, 0.011943f, -0.009674f, 0.014039f, -0.024125f, -0.036813f, -0.012788f, -0.015336f, -0.000632f, 0.047328f, -0.034589f, 0.023321f, 0.014648f, 0.011244f, -0.005744f, 0.019837f, 0.010436f, -0.033471f, -0.042591f, -0.014056f, -0.018007f, 0.053073f, 0.039645f, -0.010353f, -0.020085f, 0.000130f, -0.020607f, -0.002895f, 0.040026f, 0.036490f, 0.022483f, + -0.028288f, 0.009625f, -0.021613f, 0.040468f, 0.019851f, -0.000580f, 0.002343f, 0.016107f, -0.019691f, 0.008762f, 0.035448f, 0.022019f, -0.026483f, 0.037037f, -0.009236f, 0.021669f, -0.031679f, -0.011497f, 0.056823f, 0.027183f, 0.033291f, 0.009357f, -0.044759f, 0.015845f, -0.036108f, 0.026238f, 0.070514f, 0.026345f, 0.044660f, -0.017809f, 0.013703f, 0.022013f, -0.000972f, 0.007087f, -0.016698f, 0.006465f, 0.028290f, 0.003435f, -0.006258f, -0.022539f, 0.014516f, 0.012291f, -0.024128f, 0.015277f, -0.008615f, 0.021459f, 0.028260f, 0.031471f, 0.035920f, 0.005963f, -0.026400f, 0.009891f, 0.017350f, 0.002319f, 0.048507f, 0.006931f, -0.054190f, -0.031614f, 0.016305f, -0.011017f, -0.064141f, 0.005433f, 0.028245f, 0.013413f, 0.003497f, -0.002523f, 0.034707f, -0.023275f, -0.032694f, -0.002693f, -0.011367f, -0.028425f, -0.001272f, 0.006547f, -0.018332f, -0.023413f, -0.016543f, 0.006151f, 0.004579f, -0.035097f, 0.012612f, -0.011160f, 0.010461f, 0.052679f, -0.005525f, -0.009190f, 0.033479f, 0.002381f, 0.028599f, -0.015944f, 0.020354f, 0.013576f, -0.020929f, -0.006785f, 0.046135f, 0.005354f, + -0.064963f, -0.029773f, 0.039080f, -0.058147f, 0.031869f, -0.055056f, 0.003647f, -0.009377f, -0.079379f, -0.011043f, 0.034603f, 0.071672f, 0.022260f, -0.011169f, 0.016780f, -0.028393f, -0.010090f, -0.063743f, -0.004297f, -0.043482f, -0.006958f, -0.009987f, -0.030410f, -0.032021f, -0.011220f, 0.017497f, -0.029249f, 0.019069f, 0.035362f, -0.037774f, 0.012739f, 0.011506f, 0.005640f, -0.040131f, -0.006795f, -0.000895f, -0.042246f, 0.010359f, 0.052159f, -0.004466f, -0.077471f, 0.026754f, -0.047054f, -0.118790f, 0.032715f, -0.049361f, -0.061522f, 0.002848f, -0.028499f, 0.008062f, 0.020330f, -0.012051f, 0.030601f, -0.026444f, 0.026687f, -0.021900f, -0.053486f, -0.000117f, 0.037426f, 0.035870f, -0.069290f, 0.009587f, -0.008662f, -0.051894f, -0.014123f, -0.013515f, 0.088747f, 0.043434f, 0.051835f, 0.022310f, 0.022143f, 0.052889f, 0.078353f, -0.021983f, -0.039210f, -0.015252f, 0.100881f, 0.109385f, -0.068805f, -0.028851f, 0.047103f, -0.025434f, 0.017175f, -0.033914f, 0.006278f, -0.034719f, -0.063264f, 0.079407f, 0.008797f, 0.023244f, 0.017886f, 0.005239f, 0.007535f, 0.000087f, 0.013339f, 0.018052f, + -0.061512f, -0.050233f, -0.045384f, -0.041870f, -0.033114f, -0.020847f, -0.018949f, -0.033239f, -0.021132f, -0.028401f, 0.026586f, 0.020995f, 0.008040f, -0.016359f, 0.002553f, -0.063278f, -0.034535f, 0.015159f, -0.059594f, -0.006664f, 0.023584f, 0.046941f, 0.003391f, 0.008106f, -0.024395f, -0.037272f, -0.046384f, 0.033258f, -0.008418f, 0.033069f, -0.123338f, 0.006796f, -0.017734f, 0.013275f, 0.069228f, 0.008696f, 0.008325f, 0.008196f, -0.025290f, -0.024407f, -0.003207f, -0.004345f, -0.070961f, 0.015269f, -0.028413f, 0.061490f, 0.000323f, -0.064132f, -0.093257f, -0.053304f, -0.014413f, -0.059720f, -0.063967f, -0.033990f, 0.043278f, -0.008975f, -0.016753f, -0.027821f, 0.120032f, -0.065000f, 0.047665f, 0.085469f, -0.036269f, 0.014309f, 0.069761f, -0.081275f, 0.007114f, 0.011769f, 0.044685f, -0.091682f, 0.009313f, 0.008487f, 0.035148f, -0.038955f, 0.004946f, 0.018765f, -0.050659f, 0.010045f, 0.000588f, -0.008622f, 0.035405f, -0.007548f, -0.003158f, 0.014338f, -0.001852f, -0.008039f, 0.035463f, -0.026640f, 0.014085f, -0.010362f, 0.013736f, -0.016856f, -0.003523f, -0.020899f, 0.006981f, 0.005011f, + 0.065381f, 0.020065f, 0.035697f, -0.005383f, 0.008344f, 0.043680f, 0.006246f, -0.016114f, 0.032789f, 0.018019f, -0.010518f, -0.056679f, 0.061458f, -0.056633f, 0.019368f, 0.026813f, 0.046404f, -0.056039f, 0.070952f, 0.094815f, -0.039710f, -0.097775f, 0.143324f, 0.044920f, -0.049346f, 0.028481f, -0.045422f, -0.078027f, -0.019983f, -0.015709f, -0.059293f, 0.062672f, -0.087281f, 0.030600f, 0.083212f, -0.048965f, -0.104672f, 0.111537f, -0.027091f, 0.066181f, -0.041653f, -0.032972f, -0.067226f, -0.030174f, 0.041739f, 0.032869f, -0.017170f, -0.021385f, 0.022677f, 0.055267f, -0.022152f, 0.042067f, 0.049621f, -0.033076f, -0.004038f, 0.031212f, -0.006816f, 0.001336f, -0.008987f, 0.004110f, -0.048907f, 0.015161f, -0.010264f, 0.003251f, 0.012695f, -0.008402f, 0.010934f, -0.019002f, -0.041001f, -0.018044f, -0.071903f, 0.010758f, 0.000389f, -0.009095f, 0.013950f, 0.008662f, -0.004269f, -0.014738f, 0.029552f, 0.047865f, -0.048026f, 0.072604f, -0.007662f, 0.011332f, 0.010522f, 0.064461f, 0.028923f, 0.047719f, -0.057254f, -0.012253f, -0.010637f, 0.083553f, -0.075984f, -0.023928f, 0.037260f, -0.000640f, + -0.087811f, 0.008097f, -0.018081f, -0.012834f, 0.040179f, 0.046206f, 0.003221f, -0.030684f, 0.071260f, -0.027505f, 0.118911f, 0.004109f, -0.053947f, 0.002731f, -0.007680f, -0.058766f, 0.122656f, 0.029059f, -0.009249f, -0.101965f, 0.028453f, 0.037975f, 0.023831f, 0.091479f, -0.015379f, 0.022402f, -0.006786f, -0.043918f, 0.024828f, -0.027122f, -0.014923f, 0.020783f, 0.041678f, -0.039875f, 0.047717f, 0.007797f, -0.000881f, 0.096762f, -0.017753f, -0.007832f, 0.071920f, -0.042431f, 0.063617f, 0.029712f, -0.013614f, 0.027758f, 0.027370f, 0.061166f, 0.061525f, 0.020644f, -0.048191f, 0.105975f, -0.102290f, 0.006745f, 0.094622f, -0.047139f, 0.021459f, -0.007639f, -0.011587f, -0.105102f, 0.074312f, 0.023310f, 0.033142f, 0.038566f, -0.022345f, -0.050020f, -0.040581f, -0.028685f, 0.005132f, 0.107834f, 0.000531f, 0.085795f, -0.027292f, -0.057339f, 0.002919f, 0.028655f, -0.051940f, 0.088884f, 0.032891f, 0.047029f, 0.080939f, 0.059878f, -0.089357f, 0.040874f, -0.127865f, -0.147535f, 0.001045f, 0.140396f, 0.079537f, 0.021368f, -0.096050f, -0.318409f, -0.064971f, 0.118986f, 0.111901f, 0.189645f, + -0.017495f, 0.013457f, -0.081176f, 0.068197f, -0.050975f, -0.008907f, -0.032928f, 0.031596f, -0.036963f, -0.001737f, -0.003673f, -0.010279f, 0.007903f, 0.034694f, -0.036579f, 0.015953f, 0.003268f, -0.008873f, 0.000933f, 0.024265f, -0.030729f, -0.008950f, -0.004057f, 0.050709f, -0.051253f, 0.013237f, -0.022094f, 0.033356f, -0.037163f, -0.011360f, 0.013694f, -0.007973f, 0.007959f, -0.025168f, -0.003495f, 0.021388f, -0.005829f, 0.007756f, 0.007977f, 0.003785f, 0.028705f, -0.026549f, 0.018459f, 0.019008f, 0.025874f, -0.004486f, -0.056104f, 0.006268f, 0.008133f, 0.022212f, 0.022738f, -0.005391f, 0.007217f, -0.010952f, -0.024475f, -0.005813f, 0.013656f, -0.006379f, 0.036652f, -0.029921f, -0.007430f, -0.058261f, 0.019006f, 0.004298f, -0.006631f, 0.010657f, 0.013557f, -0.003017f, -0.026415f, 0.006605f, 0.031777f, -0.008525f, -0.000283f, 0.007436f, -0.006364f, 0.015628f, -0.004338f, -0.046033f, 0.112572f, 0.030901f, 0.028019f, -0.014553f, -0.035683f, -0.034282f, 0.010080f, 0.022114f, 0.003696f, -0.000963f, 0.000130f, -0.016078f, -0.002740f, 0.008220f, -0.004109f, 0.003737f, -0.001522f, -0.016084f, + -0.000627f, 0.008499f, 0.013050f, -0.011072f, 0.003368f, 0.008593f, -0.016165f, 0.027266f, -0.016112f, -0.013847f, -0.013944f, 0.004078f, 0.008060f, 0.012886f, -0.013417f, 0.017825f, -0.024880f, 0.017049f, 0.015005f, -0.010593f, -0.000957f, -0.000340f, -0.002703f, 0.013420f, -0.013767f, 0.004551f, -0.004284f, -0.017540f, 0.025730f, -0.013767f, -0.000317f, -0.010050f, -0.003146f, 0.018368f, -0.023102f, 0.010037f, 0.006606f, -0.009571f, 0.008700f, -0.019234f, 0.005909f, 0.008897f, -0.014598f, 0.001026f, 0.008064f, -0.012932f, 0.013827f, -0.018080f, 0.005350f, 0.020084f, -0.028130f, 0.008971f, -0.010713f, 0.002848f, 0.011112f, -0.007505f, -0.004375f, 0.016571f, -0.087039f, -0.203864f, 0.057367f, 0.199040f, 0.136809f, 0.216459f, -0.120920f, -0.128706f, -0.175392f, -0.203003f, 0.004100f, 0.156150f, 0.161353f, 0.168451f, 0.032873f, -0.056027f, -0.110884f, -0.159066f, -0.134835f, 0.010211f, 0.104308f, 0.123741f, 0.111343f, 0.026424f, -0.031075f, -0.019534f, -0.087369f, -0.097732f, -0.041350f, -0.002932f, 0.037254f, 0.081902f, 0.039910f, 0.029532f, 0.040933f, -0.020831f, -0.049105f, -0.008279f, + -0.078366f, -0.036933f, 0.000640f, 0.012130f, 0.059339f, 0.069074f, 0.005941f, -0.010777f, -0.006723f, -0.051441f, -0.014068f, -0.000979f, -0.010845f, 0.017460f, 0.034078f, -0.007556f, -0.002898f, -0.013689f, -0.021564f, 0.004163f, 0.001963f, -0.002545f, 0.038535f, 0.025989f, 0.009572f, -0.001139f, -0.036519f, -0.052829f, -0.041680f, 0.002974f, 0.039363f, 0.033767f, 0.044535f, 0.006306f, 0.001904f, 0.010811f, -0.052897f, -0.028637f, -0.013606f, 0.000698f, 0.002378f}, + {0.020349f, 0.012716f, 0.004800f, -0.000581f, 0.010379f, 0.000762f, 0.000153f, -0.002023f, 0.004059f, 0.008144f, 0.001153f, -0.005362f, 0.007314f, 0.005394f, -0.003062f, 0.000762f, 0.001721f, -0.005434f, -0.003180f, 0.003653f, 0.001179f, 0.007023f, -0.004192f, 0.004185f, -0.005769f, -0.000256f, 0.001542f, -0.005767f, 0.001799f, -0.002682f, 0.005277f, -0.007022f, 0.009761f, -0.001358f, -0.005192f, -0.009347f, 0.003408f, 0.007683f, -0.002749f, 0.001684f, -0.004166f, 0.001969f, 0.005531f, -0.000275f, -0.001935f, -0.001960f, -0.001885f, 0.004686f, -0.004653f, -0.004184f, 0.001251f, 0.002229f, 0.003360f, 0.000406f, -0.003560f, 0.009993f, 0.001182f, 0.001271f, 0.006133f, -0.001918f, 0.002930f, -0.000058f, -0.001757f, -0.000949f, -0.000830f, 0.003408f, 0.006774f, -0.001137f, 0.001716f, 0.001159f, 0.008373f, -0.001620f, -0.003091f, -0.001748f, -0.002791f, -0.003812f, -0.000723f, -0.007978f, -0.005220f, 0.002510f, -0.001869f, -0.002377f, -0.003756f, 0.001180f, 0.008179f, -0.002344f, 0.000282f, 0.001010f, 0.013845f, -0.000072f, 0.002865f, -0.005397f, -0.003612f, -0.001200f, -0.003378f, -0.003745f, + -0.003401f, -0.002324f, -0.003209f, -0.004449f, 0.004200f, 0.006636f, -0.003233f, 0.001159f, 0.000588f, -0.007155f, 0.000544f, 0.000010f, -0.004854f, 0.009985f, -0.004655f, 0.005752f, 0.002500f, -0.001334f, -0.005246f, -0.005031f, 0.005449f, -0.002455f, -0.001486f, -0.007580f, -0.001543f, -0.000544f, -0.003208f, 0.010529f, -0.001792f, -0.000468f, 0.004816f, -0.000567f, -0.008113f, -0.004238f, -0.007066f, -0.004906f, 0.012365f, -0.003105f, 0.013718f, 0.000168f, 0.000086f, -0.002143f, 0.002195f, 0.000806f, -0.007093f, -0.008042f, 0.006817f, 0.000993f, 0.004934f, -0.000220f, 0.005678f, 0.003326f, -0.006605f, 0.000389f, 0.003558f, 0.004582f, 0.001096f, 0.003863f, 0.018380f, -0.000954f, -0.001724f, -0.004147f, -0.009365f, -0.011651f, -0.010629f, 0.001683f, 0.010303f, 0.003904f, 0.013607f, 0.004979f, -0.005543f, 0.002046f, -0.015246f, -0.012826f, 0.006600f, -0.004211f, 0.009119f, -0.000359f, -0.006543f, -0.003016f, 0.017684f, 0.004310f, 0.007718f, 0.000123f, 0.006004f, -0.002119f, -0.001709f, 0.003875f, -0.001970f, -0.007083f, -0.000151f, 0.003217f, -0.000479f, 0.000004f, 0.011376f, 0.007249f, + -0.011414f, 0.000726f, -0.007105f, 0.012896f, 0.007733f, 0.000975f, -0.004050f, -0.004090f, 0.006086f, 0.003645f, 0.009634f, -0.008172f, 0.015075f, 0.018526f, -0.004655f, 0.018057f, 0.000285f, 0.009668f, 0.006029f, -0.002830f, 0.003321f, 0.014537f, -0.001412f, -0.009125f, 0.008366f, 0.003019f, 0.000057f, -0.000737f, -0.001572f, 0.000926f, 0.008268f, -0.005029f, 0.002910f, 0.002384f, 0.004107f, -0.006815f, 0.007201f, 0.001469f, -0.001980f, -0.015978f, -0.012579f, 0.003373f, -0.007298f, 0.004452f, -0.009007f, -0.012679f, -0.011688f, 0.001099f, -0.008823f, 0.007235f, 0.005278f, -0.011331f, -0.002602f, 0.003908f, 0.000672f, 0.004913f, -0.003548f, 0.005091f, 0.006571f, -0.010151f, 0.002744f, 0.002627f, -0.008053f, 0.003991f, 0.000477f, -0.009675f, 0.006458f, 0.005956f, -0.003541f, 0.006550f, 0.000733f, 0.005229f, 0.004987f, 0.001600f, -0.003703f, -0.001466f, -0.011196f, -0.003921f, -0.005692f, 0.005117f, 0.005808f, 0.001741f, -0.017756f, 0.002683f, 0.007141f, -0.004634f, 0.012079f, -0.010757f, -0.013583f, 0.000314f, -0.004186f, 0.003553f, -0.009757f, 0.016656f, -0.001135f, -0.006570f, + 0.001482f, -0.000551f, 0.009676f, -0.001351f, -0.006010f, -0.001192f, -0.004171f, -0.006175f, -0.007038f, 0.002326f, -0.012537f, 0.000369f, 0.000086f, 0.002665f, 0.007726f, 0.001702f, 0.005221f, 0.007900f, -0.007047f, -0.038459f, -0.001855f, -0.005770f, 0.024969f, -0.000643f, 0.000316f, 0.004386f, -0.004935f, 0.012011f, 0.001969f, -0.015317f, -0.008899f, -0.017755f, 0.001627f, -0.002339f, -0.007017f, -0.005966f, -0.007412f, -0.005033f, 0.019051f, -0.010544f, -0.006005f, -0.006465f, -0.016931f, -0.001805f, -0.005216f, 0.004174f, 0.006303f, -0.003653f, -0.001533f, 0.003425f, -0.006213f, -0.002413f, -0.003492f, -0.006736f, 0.004754f, 0.011475f, -0.003007f, -0.003171f, 0.008418f, -0.014236f, 0.006999f, -0.011578f, -0.022751f, -0.014493f, -0.022690f, -0.004272f, -0.013647f, -0.009133f, 0.000576f, 0.007377f, 0.002597f, 0.004983f, -0.004820f, 0.006271f, -0.010709f, -0.003043f, 0.005862f, -0.001043f, 0.008787f, -0.005439f, 0.001386f, -0.008449f, -0.007577f, 0.004519f, -0.014923f, 0.002451f, 0.007560f, -0.013585f, -0.000931f, -0.004369f, -0.008232f, -0.009341f, -0.010087f, -0.003704f, -0.006381f, 0.000053f, + 0.024088f, 0.000381f, -0.013033f, -0.012582f, -0.004092f, -0.009145f, -0.003280f, -0.006853f, 0.002161f, 0.001290f, -0.010155f, -0.006072f, -0.011164f, 0.021996f, 0.009703f, 0.002096f, -0.000799f, 0.011931f, -0.017255f, -0.000245f, 0.000123f, -0.011185f, -0.014387f, 0.013346f, 0.000829f, 0.009501f, -0.014371f, -0.006590f, -0.004590f, 0.005135f, 0.000125f, 0.006309f, -0.009628f, 0.003015f, 0.004957f, -0.011294f, -0.009977f, -0.009863f, 0.003139f, -0.003365f, -0.002151f, 0.009256f, -0.001863f, 0.000844f, 0.001126f, -0.002083f, -0.009663f, -0.006742f, -0.000166f, -0.016287f, -0.009352f, -0.008720f, 0.005651f, 0.002778f, 0.007669f, -0.001891f, 0.004143f, -0.000503f, -0.000215f, 0.007124f, -0.004268f, 0.012648f, 0.003458f, 0.003579f, 0.000051f, -0.004649f, 0.007087f, 0.003666f, 0.012364f, -0.003435f, 0.003942f, 0.005968f, -0.001050f, -0.000100f, -0.010405f, 0.006306f, -0.005946f, 0.027633f, 0.026134f, 0.019369f, -0.007246f, 0.006758f, 0.009554f, 0.005375f, 0.005171f, -0.010432f, -0.009147f, -0.013494f, 0.011021f, -0.012701f, -0.002003f, -0.009396f, 0.014793f, -0.017538f, -0.013179f, -0.006896f, + -0.003245f, -0.009928f, -0.014557f, 0.003420f, 0.000235f, 0.000224f, -0.017538f, -0.009996f, 0.003950f, 0.002953f, 0.004339f, -0.005248f, -0.007264f, -0.000104f, 0.004632f, 0.005892f, -0.005285f, 0.005558f, -0.009529f, -0.003084f, -0.022618f, 0.007416f, 0.002190f, -0.004530f, -0.004667f, -0.017066f, -0.007924f, 0.001295f, -0.004416f, -0.023716f, 0.011929f, 0.004290f, -0.000462f, -0.007042f, -0.005234f, -0.010588f, 0.002562f, -0.004373f, 0.006225f, -0.002423f, -0.003652f, -0.014079f, -0.002847f, -0.002419f, -0.007468f, 0.013122f, -0.010614f, -0.001114f, 0.008349f, -0.005023f, -0.011279f, -0.007964f, 0.009770f, 0.012058f, 0.007291f, -0.003493f, 0.000499f, 0.033923f, 0.011275f, -0.005121f, -0.004134f, 0.011826f, -0.023185f, -0.004465f, 0.018469f, 0.009220f, -0.013175f, -0.000410f, -0.009005f, 0.003483f, 0.014141f, 0.035099f, 0.011420f, 0.027317f, -0.009930f, -0.002144f, -0.026908f, 0.008956f, -0.008017f, 0.007414f, -0.011930f, -0.000712f, 0.000876f, -0.004255f, 0.009318f, -0.004385f, 0.004302f, 0.011699f, -0.009320f, 0.005230f, 0.014762f, -0.004197f, 0.004727f, -0.000075f, 0.005730f, 0.008153f, + 0.008139f, -0.045370f, 0.016203f, -0.005334f, -0.021569f, -0.003812f, 0.012564f, 0.003848f, -0.016778f, 0.008715f, 0.012494f, -0.026795f, 0.001706f, -0.007671f, 0.015234f, 0.003423f, 0.012486f, -0.003346f, -0.009826f, -0.018925f, 0.000630f, -0.011555f, 0.034806f, 0.006268f, -0.006377f, 0.011473f, 0.000888f, 0.011035f, -0.028440f, -0.004106f, 0.003635f, 0.008069f, 0.001360f, -0.013731f, -0.002761f, 0.003723f, 0.011696f, -0.040812f, -0.044724f, -0.015561f, -0.003838f, 0.000438f, 0.009045f, -0.019317f, 0.005597f, 0.021951f, -0.013191f, 0.011507f, 0.015075f, -0.011150f, -0.000052f, -0.005625f, 0.018518f, 0.025990f, -0.013022f, -0.015269f, 0.012868f, 0.000893f, -0.013057f, 0.005611f, -0.000189f, 0.002921f, 0.003366f, -0.007156f, -0.005342f, -0.028567f, -0.001866f, -0.008450f, -0.001072f, -0.001227f, 0.018726f, 0.005293f, -0.034831f, 0.000180f, 0.016132f, -0.019208f, 0.004490f, 0.019828f, -0.004926f, 0.006717f, -0.000081f, -0.005715f, -0.013578f, 0.025596f, 0.021357f, -0.017058f, 0.008163f, -0.006609f, -0.001440f, 0.007670f, -0.006383f, 0.006360f, -0.010942f, -0.001608f, 0.021285f, -0.006680f, + 0.003912f, 0.009932f, -0.008301f, -0.018509f, -0.001647f, 0.005746f, 0.002239f, -0.009137f, 0.000052f, 0.004408f, 0.006549f, 0.015613f, 0.008435f, 0.017248f, 0.007449f, 0.003050f, 0.005590f, -0.042199f, 0.049941f, -0.001469f, 0.032618f, 0.003736f, -0.016772f, -0.004085f, -0.009135f, -0.011384f, -0.000284f, 0.002214f, 0.023987f, -0.002234f, 0.016919f, -0.014286f, 0.000565f, 0.005202f, 0.004985f, 0.003122f, 0.021050f, 0.020933f, 0.008576f, 0.004465f, -0.001052f, -0.002475f, 0.000307f, -0.001923f, -0.031287f, -0.009819f, 0.016530f, 0.011080f, -0.002191f, 0.002995f, -0.014023f, 0.009168f, -0.017518f, 0.005475f, 0.031669f, 0.004593f, 0.008052f, -0.023801f, 0.014918f, 0.012981f, 0.004749f, -0.015574f, -0.005828f, -0.006605f, 0.002937f, -0.013898f, 0.017026f, 0.020068f, 0.012988f, -0.000517f, 0.029907f, 0.011143f, 0.043046f, 0.017240f, -0.009413f, 0.035486f, 0.002469f, -0.011682f, 0.026693f, -0.003281f, 0.009993f, 0.016383f, -0.009588f, -0.009283f, 0.024902f, 0.025012f, 0.016485f, -0.020357f, 0.009448f, -0.001001f, -0.007634f, -0.018364f, 0.013465f, 0.018415f, 0.012207f, -0.021862f, + 0.032563f, -0.007430f, -0.018996f, 0.008424f, 0.014933f, -0.011942f, -0.005492f, -0.026984f, 0.013348f, -0.008816f, -0.002127f, -0.024531f, -0.010235f, -0.007149f, -0.003212f, -0.010046f, 0.007449f, -0.003483f, -0.005235f, 0.008044f, 0.009883f, 0.017196f, 0.016169f, -0.004529f, -0.004249f, -0.019158f, 0.009483f, 0.002447f, 0.015051f, 0.005912f, 0.004837f, -0.002657f, 0.006659f, -0.011035f, -0.010134f, 0.008466f, 0.004221f, 0.008618f, -0.024774f, 0.010996f, 0.017891f, 0.002365f, -0.021734f, -0.021243f, -0.017520f, -0.052163f, 0.008692f, -0.003672f, 0.027424f, -0.010253f, 0.022925f, 0.009858f, 0.002400f, 0.031256f, 0.005203f, -0.000296f, 0.021250f, 0.010631f, -0.026970f, -0.010632f, 0.004130f, -0.005566f, -0.015011f, -0.006179f, 0.036571f, 0.020026f, -0.016216f, 0.001593f, -0.008926f, -0.000926f, 0.005606f, 0.028961f, 0.000436f, -0.003753f, 0.031746f, 0.014957f, -0.021085f, -0.004299f, -0.004599f, -0.001617f, -0.000111f, 0.061049f, 0.011262f, 0.023127f, -0.009092f, 0.020339f, 0.040032f, -0.031753f, 0.051577f, 0.030869f, -0.011784f, 0.001649f, 0.004660f, -0.016803f, -0.028503f, 0.003236f, + -0.015794f, -0.025774f, -0.010334f, 0.003511f, 0.001813f, -0.002209f, -0.010290f, -0.000946f, -0.009928f, 0.000237f, -0.011722f, 0.000043f, 0.011279f, -0.020137f, 0.013618f, 0.018805f, -0.011813f, -0.011921f, 0.011307f, 0.007891f, 0.000969f, 0.054560f, 0.006980f, 0.036648f, -0.023386f, -0.001636f, -0.028766f, -0.022059f, 0.008007f, -0.022165f, -0.028917f, -0.020268f, -0.021229f, -0.004526f, -0.003545f, -0.025942f, -0.025917f, 0.038263f, 0.009049f, 0.002854f, -0.001794f, 0.019904f, 0.014375f, 0.023791f, 0.001460f, 0.022310f, -0.008328f, 0.004847f, -0.037115f, 0.033389f, 0.021568f, 0.001328f, -0.016897f, -0.004459f, 0.026484f, -0.014482f, -0.012324f, 0.029904f, -0.030007f, -0.023431f, -0.007790f, -0.019152f, -0.005352f, -0.035117f, 0.004578f, -0.022593f, 0.012637f, -0.000364f, 0.002469f, 0.016090f, 0.002545f, 0.010619f, 0.015216f, 0.014621f, 0.011284f, 0.021501f, -0.000052f, 0.013812f, 0.011694f, -0.020036f, 0.027346f, 0.004914f, 0.010998f, -0.018878f, 0.020602f, 0.008144f, 0.013508f, 0.001678f, 0.002769f, -0.005613f, -0.025043f, 0.003002f, 0.009072f, 0.011984f, 0.012565f, 0.000830f, + -0.029945f, -0.019399f, 0.015625f, 0.007750f, 0.000796f, -0.012762f, 0.009585f, -0.012362f, -0.030333f, 0.036309f, 0.020025f, 0.014633f, -0.018979f, -0.010269f, -0.023894f, -0.064709f, -0.006090f, -0.011660f, 0.003587f, -0.017576f, -0.020089f, -0.030524f, 0.000004f, 0.005272f, 0.029475f, -0.030958f, 0.005613f, -0.003507f, 0.010011f, -0.028486f, -0.036008f, -0.023188f, 0.011494f, -0.000919f, -0.047961f, 0.030557f, 0.032494f, -0.013318f, 0.028051f, 0.010754f, -0.039998f, -0.005680f, 0.057454f, -0.006155f, -0.034603f, -0.004083f, -0.001293f, -0.030347f, 0.024682f, 0.006228f, -0.013772f, 0.025656f, 0.018415f, 0.058527f, 0.035898f, 0.002323f, 0.006720f, 0.055201f, -0.011220f, 0.014957f, -0.019340f, -0.030358f, -0.006726f, -0.020265f, 0.007620f, -0.000393f, 0.013694f, -0.000525f, -0.000940f, -0.008044f, 0.045416f, 0.003056f, -0.030349f, -0.025586f, -0.002875f, -0.006011f, 0.002062f, 0.014648f, 0.042069f, 0.025467f, 0.011641f, -0.022853f, 0.033690f, 0.055594f, -0.007941f, 0.025465f, 0.027232f, 0.066683f, 0.016604f, 0.012905f, 0.024216f, 0.028408f, 0.020027f, -0.022755f, -0.017316f, 0.015126f, + -0.035831f, -0.024791f, -0.024005f, 0.027149f, 0.029686f, 0.016198f, -0.000639f, 0.019434f, 0.049131f, -0.025465f, 0.041320f, 0.032381f, 0.004230f, 0.032209f, -0.018875f, -0.005259f, 0.011545f, 0.038639f, 0.068396f, 0.007887f, -0.006624f, 0.007840f, -0.003285f, -0.010490f, 0.002337f, 0.007844f, -0.016320f, -0.021310f, 0.007728f, -0.010631f, -0.006088f, 0.018213f, -0.000735f, 0.034962f, -0.017817f, 0.034348f, 0.016409f, 0.004346f, -0.019380f, 0.007418f, 0.033176f, 0.010807f, -0.017025f, 0.007811f, -0.004208f, 0.002237f, 0.019286f, -0.025700f, -0.014620f, 0.031622f, 0.000272f, -0.005975f, 0.025789f, 0.000257f, 0.008778f, 0.007581f, -0.025671f, -0.044060f, -0.010335f, 0.017636f, 0.028599f, 0.008181f, -0.023310f, 0.031204f, -0.010490f, 0.061409f, -0.031067f, 0.042064f, -0.024445f, 0.016489f, 0.033091f, -0.048378f, -0.053668f, 0.002031f, -0.016254f, 0.016029f, 0.015128f, 0.005026f, -0.009426f, -0.028225f, 0.019003f, -0.001590f, 0.035119f, 0.019868f, 0.032375f, 0.012717f, 0.017722f, -0.004893f, 0.023998f, 0.013632f, -0.018479f, 0.008517f, -0.002369f, -0.052750f, 0.041880f, 0.054895f, + -0.014992f, -0.004676f, 0.017751f, 0.073419f, -0.000363f, -0.047329f, -0.020455f, 0.006681f, 0.006127f, -0.016636f, 0.011989f, -0.012693f, 0.020986f, -0.040507f, -0.000535f, 0.021263f, -0.018441f, -0.019619f, 0.000751f, -0.040076f, -0.014166f, -0.014714f, -0.062486f, -0.053045f, -0.031910f, 0.019606f, 0.023368f, -0.007039f, -0.045258f, 0.002305f, -0.001132f, -0.004016f, 0.005881f, -0.023931f, 0.048497f, -0.017155f, 0.003822f, 0.054131f, -0.052351f, 0.021336f, 0.005658f, -0.019942f, 0.017866f, -0.016077f, -0.043022f, -0.001873f, 0.032019f, -0.018337f, -0.028106f, 0.011687f, 0.001848f, 0.030315f, -0.002619f, -0.054132f, 0.001199f, -0.033308f, 0.047490f, -0.021456f, 0.004667f, 0.009094f, 0.003056f, -0.010707f, -0.035757f, 0.009999f, 0.031262f, 0.006053f, 0.032300f, -0.056128f, -0.031758f, -0.013216f, -0.003788f, 0.000391f, -0.043670f, 0.030225f, -0.010077f, -0.038827f, 0.058338f, 0.002230f, -0.098666f, 0.040326f, -0.013241f, 0.008404f, 0.010442f, 0.014036f, 0.024606f, 0.009650f, -0.017713f, -0.003501f, 0.024676f, 0.017449f, -0.019551f, -0.000116f, -0.015539f, -0.007104f, -0.048656f, -0.005167f, + 0.023391f, 0.030192f, 0.006448f, -0.010391f, 0.032079f, -0.031986f, 0.036515f, -0.019887f, -0.012151f, 0.005707f, -0.011723f, 0.011182f, -0.029686f, -0.038094f, -0.044718f, -0.012646f, 0.022393f, -0.007263f, -0.000373f, 0.028615f, 0.006814f, 0.006443f, -0.001596f, 0.002725f, -0.010155f, 0.002252f, 0.028132f, 0.019858f, 0.029647f, 0.028066f, 0.029647f, 0.023088f, -0.019503f, -0.009404f, 0.006226f, 0.000407f, -0.036797f, 0.026250f, -0.007985f, -0.030782f, 0.040180f, 0.002278f, 0.004910f, 0.001742f, -0.017334f, -0.001947f, 0.015312f, 0.028794f, 0.018692f, 0.004187f, 0.010234f, -0.038938f, -0.009026f, -0.011078f, 0.020536f, 0.011620f, -0.011387f, -0.014921f, 0.134877f, -0.132455f, -0.006654f, -0.143998f, -0.022311f, -0.054733f, -0.006688f, 0.035201f, -0.017875f, -0.039799f, 0.062825f, -0.016918f, -0.010958f, 0.002185f, 0.019368f, -0.002115f, 0.052237f, 0.034738f, 0.020747f, -0.030640f, 0.002093f, -0.020807f, -0.021344f, -0.014039f, 0.000856f, -0.006272f, -0.005670f, -0.017055f, -0.003749f, 0.029282f, 0.003717f, 0.019576f, 0.019275f, -0.001005f, 0.025707f, 0.037709f, 0.002279f, -0.006929f, + -0.019026f, -0.022376f, 0.009650f, 0.010988f, -0.018724f, 0.032407f, -0.041016f, -0.040974f, 0.005269f, -0.013514f, 0.023220f, -0.037635f, 0.017486f, -0.073453f, -0.038976f, -0.058315f, -0.004080f, -0.027710f, -0.001386f, -0.015923f, -0.021041f, -0.017170f, -0.000042f, 0.007866f, -0.056586f, 0.009873f, -0.010431f, 0.010408f, 0.003134f, -0.022819f, -0.044241f, 0.038034f, -0.024436f, 0.000904f, 0.035003f, 0.004268f, -0.000790f, 0.026626f, -0.010571f, 0.112135f, 0.057833f, 0.029362f, -0.023451f, -0.010920f, -0.054023f, 0.015283f, 0.048808f, -0.006277f, -0.007791f, 0.077528f, -0.010310f, -0.014131f, 0.040238f, 0.057322f, 0.012661f, 0.058342f, -0.010808f, 0.010463f, 0.036253f, 0.039543f, 0.062145f, 0.049782f, 0.000733f, -0.019212f, 0.020971f, 0.023415f, 0.023566f, 0.027082f, 0.047354f, 0.023287f, 0.059340f, -0.020131f, 0.001814f, 0.017864f, 0.018519f, 0.048799f, 0.030901f, 0.052062f, -0.033358f, -0.010492f, 0.023611f, -0.038634f, 0.035225f, 0.033117f, 0.034354f, 0.013737f, -0.036535f, -0.014251f, 0.078825f, 0.019519f, 0.054202f, 0.042069f, 0.049587f, -0.009972f, 0.064649f, 0.095367f, + 0.036341f, 0.007353f, 0.070663f, 0.045071f, -0.022759f, -0.017976f, -0.029448f, -0.028640f, 0.031608f, 0.029828f, 0.006123f, -0.031766f, 0.003922f, -0.029853f, 0.002358f, -0.017555f, 0.020085f, -0.067364f, -0.002959f, -0.009016f, -0.035445f, 0.016421f, -0.042672f, 0.072368f, 0.102521f, 0.059832f, -0.027841f, -0.057338f, -0.022361f, 0.050978f, -0.016703f, -0.042616f, 0.075596f, -0.053602f, 0.044336f, 0.026092f, -0.062631f, -0.024996f, -0.008471f, -0.099901f, 0.001728f, 0.011884f, -0.050720f, 0.099165f, -0.036483f, 0.092240f, -0.071412f, 0.010879f, 0.001482f, 0.067808f, 0.095598f, -0.007228f, 0.030223f, 0.047614f, -0.058074f, 0.037733f, -0.077583f, -0.019165f, 0.136441f, -0.006600f, -0.042890f, -0.006184f, -0.082967f, 0.004891f, -0.029405f, 0.089417f, 0.028451f, 0.042558f, -0.018710f, -0.021457f, -0.049291f, -0.038630f, 0.004279f, 0.007493f, -0.006054f, 0.060418f, -0.020887f, 0.013130f, -0.067815f, -0.029479f, 0.032913f, -0.088436f, -0.043813f, -0.025302f, -0.039712f, 0.086149f, -0.003390f, 0.092682f, 0.054994f, 0.030117f, 0.023547f, -0.020203f, -0.060963f, 0.039545f, -0.080311f, -0.045028f, + 0.061008f, 0.066673f, -0.108215f, 0.116961f, -0.001948f, 0.009744f, -0.036204f, 0.094522f, 0.023045f, 0.061096f, 0.023882f, -0.038915f, 0.014592f, 0.034154f, -0.056264f, 0.040715f, 0.001868f, 0.027150f, -0.075420f, -0.005523f, 0.019997f, 0.070921f, -0.028178f, -0.057850f, -0.001281f, 0.070407f, 0.038319f, -0.026608f, -0.059144f, -0.002866f, 0.052011f, 0.006665f, 0.004925f, 0.013994f, 0.038251f, 0.092831f, -0.129595f, -0.021852f, 0.014165f, 0.072556f, 0.017856f, -0.040168f, -0.008261f, 0.027192f, 0.068335f, -0.007453f, 0.004909f, -0.126560f, 0.038103f, 0.018613f, 0.036053f, -0.092424f, 0.082481f, 0.068017f, 0.028041f, -0.042937f, -0.002226f, -0.047609f, 0.036185f, 0.057199f, 0.027127f, 0.025170f, -0.002885f, 0.041964f, -0.063236f, 0.058609f, -0.015741f, -0.026616f, 0.076250f, 0.055033f, 0.007383f, -0.029376f, -0.055983f, 0.035687f, 0.053788f, -0.140387f, -0.001928f, -0.094626f, 0.050376f, 0.011902f, 0.033148f, 0.039211f, 0.056024f, 0.021500f, 0.020052f, -0.022690f, 0.030411f, 0.007635f, 0.066095f, -0.004692f, -0.015660f, 0.052036f, 0.041217f, -0.005842f, 0.006552f, -0.018723f, + 0.003992f, 0.018098f, -0.001485f, -0.010271f, 0.031708f, -0.020156f, 0.006443f, 0.040545f, -0.004656f, 0.024340f, -0.035303f, -0.005716f, 0.008963f, -0.013858f, -0.002378f, 0.006621f, 0.031794f, -0.004973f, -0.042610f, 0.003914f, 0.097069f, 0.021313f, -0.046159f, 0.017066f, -0.047036f, -0.033198f, -0.022069f, -0.005262f, 0.063912f, -0.004549f, -0.042534f, 0.097795f, -0.098905f, 0.019452f, 0.111019f, 0.013000f, 0.079736f, -0.055163f, -0.100744f, 0.036000f, 0.009344f, 0.086326f, 0.010466f, -0.046070f, 0.045626f, -0.009064f, -0.002054f, -0.018691f, 0.003893f, -0.028089f, 0.022850f, 0.005805f, 0.031729f, -0.034386f, -0.020248f, -0.009804f, 0.052314f, 0.020563f, -0.039536f, -0.219107f, -0.475374f, -0.201489f, -0.294556f, -0.421711f, 0.193896f, 0.037861f, 0.102650f, 0.548234f, 0.418233f, 0.234601f, 0.448188f, 0.328377f, 0.038991f, 0.094055f, 0.075573f, -0.243962f, -0.210822f, -0.114836f, -0.360455f, -0.346748f, -0.144812f, -0.188640f, -0.256010f, -0.120158f, -0.104688f, -0.261555f, -0.220145f, -0.038056f, -0.133702f, -0.215969f, -0.086176f, 0.040869f, -0.160442f, 0.021491f, 0.191668f, -0.036953f, + -0.048611f, 0.265068f, 0.210160f, -0.030494f, 0.316239f, 0.366689f, 0.139936f, 0.343616f, 0.493428f, 0.284804f, 0.248338f, 0.593082f, 0.473217f, 0.348802f, 0.420961f, 0.559709f, 0.193013f, 0.064940f, 0.229533f, -0.206658f, -0.558066f, -0.411359f, -0.614235f, -0.993089f, -0.884557f, -0.942476f, -1.087174f, -1.112119f, -0.951825f, -0.832858f, -0.825504f, -0.582218f, -0.244430f, -0.163321f, 0.001863f, 0.313772f, 0.578457f, 0.611424f, 0.730503f, 0.614709f, 0.402061f} + }, + { + {-0.000246f, -0.000125f, 0.000592f, -0.012374f, 0.002214f, -0.000343f, 0.000393f, -0.007583f, 0.002277f, -0.013588f, -0.007281f, 0.003431f, -0.002907f, 0.004367f, 0.007197f, -0.004373f, 0.005096f, -0.006870f, -0.000749f, 0.006236f, -0.001860f, 0.003853f, -0.010508f, 0.001281f, -0.000024f, 0.003145f, -0.002468f, 0.003660f, -0.005238f, -0.002844f, 0.003683f, -0.009042f, 0.002679f, 0.002601f, -0.002939f, -0.004941f, 0.013041f, -0.003018f, 0.003506f, -0.005229f, -0.001820f, 0.001758f, -0.010830f, -0.007003f, -0.005797f, -0.004128f, -0.005221f, -0.005334f, -0.000098f, 0.000268f, -0.005093f, 0.001782f, 0.000363f, 0.005152f, -0.004259f, -0.002033f, -0.000488f, 0.002273f, -0.002616f, -0.007328f, 0.007933f, 0.006107f, 0.003430f, -0.002293f, 0.003225f, 0.000714f, 0.004980f, -0.006074f, -0.011528f, -0.009813f, 0.001294f, -0.006024f, 0.004277f, 0.009353f, 0.002070f, 0.006179f, -0.016268f, 0.009110f, -0.012446f, 0.001143f, -0.005450f, -0.001941f, 0.004415f, -0.007863f, -0.013966f, -0.003841f, 0.000862f, -0.008188f, -0.004806f, 0.006271f, -0.004216f, 0.002705f, -0.017389f, -0.001837f, 0.011307f, 0.005793f, + -0.019409f, -0.006973f, -0.005281f, -0.005472f, 0.006214f, -0.003185f, -0.010217f, -0.006661f, -0.007367f, -0.007659f, 0.012386f, 0.003537f, 0.007903f, -0.005679f, 0.010459f, 0.009283f, 0.006707f, -0.004265f, -0.009256f, -0.007547f, 0.000563f, 0.001370f, 0.014340f, 0.004705f, 0.002593f, -0.007290f, 0.001418f, 0.000171f, 0.001512f, 0.005291f, 0.003270f, -0.010331f, -0.008510f, -0.004812f, 0.005191f, 0.000746f, -0.001962f, -0.011040f, -0.003314f, 0.003623f, 0.004693f, -0.004778f, -0.001677f, -0.000306f, 0.004995f, -0.001652f, -0.005632f, -0.000581f, 0.000748f, -0.007812f, 0.015237f, 0.000291f, -0.010521f, -0.000774f, -0.001889f, -0.010345f, -0.009354f, 0.010985f, 0.010062f, -0.007815f, 0.006114f, 0.000804f, 0.003215f, -0.026094f, 0.010309f, -0.003686f, -0.017843f, -0.023193f, 0.000748f, 0.017183f, 0.001131f, 0.011237f, 0.000507f, -0.020924f, -0.007223f, 0.002718f, 0.007491f, -0.003446f, -0.001743f, -0.008625f, 0.001243f, -0.001313f, 0.015026f, 0.007931f, 0.003223f, 0.003017f, 0.004098f, 0.005542f, 0.013672f, 0.008629f, -0.012057f, -0.000658f, 0.002799f, 0.003298f, -0.014367f, 0.005060f, + -0.004299f, -0.008671f, -0.002615f, 0.000035f, 0.009754f, 0.002958f, -0.005563f, 0.010390f, 0.015400f, -0.002818f, -0.005991f, 0.004229f, -0.001243f, 0.008972f, 0.008482f, 0.007282f, -0.010541f, -0.007348f, 0.007221f, -0.002576f, -0.002846f, -0.007362f, 0.000574f, -0.011192f, 0.006689f, 0.006974f, 0.007910f, 0.002814f, 0.009161f, -0.009741f, -0.007226f, 0.014362f, -0.000198f, 0.005920f, 0.014573f, 0.013126f, 0.000929f, 0.004914f, -0.011521f, -0.009851f, 0.005240f, -0.002939f, -0.004358f, -0.005529f, -0.005126f, 0.003768f, -0.013265f, -0.007785f, -0.016323f, -0.019667f, -0.003790f, 0.015785f, 0.010185f, -0.006838f, -0.002008f, -0.002579f, -0.003938f, -0.014289f, 0.009860f, -0.003859f, -0.003754f, 0.000511f, 0.006397f, -0.003522f, 0.000424f, -0.000875f, 0.009354f, -0.009191f, 0.009391f, 0.004786f, 0.011296f, -0.004330f, 0.008717f, 0.003485f, -0.005587f, 0.007510f, -0.005517f, 0.004110f, 0.008375f, -0.006893f, 0.008811f, -0.005833f, -0.004369f, -0.001887f, -0.002702f, 0.003915f, -0.002649f, -0.007363f, 0.002676f, -0.006502f, 0.001257f, 0.000139f, 0.000897f, 0.012719f, 0.002604f, -0.003833f, + 0.000088f, -0.006304f, -0.007650f, 0.003103f, -0.001804f, 0.011869f, 0.013127f, 0.004260f, -0.003548f, -0.003178f, -0.000004f, -0.006475f, -0.005871f, 0.005026f, 0.010384f, 0.025694f, -0.010668f, 0.010628f, -0.012889f, -0.010793f, 0.000182f, -0.002872f, -0.002647f, 0.003736f, -0.005360f, 0.011232f, 0.010893f, 0.009428f, -0.002662f, -0.001003f, -0.004705f, -0.011580f, 0.001946f, -0.006862f, -0.001211f, 0.001525f, -0.003853f, 0.006961f, 0.002635f, -0.000552f, -0.019373f, -0.007858f, -0.012178f, 0.000741f, -0.007939f, -0.012043f, -0.005323f, -0.006509f, -0.007458f, 0.012607f, -0.009731f, 0.008999f, 0.000833f, -0.003125f, 0.004931f, 0.004546f, -0.008715f, -0.002010f, 0.000265f, 0.009909f, -0.000819f, -0.012520f, -0.016367f, -0.016652f, 0.004544f, -0.005751f, 0.000467f, -0.000819f, 0.002571f, 0.006365f, 0.009616f, -0.005959f, -0.003382f, 0.003799f, 0.003380f, 0.001940f, 0.012050f, -0.005894f, 0.007499f, -0.012851f, 0.027003f, 0.004266f, -0.002736f, 0.006313f, 0.002701f, 0.006397f, -0.007353f, 0.000195f, 0.002129f, 0.001116f, -0.001644f, -0.010470f, -0.012201f, 0.002110f, 0.002617f, 0.001120f, + -0.001673f, -0.007194f, 0.004755f, 0.003848f, -0.010985f, 0.013540f, -0.016229f, 0.020675f, -0.001695f, 0.007080f, 0.003314f, -0.000150f, -0.001891f, 0.004459f, 0.019425f, 0.021702f, -0.003806f, 0.004112f, -0.002282f, -0.002801f, 0.003145f, 0.004791f, 0.015006f, -0.001636f, 0.004754f, -0.007219f, 0.008359f, 0.002005f, 0.011888f, 0.005822f, 0.011151f, -0.015462f, 0.006891f, 0.005895f, -0.004646f, 0.000014f, 0.012069f, 0.000217f, 0.001197f, 0.003740f, 0.007440f, -0.002295f, -0.000761f, 0.022866f, 0.011073f, 0.002121f, 0.002311f, -0.004667f, 0.010554f, -0.013679f, -0.019928f, -0.024340f, -0.001305f, 0.012834f, -0.000219f, 0.006376f, 0.017485f, 0.006801f, -0.002948f, -0.006185f, 0.009327f, -0.001927f, 0.022329f, 0.009834f, 0.003287f, 0.002872f, -0.012265f, 0.002273f, 0.008960f, -0.005066f, -0.014156f, 0.001968f, 0.003572f, -0.028590f, 0.004311f, -0.001136f, 0.021516f, -0.014154f, 0.010093f, -0.030363f, 0.013542f, -0.001882f, -0.014861f, -0.016534f, -0.011138f, 0.010468f, 0.008537f, 0.024947f, 0.004382f, 0.009019f, 0.024084f, -0.002911f, -0.015384f, 0.003555f, -0.011552f, 0.004188f, + 0.019914f, 0.004519f, -0.003927f, -0.001167f, -0.002249f, 0.006530f, 0.008556f, -0.000486f, 0.006185f, 0.010653f, -0.004610f, 0.004093f, -0.009860f, 0.000181f, -0.012668f, -0.001153f, 0.003388f, -0.005625f, 0.011901f, 0.008178f, 0.010396f, 0.018760f, 0.002693f, 0.022487f, 0.017983f, 0.009025f, -0.009486f, 0.025658f, 0.012249f, 0.005449f, 0.023247f, -0.001197f, 0.002277f, 0.002984f, 0.008997f, -0.003257f, -0.004350f, -0.013463f, -0.012247f, -0.010306f, 0.002242f, -0.007776f, 0.021103f, -0.009869f, 0.010184f, 0.013424f, -0.004053f, 0.002444f, -0.002597f, -0.001023f, -0.015357f, -0.018552f, 0.013535f, 0.000273f, 0.024932f, 0.001027f, 0.000352f, -0.002205f, -0.004823f, 0.004579f, 0.001059f, -0.012560f, -0.016248f, -0.021891f, -0.011548f, -0.022892f, -0.014671f, -0.007668f, -0.017082f, -0.010584f, -0.007491f, -0.008640f, -0.023102f, 0.016075f, 0.009868f, 0.000863f, 0.008289f, 0.004134f, -0.006462f, 0.028968f, 0.001700f, -0.009537f, -0.005262f, -0.019024f, -0.008417f, 0.021748f, 0.000970f, -0.017440f, -0.017955f, 0.003099f, -0.018169f, 0.006333f, 0.006293f, -0.013534f, 0.000509f, 0.005022f, + 0.000963f, 0.021651f, 0.006263f, -0.008875f, 0.002114f, -0.010728f, 0.010612f, 0.002331f, 0.004735f, -0.024782f, 0.017777f, -0.007866f, 0.007492f, 0.001626f, 0.003599f, 0.005330f, 0.000887f, -0.006265f, -0.000292f, -0.008705f, 0.000412f, -0.018793f, 0.000395f, -0.020239f, 0.029437f, -0.003121f, 0.019163f, -0.011460f, -0.005178f, -0.000568f, -0.012390f, -0.004945f, 0.013368f, 0.003375f, 0.003016f, -0.012912f, -0.000228f, 0.009250f, -0.024697f, -0.000124f, -0.010808f, -0.008576f, 0.017113f, -0.028340f, -0.026955f, 0.006898f, 0.035313f, 0.000871f, 0.003079f, 0.002714f, -0.005756f, 0.019485f, 0.018570f, 0.010945f, 0.004986f, -0.005104f, -0.029345f, 0.017197f, -0.000294f, -0.023119f, -0.007950f, 0.005455f, -0.001674f, 0.000290f, 0.001833f, -0.005470f, -0.023400f, -0.001157f, 0.000322f, -0.004027f, -0.010189f, 0.007013f, 0.019103f, -0.025363f, 0.015149f, -0.009379f, -0.005604f, 0.001733f, 0.011762f, 0.041738f, -0.027751f, -0.006515f, 0.001660f, -0.002392f, -0.005961f, 0.001660f, -0.011420f, 0.003889f, -0.010513f, 0.028865f, 0.008490f, 0.005696f, 0.006435f, -0.005659f, -0.003224f, 0.015502f, + -0.004111f, 0.006988f, -0.014488f, 0.022357f, -0.001189f, -0.015025f, 0.028181f, -0.019003f, 0.011265f, 0.004585f, 0.003584f, 0.022908f, -0.013060f, 0.010191f, -0.006774f, 0.000462f, 0.030387f, 0.002409f, 0.007938f, 0.009052f, -0.005067f, -0.017423f, -0.013696f, 0.002163f, 0.030370f, 0.017288f, 0.003734f, -0.027074f, 0.003904f, -0.014842f, 0.000073f, 0.030491f, 0.029201f, 0.014879f, 0.019726f, -0.017691f, -0.036941f, -0.019182f, -0.026639f, 0.014908f, -0.000307f, -0.004324f, -0.000150f, -0.019942f, -0.006031f, 0.006433f, -0.003842f, -0.007426f, -0.007506f, 0.021774f, -0.001461f, 0.006123f, -0.006195f, 0.014404f, 0.002912f, -0.007832f, -0.017208f, -0.012813f, 0.038882f, -0.001309f, -0.008911f, 0.012854f, -0.022377f, 0.007422f, -0.012860f, -0.038436f, -0.008852f, -0.004543f, 0.011647f, 0.005081f, 0.010205f, 0.003909f, 0.015244f, 0.001262f, 0.000902f, 0.009280f, -0.038217f, -0.005171f, -0.010422f, -0.001783f, 0.003464f, 0.022885f, 0.023869f, 0.009877f, -0.006608f, -0.015293f, -0.022191f, -0.005790f, -0.013231f, 0.004555f, -0.006744f, -0.004735f, -0.014417f, -0.043059f, -0.027851f, -0.005730f, + -0.009584f, 0.023405f, 0.016305f, -0.002727f, 0.039548f, -0.038123f, -0.008263f, -0.013763f, 0.042163f, 0.020835f, -0.012745f, 0.016265f, 0.006622f, -0.015028f, 0.029354f, -0.030396f, 0.016392f, -0.013393f, 0.003265f, 0.004559f, -0.009708f, 0.028710f, -0.018576f, 0.018106f, -0.007281f, -0.039325f, -0.005947f, 0.029572f, -0.016372f, -0.026393f, 0.001147f, -0.002124f, -0.040655f, -0.006374f, 0.017379f, 0.008465f, 0.022844f, 0.017712f, -0.003929f, 0.041363f, -0.008788f, -0.010685f, -0.018853f, -0.016593f, -0.016910f, 0.012661f, 0.015609f, -0.011017f, -0.013741f, 0.006675f, -0.011829f, 0.018712f, -0.003889f, 0.011196f, -0.006081f, -0.008089f, -0.007259f, 0.002204f, -0.022766f, 0.008977f, 0.017569f, -0.001088f, 0.007950f, 0.013320f, 0.012610f, 0.025185f, -0.014933f, 0.011021f, 0.017358f, 0.002638f, -0.035611f, 0.033851f, -0.017562f, -0.047822f, 0.002564f, 0.038093f, 0.048005f, 0.010869f, -0.014465f, -0.010289f, 0.007072f, -0.005804f, -0.004815f, 0.022414f, 0.022763f, -0.007613f, 0.022070f, -0.022520f, -0.000590f, 0.020348f, -0.006283f, 0.024151f, 0.012745f, -0.000600f, -0.027384f, 0.013885f, + -0.004431f, -0.004652f, 0.004142f, 0.000250f, -0.000541f, 0.043568f, -0.017495f, 0.023499f, 0.037919f, 0.026981f, 0.015630f, 0.003076f, -0.020408f, 0.025924f, -0.010112f, 0.024874f, -0.009526f, 0.007885f, -0.021392f, -0.001882f, -0.019965f, -0.012280f, 0.006730f, -0.018534f, -0.002618f, -0.004440f, 0.002567f, 0.022300f, -0.018969f, -0.016140f, -0.003338f, -0.007755f, -0.000655f, -0.015701f, -0.020719f, -0.027401f, 0.007520f, 0.028028f, 0.003002f, -0.011188f, 0.007623f, 0.009577f, 0.024668f, -0.016295f, -0.005981f, -0.001456f, 0.006381f, 0.020325f, 0.008423f, 0.011059f, -0.004051f, 0.004123f, 0.024830f, -0.084627f, -0.040478f, 0.027564f, -0.069174f, -0.048139f, -0.003535f, -0.028558f, -0.019674f, 0.020425f, 0.023530f, 0.006793f, -0.004844f, 0.008118f, 0.068179f, -0.008990f, 0.010554f, 0.025819f, 0.029686f, -0.031898f, -0.016647f, -0.015442f, 0.024926f, 0.027013f, 0.013490f, 0.004435f, 0.025497f, -0.008281f, -0.013375f, 0.017499f, 0.034649f, 0.001792f, 0.010927f, 0.034926f, 0.025894f, 0.020704f, -0.016407f, 0.005998f, 0.010386f, -0.000841f, -0.001010f, 0.022090f, -0.007938f, -0.001169f, + -0.002767f, 0.014455f, 0.000101f, -0.025869f, -0.017245f, 0.004160f, -0.034506f, 0.024870f, -0.008109f, 0.055993f, 0.001663f, 0.030298f, 0.005533f, -0.002268f, -0.019060f, -0.001788f, 0.006500f, -0.024953f, -0.013267f, -0.028977f, -0.004548f, 0.013540f, 0.018446f, -0.009305f, -0.047042f, 0.015930f, -0.008804f, 0.015189f, -0.018225f, -0.019581f, 0.012149f, -0.028709f, -0.025275f, 0.047693f, 0.035262f, -0.014408f, -0.038331f, 0.018085f, -0.019475f, 0.009797f, 0.000616f, -0.018478f, 0.037467f, -0.047394f, -0.000857f, -0.057445f, 0.002586f, 0.048604f, 0.067465f, 0.032598f, -0.010214f, 0.031904f, -0.001143f, -0.002977f, 0.004495f, -0.003897f, 0.017518f, -0.000687f, -0.029800f, 0.003178f, -0.041872f, 0.016579f, -0.012072f, -0.008183f, 0.030217f, 0.000888f, -0.031834f, -0.035551f, 0.009951f, 0.006693f, -0.017083f, -0.013762f, 0.029194f, -0.038496f, 0.001253f, -0.006346f, 0.015699f, -0.008946f, -0.007149f, -0.030220f, -0.012041f, -0.012163f, -0.004311f, 0.025319f, -0.025730f, 0.012169f, -0.001509f, -0.002344f, 0.005545f, 0.012588f, -0.044497f, -0.002150f, 0.008474f, -0.001067f, 0.019524f, -0.011326f, + -0.018094f, -0.005684f, -0.049406f, -0.018826f, -0.019789f, 0.005818f, 0.025455f, 0.038991f, -0.012206f, 0.031963f, -0.039205f, 0.077980f, 0.010003f, -0.000857f, 0.044853f, -0.014264f, 0.042723f, 0.002455f, -0.030463f, -0.000642f, -0.004593f, 0.019848f, 0.013072f, -0.018550f, 0.021498f, 0.000450f, -0.047976f, -0.052192f, -0.004994f, -0.015671f, 0.013047f, -0.002167f, -0.018450f, -0.047016f, -0.041087f, 0.022502f, -0.034964f, -0.007746f, 0.002206f, 0.011173f, 0.002603f, 0.033699f, 0.002800f, -0.016853f, 0.022479f, -0.002854f, 0.003262f, 0.020923f, -0.027412f, -0.001638f, 0.005890f, -0.027766f, 0.016885f, 0.023398f, 0.010052f, 0.020856f, 0.010705f, 0.032208f, 0.008632f, 0.023525f, -0.032844f, -0.009962f, -0.005367f, -0.043646f, -0.000410f, -0.004449f, 0.018179f, -0.002613f, 0.020828f, -0.003156f, -0.025793f, -0.016968f, -0.001675f, -0.040201f, 0.017380f, 0.001587f, -0.008421f, 0.024264f, 0.014401f, 0.020289f, 0.019674f, 0.006870f, -0.003473f, 0.017881f, -0.056392f, 0.017392f, 0.005203f, 0.025340f, -0.012154f, -0.038349f, 0.020791f, -0.006023f, 0.033770f, -0.055268f, 0.029152f, 0.027033f, + 0.098902f, 0.074745f, 0.010096f, 0.021676f, 0.006238f, 0.057437f, 0.001533f, 0.027966f, -0.026144f, 0.068033f, -0.027013f, 0.061701f, -0.002855f, 0.039422f, -0.004682f, 0.027828f, -0.027768f, 0.006684f, 0.013766f, -0.015144f, -0.005101f, -0.008129f, -0.006544f, 0.018415f, 0.000262f, -0.015866f, -0.022072f, -0.033003f, -0.042206f, -0.020184f, -0.007320f, 0.000254f, 0.012933f, -0.035377f, 0.014683f, -0.019479f, -0.030373f, -0.006266f, -0.022325f, 0.009994f, -0.005776f, -0.046062f, -0.011428f, -0.023449f, -0.028267f, -0.029184f, 0.025857f, 0.035264f, -0.074569f, 0.016677f, 0.005824f, 0.020650f, 0.006489f, -0.009448f, 0.043770f, 0.024999f, 0.022326f, -0.062037f, -0.028904f, -0.001040f, 0.013837f, 0.050931f, 0.000268f, -0.007271f, 0.000520f, 0.042942f, 0.036588f, -0.037504f, 0.038703f, 0.002307f, 0.005361f, -0.008202f, 0.018492f, -0.054479f, -0.030659f, 0.023624f, -0.014275f, 0.020124f, 0.033284f, -0.045136f, 0.009395f, -0.027318f, 0.065836f, -0.044634f, 0.035666f, 0.032540f, -0.017269f, -0.068385f, -0.041235f, -0.007879f, -0.020770f, -0.005547f, -0.033243f, -0.050835f, -0.066344f, -0.039644f, + -0.045369f, 0.014380f, -0.039330f, 0.011209f, 0.000674f, -0.007818f, -0.007295f, -0.033180f, -0.012722f, -0.034008f, 0.005243f, 0.023260f, 0.031747f, -0.003159f, -0.013639f, -0.034892f, -0.011134f, -0.000772f, -0.022240f, 0.001376f, -0.029294f, -0.020540f, -0.007521f, -0.029271f, 0.016079f, -0.026360f, -0.069978f, -0.001619f, -0.006148f, -0.025906f, 0.023899f, 0.017843f, 0.027692f, 0.008043f, 0.020708f, 0.046670f, 0.003892f, -0.055146f, -0.016497f, 0.019356f, -0.016367f, -0.046807f, 0.017985f, 0.028645f, 0.005200f, -0.005199f, -0.063759f, 0.045763f, -0.010069f, 0.036086f, -0.043532f, 0.036163f, 0.091928f, -0.015829f, -0.018891f, -0.080452f, 0.028206f, -0.105681f, 0.070882f, 0.026017f, -0.017685f, 0.075831f, -0.006765f, -0.037197f, 0.066822f, -0.024562f, -0.003331f, 0.015141f, 0.023458f, 0.062585f, 0.002636f, -0.003787f, 0.043426f, 0.019685f, 0.036392f, 0.045923f, 0.032955f, 0.004449f, 0.022909f, 0.005109f, -0.002627f, -0.022905f, 0.015227f, 0.024967f, 0.005152f, 0.000224f, -0.026969f, 0.014340f, -0.025417f, 0.031466f, 0.028490f, 0.006903f, 0.033687f, -0.019485f, 0.021779f, 0.037853f, + 0.021684f, -0.046524f, -0.053518f, 0.063279f, -0.007493f, 0.040393f, 0.057748f, 0.003544f, -0.001863f, -0.004006f, 0.009565f, 0.036603f, 0.030287f, 0.005695f, 0.024503f, 0.002347f, -0.033851f, -0.036253f, -0.060451f, 0.003416f, -0.026848f, 0.003259f, 0.028371f, 0.032826f, -0.058115f, 0.007053f, 0.015514f, -0.044512f, 0.001707f, 0.067671f, -0.035557f, -0.030409f, 0.026131f, -0.036025f, -0.003292f, -0.011727f, 0.006683f, -0.038233f, 0.007190f, -0.044104f, 0.087414f, 0.020714f, -0.048435f, 0.017007f, -0.012157f, -0.043057f, -0.050802f, -0.051279f, 0.013673f, -0.003397f, 0.043162f, 0.064977f, 0.030378f, 0.015084f, -0.009288f, 0.021019f, 0.000756f, -0.083738f, 0.034996f, 0.085284f, -0.057766f, -0.060061f, -0.052601f, -0.073219f, 0.050935f, -0.072098f, 0.030625f, -0.000323f, -0.010421f, -0.001244f, -0.024690f, -0.028358f, 0.033836f, -0.074125f, 0.073832f, 0.042494f, 0.008410f, -0.049042f, -0.038093f, -0.032756f, 0.005115f, 0.011789f, -0.032885f, -0.005154f, -0.024731f, 0.051066f, 0.021850f, -0.010277f, -0.003267f, 0.020402f, 0.003101f, 0.023357f, -0.044151f, -0.017918f, -0.005739f, -0.008732f, + -0.041134f, -0.029142f, 0.021886f, -0.076644f, -0.045806f, 0.003961f, 0.086487f, 0.040310f, -0.027854f, -0.004288f, -0.067434f, 0.029401f, 0.102016f, -0.000359f, -0.019908f, -0.020692f, -0.039244f, -0.001683f, -0.043022f, -0.030152f, -0.084217f, 0.016271f, -0.062558f, -0.092463f, 0.019447f, 0.048509f, 0.010452f, 0.011830f, -0.040335f, -0.049663f, -0.014426f, -0.072770f, -0.036945f, 0.017051f, -0.061557f, 0.092351f, 0.016282f, -0.024535f, 0.018176f, -0.046415f, -0.090925f, -0.031216f, -0.070029f, 0.009441f, 0.017824f, -0.026254f, -0.050413f, -0.025792f, -0.031895f, 0.024868f, -0.037540f, -0.014113f, -0.006667f, 0.039055f, -0.031112f, -0.006365f, -0.015641f, 0.009269f, 0.014744f, 0.002127f, -0.014038f, 0.040581f, 0.052189f, 0.033870f, -0.029723f, -0.023444f, -0.081642f, -0.044980f, -0.020102f, 0.020588f, 0.132115f, -0.023307f, -0.000146f, 0.059315f, -0.007016f, 0.025208f, -0.031915f, -0.031761f, -0.026892f, 0.028400f, -0.076584f, 0.000859f, -0.010622f, -0.000466f, 0.065366f, -0.028013f, 0.099770f, 0.009853f, 0.077005f, -0.094108f, -0.024697f, 0.030085f, 0.005918f, -0.035508f, -0.006029f, -0.083344f, + 0.038051f, 0.059070f, -0.044771f, -0.037231f, -0.013286f, -0.040824f, -0.048528f, 0.011309f, 0.013154f, 0.035505f, 0.000747f, 0.030778f, 0.056625f, 0.058382f, 0.038983f, 0.012116f, -0.044755f, 0.002594f, 0.022110f, 0.028529f, 0.045897f, -0.001392f, -0.024839f, -0.037075f, -0.013948f, 0.045230f, -0.020067f, 0.016453f, 0.040429f, 0.001805f, 0.080083f, 0.006962f, -0.052154f, 0.042079f, 0.043349f, 0.010122f, 0.018336f, 0.038124f, 0.005891f, 0.000653f, -0.047927f, 0.099213f, -0.109551f, -0.083137f, -0.093570f, -0.033990f, 0.018512f, -0.058006f, 0.027304f, 0.057345f, -0.018866f, 0.002195f, 0.052866f, 0.013178f, -0.059142f, -0.024429f, -0.046071f, -0.010941f, 0.002229f, -0.001809f, 0.050695f, 0.045964f, -0.013133f, -0.018387f, 0.031077f, 0.072694f, 0.011927f, 0.058194f, -0.056428f, 0.050294f, -0.027105f, 0.010866f, -0.012839f, -0.046461f, -0.023097f, -0.046223f, -0.093253f, -0.093899f, -0.067832f, 0.014221f, 0.175248f, 0.044428f, -0.023770f, -0.052679f, -0.126013f, -0.177596f, 0.040548f, 0.073813f, 0.088830f, -0.018434f, 0.008127f, -0.051977f, -0.090200f, 0.026296f, 0.016998f, 0.029649f, + 0.004831f, -0.075934f, -0.022636f, 0.018705f, -0.014649f, -0.002887f, -0.013704f, 0.099215f, 0.087760f, 0.058788f, -0.004589f, -0.042439f, -0.071415f, -0.047726f, -0.042344f, 0.067795f, -0.010268f, 0.049634f, 0.023419f, 0.023297f, -0.029369f, -0.164577f, -0.112216f, 0.056088f, -0.087969f, -0.030342f, 0.191331f, 0.130748f, 0.099595f, -0.074296f, 0.055307f, -0.051419f, 0.005430f, 0.003898f, 0.029365f, 0.080722f, 0.143968f, -0.054247f, -0.002972f, -0.093517f, -0.073398f, -0.123808f, 0.015918f, -0.004985f, -0.130773f, -0.031853f, 0.088879f, 0.032213f, 0.063155f, 0.081359f, 0.149908f, -0.106830f, -0.060699f, 0.008212f, -0.084681f, 0.034899f, -0.078727f, -0.241100f, -0.225043f, -0.132642f, -0.143697f, -0.041999f, 0.215644f, 0.105658f, 0.222078f, 0.196473f, 0.312222f, 0.220969f, 0.188464f, 0.023691f, -0.094219f, -0.201490f, -0.318650f, -0.271234f, -0.273821f, -0.146508f, -0.075264f, -0.023515f, -0.006568f, -0.000212f, 0.045919f, 0.065379f, 0.175631f, 0.104336f, 0.208826f, 0.134198f, 0.177710f, 0.059982f, 0.171382f, 0.055200f, 0.035150f, 0.035331f, -0.019721f, -0.057854f, -0.131089f, -0.147972f, + -0.270552f, -0.186114f, -0.340449f, -0.268998f, -0.411291f, -0.245094f, -0.198345f, -0.052111f, 0.101350f, 0.052551f, 0.000737f, 0.104366f, 0.226611f, 0.309376f, 0.403805f, 0.487058f, 0.412043f, 0.302934f, 0.374559f, 0.312407f, 0.168317f, 0.076303f, -0.028816f, -0.134624f, -0.314492f, -0.364143f, -0.494686f, -0.626851f, -0.734404f, -0.651958f, -0.585112f, -0.403252f, -0.286759f, 0.102712f, 0.269038f, 0.375690f, 0.469566f, 0.298396f, 0.198381f}, + {0.008274f, -0.003285f, 0.004846f, -0.012740f, -0.001221f, -0.004851f, 0.006044f, 0.001098f, -0.005217f, 0.007805f, -0.006884f, -0.001734f, 0.006210f, -0.002438f, 0.002703f, -0.010549f, -0.001854f, -0.001329f, -0.011036f, 0.001401f, 0.000151f, -0.000373f, 0.003080f, -0.005560f, 0.001310f, -0.002029f, -0.000708f, 0.011497f, -0.001256f, -0.007934f, -0.003791f, 0.000763f, 0.002716f, -0.007655f, 0.001994f, -0.005791f, -0.000128f, -0.002228f, -0.003490f, 0.006315f, 0.006160f, -0.004409f, 0.008160f, 0.008300f, -0.010337f, -0.001738f, -0.001092f, -0.009697f, -0.004175f, -0.006715f, -0.007642f, 0.001699f, 0.001843f, -0.000955f, 0.000874f, 0.003636f, 0.003931f, -0.002167f, 0.001250f, 0.003518f, 0.009760f, 0.005613f, 0.004378f, -0.004932f, 0.000434f, -0.002756f, 0.006093f, -0.006917f, -0.004986f, 0.005359f, -0.003193f, 0.005810f, -0.006740f, -0.003320f, -0.002268f, -0.004094f, -0.022622f, 0.007968f, -0.013016f, 0.006553f, -0.007475f, -0.015034f, -0.025701f, 0.004140f, 0.000460f, 0.006052f, 0.005334f, -0.002115f, -0.002146f, 0.001572f, 0.015085f, -0.011255f, -0.019723f, 0.006096f, -0.008306f, -0.013397f, + -0.000018f, -0.002307f, 0.007818f, 0.002508f, 0.005519f, -0.006227f, -0.001673f, -0.004213f, 0.012876f, -0.003941f, -0.005484f, -0.005035f, -0.002489f, -0.003539f, -0.005421f, -0.005021f, -0.003373f, 0.002208f, 0.000973f, 0.001328f, 0.000327f, 0.003021f, 0.005454f, 0.002435f, -0.005021f, -0.015157f, -0.000201f, -0.010655f, 0.001466f, -0.001080f, -0.004677f, 0.006230f, 0.000486f, -0.000329f, -0.014643f, -0.006384f, 0.002090f, -0.001517f, 0.005313f, 0.000022f, 0.004808f, -0.004614f, 0.002202f, -0.002178f, 0.009474f, -0.003520f, 0.005285f, -0.008394f, -0.007444f, -0.010448f, 0.001343f, -0.002573f, -0.001877f, 0.000052f, -0.002042f, -0.016047f, -0.003386f, -0.002162f, -0.004624f, -0.002100f, -0.005564f, 0.005246f, -0.002277f, -0.001893f, -0.000584f, 0.000093f, -0.000462f, -0.003858f, 0.014005f, 0.009106f, 0.014634f, -0.006915f, 0.014554f, -0.008701f, -0.006304f, 0.005760f, 0.016114f, -0.000315f, -0.010095f, -0.014542f, -0.010707f, -0.001952f, 0.011396f, 0.004645f, 0.003693f, 0.005248f, -0.005366f, 0.008013f, 0.000740f, 0.006024f, -0.003165f, -0.013178f, 0.003328f, -0.009068f, -0.006609f, -0.006310f, + -0.001854f, -0.016727f, -0.001112f, 0.000971f, -0.007400f, 0.015965f, -0.003348f, -0.004897f, -0.006710f, 0.000060f, 0.001360f, -0.006526f, -0.000161f, -0.008039f, -0.003524f, 0.000500f, -0.003833f, 0.011635f, -0.000073f, -0.002741f, 0.005924f, 0.004417f, 0.010070f, 0.004596f, 0.012192f, 0.003522f, 0.009891f, -0.011322f, 0.002634f, 0.009947f, -0.003621f, -0.007778f, -0.011925f, 0.000628f, -0.001098f, 0.018140f, -0.008155f, -0.006267f, 0.001872f, -0.003979f, -0.002936f, 0.009120f, -0.006994f, 0.008781f, 0.004074f, 0.000238f, 0.004527f, -0.005808f, -0.005505f, -0.010224f, -0.010987f, 0.014607f, 0.006963f, 0.005160f, 0.007868f, -0.005066f, -0.003324f, -0.003723f, 0.018481f, -0.007096f, 0.020223f, -0.000659f, -0.005043f, -0.004834f, -0.010581f, -0.011462f, -0.013832f, -0.000856f, -0.003417f, 0.002516f, 0.013541f, -0.001156f, -0.006211f, -0.018776f, 0.000748f, 0.014874f, 0.021972f, -0.010306f, 0.005746f, 0.003978f, -0.005465f, -0.005016f, 0.005808f, 0.020643f, -0.004842f, 0.003161f, -0.001672f, -0.003149f, -0.001834f, 0.009793f, 0.014459f, -0.011047f, -0.005785f, 0.004233f, 0.018927f, 0.002878f, + 0.013440f, -0.011205f, -0.009983f, -0.000940f, -0.001559f, 0.003338f, 0.002961f, -0.000839f, 0.001267f, 0.001189f, -0.004849f, 0.001269f, 0.006063f, 0.003212f, -0.003934f, 0.029189f, -0.020967f, -0.005051f, -0.009024f, 0.001786f, 0.007383f, 0.013736f, -0.014804f, 0.009243f, -0.004261f, -0.015648f, -0.024961f, -0.005557f, -0.010913f, 0.001179f, -0.002868f, -0.010891f, -0.005815f, 0.005130f, 0.005491f, 0.018525f, 0.010056f, 0.009138f, 0.000457f, 0.002439f, -0.010445f, -0.007292f, 0.014793f, 0.011151f, 0.007419f, 0.003089f, 0.006797f, 0.000958f, -0.000507f, -0.013445f, -0.018713f, 0.011492f, -0.005427f, -0.012857f, -0.006423f, -0.008339f, 0.005869f, -0.007439f, 0.014775f, 0.002858f, -0.009534f, -0.005047f, -0.007476f, -0.006637f, 0.006830f, 0.010555f, -0.001698f, 0.006838f, -0.006355f, -0.007065f, -0.000754f, 0.000672f, -0.006809f, -0.003220f, 0.007999f, -0.000843f, -0.004638f, -0.005386f, 0.003800f, 0.004320f, -0.001838f, 0.005352f, -0.000381f, -0.005931f, 0.013894f, -0.003681f, -0.000062f, -0.001043f, -0.020729f, 0.004880f, 0.002672f, 0.005412f, -0.019484f, 0.006023f, 0.001001f, -0.005209f, + -0.010320f, 0.005443f, -0.009830f, -0.001144f, 0.019124f, 0.028601f, 0.014462f, 0.016090f, -0.000371f, -0.006900f, 0.012257f, 0.011103f, 0.005108f, 0.006315f, 0.014462f, -0.001191f, 0.010723f, 0.010497f, 0.014972f, 0.014465f, -0.010403f, 0.009979f, 0.000032f, 0.004057f, -0.009647f, 0.004026f, -0.000648f, 0.010179f, -0.002867f, -0.001763f, -0.006604f, 0.007661f, -0.010649f, -0.008355f, 0.001646f, 0.010689f, 0.006066f, -0.004980f, -0.002343f, -0.000886f, -0.003194f, 0.006860f, -0.012991f, 0.013564f, 0.000632f, 0.016659f, -0.021567f, 0.002581f, -0.019367f, -0.005289f, -0.005730f, 0.006533f, -0.001456f, -0.003464f, 0.005020f, 0.002798f, 0.005998f, 0.009843f, 0.014772f, -0.000521f, -0.010889f, 0.003758f, 0.019614f, 0.005287f, -0.005153f, 0.000063f, 0.012074f, -0.004667f, 0.007249f, -0.004376f, -0.020814f, 0.013365f, 0.010908f, -0.030717f, 0.000323f, -0.006985f, 0.002626f, -0.017320f, 0.001916f, 0.002576f, 0.022495f, -0.018387f, 0.000083f, -0.024590f, 0.005407f, -0.014982f, -0.003704f, 0.000591f, -0.008073f, 0.006712f, 0.003014f, -0.013066f, 0.000150f, -0.000544f, 0.011698f, -0.008062f, + 0.018900f, -0.000614f, -0.016490f, -0.008791f, 0.020140f, -0.002361f, 0.008049f, 0.004934f, -0.003351f, 0.011612f, -0.013365f, -0.013115f, -0.009832f, 0.000884f, -0.012779f, 0.013079f, -0.007469f, 0.008182f, -0.012354f, -0.000708f, -0.015008f, 0.009299f, 0.001375f, 0.011230f, 0.010641f, -0.010666f, 0.019965f, 0.016298f, 0.016097f, 0.002468f, 0.016906f, 0.013089f, -0.014181f, 0.011480f, 0.005952f, 0.000316f, -0.013146f, 0.005247f, -0.011167f, 0.010269f, -0.004734f, -0.009872f, -0.000967f, 0.015633f, 0.006052f, -0.020356f, 0.018420f, -0.002793f, -0.006387f, -0.012469f, 0.018703f, 0.014224f, -0.014012f, 0.010231f, 0.044373f, 0.008232f, -0.000914f, -0.014180f, -0.027389f, 0.008043f, -0.003336f, -0.040560f, 0.037144f, -0.016746f, -0.025460f, 0.006414f, -0.000861f, 0.005764f, -0.000880f, 0.007921f, 0.011295f, 0.001029f, 0.000153f, -0.020260f, -0.000935f, -0.001095f, 0.025778f, -0.003632f, 0.001479f, 0.010125f, -0.003544f, -0.002115f, -0.009314f, 0.022281f, -0.015140f, 0.016389f, -0.002946f, -0.011753f, 0.003250f, -0.013236f, -0.006387f, -0.022118f, 0.004962f, 0.011732f, -0.005378f, -0.010446f, + -0.008252f, 0.015165f, -0.020813f, -0.003948f, -0.009784f, 0.000928f, -0.002167f, 0.004106f, -0.017883f, 0.019692f, -0.024747f, -0.016213f, 0.007995f, 0.004559f, 0.000067f, 0.008401f, -0.012273f, -0.017594f, 0.003497f, -0.003507f, 0.000283f, 0.011267f, -0.010261f, 0.010533f, 0.007246f, 0.023355f, -0.004480f, 0.005444f, -0.000108f, 0.003039f, 0.031109f, 0.005707f, 0.031190f, -0.002738f, -0.007645f, -0.033030f, -0.005251f, -0.007593f, -0.026970f, -0.045737f, 0.012726f, 0.022053f, -0.017377f, -0.009003f, 0.012102f, -0.005967f, 0.026810f, -0.004266f, -0.015834f, -0.010037f, -0.042559f, 0.012861f, 0.003746f, -0.005010f, -0.030153f, 0.005671f, -0.017171f, -0.005541f, -0.015172f, -0.008581f, 0.019875f, -0.021230f, 0.007717f, -0.030834f, 0.018034f, 0.002412f, -0.000468f, -0.009895f, 0.001403f, -0.005267f, -0.017306f, -0.032517f, 0.005238f, -0.001430f, 0.005879f, 0.011503f, -0.008304f, -0.004058f, -0.020721f, -0.011897f, -0.006068f, 0.006792f, 0.005032f, 0.013000f, 0.022859f, 0.016595f, 0.008823f, 0.012155f, 0.003653f, 0.012658f, 0.012581f, -0.014907f, 0.014531f, 0.014834f, -0.004012f, 0.020467f, + -0.002843f, 0.024244f, -0.012256f, -0.031509f, -0.005047f, 0.015332f, 0.019931f, 0.019837f, -0.004632f, -0.043981f, -0.004024f, -0.006652f, 0.001797f, -0.006927f, -0.009021f, -0.001779f, 0.042749f, -0.009409f, -0.010228f, 0.014223f, 0.023063f, -0.001704f, 0.010782f, 0.026570f, 0.019342f, -0.043849f, -0.040090f, 0.000203f, -0.003738f, 0.005745f, -0.017824f, -0.032095f, 0.007738f, 0.025381f, 0.017080f, -0.018763f, 0.030292f, 0.024055f, 0.023037f, -0.038642f, 0.011080f, 0.019781f, 0.001270f, 0.002696f, 0.017370f, 0.039107f, -0.007371f, -0.018495f, 0.012262f, 0.008480f, -0.005091f, 0.020837f, 0.032184f, 0.005394f, 0.033343f, 0.013832f, -0.024462f, 0.002140f, 0.027729f, -0.003664f, -0.010894f, 0.013425f, 0.002655f, 0.004575f, 0.029122f, 0.017572f, 0.010169f, 0.002455f, -0.032974f, -0.035031f, -0.002428f, 0.004275f, 0.009312f, -0.011697f, -0.001032f, -0.010098f, 0.003455f, 0.002819f, -0.012238f, 0.003269f, -0.007286f, -0.003694f, -0.010240f, -0.000674f, 0.021896f, -0.014688f, -0.029923f, -0.007221f, -0.025149f, 0.002891f, -0.008004f, -0.004223f, -0.001295f, -0.074018f, -0.047155f, -0.016145f, + 0.010345f, -0.007060f, -0.020431f, 0.000490f, -0.019971f, 0.047248f, -0.022843f, 0.029317f, 0.046713f, 0.023975f, 0.021698f, -0.022079f, 0.014876f, -0.012384f, -0.025470f, 0.017081f, 0.020660f, 0.012552f, 0.030628f, -0.002691f, -0.004331f, -0.017603f, -0.017640f, -0.015806f, -0.023309f, -0.023155f, -0.016448f, 0.004723f, 0.000171f, -0.003231f, -0.015643f, -0.010180f, -0.022706f, 0.005252f, -0.019979f, -0.018913f, -0.009702f, 0.005218f, -0.002773f, -0.013867f, -0.031887f, 0.000228f, -0.011346f, 0.007262f, -0.037158f, -0.030035f, 0.027457f, -0.008039f, -0.008610f, -0.017459f, -0.011366f, 0.019092f, 0.004510f, -0.008306f, 0.009550f, -0.007081f, 0.010017f, 0.006481f, 0.011799f, -0.014428f, -0.020366f, -0.047743f, 0.000008f, -0.046522f, -0.005971f, -0.040102f, -0.008314f, 0.029762f, -0.007424f, 0.001751f, -0.027271f, 0.050015f, 0.001786f, -0.034677f, -0.029404f, 0.031790f, 0.024904f, -0.021781f, -0.021329f, 0.042384f, 0.026902f, 0.002606f, -0.023953f, 0.004095f, -0.009785f, 0.020778f, -0.014745f, 0.003546f, -0.006022f, -0.003258f, 0.043118f, -0.004748f, -0.011319f, 0.009265f, 0.007539f, 0.014157f, + 0.013412f, 0.002868f, -0.016721f, 0.014225f, 0.006548f, 0.016126f, 0.033084f, 0.016667f, -0.047646f, -0.012060f, -0.007875f, -0.034841f, 0.013923f, -0.004693f, 0.000483f, -0.018645f, 0.016825f, -0.006195f, 0.002856f, -0.024685f, 0.017398f, -0.019761f, 0.001155f, 0.022985f, -0.004120f, 0.024170f, -0.018293f, 0.029717f, -0.036714f, 0.019694f, -0.000673f, -0.011059f, 0.045567f, 0.014298f, -0.011114f, -0.026109f, 0.010576f, -0.003988f, 0.002079f, -0.002569f, 0.015108f, 0.027082f, 0.032104f, -0.020407f, 0.012822f, -0.007568f, 0.027685f, 0.011837f, 0.000717f, -0.003226f, 0.013799f, -0.000000f, -0.018085f, -0.071184f, -0.045955f, 0.038788f, -0.027862f, -0.026239f, 0.015231f, 0.033939f, -0.055085f, -0.009008f, 0.013718f, 0.003772f, -0.028476f, -0.043292f, 0.082160f, -0.035045f, 0.011675f, -0.039891f, 0.022676f, -0.013848f, 0.038821f, 0.033964f, 0.004129f, 0.006044f, -0.044584f, -0.000051f, 0.022217f, -0.018384f, -0.026198f, 0.021441f, 0.006955f, 0.023095f, 0.019331f, -0.003941f, 0.008698f, -0.005220f, -0.001867f, 0.034013f, -0.027967f, -0.017241f, 0.028531f, -0.001317f, -0.020733f, 0.028782f, + 0.000376f, -0.006623f, -0.018275f, -0.008928f, 0.012102f, -0.015611f, -0.000272f, 0.009881f, -0.017889f, -0.020287f, -0.011315f, 0.014320f, -0.040461f, 0.019755f, -0.000066f, 0.039713f, -0.035739f, 0.012085f, -0.026561f, 0.010099f, -0.014932f, -0.022503f, 0.038696f, -0.020572f, -0.006107f, -0.020071f, 0.018634f, -0.022896f, 0.016491f, -0.008184f, 0.030202f, 0.026692f, 0.000766f, -0.041147f, 0.034512f, 0.016042f, -0.041937f, 0.012384f, 0.042080f, -0.005250f, -0.001393f, 0.018695f, -0.014539f, 0.029139f, 0.026101f, -0.037931f, -0.023966f, -0.008129f, 0.017710f, 0.033481f, 0.004577f, 0.017137f, 0.037712f, 0.028062f, -0.043087f, -0.005852f, 0.064063f, 0.014833f, -0.006145f, -0.009190f, -0.014187f, -0.020756f, 0.003946f, 0.014676f, 0.016057f, 0.015260f, -0.013731f, -0.029571f, 0.005527f, -0.016107f, 0.013334f, 0.043889f, -0.014244f, -0.047147f, 0.052325f, -0.018033f, -0.032414f, 0.042598f, -0.010420f, -0.014841f, -0.049887f, -0.010224f, 0.016882f, 0.007574f, -0.013109f, -0.021803f, 0.015301f, 0.000052f, -0.025093f, 0.016822f, -0.007770f, 0.041072f, -0.035364f, 0.002312f, -0.010090f, 0.047104f, + 0.012633f, -0.072727f, 0.017414f, -0.032061f, -0.017401f, -0.028100f, 0.024710f, 0.097148f, 0.030300f, 0.001905f, 0.015846f, 0.024402f, -0.045854f, -0.022605f, -0.021500f, -0.033961f, 0.002941f, -0.015362f, -0.053222f, -0.022685f, 0.003638f, -0.021660f, -0.066964f, 0.058009f, -0.011140f, 0.026100f, 0.004970f, -0.030792f, -0.052797f, -0.051006f, 0.057147f, 0.034668f, 0.013165f, -0.020249f, -0.038116f, -0.028737f, -0.045260f, -0.011790f, 0.017018f, -0.007201f, 0.003826f, 0.007082f, -0.007306f, -0.023661f, -0.022434f, -0.038729f, -0.013659f, -0.007594f, 0.019153f, 0.013033f, 0.021060f, -0.010548f, -0.017017f, -0.007455f, 0.027508f, 0.003642f, 0.024413f, -0.080856f, -0.018669f, -0.000372f, 0.018043f, -0.026000f, -0.000745f, -0.030069f, 0.023750f, 0.020215f, 0.004389f, 0.099224f, 0.002084f, 0.030746f, 0.041526f, 0.001378f, 0.013841f, 0.000190f, -0.006501f, -0.012444f, 0.021384f, 0.029804f, 0.040457f, -0.001442f, -0.006581f, 0.002127f, 0.027063f, 0.023028f, 0.002001f, 0.018514f, 0.017915f, 0.012240f, -0.003705f, 0.038385f, -0.009259f, 0.049721f, -0.047090f, -0.023533f, 0.040593f, -0.004172f, + 0.004473f, 0.012743f, -0.048906f, 0.004953f, 0.010239f, 0.035334f, 0.052485f, -0.039494f, 0.012189f, -0.023881f, 0.038230f, 0.034854f, 0.006898f, 0.064367f, 0.022059f, 0.027284f, -0.019617f, -0.000871f, -0.036484f, 0.064292f, -0.032931f, 0.012346f, 0.040513f, -0.006245f, -0.021378f, 0.021734f, -0.002693f, 0.012327f, 0.043280f, 0.003743f, -0.009979f, -0.001039f, 0.010419f, 0.001399f, -0.021161f, 0.020437f, 0.000527f, -0.004151f, 0.071844f, -0.050407f, 0.052742f, 0.034880f, 0.065107f, 0.028017f, -0.041312f, 0.036712f, 0.003417f, 0.034283f, 0.084773f, -0.056633f, -0.021882f, -0.005068f, 0.004193f, 0.058332f, -0.030573f, 0.005399f, -0.033100f, 0.005248f, 0.065275f, -0.004683f, 0.067522f, 0.020745f, 0.013224f, 0.031936f, -0.038058f, -0.004485f, 0.030230f, 0.042552f, -0.064965f, -0.000776f, -0.056242f, 0.026306f, -0.030480f, -0.001408f, 0.008272f, -0.012818f, -0.041485f, 0.009618f, -0.071413f, -0.063340f, -0.000494f, -0.000897f, -0.040496f, 0.029978f, 0.007915f, -0.012557f, -0.037560f, 0.047487f, -0.012693f, 0.071567f, -0.011864f, 0.013756f, 0.025490f, -0.037984f, -0.012963f, 0.008983f, + -0.043642f, -0.026349f, -0.038226f, 0.029685f, -0.030743f, -0.010588f, -0.010595f, 0.025240f, -0.025928f, -0.045199f, -0.060063f, -0.004433f, 0.048815f, 0.000180f, -0.027769f, -0.014461f, -0.034954f, -0.014500f, -0.000112f, 0.017577f, -0.039179f, -0.007459f, -0.008739f, -0.030895f, -0.038380f, -0.001468f, 0.006239f, 0.021301f, 0.008387f, 0.038938f, 0.011757f, 0.049945f, -0.022274f, 0.040502f, -0.011146f, -0.038325f, -0.008817f, 0.067928f, -0.030798f, 0.028653f, -0.022455f, 0.048455f, -0.027547f, 0.013293f, 0.033852f, -0.006781f, -0.013402f, 0.001219f, -0.018708f, 0.042229f, -0.043671f, -0.023238f, 0.047908f, -0.014409f, -0.040668f, -0.064035f, 0.075437f, -0.021824f, 0.064546f, -0.010437f, 0.052272f, 0.006800f, -0.013348f, -0.031498f, -0.021909f, -0.001796f, 0.002957f, 0.039481f, -0.011803f, 0.000018f, 0.012668f, -0.030490f, 0.056047f, 0.023134f, 0.004092f, -0.041338f, 0.032508f, 0.019172f, -0.033395f, 0.037868f, 0.005022f, -0.002132f, 0.010716f, 0.002333f, 0.047476f, -0.006924f, -0.055309f, 0.065451f, -0.029995f, -0.001317f, 0.047856f, -0.016481f, -0.008199f, -0.023548f, 0.074409f, -0.028469f, + -0.007162f, -0.041207f, -0.007033f, 0.009876f, 0.066650f, -0.025893f, 0.013961f, 0.025329f, 0.040313f, -0.005295f, -0.039440f, 0.049908f, 0.028916f, 0.041700f, -0.016083f, -0.003173f, 0.006271f, 0.046183f, -0.020711f, -0.041132f, -0.051161f, 0.034696f, -0.035363f, 0.016509f, 0.041052f, 0.044242f, -0.024250f, -0.000503f, 0.054600f, -0.075418f, -0.000624f, 0.022394f, 0.030576f, 0.009252f, -0.029483f, 0.014202f, 0.026392f, -0.013127f, -0.015161f, -0.092657f, 0.032877f, 0.019309f, 0.084508f, 0.074314f, -0.009913f, -0.025928f, -0.085215f, 0.003657f, 0.029704f, -0.035719f, 0.029008f, 0.051592f, 0.049883f, -0.021551f, 0.059853f, 0.053989f, 0.003314f, -0.030640f, -0.033375f, 0.055132f, 0.046832f, -0.064253f, -0.088603f, 0.119975f, 0.006851f, -0.007127f, 0.016247f, 0.010087f, 0.044671f, 0.045086f, -0.017015f, -0.013667f, 0.062405f, 0.030743f, -0.010561f, -0.039787f, 0.025404f, 0.006297f, 0.003750f, 0.023389f, 0.003451f, -0.000572f, -0.024391f, 0.015222f, -0.007162f, -0.028885f, 0.055702f, -0.087045f, 0.061729f, 0.052526f, -0.083763f, -0.004472f, 0.042542f, 0.012119f, 0.048424f, -0.010088f, + 0.006407f, 0.045917f, -0.006510f, 0.024053f, -0.042151f, -0.064176f, 0.182967f, -0.074150f, -0.107422f, -0.022083f, 0.203020f, 0.089485f, -0.090136f, -0.019014f, 0.032509f, 0.025592f, -0.006074f, 0.009460f, -0.040546f, -0.027134f, 0.042234f, 0.075791f, 0.001752f, 0.128517f, -0.062579f, -0.026763f, 0.073245f, -0.000387f, -0.007993f, -0.043803f, -0.082605f, 0.061420f, -0.044676f, -0.049139f, 0.030682f, -0.054109f, 0.021377f, -0.051563f, -0.055527f, -0.013212f, 0.008297f, 0.002980f, -0.015377f, 0.058379f, 0.012782f, 0.033834f, 0.015534f, -0.003433f, -0.001785f, -0.032913f, -0.062991f, 0.014755f, 0.057635f, -0.053708f, 0.039611f, -0.054671f, -0.007496f, -0.007330f, -0.079635f, 0.050585f, -0.028841f, 0.016906f, -0.000290f, -0.027374f, -0.000299f, -0.060597f, 0.056160f, -0.045096f, 0.018057f, -0.069722f, -0.040580f, -0.089998f, 0.031707f, -0.044337f, -0.045303f, -0.040590f, -0.018622f, -0.004010f, 0.091628f, 0.028734f, 0.046109f, -0.016037f, -0.040905f, -0.057092f, 0.016721f, 0.000672f, -0.089398f, -0.045038f, -0.158548f, -0.077383f, -0.056633f, -0.007664f, -0.065707f, -0.052792f, -0.022591f, -0.094204f, + 0.021454f, 0.032010f, -0.081251f, 0.043715f, 0.008683f, -0.024713f, 0.004733f, -0.024262f, -0.002221f, 0.015858f, 0.023793f, 0.039686f, -0.048370f, 0.002896f, 0.056648f, -0.008242f, -0.026134f, 0.048350f, -0.021402f, 0.001218f, -0.028953f, -0.014626f, -0.058602f, 0.012913f, 0.002730f, 0.030909f, -0.022105f, -0.000511f, 0.043598f, -0.023062f, 0.002503f, 0.039892f, -0.082958f, 0.001924f, -0.095058f, -0.034770f, -0.062737f, 0.047988f, 0.021063f, -0.008103f, 0.024730f, -0.023631f, 0.026967f, 0.061320f, 0.021206f, 0.097574f, -0.053509f, -0.071056f, 0.064501f, 0.010712f, -0.040036f, -0.047798f, -0.012295f, 0.031378f, -0.031315f, -0.008399f, -0.025936f, -0.048203f, 0.029975f, 0.021793f, -0.054000f, -0.044043f, 0.059512f, -0.010480f, 0.026572f, -0.021809f, 0.037725f, 0.001023f, 0.063033f, -0.043816f, -0.010734f, -0.001754f, 0.026582f, -0.033097f, -0.036896f, -0.062604f, -0.127158f, -0.063266f, -0.023798f, 0.056419f, 0.073302f, -0.138791f, 0.024538f, -0.054747f, -0.075078f, -0.014875f, 0.087747f, 0.056443f, 0.048048f, -0.029405f, -0.033182f, -0.039520f, 0.044456f, 0.031759f, 0.068350f, 0.009586f, + -0.087835f, -0.033829f, 0.066733f, -0.009432f, 0.019847f, 0.060189f, -0.028028f, -0.040344f, -0.064179f, -0.063826f, 0.000761f, 0.042962f, 0.091301f, 0.068207f, 0.044992f, 0.019163f, -0.092719f, -0.098232f, 0.034985f, -0.067471f, 0.016471f, 0.088296f, 0.035055f, 0.006898f, -0.043770f, -0.078066f, -0.013249f, -0.033046f, 0.026835f, 0.021712f, 0.015122f, 0.055839f, -0.008248f, -0.009480f, 0.014678f, 0.040887f, 0.064715f, 0.067936f, 0.022915f, 0.060663f, 0.020266f, 0.022610f, -0.012808f, -0.065282f, -0.025871f, -0.027546f, -0.054324f, 0.042465f, 0.038685f, 0.029936f, 0.028691f, -0.011369f, -0.065262f, 0.011861f, 0.020065f, 0.042206f, -0.109679f, -0.223418f, -0.114036f, 0.024556f, 0.090946f, 0.217806f, 0.213173f, 0.090342f, 0.092241f, 0.066945f, 0.006167f, -0.104531f, -0.178908f, -0.270994f, -0.078999f, -0.111848f, -0.017251f, 0.114277f, 0.201714f, 0.169952f, 0.150462f, 0.084050f, 0.000852f, -0.049523f, -0.067230f, -0.012373f, -0.118392f, -0.093571f, -0.088673f, -0.057293f, -0.046474f, -0.020247f, -0.001646f, 0.044225f, 0.100783f, 0.103589f, 0.101963f, 0.075238f, 0.097244f, 0.052688f, + 0.056717f, -0.015235f, -0.001391f, -0.042213f, -0.114733f, -0.167442f, -0.202739f, -0.097034f, -0.037574f, 0.034296f, -0.002903f, 0.023996f, 0.050035f, 0.064665f, 0.135355f, 0.155714f, 0.205545f, 0.131895f, 0.015025f, 0.061320f, -0.029039f, -0.110496f, -0.096900f, -0.193973f, -0.227290f, -0.169230f, -0.105135f, -0.044357f, -0.036357f, 0.082473f, 0.090592f, 0.256514f, 0.205581f, 0.150538f, 0.138277f, 0.056630f, -0.051997f, -0.066059f, -0.040091f} + }, + { + {0.018235f, -0.003472f, 0.005490f, -0.000571f, 0.007113f, 0.008802f, 0.006134f, 0.011158f, -0.006845f, 0.012061f, -0.004063f, 0.001631f, -0.011202f, 0.000524f, -0.011671f, 0.002543f, 0.002049f, 0.000973f, 0.000325f, 0.004340f, -0.006223f, -0.007391f, 0.006076f, -0.000559f, 0.004647f, 0.002762f, -0.001027f, -0.005085f, 0.000972f, 0.009242f, 0.005653f, 0.002995f, 0.003590f, 0.002764f, 0.001017f, 0.003343f, -0.000734f, 0.000448f, -0.000733f, 0.010487f, -0.002163f, 0.005451f, -0.003895f, 0.004636f, 0.012323f, -0.003269f, 0.011536f, 0.001765f, -0.004865f, 0.003436f, 0.005153f, -0.001661f, -0.002003f, 0.000326f, 0.008742f, -0.002760f, 0.002791f, -0.001620f, 0.005558f, 0.002326f, 0.007581f, -0.002523f, -0.000523f, 0.002931f, -0.003002f, -0.006192f, 0.001175f, -0.002024f, -0.000788f, -0.002434f, 0.004980f, 0.000794f, 0.003142f, -0.001468f, 0.006725f, 0.003439f, -0.008512f, -0.013235f, -0.009654f, 0.003716f, -0.001518f, -0.022613f, -0.012911f, -0.000980f, 0.003154f, -0.006940f, 0.002291f, -0.008365f, 0.001540f, -0.006027f, 0.015754f, -0.012877f, -0.005796f, -0.005622f, 0.009978f, 0.007056f, + 0.016012f, 0.004350f, 0.003207f, -0.007286f, 0.007460f, 0.001086f, 0.001895f, -0.000773f, 0.005935f, 0.008527f, 0.000434f, 0.008514f, 0.007732f, -0.003687f, 0.004225f, -0.004529f, -0.005480f, 0.000795f, -0.004529f, 0.002912f, -0.006984f, -0.011968f, 0.003041f, 0.004620f, -0.003294f, 0.003679f, -0.006104f, 0.005800f, 0.007205f, -0.012571f, 0.002223f, -0.000363f, 0.004547f, 0.004523f, 0.000362f, -0.012325f, -0.004143f, -0.005160f, 0.003885f, 0.000318f, 0.000932f, -0.003580f, 0.002000f, -0.005980f, -0.000054f, 0.007683f, 0.004143f, 0.001137f, -0.004012f, 0.003073f, -0.010815f, -0.005027f, -0.008066f, 0.002329f, 0.000872f, 0.000511f, -0.025739f, -0.000475f, 0.001737f, 0.000722f, 0.004646f, -0.008865f, 0.007128f, 0.004140f, -0.004468f, -0.015213f, 0.010599f, 0.010826f, -0.002096f, 0.009063f, 0.006680f, -0.008290f, 0.017511f, 0.003895f, -0.007367f, 0.009531f, 0.001054f, 0.008925f, 0.001660f, -0.014600f, 0.006072f, -0.002510f, -0.005116f, -0.005477f, -0.004118f, 0.010085f, 0.007992f, 0.000928f, 0.008349f, 0.003182f, -0.007056f, -0.008958f, -0.000405f, -0.001853f, 0.004439f, 0.003027f, + -0.006835f, 0.002057f, 0.004264f, 0.003906f, -0.005935f, -0.005056f, -0.008008f, -0.002658f, -0.001621f, 0.002031f, -0.001570f, 0.011735f, 0.005407f, -0.001429f, -0.005238f, 0.002482f, 0.005305f, 0.002812f, 0.012854f, -0.001685f, 0.006783f, -0.000355f, -0.003414f, -0.007070f, 0.005912f, -0.001281f, -0.002773f, 0.007631f, -0.001493f, 0.002854f, -0.000827f, -0.001009f, -0.007436f, 0.002313f, -0.001413f, 0.010121f, 0.012896f, -0.002187f, -0.004895f, -0.007713f, -0.017720f, -0.010609f, -0.003829f, 0.012726f, 0.001674f, 0.002355f, 0.007841f, 0.002074f, 0.003409f, -0.018628f, -0.017013f, -0.010922f, -0.002794f, -0.000121f, 0.007941f, -0.005640f, 0.006238f, -0.003257f, -0.011384f, 0.003509f, -0.001582f, -0.007939f, -0.000017f, 0.010927f, 0.016141f, 0.007167f, -0.007200f, 0.004198f, 0.000663f, 0.011437f, 0.000113f, -0.009307f, -0.000132f, -0.005487f, 0.011555f, 0.004837f, 0.005545f, 0.011357f, -0.001746f, 0.000699f, 0.015688f, 0.013331f, -0.000219f, -0.000219f, 0.001375f, -0.001018f, 0.004449f, 0.000957f, -0.010861f, -0.015104f, -0.004851f, -0.002087f, 0.000504f, -0.005148f, -0.016125f, -0.001981f, + 0.005164f, -0.009284f, -0.003801f, -0.006139f, -0.004349f, 0.001509f, 0.002910f, 0.005217f, -0.010704f, -0.009564f, 0.009965f, -0.004093f, -0.000809f, 0.001507f, 0.000809f, 0.005454f, -0.009130f, 0.023536f, -0.009314f, -0.007417f, -0.001363f, 0.000209f, -0.009088f, -0.000116f, -0.006426f, 0.011225f, -0.003012f, -0.014312f, -0.019888f, -0.005241f, -0.013254f, 0.017963f, 0.001243f, 0.012694f, 0.010617f, -0.017400f, -0.001209f, 0.007039f, 0.004980f, 0.008964f, 0.001452f, -0.001294f, -0.001819f, 0.004106f, -0.005969f, 0.006387f, 0.003361f, -0.006327f, 0.003522f, 0.000091f, 0.004152f, 0.009681f, -0.005621f, 0.003730f, -0.000929f, 0.005447f, 0.004546f, -0.002216f, 0.006373f, -0.002093f, 0.005493f, -0.004648f, 0.004971f, -0.014148f, -0.006272f, -0.005301f, 0.003567f, 0.011844f, -0.009223f, -0.006072f, -0.003646f, 0.000510f, -0.004435f, -0.005574f, -0.003228f, 0.004644f, 0.003549f, 0.006728f, -0.002729f, 0.003719f, -0.004528f, -0.004594f, -0.000825f, -0.002876f, 0.004417f, -0.000349f, -0.007663f, 0.003803f, -0.004564f, -0.007466f, -0.002817f, -0.004728f, 0.003425f, -0.005108f, 0.003556f, 0.005755f, + -0.002888f, 0.008973f, -0.015236f, 0.006162f, -0.009294f, -0.010190f, 0.013826f, 0.004879f, -0.017327f, 0.001320f, -0.000363f, 0.004650f, -0.012607f, -0.008197f, -0.001536f, -0.010258f, -0.018404f, -0.017780f, -0.011938f, -0.017744f, 0.006952f, -0.002227f, 0.002134f, 0.008962f, -0.015712f, 0.009607f, -0.004807f, 0.004278f, 0.002576f, -0.001961f, 0.001048f, -0.002611f, -0.002721f, -0.010325f, -0.006484f, 0.012547f, -0.005333f, -0.011181f, -0.010482f, -0.001370f, -0.005034f, 0.003634f, -0.010074f, -0.015075f, 0.001632f, 0.013240f, -0.002710f, 0.007870f, -0.005375f, 0.004112f, -0.008011f, 0.005169f, 0.001565f, -0.010418f, 0.013999f, 0.002243f, -0.003890f, 0.003068f, 0.012725f, 0.012142f, 0.005684f, -0.001693f, -0.016090f, -0.002886f, -0.013661f, 0.003329f, -0.003940f, 0.001851f, 0.000849f, 0.003349f, -0.013039f, -0.000098f, -0.002871f, 0.005921f, 0.008341f, -0.017860f, -0.017162f, -0.011511f, -0.018799f, -0.022056f, -0.021104f, 0.007444f, 0.008187f, -0.013919f, -0.004500f, -0.012693f, -0.020130f, 0.009168f, -0.006095f, -0.017527f, 0.004562f, -0.002135f, -0.000278f, 0.000674f, 0.004482f, 0.000843f, + -0.001728f, 0.003264f, 0.004573f, -0.010478f, -0.010272f, -0.003434f, -0.012279f, -0.001758f, -0.013018f, -0.021485f, -0.002796f, 0.011471f, -0.016033f, -0.012340f, 0.006875f, -0.008782f, -0.000254f, 0.002225f, -0.008848f, -0.007104f, -0.007688f, -0.023035f, -0.010785f, 0.003833f, -0.007534f, -0.008242f, -0.015152f, 0.005314f, 0.011224f, -0.005406f, 0.017968f, -0.011528f, -0.006226f, -0.000995f, -0.005847f, -0.017127f, -0.002356f, 0.002797f, -0.001744f, -0.004344f, -0.015357f, -0.003280f, 0.012748f, 0.006052f, 0.002937f, 0.006212f, 0.004013f, -0.004753f, 0.025520f, -0.009571f, -0.011459f, -0.011244f, -0.012916f, 0.002920f, 0.014020f, 0.030357f, 0.020789f, -0.000396f, 0.019002f, -0.001005f, 0.003145f, 0.004130f, -0.009737f, 0.017518f, 0.000560f, 0.015551f, 0.014654f, -0.010913f, 0.018901f, 0.000962f, -0.013870f, -0.022670f, 0.021606f, 0.011067f, 0.021439f, -0.017022f, 0.012387f, 0.007373f, -0.019389f, -0.018535f, -0.011298f, -0.004671f, 0.020548f, -0.018615f, 0.017316f, -0.000804f, -0.001883f, 0.013305f, 0.011720f, 0.016869f, 0.005844f, -0.007785f, 0.007733f, 0.015961f, -0.009190f, 0.015984f, + 0.022663f, 0.010711f, 0.013659f, 0.006789f, 0.003690f, 0.004954f, 0.000325f, -0.011323f, 0.004284f, 0.002384f, 0.000564f, 0.011616f, -0.007787f, 0.007426f, 0.006549f, -0.001817f, 0.019416f, -0.010428f, -0.007631f, -0.003216f, 0.016603f, -0.001812f, 0.013558f, 0.008536f, 0.008904f, 0.010015f, 0.000926f, -0.022840f, -0.004548f, -0.017948f, -0.011363f, 0.026953f, 0.012501f, -0.009395f, -0.000945f, -0.026185f, 0.016600f, 0.015925f, 0.047091f, 0.001868f, 0.004124f, -0.002347f, -0.006397f, -0.003068f, 0.015975f, 0.014498f, 0.012703f, 0.018278f, 0.007491f, 0.028863f, 0.008530f, -0.011471f, 0.002843f, 0.025139f, 0.010026f, 0.002513f, 0.003999f, -0.012995f, -0.018533f, 0.011884f, -0.009158f, -0.018304f, -0.038540f, -0.000682f, 0.015466f, -0.001254f, 0.009162f, -0.013459f, -0.006984f, -0.005083f, 0.002986f, -0.004324f, -0.011483f, -0.005744f, -0.031014f, -0.008214f, -0.026311f, 0.002136f, -0.013827f, 0.010520f, -0.015063f, 0.005677f, -0.014483f, -0.005147f, -0.000847f, 0.000357f, 0.002310f, 0.002877f, -0.019241f, 0.009262f, -0.002877f, 0.004225f, -0.010071f, 0.000237f, 0.015380f, 0.006191f, + 0.021230f, 0.011939f, -0.006592f, -0.001206f, -0.004540f, -0.002073f, -0.005219f, -0.006618f, -0.000652f, 0.008964f, 0.005211f, 0.006796f, 0.003562f, -0.030114f, 0.019294f, 0.051560f, 0.019130f, -0.007615f, 0.025894f, -0.015592f, 0.018315f, 0.012480f, -0.023021f, 0.005956f, -0.029180f, 0.001482f, -0.009357f, -0.020269f, 0.012157f, 0.001260f, 0.009504f, 0.013280f, 0.016227f, 0.025572f, 0.011154f, -0.000863f, -0.005524f, -0.015912f, -0.029423f, 0.011646f, 0.012717f, 0.004200f, -0.009711f, 0.017279f, 0.002996f, 0.018211f, 0.011146f, -0.030648f, -0.011123f, 0.005194f, -0.022369f, 0.002147f, -0.000795f, -0.003455f, 0.007717f, 0.006102f, -0.004596f, 0.024266f, -0.012568f, 0.001917f, 0.013946f, -0.010469f, 0.009864f, -0.003988f, -0.013217f, 0.010508f, 0.000799f, -0.000767f, 0.014337f, 0.009956f, 0.001434f, -0.005863f, 0.028715f, 0.002371f, 0.016585f, 0.002734f, -0.007663f, -0.008431f, -0.022265f, -0.007756f, 0.010758f, 0.000671f, 0.009365f, -0.001288f, -0.017028f, 0.008667f, 0.007143f, -0.025075f, 0.008913f, 0.015346f, -0.005965f, -0.051852f, -0.016638f, 0.055871f, 0.016160f, 0.009583f, + -0.007393f, -0.000711f, -0.007549f, 0.011979f, -0.016867f, 0.024798f, 0.014728f, 0.011992f, 0.012574f, -0.007842f, 0.000163f, -0.000331f, 0.008760f, 0.016840f, -0.023339f, -0.013856f, -0.006727f, 0.019115f, 0.007775f, 0.010898f, 0.012229f, -0.002004f, -0.016348f, 0.006242f, 0.002522f, 0.034118f, 0.027651f, 0.007412f, 0.021310f, 0.001521f, -0.008455f, 0.004558f, -0.001515f, -0.004258f, 0.014253f, 0.016252f, 0.014442f, 0.032829f, 0.017086f, 0.013013f, 0.015698f, -0.014558f, -0.022736f, -0.011183f, 0.012514f, -0.020510f, -0.008659f, 0.020099f, 0.022970f, 0.011721f, -0.008003f, 0.018847f, -0.005708f, 0.001927f, 0.006356f, 0.010649f, -0.003626f, -0.012101f, 0.008829f, -0.011046f, -0.031114f, 0.000921f, 0.013248f, -0.018859f, 0.005151f, -0.004144f, -0.001469f, -0.004455f, -0.006761f, 0.025582f, 0.002849f, 0.012628f, 0.026218f, 0.041770f, -0.063768f, -0.009758f, 0.002774f, -0.001317f, -0.008533f, -0.016476f, 0.016173f, -0.020891f, -0.033021f, -0.004003f, 0.030121f, -0.005191f, -0.019365f, 0.005105f, -0.026675f, -0.014525f, -0.000162f, 0.015762f, -0.027965f, 0.002382f, 0.027963f, 0.029407f, + -0.000491f, 0.010092f, 0.024873f, -0.015448f, -0.024717f, -0.033128f, 0.001801f, -0.032983f, -0.008364f, 0.013363f, 0.011462f, -0.029143f, -0.028683f, -0.016801f, 0.010199f, -0.007872f, -0.006642f, -0.007728f, 0.024389f, -0.038718f, -0.012949f, 0.005975f, -0.022529f, -0.007149f, -0.001687f, -0.024256f, -0.000688f, 0.010215f, -0.003214f, 0.032229f, -0.004126f, -0.012547f, 0.000662f, -0.001106f, -0.012640f, 0.006778f, 0.013453f, -0.013733f, 0.020008f, -0.010065f, -0.044324f, 0.003213f, -0.019112f, -0.007375f, -0.004304f, -0.002486f, -0.058675f, -0.006667f, 0.020845f, 0.025333f, 0.009307f, 0.038329f, 0.022576f, -0.003330f, -0.059918f, 0.016999f, -0.011035f, 0.020728f, -0.019113f, 0.000061f, 0.031519f, -0.010228f, 0.044717f, 0.010575f, 0.008638f, -0.018873f, 0.008450f, 0.022483f, -0.013668f, -0.002407f, 0.028820f, 0.018995f, 0.021645f, 0.003476f, -0.033516f, 0.021651f, -0.021721f, -0.001579f, -0.013196f, 0.003758f, -0.016833f, 0.010123f, -0.004605f, 0.009892f, 0.008641f, 0.016467f, 0.015834f, 0.018480f, -0.021724f, 0.005608f, 0.033575f, 0.007794f, -0.006627f, -0.006290f, -0.017664f, -0.013241f, + -0.000704f, 0.001806f, 0.005430f, 0.029189f, 0.001704f, 0.016349f, 0.014473f, -0.000532f, -0.008219f, -0.006429f, 0.024981f, -0.029829f, -0.007710f, -0.026356f, -0.023343f, -0.005739f, -0.001143f, -0.044627f, 0.010256f, -0.013774f, 0.025998f, -0.005385f, -0.000566f, 0.019406f, 0.001964f, 0.046418f, 0.036065f, 0.055115f, 0.018474f, 0.002120f, -0.008950f, -0.006172f, -0.011641f, -0.016643f, 0.024728f, -0.005991f, -0.004162f, 0.056304f, -0.010376f, -0.011259f, 0.062636f, 0.000022f, 0.036129f, 0.026730f, 0.003184f, 0.015368f, -0.007119f, 0.012220f, 0.011865f, 0.007612f, 0.009882f, 0.029265f, -0.018376f, 0.035085f, -0.017610f, 0.000203f, 0.008334f, -0.003863f, -0.023519f, -0.021452f, 0.000724f, -0.035309f, -0.010094f, -0.038652f, -0.001245f, -0.022674f, -0.015987f, -0.012097f, -0.009678f, 0.006584f, -0.030051f, 0.037473f, 0.007463f, -0.023186f, -0.016073f, -0.000442f, -0.002793f, -0.005158f, 0.011425f, 0.005742f, 0.038159f, 0.004846f, 0.001688f, -0.017772f, 0.005255f, 0.008205f, 0.000976f, -0.018977f, -0.006066f, 0.023443f, 0.027376f, -0.000684f, -0.018199f, 0.009423f, -0.001098f, 0.033157f, + 0.039252f, -0.013076f, -0.005667f, -0.005567f, 0.008129f, -0.012572f, 0.019123f, -0.043259f, 0.001154f, 0.054747f, -0.041171f, -0.020914f, -0.002171f, -0.005958f, 0.004500f, -0.031516f, -0.016923f, -0.004346f, 0.025679f, 0.030739f, 0.021353f, -0.018455f, -0.048326f, 0.085642f, 0.022149f, -0.052684f, -0.052730f, -0.007381f, 0.013744f, 0.036818f, -0.045759f, -0.007608f, 0.009495f, -0.000076f, -0.005885f, 0.049283f, 0.011267f, -0.028022f, 0.016090f, 0.002563f, -0.000536f, 0.026176f, -0.003840f, 0.014533f, -0.030896f, -0.010251f, 0.056627f, 0.021089f, 0.044842f, 0.014346f, 0.040630f, 0.007399f, -0.013735f, 0.028386f, 0.026360f, 0.040346f, 0.020553f, -0.044725f, -0.016215f, 0.010115f, 0.024213f, -0.017785f, 0.007782f, -0.017149f, -0.028255f, 0.003232f, -0.002451f, -0.017195f, 0.014500f, 0.019128f, 0.017351f, 0.012187f, 0.012206f, -0.008430f, 0.031164f, -0.000097f, -0.028993f, -0.021663f, 0.028185f, 0.014812f, -0.046022f, 0.020561f, 0.009522f, 0.015218f, -0.039878f, -0.028034f, 0.027970f, 0.041103f, 0.025016f, -0.008328f, 0.021476f, 0.040850f, 0.016435f, 0.043085f, 0.008143f, 0.020459f, + 0.015404f, 0.071000f, 0.095931f, 0.008729f, 0.020033f, -0.059031f, -0.018160f, 0.037880f, -0.029768f, 0.073199f, -0.013323f, 0.012736f, 0.020282f, 0.043499f, 0.024237f, -0.008549f, -0.029588f, -0.034215f, -0.010934f, -0.004351f, -0.043962f, -0.019675f, -0.017031f, 0.030311f, -0.015908f, 0.010161f, -0.027998f, 0.005457f, -0.010605f, -0.040248f, 0.044202f, 0.031891f, 0.035673f, 0.017153f, -0.020810f, -0.018970f, -0.048245f, 0.002661f, -0.043480f, -0.011572f, -0.003314f, 0.007603f, 0.022877f, 0.019569f, -0.013956f, -0.008282f, 0.018894f, 0.043039f, 0.011242f, 0.017605f, 0.030160f, -0.036451f, 0.027150f, -0.019921f, -0.020209f, -0.036873f, -0.017170f, 0.019426f, 0.014577f, 0.004104f, 0.044648f, -0.008426f, -0.017597f, 0.008135f, 0.010652f, 0.062879f, -0.022155f, 0.024866f, 0.021832f, 0.058972f, -0.014532f, 0.008218f, -0.026997f, -0.008097f, -0.035834f, 0.027647f, -0.051362f, 0.001824f, -0.041423f, 0.007587f, 0.017204f, 0.005824f, -0.024921f, 0.083616f, -0.006259f, -0.011915f, 0.007312f, -0.048523f, 0.002429f, -0.033004f, 0.000802f, 0.008450f, -0.010007f, -0.001772f, 0.019536f, -0.018283f, + 0.000475f, 0.024768f, 0.001808f, 0.005713f, -0.041495f, 0.004494f, -0.003745f, -0.003350f, -0.010697f, -0.051951f, -0.028715f, 0.011813f, 0.003939f, 0.021858f, -0.059506f, 0.005585f, -0.055395f, 0.027067f, -0.037852f, -0.061109f, 0.030248f, 0.054531f, 0.009342f, 0.026309f, -0.041783f, 0.040146f, -0.010422f, 0.005106f, -0.025703f, 0.033214f, 0.013608f, 0.034503f, 0.010991f, 0.042072f, -0.039287f, 0.006334f, 0.002041f, -0.007864f, -0.031072f, -0.026464f, -0.029085f, 0.031944f, -0.008517f, 0.043870f, -0.027215f, -0.022461f, 0.006735f, 0.005215f, -0.020561f, 0.012217f, -0.099204f, 0.011233f, -0.032270f, 0.090178f, -0.017982f, -0.046806f, 0.017421f, -0.003478f, -0.046654f, -0.008683f, 0.006760f, -0.028421f, 0.067850f, 0.008909f, 0.005720f, 0.030333f, -0.039522f, -0.060334f, -0.037544f, 0.083009f, -0.007583f, -0.018702f, 0.054525f, 0.030384f, -0.027339f, -0.027164f, -0.015721f, 0.065609f, 0.008402f, -0.017129f, -0.026938f, -0.013469f, -0.052886f, 0.034128f, -0.007002f, 0.013280f, 0.032457f, -0.012748f, -0.054771f, -0.007527f, 0.068396f, -0.003922f, -0.018304f, 0.032486f, -0.016209f, 0.040536f, + 0.026210f, -0.004487f, -0.052317f, -0.027094f, -0.008099f, -0.048432f, -0.028936f, -0.028319f, 0.002605f, -0.007495f, 0.038922f, -0.028855f, -0.010835f, -0.001152f, 0.101796f, 0.034824f, -0.018974f, 0.019868f, 0.010857f, -0.007036f, 0.050962f, 0.024466f, -0.021219f, 0.007268f, 0.040755f, 0.046946f, -0.030894f, -0.021351f, -0.072107f, -0.055465f, -0.001824f, -0.007850f, -0.007673f, -0.108283f, 0.041079f, -0.020936f, 0.062086f, 0.062993f, -0.031900f, 0.031247f, -0.056542f, -0.086530f, 0.005193f, -0.060008f, 0.011305f, -0.005013f, 0.051705f, -0.033244f, 0.037807f, 0.032649f, 0.051924f, -0.071372f, 0.011293f, -0.042543f, -0.038417f, 0.007438f, -0.050485f, -0.031729f, 0.052151f, -0.011261f, 0.021936f, 0.060016f, -0.007837f, 0.021830f, -0.043424f, 0.008511f, -0.048165f, 0.051165f, -0.039224f, -0.025283f, -0.027894f, 0.056832f, 0.046806f, -0.027378f, 0.062683f, 0.042308f, -0.008290f, 0.061777f, 0.001012f, -0.057963f, -0.012621f, -0.003484f, -0.043440f, 0.014738f, -0.096825f, 0.014285f, -0.020876f, -0.044470f, -0.034164f, 0.049926f, -0.021635f, 0.098940f, 0.075777f, -0.100127f, 0.006245f, 0.002798f, + 0.011724f, 0.054746f, -0.075373f, -0.050822f, 0.064876f, -0.039523f, -0.050099f, -0.058661f, 0.015330f, 0.152723f, -0.011288f, -0.032959f, -0.031614f, 0.013474f, 0.052922f, -0.057569f, 0.029675f, -0.097100f, -0.014284f, -0.037337f, -0.032790f, 0.052514f, -0.066457f, -0.103416f, 0.061213f, 0.092541f, 0.022532f, -0.016874f, -0.082997f, 0.006599f, 0.032867f, 0.033600f, -0.013727f, -0.032336f, 0.004390f, -0.007131f, -0.010719f, 0.011788f, -0.012115f, -0.026718f, -0.054413f, 0.008233f, -0.032716f, 0.009534f, -0.029346f, -0.060716f, 0.038702f, 0.030025f, 0.047545f, 0.003359f, 0.051388f, 0.030601f, 0.007698f, -0.014739f, -0.026337f, -0.040756f, -0.030657f, -0.014996f, 0.012021f, 0.031946f, -0.019984f, -0.007055f, -0.071116f, 0.069383f, 0.078566f, 0.046974f, -0.040519f, 0.045500f, -0.055282f, 0.002901f, 0.012151f, -0.115819f, 0.009229f, 0.016654f, 0.056017f, -0.066255f, 0.091564f, 0.042519f, -0.067353f, -0.030219f, 0.026382f, -0.002684f, -0.050580f, -0.048244f, -0.067259f, -0.071721f, -0.009635f, -0.091601f, -0.012422f, 0.033070f, -0.043143f, -0.040192f, 0.037507f, 0.038047f, 0.007546f, -0.036320f, + -0.123906f, -0.018387f, 0.023958f, 0.014548f, 0.053398f, -0.001369f, 0.030940f, -0.008254f, -0.001029f, -0.015748f, 0.002064f, 0.032574f, 0.003525f, 0.001179f, 0.031548f, -0.008642f, -0.007944f, -0.041953f, -0.004134f, -0.006854f, -0.004967f, 0.007078f, 0.025087f, 0.034573f, -0.007108f, -0.000071f, 0.026895f, -0.006218f, -0.052733f, -0.003641f, -0.046862f, 0.006764f, 0.005995f, -0.060990f, 0.043880f, -0.084006f, 0.018440f, 0.023225f, -0.037269f, -0.002459f, 0.108573f, -0.030671f, 0.036333f, -0.022764f, 0.018971f, -0.081320f, 0.008248f, 0.048203f, -0.001900f, 0.041759f, -0.010301f, 0.004956f, -0.003471f, 0.053542f, -0.034872f, -0.039665f, 0.045599f, -0.041803f, -0.054821f, 0.001190f, -0.087155f, 0.059493f, 0.044498f, -0.013027f, 0.013946f, 0.015041f, -0.008372f, -0.047493f, -0.138937f, -0.066535f, -0.023696f, 0.042332f, 0.098351f, -0.094505f, 0.017850f, -0.028982f, -0.095290f, -0.015303f, 0.081257f, 0.020207f, 0.066534f, -0.060374f, 0.014984f, -0.022382f, 0.001773f, 0.038370f, 0.004586f, 0.019826f, -0.015439f, -0.120748f, 0.032857f, 0.003587f, -0.052581f, 0.049421f, 0.037157f, -0.038036f, + 0.034182f, 0.002167f, -0.040852f, 0.009629f, -0.026099f, 0.071925f, 0.006854f, 0.027831f, -0.000798f, -0.078225f, -0.063128f, -0.022696f, -0.047343f, 0.047323f, 0.068904f, 0.070940f, 0.056654f, -0.022514f, 0.006047f, -0.061910f, -0.011156f, -0.008156f, -0.027272f, -0.033633f, 0.002996f, 0.003640f, -0.084187f, -0.026186f, -0.034119f, -0.004383f, 0.034841f, -0.042539f, -0.011199f, 0.012089f, -0.001683f, 0.040165f, -0.048475f, -0.004027f, -0.054489f, -0.030020f, -0.040330f, 0.019464f, 0.013559f, 0.040012f, -0.005205f, -0.006908f, -0.046665f, -0.019222f, 0.037496f, -0.055585f, -0.224711f, -0.117745f, 0.026583f, 0.097106f, 0.215560f, 0.164744f, 0.094060f, 0.032536f, 0.050177f, -0.013665f, -0.087436f, -0.172136f, -0.228561f, -0.057029f, -0.064480f, 0.004800f, 0.115013f, 0.161708f, 0.110182f, 0.144942f, 0.035757f, 0.031576f, -0.014085f, -0.071704f, -0.079572f, -0.065664f, -0.067910f, -0.086658f, -0.067233f, -0.029227f, -0.001485f, -0.000390f, 0.059203f, 0.073386f, 0.142366f, 0.066259f, 0.024922f, 0.057532f, 0.092180f, 0.028592f, 0.020393f, -0.071518f, -0.094570f, -0.160316f, -0.070472f, -0.084211f, + -0.057132f, -0.036493f, -0.024605f, 0.011441f, 0.023700f, 0.066801f, 0.142106f, 0.110232f, 0.125377f, 0.088673f, 0.114262f, 0.080484f, -0.061704f, -0.062294f, -0.148234f, -0.120399f, -0.081919f, -0.197143f, -0.145716f, -0.095253f, 0.012192f, 0.113942f, 0.117291f, 0.127536f, 0.170682f, 0.134524f, 0.079862f, 0.079730f, -0.000739f, -0.060909f, -0.061511f, -0.035386f}, + {0.015743f, -0.001957f, 0.007460f, -0.002574f, -0.000238f, 0.014217f, -0.007542f, -0.000708f, 0.004007f, -0.001486f, 0.004724f, 0.005419f, -0.012324f, 0.004971f, 0.004639f, 0.002648f, -0.000595f, -0.004016f, 0.008438f, -0.010738f, -0.009087f, -0.001976f, 0.000234f, 0.004376f, -0.009224f, -0.006758f, -0.000981f, -0.005989f, 0.009856f, 0.000526f, -0.004195f, 0.007851f, -0.007178f, 0.000871f, -0.001608f, -0.004228f, -0.000654f, 0.006124f, 0.006216f, 0.003715f, 0.009627f, 0.007999f, -0.000726f, 0.002487f, -0.004048f, 0.010238f, 0.006362f, -0.004515f, 0.001049f, 0.001436f, 0.001012f, -0.006136f, 0.005412f, 0.001894f, -0.000956f, 0.010866f, -0.005802f, -0.006491f, -0.000898f, 0.003323f, 0.000678f, -0.001315f, -0.004057f, -0.002588f, 0.003371f, -0.002920f, -0.000720f, -0.002203f, 0.003531f, -0.001443f, 0.008130f, 0.004019f, -0.005395f, -0.003026f, 0.004578f, -0.005000f, -0.002789f, -0.004011f, -0.007812f, 0.004727f, 0.007487f, 0.013224f, 0.003633f, -0.009099f, -0.016294f, 0.003669f, -0.007568f, 0.000768f, 0.005226f, 0.002120f, 0.013336f, -0.010840f, -0.002623f, -0.001365f, -0.000794f, -0.009282f, + 0.005871f, 0.002589f, 0.001281f, 0.000391f, -0.004528f, -0.003395f, -0.003263f, -0.000929f, 0.000525f, 0.002366f, -0.003405f, 0.005203f, 0.011928f, -0.000221f, 0.005331f, -0.008252f, -0.004829f, -0.009903f, -0.004805f, 0.010872f, 0.000565f, -0.002003f, 0.001954f, 0.011534f, 0.001275f, 0.005900f, -0.001384f, -0.005126f, -0.001620f, 0.006685f, -0.005518f, 0.010382f, 0.006311f, 0.011688f, 0.005710f, 0.000963f, -0.003456f, -0.007355f, -0.004157f, -0.006350f, -0.000959f, -0.004550f, 0.001974f, 0.000713f, -0.002520f, 0.001988f, -0.002140f, 0.004433f, -0.000912f, -0.000768f, 0.005943f, -0.000176f, -0.000206f, 0.001229f, -0.005286f, 0.003074f, -0.022865f, -0.005181f, 0.009368f, 0.001643f, 0.012772f, 0.006820f, -0.010536f, 0.002779f, -0.000245f, 0.004195f, -0.003787f, -0.017542f, 0.010112f, 0.006221f, 0.011587f, 0.014528f, 0.012469f, 0.004400f, 0.000140f, -0.017859f, -0.001875f, 0.008239f, -0.008188f, -0.007043f, -0.018710f, -0.001218f, -0.003163f, -0.002119f, -0.004794f, 0.002259f, -0.011190f, 0.005136f, -0.002000f, 0.004776f, 0.001341f, -0.007430f, 0.005734f, 0.004898f, 0.012900f, -0.001429f, + -0.010429f, -0.005272f, 0.005559f, 0.002354f, -0.002655f, 0.000643f, 0.004073f, 0.000655f, -0.007643f, 0.000058f, 0.001532f, -0.000665f, 0.000414f, -0.004627f, -0.002166f, -0.006197f, -0.001382f, 0.008040f, 0.002733f, -0.002463f, 0.003279f, -0.000773f, -0.000477f, 0.001471f, -0.009175f, -0.000514f, -0.000522f, 0.005470f, 0.009790f, -0.002461f, -0.001053f, -0.005794f, -0.004969f, 0.003267f, 0.011195f, -0.008766f, -0.001593f, 0.000830f, -0.000767f, -0.002678f, 0.001924f, -0.002666f, 0.012610f, 0.004720f, 0.004239f, -0.004263f, 0.000299f, 0.001169f, 0.001177f, -0.021727f, -0.011774f, -0.000999f, -0.005435f, -0.006732f, -0.000367f, -0.005666f, -0.022124f, 0.013161f, 0.002998f, 0.005958f, -0.002354f, 0.004537f, -0.005868f, 0.000286f, 0.000769f, 0.011394f, -0.004071f, -0.002382f, -0.001924f, -0.001904f, -0.001839f, -0.000779f, 0.012321f, -0.002356f, -0.000196f, -0.006988f, -0.000402f, -0.003347f, 0.004006f, 0.002081f, -0.011951f, 0.009328f, -0.012091f, -0.000163f, 0.010621f, -0.001443f, 0.000416f, 0.000893f, -0.000219f, -0.007319f, -0.005233f, 0.012285f, 0.007088f, -0.014981f, -0.008012f, 0.002513f, + -0.008795f, -0.006297f, 0.006544f, -0.010719f, 0.002211f, 0.002784f, 0.006331f, 0.013133f, 0.010083f, 0.006243f, 0.004808f, -0.008695f, -0.009038f, -0.007793f, 0.002745f, 0.011258f, 0.004442f, 0.016665f, -0.003998f, -0.004164f, -0.004915f, 0.004764f, -0.005513f, 0.008205f, -0.015694f, -0.001919f, 0.011717f, 0.006217f, -0.011803f, 0.008871f, 0.014407f, 0.013689f, 0.008678f, 0.001787f, -0.000521f, -0.008739f, -0.011431f, 0.004998f, -0.001093f, 0.011623f, -0.000898f, 0.007021f, -0.007152f, -0.004587f, -0.003844f, 0.001316f, 0.003642f, -0.000459f, -0.013993f, 0.003150f, 0.004819f, 0.003729f, 0.005998f, 0.003922f, -0.007617f, -0.018437f, -0.006050f, 0.002987f, 0.003561f, 0.001146f, -0.000846f, 0.003826f, -0.007712f, 0.000174f, -0.013968f, 0.006822f, -0.014414f, -0.003447f, -0.006148f, -0.009086f, 0.006830f, 0.003434f, 0.002857f, -0.007835f, -0.004080f, -0.001982f, -0.008343f, 0.001264f, -0.000773f, 0.004944f, -0.003618f, -0.006395f, -0.005387f, -0.015896f, 0.005182f, 0.002618f, 0.007034f, 0.011264f, 0.013309f, 0.006143f, -0.005322f, -0.006763f, -0.003739f, 0.008480f, 0.008446f, 0.007813f, + -0.001177f, 0.005572f, -0.015892f, 0.002042f, -0.007511f, 0.000996f, 0.002540f, -0.009930f, 0.003833f, 0.029667f, 0.003380f, -0.002453f, -0.016458f, 0.023913f, 0.000105f, 0.010135f, 0.001341f, -0.000338f, -0.012749f, 0.012698f, 0.003384f, -0.006772f, 0.001808f, 0.001109f, -0.004984f, 0.005232f, 0.013392f, -0.003683f, 0.014233f, -0.003997f, 0.006194f, -0.000058f, 0.009455f, 0.008402f, 0.009422f, 0.000271f, -0.004833f, 0.007404f, -0.005097f, 0.006545f, -0.001613f, 0.006600f, 0.006461f, 0.006166f, -0.000552f, -0.001652f, 0.002635f, -0.005000f, -0.007262f, -0.018994f, 0.012804f, -0.012202f, 0.008956f, 0.001328f, 0.003949f, -0.002006f, -0.022578f, -0.004710f, -0.005839f, -0.010884f, 0.001891f, 0.007234f, -0.014291f, -0.004324f, 0.007105f, 0.001599f, 0.010941f, 0.018599f, 0.000142f, -0.004377f, -0.003554f, -0.018173f, 0.006847f, 0.004688f, -0.002271f, -0.008630f, -0.010373f, -0.001235f, 0.005188f, -0.003492f, -0.005141f, -0.007624f, 0.001895f, 0.013161f, 0.005756f, 0.001863f, -0.030747f, -0.014240f, -0.004509f, 0.005994f, -0.003899f, 0.010074f, 0.034536f, 0.010585f, -0.013035f, 0.001753f, + -0.015375f, -0.005129f, 0.010335f, -0.012261f, -0.003316f, 0.015302f, 0.003486f, -0.004100f, 0.001947f, 0.008571f, -0.005541f, 0.004057f, 0.004353f, 0.004365f, -0.008899f, 0.003763f, -0.004307f, -0.005109f, -0.013025f, -0.005130f, -0.007728f, -0.014362f, 0.005944f, 0.000355f, -0.001244f, 0.014229f, 0.010198f, 0.003577f, 0.011235f, -0.000013f, -0.014886f, 0.012230f, -0.001691f, -0.010029f, -0.008191f, -0.014517f, 0.000341f, 0.017510f, 0.000862f, -0.007622f, 0.007079f, -0.012893f, -0.008520f, 0.006921f, -0.010933f, -0.013758f, -0.007803f, -0.004061f, 0.007402f, -0.011897f, -0.004421f, -0.005088f, 0.015167f, 0.003273f, -0.006667f, 0.010157f, 0.007201f, -0.020212f, 0.018294f, -0.007492f, 0.001248f, -0.009056f, 0.015577f, -0.002677f, -0.011335f, -0.035699f, -0.005230f, 0.017956f, 0.004010f, -0.027889f, 0.012011f, -0.000362f, -0.006190f, -0.009157f, -0.007718f, -0.003032f, -0.016951f, -0.003058f, 0.012653f, 0.016961f, 0.019917f, 0.012194f, 0.018097f, -0.006371f, 0.014113f, 0.006880f, -0.029717f, -0.000887f, 0.006922f, 0.010149f, 0.004376f, -0.010184f, -0.000105f, -0.002226f, 0.009574f, -0.017538f, + -0.006975f, 0.012882f, -0.005002f, 0.007240f, 0.003085f, -0.011627f, -0.013660f, -0.006640f, -0.020111f, -0.005443f, -0.006744f, 0.008036f, 0.002045f, -0.011034f, -0.003434f, -0.023680f, -0.006920f, 0.010002f, -0.007921f, -0.023279f, -0.001346f, 0.013786f, -0.029683f, 0.008765f, 0.003626f, 0.009646f, -0.014818f, -0.005671f, -0.014297f, 0.001734f, -0.005502f, -0.013801f, -0.005864f, -0.001644f, 0.005974f, -0.021036f, 0.005765f, 0.018484f, 0.023493f, 0.017809f, 0.018068f, 0.007615f, -0.011134f, 0.013051f, 0.021719f, -0.029959f, 0.016311f, 0.016556f, -0.032409f, -0.007651f, 0.008896f, 0.036851f, -0.002063f, -0.001172f, -0.007815f, -0.008893f, 0.044950f, 0.023103f, 0.006829f, 0.006724f, 0.023611f, 0.000799f, -0.002857f, -0.007331f, 0.004049f, -0.018623f, -0.017374f, -0.002783f, 0.006144f, 0.014677f, 0.006605f, 0.004421f, -0.006243f, 0.002730f, -0.014096f, 0.007569f, -0.021163f, 0.022760f, -0.001898f, -0.008986f, -0.011998f, -0.012567f, -0.021421f, 0.005483f, -0.020746f, -0.005342f, 0.014904f, -0.001530f, -0.006889f, -0.005041f, -0.003059f, -0.016083f, -0.012275f, -0.006049f, -0.007448f, -0.001919f, + 0.006878f, 0.006046f, 0.001285f, 0.003433f, -0.015853f, 0.030146f, 0.015898f, 0.003181f, -0.002016f, 0.039194f, -0.004441f, -0.003055f, -0.009076f, -0.014974f, -0.005384f, 0.040562f, 0.013718f, 0.008399f, 0.019592f, -0.022580f, -0.013637f, 0.012529f, 0.013408f, 0.030011f, 0.004203f, 0.008173f, -0.020550f, -0.001445f, 0.009896f, -0.027008f, -0.008775f, 0.010440f, -0.009082f, 0.000054f, 0.007168f, 0.019475f, -0.006852f, 0.007419f, 0.003906f, 0.004028f, 0.016743f, 0.014367f, 0.017856f, -0.014518f, -0.009609f, 0.019126f, -0.024865f, -0.008600f, -0.008334f, -0.002062f, -0.006828f, -0.016229f, 0.015249f, -0.000993f, -0.017192f, 0.000346f, -0.006859f, -0.018256f, -0.022281f, -0.012822f, -0.013416f, 0.025641f, -0.008482f, -0.007213f, -0.015656f, -0.001866f, -0.008051f, 0.003440f, 0.030696f, -0.006423f, -0.010269f, 0.004579f, -0.002019f, 0.017092f, -0.020868f, 0.034216f, 0.006786f, -0.034454f, -0.024716f, 0.008013f, -0.022940f, -0.000556f, -0.024587f, -0.000898f, 0.004789f, -0.004216f, 0.025718f, 0.031585f, -0.016215f, 0.002541f, -0.007275f, -0.033476f, 0.015766f, 0.076169f, -0.010533f, 0.001424f, + -0.030100f, -0.011331f, 0.024205f, -0.000907f, 0.044642f, 0.027756f, 0.025783f, 0.002469f, 0.020416f, -0.032371f, 0.033829f, 0.018688f, 0.003770f, 0.006470f, -0.017831f, 0.011099f, 0.001989f, 0.034550f, 0.020245f, 0.023833f, -0.005493f, 0.004504f, 0.007912f, -0.019176f, -0.015111f, -0.005482f, 0.012215f, 0.040017f, -0.008049f, -0.010154f, -0.010405f, -0.004602f, 0.007272f, -0.021281f, -0.004513f, 0.001043f, -0.010333f, -0.022598f, -0.002871f, -0.029336f, -0.009153f, 0.021621f, -0.019750f, -0.006916f, -0.001817f, 0.004682f, -0.033493f, -0.018815f, -0.002038f, -0.000734f, -0.004163f, 0.025909f, 0.012818f, 0.004748f, 0.016622f, 0.026809f, -0.011465f, -0.002500f, -0.016608f, 0.012600f, -0.012267f, 0.017000f, 0.018546f, 0.022208f, 0.036703f, 0.013604f, -0.021024f, 0.000397f, 0.059779f, 0.022703f, 0.036276f, 0.019162f, 0.037599f, 0.041300f, -0.042744f, 0.009901f, 0.030330f, 0.018300f, -0.012421f, -0.022792f, -0.020119f, 0.043234f, 0.002818f, 0.016117f, 0.022037f, -0.013229f, 0.005593f, 0.009379f, -0.027553f, -0.028460f, 0.022061f, 0.007729f, -0.042247f, -0.009572f, 0.052528f, 0.025689f, + -0.001238f, -0.030547f, 0.008837f, 0.008117f, 0.031333f, 0.010893f, -0.017223f, 0.021498f, 0.002373f, -0.008767f, -0.004578f, -0.006192f, -0.026988f, -0.011712f, 0.002247f, 0.004750f, -0.032093f, -0.032346f, -0.021231f, -0.008930f, -0.037993f, 0.021953f, -0.004318f, -0.025009f, 0.002690f, 0.001270f, -0.013439f, -0.002370f, 0.005252f, 0.000602f, 0.005487f, 0.010344f, 0.011671f, -0.013273f, -0.019988f, 0.023423f, 0.041977f, 0.021701f, 0.008739f, 0.034355f, -0.010199f, 0.019452f, 0.039599f, 0.028529f, -0.000857f, 0.006697f, -0.019521f, -0.024968f, 0.019400f, -0.023445f, 0.003090f, -0.007819f, -0.003531f, -0.008661f, -0.039615f, 0.011045f, -0.019130f, -0.008852f, -0.014800f, -0.002542f, 0.033802f, 0.033483f, -0.067909f, 0.020939f, 0.021475f, -0.021131f, -0.034575f, -0.045056f, 0.007884f, -0.013272f, 0.008278f, -0.015756f, -0.012409f, -0.007352f, 0.041950f, 0.010595f, -0.003704f, -0.000761f, -0.006734f, -0.012588f, 0.010584f, 0.006958f, -0.000231f, 0.016826f, 0.003633f, -0.003570f, 0.005979f, 0.015284f, 0.043329f, 0.004359f, 0.005326f, -0.021410f, -0.009173f, -0.010120f, -0.010780f, -0.001280f, + -0.003596f, 0.014404f, 0.020761f, 0.001046f, 0.023992f, -0.005486f, -0.004003f, -0.004809f, -0.002607f, -0.041891f, 0.047466f, 0.001376f, 0.003456f, -0.003298f, -0.012198f, 0.012809f, -0.003102f, 0.019523f, 0.001268f, -0.018045f, 0.005196f, 0.020836f, -0.014245f, 0.019497f, 0.004937f, -0.028263f, -0.004523f, -0.005257f, -0.052126f, -0.016711f, 0.014348f, 0.015463f, -0.019840f, -0.013011f, 0.032479f, 0.007913f, 0.008551f, -0.027348f, 0.016761f, -0.012149f, 0.015848f, -0.016141f, 0.021035f, -0.023119f, -0.019429f, 0.029921f, 0.001747f, 0.006190f, -0.021259f, -0.044464f, -0.006362f, 0.010476f, 0.000976f, 0.016305f, -0.017545f, 0.000435f, -0.002609f, -0.033653f, -0.025321f, 0.008605f, -0.038332f, -0.025381f, 0.008904f, -0.001731f, -0.040060f, -0.007234f, -0.021306f, 0.022025f, 0.011644f, 0.002455f, -0.011487f, -0.025328f, -0.052709f, 0.015757f, -0.025236f, 0.025477f, -0.011203f, -0.010956f, -0.007673f, -0.015063f, 0.004452f, 0.005335f, -0.043133f, -0.019417f, 0.035898f, 0.032530f, -0.038964f, 0.044278f, -0.001267f, 0.032133f, -0.011957f, -0.009941f, -0.008306f, -0.015185f, 0.013366f, -0.014987f, + -0.041766f, -0.021548f, 0.039303f, -0.011684f, -0.014249f, -0.004246f, 0.007749f, 0.007017f, 0.015572f, -0.052508f, 0.006983f, 0.033024f, 0.016964f, 0.023950f, 0.018585f, -0.017876f, -0.030625f, -0.025579f, -0.015088f, -0.029639f, -0.001655f, 0.014328f, 0.032721f, -0.005423f, -0.001601f, -0.054520f, 0.032764f, 0.041183f, -0.006558f, -0.021878f, -0.022677f, -0.013611f, 0.061410f, -0.037046f, -0.000261f, -0.003963f, 0.016463f, -0.002256f, 0.070719f, 0.002273f, -0.038743f, -0.009564f, -0.036838f, 0.048486f, 0.041416f, -0.032888f, 0.038942f, 0.010548f, 0.031306f, 0.012586f, -0.059369f, 0.019420f, 0.031453f, -0.040057f, -0.011572f, -0.045509f, -0.023434f, 0.002678f, -0.043024f, -0.035409f, -0.001213f, -0.028388f, -0.000565f, 0.011731f, -0.010725f, -0.027960f, 0.024035f, 0.023391f, -0.048406f, -0.035327f, 0.020239f, 0.010304f, 0.013091f, 0.026445f, 0.032232f, -0.009697f, -0.017072f, 0.001293f, -0.010787f, 0.001911f, -0.002878f, -0.013415f, 0.007485f, -0.063962f, 0.024426f, 0.036365f, -0.032223f, -0.023998f, 0.025943f, -0.015011f, 0.017496f, 0.039743f, 0.072633f, 0.113148f, 0.005773f, -0.042458f, + -0.055195f, -0.011235f, 0.004769f, -0.011500f, 0.056308f, 0.042575f, 0.030434f, 0.048963f, 0.036583f, 0.029681f, 0.004424f, 0.024306f, -0.026212f, 0.042616f, 0.049470f, 0.005251f, 0.051387f, -0.018035f, 0.006671f, 0.013311f, -0.042772f, -0.028599f, -0.008054f, -0.025110f, -0.029116f, -0.002824f, 0.052880f, 0.001182f, -0.006846f, 0.008062f, 0.013559f, -0.005012f, -0.065033f, -0.007574f, 0.020691f, -0.008338f, -0.017849f, 0.010016f, 0.029272f, 0.048214f, 0.014551f, 0.025294f, 0.036099f, 0.042118f, -0.053011f, -0.037555f, 0.025285f, -0.015005f, 0.074698f, -0.006174f, 0.064751f, -0.048376f, 0.032704f, 0.051136f, 0.005387f, 0.009115f, 0.033624f, -0.053303f, -0.021468f, 0.002158f, 0.034778f, 0.001488f, 0.039623f, 0.014921f, 0.017620f, 0.036646f, 0.017617f, -0.004488f, -0.010413f, 0.078670f, 0.025738f, 0.027109f, 0.057243f, -0.005075f, 0.011661f, 0.024335f, 0.036624f, -0.042295f, -0.033724f, -0.015074f, -0.036902f, -0.007400f, -0.049373f, 0.024084f, 0.038620f, 0.027402f, 0.038385f, -0.027305f, -0.014868f, 0.028735f, 0.022951f, -0.017670f, 0.039029f, 0.022281f, -0.009315f, -0.049529f, + 0.026493f, 0.027778f, -0.024680f, -0.005218f, 0.013853f, 0.005282f, -0.038958f, 0.042975f, 0.011807f, 0.046180f, 0.026080f, 0.016910f, -0.026171f, 0.020405f, -0.013929f, 0.071072f, -0.057693f, 0.004142f, 0.022036f, -0.013218f, -0.037246f, 0.021375f, 0.023270f, -0.007057f, 0.022894f, -0.024902f, 0.059616f, -0.030363f, 0.015677f, 0.010134f, -0.037941f, -0.019399f, -0.052396f, 0.019140f, 0.015171f, -0.042137f, 0.036117f, 0.027699f, -0.027203f, 0.018791f, -0.003288f, 0.056930f, 0.019240f, -0.033914f, -0.022939f, -0.025236f, 0.017995f, -0.015740f, 0.014637f, -0.008442f, -0.068380f, 0.033397f, -0.058026f, 0.064164f, 0.076699f, -0.001978f, 0.015109f, -0.058716f, 0.001509f, -0.011570f, 0.008272f, 0.037273f, 0.038216f, -0.008721f, 0.020832f, 0.031321f, 0.006760f, 0.014300f, 0.010586f, 0.014143f, -0.005558f, 0.044760f, -0.003837f, 0.011709f, -0.021716f, 0.050132f, 0.012585f, -0.002509f, 0.000589f, 0.045333f, 0.018781f, 0.022477f, 0.050096f, -0.008638f, -0.027370f, 0.060850f, -0.060251f, -0.024930f, -0.008571f, 0.015937f, 0.043666f, 0.011719f, -0.014681f, -0.015365f, -0.027835f, 0.001503f, + -0.003124f, 0.014169f, 0.068755f, 0.066640f, 0.043436f, 0.060356f, -0.002771f, 0.089792f, -0.026660f, 0.026685f, -0.018094f, 0.004386f, 0.030357f, -0.011132f, 0.006187f, -0.023880f, -0.030796f, 0.003056f, -0.017971f, 0.020472f, -0.025312f, 0.045950f, -0.028448f, -0.049511f, -0.016933f, -0.010257f, 0.001119f, 0.066801f, -0.030039f, -0.003858f, 0.020069f, 0.017073f, -0.002732f, -0.027698f, 0.105930f, 0.148639f, 0.043224f, 0.115319f, -0.029135f, -0.084752f, -0.060906f, -0.042818f, 0.016455f, 0.019164f, -0.030920f, -0.046582f, 0.034563f, 0.048951f, 0.026278f, 0.048882f, 0.035695f, 0.007427f, 0.011776f, 0.005456f, -0.006638f, -0.035978f, 0.010699f, -0.042175f, 0.023858f, -0.001906f, -0.041855f, 0.041246f, 0.021655f, 0.018657f, 0.070187f, 0.043983f, -0.026360f, -0.016492f, -0.032008f, -0.033966f, -0.044356f, -0.017425f, -0.003852f, -0.032917f, -0.015204f, 0.062777f, 0.092360f, 0.070390f, 0.003868f, 0.047439f, 0.046369f, 0.078574f, 0.030317f, -0.044565f, -0.076860f, -0.045596f, -0.051835f, 0.024508f, 0.014710f, -0.097699f, -0.073557f, -0.018908f, 0.032025f, 0.085062f, -0.074097f, -0.004723f, + -0.066070f, -0.009615f, 0.061083f, -0.041630f, 0.015858f, -0.059562f, -0.021311f, -0.020144f, 0.034608f, -0.057310f, -0.005266f, -0.011518f, -0.043972f, -0.084447f, 0.009139f, 0.045185f, -0.039561f, 0.070632f, -0.029629f, 0.027319f, -0.010505f, -0.084298f, -0.043420f, -0.005334f, -0.049705f, -0.113418f, -0.032259f, 0.039063f, 0.061402f, -0.031762f, -0.048725f, -0.101457f, -0.030427f, 0.028040f, -0.020530f, -0.030506f, -0.050290f, 0.010238f, -0.011764f, -0.010027f, -0.009812f, 0.018563f, 0.039761f, -0.032953f, 0.030713f, 0.024733f, -0.031858f, -0.093077f, 0.007274f, 0.005539f, 0.023466f, 0.009098f, 0.059719f, 0.004051f, -0.090643f, -0.001455f, -0.099721f, -0.002600f, 0.035027f, 0.039607f, -0.007280f, 0.003205f, 0.047061f, -0.026748f, -0.016906f, -0.033896f, 0.031043f, 0.019121f, -0.013191f, 0.032894f, -0.009724f, 0.011925f, 0.018439f, 0.055230f, 0.009933f, -0.024576f, -0.060245f, -0.025777f, 0.035696f, 0.023656f, 0.053718f, 0.067436f, 0.130685f, 0.056713f, 0.036948f, -0.039008f, 0.006861f, -0.081306f, -0.024628f, 0.056660f, -0.027692f, -0.023361f, -0.005808f, -0.018267f, -0.064995f, -0.072586f, + -0.105840f, -0.033566f, 0.000545f, -0.008298f, 0.069858f, 0.019013f, 0.091171f, 0.055861f, 0.028571f, -0.012822f, -0.033018f, -0.006417f, 0.127824f, 0.007721f, 0.037293f, 0.020477f, -0.015312f, 0.063197f, -0.025736f, 0.050957f, -0.055111f, -0.005790f, -0.039436f, 0.047923f, -0.066954f, -0.014545f, 0.021714f, 0.021114f, 0.022831f, -0.059565f, 0.043337f, -0.068138f, 0.015011f, -0.033511f, -0.021460f, 0.067305f, 0.005417f, 0.004203f, 0.024789f, -0.025865f, 0.000155f, 0.017449f, -0.080574f, 0.002039f, 0.020975f, -0.012141f, 0.055233f, -0.023871f, -0.008002f, 0.089195f, -0.031177f, -0.074307f, 0.003150f, -0.028019f, 0.009367f, -0.005508f, -0.000038f, -0.059402f, 0.036442f, -0.009351f, -0.075733f, 0.049525f, -0.093497f, 0.020580f, -0.012734f, -0.037252f, -0.043856f, -0.037166f, -0.126253f, -0.129623f, -0.111031f, -0.056833f, 0.223366f, 0.068757f, -0.030240f, -0.031210f, -0.113669f, -0.237990f, -0.028803f, 0.061679f, 0.076975f, 0.032273f, -0.038618f, -0.028934f, -0.071935f, -0.078368f, 0.055289f, -0.056899f, 0.139740f, 0.104936f, -0.168242f, 0.052010f, 0.019274f, -0.036319f, 0.010337f, 0.117500f, + 0.014448f, 0.080636f, 0.160304f, -0.036914f, -0.136478f, 0.004897f, -0.025543f, -0.126013f, -0.036779f, 0.059001f, -0.008308f, 0.072993f, 0.116930f, 0.009622f, -0.106770f, -0.204317f, -0.177549f, -0.156940f, -0.019426f, 0.150448f, 0.040025f, 0.039706f, 0.019592f, -0.041616f, -0.207025f, -0.127874f, -0.068575f, -0.025033f, 0.009135f, 0.046078f, 0.041290f, 0.057723f, 0.055357f, 0.073736f, -0.091475f, -0.030825f, -0.075680f, -0.004958f, -0.082532f, 0.050507f, 0.044921f, 0.102337f, 0.107378f, 0.056101f, -0.001685f, -0.025295f, -0.021761f, -0.128311f, 0.029311f, -0.030022f, -0.240143f, -0.267502f, -0.185992f, -0.191341f, -0.060819f, 0.184751f, 0.120540f, 0.200369f, 0.225623f, 0.348666f, 0.227829f, 0.235143f, 0.147871f, -0.026688f, -0.192290f, -0.324505f, -0.379097f, -0.332426f, -0.263491f, -0.196013f, -0.056466f, -0.023869f, -0.038653f, -0.005490f, 0.066579f, 0.115103f, 0.168065f, 0.141835f, 0.201614f, 0.191409f, 0.254844f, 0.228919f, 0.056997f, 0.148716f, -0.046782f, 0.029786f, 0.021985f, -0.005747f, -0.033361f, -0.252655f, -0.295662f, -0.379724f, -0.437834f, -0.403966f, -0.225809f, -0.207119f, + -0.167213f, -0.212929f, -0.237735f, -0.063948f, 0.048090f, 0.129139f, 0.203594f, 0.290614f, 0.358266f, 0.453750f, 0.612432f, 0.585828f, 0.451692f, 0.356159f, 0.305522f, 0.150023f, 0.258568f, -0.116313f, -0.207195f, -0.514013f, -0.569319f, -0.724973f, -0.674765f, -0.633527f, -0.571699f, -0.571859f, -0.307912f, -0.194162f, -0.005457f, 0.402584f, 0.315610f, 0.209594f} + }, + { + {-0.012901f, 0.021523f, -0.005750f, 0.003586f, -0.006979f, 0.002754f, -0.015214f, 0.000844f, -0.004535f, 0.005489f, -0.008256f, -0.005958f, -0.001589f, 0.005589f, -0.001142f, -0.000926f, -0.003156f, -0.004308f, -0.010181f, -0.002142f, -0.008497f, -0.004551f, -0.007192f, 0.003227f, -0.001518f, 0.000560f, 0.003628f, 0.002154f, -0.005012f, 0.002316f, -0.001760f, -0.000417f, -0.001872f, -0.001597f, -0.004479f, 0.000328f, -0.008156f, 0.010269f, -0.003097f, -0.002449f, -0.001584f, 0.000650f, -0.000069f, 0.001221f, -0.009504f, 0.000705f, 0.004120f, 0.000328f, 0.001784f, -0.000208f, 0.002152f, 0.007758f, -0.002440f, 0.004782f, 0.005578f, -0.008173f, -0.002568f, -0.001945f, 0.007663f, -0.001435f, 0.002354f, 0.008740f, 0.000059f, -0.002416f, 0.001889f, 0.002565f, 0.002551f, 0.000748f, 0.004485f, 0.000056f, -0.001367f, 0.003680f, -0.003779f, 0.001174f, -0.000202f, -0.006743f, 0.025308f, 0.003267f, -0.010547f, 0.004187f, -0.006513f, 0.002247f, -0.004094f, -0.002424f, -0.005617f, 0.004711f, 0.007815f, 0.002574f, 0.002727f, -0.013148f, 0.003093f, 0.000673f, 0.004651f, 0.005618f, 0.003269f, 0.008239f, + -0.001222f, -0.003925f, 0.001248f, 0.009764f, 0.000481f, -0.006701f, -0.000297f, 0.008381f, 0.004734f, 0.001301f, 0.000497f, 0.002682f, 0.000216f, 0.001057f, 0.001953f, 0.000200f, -0.002420f, 0.000120f, 0.000481f, 0.003576f, -0.004241f, -0.010472f, 0.008473f, 0.008524f, 0.007444f, 0.007066f, 0.000054f, 0.004072f, 0.006689f, -0.006155f, -0.001111f, 0.000307f, -0.008449f, 0.002479f, 0.001011f, 0.008478f, 0.001179f, 0.004975f, 0.000471f, 0.010548f, 0.005418f, -0.000956f, 0.007353f, 0.004792f, -0.002019f, -0.007668f, 0.002291f, 0.002686f, -0.001967f, 0.001172f, -0.004504f, -0.000652f, 0.004305f, 0.003490f, 0.003574f, 0.008772f, 0.021260f, -0.013926f, 0.004916f, 0.012053f, 0.002931f, 0.008554f, 0.010284f, -0.009019f, 0.002079f, -0.000642f, 0.004083f, -0.011472f, -0.009136f, -0.001514f, 0.009212f, 0.012531f, -0.004592f, -0.003846f, 0.006024f, -0.009755f, -0.013247f, -0.002220f, -0.015602f, 0.005639f, 0.005328f, 0.001689f, -0.009655f, -0.009662f, 0.003641f, -0.005500f, 0.001451f, 0.000000f, 0.010465f, 0.011240f, 0.009982f, -0.001290f, 0.007028f, -0.010494f, 0.004818f, -0.006042f, + -0.000475f, 0.000924f, 0.008567f, -0.008762f, -0.007986f, 0.000438f, 0.011244f, 0.004974f, 0.004477f, -0.006328f, 0.003910f, 0.003177f, -0.003122f, -0.013458f, -0.002082f, -0.004259f, -0.005916f, -0.005024f, 0.006585f, -0.005354f, -0.001649f, 0.001962f, 0.004235f, 0.010515f, -0.003500f, 0.000323f, -0.007141f, -0.003066f, 0.002030f, -0.009826f, -0.000060f, 0.003466f, 0.007899f, -0.001652f, -0.004332f, -0.002178f, -0.008819f, -0.008105f, -0.014156f, -0.004020f, 0.001659f, -0.004815f, -0.007499f, -0.004435f, -0.014125f, -0.008223f, 0.013542f, -0.001216f, -0.006987f, 0.006897f, -0.012079f, -0.003251f, -0.014901f, -0.003593f, -0.011896f, -0.006492f, 0.012448f, 0.000055f, -0.003391f, -0.015476f, -0.009977f, -0.003981f, -0.007087f, 0.001881f, -0.008637f, 0.000145f, 0.004173f, 0.015108f, 0.006967f, 0.005276f, 0.006053f, 0.012113f, -0.011473f, -0.000748f, -0.003988f, -0.008873f, 0.002613f, -0.002308f, -0.004019f, -0.009256f, 0.003685f, 0.008461f, 0.000118f, -0.007213f, -0.005077f, 0.022623f, -0.000770f, -0.007296f, -0.010192f, -0.014554f, -0.019486f, -0.002936f, -0.010571f, 0.001610f, -0.002859f, 0.004565f, + -0.000043f, 0.001882f, -0.009585f, 0.000641f, 0.000294f, 0.010600f, 0.002637f, -0.009074f, -0.000769f, -0.003306f, -0.003841f, -0.002739f, 0.002538f, 0.005219f, 0.004214f, -0.006472f, -0.032166f, 0.013156f, -0.005490f, 0.005726f, -0.013112f, -0.005126f, -0.010185f, -0.009346f, 0.001001f, -0.002760f, -0.006237f, 0.016807f, 0.004655f, -0.001278f, -0.009658f, -0.002924f, 0.005041f, -0.011251f, -0.005688f, -0.010710f, -0.005683f, 0.016042f, 0.001961f, 0.010766f, -0.000577f, 0.000110f, -0.002212f, 0.003199f, 0.003379f, -0.008184f, 0.000574f, 0.002713f, 0.005212f, 0.017354f, -0.008475f, -0.010209f, -0.001547f, 0.019167f, 0.006497f, 0.020383f, 0.002326f, 0.002040f, -0.003016f, 0.010156f, -0.001163f, 0.014888f, -0.000909f, -0.001537f, -0.002042f, -0.005945f, 0.006874f, 0.002078f, -0.004612f, 0.004460f, 0.006198f, 0.010405f, -0.005230f, -0.000319f, -0.001140f, 0.009307f, -0.003007f, -0.001311f, -0.002698f, -0.002087f, 0.002932f, -0.002715f, 0.001810f, 0.001832f, -0.001466f, 0.002584f, -0.014326f, 0.001825f, 0.010494f, 0.003878f, 0.013694f, 0.001583f, 0.001656f, 0.004107f, -0.007277f, -0.003754f, + -0.000476f, -0.016375f, -0.003013f, -0.000167f, -0.008323f, -0.028729f, -0.007223f, -0.006440f, -0.012717f, -0.002725f, -0.003520f, 0.017487f, -0.006510f, 0.013154f, 0.005965f, 0.009408f, -0.018608f, -0.008503f, -0.018800f, -0.017442f, -0.000354f, 0.002942f, 0.010402f, -0.005461f, -0.008410f, -0.005238f, -0.012825f, 0.002401f, 0.005343f, 0.006271f, 0.003688f, -0.004044f, 0.004316f, -0.008583f, 0.000563f, -0.015273f, 0.005093f, -0.004115f, 0.001726f, 0.003080f, 0.005286f, 0.005766f, -0.006067f, 0.000010f, 0.014233f, -0.008010f, 0.006739f, 0.007204f, -0.000794f, 0.004243f, 0.006857f, -0.003137f, 0.002525f, 0.006883f, 0.000101f, 0.012279f, -0.006789f, -0.008763f, -0.004426f, 0.003928f, -0.000275f, -0.016668f, -0.008608f, -0.018442f, -0.020131f, -0.003506f, 0.005254f, -0.016352f, 0.007167f, -0.002728f, -0.000271f, -0.005646f, 0.005640f, -0.009731f, -0.000977f, 0.008842f, -0.026790f, -0.001592f, 0.007858f, 0.004882f, -0.014409f, -0.001999f, -0.009318f, 0.002022f, 0.002283f, 0.001658f, -0.015745f, -0.020770f, -0.014418f, 0.002171f, -0.011626f, 0.012023f, 0.003418f, -0.019964f, 0.013808f, 0.012333f, + 0.009420f, 0.008702f, -0.010321f, 0.015940f, 0.003734f, -0.000258f, -0.006796f, 0.005319f, 0.009097f, -0.008940f, -0.013543f, 0.004719f, -0.005477f, -0.016149f, -0.002745f, -0.015567f, -0.006274f, 0.028087f, -0.008132f, -0.012637f, -0.016320f, 0.000895f, 0.001891f, 0.011228f, 0.003765f, -0.010226f, 0.008656f, -0.001103f, -0.008820f, -0.010583f, -0.012122f, 0.017470f, 0.006974f, 0.011096f, -0.009050f, -0.011081f, 0.004278f, 0.003052f, -0.012471f, -0.000301f, -0.007997f, 0.011528f, -0.003047f, 0.001374f, -0.014640f, 0.009199f, 0.006441f, -0.007337f, -0.005914f, -0.004318f, 0.014741f, 0.000766f, 0.001673f, -0.003914f, 0.010659f, -0.010545f, -0.013674f, -0.000105f, 0.004028f, -0.003054f, -0.010816f, -0.016339f, -0.012955f, 0.014072f, 0.002120f, 0.017132f, 0.020423f, 0.019776f, 0.003475f, 0.026961f, 0.006913f, -0.002487f, 0.012813f, 0.009803f, 0.025048f, 0.003969f, 0.014646f, -0.018894f, 0.032378f, 0.023820f, 0.011886f, -0.009247f, -0.007080f, 0.011889f, 0.003233f, 0.008629f, -0.004148f, 0.014090f, -0.003514f, -0.003201f, 0.012922f, 0.010369f, -0.011979f, 0.008791f, -0.002780f, 0.013674f, + 0.015092f, -0.028170f, -0.004674f, 0.017834f, 0.005864f, 0.009821f, 0.008090f, 0.017620f, -0.007841f, 0.007191f, 0.000869f, -0.014437f, -0.006606f, -0.000236f, 0.003562f, -0.021350f, -0.001332f, 0.013686f, -0.010277f, 0.022865f, 0.017516f, -0.006884f, 0.000168f, 0.004321f, 0.008858f, 0.013190f, -0.004952f, -0.004528f, 0.021651f, -0.005458f, -0.000582f, 0.008837f, -0.000049f, 0.011738f, 0.008839f, 0.002583f, 0.003291f, 0.056929f, -0.027295f, 0.005632f, 0.024463f, -0.000610f, 0.002499f, 0.031755f, 0.034792f, 0.005482f, -0.000802f, 0.008501f, 0.000155f, 0.009004f, 0.011279f, -0.010587f, -0.001912f, 0.021037f, 0.019077f, -0.006579f, -0.013881f, -0.015351f, -0.015579f, -0.007969f, 0.016418f, -0.009725f, 0.008302f, 0.002213f, -0.018434f, 0.000048f, -0.011559f, -0.000218f, 0.007885f, 0.010355f, -0.024388f, -0.011041f, -0.018958f, -0.005158f, 0.034072f, 0.005981f, -0.000686f, 0.004212f, -0.000657f, 0.002950f, 0.011714f, 0.006906f, 0.018274f, 0.000520f, 0.014300f, 0.008475f, -0.008666f, 0.008438f, -0.014402f, 0.001881f, -0.014410f, -0.016292f, 0.009345f, -0.018045f, 0.010927f, 0.001248f, + 0.012742f, 0.009414f, 0.010071f, -0.008832f, 0.015146f, -0.016025f, 0.002767f, -0.006391f, 0.000512f, 0.024086f, 0.004205f, 0.013216f, 0.014567f, 0.000178f, -0.000526f, 0.011562f, -0.014712f, 0.011270f, -0.034102f, 0.005096f, 0.006868f, -0.023329f, 0.008939f, -0.001143f, 0.022216f, -0.007136f, -0.013091f, 0.008961f, -0.030134f, -0.010848f, 0.023115f, 0.009817f, -0.016136f, -0.036546f, 0.014561f, -0.005787f, 0.007362f, -0.023566f, -0.031588f, -0.021245f, 0.024679f, 0.001411f, 0.012932f, -0.003209f, -0.015347f, -0.021192f, 0.008127f, -0.006110f, -0.019458f, -0.021489f, -0.000126f, -0.019214f, -0.016019f, -0.008361f, -0.005416f, -0.020702f, 0.009541f, 0.013038f, 0.016440f, -0.009168f, 0.014357f, -0.013470f, 0.023759f, -0.005132f, -0.003370f, 0.019268f, 0.008012f, -0.005115f, -0.015297f, -0.006813f, 0.016693f, 0.004204f, -0.016343f, 0.006602f, 0.017690f, 0.018934f, 0.005667f, -0.023187f, -0.028241f, -0.002200f, 0.002221f, 0.001775f, -0.021374f, 0.005814f, 0.017224f, 0.006306f, -0.012079f, -0.032249f, 0.005012f, -0.013506f, -0.036308f, 0.002041f, -0.003540f, -0.016773f, 0.017720f, -0.042149f, + 0.024346f, 0.018525f, 0.020457f, 0.001869f, 0.021674f, 0.001140f, -0.016098f, -0.018236f, 0.001213f, 0.017307f, -0.014121f, 0.003171f, -0.028963f, 0.017805f, 0.018622f, -0.011166f, -0.007137f, 0.003589f, 0.020480f, 0.014993f, -0.012832f, -0.011130f, 0.013493f, -0.018984f, 0.004696f, -0.025575f, -0.001590f, -0.008179f, -0.034606f, -0.034952f, 0.005005f, 0.018814f, 0.007481f, -0.029923f, -0.017361f, 0.021456f, -0.026364f, -0.011003f, 0.018031f, -0.006073f, 0.022937f, -0.009411f, -0.019074f, 0.005804f, -0.026958f, 0.028223f, -0.004981f, 0.004463f, -0.015493f, -0.007511f, -0.003194f, -0.027740f, -0.018643f, 0.001564f, -0.006556f, 0.002099f, -0.011010f, -0.029379f, 0.003100f, -0.024430f, 0.008220f, -0.006622f, 0.014664f, -0.029359f, 0.010238f, 0.004224f, -0.011053f, 0.020631f, -0.005835f, -0.015636f, -0.031722f, -0.005013f, 0.002081f, -0.024599f, 0.011312f, -0.018684f, -0.006124f, 0.012638f, -0.013617f, 0.003700f, 0.015277f, 0.022674f, -0.006761f, 0.001799f, -0.008851f, -0.032141f, -0.007179f, -0.007570f, 0.013147f, -0.028399f, -0.000499f, -0.016798f, 0.016687f, -0.020202f, -0.026571f, 0.016450f, + 0.007712f, 0.010320f, 0.035871f, -0.007020f, -0.010575f, 0.009099f, -0.023313f, -0.028119f, 0.002098f, 0.033414f, 0.010439f, 0.018216f, -0.013824f, -0.018201f, -0.027469f, 0.004232f, 0.035181f, -0.017031f, 0.018481f, 0.002884f, 0.027486f, -0.043131f, -0.013026f, -0.002107f, 0.005222f, 0.022343f, 0.011859f, -0.033308f, -0.008162f, -0.016292f, -0.000726f, -0.038205f, -0.005142f, -0.014790f, 0.003244f, -0.020925f, -0.000470f, 0.002801f, -0.052579f, 0.004418f, -0.015734f, 0.001539f, -0.020001f, -0.002925f, 0.014485f, 0.004937f, -0.005700f, -0.008552f, -0.026508f, 0.026655f, 0.029198f, 0.007456f, 0.009015f, -0.025547f, 0.039833f, 0.013411f, 0.020277f, 0.051610f, 0.018784f, 0.035651f, -0.032755f, 0.008830f, 0.036213f, -0.009585f, -0.011911f, 0.006068f, -0.021063f, 0.017793f, 0.004997f, -0.024403f, -0.032697f, -0.001352f, 0.029059f, 0.000455f, -0.001617f, 0.019773f, -0.027069f, -0.005808f, -0.022207f, 0.014091f, -0.038302f, 0.001954f, -0.007786f, 0.015479f, -0.040106f, -0.026666f, -0.017295f, 0.013306f, 0.013461f, 0.010485f, -0.012814f, 0.011340f, -0.009491f, 0.013545f, -0.007782f, -0.002009f, + -0.002596f, -0.009817f, 0.007863f, 0.019581f, 0.010773f, 0.019739f, -0.001479f, -0.015849f, 0.002437f, -0.015736f, 0.046388f, -0.009992f, -0.046008f, -0.012454f, 0.012177f, 0.041603f, -0.040241f, -0.014526f, -0.003168f, 0.027482f, 0.000915f, -0.054367f, -0.007809f, 0.027970f, 0.052580f, 0.003989f, 0.036029f, 0.055850f, -0.005645f, 0.019338f, 0.023426f, -0.005066f, 0.043392f, -0.004270f, 0.052307f, 0.010547f, -0.019046f, -0.046316f, 0.021256f, 0.025759f, -0.044313f, -0.043054f, 0.011327f, -0.010032f, 0.001271f, -0.017099f, 0.040069f, -0.017991f, -0.011661f, 0.014038f, 0.009926f, 0.000487f, -0.018521f, -0.013323f, -0.022520f, 0.009158f, -0.001474f, -0.010637f, -0.001977f, 0.026916f, 0.039910f, -0.043156f, -0.002990f, -0.042064f, -0.004741f, -0.010650f, 0.041711f, -0.017393f, -0.017187f, -0.007794f, 0.025269f, 0.008873f, 0.006771f, 0.011140f, 0.009935f, -0.007105f, 0.000215f, -0.004973f, 0.006526f, -0.004441f, 0.038981f, -0.009611f, 0.010130f, 0.028334f, -0.014695f, -0.031001f, 0.006778f, 0.011626f, -0.011439f, -0.011288f, -0.002909f, 0.007499f, 0.019693f, -0.026122f, 0.036245f, 0.054769f, + 0.035857f, -0.013737f, -0.021767f, -0.048164f, -0.064023f, -0.021920f, -0.000107f, -0.009721f, -0.002924f, -0.005139f, 0.015905f, 0.001214f, -0.023705f, 0.016099f, -0.009179f, 0.001693f, 0.026757f, 0.045232f, -0.022260f, 0.043657f, 0.019946f, 0.025076f, 0.037371f, 0.057425f, -0.021287f, 0.029982f, -0.057990f, -0.006656f, -0.025698f, -0.056990f, 0.023863f, 0.014180f, 0.018100f, 0.008247f, 0.023388f, 0.007512f, -0.040834f, 0.035426f, 0.062194f, -0.008670f, -0.009329f, 0.015638f, 0.006707f, -0.012320f, -0.054342f, 0.005051f, 0.000782f, -0.004443f, 0.001333f, 0.019241f, -0.038676f, 0.009057f, 0.011748f, -0.007519f, -0.022052f, -0.010481f, -0.024643f, 0.026275f, -0.055783f, -0.007604f, -0.035660f, 0.020723f, 0.008765f, 0.021016f, -0.006559f, 0.006162f, -0.013794f, 0.035122f, 0.011021f, 0.028957f, -0.025134f, 0.028493f, 0.000020f, -0.026595f, 0.056984f, -0.008637f, 0.007581f, 0.038766f, -0.035841f, 0.043406f, 0.026219f, -0.032592f, 0.014882f, -0.011888f, 0.019581f, -0.045326f, 0.034779f, 0.005865f, 0.012987f, -0.003154f, 0.012354f, -0.036277f, 0.026101f, 0.043997f, -0.077330f, 0.008778f, + 0.034698f, -0.020424f, -0.024702f, -0.000411f, -0.023652f, -0.010492f, -0.063027f, -0.053630f, -0.007190f, -0.030567f, -0.036964f, -0.026385f, 0.016764f, -0.009075f, -0.018623f, -0.029751f, 0.028151f, 0.002411f, -0.045526f, -0.006651f, -0.000089f, -0.021171f, -0.006689f, 0.019167f, 0.013478f, -0.002575f, 0.000296f, 0.001538f, -0.011359f, 0.010455f, 0.021445f, -0.007270f, -0.005003f, 0.033535f, -0.061481f, -0.009227f, 0.017394f, 0.066482f, -0.027125f, -0.016150f, -0.024444f, -0.032390f, 0.014566f, 0.070623f, 0.012964f, 0.044163f, 0.008930f, -0.006020f, -0.003629f, -0.004033f, -0.033604f, 0.008551f, 0.007609f, -0.026112f, 0.006066f, 0.055732f, -0.008822f, -0.015372f, 0.009133f, -0.018034f, -0.004461f, 0.049604f, 0.070994f, 0.020886f, 0.042668f, 0.051121f, -0.017351f, -0.018484f, 0.005810f, -0.013945f, 0.003125f, -0.046036f, 0.000105f, -0.034756f, 0.012475f, 0.012102f, 0.024178f, 0.050970f, 0.057513f, -0.022269f, 0.129387f, -0.017141f, 0.003562f, -0.023284f, 0.015786f, -0.009549f, 0.015598f, 0.033593f, 0.010013f, -0.030346f, -0.016106f, -0.031745f, 0.000120f, -0.021413f, -0.039267f, 0.005814f, + 0.026579f, -0.003943f, 0.008217f, 0.012716f, 0.015877f, 0.000165f, -0.010829f, -0.014674f, 0.008346f, 0.000253f, -0.019205f, 0.008139f, 0.056070f, 0.039426f, 0.022957f, -0.046688f, 0.034430f, 0.026583f, -0.011662f, -0.014141f, -0.013645f, -0.018640f, -0.007362f, 0.015310f, -0.033270f, 0.003287f, 0.004955f, 0.020372f, 0.053495f, 0.010094f, 0.011649f, 0.002688f, -0.005617f, -0.010960f, 0.023576f, -0.014271f, 0.053965f, 0.016619f, -0.004514f, 0.022660f, 0.005038f, -0.036803f, -0.025294f, 0.029180f, 0.035409f, 0.011560f, -0.008372f, 0.021414f, 0.025205f, 0.033253f, 0.069560f, 0.004350f, -0.020390f, -0.040088f, -0.024928f, 0.011565f, 0.001496f, 0.013157f, 0.020973f, -0.019921f, 0.092176f, -0.013608f, 0.003992f, 0.010298f, -0.006869f, -0.001188f, 0.023182f, -0.017028f, -0.020163f, -0.010526f, 0.029893f, 0.026726f, -0.071079f, 0.013850f, 0.012301f, 0.029250f, -0.018079f, -0.027956f, -0.026626f, 0.020516f, 0.018573f, -0.028546f, -0.015532f, -0.011612f, 0.048075f, 0.024297f, 0.013639f, -0.009085f, -0.049448f, 0.014289f, 0.012676f, 0.025833f, -0.005967f, 0.013869f, -0.013589f, 0.005135f, + -0.042944f, 0.018232f, 0.017797f, 0.000991f, -0.010544f, -0.026645f, -0.053498f, 0.035213f, -0.022492f, 0.018368f, 0.018405f, 0.031265f, 0.004298f, -0.032070f, 0.054333f, 0.011333f, -0.053297f, -0.023898f, 0.031578f, 0.008435f, 0.041271f, 0.018601f, 0.006305f, -0.036770f, -0.019545f, 0.022443f, -0.067075f, 0.072471f, -0.052356f, 0.004623f, 0.040181f, -0.009369f, 0.080842f, 0.015154f, 0.009624f, -0.027564f, 0.087941f, 0.013105f, 0.025374f, -0.015368f, 0.028344f, 0.071993f, 0.021234f, 0.043758f, 0.056788f, -0.006519f, 0.065694f, -0.057611f, -0.023257f, -0.024114f, -0.021794f, 0.003573f, 0.007336f, -0.008481f, -0.027786f, -0.050063f, 0.040245f, 0.037967f, 0.013660f, 0.033926f, -0.066017f, -0.057465f, 0.013959f, 0.021755f, -0.032756f, -0.044041f, 0.021539f, -0.016520f, -0.061876f, -0.025053f, -0.015176f, 0.024718f, -0.057263f, 0.025543f, 0.015717f, 0.019455f, -0.029064f, -0.005287f, -0.028816f, -0.014572f, -0.074965f, -0.020999f, 0.029950f, -0.115766f, -0.039832f, -0.008028f, -0.006876f, 0.000164f, -0.071781f, -0.020454f, -0.105910f, -0.012113f, 0.015599f, -0.032518f, -0.036242f, -0.016715f, + 0.026009f, -0.013845f, -0.041145f, -0.045201f, -0.110474f, -0.041162f, 0.044948f, -0.050185f, -0.075913f, 0.056460f, -0.023402f, -0.083205f, 0.019563f, 0.069482f, -0.043369f, -0.020185f, 0.004106f, -0.054756f, 0.060448f, 0.089518f, 0.122972f, -0.017073f, -0.002156f, -0.045518f, -0.046287f, -0.080305f, 0.036344f, -0.011822f, 0.122445f, -0.023316f, -0.051209f, -0.070598f, 0.005309f, 0.025132f, -0.025996f, 0.025399f, 0.080078f, -0.028784f, -0.013380f, -0.052624f, -0.024549f, 0.056381f, 0.062304f, -0.059366f, -0.017262f, 0.034841f, -0.013190f, 0.017156f, -0.018467f, 0.080963f, 0.062369f, 0.135895f, 0.043090f, 0.062021f, -0.026386f, 0.045530f, 0.089268f, 0.032675f, -0.006291f, 0.024602f, -0.003744f, 0.062264f, 0.029703f, 0.089180f, 0.022981f, -0.081952f, 0.028990f, 0.037391f, 0.069438f, -0.035329f, -0.035352f, 0.045518f, 0.042694f, -0.016585f, 0.069173f, -0.020126f, 0.026912f, -0.073318f, 0.046984f, -0.013213f, 0.024312f, 0.033206f, 0.059251f, 0.059633f, -0.046608f, -0.039200f, -0.018460f, 0.071381f, 0.061642f, -0.018884f, -0.041987f, -0.064386f, -0.014298f, 0.055469f, 0.047950f, 0.040299f, + -0.024656f, -0.093296f, 0.011937f, 0.155974f, 0.095104f, -0.015859f, -0.216063f, -0.026382f, -0.017506f, 0.022559f, -0.020242f, 0.009502f, 0.027942f, -0.003081f, 0.014822f, -0.042675f, 0.035566f, 0.042425f, 0.073158f, -0.043867f, -0.057580f, 0.070163f, 0.107085f, 0.031437f, -0.040633f, -0.054819f, -0.008193f, 0.021012f, 0.010548f, 0.022042f, 0.005216f, 0.028459f, 0.013911f, 0.072800f, -0.016463f, -0.085569f, -0.034850f, 0.035711f, 0.015710f, -0.025386f, -0.035183f, 0.011778f, 0.048240f, 0.083361f, 0.075519f, 0.005180f, 0.006282f, 0.035743f, -0.022080f, -0.072143f, 0.029296f, -0.042200f, 0.100359f, 0.111576f, 0.003331f, 0.037010f, 0.020471f, 0.028606f, -0.040367f, 0.001464f, 0.104966f, -0.028918f, 0.007000f, -0.125844f, -0.011558f, 0.024449f, 0.037765f, 0.039068f, 0.034853f, -0.022890f, -0.013544f, 0.072324f, 0.097152f, -0.002925f, 0.004600f, 0.024422f, 0.008654f, -0.013163f, -0.101185f, -0.042656f, 0.077503f, 0.086121f, 0.081099f, 0.111406f, 0.017192f, -0.049824f, -0.151104f, -0.114151f, -0.023720f, 0.030409f, 0.091719f, 0.101552f, 0.045787f, 0.001318f, -0.052838f, -0.044137f, + -0.022242f, 0.031200f, 0.084807f, 0.049237f, -0.015013f, 0.002493f, -0.010776f, -0.048999f, -0.069950f, -0.054750f, 0.006137f, 0.080502f, 0.056645f, 0.121379f, 0.074784f, 0.078020f, 0.105704f, -0.032621f, -0.081359f, -0.087246f, -0.120653f, -0.142397f, -0.059272f, -0.017122f, 0.036152f, 0.077834f, 0.106503f, 0.105177f, 0.078910f, 0.053913f, 0.101176f, -0.021565f, -0.076395f, -0.003576f, -0.025851f, 0.028331f, 0.023808f, 0.129100f, 0.103347f, -0.042484f, 0.009739f, -0.029925f, -0.098070f, -0.026066f, 0.010419f, -0.052684f, 0.066622f, -0.032823f, 0.011340f, 0.006265f, -0.026508f, 0.069131f, 0.077015f, 0.076934f, 0.031479f, -0.039797f, -0.122488f, 0.053299f, 0.015965f, -0.210843f, -0.222351f, -0.232017f, -0.237811f, -0.318452f, -0.023897f, -0.081942f, -0.010657f, 0.042097f, 0.162244f, 0.181967f, 0.188548f, 0.258231f, 0.353676f, 0.338317f, 0.333703f, 0.269234f, 0.198574f, 0.146168f, 0.052531f, -0.145741f, -0.063202f, -0.082175f, -0.045537f, -0.177603f, -0.019690f, -0.068128f, -0.074163f, -0.145920f, -0.108067f, -0.112470f, -0.098951f, -0.106368f, -0.190943f, -0.170592f, -0.095022f, -0.087855f, + -0.109667f, -0.158907f, -0.015640f, -0.138934f, -0.265940f, -0.230198f, -0.198349f, -0.104417f, -0.132632f, -0.021375f, -0.277471f, -0.123376f, -0.119759f, -0.056812f, -0.037184f, -0.146549f, 0.010581f, -0.148501f, -0.015136f, 0.019248f, 0.069612f, 0.000126f, 0.069271f, 0.096616f, 0.161740f, 0.164321f, 0.235538f, 0.141716f, 0.369296f, 0.217842f, 0.425284f, 0.270191f, 0.413938f, 0.469188f, 0.565918f, 0.435974f, 0.432438f, 0.454483f, 0.299365f, 0.128237f, 0.082628f}, + {-0.017642f, 0.019321f, -0.011241f, 0.000801f, -0.009383f, 0.004387f, 0.002124f, 0.003191f, -0.010388f, -0.007148f, 0.000225f, -0.006680f, -0.000759f, 0.004320f, -0.000816f, -0.002311f, -0.001183f, 0.004840f, -0.002007f, -0.003259f, 0.013307f, -0.000032f, -0.010422f, -0.004840f, 0.004458f, 0.001062f, 0.004150f, -0.009208f, 0.001005f, -0.009683f, 0.001462f, 0.008124f, -0.001016f, 0.005127f, 0.005314f, 0.004901f, -0.005454f, -0.002367f, -0.003187f, 0.001758f, -0.001378f, 0.003424f, -0.009015f, -0.004308f, -0.003822f, 0.000461f, -0.002275f, 0.005031f, 0.006558f, 0.010401f, -0.004126f, -0.005629f, -0.002680f, 0.002568f, 0.006815f, 0.007778f, 0.006301f, -0.001414f, -0.009127f, 0.011647f, -0.007642f, 0.004156f, -0.008037f, 0.006696f, -0.005328f, 0.004010f, -0.004847f, 0.000364f, -0.005148f, -0.003638f, -0.000379f, -0.001869f, 0.004009f, 0.002573f, -0.000680f, -0.008320f, 0.031894f, 0.004351f, -0.010256f, 0.005095f, 0.005774f, 0.002093f, -0.013024f, 0.006177f, 0.009540f, -0.009936f, -0.002841f, -0.012211f, -0.002530f, -0.005107f, -0.004338f, -0.001639f, 0.000879f, -0.000291f, 0.001457f, 0.004579f, + -0.005299f, 0.002595f, -0.012448f, 0.004489f, 0.007996f, 0.001785f, -0.003105f, -0.010136f, 0.006938f, -0.004383f, 0.011087f, 0.009381f, -0.000155f, -0.004185f, 0.009098f, 0.010435f, 0.008556f, 0.008510f, 0.002355f, -0.006312f, 0.002296f, 0.008056f, -0.003039f, -0.006599f, 0.006340f, 0.009690f, -0.003886f, 0.005121f, -0.010558f, -0.000771f, -0.009204f, 0.006649f, -0.012347f, -0.003297f, -0.001983f, 0.004497f, 0.006749f, 0.004646f, 0.000077f, -0.006571f, 0.001302f, -0.009137f, -0.005634f, 0.001916f, -0.000580f, -0.005378f, 0.003718f, 0.003448f, 0.001544f, 0.006242f, -0.004359f, 0.002999f, -0.005979f, -0.002156f, -0.001513f, 0.004937f, 0.018000f, -0.018341f, 0.000590f, 0.000225f, -0.004721f, -0.005571f, -0.005935f, 0.001795f, -0.010385f, -0.010234f, 0.001328f, 0.004835f, -0.000483f, 0.005749f, 0.004443f, -0.005663f, 0.002190f, -0.020095f, -0.005004f, -0.004555f, -0.004765f, -0.006389f, -0.007067f, -0.017714f, -0.013811f, 0.001804f, 0.004019f, -0.001022f, 0.009438f, 0.007564f, 0.003103f, -0.003467f, -0.002013f, 0.008877f, -0.003563f, 0.001044f, -0.001413f, -0.009457f, 0.003035f, -0.003206f, + -0.006509f, -0.002532f, 0.007574f, 0.018502f, -0.007185f, 0.002017f, 0.004411f, -0.003487f, 0.005737f, 0.002558f, -0.006592f, 0.003727f, -0.015443f, -0.007156f, 0.000068f, 0.006216f, 0.009638f, -0.006033f, -0.002874f, -0.000734f, -0.022332f, 0.003722f, 0.011390f, 0.000534f, 0.001568f, 0.006185f, -0.003716f, 0.009690f, 0.013141f, -0.001833f, 0.003677f, 0.007753f, 0.007490f, 0.001241f, 0.000410f, -0.004002f, -0.005076f, -0.005043f, -0.015883f, 0.003371f, 0.000307f, -0.015357f, 0.002045f, 0.008230f, 0.012190f, 0.002967f, -0.009247f, 0.020895f, -0.003122f, -0.004388f, 0.009638f, -0.006360f, -0.006277f, 0.000799f, -0.008020f, 0.009200f, 0.009099f, -0.004020f, -0.014533f, -0.007232f, 0.006745f, -0.009357f, 0.019760f, 0.017140f, -0.014209f, -0.017164f, 0.000253f, 0.002974f, -0.016508f, -0.001253f, 0.006295f, 0.004332f, -0.008289f, -0.004791f, 0.018130f, -0.002160f, 0.012342f, -0.001459f, -0.004568f, -0.004501f, -0.009984f, 0.001468f, -0.001815f, 0.009802f, -0.009010f, 0.002116f, -0.002735f, 0.001656f, -0.005547f, -0.000867f, 0.007886f, 0.006489f, -0.011140f, 0.016231f, 0.000746f, -0.000311f, + -0.000917f, -0.001760f, 0.003759f, -0.002542f, -0.015496f, -0.002395f, -0.008621f, 0.012485f, 0.004432f, -0.000072f, 0.014682f, -0.009218f, 0.009264f, 0.009718f, -0.000645f, -0.008611f, -0.038023f, 0.008270f, 0.001654f, 0.026451f, -0.001811f, 0.010396f, -0.014789f, 0.002715f, -0.011168f, -0.002987f, -0.005648f, -0.002111f, 0.004585f, -0.003314f, 0.004262f, 0.008624f, 0.006569f, 0.025046f, 0.017247f, -0.012001f, 0.005510f, -0.001065f, 0.004374f, 0.002552f, -0.003576f, -0.025774f, 0.006087f, -0.001768f, -0.000566f, 0.009120f, -0.001825f, -0.007559f, -0.005225f, -0.001708f, -0.008173f, -0.004752f, -0.020536f, -0.005288f, 0.000224f, -0.007704f, -0.001576f, 0.007807f, 0.011693f, -0.004478f, 0.014522f, -0.011710f, 0.002138f, 0.004422f, 0.001640f, -0.004111f, -0.008105f, 0.004822f, -0.002261f, 0.002669f, -0.006097f, -0.009021f, 0.001244f, 0.003994f, -0.008624f, 0.007087f, -0.005983f, 0.018010f, 0.019793f, -0.007082f, 0.007052f, 0.006656f, -0.001311f, -0.003747f, -0.002950f, -0.025778f, 0.010018f, 0.008591f, 0.000096f, -0.005652f, -0.010449f, -0.000588f, -0.003869f, -0.012379f, -0.007727f, -0.011978f, + 0.012621f, 0.007322f, -0.000727f, 0.014516f, -0.007265f, 0.013050f, -0.013992f, -0.013463f, 0.007064f, -0.021674f, -0.007422f, 0.005841f, 0.013748f, 0.017779f, -0.002680f, 0.013339f, -0.000077f, 0.012711f, 0.004978f, 0.002295f, -0.001659f, 0.000948f, 0.012796f, -0.005652f, -0.000909f, 0.002511f, 0.001477f, -0.011977f, -0.001116f, -0.006393f, 0.025685f, -0.011850f, -0.011829f, -0.002750f, 0.012333f, 0.012202f, 0.010720f, 0.013978f, -0.001952f, 0.002726f, -0.002618f, -0.006649f, 0.005656f, -0.000441f, -0.000854f, -0.007653f, 0.020280f, 0.012376f, -0.005664f, 0.003917f, 0.006328f, -0.010331f, 0.002697f, 0.007816f, -0.001467f, 0.014964f, -0.005512f, -0.001852f, -0.015663f, -0.006039f, -0.013234f, 0.000654f, 0.019475f, -0.007441f, 0.005878f, 0.003246f, 0.001184f, -0.005195f, -0.001232f, 0.000134f, -0.004143f, 0.009075f, -0.008994f, -0.004320f, -0.001082f, -0.003766f, -0.035133f, 0.026098f, 0.003089f, -0.012719f, -0.030967f, -0.002788f, 0.001193f, -0.018224f, -0.001267f, 0.008958f, 0.007780f, 0.000991f, -0.004933f, 0.007145f, 0.022852f, 0.023034f, -0.009288f, -0.010395f, -0.024188f, 0.005215f, + -0.003964f, 0.024232f, -0.009266f, -0.000254f, -0.005110f, 0.009286f, -0.002162f, -0.024284f, 0.008605f, -0.000890f, -0.013990f, 0.000273f, 0.002877f, -0.001738f, -0.001881f, -0.009838f, -0.013431f, 0.008792f, 0.002756f, 0.011418f, -0.009043f, 0.019047f, 0.009616f, -0.003639f, -0.015938f, -0.003063f, 0.006771f, 0.018631f, 0.006485f, -0.010155f, -0.003926f, 0.008789f, 0.006372f, -0.005096f, -0.001710f, 0.009254f, 0.008320f, 0.009757f, 0.019215f, 0.020586f, 0.010990f, 0.011080f, 0.013619f, -0.007070f, 0.003006f, -0.013211f, 0.014737f, 0.002366f, 0.008173f, -0.009389f, -0.013481f, 0.003608f, -0.017562f, -0.006784f, -0.006890f, 0.013846f, -0.012860f, -0.000849f, 0.023798f, 0.014597f, 0.020106f, 0.003753f, -0.022190f, -0.007375f, 0.023367f, -0.006856f, -0.014952f, -0.015573f, -0.015336f, -0.016219f, 0.008781f, 0.008923f, 0.005697f, 0.005211f, 0.005385f, 0.022481f, -0.002877f, 0.009707f, -0.019470f, -0.021901f, 0.014524f, -0.000865f, -0.011987f, 0.000764f, -0.030465f, -0.010012f, -0.010314f, 0.003642f, -0.001143f, -0.002896f, -0.021449f, -0.014086f, 0.002304f, 0.014669f, 0.023926f, -0.009610f, + -0.009471f, 0.012685f, -0.016527f, -0.001284f, -0.000889f, 0.005408f, 0.010457f, 0.008452f, 0.016599f, -0.009045f, 0.024089f, 0.011245f, -0.026057f, 0.012877f, -0.014471f, -0.017434f, -0.014346f, -0.021077f, 0.018969f, 0.004245f, -0.022202f, 0.002312f, 0.004814f, 0.001784f, 0.003687f, -0.004434f, 0.015906f, -0.009548f, 0.012357f, -0.019970f, 0.015110f, -0.010650f, -0.008378f, 0.000686f, 0.007422f, -0.002976f, 0.012172f, 0.051098f, -0.043076f, 0.022225f, 0.023110f, -0.018486f, -0.002060f, 0.031214f, 0.012301f, 0.020408f, 0.007184f, -0.004923f, 0.046127f, -0.000188f, -0.006787f, 0.001561f, 0.001702f, 0.023010f, 0.035079f, 0.014317f, 0.001319f, 0.002304f, 0.006584f, 0.013159f, 0.001391f, 0.007760f, -0.021882f, 0.012753f, 0.019821f, -0.002163f, 0.009008f, 0.001681f, 0.004953f, -0.013416f, -0.010224f, 0.002555f, 0.001051f, 0.022408f, 0.011795f, 0.010292f, -0.007131f, -0.008965f, -0.009113f, 0.013678f, 0.018911f, 0.001936f, -0.003952f, 0.035621f, 0.019141f, 0.024430f, -0.010529f, -0.023357f, -0.003134f, -0.024515f, -0.015685f, -0.006021f, -0.009290f, 0.000463f, 0.021537f, -0.004225f, + 0.002571f, -0.014085f, -0.015407f, 0.021866f, 0.000940f, 0.011443f, 0.011863f, -0.007913f, 0.021070f, 0.007440f, 0.003992f, -0.003866f, -0.010173f, 0.017870f, -0.001765f, -0.022769f, 0.018313f, 0.017918f, -0.035265f, 0.003640f, 0.010741f, -0.017582f, 0.013457f, -0.029923f, 0.005951f, 0.008449f, -0.004664f, -0.012110f, -0.015764f, -0.017850f, -0.030348f, 0.003357f, 0.032607f, -0.011400f, 0.015214f, 0.008651f, 0.023933f, 0.012940f, -0.010459f, -0.021673f, 0.009947f, -0.005637f, -0.008739f, -0.022381f, -0.004492f, -0.003141f, -0.010076f, -0.009625f, -0.006378f, -0.015678f, -0.021810f, 0.023837f, -0.003733f, -0.013878f, 0.017300f, 0.006640f, -0.017860f, 0.002523f, -0.002775f, 0.010768f, -0.023372f, 0.006266f, 0.005750f, -0.031905f, 0.008920f, 0.010706f, -0.018410f, 0.005020f, -0.000729f, -0.004880f, 0.009774f, 0.001455f, -0.004435f, 0.001821f, 0.005709f, 0.022096f, 0.014765f, 0.022585f, 0.012632f, 0.008413f, -0.008533f, 0.033471f, -0.011392f, -0.016212f, 0.033181f, 0.003111f, 0.018430f, 0.005467f, -0.011089f, -0.033092f, -0.035850f, -0.007002f, -0.003307f, -0.011782f, -0.012023f, -0.059698f, + 0.026114f, 0.047595f, 0.001363f, -0.030228f, 0.010743f, -0.007248f, -0.004085f, 0.006104f, 0.002672f, 0.010751f, -0.017178f, -0.000290f, 0.042331f, 0.032164f, 0.027716f, -0.034655f, -0.003586f, 0.006002f, 0.014854f, -0.017675f, -0.019782f, -0.006485f, 0.003366f, 0.013450f, 0.005399f, -0.043988f, -0.049948f, 0.012801f, -0.003914f, 0.024822f, 0.025150f, -0.019782f, 0.020378f, 0.016299f, 0.021898f, -0.003698f, -0.016961f, -0.017140f, 0.009127f, -0.018040f, -0.008667f, -0.002076f, -0.003268f, 0.012471f, 0.028297f, 0.015297f, -0.011144f, -0.009408f, -0.018047f, -0.006030f, -0.001433f, 0.006225f, -0.006162f, -0.007613f, 0.012260f, 0.007389f, -0.026382f, -0.002518f, -0.002154f, 0.025848f, -0.017360f, -0.018366f, -0.033972f, -0.012655f, 0.001742f, -0.000221f, 0.012142f, -0.005675f, 0.000078f, -0.015919f, -0.024484f, -0.020568f, -0.023135f, -0.012549f, 0.003822f, -0.038866f, 0.007927f, 0.007292f, 0.006351f, 0.010142f, 0.029953f, 0.003084f, 0.026154f, -0.002777f, 0.033707f, 0.016953f, 0.026546f, 0.016274f, 0.008513f, -0.012077f, -0.000152f, -0.007390f, 0.018656f, 0.005628f, 0.016575f, -0.014223f, + -0.001295f, 0.027527f, -0.032120f, -0.018332f, 0.027438f, -0.043791f, -0.018019f, 0.003566f, -0.006935f, -0.021605f, 0.045967f, -0.007747f, 0.032293f, 0.012459f, -0.025060f, -0.003988f, -0.008312f, -0.032268f, -0.040170f, 0.033543f, 0.001589f, -0.012262f, 0.010273f, 0.000514f, -0.003507f, 0.012063f, 0.006958f, -0.004538f, -0.013176f, 0.002696f, 0.034067f, 0.026527f, -0.019646f, 0.008389f, 0.004390f, 0.024583f, -0.008601f, 0.016428f, -0.033040f, -0.009364f, 0.027780f, 0.007522f, -0.004826f, 0.028503f, -0.005639f, 0.019609f, -0.035957f, -0.047219f, -0.012169f, -0.000362f, -0.027663f, 0.033850f, 0.030682f, 0.034192f, -0.009498f, -0.013999f, -0.003383f, 0.040161f, 0.028872f, 0.045254f, -0.040284f, -0.030318f, -0.068975f, 0.029627f, -0.007704f, -0.058999f, -0.011449f, 0.005492f, 0.008658f, -0.022120f, 0.023967f, 0.020144f, 0.002265f, -0.000396f, 0.003736f, -0.009903f, -0.020519f, 0.004368f, -0.011671f, -0.019365f, -0.000255f, 0.044482f, 0.001383f, -0.006974f, -0.035719f, 0.014856f, 0.028198f, -0.014820f, -0.043101f, -0.008064f, 0.014514f, 0.004888f, -0.009162f, 0.009106f, 0.003049f, 0.015195f, + -0.004385f, 0.025236f, 0.039036f, 0.014426f, -0.026026f, 0.029064f, 0.013201f, -0.033689f, -0.035482f, 0.038046f, 0.018530f, -0.015472f, -0.017385f, -0.001378f, -0.031514f, 0.022405f, 0.030119f, -0.001346f, 0.001529f, 0.006934f, -0.004086f, 0.032363f, 0.010894f, 0.007757f, -0.014021f, 0.004383f, 0.010859f, 0.039790f, -0.010194f, 0.014356f, -0.032115f, -0.037708f, 0.031734f, -0.006903f, -0.003485f, 0.000503f, 0.030202f, -0.004078f, -0.007629f, -0.010603f, -0.014653f, -0.047743f, -0.004973f, -0.031604f, -0.063065f, -0.064891f, -0.028735f, -0.049787f, -0.023251f, -0.008916f, 0.007589f, 0.026223f, 0.029232f, 0.002093f, -0.017636f, 0.031742f, -0.017845f, 0.015146f, -0.062347f, -0.006999f, -0.043159f, -0.029124f, 0.027188f, 0.018988f, 0.018174f, 0.005509f, 0.039669f, -0.005068f, -0.003814f, -0.030388f, -0.011481f, -0.006840f, -0.021334f, -0.021148f, -0.051533f, -0.020634f, -0.006849f, -0.008963f, -0.032400f, 0.026643f, 0.009619f, 0.015571f, -0.015030f, -0.006088f, -0.077608f, -0.022781f, -0.022395f, 0.016866f, 0.037680f, -0.024855f, -0.005112f, -0.045192f, -0.004652f, 0.022100f, -0.008754f, -0.015762f, + 0.008488f, 0.032027f, 0.054407f, 0.010986f, 0.000184f, -0.003896f, -0.016657f, -0.023249f, 0.013248f, -0.015698f, 0.048953f, 0.008888f, 0.019940f, 0.102129f, -0.022660f, -0.019560f, -0.028399f, -0.039613f, -0.050569f, 0.030584f, 0.049700f, -0.027511f, 0.002728f, 0.011992f, -0.015460f, -0.002948f, -0.034910f, 0.000301f, -0.018987f, 0.053634f, 0.001337f, -0.008950f, 0.043610f, -0.009795f, 0.013668f, -0.047569f, 0.026551f, 0.008356f, 0.034188f, -0.014476f, 0.025842f, 0.043843f, 0.047735f, 0.026702f, 0.043194f, 0.022062f, -0.005143f, 0.041187f, -0.018115f, -0.026094f, -0.007029f, 0.016830f, 0.029028f, -0.065481f, -0.002957f, -0.042204f, 0.035409f, 0.015730f, 0.000730f, 0.012000f, 0.048983f, 0.002327f, 0.043894f, 0.018310f, 0.065663f, 0.005946f, -0.005698f, 0.028182f, 0.010875f, -0.032609f, 0.008625f, -0.003817f, -0.042227f, 0.030678f, -0.024841f, -0.042919f, -0.085892f, 0.006577f, -0.009216f, 0.051161f, -0.027107f, 0.068488f, 0.024252f, -0.001592f, -0.009029f, 0.026339f, 0.029787f, -0.050961f, -0.020083f, -0.037907f, 0.014362f, -0.017636f, 0.039121f, 0.010624f, 0.013054f, 0.011319f, + 0.035638f, -0.019817f, -0.022566f, -0.022008f, 0.034260f, 0.019126f, 0.043875f, 0.014147f, 0.131040f, -0.035636f, 0.002812f, 0.003663f, 0.062056f, 0.027589f, 0.029794f, -0.036543f, 0.019249f, -0.012649f, 0.003031f, -0.015275f, 0.005871f, 0.046346f, -0.009596f, 0.016805f, 0.085539f, 0.029420f, -0.036238f, -0.041242f, 0.006822f, 0.057897f, 0.030093f, 0.013717f, -0.019600f, 0.049922f, 0.009381f, -0.003412f, -0.049687f, 0.019199f, -0.006758f, 0.025689f, -0.045099f, -0.024566f, 0.003654f, -0.007951f, 0.007273f, -0.039309f, -0.000397f, -0.022323f, 0.013280f, 0.042550f, 0.031605f, 0.014354f, -0.058512f, 0.004957f, 0.006631f, -0.048890f, -0.047119f, -0.026892f, -0.025571f, -0.021125f, 0.042773f, 0.014832f, -0.000921f, 0.032996f, 0.044164f, 0.017393f, 0.038087f, 0.006975f, 0.024993f, 0.174651f, -0.038902f, 0.034443f, 0.018613f, -0.022369f, 0.005515f, -0.104200f, 0.003588f, 0.030014f, 0.073157f, -0.026817f, 0.003431f, -0.040907f, -0.028105f, 0.015606f, 0.035053f, -0.033108f, 0.050426f, 0.023632f, -0.053973f, 0.041123f, -0.018613f, -0.024766f, 0.003021f, -0.030955f, 0.013914f, -0.011373f, + 0.051483f, -0.021920f, 0.003642f, 0.029699f, -0.082678f, 0.017110f, 0.033394f, -0.022306f, 0.027824f, -0.049103f, 0.059597f, 0.010195f, 0.015463f, -0.096871f, 0.097712f, 0.043472f, 0.036500f, 0.006297f, -0.051062f, 0.057169f, 0.003411f, -0.021959f, 0.100350f, -0.014359f, -0.033902f, -0.017377f, 0.018577f, 0.031256f, 0.033083f, 0.011036f, -0.008045f, -0.105756f, -0.004490f, 0.031735f, 0.009790f, 0.044607f, -0.049266f, 0.063817f, 0.014820f, 0.024390f, -0.049566f, -0.012708f, 0.018941f, 0.080199f, -0.021654f, 0.021997f, -0.043933f, 0.052307f, 0.037960f, 0.049521f, -0.005815f, 0.024062f, 0.020318f, -0.055909f, -0.043386f, 0.033578f, 0.039407f, 0.012493f, -0.004230f, -0.080879f, 0.082929f, -0.012228f, -0.013860f, -0.025895f, -0.003818f, -0.062962f, -0.120787f, 0.047959f, 0.041453f, -0.001133f, -0.020571f, -0.046935f, -0.002956f, -0.011562f, -0.021639f, 0.053968f, -0.106861f, -0.043824f, -0.053534f, -0.013432f, -0.079678f, -0.003606f, -0.006657f, 0.001228f, -0.007923f, -0.013081f, 0.020460f, 0.003484f, -0.031116f, -0.007528f, 0.006211f, -0.047550f, -0.020441f, -0.010876f, 0.011364f, 0.044507f, + -0.012666f, 0.084750f, -0.033719f, -0.001321f, 0.042207f, -0.030958f, 0.030604f, 0.009482f, -0.045676f, -0.077127f, -0.010433f, 0.026253f, 0.085190f, 0.037993f, -0.046653f, -0.018568f, -0.153465f, -0.049144f, 0.000245f, 0.041090f, 0.102515f, 0.002099f, -0.081946f, 0.012723f, 0.067241f, -0.011094f, 0.012056f, 0.064178f, 0.076536f, 0.143462f, -0.126578f, -0.016881f, 0.044960f, 0.051371f, -0.017465f, -0.037003f, -0.040830f, -0.048087f, 0.019982f, -0.049625f, 0.010467f, -0.020872f, -0.118035f, 0.025106f, -0.021075f, 0.033156f, -0.033344f, -0.034714f, 0.001501f, -0.050402f, 0.007408f, -0.050859f, -0.001865f, -0.010192f, -0.020142f, 0.022073f, -0.037552f, -0.049701f, -0.044508f, -0.058120f, -0.010050f, -0.007974f, 0.061940f, 0.011958f, -0.046060f, -0.069700f, 0.008514f, -0.003422f, 0.015840f, -0.015257f, 0.037665f, -0.046690f, -0.017813f, -0.064786f, -0.040054f, -0.020272f, 0.002201f, -0.028786f, 0.065460f, -0.025243f, -0.055342f, 0.014761f, 0.068228f, 0.046452f, 0.020770f, -0.050646f, -0.030270f, -0.007799f, 0.062566f, 0.114604f, 0.000267f, 0.019923f, -0.020965f, -0.118572f, -0.023400f, 0.006811f, + 0.045653f, 0.094347f, -0.051820f, -0.070867f, 0.042134f, 0.013945f, -0.019594f, -0.001969f, -0.032471f, 0.016936f, -0.092465f, -0.017691f, 0.011335f, 0.016017f, -0.051815f, 0.058315f, -0.086900f, -0.120947f, -0.089933f, 0.070259f, 0.021991f, -0.123160f, -0.021289f, -0.084652f, 0.038868f, 0.008121f, -0.169889f, 0.012673f, -0.051847f, -0.109360f, -0.085353f, -0.124875f, 0.078631f, -0.037172f, -0.098657f, -0.043216f, 0.032834f, -0.057655f, -0.050474f, -0.038225f, -0.023061f, -0.042184f, -0.043018f, -0.078661f, -0.057636f, -0.108469f, -0.061665f, -0.054031f, -0.017855f, -0.049695f, -0.009908f, -0.021814f, -0.000672f, 0.006967f, 0.015598f, 0.033938f, -0.029536f, 0.028949f, 0.004163f, 0.060177f, 0.025836f, 0.039136f, 0.036978f, -0.099652f, -0.025942f, 0.087514f, -0.012866f, -0.046923f, -0.056587f, -0.038064f, 0.035002f, 0.139683f, -0.007091f, 0.003811f, -0.088101f, -0.085603f, -0.017229f, 0.025826f, 0.082673f, 0.001941f, 0.075804f, 0.035264f, -0.085606f, 0.168710f, 0.006281f, 0.134208f, 0.003927f, -0.020722f, 0.070864f, -0.077137f, -0.110830f, -0.060115f, -0.250315f, -0.139622f, -0.043393f, 0.130960f, + -0.042926f, -0.105215f, 0.123646f, 0.117922f, -0.073501f, -0.096190f, 0.000500f, 0.105619f, -0.010368f, -0.006093f, -0.031676f, 0.092146f, -0.008922f, -0.024818f, -0.000820f, 0.025153f, 0.048902f, 0.000832f, -0.033884f, -0.041029f, 0.058711f, 0.003547f, -0.022528f, -0.061667f, 0.036670f, 0.018168f, -0.004724f, -0.049029f, 0.017420f, 0.019454f, 0.019610f, -0.031664f, -0.015588f, 0.003901f, 0.049724f, -0.015412f, 0.019790f, -0.070820f, -0.016138f, -0.001785f, 0.048739f, -0.098205f, -0.013759f, 0.007141f, 0.072808f, -0.035647f, 0.014515f, -0.051690f, 0.010674f, 0.017597f, -0.029617f, -0.028702f, 0.000384f, 0.008098f, 0.025720f, -0.025281f, 0.006330f, -0.089293f, 0.051469f, -0.018176f, 0.085632f, -0.053898f, 0.041436f, -0.038289f, 0.043133f, 0.002241f, 0.031142f, 0.016123f, -0.055953f, 0.065153f, 0.020536f, 0.034996f, -0.062260f, 0.013246f, -0.011461f, 0.005283f, -0.036363f, -0.080423f, -0.106846f, 0.077336f, 0.051170f, -0.061059f, -0.086913f, -0.042730f, 0.039703f, 0.020705f, 0.052928f, 0.057077f, 0.010857f, -0.029240f, -0.008831f, 0.019778f, -0.020140f, -0.001909f, 0.011458f, 0.002968f, + 0.031701f, 0.022176f, 0.009306f, -0.029190f, -0.001516f, -0.018176f, 0.018185f, -0.030558f, -0.026712f, 0.021737f, -0.007472f, -0.012587f, -0.012604f, -0.021310f, -0.029380f, 0.001965f, 0.023061f, 0.021281f, 0.017504f, -0.007086f, -0.024363f, -0.020906f, -0.015036f, 0.025499f, 0.034387f, -0.016514f, -0.025062f, -0.010779f, 0.028391f, 0.014799f, 0.038174f, -0.027634f, -0.011124f, 0.015168f, -0.008029f, 0.001118f, -0.004898f, 0.013636f, 0.007500f, 0.011003f, 0.001545f, -0.026378f, 0.010053f, 0.004804f, -0.001818f, 0.020301f, -0.011434f, -0.005191f, 0.002642f, -0.003663f, 0.001757f, -0.007383f, 0.033686f, 0.009167f, -0.003437f, 0.034109f, 0.031288f, 0.037284f, -0.087947f, -0.232823f, -0.085079f, 0.042633f, 0.122308f, 0.257362f, 0.172545f, 0.044916f, 0.065910f, -0.033593f, -0.103626f, -0.172790f, -0.150094f, -0.119326f, -0.033746f, 0.005284f, 0.084367f, 0.092699f, 0.196837f, 0.095764f, 0.063632f, -0.004297f, -0.040842f, -0.093707f, -0.048030f, -0.075674f, -0.086984f, -0.053581f, -0.044347f, -0.002831f, 0.025517f, 0.073841f, 0.046360f, 0.053130f, 0.048904f, 0.048832f, 0.073825f, 0.006732f, + 0.051528f, -0.008920f, -0.021439f, -0.060979f, -0.035337f, -0.091169f, -0.133441f, -0.117406f, 0.002733f, -0.019758f, 0.038360f, 0.063505f, 0.036201f, 0.097785f, 0.086840f, 0.123480f, 0.071940f, 0.083690f, 0.005971f, 0.004025f, -0.064004f, -0.108015f, -0.123814f, -0.151583f, -0.096997f, -0.124097f, -0.007665f, -0.001170f, 0.062647f, 0.061494f, 0.153127f, 0.116142f, 0.171448f, 0.066082f, 0.083899f, 0.030162f, 0.007428f, -0.103700f, -0.130423f, -0.054680f, -0.037216f} + }, + { + {-0.011648f, 0.011284f, -0.008970f, 0.013289f, -0.002614f, -0.008362f, 0.002620f, 0.006764f, -0.003104f, 0.001663f, 0.006230f, -0.009285f, -0.006331f, -0.001735f, -0.005665f, 0.017967f, -0.007115f, 0.017668f, 0.005119f, 0.005993f, -0.002325f, -0.003817f, -0.006236f, -0.008200f, 0.000229f, 0.007699f, 0.000643f, 0.000997f, -0.004656f, 0.005098f, 0.007054f, 0.000604f, -0.003833f, -0.009288f, 0.006245f, -0.001724f, 0.007158f, -0.003047f, 0.001299f, 0.003204f, -0.005192f, 0.000033f, -0.009129f, 0.012456f, -0.000132f, 0.001842f, -0.001141f, -0.010910f, -0.002817f, -0.003217f, 0.000880f, 0.001760f, 0.006378f, 0.002867f, -0.004297f, -0.006640f, 0.003219f, -0.003981f, -0.002069f, 0.007896f, -0.004392f, 0.005589f, -0.007763f, 0.004229f, -0.008993f, 0.004500f, -0.006026f, -0.003205f, 0.009115f, 0.004184f, 0.004955f, -0.001339f, 0.000714f, 0.002010f, 0.002247f, 0.003204f, 0.014190f, 0.001462f, -0.003918f, -0.004082f, 0.002412f, -0.006932f, -0.000176f, -0.013457f, 0.009548f, 0.012169f, 0.008445f, 0.011981f, -0.014495f, 0.001142f, 0.003207f, -0.005158f, -0.004050f, -0.003528f, -0.016977f, -0.002848f, + 0.009932f, -0.017283f, -0.014151f, 0.008176f, 0.007294f, -0.011095f, -0.003992f, 0.007364f, 0.000818f, 0.008956f, 0.003698f, 0.009335f, -0.005982f, 0.001815f, 0.001147f, -0.002432f, 0.004184f, 0.003456f, 0.006160f, 0.002709f, -0.002956f, 0.000672f, 0.006885f, -0.001834f, -0.003393f, -0.001110f, -0.008729f, -0.018745f, 0.010999f, 0.005545f, -0.006110f, 0.008387f, -0.003538f, 0.001051f, -0.000532f, 0.003993f, -0.005231f, -0.001122f, 0.010855f, -0.010291f, -0.004502f, 0.003860f, 0.001495f, -0.001373f, -0.000868f, 0.005167f, 0.000174f, 0.004657f, -0.007897f, 0.008005f, 0.003438f, -0.009245f, 0.007224f, 0.001331f, 0.002191f, -0.000255f, -0.003723f, 0.022370f, -0.012703f, 0.004019f, -0.014055f, 0.001817f, 0.003405f, -0.014149f, -0.017951f, 0.004631f, -0.019487f, 0.004445f, -0.005019f, -0.001215f, -0.011922f, -0.001597f, -0.013400f, -0.006780f, 0.000135f, -0.014106f, 0.015238f, 0.005504f, -0.023579f, 0.002422f, -0.001226f, -0.004100f, -0.010050f, 0.005283f, 0.012350f, 0.000450f, -0.000828f, 0.011739f, -0.006692f, 0.000377f, -0.004232f, 0.007879f, -0.008865f, 0.002882f, 0.010850f, -0.009099f, + 0.009501f, 0.003605f, 0.010272f, -0.000563f, 0.002400f, -0.001208f, -0.004211f, 0.013704f, -0.016470f, 0.004207f, -0.007231f, -0.002770f, -0.002054f, -0.005582f, -0.004344f, -0.012718f, -0.008175f, -0.001531f, 0.008735f, -0.000148f, 0.003379f, 0.012678f, -0.000114f, -0.009715f, -0.001154f, 0.001185f, 0.003481f, -0.004173f, 0.000268f, -0.009196f, 0.000519f, -0.002914f, 0.003765f, 0.006887f, 0.008339f, 0.004815f, -0.003680f, -0.002774f, -0.005813f, -0.018890f, -0.000672f, -0.011567f, -0.003959f, -0.002269f, -0.013408f, -0.002234f, -0.003468f, 0.005970f, 0.014662f, 0.014738f, 0.001360f, -0.006955f, 0.005633f, -0.015180f, -0.002546f, -0.006092f, 0.004693f, -0.022394f, 0.007310f, 0.003260f, -0.001234f, -0.006766f, -0.009886f, -0.004775f, -0.008228f, -0.007160f, 0.003681f, -0.001913f, -0.008827f, -0.002894f, 0.001289f, 0.013888f, -0.000963f, -0.014902f, 0.000728f, 0.005808f, -0.000580f, -0.004971f, 0.000808f, 0.005042f, -0.016112f, -0.001621f, -0.007217f, 0.010663f, 0.006356f, 0.001502f, -0.014900f, 0.001289f, 0.005247f, 0.008578f, 0.008001f, -0.009870f, -0.004821f, 0.000145f, -0.003299f, -0.003253f, + 0.007476f, -0.005041f, 0.004484f, 0.001131f, -0.006355f, -0.001494f, -0.008606f, 0.010069f, 0.003631f, -0.009938f, -0.006994f, 0.001869f, 0.005292f, -0.007561f, -0.009855f, -0.001050f, 0.000937f, -0.005464f, -0.031614f, 0.009873f, 0.008831f, 0.014907f, -0.004165f, 0.009242f, -0.027259f, -0.007708f, 0.008280f, 0.000679f, -0.013560f, -0.003826f, -0.004619f, -0.024049f, -0.009753f, 0.002035f, -0.001222f, -0.017275f, 0.010436f, 0.014601f, -0.015500f, 0.011280f, -0.020250f, -0.007283f, -0.001873f, 0.006506f, -0.000153f, -0.008628f, 0.005509f, 0.002294f, -0.001351f, 0.008534f, -0.004343f, -0.006298f, -0.001771f, -0.003820f, -0.005903f, 0.008346f, -0.006722f, 0.001978f, 0.006755f, -0.001898f, -0.005129f, -0.010465f, -0.001027f, -0.007642f, -0.001951f, -0.008812f, -0.001982f, 0.017687f, 0.000654f, 0.010503f, -0.009888f, 0.008698f, -0.002551f, -0.015595f, -0.008403f, 0.007610f, -0.004962f, -0.008283f, 0.005992f, -0.009636f, 0.008049f, 0.001286f, -0.002058f, 0.008997f, 0.009579f, 0.003127f, -0.008735f, -0.011693f, 0.000324f, 0.013779f, 0.004200f, 0.001463f, -0.006579f, 0.001566f, -0.018418f, -0.017598f, + -0.012173f, 0.000323f, -0.004313f, 0.004870f, -0.007396f, -0.001664f, -0.000450f, -0.006445f, -0.003407f, 0.002327f, -0.006311f, 0.016961f, -0.013829f, 0.006928f, -0.004792f, -0.003004f, -0.010263f, -0.004129f, -0.002769f, 0.011859f, -0.010858f, -0.000545f, 0.001081f, -0.015125f, -0.009713f, -0.010909f, -0.009298f, -0.017278f, -0.006874f, 0.003750f, 0.008959f, 0.004818f, -0.013887f, -0.019276f, -0.005354f, -0.001328f, -0.010396f, -0.000252f, -0.007547f, -0.010989f, -0.023087f, -0.012760f, -0.016631f, 0.006780f, -0.005417f, 0.005126f, -0.010189f, -0.023013f, -0.012653f, -0.000962f, -0.005782f, -0.008930f, -0.004633f, -0.010339f, 0.009743f, -0.001079f, 0.005051f, 0.006632f, 0.000728f, -0.002522f, -0.008782f, -0.001877f, 0.008026f, -0.003891f, -0.008523f, -0.012064f, 0.014183f, -0.015387f, -0.019642f, -0.015271f, -0.008821f, -0.012586f, 0.010033f, 0.015686f, -0.015622f, 0.004637f, -0.034126f, 0.010989f, -0.002188f, 0.006497f, 0.019083f, 0.007853f, -0.004503f, 0.006871f, -0.014076f, 0.009305f, 0.010392f, -0.018189f, -0.003961f, -0.008895f, 0.010578f, 0.009839f, 0.014311f, 0.017324f, -0.021712f, -0.010424f, + 0.003438f, 0.019340f, -0.007223f, 0.009440f, -0.020897f, -0.005404f, -0.007520f, -0.003501f, -0.012836f, 0.004033f, -0.020841f, 0.015163f, -0.004441f, -0.002609f, 0.009889f, 0.000454f, 0.001833f, 0.012139f, -0.000295f, 0.010193f, 0.005382f, -0.001321f, -0.004280f, 0.000071f, -0.015173f, -0.009189f, -0.014010f, 0.000584f, 0.026352f, 0.007824f, 0.004236f, 0.000913f, -0.004958f, 0.001405f, 0.015070f, -0.001772f, 0.003738f, -0.029676f, 0.027473f, -0.005105f, -0.006830f, 0.003700f, 0.015915f, 0.008631f, -0.005012f, -0.008463f, 0.028748f, -0.003454f, -0.003005f, 0.012734f, -0.010939f, 0.003082f, 0.000710f, -0.003357f, 0.001209f, 0.010249f, 0.000448f, -0.001398f, 0.015426f, 0.008932f, 0.017091f, -0.006038f, -0.003442f, 0.010161f, -0.014806f, 0.014392f, 0.016179f, -0.007228f, -0.000869f, -0.024026f, 0.001610f, 0.009176f, 0.007300f, -0.004532f, -0.016391f, -0.033361f, 0.000937f, -0.005060f, -0.015802f, 0.004523f, 0.011224f, -0.014024f, -0.005972f, -0.015345f, 0.008477f, 0.001738f, -0.002111f, -0.004532f, -0.006727f, 0.018253f, 0.020546f, 0.008774f, 0.009896f, -0.003618f, -0.009995f, 0.029238f, + 0.007210f, -0.003867f, -0.016483f, 0.013242f, 0.000621f, 0.017299f, -0.001360f, 0.021172f, 0.010102f, 0.015171f, 0.011907f, 0.007207f, 0.015615f, 0.020727f, -0.000656f, 0.004848f, -0.006393f, 0.001092f, 0.010449f, 0.005824f, 0.005509f, -0.015847f, -0.006725f, -0.002119f, -0.015534f, -0.012755f, -0.010091f, 0.009833f, 0.015843f, 0.023667f, 0.027446f, 0.008517f, 0.001241f, 0.025457f, -0.010718f, 0.026713f, -0.024507f, -0.011325f, -0.002906f, 0.010462f, -0.022870f, 0.015123f, -0.022511f, 0.011669f, 0.000416f, 0.012346f, 0.019505f, -0.007450f, 0.017873f, 0.019297f, 0.018578f, -0.010161f, 0.015769f, -0.016107f, -0.012509f, -0.001761f, -0.009525f, 0.000095f, -0.008094f, 0.015154f, -0.010432f, 0.003505f, -0.010274f, -0.018928f, -0.008277f, -0.003839f, 0.023789f, -0.019217f, 0.018897f, 0.008177f, -0.026162f, 0.030951f, 0.008310f, 0.003562f, 0.022379f, 0.003950f, 0.001737f, -0.012165f, 0.000725f, -0.006771f, 0.025482f, 0.010476f, 0.018131f, -0.006698f, -0.003217f, 0.011929f, 0.021444f, -0.021474f, 0.022221f, 0.003884f, -0.002501f, -0.004023f, -0.019238f, 0.009729f, -0.008509f, 0.004092f, + 0.001987f, -0.018366f, 0.007336f, 0.015529f, -0.012906f, 0.009888f, 0.007729f, 0.021851f, 0.003674f, -0.001217f, 0.014666f, 0.019537f, 0.003154f, -0.009770f, 0.014567f, -0.011277f, -0.021309f, -0.015246f, 0.023036f, -0.029635f, 0.007369f, -0.015769f, 0.017486f, -0.018800f, 0.028616f, 0.009998f, 0.002638f, -0.024887f, 0.012551f, 0.021187f, 0.005402f, -0.012727f, -0.008531f, -0.007223f, 0.019388f, 0.010799f, -0.027587f, 0.004031f, -0.019603f, -0.000883f, 0.001947f, -0.016331f, 0.021398f, 0.022002f, -0.010190f, 0.005035f, 0.014440f, -0.017744f, -0.003093f, -0.005233f, -0.015303f, 0.032108f, -0.011935f, -0.006719f, -0.016410f, -0.026294f, -0.004679f, 0.000953f, -0.009698f, 0.004470f, -0.022603f, 0.002496f, 0.001039f, -0.003835f, 0.016924f, -0.002991f, -0.014181f, 0.007791f, -0.000631f, -0.009394f, 0.008070f, 0.038508f, -0.008231f, 0.009913f, 0.001311f, -0.024518f, -0.004949f, 0.023995f, 0.009444f, 0.023977f, -0.003221f, 0.014606f, -0.019007f, 0.009845f, 0.006948f, 0.004726f, -0.016433f, 0.016688f, 0.003860f, -0.036575f, 0.001926f, -0.002558f, 0.025338f, -0.045755f, 0.053303f, 0.006937f, + 0.021482f, -0.037400f, 0.021553f, 0.027842f, -0.030505f, 0.012646f, 0.016188f, 0.012711f, -0.019460f, 0.003397f, 0.004280f, -0.006062f, 0.012499f, 0.025024f, -0.018775f, -0.015464f, -0.005223f, 0.021329f, 0.018500f, 0.025918f, -0.000512f, 0.011383f, -0.018056f, -0.004160f, -0.004179f, 0.004868f, 0.012518f, 0.032918f, 0.019838f, 0.012445f, 0.006797f, -0.000317f, 0.016042f, -0.004939f, -0.026931f, -0.004613f, 0.008781f, 0.009562f, -0.015494f, -0.011491f, -0.019350f, 0.004605f, -0.000939f, 0.007763f, -0.012470f, 0.024220f, 0.023600f, -0.019149f, 0.047907f, 0.002897f, -0.003714f, 0.000457f, -0.009216f, -0.001405f, -0.002408f, -0.018395f, 0.000930f, 0.000778f, 0.013156f, -0.039057f, 0.010343f, -0.013372f, 0.029480f, 0.035639f, 0.015669f, 0.015273f, 0.007045f, 0.003166f, 0.031949f, -0.004941f, -0.023044f, 0.021227f, -0.010811f, 0.007919f, 0.018371f, 0.002937f, -0.014087f, 0.011698f, 0.017808f, 0.015487f, 0.009377f, 0.018632f, -0.024308f, -0.015590f, 0.001732f, -0.021820f, -0.006200f, -0.004192f, 0.003737f, -0.006057f, -0.014735f, -0.017842f, -0.011399f, 0.007959f, 0.013515f, -0.026029f, + 0.004318f, -0.003176f, -0.001794f, -0.031196f, -0.028737f, -0.005254f, -0.022574f, 0.009690f, -0.025607f, 0.001191f, 0.011830f, 0.018440f, -0.017904f, 0.022013f, 0.004404f, -0.002478f, -0.006248f, 0.032874f, -0.010584f, -0.001829f, -0.027990f, -0.015091f, 0.020256f, -0.001741f, 0.006746f, -0.025636f, -0.029528f, -0.007648f, -0.017356f, -0.002684f, -0.000358f, -0.010209f, -0.014882f, 0.008084f, -0.013975f, 0.001353f, -0.019852f, -0.009460f, -0.002229f, -0.029463f, 0.000936f, 0.020191f, 0.001882f, 0.010944f, 0.019504f, 0.037424f, -0.037404f, 0.007247f, -0.023869f, -0.020423f, -0.013890f, -0.015401f, -0.012228f, -0.009372f, 0.034776f, 0.035439f, 0.037642f, 0.041556f, -0.033678f, 0.000814f, 0.021599f, 0.016797f, -0.020402f, -0.037313f, -0.005875f, -0.006805f, -0.029910f, -0.017737f, 0.051726f, 0.002788f, 0.001870f, 0.018615f, -0.004132f, 0.007179f, -0.009217f, -0.022576f, 0.012103f, 0.010347f, -0.030626f, -0.042140f, -0.033571f, -0.026437f, -0.025917f, 0.001022f, 0.004955f, 0.010887f, -0.017971f, 0.014364f, 0.001655f, -0.009035f, -0.018980f, -0.001770f, -0.001232f, -0.027201f, -0.022585f, 0.001820f, + -0.006968f, 0.002402f, -0.018085f, 0.011613f, 0.001590f, -0.015959f, -0.034275f, -0.013687f, -0.013253f, -0.043429f, -0.015926f, 0.002884f, 0.018268f, -0.003090f, 0.022032f, -0.005429f, -0.004936f, -0.037126f, -0.010635f, 0.013142f, 0.003667f, -0.061414f, 0.014047f, 0.004184f, -0.020287f, -0.011303f, -0.021263f, -0.020922f, -0.004833f, -0.000254f, -0.023686f, -0.007459f, 0.006844f, 0.016125f, 0.020424f, -0.022509f, 0.014579f, -0.012800f, 0.041821f, -0.036233f, -0.022307f, -0.007613f, -0.068133f, -0.035845f, -0.000307f, -0.043701f, 0.033556f, -0.015635f, -0.014121f, 0.003428f, 0.077011f, 0.036733f, 0.002353f, 0.015333f, -0.003592f, -0.021210f, -0.002047f, -0.032564f, -0.023128f, 0.010417f, 0.011236f, 0.013188f, -0.022168f, 0.027811f, 0.017528f, 0.031512f, -0.032646f, 0.004498f, 0.047898f, 0.003654f, 0.002104f, 0.008566f, -0.045647f, 0.010782f, -0.011398f, 0.006569f, -0.018251f, -0.044272f, -0.002440f, 0.016396f, 0.021524f, 0.004369f, -0.006523f, 0.001926f, -0.001738f, 0.013044f, -0.032409f, -0.048899f, 0.008762f, -0.018802f, 0.028638f, -0.012899f, -0.011548f, 0.035419f, 0.008607f, 0.014187f, + 0.003217f, -0.033205f, -0.012605f, -0.005751f, 0.017141f, 0.046740f, 0.037835f, -0.013537f, -0.043035f, -0.003377f, -0.004809f, 0.013340f, -0.026463f, -0.036226f, -0.018575f, 0.012889f, -0.032106f, -0.075206f, 0.032012f, 0.026643f, -0.009195f, -0.048985f, -0.009111f, -0.017557f, -0.018544f, 0.024691f, 0.030063f, -0.000704f, 0.009838f, -0.055931f, 0.022707f, -0.070536f, -0.016127f, -0.004123f, 0.016783f, 0.038793f, 0.060433f, 0.026345f, -0.031272f, 0.010074f, 0.042995f, 0.007682f, 0.014789f, 0.024337f, -0.031706f, -0.010852f, -0.002866f, 0.012751f, -0.021504f, -0.010536f, -0.004665f, -0.015627f, -0.011100f, 0.027197f, 0.026994f, 0.008795f, 0.004865f, 0.044417f, -0.004926f, 0.022219f, -0.044209f, 0.034113f, 0.012094f, -0.039953f, 0.007628f, 0.016701f, -0.036876f, -0.002107f, -0.035842f, 0.016392f, 0.020291f, 0.021056f, -0.022611f, 0.001260f, 0.030597f, -0.018324f, 0.004708f, 0.000414f, 0.048408f, -0.021612f, 0.037298f, 0.020908f, -0.035105f, 0.040777f, -0.023737f, 0.028610f, 0.037403f, -0.024213f, 0.025619f, -0.018524f, -0.022113f, -0.039244f, -0.026227f, -0.027973f, 0.023939f, 0.015193f, + -0.058604f, -0.026333f, -0.027494f, 0.056182f, 0.004262f, 0.022626f, -0.006072f, 0.078559f, 0.014637f, -0.048164f, 0.006360f, 0.058383f, -0.018034f, 0.014984f, -0.006581f, 0.007374f, -0.029992f, -0.041497f, 0.072453f, 0.052192f, -0.016503f, 0.040619f, 0.017604f, 0.052069f, 0.059017f, -0.014068f, -0.010735f, 0.052562f, 0.039348f, 0.006440f, -0.013310f, -0.022608f, -0.023633f, 0.025515f, 0.046752f, 0.023045f, -0.005595f, 0.031939f, -0.013195f, 0.030375f, -0.010213f, 0.043252f, 0.075293f, 0.057548f, -0.057052f, 0.029091f, -0.007838f, -0.022322f, 0.001440f, 0.022468f, 0.022152f, 0.134859f, -0.011360f, 0.000157f, -0.019677f, -0.022234f, 0.027853f, 0.049361f, -0.009988f, 0.037625f, 0.032900f, -0.003388f, 0.002617f, -0.025421f, 0.027725f, 0.022308f, 0.071946f, 0.071653f, 0.088321f, 0.035207f, -0.021872f, -0.020415f, -0.040095f, 0.034861f, -0.059386f, 0.032090f, -0.040868f, 0.027728f, 0.023143f, -0.023509f, 0.006163f, 0.013211f, -0.012060f, 0.040350f, 0.008623f, -0.099482f, 0.021730f, 0.011199f, -0.073518f, 0.002556f, -0.013075f, 0.001178f, 0.026193f, -0.005490f, -0.067764f, -0.014030f, + -0.021814f, -0.005962f, 0.047407f, 0.054925f, -0.032774f, -0.010649f, -0.027466f, 0.011522f, -0.051643f, -0.102789f, -0.035835f, -0.033082f, 0.005351f, -0.001369f, 0.045680f, -0.071589f, 0.032842f, -0.019259f, -0.007251f, 0.024572f, 0.013585f, 0.043858f, 0.011305f, 0.014387f, 0.051435f, -0.062324f, 0.073187f, 0.053234f, 0.030725f, 0.049398f, -0.020246f, 0.015587f, -0.049816f, -0.015328f, -0.024597f, 0.039194f, -0.038729f, 0.003611f, -0.084199f, -0.112088f, 0.071669f, -0.010140f, 0.046704f, -0.039527f, 0.031382f, -0.029035f, 0.007851f, -0.020849f, -0.067873f, -0.031629f, -0.044848f, -0.032858f, 0.026591f, 0.090279f, 0.038233f, -0.105260f, -0.019137f, 0.003247f, -0.028560f, 0.003880f, 0.002866f, -0.063338f, 0.028607f, 0.028583f, 0.053170f, -0.030627f, 0.017474f, -0.034741f, -0.039901f, 0.013212f, 0.071588f, 0.118022f, -0.010788f, -0.011225f, -0.000715f, -0.005902f, -0.057303f, 0.081565f, 0.037400f, 0.041841f, 0.031397f, -0.027861f, 0.026021f, -0.051147f, -0.072292f, -0.015276f, 0.047998f, 0.030069f, -0.028223f, -0.019400f, -0.007089f, 0.038125f, -0.001992f, 0.026753f, 0.025930f, 0.045650f, + 0.012516f, -0.034874f, -0.033552f, 0.024319f, -0.037385f, -0.028787f, 0.010303f, 0.050081f, 0.045522f, -0.061417f, -0.048842f, 0.025017f, 0.030301f, 0.101976f, -0.029827f, -0.062890f, -0.065508f, 0.045937f, -0.044151f, 0.042776f, 0.048419f, 0.104012f, 0.226360f, -0.058127f, -0.036614f, -0.093781f, -0.146453f, -0.051414f, -0.078306f, 0.000161f, 0.087157f, -0.022999f, 0.040327f, 0.062837f, 0.034932f, -0.038944f, -0.102290f, -0.155955f, 0.055147f, -0.027580f, 0.028177f, -0.051275f, 0.004444f, -0.047094f, -0.122481f, 0.025519f, -0.053726f, 0.044832f, 0.002821f, 0.023193f, 0.019576f, -0.112255f, -0.081035f, -0.042082f, -0.028310f, -0.029264f, -0.048709f, -0.017867f, -0.077965f, -0.050862f, 0.030685f, -0.051896f, 0.086293f, -0.071774f, 0.002252f, 0.014649f, -0.011956f, 0.003904f, -0.008719f, 0.017635f, -0.025966f, -0.026841f, -0.008869f, 0.012170f, -0.007863f, 0.034880f, -0.041887f, 0.004156f, 0.051858f, 0.014086f, 0.003326f, 0.024812f, -0.001710f, -0.027474f, -0.020191f, 0.041945f, 0.004873f, -0.077483f, -0.038025f, -0.063777f, -0.032735f, 0.074059f, 0.067449f, -0.080411f, -0.014380f, -0.090943f, + -0.026915f, -0.012198f, 0.013519f, 0.037878f, -0.077075f, 0.041432f, -0.066816f, -0.016213f, -0.047709f, 0.083882f, -0.025627f, 0.056397f, 0.052036f, 0.124278f, -0.069317f, 0.044401f, 0.000322f, 0.038715f, 0.008954f, 0.020835f, -0.076612f, -0.092757f, 0.064941f, 0.015847f, -0.099465f, -0.040079f, -0.058886f, 0.010365f, -0.008267f, -0.137169f, -0.058065f, -0.031168f, -0.069307f, -0.041272f, -0.137523f, -0.115967f, -0.014909f, 0.058285f, -0.072340f, -0.041580f, -0.004237f, -0.061975f, -0.008155f, 0.000302f, -0.058151f, -0.011891f, 0.020956f, 0.008737f, -0.079506f, -0.044185f, -0.042047f, -0.022374f, -0.023162f, -0.003809f, -0.052730f, 0.055338f, 0.040621f, 0.076730f, 0.112447f, 0.095620f, 0.031096f, 0.100658f, 0.046455f, 0.021398f, -0.034838f, 0.037744f, 0.042998f, 0.031541f, -0.003180f, -0.029384f, -0.007284f, 0.027409f, 0.050805f, 0.223017f, 0.037846f, 0.048022f, 0.040343f, 0.092295f, 0.042807f, 0.080931f, 0.151782f, -0.067981f, -0.133001f, 0.018387f, 0.097766f, 0.160965f, 0.078871f, -0.139507f, 0.026157f, -0.036299f, 0.209897f, 0.146306f, 0.188038f, 0.161746f, -0.138828f, -0.102448f, + 0.123018f, 0.132031f, -0.035273f, -0.103911f, 0.166844f, 0.135215f, -0.117007f, 0.026633f, -0.003163f, 0.019502f, -0.005184f, -0.010646f, 0.042177f, -0.042129f, 0.041001f, -0.015869f, -0.001014f, 0.018027f, 0.012191f, 0.016586f, -0.001650f, -0.022707f, -0.017363f, 0.028815f, -0.023967f, -0.000696f, 0.023826f, -0.011823f, -0.017035f, -0.018077f, -0.040115f, -0.035155f, 0.025056f, -0.010932f, 0.007500f, -0.020733f, 0.001759f, -0.047220f, -0.012310f, 0.017290f, 0.029106f, -0.016991f, 0.003502f, 0.026149f, 0.031796f, -0.004443f, 0.025466f, -0.019622f, 0.089666f, -0.030331f, 0.027955f, 0.009087f, 0.013708f, -0.012580f, 0.020054f, -0.004720f, 0.061847f, -0.005403f, 0.015473f, -0.040923f, 0.055934f, -0.026208f, -0.008116f, -0.002714f, 0.003171f, -0.011651f, 0.030993f, -0.035540f, 0.028741f, -0.031665f, 0.044803f, -0.045270f, 0.058688f, -0.034638f, -0.027774f, -0.018251f, -0.016639f, 0.012360f, -0.041343f, -0.085008f, -0.093494f, 0.078752f, 0.019599f, -0.024894f, -0.126556f, -0.051101f, 0.069887f, 0.013946f, 0.050368f, 0.056241f, -0.020833f, -0.035947f, 0.001290f, 0.013060f, 0.010027f, 0.009041f, + -0.022694f, -0.016734f, -0.012764f, -0.000259f, 0.033771f, 0.018139f, -0.002006f, 0.007388f, -0.010175f, -0.016778f, -0.010865f, -0.008892f, 0.000311f, 0.009855f, -0.008045f, 0.012808f, 0.013405f, -0.046507f, -0.020816f, -0.020647f, 0.024540f, 0.017100f, -0.001720f, -0.021646f, -0.029286f, 0.025369f, 0.005536f, 0.017041f, 0.023688f, -0.042918f, -0.028557f, 0.007939f, 0.034722f, 0.017627f, -0.048694f, -0.029919f, -0.039427f, -0.018669f, 0.010631f, 0.009327f, -0.015825f, 0.018408f, -0.006694f, -0.016609f, 0.008539f, 0.017021f, -0.011135f, 0.004668f, 0.000905f, -0.014388f, 0.000345f, -0.004286f, -0.032472f, -0.033652f, 0.000785f, -0.035543f, -0.023894f, 0.004176f, 0.019253f, 0.006571f, 0.031948f, -0.082632f, -0.223568f, -0.085593f, 0.049960f, 0.106335f, 0.252281f, 0.147720f, 0.039761f, 0.051937f, -0.044483f, -0.082948f, -0.179805f, -0.121924f, -0.093204f, -0.031446f, 0.036222f, 0.097462f, 0.076179f, 0.094545f, 0.092082f, 0.061477f, -0.021524f, -0.074287f, -0.063549f, -0.066270f, -0.052495f, -0.076649f, 0.022908f, -0.048992f, 0.003335f, 0.033591f, 0.064612f, 0.035067f, 0.060536f, 0.078395f, + 0.001525f, 0.022291f, 0.001870f, -0.002819f, -0.044474f, -0.007536f, -0.039473f, -0.079212f, -0.122084f, -0.069885f, -0.036910f, 0.008146f, 0.009865f, 0.071029f, 0.101695f, 0.095359f, 0.116421f, 0.015026f, 0.076830f, 0.028255f, -0.005714f, -0.072966f, -0.068376f, -0.096427f, -0.122640f, -0.086457f, -0.094367f, -0.062632f, 0.002650f, 0.028317f, 0.071975f, 0.110495f, 0.168113f, 0.131126f, 0.124086f, 0.064861f, -0.018311f, -0.022329f, -0.055011f, -0.130740f, -0.087548f, -0.121066f, -0.032746f, -0.016849f}, + {-0.011529f, 0.010633f, -0.010855f, 0.008283f, -0.004712f, 0.002128f, -0.015443f, 0.008527f, 0.002102f, -0.000520f, -0.002793f, 0.006484f, -0.008040f, -0.001722f, -0.003263f, 0.006761f, -0.017150f, -0.004849f, -0.009769f, -0.004507f, 0.003563f, 0.002620f, 0.008341f, -0.013277f, 0.003993f, 0.001405f, 0.000761f, -0.005464f, -0.001490f, -0.007098f, -0.000907f, -0.009698f, 0.003179f, -0.010750f, -0.000954f, -0.009158f, -0.007333f, 0.001503f, -0.008120f, -0.010336f, -0.012650f, 0.003362f, -0.001474f, -0.002550f, 0.004997f, 0.003713f, -0.004920f, 0.000104f, 0.013474f, -0.006885f, -0.004400f, -0.010331f, -0.003020f, 0.005821f, 0.003213f, 0.003298f, -0.004866f, 0.004193f, -0.005892f, 0.000671f, -0.007184f, -0.000806f, 0.000472f, -0.007504f, -0.002781f, 0.001088f, -0.001091f, -0.008434f, -0.015750f, -0.006711f, -0.005645f, -0.001976f, -0.000442f, -0.003701f, -0.004485f, -0.001071f, 0.014918f, 0.009490f, 0.000155f, 0.000351f, 0.011754f, 0.002780f, -0.005978f, 0.003841f, 0.007820f, -0.004198f, -0.006590f, -0.023726f, 0.001219f, -0.008144f, 0.015677f, -0.008043f, 0.007866f, 0.006072f, -0.000808f, 0.004838f, + 0.008711f, 0.002063f, 0.002071f, -0.004613f, -0.005106f, -0.004348f, -0.006433f, 0.005301f, 0.003468f, -0.003461f, 0.005213f, -0.003945f, -0.005081f, -0.006645f, -0.002862f, -0.005365f, 0.000569f, -0.000406f, -0.000746f, 0.010244f, -0.006036f, 0.008259f, -0.002976f, -0.002805f, 0.006125f, -0.004256f, 0.002083f, -0.004288f, 0.006729f, -0.002576f, -0.018098f, 0.004761f, 0.000936f, 0.001513f, 0.009554f, 0.003992f, 0.000999f, -0.002927f, -0.005724f, 0.014849f, -0.007945f, 0.005182f, 0.003596f, -0.007501f, 0.007038f, 0.001887f, -0.007249f, 0.004963f, -0.007467f, -0.000761f, -0.000336f, 0.005636f, 0.001644f, 0.005866f, -0.002306f, -0.017655f, -0.003314f, 0.028867f, -0.013865f, 0.001845f, -0.000604f, -0.000574f, 0.006758f, -0.004883f, -0.020295f, -0.018666f, 0.009157f, -0.005720f, -0.001511f, 0.005108f, 0.001291f, 0.005050f, 0.005567f, -0.008738f, 0.005110f, 0.003647f, -0.006152f, 0.007770f, 0.011505f, -0.007062f, -0.002183f, 0.000859f, -0.011924f, -0.005192f, 0.001459f, 0.014840f, -0.002110f, -0.000499f, -0.011874f, 0.007492f, 0.000242f, -0.010524f, -0.004403f, 0.004124f, -0.001408f, 0.002469f, + -0.009149f, 0.000146f, 0.000889f, -0.003441f, 0.010291f, 0.002945f, 0.002513f, 0.010119f, -0.000742f, 0.013038f, -0.003957f, -0.015533f, 0.006750f, 0.006766f, -0.005339f, -0.001924f, -0.001653f, 0.002558f, 0.001041f, 0.005078f, -0.003322f, 0.003621f, -0.008362f, 0.000339f, 0.006135f, -0.007546f, -0.000545f, 0.005809f, 0.002045f, -0.003359f, 0.003422f, -0.002157f, 0.001543f, 0.009529f, 0.003726f, -0.009693f, 0.014725f, 0.006929f, -0.006647f, -0.016420f, -0.001734f, 0.002069f, 0.018676f, -0.006742f, 0.016040f, 0.004241f, -0.000290f, 0.001268f, 0.014371f, -0.002989f, -0.003621f, -0.003786f, 0.010196f, 0.020530f, 0.005536f, -0.013626f, -0.018684f, -0.026592f, 0.003764f, -0.006697f, -0.011081f, -0.005867f, -0.017312f, 0.000271f, -0.007909f, 0.001689f, 0.008661f, 0.009253f, -0.009769f, -0.008570f, -0.006128f, 0.001530f, -0.014651f, -0.001206f, 0.004871f, -0.006307f, -0.002211f, 0.002018f, 0.006251f, -0.007893f, 0.002437f, 0.020173f, -0.000558f, -0.000440f, -0.006990f, 0.008737f, -0.003380f, 0.001293f, 0.006536f, 0.008750f, 0.012399f, -0.001299f, 0.002091f, -0.002974f, 0.000156f, -0.001353f, + 0.001939f, 0.019676f, -0.020647f, 0.001294f, 0.004474f, 0.012065f, -0.004220f, -0.004587f, -0.000759f, -0.004180f, 0.015651f, -0.007136f, -0.019162f, -0.000035f, -0.005115f, -0.006758f, 0.005989f, -0.017761f, -0.030608f, 0.011630f, -0.009478f, 0.013037f, -0.011447f, -0.000902f, 0.009059f, -0.017634f, -0.002920f, 0.005577f, -0.004708f, 0.026070f, -0.010741f, -0.003125f, -0.010242f, -0.008512f, 0.013444f, 0.014972f, 0.005861f, -0.017277f, -0.020926f, 0.019640f, 0.003394f, -0.019559f, 0.007500f, 0.000902f, 0.009466f, -0.005673f, 0.009039f, -0.011623f, 0.005887f, 0.019247f, 0.008007f, 0.008357f, 0.004461f, 0.000533f, -0.004717f, 0.004186f, 0.001625f, -0.012795f, 0.000359f, -0.003907f, -0.009410f, -0.009310f, -0.003472f, 0.007766f, -0.013558f, 0.002116f, -0.009759f, -0.000762f, -0.001346f, 0.004794f, 0.008313f, 0.017505f, 0.006273f, 0.000201f, 0.007608f, -0.008883f, -0.013319f, 0.000106f, 0.003405f, 0.001788f, 0.016644f, -0.003303f, -0.001680f, -0.004760f, -0.001941f, 0.002873f, 0.008395f, -0.001506f, 0.003878f, -0.007303f, 0.013961f, -0.002360f, -0.003636f, -0.001237f, -0.016070f, -0.004282f, + -0.010679f, -0.001711f, 0.019710f, 0.012359f, 0.008408f, -0.002240f, -0.018684f, 0.001821f, -0.012543f, -0.019731f, -0.007048f, 0.013023f, -0.011489f, -0.017572f, 0.003673f, 0.000765f, -0.009159f, 0.001120f, 0.008857f, 0.001961f, -0.023273f, -0.007067f, 0.013374f, 0.015974f, 0.007528f, -0.019346f, -0.007561f, 0.007808f, -0.003984f, -0.004713f, 0.000391f, 0.005545f, 0.000173f, 0.001603f, 0.018296f, -0.000674f, 0.010716f, 0.008259f, -0.001030f, -0.009344f, -0.001115f, -0.005818f, 0.010488f, -0.007268f, -0.011839f, -0.000726f, 0.016930f, 0.000242f, 0.016782f, 0.008812f, 0.000683f, 0.010702f, -0.003021f, 0.023890f, 0.000867f, 0.011388f, 0.012745f, 0.000433f, -0.012745f, -0.002651f, -0.015073f, 0.006111f, -0.011249f, -0.006497f, -0.010572f, -0.007016f, -0.005953f, 0.003439f, -0.000194f, 0.005628f, -0.002181f, -0.009191f, -0.008989f, 0.000932f, 0.009952f, 0.018615f, -0.027876f, -0.005135f, 0.023274f, -0.011568f, 0.004204f, -0.017974f, 0.007853f, 0.032845f, -0.004528f, 0.001783f, -0.001492f, -0.023117f, 0.001752f, -0.001399f, 0.034678f, -0.010894f, -0.001855f, 0.015325f, -0.009762f, 0.021699f, + -0.014732f, -0.002037f, -0.022197f, 0.025023f, 0.000124f, -0.009618f, 0.000079f, 0.009298f, -0.011819f, 0.017494f, -0.002113f, 0.015546f, -0.000405f, 0.008270f, -0.024357f, -0.015210f, -0.011554f, -0.003319f, 0.014133f, -0.021480f, 0.011264f, 0.009332f, 0.002631f, -0.008662f, -0.013572f, 0.030346f, 0.005490f, -0.002979f, 0.011130f, -0.010132f, 0.005777f, -0.013601f, -0.014397f, -0.005233f, -0.009886f, 0.032939f, 0.009032f, -0.005788f, -0.010289f, -0.011635f, 0.009455f, 0.009190f, 0.002295f, -0.010498f, -0.002205f, -0.003601f, 0.012960f, 0.002428f, 0.010271f, -0.024713f, 0.013268f, -0.000511f, -0.000219f, -0.000456f, 0.003895f, -0.007179f, -0.000580f, -0.003073f, 0.010918f, 0.004943f, 0.008840f, 0.002015f, -0.000776f, -0.004559f, -0.015811f, -0.005501f, -0.010523f, 0.005008f, -0.001473f, 0.021562f, -0.019768f, -0.025140f, -0.007077f, 0.006683f, -0.008529f, -0.006754f, 0.018118f, 0.002945f, -0.011529f, -0.013042f, -0.013596f, 0.019981f, -0.011536f, 0.013212f, -0.007835f, 0.014537f, -0.016446f, 0.002486f, 0.022638f, 0.007204f, -0.033374f, 0.006521f, -0.000374f, -0.005056f, -0.003995f, 0.002390f, + -0.005000f, 0.002204f, -0.006434f, 0.001649f, -0.002498f, -0.015377f, 0.013244f, 0.013877f, -0.005661f, 0.015468f, -0.015285f, -0.003396f, -0.005341f, -0.007652f, 0.016742f, -0.014002f, -0.024446f, -0.013923f, 0.002907f, -0.019819f, -0.019014f, -0.009782f, -0.007474f, -0.013081f, -0.002640f, 0.014387f, 0.014517f, 0.001439f, 0.015656f, 0.004433f, 0.000308f, 0.012262f, -0.016516f, -0.003415f, -0.002772f, 0.036300f, -0.017491f, -0.016802f, 0.011866f, 0.029584f, 0.005949f, 0.026688f, 0.015287f, 0.024281f, 0.010837f, -0.004116f, -0.010648f, 0.008944f, -0.017684f, -0.013225f, 0.020162f, 0.017100f, 0.041910f, -0.000670f, 0.005966f, -0.015042f, 0.016264f, 0.007732f, -0.018475f, -0.003970f, 0.023747f, 0.000373f, -0.025950f, -0.010058f, -0.014624f, -0.004515f, 0.014582f, 0.013828f, -0.009842f, -0.004294f, 0.018136f, -0.017051f, 0.008059f, 0.015788f, 0.018220f, -0.009209f, 0.015656f, -0.006093f, -0.023797f, 0.008937f, 0.021674f, -0.005252f, 0.006160f, 0.005904f, -0.007538f, 0.003261f, 0.006338f, -0.006154f, 0.002209f, 0.018264f, -0.010640f, -0.004843f, 0.015981f, -0.002832f, -0.003625f, -0.026311f, + -0.009935f, -0.015600f, -0.027215f, -0.017320f, 0.012952f, -0.008036f, -0.012007f, 0.023978f, 0.022568f, -0.005044f, 0.024231f, 0.010873f, 0.015566f, -0.003686f, -0.013836f, 0.011134f, -0.018228f, -0.019486f, 0.026273f, -0.004421f, 0.060089f, -0.024804f, -0.011739f, -0.001400f, 0.014580f, -0.008399f, -0.008310f, -0.024790f, -0.028810f, 0.012955f, 0.002343f, 0.039599f, 0.012663f, -0.004031f, -0.004703f, 0.026313f, 0.026646f, -0.022170f, 0.015891f, -0.021176f, 0.005325f, -0.009113f, -0.011196f, -0.006492f, 0.004211f, -0.003439f, 0.013618f, 0.006993f, 0.015246f, -0.001949f, -0.007840f, -0.014666f, -0.003265f, 0.017030f, 0.001060f, -0.022700f, -0.003361f, 0.005457f, -0.010234f, 0.017874f, 0.014561f, 0.003054f, 0.004615f, -0.049614f, -0.019679f, 0.017126f, -0.001953f, 0.027566f, 0.006879f, 0.031049f, -0.004479f, -0.017252f, 0.015651f, -0.009856f, 0.010216f, 0.001564f, 0.044280f, 0.037146f, 0.002952f, 0.009976f, -0.007929f, 0.014145f, 0.013932f, 0.016151f, 0.016270f, 0.028942f, -0.003362f, 0.003791f, -0.015119f, -0.012180f, 0.004724f, -0.016761f, -0.042545f, -0.052222f, 0.041230f, -0.001187f, + 0.004716f, -0.014477f, 0.023148f, -0.049602f, -0.031731f, -0.010041f, -0.012662f, -0.001222f, -0.044370f, 0.008682f, 0.001022f, -0.001215f, -0.020172f, -0.020682f, 0.008565f, 0.028320f, 0.004571f, -0.037817f, -0.007986f, -0.030956f, 0.024697f, 0.015802f, 0.001501f, -0.013677f, -0.006177f, -0.006950f, 0.020500f, -0.002805f, -0.000021f, -0.004272f, -0.026964f, 0.014357f, 0.019683f, -0.011331f, -0.005601f, 0.015128f, -0.029231f, -0.021499f, -0.032248f, -0.010868f, 0.008993f, -0.020649f, -0.009230f, -0.000494f, -0.033195f, 0.010883f, 0.021979f, 0.037759f, 0.006419f, -0.003040f, 0.003459f, -0.023701f, -0.017890f, 0.029385f, -0.000590f, -0.009766f, -0.005125f, -0.042352f, -0.021604f, 0.010026f, -0.007196f, -0.003303f, -0.001115f, 0.030688f, -0.002333f, -0.024473f, 0.005213f, 0.024432f, 0.003059f, -0.009049f, 0.004158f, 0.007154f, -0.005428f, -0.011533f, 0.006694f, 0.029249f, 0.027035f, 0.010795f, 0.044692f, -0.017672f, -0.007275f, 0.008519f, -0.009541f, -0.001788f, 0.015807f, 0.047609f, -0.005649f, 0.010867f, 0.001533f, -0.001343f, 0.001093f, 0.052312f, -0.022742f, 0.027850f, 0.001655f, -0.031868f, + 0.013016f, -0.031608f, -0.018200f, 0.020563f, -0.015368f, 0.014973f, 0.002827f, 0.003283f, 0.024925f, 0.019702f, -0.025189f, -0.029587f, -0.021076f, -0.006354f, 0.011190f, 0.010437f, 0.005722f, 0.007631f, -0.034864f, 0.007210f, -0.017521f, -0.045467f, 0.034576f, -0.007716f, 0.032747f, 0.033715f, 0.004604f, 0.013601f, -0.014332f, -0.019298f, -0.034057f, 0.010163f, 0.036971f, 0.007698f, -0.011713f, 0.003782f, -0.004181f, 0.007046f, -0.016458f, -0.014370f, -0.016252f, 0.005481f, 0.001435f, -0.004319f, 0.025943f, 0.021997f, 0.016207f, 0.034384f, 0.008315f, -0.030676f, 0.048473f, -0.028470f, -0.003832f, -0.004414f, -0.000555f, 0.041236f, 0.046381f, 0.012208f, -0.081948f, 0.004822f, 0.025549f, -0.025870f, 0.018739f, 0.035314f, 0.003557f, 0.010894f, 0.023092f, 0.018055f, 0.008262f, 0.031901f, 0.008805f, -0.002406f, 0.058586f, 0.022829f, 0.009418f, 0.026233f, -0.016658f, 0.031777f, -0.018962f, -0.000075f, -0.000279f, -0.005181f, -0.028915f, 0.012158f, -0.019813f, 0.042074f, -0.001419f, -0.006182f, 0.061474f, 0.009662f, 0.010900f, 0.021469f, 0.004496f, 0.013112f, -0.011008f, -0.024089f, + -0.000618f, 0.019178f, -0.028237f, 0.037248f, 0.034434f, 0.025404f, 0.008622f, 0.015839f, -0.018682f, -0.020201f, -0.032340f, -0.013622f, -0.016259f, -0.016139f, 0.010878f, -0.001598f, -0.031479f, -0.013341f, 0.032703f, 0.001287f, -0.025389f, 0.017757f, 0.001270f, -0.017387f, -0.042789f, 0.004937f, -0.066255f, 0.041934f, -0.020454f, 0.038100f, 0.005046f, 0.011246f, 0.004635f, -0.013755f, 0.021918f, 0.056844f, 0.022108f, 0.016227f, 0.044629f, -0.063715f, 0.023689f, -0.037668f, 0.030240f, -0.016469f, -0.027516f, -0.008391f, -0.031548f, -0.013561f, -0.007988f, 0.010225f, 0.012754f, -0.009568f, 0.042612f, -0.002723f, -0.008849f, -0.006504f, -0.041064f, -0.004964f, -0.001176f, -0.033958f, 0.009364f, -0.028982f, -0.037337f, -0.012044f, 0.020250f, -0.059892f, -0.041837f, -0.027304f, 0.001631f, -0.041972f, -0.036905f, -0.028882f, -0.015890f, -0.011735f, -0.006950f, -0.028222f, 0.028682f, 0.005241f, -0.004419f, -0.020896f, -0.023137f, 0.041036f, -0.036969f, -0.023916f, 0.009238f, 0.011337f, 0.013189f, -0.020029f, -0.030123f, -0.011390f, -0.006755f, 0.014215f, -0.021995f, -0.007239f, -0.009796f, -0.023384f, + -0.043250f, -0.051590f, 0.048877f, -0.053280f, -0.004246f, 0.005796f, -0.010687f, -0.007948f, -0.050101f, 0.021581f, -0.012630f, -0.048540f, -0.001859f, -0.007844f, 0.048023f, 0.016094f, 0.034516f, -0.056606f, 0.063858f, 0.009546f, 0.005691f, -0.011854f, 0.031940f, -0.000200f, 0.053108f, -0.015300f, 0.036084f, 0.019459f, -0.054344f, 0.022615f, 0.007633f, 0.024852f, -0.005532f, -0.014614f, -0.022468f, -0.008199f, 0.024722f, 0.056933f, 0.004678f, -0.008697f, -0.037703f, 0.013386f, -0.040737f, -0.006475f, 0.037952f, -0.035996f, -0.001641f, 0.002286f, -0.007959f, -0.013702f, -0.017086f, 0.063298f, -0.015693f, -0.015777f, -0.009778f, 0.014226f, 0.019108f, 0.007813f, -0.001253f, -0.013111f, -0.002617f, 0.009324f, 0.036013f, -0.009048f, 0.052483f, 0.032042f, 0.013589f, -0.013514f, 0.045083f, 0.054379f, -0.007698f, -0.014825f, -0.006257f, -0.018185f, 0.001834f, -0.018106f, 0.023729f, 0.008767f, 0.035615f, 0.029910f, -0.053065f, -0.055814f, 0.060988f, 0.047579f, 0.002605f, -0.010958f, -0.031701f, -0.038308f, -0.020296f, 0.034008f, -0.041691f, -0.042038f, -0.013030f, -0.017036f, -0.059373f, 0.026878f, + -0.025185f, -0.009334f, -0.006671f, 0.003918f, -0.000835f, -0.036979f, -0.103854f, 0.049430f, -0.050842f, 0.018281f, 0.071141f, 0.009397f, -0.032274f, 0.019300f, 0.023664f, -0.012335f, -0.024840f, -0.006529f, -0.052046f, 0.014879f, -0.054031f, -0.033485f, 0.019245f, 0.000437f, 0.007299f, -0.048974f, -0.011380f, -0.035831f, -0.030728f, -0.043805f, -0.016468f, 0.012697f, -0.026856f, -0.027154f, 0.022922f, 0.001709f, -0.003896f, 0.006164f, -0.050244f, -0.004670f, -0.039504f, 0.030556f, 0.007012f, -0.093807f, 0.021302f, 0.047735f, -0.012489f, 0.027834f, 0.022819f, 0.015134f, 0.011405f, 0.045599f, 0.034920f, -0.000161f, -0.035861f, -0.008610f, 0.035202f, 0.022843f, -0.033527f, 0.000921f, -0.038874f, -0.013010f, 0.000029f, 0.025397f, 0.032928f, -0.066134f, -0.054259f, -0.029610f, 0.002581f, -0.019897f, -0.010300f, 0.060394f, 0.006603f, 0.014288f, 0.043862f, -0.020516f, 0.010527f, 0.035929f, 0.034766f, -0.054901f, 0.013965f, -0.010125f, -0.012995f, -0.011061f, 0.040232f, 0.022545f, -0.025957f, -0.013661f, 0.031115f, -0.050156f, 0.004872f, 0.021420f, 0.031119f, -0.003855f, 0.008321f, -0.058801f, + 0.001594f, -0.024663f, 0.022277f, 0.010024f, 0.035755f, -0.051296f, -0.025399f, -0.005247f, 0.008381f, -0.002003f, 0.012235f, 0.006530f, 0.031070f, 0.058079f, -0.033358f, -0.042488f, 0.013597f, -0.044340f, -0.012255f, 0.022650f, -0.032654f, -0.030363f, 0.004410f, 0.023545f, 0.030428f, 0.023529f, -0.011267f, 0.000259f, -0.058470f, -0.037269f, 0.054918f, -0.033699f, 0.073571f, -0.027125f, 0.016237f, 0.014034f, 0.001013f, -0.049309f, 0.067866f, -0.027165f, -0.004698f, -0.008086f, 0.027469f, 0.053900f, -0.048904f, -0.024586f, 0.060885f, -0.039552f, 0.001526f, -0.012014f, 0.013738f, 0.073445f, 0.002019f, 0.000170f, -0.040815f, 0.058280f, -0.015435f, 0.019863f, 0.014726f, 0.003671f, 0.033559f, -0.036683f, 0.011264f, 0.031605f, 0.031508f, 0.070056f, -0.043216f, 0.064350f, -0.010247f, -0.041308f, -0.039848f, 0.010941f, 0.027767f, -0.018097f, -0.007366f, -0.028440f, -0.010614f, 0.054347f, -0.036858f, -0.003316f, 0.044830f, -0.013883f, 0.027372f, -0.017242f, -0.006783f, 0.046156f, -0.000058f, 0.002349f, 0.046133f, 0.030766f, 0.012623f, -0.005609f, 0.039391f, 0.051085f, -0.050346f, 0.047926f, + -0.044149f, 0.024083f, -0.031201f, 0.006550f, 0.041977f, 0.013089f, -0.087862f, 0.039473f, 0.028136f, -0.000974f, 0.048423f, -0.072404f, -0.010981f, 0.047834f, 0.044519f, 0.005945f, 0.068449f, -0.035772f, 0.004312f, -0.009574f, -0.006202f, 0.026568f, 0.015785f, 0.047285f, 0.045358f, -0.032223f, 0.032208f, -0.058546f, -0.011661f, 0.002429f, 0.003878f, -0.006727f, -0.001281f, -0.091234f, -0.039347f, -0.071286f, -0.034401f, 0.047992f, -0.015107f, -0.008366f, 0.030844f, -0.022335f, 0.021358f, 0.054941f, -0.030483f, 0.021120f, 0.027088f, -0.039815f, 0.005001f, -0.048949f, 0.018470f, -0.005389f, -0.026101f, 0.038458f, 0.001036f, 0.060076f, -0.003807f, -0.045371f, 0.076199f, -0.013987f, 0.007485f, 0.010237f, -0.071774f, 0.021237f, 0.061493f, 0.021627f, -0.026990f, -0.047299f, 0.004675f, 0.011004f, 0.052492f, 0.033529f, -0.017454f, -0.010777f, -0.041378f, -0.000175f, 0.059321f, -0.081707f, 0.024231f, 0.056015f, -0.051431f, 0.017982f, 0.004813f, 0.018854f, 0.059130f, 0.019059f, 0.022416f, -0.011998f, -0.059295f, 0.059645f, -0.012050f, -0.032137f, 0.126336f, 0.061384f, 0.031455f, 0.004250f, + 0.001750f, -0.061303f, -0.050381f, -0.023823f, 0.035935f, -0.002957f, -0.036412f, -0.026352f, 0.045259f, -0.030792f, 0.030283f, 0.016327f, -0.025871f, 0.032488f, 0.012887f, -0.052668f, -0.028744f, -0.031668f, 0.004005f, 0.030241f, -0.068342f, 0.021757f, 0.078169f, 0.130217f, -0.021490f, -0.004047f, -0.106426f, -0.035441f, -0.078247f, -0.051872f, 0.072708f, 0.005560f, 0.019790f, -0.059875f, 0.019582f, -0.052473f, -0.119245f, 0.017934f, 0.057252f, -0.004125f, 0.007348f, 0.062330f, -0.081852f, 0.094037f, 0.046394f, 0.029901f, -0.046408f, 0.063577f, 0.120805f, -0.023162f, 0.037188f, 0.092843f, 0.077342f, 0.137941f, 0.029480f, 0.050264f, 0.036956f, 0.034528f, 0.117268f, -0.029310f, -0.014319f, 0.044727f, 0.025375f, -0.011287f, 0.064272f, 0.005504f, 0.013199f, -0.036642f, -0.105468f, 0.005946f, 0.069600f, 0.012691f, 0.041947f, -0.073608f, 0.004192f, -0.098409f, -0.000359f, -0.105719f, 0.006876f, 0.078836f, -0.010260f, -0.029141f, -0.103961f, 0.138790f, 0.023847f, 0.013020f, 0.139285f, 0.002801f, -0.032973f, -0.018460f, 0.006094f, 0.034173f, -0.009212f, 0.008025f, -0.013223f, -0.064337f, + 0.040328f, 0.031243f, -0.036721f, -0.131593f, 0.010934f, 0.188136f, 0.031102f, -0.033049f, -0.031134f, -0.079249f, -0.050336f, 0.006974f, 0.119091f, 0.024709f, -0.072248f, -0.000988f, 0.035628f, 0.012081f, 0.006673f, -0.002971f, 0.024336f, -0.050138f, -0.016153f, 0.032622f, 0.067958f, 0.068800f, -0.056119f, -0.018543f, 0.009030f, 0.013314f, 0.020576f, -0.064803f, 0.011149f, 0.016198f, -0.013882f, 0.054943f, 0.003939f, 0.062691f, 0.091463f, 0.046603f, 0.022526f, 0.042898f, -0.044832f, 0.049931f, -0.035306f, 0.072230f, 0.123165f, 0.044211f, -0.059412f, -0.050023f, 0.058423f, 0.024918f, 0.105790f, 0.081345f, 0.028002f, -0.013502f, -0.017825f, 0.008658f, 0.010162f, -0.029529f, 0.044251f, 0.040145f, 0.011568f, 0.097175f, 0.067605f, -0.002401f, 0.049724f, 0.055811f, 0.028376f, 0.055980f, 0.007356f, -0.080328f, -0.005537f, -0.014176f, -0.014991f, 0.105830f, 0.050209f, 0.023778f, -0.005694f, -0.031729f, -0.134158f, -0.032542f, 0.067135f, 0.034490f, 0.152725f, 0.004204f, -0.028148f, -0.075087f, -0.143928f, -0.156427f, -0.030850f, 0.061440f, 0.068087f, 0.043178f, -0.082651f, -0.105562f, + -0.006649f, -0.016356f, 0.034456f, 0.102131f, 0.047703f, -0.013704f, -0.069956f, -0.089884f, -0.060779f, -0.000069f, -0.059864f, 0.017158f, -0.051406f, -0.025392f, 0.063430f, 0.055050f, 0.044549f, 0.017010f, -0.080271f, -0.023480f, -0.077378f, -0.056576f, -0.036152f, 0.037876f, -0.016256f, 0.040478f, 0.098303f, 0.108797f, -0.055843f, 0.009925f, -0.092126f, -0.059330f, -0.049428f, -0.010022f, 0.004918f, 0.061990f, 0.058156f, 0.092518f, 0.056207f, 0.021499f, -0.059437f, -0.046379f, -0.023395f, 0.027689f, -0.091705f, 0.002577f, 0.076190f, 0.069285f, -0.035122f, 0.094710f, 0.070208f, 0.045265f, 0.072193f, -0.179324f, 0.019090f, -0.056880f, -0.079685f, 0.017546f, -0.057269f, -0.029357f, 0.070015f, 0.029797f, -0.197300f, -0.227465f, -0.246226f, -0.249471f, -0.346999f, 0.003548f, -0.107400f, -0.017663f, 0.075828f, 0.150130f, 0.201344f, 0.205733f, 0.395214f, 0.420571f, 0.348294f, 0.264320f, 0.279949f, 0.266480f, 0.119374f, -0.011780f, -0.140299f, -0.142694f, -0.229812f, -0.059522f, -0.112856f, -0.080122f, 0.015845f, -0.194277f, -0.037135f, -0.171571f, -0.027738f, -0.200990f, -0.185294f, -0.075786f, + -0.149039f, 0.002805f, -0.063655f, -0.061157f, -0.106234f, -0.066875f, -0.172929f, -0.120388f, -0.051366f, -0.050476f, -0.082182f, -0.047755f, 0.012843f, -0.069532f, 0.047595f, 0.137868f, -0.079485f, 0.158848f, 0.105345f, 0.206161f, 0.213325f, 0.179097f, 0.226289f, 0.183015f, 0.307933f, 0.294554f, 0.242385f, 0.309235f, 0.272671f, 0.400494f, 0.403401f, 0.458092f, 0.361545f, 0.367873f, 0.414794f, 0.343670f, 0.432523f, 0.269798f, 0.441880f, 0.273503f, 0.009097f, -0.122623f, -0.216074f, -0.174379f} + }, + { + {-0.006438f, -0.004315f, -0.005702f, -0.006947f, -0.006513f, 0.006489f, -0.015155f, 0.001720f, -0.002707f, -0.005306f, 0.013576f, -0.004390f, -0.004031f, 0.008676f, 0.001340f, -0.006469f, 0.002079f, -0.002638f, 0.002283f, 0.001768f, -0.001096f, 0.007134f, -0.002417f, -0.007501f, -0.000643f, 0.002223f, 0.003674f, 0.004660f, 0.000117f, 0.002859f, -0.001918f, 0.010614f, 0.007185f, -0.007961f, -0.004507f, -0.003812f, 0.003084f, -0.005590f, -0.006529f, 0.007636f, -0.003302f, -0.000129f, -0.000709f, 0.002070f, 0.006926f, 0.006304f, -0.002933f, -0.001857f, 0.004927f, 0.002290f, 0.001503f, 0.000528f, 0.004114f, -0.005940f, -0.003941f, 0.000374f, 0.003541f, -0.004281f, 0.002956f, -0.007551f, -0.000495f, 0.005203f, 0.003778f, -0.002589f, 0.004454f, 0.000518f, 0.006269f, 0.002267f, -0.002906f, 0.008517f, 0.011459f, 0.004190f, -0.001935f, -0.000890f, -0.005512f, 0.009554f, -0.000621f, 0.003792f, 0.001326f, -0.008771f, -0.006662f, 0.002014f, -0.006027f, -0.008815f, 0.004670f, -0.001233f, 0.001044f, -0.005148f, 0.003388f, 0.000139f, -0.007859f, -0.000556f, 0.008549f, 0.006936f, -0.005716f, -0.009846f, + -0.009033f, 0.001088f, -0.002276f, -0.001925f, -0.007730f, 0.007932f, -0.002422f, 0.002092f, -0.003671f, -0.002269f, -0.001011f, 0.002888f, -0.002482f, -0.004479f, -0.016681f, 0.005385f, -0.001525f, 0.005109f, 0.002863f, 0.002037f, -0.000715f, 0.010749f, 0.001760f, 0.001997f, 0.001224f, -0.005785f, -0.003889f, -0.000706f, 0.000486f, -0.005789f, -0.001652f, 0.001995f, -0.001106f, -0.005481f, -0.003134f, 0.000007f, 0.004818f, -0.008296f, -0.011369f, -0.013819f, 0.004433f, 0.007607f, 0.000377f, 0.006247f, 0.004297f, 0.000682f, -0.012967f, -0.000578f, -0.003797f, -0.004682f, -0.000391f, 0.000307f, 0.004410f, -0.001710f, 0.005748f, 0.007560f, -0.001938f, -0.000274f, -0.011205f, 0.009681f, -0.012808f, 0.004710f, 0.021170f, -0.004753f, -0.008080f, 0.001019f, 0.010982f, 0.000987f, -0.003302f, -0.001742f, -0.003322f, -0.002223f, -0.010149f, -0.004112f, 0.004812f, -0.008171f, -0.004673f, 0.000232f, -0.000561f, 0.008567f, -0.005483f, 0.001413f, -0.002189f, 0.001687f, -0.001225f, -0.005374f, 0.009632f, 0.016314f, 0.004096f, -0.001192f, -0.003199f, 0.017665f, 0.000745f, -0.007753f, 0.000416f, -0.013628f, + -0.000031f, 0.006706f, -0.010332f, -0.001577f, 0.002131f, -0.008471f, -0.002530f, 0.009154f, 0.001284f, -0.001300f, 0.009053f, -0.006349f, -0.009625f, 0.005128f, 0.003553f, -0.006982f, -0.003351f, -0.007455f, -0.008423f, -0.009320f, -0.005019f, -0.005446f, 0.007305f, 0.004938f, 0.001426f, -0.000451f, -0.005079f, 0.004508f, -0.001091f, -0.003587f, 0.006224f, 0.006890f, 0.010852f, -0.015919f, -0.010517f, -0.003826f, -0.002342f, 0.000488f, 0.002013f, -0.015191f, 0.010488f, -0.004837f, 0.003414f, 0.002109f, 0.003481f, 0.006552f, -0.000061f, -0.002256f, -0.005048f, 0.010831f, -0.000867f, 0.007014f, 0.013458f, -0.002994f, 0.011448f, 0.009685f, -0.008453f, 0.005577f, 0.005738f, 0.006058f, -0.014912f, -0.001570f, 0.000918f, -0.004783f, -0.009360f, 0.000053f, 0.010998f, -0.002669f, -0.004648f, -0.003786f, 0.003405f, 0.010058f, 0.005080f, -0.005299f, -0.000016f, -0.004393f, 0.000512f, -0.001479f, -0.004974f, 0.009368f, -0.012163f, -0.010262f, -0.009194f, 0.002744f, -0.001180f, -0.000477f, -0.011298f, -0.012234f, 0.003105f, -0.000417f, 0.000866f, -0.001366f, -0.000437f, -0.009210f, -0.005105f, -0.010072f, + 0.002201f, 0.008217f, -0.002324f, 0.007230f, 0.001771f, 0.006351f, -0.013958f, -0.000323f, 0.002647f, -0.005296f, -0.001374f, 0.001264f, -0.005060f, 0.001718f, -0.000707f, 0.009719f, 0.015259f, 0.001308f, -0.005261f, -0.012285f, 0.006183f, 0.004109f, 0.003909f, 0.016098f, -0.009893f, 0.000704f, 0.002325f, -0.002522f, -0.004742f, 0.002656f, 0.001405f, 0.009812f, 0.021363f, -0.001535f, 0.004042f, 0.009059f, -0.003380f, 0.008104f, 0.014035f, -0.009222f, 0.000067f, -0.003271f, 0.000225f, 0.006331f, -0.010184f, 0.011704f, 0.002978f, 0.000366f, 0.006463f, -0.000776f, 0.008786f, -0.004332f, -0.001508f, -0.002169f, 0.013557f, 0.006292f, 0.008783f, -0.001438f, 0.007306f, -0.012627f, 0.015148f, -0.005604f, 0.006197f, -0.013348f, 0.005809f, 0.009797f, 0.018349f, 0.006617f, 0.003725f, -0.011838f, -0.004175f, 0.003213f, -0.008617f, -0.010742f, -0.002217f, 0.021085f, 0.024860f, 0.004516f, 0.006015f, -0.007276f, -0.002947f, 0.013416f, 0.002761f, 0.005609f, -0.000890f, 0.003690f, 0.003390f, 0.011004f, 0.000940f, 0.001914f, 0.015214f, -0.011645f, -0.013739f, 0.023076f, -0.005121f, -0.003018f, + 0.015421f, 0.009369f, 0.001828f, -0.025234f, 0.028625f, -0.004556f, -0.002739f, -0.002389f, -0.000714f, 0.001635f, 0.002549f, 0.009231f, 0.013849f, 0.009073f, -0.000989f, 0.015085f, 0.010155f, 0.005180f, 0.004856f, -0.004879f, 0.007618f, -0.010004f, 0.009364f, -0.001125f, 0.004529f, -0.008405f, -0.011840f, 0.002123f, -0.000537f, 0.005198f, 0.008914f, -0.003367f, -0.011171f, -0.006739f, 0.004261f, -0.014348f, 0.010849f, 0.003451f, -0.022307f, 0.011158f, 0.003012f, 0.006598f, 0.002972f, 0.004180f, 0.005520f, -0.000441f, -0.005081f, -0.005239f, -0.014461f, -0.011272f, -0.004824f, -0.007621f, 0.000047f, 0.001626f, -0.009823f, -0.015979f, -0.000371f, 0.011676f, 0.021003f, -0.000033f, -0.009995f, 0.003146f, -0.016905f, 0.002638f, 0.001634f, -0.006090f, 0.019824f, -0.025010f, 0.013395f, -0.004528f, -0.008691f, -0.006842f, -0.008297f, -0.011738f, 0.023527f, -0.029252f, 0.007301f, 0.007435f, 0.010005f, 0.014732f, 0.002714f, 0.004302f, 0.005786f, 0.004201f, 0.003363f, 0.005180f, 0.013068f, 0.002581f, -0.006628f, 0.000274f, -0.000853f, -0.008811f, -0.007847f, 0.004499f, 0.008903f, 0.009451f, + 0.001641f, 0.006822f, -0.014987f, -0.001498f, 0.000198f, -0.000553f, -0.014161f, -0.008439f, -0.004814f, 0.009839f, 0.009008f, 0.000158f, -0.015503f, 0.000404f, -0.008171f, -0.005866f, -0.002647f, -0.003962f, 0.010538f, 0.013991f, 0.004671f, 0.014555f, -0.022165f, -0.015492f, 0.008129f, 0.005035f, 0.001373f, 0.003426f, 0.002119f, -0.006912f, -0.013616f, -0.009384f, 0.008291f, -0.005864f, 0.012356f, 0.011995f, -0.003309f, 0.011468f, -0.016250f, -0.007746f, -0.003757f, -0.004915f, 0.002546f, 0.032395f, -0.002854f, 0.010277f, -0.002570f, 0.026230f, -0.004642f, 0.001034f, 0.011252f, -0.024334f, 0.017299f, 0.008908f, -0.013536f, 0.015733f, 0.017625f, 0.006096f, -0.026242f, 0.016753f, 0.001099f, -0.002220f, 0.013867f, 0.014842f, -0.000425f, -0.004018f, 0.000836f, -0.010056f, 0.010089f, -0.005379f, -0.009412f, -0.020444f, 0.005280f, -0.022249f, 0.006499f, -0.005263f, -0.002049f, 0.006739f, -0.017857f, -0.007293f, 0.015746f, -0.001095f, -0.006605f, 0.009564f, 0.001151f, -0.007778f, 0.007457f, 0.002724f, 0.001250f, -0.003218f, 0.005861f, -0.010957f, -0.000552f, -0.016102f, 0.016074f, 0.015619f, + -0.018524f, 0.013022f, -0.012986f, -0.004989f, 0.014010f, 0.018716f, -0.000549f, -0.009069f, 0.006452f, -0.001006f, 0.003580f, -0.022511f, -0.016943f, 0.003721f, 0.004274f, -0.004767f, -0.003501f, 0.006002f, 0.000580f, -0.007919f, 0.011012f, -0.009154f, 0.004874f, 0.007032f, 0.000305f, 0.010982f, -0.008624f, 0.007352f, 0.003314f, -0.009253f, 0.018379f, -0.006054f, 0.009050f, -0.018196f, -0.001092f, -0.004688f, -0.016452f, 0.000733f, 0.011997f, 0.021074f, 0.027610f, -0.015453f, -0.000198f, -0.019301f, -0.001207f, -0.012249f, 0.011308f, -0.011466f, -0.022658f, 0.001604f, -0.014418f, -0.001262f, 0.019288f, -0.011159f, -0.010950f, 0.020501f, 0.000933f, 0.003604f, -0.001820f, -0.011901f, 0.005418f, 0.004440f, 0.024917f, -0.016877f, 0.012404f, -0.014306f, 0.003948f, 0.004846f, -0.013818f, -0.008671f, 0.023995f, 0.006519f, -0.017149f, -0.004474f, -0.005999f, -0.014041f, -0.000150f, 0.023188f, 0.012859f, 0.016148f, 0.004167f, 0.006483f, -0.020605f, -0.003012f, 0.027393f, 0.002170f, -0.016121f, 0.008975f, 0.009481f, -0.012199f, -0.010026f, -0.005844f, -0.026903f, -0.004174f, 0.008930f, 0.013751f, + 0.025022f, -0.005878f, -0.012375f, -0.003490f, -0.007267f, 0.020371f, -0.006183f, 0.010340f, -0.042335f, -0.029629f, -0.019509f, 0.000715f, -0.035707f, 0.003678f, 0.024027f, 0.006981f, 0.024780f, -0.015523f, -0.007941f, -0.004304f, -0.015086f, -0.006562f, -0.021924f, 0.034905f, 0.019299f, 0.013028f, -0.032203f, -0.007421f, -0.011373f, -0.021483f, 0.005423f, -0.003603f, 0.004982f, -0.026343f, -0.003222f, -0.003747f, -0.019362f, 0.008839f, 0.001411f, 0.016675f, 0.005774f, -0.016808f, 0.022437f, -0.012939f, 0.008151f, 0.003453f, -0.001819f, 0.017375f, 0.016020f, 0.002803f, -0.024581f, 0.026272f, -0.015847f, 0.018332f, 0.007407f, -0.012116f, -0.013302f, 0.020690f, 0.001490f, -0.004447f, 0.003995f, -0.020863f, -0.008713f, 0.009010f, -0.003557f, 0.017869f, -0.013526f, -0.020054f, 0.005250f, 0.002903f, -0.001597f, 0.017465f, 0.006203f, 0.001569f, -0.015053f, 0.011738f, 0.003047f, -0.013943f, -0.004295f, -0.004510f, -0.009339f, -0.008662f, -0.008604f, 0.002488f, -0.024982f, 0.035530f, 0.015256f, 0.040489f, -0.016912f, -0.020546f, 0.038730f, 0.002029f, -0.002974f, 0.009014f, 0.003852f, 0.022837f, + 0.030470f, 0.004516f, -0.026415f, -0.043248f, 0.007167f, -0.011508f, 0.003704f, 0.001814f, -0.017957f, -0.000679f, 0.024962f, 0.020048f, 0.016440f, 0.031242f, -0.005873f, 0.026499f, -0.017231f, 0.023470f, 0.008703f, 0.018220f, -0.010889f, 0.031800f, 0.019268f, 0.023238f, -0.035418f, -0.000020f, 0.034369f, 0.019019f, 0.007166f, -0.007865f, 0.051133f, 0.021052f, -0.018479f, -0.012225f, 0.013316f, -0.019308f, -0.000744f, -0.009494f, 0.003678f, 0.041535f, 0.045058f, 0.031351f, 0.012785f, -0.000371f, 0.017579f, -0.015513f, -0.002707f, 0.016893f, -0.017741f, 0.043085f, 0.028579f, 0.020136f, 0.009370f, -0.003790f, -0.020343f, 0.023802f, 0.001457f, 0.019712f, -0.009998f, 0.004547f, -0.014815f, -0.014753f, -0.000771f, 0.001273f, -0.017680f, 0.042823f, -0.002538f, -0.021288f, -0.009560f, -0.016739f, -0.000609f, -0.026808f, 0.006976f, -0.023148f, 0.013100f, 0.002754f, -0.006068f, -0.018305f, -0.021426f, -0.032995f, -0.033748f, -0.010355f, 0.029707f, -0.002497f, -0.018924f, 0.007619f, -0.017988f, 0.013731f, -0.015274f, 0.027251f, -0.027922f, 0.006271f, -0.019632f, -0.020952f, -0.003252f, 0.003124f, + -0.005424f, 0.012644f, -0.040159f, 0.016042f, 0.004630f, -0.010222f, -0.002062f, -0.003097f, -0.019361f, -0.032758f, -0.033796f, 0.024592f, 0.013324f, -0.013928f, 0.022673f, 0.000353f, -0.007863f, -0.025844f, -0.052404f, -0.044457f, 0.026380f, -0.007955f, 0.002035f, -0.005485f, -0.000926f, -0.002664f, -0.034603f, 0.013804f, -0.041035f, -0.022800f, 0.004044f, -0.001101f, -0.006902f, -0.005335f, -0.003202f, 0.044969f, -0.010899f, -0.013415f, -0.008861f, 0.047831f, -0.004757f, -0.016396f, 0.033574f, -0.019604f, -0.009519f, -0.012841f, -0.007524f, -0.063877f, -0.048386f, -0.027901f, 0.054688f, -0.003354f, -0.009818f, -0.007278f, -0.004976f, -0.018727f, 0.018934f, 0.014628f, 0.048832f, -0.046139f, -0.009555f, 0.013594f, -0.034065f, -0.013819f, -0.012495f, 0.056551f, -0.001524f, 0.012715f, 0.028309f, 0.002218f, 0.027208f, -0.030537f, -0.038615f, -0.025733f, -0.007707f, -0.006806f, 0.003780f, 0.017465f, -0.001628f, -0.032245f, -0.022785f, -0.001945f, -0.017811f, -0.036103f, 0.031182f, -0.005621f, -0.018648f, -0.000488f, 0.009469f, 0.009909f, 0.005171f, -0.016409f, 0.002455f, -0.033509f, -0.015388f, -0.049577f, + 0.022393f, 0.014740f, -0.006654f, -0.015668f, 0.017440f, -0.024753f, -0.007097f, 0.053139f, -0.006413f, 0.045026f, 0.019406f, 0.011993f, -0.012597f, -0.056811f, -0.024330f, -0.011011f, -0.031234f, -0.022934f, -0.015192f, 0.025262f, -0.012132f, 0.000430f, -0.023109f, 0.048147f, -0.017151f, 0.019631f, 0.015128f, -0.032610f, 0.036750f, 0.002331f, -0.014711f, 0.024136f, 0.015599f, 0.072486f, 0.006412f, 0.004643f, 0.028269f, -0.027068f, -0.017224f, -0.002279f, 0.009806f, 0.014959f, -0.004110f, 0.032873f, -0.013567f, 0.007887f, 0.031587f, 0.016135f, 0.014463f, 0.013962f, -0.015757f, 0.007660f, 0.003848f, -0.006010f, 0.008696f, -0.010775f, -0.021437f, -0.009731f, 0.006705f, -0.021760f, 0.037852f, 0.001453f, 0.008119f, -0.000666f, 0.027687f, 0.029610f, 0.000124f, -0.015075f, 0.003339f, -0.002131f, 0.035528f, 0.042881f, -0.022371f, -0.015049f, -0.008555f, 0.013744f, 0.034505f, -0.021824f, 0.014389f, 0.002946f, 0.011993f, -0.009324f, -0.011891f, 0.009831f, 0.025416f, 0.007797f, -0.016969f, 0.025673f, 0.069580f, -0.015863f, 0.018922f, -0.000178f, 0.012518f, 0.028900f, 0.015026f, 0.033436f, + 0.032669f, -0.001083f, 0.046193f, 0.072115f, 0.013429f, -0.018107f, 0.077316f, 0.007168f, 0.074380f, 0.000790f, 0.015572f, -0.040229f, -0.011187f, 0.070125f, 0.013890f, -0.028076f, 0.011839f, -0.020480f, 0.011233f, 0.016002f, -0.002996f, -0.032376f, -0.010974f, -0.049904f, 0.024405f, 0.021568f, -0.018157f, 0.023188f, 0.033095f, 0.009833f, -0.006131f, -0.027490f, 0.009182f, 0.053320f, -0.021729f, 0.033540f, 0.030448f, 0.008313f, 0.023333f, 0.023757f, 0.002780f, 0.028758f, 0.018306f, -0.043220f, -0.004977f, -0.014872f, 0.050013f, 0.036372f, -0.032129f, 0.025167f, -0.002349f, 0.030060f, 0.082089f, -0.002959f, -0.012241f, 0.012859f, 0.073892f, 0.034739f, -0.003204f, 0.014380f, 0.014338f, 0.047153f, 0.038092f, -0.019841f, 0.045439f, 0.026002f, 0.042138f, -0.023271f, 0.005363f, 0.014366f, 0.009651f, 0.031826f, 0.038617f, -0.017862f, -0.018678f, 0.036993f, 0.015833f, -0.002626f, -0.009704f, 0.008203f, 0.046533f, -0.076622f, 0.021812f, -0.020486f, -0.019667f, -0.016442f, -0.015695f, 0.011334f, 0.014862f, 0.015461f, -0.018528f, -0.022525f, -0.058018f, 0.002775f, -0.032112f, 0.053307f, + 0.007088f, -0.013824f, -0.007273f, 0.031902f, 0.009895f, 0.051781f, 0.021685f, -0.013642f, 0.002949f, 0.010729f, 0.024471f, 0.038743f, -0.042778f, -0.038165f, -0.006988f, 0.065226f, -0.019231f, 0.007887f, 0.019774f, 0.028202f, 0.035991f, 0.049262f, 0.044253f, 0.003078f, -0.009075f, 0.045809f, 0.004875f, -0.030573f, 0.017105f, -0.028515f, 0.021262f, 0.003911f, -0.023146f, 0.021321f, 0.089112f, 0.047578f, -0.029440f, -0.024793f, -0.001621f, -0.025779f, -0.022478f, -0.022411f, 0.016726f, -0.013569f, -0.018779f, 0.002730f, 0.025898f, 0.012443f, 0.009831f, 0.032322f, 0.011128f, -0.010614f, 0.038321f, 0.028194f, -0.024279f, 0.015227f, -0.027593f, -0.025999f, -0.024133f, -0.003082f, -0.061224f, -0.022044f, 0.046857f, 0.029139f, -0.011695f, -0.022187f, 0.021421f, 0.017595f, -0.028607f, -0.011297f, -0.064188f, -0.003595f, 0.056701f, 0.002333f, -0.038520f, 0.008160f, 0.003662f, -0.025391f, 0.038433f, 0.022850f, -0.012909f, 0.012098f, 0.018445f, 0.024291f, 0.014437f, 0.005594f, -0.014377f, 0.010548f, 0.014960f, 0.036707f, 0.054289f, -0.012678f, -0.033249f, -0.016850f, 0.012004f, 0.012616f, + 0.045131f, -0.014732f, -0.031642f, -0.024527f, -0.024853f, 0.053901f, 0.097717f, 0.036509f, 0.007034f, 0.106643f, 0.008600f, 0.045338f, 0.027153f, -0.006881f, -0.019543f, 0.020623f, -0.027243f, -0.017770f, 0.023832f, 0.003569f, -0.060455f, -0.063170f, -0.013567f, 0.029657f, -0.031202f, -0.040331f, -0.020504f, -0.029063f, -0.022858f, 0.024912f, -0.014741f, -0.045482f, 0.025486f, 0.005255f, -0.010179f, 0.015068f, -0.006576f, 0.028681f, 0.103217f, -0.055328f, 0.055229f, -0.062543f, -0.031934f, -0.014992f, -0.006144f, 0.050197f, 0.002271f, 0.054023f, 0.034998f, 0.031678f, 0.046080f, -0.052069f, 0.021078f, -0.054562f, -0.001505f, 0.073270f, 0.065098f, 0.028323f, 0.001679f, 0.013413f, 0.008841f, -0.019871f, 0.017422f, 0.021757f, -0.090626f, 0.006512f, 0.014010f, 0.028676f, -0.032863f, -0.050438f, 0.038236f, 0.018778f, 0.010113f, -0.021003f, 0.045198f, -0.005316f, 0.035218f, 0.029845f, -0.003003f, 0.005387f, -0.009685f, 0.036173f, -0.020502f, 0.011731f, 0.021517f, -0.000854f, 0.045277f, 0.027031f, -0.002251f, 0.024064f, 0.026441f, -0.000364f, -0.020123f, -0.067460f, -0.012497f, 0.008287f, + -0.040464f, 0.004884f, 0.032348f, -0.061253f, -0.027665f, 0.010466f, -0.026888f, -0.003439f, 0.032582f, 0.002752f, -0.023582f, -0.029518f, 0.012996f, 0.013861f, -0.063555f, -0.020376f, -0.006115f, 0.000687f, 0.038306f, 0.019525f, 0.002804f, 0.068764f, -0.010942f, -0.003230f, -0.000547f, -0.042022f, -0.016441f, -0.063662f, -0.055422f, 0.011261f, -0.028131f, -0.008093f, -0.042561f, -0.053030f, -0.056067f, -0.036330f, 0.041317f, 0.056424f, 0.002218f, -0.044490f, 0.004323f, 0.003250f, 0.001296f, 0.022194f, 0.035984f, 0.036508f, 0.001505f, -0.021696f, -0.056143f, -0.031300f, -0.049104f, -0.009400f, 0.000744f, 0.005479f, 0.005622f, 0.008302f, 0.014140f, 0.019077f, 0.033848f, -0.051116f, 0.023416f, 0.010564f, 0.011920f, 0.029569f, 0.050077f, 0.057338f, -0.031964f, 0.026370f, -0.044325f, -0.012427f, -0.040260f, -0.002443f, -0.015678f, 0.094447f, 0.032971f, 0.068474f, 0.002740f, -0.034385f, -0.015597f, 0.044410f, 0.046148f, -0.025746f, 0.085365f, -0.034406f, 0.004850f, 0.005251f, 0.014242f, 0.032923f, 0.094549f, -0.005323f, 0.022301f, 0.054341f, 0.010786f, -0.041040f, 0.025019f, 0.098346f, + -0.020072f, -0.023338f, -0.060625f, -0.005362f, 0.031557f, 0.019861f, -0.004478f, -0.049148f, -0.008183f, -0.010396f, 0.018200f, 0.086151f, -0.005150f, -0.001035f, 0.036118f, 0.006620f, -0.120359f, -0.038107f, 0.084270f, 0.027807f, -0.025664f, -0.048107f, -0.007434f, -0.031898f, 0.043072f, 0.022395f, 0.007468f, -0.025590f, -0.057414f, 0.011858f, -0.098347f, -0.012176f, 0.046935f, 0.064920f, -0.008306f, -0.055467f, -0.038457f, -0.114304f, 0.032735f, -0.019885f, 0.043939f, 0.033803f, -0.033233f, -0.023556f, -0.102106f, -0.075983f, 0.038865f, 0.108186f, 0.042367f, 0.051573f, -0.036704f, -0.063815f, -0.062312f, -0.025358f, 0.091082f, 0.124198f, 0.063809f, -0.143005f, -0.053317f, -0.109297f, -0.059481f, 0.137469f, 0.032721f, 0.031394f, -0.018636f, -0.130156f, -0.108098f, -0.106498f, -0.020477f, 0.012241f, 0.067755f, -0.023211f, 0.051533f, -0.101825f, 0.064618f, 0.028827f, 0.007733f, 0.134592f, 0.008181f, -0.007700f, -0.006848f, -0.171939f, -0.056208f, -0.002972f, 0.004358f, -0.055039f, 0.095084f, 0.038622f, 0.041719f, -0.125935f, 0.021065f, -0.174010f, -0.041005f, -0.004394f, 0.020697f, 0.005800f, + -0.112365f, 0.055015f, -0.033526f, -0.023775f, -0.023773f, -0.027410f, -0.029935f, -0.038014f, 0.068246f, -0.024795f, -0.064470f, 0.015142f, -0.020436f, 0.002980f, 0.031424f, -0.073906f, -0.027759f, -0.008982f, 0.026156f, -0.001823f, 0.075718f, -0.011587f, -0.047735f, 0.098704f, -0.090502f, 0.046169f, -0.084063f, -0.032179f, 0.037126f, -0.071512f, 0.002320f, 0.042411f, -0.027457f, -0.011390f, -0.007281f, 0.055879f, 0.091920f, 0.048456f, -0.033861f, -0.019289f, -0.016787f, -0.000498f, 0.028308f, -0.019213f, -0.020553f, 0.011298f, 0.008039f, -0.178121f, -0.008376f, -0.014072f, 0.023556f, 0.012999f, 0.000052f, -0.008520f, 0.047809f, -0.063270f, -0.014217f, -0.015711f, 0.037107f, -0.148913f, -0.018448f, 0.109916f, -0.029890f, -0.068387f, 0.003717f, 0.045925f, -0.025938f, -0.044791f, -0.128137f, -0.106002f, 0.086708f, 0.073159f, 0.004018f, 0.078330f, -0.092531f, -0.008915f, -0.175630f, -0.065075f, -0.033611f, 0.079703f, 0.073087f, 0.042715f, -0.072373f, -0.027865f, -0.005908f, -0.037146f, 0.013599f, 0.026138f, 0.036542f, 0.048270f, -0.042599f, 0.025182f, -0.077191f, -0.051478f, -0.014283f, -0.020178f, + -0.000391f, 0.045052f, -0.061216f, 0.046488f, -0.024960f, -0.037199f, -0.015112f, 0.000290f, -0.075966f, -0.006180f, -0.068853f, -0.029601f, -0.027766f, -0.068309f, 0.085923f, 0.035520f, 0.018398f, 0.016679f, -0.018274f, -0.094057f, -0.133492f, -0.082138f, -0.078818f, 0.047977f, 0.011823f, 0.052057f, 0.078813f, 0.060534f, -0.021764f, 0.010791f, -0.045752f, -0.040022f, -0.041471f, 0.027847f, -0.043576f, -0.006990f, -0.041073f, -0.048503f, -0.025698f, 0.046813f, -0.038908f, -0.016307f, 0.007950f, -0.010441f, -0.054286f, -0.069453f, -0.029298f, 0.058230f, -0.012372f, -0.170957f, -0.237421f, -0.223160f, -0.211979f, -0.256553f, -0.030744f, -0.059729f, 0.062885f, 0.092469f, 0.258019f, 0.172013f, 0.220790f, 0.300129f, 0.327013f, 0.229190f, 0.285767f, 0.170311f, 0.085867f, 0.004711f, -0.037514f, -0.053793f, -0.101479f, -0.097137f, -0.142635f, -0.050366f, -0.044520f, -0.131074f, -0.096915f, -0.089435f, -0.106987f, -0.178611f, -0.120247f, -0.086593f, -0.070268f, -0.134295f, -0.009908f, -0.030050f, -0.051621f, -0.130049f, -0.123547f, -0.095908f, -0.084804f, -0.054578f, -0.019252f, -0.078545f, 0.034300f, 0.060394f, + -0.065044f, 0.092724f, 0.117739f, 0.118950f, 0.199804f, 0.169134f, 0.125383f, 0.143898f, 0.136832f, 0.142347f, 0.204790f, 0.237388f, 0.224072f, 0.159632f, 0.238864f, 0.243313f, 0.242052f, 0.254077f, 0.275976f, 0.251194f, 0.250914f, 0.347732f, 0.153056f, 0.161496f, 0.142205f, 0.132108f, -0.082783f, -0.014351f, -0.064351f, -0.180844f, -0.115747f}, + {0.003399f, 0.002832f, 0.002207f, 0.005144f, -0.001655f, 0.000476f, -0.002302f, -0.007713f, -0.014466f, 0.002985f, -0.005530f, -0.007801f, -0.010465f, 0.002541f, 0.001967f, 0.007756f, 0.002143f, 0.009220f, -0.001335f, -0.013678f, 0.005117f, -0.007222f, -0.000902f, 0.002930f, -0.005804f, -0.008938f, 0.001197f, -0.005846f, -0.000891f, -0.002954f, 0.005329f, 0.005346f, 0.001708f, -0.012749f, -0.002759f, -0.004892f, 0.009835f, 0.002052f, 0.002953f, 0.011477f, 0.005472f, 0.005150f, -0.000183f, 0.003106f, 0.018065f, 0.008873f, -0.003095f, 0.000860f, -0.008696f, 0.006218f, -0.000514f, 0.000982f, -0.010708f, -0.001419f, -0.005685f, -0.007291f, -0.002966f, 0.008071f, 0.006209f, 0.000093f, 0.000035f, -0.006998f, -0.006573f, -0.002431f, -0.006700f, -0.013773f, 0.007038f, -0.005745f, -0.001248f, -0.012966f, -0.003457f, 0.007790f, 0.003923f, -0.000582f, -0.011896f, 0.014704f, -0.001289f, 0.005827f, 0.002874f, 0.006885f, -0.012742f, -0.006977f, 0.007964f, 0.003742f, -0.000038f, -0.007190f, 0.001316f, -0.019745f, -0.012708f, -0.000870f, -0.007615f, -0.008686f, 0.003385f, 0.015089f, 0.002470f, 0.011439f, + -0.002784f, 0.011298f, -0.006950f, -0.006342f, -0.000839f, -0.010598f, 0.001997f, 0.004944f, -0.003809f, -0.000473f, 0.002649f, 0.000263f, 0.004649f, -0.000786f, -0.011140f, 0.003744f, -0.006905f, -0.005430f, 0.003114f, -0.007084f, -0.010363f, 0.010075f, -0.010860f, 0.009574f, 0.009202f, 0.005788f, -0.000446f, -0.013017f, -0.007364f, 0.001184f, -0.002328f, 0.016174f, -0.009955f, 0.003741f, -0.001170f, 0.001916f, -0.012279f, -0.021018f, -0.003475f, -0.006487f, -0.006701f, -0.001885f, 0.009050f, -0.002148f, -0.009025f, 0.007978f, 0.003902f, -0.004385f, 0.007376f, -0.001538f, 0.002721f, -0.009711f, 0.000114f, -0.002423f, 0.007776f, 0.007752f, 0.000933f, 0.014138f, -0.000352f, 0.005983f, 0.007523f, -0.000308f, -0.007182f, 0.000514f, -0.010123f, -0.012963f, -0.005007f, -0.014745f, -0.015151f, -0.005112f, 0.009689f, -0.003756f, -0.003569f, -0.008042f, -0.002126f, -0.013885f, 0.006523f, -0.004067f, 0.003229f, 0.007942f, 0.002643f, -0.003124f, 0.005501f, 0.005086f, -0.006782f, 0.004370f, 0.000498f, 0.000978f, 0.004881f, -0.012162f, -0.005240f, 0.008170f, -0.005502f, -0.000656f, -0.003528f, 0.009094f, + -0.012074f, -0.001261f, -0.010119f, 0.006249f, -0.000666f, -0.000999f, 0.009011f, -0.004182f, -0.004415f, -0.003393f, -0.008528f, 0.000353f, -0.003882f, -0.000922f, 0.000527f, 0.005530f, 0.005836f, 0.001743f, -0.002629f, -0.010230f, -0.016397f, -0.005281f, -0.001160f, -0.004229f, 0.008774f, -0.003703f, -0.005090f, 0.006918f, -0.004596f, -0.007069f, 0.015413f, -0.003312f, 0.017169f, -0.010075f, -0.004463f, -0.007156f, 0.006722f, 0.001694f, -0.000196f, 0.012498f, 0.003448f, 0.004001f, -0.016835f, 0.003686f, -0.007536f, -0.008978f, -0.011682f, 0.000261f, 0.001051f, 0.015032f, -0.011293f, 0.005962f, -0.004364f, 0.018465f, -0.005856f, -0.005539f, 0.013482f, -0.004477f, 0.005097f, 0.002355f, -0.000166f, 0.002532f, -0.007900f, 0.001804f, 0.001121f, 0.004036f, 0.017673f, 0.006297f, 0.002331f, -0.006848f, 0.006695f, -0.012786f, -0.002866f, -0.002149f, 0.008019f, 0.006529f, 0.011067f, 0.007073f, -0.006819f, -0.010935f, -0.004043f, 0.008972f, -0.000145f, 0.004819f, -0.000869f, -0.000910f, 0.018205f, 0.004394f, -0.000284f, -0.020231f, -0.008100f, 0.000859f, 0.008275f, 0.011321f, 0.016664f, 0.008991f, + -0.002480f, 0.003101f, -0.002446f, -0.004926f, 0.012561f, -0.006646f, 0.013032f, 0.000908f, -0.008529f, 0.004179f, -0.003209f, 0.009553f, 0.002016f, 0.008674f, -0.002172f, -0.001506f, -0.003315f, -0.010249f, 0.000292f, 0.007322f, 0.007194f, 0.013672f, 0.006140f, -0.017950f, -0.015143f, -0.012996f, 0.000386f, -0.002168f, 0.000789f, -0.007040f, -0.004583f, -0.001036f, 0.005264f, 0.000010f, -0.011707f, 0.012533f, -0.001989f, -0.011435f, 0.002141f, 0.002864f, -0.000473f, -0.000956f, 0.004750f, 0.006757f, -0.004382f, 0.010256f, 0.000225f, 0.006110f, -0.014011f, 0.010001f, 0.003172f, 0.005891f, -0.009760f, -0.000751f, 0.006577f, 0.006224f, 0.014645f, -0.000217f, -0.021055f, -0.005286f, -0.010287f, 0.005259f, 0.002963f, -0.000412f, -0.005933f, 0.002066f, -0.008912f, -0.002478f, -0.015897f, -0.008519f, -0.000982f, 0.009240f, 0.009124f, -0.006240f, -0.006438f, -0.005313f, 0.009348f, -0.002526f, -0.001763f, -0.013905f, 0.008375f, -0.013603f, -0.005683f, 0.000535f, -0.003717f, -0.002671f, 0.014940f, -0.001263f, 0.003766f, -0.005781f, 0.007253f, -0.006525f, -0.000394f, 0.010186f, 0.018814f, 0.012931f, + 0.002442f, -0.015410f, -0.011710f, 0.003682f, -0.003007f, -0.010004f, -0.003598f, -0.012781f, -0.005782f, 0.024636f, 0.002445f, -0.003001f, -0.005103f, -0.000322f, -0.006270f, -0.004352f, 0.016426f, -0.017855f, -0.002539f, 0.001406f, -0.004229f, 0.004078f, 0.009728f, -0.005012f, -0.006266f, 0.002269f, -0.007683f, -0.007316f, -0.016810f, -0.006344f, 0.003867f, -0.014894f, -0.002979f, 0.006938f, 0.010447f, 0.003611f, -0.023439f, -0.007202f, 0.004034f, 0.011241f, -0.009556f, 0.019615f, -0.002909f, -0.010396f, -0.006239f, -0.004600f, -0.008481f, 0.010531f, -0.008721f, -0.002449f, -0.011327f, -0.008678f, -0.004573f, -0.008822f, 0.010784f, -0.004511f, -0.023607f, 0.008458f, 0.014728f, -0.000108f, 0.004910f, -0.028205f, 0.021142f, 0.000060f, -0.018816f, 0.001513f, -0.012663f, -0.021366f, 0.003918f, -0.015916f, 0.015498f, 0.003422f, -0.006919f, -0.012975f, -0.022236f, -0.010043f, -0.016309f, 0.004681f, 0.029307f, 0.004446f, -0.008555f, -0.001131f, -0.004869f, -0.005294f, -0.014293f, -0.009567f, -0.014698f, 0.003126f, -0.001809f, 0.002417f, -0.005644f, 0.001677f, -0.015504f, -0.001642f, 0.002598f, -0.010646f, + -0.004470f, 0.000644f, -0.006248f, 0.000831f, -0.005817f, 0.021584f, -0.027916f, -0.005437f, 0.001403f, 0.006695f, -0.003601f, -0.011742f, -0.017441f, -0.012397f, 0.008117f, -0.002968f, 0.009090f, -0.009036f, 0.024904f, 0.002782f, -0.005798f, -0.000840f, -0.016086f, -0.020120f, -0.010672f, 0.006818f, -0.017473f, -0.001604f, 0.018794f, -0.001145f, -0.010049f, -0.019200f, -0.032181f, 0.000680f, 0.015405f, -0.005113f, 0.017834f, -0.002356f, -0.006394f, -0.012339f, -0.010745f, 0.001001f, 0.007074f, -0.006843f, 0.026943f, 0.006990f, -0.007628f, 0.017816f, -0.007588f, -0.020221f, -0.005435f, -0.015044f, -0.007800f, -0.006412f, 0.021735f, -0.005212f, -0.007130f, -0.008893f, 0.013989f, 0.012727f, 0.011111f, 0.030742f, 0.032012f, 0.015053f, 0.019911f, -0.007208f, -0.009149f, 0.013491f, 0.019617f, -0.008217f, 0.008624f, 0.006350f, -0.017020f, -0.015798f, 0.009490f, -0.002042f, -0.000247f, -0.015746f, -0.020471f, -0.004524f, -0.016622f, 0.019078f, 0.034928f, 0.007585f, 0.013712f, 0.004387f, -0.004246f, 0.012878f, -0.024067f, -0.006020f, 0.004808f, 0.013709f, -0.008066f, -0.018936f, 0.027998f, 0.000332f, + -0.008898f, -0.006506f, 0.011318f, -0.003071f, 0.010037f, -0.006668f, 0.015888f, -0.000975f, -0.000759f, 0.020384f, 0.005857f, 0.009596f, 0.003204f, -0.002697f, 0.014524f, -0.022426f, -0.009579f, 0.008834f, 0.025278f, -0.015371f, -0.002325f, -0.002914f, -0.004145f, -0.010437f, -0.002862f, -0.005118f, -0.007695f, 0.013184f, -0.012080f, -0.004430f, 0.011957f, -0.008551f, 0.005432f, 0.009091f, -0.016623f, -0.017813f, 0.005670f, 0.014385f, -0.004277f, 0.013163f, -0.008795f, -0.003693f, 0.024786f, -0.027141f, 0.017106f, -0.007442f, 0.000704f, 0.001142f, 0.030517f, -0.006275f, 0.006452f, 0.009934f, 0.017065f, 0.010061f, 0.015026f, -0.002018f, -0.001771f, 0.005116f, 0.002899f, 0.002796f, -0.013902f, 0.022895f, -0.029429f, -0.006227f, -0.007297f, 0.017155f, -0.002760f, 0.020823f, -0.000303f, 0.002313f, -0.035072f, -0.009416f, 0.022449f, 0.037416f, 0.000351f, -0.017982f, -0.014772f, 0.015608f, 0.012964f, 0.009605f, 0.009482f, -0.015338f, -0.006429f, -0.008696f, 0.005621f, 0.001106f, -0.008839f, 0.006150f, 0.005850f, -0.004057f, -0.004045f, -0.021085f, -0.004733f, -0.007428f, 0.031808f, 0.003307f, + 0.006842f, 0.012143f, 0.001985f, -0.023751f, 0.002236f, -0.014436f, 0.012822f, 0.011505f, -0.023885f, -0.010126f, -0.009920f, 0.002743f, -0.002788f, 0.031781f, -0.005682f, -0.000368f, 0.019645f, -0.020394f, -0.015191f, -0.019224f, -0.020008f, -0.006049f, -0.002181f, 0.006747f, 0.034120f, -0.004845f, -0.022013f, 0.035296f, -0.000905f, 0.008712f, 0.023697f, 0.015766f, 0.022008f, -0.007795f, 0.017058f, -0.013661f, 0.023094f, 0.019868f, -0.007392f, 0.009534f, -0.011479f, -0.010916f, 0.007729f, 0.026465f, 0.011106f, 0.009395f, 0.002385f, -0.010772f, -0.017206f, -0.017657f, 0.000926f, 0.017561f, -0.012954f, -0.015435f, -0.018380f, -0.008220f, -0.034796f, -0.009674f, 0.004581f, -0.026252f, 0.009954f, -0.000259f, -0.012925f, -0.030569f, -0.020969f, -0.002035f, -0.039801f, 0.009756f, 0.006377f, -0.003004f, 0.008472f, 0.004642f, -0.005859f, -0.022001f, -0.014216f, -0.004568f, -0.014887f, 0.009234f, -0.015633f, 0.028825f, -0.023818f, -0.001608f, 0.010906f, -0.002569f, -0.045857f, 0.016586f, 0.021508f, 0.037469f, 0.000311f, -0.027282f, 0.008230f, 0.013573f, -0.028096f, -0.029445f, -0.018074f, -0.000499f, + 0.016373f, -0.000609f, -0.011098f, -0.000421f, -0.009620f, -0.006691f, -0.017830f, 0.030886f, 0.024627f, 0.009154f, -0.037073f, -0.011214f, 0.006725f, -0.002089f, -0.007711f, 0.047762f, 0.018202f, 0.015000f, 0.014789f, 0.022628f, 0.017767f, 0.004080f, 0.018594f, -0.001307f, -0.028807f, 0.015909f, -0.029627f, 0.009152f, -0.029292f, 0.025291f, -0.007060f, 0.030540f, -0.015842f, 0.007197f, -0.012595f, 0.010766f, 0.019036f, 0.046604f, 0.011003f, -0.060175f, -0.002050f, -0.008805f, 0.013992f, 0.025552f, -0.004071f, -0.012229f, 0.020455f, -0.004094f, -0.008089f, 0.024923f, 0.003030f, -0.002037f, 0.002782f, 0.009997f, 0.022133f, 0.015129f, -0.016021f, -0.014479f, -0.009390f, -0.019489f, 0.006071f, -0.003482f, 0.022239f, 0.012566f, -0.025743f, 0.050414f, -0.018996f, -0.033493f, -0.010587f, 0.013149f, -0.008192f, 0.024220f, 0.035118f, -0.014069f, 0.032225f, 0.020652f, 0.016266f, -0.005332f, -0.003736f, -0.006518f, 0.031280f, 0.005625f, 0.003894f, -0.018224f, 0.008037f, -0.009593f, -0.000648f, -0.030089f, 0.020438f, -0.027651f, 0.000270f, -0.019585f, 0.032627f, -0.016839f, 0.000863f, 0.031826f, + 0.024530f, 0.016186f, -0.001841f, -0.013088f, 0.015031f, -0.000858f, -0.002786f, -0.041425f, -0.012091f, -0.025244f, -0.020052f, -0.016241f, -0.007362f, 0.020713f, 0.013407f, 0.011765f, 0.000034f, 0.030633f, -0.016669f, 0.032379f, 0.029083f, 0.030410f, 0.054617f, -0.022168f, -0.016738f, 0.022979f, 0.004246f, -0.022474f, 0.032669f, -0.012235f, -0.016444f, 0.009198f, -0.004711f, -0.013178f, -0.010252f, 0.012244f, -0.020177f, 0.006450f, -0.013173f, 0.027720f, -0.014606f, -0.002732f, 0.006584f, 0.017883f, 0.026808f, -0.005568f, -0.028450f, -0.049142f, -0.041851f, -0.004134f, 0.006205f, -0.029345f, -0.000904f, 0.000124f, 0.041569f, -0.030774f, -0.034626f, 0.008225f, -0.015753f, -0.002414f, -0.025799f, 0.020281f, -0.026152f, -0.034822f, -0.021544f, 0.034987f, -0.027456f, -0.023355f, -0.006695f, 0.012680f, -0.013054f, -0.029414f, 0.006506f, -0.013470f, -0.001637f, 0.009592f, -0.037188f, -0.005339f, 0.017891f, 0.028821f, -0.006484f, 0.045444f, 0.019475f, -0.008289f, 0.000525f, 0.019076f, -0.010603f, -0.022490f, 0.002186f, 0.023166f, 0.001424f, 0.009535f, -0.000849f, -0.024438f, 0.006009f, -0.050058f, + 0.002951f, -0.000641f, -0.007234f, -0.030912f, -0.026278f, -0.000302f, -0.012547f, -0.022422f, -0.013721f, -0.018825f, 0.017065f, -0.034572f, -0.018420f, -0.012705f, 0.012823f, -0.022135f, 0.037456f, -0.009838f, -0.032090f, -0.007120f, -0.018919f, -0.055200f, -0.014700f, -0.001729f, -0.000608f, -0.038587f, -0.015791f, -0.014683f, 0.036861f, 0.033001f, 0.010670f, 0.066502f, -0.011069f, -0.022058f, -0.019360f, -0.008812f, -0.034111f, 0.048497f, -0.027319f, -0.009737f, -0.021827f, -0.011300f, -0.009494f, 0.006236f, -0.032151f, 0.001076f, 0.001905f, -0.004136f, 0.011133f, -0.035079f, -0.007380f, 0.024766f, -0.022480f, 0.001672f, -0.029526f, 0.030338f, 0.002033f, -0.053148f, -0.025771f, -0.009490f, 0.000859f, 0.014963f, -0.030338f, -0.018120f, 0.024428f, -0.003810f, 0.017629f, 0.014079f, 0.016302f, -0.019588f, 0.004607f, 0.023409f, 0.011265f, -0.044345f, 0.031051f, 0.020158f, -0.021066f, 0.067243f, 0.001672f, -0.049105f, 0.016474f, 0.014724f, 0.002084f, 0.035390f, -0.007763f, -0.061197f, 0.020487f, 0.007675f, 0.021719f, 0.020291f, -0.023769f, 0.042364f, 0.020453f, 0.012077f, -0.006143f, 0.064382f, + -0.000597f, -0.000897f, 0.049871f, -0.010114f, 0.025624f, 0.032858f, 0.017604f, 0.001946f, -0.003075f, 0.013203f, 0.013638f, -0.046373f, -0.045521f, 0.094647f, 0.030793f, -0.058415f, -0.029203f, -0.026552f, -0.053509f, -0.003554f, -0.028065f, 0.039703f, -0.021817f, 0.000661f, 0.049312f, 0.001530f, 0.008489f, -0.035562f, 0.045483f, 0.034131f, -0.000243f, -0.010383f, -0.003181f, -0.027509f, 0.002462f, 0.004087f, 0.006054f, -0.037974f, -0.005281f, -0.001682f, -0.011268f, -0.008017f, -0.026225f, 0.025719f, 0.050143f, 0.060430f, -0.004553f, -0.023651f, -0.009792f, -0.011794f, -0.008063f, -0.036118f, 0.012826f, 0.014979f, 0.013509f, -0.037644f, -0.050756f, 0.055876f, 0.021207f, 0.031586f, 0.040478f, 0.038281f, -0.015936f, -0.025057f, 0.036692f, -0.036278f, 0.019152f, -0.026989f, -0.020778f, -0.011684f, 0.043660f, -0.013693f, 0.009281f, 0.015441f, -0.007325f, -0.034402f, 0.072834f, -0.043238f, 0.005158f, 0.052597f, -0.046607f, -0.021427f, 0.006420f, 0.018642f, 0.054732f, 0.025299f, -0.014884f, 0.016158f, 0.063585f, 0.038621f, -0.004865f, -0.039432f, 0.005015f, 0.065146f, 0.052065f, 0.011551f, + -0.050161f, -0.018887f, -0.043201f, -0.002556f, 0.035224f, 0.043246f, -0.002338f, 0.016861f, 0.051329f, 0.054477f, 0.084250f, 0.084692f, -0.041215f, 0.018914f, -0.044580f, -0.007595f, -0.036018f, -0.012626f, 0.029662f, -0.005943f, 0.013357f, 0.011895f, -0.025450f, -0.018650f, 0.021941f, 0.024198f, 0.031429f, 0.022307f, -0.000479f, 0.022939f, 0.034559f, -0.017724f, 0.017721f, 0.020312f, 0.006417f, 0.019783f, 0.065505f, -0.048820f, -0.041797f, -0.009442f, 0.040505f, 0.038523f, -0.022711f, -0.000410f, 0.061931f, 0.049782f, -0.035001f, -0.023675f, 0.021166f, -0.043203f, 0.011705f, -0.021135f, -0.039137f, 0.011852f, -0.046088f, 0.046527f, 0.016715f, 0.051459f, -0.022958f, -0.031895f, -0.060494f, -0.014246f, 0.017762f, -0.053580f, -0.046583f, -0.028503f, 0.025663f, 0.063929f, -0.003126f, -0.018745f, 0.041502f, 0.009082f, -0.001305f, -0.059366f, 0.053841f, -0.025374f, -0.055974f, -0.018758f, 0.005018f, 0.066403f, 0.007499f, 0.047717f, 0.020355f, -0.055322f, -0.010864f, -0.048988f, 0.009263f, -0.048866f, -0.034100f, -0.020760f, 0.003887f, 0.010747f, -0.036777f, 0.037853f, -0.010616f, 0.023102f, + 0.026040f, 0.024525f, 0.047087f, 0.083253f, 0.050335f, -0.015639f, -0.039171f, -0.001257f, 0.089123f, 0.054599f, -0.028006f, 0.043629f, -0.014962f, 0.053242f, -0.024555f, 0.005224f, -0.017868f, -0.009767f, -0.001026f, -0.014911f, 0.133377f, -0.024976f, -0.034207f, -0.041904f, -0.056839f, -0.022662f, -0.043268f, -0.001989f, 0.052997f, -0.020152f, 0.017286f, -0.016781f, -0.023550f, 0.046395f, -0.010407f, 0.078143f, 0.016957f, 0.062763f, -0.073356f, 0.032132f, 0.136433f, 0.049888f, -0.071269f, 0.046458f, 0.044564f, 0.005534f, -0.002119f, 0.086969f, 0.038253f, 0.005832f, -0.007271f, -0.104051f, 0.042026f, 0.058298f, -0.049607f, -0.037158f, 0.072865f, 0.046148f, -0.066490f, -0.070073f, -0.002270f, -0.042738f, 0.012113f, 0.002084f, 0.011321f, -0.066098f, 0.011477f, -0.016291f, -0.035508f, 0.050664f, -0.008572f, -0.013414f, 0.013686f, 0.041795f, 0.036576f, 0.024051f, -0.057758f, -0.003122f, -0.030708f, -0.060675f, 0.015619f, 0.011668f, 0.029769f, -0.016224f, -0.031304f, 0.067831f, -0.056850f, 0.018527f, 0.019983f, 0.016015f, 0.010376f, -0.013370f, 0.037500f, -0.043996f, -0.073495f, -0.015962f, + -0.083454f, 0.064155f, 0.037000f, 0.062806f, -0.010661f, 0.008592f, -0.059620f, 0.051845f, 0.066236f, 0.020741f, -0.035429f, -0.085003f, -0.023338f, -0.110695f, -0.003158f, -0.024988f, -0.075943f, -0.066294f, 0.024034f, -0.001379f, 0.041253f, -0.040211f, 0.049482f, 0.035953f, -0.057285f, 0.005708f, -0.008541f, -0.060756f, 0.029968f, 0.023169f, -0.027207f, 0.012443f, -0.012773f, -0.092719f, -0.022484f, 0.025362f, -0.008362f, 0.012307f, -0.050002f, 0.070648f, -0.087788f, 0.008882f, -0.063458f, 0.047779f, 0.053882f, 0.018186f, 0.045684f, 0.006233f, -0.040546f, 0.076109f, -0.031533f, 0.009227f, 0.004590f, -0.041684f, 0.074408f, 0.006122f, 0.022059f, 0.016635f, 0.025929f, 0.012816f, 0.057045f, 0.063518f, 0.025241f, 0.073957f, -0.059254f, -0.004145f, 0.004489f, 0.094111f, -0.013226f, 0.075048f, 0.046464f, 0.102811f, 0.025223f, -0.022970f, -0.027352f, 0.040815f, -0.071009f, 0.072230f, -0.037742f, -0.025989f, -0.005939f, 0.014171f, 0.061328f, -0.013447f, -0.092324f, -0.028473f, 0.168321f, 0.010753f, -0.093227f, 0.023519f, -0.058306f, 0.018016f, 0.168145f, -0.046049f, -0.032532f, 0.106861f, + -0.106186f, 0.055841f, 0.042278f, 0.030265f, 0.122870f, 0.057051f, -0.058159f, 0.081069f, 0.040091f, 0.054542f, 0.103918f, 0.051810f, -0.049957f, 0.066563f, 0.019798f, 0.060092f, -0.017450f, -0.110916f, 0.112706f, 0.098213f, 0.060009f, 0.185306f, -0.017541f, -0.155071f, -0.080612f, -0.073022f, 0.163822f, 0.120995f, 0.028787f, -0.010086f, -0.030440f, -0.108199f, -0.052057f, -0.034753f, -0.062922f, 0.167545f, 0.134984f, 0.188950f, 0.002886f, -0.215004f, -0.336366f, -0.163108f, 0.186332f, 0.253064f, 0.256987f, 0.104614f, -0.214473f, -0.391776f, -0.241587f, -0.120659f, 0.180170f, 0.308813f, 0.173884f, 0.096058f, 0.024381f, -0.137878f, -0.187790f, -0.138595f, -0.011740f, 0.109453f, 0.218259f, 0.263692f, 0.045305f, 0.052662f, -0.209753f, -0.343844f, -0.185634f, 0.173577f, 0.287209f, 0.275408f, 0.169252f, -0.098743f, -0.337664f, -0.215681f, -0.283541f, 0.002915f, 0.189164f, 0.208470f, 0.101562f, -0.080238f, -0.178637f, -0.155505f, -0.124794f, 0.036084f, -0.025331f, -0.062194f, 0.067820f, 0.008144f, -0.102695f, 0.011115f, -0.028042f, -0.042361f, 0.028593f, -0.032891f, -0.014087f, -0.055838f, + 0.001415f, -0.022463f, -0.042010f, 0.014333f, -0.006220f, 0.011709f, 0.004898f, 0.031718f, -0.034518f, -0.012892f, 0.008566f, 0.001857f, 0.014023f, -0.015853f, 0.032266f, -0.025646f, 0.021798f, 0.009198f, -0.012339f, -0.026900f, -0.012151f, -0.048785f, 0.049719f, -0.006539f, 0.000474f, -0.010827f, -0.013366f, 0.000823f, -0.002620f, -0.000716f, 0.018648f, 0.009670f, -0.001588f, 0.026457f, -0.025673f, 0.006586f, -0.024344f, 0.023381f, 0.014960f, -0.021901f, 0.013014f, -0.026327f, -0.027245f, -0.024404f, -0.041581f, -0.007455f, 0.030807f, -0.031478f, -0.056020f, -0.041952f, 0.003656f, 0.030266f, 0.001351f, 0.021093f, -0.052222f, -0.019058f, -0.004486f, -0.010789f, -0.049533f, -0.020349f, 0.005741f, -0.002011f, -0.011939f, 0.039243f, 0.038264f, -0.044458f, -0.055573f, -0.090486f, -0.141439f, 0.003970f, 0.114783f, -0.045493f, -0.072120f, -0.077212f, -0.072803f, 0.013759f, 0.013926f, 0.132236f, -0.020262f, -0.020463f, -0.060320f, 0.005329f, 0.017175f, 0.040681f, -0.045523f, 0.021228f, -0.033323f, 0.050855f, 0.015846f, 0.015662f, 0.005492f, -0.034029f, -0.018479f, -0.022733f, -0.007764f, 0.017360f, + -0.020358f, -0.018888f, 0.036149f, -0.035317f, -0.021719f, 0.028791f, -0.029708f, -0.012388f, -0.025589f, -0.042400f, 0.013686f, 0.024860f, 0.004230f, 0.023279f, -0.038886f, -0.011620f, -0.001803f, 0.020234f, 0.026769f, 0.032040f, 0.001689f, -0.005571f, -0.058182f, -0.061106f, -0.022585f, -0.021232f, -0.013707f, 0.025010f, 0.036314f, 0.050330f, 0.004871f, -0.026090f, 0.051569f, -0.039712f, -0.017967f, 0.021304f, -0.017835f, 0.067036f, 0.001870f, -0.013382f, 0.009642f, -0.026817f, 0.017331f, 0.046834f, 0.035386f, -0.013884f, 0.007795f, 0.034174f, -0.092828f, -0.213763f, -0.163945f, -0.021031f, 0.067504f, 0.179983f, 0.151525f, 0.144636f, 0.147671f, 0.096720f, 0.039276f, -0.056445f, -0.098440f, -0.185514f, -0.137455f, -0.134947f, -0.134719f, -0.084548f, 0.077321f, 0.105272f, 0.155563f, 0.119088f, 0.099178f, 0.031313f, 0.065337f, -0.017464f, -0.020029f, -0.023486f, -0.039555f, -0.071541f, -0.059287f, -0.118988f, -0.044998f, -0.094911f, -0.046633f, -0.024025f, 0.028001f, 0.004038f, 0.041126f, 0.008058f, 0.058581f, 0.042819f, 0.071397f, 0.096021f, 0.119441f, 0.075957f, 0.050130f, 0.084659f, + 0.004613f, -0.031144f, -0.108752f, -0.126870f, -0.174107f, -0.155096f, -0.145246f, -0.056411f, -0.095701f, -0.050552f, 0.004574f, 0.024962f, 0.059961f, 0.115301f, 0.123264f, 0.137873f, 0.209018f, 0.117753f, 0.161084f, 0.111958f, 0.027748f, -0.014646f, -0.060920f, -0.162501f, -0.174135f, -0.164951f, -0.175443f, -0.118887f, -0.036739f, -0.002198f, 0.004347f} + }, + { + {0.004627f, -0.001247f, 0.003163f, 0.002375f, 0.004371f, -0.000807f, -0.003535f, 0.006836f, -0.000962f, -0.010817f, -0.003143f, -0.012016f, 0.008397f, 0.001616f, -0.001813f, 0.001689f, -0.002308f, 0.001607f, -0.010072f, 0.008299f, -0.001014f, 0.002932f, -0.009426f, -0.003428f, -0.003458f, -0.013063f, -0.005021f, -0.001107f, -0.000166f, -0.000846f, 0.004906f, -0.001861f, -0.004828f, -0.003774f, -0.010108f, -0.000930f, -0.010092f, -0.000593f, 0.002258f, 0.002530f, -0.002650f, 0.000242f, -0.001839f, -0.000342f, -0.003490f, -0.003296f, 0.002182f, -0.002113f, -0.002515f, 0.004000f, 0.013333f, 0.000640f, 0.005849f, 0.010699f, -0.000998f, -0.002204f, 0.010010f, -0.005495f, -0.000756f, -0.002224f, 0.000462f, 0.004186f, 0.001793f, -0.004491f, -0.005257f, 0.005688f, 0.003223f, 0.006391f, -0.003809f, -0.003521f, -0.005040f, -0.002158f, -0.001952f, -0.002389f, -0.003433f, 0.001183f, -0.017397f, 0.013370f, 0.000607f, 0.006107f, 0.006067f, 0.017318f, 0.008123f, -0.006486f, -0.008161f, -0.011379f, 0.008053f, -0.009966f, -0.007246f, 0.001543f, 0.002440f, 0.000994f, 0.010147f, -0.003412f, 0.009481f, -0.002525f, + 0.008505f, -0.008190f, 0.003700f, -0.003672f, -0.008712f, -0.000708f, -0.016570f, 0.002376f, 0.003995f, 0.007278f, -0.006093f, -0.000210f, 0.006380f, -0.004861f, 0.007171f, 0.006690f, -0.004164f, 0.004763f, -0.005560f, -0.002689f, -0.004137f, -0.006068f, -0.007616f, 0.006586f, 0.009857f, -0.007610f, 0.004311f, 0.007835f, 0.006361f, 0.009621f, 0.001102f, -0.001660f, 0.005563f, 0.004132f, -0.010520f, -0.000606f, 0.001019f, 0.000437f, 0.003086f, 0.006480f, 0.001275f, 0.002184f, -0.003863f, -0.002543f, 0.004442f, 0.006390f, 0.003353f, -0.003837f, -0.006632f, 0.006560f, -0.006135f, -0.002157f, 0.003145f, -0.001523f, -0.001218f, 0.002570f, -0.000674f, 0.006880f, -0.003621f, 0.005041f, 0.000502f, -0.000416f, -0.013957f, 0.002251f, 0.011936f, -0.007307f, 0.004951f, -0.014844f, -0.014988f, -0.004951f, -0.012178f, -0.010664f, -0.001564f, 0.002199f, 0.008438f, 0.001330f, -0.003993f, 0.001893f, 0.005767f, -0.007393f, 0.010292f, -0.006943f, -0.007433f, 0.008658f, -0.004244f, 0.009975f, 0.012769f, 0.001745f, -0.009074f, 0.006392f, 0.004276f, 0.002553f, -0.004563f, -0.003393f, 0.005436f, 0.004436f, + 0.001019f, -0.010365f, -0.002864f, -0.009575f, 0.008768f, -0.008643f, -0.005483f, 0.006344f, 0.000458f, 0.005507f, 0.001751f, 0.002111f, 0.009585f, 0.001588f, 0.010745f, -0.013585f, -0.006750f, -0.003130f, 0.006985f, 0.009543f, 0.011163f, 0.014842f, 0.001923f, -0.004168f, -0.001060f, -0.001914f, -0.000044f, -0.009520f, -0.003737f, -0.004039f, -0.000601f, 0.001698f, -0.007098f, -0.004316f, -0.000825f, -0.002867f, -0.004687f, 0.007900f, 0.015673f, -0.012013f, -0.004650f, -0.002548f, 0.009549f, 0.008601f, -0.009134f, -0.001033f, -0.016762f, -0.003832f, 0.019820f, 0.007335f, -0.008294f, 0.014177f, 0.004469f, 0.005320f, 0.001241f, -0.005042f, -0.016009f, 0.001907f, -0.007336f, -0.004710f, -0.003112f, -0.009828f, -0.003633f, -0.007654f, 0.004967f, -0.003578f, -0.004585f, 0.008798f, -0.017211f, 0.015422f, -0.005735f, 0.002019f, -0.005545f, 0.004677f, -0.000859f, -0.001760f, -0.000645f, 0.006455f, 0.000106f, 0.004011f, -0.006292f, 0.011515f, -0.009323f, 0.013444f, 0.002687f, -0.001534f, -0.007846f, -0.009134f, 0.018319f, 0.003019f, -0.017574f, 0.017594f, 0.016545f, -0.009255f, -0.003522f, 0.005104f, + -0.007036f, -0.001422f, -0.004391f, 0.004072f, 0.010531f, -0.006613f, 0.002316f, -0.004962f, -0.004542f, 0.001681f, 0.014325f, -0.013215f, 0.008005f, -0.013561f, -0.010358f, -0.009683f, -0.001503f, 0.000653f, 0.000650f, 0.003112f, 0.006045f, -0.004576f, 0.002234f, -0.010513f, 0.013091f, -0.015387f, 0.002207f, 0.019330f, -0.030653f, 0.024042f, 0.010510f, -0.006930f, 0.008605f, 0.000990f, 0.021084f, -0.000385f, -0.014622f, -0.009622f, 0.008112f, 0.009261f, 0.003721f, 0.002238f, 0.009848f, 0.004206f, 0.002913f, 0.013003f, 0.006161f, 0.004979f, 0.009671f, 0.007618f, 0.029399f, -0.005855f, 0.008968f, 0.001423f, -0.003011f, 0.009074f, 0.006054f, 0.004701f, 0.005102f, -0.002663f, -0.006139f, 0.002439f, 0.001563f, 0.002358f, 0.005609f, 0.010492f, -0.007084f, -0.007175f, 0.005568f, -0.000132f, -0.001925f, -0.003392f, 0.012937f, -0.005961f, 0.017992f, 0.009928f, 0.002348f, 0.006146f, 0.003018f, 0.006858f, 0.022456f, 0.019958f, 0.002991f, 0.003580f, 0.005675f, -0.001449f, 0.009480f, 0.001208f, 0.008732f, 0.005344f, 0.002182f, 0.003574f, -0.007138f, 0.012733f, 0.008260f, -0.001481f, + 0.004724f, -0.001347f, 0.009669f, 0.000735f, 0.011091f, -0.003491f, 0.009943f, -0.006522f, 0.020058f, -0.014341f, -0.004752f, -0.006645f, 0.020721f, 0.011656f, 0.008152f, 0.012997f, -0.010573f, -0.001995f, 0.019277f, 0.010721f, 0.009553f, 0.009183f, 0.005722f, 0.006359f, -0.001116f, 0.017827f, -0.000807f, -0.007957f, -0.004973f, 0.006312f, -0.005552f, 0.004138f, -0.015538f, 0.006241f, -0.002019f, 0.000358f, -0.016698f, 0.007723f, -0.002580f, 0.016782f, -0.001434f, 0.005249f, 0.005975f, -0.007201f, -0.000351f, 0.007514f, 0.002522f, 0.005067f, -0.002266f, 0.009102f, 0.014818f, 0.001405f, -0.007566f, 0.003234f, 0.011043f, 0.006301f, 0.003061f, -0.006715f, -0.011075f, 0.010467f, -0.012434f, -0.006596f, 0.010302f, -0.019706f, -0.002050f, 0.011383f, -0.006315f, 0.001971f, 0.002995f, -0.001588f, 0.000646f, 0.004435f, -0.005755f, 0.000401f, -0.010970f, -0.007208f, -0.009628f, -0.006702f, 0.004236f, -0.036338f, 0.005185f, -0.012173f, -0.007457f, 0.007037f, 0.005157f, 0.003241f, 0.000572f, -0.027021f, -0.003711f, 0.006984f, -0.014903f, -0.004759f, -0.020021f, -0.010827f, 0.003302f, -0.003401f, + -0.018490f, 0.017129f, 0.010099f, -0.006754f, 0.001048f, 0.013204f, -0.010210f, 0.002673f, -0.007267f, -0.011238f, -0.007743f, -0.019366f, -0.007663f, 0.012450f, 0.005570f, 0.016236f, -0.009722f, -0.029886f, -0.013226f, 0.005707f, -0.010029f, -0.019959f, -0.003986f, -0.004838f, 0.016210f, 0.007331f, -0.020656f, 0.011884f, -0.014836f, -0.002264f, -0.010913f, -0.011216f, -0.010037f, -0.023432f, -0.013716f, 0.000114f, 0.013449f, 0.019783f, 0.013017f, 0.002411f, 0.007893f, -0.011334f, -0.016856f, -0.011710f, 0.009837f, -0.006673f, 0.010724f, -0.005091f, -0.010678f, -0.002294f, 0.000775f, -0.006851f, -0.011660f, -0.001216f, 0.009143f, -0.030697f, -0.017860f, 0.023383f, 0.014059f, 0.000161f, 0.007419f, -0.008741f, 0.007403f, -0.012158f, -0.000251f, 0.022430f, -0.009685f, 0.021189f, 0.021736f, 0.026352f, 0.007210f, 0.010769f, 0.023120f, 0.017876f, 0.013666f, -0.017007f, 0.003061f, 0.005796f, 0.015833f, -0.002669f, -0.012010f, 0.016916f, 0.017777f, -0.004561f, 0.012169f, -0.005404f, -0.004940f, 0.010767f, 0.010122f, -0.001139f, 0.011859f, 0.001072f, -0.016711f, -0.014104f, 0.016416f, 0.022318f, + -0.000649f, -0.007692f, 0.005840f, 0.000670f, -0.009442f, -0.019952f, 0.011599f, -0.018906f, -0.007914f, 0.014265f, 0.004335f, 0.012565f, 0.001874f, 0.020177f, 0.004207f, 0.022134f, -0.024614f, 0.023324f, -0.003112f, -0.001239f, 0.008649f, 0.012089f, -0.008422f, -0.022002f, -0.004453f, 0.019249f, -0.002108f, -0.023641f, -0.011800f, -0.014782f, 0.005750f, 0.007615f, -0.018037f, 0.009328f, 0.013823f, 0.019911f, 0.008813f, 0.005383f, 0.006639f, 0.022093f, 0.002507f, 0.009039f, 0.026293f, 0.028432f, 0.008173f, 0.006928f, -0.021663f, -0.011019f, 0.023056f, -0.017713f, 0.023558f, 0.006516f, -0.000559f, -0.005028f, -0.008871f, -0.014105f, 0.002048f, 0.010415f, -0.026334f, -0.011900f, -0.011514f, 0.005535f, 0.004636f, 0.005475f, 0.000228f, 0.004214f, -0.001534f, 0.007620f, 0.005714f, -0.007004f, -0.012744f, -0.022473f, 0.003279f, -0.012201f, 0.019475f, 0.000677f, -0.011897f, -0.014173f, -0.005028f, 0.009241f, -0.018291f, 0.010857f, -0.006655f, 0.003506f, -0.001023f, -0.012598f, 0.011547f, 0.015586f, -0.011651f, 0.013095f, 0.002844f, -0.001130f, 0.036682f, -0.009592f, -0.025429f, 0.004497f, + 0.008127f, -0.006252f, 0.000932f, -0.010794f, 0.024402f, 0.014676f, -0.003760f, -0.005698f, 0.016868f, 0.017064f, -0.004986f, -0.015150f, -0.012163f, 0.035085f, -0.004741f, -0.005584f, -0.015768f, 0.008379f, -0.020507f, -0.006430f, -0.007067f, 0.000761f, 0.007456f, 0.018475f, 0.016003f, -0.027881f, -0.000286f, 0.002316f, -0.003648f, -0.008920f, -0.019530f, -0.002759f, 0.005353f, 0.010210f, 0.008063f, -0.017936f, -0.003920f, -0.022507f, 0.019350f, 0.000046f, -0.002975f, 0.008916f, -0.010621f, -0.002606f, -0.024054f, 0.003033f, -0.014769f, 0.008673f, -0.002812f, -0.004702f, -0.008826f, -0.016152f, -0.015932f, -0.002604f, -0.019426f, -0.030784f, -0.006645f, -0.014485f, -0.029882f, -0.003176f, -0.003597f, -0.016588f, 0.009169f, 0.014975f, -0.003141f, 0.006702f, -0.003203f, -0.003335f, 0.003042f, 0.003841f, -0.024598f, -0.007697f, 0.011452f, -0.012050f, 0.026495f, 0.004230f, 0.005987f, -0.018788f, -0.001703f, -0.008902f, -0.019983f, -0.002710f, 0.024146f, 0.011289f, 0.017785f, 0.010264f, -0.010646f, -0.021439f, -0.034960f, 0.021498f, 0.019722f, -0.002696f, 0.008258f, -0.023692f, -0.051137f, -0.013285f, + 0.039518f, 0.012759f, 0.015753f, -0.011134f, 0.015925f, 0.027312f, 0.001452f, -0.005410f, -0.047234f, -0.011590f, -0.002782f, 0.026015f, 0.006939f, 0.009984f, -0.035518f, -0.010156f, -0.013567f, -0.009081f, 0.021151f, -0.013035f, -0.004819f, 0.002977f, 0.005657f, -0.011839f, -0.005384f, 0.004792f, -0.010321f, 0.020521f, -0.024499f, 0.001745f, 0.015219f, -0.021384f, 0.016279f, 0.027745f, 0.032771f, 0.015109f, 0.015746f, 0.020965f, -0.015578f, -0.028450f, 0.010401f, 0.011010f, 0.017603f, 0.013506f, -0.031706f, -0.009837f, 0.015721f, 0.008439f, 0.005301f, 0.018496f, 0.003717f, 0.021696f, -0.009154f, -0.005956f, 0.012277f, 0.010954f, 0.002852f, -0.021114f, -0.011534f, -0.022611f, -0.025530f, -0.002535f, -0.027916f, 0.000327f, -0.016753f, 0.000022f, -0.015451f, -0.009511f, -0.035940f, 0.022824f, 0.004804f, -0.006188f, -0.007870f, -0.005049f, 0.002781f, 0.031133f, -0.015981f, -0.013732f, -0.012263f, 0.021290f, 0.027113f, -0.017887f, 0.043845f, 0.008833f, -0.019590f, 0.022257f, 0.005876f, -0.018984f, -0.022370f, -0.018020f, -0.002048f, -0.009877f, -0.007104f, -0.029417f, 0.010975f, 0.011657f, + 0.039420f, 0.005028f, -0.007507f, -0.018472f, -0.019626f, 0.004435f, -0.002927f, -0.025694f, 0.003803f, -0.009725f, 0.000518f, 0.019275f, -0.015850f, 0.025614f, -0.023437f, -0.019347f, -0.002008f, -0.029952f, -0.036295f, 0.005584f, -0.004805f, -0.041209f, 0.002109f, 0.000354f, -0.020274f, 0.010178f, -0.010232f, 0.005147f, -0.028489f, -0.045286f, 0.028996f, -0.027650f, 0.045330f, 0.025282f, -0.033683f, -0.004028f, -0.034120f, -0.008729f, -0.004976f, 0.014210f, -0.012757f, 0.021602f, 0.025934f, 0.025893f, -0.018959f, -0.014152f, 0.001728f, -0.021474f, -0.002637f, -0.006122f, -0.029925f, 0.019228f, 0.013129f, -0.013549f, 0.024343f, -0.030224f, -0.025954f, -0.019536f, 0.014415f, 0.017173f, 0.019000f, 0.031281f, -0.010151f, 0.056788f, -0.000637f, -0.028106f, 0.013777f, 0.028387f, 0.008731f, 0.015287f, -0.011039f, -0.030232f, 0.047893f, 0.026654f, 0.020411f, 0.009793f, -0.014806f, 0.015739f, 0.040222f, -0.013579f, 0.009761f, 0.000291f, 0.009656f, 0.007351f, 0.029198f, -0.007327f, 0.010990f, -0.009143f, 0.010050f, -0.002025f, 0.000205f, 0.017776f, 0.005405f, -0.033728f, -0.021202f, -0.031586f, + -0.020147f, -0.016502f, -0.006523f, -0.024074f, -0.011901f, -0.011557f, -0.019232f, -0.014308f, 0.011624f, -0.021765f, -0.005383f, -0.016784f, 0.043782f, 0.021559f, 0.038548f, -0.032108f, -0.000400f, -0.029283f, -0.003486f, 0.033959f, 0.021367f, 0.039941f, 0.021954f, 0.024987f, -0.022465f, 0.012386f, 0.015172f, 0.037247f, 0.041039f, 0.012038f, 0.037951f, -0.027637f, -0.008718f, 0.023115f, -0.069669f, 0.003948f, 0.032903f, 0.021506f, -0.021038f, 0.041988f, 0.025016f, -0.001770f, -0.010120f, -0.004896f, 0.025278f, 0.061879f, 0.033125f, 0.009195f, 0.002801f, 0.020565f, -0.004728f, 0.050021f, 0.028276f, 0.031373f, 0.001438f, -0.015472f, 0.010682f, 0.004076f, -0.026285f, -0.006183f, -0.001561f, -0.005925f, -0.007448f, 0.010389f, 0.005553f, -0.021382f, -0.010360f, -0.038023f, -0.003927f, -0.011656f, -0.049300f, -0.021905f, 0.001438f, 0.018633f, -0.025451f, 0.031871f, -0.008912f, -0.007456f, -0.004488f, -0.007671f, 0.022854f, -0.015506f, 0.015863f, -0.050565f, 0.015321f, 0.021921f, 0.016633f, 0.033459f, -0.033678f, 0.028520f, -0.030347f, -0.022718f, 0.024362f, -0.015193f, -0.005110f, 0.020178f, + -0.034617f, 0.029029f, 0.047219f, -0.002252f, -0.008024f, 0.059740f, -0.014419f, 0.009676f, 0.033197f, -0.076625f, -0.039452f, -0.001386f, 0.000177f, 0.004380f, 0.015015f, 0.026735f, 0.016703f, -0.040139f, -0.011114f, -0.058470f, -0.035198f, 0.043148f, 0.042811f, 0.004692f, -0.010185f, 0.036438f, -0.058765f, -0.031377f, -0.063602f, 0.027931f, 0.007586f, 0.002998f, 0.012168f, -0.028695f, 0.014463f, 0.020322f, 0.026158f, 0.044903f, 0.045678f, 0.038823f, -0.001803f, 0.009009f, 0.000233f, -0.016467f, -0.003767f, -0.013674f, -0.007563f, 0.053579f, -0.012785f, -0.048548f, -0.012754f, -0.009659f, 0.003959f, 0.077113f, -0.028172f, -0.027029f, 0.025465f, -0.041040f, 0.013839f, -0.045566f, 0.059637f, 0.017549f, -0.002285f, 0.016011f, -0.023870f, -0.028795f, 0.040555f, -0.049530f, -0.040811f, -0.035384f, 0.009201f, 0.015768f, 0.017913f, -0.032706f, 0.033391f, -0.009818f, 0.001589f, 0.053694f, -0.004694f, -0.008106f, 0.014378f, 0.043614f, -0.028932f, 0.071788f, 0.001151f, -0.080395f, -0.011612f, -0.001843f, -0.029235f, -0.006319f, -0.002543f, -0.005639f, -0.025811f, -0.015545f, 0.032583f, 0.014916f, + -0.011762f, -0.002754f, 0.082589f, 0.050905f, -0.057949f, -0.045884f, 0.067416f, 0.064517f, 0.042152f, 0.047736f, -0.069888f, -0.011547f, -0.015777f, 0.024572f, 0.012078f, -0.025265f, -0.050329f, -0.078653f, 0.029304f, 0.026994f, 0.011357f, 0.027954f, -0.006515f, 0.000808f, -0.014909f, 0.021634f, 0.033877f, 0.031047f, 0.011768f, 0.039626f, 0.016083f, 0.001275f, -0.009008f, -0.045556f, 0.002366f, -0.016067f, -0.012568f, 0.023045f, -0.049299f, 0.010339f, 0.007454f, -0.019883f, 0.027577f, 0.026045f, 0.015477f, -0.030914f, -0.028641f, -0.084011f, -0.017316f, 0.006665f, -0.023131f, 0.011266f, 0.024777f, 0.025295f, 0.056192f, 0.031267f, -0.016130f, -0.008716f, -0.027140f, 0.049439f, -0.011292f, 0.080706f, 0.067906f, 0.024919f, -0.031995f, 0.089326f, 0.044680f, -0.023485f, 0.013081f, 0.050818f, 0.102866f, -0.027212f, -0.061751f, -0.023045f, 0.013496f, -0.004085f, 0.034979f, 0.014598f, -0.017005f, 0.018894f, 0.001718f, -0.014401f, 0.032058f, 0.011478f, -0.009765f, -0.029872f, 0.026464f, -0.050925f, -0.045962f, -0.016935f, 0.038067f, -0.021029f, -0.025346f, -0.000382f, 0.043864f, 0.004238f, + 0.045385f, -0.014926f, 0.054539f, 0.005638f, 0.030218f, -0.019012f, -0.010212f, 0.015992f, -0.052048f, -0.015930f, 0.022886f, -0.010586f, -0.004762f, -0.044741f, -0.038596f, 0.018009f, -0.022343f, -0.019389f, 0.036869f, 0.044982f, -0.003657f, 0.028925f, -0.051582f, 0.001568f, -0.011379f, 0.069368f, -0.025686f, 0.021588f, 0.047668f, 0.039237f, 0.016362f, -0.031641f, 0.022946f, 0.010418f, 0.017366f, 0.019884f, -0.065250f, 0.126225f, 0.046823f, -0.015227f, 0.012562f, 0.010290f, 0.042173f, -0.014762f, 0.034362f, 0.070267f, 0.002893f, -0.099601f, 0.046969f, 0.025509f, -0.024479f, 0.035648f, 0.000162f, -0.029678f, -0.038719f, 0.083861f, -0.035788f, 0.086876f, -0.037806f, -0.015465f, 0.088989f, 0.010650f, 0.048309f, 0.024660f, -0.048968f, 0.003072f, 0.029022f, -0.008729f, -0.042669f, -0.008158f, -0.093030f, -0.026027f, -0.034705f, -0.020057f, 0.020212f, -0.002737f, 0.033173f, -0.016339f, 0.003476f, 0.032383f, -0.029049f, 0.003075f, 0.018301f, -0.001887f, -0.031921f, -0.000133f, -0.022033f, 0.064060f, -0.011544f, 0.037071f, 0.005683f, -0.000755f, 0.065397f, 0.047244f, -0.029408f, -0.034166f, + 0.016177f, 0.029599f, 0.035535f, 0.043644f, -0.001459f, 0.015255f, 0.040843f, -0.002483f, -0.017558f, 0.012786f, 0.000517f, -0.037090f, -0.001901f, 0.024044f, -0.037461f, -0.049081f, -0.005978f, -0.003164f, -0.006773f, -0.016568f, -0.019391f, -0.058321f, -0.002017f, 0.057120f, 0.015332f, 0.031894f, 0.016167f, -0.007379f, -0.078272f, -0.054597f, 0.011241f, 0.049688f, 0.011597f, 0.026266f, 0.093541f, 0.105335f, 0.080069f, -0.002467f, 0.033769f, -0.020956f, -0.077170f, -0.023309f, -0.053661f, 0.020725f, -0.030382f, 0.021172f, -0.010643f, -0.036832f, -0.008125f, 0.003821f, 0.024935f, -0.013277f, 0.015050f, -0.056151f, 0.061079f, -0.122102f, -0.007709f, -0.027602f, -0.020827f, 0.020744f, 0.077238f, 0.015403f, 0.031379f, -0.058315f, 0.019228f, 0.026613f, 0.055010f, -0.022117f, -0.034588f, -0.024221f, -0.007940f, 0.001700f, 0.004739f, 0.033543f, 0.027782f, -0.014173f, -0.084938f, -0.039768f, -0.067772f, 0.012019f, 0.137008f, -0.088993f, -0.029966f, -0.010872f, 0.082281f, -0.021956f, 0.038939f, -0.020893f, 0.043634f, -0.011236f, -0.014523f, -0.043774f, 0.031964f, -0.051299f, 0.058344f, 0.093711f, + 0.020062f, -0.013893f, -0.008227f, 0.078016f, 0.029104f, 0.001916f, 0.049347f, 0.015489f, 0.024400f, -0.012281f, 0.097559f, -0.134897f, 0.110139f, -0.081830f, 0.051228f, 0.098792f, -0.066261f, 0.158633f, 0.120792f, -0.042710f, -0.000900f, 0.097942f, 0.019423f, -0.003389f, 0.092230f, 0.088067f, -0.075383f, 0.073397f, 0.067206f, -0.063294f, -0.096068f, -0.141290f, 0.032559f, 0.212621f, 0.086802f, 0.000666f, 0.043324f, -0.202710f, -0.084435f, -0.006792f, 0.030329f, 0.153238f, 0.148798f, 0.026344f, -0.058350f, -0.111891f, -0.066732f, 0.008315f, 0.047436f, 0.073804f, 0.116650f, 0.071811f, -0.095654f, -0.222928f, -0.183450f, -0.016904f, 0.202012f, 0.222024f, 0.138473f, 0.043863f, -0.048061f, -0.088852f, -0.137491f, -0.076274f, -0.084159f, 0.164067f, 0.133906f, 0.087116f, 0.074269f, -0.113134f, -0.162477f, -0.184936f, -0.168844f, 0.066586f, 0.225166f, 0.281407f, 0.092794f, -0.082112f, -0.200340f, -0.235709f, -0.066511f, 0.041225f, 0.022944f, 0.152231f, 0.056810f, -0.053035f, -0.035117f, -0.111260f, -0.026756f, -0.127483f, 0.055191f, 0.159534f, 0.289500f, -0.013753f, -0.157040f, -0.334677f, + -0.014577f, -0.113397f, 0.001321f, -0.019527f, 0.095682f, 0.055817f, -0.008436f, 0.020132f, 0.010411f, -0.068443f, -0.007031f, -0.005859f, 0.007571f, 0.001760f, 0.005634f, -0.025349f, -0.009751f, -0.009669f, -0.006011f, -0.011869f, 0.041113f, -0.015243f, 0.017887f, -0.031356f, -0.002689f, 0.011974f, -0.001001f, -0.010103f, 0.070973f, 0.008913f, -0.039343f, -0.047275f, 0.010357f, 0.008756f, -0.026583f, 0.006487f, 0.036121f, 0.017224f, 0.034102f, -0.035354f, 0.011174f, -0.002563f, 0.008927f, -0.025469f, 0.005564f, 0.025051f, 0.038789f, 0.007836f, -0.008654f, 0.009206f, 0.005525f, -0.010790f, 0.027078f, -0.040162f, 0.010059f, -0.064238f, -0.017764f, 0.022975f, -0.019245f, -0.027689f, 0.035560f, -0.024556f, -0.055645f, -0.048121f, 0.041926f, -0.008728f, -0.005265f, 0.004872f, 0.022959f, 0.045401f, -0.029437f, -0.048074f, 0.005571f, -0.012249f, 0.038386f, -0.007597f, 0.025312f, -0.001881f, 0.004354f, -0.057409f, -0.063156f, -0.148402f, 0.041161f, 0.040639f, -0.004319f, -0.125350f, -0.081426f, -0.013218f, -0.021618f, 0.081374f, 0.054598f, 0.025419f, -0.056109f, -0.024106f, -0.015760f, 0.050389f, + 0.004502f, -0.016250f, -0.033367f, 0.019786f, 0.008310f, 0.024316f, -0.002516f, -0.012024f, -0.014245f, -0.031152f, -0.015838f, -0.019439f, 0.048555f, 0.024995f, 0.004896f, 0.005945f, -0.033508f, -0.003226f, 0.003134f, 0.043754f, -0.004040f, 0.019617f, -0.017513f, -0.013166f, 0.008585f, -0.020080f, 0.011770f, 0.003988f, 0.012793f, 0.042714f, -0.004217f, 0.037336f, -0.000751f, 0.023510f, -0.019339f, 0.000315f, -0.028237f, -0.037893f, -0.038301f, -0.034204f, 0.011287f, 0.004542f, 0.003505f, -0.049666f, 0.024951f, -0.043290f, -0.003454f, 0.001271f, -0.024710f, -0.029476f, -0.012802f, -0.000119f, -0.047360f, -0.034576f, 0.035571f, -0.015349f, 0.035125f, 0.005107f, 0.029999f, -0.074171f, -0.179238f, -0.172072f, -0.028583f, 0.047901f, 0.167078f, 0.143649f, 0.135631f, 0.145455f, 0.080021f, 0.016702f, -0.077825f, -0.078828f, -0.159478f, -0.125193f, -0.109376f, -0.071194f, -0.087744f, 0.113803f, 0.094022f, 0.123482f, 0.070838f, 0.100231f, -0.006130f, 0.023697f, -0.018979f, -0.044208f, -0.025396f, -0.052178f, -0.058495f, -0.059913f, -0.057440f, -0.069373f, -0.049976f, -0.042844f, -0.006327f, 0.006408f, + 0.090294f, 0.073348f, 0.039027f, 0.039785f, 0.059154f, 0.052363f, 0.025669f, 0.127058f, 0.015692f, -0.002379f, 0.023380f, -0.053101f, -0.151508f, -0.047181f, -0.121483f, -0.133491f, -0.137336f, -0.100814f, -0.086533f, 0.000178f, 0.071231f, 0.068754f, 0.089146f, 0.157833f, 0.117093f, 0.138168f, 0.140754f, 0.085445f, 0.097694f, 0.029486f, -0.030681f, -0.111870f, -0.138810f, -0.165241f, -0.099287f, -0.146024f, -0.110967f, -0.133844f, -0.053083f, 0.030150f, 0.053929f, 0.036036f}, + {-0.001762f, -0.001927f, -0.005387f, -0.011765f, 0.000513f, -0.000946f, -0.008111f, 0.001718f, -0.000350f, -0.002172f, -0.002009f, 0.008071f, 0.007900f, 0.002005f, 0.011372f, -0.008689f, 0.008113f, 0.005199f, -0.007543f, 0.006350f, -0.014101f, -0.003699f, -0.022708f, -0.003347f, 0.004833f, -0.004680f, 0.003424f, 0.003284f, 0.001225f, -0.000676f, -0.002191f, -0.004385f, -0.001145f, 0.003789f, 0.004209f, 0.000485f, 0.005467f, -0.002181f, -0.004344f, 0.004546f, 0.005509f, 0.003640f, -0.009044f, -0.008412f, -0.005900f, -0.005315f, -0.005729f, 0.006423f, 0.004356f, -0.004930f, -0.008493f, -0.014221f, -0.001555f, -0.005097f, 0.003557f, 0.006529f, 0.001865f, -0.003169f, 0.000241f, 0.006130f, -0.005291f, 0.006801f, 0.000284f, -0.000893f, -0.016942f, -0.003569f, -0.006901f, -0.001780f, 0.008577f, -0.001167f, -0.004455f, -0.000708f, 0.007405f, -0.005220f, 0.000468f, 0.000620f, -0.008335f, 0.013709f, 0.004714f, -0.002633f, 0.003401f, 0.004325f, 0.008188f, 0.013722f, -0.006747f, 0.004475f, -0.005761f, -0.004529f, 0.002684f, -0.000098f, 0.001061f, -0.009906f, -0.004842f, 0.003312f, 0.006802f, -0.001057f, + 0.005719f, -0.010620f, -0.009386f, 0.005711f, 0.003656f, 0.001464f, 0.004174f, -0.003726f, 0.007425f, 0.008255f, 0.008075f, 0.011551f, -0.006574f, -0.005518f, 0.000336f, 0.001331f, -0.011303f, -0.000867f, -0.001055f, 0.002923f, 0.001023f, -0.007181f, -0.001811f, 0.009397f, -0.005188f, 0.001712f, -0.005940f, 0.002647f, 0.002869f, 0.001753f, -0.008812f, 0.006886f, 0.000555f, 0.001434f, -0.001295f, -0.003018f, -0.003716f, -0.006095f, 0.012559f, -0.002365f, -0.002441f, -0.002959f, 0.005508f, 0.001209f, -0.012096f, 0.002965f, -0.005602f, -0.008259f, 0.004705f, -0.005074f, -0.013113f, 0.005248f, 0.001754f, 0.000757f, -0.012033f, -0.014097f, -0.005361f, 0.008524f, 0.001387f, 0.001128f, 0.007625f, -0.010318f, 0.002219f, -0.008535f, -0.010941f, 0.003716f, 0.011067f, -0.006145f, 0.005469f, -0.004512f, -0.001988f, 0.002597f, 0.000939f, -0.004821f, -0.015260f, -0.015097f, 0.000677f, -0.003479f, 0.000252f, 0.008598f, 0.001694f, 0.010427f, 0.013844f, -0.006625f, 0.012005f, 0.001925f, 0.012174f, 0.001223f, 0.014371f, 0.002264f, -0.007468f, -0.001669f, 0.001148f, 0.006866f, -0.001372f, -0.001611f, + 0.001737f, 0.005338f, -0.005479f, 0.000150f, -0.001465f, 0.004790f, 0.005538f, 0.000802f, -0.004990f, 0.000144f, -0.000660f, 0.003589f, 0.005766f, 0.010349f, -0.003152f, 0.006910f, -0.002614f, -0.007994f, -0.007389f, -0.004601f, 0.005048f, 0.005808f, -0.002696f, 0.009063f, 0.000437f, 0.003663f, 0.000561f, 0.010909f, 0.006916f, 0.008192f, 0.003099f, 0.005050f, 0.002690f, 0.004678f, 0.008236f, -0.001437f, -0.000860f, 0.011141f, 0.011491f, -0.012848f, -0.008864f, -0.007342f, -0.010548f, 0.002635f, 0.003697f, -0.008517f, 0.001246f, 0.015969f, -0.012618f, 0.007869f, 0.013552f, 0.013573f, -0.009315f, -0.002821f, 0.006284f, 0.000897f, 0.001469f, -0.006724f, 0.002752f, -0.021769f, 0.016051f, 0.025884f, 0.003915f, 0.008472f, -0.005027f, -0.000722f, 0.013181f, -0.007686f, -0.017650f, -0.003139f, -0.000561f, -0.000370f, -0.014452f, 0.000705f, 0.002532f, -0.016473f, -0.008484f, 0.007239f, 0.001646f, -0.006013f, -0.002428f, 0.005371f, -0.008849f, 0.016538f, 0.004245f, 0.000573f, -0.011772f, -0.001246f, 0.004733f, -0.003816f, -0.000727f, -0.003985f, -0.001340f, -0.001725f, -0.009783f, 0.000437f, + -0.009546f, 0.012498f, -0.013412f, -0.008145f, -0.004040f, -0.014587f, 0.008374f, -0.007844f, -0.021704f, -0.003726f, -0.010263f, 0.002476f, 0.007697f, -0.009491f, -0.000534f, -0.006558f, 0.004814f, 0.000413f, -0.008281f, 0.000331f, 0.003129f, -0.008905f, 0.006548f, 0.000276f, -0.001344f, 0.007718f, -0.006279f, -0.023242f, -0.004161f, -0.000888f, 0.010886f, 0.015323f, 0.013526f, 0.006874f, -0.004666f, -0.001003f, -0.014234f, -0.011837f, 0.004736f, 0.017363f, -0.004367f, 0.017780f, 0.011328f, -0.009951f, 0.006094f, -0.000986f, 0.006341f, -0.011181f, -0.007604f, 0.002610f, 0.008908f, -0.000414f, 0.005442f, 0.007794f, -0.013045f, -0.002001f, -0.005856f, -0.017525f, 0.011628f, 0.002507f, 0.004396f, 0.008608f, 0.014710f, 0.005759f, 0.000921f, 0.012064f, -0.002428f, -0.005056f, 0.011853f, -0.005386f, 0.019870f, 0.009840f, 0.007979f, 0.001186f, -0.005549f, -0.006104f, 0.009741f, 0.013923f, -0.009702f, 0.003186f, 0.012543f, -0.001396f, 0.004047f, 0.028527f, -0.008443f, -0.002471f, 0.005262f, -0.012996f, -0.000728f, 0.003382f, -0.006398f, 0.007647f, -0.004713f, 0.005023f, 0.013581f, -0.004075f, + -0.000251f, 0.002365f, -0.005235f, -0.033339f, -0.001907f, 0.000009f, -0.005940f, -0.009866f, -0.002561f, 0.018978f, -0.012042f, -0.018737f, 0.008234f, -0.007240f, 0.003746f, 0.004071f, 0.013270f, -0.007783f, -0.001507f, 0.002985f, 0.012458f, -0.004796f, -0.006424f, -0.001724f, -0.005352f, 0.008906f, 0.016531f, 0.008223f, 0.001288f, -0.000833f, -0.007650f, -0.000116f, 0.025449f, 0.004651f, -0.001771f, 0.028366f, -0.000404f, 0.021156f, -0.004988f, 0.000458f, 0.015482f, 0.004549f, 0.004899f, 0.005265f, 0.003905f, 0.007959f, 0.006000f, -0.013165f, 0.026249f, 0.015125f, 0.021879f, 0.013664f, 0.010594f, -0.013542f, 0.007676f, 0.006829f, 0.002806f, -0.008426f, 0.024805f, 0.013703f, 0.022679f, 0.003418f, -0.002093f, -0.005479f, 0.017444f, -0.007922f, -0.013452f, 0.017951f, 0.008313f, -0.010962f, -0.003169f, -0.000077f, -0.001720f, 0.000446f, 0.001291f, 0.000529f, -0.001548f, -0.008331f, -0.000903f, -0.022052f, -0.008467f, -0.024716f, -0.016746f, 0.002100f, -0.015833f, -0.012533f, 0.001934f, -0.002629f, 0.017181f, -0.010934f, 0.019014f, 0.022939f, 0.002829f, -0.019181f, -0.013078f, 0.020581f, + -0.009841f, -0.005477f, 0.012028f, -0.014876f, -0.025999f, 0.010726f, 0.023547f, -0.011751f, 0.006491f, -0.000399f, 0.010661f, -0.027723f, 0.006210f, -0.011159f, 0.007408f, 0.000517f, -0.010899f, 0.019267f, 0.009600f, 0.008073f, 0.026537f, 0.011882f, 0.006141f, 0.014441f, 0.003773f, 0.004548f, 0.008234f, 0.002249f, 0.002091f, 0.003744f, 0.004469f, 0.029051f, 0.017479f, -0.000375f, 0.025631f, 0.015064f, 0.019233f, 0.028009f, -0.013398f, -0.012554f, 0.026042f, -0.009149f, 0.000267f, -0.015299f, -0.004964f, 0.008266f, 0.014560f, -0.011894f, 0.000125f, 0.003044f, -0.001621f, 0.006074f, -0.010195f, -0.003115f, -0.011801f, 0.025728f, -0.006064f, 0.012561f, 0.008515f, -0.009010f, 0.002950f, 0.001360f, 0.002918f, -0.012948f, 0.016931f, 0.009884f, 0.022988f, 0.004523f, -0.003110f, -0.025857f, -0.013871f, -0.009639f, 0.006605f, -0.013386f, -0.022482f, -0.006164f, 0.005718f, 0.002594f, -0.025126f, 0.020452f, 0.001505f, -0.001424f, -0.021435f, -0.012186f, 0.004951f, 0.002737f, -0.023835f, -0.007277f, 0.008554f, 0.001064f, 0.002258f, 0.012267f, 0.014057f, 0.008403f, -0.003848f, 0.007261f, + 0.002021f, -0.008422f, -0.017784f, 0.030352f, -0.007842f, -0.014662f, 0.000018f, 0.007577f, 0.009481f, 0.022685f, 0.003386f, -0.000371f, -0.008876f, -0.000233f, 0.012138f, -0.001591f, 0.015224f, 0.030015f, 0.002018f, -0.006589f, 0.000346f, 0.025750f, 0.031726f, -0.016310f, 0.003808f, 0.004256f, 0.016697f, 0.008879f, 0.002181f, 0.004870f, -0.013919f, 0.007314f, 0.007144f, 0.007311f, -0.006986f, -0.001063f, 0.004623f, 0.007000f, -0.007481f, 0.012867f, -0.009679f, -0.018295f, 0.014278f, -0.000583f, -0.003765f, 0.006069f, 0.012277f, -0.031320f, 0.002899f, 0.025797f, -0.001974f, 0.045609f, 0.022201f, -0.012567f, -0.009103f, -0.003119f, -0.011996f, -0.004647f, 0.020777f, -0.006569f, -0.005660f, 0.021050f, 0.017050f, 0.006467f, 0.010138f, 0.019781f, 0.013185f, 0.015108f, -0.009383f, -0.005814f, 0.018535f, -0.002279f, 0.016852f, 0.001324f, -0.018312f, -0.011059f, 0.005999f, 0.016394f, -0.019999f, 0.002596f, -0.010302f, 0.007154f, -0.011892f, 0.019045f, 0.018446f, -0.015832f, -0.001028f, 0.006459f, 0.000247f, -0.021822f, -0.009634f, 0.005506f, 0.016255f, 0.026973f, 0.009459f, -0.017213f, + -0.003325f, -0.002906f, -0.001365f, 0.017727f, 0.003407f, 0.014629f, -0.018358f, 0.010556f, 0.002257f, -0.013255f, 0.019093f, 0.009820f, -0.001332f, -0.001776f, 0.004401f, 0.001755f, -0.013984f, 0.021594f, -0.024441f, -0.003093f, -0.007119f, 0.027008f, -0.010629f, 0.022400f, -0.005664f, 0.020955f, 0.028248f, -0.011173f, 0.009652f, -0.006054f, 0.016582f, -0.005041f, 0.014007f, 0.011536f, 0.011219f, -0.001501f, 0.011760f, -0.004566f, -0.012325f, -0.005709f, 0.016247f, -0.016873f, 0.003991f, 0.000668f, 0.014641f, 0.027881f, -0.023623f, 0.001564f, 0.025613f, 0.000071f, 0.023545f, 0.003684f, 0.011086f, -0.002454f, -0.000566f, 0.006603f, -0.033001f, 0.003950f, 0.000543f, -0.013127f, 0.010479f, 0.006133f, 0.026343f, 0.012880f, -0.001035f, 0.047781f, 0.013264f, -0.024544f, 0.008097f, 0.002758f, 0.018059f, -0.010433f, 0.004734f, 0.014237f, 0.002696f, 0.008721f, -0.000854f, -0.027099f, -0.026233f, 0.000127f, -0.007710f, 0.022403f, -0.036146f, 0.048630f, 0.001566f, 0.026859f, 0.032999f, 0.006952f, -0.006152f, -0.007076f, -0.012304f, -0.020872f, 0.001039f, 0.002874f, -0.045001f, -0.003065f, + 0.015437f, 0.002678f, -0.016880f, -0.041719f, 0.000023f, 0.004979f, -0.007325f, -0.001535f, -0.012333f, 0.006735f, -0.010285f, 0.021845f, 0.007581f, -0.012563f, -0.016125f, -0.027213f, 0.020554f, -0.008433f, 0.001331f, 0.027224f, 0.036820f, 0.022918f, -0.003534f, 0.002381f, -0.025432f, -0.010342f, -0.010309f, 0.007319f, -0.036055f, 0.009944f, 0.009664f, 0.002655f, -0.018621f, 0.018372f, 0.027415f, -0.003759f, -0.000650f, 0.003950f, -0.016175f, -0.016136f, 0.009566f, 0.007505f, 0.020688f, -0.022037f, 0.024721f, -0.012151f, 0.013558f, -0.020207f, -0.016910f, -0.007300f, -0.000678f, -0.001337f, 0.008974f, -0.003313f, -0.037202f, -0.026473f, -0.007875f, 0.002468f, -0.037205f, 0.002130f, 0.018498f, -0.008085f, -0.004113f, 0.007598f, 0.015983f, -0.030556f, 0.017261f, -0.003251f, -0.004102f, 0.002803f, 0.014693f, 0.020417f, -0.017415f, -0.004754f, -0.007677f, 0.040086f, 0.000562f, -0.008635f, 0.031076f, -0.007296f, -0.013244f, -0.003799f, -0.003334f, 0.038662f, 0.044239f, -0.006224f, 0.009057f, 0.010981f, -0.006165f, -0.021625f, 0.009979f, 0.041137f, 0.031214f, 0.026685f, -0.010325f, 0.011328f, + 0.021813f, -0.029379f, -0.022076f, 0.024865f, -0.013429f, -0.014607f, -0.001510f, 0.031175f, -0.005311f, 0.028651f, 0.001348f, 0.025651f, -0.016218f, 0.035407f, 0.010324f, -0.011634f, -0.018921f, 0.006036f, -0.026532f, 0.002572f, -0.031383f, -0.011049f, -0.011688f, 0.017005f, -0.018279f, 0.028369f, -0.036188f, -0.062064f, 0.037660f, 0.016473f, -0.008270f, -0.000423f, 0.041589f, 0.019074f, 0.002621f, -0.011970f, 0.008403f, -0.005861f, -0.000222f, -0.028520f, -0.028607f, 0.015309f, -0.010023f, 0.007844f, 0.051977f, -0.015120f, 0.010879f, -0.035852f, 0.040428f, -0.015354f, -0.017865f, -0.010736f, -0.004519f, 0.014530f, -0.031106f, 0.025298f, -0.045925f, -0.034092f, -0.033078f, 0.046489f, 0.001652f, 0.020056f, 0.011937f, -0.040635f, -0.035614f, 0.024198f, -0.063612f, 0.018827f, 0.018967f, -0.003853f, -0.025291f, -0.023042f, 0.039709f, -0.021054f, -0.002774f, -0.006367f, -0.020541f, 0.030504f, 0.009624f, 0.027656f, 0.015886f, 0.019219f, -0.005969f, 0.031066f, -0.002824f, -0.019600f, -0.023613f, -0.004954f, 0.013292f, -0.017379f, 0.023787f, 0.015838f, -0.017963f, -0.063870f, -0.005437f, -0.004654f, + -0.001622f, 0.047536f, 0.001033f, -0.035948f, -0.021803f, -0.021635f, 0.019199f, -0.013278f, -0.030598f, -0.033168f, -0.021263f, -0.015573f, -0.076072f, 0.002917f, 0.009417f, 0.026161f, -0.039787f, 0.014292f, -0.032907f, -0.025435f, -0.009314f, 0.033322f, 0.007968f, 0.031191f, 0.055491f, 0.018635f, 0.012498f, 0.038410f, -0.028715f, -0.001282f, -0.014010f, -0.012897f, 0.028285f, 0.029929f, 0.041493f, 0.024314f, 0.024584f, -0.017565f, -0.039578f, 0.014262f, 0.002116f, 0.001809f, 0.004300f, 0.008505f, 0.011737f, 0.021142f, 0.008820f, 0.018194f, 0.011413f, 0.021069f, 0.050774f, 0.004142f, -0.059607f, -0.020350f, 0.018721f, 0.003141f, -0.010071f, -0.037632f, -0.023490f, 0.010967f, 0.035544f, 0.015128f, -0.028083f, 0.019167f, 0.016285f, -0.032672f, -0.003522f, -0.040993f, 0.037338f, -0.015602f, -0.019472f, 0.034091f, -0.027271f, 0.011093f, 0.069106f, -0.005144f, 0.014129f, 0.022002f, 0.003384f, 0.012198f, -0.034952f, 0.012029f, 0.010491f, 0.008931f, 0.090182f, 0.061234f, -0.002539f, -0.027342f, -0.015902f, 0.030010f, 0.035692f, -0.031687f, -0.014936f, -0.043435f, 0.078299f, 0.023473f, + 0.013324f, -0.008599f, -0.002992f, -0.012998f, -0.003739f, 0.056695f, -0.008433f, 0.018285f, 0.059219f, 0.013202f, -0.008048f, -0.034504f, 0.008827f, 0.021322f, -0.069758f, 0.024177f, 0.021803f, 0.056265f, -0.010875f, -0.050386f, -0.007120f, 0.034995f, 0.019637f, -0.056441f, -0.074550f, 0.008778f, 0.050737f, 0.020690f, 0.031016f, -0.017392f, 0.023946f, 0.004225f, 0.000647f, -0.026873f, -0.009706f, -0.041967f, 0.062625f, 0.021226f, -0.050938f, -0.034681f, 0.022683f, 0.002641f, 0.012432f, -0.015010f, 0.031105f, 0.018472f, 0.021331f, 0.041220f, 0.036111f, 0.007680f, 0.035262f, -0.018519f, 0.020092f, 0.000062f, 0.024444f, 0.011528f, -0.006346f, -0.014828f, 0.016669f, -0.022106f, 0.057964f, -0.015658f, -0.011607f, 0.011995f, 0.028287f, 0.028531f, -0.020035f, 0.050250f, 0.049153f, 0.028844f, 0.011248f, 0.003921f, -0.016964f, -0.038296f, -0.065889f, -0.011042f, 0.021976f, -0.002054f, 0.027032f, 0.029928f, 0.031670f, 0.010391f, 0.016928f, 0.106322f, -0.054587f, -0.025024f, 0.008908f, 0.018299f, -0.004671f, -0.087634f, 0.017622f, -0.018310f, 0.010389f, 0.005850f, 0.035233f, -0.009863f, + -0.017006f, 0.005916f, 0.027864f, 0.027318f, -0.015635f, -0.021308f, 0.005887f, -0.020530f, -0.064409f, 0.065733f, -0.019622f, 0.018041f, 0.005874f, 0.054957f, 0.044067f, 0.027173f, -0.026774f, -0.005124f, 0.037773f, 0.019383f, 0.044500f, 0.118443f, -0.007653f, -0.047950f, -0.012535f, 0.034672f, -0.005619f, -0.056614f, 0.084554f, 0.042824f, -0.030262f, -0.047743f, -0.006105f, 0.009091f, -0.015186f, 0.032270f, 0.028190f, 0.031525f, 0.062851f, 0.008937f, 0.017331f, 0.009521f, -0.025183f, -0.060927f, 0.033949f, -0.042242f, -0.030974f, 0.044266f, 0.023459f, 0.023776f, 0.012701f, 0.006888f, -0.003907f, -0.061187f, -0.053128f, -0.002268f, 0.029262f, -0.042058f, 0.034535f, -0.021015f, -0.045460f, 0.009237f, 0.035194f, -0.011926f, 0.004061f, 0.032042f, 0.033152f, 0.032057f, -0.002042f, -0.031095f, 0.015717f, 0.082213f, 0.002704f, 0.025100f, 0.039976f, -0.017148f, -0.041635f, 0.033608f, 0.027706f, 0.000711f, -0.021978f, -0.032695f, -0.057523f, 0.010228f, 0.035682f, 0.048374f, -0.040961f, -0.044129f, 0.054244f, 0.024010f, -0.001759f, -0.005725f, -0.021964f, 0.009967f, -0.009978f, -0.023705f, + 0.025226f, 0.029744f, 0.021407f, 0.001550f, -0.003801f, -0.017377f, 0.004266f, 0.012102f, 0.008358f, -0.019673f, -0.066585f, 0.014348f, -0.014511f, -0.020943f, 0.004603f, -0.009506f, 0.006566f, -0.067964f, 0.032269f, 0.023600f, -0.047262f, 0.032815f, 0.046026f, 0.036501f, -0.008878f, 0.005149f, -0.004721f, 0.023264f, -0.004163f, -0.001465f, 0.121422f, -0.037447f, 0.011553f, -0.033694f, -0.016974f, 0.066083f, 0.026607f, 0.021344f, 0.045300f, -0.057106f, -0.043538f, 0.065989f, -0.040804f, 0.032431f, 0.045532f, 0.001526f, 0.014256f, 0.013458f, 0.080353f, -0.029592f, -0.026050f, -0.074836f, -0.011260f, -0.035391f, 0.028548f, -0.050933f, 0.080354f, 0.030502f, 0.044121f, -0.018299f, 0.050628f, -0.027716f, 0.027241f, 0.085347f, 0.042872f, 0.032937f, -0.046139f, 0.014317f, 0.047937f, -0.039088f, 0.067442f, 0.024861f, 0.036510f, 0.032860f, -0.019532f, 0.033993f, 0.029300f, 0.012960f, 0.066769f, 0.050941f, -0.002961f, -0.111808f, -0.012431f, 0.053343f, 0.051304f, 0.052881f, 0.013165f, 0.029900f, 0.003229f, 0.015471f, -0.003125f, -0.034088f, 0.072777f, -0.001082f, 0.069307f, 0.031759f, + 0.050085f, -0.068747f, 0.047484f, 0.024157f, 0.021484f, -0.017594f, 0.016558f, -0.012385f, 0.015713f, 0.069649f, 0.027552f, 0.090657f, 0.004320f, 0.020305f, 0.052453f, -0.010381f, 0.082448f, 0.041032f, 0.006658f, -0.054799f, -0.035125f, 0.030216f, 0.002434f, -0.009260f, 0.000499f, -0.009578f, 0.004860f, -0.040300f, 0.024685f, -0.042970f, -0.065983f, -0.024165f, -0.006770f, -0.021576f, -0.020470f, 0.053562f, -0.011864f, 0.049384f, -0.054206f, 0.055327f, -0.002993f, -0.017411f, -0.052090f, -0.050011f, -0.021074f, -0.022819f, 0.037282f, -0.065022f, -0.080046f, -0.087431f, -0.104554f, 0.043841f, 0.049090f, -0.005205f, -0.009695f, -0.002652f, -0.025847f, 0.003569f, 0.011532f, -0.024195f, 0.068936f, 0.063525f, 0.042036f, 0.044648f, -0.044590f, 0.026233f, 0.001387f, 0.031680f, -0.014504f, -0.020581f, -0.065199f, 0.054653f, -0.058923f, -0.073416f, -0.019213f, -0.017861f, 0.074951f, -0.044676f, 0.009612f, -0.042429f, -0.011429f, 0.069565f, 0.013140f, 0.019668f, 0.035796f, 0.063453f, 0.003930f, -0.011048f, -0.081846f, -0.018727f, -0.006533f, -0.006043f, 0.044936f, 0.020282f, 0.152519f, 0.003744f, + -0.004301f, -0.054455f, -0.003498f, 0.056501f, 0.056259f, -0.009086f, -0.025812f, -0.079350f, 0.019996f, 0.043483f, -0.022878f, -0.058971f, -0.021313f, 0.042926f, -0.011822f, 0.030675f, -0.105599f, -0.064288f, -0.082196f, -0.025851f, 0.043293f, 0.018570f, -0.007635f, -0.025647f, -0.010942f, 0.078835f, 0.007315f, 0.005182f, 0.136005f, 0.017702f, -0.092148f, -0.069858f, 0.096887f, 0.086265f, 0.010177f, -0.060032f, -0.075312f, -0.041464f, 0.021083f, 0.083951f, 0.075839f, 0.051957f, -0.023723f, 0.013897f, -0.023830f, 0.030453f, 0.065397f, 0.097347f, 0.106654f, -0.008200f, -0.048824f, -0.081125f, -0.122577f, 0.003096f, 0.073644f, 0.281563f, -0.030749f, -0.010449f, -0.128468f, -0.051115f, 0.016803f, 0.036247f, 0.170486f, 0.123233f, 0.079069f, -0.079678f, -0.041943f, -0.077814f, 0.000587f, 0.142214f, 0.133214f, 0.159714f, -0.037573f, -0.149470f, -0.106260f, -0.151043f, 0.044089f, 0.145785f, 0.130158f, 0.233931f, -0.104833f, -0.130350f, -0.112254f, -0.016247f, 0.106787f, 0.138935f, 0.194570f, 0.088877f, -0.035436f, -0.071231f, 0.021602f, -0.003354f, 0.057618f, 0.153737f, -0.030612f, 0.095562f, + -0.032247f, -0.087158f, -0.010738f, -0.066484f, 0.089711f, -0.019237f, 0.105623f, -0.095035f, 0.001805f, -0.040571f, -0.099684f, 0.075053f, -0.052230f, 0.069736f, -0.053559f, -0.018778f, -0.004731f, 0.037066f, 0.007751f, -0.036172f, -0.020699f, 0.000717f, 0.053950f, -0.047955f, 0.061787f, 0.047346f, -0.034617f, 0.010598f, -0.043454f, -0.039949f, 0.071559f, -0.068475f, -0.037230f, 0.051409f, 0.109486f, 0.002596f, 0.013483f, -0.006618f, -0.050230f, -0.009864f, 0.043326f, -0.011808f, -0.075328f, 0.014397f, -0.018346f, -0.008181f, 0.019516f, -0.062358f, 0.030812f, 0.004375f, 0.019962f, 0.056223f, -0.119724f, -0.081164f, -0.032219f, 0.002563f, 0.115806f, -0.058169f, 0.039059f, 0.099783f, -0.056457f, -0.024750f, -0.008465f, 0.057139f, 0.068736f, -0.034414f, 0.015232f, -0.008469f, 0.022499f, 0.122684f, -0.050859f, -0.123759f, 0.018965f, 0.066885f, 0.005386f, -0.062929f, 0.031543f, 0.024327f, 0.028057f, -0.020149f, -0.015232f, -0.141170f, -0.048980f, 0.051614f, 0.073156f, 0.059504f, -0.073391f, 0.015084f, -0.193921f, -0.128563f, -0.109844f, -0.022979f, 0.081895f, 0.050088f, -0.009977f, -0.047828f, + -0.056986f, 0.018321f, -0.037168f, -0.009803f, 0.061298f, 0.011661f, -0.002764f, -0.073288f, -0.037942f, -0.013529f, -0.037374f, 0.013550f, -0.011382f, 0.029252f, -0.015254f, -0.007266f, -0.017584f, -0.009106f, -0.014322f, -0.045034f, -0.034461f, -0.070889f, -0.050699f, 0.025436f, 0.056846f, 0.060816f, 0.032301f, 0.051990f, -0.014531f, 0.043060f, -0.017246f, -0.030579f, -0.085078f, -0.010655f, -0.049363f, 0.026400f, 0.007757f, 0.092917f, -0.086597f, 0.020882f, 0.051323f, -0.039346f, -0.048337f, -0.033526f, -0.025180f, -0.029426f, 0.002374f, 0.062430f, 0.041159f, -0.028724f, -0.007411f, 0.041021f, -0.064078f, -0.077099f, 0.022620f, -0.089354f, -0.063185f, -0.067424f, 0.057336f, -0.003188f, -0.146400f, -0.223790f, -0.277248f, -0.216835f, -0.329274f, -0.047263f, -0.110757f, 0.051449f, 0.087256f, 0.262190f, 0.160599f, 0.270919f, 0.277590f, 0.371841f, 0.277528f, 0.278966f, 0.211799f, 0.020683f, -0.041244f, -0.091972f, -0.048201f, -0.202785f, -0.130760f, -0.105339f, -0.103401f, -0.106965f, -0.101840f, -0.103609f, -0.107350f, -0.125035f, -0.084832f, -0.147463f, -0.112600f, -0.102629f, -0.034177f, -0.123184f, + -0.024647f, 0.057338f, -0.082081f, -0.039387f, 0.042676f, 0.029103f, -0.067069f, 0.076234f, 0.105255f, 0.119018f, 0.169131f, 0.160947f, 0.003583f, 0.096875f, 0.166117f, 0.216882f, 0.183656f, 0.338509f, 0.330937f, 0.279630f, 0.240516f, 0.285089f, 0.155764f, 0.224532f, 0.290178f, 0.207591f, 0.147975f, 0.222268f, 0.084655f, 0.063842f, 0.149252f, 0.122812f, 0.104368f, 0.000607f, 0.079515f, -0.070202f, -0.010326f, 0.003784f, -0.133341f, -0.321848f, -0.259567f, -0.181902f} + } +}; +const float CRendBin_Combined_BRIR_coeff_im_16kHz[15][BINAURAL_CHANNELS][1774]={ + { + {-0.005305f, -0.009306f, -0.004660f, 0.000333f, -0.002579f, 0.006024f, -0.007170f, -0.011927f, -0.010003f, 0.001646f, 0.000000f, -0.003347f, 0.004923f, -0.000346f, 0.005562f, -0.007755f, -0.006056f, 0.001699f, -0.000024f, -0.001048f, -0.006565f, 0.001634f, 0.001073f, 0.001625f, 0.006711f, 0.004247f, -0.000942f, 0.002216f, 0.002039f, 0.002592f, -0.001572f, 0.000352f, 0.008799f, 0.005499f, 0.002320f, -0.004538f, -0.002513f, -0.001091f, -0.002906f, -0.003718f, 0.007095f, 0.002758f, 0.002912f, -0.000917f, 0.001438f, 0.000680f, 0.001594f, 0.001458f, 0.000755f, 0.004720f, -0.005079f, -0.003379f, -0.000617f, -0.000728f, -0.006900f, -0.003016f, -0.008830f, -0.005266f, 0.001599f, 0.002809f, -0.002623f, -0.007413f, -0.002008f, 0.002161f, -0.000588f, 0.004980f, 0.000251f, -0.001006f, 0.014358f, -0.007133f, -0.005107f, -0.001288f, 0.002992f, 0.001899f, -0.008580f, 0.002506f, -0.000384f, 0.009348f, 0.005239f, -0.006985f, 0.010292f, -0.006208f, -0.001592f, -0.000268f, -0.002990f, -0.004227f, -0.007273f, 0.001414f, 0.012032f, 0.000768f, 0.002481f, 0.004517f, 0.001594f, -0.004558f, -0.000890f, -0.002887f, + -0.002081f, 0.006618f, 0.002331f, 0.000488f, -0.002010f, 0.000860f, 0.000102f, -0.003126f, -0.003996f, 0.006386f, 0.005656f, 0.000522f, -0.001058f, 0.007469f, -0.010634f, -0.004575f, 0.005100f, -0.005042f, 0.009901f, 0.000496f, 0.007110f, 0.000379f, 0.001184f, 0.003849f, -0.003391f, -0.002083f, 0.000286f, -0.000615f, -0.002547f, -0.002893f, 0.004619f, -0.000739f, -0.009742f, 0.009004f, -0.000900f, 0.001068f, -0.008145f, 0.003512f, -0.003345f, 0.002791f, 0.000734f, -0.000911f, -0.002741f, -0.000975f, -0.004465f, 0.004456f, -0.009138f, -0.001810f, 0.007623f, -0.006373f, 0.003222f, 0.009701f, 0.003836f, 0.000101f, -0.004582f, -0.000605f, 0.003482f, 0.020249f, 0.003864f, -0.002974f, 0.006315f, -0.003212f, -0.002466f, -0.003407f, -0.001256f, -0.007804f, 0.010881f, 0.006083f, 0.004719f, 0.004849f, 0.004820f, -0.005210f, -0.006736f, 0.008905f, -0.001946f, -0.007287f, -0.013457f, 0.001973f, -0.003996f, 0.003980f, 0.000062f, -0.001399f, -0.003048f, 0.003965f, -0.005034f, -0.002804f, 0.006592f, 0.012338f, 0.003219f, 0.005436f, 0.001009f, 0.006026f, -0.001417f, 0.006416f, 0.004151f, 0.000402f, + 0.003652f, -0.000043f, 0.000966f, -0.000049f, 0.009074f, 0.001539f, 0.002252f, -0.002523f, 0.001172f, -0.001113f, -0.001507f, 0.007012f, 0.008344f, -0.003592f, -0.003415f, 0.001194f, 0.007615f, -0.013416f, -0.000980f, -0.004089f, -0.009846f, -0.004507f, 0.000956f, -0.004735f, 0.003825f, 0.002697f, -0.000164f, -0.006589f, 0.002199f, -0.002097f, -0.006114f, 0.006163f, -0.010479f, -0.005726f, -0.011270f, -0.006460f, -0.002545f, -0.000132f, 0.005432f, 0.003435f, -0.013124f, -0.000439f, 0.001115f, 0.009554f, -0.003381f, -0.014648f, 0.011671f, -0.013798f, 0.000047f, -0.005602f, -0.005764f, -0.014669f, -0.010977f, -0.005257f, -0.004620f, 0.007113f, 0.001418f, -0.009385f, 0.000703f, -0.004655f, -0.000661f, 0.000426f, 0.003439f, 0.001646f, -0.005183f, 0.001524f, 0.000330f, 0.003301f, -0.003896f, -0.001352f, -0.001709f, -0.004200f, -0.008409f, 0.011168f, 0.004004f, 0.002247f, -0.002223f, 0.009661f, 0.006799f, -0.007813f, 0.001606f, 0.001715f, -0.002498f, -0.004159f, 0.000288f, -0.008054f, 0.001136f, -0.000769f, -0.008233f, 0.010010f, -0.000776f, 0.000279f, 0.010371f, -0.008835f, 0.007918f, 0.004331f, + -0.002361f, -0.006221f, 0.001034f, 0.000058f, -0.008854f, -0.005268f, -0.001160f, -0.001602f, -0.004772f, -0.009380f, -0.000936f, 0.003626f, 0.003404f, -0.001648f, 0.002822f, 0.002977f, -0.004078f, 0.000227f, -0.009090f, -0.022975f, -0.021564f, 0.008266f, 0.014403f, 0.008532f, -0.019453f, 0.013727f, -0.004684f, -0.001960f, 0.001245f, -0.009238f, -0.006861f, 0.016166f, -0.000249f, -0.000271f, 0.001207f, -0.000655f, 0.005294f, -0.008438f, 0.004876f, -0.004627f, 0.004344f, 0.007170f, -0.005085f, -0.001705f, 0.004215f, -0.001632f, 0.007671f, -0.002847f, 0.003228f, 0.000242f, -0.000989f, 0.000189f, -0.006882f, -0.009770f, 0.008519f, 0.000614f, -0.001946f, -0.000489f, -0.008977f, -0.011422f, -0.000612f, -0.000433f, 0.005298f, -0.010741f, -0.008940f, -0.002559f, -0.018269f, 0.006160f, -0.001840f, 0.002814f, -0.001840f, -0.005193f, 0.002228f, 0.021943f, 0.012161f, 0.005619f, -0.007459f, 0.007917f, -0.000753f, -0.012960f, -0.000676f, -0.013580f, 0.009651f, 0.000009f, 0.000371f, -0.008570f, -0.000891f, 0.005382f, 0.001539f, -0.000556f, -0.000329f, -0.001486f, 0.006251f, 0.002631f, -0.000691f, 0.001764f, + -0.033100f, -0.002240f, -0.008153f, -0.000885f, -0.005737f, -0.018366f, -0.001037f, -0.004742f, -0.007919f, -0.017196f, -0.002387f, 0.012675f, -0.008894f, 0.008433f, -0.001665f, 0.011778f, -0.004110f, 0.009623f, -0.003286f, -0.008976f, -0.002682f, 0.001273f, -0.004249f, -0.008042f, -0.006866f, -0.007901f, 0.000095f, -0.007186f, 0.002561f, 0.001158f, 0.000599f, 0.003806f, -0.005749f, -0.007246f, 0.010728f, -0.000719f, 0.003111f, 0.000380f, -0.008608f, -0.005139f, -0.006086f, 0.000553f, -0.004370f, 0.007820f, 0.007657f, 0.001521f, -0.010442f, -0.003174f, 0.019210f, 0.005014f, -0.008072f, -0.006227f, -0.004032f, -0.006892f, -0.003645f, 0.015209f, 0.009282f, -0.010682f, 0.006866f, 0.009037f, 0.013318f, -0.003189f, 0.005633f, -0.000637f, 0.000519f, -0.005137f, -0.010374f, -0.001836f, 0.008638f, 0.000939f, 0.016306f, 0.011117f, 0.001715f, 0.003681f, 0.014384f, -0.010370f, 0.042281f, 0.028049f, -0.008539f, -0.001817f, 0.000248f, -0.001401f, -0.004694f, 0.005601f, 0.014508f, 0.011864f, 0.006393f, -0.022410f, -0.009763f, 0.002489f, 0.001311f, 0.009009f, -0.016619f, 0.002959f, 0.022521f, 0.014744f, + -0.002631f, 0.004951f, -0.002048f, -0.008092f, -0.010485f, 0.000070f, -0.008973f, -0.005706f, 0.002448f, 0.006430f, -0.006662f, -0.012688f, -0.005944f, 0.001446f, 0.010873f, 0.014835f, -0.003208f, -0.017095f, -0.003756f, -0.006601f, -0.016768f, -0.001770f, -0.000850f, -0.008716f, 0.002334f, 0.003567f, 0.009190f, -0.014709f, 0.005174f, 0.006151f, 0.001047f, -0.014362f, -0.010461f, 0.003465f, -0.000015f, 0.002317f, -0.002107f, -0.002527f, -0.001175f, -0.008702f, 0.002866f, 0.002458f, -0.006023f, 0.007742f, 0.010004f, 0.013322f, 0.002531f, -0.000711f, 0.012899f, 0.020944f, 0.002252f, 0.000754f, 0.002173f, 0.010603f, -0.000839f, 0.004005f, 0.018296f, 0.021401f, 0.001222f, 0.003842f, 0.006098f, 0.009888f, -0.003478f, 0.005986f, -0.005092f, -0.004511f, -0.017609f, 0.006425f, 0.013092f, -0.012173f, 0.010062f, -0.005575f, -0.015420f, 0.015734f, 0.010437f, -0.003911f, 0.010521f, 0.018542f, 0.014179f, -0.011051f, -0.005134f, 0.008823f, 0.003568f, -0.003254f, 0.008003f, 0.005893f, 0.010532f, -0.000437f, -0.004071f, -0.009802f, -0.015118f, -0.001635f, -0.012529f, 0.000426f, -0.003920f, 0.005985f, + -0.009983f, -0.024661f, 0.005332f, -0.007052f, 0.010951f, 0.001466f, 0.000924f, -0.007785f, -0.013799f, -0.012920f, -0.001135f, -0.002546f, -0.010527f, 0.013279f, 0.018808f, 0.018276f, 0.007709f, -0.015589f, -0.001591f, 0.017156f, 0.001346f, -0.004788f, 0.008127f, -0.004063f, -0.005410f, -0.019407f, 0.008904f, 0.003392f, 0.024643f, 0.010058f, -0.018734f, 0.003957f, 0.005009f, -0.003848f, -0.002202f, 0.004148f, -0.006422f, -0.007485f, -0.010735f, -0.003746f, -0.002272f, -0.020338f, 0.001606f, 0.001711f, 0.010445f, -0.004431f, -0.007872f, 0.002799f, 0.001656f, 0.003908f, 0.000723f, 0.009920f, 0.004844f, 0.006602f, 0.001800f, -0.001611f, 0.006873f, 0.002910f, -0.018838f, -0.006799f, -0.027165f, 0.000416f, -0.004677f, 0.002342f, 0.005367f, -0.000503f, 0.013667f, 0.002471f, 0.019304f, 0.001405f, -0.022034f, -0.000481f, -0.008643f, -0.004676f, -0.000702f, -0.004357f, -0.000814f, -0.018811f, 0.004187f, -0.009616f, 0.021720f, -0.023336f, 0.012603f, -0.005960f, -0.018785f, -0.004724f, -0.013179f, -0.004094f, -0.003922f, -0.021497f, 0.005909f, 0.004857f, -0.003648f, -0.004760f, -0.001288f, 0.005654f, + -0.016121f, -0.001202f, 0.014940f, 0.001040f, 0.020756f, 0.032312f, 0.013852f, -0.033124f, -0.041756f, 0.017639f, 0.008483f, 0.028039f, -0.007037f, 0.011286f, 0.002398f, 0.009894f, 0.019795f, 0.017751f, -0.037638f, 0.028082f, 0.005472f, -0.005171f, -0.000251f, -0.017294f, -0.013719f, 0.014641f, -0.003595f, -0.004908f, 0.015713f, -0.011455f, -0.011812f, 0.000636f, 0.015699f, 0.006458f, -0.004394f, 0.000457f, -0.008153f, -0.001144f, 0.001799f, 0.008216f, 0.001003f, -0.019277f, -0.018556f, 0.004428f, -0.001848f, 0.004761f, -0.001150f, 0.007878f, 0.015774f, 0.028048f, 0.000433f, 0.017482f, -0.003335f, 0.005089f, 0.012901f, -0.011379f, 0.023799f, -0.003033f, -0.013055f, -0.019733f, -0.002663f, -0.016311f, -0.019691f, -0.005501f, 0.010937f, -0.006164f, -0.014873f, 0.008431f, 0.013040f, 0.018428f, 0.024932f, -0.018731f, 0.008921f, -0.004966f, -0.015778f, 0.006935f, -0.017722f, -0.003245f, -0.029992f, 0.013152f, -0.007372f, 0.005105f, -0.003405f, 0.005400f, -0.031849f, -0.033980f, -0.017996f, -0.007749f, 0.022193f, -0.018196f, 0.039710f, -0.012527f, 0.007706f, -0.003159f, -0.003854f, 0.030651f, + 0.003190f, 0.010752f, 0.009749f, 0.002054f, 0.019967f, 0.001259f, -0.024761f, 0.011263f, 0.005079f, 0.010698f, 0.000152f, -0.020629f, 0.028988f, 0.013648f, 0.012697f, -0.003919f, -0.007045f, 0.002257f, -0.000674f, -0.016629f, 0.011273f, 0.005630f, -0.007183f, 0.009812f, 0.018941f, -0.000833f, 0.007972f, 0.016215f, -0.017723f, 0.003276f, -0.005077f, 0.006560f, -0.034522f, 0.009655f, 0.018609f, -0.007328f, 0.005941f, 0.015997f, 0.010592f, -0.001026f, 0.007057f, -0.019262f, 0.005961f, -0.011876f, 0.002140f, 0.003896f, 0.004175f, -0.009511f, 0.035685f, -0.007498f, -0.005198f, -0.009362f, -0.028667f, -0.013511f, -0.017070f, -0.022645f, -0.002816f, 0.028163f, 0.033688f, -0.004595f, 0.011260f, 0.011540f, -0.025866f, -0.010232f, 0.023190f, 0.016642f, -0.009620f, -0.009210f, -0.025599f, -0.010404f, -0.009101f, -0.014758f, -0.014162f, 0.001938f, -0.025678f, 0.007759f, -0.003203f, -0.009721f, 0.006045f, 0.002079f, -0.013618f, -0.019414f, -0.021535f, -0.008044f, -0.021025f, -0.008156f, -0.008583f, 0.000897f, -0.019942f, 0.005050f, 0.008314f, 0.001572f, -0.022682f, 0.007742f, -0.028100f, 0.009425f, + 0.015766f, 0.001224f, 0.024506f, 0.001562f, -0.007122f, -0.003588f, 0.016637f, -0.005008f, 0.022870f, 0.009027f, -0.007583f, -0.006752f, 0.004285f, -0.010486f, -0.005903f, 0.001974f, 0.021799f, 0.000457f, 0.011740f, 0.007675f, 0.002401f, 0.016326f, -0.006243f, -0.012428f, 0.006650f, -0.008454f, -0.004001f, -0.025443f, 0.015788f, -0.007909f, -0.007299f, -0.003834f, -0.028987f, 0.037214f, 0.009947f, -0.002447f, 0.016235f, 0.006935f, 0.008326f, -0.013750f, -0.022822f, -0.024812f, -0.012165f, 0.003608f, -0.026372f, 0.012483f, 0.020433f, -0.027967f, -0.010532f, 0.013897f, -0.013736f, 0.010338f, 0.033491f, 0.004420f, -0.007684f, -0.005791f, 0.022965f, 0.052419f, 0.057912f, 0.015739f, 0.036483f, -0.025375f, -0.022838f, -0.006996f, -0.002140f, 0.000702f, 0.009419f, 0.016700f, 0.033905f, 0.009311f, 0.031499f, 0.001999f, 0.010575f, 0.003147f, -0.006793f, 0.012382f, 0.001155f, 0.004144f, 0.003847f, -0.016610f, -0.000363f, -0.009519f, -0.015029f, -0.011638f, 0.001817f, 0.000343f, -0.020417f, -0.010363f, 0.029269f, 0.018651f, 0.015982f, 0.022153f, -0.012940f, -0.001143f, -0.038658f, 0.000578f, + 0.036185f, -0.008038f, -0.005250f, 0.002865f, -0.002062f, 0.025768f, -0.000485f, -0.005797f, 0.022541f, -0.026174f, -0.038630f, -0.017543f, 0.005330f, -0.022977f, 0.017788f, 0.021153f, -0.029981f, -0.013332f, 0.002085f, -0.001912f, -0.043718f, -0.030371f, 0.016532f, 0.004927f, -0.001417f, 0.013245f, -0.017805f, -0.013714f, -0.025930f, 0.005066f, 0.011463f, 0.000513f, 0.004679f, -0.020866f, -0.027754f, 0.022831f, -0.037235f, -0.053212f, -0.037023f, 0.025429f, -0.004714f, 0.046829f, -0.010848f, 0.038428f, -0.030741f, 0.000234f, 0.014830f, -0.003832f, 0.002462f, 0.003883f, -0.001670f, -0.024348f, 0.009085f, 0.008175f, 0.011150f, 0.011058f, -0.006452f, 0.018703f, -0.016821f, -0.013761f, -0.009244f, 0.026593f, -0.014218f, -0.005819f, 0.003333f, -0.001312f, -0.013283f, 0.011437f, -0.014903f, -0.019597f, -0.034569f, 0.002480f, 0.007488f, -0.024892f, -0.010248f, 0.010844f, -0.003843f, 0.005426f, 0.003005f, 0.027260f, 0.003068f, 0.020313f, 0.010576f, 0.000102f, 0.018128f, 0.003030f, 0.007123f, -0.032638f, 0.034093f, 0.010784f, 0.027067f, -0.016427f, 0.008284f, -0.017898f, 0.028189f, 0.019398f, + 0.034147f, 0.004388f, -0.006748f, -0.024384f, 0.000422f, 0.003452f, -0.018067f, 0.027925f, 0.006814f, 0.003932f, 0.033154f, 0.006573f, -0.006616f, -0.012257f, 0.001748f, 0.018863f, 0.024550f, -0.006319f, 0.023158f, 0.024551f, -0.057355f, -0.002179f, 0.029476f, -0.018519f, -0.006535f, 0.022443f, -0.023891f, -0.047650f, 0.009517f, 0.008859f, 0.007458f, -0.005570f, -0.028499f, 0.007990f, 0.008205f, 0.003004f, 0.015996f, -0.050219f, 0.023675f, -0.010897f, 0.012479f, -0.028089f, 0.024034f, -0.035753f, -0.023165f, 0.015503f, -0.009220f, -0.003032f, -0.027531f, 0.023358f, 0.029548f, 0.001332f, 0.003850f, -0.011849f, 0.044162f, 0.012354f, 0.012598f, -0.006244f, -0.036822f, -0.006350f, 0.021649f, -0.001954f, 0.032033f, 0.002187f, -0.010276f, 0.009528f, -0.001111f, 0.021631f, -0.036097f, -0.002270f, -0.027354f, 0.033214f, -0.010231f, 0.012804f, 0.000473f, 0.001471f, -0.032331f, -0.009153f, 0.031125f, 0.012300f, 0.004211f, -0.005960f, 0.002512f, 0.006905f, -0.041527f, -0.041501f, 0.049479f, -0.017726f, -0.049876f, 0.024681f, 0.026492f, -0.037884f, -0.052301f, -0.034005f, -0.033767f, 0.024630f, + -0.033540f, -0.015133f, -0.034932f, -0.000682f, 0.004499f, -0.041556f, 0.004859f, -0.019080f, 0.058952f, 0.005648f, -0.057086f, -0.010174f, 0.024577f, 0.018792f, 0.010958f, 0.030214f, 0.025831f, -0.037126f, -0.012089f, -0.012772f, 0.035281f, -0.010474f, 0.041561f, 0.002573f, -0.026922f, -0.017328f, -0.040614f, -0.041839f, 0.000910f, 0.007893f, -0.008963f, -0.020208f, -0.011397f, 0.005761f, 0.005493f, 0.018070f, -0.023276f, 0.013871f, -0.027035f, -0.027288f, 0.004537f, -0.003573f, -0.009282f, -0.028541f, -0.030955f, -0.011451f, -0.010259f, 0.045576f, 0.003006f, 0.017256f, 0.023169f, 0.002187f, 0.052992f, 0.024675f, -0.018377f, 0.005696f, 0.027322f, -0.007879f, 0.034900f, -0.006300f, 0.004576f, 0.005279f, -0.046966f, -0.045787f, 0.008098f, 0.036697f, 0.002165f, -0.007986f, -0.050967f, 0.005848f, 0.021304f, 0.013585f, -0.013430f, -0.012932f, -0.002462f, -0.023843f, -0.026628f, 0.053431f, -0.018304f, -0.016230f, -0.005223f, -0.011391f, -0.037161f, 0.003391f, 0.021430f, -0.056746f, -0.003546f, 0.018122f, 0.016442f, -0.017530f, 0.010943f, -0.031256f, 0.000087f, -0.005979f, 0.008113f, -0.027631f, + 0.016432f, -0.049003f, 0.005961f, 0.004354f, 0.026842f, 0.030628f, 0.011201f, -0.016344f, 0.019031f, -0.003225f, 0.021549f, -0.023111f, 0.001557f, 0.034001f, 0.021775f, -0.011128f, 0.002382f, 0.004180f, -0.009469f, 0.018431f, -0.008477f, -0.014295f, -0.022663f, 0.017974f, -0.038794f, 0.027707f, 0.002802f, -0.034634f, 0.033637f, 0.039101f, 0.029973f, 0.016270f, -0.019950f, 0.046882f, 0.002120f, 0.023088f, -0.028943f, -0.017214f, -0.027948f, 0.013393f, 0.006439f, 0.021291f, -0.038162f, 0.010153f, 0.022189f, -0.059375f, -0.001117f, -0.013409f, 0.038078f, 0.037046f, 0.016872f, 0.006225f, 0.023123f, -0.010412f, -0.006943f, 0.006219f, 0.043586f, 0.010191f, 0.021716f, -0.063159f, 0.028819f, -0.035097f, 0.047479f, -0.004268f, 0.017954f, 0.037095f, -0.040371f, 0.070898f, 0.049561f, 0.038560f, -0.018307f, 0.010727f, 0.047206f, -0.011674f, -0.016642f, -0.010848f, -0.003730f, -0.036083f, 0.008410f, -0.019047f, -0.045546f, 0.043162f, 0.012796f, 0.012075f, 0.003927f, 0.010206f, 0.015075f, 0.045328f, 0.007893f, -0.027889f, -0.004056f, -0.028978f, 0.004044f, 0.004388f, -0.053115f, -0.002036f, + 0.026041f, 0.002157f, -0.005654f, -0.015562f, 0.052463f, 0.011313f, 0.021052f, 0.012060f, -0.031726f, -0.021008f, -0.018488f, 0.033902f, 0.017487f, -0.006794f, 0.017908f, -0.003045f, -0.039956f, 0.036012f, 0.001406f, 0.041281f, 0.001397f, 0.004224f, -0.002577f, -0.054848f, 0.003815f, 0.001479f, 0.002088f, 0.034177f, -0.017868f, 0.053838f, -0.086469f, -0.014130f, 0.055111f, -0.023959f, 0.013164f, -0.026366f, -0.052099f, 0.030453f, 0.013289f, -0.068058f, -0.077215f, -0.009102f, -0.035330f, 0.002804f, 0.024104f, -0.033914f, 0.010758f, -0.050678f, 0.022454f, -0.029079f, -0.130662f, -0.011078f, 0.081825f, -0.037392f, -0.013731f, 0.078160f, -0.017877f, 0.001493f, 0.097990f, -0.026177f, 0.022385f, 0.005986f, -0.013303f, 0.074889f, -0.062102f, -0.011425f, -0.001036f, -0.014490f, -0.012062f, -0.016424f, -0.001063f, 0.021748f, -0.013906f, -0.046426f, 0.000793f, -0.003115f, 0.012805f, 0.011413f, 0.002933f, 0.030779f, -0.001332f, 0.011674f, -0.009668f, -0.046925f, 0.029261f, -0.010049f, -0.043843f, -0.003414f, 0.024666f, 0.071578f, 0.038346f, 0.059047f, 0.000671f, 0.009999f, 0.030040f, 0.001019f, + -0.004737f, 0.053759f, -0.004296f, -0.030712f, 0.069491f, 0.004623f, 0.011078f, -0.007943f, -0.011580f, 0.031062f, -0.001788f, -0.034108f, -0.028504f, -0.017879f, -0.007395f, 0.045815f, -0.043724f, -0.017728f, 0.000876f, 0.047975f, 0.033181f, -0.070921f, -0.039192f, 0.060009f, -0.013449f, -0.052331f, -0.003459f, 0.004306f, 0.017167f, 0.063352f, 0.050613f, -0.029752f, 0.007031f, -0.004257f, -0.002375f, 0.002683f, -0.037474f, 0.055469f, -0.018295f, -0.030940f, 0.009413f, -0.021261f, 0.026921f, 0.005929f, 0.039468f, -0.009642f, -0.042702f, -0.032787f, 0.029303f, -0.011978f, 0.038981f, -0.007739f, 0.024354f, -0.023903f, -0.023841f, -0.009525f, 0.000443f, -0.030827f, 0.005915f, 0.005367f, -0.001913f, 0.037156f, -0.002834f, 0.014834f, -0.025737f, 0.020297f, -0.039191f, 0.043097f, -0.037761f, 0.027157f, 0.009585f, 0.036903f, -0.057710f, 0.005721f, 0.002405f, -0.012869f, -0.042278f, -0.063896f, -0.013565f, -0.053878f, -0.024456f, -0.042239f, -0.023770f, -0.080486f, -0.028508f, 0.042699f, 0.046419f, 0.030893f, 0.026009f, -0.000023f, 0.028251f, -0.055662f, -0.016945f, 0.013787f, 0.031726f, -0.097862f, + 0.028741f, 0.014909f, -0.051158f, 0.019791f, 0.019213f, -0.037803f, -0.028536f, 0.043227f, 0.005474f, 0.022671f, -0.011808f, 0.028223f, -0.009295f, -0.005405f, 0.022698f, 0.010130f, 0.007312f, -0.000357f, -0.015636f, -0.027565f, -0.016413f, 0.040274f, -0.014929f, -0.037214f, 0.060738f, 0.036383f, 0.004423f, 0.026400f, 0.007817f, -0.033169f, -0.093824f, 0.036495f, -0.003666f, -0.052289f, 0.041739f, -0.006482f, -0.068672f, -0.059372f, -0.030441f, 0.042334f, 0.017174f, 0.043787f, 0.057523f, 0.014735f, -0.048002f, 0.012018f, 0.016032f, -0.063162f, -0.010681f, 0.030444f, -0.019802f, -0.069085f, -0.050767f, -0.083731f, -0.052069f, -0.015878f, 0.049064f, 0.068192f, 0.033708f, -0.010067f, 0.048654f, -0.018344f, -0.124920f, -0.104144f, 0.019496f, -0.056512f, -0.060603f, 0.075330f, 0.008488f, -0.122324f, -0.090080f, 0.017964f, 0.001406f, 0.004155f, 0.036953f, 0.076707f, 0.090723f, 0.091119f, -0.029602f, 0.032832f, -0.038080f, 0.024149f, -0.000066f, 0.014755f, -0.045004f, 0.005323f, -0.038564f, -0.031464f, -0.000754f, -0.075124f, 0.000893f, -0.030787f, 0.007645f, 0.024745f, -0.001475f, 0.028397f, + -0.038700f, 0.059631f, -0.029137f, 0.001228f, 0.039048f, -0.035095f, 0.014013f, 0.031044f, 0.034706f, 0.007512f, 0.012268f, 0.011226f, -0.055748f, -0.028251f, -0.009233f, 0.010804f, 0.008347f, -0.005536f, 0.036596f, -0.009069f, -0.000534f, -0.004157f, -0.015834f, 0.015917f, 0.007470f, -0.040775f, 0.013153f, -0.032088f, 0.010008f, -0.081353f, -0.003613f, 0.001185f, 0.000420f, 0.037926f, -0.013188f, -0.027321f, -0.012879f, 0.035338f, 0.000965f, -0.077983f, 0.115609f, -0.006138f, -0.020362f, 0.028900f, -0.003194f, -0.012721f, -0.019271f, -0.018549f, -0.021861f, 0.082736f, -0.026992f, -0.041088f, 0.043272f, 0.008035f, -0.055564f, -0.010989f, -0.070194f, -0.110332f, -0.101091f, 0.225298f, 0.191523f, 0.212334f, 0.489578f, 0.123670f, -0.121284f, 0.034150f, -0.390901f, -0.419965f, -0.102506f, -0.266131f, -0.201899f, 0.117796f, -0.064720f, 0.019677f, 0.310067f, 0.147912f, 0.229152f, 0.435910f, 0.293301f, 0.069776f, 0.061883f, -0.138396f, -0.405959f, -0.316441f, -0.239081f, -0.485245f, -0.196566f, 0.001950f, -0.088698f, -0.048017f, 0.236000f, 0.053187f, 0.026778f, 0.287055f, 0.030719f, 0.059249f, + 0.417018f, 0.298784f, 0.189613f, 0.387060f, 0.191078f, -0.085095f, -0.015589f, -0.142658f, -0.634996f, -0.561862f, -0.451995f, -0.702527f, -0.534358f, -0.204458f, -0.261431f, 0.034296f, 0.459096f, 0.401020f, 0.569358f, 0.715940f, 0.531493f, 0.402013f, 0.395612f, 0.199941f, -0.104729f, -0.184990f, -0.370999f, -0.527100f, -0.513325f, -0.461475f, -0.516861f, -0.542007f, -0.442561f, -0.288258f, -0.224376f, -0.030303f, 0.292413f, 0.359055f, 0.229948f, 0.019701f}, + {-0.006448f, -0.013510f, -0.005207f, -0.007604f, 0.000151f, 0.002616f, 0.008048f, -0.003880f, 0.000648f, -0.005956f, -0.004635f, -0.006334f, 0.003120f, -0.007287f, 0.001648f, -0.006135f, 0.012057f, -0.000682f, 0.000952f, -0.000570f, -0.008507f, 0.005430f, 0.012815f, 0.000208f, -0.003189f, 0.000662f, -0.002445f, 0.004132f, -0.001517f, -0.002179f, -0.002248f, -0.015186f, -0.004820f, 0.001228f, -0.002259f, 0.003936f, -0.004522f, 0.003400f, -0.000925f, 0.004108f, -0.002582f, 0.004413f, 0.000831f, 0.006221f, 0.003053f, -0.001982f, 0.002512f, 0.001591f, -0.003263f, -0.005955f, -0.002549f, -0.001034f, 0.003576f, 0.001500f, 0.000333f, -0.001103f, 0.006983f, 0.007610f, -0.008354f, -0.003011f, -0.007620f, 0.004418f, -0.000585f, -0.004339f, -0.002117f, -0.002822f, -0.003072f, -0.000413f, -0.004624f, 0.005044f, -0.006309f, -0.002869f, 0.000556f, 0.003456f, 0.001275f, 0.002772f, -0.001062f, 0.016799f, -0.002357f, 0.001471f, 0.012913f, -0.001553f, -0.000800f, -0.003691f, 0.014081f, 0.000947f, 0.006732f, 0.004320f, 0.003980f, -0.005806f, 0.002728f, -0.009051f, -0.001240f, 0.007141f, 0.001177f, 0.004196f, + 0.006395f, -0.011231f, -0.008153f, 0.002710f, -0.000854f, 0.008378f, 0.004788f, -0.000433f, -0.004960f, -0.002933f, -0.006073f, -0.000941f, -0.001110f, -0.000902f, 0.001235f, 0.002132f, -0.005368f, 0.008314f, -0.002310f, -0.001393f, 0.002467f, -0.010787f, -0.002880f, 0.004507f, 0.001206f, 0.010411f, -0.000486f, -0.000925f, 0.001596f, 0.000546f, 0.003908f, 0.007108f, 0.008783f, -0.000752f, -0.001481f, -0.000071f, -0.005888f, -0.007042f, 0.003171f, 0.005765f, -0.004850f, -0.004396f, -0.003387f, 0.007371f, 0.003879f, -0.001448f, 0.000492f, -0.009526f, -0.003387f, 0.004273f, 0.003096f, 0.006235f, -0.010704f, 0.001697f, 0.002672f, -0.002545f, 0.005726f, 0.021308f, 0.006370f, -0.005348f, 0.011465f, -0.005744f, 0.011926f, -0.004186f, -0.004824f, 0.005507f, 0.011198f, -0.000668f, -0.004880f, 0.002548f, 0.002712f, -0.000757f, -0.014865f, 0.003286f, 0.004960f, 0.000937f, 0.010052f, 0.012606f, 0.007406f, 0.012421f, 0.009126f, 0.007476f, -0.001556f, 0.008344f, 0.004654f, -0.006741f, 0.002966f, 0.003751f, -0.007849f, -0.010849f, -0.001090f, 0.004011f, 0.000723f, -0.004013f, -0.004583f, -0.005168f, + -0.001911f, 0.005610f, 0.012102f, 0.009637f, 0.004280f, 0.007396f, -0.011484f, 0.000687f, -0.002466f, 0.000065f, -0.013250f, 0.005120f, -0.000693f, -0.003273f, 0.000112f, -0.003738f, -0.006199f, -0.004759f, 0.005541f, 0.001265f, 0.004418f, -0.004919f, 0.010162f, 0.002623f, -0.010263f, 0.004774f, 0.002099f, 0.003357f, 0.006716f, 0.002208f, 0.011725f, -0.003037f, 0.001880f, -0.012278f, 0.003045f, 0.001985f, 0.000715f, 0.001192f, 0.001635f, -0.004948f, -0.003861f, -0.001986f, 0.004586f, -0.007982f, 0.002725f, -0.015226f, 0.003308f, 0.002219f, -0.001152f, 0.009933f, 0.001224f, -0.001718f, 0.001504f, 0.005002f, -0.008431f, 0.000735f, 0.003322f, 0.005195f, -0.012225f, -0.007031f, -0.004254f, 0.004143f, 0.002499f, -0.004565f, -0.012346f, 0.002586f, -0.012273f, -0.001337f, 0.005701f, -0.002932f, 0.004492f, -0.002772f, 0.009277f, 0.012302f, 0.007411f, -0.007202f, 0.001877f, 0.009189f, 0.006658f, -0.006575f, 0.005713f, 0.000956f, -0.009356f, 0.002973f, 0.014463f, 0.005909f, 0.005323f, 0.014815f, 0.002103f, -0.006386f, -0.011012f, -0.001068f, -0.005824f, -0.008473f, -0.002941f, 0.007895f, + -0.007172f, 0.002243f, -0.003890f, -0.005037f, 0.010806f, -0.001851f, 0.002662f, 0.007286f, 0.011819f, -0.005326f, -0.008580f, 0.011902f, 0.010999f, 0.005481f, 0.002236f, -0.008259f, 0.003261f, 0.008771f, -0.007123f, -0.029270f, -0.010413f, -0.004668f, 0.016143f, -0.006211f, -0.002132f, -0.009555f, -0.007675f, -0.001501f, -0.020669f, 0.011621f, 0.004191f, -0.000706f, -0.007416f, 0.011473f, -0.002911f, 0.005797f, -0.004321f, 0.003651f, 0.007758f, -0.009258f, 0.001376f, 0.010144f, 0.006172f, 0.004089f, 0.011322f, 0.009740f, -0.005638f, -0.007755f, -0.009222f, -0.000112f, -0.012255f, 0.003117f, -0.016326f, -0.003139f, 0.012983f, 0.006643f, -0.003687f, -0.001179f, -0.012069f, 0.005920f, -0.004776f, 0.011365f, -0.005762f, -0.011271f, -0.001644f, -0.004495f, -0.008680f, 0.003920f, -0.001371f, -0.005705f, -0.005285f, -0.020000f, 0.003659f, -0.005726f, -0.014139f, -0.003594f, 0.010279f, 0.005230f, -0.006746f, 0.006957f, 0.009399f, 0.008580f, 0.004170f, -0.009736f, -0.000441f, -0.001556f, 0.008602f, -0.006437f, -0.001276f, 0.004819f, 0.005547f, -0.010121f, -0.011648f, -0.022679f, -0.001954f, -0.011231f, + -0.025036f, -0.010375f, -0.004278f, -0.007750f, 0.008857f, 0.010991f, 0.010855f, -0.021378f, -0.015523f, 0.005814f, 0.025971f, 0.014952f, 0.000226f, 0.003403f, 0.007564f, -0.009508f, 0.006334f, -0.008833f, 0.006417f, 0.008883f, 0.001632f, 0.007079f, 0.002505f, -0.000766f, 0.004017f, 0.002008f, -0.006693f, -0.008982f, 0.012271f, 0.004652f, -0.008621f, 0.008408f, -0.004620f, -0.001123f, 0.020934f, -0.010131f, 0.011925f, 0.022983f, 0.009638f, -0.001534f, 0.001057f, -0.008568f, 0.011005f, -0.011270f, -0.005908f, -0.018803f, 0.003654f, 0.014201f, -0.000222f, -0.013333f, -0.004565f, -0.018823f, -0.009363f, -0.003581f, -0.026461f, -0.014555f, -0.002503f, 0.002758f, -0.011514f, 0.005869f, -0.002952f, -0.009184f, 0.010097f, 0.029440f, 0.002899f, 0.015081f, 0.010364f, 0.008970f, -0.009049f, 0.004149f, -0.015504f, 0.002025f, 0.005073f, 0.004003f, -0.005324f, 0.000701f, 0.038967f, 0.025495f, -0.014132f, 0.005588f, 0.012158f, -0.004737f, 0.006711f, -0.001969f, 0.011283f, 0.006436f, 0.003208f, 0.011245f, 0.005486f, 0.005800f, -0.003966f, -0.025967f, 0.012034f, -0.004043f, -0.006653f, 0.021133f, + 0.012153f, 0.007591f, 0.008876f, 0.007518f, 0.004586f, -0.003618f, 0.002372f, 0.001261f, -0.007475f, 0.005880f, 0.008221f, -0.014507f, 0.002113f, -0.009254f, 0.006373f, 0.008645f, -0.024092f, -0.000002f, -0.028544f, 0.000849f, 0.002642f, 0.002718f, 0.006724f, 0.019281f, -0.003189f, -0.009464f, -0.005711f, -0.004930f, -0.008228f, 0.005774f, 0.004901f, 0.002148f, -0.004081f, -0.003099f, 0.017352f, -0.005811f, -0.004765f, -0.009765f, 0.015206f, -0.002219f, 0.012545f, -0.006217f, 0.013430f, -0.013904f, -0.031024f, -0.008625f, 0.000482f, 0.006200f, 0.008592f, -0.009845f, -0.008982f, 0.004211f, 0.001098f, -0.004506f, -0.009306f, 0.018805f, -0.008410f, 0.018218f, -0.006801f, -0.012563f, -0.000313f, 0.001666f, -0.017316f, -0.014026f, -0.004144f, 0.004474f, -0.002396f, 0.022489f, 0.013895f, 0.000283f, 0.021973f, 0.007524f, 0.006563f, -0.018996f, 0.017688f, -0.003620f, -0.004222f, -0.016091f, -0.006949f, 0.013611f, 0.013948f, -0.004302f, 0.009291f, -0.019300f, -0.002530f, 0.012331f, 0.009693f, -0.007463f, -0.013328f, -0.007942f, -0.008204f, -0.010768f, -0.008538f, 0.001665f, -0.014044f, -0.001772f, + 0.019594f, -0.009811f, 0.002317f, -0.001150f, -0.004441f, 0.007201f, -0.003072f, 0.012348f, 0.000049f, 0.017588f, -0.004597f, -0.011735f, 0.006521f, -0.009344f, -0.008873f, -0.009330f, -0.025550f, 0.002616f, 0.010562f, 0.014891f, 0.010943f, 0.019709f, -0.002079f, -0.007914f, 0.011517f, -0.014356f, 0.003261f, 0.002148f, -0.002184f, 0.013056f, 0.012024f, -0.002781f, -0.015520f, 0.003783f, -0.008145f, -0.013323f, -0.014152f, 0.004258f, -0.021943f, -0.013695f, 0.002920f, -0.013372f, -0.032730f, 0.024697f, 0.000002f, -0.002175f, 0.003755f, 0.001480f, -0.021447f, 0.014886f, -0.022378f, 0.001541f, 0.011075f, -0.003519f, 0.004409f, 0.003207f, -0.024103f, -0.008805f, -0.010405f, -0.002774f, 0.005673f, -0.008599f, -0.004537f, -0.001482f, -0.000831f, 0.001786f, 0.010962f, 0.005060f, 0.022857f, -0.008536f, 0.031144f, -0.002605f, 0.001480f, -0.020411f, -0.002301f, 0.014358f, -0.002278f, -0.031140f, 0.013060f, 0.013798f, -0.008450f, 0.007082f, -0.010775f, 0.020796f, 0.012453f, -0.001068f, -0.000556f, -0.014109f, -0.008004f, -0.015397f, 0.014686f, 0.013329f, 0.006773f, 0.001101f, 0.007004f, -0.012513f, + -0.030955f, -0.012058f, 0.011794f, 0.004376f, -0.022797f, 0.000100f, 0.003440f, 0.002714f, -0.010635f, 0.007570f, 0.017246f, 0.008098f, 0.000796f, 0.006237f, 0.011680f, -0.006986f, 0.016581f, -0.000276f, -0.034510f, 0.018284f, -0.004238f, 0.006347f, -0.009849f, -0.006289f, 0.015272f, -0.017702f, 0.017096f, -0.010973f, -0.019412f, 0.008348f, -0.010249f, 0.041742f, 0.006762f, -0.015540f, -0.020173f, -0.004429f, -0.025140f, -0.012497f, -0.027125f, -0.002391f, 0.018807f, -0.013846f, 0.011738f, 0.017770f, -0.016861f, -0.000779f, -0.019757f, 0.010417f, 0.004298f, -0.001627f, 0.012162f, -0.013452f, -0.017736f, -0.016172f, 0.001320f, 0.002428f, 0.015402f, -0.022813f, 0.015762f, 0.002008f, -0.032001f, -0.018790f, -0.025811f, -0.011781f, 0.010045f, -0.009906f, -0.008538f, -0.050670f, -0.000923f, -0.012091f, -0.004454f, -0.033015f, -0.011009f, -0.005519f, 0.002464f, 0.024513f, 0.023554f, 0.018534f, 0.011398f, 0.023464f, -0.027009f, 0.019385f, 0.002694f, 0.008148f, 0.006737f, -0.020865f, 0.029431f, 0.016769f, 0.011207f, -0.014871f, -0.018408f, -0.014372f, 0.016102f, 0.000679f, -0.001873f, 0.013611f, + 0.024282f, 0.027018f, 0.010566f, 0.018997f, 0.014768f, 0.009356f, -0.005243f, 0.002318f, -0.007647f, 0.000935f, -0.002881f, -0.015818f, 0.020168f, 0.032884f, 0.012613f, -0.008614f, 0.014229f, 0.014178f, -0.000947f, 0.008913f, -0.015750f, -0.029339f, -0.020095f, -0.013203f, 0.008189f, -0.003308f, -0.015865f, 0.011849f, -0.005705f, -0.013577f, -0.000556f, 0.024277f, 0.011719f, 0.018056f, 0.005855f, 0.013363f, 0.014176f, -0.003061f, 0.012961f, -0.004910f, -0.015577f, 0.006699f, -0.017971f, 0.006859f, 0.006701f, -0.025659f, -0.017149f, 0.010922f, 0.026607f, -0.013639f, 0.018494f, 0.026445f, -0.021809f, 0.001208f, 0.023690f, 0.002909f, -0.008799f, -0.001657f, -0.012236f, -0.020995f, 0.000349f, -0.006082f, -0.010995f, 0.015128f, 0.001124f, -0.023969f, 0.031964f, -0.012408f, 0.026371f, -0.029467f, -0.019124f, 0.015358f, -0.016237f, 0.010759f, -0.008628f, -0.003141f, 0.002168f, -0.023897f, 0.015828f, -0.011270f, -0.022530f, 0.032898f, 0.019335f, -0.026096f, 0.018802f, 0.013856f, 0.006062f, 0.027323f, -0.058304f, 0.002434f, 0.026040f, 0.006511f, 0.003651f, 0.024100f, 0.002436f, 0.012235f, + -0.033201f, -0.006778f, 0.010778f, -0.001738f, -0.015983f, 0.004507f, 0.015222f, 0.004417f, 0.007869f, 0.016043f, 0.016588f, 0.022029f, 0.020480f, -0.010115f, -0.006676f, 0.016313f, -0.010489f, 0.010557f, -0.020322f, -0.014511f, -0.026344f, -0.015473f, 0.016257f, 0.002218f, -0.005257f, 0.019385f, -0.025735f, -0.039538f, -0.057561f, 0.014696f, 0.021267f, 0.012199f, 0.013400f, -0.017679f, 0.010315f, -0.012085f, 0.023124f, 0.054829f, -0.008227f, -0.017032f, -0.024739f, -0.013033f, 0.023147f, -0.020313f, 0.013731f, 0.016167f, 0.004668f, -0.006621f, -0.015944f, -0.011715f, 0.009610f, -0.048469f, -0.035888f, -0.004628f, 0.008398f, -0.023449f, 0.004996f, 0.089813f, 0.048937f, 0.033097f, -0.009389f, -0.007899f, -0.002323f, -0.006434f, -0.010356f, -0.012649f, -0.017819f, -0.027359f, -0.000005f, -0.000943f, 0.005670f, 0.013453f, 0.022339f, 0.036775f, -0.006084f, -0.045494f, -0.019502f, 0.040902f, -0.007560f, 0.015923f, -0.006524f, 0.000270f, 0.025218f, 0.010124f, 0.018802f, 0.012768f, -0.002242f, -0.000340f, -0.001804f, 0.014256f, 0.015703f, -0.005860f, -0.027669f, 0.035065f, 0.023086f, 0.018188f, + 0.004904f, 0.009578f, -0.015481f, -0.025325f, 0.034175f, 0.020539f, 0.007587f, -0.016064f, -0.020115f, -0.025436f, -0.017651f, -0.004210f, -0.017953f, 0.009294f, -0.034940f, 0.004811f, 0.022585f, -0.015784f, 0.006683f, 0.001482f, 0.001557f, -0.037965f, 0.011276f, -0.016561f, 0.025351f, -0.061280f, 0.008043f, -0.016693f, -0.023055f, 0.003836f, -0.015107f, 0.010767f, 0.008919f, -0.042146f, -0.002609f, 0.023445f, 0.001515f, -0.054665f, -0.027785f, 0.003842f, -0.047661f, 0.010804f, 0.034966f, -0.016890f, 0.042466f, 0.049388f, 0.006541f, 0.024604f, 0.030805f, 0.013562f, -0.029065f, 0.019001f, 0.023583f, -0.001269f, 0.006169f, 0.016339f, 0.014832f, 0.034868f, 0.006262f, -0.013570f, 0.022631f, 0.007928f, -0.003156f, 0.000443f, 0.015295f, -0.020492f, -0.008904f, -0.008688f, 0.012841f, 0.006452f, -0.028462f, 0.008507f, 0.024463f, 0.000653f, 0.029421f, -0.027425f, -0.051446f, 0.004193f, 0.023702f, 0.035256f, 0.033088f, 0.016940f, 0.015959f, 0.012530f, -0.034743f, -0.010160f, -0.000954f, 0.026626f, 0.042348f, -0.014221f, 0.009582f, -0.015114f, 0.010499f, 0.006970f, 0.026094f, 0.039789f, + -0.014501f, -0.016813f, -0.002696f, 0.022135f, 0.028521f, 0.039495f, 0.001800f, -0.041171f, -0.038678f, -0.005454f, 0.006113f, 0.001439f, -0.017059f, 0.002242f, -0.046481f, -0.027898f, -0.026484f, -0.025261f, 0.016624f, 0.023664f, -0.051488f, 0.005310f, -0.010658f, 0.028693f, -0.015352f, -0.001462f, 0.008312f, 0.022090f, -0.028675f, -0.046829f, -0.008480f, -0.017639f, 0.001256f, -0.020395f, 0.012713f, 0.013851f, 0.001332f, -0.024435f, 0.016283f, 0.003094f, 0.043381f, -0.005312f, 0.023956f, -0.018257f, 0.044971f, 0.014630f, 0.028315f, 0.020565f, 0.030939f, 0.046614f, -0.010171f, 0.019437f, -0.030407f, 0.035163f, 0.032901f, 0.001643f, 0.011417f, 0.034750f, -0.019494f, -0.017259f, -0.002031f, 0.067705f, 0.011937f, -0.015153f, 0.033746f, 0.007384f, 0.026386f, 0.038883f, 0.012196f, 0.001161f, 0.005356f, 0.009332f, 0.025642f, -0.004169f, 0.027549f, -0.013050f, 0.027181f, -0.008978f, 0.058286f, -0.003104f, 0.050821f, -0.037870f, -0.043913f, 0.071791f, -0.051358f, -0.023281f, 0.006596f, -0.010869f, -0.029396f, 0.037899f, 0.001548f, -0.033710f, -0.013756f, -0.011344f, -0.055309f, 0.009788f, + -0.046022f, -0.025392f, 0.004947f, -0.052846f, -0.036056f, -0.035875f, -0.043053f, 0.051029f, -0.004821f, 0.004456f, 0.010616f, -0.011324f, -0.065265f, -0.043333f, -0.048940f, -0.089254f, 0.002616f, 0.012894f, 0.035549f, 0.025574f, 0.009516f, 0.022095f, 0.009386f, 0.006505f, -0.033443f, -0.040460f, -0.029115f, 0.035121f, -0.008909f, -0.022976f, -0.014918f, 0.034247f, -0.044212f, -0.023571f, -0.045435f, -0.018404f, -0.008777f, -0.037130f, 0.008854f, -0.030700f, 0.028996f, 0.025590f, -0.011313f, 0.025122f, -0.029771f, -0.047598f, 0.014808f, 0.029110f, -0.031750f, -0.055105f, 0.034983f, -0.003207f, 0.023063f, 0.025728f, -0.087425f, -0.056675f, -0.007643f, -0.013267f, 0.043194f, -0.030430f, -0.043707f, -0.010295f, 0.009115f, 0.001415f, -0.015703f, -0.020152f, 0.056890f, -0.036599f, -0.069562f, -0.079610f, 0.038984f, -0.018043f, -0.080852f, 0.022090f, 0.006121f, -0.014643f, -0.007591f, 0.005334f, -0.048268f, -0.022668f, 0.025487f, 0.035490f, 0.079687f, 0.009918f, 0.042462f, 0.016765f, 0.021293f, -0.020833f, -0.004168f, -0.018341f, -0.041282f, -0.053482f, -0.069134f, -0.029097f, -0.062282f, -0.028534f, + -0.032187f, -0.016135f, 0.034969f, 0.004509f, 0.023944f, 0.036073f, 0.000668f, 0.022924f, 0.008346f, -0.002927f, -0.000601f, -0.009756f, -0.053346f, 0.014856f, -0.006675f, -0.065255f, -0.037598f, 0.012697f, -0.039135f, -0.020034f, 0.013606f, 0.038561f, 0.052547f, 0.012999f, -0.012000f, 0.001590f, 0.034505f, 0.013120f, 0.006125f, -0.007251f, -0.107128f, -0.027719f, 0.021387f, 0.020056f, 0.008414f, -0.011035f, -0.038193f, 0.017355f, -0.034766f, -0.031557f, -0.009758f, -0.001529f, -0.021714f, -0.064732f, 0.025369f, -0.016041f, 0.064508f, 0.017370f, 0.017306f, 0.017183f, 0.043426f, 0.105435f, -0.008429f, -0.008024f, -0.018280f, -0.039535f, 0.054873f, -0.003893f, 0.006526f, -0.060533f, -0.026095f, 0.079665f, -0.054702f, -0.009814f, -0.047987f, -0.125090f, -0.022684f, 0.043404f, 0.028248f, 0.010051f, 0.004939f, -0.003242f, 0.067795f, -0.074214f, -0.004602f, -0.018801f, -0.056651f, -0.040526f, -0.011190f, 0.018306f, 0.008304f, 0.020882f, 0.041942f, 0.033672f, -0.037825f, -0.030287f, 0.087994f, 0.079112f, -0.010989f, 0.012083f, -0.015132f, 0.027856f, -0.005377f, 0.057191f, 0.014630f, 0.031759f, + 0.002955f, 0.007095f, -0.101205f, 0.042608f, -0.009431f, -0.052569f, -0.033542f, 0.008106f, -0.020382f, -0.052509f, 0.047396f, -0.006944f, -0.044884f, -0.005912f, -0.000055f, 0.049108f, 0.046599f, 0.041993f, 0.009257f, 0.048675f, 0.043645f, -0.035921f, -0.047755f, -0.024796f, -0.013743f, 0.049785f, 0.057381f, 0.012149f, 0.015213f, 0.062993f, 0.028184f, -0.057788f, 0.032200f, 0.016090f, -0.027151f, 0.003149f, 0.094803f, 0.053631f, -0.034227f, -0.051867f, -0.081726f, 0.015541f, -0.014866f, -0.027153f, -0.032437f, 0.017534f, -0.019263f, -0.010322f, 0.055429f, -0.017716f, -0.001958f, -0.043366f, 0.004609f, 0.026534f, -0.058587f, -0.038374f, -0.034551f, -0.018205f, 0.022966f, -0.081153f, -0.043553f, -0.116822f, 0.021535f, -0.001674f, -0.028197f, -0.013413f, -0.015789f, 0.024448f, 0.038762f, -0.041655f, 0.003021f, -0.014717f, -0.012473f, -0.072885f, 0.017539f, 0.055588f, 0.016360f, 0.042076f, 0.054624f, 0.047407f, -0.061974f, -0.019448f, -0.017453f, -0.029713f, 0.055443f, -0.054559f, -0.029647f, 0.002231f, 0.079835f, 0.018004f, -0.025207f, 0.078961f, -0.041867f, -0.040728f, 0.095889f, 0.090426f, + 0.011147f, 0.023860f, -0.022772f, -0.083604f, -0.023204f, 0.087030f, -0.038252f, 0.079352f, -0.024400f, -0.119699f, -0.028122f, -0.054201f, 0.069773f, 0.004229f, 0.020338f, 0.063073f, -0.001763f, 0.052897f, 0.023222f, 0.042184f, 0.004209f, -0.078356f, 0.046807f, 0.051987f, -0.062949f, 0.034352f, 0.000845f, -0.023815f, -0.026153f, -0.093014f, -0.039454f, 0.031980f, 0.007252f, 0.084402f, -0.066659f, -0.038898f, 0.017491f, -0.009673f, 0.056010f, -0.075837f, 0.001772f, 0.007604f, -0.062139f, 0.063817f, 0.036864f, 0.019495f, -0.028068f, 0.043827f, -0.049829f, 0.028774f, 0.024296f, 0.013689f, -0.001580f, -0.028631f, 0.014173f, 0.058498f, -0.028330f, -0.010669f, 0.013663f, -0.044971f, 0.048780f, 0.002441f, 0.014576f, -0.061657f, 0.036104f, 0.009048f, 0.013941f, -0.145475f, 0.022618f, -0.040642f, 0.070973f, 0.057686f, 0.062709f, 0.031857f, -0.116443f, -0.019694f, 0.028083f, 0.003809f, 0.010426f, 0.085156f, -0.010069f, -0.049120f, -0.058260f, 0.003803f, -0.065300f, -0.057776f, -0.050703f, 0.026397f, -0.097237f, 0.070731f, 0.133388f, -0.034692f, -0.018513f, -0.105439f, -0.031548f, -0.092794f, + 0.023269f, -0.039157f, -0.031161f, 0.031746f, -0.026036f, -0.030830f, 0.023956f, -0.041387f, -0.005317f, -0.047549f, 0.070105f, 0.004077f, -0.055699f, -0.012878f, -0.001319f, -0.002515f, 0.014388f, -0.032656f, -0.027082f, 0.010824f, 0.012177f, 0.011397f, 0.004685f, 0.030464f, -0.034380f, -0.009381f, -0.075906f, 0.030188f, 0.004514f, -0.019544f, 0.050772f, 0.031972f, -0.024085f, 0.084231f, 0.015735f, -0.048152f, 0.036328f, 0.009631f, 0.022895f, 0.056642f, -0.007176f, -0.010173f, 0.006254f, 0.047225f, 0.022913f, 0.003999f, -0.006535f, 0.050320f, -0.006148f, -0.051941f, -0.011371f, 0.013161f, 0.041643f, -0.016232f, 0.073083f, 0.085562f, -0.053938f, 0.046099f, 0.091435f, -0.022084f, 0.139731f, 0.082483f, -0.036243f, -0.029193f, -0.053786f, -0.057278f, -0.034323f, 0.021466f, -0.010446f, -0.008174f, -0.001246f, -0.006953f, -0.097143f, -0.036521f, -0.094966f, 0.022462f, 0.125663f, 0.031603f, -0.043220f, 0.003765f, -0.057132f, -0.008840f, 0.021915f, -0.025428f, -0.029644f, -0.035767f, -0.011652f, 0.012261f, -0.006122f, -0.012179f, 0.017381f, 0.008104f, 0.023045f, -0.023091f, -0.012208f, 0.014993f, + -0.004008f, 0.001925f, -0.030547f, 0.021037f, -0.036009f, 0.017297f, 0.014383f, -0.008994f, 0.000251f, 0.000574f, -0.019959f, 0.002898f, 0.006547f, -0.018274f, 0.033778f, -0.017762f, 0.009864f, -0.000539f, 0.003377f, 0.015303f, -0.013259f, -0.024942f, -0.004858f, 0.035922f, -0.024614f, 0.017288f, -0.047142f, -0.030198f, 0.012159f, -0.011346f, 0.002032f, -0.003854f, -0.027016f, 0.031232f, 0.028449f, 0.001792f, -0.018726f, -0.001585f, -0.009975f, 0.006067f, -0.013108f, -0.000971f, -0.012241f, 0.011563f, -0.000444f, 0.002759f, 0.044498f, -0.034352f, 0.001683f, 0.005834f, 0.007503f, -0.007466f, 0.006647f, -0.016038f, 0.007670f, -0.013362f, -0.058184f, -0.089609f, 0.062881f, 0.280852f, 0.125120f, 0.127926f, 0.000607f, -0.262778f, -0.187695f, -0.099862f, -0.204499f, 0.098504f, 0.124304f, 0.062389f, 0.267767f, 0.118268f, -0.010117f, 0.086827f, -0.170891f, -0.221239f, -0.123980f, -0.155445f, -0.031739f, 0.117506f, 0.123334f, 0.049533f, 0.206212f, 0.100109f, -0.012790f, 0.096966f, -0.089186f, -0.157063f, -0.087734f, -0.118543f, -0.182166f, 0.066077f, -0.000114f, -0.067481f, 0.199239f, 0.117515f, + 0.068519f, 0.200875f, 0.050464f, -0.104396f, 0.101234f, -0.148182f, -0.165612f, -0.035799f, -0.174265f, -0.179969f, 0.072104f, -0.031101f, 0.044702f, 0.223321f, 0.155648f, 0.158783f, 0.152887f, 0.016790f, -0.083218f, -0.099579f, -0.162499f, -0.216844f, -0.111323f, -0.062856f, -0.042941f, 0.080777f, 0.129842f, 0.119039f, 0.172170f, 0.152760f, -0.021981f, -0.028231f, -0.025646f, -0.158668f, -0.044471f, -0.077097f, -0.107629f, 0.027924f, 0.028288f, -0.001355f} + }, + { + {-0.005889f, -0.013663f, -0.005501f, -0.007822f, -0.004259f, 0.009698f, 0.005225f, 0.000753f, 0.008095f, 0.005482f, -0.006464f, -0.008837f, -0.005413f, -0.004194f, 0.001057f, 0.003309f, -0.008845f, -0.001237f, -0.003505f, -0.000139f, -0.001045f, -0.001956f, -0.004690f, 0.011110f, 0.006507f, -0.000795f, -0.009141f, -0.003661f, 0.001986f, 0.003738f, -0.000283f, -0.003659f, 0.001644f, 0.003185f, 0.001103f, 0.002976f, -0.002525f, -0.000431f, -0.006999f, -0.009077f, -0.001920f, -0.000859f, 0.004481f, 0.005404f, 0.003874f, 0.001074f, 0.001301f, 0.003093f, 0.004659f, 0.001319f, 0.006209f, 0.002477f, -0.003919f, -0.004688f, -0.000042f, 0.004412f, 0.004203f, 0.001784f, 0.000969f, 0.006697f, 0.004528f, -0.007987f, -0.006857f, -0.004168f, -0.003773f, -0.003424f, 0.004588f, -0.003108f, 0.002191f, -0.007564f, 0.005518f, -0.005372f, -0.003834f, 0.003849f, -0.002422f, -0.003374f, 0.008748f, 0.005360f, -0.008337f, -0.001651f, -0.003222f, -0.000059f, 0.011941f, 0.000896f, -0.005432f, 0.006607f, 0.001074f, 0.000849f, 0.001903f, 0.001538f, -0.000133f, 0.009340f, 0.004912f, -0.006005f, -0.002640f, -0.000525f, + -0.002434f, 0.002751f, 0.003642f, 0.002807f, -0.002924f, -0.003774f, 0.001244f, -0.007789f, -0.003909f, 0.006165f, 0.000233f, 0.004999f, 0.002165f, -0.003709f, 0.002636f, 0.000231f, -0.003752f, 0.008583f, -0.005953f, -0.002464f, 0.000732f, 0.003072f, -0.004198f, -0.000829f, -0.005889f, -0.010745f, 0.009843f, -0.001864f, -0.006098f, 0.000792f, 0.008983f, 0.000204f, 0.003200f, -0.004473f, -0.003192f, -0.001722f, 0.002402f, -0.003482f, 0.007000f, 0.001412f, 0.006230f, -0.009611f, 0.003570f, -0.002308f, 0.001000f, 0.004453f, -0.002409f, -0.000802f, -0.008069f, 0.000378f, 0.003033f, 0.001264f, -0.003084f, 0.000091f, 0.002198f, -0.001303f, -0.003816f, 0.025456f, 0.009020f, -0.002252f, 0.007170f, 0.000135f, 0.012886f, 0.007739f, -0.001560f, 0.006290f, 0.011592f, 0.014654f, -0.008564f, -0.008820f, 0.003874f, -0.003694f, -0.002654f, 0.010411f, 0.008819f, 0.007960f, 0.006068f, 0.000870f, -0.000112f, -0.003948f, 0.004285f, 0.002599f, 0.013781f, 0.001133f, -0.000064f, -0.006235f, 0.003055f, 0.003726f, -0.000536f, -0.002094f, -0.001881f, 0.003426f, -0.000294f, -0.002437f, -0.004715f, 0.005008f, + -0.001513f, -0.002041f, 0.007745f, 0.010355f, -0.002471f, -0.001570f, 0.006416f, 0.005222f, 0.010014f, 0.005749f, 0.002970f, 0.000717f, 0.008592f, 0.004397f, -0.011098f, -0.000286f, 0.003844f, -0.006886f, 0.000530f, 0.000761f, -0.007765f, 0.003822f, -0.003547f, 0.005770f, -0.000875f, -0.001409f, 0.003771f, 0.000683f, -0.005085f, -0.000901f, 0.003723f, -0.001538f, -0.000697f, -0.002112f, 0.001432f, 0.005955f, 0.002191f, -0.007077f, 0.008878f, -0.000690f, -0.016774f, -0.007805f, -0.003260f, -0.003631f, -0.009136f, -0.008388f, -0.005274f, 0.009082f, -0.009997f, -0.004672f, -0.004754f, 0.001817f, 0.015148f, -0.002291f, -0.001217f, 0.003690f, 0.008663f, -0.013289f, -0.002179f, 0.002683f, -0.005873f, 0.004656f, 0.007402f, -0.008215f, -0.000522f, 0.001017f, -0.004775f, -0.012086f, 0.002078f, -0.005119f, 0.001615f, -0.004723f, 0.006874f, -0.008375f, -0.007781f, -0.019181f, -0.005171f, 0.006496f, -0.001086f, -0.007419f, -0.003634f, -0.001018f, -0.007708f, 0.000282f, -0.001317f, 0.005164f, 0.004156f, -0.002110f, 0.000218f, -0.002101f, -0.008137f, 0.009749f, 0.001705f, 0.006518f, -0.002480f, -0.000177f, + 0.001722f, 0.002673f, 0.007657f, -0.002714f, -0.001872f, 0.001984f, -0.000231f, 0.008056f, 0.004471f, -0.007617f, -0.002875f, -0.002235f, -0.011455f, -0.001788f, -0.001039f, 0.006232f, -0.004302f, -0.036729f, -0.011708f, -0.003086f, -0.003128f, -0.002901f, 0.014103f, -0.012946f, 0.006193f, -0.002861f, 0.002770f, -0.003538f, -0.003166f, -0.010354f, 0.001628f, -0.003619f, 0.000699f, -0.015110f, 0.000215f, -0.001308f, -0.002837f, 0.000026f, 0.002809f, 0.002616f, -0.001525f, -0.000750f, -0.006221f, 0.002216f, -0.004998f, 0.003581f, -0.000051f, 0.003119f, 0.009558f, -0.002157f, -0.011020f, -0.004332f, -0.012890f, 0.002166f, 0.002312f, -0.000768f, 0.002231f, -0.004081f, 0.004325f, 0.002648f, -0.005679f, 0.000941f, -0.015439f, -0.002834f, -0.010303f, 0.006147f, 0.010292f, -0.008512f, -0.000634f, 0.003457f, 0.001657f, -0.014219f, 0.002566f, 0.008152f, -0.006967f, -0.002789f, -0.016704f, 0.006325f, -0.002274f, 0.007595f, 0.012667f, 0.007770f, -0.009811f, 0.002805f, 0.002630f, 0.001252f, -0.010846f, 0.003598f, -0.004385f, 0.008145f, -0.002546f, 0.000319f, 0.004046f, 0.003357f, -0.022112f, 0.001796f, + 0.004804f, -0.008904f, -0.000296f, 0.021600f, 0.018057f, 0.008686f, -0.001781f, -0.004783f, 0.011822f, 0.006233f, 0.004270f, 0.003469f, -0.008247f, 0.002322f, 0.001579f, 0.009747f, -0.009308f, -0.005337f, -0.001200f, 0.000556f, -0.001337f, -0.012335f, -0.007125f, -0.008919f, -0.008899f, 0.004533f, 0.007169f, 0.003343f, 0.003583f, -0.000606f, 0.003521f, -0.002283f, -0.000519f, -0.000111f, -0.002763f, -0.001862f, 0.005806f, 0.003071f, -0.007112f, -0.009667f, -0.000064f, -0.009718f, 0.006025f, -0.003622f, -0.014096f, 0.000814f, 0.008342f, 0.009695f, 0.008207f, -0.000641f, 0.007815f, -0.011714f, -0.002579f, -0.005900f, 0.000109f, -0.000480f, 0.005637f, -0.004964f, -0.008804f, 0.010425f, -0.009784f, -0.006675f, 0.008325f, 0.015416f, 0.005122f, 0.001480f, -0.015527f, 0.015870f, 0.003480f, 0.009954f, 0.020945f, -0.007650f, 0.004067f, -0.002611f, -0.004506f, 0.003709f, 0.034608f, 0.024233f, -0.008605f, -0.012776f, 0.019230f, 0.012387f, 0.020226f, 0.029511f, -0.014899f, 0.010145f, 0.004993f, 0.008468f, 0.003904f, 0.005023f, 0.012288f, 0.002893f, 0.012538f, 0.000244f, -0.007984f, 0.003179f, + -0.002578f, 0.004024f, -0.001495f, 0.022781f, 0.003866f, 0.004839f, 0.003088f, 0.000665f, 0.008007f, 0.003158f, 0.000421f, -0.001757f, 0.005698f, -0.004744f, 0.010930f, -0.008893f, 0.013163f, -0.006594f, 0.007918f, 0.003837f, 0.004793f, 0.003511f, 0.019332f, 0.014469f, 0.000809f, -0.004608f, -0.010679f, 0.011079f, -0.012998f, 0.002758f, -0.005777f, 0.005174f, 0.012009f, 0.000941f, -0.020555f, -0.017094f, 0.001524f, -0.010879f, -0.011354f, -0.007061f, -0.013071f, 0.003926f, 0.022093f, 0.010483f, -0.008435f, -0.000246f, 0.002347f, -0.006670f, -0.006808f, -0.001990f, 0.010715f, 0.011175f, -0.013170f, 0.004953f, 0.014051f, 0.001309f, 0.004537f, 0.014652f, 0.003460f, 0.021470f, -0.001365f, -0.000794f, -0.006723f, -0.006418f, 0.007981f, 0.016150f, -0.004252f, 0.003922f, 0.001813f, 0.017565f, 0.008101f, -0.008871f, -0.007114f, 0.000728f, 0.004443f, 0.015959f, 0.016750f, 0.024054f, 0.005134f, 0.006403f, -0.003598f, 0.009587f, 0.012059f, -0.004781f, -0.004893f, 0.008438f, -0.006010f, -0.009716f, 0.009565f, 0.002339f, -0.010088f, -0.013614f, 0.021032f, 0.009878f, 0.000122f, 0.012665f, + 0.003344f, -0.009294f, 0.020062f, -0.004703f, 0.001443f, -0.000636f, 0.005865f, -0.007137f, 0.005884f, -0.007112f, 0.005771f, -0.006573f, 0.006823f, -0.005340f, 0.008970f, -0.006679f, -0.005842f, 0.018002f, -0.021411f, 0.001427f, 0.003701f, -0.007455f, 0.002572f, -0.024853f, -0.011276f, 0.012501f, -0.008898f, 0.008005f, -0.001484f, 0.005790f, 0.003443f, 0.005341f, 0.003972f, -0.009972f, 0.007540f, -0.004521f, 0.000661f, -0.017659f, -0.015634f, 0.000160f, 0.006451f, 0.012747f, -0.014830f, 0.004410f, -0.013356f, 0.011038f, 0.008052f, -0.017828f, -0.003989f, 0.002129f, -0.021397f, -0.011839f, 0.012605f, -0.001490f, -0.001188f, 0.003215f, -0.001611f, -0.021973f, 0.019952f, 0.001454f, -0.014628f, -0.006837f, 0.002391f, -0.001727f, -0.014088f, -0.004012f, -0.008237f, 0.002394f, -0.001019f, -0.004301f, 0.004080f, -0.019114f, -0.008880f, 0.005017f, 0.024730f, -0.004157f, -0.015124f, -0.010412f, -0.008605f, 0.017076f, -0.018607f, -0.003671f, -0.001694f, -0.019507f, -0.024686f, 0.005867f, -0.017276f, -0.002804f, 0.002000f, 0.012599f, 0.006601f, 0.000821f, 0.002183f, 0.014969f, -0.007225f, -0.005116f, + 0.021917f, -0.015541f, 0.011005f, -0.005717f, -0.006525f, -0.002956f, -0.003731f, 0.023329f, -0.000613f, 0.008379f, -0.026266f, -0.019307f, -0.001201f, -0.005294f, 0.025299f, -0.001512f, 0.015055f, 0.003694f, -0.029494f, 0.002611f, -0.002691f, 0.020093f, 0.002596f, -0.021794f, 0.025973f, 0.008053f, -0.014848f, -0.033342f, -0.013532f, 0.032503f, 0.001902f, -0.004366f, -0.005189f, 0.003165f, 0.001379f, 0.009892f, 0.005657f, 0.010619f, -0.002023f, 0.019123f, -0.009634f, -0.022943f, 0.001315f, 0.000879f, -0.005055f, -0.000999f, 0.008910f, -0.006011f, -0.003086f, -0.002146f, 0.018613f, 0.013971f, 0.007745f, -0.001499f, -0.024336f, -0.000631f, -0.000825f, -0.001186f, -0.003630f, -0.000554f, -0.010334f, -0.020369f, -0.002631f, 0.013747f, 0.014091f, -0.005255f, 0.015126f, -0.004863f, 0.006902f, 0.015791f, 0.015939f, -0.033940f, 0.012270f, 0.011956f, 0.005791f, -0.008468f, -0.028798f, 0.017677f, 0.011446f, 0.005425f, -0.009638f, -0.006264f, -0.010955f, 0.006204f, -0.012162f, -0.002976f, 0.001468f, 0.011446f, -0.006085f, 0.005351f, 0.005013f, -0.022698f, -0.000874f, -0.016046f, 0.026517f, 0.002835f, + 0.017857f, 0.023306f, 0.022506f, 0.018406f, 0.022035f, -0.028008f, -0.019470f, -0.009279f, -0.010059f, -0.013129f, -0.011293f, -0.022415f, -0.008599f, 0.002085f, 0.012871f, 0.000502f, -0.013994f, -0.000122f, 0.012824f, 0.001140f, -0.012232f, -0.004876f, 0.030233f, 0.003448f, 0.010783f, 0.003991f, 0.011926f, 0.002996f, 0.003213f, -0.018806f, 0.009699f, 0.001035f, 0.003417f, -0.019786f, 0.005915f, -0.030574f, -0.001068f, -0.009529f, 0.006565f, -0.002635f, -0.023626f, -0.000395f, -0.023544f, 0.004220f, -0.019779f, 0.017078f, -0.010827f, 0.026763f, -0.000364f, -0.000520f, 0.012251f, 0.002815f, -0.005486f, -0.004075f, 0.004179f, -0.009347f, 0.005015f, 0.016217f, 0.007116f, -0.012645f, -0.007775f, 0.034895f, 0.001338f, 0.027622f, -0.027539f, -0.006226f, -0.004173f, 0.019618f, -0.024222f, 0.002093f, 0.009549f, -0.024143f, 0.014538f, -0.016198f, 0.003003f, -0.009031f, -0.028271f, 0.003896f, 0.028167f, 0.020397f, 0.023026f, -0.008078f, -0.005657f, 0.005153f, -0.003802f, 0.027607f, 0.009547f, 0.012797f, 0.023823f, -0.002402f, 0.008908f, -0.016867f, 0.023627f, 0.011055f, -0.006046f, -0.015334f, + -0.013643f, 0.015014f, -0.027664f, 0.009812f, 0.015557f, -0.012444f, -0.015649f, -0.009776f, 0.014371f, 0.004444f, -0.006009f, -0.011192f, -0.000309f, -0.018117f, -0.026032f, 0.003387f, -0.025084f, -0.037721f, -0.005311f, 0.000038f, 0.036080f, -0.017352f, -0.013485f, 0.014928f, 0.026183f, 0.025639f, 0.013389f, -0.003300f, 0.005095f, -0.013454f, 0.000764f, -0.014097f, 0.028922f, 0.024930f, 0.015768f, -0.003207f, -0.032852f, -0.002257f, -0.028502f, 0.027118f, 0.020578f, 0.011865f, -0.024444f, 0.015801f, 0.007652f, 0.010097f, -0.007164f, -0.021274f, -0.017056f, -0.017628f, 0.001021f, -0.023716f, -0.043334f, 0.004994f, 0.019774f, 0.012334f, 0.012970f, 0.024893f, 0.048440f, 0.023883f, 0.015867f, 0.017939f, -0.032584f, -0.003203f, -0.012916f, 0.041277f, -0.041806f, -0.036475f, 0.009385f, 0.027551f, -0.002268f, 0.033328f, 0.027151f, 0.000356f, 0.009526f, -0.017230f, -0.015182f, 0.031811f, -0.013330f, 0.022422f, 0.005848f, -0.011588f, -0.008427f, -0.004127f, -0.008046f, -0.012132f, 0.010277f, 0.014307f, 0.009052f, 0.002831f, -0.016958f, -0.018192f, 0.024660f, -0.023656f, 0.018827f, 0.003780f, + -0.032756f, 0.017826f, 0.028803f, 0.001371f, -0.009337f, -0.001796f, 0.001300f, 0.003779f, 0.019391f, 0.001014f, -0.016440f, -0.004283f, 0.016446f, -0.029568f, 0.006748f, -0.003069f, 0.024978f, 0.029577f, 0.017427f, 0.023746f, 0.027409f, 0.022703f, 0.006782f, -0.015597f, -0.020997f, 0.012759f, 0.013434f, 0.002032f, 0.011797f, 0.019472f, 0.042967f, -0.020498f, 0.027557f, -0.011879f, -0.009419f, 0.034377f, 0.005287f, -0.032361f, -0.006888f, 0.020367f, -0.024847f, 0.001758f, -0.015956f, -0.025303f, 0.037397f, 0.033769f, 0.026494f, 0.014034f, 0.006279f, 0.011855f, 0.027268f, 0.016635f, 0.027992f, -0.009538f, 0.023327f, -0.017025f, 0.028436f, 0.040446f, 0.023838f, 0.020839f, 0.009228f, 0.021514f, 0.019670f, -0.004794f, 0.039899f, 0.011064f, -0.025235f, 0.012967f, -0.025527f, -0.015690f, -0.005786f, -0.037179f, -0.000025f, -0.006775f, -0.011139f, -0.017266f, -0.010420f, -0.003848f, -0.001853f, -0.002217f, 0.001041f, 0.003256f, -0.022771f, -0.012933f, 0.003987f, -0.009941f, 0.008614f, 0.039831f, -0.019730f, 0.000345f, -0.004157f, 0.003374f, -0.018688f, 0.011846f, -0.009216f, 0.031572f, + 0.005813f, 0.019831f, 0.027116f, 0.007076f, -0.002159f, -0.015629f, -0.040642f, 0.008018f, 0.029967f, 0.024715f, -0.005592f, -0.023786f, 0.023128f, 0.005875f, 0.014751f, -0.030442f, -0.022131f, -0.016903f, 0.016951f, -0.057326f, -0.036413f, -0.017531f, 0.041074f, 0.029664f, -0.021901f, 0.025435f, 0.023277f, 0.019592f, 0.019505f, -0.019187f, 0.002262f, 0.011111f, -0.018750f, -0.057560f, -0.010172f, -0.015900f, -0.034958f, 0.003315f, -0.011667f, -0.008883f, 0.011204f, 0.006619f, -0.007440f, 0.001928f, 0.027439f, 0.029153f, -0.052659f, 0.012942f, 0.003171f, 0.024928f, 0.008845f, 0.001745f, -0.032583f, 0.010551f, -0.007978f, -0.008682f, -0.022234f, -0.016359f, 0.043075f, -0.018699f, -0.000236f, 0.005753f, -0.010715f, 0.047816f, 0.022885f, -0.020128f, -0.012138f, -0.035920f, -0.004781f, 0.036204f, 0.010861f, 0.011756f, -0.011044f, 0.022730f, -0.004571f, -0.007919f, 0.020271f, -0.010205f, 0.033262f, -0.006002f, 0.024839f, -0.047908f, -0.016575f, 0.030797f, 0.007233f, -0.001975f, 0.008103f, -0.052025f, -0.026228f, 0.012286f, -0.022500f, 0.013630f, 0.001098f, 0.014137f, 0.030032f, 0.012813f, + -0.027351f, -0.069159f, -0.008519f, -0.006214f, -0.010212f, 0.013378f, -0.031032f, 0.058517f, -0.012720f, 0.004885f, 0.059406f, -0.070462f, -0.010076f, -0.011875f, -0.009457f, -0.081055f, 0.002130f, -0.010548f, -0.018669f, 0.030655f, -0.031201f, 0.006755f, 0.002899f, 0.015851f, -0.005213f, -0.028043f, 0.018195f, -0.017605f, 0.040732f, -0.005097f, -0.051806f, -0.001251f, -0.004329f, -0.022428f, -0.052224f, 0.024634f, 0.022495f, -0.039067f, 0.031113f, -0.035087f, -0.031949f, -0.015515f, 0.000459f, 0.005465f, 0.002738f, 0.026421f, -0.007428f, -0.020334f, -0.056926f, 0.013544f, -0.075968f, -0.036232f, -0.028107f, -0.055898f, -0.037701f, -0.014201f, -0.006685f, -0.024733f, 0.038685f, 0.045847f, 0.006386f, -0.010036f, 0.044304f, 0.024503f, -0.008646f, -0.007442f, 0.031000f, 0.028785f, -0.014805f, 0.049236f, -0.040911f, -0.014729f, 0.047025f, 0.029556f, 0.068218f, -0.026123f, -0.023580f, 0.015133f, -0.002873f, -0.026394f, -0.013223f, 0.006774f, 0.055809f, 0.031805f, -0.005014f, 0.075502f, -0.008494f, 0.031131f, -0.035341f, 0.044219f, 0.041741f, -0.003497f, -0.032939f, 0.003836f, 0.012412f, -0.018215f, + 0.020106f, -0.026700f, 0.000048f, -0.007867f, -0.008357f, -0.030295f, -0.021937f, -0.013448f, -0.001223f, -0.009351f, -0.023487f, 0.036648f, 0.025464f, 0.007422f, -0.009194f, 0.006946f, 0.035551f, 0.017185f, 0.026448f, 0.016965f, -0.017852f, -0.028278f, 0.060369f, -0.006643f, -0.031090f, -0.012294f, -0.012533f, -0.006446f, 0.044309f, 0.003233f, -0.031435f, -0.011111f, -0.080373f, -0.018591f, -0.007781f, 0.052327f, 0.036910f, -0.097856f, -0.040819f, -0.022200f, 0.001821f, 0.007264f, -0.037303f, 0.031793f, 0.018423f, 0.028232f, 0.053008f, -0.062455f, 0.067243f, 0.049275f, -0.017373f, -0.040326f, 0.006313f, -0.007114f, 0.020067f, 0.061536f, 0.051532f, 0.007737f, 0.018874f, -0.040136f, -0.065251f, 0.093731f, 0.045762f, 0.004828f, 0.005199f, -0.020377f, -0.055774f, 0.019773f, -0.005278f, 0.047520f, 0.009446f, 0.017938f, 0.050413f, 0.028974f, -0.001769f, -0.005045f, 0.007460f, -0.030985f, -0.027163f, -0.032986f, -0.020038f, 0.031340f, -0.009938f, 0.002357f, 0.037129f, -0.006248f, 0.015336f, -0.053330f, -0.049991f, -0.032353f, 0.026091f, 0.011757f, -0.003702f, 0.013197f, -0.019105f, -0.047881f, + 0.058861f, -0.057488f, 0.024447f, 0.028025f, 0.019314f, 0.010195f, 0.034418f, -0.023270f, -0.061924f, 0.044421f, 0.121427f, -0.021235f, 0.057125f, -0.071554f, -0.042158f, 0.045520f, 0.022821f, -0.066179f, -0.022449f, -0.004593f, 0.054529f, -0.013263f, -0.010282f, -0.089834f, -0.062848f, -0.019297f, -0.071424f, 0.058006f, 0.055127f, 0.096603f, -0.088136f, 0.038766f, 0.005930f, -0.042786f, -0.006256f, 0.002697f, -0.094118f, 0.018368f, -0.017424f, -0.084110f, -0.046150f, -0.002704f, -0.011611f, -0.028846f, 0.011074f, 0.025816f, 0.003750f, -0.030429f, -0.000515f, -0.029208f, 0.077406f, -0.024463f, 0.002708f, 0.056972f, -0.002309f, -0.060426f, -0.040423f, -0.041607f, -0.017075f, -0.022603f, 0.064599f, 0.005637f, 0.011405f, 0.030785f, -0.016571f, -0.018728f, -0.009835f, -0.019068f, -0.037995f, -0.010069f, 0.073823f, 0.022621f, 0.018149f, -0.049444f, 0.018668f, 0.002879f, -0.033819f, -0.004950f, -0.016616f, 0.078304f, -0.061994f, -0.054990f, -0.018446f, 0.008984f, -0.018103f, 0.001525f, 0.021892f, -0.042123f, -0.010639f, 0.066227f, -0.053712f, 0.008628f, -0.013276f, -0.033735f, -0.057181f, -0.044679f, + 0.002178f, -0.080708f, -0.096663f, 0.022089f, 0.019521f, 0.014691f, -0.086765f, 0.065851f, 0.080223f, -0.028232f, -0.024511f, 0.004388f, -0.004886f, -0.018753f, -0.046983f, 0.032318f, 0.118912f, 0.018728f, 0.021096f, -0.026167f, -0.069923f, 0.019619f, 0.027133f, -0.102959f, 0.056496f, 0.002837f, -0.029499f, 0.010346f, 0.037682f, -0.052922f, 0.032997f, -0.049071f, 0.013447f, -0.002320f, -0.024896f, -0.013293f, -0.006629f, -0.035877f, 0.026337f, 0.023565f, -0.000840f, 0.013339f, 0.001860f, 0.021004f, 0.026731f, 0.026348f, 0.038249f, 0.033394f, -0.019727f, 0.005958f, -0.040871f, 0.044758f, -0.033369f, 0.011713f, -0.005954f, 0.009967f, 0.002785f, -0.030224f, 0.029176f, -0.014729f, -0.029492f, 0.064680f, -0.049955f, 0.016518f, -0.013731f, -0.023913f, 0.026620f, -0.005206f, 0.008690f, 0.041040f, -0.046633f, 0.003511f, -0.057301f, -0.113752f, -0.001546f, 0.038569f, -0.012340f, 0.150287f, 0.031869f, -0.055906f, 0.018121f, -0.078628f, 0.030094f, 0.060370f, 0.070582f, -0.020690f, -0.010985f, -0.086661f, -0.100193f, -0.004685f, -0.060733f, 0.020637f, 0.000994f, -0.073766f, 0.015297f, -0.005494f, + -0.042812f, 0.019171f, -0.027765f, -0.018983f, -0.034543f, 0.017494f, -0.037630f, 0.048126f, -0.005040f, 0.017682f, -0.011043f, 0.064672f, -0.017537f, 0.035394f, -0.000483f, 0.042223f, -0.011757f, -0.021757f, 0.013987f, -0.024612f, -0.025545f, 0.003133f, 0.048480f, 0.030705f, -0.032780f, 0.034739f, -0.024540f, -0.038275f, 0.010829f, 0.051211f, -0.019712f, -0.021630f, 0.027865f, 0.011810f, -0.025542f, 0.002228f, 0.035437f, -0.015392f, -0.033583f, 0.017658f, 0.014414f, 0.020763f, 0.039962f, 0.007366f, -0.023545f, -0.008904f, 0.087464f, 0.090307f, -0.024822f, -0.076997f, 0.058589f, -0.026719f, 0.016949f, 0.006690f, 0.098657f, 0.011751f, -0.050178f, -0.020530f, -0.011543f, 0.000572f, 0.016058f, 0.021164f, 0.032865f, -0.040740f, 0.013310f, 0.005199f, 0.058173f, -0.018313f, 0.041654f, 0.037837f, 0.025931f, 0.013320f, 0.015672f, 0.021285f, 0.104900f, 0.041923f, -0.045097f, 0.009756f, -0.047156f, -0.027952f, -0.001712f, 0.016165f, -0.006121f, 0.036403f, -0.043393f, -0.002854f, 0.019527f, -0.002956f, 0.020278f, -0.004120f, 0.008312f, 0.002905f, -0.030450f, -0.011568f, 0.010409f, -0.031571f, + -0.028404f, 0.001140f, 0.009843f, -0.022861f, 0.017438f, 0.013408f, -0.006889f, -0.016586f, -0.000201f, 0.001849f, -0.003013f, 0.011291f, 0.005649f, 0.008569f, -0.010852f, -0.007135f, 0.026194f, -0.001497f, 0.003876f, 0.009874f, -0.004863f, 0.011054f, -0.009172f, -0.024018f, -0.011521f, 0.021453f, -0.015208f, -0.015239f, 0.004769f, -0.020015f, -0.016160f, 0.026258f, -0.024274f, 0.042505f, 0.013711f, -0.021796f, 0.023703f, 0.000882f, -0.028427f, 0.000519f, -0.000994f, -0.008332f, 0.021007f, -0.003287f, -0.013441f, 0.034767f, -0.016082f, -0.012245f, 0.027166f, 0.002379f, 0.000747f, -0.003594f, 0.017472f, -0.006052f, 0.015546f, -0.014826f, -0.061331f, -0.076410f, 0.064643f, 0.255690f, 0.101735f, 0.116660f, 0.002840f, -0.241708f, -0.175881f, -0.093779f, -0.139895f, 0.062143f, 0.122815f, 0.048944f, 0.216153f, 0.120416f, -0.006797f, 0.049332f, -0.107341f, -0.220341f, -0.086153f, -0.153398f, -0.023010f, 0.104301f, 0.090188f, 0.079268f, 0.135287f, 0.081477f, 0.024094f, 0.035636f, -0.008587f, -0.157112f, -0.067515f, -0.057326f, -0.214054f, 0.038811f, 0.029699f, -0.096846f, 0.156688f, 0.152446f, + -0.003739f, 0.193189f, 0.097091f, -0.091429f, 0.061871f, -0.090902f, -0.185197f, -0.015973f, -0.111191f, -0.164620f, 0.030581f, 0.016336f, -0.008013f, 0.151266f, 0.148785f, 0.086630f, 0.132720f, 0.078370f, -0.048905f, -0.058482f, -0.099883f, -0.175871f, -0.126729f, -0.062641f, -0.055287f, 0.030257f, 0.101273f, 0.066404f, 0.111310f, 0.162754f, 0.067042f, -0.022337f, -0.016383f, -0.113698f, -0.085707f, 0.009021f, -0.091341f, -0.033725f, 0.034008f, -0.006870f}, + {-0.004815f, -0.012030f, -0.003493f, 0.003523f, 0.000648f, 0.003820f, 0.003430f, 0.010792f, -0.002005f, -0.000496f, -0.001213f, -0.007813f, -0.006263f, 0.001472f, 0.001259f, -0.000511f, 0.003768f, -0.011457f, -0.006803f, -0.006586f, 0.003937f, -0.000119f, -0.001678f, -0.002020f, -0.002006f, 0.001805f, 0.002673f, -0.000696f, -0.001486f, 0.004034f, -0.006424f, 0.006509f, 0.004412f, -0.002411f, -0.005353f, -0.001064f, -0.007872f, -0.003369f, -0.011053f, 0.004511f, 0.004142f, -0.000701f, 0.002402f, -0.007214f, 0.006526f, -0.000140f, -0.001093f, 0.005229f, -0.007272f, 0.000231f, 0.006156f, 0.001572f, -0.001687f, 0.000460f, 0.000874f, -0.006669f, 0.005189f, -0.001173f, 0.006411f, 0.000705f, 0.001663f, 0.001246f, 0.002054f, -0.003880f, -0.004502f, -0.004502f, 0.003448f, -0.002734f, 0.000660f, 0.007686f, 0.010107f, 0.005773f, -0.001024f, 0.002362f, -0.000045f, 0.000139f, 0.000914f, 0.006491f, -0.008799f, -0.007006f, -0.001307f, 0.006949f, 0.010028f, -0.004686f, 0.005815f, -0.003193f, -0.008525f, -0.002233f, -0.004811f, 0.002847f, -0.001263f, -0.003998f, 0.003628f, 0.005743f, 0.001161f, 0.006926f, + -0.012668f, -0.013493f, -0.008833f, 0.001336f, -0.000153f, -0.002247f, 0.000531f, 0.004214f, -0.001485f, 0.005665f, 0.004488f, -0.005855f, 0.002118f, -0.000371f, 0.007100f, 0.006752f, 0.002371f, -0.007024f, 0.004499f, -0.004154f, 0.002205f, 0.004732f, -0.011507f, 0.012467f, 0.018021f, 0.002462f, 0.008062f, -0.006619f, -0.001547f, -0.006205f, -0.003473f, 0.005726f, -0.002099f, -0.006412f, -0.001953f, -0.003997f, 0.002893f, -0.003889f, -0.003891f, 0.000480f, 0.003049f, -0.003185f, -0.004039f, -0.001477f, 0.006140f, 0.005987f, -0.005276f, -0.001612f, -0.006208f, 0.001584f, 0.007237f, 0.002461f, -0.003321f, -0.003191f, 0.002290f, -0.000169f, -0.005899f, 0.027888f, 0.012990f, -0.001074f, 0.005970f, 0.005221f, -0.006603f, -0.003391f, 0.007877f, 0.003434f, 0.008566f, -0.006238f, 0.012405f, 0.004522f, -0.012005f, 0.009531f, 0.000635f, -0.000309f, -0.006274f, 0.006953f, -0.012980f, -0.011336f, -0.002279f, -0.004086f, -0.002043f, -0.004102f, 0.001655f, -0.002522f, -0.005310f, -0.004022f, 0.004706f, -0.005057f, 0.003335f, 0.001934f, 0.001431f, -0.005571f, 0.007871f, -0.016214f, -0.002675f, -0.000163f, + -0.002658f, -0.002101f, 0.001568f, 0.002941f, -0.004992f, 0.004047f, -0.006079f, 0.005934f, 0.002105f, 0.001246f, 0.006409f, -0.004434f, -0.000820f, 0.002444f, 0.009937f, 0.002335f, 0.004333f, -0.002296f, -0.008114f, -0.011804f, 0.002483f, 0.006316f, 0.008684f, -0.003470f, -0.012723f, 0.001897f, -0.004900f, -0.003716f, -0.002486f, 0.003588f, 0.001054f, 0.012787f, 0.000462f, 0.004265f, 0.003655f, -0.002025f, -0.001600f, -0.003773f, 0.015081f, 0.003521f, -0.012721f, -0.014419f, 0.003984f, -0.004358f, -0.011930f, 0.013646f, -0.006622f, -0.002145f, -0.001793f, 0.010744f, 0.002316f, -0.006067f, 0.007562f, -0.005672f, 0.011398f, -0.015479f, -0.010193f, 0.012593f, -0.012855f, -0.012934f, -0.005124f, 0.010818f, 0.004808f, 0.005293f, -0.001087f, 0.009747f, 0.005944f, -0.000753f, -0.012394f, 0.003657f, -0.003298f, 0.004801f, 0.004207f, 0.003723f, 0.011149f, 0.003244f, -0.010517f, 0.001330f, 0.007748f, 0.011367f, 0.003982f, -0.005632f, -0.001134f, -0.008464f, 0.004108f, -0.015310f, -0.000289f, 0.017516f, 0.001260f, 0.002355f, -0.008365f, -0.010239f, 0.002050f, 0.002980f, 0.012938f, -0.002052f, + 0.001519f, 0.002055f, -0.001383f, 0.002096f, 0.004663f, 0.001640f, 0.009343f, -0.001390f, 0.006422f, 0.001997f, 0.002193f, 0.002363f, 0.010989f, 0.001976f, -0.000746f, 0.003832f, -0.001500f, -0.033987f, -0.023331f, -0.004272f, 0.003115f, 0.006324f, -0.000049f, 0.000720f, -0.013857f, -0.000027f, -0.003478f, -0.001400f, -0.000281f, -0.002528f, -0.002077f, -0.008926f, 0.004554f, -0.019713f, -0.008043f, 0.002773f, -0.004625f, -0.005345f, -0.004073f, -0.010743f, -0.006390f, -0.003856f, -0.005986f, 0.003643f, -0.009478f, -0.003912f, 0.010878f, 0.008452f, 0.000413f, 0.006558f, 0.003647f, -0.002492f, -0.007837f, 0.005709f, 0.016528f, 0.003183f, 0.001864f, -0.005299f, -0.006133f, 0.006312f, -0.014570f, -0.006232f, 0.015795f, -0.013097f, 0.004287f, -0.001933f, -0.007434f, 0.004980f, 0.001031f, -0.002372f, 0.000941f, 0.004213f, -0.005006f, 0.001903f, -0.000910f, 0.011797f, 0.008870f, 0.003367f, 0.002555f, 0.006483f, -0.000017f, 0.000463f, -0.003044f, -0.017654f, 0.010244f, 0.008951f, -0.004956f, 0.002956f, -0.007777f, 0.001354f, 0.002065f, -0.001762f, 0.003842f, -0.001599f, -0.029359f, 0.003997f, + 0.007624f, -0.002523f, -0.002045f, -0.017238f, -0.006220f, 0.003891f, -0.014259f, -0.014870f, 0.003444f, -0.014190f, -0.006424f, -0.001040f, -0.007638f, 0.003894f, -0.005926f, 0.009414f, -0.004861f, -0.004241f, 0.003671f, 0.006346f, 0.013567f, 0.007443f, -0.014170f, -0.001555f, -0.000659f, 0.006432f, 0.011213f, 0.017575f, -0.007766f, -0.008007f, 0.009890f, -0.010827f, 0.002686f, 0.002072f, 0.015851f, 0.004872f, 0.008979f, -0.012363f, -0.004799f, -0.016584f, 0.012752f, 0.012225f, 0.015271f, -0.001070f, -0.002983f, -0.010890f, -0.001885f, 0.009255f, -0.004477f, -0.007309f, -0.005787f, -0.008720f, 0.001866f, 0.001040f, 0.002506f, -0.011605f, -0.000027f, -0.011368f, -0.000475f, -0.002339f, 0.004392f, 0.003010f, -0.003185f, -0.005471f, -0.013361f, -0.001382f, -0.001021f, 0.007765f, -0.005111f, 0.013370f, -0.007715f, 0.001528f, 0.006589f, 0.012485f, -0.009211f, 0.001095f, 0.036319f, 0.032552f, -0.001913f, 0.001699f, 0.015764f, 0.003003f, 0.007318f, -0.004219f, 0.008290f, -0.006261f, 0.015902f, 0.006446f, -0.000776f, 0.004132f, 0.000356f, 0.021855f, 0.013457f, -0.013146f, -0.012364f, 0.005200f, + 0.001404f, -0.003741f, -0.003848f, 0.003375f, 0.009290f, 0.008214f, 0.003773f, 0.001768f, 0.004489f, -0.002854f, -0.001149f, 0.012315f, -0.013674f, 0.005799f, 0.014664f, 0.012322f, 0.020248f, -0.001432f, -0.004122f, -0.001203f, 0.000419f, -0.006117f, 0.022055f, 0.021686f, 0.014117f, -0.006391f, -0.003038f, 0.009560f, 0.006346f, -0.005839f, 0.000475f, 0.012633f, -0.005477f, -0.005083f, 0.006692f, -0.021795f, -0.003583f, 0.001755f, 0.002293f, -0.007069f, -0.015600f, 0.006419f, 0.008991f, -0.011470f, -0.005418f, -0.012570f, 0.003835f, 0.001171f, -0.003668f, -0.002638f, -0.012160f, 0.018830f, -0.005738f, 0.002153f, -0.019682f, -0.005627f, -0.008456f, 0.024243f, -0.000779f, 0.015243f, 0.021243f, -0.011342f, -0.025827f, 0.000874f, 0.019881f, -0.015517f, 0.013984f, -0.004370f, -0.018695f, -0.008930f, 0.019013f, -0.018760f, -0.016256f, 0.011611f, -0.018824f, 0.005996f, 0.009040f, 0.007099f, -0.005335f, 0.011113f, 0.003226f, 0.001814f, 0.007341f, -0.012406f, 0.016400f, 0.007725f, 0.007084f, -0.003771f, -0.001906f, 0.030239f, -0.010819f, 0.001492f, 0.007859f, 0.014987f, -0.021086f, -0.017692f, + -0.016226f, 0.000156f, 0.001002f, -0.001559f, 0.009536f, 0.002529f, 0.017161f, 0.006477f, 0.009928f, -0.002190f, 0.001063f, -0.009179f, 0.015216f, -0.007647f, 0.014967f, -0.009002f, -0.013646f, 0.022154f, 0.018077f, -0.026951f, -0.023675f, -0.015976f, -0.012476f, 0.007468f, 0.000679f, -0.006164f, 0.011373f, 0.012409f, -0.016772f, 0.008430f, -0.002181f, -0.033058f, -0.011574f, -0.017276f, -0.015765f, 0.004356f, -0.006198f, -0.014356f, -0.018958f, 0.011178f, -0.010696f, -0.008704f, -0.006462f, -0.023103f, -0.001893f, 0.009588f, -0.005635f, -0.001871f, -0.007780f, 0.018120f, 0.003354f, 0.011352f, 0.009534f, -0.015530f, 0.015890f, 0.022564f, -0.006606f, -0.009959f, 0.002949f, -0.004544f, 0.010431f, -0.029092f, 0.011397f, 0.024184f, -0.002834f, -0.008647f, -0.006600f, 0.010194f, 0.022593f, -0.005824f, 0.006030f, -0.010462f, 0.015604f, -0.018875f, -0.006587f, 0.002956f, -0.002447f, -0.014802f, 0.026529f, 0.017795f, 0.014189f, -0.006460f, -0.019307f, -0.003084f, -0.027602f, 0.004150f, -0.001688f, -0.001597f, -0.000257f, -0.004947f, 0.015461f, 0.012076f, -0.019153f, 0.010068f, -0.011389f, 0.015238f, + -0.001269f, -0.004138f, -0.001175f, -0.017956f, -0.003149f, -0.016527f, -0.034350f, -0.002636f, 0.003965f, 0.001553f, -0.013379f, -0.001714f, -0.004120f, -0.027061f, -0.000054f, 0.020833f, -0.014961f, 0.004290f, -0.036138f, 0.002578f, 0.021045f, 0.011555f, -0.016451f, -0.013304f, 0.026415f, 0.006192f, 0.005966f, -0.005092f, 0.006878f, -0.000142f, -0.017594f, -0.004456f, -0.018468f, 0.008937f, -0.010959f, -0.001502f, -0.017966f, -0.019792f, -0.026771f, 0.017051f, 0.011482f, -0.008375f, -0.009447f, 0.007827f, -0.024539f, -0.001958f, 0.002022f, 0.006285f, 0.011024f, 0.005647f, 0.000878f, -0.008170f, 0.003786f, -0.007443f, 0.006718f, -0.007093f, 0.004514f, 0.002750f, -0.007602f, -0.009659f, -0.019124f, -0.012232f, 0.005124f, -0.032447f, -0.008770f, 0.018732f, 0.009875f, -0.003323f, 0.043341f, -0.005531f, 0.020199f, 0.020517f, -0.031198f, 0.002873f, -0.003965f, -0.025646f, -0.013690f, -0.013637f, 0.000629f, 0.004163f, 0.029922f, -0.003638f, 0.002945f, 0.021469f, 0.014988f, -0.002102f, 0.020020f, -0.007932f, -0.007623f, -0.011590f, -0.018296f, -0.023743f, -0.010692f, 0.017696f, -0.028997f, 0.003120f, + 0.023803f, -0.003248f, 0.007005f, -0.011030f, 0.006178f, 0.011533f, -0.007309f, 0.010051f, -0.014681f, -0.013928f, 0.022119f, 0.013756f, 0.013986f, 0.019598f, -0.000941f, -0.013852f, 0.019046f, -0.016121f, -0.024204f, 0.001655f, 0.021152f, -0.001802f, -0.019778f, 0.003981f, 0.025074f, -0.002307f, 0.006363f, 0.003950f, 0.035519f, 0.003775f, 0.007065f, 0.019397f, -0.002941f, -0.007690f, -0.018002f, 0.004056f, -0.003034f, -0.015033f, -0.000062f, -0.008134f, 0.006068f, 0.026303f, -0.000318f, -0.013019f, -0.004935f, -0.011887f, -0.007832f, -0.000230f, -0.006297f, 0.005296f, -0.018793f, 0.021709f, -0.010847f, 0.035340f, -0.008815f, -0.021939f, 0.000964f, 0.003464f, 0.011388f, 0.007425f, 0.005990f, -0.022258f, -0.020457f, 0.017137f, -0.021294f, -0.026335f, 0.007935f, 0.008724f, -0.007105f, 0.034606f, -0.026257f, -0.032152f, 0.012267f, -0.020754f, 0.000261f, 0.001429f, -0.019239f, 0.010600f, 0.001139f, 0.026224f, 0.027681f, 0.039754f, 0.018235f, 0.008299f, 0.005541f, 0.012961f, -0.013574f, 0.014986f, -0.024072f, 0.011459f, -0.002402f, -0.002320f, -0.046150f, -0.018150f, -0.007642f, 0.015341f, + -0.002061f, 0.003414f, 0.004892f, 0.003743f, -0.023674f, 0.023890f, -0.001053f, 0.009390f, 0.000667f, 0.022165f, -0.024599f, 0.016351f, -0.012184f, -0.001284f, 0.018250f, -0.021693f, -0.009545f, -0.023641f, -0.009282f, -0.026307f, 0.022914f, 0.016007f, 0.030845f, -0.002611f, 0.007111f, -0.029490f, 0.006191f, -0.030640f, 0.028245f, 0.006648f, -0.004917f, 0.025448f, 0.027257f, 0.012371f, -0.016738f, -0.026405f, -0.035646f, -0.003661f, -0.012861f, -0.020131f, 0.018775f, -0.007890f, 0.044196f, -0.036010f, -0.012517f, 0.022130f, -0.027131f, -0.014498f, 0.005529f, -0.004173f, -0.004610f, -0.031229f, 0.010719f, -0.003082f, -0.015297f, 0.000936f, 0.007868f, 0.006318f, 0.040930f, -0.009035f, 0.005214f, -0.001819f, -0.014378f, 0.018979f, -0.007563f, 0.007206f, 0.001440f, 0.026936f, -0.009242f, 0.031317f, -0.000375f, 0.015645f, 0.012805f, -0.002347f, -0.011085f, -0.030245f, 0.013335f, 0.031545f, 0.000550f, -0.000265f, 0.020727f, 0.018462f, -0.002566f, 0.003265f, 0.036270f, 0.023302f, -0.008144f, 0.007894f, 0.023284f, -0.006569f, -0.028815f, 0.000242f, -0.021395f, -0.003610f, -0.014199f, 0.000609f, + -0.039508f, -0.011922f, -0.015549f, -0.000066f, 0.006063f, 0.007172f, 0.034848f, 0.039777f, 0.019405f, -0.029107f, -0.018736f, 0.021770f, 0.029807f, 0.005585f, -0.031663f, -0.006135f, -0.009457f, -0.032001f, -0.021962f, -0.024743f, 0.025406f, -0.012366f, 0.000810f, -0.030763f, 0.038507f, 0.028589f, -0.007095f, 0.010154f, 0.065402f, -0.006558f, -0.018790f, -0.030367f, -0.006977f, 0.013749f, 0.007829f, -0.017480f, 0.010118f, -0.019958f, -0.027903f, 0.036897f, -0.022341f, 0.027326f, -0.019362f, -0.034221f, 0.003689f, 0.038328f, 0.028112f, -0.031910f, -0.017820f, 0.004858f, 0.008104f, 0.011631f, -0.000193f, 0.024915f, 0.016526f, 0.033485f, -0.010756f, -0.007944f, 0.000945f, -0.008861f, -0.031987f, -0.027190f, -0.005670f, 0.033726f, 0.009671f, 0.000854f, 0.003466f, -0.035193f, -0.035590f, -0.031189f, 0.017418f, 0.015378f, -0.010635f, -0.010431f, 0.005645f, 0.002238f, -0.017832f, 0.003973f, 0.040026f, 0.004778f, 0.025994f, 0.021376f, 0.019104f, 0.038624f, 0.060473f, 0.017299f, 0.003525f, 0.006634f, 0.025460f, -0.013787f, -0.003834f, 0.013761f, -0.002567f, 0.006637f, -0.002644f, 0.023490f, + 0.011663f, 0.016239f, -0.002071f, -0.008106f, 0.015667f, 0.032096f, 0.000604f, -0.028726f, 0.020716f, -0.044131f, -0.046520f, -0.018136f, 0.029217f, -0.017580f, -0.045595f, -0.030893f, -0.008504f, 0.017305f, 0.015597f, -0.069322f, 0.003685f, 0.035435f, -0.006512f, -0.007984f, 0.042789f, -0.022591f, -0.023597f, -0.029795f, -0.009878f, -0.009752f, -0.019934f, 0.006472f, 0.010034f, 0.017045f, 0.011929f, -0.009029f, -0.007281f, -0.002718f, -0.008147f, 0.003616f, 0.008496f, 0.035623f, -0.014423f, -0.044211f, 0.024658f, 0.001136f, -0.000728f, -0.036489f, 0.017374f, 0.008363f, -0.003176f, 0.043874f, -0.011468f, 0.005874f, -0.003142f, 0.020143f, 0.023599f, -0.023615f, -0.001530f, -0.012563f, -0.000645f, 0.014324f, -0.008413f, 0.021200f, -0.029413f, -0.023756f, -0.014957f, -0.025405f, -0.003513f, 0.004388f, 0.005502f, -0.036055f, -0.023685f, 0.020244f, 0.032104f, -0.012346f, -0.015719f, 0.018495f, -0.033331f, -0.029109f, -0.029011f, 0.036199f, -0.055099f, 0.021147f, -0.001428f, -0.030583f, -0.009025f, 0.031241f, 0.073726f, -0.006542f, -0.018310f, 0.026940f, 0.056733f, 0.022882f, -0.011531f, 0.012954f, + -0.007376f, -0.035861f, -0.065571f, -0.000414f, 0.068271f, -0.008235f, -0.008344f, -0.044051f, -0.006798f, 0.000057f, 0.001692f, 0.018856f, -0.001081f, 0.016226f, -0.002304f, 0.002456f, -0.036917f, 0.008036f, 0.027400f, -0.017443f, 0.034757f, -0.012759f, -0.005608f, -0.030422f, 0.018324f, -0.013497f, -0.014176f, -0.035575f, -0.055988f, 0.030252f, -0.029016f, -0.021983f, 0.005952f, 0.008783f, -0.014659f, 0.005994f, 0.026530f, -0.005421f, -0.031816f, -0.014217f, -0.039824f, -0.000955f, 0.007063f, 0.028816f, 0.001791f, -0.003816f, -0.009662f, -0.011424f, 0.005314f, 0.029996f, 0.000874f, -0.012567f, 0.026335f, -0.024622f, -0.000484f, -0.045166f, -0.018105f, -0.005415f, 0.057050f, -0.033953f, 0.008674f, -0.007817f, 0.004157f, -0.002133f, -0.010704f, 0.006488f, 0.020635f, 0.013302f, -0.049020f, 0.055777f, 0.010631f, 0.025160f, 0.001718f, -0.010296f, -0.019737f, 0.007687f, -0.031543f, -0.017410f, 0.065590f, -0.007394f, 0.004953f, -0.033587f, 0.030312f, -0.016977f, 0.022172f, -0.017137f, 0.039398f, 0.004894f, 0.003516f, -0.018508f, -0.016455f, 0.024218f, 0.051217f, -0.020615f, -0.032123f, 0.015844f, + -0.012995f, 0.035128f, 0.042571f, 0.022276f, -0.007058f, 0.027708f, -0.018316f, -0.015460f, 0.035651f, 0.050950f, -0.056442f, 0.005651f, 0.007723f, 0.010548f, -0.019518f, -0.000209f, 0.021916f, -0.055322f, 0.016316f, 0.034123f, 0.011750f, -0.023958f, -0.007625f, 0.041673f, 0.032475f, 0.012219f, -0.019792f, -0.023693f, -0.049602f, 0.070918f, 0.011840f, 0.037081f, -0.006024f, -0.013568f, 0.006957f, 0.022152f, -0.000235f, 0.000197f, -0.057720f, 0.010143f, 0.052550f, -0.008193f, 0.050242f, -0.029384f, -0.015000f, -0.020031f, 0.010682f, 0.049752f, -0.016649f, 0.000113f, 0.042025f, 0.054876f, -0.019330f, -0.037392f, -0.037080f, -0.028713f, 0.027412f, 0.018318f, 0.047543f, -0.015194f, 0.034677f, -0.018995f, -0.006175f, 0.030128f, -0.000148f, 0.041460f, -0.050661f, 0.031007f, 0.006733f, 0.013013f, -0.019914f, 0.014254f, 0.039237f, 0.073340f, -0.016450f, 0.017510f, -0.000314f, -0.051152f, 0.046195f, 0.003010f, 0.018465f, -0.010724f, -0.022567f, -0.010349f, -0.001267f, -0.021035f, -0.011488f, 0.061634f, 0.005035f, 0.022496f, -0.017589f, 0.043009f, 0.000814f, 0.019768f, 0.009777f, -0.028461f, + -0.005070f, -0.018455f, 0.001026f, 0.005834f, 0.053740f, 0.024692f, 0.002790f, 0.003840f, -0.001330f, -0.006984f, 0.009294f, 0.002648f, 0.033918f, 0.024371f, 0.014292f, -0.018706f, 0.023820f, 0.045702f, -0.045211f, 0.039596f, 0.007669f, 0.009679f, -0.045243f, -0.025156f, -0.056942f, -0.050106f, -0.007970f, 0.027929f, 0.027591f, -0.083658f, 0.001339f, -0.039250f, 0.021589f, 0.077996f, 0.043838f, -0.051944f, 0.033406f, 0.020115f, 0.026929f, -0.068360f, -0.102909f, -0.028010f, -0.010888f, -0.026567f, 0.006542f, 0.034039f, -0.035792f, 0.051832f, 0.020071f, -0.077068f, -0.057651f, -0.012684f, 0.042349f, 0.000520f, 0.004198f, -0.008942f, -0.023425f, -0.074633f, 0.003707f, -0.062855f, -0.050614f, 0.024171f, 0.020586f, 0.017234f, -0.008057f, -0.024946f, 0.056398f, 0.032527f, -0.023133f, -0.049182f, 0.037378f, 0.017735f, 0.009176f, -0.023578f, -0.056060f, 0.020650f, -0.026110f, 0.007671f, -0.047758f, 0.057749f, 0.001801f, -0.024176f, 0.006016f, 0.014046f, 0.048528f, 0.029548f, -0.012158f, -0.002978f, 0.017060f, 0.016239f, 0.018698f, -0.011386f, -0.075465f, -0.059668f, 0.011986f, -0.008333f, + 0.044105f, -0.008482f, -0.019118f, -0.053090f, 0.061664f, 0.024164f, -0.043407f, -0.043786f, 0.063147f, 0.060592f, -0.000990f, 0.045241f, -0.006187f, 0.003764f, -0.018305f, -0.007821f, -0.034095f, 0.005276f, 0.036886f, 0.003052f, -0.025131f, -0.066387f, 0.104375f, 0.002101f, -0.079837f, -0.006600f, -0.029403f, 0.013064f, 0.040370f, 0.035683f, -0.044192f, -0.072258f, 0.012760f, -0.034865f, 0.011450f, -0.007534f, 0.032137f, -0.010927f, 0.005037f, 0.018239f, -0.028788f, -0.036489f, 0.004316f, 0.008869f, 0.031836f, -0.001288f, -0.049573f, 0.032375f, -0.027412f, 0.025311f, -0.023751f, -0.017131f, -0.002194f, -0.008559f, -0.053314f, 0.009498f, 0.015603f, -0.052709f, 0.022590f, -0.021116f, 0.011004f, -0.018042f, 0.050893f, 0.038492f, -0.050140f, -0.027632f, 0.035254f, 0.042691f, -0.051297f, 0.067779f, 0.005077f, 0.054399f, 0.040742f, 0.064300f, -0.019480f, -0.028498f, 0.015305f, -0.054945f, 0.008955f, 0.005865f, 0.095605f, -0.030448f, -0.088448f, 0.149460f, -0.070378f, -0.055924f, 0.087590f, 0.037910f, -0.049854f, 0.082967f, 0.010207f, -0.070028f, 0.086372f, -0.092971f, 0.012412f, 0.028551f, + -0.070687f, 0.032637f, 0.018028f, -0.024063f, -0.007546f, -0.000692f, -0.017742f, -0.005099f, -0.010629f, -0.030724f, 0.000314f, -0.015042f, -0.004017f, -0.007114f, 0.014649f, 0.056445f, 0.046169f, -0.042521f, -0.005380f, 0.059389f, -0.010938f, -0.010426f, -0.060796f, 0.007579f, 0.019057f, -0.009193f, 0.050531f, 0.123511f, -0.042074f, -0.051102f, 0.086684f, -0.005149f, -0.047988f, 0.055289f, 0.035064f, -0.027585f, -0.043289f, -0.051617f, 0.014988f, 0.028860f, -0.024372f, 0.083209f, 0.052653f, -0.101984f, -0.099854f, 0.058353f, -0.047734f, -0.059264f, 0.076582f, 0.013445f, 0.102865f, 0.051032f, -0.014365f, -0.013100f, -0.077219f, -0.057778f, 0.169403f, 0.048347f, -0.039149f, -0.081975f, -0.000358f, -0.032787f, -0.077187f, -0.010528f, 0.083268f, 0.037933f, -0.003121f, 0.072395f, 0.057360f, -0.019062f, -0.086002f, 0.012762f, 0.039255f, -0.018614f, 0.094910f, 0.075532f, -0.018773f, 0.053140f, 0.007644f, -0.044592f, 0.029342f, 0.045129f, 0.017712f, 0.018459f, -0.059521f, -0.014398f, 0.009275f, 0.010587f, -0.006974f, -0.055400f, -0.017162f, 0.017423f, -0.010883f, -0.007581f, -0.043100f, 0.067617f, + 0.010934f, -0.059290f, 0.034765f, 0.079679f, -0.039809f, -0.026524f, 0.014310f, 0.024918f, -0.023911f, -0.053444f, 0.046566f, 0.072165f, -0.003413f, -0.031319f, 0.012244f, 0.018849f, 0.036492f, 0.045340f, 0.005878f, 0.084300f, 0.000891f, -0.098789f, 0.003670f, -0.013292f, 0.034470f, -0.012614f, -0.075619f, -0.004798f, -0.030771f, -0.035945f, 0.050635f, 0.021989f, 0.030474f, 0.030942f, -0.066893f, -0.040102f, -0.008530f, -0.004346f, 0.032573f, -0.002662f, -0.010099f, -0.001987f, -0.019535f, -0.052470f, 0.009656f, 0.069916f, -0.033006f, 0.001525f, -0.023811f, -0.028041f, 0.058148f, -0.071282f, 0.007888f, 0.015772f, -0.009225f, -0.011078f, -0.079542f, -0.116634f, -0.101338f, 0.204123f, 0.196730f, 0.194223f, 0.552993f, 0.194635f, -0.022485f, 0.034508f, -0.381967f, -0.467425f, -0.156441f, -0.263368f, -0.362156f, 0.044113f, -0.020535f, -0.063181f, 0.397912f, 0.240446f, 0.100788f, 0.619356f, 0.292811f, 0.051078f, 0.282545f, -0.070782f, -0.340066f, -0.327997f, -0.310611f, -0.432107f, -0.421090f, -0.102662f, -0.153451f, -0.251312f, 0.285836f, 0.127954f, -0.106453f, 0.411150f, 0.131508f, -0.054291f, + 0.467375f, 0.423022f, 0.095196f, 0.438828f, 0.447559f, -0.023871f, 0.107792f, 0.044110f, -0.439294f, -0.511932f, -0.380903f, -0.718178f, -0.678274f, -0.412559f, -0.545771f, -0.415123f, 0.038992f, 0.323505f, 0.370826f, 0.802518f, 0.731039f, 0.640207f, 0.693107f, 0.505114f, 0.252380f, 0.065739f, -0.069184f, -0.412250f, -0.491157f, -0.529252f, -0.591486f, -0.566764f, -0.482971f, -0.322901f, -0.235435f, -0.231873f, 0.044245f, 0.151184f, 0.139509f, 0.037178f} + }, + { + {0.004483f, 0.000450f, 0.005038f, -0.005236f, -0.008966f, -0.000363f, -0.006137f, -0.000559f, -0.001617f, -0.014172f, -0.011481f, -0.002036f, -0.004621f, 0.005652f, -0.002490f, 0.002602f, 0.003160f, 0.001222f, -0.002197f, -0.000082f, -0.005336f, 0.000321f, 0.005810f, 0.003438f, -0.002742f, 0.000153f, 0.003075f, -0.007659f, -0.002381f, 0.000583f, 0.003113f, -0.003223f, -0.007313f, -0.001907f, -0.007217f, 0.001098f, -0.003060f, -0.003042f, 0.003423f, -0.003806f, 0.002888f, 0.001527f, 0.001916f, -0.005876f, 0.001814f, 0.000347f, 0.003129f, -0.005072f, 0.002962f, 0.002324f, 0.004674f, -0.001255f, 0.005972f, 0.002901f, 0.006067f, 0.003402f, -0.004883f, -0.002553f, 0.011785f, 0.001404f, -0.001600f, 0.000823f, -0.000097f, 0.006905f, 0.000223f, -0.003881f, -0.001887f, 0.007976f, -0.003527f, -0.001704f, -0.008453f, -0.000868f, -0.003145f, 0.003394f, -0.000705f, -0.000875f, -0.003615f, -0.007178f, 0.026073f, 0.013275f, 0.011672f, 0.005963f, -0.002420f, -0.001182f, -0.002339f, -0.005743f, -0.007146f, -0.005656f, -0.007318f, -0.003618f, 0.007500f, 0.002048f, -0.000120f, -0.000438f, 0.004989f, 0.001764f, + -0.002761f, -0.003684f, -0.002203f, -0.013890f, 0.005781f, 0.000925f, 0.000339f, -0.003265f, 0.001940f, -0.000274f, -0.003522f, 0.001410f, 0.005091f, -0.000562f, -0.005961f, -0.002120f, -0.002492f, -0.003430f, 0.000902f, 0.005308f, -0.001393f, 0.000777f, -0.006891f, 0.003865f, -0.008554f, 0.004861f, 0.001327f, -0.000362f, 0.000160f, 0.004778f, -0.006573f, -0.005689f, -0.008999f, 0.001625f, 0.001691f, -0.000374f, 0.005226f, -0.006458f, 0.001247f, -0.001678f, 0.000179f, -0.005048f, 0.003615f, 0.000608f, -0.002990f, 0.004481f, -0.008901f, 0.002883f, -0.004845f, 0.007770f, 0.004179f, 0.000134f, 0.000733f, -0.003477f, -0.010940f, 0.006536f, -0.002191f, 0.024142f, 0.012182f, 0.015605f, 0.004865f, 0.005008f, -0.000466f, 0.005833f, 0.001130f, 0.005136f, -0.003645f, 0.010443f, -0.002287f, -0.012893f, -0.002932f, -0.000191f, 0.001167f, -0.004397f, 0.010031f, 0.000084f, 0.004219f, 0.008780f, 0.005009f, -0.000336f, 0.000486f, 0.001757f, -0.007911f, -0.006006f, 0.003852f, 0.003574f, -0.002550f, 0.000439f, 0.004631f, -0.008786f, 0.012291f, -0.001648f, 0.002261f, -0.002308f, 0.004902f, 0.005630f, + 0.000841f, -0.006824f, -0.005968f, 0.012325f, 0.000834f, -0.004177f, 0.000014f, 0.006907f, 0.005999f, -0.004250f, -0.004556f, -0.011717f, -0.002919f, -0.005078f, 0.001055f, -0.004636f, 0.001603f, -0.011412f, -0.003862f, 0.000793f, -0.003836f, 0.001923f, 0.005055f, -0.002714f, 0.000369f, 0.001564f, -0.002089f, 0.003786f, 0.000413f, 0.004881f, 0.000852f, -0.002421f, -0.005421f, 0.000149f, -0.006770f, 0.001924f, 0.001580f, 0.005563f, -0.016970f, -0.004993f, -0.004163f, 0.003254f, 0.002887f, -0.010983f, -0.005481f, -0.001885f, 0.002326f, 0.006396f, 0.001498f, 0.008635f, -0.007232f, -0.009504f, 0.002449f, 0.000700f, -0.002187f, -0.006394f, 0.021506f, -0.000777f, 0.005407f, 0.001678f, 0.000251f, -0.000124f, -0.003818f, -0.007965f, -0.006991f, -0.001676f, 0.005147f, -0.004282f, 0.011016f, -0.003510f, -0.001546f, -0.009029f, -0.011685f, -0.000581f, -0.007641f, -0.003586f, 0.014759f, -0.007957f, -0.002841f, -0.007710f, 0.002426f, 0.000785f, -0.003502f, -0.008112f, -0.002206f, 0.000481f, -0.010273f, 0.001556f, -0.005836f, 0.008157f, 0.004423f, -0.004021f, -0.003066f, -0.002022f, 0.001635f, 0.000026f, + 0.005363f, -0.002718f, -0.004869f, -0.003673f, 0.013030f, 0.013062f, -0.005290f, -0.011612f, 0.000573f, 0.004268f, -0.001585f, 0.004102f, -0.006403f, 0.001558f, -0.007484f, 0.004760f, -0.001892f, 0.013923f, 0.002777f, -0.054210f, -0.009193f, -0.015364f, -0.018194f, 0.005163f, -0.006392f, -0.015145f, -0.013211f, 0.002528f, -0.013020f, 0.002179f, 0.018535f, -0.004309f, 0.007754f, 0.006537f, 0.015573f, 0.004539f, -0.011449f, 0.002951f, 0.016953f, -0.007666f, 0.008257f, -0.012349f, -0.012005f, 0.004252f, 0.004598f, 0.014051f, 0.000426f, -0.007889f, 0.007521f, -0.005131f, 0.005677f, -0.000221f, 0.008193f, -0.006784f, -0.005125f, -0.007611f, -0.000307f, 0.002003f, -0.003607f, 0.006782f, -0.014770f, 0.002407f, 0.013999f, 0.003714f, -0.004572f, 0.006171f, -0.007884f, -0.003118f, -0.018613f, -0.004706f, -0.001148f, 0.003517f, -0.000275f, 0.010439f, -0.015148f, 0.002167f, -0.002661f, 0.008116f, 0.003190f, -0.001962f, 0.009559f, -0.008172f, -0.002099f, -0.006308f, -0.014945f, -0.004816f, -0.004338f, -0.002769f, 0.009182f, -0.008071f, -0.016674f, 0.002148f, 0.002920f, 0.000420f, -0.027160f, 0.015499f, + 0.017440f, -0.000936f, 0.009782f, 0.004465f, 0.020600f, 0.027411f, 0.003506f, 0.003598f, 0.007847f, 0.003417f, 0.004539f, -0.003882f, 0.005403f, -0.004504f, 0.007178f, 0.008399f, -0.023500f, 0.012182f, -0.002607f, -0.004333f, -0.007300f, -0.009486f, 0.003795f, 0.006695f, 0.010638f, 0.002113f, 0.001764f, -0.013676f, 0.000538f, -0.003964f, -0.004647f, -0.001988f, 0.001757f, 0.000840f, -0.001132f, 0.013532f, -0.000792f, -0.004407f, 0.004353f, -0.005162f, 0.006800f, 0.009192f, 0.010069f, 0.005393f, 0.000992f, -0.005553f, 0.011242f, 0.003749f, 0.001389f, 0.001347f, 0.001345f, 0.001002f, -0.006745f, -0.009062f, 0.008246f, -0.008398f, 0.007882f, 0.007649f, 0.005212f, -0.000857f, -0.006314f, 0.005910f, 0.006949f, 0.016374f, 0.007110f, 0.006580f, 0.003485f, -0.014831f, -0.005035f, 0.002826f, -0.002809f, 0.007918f, -0.013773f, 0.002477f, 0.050249f, 0.015278f, 0.003618f, 0.009937f, 0.025058f, 0.010226f, 0.030233f, 0.007511f, -0.006818f, -0.002108f, -0.002674f, -0.002835f, 0.008101f, 0.013064f, -0.006185f, 0.002843f, 0.008923f, -0.003328f, -0.012766f, 0.010060f, -0.001343f, 0.004794f, + -0.004458f, -0.006310f, 0.010149f, 0.002420f, -0.001118f, -0.002928f, -0.011667f, -0.005685f, 0.006045f, 0.001553f, -0.004137f, -0.002032f, 0.001554f, 0.004304f, 0.011370f, 0.003624f, -0.010851f, -0.002484f, 0.000491f, -0.003394f, 0.003633f, 0.005428f, -0.010942f, -0.013027f, -0.000959f, 0.003182f, -0.001584f, 0.009942f, -0.018692f, -0.004008f, -0.008595f, -0.010492f, -0.001354f, -0.000903f, 0.002518f, 0.009795f, -0.000310f, 0.001380f, 0.002988f, -0.001715f, 0.012991f, 0.008306f, -0.011044f, -0.009626f, 0.007029f, 0.015873f, -0.001591f, -0.007598f, 0.015556f, 0.008228f, 0.003411f, -0.007061f, 0.024022f, 0.012670f, 0.021547f, -0.006851f, -0.000535f, -0.005018f, 0.021682f, -0.022433f, -0.004024f, 0.006519f, -0.005185f, -0.003967f, 0.006720f, -0.002004f, -0.007912f, 0.020241f, 0.010292f, 0.002826f, 0.032385f, -0.008532f, -0.003076f, -0.006499f, -0.000633f, 0.006011f, -0.009487f, -0.000593f, -0.005386f, 0.013179f, -0.011682f, 0.003339f, -0.000240f, -0.002898f, 0.000142f, 0.007913f, 0.004037f, -0.009645f, -0.018676f, 0.000846f, 0.002509f, 0.014987f, 0.015949f, 0.017421f, 0.000361f, -0.009428f, + 0.011011f, -0.029336f, -0.006171f, -0.011316f, -0.018624f, 0.012426f, -0.005370f, -0.005289f, 0.007973f, -0.003136f, -0.006593f, 0.026184f, -0.001300f, -0.007415f, 0.007326f, 0.000898f, 0.005061f, 0.005226f, 0.001446f, 0.015824f, -0.011502f, -0.005710f, -0.001348f, -0.013484f, -0.002614f, 0.002465f, -0.006238f, 0.004423f, 0.004503f, 0.016136f, -0.010206f, 0.004794f, 0.008657f, 0.005455f, -0.038695f, -0.057715f, -0.009918f, 0.003062f, -0.001146f, 0.001808f, -0.002837f, -0.011391f, -0.006654f, -0.009022f, -0.002587f, 0.009660f, 0.011150f, -0.009935f, -0.015100f, 0.013133f, 0.002617f, -0.007969f, 0.000642f, -0.001070f, -0.009182f, -0.007377f, 0.021364f, 0.011200f, -0.011456f, 0.006178f, 0.002463f, 0.009494f, -0.011073f, 0.012771f, -0.012302f, 0.008906f, 0.005681f, -0.002226f, -0.005646f, 0.005914f, -0.022943f, -0.011044f, 0.014336f, 0.023228f, 0.012860f, -0.015504f, 0.000613f, -0.010849f, 0.015423f, 0.003610f, 0.004230f, 0.001567f, -0.012157f, 0.006568f, 0.018910f, 0.002612f, 0.014424f, 0.010459f, 0.006867f, 0.011271f, 0.023234f, -0.005749f, -0.022365f, 0.011681f, 0.000650f, -0.004830f, + 0.001805f, 0.020295f, -0.007347f, -0.013057f, 0.007468f, -0.002984f, -0.001511f, -0.004526f, -0.002191f, -0.005495f, -0.009761f, -0.004723f, 0.014177f, -0.017410f, -0.010284f, 0.002745f, -0.022466f, -0.014339f, 0.003560f, 0.003728f, 0.029483f, -0.025811f, -0.017983f, -0.009891f, -0.005138f, -0.003098f, 0.009366f, 0.009388f, -0.013990f, 0.014217f, -0.003526f, 0.006481f, -0.010159f, 0.021116f, -0.004360f, -0.007892f, 0.013341f, 0.009840f, 0.007642f, -0.014320f, -0.013754f, 0.017804f, -0.009620f, 0.005217f, 0.004068f, -0.006525f, 0.014857f, 0.004518f, -0.000310f, 0.003249f, 0.010825f, 0.014124f, 0.004102f, -0.012872f, 0.002657f, -0.018328f, 0.010513f, 0.004467f, -0.020567f, 0.014078f, 0.003059f, -0.010891f, 0.018292f, 0.005508f, -0.005300f, 0.010375f, -0.001939f, 0.019985f, -0.004930f, -0.005735f, -0.004567f, -0.003373f, 0.026491f, 0.004847f, 0.000301f, 0.006354f, -0.022536f, -0.015056f, -0.015292f, 0.000446f, 0.014221f, 0.000449f, 0.017741f, -0.024483f, -0.009077f, -0.016547f, -0.012874f, 0.030549f, -0.002500f, 0.008273f, 0.010087f, -0.030337f, 0.009662f, -0.013174f, 0.007599f, -0.009285f, + 0.024580f, 0.003854f, -0.016731f, 0.002445f, -0.017055f, 0.013857f, 0.027162f, -0.023115f, 0.015440f, 0.005393f, -0.000350f, 0.010875f, 0.028955f, -0.011135f, 0.000309f, 0.008576f, -0.030909f, 0.001664f, 0.014574f, -0.008848f, 0.010556f, 0.010950f, -0.005329f, 0.027912f, -0.013598f, -0.025499f, -0.010521f, 0.002941f, 0.001082f, -0.005296f, -0.010527f, 0.007556f, 0.007507f, -0.000067f, -0.017430f, -0.004259f, -0.004079f, 0.011886f, -0.007365f, 0.047001f, -0.005443f, 0.006711f, -0.001678f, -0.002008f, -0.022324f, 0.002350f, 0.017442f, 0.013718f, 0.046408f, -0.004893f, -0.003896f, -0.009444f, -0.001248f, -0.012840f, -0.000400f, 0.018492f, -0.009201f, -0.001789f, 0.003942f, 0.004472f, 0.018710f, 0.014867f, 0.004796f, 0.035679f, -0.006084f, -0.032723f, -0.032314f, -0.023065f, -0.004225f, 0.010474f, -0.002856f, -0.009050f, 0.053769f, -0.038876f, -0.029044f, -0.009723f, -0.018326f, -0.021555f, 0.026063f, 0.010064f, 0.005261f, -0.008676f, -0.005172f, 0.030922f, -0.009186f, -0.013859f, -0.037764f, -0.006115f, -0.001061f, 0.017058f, 0.006380f, -0.008436f, 0.002086f, 0.014754f, 0.006760f, 0.008855f, + 0.023773f, 0.029325f, 0.007992f, -0.012299f, 0.007333f, -0.019268f, 0.011938f, 0.009064f, -0.007099f, -0.000606f, -0.014749f, 0.004398f, -0.000349f, -0.028685f, 0.025821f, -0.003845f, -0.013264f, 0.014898f, -0.026221f, -0.007469f, 0.026774f, 0.014141f, -0.001466f, -0.000779f, -0.036207f, 0.010361f, 0.018266f, 0.009117f, 0.005109f, -0.004085f, -0.027331f, -0.078231f, -0.007662f, 0.013020f, 0.019613f, -0.004577f, -0.024123f, 0.034688f, -0.019371f, 0.014075f, 0.026248f, 0.020091f, 0.002028f, 0.024677f, 0.000702f, 0.006051f, 0.003252f, 0.012589f, 0.000390f, 0.000035f, 0.032798f, -0.019048f, -0.011205f, 0.025283f, 0.026881f, -0.008172f, -0.011577f, -0.003975f, -0.006233f, 0.027816f, 0.020474f, -0.052513f, -0.004143f, 0.002670f, -0.022500f, 0.008014f, -0.033491f, 0.025063f, 0.007882f, -0.005604f, 0.015960f, 0.005725f, -0.005902f, -0.013222f, -0.007125f, 0.036034f, 0.002947f, -0.001763f, 0.009733f, -0.006541f, 0.016461f, 0.042749f, 0.019434f, -0.007897f, -0.006391f, -0.007922f, 0.027012f, 0.007688f, 0.027322f, 0.016537f, 0.014323f, 0.006091f, -0.009916f, -0.013778f, 0.012921f, -0.027577f, + 0.005825f, -0.015246f, -0.010339f, -0.000384f, 0.019418f, 0.001302f, 0.002725f, 0.005298f, -0.004468f, 0.029169f, 0.040525f, 0.043905f, 0.000939f, 0.019504f, -0.025616f, 0.009353f, 0.016518f, -0.013133f, 0.023863f, -0.019104f, -0.035720f, 0.004202f, -0.018415f, -0.003378f, 0.002347f, -0.019756f, 0.005329f, 0.026550f, -0.015968f, -0.015420f, 0.013215f, 0.025680f, -0.001938f, -0.006014f, -0.031006f, 0.057114f, 0.004468f, 0.014225f, 0.045101f, -0.017227f, 0.005317f, -0.009319f, 0.012464f, -0.013657f, 0.013561f, -0.032078f, -0.036205f, -0.002044f, -0.021133f, -0.002607f, -0.001282f, -0.003434f, -0.005489f, 0.001395f, -0.009496f, 0.008247f, -0.028639f, -0.012767f, -0.038902f, -0.003047f, 0.009852f, 0.017952f, 0.043585f, 0.022650f, 0.008163f, 0.004340f, 0.013060f, 0.008333f, 0.007991f, 0.016101f, 0.018897f, -0.006993f, -0.035464f, -0.037202f, -0.023863f, -0.016047f, 0.004373f, 0.010734f, -0.012495f, -0.022490f, -0.035977f, -0.000432f, -0.013257f, 0.031985f, -0.014172f, 0.006791f, -0.024716f, -0.014033f, -0.003676f, -0.012310f, -0.048494f, -0.053287f, 0.014883f, 0.003196f, 0.002129f, 0.024125f, + 0.015818f, 0.018759f, 0.017815f, -0.034578f, -0.006205f, 0.057180f, -0.010395f, -0.025856f, 0.009487f, -0.016770f, 0.006712f, -0.041179f, 0.015494f, -0.022047f, 0.007900f, 0.035254f, 0.025310f, 0.004252f, 0.026926f, -0.004396f, -0.012261f, 0.016037f, -0.022148f, -0.040709f, -0.062947f, 0.005960f, 0.000363f, 0.024722f, 0.016544f, -0.022383f, -0.012834f, -0.059864f, -0.005102f, -0.027512f, 0.005520f, -0.013510f, -0.007875f, -0.010980f, -0.005624f, -0.004056f, -0.022212f, -0.008812f, -0.025732f, 0.020210f, -0.006174f, 0.017379f, 0.042111f, -0.022297f, 0.011149f, -0.002940f, -0.012166f, 0.011797f, -0.024665f, -0.038886f, 0.017461f, 0.009885f, 0.017300f, 0.012400f, -0.084355f, -0.036954f, 0.009332f, -0.026936f, -0.004106f, -0.022923f, 0.032771f, 0.042315f, -0.003988f, 0.046718f, 0.004460f, 0.021572f, -0.008242f, -0.000881f, -0.028063f, 0.016997f, 0.030909f, 0.007914f, 0.052915f, 0.002036f, 0.004871f, -0.015527f, -0.027388f, 0.033671f, 0.048813f, 0.019076f, 0.006501f, 0.006123f, 0.015637f, 0.002813f, -0.000876f, -0.047455f, -0.033240f, -0.015199f, -0.061420f, -0.074756f, -0.056819f, -0.024797f, + 0.016316f, 0.000283f, -0.014105f, -0.026831f, -0.000767f, 0.050614f, 0.023582f, -0.042850f, -0.008013f, -0.008266f, -0.031658f, -0.004754f, 0.001428f, 0.021719f, 0.014602f, -0.031809f, 0.022517f, -0.017665f, 0.009055f, -0.016418f, 0.004308f, -0.024234f, -0.010203f, 0.013026f, -0.045931f, -0.007942f, -0.017888f, 0.015441f, -0.012130f, -0.040976f, 0.048018f, 0.047819f, -0.000308f, -0.018479f, 0.025701f, -0.063198f, -0.020962f, 0.019536f, -0.022464f, -0.013040f, -0.002677f, -0.020140f, 0.003029f, -0.004881f, -0.043838f, 0.018723f, -0.006575f, -0.012825f, -0.015796f, -0.011048f, -0.003898f, -0.011549f, -0.019411f, 0.035523f, -0.018251f, -0.016847f, 0.015413f, -0.000695f, 0.056625f, -0.012106f, -0.037830f, 0.019892f, -0.020812f, -0.017150f, -0.030442f, 0.017797f, 0.033108f, -0.072727f, 0.001781f, 0.054628f, -0.016146f, -0.048535f, 0.096253f, 0.067405f, -0.000513f, -0.018893f, 0.015969f, -0.057915f, 0.001797f, 0.070628f, -0.011685f, -0.025384f, 0.002079f, 0.080177f, -0.010617f, 0.017166f, -0.016195f, -0.037069f, -0.028518f, -0.007994f, -0.012438f, 0.014381f, 0.021750f, 0.000640f, -0.029251f, -0.043019f, + -0.037964f, -0.006767f, -0.007372f, -0.021542f, 0.021061f, 0.015595f, -0.015779f, -0.021276f, -0.021398f, 0.012441f, 0.005913f, 0.015391f, 0.041880f, -0.000597f, -0.032879f, 0.023065f, 0.010884f, 0.007567f, 0.004184f, -0.000980f, -0.014809f, 0.029542f, 0.017186f, -0.012297f, -0.012295f, -0.009810f, -0.037098f, 0.010452f, 0.030867f, 0.008346f, -0.025159f, 0.031700f, 0.025912f, 0.012846f, 0.006079f, -0.017343f, 0.011460f, -0.056391f, 0.011500f, -0.004131f, 0.052734f, -0.018698f, -0.021582f, 0.009557f, -0.009623f, -0.002395f, -0.032587f, -0.008455f, -0.006102f, 0.045240f, -0.027801f, -0.065216f, -0.024369f, 0.090377f, 0.003946f, 0.014719f, -0.014772f, -0.030094f, -0.039639f, -0.013562f, 0.011741f, 0.026264f, 0.022461f, -0.019537f, 0.000375f, -0.040355f, -0.014119f, 0.014040f, -0.033174f, -0.018409f, -0.012184f, 0.048639f, 0.026206f, 0.026614f, 0.026167f, -0.028736f, 0.005971f, 0.009924f, 0.012380f, -0.003138f, 0.033913f, -0.007705f, 0.015488f, 0.025163f, 0.010835f, 0.006612f, 0.022750f, 0.029187f, -0.016352f, -0.035581f, 0.024642f, -0.004476f, 0.001473f, -0.037713f, -0.032925f, 0.007064f, + -0.015615f, -0.014335f, 0.031944f, -0.032204f, 0.041837f, 0.024596f, -0.015705f, 0.019682f, -0.021202f, -0.025158f, -0.026157f, 0.039512f, -0.026266f, 0.010981f, 0.015551f, -0.049642f, 0.007760f, 0.002758f, -0.033682f, -0.067537f, -0.053412f, 0.038138f, -0.038543f, -0.005322f, -0.033438f, -0.014502f, -0.021353f, -0.009237f, 0.025886f, 0.002066f, -0.018045f, 0.016906f, 0.049204f, 0.048789f, 0.047725f, -0.016967f, 0.000417f, -0.038470f, -0.001744f, 0.008271f, 0.006806f, -0.033527f, -0.037508f, -0.056189f, 0.039521f, 0.006029f, 0.013230f, -0.007523f, 0.020846f, -0.013744f, -0.015979f, 0.014242f, 0.030419f, 0.009563f, 0.020056f, 0.064929f, -0.009000f, -0.035049f, -0.079890f, -0.008632f, -0.030622f, -0.012314f, -0.018606f, -0.034140f, -0.025582f, -0.052354f, -0.005680f, 0.002499f, 0.020390f, 0.061137f, -0.046847f, -0.014771f, -0.006596f, 0.022752f, 0.021892f, 0.061152f, 0.009457f, -0.060910f, -0.013062f, 0.017873f, 0.053134f, 0.018115f, -0.076564f, -0.026680f, 0.074137f, 0.011758f, 0.074261f, -0.036405f, 0.005606f, 0.011442f, 0.046817f, 0.002195f, 0.043340f, 0.065763f, 0.012909f, 0.057224f, + 0.040276f, 0.016027f, 0.075201f, 0.067461f, 0.025690f, 0.101313f, 0.078458f, 0.054018f, -0.066629f, 0.005356f, 0.039298f, 0.028236f, 0.011066f, -0.042327f, -0.049944f, -0.020856f, 0.017395f, -0.055329f, 0.058971f, -0.027531f, 0.040050f, 0.014015f, -0.042119f, 0.003240f, 0.032951f, -0.021726f, -0.044012f, 0.028521f, -0.008702f, 0.023973f, -0.011734f, 0.003668f, 0.015742f, -0.032992f, 0.001143f, -0.016268f, 0.004120f, -0.051750f, -0.033427f, 0.044379f, 0.007116f, 0.016272f, -0.032329f, 0.035933f, 0.039736f, -0.028730f, 0.027280f, -0.040390f, -0.002786f, -0.023657f, 0.032891f, 0.064963f, 0.004368f, 0.079446f, -0.015009f, -0.006044f, 0.009693f, 0.006346f, 0.000320f, -0.047968f, 0.086194f, 0.050539f, -0.000102f, 0.042330f, 0.040616f, 0.044173f, -0.010912f, -0.002278f, -0.074945f, 0.035802f, 0.044971f, -0.011396f, -0.007213f, 0.050440f, 0.033737f, 0.026638f, 0.070291f, 0.010706f, -0.025717f, -0.038800f, 0.018736f, -0.011357f, -0.040160f, 0.040355f, -0.047896f, 0.004653f, 0.017803f, -0.035276f, -0.055786f, -0.036385f, -0.013661f, 0.010557f, 0.040304f, -0.064906f, 0.035266f, 0.064399f, + -0.004989f, 0.073624f, 0.017298f, -0.057040f, -0.041285f, -0.001120f, -0.025043f, -0.033292f, 0.035115f, 0.049318f, -0.008382f, 0.035411f, 0.038832f, -0.030235f, 0.026176f, 0.054941f, -0.007200f, -0.065792f, 0.023132f, 0.001584f, -0.017910f, 0.022685f, 0.048193f, -0.013193f, -0.030610f, 0.016380f, -0.027234f, -0.026557f, -0.006413f, 0.049548f, 0.034944f, -0.061863f, 0.016382f, 0.031498f, -0.048361f, -0.024535f, 0.048484f, -0.010898f, -0.081636f, -0.006303f, 0.060184f, -0.017591f, -0.116043f, 0.120370f, -0.037982f, -0.009872f, -0.062406f, 0.079088f, 0.019681f, -0.022334f, 0.049905f, -0.028570f, -0.029220f, -0.010322f, 0.135303f, 0.050739f, -0.064152f, -0.048124f, 0.048417f, -0.008453f, 0.072802f, 0.005623f, 0.053021f, -0.076695f, 0.058641f, 0.116268f, 0.004066f, -0.007034f, -0.026662f, -0.013959f, -0.052383f, 0.111821f, 0.061162f, -0.053253f, 0.049920f, 0.115658f, 0.021825f, -0.044086f, -0.011055f, -0.010461f, 0.019770f, 0.017804f, -0.036398f, -0.050823f, 0.013266f, -0.042937f, 0.008225f, -0.026551f, -0.031475f, -0.006288f, 0.004876f, 0.015190f, -0.035011f, -0.013529f, -0.014095f, -0.042651f, + 0.035809f, -0.013109f, 0.001999f, -0.005953f, -0.029072f, 0.011845f, 0.007796f, 0.001427f, -0.006488f, 0.000736f, -0.001308f, -0.016602f, -0.036819f, 0.016032f, -0.018371f, 0.016238f, 0.010974f, -0.036221f, -0.029763f, -0.003037f, -0.004381f, -0.003866f, -0.007953f, 0.030087f, -0.020686f, 0.003298f, -0.038864f, 0.033376f, -0.038038f, -0.019963f, 0.018983f, 0.000676f, -0.030391f, 0.024349f, -0.040848f, 0.003185f, 0.012566f, -0.001067f, 0.004767f, 0.019632f, 0.009677f, -0.042312f, 0.021810f, 0.002931f, -0.024997f, 0.036196f, 0.014861f, -0.040072f, -0.003747f, -0.031706f, -0.003588f, 0.013892f, 0.010926f, -0.038431f, 0.047933f, -0.068669f, -0.086865f, -0.031233f, 0.260226f, 0.209114f, 0.137796f, 0.252749f, -0.100942f, -0.238579f, -0.077313f, -0.385813f, -0.151221f, 0.011056f, -0.091326f, 0.177119f, 0.240952f, 0.039578f, 0.152788f, 0.264029f, 0.004743f, 0.072675f, -0.018262f, -0.310564f, -0.257921f, -0.194289f, -0.193946f, -0.095307f, 0.145982f, 0.078728f, 0.112604f, 0.323674f, 0.136065f, 0.019543f, 0.192592f, 0.089557f, -0.112773f, 0.037095f, -0.094959f, -0.315435f, -0.077511f, -0.165349f, + -0.325988f, -0.054989f, 0.005431f, -0.080446f, 0.217026f, 0.251640f, 0.097437f, 0.295985f, 0.298575f, 0.054444f, 0.113326f, 0.050269f, -0.193355f, -0.215615f, -0.203002f, -0.361783f, -0.321079f, -0.123779f, -0.151391f, 0.027960f, 0.188110f, 0.259978f, 0.212875f, 0.332560f, 0.244165f, 0.129319f, 0.012088f, -0.047525f, -0.201804f, -0.243048f, -0.183940f, -0.215705f, -0.185124f, -0.017149f, -0.025625f, 0.029877f, 0.137746f, 0.027719f, 0.013208f}, + {0.003131f, 0.003353f, 0.003924f, -0.004476f, -0.007269f, 0.001223f, 0.005007f, -0.003315f, 0.003393f, -0.011708f, -0.006448f, -0.006644f, 0.000567f, 0.001754f, -0.004859f, -0.006050f, 0.002573f, 0.006452f, 0.000301f, -0.003161f, -0.008681f, -0.004949f, 0.006813f, -0.001393f, 0.000323f, 0.003148f, -0.003515f, 0.002106f, -0.002584f, -0.004876f, -0.003358f, 0.006619f, -0.008552f, -0.004436f, -0.003740f, 0.008752f, 0.006041f, 0.005187f, 0.000609f, 0.002847f, -0.000365f, 0.005618f, 0.002026f, 0.002045f, -0.000029f, -0.000298f, 0.009601f, 0.007475f, -0.000026f, -0.006384f, 0.002025f, 0.001136f, 0.002985f, -0.009257f, -0.000343f, 0.006076f, 0.000484f, -0.001104f, 0.000682f, 0.002120f, -0.002249f, -0.001481f, -0.002771f, -0.003387f, -0.004831f, 0.002952f, 0.003481f, -0.006996f, -0.001474f, -0.000744f, 0.001964f, 0.002469f, -0.004323f, 0.002777f, 0.001921f, -0.001248f, -0.002079f, -0.009305f, 0.029184f, 0.011364f, 0.006989f, 0.002440f, -0.006354f, 0.000201f, 0.005479f, 0.010698f, -0.000002f, 0.001142f, 0.000469f, -0.003762f, 0.000878f, 0.003699f, -0.000880f, 0.003612f, 0.005251f, 0.007310f, + 0.002866f, 0.003057f, 0.003633f, 0.003463f, -0.006796f, 0.006811f, 0.012452f, -0.005902f, 0.003412f, 0.002063f, 0.003346f, 0.000727f, 0.007294f, -0.004797f, -0.001921f, -0.004315f, 0.004128f, 0.012580f, -0.002298f, 0.006132f, -0.000359f, -0.002777f, -0.010509f, 0.003906f, -0.005538f, 0.004796f, 0.002218f, 0.005347f, -0.000784f, -0.003168f, 0.001488f, -0.002181f, 0.006981f, 0.000939f, -0.005866f, 0.007282f, -0.001775f, 0.005677f, 0.004205f, -0.000242f, 0.004037f, 0.008180f, -0.002469f, -0.002908f, -0.002476f, 0.004034f, -0.003485f, -0.004488f, 0.004996f, -0.000025f, 0.003348f, -0.005576f, 0.008034f, 0.000323f, -0.002241f, -0.001183f, -0.000705f, 0.022565f, 0.018075f, 0.008747f, 0.001518f, -0.003597f, 0.010561f, -0.006289f, -0.006298f, -0.001732f, -0.011160f, 0.006627f, 0.000665f, -0.004958f, 0.002892f, 0.006353f, 0.011541f, -0.005514f, 0.006739f, 0.014479f, -0.004011f, -0.000160f, 0.003569f, 0.007393f, -0.001741f, 0.008074f, 0.006095f, 0.008168f, 0.002129f, 0.006167f, -0.006383f, 0.010969f, -0.001167f, 0.010569f, 0.005560f, -0.001495f, 0.001521f, -0.002104f, -0.000085f, -0.004238f, + -0.001693f, -0.005169f, -0.003421f, 0.003460f, -0.000870f, -0.010855f, -0.002221f, 0.000769f, -0.000161f, -0.006225f, -0.005941f, -0.003445f, -0.002511f, 0.007847f, -0.003195f, -0.009432f, -0.011984f, -0.013700f, -0.004516f, -0.006285f, -0.000430f, 0.001593f, 0.006442f, -0.009174f, -0.003951f, 0.000499f, -0.000917f, -0.004455f, 0.000889f, -0.009761f, -0.000993f, -0.011469f, 0.005567f, -0.006664f, -0.003126f, 0.006515f, -0.001387f, 0.011819f, -0.025916f, -0.007288f, -0.013004f, -0.002727f, 0.000248f, 0.014146f, -0.006754f, -0.023730f, -0.008009f, -0.000870f, 0.009189f, 0.002511f, -0.008448f, -0.020646f, -0.004985f, 0.005303f, -0.002027f, 0.011188f, 0.000708f, 0.004739f, -0.000877f, -0.009333f, -0.009578f, 0.005631f, 0.007493f, 0.000545f, 0.002608f, -0.000667f, 0.004684f, 0.000712f, -0.011839f, 0.000322f, 0.017306f, 0.001964f, -0.003970f, -0.001912f, -0.004262f, 0.000695f, -0.003640f, -0.007765f, 0.011675f, -0.003920f, -0.004486f, 0.009970f, -0.005154f, -0.009597f, 0.000683f, -0.000360f, 0.000559f, -0.013703f, 0.011037f, -0.004576f, -0.000006f, 0.009451f, 0.009289f, -0.014746f, -0.003371f, 0.002188f, + 0.003675f, -0.001868f, 0.007995f, 0.001483f, 0.004053f, 0.004669f, 0.000962f, 0.003502f, 0.006640f, 0.000504f, 0.000098f, 0.005031f, -0.016241f, -0.004839f, 0.000269f, 0.006740f, 0.004273f, -0.003801f, -0.001079f, -0.051663f, -0.020985f, -0.010081f, -0.015220f, 0.005071f, -0.005560f, -0.004575f, -0.001079f, 0.006982f, -0.006441f, -0.006727f, -0.010832f, 0.002459f, 0.008795f, 0.002446f, -0.007607f, -0.008450f, 0.002103f, 0.008107f, 0.006634f, -0.009674f, -0.015321f, 0.001449f, -0.014376f, 0.007682f, -0.000687f, 0.005451f, -0.001002f, 0.005261f, -0.006064f, -0.001983f, 0.013780f, -0.017175f, 0.007361f, 0.004357f, 0.001257f, -0.005921f, 0.003138f, 0.008868f, 0.001547f, -0.010384f, 0.001373f, -0.006502f, 0.004402f, -0.014284f, -0.001384f, -0.012926f, 0.009264f, -0.000850f, -0.003511f, -0.003520f, 0.004639f, -0.021875f, 0.009206f, -0.006169f, -0.014392f, 0.005536f, 0.009686f, 0.012346f, 0.006046f, 0.002770f, -0.002046f, 0.001609f, -0.002351f, 0.008000f, -0.005798f, 0.002358f, 0.004778f, 0.015316f, 0.000939f, 0.000380f, -0.012504f, 0.006982f, -0.007112f, 0.001139f, -0.030096f, 0.014990f, + 0.022659f, 0.004996f, 0.001373f, 0.013368f, 0.003897f, 0.004459f, 0.006599f, 0.001505f, 0.006937f, 0.007949f, -0.006375f, -0.000530f, 0.000609f, -0.006687f, -0.004887f, 0.000499f, 0.003206f, -0.003679f, 0.023692f, 0.013399f, -0.003852f, 0.002358f, 0.007307f, 0.010270f, 0.010660f, -0.003925f, 0.007428f, 0.009689f, 0.000220f, 0.003332f, 0.002324f, 0.005851f, 0.003460f, 0.003007f, 0.004844f, 0.005620f, -0.010626f, -0.007254f, -0.016223f, 0.002546f, -0.005859f, -0.007169f, 0.008077f, -0.001476f, 0.005046f, -0.018950f, 0.021736f, -0.000656f, -0.010489f, -0.000962f, 0.017257f, 0.013547f, -0.002802f, 0.001502f, 0.008380f, -0.002885f, 0.003633f, -0.005225f, -0.013577f, 0.002839f, 0.001381f, -0.009649f, -0.004184f, -0.009393f, 0.002140f, 0.005530f, 0.002721f, -0.003553f, -0.009187f, -0.012622f, -0.016858f, -0.010171f, -0.004173f, 0.004040f, 0.054672f, 0.014397f, 0.004104f, -0.002120f, 0.032952f, 0.003754f, 0.015663f, 0.003106f, 0.010411f, 0.017009f, 0.006043f, -0.009662f, 0.010093f, 0.011625f, 0.001820f, -0.001031f, 0.002458f, 0.021389f, 0.001419f, -0.007566f, -0.013211f, -0.004058f, + -0.000512f, -0.015200f, 0.002378f, 0.004219f, 0.008443f, 0.003426f, 0.005892f, 0.016272f, -0.005360f, -0.002886f, 0.009927f, -0.001858f, -0.004725f, -0.001137f, -0.015049f, 0.009266f, 0.005959f, 0.000039f, 0.009180f, -0.005061f, -0.013297f, -0.028290f, -0.010629f, 0.010005f, 0.011002f, 0.000026f, 0.007564f, -0.008243f, -0.009070f, 0.022413f, -0.013699f, 0.009963f, -0.012166f, 0.002067f, -0.017521f, -0.018112f, 0.018609f, -0.007721f, -0.007639f, 0.026224f, 0.001235f, -0.003343f, -0.013318f, 0.009394f, 0.014456f, 0.000404f, -0.009250f, -0.016001f, -0.003518f, 0.011026f, -0.004797f, 0.003429f, 0.026986f, 0.010076f, 0.022232f, -0.013281f, 0.003836f, 0.013735f, -0.018332f, -0.005141f, -0.007627f, 0.002699f, -0.009637f, -0.004533f, 0.012882f, -0.003263f, -0.003323f, -0.000072f, 0.016319f, -0.005333f, -0.008659f, 0.019140f, 0.002209f, -0.011973f, 0.004696f, -0.001900f, 0.002179f, 0.007826f, -0.011190f, -0.001469f, -0.008590f, -0.013145f, 0.000984f, 0.001320f, 0.001949f, -0.012899f, -0.015178f, 0.006577f, -0.001981f, 0.006439f, -0.001311f, 0.008925f, 0.001603f, 0.000659f, -0.009952f, -0.007902f, + 0.001753f, 0.009958f, 0.003605f, -0.001534f, 0.025443f, 0.007300f, 0.003758f, 0.013000f, 0.003687f, 0.009975f, 0.008293f, 0.007047f, 0.002911f, 0.005701f, -0.004498f, -0.000848f, 0.001301f, -0.009850f, 0.002262f, -0.016600f, 0.004233f, -0.010502f, 0.008646f, -0.005264f, 0.004508f, -0.000852f, -0.009201f, 0.004449f, -0.002717f, 0.010924f, -0.008399f, 0.026519f, 0.020598f, 0.008804f, -0.033797f, -0.066964f, -0.002141f, -0.013918f, 0.012214f, -0.004027f, -0.017628f, -0.002370f, -0.014112f, -0.016971f, -0.013277f, 0.021134f, 0.012067f, -0.015025f, -0.007495f, 0.015984f, 0.010420f, 0.014224f, -0.009246f, 0.009035f, -0.008071f, -0.009558f, -0.001848f, -0.004432f, -0.027064f, 0.007212f, 0.017040f, 0.006460f, -0.015618f, -0.004260f, 0.004054f, 0.003857f, -0.013740f, -0.003721f, -0.020173f, 0.004315f, -0.008899f, -0.001336f, -0.006167f, 0.003704f, 0.024172f, -0.002839f, -0.002867f, 0.011076f, 0.018140f, -0.010474f, 0.006057f, 0.005942f, -0.012517f, 0.007171f, 0.008676f, -0.016924f, 0.004328f, 0.010316f, -0.000712f, -0.017825f, -0.009060f, -0.011662f, 0.017853f, 0.005679f, 0.017654f, -0.009658f, + -0.015593f, 0.003703f, 0.011418f, -0.004421f, -0.010119f, 0.007806f, 0.015480f, 0.011018f, -0.011413f, -0.008706f, 0.000661f, 0.022324f, -0.000748f, 0.012020f, 0.009266f, 0.006403f, -0.035033f, 0.001019f, -0.000195f, 0.020589f, 0.003576f, -0.006805f, 0.010380f, -0.004591f, 0.003841f, -0.017434f, -0.006662f, -0.010725f, -0.007747f, -0.022347f, -0.010140f, -0.013011f, 0.030701f, 0.019262f, 0.018151f, -0.021985f, -0.020940f, -0.008553f, 0.009469f, -0.000282f, -0.001750f, 0.001400f, 0.005029f, -0.000847f, 0.007741f, -0.012590f, -0.013011f, 0.000434f, -0.004897f, -0.015753f, -0.018185f, -0.012587f, -0.011306f, -0.006551f, -0.008369f, -0.020224f, 0.007661f, 0.025923f, -0.007434f, 0.012377f, 0.014369f, -0.011558f, 0.012104f, 0.009335f, 0.001251f, 0.023549f, -0.003302f, 0.019727f, 0.004941f, 0.002743f, -0.020628f, 0.007496f, 0.006544f, -0.004687f, 0.024156f, 0.021376f, 0.001426f, -0.007987f, -0.016225f, 0.007585f, -0.016190f, 0.005033f, -0.003579f, 0.015369f, -0.003658f, -0.024275f, -0.002329f, -0.010389f, -0.008378f, -0.019516f, 0.015032f, -0.031684f, 0.014813f, 0.009181f, 0.014103f, -0.015319f, + -0.024498f, 0.006395f, 0.008610f, 0.000292f, -0.020507f, 0.019543f, 0.006851f, -0.011944f, -0.017946f, 0.007544f, -0.007403f, 0.031881f, 0.039239f, 0.004661f, -0.005167f, -0.015277f, 0.022697f, -0.025731f, -0.007895f, 0.029534f, 0.008551f, -0.006934f, -0.015551f, -0.016212f, -0.007643f, -0.000459f, -0.019231f, 0.003551f, 0.022475f, -0.003739f, 0.009044f, -0.016771f, -0.013440f, -0.005886f, -0.010944f, 0.030261f, -0.010512f, 0.013036f, 0.012514f, 0.011683f, 0.004316f, 0.005227f, -0.020712f, -0.022751f, -0.019875f, -0.005658f, 0.016620f, 0.035037f, -0.013547f, -0.027056f, -0.005036f, -0.013018f, 0.007660f, 0.004573f, 0.021068f, -0.013288f, 0.000747f, -0.017280f, -0.002082f, 0.027831f, -0.002666f, -0.016777f, 0.021695f, 0.005695f, 0.004390f, 0.009738f, -0.022116f, 0.002356f, -0.006831f, 0.000868f, 0.011423f, 0.022700f, 0.050009f, -0.021790f, -0.016911f, -0.005293f, 0.010609f, -0.029293f, 0.011779f, -0.007979f, 0.014832f, -0.013204f, -0.005887f, 0.018011f, 0.013517f, 0.005013f, -0.009029f, -0.003408f, 0.024880f, 0.024281f, -0.004979f, 0.021186f, -0.006092f, 0.031201f, -0.014549f, -0.007809f, + 0.005714f, 0.032688f, 0.024059f, 0.007810f, -0.017483f, -0.001354f, -0.036332f, -0.005631f, 0.005806f, 0.016635f, 0.019649f, 0.034448f, 0.009188f, -0.000761f, -0.001537f, -0.013402f, -0.022580f, -0.001761f, -0.019553f, 0.014126f, 0.004645f, 0.021916f, 0.012460f, -0.007653f, 0.022061f, -0.026134f, 0.011996f, -0.005915f, 0.002147f, -0.004629f, 0.028109f, 0.016206f, 0.008298f, 0.004882f, -0.050099f, -0.008089f, 0.030383f, 0.015089f, 0.002372f, -0.000928f, 0.002122f, 0.024209f, 0.010961f, -0.038034f, -0.011585f, -0.014464f, 0.004655f, 0.001295f, -0.036534f, 0.002364f, -0.033500f, -0.021552f, 0.000612f, 0.017502f, 0.035801f, -0.009518f, -0.013773f, 0.001356f, 0.014175f, 0.007130f, -0.021009f, -0.002055f, -0.016931f, -0.001691f, -0.023247f, -0.003375f, -0.019920f, 0.000162f, 0.021645f, 0.000843f, 0.047181f, -0.020446f, -0.008898f, -0.017535f, 0.019537f, 0.030205f, -0.024418f, -0.009264f, -0.038144f, 0.006307f, 0.000159f, 0.009570f, 0.009999f, -0.022651f, -0.012355f, 0.015846f, -0.005859f, -0.005867f, -0.020549f, 0.041258f, -0.005183f, -0.046523f, 0.013236f, -0.013156f, -0.012995f, 0.015074f, + 0.013198f, -0.014406f, -0.013958f, -0.005734f, -0.025717f, -0.017158f, 0.009252f, 0.004399f, 0.009637f, -0.009530f, -0.018418f, -0.023603f, -0.021498f, 0.016514f, -0.031813f, -0.001273f, 0.008436f, -0.011887f, 0.001515f, -0.002216f, -0.003680f, -0.027855f, -0.003978f, -0.012741f, 0.017241f, 0.018479f, -0.002875f, 0.029896f, -0.000636f, -0.003208f, -0.008396f, -0.005216f, 0.049138f, 0.000425f, -0.023156f, 0.057807f, -0.015207f, -0.004650f, 0.004638f, 0.024841f, 0.017102f, -0.036920f, -0.015708f, -0.035077f, 0.007247f, 0.002347f, -0.011498f, -0.038680f, 0.001054f, -0.017920f, 0.007513f, 0.008840f, 0.019073f, 0.001235f, 0.013698f, 0.067658f, 0.014012f, 0.017030f, -0.011261f, -0.003570f, 0.028754f, -0.002415f, 0.001597f, 0.007946f, 0.001181f, -0.004209f, -0.016163f, 0.027267f, -0.029632f, 0.012081f, -0.043691f, -0.012995f, -0.020913f, -0.026431f, -0.023626f, -0.000037f, -0.047751f, -0.015956f, 0.005475f, 0.026777f, 0.014437f, -0.046077f, 0.025069f, 0.017274f, 0.017950f, -0.029335f, 0.020367f, -0.013849f, -0.034662f, -0.011568f, -0.034544f, 0.016092f, 0.038585f, 0.009859f, -0.005150f, -0.026257f, + 0.019679f, -0.027977f, 0.040152f, -0.007985f, -0.006040f, -0.025351f, -0.029052f, 0.003795f, 0.030768f, 0.010508f, -0.024194f, -0.009133f, 0.003638f, -0.004131f, 0.009367f, 0.031344f, 0.005972f, -0.020292f, 0.009193f, -0.005999f, 0.009451f, 0.034320f, -0.048551f, -0.022229f, -0.039051f, 0.021971f, -0.007877f, 0.003592f, -0.012916f, 0.027868f, -0.027737f, -0.028235f, -0.012773f, -0.006843f, -0.020019f, -0.034939f, -0.016775f, 0.006083f, 0.022602f, -0.032253f, 0.020869f, -0.012452f, 0.002387f, 0.040707f, 0.031414f, -0.001086f, 0.016478f, 0.007366f, -0.006725f, -0.005639f, -0.056142f, 0.007053f, -0.005865f, 0.004748f, 0.010707f, -0.005227f, 0.001322f, 0.055654f, -0.050979f, 0.003809f, 0.061034f, 0.006943f, 0.016688f, -0.025159f, -0.006796f, 0.030790f, 0.055989f, 0.001508f, 0.049619f, -0.020906f, 0.044857f, -0.017450f, 0.033129f, 0.032116f, -0.008656f, 0.064072f, -0.011271f, -0.004936f, -0.019907f, -0.032225f, -0.031939f, -0.017215f, -0.019353f, -0.049041f, -0.021905f, -0.013415f, 0.016339f, 0.012303f, 0.001095f, -0.029659f, -0.025964f, -0.020336f, -0.073620f, -0.050550f, -0.037454f, -0.002553f, + 0.048371f, -0.031277f, -0.005037f, -0.023809f, -0.036913f, -0.028682f, -0.037683f, -0.037221f, -0.016075f, -0.044121f, -0.050152f, -0.041696f, 0.011240f, -0.028436f, -0.016334f, -0.035719f, 0.034260f, 0.058676f, 0.004125f, -0.005498f, -0.021140f, 0.005861f, -0.004446f, -0.000372f, -0.005478f, 0.019279f, 0.002964f, 0.040399f, -0.035075f, 0.004152f, -0.029971f, 0.060809f, 0.013766f, -0.033837f, 0.026613f, -0.023926f, 0.021442f, -0.032523f, 0.018832f, 0.004028f, -0.021079f, 0.019215f, -0.032835f, -0.009534f, 0.009125f, 0.033701f, 0.013223f, 0.058944f, -0.014065f, -0.036292f, 0.002358f, -0.009664f, 0.003174f, -0.023803f, -0.022767f, -0.038981f, 0.003566f, -0.041600f, -0.010157f, -0.006021f, -0.038997f, 0.025202f, 0.029240f, -0.018184f, -0.004583f, -0.055000f, 0.059581f, 0.074837f, 0.008011f, -0.033331f, 0.003438f, -0.057439f, 0.106103f, 0.041795f, -0.010039f, -0.031174f, -0.010273f, -0.033197f, 0.035669f, 0.094249f, 0.000743f, -0.060649f, -0.029570f, 0.034698f, 0.011179f, -0.011204f, 0.043047f, -0.007508f, 0.004228f, 0.026503f, -0.004038f, -0.024575f, -0.009724f, 0.021982f, -0.028237f, -0.023399f, + -0.011321f, 0.009708f, -0.000098f, -0.003683f, -0.012714f, 0.020700f, 0.000595f, 0.030163f, 0.021609f, -0.029216f, 0.013313f, 0.036821f, 0.018598f, -0.026976f, 0.009235f, 0.006812f, 0.022696f, 0.001434f, 0.006893f, 0.007321f, 0.008423f, 0.051417f, 0.046362f, 0.030436f, 0.063388f, -0.031338f, 0.031887f, -0.037939f, 0.022999f, 0.000154f, 0.020869f, 0.028740f, 0.007458f, 0.007783f, 0.032624f, 0.016276f, -0.010760f, 0.021978f, -0.001492f, 0.029242f, -0.032535f, -0.017843f, 0.001154f, 0.069872f, -0.049974f, 0.003768f, -0.062305f, -0.008924f, 0.006120f, 0.021020f, -0.029906f, -0.011239f, -0.023485f, 0.089321f, 0.007961f, 0.006071f, -0.019105f, -0.012960f, 0.015607f, 0.013439f, 0.009022f, 0.034458f, 0.015352f, -0.014742f, 0.019293f, 0.036940f, -0.000483f, 0.040584f, -0.002867f, 0.019810f, -0.040130f, 0.075007f, -0.009912f, -0.008480f, 0.013850f, -0.056249f, -0.013180f, -0.026799f, 0.041377f, 0.022472f, 0.024155f, -0.025809f, 0.011288f, 0.010283f, -0.033465f, 0.010600f, 0.031993f, 0.026564f, 0.010773f, -0.007685f, 0.005674f, -0.015823f, 0.059036f, 0.009847f, 0.027996f, 0.022314f, + 0.033102f, -0.049139f, -0.001487f, -0.013651f, 0.012140f, -0.017061f, -0.019332f, 0.043782f, -0.036946f, 0.032719f, -0.022155f, 0.034478f, -0.003871f, -0.031606f, 0.000428f, -0.048490f, 0.035445f, 0.031794f, 0.039589f, -0.102573f, 0.034948f, 0.021902f, -0.027371f, -0.018654f, -0.024572f, 0.057385f, -0.071381f, 0.049740f, 0.116126f, 0.005121f, -0.043854f, -0.018458f, 0.041654f, 0.062157f, 0.024324f, -0.019443f, 0.010700f, -0.046577f, 0.002940f, -0.026121f, 0.041670f, 0.008318f, 0.007965f, -0.021293f, 0.015863f, -0.002312f, -0.023368f, 0.013808f, -0.023914f, -0.006230f, -0.021006f, -0.036158f, -0.028537f, 0.035429f, 0.020409f, 0.024538f, 0.016664f, -0.044734f, -0.019256f, 0.015017f, -0.019535f, 0.034463f, 0.015824f, 0.006995f, 0.012790f, 0.054921f, -0.019790f, -0.045707f, 0.092061f, -0.037093f, -0.059193f, 0.065369f, -0.034062f, -0.011769f, 0.008386f, 0.036226f, -0.041186f, -0.005888f, -0.001399f, -0.018227f, 0.121130f, 0.004502f, -0.025832f, -0.002286f, -0.004112f, 0.037221f, -0.067147f, -0.041126f, -0.031770f, -0.018706f, -0.007594f, -0.047094f, -0.005644f, 0.001647f, 0.013951f, 0.086552f, + 0.074993f, -0.024439f, 0.056554f, -0.054087f, -0.060521f, 0.040514f, 0.044458f, -0.009281f, 0.007878f, 0.015114f, 0.028593f, 0.052532f, -0.005555f, 0.014015f, 0.052179f, -0.033892f, 0.004943f, -0.036702f, 0.039760f, 0.000237f, 0.024538f, -0.025036f, -0.037514f, 0.035200f, -0.037077f, 0.011561f, -0.007998f, 0.033187f, 0.000924f, 0.007299f, -0.019224f, 0.006402f, -0.013279f, -0.049057f, -0.037820f, 0.016612f, -0.001990f, -0.001123f, 0.009171f, 0.036827f, -0.015205f, -0.010914f, -0.029476f, 0.013607f, 0.012662f, -0.003384f, -0.004603f, -0.081900f, 0.005336f, 0.023727f, -0.027806f, 0.021159f, -0.043900f, -0.007839f, 0.004874f, 0.029404f, 0.038067f, 0.005324f, -0.015152f, 0.012560f, 0.067222f, 0.057981f, 0.058762f, -0.001174f, -0.002718f, 0.013625f, 0.009381f, -0.024163f, 0.019560f, 0.073385f, -0.047930f, -0.014273f, -0.011597f, 0.002763f, 0.006079f, 0.012271f, -0.034206f, -0.054207f, -0.017751f, 0.000619f, 0.120484f, 0.063880f, 0.044134f, 0.000326f, -0.005015f, -0.022551f, 0.056279f, 0.016262f, 0.038766f, -0.000127f, -0.008625f, -0.006157f, -0.014646f, -0.077428f, 0.042606f, 0.041002f, + -0.004140f, 0.066121f, 0.026830f, -0.041734f, -0.045119f, 0.020744f, -0.019696f, -0.036993f, 0.000554f, 0.005888f, 0.015508f, -0.007678f, 0.020843f, -0.003619f, 0.019636f, 0.029633f, -0.027402f, -0.100768f, 0.053290f, -0.013422f, -0.034172f, 0.025571f, 0.034546f, 0.003459f, -0.071033f, -0.006851f, -0.004736f, -0.068857f, -0.046319f, 0.039731f, -0.012763f, -0.026570f, -0.026385f, 0.018450f, -0.071147f, -0.046700f, 0.091550f, -0.005499f, -0.056184f, 0.023776f, 0.048851f, 0.024362f, -0.078783f, 0.112504f, 0.042484f, -0.064999f, 0.035700f, 0.052463f, 0.005990f, -0.042979f, 0.045673f, 0.056170f, 0.030402f, -0.039183f, 0.038011f, 0.077711f, 0.002094f, 0.078607f, 0.091201f, -0.046323f, -0.031570f, -0.031017f, 0.086171f, 0.059918f, -0.039902f, 0.025589f, -0.024614f, -0.051581f, 0.046999f, 0.114366f, 0.015294f, -0.028239f, -0.026500f, 0.067088f, 0.066522f, 0.101915f, 0.043778f, -0.044887f, -0.013893f, -0.037920f, 0.024100f, -0.019350f, 0.030517f, 0.017043f, -0.045585f, 0.022518f, -0.046449f, -0.018059f, 0.002547f, -0.019547f, 0.004939f, 0.023685f, 0.022084f, -0.000238f, -0.036409f, 0.007114f, + 0.033468f, -0.013375f, 0.007049f, -0.015602f, -0.042806f, 0.044265f, -0.024812f, 0.030184f, -0.044031f, -0.029035f, -0.003902f, -0.039827f, -0.008638f, 0.037405f, -0.035137f, 0.049803f, 0.006227f, 0.040342f, 0.019494f, -0.022337f, -0.053050f, 0.044538f, 0.031712f, 0.017672f, 0.015079f, 0.045957f, -0.031795f, -0.019384f, -0.016867f, 0.013321f, 0.021418f, -0.006175f, -0.040574f, -0.003537f, -0.002248f, -0.046285f, -0.013723f, 0.005539f, 0.016300f, 0.033787f, 0.000148f, -0.032948f, 0.046461f, -0.009538f, -0.002557f, 0.049069f, 0.028885f, -0.042553f, 0.018443f, -0.026175f, 0.021098f, -0.013362f, 0.024303f, -0.034173f, 0.021031f, -0.075016f, -0.092413f, -0.046703f, 0.266623f, 0.237822f, 0.140880f, 0.314956f, -0.068830f, -0.233731f, -0.084876f, -0.442154f, -0.234789f, -0.003082f, -0.117092f, 0.160150f, 0.288544f, 0.042231f, 0.168524f, 0.334592f, 0.053472f, 0.117584f, 0.008590f, -0.341016f, -0.288531f, -0.251273f, -0.280796f, -0.167428f, 0.135285f, 0.059580f, 0.135369f, 0.361166f, 0.214075f, 0.057199f, 0.264149f, 0.122917f, -0.166897f, 0.089794f, -0.122778f, -0.312664f, -0.042091f, -0.193086f, + -0.359810f, -0.160130f, -0.040691f, -0.186281f, 0.204531f, 0.224669f, 0.102112f, 0.357456f, 0.399260f, 0.153315f, 0.195051f, 0.188331f, -0.214663f, -0.136868f, -0.273488f, -0.419678f, -0.391112f, -0.247764f, -0.254085f, -0.071941f, 0.155039f, 0.207818f, 0.272182f, 0.391926f, 0.345629f, 0.204871f, 0.142308f, 0.025213f, -0.173195f, -0.240256f, -0.185494f, -0.229158f, -0.293171f, -0.096715f, -0.122116f, -0.043571f, 0.131070f, 0.064402f, 0.001700f} + }, + { + {-0.002352f, 0.006376f, -0.007012f, -0.001470f, 0.000350f, 0.000536f, 0.002805f, 0.011712f, 0.000868f, -0.002777f, -0.004222f, 0.010547f, -0.001084f, -0.005301f, 0.001989f, -0.003695f, 0.002727f, 0.002137f, 0.013974f, 0.003621f, -0.007597f, 0.003237f, -0.000408f, 0.001298f, -0.006753f, 0.004314f, 0.000599f, -0.004995f, -0.002956f, -0.000535f, 0.000580f, -0.000611f, 0.004414f, -0.001206f, -0.004205f, -0.001043f, -0.002893f, -0.000549f, -0.005136f, 0.001887f, 0.005415f, -0.000818f, -0.007461f, 0.004586f, -0.004569f, -0.002780f, 0.000223f, 0.002147f, -0.003831f, -0.001110f, 0.006943f, -0.003650f, 0.001985f, -0.004589f, 0.003359f, -0.001571f, 0.002341f, 0.003089f, 0.001925f, -0.001803f, -0.001008f, 0.003578f, -0.005608f, -0.010339f, 0.002207f, -0.001318f, -0.003266f, 0.000931f, -0.000567f, -0.000645f, 0.000699f, -0.003763f, 0.004110f, -0.005348f, 0.004339f, 0.001872f, -0.000993f, 0.012047f, -0.001261f, 0.003683f, -0.002217f, 0.016079f, -0.006318f, -0.001516f, -0.000582f, 0.002031f, -0.002844f, 0.007394f, -0.001276f, -0.004906f, -0.000880f, 0.010101f, 0.000749f, -0.005029f, 0.004720f, 0.003532f, + 0.006630f, 0.002773f, -0.005019f, -0.003265f, 0.011255f, 0.001634f, -0.002844f, -0.002146f, -0.002252f, 0.002286f, 0.002434f, -0.001366f, -0.014249f, -0.003493f, 0.000748f, 0.009963f, 0.003594f, -0.001128f, 0.000033f, -0.005595f, 0.007945f, -0.007923f, -0.010585f, 0.001496f, 0.000208f, -0.003499f, -0.002343f, -0.002857f, 0.001657f, 0.001108f, 0.001086f, -0.003595f, 0.009485f, 0.000439f, 0.012675f, -0.001847f, -0.005755f, 0.002920f, -0.000443f, 0.001984f, 0.003149f, 0.006533f, 0.004576f, -0.001372f, -0.003114f, -0.002649f, 0.008472f, -0.007938f, 0.000743f, 0.000607f, -0.000953f, -0.006624f, 0.006847f, -0.002982f, 0.001587f, 0.006260f, -0.001610f, 0.002031f, -0.004619f, 0.003998f, 0.002614f, -0.005740f, -0.002960f, -0.000593f, 0.000626f, -0.000457f, -0.000726f, -0.003002f, 0.005153f, 0.000797f, -0.002095f, -0.003146f, -0.000071f, 0.010276f, -0.001393f, -0.005118f, 0.006769f, -0.002815f, -0.006253f, -0.000853f, 0.005415f, 0.003787f, -0.003413f, 0.000718f, -0.004284f, 0.002281f, 0.002487f, -0.002310f, 0.005378f, -0.001718f, -0.009660f, 0.001532f, 0.005016f, 0.004405f, 0.000653f, -0.001002f, + -0.007026f, -0.002661f, -0.000948f, -0.003382f, 0.006296f, 0.008567f, 0.004096f, -0.012465f, 0.004050f, 0.013920f, 0.005839f, -0.001067f, -0.000172f, 0.006185f, -0.003342f, 0.001742f, -0.006124f, -0.005877f, 0.005404f, 0.005786f, 0.002874f, 0.001184f, 0.000947f, 0.000732f, 0.002771f, -0.000001f, -0.000772f, -0.002764f, 0.001258f, -0.004916f, -0.001080f, -0.002584f, -0.008996f, -0.005199f, 0.001398f, 0.002185f, 0.008158f, -0.000437f, 0.003290f, -0.005191f, -0.008105f, -0.004823f, 0.004215f, -0.003458f, -0.003818f, -0.003759f, -0.005373f, 0.005254f, 0.000615f, 0.003910f, -0.001737f, 0.001289f, -0.010911f, -0.006759f, -0.005020f, 0.007148f, 0.001255f, 0.001756f, 0.003735f, -0.003617f, -0.002001f, -0.000642f, 0.001212f, -0.007978f, -0.001617f, -0.005304f, -0.006055f, 0.000585f, -0.005333f, 0.003819f, 0.003372f, 0.014554f, -0.003545f, 0.007528f, -0.004814f, 0.003263f, -0.003280f, 0.001009f, 0.012570f, 0.002271f, 0.005495f, -0.005659f, 0.003904f, -0.005061f, -0.002424f, -0.000551f, 0.008078f, -0.003647f, -0.001893f, -0.006795f, -0.003583f, -0.008072f, -0.000920f, 0.008173f, 0.002119f, 0.000864f, + 0.001635f, 0.007511f, -0.006830f, -0.012248f, 0.003252f, 0.004198f, -0.007762f, -0.000360f, 0.001578f, -0.001811f, 0.003878f, 0.009957f, 0.002772f, -0.002394f, 0.001211f, -0.003567f, 0.004921f, -0.013101f, 0.002449f, -0.004798f, -0.009087f, -0.007134f, 0.004145f, -0.002216f, -0.000115f, 0.008994f, 0.003418f, -0.001639f, 0.001133f, 0.007593f, -0.003418f, 0.005515f, -0.002345f, 0.001405f, -0.008084f, -0.001830f, 0.005998f, -0.002266f, 0.007374f, 0.007573f, 0.002913f, 0.004637f, 0.010684f, -0.002792f, -0.014328f, 0.002960f, -0.006215f, 0.000086f, -0.017623f, 0.000113f, 0.006035f, -0.003972f, 0.006967f, 0.000563f, -0.006186f, 0.001931f, -0.013201f, -0.009017f, -0.003021f, -0.003715f, -0.010922f, 0.005254f, 0.006449f, -0.000056f, 0.006011f, 0.000013f, 0.001798f, -0.004065f, 0.005452f, 0.003533f, -0.001881f, 0.011873f, -0.002126f, 0.009713f, 0.008907f, -0.000999f, -0.001264f, -0.000489f, 0.002925f, 0.003628f, 0.001423f, 0.004101f, 0.001604f, 0.000995f, 0.013644f, 0.004590f, -0.006055f, -0.003400f, -0.000303f, -0.003994f, 0.001579f, -0.003152f, 0.012670f, -0.024129f, -0.000161f, 0.000197f, + 0.006023f, 0.010981f, 0.003532f, -0.005108f, -0.009131f, -0.001129f, 0.011379f, -0.001896f, -0.002417f, -0.008277f, -0.000402f, -0.003251f, 0.008388f, 0.010538f, -0.017705f, 0.011775f, 0.007115f, -0.006283f, -0.001601f, -0.008814f, -0.000117f, -0.002387f, 0.000048f, 0.006417f, 0.011484f, -0.003961f, 0.002533f, -0.002622f, -0.004141f, 0.004768f, 0.007887f, 0.005881f, -0.005197f, -0.007810f, 0.005638f, 0.004513f, -0.003123f, -0.000984f, 0.000881f, -0.010138f, 0.003758f, 0.003808f, -0.004400f, -0.006542f, 0.002646f, -0.004794f, 0.009395f, 0.004853f, -0.016793f, 0.008328f, -0.007243f, -0.017629f, -0.005416f, -0.000572f, 0.003613f, -0.006680f, -0.000412f, 0.004979f, -0.008163f, -0.006998f, -0.008378f, -0.001466f, 0.002098f, 0.018649f, 0.002788f, 0.004661f, -0.003655f, -0.007587f, 0.012071f, -0.001804f, -0.013639f, 0.002937f, -0.013546f, 0.004375f, 0.015161f, 0.004090f, 0.003282f, 0.006666f, 0.009550f, -0.002085f, 0.023347f, -0.003361f, 0.016711f, -0.019658f, 0.006797f, 0.011568f, -0.004153f, 0.001669f, -0.005526f, -0.000455f, 0.009027f, 0.016507f, -0.004617f, -0.008058f, -0.002365f, 0.007763f, + 0.001669f, 0.016821f, 0.007942f, -0.001664f, 0.002450f, 0.000031f, -0.007753f, 0.001722f, -0.001684f, -0.002235f, 0.007360f, 0.009789f, -0.015062f, 0.017693f, -0.013231f, -0.006996f, 0.003047f, -0.005127f, 0.008880f, 0.000510f, -0.004973f, 0.012650f, 0.017389f, -0.012557f, -0.002236f, -0.000899f, 0.005451f, -0.011813f, -0.020009f, -0.008954f, -0.006050f, 0.006378f, -0.013844f, -0.007547f, -0.001524f, 0.014995f, 0.009184f, -0.009462f, 0.007296f, 0.004493f, -0.005384f, -0.007530f, -0.001216f, -0.004256f, -0.005814f, 0.001549f, -0.003848f, 0.011897f, -0.008112f, -0.000410f, 0.009174f, -0.005669f, 0.009823f, 0.013874f, 0.002684f, 0.003106f, -0.001364f, 0.008523f, 0.007643f, 0.009354f, -0.008976f, -0.012787f, -0.006294f, 0.008088f, 0.000813f, 0.034605f, -0.002231f, -0.001204f, -0.008006f, -0.016137f, -0.022777f, -0.005458f, 0.008096f, 0.011968f, -0.007231f, -0.015183f, 0.002369f, -0.000173f, 0.015350f, -0.005284f, -0.005654f, 0.018112f, -0.009565f, 0.000922f, -0.013719f, 0.008825f, -0.002368f, -0.000182f, -0.002668f, -0.021852f, -0.013064f, 0.000920f, 0.012498f, 0.007802f, 0.001493f, -0.022593f, + 0.015399f, -0.009235f, -0.008696f, -0.009831f, -0.012250f, -0.002157f, 0.012741f, -0.010057f, -0.010346f, 0.007403f, -0.002972f, 0.004229f, 0.023027f, -0.009843f, 0.001122f, 0.001085f, 0.010175f, -0.006627f, -0.005392f, -0.003048f, 0.014952f, -0.003113f, -0.006771f, -0.001164f, 0.011884f, 0.014667f, -0.013493f, -0.015939f, -0.004656f, -0.001913f, -0.004489f, 0.004210f, -0.010332f, -0.002794f, -0.009079f, -0.015338f, 0.003787f, -0.011006f, 0.009272f, 0.012217f, -0.009082f, -0.010108f, -0.009288f, 0.005234f, -0.001295f, 0.017540f, 0.029414f, -0.016301f, 0.000700f, -0.000252f, -0.002489f, 0.003233f, 0.008211f, -0.024018f, 0.021566f, -0.016776f, -0.008970f, 0.022623f, -0.005563f, -0.010078f, 0.006881f, 0.008699f, 0.000029f, -0.000701f, -0.017563f, 0.011217f, -0.002935f, 0.004276f, -0.011824f, 0.014688f, -0.001834f, -0.022947f, -0.025722f, 0.009047f, -0.005210f, -0.012329f, 0.005751f, -0.000386f, 0.038308f, 0.007261f, -0.007832f, -0.010847f, -0.023732f, -0.007357f, 0.003656f, -0.004760f, 0.017078f, -0.002921f, -0.027705f, -0.001663f, 0.017379f, -0.007056f, 0.001289f, 0.016952f, 0.009501f, -0.007899f, + -0.003065f, 0.014089f, 0.015655f, -0.006530f, 0.001602f, 0.003902f, -0.010325f, 0.005338f, -0.006198f, 0.000679f, -0.000284f, -0.001850f, -0.008371f, -0.013885f, -0.022723f, -0.011357f, 0.008576f, -0.019667f, 0.007273f, -0.021255f, 0.000533f, 0.008157f, -0.003787f, -0.015826f, -0.007891f, -0.002980f, 0.014152f, 0.011789f, -0.008898f, -0.008594f, 0.015116f, 0.006742f, -0.009213f, -0.009315f, -0.007798f, -0.000705f, 0.014616f, -0.002213f, 0.001075f, -0.000515f, -0.000456f, 0.019455f, 0.009218f, 0.013146f, -0.001162f, -0.000603f, 0.006346f, -0.009562f, -0.016910f, 0.013950f, 0.021667f, -0.014477f, 0.018602f, -0.005180f, -0.002131f, -0.008098f, 0.009495f, 0.000946f, -0.010743f, 0.006775f, 0.017627f, 0.014290f, 0.006271f, -0.013021f, -0.005632f, -0.026725f, 0.004376f, 0.014465f, -0.008802f, -0.001817f, -0.010788f, 0.003163f, -0.006412f, 0.010867f, -0.006673f, 0.003859f, 0.012614f, 0.007503f, 0.023770f, 0.012706f, 0.008207f, 0.015449f, -0.012370f, 0.023008f, 0.007473f, 0.014087f, -0.003907f, -0.015389f, -0.023245f, -0.004394f, -0.002795f, -0.006219f, -0.003840f, 0.008789f, 0.011514f, -0.024163f, + 0.017812f, 0.005683f, -0.003328f, 0.025440f, 0.020247f, -0.033264f, -0.021761f, 0.020243f, 0.035747f, -0.003783f, 0.005422f, -0.003557f, -0.004335f, -0.004116f, -0.001347f, 0.008402f, 0.005457f, 0.020856f, 0.005372f, 0.019895f, 0.005866f, 0.008246f, -0.002758f, -0.012360f, 0.005000f, 0.000831f, -0.009493f, 0.014920f, 0.001588f, 0.005451f, 0.003624f, -0.004161f, -0.014673f, 0.000950f, -0.016657f, -0.006589f, -0.019283f, -0.013872f, -0.007888f, 0.015001f, 0.002145f, 0.006773f, 0.019543f, -0.009752f, -0.001840f, 0.001028f, 0.006874f, 0.000776f, 0.000260f, -0.006971f, 0.014361f, 0.030652f, 0.015231f, -0.027217f, -0.018511f, -0.020660f, 0.021963f, -0.005187f, -0.020832f, 0.010078f, -0.011774f, -0.003341f, -0.003579f, -0.003676f, -0.001751f, -0.001737f, 0.019395f, 0.029520f, 0.012221f, 0.024726f, 0.018057f, 0.005489f, 0.004321f, 0.002539f, -0.006698f, -0.013918f, 0.004335f, 0.031446f, 0.006759f, 0.010688f, -0.009618f, 0.007670f, -0.015103f, -0.028423f, 0.001338f, 0.014354f, 0.005164f, 0.011442f, 0.017544f, 0.018006f, 0.001841f, -0.020671f, -0.016405f, -0.027203f, -0.040666f, -0.001137f, + -0.004207f, 0.017937f, 0.014417f, -0.015907f, -0.007858f, 0.010428f, 0.022499f, -0.027406f, -0.016667f, -0.005457f, -0.014012f, -0.010326f, -0.004695f, 0.008237f, 0.017701f, 0.000649f, -0.009346f, -0.012619f, 0.017897f, -0.013589f, -0.004824f, -0.000351f, 0.024849f, -0.001564f, 0.002878f, -0.037396f, -0.001917f, 0.009440f, 0.020239f, 0.025444f, 0.006342f, -0.023770f, 0.012365f, 0.001026f, 0.012315f, 0.016459f, 0.003608f, 0.008728f, 0.019106f, 0.032660f, -0.020145f, -0.007229f, -0.000907f, 0.011028f, 0.034705f, 0.015764f, 0.012222f, 0.020780f, -0.005557f, -0.008939f, -0.019334f, -0.022835f, -0.014248f, 0.002341f, 0.017076f, 0.041023f, 0.017513f, 0.008611f, 0.024358f, -0.028563f, -0.018929f, -0.003846f, 0.041697f, 0.015761f, 0.001995f, 0.021364f, -0.012740f, 0.032434f, -0.006744f, -0.029694f, -0.004572f, -0.029484f, 0.024572f, 0.013449f, 0.010343f, 0.008591f, 0.001711f, -0.009785f, 0.012570f, 0.016423f, 0.009762f, -0.006364f, 0.016437f, 0.019825f, 0.019467f, -0.002673f, -0.014392f, 0.027076f, 0.007866f, -0.002034f, -0.003162f, 0.002975f, -0.016426f, 0.017520f, -0.001836f, -0.005210f, + -0.021253f, -0.012669f, -0.012464f, 0.031820f, 0.013107f, 0.000160f, 0.005968f, 0.016403f, 0.025583f, 0.012012f, -0.028894f, 0.027899f, -0.001376f, 0.016125f, 0.008897f, 0.024557f, -0.003575f, -0.032212f, 0.012246f, -0.001461f, 0.015557f, -0.005687f, -0.010842f, 0.012026f, -0.002704f, 0.008187f, 0.043085f, -0.004863f, -0.015988f, 0.000144f, 0.008164f, -0.019677f, 0.035695f, -0.014650f, -0.016408f, 0.028419f, -0.012437f, 0.009406f, -0.009119f, 0.006171f, -0.024341f, -0.008368f, 0.016928f, 0.000317f, -0.023785f, 0.003876f, -0.006758f, 0.016238f, 0.007116f, 0.006790f, -0.041417f, 0.010269f, 0.003233f, 0.013849f, 0.030676f, -0.001710f, -0.001178f, -0.000888f, -0.011873f, 0.025408f, -0.024896f, 0.005553f, 0.019627f, 0.008425f, 0.018258f, -0.010671f, -0.010782f, -0.018729f, -0.025861f, 0.007669f, 0.006661f, 0.012866f, 0.032334f, -0.014945f, 0.028068f, 0.010301f, -0.022417f, -0.017874f, 0.001999f, -0.001129f, 0.003716f, -0.004136f, 0.015125f, 0.018072f, 0.022844f, 0.004552f, -0.049347f, 0.008637f, 0.017857f, 0.011053f, -0.031635f, 0.016263f, -0.014996f, 0.013410f, 0.004701f, 0.004821f, + -0.002046f, 0.008648f, -0.001501f, 0.039071f, 0.023831f, -0.024855f, 0.005201f, -0.060724f, 0.012077f, -0.021935f, -0.013947f, 0.009644f, 0.013996f, -0.034071f, -0.052353f, 0.028135f, 0.023874f, -0.059174f, 0.021066f, -0.020837f, -0.008216f, -0.009431f, 0.018532f, -0.013773f, -0.001653f, 0.004770f, 0.050372f, -0.005364f, 0.035847f, 0.011010f, 0.026517f, 0.003517f, 0.006218f, 0.010926f, 0.048414f, 0.052131f, -0.027997f, -0.022118f, 0.026837f, -0.034855f, -0.001972f, 0.011558f, -0.038459f, 0.022416f, 0.000869f, -0.001240f, -0.008717f, -0.009437f, 0.002262f, 0.005593f, 0.004660f, -0.020718f, -0.002029f, -0.003795f, -0.031691f, 0.016689f, 0.018194f, -0.031210f, -0.026845f, -0.010343f, 0.015312f, 0.018912f, 0.014002f, -0.000077f, -0.009224f, 0.017176f, 0.049766f, 0.029971f, -0.013032f, -0.005084f, -0.009951f, 0.037136f, -0.031201f, 0.014854f, 0.004470f, -0.042305f, -0.021444f, -0.000139f, 0.002700f, -0.035511f, 0.022281f, 0.018700f, 0.003836f, 0.009095f, 0.013966f, -0.033381f, -0.008457f, -0.027280f, -0.003182f, 0.020395f, 0.025796f, 0.021106f, -0.024760f, -0.008081f, -0.007459f, 0.003123f, + -0.028366f, -0.005046f, 0.024400f, 0.036959f, -0.002251f, 0.002089f, -0.022755f, 0.001606f, -0.000669f, -0.016846f, -0.027237f, -0.005625f, -0.012424f, -0.020998f, -0.014763f, 0.023055f, -0.019466f, 0.016635f, -0.005624f, -0.005046f, 0.033088f, -0.022978f, -0.012301f, 0.004696f, 0.013551f, 0.001620f, -0.042975f, -0.026924f, 0.005292f, -0.007280f, 0.007360f, -0.006359f, -0.013268f, 0.027321f, 0.006237f, -0.002674f, -0.011028f, -0.062581f, 0.037716f, -0.011553f, -0.000383f, -0.005583f, 0.002667f, 0.017584f, -0.010102f, -0.017264f, -0.028816f, -0.003003f, 0.013079f, -0.018203f, -0.022815f, 0.009253f, 0.036779f, -0.006447f, 0.034194f, 0.024821f, -0.024754f, 0.045584f, 0.030390f, -0.030403f, -0.046589f, -0.013605f, -0.020306f, 0.002337f, -0.014808f, -0.003763f, 0.022269f, -0.039121f, 0.018956f, -0.006393f, -0.022176f, -0.024463f, -0.024829f, -0.029496f, 0.005617f, 0.018138f, -0.016976f, 0.025657f, -0.039696f, 0.072099f, 0.101101f, -0.009636f, 0.012161f, 0.006628f, 0.024337f, 0.049223f, -0.047076f, 0.000675f, 0.007902f, 0.001037f, -0.017138f, 0.002635f, -0.021135f, 0.024747f, 0.060056f, -0.012641f, + 0.001009f, 0.003536f, 0.017967f, 0.001770f, 0.006755f, 0.023294f, -0.046831f, -0.003368f, 0.045230f, 0.046956f, -0.055165f, -0.011517f, 0.007450f, 0.007821f, 0.015843f, 0.041361f, 0.011115f, 0.083319f, 0.013326f, 0.025816f, 0.011699f, -0.012908f, -0.017854f, -0.000813f, -0.059012f, -0.083770f, -0.029111f, -0.027017f, -0.088214f, 0.013970f, -0.002859f, -0.048547f, -0.024677f, -0.081487f, -0.009844f, -0.010835f, 0.054839f, -0.054155f, 0.033082f, -0.036743f, -0.004141f, -0.023829f, -0.020565f, 0.022844f, 0.048880f, -0.037539f, -0.015847f, -0.002130f, -0.012876f, -0.002354f, 0.019628f, 0.042477f, 0.041335f, -0.027560f, 0.084739f, 0.062296f, 0.006119f, -0.025750f, -0.070512f, -0.036665f, 0.066729f, 0.109751f, -0.025442f, -0.006165f, 0.020084f, 0.048814f, 0.017107f, -0.029231f, 0.018431f, -0.025069f, 0.006818f, 0.015015f, -0.005465f, -0.033653f, 0.010380f, 0.034522f, -0.008342f, -0.050968f, 0.039786f, -0.012221f, 0.032534f, -0.012586f, -0.007573f, -0.013125f, -0.019996f, -0.001551f, 0.036041f, 0.019184f, 0.006230f, 0.028083f, -0.013411f, -0.012264f, 0.011289f, -0.016275f, 0.020249f, 0.010766f, + 0.030815f, 0.051461f, 0.046129f, -0.034022f, -0.061348f, -0.023487f, -0.003689f, 0.047105f, -0.018290f, 0.007452f, 0.019552f, -0.020273f, -0.028265f, -0.046622f, -0.046531f, 0.035399f, 0.039200f, -0.032678f, -0.112167f, 0.007773f, -0.007915f, -0.016997f, 0.008665f, -0.012944f, -0.045089f, -0.022940f, -0.010671f, -0.033415f, -0.013528f, 0.045332f, 0.017914f, 0.024728f, -0.010980f, -0.018970f, -0.010319f, 0.022294f, 0.004338f, -0.001062f, 0.022916f, 0.053293f, -0.025116f, -0.001833f, -0.021008f, 0.011921f, -0.029176f, -0.044082f, -0.011338f, -0.006190f, 0.007045f, -0.014115f, 0.033658f, -0.019442f, -0.072801f, -0.037284f, 0.023311f, -0.032231f, 0.038260f, 0.036857f, -0.017092f, -0.003957f, 0.003699f, -0.020331f, -0.001348f, 0.013064f, -0.004581f, 0.007788f, 0.048745f, 0.043362f, -0.012681f, -0.065047f, -0.052016f, 0.005291f, 0.033703f, -0.025190f, -0.013082f, -0.029843f, -0.041894f, 0.005339f, -0.013011f, -0.045544f, -0.053098f, -0.073709f, 0.028626f, 0.012176f, -0.000083f, 0.045352f, 0.056592f, -0.000371f, -0.045445f, -0.031112f, -0.037142f, -0.017824f, -0.014388f, 0.015531f, 0.020674f, -0.017758f, + -0.034086f, -0.036605f, 0.018794f, 0.021115f, -0.040541f, -0.033598f, -0.016774f, -0.002926f, -0.024507f, 0.017859f, 0.092644f, 0.061399f, 0.108618f, 0.042419f, -0.060499f, 0.075637f, -0.004467f, -0.026305f, 0.002593f, -0.019912f, -0.069998f, 0.065832f, -0.037358f, 0.004236f, 0.019439f, -0.008375f, -0.048784f, 0.049341f, 0.047250f, -0.027211f, -0.037293f, 0.005051f, 0.065394f, -0.034320f, 0.018679f, 0.041821f, 0.012867f, -0.015802f, -0.031171f, -0.020547f, 0.014537f, -0.004991f, 0.011082f, -0.018313f, 0.012222f, -0.040537f, 0.059338f, -0.005714f, 0.013330f, -0.002757f, -0.074782f, 0.023369f, -0.020723f, 0.038656f, 0.023183f, 0.041329f, -0.016151f, -0.071937f, 0.051693f, 0.023522f, -0.024627f, -0.044629f, 0.036979f, 0.020209f, 0.039300f, 0.040237f, -0.034978f, 0.016453f, 0.041402f, -0.060533f, 0.055662f, 0.028191f, -0.002142f, 0.018564f, -0.032107f, 0.071008f, -0.008417f, 0.047203f, 0.020106f, 0.082668f, -0.006433f, -0.012776f, 0.010598f, 0.034910f, 0.020937f, 0.025212f, 0.080956f, 0.007464f, 0.018507f, 0.051325f, -0.033818f, 0.037123f, 0.001201f, -0.049243f, 0.016601f, -0.010783f, + 0.056252f, -0.033186f, -0.048394f, -0.120712f, 0.006452f, -0.014633f, 0.003601f, 0.093771f, 0.076891f, 0.111022f, 0.058386f, -0.029275f, -0.022717f, -0.045707f, -0.061350f, 0.021773f, 0.005239f, 0.016313f, 0.019337f, -0.017582f, 0.027741f, 0.047527f, 0.008566f, -0.012370f, -0.016134f, -0.033171f, -0.022380f, -0.019910f, 0.009116f, 0.015394f, -0.048196f, -0.028075f, -0.006757f, 0.032635f, -0.014689f, 0.021180f, 0.025673f, -0.067873f, -0.067439f, 0.013226f, 0.019364f, 0.015475f, -0.050952f, -0.022842f, -0.045787f, -0.021539f, -0.021058f, 0.044587f, -0.058011f, -0.079909f, -0.030461f, 0.016630f, 0.013494f, -0.061414f, -0.050090f, -0.038457f, -0.029920f, 0.034353f, 0.047067f, 0.002974f, -0.016331f, -0.018762f, -0.011248f, -0.009529f, -0.021671f, -0.067926f, 0.022374f, 0.052878f, 0.046757f, 0.015800f, 0.063983f, 0.088155f, -0.007854f, -0.009940f, 0.066394f, -0.014916f, -0.040416f, -0.090703f, -0.029969f, 0.010804f, 0.078281f, 0.029003f, 0.005340f, 0.030152f, -0.033970f, 0.003348f, -0.017854f, -0.023349f, 0.013658f, 0.007075f, -0.021542f, -0.032809f, -0.020618f, -0.030317f, -0.026758f, 0.011804f, + -0.020859f, -0.008228f, 0.013937f, -0.008315f, 0.002421f, -0.009370f, 0.038526f, -0.029227f, 0.031421f, 0.013463f, 0.002710f, -0.028086f, -0.013804f, 0.025684f, 0.008724f, 0.001390f, 0.018101f, -0.001363f, -0.008841f, -0.010125f, -0.011269f, -0.005995f, 0.002606f, 0.002151f, 0.003027f, -0.032573f, 0.017403f, -0.012088f, -0.014726f, 0.014888f, 0.007343f, 0.007412f, -0.007663f, 0.027560f, 0.020050f, -0.027440f, 0.026297f, -0.000438f, 0.017443f, 0.040618f, -0.008963f, 0.023925f, 0.017817f, -0.014168f, -0.014410f, -0.019917f, 0.000831f, 0.009263f, -0.040737f, 0.021818f, 0.004459f, 0.036899f, -0.013639f, -0.062493f, 0.042064f, 0.011220f, -0.000393f, 0.011676f, -0.032227f, 0.005796f, -0.009363f, 0.022694f, -0.040305f, -0.116737f, -0.172151f, 0.035244f, 0.135684f, 0.004446f, 0.370969f, 0.340649f, 0.234696f, 0.402534f, 0.310414f, 0.040461f, 0.005974f, -0.043989f, -0.297273f, -0.304545f, -0.230961f, -0.398426f, -0.370584f, -0.108304f, -0.124801f, -0.127537f, 0.027755f, 0.071710f, -0.063907f, -0.024098f, 0.116379f, 0.071883f, -0.006705f, 0.084271f, 0.058319f, 0.000300f, 0.070719f, 0.170418f, + 0.111628f, 0.035205f, 0.175513f, 0.127488f, 0.006207f, 0.148514f, 0.204381f, 0.044195f, 0.017711f, 0.206761f, 0.053056f, -0.089748f, 0.101544f, 0.156952f, -0.090128f, 0.030668f, 0.222698f, 0.013614f, 0.030618f, 0.268267f, 0.209794f, 0.009084f, 0.164190f, 0.219167f, -0.088767f, -0.057710f, 0.055235f, -0.198668f, -0.323838f, -0.223254f, -0.356774f, -0.525458f, -0.483281f, -0.539884f, -0.683731f, -0.720960f, -0.638694f, -0.673265f, -0.633306f, -0.473801f, -0.374246f, -0.179391f, 0.004277f, 0.232079f, 0.257570f, 0.057742f}, + {0.001320f, -0.000183f, 0.002318f, -0.002016f, -0.000801f, -0.007018f, -0.003152f, -0.007465f, 0.000744f, -0.004211f, -0.004965f, 0.002457f, 0.004359f, -0.005434f, 0.005429f, 0.000623f, -0.006861f, 0.001091f, -0.007836f, 0.004435f, -0.002193f, -0.001277f, -0.002547f, 0.001779f, -0.003497f, -0.000463f, -0.002269f, 0.002898f, 0.005894f, -0.005430f, -0.002563f, 0.002151f, -0.001185f, 0.003962f, 0.006081f, 0.000255f, 0.002885f, 0.001913f, 0.001795f, -0.000797f, 0.004441f, -0.005837f, -0.002265f, 0.006420f, 0.000209f, 0.007620f, -0.008303f, 0.004397f, -0.003047f, -0.011505f, 0.006014f, 0.005355f, 0.001781f, -0.004090f, -0.002765f, -0.000901f, 0.001231f, 0.000899f, -0.002052f, -0.004014f, -0.002399f, 0.001698f, 0.000273f, 0.003509f, 0.007930f, 0.001857f, 0.000622f, 0.000506f, 0.006620f, 0.003812f, -0.001421f, 0.001819f, -0.000983f, -0.003130f, -0.000646f, -0.004976f, 0.006984f, 0.009656f, -0.005678f, 0.000398f, 0.000309f, -0.006915f, 0.009244f, -0.003687f, -0.003618f, 0.002648f, -0.009544f, -0.004273f, 0.010224f, 0.002329f, -0.004172f, 0.007276f, 0.002248f, 0.001564f, -0.001501f, 0.003555f, + -0.000065f, -0.012223f, -0.000588f, -0.004528f, -0.000554f, -0.000252f, -0.011719f, 0.000198f, -0.007537f, 0.000428f, 0.001175f, 0.005250f, 0.006244f, 0.002086f, 0.001542f, 0.001173f, 0.005390f, -0.002932f, 0.001832f, 0.000375f, 0.000830f, 0.001161f, -0.001644f, 0.004863f, 0.007196f, -0.013835f, 0.006416f, -0.003588f, -0.008379f, -0.005293f, 0.010603f, 0.005384f, -0.003643f, 0.006095f, 0.001702f, -0.003762f, 0.003684f, 0.000137f, -0.000084f, 0.000617f, 0.000632f, -0.001385f, -0.000033f, 0.000850f, -0.000753f, 0.004639f, -0.003015f, -0.006345f, -0.006421f, 0.000023f, 0.001820f, -0.000338f, -0.000051f, 0.003549f, -0.001846f, 0.006198f, 0.005184f, 0.000344f, -0.004075f, 0.002547f, -0.002175f, -0.003312f, 0.000853f, -0.006945f, -0.000781f, -0.005206f, 0.001870f, 0.003225f, 0.003171f, 0.002466f, -0.005346f, -0.000390f, -0.004416f, 0.004791f, -0.009174f, -0.005245f, 0.004734f, -0.010125f, -0.001070f, -0.000663f, 0.002661f, 0.002233f, 0.005059f, 0.010524f, 0.004934f, -0.001293f, 0.000054f, -0.003741f, -0.002839f, -0.018540f, -0.016996f, -0.001116f, 0.012750f, -0.003111f, 0.010208f, 0.000920f, + 0.002997f, -0.003103f, -0.014258f, 0.007475f, 0.002390f, -0.004276f, 0.003660f, -0.007567f, -0.001427f, 0.004369f, 0.002030f, 0.013531f, -0.009114f, 0.008234f, -0.004102f, -0.010554f, -0.004790f, -0.002835f, -0.002773f, 0.003815f, 0.003315f, -0.008506f, -0.003672f, -0.004831f, -0.001676f, 0.008289f, 0.008959f, 0.009487f, -0.006821f, 0.001146f, -0.004247f, -0.000685f, -0.003588f, -0.004925f, -0.005674f, -0.006907f, 0.006935f, -0.006577f, -0.008425f, -0.007373f, 0.000236f, -0.002947f, -0.002323f, -0.005852f, 0.001270f, -0.006536f, -0.000461f, -0.002729f, 0.009938f, -0.006461f, -0.007010f, -0.015707f, -0.020302f, -0.004987f, -0.009061f, -0.008401f, -0.002007f, 0.004118f, -0.005180f, -0.012265f, 0.007518f, -0.017752f, 0.005268f, -0.003060f, -0.003221f, 0.011324f, 0.007999f, 0.004126f, 0.001519f, -0.002071f, -0.001888f, -0.004400f, 0.001770f, 0.007643f, -0.006324f, 0.007240f, 0.006695f, 0.001861f, 0.000902f, 0.002945f, 0.005086f, -0.011602f, -0.005106f, 0.010832f, -0.008627f, 0.000597f, -0.000320f, 0.006578f, -0.001003f, -0.002672f, 0.001088f, 0.011239f, 0.006094f, 0.003832f, 0.003448f, 0.006210f, + -0.010273f, 0.007628f, -0.008458f, 0.007054f, 0.004425f, -0.002249f, -0.001782f, -0.003535f, -0.004892f, -0.007425f, -0.000843f, -0.002400f, -0.006407f, -0.006565f, -0.004417f, -0.003862f, 0.003640f, -0.010322f, -0.000689f, -0.004614f, -0.010309f, -0.004161f, -0.002271f, -0.006453f, -0.002761f, -0.005919f, -0.002916f, 0.005438f, 0.006292f, -0.010721f, -0.006790f, 0.004094f, -0.002668f, -0.011750f, 0.007660f, 0.014965f, 0.002592f, -0.002975f, -0.007245f, 0.002056f, 0.006552f, 0.013589f, -0.007147f, -0.002325f, -0.008894f, -0.006290f, 0.006781f, 0.007756f, -0.010709f, 0.006478f, -0.003763f, -0.006041f, 0.009823f, 0.000459f, 0.005117f, -0.013655f, 0.000446f, -0.008571f, 0.001512f, -0.010761f, -0.007633f, -0.001320f, -0.003203f, 0.024042f, 0.006873f, 0.006641f, 0.003978f, -0.016947f, 0.009155f, 0.007382f, -0.004527f, 0.000149f, 0.006941f, -0.000477f, 0.007338f, 0.009962f, 0.008516f, -0.004735f, -0.000137f, -0.002330f, 0.004064f, -0.003709f, -0.005619f, 0.003810f, -0.005429f, 0.002842f, 0.001738f, 0.000963f, 0.004126f, 0.002988f, -0.012006f, -0.000491f, -0.003674f, -0.014567f, -0.008094f, 0.005944f, + -0.006343f, 0.017066f, 0.007544f, 0.016715f, -0.000215f, -0.008160f, -0.008659f, -0.011713f, 0.017896f, -0.004350f, 0.008212f, 0.009139f, 0.001953f, 0.006448f, 0.005897f, 0.005712f, 0.002342f, -0.011741f, -0.000584f, -0.004506f, -0.001669f, 0.008131f, -0.000629f, -0.000667f, 0.005743f, 0.003617f, 0.005952f, -0.005057f, -0.018456f, -0.011021f, -0.006904f, 0.013755f, -0.012220f, -0.003670f, 0.008536f, -0.000870f, 0.001723f, -0.010297f, 0.018169f, 0.001057f, -0.006824f, 0.014285f, -0.008534f, 0.022087f, 0.011583f, -0.004899f, 0.002769f, -0.006207f, -0.004052f, -0.020222f, 0.007438f, -0.009190f, -0.001167f, -0.000757f, -0.004152f, 0.008709f, -0.003081f, -0.008860f, -0.008293f, 0.001972f, -0.007515f, -0.008764f, 0.005370f, 0.000630f, 0.006723f, -0.003614f, -0.017974f, 0.006048f, 0.008699f, 0.009796f, -0.009123f, -0.012168f, 0.002646f, 0.015781f, 0.015125f, -0.013974f, 0.007166f, 0.016758f, -0.012033f, 0.002908f, -0.006609f, -0.014078f, 0.020413f, 0.006948f, 0.018975f, 0.016598f, 0.002844f, -0.014292f, -0.008083f, 0.006493f, -0.000607f, 0.002325f, -0.014556f, 0.000887f, -0.026091f, -0.011754f, + -0.020322f, 0.011952f, -0.011475f, -0.001161f, 0.003952f, -0.004162f, -0.005172f, 0.005438f, 0.006369f, 0.017390f, -0.002443f, -0.004891f, -0.013880f, -0.012792f, 0.011671f, 0.001592f, 0.004018f, 0.020837f, -0.006615f, -0.000826f, 0.011534f, -0.006217f, 0.005265f, 0.002942f, 0.011466f, 0.009348f, -0.007407f, -0.002267f, -0.015009f, 0.014204f, -0.010371f, -0.014575f, -0.013163f, 0.006844f, -0.005148f, -0.008373f, 0.014691f, -0.006119f, 0.015169f, -0.011132f, -0.007965f, -0.003554f, 0.009568f, 0.011705f, -0.001839f, -0.016124f, 0.004239f, -0.011034f, 0.017619f, 0.001945f, 0.009689f, -0.017138f, -0.008211f, 0.001912f, 0.008050f, -0.022389f, 0.007334f, 0.007450f, 0.003865f, -0.016830f, 0.012537f, 0.022468f, -0.022161f, 0.008666f, -0.013959f, 0.009110f, 0.000318f, 0.008205f, -0.007212f, -0.000049f, 0.004146f, -0.014153f, -0.008153f, -0.005905f, 0.010554f, 0.012438f, -0.004970f, 0.005987f, -0.003989f, 0.009212f, 0.010353f, 0.004683f, 0.002353f, -0.011377f, -0.005473f, -0.014295f, -0.017175f, -0.011079f, -0.000126f, -0.005282f, -0.001989f, -0.006657f, -0.017223f, -0.005411f, 0.001925f, 0.001392f, + -0.002335f, 0.024028f, -0.020944f, 0.007049f, -0.011189f, -0.003022f, -0.007574f, -0.006412f, 0.008689f, -0.006444f, -0.000841f, -0.007801f, -0.006635f, -0.009462f, 0.010557f, -0.011852f, 0.008271f, -0.003242f, 0.008180f, -0.001614f, -0.000471f, -0.001839f, 0.007654f, 0.004740f, -0.002495f, 0.019924f, -0.001508f, -0.011618f, 0.003025f, -0.010685f, -0.014244f, -0.015311f, 0.010740f, 0.003494f, 0.009110f, 0.010846f, 0.004720f, -0.023131f, -0.002976f, 0.004197f, -0.006652f, -0.017986f, 0.020742f, -0.000346f, -0.000245f, 0.019586f, -0.006227f, -0.017991f, 0.005680f, 0.013567f, 0.022607f, -0.000439f, 0.008957f, 0.003130f, -0.021845f, -0.005027f, -0.011848f, 0.011693f, 0.005018f, 0.006637f, -0.008805f, -0.000317f, -0.001886f, 0.003018f, -0.008039f, 0.010990f, 0.001747f, -0.007251f, 0.011234f, 0.002856f, -0.014642f, -0.010339f, 0.002235f, 0.015933f, 0.012321f, -0.017365f, 0.035311f, -0.000626f, -0.000231f, 0.011155f, -0.002337f, -0.003561f, -0.001199f, 0.024508f, -0.012508f, 0.012752f, -0.003632f, 0.017376f, 0.004070f, 0.015726f, -0.006247f, -0.010071f, 0.007313f, 0.013684f, -0.006791f, -0.012461f, + -0.015623f, -0.011837f, -0.006514f, -0.001230f, 0.013344f, 0.001838f, 0.011653f, 0.000121f, -0.004132f, 0.013518f, -0.010359f, -0.018335f, -0.005038f, -0.011040f, -0.011316f, -0.020745f, 0.018083f, -0.007123f, -0.001453f, -0.001342f, -0.013615f, -0.001128f, 0.001235f, 0.009835f, -0.014350f, 0.000524f, -0.002076f, -0.006274f, -0.029991f, -0.003879f, 0.014387f, 0.010764f, 0.014732f, 0.001444f, -0.016062f, 0.042554f, 0.018144f, 0.028851f, 0.003172f, -0.013020f, -0.004962f, -0.004419f, -0.018050f, -0.001439f, -0.007018f, 0.008818f, 0.000156f, 0.000626f, -0.005724f, -0.008100f, -0.015278f, 0.004836f, 0.001595f, 0.000399f, 0.007999f, -0.001028f, 0.003425f, -0.001923f, -0.013310f, -0.010777f, 0.008109f, -0.000381f, 0.019461f, -0.025031f, 0.019668f, 0.011592f, -0.008704f, -0.018276f, -0.027811f, 0.005335f, 0.021828f, -0.011785f, 0.021091f, -0.002277f, -0.001105f, 0.004215f, -0.006436f, -0.025355f, 0.002685f, 0.010868f, 0.004843f, -0.011563f, -0.003257f, -0.007674f, 0.004856f, 0.010866f, -0.001414f, 0.001807f, -0.002706f, 0.010044f, -0.006743f, -0.005683f, 0.005155f, -0.008636f, 0.004506f, -0.032841f, + 0.023468f, 0.021695f, 0.025032f, -0.007812f, -0.022694f, 0.008227f, 0.008896f, -0.033310f, -0.030737f, 0.030037f, 0.003143f, -0.014093f, 0.011155f, -0.020599f, -0.023956f, 0.003865f, 0.062272f, 0.029411f, 0.011576f, -0.016402f, 0.000324f, -0.005482f, 0.000566f, -0.006514f, -0.003356f, -0.007263f, 0.002383f, 0.018399f, 0.003691f, 0.022572f, -0.008451f, -0.006493f, 0.004250f, 0.016078f, -0.002635f, -0.001353f, -0.032242f, -0.000482f, -0.017972f, -0.000018f, 0.025671f, 0.019041f, -0.006210f, 0.018702f, 0.035564f, -0.015521f, 0.010700f, 0.030279f, -0.020679f, 0.032023f, -0.001848f, 0.014064f, -0.006491f, 0.002852f, -0.003281f, 0.005948f, 0.008071f, 0.032269f, -0.010602f, -0.001830f, 0.009092f, -0.011967f, 0.010259f, 0.007165f, -0.006703f, -0.011050f, 0.031613f, 0.001176f, -0.014635f, -0.001760f, 0.020621f, -0.003400f, 0.014788f, 0.005439f, 0.002174f, -0.001426f, -0.005526f, 0.040930f, 0.006694f, 0.006232f, -0.021589f, -0.011673f, 0.000483f, 0.005158f, 0.007593f, 0.009868f, -0.040676f, 0.002292f, 0.001925f, 0.029422f, 0.004017f, 0.007826f, -0.003377f, 0.026784f, -0.043674f, 0.001758f, + 0.021404f, -0.025217f, 0.005761f, 0.005433f, 0.020100f, 0.004473f, 0.001540f, -0.006673f, -0.000012f, -0.021656f, 0.006767f, -0.005158f, 0.003200f, 0.006307f, -0.004481f, -0.016400f, 0.005391f, -0.012906f, -0.023667f, 0.013196f, -0.013712f, 0.008738f, -0.022320f, -0.013405f, -0.003055f, -0.006533f, 0.004360f, -0.009047f, 0.022832f, -0.000201f, 0.021716f, -0.023770f, -0.020952f, -0.006487f, -0.000531f, -0.000498f, -0.007880f, 0.020103f, 0.015651f, 0.042029f, -0.007737f, 0.026669f, -0.016838f, -0.003252f, 0.007127f, -0.032835f, 0.035558f, -0.001960f, 0.021651f, -0.002239f, -0.033266f, -0.021175f, 0.012033f, -0.045674f, 0.020549f, 0.001203f, 0.007699f, 0.021049f, 0.031328f, 0.011445f, -0.013490f, 0.030585f, -0.032585f, -0.002866f, -0.010197f, 0.004527f, 0.025520f, -0.022736f, 0.057864f, 0.008311f, 0.014212f, -0.016459f, -0.023563f, 0.008791f, 0.000098f, 0.050066f, -0.007140f, -0.016313f, -0.028224f, -0.018190f, 0.013765f, 0.009685f, 0.008098f, -0.002649f, -0.027661f, -0.041850f, 0.003350f, -0.024799f, 0.034517f, 0.005539f, 0.028111f, -0.016117f, 0.011934f, -0.009977f, 0.014770f, 0.041490f, + -0.006316f, -0.002980f, -0.005662f, 0.011857f, 0.013863f, 0.008294f, 0.003480f, 0.005632f, 0.018064f, 0.017261f, -0.008408f, -0.012205f, -0.011726f, -0.012149f, 0.046825f, 0.019957f, -0.026152f, 0.022682f, -0.005204f, -0.020148f, -0.014826f, 0.010176f, 0.017996f, -0.029355f, -0.039839f, 0.006837f, -0.016933f, 0.056346f, 0.029678f, -0.006823f, -0.004228f, 0.013955f, 0.026718f, 0.008702f, -0.000856f, -0.005334f, -0.030639f, -0.005913f, -0.003065f, -0.000145f, -0.013117f, -0.027780f, 0.016830f, -0.010747f, 0.024384f, 0.007833f, -0.021914f, -0.012479f, -0.010046f, 0.002819f, -0.030309f, 0.019568f, 0.032779f, -0.014915f, 0.021216f, -0.007106f, -0.006387f, 0.012449f, -0.020676f, 0.011620f, 0.026944f, 0.004328f, 0.044988f, 0.018310f, -0.016017f, 0.015775f, 0.009775f, 0.013508f, 0.002705f, 0.020446f, 0.022044f, 0.028260f, 0.013600f, -0.014912f, -0.012623f, -0.022021f, 0.000065f, 0.045199f, 0.002906f, 0.017400f, -0.028405f, 0.059817f, -0.016785f, -0.052291f, -0.021441f, 0.036534f, 0.004959f, -0.008725f, -0.003631f, -0.006187f, 0.031345f, -0.025072f, 0.018892f, -0.007870f, 0.038973f, 0.053284f, + 0.031005f, 0.023732f, -0.018481f, 0.028522f, 0.021241f, 0.015248f, 0.023649f, 0.028200f, -0.005101f, -0.060776f, -0.034649f, -0.045584f, 0.012101f, 0.009731f, 0.012991f, -0.014757f, 0.020061f, 0.044327f, 0.004227f, 0.000083f, -0.013393f, 0.008672f, 0.020295f, 0.024800f, 0.008340f, 0.011862f, 0.018500f, -0.014553f, 0.043651f, 0.017805f, 0.008033f, -0.012218f, -0.034369f, -0.013296f, 0.017955f, -0.001490f, -0.048510f, 0.064952f, -0.023224f, -0.012345f, 0.019373f, 0.001279f, -0.006996f, 0.004966f, -0.013099f, -0.014906f, -0.003872f, -0.034913f, 0.008127f, -0.037557f, 0.000469f, -0.029749f, -0.034310f, -0.006585f, -0.007767f, -0.007241f, -0.025271f, 0.010957f, 0.025805f, 0.007190f, 0.019608f, -0.034985f, 0.033952f, 0.063060f, 0.005886f, -0.025275f, 0.038715f, -0.032289f, -0.051812f, 0.085131f, -0.009413f, 0.005986f, -0.006624f, -0.038167f, 0.028663f, -0.034633f, 0.014198f, 0.051906f, -0.001822f, 0.071326f, -0.056600f, 0.053695f, 0.014805f, -0.035492f, -0.019499f, 0.006674f, -0.035062f, -0.016905f, 0.036627f, -0.036888f, 0.023182f, -0.024318f, 0.011822f, 0.041055f, -0.089402f, -0.034760f, + 0.035798f, -0.016178f, 0.008827f, -0.024674f, -0.074979f, -0.019063f, 0.024202f, 0.058063f, -0.018620f, 0.029542f, 0.000561f, 0.014205f, 0.029648f, 0.019822f, 0.051524f, -0.012867f, 0.001998f, 0.014754f, -0.046016f, -0.028901f, -0.013839f, -0.014218f, 0.010377f, 0.001421f, 0.003729f, -0.023212f, -0.004099f, -0.030913f, -0.025852f, 0.013113f, 0.063771f, 0.037550f, -0.016924f, -0.019628f, 0.030337f, 0.037357f, -0.021849f, 0.010543f, 0.027962f, -0.010164f, 0.061003f, 0.021802f, 0.008855f, -0.046100f, 0.028961f, 0.007085f, 0.022779f, -0.003681f, 0.005752f, -0.006568f, -0.010352f, -0.073079f, 0.019484f, 0.052754f, 0.025132f, 0.008277f, -0.001771f, 0.027390f, -0.042230f, -0.075720f, 0.005238f, 0.103999f, 0.024005f, 0.082894f, 0.076213f, 0.002728f, 0.005660f, -0.047247f, -0.045291f, -0.002920f, -0.039562f, 0.053028f, -0.114496f, 0.022751f, -0.045888f, -0.087930f, 0.013630f, 0.042161f, -0.017549f, 0.052646f, 0.097423f, 0.000544f, 0.028127f, 0.015285f, -0.048038f, -0.016108f, 0.052131f, 0.013891f, 0.024204f, -0.014396f, 0.016723f, 0.006692f, -0.015508f, -0.001025f, 0.028207f, 0.025708f, + 0.035829f, -0.016601f, -0.001794f, -0.075875f, -0.067150f, 0.007833f, -0.040568f, -0.000256f, 0.039751f, 0.007293f, 0.006952f, -0.014597f, -0.005741f, 0.022207f, 0.060983f, -0.044098f, -0.021655f, -0.007237f, -0.038455f, -0.004701f, -0.036891f, -0.014042f, -0.039260f, 0.035562f, -0.048105f, -0.005850f, 0.012281f, 0.023064f, 0.092527f, 0.117448f, 0.034152f, -0.033019f, -0.060134f, -0.007307f, -0.039908f, -0.018767f, -0.063873f, 0.008408f, 0.069097f, 0.046372f, 0.043243f, 0.002983f, 0.013850f, 0.065062f, 0.069529f, 0.045929f, 0.001112f, 0.028351f, 0.016559f, 0.013144f, -0.070901f, 0.021511f, 0.015238f, -0.019312f, 0.054120f, 0.061655f, 0.000618f, -0.001779f, -0.017524f, -0.021119f, 0.057359f, 0.044512f, -0.030470f, 0.030816f, 0.042038f, 0.007075f, -0.057507f, -0.063984f, 0.059542f, 0.023097f, 0.012086f, 0.050678f, -0.001132f, -0.019067f, 0.049918f, 0.015842f, -0.041826f, -0.017973f, -0.016630f, 0.019717f, -0.001217f, -0.021568f, 0.006814f, -0.024072f, -0.005014f, -0.009668f, -0.015170f, 0.037708f, 0.063777f, -0.020346f, 0.011245f, 0.033442f, -0.018052f, -0.011066f, 0.010219f, 0.040006f, + 0.009433f, -0.026613f, -0.039328f, -0.041721f, 0.020927f, 0.027293f, 0.057320f, -0.025989f, -0.029859f, 0.023674f, 0.032887f, 0.058683f, -0.004599f, -0.101083f, -0.025312f, 0.036307f, 0.030212f, 0.017979f, -0.023544f, 0.002318f, -0.044882f, 0.009498f, -0.021415f, 0.046615f, 0.058278f, -0.015000f, -0.002332f, -0.032221f, -0.043056f, -0.010749f, -0.083395f, -0.011060f, -0.044362f, 0.040951f, -0.036221f, 0.043433f, 0.041914f, -0.083128f, -0.009241f, -0.025585f, -0.021992f, -0.030112f, -0.050137f, -0.011330f, -0.028077f, -0.050725f, -0.076883f, 0.037232f, 0.039132f, 0.023087f, -0.051667f, -0.069914f, -0.054053f, -0.030725f, 0.011820f, -0.002797f, -0.068550f, -0.041038f, -0.047308f, 0.065100f, 0.019520f, 0.027909f, -0.021726f, -0.038245f, 0.082249f, 0.019717f, 0.024812f, -0.016933f, 0.003670f, 0.023575f, -0.018396f, 0.018437f, -0.007565f, 0.038534f, 0.054670f, 0.001171f, -0.046907f, -0.037768f, 0.042842f, 0.029034f, 0.037250f, 0.009732f, 0.007979f, -0.021697f, -0.010677f, 0.004769f, 0.025300f, 0.057094f, -0.002495f, -0.111575f, -0.103802f, -0.000389f, -0.026968f, 0.063965f, 0.064866f, -0.076489f, + -0.052540f, -0.033298f, 0.090612f, 0.080733f, -0.046959f, 0.011324f, -0.060779f, -0.058309f, 0.032421f, -0.027603f, -0.001503f, -0.009974f, -0.042312f, 0.028271f, 0.028670f, 0.023723f, 0.093405f, -0.067711f, -0.018269f, -0.003976f, 0.022252f, 0.085635f, -0.054665f, 0.051035f, 0.063792f, 0.030197f, -0.126850f, -0.059960f, 0.051349f, -0.042643f, 0.032553f, -0.015888f, -0.048701f, 0.029149f, 0.017466f, 0.004238f, -0.017672f, -0.094696f, -0.001489f, -0.009037f, 0.007282f, -0.018960f, -0.057366f, 0.041768f, -0.032705f, 0.075819f, -0.001531f, -0.013575f, 0.047260f, 0.023399f, -0.031991f, -0.010085f, -0.022352f, 0.037443f, 0.076667f, 0.046140f, -0.050754f, 0.006525f, -0.031339f, 0.028595f, -0.026088f, -0.020597f, 0.013733f, -0.009714f, 0.045703f, -0.041363f, -0.072755f, 0.013922f, -0.020543f, 0.023233f, 0.040221f, -0.109680f, -0.008565f, -0.026842f, 0.012810f, 0.106093f, -0.021288f, -0.090268f, -0.012343f, 0.064308f, 0.044588f, -0.052866f, -0.004380f, 0.036344f, 0.010536f, 0.046479f, -0.071934f, -0.053145f, 0.061757f, -0.061967f, -0.114435f, -0.047853f, -0.004402f, 0.133337f, -0.026346f, -0.086984f, + 0.051218f, -0.097087f, 0.180592f, -0.121348f, 0.033482f, -0.001234f, 0.040951f, 0.101646f, 0.031579f, 0.014578f, -0.057696f, -0.022953f, -0.057678f, -0.067471f, -0.023637f, 0.014004f, 0.038087f, 0.052107f, -0.006633f, 0.030533f, 0.035418f, -0.031061f, -0.064981f, 0.034476f, 0.011286f, -0.051583f, -0.018635f, 0.049951f, -0.017789f, -0.005094f, 0.044303f, 0.025795f, 0.019134f, 0.006689f, 0.024724f, -0.024284f, -0.060568f, -0.025569f, 0.015901f, -0.024109f, -0.015157f, 0.022053f, 0.000347f, -0.041727f, 0.042565f, 0.009600f, -0.040012f, 0.005094f, -0.010585f, 0.037683f, 0.019690f, -0.015170f, 0.016377f, -0.023237f, -0.053527f, 0.006879f, 0.011306f, -0.004932f, -0.001335f, 0.010771f, -0.024329f, 0.006845f, -0.021138f, 0.011250f, 0.035514f, -0.004542f, 0.014429f, 0.016480f, -0.016399f, 0.000022f, -0.037735f, 0.011040f, 0.018496f, -0.065953f, 0.034655f, -0.041969f, 0.009282f, -0.000057f, -0.005021f, 0.018240f, 0.098497f, -0.003242f, -0.003613f, -0.027071f, -0.027301f, 0.020734f, -0.001491f, 0.018018f, 0.000028f, -0.009239f, -0.013327f, 0.007135f, -0.018533f, 0.018993f, -0.017453f, 0.027483f, + -0.022077f, 0.016226f, -0.018705f, -0.003622f, -0.003175f, -0.016707f, -0.013344f, 0.004424f, -0.007934f, -0.004893f, -0.000275f, -0.012389f, 0.001590f, -0.001996f, 0.004025f, -0.002454f, 0.007469f, -0.025355f, 0.023584f, -0.008267f, -0.007792f, 0.018559f, -0.014405f, 0.001610f, -0.017964f, -0.015074f, 0.011483f, 0.010770f, -0.012572f, -0.007470f, 0.005168f, -0.000114f, -0.021866f, 0.006338f, 0.004005f, 0.000703f, 0.014604f, -0.004625f, -0.005994f, -0.005193f, -0.014762f, -0.003347f, 0.016033f, -0.016013f, 0.004650f, -0.007395f, -0.001669f, 0.001779f, -0.004634f, 0.004365f, 0.000635f, 0.011623f, -0.015347f, -0.000862f, 0.011143f, -0.020306f, 0.013109f, -0.009284f, 0.001749f, 0.008685f, -0.001017f, -0.010634f, -0.045594f, -0.079166f, 0.029895f, 0.250195f, 0.063634f, 0.137619f, -0.004602f, -0.135573f, -0.042933f, -0.133407f, -0.112484f, -0.040814f, -0.026447f, -0.009993f, 0.076061f, 0.100247f, 0.134369f, 0.167895f, 0.073690f, -0.043863f, -0.077163f, -0.166244f, -0.156451f, -0.064834f, -0.051633f, -0.035709f, 0.068984f, 0.092098f, 0.056422f, 0.085365f, 0.104117f, 0.034306f, 0.029316f, 0.018717f, + -0.052360f, -0.025112f, -0.037167f, -0.083865f, -0.044894f, -0.062407f, -0.090646f, -0.050392f, 0.012568f, 0.009439f, 0.052512f, 0.124056f, 0.086374f, 0.070526f, 0.070328f, 0.020991f, 0.006476f, -0.007262f, -0.034378f, -0.051215f, -0.063166f, -0.092488f, -0.080150f, -0.045645f, -0.012655f, -0.031055f, 0.027588f, 0.048236f, 0.042668f, 0.070755f, 0.080455f, 0.051012f, 0.047928f, 0.045565f, -0.004225f, -0.020349f, -0.007752f, -0.061549f, -0.048754f, -0.009986f, -0.046559f, -0.049326f, -0.024480f, -0.023917f, 0.005571f, 0.001611f} + }, + { + {-0.001074f, 0.000794f, -0.004785f, 0.004975f, -0.006732f, 0.000726f, -0.002276f, -0.004292f, -0.008361f, -0.002802f, -0.000090f, 0.001502f, 0.010056f, 0.005424f, -0.003816f, 0.000069f, -0.000944f, -0.000143f, 0.000610f, 0.000284f, 0.003260f, -0.000461f, 0.002118f, -0.001599f, -0.012281f, -0.004298f, -0.002061f, 0.000603f, 0.007422f, -0.004609f, 0.000506f, -0.000696f, -0.000241f, -0.002658f, 0.004374f, 0.000868f, -0.001997f, 0.005312f, -0.003768f, 0.002015f, 0.002391f, -0.005407f, 0.004740f, -0.002365f, 0.000306f, 0.001228f, 0.001696f, 0.002378f, -0.002198f, -0.004019f, -0.001315f, -0.002792f, 0.002061f, -0.002530f, 0.000555f, 0.003202f, 0.008493f, -0.002981f, -0.006636f, -0.001955f, 0.006263f, 0.006475f, 0.004021f, -0.000199f, 0.001910f, -0.002379f, -0.003319f, -0.002734f, -0.007926f, 0.005587f, -0.001130f, 0.001401f, 0.000150f, -0.003781f, 0.001374f, 0.001608f, 0.005953f, 0.005654f, -0.005071f, -0.001065f, 0.008460f, 0.002591f, -0.004144f, 0.000759f, -0.004593f, -0.004363f, -0.003241f, -0.007580f, -0.002426f, 0.004413f, -0.000202f, 0.002390f, -0.001090f, -0.002234f, -0.001896f, -0.001023f, + 0.006431f, -0.004071f, 0.000563f, -0.000393f, 0.000449f, 0.004862f, 0.000014f, 0.003316f, 0.011075f, 0.008398f, 0.008726f, 0.004335f, 0.002125f, -0.001466f, -0.009883f, 0.004054f, -0.003567f, 0.006385f, 0.002486f, -0.003486f, 0.003239f, -0.004556f, -0.008529f, -0.002741f, -0.003169f, -0.008308f, 0.000562f, -0.001045f, -0.000968f, -0.003890f, 0.000746f, 0.008627f, 0.004051f, 0.005878f, 0.000139f, 0.003639f, -0.003136f, -0.000188f, 0.004757f, -0.003647f, 0.003276f, -0.004510f, -0.004655f, 0.000652f, 0.010435f, 0.006893f, 0.004191f, -0.001714f, 0.002007f, 0.001436f, 0.000920f, -0.001370f, -0.003539f, -0.005325f, -0.003925f, 0.001078f, -0.003280f, 0.003750f, 0.001882f, -0.006418f, 0.015156f, -0.000321f, 0.000867f, -0.001612f, -0.008086f, 0.005922f, -0.004256f, -0.004031f, -0.009431f, -0.007236f, -0.003119f, 0.005768f, 0.008253f, -0.001738f, 0.004833f, -0.001979f, 0.008943f, 0.009334f, -0.018893f, 0.003360f, -0.000047f, -0.001926f, 0.006204f, 0.009890f, -0.003239f, -0.001565f, 0.000035f, -0.000735f, -0.004948f, 0.003795f, -0.004999f, -0.003944f, -0.000592f, 0.004848f, -0.003047f, -0.010727f, + -0.004922f, -0.007361f, 0.000596f, 0.000437f, -0.009630f, -0.001330f, -0.004365f, 0.001709f, -0.000571f, -0.001669f, 0.001993f, -0.003398f, 0.002848f, -0.005319f, 0.004575f, 0.006893f, 0.010701f, 0.004255f, -0.005243f, 0.003595f, 0.004216f, -0.002148f, -0.013005f, 0.000376f, 0.006028f, -0.005521f, 0.003220f, -0.007801f, -0.000678f, -0.005222f, -0.013396f, -0.004523f, -0.007392f, 0.002525f, 0.003918f, -0.005051f, 0.001125f, -0.002606f, 0.012260f, 0.003579f, -0.017092f, 0.006172f, 0.008483f, 0.003330f, -0.001664f, 0.004564f, -0.010825f, 0.001648f, 0.004501f, -0.002238f, 0.004340f, -0.000590f, 0.005329f, 0.001467f, -0.007396f, 0.004627f, 0.006324f, 0.006591f, -0.002120f, 0.003202f, 0.003299f, 0.002558f, -0.019387f, 0.002781f, -0.008399f, -0.002325f, -0.002967f, 0.004550f, 0.001807f, -0.015548f, -0.005896f, -0.003435f, -0.003243f, 0.006409f, -0.006100f, -0.010881f, 0.002408f, 0.005109f, 0.002861f, -0.010842f, -0.005417f, 0.003511f, -0.010577f, -0.000812f, -0.011662f, 0.001674f, 0.005238f, -0.005816f, -0.002104f, 0.006481f, 0.007923f, -0.019302f, -0.001780f, -0.005386f, 0.005475f, 0.002351f, + 0.000584f, 0.001617f, -0.005821f, 0.004849f, 0.003840f, -0.015049f, 0.011076f, -0.001629f, 0.002382f, -0.007740f, -0.003672f, -0.006575f, -0.001316f, 0.001561f, -0.006549f, -0.008447f, 0.006786f, -0.002754f, -0.008571f, -0.007176f, -0.006786f, -0.003568f, 0.012186f, -0.003960f, 0.001272f, -0.009808f, 0.010434f, 0.001187f, -0.007828f, -0.001480f, 0.005855f, -0.012678f, 0.004010f, -0.003410f, 0.002510f, 0.002595f, -0.006471f, -0.003793f, -0.016089f, -0.003727f, -0.018064f, 0.002767f, 0.003510f, -0.001397f, -0.002856f, -0.001111f, 0.002195f, -0.006387f, -0.013018f, -0.005323f, -0.005089f, -0.001420f, 0.004133f, -0.002366f, 0.006993f, 0.003853f, 0.005241f, -0.007236f, -0.000931f, 0.000167f, -0.007005f, 0.002370f, 0.004620f, 0.000067f, -0.003760f, -0.007037f, -0.007578f, 0.005354f, 0.006569f, 0.000389f, 0.013520f, 0.011795f, -0.010637f, -0.001908f, -0.000550f, -0.009953f, -0.012760f, 0.019095f, -0.000913f, 0.001243f, 0.005131f, -0.010911f, -0.004507f, -0.006752f, 0.017464f, 0.005782f, 0.000209f, -0.013510f, -0.012266f, 0.002599f, -0.005584f, 0.010614f, -0.005772f, 0.001515f, 0.001439f, -0.021226f, + 0.010635f, 0.006008f, 0.010847f, -0.005814f, 0.005958f, 0.006204f, 0.011152f, 0.002638f, -0.021148f, 0.005295f, 0.000948f, 0.008425f, 0.015411f, 0.000816f, 0.006719f, 0.005858f, -0.012638f, 0.004466f, 0.001224f, 0.001768f, -0.003394f, -0.001750f, 0.007929f, 0.005229f, 0.000383f, -0.007746f, -0.000026f, -0.003689f, -0.003944f, 0.012703f, 0.005941f, -0.000518f, -0.001615f, -0.015320f, -0.013063f, -0.015050f, 0.004105f, 0.004083f, -0.015510f, 0.001119f, 0.001170f, -0.015463f, 0.001094f, 0.002396f, -0.001938f, 0.017787f, -0.002051f, -0.008740f, -0.002046f, 0.010209f, -0.000679f, -0.015851f, 0.017397f, 0.008904f, -0.010754f, 0.008357f, 0.001888f, 0.001578f, -0.000042f, 0.000923f, -0.003984f, -0.008012f, -0.007225f, 0.013686f, -0.000568f, -0.004117f, -0.000239f, 0.009768f, -0.008695f, -0.016368f, 0.001158f, 0.003454f, 0.003782f, -0.014488f, -0.006247f, 0.004965f, 0.006514f, 0.024368f, 0.007420f, 0.019522f, -0.021475f, 0.000711f, -0.010534f, 0.000229f, 0.007310f, 0.008158f, -0.010961f, 0.004741f, -0.006286f, -0.005799f, -0.007568f, -0.012654f, -0.001689f, -0.029660f, -0.000125f, 0.009661f, + -0.001143f, -0.002110f, 0.003416f, -0.015605f, 0.005629f, -0.014884f, -0.004494f, 0.015138f, 0.003265f, 0.005164f, 0.000545f, 0.004391f, 0.013178f, 0.011660f, 0.022824f, 0.011664f, -0.016917f, -0.001520f, 0.019268f, -0.002764f, -0.013746f, -0.002218f, 0.001980f, -0.006476f, 0.012990f, 0.009364f, -0.010756f, -0.003316f, 0.012474f, 0.012923f, -0.004417f, -0.008414f, 0.020900f, -0.008657f, -0.027634f, -0.018984f, 0.006373f, -0.028203f, -0.000327f, -0.008590f, 0.000367f, -0.002835f, -0.007612f, 0.010221f, 0.003215f, -0.003082f, -0.008967f, 0.007592f, -0.005323f, 0.014312f, 0.010272f, -0.004809f, -0.009829f, 0.001019f, 0.003711f, 0.001891f, -0.024100f, 0.011505f, -0.002333f, 0.006217f, 0.007672f, 0.013077f, 0.002631f, -0.011213f, 0.015141f, -0.005623f, 0.006556f, -0.006801f, 0.005389f, -0.000968f, -0.028428f, -0.005757f, -0.005182f, -0.003269f, 0.001520f, -0.006732f, -0.005061f, 0.003738f, 0.005711f, 0.002085f, 0.014691f, 0.006930f, -0.015157f, -0.001174f, -0.000491f, -0.008376f, 0.016897f, -0.010583f, -0.010661f, 0.018188f, 0.018744f, -0.002617f, -0.000859f, -0.012287f, 0.003682f, 0.002340f, + -0.006975f, 0.002896f, 0.011257f, 0.007045f, 0.013650f, -0.003983f, -0.012112f, 0.006595f, 0.000847f, 0.002969f, -0.014363f, -0.007534f, -0.008845f, 0.002576f, 0.006752f, 0.002159f, 0.001047f, 0.013107f, 0.015519f, 0.001658f, -0.009026f, 0.008535f, 0.006529f, -0.012716f, 0.000345f, 0.000886f, -0.002719f, 0.000069f, -0.001758f, 0.008412f, -0.002712f, -0.009509f, 0.002135f, 0.010851f, 0.003704f, 0.004210f, 0.009509f, -0.020263f, -0.012863f, 0.008716f, -0.005304f, -0.018891f, 0.009404f, -0.009657f, -0.009288f, 0.012969f, -0.004225f, -0.003657f, -0.003528f, 0.003702f, 0.008830f, 0.005285f, 0.004562f, 0.005599f, -0.008113f, -0.004126f, -0.002006f, 0.011735f, 0.005406f, -0.019308f, 0.005919f, 0.006649f, -0.008671f, 0.019093f, 0.016719f, 0.009666f, 0.000312f, -0.006290f, -0.004719f, 0.001469f, -0.006131f, -0.006496f, -0.011776f, 0.002125f, -0.013386f, 0.009955f, 0.003372f, 0.000562f, 0.001809f, 0.005452f, 0.004094f, 0.010599f, 0.015649f, -0.005600f, -0.025347f, -0.003981f, -0.017301f, 0.006291f, 0.002224f, -0.022395f, 0.008143f, -0.009207f, 0.028506f, 0.009817f, -0.018055f, -0.000318f, + 0.018186f, 0.009751f, -0.014869f, -0.008652f, 0.019126f, 0.011110f, -0.013054f, 0.016379f, -0.013329f, -0.017833f, 0.003085f, -0.027121f, 0.016760f, 0.017417f, -0.003516f, -0.016658f, -0.002226f, -0.000392f, 0.005315f, 0.000086f, -0.016438f, -0.011870f, 0.000175f, -0.019393f, -0.000167f, -0.045766f, -0.014677f, -0.005192f, -0.025319f, -0.008713f, -0.005523f, -0.010941f, -0.008786f, 0.006013f, -0.012389f, -0.022921f, 0.005782f, 0.014392f, -0.023771f, -0.006496f, 0.006858f, 0.011723f, 0.019828f, 0.012847f, 0.011504f, 0.012986f, 0.004302f, 0.023053f, -0.014213f, -0.006006f, 0.004439f, -0.011585f, 0.003874f, 0.006408f, 0.011610f, 0.001420f, 0.019282f, 0.003968f, 0.004329f, 0.013463f, -0.006627f, -0.011971f, -0.000401f, -0.018249f, -0.012141f, -0.021048f, -0.001542f, -0.001273f, -0.027998f, 0.009495f, -0.013110f, 0.005211f, -0.026562f, 0.002681f, -0.020341f, 0.028670f, 0.000575f, -0.026411f, 0.030185f, 0.037634f, 0.009689f, -0.013316f, -0.010575f, 0.009331f, -0.004531f, -0.001851f, 0.009918f, -0.018818f, 0.010319f, -0.019404f, 0.008095f, -0.008015f, -0.013109f, 0.004237f, 0.012801f, 0.002682f, + 0.011772f, -0.006331f, 0.018792f, -0.014410f, -0.014744f, -0.036344f, -0.008884f, -0.018483f, -0.045866f, 0.012101f, -0.026708f, -0.015075f, -0.021647f, 0.006549f, -0.041354f, 0.011687f, 0.002714f, -0.007023f, -0.001513f, -0.010904f, -0.004738f, 0.010596f, -0.014474f, -0.009057f, -0.000050f, 0.008301f, -0.012721f, -0.000073f, 0.013358f, -0.021472f, -0.005740f, 0.013945f, -0.012971f, 0.000156f, -0.000439f, -0.002605f, 0.018347f, -0.015576f, 0.010680f, -0.006552f, 0.014833f, 0.017200f, -0.017033f, -0.021032f, 0.020092f, -0.001203f, 0.003968f, 0.006438f, 0.001333f, -0.003660f, 0.011093f, -0.005199f, -0.026005f, 0.007772f, 0.004672f, -0.020929f, -0.002990f, -0.006719f, 0.012743f, 0.017376f, 0.007465f, 0.003989f, -0.006898f, -0.014371f, 0.015502f, 0.011308f, 0.013800f, 0.000482f, -0.023168f, -0.003688f, -0.003934f, -0.008041f, -0.005946f, -0.000224f, -0.010374f, 0.054306f, 0.032586f, 0.001381f, -0.016671f, -0.042415f, -0.004257f, 0.018684f, -0.008287f, -0.017531f, -0.030399f, -0.002495f, -0.005867f, 0.000360f, -0.009826f, 0.009394f, 0.000742f, 0.026604f, 0.011728f, -0.012065f, 0.000148f, -0.005525f, + 0.003040f, -0.006263f, 0.006636f, 0.016307f, -0.018803f, 0.003247f, -0.010905f, 0.007311f, -0.007446f, -0.014994f, -0.027155f, -0.002801f, 0.017275f, 0.004924f, -0.002392f, 0.005496f, -0.000930f, 0.014979f, 0.025584f, -0.008920f, -0.004335f, -0.028632f, -0.029377f, 0.008130f, 0.005837f, -0.013256f, -0.009874f, -0.025701f, -0.016121f, 0.009872f, -0.001889f, -0.000105f, 0.002752f, -0.002058f, 0.013133f, 0.006640f, -0.019386f, 0.000957f, -0.017471f, -0.001470f, -0.008616f, -0.005599f, 0.022025f, 0.042304f, 0.070678f, 0.003348f, 0.024065f, -0.019672f, -0.024441f, -0.035536f, 0.000188f, 0.002476f, 0.009929f, 0.012645f, -0.001266f, 0.000722f, 0.019831f, 0.033865f, -0.016910f, 0.000356f, 0.006141f, -0.027089f, -0.000059f, -0.017393f, -0.017445f, 0.026067f, -0.007908f, -0.006204f, -0.014181f, 0.029882f, 0.025709f, 0.000249f, 0.042442f, 0.005059f, 0.013034f, 0.009651f, -0.012244f, -0.013737f, -0.022581f, -0.011504f, 0.004894f, 0.000416f, 0.018845f, 0.001689f, -0.002408f, -0.003307f, 0.013228f, -0.019403f, -0.048141f, -0.016614f, 0.013802f, 0.004563f, -0.004230f, -0.014128f, 0.000556f, -0.022909f, + -0.003744f, -0.020882f, -0.001726f, -0.002565f, -0.015040f, 0.014196f, 0.006780f, 0.026905f, -0.022456f, 0.041643f, 0.010966f, -0.008165f, -0.014945f, -0.007672f, 0.006392f, 0.023889f, -0.007538f, 0.013551f, -0.021340f, 0.016895f, -0.019339f, -0.022053f, 0.021416f, -0.031490f, 0.020445f, 0.016522f, 0.033242f, -0.034364f, 0.025950f, -0.004157f, 0.023468f, 0.007603f, -0.034106f, -0.007955f, -0.005683f, 0.007777f, 0.002638f, -0.023500f, -0.030956f, -0.064139f, -0.019378f, -0.037763f, 0.010698f, -0.001954f, -0.012540f, -0.018829f, -0.017444f, -0.016239f, -0.017077f, -0.017228f, 0.002033f, -0.014098f, -0.002234f, -0.030344f, -0.045887f, 0.056267f, -0.017348f, 0.030356f, -0.005577f, 0.007620f, 0.010053f, 0.016217f, 0.011196f, -0.003195f, -0.000613f, -0.024735f, -0.005192f, -0.006144f, -0.016072f, -0.025951f, 0.010365f, -0.003254f, 0.036577f, -0.025441f, 0.001075f, 0.049665f, -0.011630f, -0.042021f, -0.012952f, 0.001207f, -0.018353f, 0.028825f, 0.014006f, -0.016586f, 0.012473f, 0.015208f, -0.009061f, -0.000888f, 0.008611f, 0.018978f, 0.000038f, -0.019948f, -0.018141f, 0.022728f, 0.017704f, -0.013099f, + -0.025663f, 0.016188f, 0.020917f, -0.018574f, -0.022694f, 0.015756f, -0.028944f, 0.057077f, 0.014336f, -0.006272f, 0.004473f, 0.012400f, 0.005710f, -0.012778f, 0.003937f, 0.000235f, 0.024038f, 0.015288f, -0.023991f, -0.000099f, 0.008908f, 0.006644f, -0.015794f, 0.037738f, 0.026703f, 0.054382f, 0.030071f, 0.020023f, 0.007742f, -0.048198f, -0.004164f, 0.006090f, -0.028458f, -0.007980f, 0.053745f, 0.003629f, -0.031746f, -0.031499f, 0.027571f, -0.043239f, -0.011564f, 0.001194f, 0.010849f, 0.004163f, -0.008753f, 0.013046f, -0.019929f, -0.000884f, -0.004644f, -0.013037f, -0.003486f, -0.009418f, -0.028711f, 0.013616f, -0.025072f, 0.013025f, 0.011579f, 0.015270f, 0.001879f, 0.009637f, -0.011273f, 0.043628f, 0.004760f, -0.049233f, -0.043378f, 0.002304f, 0.017389f, 0.034912f, -0.013627f, -0.030474f, -0.014397f, -0.005701f, 0.002334f, 0.019436f, 0.002758f, -0.019138f, 0.047437f, -0.063036f, -0.012285f, 0.008911f, -0.044536f, -0.024669f, -0.013588f, 0.003151f, -0.071013f, -0.035806f, 0.046212f, -0.022403f, 0.011487f, -0.020291f, -0.057855f, -0.025966f, 0.024960f, -0.013378f, 0.006041f, 0.030796f, + -0.014947f, -0.085209f, -0.025909f, 0.007947f, 0.021514f, 0.027113f, 0.018725f, 0.025041f, 0.036535f, 0.074443f, -0.044091f, 0.032923f, -0.013545f, 0.001696f, -0.013706f, -0.055684f, -0.047057f, -0.005349f, -0.005863f, 0.015601f, 0.019784f, 0.033119f, -0.012707f, 0.002028f, -0.018753f, 0.003171f, -0.006046f, 0.002764f, 0.027761f, 0.019699f, 0.007049f, 0.026992f, 0.024937f, -0.046440f, 0.021222f, -0.025637f, -0.039964f, -0.007598f, 0.020188f, 0.010060f, -0.028162f, 0.011476f, -0.000504f, 0.021048f, -0.005228f, -0.044739f, -0.038113f, -0.036437f, -0.043421f, 0.008816f, 0.029238f, -0.002466f, 0.115586f, -0.074222f, -0.062666f, 0.039893f, -0.014441f, -0.019834f, -0.012087f, -0.002239f, -0.002823f, -0.068572f, 0.003451f, -0.000572f, 0.005626f, 0.061020f, -0.008526f, 0.025102f, 0.016716f, 0.032744f, 0.086571f, -0.027378f, 0.110169f, 0.039542f, -0.011608f, 0.018269f, -0.052259f, 0.018897f, 0.084019f, 0.002230f, 0.087669f, 0.046033f, -0.005238f, -0.034022f, 0.098852f, 0.014629f, -0.016596f, 0.012572f, -0.022481f, -0.006852f, -0.003373f, -0.006304f, 0.012474f, 0.027330f, 0.019201f, 0.003381f, + 0.012666f, -0.020112f, -0.019201f, 0.005704f, -0.005873f, 0.032175f, 0.035206f, 0.022097f, -0.009074f, 0.001879f, -0.042840f, -0.027242f, -0.007960f, -0.029782f, -0.046318f, -0.027997f, 0.022086f, -0.027343f, -0.081662f, -0.038246f, 0.025013f, -0.033503f, -0.023210f, 0.000647f, -0.005893f, 0.037883f, 0.056675f, 0.073681f, -0.039131f, 0.020488f, -0.000298f, 0.001769f, -0.015647f, -0.049842f, -0.097607f, -0.065315f, 0.034553f, -0.066232f, -0.033646f, 0.016952f, 0.034047f, -0.025191f, 0.038489f, 0.106448f, 0.023889f, 0.019698f, -0.079677f, -0.110179f, -0.021603f, -0.035232f, -0.055564f, -0.017973f, -0.045142f, 0.033340f, 0.024597f, 0.096446f, 0.048179f, -0.021835f, 0.045442f, 0.088623f, -0.046928f, 0.067052f, 0.054772f, -0.009419f, -0.013369f, -0.030948f, 0.009789f, 0.059892f, 0.045416f, 0.070394f, -0.030219f, -0.014477f, -0.013803f, -0.004818f, -0.018355f, 0.018183f, -0.022643f, 0.051747f, 0.022940f, -0.085809f, -0.036056f, 0.000524f, 0.013791f, 0.036794f, -0.016644f, -0.032421f, 0.010682f, 0.010110f, -0.012598f, -0.015876f, 0.010839f, -0.024122f, -0.035955f, -0.016618f, 0.082011f, 0.033780f, + 0.015147f, -0.040401f, -0.011632f, -0.034091f, 0.021988f, 0.039842f, 0.014975f, 0.003472f, 0.025038f, -0.012683f, 0.053517f, 0.030397f, 0.005276f, 0.018448f, 0.000491f, 0.103493f, 0.023612f, -0.041627f, 0.019329f, 0.019645f, 0.013105f, 0.025387f, 0.004528f, -0.038799f, 0.052568f, 0.013839f, 0.012163f, 0.022737f, 0.013016f, 0.003944f, -0.026008f, 0.039820f, 0.044890f, 0.026234f, 0.120180f, 0.088177f, -0.038589f, -0.081065f, -0.001742f, -0.019362f, -0.101471f, -0.016436f, 0.028344f, 0.026261f, -0.021503f, 0.033480f, 0.013491f, -0.018012f, -0.036857f, 0.005318f, -0.007546f, -0.061321f, -0.016664f, -0.024070f, 0.005948f, -0.083319f, -0.060791f, -0.014336f, 0.040685f, -0.009056f, -0.010678f, -0.052094f, 0.002280f, 0.037337f, 0.003204f, -0.032705f, -0.015357f, -0.010320f, -0.015104f, 0.006020f, 0.014755f, -0.045161f, -0.044551f, 0.002676f, -0.000647f, 0.005288f, 0.075986f, -0.050553f, -0.003942f, -0.007615f, -0.072427f, -0.026892f, -0.052825f, -0.013321f, -0.003794f, 0.046799f, 0.059079f, 0.066368f, 0.021151f, 0.006885f, -0.026493f, -0.067905f, 0.003171f, 0.020009f, -0.021068f, 0.082313f, + 0.205977f, 0.191625f, 0.029470f, -0.131848f, -0.115145f, -0.051130f, -0.072077f, 0.236221f, 0.150529f, 0.088348f, 0.123201f, -0.007526f, -0.063668f, -0.177749f, -0.109209f, -0.047976f, -0.008173f, 0.064023f, 0.136186f, 0.047837f, -0.046757f, 0.054615f, 0.018138f, -0.000005f, -0.090843f, -0.038312f, 0.091693f, -0.064129f, 0.029841f, -0.006968f, -0.013088f, 0.019181f, 0.015953f, 0.038289f, 0.078080f, -0.049585f, -0.050424f, 0.007312f, -0.028416f, 0.037515f, -0.053101f, -0.038747f, -0.031485f, -0.003496f, -0.004350f, -0.042212f, 0.021169f, 0.060464f, -0.048245f, -0.067896f, -0.038507f, -0.022299f, -0.007481f, 0.083445f, 0.010946f, -0.011566f, -0.085414f, -0.032393f, 0.013635f, 0.068101f, 0.038619f, -0.023183f, -0.125722f, -0.103214f, 0.093453f, 0.086717f, 0.098150f, -0.053042f, -0.213354f, -0.053380f, 0.102077f, 0.070844f, 0.016484f, -0.036320f, 0.017674f, -0.099472f, -0.048799f, 0.017763f, -0.022505f, 0.014391f, -0.012994f, -0.009493f, 0.095034f, -0.082388f, -0.033653f, 0.061783f, 0.062167f, 0.099637f, 0.050254f, -0.171113f, 0.048655f, 0.147629f, 0.034807f, 0.063298f, 0.017245f, -0.066656f, + -0.110330f, 0.014028f, 0.017631f, 0.012095f, 0.105239f, 0.019762f, -0.009833f, -0.066617f, -0.013488f, -0.005028f, -0.017820f, 0.000992f, -0.014745f, 0.029036f, 0.010968f, -0.018517f, -0.005263f, 0.044101f, -0.001675f, -0.000822f, 0.002713f, -0.009102f, -0.020038f, 0.025355f, 0.019302f, 0.017473f, -0.028349f, 0.015397f, 0.038003f, 0.016978f, -0.004027f, 0.026985f, -0.006391f, -0.029149f, 0.006351f, 0.008944f, -0.026184f, -0.025477f, 0.024907f, 0.026948f, -0.027114f, 0.017379f, 0.014236f, 0.000719f, -0.010797f, 0.001043f, 0.018739f, -0.000364f, -0.023912f, 0.012367f, 0.012460f, -0.041360f, 0.009514f, 0.031317f, 0.009049f, -0.027033f, 0.003299f, 0.019205f, -0.036042f, 0.009337f, 0.015956f, 0.006454f, -0.009488f, -0.034490f, 0.039593f, -0.044135f, -0.003340f, 0.039391f, 0.001709f, -0.009689f, 0.002814f, -0.042387f, 0.020437f, -0.005885f, 0.027986f, 0.032506f, 0.100005f, 0.009122f, -0.012523f, -0.033201f, -0.022555f, 0.012117f, -0.015188f, 0.013322f, -0.020170f, -0.001182f, 0.015699f, -0.008564f, 0.007299f, 0.007768f, -0.027960f, 0.008148f, -0.009238f, -0.005567f, -0.023026f, 0.006976f, + -0.006577f, -0.013924f, -0.006803f, 0.011626f, -0.010044f, -0.009334f, 0.014124f, -0.015115f, 0.007958f, 0.014062f, -0.027829f, 0.028101f, -0.006898f, -0.032116f, 0.017473f, 0.017982f, -0.015178f, 0.006018f, 0.010051f, -0.013118f, -0.012242f, 0.000835f, 0.002035f, 0.009704f, -0.004294f, -0.000887f, -0.013547f, 0.013474f, -0.010532f, -0.002642f, 0.016171f, -0.018295f, 0.005857f, -0.002575f, 0.000408f, -0.008094f, -0.011982f, -0.004075f, 0.021991f, -0.013756f, -0.005180f, 0.004525f, 0.005052f, 0.001702f, -0.012587f, 0.011090f, -0.005355f, -0.010090f, 0.000194f, -0.019407f, 0.030766f, -0.011942f, 0.006623f, 0.008358f, -0.005744f, 0.012889f, -0.048665f, -0.082582f, 0.038373f, 0.279689f, 0.044216f, 0.139109f, -0.031778f, -0.143994f, -0.050713f, -0.140372f, -0.090445f, -0.030352f, -0.014151f, 0.005333f, 0.083782f, 0.098044f, 0.139063f, 0.135666f, 0.044651f, -0.055469f, -0.086527f, -0.162135f, -0.122078f, -0.066142f, -0.024141f, -0.017792f, 0.050739f, 0.081972f, 0.065470f, 0.086429f, 0.086159f, 0.029979f, 0.028640f, 0.009013f, -0.061229f, -0.024544f, -0.052510f, -0.094104f, -0.055004f, -0.055584f, + -0.079333f, -0.018563f, 0.038546f, 0.027062f, 0.082943f, 0.105918f, 0.056886f, 0.070032f, 0.054799f, -0.009105f, -0.001407f, -0.006607f, -0.056857f, -0.072753f, -0.062561f, -0.097203f, -0.080545f, -0.030441f, -0.003934f, 0.009875f, 0.067141f, 0.059329f, 0.059629f, 0.072372f, 0.056107f, 0.017264f, 0.035718f, 0.017426f, -0.020830f, -0.011971f, -0.039085f, -0.085397f, -0.049463f, -0.048476f, -0.064310f, -0.030475f, -0.014830f, -0.016616f, 0.022768f, 0.001400f}, + {0.001115f, 0.000622f, 0.004827f, 0.003952f, -0.004374f, -0.003021f, -0.000939f, 0.005945f, -0.006081f, -0.000380f, -0.003280f, -0.007662f, 0.003876f, -0.001496f, -0.007322f, -0.003116f, 0.007149f, -0.010052f, -0.002979f, 0.009242f, -0.002812f, -0.011497f, 0.007898f, -0.001025f, -0.004083f, 0.002477f, -0.003222f, 0.005750f, -0.003379f, 0.002612f, -0.006697f, 0.005926f, -0.000859f, -0.006490f, -0.000673f, -0.003050f, 0.003597f, 0.002987f, -0.001465f, 0.000436f, 0.000909f, 0.012689f, 0.005857f, -0.001653f, 0.006430f, -0.003161f, 0.005187f, 0.000842f, -0.002223f, -0.001520f, -0.008103f, 0.002208f, -0.003095f, -0.006297f, 0.005703f, 0.000960f, 0.003172f, 0.001356f, 0.003935f, -0.002317f, -0.003552f, -0.000007f, 0.000729f, 0.002315f, -0.001962f, 0.004021f, 0.000390f, 0.000645f, -0.000373f, -0.004999f, -0.000519f, 0.001868f, 0.003626f, 0.000944f, 0.002000f, 0.006068f, -0.002091f, 0.011460f, -0.006422f, 0.001893f, -0.009562f, 0.002658f, 0.001121f, 0.014622f, -0.008731f, 0.000004f, -0.004572f, 0.007318f, 0.007542f, -0.004804f, -0.000863f, -0.004129f, -0.002309f, -0.004822f, -0.005931f, 0.004399f, + 0.001495f, -0.003925f, 0.008231f, 0.007436f, 0.012781f, -0.000384f, 0.004876f, 0.002526f, -0.000155f, -0.011500f, 0.003050f, 0.004790f, -0.004479f, 0.002881f, -0.003285f, -0.003890f, -0.006249f, 0.003289f, 0.008186f, 0.000857f, 0.009542f, -0.003846f, -0.000744f, 0.009586f, 0.005065f, 0.000806f, -0.000055f, 0.009117f, 0.013699f, -0.010095f, 0.002331f, -0.003449f, -0.001517f, -0.015725f, -0.005553f, 0.006451f, -0.004861f, 0.004502f, 0.002075f, -0.002228f, -0.003811f, 0.002339f, -0.001313f, 0.005044f, 0.002642f, 0.002433f, 0.002452f, -0.008032f, 0.000180f, -0.003744f, 0.004815f, 0.008605f, 0.005470f, -0.000874f, 0.008322f, 0.000506f, 0.002004f, 0.000350f, 0.001337f, -0.001776f, 0.006661f, -0.008201f, -0.008954f, 0.000519f, -0.011995f, 0.002358f, -0.003899f, 0.005933f, -0.003345f, -0.009179f, 0.000886f, 0.009383f, -0.001584f, 0.000514f, 0.012612f, 0.016279f, -0.007120f, -0.007176f, -0.002280f, -0.011748f, 0.004924f, 0.001300f, 0.002795f, -0.003992f, 0.006194f, -0.008114f, -0.001707f, 0.005922f, -0.004880f, -0.001487f, 0.000678f, 0.010587f, 0.000466f, 0.007728f, -0.010086f, 0.009943f, + -0.001269f, 0.001643f, 0.006067f, -0.005178f, 0.005019f, -0.002212f, -0.002742f, 0.004773f, 0.005717f, -0.000747f, 0.003155f, -0.012837f, 0.007658f, 0.007968f, -0.014175f, -0.011945f, -0.003755f, -0.009850f, -0.003165f, 0.004169f, 0.002175f, 0.004004f, -0.000167f, -0.003058f, 0.008130f, -0.002529f, -0.000154f, -0.003068f, 0.001484f, -0.004810f, 0.006661f, 0.002170f, -0.006325f, -0.002719f, -0.003116f, -0.002806f, -0.004065f, 0.007769f, 0.020882f, 0.003719f, -0.007440f, 0.009339f, 0.001409f, -0.006761f, 0.019053f, -0.012937f, -0.017982f, -0.010919f, -0.010852f, -0.004003f, 0.005506f, 0.006309f, -0.006147f, 0.009202f, -0.011845f, -0.006864f, -0.001348f, 0.003604f, 0.003069f, -0.004019f, -0.004626f, 0.010270f, 0.002113f, -0.001136f, -0.005930f, 0.007533f, -0.005787f, -0.001792f, 0.000009f, -0.001138f, -0.000828f, 0.002616f, 0.001651f, -0.002145f, 0.006627f, -0.003658f, 0.004020f, -0.000832f, -0.010887f, -0.004823f, -0.004390f, 0.010936f, -0.006465f, -0.008391f, -0.014167f, -0.017098f, -0.003109f, 0.000162f, -0.006686f, 0.011778f, 0.001554f, 0.005966f, -0.005189f, 0.010030f, 0.004448f, -0.007082f, + 0.017249f, -0.008755f, -0.008629f, 0.000441f, 0.010717f, 0.015048f, 0.011119f, 0.002727f, -0.005811f, -0.013705f, 0.004775f, -0.001350f, 0.012166f, 0.003678f, -0.003803f, -0.001918f, 0.006094f, 0.003262f, -0.002184f, -0.018822f, 0.002312f, -0.006385f, 0.003779f, 0.002020f, 0.013283f, -0.017389f, -0.011111f, -0.012586f, 0.006317f, 0.006595f, 0.007728f, -0.008801f, 0.002437f, -0.002148f, 0.000368f, -0.014109f, -0.013447f, -0.008597f, -0.010022f, 0.015547f, -0.006892f, -0.001170f, -0.001172f, 0.005693f, -0.003295f, -0.015095f, 0.005679f, -0.005658f, -0.003007f, 0.007834f, 0.004479f, 0.008893f, -0.000459f, 0.005001f, -0.012016f, -0.004019f, 0.008817f, 0.016890f, 0.008541f, -0.000217f, -0.013605f, 0.009395f, -0.005157f, -0.010348f, 0.013767f, 0.004868f, 0.003942f, -0.008771f, -0.006584f, 0.005510f, -0.004649f, -0.004755f, 0.006556f, -0.005879f, 0.001368f, 0.000686f, -0.011835f, -0.001954f, -0.008385f, 0.011135f, 0.003983f, -0.001366f, 0.000184f, -0.004940f, 0.004674f, 0.001089f, -0.002136f, 0.001826f, -0.014601f, -0.006714f, 0.004602f, 0.002991f, -0.004864f, -0.002213f, -0.011903f, -0.029543f, + 0.009892f, 0.001491f, 0.007404f, 0.007962f, -0.005683f, -0.020844f, 0.016186f, 0.006887f, 0.015944f, -0.002838f, 0.008524f, -0.000069f, -0.005549f, -0.000274f, -0.014591f, 0.018196f, 0.004304f, 0.001876f, -0.009096f, -0.005149f, -0.006081f, 0.005610f, -0.008058f, 0.014071f, 0.000853f, 0.005032f, 0.007965f, 0.004560f, -0.000611f, 0.004799f, 0.004559f, -0.002864f, 0.003899f, -0.014973f, 0.004323f, 0.007448f, 0.007514f, 0.014285f, 0.005152f, -0.008699f, 0.004996f, -0.004080f, 0.009781f, 0.002437f, 0.007240f, 0.011180f, 0.002147f, -0.001574f, 0.008680f, -0.004878f, -0.008492f, -0.002450f, 0.006224f, 0.015502f, -0.002958f, 0.001939f, 0.000774f, 0.002860f, 0.003393f, 0.007329f, 0.002623f, -0.002479f, -0.000120f, -0.003668f, 0.004333f, 0.002885f, -0.008641f, -0.006236f, 0.003833f, 0.007292f, 0.005705f, 0.011683f, -0.013619f, -0.004516f, -0.010094f, 0.015847f, 0.008122f, 0.029156f, 0.016762f, 0.013438f, 0.021641f, 0.004864f, 0.004686f, -0.013472f, 0.000495f, -0.024507f, -0.003349f, 0.008312f, 0.007518f, 0.003501f, 0.006465f, 0.005834f, -0.004138f, -0.004162f, 0.014629f, 0.011607f, + 0.011569f, -0.001454f, 0.002534f, -0.017605f, -0.013616f, -0.006188f, 0.011842f, 0.002868f, -0.001101f, 0.005241f, -0.008729f, 0.000359f, -0.003917f, 0.011254f, 0.010489f, 0.020204f, -0.000819f, 0.007300f, 0.007793f, -0.003850f, -0.009576f, 0.019025f, -0.010010f, -0.003054f, 0.010217f, -0.000037f, 0.006443f, 0.013629f, -0.003034f, 0.004823f, -0.012101f, -0.029497f, -0.014577f, -0.010041f, -0.002294f, 0.000980f, 0.000513f, -0.007847f, -0.013895f, -0.003582f, -0.009409f, 0.003150f, 0.001646f, 0.001117f, -0.015628f, -0.008264f, 0.013556f, 0.003752f, 0.001581f, -0.019693f, -0.015239f, 0.010456f, 0.004588f, 0.006450f, -0.009905f, -0.000451f, -0.002153f, -0.014663f, 0.010977f, -0.006241f, -0.001059f, -0.038970f, -0.009819f, -0.014087f, -0.010147f, 0.002111f, 0.012539f, -0.002089f, 0.016741f, 0.009634f, -0.001508f, -0.016471f, -0.007515f, 0.025769f, 0.003743f, -0.014619f, -0.011531f, -0.004491f, 0.011371f, -0.008734f, -0.000327f, 0.008645f, 0.012424f, 0.015037f, -0.016401f, 0.011221f, 0.001003f, 0.003524f, 0.004113f, 0.006376f, 0.004694f, 0.015058f, -0.000024f, 0.004898f, -0.013193f, 0.018335f, + -0.009383f, -0.003752f, 0.002611f, -0.014386f, 0.017972f, -0.002467f, -0.036234f, -0.011431f, -0.029148f, 0.002176f, -0.000750f, -0.008302f, 0.038747f, -0.006447f, -0.019625f, -0.006195f, -0.005016f, 0.018291f, -0.002690f, 0.008879f, 0.010328f, -0.007044f, 0.013248f, 0.018740f, -0.009509f, 0.007232f, -0.016496f, 0.008138f, -0.005882f, -0.004630f, 0.019096f, -0.007092f, -0.001586f, -0.008864f, 0.000976f, -0.000856f, 0.018118f, -0.025218f, 0.005191f, 0.004975f, -0.007736f, 0.003228f, 0.019096f, 0.020116f, 0.007733f, 0.007125f, 0.009893f, -0.015765f, -0.002472f, -0.016816f, -0.000084f, 0.010599f, 0.007046f, -0.003595f, -0.012931f, -0.004351f, 0.009254f, -0.017392f, 0.000921f, -0.001286f, 0.008349f, 0.016469f, 0.001930f, -0.008933f, -0.006394f, 0.017639f, -0.010947f, -0.005504f, 0.010596f, -0.006344f, -0.020434f, -0.007580f, 0.005227f, 0.003522f, -0.007852f, 0.001945f, 0.011404f, 0.007497f, 0.011045f, -0.001247f, 0.008494f, 0.014995f, -0.006005f, 0.007453f, 0.007106f, -0.010308f, 0.022963f, -0.021469f, 0.013494f, 0.005541f, -0.028990f, 0.028375f, -0.017610f, 0.003898f, -0.002416f, 0.022529f, + -0.008713f, -0.016388f, -0.002424f, -0.000225f, 0.005209f, 0.016969f, -0.013661f, -0.001400f, 0.002363f, 0.000098f, -0.001211f, 0.003866f, -0.010379f, -0.003689f, -0.006469f, -0.019082f, -0.013662f, -0.019465f, 0.015359f, -0.045219f, 0.024609f, -0.017651f, -0.012921f, -0.021778f, 0.002081f, -0.002069f, 0.003528f, 0.016615f, -0.013795f, -0.004485f, 0.012379f, 0.012333f, -0.004151f, 0.005262f, -0.006465f, -0.020188f, -0.002288f, 0.006081f, -0.011005f, 0.017746f, 0.002614f, -0.001102f, -0.010253f, -0.008980f, 0.002124f, 0.026997f, 0.000943f, -0.002680f, 0.007020f, -0.021502f, -0.003969f, 0.009290f, -0.015297f, 0.022994f, 0.013919f, 0.000361f, -0.006640f, -0.006143f, -0.008319f, -0.013733f, -0.018324f, 0.016850f, 0.001401f, 0.028984f, 0.002831f, -0.000027f, -0.012021f, 0.003768f, -0.004379f, 0.007745f, 0.000201f, -0.015803f, -0.012924f, -0.016053f, -0.029078f, -0.002377f, 0.027322f, -0.023315f, -0.000424f, -0.024384f, 0.005534f, 0.009585f, 0.007688f, 0.021154f, -0.000235f, -0.024611f, 0.021676f, 0.000908f, -0.010441f, -0.007780f, -0.020030f, -0.004271f, -0.013129f, 0.014373f, 0.020228f, -0.007767f, + 0.018049f, -0.017629f, -0.008472f, 0.011377f, 0.004402f, -0.023592f, 0.002062f, 0.029373f, -0.033924f, 0.001466f, 0.016681f, 0.038200f, -0.016011f, -0.010428f, -0.003686f, 0.029455f, 0.030032f, -0.031719f, -0.000911f, -0.024495f, -0.010912f, 0.015034f, 0.016223f, 0.019979f, 0.012196f, -0.004626f, 0.014966f, -0.018401f, -0.009105f, -0.002336f, -0.002231f, -0.026382f, 0.002794f, -0.001128f, 0.034683f, -0.005820f, 0.017337f, 0.003539f, 0.010466f, 0.022365f, -0.013390f, -0.006701f, -0.033312f, 0.022742f, -0.029319f, -0.005806f, 0.007261f, -0.004538f, -0.016778f, -0.004829f, 0.005276f, -0.012738f, 0.003727f, -0.002508f, -0.002246f, -0.038460f, -0.026541f, 0.001364f, -0.019167f, -0.027169f, 0.005221f, -0.025171f, 0.008140f, 0.015472f, -0.014178f, 0.026937f, 0.006082f, 0.017013f, 0.019304f, 0.004105f, -0.013608f, -0.017607f, -0.019998f, 0.009466f, -0.019091f, 0.048124f, 0.019029f, 0.008989f, 0.023649f, -0.008522f, 0.004421f, -0.024346f, -0.033095f, 0.021249f, 0.040961f, 0.013250f, -0.000880f, -0.040290f, 0.048996f, 0.008073f, 0.005442f, 0.008040f, 0.001171f, 0.009917f, 0.002167f, -0.006158f, + -0.000973f, 0.013528f, -0.008367f, 0.016774f, 0.002362f, -0.011373f, -0.017888f, -0.003632f, 0.015063f, -0.003208f, 0.004462f, -0.005978f, -0.006992f, 0.001441f, 0.043887f, 0.008427f, 0.005757f, 0.007282f, 0.003063f, 0.028022f, -0.010663f, 0.009046f, -0.017983f, 0.033242f, 0.043602f, 0.013033f, -0.003304f, -0.014239f, 0.045562f, 0.023390f, -0.000104f, -0.016231f, 0.005968f, -0.008969f, -0.002494f, -0.018684f, -0.008586f, -0.011731f, -0.019748f, 0.032611f, -0.010064f, 0.024730f, 0.003770f, -0.015106f, -0.001228f, -0.034902f, 0.034671f, 0.000220f, -0.018001f, -0.010288f, -0.022544f, -0.023530f, -0.014963f, 0.044821f, -0.010687f, -0.004507f, 0.011201f, 0.014430f, -0.010954f, -0.010727f, 0.043551f, 0.043569f, 0.052823f, 0.032439f, 0.009987f, -0.013318f, -0.014755f, 0.008218f, 0.014823f, 0.019173f, -0.029108f, -0.000686f, -0.004147f, 0.014354f, 0.010438f, -0.019616f, -0.025132f, -0.000054f, -0.010089f, 0.023153f, 0.026316f, -0.000050f, 0.013469f, 0.004674f, 0.004754f, 0.031340f, -0.020282f, -0.025639f, 0.018971f, -0.033571f, 0.001715f, -0.010545f, 0.017189f, 0.009079f, -0.000939f, 0.021163f, + 0.018427f, -0.018398f, 0.020993f, -0.000537f, -0.011055f, 0.004746f, 0.022786f, -0.010030f, 0.008784f, 0.017340f, 0.006455f, -0.039663f, -0.024283f, 0.002954f, 0.000150f, -0.027413f, -0.020079f, 0.007685f, 0.010434f, 0.009463f, -0.038305f, -0.026540f, -0.027520f, -0.003556f, 0.012959f, 0.020976f, -0.060105f, -0.044122f, 0.003805f, 0.006348f, 0.029451f, 0.008687f, 0.007913f, 0.020293f, -0.008005f, -0.010751f, -0.014434f, -0.017783f, -0.037280f, -0.034360f, -0.030009f, 0.012208f, -0.004687f, 0.017402f, -0.032970f, -0.004271f, 0.000571f, -0.011343f, -0.015907f, 0.027068f, -0.010882f, 0.006307f, -0.001289f, 0.002853f, -0.027000f, -0.008562f, -0.023203f, 0.004029f, 0.002095f, 0.006871f, 0.060910f, -0.022979f, 0.016231f, 0.027081f, -0.014000f, -0.011353f, -0.019471f, -0.002669f, 0.028077f, -0.028313f, 0.019406f, -0.000799f, -0.005626f, 0.003849f, 0.002262f, 0.016972f, 0.001113f, -0.030050f, 0.023252f, -0.018260f, -0.045405f, -0.035065f, -0.018724f, 0.061887f, 0.050965f, -0.026727f, -0.008502f, -0.037133f, -0.032440f, -0.011354f, 0.037163f, 0.002311f, 0.025624f, 0.014884f, -0.017745f, 0.021119f, + -0.013408f, -0.038511f, -0.003211f, -0.022714f, -0.004554f, -0.011391f, 0.079584f, 0.002413f, -0.064250f, 0.053098f, -0.019020f, -0.012576f, 0.054500f, 0.054942f, 0.004847f, -0.020050f, 0.020340f, 0.009209f, -0.030906f, -0.020067f, 0.010034f, 0.006898f, 0.017557f, 0.053195f, 0.009733f, -0.001959f, 0.013029f, 0.002207f, -0.021923f, -0.014357f, 0.012466f, 0.002123f, 0.044305f, 0.009701f, -0.002340f, 0.015192f, 0.023950f, 0.023175f, 0.026083f, 0.000650f, -0.017680f, -0.005773f, -0.040858f, -0.006397f, -0.046190f, 0.025122f, -0.027992f, -0.011822f, 0.000447f, 0.036774f, -0.021540f, 0.020027f, -0.015051f, 0.011727f, -0.018959f, 0.023024f, 0.036600f, 0.001409f, -0.007430f, -0.020673f, -0.027950f, 0.014599f, 0.018302f, 0.044838f, -0.006024f, 0.001000f, 0.020515f, 0.072413f, -0.017024f, 0.009582f, -0.011756f, -0.042691f, 0.029044f, -0.007593f, 0.020700f, -0.004401f, 0.005262f, -0.026792f, 0.068507f, -0.104725f, 0.075631f, -0.120110f, 0.050917f, -0.063556f, 0.019139f, -0.050986f, 0.017548f, 0.027322f, -0.006850f, 0.017918f, -0.010770f, 0.077755f, -0.049111f, 0.042392f, 0.025429f, 0.021640f, + 0.082119f, -0.056804f, 0.023503f, 0.015939f, -0.050201f, -0.000547f, -0.010268f, -0.013251f, -0.025995f, -0.000471f, 0.002488f, 0.033860f, 0.011866f, 0.018199f, 0.024364f, 0.021037f, 0.000398f, 0.028494f, -0.031981f, -0.003486f, 0.037861f, 0.005364f, -0.052615f, -0.010884f, -0.068742f, -0.011616f, 0.011750f, -0.011463f, -0.016142f, -0.001705f, 0.061102f, 0.016803f, 0.004580f, 0.008849f, 0.015249f, -0.003202f, -0.035184f, -0.009287f, -0.003924f, 0.008051f, -0.008098f, -0.014828f, 0.044377f, 0.025521f, -0.009113f, -0.000396f, -0.009450f, -0.038316f, -0.032815f, -0.022186f, -0.019866f, 0.046708f, 0.010924f, 0.018565f, -0.026819f, -0.024044f, 0.008589f, 0.020492f, 0.016966f, -0.005166f, -0.005154f, -0.027836f, -0.019979f, 0.029347f, 0.001264f, -0.070578f, 0.025866f, 0.043576f, 0.012656f, -0.028146f, -0.020231f, -0.011095f, 0.004197f, -0.015803f, 0.008349f, -0.025236f, -0.067620f, 0.059146f, 0.073443f, -0.007429f, 0.053626f, 0.001577f, 0.008856f, 0.022507f, -0.045912f, 0.016503f, 0.035423f, 0.033677f, 0.015195f, 0.010175f, -0.032868f, 0.024371f, 0.015487f, -0.020786f, 0.011894f, -0.004311f, + 0.041310f, 0.010931f, 0.011356f, 0.023696f, -0.008472f, -0.027497f, 0.009047f, 0.051343f, -0.017241f, -0.009907f, 0.047546f, -0.016877f, -0.019527f, -0.016653f, 0.017218f, 0.059957f, 0.084221f, -0.004743f, -0.052476f, 0.081868f, 0.029377f, -0.052954f, 0.062071f, 0.023978f, -0.013611f, -0.014688f, -0.021278f, -0.036740f, -0.000629f, 0.021004f, -0.030832f, -0.019856f, -0.066820f, -0.007743f, 0.041471f, -0.081109f, -0.043213f, 0.015127f, 0.015087f, 0.018692f, 0.052044f, 0.047196f, -0.071877f, 0.003736f, 0.004627f, -0.048472f, 0.016351f, 0.029155f, -0.025021f, -0.013831f, -0.021037f, 0.021680f, 0.058980f, 0.026770f, 0.029848f, -0.026885f, 0.013081f, -0.037840f, 0.043793f, 0.149514f, -0.048348f, 0.002397f, 0.010493f, 0.068155f, 0.058548f, -0.018293f, -0.026648f, -0.036245f, 0.000785f, 0.029623f, -0.001720f, -0.017874f, -0.020425f, 0.028098f, -0.015322f, -0.034674f, -0.032862f, -0.005125f, 0.053926f, 0.039682f, -0.043974f, 0.004373f, 0.000238f, -0.017417f, 0.020993f, 0.009498f, -0.015955f, -0.003527f, -0.012610f, -0.004189f, 0.069249f, -0.024259f, -0.046599f, -0.030652f, -0.026593f, 0.063359f, + 0.001443f, -0.012458f, 0.056496f, 0.040862f, 0.015327f, 0.030795f, 0.055644f, -0.031923f, 0.008524f, 0.056316f, 0.031698f, 0.043575f, -0.047064f, -0.011079f, -0.001687f, 0.022127f, 0.018829f, -0.042217f, 0.004425f, -0.056116f, -0.087855f, -0.002106f, -0.023039f, 0.043539f, 0.045782f, -0.009179f, -0.003286f, 0.012103f, -0.031689f, -0.082319f, 0.057733f, -0.038228f, 0.009137f, -0.012693f, -0.028694f, -0.013385f, -0.033301f, -0.062476f, 0.006966f, 0.003994f, -0.023237f, -0.006863f, -0.072889f, -0.041571f, -0.033934f, -0.085556f, 0.099197f, -0.001944f, 0.052330f, -0.011527f, 0.002766f, -0.059378f, -0.032512f, -0.030363f, 0.007146f, 0.047440f, -0.001886f, -0.048173f, -0.036208f, -0.069067f, -0.077348f, 0.067386f, 0.024921f, -0.059611f, -0.018398f, 0.030753f, 0.055862f, 0.008777f, -0.068439f, -0.040769f, 0.013992f, 0.020440f, 0.017526f, 0.041465f, -0.042361f, -0.039247f, -0.005790f, -0.012937f, 0.006121f, 0.013561f, -0.082281f, -0.013538f, -0.057262f, -0.035118f, -0.076532f, -0.027200f, 0.105822f, 0.020299f, 0.003705f, 0.028137f, 0.026474f, 0.010709f, 0.078625f, 0.064660f, -0.020282f, 0.023918f, + 0.105997f, -0.024652f, -0.024675f, -0.021943f, -0.078919f, 0.000595f, -0.043375f, -0.093971f, -0.103086f, -0.049466f, -0.053556f, 0.028900f, -0.040386f, 0.009039f, 0.020168f, -0.063285f, -0.025593f, 0.008622f, 0.004133f, 0.068056f, -0.045269f, 0.015480f, -0.051985f, -0.014251f, -0.056414f, 0.009622f, 0.063541f, 0.001226f, 0.038511f, -0.078431f, 0.069384f, 0.026822f, -0.016603f, 0.059575f, 0.006039f, 0.028798f, -0.024471f, -0.023600f, -0.002270f, 0.020552f, 0.011601f, -0.053435f, 0.050457f, -0.059484f, 0.006149f, 0.021066f, -0.022825f, 0.040622f, -0.040487f, -0.018533f, -0.005655f, -0.010176f, -0.021049f, -0.000492f, 0.007189f, -0.025044f, -0.035340f, -0.006983f, -0.007037f, -0.004172f, 0.019816f, 0.015661f, 0.007571f, -0.037003f, 0.010221f, 0.055159f, 0.066195f, -0.044561f, -0.025558f, 0.061929f, 0.077245f, -0.041993f, -0.029724f, 0.038258f, 0.013314f, -0.031807f, 0.030718f, -0.082088f, -0.017696f, 0.042180f, 0.070070f, 0.015850f, -0.043976f, -0.032319f, 0.010343f, 0.092127f, 0.006912f, 0.021190f, 0.001862f, 0.037617f, -0.006551f, 0.073944f, -0.002880f, -0.055283f, 0.038731f, -0.024243f, + -0.102741f, -0.032749f, 0.021201f, -0.039139f, 0.108006f, 0.073275f, 0.053559f, 0.023297f, 0.073921f, 0.046476f, 0.019875f, 0.030545f, -0.079866f, -0.115148f, -0.012279f, -0.002425f, -0.025495f, 0.011433f, -0.002091f, -0.032690f, -0.033382f, -0.033405f, 0.061115f, 0.046816f, -0.037079f, -0.008747f, -0.002377f, -0.013711f, -0.011091f, -0.024616f, -0.027276f, -0.046360f, -0.004914f, 0.071848f, -0.020884f, -0.045586f, -0.016767f, 0.067169f, -0.029827f, -0.036263f, 0.112914f, 0.035285f, 0.021737f, -0.030424f, -0.056946f, -0.045847f, -0.058837f, 0.012979f, 0.054576f, 0.134603f, -0.118356f, -0.055515f, 0.074703f, 0.094882f, 0.020570f, -0.009846f, 0.130226f, 0.056742f, -0.036729f, 0.036285f, -0.011308f, -0.003772f, -0.084599f, -0.048721f, -0.027451f, -0.148653f, -0.057887f, -0.028038f, 0.080739f, -0.047098f, -0.021216f, 0.052204f, -0.000925f, -0.014230f, 0.016637f, 0.032253f, 0.091246f, 0.034280f, -0.008237f, 0.024399f, -0.005231f, -0.007912f, -0.034415f, 0.016825f, 0.013440f, -0.026106f, -0.013583f, -0.096548f, -0.004534f, 0.040593f, -0.009968f, -0.039912f, 0.017143f, -0.008501f, 0.043111f, 0.009338f, + -0.021768f, 0.000272f, 0.046185f, -0.026017f, 0.006921f, 0.017525f, -0.014849f, 0.000221f, -0.025931f, 0.052307f, -0.003730f, 0.008347f, 0.000194f, 0.025640f, -0.011947f, -0.009035f, -0.016797f, 0.011036f, 0.018762f, -0.007779f, 0.022405f, -0.009232f, 0.013544f, -0.023451f, -0.019769f, 0.030240f, 0.037051f, -0.047896f, 0.001589f, 0.000966f, 0.003875f, 0.016319f, -0.031372f, 0.048068f, -0.042848f, 0.038958f, 0.004604f, -0.064629f, -0.004280f, 0.052630f, -0.067653f, 0.033358f, -0.000360f, 0.010213f, -0.016688f, -0.008277f, 0.013001f, -0.017418f, 0.068181f, -0.048391f, 0.007390f, -0.010800f, -0.005955f, 0.020355f, 0.001927f, -0.004477f, -0.049474f, -0.138682f, -0.198935f, 0.064844f, 0.172934f, 0.036192f, 0.482878f, 0.397085f, 0.266045f, 0.453505f, 0.232913f, -0.022017f, -0.063996f, -0.187727f, -0.425646f, -0.352885f, -0.344540f, -0.475602f, -0.355116f, -0.111527f, -0.086083f, -0.023649f, 0.149743f, 0.062910f, -0.034029f, 0.089022f, 0.155159f, 0.068118f, 0.063281f, 0.138331f, 0.074402f, 0.053085f, 0.121009f, 0.200872f, 0.070809f, 0.108175f, 0.184337f, 0.012519f, -0.010400f, 0.158082f, + 0.081827f, -0.096937f, 0.059835f, 0.084754f, -0.149181f, -0.066593f, 0.098146f, -0.060105f, -0.114022f, 0.132908f, 0.051352f, -0.144504f, 0.049301f, 0.077741f, -0.205916f, -0.197101f, -0.113441f, -0.439168f, -0.568954f, -0.378980f, -0.514518f, -0.668743f, -0.488333f, -0.501384f, -0.632477f, -0.519351f, -0.388719f, -0.419723f, -0.292059f, -0.080991f, 0.016320f, 0.152575f, 0.313738f, 0.408106f, 0.519923f, 0.569393f, 0.605801f, 0.477355f, 0.132426f, 0.006435f} + }, + { + {-0.013812f, -0.004739f, 0.001066f, -0.002851f, 0.000736f, 0.000244f, 0.007534f, -0.009808f, -0.005056f, -0.000901f, -0.004243f, -0.002640f, -0.007437f, 0.003630f, -0.007415f, -0.004358f, 0.001129f, 0.006013f, -0.007526f, 0.000036f, 0.000556f, -0.006042f, 0.002394f, 0.001135f, -0.002858f, 0.000562f, 0.003302f, 0.010859f, 0.002104f, 0.001420f, 0.004345f, 0.001814f, -0.000538f, 0.002236f, -0.002530f, 0.002325f, -0.009430f, -0.003408f, 0.002657f, -0.002102f, 0.010008f, -0.005262f, -0.003015f, -0.006340f, 0.002086f, 0.001896f, -0.001167f, 0.001637f, -0.001755f, -0.003058f, -0.005411f, -0.000612f, -0.000781f, 0.004443f, 0.006173f, 0.001689f, 0.004392f, 0.003213f, 0.000223f, 0.000781f, 0.000023f, -0.009515f, 0.001992f, -0.000093f, -0.005615f, 0.000400f, -0.005086f, 0.004639f, 0.004961f, -0.002676f, -0.004876f, -0.011462f, 0.003131f, 0.006387f, 0.005926f, -0.005542f, -0.000534f, 0.007509f, 0.018123f, 0.000265f, 0.000789f, -0.008678f, -0.006865f, 0.005175f, 0.003239f, 0.000433f, 0.007431f, -0.011177f, -0.003731f, 0.018013f, 0.001284f, 0.003478f, -0.004691f, -0.006134f, 0.008549f, 0.007061f, + -0.002912f, 0.006950f, 0.000366f, 0.001102f, -0.006812f, 0.002441f, -0.006191f, -0.004930f, -0.006073f, 0.002058f, 0.000339f, -0.002043f, -0.000596f, 0.002072f, 0.005474f, -0.002604f, -0.009701f, 0.000132f, -0.006874f, -0.008981f, -0.002215f, 0.003995f, -0.001234f, 0.003561f, 0.002439f, 0.003261f, -0.001245f, -0.001298f, -0.001503f, -0.001487f, 0.003216f, -0.000144f, 0.006423f, -0.000875f, 0.007922f, 0.001239f, 0.001992f, 0.007278f, 0.002884f, 0.001833f, 0.009770f, -0.003891f, 0.003465f, -0.003332f, -0.006324f, 0.006104f, -0.001807f, -0.000023f, 0.002733f, -0.001163f, -0.005033f, -0.001751f, 0.004606f, -0.002625f, 0.000560f, -0.005420f, 0.003418f, -0.023674f, -0.012373f, -0.005495f, -0.005206f, 0.000021f, 0.000001f, 0.001804f, 0.000273f, -0.001293f, -0.009785f, -0.004374f, -0.010029f, -0.015568f, -0.013104f, 0.007385f, 0.008999f, 0.009204f, -0.003693f, -0.001064f, -0.001114f, -0.002029f, 0.003297f, 0.001430f, -0.003403f, -0.007055f, 0.005006f, 0.004359f, 0.006273f, 0.001674f, -0.002233f, -0.003865f, 0.001712f, 0.003042f, -0.000820f, 0.006464f, -0.003242f, -0.000184f, 0.006182f, -0.004813f, + -0.007731f, 0.000599f, 0.010451f, 0.002413f, 0.002231f, 0.001462f, -0.000014f, 0.001333f, -0.001739f, 0.001856f, -0.008445f, 0.001335f, 0.008545f, -0.002011f, 0.000020f, 0.000826f, -0.003060f, -0.001689f, -0.001305f, -0.001449f, -0.002418f, 0.005249f, -0.005068f, 0.005145f, 0.004331f, 0.009660f, -0.000760f, 0.005397f, 0.012333f, -0.002366f, -0.010055f, -0.011303f, -0.000564f, -0.001587f, 0.000640f, -0.009682f, 0.002949f, -0.006754f, 0.016212f, 0.013278f, 0.005257f, 0.006942f, -0.004576f, 0.003293f, 0.011126f, 0.005877f, 0.012003f, -0.004490f, 0.004675f, 0.007332f, -0.000630f, 0.009319f, -0.004945f, 0.005940f, 0.000751f, -0.005466f, -0.001745f, -0.000783f, -0.000641f, -0.001328f, 0.000393f, -0.002585f, 0.000624f, -0.001805f, 0.010945f, -0.002267f, -0.000906f, 0.000291f, -0.005355f, -0.013954f, 0.007834f, -0.003059f, 0.002844f, -0.005338f, -0.005660f, -0.005728f, -0.004319f, 0.004055f, 0.010472f, 0.008849f, 0.003274f, -0.000254f, -0.002622f, 0.003786f, 0.007431f, -0.001342f, -0.002858f, 0.009979f, -0.004569f, 0.004994f, -0.005105f, -0.003331f, -0.002622f, 0.004005f, 0.003462f, -0.006282f, + -0.004982f, 0.000667f, 0.006854f, 0.009849f, 0.004703f, 0.007827f, -0.001379f, 0.007414f, 0.002285f, 0.007816f, -0.004450f, 0.003605f, 0.015921f, 0.008468f, 0.006428f, -0.000709f, -0.005279f, -0.010012f, 0.005028f, 0.019132f, 0.002534f, 0.007098f, 0.013583f, 0.000518f, -0.007944f, -0.003074f, -0.002427f, 0.000862f, -0.004983f, -0.013108f, 0.005391f, 0.000840f, 0.000309f, 0.006048f, -0.008882f, -0.003670f, 0.014140f, -0.002955f, -0.005201f, -0.007803f, 0.000426f, -0.007307f, -0.001143f, -0.002023f, -0.002165f, 0.001654f, 0.011597f, 0.000320f, -0.003296f, 0.004063f, -0.008729f, 0.012893f, -0.001207f, -0.001902f, 0.015524f, -0.007855f, 0.001132f, -0.009388f, -0.004266f, 0.001860f, 0.000972f, 0.005005f, 0.005315f, -0.008100f, 0.003319f, 0.005028f, 0.003764f, 0.002127f, 0.005021f, 0.004476f, 0.007076f, -0.004419f, -0.002323f, 0.013456f, -0.004119f, 0.006174f, 0.002066f, 0.005155f, 0.004094f, 0.000834f, -0.002954f, 0.001373f, 0.009648f, -0.002854f, 0.000770f, -0.000293f, 0.003439f, 0.010169f, -0.002557f, -0.006455f, -0.016219f, 0.004517f, 0.001595f, 0.002474f, 0.003120f, -0.001605f, + -0.006743f, -0.021743f, 0.011716f, -0.008122f, -0.010102f, -0.000923f, -0.020249f, 0.003240f, 0.008111f, -0.003840f, 0.017338f, -0.007518f, -0.017621f, 0.003137f, 0.008736f, -0.008095f, -0.012021f, 0.021647f, 0.000048f, -0.002828f, 0.007375f, -0.006556f, -0.001444f, 0.000909f, -0.009783f, 0.005176f, 0.000330f, 0.001811f, -0.000828f, 0.009345f, -0.001182f, 0.004597f, 0.006883f, -0.012130f, -0.003660f, -0.007479f, 0.012678f, -0.006992f, -0.001715f, 0.006953f, -0.001326f, -0.007752f, 0.006519f, 0.013970f, -0.006204f, 0.006037f, -0.006443f, 0.008657f, -0.003916f, 0.003839f, 0.002743f, -0.006997f, -0.014081f, 0.007305f, 0.013171f, -0.002629f, -0.001828f, 0.004969f, 0.009838f, 0.006148f, -0.008995f, -0.002882f, -0.007657f, -0.002562f, 0.005394f, -0.008433f, 0.004672f, 0.005749f, -0.005837f, -0.002046f, 0.003848f, -0.009671f, -0.003139f, 0.005003f, -0.002477f, 0.003110f, -0.000425f, -0.008213f, 0.010388f, -0.011407f, -0.011297f, -0.019399f, 0.008231f, 0.020572f, 0.003191f, -0.003627f, -0.001691f, -0.003385f, 0.017981f, -0.010637f, -0.009651f, -0.002207f, -0.010632f, -0.003193f, -0.011544f, -0.004922f, + -0.008035f, -0.016111f, -0.004362f, -0.003422f, -0.000347f, -0.001608f, 0.004467f, 0.009894f, 0.003735f, 0.005012f, -0.014642f, 0.002076f, 0.000079f, -0.004438f, 0.005532f, 0.003020f, -0.003979f, -0.001654f, -0.010228f, -0.011506f, -0.001284f, 0.013378f, -0.003360f, -0.006406f, -0.000932f, -0.004027f, -0.008638f, 0.000505f, -0.009003f, 0.019985f, 0.017181f, 0.004663f, -0.004373f, -0.004197f, 0.002468f, 0.003365f, 0.004184f, 0.003660f, -0.000333f, 0.007745f, -0.005991f, 0.003688f, -0.005071f, 0.000661f, 0.001053f, 0.004587f, 0.004113f, 0.009710f, -0.002595f, -0.005137f, -0.003573f, -0.020770f, 0.002511f, 0.005006f, 0.000083f, 0.008336f, 0.006281f, -0.005743f, -0.019247f, 0.002438f, 0.021262f, 0.018464f, -0.019902f, -0.019716f, 0.005700f, -0.015856f, -0.007175f, 0.001343f, -0.000239f, -0.006968f, 0.016338f, 0.006047f, -0.021060f, -0.002611f, 0.002122f, -0.001044f, 0.014801f, 0.004353f, -0.009340f, 0.013871f, 0.006315f, 0.001082f, -0.007058f, -0.009261f, 0.007134f, -0.006255f, -0.013979f, -0.003573f, -0.001087f, -0.007500f, -0.007994f, -0.012839f, 0.013583f, 0.000005f, 0.002746f, -0.009178f, + 0.001077f, 0.008122f, -0.006238f, -0.015953f, -0.014358f, 0.015078f, 0.004490f, 0.014172f, -0.001502f, 0.003383f, 0.012039f, 0.021683f, 0.008234f, -0.003818f, -0.010621f, -0.005958f, -0.004811f, 0.002425f, 0.002189f, -0.010054f, -0.002682f, 0.012099f, 0.010297f, 0.016787f, 0.009393f, -0.013515f, -0.010797f, 0.013607f, 0.008935f, -0.009041f, 0.001178f, 0.013898f, 0.002299f, -0.002330f, -0.010738f, 0.011414f, 0.010811f, -0.004408f, 0.018230f, 0.003433f, -0.008294f, 0.003354f, -0.003143f, -0.001541f, 0.009988f, -0.016615f, 0.010018f, -0.010840f, 0.001944f, 0.008924f, -0.000139f, -0.004304f, 0.003270f, -0.011325f, 0.000458f, -0.008773f, -0.025970f, -0.007761f, 0.011016f, 0.007309f, 0.004040f, -0.006113f, 0.005350f, 0.002593f, 0.027800f, 0.004993f, -0.009322f, 0.010559f, 0.002117f, 0.002448f, 0.018547f, -0.005057f, -0.005078f, 0.006687f, -0.012876f, 0.015927f, 0.014595f, -0.000049f, 0.008343f, -0.002736f, -0.007769f, -0.000721f, -0.009788f, 0.001173f, -0.009553f, 0.004178f, 0.000136f, 0.003200f, 0.001438f, -0.016419f, -0.003117f, -0.001756f, 0.001319f, -0.008036f, 0.004098f, 0.004191f, + -0.002747f, 0.022659f, -0.009143f, -0.019197f, 0.012375f, 0.019931f, 0.005091f, 0.005581f, -0.007778f, 0.017230f, -0.004779f, 0.003408f, 0.008513f, 0.002787f, -0.006324f, 0.008479f, 0.004888f, 0.001262f, 0.001691f, 0.056988f, -0.015868f, 0.000752f, -0.006043f, -0.003183f, -0.012918f, 0.000179f, -0.033448f, 0.017717f, -0.012178f, -0.000322f, 0.018961f, 0.010025f, -0.012945f, -0.013097f, -0.005300f, -0.011087f, 0.010397f, -0.026802f, 0.004934f, 0.012025f, 0.015592f, 0.003779f, 0.004600f, 0.001358f, 0.002505f, -0.002869f, -0.008650f, -0.024280f, -0.003703f, 0.004006f, 0.011563f, -0.008169f, 0.011181f, 0.005241f, -0.004475f, -0.000666f, 0.008734f, -0.008092f, -0.008434f, -0.003906f, -0.006376f, 0.000110f, -0.021975f, -0.009242f, -0.005041f, 0.000580f, 0.017881f, 0.005201f, 0.017114f, 0.007117f, -0.000388f, -0.009118f, 0.001712f, 0.002554f, 0.003035f, 0.007419f, 0.024051f, 0.004480f, -0.021428f, 0.007551f, -0.007979f, 0.001412f, -0.007579f, -0.007076f, -0.003551f, 0.011470f, 0.006723f, -0.036227f, -0.013649f, -0.008417f, 0.008472f, 0.002108f, -0.007220f, -0.000622f, 0.023052f, -0.002465f, + 0.012890f, -0.007972f, -0.010262f, 0.007864f, -0.018414f, 0.001813f, -0.042029f, 0.010778f, -0.014226f, 0.004764f, -0.014753f, -0.029759f, -0.005376f, -0.006359f, 0.020970f, 0.009917f, 0.007130f, 0.000015f, 0.028066f, -0.020837f, 0.004627f, 0.008911f, 0.021552f, -0.024811f, -0.015217f, -0.004307f, 0.001490f, -0.000955f, -0.007872f, -0.001616f, 0.007063f, -0.013007f, 0.002219f, 0.008902f, -0.002163f, 0.001869f, -0.011689f, -0.011968f, -0.008448f, 0.035097f, -0.000249f, -0.007599f, 0.012806f, -0.007503f, -0.017824f, -0.013417f, -0.009903f, -0.001750f, 0.005561f, 0.001993f, 0.000664f, 0.019778f, 0.016913f, -0.002456f, 0.005698f, 0.004877f, -0.022541f, -0.014477f, -0.001468f, -0.001151f, -0.006282f, -0.014458f, 0.017940f, 0.022815f, -0.018816f, 0.012488f, 0.010750f, -0.003216f, -0.018062f, -0.027969f, -0.027984f, -0.021019f, -0.013151f, -0.024517f, 0.001330f, -0.020470f, 0.010689f, -0.017209f, -0.013899f, -0.010121f, -0.010793f, -0.003777f, -0.024900f, 0.000848f, 0.027908f, -0.009975f, 0.014884f, -0.006056f, 0.027869f, 0.023038f, 0.010018f, -0.028799f, -0.006918f, 0.037928f, -0.009433f, 0.028065f, + 0.004884f, -0.027336f, -0.013267f, 0.031754f, 0.001196f, -0.021703f, 0.001045f, -0.018529f, -0.001945f, 0.006287f, 0.003241f, -0.003865f, -0.031208f, -0.028502f, 0.008520f, 0.020287f, -0.017449f, -0.001800f, 0.008794f, -0.001565f, 0.003997f, 0.033825f, 0.007196f, 0.004751f, 0.003948f, 0.011036f, -0.013987f, -0.010896f, -0.006571f, -0.036095f, -0.010915f, -0.013708f, -0.007925f, 0.009196f, 0.007803f, -0.002560f, -0.001960f, -0.014508f, -0.019733f, 0.027704f, -0.004105f, -0.025056f, -0.009403f, 0.004561f, 0.021197f, -0.015417f, -0.001956f, -0.016415f, 0.000134f, -0.019603f, -0.000004f, -0.004873f, -0.033565f, 0.002467f, -0.007127f, 0.025114f, 0.001530f, -0.022037f, -0.015831f, 0.012746f, -0.046048f, -0.024118f, -0.015598f, -0.025812f, -0.013223f, -0.010824f, -0.025971f, 0.027236f, -0.007659f, 0.041321f, -0.020738f, -0.032002f, -0.005789f, -0.021659f, 0.036302f, -0.012889f, -0.018617f, -0.009315f, 0.009989f, 0.017727f, 0.016050f, -0.004377f, -0.003864f, -0.008848f, 0.004327f, 0.029008f, -0.000417f, 0.002164f, -0.009162f, -0.004441f, -0.015128f, -0.005807f, 0.007298f, 0.004334f, -0.012402f, -0.000195f, + -0.018538f, 0.002954f, -0.005195f, -0.006588f, 0.008268f, 0.002655f, -0.008300f, -0.004560f, 0.016817f, 0.005023f, -0.012810f, -0.018838f, 0.030215f, -0.002632f, -0.046268f, 0.023149f, -0.004387f, -0.021386f, 0.010393f, -0.004420f, 0.003187f, -0.006224f, 0.017520f, 0.004539f, 0.003008f, 0.043220f, 0.046138f, -0.017882f, 0.006697f, -0.035902f, -0.004913f, -0.009120f, 0.016998f, -0.008198f, 0.005922f, 0.010140f, -0.005056f, 0.021224f, 0.055653f, -0.041707f, -0.013590f, -0.026355f, -0.017841f, 0.021281f, -0.024351f, 0.051323f, -0.006308f, 0.015721f, 0.002508f, 0.012477f, -0.032218f, 0.005833f, 0.007946f, -0.002401f, -0.005245f, -0.002887f, 0.008915f, -0.019699f, -0.012405f, -0.002955f, -0.006124f, -0.024410f, -0.022109f, -0.006040f, -0.010610f, 0.028883f, -0.008334f, -0.014231f, -0.010782f, 0.009606f, -0.015831f, -0.006846f, -0.026852f, 0.011608f, -0.010863f, 0.010103f, -0.010194f, 0.012949f, -0.008021f, -0.045544f, -0.023955f, 0.005793f, -0.004702f, -0.003640f, -0.015261f, -0.027659f, -0.002908f, 0.010684f, 0.006436f, -0.007230f, 0.007226f, 0.012457f, 0.040796f, -0.019600f, 0.018315f, -0.049309f, + 0.001058f, 0.005381f, -0.007805f, -0.015527f, 0.007373f, -0.000172f, -0.000348f, 0.008564f, 0.030904f, 0.020498f, 0.014049f, -0.011770f, -0.014698f, 0.013598f, -0.024990f, 0.001305f, 0.010904f, -0.016956f, 0.020773f, 0.067741f, 0.045173f, -0.010895f, -0.030924f, -0.018161f, 0.038512f, -0.045971f, 0.000960f, -0.010361f, -0.013275f, 0.021241f, -0.036520f, 0.006421f, -0.019435f, 0.001336f, -0.025862f, -0.016967f, 0.001305f, 0.003087f, -0.000540f, -0.021653f, 0.035933f, 0.009439f, -0.018246f, 0.008662f, -0.006432f, 0.005184f, 0.054348f, 0.019553f, -0.017047f, -0.011776f, 0.001257f, 0.019281f, 0.003230f, -0.039752f, -0.011708f, -0.026842f, -0.011059f, -0.011471f, 0.012685f, -0.005718f, -0.005370f, 0.001816f, -0.002835f, -0.018342f, -0.025152f, 0.017632f, -0.010383f, 0.006376f, -0.002490f, 0.022997f, -0.018242f, -0.009814f, 0.003928f, 0.010972f, -0.023695f, 0.027268f, -0.016975f, -0.034007f, -0.035263f, -0.009707f, -0.011072f, -0.012241f, -0.008931f, -0.049193f, 0.016936f, -0.021954f, -0.009102f, -0.017831f, 0.027367f, 0.012041f, 0.012411f, 0.002764f, -0.005784f, -0.022388f, -0.009926f, -0.064665f, + -0.008624f, 0.043929f, -0.053849f, -0.020724f, -0.001907f, -0.015851f, 0.018664f, -0.010648f, 0.059531f, -0.005641f, -0.013802f, -0.009584f, -0.003405f, 0.017996f, -0.012742f, -0.011289f, 0.048323f, -0.035696f, -0.005222f, 0.011715f, -0.008837f, 0.030988f, 0.016423f, -0.001930f, -0.004808f, 0.013228f, 0.016481f, 0.019153f, 0.014562f, 0.032621f, 0.009300f, 0.014054f, 0.007360f, -0.010532f, 0.053273f, 0.006829f, 0.008970f, 0.013687f, 0.006862f, 0.039168f, -0.004097f, 0.009527f, 0.012201f, 0.011132f, 0.005022f, 0.025636f, -0.016803f, -0.012724f, 0.024279f, -0.005155f, -0.027644f, -0.007171f, -0.047219f, -0.016044f, -0.010510f, 0.042488f, -0.042681f, -0.005986f, -0.000217f, -0.002189f, -0.004483f, 0.024558f, 0.067337f, -0.013101f, 0.006194f, 0.006959f, 0.007718f, 0.032193f, -0.039284f, -0.037971f, -0.037522f, 0.058526f, -0.000611f, -0.022428f, 0.047188f, -0.018452f, 0.037221f, 0.004933f, -0.040309f, -0.113028f, 0.021560f, -0.026044f, -0.045604f, 0.051049f, -0.031044f, -0.013804f, -0.044904f, 0.012814f, -0.009938f, -0.041057f, -0.015087f, -0.023741f, 0.010658f, -0.021853f, -0.000080f, 0.010712f, + 0.017942f, 0.011358f, 0.031241f, 0.006749f, -0.001410f, -0.001703f, -0.028469f, -0.019273f, -0.020592f, 0.017451f, 0.023109f, 0.013026f, 0.007499f, 0.001085f, 0.008259f, 0.020831f, 0.043234f, -0.019134f, -0.012750f, 0.009671f, -0.021200f, 0.023272f, 0.003590f, -0.017409f, 0.044079f, 0.018516f, -0.038985f, 0.017109f, -0.037526f, 0.006502f, 0.005994f, 0.021487f, -0.011351f, -0.009996f, 0.056397f, 0.024729f, -0.025607f, 0.017539f, 0.029406f, -0.020826f, -0.050936f, 0.030646f, -0.004950f, 0.002507f, 0.003167f, 0.015505f, 0.076631f, -0.003578f, 0.008668f, 0.018912f, -0.001418f, 0.022408f, 0.008992f, -0.035910f, 0.006736f, -0.015871f, -0.035052f, -0.041127f, 0.087729f, 0.018292f, -0.005340f, -0.010947f, 0.019997f, 0.078537f, 0.036492f, 0.008986f, -0.002050f, 0.025991f, 0.066171f, 0.015901f, 0.022931f, 0.020034f, 0.047192f, -0.030875f, 0.030601f, 0.012957f, -0.090172f, 0.026139f, -0.012674f, 0.026137f, -0.028046f, 0.020577f, 0.014146f, 0.027363f, -0.000201f, 0.011186f, 0.004394f, -0.026363f, 0.012748f, 0.024637f, -0.021369f, 0.011972f, -0.020778f, -0.013277f, 0.064627f, 0.005759f, + 0.057182f, -0.041676f, 0.017688f, -0.003011f, -0.008394f, -0.002239f, -0.005202f, 0.007915f, 0.020758f, 0.013545f, -0.001879f, 0.031685f, -0.052521f, -0.050315f, 0.035346f, -0.029155f, -0.007609f, -0.007746f, -0.034195f, 0.015785f, -0.009381f, 0.008327f, 0.004699f, 0.054154f, 0.026341f, 0.027866f, 0.010298f, 0.006433f, -0.051248f, -0.013064f, 0.023881f, -0.001928f, -0.000551f, -0.001416f, -0.017822f, -0.044731f, 0.021434f, -0.077998f, 0.066299f, -0.027295f, 0.012034f, 0.044893f, -0.064682f, -0.000524f, -0.006475f, 0.016535f, 0.022711f, 0.028593f, 0.046357f, 0.009056f, -0.031603f, 0.017846f, 0.049376f, -0.070735f, -0.043332f, 0.049120f, 0.001308f, 0.000552f, 0.001079f, 0.005020f, -0.002530f, -0.000372f, 0.023355f, 0.015943f, -0.035749f, 0.003001f, -0.011032f, 0.060692f, 0.034850f, -0.011486f, 0.002205f, 0.007939f, 0.005994f, 0.000318f, 0.020274f, 0.002877f, 0.015187f, 0.061818f, 0.006857f, 0.007099f, -0.010875f, 0.016345f, -0.059826f, -0.024548f, -0.026168f, -0.001972f, 0.004378f, -0.050680f, 0.018312f, -0.044899f, 0.013429f, 0.047876f, -0.012393f, -0.041807f, -0.024946f, 0.018342f, + -0.010556f, -0.085981f, 0.021412f, -0.059629f, -0.015636f, -0.006378f, -0.000520f, -0.022854f, 0.003559f, 0.032485f, -0.027832f, -0.054942f, -0.089346f, 0.071688f, 0.017578f, -0.003338f, 0.015048f, 0.094322f, -0.101644f, 0.039787f, 0.055148f, -0.067315f, -0.017754f, -0.037231f, -0.016950f, 0.093736f, -0.040779f, 0.065921f, -0.029527f, -0.011268f, -0.014857f, 0.020223f, 0.010794f, -0.084979f, -0.013355f, -0.023986f, 0.038079f, -0.000152f, 0.017325f, 0.026870f, -0.038184f, -0.009451f, -0.023550f, 0.012619f, 0.036116f, 0.019150f, -0.049979f, -0.010940f, 0.012781f, 0.005218f, -0.000956f, -0.026397f, -0.007849f, -0.048923f, -0.006288f, -0.008272f, 0.045826f, -0.040233f, 0.097274f, 0.019220f, -0.025302f, 0.040193f, 0.003937f, 0.052700f, 0.032147f, 0.049926f, 0.015152f, 0.045457f, 0.040945f, 0.044420f, 0.051132f, 0.005683f, 0.049546f, -0.062003f, -0.007950f, 0.010878f, -0.037315f, -0.008724f, 0.027328f, -0.048660f, -0.066253f, 0.025534f, 0.046517f, -0.000673f, 0.012072f, -0.050146f, -0.011473f, -0.042451f, -0.000782f, 0.043325f, 0.003398f, 0.083136f, 0.035825f, -0.023137f, 0.062290f, -0.131299f, + 0.119434f, -0.024236f, -0.044358f, -0.032243f, 0.081747f, -0.060959f, -0.013772f, -0.014786f, -0.004052f, 0.049490f, -0.054145f, -0.000777f, 0.016952f, -0.011419f, -0.009939f, 0.005156f, -0.031967f, 0.044858f, -0.000700f, -0.062691f, -0.019834f, -0.012082f, 0.001142f, -0.068973f, -0.003589f, 0.012912f, -0.017475f, 0.004898f, 0.017030f, 0.049468f, -0.021631f, -0.006973f, 0.006694f, -0.025703f, -0.097042f, 0.012748f, 0.071734f, -0.033407f, -0.060888f, 0.008787f, 0.057268f, -0.023209f, -0.021001f, -0.073007f, -0.015727f, 0.006760f, 0.052546f, 0.031123f, 0.003933f, -0.053393f, -0.036895f, 0.051961f, -0.058887f, 0.025448f, 0.088527f, 0.058040f, 0.067777f, -0.028139f, 0.037908f, 0.033005f, -0.083722f, -0.022535f, -0.046947f, -0.003359f, 0.042723f, 0.005380f, 0.046223f, 0.049391f, -0.084446f, 0.097171f, -0.059622f, 0.009369f, -0.002480f, -0.029539f, 0.077332f, 0.010303f, -0.047199f, 0.082100f, 0.055406f, 0.010112f, -0.017037f, -0.040060f, 0.022842f, -0.001545f, -0.005341f, -0.000900f, -0.002969f, 0.001950f, -0.017542f, 0.022041f, -0.001945f, -0.069953f, 0.016496f, 0.008264f, -0.026316f, 0.002801f, + 0.029535f, -0.008580f, 0.000629f, -0.049995f, 0.036364f, -0.016542f, -0.006998f, -0.003283f, 0.020135f, -0.026145f, -0.002390f, 0.008404f, -0.000467f, 0.007983f, -0.014633f, 0.040509f, -0.021402f, 0.069863f, -0.042911f, -0.042294f, 0.040705f, -0.044766f, 0.001331f, 0.037264f, -0.033518f, -0.012170f, 0.017629f, 0.024168f, 0.027894f, -0.100912f, 0.032003f, 0.001537f, -0.024474f, 0.068148f, -0.033634f, 0.006740f, -0.000305f, -0.052806f, 0.070806f, -0.000406f, -0.003489f, -0.034317f, -0.006963f, 0.062240f, -0.013692f, 0.001485f, 0.002659f, 0.021044f, 0.010495f, -0.068041f, 0.037099f, 0.070134f, -0.031884f, 0.032616f, -0.047110f, 0.094057f, 0.010083f, -0.063199f, -0.044947f, -0.149872f, -0.226701f, 0.014661f, 0.195670f, 0.002218f, 0.512189f, 0.463669f, 0.277444f, 0.535211f, 0.350999f, -0.059741f, 0.019064f, -0.070667f, -0.423933f, -0.241943f, -0.187674f, -0.414908f, -0.341344f, -0.102702f, -0.201508f, -0.231623f, -0.021258f, 0.010441f, -0.099654f, 0.017746f, 0.084334f, -0.115557f, -0.098515f, 0.145716f, 0.026831f, -0.040724f, 0.100408f, 0.135544f, -0.004676f, 0.138792f, 0.238791f, 0.081805f, + 0.061589f, 0.242490f, 0.162268f, 0.013948f, 0.176309f, 0.262289f, 0.111698f, 0.130305f, 0.299664f, 0.108647f, 0.034337f, 0.284528f, 0.280226f, 0.080130f, 0.338581f, 0.484167f, 0.174802f, 0.192395f, 0.334394f, 0.093986f, -0.122098f, 0.007905f, -0.125840f, -0.427570f, -0.407782f, -0.436137f, -0.691647f, -0.748139f, -0.797924f, -0.942924f, -0.984025f, -0.963033f, -0.934808f, -0.825490f, -0.736560f, -0.602712f, -0.386639f, -0.263248f, -0.014537f, 0.386460f, 0.334089f, 0.065555f}, + {-0.013861f, -0.005870f, 0.000823f, -0.005459f, -0.000702f, 0.006872f, -0.007999f, 0.003450f, -0.003475f, -0.003504f, -0.007449f, -0.002442f, 0.011322f, -0.008068f, 0.006433f, 0.003489f, -0.006159f, -0.000276f, -0.009061f, 0.002604f, -0.000753f, 0.005558f, -0.016272f, -0.007117f, -0.002165f, 0.003521f, -0.001352f, -0.005909f, -0.000019f, -0.001609f, -0.007437f, 0.007231f, -0.000014f, 0.002122f, 0.007805f, 0.000418f, -0.001935f, -0.001271f, -0.001493f, 0.000720f, -0.003364f, -0.005271f, -0.004332f, -0.004106f, -0.002323f, -0.002574f, 0.010531f, 0.006915f, 0.002549f, 0.002212f, 0.001931f, -0.002321f, -0.000710f, -0.002219f, 0.010002f, -0.001338f, 0.002650f, -0.006858f, 0.002569f, -0.000632f, 0.004066f, 0.002017f, 0.001412f, -0.002971f, 0.000501f, -0.001837f, 0.007803f, 0.000038f, 0.000888f, 0.003626f, 0.001967f, -0.004854f, 0.002329f, 0.001014f, -0.002422f, -0.000327f, 0.000114f, 0.005781f, 0.017463f, 0.004287f, 0.002261f, -0.003736f, -0.001794f, -0.008481f, -0.000705f, -0.001951f, 0.006249f, 0.006124f, -0.006223f, -0.003951f, -0.003900f, -0.003093f, -0.004540f, 0.000733f, 0.004884f, -0.003894f, + -0.004835f, -0.014389f, -0.011156f, -0.007668f, -0.000744f, 0.001043f, 0.010367f, -0.005672f, 0.004941f, 0.003540f, 0.002345f, 0.000886f, -0.008427f, 0.002292f, -0.017521f, 0.002316f, 0.000114f, 0.001031f, -0.001598f, -0.010337f, -0.005244f, -0.008887f, 0.000117f, 0.000791f, -0.005955f, -0.013931f, 0.009249f, -0.000493f, -0.008744f, 0.000143f, 0.005024f, 0.001373f, -0.003353f, 0.002171f, -0.005225f, -0.001877f, -0.004975f, 0.003564f, -0.005277f, 0.006790f, 0.004821f, -0.000954f, -0.009998f, 0.000590f, 0.000695f, -0.000758f, -0.004077f, 0.002440f, 0.001025f, -0.002119f, 0.004417f, 0.005534f, 0.003138f, 0.000311f, -0.000661f, 0.001641f, -0.005740f, -0.018906f, -0.021202f, -0.001519f, -0.008379f, 0.006463f, -0.010389f, 0.002593f, 0.004808f, -0.007106f, 0.005793f, 0.021202f, 0.001188f, -0.001977f, 0.011627f, 0.001551f, 0.011670f, 0.000153f, 0.005317f, -0.008381f, -0.011089f, -0.000629f, 0.004178f, -0.007729f, -0.002506f, -0.000813f, -0.002206f, 0.002076f, -0.002302f, -0.004099f, 0.003801f, -0.001949f, -0.001665f, 0.008306f, 0.011832f, -0.003740f, -0.006459f, 0.002337f, 0.009442f, 0.003582f, + 0.012113f, 0.000483f, -0.001808f, -0.000339f, 0.010779f, 0.000676f, -0.007903f, -0.004296f, 0.008414f, 0.006183f, 0.006502f, 0.001799f, -0.004403f, -0.008797f, 0.001557f, 0.004144f, 0.004933f, -0.001880f, -0.004837f, 0.009535f, 0.006128f, -0.001535f, -0.005615f, 0.000380f, -0.004041f, 0.009996f, 0.002648f, 0.001936f, 0.002706f, 0.001270f, 0.001506f, 0.006312f, 0.000399f, 0.006435f, -0.002062f, 0.010233f, -0.000061f, -0.008687f, 0.011189f, 0.007756f, 0.011779f, 0.012154f, -0.002875f, 0.006063f, -0.002565f, -0.006971f, -0.000594f, 0.018026f, 0.007966f, 0.003983f, 0.006485f, -0.007593f, 0.012941f, 0.005472f, 0.008688f, -0.002604f, -0.014256f, 0.005957f, -0.022273f, 0.004471f, -0.005649f, 0.004428f, 0.003572f, -0.000483f, -0.007630f, 0.001789f, 0.005071f, -0.003056f, 0.004760f, 0.011248f, -0.000753f, -0.009459f, -0.012732f, 0.001919f, 0.005779f, -0.011857f, 0.006611f, -0.011153f, -0.007155f, 0.007943f, -0.004603f, -0.009452f, -0.004491f, -0.006703f, 0.010405f, 0.014081f, 0.008109f, -0.005222f, 0.000136f, 0.007455f, 0.004605f, -0.000775f, -0.005722f, -0.002896f, -0.005010f, 0.005253f, + 0.017633f, -0.000299f, -0.009435f, -0.007684f, 0.004156f, 0.001252f, -0.003483f, -0.010575f, -0.000109f, -0.009090f, -0.003417f, 0.001214f, -0.001452f, 0.006889f, 0.001384f, 0.008738f, 0.010376f, -0.009018f, -0.003282f, 0.024821f, -0.006611f, 0.002325f, 0.003630f, -0.016548f, -0.013940f, 0.000239f, 0.016337f, 0.012288f, 0.019728f, 0.006345f, -0.005522f, -0.008629f, 0.001476f, -0.005034f, 0.003895f, 0.001697f, 0.006657f, 0.012031f, 0.003892f, 0.008806f, -0.000266f, 0.005122f, -0.005446f, -0.011628f, -0.005999f, -0.008971f, 0.000080f, -0.002702f, 0.002611f, -0.014161f, -0.006983f, -0.002158f, 0.005070f, -0.007178f, 0.014306f, -0.016540f, 0.003397f, -0.010561f, -0.008363f, 0.004331f, 0.004034f, 0.013469f, -0.001642f, 0.003079f, -0.004068f, 0.009262f, 0.010155f, 0.002372f, -0.002333f, -0.010956f, -0.001572f, 0.003051f, -0.008132f, 0.007431f, -0.008941f, 0.003142f, 0.014438f, 0.011518f, 0.000053f, -0.005458f, 0.002161f, 0.013737f, -0.001929f, 0.002663f, 0.002173f, 0.010867f, 0.000058f, -0.004363f, -0.007402f, 0.003790f, -0.011065f, 0.002322f, 0.023392f, 0.003360f, 0.011448f, -0.002805f, + -0.009445f, -0.015172f, 0.007481f, -0.010709f, -0.011774f, 0.002729f, -0.005882f, -0.036173f, 0.003201f, 0.006032f, 0.033123f, 0.011229f, 0.002147f, -0.014797f, 0.013618f, 0.006443f, -0.006391f, 0.007713f, -0.001582f, 0.012569f, -0.007648f, -0.003352f, -0.002773f, -0.002812f, -0.005335f, -0.001762f, 0.008352f, 0.007985f, 0.012792f, 0.005106f, 0.006141f, 0.000305f, -0.008771f, -0.008759f, 0.012129f, -0.006335f, 0.002509f, -0.000665f, -0.008976f, 0.013017f, -0.002319f, -0.004982f, 0.001981f, 0.009608f, -0.006278f, 0.014353f, -0.017775f, -0.014088f, -0.018008f, 0.004801f, -0.010195f, -0.014792f, -0.003637f, 0.014768f, -0.006148f, 0.004781f, 0.008403f, -0.005636f, -0.008091f, 0.001166f, 0.001322f, 0.005308f, 0.000928f, -0.003903f, -0.000400f, 0.018983f, 0.007995f, -0.006876f, -0.022873f, -0.017809f, 0.007188f, 0.022700f, 0.019018f, -0.013343f, 0.001247f, -0.007892f, 0.005051f, -0.006388f, 0.010666f, -0.018087f, -0.003216f, -0.022465f, -0.006745f, 0.003421f, 0.007723f, -0.020514f, -0.005290f, 0.014118f, -0.001889f, -0.020579f, 0.010459f, -0.006607f, -0.012006f, 0.006408f, 0.010548f, 0.002377f, + 0.001987f, 0.003631f, 0.013815f, -0.006817f, -0.006184f, 0.003545f, -0.007340f, -0.003739f, -0.000182f, -0.000996f, 0.000076f, 0.011082f, 0.005385f, -0.001577f, -0.001435f, 0.006317f, 0.002303f, 0.007792f, -0.001206f, 0.008803f, 0.009176f, 0.003467f, -0.011151f, 0.001089f, -0.002073f, -0.008020f, 0.009580f, -0.006313f, 0.003620f, -0.007580f, -0.003260f, -0.025841f, 0.001584f, 0.019775f, 0.001047f, 0.021002f, -0.004817f, -0.005715f, -0.023249f, 0.025384f, 0.011491f, 0.013983f, 0.001506f, 0.011178f, -0.001145f, -0.001319f, 0.009173f, -0.007360f, 0.002557f, -0.001596f, -0.026367f, 0.003973f, -0.007272f, 0.004524f, -0.005362f, 0.003379f, 0.021330f, 0.003401f, -0.029677f, -0.000218f, 0.021040f, -0.004025f, 0.012167f, -0.013137f, -0.010288f, -0.024247f, 0.013579f, 0.008180f, 0.015887f, 0.008525f, -0.008863f, 0.014759f, -0.004216f, 0.014164f, -0.009480f, -0.007346f, 0.000348f, -0.002184f, 0.010925f, 0.003244f, 0.009118f, 0.011744f, -0.007187f, -0.004754f, -0.004499f, 0.008030f, -0.002109f, -0.003799f, 0.000865f, -0.008985f, 0.004472f, 0.004342f, -0.005778f, 0.008145f, 0.012193f, -0.004242f, + -0.006386f, -0.000661f, -0.010233f, -0.003803f, 0.014131f, 0.002895f, -0.009658f, 0.018770f, -0.020190f, 0.004023f, 0.009986f, -0.003579f, -0.006995f, -0.000517f, 0.007871f, -0.014051f, 0.006999f, -0.005139f, -0.013379f, -0.008691f, -0.008281f, 0.001250f, -0.004177f, -0.007226f, 0.003036f, 0.023170f, 0.011726f, -0.002004f, -0.008156f, -0.020422f, 0.001700f, 0.012982f, -0.007633f, -0.022615f, -0.000136f, -0.002553f, 0.000122f, 0.004268f, 0.008668f, 0.009857f, -0.004452f, 0.002692f, 0.014042f, 0.001183f, 0.016501f, 0.018351f, 0.040183f, 0.027800f, 0.016729f, -0.003986f, -0.021495f, -0.007138f, 0.019472f, 0.008796f, -0.020730f, 0.015747f, -0.003671f, -0.009886f, -0.012681f, 0.002255f, 0.034852f, -0.023257f, 0.025217f, 0.010241f, -0.005420f, 0.008695f, -0.006781f, 0.018475f, -0.006870f, 0.009971f, 0.001985f, -0.012077f, -0.008662f, -0.011742f, 0.000609f, 0.010800f, -0.002813f, -0.006393f, 0.006854f, 0.001361f, -0.001850f, -0.023081f, 0.007412f, -0.012692f, -0.009696f, 0.007048f, 0.015902f, -0.010937f, -0.016150f, 0.001148f, 0.014482f, 0.001727f, -0.008939f, -0.002939f, -0.005064f, 0.006985f, + 0.005282f, -0.004844f, -0.008232f, -0.012813f, 0.009047f, 0.022058f, 0.014015f, 0.007339f, -0.011519f, 0.006980f, 0.014664f, -0.014814f, -0.018741f, 0.003825f, -0.015126f, -0.007748f, -0.030796f, 0.000101f, -0.020631f, 0.044429f, 0.000712f, -0.016984f, 0.019190f, -0.020980f, 0.024375f, 0.002310f, -0.015251f, -0.025376f, -0.006464f, 0.012938f, -0.020656f, 0.018469f, -0.003108f, 0.012034f, 0.013722f, -0.011599f, -0.005161f, -0.006834f, -0.009695f, -0.003337f, -0.009054f, 0.001856f, -0.011015f, 0.011691f, 0.007017f, 0.009880f, 0.019152f, 0.010307f, -0.002962f, 0.023371f, 0.011640f, 0.004649f, -0.012378f, -0.013035f, 0.006867f, -0.009877f, 0.002367f, 0.007682f, -0.015315f, 0.013562f, 0.035056f, 0.003101f, 0.024980f, 0.012221f, 0.012166f, 0.018215f, 0.001195f, 0.009867f, 0.010148f, -0.022205f, -0.015122f, 0.016088f, 0.001341f, 0.015214f, 0.002978f, 0.015953f, -0.002090f, 0.006040f, 0.004336f, -0.031987f, -0.001577f, 0.008813f, 0.022368f, 0.005323f, 0.019801f, 0.002408f, -0.003617f, 0.006714f, 0.009558f, -0.017769f, -0.029638f, -0.015847f, 0.005583f, 0.007868f, 0.002523f, 0.021383f, + 0.008625f, -0.020595f, -0.002637f, -0.018240f, -0.009739f, 0.008854f, -0.010412f, 0.005130f, 0.005743f, -0.010571f, -0.029153f, 0.009988f, -0.028885f, -0.031460f, 0.006276f, -0.014998f, 0.013534f, 0.021290f, -0.005956f, 0.024704f, -0.006495f, 0.024434f, 0.031254f, 0.001026f, 0.001148f, -0.031311f, -0.006850f, 0.004534f, 0.004789f, -0.002725f, -0.022032f, 0.002559f, -0.018773f, 0.003395f, -0.005608f, 0.006030f, -0.007674f, -0.010800f, 0.001959f, -0.000959f, -0.007341f, 0.008778f, -0.000007f, -0.003702f, 0.022345f, 0.009843f, 0.016576f, -0.009672f, 0.002413f, -0.007915f, 0.005815f, -0.000695f, 0.008284f, -0.001634f, -0.007679f, -0.007402f, -0.021292f, -0.010553f, 0.032134f, 0.014931f, 0.021000f, -0.023686f, 0.004424f, 0.020432f, -0.016895f, 0.001928f, 0.011256f, -0.004765f, 0.011250f, 0.003701f, -0.023204f, -0.003728f, -0.035223f, -0.002168f, 0.012385f, 0.008959f, 0.021038f, -0.019907f, -0.019794f, -0.018825f, -0.030067f, 0.020751f, 0.011643f, 0.002737f, -0.020663f, 0.018555f, -0.001380f, -0.023665f, -0.021363f, -0.006125f, -0.006302f, -0.014870f, -0.007532f, -0.008485f, -0.009283f, -0.004994f, + -0.024148f, 0.012191f, 0.011868f, -0.000394f, -0.003613f, -0.003378f, -0.009945f, -0.026253f, -0.031055f, 0.001645f, 0.011143f, -0.007050f, -0.019846f, -0.009473f, 0.012057f, 0.010873f, -0.001150f, -0.004971f, -0.009686f, -0.007196f, 0.015512f, -0.008193f, 0.010244f, -0.007712f, -0.001759f, -0.028661f, -0.008612f, -0.001592f, 0.019864f, 0.006835f, -0.007614f, -0.015754f, -0.014026f, -0.022323f, 0.034632f, -0.016322f, 0.032602f, 0.005407f, -0.018279f, 0.024339f, 0.019804f, 0.040834f, -0.042467f, 0.017331f, 0.002740f, 0.006604f, -0.011860f, -0.009641f, 0.012666f, 0.010814f, -0.008178f, -0.015958f, 0.014230f, -0.007614f, 0.014292f, 0.022417f, 0.006620f, -0.008034f, 0.009564f, 0.030505f, -0.051827f, -0.058146f, -0.034622f, -0.007237f, -0.023832f, 0.014010f, -0.019445f, 0.000789f, 0.011230f, -0.002883f, 0.038453f, 0.025625f, 0.010503f, -0.012412f, -0.007457f, 0.024777f, -0.003532f, 0.002571f, -0.009929f, -0.024945f, 0.000843f, 0.007916f, 0.007011f, -0.014475f, 0.012034f, -0.000017f, -0.000888f, 0.020551f, 0.031195f, 0.000481f, -0.019032f, -0.010183f, -0.037057f, -0.016344f, -0.009283f, -0.013110f, + 0.002051f, 0.004686f, -0.013355f, -0.007385f, -0.018867f, 0.018597f, 0.024827f, 0.018551f, 0.023110f, 0.016049f, 0.030135f, 0.001574f, 0.010230f, 0.004982f, -0.005703f, 0.009390f, 0.017631f, -0.020333f, -0.062821f, -0.016874f, 0.020083f, -0.034730f, 0.015668f, 0.017870f, 0.006366f, -0.012400f, 0.000329f, -0.010418f, -0.026552f, -0.009557f, 0.014429f, -0.022857f, -0.019254f, 0.003089f, -0.016657f, 0.037563f, 0.037546f, -0.018418f, 0.049027f, -0.040974f, -0.002677f, 0.009118f, -0.042885f, -0.010244f, -0.019211f, 0.008031f, -0.014433f, 0.037432f, 0.002642f, 0.001415f, 0.042457f, -0.000657f, -0.041350f, -0.029707f, -0.021326f, 0.017075f, -0.004326f, -0.036299f, 0.007721f, 0.012496f, 0.017972f, -0.020830f, 0.009417f, 0.021191f, 0.014663f, 0.015391f, -0.006827f, 0.024977f, 0.022728f, 0.010341f, -0.057802f, 0.042545f, -0.022201f, 0.017596f, -0.006363f, -0.003800f, 0.008291f, -0.022628f, -0.016469f, 0.028132f, -0.014395f, -0.001367f, 0.021117f, -0.024355f, 0.021196f, -0.007079f, 0.019434f, -0.026967f, 0.036149f, -0.015086f, 0.057323f, -0.005626f, 0.000906f, 0.017768f, -0.016278f, -0.007492f, + -0.010408f, 0.007367f, -0.006326f, -0.027676f, -0.041420f, -0.007788f, 0.018443f, -0.008507f, -0.017687f, -0.035616f, 0.013628f, 0.007415f, -0.057586f, 0.003121f, -0.004635f, 0.012480f, 0.020721f, -0.012213f, 0.018080f, 0.060591f, 0.027939f, -0.016504f, 0.039166f, 0.014885f, -0.027572f, 0.011488f, 0.024721f, -0.002607f, -0.010570f, -0.034833f, -0.011474f, 0.023835f, 0.012964f, 0.012097f, 0.004896f, -0.005102f, -0.016288f, -0.032816f, 0.016474f, -0.010238f, 0.007287f, -0.024861f, -0.016080f, 0.000790f, -0.005937f, 0.035138f, 0.008218f, 0.006830f, 0.023805f, 0.013855f, -0.041069f, -0.003078f, 0.012161f, -0.005815f, -0.001369f, 0.034804f, 0.008697f, 0.040185f, -0.024838f, -0.012618f, -0.008778f, -0.012815f, 0.012622f, -0.013388f, 0.026449f, 0.030661f, -0.015530f, -0.026572f, 0.044490f, -0.022602f, -0.012954f, -0.003810f, 0.010835f, 0.009189f, -0.029964f, -0.005824f, 0.013157f, -0.010383f, 0.017390f, -0.007806f, 0.025965f, -0.013259f, 0.001945f, 0.049311f, -0.006458f, 0.035884f, 0.050434f, 0.010719f, 0.020424f, -0.010262f, -0.077461f, -0.041252f, -0.021292f, 0.003416f, 0.016990f, -0.077599f, + -0.018021f, 0.080001f, -0.030521f, -0.035114f, 0.071457f, -0.046255f, 0.040372f, 0.052876f, 0.021418f, 0.006635f, -0.040468f, 0.014792f, -0.071190f, -0.035976f, 0.015721f, 0.036216f, 0.004255f, 0.007627f, 0.027050f, 0.071187f, 0.048743f, 0.014209f, 0.002596f, -0.001179f, 0.007879f, 0.004806f, -0.028214f, -0.000621f, 0.017595f, 0.021296f, 0.095989f, 0.052937f, 0.036727f, 0.068126f, 0.027964f, -0.011461f, 0.020371f, -0.002895f, 0.066037f, 0.022449f, -0.006120f, -0.012876f, 0.027082f, -0.006155f, 0.031121f, -0.101328f, 0.003342f, 0.032110f, -0.003109f, 0.039171f, -0.016661f, 0.008555f, 0.020756f, -0.095060f, -0.037200f, -0.010006f, -0.031246f, -0.041306f, -0.046989f, 0.039016f, -0.029690f, 0.004849f, -0.010807f, 0.038432f, -0.072222f, -0.023593f, -0.013013f, 0.016606f, -0.004241f, -0.012603f, 0.046240f, 0.081627f, -0.007373f, 0.017278f, -0.028184f, -0.011002f, 0.037833f, 0.040829f, -0.038706f, -0.118778f, -0.026279f, 0.054306f, 0.007308f, -0.009713f, -0.014040f, 0.007799f, -0.021345f, -0.018537f, 0.022653f, 0.024193f, 0.051365f, 0.024325f, 0.029055f, -0.008564f, 0.069730f, 0.017473f, + 0.042488f, -0.002548f, 0.063862f, -0.021897f, 0.039922f, -0.039327f, -0.004399f, 0.009015f, 0.027039f, -0.008308f, -0.028722f, -0.053218f, 0.027031f, 0.008593f, 0.001473f, -0.023368f, -0.056791f, 0.001361f, 0.000698f, -0.001740f, 0.010410f, 0.037955f, -0.000509f, 0.028606f, 0.079211f, -0.030738f, 0.002688f, -0.022823f, 0.037845f, 0.043363f, -0.048767f, 0.045754f, 0.039506f, -0.027015f, 0.005021f, 0.016877f, 0.024895f, 0.022123f, 0.057399f, 0.027175f, -0.030526f, 0.011175f, 0.075488f, 0.034361f, -0.104079f, 0.036816f, 0.007859f, -0.072609f, -0.032962f, -0.015470f, -0.069380f, 0.016829f, 0.022706f, 0.054624f, -0.039702f, 0.090635f, -0.075599f, 0.061157f, 0.133503f, 0.008286f, -0.073403f, 0.113989f, -0.025358f, -0.002404f, 0.016802f, 0.064242f, -0.036991f, 0.001935f, 0.130580f, -0.065474f, 0.031347f, 0.042888f, 0.042399f, -0.058796f, -0.005549f, 0.009216f, -0.028051f, 0.003725f, 0.013789f, -0.024768f, 0.023302f, -0.041187f, -0.011126f, -0.017415f, -0.002874f, -0.025476f, -0.020804f, -0.009404f, 0.012633f, -0.045212f, -0.040507f, 0.059089f, 0.011129f, -0.040269f, -0.009978f, 0.034095f, + 0.088105f, -0.010026f, -0.042942f, 0.043446f, 0.067550f, -0.022318f, -0.005030f, -0.001130f, 0.024438f, -0.002914f, 0.000040f, 0.027382f, -0.074644f, 0.047596f, -0.043073f, -0.003338f, -0.061039f, 0.030034f, -0.004787f, -0.095726f, 0.044990f, -0.011505f, -0.035246f, 0.056033f, 0.007281f, 0.054795f, -0.051355f, -0.026363f, -0.020649f, -0.054987f, -0.073648f, -0.105933f, 0.083151f, 0.024729f, 0.061228f, 0.046511f, -0.000156f, -0.020032f, 0.070201f, -0.027664f, 0.019343f, 0.018312f, -0.076958f, 0.068847f, 0.021348f, -0.017771f, 0.055522f, 0.006220f, 0.001515f, 0.029561f, -0.027525f, 0.074971f, -0.061704f, -0.030535f, 0.024900f, 0.026468f, 0.009872f, -0.054055f, -0.036284f, -0.060428f, 0.031046f, 0.008979f, 0.028018f, 0.000796f, 0.030214f, 0.014082f, 0.007988f, 0.001909f, 0.025107f, -0.012308f, 0.012255f, -0.027650f, 0.017560f, -0.025622f, -0.003815f, -0.034017f, -0.028028f, 0.001534f, -0.034281f, 0.014257f, 0.068598f, 0.017235f, -0.058511f, 0.028153f, 0.017569f, 0.038142f, -0.003342f, 0.063528f, -0.059602f, 0.007808f, 0.020744f, -0.053819f, -0.017382f, 0.106178f, 0.055055f, -0.142808f, + -0.065671f, 0.074112f, -0.026381f, -0.068747f, 0.020368f, -0.008651f, -0.058459f, 0.035971f, 0.057353f, -0.089865f, 0.009491f, 0.074573f, -0.061302f, -0.050962f, 0.053465f, 0.003781f, -0.061196f, 0.057461f, -0.130014f, -0.014735f, -0.018695f, -0.155380f, -0.021635f, -0.051396f, 0.020057f, 0.020854f, 0.049840f, -0.024798f, -0.053230f, -0.027080f, -0.079157f, 0.006449f, 0.035806f, 0.012671f, 0.019015f, -0.072880f, 0.047402f, 0.001843f, -0.076096f, 0.054998f, -0.082191f, -0.040700f, -0.027153f, 0.019187f, 0.069573f, 0.069160f, -0.000052f, -0.021253f, -0.136265f, 0.056524f, 0.150316f, 0.047961f, 0.009582f, -0.083755f, -0.109674f, -0.052209f, -0.003325f, 0.056090f, -0.066093f, -0.047933f, -0.067956f, -0.028287f, 0.141483f, 0.140696f, -0.018322f, -0.071411f, -0.050548f, -0.035187f, -0.008040f, 0.068663f, -0.027279f, 0.017417f, 0.022930f, 0.044176f, -0.005457f, -0.037267f, -0.076611f, -0.041289f, 0.137657f, 0.050784f, 0.094811f, -0.083441f, -0.034451f, -0.041203f, 0.097650f, -0.003039f, -0.132426f, -0.142981f, 0.088639f, 0.127210f, 0.235844f, 0.031816f, -0.173602f, 0.018319f, -0.017557f, -0.065621f, + 0.055585f, -0.058273f, -0.016023f, 0.004877f, 0.012624f, -0.008910f, 0.011003f, 0.026245f, -0.042156f, -0.031209f, -0.003662f, 0.011418f, 0.022265f, -0.025944f, 0.001023f, 0.024168f, -0.019878f, 0.015970f, -0.011812f, 0.068870f, -0.004047f, -0.007673f, 0.035072f, 0.023265f, 0.030776f, -0.014862f, 0.018461f, -0.004613f, -0.004180f, 0.030270f, 0.016598f, 0.006909f, 0.004998f, 0.039991f, -0.038636f, -0.008428f, 0.000309f, 0.053140f, -0.004336f, -0.009302f, 0.043807f, -0.009891f, -0.024239f, -0.018367f, 0.035551f, -0.007192f, 0.013363f, 0.012609f, 0.002110f, -0.011697f, 0.003102f, 0.017383f, 0.001360f, 0.046402f, 0.017855f, 0.014648f, -0.023478f, -0.000856f, 0.012509f, -0.029622f, 0.006848f, 0.014035f, 0.027944f, 0.002402f, -0.008817f, 0.020389f, -0.001111f, -0.034922f, 0.035833f, 0.014338f, -0.015633f, 0.035842f, -0.030042f, -0.001704f, -0.025740f, -0.014124f, 0.012587f, 0.106515f, 0.009153f, -0.040050f, -0.032201f, 0.004824f, 0.024769f, -0.001954f, 0.022677f, -0.008866f, -0.005321f, -0.030124f, -0.005914f, -0.021208f, 0.033673f, -0.021074f, -0.001040f, -0.013434f, -0.005499f, -0.008020f, + 0.004295f, -0.022304f, 0.004062f, -0.009784f, -0.014770f, 0.004248f, -0.001743f, 0.000971f, -0.003454f, 0.007488f, 0.004481f, -0.018593f, -0.011039f, -0.000209f, -0.011681f, -0.011008f, 0.009900f, -0.003119f, -0.017976f, 0.001132f, -0.009631f, 0.007918f, -0.026915f, 0.013803f, -0.011227f, -0.021080f, 0.007236f, -0.009648f, -0.010070f, 0.002879f, 0.000667f, 0.001372f, -0.003764f, 0.004752f, -0.007631f, 0.009512f, -0.004972f, 0.001158f, 0.016311f, -0.010964f, 0.006028f, -0.002702f, -0.000816f, 0.004499f, -0.011986f, 0.011960f, -0.012675f, 0.011995f, -0.002093f, -0.000115f, -0.007977f, 0.011518f, -0.012437f, 0.001548f, 0.004722f, -0.015934f, 0.016162f, -0.008048f, -0.050443f, -0.084267f, 0.089235f, 0.305231f, 0.059823f, 0.090801f, -0.187623f, -0.263580f, -0.108548f, -0.138615f, 0.107142f, 0.244760f, 0.142470f, 0.093702f, 0.010534f, -0.136859f, -0.119006f, -0.121327f, -0.048088f, 0.066765f, 0.059067f, 0.060711f, 0.056746f, -0.003230f, -0.008076f, -0.015624f, -0.018401f, -0.029868f, -0.002923f, 0.036185f, -0.002437f, -0.023319f, -0.007682f, -0.033064f, -0.016893f, -0.007012f, -0.007007f, 0.058832f, + 0.056959f, 0.031630f, 0.036440f, 0.000221f, -0.042827f, -0.046100f, -0.080815f, -0.056014f, 0.008209f, 0.004936f, 0.017346f, 0.046369f, 0.069215f, 0.039335f, 0.035148f, -0.003447f, -0.038250f, -0.055953f, -0.046117f, -0.041130f, 0.006059f, 0.011869f, 0.025495f, 0.015173f, 0.011827f, 0.000210f, -0.013961f, 0.003114f, 0.001412f, 0.003305f, 0.033940f, -0.006024f, 0.014728f, 0.012367f, -0.026006f, -0.051458f, -0.050365f, -0.048489f, 0.011012f, 0.027496f, 0.011013f, 0.000717f} + }, + { + {-0.008059f, -0.005875f, 0.001286f, -0.005162f, -0.003196f, -0.002335f, -0.000658f, -0.000829f, -0.003333f, -0.009998f, -0.007446f, -0.005293f, -0.002600f, -0.007229f, 0.003015f, -0.001677f, 0.001190f, -0.002989f, -0.001072f, -0.004525f, 0.004732f, 0.000934f, -0.003315f, -0.005961f, 0.000583f, 0.006690f, 0.003686f, -0.006808f, -0.006538f, 0.001222f, 0.000559f, 0.000765f, -0.004552f, 0.000988f, -0.001646f, -0.002945f, -0.000874f, -0.002776f, -0.004192f, -0.001959f, -0.007132f, 0.009224f, 0.002581f, 0.006406f, -0.006208f, -0.010518f, -0.000828f, 0.001353f, -0.001166f, -0.009767f, 0.000570f, -0.002429f, 0.005761f, 0.003895f, 0.004326f, 0.009934f, -0.001717f, -0.000350f, -0.003033f, -0.001500f, 0.003604f, -0.006764f, 0.007948f, 0.009509f, -0.004479f, -0.003122f, -0.007930f, -0.004152f, 0.001607f, -0.002412f, -0.004781f, 0.000525f, -0.005047f, -0.002600f, -0.006397f, -0.005346f, -0.005880f, 0.003920f, 0.011890f, 0.000848f, 0.007993f, -0.001963f, -0.001038f, -0.004412f, 0.008503f, 0.005131f, -0.004835f, -0.006694f, 0.004325f, -0.001854f, -0.009917f, -0.011797f, 0.002834f, 0.000361f, -0.003832f, -0.004179f, + -0.007726f, 0.004744f, -0.009106f, 0.002097f, -0.000836f, 0.001816f, 0.000822f, 0.001689f, -0.004061f, -0.000894f, 0.001689f, 0.002330f, -0.000883f, 0.002903f, 0.002413f, -0.004417f, 0.003125f, -0.002828f, -0.007772f, 0.010729f, -0.002082f, 0.000100f, 0.002700f, -0.001825f, 0.006183f, 0.007378f, -0.001628f, 0.002454f, 0.005945f, -0.000025f, -0.006196f, -0.005342f, 0.001629f, 0.003131f, -0.001833f, 0.001396f, 0.007298f, -0.007057f, -0.005660f, 0.005257f, 0.001229f, -0.003201f, -0.003780f, -0.001067f, 0.001482f, 0.003565f, -0.007167f, 0.002478f, 0.002009f, -0.006946f, -0.005973f, 0.003807f, -0.003126f, -0.009255f, -0.002945f, -0.002853f, 0.011723f, 0.009821f, -0.014554f, -0.006155f, -0.010065f, 0.006637f, -0.004924f, -0.006673f, -0.004671f, -0.005970f, -0.001285f, 0.002351f, 0.010866f, 0.002001f, -0.005914f, 0.009350f, 0.000296f, 0.009639f, -0.009208f, 0.014866f, 0.006786f, 0.016119f, -0.002921f, -0.005315f, -0.001146f, -0.008668f, -0.000790f, -0.000492f, -0.003225f, 0.003130f, 0.000265f, -0.006846f, -0.001720f, 0.000121f, 0.002145f, 0.007089f, 0.001588f, -0.010295f, -0.008710f, -0.003144f, + 0.005870f, 0.000551f, 0.000295f, -0.005131f, 0.008715f, -0.000068f, 0.000659f, -0.003579f, 0.001139f, -0.002089f, 0.004605f, -0.001297f, 0.014553f, 0.000311f, -0.001853f, 0.005691f, -0.003597f, -0.006328f, -0.002624f, 0.005119f, 0.008843f, 0.001665f, 0.005464f, 0.001540f, 0.001023f, -0.004378f, -0.004366f, -0.007141f, -0.000174f, -0.007399f, 0.002080f, 0.006500f, 0.006864f, 0.004965f, -0.002109f, -0.003066f, 0.006316f, 0.010465f, 0.010574f, 0.006118f, -0.000358f, 0.009252f, -0.005194f, -0.007266f, 0.007008f, 0.007998f, 0.009357f, 0.014659f, 0.000976f, -0.008855f, 0.004921f, -0.008441f, -0.000977f, 0.003193f, 0.001695f, 0.016255f, 0.000857f, -0.012619f, -0.001010f, 0.002545f, 0.004984f, -0.000691f, -0.004809f, -0.013944f, -0.003235f, 0.012252f, 0.003696f, 0.008126f, 0.008788f, 0.007909f, 0.001651f, -0.001142f, 0.007721f, -0.010337f, -0.000857f, -0.006974f, 0.018656f, -0.000863f, -0.000041f, 0.008724f, -0.007729f, -0.000954f, 0.002375f, -0.000916f, 0.010801f, -0.001613f, 0.002773f, 0.011118f, -0.002854f, 0.003588f, 0.000155f, -0.000384f, -0.000903f, -0.001296f, -0.004007f, 0.004886f, + 0.005480f, -0.001392f, 0.005400f, 0.002463f, 0.011541f, 0.014487f, -0.001825f, 0.004002f, 0.001229f, -0.007048f, 0.005868f, -0.001563f, -0.007377f, 0.002762f, 0.005518f, 0.002240f, -0.003455f, 0.015720f, 0.015887f, -0.006403f, -0.008713f, -0.008071f, -0.005133f, 0.003778f, -0.016862f, -0.001897f, 0.002606f, -0.008413f, -0.014914f, 0.014484f, -0.002948f, -0.003919f, 0.002582f, 0.006566f, 0.006263f, -0.007713f, -0.002765f, -0.000505f, -0.000602f, 0.003342f, 0.005390f, -0.003039f, 0.006577f, -0.004952f, 0.009969f, -0.001344f, 0.000596f, -0.005166f, 0.005352f, 0.001742f, -0.001298f, -0.005136f, 0.002548f, -0.002977f, -0.004184f, -0.003803f, 0.001041f, 0.003083f, -0.009074f, 0.000666f, -0.017275f, -0.010195f, 0.006411f, -0.002736f, 0.002213f, 0.003788f, 0.011593f, -0.003791f, -0.005679f, -0.000489f, 0.000450f, 0.004750f, 0.004711f, -0.005441f, -0.002318f, 0.012616f, 0.000503f, 0.001886f, 0.001067f, 0.005602f, -0.010620f, 0.000330f, 0.005263f, 0.009835f, 0.001921f, 0.004230f, 0.014767f, -0.003675f, -0.001709f, -0.008077f, -0.000307f, 0.002555f, 0.004656f, -0.009986f, -0.015994f, 0.006927f, + -0.005333f, 0.000439f, -0.008328f, 0.006459f, -0.018473f, -0.014899f, -0.017444f, -0.005699f, -0.003858f, -0.011942f, 0.005939f, 0.016585f, -0.012364f, 0.002630f, 0.019132f, -0.004407f, -0.005528f, -0.008846f, 0.001316f, 0.000003f, 0.008310f, 0.002849f, 0.005884f, 0.004358f, -0.006602f, -0.012280f, -0.006170f, 0.007361f, -0.004502f, -0.007523f, 0.001554f, 0.003100f, 0.002056f, 0.001543f, 0.016474f, -0.007987f, 0.008776f, -0.004432f, 0.004186f, -0.004958f, 0.013582f, -0.010502f, 0.005260f, -0.000933f, -0.008824f, 0.007685f, -0.003608f, -0.002854f, 0.007821f, 0.004342f, -0.001290f, -0.003812f, 0.006999f, 0.003617f, -0.008458f, -0.009513f, 0.005743f, 0.010211f, 0.005121f, 0.000072f, -0.005271f, 0.000347f, 0.005804f, -0.003041f, 0.007130f, -0.002078f, -0.017194f, 0.000318f, -0.008124f, 0.023003f, 0.007080f, -0.013238f, -0.008320f, -0.001853f, 0.000074f, 0.006682f, -0.014137f, -0.015864f, 0.013492f, -0.002396f, -0.014120f, 0.001748f, -0.004179f, 0.014365f, 0.006100f, -0.002913f, 0.001791f, -0.000114f, -0.002847f, -0.001904f, 0.015170f, 0.003666f, 0.000017f, -0.010400f, -0.005856f, -0.002061f, + 0.004710f, 0.007494f, 0.020597f, 0.000986f, -0.000243f, -0.000237f, 0.000483f, -0.009065f, -0.000586f, 0.004282f, -0.012812f, -0.007963f, -0.008701f, -0.000647f, 0.014612f, -0.012505f, 0.001025f, 0.007443f, 0.001917f, -0.005752f, 0.005312f, -0.015769f, 0.011776f, -0.002659f, -0.001328f, 0.007224f, -0.009457f, -0.009366f, -0.016107f, 0.003171f, -0.006294f, 0.013921f, 0.003275f, 0.000322f, 0.001022f, 0.004162f, 0.009201f, -0.004937f, -0.004190f, 0.011219f, -0.004228f, -0.006723f, -0.002240f, 0.011104f, 0.009415f, 0.010164f, 0.003404f, -0.007473f, 0.004255f, 0.008962f, -0.014059f, 0.013696f, -0.012074f, -0.009159f, 0.008761f, -0.030231f, -0.018735f, 0.004526f, 0.010204f, 0.019487f, -0.011578f, 0.010141f, 0.002748f, 0.010722f, 0.000151f, -0.006005f, -0.006197f, 0.006372f, 0.021654f, 0.001101f, -0.001088f, -0.020611f, -0.015944f, -0.000544f, -0.011518f, -0.007861f, 0.001468f, 0.001882f, -0.011820f, -0.004387f, 0.003810f, 0.006773f, 0.004701f, -0.008736f, 0.000738f, 0.008799f, 0.008408f, 0.001012f, -0.006950f, 0.000865f, -0.003955f, 0.001728f, 0.003399f, 0.003777f, -0.005177f, 0.006943f, + 0.018977f, -0.002344f, -0.000598f, 0.003065f, -0.009398f, 0.004348f, 0.015420f, -0.014879f, -0.016309f, -0.009214f, 0.002152f, -0.022443f, 0.001281f, 0.000309f, 0.003805f, -0.000068f, 0.000386f, -0.010722f, -0.004956f, -0.006993f, -0.000252f, 0.014905f, 0.022835f, 0.000582f, 0.002085f, 0.010865f, -0.003948f, -0.001703f, 0.005558f, 0.025248f, 0.003614f, 0.009447f, 0.017859f, 0.003944f, -0.011322f, 0.005878f, 0.016119f, 0.008608f, -0.013091f, -0.001525f, 0.031078f, 0.025710f, 0.006598f, 0.015150f, 0.020846f, 0.004112f, 0.000713f, 0.012143f, -0.004885f, -0.000750f, -0.010810f, 0.008782f, 0.000227f, -0.000414f, 0.005410f, 0.004254f, 0.017450f, -0.014716f, -0.011527f, 0.011623f, 0.003657f, 0.004810f, -0.008728f, 0.000857f, -0.002313f, 0.005517f, 0.001243f, 0.008108f, 0.010059f, -0.009999f, 0.008722f, 0.005320f, -0.009185f, 0.025724f, 0.005921f, 0.004196f, -0.019436f, -0.007673f, -0.000347f, 0.016263f, 0.017495f, -0.002725f, -0.016385f, 0.010505f, -0.014017f, -0.005952f, 0.015047f, -0.001581f, -0.009408f, 0.011997f, 0.018254f, -0.005517f, 0.007308f, -0.008032f, -0.021520f, -0.001271f, + 0.016838f, -0.008356f, -0.005962f, 0.008260f, -0.009024f, -0.018658f, 0.006558f, 0.009711f, 0.023549f, 0.009049f, -0.012841f, 0.004462f, -0.015140f, -0.024080f, 0.024151f, 0.006984f, 0.012879f, 0.032046f, 0.019294f, -0.012737f, -0.004444f, 0.000326f, 0.004760f, 0.005279f, -0.002660f, -0.011322f, 0.002301f, -0.007449f, 0.012367f, 0.001365f, 0.004399f, -0.003262f, -0.002523f, -0.011730f, -0.007353f, 0.027930f, 0.008343f, -0.015295f, 0.007240f, -0.014880f, -0.011799f, -0.023874f, 0.010418f, 0.001622f, -0.000055f, 0.007176f, -0.001115f, -0.010067f, 0.018482f, 0.012132f, -0.004540f, -0.017646f, 0.018702f, -0.011634f, 0.004705f, 0.000986f, 0.005946f, 0.005295f, 0.011840f, 0.015556f, -0.003498f, 0.009387f, 0.021920f, 0.004560f, -0.007118f, -0.004541f, -0.004058f, 0.005306f, 0.014667f, -0.002109f, 0.005938f, 0.003204f, -0.013556f, 0.002658f, -0.003308f, 0.008848f, -0.020279f, 0.002025f, -0.033799f, -0.018071f, -0.018732f, -0.002141f, -0.018429f, 0.015401f, -0.004300f, -0.012464f, -0.003664f, 0.001515f, -0.011861f, -0.001910f, 0.000535f, 0.005157f, -0.005843f, -0.011644f, -0.020813f, -0.027267f, + -0.012061f, -0.018335f, 0.046579f, -0.022874f, 0.010982f, -0.021650f, -0.005516f, 0.001648f, -0.002899f, -0.032022f, -0.000165f, -0.015543f, 0.001586f, 0.036390f, -0.011398f, 0.014891f, 0.020796f, 0.006706f, 0.008682f, 0.021590f, 0.006999f, -0.009353f, 0.006675f, 0.008028f, 0.009714f, 0.003272f, -0.004338f, 0.025180f, 0.001248f, -0.002826f, -0.004113f, 0.006268f, -0.002018f, -0.009789f, 0.008929f, -0.004122f, 0.006414f, -0.025894f, 0.001134f, -0.005660f, 0.022754f, -0.009783f, 0.007332f, 0.033212f, -0.003005f, -0.000132f, -0.008396f, -0.014927f, -0.000944f, -0.003176f, -0.014588f, 0.017208f, -0.004143f, 0.012234f, 0.001085f, 0.011494f, -0.007566f, -0.002247f, 0.026769f, 0.012394f, -0.021660f, -0.011999f, 0.005151f, 0.005593f, 0.002531f, 0.004832f, -0.006990f, 0.006704f, 0.009041f, 0.021567f, -0.030136f, 0.000640f, -0.013745f, 0.004738f, -0.002467f, -0.004580f, -0.006306f, -0.016061f, -0.012681f, -0.015542f, 0.016885f, -0.031655f, -0.008096f, -0.020117f, 0.010632f, 0.031194f, -0.016358f, 0.000193f, 0.001979f, -0.006987f, 0.013423f, -0.010992f, 0.006077f, -0.003872f, -0.012017f, 0.027863f, + 0.002593f, -0.009927f, 0.001606f, -0.004773f, -0.011394f, 0.009378f, -0.008417f, 0.008795f, -0.016778f, -0.008911f, 0.013482f, 0.008452f, -0.028831f, -0.005875f, -0.024321f, 0.007228f, -0.002908f, -0.025100f, 0.031545f, -0.008785f, 0.000872f, -0.023183f, -0.023569f, 0.001170f, -0.021063f, -0.003202f, -0.017947f, -0.016878f, 0.021342f, 0.002016f, -0.023726f, 0.008219f, -0.021007f, 0.020199f, 0.009104f, -0.009832f, 0.002618f, 0.006568f, 0.023199f, -0.016349f, -0.021317f, 0.023779f, -0.014394f, -0.009099f, 0.014522f, 0.018199f, -0.030759f, -0.015717f, 0.021152f, 0.014656f, 0.009749f, -0.000825f, 0.004803f, -0.022544f, 0.016117f, -0.024667f, -0.039133f, -0.032362f, 0.014763f, -0.038620f, -0.001483f, 0.028431f, -0.002213f, 0.001577f, 0.021081f, -0.014287f, -0.011422f, 0.045433f, -0.017905f, 0.010213f, 0.017768f, -0.003800f, -0.041404f, -0.004034f, 0.004636f, -0.011056f, -0.005553f, -0.010288f, 0.039077f, -0.000232f, 0.000620f, -0.002531f, -0.027847f, 0.004497f, -0.015991f, -0.008744f, 0.001852f, 0.004030f, 0.008381f, 0.021910f, 0.005070f, -0.006497f, 0.044447f, 0.003986f, -0.010989f, -0.041321f, + -0.005963f, 0.029081f, -0.006536f, -0.019367f, -0.025102f, -0.022758f, -0.018944f, -0.012585f, 0.031414f, 0.011518f, 0.001591f, 0.016779f, 0.026124f, 0.013923f, -0.006075f, -0.005447f, 0.026906f, -0.006222f, -0.008809f, 0.007069f, 0.020358f, 0.002089f, -0.022025f, 0.004015f, -0.002832f, -0.033009f, -0.003185f, 0.024492f, -0.013505f, -0.015831f, -0.004580f, 0.033064f, -0.028371f, -0.006974f, -0.015402f, 0.031892f, 0.003718f, -0.029306f, -0.000582f, 0.008263f, -0.000537f, -0.013547f, 0.013063f, -0.010100f, 0.026262f, -0.020119f, 0.018239f, 0.038311f, -0.009861f, -0.010582f, -0.008493f, -0.008307f, 0.035116f, -0.025804f, -0.027434f, -0.021656f, 0.008498f, -0.011383f, -0.017386f, -0.008497f, 0.013104f, -0.017488f, 0.010325f, 0.002141f, 0.014287f, 0.019979f, 0.003251f, -0.002651f, -0.003056f, 0.019740f, -0.004281f, 0.006961f, -0.023428f, -0.000228f, -0.007782f, 0.019318f, -0.024909f, 0.021217f, -0.008008f, -0.013231f, 0.022247f, 0.037036f, -0.019827f, 0.010628f, -0.003627f, 0.007633f, -0.054500f, -0.043824f, -0.025691f, 0.004036f, -0.015921f, 0.007524f, 0.002829f, -0.020373f, -0.015253f, 0.002052f, + 0.045250f, 0.010710f, -0.026538f, -0.040896f, -0.020742f, -0.014887f, 0.028056f, -0.018443f, -0.025962f, 0.006785f, 0.006626f, -0.024445f, -0.001098f, 0.000013f, -0.012462f, 0.006869f, 0.055249f, 0.036664f, -0.009943f, 0.003933f, 0.035543f, -0.013973f, 0.000761f, 0.015639f, 0.038437f, 0.022992f, -0.007337f, -0.008579f, -0.014054f, 0.003562f, -0.008044f, 0.000616f, 0.000323f, 0.040980f, 0.067147f, -0.004061f, 0.046067f, 0.029421f, 0.005284f, 0.007146f, -0.034165f, -0.033343f, -0.004602f, 0.008456f, -0.003258f, 0.007742f, -0.013355f, -0.025220f, -0.042740f, -0.004109f, -0.027864f, -0.023341f, -0.016062f, -0.024219f, -0.017940f, -0.001674f, 0.037778f, -0.002067f, -0.030539f, -0.003405f, 0.007293f, 0.027799f, -0.010165f, -0.008442f, -0.018731f, 0.011842f, -0.053992f, -0.048841f, -0.024010f, -0.025173f, -0.026555f, -0.017027f, 0.015678f, -0.023136f, -0.030770f, -0.026843f, -0.045425f, 0.020602f, 0.011063f, -0.041660f, 0.019159f, 0.037273f, 0.077045f, 0.040312f, -0.001223f, 0.011354f, -0.045283f, -0.021343f, 0.024337f, 0.017619f, -0.009874f, -0.059538f, -0.003455f, 0.090311f, -0.004796f, 0.001187f, + 0.025002f, -0.035960f, 0.020819f, 0.063278f, 0.062342f, -0.063418f, -0.056769f, -0.002385f, -0.061782f, -0.026475f, 0.001611f, 0.004867f, 0.024838f, 0.032376f, 0.032405f, 0.051854f, 0.014427f, 0.018815f, 0.023211f, -0.011868f, -0.002398f, 0.003208f, 0.008625f, 0.013306f, -0.027792f, 0.062595f, 0.029421f, 0.027671f, -0.004384f, 0.063512f, 0.009509f, 0.037074f, 0.017820f, 0.009509f, -0.014464f, -0.013229f, 0.035011f, 0.009903f, 0.016841f, -0.038875f, -0.018048f, -0.033034f, -0.016401f, -0.024953f, 0.000860f, -0.046533f, -0.046024f, -0.006100f, -0.017200f, -0.091949f, -0.065070f, -0.063108f, 0.017838f, 0.061106f, 0.084383f, -0.049630f, 0.058408f, 0.086181f, 0.016070f, 0.004172f, -0.004902f, 0.058363f, 0.005587f, 0.052649f, 0.025035f, 0.023282f, -0.035831f, -0.125321f, -0.095382f, -0.022925f, 0.000818f, -0.009060f, 0.047172f, -0.012264f, -0.078827f, -0.009574f, 0.131240f, 0.021092f, -0.021982f, 0.030715f, -0.008538f, 0.019033f, -0.008255f, -0.016690f, -0.040473f, -0.018751f, -0.002661f, -0.009948f, -0.018438f, 0.027613f, -0.025722f, -0.032604f, -0.000240f, 0.001680f, 0.028771f, 0.009025f, + 0.009114f, 0.008324f, -0.009417f, -0.003052f, 0.041913f, -0.023996f, -0.046616f, -0.013099f, 0.005640f, -0.019807f, 0.034936f, -0.021225f, -0.010047f, 0.024537f, 0.009150f, 0.017493f, -0.048595f, -0.059979f, 0.019644f, -0.014931f, -0.018105f, -0.028241f, -0.028736f, -0.066059f, 0.000905f, -0.009985f, 0.021201f, -0.044228f, -0.081816f, 0.056697f, 0.017321f, 0.052773f, 0.006648f, -0.024131f, -0.017438f, 0.009369f, -0.031202f, 0.042003f, 0.009088f, 0.051237f, 0.039444f, 0.078729f, -0.009714f, -0.089728f, -0.065794f, -0.044567f, 0.044518f, 0.038387f, -0.040615f, 0.027346f, 0.066652f, -0.054229f, -0.069192f, 0.071668f, 0.094546f, 0.017762f, 0.003143f, 0.022322f, -0.015840f, 0.042790f, 0.022107f, 0.044638f, -0.010129f, -0.045149f, 0.101118f, 0.001503f, -0.039830f, 0.005613f, 0.067908f, 0.032549f, 0.012211f, -0.043088f, 0.003369f, -0.022742f, -0.018564f, 0.007576f, -0.034070f, 0.003422f, 0.007346f, 0.039984f, -0.057352f, -0.008949f, -0.008165f, 0.033765f, -0.014118f, -0.020190f, -0.021131f, 0.000139f, 0.019718f, -0.043126f, 0.001691f, 0.011736f, -0.090407f, 0.012476f, -0.025570f, -0.062535f, + 0.039763f, -0.046252f, -0.082691f, 0.107302f, -0.002241f, 0.006133f, -0.009833f, -0.030011f, 0.063433f, -0.046064f, -0.005558f, 0.009287f, -0.030727f, -0.002880f, 0.080775f, 0.041737f, -0.073092f, -0.078802f, 0.076323f, -0.037604f, 0.044422f, 0.072973f, -0.066497f, -0.115399f, -0.078724f, 0.130536f, -0.006763f, -0.105047f, 0.096733f, -0.070919f, -0.127174f, -0.004464f, 0.118176f, -0.005997f, -0.041959f, 0.066174f, -0.010263f, 0.017219f, 0.048660f, 0.027998f, 0.037791f, 0.078502f, 0.039545f, -0.024459f, 0.016852f, 0.016162f, 0.030758f, -0.034178f, 0.083280f, 0.070835f, 0.014245f, 0.021695f, -0.014568f, -0.004396f, -0.077328f, 0.032908f, -0.039006f, 0.024489f, 0.000559f, -0.034290f, 0.047881f, -0.022011f, -0.028889f, 0.013061f, -0.042377f, 0.026176f, 0.005346f, -0.013463f, 0.016893f, 0.014523f, 0.032933f, 0.024711f, 0.032272f, 0.079332f, -0.003949f, 0.004283f, 0.031020f, 0.051740f, -0.001040f, 0.010039f, 0.004881f, 0.039230f, 0.057455f, -0.022355f, 0.017676f, -0.007637f, -0.003366f, -0.101559f, 0.013174f, 0.035484f, -0.017221f, -0.029162f, 0.027435f, -0.045839f, -0.053055f, -0.000609f, + 0.040950f, 0.064934f, -0.083451f, 0.028601f, 0.004062f, -0.009163f, 0.010415f, 0.028696f, 0.088364f, -0.006272f, -0.040961f, 0.009476f, 0.082511f, 0.043709f, -0.082588f, -0.064483f, -0.001023f, -0.099438f, -0.033986f, -0.036781f, 0.076729f, -0.002182f, -0.028148f, 0.035304f, -0.017864f, 0.019645f, 0.005215f, -0.037786f, 0.045547f, -0.102251f, -0.009493f, 0.006488f, -0.025379f, 0.019213f, 0.004825f, -0.019615f, -0.003389f, 0.003457f, 0.026082f, 0.002067f, -0.029769f, -0.098835f, -0.072230f, -0.054573f, -0.027188f, 0.062390f, -0.012197f, 0.003173f, -0.099264f, 0.008418f, -0.006638f, -0.012415f, 0.003441f, -0.095065f, 0.051852f, -0.045402f, 0.024025f, -0.017648f, 0.065864f, -0.034146f, -0.063170f, -0.028704f, -0.000226f, 0.049589f, 0.087016f, 0.093350f, -0.112045f, -0.080620f, -0.057020f, 0.041611f, 0.092723f, 0.114984f, -0.019072f, -0.024384f, -0.097909f, -0.032282f, 0.088103f, 0.058375f, -0.000428f, 0.005734f, -0.001330f, -0.076299f, 0.056557f, -0.008331f, 0.054868f, 0.140614f, -0.143753f, 0.190334f, 0.050899f, -0.075074f, -0.082661f, 0.068289f, -0.040802f, 0.041790f, 0.022746f, 0.026186f, + 0.016092f, -0.053592f, 0.058485f, -0.009135f, -0.020265f, -0.019544f, -0.022522f, 0.017287f, -0.011597f, 0.024813f, 0.015533f, -0.003786f, -0.005579f, -0.044877f, 0.026315f, 0.010077f, -0.010898f, 0.009460f, 0.023948f, -0.007093f, 0.013823f, -0.022972f, 0.027198f, -0.010318f, 0.003964f, 0.010477f, 0.011888f, -0.012216f, 0.041659f, -0.001925f, -0.038065f, -0.002862f, 0.018392f, 0.008520f, -0.028976f, 0.014127f, 0.034991f, -0.006677f, -0.016133f, -0.016492f, -0.001677f, 0.009350f, -0.003588f, 0.040341f, -0.026608f, -0.010427f, -0.009085f, -0.020257f, -0.001159f, -0.006068f, 0.015363f, 0.010942f, -0.016184f, -0.002177f, 0.016029f, -0.015850f, -0.007964f, -0.004199f, 0.025350f, -0.014516f, 0.010953f, 0.018096f, -0.038698f, -0.013744f, 0.012078f, -0.037625f, 0.060247f, 0.020885f, 0.016866f, 0.036962f, 0.096638f, 0.011813f, -0.031785f, -0.025923f, -0.018180f, -0.002496f, -0.002323f, 0.001454f, -0.001830f, -0.004345f, -0.053445f, 0.000559f, -0.009976f, -0.013135f, 0.007734f, -0.021896f, -0.008794f, 0.009299f, -0.013957f, 0.003663f, 0.017757f, -0.023309f, 0.015292f, -0.008961f, -0.011103f, -0.002452f, + -0.011077f, 0.005139f, -0.010180f, -0.006471f, -0.012149f, -0.003060f, 0.000900f, -0.000776f, -0.006806f, -0.008700f, 0.003664f, 0.003884f, -0.008287f, 0.012412f, -0.014570f, -0.001821f, -0.005025f, -0.002423f, -0.001643f, -0.012948f, 0.018575f, 0.010166f, -0.015830f, 0.020612f, -0.000656f, 0.004108f, -0.007948f, 0.019778f, -0.018529f, 0.001157f, 0.003396f, 0.004972f, -0.001584f, -0.005560f, 0.016857f, -0.010315f, 0.004155f, 0.000459f, -0.001034f, 0.004473f, -0.004392f, -0.001231f, 0.010689f, -0.004520f, -0.001367f, 0.009277f, -0.001023f, -0.004236f, -0.005869f, 0.004923f, 0.007758f, -0.045827f, -0.077343f, 0.086222f, 0.285392f, 0.030188f, 0.064712f, -0.154827f, -0.239430f, -0.058877f, -0.125595f, 0.098007f, 0.198594f, 0.106239f, 0.065446f, -0.013945f, -0.078607f, -0.075215f, -0.058469f, -0.052254f, 0.017857f, 0.035019f, 0.018528f, 0.037609f, 0.003669f, 0.003863f, 0.013278f, 0.005072f, 0.015217f, 0.014008f, -0.011012f, -0.035594f, -0.028253f, -0.031278f, -0.044707f, -0.022064f, 0.023172f, 0.032454f, 0.057337f, 0.083715f, 0.028672f, 0.012826f, -0.028920f, -0.064874f, -0.064999f, -0.043596f, + -0.032276f, 0.007098f, 0.022971f, 0.035933f, 0.035973f, 0.032373f, 0.019737f, 0.003199f, -0.004149f, -0.020189f, -0.016146f, -0.008557f, -0.012239f, -0.003450f, -0.013686f, -0.002819f, -0.015982f, -0.013147f, 0.002951f, -0.000637f, 0.015883f, 0.030215f, 0.015271f, 0.044657f, 0.036812f, -0.018836f, -0.042019f, -0.038992f, -0.061679f, -0.016379f, -0.018355f, -0.002061f, 0.024334f, 0.014219f, -0.002443f}, + {-0.011410f, 0.002836f, -0.005198f, -0.013234f, -0.005139f, 0.001220f, -0.002470f, 0.004244f, -0.006121f, -0.002410f, -0.004682f, -0.002198f, 0.003061f, -0.000499f, -0.000176f, -0.002573f, 0.004262f, -0.011088f, 0.001088f, -0.005728f, 0.004086f, 0.002807f, -0.006690f, 0.001250f, -0.000797f, 0.001739f, -0.002481f, 0.001969f, -0.007326f, -0.004640f, 0.009461f, -0.002665f, -0.003522f, -0.004215f, -0.001219f, -0.002663f, -0.000954f, -0.006695f, -0.000766f, 0.008605f, -0.001840f, 0.001609f, -0.000177f, -0.002548f, 0.012004f, -0.002376f, 0.006888f, 0.008395f, -0.000545f, -0.003055f, -0.001989f, -0.007188f, -0.006751f, -0.007445f, -0.008745f, -0.004623f, -0.006066f, 0.001659f, -0.005844f, -0.001691f, -0.003423f, -0.000503f, 0.001529f, -0.006961f, 0.007090f, 0.001512f, 0.003093f, 0.006223f, -0.005627f, 0.003355f, 0.006514f, -0.006482f, 0.001371f, 0.005155f, 0.002321f, 0.002730f, -0.011219f, 0.007371f, 0.012148f, 0.003115f, 0.010731f, 0.000122f, -0.010956f, -0.007658f, -0.007966f, -0.001316f, -0.005455f, 0.012841f, -0.009605f, -0.002528f, -0.004335f, -0.001621f, -0.007696f, 0.007366f, -0.004520f, -0.003659f, + 0.006309f, 0.010300f, 0.011798f, 0.001720f, -0.000798f, 0.002350f, 0.000666f, 0.001560f, -0.005276f, -0.005829f, 0.002842f, -0.005300f, -0.005158f, -0.007082f, -0.007285f, 0.002113f, -0.004812f, 0.006355f, -0.008047f, -0.001234f, 0.003606f, 0.003252f, 0.003030f, -0.012691f, -0.002214f, -0.007115f, -0.001173f, -0.003088f, -0.007613f, -0.000336f, 0.009167f, 0.002589f, 0.004470f, 0.003996f, 0.004970f, 0.000411f, 0.006224f, 0.003662f, 0.006941f, -0.004165f, 0.004640f, -0.002544f, 0.003211f, 0.000067f, -0.006361f, 0.007134f, 0.008452f, -0.004886f, -0.005657f, 0.002082f, 0.007752f, 0.001383f, 0.002059f, -0.003145f, -0.000527f, 0.003531f, 0.002658f, -0.000297f, -0.018833f, -0.005020f, -0.008461f, 0.006196f, -0.017649f, 0.003826f, -0.007744f, -0.004178f, 0.002576f, 0.000296f, 0.002046f, 0.002594f, 0.002064f, 0.007632f, -0.003347f, 0.000751f, -0.000705f, -0.009404f, 0.006967f, 0.011465f, -0.009296f, -0.008850f, 0.006766f, 0.001669f, 0.008337f, 0.002566f, 0.011174f, -0.001589f, 0.003826f, -0.005920f, -0.001695f, 0.011257f, 0.001000f, -0.007424f, -0.008999f, -0.009877f, 0.000520f, 0.008092f, + 0.004242f, -0.000101f, 0.009377f, 0.007336f, 0.000409f, -0.007623f, 0.011971f, 0.002976f, 0.009266f, 0.009239f, -0.001489f, 0.005868f, 0.007136f, -0.000898f, 0.004282f, 0.004742f, -0.004451f, 0.000899f, -0.001264f, 0.004501f, -0.010237f, -0.006719f, 0.003541f, -0.006501f, -0.002296f, 0.008866f, -0.003416f, 0.004843f, -0.001889f, -0.014074f, 0.002572f, -0.000133f, 0.007572f, -0.011603f, -0.006003f, 0.005161f, 0.001495f, 0.012011f, 0.012422f, 0.005653f, 0.009162f, 0.007387f, 0.012452f, 0.014466f, -0.005433f, -0.001385f, 0.004719f, -0.014148f, -0.000575f, -0.004552f, -0.002820f, 0.006722f, -0.008414f, -0.000796f, 0.010506f, 0.002142f, 0.006712f, -0.003164f, -0.002521f, -0.003365f, -0.013516f, -0.001997f, 0.000858f, 0.007331f, -0.002215f, 0.012469f, 0.004780f, -0.001882f, 0.004856f, 0.002781f, 0.006260f, -0.004298f, -0.000977f, 0.014560f, -0.001933f, 0.013781f, 0.006327f, -0.005643f, 0.001412f, 0.012192f, 0.006195f, -0.007537f, 0.010854f, -0.002652f, 0.000751f, 0.000902f, -0.002162f, 0.002436f, 0.001242f, -0.009433f, 0.006304f, 0.004967f, -0.000785f, 0.000773f, -0.002114f, -0.008416f, + 0.000101f, 0.005452f, -0.000903f, -0.000536f, -0.005828f, -0.012474f, -0.004308f, 0.005454f, 0.011145f, -0.015935f, -0.008586f, 0.003874f, -0.006886f, 0.005162f, 0.000187f, 0.001065f, -0.009115f, 0.017633f, 0.018578f, -0.003646f, -0.007894f, -0.008459f, 0.017814f, -0.015437f, 0.000353f, -0.002449f, -0.007306f, -0.009743f, 0.003428f, -0.002617f, -0.013449f, -0.016203f, 0.000558f, -0.001142f, -0.008567f, 0.003162f, 0.004460f, -0.005908f, -0.009074f, -0.008341f, 0.011849f, -0.012765f, -0.001594f, -0.014933f, 0.000137f, 0.008424f, 0.002814f, 0.001496f, -0.008444f, -0.008035f, 0.007343f, -0.005632f, -0.008617f, 0.001116f, -0.003139f, 0.005304f, 0.000105f, 0.002158f, -0.008570f, -0.003152f, -0.002403f, 0.008242f, 0.005672f, 0.005718f, -0.016946f, 0.002661f, 0.004784f, 0.003832f, 0.004850f, -0.004914f, -0.003015f, 0.000509f, 0.003540f, 0.006585f, -0.001046f, 0.004262f, -0.004772f, 0.012886f, -0.023618f, 0.008067f, 0.000883f, -0.013030f, -0.000297f, 0.013516f, -0.003937f, -0.007177f, -0.012393f, -0.005114f, 0.001441f, -0.004648f, 0.000552f, 0.004121f, 0.008046f, -0.008393f, -0.026261f, 0.004737f, + -0.011933f, 0.002568f, 0.002277f, -0.001586f, 0.018764f, 0.000974f, -0.011872f, 0.015905f, 0.007779f, 0.005425f, -0.002309f, 0.003253f, -0.004766f, 0.012461f, -0.001978f, 0.001372f, 0.018957f, 0.018349f, 0.007986f, 0.008375f, 0.008223f, 0.009109f, 0.006240f, -0.018236f, -0.005549f, -0.000306f, -0.004642f, -0.015531f, -0.001558f, -0.003724f, -0.003932f, -0.008369f, 0.000007f, -0.002496f, 0.013496f, -0.004330f, 0.023540f, -0.000199f, 0.002176f, -0.004385f, -0.003157f, 0.000117f, -0.000431f, -0.001931f, -0.003821f, -0.002799f, -0.011157f, 0.002722f, 0.002185f, -0.001431f, -0.005575f, 0.007925f, 0.006294f, 0.006861f, -0.002013f, -0.005075f, 0.000603f, 0.005974f, 0.007062f, -0.005318f, -0.014348f, -0.007685f, 0.002303f, 0.012419f, -0.000915f, 0.010162f, -0.007124f, -0.011749f, 0.009979f, -0.004059f, -0.008071f, 0.005754f, 0.008171f, -0.010351f, -0.006742f, 0.009833f, -0.011632f, -0.012388f, 0.005856f, -0.003450f, -0.001235f, -0.006447f, -0.003956f, 0.006555f, 0.008931f, 0.004884f, -0.002267f, 0.001515f, -0.001253f, -0.001971f, -0.008841f, 0.003043f, -0.023543f, -0.006658f, -0.007632f, 0.006572f, + 0.007817f, 0.000792f, 0.003770f, -0.014430f, 0.003751f, 0.002360f, 0.003720f, -0.013002f, 0.024527f, -0.001002f, 0.004341f, 0.003367f, -0.011992f, 0.001964f, -0.017091f, 0.010901f, -0.003897f, -0.013939f, 0.002496f, 0.001195f, -0.007413f, 0.000889f, 0.001150f, 0.011231f, 0.019568f, 0.008785f, -0.004492f, 0.006612f, 0.007728f, -0.018448f, -0.007355f, -0.008359f, 0.004613f, 0.004433f, -0.003703f, 0.003142f, 0.005809f, 0.004347f, 0.007611f, 0.015842f, -0.000445f, -0.005507f, -0.002500f, -0.000313f, 0.011232f, -0.008374f, -0.001109f, 0.006199f, 0.015167f, 0.000796f, -0.012596f, -0.009647f, -0.002952f, -0.011247f, -0.004245f, -0.024214f, -0.006637f, -0.008945f, 0.010367f, 0.000394f, -0.004976f, -0.031066f, -0.004077f, -0.004096f, 0.012948f, 0.030908f, -0.008807f, 0.020816f, 0.003646f, -0.018087f, -0.018513f, 0.003396f, 0.004852f, -0.010407f, 0.011809f, -0.008161f, 0.009560f, -0.011355f, 0.005783f, 0.004267f, -0.010833f, -0.008978f, -0.006873f, 0.003992f, 0.012279f, -0.015359f, 0.000823f, -0.016135f, -0.000670f, -0.005856f, 0.004299f, 0.012535f, 0.001554f, -0.004715f, -0.004319f, 0.013610f, + 0.000277f, 0.020503f, 0.006447f, -0.006866f, -0.006876f, -0.005074f, 0.003213f, 0.013240f, 0.000119f, 0.021515f, -0.036482f, -0.026322f, -0.021598f, -0.004147f, -0.018347f, 0.002245f, -0.006626f, 0.007795f, 0.017201f, 0.004232f, 0.007401f, 0.012089f, 0.018214f, 0.010614f, 0.003215f, -0.010544f, -0.030004f, -0.030243f, 0.017804f, 0.003424f, 0.022480f, -0.012852f, -0.010640f, 0.013257f, -0.021957f, 0.006444f, 0.015572f, 0.005431f, -0.010695f, -0.001276f, 0.028786f, 0.022639f, -0.001235f, -0.021361f, -0.033475f, -0.004893f, -0.011141f, 0.011343f, -0.009375f, -0.011126f, -0.038040f, -0.017699f, -0.033976f, 0.011907f, -0.000209f, -0.009490f, 0.010233f, -0.002208f, 0.001141f, 0.001539f, -0.010280f, -0.000004f, -0.011949f, -0.003284f, 0.008743f, 0.004818f, -0.012213f, 0.003724f, 0.014320f, 0.020806f, -0.002389f, -0.004070f, -0.006350f, 0.000217f, 0.012232f, 0.015053f, -0.001409f, 0.001340f, -0.002574f, -0.003832f, 0.020049f, 0.012890f, 0.001441f, 0.013319f, 0.005037f, -0.018702f, 0.004188f, -0.002861f, 0.023651f, 0.007813f, 0.003703f, 0.009889f, 0.015606f, 0.002939f, -0.012232f, -0.023450f, + -0.004393f, 0.003470f, 0.012673f, 0.004897f, 0.001406f, 0.003423f, 0.018273f, 0.002603f, 0.006240f, 0.006796f, 0.005098f, -0.012792f, -0.012745f, -0.012686f, -0.013002f, -0.013220f, 0.018296f, 0.048887f, 0.010617f, -0.015004f, 0.008623f, -0.008731f, -0.029061f, -0.005835f, -0.028528f, -0.015548f, 0.014543f, 0.019588f, 0.007401f, 0.004035f, 0.001472f, 0.003620f, 0.018372f, -0.013198f, 0.026059f, -0.017006f, -0.017538f, 0.020962f, 0.009058f, -0.033876f, 0.014530f, 0.008619f, 0.010435f, 0.022286f, 0.010687f, 0.016558f, -0.001473f, 0.008953f, -0.005670f, 0.014105f, 0.003328f, 0.002963f, 0.009038f, -0.019168f, -0.010757f, -0.005956f, 0.011758f, 0.005199f, 0.003889f, 0.009583f, 0.002305f, 0.003286f, -0.017806f, -0.000015f, 0.018078f, -0.003570f, 0.001679f, 0.002108f, 0.001751f, 0.022041f, 0.007908f, 0.029708f, 0.006196f, -0.004658f, 0.027771f, -0.025004f, -0.004031f, -0.004387f, -0.010701f, -0.002822f, 0.005023f, 0.027629f, 0.001680f, -0.006805f, -0.012128f, 0.004896f, -0.012807f, -0.006121f, -0.008827f, -0.016995f, -0.004074f, 0.002094f, 0.022161f, -0.005419f, -0.018631f, -0.026030f, + -0.010836f, -0.025609f, 0.018102f, -0.021690f, -0.017801f, -0.012330f, 0.011056f, 0.031597f, -0.032015f, -0.009906f, -0.035948f, 0.011089f, 0.003818f, 0.004374f, -0.011080f, 0.003833f, 0.038231f, -0.019442f, -0.004513f, 0.016006f, 0.009096f, 0.008921f, 0.012750f, 0.010356f, -0.014002f, -0.020674f, -0.005166f, -0.010917f, -0.017578f, -0.018966f, -0.000781f, -0.003491f, 0.003850f, 0.027198f, 0.015311f, -0.013327f, -0.009022f, -0.000351f, -0.008692f, 0.007665f, 0.048199f, -0.015422f, 0.033245f, 0.012163f, 0.004565f, -0.000846f, -0.006836f, 0.007282f, -0.020198f, 0.010558f, 0.025487f, 0.002699f, 0.002916f, 0.023088f, 0.012506f, 0.010013f, -0.019572f, 0.016934f, -0.012343f, -0.014206f, -0.045256f, -0.011677f, 0.026573f, -0.013895f, 0.005438f, -0.028264f, 0.019863f, -0.008843f, -0.014473f, 0.022302f, -0.033405f, -0.018899f, 0.031096f, -0.019803f, -0.028913f, 0.002868f, -0.019362f, -0.015057f, -0.001647f, 0.022052f, -0.010270f, 0.039033f, 0.037050f, 0.006820f, 0.012101f, -0.021718f, 0.002985f, -0.017672f, 0.027896f, -0.005943f, 0.008462f, -0.013598f, -0.008171f, 0.004240f, 0.004062f, -0.013097f, + 0.021464f, -0.006446f, 0.004829f, 0.007394f, -0.013480f, 0.004740f, -0.017292f, -0.000433f, 0.010410f, 0.011505f, 0.000659f, 0.015365f, 0.020458f, -0.002055f, -0.037185f, -0.006894f, -0.010703f, 0.026327f, -0.022269f, -0.028813f, -0.019662f, -0.014083f, 0.004413f, -0.016616f, -0.012027f, -0.008689f, -0.001740f, 0.004296f, -0.054480f, 0.034123f, 0.027803f, 0.038982f, -0.011864f, 0.005669f, 0.027408f, -0.026124f, -0.022623f, 0.003937f, 0.018405f, 0.010682f, -0.001812f, 0.004625f, -0.012566f, -0.017310f, -0.019599f, -0.006919f, 0.075161f, 0.005253f, -0.038347f, -0.007788f, -0.019402f, 0.013713f, 0.014751f, -0.024829f, -0.011374f, -0.020141f, -0.041213f, 0.004154f, -0.034500f, 0.016863f, 0.004820f, -0.026234f, 0.014770f, 0.018704f, 0.024090f, 0.008215f, 0.009246f, -0.027100f, -0.001013f, -0.004428f, 0.025913f, 0.013506f, 0.000812f, 0.025923f, 0.027112f, -0.001918f, -0.013380f, 0.004579f, 0.033603f, -0.020500f, -0.017589f, 0.018999f, 0.009415f, -0.020741f, -0.005022f, -0.018996f, 0.038671f, -0.031203f, 0.009217f, 0.022443f, -0.012340f, 0.020864f, 0.006970f, -0.007382f, -0.009810f, -0.008008f, + -0.015469f, 0.023887f, 0.029510f, 0.008170f, -0.021967f, 0.004785f, -0.024232f, -0.006832f, 0.016633f, -0.000337f, -0.011643f, -0.006148f, 0.004842f, -0.029836f, 0.001803f, -0.000229f, -0.018038f, 0.029099f, -0.024242f, 0.001962f, -0.004651f, -0.014754f, 0.021158f, 0.002715f, 0.013007f, -0.004821f, -0.000163f, 0.004079f, -0.009865f, 0.015097f, -0.008460f, 0.004737f, -0.007578f, 0.037755f, 0.016989f, 0.037780f, -0.001041f, -0.024651f, -0.014000f, 0.018233f, 0.023376f, 0.029933f, -0.001466f, -0.004259f, 0.036398f, 0.019141f, 0.040702f, 0.007452f, 0.001113f, -0.018663f, -0.011157f, -0.010215f, 0.008910f, 0.008360f, 0.020721f, -0.024713f, -0.000883f, -0.013895f, 0.011606f, -0.021196f, 0.006047f, 0.027718f, -0.006694f, 0.001192f, -0.016309f, 0.005586f, -0.016446f, -0.044270f, 0.003370f, -0.005216f, 0.000181f, -0.018776f, -0.007627f, 0.019857f, 0.031714f, -0.001825f, -0.015892f, 0.022057f, 0.006237f, 0.006676f, 0.020617f, 0.010052f, -0.016297f, -0.004475f, 0.011919f, -0.000522f, 0.010456f, -0.015318f, -0.018866f, 0.006736f, -0.018099f, -0.025636f, -0.016638f, -0.029472f, -0.011191f, 0.011698f, + -0.028761f, -0.002286f, -0.032620f, -0.011116f, -0.005289f, 0.011841f, -0.038663f, 0.015162f, -0.003519f, -0.019452f, 0.018064f, -0.009092f, -0.001108f, 0.042491f, 0.040320f, 0.000126f, 0.059660f, 0.068336f, 0.003718f, 0.021945f, 0.021135f, -0.002775f, -0.048929f, -0.001144f, -0.001695f, -0.018435f, 0.014192f, 0.013123f, -0.026384f, 0.014901f, 0.019157f, 0.003474f, -0.006653f, 0.010616f, -0.006315f, 0.035299f, -0.005408f, -0.015738f, 0.000840f, 0.008522f, -0.002615f, -0.001617f, 0.000086f, -0.054737f, 0.016780f, -0.000446f, -0.037518f, -0.015002f, 0.007492f, -0.002631f, -0.025209f, 0.010133f, -0.029867f, -0.001639f, 0.004044f, -0.048232f, -0.007788f, 0.022584f, -0.014768f, 0.003769f, 0.032378f, 0.020713f, 0.025093f, 0.009148f, -0.012180f, -0.021250f, 0.025077f, -0.010247f, 0.014674f, -0.019762f, -0.010063f, 0.018164f, 0.028128f, 0.006533f, 0.033438f, -0.018544f, 0.029145f, -0.020214f, -0.026694f, -0.016574f, 0.029020f, 0.032864f, -0.025275f, 0.018396f, -0.072394f, -0.001329f, 0.022476f, 0.013409f, -0.011452f, -0.020756f, 0.011782f, -0.052118f, 0.002104f, 0.068703f, -0.047062f, -0.002370f, + -0.005800f, 0.005427f, -0.019762f, 0.010406f, -0.030393f, -0.027317f, -0.011524f, -0.006104f, 0.005159f, -0.005477f, 0.013305f, -0.020014f, -0.001182f, 0.044849f, -0.037138f, -0.029227f, -0.009452f, 0.039480f, 0.003341f, -0.045232f, 0.018134f, -0.015607f, -0.022066f, 0.006555f, 0.062819f, -0.034542f, -0.022227f, 0.047973f, 0.032214f, 0.004864f, -0.020980f, 0.003170f, -0.009005f, -0.012719f, 0.011276f, 0.013972f, -0.009753f, -0.035394f, 0.045948f, 0.024448f, 0.007170f, -0.048839f, -0.009654f, 0.017834f, 0.015743f, -0.004246f, 0.024911f, -0.002189f, 0.007298f, -0.009473f, -0.032383f, 0.022215f, -0.023562f, 0.015454f, 0.005150f, -0.024385f, 0.049119f, 0.010387f, 0.035033f, 0.039364f, 0.005188f, -0.052080f, -0.011730f, 0.003804f, -0.022789f, -0.007407f, 0.001528f, 0.002503f, 0.023945f, 0.050060f, -0.011878f, 0.020125f, 0.003594f, -0.019907f, -0.095315f, 0.005584f, -0.024315f, 0.002585f, 0.048847f, 0.003865f, -0.008528f, 0.008031f, 0.002607f, -0.033359f, -0.034460f, -0.032456f, -0.029698f, 0.038884f, -0.007188f, 0.046552f, 0.004945f, -0.045421f, -0.000825f, 0.004185f, 0.039019f, 0.006794f, + -0.005446f, -0.008353f, 0.011671f, -0.024803f, -0.008483f, 0.041588f, -0.007900f, -0.055717f, -0.041263f, 0.024352f, -0.004735f, -0.012166f, 0.013356f, -0.004680f, -0.027607f, 0.007809f, 0.017345f, 0.037393f, -0.006977f, -0.032360f, 0.001129f, -0.040616f, 0.016042f, 0.044483f, -0.006557f, -0.056131f, 0.018119f, -0.001299f, 0.003765f, 0.012725f, -0.016842f, 0.033514f, 0.003158f, -0.023600f, 0.018465f, -0.012998f, -0.007191f, 0.048289f, -0.024529f, -0.008786f, -0.007839f, 0.030428f, 0.012579f, -0.054093f, 0.027403f, -0.043411f, -0.010648f, -0.023067f, 0.004775f, -0.013321f, -0.015164f, -0.001962f, -0.047895f, 0.010622f, 0.076509f, 0.051510f, 0.022171f, -0.037335f, 0.027927f, 0.037554f, 0.053044f, 0.027206f, 0.005569f, 0.003140f, 0.032991f, 0.059539f, -0.013877f, -0.005780f, 0.032306f, -0.063866f, 0.023084f, 0.059622f, -0.012688f, -0.018687f, 0.014526f, 0.046719f, 0.035851f, -0.022747f, -0.042197f, -0.000803f, 0.020500f, -0.005353f, 0.004621f, 0.002451f, 0.048503f, -0.026071f, 0.030973f, 0.049225f, -0.019239f, -0.003716f, 0.033127f, -0.002917f, 0.116869f, -0.046925f, 0.020911f, 0.082415f, + -0.046274f, 0.017498f, 0.005294f, -0.062496f, -0.002032f, 0.014726f, -0.028611f, 0.066273f, 0.004914f, -0.005877f, 0.005116f, -0.023440f, 0.087380f, 0.027185f, -0.069523f, 0.070712f, -0.027768f, 0.006000f, 0.021167f, 0.028725f, 0.045304f, 0.025707f, -0.011412f, -0.039548f, -0.057977f, -0.017730f, -0.022732f, 0.000445f, -0.017246f, 0.041414f, -0.022002f, -0.035045f, 0.003038f, 0.019960f, -0.090892f, 0.053299f, 0.001608f, 0.032557f, 0.051533f, -0.085562f, 0.019012f, 0.045337f, 0.009351f, 0.034066f, -0.033983f, 0.037431f, 0.009969f, -0.032957f, -0.000162f, -0.020413f, -0.063916f, 0.035683f, 0.019093f, 0.058834f, -0.032603f, -0.041390f, -0.015389f, 0.014590f, -0.009356f, -0.070699f, -0.035922f, 0.023119f, -0.005839f, 0.011824f, -0.030732f, -0.008268f, 0.023455f, -0.019078f, -0.010470f, -0.029449f, -0.007498f, 0.012372f, -0.034210f, 0.004833f, -0.074336f, -0.059695f, 0.018699f, -0.062100f, 0.005441f, -0.064978f, -0.046532f, -0.030561f, 0.031320f, 0.063497f, 0.076481f, -0.016438f, 0.034221f, 0.043072f, 0.020490f, 0.019763f, -0.028969f, 0.086901f, 0.087421f, -0.056697f, 0.060099f, -0.043935f, + 0.031086f, 0.063569f, 0.059647f, 0.073607f, 0.086461f, 0.063237f, -0.064128f, -0.043326f, 0.003236f, 0.007079f, 0.030248f, -0.008587f, -0.006501f, 0.112402f, -0.082580f, -0.040716f, 0.042953f, -0.025425f, 0.040916f, -0.032063f, -0.037692f, 0.012953f, -0.087567f, -0.003353f, 0.056727f, -0.013524f, 0.028437f, -0.049092f, -0.013649f, -0.019193f, 0.000405f, 0.062210f, 0.017074f, 0.013987f, -0.012793f, 0.034147f, 0.009095f, 0.084689f, 0.018872f, 0.049411f, 0.001471f, -0.038670f, -0.038681f, 0.049104f, -0.026216f, 0.022565f, -0.002882f, -0.063810f, 0.043266f, -0.056966f, 0.107246f, -0.082397f, 0.047183f, 0.044247f, -0.050060f, -0.040183f, -0.032405f, 0.039860f, -0.006493f, 0.041639f, -0.004147f, 0.004576f, -0.079022f, -0.041491f, 0.013372f, -0.038185f, 0.007816f, -0.023921f, 0.017327f, 0.010979f, 0.052598f, -0.036064f, -0.017393f, -0.016605f, -0.034390f, 0.076052f, 0.007795f, 0.004849f, -0.080334f, -0.026487f, 0.030868f, 0.019839f, 0.015448f, 0.063947f, 0.032240f, 0.055360f, 0.055574f, -0.007740f, 0.012476f, -0.036591f, -0.166691f, 0.115353f, -0.070910f, -0.052426f, 0.002889f, 0.022311f, + 0.031843f, 0.003707f, -0.025324f, 0.089292f, 0.047815f, 0.010898f, -0.043956f, 0.028001f, 0.000084f, 0.032034f, -0.041895f, -0.032075f, 0.024946f, 0.066031f, -0.076414f, 0.001069f, 0.026979f, 0.006098f, -0.017519f, -0.013834f, -0.008116f, 0.000758f, -0.002220f, 0.015155f, 0.087616f, 0.002949f, -0.036978f, 0.055030f, -0.011621f, -0.058629f, -0.070094f, 0.065609f, 0.024385f, -0.012637f, 0.027560f, 0.012578f, 0.059140f, -0.080879f, -0.006038f, -0.043028f, -0.008935f, 0.040395f, -0.030281f, 0.013144f, -0.035167f, 0.013792f, 0.120904f, 0.004291f, -0.065009f, -0.081017f, -0.001822f, 0.030837f, 0.038585f, -0.036274f, 0.010608f, 0.051291f, -0.020700f, -0.118343f, 0.067305f, -0.045980f, -0.059351f, 0.019478f, 0.110147f, -0.082406f, 0.058166f, 0.063072f, 0.030934f, -0.076171f, -0.046771f, -0.047381f, 0.096248f, 0.032183f, 0.006001f, -0.006722f, 0.014896f, 0.027540f, -0.009104f, 0.013019f, -0.015092f, 0.000181f, -0.012040f, 0.045691f, -0.051424f, -0.005433f, 0.029943f, -0.070472f, 0.022373f, -0.017004f, 0.004793f, -0.008035f, -0.020357f, 0.012883f, -0.006040f, -0.028591f, 0.076932f, -0.058950f, + -0.017247f, 0.055238f, -0.035893f, -0.005205f, -0.011755f, 0.012293f, 0.053811f, 0.004413f, -0.053772f, 0.072984f, -0.040000f, 0.026111f, 0.044706f, 0.020380f, -0.017624f, 0.004183f, -0.040681f, 0.009944f, -0.024906f, -0.018883f, 0.096845f, -0.022481f, -0.039546f, 0.012901f, -0.018811f, 0.023378f, -0.015790f, 0.025678f, 0.062152f, -0.034218f, 0.020217f, 0.048285f, -0.056852f, 0.026240f, 0.030254f, 0.014555f, 0.038084f, -0.043081f, -0.011672f, 0.067914f, -0.046193f, -0.009039f, 0.019549f, -0.017159f, 0.064871f, -0.061222f, 0.012537f, 0.026512f, -0.026153f, 0.028312f, 0.029236f, -0.055963f, -0.146988f, -0.233978f, 0.019890f, 0.217574f, 0.015785f, 0.496275f, 0.514011f, 0.251228f, 0.536995f, 0.353663f, -0.081260f, -0.016898f, -0.126831f, -0.445525f, -0.390856f, -0.247899f, -0.454819f, -0.361117f, -0.112902f, -0.232672f, -0.195739f, 0.048522f, 0.094593f, -0.070602f, 0.012299f, 0.078350f, -0.093143f, -0.064961f, 0.117933f, 0.099501f, -0.007382f, 0.112063f, 0.209750f, 0.051451f, 0.143311f, 0.290382f, 0.125756f, 0.050233f, 0.256073f, 0.205881f, -0.000137f, 0.136118f, 0.300213f, 0.028241f, + 0.041500f, 0.229490f, 0.076167f, -0.073335f, 0.147522f, 0.132933f, -0.064179f, 0.107978f, 0.154323f, -0.059059f, -0.206610f, -0.130658f, -0.415042f, -0.650556f, -0.586962f, -0.626592f, -0.920571f, -0.840057f, -0.793531f, -0.953692f, -0.932347f, -0.788355f, -0.725052f, -0.670735f, -0.441453f, -0.251573f, -0.026505f, 0.085715f, 0.285422f, 0.490972f, 0.529982f, 0.599605f, 0.668773f, 0.271967f, 0.035929f} + }, + { + {-0.011317f, -0.017401f, 0.000332f, -0.009642f, -0.002163f, -0.006676f, 0.005464f, -0.010363f, 0.000486f, 0.004088f, -0.003496f, 0.003227f, -0.000834f, -0.000927f, 0.001407f, 0.001514f, 0.003165f, -0.004906f, -0.001127f, -0.003285f, -0.008545f, -0.000007f, 0.002575f, 0.000724f, -0.003623f, 0.006529f, 0.002367f, -0.002051f, 0.002302f, 0.000581f, -0.003699f, 0.002175f, -0.001226f, -0.004121f, -0.004597f, -0.002120f, -0.000886f, -0.002132f, 0.004308f, 0.008110f, -0.000711f, 0.012223f, 0.001974f, -0.009185f, 0.003344f, -0.001523f, -0.007051f, 0.000901f, -0.006702f, 0.007586f, 0.001688f, -0.005886f, 0.002949f, -0.003403f, 0.002508f, 0.003872f, 0.001858f, 0.001773f, -0.001337f, 0.003451f, -0.005592f, 0.003023f, -0.002431f, -0.002308f, -0.001535f, -0.002742f, -0.009905f, -0.001802f, 0.005436f, -0.003327f, 0.003885f, 0.001912f, -0.002711f, 0.000981f, -0.000008f, 0.003109f, 0.011948f, -0.005897f, 0.003257f, -0.001145f, 0.000633f, 0.000671f, -0.004906f, -0.005397f, 0.003565f, -0.000880f, -0.004459f, -0.005515f, -0.003509f, 0.005132f, -0.000537f, 0.006848f, 0.001396f, -0.008311f, -0.008763f, -0.006036f, + 0.002565f, 0.002366f, 0.004560f, -0.000465f, 0.005225f, -0.003747f, -0.000700f, -0.008933f, -0.001367f, -0.001452f, 0.001947f, 0.003728f, 0.003527f, 0.007072f, -0.003302f, -0.004225f, 0.003749f, 0.002403f, -0.004332f, -0.004158f, 0.000314f, 0.003532f, 0.001624f, 0.007929f, -0.002739f, -0.001953f, 0.008666f, 0.003069f, 0.016139f, 0.007291f, -0.004327f, 0.000378f, -0.009668f, 0.000757f, -0.011029f, -0.000120f, -0.003990f, 0.008425f, 0.001043f, 0.004896f, 0.005923f, 0.003879f, 0.005711f, 0.004515f, 0.001063f, -0.008415f, -0.000730f, -0.003586f, 0.006834f, 0.010780f, -0.006270f, -0.003175f, -0.002456f, -0.001885f, -0.004610f, -0.018668f, -0.020385f, -0.001405f, -0.006001f, 0.000969f, -0.004598f, -0.001003f, 0.011001f, -0.001827f, 0.005805f, -0.002600f, -0.005632f, -0.007292f, 0.001129f, -0.001382f, -0.009153f, 0.010422f, 0.002834f, 0.000851f, 0.005219f, 0.005360f, 0.008207f, 0.006095f, -0.000826f, -0.006179f, 0.005614f, 0.001484f, -0.008765f, -0.003649f, -0.004106f, -0.002450f, 0.007312f, -0.002516f, -0.013235f, -0.004313f, -0.001768f, 0.002768f, -0.004317f, -0.008377f, -0.000019f, -0.000784f, + 0.009493f, 0.001476f, -0.000378f, 0.003587f, -0.000526f, 0.013205f, -0.002583f, 0.001194f, -0.003225f, -0.005282f, -0.000301f, 0.005613f, 0.002258f, 0.001465f, 0.005055f, -0.005027f, -0.008500f, -0.005999f, -0.001482f, 0.000910f, -0.002209f, 0.000028f, -0.006443f, -0.001612f, 0.002942f, -0.002267f, 0.006146f, 0.002978f, -0.000619f, 0.000732f, -0.006260f, -0.005707f, 0.009714f, 0.001476f, 0.003896f, 0.001506f, 0.002459f, 0.013392f, -0.001109f, 0.007019f, 0.003523f, 0.009231f, 0.010509f, -0.002204f, 0.000438f, 0.007010f, 0.006175f, 0.004703f, 0.012019f, 0.002771f, -0.004629f, 0.000754f, 0.010404f, 0.004047f, 0.004593f, 0.009674f, 0.012174f, 0.008582f, -0.003538f, -0.008636f, 0.005500f, 0.004305f, -0.005761f, -0.008382f, -0.000266f, -0.004885f, 0.001498f, 0.003272f, -0.003876f, -0.004214f, 0.003433f, 0.003346f, 0.006697f, -0.005093f, -0.011185f, -0.005232f, -0.005384f, -0.006958f, -0.003348f, -0.007961f, 0.003689f, -0.010882f, 0.003559f, 0.000736f, 0.001384f, -0.004981f, 0.009105f, 0.007577f, -0.008445f, 0.008733f, 0.002134f, -0.001641f, 0.001654f, -0.006873f, -0.003463f, 0.005774f, + 0.000741f, 0.002153f, 0.000085f, 0.006882f, 0.001363f, 0.008569f, -0.006188f, -0.001129f, -0.002440f, 0.002886f, 0.003259f, -0.002815f, 0.001286f, -0.005574f, -0.000123f, 0.002303f, -0.000324f, 0.035227f, 0.001158f, 0.031099f, 0.003435f, 0.019390f, -0.003476f, -0.004324f, 0.006416f, -0.015940f, 0.017394f, -0.010219f, 0.011965f, 0.007342f, -0.005147f, 0.003999f, 0.000460f, -0.000205f, -0.001882f, 0.003780f, 0.007442f, 0.007282f, 0.014264f, 0.002447f, 0.005189f, -0.001322f, 0.016627f, -0.018814f, 0.001387f, -0.002172f, 0.005280f, 0.006857f, -0.008514f, 0.002843f, 0.005251f, 0.001422f, 0.007256f, 0.002621f, -0.006325f, 0.002716f, 0.015036f, -0.003395f, 0.005304f, -0.003128f, -0.001166f, -0.001423f, -0.009052f, 0.014799f, 0.000799f, 0.000776f, 0.012677f, -0.002362f, 0.001963f, 0.013701f, -0.020077f, 0.005098f, 0.000697f, 0.005634f, 0.018231f, 0.004430f, 0.005266f, 0.005272f, -0.000711f, -0.005426f, -0.002076f, 0.003574f, 0.002747f, 0.008617f, -0.002123f, 0.007027f, 0.004741f, -0.003044f, 0.002771f, -0.006418f, -0.002741f, 0.000572f, -0.014220f, -0.017933f, -0.006838f, -0.002882f, + -0.006451f, 0.013956f, 0.006239f, -0.011561f, 0.012792f, -0.002017f, -0.009046f, 0.002491f, 0.005649f, -0.005395f, -0.008271f, -0.007858f, -0.015863f, -0.008364f, 0.007034f, -0.010440f, -0.016127f, 0.004271f, 0.006682f, 0.000987f, -0.005877f, 0.011842f, 0.001596f, 0.010912f, -0.000624f, -0.002947f, 0.006502f, 0.010297f, -0.015104f, -0.007608f, 0.004188f, -0.003796f, 0.003761f, -0.010329f, -0.000689f, 0.002251f, 0.003617f, -0.008905f, -0.015393f, -0.004792f, 0.004497f, -0.003078f, -0.001952f, 0.000449f, 0.004958f, -0.002027f, 0.002730f, -0.005712f, 0.008887f, -0.012267f, -0.008833f, -0.003625f, -0.008669f, -0.003154f, -0.002415f, 0.002825f, -0.006414f, 0.004143f, 0.009573f, -0.001483f, 0.002132f, 0.001949f, 0.004489f, 0.008785f, -0.003785f, -0.002532f, -0.001988f, -0.004661f, 0.009685f, -0.004735f, -0.017262f, -0.011544f, -0.006817f, -0.004526f, -0.015164f, -0.036633f, -0.002928f, 0.002141f, 0.000861f, -0.012101f, -0.004709f, -0.013667f, -0.002922f, -0.016041f, -0.017481f, -0.014372f, -0.002707f, -0.009600f, -0.019726f, -0.012960f, 0.004807f, 0.006049f, -0.004986f, 0.012002f, 0.007407f, -0.004715f, + 0.015737f, 0.003051f, 0.001939f, 0.002267f, -0.019905f, -0.000893f, 0.004175f, 0.007651f, -0.005717f, -0.005837f, 0.013078f, 0.023833f, -0.017069f, 0.006383f, -0.004419f, -0.000955f, -0.014893f, -0.001397f, 0.000718f, -0.008026f, -0.009273f, -0.007371f, -0.007721f, -0.004560f, 0.006145f, 0.017637f, -0.007183f, 0.006692f, 0.012911f, 0.010871f, -0.002542f, 0.001375f, -0.002725f, -0.003221f, -0.015028f, -0.007796f, 0.010363f, -0.005592f, 0.003221f, -0.005297f, 0.005893f, 0.002761f, -0.000478f, -0.000274f, -0.006209f, -0.005853f, 0.002787f, -0.001834f, 0.004697f, -0.018680f, -0.018933f, -0.001602f, -0.021734f, -0.005198f, -0.026320f, -0.006834f, -0.018407f, -0.003040f, 0.004426f, 0.004152f, 0.021663f, -0.013734f, 0.005490f, 0.004911f, -0.010472f, -0.005812f, 0.017618f, 0.001084f, -0.004042f, 0.001423f, -0.012948f, 0.011861f, -0.016825f, -0.006507f, 0.008775f, 0.004263f, -0.000950f, 0.002387f, -0.002596f, 0.005174f, -0.006644f, -0.013904f, 0.001823f, 0.005837f, 0.006189f, -0.011214f, 0.003881f, 0.011384f, -0.011349f, -0.016126f, 0.013363f, -0.011156f, 0.009060f, -0.008161f, 0.005483f, -0.000812f, + -0.010087f, -0.014861f, -0.007886f, 0.003463f, 0.000402f, 0.004941f, -0.006534f, -0.007736f, -0.017379f, 0.009194f, -0.012177f, -0.006364f, 0.008132f, 0.015984f, -0.001135f, -0.003652f, -0.023063f, -0.019160f, -0.005351f, -0.006914f, 0.009982f, -0.002653f, -0.013164f, -0.002258f, 0.001620f, -0.007710f, -0.001112f, -0.016521f, 0.011916f, 0.004928f, 0.014640f, 0.018296f, 0.013872f, 0.006477f, 0.039301f, 0.018227f, 0.025603f, -0.008367f, -0.000534f, -0.001032f, -0.037896f, 0.001368f, 0.016919f, -0.008261f, -0.002607f, 0.000614f, 0.024489f, -0.004825f, 0.014305f, -0.003629f, 0.013687f, 0.006566f, 0.016810f, 0.022434f, 0.003228f, 0.014670f, -0.004601f, 0.012547f, -0.001639f, 0.023964f, 0.013401f, -0.001385f, 0.014293f, 0.010433f, -0.004094f, 0.009875f, 0.006644f, 0.008344f, -0.007409f, -0.007106f, -0.020105f, -0.002405f, 0.014252f, 0.001524f, 0.001774f, -0.005954f, -0.007596f, -0.007333f, -0.006734f, 0.033652f, -0.022660f, 0.007488f, 0.010490f, 0.004524f, 0.002846f, -0.015036f, -0.018096f, -0.006245f, -0.002899f, -0.002590f, -0.031248f, -0.017236f, -0.016206f, -0.001220f, -0.001018f, 0.007095f, + -0.001304f, 0.005903f, 0.010715f, 0.017365f, 0.003423f, -0.007852f, 0.006564f, -0.015580f, 0.003549f, -0.012747f, 0.004090f, 0.003293f, 0.058310f, 0.007608f, 0.007700f, 0.007951f, -0.004862f, -0.022848f, 0.015154f, 0.018492f, -0.010742f, 0.008857f, 0.006653f, -0.013106f, -0.003087f, 0.015549f, 0.007097f, -0.024065f, 0.005468f, -0.005453f, -0.014041f, 0.001253f, 0.006519f, 0.003616f, -0.001185f, 0.001145f, 0.010094f, -0.001786f, 0.005320f, -0.018223f, 0.007122f, -0.000325f, 0.007004f, 0.006255f, -0.004431f, 0.015972f, -0.020125f, -0.006521f, -0.019855f, 0.018481f, 0.007164f, 0.029013f, 0.012741f, 0.001825f, 0.005183f, -0.020064f, -0.000804f, 0.008399f, 0.006436f, 0.008704f, 0.000923f, 0.005912f, -0.006333f, 0.008333f, 0.019026f, 0.028340f, 0.010936f, -0.009830f, -0.006967f, -0.000555f, -0.005517f, 0.011941f, 0.012992f, -0.007013f, 0.007633f, 0.016870f, 0.004351f, -0.018021f, -0.040022f, -0.017515f, 0.008021f, 0.019667f, -0.007434f, 0.007388f, -0.001318f, -0.001610f, 0.000124f, 0.020129f, 0.003329f, -0.034709f, 0.009168f, 0.019117f, -0.021333f, 0.014425f, 0.019509f, -0.050163f, + 0.009408f, 0.004026f, 0.009581f, -0.017576f, 0.027522f, -0.039195f, -0.002206f, -0.001121f, -0.005216f, -0.002386f, -0.013811f, -0.013677f, -0.004432f, 0.016527f, -0.000399f, 0.002245f, -0.009747f, 0.012188f, -0.003559f, -0.003212f, 0.005836f, 0.019998f, -0.014015f, 0.014952f, -0.004392f, 0.009825f, 0.001941f, 0.014180f, 0.016769f, -0.002445f, 0.002853f, -0.022479f, -0.014364f, -0.003101f, -0.011423f, -0.020274f, 0.000166f, -0.006123f, -0.016737f, 0.023335f, -0.022338f, -0.004661f, -0.011830f, -0.008788f, 0.012119f, -0.014510f, 0.006729f, -0.003718f, 0.012350f, -0.005809f, 0.013670f, -0.019543f, -0.009021f, 0.004951f, 0.016869f, -0.032813f, -0.016377f, 0.003517f, -0.003405f, -0.003976f, 0.010271f, -0.015879f, -0.039607f, 0.010037f, -0.035747f, 0.018207f, -0.016409f, 0.002594f, -0.039278f, -0.009309f, -0.027504f, -0.011052f, 0.033405f, 0.001932f, -0.028595f, 0.026851f, -0.012950f, 0.002213f, -0.029839f, 0.004934f, 0.010929f, -0.025346f, -0.006973f, -0.022622f, -0.000870f, 0.001858f, -0.008500f, -0.006017f, 0.021717f, 0.003823f, -0.016032f, 0.004171f, -0.033469f, 0.019952f, 0.030224f, -0.009728f, + 0.012075f, 0.022378f, -0.002600f, -0.004195f, 0.001717f, 0.002983f, 0.011879f, 0.002503f, 0.001893f, 0.007078f, -0.019392f, -0.001023f, -0.022178f, -0.021140f, -0.010060f, 0.009298f, 0.011389f, -0.000378f, -0.026642f, 0.005272f, 0.005125f, 0.012724f, 0.025397f, -0.027338f, 0.038808f, -0.033233f, -0.000303f, -0.006402f, -0.007724f, -0.015842f, -0.033194f, -0.041597f, -0.018496f, -0.004327f, 0.008337f, -0.002636f, -0.000826f, 0.006829f, -0.003111f, 0.030369f, 0.010925f, -0.029428f, -0.008143f, 0.000575f, 0.015592f, -0.019399f, -0.002826f, -0.040028f, 0.003327f, 0.036745f, -0.032872f, -0.018212f, -0.034308f, 0.041176f, 0.018834f, -0.021480f, 0.028169f, 0.026439f, 0.039668f, -0.015189f, -0.012524f, 0.027436f, -0.003292f, -0.006489f, 0.010748f, 0.011702f, 0.005907f, 0.005130f, -0.037711f, -0.004995f, 0.001005f, -0.000578f, 0.003026f, -0.005269f, 0.017267f, 0.030830f, 0.004122f, 0.001254f, 0.000374f, 0.000596f, 0.030159f, 0.006839f, -0.001129f, -0.007320f, 0.008428f, 0.005526f, -0.003633f, 0.002407f, -0.015718f, -0.004441f, 0.026406f, -0.026198f, -0.011266f, -0.022735f, 0.029426f, -0.027018f, + 0.014088f, -0.011655f, 0.009422f, -0.006665f, 0.007834f, -0.021934f, 0.005919f, 0.030543f, -0.019612f, 0.000608f, -0.053897f, -0.003509f, -0.018201f, 0.000418f, -0.050099f, -0.003367f, -0.001112f, -0.016977f, -0.009526f, 0.040858f, -0.043404f, 0.006366f, -0.010344f, -0.017990f, 0.014209f, -0.016448f, -0.032747f, -0.025912f, 0.006487f, 0.000642f, 0.011663f, -0.018456f, -0.009482f, 0.034017f, 0.013711f, -0.005867f, 0.008975f, -0.018835f, -0.017217f, -0.016392f, 0.035808f, -0.031792f, -0.036664f, 0.017245f, -0.033954f, 0.012177f, 0.003009f, 0.008723f, -0.014190f, -0.004758f, -0.017579f, -0.009092f, -0.013106f, 0.006339f, 0.019554f, 0.011370f, -0.026736f, 0.032578f, 0.006080f, 0.010907f, 0.005158f, 0.015349f, -0.001261f, 0.014751f, 0.006067f, -0.007540f, 0.012224f, 0.002976f, 0.015526f, 0.008404f, -0.019206f, 0.008198f, -0.003700f, 0.005628f, -0.001632f, -0.008597f, -0.003803f, -0.015729f, 0.017323f, 0.014848f, 0.019179f, -0.003352f, 0.032576f, 0.034537f, 0.017533f, 0.004279f, 0.019612f, 0.035898f, 0.021854f, 0.039230f, 0.029600f, 0.029247f, -0.027027f, -0.031886f, 0.011360f, -0.006478f, + -0.003286f, 0.002529f, -0.010196f, 0.013356f, 0.016140f, 0.006450f, 0.036913f, -0.006699f, -0.011754f, -0.015778f, -0.005728f, 0.004126f, 0.002888f, -0.064068f, -0.012170f, 0.029347f, 0.018846f, -0.062109f, -0.046989f, -0.013716f, -0.001171f, 0.021461f, -0.009166f, -0.000683f, -0.050501f, 0.007902f, -0.026662f, 0.019555f, -0.004084f, 0.025660f, -0.021658f, -0.004377f, -0.025587f, 0.005316f, 0.020208f, -0.008868f, 0.005684f, -0.013432f, 0.000802f, -0.032734f, -0.009605f, -0.000576f, 0.002224f, 0.026112f, 0.032415f, 0.002238f, -0.030022f, -0.019915f, -0.009728f, 0.004225f, -0.007911f, 0.010699f, -0.034318f, -0.009468f, -0.004599f, -0.007699f, -0.019126f, -0.003281f, -0.008643f, 0.024673f, 0.034306f, 0.024204f, 0.008805f, 0.015307f, 0.014768f, -0.015051f, 0.057385f, 0.035748f, -0.043979f, -0.037350f, 0.042595f, -0.031420f, -0.017855f, 0.007794f, 0.005868f, -0.030461f, 0.032311f, 0.003363f, -0.094355f, 0.027060f, 0.062367f, -0.040438f, 0.044021f, 0.056871f, -0.015536f, -0.004569f, 0.033434f, -0.033610f, -0.018152f, 0.012631f, -0.011875f, -0.020898f, -0.018247f, -0.013787f, 0.021907f, 0.011287f, + 0.014775f, -0.004809f, -0.018998f, -0.017663f, 0.020198f, -0.016746f, -0.000303f, 0.004062f, -0.027497f, 0.016941f, 0.016186f, -0.013254f, -0.008393f, -0.024032f, 0.001510f, -0.015578f, 0.020133f, -0.033137f, 0.003198f, 0.010119f, -0.000900f, -0.016824f, -0.031731f, -0.009284f, -0.013451f, -0.005192f, -0.024494f, 0.032155f, -0.032879f, 0.003712f, -0.011651f, 0.006410f, -0.046907f, 0.046556f, 0.009678f, 0.002560f, -0.019195f, 0.008747f, 0.008230f, -0.000313f, 0.004655f, -0.011234f, -0.037223f, -0.009063f, -0.016100f, -0.026626f, -0.032101f, -0.014323f, -0.008165f, -0.034710f, -0.012361f, -0.004385f, 0.021812f, 0.007186f, -0.029206f, -0.028296f, 0.015134f, -0.009760f, -0.037185f, -0.019017f, 0.008378f, 0.026931f, 0.029245f, 0.027233f, 0.047803f, -0.012551f, -0.034002f, -0.034509f, -0.003108f, 0.019036f, 0.036778f, 0.016469f, 0.007564f, 0.021090f, 0.062801f, -0.055498f, 0.000052f, -0.023003f, -0.026916f, -0.018563f, 0.029711f, -0.016751f, -0.014900f, 0.012967f, 0.037853f, 0.021360f, -0.025263f, 0.016187f, -0.026559f, 0.019626f, 0.003071f, -0.004432f, -0.011804f, -0.022388f, -0.015099f, 0.002445f, + 0.005929f, -0.034630f, 0.023354f, 0.002451f, -0.000900f, -0.013746f, -0.012057f, 0.022837f, -0.030327f, -0.002464f, 0.037666f, 0.040758f, -0.035022f, -0.003327f, -0.005073f, -0.024955f, -0.028878f, 0.033475f, 0.010215f, 0.021070f, -0.004235f, 0.002042f, -0.000445f, 0.021093f, -0.005885f, 0.000678f, -0.024228f, 0.038025f, 0.034683f, -0.047237f, -0.054658f, -0.012430f, 0.003362f, -0.019064f, 0.004619f, -0.014132f, 0.007095f, -0.029103f, 0.033543f, -0.037302f, -0.030065f, -0.011996f, 0.008064f, 0.026184f, -0.010898f, 0.037961f, 0.006414f, -0.012548f, -0.010512f, -0.008645f, -0.021598f, 0.024577f, 0.018448f, -0.080431f, 0.120360f, -0.081888f, -0.023957f, 0.024701f, 0.063924f, 0.056397f, -0.022267f, -0.019030f, 0.001159f, 0.005653f, 0.031863f, 0.015215f, -0.047583f, 0.016223f, -0.012100f, -0.013227f, 0.002142f, 0.021225f, -0.002542f, -0.031181f, -0.032183f, 0.018614f, 0.010679f, 0.023787f, -0.013712f, 0.028814f, 0.003831f, 0.033342f, -0.005363f, -0.007443f, 0.020346f, 0.000261f, -0.026251f, 0.007232f, 0.025833f, 0.001883f, -0.034066f, 0.018990f, 0.035084f, -0.031088f, 0.011438f, -0.033575f, + 0.012499f, -0.043222f, -0.032449f, 0.054599f, 0.045736f, 0.025880f, 0.060193f, -0.008446f, 0.072265f, 0.031187f, 0.026648f, 0.043548f, -0.069240f, 0.060461f, 0.017402f, 0.026773f, 0.024215f, 0.010184f, -0.034810f, 0.009368f, 0.060682f, 0.075488f, -0.002875f, -0.076618f, 0.037637f, 0.006456f, 0.014717f, 0.001499f, -0.000438f, -0.013365f, -0.063580f, 0.016304f, -0.013435f, 0.017338f, 0.082793f, -0.004583f, -0.094963f, -0.050398f, -0.055237f, -0.023296f, 0.002128f, 0.030286f, -0.080686f, -0.020015f, 0.014593f, -0.039951f, -0.042539f, -0.041820f, -0.042458f, -0.008693f, 0.050360f, 0.023420f, -0.017634f, 0.021804f, 0.011271f, -0.023913f, 0.026810f, -0.029790f, -0.004551f, 0.010129f, 0.018323f, -0.057600f, 0.029820f, -0.029182f, 0.017735f, -0.012674f, -0.043245f, 0.010805f, 0.015682f, 0.005247f, 0.009107f, -0.020395f, -0.062095f, 0.000840f, 0.014894f, 0.012129f, 0.002354f, 0.006162f, -0.024782f, -0.002141f, -0.000558f, 0.056093f, -0.007228f, -0.097177f, -0.041380f, -0.012264f, -0.077510f, 0.016085f, -0.022553f, -0.022179f, -0.036552f, -0.019088f, -0.055421f, -0.057892f, -0.067008f, -0.008870f, + 0.073614f, 0.007858f, -0.044253f, 0.018997f, 0.001950f, -0.007020f, -0.024470f, -0.037873f, 0.016247f, 0.028323f, 0.023630f, 0.011854f, -0.012435f, -0.055987f, -0.036274f, -0.031796f, 0.051815f, -0.004520f, 0.041239f, 0.057250f, -0.048455f, -0.056727f, -0.063366f, 0.018278f, 0.020101f, -0.082570f, -0.050436f, 0.003915f, 0.000971f, 0.027821f, -0.099942f, 0.012933f, 0.021403f, 0.070823f, -0.080261f, 0.011940f, 0.011646f, -0.007140f, 0.042264f, -0.022254f, 0.075047f, -0.001272f, 0.005522f, 0.026051f, 0.028454f, -0.025654f, -0.062759f, 0.039218f, 0.042374f, 0.013498f, 0.053933f, 0.014308f, -0.008088f, -0.016784f, -0.047638f, 0.076053f, -0.033312f, 0.072491f, 0.025916f, -0.000636f, 0.019148f, -0.024221f, 0.035861f, 0.041439f, -0.026564f, 0.032380f, 0.012766f, -0.066045f, 0.051063f, 0.059051f, -0.007869f, -0.030154f, 0.005697f, 0.005084f, 0.001032f, -0.005469f, 0.097202f, 0.006256f, -0.058756f, -0.023159f, 0.009474f, -0.072682f, -0.110124f, 0.025986f, 0.133034f, 0.042781f, -0.012323f, -0.071158f, -0.025439f, 0.004671f, 0.087390f, -0.036896f, -0.049341f, -0.077336f, -0.133592f, 0.037829f, + 0.066493f, -0.088235f, -0.006262f, 0.047258f, -0.019464f, -0.040559f, 0.036360f, -0.039235f, -0.019233f, 0.001290f, -0.027015f, 0.044173f, -0.014154f, -0.022590f, -0.006770f, 0.022483f, 0.084015f, -0.014666f, -0.037079f, -0.044422f, 0.016375f, 0.037765f, 0.024619f, -0.039551f, -0.005081f, 0.043158f, 0.001982f, -0.036101f, 0.011989f, -0.032469f, 0.077189f, -0.036691f, -0.082560f, 0.026590f, -0.013621f, 0.037512f, -0.055393f, -0.056850f, 0.055025f, -0.006588f, -0.071235f, -0.040028f, -0.068218f, 0.085874f, 0.042105f, 0.021543f, -0.093332f, 0.014284f, 0.037558f, -0.067270f, 0.002871f, -0.048923f, -0.036652f, 0.034201f, -0.033013f, 0.039625f, -0.027863f, -0.058519f, -0.014976f, -0.015865f, -0.011040f, 0.017762f, 0.003544f, -0.036724f, 0.105816f, -0.014545f, 0.043848f, 0.049434f, 0.024313f, -0.014494f, 0.003620f, -0.022839f, 0.050535f, 0.020907f, -0.035417f, 0.027128f, 0.095581f, 0.022347f, 0.040120f, -0.001335f, 0.007974f, 0.017766f, -0.037850f, 0.017940f, 0.031892f, 0.002603f, -0.043205f, -0.019631f, -0.032635f, -0.010172f, -0.043290f, -0.037340f, 0.002698f, -0.029302f, 0.044084f, 0.017284f, + -0.013054f, -0.031280f, -0.018352f, -0.008764f, 0.022713f, -0.005432f, -0.041047f, -0.029763f, 0.005866f, 0.010600f, 0.019990f, 0.010700f, -0.010815f, 0.012582f, -0.036080f, -0.100772f, 0.002048f, 0.127220f, -0.005928f, -0.088655f, -0.017034f, 0.061685f, 0.014298f, 0.011882f, -0.003958f, -0.037327f, -0.051471f, -0.027307f, 0.008905f, -0.000951f, -0.047803f, 0.018826f, -0.093824f, -0.014406f, 0.082400f, 0.026838f, 0.106641f, -0.012531f, -0.045431f, -0.011291f, -0.012060f, 0.030749f, 0.003822f, 0.000560f, -0.062079f, -0.028776f, -0.031189f, -0.003209f, 0.066055f, -0.008951f, -0.020156f, 0.022282f, 0.024085f, 0.002681f, -0.041889f, -0.062416f, -0.043366f, -0.145318f, -0.223694f, 0.050192f, 0.197002f, 0.059398f, 0.483982f, 0.454441f, 0.199635f, 0.467556f, 0.194209f, -0.092799f, -0.008361f, -0.150540f, -0.397597f, -0.222026f, -0.213329f, -0.409797f, -0.301284f, -0.178841f, -0.263420f, -0.182328f, 0.023429f, -0.029313f, -0.095220f, 0.079247f, 0.072854f, -0.017924f, 0.077746f, 0.240175f, 0.089485f, 0.028132f, 0.227136f, 0.199656f, 0.051785f, 0.240331f, 0.298969f, -0.026627f, 0.165041f, 0.298155f, + 0.094739f, 0.100118f, 0.301494f, 0.166043f, -0.059982f, 0.224374f, 0.145853f, -0.108818f, 0.062567f, 0.165410f, -0.135105f, -0.208379f, -0.083323f, -0.394651f, -0.631882f, -0.615483f, -0.680990f, -1.058735f, -0.927114f, -0.778052f, -0.993223f, -0.864091f, -0.584479f, -0.682647f, -0.545290f, -0.215034f, -0.134996f, 0.096901f, 0.257068f, 0.486545f, 0.679280f, 0.742615f, 0.872327f, 0.945296f, 0.845111f, 0.760948f, 0.746588f, 0.319287f, -0.024459f, -0.004229f}, + {-0.010706f, -0.017167f, -0.001287f, -0.017525f, -0.009700f, -0.003350f, -0.003022f, -0.000475f, -0.004166f, -0.000782f, 0.003795f, -0.004550f, 0.005319f, 0.000654f, -0.007138f, 0.004469f, -0.001227f, 0.004777f, 0.000710f, -0.006772f, 0.004794f, 0.002655f, 0.003770f, -0.002894f, -0.004321f, -0.003106f, -0.003593f, 0.002845f, -0.000589f, 0.000792f, -0.003918f, 0.002820f, -0.004754f, -0.006515f, 0.000356f, -0.008098f, -0.006024f, -0.003101f, 0.008709f, 0.001080f, 0.003363f, -0.010534f, 0.001550f, 0.001805f, -0.009058f, 0.003266f, 0.000719f, -0.009460f, -0.001724f, -0.000697f, -0.007337f, 0.008416f, -0.005262f, -0.003027f, 0.004961f, -0.000349f, -0.008892f, -0.000889f, -0.006146f, 0.006933f, 0.006046f, -0.008478f, -0.004422f, -0.005665f, -0.003831f, -0.002393f, 0.003671f, 0.003218f, 0.002109f, 0.005822f, -0.000052f, 0.002312f, -0.000854f, -0.002310f, -0.003048f, -0.001391f, 0.021128f, -0.010667f, 0.001167f, -0.006518f, -0.000132f, 0.008401f, 0.004501f, 0.005122f, -0.004478f, 0.006430f, -0.006734f, 0.007261f, 0.004146f, 0.008826f, 0.004209f, -0.002172f, -0.010124f, 0.010790f, 0.008028f, 0.002412f, + 0.001610f, 0.000602f, -0.004147f, -0.005523f, 0.006077f, 0.003097f, 0.004060f, 0.005103f, -0.005394f, -0.000910f, 0.005483f, 0.005704f, -0.000556f, -0.005113f, -0.008536f, -0.000473f, 0.001877f, -0.005823f, 0.002215f, 0.000886f, -0.007692f, -0.004817f, -0.000390f, 0.003472f, 0.000295f, -0.004417f, 0.007585f, 0.000806f, -0.002311f, -0.006056f, -0.001039f, 0.000049f, -0.010165f, 0.004157f, 0.006633f, -0.004222f, 0.008438f, 0.006147f, -0.000942f, 0.004958f, 0.003440f, 0.010304f, 0.003563f, 0.001361f, -0.001621f, 0.003423f, -0.008770f, 0.000403f, 0.004268f, -0.005137f, 0.004834f, 0.005049f, 0.006321f, 0.003124f, 0.008084f, -0.019988f, -0.013512f, -0.002243f, -0.008605f, -0.007880f, 0.004007f, -0.011513f, -0.010558f, 0.002824f, -0.004641f, -0.004694f, 0.004765f, -0.003843f, -0.007411f, -0.001140f, -0.000326f, -0.002476f, -0.003257f, -0.002384f, -0.008547f, -0.000867f, -0.006098f, -0.004911f, -0.000000f, 0.007535f, -0.001509f, 0.011030f, -0.005673f, 0.006488f, 0.008074f, -0.009153f, 0.003297f, -0.002584f, 0.001930f, -0.006595f, 0.003308f, 0.003665f, 0.006265f, -0.003484f, -0.007183f, -0.002960f, + -0.003850f, 0.001971f, 0.003070f, -0.009373f, -0.000933f, -0.006577f, -0.004758f, 0.001249f, -0.007162f, -0.012212f, -0.002028f, 0.011082f, 0.002724f, 0.003554f, 0.000791f, 0.002144f, 0.001732f, 0.003713f, 0.004707f, 0.012384f, 0.001101f, -0.006365f, -0.007318f, -0.002253f, -0.003440f, -0.001671f, -0.014952f, 0.002329f, -0.001008f, 0.003913f, -0.001974f, 0.000312f, -0.003581f, -0.002991f, 0.014692f, 0.001263f, 0.001069f, 0.016026f, 0.018484f, 0.014221f, 0.010567f, 0.014953f, 0.006078f, 0.006505f, -0.001343f, 0.004260f, 0.015755f, 0.001696f, 0.004827f, -0.005826f, -0.003863f, 0.012079f, -0.008050f, -0.014721f, 0.004506f, -0.012291f, 0.010683f, 0.002543f, 0.012816f, -0.004025f, -0.000743f, -0.003104f, 0.004259f, 0.005157f, -0.000108f, -0.012502f, -0.002511f, 0.010811f, -0.007072f, 0.004910f, 0.002941f, -0.002360f, -0.002991f, 0.012022f, 0.009125f, 0.020925f, 0.008468f, 0.001814f, 0.005128f, -0.001674f, 0.001415f, 0.006663f, 0.004078f, 0.017873f, -0.007432f, -0.004959f, 0.001435f, 0.004697f, -0.002581f, 0.008368f, -0.007475f, 0.001744f, -0.000240f, -0.005767f, 0.002143f, 0.001958f, + -0.007691f, -0.010672f, -0.006341f, 0.008818f, 0.004606f, 0.000281f, -0.000193f, 0.006775f, 0.001083f, 0.002486f, 0.011965f, 0.005962f, -0.001822f, -0.001276f, 0.011113f, -0.007984f, 0.002730f, 0.035045f, -0.000858f, 0.017280f, -0.003342f, -0.002450f, 0.018035f, -0.017697f, -0.006470f, -0.001194f, 0.008760f, 0.006472f, -0.004121f, 0.003672f, 0.001396f, -0.016041f, 0.003796f, 0.008849f, 0.007389f, -0.018017f, -0.006722f, 0.002206f, -0.013377f, -0.003440f, 0.000644f, 0.000725f, 0.001408f, -0.001875f, 0.007927f, -0.005753f, 0.006212f, 0.013742f, 0.013210f, -0.003854f, -0.008232f, -0.001302f, 0.014903f, -0.000794f, -0.001279f, 0.000189f, 0.001037f, -0.007905f, 0.000873f, 0.006509f, 0.000458f, 0.001575f, 0.005651f, -0.004061f, 0.003610f, 0.002437f, -0.002260f, 0.010793f, 0.000464f, 0.008568f, 0.001072f, -0.002897f, 0.003094f, 0.005691f, 0.004267f, -0.000312f, -0.009143f, -0.007766f, -0.010898f, -0.004642f, -0.001135f, -0.000146f, -0.002002f, 0.007349f, 0.005642f, -0.005185f, -0.010851f, -0.000049f, 0.004247f, 0.005703f, -0.007027f, -0.001917f, -0.009359f, -0.025942f, -0.006797f, -0.008762f, + 0.001654f, 0.004366f, -0.004443f, -0.005152f, -0.048997f, 0.001038f, 0.015723f, -0.011368f, -0.018339f, 0.013797f, -0.020744f, -0.003061f, -0.009274f, -0.010822f, -0.006763f, -0.006757f, 0.000761f, 0.008426f, -0.001491f, 0.004751f, -0.005255f, 0.006394f, -0.004754f, -0.007299f, 0.003338f, -0.002650f, -0.011629f, -0.014821f, 0.007251f, 0.000861f, 0.007178f, 0.002318f, 0.015934f, 0.002395f, 0.005636f, -0.007421f, -0.012975f, -0.003641f, -0.006330f, 0.013320f, -0.005910f, 0.000529f, 0.003663f, -0.006332f, 0.018652f, 0.012370f, 0.000570f, -0.014437f, -0.018231f, -0.006099f, 0.006557f, -0.016547f, -0.000006f, -0.007940f, -0.015489f, 0.001693f, -0.024463f, -0.005311f, -0.002096f, -0.009076f, 0.017414f, -0.000828f, -0.001945f, -0.000068f, 0.011309f, 0.013623f, 0.004940f, -0.013240f, -0.003287f, -0.003210f, 0.008508f, 0.003578f, 0.005555f, 0.011089f, -0.028725f, -0.040615f, 0.004323f, -0.008762f, 0.008465f, -0.010891f, -0.021252f, 0.001180f, 0.018124f, 0.004529f, 0.010839f, 0.009918f, 0.006430f, 0.005271f, -0.007338f, 0.005741f, 0.011810f, -0.018937f, -0.009912f, -0.005829f, -0.005117f, 0.007904f, + -0.002330f, 0.003193f, 0.012292f, 0.012053f, -0.005309f, -0.010339f, 0.001897f, -0.005458f, -0.005427f, -0.009980f, -0.008154f, -0.015582f, 0.003241f, -0.005334f, -0.000824f, 0.015311f, -0.003594f, 0.003588f, 0.003145f, -0.009596f, 0.008057f, 0.009487f, 0.011402f, -0.009764f, 0.018403f, -0.002241f, -0.014702f, -0.010919f, -0.016026f, 0.015167f, -0.006131f, -0.015308f, 0.004173f, -0.001534f, -0.012238f, 0.013194f, 0.015570f, -0.004623f, -0.014526f, 0.011227f, 0.002333f, 0.009079f, -0.002130f, 0.023207f, 0.011940f, -0.011627f, -0.007494f, -0.004768f, -0.006273f, 0.008723f, 0.008580f, 0.014440f, -0.038227f, -0.000389f, -0.006660f, 0.002187f, 0.000270f, 0.014181f, 0.011011f, 0.014693f, -0.002119f, 0.020174f, -0.009240f, 0.013584f, 0.017436f, 0.002744f, 0.017373f, 0.003265f, 0.004737f, -0.005215f, -0.001450f, -0.007616f, 0.013818f, -0.001286f, -0.001257f, 0.018597f, 0.011789f, -0.000292f, 0.005406f, -0.002106f, -0.000376f, 0.011896f, -0.006828f, -0.012772f, 0.000239f, -0.002227f, 0.006538f, -0.035215f, 0.021087f, 0.021930f, 0.009107f, 0.003796f, 0.000818f, -0.011626f, -0.022908f, 0.014649f, + -0.009112f, -0.011167f, -0.006843f, 0.013030f, -0.009466f, 0.007746f, 0.008765f, -0.008963f, -0.005271f, -0.020760f, 0.009351f, -0.013829f, 0.007852f, 0.000393f, 0.007031f, 0.011178f, 0.019490f, 0.007273f, -0.008851f, -0.022458f, -0.003693f, 0.011780f, 0.021393f, 0.014604f, -0.003239f, -0.005894f, -0.013778f, -0.024814f, -0.002517f, 0.013283f, 0.006911f, 0.001503f, 0.003513f, 0.014940f, 0.050192f, 0.027711f, -0.002683f, 0.005026f, 0.004224f, 0.011330f, 0.019651f, -0.002587f, 0.003620f, 0.033905f, 0.003128f, -0.001322f, 0.020004f, 0.014321f, -0.014409f, 0.008476f, 0.001649f, 0.013645f, 0.008925f, -0.023385f, 0.017390f, -0.010833f, -0.002014f, 0.001991f, 0.013462f, 0.002454f, 0.003257f, 0.010536f, 0.011626f, -0.011733f, 0.011927f, 0.037115f, -0.007189f, 0.016775f, 0.016755f, -0.009494f, 0.012969f, 0.003346f, -0.009680f, -0.010014f, 0.005871f, -0.009028f, -0.023965f, -0.003398f, -0.001914f, 0.001935f, -0.030535f, -0.007744f, 0.008203f, -0.019322f, -0.013599f, -0.031524f, 0.009210f, 0.013546f, -0.022202f, -0.008285f, -0.011316f, 0.021558f, -0.000639f, -0.013699f, -0.010206f, -0.015241f, + 0.005853f, 0.017647f, -0.014691f, 0.006034f, -0.007120f, 0.007729f, 0.019627f, 0.007462f, 0.015042f, 0.015369f, 0.019409f, 0.001385f, 0.050824f, 0.014950f, 0.001085f, -0.001909f, -0.008543f, 0.001400f, 0.008661f, -0.005222f, -0.013037f, -0.016678f, 0.000275f, 0.013731f, -0.016857f, 0.008819f, 0.009301f, -0.003402f, 0.033906f, 0.013414f, -0.009811f, -0.004941f, -0.003742f, 0.013597f, -0.006304f, -0.010653f, -0.013981f, 0.009056f, -0.029186f, 0.001993f, -0.009077f, -0.009250f, 0.007788f, 0.002968f, -0.011478f, -0.005374f, -0.011094f, 0.014951f, -0.005854f, -0.021254f, -0.003955f, 0.001444f, 0.000375f, -0.011960f, -0.019420f, 0.002611f, -0.004719f, -0.001580f, 0.004793f, -0.002984f, 0.015575f, 0.004335f, 0.008694f, -0.010033f, 0.023236f, 0.007940f, -0.013852f, 0.017076f, 0.029689f, -0.008295f, -0.009316f, 0.016627f, 0.013080f, 0.006701f, 0.007209f, -0.018836f, -0.007033f, -0.020523f, 0.004112f, 0.019726f, 0.006659f, -0.024507f, -0.007391f, 0.007348f, -0.026903f, -0.038861f, -0.006547f, -0.000820f, 0.006409f, -0.040052f, 0.018750f, 0.053662f, -0.022147f, 0.037731f, -0.008631f, -0.007872f, + -0.011886f, -0.019158f, 0.014252f, 0.000794f, 0.009698f, 0.009975f, -0.035235f, 0.000739f, 0.016229f, -0.013951f, -0.007636f, -0.021816f, 0.039048f, -0.024094f, 0.019227f, 0.018564f, -0.023380f, -0.009244f, -0.008201f, 0.016799f, -0.018701f, -0.007210f, 0.018928f, -0.002891f, -0.005118f, -0.008806f, 0.023115f, 0.004538f, -0.003762f, -0.009035f, 0.000605f, -0.017104f, 0.019082f, -0.001734f, 0.008790f, 0.048135f, 0.031959f, -0.026813f, -0.019347f, 0.008087f, -0.002424f, 0.020548f, -0.010884f, -0.015388f, -0.005639f, -0.029149f, -0.011442f, -0.002797f, -0.022833f, -0.012316f, 0.050976f, 0.012970f, 0.000311f, -0.001613f, -0.000410f, 0.015913f, 0.018097f, -0.002773f, 0.017914f, 0.002504f, -0.009457f, 0.003087f, -0.026794f, -0.000761f, -0.024679f, -0.012151f, 0.015842f, 0.023824f, -0.032271f, 0.015006f, -0.042056f, 0.006722f, 0.040192f, -0.010955f, -0.009424f, 0.008029f, -0.011573f, -0.010502f, 0.011908f, -0.001940f, -0.001443f, -0.000900f, -0.026025f, 0.045180f, -0.047573f, -0.005007f, -0.000212f, 0.016290f, 0.010922f, 0.000331f, -0.017409f, -0.013439f, 0.006814f, 0.035407f, -0.001831f, -0.015818f, + -0.009622f, -0.025335f, -0.000571f, -0.014863f, -0.010606f, -0.005179f, 0.009163f, -0.000765f, 0.002479f, -0.016964f, 0.004784f, 0.005055f, 0.012333f, 0.009365f, 0.012465f, -0.022870f, 0.001620f, -0.004320f, 0.016833f, 0.004366f, 0.032597f, 0.007284f, -0.005451f, 0.003431f, -0.015044f, 0.000678f, 0.015392f, 0.018376f, -0.024607f, -0.019539f, 0.000126f, 0.028949f, -0.041206f, 0.012798f, 0.052357f, 0.029147f, -0.010971f, 0.006490f, -0.024344f, 0.013504f, 0.027475f, -0.039840f, 0.012406f, -0.017702f, -0.002660f, -0.053948f, 0.003738f, -0.020108f, 0.026122f, 0.006120f, -0.022834f, -0.010977f, -0.032986f, 0.051778f, 0.014385f, 0.027357f, -0.030820f, -0.033437f, -0.006729f, 0.009507f, -0.009921f, -0.004064f, 0.016712f, 0.005177f, 0.004864f, 0.015620f, -0.038165f, -0.003711f, 0.000009f, 0.009969f, -0.026712f, 0.003809f, 0.003948f, -0.017896f, -0.010590f, -0.024809f, -0.019418f, 0.000149f, 0.007526f, -0.020076f, 0.000967f, -0.008993f, -0.018637f, 0.007212f, -0.000621f, 0.014587f, -0.040528f, -0.041589f, 0.008049f, -0.003506f, 0.015041f, 0.035013f, 0.003258f, -0.022017f, 0.030601f, -0.015639f, + -0.030062f, -0.022737f, -0.010364f, 0.002354f, -0.031891f, -0.012261f, 0.029943f, 0.041352f, 0.016829f, 0.011331f, 0.007945f, -0.005197f, 0.025777f, 0.014533f, -0.031699f, -0.017420f, -0.000571f, 0.002481f, 0.028303f, 0.017970f, 0.003918f, -0.005252f, -0.004340f, -0.015130f, 0.018510f, 0.014160f, 0.032669f, 0.006623f, 0.008645f, 0.003013f, 0.058151f, 0.005663f, 0.012653f, 0.034264f, 0.002576f, 0.042673f, -0.001230f, -0.020112f, -0.021359f, -0.040720f, 0.007682f, -0.017349f, -0.000830f, 0.003170f, 0.014841f, 0.020910f, 0.036100f, 0.036842f, -0.005352f, 0.032816f, -0.002044f, -0.002994f, 0.012914f, 0.027718f, 0.012572f, 0.007747f, -0.043741f, -0.022696f, -0.035446f, 0.018303f, 0.036601f, 0.007126f, -0.014978f, 0.025350f, 0.036771f, -0.004645f, 0.006263f, -0.008151f, 0.031071f, 0.026067f, 0.022506f, -0.012450f, -0.022192f, -0.003118f, -0.005192f, -0.050410f, 0.009686f, 0.007679f, 0.005355f, -0.012181f, -0.005944f, -0.056005f, -0.019287f, -0.050639f, -0.008173f, -0.037550f, -0.019164f, 0.038562f, 0.010793f, 0.040706f, 0.003517f, -0.030605f, -0.014745f, -0.031724f, -0.063060f, 0.011004f, + -0.038635f, -0.009315f, 0.038607f, 0.018255f, 0.015687f, 0.005976f, -0.006376f, 0.000545f, 0.008152f, -0.023659f, 0.022744f, -0.042280f, -0.047846f, 0.003639f, -0.006926f, 0.020030f, 0.040787f, 0.035242f, 0.038275f, -0.022074f, -0.038035f, 0.029296f, -0.017161f, 0.030291f, 0.009370f, -0.048899f, 0.012574f, 0.009009f, -0.054661f, 0.029468f, -0.024696f, -0.025665f, 0.015398f, 0.016644f, 0.003069f, 0.019769f, 0.001989f, 0.000903f, -0.012362f, -0.007541f, 0.012654f, -0.007739f, -0.018216f, 0.001151f, -0.034729f, 0.012675f, -0.044274f, -0.027522f, 0.002509f, 0.017710f, -0.005239f, -0.018802f, 0.007977f, 0.013892f, 0.011571f, 0.000599f, 0.037454f, -0.083633f, -0.017644f, -0.023124f, -0.026284f, 0.035846f, -0.027620f, -0.004353f, -0.065559f, -0.019223f, -0.006124f, 0.003049f, 0.046904f, -0.011330f, 0.007950f, -0.027647f, 0.025280f, -0.034321f, -0.018991f, 0.016826f, -0.074898f, 0.010617f, 0.045358f, 0.053404f, 0.045563f, 0.025362f, 0.065799f, 0.032795f, 0.005011f, -0.015909f, -0.008644f, -0.024212f, -0.043622f, -0.005722f, 0.017328f, -0.071445f, -0.071113f, -0.000336f, 0.012450f, 0.049799f, + -0.015801f, 0.022838f, 0.021687f, 0.010779f, 0.012138f, -0.078592f, 0.062393f, 0.033370f, 0.077188f, 0.027845f, -0.002608f, -0.028662f, -0.017305f, -0.018004f, -0.026934f, 0.019616f, 0.015366f, -0.028283f, -0.031148f, 0.016813f, 0.023849f, 0.039896f, 0.012131f, -0.024867f, -0.036108f, 0.007854f, 0.007296f, 0.002595f, 0.005510f, 0.071049f, 0.025130f, 0.013680f, 0.024529f, 0.025838f, 0.030109f, 0.000871f, -0.043759f, 0.031954f, 0.100343f, -0.009808f, -0.026171f, -0.059886f, -0.011467f, 0.080265f, 0.010909f, 0.033540f, 0.012740f, -0.109794f, 0.024564f, 0.020486f, 0.004246f, 0.012118f, -0.005643f, 0.002583f, 0.024779f, -0.058397f, -0.022193f, 0.051609f, 0.021436f, 0.008285f, -0.041702f, 0.033574f, 0.015292f, -0.038434f, -0.039835f, -0.027134f, 0.044665f, 0.086035f, 0.083029f, 0.088684f, 0.093203f, 0.007158f, -0.032948f, 0.036868f, 0.070791f, -0.144967f, -0.053076f, 0.012812f, -0.086971f, -0.077052f, -0.035419f, -0.046266f, 0.003936f, -0.033721f, 0.091252f, -0.008530f, -0.034406f, -0.011989f, -0.072562f, -0.018351f, -0.058880f, -0.022537f, 0.008420f, -0.072580f, -0.014009f, 0.058560f, + -0.049593f, -0.012477f, 0.014823f, 0.001045f, 0.022169f, 0.006347f, -0.001673f, 0.022694f, 0.006120f, -0.035363f, -0.008729f, 0.034058f, -0.018424f, -0.044348f, -0.016981f, -0.054054f, -0.029321f, -0.095722f, 0.007411f, -0.064720f, 0.029828f, 0.013319f, -0.026472f, -0.084165f, 0.005661f, -0.007547f, 0.103252f, 0.043608f, -0.000495f, 0.059008f, 0.022306f, 0.002301f, 0.043953f, -0.053120f, -0.028904f, 0.006056f, 0.038329f, -0.043476f, -0.030674f, 0.155274f, -0.017808f, 0.081639f, -0.065140f, 0.002379f, -0.047623f, 0.036021f, -0.019258f, 0.054898f, 0.077864f, 0.005390f, -0.061434f, 0.052774f, -0.064604f, -0.056423f, 0.115484f, -0.066701f, 0.043347f, 0.036489f, -0.058018f, 0.031707f, 0.019484f, 0.012039f, -0.008941f, 0.044424f, 0.025055f, -0.058061f, 0.042560f, 0.046873f, 0.011142f, 0.007598f, 0.030699f, -0.001093f, -0.054982f, 0.073991f, -0.040144f, 0.016657f, -0.029170f, -0.007304f, 0.011801f, -0.013829f, 0.063083f, 0.013790f, -0.005281f, -0.014233f, -0.000318f, 0.012295f, -0.058583f, 0.020099f, -0.028782f, -0.020847f, -0.011481f, 0.000733f, -0.026744f, -0.013330f, 0.010990f, 0.065142f, + 0.004537f, -0.011989f, -0.036659f, 0.018644f, 0.015558f, 0.003755f, 0.054188f, -0.009946f, -0.000291f, 0.061429f, 0.023778f, 0.006176f, -0.051345f, -0.026689f, 0.042800f, 0.024099f, -0.046775f, 0.005752f, -0.114034f, -0.055393f, 0.116647f, -0.020082f, 0.067711f, 0.083316f, 0.032077f, 0.020579f, 0.046728f, -0.005821f, -0.028235f, 0.034169f, 0.025503f, 0.012046f, 0.075160f, 0.051470f, 0.070354f, -0.025565f, -0.102939f, 0.012836f, -0.007662f, 0.031688f, 0.016780f, -0.042454f, 0.024377f, 0.016608f, -0.036599f, -0.051831f, -0.025527f, -0.082711f, -0.072065f, 0.047220f, -0.007107f, -0.085490f, -0.019158f, 0.001996f, 0.031469f, 0.018924f, -0.043488f, -0.059094f, 0.010352f, 0.066974f, -0.029951f, 0.021781f, -0.044232f, 0.010881f, -0.050556f, 0.029487f, 0.043487f, -0.034265f, -0.052152f, -0.046551f, -0.001171f, 0.015256f, -0.019365f, -0.023652f, -0.015207f, -0.080571f, -0.057722f, 0.025253f, -0.047550f, -0.018851f, 0.024321f, -0.051978f, -0.065070f, 0.018445f, 0.042675f, -0.013522f, -0.079264f, 0.028929f, 0.039224f, 0.098068f, 0.006519f, 0.018427f, 0.027254f, -0.056120f, 0.024022f, -0.024936f, + -0.086186f, -0.025413f, 0.063867f, 0.001748f, -0.039465f, -0.129023f, 0.081783f, 0.080898f, -0.018956f, 0.062023f, 0.098959f, -0.010556f, 0.016751f, 0.053581f, -0.024923f, -0.020727f, 0.040953f, -0.008306f, 0.022563f, -0.047602f, -0.155473f, 0.043047f, -0.018747f, 0.116736f, -0.040555f, -0.023959f, -0.047137f, -0.130739f, 0.059726f, -0.075517f, -0.045725f, 0.003940f, -0.000784f, 0.103624f, -0.073521f, -0.049364f, 0.066657f, 0.041758f, 0.034579f, -0.010820f, 0.033087f, -0.021736f, -0.033933f, -0.028991f, 0.078527f, 0.067547f, 0.102233f, -0.030469f, -0.038413f, 0.003992f, -0.006776f, 0.039844f, -0.061587f, 0.015535f, -0.064658f, 0.037003f, 0.063775f, 0.024273f, -0.052043f, 0.038195f, -0.045762f, 0.106500f, 0.053375f, 0.017368f, 0.014551f, -0.013326f, -0.080848f, 0.048848f, -0.109813f, 0.025952f, 0.021406f, 0.056933f, 0.043775f, -0.092508f, 0.029793f, -0.057118f, -0.034632f, 0.029081f, -0.008337f, 0.038735f, 0.024025f, -0.084219f, 0.036912f, 0.083228f, 0.107244f, -0.027927f, 0.032432f, -0.040879f, 0.075261f, -0.104352f, -0.005265f, -0.021102f, 0.032807f, 0.036641f, -0.115665f, 0.080954f, + -0.005513f, -0.009148f, 0.034563f, 0.018398f, 0.040068f, 0.003735f, 0.022563f, -0.048557f, 0.046349f, 0.005201f, -0.037694f, 0.023458f, -0.011435f, -0.006670f, 0.045512f, 0.016914f, -0.056031f, 0.028759f, -0.023341f, 0.045519f, -0.031563f, 0.006900f, -0.013129f, 0.017804f, -0.012176f, 0.004756f, -0.021076f, 0.053027f, 0.001013f, -0.004822f, 0.024020f, 0.013381f, -0.023655f, -0.012892f, 0.020102f, 0.013082f, 0.024717f, -0.027727f, 0.014272f, -0.006102f, -0.053473f, -0.012129f, 0.022664f, 0.014933f, 0.016828f, 0.006790f, -0.046954f, 0.001013f, 0.004380f, -0.002374f, 0.020251f, -0.018845f, 0.019820f, 0.000678f, 0.013414f, -0.021833f, -0.003640f, -0.013273f, 0.071866f, -0.031634f, 0.021979f, 0.013284f, -0.003137f, 0.011481f, -0.014556f, 0.009818f, 0.022709f, -0.029667f, -0.012665f, 0.001611f, -0.001180f, -0.004421f, -0.005617f, -0.041914f, 0.015773f, -0.015839f, 0.096387f, -0.006799f, -0.031449f, -0.047527f, -0.021865f, -0.026624f, 0.034834f, 0.020390f, -0.025677f, 0.002242f, 0.002785f, 0.011552f, 0.001344f, 0.024354f, 0.008136f, 0.019192f, -0.006798f, -0.000613f, -0.005989f, 0.009020f, + 0.020447f, -0.019178f, -0.000396f, -0.009476f, 0.000393f, 0.025279f, -0.014615f, 0.002478f, -0.006772f, 0.009954f, 0.004828f, -0.013860f, -0.005450f, 0.014844f, -0.004889f, 0.024202f, 0.016908f, -0.025331f, 0.007770f, 0.005305f, 0.012925f, 0.005538f, -0.024249f, 0.016094f, -0.004829f, 0.015634f, 0.012230f, -0.028645f, 0.007468f, -0.000043f, 0.006062f, -0.003327f, -0.012894f, 0.020185f, -0.005359f, 0.009060f, 0.000134f, -0.006299f, 0.009075f, -0.012353f, -0.002032f, 0.016744f, -0.011961f, -0.014227f, 0.028013f, -0.018516f, 0.026169f, -0.003019f, -0.021506f, 0.043443f, -0.040160f, 0.034606f, -0.012179f, -0.021245f, 0.022687f, -0.020959f, -0.047677f, -0.080785f, 0.101969f, 0.293550f, 0.045943f, 0.028745f, -0.214784f, -0.264699f, -0.085374f, -0.051798f, 0.178792f, 0.273710f, 0.140211f, 0.041041f, -0.092538f, -0.197575f, -0.180974f, -0.150906f, 0.011413f, 0.226741f, 0.188881f, 0.108850f, 0.036299f, -0.096747f, -0.126343f, -0.099688f, -0.097152f, -0.033884f, 0.045124f, 0.063048f, 0.129443f, 0.093276f, 0.021903f, -0.031452f, -0.019288f, -0.104660f, -0.051634f, -0.052876f, -0.072474f, 0.042714f, + 0.079656f, 0.046534f, 0.116299f, 0.031087f, -0.028683f, -0.045055f, -0.078778f, -0.061637f, -0.010581f, -0.019161f, 0.022927f, 0.048299f, 0.042148f, 0.030639f, 0.019925f, -0.010928f, -0.043916f, -0.030571f, -0.036796f, 0.011044f, 0.040157f, 0.013190f, 0.008760f, -0.018607f, -0.038756f, -0.007688f, -0.001815f, -0.001437f, 0.028191f, 0.025871f, 0.027994f, 0.010519f, -0.012949f, -0.034160f, -0.049800f, -0.050150f, -0.032734f, 0.028043f, 0.014524f, 0.005074f} + }, + { + {-0.009295f, -0.009930f, -0.012467f, -0.015293f, -0.011517f, -0.006906f, -0.001007f, -0.006226f, 0.004702f, -0.001055f, -0.001455f, 0.002462f, 0.005251f, -0.000092f, -0.003363f, -0.003658f, -0.005925f, 0.000900f, -0.005416f, 0.009641f, 0.010543f, -0.004288f, 0.000378f, 0.003149f, -0.002707f, 0.008094f, -0.003030f, -0.003515f, 0.000388f, -0.000722f, 0.007226f, 0.005867f, 0.002696f, 0.001441f, -0.006781f, -0.003085f, 0.008025f, -0.002254f, 0.002231f, -0.001618f, -0.003735f, -0.004817f, -0.004987f, 0.004272f, 0.000009f, 0.000844f, 0.001716f, -0.002275f, 0.002374f, 0.005133f, -0.009455f, -0.002233f, 0.003797f, 0.000894f, 0.003847f, -0.000515f, -0.008734f, -0.003163f, 0.004930f, -0.005413f, -0.000529f, 0.003806f, -0.003266f, -0.000863f, -0.001564f, -0.005168f, -0.001409f, -0.004061f, -0.001842f, 0.000406f, -0.002714f, 0.000302f, 0.000763f, -0.000639f, -0.002348f, -0.001641f, -0.005346f, -0.005360f, 0.020378f, 0.002353f, 0.005537f, 0.001920f, 0.002926f, -0.004943f, -0.012293f, -0.002414f, 0.006520f, 0.002280f, -0.006085f, -0.000902f, 0.004981f, -0.001334f, -0.007337f, 0.002158f, -0.008461f, -0.005300f, + -0.000272f, 0.002263f, -0.002420f, -0.001979f, 0.005222f, -0.007366f, -0.000200f, 0.000848f, 0.003495f, 0.002714f, 0.002647f, 0.008823f, 0.003980f, -0.011170f, -0.002876f, -0.005135f, 0.001344f, -0.000393f, -0.000904f, -0.007086f, -0.009165f, 0.011926f, -0.005642f, 0.002821f, 0.003414f, 0.002887f, -0.011530f, -0.006635f, -0.003105f, 0.001114f, -0.001017f, -0.000512f, -0.001183f, 0.001763f, 0.004213f, -0.006150f, -0.000174f, 0.003019f, 0.003555f, 0.004254f, 0.001448f, -0.000127f, 0.004099f, 0.001305f, -0.002101f, -0.000791f, 0.006741f, -0.005453f, -0.005776f, -0.003247f, -0.002520f, 0.005666f, 0.003177f, 0.001081f, -0.002636f, 0.005383f, -0.003018f, 0.002561f, -0.011649f, -0.006885f, 0.004872f, -0.011229f, -0.016061f, 0.003224f, 0.001341f, 0.002097f, 0.002318f, 0.002388f, -0.013776f, -0.002103f, 0.004001f, -0.008571f, 0.009189f, 0.009088f, 0.007682f, -0.002910f, 0.000747f, 0.002268f, 0.005918f, 0.001547f, -0.000126f, 0.001377f, -0.003896f, 0.003936f, -0.001335f, -0.001198f, -0.001753f, 0.011580f, -0.006611f, 0.004199f, -0.004105f, -0.003368f, -0.003652f, 0.003319f, 0.006380f, -0.006267f, + -0.003077f, -0.003223f, 0.004764f, 0.004638f, 0.007139f, 0.005071f, 0.001204f, 0.006447f, -0.004821f, 0.004068f, 0.001719f, 0.002046f, 0.012997f, 0.003489f, 0.006649f, -0.009824f, -0.002351f, 0.004847f, -0.004696f, 0.005533f, -0.001706f, -0.003146f, 0.001938f, 0.008300f, 0.005757f, 0.004287f, -0.001135f, 0.002429f, 0.006445f, -0.005847f, 0.009907f, -0.000103f, 0.008396f, -0.001677f, 0.007243f, 0.008909f, 0.007429f, -0.001200f, -0.007804f, -0.002638f, 0.018947f, 0.014494f, 0.010953f, 0.010054f, 0.010247f, 0.005065f, -0.001338f, 0.000297f, -0.004475f, -0.000650f, 0.013651f, -0.005622f, -0.006835f, 0.010306f, 0.006766f, 0.009936f, -0.007024f, 0.003406f, -0.002945f, 0.002693f, 0.003715f, 0.006436f, 0.000397f, -0.003683f, -0.003632f, -0.004900f, -0.002418f, -0.002791f, -0.010476f, -0.000599f, 0.007991f, -0.005945f, -0.001591f, 0.003756f, -0.005611f, -0.004033f, 0.004329f, -0.001923f, -0.007140f, -0.002921f, 0.003371f, -0.005042f, -0.007812f, -0.002668f, -0.002634f, 0.003190f, -0.005588f, -0.009932f, 0.000304f, -0.001023f, -0.001947f, 0.003832f, -0.009203f, -0.003493f, -0.000308f, -0.002868f, + 0.004341f, -0.000426f, 0.001591f, -0.014872f, -0.005260f, 0.009723f, -0.004021f, -0.007781f, 0.002028f, 0.002410f, 0.001857f, -0.002323f, -0.013062f, -0.004749f, 0.013340f, 0.001844f, 0.004445f, 0.003787f, -0.002719f, 0.027611f, 0.016919f, 0.016062f, 0.000264f, 0.001629f, 0.001257f, -0.006546f, -0.014632f, -0.005493f, 0.010995f, -0.008314f, 0.004959f, 0.014922f, 0.001167f, -0.004710f, -0.001903f, -0.003010f, -0.001620f, 0.006033f, 0.008529f, 0.000307f, 0.002483f, 0.003493f, 0.005542f, 0.000326f, -0.007892f, 0.002403f, -0.012690f, -0.003833f, -0.001647f, -0.003547f, -0.002346f, 0.001537f, -0.003075f, -0.006683f, -0.005221f, -0.002445f, 0.000498f, -0.002913f, -0.007715f, 0.009041f, -0.003468f, 0.000579f, -0.002415f, -0.006073f, 0.007441f, 0.020722f, 0.004976f, -0.007367f, 0.012276f, 0.002683f, -0.003837f, 0.003602f, -0.002169f, -0.008191f, 0.000005f, -0.003550f, 0.003088f, -0.007158f, -0.012047f, 0.000246f, 0.002002f, -0.014850f, 0.004379f, 0.002740f, 0.008195f, 0.004323f, 0.010843f, -0.003995f, -0.007180f, -0.004653f, -0.002129f, 0.004827f, -0.001740f, -0.009851f, 0.006586f, -0.004808f, + -0.014616f, -0.022022f, -0.007316f, -0.010815f, 0.015644f, -0.003263f, -0.002408f, 0.006422f, -0.015287f, -0.010060f, 0.008454f, -0.006798f, -0.007139f, 0.000019f, -0.001076f, 0.001968f, 0.005390f, -0.002086f, 0.002183f, -0.003490f, -0.003375f, 0.000100f, -0.003054f, -0.006131f, -0.001104f, -0.001028f, 0.006261f, 0.007243f, 0.005487f, -0.007692f, 0.003181f, 0.003089f, 0.010692f, -0.005319f, -0.001011f, -0.003506f, -0.009229f, 0.012630f, -0.012275f, -0.005365f, -0.005186f, 0.003247f, 0.009513f, -0.009080f, 0.009838f, -0.000794f, 0.004952f, 0.009129f, 0.000664f, 0.007115f, -0.013343f, 0.003109f, -0.005570f, 0.000991f, -0.014173f, 0.000591f, -0.005519f, -0.011559f, -0.010143f, 0.001051f, 0.007704f, 0.000796f, -0.007562f, 0.010327f, -0.004703f, 0.006114f, -0.002189f, -0.012025f, 0.015713f, -0.010465f, -0.003938f, -0.005813f, 0.002198f, 0.007347f, 0.002000f, 0.006826f, 0.009876f, 0.006161f, -0.015993f, -0.022537f, 0.002446f, 0.002032f, 0.001187f, 0.014743f, -0.004811f, -0.015754f, 0.001609f, 0.002008f, -0.004265f, -0.000749f, -0.014046f, -0.002587f, 0.001686f, 0.002263f, 0.015599f, -0.002544f, + 0.013978f, -0.003184f, -0.003661f, 0.001388f, -0.013956f, 0.006167f, -0.005280f, 0.008716f, -0.002377f, -0.003330f, -0.005199f, -0.002264f, 0.000470f, -0.010130f, 0.017971f, -0.012181f, -0.020260f, 0.006354f, 0.000906f, -0.013891f, -0.004224f, -0.026937f, 0.000445f, -0.009360f, -0.000161f, -0.010174f, -0.008587f, 0.001872f, 0.000932f, 0.005113f, -0.008669f, 0.007325f, -0.009785f, -0.018368f, 0.002183f, 0.005706f, -0.005782f, 0.006694f, -0.003321f, -0.009892f, -0.009318f, -0.012107f, -0.006173f, -0.000706f, 0.001907f, -0.003099f, 0.011569f, 0.000809f, -0.003966f, 0.001883f, 0.000345f, 0.003427f, 0.001346f, 0.002525f, -0.011990f, -0.009156f, 0.001216f, -0.035042f, -0.008758f, 0.001374f, -0.008896f, -0.006537f, -0.011128f, 0.002886f, 0.003987f, 0.007977f, -0.005945f, -0.007453f, -0.008369f, 0.004246f, 0.009512f, -0.004660f, -0.003923f, -0.002359f, -0.001327f, 0.004513f, -0.019390f, -0.004768f, 0.011183f, 0.003656f, -0.005553f, 0.002155f, 0.009954f, -0.000887f, -0.002294f, 0.003498f, -0.000398f, 0.024052f, -0.010076f, 0.005954f, 0.002184f, -0.009998f, 0.003597f, 0.002356f, -0.011186f, 0.008214f, + -0.015998f, -0.001476f, 0.014781f, 0.003288f, -0.000053f, -0.002922f, -0.010763f, -0.009511f, 0.002992f, 0.006333f, -0.003753f, 0.003151f, 0.012440f, 0.006059f, -0.004461f, 0.007507f, -0.010080f, -0.024846f, -0.002732f, -0.010835f, 0.007558f, -0.006890f, 0.018390f, 0.009025f, -0.000128f, -0.002766f, -0.022274f, 0.007412f, 0.009568f, -0.006882f, 0.014880f, -0.010712f, 0.005162f, -0.018013f, 0.009427f, 0.006926f, -0.019826f, 0.009488f, 0.014033f, 0.034822f, 0.035657f, 0.007941f, 0.010108f, 0.000703f, 0.004359f, 0.000891f, 0.002958f, -0.009219f, 0.003603f, -0.005571f, 0.007110f, 0.008093f, 0.017752f, 0.003307f, -0.004837f, 0.012132f, 0.007392f, 0.014478f, -0.000432f, 0.009097f, 0.003938f, -0.004100f, 0.003177f, 0.021268f, 0.002075f, -0.008905f, -0.006223f, 0.015717f, 0.008255f, 0.007593f, 0.013051f, -0.011082f, 0.002858f, 0.017274f, -0.018746f, -0.020585f, 0.005183f, 0.010943f, 0.016246f, -0.007892f, -0.015125f, 0.010674f, 0.002110f, -0.001853f, 0.004836f, -0.003001f, -0.003628f, -0.000443f, 0.023426f, -0.009630f, 0.002985f, -0.006626f, -0.006254f, -0.003550f, 0.010875f, -0.002385f, + 0.027121f, 0.013526f, -0.016988f, 0.015780f, 0.000696f, 0.006805f, 0.000419f, 0.002537f, 0.000620f, -0.006674f, 0.006234f, -0.024943f, -0.010473f, 0.008995f, -0.028908f, 0.005984f, -0.025567f, 0.054562f, 0.011592f, 0.007087f, -0.014704f, 0.022521f, -0.006267f, -0.002828f, -0.004578f, -0.000410f, -0.013975f, -0.002957f, 0.009299f, 0.000020f, -0.011029f, 0.014279f, -0.002007f, -0.010073f, 0.004189f, 0.003276f, -0.014694f, -0.025044f, 0.011567f, -0.011367f, -0.011844f, 0.000961f, 0.001862f, -0.008815f, 0.014091f, -0.013974f, 0.006004f, 0.010070f, -0.000104f, 0.015470f, 0.007433f, -0.023552f, -0.020767f, -0.011492f, 0.003532f, 0.002406f, -0.015935f, 0.004769f, 0.008666f, 0.001681f, 0.007940f, 0.006205f, -0.016553f, -0.011096f, 0.007646f, -0.022638f, -0.005298f, -0.002258f, -0.019323f, -0.013351f, -0.005037f, 0.002610f, -0.008656f, -0.025287f, -0.008654f, -0.014348f, 0.029818f, 0.011362f, 0.000457f, 0.001921f, -0.004497f, 0.019837f, 0.028944f, 0.001084f, 0.020562f, 0.010847f, 0.008403f, 0.001246f, -0.006346f, -0.004122f, -0.004726f, 0.010551f, -0.011886f, -0.002411f, -0.038451f, 0.025981f, + 0.041627f, -0.031183f, -0.018603f, 0.008645f, 0.007483f, -0.006258f, 0.013707f, 0.003815f, -0.011606f, -0.014117f, -0.000243f, -0.004448f, -0.010098f, 0.005339f, -0.004597f, 0.000822f, 0.011602f, -0.015320f, 0.003359f, 0.002270f, -0.009092f, 0.001530f, -0.014491f, 0.003083f, 0.021583f, 0.011191f, -0.002005f, -0.006625f, -0.001604f, -0.011956f, -0.012870f, 0.006725f, 0.011027f, -0.003089f, -0.005815f, -0.003916f, 0.006689f, 0.011193f, 0.005400f, 0.020216f, -0.010439f, 0.008589f, -0.004905f, 0.002419f, 0.012601f, -0.003946f, -0.003657f, -0.023042f, -0.003350f, -0.017685f, 0.009452f, 0.006877f, 0.023761f, -0.019468f, -0.007124f, -0.018772f, -0.031751f, -0.004625f, 0.013690f, -0.021313f, 0.005240f, -0.001544f, -0.015811f, -0.018038f, -0.023647f, 0.033381f, 0.001608f, 0.020476f, 0.014511f, 0.017878f, -0.006852f, -0.019343f, -0.015584f, -0.016876f, 0.007691f, -0.029269f, 0.020953f, -0.001915f, -0.012002f, 0.019446f, 0.005867f, -0.017228f, -0.026603f, -0.009107f, -0.000573f, 0.001472f, 0.000630f, -0.008269f, 0.028881f, 0.013218f, 0.008342f, 0.007842f, 0.008734f, -0.007897f, 0.001725f, 0.006962f, + 0.003833f, 0.027615f, 0.002312f, -0.038276f, 0.004442f, 0.017632f, -0.015103f, -0.020931f, -0.005051f, -0.010755f, -0.007439f, 0.003177f, 0.027607f, 0.018080f, -0.003083f, 0.000775f, -0.008633f, -0.022970f, -0.008449f, -0.018672f, 0.014258f, 0.021267f, 0.000142f, -0.009338f, -0.004059f, -0.002861f, 0.009010f, 0.014273f, 0.013331f, -0.028990f, 0.006001f, 0.002918f, 0.002832f, 0.023329f, -0.012321f, 0.010771f, -0.011173f, -0.006118f, 0.002541f, 0.016195f, 0.025555f, -0.001700f, -0.015883f, 0.007702f, -0.028849f, 0.026010f, 0.013239f, -0.000159f, -0.011444f, 0.009303f, -0.006001f, -0.011214f, -0.011183f, -0.009359f, -0.011147f, -0.005050f, 0.016296f, -0.027694f, -0.005445f, 0.014872f, -0.019108f, -0.004005f, -0.000182f, -0.004645f, -0.022546f, 0.022475f, 0.012472f, -0.018770f, -0.000970f, -0.009098f, -0.004246f, -0.039016f, -0.003242f, -0.018824f, -0.039974f, 0.007130f, 0.008503f, -0.020929f, -0.013755f, -0.024338f, -0.023557f, 0.019980f, 0.014394f, 0.021126f, 0.002917f, 0.046361f, 0.004398f, 0.023319f, 0.036822f, -0.005895f, 0.012791f, 0.033821f, -0.021825f, 0.009112f, -0.012225f, 0.022650f, + -0.005401f, 0.045908f, 0.024102f, -0.016845f, -0.020076f, 0.001761f, 0.013571f, 0.017954f, 0.007913f, -0.019336f, -0.001365f, 0.013774f, 0.038265f, -0.016957f, 0.026658f, -0.010844f, 0.017484f, -0.030054f, 0.014061f, -0.017427f, 0.014246f, -0.000570f, 0.007105f, -0.007565f, 0.025663f, 0.027998f, -0.051745f, 0.013987f, 0.016033f, 0.004961f, -0.005184f, 0.003296f, -0.034215f, -0.002390f, 0.028060f, 0.029310f, -0.006130f, 0.030527f, -0.001221f, -0.006544f, 0.002826f, 0.017173f, -0.006022f, -0.007872f, -0.003098f, -0.021834f, 0.004117f, -0.006216f, 0.034965f, 0.022721f, -0.015766f, -0.017233f, -0.031975f, -0.011773f, 0.024426f, 0.042940f, -0.018671f, 0.013473f, 0.003677f, 0.005951f, 0.024134f, 0.017036f, -0.032527f, 0.007082f, -0.010967f, -0.006302f, -0.012769f, -0.006986f, -0.013476f, -0.031622f, 0.006794f, 0.022240f, 0.009473f, 0.051244f, -0.011002f, -0.006142f, 0.036422f, -0.011891f, -0.000546f, -0.006847f, 0.010779f, -0.037459f, -0.023167f, 0.014556f, 0.030469f, 0.043275f, 0.051868f, -0.035457f, -0.017287f, -0.000420f, 0.018701f, 0.000003f, 0.058924f, 0.017649f, 0.010662f, -0.042135f, + 0.005353f, 0.002537f, 0.023777f, 0.030318f, -0.018161f, -0.004114f, 0.011479f, -0.005913f, 0.002971f, 0.035238f, 0.014600f, -0.027121f, 0.011487f, 0.021217f, -0.012758f, 0.041918f, 0.008818f, 0.056361f, 0.029656f, -0.017286f, -0.002918f, -0.055776f, 0.006217f, 0.012299f, 0.005793f, 0.078342f, -0.008098f, -0.008013f, -0.033199f, -0.032402f, 0.014589f, -0.026842f, -0.013124f, -0.018635f, -0.009131f, 0.018022f, -0.010900f, -0.024830f, -0.017616f, -0.000134f, 0.022287f, -0.027830f, 0.008014f, 0.009786f, 0.004796f, 0.027034f, -0.001146f, 0.000335f, -0.027206f, -0.043386f, -0.014810f, 0.017034f, -0.020588f, 0.003580f, -0.016902f, -0.074328f, -0.036640f, 0.019690f, 0.003887f, -0.043474f, 0.008750f, 0.055706f, -0.000287f, -0.003568f, -0.020147f, 0.010533f, -0.022457f, -0.046742f, 0.003573f, 0.004592f, -0.014836f, 0.006323f, 0.019283f, -0.006438f, -0.012066f, 0.009654f, 0.018155f, 0.026502f, -0.014107f, 0.019186f, 0.030496f, 0.009027f, 0.051147f, 0.002527f, -0.027555f, 0.032218f, 0.004790f, 0.002367f, -0.003752f, -0.011334f, 0.024754f, -0.027388f, 0.001372f, 0.028734f, -0.040491f, -0.045939f, + -0.051761f, 0.071733f, -0.039226f, 0.008065f, -0.000962f, -0.024912f, 0.038437f, -0.045414f, 0.020122f, 0.076172f, 0.049106f, 0.009333f, -0.062039f, -0.005400f, -0.040593f, -0.023051f, -0.037014f, -0.005589f, 0.011816f, -0.008889f, 0.030886f, -0.016490f, 0.005902f, 0.012618f, 0.042707f, 0.003571f, 0.006625f, 0.048293f, -0.032507f, -0.007129f, 0.023104f, -0.012256f, -0.025100f, -0.019757f, 0.026214f, -0.024913f, 0.011372f, 0.040548f, -0.011417f, -0.081011f, -0.004163f, 0.016542f, -0.095374f, 0.054761f, 0.045201f, -0.039682f, 0.060035f, 0.036900f, 0.027058f, 0.058129f, 0.001813f, 0.027930f, 0.004127f, -0.000259f, 0.022702f, -0.043476f, 0.039619f, 0.048683f, 0.041414f, -0.047055f, -0.007742f, 0.053283f, -0.027781f, 0.040746f, 0.043221f, 0.093210f, 0.060872f, -0.003395f, 0.008207f, -0.020545f, 0.014566f, 0.008357f, -0.053664f, -0.093323f, -0.017361f, 0.043942f, 0.055971f, -0.109448f, -0.098872f, 0.042314f, -0.028176f, -0.032466f, -0.012775f, -0.039121f, 0.013561f, -0.062701f, 0.077358f, 0.027538f, -0.032393f, -0.002375f, -0.031833f, -0.025534f, -0.025862f, -0.031051f, -0.019451f, -0.076006f, + -0.067161f, -0.014618f, -0.015986f, 0.001853f, 0.005244f, 0.010331f, -0.005901f, 0.006755f, 0.010968f, 0.030058f, 0.034830f, -0.016736f, -0.020191f, -0.024739f, -0.020283f, -0.045178f, 0.060055f, -0.025524f, 0.012764f, 0.042488f, 0.041040f, -0.020537f, -0.021629f, -0.039007f, -0.026047f, -0.033023f, 0.044379f, 0.000404f, 0.002127f, -0.064194f, -0.025115f, 0.080273f, -0.012783f, 0.074011f, -0.020982f, -0.035919f, -0.024160f, -0.040272f, -0.040388f, -0.013397f, -0.006006f, -0.055204f, -0.003036f, 0.014278f, -0.009699f, 0.008483f, -0.118352f, -0.054902f, -0.040475f, 0.046037f, -0.025126f, -0.005035f, 0.006603f, 0.072723f, 0.008860f, -0.036081f, -0.060201f, 0.121999f, -0.041284f, -0.020990f, 0.067799f, -0.041797f, -0.070316f, 0.065649f, -0.093665f, -0.023295f, 0.018765f, 0.018654f, -0.066079f, -0.021822f, 0.051863f, 0.003438f, -0.013284f, -0.032310f, 0.040237f, -0.039270f, 0.000351f, 0.036803f, -0.013640f, 0.034070f, -0.002140f, -0.012067f, 0.008042f, 0.010550f, -0.020675f, 0.032604f, -0.018359f, -0.003312f, 0.006641f, 0.002673f, -0.000242f, -0.002257f, 0.006721f, 0.021914f, 0.028210f, 0.046663f, + 0.019425f, -0.014644f, -0.006778f, -0.024247f, 0.023745f, -0.005885f, -0.041369f, 0.012595f, -0.001344f, -0.019416f, -0.055767f, 0.041488f, 0.001601f, -0.021981f, 0.060263f, 0.006659f, -0.020071f, -0.008029f, 0.090092f, -0.082168f, -0.092405f, 0.058724f, 0.086639f, -0.158276f, 0.000387f, -0.057142f, -0.054265f, -0.021847f, 0.058655f, -0.043638f, 0.077933f, -0.010133f, -0.001022f, 0.103763f, -0.027828f, -0.082950f, 0.100009f, 0.097148f, 0.073867f, -0.036058f, -0.041842f, -0.015214f, 0.014377f, 0.069224f, 0.057009f, -0.021565f, -0.002458f, 0.019791f, 0.061973f, -0.022178f, 0.000152f, 0.033350f, -0.042552f, -0.042173f, 0.035201f, -0.023545f, -0.011984f, -0.021837f, 0.002071f, -0.034339f, 0.006485f, 0.019500f, -0.009369f, 0.014556f, -0.010845f, -0.011743f, -0.005156f, -0.046413f, 0.011048f, -0.020115f, 0.031693f, 0.055589f, 0.007989f, 0.026628f, 0.028872f, 0.000061f, 0.016103f, 0.015971f, 0.066717f, -0.045476f, 0.035264f, 0.023996f, -0.025517f, 0.018975f, 0.026639f, 0.004509f, -0.021379f, -0.057735f, -0.049516f, 0.016611f, 0.027467f, -0.023249f, -0.086483f, 0.074653f, -0.017553f, -0.043207f, + -0.014980f, 0.075128f, -0.026661f, 0.082344f, 0.010462f, 0.026393f, -0.067799f, 0.073070f, -0.021505f, 0.031341f, 0.004392f, -0.110335f, -0.017389f, 0.019728f, -0.046984f, 0.067729f, 0.032713f, -0.099325f, -0.072460f, -0.049853f, 0.018309f, -0.020512f, 0.023715f, -0.037125f, -0.067222f, -0.000891f, -0.071452f, 0.018876f, -0.005032f, -0.014127f, 0.025869f, 0.039220f, -0.024278f, 0.004786f, 0.045831f, -0.035619f, 0.061639f, -0.008901f, -0.064349f, 0.055793f, -0.025533f, -0.012911f, 0.052192f, -0.065359f, 0.018836f, 0.000408f, 0.025295f, -0.010784f, -0.021829f, -0.099196f, 0.024557f, -0.041222f, -0.097080f, 0.119291f, -0.078587f, -0.033980f, -0.013928f, -0.027594f, -0.058721f, 0.033881f, 0.084826f, -0.051347f, 0.025431f, -0.074322f, -0.039680f, -0.042326f, 0.039703f, 0.006753f, 0.110863f, -0.018548f, -0.006558f, -0.032159f, -0.090978f, 0.000391f, 0.048137f, -0.034197f, 0.040934f, 0.046392f, -0.035868f, 0.004453f, -0.030017f, -0.137496f, -0.069283f, -0.041719f, -0.141751f, 0.093754f, 0.126064f, 0.058584f, -0.118829f, -0.097746f, -0.215768f, 0.033340f, 0.269157f, 0.123186f, 0.056341f, -0.066095f, + -0.217917f, -0.102012f, 0.073463f, -0.012859f, -0.018463f, 0.003808f, 0.032004f, 0.002577f, -0.008474f, 0.027062f, 0.006669f, 0.010298f, 0.038087f, -0.023467f, -0.002269f, 0.022728f, -0.009249f, -0.001862f, 0.023260f, -0.021538f, -0.007705f, 0.009024f, 0.037690f, -0.024337f, -0.020670f, 0.024149f, -0.003098f, 0.014398f, -0.041402f, 0.053522f, -0.014376f, 0.019336f, -0.013370f, 0.008575f, 0.026010f, 0.014307f, -0.008737f, 0.026131f, -0.011370f, 0.026398f, -0.021453f, 0.000514f, 0.023026f, -0.003846f, -0.012743f, -0.048959f, 0.002881f, 0.041384f, 0.001793f, 0.020487f, -0.028168f, -0.006122f, -0.017879f, -0.014100f, -0.009149f, 0.030636f, -0.012983f, 0.019571f, -0.025126f, -0.024532f, -0.014308f, 0.008768f, 0.049146f, -0.017458f, 0.020552f, 0.004270f, 0.001791f, -0.022509f, 0.010170f, 0.030363f, -0.002804f, -0.020734f, 0.013960f, -0.011572f, 0.006295f, -0.003345f, -0.016461f, 0.098981f, 0.019660f, -0.053051f, -0.037677f, -0.058592f, -0.018572f, 0.011275f, 0.031128f, -0.009721f, -0.012566f, -0.010834f, -0.010428f, -0.009871f, 0.014236f, -0.007218f, -0.001975f, -0.003130f, -0.010295f, -0.002456f, + 0.015648f, 0.002248f, -0.004506f, -0.015613f, 0.017956f, -0.023252f, 0.013693f, -0.008292f, -0.022820f, 0.000117f, 0.010425f, 0.011733f, 0.009177f, -0.013464f, 0.003020f, -0.004294f, -0.007377f, 0.027538f, -0.024481f, -0.004429f, -0.000989f, -0.001647f, 0.002582f, -0.004046f, -0.014386f, 0.012167f, -0.022803f, 0.021808f, -0.003194f, -0.015199f, 0.005261f, -0.007797f, 0.019324f, -0.011223f, -0.006867f, 0.020986f, -0.018751f, 0.006624f, -0.009002f, -0.001933f, 0.015966f, -0.011299f, -0.004611f, 0.014515f, -0.009930f, 0.003954f, 0.001391f, -0.011459f, 0.028259f, -0.024539f, -0.002225f, 0.011189f, -0.006414f, 0.018466f, -0.008310f, -0.003490f, 0.004785f, -0.046619f, -0.070644f, 0.092495f, 0.287606f, 0.024858f, 0.024799f, -0.196037f, -0.248499f, -0.051529f, -0.052860f, 0.146397f, 0.248573f, 0.127878f, 0.024277f, -0.089889f, -0.175539f, -0.123532f, -0.088761f, -0.004452f, 0.120902f, 0.177304f, 0.095392f, 0.022056f, -0.062495f, -0.110313f, -0.062218f, -0.059395f, -0.056118f, 0.035291f, 0.071766f, 0.071217f, 0.071239f, 0.017287f, -0.031536f, -0.012714f, -0.047710f, -0.073909f, -0.008696f, -0.022039f, + -0.015449f, 0.066745f, 0.038017f, 0.055740f, 0.033243f, -0.025335f, -0.061450f, -0.014724f, -0.040190f, -0.006205f, 0.026968f, 0.008351f, 0.014212f, 0.030012f, -0.016073f, -0.021596f, -0.005762f, -0.012810f, 0.011276f, 0.019196f, 0.000082f, 0.023704f, 0.013204f, -0.025659f, -0.025458f, -0.039203f, -0.034400f, 0.000846f, 0.038446f, 0.059731f, 0.027451f, 0.006642f, -0.016070f, -0.041868f, -0.009383f, -0.047602f, -0.031063f, 0.018870f, 0.010605f, 0.016098f, -0.002394f}, + {-0.007491f, -0.009914f, -0.014262f, -0.001612f, -0.005520f, -0.010006f, -0.004871f, -0.002339f, 0.002262f, -0.004793f, -0.010060f, -0.000817f, 0.002831f, -0.010019f, -0.005229f, -0.001949f, -0.005601f, -0.005813f, 0.004409f, -0.000638f, 0.000979f, -0.005117f, -0.005208f, -0.001320f, -0.008094f, 0.005590f, -0.008180f, 0.002456f, -0.002021f, 0.003211f, -0.003888f, 0.000958f, 0.002681f, -0.011142f, -0.001998f, 0.001271f, 0.012177f, -0.005574f, -0.001031f, -0.001967f, -0.000022f, 0.004674f, -0.001686f, -0.005188f, -0.000758f, -0.001715f, 0.003714f, -0.001462f, -0.004362f, 0.004516f, 0.004193f, 0.002189f, 0.000978f, -0.003072f, 0.005498f, 0.003996f, -0.006541f, 0.004122f, -0.004635f, -0.002133f, -0.000776f, -0.003721f, -0.001192f, 0.000656f, 0.001412f, 0.004636f, -0.003757f, -0.003039f, -0.000657f, 0.000762f, -0.003298f, -0.010259f, -0.001808f, -0.003812f, -0.001863f, -0.001430f, 0.001882f, 0.002325f, 0.006393f, 0.004997f, -0.001661f, 0.003831f, 0.001822f, 0.011018f, -0.001921f, -0.000284f, 0.001389f, 0.008066f, -0.001589f, -0.008396f, -0.003902f, -0.008060f, 0.001975f, -0.002864f, -0.000662f, -0.001012f, + 0.001965f, 0.000784f, 0.001659f, 0.004678f, 0.008618f, -0.003818f, -0.002082f, 0.001714f, -0.004018f, -0.000564f, 0.006747f, -0.003649f, 0.008337f, 0.000842f, -0.002914f, 0.005486f, -0.007443f, -0.001946f, -0.005155f, 0.007319f, -0.000129f, -0.002746f, -0.001895f, 0.000049f, 0.006943f, 0.000229f, 0.008349f, 0.003100f, -0.006605f, 0.005403f, -0.002784f, -0.005123f, -0.003930f, 0.005530f, -0.000956f, 0.017810f, 0.002147f, 0.004378f, 0.003539f, -0.008499f, 0.000442f, -0.001406f, 0.002549f, -0.004947f, -0.002787f, 0.009094f, 0.008136f, 0.000399f, 0.003751f, -0.001214f, 0.005445f, -0.008155f, 0.001630f, 0.005191f, 0.004746f, -0.000266f, 0.001025f, 0.002454f, -0.013447f, -0.012556f, -0.007446f, -0.007200f, -0.005817f, 0.002125f, 0.008879f, 0.017394f, 0.003634f, 0.004352f, 0.000236f, -0.012729f, -0.004972f, -0.004831f, -0.010983f, 0.017386f, 0.004969f, 0.006815f, 0.005135f, -0.004030f, 0.002115f, 0.016658f, 0.007047f, -0.004090f, 0.000030f, -0.004208f, 0.000721f, -0.007903f, 0.005059f, -0.002574f, -0.003088f, 0.000548f, 0.009339f, 0.000831f, 0.003542f, 0.005486f, 0.008183f, -0.013975f, + 0.000641f, 0.003420f, 0.008550f, 0.012303f, -0.006403f, -0.001499f, -0.002825f, 0.010246f, 0.006143f, 0.006571f, -0.000542f, 0.002991f, 0.021276f, -0.013177f, 0.003232f, 0.001105f, -0.008100f, 0.003600f, -0.011542f, -0.001777f, 0.003829f, -0.002792f, -0.017678f, 0.004991f, 0.002036f, -0.005175f, -0.004301f, -0.001085f, -0.001928f, 0.005935f, -0.004955f, -0.002928f, 0.002741f, -0.000619f, -0.004710f, -0.000805f, 0.005661f, -0.008332f, 0.001727f, -0.002939f, 0.018063f, 0.002084f, 0.006163f, -0.000329f, -0.005477f, 0.000830f, 0.012518f, 0.007088f, 0.007885f, 0.013878f, -0.006482f, 0.000535f, 0.012533f, 0.004569f, 0.005190f, 0.001121f, 0.001044f, 0.008028f, -0.007512f, -0.001690f, 0.009137f, -0.006278f, 0.003203f, 0.005865f, -0.004754f, 0.004386f, 0.012418f, -0.005876f, 0.004184f, 0.001326f, -0.000136f, 0.000445f, -0.003371f, -0.008635f, -0.003423f, -0.007208f, -0.001465f, 0.003351f, 0.005553f, 0.006817f, -0.001893f, -0.010966f, -0.001741f, 0.016476f, -0.006775f, 0.003448f, -0.003672f, -0.017013f, 0.009255f, 0.002627f, 0.006664f, -0.001163f, 0.007683f, 0.008307f, -0.015392f, 0.005845f, + -0.000373f, 0.005447f, -0.001910f, -0.010298f, -0.001327f, -0.001564f, -0.002727f, -0.002117f, 0.005680f, -0.000303f, 0.000431f, 0.012867f, 0.001742f, 0.010003f, -0.000441f, 0.000277f, 0.001342f, -0.006885f, -0.009470f, 0.029939f, 0.017459f, 0.025535f, 0.008810f, -0.011243f, 0.005878f, -0.005318f, 0.001071f, 0.002005f, -0.021832f, -0.006446f, -0.005803f, 0.005155f, 0.008979f, -0.004175f, -0.000258f, 0.002314f, 0.000932f, 0.015217f, -0.001540f, -0.017284f, 0.005600f, -0.010297f, 0.007548f, 0.007716f, 0.006862f, 0.009081f, -0.002247f, -0.004157f, 0.004072f, -0.003731f, -0.003801f, 0.002011f, -0.002543f, 0.005048f, 0.008452f, -0.004519f, -0.012813f, 0.003222f, -0.012490f, -0.008954f, -0.001637f, -0.026867f, 0.000155f, -0.005376f, 0.010028f, 0.008648f, 0.004523f, 0.014787f, 0.015774f, 0.005953f, 0.003331f, -0.002321f, 0.000518f, -0.000313f, -0.007536f, 0.013552f, -0.002311f, 0.003829f, -0.005074f, -0.007039f, -0.002455f, -0.009930f, 0.007009f, -0.005462f, -0.003640f, 0.012887f, -0.012660f, -0.005481f, 0.002475f, -0.007473f, -0.002333f, -0.002584f, 0.004400f, 0.003517f, 0.003317f, 0.006784f, + -0.012571f, -0.025595f, -0.010525f, -0.001745f, 0.002763f, -0.002263f, 0.007039f, -0.000721f, 0.011993f, -0.010665f, 0.005864f, -0.001832f, 0.022922f, 0.011121f, -0.006284f, -0.009174f, 0.004493f, -0.013504f, -0.008866f, 0.006740f, -0.006206f, -0.007592f, 0.015529f, 0.008046f, -0.002020f, -0.006515f, -0.011429f, 0.008188f, 0.004343f, 0.006420f, -0.001522f, -0.001392f, -0.007468f, 0.010964f, -0.013808f, -0.004245f, -0.001660f, 0.010297f, 0.005867f, 0.000608f, 0.008925f, 0.002539f, -0.005732f, 0.003336f, -0.005708f, -0.003518f, -0.006673f, 0.008393f, -0.006204f, 0.001224f, 0.008263f, 0.015315f, 0.013188f, 0.007295f, 0.004021f, 0.000598f, 0.007048f, -0.001655f, 0.010593f, -0.000365f, 0.006417f, 0.007420f, -0.005711f, 0.002420f, -0.006135f, 0.007578f, 0.004047f, 0.004072f, -0.002603f, -0.007424f, 0.006142f, -0.007980f, -0.001891f, -0.008360f, 0.003787f, 0.003232f, -0.001328f, -0.003500f, -0.012655f, -0.025846f, -0.021302f, 0.001541f, -0.018245f, -0.008637f, -0.025741f, -0.013345f, -0.015801f, 0.006395f, -0.008579f, -0.010824f, -0.004071f, 0.000816f, -0.006853f, -0.024534f, 0.006334f, -0.004171f, + 0.002167f, -0.010996f, 0.010837f, 0.004340f, -0.000086f, -0.009762f, -0.004788f, 0.012864f, 0.008273f, 0.000764f, -0.002259f, -0.008291f, 0.004912f, 0.002954f, 0.005087f, -0.009961f, -0.001359f, -0.008048f, -0.007842f, -0.007863f, 0.000396f, 0.016631f, -0.013841f, 0.000523f, -0.013226f, 0.001550f, 0.005437f, 0.007698f, -0.013962f, 0.013791f, 0.015871f, -0.005124f, -0.004472f, -0.002557f, -0.001243f, 0.005551f, 0.006000f, 0.002004f, 0.003850f, -0.007603f, -0.002250f, -0.002529f, 0.013387f, -0.003926f, 0.014846f, 0.000166f, -0.005639f, 0.013127f, -0.002210f, -0.006683f, 0.001677f, 0.014457f, 0.014469f, 0.000031f, -0.006094f, -0.006822f, 0.003978f, -0.020607f, -0.019585f, -0.023616f, 0.007269f, -0.019215f, -0.007349f, 0.017565f, 0.009248f, -0.020819f, -0.000910f, -0.000265f, 0.009404f, 0.012844f, 0.023196f, -0.006620f, -0.007714f, -0.022825f, -0.026978f, -0.016687f, -0.005061f, 0.010709f, -0.010671f, 0.004902f, -0.015349f, 0.015947f, -0.011403f, 0.012706f, -0.005660f, 0.001352f, 0.003907f, -0.003159f, -0.011240f, 0.018030f, -0.015544f, -0.001332f, -0.008076f, 0.001736f, -0.009485f, 0.001746f, + -0.039629f, 0.000095f, 0.019133f, -0.024434f, 0.005924f, 0.015725f, 0.006330f, -0.013027f, -0.000908f, 0.019017f, -0.023715f, -0.000715f, 0.010376f, 0.008844f, 0.009778f, -0.004171f, -0.003034f, -0.016353f, -0.007304f, 0.005672f, 0.011126f, 0.016221f, 0.021169f, -0.031354f, 0.012034f, -0.010097f, 0.002629f, -0.022482f, -0.008397f, 0.016671f, 0.004627f, 0.001244f, -0.011614f, -0.001386f, 0.011483f, 0.006573f, 0.004781f, 0.002236f, 0.024107f, 0.039817f, 0.022384f, 0.025903f, 0.004121f, 0.009102f, 0.035206f, -0.001246f, 0.001209f, 0.023844f, -0.011566f, -0.000089f, 0.007068f, 0.011814f, 0.019966f, -0.016253f, -0.022787f, 0.012517f, 0.007219f, -0.013480f, 0.003054f, 0.008049f, -0.004913f, 0.004565f, -0.012153f, -0.002936f, -0.014220f, 0.004303f, 0.015974f, 0.004756f, 0.014035f, 0.010523f, 0.011481f, -0.027448f, 0.001710f, 0.031662f, -0.003487f, -0.000696f, 0.029945f, -0.004029f, -0.000710f, 0.004271f, -0.003542f, -0.000983f, 0.016793f, 0.025657f, -0.024885f, -0.004223f, 0.005512f, -0.007856f, 0.012451f, -0.004096f, 0.001726f, 0.001820f, -0.004911f, 0.022644f, -0.002233f, -0.008273f, + 0.009249f, -0.008546f, -0.013308f, 0.004942f, 0.016409f, 0.005956f, -0.000625f, 0.003314f, 0.016056f, 0.007999f, 0.014745f, 0.004395f, 0.003455f, 0.000419f, -0.010744f, -0.001894f, -0.007251f, 0.067067f, 0.009759f, -0.001793f, 0.000027f, -0.032695f, -0.009005f, 0.002826f, -0.007058f, 0.014011f, 0.006805f, 0.022905f, -0.002398f, -0.000183f, -0.004415f, -0.009979f, 0.016142f, 0.002755f, 0.006583f, 0.008583f, 0.012832f, -0.011547f, -0.010812f, -0.013395f, -0.008526f, -0.007683f, -0.002570f, -0.018317f, -0.002781f, 0.029524f, 0.014763f, -0.005595f, -0.001117f, -0.003422f, 0.003383f, 0.010538f, -0.004157f, 0.042303f, -0.006335f, -0.001015f, -0.018109f, 0.007817f, 0.019500f, -0.002974f, -0.012955f, -0.001607f, 0.008282f, 0.014384f, 0.007348f, 0.020148f, 0.030976f, 0.009980f, 0.000733f, 0.017971f, 0.015833f, 0.005759f, 0.012635f, -0.036582f, 0.010170f, 0.001416f, -0.031056f, 0.012492f, 0.001005f, -0.013603f, 0.011108f, -0.014429f, -0.012542f, 0.017908f, 0.015817f, -0.007146f, -0.026621f, -0.012542f, 0.009512f, -0.016122f, -0.000567f, 0.007658f, 0.031622f, -0.004923f, -0.034410f, 0.021202f, + -0.002779f, -0.024383f, 0.000473f, 0.019681f, -0.022545f, -0.006324f, -0.017877f, 0.011559f, 0.005620f, -0.008337f, -0.006732f, -0.004165f, 0.014383f, 0.008658f, 0.007073f, 0.012224f, 0.013325f, 0.000065f, 0.015792f, 0.015169f, 0.008369f, 0.007926f, -0.014925f, -0.009176f, -0.009855f, 0.009236f, 0.015114f, 0.003780f, 0.005903f, -0.008842f, -0.003973f, -0.005762f, -0.002446f, -0.014992f, 0.014773f, 0.002099f, 0.002752f, -0.015899f, -0.002549f, 0.023177f, -0.015247f, -0.019133f, -0.026181f, 0.009186f, -0.019074f, 0.030115f, 0.037704f, 0.023949f, 0.016549f, 0.000900f, 0.030064f, -0.015077f, 0.024184f, -0.003127f, -0.013160f, 0.000986f, 0.003779f, -0.033453f, -0.012279f, 0.012701f, 0.004623f, -0.005289f, 0.007888f, 0.028697f, 0.022169f, -0.031194f, -0.004970f, 0.001075f, 0.002583f, 0.011649f, 0.017525f, 0.003060f, -0.021402f, 0.016921f, -0.008529f, -0.028453f, 0.001478f, 0.004879f, 0.017258f, 0.005602f, 0.046432f, 0.009208f, -0.021237f, -0.004797f, -0.018099f, 0.031897f, -0.040276f, -0.001828f, 0.025422f, -0.057001f, -0.024566f, -0.018109f, -0.021912f, -0.037198f, 0.002287f, -0.005082f, + -0.018071f, -0.000361f, 0.017034f, 0.004111f, 0.001076f, -0.009654f, 0.003206f, -0.002028f, 0.003185f, 0.001912f, 0.001566f, 0.016931f, -0.004986f, 0.001030f, 0.029195f, -0.017749f, -0.005309f, 0.007313f, 0.024967f, -0.011726f, 0.036219f, -0.009241f, -0.016495f, -0.029971f, -0.043156f, -0.009980f, -0.032463f, 0.017464f, -0.010780f, -0.021042f, 0.001856f, 0.006171f, 0.015881f, 0.017025f, 0.004741f, -0.000433f, 0.051785f, 0.032006f, -0.004716f, 0.007856f, 0.016830f, 0.016355f, 0.007467f, -0.004367f, -0.002408f, -0.006631f, -0.013749f, -0.008492f, 0.006679f, 0.044444f, -0.030233f, -0.004149f, -0.017584f, 0.032486f, -0.022585f, -0.024307f, 0.014198f, -0.011691f, -0.041800f, 0.019851f, -0.011650f, 0.015509f, -0.011244f, 0.019857f, 0.015671f, 0.016194f, 0.029563f, 0.002949f, 0.025133f, 0.007969f, 0.007199f, 0.014589f, 0.006578f, 0.002640f, 0.002053f, -0.002600f, -0.014489f, 0.011675f, -0.030329f, 0.011570f, 0.004001f, -0.011033f, -0.016070f, -0.002628f, 0.012687f, -0.016161f, -0.005199f, -0.023123f, -0.007494f, -0.028006f, 0.002125f, 0.011567f, 0.000197f, -0.005921f, -0.015837f, -0.030947f, + -0.020173f, 0.019270f, 0.007648f, -0.012120f, -0.016014f, -0.007014f, -0.001157f, -0.030783f, 0.023448f, 0.017970f, -0.027218f, -0.029898f, -0.043427f, -0.010228f, -0.052041f, 0.010140f, 0.019857f, 0.006586f, -0.003692f, -0.010890f, -0.005971f, 0.016728f, 0.020701f, 0.019958f, -0.017198f, -0.018069f, 0.015264f, -0.012809f, -0.009464f, -0.036536f, 0.011231f, 0.018120f, 0.025356f, -0.013899f, 0.038788f, 0.050468f, -0.021465f, 0.001626f, 0.010398f, -0.035946f, -0.009644f, 0.050905f, -0.000743f, -0.049559f, 0.003373f, 0.019010f, -0.003594f, 0.021165f, 0.040746f, -0.014641f, 0.036648f, 0.024156f, 0.030989f, 0.012445f, -0.027602f, -0.023891f, 0.019578f, -0.021317f, -0.040706f, -0.007877f, -0.047933f, 0.013507f, -0.005111f, 0.019777f, 0.012014f, 0.013585f, 0.003226f, 0.001806f, -0.000626f, 0.027058f, 0.009496f, -0.041133f, -0.007115f, 0.019007f, 0.027095f, 0.020164f, 0.034031f, 0.036478f, 0.023546f, -0.007672f, -0.006053f, 0.011123f, 0.063506f, -0.022735f, 0.003094f, 0.018556f, 0.023914f, -0.005636f, -0.037903f, -0.002509f, -0.010783f, -0.016518f, -0.041737f, -0.038235f, 0.010371f, -0.018737f, + -0.020214f, 0.017465f, 0.032760f, 0.048981f, -0.000995f, 0.004540f, -0.002443f, 0.040124f, -0.024276f, -0.003090f, 0.036114f, -0.032821f, 0.001506f, -0.022069f, -0.026592f, 0.015271f, 0.010239f, 0.020723f, -0.024656f, -0.060903f, -0.012189f, -0.022390f, -0.017718f, -0.013985f, 0.004523f, -0.022026f, -0.015374f, 0.003901f, 0.014963f, -0.014483f, 0.033104f, -0.005156f, 0.022773f, -0.012356f, 0.000550f, 0.016306f, -0.024010f, -0.017925f, -0.006979f, 0.025188f, -0.004688f, -0.031367f, -0.009364f, 0.002699f, -0.012535f, 0.010515f, -0.018021f, -0.021739f, 0.030834f, 0.006637f, -0.021152f, 0.012159f, -0.000935f, -0.019924f, 0.000081f, -0.031857f, -0.023987f, 0.003289f, 0.046881f, 0.016304f, 0.015881f, -0.037969f, 0.029653f, -0.005095f, 0.023153f, -0.014510f, -0.023278f, 0.010253f, -0.044501f, 0.036709f, -0.060909f, -0.041833f, 0.016378f, 0.032429f, 0.004512f, 0.039172f, -0.016271f, 0.008558f, -0.026891f, 0.036396f, 0.014285f, 0.026297f, 0.015087f, 0.004012f, -0.007312f, -0.012710f, -0.017126f, -0.010048f, 0.000816f, -0.037473f, -0.017485f, -0.002176f, -0.044272f, -0.005194f, 0.010288f, -0.044952f, + -0.041059f, 0.003544f, 0.017436f, -0.021561f, -0.093492f, -0.020254f, -0.000232f, 0.011560f, -0.031529f, 0.001993f, -0.017546f, -0.004489f, -0.025184f, -0.029074f, 0.025109f, -0.028349f, -0.033691f, -0.006652f, -0.023641f, -0.026931f, 0.008798f, -0.038720f, -0.012649f, 0.021599f, 0.051787f, 0.040848f, -0.002312f, -0.026874f, 0.008626f, 0.036532f, -0.002180f, 0.023802f, -0.007720f, 0.030272f, 0.017249f, -0.034035f, 0.051166f, -0.041037f, -0.021571f, 0.033254f, -0.039223f, 0.009906f, -0.009709f, -0.030688f, 0.002442f, 0.041989f, -0.010155f, -0.027694f, 0.015255f, 0.019494f, -0.001884f, 0.006794f, -0.064423f, 0.013014f, 0.001133f, 0.029491f, 0.013762f, -0.030085f, 0.025679f, -0.017293f, -0.004343f, -0.028330f, 0.011489f, 0.034077f, -0.009939f, -0.010362f, -0.040407f, -0.056836f, 0.027702f, -0.007463f, 0.021618f, -0.033320f, 0.019509f, 0.013027f, -0.038273f, 0.032920f, 0.037909f, -0.098062f, 0.038508f, 0.046060f, -0.009875f, 0.031313f, 0.002132f, 0.015073f, -0.005280f, -0.022067f, -0.010207f, 0.017946f, 0.007310f, -0.030018f, -0.015421f, -0.004943f, -0.010416f, -0.009459f, -0.000412f, 0.056777f, + 0.014469f, 0.010718f, -0.034006f, 0.023092f, -0.023447f, -0.001997f, 0.007220f, -0.042378f, 0.021337f, -0.017213f, 0.004769f, -0.018582f, -0.026204f, -0.001607f, 0.021933f, 0.052420f, 0.022486f, 0.003291f, 0.036713f, 0.011940f, -0.001253f, 0.003147f, 0.003735f, 0.007133f, 0.008479f, 0.034732f, 0.019246f, 0.008770f, 0.009161f, -0.007260f, -0.008474f, -0.039124f, -0.027586f, 0.001725f, -0.001170f, -0.025165f, 0.006517f, 0.024842f, -0.038481f, 0.037801f, 0.013947f, -0.017631f, 0.001969f, -0.013636f, 0.000451f, 0.021617f, 0.014718f, 0.004964f, -0.024228f, -0.008990f, -0.034374f, -0.015479f, 0.015718f, 0.010253f, 0.019374f, -0.021951f, -0.084530f, 0.131219f, -0.129816f, -0.059459f, -0.029378f, -0.009491f, 0.076538f, 0.021748f, 0.085600f, 0.020612f, -0.017188f, 0.066477f, 0.029291f, -0.023534f, 0.031671f, 0.027692f, 0.016064f, 0.025809f, 0.025945f, -0.023985f, -0.037225f, -0.027490f, 0.004268f, -0.025408f, 0.012789f, 0.006574f, 0.016553f, -0.003730f, 0.011343f, 0.002710f, 0.041638f, 0.008688f, 0.003634f, 0.011587f, -0.010137f, -0.001958f, 0.014347f, -0.027716f, -0.037877f, -0.026913f, + -0.022321f, 0.002140f, 0.010430f, -0.028005f, -0.005027f, -0.017594f, -0.065613f, 0.030804f, -0.012632f, 0.014593f, -0.035104f, -0.013601f, -0.032705f, -0.045398f, 0.015079f, 0.009209f, 0.040692f, -0.004215f, 0.035527f, -0.018261f, 0.029323f, 0.000923f, 0.042386f, -0.034363f, 0.025230f, 0.029749f, 0.015727f, 0.015586f, -0.001265f, -0.017424f, 0.048556f, 0.030200f, -0.007466f, 0.057187f, 0.010048f, 0.000280f, 0.020258f, 0.024918f, 0.080605f, 0.006900f, -0.048152f, -0.071128f, -0.037341f, -0.029538f, 0.010086f, 0.059199f, -0.000317f, -0.024531f, 0.053490f, 0.004834f, -0.041682f, 0.038914f, 0.042615f, -0.006915f, 0.000400f, -0.003231f, -0.036381f, 0.042808f, 0.003831f, 0.024800f, -0.011675f, -0.032438f, -0.056858f, 0.011884f, 0.009344f, 0.010366f, -0.006167f, 0.019825f, -0.017214f, 0.001253f, -0.035112f, -0.045250f, 0.019106f, -0.004257f, 0.017768f, -0.005006f, -0.014298f, -0.040555f, -0.062516f, 0.035686f, -0.033245f, 0.017112f, 0.035442f, -0.000118f, -0.012889f, -0.030143f, -0.018945f, 0.078027f, 0.021871f, -0.001147f, 0.014830f, -0.007647f, -0.025297f, -0.007644f, 0.049676f, -0.040051f, + -0.065331f, -0.022525f, -0.016060f, -0.097744f, -0.071111f, -0.039767f, -0.035780f, 0.013028f, 0.007953f, -0.032785f, -0.057668f, -0.024692f, -0.021573f, -0.021480f, -0.007323f, -0.013234f, -0.028031f, -0.040020f, 0.042989f, -0.037808f, 0.057547f, -0.008815f, 0.054969f, 0.075711f, -0.011991f, -0.086743f, -0.079449f, -0.019829f, 0.041691f, 0.003209f, -0.061770f, 0.048317f, -0.008488f, -0.044175f, 0.054289f, -0.099290f, -0.017879f, -0.001504f, -0.014637f, -0.016863f, 0.120593f, -0.051339f, 0.113194f, -0.007296f, 0.025922f, -0.009933f, -0.040989f, 0.069143f, 0.021497f, 0.072052f, -0.047733f, -0.051208f, 0.018813f, -0.081583f, -0.021281f, -0.014162f, -0.053008f, 0.114874f, -0.007331f, -0.121397f, 0.000955f, -0.054543f, 0.018479f, 0.028919f, 0.051069f, 0.038646f, -0.044727f, -0.030114f, -0.071148f, -0.021818f, -0.031419f, 0.031798f, 0.023818f, -0.003654f, 0.024697f, -0.014140f, -0.049559f, -0.020481f, -0.058277f, 0.064222f, -0.044318f, -0.030845f, 0.059513f, 0.015784f, 0.098586f, 0.049341f, 0.011837f, 0.054304f, -0.063589f, -0.020046f, -0.065259f, -0.060959f, -0.005183f, -0.000750f, -0.077992f, 0.101184f, + -0.004931f, -0.158306f, 0.082089f, 0.018150f, -0.033328f, -0.026254f, 0.051070f, 0.027132f, -0.029627f, -0.008834f, -0.073334f, -0.031558f, 0.032495f, -0.064634f, 0.003470f, 0.011057f, -0.018531f, -0.043224f, -0.028062f, 0.057201f, 0.024353f, -0.011974f, -0.081541f, 0.027661f, 0.053483f, 0.029714f, -0.062689f, -0.043088f, 0.001803f, 0.069453f, 0.007849f, -0.017231f, 0.012727f, 0.001915f, 0.037503f, -0.093351f, -0.078520f, 0.099259f, 0.017521f, 0.041328f, -0.092531f, 0.020293f, -0.001923f, 0.069088f, -0.059769f, -0.012275f, -0.092305f, 0.032830f, 0.071300f, 0.015634f, -0.039141f, 0.026759f, 0.102621f, -0.045018f, -0.043856f, -0.037729f, 0.017937f, 0.003523f, 0.091278f, -0.026733f, 0.011193f, -0.047804f, 0.020364f, -0.052477f, 0.003774f, 0.031959f, -0.058270f, 0.060210f, 0.025581f, -0.046341f, -0.061687f, -0.044318f, 0.005906f, 0.059421f, -0.100621f, -0.028326f, 0.117760f, 0.105011f, 0.052570f, 0.025038f, 0.023371f, 0.026131f, -0.017252f, -0.015243f, -0.035780f, 0.005633f, 0.010730f, 0.010450f, -0.002618f, -0.058607f, 0.028191f, 0.013106f, -0.042080f, -0.033946f, -0.018431f, -0.019226f, + 0.015186f, -0.013957f, -0.017928f, 0.006666f, -0.001659f, -0.030238f, 0.040647f, -0.027646f, -0.009519f, -0.028749f, -0.027557f, 0.021543f, -0.011647f, -0.002253f, 0.010453f, 0.014735f, -0.003039f, -0.038657f, 0.010040f, 0.065015f, 0.013978f, -0.097134f, -0.005657f, -0.019554f, -0.030057f, 0.022846f, 0.023206f, 0.053289f, 0.025692f, -0.062553f, 0.071232f, -0.015272f, -0.047233f, 0.148041f, -0.027881f, -0.010339f, -0.046392f, -0.113830f, 0.055110f, 0.061128f, 0.021695f, 0.024477f, -0.096608f, 0.031089f, -0.004818f, -0.021752f, -0.014095f, 0.006285f, -0.005531f, 0.017874f, 0.023435f, 0.006504f, -0.009326f, -0.025925f, 0.036526f, 0.040174f, 0.060006f, -0.056538f, -0.145124f, -0.237782f, 0.015081f, 0.244399f, 0.018091f, 0.517707f, 0.517085f, 0.188836f, 0.518008f, 0.302417f, -0.096538f, -0.011235f, -0.056529f, -0.401813f, -0.339839f, -0.236441f, -0.424013f, -0.400426f, -0.124535f, -0.255200f, -0.229368f, 0.041129f, 0.054995f, -0.062516f, 0.061530f, 0.102653f, -0.016634f, -0.003328f, 0.206828f, 0.137292f, 0.038158f, 0.152234f, 0.290175f, 0.131046f, 0.149339f, 0.367583f, 0.128640f, 0.050958f, + 0.307251f, 0.300537f, -0.012751f, 0.183327f, 0.333767f, -0.022782f, 0.061226f, 0.189320f, -0.041529f, -0.203537f, 0.051388f, -0.067082f, -0.376432f, -0.348488f, -0.331150f, -0.599368f, -0.877141f, -0.619351f, -0.858669f, -1.122897f, -0.814935f, -0.666060f, -0.893304f, -0.587591f, -0.322311f, -0.309002f, -0.121030f, 0.177932f, 0.416901f, 0.485866f, 0.661613f, 0.936922f, 0.898548f, 0.842169f, 0.935298f, 0.925396f, 0.677728f, 0.460289f, 0.266255f, -0.051362f, -0.050862f} + }, + { + {-0.004310f, 0.003591f, -0.009964f, 0.002957f, 0.004525f, 0.000052f, -0.004545f, 0.000605f, -0.001540f, -0.005226f, 0.013663f, 0.004369f, 0.003985f, 0.008358f, -0.003890f, -0.000867f, 0.000783f, -0.005747f, 0.010686f, -0.004067f, 0.001112f, -0.006109f, -0.001305f, 0.006301f, 0.000055f, 0.000470f, -0.002272f, 0.000869f, -0.007551f, 0.007910f, -0.006061f, 0.001772f, 0.005048f, -0.001075f, -0.004828f, 0.009149f, -0.000112f, -0.007862f, -0.000951f, -0.009100f, 0.003816f, -0.009680f, -0.004640f, 0.000986f, 0.002160f, 0.001496f, 0.002086f, 0.004356f, 0.006723f, -0.000797f, 0.004442f, 0.004666f, 0.003382f, -0.000126f, -0.003774f, 0.004692f, 0.001282f, 0.002884f, -0.005002f, 0.009156f, 0.007367f, -0.000719f, -0.004722f, -0.000760f, -0.000374f, -0.001779f, -0.005434f, -0.011035f, -0.001825f, 0.007026f, 0.006426f, 0.002855f, 0.013701f, -0.002339f, 0.000407f, -0.005442f, 0.019052f, -0.000757f, -0.001063f, 0.006108f, -0.002535f, 0.006963f, -0.003747f, -0.008911f, 0.003063f, 0.008952f, 0.001240f, -0.001405f, 0.011805f, 0.000379f, 0.000392f, -0.004095f, -0.002371f, 0.018493f, 0.002463f, -0.012643f, + -0.009431f, 0.013006f, -0.001325f, 0.013478f, 0.000810f, -0.002671f, -0.001427f, 0.010135f, 0.001868f, 0.021381f, 0.009301f, 0.005786f, -0.001334f, 0.004629f, 0.009542f, -0.002554f, -0.007443f, -0.009284f, -0.001948f, 0.008016f, 0.006849f, 0.010743f, 0.002857f, -0.006354f, -0.006601f, -0.002901f, 0.004335f, -0.001736f, 0.002267f, -0.001538f, -0.010010f, -0.007838f, 0.002712f, 0.006779f, 0.004096f, -0.003893f, -0.004321f, -0.000668f, 0.010317f, 0.004979f, -0.001497f, -0.002847f, 0.004578f, 0.002814f, 0.001740f, -0.005987f, 0.002320f, 0.004467f, -0.001101f, 0.007068f, 0.008682f, -0.016891f, 0.005296f, 0.002228f, 0.009708f, 0.005050f, 0.008683f, 0.017752f, -0.014352f, 0.003001f, -0.002885f, -0.000093f, -0.018522f, 0.001602f, 0.011703f, -0.017068f, -0.003119f, 0.010935f, 0.030124f, 0.003994f, 0.000172f, 0.001853f, -0.018257f, -0.000856f, 0.014128f, 0.011949f, 0.000731f, -0.000625f, 0.001536f, 0.006172f, 0.011130f, 0.011077f, 0.012630f, -0.005664f, 0.003068f, -0.000942f, 0.005146f, 0.001131f, 0.003482f, -0.019089f, -0.004728f, 0.002785f, 0.002011f, -0.010612f, 0.000142f, 0.006999f, + -0.007832f, 0.006447f, 0.006566f, 0.011088f, 0.005758f, -0.004373f, 0.006118f, 0.012440f, -0.006462f, -0.011355f, 0.004354f, 0.002588f, 0.002789f, 0.005921f, -0.004406f, -0.009123f, -0.012992f, 0.011042f, -0.001369f, -0.002503f, -0.003740f, 0.004933f, 0.000563f, 0.007275f, 0.014885f, 0.003035f, 0.001803f, -0.000538f, -0.002477f, -0.010742f, 0.018155f, 0.004495f, -0.000810f, 0.009097f, 0.000191f, -0.008689f, -0.007860f, -0.009448f, -0.013833f, 0.007795f, -0.000364f, -0.006376f, -0.002792f, -0.003194f, 0.002762f, -0.005286f, -0.009582f, 0.002259f, -0.006311f, 0.016132f, 0.021063f, 0.016946f, -0.011878f, -0.000343f, -0.001006f, 0.004601f, -0.006710f, 0.013297f, 0.008029f, -0.001802f, 0.006135f, 0.010092f, 0.000542f, 0.002496f, 0.003219f, 0.009791f, -0.001216f, 0.003672f, 0.011353f, 0.001229f, -0.000435f, -0.005053f, 0.008069f, -0.012633f, 0.004792f, -0.001759f, -0.002932f, 0.008437f, -0.008491f, -0.001038f, -0.000066f, -0.011023f, 0.004206f, -0.002254f, 0.004718f, -0.000406f, -0.005147f, 0.003275f, 0.003094f, -0.000666f, 0.009353f, -0.000806f, 0.010837f, -0.000302f, -0.007955f, -0.003500f, + -0.000048f, -0.005319f, 0.009551f, 0.004999f, 0.008098f, 0.009481f, -0.004848f, -0.010086f, -0.006945f, -0.000529f, -0.002468f, -0.002784f, 0.007222f, 0.008973f, -0.002436f, -0.028436f, -0.006361f, -0.009052f, -0.014952f, 0.004905f, 0.004260f, -0.002102f, 0.007351f, -0.001271f, 0.006245f, 0.008147f, -0.003444f, -0.010143f, -0.012146f, -0.005034f, -0.011296f, 0.000603f, 0.001539f, -0.005342f, 0.006821f, -0.005969f, 0.003777f, -0.002900f, -0.006338f, -0.017847f, -0.006566f, 0.001237f, 0.003010f, 0.004276f, -0.006264f, 0.004318f, 0.007298f, 0.001991f, 0.016241f, 0.003632f, -0.000159f, 0.012028f, -0.008500f, 0.006791f, 0.001428f, -0.004532f, -0.005675f, 0.007610f, 0.001326f, 0.002141f, -0.018623f, -0.003873f, -0.005983f, 0.018564f, 0.008386f, 0.006418f, 0.007957f, 0.008282f, 0.007155f, 0.009217f, -0.004838f, -0.002524f, 0.006197f, 0.009014f, -0.000988f, 0.010587f, -0.005662f, 0.001911f, -0.002084f, 0.008844f, 0.014395f, -0.022523f, 0.006131f, -0.006041f, 0.001128f, -0.011012f, -0.004819f, 0.001021f, -0.002496f, -0.005207f, -0.007798f, -0.004534f, 0.011163f, 0.006584f, 0.004166f, -0.002240f, + 0.001095f, 0.001053f, 0.014397f, -0.011407f, 0.014453f, -0.002016f, 0.007985f, 0.014479f, -0.008900f, 0.011199f, -0.006822f, 0.005703f, 0.002473f, 0.017064f, 0.007862f, -0.009641f, -0.015439f, 0.003503f, -0.011489f, 0.009626f, -0.002102f, 0.012573f, -0.009087f, -0.001594f, -0.007195f, 0.004302f, 0.003173f, 0.003564f, -0.000562f, -0.001392f, -0.013327f, -0.006065f, 0.011709f, -0.009036f, -0.001386f, 0.007302f, 0.000811f, -0.007077f, 0.002784f, 0.000601f, -0.001069f, -0.006138f, 0.012877f, 0.003903f, -0.017007f, -0.007963f, -0.013591f, -0.002519f, -0.011916f, -0.021669f, -0.004265f, 0.009394f, 0.027349f, 0.005774f, 0.002944f, 0.012492f, 0.000457f, -0.009911f, -0.007753f, 0.006910f, 0.003633f, 0.004602f, 0.008657f, -0.019027f, -0.003592f, -0.017576f, -0.002672f, 0.004535f, -0.005616f, -0.016514f, 0.003040f, 0.006148f, -0.001824f, 0.030852f, 0.007096f, 0.022411f, -0.010585f, -0.001203f, -0.007568f, -0.001454f, 0.023418f, -0.019839f, 0.006611f, 0.002564f, 0.030748f, 0.016732f, 0.020380f, 0.004051f, -0.005183f, 0.009989f, -0.006810f, -0.025261f, 0.004815f, 0.001801f, 0.002967f, 0.020527f, + 0.001901f, -0.011484f, -0.001043f, 0.000910f, 0.006419f, 0.007372f, -0.000564f, -0.002241f, 0.008296f, -0.009232f, -0.002573f, -0.004463f, -0.002368f, 0.002919f, 0.000499f, 0.018206f, 0.002712f, 0.014397f, 0.016262f, 0.004904f, 0.014390f, -0.000594f, 0.004926f, 0.009086f, -0.009051f, -0.013439f, 0.002033f, 0.014471f, -0.022052f, 0.007126f, -0.016815f, -0.015577f, -0.009453f, -0.003990f, -0.014682f, -0.014182f, -0.015026f, -0.007509f, -0.003351f, 0.010808f, 0.000801f, 0.012838f, 0.002484f, -0.009918f, 0.016363f, -0.016043f, -0.005475f, -0.006545f, -0.005905f, -0.008541f, -0.010474f, 0.016285f, 0.013885f, -0.007197f, -0.015354f, -0.017841f, -0.008630f, -0.011436f, -0.004303f, -0.005447f, -0.018711f, -0.017206f, -0.012371f, -0.003344f, -0.000073f, -0.003799f, 0.014835f, 0.000060f, 0.008160f, 0.009212f, 0.013393f, 0.000569f, 0.025174f, 0.028842f, 0.000374f, 0.007328f, 0.007808f, -0.005134f, 0.014195f, 0.005680f, -0.026233f, -0.002433f, -0.008472f, 0.000013f, 0.021937f, 0.006767f, -0.020835f, -0.007412f, 0.010556f, 0.007917f, 0.002197f, 0.026103f, -0.010679f, 0.009448f, 0.012190f, 0.010570f, + 0.008070f, 0.012557f, -0.023692f, 0.007029f, -0.008777f, 0.012538f, 0.001306f, 0.004182f, -0.017642f, 0.011332f, 0.010505f, -0.004634f, 0.010175f, -0.003953f, 0.003328f, -0.002664f, -0.008928f, -0.000127f, -0.005493f, 0.003221f, -0.006953f, 0.006439f, 0.003545f, 0.020366f, 0.018181f, -0.009064f, 0.006814f, -0.023338f, 0.017403f, -0.009752f, 0.010807f, 0.013029f, 0.018327f, -0.005905f, 0.018402f, 0.001503f, 0.015908f, -0.014158f, -0.003771f, 0.012779f, -0.006817f, 0.021850f, -0.006989f, -0.015303f, 0.028903f, 0.039429f, 0.008709f, -0.015423f, 0.010832f, -0.008071f, 0.016127f, 0.009533f, -0.003554f, -0.016321f, -0.010804f, -0.027839f, 0.007300f, 0.012121f, -0.024738f, -0.002740f, 0.014324f, 0.003969f, -0.001239f, 0.000834f, -0.003072f, -0.013105f, 0.003202f, 0.016892f, 0.000623f, 0.003919f, 0.005942f, 0.023866f, -0.015553f, -0.000019f, 0.016994f, -0.015163f, 0.022842f, 0.001697f, 0.032127f, -0.026261f, -0.024284f, 0.013912f, 0.001064f, -0.002540f, 0.006781f, -0.001470f, 0.008806f, 0.006336f, 0.017732f, 0.017993f, -0.014331f, 0.003600f, -0.009472f, -0.004433f, 0.010441f, -0.000065f, + -0.005850f, -0.000959f, 0.000125f, 0.017654f, -0.031082f, 0.025194f, -0.007860f, -0.008280f, 0.016643f, -0.011452f, 0.013013f, -0.015761f, -0.011786f, 0.000322f, -0.016038f, 0.000372f, -0.019653f, -0.014713f, -0.006716f, -0.013802f, -0.021439f, -0.004331f, 0.007511f, 0.026203f, 0.004006f, -0.015632f, -0.029411f, -0.005988f, 0.008780f, -0.005013f, 0.031030f, 0.009929f, -0.011381f, -0.022081f, -0.028004f, -0.052376f, -0.004627f, -0.005741f, 0.019719f, 0.014895f, -0.011131f, 0.001387f, -0.008727f, -0.004525f, 0.018409f, -0.000495f, 0.000531f, -0.002306f, 0.020884f, 0.003603f, -0.006953f, -0.001093f, -0.001364f, 0.005745f, -0.020074f, -0.006185f, -0.008309f, 0.030728f, 0.006479f, -0.032466f, 0.007600f, -0.016900f, -0.010272f, 0.004664f, -0.031018f, 0.009259f, 0.020780f, 0.019135f, 0.013997f, 0.003517f, 0.004945f, -0.001147f, 0.001967f, -0.019201f, 0.005546f, -0.029977f, -0.007222f, 0.016799f, 0.004541f, 0.017183f, 0.015314f, 0.013920f, -0.011932f, -0.022337f, -0.021758f, -0.015302f, 0.001793f, 0.005397f, 0.006414f, 0.009382f, -0.002786f, 0.005683f, 0.013119f, 0.015366f, 0.027131f, 0.031479f, + 0.022723f, 0.038914f, -0.018201f, 0.027676f, -0.023677f, -0.018502f, 0.020462f, 0.026228f, 0.030896f, -0.031807f, -0.000180f, 0.008122f, -0.023612f, 0.011285f, -0.010374f, -0.016626f, 0.019094f, -0.024707f, 0.026955f, -0.025388f, 0.025254f, -0.018173f, -0.006730f, -0.001519f, -0.033357f, -0.004462f, 0.036827f, -0.009224f, -0.026278f, 0.005832f, 0.017114f, -0.018958f, 0.009529f, 0.040036f, 0.021426f, 0.008317f, 0.017632f, -0.020769f, 0.014083f, -0.012341f, -0.036230f, -0.010668f, -0.009460f, 0.003047f, 0.016460f, 0.020698f, -0.008979f, -0.015477f, 0.014490f, 0.000557f, 0.011092f, 0.007414f, -0.005896f, 0.002524f, -0.014411f, 0.002788f, 0.004595f, 0.000460f, 0.004742f, 0.033463f, -0.004043f, 0.004048f, 0.009385f, 0.002867f, 0.004064f, -0.015603f, -0.018156f, 0.013890f, -0.021574f, -0.027981f, -0.030700f, -0.024275f, -0.040894f, 0.015157f, 0.051045f, 0.026363f, -0.010624f, -0.039219f, -0.014836f, 0.003524f, 0.004733f, -0.006829f, 0.018852f, 0.014297f, -0.015457f, -0.006543f, -0.002818f, -0.025555f, 0.036070f, -0.015781f, 0.012298f, -0.002025f, -0.009562f, -0.031306f, 0.009754f, 0.007822f, + -0.004897f, 0.005030f, 0.013642f, -0.004154f, 0.035244f, -0.006929f, -0.006385f, 0.031300f, -0.004247f, -0.020421f, -0.020232f, -0.036129f, 0.004226f, -0.007044f, -0.012532f, -0.006870f, -0.028353f, -0.010177f, -0.026638f, 0.004067f, -0.023593f, 0.021769f, -0.013807f, 0.000962f, 0.005266f, 0.003947f, 0.010657f, -0.009407f, -0.028928f, 0.013544f, -0.004463f, 0.008404f, -0.007560f, -0.001264f, -0.000646f, 0.028277f, 0.038368f, 0.012453f, -0.014320f, 0.015434f, 0.012522f, 0.017519f, -0.008805f, -0.011715f, 0.017716f, 0.011289f, 0.024006f, 0.007927f, 0.003145f, 0.002227f, 0.002388f, 0.025292f, 0.016996f, 0.017231f, 0.075175f, 0.004327f, -0.023127f, 0.066964f, 0.030318f, 0.030991f, 0.053766f, 0.058333f, 0.013620f, 0.020277f, 0.011663f, 0.063210f, 0.000724f, -0.018850f, 0.023795f, 0.008181f, -0.026133f, -0.024069f, 0.020894f, 0.025261f, 0.041139f, -0.001610f, 0.000671f, 0.003282f, 0.003454f, -0.023180f, 0.026614f, 0.023055f, 0.006379f, -0.017317f, 0.028259f, -0.006502f, -0.004279f, -0.038087f, -0.011634f, -0.000142f, -0.005330f, -0.018600f, 0.011386f, -0.017021f, -0.014329f, -0.008616f, + 0.002971f, -0.010683f, -0.021816f, -0.022822f, 0.024644f, -0.016464f, 0.026328f, 0.016576f, 0.020993f, 0.011170f, -0.027822f, 0.002628f, -0.042856f, -0.014253f, -0.025001f, 0.012519f, -0.031032f, -0.010458f, -0.008736f, 0.004991f, 0.024535f, 0.008112f, -0.008580f, -0.039933f, 0.013690f, 0.021648f, -0.005733f, 0.006621f, -0.028086f, 0.025925f, -0.003651f, -0.009540f, 0.047252f, 0.026589f, -0.024107f, -0.042814f, 0.012815f, 0.013546f, -0.013882f, 0.028700f, -0.031649f, 0.034376f, -0.024901f, -0.013703f, 0.010428f, 0.008368f, 0.086921f, 0.034688f, 0.012625f, -0.053983f, -0.001915f, -0.012381f, -0.029367f, -0.007824f, -0.011026f, -0.008980f, -0.003695f, -0.044748f, -0.001332f, -0.016541f, 0.000104f, 0.022714f, -0.024515f, 0.029304f, -0.009850f, -0.031034f, -0.028747f, 0.023395f, 0.016955f, -0.006369f, -0.016076f, 0.029699f, -0.016078f, -0.013974f, 0.022300f, 0.000162f, 0.006548f, -0.022595f, -0.001244f, -0.012894f, 0.028736f, -0.003464f, 0.041421f, -0.014673f, 0.005851f, 0.013661f, -0.001630f, 0.002712f, 0.012351f, -0.025811f, -0.004736f, 0.035675f, 0.002405f, 0.010813f, -0.000676f, -0.026417f, + 0.011611f, -0.017860f, 0.009663f, 0.031850f, 0.038855f, 0.044514f, 0.044768f, -0.007489f, 0.015897f, 0.002074f, 0.024573f, 0.057010f, -0.058372f, 0.049217f, -0.023402f, 0.007550f, -0.019665f, -0.047346f, -0.007693f, 0.008055f, 0.001915f, 0.009546f, -0.032944f, -0.005900f, -0.005716f, -0.049967f, -0.036404f, 0.018118f, 0.021546f, 0.008102f, 0.015282f, -0.026197f, -0.010880f, -0.018940f, 0.054639f, 0.011526f, 0.002870f, 0.038630f, 0.024383f, 0.018785f, 0.019511f, 0.014399f, -0.026636f, 0.018921f, 0.009719f, -0.009961f, 0.017446f, -0.015518f, -0.012410f, 0.026468f, -0.010448f, 0.016153f, 0.038433f, -0.000120f, 0.008795f, -0.002086f, 0.004208f, -0.009467f, -0.019653f, -0.028738f, -0.042269f, 0.016579f, -0.035405f, 0.012465f, 0.016775f, 0.017193f, 0.002437f, -0.000592f, -0.002800f, -0.030662f, -0.011080f, 0.012741f, -0.007204f, 0.013099f, 0.039779f, -0.013451f, 0.031401f, 0.010583f, 0.006718f, -0.004094f, -0.006047f, -0.029434f, 0.003347f, -0.039112f, -0.007421f, 0.035283f, -0.014656f, 0.002228f, -0.056446f, 0.025633f, -0.002061f, 0.003944f, -0.031763f, -0.042376f, 0.013958f, 0.012462f, + 0.038047f, -0.090117f, -0.022186f, -0.053512f, 0.018069f, -0.048049f, -0.016117f, -0.054454f, 0.014591f, -0.028372f, -0.021780f, -0.004607f, -0.046258f, -0.016778f, -0.049557f, -0.024988f, -0.057379f, 0.012445f, -0.053078f, -0.020941f, -0.027549f, -0.015400f, -0.014534f, -0.012339f, -0.050649f, -0.028925f, -0.038514f, -0.019725f, -0.011074f, 0.021972f, -0.003100f, 0.016420f, -0.031488f, -0.005066f, 0.001893f, -0.036297f, 0.007102f, -0.002484f, 0.003150f, 0.009585f, -0.036753f, -0.002029f, 0.013627f, -0.004511f, 0.015339f, 0.030597f, 0.055396f, -0.045993f, 0.002815f, 0.061553f, 0.000249f, 0.030187f, -0.021673f, 0.038087f, 0.006816f, -0.009208f, -0.051421f, -0.030285f, 0.042160f, 0.026035f, 0.041020f, 0.001242f, -0.029628f, 0.010203f, 0.014049f, 0.029184f, -0.057000f, -0.000265f, 0.008597f, -0.031622f, -0.013197f, -0.014517f, -0.023577f, -0.046258f, 0.057133f, -0.004656f, -0.025683f, 0.038344f, -0.064922f, -0.000758f, -0.013084f, 0.027840f, -0.014570f, -0.040110f, 0.034467f, -0.070317f, -0.060835f, -0.050201f, 0.028073f, -0.015260f, 0.001034f, -0.027689f, -0.026364f, -0.030646f, 0.016201f, 0.013970f, + 0.048074f, 0.022242f, 0.009066f, 0.044640f, -0.012966f, 0.015576f, -0.017333f, 0.013216f, 0.007222f, 0.025995f, 0.042724f, 0.021684f, -0.010242f, -0.028074f, -0.017178f, -0.006869f, 0.023325f, -0.009624f, 0.005523f, -0.000700f, -0.012712f, 0.021503f, -0.002957f, 0.017205f, 0.012617f, -0.039321f, 0.029118f, 0.054314f, 0.007087f, 0.044908f, 0.043952f, 0.018211f, 0.013263f, -0.002633f, 0.022200f, -0.018021f, -0.057020f, -0.021112f, 0.038649f, -0.003108f, -0.022471f, 0.017178f, 0.055596f, -0.017477f, 0.001971f, -0.046676f, 0.038756f, 0.031691f, -0.005333f, 0.005728f, -0.021587f, 0.087690f, -0.062179f, -0.061313f, -0.050456f, 0.100979f, -0.019889f, 0.054929f, 0.102984f, -0.037057f, 0.050991f, 0.018177f, -0.059829f, 0.054509f, 0.011869f, -0.030503f, 0.045556f, 0.015086f, 0.043023f, -0.003306f, -0.030381f, 0.028833f, 0.014192f, -0.002780f, 0.013302f, -0.012562f, -0.032229f, -0.024134f, -0.013666f, -0.033701f, -0.019446f, -0.008757f, 0.027078f, -0.024114f, -0.009257f, -0.033242f, 0.009924f, -0.000345f, 0.008400f, 0.038648f, -0.021313f, 0.007058f, -0.019469f, -0.016047f, 0.027561f, -0.022093f, + -0.038960f, -0.057913f, 0.066951f, 0.024959f, -0.011834f, 0.040387f, -0.036158f, -0.038323f, -0.017367f, -0.006838f, 0.010430f, -0.003133f, -0.033183f, -0.030987f, -0.024973f, -0.067845f, -0.035782f, -0.038477f, 0.016757f, 0.017319f, 0.002718f, 0.032705f, 0.011689f, -0.043318f, -0.028328f, 0.044691f, -0.038128f, -0.000299f, 0.049179f, -0.013331f, -0.070321f, 0.043520f, -0.022099f, -0.004421f, 0.009786f, 0.021400f, -0.049722f, 0.029548f, -0.013539f, 0.050394f, 0.035896f, -0.082235f, -0.009541f, 0.007969f, -0.048966f, -0.008793f, -0.007473f, 0.059516f, 0.044094f, 0.039505f, 0.050721f, -0.002623f, -0.034597f, -0.027975f, -0.027470f, 0.000544f, -0.077383f, 0.008550f, 0.067063f, -0.061568f, -0.109326f, 0.010356f, -0.040736f, 0.080097f, -0.000285f, 0.001827f, 0.054453f, -0.025693f, 0.011287f, -0.003346f, -0.014662f, 0.046288f, -0.013583f, 0.023014f, 0.079155f, -0.059108f, -0.033399f, -0.053929f, 0.026242f, 0.003631f, 0.052741f, -0.031163f, 0.020514f, 0.002112f, 0.047828f, 0.027783f, -0.024195f, -0.016333f, 0.017592f, -0.009275f, -0.002950f, -0.034567f, -0.034577f, 0.017337f, -0.008570f, -0.010098f, + -0.020339f, 0.043760f, -0.017950f, -0.017291f, 0.071837f, 0.079058f, 0.049098f, -0.065540f, -0.007814f, -0.019149f, 0.023793f, 0.100513f, -0.014693f, -0.069869f, -0.007621f, -0.022872f, 0.037897f, -0.048971f, 0.008220f, -0.040429f, 0.037179f, 0.019662f, -0.037513f, 0.064322f, 0.100221f, 0.001549f, -0.003782f, -0.035312f, -0.033590f, 0.004416f, 0.006485f, -0.018178f, 0.090554f, -0.009580f, 0.067675f, 0.052174f, -0.067078f, -0.003719f, -0.022126f, -0.074057f, 0.018788f, 0.015084f, 0.040033f, 0.066009f, -0.001623f, -0.021175f, 0.022674f, 0.022696f, 0.053684f, 0.020405f, 0.005182f, 0.041913f, 0.046462f, 0.013839f, -0.010439f, 0.038142f, 0.018096f, 0.046199f, 0.010461f, 0.011688f, 0.030329f, 0.048919f, -0.008551f, -0.043053f, -0.047016f, -0.017827f, -0.016423f, 0.078050f, 0.044054f, 0.121791f, -0.005982f, -0.065502f, 0.055010f, -0.021821f, -0.021759f, -0.021786f, -0.042649f, 0.003155f, 0.023433f, -0.004152f, -0.024118f, 0.085039f, -0.018112f, 0.100779f, -0.029119f, 0.052366f, 0.004225f, -0.021682f, -0.057931f, -0.085723f, 0.074528f, -0.012274f, -0.017107f, -0.028637f, -0.036060f, 0.023971f, + 0.090780f, -0.053243f, -0.036905f, 0.009174f, 0.015089f, -0.008763f, 0.063824f, 0.052636f, 0.049893f, 0.019103f, 0.023869f, 0.045016f, 0.025218f, -0.013910f, -0.027265f, -0.056331f, -0.010860f, 0.033719f, 0.009501f, 0.008701f, -0.023038f, -0.053149f, -0.017403f, -0.005886f, 0.054728f, 0.002609f, -0.007973f, 0.044350f, -0.007984f, 0.013610f, 0.007888f, -0.092804f, 0.023150f, 0.027432f, -0.017608f, -0.038606f, 0.006691f, -0.051522f, -0.028111f, -0.079906f, 0.023865f, -0.066413f, -0.136111f, 0.017562f, -0.002537f, 0.097144f, -0.003855f, 0.034197f, 0.078227f, -0.011093f, -0.020731f, 0.036738f, -0.000876f, -0.066928f, -0.024000f, 0.010711f, 0.011633f, 0.052281f, 0.021527f, 0.046645f, 0.039814f, -0.026696f, -0.019944f, 0.020457f, 0.059053f, -0.022973f, -0.009938f, -0.052230f, -0.033543f, 0.013934f, -0.067229f, 0.019341f, -0.074240f, 0.010938f, -0.011976f, -0.002808f, -0.018683f, 0.071436f, 0.078417f, 0.179617f, 0.022331f, -0.102423f, -0.074987f, -0.057201f, -0.063591f, 0.125243f, 0.169861f, 0.055911f, -0.015198f, -0.054534f, 0.002775f, -0.065756f, 0.071631f, 0.065369f, 0.020708f, 0.008098f, + -0.041069f, -0.007727f, 0.078680f, 0.016423f, 0.032088f, 0.024549f, 0.082490f, 0.066845f, -0.025721f, -0.062737f, -0.079553f, -0.056218f, -0.007302f, 0.020195f, 0.074187f, 0.041749f, -0.014603f, 0.037377f, -0.055033f, -0.021546f, -0.124660f, -0.022521f, 0.124081f, 0.092480f, -0.018526f, 0.246957f, 0.079091f, 0.004059f, -0.136443f, -0.026866f, -0.011144f, -0.035921f, 0.035602f, 0.015381f, 0.030217f, 0.048078f, -0.111364f, -0.125287f, -0.060119f, -0.086542f, -0.011278f, 0.021727f, 0.101387f, -0.067012f, 0.036991f, 0.150429f, 0.078497f, 0.019056f, 0.043318f, 0.022306f, -0.097151f, -0.169753f, 0.076873f, -0.054703f, 0.025924f, -0.038273f, -0.166066f, -0.039601f, 0.091417f, 0.176217f, 0.154474f, 0.372419f, 0.193796f, 0.131382f, 0.114717f, 0.051561f, -0.023152f, -0.190428f, -0.239351f, -0.355352f, -0.273442f, -0.279996f, -0.108946f, -0.001564f, 0.102428f, 0.194305f, 0.158826f, 0.164775f, 0.111487f, 0.154413f, 0.119015f, 0.170990f, 0.078036f, 0.060482f, 0.025259f, -0.050579f, -0.076005f, -0.112286f, -0.071410f, -0.237476f, -0.105280f, -0.225653f, -0.166083f, -0.257841f, -0.157757f, -0.241150f, + -0.092429f, -0.124329f, -0.048069f, 0.008284f, 0.106964f, 0.299794f, 0.283119f, 0.402590f, 0.266839f, 0.178844f, 0.233685f, 0.325540f, 0.282507f, 0.235893f, 0.157570f, 0.005045f, -0.188363f, -0.185945f, -0.229439f, -0.416584f, -0.461417f, -0.499383f, -0.502732f, -0.548466f, -0.482376f, -0.410324f, -0.370721f, -0.253221f, -0.015646f, 0.207463f, 0.383357f, 0.519828f, 0.649420f, 0.721260f, 0.460142f, 0.396603f, 0.104326f, -0.042561f, -0.032024f}, + {-0.011786f, 0.000611f, -0.009485f, -0.003189f, 0.004308f, 0.002622f, 0.006006f, -0.007800f, 0.004362f, -0.001018f, -0.007320f, 0.008648f, -0.004126f, -0.001790f, -0.005930f, -0.004928f, 0.005874f, -0.005754f, 0.003214f, 0.008122f, -0.000781f, 0.004544f, -0.002647f, 0.000149f, 0.003770f, -0.001088f, 0.007811f, -0.000324f, -0.011994f, -0.000271f, 0.001971f, 0.005270f, -0.005409f, 0.000867f, 0.001731f, -0.001060f, 0.005194f, -0.000944f, 0.007245f, 0.006432f, -0.004064f, -0.000427f, 0.006543f, -0.013184f, -0.007455f, 0.002872f, -0.006690f, -0.001501f, 0.002754f, -0.000031f, 0.007975f, 0.008822f, 0.002034f, 0.003727f, 0.004533f, 0.004713f, -0.001392f, 0.001315f, 0.004308f, 0.005789f, 0.000824f, -0.003972f, -0.007476f, -0.004885f, -0.000156f, -0.000803f, -0.000614f, -0.010294f, 0.009371f, -0.002942f, 0.001328f, -0.003240f, -0.006296f, 0.003120f, -0.001266f, 0.003555f, 0.024097f, 0.001053f, 0.004067f, 0.003340f, -0.009806f, -0.005118f, 0.013335f, 0.023166f, 0.003733f, 0.012311f, -0.005036f, 0.002275f, -0.000666f, 0.010397f, -0.008332f, -0.019014f, 0.007615f, 0.008763f, -0.011084f, 0.012689f, + 0.006246f, 0.011554f, 0.003631f, 0.002645f, -0.005169f, -0.001777f, 0.000532f, 0.007625f, 0.000619f, -0.011887f, 0.000426f, -0.001134f, 0.002439f, -0.001832f, 0.001985f, 0.002597f, 0.006875f, 0.004837f, 0.001553f, 0.001939f, 0.000573f, 0.003162f, -0.003735f, -0.006126f, -0.013111f, 0.002207f, 0.002718f, 0.000730f, 0.009803f, -0.003864f, 0.007583f, 0.001771f, -0.003233f, -0.006519f, -0.004119f, 0.013514f, 0.002831f, 0.007330f, 0.001143f, 0.002592f, -0.002825f, -0.000031f, 0.000785f, 0.003460f, -0.001345f, -0.005777f, -0.002940f, -0.011440f, 0.001084f, 0.001411f, 0.009144f, -0.003751f, 0.007000f, -0.002140f, 0.004611f, 0.008682f, 0.008863f, 0.003694f, 0.003770f, 0.004470f, 0.005946f, 0.008193f, -0.003427f, 0.008514f, 0.000348f, 0.009117f, -0.001797f, 0.016412f, 0.005906f, 0.005277f, -0.011086f, -0.001806f, -0.002318f, -0.014962f, 0.008316f, 0.006589f, -0.004406f, -0.019523f, -0.008546f, -0.003096f, 0.009670f, 0.012769f, 0.008422f, -0.005357f, 0.003017f, -0.008454f, 0.000644f, 0.000560f, -0.006496f, -0.003506f, -0.017233f, 0.001307f, -0.001948f, -0.007440f, 0.001002f, 0.000902f, + -0.002131f, -0.000643f, 0.016967f, -0.004092f, 0.013860f, 0.002606f, -0.010307f, 0.000759f, 0.001245f, 0.007669f, -0.003226f, 0.002212f, 0.002024f, 0.000663f, 0.010635f, 0.003740f, 0.010903f, 0.008048f, -0.005320f, 0.009997f, 0.004920f, 0.007433f, 0.000817f, 0.002720f, -0.002380f, -0.004146f, -0.008731f, -0.010216f, 0.011362f, -0.010442f, -0.008727f, -0.008205f, 0.005106f, 0.006321f, 0.001752f, -0.015109f, -0.013983f, 0.002986f, 0.000314f, -0.003072f, 0.008436f, -0.001139f, -0.001427f, 0.008684f, -0.009563f, 0.001847f, -0.008343f, -0.005461f, -0.002988f, 0.000059f, 0.014283f, 0.016148f, -0.007479f, 0.006307f, -0.011618f, -0.001147f, -0.004526f, 0.015688f, -0.004611f, -0.000922f, 0.001683f, -0.022168f, -0.003814f, -0.010963f, -0.003567f, -0.002745f, 0.008283f, 0.010925f, 0.004524f, 0.014777f, -0.001861f, -0.006772f, -0.006807f, 0.008522f, 0.022254f, 0.015506f, -0.008634f, -0.010162f, 0.011148f, -0.009999f, 0.001929f, 0.003519f, 0.018234f, -0.006727f, -0.008946f, 0.001958f, -0.005543f, 0.003457f, 0.004657f, 0.011549f, -0.012663f, -0.008246f, 0.007437f, 0.013959f, -0.001292f, -0.006512f, + -0.008259f, -0.019788f, 0.007466f, -0.000051f, 0.005831f, 0.000916f, 0.000416f, -0.003106f, 0.003478f, -0.005024f, 0.002901f, 0.004342f, 0.003943f, -0.006823f, 0.004522f, -0.036655f, -0.012078f, -0.001935f, 0.006251f, 0.004209f, 0.009119f, -0.017503f, -0.005244f, -0.000789f, -0.018155f, -0.012966f, 0.004564f, 0.010990f, 0.006450f, 0.012128f, -0.001541f, 0.006971f, 0.016149f, 0.014252f, 0.013398f, 0.007728f, -0.005141f, -0.004091f, -0.008270f, -0.003657f, -0.008303f, 0.017243f, 0.008043f, -0.002625f, -0.007596f, -0.004633f, -0.007750f, -0.011327f, -0.012195f, -0.015359f, 0.009337f, 0.006677f, -0.017009f, 0.004061f, -0.000823f, 0.011827f, 0.001880f, 0.005846f, 0.007731f, -0.016092f, -0.002414f, -0.000541f, 0.002253f, 0.008529f, 0.012995f, -0.005086f, -0.001706f, -0.003705f, -0.009977f, 0.003205f, 0.002247f, -0.000981f, -0.002517f, 0.009853f, 0.000838f, -0.005277f, -0.001460f, 0.004749f, 0.006674f, -0.002378f, 0.000253f, 0.001785f, -0.008179f, 0.006725f, 0.000141f, -0.013100f, 0.002595f, -0.016033f, 0.004028f, 0.012160f, -0.001844f, -0.000770f, 0.019725f, 0.008003f, 0.003014f, -0.004600f, + 0.014450f, 0.006191f, 0.008015f, 0.023949f, 0.025085f, 0.001446f, -0.004476f, -0.008532f, -0.014163f, 0.005583f, 0.009728f, -0.004682f, -0.001349f, 0.001975f, -0.002730f, -0.007567f, 0.009238f, -0.008757f, 0.004108f, -0.026333f, -0.004174f, -0.005941f, -0.006821f, -0.012671f, -0.003051f, -0.001065f, -0.000064f, -0.006140f, -0.010007f, -0.006971f, 0.000805f, -0.004355f, -0.010594f, 0.006939f, 0.008622f, 0.001513f, -0.008736f, -0.008698f, 0.003238f, -0.006476f, 0.008114f, -0.009587f, 0.006489f, 0.003369f, -0.000398f, -0.013956f, -0.014096f, 0.004219f, -0.010300f, 0.017316f, 0.002602f, 0.014760f, -0.007386f, 0.014913f, 0.002332f, 0.010098f, 0.002633f, 0.009721f, -0.008124f, -0.009578f, -0.000691f, 0.019232f, -0.002262f, -0.010148f, -0.006942f, 0.009660f, -0.005719f, -0.004506f, 0.000777f, -0.016123f, 0.011372f, 0.019450f, -0.003587f, 0.029589f, 0.005278f, 0.016566f, -0.006885f, 0.012588f, 0.008229f, 0.019223f, -0.014348f, -0.009095f, -0.003759f, 0.001784f, 0.012561f, -0.005475f, 0.019392f, -0.000764f, 0.010763f, 0.010547f, -0.006195f, 0.004776f, 0.010920f, 0.011397f, 0.002133f, 0.003697f, + 0.009901f, -0.020927f, 0.002958f, 0.017544f, 0.012524f, -0.010947f, 0.014056f, -0.016505f, 0.009924f, -0.014456f, -0.008274f, -0.003206f, 0.015309f, -0.002439f, 0.016062f, 0.004510f, 0.003015f, 0.001648f, -0.001127f, 0.007420f, 0.009203f, 0.022522f, 0.002851f, 0.019570f, -0.009751f, 0.014558f, 0.017459f, 0.000340f, -0.003765f, -0.005564f, 0.006435f, -0.024765f, -0.002651f, 0.003522f, -0.010135f, -0.014244f, -0.001345f, 0.000086f, -0.002530f, 0.007836f, -0.016158f, 0.009095f, 0.006522f, 0.011187f, -0.025144f, 0.009787f, 0.005662f, -0.013336f, -0.001906f, 0.009433f, 0.018278f, -0.021782f, -0.002200f, 0.002688f, -0.025863f, -0.031346f, -0.025367f, -0.022605f, -0.000905f, 0.016250f, -0.033368f, 0.023891f, 0.015208f, -0.037115f, 0.023431f, 0.010227f, 0.007968f, 0.003976f, 0.003551f, 0.008745f, -0.005922f, -0.005783f, -0.012313f, -0.000032f, 0.014306f, 0.012468f, 0.007051f, -0.020895f, 0.014542f, -0.014805f, 0.000439f, -0.012948f, 0.016723f, -0.008394f, -0.006843f, 0.005741f, -0.024938f, 0.002999f, -0.008192f, -0.006948f, -0.002553f, 0.002354f, 0.024739f, -0.011005f, -0.003607f, -0.008729f, + 0.018897f, -0.010703f, -0.005922f, 0.006488f, 0.005870f, 0.006047f, 0.006897f, -0.006940f, 0.009338f, 0.003188f, -0.020165f, 0.029164f, 0.011622f, 0.005593f, 0.003397f, 0.000982f, -0.012627f, 0.017377f, 0.014119f, 0.007010f, 0.018779f, 0.003437f, 0.008753f, 0.019892f, 0.010186f, 0.005850f, -0.011448f, 0.017247f, -0.005259f, 0.031346f, -0.001481f, 0.004178f, -0.005711f, -0.025214f, 0.006350f, 0.019182f, 0.011663f, -0.001323f, -0.012384f, 0.030952f, 0.047077f, -0.005572f, -0.007576f, 0.023940f, 0.004704f, 0.008376f, 0.005189f, -0.033843f, 0.002814f, -0.021652f, 0.016855f, 0.026157f, -0.007735f, -0.011655f, 0.003090f, 0.016781f, -0.010794f, 0.020122f, -0.008791f, 0.038241f, -0.012175f, 0.007874f, -0.003052f, 0.010791f, 0.025567f, -0.009558f, 0.001360f, -0.001815f, 0.006433f, -0.009404f, -0.006165f, 0.015787f, 0.031479f, 0.003263f, 0.022619f, -0.008411f, 0.001809f, -0.004035f, 0.006461f, 0.018085f, 0.024619f, 0.020937f, 0.017747f, 0.020680f, 0.011023f, -0.003230f, 0.001279f, -0.002326f, -0.001416f, 0.004467f, -0.015150f, -0.003333f, 0.019018f, -0.018129f, 0.005153f, -0.007720f, + -0.007289f, -0.009203f, -0.040843f, 0.004740f, 0.017995f, 0.013606f, -0.007741f, -0.017677f, -0.047479f, -0.006611f, 0.014135f, -0.003184f, 0.002532f, -0.013142f, 0.004300f, -0.011197f, -0.034064f, -0.025111f, 0.002326f, 0.016561f, -0.015890f, -0.008592f, 0.000872f, -0.006838f, -0.050408f, -0.041437f, 0.017538f, 0.018278f, 0.002141f, 0.003706f, -0.019076f, 0.029529f, 0.033433f, 0.022444f, -0.018723f, 0.017810f, 0.021635f, -0.002264f, -0.029614f, -0.011658f, 0.038677f, -0.010477f, 0.003044f, 0.003723f, 0.021337f, -0.016524f, -0.032730f, 0.008260f, 0.013718f, -0.006450f, 0.008460f, 0.022016f, -0.010895f, -0.006495f, -0.001822f, -0.042994f, -0.013754f, 0.016769f, -0.009324f, -0.028189f, 0.004499f, 0.000754f, -0.010224f, 0.007481f, -0.003688f, -0.026541f, -0.024758f, -0.040488f, -0.034397f, 0.008243f, 0.013858f, 0.003139f, -0.010957f, -0.012246f, -0.000605f, -0.007729f, 0.008008f, -0.018279f, -0.000337f, -0.005106f, -0.006929f, -0.004679f, -0.002988f, 0.010232f, -0.010466f, -0.037937f, 0.004669f, -0.003089f, 0.008384f, 0.014144f, -0.001122f, 0.011260f, 0.007016f, 0.016110f, 0.051713f, 0.045940f, + 0.035852f, -0.003919f, 0.035010f, 0.011269f, 0.048868f, 0.020598f, -0.001201f, 0.059601f, -0.012683f, -0.003390f, -0.038360f, -0.010352f, -0.001087f, -0.027215f, 0.015729f, 0.023604f, -0.008192f, -0.000791f, -0.022052f, -0.037594f, -0.022350f, -0.028837f, -0.008755f, -0.017698f, -0.005921f, -0.003362f, 0.016411f, 0.003579f, -0.004156f, -0.016077f, -0.005937f, -0.011059f, 0.004729f, -0.000522f, -0.015882f, 0.007014f, 0.009295f, 0.002917f, -0.012519f, -0.016512f, 0.004283f, 0.013000f, -0.002915f, -0.001823f, -0.028115f, 0.047383f, 0.007218f, -0.010738f, -0.002331f, 0.002767f, 0.019834f, 0.016065f, -0.019414f, 0.008579f, -0.008279f, 0.000347f, -0.004235f, -0.006618f, -0.029039f, -0.026985f, -0.034567f, 0.002817f, -0.002610f, -0.009416f, 0.019733f, -0.009164f, 0.057944f, -0.008448f, -0.004350f, -0.017278f, -0.007543f, -0.034154f, -0.042312f, -0.027570f, 0.036054f, 0.023744f, -0.020296f, -0.026293f, 0.038534f, 0.019122f, -0.019959f, -0.033460f, -0.002365f, 0.002768f, 0.006164f, 0.001901f, -0.015290f, 0.016427f, -0.010672f, 0.034537f, -0.002933f, -0.028416f, 0.008897f, 0.007068f, 0.002654f, 0.000460f, + -0.008534f, -0.019251f, 0.002020f, 0.012711f, -0.006212f, 0.009149f, -0.015129f, -0.050836f, -0.036301f, 0.022692f, -0.027539f, 0.022366f, 0.010382f, 0.000660f, -0.007000f, 0.012259f, 0.007955f, -0.006020f, -0.003649f, 0.004615f, 0.018255f, -0.015481f, 0.044641f, -0.012486f, 0.017455f, -0.014488f, 0.007340f, -0.005556f, -0.012290f, 0.037624f, -0.027121f, 0.041132f, 0.002486f, -0.023474f, -0.028451f, 0.014695f, 0.010176f, 0.003456f, 0.006410f, 0.015625f, 0.016436f, 0.014027f, -0.028718f, -0.011992f, 0.005989f, -0.001242f, 0.013776f, -0.026974f, -0.006931f, -0.009560f, 0.000553f, -0.031806f, -0.004327f, 0.007464f, 0.075989f, 0.026501f, -0.017967f, 0.040353f, 0.035945f, -0.018127f, -0.025032f, 0.060252f, -0.006114f, 0.013956f, -0.035986f, 0.087316f, 0.002250f, -0.023280f, 0.011792f, 0.005244f, 0.041223f, 0.001656f, 0.052272f, -0.037145f, 0.000124f, -0.040655f, 0.002536f, 0.030191f, 0.000713f, -0.024534f, 0.035497f, 0.020264f, 0.010044f, 0.009659f, -0.013188f, -0.011209f, 0.002757f, -0.017068f, 0.023154f, -0.020114f, -0.028571f, 0.025799f, 0.008992f, -0.031636f, 0.017346f, 0.003123f, + -0.024024f, -0.012323f, -0.008180f, 0.013443f, -0.002990f, -0.013316f, 0.017302f, -0.020117f, -0.008393f, -0.006273f, 0.029220f, -0.018193f, 0.014269f, 0.023326f, 0.010677f, -0.012326f, -0.026774f, 0.018162f, -0.022643f, 0.032356f, -0.038809f, 0.053147f, -0.014352f, -0.006635f, -0.005962f, 0.024438f, 0.000188f, 0.009053f, 0.016715f, 0.008618f, 0.023465f, -0.020541f, -0.033410f, -0.001347f, -0.003588f, -0.046223f, -0.005437f, 0.041745f, -0.012026f, -0.026494f, 0.011861f, -0.012602f, -0.002016f, 0.018743f, -0.045403f, -0.027135f, 0.017880f, 0.023153f, 0.032254f, -0.002612f, -0.005822f, 0.012546f, -0.002869f, -0.045501f, -0.030687f, 0.052688f, -0.003818f, -0.046911f, -0.026792f, -0.019142f, -0.015180f, 0.003872f, 0.015813f, 0.000377f, -0.007572f, -0.023700f, -0.035310f, 0.004261f, 0.004907f, -0.001790f, 0.029208f, -0.020388f, -0.055511f, 0.021975f, 0.016553f, -0.065686f, 0.039005f, -0.011207f, -0.032685f, -0.027794f, -0.002291f, 0.036238f, 0.009002f, -0.013093f, -0.013264f, 0.009680f, 0.019596f, -0.028350f, 0.021103f, 0.002345f, 0.015577f, -0.012980f, -0.028368f, 0.024061f, 0.000203f, 0.027020f, + -0.087908f, 0.009734f, 0.013718f, -0.014629f, 0.024596f, 0.026627f, 0.083833f, 0.000367f, -0.055076f, -0.027750f, -0.014178f, -0.056322f, -0.052277f, -0.000368f, -0.028334f, -0.001949f, -0.000338f, -0.036957f, 0.004665f, 0.025126f, 0.019635f, -0.032642f, 0.059175f, 0.043720f, -0.020973f, 0.026728f, -0.050651f, -0.009459f, -0.018007f, 0.079005f, 0.048125f, -0.017007f, -0.031173f, -0.034732f, -0.009649f, 0.003544f, 0.012622f, 0.053532f, 0.009417f, 0.010366f, 0.009576f, 0.002986f, -0.018867f, 0.003668f, -0.004990f, 0.025581f, 0.030582f, 0.042664f, 0.024889f, 0.019079f, -0.005888f, -0.005855f, 0.004624f, 0.038964f, 0.003942f, 0.008432f, -0.039806f, -0.017324f, 0.061796f, 0.027883f, 0.017081f, 0.002521f, 0.036071f, 0.022570f, 0.078349f, -0.002276f, 0.080764f, 0.008260f, -0.028226f, 0.029392f, -0.025000f, -0.014142f, -0.005612f, -0.012516f, -0.001898f, 0.018468f, 0.030265f, 0.009075f, -0.010263f, -0.032817f, 0.008326f, 0.006985f, 0.020303f, -0.024117f, 0.003521f, -0.007559f, -0.000287f, -0.030445f, 0.013154f, -0.024857f, -0.010260f, -0.034167f, -0.068044f, 0.010237f, -0.020413f, -0.030904f, + 0.009435f, -0.035418f, -0.000036f, 0.043247f, 0.013586f, 0.036951f, -0.042431f, -0.019322f, 0.021067f, 0.004651f, 0.061184f, -0.030547f, 0.036753f, -0.013315f, -0.018062f, -0.044884f, -0.017200f, -0.023833f, 0.030955f, 0.007749f, -0.039889f, 0.051372f, -0.025570f, -0.023645f, 0.005616f, 0.020544f, -0.014054f, 0.035910f, -0.016178f, -0.023462f, -0.011662f, 0.012607f, -0.003321f, -0.005672f, 0.004831f, 0.036031f, -0.022581f, 0.065110f, -0.023655f, 0.000378f, 0.060525f, -0.010635f, 0.011768f, -0.079507f, 0.005005f, 0.015850f, -0.016751f, 0.037128f, -0.063277f, -0.077806f, 0.031789f, -0.012473f, 0.045648f, -0.031076f, -0.029066f, 0.005294f, -0.008200f, 0.069295f, -0.006117f, -0.001156f, 0.017253f, -0.060628f, 0.005943f, -0.061179f, -0.022809f, 0.005914f, 0.017927f, -0.076634f, -0.032158f, -0.007088f, -0.000196f, 0.028512f, -0.029266f, 0.044092f, -0.009970f, -0.046145f, 0.037068f, -0.032236f, -0.012922f, 0.034739f, 0.070284f, -0.018011f, 0.057037f, 0.024161f, 0.012483f, -0.025093f, 0.063420f, 0.013202f, 0.027934f, 0.005646f, -0.042092f, 0.016889f, -0.042300f, -0.036304f, 0.021131f, -0.036206f, + -0.011608f, -0.006522f, 0.036088f, 0.005895f, -0.016554f, 0.015223f, 0.014134f, -0.005708f, -0.040569f, -0.006364f, 0.025079f, 0.071465f, 0.012400f, -0.036755f, 0.000690f, -0.005338f, 0.012928f, 0.023072f, 0.031359f, -0.013520f, -0.002978f, 0.024609f, 0.001384f, 0.000613f, 0.042359f, 0.043495f, 0.045784f, 0.018752f, 0.037756f, 0.007179f, 0.020933f, -0.018374f, -0.007764f, 0.006709f, -0.043252f, 0.003908f, 0.061369f, -0.007600f, -0.018978f, 0.014364f, -0.005661f, 0.017911f, -0.044001f, 0.051715f, -0.037487f, -0.015165f, -0.013995f, 0.001407f, 0.000863f, 0.004547f, -0.062426f, 0.068451f, -0.021179f, -0.028900f, -0.014139f, 0.116010f, -0.005342f, 0.022027f, 0.000597f, -0.013607f, 0.004923f, -0.055878f, -0.021587f, -0.018199f, 0.022789f, 0.013631f, 0.028274f, 0.001608f, -0.026922f, 0.028569f, -0.022589f, 0.033176f, 0.027178f, -0.029350f, -0.028219f, 0.002216f, 0.044073f, -0.044693f, 0.019968f, 0.018678f, -0.022945f, 0.009750f, -0.001347f, 0.013882f, -0.000044f, -0.064456f, 0.037364f, 0.020578f, -0.051337f, 0.063090f, -0.032104f, -0.009342f, -0.019095f, 0.050753f, -0.008257f, -0.045236f, + 0.001985f, -0.000403f, 0.044991f, 0.042570f, 0.005046f, -0.034640f, 0.051100f, -0.008871f, 0.010893f, -0.062970f, 0.051162f, 0.019009f, 0.005337f, -0.036462f, -0.024495f, -0.004628f, 0.019554f, -0.029409f, -0.048460f, -0.022540f, 0.043195f, 0.024286f, -0.003006f, 0.064843f, 0.007100f, -0.011379f, -0.043816f, 0.057104f, -0.049876f, -0.018214f, 0.063625f, 0.017559f, 0.013296f, -0.024079f, 0.017038f, 0.052636f, -0.044819f, -0.000774f, -0.050404f, 0.047132f, 0.079541f, 0.033626f, 0.046336f, -0.069485f, -0.057515f, -0.049284f, 0.007076f, 0.081388f, -0.012859f, 0.028979f, 0.056926f, 0.025331f, -0.027269f, -0.000200f, 0.042401f, -0.053091f, -0.039893f, -0.038602f, 0.044435f, 0.027044f, -0.050630f, -0.077571f, 0.105695f, 0.061455f, -0.070083f, 0.031310f, -0.005357f, 0.028556f, 0.006540f, -0.023931f, -0.047450f, 0.044668f, 0.002245f, -0.039431f, -0.052819f, 0.012720f, 0.016918f, -0.015963f, 0.005353f, -0.006911f, -0.023852f, -0.013912f, -0.010527f, 0.024523f, -0.045144f, 0.052897f, -0.032831f, 0.000363f, 0.090505f, -0.084453f, -0.015107f, 0.076503f, 0.010821f, 0.016608f, -0.006233f, -0.026180f, + 0.030196f, -0.010843f, -0.028474f, 0.002654f, -0.072239f, 0.131354f, -0.006334f, -0.149047f, 0.062892f, 0.142681f, 0.093396f, -0.181899f, -0.043529f, 0.030383f, 0.022695f, -0.033068f, -0.027327f, -0.036189f, 0.007435f, 0.037414f, 0.084175f, -0.035099f, 0.026436f, -0.044631f, -0.121363f, 0.065115f, -0.031870f, -0.065240f, -0.047262f, -0.066851f, 0.030143f, 0.022346f, -0.092276f, 0.057741f, -0.033702f, -0.002555f, -0.003533f, -0.046713f, 0.033101f, 0.034944f, 0.028614f, -0.003747f, 0.038119f, 0.020481f, -0.027942f, 0.001127f, -0.054632f, -0.019948f, -0.049006f, -0.033339f, -0.005823f, 0.072381f, -0.065682f, -0.015184f, -0.017309f, -0.057673f, 0.028363f, -0.065022f, 0.028047f, 0.025403f, -0.047072f, 0.030496f, -0.073113f, 0.016320f, -0.064448f, 0.034899f, -0.027590f, -0.035366f, -0.038181f, -0.052767f, -0.018999f, 0.019559f, 0.035896f, -0.054412f, 0.026163f, 0.012553f, 0.044296f, 0.056721f, 0.029078f, -0.059675f, -0.032465f, -0.106751f, -0.033653f, -0.037689f, 0.023419f, -0.125494f, -0.032157f, -0.080373f, -0.017337f, 0.054826f, 0.050430f, 0.024709f, -0.000414f, 0.071164f, -0.022843f, 0.017862f, + 0.102886f, -0.059163f, 0.035829f, 0.052755f, -0.026721f, 0.008508f, 0.014420f, -0.001908f, 0.047712f, 0.006698f, 0.033374f, -0.044077f, -0.011033f, 0.045785f, 0.002657f, -0.061300f, 0.038006f, -0.022148f, -0.025464f, -0.021043f, -0.010693f, -0.020469f, 0.020535f, 0.038355f, 0.012645f, -0.002299f, -0.022327f, 0.033680f, -0.013927f, -0.044293f, 0.035124f, -0.077340f, -0.024471f, -0.013161f, -0.021829f, 0.049592f, 0.046526f, 0.093977f, -0.030535f, 0.042034f, -0.005328f, 0.020643f, 0.055599f, -0.001276f, 0.002617f, -0.036684f, -0.128473f, 0.064616f, 0.008380f, -0.057616f, -0.044697f, 0.008580f, 0.029400f, -0.003467f, -0.038423f, 0.020396f, -0.039099f, 0.049476f, 0.024051f, -0.019352f, -0.045732f, 0.087511f, 0.007698f, 0.005133f, -0.009212f, 0.011898f, 0.005529f, 0.002847f, -0.028687f, -0.063521f, 0.018812f, -0.012728f, -0.017595f, -0.063207f, -0.001795f, -0.007637f, 0.006688f, 0.118201f, 0.061366f, 0.118946f, -0.109770f, 0.008847f, 0.058155f, -0.022982f, 0.066143f, 0.125549f, 0.070011f, 0.003325f, -0.033286f, -0.035780f, 0.007281f, 0.054018f, 0.059334f, 0.012615f, 0.000595f, -0.087833f, + -0.017214f, 0.085234f, 0.029179f, -0.024666f, 0.048213f, -0.041075f, -0.055724f, -0.016213f, -0.003010f, 0.065738f, 0.087537f, 0.077253f, 0.030305f, -0.030927f, -0.045687f, -0.086897f, -0.084927f, 0.073933f, 0.032082f, 0.005398f, 0.116063f, 0.006258f, -0.034519f, -0.047912f, -0.047150f, 0.022569f, 0.050036f, 0.038438f, 0.076402f, 0.004590f, 0.055191f, -0.004370f, -0.009008f, 0.026734f, 0.051141f, 0.035988f, 0.032763f, -0.029651f, -0.010163f, -0.023640f, -0.050412f, -0.041996f, -0.073835f, -0.026089f, 0.020533f, -0.013535f, 0.054633f, 0.063620f, -0.000794f, -0.001202f, -0.026721f, -0.049908f, 0.009148f, 0.059830f, -0.005761f, -0.062688f, -0.123549f, 0.049193f, 0.200621f, 0.204945f, 0.172741f, 0.126082f, -0.077351f, -0.087251f, -0.095208f, -0.125685f, -0.193741f, -0.155065f, -0.135389f, 0.064278f, 0.146196f, 0.109821f, 0.234984f, 0.182732f, 0.095140f, -0.033197f, -0.062402f, -0.155804f, -0.122128f, -0.119892f, -0.023864f, -0.072565f, -0.059442f, 0.020322f, 0.034318f, 0.068809f, 0.068135f, 0.094016f, 0.092349f, 0.119771f, 0.070067f, 0.032968f, -0.015024f, -0.016602f, -0.049288f, -0.074528f, + -0.091667f, -0.111388f, -0.072686f, -0.137373f, -0.091220f, -0.066462f, 0.073878f, 0.138549f, 0.148050f, 0.104857f, 0.071973f, 0.111981f, 0.085895f, 0.108134f, 0.085177f, 0.034433f, -0.032835f, -0.172577f, -0.121056f, -0.121803f, -0.194141f, -0.117540f, -0.101528f, -0.096350f, 0.047000f, 0.117100f, 0.178948f, 0.151525f, 0.210577f, 0.192999f, 0.189073f, 0.142429f, -0.048636f, -0.037680f, -0.112274f, -0.148170f, -0.128450f, -0.021449f, -0.012368f} + }, + { + {-0.011821f, -0.009289f, 0.002235f, -0.005330f, 0.008560f, -0.008721f, 0.003563f, -0.015997f, -0.001212f, -0.006332f, -0.009951f, -0.008395f, -0.004922f, -0.000416f, -0.001885f, 0.010525f, -0.003240f, 0.002115f, -0.001371f, -0.000545f, -0.008767f, 0.010282f, 0.003148f, 0.001895f, 0.002729f, -0.002054f, -0.002282f, 0.002591f, 0.009847f, 0.004214f, -0.001937f, -0.000753f, -0.000286f, -0.002263f, 0.000206f, -0.001656f, -0.000913f, 0.000132f, 0.005559f, 0.000663f, -0.004346f, 0.003183f, -0.004656f, 0.013589f, -0.008261f, 0.001015f, -0.000142f, -0.010134f, -0.001549f, 0.004449f, -0.005701f, -0.002556f, -0.001859f, 0.006763f, -0.003683f, -0.002595f, -0.000416f, 0.000778f, 0.001455f, -0.001002f, -0.003304f, -0.007888f, 0.001485f, -0.004108f, -0.005891f, 0.001408f, 0.002223f, -0.000433f, 0.001597f, 0.003864f, 0.003939f, -0.000562f, 0.001468f, 0.000667f, 0.005101f, -0.005700f, -0.005621f, 0.005660f, 0.005951f, 0.011384f, -0.015779f, 0.002891f, 0.011378f, 0.019101f, -0.001546f, 0.010481f, 0.000114f, 0.009453f, 0.003017f, 0.014837f, 0.000263f, -0.005674f, 0.011002f, 0.014182f, 0.014631f, 0.007636f, + 0.002839f, -0.006396f, -0.003946f, 0.000716f, 0.007741f, -0.004329f, 0.003901f, 0.000194f, 0.008721f, -0.004644f, 0.000338f, 0.001329f, -0.009168f, -0.006373f, -0.002297f, -0.010887f, 0.003000f, -0.003602f, 0.000482f, -0.002125f, -0.007892f, 0.005835f, 0.010659f, -0.002849f, 0.001384f, 0.000155f, -0.001035f, 0.009920f, -0.012411f, -0.000839f, 0.005959f, 0.000626f, 0.002305f, -0.003951f, -0.010164f, -0.003599f, 0.004789f, 0.004080f, 0.006116f, -0.001869f, 0.000818f, -0.000847f, 0.002826f, -0.002779f, 0.011935f, -0.000676f, -0.000294f, -0.008428f, 0.001736f, -0.006404f, -0.003282f, 0.003223f, 0.005732f, 0.010206f, 0.001461f, 0.009584f, 0.012896f, 0.021006f, 0.002780f, 0.010485f, -0.003806f, 0.006255f, 0.008084f, -0.002426f, -0.006490f, 0.011065f, 0.018970f, -0.003640f, 0.002123f, 0.007422f, -0.009051f, 0.005746f, 0.008132f, -0.016474f, 0.004710f, 0.001729f, -0.003671f, 0.000120f, -0.017192f, 0.000829f, 0.004916f, -0.008073f, 0.001611f, 0.000432f, 0.011162f, 0.008049f, -0.004034f, -0.001022f, -0.000919f, -0.011585f, -0.007756f, 0.001469f, 0.004909f, 0.001249f, 0.005453f, -0.007570f, + 0.001368f, 0.004083f, 0.001016f, -0.006973f, -0.005028f, -0.001367f, 0.002759f, 0.006054f, 0.006296f, 0.004263f, 0.007330f, 0.007139f, -0.007379f, -0.002081f, 0.000681f, 0.010067f, -0.001083f, 0.007324f, -0.004165f, -0.004439f, -0.000984f, -0.008424f, -0.003505f, 0.002183f, 0.005736f, -0.007079f, 0.008026f, -0.001620f, -0.001403f, -0.000960f, -0.002059f, -0.003217f, 0.002602f, 0.006383f, 0.003481f, 0.010401f, -0.011014f, -0.002715f, -0.002016f, -0.006023f, 0.002154f, 0.012538f, 0.016802f, 0.010345f, -0.004714f, 0.007751f, -0.004898f, -0.002659f, -0.015100f, -0.011336f, 0.004899f, 0.011620f, 0.010607f, 0.011838f, 0.002153f, 0.000981f, 0.006698f, -0.009118f, 0.009120f, 0.008082f, 0.000294f, 0.006992f, 0.016615f, 0.011948f, 0.002820f, -0.011888f, -0.000078f, 0.004472f, 0.002203f, 0.002377f, -0.013861f, 0.003569f, 0.002017f, 0.009336f, 0.009451f, -0.002757f, 0.005898f, -0.004467f, -0.005832f, 0.007577f, 0.003610f, -0.012479f, -0.012647f, -0.004958f, -0.007333f, -0.004714f, -0.005939f, -0.014461f, -0.013952f, -0.000836f, 0.004307f, 0.000301f, -0.001970f, -0.009600f, 0.000764f, 0.012273f, + -0.003915f, -0.003325f, 0.003867f, 0.000419f, 0.007961f, 0.004782f, 0.003744f, -0.005033f, -0.007495f, 0.013291f, 0.005152f, -0.004484f, 0.007710f, -0.000404f, 0.005890f, -0.004676f, 0.000561f, -0.023734f, -0.013996f, -0.004360f, 0.004490f, -0.009770f, 0.002976f, -0.002657f, 0.006827f, -0.001634f, -0.013304f, -0.010548f, 0.009194f, 0.007562f, 0.019024f, 0.016840f, -0.002557f, 0.012198f, -0.018296f, -0.002931f, 0.014219f, 0.004336f, 0.003298f, -0.001819f, -0.005976f, -0.002725f, 0.001968f, -0.001563f, -0.000554f, 0.007273f, -0.008968f, 0.002085f, 0.003262f, -0.000123f, 0.005665f, -0.006063f, -0.005050f, 0.003371f, -0.003927f, 0.005187f, -0.010021f, 0.001800f, -0.006018f, -0.002218f, -0.006703f, -0.004853f, -0.007614f, -0.011115f, 0.006934f, 0.000131f, 0.011818f, -0.010818f, -0.009448f, 0.000176f, 0.002273f, -0.001014f, -0.002257f, 0.001100f, 0.007132f, 0.003768f, 0.001554f, -0.004448f, -0.004659f, -0.002187f, -0.008784f, 0.001951f, -0.002233f, 0.001680f, -0.000342f, -0.008722f, -0.000690f, 0.000205f, -0.009893f, 0.001516f, -0.001619f, 0.002912f, -0.001131f, -0.007970f, 0.008048f, -0.012487f, + 0.004950f, -0.013994f, -0.002701f, 0.000961f, -0.010754f, 0.010163f, 0.007324f, -0.020925f, -0.002383f, 0.003802f, -0.002204f, -0.009028f, -0.012673f, 0.002791f, -0.006514f, -0.010108f, -0.005369f, 0.006345f, 0.005152f, 0.015233f, 0.019243f, -0.001487f, 0.017156f, -0.010498f, 0.006557f, 0.007811f, -0.001871f, 0.007694f, -0.004625f, 0.000365f, -0.001479f, -0.003395f, -0.002218f, -0.003826f, 0.014181f, -0.000615f, -0.011214f, -0.002389f, 0.006899f, 0.004731f, 0.005429f, 0.001367f, -0.005474f, 0.010836f, 0.021236f, 0.001563f, 0.001757f, 0.001487f, -0.002048f, 0.003654f, -0.001900f, 0.012607f, -0.009915f, 0.012079f, 0.007744f, -0.007264f, 0.003392f, 0.007980f, 0.004814f, -0.008723f, -0.010220f, -0.018978f, -0.003599f, -0.001483f, 0.002030f, 0.007833f, -0.002185f, 0.005274f, -0.001927f, -0.004657f, -0.005238f, 0.010492f, -0.002065f, 0.011136f, -0.014188f, -0.000266f, 0.006067f, 0.001973f, 0.000720f, 0.007000f, 0.022276f, 0.025212f, -0.006305f, -0.001184f, 0.005796f, -0.004512f, 0.017036f, 0.015650f, -0.009940f, 0.015302f, 0.012847f, 0.004140f, 0.007551f, 0.005784f, 0.003573f, -0.002156f, + 0.001385f, 0.001362f, -0.008615f, -0.011597f, 0.003002f, -0.003863f, 0.000014f, 0.000989f, -0.009408f, 0.008710f, 0.019408f, -0.001544f, -0.011512f, 0.017907f, 0.002344f, -0.000430f, 0.007435f, -0.004362f, -0.005666f, 0.001664f, -0.007130f, 0.001713f, 0.019227f, 0.007099f, -0.000222f, 0.005689f, 0.010374f, 0.025965f, -0.004583f, 0.010448f, -0.002496f, -0.013175f, 0.007591f, -0.000690f, -0.004145f, 0.003903f, 0.016450f, 0.002774f, 0.002707f, -0.001816f, 0.006401f, 0.022450f, 0.010499f, 0.001299f, 0.002124f, 0.004549f, -0.007281f, 0.010443f, -0.003520f, -0.025825f, 0.002571f, -0.004652f, 0.014068f, 0.014699f, 0.007154f, 0.000381f, -0.027962f, -0.004400f, -0.011206f, -0.015699f, -0.002715f, -0.011512f, 0.001649f, 0.007826f, -0.012506f, 0.013050f, -0.029063f, 0.003195f, -0.007777f, -0.017203f, -0.020443f, 0.021475f, 0.012449f, 0.000367f, -0.017970f, -0.013609f, 0.008347f, -0.025953f, -0.016198f, 0.004838f, 0.006486f, 0.024207f, -0.002075f, 0.001048f, 0.019932f, -0.012188f, 0.019603f, 0.005264f, 0.007953f, -0.004626f, -0.009861f, -0.002333f, 0.016531f, -0.009293f, 0.002518f, 0.018207f, + -0.005807f, -0.006696f, -0.008096f, -0.012448f, -0.008670f, -0.008428f, -0.014332f, -0.002922f, 0.005861f, -0.006346f, 0.004601f, -0.006119f, -0.006779f, 0.009771f, -0.012713f, 0.007380f, -0.010652f, -0.015929f, 0.001834f, 0.011135f, 0.001882f, -0.004808f, 0.005904f, -0.011088f, -0.003986f, -0.015129f, -0.023798f, -0.013028f, 0.004441f, -0.008964f, 0.029164f, 0.009602f, -0.018861f, -0.011908f, -0.001765f, 0.031921f, 0.020074f, 0.021975f, -0.006744f, -0.030232f, -0.002905f, -0.015295f, 0.003463f, 0.007187f, 0.016007f, -0.007352f, 0.006749f, -0.012216f, 0.001666f, -0.010734f, -0.028966f, -0.014995f, 0.010409f, -0.010034f, -0.023058f, -0.020869f, -0.020222f, -0.030468f, 0.003342f, -0.010450f, -0.023949f, -0.020771f, 0.003211f, 0.030002f, -0.004461f, -0.004626f, -0.010416f, -0.017672f, 0.003218f, -0.006847f, 0.001474f, -0.022139f, 0.000937f, -0.023081f, 0.002768f, -0.001610f, 0.012068f, 0.010019f, 0.009963f, 0.005651f, -0.001380f, 0.008949f, -0.006232f, 0.017337f, 0.004311f, 0.008893f, 0.004695f, -0.005350f, 0.005593f, 0.017433f, -0.002735f, 0.009824f, -0.002930f, 0.027260f, 0.003001f, 0.010352f, + 0.000839f, -0.015004f, -0.012096f, 0.000691f, -0.005868f, 0.003644f, -0.004428f, 0.009106f, 0.007469f, 0.010570f, -0.005383f, 0.006136f, -0.021513f, 0.011406f, 0.029068f, -0.015209f, -0.044123f, -0.007275f, -0.015382f, -0.023173f, 0.012542f, -0.044254f, -0.005694f, -0.015678f, -0.008512f, 0.012906f, -0.014017f, 0.018875f, 0.016278f, 0.002724f, 0.014711f, 0.001461f, 0.007861f, -0.011363f, -0.020213f, -0.022238f, -0.012363f, -0.020340f, 0.016258f, 0.021272f, -0.000661f, -0.010792f, 0.006333f, 0.006364f, -0.007448f, 0.001876f, -0.034738f, -0.018182f, 0.016645f, -0.008553f, 0.000844f, 0.016410f, -0.001120f, 0.010341f, 0.008898f, -0.004086f, 0.010153f, 0.000397f, -0.018187f, 0.021353f, -0.014088f, 0.001591f, 0.001728f, -0.010848f, 0.008271f, 0.013083f, -0.006640f, 0.014904f, 0.002327f, -0.000317f, -0.012159f, 0.016865f, 0.000780f, -0.012044f, -0.003342f, -0.024973f, -0.009848f, -0.013723f, -0.000705f, 0.019103f, 0.006479f, -0.000316f, 0.001808f, -0.015241f, 0.005549f, 0.014775f, -0.014828f, 0.003208f, 0.028724f, -0.007781f, 0.006580f, 0.007536f, 0.077761f, 0.018371f, -0.011109f, -0.014856f, + -0.002315f, -0.004046f, 0.013168f, -0.002135f, 0.011038f, 0.023288f, -0.009704f, 0.002152f, -0.015439f, -0.009038f, 0.004078f, -0.001340f, 0.010818f, -0.020907f, -0.013524f, 0.011560f, 0.021498f, 0.015773f, -0.001242f, 0.006462f, -0.005940f, -0.012000f, 0.009093f, 0.018568f, 0.017633f, 0.023192f, -0.018529f, -0.002895f, -0.010782f, -0.021003f, -0.003206f, 0.002649f, -0.005251f, 0.011848f, 0.013313f, 0.001556f, 0.006462f, -0.002381f, -0.024055f, -0.011268f, -0.032053f, -0.030583f, -0.009559f, 0.012692f, -0.004792f, -0.012399f, 0.027123f, 0.012283f, -0.001038f, -0.023307f, -0.001020f, -0.005590f, -0.017960f, 0.002608f, -0.007991f, -0.009248f, -0.024736f, -0.000503f, -0.008704f, -0.024737f, 0.000783f, 0.024441f, -0.013199f, -0.003114f, 0.009214f, -0.007734f, 0.006663f, -0.006799f, 0.020127f, 0.000968f, -0.011636f, -0.015237f, 0.018510f, -0.063125f, -0.034675f, 0.032133f, -0.007796f, 0.001220f, -0.016347f, 0.013477f, -0.005167f, -0.024975f, 0.012260f, 0.032399f, 0.004973f, -0.030195f, 0.008905f, -0.007377f, -0.006038f, 0.018171f, 0.020542f, -0.003755f, -0.003464f, 0.040928f, 0.009954f, -0.007157f, + -0.025287f, 0.010296f, -0.036528f, -0.031647f, -0.027612f, 0.010208f, -0.004862f, -0.004228f, 0.024564f, 0.008387f, -0.024130f, -0.021763f, 0.005696f, 0.022548f, 0.008494f, -0.004048f, 0.001652f, 0.014543f, -0.011225f, -0.027285f, 0.034025f, -0.011349f, 0.003701f, 0.012196f, 0.002264f, 0.003199f, 0.034875f, -0.000917f, 0.022221f, -0.000559f, -0.023249f, 0.001771f, 0.004980f, -0.006474f, 0.004407f, 0.014121f, -0.011848f, -0.005329f, 0.003942f, -0.047857f, 0.012086f, 0.007522f, -0.000405f, 0.009066f, 0.008483f, -0.019177f, 0.008033f, 0.060992f, 0.027287f, 0.013199f, 0.005168f, 0.012817f, -0.045683f, -0.042635f, 0.030248f, 0.030489f, 0.011075f, 0.016444f, -0.010617f, 0.049240f, -0.004883f, 0.018286f, 0.014096f, -0.023895f, -0.008420f, -0.011431f, 0.030181f, -0.018053f, -0.004282f, 0.017610f, 0.016549f, -0.017706f, -0.003459f, -0.049844f, 0.010376f, -0.006097f, -0.013231f, 0.003641f, 0.002563f, 0.003044f, 0.005778f, 0.016092f, 0.001963f, 0.017711f, 0.003479f, 0.008396f, -0.003376f, -0.016302f, -0.015531f, 0.031352f, -0.009928f, -0.023395f, -0.017950f, -0.009126f, -0.009207f, 0.013484f, + 0.010035f, 0.010362f, 0.015568f, 0.004007f, -0.015864f, 0.009827f, -0.026812f, -0.009391f, -0.023187f, 0.017042f, -0.028281f, -0.021462f, -0.004638f, -0.009976f, 0.010720f, 0.020348f, -0.014179f, 0.019317f, 0.033219f, 0.015955f, 0.032150f, -0.012123f, 0.042575f, 0.004385f, 0.036507f, 0.020311f, 0.006627f, -0.017231f, -0.043431f, -0.029766f, -0.022313f, -0.012727f, -0.010301f, 0.023467f, 0.011646f, -0.013003f, 0.038953f, 0.004662f, -0.038390f, 0.047961f, 0.003032f, -0.020072f, 0.016688f, -0.038931f, -0.007640f, -0.024686f, -0.007913f, -0.004147f, -0.007762f, -0.017560f, 0.004910f, -0.033580f, -0.013165f, -0.011926f, -0.045741f, 0.005837f, -0.033164f, -0.023267f, -0.037181f, 0.007748f, -0.028031f, -0.008181f, -0.009249f, 0.000589f, 0.014213f, -0.011120f, 0.020008f, 0.001307f, 0.026548f, -0.005881f, 0.023142f, 0.029214f, -0.034544f, -0.000267f, 0.009563f, 0.021494f, 0.001115f, 0.025781f, 0.008890f, 0.024848f, -0.000136f, -0.018640f, -0.011401f, -0.001649f, 0.016445f, -0.003538f, -0.006769f, -0.001503f, 0.030173f, 0.018702f, -0.006296f, -0.024331f, 0.008979f, 0.013324f, 0.010439f, 0.026070f, + -0.034016f, -0.026142f, -0.006208f, 0.002180f, -0.008496f, -0.000124f, -0.008480f, -0.022466f, 0.063372f, -0.031071f, -0.033133f, 0.025531f, 0.017574f, 0.005861f, -0.009146f, -0.009436f, 0.030097f, 0.023872f, 0.035780f, -0.011156f, -0.009959f, -0.049289f, 0.057640f, 0.027928f, -0.078742f, -0.040550f, 0.024152f, 0.035860f, 0.034095f, -0.021195f, -0.018964f, 0.043462f, 0.009257f, 0.010975f, 0.028527f, 0.024982f, -0.043801f, 0.014567f, 0.017447f, -0.001817f, 0.019637f, 0.005362f, -0.006217f, 0.005712f, -0.014697f, 0.073469f, 0.018170f, 0.010969f, -0.002631f, -0.007239f, -0.005483f, -0.039081f, 0.007178f, 0.013766f, -0.010249f, -0.011532f, -0.066688f, -0.029637f, 0.013172f, 0.013508f, -0.022338f, -0.019123f, -0.003672f, -0.029272f, 0.012303f, 0.013944f, -0.005311f, 0.015517f, 0.025262f, 0.003817f, -0.002190f, -0.005690f, -0.014826f, -0.001736f, 0.001330f, -0.045676f, -0.007619f, 0.014658f, 0.028364f, -0.049191f, 0.010140f, 0.022715f, -0.006065f, -0.020528f, -0.024854f, 0.044695f, 0.035957f, 0.000255f, -0.029675f, -0.036627f, 0.023895f, -0.017772f, 0.007060f, -0.014913f, -0.011791f, 0.001504f, + 0.016477f, 0.030697f, -0.056973f, -0.076012f, -0.051581f, -0.068053f, 0.059361f, -0.039664f, 0.024404f, -0.007194f, -0.046517f, 0.007901f, -0.011991f, -0.018157f, -0.060616f, -0.056871f, -0.041176f, -0.016572f, 0.003104f, -0.033095f, -0.008519f, 0.008133f, 0.027420f, 0.001642f, -0.015526f, -0.000371f, -0.016657f, 0.024995f, -0.030993f, 0.043787f, 0.039054f, -0.009480f, -0.011121f, -0.052742f, -0.029552f, -0.032189f, 0.004849f, 0.006741f, -0.007515f, 0.042537f, 0.013233f, 0.034454f, 0.007885f, -0.004319f, -0.014696f, 0.031023f, 0.022625f, 0.009626f, -0.030289f, 0.016649f, -0.051950f, -0.006038f, -0.004535f, -0.035294f, -0.004680f, 0.000383f, 0.041697f, 0.026854f, 0.001955f, 0.018781f, 0.000499f, -0.039911f, 0.021716f, 0.005800f, 0.034883f, -0.018620f, -0.036583f, 0.023483f, -0.066380f, -0.074160f, -0.008223f, -0.046777f, 0.001750f, -0.034132f, 0.030964f, -0.024030f, -0.003883f, 0.007543f, 0.010807f, 0.039993f, 0.011805f, -0.016333f, 0.040678f, 0.014273f, -0.072478f, 0.013002f, -0.043968f, -0.001778f, 0.006945f, -0.004702f, 0.033988f, -0.009156f, 0.005200f, 0.010188f, 0.001907f, -0.021575f, + 0.034523f, -0.019388f, -0.003152f, -0.040480f, -0.001218f, 0.008381f, -0.007787f, -0.013398f, -0.020340f, -0.020526f, 0.052974f, 0.003468f, 0.026873f, -0.046919f, 0.004287f, 0.000691f, 0.015408f, 0.030071f, -0.034293f, 0.060182f, 0.083679f, -0.002596f, 0.007079f, -0.028340f, 0.012488f, 0.020986f, -0.017439f, 0.005453f, 0.014944f, 0.034108f, -0.002055f, 0.003096f, -0.011128f, -0.027526f, -0.043850f, 0.022946f, -0.032988f, -0.012692f, -0.021710f, 0.010144f, 0.028600f, 0.026597f, -0.005177f, 0.010111f, -0.057853f, 0.038536f, -0.005643f, 0.007813f, -0.013107f, 0.036492f, 0.094165f, 0.027529f, 0.068333f, 0.022448f, -0.072294f, 0.029302f, 0.019400f, -0.023436f, 0.004303f, 0.046805f, 0.001458f, 0.044808f, 0.038681f, -0.045644f, 0.024731f, -0.045673f, -0.031804f, -0.003956f, 0.092003f, 0.028899f, -0.042543f, 0.039906f, 0.024715f, -0.050625f, -0.023265f, -0.003102f, 0.051106f, 0.008045f, -0.048258f, -0.026322f, -0.002302f, -0.012628f, 0.027960f, 0.041918f, -0.015892f, 0.036909f, -0.024433f, -0.031500f, -0.002015f, 0.075644f, 0.006063f, -0.042876f, 0.023626f, -0.001679f, -0.005296f, 0.021424f, + -0.050092f, -0.042053f, -0.041315f, 0.029852f, -0.027449f, 0.009863f, 0.011449f, 0.045355f, 0.021133f, 0.046614f, 0.003770f, -0.001663f, 0.036553f, 0.069611f, 0.039976f, -0.068206f, 0.000215f, 0.006965f, -0.012805f, 0.013494f, 0.017856f, -0.052701f, -0.009032f, 0.010611f, 0.008332f, -0.063085f, -0.060099f, -0.033925f, -0.035465f, 0.061194f, -0.036839f, 0.027837f, -0.072741f, 0.052983f, 0.057397f, 0.017077f, 0.062611f, -0.063904f, -0.032448f, -0.016515f, -0.093924f, 0.053648f, 0.004643f, 0.033673f, 0.042201f, 0.043022f, 0.002688f, -0.000078f, 0.042031f, -0.005445f, -0.050967f, -0.051101f, 0.031326f, -0.057859f, 0.057450f, -0.015150f, 0.012350f, 0.058787f, 0.051384f, -0.024439f, 0.078442f, -0.043983f, 0.004919f, -0.045731f, 0.007547f, -0.014445f, 0.030912f, 0.012366f, -0.033643f, 0.032104f, 0.045947f, 0.069406f, -0.038824f, 0.016524f, 0.041597f, -0.054636f, 0.002932f, -0.020520f, -0.081801f, -0.032915f, 0.022461f, -0.042555f, 0.016718f, -0.035148f, -0.000140f, 0.058297f, -0.025337f, 0.026599f, 0.064906f, 0.048945f, 0.018413f, 0.088491f, -0.130493f, -0.020868f, 0.046054f, -0.000630f, + 0.028079f, -0.035901f, -0.068450f, 0.092468f, 0.002495f, -0.036922f, 0.023679f, 0.063230f, 0.143346f, 0.062746f, -0.025184f, 0.013250f, 0.007725f, 0.066864f, -0.058379f, -0.008424f, -0.026352f, -0.039202f, 0.058868f, -0.024615f, 0.076388f, -0.010146f, -0.053597f, 0.085170f, 0.130317f, -0.021038f, -0.037559f, -0.064366f, 0.017736f, 0.064715f, 0.016458f, -0.017161f, -0.038975f, 0.007086f, 0.013209f, -0.012294f, 0.013726f, -0.008999f, -0.017373f, -0.024164f, 0.022901f, 0.024743f, 0.001344f, 0.034478f, -0.032662f, 0.073909f, 0.061672f, 0.030285f, 0.000919f, 0.001349f, 0.014794f, -0.044053f, -0.031746f, -0.042866f, -0.016716f, -0.014247f, 0.028874f, 0.018182f, 0.046152f, -0.023773f, -0.000461f, -0.021572f, 0.052281f, 0.089045f, -0.016964f, -0.063630f, -0.033227f, -0.006480f, -0.075309f, 0.058658f, -0.103902f, 0.027309f, 0.052897f, 0.043240f, -0.040942f, 0.006387f, 0.056103f, -0.116217f, -0.043966f, 0.017531f, -0.001806f, -0.061291f, -0.037136f, -0.012177f, -0.010008f, 0.076930f, -0.046431f, 0.013003f, 0.074812f, 0.001023f, -0.023655f, 0.060213f, 0.045194f, -0.013963f, -0.038238f, -0.061017f, + 0.012649f, 0.116341f, 0.027070f, 0.059043f, -0.004060f, 0.004016f, -0.003521f, -0.015082f, 0.001239f, 0.004126f, 0.029724f, 0.008127f, -0.021588f, 0.018273f, -0.018729f, -0.023306f, -0.023605f, -0.000709f, 0.024878f, 0.003771f, 0.020164f, 0.018873f, 0.017673f, -0.017926f, -0.027837f, 0.007836f, -0.018854f, -0.051996f, -0.013586f, 0.009997f, -0.016216f, 0.057559f, -0.059503f, 0.048076f, -0.014237f, -0.001215f, 0.074969f, -0.013151f, -0.000405f, 0.094213f, -0.013056f, -0.040776f, 0.008802f, -0.035257f, -0.005744f, -0.033466f, 0.108778f, -0.032190f, 0.027865f, -0.027742f, -0.009243f, -0.016834f, 0.020214f, -0.029210f, -0.062746f, 0.026418f, -0.004438f, -0.075312f, 0.041550f, -0.021932f, 0.044648f, 0.088090f, -0.040448f, -0.004313f, 0.002540f, -0.016418f, -0.035326f, -0.026018f, -0.000010f, 0.122409f, 0.062075f, 0.128368f, -0.072053f, -0.018829f, 0.042241f, -0.040408f, 0.030469f, 0.131868f, 0.031058f, 0.018762f, -0.035202f, -0.033279f, 0.037485f, -0.020502f, 0.053099f, -0.009333f, -0.012735f, -0.016144f, -0.076538f, 0.017625f, 0.090719f, -0.048993f, 0.054537f, 0.047384f, -0.031709f, -0.010191f, + 0.037152f, -0.061652f, 0.029345f, -0.005320f, 0.044756f, 0.014410f, -0.039103f, -0.013413f, -0.077621f, -0.040443f, 0.034489f, 0.025601f, 0.057932f, 0.091199f, 0.008336f, -0.000064f, -0.081895f, -0.050653f, -0.049711f, -0.041197f, 0.019055f, -0.034592f, -0.011467f, -0.009507f, 0.021755f, -0.063402f, -0.012347f, 0.029452f, 0.013726f, 0.048075f, -0.009641f, -0.026832f, 0.047126f, -0.011955f, 0.027386f, -0.041800f, -0.027117f, -0.009384f, -0.017088f, 0.020897f, 0.031899f, 0.047487f, 0.009269f, -0.000510f, -0.041986f, -0.015534f, -0.026204f, 0.036988f, -0.035805f, -0.123567f, 0.001216f, 0.204683f, 0.180550f, 0.174039f, 0.070851f, -0.070460f, -0.102888f, -0.097684f, -0.091350f, -0.161897f, -0.119132f, -0.111811f, 0.086984f, 0.138860f, 0.109507f, 0.179972f, 0.145922f, 0.034225f, -0.008177f, -0.060313f, -0.124702f, -0.070532f, -0.130873f, -0.067204f, -0.044470f, 0.004063f, -0.018279f, 0.036020f, 0.054858f, 0.098217f, 0.058829f, 0.103132f, 0.075101f, 0.082830f, 0.005692f, -0.061073f, -0.029937f, 0.006380f, -0.071215f, -0.089593f, -0.122044f, -0.115549f, -0.084911f, -0.007356f, 0.059969f, 0.028366f, + 0.087293f, 0.066355f, 0.099727f, 0.093306f, 0.097020f, 0.116765f, 0.061337f, -0.002642f, -0.016061f, -0.066330f, -0.057072f, -0.189320f, -0.153931f, -0.118465f, -0.094695f, 0.019268f, -0.038538f, 0.011386f, 0.139271f, 0.174940f, 0.232987f, 0.153988f, 0.094754f, 0.071368f, 0.025433f, -0.070837f, -0.062369f, -0.099481f, -0.125293f, -0.075830f, -0.015180f, 0.002158f}, + {-0.010810f, -0.006811f, -0.000989f, -0.010200f, 0.009038f, -0.008200f, -0.009842f, 0.004319f, -0.002893f, -0.002232f, 0.002619f, -0.011627f, -0.002391f, 0.008406f, -0.005828f, -0.002075f, -0.009107f, 0.002601f, -0.006785f, -0.012347f, 0.005112f, 0.002238f, 0.004337f, -0.004922f, -0.005999f, 0.006689f, 0.001904f, 0.007574f, 0.007870f, -0.008489f, 0.007689f, -0.002331f, -0.002324f, 0.005349f, -0.001267f, 0.004841f, 0.008338f, 0.007809f, 0.001499f, 0.003256f, 0.003019f, -0.006985f, -0.003389f, -0.002675f, 0.001304f, 0.006007f, -0.011659f, -0.002812f, -0.000631f, -0.000836f, -0.005339f, 0.000862f, 0.004790f, -0.006163f, 0.004184f, -0.004878f, -0.011781f, 0.002388f, 0.002310f, 0.001453f, -0.004615f, -0.001428f, -0.003060f, 0.005490f, -0.001448f, -0.000283f, 0.000244f, 0.003818f, 0.001239f, 0.002341f, 0.003210f, -0.008379f, -0.004403f, 0.004322f, -0.001007f, -0.002042f, 0.002106f, -0.002408f, 0.008340f, 0.009250f, 0.005064f, -0.003652f, -0.013989f, -0.012945f, 0.004746f, 0.007354f, -0.002659f, 0.013777f, -0.002601f, 0.008205f, -0.009741f, -0.008699f, 0.003858f, 0.000308f, -0.002466f, 0.003622f, + 0.009049f, -0.003929f, 0.001332f, -0.005148f, -0.000420f, 0.000457f, 0.003767f, 0.003403f, 0.004701f, 0.000752f, 0.002841f, 0.010231f, -0.003847f, -0.004792f, -0.005064f, -0.009271f, 0.002779f, -0.001941f, 0.017081f, 0.003314f, -0.001159f, 0.001357f, 0.010416f, -0.000922f, -0.002116f, -0.002589f, -0.005904f, -0.001063f, 0.008053f, -0.001164f, 0.003428f, 0.008066f, -0.002360f, -0.000504f, -0.012714f, -0.007484f, -0.011571f, -0.002202f, -0.003231f, 0.001842f, 0.000832f, 0.001816f, 0.004395f, -0.002673f, 0.002250f, 0.000293f, 0.001288f, 0.001975f, -0.004000f, 0.004269f, -0.001055f, -0.004623f, -0.000211f, -0.004600f, -0.000944f, 0.000931f, 0.009658f, 0.022437f, 0.009002f, 0.005229f, 0.006364f, -0.013350f, -0.001457f, 0.005608f, -0.001696f, 0.002127f, -0.011987f, 0.011770f, 0.016190f, 0.002663f, 0.007284f, -0.003503f, -0.009333f, -0.014722f, -0.015899f, -0.010751f, 0.012769f, -0.012086f, -0.007511f, -0.010249f, 0.003339f, 0.008297f, 0.001682f, 0.001014f, 0.004799f, -0.000607f, 0.003065f, 0.010245f, -0.001367f, 0.008493f, -0.008128f, 0.007734f, 0.005569f, 0.004864f, -0.004238f, -0.013568f, + -0.002765f, 0.007537f, 0.004645f, -0.003904f, -0.000354f, 0.002503f, -0.000471f, -0.006638f, -0.001259f, 0.005327f, -0.001782f, 0.000439f, -0.003093f, -0.000885f, 0.000510f, 0.001654f, 0.009599f, 0.003777f, -0.004732f, 0.000624f, 0.000922f, -0.003422f, 0.001880f, -0.004901f, -0.000380f, 0.007467f, 0.002697f, 0.008393f, -0.005934f, -0.005541f, -0.002883f, -0.001635f, 0.004756f, 0.009482f, -0.005138f, -0.007429f, 0.009025f, 0.001366f, -0.003666f, 0.004103f, -0.000869f, 0.006591f, 0.002794f, -0.007439f, -0.007011f, -0.007976f, -0.001267f, -0.006522f, -0.013692f, -0.013056f, 0.013402f, -0.000339f, 0.002789f, -0.000152f, 0.008137f, -0.012163f, 0.017934f, 0.015913f, 0.000765f, 0.000783f, -0.000047f, 0.000401f, -0.001856f, 0.006176f, 0.004779f, 0.000310f, -0.010336f, 0.004345f, -0.003284f, 0.004826f, -0.001544f, 0.010806f, -0.002670f, -0.006459f, -0.003016f, -0.001829f, 0.003892f, -0.000191f, 0.006583f, -0.010961f, 0.005664f, 0.001754f, -0.006203f, 0.016905f, -0.002914f, -0.002589f, -0.000581f, -0.000421f, -0.004736f, -0.001613f, 0.008837f, 0.007281f, -0.016261f, -0.007711f, 0.007814f, 0.002158f, + -0.004160f, 0.013715f, 0.000137f, 0.002924f, 0.013276f, 0.005456f, 0.010286f, 0.002836f, -0.004647f, -0.005782f, -0.011352f, -0.010615f, 0.000801f, 0.005363f, 0.012431f, 0.000381f, -0.006629f, -0.018256f, -0.006335f, -0.008894f, 0.008300f, -0.006082f, 0.005396f, -0.006576f, -0.002694f, 0.015439f, 0.007572f, -0.010289f, 0.004694f, 0.014724f, 0.002171f, -0.005196f, -0.010351f, -0.012468f, -0.008527f, -0.012536f, 0.008306f, 0.001865f, 0.004568f, -0.002425f, -0.005670f, -0.005996f, -0.011032f, 0.000552f, -0.000357f, 0.002599f, -0.002708f, -0.010042f, 0.000138f, 0.010690f, -0.002403f, 0.000110f, -0.005371f, -0.010687f, -0.015840f, -0.001369f, 0.011335f, 0.004133f, 0.001141f, -0.005359f, 0.001393f, -0.008569f, -0.002881f, -0.006443f, 0.000738f, 0.001469f, -0.009854f, 0.011036f, -0.006308f, 0.014043f, 0.005188f, 0.001362f, -0.006500f, -0.003308f, 0.003459f, -0.000760f, 0.003250f, 0.007578f, 0.001354f, 0.003044f, -0.008525f, 0.004985f, -0.004400f, 0.012961f, 0.015733f, 0.007397f, 0.010481f, 0.005063f, -0.001891f, -0.011158f, -0.007463f, 0.000862f, 0.008149f, 0.007656f, 0.006170f, -0.014787f, + 0.002000f, -0.015809f, -0.000005f, 0.002344f, 0.001528f, 0.007030f, 0.000774f, 0.001056f, 0.027906f, -0.003565f, -0.012239f, -0.013339f, 0.014046f, 0.009294f, -0.010494f, 0.002471f, -0.011712f, -0.005127f, 0.000450f, 0.013233f, -0.016457f, 0.004724f, -0.000589f, 0.002537f, -0.001205f, 0.016809f, -0.008691f, 0.004663f, -0.002592f, -0.004589f, 0.002623f, -0.000932f, 0.005122f, -0.005303f, -0.004753f, -0.014445f, 0.002294f, -0.004898f, -0.003031f, 0.000976f, -0.005019f, 0.004050f, -0.008026f, -0.004989f, -0.014159f, -0.000630f, -0.012569f, -0.005542f, -0.014960f, 0.010902f, 0.002298f, -0.004866f, 0.009827f, -0.011660f, -0.000033f, -0.021985f, -0.001149f, 0.007119f, -0.000584f, 0.006003f, 0.013775f, -0.005313f, -0.001963f, 0.016694f, 0.007231f, 0.006013f, 0.010449f, -0.006221f, -0.016071f, -0.002642f, -0.009762f, 0.005736f, 0.015491f, -0.004590f, 0.003808f, -0.001871f, 0.007720f, 0.009018f, 0.003059f, -0.005244f, 0.003679f, 0.002437f, 0.016754f, -0.002478f, -0.003838f, -0.022758f, -0.006670f, 0.017264f, 0.016551f, 0.010863f, 0.008263f, 0.024517f, 0.001255f, -0.029158f, -0.007760f, -0.004830f, + -0.007362f, 0.015597f, -0.002772f, -0.005651f, 0.017834f, 0.002838f, -0.007823f, -0.002611f, 0.006893f, -0.006470f, -0.002920f, 0.002176f, -0.002715f, -0.010229f, -0.005030f, -0.000548f, -0.010272f, -0.004591f, -0.004593f, 0.006763f, -0.005106f, 0.013106f, 0.012339f, 0.001114f, 0.011681f, 0.008426f, -0.006105f, -0.002055f, -0.004812f, -0.019178f, 0.001475f, 0.003704f, -0.018765f, -0.002833f, -0.005878f, 0.006202f, 0.015683f, 0.002220f, -0.017622f, 0.002136f, -0.007421f, -0.011634f, 0.008065f, -0.003033f, -0.013174f, 0.005002f, 0.003277f, 0.012770f, -0.002593f, -0.002168f, 0.007956f, 0.010968f, 0.010488f, -0.013630f, 0.006289f, 0.011398f, -0.029639f, 0.012152f, -0.003035f, -0.007118f, -0.005932f, 0.004807f, -0.002651f, -0.018060f, -0.018708f, 0.001947f, 0.029588f, 0.007737f, -0.021295f, 0.004437f, 0.017574f, -0.012984f, 0.002349f, -0.003610f, 0.010475f, -0.000525f, 0.009647f, 0.025278f, 0.018766f, 0.011211f, -0.000454f, -0.002649f, -0.011948f, -0.013296f, 0.005007f, -0.033932f, -0.005376f, 0.015229f, 0.001641f, -0.002300f, -0.016142f, -0.006336f, -0.000875f, -0.001390f, -0.007996f, -0.017216f, + 0.018249f, -0.007122f, -0.004367f, -0.003739f, -0.015659f, -0.018004f, -0.000938f, -0.009223f, 0.000749f, 0.007338f, 0.005775f, 0.006038f, -0.014226f, -0.004493f, -0.007339f, -0.005262f, 0.021283f, -0.003362f, -0.010812f, -0.000395f, 0.027321f, -0.016203f, 0.003770f, 0.019511f, -0.000436f, -0.006084f, -0.011674f, 0.004901f, -0.000170f, 0.013422f, -0.009582f, 0.011004f, 0.008528f, 0.017809f, 0.007614f, 0.016739f, 0.025107f, 0.014630f, 0.002973f, -0.005716f, -0.008762f, -0.020897f, -0.005453f, 0.013103f, -0.027374f, -0.011830f, 0.025872f, -0.035557f, -0.005863f, 0.019277f, 0.025197f, -0.002911f, -0.024279f, 0.003070f, -0.008965f, 0.032807f, 0.015231f, -0.023123f, -0.014130f, -0.003837f, -0.013517f, -0.028988f, -0.013800f, -0.013029f, -0.009828f, -0.023510f, 0.012233f, 0.003840f, 0.014897f, -0.009106f, -0.003722f, -0.020675f, -0.001524f, -0.017958f, 0.002418f, -0.012002f, 0.003185f, 0.005990f, -0.026780f, -0.009174f, -0.009834f, -0.007435f, 0.006482f, 0.005687f, -0.008147f, 0.026836f, -0.001159f, -0.007169f, -0.004469f, 0.002508f, -0.005740f, -0.002304f, 0.010629f, 0.008494f, 0.011830f, 0.014765f, + 0.014644f, 0.001095f, 0.009816f, -0.004494f, 0.021657f, 0.022517f, -0.010682f, -0.005881f, 0.014494f, -0.000417f, -0.033372f, 0.001463f, -0.016384f, 0.010221f, 0.012205f, -0.018070f, -0.023761f, -0.010364f, -0.022989f, -0.030721f, 0.021468f, 0.003058f, 0.011626f, -0.016602f, -0.019035f, -0.024194f, -0.017824f, 0.008573f, -0.019462f, -0.015833f, 0.021815f, -0.004845f, 0.000162f, 0.006335f, 0.012061f, -0.009246f, -0.008577f, 0.004591f, -0.007063f, 0.004395f, -0.002100f, -0.010367f, -0.022420f, -0.032748f, 0.010130f, -0.023280f, -0.023114f, 0.002019f, -0.006834f, -0.000692f, -0.013474f, 0.006495f, 0.005367f, -0.026519f, -0.001655f, -0.005140f, -0.011799f, -0.014346f, 0.007557f, 0.002741f, 0.026246f, 0.004162f, -0.016512f, -0.000047f, 0.001360f, 0.012208f, 0.003511f, 0.025203f, -0.003335f, -0.025466f, 0.010015f, -0.004641f, 0.010597f, -0.014810f, 0.002065f, 0.009968f, -0.048131f, -0.021150f, 0.015024f, -0.000367f, -0.006557f, 0.008283f, -0.003981f, 0.030655f, -0.002697f, 0.019916f, 0.014542f, -0.022556f, -0.029378f, 0.003167f, -0.031957f, 0.015735f, 0.065740f, -0.016363f, -0.043632f, -0.004133f, + -0.018854f, 0.047416f, 0.004095f, 0.026528f, 0.014864f, -0.008374f, -0.020541f, -0.009479f, -0.022380f, -0.005894f, 0.032633f, -0.035637f, 0.002165f, -0.029020f, 0.008607f, 0.002563f, 0.014975f, 0.003479f, -0.013158f, -0.023360f, -0.026642f, -0.004817f, -0.026062f, -0.020788f, 0.004436f, 0.006676f, 0.021106f, -0.018320f, -0.038016f, -0.007694f, -0.012410f, 0.005257f, -0.017145f, -0.011802f, 0.006966f, -0.009103f, -0.014157f, -0.000304f, 0.003196f, -0.007130f, 0.039718f, -0.006910f, -0.004563f, 0.010621f, 0.011768f, -0.010233f, -0.002878f, 0.029389f, 0.025727f, 0.016819f, 0.031971f, 0.024710f, 0.002436f, 0.011303f, 0.019486f, -0.010873f, -0.009009f, 0.005345f, 0.015251f, 0.021868f, 0.011500f, 0.042482f, 0.008175f, 0.029553f, -0.003376f, -0.012539f, -0.005120f, 0.060524f, 0.015934f, -0.003080f, 0.000381f, -0.015002f, 0.014799f, -0.059750f, -0.018881f, 0.026347f, -0.004443f, -0.031692f, -0.025069f, -0.011658f, 0.033552f, 0.014196f, -0.022629f, 0.011478f, -0.030909f, -0.016073f, -0.001603f, -0.024290f, -0.027511f, 0.022747f, 0.016235f, -0.029069f, -0.006980f, 0.055051f, 0.015768f, -0.027823f, + -0.032557f, -0.001717f, 0.021274f, 0.000878f, 0.005677f, -0.042408f, 0.001273f, -0.006869f, -0.026322f, -0.019133f, -0.009133f, -0.025416f, -0.008422f, 0.004309f, 0.003414f, -0.026749f, -0.021799f, 0.000680f, 0.017863f, -0.002863f, 0.023097f, 0.031827f, -0.021505f, 0.018729f, 0.018716f, 0.004172f, 0.007346f, 0.023223f, 0.010831f, 0.013237f, 0.013489f, 0.011585f, -0.001964f, -0.005996f, 0.032485f, 0.043199f, 0.010680f, -0.013848f, 0.008789f, -0.009889f, -0.014260f, 0.025975f, -0.011007f, -0.028399f, -0.035667f, -0.017344f, -0.041967f, 0.018628f, -0.014728f, -0.012461f, 0.001531f, -0.011515f, -0.010879f, -0.025812f, 0.022000f, 0.012340f, -0.003318f, 0.013795f, 0.011138f, 0.029986f, 0.024019f, -0.050276f, -0.016045f, 0.054623f, -0.043103f, -0.013496f, -0.025959f, 0.038704f, 0.017927f, 0.017459f, 0.008026f, 0.005066f, 0.016128f, 0.041022f, 0.020231f, -0.019145f, -0.000018f, 0.000595f, -0.000838f, 0.015707f, 0.018897f, 0.001404f, 0.011299f, 0.009618f, -0.009291f, 0.012002f, 0.008048f, 0.024822f, -0.012126f, -0.025835f, -0.021062f, -0.017678f, 0.005147f, -0.003292f, 0.010068f, 0.009994f, + 0.011447f, 0.021460f, -0.009781f, 0.003460f, -0.009879f, -0.019134f, -0.007033f, 0.000372f, -0.020299f, 0.024474f, 0.031670f, -0.036049f, 0.011765f, -0.025643f, 0.019454f, -0.005921f, 0.007555f, -0.004833f, -0.019022f, -0.007083f, 0.021779f, -0.019827f, -0.005376f, 0.000779f, -0.035205f, -0.016938f, 0.007097f, -0.031276f, -0.002215f, 0.038243f, 0.021090f, -0.009620f, -0.010704f, 0.034437f, -0.002770f, -0.008145f, -0.028664f, 0.001104f, 0.002719f, -0.007874f, -0.000649f, -0.013501f, 0.004976f, -0.041424f, 0.037521f, -0.007848f, -0.013428f, -0.026351f, -0.029592f, -0.003340f, 0.035705f, -0.006828f, 0.009740f, -0.022518f, -0.013042f, -0.006558f, -0.021849f, -0.026444f, 0.023521f, -0.015134f, -0.012319f, 0.020675f, 0.020168f, -0.029493f, 0.009721f, 0.010498f, 0.024711f, 0.020265f, -0.008054f, -0.018899f, -0.012099f, -0.028776f, 0.030518f, 0.019870f, 0.009726f, 0.021574f, -0.023573f, 0.015111f, -0.004003f, 0.013785f, 0.015241f, -0.015658f, -0.001954f, 0.049914f, 0.041560f, -0.032695f, 0.011957f, 0.025586f, -0.021103f, 0.005584f, -0.048243f, 0.013494f, -0.026627f, 0.020483f, -0.015969f, -0.016962f, + -0.012770f, 0.055820f, 0.001909f, -0.016949f, 0.003573f, 0.018567f, 0.000926f, 0.011072f, -0.032143f, -0.003332f, 0.048658f, -0.000829f, -0.022325f, 0.007124f, -0.043339f, -0.022964f, -0.023448f, 0.019381f, -0.008844f, 0.029798f, 0.021297f, 0.038470f, -0.018213f, -0.003797f, -0.029929f, 0.024892f, 0.051120f, -0.017517f, -0.037210f, 0.001619f, -0.006114f, 0.058158f, -0.013016f, -0.025978f, 0.024876f, 0.010374f, 0.011479f, 0.020394f, 0.009572f, -0.078319f, 0.002095f, -0.007540f, 0.031457f, 0.050837f, -0.048578f, -0.000547f, 0.016900f, -0.026761f, -0.003119f, -0.071495f, -0.013815f, 0.032390f, -0.054893f, -0.036689f, -0.015636f, -0.025026f, 0.024334f, -0.016663f, -0.018448f, 0.027315f, 0.010959f, 0.007943f, 0.033010f, 0.000217f, -0.009036f, 0.018909f, 0.034551f, -0.035406f, -0.022058f, 0.045205f, 0.035324f, 0.007535f, 0.017272f, 0.007545f, -0.020201f, -0.035960f, 0.001773f, -0.004076f, -0.004663f, 0.005175f, -0.017271f, 0.008413f, -0.024541f, 0.005061f, 0.064380f, -0.035296f, -0.021201f, 0.026903f, 0.013548f, -0.019611f, 0.018140f, 0.016182f, 0.026699f, -0.061488f, -0.113271f, -0.052310f, + -0.007693f, 0.038665f, 0.003046f, 0.042674f, 0.039708f, -0.011787f, 0.006786f, -0.009488f, -0.021124f, -0.035298f, -0.020140f, -0.025393f, -0.014332f, 0.040723f, -0.051976f, -0.008855f, -0.043158f, -0.054050f, -0.008782f, -0.054521f, -0.043350f, 0.005788f, -0.010686f, -0.005923f, 0.010916f, 0.048592f, 0.004361f, -0.034486f, 0.003063f, -0.003709f, -0.009369f, -0.044877f, -0.001752f, 0.054615f, 0.006309f, -0.000388f, 0.023308f, 0.042571f, 0.029770f, 0.007904f, -0.015538f, 0.015210f, -0.012700f, -0.037966f, -0.068854f, 0.067737f, -0.006608f, 0.056498f, -0.002692f, 0.001237f, -0.017962f, -0.031896f, 0.061305f, -0.033145f, -0.024788f, -0.002537f, -0.040363f, -0.040221f, 0.036413f, 0.024634f, 0.015978f, -0.004531f, 0.020423f, -0.030437f, 0.015237f, -0.025393f, -0.030130f, -0.039506f, -0.024453f, -0.026985f, -0.045630f, 0.001422f, -0.043732f, -0.046723f, -0.010113f, -0.020337f, -0.055265f, -0.072036f, 0.006473f, -0.026109f, 0.011724f, -0.003482f, 0.025802f, 0.064093f, 0.001235f, 0.008280f, -0.033502f, -0.031973f, 0.026225f, 0.017550f, -0.024798f, 0.001941f, 0.016431f, -0.040298f, -0.034323f, -0.000467f, + 0.051493f, -0.044138f, -0.001334f, 0.002895f, 0.022650f, -0.037456f, 0.038947f, 0.023252f, 0.009633f, 0.000696f, -0.018998f, -0.043793f, -0.002430f, -0.009162f, 0.014499f, -0.022996f, -0.062413f, 0.051503f, -0.038398f, -0.014552f, -0.004531f, 0.050393f, -0.039065f, 0.018731f, -0.032456f, 0.020473f, -0.013054f, -0.043246f, 0.019397f, -0.055571f, -0.014670f, -0.014900f, 0.017853f, 0.048247f, -0.029223f, 0.018707f, 0.045234f, -0.036679f, 0.003987f, 0.012664f, 0.008737f, 0.015099f, -0.071800f, -0.019808f, -0.014647f, 0.025563f, 0.001681f, 0.000077f, 0.007599f, -0.013384f, 0.080247f, 0.009244f, 0.033445f, 0.094105f, -0.044285f, -0.023325f, -0.037172f, -0.012403f, 0.042220f, 0.004084f, 0.052214f, 0.015542f, -0.002468f, -0.018295f, 0.039422f, -0.023378f, 0.008636f, -0.015041f, 0.016094f, -0.024686f, 0.030093f, -0.013052f, -0.007383f, -0.015532f, 0.023175f, 0.017984f, -0.025932f, -0.004082f, 0.024529f, 0.009597f, -0.016593f, 0.003911f, -0.021267f, -0.067535f, 0.030377f, -0.034240f, -0.053649f, 0.035845f, 0.014896f, 0.038684f, -0.003152f, -0.032126f, -0.012812f, -0.006350f, 0.021214f, 0.031071f, + 0.031417f, 0.055082f, 0.051514f, -0.019136f, 0.007578f, -0.050334f, 0.001156f, -0.035446f, -0.069615f, -0.002807f, -0.056551f, 0.022936f, -0.044924f, -0.025537f, -0.029373f, -0.038055f, 0.005294f, -0.004999f, 0.004773f, -0.007264f, -0.004129f, 0.002140f, -0.072885f, 0.018174f, 0.012951f, 0.023702f, 0.037604f, 0.000432f, -0.056785f, 0.041573f, 0.001618f, -0.007411f, -0.004679f, 0.055450f, 0.110986f, -0.062219f, -0.045768f, -0.086802f, -0.168713f, -0.045062f, -0.015632f, 0.035436f, 0.025352f, -0.017640f, -0.030807f, 0.043846f, 0.059273f, 0.002010f, -0.000651f, -0.002663f, -0.043060f, -0.029647f, -0.029987f, -0.027669f, -0.045765f, -0.003793f, -0.010143f, -0.008968f, 0.034611f, -0.048091f, 0.037733f, 0.030377f, -0.008770f, 0.013959f, -0.000283f, -0.083235f, -0.055213f, -0.035263f, -0.027500f, -0.017013f, 0.007780f, 0.027024f, 0.011370f, 0.012705f, 0.078346f, 0.066105f, 0.017093f, -0.056102f, -0.025938f, -0.006468f, -0.025725f, -0.053706f, -0.122250f, -0.108042f, -0.045764f, -0.015839f, 0.005745f, 0.021983f, -0.084927f, -0.054498f, 0.044664f, 0.045810f, 0.061906f, -0.062281f, -0.068320f, 0.015712f, + -0.041896f, 0.094137f, -0.051553f, -0.013962f, -0.030727f, -0.025712f, 0.013238f, 0.018503f, -0.015447f, -0.055263f, 0.000754f, -0.025361f, -0.023328f, 0.023028f, 0.099007f, -0.031106f, 0.029826f, 0.001452f, -0.048528f, 0.009882f, -0.094848f, -0.017800f, 0.016522f, 0.004646f, -0.056612f, 0.034429f, 0.090200f, 0.068404f, -0.032264f, -0.055716f, -0.028318f, 0.009399f, 0.094786f, 0.016036f, -0.001035f, 0.003200f, 0.041843f, 0.049534f, 0.008559f, 0.038548f, 0.025230f, 0.057759f, -0.019455f, 0.009142f, 0.031180f, -0.029119f, -0.052724f, 0.030294f, 0.076509f, 0.020417f, 0.034857f, 0.006728f, 0.019657f, -0.104874f, 0.015514f, -0.001150f, 0.019774f, 0.108899f, 0.037931f, 0.017481f, -0.015429f, 0.050650f, -0.015944f, -0.018912f, 0.011423f, 0.032860f, 0.056687f, -0.016576f, 0.032849f, 0.010642f, 0.004571f, 0.028204f, 0.024966f, 0.002845f, -0.048217f, -0.021632f, 0.002101f, 0.083878f, 0.046409f, 0.046667f, 0.036779f, 0.042781f, -0.021592f, -0.094551f, -0.083717f, -0.131714f, -0.039593f, -0.015556f, 0.082616f, -0.002721f, -0.039821f, 0.010177f, -0.008414f, -0.031096f, -0.026652f, 0.005215f, + 0.042972f, 0.120220f, 0.052536f, 0.106579f, 0.054239f, 0.047571f, 0.043594f, -0.031163f, -0.027747f, -0.029844f, 0.011886f, 0.087253f, 0.026552f, -0.072434f, 0.029870f, -0.077946f, 0.037587f, -0.049421f, -0.012088f, -0.043426f, -0.048361f, -0.002236f, 0.004370f, -0.000745f, -0.060189f, 0.076072f, -0.017220f, 0.028438f, -0.075767f, 0.019538f, -0.019046f, -0.023134f, 0.036450f, -0.031847f, 0.074743f, 0.008513f, -0.032278f, 0.003321f, -0.024889f, -0.032159f, 0.019406f, -0.052830f, -0.013427f, 0.064352f, -0.016631f, 0.025625f, -0.006004f, -0.048609f, 0.049298f, -0.029403f, -0.110520f, 0.011792f, 0.005202f, -0.002287f, 0.008814f, -0.016976f, -0.024262f, -0.008448f, 0.045328f, -0.095416f, 0.051085f, -0.025071f, -0.016637f, 0.057124f, -0.040858f, 0.012987f, 0.021408f, -0.025140f, -0.045350f, 0.074078f, 0.068474f, 0.239865f, 0.096463f, -0.130651f, -0.061835f, -0.064082f, -0.100929f, 0.069811f, 0.214954f, 0.086076f, 0.040187f, -0.054362f, -0.015689f, -0.004017f, -0.003455f, 0.103039f, 0.069895f, 0.044616f, 0.154641f, -0.187167f, 0.010914f, 0.096817f, -0.024980f, 0.019267f, 0.100720f, 0.017047f, + -0.030775f, 0.054159f, -0.104609f, -0.207431f, -0.021570f, 0.019138f, -0.082070f, -0.010318f, 0.108399f, 0.017307f, 0.004136f, 0.040584f, -0.089886f, -0.179396f, -0.165245f, -0.075619f, 0.050730f, 0.103869f, 0.230870f, 0.056845f, -0.033487f, -0.031580f, -0.067326f, -0.142347f, -0.046789f, 0.099938f, 0.098456f, 0.105413f, 0.100334f, 0.063196f, 0.049221f, 0.012576f, 0.017622f, -0.093701f, -0.062522f, 0.009190f, 0.016874f, 0.041336f, 0.046845f, 0.133549f, 0.024827f, 0.074276f, -0.067746f, -0.060960f, -0.113595f, -0.031574f, -0.101335f, -0.030337f, -0.017932f, -0.168876f, -0.108813f, 0.063084f, 0.157281f, 0.188578f, 0.386010f, 0.238537f, 0.156610f, 0.142609f, 0.105489f, -0.020081f, -0.175348f, -0.186534f, -0.366127f, -0.384077f, -0.369630f, -0.234161f, -0.088894f, 0.077201f, 0.130377f, 0.227736f, 0.218279f, 0.155096f, 0.147727f, 0.196302f, 0.182768f, 0.167489f, 0.098581f, 0.069582f, 0.055219f, -0.014766f, -0.024982f, -0.232223f, -0.173334f, -0.209659f, -0.257117f, -0.112547f, -0.252446f, -0.202678f, -0.365410f, -0.317799f, -0.234369f, -0.158644f, -0.041070f, 0.165462f, 0.198463f, 0.167705f, + 0.175062f, 0.164033f, 0.314782f, 0.420574f, 0.368313f, 0.368331f, 0.316989f, 0.308045f, 0.217114f, 0.219710f, 0.019589f, -0.198398f, -0.384723f, -0.367764f, -0.538650f, -0.454921f, -0.650321f, -0.765442f, -0.691872f, -0.660337f, -0.425693f, -0.316882f, -0.023862f, 0.045248f, 0.198437f, 0.326576f, 0.541269f, 0.430700f, 0.647666f, 0.373119f, 0.059948f, -0.004552f} + }, + { + {0.028959f, -0.006870f, -0.003375f, -0.007745f, 0.000716f, -0.008862f, 0.000264f, 0.004151f, 0.002770f, -0.001291f, -0.005695f, 0.004395f, 0.006507f, 0.000378f, -0.003452f, -0.002837f, -0.002245f, -0.005481f, 0.002108f, 0.001239f, 0.001525f, 0.003855f, 0.007647f, 0.007502f, 0.001824f, 0.005909f, 0.003089f, -0.003230f, 0.001616f, 0.002575f, -0.000514f, 0.000930f, 0.000867f, -0.000832f, 0.003945f, -0.000259f, 0.007151f, 0.006219f, -0.006771f, 0.005167f, 0.001161f, 0.004229f, 0.000830f, -0.000682f, 0.000177f, 0.012845f, 0.000366f, 0.004223f, 0.001040f, 0.003630f, 0.005029f, 0.001014f, -0.003470f, 0.007507f, -0.009720f, -0.000838f, 0.002784f, 0.008117f, 0.002631f, -0.001232f, 0.006927f, -0.000753f, -0.005801f, 0.001895f, 0.001986f, 0.001326f, -0.001217f, 0.000797f, -0.000705f, -0.004356f, 0.001347f, -0.001782f, -0.002990f, 0.003374f, -0.005227f, 0.004424f, -0.009666f, -0.025763f, -0.002202f, -0.004082f, -0.003544f, 0.000429f, -0.004318f, 0.001659f, 0.002519f, 0.010628f, -0.003575f, -0.000365f, -0.009751f, 0.000784f, 0.009809f, 0.000752f, 0.007097f, -0.002017f, 0.002991f, -0.004017f, + -0.006136f, 0.000290f, 0.006764f, -0.000777f, -0.008407f, -0.000256f, 0.008211f, 0.002761f, -0.003457f, -0.002816f, -0.000335f, -0.001018f, -0.001855f, 0.000209f, -0.001321f, -0.002697f, -0.000292f, 0.001797f, 0.001215f, -0.000251f, -0.006351f, 0.009685f, 0.013106f, 0.000548f, 0.001604f, -0.005130f, -0.002897f, 0.001168f, -0.006703f, -0.007409f, 0.004612f, -0.005993f, 0.004563f, 0.005915f, 0.005862f, 0.002295f, -0.000761f, 0.001691f, 0.001314f, 0.004472f, -0.009251f, 0.000929f, -0.001104f, -0.006705f, -0.009123f, 0.000360f, 0.004683f, -0.003448f, -0.000437f, -0.001047f, -0.000647f, 0.006456f, 0.003139f, 0.000718f, 0.002280f, -0.002509f, -0.023296f, -0.005922f, 0.009540f, -0.001764f, -0.006939f, 0.002627f, -0.017193f, -0.007236f, -0.002202f, -0.003651f, -0.008734f, -0.010068f, 0.005514f, 0.007463f, 0.007168f, -0.009456f, -0.012872f, 0.000995f, -0.007405f, -0.014597f, 0.003546f, -0.001404f, 0.004306f, 0.015329f, -0.004904f, -0.002189f, -0.009698f, 0.013167f, 0.001359f, 0.006306f, 0.005013f, 0.010708f, 0.006005f, 0.002942f, -0.010867f, -0.001803f, -0.009976f, -0.003371f, 0.000718f, -0.004854f, + 0.003707f, 0.002357f, -0.004597f, -0.010076f, 0.006307f, 0.009358f, 0.003026f, -0.005295f, -0.007126f, -0.005136f, 0.002565f, -0.008855f, -0.010283f, -0.003570f, 0.005367f, -0.003490f, 0.002721f, 0.005985f, 0.004305f, -0.005506f, 0.009672f, 0.000235f, 0.008229f, -0.007446f, -0.005675f, -0.003967f, -0.003981f, 0.005023f, -0.003215f, -0.000333f, 0.009570f, 0.002740f, 0.000104f, -0.009845f, 0.002269f, -0.004407f, 0.006334f, -0.004681f, 0.005938f, 0.008562f, 0.003229f, -0.005115f, 0.003490f, -0.002331f, 0.002352f, 0.015941f, 0.009551f, -0.013230f, 0.008854f, -0.007232f, -0.003847f, -0.001823f, 0.000036f, 0.006824f, 0.000011f, 0.018587f, 0.005089f, -0.007009f, -0.004929f, -0.004523f, 0.012744f, 0.003140f, 0.012251f, 0.004185f, 0.008140f, 0.013150f, 0.014689f, 0.005769f, -0.002026f, -0.001445f, 0.001919f, -0.011975f, -0.011552f, 0.003625f, -0.008872f, 0.004875f, 0.001928f, -0.002835f, -0.001663f, 0.003572f, 0.012096f, -0.004058f, -0.004701f, -0.006392f, 0.015534f, -0.002113f, -0.020438f, -0.009897f, -0.008417f, -0.007194f, 0.007714f, 0.007997f, 0.006414f, 0.010517f, 0.004051f, 0.006642f, + -0.000895f, -0.000497f, -0.000927f, 0.010646f, 0.002746f, 0.006350f, -0.014582f, 0.001157f, -0.000090f, 0.001069f, 0.000147f, 0.006454f, 0.003422f, 0.002305f, -0.007585f, -0.005907f, 0.034471f, 0.008436f, 0.004709f, -0.003542f, -0.003081f, 0.004152f, 0.001816f, 0.010117f, 0.011752f, 0.000183f, 0.017608f, 0.008035f, -0.007077f, -0.005265f, -0.001102f, 0.009496f, -0.001670f, -0.003995f, 0.009019f, 0.002132f, 0.025678f, 0.007672f, 0.004570f, 0.001872f, -0.003183f, 0.002034f, 0.003341f, 0.005903f, -0.001838f, 0.000860f, 0.013477f, 0.002789f, 0.014899f, -0.006998f, -0.008122f, 0.005958f, 0.022691f, 0.007600f, 0.004984f, -0.001178f, -0.010755f, -0.003112f, 0.002492f, 0.001559f, -0.000902f, 0.001731f, -0.015004f, 0.001902f, -0.006989f, 0.006637f, 0.003825f, -0.004743f, 0.002590f, 0.005954f, 0.002657f, -0.005786f, -0.007650f, 0.002610f, 0.001689f, 0.001005f, -0.009669f, 0.003331f, -0.004272f, 0.006736f, -0.001673f, 0.002175f, 0.002713f, -0.000267f, 0.001020f, -0.002020f, -0.000111f, 0.021709f, 0.001067f, 0.008579f, -0.001306f, -0.004147f, 0.001196f, 0.002696f, -0.000442f, 0.004862f, + -0.007461f, -0.001669f, 0.008148f, -0.004330f, -0.011958f, -0.000434f, 0.020400f, -0.001770f, 0.016056f, 0.007715f, 0.022110f, 0.002229f, 0.002255f, 0.007533f, -0.005954f, -0.013502f, -0.016975f, 0.003574f, -0.008561f, 0.019692f, 0.011713f, 0.013749f, -0.002517f, -0.006466f, 0.001939f, 0.002646f, 0.006815f, 0.018316f, 0.002397f, 0.007272f, -0.008511f, 0.005394f, -0.006017f, 0.001931f, -0.003207f, 0.005543f, 0.010901f, 0.000756f, 0.010405f, 0.003056f, 0.005230f, -0.003758f, -0.002455f, 0.013022f, -0.003200f, -0.004291f, 0.010425f, -0.007098f, -0.000590f, 0.000581f, -0.004577f, -0.006990f, 0.004576f, -0.007919f, -0.001376f, -0.009881f, -0.018945f, -0.003199f, -0.002954f, -0.001627f, -0.019771f, -0.008697f, -0.006120f, -0.006334f, 0.007268f, 0.018093f, -0.005072f, 0.004902f, 0.010009f, -0.004161f, 0.001821f, 0.000471f, 0.001207f, -0.007899f, 0.008344f, -0.025888f, 0.002559f, 0.013355f, 0.007563f, -0.014696f, -0.000747f, 0.000290f, 0.003703f, 0.004857f, -0.000506f, -0.011547f, -0.010369f, 0.001250f, 0.018393f, 0.008186f, 0.011021f, 0.017782f, -0.012040f, 0.012558f, 0.024306f, -0.002657f, + 0.005681f, -0.014087f, 0.004936f, 0.004452f, -0.011449f, -0.006774f, -0.002287f, 0.005048f, -0.011589f, -0.016091f, 0.003206f, 0.001202f, -0.013165f, 0.000541f, 0.004426f, -0.003266f, 0.028680f, -0.002171f, -0.020000f, -0.001938f, 0.007149f, 0.015470f, 0.006080f, 0.006613f, -0.012792f, 0.002988f, 0.004227f, -0.012139f, -0.000631f, -0.002568f, 0.019893f, 0.011500f, -0.003185f, -0.007403f, -0.015238f, 0.005994f, 0.006213f, -0.009656f, -0.000257f, 0.003068f, 0.006033f, 0.005563f, -0.007782f, -0.000797f, -0.001699f, 0.018003f, -0.015610f, 0.001397f, -0.004090f, 0.016249f, -0.001236f, -0.004450f, -0.007034f, 0.001955f, -0.007164f, -0.016113f, 0.009381f, 0.009189f, 0.002794f, -0.006124f, 0.001503f, 0.004615f, 0.029608f, 0.020251f, 0.014586f, 0.021471f, 0.008233f, -0.001393f, 0.002721f, 0.008234f, -0.021503f, 0.011350f, 0.000057f, 0.012184f, -0.008808f, -0.003851f, -0.013922f, 0.004387f, 0.023897f, -0.023077f, -0.015182f, -0.024549f, 0.012517f, -0.005178f, 0.000621f, -0.010858f, 0.001312f, -0.003683f, -0.011567f, 0.004952f, 0.005472f, -0.017223f, -0.002542f, 0.003849f, -0.004017f, 0.010055f, + -0.025920f, -0.011862f, 0.026411f, 0.003330f, -0.000479f, -0.001922f, 0.000946f, -0.012723f, -0.014230f, 0.001577f, -0.020694f, -0.004038f, 0.002186f, 0.006336f, -0.008804f, -0.001261f, 0.025924f, -0.000851f, 0.009230f, 0.020002f, -0.017646f, -0.005367f, 0.004445f, 0.005391f, 0.003722f, -0.004629f, -0.012454f, 0.015466f, -0.001277f, -0.012849f, 0.010368f, -0.001787f, 0.002698f, 0.004219f, -0.007067f, -0.004703f, -0.003080f, -0.049047f, -0.028291f, 0.023133f, -0.009272f, -0.009854f, 0.013000f, 0.012578f, -0.021812f, -0.027914f, -0.009743f, -0.009444f, -0.011310f, -0.001098f, -0.020234f, -0.013356f, 0.006763f, 0.001684f, -0.026989f, -0.028337f, -0.016807f, -0.007056f, -0.001849f, 0.015996f, -0.001415f, -0.009906f, 0.007933f, -0.023315f, 0.000473f, -0.000051f, 0.000813f, 0.009633f, 0.004491f, -0.016608f, -0.013505f, 0.011840f, 0.003631f, 0.040841f, 0.009665f, -0.011945f, 0.001780f, 0.002575f, 0.000439f, 0.011784f, 0.002089f, 0.005729f, -0.003927f, -0.007312f, 0.002793f, -0.021349f, -0.003979f, -0.008454f, -0.011698f, 0.004153f, -0.017691f, 0.022700f, -0.002181f, 0.010451f, 0.015768f, 0.006156f, + 0.008795f, 0.000741f, -0.008878f, 0.001374f, -0.000148f, -0.010341f, 0.017201f, -0.004642f, 0.029854f, 0.001084f, 0.001357f, 0.003416f, -0.004774f, -0.013102f, 0.008211f, -0.009773f, 0.000393f, 0.018140f, 0.011870f, 0.035082f, -0.018829f, 0.015759f, 0.008972f, 0.011267f, -0.003507f, -0.021895f, 0.004574f, -0.007109f, -0.017068f, 0.036129f, -0.001010f, -0.012457f, -0.035809f, 0.021102f, 0.008026f, -0.002368f, -0.012384f, -0.018182f, 0.002026f, 0.036574f, 0.015941f, -0.003546f, -0.002250f, -0.018635f, -0.011942f, 0.009026f, 0.006452f, -0.015102f, -0.007609f, 0.011274f, 0.004856f, -0.002790f, 0.013048f, 0.015538f, 0.004262f, 0.021195f, 0.028122f, 0.013819f, -0.004719f, 0.003456f, 0.003600f, 0.001924f, 0.015329f, -0.022310f, 0.022202f, -0.004038f, -0.009182f, -0.018702f, 0.001484f, 0.010909f, 0.010951f, -0.021746f, 0.005533f, 0.012029f, 0.003687f, -0.016719f, -0.028151f, -0.030009f, 0.008502f, 0.008633f, 0.003437f, -0.013820f, 0.000084f, 0.017910f, -0.008330f, -0.019957f, -0.029615f, -0.000689f, 0.007750f, -0.027564f, 0.010580f, 0.018614f, -0.008579f, 0.012913f, 0.008159f, 0.043134f, + 0.030569f, 0.005257f, -0.007625f, -0.006197f, -0.004972f, -0.032016f, -0.011131f, -0.001898f, 0.020692f, -0.015579f, -0.006702f, -0.008139f, 0.001456f, 0.030571f, -0.023927f, -0.008344f, -0.000331f, 0.013429f, -0.004210f, -0.020193f, -0.029949f, 0.009319f, -0.020424f, -0.011571f, -0.012419f, -0.016257f, 0.005414f, -0.026100f, -0.010930f, 0.019582f, 0.032995f, -0.000475f, -0.019384f, -0.019961f, 0.030417f, -0.005360f, -0.015397f, 0.028906f, 0.001610f, -0.000233f, 0.001915f, -0.035996f, 0.014322f, -0.014773f, 0.012813f, 0.009056f, -0.022505f, -0.004875f, -0.022881f, 0.006622f, -0.022223f, -0.006360f, 0.009809f, 0.010267f, -0.007268f, 0.005140f, -0.027201f, 0.016122f, -0.001953f, 0.010021f, 0.010946f, 0.004850f, -0.006015f, -0.008839f, 0.027378f, -0.022141f, 0.013578f, -0.008015f, -0.023295f, -0.017574f, -0.001490f, 0.020914f, -0.013701f, 0.007804f, 0.004983f, -0.010543f, 0.011465f, -0.002816f, -0.005679f, 0.018644f, 0.001964f, -0.010303f, -0.027818f, -0.000258f, -0.035769f, 0.007068f, 0.001600f, 0.017926f, -0.015207f, -0.002178f, 0.007382f, 0.008483f, 0.008239f, -0.022198f, 0.031271f, 0.024325f, + 0.002663f, 0.018221f, -0.009440f, -0.032152f, 0.006109f, -0.013014f, -0.017256f, 0.016501f, 0.036300f, 0.007536f, -0.012341f, -0.012974f, -0.032435f, 0.000874f, -0.000507f, 0.047760f, -0.020472f, 0.000009f, -0.000626f, -0.000715f, -0.030395f, -0.031260f, 0.023131f, 0.001640f, 0.012151f, -0.003499f, -0.038464f, -0.020261f, 0.000524f, -0.005516f, -0.010101f, -0.009834f, 0.021136f, -0.004543f, 0.012738f, -0.016178f, 0.030222f, -0.038573f, 0.016395f, 0.020527f, 0.009017f, 0.010970f, 0.006558f, 0.031062f, 0.012424f, -0.002021f, 0.002915f, 0.000436f, 0.026468f, 0.045957f, -0.009677f, 0.003937f, -0.018456f, 0.019699f, 0.024710f, -0.019499f, -0.002013f, -0.039201f, -0.005006f, -0.049929f, -0.024570f, 0.018732f, -0.019443f, -0.044438f, 0.004813f, -0.024233f, 0.001850f, 0.000261f, -0.027318f, -0.027272f, 0.012872f, 0.025247f, 0.008595f, -0.030513f, 0.015177f, -0.034233f, -0.010984f, -0.012902f, 0.011421f, -0.014311f, -0.005442f, 0.015791f, 0.003664f, -0.011498f, -0.023108f, 0.025062f, 0.025581f, 0.031708f, 0.005124f, -0.003874f, 0.002088f, 0.009994f, -0.001455f, 0.012900f, -0.013476f, 0.017073f, + -0.005806f, 0.019736f, 0.016976f, 0.011886f, -0.004761f, 0.000738f, -0.029934f, 0.010495f, -0.006750f, 0.023296f, 0.005296f, -0.054099f, 0.009386f, 0.026795f, 0.036977f, -0.020490f, -0.027133f, 0.033994f, 0.016412f, 0.024039f, -0.041215f, 0.021288f, 0.054015f, 0.056235f, 0.004596f, 0.001893f, 0.032743f, -0.021276f, -0.028329f, 0.019586f, -0.031583f, 0.013193f, -0.014483f, -0.011462f, -0.006965f, -0.068080f, -0.040991f, -0.030933f, -0.007946f, -0.029945f, -0.054753f, 0.041641f, 0.005388f, 0.013364f, -0.006292f, 0.029217f, 0.001720f, -0.026643f, 0.020812f, 0.007167f, -0.008193f, -0.016450f, -0.011254f, 0.002903f, 0.008173f, 0.025772f, -0.014300f, 0.020027f, 0.007574f, 0.037147f, -0.053734f, -0.015585f, -0.007766f, 0.006114f, 0.023193f, 0.031444f, 0.008235f, -0.027195f, 0.018628f, 0.024553f, 0.022308f, -0.006895f, 0.008347f, 0.000649f, -0.008112f, -0.004559f, 0.002405f, 0.007365f, 0.003810f, 0.017961f, 0.003938f, -0.024595f, 0.023007f, -0.025452f, -0.030627f, 0.004076f, 0.023517f, -0.011839f, -0.007386f, 0.007504f, 0.011838f, 0.018870f, -0.010472f, 0.008611f, 0.044929f, -0.018284f, + -0.046382f, -0.061466f, -0.030198f, -0.041751f, 0.019253f, 0.035425f, 0.023322f, 0.008485f, 0.021838f, 0.012543f, 0.023934f, -0.020321f, 0.026789f, 0.014270f, 0.010398f, 0.028537f, 0.035170f, -0.011158f, 0.055715f, 0.005421f, 0.008747f, -0.011512f, 0.020263f, -0.063669f, -0.028098f, -0.043475f, -0.044902f, 0.017959f, -0.039157f, 0.038694f, 0.044006f, 0.002066f, 0.009642f, -0.006605f, 0.008178f, -0.041519f, 0.017300f, 0.046317f, -0.026093f, -0.053474f, 0.007314f, -0.019974f, -0.016878f, -0.052130f, 0.009334f, 0.019463f, 0.000090f, -0.006857f, 0.017164f, -0.029601f, -0.004616f, 0.019692f, -0.010320f, -0.026188f, 0.003633f, -0.012927f, 0.027824f, -0.017835f, -0.009547f, 0.025911f, 0.022789f, 0.047599f, 0.006879f, 0.011716f, -0.003682f, 0.012994f, 0.017584f, 0.029509f, -0.007619f, -0.000686f, -0.017280f, 0.038810f, -0.047618f, 0.052436f, 0.002942f, -0.020617f, 0.025666f, -0.018831f, -0.012624f, 0.048094f, -0.067795f, 0.011292f, -0.012887f, 0.013413f, -0.024878f, 0.012608f, 0.029882f, -0.014878f, 0.000369f, -0.008430f, -0.007739f, -0.008134f, 0.056384f, -0.061830f, -0.010448f, 0.068353f, + -0.027192f, -0.043339f, 0.004702f, -0.016753f, -0.013948f, -0.024613f, -0.029626f, 0.037565f, 0.016959f, 0.001918f, 0.018459f, 0.044604f, 0.027253f, -0.003575f, 0.009818f, 0.029844f, 0.039319f, -0.034809f, 0.016682f, 0.031935f, 0.014753f, 0.011425f, 0.045352f, 0.021103f, 0.010011f, -0.001780f, 0.020811f, -0.002654f, 0.023474f, 0.018406f, 0.011030f, -0.021301f, 0.040286f, -0.032853f, -0.003278f, 0.049125f, 0.049729f, -0.011980f, -0.042533f, 0.016013f, 0.000202f, 0.042150f, 0.073946f, 0.016049f, -0.010259f, 0.004915f, -0.040944f, -0.005178f, -0.010061f, -0.009212f, 0.001906f, 0.037106f, -0.014875f, 0.016264f, 0.046045f, 0.007510f, -0.040230f, 0.027385f, -0.000768f, 0.017435f, 0.043607f, 0.059372f, -0.015157f, -0.015670f, -0.003345f, -0.046888f, -0.066897f, 0.002089f, -0.029095f, -0.004770f, -0.035369f, -0.003476f, 0.004389f, 0.005773f, 0.032422f, 0.000005f, -0.011530f, 0.046906f, -0.087624f, 0.048397f, -0.037125f, -0.085624f, -0.025858f, -0.021280f, -0.003433f, -0.019443f, 0.010058f, -0.023386f, -0.053673f, -0.031782f, -0.016319f, -0.004450f, 0.005724f, -0.021524f, 0.021059f, 0.042182f, + 0.001157f, -0.002199f, 0.011048f, 0.002996f, -0.008199f, -0.015070f, -0.009161f, 0.011735f, 0.011986f, -0.003269f, 0.011361f, 0.051742f, 0.013660f, -0.014559f, -0.051382f, -0.007688f, 0.035445f, -0.043345f, -0.021129f, -0.016243f, -0.000047f, -0.002914f, 0.027006f, -0.008692f, 0.002651f, 0.038432f, 0.012861f, 0.042575f, -0.006711f, -0.019532f, -0.009991f, -0.010466f, -0.011870f, 0.020668f, 0.001173f, 0.014040f, 0.024552f, -0.044977f, 0.005340f, -0.011802f, -0.029618f, -0.021148f, 0.042459f, 0.031779f, -0.000375f, -0.021754f, 0.006584f, 0.018258f, -0.000901f, 0.012228f, -0.033876f, -0.076103f, -0.039300f, -0.029227f, 0.021218f, -0.000202f, -0.013075f, 0.025651f, -0.034890f, 0.041851f, -0.003788f, -0.064989f, 0.012880f, -0.031110f, -0.007021f, -0.004309f, -0.008242f, -0.041254f, 0.012608f, 0.002585f, 0.032517f, -0.070863f, 0.000635f, 0.035509f, 0.003704f, -0.016548f, -0.036592f, -0.002461f, 0.020139f, 0.031083f, -0.026093f, -0.008804f, 0.016051f, 0.035435f, 0.031535f, -0.030723f, -0.006892f, -0.049995f, 0.022840f, 0.025711f, 0.015210f, -0.014133f, -0.004514f, -0.013520f, -0.005929f, -0.016634f, + 0.004245f, 0.036715f, -0.014173f, -0.014404f, -0.013165f, -0.020804f, 0.041011f, 0.035675f, -0.004070f, 0.050205f, -0.002851f, 0.017675f, -0.045003f, 0.036192f, 0.015694f, -0.050401f, -0.016664f, 0.056721f, 0.023286f, 0.014848f, 0.010744f, -0.027770f, -0.021539f, -0.029920f, 0.049504f, -0.027007f, 0.038356f, 0.038110f, -0.044885f, 0.102229f, -0.021803f, 0.061995f, 0.003912f, -0.018307f, -0.025899f, 0.043164f, 0.022796f, -0.048391f, -0.006791f, 0.025070f, 0.042761f, 0.003520f, -0.036223f, 0.017303f, -0.069823f, -0.018651f, -0.063554f, -0.087631f, 0.002476f, -0.033930f, 0.010637f, -0.006903f, -0.014399f, -0.033760f, -0.023668f, 0.018938f, 0.051713f, -0.044540f, -0.010410f, -0.076327f, -0.067423f, 0.017400f, 0.025366f, -0.042465f, -0.044739f, 0.001644f, 0.008191f, -0.071369f, 0.002195f, 0.000207f, 0.034812f, -0.032907f, -0.000399f, 0.028718f, -0.021611f, -0.038171f, -0.042916f, -0.021514f, -0.039450f, -0.032437f, -0.041227f, 0.052463f, -0.071714f, -0.045096f, 0.059985f, -0.004314f, 0.014875f, -0.054876f, -0.012106f, -0.017573f, -0.001746f, 0.085461f, -0.015822f, -0.004732f, 0.005222f, 0.038148f, + -0.002728f, -0.042534f, -0.021220f, -0.031886f, 0.005406f, 0.101632f, 0.016237f, -0.041559f, 0.075093f, 0.052772f, -0.055784f, 0.054065f, 0.092542f, -0.005108f, -0.042808f, 0.059305f, -0.015989f, 0.060987f, 0.059884f, 0.045173f, -0.120837f, -0.079332f, -0.077012f, -0.031752f, -0.049852f, 0.063270f, 0.029762f, 0.051210f, -0.003818f, -0.110457f, -0.011841f, 0.013402f, 0.077756f, -0.006867f, 0.021530f, 0.063518f, -0.020631f, -0.052497f, 0.009575f, -0.006989f, 0.089707f, 0.051672f, -0.023113f, -0.042266f, 0.095087f, 0.002750f, 0.049973f, 0.018233f, 0.089101f, 0.069305f, 0.060985f, 0.002446f, -0.042748f, -0.029376f, -0.031476f, 0.067039f, -0.028917f, -0.051544f, -0.021322f, -0.000778f, 0.002973f, 0.027864f, -0.025600f, 0.007947f, -0.138165f, 0.012870f, 0.027304f, 0.020393f, -0.054794f, -0.058633f, 0.022248f, 0.047397f, -0.056647f, 0.021080f, -0.029941f, -0.030336f, -0.036263f, -0.006593f, 0.049321f, -0.032292f, 0.053710f, -0.015010f, 0.024338f, -0.091881f, -0.051969f, -0.004712f, 0.052935f, 0.030893f, -0.059380f, -0.072012f, -0.026820f, 0.005026f, 0.080199f, 0.029947f, -0.000176f, -0.048795f, + -0.011041f, 0.021357f, 0.162609f, 0.015664f, -0.085337f, -0.194762f, -0.016524f, 0.114604f, 0.030109f, 0.049802f, -0.004059f, 0.069706f, -0.010446f, 0.030570f, -0.014810f, 0.039570f, 0.057506f, 0.029846f, -0.025508f, -0.063989f, 0.077168f, 0.085848f, -0.017425f, -0.084457f, -0.049653f, 0.009322f, 0.051444f, 0.016992f, 0.019889f, 0.003854f, 0.014930f, 0.006516f, 0.014939f, -0.015683f, -0.095652f, 0.000565f, 0.063460f, 0.047994f, -0.016466f, 0.006181f, 0.040400f, 0.083492f, 0.053460f, 0.041956f, -0.044900f, -0.031680f, -0.004720f, -0.006656f, -0.069502f, 0.054327f, 0.034709f, 0.056601f, 0.114187f, -0.053581f, -0.031886f, -0.001730f, -0.025817f, -0.022729f, -0.043100f, 0.089411f, -0.046398f, -0.051219f, -0.051646f, -0.014877f, 0.115152f, 0.033658f, 0.049164f, 0.004260f, -0.001805f, -0.017594f, 0.075839f, 0.063762f, -0.019052f, -0.052566f, 0.031946f, 0.006243f, 0.002207f, -0.052205f, 0.009806f, 0.118479f, 0.101176f, 0.009481f, 0.013052f, -0.072755f, -0.123896f, -0.118869f, -0.049654f, 0.087788f, 0.107810f, 0.100463f, 0.064620f, -0.020750f, -0.061240f, -0.067417f, -0.034688f, 0.021450f, + 0.047543f, 0.067249f, 0.012958f, -0.060137f, -0.040178f, -0.015222f, -0.040162f, -0.026737f, 0.016807f, 0.069967f, 0.113634f, 0.064339f, 0.039871f, 0.025426f, -0.060046f, -0.012822f, -0.127616f, -0.155450f, -0.087089f, -0.050270f, -0.033957f, 0.065580f, 0.117851f, 0.117431f, 0.118248f, 0.090927f, 0.047611f, 0.001685f, -0.038038f, -0.017479f, -0.066030f, -0.136761f, -0.002246f, 0.007551f, 0.021813f, 0.039066f, 0.035433f, 0.039686f, -0.138171f, -0.085587f, -0.042773f, -0.090485f, -0.025805f, 0.058526f, -0.026752f, 0.037719f, 0.017622f, -0.044170f, 0.043971f, -0.037994f, 0.048789f, 0.035492f, -0.016971f, -0.069935f, -0.114981f, -0.134720f, -0.074341f, 0.020298f, -0.220044f, -0.114341f, -0.056552f, 0.074510f, 0.020495f, 0.285238f, 0.295774f, 0.221045f, 0.289076f, 0.299800f, 0.276048f, 0.196637f, 0.182261f, 0.198621f, 0.084320f, -0.008397f, -0.114272f, -0.183570f, -0.251308f, -0.247185f, -0.366689f, -0.222553f, -0.138935f, -0.111944f, -0.157357f, -0.081709f, -0.013457f, -0.118403f, -0.085835f, -0.095188f, -0.010899f, -0.053450f, -0.008755f, -0.074586f, -0.028274f, 0.059511f, 0.066725f, 0.025870f, + 0.000750f, 0.065530f, 0.061240f, -0.114357f, 0.044720f, 0.098405f, 0.206829f, 0.151110f, 0.199178f, 0.087869f, 0.093219f, 0.312632f, 0.184672f, 0.320615f, 0.127295f, 0.302867f, 0.224054f, 0.267891f, 0.364760f, 0.338198f, 0.289049f, 0.311117f, 0.355105f, 0.372988f, 0.334885f, 0.369391f, 0.273979f, 0.375670f, 0.322257f, 0.276161f, 0.309682f, 0.172488f, 0.343321f, 0.170095f, 0.132479f, -0.089943f, 0.040951f, -0.178185f, -0.199443f, -0.215743f, -0.006303f}, + {0.028151f, -0.003043f, -0.004712f, 0.001293f, 0.002069f, 0.007711f, -0.002021f, -0.004592f, -0.007568f, 0.008244f, 0.000716f, 0.002734f, 0.008263f, 0.002279f, -0.001302f, 0.002104f, 0.004355f, 0.002864f, -0.004406f, 0.009559f, 0.001000f, -0.012480f, -0.002362f, 0.008294f, 0.003205f, 0.000905f, -0.004534f, -0.002612f, 0.004068f, -0.001520f, 0.016456f, -0.002968f, 0.003751f, 0.000645f, 0.001501f, -0.009223f, -0.003150f, -0.001917f, 0.003385f, -0.001236f, 0.002035f, -0.005299f, -0.002930f, 0.003514f, 0.005212f, 0.003647f, 0.006195f, 0.006354f, 0.004071f, -0.005598f, -0.008796f, 0.001106f, 0.005198f, 0.005740f, 0.004323f, -0.003078f, -0.003864f, -0.013629f, 0.007027f, -0.003245f, -0.005251f, -0.000882f, -0.002335f, 0.002748f, -0.006481f, 0.002800f, -0.008204f, 0.003495f, -0.007791f, 0.007076f, -0.003108f, 0.005917f, -0.001505f, -0.000983f, -0.009270f, -0.000845f, -0.014480f, -0.028107f, -0.005140f, 0.000572f, -0.006671f, -0.013121f, -0.004579f, 0.009959f, -0.015844f, -0.008452f, -0.005366f, -0.002866f, 0.004794f, -0.002033f, 0.005360f, 0.002739f, 0.004674f, -0.000334f, 0.005830f, -0.005031f, + 0.000804f, -0.002089f, 0.000964f, 0.015318f, -0.003386f, -0.000718f, -0.007657f, 0.009552f, 0.005630f, 0.004708f, 0.011487f, -0.005741f, -0.003550f, 0.004203f, 0.010271f, -0.002596f, -0.000856f, -0.008202f, -0.009386f, -0.005951f, 0.006432f, -0.007970f, -0.007179f, -0.000665f, 0.009231f, -0.012478f, -0.002853f, -0.010389f, -0.005296f, -0.002815f, 0.001313f, -0.000737f, -0.007752f, 0.009969f, 0.001521f, 0.008989f, -0.003689f, -0.002017f, -0.011073f, -0.000037f, -0.003971f, -0.003934f, 0.006168f, 0.003717f, -0.002087f, 0.003545f, 0.006849f, -0.001863f, 0.002881f, -0.004919f, -0.002985f, -0.001209f, -0.004786f, 0.004048f, 0.001450f, 0.002763f, -0.023120f, -0.008534f, 0.006871f, -0.006341f, -0.002608f, -0.002790f, 0.003321f, -0.001375f, -0.005988f, 0.009505f, 0.008825f, 0.002698f, -0.000941f, 0.004290f, -0.011813f, -0.001962f, -0.011677f, -0.006170f, 0.008852f, -0.001678f, 0.001688f, -0.001423f, -0.001226f, -0.000039f, 0.018363f, 0.016452f, 0.007581f, 0.008661f, 0.010684f, -0.002299f, -0.001100f, -0.003907f, 0.009436f, -0.001187f, -0.003426f, 0.002333f, -0.005322f, 0.003429f, 0.006816f, -0.003740f, + 0.007669f, 0.008224f, 0.016777f, -0.006859f, -0.007765f, 0.006791f, -0.004208f, -0.000127f, 0.003615f, -0.010077f, 0.000686f, -0.005475f, -0.005582f, 0.012420f, 0.007657f, 0.008794f, -0.005173f, -0.007454f, 0.005017f, -0.008635f, 0.005830f, 0.024224f, 0.001547f, 0.001084f, 0.005738f, 0.001735f, 0.002486f, 0.013335f, -0.007303f, -0.002812f, 0.002913f, 0.000763f, -0.006575f, -0.006535f, -0.006461f, -0.005354f, -0.001146f, -0.006915f, 0.007473f, 0.011754f, -0.005602f, 0.005753f, 0.018778f, 0.006108f, 0.004361f, -0.013218f, 0.010909f, 0.002693f, -0.016748f, 0.006971f, -0.004655f, -0.010265f, 0.004127f, -0.001578f, 0.003973f, 0.009592f, -0.010219f, -0.010970f, -0.004759f, 0.014473f, 0.000445f, 0.007080f, 0.015210f, -0.022787f, -0.018196f, 0.002753f, 0.011139f, -0.008379f, 0.000724f, 0.014852f, 0.003884f, -0.002177f, -0.004545f, 0.017802f, 0.002188f, -0.004637f, 0.002496f, -0.016619f, 0.001822f, -0.009288f, 0.008288f, 0.001186f, 0.008795f, -0.004744f, -0.002292f, 0.003706f, 0.000182f, 0.000852f, 0.000411f, 0.008168f, 0.006724f, -0.009668f, 0.005204f, 0.007151f, -0.012949f, 0.001131f, + -0.005942f, 0.001978f, -0.003135f, -0.010352f, -0.000070f, 0.008023f, 0.007147f, 0.015895f, -0.010496f, 0.012115f, -0.008779f, -0.002404f, 0.007143f, -0.009054f, -0.012780f, -0.005326f, 0.037330f, 0.017096f, 0.022508f, -0.001600f, -0.006562f, -0.007972f, -0.008503f, 0.004713f, -0.007191f, 0.010712f, -0.001471f, 0.014609f, 0.000580f, 0.007830f, 0.009148f, 0.007518f, 0.005947f, 0.008493f, -0.028230f, -0.008045f, -0.002944f, -0.005678f, -0.005494f, -0.008585f, -0.020224f, 0.001096f, 0.013281f, -0.008189f, 0.007826f, -0.006540f, -0.010291f, -0.007298f, 0.000755f, -0.006131f, -0.002736f, -0.006294f, -0.000851f, 0.016623f, 0.000463f, 0.007575f, 0.009960f, 0.013698f, -0.006791f, 0.003352f, -0.003483f, -0.010239f, 0.011362f, -0.006436f, -0.000983f, -0.010128f, 0.007023f, 0.000096f, -0.000376f, -0.002647f, -0.005381f, 0.003705f, 0.009970f, -0.004217f, 0.005314f, 0.005882f, 0.004054f, 0.018449f, -0.019050f, -0.007452f, -0.000366f, -0.009753f, -0.013952f, -0.004794f, -0.016979f, 0.002880f, 0.017618f, -0.012292f, -0.007484f, -0.013829f, -0.000638f, -0.002986f, -0.008833f, -0.008964f, -0.001088f, 0.012052f, + 0.016301f, -0.008847f, 0.008311f, -0.007141f, -0.004018f, -0.002589f, -0.021022f, 0.015434f, -0.004729f, -0.001779f, 0.023496f, 0.015264f, 0.015596f, -0.006036f, 0.000275f, 0.003302f, -0.004003f, 0.005776f, -0.012484f, 0.000158f, -0.008639f, 0.010229f, -0.009775f, -0.006011f, -0.001302f, 0.002182f, -0.011985f, 0.002786f, 0.000940f, 0.015898f, -0.000184f, -0.020401f, 0.011794f, 0.011908f, 0.015845f, -0.001959f, 0.003779f, -0.010974f, -0.009024f, -0.003017f, -0.008764f, 0.004000f, 0.001949f, -0.002476f, -0.001541f, 0.009491f, 0.013403f, -0.017965f, -0.004303f, 0.000766f, -0.007929f, -0.007183f, 0.012109f, -0.009107f, 0.004415f, -0.008881f, -0.013192f, -0.008700f, -0.006641f, 0.005458f, 0.001572f, 0.024189f, -0.004158f, -0.005091f, 0.006661f, -0.005749f, -0.002264f, -0.004872f, 0.006228f, -0.004297f, 0.008102f, -0.002615f, -0.004048f, 0.007393f, 0.012916f, -0.028413f, 0.027317f, 0.015172f, -0.016829f, -0.016307f, 0.006489f, 0.022279f, -0.000650f, 0.006769f, 0.025228f, 0.008901f, 0.007363f, -0.003991f, 0.012990f, 0.012504f, 0.013701f, -0.024973f, -0.015872f, -0.015024f, 0.011788f, 0.010781f, + 0.012997f, 0.000961f, -0.015777f, 0.006672f, -0.002676f, 0.007307f, -0.022534f, 0.008897f, 0.013117f, -0.010100f, 0.005483f, 0.011194f, 0.002713f, -0.000018f, 0.001997f, -0.003186f, 0.019098f, 0.013507f, 0.010060f, 0.000683f, 0.006413f, 0.015288f, -0.013736f, -0.006925f, 0.000313f, 0.020107f, 0.012338f, 0.008067f, -0.015302f, 0.000801f, 0.009790f, 0.012080f, -0.004546f, 0.003889f, 0.011180f, 0.014523f, 0.004117f, 0.013417f, 0.004830f, -0.001345f, -0.012684f, 0.000016f, -0.020858f, -0.008303f, -0.010316f, 0.001669f, 0.006093f, -0.011936f, -0.005509f, -0.021834f, 0.008469f, -0.006535f, -0.001349f, 0.010364f, 0.014817f, 0.017536f, 0.004133f, 0.023995f, 0.007991f, -0.004497f, -0.010688f, -0.029232f, -0.013642f, 0.017336f, -0.005839f, -0.026906f, -0.006722f, -0.004573f, 0.004424f, 0.014315f, 0.022796f, -0.001682f, 0.006972f, -0.005511f, 0.011547f, -0.012896f, -0.012955f, -0.014731f, -0.025114f, 0.013221f, 0.008135f, -0.021697f, 0.001035f, -0.015963f, -0.005552f, 0.013313f, 0.008163f, 0.010776f, -0.002764f, -0.003397f, -0.003262f, 0.023754f, 0.019251f, 0.019504f, -0.008680f, -0.017572f, + 0.013924f, -0.002808f, -0.005634f, 0.016693f, 0.003495f, 0.016396f, -0.000102f, 0.008906f, -0.011457f, -0.001211f, 0.008978f, -0.036930f, -0.005005f, 0.001110f, -0.026098f, 0.006231f, -0.006269f, 0.024116f, 0.016348f, -0.015934f, 0.001753f, 0.021890f, -0.001770f, 0.010738f, -0.007000f, 0.014725f, -0.006598f, 0.002178f, -0.005333f, -0.000567f, 0.011614f, -0.015763f, 0.016637f, 0.007095f, 0.009728f, 0.001404f, 0.020423f, -0.058589f, -0.012244f, 0.031326f, -0.025169f, -0.009195f, 0.026861f, 0.010064f, -0.008215f, 0.002879f, -0.021797f, 0.019792f, -0.002185f, -0.035447f, 0.002898f, -0.001695f, 0.013838f, 0.013410f, -0.006644f, -0.027623f, -0.011479f, -0.010353f, 0.001095f, -0.014533f, -0.007625f, -0.018581f, -0.004866f, 0.021072f, -0.016343f, -0.008063f, -0.005858f, -0.010531f, -0.010943f, -0.015266f, 0.011553f, 0.002791f, 0.014231f, 0.002996f, -0.009064f, -0.014628f, -0.014233f, -0.002365f, 0.011021f, 0.015676f, -0.004250f, -0.012681f, 0.015288f, 0.006849f, -0.020186f, -0.022747f, -0.047229f, -0.003218f, -0.014215f, -0.008220f, 0.008504f, 0.008576f, 0.005839f, 0.023051f, -0.000771f, -0.008990f, + 0.000285f, -0.009694f, 0.026508f, 0.014796f, -0.002988f, 0.014996f, -0.011969f, 0.008840f, 0.007876f, -0.011587f, -0.003597f, -0.009986f, 0.011439f, 0.008616f, -0.019413f, 0.017518f, 0.026472f, 0.000595f, 0.012013f, 0.037227f, -0.016550f, 0.013160f, -0.007936f, -0.001689f, 0.023810f, -0.008027f, -0.008351f, -0.006865f, -0.000522f, 0.002283f, 0.016666f, 0.049489f, -0.001279f, 0.001431f, 0.015716f, 0.001644f, 0.001761f, -0.025601f, -0.023373f, 0.002137f, 0.004915f, -0.017350f, -0.006478f, -0.005334f, 0.015668f, -0.008027f, 0.004244f, -0.002089f, 0.007675f, -0.008185f, 0.031338f, 0.014775f, -0.012468f, 0.014593f, 0.016347f, -0.019916f, 0.004631f, 0.005812f, 0.007450f, -0.006932f, -0.004653f, 0.022925f, -0.020305f, 0.007238f, 0.028971f, -0.011605f, 0.004892f, 0.015567f, -0.000454f, 0.013218f, 0.009911f, -0.001938f, 0.009908f, 0.010917f, 0.019589f, 0.009065f, 0.002974f, -0.003075f, -0.010961f, -0.016328f, 0.002054f, -0.001117f, -0.041837f, 0.025528f, -0.005071f, -0.016444f, -0.013451f, -0.035120f, -0.034262f, -0.027037f, 0.006115f, 0.013502f, -0.004706f, -0.003219f, -0.001110f, 0.051866f, + 0.053393f, -0.002213f, -0.043059f, 0.007772f, 0.009515f, -0.005814f, 0.011978f, 0.005723f, 0.004321f, -0.001383f, -0.006918f, 0.041703f, 0.008320f, -0.007825f, -0.047082f, -0.027707f, 0.011587f, -0.004010f, -0.016176f, -0.029584f, 0.004284f, 0.003671f, 0.007583f, -0.008309f, -0.030989f, -0.034571f, 0.036298f, 0.032854f, 0.010820f, 0.030006f, -0.026713f, 0.002210f, 0.014133f, -0.007158f, -0.016979f, -0.032163f, -0.015140f, 0.003762f, -0.001352f, -0.016079f, 0.014667f, -0.001529f, 0.014182f, 0.009728f, 0.000596f, -0.034884f, -0.019377f, -0.017568f, -0.002971f, 0.001168f, 0.003972f, -0.007937f, -0.009752f, -0.000220f, 0.004798f, -0.032054f, -0.008000f, 0.001988f, 0.005940f, -0.016381f, -0.037560f, -0.011855f, -0.010119f, 0.023623f, -0.002043f, 0.008341f, -0.013423f, -0.013641f, -0.017753f, -0.023254f, -0.012266f, -0.002612f, -0.003132f, 0.016138f, -0.015684f, -0.004704f, -0.010030f, 0.011564f, -0.008163f, 0.024958f, -0.013815f, 0.006089f, -0.010910f, 0.003872f, 0.003966f, -0.012284f, -0.011783f, -0.023577f, -0.030457f, -0.016527f, -0.009347f, 0.000849f, -0.001327f, -0.013559f, -0.016609f, -0.027287f, + 0.012136f, -0.027335f, -0.040050f, 0.026766f, -0.024831f, -0.026766f, 0.024963f, 0.007388f, -0.008150f, 0.031255f, 0.014662f, -0.020212f, 0.018746f, -0.055079f, -0.005962f, -0.012398f, -0.008220f, -0.024605f, 0.045136f, 0.024537f, -0.015956f, 0.009384f, 0.012752f, -0.007406f, 0.014281f, 0.002770f, -0.001449f, -0.010934f, 0.013759f, 0.021003f, 0.022631f, -0.036283f, -0.003615f, 0.002448f, 0.009238f, -0.014879f, -0.009067f, -0.015125f, -0.020033f, 0.033880f, 0.007600f, -0.020175f, 0.009501f, -0.011228f, -0.017705f, -0.021661f, -0.047780f, 0.015210f, 0.027372f, 0.005608f, 0.027616f, 0.044739f, -0.004834f, -0.012561f, -0.040862f, 0.007809f, -0.006145f, -0.031949f, 0.003579f, -0.072266f, -0.049912f, -0.034362f, 0.018258f, 0.037112f, -0.052500f, 0.012864f, 0.035886f, 0.023524f, -0.001292f, 0.014312f, 0.033807f, -0.014973f, -0.002820f, -0.009150f, 0.000273f, -0.021527f, 0.015229f, 0.001282f, 0.001154f, 0.006867f, 0.045607f, -0.001363f, -0.021168f, -0.018910f, 0.010325f, 0.035134f, -0.014495f, -0.033510f, 0.009543f, 0.035681f, 0.019499f, -0.003586f, 0.016102f, 0.012465f, 0.015489f, 0.004735f, + 0.013012f, 0.024647f, -0.003640f, -0.038402f, 0.001274f, 0.013437f, -0.037822f, -0.025829f, 0.035577f, 0.029780f, -0.028756f, -0.017022f, 0.008126f, -0.000492f, 0.017050f, 0.045581f, -0.010264f, -0.007051f, 0.007593f, -0.000727f, 0.015507f, 0.009791f, -0.016973f, -0.010936f, -0.007016f, 0.014725f, 0.010717f, -0.009848f, -0.033145f, -0.003623f, -0.049483f, 0.047714f, 0.006035f, -0.006041f, 0.002134f, 0.021330f, -0.004449f, -0.018763f, -0.008947f, -0.002935f, -0.028330f, -0.001220f, 0.004768f, -0.034646f, -0.009246f, 0.025975f, 0.033678f, 0.023881f, 0.062968f, 0.038003f, 0.057007f, 0.021239f, 0.014811f, -0.029737f, 0.031821f, -0.011000f, -0.003962f, -0.023895f, -0.016151f, 0.030813f, -0.010582f, 0.070156f, 0.032308f, 0.020041f, -0.004259f, 0.015981f, -0.011612f, -0.033193f, -0.017197f, -0.020746f, 0.014225f, -0.019603f, -0.001095f, -0.020971f, 0.011347f, 0.028241f, 0.025108f, -0.002125f, 0.036597f, 0.030800f, 0.000615f, -0.011332f, -0.015186f, -0.026090f, -0.009766f, 0.058478f, 0.021851f, 0.067382f, -0.022948f, -0.000143f, -0.003442f, 0.015339f, 0.053262f, 0.018183f, 0.000027f, 0.034549f, + 0.038769f, 0.041934f, -0.005284f, -0.025463f, -0.010746f, -0.007291f, -0.008875f, 0.027785f, 0.017409f, 0.026439f, 0.038781f, -0.025486f, 0.059452f, -0.041281f, -0.079970f, -0.011691f, -0.027063f, 0.016521f, 0.035660f, 0.060898f, -0.030792f, -0.022367f, 0.020507f, -0.016782f, -0.004213f, -0.007280f, 0.007141f, 0.027298f, 0.027313f, 0.042749f, -0.046440f, 0.052479f, -0.019307f, 0.005676f, -0.024435f, 0.022396f, 0.038148f, 0.016906f, 0.006536f, 0.003722f, 0.046723f, 0.012686f, -0.002121f, -0.014556f, -0.007721f, -0.047515f, -0.007011f, -0.022495f, -0.058908f, 0.006180f, -0.003838f, 0.025131f, -0.061206f, -0.010671f, 0.014115f, 0.023869f, 0.050634f, -0.012580f, 0.014739f, 0.029141f, 0.004216f, -0.005563f, 0.014464f, -0.011911f, -0.003268f, -0.074481f, 0.006976f, -0.030663f, -0.037753f, -0.040604f, 0.017661f, -0.066204f, 0.023087f, -0.023379f, -0.033550f, -0.044091f, 0.042807f, 0.048154f, 0.045739f, 0.012269f, 0.009295f, 0.045793f, -0.057519f, -0.001734f, -0.016727f, 0.028180f, -0.068253f, -0.019265f, -0.005525f, 0.027681f, 0.019505f, 0.020388f, 0.029742f, -0.019097f, 0.010527f, -0.020003f, + -0.054057f, -0.002127f, -0.018537f, 0.064253f, 0.014829f, 0.045191f, -0.013887f, 0.062119f, -0.038348f, -0.075198f, 0.018108f, 0.011755f, 0.009865f, -0.037710f, -0.040632f, -0.033673f, 0.013830f, -0.033843f, 0.016142f, -0.018186f, 0.051109f, -0.016654f, -0.005823f, 0.035267f, 0.002817f, -0.089268f, -0.035181f, -0.001481f, 0.060410f, -0.006929f, -0.016497f, -0.051092f, 0.010789f, -0.012606f, -0.041868f, -0.051886f, -0.003963f, 0.009680f, -0.015760f, -0.019519f, -0.049797f, 0.034416f, -0.010636f, 0.012719f, -0.023549f, 0.001745f, 0.017835f, 0.010146f, 0.048383f, 0.001330f, -0.013220f, -0.058649f, -0.018375f, 0.030008f, -0.038081f, -0.019478f, 0.017999f, 0.034361f, 0.028612f, 0.067184f, 0.053073f, 0.002922f, 0.041192f, 0.041104f, 0.016721f, 0.004094f, 0.026458f, -0.016466f, 0.102796f, -0.042032f, -0.103446f, 0.032689f, -0.086823f, 0.001351f, -0.066052f, 0.006057f, 0.093198f, 0.043749f, -0.064996f, -0.039204f, -0.028138f, -0.019447f, 0.023022f, 0.041755f, -0.025118f, 0.005317f, 0.032884f, -0.067899f, 0.003267f, 0.019433f, -0.055209f, 0.030567f, -0.019565f, 0.027396f, 0.007435f, 0.030573f, + 0.001317f, -0.031360f, 0.034205f, -0.041754f, -0.011317f, 0.090593f, -0.037215f, 0.035420f, -0.022112f, 0.039473f, 0.031469f, -0.007783f, -0.039440f, 0.044408f, 0.104622f, -0.054060f, 0.014038f, -0.072903f, 0.037969f, 0.027494f, -0.042487f, 0.050368f, 0.003596f, -0.087970f, 0.012618f, 0.009024f, 0.041613f, -0.006676f, -0.006968f, -0.043720f, -0.047522f, -0.019278f, 0.115075f, -0.012464f, 0.058440f, -0.046064f, 0.038553f, 0.024402f, -0.010405f, -0.033727f, -0.006973f, 0.038581f, 0.065395f, -0.017120f, -0.020966f, -0.000146f, 0.013790f, 0.063564f, -0.012903f, -0.005687f, -0.040033f, 0.021187f, -0.060627f, -0.018844f, 0.048229f, 0.065171f, 0.010146f, 0.013432f, -0.064149f, 0.046400f, 0.035665f, -0.075205f, 0.002752f, -0.037044f, 0.000237f, -0.083180f, 0.083901f, 0.082536f, -0.012834f, -0.034980f, -0.018871f, -0.010746f, 0.038280f, -0.038712f, 0.050809f, -0.068319f, -0.047612f, 0.026745f, 0.021442f, 0.011771f, 0.020574f, 0.076265f, 0.015602f, 0.038455f, 0.003997f, 0.039844f, 0.019387f, -0.009587f, 0.002445f, 0.034938f, -0.006541f, 0.004089f, 0.051700f, 0.031911f, 0.069302f, 0.000097f, + 0.037611f, 0.007148f, -0.058365f, 0.062421f, -0.032892f, 0.001262f, 0.012695f, -0.043469f, -0.038864f, 0.027833f, 0.076080f, 0.052120f, 0.024853f, -0.094873f, -0.028158f, -0.063587f, -0.004689f, 0.125413f, 0.072451f, 0.097639f, 0.003138f, -0.074777f, 0.022921f, 0.097433f, 0.014801f, -0.009858f, 0.073881f, 0.020967f, 0.048815f, -0.118739f, -0.111868f, 0.094053f, -0.006694f, -0.018873f, -0.083405f, 0.000706f, -0.026811f, 0.057793f, 0.040720f, 0.018035f, 0.029701f, -0.071927f, 0.040290f, 0.065051f, -0.000409f, 0.025221f, -0.059717f, 0.047229f, -0.030022f, 0.024966f, -0.003281f, 0.004657f, 0.030762f, -0.006724f, 0.018053f, -0.003132f, -0.049423f, 0.016123f, -0.008735f, 0.053435f, 0.036993f, 0.065371f, 0.014346f, -0.042256f, -0.044651f, 0.044001f, 0.038163f, 0.025020f, -0.002556f, 0.018536f, -0.018804f, -0.033742f, -0.000355f, -0.009608f, 0.047056f, 0.042456f, 0.025704f, 0.047619f, 0.036430f, -0.055997f, 0.059045f, 0.070697f, 0.040025f, -0.027659f, -0.037628f, -0.037099f, 0.049379f, 0.039434f, 0.086401f, -0.052765f, -0.067551f, -0.038833f, -0.095050f, -0.016026f, 0.080525f, 0.020949f, + 0.060183f, -0.069870f, -0.094451f, 0.025129f, 0.038605f, -0.063842f, -0.003345f, -0.048521f, 0.006789f, -0.056382f, -0.022898f, 0.042085f, 0.013197f, -0.047348f, 0.000694f, -0.030241f, -0.118137f, 0.017366f, 0.072760f, -0.002285f, -0.146560f, -0.031363f, -0.002196f, 0.000513f, 0.053070f, -0.139136f, -0.014340f, 0.060796f, -0.100342f, 0.021231f, -0.022009f, 0.116539f, 0.063602f, -0.074337f, 0.018708f, 0.077533f, 0.008849f, -0.033965f, 0.026848f, 0.016721f, 0.010938f, -0.004058f, -0.007607f, 0.003448f, 0.013213f, 0.024471f, 0.082031f, 0.062661f, 0.071587f, 0.045812f, 0.090022f, 0.040618f, 0.091889f, 0.034515f, 0.081297f, -0.002511f, 0.050089f, 0.041923f, 0.049450f, 0.034581f, -0.004835f, 0.010939f, -0.064173f, -0.041783f, 0.118076f, -0.002938f, -0.049559f, -0.017999f, 0.035565f, 0.058246f, 0.126505f, -0.022357f, -0.073325f, -0.040818f, -0.054972f, 0.067993f, 0.080866f, 0.088424f, 0.025858f, -0.009190f, 0.059958f, -0.114076f, 0.094410f, 0.031010f, -0.056166f, -0.007513f, -0.172730f, -0.002861f, -0.115985f, -0.161296f, -0.043295f, -0.098154f, -0.043789f, 0.166444f, 0.156969f, 0.138433f, + -0.040296f, 0.105205f, 0.129371f, -0.107258f, -0.097047f, 0.032205f, 0.113228f, 0.002102f, -0.051964f, -0.000339f, 0.031323f, 0.033028f, -0.092209f, 0.033837f, -0.011540f, 0.048319f, -0.050156f, -0.025423f, -0.058874f, 0.062324f, -0.007564f, -0.028873f, -0.054848f, 0.040021f, 0.025418f, -0.010751f, -0.046015f, 0.020995f, 0.022344f, 0.009954f, -0.040310f, -0.007342f, -0.000487f, 0.046928f, -0.034704f, -0.010403f, -0.051418f, -0.015668f, 0.020457f, 0.040655f, -0.053268f, -0.023100f, 0.061455f, 0.048513f, -0.012975f, -0.038031f, 0.002535f, -0.020705f, 0.052361f, -0.030887f, -0.012321f, 0.020984f, 0.021457f, 0.026993f, -0.023258f, 0.005107f, -0.033156f, 0.039355f, 0.055612f, 0.020053f, 0.012982f, -0.044506f, 0.050866f, -0.037168f, 0.076294f, -0.056955f, 0.063196f, -0.094762f, 0.067375f, 0.000436f, 0.003515f, -0.070361f, -0.008605f, 0.010830f, -0.004238f, -0.004655f, -0.002840f, -0.023527f, 0.103205f, 0.108651f, -0.063660f, -0.038602f, 0.022266f, 0.103760f, 0.065416f, 0.038347f, 0.038018f, -0.017109f, -0.042985f, -0.013699f, 0.025175f, -0.000857f, -0.009594f, 0.030645f, 0.001245f, 0.021474f, + 0.003411f, -0.012104f, -0.038359f, -0.010804f, -0.001525f, 0.002476f, -0.000762f, -0.032166f, 0.036276f, 0.005541f, -0.013441f, -0.001160f, -0.000232f, 0.000163f, 0.023791f, 0.041740f, 0.018865f, 0.003962f, -0.014177f, -0.022030f, -0.004641f, 0.013432f, 0.029242f, 0.037763f, -0.020086f, -0.021081f, 0.005892f, 0.038263f, 0.018527f, 0.008499f, -0.016050f, -0.034824f, 0.031072f, -0.006050f, 0.002292f, 0.002181f, 0.011129f, 0.009444f, -0.002544f, -0.000876f, -0.020886f, 0.004040f, 0.022014f, -0.008760f, 0.014156f, -0.005701f, -0.013739f, 0.011634f, -0.000312f, 0.007395f, 0.001944f, 0.019949f, 0.015583f, -0.022302f, 0.012380f, 0.006977f, -0.040264f, -0.036581f, -0.135084f, 0.057224f, 0.209208f, 0.192308f, 0.164777f, 0.065345f, -0.155528f, -0.097817f, -0.139744f, -0.157288f, -0.139980f, -0.041058f, 0.030914f, 0.118317f, 0.123928f, 0.147654f, 0.098467f, 0.098646f, 0.003100f, -0.103817f, -0.098451f, -0.122212f, -0.094881f, -0.053177f, -0.002812f, -0.034206f, 0.037976f, 0.045921f, 0.075118f, 0.081701f, 0.083749f, 0.049545f, 0.005145f, 0.022165f, -0.017216f, 0.012031f, -0.055606f, -0.040882f, + -0.051279f, -0.085314f, -0.066771f, -0.051670f, -0.035496f, -0.060429f, 0.009842f, 0.104588f, 0.118999f, 0.066267f, 0.124462f, 0.031204f, 0.073399f, 0.037729f, 0.022878f, -0.029934f, -0.063646f, -0.088809f, -0.124163f, -0.095576f, -0.141742f, -0.058187f, -0.061573f, 0.043089f, 0.044286f, 0.122585f, 0.142129f, 0.126204f, 0.113894f, 0.110856f, 0.071844f, 0.012445f, -0.032116f, -0.109308f, -0.064708f, -0.141123f, -0.115953f, -0.156398f, 0.010384f, 0.006756f, 0.021041f} + }, + { + {0.020698f, -0.004062f, 0.005796f, 0.002807f, -0.010564f, 0.002857f, 0.009064f, -0.003562f, -0.001485f, 0.002784f, -0.004037f, -0.009849f, 0.010475f, -0.002352f, 0.018329f, -0.000190f, 0.001916f, 0.007867f, -0.011239f, -0.003773f, -0.012030f, -0.002116f, -0.005337f, 0.005000f, 0.008364f, 0.001960f, -0.003793f, -0.000792f, -0.000286f, 0.008061f, -0.006312f, -0.003987f, -0.008589f, 0.006467f, 0.003400f, 0.000002f, 0.001220f, -0.006929f, 0.005549f, -0.008141f, 0.000790f, -0.004164f, 0.006771f, 0.005495f, -0.009145f, 0.000942f, -0.010951f, 0.000511f, 0.003659f, 0.003977f, 0.004632f, 0.003670f, 0.001253f, -0.006299f, -0.004754f, 0.002588f, 0.004221f, -0.004512f, 0.010775f, -0.003460f, 0.001469f, -0.002504f, -0.000642f, 0.001611f, -0.001390f, 0.007874f, -0.005645f, 0.015354f, 0.002821f, 0.002428f, -0.003398f, -0.000368f, 0.001380f, 0.002407f, 0.000241f, 0.001749f, -0.009393f, -0.010067f, -0.007906f, 0.002016f, -0.004444f, -0.000991f, -0.001118f, 0.004467f, 0.019042f, -0.005287f, 0.002104f, -0.018193f, -0.009593f, 0.005207f, -0.008326f, -0.006920f, -0.002318f, -0.007850f, -0.001812f, 0.015346f, + -0.006518f, -0.010292f, 0.017074f, 0.013223f, -0.004582f, -0.003435f, 0.015639f, 0.004089f, 0.006175f, 0.002668f, 0.000936f, -0.004281f, -0.006337f, 0.005791f, -0.004679f, 0.004233f, 0.001834f, 0.001407f, -0.001994f, -0.005681f, -0.004000f, 0.003392f, -0.004633f, -0.007975f, -0.003255f, -0.003801f, -0.009491f, 0.010491f, 0.017034f, -0.010159f, 0.005662f, -0.000006f, -0.003637f, 0.002177f, -0.000269f, -0.000388f, -0.005505f, 0.009879f, -0.006048f, -0.008249f, 0.008829f, 0.002006f, -0.000315f, -0.001677f, 0.004910f, -0.000468f, -0.000003f, -0.003855f, -0.001374f, 0.008201f, -0.013272f, 0.003429f, 0.002583f, -0.004623f, -0.003092f, -0.006425f, -0.006494f, -0.029722f, -0.004625f, -0.010898f, -0.002608f, 0.002336f, -0.008030f, -0.018142f, 0.013309f, -0.004502f, 0.003140f, 0.008808f, -0.002766f, -0.000968f, -0.001053f, 0.004021f, -0.003086f, 0.014860f, -0.000570f, 0.011448f, 0.016930f, -0.020328f, 0.004293f, 0.014012f, 0.001014f, 0.002739f, 0.009789f, 0.017941f, 0.002618f, -0.004118f, 0.009106f, -0.002478f, -0.004655f, 0.003993f, 0.003244f, 0.003950f, -0.005033f, 0.018285f, -0.008433f, 0.004565f, + 0.006885f, -0.000148f, -0.000859f, -0.009018f, 0.001496f, -0.010436f, 0.008755f, -0.010658f, -0.008098f, 0.005815f, -0.009839f, 0.006725f, -0.006854f, 0.002800f, -0.005522f, 0.003725f, 0.008038f, 0.015603f, 0.004856f, 0.001745f, 0.007673f, 0.000102f, -0.013446f, 0.001793f, 0.003877f, 0.005160f, -0.003310f, 0.000749f, -0.001759f, 0.002641f, 0.007655f, 0.004662f, 0.010428f, 0.003733f, 0.001497f, -0.006003f, -0.003132f, 0.006233f, -0.010718f, 0.007956f, 0.005276f, 0.001554f, 0.010204f, -0.000623f, 0.005722f, 0.013749f, 0.008589f, 0.018044f, 0.003507f, -0.002804f, -0.018606f, 0.002789f, -0.011426f, -0.003966f, 0.001395f, 0.004019f, -0.007189f, -0.000192f, 0.017818f, -0.009356f, -0.000552f, -0.009362f, 0.004262f, -0.000160f, 0.003378f, 0.007029f, 0.008504f, -0.005713f, 0.006344f, 0.006354f, 0.012808f, 0.000151f, -0.012824f, 0.000862f, 0.013564f, -0.001747f, -0.001011f, -0.002324f, 0.009055f, -0.011195f, 0.000731f, 0.006546f, 0.009044f, 0.010518f, -0.004348f, -0.007811f, -0.001122f, 0.015267f, 0.001282f, 0.005072f, -0.013128f, -0.006498f, 0.002925f, 0.001890f, -0.002426f, 0.007575f, + -0.000798f, -0.002665f, 0.004507f, -0.009131f, 0.000303f, -0.002380f, 0.005346f, 0.007301f, -0.012749f, -0.004191f, 0.003900f, 0.006843f, -0.005500f, -0.006977f, 0.003442f, 0.007777f, -0.000752f, 0.003893f, 0.031788f, 0.016104f, 0.012243f, -0.011551f, -0.002597f, -0.016303f, -0.012447f, 0.018396f, 0.001132f, -0.010893f, -0.005769f, 0.004273f, -0.011223f, -0.000547f, 0.017745f, 0.007717f, -0.001278f, 0.006265f, 0.026248f, -0.017435f, 0.003740f, -0.002958f, -0.009203f, 0.015770f, 0.007275f, 0.008350f, -0.006550f, 0.007247f, 0.008280f, -0.002382f, 0.005107f, -0.001481f, -0.008208f, 0.001902f, 0.002290f, -0.001030f, 0.008485f, 0.002520f, -0.003863f, 0.010298f, -0.005175f, -0.004480f, -0.006406f, 0.003046f, 0.003251f, 0.000938f, 0.006606f, 0.001152f, 0.022066f, 0.001649f, -0.000613f, -0.005133f, -0.005329f, 0.005539f, -0.017464f, 0.000767f, 0.009531f, 0.008068f, -0.009687f, 0.013338f, -0.000340f, 0.005902f, 0.010123f, -0.003165f, 0.007739f, 0.006193f, -0.003421f, -0.009947f, -0.007780f, 0.005575f, 0.014819f, 0.003673f, -0.006804f, -0.004197f, -0.003664f, 0.008931f, 0.007511f, 0.002309f, + 0.020799f, 0.005465f, 0.012240f, -0.000394f, 0.002415f, 0.003671f, 0.003095f, -0.003394f, 0.012409f, -0.005360f, 0.013424f, -0.006816f, -0.005914f, 0.003627f, -0.009763f, -0.002694f, -0.003501f, 0.003818f, 0.005141f, -0.003833f, -0.014150f, 0.005935f, -0.017007f, -0.006806f, -0.003536f, -0.000657f, -0.003365f, 0.002857f, 0.013732f, 0.007864f, 0.000089f, -0.015603f, -0.015524f, 0.000016f, 0.008845f, -0.005742f, 0.000498f, -0.002470f, -0.007559f, -0.010420f, -0.000137f, 0.005859f, 0.012871f, 0.011878f, -0.002885f, 0.003184f, -0.018962f, 0.005048f, 0.010339f, 0.012243f, -0.003097f, 0.010968f, 0.001072f, 0.016392f, 0.008847f, 0.001970f, 0.006299f, -0.002354f, -0.006421f, -0.004852f, -0.003708f, 0.009203f, -0.006302f, -0.008391f, -0.009938f, 0.008697f, -0.005071f, -0.022181f, 0.001238f, 0.004172f, 0.007943f, 0.010212f, 0.020686f, -0.015245f, -0.012203f, -0.029575f, 0.015186f, 0.017648f, 0.004185f, 0.014445f, 0.003870f, -0.015839f, 0.000334f, -0.008187f, -0.001823f, 0.013263f, -0.017480f, -0.006829f, 0.008458f, 0.006084f, 0.019137f, -0.004870f, 0.009298f, -0.028663f, -0.012053f, 0.005559f, + 0.017937f, -0.012002f, -0.005765f, -0.012750f, -0.011838f, 0.005807f, 0.000199f, -0.001208f, 0.007023f, 0.001160f, 0.007271f, 0.019822f, -0.010831f, 0.019216f, 0.000854f, 0.002922f, 0.006569f, 0.003207f, -0.004136f, 0.005903f, -0.012425f, -0.003968f, -0.005782f, -0.002714f, -0.008616f, 0.011909f, 0.004516f, 0.035058f, 0.003413f, -0.003417f, -0.006852f, 0.000536f, -0.005304f, 0.017884f, -0.009241f, 0.001521f, -0.018663f, 0.014941f, 0.017202f, -0.018410f, 0.013399f, 0.010064f, 0.007334f, -0.010233f, -0.006725f, 0.015298f, 0.007222f, -0.023557f, 0.014359f, -0.011268f, -0.002373f, 0.005159f, -0.001842f, 0.002434f, 0.009027f, 0.006912f, -0.004682f, 0.012001f, 0.002718f, -0.000525f, -0.010041f, -0.017726f, 0.006545f, -0.009619f, -0.003397f, 0.016664f, -0.022625f, -0.009808f, -0.016552f, -0.001930f, 0.014966f, -0.001537f, -0.011563f, -0.016823f, -0.018248f, 0.007134f, 0.020244f, -0.005804f, 0.012836f, 0.018486f, -0.004659f, -0.004393f, 0.007791f, 0.010265f, 0.022604f, -0.003263f, 0.012949f, 0.001759f, 0.026806f, 0.019289f, 0.005847f, -0.006182f, 0.003228f, -0.014532f, 0.026084f, 0.005973f, + -0.010642f, -0.012410f, 0.015321f, 0.012516f, 0.009571f, 0.006492f, 0.005012f, 0.013354f, -0.005046f, 0.006008f, -0.008059f, 0.001478f, 0.001400f, -0.013005f, -0.017014f, -0.005996f, -0.011802f, 0.008367f, -0.006921f, -0.005306f, -0.018597f, -0.011745f, 0.004423f, -0.006146f, -0.001604f, 0.009788f, 0.020044f, 0.024958f, 0.013339f, 0.010699f, -0.008434f, -0.019244f, 0.000737f, -0.013284f, -0.032147f, -0.036497f, -0.012007f, 0.002613f, 0.017518f, -0.012410f, 0.008291f, 0.006391f, -0.001276f, 0.027825f, -0.004157f, 0.026240f, -0.015573f, 0.008174f, 0.007621f, 0.000992f, -0.023855f, -0.008979f, -0.009182f, -0.025854f, 0.008637f, -0.005880f, 0.005228f, -0.000911f, 0.009243f, 0.000733f, -0.010764f, 0.006334f, -0.017446f, 0.013430f, 0.007056f, 0.029958f, -0.001542f, 0.001739f, 0.026321f, -0.022621f, 0.020396f, 0.026225f, -0.016062f, 0.017242f, -0.007009f, -0.006680f, -0.013458f, 0.004355f, 0.002920f, 0.019038f, 0.011468f, -0.003569f, -0.007568f, -0.014193f, 0.008351f, 0.010704f, -0.017550f, -0.006691f, 0.016483f, -0.027543f, 0.002798f, -0.020929f, 0.012736f, 0.002612f, -0.000188f, 0.008189f, + -0.007225f, 0.004109f, 0.026966f, -0.009282f, 0.006356f, 0.014705f, 0.008852f, 0.003371f, -0.013096f, 0.008353f, 0.006335f, -0.005658f, -0.021179f, 0.003286f, -0.003141f, -0.013260f, -0.014743f, 0.043628f, -0.015975f, 0.008106f, 0.006729f, 0.015273f, 0.005339f, 0.009087f, 0.022389f, -0.017459f, -0.010056f, -0.001858f, 0.030988f, -0.012271f, -0.012637f, -0.015647f, 0.007947f, 0.004642f, 0.017127f, -0.035405f, 0.000709f, 0.000265f, -0.001997f, 0.017477f, -0.003983f, 0.013366f, 0.026056f, -0.019151f, -0.008007f, 0.006834f, -0.013642f, -0.018107f, 0.012216f, -0.016858f, 0.024518f, -0.004617f, -0.024503f, -0.003784f, -0.013916f, 0.007400f, 0.020064f, -0.000883f, 0.010328f, -0.001727f, 0.004194f, 0.022961f, 0.001088f, 0.016509f, 0.007095f, -0.013272f, 0.013658f, 0.010838f, 0.001948f, 0.009010f, 0.034067f, -0.006136f, -0.014754f, 0.007441f, -0.018765f, 0.000918f, 0.032599f, 0.010316f, 0.005524f, -0.006780f, -0.008741f, -0.006905f, -0.010873f, 0.018610f, -0.012186f, -0.004321f, -0.007328f, 0.020853f, -0.039778f, 0.012219f, 0.015015f, 0.021543f, 0.006516f, 0.065024f, 0.019503f, -0.011891f, + -0.015701f, -0.013320f, 0.047280f, -0.040612f, 0.003388f, 0.015962f, 0.002533f, -0.021957f, -0.004780f, 0.011159f, -0.002132f, 0.002696f, 0.019811f, -0.020086f, -0.016726f, 0.008528f, 0.025797f, 0.015926f, 0.006912f, -0.012110f, -0.011719f, -0.011349f, -0.013162f, 0.012932f, 0.005421f, 0.018432f, 0.014948f, 0.008642f, -0.018746f, -0.008724f, -0.019972f, -0.003614f, -0.012907f, -0.030420f, -0.005215f, 0.014336f, 0.003644f, -0.013768f, -0.013849f, 0.000979f, 0.008111f, 0.020009f, 0.003126f, 0.010524f, 0.003502f, 0.038152f, -0.031706f, 0.022051f, 0.004746f, -0.032212f, -0.005179f, -0.009019f, -0.007355f, 0.006121f, -0.013623f, 0.009867f, 0.007261f, 0.016038f, -0.017143f, 0.007725f, 0.029890f, 0.015002f, 0.046941f, -0.008695f, -0.000198f, -0.009543f, -0.004897f, 0.003213f, -0.000189f, -0.041396f, 0.019763f, 0.000641f, -0.003421f, 0.014205f, -0.003210f, -0.022534f, 0.006004f, 0.011079f, 0.000231f, -0.014180f, -0.008627f, -0.029750f, -0.033740f, 0.006298f, -0.014620f, -0.008118f, 0.005655f, -0.001171f, -0.003026f, -0.016247f, -0.007066f, -0.001075f, 0.012596f, 0.011918f, -0.018389f, -0.011808f, + 0.012364f, -0.017918f, -0.007868f, -0.028735f, 0.027249f, -0.004536f, 0.024562f, 0.001047f, 0.009427f, 0.024593f, 0.019741f, -0.012523f, 0.006148f, 0.011915f, -0.013454f, -0.006757f, 0.012953f, -0.005921f, -0.030594f, -0.006953f, -0.021415f, 0.030389f, -0.003227f, -0.009696f, -0.018017f, -0.027729f, 0.009496f, 0.004233f, 0.006215f, 0.011624f, 0.000242f, -0.006259f, 0.013516f, 0.001990f, -0.002776f, 0.003253f, -0.007853f, 0.019316f, -0.005243f, 0.011532f, 0.038668f, 0.006967f, 0.006871f, 0.007315f, 0.013843f, -0.035929f, -0.028199f, 0.008386f, -0.030880f, 0.018498f, -0.005343f, 0.021180f, 0.004687f, 0.042944f, 0.014617f, -0.012802f, -0.002014f, -0.056230f, -0.038142f, 0.013610f, -0.014800f, -0.032899f, -0.048043f, -0.002038f, 0.004498f, -0.010318f, -0.007189f, 0.045529f, 0.012744f, -0.034507f, 0.007557f, -0.021446f, -0.016734f, -0.017622f, -0.029514f, -0.005962f, 0.003208f, -0.042330f, -0.038690f, -0.015917f, 0.006850f, 0.002761f, 0.024041f, 0.018936f, 0.012775f, -0.011087f, -0.000104f, 0.007992f, -0.020931f, -0.013008f, -0.007015f, 0.005782f, -0.019722f, -0.013413f, 0.013733f, 0.006946f, + -0.000445f, -0.004375f, -0.003665f, 0.009983f, -0.028644f, -0.017711f, -0.014145f, 0.017590f, -0.022296f, 0.013646f, 0.025314f, 0.033385f, -0.002513f, 0.008514f, -0.008520f, -0.018195f, -0.022153f, -0.007480f, 0.021150f, 0.006466f, -0.039548f, 0.000059f, 0.039932f, -0.028583f, 0.000697f, -0.007492f, 0.001457f, 0.007812f, 0.019841f, -0.006145f, 0.005662f, 0.022803f, 0.016034f, 0.008726f, -0.020125f, -0.025508f, -0.033887f, 0.019366f, -0.027707f, -0.045279f, 0.006972f, -0.026938f, -0.017988f, 0.056767f, 0.002292f, 0.042893f, 0.035773f, -0.005944f, 0.037754f, 0.055791f, 0.037126f, -0.046985f, -0.007935f, -0.021001f, -0.024305f, -0.012410f, -0.000480f, -0.018429f, 0.040889f, 0.014176f, 0.021782f, -0.018221f, 0.020787f, 0.018746f, 0.004239f, -0.023615f, -0.021106f, 0.041967f, -0.008826f, -0.035925f, -0.004030f, -0.041823f, -0.007751f, 0.013834f, -0.017086f, 0.002722f, -0.037005f, 0.018102f, 0.030711f, 0.019264f, -0.006244f, -0.015575f, -0.008021f, -0.002493f, -0.007565f, -0.014393f, -0.045175f, 0.031465f, 0.015029f, 0.017441f, 0.016901f, -0.022698f, 0.036905f, 0.007013f, -0.013250f, -0.006325f, + -0.032355f, -0.011174f, 0.018200f, 0.014794f, 0.031190f, -0.000911f, -0.039513f, -0.063336f, -0.005790f, 0.002678f, -0.001750f, -0.020269f, -0.035553f, -0.002026f, 0.019496f, -0.005772f, -0.017127f, 0.070328f, 0.044731f, -0.006535f, -0.040854f, 0.008435f, 0.020738f, 0.011599f, 0.030203f, 0.044740f, -0.019565f, 0.003502f, -0.039893f, 0.011179f, 0.003604f, -0.015783f, 0.072689f, 0.027238f, 0.062775f, 0.025592f, 0.016441f, -0.054616f, 0.001184f, 0.030161f, 0.005894f, -0.029168f, 0.012626f, -0.044485f, -0.016895f, 0.002842f, 0.013763f, -0.013471f, -0.008174f, 0.009388f, 0.008287f, 0.002981f, 0.039700f, 0.024140f, 0.006964f, -0.015933f, 0.027548f, -0.017805f, -0.012043f, -0.026074f, -0.007994f, 0.033422f, -0.052573f, -0.001092f, 0.024564f, -0.026841f, -0.007622f, 0.009824f, 0.009761f, 0.048817f, -0.001995f, -0.000899f, -0.022033f, 0.047681f, -0.020423f, 0.005680f, 0.006112f, 0.032860f, -0.006588f, -0.012443f, 0.032968f, -0.053878f, 0.015384f, 0.004680f, -0.020497f, 0.042323f, -0.051482f, -0.007063f, -0.015550f, -0.035824f, -0.015014f, -0.002208f, 0.019527f, 0.038071f, 0.054794f, -0.066242f, + 0.016897f, 0.005830f, 0.080622f, 0.021183f, 0.013646f, 0.000150f, 0.038483f, 0.013389f, -0.062258f, -0.006678f, 0.063135f, -0.016469f, -0.015199f, 0.008294f, -0.005963f, 0.004413f, -0.013203f, 0.070514f, 0.075405f, -0.038084f, 0.017366f, 0.023969f, 0.010029f, 0.025239f, -0.034898f, -0.043080f, 0.034861f, 0.013591f, -0.026790f, -0.040731f, -0.014308f, -0.011113f, 0.039951f, 0.037552f, 0.017933f, -0.033381f, 0.020048f, -0.011786f, 0.012584f, 0.007050f, 0.016931f, 0.043468f, 0.008317f, -0.080768f, -0.026835f, 0.021289f, -0.034878f, 0.016244f, 0.036122f, 0.018333f, 0.063226f, -0.014625f, -0.095735f, 0.004566f, -0.038294f, 0.040400f, 0.028616f, -0.002759f, -0.020495f, 0.037686f, -0.046033f, 0.000630f, -0.024982f, 0.031204f, 0.029576f, 0.035950f, 0.027339f, -0.009080f, -0.039463f, -0.102523f, -0.056318f, -0.052016f, 0.008735f, -0.026721f, -0.026305f, 0.019001f, -0.058959f, 0.001270f, -0.036780f, -0.017620f, 0.011704f, -0.020067f, -0.003603f, 0.002186f, -0.091920f, -0.010683f, 0.057064f, -0.068224f, 0.004654f, 0.028888f, -0.001522f, 0.020983f, -0.007547f, -0.053563f, -0.006930f, 0.032959f, + 0.008029f, 0.047894f, 0.028596f, -0.045644f, -0.054201f, -0.004532f, -0.024692f, -0.005031f, -0.087877f, 0.034378f, 0.031806f, 0.062253f, 0.025110f, 0.056839f, -0.025741f, 0.009726f, 0.053949f, -0.015518f, 0.058926f, 0.019142f, 0.030201f, 0.013016f, -0.017595f, 0.032222f, -0.039072f, 0.003795f, 0.075161f, -0.057973f, 0.003572f, -0.076059f, -0.036992f, -0.054271f, -0.039954f, -0.008165f, 0.002307f, -0.016889f, -0.061093f, -0.009348f, -0.100250f, 0.112594f, 0.037546f, 0.001671f, -0.016493f, -0.026154f, 0.004921f, -0.048548f, 0.007983f, -0.073370f, 0.000829f, 0.003321f, 0.015853f, 0.045934f, 0.067603f, 0.000094f, -0.113558f, -0.056511f, 0.049134f, -0.034241f, -0.016244f, 0.019381f, -0.043238f, 0.030253f, 0.051971f, 0.017537f, -0.022166f, -0.032180f, 0.015884f, -0.041219f, 0.064273f, 0.051356f, 0.081165f, -0.058507f, -0.069388f, -0.019080f, -0.000614f, -0.037059f, 0.048127f, 0.055690f, -0.041291f, -0.001685f, -0.074407f, -0.023847f, -0.034717f, -0.069714f, 0.022526f, 0.054487f, 0.035043f, -0.046003f, -0.016135f, 0.003370f, 0.038901f, 0.003784f, -0.001668f, 0.012271f, -0.003174f, -0.021171f, + -0.059871f, -0.043471f, 0.016903f, -0.007881f, -0.031971f, 0.033765f, 0.033323f, 0.018070f, -0.061111f, -0.059402f, 0.055281f, 0.029967f, 0.041550f, -0.043324f, -0.102436f, -0.022444f, 0.045562f, 0.040587f, -0.008750f, 0.102206f, -0.010978f, 0.102619f, -0.156737f, -0.200577f, -0.078393f, -0.122311f, 0.004429f, 0.042695f, 0.027929f, 0.124793f, -0.010367f, -0.012150f, 0.029160f, -0.029295f, -0.094672f, -0.093459f, -0.091266f, 0.078496f, 0.080458f, -0.023690f, 0.035247f, 0.009562f, 0.025830f, -0.079583f, 0.069642f, 0.047389f, 0.023792f, 0.059378f, -0.034007f, 0.019646f, -0.101127f, -0.053822f, 0.030089f, 0.034707f, 0.020316f, 0.009633f, 0.015562f, 0.023012f, -0.010057f, 0.114280f, 0.013188f, 0.069543f, 0.023631f, -0.039763f, 0.092554f, -0.016623f, 0.037776f, -0.002624f, 0.034646f, -0.008050f, 0.000367f, 0.014998f, 0.047504f, 0.008218f, 0.035291f, -0.002816f, -0.004582f, 0.065825f, 0.010314f, -0.020527f, 0.003434f, -0.011344f, -0.033609f, -0.016232f, 0.022259f, 0.006996f, -0.078044f, -0.026137f, 0.012411f, 0.011743f, 0.086259f, 0.061236f, -0.080640f, -0.053306f, 0.009315f, -0.026363f, + 0.095004f, 0.000547f, 0.087963f, -0.069064f, 0.045805f, -0.001036f, 0.007850f, 0.029133f, 0.091042f, 0.045456f, 0.015525f, 0.064902f, 0.034834f, -0.050525f, -0.072915f, 0.052430f, -0.055848f, 0.022496f, -0.073381f, -0.023192f, -0.116294f, 0.099884f, -0.008018f, -0.125895f, -0.036619f, -0.005506f, 0.009860f, 0.016477f, -0.084817f, -0.042163f, 0.069768f, -0.023276f, 0.023679f, -0.027096f, 0.003979f, 0.097618f, 0.145410f, 0.016023f, -0.008130f, 0.080483f, 0.029806f, 0.037014f, 0.089389f, 0.008412f, 0.053290f, 0.074055f, 0.062611f, -0.018626f, 0.025991f, 0.065345f, 0.079364f, 0.073706f, 0.098198f, 0.063891f, 0.126031f, 0.143089f, 0.096455f, 0.115908f, 0.072341f, 0.000172f, 0.034967f, 0.027637f, -0.028857f, -0.018846f, 0.020464f, 0.072100f, 0.013747f, 0.012289f, -0.000836f, 0.040858f, 0.093458f, 0.082995f, 0.157316f, 0.042194f, -0.081936f, 0.043465f, 0.001536f, 0.044617f, -0.042019f, 0.074298f, -0.114232f, -0.135186f, 0.041183f, 0.160860f, 0.064331f, 0.042915f, -0.184002f, 0.015075f, 0.069071f, 0.125789f, 0.147642f, -0.047495f, 0.006733f, -0.239738f, -0.173812f, 0.087840f, + 0.088275f, -0.119879f, -0.042988f, 0.117667f, 0.144307f, -0.161955f, -0.059227f, 0.054631f, -0.037995f, 0.024580f, -0.051568f, 0.046681f, -0.042811f, 0.006730f, 0.005542f, -0.028429f, 0.017517f, -0.002311f, -0.009301f, -0.016018f, -0.033170f, -0.015260f, 0.013973f, -0.000179f, -0.033959f, 0.032604f, -0.030735f, -0.017333f, -0.025973f, -0.001222f, -0.024673f, 0.056430f, 0.003853f, 0.011447f, -0.011373f, 0.011437f, -0.012473f, 0.012777f, 0.042370f, 0.046275f, -0.008922f, 0.012529f, 0.023572f, 0.040176f, -0.023204f, 0.024312f, -0.020295f, 0.049328f, -0.009737f, -0.034837f, 0.021744f, -0.017637f, -0.012096f, 0.001992f, -0.000752f, 0.019062f, -0.008513f, -0.034510f, -0.026215f, 0.000965f, 0.009036f, -0.056807f, 0.019169f, -0.011476f, -0.002799f, 0.006330f, -0.013031f, -0.011551f, 0.006804f, -0.010440f, 0.007886f, -0.029899f, 0.033029f, -0.095532f, 0.048126f, -0.039387f, 0.059309f, -0.039191f, 0.006238f, -0.025358f, 0.118388f, 0.071660f, -0.039049f, -0.045057f, -0.003991f, 0.146884f, 0.061358f, 0.020388f, 0.040583f, -0.035939f, -0.045192f, 0.012235f, 0.028347f, 0.007097f, 0.002345f, -0.016053f, + -0.012489f, 0.013409f, 0.013787f, 0.033769f, 0.014877f, -0.018977f, -0.008543f, -0.009688f, -0.019053f, -0.000811f, 0.002796f, 0.008470f, 0.011081f, -0.000345f, -0.005513f, 0.012916f, -0.040097f, -0.015807f, 0.016899f, 0.024323f, 0.030512f, -0.018494f, -0.010986f, -0.019667f, 0.031127f, 0.021044f, -0.006908f, 0.009026f, -0.037823f, -0.033141f, 0.028503f, 0.021635f, 0.006207f, -0.057315f, -0.029837f, 0.000814f, 0.008183f, 0.035214f, 0.025128f, -0.005870f, 0.009578f, 0.011188f, -0.018784f, 0.013913f, 0.016000f, -0.007424f, -0.012044f, 0.007740f, -0.020102f, -0.001159f, -0.004542f, -0.016510f, -0.021260f, 0.023805f, 0.004831f, 0.001136f, 0.038406f, 0.039740f, 0.020066f, 0.017632f, -0.042870f, -0.116740f, 0.040122f, 0.215693f, 0.168860f, 0.162459f, 0.051334f, -0.150487f, -0.090975f, -0.133418f, -0.134639f, -0.122000f, -0.043257f, 0.066024f, 0.084289f, 0.133686f, 0.118993f, 0.072118f, 0.011405f, 0.011761f, -0.058636f, -0.091607f, -0.131792f, -0.050503f, -0.036363f, 0.011609f, -0.008207f, 0.066274f, 0.044070f, 0.018805f, 0.088035f, 0.049551f, 0.037148f, -0.008217f, 0.032454f, -0.060917f, + -0.046489f, -0.038280f, -0.044968f, -0.058654f, -0.035934f, -0.023958f, -0.059982f, -0.041726f, 0.014535f, 0.085580f, 0.082533f, 0.093799f, 0.073465f, 0.107263f, 0.017569f, 0.026242f, -0.073531f, -0.055287f, -0.047209f, -0.110420f, -0.109346f, -0.099143f, -0.047254f, -0.059347f, 0.011764f, 0.039093f, 0.058877f, 0.118272f, 0.117740f, 0.110520f, 0.100756f, 0.085361f, 0.017235f, -0.057918f, -0.087980f, -0.159559f, -0.133794f, -0.103123f, -0.131920f, -0.067991f, -0.018778f, 0.005163f, 0.071053f, -0.011663f}, + {0.021736f, -0.007451f, 0.005663f, -0.000828f, -0.000604f, -0.006723f, 0.003772f, 0.009929f, -0.005600f, -0.002551f, 0.001406f, -0.004267f, -0.006998f, 0.001082f, 0.000146f, -0.006679f, -0.011418f, 0.009130f, -0.004750f, 0.015686f, -0.000866f, 0.008794f, -0.012468f, -0.000567f, 0.004503f, -0.002774f, -0.006592f, -0.002739f, -0.004715f, -0.000813f, -0.003901f, 0.000418f, -0.000817f, -0.005793f, 0.003605f, -0.007730f, 0.009132f, -0.003228f, -0.002527f, -0.001496f, 0.010825f, 0.010146f, 0.000393f, 0.007538f, 0.004836f, -0.002385f, -0.002277f, 0.010106f, -0.005035f, -0.011644f, -0.000156f, -0.002499f, 0.012622f, 0.000651f, 0.001579f, -0.007943f, 0.000022f, -0.004172f, -0.004397f, -0.002159f, -0.004740f, 0.003444f, -0.006852f, -0.003069f, 0.001748f, -0.002541f, -0.007346f, -0.010273f, -0.000200f, 0.005892f, 0.003096f, 0.004963f, -0.000100f, -0.001260f, 0.001842f, -0.000646f, -0.006901f, -0.007122f, -0.012136f, 0.004529f, -0.006268f, -0.010683f, -0.007918f, 0.005802f, -0.014980f, -0.007288f, -0.018175f, 0.006728f, 0.007154f, 0.010602f, 0.004760f, -0.005488f, 0.012590f, -0.008443f, 0.002001f, 0.000914f, + -0.002590f, -0.008961f, -0.005601f, -0.009921f, -0.000277f, -0.003855f, 0.005217f, 0.004542f, -0.005733f, -0.000982f, -0.001853f, -0.009062f, -0.001111f, -0.001530f, 0.003593f, 0.000448f, 0.008045f, -0.002501f, 0.010363f, -0.004186f, -0.000588f, 0.002395f, -0.008833f, 0.006235f, -0.003230f, -0.002506f, 0.000162f, -0.001593f, 0.003480f, -0.016377f, 0.007089f, 0.010806f, 0.000645f, 0.006386f, 0.002314f, -0.006943f, -0.001863f, -0.007595f, 0.010240f, -0.002393f, -0.007845f, 0.007237f, -0.011142f, 0.000957f, 0.002987f, -0.011105f, 0.000393f, -0.002266f, -0.005427f, 0.004393f, -0.000157f, 0.001394f, -0.006497f, -0.003276f, -0.019570f, -0.002210f, 0.003504f, -0.026714f, -0.015807f, 0.002798f, -0.008464f, 0.001493f, -0.008733f, -0.015402f, -0.009989f, 0.017175f, 0.010253f, -0.002824f, 0.011909f, 0.002624f, 0.003067f, 0.003157f, -0.005494f, -0.001679f, 0.009730f, -0.007805f, 0.004532f, 0.006830f, -0.007232f, -0.011892f, 0.005609f, -0.009740f, 0.001294f, 0.005396f, 0.014361f, -0.003300f, -0.006574f, -0.006074f, 0.002450f, 0.007576f, -0.010182f, -0.000194f, 0.008858f, 0.003277f, 0.001185f, -0.000672f, + -0.000512f, 0.011055f, -0.000121f, 0.010121f, 0.007036f, -0.002694f, 0.007027f, -0.002454f, -0.000259f, -0.001141f, -0.018292f, 0.006363f, 0.010934f, -0.006199f, -0.003071f, 0.002477f, 0.003302f, 0.002901f, 0.002106f, -0.001109f, -0.001766f, 0.000535f, -0.004175f, 0.012678f, -0.005174f, 0.001386f, 0.007534f, 0.005441f, -0.003929f, 0.004931f, 0.002282f, 0.003159f, 0.007742f, 0.006030f, -0.008500f, 0.009379f, 0.011405f, -0.004071f, -0.010140f, 0.013075f, 0.009194f, 0.020439f, -0.003067f, 0.001861f, 0.006767f, -0.010489f, -0.001704f, 0.003662f, -0.003782f, -0.014112f, -0.000416f, 0.001113f, 0.009627f, -0.011470f, -0.026711f, -0.022267f, -0.013075f, 0.004847f, 0.013311f, -0.013351f, 0.007723f, -0.006739f, 0.010391f, 0.007365f, 0.007187f, 0.011564f, 0.007093f, -0.009749f, -0.008198f, 0.001232f, 0.006843f, -0.000889f, 0.001010f, 0.016307f, 0.000344f, 0.002499f, 0.008805f, 0.008364f, 0.001954f, -0.000178f, 0.021170f, -0.001885f, -0.007236f, -0.002784f, 0.005234f, 0.005564f, -0.003450f, 0.010629f, 0.002756f, 0.005468f, -0.007349f, -0.007558f, -0.002088f, -0.005194f, 0.003346f, -0.004258f, + 0.012785f, -0.014558f, -0.011736f, 0.014462f, -0.000809f, -0.001312f, -0.016718f, 0.004717f, -0.007610f, 0.008664f, -0.006313f, -0.020330f, 0.000217f, 0.008998f, -0.007039f, 0.011796f, -0.006202f, 0.004729f, 0.032664f, 0.007370f, 0.008911f, 0.003450f, -0.007125f, 0.015292f, -0.007074f, -0.004657f, 0.020070f, -0.001742f, 0.016202f, -0.001930f, -0.017889f, 0.006184f, -0.005862f, 0.019819f, 0.010881f, -0.001649f, -0.017645f, -0.012815f, 0.016930f, 0.019438f, -0.022641f, 0.011266f, 0.009561f, 0.006673f, -0.001147f, 0.001980f, 0.002284f, -0.001998f, 0.023134f, -0.001291f, -0.003512f, -0.006534f, -0.007233f, -0.010003f, -0.002798f, -0.000785f, -0.012686f, -0.004941f, 0.003868f, -0.009413f, 0.000971f, 0.000244f, 0.014102f, -0.005397f, 0.000932f, 0.006038f, 0.001068f, 0.012713f, 0.006435f, 0.013219f, 0.007282f, 0.003793f, -0.013691f, 0.001161f, -0.009943f, -0.010279f, 0.003084f, 0.013422f, 0.000226f, 0.011448f, -0.004142f, -0.009403f, -0.001179f, 0.000090f, 0.004484f, 0.007609f, -0.002655f, -0.000678f, -0.003201f, 0.003840f, 0.004557f, -0.012554f, 0.003994f, 0.001187f, 0.009281f, 0.006248f, + 0.007478f, 0.020666f, 0.011017f, -0.009227f, -0.007984f, -0.022625f, -0.001369f, -0.000712f, -0.011894f, 0.004321f, 0.018058f, 0.001938f, -0.014133f, 0.012908f, 0.012545f, -0.001581f, 0.005021f, 0.012389f, 0.003010f, -0.011832f, -0.001788f, 0.026541f, 0.013194f, 0.002432f, -0.017764f, -0.006711f, 0.016117f, 0.005176f, -0.002484f, 0.008697f, 0.008056f, 0.008094f, -0.000169f, 0.016223f, -0.000268f, -0.002619f, 0.004068f, -0.008793f, -0.011008f, -0.001085f, 0.001666f, 0.005632f, 0.003215f, -0.010747f, 0.010092f, 0.017444f, 0.009050f, -0.001177f, 0.013175f, -0.016016f, 0.008443f, -0.009887f, 0.009280f, -0.003387f, -0.011332f, -0.001458f, -0.014690f, -0.024438f, -0.008950f, -0.010386f, -0.001559f, -0.001266f, -0.012731f, 0.001087f, -0.004252f, 0.005667f, 0.004199f, 0.006762f, -0.001871f, 0.001410f, -0.012352f, -0.000420f, 0.001414f, 0.013077f, -0.006461f, -0.022667f, -0.013816f, 0.030375f, -0.006087f, -0.007513f, 0.002544f, -0.001781f, 0.034040f, -0.010427f, -0.017243f, -0.000247f, -0.016994f, 0.003736f, 0.014888f, 0.014521f, 0.005561f, -0.031603f, 0.026180f, -0.020689f, 0.011401f, -0.014359f, + -0.009617f, -0.008337f, 0.013482f, 0.012966f, -0.019659f, 0.000938f, 0.009750f, -0.007033f, 0.004924f, 0.005321f, -0.006556f, 0.000258f, -0.015997f, -0.012016f, -0.025139f, 0.014708f, -0.002749f, 0.025521f, -0.011307f, 0.004986f, 0.018438f, -0.005086f, -0.004248f, -0.008469f, 0.021045f, 0.013926f, -0.023633f, 0.006295f, -0.012899f, -0.005424f, -0.004340f, -0.014596f, 0.009425f, 0.003637f, 0.022857f, 0.014486f, -0.026049f, -0.005272f, -0.010440f, 0.015102f, 0.006881f, 0.000525f, -0.014481f, 0.001514f, -0.000146f, 0.012491f, -0.000579f, 0.000761f, -0.016461f, -0.001346f, 0.015064f, -0.012891f, 0.004482f, -0.004587f, -0.000262f, -0.009977f, 0.001060f, 0.003383f, 0.007534f, -0.008347f, 0.000510f, -0.017618f, -0.002278f, -0.020343f, 0.003090f, -0.005128f, 0.011560f, -0.000874f, 0.009778f, -0.013984f, -0.026336f, 0.005481f, 0.017484f, 0.002209f, -0.002288f, 0.013642f, 0.009078f, -0.021552f, -0.000536f, -0.008216f, 0.026921f, -0.001357f, 0.002936f, 0.001966f, 0.000039f, -0.001029f, -0.009989f, 0.021304f, -0.002099f, -0.030687f, -0.006011f, 0.018243f, -0.012206f, 0.002837f, -0.000810f, 0.002208f, + -0.004159f, 0.002664f, -0.005968f, 0.006987f, -0.012070f, 0.010692f, 0.015045f, -0.012447f, -0.003508f, -0.007529f, -0.021663f, 0.008110f, -0.015528f, 0.012701f, -0.013726f, -0.023346f, -0.006760f, 0.013132f, -0.004775f, -0.008699f, 0.008557f, 0.012022f, 0.006640f, 0.013173f, 0.023027f, 0.018316f, -0.001805f, 0.002915f, 0.002647f, -0.013578f, 0.001878f, -0.014352f, -0.014861f, 0.006430f, -0.011141f, -0.030994f, -0.024035f, 0.013609f, 0.027908f, -0.000988f, -0.000494f, 0.004144f, -0.011792f, -0.007217f, -0.029885f, -0.017463f, -0.007651f, -0.001239f, -0.021403f, 0.031315f, 0.007575f, 0.017017f, -0.019382f, -0.025461f, -0.017259f, -0.008111f, 0.006122f, -0.028764f, -0.011239f, 0.011981f, -0.004277f, -0.034778f, -0.010222f, 0.003656f, 0.001643f, 0.020104f, 0.008369f, -0.007501f, -0.014735f, 0.019087f, -0.010252f, -0.002061f, 0.016432f, 0.003565f, -0.015006f, -0.009310f, 0.000146f, -0.028302f, 0.008352f, 0.020433f, -0.007804f, -0.012652f, 0.004618f, -0.014760f, -0.003582f, 0.001872f, -0.007265f, -0.007648f, 0.008845f, -0.011235f, -0.020206f, 0.009918f, -0.010759f, -0.017212f, -0.020642f, -0.012111f, + 0.004065f, -0.009865f, 0.005631f, 0.026642f, 0.017568f, -0.004286f, 0.028389f, 0.025757f, -0.009295f, 0.002795f, 0.009892f, -0.014683f, -0.006133f, -0.029910f, 0.006633f, -0.008755f, -0.018673f, 0.048205f, -0.001499f, 0.029418f, -0.014568f, -0.042911f, 0.012586f, 0.003325f, -0.001238f, -0.020280f, -0.001503f, -0.013458f, 0.034166f, 0.024384f, 0.022526f, 0.015839f, -0.025954f, -0.000435f, 0.004113f, 0.023199f, -0.039633f, -0.004807f, -0.009326f, -0.011967f, 0.006528f, -0.013448f, 0.005660f, 0.008719f, 0.007158f, 0.006938f, 0.009820f, -0.002981f, -0.003422f, -0.019689f, -0.004116f, -0.003144f, 0.019698f, -0.000151f, -0.017001f, -0.004261f, 0.021394f, -0.002549f, 0.012676f, 0.015483f, -0.010755f, -0.006779f, -0.025298f, -0.015099f, 0.051127f, 0.013263f, 0.023051f, 0.012050f, 0.003468f, 0.001869f, -0.031528f, 0.018979f, 0.003521f, 0.005568f, 0.016865f, 0.017848f, 0.028268f, -0.031988f, -0.012765f, -0.017752f, -0.001838f, 0.004428f, -0.003877f, -0.009002f, -0.004980f, -0.026914f, -0.033560f, -0.022068f, -0.031605f, -0.004417f, -0.020897f, -0.035846f, -0.015056f, 0.065211f, 0.014800f, -0.009497f, + -0.013542f, 0.001994f, -0.020966f, -0.041059f, 0.030089f, -0.000023f, 0.019330f, -0.014845f, 0.013949f, 0.033292f, -0.003413f, 0.003496f, -0.008554f, 0.028887f, 0.024421f, 0.009218f, -0.039665f, 0.002516f, 0.005650f, 0.024041f, 0.035363f, -0.010911f, -0.007466f, -0.005159f, 0.009326f, 0.012190f, 0.010338f, -0.018519f, 0.007991f, -0.021310f, 0.015619f, 0.020521f, -0.010352f, -0.021648f, 0.012989f, -0.023550f, -0.021106f, -0.001682f, 0.005816f, 0.028840f, 0.003349f, -0.005009f, 0.025083f, -0.005707f, 0.022520f, 0.040921f, 0.020861f, -0.000701f, -0.026851f, -0.003815f, -0.015507f, -0.013839f, 0.026746f, 0.008985f, -0.027096f, -0.001957f, -0.020653f, -0.007042f, 0.035707f, 0.014386f, 0.005427f, 0.013035f, 0.021826f, 0.008641f, -0.028098f, 0.011978f, 0.024812f, 0.004948f, -0.018354f, 0.004188f, 0.004091f, -0.000829f, -0.012665f, 0.016036f, 0.010462f, 0.009482f, -0.015875f, -0.000761f, -0.020259f, -0.047607f, 0.016486f, -0.018923f, 0.005311f, 0.001759f, 0.033470f, -0.022940f, -0.020276f, -0.008471f, -0.009209f, -0.012221f, 0.024812f, -0.021787f, -0.030715f, 0.009313f, -0.057508f, 0.001770f, + -0.010645f, -0.024333f, 0.031294f, -0.001925f, -0.001540f, 0.013113f, -0.011966f, 0.009855f, -0.002742f, -0.034438f, -0.037192f, -0.000375f, 0.008421f, 0.022028f, 0.011184f, -0.002562f, -0.003374f, -0.021755f, -0.009608f, 0.021639f, -0.033301f, 0.046788f, 0.028694f, 0.006060f, 0.035615f, -0.023450f, -0.008941f, -0.021559f, -0.020604f, -0.009802f, 0.017071f, 0.043831f, 0.001747f, -0.023521f, -0.002351f, 0.001426f, -0.000791f, -0.003252f, -0.012187f, 0.010907f, 0.013139f, 0.028639f, 0.001920f, 0.032300f, 0.020289f, 0.007491f, 0.002552f, 0.005045f, -0.046347f, 0.023999f, -0.001174f, -0.032716f, 0.028232f, -0.003668f, 0.038478f, -0.016440f, -0.015216f, -0.087327f, -0.008783f, 0.054826f, -0.011615f, 0.003545f, 0.044352f, -0.008717f, -0.001288f, 0.007696f, 0.010525f, -0.011802f, 0.010523f, -0.002643f, -0.017176f, 0.017078f, 0.015829f, -0.049914f, 0.004453f, -0.044126f, -0.002946f, -0.021712f, -0.027885f, -0.003366f, -0.009530f, -0.023023f, 0.011127f, 0.006711f, 0.014478f, 0.024513f, -0.033247f, 0.042446f, 0.001165f, -0.034557f, 0.001488f, -0.022946f, -0.014557f, -0.024812f, -0.026746f, -0.007932f, + 0.024844f, -0.019709f, 0.011027f, 0.029843f, -0.017569f, -0.025272f, -0.027843f, -0.035198f, -0.043127f, -0.020955f, -0.013409f, 0.006825f, -0.007878f, 0.015181f, 0.006258f, -0.020762f, -0.003451f, 0.031774f, 0.014233f, -0.036716f, 0.014344f, 0.001346f, -0.013215f, -0.033244f, 0.023730f, -0.008621f, 0.033359f, 0.050063f, -0.000979f, 0.048293f, -0.025762f, 0.030948f, -0.021071f, 0.033496f, 0.030634f, 0.011226f, -0.040260f, 0.032071f, -0.078827f, -0.007090f, -0.005663f, -0.009109f, 0.009507f, -0.048876f, 0.005195f, -0.011619f, -0.002086f, 0.018694f, 0.010180f, 0.022106f, -0.017288f, 0.014834f, -0.007377f, -0.043971f, -0.014962f, -0.033049f, -0.017223f, 0.017177f, -0.034486f, 0.001857f, -0.011840f, -0.030230f, -0.003408f, 0.023712f, -0.034429f, -0.037525f, 0.015477f, 0.017602f, 0.000152f, -0.019492f, 0.020588f, 0.017176f, 0.026215f, 0.018229f, 0.010088f, 0.026105f, 0.036062f, -0.022249f, 0.006293f, -0.020111f, 0.044860f, -0.007191f, -0.029398f, 0.032863f, 0.016946f, 0.004984f, -0.016531f, -0.026984f, 0.006191f, 0.009932f, 0.014755f, -0.005328f, -0.018395f, 0.010319f, -0.021581f, -0.003662f, + -0.021329f, 0.063352f, 0.011035f, -0.023979f, 0.056192f, -0.011402f, 0.017542f, -0.019073f, 0.028448f, 0.036899f, -0.025340f, 0.035159f, 0.042555f, 0.050908f, 0.042441f, 0.001342f, 0.029447f, 0.082295f, 0.022923f, -0.015341f, -0.011012f, 0.018258f, 0.006750f, 0.007142f, -0.000786f, -0.034455f, 0.029237f, -0.077225f, 0.009588f, 0.015619f, -0.002112f, -0.015005f, -0.027933f, -0.014489f, 0.004737f, 0.021497f, 0.035760f, -0.021496f, -0.043090f, -0.036875f, -0.003888f, 0.000278f, -0.024942f, 0.052691f, -0.023904f, -0.017425f, 0.023307f, -0.008547f, 0.005086f, -0.005795f, 0.047157f, 0.006736f, -0.045200f, 0.017372f, 0.006833f, 0.031070f, -0.010496f, 0.002572f, -0.018247f, 0.015023f, 0.007847f, 0.039485f, -0.009094f, 0.017387f, 0.019782f, -0.025157f, -0.026313f, 0.001164f, 0.024941f, -0.048185f, -0.055805f, -0.017205f, -0.022857f, -0.003677f, -0.008099f, 0.004978f, 0.012593f, -0.011952f, 0.001571f, -0.065360f, -0.055676f, 0.043303f, 0.045609f, -0.056609f, -0.044437f, -0.054465f, -0.030012f, -0.022764f, 0.025759f, -0.029839f, -0.054963f, 0.001391f, -0.000967f, -0.029456f, -0.006768f, -0.047205f, + -0.004928f, -0.012034f, 0.014688f, -0.022825f, -0.005296f, -0.073073f, 0.064616f, 0.040199f, -0.006291f, 0.086763f, -0.007979f, -0.049065f, -0.003816f, 0.018675f, -0.029127f, -0.040282f, -0.007655f, -0.027878f, -0.000682f, 0.006306f, -0.039731f, 0.057942f, 0.002535f, 0.005105f, -0.036624f, -0.012034f, 0.004563f, -0.012005f, 0.010041f, 0.012029f, 0.049176f, 0.007199f, -0.001923f, 0.037705f, 0.032989f, -0.013150f, 0.019704f, -0.026563f, 0.007603f, 0.020144f, 0.021993f, 0.053039f, -0.053699f, 0.031368f, 0.101495f, -0.001415f, 0.017275f, 0.032221f, 0.004717f, 0.004450f, 0.017119f, 0.009994f, -0.032789f, -0.042882f, -0.013615f, 0.029375f, 0.010712f, -0.044858f, -0.021401f, -0.005206f, -0.018695f, 0.033439f, 0.004932f, 0.024652f, -0.061905f, -0.043844f, 0.020573f, 0.038730f, 0.029099f, 0.012002f, 0.063336f, 0.028866f, -0.021978f, 0.033879f, -0.026974f, -0.016527f, 0.006600f, 0.027623f, -0.081753f, -0.000378f, 0.001744f, -0.004807f, -0.008303f, 0.037176f, 0.005508f, -0.024590f, -0.039669f, 0.040686f, -0.035371f, -0.000920f, 0.029916f, 0.020177f, -0.027174f, -0.009765f, -0.045290f, -0.001947f, + 0.016411f, 0.015048f, 0.022148f, 0.003489f, -0.028404f, -0.040461f, 0.034865f, 0.015031f, 0.018867f, 0.004847f, 0.019215f, 0.003509f, 0.026641f, -0.043243f, -0.067870f, 0.018492f, -0.007493f, -0.016246f, 0.042939f, -0.007981f, -0.017707f, 0.034084f, 0.036555f, 0.026594f, 0.001094f, -0.018601f, -0.026808f, -0.008516f, -0.036535f, 0.094496f, -0.004081f, 0.033857f, 0.011522f, -0.031734f, 0.030257f, -0.012075f, -0.025684f, 0.029872f, 0.028339f, -0.051817f, 0.041481f, -0.004857f, 0.055890f, -0.050086f, -0.032886f, 0.053011f, 0.004025f, -0.039812f, 0.049319f, -0.013083f, 0.080204f, -0.027534f, -0.016740f, -0.039447f, 0.037576f, 0.011385f, -0.023926f, 0.022589f, -0.025399f, 0.013635f, -0.012398f, -0.021933f, 0.060206f, -0.012084f, 0.040106f, -0.063840f, -0.013674f, 0.000623f, -0.080808f, -0.015145f, 0.009334f, 0.040865f, -0.021439f, -0.016268f, -0.000341f, -0.003860f, 0.053220f, -0.003028f, -0.029838f, 0.060871f, -0.009318f, -0.000746f, 0.009018f, -0.021114f, 0.048618f, 0.005677f, -0.012379f, 0.026624f, 0.018751f, -0.025265f, -0.011522f, -0.010419f, 0.037399f, -0.076407f, -0.003404f, -0.012820f, + -0.029892f, 0.016006f, -0.030369f, 0.048445f, -0.014125f, -0.054246f, -0.007999f, 0.088937f, -0.054486f, 0.040475f, -0.060526f, -0.014119f, 0.055959f, 0.045210f, -0.033560f, 0.017520f, -0.040488f, -0.047448f, 0.008407f, -0.019246f, 0.019557f, 0.009234f, -0.005947f, 0.011498f, -0.076150f, -0.025806f, -0.040182f, -0.050800f, 0.022193f, -0.017401f, -0.018008f, -0.026824f, -0.055632f, -0.041042f, 0.030679f, -0.004135f, 0.102916f, 0.021083f, 0.003724f, 0.038441f, 0.043307f, 0.018551f, 0.040927f, -0.023790f, -0.032456f, 0.036513f, -0.057208f, -0.005579f, -0.012347f, 0.004416f, 0.039090f, -0.024893f, 0.043498f, 0.020089f, 0.009447f, 0.014411f, -0.072562f, 0.050208f, 0.008642f, -0.049327f, 0.019379f, -0.052352f, 0.008761f, 0.073528f, -0.009306f, -0.041194f, -0.045738f, 0.020932f, 0.032481f, 0.028047f, 0.013875f, -0.045893f, -0.032745f, -0.013006f, -0.008956f, 0.063385f, -0.039062f, -0.021526f, 0.091690f, -0.049015f, -0.003888f, 0.038384f, 0.000272f, 0.040419f, -0.005435f, -0.028658f, -0.020486f, -0.053787f, 0.028938f, 0.042382f, -0.059544f, 0.092142f, 0.030213f, -0.064754f, -0.061121f, -0.055774f, + -0.069844f, -0.053753f, 0.003545f, 0.031545f, 0.006212f, -0.043689f, -0.017185f, 0.035789f, 0.000001f, -0.025092f, 0.033645f, -0.058567f, 0.005123f, -0.008531f, -0.057813f, -0.047613f, 0.010968f, -0.012381f, 0.043521f, -0.063025f, -0.007255f, -0.002575f, 0.043651f, -0.109421f, -0.101385f, -0.087696f, -0.056848f, 0.023051f, -0.024096f, 0.113021f, 0.029684f, -0.011936f, -0.026048f, -0.014139f, 0.031791f, -0.073306f, 0.085795f, 0.113916f, 0.045008f, -0.006696f, 0.089696f, -0.028344f, 0.054124f, 0.103603f, -0.019167f, 0.005949f, 0.019041f, 0.137858f, -0.035251f, -0.008376f, 0.081371f, 0.031364f, 0.025854f, -0.022168f, -0.084332f, 0.006211f, -0.066983f, 0.032184f, -0.082926f, -0.095920f, -0.001782f, -0.004947f, -0.068018f, -0.002932f, -0.033500f, -0.068317f, -0.055985f, -0.089281f, -0.005191f, 0.092777f, -0.030315f, -0.016662f, -0.085832f, -0.044370f, -0.032399f, -0.027923f, 0.027384f, -0.019485f, 0.151616f, -0.034791f, -0.003685f, -0.054280f, 0.113786f, 0.096694f, -0.069003f, 0.079191f, -0.029072f, -0.109934f, -0.022327f, -0.008223f, 0.021147f, -0.023176f, -0.028112f, -0.010794f, -0.048192f, 0.016907f, + 0.053976f, -0.062404f, -0.033640f, 0.045504f, 0.195718f, 0.021991f, -0.120813f, -0.030864f, -0.041812f, 0.008919f, 0.062217f, 0.108896f, 0.032799f, -0.091863f, -0.000042f, 0.063380f, 0.015631f, 0.001449f, -0.000872f, 0.016750f, -0.006652f, -0.010822f, 0.077662f, 0.047711f, 0.044514f, -0.063540f, -0.039070f, 0.044342f, 0.019560f, 0.026603f, -0.019411f, 0.009008f, 0.087023f, 0.003089f, 0.074408f, 0.038696f, 0.042201f, 0.071028f, 0.013602f, -0.035434f, 0.012257f, -0.040652f, 0.014521f, 0.031322f, 0.011607f, 0.115871f, -0.033680f, -0.071260f, -0.066197f, 0.090279f, 0.045399f, 0.049346f, 0.037132f, -0.047713f, -0.057840f, -0.035674f, 0.003569f, 0.022224f, -0.007722f, 0.034322f, 0.064808f, -0.000524f, 0.049248f, 0.042117f, -0.051547f, -0.007748f, 0.024918f, -0.023489f, -0.016190f, -0.024624f, -0.087777f, -0.011820f, 0.052711f, 0.008512f, 0.096725f, 0.061398f, -0.028442f, 0.033559f, -0.006893f, -0.051473f, 0.009275f, 0.149167f, 0.043340f, 0.060140f, -0.028262f, -0.144427f, -0.067303f, -0.107611f, -0.031120f, 0.064568f, 0.162414f, 0.066104f, 0.021125f, -0.080429f, -0.067808f, 0.045093f, + 0.082343f, 0.034112f, 0.099214f, -0.009266f, -0.059644f, -0.097197f, -0.041662f, -0.019607f, 0.074297f, 0.003198f, 0.044126f, 0.031060f, 0.009034f, 0.089475f, 0.069548f, -0.013290f, -0.006485f, -0.093919f, -0.018854f, -0.008113f, 0.004248f, 0.043910f, 0.092203f, 0.048426f, 0.045356f, 0.077614f, 0.050811f, -0.094567f, -0.068484f, -0.029199f, -0.053419f, 0.051081f, 0.041364f, 0.078875f, 0.068874f, 0.068568f, 0.023845f, 0.005173f, -0.061993f, -0.074596f, -0.061170f, 0.012553f, 0.031716f, -0.009964f, -0.008600f, 0.126106f, 0.033792f, -0.020696f, -0.014456f, 0.081150f, -0.102259f, 0.007183f, -0.193879f, -0.058265f, 0.040972f, -0.085427f, 0.051180f, 0.009964f, -0.018427f, 0.070723f, 0.006461f, -0.215885f, -0.138571f, -0.067028f, 0.063226f, 0.026607f, 0.301326f, 0.331621f, 0.196303f, 0.367965f, 0.293745f, 0.320929f, 0.216982f, 0.274604f, 0.216275f, 0.018192f, -0.095957f, -0.128703f, -0.132181f, -0.272903f, -0.340051f, -0.345086f, -0.244587f, -0.179727f, -0.067955f, 0.035206f, -0.090741f, 0.085681f, -0.116012f, -0.022323f, 0.006158f, -0.013848f, 0.047338f, -0.090859f, 0.181725f, 0.057782f, + 0.169052f, 0.127570f, 0.077654f, 0.072887f, 0.106352f, 0.089931f, 0.110558f, 0.233137f, 0.213118f, 0.188634f, 0.211324f, 0.272601f, 0.241325f, 0.243284f, 0.396005f, 0.176707f, 0.292413f, 0.384137f, 0.269334f, 0.357979f, 0.205461f, 0.276388f, 0.217479f, 0.268461f, 0.272192f, 0.154216f, 0.201091f, 0.187224f, 0.198291f, 0.215923f, 0.108801f, 0.073401f, -0.055281f, 0.058977f, -0.091037f, -0.035997f, -0.166545f, -0.164002f, -0.189144f, -0.484562f, -0.414487f, -0.326787f, -0.150217f, -0.025114f} + }, + { + {0.003329f, -0.000751f, 0.002711f, -0.000613f, 0.011412f, -0.001706f, -0.000436f, 0.013916f, -0.003339f, 0.015501f, 0.002817f, -0.006190f, 0.009349f, 0.004433f, -0.006836f, 0.002590f, 0.003705f, 0.001107f, 0.005971f, -0.001553f, 0.004801f, -0.000001f, -0.006675f, 0.002886f, 0.007366f, 0.004252f, 0.004292f, -0.000852f, 0.000624f, 0.000042f, 0.002671f, 0.005438f, -0.012971f, -0.006300f, 0.000300f, 0.003121f, 0.001216f, -0.005038f, 0.009917f, 0.003295f, -0.002219f, 0.005319f, 0.001920f, 0.007357f, 0.002130f, -0.002867f, -0.005623f, 0.005949f, 0.000399f, -0.000105f, -0.003033f, 0.001677f, -0.005291f, -0.003670f, 0.002461f, 0.005326f, -0.002556f, 0.001182f, -0.000052f, -0.000745f, 0.009833f, 0.003698f, -0.001169f, 0.001571f, 0.004297f, 0.000418f, 0.004399f, -0.005624f, 0.005375f, 0.005961f, -0.002994f, -0.009970f, -0.005228f, -0.002732f, 0.010318f, 0.000113f, -0.003725f, -0.000961f, -0.009087f, -0.006394f, 0.004143f, 0.000257f, -0.005703f, 0.007067f, 0.004872f, -0.001672f, 0.000492f, -0.001095f, 0.005829f, -0.008143f, 0.003058f, 0.005875f, 0.005345f, -0.011675f, -0.008046f, -0.005874f, + 0.007788f, 0.001729f, 0.002564f, -0.003367f, 0.008296f, 0.002946f, -0.002026f, 0.000054f, -0.002333f, 0.001450f, 0.003114f, -0.002015f, -0.002364f, -0.007131f, 0.007404f, 0.012123f, 0.001464f, 0.007623f, -0.001447f, 0.001369f, 0.002810f, 0.003188f, -0.009344f, 0.000437f, -0.009764f, -0.002470f, -0.001392f, 0.002833f, -0.004933f, -0.000409f, 0.002125f, 0.000724f, -0.005702f, -0.000043f, 0.000634f, 0.004379f, -0.006058f, -0.007878f, -0.001027f, 0.010000f, 0.016525f, -0.000276f, 0.002722f, 0.000829f, -0.003506f, -0.010257f, -0.002461f, 0.006592f, -0.003052f, 0.006566f, 0.002879f, 0.006714f, -0.000012f, 0.002506f, 0.004474f, -0.010143f, -0.002580f, -0.009612f, 0.005453f, 0.000850f, -0.004765f, 0.021164f, -0.008427f, -0.014807f, 0.000902f, 0.007157f, -0.001515f, -0.011098f, -0.003469f, -0.004714f, -0.002105f, -0.005165f, -0.002022f, 0.007962f, -0.000809f, -0.004885f, 0.008648f, 0.001493f, 0.008388f, -0.002126f, -0.002407f, 0.003507f, -0.000060f, 0.004052f, -0.001915f, 0.008342f, 0.013060f, -0.003517f, -0.009285f, -0.006421f, 0.005199f, 0.000140f, -0.020886f, -0.001803f, -0.008522f, -0.002905f, + 0.009736f, -0.006888f, -0.005684f, 0.007082f, -0.004894f, -0.000862f, 0.008870f, 0.003311f, -0.007660f, 0.003382f, -0.005637f, -0.012038f, 0.003477f, 0.004872f, -0.009652f, -0.005243f, -0.003117f, -0.003791f, -0.000562f, 0.004031f, 0.005790f, 0.009604f, 0.010115f, -0.002498f, 0.000484f, -0.004180f, 0.003917f, 0.002939f, -0.003164f, 0.004448f, 0.005883f, -0.006598f, -0.017018f, -0.008422f, 0.005027f, 0.007614f, 0.002751f, 0.008243f, -0.007101f, 0.008616f, 0.010238f, -0.002798f, 0.011344f, -0.001450f, 0.008304f, -0.003917f, 0.000071f, -0.003505f, 0.010659f, 0.004345f, -0.000641f, 0.009801f, -0.005371f, -0.004003f, 0.006884f, -0.016752f, -0.003153f, 0.001011f, -0.003812f, -0.014929f, -0.009405f, 0.006309f, -0.006123f, -0.003841f, -0.000032f, 0.011815f, -0.003077f, -0.008160f, -0.000911f, 0.003079f, 0.006372f, -0.000960f, -0.010930f, -0.006824f, -0.002246f, -0.005422f, 0.001476f, -0.009244f, 0.004300f, -0.008704f, -0.013137f, 0.000422f, 0.004174f, 0.005217f, -0.004435f, -0.002955f, -0.008757f, 0.010868f, 0.005946f, 0.001488f, -0.000247f, -0.000348f, -0.004062f, -0.002041f, 0.003312f, 0.004574f, + 0.016058f, -0.001944f, 0.003771f, 0.000965f, -0.000840f, -0.008183f, -0.006420f, 0.010968f, -0.005008f, 0.000888f, 0.002749f, 0.001339f, 0.004049f, 0.005079f, 0.004470f, 0.010808f, -0.007131f, -0.010553f, -0.008582f, 0.005481f, 0.011896f, -0.002108f, 0.009132f, -0.007978f, -0.009799f, 0.008272f, -0.004036f, 0.000986f, 0.003116f, 0.010363f, 0.003883f, 0.016378f, -0.006948f, -0.008449f, 0.003914f, -0.004581f, -0.004367f, 0.009406f, -0.014163f, -0.008599f, 0.001623f, -0.002516f, 0.006734f, -0.004594f, 0.002024f, 0.011811f, -0.010481f, 0.008319f, -0.006206f, 0.005515f, -0.005775f, -0.001382f, -0.000665f, 0.012302f, 0.002585f, 0.000806f, -0.008377f, 0.000831f, -0.010012f, 0.004323f, 0.002984f, -0.006508f, 0.000277f, -0.002413f, 0.018489f, 0.002913f, 0.001658f, -0.015124f, -0.008630f, -0.012651f, 0.010869f, -0.006158f, -0.000136f, 0.006015f, 0.023625f, 0.016839f, -0.005806f, -0.013500f, -0.005169f, -0.011612f, 0.013744f, -0.001805f, -0.002789f, -0.004987f, -0.002936f, -0.000395f, -0.005063f, -0.002472f, -0.009443f, 0.006899f, -0.009754f, -0.016273f, 0.016626f, 0.008102f, -0.018223f, 0.018251f, + -0.003238f, -0.000629f, -0.025445f, 0.015347f, 0.009590f, -0.019862f, 0.005677f, -0.002925f, 0.007333f, 0.002201f, 0.008510f, 0.006105f, 0.001922f, -0.009007f, 0.000550f, 0.003901f, -0.012794f, -0.004887f, -0.015032f, -0.002095f, -0.009456f, -0.004470f, 0.001375f, -0.011099f, -0.004534f, -0.016559f, 0.006145f, 0.002109f, 0.001199f, 0.001911f, -0.007560f, -0.014374f, -0.004859f, 0.005609f, -0.002624f, -0.000880f, 0.015271f, -0.022576f, 0.009455f, 0.012114f, -0.001881f, 0.001107f, -0.004629f, -0.001462f, -0.007584f, -0.011009f, -0.007853f, -0.008623f, -0.006069f, 0.005995f, 0.003094f, 0.005343f, 0.007727f, -0.001613f, -0.004112f, 0.011255f, 0.021195f, 0.015052f, -0.000182f, -0.017886f, 0.005164f, -0.002727f, 0.002987f, 0.019009f, 0.000403f, 0.019075f, 0.017984f, 0.027706f, 0.006292f, -0.004163f, -0.001936f, 0.008981f, -0.003464f, 0.026882f, -0.003399f, -0.003357f, 0.032614f, 0.000888f, 0.016192f, -0.005555f, -0.000142f, -0.000747f, 0.002133f, -0.003536f, 0.001707f, 0.000206f, -0.001548f, -0.017288f, -0.002322f, -0.003540f, -0.003824f, -0.006741f, 0.010942f, 0.006185f, 0.006269f, -0.009305f, + -0.001721f, -0.015154f, -0.007000f, 0.003852f, -0.001906f, -0.008842f, -0.003603f, 0.006242f, 0.011444f, 0.008226f, -0.004443f, -0.013899f, -0.001147f, 0.005225f, -0.003130f, 0.008906f, 0.004588f, 0.011748f, 0.014059f, -0.003662f, -0.000763f, -0.014692f, -0.019971f, 0.019440f, 0.009076f, 0.000644f, -0.001529f, 0.000775f, -0.007779f, -0.006248f, -0.000923f, 0.016143f, 0.007617f, 0.004336f, 0.016938f, -0.011798f, 0.003103f, -0.009174f, -0.009582f, 0.009871f, 0.006827f, 0.008962f, 0.025653f, 0.001872f, -0.013373f, 0.005404f, -0.013325f, -0.014562f, -0.020246f, 0.008052f, -0.018936f, 0.000317f, 0.020481f, -0.021404f, 0.007676f, 0.010078f, -0.006098f, -0.026478f, 0.000089f, 0.016026f, -0.017608f, 0.011139f, -0.001471f, -0.007329f, -0.022747f, -0.000263f, -0.016478f, 0.003255f, -0.008486f, -0.012257f, -0.016030f, 0.006893f, -0.002478f, -0.000510f, 0.014774f, -0.008656f, 0.012429f, -0.009176f, -0.004079f, 0.019855f, 0.006421f, -0.009880f, 0.007738f, 0.005171f, -0.009203f, 0.005238f, 0.004654f, -0.002919f, -0.004060f, 0.001321f, -0.004555f, -0.004548f, 0.002948f, 0.004144f, 0.026169f, -0.024239f, + 0.003782f, 0.002236f, -0.009154f, 0.018556f, 0.009919f, -0.005415f, -0.019539f, 0.002477f, -0.002234f, -0.005010f, -0.012467f, -0.013386f, 0.017055f, 0.012201f, 0.001072f, -0.000736f, 0.008839f, 0.005794f, -0.004711f, 0.008617f, 0.004704f, -0.003468f, 0.017683f, -0.005314f, 0.010136f, -0.005713f, 0.003562f, 0.009126f, -0.020442f, 0.015086f, -0.008742f, -0.003371f, -0.011872f, -0.007967f, 0.006713f, -0.006286f, 0.005431f, 0.022881f, 0.007394f, 0.012728f, -0.029079f, -0.018682f, -0.010574f, -0.006531f, 0.002781f, 0.000216f, 0.004627f, -0.023781f, 0.012581f, 0.005736f, 0.002888f, 0.023379f, 0.000047f, -0.012693f, 0.021268f, 0.008866f, -0.009995f, 0.004780f, -0.012750f, 0.011728f, 0.004995f, 0.015512f, -0.013343f, -0.008837f, 0.003464f, -0.012738f, 0.016171f, -0.014786f, -0.000651f, 0.015103f, 0.013152f, -0.027607f, -0.001196f, 0.001782f, 0.002843f, 0.005055f, 0.030173f, 0.007501f, 0.001472f, -0.008916f, -0.008193f, -0.016076f, -0.009433f, 0.023109f, 0.000054f, -0.026493f, -0.000107f, 0.006795f, -0.015880f, -0.016298f, 0.001434f, -0.010317f, 0.003888f, 0.025490f, 0.011529f, 0.011223f, + -0.010843f, -0.025572f, 0.001444f, -0.003398f, 0.011491f, -0.000845f, -0.022659f, -0.035286f, -0.010752f, 0.010173f, 0.027191f, 0.004033f, 0.013986f, 0.048747f, 0.007845f, 0.008382f, -0.007785f, -0.023260f, 0.012933f, -0.011272f, 0.011871f, -0.002918f, 0.031848f, 0.023446f, -0.012771f, -0.026376f, -0.021331f, 0.015842f, -0.014362f, 0.019409f, 0.008131f, 0.006249f, -0.007194f, -0.002692f, 0.022667f, -0.004718f, 0.019917f, 0.020284f, 0.010020f, 0.014150f, -0.016492f, 0.015314f, 0.007759f, -0.008584f, 0.021979f, -0.010257f, 0.019871f, 0.001236f, 0.001594f, -0.030515f, 0.017413f, 0.001289f, -0.006491f, 0.014498f, -0.021898f, -0.008791f, 0.011684f, 0.009815f, -0.020355f, 0.002593f, -0.013436f, -0.007702f, 0.018080f, 0.001950f, 0.004598f, -0.002719f, -0.023395f, 0.014079f, 0.012685f, 0.000121f, 0.009597f, 0.004053f, -0.011508f, -0.011363f, -0.002779f, 0.010535f, -0.022292f, -0.002238f, -0.001498f, -0.001076f, -0.003896f, 0.005944f, 0.005572f, 0.017640f, 0.042416f, 0.014387f, 0.004380f, -0.014712f, -0.040983f, 0.030213f, 0.007524f, -0.024599f, 0.006462f, -0.001171f, 0.005393f, 0.007265f, + -0.020272f, -0.038804f, -0.033030f, 0.012490f, 0.023597f, -0.003116f, 0.024862f, -0.010243f, 0.019153f, 0.026747f, 0.032491f, -0.005494f, 0.023725f, -0.020116f, 0.007290f, -0.010031f, 0.001882f, 0.015486f, -0.001673f, -0.005065f, 0.004984f, 0.019015f, -0.013073f, -0.020188f, -0.023717f, 0.049756f, -0.000945f, -0.000041f, -0.022446f, 0.024406f, 0.006151f, -0.041374f, -0.026386f, 0.012341f, -0.007171f, -0.005181f, 0.016108f, 0.008443f, 0.041396f, 0.026144f, -0.002528f, -0.021837f, -0.025228f, -0.010838f, -0.011011f, -0.024973f, 0.024743f, -0.016037f, 0.019300f, 0.020773f, -0.018923f, -0.019510f, -0.023374f, -0.028755f, 0.006398f, 0.003054f, -0.013196f, -0.010810f, -0.025504f, -0.004509f, -0.025552f, 0.009080f, -0.000188f, -0.003474f, -0.001701f, -0.022748f, -0.046296f, -0.009279f, -0.012651f, 0.003322f, -0.011416f, 0.002763f, 0.003928f, -0.004113f, 0.018647f, -0.024416f, -0.008516f, -0.023152f, -0.002057f, -0.011173f, 0.026778f, 0.031640f, 0.023828f, -0.033836f, 0.023576f, -0.011810f, 0.017688f, -0.006509f, 0.012824f, -0.010855f, -0.015656f, 0.005890f, -0.019957f, 0.012804f, 0.013874f, -0.001322f, + 0.007981f, -0.016989f, -0.003083f, 0.030004f, -0.024384f, 0.001523f, -0.007836f, -0.009285f, -0.019795f, -0.000748f, 0.028391f, 0.038754f, -0.025079f, 0.011844f, -0.003809f, -0.023208f, -0.024602f, -0.025571f, -0.012414f, 0.048741f, 0.028805f, -0.009177f, 0.015099f, -0.010502f, 0.013089f, -0.026925f, 0.015303f, -0.001183f, -0.014815f, 0.036573f, 0.019039f, 0.006888f, 0.012247f, 0.009728f, 0.035115f, 0.003458f, -0.028734f, 0.010518f, 0.023739f, 0.015687f, -0.049403f, 0.028818f, -0.018434f, -0.023089f, -0.003191f, -0.002352f, -0.000176f, 0.031633f, 0.020783f, 0.085927f, 0.024136f, -0.014558f, 0.005577f, 0.014356f, 0.000382f, 0.028510f, 0.021316f, 0.019687f, -0.025623f, -0.042911f, 0.042668f, -0.024402f, 0.003959f, 0.014572f, 0.046755f, 0.018582f, -0.028577f, 0.025379f, -0.025907f, -0.005588f, -0.035581f, -0.046663f, -0.005505f, 0.012209f, 0.012136f, 0.009010f, 0.011407f, -0.004005f, -0.032307f, -0.012112f, 0.009688f, 0.010398f, -0.017463f, 0.034969f, 0.021731f, -0.021544f, 0.010957f, 0.017220f, 0.006047f, 0.000704f, -0.020482f, -0.002797f, -0.014749f, -0.008456f, 0.000847f, 0.021616f, + 0.053419f, -0.015207f, 0.003553f, 0.007721f, 0.018820f, -0.019903f, 0.067585f, -0.006298f, 0.004755f, 0.005522f, -0.033668f, -0.031095f, -0.052274f, -0.021342f, 0.024483f, -0.009665f, 0.010545f, 0.011021f, 0.044084f, 0.007747f, 0.004339f, 0.002849f, 0.032620f, 0.018855f, -0.021714f, 0.036050f, -0.038538f, 0.009998f, -0.009600f, -0.035191f, 0.019683f, 0.010250f, 0.024338f, -0.005917f, -0.055109f, 0.005161f, -0.037027f, -0.031706f, 0.009409f, 0.008712f, 0.015063f, -0.008525f, 0.010851f, -0.000878f, -0.018789f, 0.030954f, -0.004815f, -0.008688f, -0.011882f, -0.019676f, -0.017808f, 0.012187f, -0.022409f, 0.006931f, -0.014191f, -0.008470f, -0.005896f, 0.030826f, -0.005319f, 0.033053f, 0.020152f, -0.006531f, 0.011020f, 0.012666f, 0.022996f, -0.013537f, -0.020299f, 0.005134f, 0.014008f, 0.019199f, 0.030432f, -0.030373f, -0.030492f, 0.015775f, 0.011686f, 0.038704f, -0.016611f, -0.000145f, 0.019487f, 0.002671f, 0.006631f, -0.004036f, 0.025505f, 0.032692f, 0.015583f, -0.000872f, 0.020793f, 0.065760f, -0.011656f, -0.015083f, 0.025672f, 0.000792f, 0.039211f, 0.012331f, 0.019898f, 0.024332f, + -0.003648f, 0.018299f, 0.045695f, -0.007591f, -0.047259f, 0.039770f, 0.014570f, -0.013496f, 0.010393f, -0.068165f, -0.029284f, -0.005469f, 0.055602f, 0.021581f, -0.062544f, 0.006457f, -0.007952f, 0.001871f, 0.014996f, -0.007108f, -0.030126f, 0.000958f, -0.001066f, 0.026006f, 0.062106f, -0.013310f, 0.022991f, 0.034372f, 0.002751f, -0.014381f, -0.005248f, 0.011421f, 0.062327f, -0.004802f, 0.000689f, 0.043867f, -0.014533f, 0.009229f, 0.004992f, -0.004327f, -0.007418f, 0.014341f, -0.047904f, -0.001838f, 0.021941f, 0.035237f, 0.046437f, -0.037320f, 0.006836f, 0.033764f, 0.003281f, 0.065816f, -0.019463f, -0.037316f, 0.010461f, 0.046906f, 0.014841f, -0.041981f, -0.011978f, 0.008078f, 0.006167f, 0.018513f, -0.049735f, 0.003481f, 0.009247f, -0.015185f, -0.033843f, -0.039649f, 0.016831f, -0.014537f, 0.005006f, -0.001608f, -0.034622f, -0.048337f, 0.017724f, 0.003037f, -0.036312f, -0.019443f, -0.019972f, 0.021680f, -0.061142f, -0.031995f, 0.034481f, -0.049049f, 0.036514f, -0.014579f, 0.034800f, 0.002840f, 0.018019f, -0.036414f, -0.005707f, -0.034301f, 0.036188f, 0.020139f, 0.048206f, 0.038819f, + -0.020818f, 0.009810f, 0.037516f, 0.023630f, 0.017762f, 0.016110f, -0.036915f, -0.006780f, 0.014091f, 0.005730f, 0.017139f, -0.040558f, -0.035074f, 0.022786f, 0.062587f, 0.011995f, -0.024312f, 0.044384f, 0.009035f, 0.028940f, 0.004095f, 0.008227f, -0.039588f, -0.034327f, -0.002080f, 0.003863f, -0.067289f, 0.008491f, -0.016031f, -0.000016f, 0.017630f, -0.021843f, 0.012624f, 0.054070f, 0.002487f, -0.079216f, -0.062288f, -0.006221f, -0.021196f, -0.017033f, -0.003568f, 0.018618f, 0.010089f, -0.016624f, 0.019829f, 0.025426f, 0.016527f, -0.008985f, 0.013687f, -0.005425f, -0.024881f, -0.001058f, 0.015377f, -0.057491f, -0.017832f, -0.023457f, -0.036184f, -0.008131f, 0.004268f, -0.011304f, -0.006678f, 0.073637f, 0.032720f, -0.019229f, -0.007512f, 0.014174f, 0.026392f, -0.036799f, -0.009662f, -0.015460f, 0.009598f, 0.077625f, 0.011986f, -0.037825f, 0.009845f, 0.034451f, -0.007547f, 0.032220f, 0.040472f, -0.020702f, 0.009440f, 0.020833f, 0.013859f, 0.001226f, -0.006120f, -0.012254f, 0.005958f, 0.024457f, 0.012352f, 0.022873f, -0.033823f, -0.051681f, -0.005567f, 0.023583f, 0.020471f, 0.017042f, + -0.005892f, -0.047628f, 0.015528f, 0.011033f, 0.072007f, 0.075995f, 0.018099f, -0.055861f, 0.040865f, -0.021028f, -0.057284f, -0.013043f, -0.067790f, -0.051443f, -0.022587f, -0.024582f, -0.052420f, 0.009587f, -0.020868f, -0.060035f, -0.054833f, 0.016355f, 0.036412f, -0.005553f, -0.046094f, 0.014230f, 0.001985f, 0.015279f, 0.030105f, 0.028964f, -0.035304f, 0.046925f, 0.032919f, 0.004372f, 0.013868f, 0.032721f, -0.000601f, 0.085103f, -0.059286f, -0.028620f, -0.000757f, -0.068665f, 0.057896f, 0.004535f, 0.072066f, 0.021570f, 0.017115f, 0.024305f, -0.035988f, 0.008260f, -0.073547f, -0.022013f, -0.002891f, -0.020117f, 0.084466f, 0.024481f, -0.020115f, -0.053482f, -0.024451f, -0.022910f, -0.030983f, -0.025660f, 0.014597f, -0.077311f, -0.014323f, 0.054157f, -0.004545f, -0.007727f, -0.055834f, 0.053786f, 0.029522f, -0.000211f, -0.019779f, 0.022099f, 0.013925f, -0.014637f, 0.027522f, -0.040585f, -0.008023f, -0.021434f, 0.013655f, -0.010585f, -0.022165f, 0.026558f, -0.018463f, 0.010224f, 0.003464f, -0.039501f, -0.020940f, -0.007424f, -0.044760f, -0.048248f, -0.059633f, -0.017697f, 0.031760f, -0.022594f, + -0.008280f, 0.034475f, -0.040713f, -0.037896f, 0.042516f, -0.002079f, 0.001405f, 0.033293f, 0.004388f, -0.032052f, -0.013164f, 0.009740f, 0.029825f, -0.041176f, -0.007461f, 0.044729f, 0.025617f, 0.042730f, 0.029385f, -0.012729f, 0.030514f, -0.005940f, -0.054245f, 0.014128f, -0.037371f, 0.026173f, -0.012116f, -0.022279f, 0.057225f, 0.018944f, 0.002915f, 0.006160f, -0.013881f, 0.021661f, 0.035633f, 0.087381f, 0.077806f, 0.005993f, -0.032955f, 0.015032f, 0.045524f, 0.012139f, 0.035479f, 0.024327f, 0.017684f, -0.026656f, -0.032541f, -0.040807f, -0.001814f, 0.014473f, 0.029382f, 0.056748f, 0.031302f, 0.036261f, 0.022377f, 0.033624f, 0.018223f, 0.032412f, -0.020811f, 0.005861f, 0.062938f, -0.001938f, 0.048685f, 0.012381f, 0.039599f, -0.061240f, -0.008799f, -0.018129f, -0.016847f, 0.014166f, 0.024937f, 0.044209f, 0.072709f, 0.059980f, -0.020062f, 0.010771f, -0.078257f, 0.019511f, 0.019492f, 0.070306f, -0.054442f, 0.044686f, -0.013238f, -0.038468f, 0.031106f, 0.009919f, 0.026161f, 0.044728f, -0.013058f, -0.055045f, 0.030269f, -0.034686f, -0.048311f, -0.021695f, 0.067433f, -0.055043f, + -0.080387f, -0.037737f, -0.012154f, 0.048345f, -0.002495f, -0.019590f, -0.049084f, -0.010040f, 0.010128f, 0.009070f, 0.056166f, -0.018450f, -0.060374f, 0.003241f, -0.024821f, -0.088524f, -0.043554f, 0.113487f, 0.016639f, -0.052996f, -0.056306f, 0.005126f, 0.001501f, 0.022345f, 0.030190f, -0.041492f, -0.026264f, -0.065423f, 0.015192f, -0.024723f, -0.015127f, 0.096176f, 0.021153f, -0.015166f, -0.100811f, -0.008228f, -0.053864f, 0.051619f, 0.065894f, 0.005067f, 0.051168f, -0.062380f, -0.024025f, -0.040196f, -0.009356f, 0.097753f, 0.123891f, 0.017696f, -0.033730f, -0.046649f, -0.090426f, -0.001110f, 0.010822f, 0.106095f, 0.059633f, -0.018398f, -0.179508f, -0.095064f, 0.014096f, -0.019890f, 0.155249f, 0.049641f, -0.076901f, -0.034314f, -0.136223f, -0.045664f, 0.002481f, 0.084499f, 0.088011f, 0.098230f, 0.001809f, 0.020398f, -0.014273f, 0.004852f, 0.120890f, -0.050380f, 0.086771f, -0.026774f, -0.100801f, -0.033170f, -0.108363f, -0.037613f, 0.119428f, 0.053030f, -0.080060f, 0.088667f, -0.000485f, -0.022525f, -0.137657f, -0.036486f, -0.037738f, -0.061477f, 0.131786f, 0.001670f, 0.058541f, -0.090452f, + 0.049404f, 0.042365f, -0.041754f, 0.026570f, -0.008866f, 0.023679f, -0.001094f, 0.067718f, 0.022827f, -0.066011f, 0.038566f, 0.032520f, -0.001453f, 0.045436f, -0.035147f, -0.017844f, 0.056149f, 0.039748f, 0.036904f, 0.018480f, 0.031885f, -0.099946f, 0.085115f, -0.050641f, -0.033197f, 0.017985f, -0.071113f, 0.100536f, -0.030502f, 0.009004f, 0.071732f, 0.001257f, -0.012852f, 0.038467f, 0.039072f, 0.070351f, -0.019310f, -0.068515f, -0.069832f, 0.005651f, -0.026380f, 0.029422f, -0.042986f, -0.022344f, -0.029709f, 0.017805f, -0.129728f, -0.000749f, 0.093082f, 0.023130f, 0.036797f, -0.007075f, -0.012302f, 0.021101f, -0.035602f, -0.043052f, 0.021983f, 0.008184f, -0.043489f, -0.052096f, 0.174234f, -0.025962f, -0.059838f, 0.007428f, 0.076189f, -0.015600f, 0.021981f, -0.064786f, 0.020611f, 0.111261f, 0.165991f, -0.071722f, 0.051440f, -0.108839f, -0.037045f, -0.065117f, -0.013410f, 0.107433f, 0.106541f, 0.091004f, -0.007059f, -0.067363f, -0.046897f, 0.041088f, -0.001628f, 0.021928f, 0.053263f, 0.001583f, 0.024086f, -0.071111f, -0.023628f, -0.040147f, -0.056855f, 0.030855f, 0.018645f, 0.003887f, + 0.046693f, -0.041887f, -0.006925f, 0.013780f, -0.067620f, 0.000275f, -0.001272f, -0.037389f, -0.020611f, 0.016517f, -0.032187f, 0.060192f, -0.025257f, 0.090202f, 0.060727f, -0.042238f, -0.018762f, -0.059400f, -0.076129f, -0.088933f, 0.021899f, 0.042643f, 0.113322f, 0.092847f, 0.035499f, 0.059207f, 0.003454f, -0.065727f, -0.051940f, -0.036702f, -0.053620f, -0.009304f, 0.016452f, -0.002333f, -0.040381f, 0.007977f, -0.041226f, 0.019362f, 0.034314f, 0.008184f, -0.058266f, 0.035847f, -0.034973f, -0.024525f, -0.060760f, 0.025150f, 0.007222f, -0.015814f, -0.180633f, -0.109094f, -0.057057f, 0.104390f, 0.054899f, 0.281190f, 0.271049f, 0.273742f, 0.283744f, 0.297410f, 0.216224f, 0.110277f, 0.166270f, 0.097039f, -0.038413f, -0.085083f, -0.125865f, -0.259914f, -0.226969f, -0.241778f, -0.167200f, -0.175632f, -0.121977f, -0.105052f, -0.046164f, 0.012983f, -0.090494f, -0.045463f, -0.006932f, -0.007628f, -0.040772f, 0.024400f, 0.087214f, 0.090118f, 0.047223f, 0.105612f, 0.137933f, 0.042745f, 0.043444f, 0.038058f, 0.138279f, 0.137773f, 0.176481f, 0.189554f, 0.174782f, 0.189927f, 0.285391f, 0.125876f, + 0.230086f, 0.299229f, 0.207044f, 0.234554f, 0.196226f, 0.109395f, 0.131888f, 0.138304f, 0.132696f, 0.163818f, 0.168312f, 0.115760f, 0.057222f, 0.078861f, 0.121611f, 0.038212f, 0.058055f, 0.011214f, 0.011673f, -0.076510f, 0.001210f, -0.164742f, -0.217036f, -0.156574f, -0.182559f, -0.269015f, -0.250893f, -0.100229f, -0.216787f, -0.071574f, -0.002868f}, + {0.001179f, -0.003749f, 0.000733f, -0.006434f, -0.004977f, -0.005543f, -0.006417f, -0.009856f, 0.004853f, 0.004520f, -0.004912f, 0.001095f, 0.007372f, 0.011841f, 0.004193f, 0.004818f, -0.002918f, 0.001317f, -0.018047f, 0.005390f, 0.000557f, -0.002582f, 0.005158f, -0.001749f, -0.006756f, 0.006248f, 0.002276f, 0.002484f, 0.004613f, 0.006177f, 0.006304f, -0.000161f, -0.008053f, -0.000363f, 0.008457f, 0.008883f, 0.011530f, -0.002710f, 0.011290f, 0.000224f, -0.000624f, -0.003718f, -0.000514f, 0.006259f, 0.002384f, -0.018482f, -0.006185f, -0.010821f, -0.000517f, -0.000721f, -0.007086f, -0.008343f, -0.006372f, 0.002100f, -0.006131f, 0.003733f, 0.005867f, 0.006457f, -0.008435f, -0.004293f, -0.009543f, -0.005564f, -0.002692f, 0.000615f, -0.009041f, 0.009109f, 0.003668f, -0.004086f, -0.000191f, -0.001681f, 0.015651f, 0.003649f, -0.001411f, -0.004674f, 0.019623f, 0.001500f, -0.001780f, -0.000248f, -0.002036f, -0.009836f, -0.010895f, 0.010421f, 0.001928f, -0.005531f, -0.009584f, -0.003953f, -0.007366f, -0.011437f, 0.014692f, 0.002266f, 0.005004f, 0.007996f, 0.021367f, -0.000135f, 0.002983f, -0.004845f, + -0.002462f, -0.003630f, -0.014781f, 0.003605f, -0.004895f, 0.001831f, 0.009364f, -0.003489f, -0.001527f, 0.002582f, 0.000485f, -0.001928f, -0.000110f, -0.012740f, 0.002147f, 0.000117f, -0.005324f, 0.004556f, 0.001279f, -0.008422f, 0.013366f, 0.000940f, 0.001372f, 0.013476f, -0.005711f, -0.005158f, -0.013510f, -0.006027f, 0.008174f, 0.001048f, 0.008740f, -0.004122f, -0.011233f, 0.005096f, -0.010543f, -0.003826f, -0.019672f, 0.008350f, 0.005798f, 0.004648f, 0.004842f, 0.013629f, 0.002481f, -0.004961f, 0.006070f, 0.011580f, -0.008019f, 0.006263f, -0.001079f, -0.001163f, -0.004777f, -0.001500f, 0.006002f, 0.000498f, 0.002531f, -0.007799f, 0.001982f, -0.004781f, -0.010237f, -0.000856f, -0.012070f, -0.014302f, -0.009299f, -0.006798f, -0.016104f, 0.000742f, -0.005949f, -0.003109f, 0.004682f, 0.017030f, 0.001332f, -0.003955f, -0.002171f, 0.002786f, -0.000566f, 0.007090f, 0.011788f, -0.000979f, 0.013258f, -0.001529f, -0.001141f, -0.001603f, 0.007429f, -0.010169f, 0.001311f, 0.001221f, -0.002778f, -0.000607f, -0.006363f, -0.010148f, 0.013588f, -0.004783f, -0.001339f, -0.002550f, 0.005813f, -0.006698f, + -0.006007f, 0.002307f, 0.001729f, 0.009567f, -0.006993f, 0.007832f, -0.005017f, -0.008180f, -0.000989f, -0.003513f, 0.001803f, 0.004115f, -0.000551f, 0.005377f, 0.002301f, 0.003808f, -0.005750f, -0.006644f, -0.010830f, -0.008062f, 0.000562f, 0.011987f, 0.001147f, 0.009580f, 0.002192f, -0.005816f, 0.006516f, 0.002585f, -0.007943f, 0.012316f, 0.001780f, -0.013458f, -0.014959f, -0.012912f, 0.002598f, 0.001697f, 0.010812f, -0.008274f, 0.011141f, -0.005525f, -0.002709f, -0.017542f, -0.001316f, 0.001404f, -0.006265f, -0.000833f, 0.009379f, 0.009228f, 0.013359f, -0.003054f, -0.002191f, 0.008675f, 0.003838f, 0.007826f, -0.018422f, 0.018413f, -0.004002f, 0.000022f, 0.002800f, -0.001934f, -0.000204f, -0.001331f, -0.001299f, 0.011565f, -0.000358f, 0.015100f, -0.002555f, -0.005727f, -0.012289f, 0.001776f, -0.005542f, -0.004525f, 0.008548f, 0.006940f, 0.008958f, 0.000681f, 0.001196f, -0.012695f, -0.009324f, 0.000276f, 0.012073f, 0.004561f, -0.001357f, 0.004449f, -0.004759f, 0.013180f, -0.000434f, -0.010463f, -0.013639f, -0.004441f, 0.015932f, 0.012351f, 0.012425f, 0.006195f, 0.000881f, -0.012424f, + -0.005350f, -0.001168f, -0.007087f, 0.008776f, -0.000747f, -0.002873f, 0.007595f, -0.017752f, 0.006374f, -0.001464f, 0.005322f, -0.000490f, 0.004239f, -0.004723f, -0.007586f, -0.001865f, -0.005766f, 0.002335f, 0.010652f, 0.003437f, 0.000854f, -0.004684f, -0.023108f, -0.016109f, -0.000023f, 0.006272f, 0.008747f, -0.000090f, 0.002147f, -0.003905f, 0.008668f, 0.003049f, 0.007036f, -0.010877f, 0.010221f, 0.005003f, -0.010627f, 0.003549f, 0.010631f, -0.001174f, 0.003746f, 0.001031f, 0.009678f, -0.007804f, 0.005927f, -0.001581f, -0.000792f, -0.009477f, 0.000990f, 0.008774f, -0.005573f, -0.005042f, -0.007812f, 0.010388f, -0.000633f, 0.001449f, -0.008240f, -0.025497f, -0.006771f, 0.002901f, 0.002741f, 0.008398f, -0.006131f, -0.004847f, -0.003292f, -0.002452f, -0.007489f, -0.000571f, -0.006704f, 0.015390f, 0.006213f, 0.012370f, -0.012891f, -0.003548f, -0.005017f, 0.011468f, -0.003197f, -0.003272f, -0.009700f, 0.005378f, 0.000483f, -0.007999f, 0.011362f, 0.002105f, 0.002241f, 0.010840f, 0.003819f, 0.006523f, -0.005186f, 0.004110f, 0.000453f, -0.002789f, 0.011252f, 0.008439f, -0.000817f, -0.015363f, + -0.020341f, -0.015844f, 0.005868f, -0.000088f, -0.008774f, -0.002400f, 0.001056f, -0.002112f, 0.022952f, 0.003849f, -0.016561f, -0.004521f, -0.004949f, 0.000716f, -0.007804f, 0.012853f, -0.009706f, -0.012830f, 0.011858f, -0.005117f, 0.003236f, 0.003029f, -0.005465f, -0.015087f, 0.001953f, -0.008099f, -0.007092f, -0.007453f, -0.000971f, 0.011521f, -0.001676f, -0.002764f, 0.017137f, 0.003038f, 0.002552f, -0.022325f, -0.002572f, 0.011734f, 0.013764f, -0.007773f, 0.003651f, 0.001803f, -0.022035f, -0.003014f, -0.001473f, -0.002300f, 0.005383f, 0.000202f, -0.012439f, 0.001582f, -0.009981f, 0.009439f, -0.003499f, 0.012190f, 0.002268f, -0.013807f, 0.006027f, 0.026323f, -0.010269f, 0.000531f, -0.019549f, 0.005179f, 0.016400f, -0.028653f, 0.004418f, -0.000950f, -0.001749f, 0.019254f, 0.002821f, 0.008407f, 0.014283f, -0.017578f, -0.004916f, -0.013526f, 0.006927f, 0.007157f, 0.015442f, 0.028804f, 0.004921f, -0.022786f, -0.001785f, -0.006095f, -0.002026f, -0.010150f, 0.000312f, -0.001592f, 0.011327f, 0.008279f, 0.003459f, -0.001333f, 0.000685f, -0.003994f, -0.002324f, 0.012102f, -0.003916f, -0.002285f, + 0.009679f, -0.001793f, 0.005777f, -0.001564f, 0.012241f, -0.009840f, -0.018052f, 0.022019f, -0.001172f, 0.004715f, -0.016908f, 0.000573f, -0.005047f, 0.024452f, 0.004097f, 0.010669f, -0.002256f, 0.009362f, 0.006912f, -0.023518f, -0.003479f, -0.013553f, -0.010889f, 0.000747f, 0.016140f, 0.001209f, -0.003133f, 0.024083f, -0.002552f, -0.014911f, -0.010663f, -0.008216f, 0.012307f, 0.036764f, 0.000005f, 0.009565f, 0.002784f, -0.012879f, -0.002549f, -0.000681f, 0.011247f, 0.016221f, 0.001639f, 0.012878f, 0.012275f, -0.023381f, 0.000530f, -0.007431f, -0.028322f, 0.005858f, -0.002195f, 0.009245f, 0.007135f, 0.026327f, 0.006196f, -0.005836f, 0.007240f, 0.019987f, 0.023671f, 0.008753f, 0.016903f, 0.015804f, -0.012028f, -0.010643f, -0.019964f, -0.023103f, 0.003232f, 0.008981f, -0.018173f, -0.014167f, -0.000239f, -0.022608f, -0.017383f, 0.008548f, 0.003754f, -0.010411f, -0.005681f, -0.015049f, 0.012762f, 0.008070f, 0.020465f, 0.036693f, -0.003318f, -0.011236f, -0.003157f, -0.019047f, 0.000619f, -0.014977f, -0.015026f, 0.018507f, 0.003033f, 0.002009f, -0.023733f, 0.024776f, 0.005911f, -0.016426f, + -0.004211f, 0.012468f, 0.001755f, 0.002237f, 0.000453f, 0.001540f, 0.008323f, -0.012689f, 0.015109f, -0.000251f, -0.009072f, -0.003339f, -0.016185f, 0.002125f, -0.016637f, -0.016091f, 0.014378f, 0.013414f, -0.013044f, -0.022627f, 0.006557f, -0.011072f, -0.000713f, -0.006164f, 0.008298f, -0.006330f, 0.010537f, -0.010912f, -0.012262f, 0.014786f, -0.004669f, -0.003297f, 0.008299f, -0.012043f, -0.012992f, 0.014912f, 0.019587f, 0.000476f, -0.001353f, 0.006824f, -0.017135f, 0.029122f, -0.017933f, 0.002241f, 0.013729f, -0.006454f, 0.012805f, 0.015773f, 0.005023f, -0.016282f, 0.017573f, -0.002502f, 0.006531f, -0.012738f, -0.002523f, -0.024346f, 0.008314f, -0.014411f, 0.005504f, -0.025065f, 0.014694f, -0.018289f, -0.012954f, 0.010666f, 0.014518f, 0.005038f, 0.001538f, 0.000732f, -0.015912f, -0.014581f, -0.009457f, 0.038451f, 0.020978f, -0.005923f, -0.035576f, -0.004910f, 0.009939f, 0.020766f, -0.011740f, 0.001764f, -0.024583f, -0.008371f, -0.003067f, 0.006436f, 0.003575f, -0.005479f, -0.000460f, 0.010778f, -0.012159f, -0.000692f, -0.013850f, 0.007481f, 0.009060f, 0.026394f, 0.011252f, -0.013012f, + 0.005460f, -0.007350f, -0.020041f, -0.002731f, 0.011485f, 0.001566f, 0.032705f, -0.024869f, -0.004147f, 0.005573f, 0.014469f, 0.007632f, 0.019006f, 0.003896f, -0.023787f, 0.015153f, -0.020223f, -0.020784f, 0.000043f, -0.001631f, 0.015482f, 0.020218f, 0.017760f, 0.027011f, 0.005928f, -0.027393f, 0.029595f, 0.016739f, -0.012885f, 0.023450f, -0.003701f, 0.003005f, -0.021127f, -0.006913f, -0.006636f, -0.008920f, 0.018721f, -0.032657f, -0.008223f, -0.015309f, -0.015483f, 0.002770f, 0.014913f, -0.007437f, -0.019829f, -0.020040f, -0.027080f, -0.026415f, -0.014420f, -0.004525f, 0.010346f, -0.020789f, -0.027970f, -0.015971f, -0.007918f, -0.013306f, -0.010021f, 0.023268f, -0.014430f, 0.002022f, 0.011096f, -0.021460f, -0.014026f, -0.014573f, 0.021578f, -0.010139f, 0.013448f, 0.032692f, -0.004884f, 0.007008f, 0.001445f, -0.010599f, -0.015186f, -0.009632f, 0.013559f, -0.002988f, 0.015670f, 0.000271f, 0.011140f, 0.002128f, -0.025132f, 0.026746f, -0.014229f, -0.005527f, 0.045349f, 0.031051f, 0.020010f, -0.014008f, -0.035197f, -0.007561f, 0.019069f, -0.030386f, -0.018856f, 0.002189f, 0.023648f, 0.019572f, + 0.013145f, -0.016901f, 0.012542f, -0.003361f, 0.012545f, -0.002017f, 0.034868f, 0.023410f, -0.003194f, -0.031680f, -0.004831f, 0.026998f, 0.020128f, 0.002627f, 0.042590f, 0.021646f, -0.010217f, 0.001764f, 0.001661f, -0.003392f, -0.013653f, -0.015097f, -0.004035f, -0.045682f, 0.012101f, -0.014410f, 0.000888f, 0.000262f, 0.011043f, 0.019665f, -0.000932f, 0.006721f, -0.022606f, 0.017176f, -0.009103f, 0.033584f, -0.000680f, 0.006643f, -0.078117f, -0.001103f, 0.019039f, 0.012815f, 0.020325f, -0.005158f, -0.022942f, 0.014302f, 0.002676f, -0.015158f, 0.015232f, 0.005906f, -0.018421f, 0.002838f, -0.000877f, 0.008563f, -0.007852f, -0.025299f, -0.029853f, 0.001744f, -0.011919f, 0.012482f, 0.008038f, 0.007453f, 0.008646f, -0.030505f, -0.013251f, -0.031998f, -0.052415f, 0.008796f, 0.017711f, 0.019147f, 0.000152f, 0.043725f, -0.031045f, 0.010624f, 0.005687f, -0.008275f, -0.027532f, -0.010981f, -0.015719f, 0.018911f, -0.008207f, -0.016245f, -0.027928f, -0.001958f, -0.010367f, -0.004672f, -0.021031f, 0.011855f, -0.001340f, -0.009116f, 0.011307f, 0.015114f, 0.017067f, -0.021336f, 0.040455f, 0.003253f, + -0.005685f, -0.023965f, -0.023150f, -0.003871f, -0.002859f, -0.023280f, -0.024965f, -0.018404f, 0.016554f, -0.010220f, 0.027308f, 0.009668f, 0.045391f, 0.016521f, 0.017534f, -0.004643f, 0.024641f, -0.003012f, 0.006388f, 0.035437f, -0.009766f, 0.013716f, -0.040376f, -0.050964f, 0.012237f, -0.001011f, -0.032303f, 0.003626f, 0.001862f, -0.043523f, 0.013892f, -0.011533f, -0.007604f, -0.015730f, 0.018576f, -0.014404f, 0.002703f, 0.000468f, 0.010289f, 0.002595f, -0.022249f, 0.017417f, -0.000478f, 0.009213f, -0.027054f, -0.038055f, -0.024151f, 0.008466f, 0.031558f, 0.041393f, -0.001319f, 0.010991f, 0.025931f, 0.021367f, -0.002432f, -0.052770f, 0.035754f, -0.003732f, 0.009477f, -0.010974f, 0.018094f, -0.001601f, -0.023213f, 0.006053f, 0.040942f, 0.005916f, -0.027716f, 0.023467f, 0.016549f, 0.010653f, -0.021070f, 0.021411f, 0.015676f, 0.001234f, 0.025613f, -0.011284f, 0.006284f, 0.041546f, 0.030100f, 0.000298f, 0.008923f, 0.019791f, -0.040939f, -0.009210f, -0.003511f, -0.007498f, -0.036074f, 0.007644f, 0.009557f, 0.000568f, -0.028290f, -0.002002f, -0.047697f, 0.000779f, -0.034455f, -0.008438f, + 0.015909f, -0.016218f, -0.021414f, -0.018391f, 0.008568f, 0.005746f, -0.019938f, 0.004765f, -0.008105f, 0.020118f, -0.013381f, -0.016602f, 0.010503f, 0.018031f, -0.003560f, 0.005561f, 0.006787f, -0.055061f, -0.002675f, -0.008490f, -0.027387f, -0.002711f, 0.031748f, 0.003813f, -0.010368f, -0.011666f, 0.024037f, 0.006308f, 0.018049f, -0.044383f, 0.017619f, -0.046031f, -0.059374f, -0.034813f, 0.000270f, -0.029374f, 0.028602f, -0.007470f, -0.040607f, 0.000881f, -0.011911f, 0.007414f, 0.005047f, -0.006775f, -0.007082f, 0.027582f, -0.009686f, 0.011896f, -0.015934f, -0.011547f, 0.038280f, -0.011365f, -0.006730f, 0.001028f, 0.007114f, 0.027136f, -0.052781f, -0.001174f, 0.025078f, 0.028479f, 0.022509f, 0.005517f, -0.011252f, 0.054443f, 0.015631f, 0.018725f, 0.018312f, 0.011560f, -0.009406f, 0.002664f, 0.028674f, 0.012238f, -0.023762f, 0.013799f, 0.054524f, -0.027561f, 0.037049f, 0.016650f, -0.061772f, 0.016772f, 0.038059f, -0.002040f, 0.015984f, 0.002087f, -0.047338f, 0.025180f, 0.054275f, 0.005473f, 0.036222f, -0.020954f, 0.031773f, 0.030273f, -0.003088f, -0.002912f, 0.028889f, 0.018566f, + -0.043255f, 0.042877f, -0.012576f, -0.007585f, 0.022158f, -0.010565f, -0.017833f, -0.017327f, 0.001977f, 0.002221f, -0.017134f, -0.033171f, 0.078283f, 0.037251f, -0.089110f, -0.038132f, 0.010577f, -0.015920f, 0.027053f, 0.029671f, 0.033915f, 0.036645f, -0.022079f, 0.070302f, -0.009685f, 0.000827f, -0.022280f, 0.025889f, 0.036853f, -0.026766f, -0.028354f, -0.007161f, -0.015866f, 0.002198f, 0.015367f, 0.001235f, -0.017420f, -0.007970f, 0.030468f, -0.003311f, 0.015960f, 0.002608f, 0.036463f, 0.051964f, 0.021238f, -0.026432f, -0.058471f, -0.005983f, -0.008939f, 0.005732f, -0.012602f, 0.018690f, 0.034280f, 0.001999f, -0.011017f, -0.028246f, 0.066462f, 0.056019f, -0.006292f, 0.026834f, -0.014228f, -0.021855f, -0.061501f, 0.033696f, -0.027981f, -0.007789f, -0.000533f, -0.020676f, 0.012364f, 0.037528f, 0.007272f, -0.018085f, 0.019689f, -0.008948f, -0.024556f, 0.038373f, 0.009370f, -0.055757f, 0.071377f, -0.048547f, -0.024174f, 0.026005f, 0.028933f, 0.022209f, 0.001311f, -0.024431f, 0.002375f, 0.036031f, 0.010184f, -0.047724f, -0.039015f, -0.008708f, 0.060070f, 0.006905f, -0.029231f, -0.077214f, + -0.021866f, -0.002860f, 0.018313f, 0.054299f, 0.040915f, -0.004973f, 0.000410f, 0.036049f, 0.028624f, 0.002178f, 0.007839f, -0.104169f, -0.066227f, -0.031350f, -0.051860f, 0.005481f, -0.028874f, 0.047499f, -0.010528f, -0.002589f, -0.000078f, -0.017623f, -0.021195f, 0.034828f, 0.021206f, 0.013110f, -0.004515f, -0.014808f, -0.014088f, 0.018058f, -0.037336f, -0.012784f, 0.006999f, -0.011685f, -0.017967f, 0.017112f, -0.054020f, -0.074686f, 0.018528f, 0.025288f, 0.029993f, -0.042926f, -0.023180f, 0.026195f, 0.009826f, -0.072616f, -0.064699f, 0.005600f, -0.031049f, -0.030977f, 0.012645f, -0.058295f, 0.030935f, -0.021531f, 0.025507f, 0.025635f, -0.014388f, -0.032226f, -0.077619f, -0.025935f, -0.022973f, 0.045043f, -0.037328f, -0.023992f, 0.014269f, 0.031735f, 0.041788f, -0.006010f, -0.057936f, 0.026735f, -0.009283f, -0.023035f, -0.050008f, 0.015573f, 0.020444f, -0.072291f, 0.026999f, 0.026877f, 0.065378f, 0.006855f, -0.017112f, 0.004981f, -0.081292f, -0.022556f, -0.010332f, 0.001950f, 0.014286f, -0.026707f, 0.049025f, 0.020707f, 0.060738f, -0.011407f, 0.053405f, 0.035415f, 0.020901f, 0.049894f, + 0.024491f, 0.033195f, 0.041366f, 0.002629f, -0.054833f, -0.050706f, 0.010250f, 0.059682f, 0.042368f, -0.077831f, -0.002433f, -0.012648f, -0.011174f, -0.007644f, -0.054499f, 0.014471f, -0.038806f, 0.035344f, -0.025935f, 0.079085f, -0.020670f, -0.112655f, -0.011937f, -0.038769f, 0.022564f, 0.016768f, 0.032302f, 0.073108f, 0.016526f, -0.010352f, 0.040272f, -0.024358f, 0.081996f, 0.012771f, 0.054808f, 0.024293f, 0.004847f, -0.022839f, -0.019247f, 0.131443f, -0.000241f, -0.097074f, -0.020835f, 0.067494f, -0.049110f, -0.002185f, 0.037839f, 0.015094f, -0.076022f, -0.029819f, -0.086521f, 0.012189f, 0.077437f, -0.057822f, -0.052610f, 0.049501f, 0.024281f, -0.088288f, -0.082053f, 0.024948f, 0.004587f, 0.010538f, 0.028177f, -0.005082f, -0.024687f, -0.014323f, 0.052584f, -0.039532f, 0.064846f, 0.008643f, -0.015467f, 0.011838f, 0.037201f, -0.002291f, -0.011697f, -0.071830f, -0.031088f, 0.005334f, -0.037950f, 0.029649f, 0.047248f, 0.000827f, 0.007040f, -0.052543f, 0.058310f, -0.023765f, -0.027707f, 0.045326f, -0.019915f, -0.003142f, -0.036185f, -0.006949f, -0.026038f, -0.089158f, 0.027559f, -0.013412f, + 0.061594f, 0.077491f, -0.003394f, -0.018888f, -0.054122f, -0.020967f, -0.017074f, 0.072643f, -0.076753f, -0.057444f, -0.125601f, -0.002959f, -0.054324f, 0.007653f, 0.038272f, -0.029967f, -0.011118f, 0.075436f, 0.048333f, 0.028835f, 0.000090f, -0.007174f, 0.055337f, -0.082530f, -0.013593f, -0.000156f, -0.013916f, 0.010025f, 0.070160f, -0.050300f, 0.014722f, -0.014356f, -0.030765f, -0.021423f, 0.108329f, -0.010597f, 0.051083f, -0.040078f, 0.072641f, -0.022057f, -0.002960f, 0.045974f, 0.040271f, 0.110531f, 0.001023f, 0.022015f, 0.011545f, -0.040217f, 0.050687f, 0.021736f, -0.036066f, 0.058128f, -0.026173f, 0.072007f, 0.047382f, -0.010888f, 0.040754f, 0.007107f, 0.037827f, 0.013485f, 0.066834f, -0.037950f, 0.031493f, -0.066119f, -0.021565f, 0.029298f, 0.072858f, 0.002057f, 0.002569f, 0.038463f, -0.003825f, -0.020204f, -0.095650f, -0.051260f, 0.012260f, -0.033769f, -0.005192f, 0.034984f, -0.083675f, 0.055114f, -0.006865f, 0.064517f, -0.031085f, -0.048422f, -0.012748f, 0.157290f, 0.031142f, -0.130948f, 0.021158f, 0.041461f, 0.005650f, 0.155990f, -0.011773f, -0.103635f, 0.111718f, -0.032286f, + -0.009554f, 0.130729f, -0.015144f, 0.086385f, 0.012214f, -0.074840f, -0.000069f, 0.084444f, 0.010715f, 0.011594f, -0.003576f, -0.112156f, -0.006706f, 0.015625f, -0.039593f, -0.013486f, -0.114225f, 0.071952f, 0.114420f, -0.050991f, 0.017686f, -0.087239f, -0.248647f, -0.049388f, 0.013330f, 0.125602f, 0.108414f, -0.106035f, -0.091447f, -0.095445f, -0.075441f, -0.056016f, 0.067921f, -0.013057f, 0.147614f, 0.097220f, -0.027741f, -0.122368f, -0.300262f, -0.197095f, 0.015252f, 0.333384f, 0.256611f, 0.044950f, -0.129922f, -0.331644f, -0.336277f, -0.026486f, 0.198251f, 0.302310f, 0.335127f, 0.032341f, -0.106430f, -0.138730f, -0.179693f, -0.165385f, 0.012328f, 0.110359f, 0.211348f, 0.142030f, 0.116811f, -0.153294f, -0.183298f, -0.219709f, -0.259887f, 0.025971f, 0.313803f, 0.304732f, 0.063578f, -0.115319f, -0.292711f, -0.389242f, -0.129612f, 0.024494f, 0.143237f, 0.345056f, 0.129086f, -0.008023f, -0.194358f, -0.167356f, -0.068351f, 0.067833f, 0.133948f, 0.221768f, -0.029770f, 0.053867f, 0.041357f, -0.095012f, 0.000950f, 0.048804f, -0.039361f, 0.053923f, -0.002338f, -0.010009f, -0.004048f, 0.010751f, + 0.040853f, -0.016295f, 0.048147f, 0.032703f, 0.019445f, 0.021673f, 0.016330f, -0.004435f, -0.028006f, 0.044964f, -0.000952f, 0.027306f, -0.016834f, 0.024257f, -0.008856f, -0.003868f, 0.016273f, -0.022744f, -0.024061f, 0.003086f, -0.010639f, 0.036212f, 0.035674f, -0.033597f, 0.016010f, -0.020204f, 0.022188f, 0.000013f, 0.014343f, 0.005205f, 0.018768f, -0.024113f, 0.015721f, -0.027688f, -0.012471f, -0.004287f, -0.003768f, 0.021432f, -0.042185f, -0.008713f, -0.017849f, -0.037430f, -0.004012f, -0.015015f, 0.008082f, 0.034675f, -0.011301f, -0.049204f, 0.007128f, 0.029855f, 0.058366f, -0.002910f, 0.004602f, -0.032029f, -0.024668f, 0.027457f, 0.002189f, -0.010185f, 0.000802f, 0.048876f, 0.021779f, 0.016657f, 0.027421f, 0.047142f, -0.043715f, 0.006504f, 0.008624f, -0.032725f, 0.086625f, 0.154505f, 0.011097f, -0.097915f, 0.031553f, -0.005610f, 0.121774f, 0.060023f, 0.119663f, -0.009552f, -0.059734f, -0.013837f, 0.025024f, 0.052991f, 0.038034f, -0.020665f, 0.001967f, 0.023574f, 0.013795f, 0.050157f, -0.035727f, 0.010007f, -0.047500f, -0.005512f, -0.001325f, 0.013561f, 0.021756f, 0.007068f, + -0.021396f, 0.038845f, -0.005391f, -0.030825f, 0.042619f, -0.005760f, -0.017940f, 0.013715f, -0.008619f, 0.036602f, 0.053402f, 0.003251f, 0.012482f, -0.016729f, -0.013615f, 0.033963f, 0.021223f, 0.028475f, 0.003285f, -0.014865f, -0.036801f, -0.033764f, -0.040819f, 0.033119f, 0.032224f, 0.035557f, 0.048028f, 0.055627f, 0.021239f, 0.004999f, -0.048611f, 0.030896f, -0.006845f, -0.040092f, 0.050626f, -0.001396f, 0.032752f, 0.020676f, -0.054152f, 0.017372f, -0.017112f, 0.014426f, 0.034194f, 0.010482f, -0.044897f, -0.025863f, -0.025001f, -0.055092f, -0.119289f, 0.006824f, 0.167867f, 0.219102f, 0.190287f, 0.129010f, -0.004678f, 0.006432f, -0.095707f, -0.116595f, -0.192214f, -0.147657f, -0.154304f, -0.052211f, 0.013522f, 0.048298f, 0.085088f, 0.208096f, 0.175257f, 0.115485f, 0.038286f, -0.021083f, -0.076065f, -0.059296f, -0.079211f, -0.103372f, -0.056211f, -0.060468f, -0.071204f, -0.036069f, -0.047128f, 0.006603f, 0.032224f, 0.024211f, 0.088772f, 0.079102f, 0.072400f, 0.044192f, 0.054417f, 0.030957f, 0.065216f, 0.011785f, 0.056036f, -0.001955f, -0.016856f, -0.105333f, -0.045780f, -0.126273f, + -0.143206f, -0.162991f, -0.126150f, -0.098590f, -0.035845f, 0.017577f, 0.087236f, 0.089809f, 0.072315f, 0.149333f, 0.122645f, 0.127754f, 0.120767f, 0.108589f, 0.041507f, 0.066289f, -0.036817f, -0.086013f, -0.086524f, -0.198107f, -0.194814f, -0.193403f, -0.201778f, -0.173607f, -0.066686f, -0.045181f, 0.027364f, 0.086363f, 0.092905f, 0.039836f, 0.018707f} + }, + { + {-0.004040f, -0.000830f, 0.000613f, -0.001602f, -0.002829f, -0.007232f, 0.000901f, -0.001133f, -0.013391f, -0.001878f, -0.001526f, 0.004599f, 0.010737f, -0.009080f, 0.003944f, -0.005698f, 0.002421f, -0.007837f, 0.003986f, 0.002558f, -0.005622f, -0.005130f, -0.008498f, 0.003533f, -0.007983f, 0.001191f, 0.007008f, 0.004917f, 0.002149f, 0.003324f, 0.000517f, -0.007091f, 0.000305f, -0.004431f, 0.003582f, 0.002330f, 0.002731f, 0.011169f, 0.003600f, 0.001686f, -0.000240f, 0.003823f, -0.000111f, 0.003521f, -0.000878f, 0.007965f, 0.002757f, 0.003542f, 0.005998f, 0.013328f, 0.000654f, -0.002188f, 0.005334f, -0.004015f, -0.009282f, 0.004755f, -0.004256f, -0.007988f, 0.002086f, -0.002432f, 0.004401f, -0.002118f, -0.003564f, -0.006102f, 0.006329f, 0.002359f, -0.000370f, -0.005892f, -0.008228f, -0.002438f, -0.001872f, 0.001349f, -0.001025f, -0.000146f, 0.001309f, 0.002465f, 0.019262f, 0.010384f, -0.001251f, 0.006853f, 0.001600f, 0.001644f, -0.021281f, -0.009117f, -0.010582f, 0.008366f, -0.001217f, -0.006776f, 0.007430f, 0.007864f, 0.000435f, 0.007558f, -0.003179f, -0.000137f, -0.000505f, -0.004474f, + -0.002456f, -0.010063f, 0.005204f, -0.014934f, 0.006233f, -0.007728f, 0.006360f, 0.012103f, 0.005419f, -0.002149f, -0.003429f, 0.008982f, -0.001465f, 0.000546f, 0.008341f, -0.008833f, -0.000289f, -0.002895f, -0.005188f, 0.001241f, -0.001272f, 0.002000f, 0.008575f, 0.014292f, -0.004496f, 0.000403f, 0.011756f, 0.001043f, 0.003107f, -0.004175f, -0.006557f, -0.000815f, 0.002012f, -0.010944f, -0.002863f, 0.005954f, 0.000819f, 0.002248f, 0.003527f, -0.001442f, -0.003365f, -0.003134f, -0.003761f, 0.004433f, 0.003678f, -0.001917f, -0.006157f, -0.007708f, 0.004125f, 0.000152f, -0.006144f, 0.006882f, -0.001008f, -0.000505f, 0.001812f, 0.001738f, -0.001677f, -0.007037f, -0.001832f, -0.000025f, -0.006509f, -0.006746f, -0.003917f, 0.015919f, -0.011154f, -0.004700f, -0.007762f, -0.014368f, 0.005423f, 0.002369f, 0.000645f, 0.012184f, 0.011703f, 0.011555f, 0.003851f, -0.002261f, 0.001896f, 0.008688f, -0.003655f, 0.003696f, 0.004533f, -0.010440f, 0.014842f, 0.002767f, 0.004692f, 0.010804f, -0.004080f, -0.010972f, 0.000851f, 0.007285f, -0.005084f, -0.002467f, -0.006814f, 0.007242f, -0.000056f, -0.000864f, + -0.011924f, -0.000643f, -0.001320f, 0.007302f, 0.003948f, -0.006749f, 0.013360f, 0.004730f, 0.002919f, 0.004473f, -0.001970f, 0.007240f, -0.002689f, 0.000195f, -0.009003f, -0.011187f, 0.009042f, 0.006707f, 0.012458f, 0.000974f, 0.003554f, -0.009704f, -0.014370f, -0.007458f, -0.004092f, -0.004567f, -0.006435f, -0.006169f, 0.003391f, -0.002087f, 0.004863f, -0.005958f, -0.001619f, 0.001863f, 0.003330f, -0.002336f, 0.008250f, 0.001508f, -0.013761f, -0.012860f, 0.007533f, 0.001688f, 0.010540f, -0.016321f, -0.002302f, -0.006515f, 0.001739f, 0.019348f, 0.011053f, -0.017013f, 0.006395f, 0.001550f, -0.007100f, -0.007936f, -0.009653f, -0.015693f, 0.000516f, 0.001789f, -0.005839f, 0.002683f, -0.003392f, 0.000497f, 0.004650f, 0.003530f, 0.010001f, -0.008927f, 0.015778f, -0.009795f, 0.009125f, 0.007162f, -0.006024f, 0.004120f, 0.000675f, 0.006422f, -0.002738f, 0.003263f, 0.005937f, 0.001825f, 0.000826f, -0.002633f, 0.004589f, 0.001186f, -0.002234f, 0.011029f, -0.014880f, 0.000745f, -0.009076f, 0.017460f, 0.006117f, -0.015821f, 0.005863f, 0.019945f, -0.019250f, -0.009489f, 0.002118f, -0.002001f, + -0.007426f, 0.005566f, -0.002738f, 0.012970f, -0.011587f, -0.001757f, -0.003992f, -0.001509f, -0.000939f, 0.012215f, -0.012394f, -0.005049f, -0.001620f, -0.013798f, 0.006395f, 0.003528f, 0.013056f, 0.002983f, 0.010558f, 0.005896f, -0.009214f, 0.000990f, -0.005661f, 0.006099f, 0.002568f, -0.009707f, 0.027949f, -0.017683f, 0.005900f, 0.029788f, -0.020721f, 0.009764f, -0.000138f, 0.009731f, -0.002151f, -0.018079f, -0.003483f, 0.014935f, 0.013873f, 0.003746f, 0.000404f, 0.007632f, 0.004265f, 0.000384f, 0.006845f, 0.006425f, -0.004563f, 0.008180f, -0.001564f, 0.012826f, -0.009472f, -0.015437f, 0.004074f, -0.013409f, 0.005488f, 0.000579f, -0.003119f, -0.004021f, -0.005418f, -0.008915f, 0.002683f, 0.003733f, 0.001245f, 0.002864f, 0.003668f, -0.005204f, -0.011027f, 0.010048f, 0.003160f, 0.002199f, 0.000501f, 0.014601f, 0.003936f, 0.006589f, 0.015873f, -0.008179f, 0.004805f, 0.001504f, 0.005736f, 0.011283f, 0.009426f, -0.012299f, -0.010302f, -0.001816f, -0.005197f, -0.000202f, 0.002070f, -0.004270f, 0.004745f, -0.009016f, 0.002305f, -0.008342f, 0.006993f, 0.007427f, -0.003953f, 0.010224f, + -0.005224f, 0.009414f, -0.002975f, 0.005471f, -0.006009f, 0.002093f, -0.004441f, 0.004188f, -0.002885f, -0.015640f, 0.011638f, 0.009992f, 0.020142f, -0.012542f, 0.007413f, -0.015883f, -0.004423f, 0.012334f, 0.010158f, -0.010624f, 0.002122f, -0.012553f, -0.000334f, -0.014989f, 0.004090f, -0.010779f, -0.016894f, -0.012137f, 0.005608f, -0.009446f, -0.000873f, -0.011360f, 0.000358f, 0.003760f, -0.003331f, -0.007780f, 0.004707f, 0.010342f, 0.003700f, 0.005855f, -0.011631f, 0.007552f, -0.012129f, -0.001429f, 0.005299f, 0.002241f, -0.002823f, -0.000840f, -0.001742f, 0.008968f, -0.009291f, -0.013192f, -0.004573f, 0.006953f, -0.004574f, -0.009099f, -0.012848f, -0.013971f, 0.002567f, -0.002265f, -0.016637f, 0.013477f, -0.011157f, -0.006952f, 0.017110f, -0.003876f, -0.005033f, 0.004499f, -0.004754f, -0.002792f, 0.000063f, -0.006535f, -0.006480f, -0.004267f, -0.008181f, 0.003425f, 0.002428f, 0.014817f, -0.021130f, 0.004222f, 0.017391f, -0.006176f, 0.019077f, 0.005959f, 0.000596f, -0.005267f, -0.014429f, -0.008629f, 0.022752f, -0.012201f, -0.000833f, -0.003983f, 0.001081f, 0.014462f, 0.011903f, -0.007364f, + 0.017513f, 0.018587f, -0.009457f, -0.004240f, 0.010278f, -0.009169f, -0.009131f, -0.000374f, -0.013579f, -0.000094f, -0.004690f, 0.001797f, 0.020993f, 0.007640f, 0.000167f, -0.009966f, -0.030290f, -0.003482f, 0.015337f, 0.004085f, -0.012086f, 0.008428f, 0.012185f, 0.011660f, 0.012898f, -0.023139f, 0.003415f, 0.001058f, -0.012767f, 0.006120f, -0.011672f, 0.007223f, -0.007232f, 0.008959f, 0.019022f, 0.026897f, 0.015558f, 0.007638f, -0.012849f, -0.003345f, -0.015110f, -0.014368f, -0.004766f, 0.015591f, 0.001992f, -0.000052f, 0.001681f, -0.015846f, 0.001802f, 0.001657f, -0.002616f, -0.008078f, 0.001399f, 0.008452f, -0.012339f, -0.016633f, 0.034190f, 0.006463f, -0.011632f, -0.001977f, -0.007510f, -0.001460f, 0.003970f, -0.005663f, 0.029486f, -0.001946f, 0.007630f, 0.022928f, 0.001923f, -0.002170f, -0.015226f, 0.009140f, -0.008636f, -0.008536f, -0.029802f, -0.011786f, 0.004923f, -0.000382f, -0.006471f, -0.019694f, 0.006422f, 0.012691f, -0.017280f, -0.007380f, -0.005253f, -0.015974f, 0.006025f, 0.002460f, -0.009909f, -0.006220f, -0.003932f, -0.021970f, -0.009066f, 0.012804f, 0.018549f, -0.013333f, + -0.019042f, -0.003995f, -0.001808f, -0.013526f, -0.012932f, 0.005999f, 0.007433f, -0.014918f, 0.031913f, 0.001538f, 0.012587f, -0.006025f, 0.011805f, -0.007028f, 0.003120f, -0.021719f, -0.005488f, 0.010882f, -0.023737f, 0.007803f, -0.005802f, -0.010331f, -0.026830f, 0.000886f, 0.014062f, 0.001685f, -0.028218f, -0.002722f, 0.004575f, 0.012599f, 0.019902f, -0.006080f, 0.008698f, 0.025067f, 0.007548f, 0.004025f, -0.011235f, -0.001429f, 0.009563f, -0.003512f, -0.008437f, 0.010390f, 0.002556f, -0.017523f, -0.025922f, -0.022304f, -0.026855f, 0.022989f, -0.013762f, -0.004198f, 0.008361f, -0.026651f, -0.010192f, -0.018756f, -0.007464f, -0.006473f, 0.012334f, -0.023458f, -0.011572f, 0.006534f, 0.009579f, 0.012402f, 0.000355f, -0.000292f, -0.003510f, -0.000786f, -0.004803f, 0.002507f, -0.017509f, -0.010468f, -0.015343f, 0.010244f, 0.005985f, 0.007751f, 0.011565f, -0.022732f, -0.001087f, -0.003170f, 0.020442f, -0.008320f, 0.006753f, 0.010041f, -0.003637f, 0.010794f, -0.007188f, 0.012115f, 0.018629f, -0.008002f, -0.000858f, 0.014720f, -0.012983f, 0.020675f, -0.008903f, -0.035324f, 0.005663f, 0.016803f, + -0.006513f, 0.001013f, -0.000348f, 0.012567f, 0.017313f, -0.018516f, -0.007434f, 0.002827f, 0.011846f, -0.021764f, -0.015553f, -0.013886f, 0.024562f, -0.002280f, -0.028804f, -0.008187f, -0.012649f, -0.016312f, -0.006092f, 0.010570f, 0.004408f, 0.015299f, 0.005726f, 0.007276f, -0.030472f, -0.012482f, 0.012353f, -0.008536f, -0.005489f, -0.010695f, 0.003473f, 0.015611f, 0.004523f, 0.003373f, -0.020335f, -0.007446f, -0.003466f, 0.007176f, 0.018424f, -0.022504f, 0.010673f, -0.018448f, -0.004481f, -0.017024f, 0.002408f, 0.001760f, -0.000553f, 0.006355f, -0.015126f, -0.004997f, -0.014156f, -0.006511f, 0.000552f, -0.001252f, -0.017846f, 0.009798f, 0.011946f, -0.004954f, 0.014127f, 0.026547f, 0.003104f, 0.019940f, 0.026736f, 0.001414f, 0.001199f, 0.005690f, -0.005189f, 0.008057f, 0.002177f, -0.006493f, -0.008487f, 0.032441f, -0.003003f, 0.018640f, 0.009061f, -0.010538f, -0.010812f, -0.008674f, 0.009869f, -0.008360f, 0.012721f, 0.028423f, 0.015577f, -0.004680f, 0.001356f, -0.025301f, -0.015853f, -0.015745f, 0.024206f, 0.035296f, -0.014421f, -0.000996f, -0.013052f, -0.003977f, 0.020045f, 0.058574f, + 0.024380f, -0.007078f, -0.002824f, -0.009970f, 0.025805f, -0.025925f, -0.016003f, -0.040046f, -0.001321f, 0.020854f, 0.024160f, 0.005236f, -0.010813f, -0.023736f, -0.018786f, 0.018733f, -0.004566f, 0.029326f, -0.001003f, -0.008501f, 0.012574f, 0.005605f, -0.001199f, -0.006444f, 0.017716f, -0.002809f, 0.015154f, 0.000398f, -0.009807f, 0.035863f, -0.009450f, 0.014920f, 0.033571f, 0.012799f, -0.002533f, -0.016305f, -0.004285f, -0.026955f, -0.033413f, 0.007626f, 0.019528f, -0.004378f, 0.001716f, -0.034670f, -0.014618f, 0.020979f, 0.009809f, -0.008584f, 0.005455f, -0.009917f, -0.006412f, -0.015547f, -0.028400f, 0.002144f, -0.007819f, -0.018577f, -0.032681f, -0.026403f, -0.010330f, -0.024227f, 0.009711f, -0.010600f, 0.002173f, 0.003644f, -0.002037f, 0.001032f, -0.005962f, -0.005097f, 0.013903f, 0.032237f, -0.023644f, 0.004366f, -0.011283f, 0.011972f, -0.013674f, -0.024459f, -0.026312f, 0.006314f, 0.010939f, 0.031618f, -0.026742f, 0.007997f, 0.008945f, -0.046256f, -0.001576f, -0.000454f, -0.037512f, -0.021518f, -0.012961f, 0.008871f, -0.002577f, 0.001439f, -0.010291f, 0.015130f, 0.025615f, 0.012359f, + -0.003191f, -0.039561f, -0.016447f, -0.021979f, 0.008180f, 0.001343f, -0.016619f, -0.002377f, 0.013590f, -0.012342f, 0.023242f, -0.021852f, -0.000377f, -0.013260f, -0.038380f, 0.005349f, -0.016244f, -0.019811f, 0.014526f, 0.019979f, -0.023791f, 0.007863f, 0.028321f, -0.010670f, 0.012433f, 0.008167f, -0.006584f, 0.002264f, -0.031334f, 0.045779f, 0.018638f, 0.009504f, 0.045231f, -0.057094f, -0.004251f, -0.009551f, 0.005719f, 0.020564f, 0.023249f, 0.006899f, 0.010947f, 0.026750f, -0.003040f, -0.022036f, -0.034524f, 0.010751f, -0.013313f, -0.001374f, 0.008816f, -0.009673f, 0.013481f, 0.034073f, -0.023473f, 0.014002f, -0.011752f, -0.014463f, 0.006259f, 0.030258f, 0.034278f, 0.009334f, 0.020924f, -0.013382f, 0.009550f, 0.010493f, -0.057816f, 0.016827f, 0.017988f, 0.004550f, -0.018793f, 0.000219f, -0.035877f, 0.042219f, 0.024512f, -0.012416f, -0.014511f, -0.020015f, -0.011307f, 0.030738f, -0.030949f, -0.016786f, -0.005054f, -0.004423f, -0.007038f, 0.005044f, -0.020625f, -0.019912f, -0.012567f, -0.015187f, -0.004718f, -0.019958f, -0.003260f, -0.013182f, -0.045653f, -0.028232f, -0.011553f, -0.006545f, + 0.005963f, 0.008192f, -0.000594f, 0.001946f, 0.012789f, 0.006909f, 0.006408f, 0.032435f, 0.006369f, 0.011318f, 0.019605f, 0.043304f, 0.036322f, 0.002409f, -0.014712f, -0.027647f, 0.025331f, -0.005924f, 0.068844f, 0.014224f, 0.030743f, -0.003206f, 0.003716f, -0.027409f, -0.001332f, 0.023809f, 0.013580f, 0.017748f, -0.021069f, -0.014516f, -0.027074f, -0.051993f, 0.028639f, -0.047106f, -0.006239f, 0.054151f, 0.007671f, -0.041976f, 0.013193f, 0.014342f, -0.026276f, -0.022237f, 0.001593f, 0.015879f, 0.041162f, -0.003043f, -0.029600f, -0.032083f, -0.000393f, -0.018563f, 0.006488f, 0.004721f, -0.033106f, -0.030612f, -0.054883f, -0.017522f, -0.014944f, -0.039171f, -0.024542f, -0.001140f, -0.016372f, -0.012054f, -0.008615f, -0.003990f, -0.036328f, -0.021148f, -0.021717f, -0.012355f, 0.013235f, -0.033006f, 0.004022f, 0.025970f, 0.033550f, -0.008293f, 0.010436f, 0.017441f, -0.029784f, 0.017034f, -0.011841f, 0.027260f, -0.011695f, 0.001767f, -0.012681f, -0.003982f, 0.057735f, -0.012246f, 0.023081f, -0.041515f, -0.004530f, -0.000840f, -0.036318f, 0.035238f, 0.003807f, -0.014052f, 0.028449f, -0.011468f, + 0.009386f, 0.050252f, -0.017370f, -0.028934f, 0.022443f, -0.006318f, -0.053995f, 0.022323f, -0.072305f, -0.041979f, 0.034992f, 0.022710f, 0.010206f, 0.015005f, 0.007040f, -0.001230f, -0.044731f, -0.024277f, -0.009512f, -0.009823f, 0.077556f, 0.041940f, 0.000396f, -0.040101f, 0.020755f, -0.041801f, -0.033405f, 0.005791f, 0.034611f, 0.067466f, -0.010369f, 0.033947f, -0.011970f, 0.024006f, 0.041373f, 0.022664f, 0.026528f, 0.013774f, -0.007455f, -0.033941f, -0.034582f, -0.010829f, -0.032691f, -0.009962f, -0.005864f, -0.007678f, 0.026445f, -0.004741f, -0.067444f, 0.003720f, 0.016387f, 0.015379f, 0.040466f, -0.004382f, -0.080619f, 0.045663f, -0.036118f, 0.011639f, -0.007981f, 0.026989f, 0.039367f, -0.044076f, -0.003285f, -0.022047f, -0.038611f, 0.027707f, -0.019423f, -0.047212f, 0.018078f, 0.027620f, 0.044826f, 0.012119f, -0.007757f, 0.005128f, 0.036332f, -0.029659f, 0.057660f, -0.018109f, -0.017544f, -0.004837f, 0.034295f, -0.036602f, 0.001669f, 0.005297f, -0.105643f, -0.014353f, 0.029374f, -0.013572f, 0.001990f, 0.016203f, 0.003056f, -0.002409f, 0.002072f, 0.039839f, 0.030189f, -0.011301f, + -0.003072f, 0.044509f, 0.029407f, -0.081926f, -0.046628f, 0.056812f, 0.065568f, -0.034549f, -0.011540f, -0.091928f, -0.050717f, 0.014102f, -0.003633f, 0.013184f, -0.048541f, -0.029864f, -0.032945f, 0.051054f, 0.075146f, -0.002416f, 0.021058f, -0.010778f, -0.005373f, 0.000483f, 0.018306f, 0.033721f, 0.009210f, -0.009788f, -0.004647f, -0.005757f, -0.042706f, -0.023224f, -0.043304f, -0.003928f, 0.015877f, -0.016744f, 0.029918f, -0.018238f, -0.005457f, 0.045705f, -0.018494f, 0.026964f, 0.019486f, -0.005038f, -0.038766f, -0.027032f, -0.021757f, 0.010778f, 0.081026f, 0.017199f, 0.045336f, 0.053037f, 0.042377f, 0.032588f, 0.029677f, -0.038558f, 0.005495f, -0.002339f, 0.062421f, 0.032422f, 0.038984f, 0.065617f, -0.023646f, -0.034366f, 0.021338f, 0.057527f, -0.078835f, 0.005949f, 0.015175f, 0.048608f, -0.059972f, -0.094962f, -0.006951f, 0.041710f, 0.022798f, 0.028916f, 0.045821f, -0.010634f, -0.007733f, 0.021390f, -0.033563f, 0.026935f, -0.005885f, -0.016397f, -0.042208f, 0.018835f, -0.023046f, -0.031752f, 0.021435f, 0.055396f, 0.010617f, -0.014424f, 0.025109f, 0.055719f, 0.013840f, 0.015478f, + -0.001394f, -0.000607f, 0.018869f, -0.037323f, -0.002543f, -0.055877f, 0.027485f, -0.044087f, -0.009290f, 0.031645f, 0.009427f, -0.022885f, 0.000665f, -0.027265f, 0.061296f, 0.013898f, 0.016210f, 0.040042f, 0.068015f, -0.025000f, 0.018293f, -0.029780f, 0.007025f, 0.031878f, 0.053290f, 0.019438f, -0.017945f, 0.066104f, 0.002096f, 0.001350f, -0.041112f, 0.007968f, 0.031493f, -0.007127f, 0.029785f, -0.039121f, 0.062234f, 0.077633f, -0.093586f, 0.003677f, -0.013140f, 0.024856f, -0.022875f, -0.005237f, 0.028354f, -0.025159f, -0.101564f, 0.007344f, 0.071354f, -0.058258f, 0.020611f, -0.008543f, -0.021894f, -0.032883f, 0.073719f, 0.000819f, -0.007058f, 0.017687f, -0.087843f, 0.059122f, 0.006226f, -0.043775f, 0.003873f, -0.089858f, -0.021350f, 0.005586f, -0.018162f, -0.071306f, -0.008530f, -0.046373f, -0.012254f, 0.044793f, 0.009724f, 0.058419f, 0.023391f, 0.022919f, 0.013141f, -0.018073f, 0.045641f, -0.021759f, -0.000586f, 0.023232f, 0.009915f, -0.026429f, 0.022779f, 0.011061f, 0.054355f, 0.024164f, -0.009579f, 0.034732f, -0.025837f, 0.046318f, 0.015542f, -0.046542f, -0.049674f, 0.028135f, + 0.033066f, 0.015877f, 0.005917f, -0.021180f, -0.031325f, 0.012386f, -0.030689f, -0.044932f, -0.013649f, -0.005196f, -0.042679f, -0.013286f, 0.017658f, -0.026811f, -0.047947f, 0.017269f, 0.019940f, 0.005251f, -0.004218f, 0.000847f, -0.006317f, 0.021685f, 0.086445f, 0.021345f, -0.000093f, 0.001277f, -0.026704f, -0.043211f, -0.017850f, 0.074357f, 0.078334f, 0.043624f, 0.011672f, 0.073458f, 0.037921f, -0.008824f, -0.087220f, -0.064468f, -0.049680f, -0.101490f, -0.035020f, -0.007774f, 0.020703f, 0.039096f, -0.016682f, 0.050384f, -0.057404f, 0.046616f, -0.005812f, 0.062196f, -0.039997f, 0.036066f, -0.058985f, 0.051846f, -0.047566f, -0.019853f, 0.072077f, 0.016922f, 0.058031f, 0.082762f, 0.008942f, -0.006200f, -0.033800f, -0.002271f, 0.052926f, 0.013687f, -0.017800f, -0.057354f, 0.005770f, 0.012037f, 0.028280f, 0.017357f, 0.023794f, 0.014892f, -0.032672f, -0.053181f, -0.021643f, 0.052931f, 0.021336f, 0.167271f, -0.051426f, -0.043658f, 0.055880f, 0.086334f, 0.019657f, -0.000555f, 0.024350f, 0.006601f, 0.029461f, -0.024141f, 0.012088f, 0.040980f, 0.046497f, 0.030537f, 0.131741f, -0.015303f, + -0.013966f, -0.007257f, 0.069589f, 0.041035f, -0.030665f, 0.036141f, 0.002619f, 0.012641f, -0.024255f, 0.060444f, -0.055229f, 0.005401f, 0.095234f, -0.065919f, 0.200039f, -0.088750f, 0.097921f, 0.086948f, -0.080512f, -0.076933f, 0.090165f, 0.000400f, -0.011924f, 0.028697f, 0.047173f, -0.105005f, -0.038421f, 0.057249f, -0.125555f, -0.084913f, -0.050038f, 0.086263f, 0.197777f, 0.048916f, -0.147614f, -0.038918f, -0.150929f, -0.085691f, 0.130626f, 0.070779f, 0.123031f, 0.060517f, -0.085819f, -0.147660f, -0.104688f, -0.031121f, 0.068469f, 0.068092f, 0.048090f, 0.019494f, -0.033708f, -0.161314f, -0.183656f, -0.046022f, 0.147629f, 0.250680f, 0.177641f, -0.038373f, -0.116296f, -0.178254f, -0.124091f, -0.109406f, 0.003927f, 0.035289f, 0.143726f, 0.143153f, -0.077126f, -0.057040f, -0.184128f, -0.181244f, -0.059133f, 0.010408f, 0.184981f, 0.260722f, 0.122416f, -0.086357f, -0.277104f, -0.215612f, -0.149151f, 0.065804f, 0.163171f, 0.091470f, 0.066371f, 0.045014f, -0.164337f, -0.039856f, -0.092580f, 0.025905f, -0.010613f, 0.089032f, 0.158089f, 0.113000f, -0.143924f, -0.304967f, -0.220165f, 0.012381f, + 0.169700f, -0.016807f, -0.034545f, 0.068674f, 0.021361f, -0.055529f, -0.052460f, 0.000236f, -0.084503f, -0.010366f, 0.012549f, 0.009763f, -0.007303f, 0.002217f, -0.028355f, -0.003430f, -0.003253f, 0.014705f, -0.009697f, 0.039085f, -0.010209f, -0.007362f, -0.010720f, -0.012089f, 0.024471f, 0.007098f, -0.011499f, 0.037884f, 0.002636f, -0.066913f, -0.033210f, 0.018639f, 0.033143f, -0.011006f, 0.004359f, 0.046131f, -0.000731f, 0.006444f, -0.037149f, -0.016623f, 0.012077f, -0.008001f, -0.007799f, -0.004820f, 0.031028f, 0.011180f, -0.011220f, -0.035812f, -0.013566f, -0.001946f, -0.031965f, 0.003303f, -0.036533f, -0.024923f, -0.016391f, -0.033151f, 0.053391f, -0.009257f, -0.022314f, 0.022241f, 0.001114f, -0.051173f, -0.001337f, 0.051434f, 0.043472f, -0.023641f, 0.034352f, 0.005642f, 0.033189f, -0.033973f, -0.047716f, 0.019874f, 0.025588f, 0.020494f, 0.020791f, -0.017381f, 0.022850f, -0.033575f, 0.028355f, 0.025681f, -0.041145f, 0.082440f, 0.126280f, -0.016787f, -0.046599f, -0.040441f, 0.116342f, 0.052182f, 0.112550f, 0.060263f, 0.000105f, -0.052771f, -0.011773f, 0.028169f, 0.052721f, 0.024688f, + -0.024686f, -0.006703f, 0.025021f, 0.036502f, 0.004322f, 0.007565f, -0.026381f, 0.003896f, -0.012959f, 0.016047f, 0.018598f, 0.048266f, 0.041946f, -0.023602f, 0.003155f, -0.026436f, 0.006014f, 0.021263f, 0.032945f, 0.001192f, -0.016656f, -0.001439f, -0.029599f, 0.022625f, -0.007442f, 0.008378f, 0.021655f, -0.001192f, 0.029067f, -0.016522f, -0.009176f, -0.008896f, -0.031842f, -0.020472f, -0.048095f, -0.011032f, -0.054759f, 0.001391f, -0.019662f, 0.041688f, 0.005261f, 0.010389f, -0.042835f, 0.014719f, -0.001177f, -0.021469f, 0.028809f, -0.019683f, -0.010243f, 0.003945f, 0.018238f, -0.006421f, -0.013063f, 0.063809f, 0.019947f, 0.010516f, 0.023069f, -0.025066f, -0.048559f, -0.100957f, -0.015374f, 0.136308f, 0.206631f, 0.175945f, 0.136389f, -0.008385f, 0.014308f, -0.100709f, -0.117182f, -0.187023f, -0.110238f, -0.117682f, -0.039540f, 0.015251f, 0.079286f, 0.058416f, 0.175354f, 0.154992f, 0.048473f, 0.010741f, -0.030447f, -0.060704f, -0.098576f, -0.035429f, -0.101113f, -0.026712f, -0.050949f, -0.031635f, -0.026285f, 0.004164f, -0.001897f, 0.032017f, 0.044341f, 0.071644f, 0.075279f, 0.093390f, + 0.077969f, -0.011856f, 0.003671f, -0.003282f, 0.010892f, -0.049664f, 0.014264f, -0.053256f, -0.130831f, -0.065098f, -0.099463f, -0.162001f, -0.051982f, -0.017997f, -0.070053f, 0.016933f, 0.042347f, 0.105088f, 0.123475f, 0.186092f, 0.114139f, 0.091973f, 0.090506f, 0.053205f, -0.027580f, 0.000801f, -0.106367f, -0.094239f, -0.150905f, -0.179580f, -0.204641f, -0.155560f, -0.121863f, -0.029976f, -0.021531f, -0.008719f, 0.036086f, 0.062198f, 0.144298f, 0.092884f, 0.045077f, -0.004171f}, + {-0.000497f, -0.001580f, -0.004372f, 0.003520f, 0.009140f, -0.003241f, 0.005737f, 0.006635f, 0.001627f, 0.003363f, 0.007830f, 0.008979f, -0.003302f, 0.002299f, -0.006000f, -0.007388f, 0.008837f, -0.017604f, 0.000987f, -0.011187f, -0.007538f, -0.004443f, -0.001739f, 0.020681f, -0.000296f, 0.005171f, 0.005358f, 0.000784f, -0.001690f, -0.000909f, -0.001564f, 0.002118f, 0.005316f, 0.004530f, -0.001402f, 0.000192f, -0.001546f, -0.007204f, 0.003314f, 0.002018f, -0.002780f, -0.010954f, -0.009743f, -0.000328f, 0.000623f, 0.001321f, 0.006010f, 0.006567f, -0.008301f, -0.005861f, -0.006169f, 0.005498f, 0.008503f, 0.005247f, 0.011369f, -0.000354f, -0.001174f, -0.002428f, 0.007588f, -0.004794f, 0.001042f, 0.000760f, -0.006201f, -0.009264f, -0.003645f, 0.009792f, 0.000218f, 0.014802f, 0.000466f, -0.001735f, 0.000349f, 0.009703f, -0.001483f, -0.000793f, 0.005248f, 0.003876f, 0.013648f, 0.005370f, -0.007054f, -0.001046f, 0.004660f, -0.000723f, 0.004964f, -0.012491f, -0.009144f, -0.002083f, -0.010776f, 0.004571f, -0.002523f, -0.001058f, -0.007336f, -0.003091f, 0.006513f, 0.006774f, -0.002778f, -0.001929f, + -0.004596f, -0.010097f, 0.011196f, 0.006854f, 0.000118f, 0.001284f, -0.000802f, 0.000414f, 0.008974f, -0.004563f, 0.001496f, -0.014574f, -0.012195f, -0.002941f, 0.000897f, -0.010148f, -0.002091f, 0.003679f, 0.000679f, 0.000226f, -0.005326f, -0.003909f, 0.009372f, -0.004413f, -0.004296f, -0.001335f, -0.001567f, 0.004220f, -0.002434f, -0.006289f, -0.000446f, 0.005472f, -0.008068f, 0.000291f, -0.008630f, 0.000522f, -0.006388f, 0.009231f, -0.000775f, -0.009942f, -0.001679f, -0.001103f, 0.000918f, -0.014214f, -0.001953f, 0.000937f, -0.009635f, 0.004033f, -0.000050f, -0.011159f, 0.004683f, 0.006207f, -0.005954f, -0.007176f, -0.011921f, 0.005507f, 0.004294f, -0.000197f, -0.010088f, 0.004517f, -0.012598f, -0.003636f, -0.001631f, -0.006513f, 0.006296f, 0.014182f, -0.005650f, -0.001953f, 0.000863f, -0.005935f, 0.004301f, -0.000918f, -0.004572f, -0.008156f, -0.004092f, 0.012851f, 0.012662f, 0.006987f, 0.014684f, 0.008512f, 0.004870f, 0.013616f, -0.008139f, 0.003041f, 0.006121f, -0.000201f, 0.002673f, -0.003952f, 0.002953f, -0.018691f, 0.000770f, -0.000979f, 0.007173f, -0.004124f, -0.001981f, -0.001163f, + 0.005626f, -0.005782f, -0.000511f, 0.001879f, 0.004132f, 0.003771f, -0.000506f, -0.006150f, 0.001727f, 0.002486f, 0.005147f, 0.003753f, 0.005924f, -0.005692f, -0.002962f, -0.000762f, -0.010012f, -0.000892f, 0.003488f, 0.009550f, 0.010909f, -0.000959f, 0.006361f, 0.004678f, 0.000002f, 0.004325f, 0.005321f, 0.007186f, -0.001815f, 0.000555f, -0.004092f, 0.001564f, -0.003408f, 0.003710f, -0.005527f, -0.005140f, 0.004024f, 0.000750f, -0.012450f, -0.012607f, 0.004953f, -0.001892f, 0.010521f, 0.009680f, 0.001254f, -0.000243f, 0.019932f, -0.005778f, -0.000065f, 0.015894f, 0.001069f, -0.010002f, -0.013507f, 0.009548f, -0.003693f, -0.000477f, -0.008240f, 0.002117f, -0.005792f, 0.006285f, 0.030831f, -0.011703f, -0.008627f, -0.011578f, -0.011576f, 0.001581f, -0.009393f, -0.024629f, -0.000307f, 0.001791f, 0.000345f, -0.010181f, -0.001735f, 0.007164f, -0.009551f, -0.006441f, 0.014498f, 0.004026f, -0.003395f, -0.004076f, 0.009394f, -0.005244f, 0.006772f, 0.005297f, -0.012823f, -0.009348f, -0.007535f, 0.007775f, -0.006450f, -0.004675f, -0.003460f, -0.005098f, -0.000579f, -0.009555f, 0.000150f, -0.003449f, + 0.002217f, -0.002032f, -0.019037f, 0.008001f, -0.010674f, 0.007552f, 0.001508f, -0.016528f, 0.003068f, 0.009586f, 0.003055f, 0.016549f, -0.007619f, 0.000101f, 0.001694f, 0.003322f, 0.005757f, -0.007249f, 0.001756f, 0.005230f, -0.007523f, 0.003286f, 0.004693f, -0.004855f, 0.002593f, -0.002622f, -0.016858f, 0.004945f, 0.017090f, 0.013249f, 0.016092f, 0.002298f, -0.002607f, -0.013603f, -0.006194f, -0.006574f, -0.004222f, 0.013333f, 0.019782f, 0.001050f, -0.000469f, 0.013244f, -0.021113f, 0.000157f, -0.000884f, -0.000648f, -0.006240f, -0.007619f, 0.008958f, 0.009673f, 0.001309f, -0.002381f, 0.004972f, -0.010843f, -0.007027f, 0.008044f, -0.007818f, 0.016943f, 0.016591f, 0.002498f, 0.010694f, 0.007982f, 0.002849f, -0.007009f, 0.003687f, -0.000375f, -0.010731f, 0.011727f, 0.000330f, 0.005543f, 0.010933f, -0.011191f, -0.002901f, -0.013275f, -0.001480f, 0.003285f, 0.014245f, -0.012679f, -0.003419f, 0.009776f, -0.000168f, -0.007883f, 0.015769f, -0.011044f, -0.022137f, 0.004651f, -0.011400f, -0.005409f, 0.009031f, -0.005032f, 0.003883f, 0.002437f, -0.002796f, 0.011548f, -0.005674f, 0.005827f, + -0.003148f, 0.000893f, -0.022407f, 0.005264f, 0.020139f, 0.002281f, 0.002754f, 0.006907f, 0.018873f, 0.003311f, -0.019026f, 0.021312f, 0.008653f, 0.008154f, 0.012171f, 0.011621f, -0.000279f, -0.003116f, 0.011503f, 0.009825f, 0.002780f, -0.007737f, 0.010008f, 0.005658f, 0.014983f, 0.018624f, 0.006526f, -0.003539f, 0.000190f, 0.000742f, 0.007228f, 0.023483f, 0.013261f, -0.011619f, 0.021732f, 0.001816f, -0.002792f, 0.003854f, -0.016190f, 0.018905f, -0.002422f, 0.001337f, -0.002141f, 0.005608f, -0.002385f, 0.010318f, -0.012927f, 0.019397f, 0.015725f, 0.000539f, -0.002755f, -0.009024f, -0.019188f, -0.005469f, 0.007952f, -0.003296f, -0.006966f, 0.011543f, 0.012442f, -0.006884f, -0.006851f, -0.023537f, -0.008127f, -0.001692f, -0.000633f, -0.026394f, 0.014842f, 0.003066f, -0.015802f, -0.012030f, 0.005478f, -0.004737f, 0.002804f, -0.002129f, 0.002498f, -0.004392f, 0.002857f, 0.010942f, -0.013637f, 0.000579f, -0.000532f, 0.001170f, 0.020281f, 0.012214f, -0.000836f, 0.026813f, 0.011413f, 0.024285f, 0.004981f, 0.008701f, 0.024514f, -0.009207f, -0.017394f, -0.009852f, 0.022892f, 0.006517f, + -0.013886f, 0.018710f, -0.005522f, -0.009692f, 0.015426f, 0.038847f, -0.010421f, 0.002716f, 0.005487f, 0.008092f, -0.010485f, 0.002083f, 0.020372f, 0.003087f, 0.025191f, -0.004760f, 0.027100f, 0.020436f, 0.006068f, 0.017284f, 0.009839f, -0.008962f, 0.006333f, -0.001630f, -0.003004f, 0.003557f, 0.001345f, -0.000863f, 0.006771f, 0.005999f, 0.017354f, 0.013005f, -0.015461f, 0.006190f, 0.006218f, -0.010043f, 0.000148f, -0.025021f, -0.034233f, 0.014524f, -0.009149f, -0.021000f, -0.005244f, -0.010810f, 0.014002f, 0.004259f, -0.007391f, -0.015559f, 0.012458f, -0.010958f, 0.007327f, -0.012448f, 0.001280f, -0.004442f, 0.019587f, 0.004598f, -0.009105f, 0.007701f, -0.014536f, 0.001771f, 0.000829f, 0.003714f, -0.008751f, 0.009990f, 0.011498f, -0.001396f, -0.007219f, -0.026086f, -0.021921f, -0.017255f, 0.008274f, 0.002163f, 0.004450f, -0.021386f, 0.013799f, 0.009372f, 0.017102f, -0.018334f, 0.017639f, 0.013177f, -0.010089f, -0.008776f, -0.004901f, 0.017509f, 0.012538f, -0.007812f, 0.002154f, 0.026562f, 0.013917f, 0.006825f, 0.015867f, 0.010567f, 0.004603f, -0.008836f, 0.002465f, 0.001218f, + -0.003266f, -0.009780f, 0.024150f, 0.011064f, -0.021490f, 0.014914f, 0.015336f, 0.014788f, 0.012107f, 0.003183f, -0.013144f, 0.000506f, -0.001232f, 0.020728f, 0.003360f, 0.009345f, 0.019370f, -0.003210f, -0.019773f, 0.004710f, 0.011706f, 0.021021f, -0.027048f, -0.015455f, 0.008373f, 0.000522f, 0.003358f, -0.016206f, -0.003233f, -0.015698f, -0.001343f, 0.007841f, -0.004330f, -0.008500f, -0.009646f, 0.004623f, -0.001647f, -0.005505f, 0.009883f, 0.001257f, -0.017170f, 0.017540f, 0.011349f, -0.005233f, 0.007065f, 0.010601f, -0.011540f, -0.003890f, 0.045019f, -0.001399f, 0.017654f, 0.012336f, -0.037303f, -0.019811f, -0.001930f, -0.001446f, -0.000243f, 0.021433f, 0.004987f, -0.010180f, 0.022216f, 0.013713f, -0.002514f, -0.003385f, 0.007272f, -0.003326f, -0.007506f, -0.016416f, -0.019510f, 0.011262f, -0.004047f, -0.008980f, -0.000662f, -0.030454f, -0.005415f, 0.002449f, 0.017344f, -0.019920f, -0.005552f, 0.003131f, 0.001721f, 0.004981f, 0.001880f, 0.022328f, -0.024968f, -0.007800f, 0.006015f, -0.000131f, -0.014569f, -0.002401f, 0.020115f, 0.017786f, 0.015059f, -0.003140f, -0.024844f, -0.010523f, + 0.009522f, -0.001777f, 0.017330f, 0.000230f, 0.000042f, -0.011216f, -0.007443f, 0.016346f, -0.017767f, 0.014174f, 0.009988f, -0.010955f, -0.006215f, -0.000488f, 0.002313f, -0.010773f, 0.007024f, -0.032977f, -0.003097f, 0.005693f, 0.021891f, 0.003909f, -0.001883f, 0.014905f, -0.010945f, 0.031091f, -0.030850f, -0.001746f, -0.007301f, 0.006165f, -0.002328f, -0.001275f, 0.006847f, -0.004440f, -0.011007f, -0.005579f, -0.006823f, -0.016726f, -0.003630f, 0.014043f, -0.003702f, -0.006689f, 0.018261f, 0.001028f, 0.022135f, -0.021014f, -0.013524f, 0.029681f, -0.003573f, -0.000313f, 0.001011f, -0.016376f, -0.002725f, -0.020769f, 0.005879f, -0.025190f, -0.001292f, 0.021391f, -0.007082f, 0.015107f, 0.017203f, 0.011961f, 0.013435f, -0.016394f, 0.017437f, 0.003708f, -0.047610f, -0.006155f, 0.006316f, -0.002037f, -0.005761f, -0.018316f, 0.015395f, -0.015276f, -0.003899f, -0.017516f, -0.018821f, -0.026265f, 0.024740f, 0.002323f, 0.028906f, -0.012432f, 0.021628f, 0.031772f, -0.019951f, 0.026449f, -0.030179f, -0.021915f, -0.027480f, -0.006471f, -0.019742f, 0.009130f, 0.007696f, 0.002436f, 0.023213f, 0.036429f, + 0.006357f, -0.010968f, -0.019241f, 0.011562f, 0.035474f, -0.000688f, 0.010863f, 0.000761f, 0.014736f, 0.008469f, 0.011530f, 0.017764f, -0.021696f, -0.002836f, -0.007462f, 0.028582f, 0.022940f, -0.002126f, 0.035056f, 0.016975f, 0.004004f, -0.033134f, -0.014960f, -0.025519f, -0.010367f, 0.001420f, 0.010165f, -0.009840f, 0.002249f, 0.033616f, -0.005546f, -0.001039f, 0.002728f, 0.034570f, -0.020827f, -0.009840f, -0.007915f, -0.004563f, -0.020357f, 0.023489f, 0.002606f, 0.015411f, -0.024607f, 0.002437f, -0.001815f, -0.016265f, -0.005079f, -0.029242f, 0.009839f, -0.000468f, 0.006942f, -0.004446f, -0.000696f, -0.033707f, -0.010097f, 0.011890f, 0.021891f, -0.006897f, 0.006557f, 0.042764f, -0.001667f, 0.001831f, 0.009234f, 0.019066f, -0.017120f, 0.003850f, 0.023548f, -0.013206f, 0.017740f, 0.005007f, 0.018771f, -0.021189f, -0.008597f, 0.005666f, 0.009400f, -0.020280f, -0.031082f, 0.008702f, -0.003379f, -0.031207f, 0.008540f, 0.003272f, 0.028353f, 0.025234f, -0.023298f, -0.027774f, 0.006245f, -0.021150f, -0.011233f, 0.001077f, 0.042294f, 0.000820f, -0.005370f, -0.037563f, -0.018918f, -0.003003f, + -0.028176f, -0.042553f, 0.029421f, -0.010728f, -0.013496f, -0.002114f, 0.031918f, -0.009594f, 0.003532f, -0.005976f, -0.006351f, -0.018071f, -0.009825f, 0.003603f, -0.044696f, -0.028251f, -0.008211f, -0.015755f, -0.015091f, -0.004604f, -0.017493f, 0.015898f, 0.007039f, 0.005620f, -0.010637f, 0.008505f, -0.064532f, 0.060952f, 0.035330f, -0.005128f, -0.008128f, 0.034847f, 0.002103f, -0.019065f, -0.028732f, -0.002391f, -0.010051f, -0.010575f, -0.017281f, -0.016115f, 0.022131f, 0.022406f, -0.009346f, 0.047339f, -0.025235f, -0.018365f, -0.018767f, 0.002852f, 0.014630f, -0.049779f, 0.015355f, -0.012656f, 0.027061f, -0.024548f, 0.011400f, 0.006088f, 0.030376f, 0.002906f, 0.071318f, 0.023715f, -0.001884f, 0.003413f, -0.028206f, -0.035641f, 0.044321f, -0.012975f, 0.004577f, 0.059753f, -0.016024f, -0.002609f, -0.013278f, 0.046628f, 0.008338f, -0.018939f, 0.026768f, -0.009736f, 0.040028f, 0.021558f, 0.009457f, 0.006221f, -0.005213f, -0.015385f, -0.005819f, -0.004051f, -0.044380f, -0.010791f, -0.007842f, 0.024274f, -0.014362f, 0.004693f, 0.007122f, -0.031103f, -0.047481f, -0.001534f, 0.039192f, -0.002565f, + 0.034658f, -0.006071f, -0.050980f, -0.019216f, 0.001128f, 0.011405f, 0.007826f, -0.040493f, -0.000918f, -0.011535f, 0.028147f, -0.030040f, 0.035864f, 0.055169f, 0.034261f, -0.011158f, 0.005117f, 0.022276f, -0.009557f, 0.043205f, 0.048244f, 0.044064f, 0.012591f, 0.048284f, -0.003548f, -0.019533f, 0.004253f, -0.025406f, -0.033964f, 0.017137f, -0.015812f, 0.038989f, 0.018298f, 0.009525f, -0.015428f, -0.050767f, -0.016144f, -0.036333f, 0.021338f, 0.026431f, -0.000262f, 0.012898f, 0.008897f, 0.012774f, 0.010845f, 0.004835f, -0.002685f, 0.006222f, -0.007384f, 0.013739f, -0.024384f, -0.068652f, -0.027275f, 0.037590f, 0.002447f, -0.011213f, -0.022681f, -0.000145f, 0.031952f, 0.040387f, 0.008948f, -0.024800f, -0.004012f, 0.032310f, -0.038725f, 0.003728f, -0.004465f, 0.028912f, 0.033434f, -0.026467f, 0.050528f, 0.009703f, 0.002479f, 0.070711f, 0.000861f, -0.022210f, 0.025307f, -0.011847f, 0.004102f, -0.015159f, 0.005853f, 0.046929f, 0.006050f, 0.059777f, 0.025928f, -0.052402f, -0.056532f, -0.012668f, 0.015599f, 0.031770f, -0.043625f, -0.015955f, -0.005647f, 0.053574f, 0.050152f, -0.042680f, + -0.000840f, -0.026302f, 0.017085f, -0.009535f, 0.057203f, -0.000060f, -0.011708f, 0.036035f, -0.006970f, -0.045123f, -0.021796f, -0.008957f, 0.045301f, -0.042934f, 0.023008f, 0.066315f, 0.027020f, 0.030283f, -0.030835f, 0.022367f, 0.039134f, 0.028057f, -0.050565f, -0.027793f, 0.036174f, 0.099225f, 0.008827f, 0.019652f, -0.026816f, 0.006762f, 0.001280f, -0.007178f, -0.024937f, 0.005987f, -0.006921f, 0.046404f, 0.041570f, -0.053386f, -0.019675f, 0.051540f, 0.030348f, 0.017003f, 0.008762f, 0.026761f, 0.037056f, 0.008446f, 0.023464f, 0.016341f, -0.021400f, 0.001246f, -0.020822f, -0.013203f, 0.010009f, -0.007140f, 0.007548f, -0.023225f, -0.015133f, 0.012015f, -0.000213f, 0.017470f, 0.019430f, -0.049637f, 0.039066f, 0.004525f, 0.032312f, -0.034387f, 0.022328f, 0.026027f, -0.017991f, -0.039018f, -0.032267f, -0.042999f, -0.035796f, -0.036194f, 0.016694f, 0.056643f, 0.020699f, 0.015303f, 0.033385f, -0.001238f, 0.004898f, -0.026653f, 0.045623f, -0.054265f, -0.095430f, 0.030772f, -0.016641f, -0.000038f, -0.079020f, 0.016186f, 0.035331f, -0.001344f, 0.026473f, 0.006797f, 0.000194f, -0.011834f, + 0.024040f, 0.017566f, 0.023001f, -0.032682f, -0.017112f, -0.004365f, 0.021116f, -0.043609f, 0.073151f, 0.035060f, -0.005838f, 0.040239f, 0.024130f, 0.038401f, -0.019739f, -0.025119f, -0.024551f, 0.046496f, 0.016695f, 0.008830f, 0.041912f, -0.035778f, -0.117147f, -0.007250f, 0.008408f, 0.014615f, -0.065590f, 0.051968f, 0.038016f, -0.070414f, -0.053948f, 0.002471f, 0.030171f, 0.003236f, 0.017608f, 0.038472f, -0.008934f, 0.024214f, -0.033177f, -0.038484f, -0.030071f, -0.039980f, -0.062194f, 0.018626f, 0.008135f, -0.041768f, 0.058066f, 0.022879f, -0.011919f, -0.012443f, -0.031243f, -0.023897f, -0.055751f, -0.030439f, 0.023079f, 0.052543f, -0.016889f, 0.006283f, 0.024174f, -0.044482f, 0.036284f, 0.045778f, 0.010335f, -0.010204f, 0.042372f, 0.011694f, 0.009189f, -0.026026f, -0.026215f, -0.001023f, 0.063891f, -0.016198f, -0.043817f, 0.000308f, -0.054700f, -0.068808f, -0.039329f, -0.010284f, -0.025440f, -0.044825f, -0.023005f, -0.024231f, 0.029314f, 0.056721f, 0.021405f, -0.026350f, -0.054650f, 0.058659f, 0.032135f, -0.028827f, -0.014950f, -0.015570f, 0.003728f, 0.013486f, -0.017740f, 0.030236f, + 0.028988f, 0.001140f, -0.018668f, -0.018659f, -0.016574f, -0.002726f, 0.011663f, -0.009192f, -0.018323f, -0.045688f, 0.014547f, 0.038941f, -0.022044f, 0.034287f, 0.001834f, 0.022698f, -0.018823f, 0.025250f, 0.076727f, -0.029406f, 0.034063f, 0.064791f, 0.012486f, -0.012733f, -0.017151f, 0.017779f, 0.002666f, 0.032152f, -0.024369f, 0.088767f, -0.026498f, -0.062525f, 0.015567f, -0.029701f, 0.073325f, 0.021157f, -0.020405f, 0.001519f, -0.040980f, -0.062146f, 0.075064f, 0.004941f, -0.016846f, 0.067887f, -0.034129f, 0.004827f, -0.017546f, 0.036238f, -0.049111f, -0.066018f, -0.037917f, 0.005211f, 0.031051f, 0.037314f, 0.027051f, 0.036078f, 0.088097f, -0.033523f, 0.035296f, 0.055446f, -0.008169f, 0.001708f, 0.066531f, 0.007385f, -0.036153f, -0.041964f, -0.037049f, 0.068485f, -0.045518f, 0.027431f, 0.032305f, -0.021463f, 0.006922f, -0.036968f, -0.008106f, 0.031037f, -0.026724f, 0.022654f, -0.008609f, -0.046359f, -0.102831f, -0.008412f, 0.093580f, 0.039868f, 0.010182f, -0.017375f, -0.027250f, -0.003948f, -0.035911f, 0.013126f, -0.050874f, 0.063271f, 0.005514f, 0.008918f, 0.006090f, -0.019365f, + -0.061289f, -0.022227f, 0.051263f, -0.039178f, -0.009227f, -0.026480f, 0.023728f, -0.018353f, 0.070752f, -0.009150f, 0.015837f, -0.023137f, -0.063063f, 0.016579f, -0.047658f, -0.008778f, -0.002487f, -0.088140f, -0.074470f, -0.069661f, 0.026085f, -0.010608f, -0.036906f, -0.022596f, -0.022670f, -0.020091f, -0.032406f, -0.020423f, -0.003369f, -0.078071f, 0.025636f, 0.012540f, 0.033183f, -0.014445f, 0.074290f, -0.003671f, 0.017972f, -0.020741f, -0.003580f, 0.041820f, -0.054335f, -0.012639f, -0.016873f, 0.029071f, 0.015998f, 0.034948f, -0.013867f, -0.069873f, 0.019349f, 0.001860f, 0.116407f, 0.121046f, 0.013455f, 0.001951f, 0.027226f, 0.014932f, 0.029150f, 0.052570f, 0.018225f, 0.054512f, 0.080298f, -0.019686f, 0.009575f, -0.066340f, -0.010584f, 0.009237f, -0.009743f, -0.019480f, -0.041638f, -0.033748f, 0.017820f, 0.019066f, -0.089921f, 0.063637f, 0.016103f, 0.089641f, -0.006460f, -0.017641f, 0.028289f, -0.006203f, 0.093272f, 0.023897f, -0.005720f, 0.017929f, 0.017795f, -0.025565f, -0.058319f, -0.045515f, -0.023339f, 0.069811f, 0.000294f, 0.076656f, 0.008946f, 0.074791f, -0.022258f, -0.104937f, + -0.039250f, -0.031298f, 0.053631f, 0.005269f, -0.050584f, -0.074697f, -0.051017f, -0.011896f, 0.063562f, -0.056954f, -0.047326f, -0.033768f, 0.057315f, -0.030287f, -0.015187f, -0.075678f, -0.070787f, 0.019772f, 0.014635f, 0.094305f, 0.028526f, -0.013413f, 0.003781f, 0.003488f, 0.070223f, 0.029378f, -0.036497f, 0.069962f, -0.005630f, -0.130783f, -0.041831f, 0.086419f, 0.092108f, -0.063032f, -0.066739f, -0.064065f, 0.036376f, 0.059984f, 0.113390f, 0.037560f, 0.014107f, -0.061963f, -0.007103f, -0.000730f, 0.025326f, 0.060567f, 0.041285f, 0.006940f, -0.069120f, -0.130428f, -0.035474f, -0.063990f, 0.101184f, 0.110936f, 0.186944f, -0.051668f, -0.178856f, -0.034726f, -0.060911f, 0.143983f, 0.048340f, 0.146143f, 0.037528f, -0.042369f, -0.135411f, -0.087342f, 0.006470f, 0.022305f, 0.154972f, 0.067749f, -0.003389f, -0.120435f, -0.217864f, -0.051604f, 0.007157f, 0.107829f, 0.234278f, 0.056873f, 0.072880f, -0.142543f, -0.225199f, 0.016804f, 0.056324f, 0.189254f, 0.111316f, 0.083980f, -0.037421f, -0.139562f, -0.115030f, 0.006836f, 0.040284f, 0.005035f, 0.099260f, -0.067653f, -0.062170f, -0.009756f, + -0.151252f, 0.031486f, -0.071499f, 0.096638f, 0.002676f, 0.009956f, -0.037796f, -0.101353f, 0.062497f, -0.101994f, 0.108040f, 0.010127f, 0.014216f, 0.016886f, -0.056914f, 0.056615f, 0.011101f, 0.037906f, -0.054305f, 0.016197f, 0.005656f, 0.069041f, -0.024206f, 0.013408f, 0.054423f, -0.060686f, -0.027070f, 0.000724f, -0.045815f, 0.078239f, -0.013290f, -0.038800f, 0.079885f, 0.081108f, -0.017547f, -0.067944f, -0.010222f, -0.060368f, -0.004860f, 0.030099f, 0.000105f, -0.073950f, 0.013844f, 0.033167f, -0.018926f, 0.038043f, -0.029400f, 0.012193f, 0.050934f, -0.022183f, 0.035533f, -0.083139f, -0.074024f, 0.077363f, 0.050980f, 0.121603f, 0.000657f, -0.035269f, 0.112151f, -0.063952f, -0.048099f, 0.034212f, 0.041842f, 0.057503f, -0.048720f, -0.028539f, 0.022270f, -0.013583f, 0.066349f, -0.049461f, -0.142930f, 0.038316f, 0.089802f, 0.001887f, -0.062518f, 0.015850f, 0.049576f, -0.010322f, -0.008801f, -0.001800f, -0.040624f, -0.023716f, 0.149948f, 0.041850f, 0.040731f, -0.127664f, -0.033397f, -0.100104f, -0.086257f, 0.076422f, 0.078683f, 0.159042f, 0.071681f, -0.021516f, -0.032714f, -0.018889f, + 0.048163f, 0.034453f, -0.001163f, 0.076662f, 0.012686f, -0.031688f, -0.039147f, -0.030516f, 0.052842f, -0.001135f, 0.045680f, 0.021331f, 0.026210f, 0.005757f, -0.015571f, 0.003869f, -0.003891f, 0.005273f, -0.016450f, -0.005497f, 0.011924f, 0.010866f, 0.100023f, 0.081111f, 0.064110f, -0.009136f, 0.013995f, -0.045918f, -0.012064f, -0.030199f, -0.053201f, -0.054058f, 0.009435f, 0.022679f, 0.033667f, 0.043602f, 0.033737f, -0.030565f, -0.070736f, 0.091346f, -0.076731f, -0.037105f, -0.025472f, 0.026050f, -0.003854f, 0.039454f, 0.040838f, 0.034289f, -0.068172f, -0.031472f, -0.002489f, -0.035071f, -0.106023f, 0.049081f, -0.035091f, -0.034042f, 0.020954f, 0.051983f, -0.000171f, -0.188521f, -0.102832f, -0.126727f, 0.091979f, 0.029426f, 0.273031f, 0.295235f, 0.281952f, 0.335609f, 0.318385f, 0.240824f, 0.141376f, 0.190686f, 0.078012f, 0.028067f, -0.152881f, -0.120264f, -0.332102f, -0.277478f, -0.260069f, -0.140067f, -0.192517f, -0.133411f, -0.010175f, -0.032198f, -0.016313f, -0.007502f, 0.004725f, 0.016257f, 0.013180f, 0.055353f, 0.045900f, 0.057234f, 0.120616f, 0.136846f, 0.131637f, 0.109373f, + 0.257163f, 0.086651f, 0.113972f, 0.197020f, 0.204789f, 0.096229f, 0.207304f, 0.260673f, 0.198675f, 0.187961f, 0.178440f, 0.046520f, 0.114352f, 0.228310f, 0.213753f, 0.158379f, 0.184299f, 0.178065f, 0.020395f, -0.016146f, -0.012529f, -0.058008f, -0.092977f, 0.027692f, -0.104534f, -0.159885f, -0.126110f, -0.140918f, -0.245092f, -0.072687f, -0.146665f, -0.148322f, -0.248722f, -0.170458f, -0.214490f, -0.228098f, -0.131591f, -0.243460f, -0.307987f, -0.188760f, 0.012069f, -0.001252f} + } +}; +const float CRendBin_Combined_BRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS][2522]={ {-0.000072f, -0.000087f, -0.000165f, -0.000108f, -0.000091f, -0.000141f, -0.000119f, -0.000065f, -0.000073f, 0.000041f, 0.000162f, -0.000331f, 0.000004f, -0.000023f, -0.000104f, -0.000159f, -0.000548f, -0.000580f, -0.000858f, 0.001141f, -0.000077f, -0.000440f, -0.000301f, 0.000374f, -0.000666f, -0.000117f, -0.000248f, -0.000150f, -0.000208f, 0.000995f, 0.000447f, -0.000600f, -0.000315f, -0.000273f, 0.000055f, 0.000012f, -0.000163f, -0.000416f, -0.000685f, 0.000840f, -0.000420f, 0.000539f, 0.000367f, 0.000488f, -0.000195f, 0.000654f, -0.003981f, 0.000346f, -0.000459f, 0.000152f, -0.000395f, 0.000019f, -0.000441f, 0.000047f, -0.001046f, -0.000658f, -0.000082f, -0.000556f, -0.000132f, -0.000232f, 0.001084f, 0.000081f, -0.001193f, 0.001053f, -0.000367f, 0.000567f, 0.000051f, 0.000409f, -0.001187f, -0.000355f, -0.000293f, 0.000146f, 0.000241f, -0.000121f, -0.000337f, 0.000436f, -0.000624f, -0.000119f, -0.000364f, 0.000162f, 0.000094f, 0.000514f, 0.000465f, -0.000539f, -0.000298f, -0.000011f, -0.000190f, 0.000413f, 0.000023f, 0.000353f, -0.000326f, -0.000341f, 0.000507f, 0.002057f, -0.000866f, 0.000922f, + -0.000363f, 0.000341f, 0.000008f, 0.000490f, -0.000184f, 0.000134f, 0.000224f, 0.000258f, 0.000282f, 0.000464f, -0.000087f, 0.000067f, 0.000845f, 0.000629f, -0.001591f, 0.000335f, -0.000183f, 0.000095f, -0.000525f, 0.000376f, -0.000667f, 0.000703f, 0.000600f, 0.000295f, -0.000062f, -0.000207f, -0.000226f, 0.000500f, 0.000479f, -0.000194f, 0.000132f, 0.000855f, -0.000287f, -0.000010f, -0.000258f, 0.000106f, 0.000161f, -0.000018f, -0.000208f, 0.000403f, 0.000093f, -0.000118f, 0.008225f, -0.000555f, 0.001176f, 0.000016f, 0.000397f, 0.000195f, 0.000311f, 0.000225f, 0.000818f, -0.000413f, 0.000364f, -0.000122f, 0.000168f, 0.000470f, 0.000704f, 0.000307f, 0.000162f, -0.000282f, 0.000642f, -0.000402f, 0.000263f, -0.000165f, -0.000614f, 0.000108f, 0.000253f, 0.000065f, -0.000172f, 0.000098f, -0.000197f, 0.000465f, -0.000841f, 0.000245f, -0.000174f, 0.000273f, 0.000017f, -0.001175f, -0.000397f, 0.000168f, 0.000218f, 0.000185f, -0.000187f, -0.000231f, -0.000215f, 0.000218f, 0.000495f, -0.000150f, 0.004914f, -0.005862f, 0.001141f, -0.001426f, 0.000743f, -0.000931f, 0.000684f, -0.001264f, + -0.000400f, -0.000787f, -0.000168f, -0.000658f, 0.000027f, 0.001128f, 0.001638f, 0.000681f, 0.000341f, 0.000014f, 0.000493f, 0.001177f, 0.000835f, -0.000558f, -0.000686f, -0.000887f, -0.000448f, -0.000517f, 0.000013f, -0.000094f, -0.000111f, 0.000013f, 0.000219f, -0.000416f, 0.000480f, -0.000544f, -0.000748f, 0.000251f, -0.000048f, 0.000044f, 0.000110f, -0.000502f, -0.000601f, 0.000163f, -0.000382f, -0.000466f, -0.000129f, 0.000059f, -0.011368f, 0.002204f, -0.000621f, 0.000234f, 0.000193f, -0.001001f, -0.000477f, 0.000846f, -0.000197f, 0.000023f, 0.000961f, 0.000273f, -0.000434f, -0.000758f, 0.000655f, 0.000006f, -0.000902f, -0.001278f, -0.001817f, 0.000515f, -0.000834f, 0.000126f, -0.000301f, 0.000275f, -0.000227f, 0.000068f, -0.000964f, -0.000964f, -0.000610f, -0.000300f, -0.000616f, 0.000113f, -0.000320f, 0.000264f, 0.001019f, 0.000124f, 0.000143f, 0.000644f, 0.000153f, 0.000104f, -0.000064f, -0.000198f, -0.000741f, -0.000226f, 0.000124f, -0.000190f, -0.013575f, 0.005016f, -0.001308f, 0.001578f, -0.000838f, 0.001123f, -0.000689f, -0.000233f, -0.001195f, 0.000836f, -0.001405f, 0.000857f, + -0.000272f, 0.001219f, -0.001765f, 0.000395f, 0.001576f, 0.000420f, -0.001392f, -0.000534f, -0.000850f, -0.000393f, 0.000483f, 0.000208f, 0.000351f, -0.000269f, -0.000491f, -0.000710f, -0.000665f, -0.000111f, -0.000757f, -0.000186f, -0.000704f, -0.000540f, -0.001912f, -0.000588f, -0.000286f, 0.000044f, 0.000024f, 0.000596f, 0.000263f, 0.000585f, -0.000083f, 0.000690f, 0.000164f, 0.000004f, 0.001758f, 0.005960f, -0.001555f, 0.002681f, -0.001515f, 0.000749f, -0.001639f, 0.001411f, -0.000050f, 0.001531f, -0.000042f, -0.000085f, 0.001519f, -0.000177f, -0.000123f, 0.001322f, -0.000538f, -0.001099f, -0.001766f, 0.001698f, -0.000052f, 0.001179f, 0.000213f, 0.000852f, 0.000469f, -0.001017f, 0.000541f, 0.000488f, 0.000014f, 0.000605f, 0.000933f, -0.001013f, 0.000230f, 0.000018f, -0.000000f, -0.000562f, -0.000183f, -0.000550f, 0.000257f, -0.000077f, 0.000557f, 0.001427f, 0.000151f, 0.000745f, -0.000026f, 0.000178f, -0.000048f, 0.000254f, 0.000661f, 0.017843f, -0.004331f, 0.001744f, -0.000793f, 0.001548f, -0.000596f, 0.001199f, -0.000580f, 0.000444f, -0.001671f, 0.000852f, -0.001592f, 0.001312f, + -0.000442f, 0.000419f, -0.000417f, 0.001826f, 0.000310f, 0.000491f, -0.000789f, 0.001206f, -0.000037f, -0.000497f, 0.001060f, -0.000730f, -0.001124f, 0.000068f, -0.000302f, 0.000605f, 0.000066f, -0.000145f, -0.000317f, 0.000206f, 0.000035f, 0.000255f, -0.000746f, 0.000222f, -0.000287f, 0.001309f, -0.000162f, 0.000639f, 0.000194f, 0.000539f, 0.001039f, -0.000638f, 0.000132f, 0.000243f, -0.000245f, 0.000771f, 0.001441f, -0.009285f, 0.003584f, -0.002903f, 0.001618f, -0.001473f, 0.000426f, -0.001922f, 0.001150f, -0.000799f, 0.001631f, -0.000240f, 0.000674f, -0.001540f, -0.000697f, -0.000145f, -0.000611f, -0.000553f, 0.001886f, -0.001487f, 0.000177f, 0.000867f, -0.001860f, 0.000417f, 0.000558f, -0.000489f, 0.000540f, 0.000166f, 0.000278f, -0.001177f, -0.000178f, -0.000402f, 0.000623f, -0.000602f, 0.000304f, -0.001376f, -0.000353f, 0.000951f, 0.000392f, 0.000282f, -0.000426f, -0.000230f, -0.001110f, -0.001117f, 0.000506f, 0.000196f, -0.000137f, -0.000182f, -0.000184f, 0.000077f, 0.000005f, -0.000247f, -0.000315f, -0.014997f, 0.004804f, -0.002721f, 0.000594f, -0.000324f, 0.000749f, -0.001194f, + 0.001122f, -0.000569f, -0.000507f, -0.000221f, 0.000785f, -0.000544f, -0.000788f, 0.000440f, 0.001590f, -0.000300f, -0.000022f, -0.002885f, 0.000149f, -0.000021f, 0.001279f, -0.000511f, -0.000307f, -0.002217f, -0.000834f, -0.000036f, -0.000058f, 0.000688f, 0.000929f, -0.001686f, -0.001594f, 0.000907f, 0.000141f, -0.001733f, -0.001391f, 0.000577f, 0.000259f, -0.000151f, -0.000156f, -0.000694f, 0.000551f, -0.000251f, 0.000131f, 0.000039f, -0.000990f, -0.000416f, 0.000358f, -0.001400f, -0.000793f, -0.000312f, 0.000171f, -0.000311f, -0.014948f, 0.006529f, -0.003698f, 0.002703f, -0.002595f, 0.001197f, -0.002944f, 0.000601f, -0.001936f, 0.002909f, -0.001555f, 0.000981f, -0.000232f, -0.000050f, -0.001410f, -0.000462f, -0.000608f, 0.002619f, -0.000555f, 0.001298f, 0.002143f, 0.001174f, 0.000284f, -0.000373f, 0.000487f, -0.000560f, 0.001187f, 0.001096f, 0.000135f, -0.000682f, 0.000177f, 0.000136f, -0.000843f, -0.000458f, 0.000591f, 0.000794f, -0.000695f, -0.000753f, -0.000702f, -0.000054f, -0.000303f, 0.000278f, -0.000674f, 0.000364f, -0.001047f, 0.000197f, -0.000580f, -0.000147f, 0.000092f, -0.000522f, + -0.000571f, -0.000827f, -0.000678f, 0.005627f, 0.005842f, -0.002027f, 0.002008f, -0.002233f, 0.000454f, 0.000808f, 0.000155f, -0.000831f, 0.001164f, 0.000376f, 0.002368f, 0.001291f, 0.002661f, -0.000288f, 0.001606f, -0.000307f, 0.001058f, 0.001461f, -0.000095f, -0.001768f, 0.001876f, -0.000086f, 0.000838f, -0.000309f, 0.000082f, 0.000368f, 0.002272f, 0.000438f, -0.001107f, -0.000290f, 0.000370f, -0.000540f, 0.001730f, 0.000820f, -0.000180f, -0.000313f, -0.000858f, 0.000853f, -0.000841f, 0.001058f, 0.001060f, -0.000609f, 0.000639f, 0.000632f, 0.000335f, 0.000048f, 0.001672f, 0.001113f, 0.001241f, 0.000077f, 0.000209f, 0.000650f, -0.000276f, -0.000008f, 0.016899f, -0.005914f, 0.002170f, -0.002715f, 0.001996f, -0.001756f, 0.002541f, -0.000749f, 0.000194f, -0.001749f, 0.003770f, -0.000433f, 0.003403f, 0.000308f, 0.000643f, -0.002128f, 0.000868f, 0.003450f, -0.000959f, -0.002710f, 0.000484f, 0.000228f, 0.001372f, -0.001920f, 0.001727f, 0.000096f, 0.000208f, -0.000062f, -0.001900f, -0.000458f, 0.000385f, -0.002236f, 0.000448f, 0.001080f, 0.000843f, -0.000539f, -0.000135f, 0.000038f, + 0.001155f, 0.000461f, -0.000139f, -0.000353f, 0.000908f, 0.000727f, 0.002183f, 0.000687f, -0.000274f, 0.001331f, 0.000520f, 0.000017f, 0.000435f, 0.001048f, 0.000636f, 0.000269f, 0.000181f, 0.005592f, -0.008167f, 0.004833f, -0.003650f, 0.001480f, 0.000517f, -0.000410f, -0.000338f, 0.000924f, -0.002076f, -0.001347f, -0.001088f, -0.000872f, -0.002825f, 0.001370f, -0.002624f, -0.000154f, -0.002103f, 0.000713f, -0.001587f, -0.001287f, -0.000643f, 0.002310f, 0.000314f, 0.002245f, 0.001193f, 0.001519f, 0.002264f, 0.000059f, -0.000302f, -0.000410f, 0.000631f, 0.001688f, -0.000156f, -0.000192f, -0.001177f, 0.000823f, -0.000149f, -0.000766f, 0.000644f, 0.000471f, 0.001825f, 0.000675f, 0.000861f, -0.001367f, -0.000602f, -0.000149f, -0.000237f, 0.000817f, -0.002611f, 0.000489f, -0.000636f, -0.000519f, -0.000802f, -0.000997f, -0.000299f, -0.000988f, 0.000382f, -0.000715f, -0.000089f, -0.001460f, -0.017319f, -0.003833f, 0.000731f, -0.003336f, -0.001412f, 0.000076f, -0.000162f, -0.002854f, 0.000740f, -0.002843f, 0.000023f, 0.002170f, -0.000474f, -0.000438f, 0.001171f, 0.000738f, 0.001194f, 0.000006f, + 0.001457f, -0.000905f, 0.000375f, 0.001685f, -0.000173f, -0.000178f, -0.001201f, 0.001600f, -0.001344f, -0.000779f, 0.000387f, 0.000606f, 0.001225f, 0.003862f, -0.001125f, -0.000710f, -0.001741f, 0.000025f, -0.001294f, 0.000227f, -0.000543f, -0.001921f, -0.000158f, 0.002295f, 0.000625f, -0.001667f, -0.000833f, 0.000714f, -0.001006f, -0.001282f, 0.000190f, -0.000643f, 0.000104f, 0.000178f, 0.001458f, 0.000140f, 0.000700f, 0.000320f, -0.001283f, -0.000715f, 0.000760f, 0.000665f, -0.000529f, -0.021176f, 0.017437f, -0.006123f, 0.005163f, -0.003841f, 0.002896f, -0.001126f, 0.001834f, -0.002044f, 0.001220f, 0.001442f, 0.002077f, -0.001385f, 0.002519f, 0.001249f, 0.004307f, -0.000691f, 0.000332f, -0.002307f, 0.000546f, -0.000814f, -0.001473f, -0.001787f, -0.002086f, -0.001892f, 0.002773f, -0.000132f, 0.003336f, 0.000873f, 0.000576f, -0.000060f, 0.000385f, -0.001492f, 0.000193f, -0.000544f, 0.000655f, 0.002002f, 0.000308f, 0.000662f, 0.000066f, 0.000212f, -0.001576f, -0.000830f, -0.000115f, -0.000112f, 0.000145f, -0.000459f, -0.001462f, 0.000040f, 0.001442f, -0.000477f, 0.000379f, 0.000445f, + -0.001309f, 0.000863f, 0.000298f, 0.000479f, -0.000327f, 0.000151f, -0.000209f, -0.000378f, 0.012386f, -0.001837f, -0.003918f, -0.001323f, -0.000779f, -0.000581f, -0.003443f, -0.001783f, 0.001037f, 0.000658f, 0.001061f, 0.001304f, -0.002294f, 0.001008f, -0.000401f, 0.000903f, 0.003839f, -0.003762f, 0.001382f, 0.001378f, 0.001090f, -0.000929f, -0.002146f, 0.001778f, 0.000576f, 0.001288f, 0.002391f, 0.000059f, 0.003272f, 0.000334f, 0.001556f, 0.000181f, 0.001077f, -0.000827f, 0.001279f, 0.000929f, 0.001224f, -0.000394f, 0.000451f, -0.000040f, 0.001551f, 0.001883f, -0.002648f, 0.003711f, 0.000379f, 0.001072f, 0.000229f, 0.000685f, 0.000780f, -0.000726f, 0.002266f, 0.001230f, 0.000156f, 0.002053f, 0.000927f, -0.001065f, -0.000019f, -0.000701f, -0.000723f, -0.000565f, 0.000441f, -0.000123f, 0.000202f, -0.000018f, -0.002164f, 0.009835f, 0.000922f, 0.002055f, -0.002459f, -0.000415f, -0.006209f, 0.001564f, -0.000230f, -0.004206f, 0.003651f, -0.001915f, 0.000201f, 0.002684f, 0.001256f, 0.002029f, -0.001435f, 0.000926f, -0.001903f, 0.000093f, -0.001615f, 0.000687f, -0.002495f, 0.003741f, + 0.002742f, 0.002229f, 0.002620f, 0.000613f, -0.000758f, -0.001548f, 0.000801f, 0.002071f, 0.000089f, 0.001425f, -0.000914f, 0.000323f, 0.001428f, 0.000988f, 0.001294f, 0.000124f, 0.000521f, -0.000116f, -0.000774f, 0.000891f, -0.000509f, 0.000433f, 0.000441f, -0.000851f, 0.001288f, -0.001599f, 0.001543f, -0.000737f, 0.001116f, 0.001593f, -0.001829f, 0.000213f, 0.000308f, -0.000765f, -0.001426f, 0.001082f, -0.002368f, -0.001881f, 0.001253f, 0.000503f, 0.000620f, 0.000479f, 0.001591f, 0.001466f, 0.015370f, -0.012851f, 0.004305f, -0.003226f, 0.001085f, 0.003967f, 0.003211f, -0.002183f, 0.003857f, 0.002164f, 0.002311f, -0.001648f, 0.001050f, -0.000856f, 0.004584f, 0.001257f, 0.001258f, 0.001765f, 0.001909f, 0.001215f, 0.001286f, -0.003834f, 0.000554f, -0.006907f, -0.002452f, -0.000663f, -0.004002f, 0.000967f, 0.002052f, -0.001510f, -0.002202f, -0.002537f, -0.002480f, -0.001309f, 0.001320f, 0.001075f, -0.003574f, -0.004074f, -0.000383f, -0.002086f, 0.001032f, 0.000883f, 0.000310f, -0.000306f, 0.001840f, -0.001023f, 0.000016f, -0.000282f, -0.000943f, -0.002618f, 0.001932f, 0.003414f, + -0.000553f, -0.000442f, 0.001519f, -0.002428f, 0.002836f, 0.000744f, -0.001586f, -0.000067f, -0.001484f, -0.000593f, -0.000457f, -0.000999f, -0.000378f, -0.000680f, -0.002142f, -0.023963f, 0.002254f, -0.002240f, 0.000760f, 0.002319f, 0.001628f, 0.004755f, -0.002117f, -0.000279f, 0.000273f, 0.005715f, 0.001903f, -0.004670f, -0.003102f, 0.002463f, 0.003323f, -0.000970f, -0.001425f, -0.000200f, 0.001465f, 0.003457f, 0.003493f, -0.000154f, -0.006603f, -0.001974f, -0.000797f, -0.000877f, 0.003629f, -0.001824f, 0.002064f, 0.000120f, -0.000544f, -0.003455f, 0.000132f, 0.002584f, -0.004433f, -0.002610f, -0.001147f, -0.000841f, -0.002176f, -0.001790f, -0.004157f, -0.000826f, -0.002865f, -0.000055f, 0.000448f, 0.002819f, -0.002119f, -0.001375f, 0.000103f, -0.000362f, 0.000304f, -0.002564f, 0.000831f, 0.000886f, 0.000161f, 0.000085f, -0.002042f, -0.001764f, -0.001110f, -0.000581f, -0.000307f, -0.003262f, 0.000495f, 0.000918f, -0.001558f, -0.002978f, -0.013890f, 0.014980f, -0.002004f, 0.001051f, 0.003625f, 0.004310f, -0.003040f, 0.002129f, 0.000926f, 0.002699f, 0.001887f, 0.003764f, 0.002201f, -0.002381f, + -0.003987f, 0.000683f, 0.004499f, 0.008807f, -0.001967f, -0.002868f, 0.002422f, 0.001504f, -0.001522f, -0.004206f, -0.000729f, -0.000780f, -0.003736f, 0.003482f, 0.004201f, 0.000142f, 0.001094f, -0.000005f, 0.003339f, -0.002413f, -0.007544f, 0.003318f, -0.000765f, 0.002644f, 0.001396f, 0.000173f, -0.001743f, -0.002899f, 0.002217f, 0.002485f, 0.001941f, -0.000289f, 0.000013f, 0.002721f, 0.001672f, 0.000872f, -0.001413f, 0.002293f, 0.002054f, -0.000268f, -0.000403f, -0.001262f, 0.001722f, 0.000087f, -0.003616f, 0.003162f, 0.002057f, -0.000676f, 0.001083f, -0.000444f, 0.000287f, -0.000045f, 0.001112f, 0.002708f, 0.001112f, -0.000454f, -0.000758f, -0.000087f, 0.004247f, 0.000215f, -0.003162f, -0.006563f, 0.001662f, -0.000306f, -0.005382f, 0.001877f, -0.001735f, 0.000288f, -0.001992f, -0.001579f, 0.001792f, 0.004176f, 0.000589f, 0.005520f, 0.002574f, -0.002745f, -0.003553f, 0.006032f, -0.002523f, -0.000177f, 0.000625f, -0.005632f, 0.000047f, 0.002995f, -0.003183f, -0.000864f, 0.003874f, 0.000241f, 0.002071f, 0.000057f, 0.002588f, -0.000426f, -0.001587f, -0.000236f, 0.003409f, 0.004449f, + -0.001356f, 0.000888f, 0.000885f, 0.002954f, -0.001661f, -0.000338f, 0.000693f, -0.000784f, 0.002047f, 0.000836f, 0.000278f, -0.001056f, 0.001664f, 0.001669f, 0.000211f, 0.000030f, 0.001407f, 0.001946f, -0.002289f, -0.000079f, 0.000797f, 0.001025f, -0.001112f, 0.000911f, 0.031494f, -0.002770f, 0.000753f, 0.002186f, -0.002573f, -0.004606f, -0.002586f, -0.000963f, -0.005283f, -0.005676f, 0.000683f, -0.004997f, -0.002076f, -0.001265f, -0.001063f, 0.003475f, 0.003984f, 0.001443f, 0.008090f, 0.001684f, -0.003668f, 0.007034f, -0.000453f, 0.005060f, -0.001308f, -0.000237f, -0.004237f, 0.000439f, 0.004173f, 0.000138f, -0.001700f, -0.000488f, 0.000627f, -0.000709f, -0.000610f, 0.001809f, -0.003329f, 0.001730f, 0.000758f, -0.001392f, -0.003145f, -0.001988f, 0.002825f, 0.002862f, 0.003280f, -0.004844f, 0.003123f, 0.001110f, 0.000108f, 0.000556f, 0.000744f, 0.000898f, 0.000904f, -0.000102f, 0.000514f, 0.003071f, -0.000525f, 0.001429f, 0.001525f, -0.000766f, 0.002515f, 0.002972f, 0.000695f, 0.000168f, 0.002665f, 0.002125f, 0.001608f, -0.018531f, -0.030965f, 0.010972f, -0.000948f, 0.004457f, + -0.005553f, 0.000069f, -0.006403f, -0.000999f, -0.009158f, 0.003697f, 0.004000f, -0.000398f, -0.000850f, -0.000313f, 0.000693f, -0.002359f, -0.007816f, 0.013922f, 0.000842f, -0.002025f, 0.004712f, 0.000644f, -0.002684f, 0.006563f, 0.007414f, -0.003465f, 0.004327f, 0.000634f, -0.001078f, -0.007305f, -0.003984f, 0.005287f, -0.002951f, 0.000537f, -0.000485f, 0.003509f, -0.005866f, -0.006736f, 0.000823f, -0.000163f, -0.004473f, 0.002383f, 0.000453f, -0.003003f, 0.001856f, -0.003286f, -0.002585f, 0.000918f, 0.001082f, -0.000124f, -0.000870f, -0.001710f, 0.001740f, 0.002726f, 0.000390f, 0.000649f, -0.000912f, -0.001176f, 0.002602f, 0.000001f, 0.000561f, -0.003012f, -0.000643f, -0.002125f, 0.001468f, 0.001871f, 0.000011f, 0.001474f, -0.009984f, 0.029679f, -0.013296f, 0.002142f, 0.001876f, 0.007374f, -0.001014f, 0.004672f, -0.004771f, 0.000195f, -0.009087f, -0.001827f, -0.000010f, 0.003536f, 0.000553f, 0.003640f, -0.002635f, -0.005592f, 0.000666f, -0.008360f, -0.008729f, 0.000137f, -0.002889f, -0.000279f, 0.000715f, 0.001124f, -0.002179f, -0.001566f, -0.003122f, -0.004833f, 0.001880f, 0.002148f, + -0.006136f, -0.002908f, -0.007705f, -0.000017f, -0.003400f, 0.002626f, 0.003246f, -0.006491f, 0.001014f, 0.005088f, 0.004734f, -0.002598f, 0.001743f, -0.001964f, -0.000863f, 0.001314f, -0.002833f, -0.000783f, 0.002722f, 0.001917f, 0.001888f, 0.002071f, 0.001265f, -0.000849f, 0.001838f, 0.000977f, -0.001239f, -0.000263f, 0.003696f, -0.000580f, -0.001553f, -0.000738f, 0.001606f, -0.001764f, -0.003549f, -0.000500f, -0.001131f, 0.000693f, 0.000964f, -0.000806f, -0.024852f, -0.007884f, 0.002506f, -0.004157f, 0.003249f, -0.001895f, -0.000223f, -0.007523f, -0.008962f, -0.001462f, -0.003300f, 0.003363f, 0.000788f, -0.001345f, -0.018244f, 0.008745f, 0.000396f, 0.007581f, 0.009548f, 0.006478f, -0.009650f, -0.002596f, -0.001150f, -0.002652f, 0.001792f, 0.001927f, -0.000397f, -0.003738f, 0.003573f, -0.006678f, -0.003634f, 0.005331f, 0.000061f, -0.002755f, 0.006383f, -0.000179f, 0.006708f, -0.002729f, -0.001334f, 0.000488f, 0.001949f, -0.005308f, -0.003889f, -0.001222f, 0.003686f, -0.001777f, 0.000415f, -0.001925f, 0.002392f, 0.002907f, 0.000417f, -0.000201f, -0.005978f, -0.000985f, 0.002601f, 0.002767f, + -0.002022f, 0.003136f, 0.000946f, -0.001396f, 0.000702f, -0.004027f, -0.001351f, -0.002853f, 0.002141f, -0.000092f, -0.001082f, 0.000370f, -0.006397f, -0.000476f, 0.000900f, 0.002391f, 0.016043f, 0.005610f, -0.009156f, -0.001319f, -0.003763f, 0.003590f, -0.005395f, 0.005067f, -0.000741f, 0.005842f, 0.004189f, 0.007028f, -0.008738f, 0.011185f, -0.006353f, 0.006661f, -0.003318f, 0.004105f, 0.001068f, 0.003525f, -0.005448f, -0.013027f, 0.005524f, 0.009541f, -0.002996f, 0.004078f, -0.004340f, 0.001386f, -0.002716f, 0.010009f, 0.000293f, -0.000692f, 0.002717f, -0.004462f, -0.002892f, -0.002508f, 0.004679f, 0.000305f, -0.001159f, 0.000263f, -0.000420f, 0.006942f, 0.004916f, -0.002250f, 0.002607f, 0.002793f, -0.002329f, -0.001365f, -0.002044f, -0.004826f, -0.000231f, 0.000342f, -0.000209f, -0.001630f, -0.004652f, 0.000018f, 0.008352f, 0.004486f, -0.002767f, 0.004605f, 0.000057f, 0.000143f, 0.004221f, 0.002138f, -0.003187f, 0.001626f, 0.001410f, 0.004076f, 0.005229f, -0.003475f, 0.002286f, 0.002913f, 0.033130f, -0.027388f, -0.004773f, 0.001159f, -0.000744f, -0.007710f, 0.002296f, 0.001775f, + 0.010417f, -0.003674f, 0.001858f, 0.008565f, -0.000003f, 0.005082f, 0.017049f, -0.003935f, -0.001377f, -0.009174f, -0.008674f, 0.000218f, 0.002599f, -0.003961f, 0.001373f, 0.015089f, 0.008548f, 0.001111f, 0.000296f, 0.001090f, 0.008154f, -0.007188f, -0.003406f, -0.000534f, 0.004055f, -0.000815f, 0.000741f, -0.003706f, 0.001036f, -0.006476f, -0.004051f, -0.004924f, -0.000249f, -0.004420f, 0.000694f, -0.007772f, 0.003187f, -0.015406f, -0.004265f, 0.001984f, 0.002463f, -0.000683f, -0.003895f, 0.001075f, 0.000071f, 0.001727f, -0.004575f, 0.001756f, -0.002853f, -0.002870f, -0.007165f, -0.005134f, -0.001917f, -0.000950f, -0.000118f, 0.001032f, 0.001694f, 0.000290f, 0.000542f, -0.004163f, -0.000546f, -0.005074f, -0.001294f, -0.000537f, -0.000468f, -0.021488f, -0.015086f, -0.001489f, -0.003392f, 0.010654f, -0.000063f, 0.001652f, -0.014263f, 0.000331f, 0.001465f, 0.000414f, 0.000626f, 0.007973f, -0.010847f, 0.001833f, -0.002672f, -0.007531f, -0.003933f, 0.006260f, -0.002776f, 0.005037f, -0.002306f, 0.002778f, 0.001220f, -0.001452f, -0.001296f, 0.003205f, -0.000959f, -0.000376f, -0.009392f, 0.004089f, + 0.003498f, 0.003461f, 0.003843f, -0.008297f, -0.008747f, 0.004507f, 0.006640f, -0.008880f, 0.002650f, 0.000960f, 0.006906f, 0.004011f, 0.000184f, 0.004743f, -0.003165f, -0.005426f, -0.001324f, -0.010226f, -0.007854f, -0.001028f, -0.000927f, 0.001391f, -0.005334f, 0.001484f, -0.004397f, -0.012966f, -0.004336f, -0.003588f, -0.013226f, -0.000084f, -0.002658f, -0.001549f, 0.000845f, 0.003902f, -0.004323f, 0.002441f, 0.001004f, -0.005637f, -0.004241f, -0.004244f, -0.001505f, -0.001063f, -0.013332f, 0.019842f, -0.010684f, -0.004682f, -0.006311f, 0.001381f, 0.001571f, 0.002741f, -0.001412f, 0.008522f, 0.006458f, -0.006508f, -0.011270f, 0.003936f, -0.004298f, 0.010008f, 0.000739f, 0.004124f, 0.005290f, -0.004145f, -0.003849f, 0.013352f, -0.007881f, -0.002166f, -0.004027f, 0.000188f, -0.001686f, 0.001509f, -0.002348f, -0.001216f, -0.010539f, 0.008954f, -0.003255f, -0.001155f, 0.010968f, -0.007856f, -0.009468f, 0.000509f, -0.004278f, -0.006596f, -0.000003f, -0.003568f, 0.002536f, -0.014058f, -0.004478f, -0.003753f, -0.000244f, 0.004407f, 0.000162f, 0.000537f, 0.002609f, -0.002783f, 0.002039f, 0.002767f, + 0.002934f, 0.002587f, -0.001576f, -0.003382f, -0.002339f, 0.002972f, -0.008058f, -0.002329f, -0.001710f, -0.002586f, 0.005677f, -0.004232f, -0.005500f, 0.005275f, 0.002105f, 0.002907f, 0.007302f, -0.003219f, -0.001952f, 0.002705f, -0.003371f, -0.027977f, 0.013299f, 0.014376f, 0.007125f, 0.006451f, -0.005403f, 0.006570f, -0.012375f, -0.000048f, -0.014462f, -0.002271f, -0.006600f, 0.006056f, -0.007189f, -0.005971f, -0.002036f, -0.010666f, 0.002483f, -0.005100f, 0.003989f, -0.010028f, 0.015491f, -0.005681f, 0.007023f, -0.006991f, 0.000083f, -0.006998f, -0.002683f, 0.003235f, 0.009686f, 0.011124f, -0.006363f, -0.000344f, -0.004013f, -0.006466f, -0.005261f, -0.016824f, -0.001027f, 0.002383f, -0.016116f, 0.005666f, 0.002391f, 0.003876f, 0.006729f, 0.004312f, 0.001791f, -0.005547f, -0.002410f, -0.006139f, -0.003672f, 0.002766f, -0.013122f, 0.004552f, 0.001648f, 0.000473f, -0.006646f, -0.003758f, 0.002350f, 0.009675f, 0.003336f, 0.002294f, -0.004830f, 0.003889f, -0.000362f, -0.004988f, 0.000285f, -0.003656f, -0.006451f, -0.003017f, -0.002405f, -0.005056f, 0.004337f, 0.003050f, 0.003162f, 0.002515f, + 0.022567f, -0.015924f, -0.006805f, -0.002248f, -0.000298f, 0.010841f, -0.002322f, 0.003365f, -0.006612f, 0.003160f, -0.004182f, -0.018307f, -0.012586f, -0.004912f, 0.006270f, -0.001075f, -0.010139f, -0.009646f, -0.019826f, -0.006661f, 0.002351f, 0.002333f, 0.000753f, -0.002356f, -0.001304f, -0.006434f, 0.001460f, 0.002212f, 0.003214f, 0.000413f, -0.001013f, -0.002714f, -0.009476f, -0.002757f, -0.002222f, 0.004344f, -0.001059f, -0.007860f, -0.003003f, 0.001781f, -0.008456f, 0.001051f, -0.008704f, 0.004430f, 0.006757f, -0.006842f, -0.012547f, -0.002835f, -0.003929f, -0.006160f, 0.000639f, 0.000715f, 0.001292f, 0.002654f, 0.000236f, -0.005358f, 0.007971f, 0.011782f, -0.005763f, 0.004625f, 0.002207f, 0.005343f, -0.008652f, 0.002885f, 0.001360f, 0.002697f, -0.012442f, 0.009595f, 0.001567f, 0.000652f, -0.001122f, -0.007776f, 0.002435f, 0.000372f, 0.002536f, 0.037207f, -0.020583f, 0.002044f, -0.001961f, -0.004258f, -0.015343f, -0.000669f, -0.000754f, 0.012751f, 0.005843f, 0.025591f, -0.010021f, 0.001169f, 0.002854f, 0.006287f, -0.002534f, -0.000963f, 0.010357f, -0.006247f, 0.014872f, 0.009216f, + -0.020569f, 0.019880f, 0.006953f, -0.006842f, -0.005101f, -0.007476f, -0.004022f, 0.001676f, 0.000903f, -0.005282f, 0.013044f, 0.001959f, -0.006273f, -0.005242f, 0.001246f, -0.006549f, -0.012149f, 0.000435f, 0.007185f, 0.003206f, 0.008739f, -0.003743f, 0.002673f, 0.009774f, 0.013477f, 0.003564f, -0.014102f, 0.004984f, -0.004601f, -0.007332f, 0.001948f, 0.006346f, 0.003309f, -0.001279f, -0.012832f, -0.010689f, 0.015590f, -0.001595f, 0.012021f, 0.001895f, -0.004889f, 0.006485f, -0.010625f, -0.004083f, 0.004983f, -0.000734f, 0.010368f, -0.007701f, -0.016644f, -0.003893f, -0.000759f, -0.004205f, -0.003760f, 0.011440f, -0.042383f, -0.027739f, 0.009403f, -0.014685f, 0.003933f, -0.007620f, -0.025876f, -0.019285f, 0.033197f, -0.016108f, 0.014672f, 0.008054f, -0.009404f, 0.007309f, -0.005591f, 0.010076f, 0.011200f, -0.001318f, -0.003935f, 0.019687f, -0.007169f, -0.023425f, -0.000217f, -0.010130f, 0.001743f, 0.001616f, 0.013103f, 0.006713f, 0.002256f, 0.006161f, -0.006757f, -0.000541f, 0.014403f, 0.009049f, -0.003299f, 0.003326f, -0.013839f, -0.021010f, -0.015686f, -0.011086f, -0.003554f, -0.003442f, + 0.003200f, -0.002435f, -0.006294f, 0.012604f, 0.002867f, -0.010382f, -0.009812f, -0.003170f, 0.003237f, -0.010444f, 0.003399f, 0.011749f, -0.000813f, 0.004099f, -0.008970f, 0.006053f, 0.004208f, 0.001044f, 0.004317f, -0.007850f, -0.011956f, -0.016537f, 0.007605f, 0.005953f, 0.000103f, 0.005950f, 0.000787f, -0.007676f, -0.001895f, 0.000393f, -0.013121f, -0.001134f, -0.020077f, -0.050644f, 0.016367f, -0.004623f, -0.003957f, 0.008295f, 0.001504f, 0.004354f, 0.021080f, 0.012382f, 0.015738f, 0.007664f, 0.021739f, -0.004547f, -0.022611f, 0.002633f, -0.003205f, -0.009959f, -0.020140f, -0.009031f, 0.016174f, 0.003275f, -0.001957f, 0.002975f, -0.002089f, -0.000313f, 0.013469f, 0.001269f, 0.004472f, -0.002698f, 0.002693f, 0.013696f, -0.004790f, -0.010093f, 0.006359f, -0.017510f, -0.017961f, -0.011488f, -0.003062f, -0.000032f, 0.006156f, 0.016175f, -0.000678f, -0.006246f, -0.017572f, -0.027719f, -0.010554f, -0.004454f, -0.002615f, -0.000658f, 0.009047f, -0.012951f, 0.021456f, 0.011215f, -0.003177f, 0.006007f, -0.009911f, 0.001154f, -0.000890f, 0.009944f, 0.018994f, 0.013099f, -0.012923f, -0.005414f, + 0.002249f, -0.002350f, -0.003630f, 0.000595f, -0.007207f, -0.019896f, -0.002545f, -0.004018f, -0.002396f, 0.002634f, -0.008421f, -0.002942f, 0.021553f, 0.021791f, 0.008227f, 0.014972f, 0.011184f, 0.022785f, -0.017718f, 0.023630f, -0.026115f, -0.003634f, 0.026912f, 0.036299f, 0.008642f, -0.001072f, 0.014116f, -0.009647f, -0.011247f, 0.026553f, 0.005456f, -0.002785f, 0.007561f, 0.021552f, -0.003983f, 0.013643f, -0.002701f, -0.004016f, -0.001031f, 0.010315f, -0.022226f, -0.001803f, 0.012951f, -0.004175f, 0.002681f, -0.007308f, 0.006401f, 0.019794f, -0.015774f, 0.006630f, -0.003588f, 0.007162f, -0.007484f, 0.013615f, 0.002654f, 0.005566f, 0.006713f, -0.019949f, 0.011877f, -0.028181f, -0.004272f, 0.017521f, 0.003484f, -0.009451f, 0.020011f, -0.005351f, -0.009246f, 0.014199f, -0.003633f, -0.002865f, -0.000220f, 0.008912f, 0.000729f, 0.002994f, -0.013928f, 0.006641f, 0.003565f, 0.031973f, -0.021237f, -0.009452f, 0.005116f, -0.005351f, 0.009557f, 0.009335f, -0.008448f, 0.022090f, 0.011509f, 0.041905f, -0.025917f, 0.001147f, -0.003973f, -0.006853f, 0.001086f, -0.009445f, -0.003780f, -0.030810f, + -0.025570f, -0.025694f, 0.008918f, -0.005346f, 0.008840f, -0.005880f, -0.018370f, 0.029832f, 0.021172f, -0.013917f, -0.011257f, -0.016446f, -0.003012f, 0.006294f, 0.010288f, 0.011958f, -0.000391f, 0.009201f, -0.002202f, -0.011986f, -0.013899f, 0.008803f, -0.006024f, 0.027026f, 0.017645f, 0.024880f, 0.004133f, 0.008850f, 0.025384f, 0.016839f, -0.004781f, 0.004167f, -0.000418f, -0.000079f, 0.003342f, -0.011964f, -0.007556f, 0.003988f, -0.013644f, -0.015368f, 0.015225f, 0.015837f, -0.017084f, -0.001170f, 0.032811f, 0.021591f, -0.000178f, -0.011221f, -0.001306f, 0.005880f, 0.007070f, -0.005102f, -0.010739f, 0.013405f, 0.000259f, 0.002569f, 0.011514f, 0.011958f, -0.012161f, 0.004728f, -0.000689f, 0.004176f, -0.019400f, 0.002548f, 0.020935f, -0.020476f, 0.033299f, 0.012504f, -0.005039f, -0.001604f, 0.010080f, -0.013171f, -0.016997f, 0.013613f, -0.020208f, -0.025978f, 0.006227f, -0.014174f, -0.018166f, -0.009696f, 0.016277f, 0.040782f, 0.016528f, -0.022973f, 0.041719f, 0.004404f, -0.007204f, 0.007114f, -0.025278f, 0.005771f, 0.002815f, -0.018214f, 0.014703f, -0.005278f, 0.002403f, -0.013267f, + 0.006527f, -0.012177f, 0.020754f, -0.025883f, -0.009996f, -0.009303f, 0.011396f, 0.013377f, 0.011722f, -0.014039f, 0.003224f, -0.014666f, -0.004778f, 0.006907f, 0.017130f, 0.007640f, -0.009000f, 0.016785f, 0.008079f, 0.013392f, 0.000105f, 0.015691f, -0.008035f, 0.008332f, -0.025848f, 0.027258f, -0.003377f, 0.003087f, -0.008419f, -0.015485f, -0.000290f, 0.008417f, 0.021295f, 0.005550f, -0.027934f, 0.010273f, -0.012065f, 0.020763f, 0.000589f, -0.009924f, 0.002852f, -0.009089f, 0.003046f, -0.017901f, 0.004505f, -0.068393f, 0.003911f, 0.012458f, 0.028068f, 0.009817f, -0.041752f, 0.057634f, 0.021660f, -0.025100f, 0.010202f, 0.057345f, 0.013538f, -0.012804f, -0.000855f, -0.033289f, 0.018428f, 0.002556f, -0.007891f, 0.005868f, 0.012568f, -0.021227f, 0.012718f, -0.026827f, 0.003798f, -0.024349f, -0.021911f, -0.008693f, 0.011577f, 0.017316f, -0.011580f, 0.015292f, -0.023825f, -0.002485f, 0.028630f, 0.003655f, -0.009118f, -0.002143f, 0.006319f, -0.005282f, -0.017416f, -0.019270f, -0.001793f, -0.008175f, 0.020969f, -0.026888f, 0.030745f, 0.010785f, 0.004772f, -0.008644f, -0.002303f, 0.015178f, + -0.010181f, 0.020050f, 0.005621f, 0.018329f, -0.005181f, -0.008172f, -0.028414f, 0.011739f, -0.001909f, -0.028593f, 0.010198f, -0.000167f, 0.019592f, 0.031789f, -0.011444f, 0.008957f, 0.015829f, 0.018061f, 0.004371f, -0.006400f, -0.000614f, -0.033694f, -0.000676f, 0.007011f, 0.010071f, 0.004930f}, + {-0.000085f, -0.000110f, -0.000233f, -0.000152f, -0.000064f, -0.000268f, -0.000373f, -0.000034f, -0.000201f, -0.000178f, 0.000051f, 0.000100f, 0.000053f, 0.000032f, -0.000142f, 0.000357f, -0.000041f, 0.000200f, -0.000520f, -0.000600f, -0.000007f, -0.001067f, -0.000421f, 0.000439f, 0.000043f, 0.000129f, 0.000086f, 0.000745f, 0.000011f, 0.000318f, 0.000056f, 0.000486f, 0.000031f, -0.000377f, -0.000522f, -0.000614f, -0.001068f, 0.000077f, -0.000104f, 0.000038f, -0.000438f, -0.000073f, 0.000301f, 0.000368f, -0.000247f, -0.000290f, -0.004608f, 0.000444f, -0.001004f, -0.000048f, -0.000365f, -0.000677f, 0.000375f, 0.001556f, 0.000019f, 0.000799f, -0.000868f, -0.000218f, 0.000612f, -0.000558f, 0.000189f, 0.001087f, -0.000628f, -0.000200f, -0.000286f, -0.000053f, 0.000171f, -0.000216f, 0.000322f, 0.000216f, -0.000234f, 0.000416f, -0.000234f, -0.000008f, -0.000865f, 0.000007f, -0.000075f, 0.000219f, 0.000165f, 0.000420f, -0.000359f, 0.000712f, -0.000091f, 0.000595f, -0.000175f, 0.000002f, 0.000460f, -0.000135f, 0.000340f, 0.000153f, 0.000347f, 0.000074f, 0.000330f, 0.001963f, -0.001509f, 0.000965f, + -0.001189f, 0.000630f, -0.000572f, -0.000565f, -0.000333f, -0.000315f, 0.000368f, 0.000418f, -0.001476f, -0.000067f, 0.000236f, -0.000135f, -0.000233f, -0.000860f, -0.000301f, 0.000636f, 0.000960f, 0.000486f, 0.001504f, 0.000316f, -0.000247f, 0.000319f, 0.000275f, -0.000139f, 0.000504f, 0.001071f, -0.000388f, 0.000002f, 0.000469f, -0.000001f, -0.000084f, -0.000745f, -0.000011f, 0.000396f, 0.000327f, 0.000074f, 0.000040f, -0.000240f, 0.000287f, -0.000016f, 0.000052f, 0.000027f, 0.007104f, -0.000421f, 0.000655f, -0.000407f, 0.000494f, -0.000497f, 0.000152f, -0.000091f, -0.000087f, 0.000446f, -0.000335f, -0.001242f, 0.000408f, 0.000173f, 0.000434f, 0.000909f, 0.000501f, 0.000353f, -0.000079f, -0.000702f, -0.000218f, 0.000384f, -0.000064f, -0.000078f, 0.000761f, -0.000877f, -0.000256f, 0.000027f, -0.000121f, -0.000185f, 0.000384f, 0.000425f, 0.000508f, 0.000177f, 0.000204f, -0.000150f, 0.000691f, 0.000014f, 0.000538f, 0.000398f, -0.000083f, -0.000022f, 0.000273f, 0.000050f, -0.000107f, -0.000023f, 0.005173f, -0.004979f, 0.000758f, -0.001358f, 0.000698f, -0.000108f, 0.000497f, -0.000492f, + 0.000912f, -0.000413f, 0.000543f, -0.001200f, 0.000023f, -0.000702f, 0.000172f, -0.000123f, -0.000188f, -0.000332f, -0.000898f, -0.000102f, 0.000077f, -0.000442f, 0.000687f, -0.000334f, -0.000547f, -0.000667f, 0.000363f, -0.000430f, 0.000986f, -0.000116f, -0.000027f, 0.000290f, -0.000027f, 0.000013f, -0.000484f, -0.000388f, -0.000138f, 0.000097f, -0.000207f, -0.000444f, 0.000354f, 0.000272f, 0.000663f, -0.000167f, 0.000193f, -0.000101f, -0.012232f, 0.001378f, -0.000964f, -0.000025f, -0.000191f, -0.001073f, 0.001055f, -0.000324f, 0.000049f, 0.000415f, 0.000092f, 0.001229f, -0.000112f, -0.000575f, 0.001486f, 0.000568f, 0.001337f, -0.000082f, -0.001886f, -0.001153f, -0.000934f, 0.000705f, -0.001007f, 0.000027f, -0.000397f, -0.000378f, 0.000063f, 0.000231f, -0.000326f, -0.000631f, -0.000476f, 0.000317f, 0.000372f, 0.000747f, -0.000111f, -0.000166f, -0.000097f, 0.000442f, -0.000603f, 0.000090f, 0.000174f, 0.000313f, -0.000499f, 0.000419f, -0.000595f, -0.000152f, -0.015441f, 0.005518f, -0.002303f, 0.002521f, -0.001845f, 0.001124f, -0.001995f, 0.001044f, -0.001494f, 0.000496f, 0.001021f, -0.000007f, + 0.000361f, 0.000920f, -0.000682f, 0.000643f, -0.000860f, -0.000663f, -0.001839f, 0.001567f, -0.001098f, 0.001028f, 0.000037f, -0.000072f, -0.001762f, -0.000129f, 0.000289f, -0.000312f, -0.000099f, -0.000132f, 0.000676f, -0.000176f, -0.000543f, 0.000472f, 0.000127f, -0.000291f, -0.000002f, -0.000049f, 0.000026f, 0.000239f, -0.000499f, 0.001119f, -0.000131f, -0.000824f, -0.000111f, -0.000485f, 0.000820f, 0.007058f, -0.001442f, 0.002714f, -0.001155f, 0.000970f, -0.000923f, 0.003365f, -0.000571f, 0.001821f, -0.000136f, -0.000075f, 0.000516f, 0.000052f, -0.002205f, 0.000568f, -0.000135f, -0.000975f, -0.000176f, 0.000088f, -0.002788f, -0.000031f, 0.000311f, 0.000952f, 0.000054f, -0.000498f, -0.000034f, 0.001025f, 0.000258f, -0.000442f, -0.000883f, 0.001514f, -0.000832f, 0.000005f, -0.001279f, -0.000112f, 0.000087f, 0.000274f, -0.000246f, 0.000397f, 0.000675f, -0.000542f, 0.000554f, 0.000010f, 0.000461f, 0.000010f, 0.000764f, -0.000312f, -0.000114f, 0.018588f, -0.005258f, 0.000927f, -0.000786f, 0.001337f, 0.000142f, 0.000108f, -0.002354f, 0.001234f, -0.000955f, 0.000882f, 0.000397f, 0.000510f, + 0.000934f, 0.001367f, 0.000327f, 0.000553f, -0.001954f, 0.000886f, 0.000909f, -0.001228f, -0.000123f, 0.001531f, 0.001055f, 0.001020f, 0.002148f, 0.001239f, 0.000434f, 0.000648f, -0.000609f, 0.000752f, -0.000036f, 0.001269f, 0.001647f, -0.000099f, 0.000652f, 0.001056f, -0.000249f, 0.000437f, -0.001158f, -0.000242f, 0.001458f, 0.000131f, -0.000766f, -0.000206f, 0.000549f, 0.001077f, 0.000087f, 0.000656f, 0.001243f, -0.009941f, 0.004084f, -0.002944f, 0.001806f, -0.001776f, 0.002143f, -0.001506f, 0.000013f, -0.001288f, -0.001596f, -0.002175f, 0.000063f, -0.001312f, 0.000522f, 0.000655f, 0.001509f, -0.002663f, 0.001519f, -0.000673f, 0.002143f, 0.000445f, -0.000229f, 0.000133f, 0.000073f, -0.000571f, -0.000550f, 0.000300f, -0.001170f, 0.000663f, 0.001158f, -0.001754f, -0.000489f, -0.000135f, 0.000579f, -0.000686f, 0.001695f, -0.001915f, 0.000249f, -0.000028f, -0.000006f, -0.000834f, 0.000006f, -0.000529f, 0.000354f, 0.000057f, -0.000036f, -0.000591f, -0.000232f, -0.001208f, -0.000539f, -0.000076f, 0.000128f, -0.015976f, 0.004984f, -0.003317f, -0.000280f, -0.000721f, 0.000932f, -0.002804f, + 0.000128f, 0.000818f, 0.000655f, -0.001013f, 0.000476f, -0.001278f, -0.002084f, -0.000836f, 0.000181f, -0.001254f, 0.004148f, 0.000068f, -0.001247f, -0.000431f, -0.001488f, -0.000707f, 0.001212f, 0.000729f, 0.001594f, -0.000194f, 0.000665f, -0.000984f, 0.000306f, -0.000893f, -0.000374f, -0.000537f, 0.000196f, 0.000487f, -0.000353f, -0.000844f, 0.000113f, 0.000274f, 0.001070f, -0.000231f, -0.000515f, -0.001535f, -0.001323f, -0.000612f, -0.000331f, 0.000261f, 0.000111f, -0.000638f, -0.000350f, 0.000095f, 0.000458f, 0.000273f, -0.015403f, 0.007106f, -0.003470f, 0.003124f, -0.001753f, 0.001815f, 0.000864f, 0.000493f, -0.001820f, 0.000123f, -0.000964f, 0.000170f, -0.002357f, 0.000766f, 0.001355f, 0.000369f, -0.002501f, -0.001299f, -0.001293f, -0.001369f, -0.000904f, 0.001643f, 0.000349f, 0.001126f, 0.000916f, -0.000531f, -0.000165f, -0.001938f, 0.002303f, -0.000779f, -0.000304f, 0.000045f, -0.000570f, -0.000836f, -0.000920f, -0.000305f, -0.001990f, 0.000461f, -0.001083f, 0.000658f, 0.000615f, 0.000992f, -0.000357f, 0.000005f, -0.001309f, 0.000354f, 0.000869f, 0.000098f, -0.000259f, 0.000063f, + 0.000669f, 0.000952f, 0.000417f, 0.005024f, 0.006202f, -0.002730f, 0.001695f, -0.000804f, 0.000664f, -0.000608f, 0.000399f, 0.000597f, 0.003057f, -0.001011f, 0.001284f, 0.002889f, -0.000731f, -0.000056f, -0.000438f, 0.000747f, 0.001501f, 0.001561f, 0.001987f, 0.000590f, 0.001695f, -0.000359f, -0.000946f, -0.003254f, 0.000733f, -0.000437f, -0.001634f, -0.001120f, -0.000026f, -0.000245f, 0.001102f, -0.000082f, -0.001898f, -0.001915f, 0.000563f, -0.001653f, 0.000259f, 0.001128f, -0.001527f, -0.000962f, -0.000636f, 0.000852f, 0.000723f, 0.000030f, -0.000183f, 0.001245f, 0.000269f, -0.000364f, 0.000487f, -0.000916f, 0.000146f, -0.000440f, -0.000738f, -0.000420f, 0.017710f, -0.006161f, 0.003344f, -0.002308f, 0.003324f, -0.002339f, 0.002038f, -0.000755f, 0.002070f, 0.000508f, 0.001456f, -0.001689f, 0.001737f, -0.000589f, -0.001445f, -0.000143f, -0.001553f, -0.002470f, -0.001310f, -0.000263f, 0.001252f, -0.001689f, -0.002272f, -0.002772f, -0.000504f, -0.000237f, 0.002217f, 0.001224f, 0.001422f, -0.000970f, 0.001148f, -0.000875f, -0.000874f, -0.000470f, 0.001458f, 0.001272f, 0.000386f, -0.000003f, + -0.000063f, 0.000047f, -0.000422f, -0.000226f, 0.001004f, 0.000203f, 0.002486f, -0.000953f, -0.000313f, -0.002077f, 0.001350f, -0.000540f, -0.000338f, -0.000488f, -0.000144f, 0.000123f, -0.000362f, 0.005031f, -0.007544f, 0.004513f, -0.002787f, 0.003518f, 0.000018f, 0.002205f, 0.000664f, -0.003276f, -0.001523f, -0.001067f, 0.000465f, 0.000891f, 0.000524f, 0.003818f, -0.002058f, 0.003062f, 0.000581f, 0.000438f, -0.001999f, -0.000389f, 0.002656f, -0.000115f, -0.002149f, 0.002568f, 0.001976f, 0.000481f, -0.000977f, -0.000760f, -0.000161f, -0.000118f, 0.001222f, -0.000514f, 0.000577f, -0.001350f, -0.000253f, 0.000869f, -0.001970f, 0.000834f, -0.000729f, 0.000785f, -0.000529f, -0.000120f, 0.002452f, 0.001093f, 0.001422f, -0.000045f, 0.000623f, 0.000939f, -0.000121f, -0.000597f, -0.000997f, 0.000425f, 0.000542f, 0.000916f, 0.001087f, 0.000308f, -0.000174f, -0.000989f, -0.000423f, -0.000999f, -0.019094f, -0.004048f, -0.000748f, -0.003384f, -0.001548f, 0.002585f, 0.000961f, -0.001057f, -0.000976f, -0.002497f, -0.001750f, -0.002069f, -0.002307f, -0.001940f, -0.001337f, -0.001775f, -0.002880f, -0.002478f, + 0.000617f, -0.002511f, 0.000511f, -0.003299f, -0.000151f, -0.001494f, -0.001269f, 0.002458f, -0.000528f, -0.001521f, 0.001476f, -0.002158f, 0.001573f, 0.000334f, 0.001673f, 0.001103f, -0.000295f, -0.001135f, 0.001771f, -0.000236f, -0.000570f, 0.001642f, -0.001029f, -0.002718f, -0.003104f, -0.000932f, 0.000682f, 0.000404f, -0.001110f, -0.000282f, -0.001049f, -0.000015f, -0.000227f, -0.000047f, 0.001512f, 0.000509f, -0.001557f, -0.000673f, -0.000041f, 0.000944f, -0.000014f, 0.001504f, 0.000184f, -0.022190f, 0.019287f, -0.007872f, 0.005336f, -0.005043f, 0.001208f, -0.002474f, 0.003235f, 0.000624f, 0.000345f, -0.001570f, 0.002173f, 0.000465f, -0.004030f, 0.000424f, 0.000539f, -0.001981f, -0.003126f, 0.003064f, 0.003706f, -0.001183f, -0.001059f, 0.000666f, 0.001666f, -0.000976f, 0.003356f, -0.000061f, 0.000789f, -0.002440f, -0.000971f, -0.001428f, 0.002146f, -0.000436f, 0.000391f, 0.000550f, -0.001385f, 0.002239f, 0.001971f, 0.000644f, 0.000601f, 0.002623f, -0.001668f, -0.000325f, -0.000449f, -0.001754f, 0.000266f, -0.001107f, 0.000314f, 0.000046f, 0.000021f, 0.002185f, -0.000230f, -0.000357f, + 0.000302f, 0.000230f, 0.001192f, -0.001134f, 0.000304f, 0.000051f, 0.002480f, -0.000654f, 0.014990f, -0.001600f, -0.002906f, -0.000551f, 0.002177f, 0.001210f, 0.001087f, 0.000073f, -0.001869f, 0.000691f, 0.001440f, 0.001597f, -0.000750f, -0.000706f, 0.003178f, 0.001200f, -0.002142f, 0.000679f, 0.004058f, -0.004650f, 0.003421f, 0.000568f, 0.004321f, -0.000098f, 0.000433f, 0.000985f, 0.001032f, 0.002345f, -0.001401f, -0.000432f, 0.001014f, 0.001732f, -0.000413f, 0.000130f, 0.000405f, 0.000536f, 0.001186f, -0.001811f, 0.000162f, 0.001325f, 0.000538f, -0.000923f, -0.000128f, 0.002722f, 0.002094f, 0.001062f, -0.000763f, -0.000551f, 0.000950f, -0.000165f, -0.000411f, 0.000611f, -0.000567f, -0.001069f, 0.002848f, 0.001187f, 0.001912f, 0.000419f, 0.001500f, 0.001185f, 0.001361f, 0.000272f, 0.001603f, 0.000826f, 0.001209f, 0.007056f, 0.002070f, 0.001716f, -0.000999f, -0.000674f, -0.001874f, -0.001353f, 0.000388f, -0.000741f, -0.000896f, -0.002733f, 0.002379f, 0.001614f, -0.001653f, 0.002910f, -0.002690f, -0.000839f, 0.001283f, -0.002047f, 0.001245f, 0.001876f, 0.002958f, 0.002530f, + 0.002504f, 0.001236f, -0.005067f, -0.000030f, -0.001000f, 0.000995f, -0.000413f, 0.001972f, 0.001450f, -0.000708f, -0.001160f, 0.001270f, -0.000824f, 0.003339f, 0.000099f, 0.001062f, 0.003544f, 0.003228f, -0.002379f, 0.000137f, -0.001528f, -0.003038f, -0.000204f, 0.000473f, -0.000257f, -0.000697f, -0.000191f, 0.000159f, -0.001257f, 0.000080f, -0.001484f, -0.000563f, -0.000053f, 0.000312f, 0.000154f, -0.001071f, -0.000861f, 0.001928f, -0.000578f, 0.000172f, 0.001076f, 0.000986f, -0.000471f, -0.000808f, 0.016655f, -0.011649f, 0.004295f, -0.004399f, -0.000304f, -0.003061f, 0.002845f, 0.002832f, 0.000936f, 0.000611f, 0.002674f, 0.007295f, -0.006337f, -0.000841f, -0.001622f, -0.002527f, 0.005660f, 0.004283f, -0.000834f, -0.003807f, 0.001596f, -0.003101f, -0.002485f, -0.004363f, 0.000596f, -0.004468f, -0.001461f, 0.002713f, 0.000415f, -0.001334f, -0.003699f, 0.000060f, -0.000870f, 0.002319f, 0.002112f, 0.001016f, -0.001666f, 0.000310f, -0.000079f, 0.000973f, 0.001826f, -0.001085f, -0.000550f, -0.001964f, 0.003091f, -0.000322f, 0.000478f, 0.002792f, -0.000539f, -0.000190f, 0.001118f, -0.001313f, + -0.000118f, 0.001247f, -0.002007f, 0.000523f, -0.000353f, -0.000116f, -0.002094f, 0.001091f, -0.000430f, 0.000244f, 0.000546f, -0.000722f, 0.001414f, -0.001034f, -0.000257f, -0.026004f, 0.003451f, 0.000232f, 0.001689f, -0.002118f, -0.003358f, -0.000144f, 0.002039f, 0.003312f, -0.000336f, 0.005103f, 0.002791f, -0.003669f, -0.003282f, 0.002317f, 0.000318f, -0.002650f, -0.004806f, -0.005502f, -0.003566f, -0.004093f, -0.004558f, 0.000676f, 0.001297f, 0.001057f, -0.003401f, -0.003284f, 0.000369f, -0.000955f, -0.000651f, -0.000545f, -0.002734f, 0.002098f, -0.004625f, -0.001810f, -0.000796f, -0.000285f, 0.001338f, 0.000389f, -0.000416f, 0.001967f, -0.000738f, 0.001961f, 0.001094f, -0.001718f, 0.000158f, 0.003262f, -0.001447f, -0.001466f, -0.000008f, 0.001864f, 0.000418f, -0.001517f, -0.001895f, 0.001542f, -0.000001f, -0.002481f, 0.003168f, 0.003559f, 0.000360f, -0.001156f, 0.000357f, -0.000176f, 0.000701f, 0.001513f, -0.000232f, 0.002044f, -0.015843f, 0.013547f, -0.004525f, 0.002893f, -0.000066f, 0.002252f, -0.005474f, 0.002115f, -0.003726f, 0.000008f, -0.002514f, 0.005073f, 0.004346f, 0.001620f, + 0.000373f, -0.004197f, -0.002748f, -0.000452f, -0.001654f, 0.004803f, -0.003915f, -0.000183f, -0.001922f, 0.007039f, -0.002213f, 0.000600f, -0.000161f, 0.001183f, 0.000596f, 0.001175f, 0.000934f, -0.001211f, 0.000683f, -0.000329f, 0.002518f, 0.000333f, 0.004731f, 0.002377f, -0.001455f, -0.000372f, -0.000525f, 0.000028f, -0.001726f, -0.001322f, -0.000385f, 0.000770f, 0.005770f, 0.000448f, 0.000450f, -0.001641f, 0.002397f, -0.000942f, -0.001146f, 0.000669f, -0.001110f, 0.000616f, -0.001394f, -0.003286f, 0.001662f, 0.001315f, -0.000365f, 0.003232f, 0.000791f, 0.000682f, 0.001281f, -0.001011f, 0.000478f, -0.000852f, 0.003257f, 0.002121f, -0.000204f, -0.001028f, -0.000809f, -0.000363f, 0.010216f, -0.000355f, 0.002207f, -0.007150f, -0.001293f, 0.000765f, -0.005796f, 0.000330f, 0.007729f, -0.001493f, 0.000438f, -0.003668f, -0.004984f, 0.001110f, -0.004565f, 0.006798f, -0.004937f, 0.001535f, 0.001506f, 0.003581f, 0.002750f, -0.000883f, -0.004423f, -0.000625f, -0.000531f, 0.002067f, -0.003144f, -0.000711f, -0.001022f, -0.001561f, -0.001160f, 0.001969f, 0.001148f, 0.005483f, 0.001760f, -0.002222f, + 0.002181f, -0.001661f, -0.001761f, 0.001593f, 0.004653f, -0.000826f, -0.002639f, -0.002458f, 0.002394f, -0.000199f, -0.003647f, -0.003344f, 0.001473f, 0.001392f, -0.001620f, -0.002787f, -0.004581f, 0.001080f, 0.001451f, 0.000966f, -0.002679f, 0.001732f, 0.000945f, 0.000646f, 0.035379f, -0.002056f, 0.001604f, 0.003407f, -0.002895f, -0.001131f, -0.000867f, -0.008109f, 0.005758f, -0.000720f, -0.004954f, 0.001291f, -0.002449f, 0.003202f, 0.002582f, 0.004020f, -0.001178f, 0.005391f, 0.004659f, 0.003032f, -0.004410f, 0.003705f, -0.006119f, -0.003551f, -0.004103f, 0.001871f, -0.003108f, -0.000427f, -0.000932f, -0.004036f, -0.002091f, 0.003717f, -0.002448f, -0.001831f, -0.003822f, 0.001468f, 0.001490f, 0.003170f, -0.001505f, 0.005336f, 0.001486f, 0.006059f, -0.000483f, 0.001230f, 0.001382f, -0.003102f, 0.002517f, 0.006192f, -0.001888f, -0.000017f, 0.001833f, -0.001607f, -0.002246f, 0.001578f, -0.002239f, -0.001167f, -0.002986f, -0.001943f, 0.002536f, 0.002232f, 0.001594f, 0.002381f, 0.003010f, 0.002819f, 0.004234f, 0.000773f, -0.001041f, -0.015934f, -0.030903f, 0.010968f, -0.000243f, 0.000258f, + -0.003402f, -0.003635f, -0.001080f, 0.000675f, -0.002321f, 0.007598f, -0.004034f, -0.007358f, 0.000072f, 0.000050f, -0.001260f, -0.002853f, 0.005099f, 0.000586f, -0.002781f, 0.002127f, -0.005163f, 0.005709f, -0.003759f, -0.002200f, -0.004503f, 0.006412f, -0.003283f, -0.001416f, -0.004461f, -0.002345f, 0.003383f, -0.002169f, 0.003693f, -0.005634f, -0.006389f, 0.000050f, 0.000735f, 0.000597f, -0.000480f, -0.003603f, 0.000266f, 0.001154f, 0.000492f, 0.002695f, -0.000330f, 0.004488f, 0.000379f, 0.004170f, 0.005787f, 0.000776f, -0.000767f, 0.000649f, -0.003720f, -0.001383f, -0.006008f, -0.005599f, 0.001192f, 0.000986f, 0.000700f, -0.000887f, -0.001923f, -0.001396f, -0.001685f, -0.001331f, -0.001679f, -0.000536f, -0.000411f, 0.000492f, -0.010392f, 0.029670f, -0.013756f, 0.006049f, -0.003040f, 0.009293f, -0.001644f, -0.004379f, -0.004513f, 0.002291f, -0.001441f, -0.000769f, 0.000083f, 0.001643f, -0.010159f, -0.005117f, -0.002710f, 0.003762f, 0.003235f, 0.005618f, 0.000960f, -0.001131f, -0.001031f, 0.006772f, -0.009221f, 0.005029f, -0.004483f, -0.001179f, -0.004712f, 0.006979f, 0.002828f, -0.004997f, + 0.000549f, -0.002358f, 0.000709f, 0.002776f, -0.013162f, -0.005779f, 0.001015f, 0.004282f, -0.002752f, 0.000640f, 0.003305f, -0.001704f, -0.001529f, -0.000830f, 0.005023f, 0.001636f, 0.000827f, 0.000189f, 0.001916f, 0.005560f, -0.003648f, 0.002315f, -0.008391f, -0.001868f, 0.001852f, 0.003590f, 0.000726f, 0.000122f, 0.000165f, 0.001700f, -0.001666f, -0.000257f, -0.000621f, -0.002506f, -0.001753f, 0.002554f, 0.002999f, -0.001760f, -0.001631f, -0.005866f, -0.026931f, -0.005933f, 0.002468f, -0.006508f, 0.001450f, 0.001007f, 0.003777f, -0.000181f, 0.007334f, 0.004720f, 0.002561f, -0.002216f, -0.003812f, -0.000358f, 0.007774f, -0.006937f, -0.002722f, -0.005417f, -0.000251f, -0.014508f, -0.011435f, 0.000535f, 0.006883f, 0.009476f, 0.002100f, -0.003695f, 0.003166f, -0.003304f, -0.002208f, -0.002312f, 0.000832f, 0.002339f, 0.000496f, 0.003565f, -0.002971f, -0.005294f, 0.004103f, 0.002578f, 0.008749f, -0.001289f, 0.001330f, -0.001477f, 0.007038f, -0.007648f, -0.003846f, -0.001973f, -0.005755f, 0.003377f, -0.002436f, 0.002798f, -0.006154f, 0.005806f, 0.005748f, 0.005157f, -0.002298f, 0.004540f, + 0.000155f, 0.001426f, 0.002698f, 0.001750f, -0.002630f, 0.000192f, -0.000890f, -0.000395f, 0.005393f, 0.001792f, -0.002526f, 0.004184f, -0.000839f, -0.004126f, -0.001407f, -0.000554f, 0.019673f, 0.012879f, -0.003717f, 0.005977f, -0.012645f, 0.009317f, 0.003589f, 0.007071f, -0.002074f, -0.001478f, -0.006796f, -0.003388f, -0.011804f, -0.001855f, -0.009340f, -0.002687f, -0.005646f, -0.005834f, -0.007887f, 0.003470f, -0.010876f, 0.001727f, 0.005109f, -0.001922f, 0.001809f, -0.004584f, 0.000229f, -0.001281f, -0.001296f, -0.006331f, -0.000583f, 0.000970f, -0.000144f, -0.000797f, -0.003121f, -0.002769f, 0.002331f, 0.002358f, 0.003148f, 0.014387f, -0.005396f, -0.000123f, 0.006069f, -0.001172f, -0.002029f, -0.005239f, 0.002018f, 0.005015f, 0.008307f, 0.002884f, 0.006990f, -0.006292f, -0.009394f, 0.001125f, 0.006759f, 0.003769f, -0.004889f, 0.006304f, -0.004229f, 0.003130f, 0.001613f, 0.005738f, 0.003546f, 0.002210f, 0.004180f, -0.003597f, 0.002830f, 0.002144f, 0.001584f, 0.005582f, 0.001721f, 0.004496f, 0.039197f, -0.025369f, -0.001382f, 0.002946f, 0.000781f, 0.003098f, 0.005358f, -0.001071f, + -0.000879f, 0.003027f, -0.004548f, -0.004309f, -0.000734f, 0.003495f, 0.014080f, 0.000616f, 0.004842f, -0.004517f, 0.000248f, -0.013919f, 0.008578f, -0.008404f, -0.012064f, 0.002831f, 0.003323f, -0.004421f, 0.003956f, 0.001725f, 0.009254f, 0.010356f, -0.001781f, -0.003846f, -0.003012f, -0.015361f, -0.008481f, 0.012134f, 0.003897f, 0.004502f, -0.007048f, -0.007074f, 0.002009f, -0.001320f, -0.006253f, 0.005420f, -0.001291f, -0.003770f, -0.004571f, 0.003107f, -0.004120f, -0.002047f, 0.014003f, -0.008552f, 0.002448f, -0.003012f, 0.003092f, -0.003796f, -0.001804f, -0.010472f, 0.001550f, -0.003813f, -0.002887f, 0.008549f, 0.001756f, 0.002467f, 0.004794f, 0.006243f, 0.001469f, 0.004366f, -0.002294f, -0.000368f, -0.007411f, 0.003317f, 0.005174f, -0.025279f, -0.012893f, 0.003636f, -0.002388f, 0.007959f, -0.002127f, -0.003218f, -0.007919f, -0.008791f, 0.003307f, -0.009153f, -0.003724f, -0.005585f, -0.001789f, -0.005848f, -0.004250f, -0.004880f, -0.002900f, -0.005837f, -0.010196f, 0.004437f, -0.019377f, -0.001124f, 0.015722f, 0.003110f, -0.000944f, -0.005473f, 0.000320f, -0.017705f, 0.006064f, 0.003258f, + 0.000304f, 0.005095f, 0.008149f, -0.008069f, -0.004590f, -0.008366f, 0.000236f, -0.000723f, -0.005231f, -0.006000f, -0.006397f, -0.004298f, -0.001104f, 0.002662f, -0.000545f, 0.001988f, 0.000862f, -0.000669f, 0.010656f, 0.001708f, -0.002697f, 0.008045f, -0.005301f, -0.011455f, -0.004029f, -0.002330f, -0.002332f, -0.001807f, -0.004426f, -0.001970f, -0.005308f, -0.002273f, -0.005381f, -0.000775f, 0.001620f, -0.006257f, -0.002238f, -0.004087f, -0.000609f, -0.006469f, -0.007208f, -0.004305f, -0.015280f, 0.019962f, -0.010234f, -0.005247f, -0.016770f, 0.012594f, -0.004773f, 0.007277f, 0.000268f, 0.000121f, -0.005207f, 0.009758f, -0.002701f, 0.002921f, 0.002350f, -0.005023f, -0.001720f, -0.001905f, -0.008890f, 0.001326f, 0.001478f, -0.007212f, -0.011466f, -0.007513f, -0.010540f, -0.003011f, 0.005614f, 0.002490f, -0.006201f, -0.006624f, 0.009123f, 0.005785f, -0.007917f, 0.006747f, -0.003930f, 0.005892f, -0.009995f, -0.008485f, -0.007592f, 0.002141f, -0.006697f, 0.003693f, -0.002964f, 0.001203f, -0.001750f, -0.001594f, 0.001713f, 0.006661f, -0.015814f, -0.002682f, 0.003373f, -0.002137f, -0.004646f, -0.012222f, + -0.000789f, 0.009865f, 0.000238f, 0.008435f, 0.007055f, 0.001207f, -0.000975f, 0.006229f, -0.006573f, -0.006483f, 0.004878f, -0.002481f, -0.003852f, 0.002137f, 0.001379f, -0.004211f, -0.004372f, 0.007552f, -0.007144f, -0.005076f, -0.003866f, -0.035065f, 0.012442f, 0.005017f, -0.009165f, 0.003850f, -0.010311f, 0.008425f, 0.007180f, 0.006073f, -0.018208f, 0.010295f, 0.018309f, -0.003033f, 0.005903f, -0.000138f, -0.006339f, -0.008087f, 0.020204f, -0.000709f, -0.002325f, -0.011817f, -0.023009f, -0.012619f, 0.000633f, -0.010389f, 0.007788f, -0.015177f, -0.005421f, -0.009136f, 0.001862f, -0.003833f, -0.011536f, 0.001416f, -0.003078f, 0.006799f, -0.002978f, -0.009078f, -0.003870f, -0.026912f, 0.004189f, -0.001256f, 0.011680f, -0.007932f, -0.008874f, 0.010979f, 0.001825f, 0.001433f, -0.005156f, -0.007542f, 0.001938f, 0.004745f, 0.003175f, -0.002325f, 0.003405f, 0.001706f, -0.000142f, -0.002803f, -0.003114f, -0.009235f, 0.000065f, -0.003988f, -0.005720f, 0.004051f, 0.001948f, 0.012325f, 0.002060f, -0.009288f, -0.009370f, 0.001268f, -0.006300f, -0.004879f, 0.000804f, -0.005108f, -0.000826f, -0.002996f, + 0.030303f, -0.009972f, 0.001620f, 0.003019f, 0.013517f, -0.000139f, -0.000890f, 0.009680f, 0.015689f, -0.008198f, -0.009600f, 0.010029f, -0.000161f, 0.008898f, 0.012387f, 0.010447f, 0.009331f, 0.007641f, 0.008910f, 0.029401f, -0.000840f, 0.003427f, 0.007002f, 0.016822f, -0.001642f, -0.004316f, 0.007531f, 0.000930f, -0.003459f, -0.004881f, -0.003839f, 0.001487f, -0.005456f, 0.012029f, 0.017749f, 0.000497f, -0.002352f, 0.008076f, -0.002253f, 0.010985f, 0.008605f, 0.001580f, -0.006617f, 0.007680f, 0.001090f, -0.001380f, 0.003062f, 0.000204f, 0.020522f, -0.000231f, 0.009959f, -0.002770f, 0.018528f, -0.000191f, 0.003356f, -0.004427f, -0.008256f, 0.009916f, -0.003123f, 0.018255f, 0.005661f, 0.009410f, 0.002066f, 0.001535f, 0.006931f, 0.002798f, 0.014143f, 0.008271f, 0.004350f, 0.007663f, -0.004837f, 0.004363f, 0.007866f, 0.002440f, 0.000443f, 0.036970f, -0.011156f, 0.003073f, -0.003926f, 0.001200f, 0.004497f, 0.012072f, -0.010038f, 0.004742f, -0.000470f, 0.000128f, 0.006579f, -0.006154f, 0.007077f, -0.020298f, -0.009111f, 0.002659f, 0.007175f, 0.004522f, 0.015531f, -0.016288f, + 0.002331f, -0.003069f, -0.021433f, 0.008322f, -0.008356f, -0.006228f, -0.003135f, -0.018376f, 0.005699f, 0.005282f, 0.002764f, -0.010065f, -0.015264f, 0.005050f, -0.009404f, 0.007304f, -0.014564f, -0.000838f, -0.017419f, -0.005401f, -0.011553f, -0.011313f, 0.010601f, 0.014997f, 0.002494f, 0.004722f, -0.007187f, 0.001732f, -0.012212f, 0.003973f, -0.007880f, 0.000879f, 0.012367f, 0.004641f, -0.003809f, 0.005737f, 0.001653f, 0.004687f, -0.004916f, 0.008856f, 0.018556f, -0.000812f, -0.010342f, -0.009428f, -0.004274f, -0.004006f, 0.001792f, 0.005947f, 0.002271f, 0.010821f, 0.000638f, 0.002458f, -0.011276f, -0.004718f, -0.038507f, -0.032372f, 0.013114f, -0.004420f, 0.015320f, -0.001637f, 0.004759f, -0.019520f, -0.018294f, -0.011323f, 0.005620f, -0.015217f, -0.010563f, -0.004807f, 0.002616f, 0.010375f, 0.003514f, -0.022123f, 0.005504f, 0.011677f, -0.031086f, -0.004121f, 0.001159f, -0.033105f, -0.011519f, 0.014076f, -0.030552f, 0.014349f, 0.015293f, -0.000275f, -0.004656f, -0.001713f, -0.007560f, -0.008512f, 0.005153f, 0.006191f, 0.022421f, -0.013900f, -0.007292f, -0.006135f, -0.010773f, 0.000115f, + -0.018208f, -0.004995f, 0.001150f, -0.001027f, -0.006058f, -0.001441f, -0.010097f, -0.002544f, 0.005343f, -0.003018f, -0.006625f, 0.006948f, -0.003672f, -0.007913f, -0.010638f, 0.021756f, -0.001063f, 0.013011f, 0.001682f, 0.004487f, 0.014625f, 0.001483f, 0.009945f, -0.007359f, 0.011075f, 0.007366f, 0.002359f, 0.002141f, 0.002669f, 0.008848f, 0.004343f, 0.000819f, 0.009196f, -0.062125f, 0.023016f, -0.007114f, -0.028049f, -0.007043f, 0.000377f, -0.007437f, 0.010378f, -0.024269f, 0.011221f, -0.002182f, -0.027967f, -0.019272f, 0.003416f, 0.010737f, 0.009983f, 0.007383f, 0.015874f, 0.004435f, 0.026346f, 0.014440f, 0.030937f, 0.003880f, 0.025043f, -0.019800f, -0.015883f, 0.005093f, 0.001771f, -0.015728f, 0.003898f, 0.003136f, -0.002636f, -0.006086f, 0.014612f, 0.002742f, -0.033792f, -0.014987f, 0.010657f, 0.003711f, -0.007582f, 0.009396f, 0.009186f, 0.015009f, 0.002712f, 0.004374f, 0.002272f, 0.004282f, 0.004956f, -0.011678f, 0.001179f, 0.002023f, -0.025220f, 0.011504f, 0.007938f, 0.010346f, -0.017500f, -0.009903f, 0.011680f, -0.000094f, -0.003919f, -0.002663f, -0.007878f, -0.006510f, + -0.000628f, -0.008638f, -0.019612f, 0.006268f, 0.019498f, -0.014412f, 0.001266f, -0.008353f, -0.003995f, -0.006290f, -0.002581f, 0.009715f, 0.025188f, 0.016777f, 0.011369f, 0.005824f, 0.000046f, -0.006821f, -0.009971f, 0.007358f, -0.026646f, 0.026536f, -0.017685f, 0.003604f, -0.028860f, -0.001832f, 0.025678f, 0.009572f, -0.010121f, 0.015952f, -0.027457f, 0.009841f, 0.004214f, 0.001033f, -0.033639f, -0.010704f, 0.001246f, 0.004437f, 0.020346f, -0.033208f, -0.005148f, -0.011619f, -0.031235f, -0.007566f, 0.006512f, 0.014316f, 0.022030f, 0.016827f, 0.016850f, -0.002433f, -0.012167f, 0.010688f, 0.002686f, -0.007932f, 0.003326f, -0.015849f, 0.022796f, 0.010079f, 0.007130f, -0.013346f, -0.027950f, -0.008265f, -0.000297f, -0.033849f, -0.027461f, -0.008054f, -0.024758f, 0.014179f, 0.004910f, 0.003622f, -0.012000f, -0.012931f, 0.003484f, 0.002127f, 0.000846f, 0.006122f, -0.005795f, 0.004293f, 0.014342f, 0.005815f, 0.001244f, 0.000790f, -0.011859f, -0.010015f, -0.009504f, 0.003144f, -0.004802f, 0.029274f, -0.023896f, 0.005690f, -0.003901f, -0.003594f, -0.000068f, 0.007701f, -0.015138f, 0.018874f, + -0.006239f, 0.012779f, -0.001942f, -0.011346f, 0.020010f, 0.019862f, 0.013925f, -0.007343f, 0.030640f, 0.011087f, -0.035696f, 0.035609f, 0.002601f, -0.000591f, 0.025391f, 0.000674f, -0.012039f, -0.015615f, 0.025028f, -0.016600f, -0.022264f, 0.020389f, 0.017425f, -0.012289f, -0.029390f, 0.010787f, -0.010604f, 0.003547f, -0.020929f, -0.016927f, -0.007649f, 0.019101f, 0.016701f, 0.001909f, 0.015244f, -0.023757f, 0.006680f, -0.006532f, -0.009571f, 0.010812f, 0.000687f, 0.003061f, -0.033599f, -0.009314f, 0.017277f, -0.023729f, -0.007015f, -0.029673f, -0.006412f, -0.011298f, 0.003978f, -0.007428f, 0.002334f, 0.002679f, -0.001995f, 0.002596f, -0.008838f, -0.026411f, -0.005904f, 0.012900f, -0.002742f, 0.008780f, -0.010946f, -0.023396f, -0.004837f, 0.004286f, 0.027071f, 0.002078f, -0.007846f, -0.019404f, -0.000616f, -0.009299f, 0.007265f, -0.016060f, 0.010254f, 0.006423f, -0.013912f, -0.014436f, 0.021770f, -0.025634f, -0.000880f, 0.016388f, -0.018355f, 0.005841f, 0.021332f, -0.016980f, 0.014699f, 0.010520f, 0.015739f, -0.025742f, 0.022309f, -0.025862f, 0.007978f, -0.019744f, 0.002700f, -0.010206f, + 0.017679f, 0.000313f, 0.010954f, 0.005257f, -0.017918f, -0.011379f, -0.024870f, 0.014451f, -0.016702f, 0.014518f, -0.020132f, -0.023696f, -0.038737f, 0.003511f, 0.021060f, -0.003469f, -0.000079f, 0.006158f, 0.018298f, -0.006372f, 0.005372f, -0.022026f, 0.006165f, 0.028351f, -0.002189f, 0.025649f, 0.034879f, -0.000653f, 0.006556f, 0.006563f, -0.013645f, 0.007100f, -0.016635f, -0.001367f, -0.016994f, -0.018059f, 0.002281f, -0.007159f, -0.028351f, 0.019666f, 0.002108f, 0.014509f, -0.015620f, -0.009430f, -0.004229f, -0.061428f, 0.015431f, 0.022837f, 0.006245f, -0.026682f, -0.004017f, 0.043118f, -0.049812f, -0.001369f, -0.008513f, -0.032603f, -0.008328f, -0.022127f, 0.007931f, 0.007918f, 0.018857f, 0.007591f, -0.026124f, -0.009331f, 0.018575f, -0.029755f, -0.008581f, -0.031817f, 0.026891f, 0.008002f, 0.020990f, 0.035942f, -0.012884f, -0.007740f, -0.006134f, -0.018201f, 0.017108f, -0.008617f, -0.021728f, -0.024287f, -0.004442f, 0.009100f, -0.000899f, 0.004758f, 0.005650f, 0.013857f, -0.006422f, -0.000856f, 0.010145f, -0.010255f, 0.020136f, 0.023000f, 0.021616f, -0.018020f, 0.002060f, -0.005818f, + 0.010144f, 0.043514f, 0.032501f, 0.062391f, 0.004587f, 0.024422f, 0.019647f, -0.009958f, -0.002613f, -0.003766f, -0.006345f, 0.007374f, 0.001317f, 0.021956f, 0.016437f, -0.008384f, -0.002925f, -0.014273f, -0.026988f, 0.009550f, -0.001053f, 0.007720f, -0.002555f, -0.019894f, -0.003099f, 0.000055f} +}; +const float CRendBin_Combined_BRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS][2522]={ {-0.004162f, 0.000448f, -0.000930f, 0.000917f, -0.000455f, 0.000395f, -0.000006f, 0.000439f, -0.000027f, 0.000475f, -0.000583f, -0.000275f, 0.000277f, -0.000394f, -0.000066f, -0.000617f, -0.000043f, -0.000228f, 0.001227f, 0.000583f, -0.000747f, 0.000029f, 0.000306f, -0.000028f, -0.000173f, 0.000318f, 0.000034f, 0.000209f, 0.000296f, 0.000262f, -0.000380f, -0.000102f, 0.000036f, 0.000053f, 0.000073f, -0.000027f, 0.000018f, -0.000029f, 0.000064f, 0.000006f, -0.000003f, -0.000038f, -0.000007f, 0.000031f, -0.000010f, 0.000022f, 0.003133f, 0.001814f, 0.000972f, 0.000486f, 0.000526f, 0.000178f, 0.000373f, -0.000069f, -0.000070f, 0.000900f, 0.000510f, 0.000418f, 0.000863f, 0.000722f, 0.000985f, -0.001373f, 0.001193f, 0.000330f, 0.000079f, 0.000239f, -0.000083f, -0.000615f, -0.000438f, 0.000703f, 0.000318f, 0.000575f, 0.000026f, -0.000197f, 0.000420f, -0.000049f, -0.000204f, 0.000425f, 0.000222f, 0.000624f, 0.000178f, 0.000415f, -0.000620f, -0.000374f, 0.000333f, 0.000061f, 0.000358f, 0.000149f, -0.000077f, -0.000165f, -0.000503f, 0.000104f, 0.001676f, -0.001733f, -0.000357f, -0.000338f, + -0.000441f, -0.000093f, -0.000058f, -0.000302f, -0.000273f, 0.000038f, 0.000044f, -0.000211f, 0.000114f, -0.000512f, -0.000190f, -0.000053f, 0.000305f, -0.001841f, -0.000204f, 0.000425f, -0.000206f, -0.000190f, 0.000138f, 0.000074f, 0.000107f, 0.000904f, -0.000443f, -0.000238f, -0.000487f, -0.000046f, 0.000231f, 0.000429f, -0.000420f, -0.000257f, 0.000439f, -0.000382f, -0.000651f, -0.000027f, -0.000192f, 0.000262f, -0.000208f, -0.000136f, 0.000084f, 0.000238f, -0.000407f, 0.000172f, -0.006005f, -0.004118f, -0.001639f, -0.001922f, -0.001036f, -0.001014f, -0.000916f, -0.000446f, -0.001109f, -0.000914f, -0.000362f, -0.000715f, -0.000062f, -0.000268f, -0.000578f, -0.000839f, -0.000891f, -0.000377f, -0.000503f, -0.000943f, -0.000088f, -0.001175f, 0.000038f, -0.000099f, -0.000126f, -0.000714f, -0.000085f, -0.000542f, 0.000041f, -0.000695f, -0.000401f, 0.000230f, -0.000467f, 0.000083f, -0.001134f, -0.000221f, 0.000613f, 0.000348f, 0.000020f, -0.000173f, -0.000295f, 0.000095f, 0.000150f, 0.000545f, -0.000282f, -0.000052f, -0.007886f, -0.000473f, 0.001060f, -0.000058f, 0.000344f, -0.000097f, 0.000047f, -0.000678f, + 0.000715f, 0.000224f, 0.000852f, 0.000537f, 0.001707f, 0.001183f, 0.000132f, -0.000704f, -0.000343f, -0.000200f, 0.000348f, -0.000269f, -0.001438f, -0.001370f, -0.000651f, -0.000250f, 0.000099f, 0.000141f, 0.000307f, -0.000100f, 0.000079f, 0.000115f, -0.000277f, -0.000089f, -0.000010f, -0.000956f, 0.000565f, 0.000172f, -0.000070f, -0.000058f, -0.000318f, -0.000553f, 0.000343f, 0.000071f, -0.000301f, 0.000265f, 0.000295f, 0.000334f, 0.008857f, 0.006269f, 0.001196f, 0.002443f, 0.000469f, 0.000824f, 0.001938f, 0.001038f, 0.000279f, 0.001208f, 0.000447f, -0.000500f, -0.000294f, 0.000431f, 0.000649f, -0.001186f, -0.000200f, -0.000706f, 0.001564f, 0.000814f, 0.000370f, 0.000813f, 0.000365f, 0.000426f, -0.000023f, -0.000066f, -0.000439f, 0.000638f, 0.000714f, 0.000657f, 0.000762f, 0.000987f, 0.000536f, 0.001436f, 0.000273f, -0.000075f, 0.000457f, 0.000099f, -0.000302f, -0.000110f, -0.000277f, -0.000281f, -0.000049f, 0.000664f, 0.000102f, 0.000108f, 0.013205f, 0.005689f, 0.001650f, 0.001602f, 0.001030f, 0.000720f, 0.000158f, 0.000100f, 0.001396f, 0.000341f, 0.000747f, 0.001142f, + 0.000520f, -0.000032f, -0.000465f, 0.002360f, -0.000272f, -0.001225f, -0.000789f, 0.000617f, -0.000033f, 0.001279f, 0.000341f, 0.000192f, -0.000295f, -0.000539f, -0.000232f, -0.000228f, 0.000474f, -0.000058f, 0.000155f, 0.000089f, 0.000013f, -0.000264f, 0.000368f, 0.001641f, 0.000943f, 0.001099f, 0.000888f, 0.000824f, 0.000359f, 0.000338f, 0.000106f, 0.000553f, -0.000524f, 0.000346f, 0.004308f, -0.004541f, -0.001449f, -0.001925f, -0.001775f, -0.000874f, -0.000331f, 0.000704f, -0.000694f, 0.000133f, -0.001755f, 0.000648f, -0.000671f, -0.001477f, 0.000360f, -0.001036f, -0.001520f, -0.000985f, 0.001364f, 0.001131f, -0.000540f, 0.000610f, -0.001018f, 0.000450f, -0.001817f, 0.000165f, 0.000254f, -0.000229f, -0.000453f, 0.000445f, -0.001441f, -0.000564f, 0.000148f, -0.000416f, -0.000447f, -0.000244f, 0.000085f, 0.000226f, 0.000681f, 0.000120f, 0.001197f, -0.000394f, -0.000360f, -0.000305f, -0.000627f, -0.000107f, -0.000323f, 0.000253f, -0.000539f, -0.015669f, -0.008062f, -0.002784f, -0.002321f, -0.002364f, -0.001608f, -0.002032f, -0.001450f, -0.002219f, -0.000491f, -0.000958f, -0.000339f, 0.000187f, + -0.001026f, -0.000179f, 0.000081f, 0.000096f, -0.001520f, -0.000879f, -0.000724f, 0.000223f, -0.002024f, 0.000282f, -0.000953f, -0.001653f, 0.000088f, 0.000066f, 0.000059f, 0.000047f, -0.000675f, -0.000379f, -0.000038f, -0.000039f, -0.000079f, -0.000556f, -0.000034f, 0.000272f, 0.000472f, 0.000297f, -0.000729f, 0.000486f, -0.000728f, 0.000559f, -0.001213f, -0.000691f, 0.000128f, -0.000540f, -0.000014f, -0.000138f, -0.009253f, 0.004825f, 0.002108f, 0.000699f, 0.001316f, 0.000171f, 0.000393f, 0.001044f, 0.001292f, 0.000605f, 0.000876f, -0.000695f, -0.000216f, -0.001047f, 0.001238f, 0.000179f, 0.000262f, 0.001553f, 0.000097f, -0.001161f, 0.001973f, -0.001353f, 0.000198f, 0.001520f, -0.000442f, 0.000343f, 0.000245f, -0.000114f, -0.000764f, -0.000269f, 0.000477f, 0.000381f, 0.000111f, -0.000365f, 0.000063f, -0.000646f, 0.001851f, 0.000073f, -0.000001f, -0.000801f, -0.000335f, -0.000549f, -0.000410f, 0.000898f, 0.000966f, -0.000333f, 0.000113f, -0.000152f, 0.000301f, -0.000022f, -0.000048f, -0.000287f, 0.000236f, 0.013956f, 0.006010f, 0.001531f, 0.003269f, 0.001804f, 0.000853f, 0.001335f, + 0.001256f, -0.000065f, 0.000929f, 0.001321f, 0.000369f, -0.000068f, 0.000757f, 0.001886f, -0.000619f, -0.000435f, -0.001507f, 0.000317f, 0.001826f, 0.000675f, 0.000121f, -0.001090f, -0.000506f, -0.000517f, 0.001915f, 0.000498f, 0.001016f, 0.000463f, -0.000863f, -0.001528f, 0.001659f, 0.000803f, -0.000976f, -0.000573f, 0.001608f, 0.001238f, -0.000047f, 0.000233f, -0.000147f, 0.000595f, 0.000461f, -0.000259f, 0.000337f, -0.000665f, -0.000251f, 0.000746f, -0.000442f, -0.000459f, 0.000918f, 0.000667f, 0.000436f, 0.000041f, 0.016492f, 0.003687f, 0.002675f, 0.001308f, 0.001178f, 0.000625f, 0.001214f, 0.001630f, 0.002364f, 0.001596f, -0.000558f, 0.002022f, -0.000468f, 0.000606f, 0.000335f, 0.001722f, 0.002320f, 0.001640f, -0.000517f, 0.002784f, -0.000613f, -0.000197f, -0.001523f, 0.000465f, -0.000525f, 0.000523f, 0.000625f, -0.000738f, -0.001239f, -0.000393f, 0.000116f, -0.000833f, -0.000406f, 0.000492f, 0.000493f, -0.000994f, -0.001021f, -0.000306f, 0.000240f, 0.000065f, 0.000170f, -0.000317f, -0.000121f, -0.000192f, -0.000475f, 0.000503f, -0.000731f, 0.000655f, -0.000777f, -0.000164f, + -0.000621f, 0.000173f, -0.000301f, 0.001847f, -0.007279f, -0.002429f, -0.002551f, -0.001761f, 0.000533f, -0.000485f, -0.001496f, 0.000838f, 0.000150f, 0.001047f, -0.000038f, 0.000057f, -0.001631f, -0.001270f, -0.000709f, -0.001304f, 0.000200f, -0.001382f, -0.002469f, 0.000457f, 0.000398f, -0.001239f, -0.000160f, -0.001127f, 0.000330f, 0.000319f, -0.000105f, -0.002688f, -0.000643f, 0.000127f, -0.000185f, 0.000188f, 0.000823f, -0.001920f, -0.000451f, -0.001212f, 0.000727f, -0.000179f, 0.000018f, 0.001201f, -0.001128f, -0.000113f, 0.000509f, -0.000186f, -0.000286f, 0.000571f, 0.000444f, -0.000771f, -0.000786f, -0.001482f, -0.000089f, -0.001136f, -0.000768f, -0.000495f, -0.017123f, -0.005959f, -0.003413f, -0.001003f, -0.001711f, -0.000174f, -0.000870f, -0.001384f, -0.001461f, 0.001859f, 0.000166f, -0.000850f, -0.000063f, -0.002960f, -0.001505f, -0.001491f, 0.002464f, -0.002060f, -0.004030f, 0.000256f, 0.000640f, 0.000240f, -0.001398f, -0.000490f, 0.001010f, -0.001995f, -0.000062f, -0.002031f, -0.000445f, 0.001012f, -0.000799f, 0.000191f, 0.002265f, 0.000158f, -0.000297f, -0.000586f, 0.000721f, 0.000590f, + 0.000679f, -0.000700f, 0.000030f, 0.000621f, 0.001086f, 0.000502f, 0.000468f, -0.001851f, 0.000493f, -0.000144f, -0.000752f, -0.000394f, 0.000333f, -0.000295f, -0.000759f, -0.000658f, -0.000792f, -0.011349f, 0.002561f, 0.000260f, -0.001485f, 0.002140f, -0.001386f, -0.000913f, 0.000426f, -0.001844f, -0.001246f, -0.000323f, 0.000710f, -0.001438f, 0.001990f, 0.000131f, -0.000150f, 0.001059f, 0.000876f, 0.001611f, -0.000259f, 0.002187f, 0.002925f, 0.002266f, 0.000593f, 0.001950f, -0.000704f, 0.001268f, -0.001477f, -0.001324f, -0.000688f, 0.000255f, 0.000814f, -0.000658f, -0.001425f, -0.000634f, -0.000135f, 0.000897f, -0.001383f, 0.001002f, 0.000211f, 0.000790f, -0.000433f, -0.001089f, -0.001681f, -0.001792f, 0.000379f, -0.000880f, 0.000398f, -0.001907f, -0.000688f, 0.000967f, -0.001366f, 0.000281f, -0.000996f, 0.000674f, -0.000401f, 0.000656f, 0.000017f, -0.000280f, -0.000153f, -0.000725f, 0.007613f, 0.012666f, 0.003627f, 0.003319f, 0.004520f, 0.003730f, 0.000689f, 0.002965f, 0.002568f, 0.001455f, 0.005485f, 0.001350f, 0.000897f, 0.002424f, 0.002173f, 0.001197f, 0.000940f, 0.000612f, + 0.000878f, -0.000683f, 0.002747f, -0.000719f, 0.000227f, -0.000849f, 0.001723f, 0.000115f, -0.000501f, 0.001486f, 0.001695f, 0.000638f, 0.002263f, -0.001614f, -0.002755f, -0.000590f, -0.000207f, 0.000607f, -0.000238f, 0.001185f, -0.001135f, 0.001078f, 0.002274f, 0.001017f, -0.002127f, -0.000416f, 0.001001f, 0.000425f, -0.001072f, 0.001475f, 0.000517f, 0.000876f, 0.000903f, 0.001315f, 0.000369f, -0.000361f, 0.000258f, -0.001181f, -0.000375f, 0.001104f, 0.000946f, -0.000574f, -0.000081f, 0.028941f, 0.003063f, -0.000354f, 0.001874f, -0.000117f, 0.002558f, -0.000034f, 0.000746f, 0.000251f, 0.002691f, 0.001157f, -0.000997f, 0.000813f, 0.001330f, 0.000608f, -0.001501f, -0.003345f, -0.001427f, -0.001443f, 0.000658f, -0.002079f, -0.000277f, -0.000194f, 0.000617f, 0.003542f, 0.002080f, 0.000614f, 0.001522f, -0.002312f, -0.000063f, -0.001243f, -0.000377f, -0.000994f, 0.001428f, -0.000584f, 0.002340f, -0.001109f, -0.000337f, -0.001230f, -0.000448f, -0.001747f, -0.000712f, 0.000320f, 0.000436f, -0.000155f, 0.000088f, -0.000989f, 0.000591f, 0.001496f, 0.000193f, -0.000908f, 0.001045f, -0.001449f, + 0.000667f, 0.000540f, -0.000076f, -0.000497f, -0.000235f, -0.000129f, -0.000204f, 0.000001f, -0.008464f, -0.010023f, -0.001888f, -0.000536f, -0.000430f, -0.001571f, -0.000678f, 0.003075f, 0.001788f, 0.000671f, 0.000817f, -0.001300f, -0.000280f, 0.002320f, -0.000855f, 0.003758f, -0.002903f, -0.000756f, 0.003027f, -0.000550f, -0.000348f, -0.001728f, 0.002074f, 0.002340f, 0.000037f, 0.002309f, -0.000830f, 0.001048f, -0.000051f, -0.001225f, -0.000202f, -0.000958f, -0.000421f, -0.000604f, 0.001253f, -0.000874f, -0.000219f, -0.001369f, 0.000963f, -0.000685f, 0.002100f, -0.003257f, 0.001395f, 0.001210f, -0.001996f, 0.000100f, -0.001317f, 0.000416f, -0.001499f, 0.000539f, 0.000633f, -0.001848f, -0.000282f, -0.000631f, -0.002838f, -0.001581f, -0.000783f, -0.001347f, -0.000302f, -0.000170f, 0.000160f, -0.001087f, 0.000167f, -0.002165f, 0.000628f, -0.007361f, -0.004313f, -0.005696f, -0.003012f, -0.003783f, -0.000490f, 0.003775f, -0.003931f, 0.003048f, 0.001851f, -0.002048f, 0.004179f, -0.000602f, 0.000773f, -0.002694f, -0.000346f, -0.001159f, -0.000224f, 0.000089f, 0.000997f, 0.000582f, 0.002163f, 0.004307f, + -0.001189f, 0.000658f, -0.002066f, -0.002040f, -0.001919f, 0.000505f, 0.001722f, -0.000542f, -0.000652f, -0.000483f, -0.001344f, 0.001549f, -0.000495f, -0.000016f, -0.001313f, -0.000925f, -0.000883f, -0.001237f, -0.000140f, 0.000027f, -0.001144f, 0.000819f, -0.001735f, 0.000719f, -0.001016f, -0.000089f, 0.000599f, -0.001174f, 0.001542f, -0.002624f, -0.000861f, 0.000348f, -0.000819f, -0.001356f, 0.000699f, -0.000306f, -0.001639f, 0.002771f, 0.001507f, 0.000467f, 0.000508f, 0.000637f, 0.000657f, -0.001252f, -0.020598f, -0.002428f, 0.001737f, -0.001578f, 0.003496f, 0.001519f, -0.004117f, 0.000501f, 0.000769f, -0.001414f, -0.003439f, -0.001364f, -0.000790f, 0.000934f, 0.000314f, -0.003308f, -0.001162f, -0.001796f, -0.003059f, -0.002696f, -0.006055f, -0.003251f, -0.003514f, -0.004403f, 0.003498f, -0.002374f, 0.001314f, 0.002510f, -0.001814f, -0.003010f, -0.001081f, -0.000705f, 0.000754f, 0.001865f, 0.001174f, -0.002508f, -0.002977f, 0.002308f, 0.001535f, 0.001810f, 0.002695f, 0.000308f, 0.000027f, 0.000966f, -0.000090f, -0.001251f, 0.000705f, -0.000712f, -0.000374f, 0.001479f, 0.003998f, -0.001398f, + -0.001966f, 0.000844f, -0.001250f, -0.000203f, 0.002057f, -0.004013f, -0.000051f, -0.001381f, -0.000219f, -0.000171f, 0.000010f, -0.000557f, 0.000760f, -0.001260f, 0.001386f, 0.016515f, 0.014477f, 0.003867f, 0.008816f, 0.002382f, 0.005090f, -0.000870f, -0.000770f, 0.002405f, 0.003352f, 0.001709f, -0.005706f, -0.001958f, 0.003598f, 0.003977f, -0.001467f, -0.002008f, 0.000675f, 0.001616f, 0.001926f, 0.000216f, -0.002968f, -0.006478f, -0.002396f, 0.003424f, -0.000301f, 0.003517f, -0.000844f, -0.001223f, 0.000732f, -0.003062f, -0.001724f, -0.001818f, 0.003293f, -0.004193f, -0.002833f, 0.000645f, 0.000683f, -0.001153f, -0.000137f, -0.001276f, 0.001223f, 0.001575f, 0.001430f, 0.003145f, 0.001880f, -0.000054f, -0.002676f, 0.002391f, -0.000254f, 0.001271f, -0.001320f, 0.000848f, 0.001961f, -0.000427f, -0.000552f, -0.001368f, -0.001492f, 0.000769f, 0.000179f, 0.001138f, -0.001294f, 0.000923f, 0.002551f, -0.000685f, -0.001429f, 0.001645f, 0.019965f, 0.003862f, -0.004045f, 0.003383f, 0.002000f, -0.003680f, -0.000973f, 0.002069f, -0.000004f, 0.000752f, -0.000430f, -0.000664f, -0.004322f, -0.003975f, + 0.001707f, 0.004020f, 0.003892f, -0.003818f, -0.008134f, 0.001263f, -0.000242f, -0.003073f, -0.004215f, -0.000580f, 0.001934f, -0.001269f, 0.002928f, 0.005032f, -0.001942f, -0.001446f, -0.000766f, -0.000571f, -0.001058f, -0.007315f, 0.003799f, 0.003713f, -0.000238f, 0.002452f, -0.002362f, -0.000559f, -0.002154f, 0.003175f, 0.003130f, 0.000524f, -0.000891f, -0.001007f, 0.001713f, 0.000601f, -0.001128f, -0.001722f, -0.000068f, 0.001766f, -0.002490f, -0.001328f, -0.001381f, 0.000587f, 0.000716f, -0.002870f, 0.001502f, 0.003546f, -0.002792f, 0.000146f, -0.000700f, -0.000291f, -0.000052f, 0.000518f, 0.000168f, -0.001013f, -0.002246f, -0.001485f, -0.000627f, 0.001608f, -0.000830f, -0.005383f, -0.003739f, 0.000642f, 0.004871f, -0.004888f, 0.003453f, 0.001753f, 0.000668f, 0.001141f, 0.000750f, 0.003376f, 0.005157f, 0.000270f, 0.001479f, 0.000711f, -0.004633f, -0.003983f, 0.003912f, 0.000676f, -0.004780f, 0.002893f, -0.004094f, 0.000793f, 0.004812f, -0.000177f, -0.001437f, 0.005745f, 0.000780f, 0.000523f, 0.000368f, 0.000309f, 0.000416f, -0.002322f, 0.001391f, 0.002406f, 0.003614f, -0.002789f, + -0.001538f, 0.000725f, 0.000435f, -0.001195f, -0.002730f, 0.001850f, -0.001042f, 0.001345f, 0.000559f, -0.000763f, -0.000925f, 0.000542f, 0.001620f, -0.001111f, -0.000622f, -0.000117f, 0.000912f, -0.002516f, -0.001304f, 0.001423f, 0.000223f, -0.000730f, -0.000507f, 0.001309f, -0.021537f, -0.019872f, -0.004376f, -0.009230f, -0.008005f, -0.004611f, -0.001324f, -0.003468f, -0.004064f, 0.002772f, 0.000819f, -0.000991f, 0.004783f, 0.001702f, 0.005736f, 0.004360f, 0.001340f, 0.001736f, 0.002147f, -0.008691f, 0.004176f, -0.000682f, -0.001748f, -0.001633f, -0.005041f, -0.001592f, -0.001686f, 0.004932f, -0.001550f, -0.002940f, -0.001365f, 0.000795f, -0.000538f, -0.000969f, 0.001197f, -0.001284f, -0.000733f, 0.003041f, -0.002841f, -0.000229f, -0.000836f, 0.005462f, 0.002279f, 0.002211f, -0.004046f, 0.000368f, 0.003848f, -0.001900f, 0.001024f, 0.000078f, 0.001044f, 0.000090f, 0.000457f, -0.000212f, 0.002517f, -0.000228f, -0.000619f, 0.001814f, -0.001068f, 0.001066f, 0.002225f, -0.000857f, -0.001271f, 0.000758f, 0.000955f, -0.001420f, -0.000467f, -0.013308f, 0.028336f, 0.018120f, 0.005541f, 0.001945f, + 0.001746f, 0.002213f, 0.002984f, 0.002999f, 0.005819f, 0.012260f, 0.000460f, 0.001553f, 0.002398f, 0.002649f, 0.002872f, -0.002084f, 0.011486f, 0.008523f, -0.008029f, 0.005915f, 0.000814f, -0.001092f, 0.002561f, 0.007243f, -0.006909f, -0.001738f, 0.000273f, -0.005366f, -0.004037f, -0.003794f, 0.007776f, -0.000207f, -0.001722f, 0.001219f, 0.000149f, -0.002262f, -0.006775f, 0.004630f, 0.003352f, -0.000957f, 0.001679f, 0.004740f, -0.003390f, 0.002643f, -0.000079f, -0.001063f, 0.003283f, 0.003234f, 0.000363f, 0.000551f, -0.000002f, 0.002627f, 0.003141f, 0.000159f, -0.001038f, 0.000094f, -0.001534f, 0.002603f, 0.000084f, -0.000874f, -0.001690f, -0.000772f, 0.001401f, 0.001003f, 0.003763f, -0.001152f, 0.000982f, -0.000804f, 0.030771f, -0.010748f, -0.010864f, 0.004999f, 0.001032f, -0.003905f, -0.003731f, -0.005523f, -0.005782f, -0.003966f, -0.003648f, 0.005261f, 0.001024f, 0.000756f, -0.003077f, -0.002402f, -0.009228f, 0.000122f, -0.003756f, -0.006094f, 0.005006f, 0.003575f, 0.000887f, 0.003328f, 0.000716f, -0.000972f, -0.002192f, -0.000053f, -0.001884f, 0.002736f, 0.004252f, -0.004608f, + -0.001931f, 0.000175f, 0.002230f, 0.006263f, 0.001654f, 0.008361f, -0.004439f, 0.002703f, 0.006684f, 0.004151f, -0.003637f, -0.000934f, 0.000599f, -0.001663f, 0.002770f, -0.000383f, -0.000039f, 0.004474f, 0.002206f, 0.000775f, 0.000213f, -0.000043f, -0.002050f, 0.000009f, 0.000326f, -0.001920f, -0.001324f, 0.002001f, -0.000970f, -0.003701f, -0.000757f, 0.000151f, -0.000864f, -0.003869f, 0.000799f, 0.000828f, 0.000757f, 0.001108f, -0.001038f, -0.001609f, 0.009851f, 0.018942f, 0.007330f, 0.005128f, 0.005827f, -0.001649f, 0.001815f, -0.005315f, 0.009290f, 0.003760f, 0.008916f, 0.002756f, 0.003337f, -0.008165f, 0.010170f, 0.015274f, 0.001831f, 0.009917f, -0.002086f, -0.007964f, -0.008038f, 0.007279f, -0.002444f, 0.005815f, 0.000954f, 0.002346f, -0.004559f, 0.004498f, -0.001680f, -0.001580f, 0.007261f, 0.005149f, -0.004005f, 0.006913f, 0.000644f, 0.001263f, -0.001527f, -0.005214f, 0.001310f, 0.000377f, -0.003042f, -0.003299f, 0.002907f, 0.004267f, 0.001257f, -0.001544f, 0.001870f, 0.000126f, 0.004407f, -0.002802f, -0.000567f, -0.004597f, 0.000360f, 0.004381f, 0.002814f, -0.002136f, + -0.000198f, 0.001479f, -0.004223f, -0.000397f, -0.002950f, -0.001639f, 0.000639f, 0.000948f, 0.002503f, -0.003314f, 0.001164f, -0.003807f, 0.000097f, 0.004385f, 0.001365f, 0.000724f, -0.000366f, -0.021768f, -0.001462f, -0.004705f, 0.006000f, -0.004488f, 0.004895f, 0.000437f, 0.003878f, -0.000287f, 0.003315f, -0.010720f, 0.002998f, -0.000996f, -0.004207f, 0.002238f, -0.005069f, 0.003275f, -0.005111f, -0.002266f, -0.011015f, 0.006458f, 0.012707f, -0.004750f, -0.001934f, -0.001148f, -0.002333f, 0.002305f, 0.002353f, 0.004090f, -0.009803f, 0.003215f, -0.006183f, -0.001357f, -0.000539f, 0.005283f, 0.001667f, -0.002105f, 0.000833f, 0.001424f, 0.003315f, 0.003975f, -0.006187f, -0.001581f, 0.000665f, -0.003965f, -0.004090f, -0.000330f, -0.002976f, 0.001602f, 0.003155f, 0.000877f, 0.000388f, -0.000351f, 0.002932f, 0.008881f, 0.004567f, -0.004714f, 0.000855f, 0.002390f, -0.002757f, 0.003464f, 0.000579f, -0.002807f, -0.000514f, 0.004324f, 0.000197f, 0.004183f, -0.005114f, -0.000566f, 0.002689f, 0.000746f, -0.040147f, -0.015492f, 0.008515f, 0.002646f, -0.004901f, 0.005428f, 0.005030f, 0.007263f, + -0.001548f, -0.003644f, 0.006911f, -0.000044f, -0.004191f, 0.008688f, -0.009837f, -0.013502f, -0.005948f, -0.007407f, 0.004876f, 0.006288f, 0.000106f, 0.001361f, 0.010722f, 0.004253f, -0.010358f, -0.005156f, -0.006281f, 0.001584f, -0.009611f, -0.008969f, -0.000288f, 0.000947f, -0.003539f, -0.004513f, -0.005780f, -0.003518f, -0.005275f, -0.005792f, -0.001808f, 0.000045f, -0.001754f, -0.000745f, -0.003504f, -0.001010f, -0.002643f, -0.006710f, 0.013714f, 0.000635f, 0.003383f, -0.005993f, 0.003758f, -0.000844f, 0.002000f, -0.004937f, -0.000021f, -0.001243f, -0.003535f, -0.002850f, -0.001541f, 0.003831f, 0.003334f, 0.002850f, 0.002251f, 0.002052f, -0.000529f, -0.000604f, -0.003112f, -0.001261f, -0.000096f, -0.000963f, 0.004195f, 0.000377f, 0.002464f, -0.000726f, 0.021393f, 0.007598f, 0.017263f, 0.002488f, 0.001321f, -0.007051f, 0.002792f, 0.010007f, 0.004006f, 0.000516f, 0.007021f, -0.006384f, -0.002602f, 0.005343f, -0.004118f, 0.001694f, 0.009960f, 0.002900f, 0.001466f, 0.002863f, -0.001673f, 0.003995f, -0.003138f, -0.000178f, 0.001772f, 0.000273f, -0.002413f, -0.003014f, 0.001151f, 0.009798f, + -0.003195f, 0.002173f, -0.009257f, -0.005333f, 0.004332f, 0.010304f, -0.008140f, -0.000305f, 0.005185f, 0.000910f, 0.001994f, -0.007177f, -0.002340f, -0.006272f, -0.010229f, -0.003136f, -0.005689f, -0.006465f, 0.004862f, 0.001481f, 0.001670f, -0.004003f, -0.002177f, -0.001205f, -0.009877f, -0.001451f, 0.005478f, -0.004455f, 0.004377f, 0.008515f, 0.001321f, 0.005412f, 0.003901f, -0.000306f, -0.001896f, 0.004540f, -0.006691f, -0.001048f, -0.000483f, 0.003358f, 0.001932f, 0.002943f, 0.025416f, -0.005310f, -0.008273f, 0.001607f, 0.005562f, 0.005155f, 0.004563f, -0.001108f, 0.004945f, 0.001993f, -0.006707f, -0.012340f, 0.008087f, 0.002587f, 0.005737f, 0.003966f, -0.003770f, 0.001788f, -0.005253f, -0.007988f, 0.008186f, -0.005097f, -0.010717f, 0.001374f, -0.002113f, 0.001544f, -0.001455f, -0.000777f, -0.003053f, -0.003825f, 0.002591f, 0.007193f, -0.010490f, 0.010057f, -0.008951f, -0.010855f, 0.000613f, 0.003193f, -0.006728f, 0.005139f, -0.001365f, 0.003326f, -0.005874f, -0.002484f, 0.008670f, 0.003926f, 0.008777f, 0.002630f, 0.000194f, 0.003102f, -0.000546f, 0.000481f, 0.004332f, -0.000310f, + 0.000320f, -0.004247f, -0.003505f, -0.002504f, 0.002863f, -0.003340f, -0.003451f, 0.005523f, -0.000747f, 0.006141f, 0.000346f, -0.004621f, 0.006793f, 0.005593f, -0.001104f, 0.003496f, -0.004446f, -0.006629f, 0.001730f, -0.002873f, -0.005178f, 0.021419f, 0.026471f, -0.004214f, 0.000318f, -0.013425f, -0.001349f, -0.009855f, -0.007084f, -0.002511f, -0.004807f, 0.007237f, 0.000128f, 0.005559f, -0.012237f, 0.010040f, -0.007672f, 0.010250f, 0.000473f, 0.008083f, -0.002916f, 0.010243f, 0.003534f, -0.005254f, 0.002288f, -0.007724f, 0.005014f, -0.004430f, 0.011871f, 0.003238f, 0.007813f, -0.013213f, -0.007363f, -0.003471f, -0.006520f, -0.003050f, -0.004463f, 0.000103f, 0.015978f, -0.007708f, 0.008027f, 0.013201f, 0.001904f, 0.005608f, 0.000054f, -0.003388f, -0.006357f, -0.005184f, 0.000622f, -0.003853f, 0.008108f, -0.005680f, 0.003669f, 0.009490f, -0.001394f, -0.001226f, -0.000900f, 0.007663f, 0.008615f, 0.002301f, -0.004201f, -0.004011f, -0.002307f, 0.002945f, -0.008193f, 0.001010f, -0.001648f, -0.002726f, -0.000129f, 0.004727f, 0.000192f, 0.006873f, 0.006523f, 0.000660f, 0.001238f, -0.004126f, + -0.020950f, -0.017931f, 0.007727f, -0.002005f, 0.009659f, -0.005335f, -0.005227f, -0.006458f, -0.006122f, -0.002199f, -0.016668f, -0.005530f, 0.005733f, 0.009095f, 0.003086f, -0.010885f, -0.003716f, -0.005029f, 0.004260f, 0.016687f, 0.008602f, 0.004357f, 0.000100f, 0.001601f, 0.000299f, 0.003225f, 0.007877f, 0.001037f, 0.001651f, -0.004454f, -0.000182f, -0.006542f, 0.002106f, 0.003698f, 0.005502f, 0.001122f, -0.004777f, -0.001768f, 0.007420f, -0.003420f, 0.002404f, 0.001961f, 0.002272f, 0.010581f, -0.006373f, -0.008378f, 0.002591f, 0.007621f, 0.001249f, 0.007611f, 0.008076f, 0.004528f, 0.005366f, 0.002634f, 0.000569f, 0.005106f, 0.013873f, -0.007871f, -0.000792f, 0.002677f, 0.000492f, -0.006051f, -0.001954f, 0.005135f, -0.000946f, -0.005403f, 0.001359f, 0.010889f, -0.009574f, 0.003088f, -0.009154f, 0.005019f, 0.002210f, 0.001628f, -0.000687f, -0.041489f, -0.014183f, -0.001144f, -0.003896f, -0.010394f, 0.006441f, 0.008088f, 0.014231f, 0.004391f, 0.009031f, -0.008387f, -0.017028f, 0.007829f, -0.003851f, 0.000227f, -0.009063f, 0.008938f, -0.005262f, -0.000633f, 0.008722f, -0.023734f, + 0.002495f, 0.012050f, -0.022620f, -0.006229f, -0.007872f, 0.000920f, 0.001070f, 0.005408f, -0.006135f, 0.007230f, 0.001272f, -0.012150f, -0.005959f, 0.001248f, -0.001326f, -0.006097f, 0.005430f, 0.013769f, 0.003179f, 0.003700f, -0.002036f, -0.003613f, 0.008319f, 0.001343f, -0.003893f, -0.020138f, -0.003005f, 0.002398f, -0.009969f, 0.004698f, 0.004264f, 0.000702f, -0.007681f, -0.007111f, -0.008210f, 0.017869f, 0.004901f, -0.002814f, 0.003600f, -0.015329f, 0.001901f, -0.007194f, -0.008121f, 0.007920f, -0.001286f, 0.000097f, -0.005129f, -0.019076f, 0.002601f, 0.005870f, 0.003357f, -0.001262f, 0.011283f, 0.000650f, 0.000634f, 0.043680f, 0.011121f, 0.011182f, 0.009684f, -0.002925f, 0.000451f, 0.044894f, 0.013070f, -0.003873f, 0.027563f, -0.015588f, 0.011522f, 0.002245f, 0.007051f, 0.011066f, -0.003449f, -0.008035f, 0.008495f, -0.001739f, -0.027189f, 0.006747f, 0.007053f, 0.005541f, 0.012939f, 0.007975f, 0.008439f, -0.007900f, 0.001662f, -0.007648f, -0.003896f, 0.007801f, 0.002631f, -0.016148f, -0.009534f, -0.013590f, -0.019874f, -0.003329f, 0.004015f, 0.009369f, 0.008274f, 0.006876f, + 0.005948f, -0.003267f, 0.010267f, 0.005417f, -0.012714f, -0.005187f, 0.003254f, 0.009120f, 0.000112f, 0.001655f, 0.016603f, -0.003406f, -0.001539f, -0.004762f, -0.000997f, 0.008074f, -0.007400f, -0.000344f, -0.010410f, -0.009641f, -0.005965f, 0.010193f, 0.014641f, -0.004826f, 0.001140f, -0.003427f, -0.009135f, -0.006833f, 0.002474f, -0.011287f, -0.002548f, -0.003623f, -0.006239f, 0.044110f, 0.026764f, 0.001428f, 0.017144f, 0.012291f, 0.004066f, 0.018823f, 0.005851f, -0.000566f, -0.005601f, -0.004962f, -0.012203f, -0.034680f, -0.002157f, 0.002783f, -0.011292f, -0.007194f, -0.000959f, 0.023284f, 0.008150f, -0.006762f, 0.000576f, 0.001071f, -0.003097f, 0.009457f, -0.001390f, -0.006806f, -0.003935f, -0.006464f, 0.004045f, -0.009218f, -0.020706f, -0.000175f, -0.010699f, -0.017627f, 0.003554f, 0.006638f, 0.010831f, 0.005286f, 0.009592f, -0.007117f, -0.017890f, -0.012507f, -0.016096f, 0.005637f, 0.015355f, 0.011787f, 0.008212f, 0.014430f, 0.000462f, 0.008709f, 0.020684f, -0.017894f, 0.003087f, -0.008544f, 0.000046f, 0.005079f, 0.006078f, 0.009158f, -0.001036f, -0.021786f, -0.016324f, 0.002538f, + -0.004831f, -0.006905f, -0.004352f, -0.005569f, -0.014797f, 0.000204f, 0.009003f, -0.002168f, 0.006414f, -0.005678f, -0.001842f, -0.002254f, 0.010200f, -0.021586f, 0.002130f, -0.016342f, 0.007016f, -0.031807f, -0.001461f, -0.010052f, -0.017334f, 0.030794f, 0.016452f, -0.009926f, -0.027485f, -0.006015f, -0.010330f, -0.022738f, 0.017875f, 0.001840f, -0.016738f, -0.005173f, 0.009000f, -0.014514f, -0.010896f, -0.007166f, -0.018658f, -0.006047f, -0.000724f, -0.013795f, -0.013745f, 0.019861f, -0.007339f, -0.004820f, -0.002020f, -0.003120f, 0.015755f, -0.016620f, -0.008522f, 0.004904f, -0.004933f, 0.001172f, -0.004205f, 0.010465f, -0.016972f, 0.007259f, -0.027015f, 0.004045f, -0.007784f, -0.009388f, 0.028179f, 0.004331f, -0.010466f, 0.006829f, 0.005911f, -0.021304f, 0.015867f, -0.002309f, -0.004817f, -0.000120f, 0.009186f, -0.002100f, 0.000597f, -0.009179f, 0.006199f, 0.009212f, 0.013042f, -0.009082f, -0.027727f, 0.021641f, -0.001711f, 0.010199f, 0.010320f, -0.003646f, 0.006465f, 0.016805f, -0.017327f, -0.041439f, -0.024776f, 0.006400f, -0.016189f, 0.002911f, -0.011998f, -0.004574f, -0.017091f, -0.009939f, + 0.007000f, 0.024973f, 0.024025f, 0.005087f, 0.016639f, -0.011130f, 0.029866f, 0.023811f, -0.019159f, -0.015171f, 0.004058f, 0.006216f, 0.025081f, 0.010604f, 0.015675f, -0.004917f, 0.005643f, -0.002274f, -0.003873f, -0.004412f, 0.023378f, 0.012077f, 0.022346f, 0.022408f, 0.003015f, -0.000109f, -0.011427f, 0.011419f, -0.002304f, -0.020252f, -0.015358f, -0.002904f, -0.012152f, -0.001297f, -0.012464f, -0.008799f, 0.005660f, -0.001832f, -0.008304f, 0.019078f, 0.019957f, -0.010914f, -0.005177f, 0.029961f, 0.010584f, -0.018396f, -0.020453f, -0.005713f, 0.006089f, 0.000339f, -0.004792f, -0.012703f, 0.010565f, 0.004912f, -0.005819f, 0.004559f, 0.001920f, -0.016034f, -0.009020f, 0.002928f, -0.008024f, -0.007156f, -0.010727f, 0.024693f, -0.020304f, -0.015496f, -0.016045f, -0.023888f, -0.020279f, -0.000315f, -0.015935f, -0.020802f, 0.005444f, -0.001931f, -0.028659f, 0.020389f, 0.003789f, -0.001922f, 0.010364f, 0.031501f, 0.030397f, 0.012867f, -0.036948f, 0.013574f, 0.009952f, -0.036524f, -0.000393f, -0.017744f, -0.008406f, 0.018492f, -0.021866f, 0.012533f, 0.000095f, -0.004012f, -0.007761f, 0.003532f, + -0.001741f, 0.006044f, -0.004151f, -0.019711f, 0.018961f, 0.008670f, 0.022686f, -0.002636f, -0.007571f, -0.011233f, 0.009205f, -0.010165f, 0.026751f, 0.005308f, 0.016069f, -0.021152f, 0.016589f, 0.000295f, 0.005860f, -0.013882f, 0.004512f, -0.016441f, -0.002581f, -0.016879f, 0.006661f, 0.010945f, -0.021964f, 0.000411f, -0.018146f, 0.007920f, 0.010477f, 0.009803f, -0.001629f, -0.031527f, -0.000200f, 0.007467f, -0.002992f, 0.012948f, -0.029985f, 0.006666f, -0.012840f, 0.002871f, -0.011143f, 0.000778f, 0.006613f, 0.043958f, 0.054456f, 0.022064f, 0.019334f, -0.031587f, 0.030448f, 0.042945f, -0.046967f, 0.005211f, 0.031377f, 0.004897f, -0.056103f, -0.006119f, -0.030182f, 0.009476f, 0.011871f, -0.014777f, -0.004996f, 0.009890f, -0.025395f, -0.002519f, -0.009553f, -0.013222f, 0.005738f, -0.020170f, 0.021939f, 0.014725f, 0.028193f, -0.014049f, 0.005211f, -0.003396f, -0.010476f, 0.034290f, 0.000076f, -0.016406f, -0.006768f, 0.007073f, -0.006672f, -0.009522f, -0.009835f, 0.017228f, 0.007423f, 0.024114f, -0.000846f, 0.008558f, 0.033155f, -0.020898f, 0.005244f, -0.014345f, 0.026581f, -0.010518f, + 0.013019f, 0.004588f, 0.000088f, -0.010193f, -0.017049f, -0.012841f, 0.006368f, 0.022562f, -0.020435f, 0.018920f, 0.024459f, 0.010974f, 0.028455f, -0.013835f, -0.009087f, 0.016828f, -0.001253f, -0.004079f, -0.022871f, -0.002507f, -0.018250f, 0.003091f, 0.028643f, 0.011249f, 0.009858f, 0.008780f}, + {-0.005177f, 0.000170f, -0.001276f, 0.001261f, -0.000706f, -0.000213f, 0.000386f, 0.000904f, -0.000173f, 0.000903f, 0.000379f, 0.000299f, -0.000045f, -0.000065f, 0.000137f, 0.000097f, -0.000456f, -0.000240f, -0.000861f, 0.000391f, -0.000269f, -0.000036f, 0.000890f, 0.000334f, 0.000117f, 0.000122f, 0.000254f, 0.000010f, -0.000152f, -0.000006f, -0.000095f, -0.000062f, -0.000264f, -0.000141f, -0.000083f, -0.000064f, 0.000048f, 0.000067f, 0.000001f, 0.000002f, 0.000001f, -0.000036f, -0.000016f, 0.000023f, 0.000083f, -0.000028f, 0.003626f, 0.001992f, 0.001004f, 0.001228f, 0.000691f, 0.001039f, 0.002102f, 0.000121f, 0.000060f, -0.000219f, -0.000519f, 0.001091f, 0.000013f, -0.000077f, 0.001158f, -0.000448f, -0.000537f, 0.000320f, 0.000116f, 0.000498f, 0.000121f, 0.000191f, 0.000523f, -0.000350f, 0.000351f, -0.000104f, -0.000077f, -0.000263f, 0.000177f, 0.000694f, 0.000368f, 0.000437f, 0.000366f, -0.000044f, 0.000285f, 0.000411f, -0.000169f, 0.000347f, -0.000583f, 0.000729f, -0.000293f, 0.000217f, 0.000039f, 0.000105f, -0.000140f, -0.000130f, 0.001821f, -0.002084f, -0.000281f, -0.000381f, + -0.000520f, 0.000341f, -0.001038f, 0.000354f, -0.000025f, 0.000475f, 0.000413f, -0.000819f, -0.000293f, 0.001257f, -0.000132f, 0.000271f, -0.000233f, 0.000549f, 0.001150f, 0.001333f, 0.000226f, 0.000577f, -0.000019f, -0.001045f, -0.000031f, 0.000118f, -0.000226f, 0.000008f, 0.000580f, -0.000598f, -0.000808f, 0.000358f, -0.000390f, -0.000357f, -0.000566f, -0.000020f, 0.000600f, 0.000155f, -0.000174f, -0.000211f, -0.000235f, 0.000002f, 0.000136f, -0.000315f, 0.000122f, -0.000360f, -0.005226f, -0.003719f, -0.001810f, -0.001370f, -0.001043f, -0.001081f, -0.000366f, -0.000799f, -0.000241f, -0.000503f, -0.001287f, 0.000246f, 0.000670f, -0.000111f, 0.000386f, -0.000253f, -0.000662f, -0.000676f, -0.001004f, -0.000349f, 0.000254f, 0.000027f, -0.000560f, 0.000382f, -0.000679f, -0.000682f, 0.000459f, -0.000003f, 0.000035f, 0.000358f, 0.000419f, 0.000107f, -0.000144f, -0.000203f, -0.000254f, 0.000138f, 0.000085f, -0.000357f, 0.000206f, -0.000709f, -0.000291f, -0.000175f, -0.000058f, -0.000505f, -0.000086f, -0.000185f, -0.007417f, -0.001016f, 0.000592f, 0.000093f, 0.000560f, 0.000041f, -0.000392f, 0.000252f, + -0.000298f, -0.000368f, -0.000649f, -0.000580f, 0.000287f, -0.000228f, 0.000492f, -0.000476f, 0.000025f, -0.000461f, 0.000157f, 0.000736f, -0.000181f, 0.000542f, 0.000048f, -0.000536f, -0.000088f, 0.000665f, 0.000360f, 0.000425f, 0.000521f, -0.000733f, 0.000497f, -0.000311f, -0.000043f, -0.000405f, -0.000168f, 0.000188f, 0.000324f, 0.000145f, -0.000157f, 0.000531f, 0.000492f, 0.000266f, -0.000150f, -0.000377f, 0.000065f, -0.000314f, 0.008753f, 0.006983f, 0.001643f, 0.003129f, 0.000744f, 0.002421f, 0.001688f, 0.000527f, 0.001699f, 0.000690f, 0.001285f, 0.000566f, -0.000482f, 0.001304f, 0.000905f, -0.000352f, -0.000130f, -0.002416f, -0.000273f, 0.000126f, 0.001462f, 0.000170f, 0.000043f, 0.000754f, 0.000045f, 0.000681f, 0.000611f, 0.000102f, -0.000066f, 0.000240f, 0.000990f, 0.000772f, 0.000632f, -0.000064f, -0.000277f, 0.000042f, 0.000448f, -0.000177f, -0.000069f, 0.000521f, 0.000152f, -0.000260f, -0.000034f, 0.000110f, -0.000536f, 0.000640f, 0.015398f, 0.005653f, 0.002716f, 0.001629f, 0.000974f, 0.001005f, 0.000931f, 0.001582f, 0.000373f, 0.002575f, 0.000339f, 0.000241f, + 0.001090f, -0.000597f, 0.000252f, -0.000265f, -0.000290f, -0.000426f, 0.001638f, 0.000912f, -0.000148f, 0.001258f, -0.000877f, -0.000221f, -0.000317f, 0.001941f, -0.000193f, 0.000696f, 0.000143f, 0.000949f, 0.000155f, -0.000287f, 0.000490f, 0.000648f, -0.000311f, 0.000227f, 0.000256f, 0.000169f, 0.000385f, -0.000135f, 0.000443f, 0.000403f, -0.001259f, 0.000265f, 0.000135f, 0.000229f, 0.005907f, -0.004367f, -0.001538f, -0.002018f, -0.001264f, -0.001197f, 0.000807f, -0.000682f, -0.001829f, -0.000452f, -0.002431f, -0.000563f, -0.001061f, -0.002319f, -0.000597f, 0.000529f, -0.001477f, -0.000487f, 0.000221f, -0.001637f, -0.000081f, 0.001895f, 0.000417f, 0.000275f, -0.000875f, 0.000039f, 0.000654f, 0.000017f, -0.000804f, -0.000841f, 0.000863f, -0.000074f, -0.001130f, 0.000108f, -0.000482f, 0.001378f, -0.000043f, 0.000622f, -0.000225f, 0.001192f, -0.000785f, 0.000479f, 0.000157f, 0.000281f, 0.000013f, 0.000307f, -0.000034f, -0.000379f, 0.000725f, -0.016236f, -0.009184f, -0.001875f, -0.002289f, -0.001570f, -0.002001f, -0.002821f, -0.000259f, 0.000079f, -0.000828f, 0.000710f, -0.000768f, 0.000123f, + -0.000079f, -0.000921f, -0.001021f, -0.001608f, -0.000563f, 0.001600f, -0.001512f, -0.000161f, 0.001442f, 0.000930f, -0.000228f, 0.000542f, -0.000211f, -0.001551f, -0.000779f, -0.001270f, -0.000436f, 0.000076f, -0.000322f, 0.000762f, -0.001372f, -0.001066f, -0.000043f, -0.001312f, -0.001030f, -0.000921f, -0.001093f, 0.001175f, -0.000338f, -0.001380f, -0.000446f, 0.000411f, 0.000440f, -0.000448f, -0.000714f, -0.000295f, -0.009960f, 0.005717f, 0.002142f, 0.000935f, 0.000979f, 0.000870f, 0.000435f, -0.001070f, 0.000281f, -0.000639f, -0.000184f, 0.001777f, 0.001092f, 0.001529f, 0.001574f, 0.001615f, -0.001353f, 0.000678f, 0.001748f, 0.000273f, 0.001522f, -0.001807f, 0.000340f, -0.000464f, -0.000122f, -0.000684f, 0.000643f, -0.000245f, 0.000026f, 0.001573f, -0.001637f, -0.000508f, 0.000622f, 0.000899f, -0.000429f, 0.000746f, -0.000650f, -0.001091f, 0.001274f, -0.000655f, -0.000058f, -0.000375f, 0.000478f, -0.000182f, 0.000584f, -0.000655f, -0.000247f, -0.000596f, -0.000164f, -0.000525f, 0.000945f, 0.000066f, 0.000300f, 0.014813f, 0.006070f, 0.001282f, 0.003380f, 0.002644f, 0.000514f, 0.001181f, + 0.003196f, 0.001456f, -0.000078f, 0.000682f, 0.000396f, -0.000474f, 0.000913f, 0.002744f, 0.000642f, 0.003275f, 0.001590f, -0.002706f, 0.000503f, 0.000091f, 0.000553f, 0.002415f, 0.001360f, 0.000969f, -0.000218f, -0.000385f, -0.000333f, -0.000417f, 0.000372f, -0.000539f, 0.000801f, 0.000234f, 0.001092f, -0.000233f, -0.000288f, 0.000393f, 0.000890f, 0.000478f, -0.000105f, -0.001198f, -0.000508f, -0.000671f, 0.001051f, 0.000754f, 0.001187f, 0.000648f, 0.000171f, 0.000157f, 0.001013f, 0.000794f, 0.000662f, 0.000093f, 0.016550f, 0.004748f, 0.002066f, 0.002587f, 0.000422f, 0.002499f, -0.000410f, -0.000959f, -0.000059f, 0.000638f, 0.000260f, -0.000082f, 0.000468f, 0.002545f, -0.000383f, -0.001601f, -0.001126f, 0.001229f, 0.000306f, 0.001433f, 0.002272f, 0.001992f, -0.000148f, 0.001325f, -0.001464f, 0.000152f, -0.001141f, 0.001527f, 0.000865f, -0.001741f, 0.000994f, -0.000833f, 0.000104f, -0.000675f, 0.001005f, -0.000651f, 0.001265f, 0.001014f, 0.000808f, 0.001648f, 0.000520f, -0.000045f, -0.000430f, -0.000007f, 0.000200f, 0.001824f, -0.000076f, 0.000036f, 0.000104f, 0.000876f, + 0.000565f, 0.000055f, -0.000257f, 0.002272f, -0.007029f, -0.002874f, -0.001128f, -0.001624f, -0.000718f, -0.000619f, 0.000123f, 0.000998f, -0.001014f, -0.001915f, 0.001794f, -0.002299f, -0.002165f, -0.000410f, -0.000490f, 0.000985f, -0.000603f, -0.000057f, -0.002091f, -0.001268f, -0.002527f, -0.002804f, -0.003091f, -0.000441f, 0.000741f, -0.002182f, -0.000567f, 0.000301f, 0.000251f, 0.000085f, -0.000262f, -0.002163f, -0.001321f, 0.000927f, 0.000381f, -0.000512f, 0.002058f, -0.001375f, -0.000593f, 0.000498f, 0.001270f, 0.001010f, -0.000156f, -0.000320f, 0.000513f, 0.000290f, -0.001299f, 0.000109f, -0.000753f, -0.000365f, 0.000126f, -0.000549f, 0.000098f, 0.000886f, -0.017970f, -0.005690f, -0.003375f, -0.001435f, -0.002421f, -0.001979f, -0.000549f, -0.001420f, -0.000555f, -0.001887f, -0.002488f, -0.001824f, -0.000589f, -0.003748f, -0.000866f, -0.001541f, -0.002232f, -0.000305f, 0.000414f, 0.001186f, -0.001295f, -0.001887f, -0.000662f, 0.001499f, 0.001985f, 0.002377f, 0.001315f, -0.000095f, -0.001161f, -0.000569f, 0.000041f, -0.001494f, 0.000640f, 0.000964f, 0.001282f, -0.000883f, -0.000701f, -0.000712f, + -0.000307f, -0.000320f, -0.000483f, 0.000939f, -0.000253f, 0.000596f, -0.001212f, -0.002187f, -0.000873f, -0.000117f, 0.001111f, -0.001899f, 0.000649f, -0.000931f, 0.000907f, -0.000948f, 0.000554f, -0.010334f, 0.002754f, 0.000766f, 0.000011f, 0.001812f, -0.001736f, 0.000466f, -0.003994f, -0.001298f, 0.001392f, 0.000987f, 0.002579f, -0.000186f, 0.002814f, -0.001637f, -0.000410f, 0.001348f, -0.002442f, -0.000895f, -0.001435f, 0.002745f, -0.000169f, -0.002267f, 0.001149f, 0.002190f, -0.001937f, -0.001477f, -0.001743f, 0.000512f, -0.000401f, 0.000949f, -0.000662f, -0.000550f, -0.000461f, -0.001056f, 0.001556f, -0.001239f, 0.000310f, 0.001021f, -0.000116f, 0.001179f, -0.000667f, 0.002572f, 0.000398f, -0.000249f, -0.000883f, -0.000882f, 0.000055f, -0.001016f, -0.001234f, -0.000767f, 0.000220f, 0.000888f, -0.000100f, 0.000254f, -0.001068f, -0.001080f, -0.001530f, -0.000604f, -0.000467f, -0.000392f, 0.008980f, 0.012785f, 0.004458f, 0.004411f, 0.006110f, 0.004354f, -0.000590f, 0.000839f, -0.000453f, 0.000785f, 0.000767f, 0.001083f, 0.000842f, 0.002155f, 0.000854f, 0.001336f, 0.000440f, 0.004287f, + 0.001022f, 0.002082f, 0.001262f, 0.001074f, 0.003412f, 0.000766f, 0.004271f, 0.002164f, -0.000871f, 0.002968f, 0.000783f, 0.001437f, 0.003003f, 0.000563f, 0.001780f, -0.000969f, -0.000331f, 0.000793f, 0.001332f, -0.001900f, 0.001547f, -0.001127f, -0.002034f, -0.001246f, 0.001620f, 0.002415f, 0.001843f, -0.000436f, 0.000563f, 0.000496f, 0.000878f, 0.001224f, 0.000694f, 0.001390f, 0.000833f, -0.001509f, -0.000110f, 0.000937f, 0.001356f, 0.000320f, 0.000383f, 0.000137f, -0.001509f, 0.030699f, 0.002446f, -0.001685f, 0.002599f, -0.001794f, 0.003607f, 0.000932f, 0.003782f, -0.001927f, 0.000468f, -0.000102f, 0.002321f, -0.004007f, 0.000884f, 0.002381f, -0.000405f, -0.000693f, 0.003341f, 0.004939f, -0.001982f, -0.001291f, 0.000741f, 0.002383f, -0.000990f, 0.001508f, 0.000207f, -0.001747f, -0.001234f, -0.001416f, 0.001196f, 0.001422f, 0.001898f, -0.001391f, 0.002081f, -0.001378f, 0.002025f, 0.001598f, -0.000312f, -0.001249f, 0.000779f, -0.001938f, -0.002453f, 0.000466f, -0.001638f, 0.000617f, 0.000308f, 0.000176f, 0.001226f, -0.000123f, 0.001461f, -0.000014f, -0.001627f, 0.000593f, + -0.000331f, 0.000729f, -0.001156f, -0.000362f, 0.000324f, 0.000777f, -0.000578f, -0.002329f, -0.010514f, -0.010197f, -0.002314f, 0.000801f, -0.000454f, -0.001529f, -0.001663f, -0.002267f, -0.000607f, 0.001703f, -0.000547f, -0.000558f, -0.002344f, 0.002495f, -0.000138f, -0.002013f, -0.001746f, 0.004315f, -0.003872f, 0.000429f, 0.002858f, -0.000305f, 0.000487f, -0.003714f, 0.001217f, -0.001571f, 0.000921f, -0.002566f, -0.001676f, 0.000471f, 0.000724f, -0.001171f, -0.001330f, 0.000179f, -0.000521f, 0.000240f, -0.001552f, -0.000845f, 0.001715f, -0.000121f, -0.000731f, -0.000407f, 0.002176f, 0.001007f, -0.001148f, -0.001770f, -0.001572f, 0.000631f, -0.000182f, -0.000694f, 0.000253f, 0.000439f, -0.000822f, 0.002613f, 0.001451f, -0.000163f, -0.000106f, -0.000550f, 0.000398f, -0.000623f, -0.000633f, -0.000639f, -0.000043f, -0.001298f, -0.001020f, -0.003987f, -0.003650f, -0.004107f, -0.003159f, -0.002096f, -0.001594f, 0.000450f, -0.000155f, -0.000950f, -0.000537f, 0.001128f, 0.003553f, -0.003076f, 0.001495f, -0.000952f, -0.002123f, 0.002702f, -0.000328f, 0.000632f, 0.003290f, 0.000621f, 0.001326f, -0.002008f, + -0.000607f, -0.006075f, -0.000808f, 0.001299f, 0.000668f, 0.000663f, 0.000531f, 0.001000f, -0.001471f, -0.001728f, 0.001324f, -0.000032f, 0.001247f, 0.000807f, -0.001728f, 0.001482f, -0.000227f, -0.004262f, -0.003709f, -0.000473f, -0.003514f, 0.000581f, 0.000981f, -0.000098f, -0.000968f, -0.000257f, 0.000066f, -0.000873f, -0.000405f, -0.000062f, -0.000683f, 0.001201f, 0.000197f, 0.000488f, -0.000702f, -0.000309f, 0.001602f, 0.000577f, -0.001182f, 0.001303f, -0.000358f, -0.000654f, -0.001870f, 0.000174f, -0.020039f, -0.004591f, 0.000316f, -0.004007f, 0.001631f, 0.000381f, 0.004833f, -0.002269f, 0.000308f, -0.001340f, 0.003247f, -0.006595f, -0.006290f, 0.002644f, -0.003037f, 0.004731f, 0.001740f, -0.003829f, -0.006662f, -0.000167f, -0.001869f, -0.003257f, -0.001307f, 0.000751f, 0.001105f, -0.001578f, 0.005745f, 0.000296f, -0.000546f, -0.002403f, 0.001971f, 0.002159f, 0.002358f, 0.002502f, -0.000288f, -0.001493f, -0.000540f, 0.001478f, -0.000094f, 0.001786f, -0.001662f, -0.000667f, -0.000557f, 0.002072f, 0.001688f, -0.001819f, 0.002381f, -0.001314f, -0.001621f, 0.000204f, -0.000725f, -0.001558f, + 0.001631f, -0.001843f, -0.000225f, 0.000478f, -0.000427f, -0.000742f, 0.000442f, 0.001562f, -0.000941f, 0.001502f, -0.001210f, 0.001019f, -0.000665f, -0.000739f, -0.000466f, 0.018432f, 0.016125f, 0.003415f, 0.004281f, -0.000827f, 0.005240f, 0.004265f, 0.005277f, -0.000190f, 0.002093f, 0.001310f, -0.005038f, -0.004202f, 0.002275f, 0.000476f, -0.003624f, -0.003759f, -0.002161f, 0.000261f, 0.002094f, 0.000644f, 0.004999f, 0.004627f, 0.001968f, -0.001055f, -0.001175f, 0.003063f, 0.002803f, 0.000233f, 0.002447f, -0.000806f, 0.003143f, 0.000181f, -0.000751f, 0.004452f, 0.002256f, 0.003649f, 0.002295f, 0.000797f, 0.002497f, 0.001281f, 0.000823f, 0.002362f, -0.001368f, 0.000462f, 0.003081f, -0.000048f, -0.002102f, 0.001854f, 0.001784f, 0.001311f, -0.001503f, -0.000058f, 0.001757f, 0.002740f, -0.001466f, 0.003316f, 0.003737f, -0.000694f, -0.002155f, 0.000322f, 0.000789f, 0.000559f, 0.001585f, -0.000045f, 0.000506f, 0.001254f, 0.022212f, 0.001924f, -0.000735f, 0.001681f, 0.000974f, -0.003553f, 0.000855f, 0.001102f, -0.000099f, 0.002484f, 0.003309f, 0.005209f, -0.002378f, -0.002200f, + -0.003707f, -0.002810f, 0.003192f, -0.000151f, 0.004654f, -0.001036f, -0.001254f, 0.002069f, 0.004031f, 0.001749f, -0.004249f, 0.003392f, -0.001311f, 0.002734f, -0.001469f, 0.002146f, -0.002598f, 0.001639f, -0.000299f, 0.002498f, 0.000193f, 0.001468f, 0.000638f, -0.004107f, -0.002412f, -0.000292f, -0.000948f, -0.000296f, -0.001408f, 0.002127f, 0.000675f, 0.004433f, -0.000767f, -0.002876f, -0.001827f, -0.000208f, 0.000163f, -0.003215f, 0.001017f, -0.001039f, -0.000245f, -0.000239f, -0.002027f, 0.001834f, 0.003259f, -0.000985f, 0.001627f, 0.000468f, -0.001989f, -0.000118f, -0.001901f, -0.001440f, 0.000190f, 0.003015f, 0.000306f, -0.001220f, -0.002998f, 0.000875f, -0.001105f, 0.006445f, -0.001545f, -0.006154f, -0.004167f, -0.005549f, 0.005123f, -0.004100f, 0.001129f, 0.006265f, -0.000285f, -0.006364f, 0.000427f, -0.006681f, 0.005554f, -0.001941f, 0.005534f, 0.000033f, -0.002122f, 0.004767f, 0.000167f, 0.000988f, -0.003600f, -0.004536f, -0.000741f, 0.001592f, 0.000962f, -0.000889f, -0.002105f, 0.002104f, -0.000660f, 0.001570f, 0.002410f, 0.002938f, 0.001347f, 0.001622f, -0.005988f, 0.000490f, + -0.001370f, -0.002051f, 0.000802f, 0.002950f, -0.002511f, -0.004600f, -0.002042f, 0.001330f, 0.000507f, -0.004047f, -0.001660f, 0.001862f, 0.002734f, -0.002443f, -0.001593f, -0.001888f, 0.002799f, 0.003709f, 0.000741f, -0.001287f, 0.000410f, 0.002643f, -0.001295f, -0.000144f, -0.022628f, -0.022692f, -0.003808f, -0.011061f, -0.007047f, -0.003845f, -0.006310f, -0.000628f, 0.004579f, -0.010095f, 0.003636f, -0.001959f, 0.003312f, 0.000727f, 0.001996f, -0.004099f, 0.000987f, -0.000386f, -0.002299f, -0.009229f, -0.001996f, -0.004723f, -0.006046f, -0.000464f, 0.001428f, 0.000480f, -0.002104f, 0.001466f, -0.001998f, -0.000399f, 0.004911f, 0.000070f, -0.001726f, 0.000492f, 0.003195f, 0.004566f, 0.002874f, 0.000194f, 0.002286f, 0.002906f, -0.000320f, 0.000229f, -0.004924f, 0.001999f, -0.004075f, 0.000968f, 0.003837f, -0.002453f, -0.004919f, 0.001636f, -0.002776f, -0.002380f, 0.000503f, 0.000202f, -0.002345f, 0.001372f, -0.000580f, 0.005511f, 0.002923f, 0.001873f, 0.000625f, 0.002201f, -0.000213f, 0.000863f, -0.002088f, -0.003433f, -0.000628f, -0.013188f, 0.024667f, 0.019702f, 0.001015f, 0.004151f, + 0.001370f, 0.004503f, 0.006389f, 0.001680f, 0.006193f, 0.001318f, -0.006976f, 0.004649f, 0.005177f, 0.001753f, 0.001382f, 0.004188f, 0.005087f, -0.005194f, 0.004197f, -0.002684f, 0.003652f, 0.000706f, -0.003490f, 0.000740f, 0.004152f, 0.002610f, -0.005508f, 0.002637f, -0.002412f, 0.007707f, -0.000909f, 0.001859f, -0.001446f, -0.004846f, 0.004679f, 0.004988f, 0.002069f, 0.001307f, -0.000507f, 0.001816f, 0.004966f, 0.001256f, 0.003463f, 0.000494f, 0.002311f, 0.001437f, -0.000655f, 0.002847f, -0.003754f, -0.005361f, -0.002672f, -0.004102f, -0.003783f, -0.001805f, -0.003883f, 0.004736f, 0.003064f, 0.000355f, -0.001195f, -0.001781f, -0.000907f, -0.000218f, -0.000313f, 0.000122f, 0.000312f, 0.000863f, 0.000196f, -0.000266f, 0.032967f, -0.012699f, -0.007415f, 0.001552f, -0.000419f, -0.001307f, -0.009595f, -0.003609f, 0.002016f, -0.000108f, -0.001672f, -0.001471f, 0.001076f, -0.007267f, -0.002522f, 0.004289f, 0.007057f, 0.004377f, 0.002971f, -0.002038f, -0.002606f, -0.004045f, 0.004752f, -0.006875f, -0.001619f, 0.002119f, -0.005113f, 0.001888f, 0.001676f, 0.006134f, -0.009243f, -0.000418f, + -0.000530f, -0.001508f, 0.001981f, -0.007890f, -0.004667f, 0.009373f, 0.005571f, 0.001565f, -0.001940f, 0.005727f, -0.001974f, -0.000378f, 0.000611f, 0.004547f, 0.002034f, -0.002293f, 0.000150f, -0.001207f, 0.003053f, -0.005220f, -0.002910f, -0.003037f, -0.003949f, 0.007094f, 0.001432f, 0.001158f, -0.003425f, 0.000066f, -0.001453f, -0.000879f, -0.003581f, 0.000822f, -0.003423f, 0.000191f, 0.000572f, 0.002932f, -0.004967f, -0.002802f, -0.004439f, -0.000887f, 0.009745f, 0.022939f, 0.003588f, 0.008844f, 0.007700f, 0.007684f, 0.002359f, 0.005780f, 0.003309f, -0.001490f, -0.004790f, -0.002795f, -0.001503f, 0.006594f, -0.005683f, -0.005965f, -0.000592f, -0.000139f, -0.002675f, -0.004536f, 0.013634f, 0.013114f, 0.009583f, 0.000617f, -0.005763f, 0.001126f, 0.000734f, -0.002644f, 0.002983f, 0.002173f, 0.005373f, 0.000785f, 0.002070f, -0.000129f, -0.004049f, 0.006454f, 0.005020f, 0.003914f, -0.001128f, -0.004872f, 0.000077f, -0.000247f, -0.001636f, -0.010092f, 0.007127f, -0.004523f, 0.008248f, 0.000626f, 0.004335f, -0.000834f, 0.004797f, 0.007846f, 0.001254f, -0.003339f, -0.000557f, 0.001561f, + -0.002851f, 0.001505f, -0.001314f, -0.003117f, -0.002137f, 0.001229f, -0.001162f, 0.003390f, 0.000751f, -0.005298f, -0.000077f, -0.000580f, -0.006342f, -0.001209f, 0.000682f, -0.002061f, 0.002231f, -0.023785f, -0.003316f, -0.014768f, 0.000033f, 0.002778f, -0.005195f, -0.008568f, -0.010217f, -0.009407f, -0.005788f, -0.007639f, -0.002033f, -0.000364f, -0.002134f, 0.002675f, -0.001669f, 0.000682f, 0.006014f, 0.002928f, -0.000712f, 0.014671f, -0.003284f, 0.003089f, -0.002218f, 0.001407f, 0.002008f, 0.000967f, -0.000905f, 0.002329f, 0.006698f, 0.002249f, 0.002320f, 0.000973f, 0.002636f, 0.005948f, 0.007823f, 0.002706f, 0.009513f, -0.002335f, -0.008325f, 0.008582f, -0.002706f, -0.001510f, -0.001736f, 0.004972f, 0.007273f, 0.005781f, -0.000183f, -0.001629f, -0.004225f, -0.010398f, 0.006552f, 0.007770f, 0.005272f, -0.006071f, 0.003850f, 0.001319f, -0.000644f, 0.006393f, 0.001033f, 0.004424f, -0.003359f, 0.002364f, -0.004178f, 0.000001f, 0.003711f, -0.000627f, 0.002826f, -0.000101f, -0.001437f, -0.000974f, -0.041652f, -0.019023f, 0.008754f, -0.001856f, -0.001202f, 0.001270f, -0.005010f, -0.004824f, + -0.001337f, -0.002295f, -0.007092f, 0.004963f, 0.000811f, 0.010735f, -0.005871f, -0.005465f, -0.008702f, -0.005218f, -0.008965f, 0.000545f, 0.003633f, -0.013970f, 0.009140f, 0.007438f, -0.000828f, 0.001324f, 0.006056f, 0.000660f, 0.005366f, -0.010627f, -0.010218f, -0.006018f, -0.006599f, -0.005492f, 0.017306f, 0.005360f, -0.003448f, -0.006290f, -0.008406f, 0.003951f, 0.002654f, -0.004311f, 0.003719f, 0.003182f, -0.005814f, 0.000406f, 0.001712f, 0.004674f, -0.005356f, 0.013852f, -0.005777f, -0.005050f, 0.002561f, -0.001658f, 0.000310f, -0.004361f, -0.001192f, 0.000305f, 0.009320f, -0.002886f, 0.013265f, 0.002629f, 0.001293f, 0.001345f, 0.003907f, -0.003915f, -0.000877f, -0.005098f, -0.003551f, -0.003873f, 0.000564f, 0.006980f, -0.003875f, 0.006596f, 0.021179f, 0.010854f, 0.006749f, 0.004543f, -0.007471f, 0.000693f, -0.006063f, 0.009341f, -0.001072f, -0.001340f, 0.003137f, 0.001970f, 0.002110f, -0.000400f, 0.003226f, 0.001067f, 0.003397f, -0.003039f, 0.009081f, 0.001080f, -0.000972f, 0.027416f, 0.001354f, -0.002301f, -0.007228f, 0.003899f, -0.006749f, 0.005933f, 0.014671f, -0.001409f, + 0.003431f, 0.003403f, -0.007876f, -0.008839f, 0.000016f, -0.000117f, 0.006275f, -0.004551f, -0.000035f, -0.000790f, 0.004524f, 0.004596f, 0.007975f, 0.002732f, 0.002551f, 0.003026f, 0.000012f, 0.005033f, 0.002192f, -0.010506f, 0.001782f, -0.005661f, -0.013293f, -0.001623f, 0.003227f, -0.000469f, 0.000660f, -0.002283f, -0.000187f, -0.001017f, -0.000521f, 0.000985f, -0.000186f, 0.005197f, -0.004007f, -0.001278f, 0.000647f, 0.000452f, -0.000340f, -0.003107f, 0.003550f, 0.005983f, 0.030240f, -0.008258f, -0.004224f, -0.007630f, 0.014818f, 0.006529f, 0.000485f, 0.003943f, -0.003091f, -0.002875f, 0.004685f, 0.001278f, -0.006236f, 0.002169f, -0.007968f, -0.004645f, -0.000471f, -0.006478f, 0.000154f, 0.003125f, -0.006185f, -0.008651f, 0.000057f, 0.001266f, 0.005528f, 0.011221f, 0.006444f, -0.004147f, -0.000929f, 0.007255f, 0.011010f, -0.011670f, 0.003826f, -0.001574f, -0.001075f, -0.004911f, -0.008847f, 0.001441f, 0.006273f, 0.002866f, 0.002315f, 0.005287f, -0.001391f, 0.003791f, -0.001618f, 0.002935f, 0.003683f, -0.007514f, -0.006729f, 0.013681f, -0.001951f, 0.000395f, -0.003851f, 0.005955f, + 0.015750f, 0.004995f, 0.001567f, 0.006246f, -0.005351f, -0.004113f, -0.000962f, -0.002834f, -0.010536f, 0.007054f, -0.000189f, -0.003837f, 0.001641f, 0.002411f, -0.003699f, -0.003455f, 0.005097f, -0.000973f, -0.008244f, 0.004657f, 0.002426f, 0.026285f, 0.025309f, -0.008391f, 0.007046f, 0.001842f, 0.005512f, 0.013235f, -0.001476f, -0.007271f, -0.002288f, 0.025769f, -0.014452f, -0.003035f, -0.007083f, -0.006068f, -0.011693f, 0.012744f, -0.003606f, -0.017960f, -0.013041f, -0.016418f, -0.006056f, 0.014005f, -0.001572f, 0.006453f, -0.002405f, -0.007600f, 0.006485f, 0.001576f, 0.008174f, -0.008086f, 0.007277f, 0.005389f, 0.003035f, 0.002993f, -0.012625f, 0.003334f, -0.010534f, 0.008641f, 0.019052f, 0.005159f, 0.005766f, -0.012426f, 0.017048f, 0.004193f, -0.001726f, -0.002993f, -0.003417f, 0.004956f, 0.008518f, 0.001692f, -0.001970f, -0.000875f, 0.002295f, -0.004496f, -0.002957f, -0.004345f, -0.003089f, -0.000717f, 0.006175f, -0.004565f, 0.009236f, 0.002951f, 0.005607f, -0.002326f, -0.013444f, -0.009330f, 0.003269f, 0.000535f, -0.004139f, 0.004633f, -0.000444f, -0.000748f, 0.002441f, -0.002055f, + -0.025350f, -0.014416f, 0.003179f, 0.002422f, -0.000512f, -0.010467f, 0.006149f, 0.004186f, -0.006934f, -0.017386f, 0.014329f, 0.004157f, 0.005159f, 0.008874f, 0.004628f, -0.001731f, 0.002448f, -0.003869f, 0.011955f, -0.009441f, -0.017689f, 0.000135f, -0.001028f, -0.007560f, -0.019156f, 0.001373f, -0.004016f, -0.009192f, -0.005593f, -0.002289f, 0.004205f, 0.001593f, 0.006966f, 0.014910f, -0.005950f, -0.010619f, 0.003676f, -0.000369f, 0.000203f, 0.006758f, -0.008105f, -0.006423f, -0.000884f, 0.007871f, -0.008706f, 0.008534f, -0.002350f, 0.015431f, -0.001787f, -0.003210f, -0.001391f, 0.001379f, 0.003175f, -0.014920f, 0.002722f, -0.012669f, 0.014822f, 0.001537f, 0.009506f, 0.006930f, -0.005001f, 0.000902f, -0.006744f, 0.005283f, -0.000171f, 0.004637f, 0.003380f, -0.007792f, -0.000727f, -0.007322f, -0.003311f, 0.006357f, -0.001948f, -0.003346f, 0.003718f, -0.033105f, -0.017352f, -0.004392f, -0.005309f, 0.000348f, 0.002160f, -0.010603f, -0.010097f, 0.004587f, -0.011558f, 0.004579f, -0.012683f, -0.002102f, -0.012320f, -0.011680f, 0.012331f, 0.007130f, 0.000569f, 0.000561f, -0.012940f, -0.017967f, + 0.008128f, -0.023998f, 0.007665f, 0.001759f, -0.009686f, 0.002716f, -0.006609f, 0.003320f, 0.016107f, -0.007524f, -0.002533f, -0.017700f, 0.013399f, -0.003059f, 0.005214f, -0.005347f, -0.003874f, -0.000183f, -0.002366f, 0.010249f, 0.001389f, 0.019865f, 0.020548f, -0.000965f, -0.001376f, -0.005983f, -0.000903f, -0.001493f, 0.001721f, 0.008459f, -0.000897f, 0.017468f, 0.002754f, -0.004601f, 0.000737f, 0.004725f, -0.001774f, 0.000261f, -0.001404f, 0.013635f, -0.011079f, -0.016989f, -0.009561f, 0.001700f, 0.002274f, 0.004641f, 0.007108f, 0.000536f, 0.001715f, -0.003163f, -0.009760f, -0.008693f, -0.010705f, 0.002387f, -0.003782f, 0.044391f, 0.019234f, 0.013954f, 0.005212f, -0.004640f, -0.008432f, -0.013372f, 0.007176f, 0.013518f, 0.004988f, -0.005819f, 0.015075f, 0.009082f, 0.015060f, 0.001382f, -0.011725f, -0.004044f, 0.022827f, -0.024039f, -0.005514f, 0.016404f, -0.010062f, -0.005054f, 0.037135f, -0.004437f, 0.010219f, 0.034440f, -0.006044f, -0.001970f, -0.001575f, 0.004516f, -0.002485f, 0.015075f, 0.008920f, 0.012467f, -0.009260f, -0.019921f, 0.007430f, -0.007708f, 0.009042f, -0.003531f, + 0.002852f, 0.014631f, 0.007647f, 0.001091f, 0.005625f, 0.003166f, 0.005372f, 0.014156f, 0.007100f, -0.001227f, 0.012759f, 0.005929f, 0.001149f, 0.003488f, 0.024098f, 0.015221f, -0.000794f, 0.013871f, -0.006834f, 0.017480f, -0.005150f, 0.004140f, -0.005777f, 0.002455f, 0.008890f, -0.004993f, -0.001371f, -0.000428f, 0.002385f, 0.001057f, -0.007531f, 0.001164f, -0.006702f, 0.056387f, 0.026062f, -0.011906f, 0.005358f, 0.028936f, 0.001083f, 0.020781f, -0.005837f, 0.007970f, 0.018051f, -0.013723f, 0.001991f, 0.030409f, 0.028067f, 0.022120f, 0.008338f, 0.018937f, 0.003631f, 0.016547f, 0.006288f, 0.004712f, -0.010245f, -0.012881f, -0.017358f, -0.035530f, 0.011545f, -0.000011f, -0.009179f, -0.003786f, 0.012494f, -0.008407f, -0.000864f, 0.000943f, 0.007168f, -0.031534f, -0.004697f, 0.022145f, 0.017712f, -0.006708f, 0.011811f, 0.009381f, 0.006684f, -0.004238f, -0.006911f, -0.003563f, -0.004547f, -0.003571f, -0.011176f, -0.010182f, 0.008279f, -0.019797f, 0.006729f, 0.015490f, -0.004401f, -0.011753f, -0.017360f, 0.016181f, -0.000195f, -0.008772f, -0.005142f, -0.004213f, -0.005719f, 0.003113f, + -0.002433f, -0.006535f, 0.006699f, 0.025457f, -0.012455f, -0.008103f, 0.003814f, -0.005343f, 0.006585f, -0.000071f, 0.014120f, 0.002268f, 0.001338f, -0.022151f, -0.006566f, -0.026693f, -0.006182f, -0.026686f, 0.012629f, -0.025424f, 0.013480f, -0.004209f, -0.015213f, -0.004265f, -0.007316f, 0.031631f, 0.004506f, -0.022669f, 0.000064f, -0.014739f, -0.012168f, 0.015667f, -0.017861f, -0.015965f, -0.018636f, 0.027574f, -0.004108f, 0.018254f, -0.028306f, -0.014706f, 0.010650f, -0.012844f, 0.010126f, 0.030468f, 0.019456f, 0.018898f, 0.002737f, -0.003095f, -0.015213f, -0.020819f, -0.001624f, 0.004765f, -0.019916f, 0.000526f, -0.011964f, 0.005707f, 0.008021f, -0.022108f, -0.019413f, -0.034701f, -0.006016f, 0.002469f, -0.015547f, -0.021441f, 0.020586f, 0.001149f, 0.021144f, 0.021426f, -0.003270f, -0.002958f, -0.009339f, 0.012386f, 0.009995f, 0.001608f, 0.004579f, -0.001670f, -0.001804f, 0.010519f, -0.003474f, -0.012075f, -0.010109f, -0.015176f, -0.013635f, -0.004464f, -0.001304f, -0.001557f, -0.020080f, -0.039093f, -0.005854f, 0.002591f, -0.002798f, -0.000744f, 0.011100f, -0.009304f, 0.009937f, 0.007901f, + -0.005354f, 0.010973f, -0.015745f, 0.019725f, 0.014797f, -0.000183f, -0.014474f, 0.000312f, 0.010697f, -0.045706f, 0.009924f, 0.017313f, -0.031446f, 0.012227f, -0.015808f, -0.024519f, -0.020844f, 0.009875f, -0.004772f, -0.034477f, 0.018546f, 0.008544f, -0.019677f, -0.034925f, 0.007400f, 0.002861f, -0.010107f, -0.003620f, -0.016850f, 0.015147f, 0.014018f, 0.022546f, -0.018519f, 0.001829f, -0.024775f, -0.010873f, 0.004851f, -0.017525f, 0.007204f, -0.003411f, -0.012220f, -0.020534f, -0.020162f, 0.028646f, -0.019882f, -0.011190f, -0.007215f, -0.000380f, 0.014280f, 0.006495f, 0.010520f, -0.001703f, 0.012228f, -0.005884f, 0.002283f, -0.007034f, -0.012122f, 0.000320f, 0.027142f, 0.001851f, 0.000966f, -0.002602f, -0.016925f, 0.008460f, 0.018289f, 0.015625f, -0.026039f, -0.012934f, -0.027466f, 0.008239f, -0.005366f, 0.011254f, -0.007918f, 0.005640f, 0.008201f, -0.008413f, -0.015945f, 0.023481f, -0.006610f, -0.009626f, 0.025999f, -0.004895f, -0.006807f, 0.030988f, -0.018201f, 0.005056f, 0.006831f, 0.002951f, -0.027429f, 0.000670f, -0.004531f, -0.015536f, 0.008592f, -0.012080f, 0.016432f, -0.002421f, + 0.018358f, -0.020195f, 0.012285f, -0.036205f, -0.000230f, -0.019486f, 0.021761f, -0.002862f, 0.002417f, -0.003265f, -0.021068f, -0.000886f, 0.017137f, 0.047554f, 0.002807f, 0.003558f, 0.009315f, 0.016659f, -0.003390f, -0.003905f, 0.000798f, -0.000180f, 0.040620f, -0.003109f, 0.005685f, 0.017226f, -0.016770f, -0.026851f, -0.000591f, -0.028399f, -0.004244f, -0.014234f, -0.011375f, -0.005117f, -0.012932f, 0.007654f, 0.009595f, -0.016141f, 0.020769f, 0.018611f, -0.003081f, -0.003444f, -0.017888f, 0.013329f, 0.004146f, 0.044256f, 0.048210f, 0.000359f, -0.014792f, -0.011865f, 0.040392f, -0.026530f, -0.030252f, 0.031509f, -0.028569f, 0.018427f, 0.005621f, 0.025515f, 0.023514f, 0.015908f, 0.002584f, -0.016001f, -0.013823f, 0.033133f, -0.013996f, -0.001348f, 0.008121f, 0.028260f, 0.040839f, -0.001144f, 0.027926f, -0.022702f, -0.023750f, 0.002818f, -0.008721f, 0.013302f, 0.008430f, -0.020183f, 0.002868f, 0.013112f, 0.033640f, 0.011641f, 0.013855f, 0.012837f, 0.015118f, 0.004113f, -0.001054f, 0.021560f, 0.003879f, 0.017326f, 0.027403f, 0.006026f, -0.011061f, -0.009150f, 0.024733f, 0.006850f, + 0.050578f, 0.012222f, 0.020049f, -0.020057f, -0.032135f, -0.002553f, -0.037541f, -0.023567f, -0.008392f, -0.012215f, 0.001644f, -0.001142f, 0.000540f, 0.001404f, -0.027979f, -0.022362f, -0.012091f, -0.022963f, 0.009075f, 0.010977f, -0.007069f, -0.000183f, -0.022228f, -0.001348f, 0.006548f, -0.003034f} +}; + +#undef WMC_TOOL_SKIP diff --git a/lib_rend/ivas_rom_binaural_crend_head.h b/lib_rend/ivas_rom_binaural_crend_head.h new file mode 100644 index 0000000000000000000000000000000000000000..4853122a2dc04f26e53b3b15e22c06612391bb09 --- /dev/null +++ b/lib_rend/ivas_rom_binaural_crend_head.h @@ -0,0 +1,290 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/* clang-format off */ + +/*------------------------------------------------------------------------- + * Binaural rendering related ROM tables + *------------------------------------------------------------------------*/ + +/* Binaural rendering data set based on HRIRs */ +/* Tables generated by scripts/binauralRenderer_interface/generate_cren_ivas_tables.c, see mixer_conv_sofa_to_rom_table_converter_readme.txt */ +/* Can be replaced by your own generated HRIR or BRIR tables */ + + + +#ifndef _IVAS_ROM_BINAURAL_CREND_HEAD_ +#define _IVAS_ROM_BINAURAL_CREND_HEAD_ + +#include "ivas_cnst.h" + + + +/********************** CRendBin_Combined_HRIR **********************/ + +extern float CRendBin_Combined_HRIR_latency_s; + +/* Sample Rate = 48000 */ + +extern int16_t CRendBin_Combined_HRIR_max_num_iterations_48kHz; +extern uint16_t CRendBin_Combined_HRIR_num_iterations_48kHz[15][BINAURAL_CHANNELS]; +extern uint16_t CRendBin_Combined_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS]; +extern uint16_t CRendBin_Combined_HRIR_pIndex_frequency_max_48kHz[15][BINAURAL_CHANNELS][1]; +extern uint16_t CRendBin_Combined_HRIR_index_frequency_max_diffuse_48kHz; +extern float CRendBin_Combined_HRIR_inv_diffuse_weight_48kHz[15]; +extern uint16_t *CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]; +extern float CRendBin_Combined_HRIR_coeff_re_48kHz[15][BINAURAL_CHANNELS][240]; +extern float CRendBin_Combined_HRIR_coeff_im_48kHz[15][BINAURAL_CHANNELS][240]; +extern float *CRendBin_Combined_HRIR_coeff_diffuse_re_48kHz[BINAURAL_CHANNELS]; +extern float *CRendBin_Combined_HRIR_coeff_diffuse_im_48kHz[BINAURAL_CHANNELS]; + +/* Sample Rate = 32000 */ + +extern int16_t CRendBin_Combined_HRIR_max_num_iterations_32kHz; +extern uint16_t CRendBin_Combined_HRIR_num_iterations_32kHz[15][BINAURAL_CHANNELS]; +extern uint16_t CRendBin_Combined_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS]; +extern uint16_t CRendBin_Combined_HRIR_pIndex_frequency_max_32kHz[15][BINAURAL_CHANNELS][1]; +extern uint16_t CRendBin_Combined_HRIR_index_frequency_max_diffuse_32kHz; +extern float CRendBin_Combined_HRIR_inv_diffuse_weight_32kHz[15]; +extern uint16_t *CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]; +extern float CRendBin_Combined_HRIR_coeff_re_32kHz[15][BINAURAL_CHANNELS][160]; +extern float CRendBin_Combined_HRIR_coeff_im_32kHz[15][BINAURAL_CHANNELS][160]; +extern float *CRendBin_Combined_HRIR_coeff_diffuse_re_32kHz[BINAURAL_CHANNELS]; +extern float *CRendBin_Combined_HRIR_coeff_diffuse_im_32kHz[BINAURAL_CHANNELS]; + +/* Sample Rate = 16000 */ + +extern int16_t CRendBin_Combined_HRIR_max_num_iterations_16kHz; +extern uint16_t CRendBin_Combined_HRIR_num_iterations_16kHz[15][BINAURAL_CHANNELS]; +extern uint16_t CRendBin_Combined_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS]; +extern uint16_t CRendBin_Combined_HRIR_pIndex_frequency_max_16kHz[15][BINAURAL_CHANNELS][1]; +extern uint16_t CRendBin_Combined_HRIR_index_frequency_max_diffuse_16kHz; +extern float CRendBin_Combined_HRIR_inv_diffuse_weight_16kHz[15]; +extern uint16_t *CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]; +extern float CRendBin_Combined_HRIR_coeff_re_16kHz[15][BINAURAL_CHANNELS][80]; +extern float CRendBin_Combined_HRIR_coeff_im_16kHz[15][BINAURAL_CHANNELS][80]; +extern float *CRendBin_Combined_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]; +extern float *CRendBin_Combined_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]; + + + + +/********************** CRendBin_FOA_HRIR **********************/ + +extern float CRendBin_FOA_HRIR_latency_s; + +/* Sample Rate = 48000 */ + +extern int16_t CRendBin_FOA_HRIR_max_num_iterations_48kHz; +extern uint16_t CRendBin_FOA_HRIR_num_iterations_48kHz[4][BINAURAL_CHANNELS]; +extern uint16_t CRendBin_FOA_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS]; +extern uint16_t CRendBin_FOA_HRIR_pIndex_frequency_max_48kHz[4][BINAURAL_CHANNELS][1]; +extern uint16_t CRendBin_FOA_HRIR_index_frequency_max_diffuse_48kHz; +extern float CRendBin_FOA_HRIR_inv_diffuse_weight_48kHz[4]; +extern uint16_t *CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]; +extern float CRendBin_FOA_HRIR_coeff_re_48kHz[4][BINAURAL_CHANNELS][240]; +extern float CRendBin_FOA_HRIR_coeff_im_48kHz[4][BINAURAL_CHANNELS][240]; +extern float *CRendBin_FOA_HRIR_coeff_diffuse_re_48kHz[BINAURAL_CHANNELS]; +extern float *CRendBin_FOA_HRIR_coeff_diffuse_im_48kHz[BINAURAL_CHANNELS]; + +/* Sample Rate = 32000 */ + +extern int16_t CRendBin_FOA_HRIR_max_num_iterations_32kHz; +extern uint16_t CRendBin_FOA_HRIR_num_iterations_32kHz[4][BINAURAL_CHANNELS]; +extern uint16_t CRendBin_FOA_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS]; +extern uint16_t CRendBin_FOA_HRIR_pIndex_frequency_max_32kHz[4][BINAURAL_CHANNELS][1]; +extern uint16_t CRendBin_FOA_HRIR_index_frequency_max_diffuse_32kHz; +extern float CRendBin_FOA_HRIR_inv_diffuse_weight_32kHz[4]; +extern uint16_t *CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]; +extern float CRendBin_FOA_HRIR_coeff_re_32kHz[4][BINAURAL_CHANNELS][160]; +extern float CRendBin_FOA_HRIR_coeff_im_32kHz[4][BINAURAL_CHANNELS][160]; +extern float *CRendBin_FOA_HRIR_coeff_diffuse_re_32kHz[BINAURAL_CHANNELS]; +extern float *CRendBin_FOA_HRIR_coeff_diffuse_im_32kHz[BINAURAL_CHANNELS]; + +/* Sample Rate = 16000 */ + +extern int16_t CRendBin_FOA_HRIR_max_num_iterations_16kHz; +extern uint16_t CRendBin_FOA_HRIR_num_iterations_16kHz[4][BINAURAL_CHANNELS]; +extern uint16_t CRendBin_FOA_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS]; +extern uint16_t CRendBin_FOA_HRIR_pIndex_frequency_max_16kHz[4][BINAURAL_CHANNELS][1]; +extern uint16_t CRendBin_FOA_HRIR_index_frequency_max_diffuse_16kHz; +extern float CRendBin_FOA_HRIR_inv_diffuse_weight_16kHz[4]; +extern uint16_t *CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]; +extern float CRendBin_FOA_HRIR_coeff_re_16kHz[4][BINAURAL_CHANNELS][80]; +extern float CRendBin_FOA_HRIR_coeff_im_16kHz[4][BINAURAL_CHANNELS][80]; +extern float *CRendBin_FOA_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]; +extern float *CRendBin_FOA_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]; + + + +/********************** CRendBin_HOA2_HRIR **********************/ + +extern float CRendBin_HOA2_HRIR_latency_s; + +/* Sample Rate = 48000 */ + +extern int16_t CRendBin_HOA2_HRIR_max_num_iterations_48kHz; +extern uint16_t CRendBin_HOA2_HRIR_num_iterations_48kHz[9][BINAURAL_CHANNELS]; +extern uint16_t CRendBin_HOA2_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS]; +extern uint16_t CRendBin_HOA2_HRIR_pIndex_frequency_max_48kHz[9][BINAURAL_CHANNELS][1]; +extern uint16_t CRendBin_HOA2_HRIR_index_frequency_max_diffuse_48kHz; +extern float CRendBin_HOA2_HRIR_inv_diffuse_weight_48kHz[9]; +extern uint16_t *CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]; +extern float CRendBin_HOA2_HRIR_coeff_re_48kHz[9][BINAURAL_CHANNELS][240]; +extern float CRendBin_HOA2_HRIR_coeff_im_48kHz[9][BINAURAL_CHANNELS][240]; +extern float *CRendBin_HOA2_HRIR_coeff_diffuse_re_48kHz[BINAURAL_CHANNELS]; +extern float *CRendBin_HOA2_HRIR_coeff_diffuse_im_48kHz[BINAURAL_CHANNELS]; + +/* Sample Rate = 32000 */ + +extern int16_t CRendBin_HOA2_HRIR_max_num_iterations_32kHz; +extern uint16_t CRendBin_HOA2_HRIR_num_iterations_32kHz[9][BINAURAL_CHANNELS]; +extern uint16_t CRendBin_HOA2_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS]; +extern uint16_t CRendBin_HOA2_HRIR_pIndex_frequency_max_32kHz[9][BINAURAL_CHANNELS][1]; +extern uint16_t CRendBin_HOA2_HRIR_index_frequency_max_diffuse_32kHz; +extern float CRendBin_HOA2_HRIR_inv_diffuse_weight_32kHz[9]; +extern uint16_t *CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]; +extern float CRendBin_HOA2_HRIR_coeff_re_32kHz[9][BINAURAL_CHANNELS][160]; +extern float CRendBin_HOA2_HRIR_coeff_im_32kHz[9][BINAURAL_CHANNELS][160]; +extern float *CRendBin_HOA2_HRIR_coeff_diffuse_re_32kHz[BINAURAL_CHANNELS]; +extern float *CRendBin_HOA2_HRIR_coeff_diffuse_im_32kHz[BINAURAL_CHANNELS]; + +/* Sample Rate = 16000 */ + +extern int16_t CRendBin_HOA2_HRIR_max_num_iterations_16kHz; +extern uint16_t CRendBin_HOA2_HRIR_num_iterations_16kHz[9][BINAURAL_CHANNELS]; +extern uint16_t CRendBin_HOA2_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS]; +extern uint16_t CRendBin_HOA2_HRIR_pIndex_frequency_max_16kHz[9][BINAURAL_CHANNELS][1]; +extern uint16_t CRendBin_HOA2_HRIR_index_frequency_max_diffuse_16kHz; +extern float CRendBin_HOA2_HRIR_inv_diffuse_weight_16kHz[9]; +extern uint16_t *CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]; +extern float CRendBin_HOA2_HRIR_coeff_re_16kHz[9][BINAURAL_CHANNELS][80]; +extern float CRendBin_HOA2_HRIR_coeff_im_16kHz[9][BINAURAL_CHANNELS][80]; +extern float *CRendBin_HOA2_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]; +extern float *CRendBin_HOA2_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]; + + + +/********************** CRendBin_HOA3_HRIR **********************/ + +extern float CRendBin_HOA3_HRIR_latency_s; + +/* Sample Rate = 48000 */ + +extern int16_t CRendBin_HOA3_HRIR_max_num_iterations_48kHz; +extern uint16_t CRendBin_HOA3_HRIR_num_iterations_48kHz[16][BINAURAL_CHANNELS]; +extern uint16_t CRendBin_HOA3_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS]; +extern uint16_t CRendBin_HOA3_HRIR_pIndex_frequency_max_48kHz[16][BINAURAL_CHANNELS][1]; +extern uint16_t CRendBin_HOA3_HRIR_index_frequency_max_diffuse_48kHz; +extern float CRendBin_HOA3_HRIR_inv_diffuse_weight_48kHz[16]; +extern uint16_t *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]; +extern float CRendBin_HOA3_HRIR_coeff_re_48kHz[16][BINAURAL_CHANNELS][240]; +extern float CRendBin_HOA3_HRIR_coeff_im_48kHz[16][BINAURAL_CHANNELS][240]; +extern float *CRendBin_HOA3_HRIR_coeff_diffuse_re_48kHz[BINAURAL_CHANNELS]; +extern float *CRendBin_HOA3_HRIR_coeff_diffuse_im_48kHz[BINAURAL_CHANNELS]; + +/* Sample Rate = 32000 */ + +extern int16_t CRendBin_HOA3_HRIR_max_num_iterations_32kHz; +extern uint16_t CRendBin_HOA3_HRIR_num_iterations_32kHz[16][BINAURAL_CHANNELS]; +extern uint16_t CRendBin_HOA3_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS]; +extern uint16_t CRendBin_HOA3_HRIR_pIndex_frequency_max_32kHz[16][BINAURAL_CHANNELS][1]; +extern uint16_t CRendBin_HOA3_HRIR_index_frequency_max_diffuse_32kHz; +extern float CRendBin_HOA3_HRIR_inv_diffuse_weight_32kHz[16]; +extern uint16_t *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]; +extern float CRendBin_HOA3_HRIR_coeff_re_32kHz[16][BINAURAL_CHANNELS][160]; +extern float CRendBin_HOA3_HRIR_coeff_im_32kHz[16][BINAURAL_CHANNELS][160]; +extern float *CRendBin_HOA3_HRIR_coeff_diffuse_re_32kHz[BINAURAL_CHANNELS]; +extern float *CRendBin_HOA3_HRIR_coeff_diffuse_im_32kHz[BINAURAL_CHANNELS]; + +/* Sample Rate = 16000 */ + +extern int16_t CRendBin_HOA3_HRIR_max_num_iterations_16kHz; +extern uint16_t CRendBin_HOA3_HRIR_num_iterations_16kHz[16][BINAURAL_CHANNELS]; +extern uint16_t CRendBin_HOA3_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS]; +extern uint16_t CRendBin_HOA3_HRIR_pIndex_frequency_max_16kHz[16][BINAURAL_CHANNELS][1]; +extern uint16_t CRendBin_HOA3_HRIR_index_frequency_max_diffuse_16kHz; +extern float CRendBin_HOA3_HRIR_inv_diffuse_weight_16kHz[16]; +extern uint16_t *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]; +extern float CRendBin_HOA3_HRIR_coeff_re_16kHz[16][BINAURAL_CHANNELS][80]; +extern float CRendBin_HOA3_HRIR_coeff_im_16kHz[16][BINAURAL_CHANNELS][80]; +extern float *CRendBin_HOA3_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]; +extern float *CRendBin_HOA3_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]; + + + +/********************** CRendBin_Combined_BRIR **********************/ + +extern float CRendBin_Combined_BRIR_latency_s; + +/* Sample Rate = 48000 */ + +extern int16_t CRendBin_Combined_BRIR_max_num_iterations_48kHz; +extern uint16_t CRendBin_Combined_BRIR_num_iterations_48kHz[15][BINAURAL_CHANNELS]; +extern uint16_t CRendBin_Combined_BRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS]; +extern uint16_t CRendBin_Combined_BRIR_pIndex_frequency_max_48kHz[15][BINAURAL_CHANNELS][22]; +extern uint16_t CRendBin_Combined_BRIR_index_frequency_max_diffuse_48kHz; +extern float CRendBin_Combined_BRIR_inv_diffuse_weight_48kHz[15]; +extern uint16_t CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS][40]; +extern float CRendBin_Combined_BRIR_coeff_re_48kHz[15][BINAURAL_CHANNELS][2955]; +extern float CRendBin_Combined_BRIR_coeff_im_48kHz[15][BINAURAL_CHANNELS][2955]; +extern float CRendBin_Combined_BRIR_coeff_diffuse_re_48kHz[BINAURAL_CHANNELS][2885]; +extern float CRendBin_Combined_BRIR_coeff_diffuse_im_48kHz[BINAURAL_CHANNELS][2885]; + +/* Sample Rate = 32000 */ + +extern int16_t CRendBin_Combined_BRIR_max_num_iterations_32kHz; +extern uint16_t CRendBin_Combined_BRIR_num_iterations_32kHz[15][BINAURAL_CHANNELS]; +extern uint16_t CRendBin_Combined_BRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS]; +extern uint16_t CRendBin_Combined_BRIR_pIndex_frequency_max_32kHz[15][BINAURAL_CHANNELS][22]; +extern uint16_t CRendBin_Combined_BRIR_index_frequency_max_diffuse_32kHz; +extern float CRendBin_Combined_BRIR_inv_diffuse_weight_32kHz[15]; +extern uint16_t CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS][40]; +extern float CRendBin_Combined_BRIR_coeff_re_32kHz[15][BINAURAL_CHANNELS][2819]; +extern float CRendBin_Combined_BRIR_coeff_im_32kHz[15][BINAURAL_CHANNELS][2819]; +extern float CRendBin_Combined_BRIR_coeff_diffuse_re_32kHz[BINAURAL_CHANNELS][2870]; +extern float CRendBin_Combined_BRIR_coeff_diffuse_im_32kHz[BINAURAL_CHANNELS][2870]; + +/* Sample Rate = 16000 */ + +extern int16_t CRendBin_Combined_BRIR_max_num_iterations_16kHz; +extern uint16_t CRendBin_Combined_BRIR_num_iterations_16kHz[15][BINAURAL_CHANNELS]; +extern uint16_t CRendBin_Combined_BRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS]; +extern uint16_t CRendBin_Combined_BRIR_pIndex_frequency_max_16kHz[15][BINAURAL_CHANNELS][23]; +extern uint16_t CRendBin_Combined_BRIR_index_frequency_max_diffuse_16kHz; +extern float CRendBin_Combined_BRIR_inv_diffuse_weight_16kHz[15]; +extern uint16_t CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS][40]; +extern float CRendBin_Combined_BRIR_coeff_re_16kHz[15][BINAURAL_CHANNELS][1774]; +extern float CRendBin_Combined_BRIR_coeff_im_16kHz[15][BINAURAL_CHANNELS][1774]; +extern float CRendBin_Combined_BRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS][2522]; +extern float CRendBin_Combined_BRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS][2522]; +#endif /* _IVAS_ROM_BINAURAL_CREND_HEAD_ */ diff --git a/lib_rend/ivas_rom_rend.c b/lib_rend/ivas_rom_rend.c new file mode 100644 index 0000000000000000000000000000000000000000..21ab8210e82bf1f74637e66b03da45659f753ee2 --- /dev/null +++ b/lib_rend/ivas_rom_rend.c @@ -0,0 +1,886 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include "options.h" +#include +#include "ivas_rom_rend.h" + +/* clang-format off */ + +/*----------------------------------------------------------------------------------* + * FASTCONV and PARAMETRIC binaural renderer ROM tables + *----------------------------------------------------------------------------------*/ + +/* +* 0 = 30,0 +* 1 = -30,0 +* 2 = 0,0 +* 3 = 135,0 +* 4 = -135,0 +* 5 = 110,0 +* 6 = -110,0 +* 7 = 90,0 +* 8 = -90,0 +* 9 = 30,35 +* 10 = -30,35 +* 11 = 110,35 +* 12 = -110,35 +* 13 = 135, 35 +* 14 = -135, 35 +*/ +const int16_t channelIndex_CICP6[5] = { 0, 1, 2, 5, 6 }; +const int16_t channelIndex_CICP12[7] = { 0, 1, 2, 5, 6, 3, 4 }; +const int16_t channelIndex_CICP14[7] = { 0, 1, 2, 5, 6, 9, 10 }; +const int16_t channelIndex_CICP16[9] = { 0, 1, 2, 5, 6, 9, 10, 11, 12 }; +const int16_t channelIndex_CICP19[11] = { 0, 1, 2, 3, 4, 7, 8, 9, 10, 13, 14 }; + + +const float surCohEne[MASA_NUM_DEFINED_SUR_SPR_COH_ENE_BINS] = +{ + 3.0903f, 2.0053f, 1.0860f, 0.8072f, 0.7079f +}; + +const float spreadCohEne05[MASA_NUM_DEFINED_SUR_SPR_COH_ENE_BINS] = +{ + 2.3988f, 1.7783f, 1.1220f, 1.1220f, 1.1220f +}; + +const float spreadCohEne1[MASA_NUM_DEFINED_SUR_SPR_COH_ENE_BINS] = +{ + 1.5975f, 1.1220f, 1.1220f, 1.1220f, 1.1220f +}; + +const float lowBitRateBinauralEQ[LOW_BIT_RATE_BINAURAL_EQ_BINS] = +{ + 0.979f, 0.893f, 0.762f, 0.615f, 0.52f, 0.48f, 0.477f, 0.477f, 0.48f, 0.501f, 0.546f, 0.602f, 0.652f, 0.664f, 0.652f, 0.639f, 0.635f +}; + +const float diffuseFieldCoherenceDifferenceX[BINAURAL_COHERENCE_DIFFERENCE_BINS] = +{ + 0.047421f, 0.19773f, 0.22582f, 0.10637f, 0.0087111f, 0.012028f, 0.031972f, 0.019668f, 0.0079928f +}; + +const float diffuseFieldCoherenceDifferenceY[BINAURAL_COHERENCE_DIFFERENCE_BINS] = +{ + -0.095628f, -0.30569f, -0.34427f, -0.15425f, -0.044628f, -0.057224f, -0.050835f, -0.035214f, -0.02215f +}; + +const float diffuseFieldCoherenceDifferenceZ[BINAURAL_COHERENCE_DIFFERENCE_BINS] = +{ + 0.048207f, 0.10796f, 0.11845f, 0.047886f, 0.035917f, 0.045196f, 0.018863f, 0.015547f, 0.014157f +}; + + +/*----------------------------------------------------------------------------------* + * TD ISM binaural renderer ROM tables + *----------------------------------------------------------------------------------*/ + +const int16_t HRTF_MODEL_N_CPTS_VAR[HRTF_MODEL_N_SECTIONS] = +{ + 13, 12, 11 +}; + +const float SincTable[321] = +{ + 1.00000000f, 0.99957629f, 0.99830587f, 0.99619078f, 0.99323448f, 0.98944177f, 0.98481881f, 0.97937311f, + 0.97311350f, 0.96605012f, 0.95819441f, 0.94955907f, 0.94015803f, 0.93000645f, 0.91912066f, 0.90751815f, + 0.89521750f, 0.88223838f, 0.86860150f, 0.85432856f, 0.83944219f, 0.82396595f, 0.80792425f, 0.79134231f, + 0.77424608f, 0.75666226f, 0.73861817f, 0.72014174f, 0.70126144f, 0.68200624f, 0.66240553f, 0.64248906f, + 0.62228691f, 0.60182943f, 0.58114713f, 0.56027070f, 0.53923087f, 0.51805843f, 0.49678411f, 0.47543856f, + 0.45405225f, 0.43265547f, 0.41127824f, 0.38995024f, 0.36870081f, 0.34755883f, 0.32655271f, 0.30571035f, + 0.28505905f, 0.26462549f, 0.24443569f, 0.22451493f, 0.20488776f, 0.18557791f, 0.16660829f, 0.14800093f, + 0.12977695f, 0.11195656f, 0.09455895f, 0.07760236f, 0.06110400f, 0.04508003f, 0.02954554f, 0.01451456f, + 0.00000000f, -0.01398631f, -0.02743368f, -0.04033255f, -0.05267447f, -0.06445214f, -0.07565940f, -0.08629121f, + -0.09634367f, -0.10581400f, -0.11470052f, -0.12300268f, -0.13072098f, -0.13785702f, -0.14441345f, -0.15039394f, + -0.15580318f, -0.16064685f, -0.16493160f, -0.16866498f, -0.17185547f, -0.17451243f, -0.17664604f, -0.17826729f, + -0.17938796f, -0.18002054f, -0.18017822f, -0.17987486f, -0.17912493f, -0.17794347f, -0.17634608f, -0.17434883f, + -0.17196824f, -0.16922125f, -0.16612516f, -0.16269761f, -0.15895648f, -0.15491992f, -0.15060625f, -0.14603396f, + -0.14122162f, -0.13618787f, -0.13095139f, -0.12553081f, -0.11994473f, -0.11421163f, -0.10834984f, -0.10237755f, + -0.09631271f, -0.09017300f, -0.08397586f, -0.07773838f, -0.07147731f, -0.06520902f, -0.05894946f, -0.05271415f, + -0.04651815f, -0.04037601f, -0.03430179f, -0.02830902f, -0.02241063f, -0.01661904f, -0.01094605f, -0.00540284f, + -0.00000000f, 0.00525251f, 0.01034538f, 0.01526993f, 0.02001814f, 0.02458266f, 0.02895676f, 0.03313441f, + 0.03711021f, 0.04087943f, 0.04443799f, 0.04778246f, 0.05091003f, 0.05381856f, 0.05650650f, 0.05897292f, + 0.06121749f, 0.06324047f, 0.06504268f, 0.06662549f, 0.06799083f, 0.06914112f, 0.07007930f, 0.07080878f, + 0.07133343f, 0.07165755f, 0.07178588f, 0.07172352f, 0.07147595f, 0.07104902f, 0.07044886f, 0.06968193f, + 0.06875494f, 0.06767485f, 0.06644886f, 0.06508435f, 0.06358888f, 0.06197015f, 0.06023599f, 0.05839432f, + 0.05645314f, 0.05442051f, 0.05230450f, 0.05011320f, 0.04785466f, 0.04553692f, 0.04316793f, 0.04075558f, + 0.03830765f, 0.03583181f, 0.03333557f, 0.03082630f, 0.02831121f, 0.02579730f, 0.02329137f, 0.02080003f, + 0.01832963f, 0.01588629f, 0.01347589f, 0.01110403f, 0.00877607f, 0.00649705f, 0.00427175f, 0.00210467f, + 0.00000000f, -0.00203837f, -0.00400686f, -0.00590216f, -0.00772131f, -0.00946162f, -0.01112072f, -0.01269654f, + -0.01418731f, -0.01559156f, -0.01690810f, -0.01813605f, -0.01927478f, -0.02032396f, -0.02128352f, -0.02215366f, + -0.02293482f, -0.02362769f, -0.02423318f, -0.02475245f, -0.02518686f, -0.02553797f, -0.02580754f, -0.02599752f, + -0.02611000f, -0.02614728f, -0.02611175f, -0.02600597f, -0.02583262f, -0.02559449f, -0.02529446f, -0.02493550f, + -0.02452066f, -0.02405306f, -0.02353586f, -0.02297226f, -0.02236549f, -0.02171881f, -0.02103547f, -0.02031874f, + -0.01957185f, -0.01879802f, -0.01800043f, -0.01718225f, -0.01634655f, -0.01549638f, -0.01463471f, -0.01376443f, + -0.01288838f, -0.01200928f, -0.01112977f, -0.01025241f, -0.00937962f, -0.00851376f, -0.00765705f, -0.00681160f, + -0.00597942f, -0.00516238f, -0.00436225f, -0.00358068f, -0.00281917f, -0.00207914f, -0.00136185f, -0.00066846f, + -0.00000000f, 0.00064260f, 0.00125856f, 0.00184718f, 0.00240790f, 0.00294026f, 0.00344390f, 0.00391857f, + 0.00436413f, 0.00478051f, 0.00516776f, 0.00552600f, 0.00585544f, 0.00615637f, 0.00642915f, 0.00667420f, + 0.00689203f, 0.00708318f, 0.00724827f, 0.00738795f, 0.00750293f, 0.00759395f, 0.00766178f, 0.00770723f, + 0.00773114f, 0.00773435f, 0.00771774f, 0.00768218f, 0.00762857f, 0.00755779f, 0.00747075f, 0.00736831f, + 0.00725138f, 0.00712082f, 0.00697748f, 0.00682221f, 0.00665584f, 0.00647916f, 0.00629295f, 0.00609797f, + 0.00589494f, 0.00568458f, 0.00546754f, 0.00524448f, 0.00501600f, 0.00478270f, 0.00454511f, 0.00430377f, + 0.00405916f, 0.00381176f, 0.00356198f, 0.00331023f, 0.00305690f, 0.00280234f, 0.00254687f, 0.00229079f, + 0.00203440f, 0.00177795f, 0.00152168f, 0.00126584f, 0.00101062f, 0.00075625f, 0.00050289f, 0.00025075f, + 0.00000000f +}; + +const float defaultHRIR_coherence_48kHz[LR_IAC_LENGTH_NR_FC] = { + 0.983003f, 0.933450f, 0.789276f, 0.574420f, 0.340710f, 0.144220f, 0.018803f, 0.000000f, 0.000000f, + 0.000000f, 0.011939f, 0.035489f, 0.043188f, 0.042460f, 0.041788f, 0.038562f, 0.028911f, 0.017162f, + 0.011571f, 0.014176f, 0.019830f, 0.024590f, 0.029203f, 0.033346f, 0.033418f, 0.029627f, 0.027479f, + 0.027434f, 0.025152f, 0.019518f, 0.014728f, 0.014201f, 0.016131f, 0.016294f, 0.013154f, 0.008660f, + 0.005005f, 0.002594f, 0.001044f, 0.000207f, 0.000000f, 0.000000f, 0.000000f, 0.001110f, 0.003986f, + 0.007003f, 0.009546f, 0.011532f, 0.012412f, 0.011553f, 0.009156f, 0.006222f, 0.003565f, 0.001384f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000032f, 0.000928f, 0.002118f, 0.003061f, 0.003575f, + 0.003780f, 0.003678f, 0.003110f, 0.002074f, 0.000856f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000217f, 0.000974f, 0.001807f, 0.002334f, + 0.002436f, 0.002105f, 0.001526f, 0.000907f, 0.000350f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000238f, 0.000852f, 0.001293f, + 0.001529f, 0.001533f, 0.001314f, 0.000954f, 0.000521f, 0.000155f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000025f, 0.000284f, 0.000620f, 0.000949f, 0.001274f, 0.001606f, 0.001922f, + 0.002195f, 0.002438f, 0.002687f, 0.002944f, 0.003172f, 0.003371f, 0.003577f, 0.003779f, 0.003915f, + 0.003973f, 0.003980f, 0.003925f, 0.003766f, 0.003501f, 0.003165f, 0.002778f, 0.002326f, 0.001806f, + 0.001257f, 0.000714f, 0.000211f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000766f, 0.000537f, 0.000000f, + 0.001691f, 0.003307f, 0.001635f, 0.000000f, 0.001601f, 0.007549f, 0.000580f, 0.000000f, 0.002038f, + 0.010325f, 0.002155f, 0.000000f, 0.003524f, 0.009251f, 0.005131f, 0.000000f, 0.002286f, 0.006486f, + 0.005902f, 0.000000f, 0.000862f, 0.004570f, 0.004117f, 0.000000f, 0.000000f, 0.003237f, 0.001534f, + 0.000259f, 0.000199f, 0.001363f, 0.000878f, 0.000000f +}; + +const float defaultHRIR_left_avg_power_48kHz[LR_IAC_LENGTH_NR_FC] = { + 0.978675f, 0.972385f, 0.959650f, 0.951879f, 0.952823f, 0.955063f, 0.950664f, 0.942982f, 0.943810f, + 0.958261f, 0.974503f, 0.980941f, 0.976648f, 0.968551f, 0.962061f, 0.957250f, 0.952477f, 0.948144f, + 0.945467f, 0.943209f, 0.938266f, 0.930238f, 0.923288f, 0.921237f, 0.922151f, 0.920812f, 0.917157f, + 0.914639f, 0.914127f, 0.913461f, 0.911654f, 0.910596f, 0.912207f, 0.915559f, 0.917863f, 0.917787f, + 0.916699f, 0.916435f, 0.916819f, 0.916225f, 0.914005f, 0.911360f, 0.909508f, 0.908111f, 0.906186f, + 0.903433f, 0.900605f, 0.898518f, 0.896964f, 0.894917f, 0.891856f, 0.888506f, 0.885940f, 0.884055f, + 0.881583f, 0.877955f, 0.874417f, 0.872501f, 0.871444f, 0.869864f, 0.867858f, 0.866735f, 0.867122f, + 0.868200f, 0.868897f, 0.869335f, 0.870657f, 0.873538f, 0.877306f, 0.880880f, 0.884388f, 0.889165f, + 0.895880f, 0.903263f, 0.909833f, 0.916015f, 0.922891f, 0.930300f, 0.936807f, 0.941431f, 0.944709f, + 0.947777f, 0.950731f, 0.952379f, 0.951745f, 0.949423f, 0.946810f, 0.944141f, 0.940067f, 0.933702f, + 0.926635f, 0.920257f, 0.914054f, 0.906651f, 0.897863f, 0.888903f, 0.880740f, 0.872936f, 0.864423f, + 0.855129f, 0.846311f, 0.839117f, 0.833266f, 0.827747f, 0.822648f, 0.819728f, 0.819707f, 0.821561f, + 0.824008f, 0.827075f, 0.831626f, 0.837745f, 0.844233f, 0.849862f, 0.854703f, 0.859787f, 0.865473f, + 0.870700f, 0.874300f, 0.876656f, 0.879215f, 0.882133f, 0.883808f, 0.883431f, 0.881897f, 0.880360f, + 0.878707f, 0.875924f, 0.871595f, 0.866584f, 0.862066f, 0.858145f, 0.853844f, 0.848581f, 0.843210f, + 0.839021f, 0.835832f, 0.831948f, 0.826952f, 0.822178f, 0.818520f, 0.815229f, 0.811138f, 0.806307f, + 0.801887f, 0.798628f, 0.796047f, 0.793269f, 0.790369f, 0.788436f, 0.788212f, 0.789066f, 0.789775f, + 0.790300f, 0.791907f, 0.794977f, 0.798368f, 0.800889f, 0.802776f, 0.805127f, 0.808190f, 0.810879f, + 0.812195f, 0.812606f, 0.813423f, 0.814925f, 0.815870f, 0.815340f, 0.814251f, 0.814186f, 0.814754f, + 0.814664f, 0.813654f, 0.812703f, 0.812701f, 0.813418f, 0.813910f, 0.813739f, 0.813585f, 0.814454f, + 0.816299f, 0.817832f, 0.818221f, 0.818620f, 0.820797f, 0.824043f, 0.825888f, 0.826559f, 0.828411f, + 0.832083f, 0.835548f, 0.837384f, 0.838961f, 0.842275f, 0.846770f, 0.849996f, 0.851359f, 0.853124f, + 0.856257f, 0.857270f, 0.852207f, 0.842390f, 0.831251f, 0.816041f, 0.791907f, 0.759307f, 0.723333f, + 0.686290f, 0.644649f, 0.594838f, 0.539959f, 0.487712f, 0.440561f, 0.389905f, 0.323258f, 0.238454f, + 0.149256f, 0.077620f, 0.032652f, 0.010630f, 0.002462f, 0.000339f, 0.000025f, 0.000016f, 0.000016f, + 0.000015f, 0.000014f, 0.000011f, 0.000009f, 0.000009f, 0.000009f, 0.000007f, 0.000006f, 0.000006f, + 0.000007f, 0.000006f, 0.000005f, 0.000005f, 0.000006f, 0.000005f, 0.000005f, 0.000005f, 0.000005f, + 0.000005f, 0.000005f, 0.000005f, 0.000005f, 0.000005f, 0.000005f, 0.000005f, 0.000005f, 0.000005f, + 0.000005f, 0.000005f, 0.000005f, 0.000005f, 0.000005f +}; + +const float defaultHRIR_right_avg_power_48kHz[LR_IAC_LENGTH_NR_FC] = { + 0.978675f, 0.972385f, 0.959652f, 0.951882f, 0.952822f, 0.955062f, 0.950665f, 0.942984f, 0.943810f, + 0.958262f, 0.974501f, 0.980942f, 0.976647f, 0.968551f, 0.962062f, 0.957251f, 0.952476f, 0.948141f, + 0.945464f, 0.943208f, 0.938265f, 0.930238f, 0.923288f, 0.921237f, 0.922151f, 0.920812f, 0.917158f, + 0.914639f, 0.914125f, 0.913460f, 0.911652f, 0.910595f, 0.912207f, 0.915559f, 0.917865f, 0.917788f, + 0.916698f, 0.916433f, 0.916818f, 0.916224f, 0.914005f, 0.911361f, 0.909504f, 0.908110f, 0.906186f, + 0.903433f, 0.900605f, 0.898518f, 0.896965f, 0.894920f, 0.891858f, 0.888507f, 0.885940f, 0.884054f, + 0.881580f, 0.877954f, 0.874417f, 0.872502f, 0.871442f, 0.869862f, 0.867858f, 0.866735f, 0.867123f, + 0.868201f, 0.868897f, 0.869333f, 0.870655f, 0.873539f, 0.877309f, 0.880883f, 0.884387f, 0.889165f, + 0.895880f, 0.903264f, 0.909834f, 0.916014f, 0.922893f, 0.930302f, 0.936809f, 0.941431f, 0.944709f, + 0.947777f, 0.950731f, 0.952378f, 0.951746f, 0.949421f, 0.946811f, 0.944145f, 0.940067f, 0.933700f, + 0.926637f, 0.920257f, 0.914054f, 0.906653f, 0.897864f, 0.888905f, 0.880742f, 0.872937f, 0.864423f, + 0.855128f, 0.846312f, 0.839118f, 0.833269f, 0.827748f, 0.822649f, 0.819728f, 0.819710f, 0.821561f, + 0.824007f, 0.827074f, 0.831626f, 0.837745f, 0.844232f, 0.849861f, 0.854703f, 0.859787f, 0.865474f, + 0.870700f, 0.874300f, 0.876658f, 0.879216f, 0.882133f, 0.883807f, 0.883428f, 0.881895f, 0.880358f, + 0.878709f, 0.875925f, 0.871596f, 0.866586f, 0.862067f, 0.858144f, 0.853843f, 0.848581f, 0.843210f, + 0.839021f, 0.835833f, 0.831948f, 0.826952f, 0.822177f, 0.818518f, 0.815228f, 0.811137f, 0.806306f, + 0.801886f, 0.798627f, 0.796045f, 0.793268f, 0.790369f, 0.788437f, 0.788213f, 0.789064f, 0.789770f, + 0.790299f, 0.791906f, 0.794977f, 0.798369f, 0.800890f, 0.802778f, 0.805130f, 0.808191f, 0.810879f, + 0.812198f, 0.812607f, 0.813424f, 0.814926f, 0.815872f, 0.815339f, 0.814254f, 0.814188f, 0.814757f, + 0.814665f, 0.813653f, 0.812704f, 0.812700f, 0.813416f, 0.813908f, 0.813738f, 0.813584f, 0.814454f, + 0.816300f, 0.817832f, 0.818221f, 0.818620f, 0.820796f, 0.824044f, 0.825889f, 0.826559f, 0.828413f, + 0.832084f, 0.835548f, 0.837383f, 0.838960f, 0.842272f, 0.846766f, 0.849995f, 0.851358f, 0.853121f, + 0.856258f, 0.857268f, 0.852209f, 0.842391f, 0.831252f, 0.816040f, 0.791907f, 0.759307f, 0.723333f, + 0.686288f, 0.644648f, 0.594838f, 0.539959f, 0.487712f, 0.440562f, 0.389904f, 0.323259f, 0.238454f, + 0.149256f, 0.077620f, 0.032652f, 0.010630f, 0.002462f, 0.000339f, 0.000025f, 0.000016f, 0.000016f, + 0.000015f, 0.000014f, 0.000011f, 0.000009f, 0.000009f, 0.000009f, 0.000007f, 0.000006f, 0.000006f, + 0.000007f, 0.000006f, 0.000005f, 0.000005f, 0.000006f, 0.000005f, 0.000005f, 0.000005f, 0.000005f, + 0.000005f, 0.000005f, 0.000005f, 0.000005f, 0.000005f, 0.000005f, 0.000005f, 0.000005f, 0.000005f, + 0.000005f, 0.000005f, 0.000005f, 0.000005f, 0.000005f +}; + +const float defaultHRIR_coherence_32kHz[LR_IAC_LENGTH_NR_FC] = { + 0.976959f, 0.962817f, 0.892107f, 0.783427f, 0.649433f, 0.488372f, 0.336040f, 0.196803f, 0.094108f, + 0.016852f, 0.004815f, 0.000000f, 0.000000f, 0.000000f, 0.002703f, 0.009460f, 0.024631f, 0.038937f, + 0.041367f, 0.041308f, 0.039589f, 0.039056f, 0.037048f, 0.032828f, 0.024623f, 0.015933f, 0.009282f, + 0.007047f, 0.007754f, 0.011823f, 0.015553f, 0.018773f, 0.021834f, 0.024812f, 0.027619f, 0.028707f, + 0.028648f, 0.026125f, 0.024072f, 0.022724f, 0.022507f, 0.022144f, 0.020064f, 0.016587f, 0.012177f, + 0.009732f, 0.008764f, 0.010014f, 0.011423f, 0.012307f, 0.010938f, 0.008551f, 0.005485f, 0.002935f, + 0.001054f, 0.000176f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000231f, 0.001386f, 0.003010f, 0.004946f, 0.006482f, 0.007843f, 0.008942f, + 0.009171f, 0.008905f, 0.007532f, 0.005772f, 0.003756f, 0.001923f, 0.000617f, 0.000103f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000265f, 0.000706f, 0.000947f, 0.001119f, 0.001185f, 0.001040f, 0.000772f, 0.000221f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000099f, 0.000345f, 0.000565f, 0.000710f, 0.000581f, 0.000331f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000098f, 0.000341f, 0.000584f, 0.000793f, + 0.000876f, 0.000853f, 0.000759f, 0.000512f, 0.000273f, 0.000045f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000011f, + 0.000039f, 0.000157f, 0.000303f, 0.000474f, 0.000664f, 0.000865f, 0.001073f, 0.001281f, 0.001488f, + 0.001698f, 0.001906f, 0.002099f, 0.002268f, 0.002421f, 0.002545f, 0.002666f, 0.002785f, 0.002898f, + 0.003010f, 0.003124f, 0.003262f, 0.003417f, 0.003642f, 0.003884f, 0.004155f, 0.004443f, 0.004744f, + 0.005073f, 0.005422f, 0.005784f, 0.006121f, 0.006428f, 0.006690f, 0.006905f, 0.007096f, 0.007241f, + 0.007305f, 0.007315f, 0.007117f, 0.006840f, 0.006446f, 0.005915f, 0.005314f, 0.004568f, 0.003781f, + 0.002967f, 0.002550f, 0.002355f, 0.002493f, 0.002520f +}; + +const float defaultHRIR_left_avg_power_32kHz[LR_IAC_LENGTH_NR_FC] = { + 1.042842f, 1.041052f, 1.032098f, 1.024347f, 1.017398f, 1.019204f, 1.022140f, 1.026773f, 1.026684f, + 1.024560f, 1.019019f, 1.016692f, 1.016507f, 1.025484f, 1.035123f, 1.045753f, 1.050401f, 1.052033f, + 1.047590f, 1.042551f, 1.037116f, 1.034266f, 1.031619f, 1.029278f, 1.025989f, 1.022575f, 1.019610f, + 1.017442f, 1.015805f, 1.012657f, 1.008261f, 1.001990f, 0.995937f, 0.990744f, 0.988777f, 0.988277f, + 0.988755f, 0.987563f, 0.985600f, 0.982481f, 0.980182f, 0.978414f, 0.977951f, 0.977129f, 0.976068f, + 0.974020f, 0.972563f, 0.971992f, 0.973446f, 0.975452f, 0.977643f, 0.978631f, 0.978818f, 0.977682f, + 0.976742f, 0.976096f, 0.975927f, 0.975729f, 0.974941f, 0.973370f, 0.971276f, 0.968762f, 0.966461f, + 0.964481f, 0.962731f, 0.960904f, 0.958549f, 0.955708f, 0.952543f, 0.949546f, 0.946857f, 0.944631f, + 0.942410f, 0.939997f, 0.936815f, 0.933278f, 0.929505f, 0.926271f, 0.923282f, 0.920659f, 0.917696f, + 0.914482f, 0.910602f, 0.906806f, 0.903065f, 0.900364f, 0.897894f, 0.895772f, 0.893323f, 0.890740f, + 0.887944f, 0.885641f, 0.883667f, 0.882835f, 0.882051f, 0.881336f, 0.880121f, 0.878813f, 0.877633f, + 0.877223f, 0.877327f, 0.878409f, 0.879421f, 0.880327f, 0.881091f, 0.882024f, 0.883779f, 0.886402f, + 0.889602f, 0.893152f, 0.896459f, 0.899400f, 0.902225f, 0.905146f, 0.908573f, 0.912109f, 0.915718f, + 0.918254f, 0.920227f, 0.921355f, 0.922089f, 0.922760f, 0.923576f, 0.924088f, 0.924398f, 0.923115f, + 0.921260f, 0.918548f, 0.915643f, 0.912707f, 0.909842f, 0.906416f, 0.902615f, 0.897332f, 0.891877f, + 0.886166f, 0.880998f, 0.875991f, 0.871078f, 0.865522f, 0.859537f, 0.852717f, 0.846083f, 0.839728f, + 0.833972f, 0.828308f, 0.822411f, 0.816009f, 0.809271f, 0.802578f, 0.796320f, 0.790714f, 0.785846f, + 0.781192f, 0.776652f, 0.772249f, 0.767940f, 0.764926f, 0.762667f, 0.761540f, 0.761326f, 0.761372f, + 0.761547f, 0.761950f, 0.762506f, 0.764263f, 0.766400f, 0.769105f, 0.771504f, 0.773644f, 0.775056f, + 0.776462f, 0.777865f, 0.779929f, 0.781942f, 0.783881f, 0.784915f, 0.785562f, 0.785567f, 0.785690f, + 0.785891f, 0.786286f, 0.786348f, 0.785912f, 0.784408f, 0.782509f, 0.780101f, 0.777798f, 0.775564f, + 0.773205f, 0.770446f, 0.767088f, 0.762953f, 0.758652f, 0.754459f, 0.750714f, 0.747266f, 0.743818f, + 0.740063f, 0.735847f, 0.731497f, 0.727285f, 0.723759f, 0.720587f, 0.717650f, 0.714166f, 0.710382f, + 0.706148f, 0.702029f, 0.698046f, 0.694494f, 0.690839f, 0.687115f, 0.682535f, 0.677735f, 0.672604f, + 0.667663f, 0.662868f, 0.658475f, 0.654061f, 0.649634f, 0.644689f, 0.639750f, 0.634821f, 0.630767f, + 0.627153f, 0.624422f, 0.621650f, 0.618850f, 0.615731f, 0.613069f, 0.611089f, 0.610598f, 0.610566f, + 0.610880f, 0.610933f, 0.610809f, 0.611930f, 0.614079f, 0.617771f, 0.622653f, 0.628199f, 0.635210f, + 0.645081f, 0.656860f, 0.669006f, 0.673510f, 0.666552f, 0.628172f, 0.575127f, 0.494850f, 0.413951f, + 0.332637f, 0.280816f, 0.241903f, 0.222353f, 0.218443f +}; + +const float defaultHRIR_right_avg_power_32kHz[LR_IAC_LENGTH_NR_FC] = { + 1.042841f, 1.041051f, 1.032097f, 1.024346f, 1.017399f, 1.019202f, 1.022138f, 1.026772f, 1.026684f, + 1.024560f, 1.019019f, 1.016691f, 1.016506f, 1.025485f, 1.035123f, 1.045752f, 1.050401f, 1.052035f, + 1.047590f, 1.042551f, 1.037115f, 1.034265f, 1.031619f, 1.029280f, 1.025989f, 1.022573f, 1.019609f, + 1.017441f, 1.015805f, 1.012660f, 1.008264f, 1.001991f, 0.995937f, 0.990744f, 0.988778f, 0.988278f, + 0.988755f, 0.987564f, 0.985601f, 0.982480f, 0.980182f, 0.978415f, 0.977953f, 0.977129f, 0.976065f, + 0.974019f, 0.972563f, 0.971995f, 0.973448f, 0.975452f, 0.977643f, 0.978632f, 0.978821f, 0.977685f, + 0.976745f, 0.976097f, 0.975927f, 0.975729f, 0.974941f, 0.973370f, 0.971276f, 0.968759f, 0.966458f, + 0.964480f, 0.962731f, 0.960906f, 0.958547f, 0.955706f, 0.952543f, 0.949546f, 0.946857f, 0.944629f, + 0.942409f, 0.939999f, 0.936815f, 0.933278f, 0.929507f, 0.926270f, 0.923280f, 0.920660f, 0.917696f, + 0.914481f, 0.910601f, 0.906806f, 0.903066f, 0.900365f, 0.897895f, 0.895772f, 0.893323f, 0.890740f, + 0.887942f, 0.885640f, 0.883669f, 0.882835f, 0.882049f, 0.881335f, 0.880120f, 0.878812f, 0.877632f, + 0.877223f, 0.877328f, 0.878410f, 0.879422f, 0.880327f, 0.881092f, 0.882026f, 0.883781f, 0.886402f, + 0.889601f, 0.893151f, 0.896457f, 0.899399f, 0.902224f, 0.905146f, 0.908576f, 0.912111f, 0.915716f, + 0.918254f, 0.920227f, 0.921354f, 0.922087f, 0.922759f, 0.923576f, 0.924090f, 0.924401f, 0.923115f, + 0.921259f, 0.918547f, 0.915643f, 0.912708f, 0.909842f, 0.906416f, 0.902617f, 0.897334f, 0.891879f, + 0.886168f, 0.881000f, 0.875992f, 0.871078f, 0.865522f, 0.859538f, 0.852719f, 0.846085f, 0.839728f, + 0.833973f, 0.828309f, 0.822411f, 0.816009f, 0.809271f, 0.802579f, 0.796321f, 0.790714f, 0.785846f, + 0.781192f, 0.776653f, 0.772250f, 0.767940f, 0.764926f, 0.762667f, 0.761541f, 0.761325f, 0.761371f, + 0.761548f, 0.761950f, 0.762504f, 0.764263f, 0.766400f, 0.769104f, 0.771504f, 0.773644f, 0.775054f, + 0.776461f, 0.777866f, 0.779929f, 0.781942f, 0.783879f, 0.784913f, 0.785561f, 0.785567f, 0.785690f, + 0.785891f, 0.786285f, 0.786348f, 0.785913f, 0.784409f, 0.782510f, 0.780103f, 0.777798f, 0.775563f, + 0.773206f, 0.770449f, 0.767090f, 0.762954f, 0.758652f, 0.754458f, 0.750712f, 0.747266f, 0.743818f, + 0.740062f, 0.735846f, 0.731497f, 0.727285f, 0.723759f, 0.720587f, 0.717649f, 0.714164f, 0.710381f, + 0.706148f, 0.702028f, 0.698044f, 0.694493f, 0.690838f, 0.687113f, 0.682535f, 0.677735f, 0.672602f, + 0.667662f, 0.662869f, 0.658475f, 0.654061f, 0.649632f, 0.644687f, 0.639749f, 0.634820f, 0.630767f, + 0.627154f, 0.624423f, 0.621650f, 0.618849f, 0.615732f, 0.613069f, 0.611090f, 0.610599f, 0.610566f, + 0.610881f, 0.610933f, 0.610811f, 0.611930f, 0.614078f, 0.617770f, 0.622653f, 0.628199f, 0.635210f, + 0.645082f, 0.656861f, 0.669007f, 0.673511f, 0.666551f, 0.628170f, 0.575125f, 0.494849f, 0.413951f, + 0.332639f, 0.280817f, 0.241904f, 0.222354f, 0.218443f +}; + +const float defaultHRIR_coherence_16kHz[LR_IAC_LENGTH_NR_FC] = { + 0.969495f, 0.969495f, 0.955351f, 0.919989f, 0.884627f, 0.842799f, 0.775108f, 0.707416f, 0.639724f, + 0.559264f, 0.478804f, 0.398344f, 0.327187f, 0.258355f, 0.189524f, 0.134064f, 0.087519f, 0.040974f, + 0.011416f, 0.007339f, 0.003262f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.002562f, 0.005763f, 0.008965f, 0.014937f, 0.022756f, 0.030575f, 0.035595f, 0.036416f, + 0.037238f, 0.037747f, 0.037005f, 0.036264f, 0.035523f, 0.035506f, 0.035489f, 0.035472f, 0.034043f, + 0.032261f, 0.030479f, 0.027264f, 0.023092f, 0.018921f, 0.015179f, 0.012080f, 0.008982f, 0.006557f, + 0.006827f, 0.007098f, 0.007368f, 0.009187f, 0.011006f, 0.012825f, 0.014250f, 0.015575f, 0.016901f, + 0.018085f, 0.019174f, 0.020264f, 0.021306f, 0.022276f, 0.023246f, 0.023984f, 0.023794f, 0.023604f, + 0.023414f, 0.022260f, 0.021105f, 0.019951f, 0.019250f, 0.018662f, 0.018074f, 0.017860f, 0.017894f, + 0.017928f, 0.017558f, 0.016581f, 0.015604f, 0.014403f, 0.012303f, 0.010203f, 0.008103f, 0.006887f, + 0.005671f, 0.004455f, 0.004657f, 0.005213f, 0.005769f, 0.006365f, 0.006987f, 0.007608f, 0.007649f, + 0.006819f, 0.005989f, 0.004992f, 0.003328f, 0.001664f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000038f, 0.000229f, + 0.000420f, 0.000610f, 0.001290f, 0.001970f, 0.002649f, 0.003127f, 0.003555f, 0.003982f, 0.004113f, + 0.004046f, 0.003978f, 0.003618f, 0.002820f, 0.002021f, 0.001296f, 0.000864f, 0.000432f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000005f, 0.000011f, 0.000018f, 0.000743f, 0.001947f, 0.003152f, 0.004819f, + 0.007179f, 0.009539f, 0.012160f, 0.015826f, 0.019491f, 0.023157f, 0.028625f, 0.034093f, 0.039562f, + 0.046791f, 0.054462f, 0.062132f, 0.065200f, 0.065200f +}; + +const float defaultHRIR_left_avg_power_16kHz[LR_IAC_LENGTH_NR_FC] = { + 1.112848f, 1.112848f, 1.110615f, 1.105032f, 1.099449f, 1.094383f, 1.091385f, 1.088386f, 1.085388f, + 1.087986f, 1.090583f, 1.093181f, 1.095718f, 1.098238f, 1.100760f, 1.100829f, 1.099264f, 1.097699f, + 1.095677f, 1.092970f, 1.090263f, 1.088142f, 1.088367f, 1.088593f, 1.088819f, 1.092532f, 1.096246f, + 1.099959f, 1.104778f, 1.109873f, 1.114969f, 1.118806f, 1.121804f, 1.124803f, 1.125952f, 1.124327f, + 1.122702f, 1.120550f, 1.116291f, 1.112033f, 1.107774f, 1.105150f, 1.102527f, 1.099903f, 1.098607f, + 1.097642f, 1.096677f, 1.094771f, 1.092238f, 1.089705f, 1.086741f, 1.083131f, 1.079521f, 1.076294f, + 1.074604f, 1.072914f, 1.071224f, 1.070018f, 1.068812f, 1.067606f, 1.064075f, 1.059962f, 1.055849f, + 1.051324f, 1.046526f, 1.041727f, 1.038409f, 1.037312f, 1.036215f, 1.035479f, 1.036192f, 1.036905f, + 1.037618f, 1.035536f, 1.033453f, 1.031371f, 1.028051f, 1.024421f, 1.020792f, 1.018471f, 1.017022f, + 1.015574f, 1.014441f, 1.013780f, 1.013120f, 1.012053f, 1.009355f, 1.006658f, 1.003961f, 1.001331f, + 0.998701f, 0.996071f, 0.995600f, 0.995668f, 0.995737f, 0.996093f, 0.996641f, 0.997189f, 0.997005f, + 0.995722f, 0.994439f, 0.993136f, 0.991757f, 0.990377f, 0.988997f, 0.988491f, 0.987986f, 0.987480f, + 0.985997f, 0.984269f, 0.982542f, 0.980066f, 0.977092f, 0.974118f, 0.971621f, 0.969840f, 0.968058f, + 0.966366f, 0.965026f, 0.963687f, 0.962348f, 0.958809f, 0.955271f, 0.951732f, 0.947645f, 0.943422f, + 0.939198f, 0.936257f, 0.934171f, 0.932086f, 0.930008f, 0.927942f, 0.925876f, 0.923250f, 0.918385f, + 0.913521f, 0.908656f, 0.903702f, 0.898749f, 0.893795f, 0.891002f, 0.888749f, 0.886496f, 0.883996f, + 0.881331f, 0.878666f, 0.874814f, 0.869183f, 0.863553f, 0.858015f, 0.852851f, 0.847687f, 0.842523f, + 0.840022f, 0.837520f, 0.835019f, 0.831781f, 0.828359f, 0.824937f, 0.820011f, 0.814082f, 0.808153f, + 0.802713f, 0.798009f, 0.793305f, 0.789023f, 0.786429f, 0.783835f, 0.781241f, 0.777028f, 0.772815f, + 0.768602f, 0.763134f, 0.757353f, 0.751571f, 0.747112f, 0.743534f, 0.739956f, 0.736838f, 0.734410f, + 0.731982f, 0.729034f, 0.724009f, 0.718984f, 0.713959f, 0.708439f, 0.702918f, 0.697398f, 0.694412f, + 0.692061f, 0.689710f, 0.687330f, 0.684932f, 0.682534f, 0.678706f, 0.672732f, 0.666759f, 0.660939f, + 0.655737f, 0.650536f, 0.645334f, 0.644222f, 0.643110f, 0.641998f, 0.639788f, 0.637303f, 0.634818f, + 0.629683f, 0.622782f, 0.615880f, 0.609823f, 0.605032f, 0.600241f, 0.596372f, 0.596194f, 0.596015f, + 0.595837f, 0.592403f, 0.588969f, 0.585535f, 0.577842f, 0.569084f, 0.560326f, 0.553880f, 0.548977f, + 0.544074f, 0.541240f, 0.541511f, 0.541781f, 0.540837f, 0.535040f, 0.529243f, 0.523446f, 0.510870f, + 0.498293f, 0.485717f, 0.479851f, 0.475663f, 0.471475f, 0.473848f, 0.480595f, 0.487343f, 0.489727f, + 0.485566f, 0.481405f, 0.471747f, 0.440099f, 0.408451f, 0.376804f, 0.330744f, 0.284685f, 0.238626f, + 0.203638f, 0.171419f, 0.139199f, 0.126312f, 0.126312f +}; + +const float defaultHRIR_right_avg_power_16kHz[LR_IAC_LENGTH_NR_FC] = { + 1.112848f, 1.112848f, 1.110615f, 1.105033f, 1.099450f, 1.094384f, 1.091385f, 1.088385f, 1.085385f, + 1.087983f, 1.090582f, 1.093180f, 1.095717f, 1.098238f, 1.100758f, 1.100828f, 1.099264f, 1.097700f, + 1.095678f, 1.092969f, 1.090259f, 1.088138f, 1.088365f, 1.088592f, 1.088819f, 1.092533f, 1.096246f, + 1.099960f, 1.104778f, 1.109872f, 1.114967f, 1.118803f, 1.121802f, 1.124800f, 1.125950f, 1.124325f, + 1.122701f, 1.120550f, 1.116290f, 1.112030f, 1.107770f, 1.105148f, 1.102526f, 1.099904f, 1.098608f, + 1.097642f, 1.096677f, 1.094770f, 1.092237f, 1.089704f, 1.086740f, 1.083130f, 1.079521f, 1.076295f, + 1.074604f, 1.072914f, 1.071223f, 1.070018f, 1.068813f, 1.067608f, 1.064076f, 1.059963f, 1.055849f, + 1.051324f, 1.046525f, 1.041726f, 1.038407f, 1.037310f, 1.036213f, 1.035478f, 1.036191f, 1.036904f, + 1.037617f, 1.035535f, 1.033453f, 1.031372f, 1.028051f, 1.024421f, 1.020791f, 1.018470f, 1.017021f, + 1.015573f, 1.014440f, 1.013780f, 1.013121f, 1.012054f, 1.009357f, 1.006659f, 1.003962f, 1.001331f, + 0.998700f, 0.996070f, 0.995598f, 0.995666f, 0.995735f, 0.996091f, 0.996639f, 0.997188f, 0.997004f, + 0.995722f, 0.994439f, 0.993137f, 0.991758f, 0.990378f, 0.988998f, 0.988492f, 0.987987f, 0.987481f, + 0.985997f, 0.984269f, 0.982541f, 0.980065f, 0.977091f, 0.974118f, 0.971621f, 0.969841f, 0.968060f, + 0.966368f, 0.965029f, 0.963689f, 0.962350f, 0.958810f, 0.955270f, 0.951731f, 0.947643f, 0.943419f, + 0.939196f, 0.936255f, 0.934170f, 0.932086f, 0.930009f, 0.927943f, 0.925877f, 0.923251f, 0.918386f, + 0.913520f, 0.908655f, 0.903701f, 0.898748f, 0.893795f, 0.891001f, 0.888748f, 0.886495f, 0.883995f, + 0.881330f, 0.878665f, 0.874814f, 0.869184f, 0.863554f, 0.858016f, 0.852852f, 0.847687f, 0.842522f, + 0.840021f, 0.837520f, 0.835019f, 0.831781f, 0.828358f, 0.824936f, 0.820010f, 0.814081f, 0.808152f, + 0.802713f, 0.798009f, 0.793305f, 0.789024f, 0.786430f, 0.783837f, 0.781244f, 0.777029f, 0.772815f, + 0.768601f, 0.763133f, 0.757353f, 0.751572f, 0.747112f, 0.743534f, 0.739956f, 0.736837f, 0.734410f, + 0.731982f, 0.729034f, 0.724009f, 0.718984f, 0.713959f, 0.708439f, 0.702919f, 0.697399f, 0.694414f, + 0.692063f, 0.689712f, 0.687331f, 0.684932f, 0.682532f, 0.678704f, 0.672731f, 0.666759f, 0.660941f, + 0.655738f, 0.650534f, 0.645331f, 0.644220f, 0.643109f, 0.641999f, 0.639789f, 0.637304f, 0.634819f, + 0.629684f, 0.622783f, 0.615881f, 0.609824f, 0.605033f, 0.600242f, 0.596373f, 0.596194f, 0.596015f, + 0.595837f, 0.592403f, 0.588969f, 0.585535f, 0.577842f, 0.569083f, 0.560324f, 0.553879f, 0.548977f, + 0.544074f, 0.541241f, 0.541511f, 0.541781f, 0.540838f, 0.535041f, 0.529243f, 0.523446f, 0.510869f, + 0.498293f, 0.485717f, 0.479851f, 0.475663f, 0.471475f, 0.473848f, 0.480595f, 0.487343f, 0.489727f, + 0.485566f, 0.481405f, 0.471746f, 0.440098f, 0.408450f, 0.376802f, 0.330743f, 0.284685f, 0.238626f, + 0.203638f, 0.171419f, 0.139199f, 0.126311f, 0.126311f +}; +/*----------------------------------------------------------------------------------* + * t-design and SN3D normalization table + *----------------------------------------------------------------------------------*/ + + /* SN3D norm */ +const float norm_sn3d_hoa3[16] = +{ + 1.f, 1.7320508f, 1.7320508f, 1.7320508f, 2.2360680f, 2.2360680f, 2.2360680f, 2.2360680f, + 2.2360680f, 2.6457512f, 2.6457512f, 2.6457512f, 2.6457512f, 2.6457512f, 2.6457512f, 2.6457512f +}; + +/* Order 11 t-design */ +const float t_design_11_azimuth[70] = +{ + 1.329273e+02f, -8.393495e+01f, 8.474100e+00f, -1.133408e+02f, -1.032659e+02f, -3.323704e+01f, 2.185643e+01f, -1.565395e+02f, + -6.426475e+01f, 1.657795e+02f, -2.520283e+01f, -9.700380e+01f, 2.785464e+01f, 1.532142e+02f, -1.550616e+02f, -1.184214e+01f, + 8.053873e+01f, -4.205616e+01f, -3.122333e+01f, 3.883790e+01f, 9.376069e+01f, -8.475602e+01f, 7.755368e+00f, -1.222769e+02f, + 4.680127e+01f, -2.476863e+01f, 9.989047e+01f, -1.347840e+02f, -8.308802e+01f, 6.012817e+01f, 1.526447e+02f, 2.975767e+01f, + 4.077932e+01f, 1.101839e+02f, 1.656521e+02f, -1.299266e+01f, 7.973599e+01f, -5.052453e+01f, 1.189239e+02f, 4.722029e+01f, + 1.719253e+02f, -6.251458e+01f, -1.111567e+01f, 1.320180e+02f, -1.353555e+02f, 1.023709e+02f, 1.127393e+02f, -1.783050e+02f, + -1.223199e+02f, 5.907635e+01f, 1.517042e+02f, 2.137634e+01f, -1.690055e+02f, 1.189808e+02f, -1.160893e+02f, 9.647679e+00f, + 6.089332e+01f, -1.560215e+02f, -6.346030e+01f, 1.749298e+02f, -1.752888e+02f, -1.059519e+02f, -5.019283e+01f, 1.313583e+02f, + -1.362968e+02f, 9.356446e+01f, -9.708401e+01f, -1.691583e+02f, -4.413238e+01f, 8.147954e+01f +}; + +const float t_design_11_elevation[70] = +{ + 7.692547e+00f, -2.373007e+01f, 2.351276e+01f, 7.042259e+01f, -9.896944e+00f, -7.075133e+01f, -2.646185e+01f, 4.777649e+01f, + -7.720470e+00f, 4.453436e+01f, 2.638979e+01f, -4.465789e+01f, 9.767035e+00f, -4.770533e+01f, 7.453029e+00f, -2.359012e+01f, + 2.371945e+01f, 7.043827e+01f, -9.835416e+00f, -7.049808e+01f, -2.629492e+01f, 4.761480e+01f, -7.517185e+00f, 4.428623e+01f, + 2.664426e+01f, -4.456937e+01f, 9.912719e+00f, -4.795996e+01f, 7.296799e+00f, -2.334460e+01f, 2.364153e+01f, 7.068431e+01f, + -9.581404e+00f, -7.039345e+01f, -2.642582e+01f, 4.775107e+01f, -7.308536e+00f, 4.426328e+01f, 2.671406e+01f, -4.431497e+01f, + 9.758997e+00f, -4.803619e+01f, 7.439651e+00f, -2.333261e+01f, 2.338690e+01f, 7.082191e+01f, -9.485964e+00f, -7.058019e+01f, + -2.667403e+01f, 4.799784e+01f, -7.382762e+00f, 4.449706e+01f, 2.650250e+01f, -4.424619e+01f, 9.518451e+00f, -4.782814e+01f, + 7.684274e+00f, -2.357068e+01f, 2.330745e+01f, 7.065865e+01f, -9.680889e+00f, -7.080268e+01f, -2.669635e+01f, 4.801363e+01f, + -7.637348e+00f, 4.466512e+01f, 2.630235e+01f, -4.445764e+01f, 9.523415e+00f, -4.762422e+01f +}; + + +/*----------------------------------------------------------------------* +* Reverberator ROM tables +*-----------------------------------------------------------------------*/ + +const float ivas_reverb_default_fc[IVAS_REVERB_DEFAULT_N_BANDS] = +{ + 20.0f, 25.0f, 31.5f, 40.0f, + 50.0f, 63.0f, 80.0f, 100.0f, + 125.0f, 160.0f, 200.0f, 250.0f, + 315.0f, 400.0f, 500.0f, 630.0f, + 800.0f, 1000.0f, 1250.0f, 1600.0f, + 2000.0f, 2500.0f, 3150.0f, 4000.0f, + 5000.0f, 6300.0f, 8000.0f, 10000.0f, + 12500.0f, 16000.0f, 20000.0f +}; + +const float ivas_reverb_default_RT60[IVAS_REVERB_DEFAULT_N_BANDS] = +{ + 1.3622f, 1.4486f, 1.3168f, 1.5787f, + 1.4766f, 1.3954f, 1.2889f, 1.3462f, + 1.0759f, 1.0401f, 1.097f, 1.085f, + 1.091f, 1.0404f, 1.0499f, 1.0699f, + 1.1028f, 1.1714f, 1.1027f, 1.0666f, + 1.055f, 1.0553f, 1.0521f, 1.0569f, + 1.0421f, 0.97822f, 0.80487f, 0.75944f, + 0.71945f, 0.61682f, 0.60031f +}; + +const float ivas_reverb_default_DSR[IVAS_REVERB_DEFAULT_N_BANDS] = +{ + 1.8811e-08f, 2.1428e-08f, 1.3972e-08f, 1.51e-08f, + 1.287e-08f, 1.8747e-08f, 2.413e-08f, 3.9927e-08f, + 8.9719e-08f, 1.902e-07f, 3.702e-07f, 6.1341e-07f, + 7.1432e-07f, 6.5331e-07f, 4.6094e-07f, 5.4683e-07f, + 7.0134e-07f, 6.856e-07f, 7.114e-07f, 6.9604e-07f, + 5.2939e-07f, 5.699e-07f, 6.1773e-07f, 5.7488e-07f, + 4.7748e-07f, 2.7213e-07f, 1.3681e-07f, 1.0941e-07f, + 6.2001e-08f, 2.8483e-08f, 2.6267e-08f +}; + +/*----------------------------------------------------------------------------------* + * Renderer SBA & MC enc/dec matrices + *----------------------------------------------------------------------------------*/ + +/* CICP1 - Mono */ +const float ls_azimuth_CICP1[1] = { 0.0f }; +const float ls_elevation_CICP1[1] = { 0.0f }; + + + +/*----------------------------------------------------------------------------------* + * LS Renderer ROM tables + *----------------------------------------------------------------------------------*/ + + /* All matrices are stored with dimensions nchan_in x nchan_out */ + /* Downmix matrices */ +const float ls_conversion_cicpX_mono[12][1] = +{ + {1.00000000f}, + {1.00000000f}, + {1.00000000f}, + {1.00000000f}, + {0.79999995f}, + {0.79999995f}, + {0.79999995f}, + {0.79999995f}, + {0.849999964f}, + {0.849999964f}, + {0.849999964f}, + {0.849999964f} +}; + +const float ls_conversion_cicpX_stereo[12][2] = +{ + {1.00000000f, 0.00000000f}, + {0.00000000f, 1.00000000f}, + {0.70710677f, 0.70710677f}, + {0.70710677f, 0.70710677f}, + {0.79999995f, 0.00000000f}, + {0.00000000f, 0.79999995f}, + {0.79999995f, 0.00000000f}, + {0.00000000f, 0.79999995f}, + {0.849999964f, 0.000000000f}, + {0.000000000f, 0.849999964f}, + {0.849999964f, 0.000000000f}, + {0.000000000f, 0.849999964f} +}; + +const LS_CONVERSION_MATRIX ls_conversion_cicp12_cicp6[] = +{ + /* First row indicates the number of non-zero elements and the number of matrix columns */ + {8, 6.0f}, + /* Index of non-zero element, value of non-zero element*/ + {0, 1.000000000f}, + {7, 1.000000000f}, + {14, 1.000000000f}, + {21, 1.000000000f}, + {28, 1.000000000f}, + {35, 1.000000000f}, + {40, 1.000000000f}, + {47, 1.000000000f} +}; + +const LS_CONVERSION_MATRIX ls_conversion_cicp14_cicp6[] = +{ + /* First row indicates the number of non-zero elements and the number of matrix columns */ + {8, 6.0f}, + /* Index of non-zero element, value of non-zero element*/ + {0, 1.000000000f}, + {7, 1.000000000f}, + {14, 1.000000000f}, + {21, 1.000000000f}, + {28, 1.000000000f}, + {35, 1.000000000f}, + {36, 0.849999964f}, + {43, 0.849999964f} +}; + +const LS_CONVERSION_MATRIX ls_conversion_cicp14_cicp12[] = +{ + /* First row indicates the number of non-zero elements and the number of matrix columns */ + {8, 8.0f}, + /* Index of non-zero element, value of non-zero element*/ + {0, 1.000000000f}, + {9, 1.000000000f}, + {18, 1.000000000f}, + {27, 1.000000000f}, + {36, 1.000000000f}, + {45, 1.000000000f}, + {48, 0.849999964f}, + {57, 0.849999964f} +}; + +const LS_CONVERSION_MATRIX ls_conversion_cicp16_cicp6[] = +{ + /* First row indicates the number of non-zero elements and the number of matrix columns */ + {10, 6.0f}, + /* Index of non-zero element, value of non-zero element*/ + {0, 1.000000000f}, + {7, 1.000000000f}, + {14, 1.000000000f}, + {21, 1.000000000f}, + {28, 1.000000000f}, + {35, 1.000000000f}, + {36, 0.849999964f}, + {43, 0.849999964f}, + {52, 0.849999964f}, + {59, 0.849999964f} +}; + +const LS_CONVERSION_MATRIX ls_conversion_cicp16_cicp12[] = +{ + /* First row indicates the number of non-zero elements and the number of matrix columns */ + {10, 8.0f}, + /* Index of non-zero element, value of non-zero element*/ + {0, 1.000000000f}, + {9, 1.000000000f}, + {18, 1.000000000f}, + {27, 1.000000000f}, + {36, 1.000000000f}, + {45, 1.000000000f}, + {48, 0.849999964f}, + {57, 0.849999964f}, + {68, 0.849999964f}, + {77, 0.849999964f} + +}; + +const LS_CONVERSION_MATRIX ls_conversion_cicp16_cicp14[] = +{ + /* First row indicates the number of non-zero elements and the number of matrix columns */ + {10, 8.0f}, + /* Index of non-zero element, value of non-zero element*/ + {0, 1.000000000f}, + {9, 1.000000000f}, + {18, 1.000000000f}, + {27, 1.000000000f}, + {36, 1.000000000f}, + {45, 1.000000000f}, + {54, 1.000000000f}, + {63, 1.000000000f}, + {68, 0.849999964f}, + {77, 0.849999964f}, +}; + +const LS_CONVERSION_MATRIX ls_conversion_cicp19_cicp6[] = +{ + /* First row indicates the number of non-zero elements and the number of matrix columns */ + {14, 6.0f}, + /* Index of non-zero element, value of non-zero element*/ + {0, 1.000000000f}, + {7, 1.000000000f}, + {14, 1.000000000f}, + {21, 1.000000000f}, + {28, 1.000000000f}, + {35, 1.000000000f}, + {36, 0.367322683f}, + {40, 0.930093586f}, + {43, 0.367322683f}, + {47, 0.930093586f}, + {48, 0.849999964f}, + {55, 0.849999964f}, + {64, 0.849999964f}, + {71, 0.849999964f} +}; + +const LS_CONVERSION_MATRIX ls_conversion_cicp19_cicp12[] = +{ + /* First row indicates the number of non-zero elements and the number of matrix columns */ + {14, 8.0f}, + /* Index of non-zero element, value of non-zero element*/ + {0, 1.000000000f}, + {9, 1.000000000f}, + {18, 1.000000000f}, + {27, 1.000000000f}, + {38, 1.000000000f}, + {47, 1.000000000f}, + {48, 0.367322683f}, + {52, 0.930093586f}, + {57, 0.367322683f}, + {61, 0.930093586f}, + {64, 0.849999964f}, + {73, 0.849999964f}, + {84, 0.849999964f}, + {93, 0.849999964f} +}; + +const LS_CONVERSION_MATRIX ls_conversion_cicp19_cicp14[] = +{ + /* First row indicates the number of non-zero elements and the number of matrix columns */ + {14, 8.0f}, + /* Index of non-zero element, value of non-zero element*/ + {0, 1.000000000f}, + {9, 1.000000000f}, + {18, 1.000000000f}, + {27, 1.000000000f}, + {36, 1.000000000f}, + {45, 1.000000000f}, + {48, 0.367322683f}, + {52, 0.930093586f}, + {57, 0.367322683f}, + {61, 0.930093586f}, + {70, 1.000000000f}, + {79, 1.000000000f}, + {84, 0.849999964f}, + {93, 0.849999964f} +}; + +const LS_CONVERSION_MATRIX ls_conversion_cicp19_cicp16[] = +{ + /* First row indicates the number of non-zero elements and the number of matrix columns */ + {14, 10.0f}, + /* Index of non-zero element, value of non-zero element*/ + {0, 1.000000000f}, + {11, 1.000000000f}, + {22, 1.000000000f}, + {33, 1.000000000f}, + {44, 1.000000000f}, + {55, 1.000000000f}, + {60, 0.367322683f}, + {64, 0.930093586f}, + {71, 0.367322683f}, + {75, 0.930093586f}, + {86, 1.000000000f}, + {97, 1.000000000f}, + {108, 1.000000000f}, + {119, 1.000000000f} +}; + +/* Upmix matrices */ +const LS_CONVERSION_MATRIX ls_conversion_cicp12_cicp14[] = +{ + /* First row indicates the number of non-zero elements and the number of matrix columns */ + {8, 8.0f}, + /* Index of non-zero element, value of non-zero element*/ + {0, 1.0f}, + {9, 1.0f}, + {18, 1.0f}, + {27, 1.0f}, + {36, 1.0f}, + {45, 1.0f}, + {52, 1.0f}, + {61, 1.0f} +}; + +const LS_CONVERSION_MATRIX ls_conversion_cicp12_cicp16[] = +{ + /* First row indicates the number of non-zero elements and the number of matrix columns */ + {8, 10.0f}, + /* Index of non-zero element, value of non-zero element*/ + {0, 1.0f}, + {11, 1.0f}, + {22, 1.0f}, + {33, 1.0f}, + {44, 1.0f}, + {55, 1.0f}, + {64, 1.0f}, + {75, 1.0f} +}; + +const LS_CONVERSION_MATRIX ls_conversion_cicp12_cicp19[] = +{ + /* First row indicates the number of non-zero elements and the number of matrix columns */ + {8, 12.0f}, + /* Index of non-zero element, value of non-zero element*/ + {0, 1.0f}, + {13, 1.0f}, + {26, 1.0f}, + {39, 1.0f}, + {54, 1.0f}, + {67, 1.0f}, + {76, 1.0f}, + {89, 1.0f} +}; + +const LS_CONVERSION_MATRIX ls_conversion_cicp14_cicp19[] = +{ + /* First row indicates the number of non-zero elements and the number of matrix columns */ + {8, 12.0f}, + /* Index of non-zero element, value of non-zero element*/ + {0, 1.0f}, + {13, 1.0f}, + {26, 1.0f}, + {39, 1.0f}, + {52, 1.0f}, + {65, 1.0f}, + {80, 1.0f}, + {93, 1.0f} +}; + +const LS_CONVERSION_MATRIX ls_conversion_cicp16_cicp19[] = +{ + /* First row indicates the number of non-zero elements and the number of matrix columns */ + {10, 12.0f}, + /* Index of non-zero element, value of non-zero element*/ + {0, 1.0f}, + {13, 1.0f}, + {26, 1.0f}, + {39, 1.0f}, + {52, 1.0f}, + {65, 1.0f}, + {80, 1.0f}, + {93, 1.0f}, + {106, 1.0f}, + {119, 1.0f} +}; + +/* + * Mapping table of input config : output config with corresponding matrix + * NULL indicates a 1:1 mapping of existing input channels to output channels ( used for upmix ) + */ + +const LS_CONVERSION_MAPPING ls_conversion_mapping[LS_SETUP_CONVERSION_NUM_MAPPINGS] = +{ + /* Dowmix mappings - NULL is a special case for MONO / STEREO downmix */ + {IVAS_AUDIO_CONFIG_5_1, IVAS_AUDIO_CONFIG_MONO, NULL}, + {IVAS_AUDIO_CONFIG_7_1, IVAS_AUDIO_CONFIG_MONO, NULL}, + {IVAS_AUDIO_CONFIG_5_1_2, IVAS_AUDIO_CONFIG_MONO, NULL}, + {IVAS_AUDIO_CONFIG_5_1_4, IVAS_AUDIO_CONFIG_MONO, NULL}, + {IVAS_AUDIO_CONFIG_7_1_4, IVAS_AUDIO_CONFIG_MONO, NULL}, + + {IVAS_AUDIO_CONFIG_5_1, IVAS_AUDIO_CONFIG_STEREO, NULL}, + {IVAS_AUDIO_CONFIG_7_1, IVAS_AUDIO_CONFIG_STEREO, NULL}, + {IVAS_AUDIO_CONFIG_5_1_2, IVAS_AUDIO_CONFIG_STEREO, NULL}, + {IVAS_AUDIO_CONFIG_5_1_4, IVAS_AUDIO_CONFIG_STEREO, NULL}, + {IVAS_AUDIO_CONFIG_7_1_4, IVAS_AUDIO_CONFIG_STEREO, NULL}, + + {IVAS_AUDIO_CONFIG_7_1, IVAS_AUDIO_CONFIG_5_1, ls_conversion_cicp12_cicp6}, + + {IVAS_AUDIO_CONFIG_5_1_2, IVAS_AUDIO_CONFIG_5_1, ls_conversion_cicp14_cicp6}, + {IVAS_AUDIO_CONFIG_5_1_2, IVAS_AUDIO_CONFIG_7_1, ls_conversion_cicp14_cicp12}, + + {IVAS_AUDIO_CONFIG_5_1_4, IVAS_AUDIO_CONFIG_5_1, ls_conversion_cicp16_cicp6}, + {IVAS_AUDIO_CONFIG_5_1_4, IVAS_AUDIO_CONFIG_7_1, ls_conversion_cicp16_cicp12}, + {IVAS_AUDIO_CONFIG_5_1_4, IVAS_AUDIO_CONFIG_5_1_2, ls_conversion_cicp16_cicp14}, + + {IVAS_AUDIO_CONFIG_7_1_4, IVAS_AUDIO_CONFIG_5_1, ls_conversion_cicp19_cicp6}, + {IVAS_AUDIO_CONFIG_7_1_4, IVAS_AUDIO_CONFIG_7_1, ls_conversion_cicp19_cicp12}, + {IVAS_AUDIO_CONFIG_7_1_4, IVAS_AUDIO_CONFIG_5_1_2, ls_conversion_cicp19_cicp14}, + {IVAS_AUDIO_CONFIG_7_1_4, IVAS_AUDIO_CONFIG_5_1_4, ls_conversion_cicp19_cicp16}, + + /* Upmix mappings - NULL implies a 1:1 upmix */ + {IVAS_AUDIO_CONFIG_STEREO, IVAS_AUDIO_CONFIG_5_1, NULL}, + {IVAS_AUDIO_CONFIG_STEREO, IVAS_AUDIO_CONFIG_7_1, NULL}, + {IVAS_AUDIO_CONFIG_STEREO, IVAS_AUDIO_CONFIG_5_1_2, NULL}, + {IVAS_AUDIO_CONFIG_STEREO, IVAS_AUDIO_CONFIG_5_1_4, NULL}, + {IVAS_AUDIO_CONFIG_STEREO, IVAS_AUDIO_CONFIG_7_1_4, NULL}, + + {IVAS_AUDIO_CONFIG_5_1, IVAS_AUDIO_CONFIG_7_1, NULL}, + {IVAS_AUDIO_CONFIG_5_1, IVAS_AUDIO_CONFIG_5_1_2, NULL}, + {IVAS_AUDIO_CONFIG_5_1, IVAS_AUDIO_CONFIG_5_1_4, NULL}, + {IVAS_AUDIO_CONFIG_5_1, IVAS_AUDIO_CONFIG_7_1_4, NULL}, + + {IVAS_AUDIO_CONFIG_7_1, IVAS_AUDIO_CONFIG_5_1_2, ls_conversion_cicp12_cicp14}, + {IVAS_AUDIO_CONFIG_7_1, IVAS_AUDIO_CONFIG_5_1_4, ls_conversion_cicp12_cicp16}, + {IVAS_AUDIO_CONFIG_7_1, IVAS_AUDIO_CONFIG_7_1_4, ls_conversion_cicp12_cicp19}, + + {IVAS_AUDIO_CONFIG_5_1_2, IVAS_AUDIO_CONFIG_5_1_4, NULL}, + {IVAS_AUDIO_CONFIG_5_1_2, IVAS_AUDIO_CONFIG_7_1_4, ls_conversion_cicp14_cicp19}, + + {IVAS_AUDIO_CONFIG_5_1_4, IVAS_AUDIO_CONFIG_7_1_4, ls_conversion_cicp16_cicp19}, +}; + +/* clang-format on */ diff --git a/lib_rend/ivas_rom_rend.h b/lib_rend/ivas_rom_rend.h new file mode 100644 index 0000000000000000000000000000000000000000..6e67315b8f9e946d9abf67954c5d451e7073b1b5 --- /dev/null +++ b/lib_rend/ivas_rom_rend.h @@ -0,0 +1,127 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#ifndef IVAS_ROM_REND_H +#define IVAS_ROM_REND_H + +#include "options.h" +#include +#include "ivas_cnst.h" +#include "ivas_stat_rend.h" + +/*----------------------------------------------------------------------------------* + * FASTCONV and PARAMETRIC binaural renderer ROM tables + *----------------------------------------------------------------------------------*/ + +extern const int16_t channelIndex_CICP6[5]; +extern const int16_t channelIndex_CICP12[7]; +extern const int16_t channelIndex_CICP14[7]; +extern const int16_t channelIndex_CICP16[9]; +extern const int16_t channelIndex_CICP19[11]; + +/* These are equalization values for spread and surround coherent sounds, approximating the spectrum + * for such sounds at anechoic multichannel listening. */ +extern const float surCohEne[MASA_NUM_DEFINED_SUR_SPR_COH_ENE_BINS]; +extern const float spreadCohEne05[MASA_NUM_DEFINED_SUR_SPR_COH_ENE_BINS]; +extern const float spreadCohEne1[MASA_NUM_DEFINED_SUR_SPR_COH_ENE_BINS]; + +/* Values for low-bit-rate equalization */ +extern const float lowBitRateBinauralEQ[LOW_BIT_RATE_BINAURAL_EQ_BINS]; + +/* Diffuse field binaural coherence directional adjustment values */ +extern const float diffuseFieldCoherenceDifferenceX[BINAURAL_COHERENCE_DIFFERENCE_BINS]; +extern const float diffuseFieldCoherenceDifferenceY[BINAURAL_COHERENCE_DIFFERENCE_BINS]; +extern const float diffuseFieldCoherenceDifferenceZ[BINAURAL_COHERENCE_DIFFERENCE_BINS]; + + +/*----------------------------------------------------------------------------------* + * TD ISM Object renderer + *----------------------------------------------------------------------------------*/ + +extern const int16_t HRTF_MODEL_N_CPTS_VAR[HRTF_MODEL_N_SECTIONS]; + +extern const float SincTable[321]; + +extern const float defaultHRIR_coherence_48kHz[LR_IAC_LENGTH_NR_FC]; +extern const float defaultHRIR_left_avg_power_48kHz[LR_IAC_LENGTH_NR_FC]; +extern const float defaultHRIR_right_avg_power_48kHz[LR_IAC_LENGTH_NR_FC]; + +extern const float defaultHRIR_coherence_32kHz[LR_IAC_LENGTH_NR_FC]; +extern const float defaultHRIR_left_avg_power_32kHz[LR_IAC_LENGTH_NR_FC]; +extern const float defaultHRIR_right_avg_power_32kHz[LR_IAC_LENGTH_NR_FC]; + +extern const float defaultHRIR_coherence_16kHz[LR_IAC_LENGTH_NR_FC]; +extern const float defaultHRIR_left_avg_power_16kHz[LR_IAC_LENGTH_NR_FC]; +extern const float defaultHRIR_right_avg_power_16kHz[LR_IAC_LENGTH_NR_FC]; + +/*----------------------------------------------------------------------------------* + * t-design and SN3D normalization table + *----------------------------------------------------------------------------------*/ + +/* SN3D norm */ +extern const float norm_sn3d_hoa3[16]; + +/* Order 11 t-design */ +extern const float t_design_11_azimuth[70]; +extern const float t_design_11_elevation[70]; + + +/*----------------------------------------------------------------------* + * Reverberator ROM tables + *-----------------------------------------------------------------------*/ + +extern const float ivas_reverb_default_fc[]; +extern const float ivas_reverb_default_RT60[]; +extern const float ivas_reverb_default_DSR[]; + +/*----------------------------------------------------------------------------------* + * Renderer SBA & MC enc/dec matrices + *----------------------------------------------------------------------------------*/ + +extern const float ls_azimuth_CICP1[1]; +extern const float ls_elevation_CICP1[1]; + + +/*----------------------------------------------------------------------------------* + * LS Configuration Converter ROM tables + *----------------------------------------------------------------------------------*/ + +/* Downmix matrices */ +extern const float ls_conversion_cicpX_mono[12][1]; +extern const float ls_conversion_cicpX_stereo[12][2]; + +/* Mapping table of input config : output config with corresponding matrix */ +extern const LS_CONVERSION_MAPPING ls_conversion_mapping[]; + + + +#endif /* IVAS_ROM_REND_H */ diff --git a/lib_rend/ivas_rotation.c b/lib_rend/ivas_rotation.c new file mode 100644 index 0000000000000000000000000000000000000000..9826da1fda7af54008ce1637fe0c17cb5b764e75 --- /dev/null +++ b/lib_rend/ivas_rotation.c @@ -0,0 +1,1549 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include "ivas_cnst.h" +#include +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "ivas_prot_rend.h" +#include "wmc_auto.h" + + +/*-----------------------------------------------------------------------* + * Local funtion declarations + *-----------------------------------------------------------------------*/ + +static ivas_error combine_external_and_head_orientations( + IVAS_QUATERNION *headRotQuaternions, + IVAS_VECTOR3 *listenerPos, + EXTERNAL_ORIENTATION_HANDLE hExtOrientationData, + COMBINED_ORIENTATION_HANDLE hCombinedOrientationData ); + +static void external_target_interpolation( + EXTERNAL_ORIENTATION_HANDLE hExtOrientationData, + COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, + const int16_t i ); + +static bool are_orientations_same( const IVAS_QUATERNION *orientation1, const IVAS_QUATERNION *orientation2 ); + + +/*-----------------------------------------------------------------------* + * ivas_headTrack_open() + * + * Allocate and initialize Head-Tracking handle + *-----------------------------------------------------------------------*/ + +ivas_error ivas_headTrack_open( + HEAD_TRACK_DATA_HANDLE *hHeadTrackData /* o : head track handle */ +) +{ + int16_t i; + ivas_error error; + + /* Allocate Head-Tracking handle */ + if ( ( *hHeadTrackData = (HEAD_TRACK_DATA_HANDLE) malloc( sizeof( HEAD_TRACK_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for head-tracking memory\n" ) ); + } + + /* Initialization */ + ( *hHeadTrackData )->lrSwitchInterpVal = 0.0f; + ( *hHeadTrackData )->lrSwitchedCurrent = 0; + ( *hHeadTrackData )->lrSwitchedNext = 0; + if ( ( ( *hHeadTrackData )->OrientationTracker = (ivas_orient_trk_state_t *) malloc( sizeof( ivas_orient_trk_state_t ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Orientation tracking" ); + } + + if ( ( error = ivas_orient_trk_Init( ( *hHeadTrackData )->OrientationTracker ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Initialise Rmat_prev to I, Rmat will be computed later */ + for ( i = 0; i < 3; i++ ) + { + set_zero( ( *hHeadTrackData )->Rmat_prev[i], 3 ); + ( *hHeadTrackData )->Rmat_prev[i][i] = 1.0f; + } + + + set_zero( ( *hHeadTrackData )->chEneIIR[0], MASA_FREQUENCY_BANDS ); + set_zero( ( *hHeadTrackData )->chEneIIR[1], MASA_FREQUENCY_BANDS ); + set_zero( ( *hHeadTrackData )->procChEneIIR[0], MASA_FREQUENCY_BANDS ); + set_zero( ( *hHeadTrackData )->procChEneIIR[1], MASA_FREQUENCY_BANDS ); + + return IVAS_ERR_OK; +} + + +/*-----------------------------------------------------------------------* + * ivas_headTrack_close() + * + * Deallocate Head-Tracking handle + *-----------------------------------------------------------------------*/ + +void ivas_headTrack_close( + HEAD_TRACK_DATA_HANDLE *hHeadTrackData /* i/o: head track handle */ +) +{ + if ( hHeadTrackData == NULL || *hHeadTrackData == NULL ) + { + return; + } + + if ( ( *hHeadTrackData )->OrientationTracker != NULL ) + { + free( ( *hHeadTrackData )->OrientationTracker ); + ( *hHeadTrackData )->OrientationTracker = NULL; + } + + free( ( *hHeadTrackData ) ); + *hHeadTrackData = NULL; + + return; +} + + +/*---------------------------------------------------------------------------------- + * QuatToRotMat() + * + * Quaternion handling: calculate rotation matrices in real-space and SHD + *---------------------------------------------------------------------------------*/ + +void QuatToRotMat( + const IVAS_QUATERNION quat, /* i : quaternion describing the rotation */ + float Rmat[3][3] /* o : real-space rotation matrix for this rotation */ +) +{ + Rmat[0][0] = quat.w * quat.w + quat.x * quat.x - quat.y * quat.y - quat.z * quat.z; + Rmat[0][1] = 2.0f * ( quat.x * quat.y - quat.w * quat.z ); + Rmat[0][2] = 2.0f * ( quat.x * quat.z + quat.w * quat.y ); + + Rmat[1][0] = 2.0f * ( quat.x * quat.y + quat.w * quat.z ); + Rmat[1][1] = quat.w * quat.w - quat.x * quat.x + quat.y * quat.y - quat.z * quat.z; + Rmat[1][2] = 2.0f * ( quat.y * quat.z - quat.w * quat.x ); + + Rmat[2][0] = 2.0f * ( quat.x * quat.z - quat.w * quat.y ); + Rmat[2][1] = 2.0f * ( quat.y * quat.z + quat.w * quat.x ); + Rmat[2][2] = quat.w * quat.w - quat.x * quat.x - quat.y * quat.y + quat.z * quat.z; + + return; +} + + +/*------------------------------------------------------------------------- + * Euler2Quat() + * + * Calculate corresponding Quaternion from Euler angles in radians + *------------------------------------------------------------------------*/ + +void Euler2Quat( + const float yaw, /* i : yaw (x) */ + const float pitch, /* i : pitch (y) */ + const float roll, /* i : roll (z) */ + IVAS_QUATERNION *quat /* o : quaternion describing the rotation */ +) +{ + float cr = cosf( roll * 0.5f ); + float sr = sinf( roll * 0.5f ); + float cp = cosf( pitch * 0.5f ); + float sp = sinf( pitch * 0.5f ); + float cy = cosf( yaw * 0.5f ); + float sy = sinf( yaw * 0.5f ); + quat->w = cr * cp * cy + sr * sp * sy; + quat->x = sr * cp * cy - cr * sp * sy; + quat->y = sr * cp * sy + cr * sp * cy; + quat->z = cr * cp * sy - sr * sp * cy; + + return; +} + + + + +/*------------------------------------------------------------------------- + * deg2rad() + * + * Converts degrees to normalized radians + *------------------------------------------------------------------------*/ + +float deg2rad( + float degrees ) +{ + while ( degrees >= 180.0f ) + { + degrees = degrees - 360.0f; + } + while ( degrees <= -180.0f ) + { + degrees = degrees + 360.0f; + } + + return PI_OVER_180 * degrees; +} + + +/*------------------------------------------------------------------------- + * rad2deg() + * + * Converts normalized radians to degrees + *------------------------------------------------------------------------*/ + +float rad2deg( + float radians ) +{ + while ( radians >= EVS_PI ) + { + radians = radians - EVS_PI; + } + while ( radians <= -EVS_PI ) + { + radians = radians + EVS_PI; + } + + return _180_OVER_PI * radians; +} + + +/*------------------------------------------------------------------------- + * rotateAziEle() + * + * Apply rotation to direction parameters azimuth and elevation + *------------------------------------------------------------------------*/ + +void rotateAziEle( + float azi_in, /* i : output elevation */ + float ele_in, /* i : input elevation */ + int16_t *azi, /* o : rotated azimuth */ + int16_t *ele, /* o : rotated elevation */ + float Rmat[3][3], /* i : real-space rotation matrix */ + const int16_t isPlanar /* i : is rotation planar and elevation meaningless? */ +) +{ + int16_t n; + float dv[3], dv_r[3]; + float w; + + /*Conversion spherical to cartesian coordinates*/ + w = cosf( ele_in * PI_OVER_180 ); + dv[0] = w * cosf( azi_in * PI_OVER_180 ); + dv[1] = w * sinf( azi_in * PI_OVER_180 ); + dv[2] = sinf( ele_in * PI_OVER_180 ); + + /*Rotation mtx multiplication*/ + for ( n = 0; n < 3; n++ ) + { + dv_r[n] = Rmat[n][0] * dv[0] + Rmat[n][1] * dv[1] + Rmat[n][2] * dv[2]; + } + + /*Conversion cartesian to spherical coordinates*/ + *azi = (int16_t) roundf( max( -180.0f, min( 180.0f, atan2f( dv_r[1], dv_r[0] ) * _180_OVER_PI ) ) ); + if ( isPlanar == 0 ) + { + *ele = (int16_t) roundf( max( -90.0f, min( 90.0f, atan2f( dv_r[2], sqrtf( dv_r[0] * dv_r[0] + dv_r[1] * dv_r[1] ) ) * _180_OVER_PI ) ) ); + } + else + { + *ele = 0; + } + + return; +} + + +/*------------------------------------------------------------------------- + * rotateFrame_shd() + * + * Apply rotation to signals in Spherical Harmonic Domain + *------------------------------------------------------------------------*/ + +void rotateFrame_shd( + COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i : head and external orientation combined handle */ + float *output[], /* i/o: unrotated HOA3 signal buffer in TD */ + const int16_t subframe_len, /* i : subframe length per channel */ + const IVAS_OUTPUT_SETUP hTransSetup, /* i : format for rotation */ + const int16_t subframe_idx /* i : subframe index */ +) +{ + int16_t i, l, n, m; + int16_t m1, m2; + int16_t shd_rot_max_order; + + float tmp; + float tmpRot[2 * HEADROT_ORDER + 1]; + float SHrotmat_prev[HEADROT_SHMAT_DIM][HEADROT_SHMAT_DIM]; + float SHrotmat[HEADROT_SHMAT_DIM][HEADROT_SHMAT_DIM]; + float cross_fade[L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES]; + + shd_rot_max_order = hTransSetup.ambisonics_order; + + tmp = 1.0f / ( subframe_len - 1 ); + for ( i = 0; i < subframe_len; i++ ) + { + cross_fade[i] = i * tmp; + } + + /* initialize rotation matrices with zeros */ + for ( i = 0; i < HEADROT_SHMAT_DIM; i++ ) + { + set_zero( SHrotmat_prev[i], HEADROT_SHMAT_DIM ); + set_zero( SHrotmat[i], HEADROT_SHMAT_DIM ); + } + + /* calculate ambisonics rotation matrices for the previous and current frames */ + SHrotmatgen( SHrotmat_prev, hCombinedOrientationData->Rmat_prev, shd_rot_max_order ); + + SHrotmatgen( SHrotmat, hCombinedOrientationData->Rmat[subframe_idx], shd_rot_max_order ); + + for ( i = 0; i < subframe_len; i++ ) + { + /*As the rotation matrix becomes block diagonal in a SH basis, we can + apply each angular-momentum block individually to save complexity. */ + + /* loop over l blocks */ + m1 = 1; + m2 = 4; + for ( l = 1; l <= shd_rot_max_order; l++ ) + { + /* compute mtx-vector product for this l */ + for ( n = m1; n < m2; n++ ) + { + tmpRot[n - m1] = 0.f; + + for ( m = m1; m < m2; m++ ) + { + /* crossfade with previous rotation gains */ + tmpRot[n - m1] += cross_fade[i] * SHrotmat[n][m] * output[m][subframe_idx * subframe_len + i] + ( 1 - cross_fade[i] ) * SHrotmat_prev[n][m] * output[m][subframe_idx * subframe_len + i]; + } + } + + /* write back the result */ + for ( n = m1; n < m2; n++ ) + { + output[n][subframe_idx * subframe_len + i] = tmpRot[n - m1]; + } + m1 = m2; + m2 += 2 * ( l + 1 ) + 1; + } + + /* unoptimized code for reference (full matrix multiplication) + for ( n = 0; n < nchan; n++ ) + { + tmpRot[n] = 0.f; + + for ( m = 0; m < nchan; m++ ) + { + tmpRot[n] += SHrotmat[n][m] * output[m][i]; + } + } + for ( n = 0; n < nchan; n++ ) + { + output[n][i] = tmpRot[n]; + } + */ + } + + /* move Rmat to Rmat_prev */ + for ( i = 0; i < 3; i++ ) + { + mvr2r( + hCombinedOrientationData->Rmat[subframe_idx][i], + hCombinedOrientationData->Rmat_prev[i], + 3 ); + } + + return; +} + + +/*------------------------------------------------------------------------- + * rotateFrame_sd() + * + * Apply rotation to signals in Spatial Domain + *------------------------------------------------------------------------*/ + +void rotateFrame_sd( + COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i : head and external orientation combined handle */ + float *output[], /* i/o: unrotated SD signal buffer in TD */ + const int16_t subframe_len, /* i : subframe length per channel */ + const IVAS_OUTPUT_SETUP hTransSetup, /* i : format for rotation */ + const EFAP_HANDLE hEFAPdata, /* i : EFAP structure */ + const int16_t subframe_idx /* i : subframe index */ +) +{ + int16_t i, j; + int16_t nchan, index_lfe; + int16_t ch_in, ch_in_woLFE, ch_out, ch_out_woLFE; + int16_t azimuth, elevation; + + float tmp; + float tmp_gains[MAX_CICP_CHANNELS - 1]; + float gains[MAX_CICP_CHANNELS][MAX_CICP_CHANNELS]; + float gains_prev[MAX_CICP_CHANNELS][MAX_CICP_CHANNELS]; + float output_tmp[MAX_CICP_CHANNELS][L_FRAME48k]; + float cross_fade[L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES]; + push_wmops( "rotateFrame_sd" ); + + nchan = hTransSetup.nchan_out_woLFE + hTransSetup.num_lfe; + index_lfe = hTransSetup.index_lfe[0]; + + tmp = 1.0f / ( subframe_len - 1 ); + for ( i = 0; i < subframe_len; i++ ) + { + cross_fade[i] = i * tmp; + } + + for ( ch_in = 0; ch_in < nchan; ch_in++ ) + { + /* zero output and gain buffers */ + set_zero( &output_tmp[ch_in][subframe_idx * subframe_len], subframe_len ); + set_zero( gains_prev[ch_in], nchan ); + set_zero( gains[ch_in], nchan ); + + /* set gains to passthrough by default */ + gains_prev[ch_in][ch_in] = 1.0f; + gains[ch_in][ch_in] = 1.0f; + + /* skip LFE */ + if ( ch_in == index_lfe ) + { + continue; + } + + /* input channel index without LFE */ + ch_in_woLFE = ( ch_in >= index_lfe ) ? ch_in - 1 : ch_in; + + /* gains for previous subframe rotation */ + rotateAziEle( hTransSetup.ls_azimuth[ch_in_woLFE], hTransSetup.ls_elevation[ch_in_woLFE], &azimuth, &elevation, hCombinedOrientationData->Rmat_prev, hTransSetup.is_planar_setup ); + + if ( hEFAPdata != NULL && ( hTransSetup.ls_azimuth[ch_in_woLFE] != azimuth || hTransSetup.ls_elevation[ch_in_woLFE] != elevation ) ) + { + efap_determine_gains( hEFAPdata, tmp_gains, azimuth, elevation, EFAP_MODE_EFAP ); + for ( ch_out = 0; ch_out < nchan; ch_out++ ) + { + /* skip LFE */ + if ( ch_out == index_lfe ) + { + continue; + } + + /* output channel index without LFE */ + ch_out_woLFE = ( ch_out >= index_lfe ) ? ch_out - 1 : ch_out; + + gains_prev[ch_in][ch_out] = tmp_gains[ch_out_woLFE]; + } + } + + /* gains for current subframe rotation */ + rotateAziEle( hTransSetup.ls_azimuth[ch_in_woLFE], hTransSetup.ls_elevation[ch_in_woLFE], &azimuth, &elevation, hCombinedOrientationData->Rmat[subframe_idx], hTransSetup.is_planar_setup ); + if ( hEFAPdata != NULL && ( hTransSetup.ls_azimuth[ch_in_woLFE] != azimuth || hTransSetup.ls_elevation[ch_in_woLFE] != elevation ) ) + { + efap_determine_gains( hEFAPdata, tmp_gains, azimuth, elevation, EFAP_MODE_EFAP ); + + for ( ch_out = 0; ch_out < nchan; ch_out++ ) + { + /* skip LFE */ + if ( ch_out == index_lfe ) + { + continue; + } + + /* output channel index without LFE */ + ch_out_woLFE = ( ch_out >= index_lfe ) ? ch_out - 1 : ch_out; + + gains[ch_in][ch_out] = tmp_gains[ch_out_woLFE]; + } + } + } + + /* apply panning gains by mtx multiplication */ + for ( ch_out = 0; ch_out < nchan; ch_out++ ) + { + for ( ch_in = 0; ch_in < nchan; ch_in++ ) + { + /* crossfade with previous rotation gains */ + for ( i = subframe_idx * subframe_len, j = 0; j < subframe_len; i++, j++ ) + { + output_tmp[ch_out][i] += ( cross_fade[j] ) * gains[ch_in][ch_out] * output[ch_in][i] + ( 1 - cross_fade[j] ) * gains_prev[ch_in][ch_out] * output[ch_in][i]; + } + } + } + + /* move Rmat to Rmat_prev */ + for ( i = 0; i < 3; i++ ) + { + mvr2r( + hCombinedOrientationData->Rmat[subframe_idx][i], + hCombinedOrientationData->Rmat_prev[i], + 3 ); + } + + /* copy to output */ + for ( ch_out = 0; ch_out < nchan; ch_out++ ) + { + mvr2r( &output_tmp[ch_out][subframe_idx * subframe_len], &output[ch_out][subframe_idx * subframe_len], subframe_len ); + } + + pop_wmops(); + return; +} + + +/*------------------------------------------------------------------------- + * rotateFrame_shd_cldfb() + * + * Apply rotation to signals in Spherical Harmonic Domain and in CLDFB + *------------------------------------------------------------------------*/ + +void rotateFrame_shd_cldfb( + float Cldfb_RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o: unrotated HOA3 signal buffer in cldfb domain real part */ + float Cldfb_ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o: unrotated HOA3 signal buffer in cldfb domain imag part */ + float Rmat[3][3], /* i : real-space rotation matrix */ + const int16_t nInChannels, /* i : number of channels */ + const int16_t numTimeSlots, /* i : number of time slots to process */ + const int16_t shd_rot_max_order /* i : split-order rotation method */ +) +{ + int16_t n = 0; + int16_t m = 0; + int16_t i = 0; + int16_t iBand = 0; + int16_t l = 0, m1 = 0, m2 = 0; + float realRot[2 * HEADROT_ORDER + 1], imagRot[2 * HEADROT_ORDER + 1]; + float SHrotmat[HEADROT_SHMAT_DIM][HEADROT_SHMAT_DIM]; + + assert( nInChannels == HEADROT_SHMAT_DIM && "Number of channels must be 16!" ); + + /* initialize rotation matrices with zeros */ + for ( i = 0; i < HEADROT_SHMAT_DIM; i++ ) + { + set_zero( SHrotmat[i], HEADROT_SHMAT_DIM ); + } + + /* calculate Ambisonics rotation matrix from the quaternion */ + SHrotmatgen( SHrotmat, Rmat, shd_rot_max_order ); + + /* rotation by mtx multiplication */ + for ( i = 0; i < numTimeSlots; i++ ) + { + for ( iBand = 0; iBand < CLDFB_NO_CHANNELS_MAX; iBand++ ) + { + /*As the rotation matrix becomes block diagonal in a SH basis, we can + apply each angular-momentum block individually to save complexity. */ + + /* loop over l blocks */ + m1 = 1; + m2 = 4; + for ( l = 1; l <= shd_rot_max_order; l++ ) + { + /* compute mtx-vector product for this l */ + for ( n = m1; n < m2; n++ ) + { + realRot[n - m1] = 0.f; + imagRot[n - m1] = 0.f; + + for ( m = m1; m < m2; m++ ) + { + realRot[n - m1] += SHrotmat[n][m] * Cldfb_RealBuffer[m][i][iBand]; + imagRot[n - m1] += SHrotmat[n][m] * Cldfb_ImagBuffer[m][i][iBand]; + } + } + /* write back the result */ + for ( n = m1; n < m2; n++ ) + { + Cldfb_RealBuffer[n][i][iBand] = realRot[n - m1]; + Cldfb_ImagBuffer[n][i][iBand] = imagRot[n - m1]; + } + m1 = m2; + m2 += 2 * ( l + 1 ) + 1; + } + + /* unoptimized code for reference (full matrix multiplication) + for (n = 0; n < nInChannels; n++) + { + realRot[n] = 0.f; + imagRot[n] = 0.f; + + for (m = 0; m < nInChannels; m++) + { + realRot[n] += SHrotmat[n][m] * Cldfb_RealBuffer[m][i][iBand]; + imagRot[n] += SHrotmat[n][m] * Cldfb_ImagBuffer[m][i][iBand]; + } + } + for (n = 0; n < nInChannels; n++) + { + Cldfb_RealBuffer[n][i][iBand] = realRot[n]; + Cldfb_ImagBuffer[n][i][iBand] = imagRot[n]; + } + */ + } + } + + return; +} + + +/*------------------------------------------------------------------------- + * rotateFrame_sd_cldfb() + * + * Apply rotation to signals in Spatial Domain and in CLDFB + *------------------------------------------------------------------------*/ + +void rotateFrame_sd_cldfb( + float Rmat[3][3], /* i : real-space rotation matrix */ + float Cldfb_RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o: unrotated HOA3 signal buffer in cldfb domain real part */ + float Cldfb_ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o: unrotated HOA3 signal buffer in cldfb domain imag part */ + const IVAS_OUTPUT_SETUP_HANDLE hOutputSetup, /* i : output format setup number of channels */ + const EFAP_HANDLE hEFAPdata, /* i : EFAP structure */ + const int16_t numTimeSlots, /* i : number of time slots to process */ + const int16_t nb_band /* i : number of CLDFB bands to process */ +) +{ + int16_t iBlock, iBand, m, n; + float gains[MAX_CICP_CHANNELS - 1][MAX_CICP_CHANNELS - 1]; + int16_t azimuth, elevation; + float g1; + float realRot[MAX_CICP_CHANNELS - 1][MAX_PARAM_SPATIAL_SUBFRAMES * CLDFB_NO_CHANNELS_MAX]; + float imagRot[MAX_CICP_CHANNELS - 1][MAX_PARAM_SPATIAL_SUBFRAMES * CLDFB_NO_CHANNELS_MAX]; + float *p_realRot, *p_imagRot; + float *p_real, *p_imag; + int16_t nInChannels; + int16_t isPlanar; + push_wmops( "rotateFrame_sd_cldfb" ); + + nInChannels = hOutputSetup->nchan_out_woLFE; + isPlanar = 1; + for ( n = 0; n < nInChannels; n++ ) + { + if ( hOutputSetup->ls_elevation[n] != 0 ) + { + isPlanar = 0; + break; + } + } + + /* rotation of Euler angles */ + for ( n = 0; n < nInChannels; n++ ) + { + rotateAziEle( hOutputSetup->ls_azimuth[n], hOutputSetup->ls_elevation[n], &azimuth, &elevation, Rmat, isPlanar ); + if ( hEFAPdata != NULL && ( hOutputSetup->ls_azimuth[n] != azimuth || hOutputSetup->ls_elevation[n] != elevation ) ) + { + efap_determine_gains( hEFAPdata, gains[n], azimuth, elevation, EFAP_MODE_EFAP ); + } + else + { + set_zero( gains[n], nInChannels ); + gains[n][n] = 1.0f; + } + } + + /* Apply panning gains by mtx multiplication*/ + for ( n = 0; n < nInChannels; n++ ) + { + set_zero( realRot[n], MAX_PARAM_SPATIAL_SUBFRAMES * nb_band ); + set_zero( imagRot[n], MAX_PARAM_SPATIAL_SUBFRAMES * nb_band ); + for ( m = 0; m < nInChannels; m++ ) + { + g1 = gains[m][n]; + p_realRot = realRot[n]; + p_imagRot = imagRot[n]; + if ( g1 > 0.f ) + { + for ( iBlock = 0; iBlock < numTimeSlots; iBlock++ ) + { + p_real = Cldfb_RealBuffer[m][iBlock]; + p_imag = Cldfb_ImagBuffer[m][iBlock]; + for ( iBand = 0; iBand < nb_band; iBand++ ) + { + *( p_realRot ) = *p_realRot + g1 * *( p_real++ ); + *( p_imagRot ) = *p_imagRot + g1 * *( p_imag++ ); + p_realRot++; + p_imagRot++; + } + } + } + } + } + + for ( n = 0; n < nInChannels; n++ ) + { + p_realRot = realRot[n]; + p_imagRot = imagRot[n]; + for ( iBlock = 0; iBlock < numTimeSlots; iBlock++ ) + { + p_real = Cldfb_RealBuffer[n][iBlock]; + p_imag = Cldfb_ImagBuffer[n][iBlock]; + for ( iBand = 0; iBand < nb_band; iBand++ ) + { + *( p_real++ ) = *( p_realRot++ ); + *( p_imag++ ) = *( p_imagRot++ ); + } + for ( ; iBand < CLDFB_NO_CHANNELS_MAX; iBand++ ) + { + *( p_real++ ) = 0.f; + *( p_imag++ ) = 0.f; + } + } + } + pop_wmops(); + + return; +} + + +/*-----------------------------------------------------------------------* + * ivas_external_orientation_open() + * + * Allocate and initialize external orientation handle + *-----------------------------------------------------------------------*/ + +ivas_error ivas_external_orientation_open( + EXTERNAL_ORIENTATION_HANDLE *hExtOrientationData, /* o : external orientation handle */ + const int16_t num_subframes /* i : number of subframes */ +) +{ + + int16_t i; + IVAS_QUATERNION identity; + + identity.w = 1.0f; + identity.x = identity.y = identity.z = 0.0f; + + /* Allocate handle */ + if ( ( *hExtOrientationData = (EXTERNAL_ORIENTATION_HANDLE) malloc( sizeof( EXTERNAL_ORIENTATION_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for external orientation memory\n" ) ); + } + ( *hExtOrientationData )->num_subframes = num_subframes; + /* Enable head rotation and disable external orientation as default */ + for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + { + ( *hExtOrientationData )->enableHeadRotation[i] = 1; + ( *hExtOrientationData )->enableExternalOrientation[i] = 0; + ( *hExtOrientationData )->enableRotationInterpolation[i] = 0; + ( *hExtOrientationData )->numFramesToTargetOrientation[i] = 0; + ( *hExtOrientationData )->Quaternions[i] = identity; + } + return IVAS_ERR_OK; +} + + +/*-----------------------------------------------------------------------* + * ivas_external_orientation_close() + * + * Deallocate external orientation handle + *-----------------------------------------------------------------------*/ + +void ivas_external_orientation_close( + EXTERNAL_ORIENTATION_HANDLE *hExtOrientationData /* i/o: external orientation handle */ +) +{ + if ( hExtOrientationData == NULL || *hExtOrientationData == NULL ) + { + return; + } + + free( ( *hExtOrientationData ) ); + *hExtOrientationData = NULL; + + return; +} + + +/*-----------------------------------------------------------------------* + * ivas_combined_orientation_open() + * + * Allocate and initialize combined orientation handle + *-----------------------------------------------------------------------*/ + +ivas_error ivas_combined_orientation_open( + COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData, /* o : combined orientation handle */ + const int16_t num_subframes /* i : number of subframes */ +) +{ + int16_t i; + int16_t j; + IVAS_QUATERNION identity; + IVAS_VECTOR3 origo; + + identity.w = 1.0f; + identity.x = identity.y = identity.z = 0.0f; + origo.x = origo.y = origo.z = 0.0f; + + /* Allocate handle */ + if ( ( *hCombinedOrientationData = (COMBINED_ORIENTATION_HANDLE) malloc( sizeof( COMBINED_ORIENTATION_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for combined orientation memory\n" ) ); + } + + /* Initialization */ + ( *hCombinedOrientationData )->num_subframes = num_subframes; + ( *hCombinedOrientationData )->interpolationCoefficient = 1.0f; + ( *hCombinedOrientationData )->interpolationIncrement = 1.0f; + if ( num_subframes == 1 ) + { + ( *hCombinedOrientationData )->maximumFramesToTargetOrientation = 2000; + } + else + { + ( *hCombinedOrientationData )->maximumFramesToTargetOrientation = 500; + } + ( *hCombinedOrientationData )->lrSwitchedNext = 0; + ( *hCombinedOrientationData )->lrSwitchedCurrent = 0; + ( *hCombinedOrientationData )->lrSwitchInterpVal = 0.0f; + ( *hCombinedOrientationData )->isInterpolationOngoing = FALSE; + ( *hCombinedOrientationData )->Quaternions_ext_interpolation_start = identity; + ( *hCombinedOrientationData )->Quaternions_ext_interpolation_target = identity; + + /* Initialise orientations to identity */ + for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + { + ( *hCombinedOrientationData )->enableCombinedOrientation[i] = 0; + ( *hCombinedOrientationData )->Quaternions[i] = identity; + ( *hCombinedOrientationData )->listenerPos[i] = origo; + + for ( j = 0; j < 3; j++ ) + { + set_zero( ( *hCombinedOrientationData )->Rmat[i][j], 3 ); + ( *hCombinedOrientationData )->Rmat[i][j][j] = 1.0f; + } + } + + for ( j = 0; j < 3; j++ ) + { + set_zero( ( *hCombinedOrientationData )->Rmat_prev[j], 3 ); + ( *hCombinedOrientationData )->Rmat_prev[j][j] = 1.0f; + } + + ( *hCombinedOrientationData )->Quaternion_prev_extOrientation = identity; + ( *hCombinedOrientationData )->Quaternion_frozen_ext = identity; + ( *hCombinedOrientationData )->Quaternion_frozen_head = identity; + + + set_zero( ( *hCombinedOrientationData )->chEneIIR[0], MASA_FREQUENCY_BANDS ); + set_zero( ( *hCombinedOrientationData )->chEneIIR[1], MASA_FREQUENCY_BANDS ); + set_zero( ( *hCombinedOrientationData )->procChEneIIR[0], MASA_FREQUENCY_BANDS ); + set_zero( ( *hCombinedOrientationData )->procChEneIIR[1], MASA_FREQUENCY_BANDS ); + + ( *hCombinedOrientationData )->isExtOrientationFrozen = 0; + ( *hCombinedOrientationData )->isHeadRotationFrozen = 0; + + return IVAS_ERR_OK; +} + + +/*-----------------------------------------------------------------------* + * ivas_combined_orientation_close() + * + * Deallocate combined orientation handle + *-----------------------------------------------------------------------*/ + +void ivas_combined_orientation_close( + COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData /* i/o: combined orientation handle */ +) +{ + if ( hCombinedOrientationData == NULL || *hCombinedOrientationData == NULL ) + { + return; + } + + free( ( *hCombinedOrientationData ) ); + *hCombinedOrientationData = NULL; + + return; +} + + +/*------------------------------------------------------------------------- + * combine_external_and_head_orientations_dec() + * + * + *------------------------------------------------------------------------*/ + +ivas_error combine_external_and_head_orientations_dec( + HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i : head track handle */ + EXTERNAL_ORIENTATION_HANDLE hExtOrientationData, /* i : external orientation handle */ + COMBINED_ORIENTATION_HANDLE hCombinedOrientationData /* i/o: combined orientation handle */ +) +{ + IVAS_QUATERNION *pHeadRotQuaternion = NULL; + IVAS_VECTOR3 *listenerPos = NULL; + + if ( hHeadTrackData != NULL ) + { + pHeadRotQuaternion = hHeadTrackData->Quaternions; + listenerPos = hHeadTrackData->Pos; + } + + return combine_external_and_head_orientations( pHeadRotQuaternion, listenerPos, + hExtOrientationData, hCombinedOrientationData ); +} + + +/*------------------------------------------------------------------------- + * combine_external_and_head_orientations_rend() + * + * + *------------------------------------------------------------------------*/ + +ivas_error combine_external_and_head_orientations_rend( + IVAS_REND_HeadRotData *hHeadTrackData, /* i : head track handle */ + EXTERNAL_ORIENTATION_HANDLE hExtOrientationData, /* i : external orientation handle */ + COMBINED_ORIENTATION_HANDLE hCombinedOrientationData /* i/o: combined orientation handle */ +) +{ + IVAS_QUATERNION *headRotQuaternions = NULL; + IVAS_VECTOR3 *listenerPos = NULL; + int16_t i; + + if ( hHeadTrackData != NULL ) + { + if ( hHeadTrackData->headRotEnabled ) + { + headRotQuaternions = hHeadTrackData->headPositions; + listenerPos = hHeadTrackData->Pos; + } + } + else if ( hExtOrientationData != NULL ) + { + /* Head rotation data not available, use the freezed value or disable */ + for ( i = 0; i < hExtOrientationData->num_subframes; i++ ) + { + if ( hExtOrientationData->enableHeadRotation[i] != 2 ) + { + hExtOrientationData->enableHeadRotation[i] = 0; + } + } + } + + return combine_external_and_head_orientations( headRotQuaternions, listenerPos, + hExtOrientationData, hCombinedOrientationData ); +} + + +/*------------------------------------------------------------------------- + * combine_external_and_head_orientations() + * + * Combine the external orientations and the head orientation. + * NOTE that the external orientations are inversed. + *------------------------------------------------------------------------*/ + +ivas_error combine_external_and_head_orientations( + IVAS_QUATERNION *headRotQuaternions, /* i : quaternions for head rotation */ + IVAS_VECTOR3 *listenerPos, /* i : listener position */ + EXTERNAL_ORIENTATION_HANDLE hExtOrientationData, /* i : external orientation handle */ + COMBINED_ORIENTATION_HANDLE hCombinedOrientationData /* i/o: combined orientation handle */ +) +{ + int16_t i; + int16_t j; + IVAS_QUATERNION identity; + IVAS_VECTOR3 origo; + + identity.w = 1.0f; + identity.x = identity.y = identity.z = 0.0f; + origo.x = origo.y = origo.z = 0.0f; + + /* Form combined orientations or return if no data available */ + if ( hCombinedOrientationData == NULL ) + { + if ( headRotQuaternions != NULL || hExtOrientationData != NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + else + { + return IVAS_ERR_OK; + } + } + else if ( headRotQuaternions == NULL && hExtOrientationData == NULL ) + { + /* Reset the combined orientations and rotations */ + hCombinedOrientationData->isInterpolationOngoing = FALSE; + hCombinedOrientationData->interpolationCoefficient = 1.0f; + hCombinedOrientationData->interpolationIncrement = 1.0f; + hCombinedOrientationData->Quaternions_ext_interpolation_start = identity; + hCombinedOrientationData->Quaternions_ext_interpolation_target = identity; + for ( i = 0; i < hCombinedOrientationData->num_subframes; i++ ) + { + hCombinedOrientationData->enableCombinedOrientation[i] = 0; + hCombinedOrientationData->Quaternions[i] = identity; + hCombinedOrientationData->listenerPos[i] = origo; + + for ( j = 0; j < 3; j++ ) + { + set_zero( hCombinedOrientationData->Rmat[i][j], 3 ); + hCombinedOrientationData->Rmat[i][j][j] = 1.0f; + } + } + } + else if ( hExtOrientationData == NULL && headRotQuaternions != NULL ) + { + /* Head rotation only */ + for ( i = 0; i < hCombinedOrientationData->num_subframes; i++ ) + { + hCombinedOrientationData->Quaternions[i] = headRotQuaternions[i]; + } + } + + if ( hExtOrientationData != NULL ) + { + /* External orientations */ + for ( i = 0; i < hCombinedOrientationData->num_subframes; i++ ) + { + /* Check for frozen external orientation */ + if ( hExtOrientationData->enableExternalOrientation[i] == 2 ) + { + if ( hCombinedOrientationData->isExtOrientationFrozen != 1 ) + { + hCombinedOrientationData->Quaternion_frozen_ext = hExtOrientationData->Quaternions[i]; + hCombinedOrientationData->isExtOrientationFrozen = 1; + } + } + else + { + hCombinedOrientationData->Quaternion_frozen_ext = identity; + hCombinedOrientationData->isExtOrientationFrozen = 0; + } + + if ( hExtOrientationData->enableRotationInterpolation[i] == 1 && hExtOrientationData->enableExternalOrientation[i] > 0 ) + { + if ( hCombinedOrientationData->isInterpolationOngoing == true && hCombinedOrientationData->interpolationCoefficient <= 1.0f && are_orientations_same( &hCombinedOrientationData->Quaternions_ext_interpolation_target, &hExtOrientationData->Quaternions[i] ) == true ) + { + /* Continue interpolation */ + QuaternionSlerp( hCombinedOrientationData->Quaternions_ext_interpolation_start, hCombinedOrientationData->Quaternions_ext_interpolation_target, hCombinedOrientationData->interpolationCoefficient, &hCombinedOrientationData->Quaternions[i] ); + hCombinedOrientationData->interpolationCoefficient += hCombinedOrientationData->interpolationIncrement; + } + else + { + /* Stop interpolation or check for new interpolation */ + hCombinedOrientationData->isInterpolationOngoing = FALSE; + hCombinedOrientationData->interpolationCoefficient = 1.0f; + hCombinedOrientationData->interpolationIncrement = 1.0f; + external_target_interpolation( hExtOrientationData, hCombinedOrientationData, i ); + } + } + else + { + /* Interpolation disabled, use the current orientation values */ + + /* Use the most recent external orientation */ + if ( hExtOrientationData->enableExternalOrientation[i] == 1 ) + { + hCombinedOrientationData->Quaternions[i] = hExtOrientationData->Quaternions[i]; + } + /* Use the freezed external orientation */ + else if ( hExtOrientationData->enableExternalOrientation[i] == 2 ) + { + hCombinedOrientationData->Quaternions[i] = hCombinedOrientationData->Quaternion_frozen_ext; + } + } + } + } + + if ( hExtOrientationData != NULL && headRotQuaternions != NULL ) + { + /* Combine head and external orientations */ + for ( i = 0; i < hCombinedOrientationData->num_subframes; i++ ) + { + /* Check for frozen head rotation */ + if ( hExtOrientationData->enableHeadRotation[i] == 2 ) + { + if ( hCombinedOrientationData->isHeadRotationFrozen != 1 ) + { + hCombinedOrientationData->Quaternion_frozen_head = headRotQuaternions[i]; + hCombinedOrientationData->isHeadRotationFrozen = 1; + } + } + else + { + hCombinedOrientationData->Quaternion_frozen_head = identity; + hCombinedOrientationData->isHeadRotationFrozen = 0; + } + /* Use the most recent head rotation */ + if ( hExtOrientationData->enableHeadRotation[i] == 1 ) + { + if ( hExtOrientationData->enableExternalOrientation[i] > 0 ) + { + QuaternionProduct( hCombinedOrientationData->Quaternions[i], headRotQuaternions[i], &hCombinedOrientationData->Quaternions[i] ); + } + else + { + hCombinedOrientationData->Quaternions[i] = headRotQuaternions[i]; + } + } + /* Use the freezed head rotation */ + else if ( hExtOrientationData->enableHeadRotation[i] == 2 ) + { + if ( hExtOrientationData->enableExternalOrientation[i] > 0 ) + { + QuaternionProduct( hCombinedOrientationData->Quaternions[i], hCombinedOrientationData->Quaternion_frozen_head, &hCombinedOrientationData->Quaternions[i] ); + } + else + { + hCombinedOrientationData->Quaternions[i] = hCombinedOrientationData->Quaternion_frozen_head; + } + } + + /* Reset the combined orientations to identity */ + if ( hExtOrientationData->enableHeadRotation[i] == 0 && hExtOrientationData->enableExternalOrientation[i] == 0 ) + { + hCombinedOrientationData->Quaternions[i] = identity; + } + } + } + + if ( headRotQuaternions != NULL || hExtOrientationData != NULL ) + { + /* Calculate the combined rotation matrix */ + for ( i = 0; i < hCombinedOrientationData->num_subframes; i++ ) + { + QuatToRotMat( hCombinedOrientationData->Quaternions[i], hCombinedOrientationData->Rmat[i] ); + } + } + + /* Save the current orientations */ + if ( hExtOrientationData != NULL ) + { + if ( hExtOrientationData->enableExternalOrientation[hExtOrientationData->num_subframes - 1] > 0 ) + { + hCombinedOrientationData->Quaternion_prev_extOrientation = hExtOrientationData->Quaternions[hExtOrientationData->num_subframes - 1]; + } + else + { + hCombinedOrientationData->Quaternion_prev_extOrientation = identity; + } + } + if ( headRotQuaternions != NULL ) + { + for ( i = 0; i < hCombinedOrientationData->num_subframes; i++ ) + { + hCombinedOrientationData->listenerPos[i] = listenerPos[i]; + } + } + + /* Check if combined orientation is enabled */ + if ( headRotQuaternions != NULL && hExtOrientationData == NULL ) + { + for ( i = 0; i < hCombinedOrientationData->num_subframes; i++ ) + { + hCombinedOrientationData->enableCombinedOrientation[i] = 1; + } + } + else if ( headRotQuaternions == NULL && hExtOrientationData != NULL ) + { + for ( i = 0; i < hCombinedOrientationData->num_subframes; i++ ) + { + if ( hExtOrientationData->enableExternalOrientation[i] > 0 ) + { + hCombinedOrientationData->enableCombinedOrientation[i] = 1; + } + else + { + hCombinedOrientationData->enableCombinedOrientation[i] = 0; + } + } + } + else if ( headRotQuaternions != NULL && hExtOrientationData != NULL ) + { + for ( i = 0; i < hCombinedOrientationData->num_subframes; i++ ) + { + if ( hExtOrientationData->enableExternalOrientation[i] > 0 || ( hExtOrientationData->enableHeadRotation[i] > 0 ) ) + { + hCombinedOrientationData->enableCombinedOrientation[i] = 1; + } + else + { + hCombinedOrientationData->enableCombinedOrientation[i] = 0; + } + } + } + else + { + for ( i = 0; i < hCombinedOrientationData->num_subframes; i++ ) + { + hCombinedOrientationData->enableCombinedOrientation[i] = 0; + } + } + + + return IVAS_ERR_OK; +} + + +/*------------------------------------------------------------------------- + * external_target_interpolation() + * + * + *------------------------------------------------------------------------*/ + +static void external_target_interpolation( + EXTERNAL_ORIENTATION_HANDLE hExtOrientationData, /* i : external orientation handle */ + COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i/o: combined orientation handle */ + const int16_t i /* i : subframe index */ +) +{ + /* Sanity check for number of frames */ + hExtOrientationData->numFramesToTargetOrientation[i] = min( hExtOrientationData->numFramesToTargetOrientation[i], hCombinedOrientationData->maximumFramesToTargetOrientation ); + hExtOrientationData->numFramesToTargetOrientation[i] = max( hExtOrientationData->numFramesToTargetOrientation[i], 0 ); + + /* Interpolate from the current orientation to the target orientation */ + if ( hExtOrientationData->numFramesToTargetOrientation[i] > 0 ) + { + if ( are_orientations_same( &hCombinedOrientationData->Quaternions_ext_interpolation_target, &hExtOrientationData->Quaternions[i] ) == false ) + { + /* Target orientation is different from the previous target, update the values */ + + /* Set the received orientation as the target */ + hCombinedOrientationData->Quaternions_ext_interpolation_target = hExtOrientationData->Quaternions[i]; + + /* Use the most recent external orientation as the starting orientation */ + if ( hExtOrientationData->enableExternalOrientation[i] == 1 ) + { + if ( i > 0 ) + { + if ( hExtOrientationData->enableExternalOrientation[i - 1] == 0 ) + { + IVAS_QUATERNION identity; + identity.w = 1.0f; + identity.x = identity.y = identity.z = 0.0f; + hCombinedOrientationData->Quaternions_ext_interpolation_start = identity; + } + else if ( hExtOrientationData->enableExternalOrientation[i - 1] == 2 ) + { + hCombinedOrientationData->Quaternions_ext_interpolation_start = hCombinedOrientationData->Quaternion_frozen_ext; + } + else + { + hCombinedOrientationData->Quaternions_ext_interpolation_start = hExtOrientationData->Quaternions[i - 1]; + } + } + else + { + hCombinedOrientationData->Quaternions_ext_interpolation_start = hCombinedOrientationData->Quaternion_prev_extOrientation; + } + } + else if ( hExtOrientationData->enableExternalOrientation[i] == 2 ) + { + hCombinedOrientationData->Quaternions_ext_interpolation_start = hCombinedOrientationData->Quaternion_frozen_ext; + } + + /* Calculate the interpolation increment and coefficient */ + hCombinedOrientationData->interpolationIncrement = 1.0f / ( (float) hExtOrientationData->numFramesToTargetOrientation[i] * (float) MAX_PARAM_SPATIAL_SUBFRAMES ); + hCombinedOrientationData->interpolationCoefficient = hCombinedOrientationData->interpolationIncrement; + } + + /* Interpolate */ + hCombinedOrientationData->isInterpolationOngoing = TRUE; + QuaternionSlerp( hCombinedOrientationData->Quaternions_ext_interpolation_start, hCombinedOrientationData->Quaternions_ext_interpolation_target, hCombinedOrientationData->interpolationCoefficient, &hCombinedOrientationData->Quaternions[i] ); + hCombinedOrientationData->interpolationCoefficient += hCombinedOrientationData->interpolationIncrement; + } + else + { + /* Use the target orientation immediately */ + hCombinedOrientationData->isInterpolationOngoing = FALSE; + hCombinedOrientationData->interpolationCoefficient = 1.0f; + hCombinedOrientationData->interpolationIncrement = 1.0f; + hCombinedOrientationData->Quaternions[i] = hExtOrientationData->Quaternions[i]; + } + + return; +} + + +/*------------------------------------------------------------------------- + * are_orientations_same() + * + * + *------------------------------------------------------------------------*/ + +static bool are_orientations_same( + const IVAS_QUATERNION *orientation1, + const IVAS_QUATERNION *orientation2 ) +{ + bool orientationsAreSame = true; + float error_margin = 0.05f; + + if ( fabsf( orientation1->w - orientation2->w ) > error_margin || + fabsf( orientation1->x - orientation2->x ) > error_margin || + fabsf( orientation1->y - orientation2->y ) > error_margin || + fabsf( orientation1->z - orientation2->z ) > error_margin ) + { + orientationsAreSame = false; + } + + return orientationsAreSame; +} + + +/*-----------------------------------------------------------------------* + * Local Function definitions + *-----------------------------------------------------------------------*/ + +/*------------------------------------------------------------------------- + * Helper functions used by SHrotmatgen, + * an implementation of the algorithm in + * Ivanic, J. & Ruedenberg, K., J. Phys. Chem. 100, 6342 (1996) + *------------------------------------------------------------------------*/ + +static float SHrot_p( + const int16_t i, + const int16_t l, + const int16_t a, + const int16_t b, + float SHrotmat[HEADROT_SHMAT_DIM][HEADROT_SHMAT_DIM], + float R_lm1[HEADROT_SHMAT_DIM][HEADROT_SHMAT_DIM] ) +{ + float ri1 = 0.0f, rim1 = 0.0f, ri0 = 0.0f, p = 0.0f, R_lm1_1 = 0.0f, R_lm1_2 = 0.0f; + + ri1 = SHrotmat[i + 1 + 1][1 + 1 + 1]; + rim1 = SHrotmat[i + 1 + 1][-1 + 1 + 1]; + ri0 = SHrotmat[i + 1 + 1][0 + 1 + 1]; + + if ( b == -l ) + { + R_lm1_1 = R_lm1[a + l - 1][0]; + R_lm1_2 = R_lm1[a + l - 1][2 * l - 2]; + p = ri1 * R_lm1_1 + rim1 * R_lm1_2; + } + else + { + if ( b == l ) + { + R_lm1_1 = R_lm1[a + l - 1][2 * l - 2]; + R_lm1_2 = R_lm1[a + l - 1][0]; + p = ri1 * R_lm1_1 - rim1 * R_lm1_2; + } + else + { + R_lm1_1 = R_lm1[a + l - 1][b + l - 1]; + p = ri0 * R_lm1_1; + } + } + + return p; +} + +static float SHrot_u( + const int16_t l, + const int16_t m, + const int16_t n, + float SHrotmat[HEADROT_SHMAT_DIM][HEADROT_SHMAT_DIM], + float R_lm1[HEADROT_SHMAT_DIM][HEADROT_SHMAT_DIM] ) +{ + return SHrot_p( 0, l, m, n, SHrotmat, R_lm1 ); +} + +static float SHrot_v( + const int16_t l, + const int16_t m, + const int16_t n, + float SHrotmat[HEADROT_SHMAT_DIM][HEADROT_SHMAT_DIM], + float R_lm1[HEADROT_SHMAT_DIM][HEADROT_SHMAT_DIM] ) +{ + + float result, d, p0, p1; + + if ( m == 0 ) + { + p0 = SHrot_p( 1, l, 1, n, SHrotmat, R_lm1 ); + p1 = SHrot_p( -1, l, -1, n, SHrotmat, R_lm1 ); + result = p0 + p1; + } + else + { + if ( m > 0 ) + { + d = ( m == 1 ) ? 1.0f : 0.0f; + p0 = SHrot_p( 1, l, m - 1, n, SHrotmat, R_lm1 ); + p1 = SHrot_p( -1, l, -m + 1, n, SHrotmat, R_lm1 ); + result = p0 * sqrtf( 1.0f + d ) - p1 * ( 1.0f - d ); + } + else + { + d = ( m == -1 ) ? 1.0f : 0.0f; + p0 = SHrot_p( 1, l, m + 1, n, SHrotmat, R_lm1 ); + p1 = SHrot_p( -1, l, -m - 1, n, SHrotmat, R_lm1 ); + result = p0 * ( 1.0f - d ) + p1 * sqrtf( 1.0f + d ); + } + } + + return result; +} + +static float SHrot_w( + const int16_t l, + const int16_t m, + const int16_t n, + float SHrotmat[HEADROT_SHMAT_DIM][HEADROT_SHMAT_DIM], + float R_lm1[HEADROT_SHMAT_DIM][HEADROT_SHMAT_DIM] ) +{ + float result, p0, p1; + + if ( m == 0 ) + { + printf( "ERROR should not be called\n" ); + return 0.0f; + } + else + { + if ( m > 0 ) + { + p0 = SHrot_p( 1, l, m + 1, n, SHrotmat, R_lm1 ); + p1 = SHrot_p( -1, l, -m - 1, n, SHrotmat, R_lm1 ); + result = p0 + p1; + } + else + { + p0 = SHrot_p( 1, l, m - 1, n, SHrotmat, R_lm1 ); + p1 = SHrot_p( -1, l, -m + 1, n, SHrotmat, R_lm1 ); + result = p0 - p1; + } + } + + return result; +} + + +/*------------------------------------------------------------------------- + * rotateFrame_sd_cldfb() + * + * + *------------------------------------------------------------------------*/ + +void SHrotmatgen( + float SHrotmat[HEADROT_SHMAT_DIM][HEADROT_SHMAT_DIM], /* o : rotation matrix in SHD */ + float Rmat[3][3], /* i : real-space rotation matrix */ + const int16_t order /* i : ambisonics order */ +) +{ + int16_t d = 0; + int16_t band_idx = 0; + int16_t i, j; + int16_t l, m, n; + int16_t absm; + float sqdenom = 0.0f, sql2mm2 = 0.0f, sqdabsm = 0.0f, sqlabsm = 0.0f; + float u = 0.0f, v = 0.0f, w = 0.0f; + float R_lm1[HEADROT_SHMAT_DIM][HEADROT_SHMAT_DIM]; + float R_l[HEADROT_SHMAT_DIM][HEADROT_SHMAT_DIM]; + + SHrotmat[0][0] = 1.0f; + + SHrotmat[1][1] = Rmat[1][1]; + SHrotmat[1][2] = Rmat[1][2]; + SHrotmat[1][3] = Rmat[1][0]; + + SHrotmat[2][1] = Rmat[2][1]; + SHrotmat[2][2] = Rmat[2][2]; + SHrotmat[2][3] = Rmat[2][0]; + + SHrotmat[3][1] = Rmat[0][1]; + SHrotmat[3][2] = Rmat[0][2]; + SHrotmat[3][3] = Rmat[0][0]; + + for ( i = 0; i < 2 * 1 + 1; i++ ) + { + for ( j = 0; j < 2 * 1 + 1; j++ ) + { + R_lm1[i][j] = SHrotmat[i + 1][j + 1]; + } + } + + band_idx = 4; + for ( l = 2; l <= order; l++ ) + { + set_zero( &R_l[0][0], HEADROT_SHMAT_DIM2 ); + + for ( m = -l; m <= l; m++ ) + { + d = ( m == 0 ) ? 1 : 0; + absm = (int16_t) abs( m ); + sql2mm2 = sqrtf( (float) ( l * l - m * m ) ); + sqdabsm = sqrtf( (float) ( ( 1 + d ) * ( l + absm - 1 ) * ( l + absm ) ) ); + sqlabsm = sqrtf( (float) ( ( l - absm - 1 ) * ( l - absm ) ) ); + + for ( n = -l; n <= l; n++ ) + { + if ( abs( n ) == l ) + { + sqdenom = sqrtf( (float) ( ( 2 * l ) * ( 2 * l - 1 ) ) ); + } + else + { + sqdenom = sqrtf( (float) ( l * l - n * n ) ); + } + + u = sql2mm2 / sqdenom; + v = sqdabsm / sqdenom * ( 1 - 2 * d ) * 0.5f; + w = sqlabsm / sqdenom * ( 1 - d ) * ( -0.5f ); + + if ( u != 0 ) + { + u = u * SHrot_u( l, m, n, SHrotmat, R_lm1 ); + } + if ( v != 0 ) + { + v = v * SHrot_v( l, m, n, SHrotmat, R_lm1 ); + } + if ( w != 0 ) + { + w = w * SHrot_w( l, m, n, SHrotmat, R_lm1 ); + } + R_l[m + l][n + l] = u + v + w; + } + } + + for ( i = 0; i < 2 * l + 1; i++ ) + { + for ( j = 0; j < 2 * l + 1; j++ ) + { + SHrotmat[band_idx + i][band_idx + j] = R_l[i][j]; + } + } + + for ( i = 0; i < 2 * l + 1; i++ ) + { + for ( j = 0; j < 2 * l + 1; j++ ) + { + R_lm1[i][j] = R_l[i][j]; + } + } + + band_idx += 2 * l + 1; + } + + return; +} diff --git a/lib_rend/ivas_sba_rendering.c b/lib_rend/ivas_sba_rendering.c new file mode 100644 index 0000000000000000000000000000000000000000..55671330b935c3ecd51293f0a754dd9ea8f30327 --- /dev/null +++ b/lib_rend/ivas_sba_rendering.c @@ -0,0 +1,207 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_prot_rend.h" +#include "ivas_stat_dec.h" +#include "ivas_cnst.h" +#include +#include "wmc_auto.h" + + +/*-------------------------------------------------------------------* + * ivas_sba_prototype_renderer() + * + * Render prototype audio signals using SBA mixing matrices + *-------------------------------------------------------------------*/ + +void ivas_sba_prototype_renderer( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */ + float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, real */ + float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, imag */ + const int16_t subframe /* i : Subframe to render */ +) +{ + float mixer_mat[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS]; + SPAR_DEC_HANDLE hSpar; + DECODER_CONFIG_HANDLE hDecoderConfig; + int16_t num_spar_bands, spar_band; + int16_t b, ts; + int16_t num_cldfb_bands, numch_in, numch_out; + int16_t cldfb_band; + int16_t out_ch, in_ch; + int16_t firstInCh, inChEnd, firstOutCh, outChEnd; + int16_t slot_idx_start, md_idx; + int16_t num_md_sub_frames; + + num_md_sub_frames = ivas_get_spar_dec_md_num_subframes( st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->last_active_ivas_total_brate ); + + push_wmops( "ivas_sba_prototype_renderer" ); + + hSpar = st_ivas->hSpar; + hDecoderConfig = st_ivas->hDecoderConfig; + num_spar_bands = hSpar->hFbMixer->pFb->filterbank_num_bands; + + num_cldfb_bands = hSpar->hFbMixer->pFb->fb_bin_to_band.num_cldfb_bands; + numch_in = hSpar->hFbMixer->fb_cfg->num_in_chans; + numch_out = hSpar->hFbMixer->fb_cfg->num_out_chans; + slot_idx_start = hSpar->slots_rendered; + + if ( st_ivas->nchan_transport == 1 ) + { + firstInCh = 0; + inChEnd = 1; + firstOutCh = 0; + outChEnd = 1; + } + else /* 2 TC */ + { + firstInCh = 0; + inChEnd = 2; + firstOutCh = 1; + outChEnd = 2; + } + + /* Apply mixing matrix */ + for ( ts = 0; ts < hSpar->subframe_nbslots[hSpar->subframes_rendered]; ts++ ) + { + /* determine SPAR parameters for this time slot */ + md_idx = hSpar->render_to_md_map[ts + slot_idx_start]; + ivas_spar_get_parameters( hSpar, hDecoderConfig, md_idx, numch_out, numch_in, num_spar_bands, mixer_mat ); + + for ( cldfb_band = 0; cldfb_band < num_cldfb_bands; cldfb_band++ ) + { + float out_re[IVAS_SPAR_MAX_CH]; + float out_im[IVAS_SPAR_MAX_CH]; + float cldfb_par; + ivas_fb_bin_to_band_data_t *bin2band = &hSpar->hFbMixer->pFb->fb_bin_to_band; + + for ( out_ch = firstOutCh; out_ch < outChEnd; out_ch++ ) + { + out_re[out_ch] = 0.0f; + out_im[out_ch] = 0.0f; + + for ( in_ch = firstInCh; in_ch < inChEnd; in_ch++ ) + { + if ( cldfb_band < CLDFB_PAR_WEIGHT_START_BAND ) /* tuning parameter, depends on how much SPAR Filters overlap for the CLDFB bands */ + { + spar_band = bin2band->p_cldfb_map_to_spar_band[cldfb_band]; + cldfb_par = mixer_mat[out_ch][in_ch][spar_band]; + } + else + { + cldfb_par = 0.0f; + for ( spar_band = bin2band->p_spar_start_bands[cldfb_band]; spar_band < num_spar_bands; spar_band++ ) + { + /* accumulate contributions from all SPAR bands */ + cldfb_par += mixer_mat[out_ch][in_ch][spar_band] * bin2band->pp_cldfb_weights_per_spar_band[cldfb_band][spar_band]; + } + } + + out_re[out_ch] += inRe[in_ch][ts][cldfb_band] * cldfb_par; + out_im[out_ch] += inIm[in_ch][ts][cldfb_band] * cldfb_par; + } + } + + /*update CLDFB data with the parameter-modified data*/ + for ( out_ch = firstOutCh; out_ch < outChEnd; out_ch++ ) + { + inRe[out_ch][ts][cldfb_band] = out_re[out_ch]; + inIm[out_ch][ts][cldfb_band] = out_im[out_ch]; + } + } + + /* Update mixing matrices */ + if ( ( ( slot_idx_start + ts + 1 ) == hSpar->num_slots ) || ( ( md_idx / JBM_CLDFB_SLOTS_IN_SUBFRAME ) != ( hSpar->render_to_md_map[ts + slot_idx_start + 1] / JBM_CLDFB_SLOTS_IN_SUBFRAME ) ) ) + { + /* we have crossed an unadapted parameter sf border, update previous mixing matrices */ + int16_t md_sf = md_idx / JBM_CLDFB_SLOTS_IN_SUBFRAME; + md_sf = ( num_md_sub_frames == MAX_PARAM_SPATIAL_SUBFRAMES ) ? md_sf : 0; + hSpar->i_subframe++; + hSpar->i_subframe = min( hSpar->i_subframe, MAX_PARAM_SPATIAL_SUBFRAMES ); + mvr2r( hSpar->hMdDec->mixer_mat_prev[1][0][0], hSpar->hMdDec->mixer_mat_prev[0][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS ); + mvr2r( hSpar->hMdDec->mixer_mat_prev[2][0][0], hSpar->hMdDec->mixer_mat_prev[1][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS ); + mvr2r( hSpar->hMdDec->mixer_mat_prev[3][0][0], hSpar->hMdDec->mixer_mat_prev[2][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS ); + mvr2r( hSpar->hMdDec->mixer_mat_prev[4][0][0], hSpar->hMdDec->mixer_mat_prev[3][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS ); + + for ( out_ch = 0; out_ch < numch_out; out_ch++ ) + { + for ( in_ch = 0; in_ch < numch_in; in_ch++ ) + { + for ( b = 0; b < num_spar_bands; b++ ) + { + hSpar->hMdDec->mixer_mat_prev[4][out_ch][in_ch][b] = hSpar->hMdDec->mixer_mat[out_ch][in_ch][b + md_sf * IVAS_MAX_NUM_BANDS]; + } + } + } + } + } + + + /* Create prototypes */ + if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) + { + for ( ts = 0; ts < hSpar->subframe_nbslots[subframe]; ts++ ) + { + if ( st_ivas->nchan_transport == 1 ) /* Dual mono */ + { + mvr2r( inRe[0][ts], inRe[1][ts], CLDFB_NO_CHANNELS_MAX ); + mvr2r( inIm[0][ts], inIm[1][ts], CLDFB_NO_CHANNELS_MAX ); + } + else if ( st_ivas->nchan_transport == 2 ) /* Opposing cardioids */ + { + float temp_signal[CLDFB_NO_CHANNELS_MAX]; + + v_add( inRe[0][ts], inRe[1][ts], temp_signal, CLDFB_NO_CHANNELS_MAX ); + v_sub( inRe[0][ts], inRe[1][ts], inRe[1][ts], CLDFB_NO_CHANNELS_MAX ); + mvr2r( temp_signal, inRe[0][ts], CLDFB_NO_CHANNELS_MAX ); + v_multc( inRe[0][ts], 0.5f, inRe[0][ts], CLDFB_NO_CHANNELS_MAX ); + v_multc( inRe[1][ts], 0.5f, inRe[1][ts], CLDFB_NO_CHANNELS_MAX ); + + v_add( inIm[0][ts], inIm[1][ts], temp_signal, CLDFB_NO_CHANNELS_MAX ); + v_sub( inIm[0][ts], inIm[1][ts], inIm[1][ts], CLDFB_NO_CHANNELS_MAX ); + mvr2r( temp_signal, inIm[0][ts], CLDFB_NO_CHANNELS_MAX ); + v_multc( inIm[0][ts], 0.5f, inIm[0][ts], CLDFB_NO_CHANNELS_MAX ); + v_multc( inIm[1][ts], 0.5f, inIm[1][ts], CLDFB_NO_CHANNELS_MAX ); + } + } + } + + hSpar->subframes_rendered++; + hSpar->slots_rendered += hSpar->subframe_nbslots[subframe]; + pop_wmops(); + + return; +} diff --git a/lib_rend/ivas_shoebox.c b/lib_rend/ivas_shoebox.c new file mode 100644 index 0000000000000000000000000000000000000000..7c0f3c67d55004703bcf8da493b77971b84fd17b --- /dev/null +++ b/lib_rend/ivas_shoebox.c @@ -0,0 +1,478 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include "options.h" +#include +#include +#include "ivas_prot_rend.h" +#include "ivas_stat_rend.h" +#include "ivas_cnst.h" +#include "prot.h" +#include "wmc_auto.h" + +/*-----------------------------------------------------------------------------------------* + * Function ivas_shoebox_config_init + * + * Function transfer the parameters from the reverb config handle to the shoebox + * calibration data structure. + *-----------------------------------------------------------------------------------------*/ + +void ivas_shoebox_config_init( + shoebox_config_t *cal, + RENDER_CONFIG_HANDLE hRenderConfig /* i : Renderer configuration handle */ +) +{ + int16_t wall_idx; + + cal->room_L = hRenderConfig->roomAcoustics.dimensions.x; + cal->room_W = hRenderConfig->roomAcoustics.dimensions.y; + cal->room_H = hRenderConfig->roomAcoustics.dimensions.z; + + /* Absorption Coefficients */ + /* Convention: [Front wall, Back wall, Left wall, Right wall, Ceiling, Floor] */ + for ( wall_idx = 0; wall_idx < 6; wall_idx++ ) + { + cal->abs_coeff[wall_idx] = hRenderConfig->roomAcoustics.AbsCoeff[wall_idx]; + } + + /* Listener position (only X and Y can be pos. or neg. ) */ + cal->list_orig[0] = hRenderConfig->roomAcoustics.ListenerOrigin.x; + cal->list_orig[1] = hRenderConfig->roomAcoustics.ListenerOrigin.y; + cal->list_orig[2] = hRenderConfig->roomAcoustics.ListenerOrigin.z; + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_shoebox_init() + * + * Function initializes the shoebox operating parameters by setting limits and defaults, + * also contains the calibration structure. + *-----------------------------------------------------------------------------------------*/ + +void ivas_shoebox_init( + shoebox_obj_t *obj, + shoebox_config_t *cal ) +{ + uint16_t i; + + /* Add cal to obj struct */ + obj->cal = *cal; + /* Add defaults */ + obj->max_bands = 1; + obj->MAX_SOURCES = ER_MAX_SOURCES; + obj->REF_ORDER = ER_REF_ORDER; + + /* Positions */ + set_f( &obj->src_pos[0], 0.0f, 75U ); + set_f( &obj->src_dist[0], 0.0f, 25U ); + + for ( i = 0; i < 3; i++ ) + { + obj->list_pos[i] = cal->list_orig[i]; + } + + /* Pointer */ + obj->nSrc = 0; + + /* Flags */ + obj->isCartesian = 1; + obj->isRelative = 1; + obj->isZHeight = 1; + obj->isRadians = 1; + + /* Params */ + obj->radius = ER_RADIUS; + obj->min_wall_dist = ER_MIN_WALL_DIST; + obj->soundspeed = ER_SOUND_SPEED; + obj->air_coeff = ER_AIR_COEFF; + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function shoebox_bound() + * + * SHOEBOX_BOUND takes in CARTESIAN coordinates of either a receiver or + * source and checks if it is within the virtual room boundaries established + * by the surface parameters. If object is out of bounds, then new cartesian + * coordinates are established to collapse the object position. + *-----------------------------------------------------------------------------------------*/ + +static void shoebox_bound( + shoebox_obj_t *obj, + float *out_pos ) +{ + float out_tmp; + int32_t i; + + out_tmp = ( obj->cal.room_L / 2.0f ) - obj->min_wall_dist; + + if ( ( out_pos[0] > out_tmp ) || ( out_pos[0] < ( ( ( -obj->cal.room_L ) / 2.0f ) + obj->min_wall_dist ) ) ) + { + if ( out_pos[0] < 0.0f ) + { + i = -1; + } + else + { + i = ( out_pos[0] > 0.0f ) ? ( (int32_t) 1 ) : ( (int32_t) 0 ); + } + out_pos[0] = out_tmp * ( (float) i ); + } + + out_tmp = ( obj->cal.room_W / 2.0f ) - obj->min_wall_dist; + + if ( ( out_pos[1] > out_tmp ) || ( out_pos[1] < ( ( ( -obj->cal.room_W ) / 2.0f ) + obj->min_wall_dist ) ) ) + { + if ( out_pos[1] < 0.0f ) + { + i = -1; + } + else + { + i = ( out_pos[1] > 0.0f ) ? ( (int32_t) 1 ) : ( (int32_t) 0 ); + } + out_pos[1] = out_tmp * ( (float) i ); + } + + out_tmp = ( obj->cal.room_H / 2.0f ) - obj->min_wall_dist; + + if ( ( out_pos[2] > out_tmp ) || ( out_pos[2] < ( ( ( -obj->cal.room_H ) / 2.0f ) + obj->min_wall_dist ) ) ) + { + if ( out_pos[2] < 0.0f ) + { + i = -1; + } + else + { + i = ( out_pos[2] > 0.0f ) ? ( (int32_t) 1 ) : ( (int32_t) 0 ); + } + out_pos[2] = out_tmp * ( (float) i ); + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function shoebox_get_coord() + * + * Transform relative spherical coordinate to 3D cartesian point + *-----------------------------------------------------------------------------------------*/ + +static void shoebox_get_coord( + shoebox_obj_t *obj, + float *fcnOutput_data, + const float src_pos_data[], + float *tmp_pos, + float out_tmp, + int32_t coord, + int32_t loop_ub, + int32_t k, + uint16_t isRelative ) +{ + float tmp_data[75]; + float rcoselev; + int32_t tmp_size_idx_1; + int32_t n; + + tmp_size_idx_1 = 3; + if ( obj->isCartesian == 0 ) + { + /* Convert Spherical to Cartesian */ + if ( obj->isRadians == 0 ) + { + for ( n = 0; n < loop_ub; n++ ) + { + fcnOutput_data[n] = deg2rad( src_pos_data[k + n] ); + } + } + tmp_data[2] = fcnOutput_data[2] * sinf( fcnOutput_data[1] ); + rcoselev = fcnOutput_data[2] * cosf( fcnOutput_data[1] ); + tmp_data[0] = rcoselev * cosf( fcnOutput_data[0] ); + tmp_data[1] = rcoselev * sinf( fcnOutput_data[0] ); + } + else + { + /* CARTESIAN CASE */ + tmp_size_idx_1 = loop_ub; + for ( n = 0; n < loop_ub; n++ ) + { + tmp_data[n] = src_pos_data[k + n]; + } + if ( obj->isZHeight != 0.0f ) + { + /* FIX Z COORDINATE */ + tmp_data[2] = src_pos_data[k + 2] - ( obj->cal.room_H / 2.0f ); + } + } + + for ( k = 0; k < tmp_size_idx_1; k++ ) + { + obj->src_pos[( coord + k ) - 1] = tmp_data[k]; + } + + /* CENTER TO LISTENER */ + if ( ( out_tmp + 1.0f ) > ( ( out_tmp + 1.0f ) + 2.0f ) ) + { + k = 1; + } + else + { + k = (int32_t) ( (float) ( out_tmp + 1.0f ) ); + } + + tmp_pos[0] = obj->src_pos[k - 1]; + tmp_pos[1] = obj->src_pos[k]; + tmp_pos[2] = obj->src_pos[k + 1]; + + if ( isRelative != 0.0f ) + { + tmp_pos[0] += obj->list_pos[0]; + tmp_pos[1] += obj->list_pos[1]; + tmp_pos[2] += obj->list_pos[2]; + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function shoebox_get_euclidian_distance_internal() + * + * Get 3D source distance from receiver + *-----------------------------------------------------------------------------------------*/ + +static float shoebox_get_euclidian_distance_internal( + shoebox_obj_t *obj, + float *tmp_pos, + float *scale ) +{ + float absxk, out_tmp, t; + + absxk = fabsf( obj->list_pos[0] - tmp_pos[0] ); + + if ( absxk > ER_EUCLIDEAN_SCALE ) + { + out_tmp = 1.0f; + *scale = absxk; + } + else + { + t = absxk / ER_EUCLIDEAN_SCALE; + out_tmp = t * t; + } + + absxk = fabsf( obj->list_pos[1] - tmp_pos[1] ); + + if ( absxk > *scale ) + { + t = *scale / absxk; + out_tmp = ( ( out_tmp * t ) * t ) + 1.0f; + *scale = absxk; + } + else + { + t = absxk / *scale; + out_tmp += t * t; + } + + absxk = fabsf( obj->list_pos[2] - tmp_pos[2] ); + + if ( absxk > *scale ) + { + t = *scale / absxk; + out_tmp = ( ( out_tmp * t ) * t ) + 1.0f; + *scale = absxk; + } + else + { + t = absxk / *scale; + out_tmp += t * t; + } + + return out_tmp; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_shoebox_set_scene() + * + * Initial scene setup returning computed reflection (arrival times, DOA and gain). + *-----------------------------------------------------------------------------------------*/ + +void ivas_shoebox_set_scene( + shoebox_obj_t *obj, + shoebox_output_t *ER_PARAMS, + const float list_pos[3], + const float src_pos_data[], + const uint16_t isCartesian, + const uint16_t isRelative ) +{ + float tmp_pos[3]; + float out_tmp; + int32_t i, j, k, n; + int32_t loop_ub; + /* ------------- SET FLAGS ------------- */ + obj->isCartesian = isCartesian; + obj->isRelative = isRelative; + /* ------------- CHECK DIMENSIONS ------------- */ + if ( ER_PARAMS->n_sources > obj->MAX_SOURCES ) + { + obj->nSrc = obj->MAX_SOURCES; + } + else + { + obj->nSrc = ER_PARAMS->n_sources; + } + /* ---------- RESET DATA HOLDERS ---------- */ + set_f( &obj->src_pos[0], 0.0f, 75U ); + obj->list_pos[0] = list_pos[0]; + obj->list_pos[1] = list_pos[1]; + obj->list_pos[2] = list_pos[2]; + /* ---------- ADJUST LISTENER ------------- */ + if ( obj->isZHeight != 0 ) + { + obj->list_pos[2] = list_pos[2] - ( obj->cal.room_H / 2.0f ); + } + tmp_pos[1] = obj->list_pos[1]; + tmp_pos[2] = obj->list_pos[2]; + + shoebox_bound( obj, obj->list_pos ); + + /* ---------- SOURCE LOOP ------------- */ + i = (int32_t) obj->nSrc; + for ( j = 0; j < i; j++ ) + { + float fcnOutput_data[75]; + float rcoselev; + float scale; + int32_t coord; + /* idx = single(i); */ + out_tmp = 3.0f * ( ( ( (float) j ) + 1.0f ) - 1.0f ); + /* GET COORDINATE IN CARTESIAN ABSOLUTE FORMAT */ + if ( ( out_tmp + 1.0f ) > ( ( out_tmp + 1.0f ) + 2.0f ) ) + { + k = 0; + n = 0; + coord = 1; + } + else + { + k = ( (int32_t) ( (float) ( out_tmp + 1.0f ) ) ) - 1; + n = (int32_t) ( (float) ( ( out_tmp + 1.0f ) + 2.0f ) ); + coord = (int32_t) ( (float) ( out_tmp + 1.0f ) ); + } + loop_ub = n - k; + for ( n = 0; n < loop_ub; n++ ) + { + fcnOutput_data[n] = src_pos_data[k + n]; + } + + shoebox_get_coord( obj, fcnOutput_data, src_pos_data, tmp_pos, out_tmp, coord, loop_ub, k, isRelative ); + + shoebox_bound( obj, tmp_pos ); + + scale = ER_EUCLIDEAN_SCALE; + + out_tmp = shoebox_get_euclidian_distance_internal( obj, tmp_pos, &scale ); + + obj->src_dist[( (int32_t) ( (float) ( ( (float) j ) + 1.0f ) ) ) - 1] = scale * sqrtf( out_tmp ); + + /* COMPUTE PATTERNS */ + + /* SHOEBOX_COMPUTE: fills an input structure (4 array fields of length NxR ) with the */ + /* Early reflection metadata (time of arrival, gain, az, el). */ + /* */ + /* Input: */ + /* 1. obj : Module data holder */ + /* 2. ER_struct : Early reflection structure */ + /* 3. src_num : Index of source to compute patterns for */ + /* ------ */ + out_tmp = obj->src_dist[( (int32_t) ( (float) ( ( (float) j ) + 1.0f ) ) ) - 1]; + for ( loop_ub = 0; loop_ub < 6; loop_ub++ ) + { + float im_pos[3]; + float path_dist; + /* Retrieve coordinate and surface sign */ + coord = ( (int32_t) ceilf( ( ( (float) loop_ub ) + 1.0f ) / 2.0f ) ) - 1; + rcoselev = ( ( (float) loop_ub ) + 1.0f ) + ( ER_PARAMS->n_ref * ( ( ( (float) j ) + 1.0f ) - 1.0f ) ); + /* Initialize image position coordinates */ + im_pos[0] = tmp_pos[0]; + im_pos[1] = tmp_pos[1]; + im_pos[2] = tmp_pos[2]; + /* Calculate image projection coordinate based on current surface axis */ + if ( ( loop_ub + 1 ) < 3 ) + { + scale = obj->cal.room_L; + } + else if ( ( loop_ub + 1 ) < 5 ) + { + scale = obj->cal.room_W; + } + else + { + scale = obj->cal.room_H; + } + im_pos[coord] = + tmp_pos[coord] + + ( 2.0f * ( ( ( ( -( 1.0f - ( fmodf( ( (float) loop_ub ) + 1.0f, 2.0f ) * 2.0f ) ) ) * scale ) / 2.0f ) - tmp_pos[coord] ) ); + /* 0. Get euclidean distance from IMAGE SOURCE [N,W] to LIST */ + scale = ER_EUCLIDEAN_SCALE; + path_dist = shoebox_get_euclidian_distance_internal( obj, im_pos, &scale ); + + path_dist = scale * sqrtf( path_dist ); + /* 1. Compute time-of arrival (TOA) */ + ER_PARAMS->times.data[( (int32_t) rcoselev ) - 1] = path_dist / obj->soundspeed; + /* 2./3. DOA */ + ER_PARAMS->az_angle.data[( (int32_t) rcoselev ) - 1] = + rad2deg( + atan2f( im_pos[1] - obj->list_pos[1], im_pos[0] - obj->list_pos[0] ) ); + ER_PARAMS->el_angle.data[( (int32_t) rcoselev ) - 1] = + rad2deg( + asinf( ( im_pos[2] - obj->list_pos[2] ) / path_dist ) ); + /* 4. Compute gain taking into account air and surface absorption */ + /* and propagation loss */ + if ( path_dist < out_tmp ) + { + path_dist = out_tmp; + } + ER_PARAMS->gains.data[( (int32_t) rcoselev ) - 1] = + ( ( 1.0f - obj->cal.abs_coeff[loop_ub] ) * ( out_tmp / path_dist ) ) - ( path_dist * obj->air_coeff ); + } + } + + return; +} diff --git a/lib_rend/ivas_stat_rend.h b/lib_rend/ivas_stat_rend.h new file mode 100644 index 0000000000000000000000000000000000000000..eac562e6914656c54124d272fc9307d371e8b8ce --- /dev/null +++ b/lib_rend/ivas_stat_rend.h @@ -0,0 +1,1450 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#ifndef IVAS_STAT_REND_H +#define IVAS_STAT_REND_H + +#include +#include "options.h" +#include "ivas_cnst.h" +#include "ivas_stat_com.h" // note: needed for DIRAC_DEC_BIN_HANDLE until #156 is solved +#include "stat_com.h" /* Note: Currently needed for CLDFB. */ +#include "common_api_types.h" + + +/*----------------------------------------------------------------------------------* + * Output configuration for renderer (e.g. DirAC, MASA, Binaural Renderer...) + *----------------------------------------------------------------------------------*/ + +typedef enum _IVAS_AUDIO_CONFIG AUDIO_CONFIG; + +typedef struct ivas_output_setup_structure +{ + AUDIO_CONFIG output_config; + int16_t nchan_out_woLFE; /* number of output audio channels without LFE */ + int16_t ambisonics_order; + int8_t is_loudspeaker_setup; + int8_t is_planar_setup; + int8_t is_binaural_setup; + + int16_t num_lfe; + int16_t index_lfe[1]; + const float *ls_azimuth; + const float *ls_elevation; + + uint8_t separateChannelEnabled; + int16_t separateChannelIndex; + +} IVAS_OUTPUT_SETUP, *IVAS_OUTPUT_SETUP_HANDLE; + + +/*----------------------------------------------------------------------------------* + * Spatial parametric rendering common structures + *----------------------------------------------------------------------------------*/ + +/*Onset detector*/ +typedef struct dirac_onset_detection_params_structure +{ + int16_t num_freq_bands; + int16_t max_band_decorr; + +} DIRAC_ONSET_DETECTION_PARAMS; + +typedef struct dirac_onset_detection_state_structure +{ + float *onset_detector_1; + float *onset_detector_2; + +} DIRAC_ONSET_DETECTION_STATE; + +/*Decorrelator*/ +typedef struct dirac_decorr_params_structure +{ + int16_t max_band_decorr; + int16_t max_frequency; + + int16_t *pre_delay; + int16_t *filter_length; + float *filter_coeff_num_real; + float *filter_coeff_den_real; + float *phase_coeff_real; + float *phase_coeff_imag; + int16_t *split_frequency_bands; + int16_t num_split_frequency_bands; + + int16_t use_ducker; + int16_t add_back_onsets_on; + + DIRAC_ONSET_DETECTION_PARAMS h_onset_detection_power_params; + +} DIRAC_DECORR_PARAMS, *HANDLE_DIRAC_DECORR_PARAMS; + +typedef struct dirac_decorr_state_structure +{ + float *decorr_buffer; + float *direct_energy_smooth; + float *reverb_energy_smooth; + + DIRAC_ONSET_DETECTION_STATE h_onset_detection_power_state; + +} DIRAC_DECORR_STATE, *HANDLE_DIRAC_DECORR_STATE; + +typedef struct ivas_spatial_parametric_rend_common_data_structure +{ + int16_t slot_size; + int16_t subframe_nbslots[MAX_JBM_SUBFRAMES_5MS]; + int16_t subframes_rendered; + int16_t slots_rendered; + int16_t num_slots; + int16_t render_to_md_map[MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME]; + int16_t nb_subframes; + + int16_t num_freq_bands; + int16_t numSimultaneousDirections; /* From 1 to 2 + MAX_NUM_OBJECTS */ + int16_t numParametricDirections; /* 1 or 2 */ + int16_t numIsmDirections; /* From 0 to MAX_NUM_OBJECTS */ + + int16_t **azimuth; + int16_t **elevation; + int16_t **azimuth2; + int16_t **elevation2; + + float **diffuseness_vector; + float **energy_ratio1; + float **energy_ratio2; + + float **spreadCoherence; + float **spreadCoherence2; + float **surroundingCoherence; + + /* Metadata access indices and buffer size */ + int16_t dirac_bs_md_write_idx; + int16_t dirac_read_idx; + int16_t dirac_md_buffer_length; + +} SPAT_PARAM_REND_COMMON_DATA, *SPAT_PARAM_REND_COMMON_DATA_HANDLE; + + +/*----------------------------------------------------------------------------------* + * DirAC rendering structures + *----------------------------------------------------------------------------------*/ + +typedef struct dirac_dec_stack_mem +{ + /*Decorrelator*/ + float *frame_dec_f; + + /*Prototypes*/ + float *proto_direct_buffer_f; + float *proto_diffuse_buffer_f; + + /*Prototype NRGs*/ + float *proto_power_smooth; + float *proto_power_diff_smooth; + + /*Gain or power factors for directional and diffuse streams*/ + float *direct_power_factor; + float *diffuse_power_factor; + + /*Directional responses (gains & Nrg)*/ + float *direct_responses; + float *direct_responses_square; + + /* Target co-variance mtx */ + float *cy_auto_dir_smooth; + float *cy_cross_dir_smooth; + float *cy_auto_diff_smooth; + + float *reference_power; + float *onset_filter; + +} DIRAC_DEC_STACK_MEM, *DIRAC_DEC_STACK_MEM_HANDLE; + +/*Output synthesis*/ +typedef struct dirac_output_synthesis_params_structure +{ + int16_t max_band_decorr; + + int16_t use_onset_filters; + + float *interpolator; + float *alpha_synthesis; + float *alpha_synthesis_fast; + int16_t numAlphas; + int16_t numAlphasFast; + + float *proto_matrix; + + float diffuse_compensation_factor; + float diffuse_compensation_factor_decorr; + +} DIRAC_OUTPUT_SYNTHESIS_PARAMS; + +typedef struct dirac_output_synthesis_state_structure +{ + /* only pointer to local buffers */ + float *direct_responses; /* direct responses for DOA of current frame. Size: num_freq_bands*num_channels. */ + float *direct_responses_square; + float *diffuse_responses_square; /* squared diffuse responses. Size: num_channels. */ + + /* only pointer to local buffers */ + float *direct_power_factor; + float *diffuse_power_factor; + + float *proto_power_smooth; /* Smoothed power of the prototype signals. Size: num_freq_bands*num_channels. */ + float *proto_power_smooth_prev; /* Smoothed power of the prototype signals of the previous synthesis block. Size: num_freq_bands*num_channels. */ + + float *proto_power_diff_smooth; + float *proto_power_diff_smooth_prev; + + /* only pointer to local buffers */ + float *proto_direct_buffer_f; /* Buffer for direct sound prototype signals. Size: 2*num_freq_bands*num_channels*buffer_length (complex interleaved). */ + float *proto_diffuse_buffer_f; /* Buffer for diffuse sound prototype signals. Size: 2*num_freq_bands*num_channels*buffer_length (complex interleaved). */ + + /* Output gain memories */ + float *gains_dir_prev; /* Direct sound gains of current synthesis block. Size: num_freq_bands*num_channel. */ + float *gains_diff_prev; /* Diffuse sound gains of previous synthesis block. Size: num_freq_bands*num_channel. */ + + /* only pointer to local buffers */ + float *cy_auto_dir_smooth; /* Target auto PSD of direct sound. Size: num_freq_bands*num_channels. */ + float *cy_cross_dir_smooth; /* Target cross PSD of direct sound. Size: num_freq_bands*num_channels. */ + float *cy_auto_diff_smooth; /* Target auto PSD of diffuse sound. Size: num_freq_bands*num_channels. */ + + /* PSD memories */ + float *cy_auto_dir_smooth_prev; /* Target auto PSD of direct sound of previous synthesis block. Size: num_freq_bands*num_channels. */ + float *cy_cross_dir_smooth_prev; /* Target cross PSD of direct sound of previous synthesis block. Size: num_freq_bands*num_channels. */ + float *cy_auto_diff_smooth_prev; /* Target auto PSD of diffuse sound of previous synthesis block. Size: num_freq_bands*num_channels. */ + + const float *onset_filter; + + /* Temporal smoothing memories */ + float *reference_power_smooth_prev; + float *direction_smoothness_prev; + +} DIRAC_OUTPUT_SYNTHESIS_STATE; + +/* MASA stereo transport signal type detection structure */ +typedef struct +{ + MASA_TRANSPORT_SIGNAL_TYPE masa_stereo_type; + MASA_TRANSPORT_SIGNAL_TYPE current_stereo_type; + MASA_TRANSPORT_SIGNAL_TYPE type_change_direction; + + int16_t dipole_freq_range[2]; + + float left_bb_power; + float right_bb_power; + float total_bb_power; + + float left_hi_power; + float right_hi_power; + float total_hi_power; + + float sum_power[MASA_SUM_FREQ_RANGE_BINS]; + float total_power[MASA_SUM_FREQ_RANGE_BINS]; + + float subtract_power_y; + float subtract_power_y_smooth; + float target_power_y_smooth; + + float lr_total_bb_ratio_db; + float lr_total_hi_ratio_db; + float min_sum_total_ratio_db; + float subtract_target_ratio_db; + + int16_t counter; + int16_t interpolator; + +} MASA_STEREO_TYPE_DETECT; + +/* McMASA LFE synthesis structure */ +typedef struct ivas_mcmasa_lfe_synth_struct +{ + float lfeToTotalEnergyRatio[MAX_PARAM_SPATIAL_SUBFRAMES]; + int16_t lfeGainPrevIndex; + float transportEneSmooth; + float protoLfeEneSmooth; + float targetEneLfeSmooth; + float targetEneTransSmooth; + + float *lfeSynthRingBuffer; + int16_t ringBufferLoPointer; + int16_t ringBufferHiPointer; + float lowpassSum; + int16_t ringBufferSize; + + float *lfeSynthRingBuffer2; + int16_t ringBufferLoPointer2; + float lowpassSum2; + int16_t ringBufferSize2; + + float *delayBuffer_syncLp; + int16_t delayBuffer_syncLp_size; + + float *delayBuffer_syncDirAC; + int16_t delayBuffer_syncDirAC_size; + + float lfeGainPrev; + float transportGainPrev; + float interpolator[CLDFB_NO_CHANNELS_MAX]; + +} MCMASA_LFE_SYNTH_DATA, *MCMASA_LFE_SYNTH_DATA_HANDLE; + +/* DirAC renderer main structure */ +typedef struct ivas_dirac_rend_data_structure +{ + IVAS_OUTPUT_SETUP hOutSetup; + + /*Parameter estimation*/ + int16_t index_buffer_intensity; + float *buffer_intensity_real[DIRAC_NUM_DIMS][DIRAC_NO_COL_AVG_DIFF]; + float *buffer_energy; + + float *frequency_axis; + float *diffuse_response_function; + float *hoa_encoder; + const float *hoa_decoder; + + /*Decoder parameters */ + /*Prototypes*/ + int16_t num_outputs_dir; + int16_t num_outputs_diff; + int16_t num_protos_dir; + int16_t num_protos_diff; + int16_t num_protos_ambi; + DIRAC_SYNTHESIS_CONFIG synthesisConf; + DIRAC_PANNING_CONFIG panningConf; + + /* prototype computing */ + int16_t *proto_index_dir; + int16_t *proto_index_diff; + + int16_t proto_signal_decorr_on; + + /*Decoder states=memories*/ + float *proto_frame_f; + float *proto_frame_dec_f; + + DIRAC_DEC_STACK_MEM stack_mem; + MASA_STEREO_TYPE_DETECT *masa_stereo_type_detect; + + int16_t num_ele_spk_no_diffuse_rendering; + + const int16_t *sba_map_tc; + + DIRAC_OUTPUT_SYNTHESIS_PARAMS h_output_synthesis_psd_params; + DIRAC_OUTPUT_SYNTHESIS_STATE h_output_synthesis_psd_state; + + HANDLE_DIRAC_DECORR_PARAMS h_freq_domain_decorr_ap_params; + HANDLE_DIRAC_DECORR_STATE h_freq_domain_decorr_ap_state; + +} DIRAC_REND_DATA, *DIRAC_REND_HANDLE; + + +/*----------------------------------------------------------------------------------* + * VBAP structures + *----------------------------------------------------------------------------------*/ + +/* Defines a single virtual surface triplet of loudspeakers + * with a precalculated inverse matrix */ +typedef struct vbap_vs_triplet_structure +{ + uint8_t speaker_node[3]; + float inverse_matrix[3][3]; + +} VBAP_VS_TRIPLET; + + +/* Storage structure for fast runtime triplet search */ +typedef struct triplet_search_structure +{ + VBAP_VS_TRIPLET *triplets; + int16_t num_triplets; + int16_t initial_search_indices[VBAP_NUM_SEARCH_SECTORS]; + +} VBAP_SEARCH_STRUCT; + + +/* VBAP data structure. Contains the formed virtual surface arrangement * and supporting data. */ +typedef struct vbap_data_structure +{ + VBAP_SEARCH_STRUCT search_struct[2]; /* Default to max two groups in this implementation */ + int16_t num_search_structs; + int16_t num_speaker_nodes; + int16_t num_speaker_nodes_internal; + int16_t top_virtual_speaker_node_index; /* These indices can be negative */ + int16_t bottom_virtual_speaker_node_index; + int16_t back_virtual_speaker_node_index; + float *bottom_virtual_speaker_node_division_gains; + float *top_virtual_speaker_node_division_gains; + float *back_virtual_speaker_node_division_gains; + float *object_mode_bottom_virtual_speaker_node_division_gains; + float *object_mode_top_virtual_speaker_node_division_gains; + float *object_mode_back_virtual_speaker_node_division_gains; + +} VBAP_DATA, *VBAP_HANDLE; + + +/*----------------------------------------------------------------------------------* + * Binaural FastConv Rendering structure + *----------------------------------------------------------------------------------*/ + +/* Binaural reverberator structure */ +typedef struct ivas_binaural_reverb_struct +{ + float *loopBufReal[CLDFB_NO_CHANNELS_MAX]; + float *loopBufImag[CLDFB_NO_CHANNELS_MAX]; + float preDelayBufferReal[REVERB_PREDELAY_MAX + 1][CLDFB_NO_CHANNELS_MAX]; + float preDelayBufferImag[REVERB_PREDELAY_MAX + 1][CLDFB_NO_CHANNELS_MAX]; + float **tapPointersReal[CLDFB_NO_CHANNELS_MAX][BINAURAL_CHANNELS]; + float **tapPointersImag[CLDFB_NO_CHANNELS_MAX][BINAURAL_CHANNELS]; + + float binauralCoherenceCrossmixGains[CLDFB_NO_CHANNELS_MAX]; + float binauralCoherenceDirectGains[CLDFB_NO_CHANNELS_MAX]; + float reverbEqGains[CLDFB_NO_CHANNELS_MAX]; + float loopAttenuationFactor[CLDFB_NO_CHANNELS_MAX]; + + float *outputBufferReal[CLDFB_NO_CHANNELS_MAX][BINAURAL_CHANNELS]; + float *outputBufferImag[CLDFB_NO_CHANNELS_MAX][BINAURAL_CHANNELS]; + + int16_t numBins; + + int16_t useBinauralCoherence; + int16_t loopBufLength[CLDFB_NO_CHANNELS_MAX]; + int16_t loopBufLengthMax[CLDFB_NO_CHANNELS_MAX]; + int16_t preDelayBufferIndex; + int16_t preDelayBufferLength; + + int16_t taps[CLDFB_NO_CHANNELS_MAX][BINAURAL_CHANNELS]; + int16_t *tapPhaseShiftType[CLDFB_NO_CHANNELS_MAX][BINAURAL_CHANNELS]; + + int16_t blockSize; + uint32_t binRend_RandNext; + int16_t highestBinauralCoherenceBin; + + float dmxmtx[BINAURAL_CHANNELS][MAX_OUTPUT_CHANNELS]; + float foa_enc[MAX_OUTPUT_CHANNELS][FOA_CHANNELS]; + +} REVERB_STRUCT, *REVERB_STRUCT_HANDLE; + + +/* Diffuse sound directional distribution data structure */ +typedef struct ivas_diffuse_distribution_data_structure +{ + float diffuseRatioX[CLDFB_NO_CHANNELS_MAX]; + float diffuseRatioY[CLDFB_NO_CHANNELS_MAX]; + float diffuseRatioZ[CLDFB_NO_CHANNELS_MAX]; + +} DIFFUSE_DISTRIBUTION_DATA, *DIFFUSE_DISTRIBUTION_HANDLE; + + +/* Parametric binaural data structure */ +typedef struct ivas_dirac_dec_binaural_data_structure +{ + float ChEnePrev[BINAURAL_CHANNELS][CLDFB_NO_CHANNELS_MAX]; + float ChCrossRePrev[CLDFB_NO_CHANNELS_MAX]; + float ChCrossImPrev[CLDFB_NO_CHANNELS_MAX]; + float ChEne[BINAURAL_CHANNELS][CLDFB_NO_CHANNELS_MAX]; + float ChCrossRe[CLDFB_NO_CHANNELS_MAX]; + float ChCrossIm[CLDFB_NO_CHANNELS_MAX]; + float ChEneOutPrev[BINAURAL_CHANNELS][CLDFB_NO_CHANNELS_MAX]; + float ChCrossReOutPrev[CLDFB_NO_CHANNELS_MAX]; + float ChCrossImOutPrev[CLDFB_NO_CHANNELS_MAX]; + float ChEneOut[BINAURAL_CHANNELS][CLDFB_NO_CHANNELS_MAX]; + float ChCrossReOut[CLDFB_NO_CHANNELS_MAX]; + float ChCrossImOut[CLDFB_NO_CHANNELS_MAX]; + float processMtxRe[BINAURAL_CHANNELS][BINAURAL_CHANNELS + MAX_NUM_OBJECTS][CLDFB_NO_CHANNELS_MAX]; + float processMtxIm[BINAURAL_CHANNELS][BINAURAL_CHANNELS + MAX_NUM_OBJECTS][CLDFB_NO_CHANNELS_MAX]; + float processMtxDecRe[BINAURAL_CHANNELS][BINAURAL_CHANNELS][CLDFB_NO_CHANNELS_MAX]; + float processMtxDecIm[BINAURAL_CHANNELS][BINAURAL_CHANNELS][CLDFB_NO_CHANNELS_MAX]; + float diffuseFieldCoherence[CLDFB_NO_CHANNELS_MAX]; + float diffuseFieldCoherenceX[BINAURAL_COHERENCE_DIFFERENCE_BINS]; + float diffuseFieldCoherenceY[BINAURAL_COHERENCE_DIFFERENCE_BINS]; + float diffuseFieldCoherenceZ[BINAURAL_COHERENCE_DIFFERENCE_BINS]; + float earlyPartEneCorrection[CLDFB_NO_CHANNELS_MAX]; + REVERB_STRUCT_HANDLE hReverb; + uint8_t renderStereoOutputInsteadOfBinaural; + float frameMeanDiffuseness[CLDFB_NO_CHANNELS_MAX]; + float processMtxRePrev[BINAURAL_CHANNELS][BINAURAL_CHANNELS + MAX_NUM_OBJECTS][CLDFB_NO_CHANNELS_MAX]; + float processMtxImPrev[BINAURAL_CHANNELS][BINAURAL_CHANNELS + MAX_NUM_OBJECTS][CLDFB_NO_CHANNELS_MAX]; + float processMtxDecRePrev[BINAURAL_CHANNELS][BINAURAL_CHANNELS][CLDFB_NO_CHANNELS_MAX]; + float processMtxDecImPrev[BINAURAL_CHANNELS][BINAURAL_CHANNELS][CLDFB_NO_CHANNELS_MAX]; + uint16_t useTdDecorr; + ivas_td_decorr_state_t *hTdDecorr; + float reqularizationFactor; + + DIFFUSE_DISTRIBUTION_HANDLE hDiffuseDist; + + HANDLE_DIRAC_DECORR_PARAMS h_freq_domain_decorr_ap_params; + HANDLE_DIRAC_DECORR_STATE h_freq_domain_decorr_ap_state; + +} DIRAC_DEC_BIN_DATA, *DIRAC_DEC_BIN_HANDLE; + +typedef struct ivas_binaural_rendering_conv_module_struct +{ + float ***filterTapsLeftReal; + float ***filterTapsLeftImag; + float ***filterTapsRightReal; + float ***filterTapsRightImag; + + float ***filterStatesLeftReal; + float ***filterStatesLeftImag; + + int16_t numTapsArray[BINAURAL_CONVBANDS]; + int16_t numTaps; + +} BINRENDERER_CONV_MODULE, *BINRENDERER_CONV_MODULE_HANDLE; + + +/*----------------------------------------------------------------------------------* + * EFAP structures + *----------------------------------------------------------------------------------*/ + +typedef struct EFAP_VERTEX +{ + float azi; /* azimuth of the loudspeaker */ + float ele; /* elevation of the loudspeaker */ + float pos[3]; /* [x y z] cartesian coordinate vector */ + int16_t idx; /* integer, that corresponds to the first index for the LS in the 1D output */ + int16_t isNaN; /* used to indicate if the vertex is a virtual speaker */ + EFAP_VTX_DMX_TYPE dmxType; /* virtual speaker downmix type */ + +} EFAP_VERTEX; + +typedef struct EFAP_VERTEX_DATA +{ + EFAP_VERTEX *vertexArray; /* Array of vertices */ + int16_t numVtx; /* Number of vertices */ + int16_t *vtxOrder; /* Array that indicates the order of the vertex ranked by increasing azimuth */ + +} EFAP_VERTEX_DATA; + +typedef struct EFAP_POLYSET +{ + int16_t chan[EFAP_MAX_CHAN_NUM]; /* An array indicating the loudspeaker index of the polygon vertices */ + int16_t isNaN[EFAP_MAX_CHAN_NUM]; /* Indicates if one of the vertices isNaN */ + int16_t numChan; /* An integer between 0 and EFAP_MAX_CHAN_NUM corresponding to the number of vertices of the polygon */ + float polyAzi[EFAP_MAX_CHAN_NUM]; /* An array (same length as "chan"), with the azimuth of the channels */ + float polyEle[EFAP_MAX_CHAN_NUM]; /* An array (same length as "chan"), with the elevation of the channels */ + +} EFAP_POLYSET; + +typedef struct EFAP_LS_TRIANGLE +{ + int16_t LS[3]; /* Array indicating the loudspeaker index of the triangle vertices */ + +} EFAP_LS_TRIANGLE; + +typedef struct EFAP_POLYSET_DATA +{ + EFAP_POLYSET polysetArray[EFAP_MAX_POLY_SET]; /* Array of polygons */ + int16_t numPoly; /* Number of polygons */ + EFAP_LS_TRIANGLE triArray[EFAP_MAX_POLY_SET]; /* Array of triangles */ + int16_t numTri; /* Number of triangles */ + +} EFAP_POLYSET_DATA; + +typedef struct EFAP +{ + int16_t numSpk; /* Number of loudspeakers */ + float *aziSpk; /* Loudspeaker azimuths */ + float *eleSpk; /* Loudspeaker elevations */ + EFAP_VERTEX_DATA vtxData; /* Vertex Data, contains all the data concerning the vertex */ + EFAP_POLYSET_DATA polyData; /* Polygon data */ + float **dmTranspose; /* Downmix Matrix used for redistributing the energy of ghosts LS and its transpose */ + float *bufferLong; /* tmp buffer that will be given as a parameter for computing the gain; this is a 1D array of length numVtx */ + float *bufferShort; /* tmp buffer that will be given as a parameter for computing the gain; this is the result of downMixMatrix*bufferLong, length is numSpk */ + int16_t numTot; /* Total number of real + ghost loudspeakers, used later for freeing memory */ + +} EFAP, *EFAP_HANDLE; + +/*----------------------------------------------------------------------------------* + * Orientation tracking structure + *----------------------------------------------------------------------------------*/ + +typedef struct ivas_orient_trk_state_t +{ + IVAS_HEAD_ORIENT_TRK_T orientation_tracking; + float centerAdaptationRate; + float offCenterAdaptationRate; + float adaptationAngle; + + float alpha; + IVAS_QUATERNION absAvgRot; /* average absolute orientation */ + IVAS_QUATERNION refRot; /* reference orientation */ + IVAS_QUATERNION trkRot; /* tracked rotation */ + +} ivas_orient_trk_state_t; + +/*----------------------------------------------------------------------------------* + * Head rotation data structure + *----------------------------------------------------------------------------------*/ + +typedef struct +{ + int8_t headRotEnabled; + IVAS_QUATERNION headPositions[MAX_PARAM_SPATIAL_SUBFRAMES]; + IVAS_VECTOR3 Pos[MAX_PARAM_SPATIAL_SUBFRAMES]; + float crossfade[L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES]; + ivas_orient_trk_state_t *hOrientationTracker; + +} IVAS_REND_HeadRotData; + +typedef struct ivas_binaural_head_track_struct +{ + IVAS_QUATERNION Quaternions[MAX_PARAM_SPATIAL_SUBFRAMES]; + IVAS_VECTOR3 Pos[MAX_PARAM_SPATIAL_SUBFRAMES]; + float Rmat[3][3]; + float Rmat_prev[3][3]; + + uint8_t lrSwitchedNext; + uint8_t lrSwitchedCurrent; + float lrSwitchInterpVal; + + float chEneIIR[2][MASA_FREQUENCY_BANDS]; /* independent of the format. MASA bands are suitable for the task and readily available in ROM. */ + float procChEneIIR[2][MASA_FREQUENCY_BANDS]; + + int16_t shd_rot_max_order; + ivas_orient_trk_state_t *OrientationTracker; + + +} HEAD_TRACK_DATA, *HEAD_TRACK_DATA_HANDLE; + +/*----------------------------------------------------------------------------------* + * External orientation data structure + *----------------------------------------------------------------------------------*/ + +typedef struct ivas_external_orientation_struct +{ + int8_t enableHeadRotation[MAX_PARAM_SPATIAL_SUBFRAMES]; /* 0 - disable, 1 - enable, 2 - freeze to previous rotation */ + int8_t enableExternalOrientation[MAX_PARAM_SPATIAL_SUBFRAMES]; /* 0 - disable, 1 - enable, 2 - freeze to previous orientation */ + int8_t enableRotationInterpolation[MAX_PARAM_SPATIAL_SUBFRAMES]; /* 0 - disable, 1 - enable */ + int16_t numFramesToTargetOrientation[MAX_PARAM_SPATIAL_SUBFRAMES]; /* Number of frames until target orientation is reached */ + IVAS_QUATERNION Quaternions[MAX_PARAM_SPATIAL_SUBFRAMES]; /* External orientation in quaternions */ + int16_t num_subframes; + +} EXTERNAL_ORIENTATION_DATA, *EXTERNAL_ORIENTATION_HANDLE; + +/*----------------------------------------------------------------------------------* + * Combined orientation data structure for the external orienations and head orientation + *----------------------------------------------------------------------------------*/ + +typedef struct ivas_combined_orientation_struct +{ + int16_t enableCombinedOrientation[MAX_PARAM_SPATIAL_SUBFRAMES]; + float interpolationCoefficient; + float interpolationIncrement; + int16_t maximumFramesToTargetOrientation; + uint8_t lrSwitchedNext; + uint8_t lrSwitchedCurrent; + float lrSwitchInterpVal; + bool isInterpolationOngoing; + IVAS_QUATERNION Quaternions[MAX_PARAM_SPATIAL_SUBFRAMES]; + IVAS_QUATERNION Quaternion_prev_extOrientation; + IVAS_QUATERNION Quaternions_ext_interpolation_start; + IVAS_QUATERNION Quaternions_ext_interpolation_target; + float Rmat[MAX_PARAM_SPATIAL_SUBFRAMES][3][3]; + float Rmat_prev[3][3]; + float chEneIIR[2][MASA_FREQUENCY_BANDS]; /* independent of the format. MASA bands are suitable for the task and readily available in ROM. */ + float procChEneIIR[2][MASA_FREQUENCY_BANDS]; + int16_t shd_rot_max_order; + IVAS_VECTOR3 listenerPos[MAX_PARAM_SPATIAL_SUBFRAMES]; + IVAS_QUATERNION Quaternion_frozen_ext; + IVAS_QUATERNION Quaternion_frozen_head; + int8_t isExtOrientationFrozen; + int8_t isHeadRotationFrozen; + int16_t num_subframes; + +} COMBINED_ORIENTATION_DATA, *COMBINED_ORIENTATION_HANDLE; + + +/*----------------------------------------------------------------------------------* + * Reverberator structure + *----------------------------------------------------------------------------------*/ + +typedef struct _IVAS_RENDER_CONFIG RENDER_CONFIG_DATA; +typedef struct _IVAS_RENDER_CONFIG *RENDER_CONFIG_HANDLE; + +typedef struct ivas_rev_delay_line_t +{ + float *pBuffer; + uint16_t MaxDelay; + int16_t Delay; + uint16_t BufferPos; + float Gain; + +} ivas_rev_delay_line_t; + +typedef struct ivas_rev_iir_filter_t +{ + uint16_t MaxTaps; + uint16_t nr_taps; + uint16_t isFIR; + float Output; + float CoefA[IVAS_REV_MAX_IIR_FILTER_LENGTH]; + float CoefB[IVAS_REV_MAX_IIR_FILTER_LENGTH]; + float pBuffer[IVAS_REV_MAX_IIR_FILTER_LENGTH]; + +} ivas_rev_iir_filter_t; + + +typedef float rv_fftwf_type_complex[2]; /* complex type of fftwf library */ + +/* Convertion block for FFT filter: from time domain to frequency domain (with OLS) and back */ +typedef struct ivas_reverb_t2f_f2t_t +{ + int16_t fft_size; + int16_t log2_fft_size; + int16_t block_size; + int16_t hist_size; /* rv_fft_size - rv_block_size */ + float fft_history_L[RV_FILTER_MAX_HISTORY]; + float fft_history_R[RV_FILTER_MAX_HISTORY]; + +} ivas_reverb_t2f_f2t_t; + +/* FFT filter with its frequency response coefficients */ +typedef struct ivas_reverb_fft_filter_t +{ + int16_t fft_size; + float fft_spectrum[RV_FILTER_MAX_FFT_SIZE]; + +} ivas_reverb_fft_filter_t; + +typedef struct ivas_reverb_state_t +{ + RENDER_CONFIG_DATA pConfig; + + /* input downmixer: */ + float dmx_gain; /* downmix gain */ + + /* predelay: */ + ivas_rev_delay_line_t predelay_line; + float *pPredelay_buffer; + + /* jot reverberator: */ + uint16_t nr_of_branches; /* number of feedback loops */ + ivas_rev_delay_line_t delay_line[IVAS_REV_MAX_NR_BRANCHES]; /* feedback loop delays */ + float *loop_delay_buffer[IVAS_REV_MAX_NR_BRANCHES]; /* feedback loop delay sample buffers */ + ivas_rev_iir_filter_t t60[IVAS_REV_MAX_NR_BRANCHES]; /* feedback loop filters */ + float gain_matrix[IVAS_REV_MAX_NR_BRANCHES][IVAS_REV_MAX_NR_BRANCHES]; /* feedback matrix */ + float mixer[BINAURAL_CHANNELS][IVAS_REV_MAX_NR_BRANCHES]; /* output mixer matrix */ + + /* binauralization filters: */ + int16_t do_corr_filter; + ivas_reverb_t2f_f2t_t fft_filter_ols; + ivas_reverb_fft_filter_t fft_filter_correl_0; + ivas_reverb_fft_filter_t fft_filter_correl_1; + ivas_reverb_fft_filter_t fft_filter_color_0; + ivas_reverb_fft_filter_t fft_filter_color_1; + uint16_t fft_size; /* fft processing size */ + uint16_t fft_subblock_size; /* fft block processing size */ + uint16_t num_fft_subblocks; /* number of fft subblocks */ + uint16_t full_block_size; /* full block processing size */ + +} REVERB_DATA, *REVERB_HANDLE; + + +/*----------------------------------------------------------------------------------* + * Shoebox structure + *----------------------------------------------------------------------------------*/ + +/* Structure to hold the original bitstream metadata */ +typedef struct +{ + float room_L; + float room_W; + float room_H; + float abs_coeff[ER_ABS_COEFF]; + float list_orig[3]; + +} shoebox_config_t; + +/* Structure to hold the corrected( bounded ) source and listener positions */ +typedef struct +{ + uint16_t isCartesian; + uint16_t isRelative; + uint16_t isZHeight; + uint16_t isRadians; + uint16_t MAX_SOURCES; + uint16_t max_bands; + uint16_t REF_ORDER; + float src_pos[75]; + float src_dist[25]; + float list_pos[3]; + uint16_t nSrc; + float radius; + float min_wall_dist; + float soundspeed; + float air_coeff; + shoebox_config_t cal; + +} shoebox_obj_t; + +typedef struct shoebox_data_t +{ + float data[150]; + int32_t size[1]; + +} shoebox_data_t; + +typedef struct +{ + uint16_t n_sources; + uint16_t n_ref; + shoebox_data_t times; + shoebox_data_t gains; + shoebox_data_t az_angle; + shoebox_data_t el_angle; + +} shoebox_output_t; + + +/*----------------------------------------------------------------------------------* + * Reflections structure + *----------------------------------------------------------------------------------*/ + +/* Structure to hold the original source positions */ +typedef struct er_struct_t +{ + AUDIO_CONFIG audio_config; + int16_t nchan_out; + uint16_t use_er; + uint32_t lowComplexity; + uint16_t n_LC_sources; + uint16_t *LC_mixing; + uint16_t is_ready; + uint16_t circ_len; + uint16_t circ_insert; + uint16_t n_total_reflections; + uint16_t is_cartesian; + uint16_t is_relative; + uint32_t max_frame_size; + float output_Fs; + float source_positions[75]; + float user_origin[3]; + float *circ_buffers; + uint16_t *closest_ch_idx; + shoebox_output_t shoebox_data; + shoebox_obj_t shoebox_lib; + +} er_struct_t; + + +/*----------------------------------------------------------------------------------* + * TD ISM Object Renderer structure + *----------------------------------------------------------------------------------*/ + +typedef struct +{ + int16_t modelROM; /* Flag that indicates that the model resides in ROM (controls init/dealloc). */ + int16_t UseItdModel; /* Controls whether ITD model is used. */ + int16_t SplineDegree; /* Degree of the spline functions */ + int16_t K; /* Length of filter */ + int16_t elevDim2; + int16_t elevDim3; + int16_t AlphaN; /* Number of rows in Alpha matrices */ + int16_t num_unique_azim_splines; + int16_t elevSegSamples; + + int16_t elevBsLen[HRTF_MODEL_BSPLINE_NUM_COEFFS]; + int16_t elevBsStart[HRTF_MODEL_BSPLINE_NUM_COEFFS]; + const int16_t *azimDim2; + const int16_t *azimDim3; + const int16_t *azim_start_idx; + const int16_t *azimSegSamples; + const int16_t *azimShapeIdx; + const int16_t *azimShapeSampFactor; + + const float *elevKSeq; /* Array, N x elevDim2 x elevDim3 */ + const float *AlphaL; /* Array, size AlphaN x K */ + const float *AlphaR; /* Array, size AlphaN x K */ + const float *elevBsShape; + float **azimKSeq; /* Array, length azimDim3+1 */ + const float **azimBsShape; + + int16_t azimDim3Max; + int16_t iSecFirst[HRTF_MODEL_N_SECTIONS]; /* Indices for start of sections */ + int16_t iSecLast[HRTF_MODEL_N_SECTIONS]; /* Indices for end of sections */ + const float *EL; /* Array, size (AlphaN*HRTF_MODEL_N_SECTIONS) */ + const float *ER; /* Array, size (AlphaN*HRTF_MODEL_N_SECTIONS) */ + + /* Pointers for allocation of dynamic memory */ + float *AlphaL_dyn; + float *AlphaR_dyn; + float *EL_dyn; + float *ER_dyn; + float *elevBsShape_dyn; + float *elevKSeq_dyn; + int16_t *azimDim2_dyn; + int16_t *azimDim3_dyn; + int16_t *azim_start_idx_dyn; + int16_t *azimSegSamples_dyn; + int16_t *azimShapeIdx_dyn; + int16_t *azimShapeSampFactor_dyn; + float **azimBsShape_dyn; + +} ModelParams_t; + +typedef struct +{ + int16_t N; /* Polynomial degree */ + + int16_t elevDim2; + int16_t elevDim3; + const float *elevKSeq; /* Array, length elevDim3-2 */ + int16_t azimDim2; + int16_t azimDim3; + const float *azimKSeq; /* Array, length azimDim3-2 */ + const float *W; /* Array, size (elevDim3*azimDim3) x K */ + + int16_t azimBsLen[HRTF_MODEL_BSPLINE_NUM_COEFFS]; + int16_t azimBsStart[HRTF_MODEL_BSPLINE_NUM_COEFFS]; + const float *azimBsShape; + int16_t azimSegSamples; + + int16_t elevBsLen[HRTF_MODEL_BSPLINE_NUM_COEFFS]; + int16_t elevBsStart[HRTF_MODEL_BSPLINE_NUM_COEFFS]; + const float *elevBsShape; + int16_t elevSegSamples; + float resamp_factor; + + /* Pointers for allocation of dynamic memory */ + float *elevKSeq_dyn; + float *azimKSeq_dyn; + float *W_dyn; + float *azimBsShape_dyn; + float *elevBsShape_dyn; + +} ModelParamsITD_t; + +typedef struct +{ + float val; + int16_t i; + +} ValueIndex_t; + +/* Shared memory for use when evaluating BSpline HR filter model*/ +typedef struct +{ + float BM[HRTF_MODEL_BSPLINE_NUM_COEFFS_SQ]; + ValueIndex_t BMEnergiesL[HRTF_MODEL_BSPLINE_NUM_COEFFS_SQ]; + ValueIndex_t BMEnergiesR[HRTF_MODEL_BSPLINE_NUM_COEFFS_SQ]; + int16_t UseIndsL[HRTF_MODEL_BSPLINE_NUM_COEFFS_SQ]; + int16_t UseIndsR[HRTF_MODEL_BSPLINE_NUM_COEFFS_SQ]; + float *hrfModL; + float *hrfModR; + float elevBfVec[HRTF_MODEL_BSPLINE_NUM_COEFFS]; + float azimBfVec[HRTF_MODEL_BSPLINE_NUM_COEFFS][HRTF_MODEL_BSPLINE_NUM_COEFFS]; + float BM_ITD[HRTF_MODEL_BSPLINE_NUM_COEFFS_SQ]; + float elevBfVecITD[HRTF_MODEL_BSPLINE_NUM_COEFFS]; + float azimBfVecITD[HRTF_MODEL_BSPLINE_NUM_COEFFS]; + float itdMod; + +} ModelEval_t; + +/* Mixer listener */ +typedef struct +{ + int16_t PoseUpdated; + float Pos[3]; + float Front[3]; + float Up[3]; + float Right[3]; + + int16_t VelUpdated; + float Vel[3]; + +} TDREND_MIX_Listener_t; + +/* HR filter */ +typedef struct TDREND_HRFILT_FiltSet_struct +{ + int32_t SampleRate; /* Sample rate of the HR filter */ + int16_t NumPos; + int16_t NumElev; + float Dist; + float *ItdSet_p; + int16_t FiltLength; + float *Azim_p; + float *Elev_p; + float *ItdSetNominal_p; + float *LeftFiltSet_p; + float *RightFiltSet_p; + ModelParams_t ModelParams; + ModelEval_t ModelEval; + ModelParamsITD_t ModelParamsITD; + TDREND_HRFILT_Method_t FilterMethod; /* HR filtering method */ + float latency_s; + const float *lr_energy_and_iac[3]; /* left/right energy and interaural coherence for late reverb */ + float *lr_energy_and_iac_dyn[3]; + +} TDREND_HRFILT_FiltSet_t; + +/* Distance attenuation */ +typedef struct +{ + TDREND_DistAttenModel_t DistAttenModel; + float RefDist; + float MaxDist; + float RollOffFactor; + +} TDREND_DistAtten_t; + +/* Directional attenuation */ +typedef struct +{ + float ConeInnerAngle; + float ConeOuterAngle; + float ConeOuterGain; + +} TDREND_DirAtten_t; + +/* Mixer spatial specification */ +typedef struct +{ + int16_t UseCommonDistAttenModel; /* Common distance attenuation model flag */ + TDREND_DistAttenModel_t DistAttenModel; /* Distance attenuation model */ + +} TDREND_MixSpatSpec_t; + +typedef struct TDREND_SRC_REND_s +{ + int16_t InputAvailable; + TDREND_PlayStatus_t PlayStatus; + + /* Gains */ + int16_t SrcGainUpdated; + float SrcGain_p[SPAT_BIN_MAX_INPUT_CHANNELS]; + float SrcGainMin_p[SPAT_BIN_MAX_INPUT_CHANNELS]; + float SrcGainMax_p[SPAT_BIN_MAX_INPUT_CHANNELS]; + float DirGain_p[SPAT_BIN_MAX_INPUT_CHANNELS]; + float DistGain_p[SPAT_BIN_MAX_INPUT_CHANNELS]; + +} TDREND_SRC_REND_t; + +/* Source spatial parameters */ +typedef struct +{ + int16_t Updated; + TDREND_PosType_t PosType; + float Pos_p[3 * SPAT_BIN_MAX_INPUT_CHANNELS]; + float Front_p[3 * SPAT_BIN_MAX_INPUT_CHANNELS]; + int16_t DirAttenEnabled; + TDREND_DirAtten_t DirAtten; + int16_t DistAttenEnabled; + TDREND_DistAtten_t DistAtten; + +} TDREND_SRC_SPATIAL_t; + +typedef struct +{ + float *InputFrame_p; /* Input frame pointer */ + TDREND_SRC_SPATIAL_t *SrcSpatial_p; + TDREND_SRC_REND_t *SrcRend_p; + int16_t itd; + int16_t previtd; + int16_t filterlength; + float mem_itd[ITD_MEM_LEN]; + float hrf_left_prev[SFX_SPAT_BIN_MAX_FILTER_LENGTH]; + float hrf_right_prev[SFX_SPAT_BIN_MAX_FILTER_LENGTH]; + float azim_prev; + float elev_prev; + float mem_hrf_left[SFX_SPAT_BIN_MAX_FILTER_LENGTH - 1]; + float mem_hrf_right[SFX_SPAT_BIN_MAX_FILTER_LENGTH - 1]; + float Gain; + float prevGain; + +} TDREND_SRC_t; + +/* Top level TD binaural renderer handle */ +typedef struct ivas_binaural_td_rendering_struct +{ + TDREND_MixSpatSpec_t *TdRend_MixSpatSpec_p; + TDREND_DirAtten_t *DirAtten_p; + int16_t NumOfSrcs; + int16_t MaxSrcInd; + + TDREND_SRC_t *Sources[MAX_NUM_TDREND_CHANNELS]; + + float Gain; /* Mixer gain */ + TDREND_MIX_Listener_t *Listener_p; /* The virtual listener */ + TDREND_HRFILT_FiltSet_t *HrFiltSet_p; /* HR filter set */ + + int16_t UseCommonDistAttenModel; /* Use common dist atten model (TRUE/FALSE) */ + int16_t DistAttenEnabled; /* (TRUE/FALSE) */ + TDREND_DistAttenModel_t DistAttenModel; /* Common distance attenuation model */ + +} BINAURAL_TD_OBJECT_RENDERER, *BINAURAL_TD_OBJECT_RENDERER_HANDLE; + +typedef struct +{ + int32_t binaural_latency_ns; + BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd; + TDREND_HRFILT_FiltSet_t *hHrtfTD; + +} TDREND_WRAPPER, *TDREND_WRAPPER_HANDLE; + + +/*------------------------------------------------------------------------------------------* + * Crend structures + *------------------------------------------------------------------------------------------*/ + +typedef struct ivas_hrtfs_structure +{ + float *pOut_to_bin_re[MAX_INTERN_CHANNELS][BINAURAL_CHANNELS]; + float *pOut_to_bin_im[MAX_INTERN_CHANNELS][BINAURAL_CHANNELS]; + float *pOut_to_bin_diffuse_re[BINAURAL_CHANNELS]; + float *pOut_to_bin_diffuse_im[BINAURAL_CHANNELS]; + float latency_s; + uint16_t num_iterations[MAX_INTERN_CHANNELS][BINAURAL_CHANNELS]; + uint16_t num_iterations_diffuse[BINAURAL_CHANNELS]; + uint16_t *pIndex_frequency_max[MAX_INTERN_CHANNELS][BINAURAL_CHANNELS]; + uint16_t *pIndex_frequency_max_diffuse[BINAURAL_CHANNELS]; + uint16_t index_frequency_max_diffuse; + int16_t max_num_ir; + int16_t max_num_iterations; + float inv_diffuse_weight[MAX_INTERN_CHANNELS]; /* inverse diffuse weights array, access one inverse weight by pInvDiffuseWeight[channel] */ + float gain_lfe; + +} HRTFS_DATA, *HRTFS_HANDLE; + + +/* Main Crend structure */ +typedef struct ivas_crend_state_t +{ + float *freq_buffer_re[MAX_INTERN_CHANNELS]; + float *freq_buffer_im[MAX_INTERN_CHANNELS]; + float *freq_buffer_re_diffuse; + float *freq_buffer_im_diffuse; + float *prev_out_buffer[BINAURAL_CHANNELS]; + float *lfe_delay_line; + float m_fYaw; + float m_fPitch; + float m_fRoll; + ivas_orient_trk_state_t *hTrack; + REVERB_HANDLE hReverb; + int16_t delay_line_rw_index; + int16_t diffuse_delay_line_rw_index; + er_struct_t *reflections; + +} CREND_DATA, *CREND_HANDLE; + +/* Main Crend wrapper structure */ +typedef struct ivas_binaural_crend_wrapper_struct +{ + int32_t binaural_latency_ns; + CREND_HANDLE hCrend; + HRTFS_HANDLE hHrtfCrend; + +} CREND_WRAPPER, *CREND_WRAPPER_HANDLE; + + + +/*------------------------------------------------------------------------------------------* + * HRTF structures - hrtfs from binary files + *------------------------------------------------------------------------------------------*/ + +typedef struct ivas_hrtfs_crend_structure +{ + HRTFS_DATA *hHRTF_hrir_combined; + HRTFS_DATA *hHRTF_hrir_hoa3; + HRTFS_DATA *hHRTF_hrir_hoa2; + HRTFS_DATA *hHRTF_hrir_foa; + HRTFS_DATA *hHRTF_brir_combined; + +} HRTFS_CREND, *HRTFS_CREND_HANDLE; + +/* Fastconv binaural data structure */ +typedef struct ivas_hrtfs_fastconv_struct +{ + float FASTCONV_HOA3_latency_s; + float FASTCONV_HRIR_latency_s; + float ***leftHRIRReal_HOA3; + float ***leftHRIRImag_HOA3; + float ***rightHRIRReal_HOA3; + float ***rightHRIRImag_HOA3; + + float ***leftHRIRReal; + float ***leftHRIRImag; + float ***rightHRIRReal; + float ***rightHRIRImag; + + float ***leftBRIRReal; + float ***leftBRIRImag; + float ***rightBRIRReal; + float ***rightBRIRImag; + float FASTCONV_BRIR_latency_s; + + float ***leftHRIRReal_HOA2; + float ***leftHRIRImag_HOA2; + float ***rightHRIRReal_HOA2; + float ***rightHRIRImag_HOA2; + float FASTCONV_HOA2_latency_s; + + float ***leftHRIRReal_FOA; + float ***leftHRIRImag_FOA; + float ***rightHRIRReal_FOA; + float ***rightHRIRImag_FOA; + float FASTCONV_FOA_latency_s; + + int16_t allocate_init_flag; /*Memory allocation flag 0: if the hrtf pointers are allocated at application level , 1: of allocated at ivas_binaural_hrtf_open() */ + + float fastconvReverberationTimes[CLDFB_NO_CHANNELS_MAX]; + float fastconvReverberationEneCorrections[CLDFB_NO_CHANNELS_MAX]; + +} HRTFS_FASTCONV, *HRTFS_FASTCONV_HANDLE; + +typedef struct ivas_hrtfs_parambin_struct +{ + float hrtfShCoeffsRe[BINAURAL_CHANNELS][HRTF_SH_CHANNELS][HRTF_NUM_BINS]; + float hrtfShCoeffsIm[BINAURAL_CHANNELS][HRTF_SH_CHANNELS][HRTF_NUM_BINS]; + + float parametricReverberationTimes[CLDFB_NO_CHANNELS_MAX]; + float parametricReverberationEneCorrections[CLDFB_NO_CHANNELS_MAX]; + float parametricEarlyPartEneCorrection[CLDFB_NO_CHANNELS_MAX]; + +} HRTFS_PARAMBIN, *HRTFS_PARAMBIN_HANDLE; + + + + +/*----------------------------------------------------------------------------------* + * Limiter structure + *----------------------------------------------------------------------------------*/ + +typedef struct +{ + int16_t max_num_channels; + int16_t num_channels; + float **channel_ptrs; + int32_t sampling_rate; + float gain; + float release_heuristic; + float attack_constant; + int16_t strong_saturation_count; + +} IVAS_LIMITER, *IVAS_LIMITER_HANDLE; + + +/*----------------------------------------------------------------------------------* + * Loudspeaker Configuration Conversion structure + *----------------------------------------------------------------------------------*/ + +typedef struct ivas_LS_setupconversion_struct +{ + float *dmxMtx[MAX_OUTPUT_CHANNELS]; + float *targetEnergyPrev[MAX_OUTPUT_CHANNELS]; + float *dmxEnergyPrev[MAX_OUTPUT_CHANNELS]; + int16_t sfbOffset[MAX_SFB + 2]; + int16_t sfbCnt; + +} LSSETUP_CONVERSION_STRUCT, *LSSETUP_CONVERSION_HANDLE; + +typedef struct ivas_LS_setupconversion_matrix +{ + int16_t index; + float value; +} LS_CONVERSION_MATRIX; + +typedef struct ivas_LS_setupconversion_mapping +{ + AUDIO_CONFIG input_config; + AUDIO_CONFIG output_config; + const LS_CONVERSION_MATRIX *conversion_matrix; +} LS_CONVERSION_MAPPING; + +typedef struct ivas_mono_downmix_renderer_struct +{ + float inputEnergy; + float protoEnergy; + +} MONO_DOWNMIX_RENDERER_STRUCT, *MONO_DOWNMIX_RENDERER_HANDLE; + + +/*----------------------------------------------------------------------------------* + * Custom Loudspeaker configuration structure + *----------------------------------------------------------------------------------*/ + +typedef struct ivas_LS_setup_custom +{ + int16_t is_planar_setup; /* flag to indicate if setup is planar or not */ + int16_t num_spk; /* number of custom loudspeakers */ + float ls_azimuth[MAX_OUTPUT_CHANNELS]; /* custom loudspeaker azimuths */ + float ls_elevation[MAX_OUTPUT_CHANNELS]; /* custom loudspeaker elevations */ + int16_t num_lfe; /* number of LFE channels */ + int16_t lfe_idx[MAX_OUTPUT_CHANNELS]; /* index for LFE channel insertion */ + int16_t separate_ch_found; /* flag to indicate if a center channel was found */ + float separate_ch_gains[MAX_OUTPUT_CHANNELS]; /* gains to pan McMASA separateChannel in case no center channel is present */ + +} LSSETUP_CUSTOM_STRUCT, *LSSETUP_CUSTOM_HANDLE; + + +/* Channel types in a channel-based config */ +typedef enum +{ + CHANNEL_TYPE_UNUSED = 0, + CHANNEL_TYPE_SPEAKER, + CHANNEL_TYPE_LFE + +} ChannelType; + +/*----------------------------------------------------------------------------------* + * Multichannel MASA (McMASA) analysis structure + *----------------------------------------------------------------------------------*/ + +typedef struct ivas_masa_decoder_ext_out_meta_struct *MASA_DECODER_EXT_OUT_META_HANDLE; + +typedef struct ivas_mcmasa_ana_data_structure +{ + int16_t nbands; + + /* CLDFB analysis */ + int16_t num_Cldfb_instances; + HANDLE_CLDFB_FILTER_BANK cldfbAnaEnc[MCMASA_MAX_ANA_CHANS]; + + /* DirAC parameter estimation */ + float **direction_vector_m[DIRAC_NUM_DIMS]; /* Average direction vector */ + int16_t band_grouping[MASA_FREQUENCY_BANDS + 1]; + int16_t block_grouping[5]; + + /* diffuseness */ + int16_t index_buffer_intensity; + float *buffer_intensity_real[DIRAC_NUM_DIMS][DIRAC_NO_COL_AVG_DIFF]; + float *buffer_intensity_real_vert[DIRAC_NO_COL_AVG_DIFF]; + float buffer_energy[DIRAC_NO_COL_AVG_DIFF * MASA_FREQUENCY_BANDS]; + + float chnlToFoaMtx[FOA_CHANNELS][MCMASA_MAX_ANA_CHANS]; + float chnlToFoaEvenMtx[FOA_CHANNELS][MCMASA_MAX_ANA_CHANS]; + float ls_azimuth[MCMASA_MAX_ANA_CHANS]; + int16_t leftNearest[MCMASA_MAX_ANA_CHANS]; + int16_t rightNearest[MCMASA_MAX_ANA_CHANS]; + int16_t numHorizontalChannels; + uint8_t isHorizontalSetup; + + float prevMultiChEne; + float prevDownmixEne; + float prevEQ; + float interpolator[L_FRAME48k]; + + MASA_DECODER_EXT_OUT_META_HANDLE hMasaOut; + SPHERICAL_GRID_DATA *sph_grid16; + + float energy[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + +} MCMASA_ANA_DATA, *MCMASA_ANA_HANDLE; + +/*----------------------------------------------------------------------------------* + * Object MASA (OMASA) analysis structure + *----------------------------------------------------------------------------------*/ + +typedef struct ivas_omasa_ana_data_structure +{ + int16_t nbands; + + /* CLDFB analysis */ + int16_t num_Cldfb_instances; + HANDLE_CLDFB_FILTER_BANK cldfbAnaEnc[MAX_NUM_OBJECTS]; + + /* DirAC parameter estimation */ + float **direction_vector_m[DIRAC_NUM_DIMS]; /* Average direction vector */ + int16_t band_grouping[MASA_FREQUENCY_BANDS + 1]; + int16_t block_grouping[5]; + + /* diffuseness */ + int16_t index_buffer_intensity; + float *buffer_intensity_real[DIRAC_NUM_DIMS][DIRAC_NO_COL_AVG_DIFF]; + float buffer_energy[DIRAC_NO_COL_AVG_DIFF * MASA_FREQUENCY_BANDS]; + + float chnlToFoaMtx[FOA_CHANNELS][MCMASA_MAX_ANA_CHANS]; + + float interpolator[L_FRAME48k]; + + float prev_object_dm_gains[MAX_NUM_OBJECTS][MASA_MAX_TRANSPORT_CHANNELS]; + + MASA_DECODER_EXT_OUT_META_HANDLE hMasaOut; + SPHERICAL_GRID_DATA *sph_grid16; + float ism_azimuth[MAX_NUM_OBJECTS]; + float ism_elevation[MAX_NUM_OBJECTS]; + + float energy[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + +} OMASA_ANA_DATA, *OMASA_ANA_HANDLE; + +/*----------------------------------------------------------------------------------* + * DirAC analysis structure + *----------------------------------------------------------------------------------*/ + +typedef struct ivas_dirac_ana_data_structure +{ + int16_t nbands; + + /* CLDFB analysis */ + int16_t num_Cldfb_instances; + HANDLE_CLDFB_FILTER_BANK cldfbAnaEnc[DIRAC_MAX_ANA_CHANS]; + + /* DirAC parameter estimation */ + float **direction_vector_m[DIRAC_NUM_DIMS]; /* Average direction vector */ + int16_t band_grouping[MASA_FREQUENCY_BANDS + 1]; + int16_t block_grouping[5]; + + /* diffuseness */ + int16_t index_buffer_intensity; + float *buffer_intensity_real[DIRAC_NUM_DIMS][DIRAC_NO_COL_AVG_DIFF]; + float buffer_energy[DIRAC_NO_COL_AVG_DIFF * MASA_FREQUENCY_BANDS]; + + MASA_DECODER_EXT_OUT_META_HANDLE hMasaOut; + SPHERICAL_GRID_DATA *sph_grid16; + + float energy[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + +} DIRAC_ANA_DATA, *DIRAC_ANA_HANDLE; + +/*----------------------------------------------------------------------------------* + * MASA prerend structure + *----------------------------------------------------------------------------------*/ + +typedef struct ivas_masa_prerend_data_structure +{ + /* CLDFB analysis */ + int16_t num_Cldfb_instances; + HANDLE_CLDFB_FILTER_BANK cldfbAnaEnc[MASA_MAX_TRANSPORT_CHANNELS]; + + MASA_DECODER_EXT_OUT_META_HANDLE hMasaOut; + SPHERICAL_GRID_DATA *sph_grid16; + + float energy[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + +} MASA_PREREND_DATA, *MASA_PREREND_HANDLE; + +#endif /* IVAS_STAT_REND_H */ diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c new file mode 100644 index 0000000000000000000000000000000000000000..f19d8f423f4e36d9b3b367d70e9a02725d735f3b --- /dev/null +++ b/lib_rend/lib_rend.c @@ -0,0 +1,6879 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include "options.h" +#include "lib_rend.h" +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_prot_rend.h" +#include "ivas_cnst.h" +#include "ivas_rom_com.h" +#include "ivas_rom_rend.h" +#include +#include +#include +#include "wmc_auto.h" + + +/*-------------------------------------------------------------------* + * Local constants + *-------------------------------------------------------------------*/ + +/* Maximum buffer length (per channel) in samples. + * Keep this separate from L_FRAME48k in case we want to support different size later */ +#define MAX_BUFFER_LENGTH_PER_CHANNEL ( L_FRAME48k ) + +/* Maximum buffer length (total) in samples. */ +/* Maximum buffer length (total) in samples. */ +#define MAX_BUFFER_LENGTH ( MAX_BUFFER_LENGTH_PER_CHANNEL * MAX_INPUT_CHANNELS ) + +#define MAX_BIN_DELAY_SAMPLES 50 /* Maximum supported rendering latency for binaural IRs */ + +/* Frame size required when rendering to binaural */ +#define BINAURAL_RENDERING_FRAME_SIZE_MS 5 + + +/*-------------------------------------------------------------------* + * Local types + *-------------------------------------------------------------------*/ + +typedef float pan_vector[MAX_OUTPUT_CHANNELS]; +typedef float pan_matrix[MAX_INPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; +typedef float rotation_gains[MAX_INPUT_CHANNELS][MAX_INPUT_CHANNELS]; +typedef float rotation_matrix[3][3]; + +/* EFAP wrapper to simplify writing panning gains to a vector that includes LFE channels */ +typedef struct +{ + EFAP_HANDLE hEfap; + AUDIO_CONFIG speakerConfig; + const LSSETUP_CUSTOM_STRUCT *pCustomLsSetup; /* Pointer to main custom LS struct from renderer handle - doesn't need freeing */ +} EFAP_WRAPPER; + +/* Lightweight helper struct that gathers all information required for rendering + * any config to any other config. Used to simplify signatures of rendering functions. + * + * This struct should store ONLY CONST POINTERS to data existing elsewhere. + * Storing pointers instead of data itself ensures that no additional updates + * are required when any of these are changed in the renderer. Making the pointers + * const ensures that this data is only read, but not modified by the rendering functions. */ +typedef struct +{ + const int32_t *pOutSampleRate; + const AUDIO_CONFIG *pOutConfig; + const LSSETUP_CUSTOM_STRUCT *pCustomLsOut; + const EFAP_WRAPPER *pEfapOutWrapper; + const IVAS_REND_HeadRotData *pHeadRotData; + const COMBINED_ORIENTATION_HANDLE *pCombinedOrientationData; +} rendering_context; + +/* Common base for input structs */ +typedef struct +{ + AUDIO_CONFIG inConfig; + IVAS_REND_InputId id; + IVAS_REND_AudioBuffer inputBuffer; + float gain; /* Linear, not in dB */ + rendering_context ctx; + int32_t numNewSamplesPerChannel; /* Used to keep track how much new audio was fed before rendering current frame */ +} input_base; + +typedef struct +{ + input_base base; + IVAS_ISM_METADATA currentPos; + IVAS_ISM_METADATA previousPos; + TDREND_WRAPPER tdRendWrapper; + CREND_WRAPPER_HANDLE crendWrapper; + REVERB_HANDLE hReverb; + rotation_matrix rot_mat_prev; + pan_vector prev_pan_gains; + int8_t firstFrameRendered; + float *bufferData; + int16_t nonDiegeticPan; + float nonDiegeticPanGain; + OMASA_ANA_HANDLE hOMasa; + uint16_t total_num_objects; + float ism_metadata_delay_ms; +} input_ism; + +typedef struct +{ + int16_t numLfeChannels; + bool pan_lfe; + float lfeInputGain; + float lfeOutputAzimuth; + float lfeOutputElevation; + IVAS_REND_LfePanMtx lfePanMtx; +} lfe_routing; + +typedef struct +{ + input_base base; + + /* Full panning matrix. 1st index is input channel, 2nd index is output channel. + All LFE channels should be included, both for inputs and outputs */ + pan_matrix panGains; + + LSSETUP_CUSTOM_STRUCT customLsInput; + EFAP_WRAPPER efapInWrapper; + TDREND_WRAPPER tdRendWrapper; + CREND_WRAPPER_HANDLE crendWrapper; + REVERB_HANDLE hReverb; + rotation_gains rot_gains_prev; + int16_t nonDiegeticPan; + float nonDiegeticPanGain; + lfe_routing lfeRouting; + float *bufferData; + int16_t binauralDelaySmp; + float *lfeDelayBuffer; + MCMASA_ANA_HANDLE hMcMasa; +} input_mc; + +typedef struct +{ + input_base base; + pan_matrix hoaDecMtx; + CREND_WRAPPER_HANDLE crendWrapper; + rotation_gains rot_gains_prev; + float *bufferData; + DIRAC_ANA_HANDLE hDirAC; +} input_sba; + + +/* Due to API of some rendering methods, the renderer has to use the decoder struct. + Only struct members relevant for rendering will be initialized, therefore typedef as "dummy" decoder struct */ +typedef Decoder_Struct DecoderDummy; + +typedef struct +{ + input_base base; + DecoderDummy *decDummy; + MASA_METADATA_FRAME masaMetadata; + bool metadataHasBeenFed; + float *bufferData; + MASA_PREREND_HANDLE hMasaPrerend; +} input_masa; + +struct IVAS_REND +{ + int32_t sampleRateOut; + + IVAS_LIMITER_HANDLE hLimiter; + + input_ism inputsIsm[RENDERER_MAX_ISM_INPUTS]; + input_mc inputsMc[RENDERER_MAX_MC_INPUTS]; + input_sba inputsSba[RENDERER_MAX_SBA_INPUTS]; + input_masa inputsMasa[RENDERER_MAX_MASA_INPUTS]; + + AUDIO_CONFIG inputConfig; + AUDIO_CONFIG outputConfig; + EFAP_WRAPPER efapOutWrapper; + IVAS_LSSETUP_CUSTOM_STRUCT customLsOut; + + IVAS_REND_HeadRotData headRotData; + + EXTERNAL_ORIENTATION_HANDLE hExternalOrientationData; + COMBINED_ORIENTATION_HANDLE hCombinedOrientationData; + + int8_t rendererConfigEnabled; + RENDER_CONFIG_DATA *hRendererConfig; /* Renderer config pointer */ + + int16_t num_subframes; +}; + + +/*-------------------------------------------------------------------* + * Local functions + *-------------------------------------------------------------------*/ + +static ivas_error allocateInputBaseBufferData( + float **data, + const int16_t data_size ) +{ + *data = (float *) malloc( data_size * sizeof( float ) ); + if ( *data == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for input base buffer data" ); + } + + return IVAS_ERR_OK; +} + +static void freeInputBaseBufferData( + float **data ) +{ + if ( *data != NULL ) + { + free( *data ); + *data = NULL; + } + + return; +} + +static ivas_error allocateMcLfeDelayBuffer( + float **lfeDelayBuffer, + const int16_t data_size ) +{ + *lfeDelayBuffer = (float *) malloc( data_size * sizeof( float ) ); + if ( *lfeDelayBuffer == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for LFE delay buffer" ); + } + + return IVAS_ERR_OK; +} + +static void freeMcLfeDelayBuffer( + float **lfeDelayBuffer ) +{ + if ( *lfeDelayBuffer != NULL ) + { + free( *lfeDelayBuffer ); + *lfeDelayBuffer = NULL; + } + + return; +} + +static IVAS_QUATERNION quaternionInit( + void ) +{ + IVAS_QUATERNION q; + q.w = 1.0f; + q.x = q.y = q.z = 0.0f; + return q; +} + +static float *getSmplPtr( + IVAS_REND_AudioBuffer buffer, + const uint32_t chnlIdx, + const uint32_t smplIdx ) +{ + return buffer.data + chnlIdx * buffer.config.numSamplesPerChannel + smplIdx; +} + + +static void copyBufferTo2dArray( + const IVAS_REND_AudioBuffer buffer, + float array[MAX_OUTPUT_CHANNELS][L_FRAME48k] ) +{ + uint32_t smplIdx; + uint32_t chnlIdx; + const float *readPtr; + + readPtr = buffer.data; + + for ( chnlIdx = 0; chnlIdx < (uint32_t) buffer.config.numChannels; ++chnlIdx ) + { + for ( smplIdx = 0; smplIdx < (uint32_t) buffer.config.numSamplesPerChannel; ++smplIdx ) + { + array[chnlIdx][smplIdx] = *readPtr++; + } + } + + return; +} + +static void accumulate2dArrayToBuffer( + float array[MAX_OUTPUT_CHANNELS][L_FRAME48k], + IVAS_REND_AudioBuffer *buffer ) +{ + int16_t smplIdx, chnlIdx; + float *writePtr; + + writePtr = buffer->data; + for ( chnlIdx = 0; chnlIdx < buffer->config.numChannels; ++chnlIdx ) + { + for ( smplIdx = 0; smplIdx < buffer->config.numSamplesPerChannel; ++smplIdx ) + { + *writePtr++ += array[chnlIdx][smplIdx]; + } + } + + return; +} + +/*-------------------------------------------------------------------* + * limitRendererOutput() + * + * In-place saturation control for multichannel buffers with adaptive release time + *-------------------------------------------------------------------*/ + +/*! r: number of clipped output samples */ +static int32_t limitRendererOutput( + IVAS_LIMITER_HANDLE hLimiter, /* i/o: limiter struct handle */ + float *output, /* i/o: I/O buffer */ + const int16_t output_frame, /* i : number of samples per channel in the buffer */ + const float threshold /* i : signal amplitude above which limiting starts to be applied */ +) +{ + int16_t i; + float **channels; + int16_t num_channels; + int32_t numClipping = 0; + + /* return early if given bad parameters */ + if ( hLimiter == NULL || output == NULL || output_frame <= 0 ) + { + return 0; + } + + channels = hLimiter->channel_ptrs; + num_channels = hLimiter->num_channels; + + for ( i = 0; i < num_channels; ++i ) + { + channels[i] = output + i * output_frame; + } + + limiter_process( hLimiter, output_frame, threshold, 0, NULL ); + + /* Apply clipping to buffer in case the limiter let through some samples > 1.0f */ + for ( i = 0; i < output_frame * num_channels; ++i ) + { + + output[i] = min( max( INT16_MIN, output[i] ), INT16_MAX ); + } + + return numClipping; +} + + +/*-------------------------------------------------------------------* + * validateOutputAudioConfig() + * + * + *-------------------------------------------------------------------*/ + +static ivas_error validateOutputAudioConfig( + const AUDIO_CONFIG outConfig ) +{ + switch ( outConfig ) + { + case IVAS_AUDIO_CONFIG_MONO: + case IVAS_AUDIO_CONFIG_STEREO: + case IVAS_AUDIO_CONFIG_5_1: + case IVAS_AUDIO_CONFIG_7_1: + case IVAS_AUDIO_CONFIG_5_1_2: + case IVAS_AUDIO_CONFIG_5_1_4: + case IVAS_AUDIO_CONFIG_7_1_4: + case IVAS_AUDIO_CONFIG_LS_CUSTOM: + case IVAS_AUDIO_CONFIG_FOA: + case IVAS_AUDIO_CONFIG_HOA2: + case IVAS_AUDIO_CONFIG_HOA3: + case IVAS_AUDIO_CONFIG_BINAURAL: + case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR: + case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB: + return IVAS_ERR_OK; + default: + break; + } + + return IVAS_ERR_INVALID_OUTPUT_FORMAT; +} + + +/*-------------------------------------------------------------------* + * getAudioConfigType() + * + * + *-------------------------------------------------------------------*/ + +IVAS_REND_AudioConfigType getAudioConfigType( + const AUDIO_CONFIG config ) +{ + IVAS_REND_AudioConfigType type; + + switch ( config ) + { + case IVAS_AUDIO_CONFIG_MONO: + case IVAS_AUDIO_CONFIG_STEREO: + case IVAS_AUDIO_CONFIG_5_1: + case IVAS_AUDIO_CONFIG_7_1: + case IVAS_AUDIO_CONFIG_5_1_2: + case IVAS_AUDIO_CONFIG_5_1_4: + case IVAS_AUDIO_CONFIG_7_1_4: + case IVAS_AUDIO_CONFIG_LS_CUSTOM: + type = IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED; + break; + case IVAS_AUDIO_CONFIG_FOA: + case IVAS_AUDIO_CONFIG_HOA2: + case IVAS_AUDIO_CONFIG_HOA3: + type = IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS; + break; + case IVAS_AUDIO_CONFIG_OBA: + type = IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED; + break; + case IVAS_AUDIO_CONFIG_BINAURAL: + case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR: + case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB: + case IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM: + case IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED: + type = IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL; + break; + case IVAS_AUDIO_CONFIG_MASA1: + case IVAS_AUDIO_CONFIG_MASA2: + type = IVAS_REND_AUDIO_CONFIG_TYPE_MASA; + break; + default: + type = IVAS_REND_AUDIO_CONFIG_TYPE_UNKNOWN; + break; + } + + return type; +} + + +/*-------------------------------------------------------------------* + * validateOutputSampleRate() + * + * + *-------------------------------------------------------------------*/ + +static ivas_error validateOutputSampleRate( + const int32_t sampleRate, + const AUDIO_CONFIG outConfig ) +{ + if ( getAudioConfigType( outConfig ) != IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL ) + { + /* If no binaural rendering, any sampling rate is supported */ + return IVAS_ERR_OK; + } + + /* Otherwise rendering to binaural, support the same set as IVAS decoder */ + switch ( sampleRate ) + { + case 8000: + case 16000: + case 32000: + case 48000: + return IVAS_ERR_OK; + } + + return IVAS_ERR_INVALID_SAMPLING_RATE; +} + + +/*-------------------------------------------------------------------* + * getAudioConfigNumChannels() + * + * + *-------------------------------------------------------------------*/ + +ivas_error getAudioConfigNumChannels( + const AUDIO_CONFIG config, + int16_t *numChannels ) +{ + switch ( config ) + { + case IVAS_AUDIO_CONFIG_MONO: + case IVAS_AUDIO_CONFIG_OBA: + case IVAS_AUDIO_CONFIG_MASA1: + *numChannels = 1; + break; + case IVAS_AUDIO_CONFIG_STEREO: + case IVAS_AUDIO_CONFIG_BINAURAL: + case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR: + case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB: + case IVAS_AUDIO_CONFIG_MASA2: + *numChannels = 2; + break; + case IVAS_AUDIO_CONFIG_FOA: + *numChannels = 4; + break; + case IVAS_AUDIO_CONFIG_5_1: + *numChannels = 6; + break; + case IVAS_AUDIO_CONFIG_7_1: + case IVAS_AUDIO_CONFIG_5_1_2: + *numChannels = 8; + break; + case IVAS_AUDIO_CONFIG_HOA2: + *numChannels = 9; + break; + case IVAS_AUDIO_CONFIG_5_1_4: + *numChannels = 10; + break; + case IVAS_AUDIO_CONFIG_7_1_4: + *numChannels = 12; + break; + case IVAS_AUDIO_CONFIG_HOA3: + *numChannels = 16; + break; + default: + return IVAS_ERR_NUM_CHANNELS_UNKNOWN; + } + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * Local functions + *-------------------------------------------------------------------*/ + +static ivas_error initLimiter( + IVAS_LIMITER_HANDLE *phLimiter, + const int16_t numChannels, + const int32_t sampleRate ) +{ + ivas_error error; + + /* If re-initializing with unchanged values, return early */ + if ( *phLimiter != NULL && ( *phLimiter )->num_channels == numChannels && ( *phLimiter )->sampling_rate == sampleRate ) + { + return IVAS_ERR_OK; + } + + /* Support re-init: close if already allocated */ + if ( *phLimiter != NULL ) + { + ivas_limiter_close( phLimiter ); + } + + if ( ( error = ivas_limiter_open( phLimiter, numChannels, sampleRate ) ) != IVAS_ERR_OK ) + { + return error; + } + + return IVAS_ERR_OK; +} + + +static LSSETUP_CUSTOM_STRUCT defaultCustomLs( + void ) +{ + LSSETUP_CUSTOM_STRUCT ls; + + /* Set mono by default. This simplifies initialization, + since output config is never in an undefined state. */ + ls.is_planar_setup = 1; + ls.num_spk = 1; + set_zero( ls.ls_azimuth, MAX_OUTPUT_CHANNELS ); + set_zero( ls.ls_elevation, MAX_OUTPUT_CHANNELS ); + ls.num_lfe = 0; + set_s( ls.lfe_idx, 0, MAX_OUTPUT_CHANNELS ); + ls.separate_ch_found = 0; + set_f( ls.separate_ch_gains, 0, MAX_OUTPUT_CHANNELS ); + + return ls; +} + + +static ivas_error getSpeakerAzimuths( + AUDIO_CONFIG config, + const float **azimuths ) +{ + switch ( config ) + { + case IVAS_AUDIO_CONFIG_MONO: + *azimuths = ls_azimuth_CICP1; + break; + case IVAS_AUDIO_CONFIG_STEREO: + *azimuths = ls_azimuth_CICP2; + break; + case IVAS_AUDIO_CONFIG_5_1: + *azimuths = ls_azimuth_CICP6; + break; + case IVAS_AUDIO_CONFIG_7_1: + *azimuths = ls_azimuth_CICP12; + break; + case IVAS_AUDIO_CONFIG_5_1_2: + *azimuths = ls_azimuth_CICP14; + break; + case IVAS_AUDIO_CONFIG_5_1_4: + *azimuths = ls_azimuth_CICP16; + break; + case IVAS_AUDIO_CONFIG_7_1_4: + *azimuths = ls_azimuth_CICP19; + break; + default: + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Unexpected audio config" ); + } + + return IVAS_ERR_OK; +} + + +static ivas_error getSpeakerElevations( + AUDIO_CONFIG config, + const float **elevations ) +{ + switch ( config ) + { + case IVAS_AUDIO_CONFIG_MONO: + *elevations = ls_elevation_CICP1; + break; + case IVAS_AUDIO_CONFIG_STEREO: + *elevations = ls_elevation_CICP2; + break; + case IVAS_AUDIO_CONFIG_5_1: + *elevations = ls_elevation_CICP6; + break; + case IVAS_AUDIO_CONFIG_7_1: + *elevations = ls_elevation_CICP12; + break; + case IVAS_AUDIO_CONFIG_5_1_2: + *elevations = ls_elevation_CICP14; + break; + case IVAS_AUDIO_CONFIG_5_1_4: + *elevations = ls_elevation_CICP16; + break; + case IVAS_AUDIO_CONFIG_7_1_4: + *elevations = ls_elevation_CICP19; + break; + default: + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Unexpected audio config" ); + } + + return IVAS_ERR_OK; +} + + +static ivas_error getAmbisonicsOrder( + AUDIO_CONFIG config, + int16_t *order ) +{ + switch ( config ) + { + case IVAS_AUDIO_CONFIG_FOA: + *order = 1; + break; + case IVAS_AUDIO_CONFIG_HOA2: + *order = 2; + break; + case IVAS_AUDIO_CONFIG_HOA3: + *order = 3; + break; + default: + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Unsupported audio config" ); + } + + return IVAS_ERR_OK; +} + + +static int16_t getNumLfeChannels( + input_mc *inputMc ) +{ + switch ( inputMc->base.inConfig ) + { + case IVAS_AUDIO_CONFIG_5_1: + case IVAS_AUDIO_CONFIG_7_1: + case IVAS_AUDIO_CONFIG_5_1_2: + case IVAS_AUDIO_CONFIG_5_1_4: + case IVAS_AUDIO_CONFIG_7_1_4: + return 1; + case IVAS_AUDIO_CONFIG_LS_CUSTOM: + return inputMc->customLsInput.num_lfe; + default: + break; + } + + return 0; +} + +static ivas_error getNumNonLfeChannelsInSpeakerLayout( + AUDIO_CONFIG config, + int16_t *numNonLfeChannels ) +{ + switch ( config ) + { + case IVAS_AUDIO_CONFIG_MONO: + *numNonLfeChannels = 1; + break; + case IVAS_AUDIO_CONFIG_STEREO: + *numNonLfeChannels = 2; + break; + case IVAS_AUDIO_CONFIG_5_1: + *numNonLfeChannels = 5; + break; + case IVAS_AUDIO_CONFIG_5_1_2: + case IVAS_AUDIO_CONFIG_7_1: + *numNonLfeChannels = 7; + break; + case IVAS_AUDIO_CONFIG_5_1_4: + *numNonLfeChannels = 9; + break; + case IVAS_AUDIO_CONFIG_7_1_4: + *numNonLfeChannels = 11; + break; + default: + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Unexpected audio config" ); + } + + return IVAS_ERR_OK; +} + +static ivas_error getMcConfigValues( + AUDIO_CONFIG inConfig, + const LSSETUP_CUSTOM_STRUCT *pInCustomLs, + const float **azimuth, + const float **elevation, + int16_t *lfe_idx, + int16_t *is_planar ) +{ + int16_t i; + ivas_error error; + + *lfe_idx = -1; + *is_planar = 1; + switch ( inConfig ) + { + case IVAS_AUDIO_CONFIG_LS_CUSTOM: + *azimuth = (const float *) &pInCustomLs->ls_azimuth; + *elevation = (const float *) &pInCustomLs->ls_elevation; + if ( pInCustomLs->num_lfe > 0 ) + { + *lfe_idx = pInCustomLs->lfe_idx[0]; + } + for ( i = 0; i < pInCustomLs->num_spk; i++ ) + { + if ( pInCustomLs->ls_elevation[i] != 0 ) + { + *is_planar = 0; + break; + } + } + break; + case IVAS_AUDIO_CONFIG_MONO: + case IVAS_AUDIO_CONFIG_STEREO: + if ( ( error = getSpeakerAzimuths( inConfig, azimuth ) ) != IVAS_ERR_OK ) + { + return error; + } + if ( ( error = getSpeakerElevations( inConfig, elevation ) ) != IVAS_ERR_OK ) + { + return error; + } + break; + case IVAS_AUDIO_CONFIG_5_1: + case IVAS_AUDIO_CONFIG_7_1: + case IVAS_AUDIO_CONFIG_5_1_2: + case IVAS_AUDIO_CONFIG_5_1_4: + case IVAS_AUDIO_CONFIG_7_1_4: + if ( ( error = getSpeakerAzimuths( inConfig, azimuth ) ) != IVAS_ERR_OK ) + { + return error; + } + if ( ( error = getSpeakerElevations( inConfig, elevation ) ) != IVAS_ERR_OK ) + { + return error; + } + *lfe_idx = LFE_CHANNEL; + *is_planar = ( inConfig == IVAS_AUDIO_CONFIG_5_1 || inConfig == IVAS_AUDIO_CONFIG_7_1 ) ? 1 : 0; + break; + default: + assert( !"Invalid speaker config" ); + return IVAS_ERR_WRONG_PARAMS; + } + + return IVAS_ERR_OK; +} + + +static ivas_error initEfap( + EFAP_WRAPPER *pEfapWrapper, + AUDIO_CONFIG outConfig, + const LSSETUP_CUSTOM_STRUCT *pCustomLsOut ) +{ + ivas_error error; + const float *azimuths; + const float *elevations; + int16_t numNonLfeChannels; + + if ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR || outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) + { + pEfapWrapper->speakerConfig = IVAS_AUDIO_CONFIG_7_1_4; + } + else + { + pEfapWrapper->speakerConfig = outConfig; + } + pEfapWrapper->pCustomLsSetup = pCustomLsOut; + + /* If re-initializing, free existing EFAP handle. */ + if ( pEfapWrapper->hEfap != NULL ) + { + efap_free_data( &pEfapWrapper->hEfap ); + } + + /* Only initialize EFAP handle if output config is channel-based */ + if ( getAudioConfigType( pEfapWrapper->speakerConfig ) != IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) + { + pEfapWrapper->hEfap = NULL; + return IVAS_ERR_OK; + } + + if ( outConfig == IVAS_AUDIO_CONFIG_LS_CUSTOM ) + { + if ( ( error = efap_init_data( &pEfapWrapper->hEfap, pCustomLsOut->ls_azimuth, pCustomLsOut->ls_elevation, pCustomLsOut->num_spk, EFAP_MODE_EFAP ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + if ( ( error = getSpeakerAzimuths( pEfapWrapper->speakerConfig, &azimuths ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = getSpeakerElevations( pEfapWrapper->speakerConfig, &elevations ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = getNumNonLfeChannelsInSpeakerLayout( pEfapWrapper->speakerConfig, &numNonLfeChannels ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = efap_init_data( &pEfapWrapper->hEfap, azimuths, elevations, numNonLfeChannels, EFAP_MODE_EFAP ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + return IVAS_ERR_OK; +} + + +static ivas_error getEfapGains( + EFAP_WRAPPER efapWrapper, + const float azi, + const float ele, + pan_vector panGains ) +{ + pan_vector tmpPanGains; /* tmp pan gain buffer without LFE channels */ + float *readPtr; + int16_t i; + int16_t lfeCount; + int16_t numChannels; + ivas_error error; + + /* EFAP returns an array of gains only for non-LFE speakers */ + efap_determine_gains( efapWrapper.hEfap, tmpPanGains, azi, ele, EFAP_MODE_EFAP ); + + /* Now copy to buffer that includes LFE channels */ + if ( efapWrapper.speakerConfig == IVAS_AUDIO_CONFIG_LS_CUSTOM ) + { + numChannels = efapWrapper.pCustomLsSetup->num_spk + efapWrapper.pCustomLsSetup->num_lfe; + readPtr = tmpPanGains; + + for ( i = 0, lfeCount = 0; i < numChannels; ++i ) + { + if ( lfeCount < efapWrapper.pCustomLsSetup->num_lfe && i == efapWrapper.pCustomLsSetup->lfe_idx[lfeCount] ) + { + panGains[i] = 0.0f; + ++lfeCount; + } + else + { + panGains[i] = *readPtr; + ++readPtr; + } + } + } + else + { + if ( ( error = getAudioConfigNumChannels( efapWrapper.speakerConfig, &numChannels ) ) != IVAS_ERR_OK ) + { + return error; + } + + readPtr = tmpPanGains; + + for ( i = 0; i < numChannels; ++i ) + { + if ( i == LFE_CHANNEL ) + { + panGains[i] = 0.0f; + } + else + { + panGains[i] = *readPtr; + ++readPtr; + } + } + } + + return IVAS_ERR_OK; +} + + +static ivas_error initHeadRotation( + IVAS_REND_HANDLE hIvasRend ) +{ + int16_t i, crossfade_len; + float tmp; + ivas_error error; + + /* Head rotation is enabled by default */ + hIvasRend->headRotData.headRotEnabled = 1; + + /* Initialize 5ms crossfade */ + crossfade_len = L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES; + tmp = 1.f / ( crossfade_len - 1 ); + for ( i = 0; i < crossfade_len; i++ ) + { + hIvasRend->headRotData.crossfade[i] = i * tmp; + } + + /* Initialize with unit quaternions */ + for ( i = 0; i < hIvasRend->num_subframes; ++i ) + { + hIvasRend->headRotData.headPositions[i] = quaternionInit(); + } + + + if ( ( hIvasRend->headRotData.hOrientationTracker = (ivas_orient_trk_state_t *) malloc( sizeof( ivas_orient_trk_state_t ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Orientation tracking" ); + } + + if ( ( error = ivas_orient_trk_Init( hIvasRend->headRotData.hOrientationTracker ) ) != IVAS_ERR_OK ) + { + return error; + } + + return IVAS_ERR_OK; +} + +static void closeHeadRotation( + IVAS_REND_HANDLE hIvasRend ) +{ + if ( ( hIvasRend != NULL ) && ( hIvasRend->headRotData.hOrientationTracker != NULL ) ) + { + free( hIvasRend->headRotData.hOrientationTracker ); + } + + return; +} + + +static void initRotMatrix( + rotation_matrix rot_mat ) +{ + int16_t i; + + /* Initialize rotation matrices */ + for ( i = 0; i < 3; i++ ) + { + set_zero( rot_mat[i], 3 ); + rot_mat[i][i] = 1.f; + } + + return; +} + + +static void initRotGains( + rotation_gains rot_gains ) +{ + int16_t i; + + /* Set gains to passthrough */ + for ( i = 0; i < MAX_INPUT_CHANNELS; i++ ) + { + set_zero( rot_gains[i], MAX_INPUT_CHANNELS ); + rot_gains[i][i] = 1.f; + } + + return; +} + + +static void initRendInputBase( + input_base *inputBase, + const AUDIO_CONFIG inConfig, + const IVAS_REND_InputId id, + const rendering_context rendCtx, + float *dataBuf, + const int16_t dataBufSize ) +{ + inputBase->inConfig = inConfig; + inputBase->id = id; + inputBase->gain = 1.0f; + inputBase->ctx = rendCtx; + inputBase->numNewSamplesPerChannel = 0; + + inputBase->inputBuffer.config.numSamplesPerChannel = 0; + inputBase->inputBuffer.config.numChannels = 0; + inputBase->inputBuffer.data = dataBuf; + if ( inputBase->inputBuffer.data != NULL ) + { + set_zero( inputBase->inputBuffer.data, dataBufSize ); + } + + return; +} + + +static IVAS_ISM_METADATA defaultObjectPosition( + void ) +{ + IVAS_ISM_METADATA pos; + + pos.azimuth = 0.0f; + pos.elevation = 0.0f; + pos.radius = 1.0f; + pos.spread = 0.0f; + pos.gainFactor = 1.0f; + pos.yaw = 0.0f; + pos.pitch = 0.0f; + pos.non_diegetic_flag = 0; + + return pos; +} + + +static int8_t checkObjectPositionChanged( + IVAS_ISM_METADATA *currentPos, + IVAS_ISM_METADATA *previousPos ) +{ + return !( fabs( currentPos->azimuth - previousPos->azimuth ) < EPSILON && + fabs( currentPos->elevation - previousPos->elevation ) < EPSILON ); +} + + +static rendering_context getRendCtx( + IVAS_REND_HANDLE hIvasRend ) +{ + rendering_context ctx; + + /* Note: when refactoring this, always take the ADDRESS of a member of the + * renderer struct, so that the context stores a POINTER to the member, even + * if the member is a pointer or handle itself. */ + ctx.pOutConfig = &hIvasRend->outputConfig; + ctx.pOutSampleRate = &hIvasRend->sampleRateOut; + ctx.pCustomLsOut = &hIvasRend->customLsOut; + ctx.pEfapOutWrapper = &hIvasRend->efapOutWrapper; + ctx.pHeadRotData = &hIvasRend->headRotData; + ctx.pCombinedOrientationData = &hIvasRend->hCombinedOrientationData; + + return ctx; +} + + +static TDREND_WRAPPER defaultTdRendWrapper( + void ) +{ + TDREND_WRAPPER w; + + w.binaural_latency_ns = 0; + w.hBinRendererTd = NULL; + w.hHrtfTD = NULL; + + return w; +} + + +static CREND_WRAPPER defaultCrendWrapper( + void ) +{ + CREND_WRAPPER w; + + w.hCrend = NULL; + w.hHrtfCrend = NULL; + w.binaural_latency_ns = 0; + + return w; +} + + +static bool isIoConfigPairSupported( + const AUDIO_CONFIG inConfig, + const AUDIO_CONFIG outConfig ) +{ + /* Rendering mono or stereo to binaural is not supported */ + if ( ( inConfig == IVAS_AUDIO_CONFIG_MONO || inConfig == IVAS_AUDIO_CONFIG_STEREO ) && getAudioConfigType( outConfig ) == IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL ) + { + return false; + } + + /* If not returned so far, config pair is supported */ + return true; +} + + +static ivas_error initIsmMasaRendering( + input_ism *inputIsm, + const int32_t inSampleRate ) +{ + ivas_error error; + + if ( inputIsm->tdRendWrapper.hBinRendererTd != NULL ) + { + ivas_td_binaural_close( &inputIsm->tdRendWrapper.hBinRendererTd ); + inputIsm->tdRendWrapper.hHrtfTD = NULL; + } + + ivas_rend_closeCrend( &inputIsm->crendWrapper ); + + ivas_reverb_close( &inputIsm->hReverb ); + + if ( ( error = ivas_omasa_ana_open( &inputIsm->hOMasa, inSampleRate, inputIsm->total_num_objects ) ) != IVAS_ERR_OK ) + { + return error; + } + + return IVAS_ERR_OK; +} + + +static ivas_error setRendInputActiveIsm( + void *input, + const AUDIO_CONFIG inConfig, + const IVAS_REND_InputId id, + RENDER_CONFIG_DATA *hRendCfg ) +{ + ivas_error error; + rendering_context rendCtx; + AUDIO_CONFIG outConfig; + input_ism *inputIsm; + + inputIsm = (input_ism *) input; + rendCtx = inputIsm->base.ctx; + outConfig = *rendCtx.pOutConfig; + + if ( !isIoConfigPairSupported( inConfig, outConfig ) ) + { + return IVAS_ERR_IO_CONFIG_PAIR_NOT_SUPPORTED; + } + + if ( ( error = allocateInputBaseBufferData( &inputIsm->bufferData, MAX_BUFFER_LENGTH ) ) != IVAS_ERR_OK ) + { + return error; + } + initRendInputBase( &inputIsm->base, inConfig, id, rendCtx, inputIsm->bufferData, MAX_BUFFER_LENGTH ); + + inputIsm->firstFrameRendered = FALSE; + + inputIsm->currentPos = defaultObjectPosition(); + inputIsm->previousPos = defaultObjectPosition(); + inputIsm->crendWrapper = NULL; + inputIsm->hReverb = NULL; + inputIsm->tdRendWrapper = defaultTdRendWrapper(); + initRotMatrix( inputIsm->rot_mat_prev ); + set_zero( inputIsm->prev_pan_gains, MAX_OUTPUT_CHANNELS ); + + + inputIsm->hOMasa = NULL; + + error = IVAS_ERR_OK; + + if ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) + { + if ( ( error = ivas_rend_openCrend( &inputIsm->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( outConfig == IVAS_AUDIO_CONFIG_MASA1 || outConfig == IVAS_AUDIO_CONFIG_MASA2 ) + { + if ( ( error = initIsmMasaRendering( inputIsm, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + if ( ( error = ivas_td_binaural_open_ext( &inputIsm->tdRendWrapper, inConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) + { + if ( ( error = ivas_reverb_open( &( inputIsm->hReverb ), outConfig, NULL, inputIsm->tdRendWrapper.hBinRendererTd->HrFiltSet_p->lr_energy_and_iac, hRendCfg, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + + return IVAS_ERR_OK; +} + + +static void clearInputIsm( + input_ism *inputIsm ) +{ + rendering_context rendCtx; + + rendCtx = inputIsm->base.ctx; + + freeInputBaseBufferData( &inputIsm->base.inputBuffer.data ); + initRendInputBase( &inputIsm->base, IVAS_AUDIO_CONFIG_INVALID, 0, rendCtx, NULL, 0 ); + + /* Free input's internal handles */ + ivas_rend_closeCrend( &inputIsm->crendWrapper ); + + ivas_reverb_close( &inputIsm->hReverb ); + + if ( inputIsm->tdRendWrapper.hBinRendererTd != NULL ) + { + ivas_td_binaural_close( &inputIsm->tdRendWrapper.hBinRendererTd ); + inputIsm->tdRendWrapper.hHrtfTD = NULL; + } + + + ivas_omasa_ana_close( &( inputIsm->hOMasa ) ); + + return; +} + + +static void copyLsConversionMatrixToPanMatrix( + const LS_CONVERSION_MATRIX *lsConvMatrix, + pan_matrix panMatrix ) +{ + int16_t i; + int16_t inCh, outCh; + int16_t numNonZeroGains; + int16_t numColumns; + + /* Index 0 is special and describes the following values */ + numNonZeroGains = lsConvMatrix[0].index; + numColumns = (int16_t) lsConvMatrix[0].value; + + for ( i = 1; i < numNonZeroGains + 1; ++i ) + { + inCh = lsConvMatrix[i].index / numColumns; + outCh = lsConvMatrix[i].index % numColumns; + + panMatrix[inCh][outCh] = lsConvMatrix[i].value; + } + + return; +} + + +static void setZeroPanMatrix( + pan_matrix panMatrix ) +{ + int16_t i; + + for ( i = 0; i < MAX_INPUT_CHANNELS; ++i ) + { + set_zero( panMatrix[i], MAX_OUTPUT_CHANNELS ); + } + + return; +} + + +/* Note: this only sets non-zero elements, call setZeroPanMatrix() to init first. */ +static void fillIdentityPanMatrix( + pan_matrix panMatrix ) +{ + int16_t i; + + for ( i = 0; i < min( MAX_INPUT_CHANNELS, MAX_OUTPUT_CHANNELS ); ++i ) + { + panMatrix[i][i] = 1.0f; + } + + return; +} + + +static ivas_error initMcPanGainsWithIdentMatrix( + input_mc *inputMc ) +{ + fillIdentityPanMatrix( inputMc->panGains ); + + return IVAS_ERR_OK; +} + + +static ivas_error initMcPanGainsWithConversionMapping( + input_mc *inputMc, + const AUDIO_CONFIG outConfig ) +{ + AUDIO_CONFIG ivasConfigIn, ivasConfigOut; + int16_t i; + + ivasConfigIn = inputMc->base.inConfig; + ivasConfigOut = outConfig; + + /* Find conversion mapping for current I/O config pair. + * Stay with default panning matrix if conversion_matrix is NULL */ + for ( i = 0; i < LS_SETUP_CONVERSION_NUM_MAPPINGS; ++i ) + { + if ( ls_conversion_mapping[i].input_config == ivasConfigIn && ls_conversion_mapping[i].output_config == ivasConfigOut ) + { + /* Mapping found with valid matrix - copy */ + if ( ls_conversion_mapping[i].conversion_matrix != NULL ) + { + copyLsConversionMatrixToPanMatrix( ls_conversion_mapping[i].conversion_matrix, inputMc->panGains ); + } + /* Mapping found with NULL matrix - use identity matrix */ + else + { + fillIdentityPanMatrix( inputMc->panGains ); + } + + return IVAS_ERR_OK; + } + } + + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Missing multichannel conversion mapping" ); +} + + +static ivas_error initMcPanGainsWithEfap( + input_mc *inputMc, + const AUDIO_CONFIG outConfig ) +{ + int16_t i; + int16_t numNonLfeInChannels; + int16_t inLfeChIdx, outChIdx; + const float *spkAzi, *spkEle; + ivas_error error; + + if ( inputMc->base.inConfig != IVAS_AUDIO_CONFIG_LS_CUSTOM ) + { + if ( ( error = getNumNonLfeChannelsInSpeakerLayout( inputMc->base.inConfig, &numNonLfeInChannels ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = getSpeakerAzimuths( inputMc->base.inConfig, &spkAzi ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = getSpeakerElevations( inputMc->base.inConfig, &spkEle ) ) != IVAS_ERR_OK ) + { + return error; + } + + inLfeChIdx = LFE_CHANNEL; + } + else + { + numNonLfeInChannels = inputMc->customLsInput.num_spk; + spkAzi = inputMc->customLsInput.ls_azimuth; + spkEle = inputMc->customLsInput.ls_elevation; + inLfeChIdx = -1; + if ( inputMc->customLsInput.num_lfe > 0 ) + { + inLfeChIdx = inputMc->customLsInput.lfe_idx[0]; + } + } + + for ( i = 0, outChIdx = 0; i < numNonLfeInChannels; ++i, ++outChIdx ) + { + if ( i == inLfeChIdx ) + { + ++outChIdx; + } + + if ( ( error = getEfapGains( *inputMc->base.ctx.pEfapOutWrapper, spkAzi[i], spkEle[i], inputMc->panGains[outChIdx] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( outConfig != IVAS_AUDIO_CONFIG_LS_CUSTOM && inLfeChIdx >= 0 ) + { + inputMc->panGains[inLfeChIdx][LFE_CHANNEL] = 1; + } + else if ( inputMc->base.ctx.pCustomLsOut->num_lfe > 0 && inLfeChIdx >= 0 ) + { + inputMc->panGains[inLfeChIdx][inputMc->base.ctx.pCustomLsOut->lfe_idx[0]] = 1; + } + + return IVAS_ERR_OK; +} + + +static ivas_error getRendInputNumChannels( + const void *rendInput, + int16_t *numInChannels ) +{ + /* Using a void pointer for this function to be reusable for any input type (input_ism, input_mc, input_sba). + Assumptions: - input_base is always the first member in the input struct */ + + ivas_error error; + const input_base *pInputBase; + const input_mc *pInputMc; + + pInputBase = (const input_base *) rendInput; + + if ( pInputBase->inConfig == IVAS_AUDIO_CONFIG_LS_CUSTOM ) + { + pInputMc = (const input_mc *) rendInput; + *numInChannels = pInputMc->customLsInput.num_spk + pInputMc->customLsInput.num_lfe; + } + else + { + if ( ( error = getAudioConfigNumChannels( pInputBase->inConfig, numInChannels ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + return IVAS_ERR_OK; +} + + +static ivas_error initMcPanGainsWithMonoOut( + input_mc *inputMc ) +{ + int16_t i; + int16_t numInChannels; + int16_t readIdx; + int16_t writeIdx; + bool skipSideSpeakers; + ivas_error error; + + if ( ( error = getRendInputNumChannels( inputMc, &numInChannels ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( inputMc->base.inConfig == IVAS_AUDIO_CONFIG_LS_CUSTOM ) + { + for ( i = 0; i < numInChannels; ++i ) + { + /* It's OK to also set gain 1 for LFE input channels here. + * Correct LFE handling will be applied within updateMcPanGains() */ + inputMc->panGains[i][0] = 1.f; + } + } + else if ( inputMc->base.inConfig == IVAS_AUDIO_CONFIG_STEREO ) + { + /* Special case for STEREO to MONO: Passive downmix (L+R)/2 */ + inputMc->panGains[0][0] = 0.5; + inputMc->panGains[1][0] = 0.5; + } + else + { + /* ls_conversion_cicpX_stereo contains gains for side speakers. + * These should be skipped with 5.1+X inputs. */ + skipSideSpeakers = false; + if ( inputMc->base.inConfig == IVAS_AUDIO_CONFIG_5_1_2 || inputMc->base.inConfig == IVAS_AUDIO_CONFIG_5_1_4 ) + { + skipSideSpeakers = true; + } + for ( readIdx = 0, writeIdx = 0; writeIdx < numInChannels; ++readIdx, ++writeIdx ) + { + if ( skipSideSpeakers && readIdx == 4 ) + { + /* Skip gains for side speakers in lookup table */ + readIdx += 2; + } + + inputMc->panGains[writeIdx][0] = ls_conversion_cicpX_mono[readIdx][0]; + } + } + + return IVAS_ERR_OK; +} + + +static ivas_error initMcPanGainsWithStereoLookup( + input_mc *inputMc ) +{ + int16_t readIdx; + int16_t writeIdx; + bool skipSideSpeakers; + int16_t numInChannels; + ivas_error error; + + /* Special case - MONO input. + * Use gains for center CICP speaker and return early. */ + if ( inputMc->base.inConfig == IVAS_AUDIO_CONFIG_MONO ) + { + inputMc->panGains[0][0] = ls_conversion_cicpX_stereo[2][0]; + inputMc->panGains[0][1] = ls_conversion_cicpX_stereo[2][1]; + return IVAS_ERR_OK; + } + + /* ls_conversion_cicpX_stereo contains gains for side speakers. + * These should be skipped with 5.1+X inputs. */ + skipSideSpeakers = false; + if ( inputMc->base.inConfig == IVAS_AUDIO_CONFIG_5_1_2 || inputMc->base.inConfig == IVAS_AUDIO_CONFIG_5_1_4 ) + { + skipSideSpeakers = true; + } + + if ( ( error = getRendInputNumChannels( inputMc, &numInChannels ) ) != IVAS_ERR_OK ) + { + return error; + } + + for ( readIdx = 0, writeIdx = 0; writeIdx < numInChannels; ++readIdx, ++writeIdx ) + { + if ( skipSideSpeakers && readIdx == 4 ) + { + /* Skip gains for side speakers in lookup table */ + readIdx += 2; + } + + inputMc->panGains[writeIdx][0] = ls_conversion_cicpX_stereo[readIdx][0]; + inputMc->panGains[writeIdx][1] = ls_conversion_cicpX_stereo[readIdx][1]; + } + + return IVAS_ERR_OK; +} + + +/* Returns 1 (true) if configs A and B are equal, otherwise returns 0 (false). + * If both configs are custom LS layouts, layout details are compared to determine equality. */ +static bool configsAreEqual( + const AUDIO_CONFIG configA, + const LSSETUP_CUSTOM_STRUCT customLsA, + const AUDIO_CONFIG configB, + const LSSETUP_CUSTOM_STRUCT customLsB ) +{ + int16_t i; + + /* Both input and output are custom LS - compare structs */ + if ( configA == IVAS_AUDIO_CONFIG_LS_CUSTOM && configB == IVAS_AUDIO_CONFIG_LS_CUSTOM ) + { + if ( customLsA.num_spk != customLsB.num_spk ) + { + return false; + } + + if ( customLsA.num_lfe != customLsB.num_lfe ) + { + return false; + } + + if ( customLsA.is_planar_setup != customLsB.is_planar_setup ) + { + return false; + } + + for ( i = 0; i < customLsA.num_spk; ++i ) + { + /* Compare to nearest degree (hence the int16_t cast) */ + if ( (int16_t) customLsA.ls_azimuth[i] != (int16_t) customLsB.ls_azimuth[i] || + (int16_t) customLsA.ls_elevation[i] != (int16_t) customLsB.ls_elevation[i] ) + { + return false; + } + } + for ( i = 0; i < customLsA.num_lfe; ++i ) + { + if ( customLsA.lfe_idx[i] != customLsB.lfe_idx[i] ) + { + return false; + } + } + + return true; + } + + /* Otherwise it's enough to compare config enums */ + return configA == configB; +} + + +static ivas_error updateLfePanGainsForMcOut( + input_mc *inputMc, + const AUDIO_CONFIG outConfig ) +{ + int16_t i, numLfeIn, numOutChannels; + ivas_error error; + error = IVAS_ERR_OK; + + /* If panning is not required, simply return */ + if ( !inputMc->lfeRouting.pan_lfe ) + { + return error; + } + + numLfeIn = getNumLfeChannels( inputMc ); + + if ( outConfig == IVAS_AUDIO_CONFIG_LS_CUSTOM ) + { + numOutChannels = inputMc->base.ctx.pCustomLsOut->num_spk + inputMc->base.ctx.pCustomLsOut->num_lfe; + } + else + { + if ( ( error = getAudioConfigNumChannels( outConfig, &numOutChannels ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + for ( i = 0; i < numLfeIn; i++ ) + { + /* panning gains */ + if ( ( error = getEfapGains( *inputMc->base.ctx.pEfapOutWrapper, inputMc->lfeRouting.lfeOutputAzimuth, inputMc->lfeRouting.lfeOutputElevation, inputMc->lfeRouting.lfePanMtx[i] ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* linear input gain */ + v_multc( inputMc->lfeRouting.lfePanMtx[i], inputMc->lfeRouting.lfeInputGain, inputMc->lfeRouting.lfePanMtx[i], numOutChannels ); + } + + return error; +} + + +static ivas_error updateLfePanGainsForAmbiOut( + input_mc *inputMc, + const AUDIO_CONFIG outConfig ) +{ + int16_t i; + int16_t numLfeIn, outAmbiOrder; + ivas_error error; + error = IVAS_ERR_OK; + + /* If panning is not required, simply return */ + if ( !inputMc->lfeRouting.pan_lfe ) + { + return error; + } + + if ( ( error = getAmbisonicsOrder( outConfig, &outAmbiOrder ) ) != IVAS_ERR_OK ) + { + return error; + } + + numLfeIn = getNumLfeChannels( inputMc ); + + for ( i = 0; i < numLfeIn; i++ ) + { + /* panning gains */ + ivas_dirac_dec_get_response( (int16_t) inputMc->lfeRouting.lfeOutputAzimuth, (int16_t) inputMc->lfeRouting.lfeOutputElevation, inputMc->lfeRouting.lfePanMtx[i], outAmbiOrder ); + + /* linear input gain */ + v_multc( inputMc->lfeRouting.lfePanMtx[i], inputMc->lfeRouting.lfeInputGain, inputMc->lfeRouting.lfePanMtx[i], IVAS_MAX_OUTPUT_CHANNELS ); + } + + return error; +} + + +static ivas_error updateMcPanGainsForMcOut( + input_mc *inputMc, + const AUDIO_CONFIG outConfig ) +{ + ivas_error error; + + /* "if" conditions below realize the following mapping: + + If in == out, use identity matrix, otherwise follow the table: + +-----------+-------------+---------------+-----------+--------------------+ + | in\out | MONO | STEREO | custom LS | other | + +-----------+-------------+---------------+-----------+--------------------+ + | MONO | mono out | EFAP | EFAP | EFAP | + | custom LS | mono out | EFAP | EFAP | EFAP | + | other | mono lookup | stereo lookup | EFAP | conversion mapping | + +-----------+-------------+---------------+-----------+--------------------+ + */ + + if ( configsAreEqual( inputMc->base.inConfig, inputMc->customLsInput, outConfig, *inputMc->base.ctx.pCustomLsOut ) ) + { + error = initMcPanGainsWithIdentMatrix( inputMc ); + } + else if ( outConfig == IVAS_AUDIO_CONFIG_LS_CUSTOM || + inputMc->base.inConfig == IVAS_AUDIO_CONFIG_MONO || + inputMc->base.inConfig == IVAS_AUDIO_CONFIG_LS_CUSTOM ) + { + if ( ( inputMc->base.inConfig == IVAS_AUDIO_CONFIG_MONO ) && ( inputMc->nonDiegeticPan ) ) + { + inputMc->panGains[0][0] = ( inputMc->nonDiegeticPanGain + 1.f ) * 0.5f; + inputMc->panGains[0][1] = 1.f - inputMc->panGains[0][0]; + error = IVAS_ERR_OK; + } + else + { + error = initMcPanGainsWithEfap( inputMc, outConfig ); + } + } + else if ( outConfig == IVAS_AUDIO_CONFIG_MONO ) + { + error = initMcPanGainsWithMonoOut( inputMc ); + } + else if ( outConfig == IVAS_AUDIO_CONFIG_STEREO ) + { + error = initMcPanGainsWithStereoLookup( inputMc ); + } + else /* default */ + { + error = initMcPanGainsWithConversionMapping( inputMc, outConfig ); + } + + /* check for errors from above block */ + if ( error != IVAS_ERR_OK ) + { + return error; + } + + /* update LFE panning */ + error = updateLfePanGainsForMcOut( inputMc, outConfig ); + + return error; +} + + +static ivas_error updateMcPanGainsForAmbiOut( + input_mc *inputMc, + const AUDIO_CONFIG outConfig ) +{ + int16_t ch_in, ch_out, lfeIdx; + int16_t numNonLfeInChannels, outAmbiOrder; + const float *spkAzi, *spkEle; + ivas_error error; + + if ( ( error = getAmbisonicsOrder( outConfig, &outAmbiOrder ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( inputMc->base.inConfig != IVAS_AUDIO_CONFIG_LS_CUSTOM ) + { + if ( ( error = getNumNonLfeChannelsInSpeakerLayout( inputMc->base.inConfig, &numNonLfeInChannels ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = getSpeakerAzimuths( inputMc->base.inConfig, &spkAzi ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = getSpeakerElevations( inputMc->base.inConfig, &spkEle ) ) != IVAS_ERR_OK ) + { + return error; + } + + for ( ch_in = 0, ch_out = 0; ch_in < numNonLfeInChannels; ++ch_in, ++ch_out ) + { + if ( ch_in == LFE_CHANNEL ) + { + ++ch_out; + } + ivas_dirac_dec_get_response( (int16_t) spkAzi[ch_in], (int16_t) spkEle[ch_in], inputMc->panGains[ch_out], outAmbiOrder ); + } + } + else + { + numNonLfeInChannels = inputMc->customLsInput.num_spk; + spkAzi = inputMc->customLsInput.ls_azimuth; + spkEle = inputMc->customLsInput.ls_elevation; + + for ( ch_in = 0, ch_out = 0; ch_in < numNonLfeInChannels; ++ch_in, ++ch_out ) + { + for ( lfeIdx = 0; lfeIdx < inputMc->customLsInput.num_lfe; ++lfeIdx ) + { + if ( inputMc->customLsInput.lfe_idx[lfeIdx] == ch_in ) + { + ++ch_out; + break; + } + } + + ivas_dirac_dec_get_response( (int16_t) spkAzi[ch_in], (int16_t) spkEle[ch_in], inputMc->panGains[ch_out], outAmbiOrder ); + } + } + + /* update LFE panning */ + if ( ( error = updateLfePanGainsForAmbiOut( inputMc, outConfig ) ) != IVAS_ERR_OK ) + { + return error; + } + + return IVAS_ERR_OK; +} + + +static ivas_error updateMcPanGains( + input_mc *inputMc, + const AUDIO_CONFIG outConfig ) +{ + int16_t i; + ivas_error error; + + /* Reset to all zeros - some functions below only write non-zero elements. */ + setZeroPanMatrix( inputMc->panGains ); + + error = IVAS_ERR_OK; + switch ( getAudioConfigType( outConfig ) ) + { + case IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED: + error = updateMcPanGainsForMcOut( inputMc, outConfig ); + break; + case IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS: + error = updateMcPanGainsForAmbiOut( inputMc, outConfig ); + break; + case IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL: + switch ( outConfig ) + { + case IVAS_AUDIO_CONFIG_BINAURAL: + break; /* Do nothing */ + case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR: + case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB: + /* Prepare rendering to intermediate format */ + error = updateMcPanGainsForMcOut( inputMc, IVAS_AUDIO_CONFIG_7_1_4 ); + break; + default: + return IVAS_ERR_INVALID_OUTPUT_FORMAT; + } + break; + case IVAS_REND_AUDIO_CONFIG_TYPE_MASA: + break; /* Do nothing */ + default: + return IVAS_ERR_INVALID_OUTPUT_FORMAT; + } + /* Check error here to keep switch statement more compact */ + if ( error != IVAS_ERR_OK ) + { + return error; + } + + /* Copy LFE routing to pan gains array */ + if ( inputMc->base.inConfig == IVAS_AUDIO_CONFIG_LS_CUSTOM ) + { + for ( i = 0; i < inputMc->customLsInput.num_lfe; ++i ) + { + mvr2r( inputMc->lfeRouting.lfePanMtx[i], inputMc->panGains[inputMc->customLsInput.lfe_idx[i]], IVAS_MAX_OUTPUT_CHANNELS ); + } + } + else + { + /* For code simplicity, always copy LFE gains. If config has no LFE, gains will be zero anyway. */ + mvr2r( inputMc->lfeRouting.lfePanMtx[0], inputMc->panGains[LFE_CHANNEL], IVAS_MAX_OUTPUT_CHANNELS ); + } + + return IVAS_ERR_OK; +} + + +static ivas_error initMcBinauralRendering( + input_mc *inputMc, + const AUDIO_CONFIG inConfig, + const AUDIO_CONFIG outConfig, + RENDER_CONFIG_DATA *hRendCfg, + uint8_t reconfigureFlag ) +{ + ivas_error error; + int32_t binauralDelayNs; + int32_t outSampleRate; + int8_t useTDRend; + + /* Allocate TD binaural renderer for custom loudspeaker layouts (regardless of headrotation) + or planar MC layouts with headrotation, CREND for the rest */ + useTDRend = FALSE; + if ( outConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) + { + if ( inConfig == IVAS_AUDIO_CONFIG_LS_CUSTOM && outConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) + { + useTDRend = TRUE; + } + else if ( ( inConfig == IVAS_AUDIO_CONFIG_5_1 || inConfig == IVAS_AUDIO_CONFIG_7_1 ) && + ( inputMc->base.ctx.pHeadRotData->headRotEnabled ) ) + { + useTDRend = TRUE; + } + } + + /* if TD renderer was open and we need to use CREND, close it */ + if ( !reconfigureFlag || ( !useTDRend && inputMc->tdRendWrapper.hBinRendererTd != NULL ) ) + { + ivas_td_binaural_close( &inputMc->tdRendWrapper.hBinRendererTd ); + inputMc->tdRendWrapper.hHrtfTD = NULL; + } + + + /* if we need to use TD renderer and CREND was open, close it */ + if ( useTDRend ) + { + ivas_rend_closeCrend( &inputMc->crendWrapper ); + } + + if ( !reconfigureFlag || ( !useTDRend && outConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB && inputMc->hReverb != NULL ) ) + { + ivas_reverb_close( &inputMc->hReverb ); + } + + if ( !reconfigureFlag || ( inConfig == IVAS_AUDIO_CONFIG_LS_CUSTOM && !inputMc->base.ctx.pHeadRotData->headRotEnabled ) ) + { + if ( inputMc->efapInWrapper.hEfap != NULL ) + { + efap_free_data( &inputMc->efapInWrapper.hEfap ); + } + } + + outSampleRate = *inputMc->base.ctx.pOutSampleRate; + + if ( useTDRend && inputMc->tdRendWrapper.hBinRendererTd == NULL ) + { + if ( ( error = ivas_td_binaural_open_ext( &inputMc->tdRendWrapper, inConfig, hRendCfg, &inputMc->customLsInput, outSampleRate ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB && inputMc->hReverb == NULL ) + { + if ( ( error = ivas_reverb_open( &( inputMc->hReverb ), outConfig, NULL, inputMc->tdRendWrapper.hBinRendererTd->HrFiltSet_p->lr_energy_and_iac, hRendCfg, outSampleRate ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + else if ( !useTDRend && inputMc->crendWrapper == NULL ) + { + /* open CREND */ + if ( ( error = ivas_rend_openCrend( &inputMc->crendWrapper, ( inConfig == IVAS_AUDIO_CONFIG_LS_CUSTOM ) ? IVAS_AUDIO_CONFIG_7_1_4 : inConfig, outConfig, hRendCfg, NULL, outSampleRate ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* Initialise the EFAP handle for rotation on input layout */ + if ( inConfig != IVAS_AUDIO_CONFIG_LS_CUSTOM && inputMc->base.ctx.pHeadRotData->headRotEnabled && inputMc->efapInWrapper.hEfap == NULL ) + { + if ( ( error = initEfap( &inputMc->efapInWrapper, inConfig, NULL ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* determine binaural delay ( used for aligning LFE to output signal ) */ + binauralDelayNs = max( ( inputMc->crendWrapper != NULL ) ? inputMc->crendWrapper->binaural_latency_ns : 0, inputMc->tdRendWrapper.binaural_latency_ns ); + inputMc->binauralDelaySmp = (int16_t) roundf( (float) binauralDelayNs * *inputMc->base.ctx.pOutSampleRate / 1000000000.f ); + + if ( inputMc->binauralDelaySmp > MAX_BIN_DELAY_SAMPLES ) + { + return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Invalid delay for LFE binaural rendering!)" ); + } + + return IVAS_ERR_OK; +} + + +static ivas_error initMcMasaRendering( + input_mc *inputMc, + const AUDIO_CONFIG inConfig, + const int32_t inSampleRate ) +{ + ivas_error error; + + if ( inputMc->tdRendWrapper.hBinRendererTd != NULL ) + { + ivas_td_binaural_close( &inputMc->tdRendWrapper.hBinRendererTd ); + inputMc->tdRendWrapper.hHrtfTD = NULL; + } + + ivas_rend_closeCrend( &inputMc->crendWrapper ); + + ivas_reverb_close( &inputMc->hReverb ); + + if ( inputMc->efapInWrapper.hEfap != NULL ) + { + efap_free_data( &inputMc->efapInWrapper.hEfap ); + } + + if ( ( error = ivas_mcmasa_ana_open( &inputMc->hMcMasa, inConfig, inSampleRate ) ) != IVAS_ERR_OK ) + { + return error; + } + + return IVAS_ERR_OK; +} + + +static lfe_routing defaultLfeRouting( + const AUDIO_CONFIG inConfig, + const LSSETUP_CUSTOM_STRUCT customLsIn, + const AUDIO_CONFIG outConfig, + const LSSETUP_CUSTOM_STRUCT customLsOut ) +{ + int16_t i; + lfe_routing routing; + + /* Set all output gains to zero, then route each input LFE consecutively to the next available output LFE. */ + + for ( i = 0; i < IVAS_MAX_INPUT_LFE_CHANNELS; ++i ) + { + set_zero( routing.lfePanMtx[i], IVAS_MAX_OUTPUT_CHANNELS ); + } + + routing.pan_lfe = false; + routing.lfeInputGain = 1.0f; + + switch ( inConfig ) + { + case IVAS_AUDIO_CONFIG_5_1: + case IVAS_AUDIO_CONFIG_5_1_2: + case IVAS_AUDIO_CONFIG_5_1_4: + case IVAS_AUDIO_CONFIG_7_1: + case IVAS_AUDIO_CONFIG_7_1_4: + routing.numLfeChannels = 1; + break; + case IVAS_AUDIO_CONFIG_LS_CUSTOM: + routing.numLfeChannels = customLsIn.num_lfe; + break; + default: + routing.numLfeChannels = 0; + } + + switch ( outConfig ) + { + case IVAS_AUDIO_CONFIG_5_1: + case IVAS_AUDIO_CONFIG_5_1_2: + case IVAS_AUDIO_CONFIG_5_1_4: + case IVAS_AUDIO_CONFIG_7_1: + case IVAS_AUDIO_CONFIG_7_1_4: + routing.lfePanMtx[0][LFE_CHANNEL] = 1.0f; + break; + case IVAS_AUDIO_CONFIG_LS_CUSTOM: + for ( i = 0; i < routing.numLfeChannels && i < customLsOut.num_lfe; ++i ) + { + routing.lfePanMtx[i][customLsOut.lfe_idx[i]] = 1.0f; + } + break; + default: + /* Do nothing */ + break; + } + + return routing; +} + + +static ivas_error setRendInputActiveMc( + void *input, + const AUDIO_CONFIG inConfig, + const IVAS_REND_InputId id, + RENDER_CONFIG_DATA *hRendCfg ) +{ + ivas_error error; + rendering_context rendCtx; + AUDIO_CONFIG outConfig; + input_mc *inputMc; + + inputMc = (input_mc *) input; + rendCtx = inputMc->base.ctx; + outConfig = *rendCtx.pOutConfig; + + if ( !isIoConfigPairSupported( inConfig, outConfig ) ) + { + return IVAS_ERR_IO_CONFIG_PAIR_NOT_SUPPORTED; + } + + if ( ( error = allocateMcLfeDelayBuffer( &inputMc->lfeDelayBuffer, MAX_BIN_DELAY_SAMPLES ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = allocateInputBaseBufferData( &inputMc->bufferData, MAX_BUFFER_LENGTH ) ) != IVAS_ERR_OK ) + { + return error; + } + initRendInputBase( &inputMc->base, inConfig, id, rendCtx, inputMc->bufferData, MAX_BUFFER_LENGTH ); + + setZeroPanMatrix( inputMc->panGains ); + inputMc->customLsInput = defaultCustomLs(); + inputMc->tdRendWrapper = defaultTdRendWrapper(); + inputMc->crendWrapper = NULL; + inputMc->hReverb = NULL; + inputMc->hMcMasa = NULL; + + initRotGains( inputMc->rot_gains_prev ); + inputMc->lfeRouting = defaultLfeRouting( inConfig, inputMc->customLsInput, outConfig, *inputMc->base.ctx.pCustomLsOut ); + set_zero( inputMc->lfeDelayBuffer, MAX_BIN_DELAY_SAMPLES ); + inputMc->binauralDelaySmp = 0; + + if ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL || outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR || outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) + { + if ( ( error = initMcBinauralRendering( inputMc, inConfig, outConfig, hRendCfg, FALSE ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( outConfig == IVAS_AUDIO_CONFIG_MASA1 || outConfig == IVAS_AUDIO_CONFIG_MASA2 ) + { + if ( ( error = initMcMasaRendering( inputMc, inConfig, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( ( error = updateMcPanGains( inputMc, outConfig ) ) != IVAS_ERR_OK ) + { + return error; + } + + return IVAS_ERR_OK; +} + + +static void clearInputMc( + input_mc *inputMc ) +{ + rendering_context rendCtx; + + rendCtx = inputMc->base.ctx; + + freeMcLfeDelayBuffer( &inputMc->lfeDelayBuffer ); + freeInputBaseBufferData( &inputMc->bufferData ); + initRendInputBase( &inputMc->base, IVAS_AUDIO_CONFIG_INVALID, 0, rendCtx, NULL, 0 ); + + /* Free input's internal handles */ + if ( inputMc->efapInWrapper.hEfap != NULL ) + { + efap_free_data( &inputMc->efapInWrapper.hEfap ); + } + + ivas_rend_closeCrend( &inputMc->crendWrapper ); + + ivas_reverb_close( &inputMc->hReverb ); + + if ( inputMc->tdRendWrapper.hBinRendererTd != NULL ) + { + ivas_td_binaural_close( &inputMc->tdRendWrapper.hBinRendererTd ); + inputMc->tdRendWrapper.hHrtfTD = NULL; + } + + + ivas_mcmasa_ana_close( &( inputMc->hMcMasa ) ); + + return; +} + + +static ivas_error initSbaPanGainsForMcOut( + input_sba *inputSba, + const AUDIO_CONFIG outConfig, + const LSSETUP_CUSTOM_STRUCT *outSetupCustom ) +{ + int16_t ambiOrderIn; + int16_t chInIdx, chOutIdx; + float *tmpDecMtx, *readPtr; + IVAS_OUTPUT_SETUP hOutSetup; + ivas_error error; + + if ( ( error = getAmbisonicsOrder( inputSba->base.inConfig, &ambiOrderIn ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( getAudioConfigType( outConfig ) != IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) + { + assert( !"Invalid configuration" ); + return IVAS_ERR_WRONG_PARAMS; + } + + switch ( outConfig ) + { + case IVAS_AUDIO_CONFIG_MONO: + hOutSetup.ls_azimuth = ls_azimuth_CICP1; + hOutSetup.ls_elevation = ls_elevation_CICP1; + ivas_output_init( &hOutSetup, outConfig ); + break; + case IVAS_AUDIO_CONFIG_STEREO: + case IVAS_AUDIO_CONFIG_5_1: + case IVAS_AUDIO_CONFIG_7_1: + case IVAS_AUDIO_CONFIG_5_1_2: + case IVAS_AUDIO_CONFIG_5_1_4: + case IVAS_AUDIO_CONFIG_7_1_4: + ivas_output_init( &hOutSetup, outConfig ); + break; + case IVAS_AUDIO_CONFIG_LS_CUSTOM: + ivas_ls_custom_setup( &hOutSetup, outSetupCustom ); + break; + default: + assert( !"Invalid speaker config" ); + return IVAS_ERR_WRONG_PARAMS; + } + + /* obtain and copy over HOA decoding matrix */ + tmpDecMtx = NULL; + if ( ( error = ivas_sba_get_hoa_dec_matrix( hOutSetup, &tmpDecMtx, ambiOrderIn ) ) != IVAS_ERR_OK ) + { + return error; + } + + readPtr = &tmpDecMtx[0]; + for ( chOutIdx = 0; chOutIdx < hOutSetup.nchan_out_woLFE + hOutSetup.num_lfe; ++chOutIdx ) + { + for ( chInIdx = 0; chInIdx < SBA_NHARM_HOA3; ++chInIdx ) + { + if ( hOutSetup.num_lfe > 0 && chOutIdx == hOutSetup.index_lfe[0] ) + { + continue; /* nothing to be rendered to LFE */ + } + inputSba->hoaDecMtx[chInIdx][chOutIdx] = *readPtr++; + } + } + + free( tmpDecMtx ); + + return IVAS_ERR_OK; +} + + +static ivas_error initSbaPanGainsForSbaOut( + input_sba *inputSba, + const AUDIO_CONFIG outConfig ) +{ + ivas_error error; + error = IVAS_ERR_OK; + + if ( getAudioConfigType( outConfig ) != IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS ) + { + assert( !"Invalid configuration" ); + return IVAS_ERR_WRONG_PARAMS; + } + + fillIdentityPanMatrix( inputSba->hoaDecMtx ); + + return error; +} + + + + +static ivas_error updateSbaPanGains( + input_sba *inputSba, + const AUDIO_CONFIG outConfig, + RENDER_CONFIG_DATA *hRendCfg ) +{ + ivas_error error; + AUDIO_CONFIG inConfig; + rendering_context rendCtx; + + /* Reset to all zeros - some functions below only write non-zero elements. */ + setZeroPanMatrix( inputSba->hoaDecMtx ); + + inConfig = inputSba->base.inConfig; + rendCtx = inputSba->base.ctx; + + switch ( getAudioConfigType( outConfig ) ) + { + case IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED: + error = initSbaPanGainsForMcOut( inputSba, outConfig, inputSba->base.ctx.pCustomLsOut ); + break; + case IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS: + error = initSbaPanGainsForSbaOut( inputSba, outConfig ); + break; + case IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL: + switch ( outConfig ) + { + case IVAS_AUDIO_CONFIG_BINAURAL: + { + if ( ( error = ivas_rend_openCrend( &inputSba->crendWrapper, inConfig, outConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) + + { + return error; + } + } + break; + case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR: + case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB: + if ( ( error = initSbaPanGainsForMcOut( inputSba, IVAS_AUDIO_CONFIG_7_1_4, NULL ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = ivas_rend_openCrend( &inputSba->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) + { + return error; + } + break; + default: + return IVAS_ERR_INVALID_OUTPUT_FORMAT; + } + break; + case IVAS_REND_AUDIO_CONFIG_TYPE_MASA: + error = IVAS_ERR_OK; + break; /* Do nothing */ + default: + return IVAS_ERR_INVALID_OUTPUT_FORMAT; + } + + /* Check error here to keep switch statement more compact */ + if ( error != IVAS_ERR_OK ) + { + return error; + } + + return IVAS_ERR_OK; +} + + + + +static ivas_error initSbaMasaRendering( + input_sba *inputSba, + int32_t inSampleRate ) +{ + ivas_error error; + + ivas_rend_closeCrend( &inputSba->crendWrapper ); + + if ( ( error = ivas_dirac_ana_open( &inputSba->hDirAC, inSampleRate ) ) != IVAS_ERR_OK ) + { + return error; + } + + return IVAS_ERR_OK; +} + + +static ivas_error setRendInputActiveSba( + void *input, + const AUDIO_CONFIG inConfig, + const IVAS_REND_InputId id, + RENDER_CONFIG_DATA *hRendCfg ) +{ + ivas_error error; + rendering_context rendCtx; + AUDIO_CONFIG outConfig; + input_sba *inputSba; + + inputSba = (input_sba *) input; + rendCtx = inputSba->base.ctx; + outConfig = *rendCtx.pOutConfig; + + if ( !isIoConfigPairSupported( inConfig, outConfig ) ) + { + return IVAS_ERR_IO_CONFIG_PAIR_NOT_SUPPORTED; + } + + if ( ( error = allocateInputBaseBufferData( &inputSba->bufferData, MAX_BUFFER_LENGTH ) ) != IVAS_ERR_OK ) + { + return error; + } + + initRendInputBase( &inputSba->base, inConfig, id, rendCtx, inputSba->bufferData, MAX_BUFFER_LENGTH ); + + setZeroPanMatrix( inputSba->hoaDecMtx ); + + inputSba->crendWrapper = NULL; + inputSba->hDirAC = NULL; + initRotGains( inputSba->rot_gains_prev ); + + if ( outConfig == IVAS_AUDIO_CONFIG_MASA1 || outConfig == IVAS_AUDIO_CONFIG_MASA2 ) + { + if ( ( error = initSbaMasaRendering( inputSba, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( ( error = updateSbaPanGains( inputSba, outConfig, hRendCfg ) ) != IVAS_ERR_OK ) + { + return error; + } + + return error; +} + + + + +static void clearInputSba( + input_sba *inputSba ) +{ + rendering_context rendCtx; + + rendCtx = inputSba->base.ctx; + + freeInputBaseBufferData( &inputSba->bufferData ); + + initRendInputBase( &inputSba->base, IVAS_AUDIO_CONFIG_INVALID, 0, rendCtx, NULL, 0 ); + + /* Free input's internal handles */ + ivas_rend_closeCrend( &inputSba->crendWrapper ); + + ivas_dirac_ana_close( &( inputSba->hDirAC ) ); + + return; +} + + +static ivas_error initMasaDummyDecForMcOut( + input_masa *inputMasa, + const AUDIO_CONFIG outConfig ) +{ + ivas_error error; + int16_t numCldfbAnalyses; + int16_t numCldfbSyntheses; + int16_t i; + DecoderDummy *decDummy; + + decDummy = inputMasa->decDummy; + decDummy->hDecoderConfig->output_config = outConfig; + decDummy->sba_analysis_order = 1; + decDummy->hDecoderConfig->ivas_total_brate = IVAS_512k; /* Todo Nokia: This is preventing initialization of 2TC as 1TC, should be fixed properly in ivas_dirac_dec_config() */ + decDummy->mc_mode = MC_MODE_NONE; /* Todo Nokia: This should be also refactored in such way that it is not checked if not in MC mode */ + + ivas_output_init( &( decDummy->hOutSetup ), outConfig ); + ivas_output_init( &( decDummy->hIntSetup ), outConfig ); + + decDummy->renderer_type = RENDERER_DIRAC; + if ( outConfig == IVAS_AUDIO_CONFIG_STEREO ) + { + decDummy->renderer_type = RENDERER_STEREO_PARAMETRIC; + } + + decDummy->ivas_format = MASA_FORMAT; + decDummy->transport_config = IVAS_AUDIO_CONFIG_INVALID; + + /* Todo refactor: Access to qmetadata is not required by the algorithm. */ + if ( ( error = ivas_qmetadata_open( &( decDummy->hQMetaData ) ) ) != IVAS_ERR_OK ) + { + return error; + } + decDummy->hQMetaData->coherence_flag = 1; + + if ( ( error = ivas_dirac_dec_config( decDummy, DIRAC_OPEN ) ) != IVAS_ERR_OK ) + { + return error; + } + decDummy->hSpatParamRendCom->dirac_bs_md_write_idx = 0; + + if ( decDummy->renderer_type == RENDERER_STEREO_PARAMETRIC ) + { + if ( ( error = ivas_dirac_dec_init_binaural_data( decDummy, NULL ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + numCldfbAnalyses = decDummy->nchan_transport; + numCldfbSyntheses = decDummy->hDecoderConfig->nchan_out; + + for ( i = 0; i < numCldfbAnalyses; i++ ) + { + if ( ( error = openCldfb( &( decDummy->cldfbAnaDec[i] ), CLDFB_ANALYSIS, decDummy->hDecoderConfig->output_Fs, CLDFB_PROTOTYPE_5_00MS ) ) != IVAS_ERR_OK ) + { + return error; + } + } + for ( ; i < MAX_INTERN_CHANNELS; i++ ) + { + decDummy->cldfbAnaDec[i] = NULL; + } + + for ( i = 0; i < numCldfbSyntheses; i++ ) + { + if ( ( error = openCldfb( &( decDummy->cldfbSynDec[i] ), CLDFB_SYNTHESIS, decDummy->hDecoderConfig->output_Fs, CLDFB_PROTOTYPE_5_00MS ) ) != IVAS_ERR_OK ) + { + return error; + } + } + for ( ; i < MAX_OUTPUT_CHANNELS; i++ ) + { + decDummy->cldfbSynDec[i] = NULL; + } + + return IVAS_ERR_OK; +} + + +static ivas_error initMasaDummyDecForSbaOut( + input_masa *inputMasa, + const AUDIO_CONFIG outConfig ) +{ + ivas_error error; + int16_t numCldfbAnalyses; + int16_t numCldfbSyntheses; + int16_t i; + DecoderDummy *decDummy; + + decDummy = inputMasa->decDummy; + decDummy->hDecoderConfig->output_config = outConfig; + decDummy->hDecoderConfig->ivas_total_brate = IVAS_512k; /* Todo Nokia: This is preventing initialization of 2TC as 1TC, should be fixed properly in ivas_dirac_dec_config() */ + decDummy->mc_mode = MC_MODE_NONE; /* Todo Nokia: This should be also refactored in such way that it is not checked if not in MC mode */ + decDummy->sba_analysis_order = 1; + + ivas_output_init( &( decDummy->hOutSetup ), outConfig ); + ivas_output_init( &( decDummy->hIntSetup ), outConfig ); + + decDummy->renderer_type = RENDERER_DIRAC; + decDummy->ivas_format = MASA_FORMAT; + decDummy->transport_config = IVAS_AUDIO_CONFIG_INVALID; + + /* Todo refactor: Access to qmetadata is not required by the algorithm. */ + if ( ( error = ivas_qmetadata_open( &( decDummy->hQMetaData ) ) ) != IVAS_ERR_OK ) + { + return error; + } + decDummy->hQMetaData->coherence_flag = 1; + + if ( ( error = ivas_dirac_dec_config( decDummy, DIRAC_OPEN ) ) != IVAS_ERR_OK ) + { + return error; + } + decDummy->hSpatParamRendCom->dirac_bs_md_write_idx = 0; + + numCldfbAnalyses = decDummy->nchan_transport; + numCldfbSyntheses = decDummy->hDecoderConfig->nchan_out; + + for ( i = 0; i < numCldfbAnalyses; i++ ) + { + if ( ( error = openCldfb( &( decDummy->cldfbAnaDec[i] ), CLDFB_ANALYSIS, decDummy->hDecoderConfig->output_Fs, CLDFB_PROTOTYPE_5_00MS ) ) != IVAS_ERR_OK ) + { + return error; + } + } + for ( ; i < MAX_INTERN_CHANNELS; i++ ) + { + decDummy->cldfbAnaDec[i] = NULL; + } + + for ( i = 0; i < numCldfbSyntheses; i++ ) + { + if ( ( error = openCldfb( &( decDummy->cldfbSynDec[i] ), CLDFB_SYNTHESIS, decDummy->hDecoderConfig->output_Fs, CLDFB_PROTOTYPE_5_00MS ) ) != IVAS_ERR_OK ) + { + return error; + } + } + for ( ; i < MAX_OUTPUT_CHANNELS; i++ ) + { + decDummy->cldfbSynDec[i] = NULL; + } + + return IVAS_ERR_OK; +} + + +static ivas_error initMasaDummyDecForBinauralOut( + input_masa *inputMasa, + const AUDIO_CONFIG outConfig ) +{ + ivas_error error; + int16_t i; + DecoderDummy *decDummy; + + decDummy = inputMasa->decDummy; + decDummy->hDecoderConfig->output_config = outConfig; + decDummy->sba_analysis_order = 1; + decDummy->hDecoderConfig->ivas_total_brate = IVAS_512k; /* Todo Nokia: This is preventing initialization of 2TC as 1TC, should be fixed properly in ivas_dirac_dec_config() */ + decDummy->mc_mode = MC_MODE_NONE; /* Todo Nokia: This should be also refactored in such way that it is not checked if not in MC mode */ + + ivas_output_init( &( decDummy->hOutSetup ), outConfig ); + + if ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL ) + { + decDummy->renderer_type = RENDERER_BINAURAL_PARAMETRIC; + } + else + { + decDummy->renderer_type = RENDERER_BINAURAL_PARAMETRIC_ROOM; + } + decDummy->ivas_format = MASA_FORMAT; + decDummy->transport_config = IVAS_AUDIO_CONFIG_INVALID; + + if ( ( error = ivas_dirac_dec_config( decDummy, DIRAC_OPEN ) ) != IVAS_ERR_OK ) + { + return error; + } + decDummy->hSpatParamRendCom->dirac_bs_md_write_idx = 0; + + if ( ( error = ivas_dirac_dec_binaural_copy_hrtfs( &decDummy->hHrtfParambin ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = ivas_dirac_dec_init_binaural_data( decDummy, decDummy->hHrtfParambin ) ) != IVAS_ERR_OK ) + { + return error; + } + + for ( i = 0; i < BINAURAL_CHANNELS; i++ ) + { + if ( ( error = openCldfb( &( decDummy->cldfbAnaDec[i] ), CLDFB_ANALYSIS, decDummy->hDecoderConfig->output_Fs, CLDFB_PROTOTYPE_5_00MS ) ) != IVAS_ERR_OK ) + { + return error; + } + if ( ( error = openCldfb( &( decDummy->cldfbSynDec[i] ), CLDFB_SYNTHESIS, decDummy->hDecoderConfig->output_Fs, CLDFB_PROTOTYPE_5_00MS ) ) != IVAS_ERR_OK ) + { + return error; + } + } + for ( ; i < MAX_INTERN_CHANNELS; i++ ) + { + decDummy->cldfbAnaDec[i] = NULL; + decDummy->cldfbSynDec[i] = NULL; + } + + return IVAS_ERR_OK; +} + + +static ivas_error updateMasaDummyDec( + input_masa *inputMasa, + const AUDIO_CONFIG outConfig ) +{ + ivas_error error; + + switch ( getAudioConfigType( outConfig ) ) + { + case IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED: + error = initMasaDummyDecForMcOut( inputMasa, outConfig ); + break; + case IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS: + error = initMasaDummyDecForSbaOut( inputMasa, outConfig ); + break; + case IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL: + error = initMasaDummyDecForBinauralOut( inputMasa, outConfig ); + break; + default: + return IVAS_ERR_INVALID_OUTPUT_FORMAT; + } + + return error; +} + + +static DecoderDummy *initDecoderDummy( + const int32_t sampleRate, + const int16_t numTransChannels, + const AUDIO_CONFIG outConfig, + const uint8_t enableRenderConfig +) +{ + ivas_error error; + int16_t i; + int16_t numOutChannels; + DecoderDummy *decDummy; + int16_t num_subframes; + num_subframes = MAX_PARAM_SPATIAL_SUBFRAMES; + + if ( ( error = getAudioConfigNumChannels( outConfig, &numOutChannels ) ) != IVAS_ERR_OK ) + { + /* Checking error with assert is enough, this function is only temporary anyway */ + assert( error == IVAS_ERR_OK ); + } + + decDummy = malloc( sizeof( DecoderDummy ) ); + decDummy->hDecoderConfig = malloc( sizeof( DECODER_CONFIG ) ); + decDummy->hDecoderConfig->output_Fs = sampleRate; + decDummy->hDecoderConfig->nchan_out = numOutChannels; + decDummy->hDecoderConfig->Opt_Headrotation = 0; + decDummy->hDecoderConfig->Opt_tsm = 0; + decDummy->hDecoderConfig->Opt_5ms = 0; + decDummy->hBinRenderer = NULL; + + decDummy->hEFAPdata = NULL; + decDummy->hCrendWrapper = NULL; + decDummy->hHrtfTD = NULL; + decDummy->hSpar = NULL; + decDummy->hoa_dec_mtx = NULL; + decDummy->hVBAPdata = NULL; // note: not used at the moment + decDummy->hMasa = NULL; + + decDummy->hDiracDecBin = NULL; + + decDummy->hDirACRend = NULL; + decDummy->hSpatParamRendCom = NULL; + decDummy->hQMetaData = NULL; + decDummy->hHrtfParambin = NULL; + decDummy->hHeadTrackData = NULL; + decDummy->hDirAC = NULL; + decDummy->hTcBuffer = NULL; + decDummy->hDecoderConfig->output_config = outConfig; + decDummy->nchan_transport = numTransChannels; + + if ( getAudioConfigType( outConfig ) == IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL ) + { + decDummy->hHeadTrackData = malloc( sizeof( HEAD_TRACK_DATA ) ); + /* Initialise Rmat_prev to I, Rmat will be computed later */ + for ( i = 0; i < 3; i++ ) + { + set_zero( decDummy->hHeadTrackData->Rmat_prev[i], 3 ); + decDummy->hHeadTrackData->Rmat_prev[i][i] = 1.0f; + } + + set_zero( decDummy->hHeadTrackData->chEneIIR[0], MASA_FREQUENCY_BANDS ); + set_zero( decDummy->hHeadTrackData->chEneIIR[1], MASA_FREQUENCY_BANDS ); + set_zero( decDummy->hHeadTrackData->procChEneIIR[0], MASA_FREQUENCY_BANDS ); + set_zero( decDummy->hHeadTrackData->procChEneIIR[1], MASA_FREQUENCY_BANDS ); + for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + { + decDummy->hHeadTrackData->Quaternions[i].w = 1.0f; + decDummy->hHeadTrackData->Quaternions[i].x = 0.0f; + decDummy->hHeadTrackData->Quaternions[i].y = 0.0f; + decDummy->hHeadTrackData->Quaternions[i].z = 0.0f; + } + decDummy->hHeadTrackData->lrSwitchInterpVal = 0.0f; + decDummy->hHeadTrackData->lrSwitchedCurrent = 0; + decDummy->hHeadTrackData->lrSwitchedNext = 0; + decDummy->hHeadTrackData->OrientationTracker = (ivas_orient_trk_state_t *) malloc( sizeof( ivas_orient_trk_state_t ) ); + ivas_orient_trk_Init( decDummy->hHeadTrackData->OrientationTracker ); + + /* External orientations */ + if ( ( error = ivas_external_orientation_open( &( decDummy->hExtOrientationData ), num_subframes ) ) != IVAS_ERR_OK ) + { + assert( error == IVAS_ERR_OK ); + } + + /* Combined orientations */ + if ( ( error = ivas_combined_orientation_open( &( decDummy->hCombinedOrientationData ), num_subframes ) ) != IVAS_ERR_OK ) + { + assert( error == IVAS_ERR_OK ); + } + } + else + { + decDummy->hHeadTrackData = NULL; + decDummy->hExtOrientationData = NULL; + decDummy->hCombinedOrientationData = NULL; + } + + if ( enableRenderConfig ) + { + ivas_render_config_open( &decDummy->hRenderConfig ); + } + else + { + decDummy->hRenderConfig = NULL; + } + + /* get a default TC buffer, needed for some renderers */ + ivas_jbm_dec_tc_buffer_open( decDummy, TC_BUFFER_MODE_NONE, 0, 0, 0, 1 ); + + decDummy->renderer_type = RENDERER_DISABLE; + + return decDummy; +} + + +static ivas_error setRendInputActiveMasa( + void *input, + const AUDIO_CONFIG inConfig, + const IVAS_REND_InputId id, + RENDER_CONFIG_DATA *hRendCfg ) /* Todo: This is not used at all within MASA. Support might be better to do after refactoring. */ +{ + ivas_error error; + rendering_context rendCtx; + AUDIO_CONFIG outConfig; + input_masa *inputMasa; + int16_t numInChannels; + + inputMasa = (input_masa *) input; + rendCtx = inputMasa->base.ctx; + outConfig = *rendCtx.pOutConfig; + (void) hRendCfg; /* Suppress warning */ + + if ( !isIoConfigPairSupported( inConfig, outConfig ) ) + { + return IVAS_ERR_IO_CONFIG_PAIR_NOT_SUPPORTED; + } + + if ( ( error = allocateInputBaseBufferData( &inputMasa->bufferData, MAX_BUFFER_LENGTH ) ) != IVAS_ERR_OK ) + { + return error; + } + initRendInputBase( &inputMasa->base, inConfig, id, rendCtx, inputMasa->bufferData, MAX_BUFFER_LENGTH ); + + if ( ( error = getAudioConfigNumChannels( inConfig, &numInChannels ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( getAudioConfigType( outConfig ) == IVAS_REND_AUDIO_CONFIG_TYPE_MASA ) + { + inputMasa->metadataHasBeenFed = false; + if ( ( error = masaPrerendOpen( &inputMasa->hMasaPrerend, inputMasa->base.inConfig == IVAS_AUDIO_CONFIG_MASA1 ? 1 : 2, *( inputMasa->base.ctx.pOutSampleRate ) ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + inputMasa->decDummy = initDecoderDummy( *rendCtx.pOutSampleRate, numInChannels, outConfig, 0 ); + + inputMasa->metadataHasBeenFed = false; + + if ( ( error = updateMasaDummyDec( inputMasa, outConfig ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + return IVAS_ERR_OK; +} + + +static void freeDecoderDummy( + DecoderDummy **ppDecDummy ) +{ + int16_t i; + DecoderDummy *pDecDummy; + + if ( ppDecDummy == NULL || *ppDecDummy == NULL ) + { + return; + } + pDecDummy = *ppDecDummy; + + if ( pDecDummy->hDecoderConfig != NULL ) + { + free( pDecDummy->hDecoderConfig ); + } + + if ( pDecDummy->hHeadTrackData != NULL ) + { + if ( pDecDummy->hHeadTrackData->OrientationTracker != NULL ) + { + free( pDecDummy->hHeadTrackData->OrientationTracker ); + } + free( pDecDummy->hHeadTrackData ); + } + + if ( pDecDummy->hExtOrientationData != NULL ) + { + free( pDecDummy->hExtOrientationData ); + } + + if ( pDecDummy->hCombinedOrientationData != NULL ) + { + free( pDecDummy->hCombinedOrientationData ); + } + + ivas_render_config_close( &pDecDummy->hRenderConfig ); + + /* CLDFB handles */ + for ( i = 0; i < MAX_INTERN_CHANNELS; i++ ) + { + if ( pDecDummy->cldfbAnaDec[i] != NULL ) + { + deleteCldfb( &( pDecDummy->cldfbAnaDec[i] ) ); + } + } + + for ( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) + { + if ( pDecDummy->cldfbSynDec[i] != NULL ) + { + deleteCldfb( &( pDecDummy->cldfbSynDec[i] ) ); + } + } + + /* DirAC handle */ + ivas_dirac_rend_close( &( pDecDummy->hDirACRend ) ); + ivas_spat_hSpatParamRendCom_close( &( pDecDummy->hSpatParamRendCom ) ); + ivas_dirac_dec_close( &( pDecDummy->hDirAC ) ); + + /* Qmetadata handle */ + ivas_qmetadata_close( &pDecDummy->hQMetaData ); + + /* VBAP handle */ + vbap_free_data( &( pDecDummy->hVBAPdata ) ); + + /* HOA decoder matrix */ + if ( pDecDummy->hoa_dec_mtx != NULL ) + { + free( pDecDummy->hoa_dec_mtx ); + pDecDummy->hoa_dec_mtx = NULL; + } + + /* Parametric binaural renderer HRTF structure */ + if ( pDecDummy->hHrtfParambin != NULL ) + { + free( pDecDummy->hHrtfParambin ); + pDecDummy->hHrtfParambin = NULL; + } + + + /* Parametric binaural renderer handle */ + ivas_dirac_dec_close_binaural_data( &pDecDummy->hDiracDecBin ); + + /* TC buffer */ + ivas_jbm_dec_tc_buffer_close( &pDecDummy->hTcBuffer ); + + free( pDecDummy ); + pDecDummy = NULL; + + return; +} + + +static void clearInputMasa( + input_masa *inputMasa ) +{ + rendering_context rendCtx; + + rendCtx = inputMasa->base.ctx; + + freeInputBaseBufferData( &inputMasa->bufferData ); + + masaPrerendClose( &inputMasa->hMasaPrerend ); + + initRendInputBase( &inputMasa->base, IVAS_AUDIO_CONFIG_INVALID, 0, rendCtx, NULL, 0 ); + freeDecoderDummy( &inputMasa->decDummy ); + + return; +} + + + + +/*------------------------------------------------------------------------- + * IVAS_REND_Open() + * + * + *------------------------------------------------------------------------*/ + +ivas_error IVAS_REND_Open( + IVAS_REND_HANDLE *phIvasRend, + const int32_t outputSampleRate, + const AUDIO_CONFIG outConfig, + const int16_t nonDiegeticPan, + const float nonDiegeticPanGain, + const int16_t num_subframes ) +{ + int16_t i; + IVAS_REND_HANDLE hIvasRend; + ivas_error error; + int16_t numOutChannels; + + /* Validate function arguments */ + if ( phIvasRend == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + if ( ( error = validateOutputAudioConfig( outConfig ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = validateOutputSampleRate( outputSampleRate, outConfig ) ) != IVAS_ERR_OK ) + { + return error; + } + + *phIvasRend = (IVAS_REND_HANDLE) malloc( sizeof( struct IVAS_REND ) ); + if ( *phIvasRend == NULL ) + { + return IVAS_ERR_FAILED_ALLOC; + } + + hIvasRend = *phIvasRend; + hIvasRend->sampleRateOut = outputSampleRate; + hIvasRend->outputConfig = outConfig; + hIvasRend->customLsOut = defaultCustomLs(); + hIvasRend->hLimiter = NULL; + hIvasRend->efapOutWrapper.hEfap = NULL; + hIvasRend->efapOutWrapper.pCustomLsSetup = NULL; + hIvasRend->num_subframes = num_subframes; + + /* Initialize limiter */ + if ( ( error = IVAS_REND_NumOutChannels( hIvasRend, &numOutChannels ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = initLimiter( &hIvasRend->hLimiter, numOutChannels, outputSampleRate ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Initialize headrotation data */ + if ( ( error = initHeadRotation( hIvasRend ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Initialize external orientation data */ + if ( ( error = ivas_external_orientation_open( &( hIvasRend->hExternalOrientationData ), num_subframes ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Initilize combined orientation data */ + if ( ( error = ivas_combined_orientation_open( &( hIvasRend->hCombinedOrientationData ), num_subframes ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Initialize EFAP */ + if ( ( error = initEfap( &hIvasRend->efapOutWrapper, outConfig, &hIvasRend->customLsOut ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Initialize inputs */ + + for ( i = 0; i < RENDERER_MAX_ISM_INPUTS; ++i ) + { + initRendInputBase( &hIvasRend->inputsIsm[i].base, IVAS_AUDIO_CONFIG_INVALID, 0, getRendCtx( hIvasRend ), NULL, 0 ); + + hIvasRend->inputsIsm[i].crendWrapper = NULL; + hIvasRend->inputsIsm[i].hReverb = NULL; + hIvasRend->inputsIsm[i].tdRendWrapper.hBinRendererTd = NULL; + hIvasRend->inputsIsm[i].bufferData = NULL; + hIvasRend->inputsIsm[i].nonDiegeticPan = nonDiegeticPan; + hIvasRend->inputsIsm[i].nonDiegeticPanGain = nonDiegeticPanGain; + hIvasRend->inputsIsm[i].hOMasa = NULL; + } + + for ( i = 0; i < RENDERER_MAX_MC_INPUTS; ++i ) + { + initRendInputBase( &hIvasRend->inputsMc[i].base, IVAS_AUDIO_CONFIG_INVALID, 0, getRendCtx( hIvasRend ), NULL, 0 ); + + hIvasRend->inputsMc[i].efapInWrapper.hEfap = NULL; + hIvasRend->inputsMc[i].crendWrapper = NULL; + hIvasRend->inputsMc[i].hReverb = NULL; + hIvasRend->inputsMc[i].tdRendWrapper.hBinRendererTd = NULL; + hIvasRend->inputsMc[i].bufferData = NULL; + hIvasRend->inputsMc[i].lfeDelayBuffer = NULL; + hIvasRend->inputsMc[i].nonDiegeticPan = nonDiegeticPan; + hIvasRend->inputsMc[i].nonDiegeticPanGain = nonDiegeticPanGain; + hIvasRend->inputsMc[i].hMcMasa = NULL; + } + + for ( i = 0; i < RENDERER_MAX_SBA_INPUTS; ++i ) + { + initRendInputBase( &hIvasRend->inputsSba[i].base, IVAS_AUDIO_CONFIG_INVALID, 0, getRendCtx( hIvasRend ), NULL, 0 ); + + hIvasRend->inputsSba[i].crendWrapper = NULL; + hIvasRend->inputsSba[i].bufferData = NULL; + hIvasRend->inputsSba[i].hDirAC = NULL; + } + + for ( i = 0; i < RENDERER_MAX_MASA_INPUTS; ++i ) + { + initRendInputBase( &hIvasRend->inputsMasa[i].base, IVAS_AUDIO_CONFIG_INVALID, 0, getRendCtx( hIvasRend ), NULL, 0 ); + + hIvasRend->inputsMasa[i].decDummy = NULL; + hIvasRend->inputsMasa[i].metadataHasBeenFed = false; + hIvasRend->inputsMasa[i].bufferData = NULL; + hIvasRend->inputsMasa[i].hMasaPrerend = NULL; + } + + + return IVAS_ERR_OK; +} + + +static LSSETUP_CUSTOM_STRUCT makeCustomLsSetup( + const IVAS_CUSTOM_LS_DATA rendCustomLsLayout ) +{ + int16_t i; + LSSETUP_CUSTOM_STRUCT customLs; + + /* Copy layout description */ + customLs.num_spk = rendCustomLsLayout.num_spk; + mvr2r( rendCustomLsLayout.azimuth, customLs.ls_azimuth, rendCustomLsLayout.num_spk ); + mvr2r( rendCustomLsLayout.elevation, customLs.ls_elevation, rendCustomLsLayout.num_spk ); + + customLs.is_planar_setup = 1; + for ( i = 0; i < rendCustomLsLayout.num_spk; ++i ) + { + if ( fabsf( rendCustomLsLayout.elevation[i] ) > EPSILON ) + { + customLs.is_planar_setup = 0; + break; + } + } + + customLs.num_lfe = rendCustomLsLayout.num_lfe; + mvs2s( rendCustomLsLayout.lfe_idx, customLs.lfe_idx, rendCustomLsLayout.num_lfe ); + + return customLs; +} + + +static ivas_error validateCustomLsLayout( + const IVAS_CUSTOM_LS_DATA layout ) +{ + int16_t i; + + /* Negative number of speakers or LFEs makes no sense */ + if ( layout.num_spk < 0 || layout.num_lfe < 0 ) + { + return IVAS_ERR_INVALID_CUSTOM_LS_LAYOUT; + } + + /* There must be at least one speaker or LFE in the layout */ + if ( layout.num_spk + layout.num_lfe <= 0 ) + { + return IVAS_ERR_INVALID_CUSTOM_LS_LAYOUT; + } + + /* LFE indices must be positive */ + for ( i = 0; i < layout.num_lfe; ++i ) + { + if ( layout.lfe_idx[i] < 0 ) + { + return IVAS_ERR_INVALID_CUSTOM_LS_LAYOUT; + } + } + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * IVAS_REND_ConfigureCustomOutputLoudspeakerLayout() + * + * + *-------------------------------------------------------------------*/ + +ivas_error IVAS_REND_ConfigureCustomOutputLoudspeakerLayout( + IVAS_REND_HANDLE hIvasRend, + const IVAS_CUSTOM_LS_DATA layout ) +{ + int16_t i, numOutChannels; + ivas_error error; + input_mc *inputMc; + input_sba *inputSba; + + /* Validate function arguments */ + if ( hIvasRend == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + if ( hIvasRend->outputConfig != IVAS_AUDIO_CONFIG_LS_CUSTOM ) + { + /* Specifying details of custom speaker layout only makes sense if output config is set to custom speaker layout */ + return IVAS_ERR_INVALID_OUTPUT_FORMAT; + } + + if ( ( error = validateCustomLsLayout( layout ) ) != IVAS_ERR_OK ) + { + return error; + } + + hIvasRend->customLsOut = makeCustomLsSetup( layout ); + + /* Re-initialize limiter - number of output channels may have changed */ + if ( ( error = IVAS_REND_NumOutChannels( hIvasRend, &numOutChannels ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = initLimiter( &hIvasRend->hLimiter, numOutChannels, hIvasRend->sampleRateOut ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Re-initialize EFAP - output layout has changed or has been fully defined for the first time */ + if ( ( error = initEfap( &hIvasRend->efapOutWrapper, hIvasRend->outputConfig, &hIvasRend->customLsOut ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Re-initialize panning gains for each active MC input, This includes re-initializing + * LFE handling for the new output layout, which means custom LFE handling is overwritten, + * if previously set for any MC input. */ + for ( i = 0; i < RENDERER_MAX_MC_INPUTS; ++i ) + { + inputMc = &hIvasRend->inputsMc[i]; + if ( inputMc->base.inConfig == IVAS_AUDIO_CONFIG_INVALID ) + { + /* Input inactive, skip. */ + continue; + } + + inputMc->lfeRouting = defaultLfeRouting( inputMc->base.inConfig, inputMc->customLsInput, hIvasRend->outputConfig, *inputMc->base.ctx.pCustomLsOut ); + + if ( ( error = updateMcPanGains( inputMc, hIvasRend->outputConfig ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* Re-initialize panning gains for each active SBA input */ + for ( i = 0; i < RENDERER_MAX_SBA_INPUTS; ++i ) + { + inputSba = &hIvasRend->inputsSba[i]; + + if ( inputSba->base.inConfig == IVAS_AUDIO_CONFIG_INVALID ) + { + /* Input inactive, skip. */ + continue; + } + + if ( ( error = updateSbaPanGains( inputSba, hIvasRend->outputConfig, hIvasRend->hRendererConfig ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * IVAS_REND_NumOutChannels() + * + * + *-------------------------------------------------------------------*/ + +ivas_error IVAS_REND_NumOutChannels( + IVAS_REND_CONST_HANDLE hIvasRend, + int16_t *numOutChannels ) +{ + ivas_error error; + + /* Validate function arguments */ + if ( hIvasRend == NULL || numOutChannels == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + /* Handle special cases where additional info is needed from the renderer, otherwise use getAudioConfigNumChannels() */ + switch ( hIvasRend->outputConfig ) + { + case IVAS_AUDIO_CONFIG_LS_CUSTOM: + *numOutChannels = hIvasRend->customLsOut.num_spk + hIvasRend->customLsOut.num_lfe; + break; + default: + if ( ( error = getAudioConfigNumChannels( hIvasRend->outputConfig, numOutChannels ) ) != IVAS_ERR_OK ) + { + return error; + } + break; + } + + return IVAS_ERR_OK; +} + + +static IVAS_REND_InputId makeInputId( + AUDIO_CONFIG config, + const int32_t inputIndex ) +{ + /* Put config type in second byte (from LSB), put index + 1 in first byte + * + * Index is incremented here so that a valid ID can never be 0. */ + return (IVAS_REND_InputId) ( ( ( (uint32_t) getAudioConfigType( config ) ) << 8 ) | ( inputIndex + 1 ) ); +} + + +static ivas_error getInputById( + IVAS_REND_HANDLE hIvasRend, + IVAS_REND_InputId inputId, + void **ppInput ) +{ + int32_t inputIndex; + IVAS_REND_AudioConfigType configType; + input_base *pInputBase; + + /* Reverse makeInputId() */ + inputIndex = ( inputId & 0xFF ) - 1; + configType = ( inputId & 0xFF00 ) >> 8; + + /* Validate values derived from input ID */ + if ( inputIndex < 0 ) + { + return IVAS_ERR_INVALID_INPUT_ID; + } + switch ( configType ) + { + case IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED: + if ( inputIndex > RENDERER_MAX_ISM_INPUTS ) + { + return IVAS_ERR_INVALID_INPUT_ID; + } + pInputBase = &hIvasRend->inputsIsm[inputIndex].base; + break; + case IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED: + if ( inputIndex > RENDERER_MAX_MC_INPUTS ) + { + return IVAS_ERR_INVALID_INPUT_ID; + } + pInputBase = &hIvasRend->inputsMc[inputIndex].base; + break; + case IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS: + if ( inputIndex > RENDERER_MAX_SBA_INPUTS ) + { + return IVAS_ERR_INVALID_INPUT_ID; + } + pInputBase = &hIvasRend->inputsSba[inputIndex].base; + break; + case IVAS_REND_AUDIO_CONFIG_TYPE_MASA: + if ( inputIndex > RENDERER_MAX_MASA_INPUTS ) + { + return IVAS_ERR_INVALID_INPUT_ID; + } + pInputBase = &hIvasRend->inputsMasa[inputIndex].base; + break; + default: + return IVAS_ERR_INVALID_INPUT_ID; + } + + /* Ensure input ID matches and that input is active */ + if ( pInputBase->id != inputId || pInputBase->inConfig == IVAS_AUDIO_CONFIG_INVALID ) + { + return IVAS_ERR_INVALID_INPUT_ID; + } + + /* Validation done, set value via output parameter */ + *ppInput = pInputBase; + + return IVAS_ERR_OK; +} + + +static ivas_error getConstInputById( + IVAS_REND_CONST_HANDLE hIvasRend, + const IVAS_REND_InputId inputId, + const void **ppInput ) +{ + int32_t inputIndex; + IVAS_REND_AudioConfigType configType; + const input_base *pInputBase; + + /* Reverse makeInputId() */ + inputIndex = ( inputId & 0xFF ) - 1; + configType = ( inputId & 0xFF00 ) >> 8; + + /* Validate values derived from input ID */ + if ( inputIndex < 0 ) + { + return IVAS_ERR_INVALID_INPUT_ID; + } + switch ( configType ) + { + case IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED: + if ( inputIndex > RENDERER_MAX_ISM_INPUTS ) + { + return IVAS_ERR_INVALID_INPUT_ID; + } + pInputBase = &hIvasRend->inputsIsm[inputIndex].base; + break; + case IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED: + if ( inputIndex > RENDERER_MAX_MC_INPUTS ) + { + return IVAS_ERR_INVALID_INPUT_ID; + } + pInputBase = &hIvasRend->inputsMc[inputIndex].base; + break; + case IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS: + if ( inputIndex > RENDERER_MAX_SBA_INPUTS ) + { + return IVAS_ERR_INVALID_INPUT_ID; + } + pInputBase = &hIvasRend->inputsSba[inputIndex].base; + break; + case IVAS_REND_AUDIO_CONFIG_TYPE_MASA: + if ( inputIndex > RENDERER_MAX_MASA_INPUTS ) + { + return IVAS_ERR_INVALID_INPUT_ID; + } + pInputBase = &hIvasRend->inputsMasa[inputIndex].base; + break; + default: + return IVAS_ERR_INVALID_INPUT_ID; + } + + /* Ensure input ID matches and that input is active */ + if ( pInputBase->id != inputId || pInputBase->inConfig == IVAS_AUDIO_CONFIG_INVALID ) + { + return IVAS_ERR_INVALID_INPUT_ID; + } + + /* Validation done, set value via output parameter */ + *ppInput = pInputBase; + + return IVAS_ERR_OK; +} + + +static ivas_error findFreeInputSlot( + const void *inputs, + const int32_t inputStructSize, + const int32_t maxInputs, + int32_t *inputIndex ) +{ + /* Using a void pointer and a separately provided size is a hack for this function + to be reusable for arrays of any input type (input_ism, input_mc, input_sba, input_masa). + Assumptions: + - input_base is always the first member in the input struct + - provided size is correct + */ + + int32_t i; + bool canAddInput; + const uint8_t *pByte; + const input_base *pInputBase; + + canAddInput = false; + + /* Find first unused input in array */ + for ( i = 0, pByte = inputs; i < maxInputs; ++i, pByte += inputStructSize ) + { + pInputBase = (const input_base *) pByte; + + if ( pInputBase->inConfig == IVAS_AUDIO_CONFIG_INVALID ) + { + *inputIndex = i; + canAddInput = true; + break; + } + } + + if ( !canAddInput ) + { + return IVAS_ERR_TOO_MANY_INPUTS; + } + + return IVAS_ERR_OK; +} + + + + +/*-------------------------------------------------------------------* + * IVAS_REND_AddInput() + * + * + *-------------------------------------------------------------------*/ + +ivas_error IVAS_REND_AddInput( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const AUDIO_CONFIG inConfig, /* i : audio config for a new input */ + IVAS_REND_InputId *inputId /* o : ID of the new input */ +) +{ + ivas_error error; + int32_t maxNumInputsOfType; + void *inputsArray; + int32_t inputStructSize; + ivas_error ( *activateInput )( void *, AUDIO_CONFIG, IVAS_REND_InputId, RENDER_CONFIG_DATA * ); + int32_t inputIndex; + + /* Validate function arguments */ + if ( hIvasRend == NULL || inputId == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + + switch ( getAudioConfigType( inConfig ) ) + { + case IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED: + maxNumInputsOfType = RENDERER_MAX_ISM_INPUTS; + inputsArray = hIvasRend->inputsIsm; + inputStructSize = sizeof( *hIvasRend->inputsIsm ); + activateInput = setRendInputActiveIsm; + break; + case IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED: + maxNumInputsOfType = RENDERER_MAX_MC_INPUTS; + inputsArray = hIvasRend->inputsMc; + inputStructSize = sizeof( *hIvasRend->inputsMc ); + activateInput = setRendInputActiveMc; + break; + case IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS: + maxNumInputsOfType = RENDERER_MAX_SBA_INPUTS; + inputsArray = hIvasRend->inputsSba; + inputStructSize = sizeof( *hIvasRend->inputsSba ); + activateInput = setRendInputActiveSba; + break; + case IVAS_REND_AUDIO_CONFIG_TYPE_MASA: + maxNumInputsOfType = RENDERER_MAX_MASA_INPUTS; + inputsArray = hIvasRend->inputsMasa; + inputStructSize = sizeof( *hIvasRend->inputsMasa ); + activateInput = setRendInputActiveMasa; + break; + default: + return IVAS_ERR_INVALID_INPUT_FORMAT; + } + + /* Find first free input in array corresponding to input type */ + if ( ( error = findFreeInputSlot( inputsArray, inputStructSize, maxNumInputsOfType, &inputIndex ) ) != IVAS_ERR_OK ) + { + return error; + } + + *inputId = makeInputId( inConfig, inputIndex ); + + if ( ( error = activateInput( (uint8_t *) inputsArray + inputStructSize * inputIndex, inConfig, *inputId, hIvasRend->hRendererConfig ) ) != IVAS_ERR_OK ) + { + return error; + } + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * IVAS_REND_ConfigureCustomInputLoudspeakerLayout() + * + * + * Note: this will reset any custom LFE routing set for the input + *-------------------------------------------------------------------*/ + +ivas_error IVAS_REND_ConfigureCustomInputLoudspeakerLayout( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const IVAS_REND_InputId inputId, /* i : ID of the input */ + const IVAS_CUSTOM_LS_DATA layout /* i : custom loudspeaker layout for input */ +) +{ + input_mc *inputMc; + ivas_error error; + + /* Validate function arguments */ + if ( hIvasRend == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + if ( ( error = validateCustomLsLayout( layout ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = getInputById( hIvasRend, inputId, (void **) &inputMc ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( inputMc->base.inConfig != IVAS_AUDIO_CONFIG_LS_CUSTOM ) + { + /* Specifying details of custom speaker layout only makes sense if input config is set to custom speaker layout */ + return IVAS_ERR_INVALID_INPUT_FORMAT; + } + + /* Re-initialize panning gains for the MC input, This includes re-initializing LFE handling + * for the new input layout, which means custom LFE handling is overwritten, if previously + * set for the MC input. */ + inputMc->customLsInput = makeCustomLsSetup( layout ); + + inputMc->lfeRouting = defaultLfeRouting( inputMc->base.inConfig, inputMc->customLsInput, hIvasRend->outputConfig, *inputMc->base.ctx.pCustomLsOut ); + + if ( ( error = initEfap( &inputMc->efapInWrapper, inputMc->base.inConfig, &inputMc->customLsInput ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( hIvasRend->outputConfig == IVAS_AUDIO_CONFIG_BINAURAL || hIvasRend->outputConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR || hIvasRend->outputConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) + { + if ( ( error = initMcBinauralRendering( inputMc, inputMc->base.inConfig, hIvasRend->outputConfig, hIvasRend->hRendererConfig, FALSE ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( ( error = updateMcPanGains( inputMc, hIvasRend->outputConfig ) ) != IVAS_ERR_OK ) + { + return error; + } + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * IVAS_REND_SetInputGain() + * + * + *-------------------------------------------------------------------*/ + +ivas_error IVAS_REND_SetInputGain( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const IVAS_REND_InputId inputId, /* i : ID of the input */ + const float gain /* i : linear gain (not in dB) */ +) +{ + input_base *inputBase; + ivas_error error; + + /* Validate function arguments */ + if ( hIvasRend == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + if ( ( error = getInputById( hIvasRend, inputId, (void **) &inputBase ) ) != IVAS_ERR_OK ) + { + return error; + } + + inputBase->gain = gain; + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * IVAS_REND_SetInputLfeMtx() + * + * + *-------------------------------------------------------------------*/ + +ivas_error IVAS_REND_SetInputLfeMtx( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const IVAS_REND_InputId inputId, /* i : ID of the input */ + const IVAS_REND_LfePanMtx *lfePanMtx /* i : LFE panning matrix */ +) +{ + int16_t i; + input_base *pInputBase; + input_mc *pInputMc; + ivas_error error; + + /* Validate function arguments */ + if ( hIvasRend == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + if ( ( error = getInputById( hIvasRend, inputId, (void **) &pInputBase ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( getAudioConfigType( pInputBase->inConfig ) != IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) + { + /* Custom LFE panning matrix only makes sense with channel-based input */ + return IVAS_ERR_INVALID_INPUT_FORMAT; + } + pInputMc = (input_mc *) pInputBase; + + /* copy LFE panning matrix */ + for ( i = 0; i < IVAS_MAX_INPUT_LFE_CHANNELS; i++ ) + { + mvr2r( ( *lfePanMtx )[i], pInputMc->lfeRouting.lfePanMtx[i], IVAS_MAX_OUTPUT_CHANNELS ); + } + + if ( ( error = updateMcPanGains( pInputMc, hIvasRend->outputConfig ) ) != IVAS_ERR_OK ) + { + return error; + } + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * IVAS_REND_SetInputLfePos() + * + * + *-------------------------------------------------------------------*/ + +ivas_error IVAS_REND_SetInputLfePos( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const IVAS_REND_InputId inputId, /* i : ID of the input */ + const float inputGain, /* i : Input gain to be applied to the LFE channel(s) */ + const float outputAzimuth, /* i : Output azimuth position */ + const float outputElevation /* i : Output elevation position */ +) +{ + input_base *pInputBase; + input_mc *pInputMc; + ivas_error error; + + /* Validate function arguments */ + if ( hIvasRend == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + if ( ( error = getInputById( hIvasRend, inputId, (void **) &pInputBase ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( getAudioConfigType( pInputBase->inConfig ) != IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) + { + /* Custom LFE routing only makes sense with channel-based input */ + return IVAS_ERR_INVALID_INPUT_FORMAT; + } + pInputMc = (input_mc *) pInputBase; + + pInputMc->lfeRouting.pan_lfe = true; + pInputMc->lfeRouting.lfeInputGain = inputGain; + pInputMc->lfeRouting.lfeOutputAzimuth = outputAzimuth; + pInputMc->lfeRouting.lfeOutputElevation = outputElevation; + + if ( ( error = updateMcPanGains( pInputMc, hIvasRend->outputConfig ) ) != IVAS_ERR_OK ) + { + return error; + } + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * IVAS_REND_RemoveInput() + * + * + *-------------------------------------------------------------------*/ +/* ToDo; unused function */ +ivas_error IVAS_REND_RemoveInput( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const IVAS_REND_InputId inputId /* i : ID of the input */ +) +{ + ivas_error error; + input_base *inputBase; + + /* Validate function arguments */ + if ( hIvasRend == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + if ( ( error = getInputById( hIvasRend, inputId, (void **) &inputBase ) ) != IVAS_ERR_OK ) + { + return error; + } + + switch ( getAudioConfigType( inputBase->inConfig ) ) + { + case IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED: + clearInputIsm( (input_ism *) inputBase ); + break; + case IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED: + clearInputMc( (input_mc *) inputBase ); + break; + case IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS: + clearInputSba( (input_sba *) inputBase ); + break; + case IVAS_REND_AUDIO_CONFIG_TYPE_MASA: + clearInputMasa( (input_masa *) inputBase ); + break; + default: + return IVAS_ERR_INVALID_INPUT_FORMAT; + } + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * IVAS_REND_GetInputNumChannels() + * + * + *-------------------------------------------------------------------*/ + +ivas_error IVAS_REND_GetInputNumChannels( + IVAS_REND_CONST_HANDLE hIvasRend, /* i : Renderer handle */ + const IVAS_REND_InputId inputId, /* i : ID of the input */ + int16_t *numChannels /* o : number of channels of the input */ +) +{ + ivas_error error; + const input_base *pInput; + + /* Validate function arguments */ + if ( hIvasRend == NULL || numChannels == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + if ( ( error = getConstInputById( hIvasRend, inputId, (const void **) &pInput ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = getRendInputNumChannels( pInput, numChannels ) ) != IVAS_ERR_OK ) + { + return error; + } + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * IVAS_REND_GetNumAllObjects() + * + * + *-------------------------------------------------------------------*/ + +ivas_error IVAS_REND_GetNumAllObjects( + IVAS_REND_CONST_HANDLE hIvasRend, /* i : Renderer handle */ + int16_t *numChannels /* o : number of all objects */ +) +{ + if ( hIvasRend == NULL || numChannels == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + if ( hIvasRend->outputConfig == IVAS_AUDIO_CONFIG_MASA1 || hIvasRend->outputConfig == IVAS_AUDIO_CONFIG_MASA2 ) + { + *numChannels = (int16_t) hIvasRend->inputsIsm[0].total_num_objects; + } + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * IVAS_REND_GetDelay() + * + * + *-------------------------------------------------------------------*/ + +ivas_error IVAS_REND_GetDelay( + IVAS_REND_CONST_HANDLE hIvasRend, /* i : Renderer state */ + int16_t *nSamples, /* o : Renderer delay in samples */ + int32_t *timeScale /* o : Time scale of the delay, equal to renderer output sampling rate */ +) +{ + /* TODO tmu : this function only returns the maximum delay across all inputs + * Ideally each input has its own delay buffer and everything is aligned (binaural and LFE filtering delays are nonuniform) + */ + int16_t i; + int32_t latency_ns; + int32_t max_latency_ns; + + /* Validate function arguments */ + if ( hIvasRend == NULL || nSamples == NULL || timeScale == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + *timeScale = hIvasRend->sampleRateOut; + *nSamples = 0; + max_latency_ns = 0; + + /* Compute the maximum delay across all inputs */ + for ( i = 0; i < RENDERER_MAX_ISM_INPUTS; i++ ) + { + if ( hIvasRend->inputsIsm[i].base.inConfig != IVAS_AUDIO_CONFIG_INVALID ) + { + latency_ns = max( ( hIvasRend->inputsIsm[i].crendWrapper != NULL ) ? hIvasRend->inputsIsm[i].crendWrapper->binaural_latency_ns : 0, + hIvasRend->inputsIsm[i].tdRendWrapper.binaural_latency_ns ); + max_latency_ns = max( max_latency_ns, latency_ns ); + } + } + + for ( i = 0; i < RENDERER_MAX_MC_INPUTS; i++ ) + { + if ( hIvasRend->inputsMc[i].base.inConfig != IVAS_AUDIO_CONFIG_INVALID ) + { + latency_ns = max( ( hIvasRend->inputsMc[i].crendWrapper != NULL ) ? hIvasRend->inputsMc[i].crendWrapper->binaural_latency_ns : 0, + hIvasRend->inputsMc[i].tdRendWrapper.binaural_latency_ns ); + max_latency_ns = max( max_latency_ns, latency_ns ); + } + } + + for ( i = 0; i < RENDERER_MAX_SBA_INPUTS; i++ ) + { + if ( hIvasRend->inputsSba[i].base.inConfig != IVAS_AUDIO_CONFIG_INVALID ) + { + { + latency_ns = ( hIvasRend->inputsSba[i].crendWrapper != NULL ) ? hIvasRend->inputsSba[i].crendWrapper->binaural_latency_ns : 0; + max_latency_ns = max( max_latency_ns, latency_ns ); + } + } + } + + + for ( i = 0; i < RENDERER_MAX_MASA_INPUTS; i++ ) + { + if ( hIvasRend->inputsMasa[i].base.inConfig != IVAS_AUDIO_CONFIG_INVALID ) + { + latency_ns = (int32_t) ( (float) IVAS_FB_DEC_DELAY_NS + 0.5f ); + max_latency_ns = max( max_latency_ns, latency_ns ); + } + } + + *nSamples = (int16_t) roundf( (float) max_latency_ns * *timeScale / 1000000000.f ); + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * IVAS_REND_FeedInputAudio() + * + * + *-------------------------------------------------------------------*/ + +ivas_error IVAS_REND_FeedInputAudio( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const IVAS_REND_InputId inputId, /* i : ID of the input */ + const IVAS_REND_ReadOnlyAudioBuffer inputAudio /* i : buffer with input audio */ +) +{ + ivas_error error; + input_base *inputBase; + int16_t numInputChannels; + + /* Validate function arguments */ + if ( hIvasRend == NULL || inputAudio.data == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + if ( inputAudio.config.numSamplesPerChannel <= 0 || MAX_BUFFER_LENGTH_PER_CHANNEL < inputAudio.config.numSamplesPerChannel ) + { + return IVAS_ERROR( IVAS_ERR_INVALID_BUFFER_SIZE, "Buffer size outside of supported range" ); + } + + if ( inputAudio.config.numChannels <= 0 || MAX_INPUT_CHANNELS < inputAudio.config.numChannels ) + { + return IVAS_ERR_WRONG_NUM_CHANNELS; + } + + if ( getAudioConfigType( hIvasRend->outputConfig ) == IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL && + inputAudio.config.numSamplesPerChannel * 1000 != ( BINAURAL_RENDERING_FRAME_SIZE_MS * hIvasRend->num_subframes ) * hIvasRend->sampleRateOut ) + { + return IVAS_ERROR( IVAS_ERR_INVALID_BUFFER_SIZE, "Binaural rendering requires specific frame size" ); + } + + if ( ( error = getInputById( hIvasRend, inputId, (void **) &inputBase ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = getRendInputNumChannels( inputBase, &numInputChannels ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( hIvasRend->outputConfig == IVAS_AUDIO_CONFIG_MASA1 || hIvasRend->outputConfig == IVAS_AUDIO_CONFIG_MASA2 ) && inputBase->inConfig == IVAS_AUDIO_CONFIG_OBA ) + { + numInputChannels = (int16_t) hIvasRend->inputsIsm[0].total_num_objects; + } + + if ( numInputChannels != inputAudio.config.numChannels ) + { + return IVAS_ERR_WRONG_NUM_CHANNELS; + } + + inputBase->inputBuffer.config = inputAudio.config; + + mvr2r( inputAudio.data, inputBase->inputBuffer.data, inputAudio.config.numSamplesPerChannel * inputAudio.config.numChannels ); + + inputBase->numNewSamplesPerChannel = inputAudio.config.numSamplesPerChannel; + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * IVAS_REND_FeedInputObjectMetadata() + * + * + *-------------------------------------------------------------------*/ + +ivas_error IVAS_REND_FeedInputObjectMetadata( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const IVAS_REND_InputId inputId, /* i : ID of the input */ + const IVAS_ISM_METADATA objectPosition /* i : object position struct */ +) +{ + input_base *inputBase; + input_ism *inputIsm; + ivas_error error; + + /* Validate function arguments */ + if ( hIvasRend == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + if ( ( error = getInputById( hIvasRend, inputId, (void **) &inputBase ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( inputBase->inConfig != IVAS_AUDIO_CONFIG_OBA ) + { + /* Object metadata should only be fed for object inputs */ + return IVAS_ERR_METADATA_NOT_EXPECTED; + } + + inputIsm = (input_ism *) inputBase; + inputIsm->previousPos = inputIsm->currentPos; + inputIsm->currentPos = objectPosition; + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * IVAS_REND_FeedInputObjectMetadataToOMasa() + * + * + *-------------------------------------------------------------------*/ + +ivas_error IVAS_REND_FeedInputObjectMetadataToOMasa( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const int16_t inputIndex, /* i : Index of the input */ + const IVAS_ISM_METADATA objectPosition /* i : object position struct */ +) +{ + /* Validate function arguments */ + if ( hIvasRend == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + /* Set position to OMasa struct */ + hIvasRend->inputsIsm->hOMasa->ism_azimuth[inputIndex] = objectPosition.azimuth; + hIvasRend->inputsIsm->hOMasa->ism_elevation[inputIndex] = objectPosition.elevation; + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * IVAS_REND_FeedInputMasaMetadata() + * + * + *-------------------------------------------------------------------*/ + +ivas_error IVAS_REND_FeedInputMasaMetadata( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const IVAS_REND_InputId inputId, /* i : ID of the input */ + IVAS_MASA_METADATA_HANDLE masaMetadata /* i : MASA metadata frame */ +) +{ + ivas_error error; + input_base *inputBase; + input_masa *inputMasa; + + /* Validate function arguments */ + if ( hIvasRend == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + if ( ( error = getInputById( hIvasRend, inputId, (void **) &inputBase ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( getAudioConfigType( inputBase->inConfig ) != IVAS_REND_AUDIO_CONFIG_TYPE_MASA ) + { + /* MASA metadata should only be fed for MASA inputs */ + return IVAS_ERR_METADATA_NOT_EXPECTED; + } + + inputMasa = (input_masa *) inputBase; + inputMasa->masaMetadata = *masaMetadata; + inputMasa->metadataHasBeenFed = true; + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * IVAS_REND_InitConfig() + * + * + *-------------------------------------------------------------------*/ + +ivas_error IVAS_REND_InitConfig( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const AUDIO_CONFIG outAudioConfig /* i : output audioConfig */ +) +{ + ivas_error error; + bool rendererConfigEnabled; + + rendererConfigEnabled = ( getAudioConfigType( outAudioConfig ) == IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL ); + + if ( rendererConfigEnabled ) + { + hIvasRend->rendererConfigEnabled = 1; + } + else + { + hIvasRend->rendererConfigEnabled = 0; + } + + if ( rendererConfigEnabled ) + { + if ( ( error = ivas_render_config_open( &( hIvasRend->hRendererConfig ) ) ) != IVAS_ERR_OK ) + { + return error; + } + if ( ( error = ivas_render_config_init_from_rom( &hIvasRend->hRendererConfig ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + hIvasRend->hRendererConfig = NULL; + } + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * IVAS_REND_GetRenderConfig() + * + * + *-------------------------------------------------------------------*/ + +int16_t IVAS_REND_GetRenderConfig( + IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS decoder handle */ + const IVAS_RENDER_CONFIG_HANDLE hRCout /* o : Render configuration handle */ +) +{ + RENDER_CONFIG_HANDLE hRCin; + + if ( hIvasRend == NULL || hIvasRend->hRendererConfig == NULL || hRCout == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + hRCin = hIvasRend->hRendererConfig; + hRCout->roomAcoustics.override = hRCin->roomAcoustics.override; + hRCout->roomAcoustics.nBands = hRCin->roomAcoustics.nBands; + hRCout->roomAcoustics.acousticPreDelay = hRCin->roomAcoustics.acousticPreDelay; + hRCout->roomAcoustics.inputPreDelay = hRCin->roomAcoustics.inputPreDelay; + mvr2r( hRCin->directivity, hRCout->directivity, 3 * MAX_NUM_OBJECTS ); + + mvr2r( hRCin->roomAcoustics.pFc_input, hRCout->roomAcoustics.pFc_input, CLDFB_NO_CHANNELS_MAX ); + mvr2r( hRCin->roomAcoustics.pAcoustic_rt60, hRCout->roomAcoustics.pAcoustic_rt60, CLDFB_NO_CHANNELS_MAX ); + mvr2r( hRCin->roomAcoustics.pAcoustic_dsr, hRCout->roomAcoustics.pAcoustic_dsr, CLDFB_NO_CHANNELS_MAX ); + + + hRCout->roomAcoustics.use_er = hRCin->roomAcoustics.use_er; + hRCout->roomAcoustics.lowComplexity = hRCin->roomAcoustics.lowComplexity; + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * IVAS_REND_FeedRenderConfig() + * + * + *-------------------------------------------------------------------*/ + +int16_t IVAS_REND_FeedRenderConfig( + IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS decoder handle */ + const IVAS_RENDER_CONFIG_DATA renderConfig /* i : Render configuration struct */ +) +{ + RENDER_CONFIG_HANDLE hRenderConfig; + + if ( hIvasRend == NULL || hIvasRend->hRendererConfig == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + hRenderConfig = hIvasRend->hRendererConfig; + + hRenderConfig->roomAcoustics.override = renderConfig.roomAcoustics.override; + hRenderConfig->roomAcoustics.nBands = renderConfig.roomAcoustics.nBands; + hRenderConfig->roomAcoustics.acousticPreDelay = renderConfig.roomAcoustics.acousticPreDelay; + hRenderConfig->roomAcoustics.inputPreDelay = renderConfig.roomAcoustics.inputPreDelay; + mvr2r( renderConfig.roomAcoustics.pFc_input, hRenderConfig->roomAcoustics.pFc_input, CLDFB_NO_CHANNELS_MAX ); + mvr2r( renderConfig.roomAcoustics.pAcoustic_rt60, hRenderConfig->roomAcoustics.pAcoustic_rt60, CLDFB_NO_CHANNELS_MAX ); + mvr2r( renderConfig.roomAcoustics.pAcoustic_dsr, hRenderConfig->roomAcoustics.pAcoustic_dsr, CLDFB_NO_CHANNELS_MAX ); + mvr2r( renderConfig.directivity, hRenderConfig->directivity, 3 * MAX_NUM_OBJECTS ); + + hRenderConfig->roomAcoustics.use_er = 0; + if ( renderConfig.roomAcoustics.use_er == 1 ) + { + hRenderConfig->roomAcoustics.use_er = renderConfig.roomAcoustics.use_er; + hRenderConfig->roomAcoustics.lowComplexity = renderConfig.roomAcoustics.lowComplexity; + hRenderConfig->roomAcoustics.dimensions = renderConfig.roomAcoustics.dimensions; + hRenderConfig->roomAcoustics.ListenerOrigin = renderConfig.roomAcoustics.ListenerOrigin; + + mvr2r( renderConfig.roomAcoustics.AbsCoeff, hRenderConfig->roomAcoustics.AbsCoeff, ER_ABS_COEFF ); + } + + + return IVAS_ERR_OK; +} + + + + +/*-------------------------------------------------------------------* + * IVAS_REND_SetHeadRotation() + * + * + *-------------------------------------------------------------------*/ + +ivas_error IVAS_REND_SetHeadRotation( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const IVAS_QUATERNION headRot, /* i : head orientations for next rendering call */ + const IVAS_VECTOR3 Pos, /* i : listener positions for next rendering call */ + const int16_t sf_idx /* i : subframe index */ +) +{ + int16_t i; + IVAS_QUATERNION rotQuat; + ivas_error error; + + /* Validate function arguments */ + if ( hIvasRend == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + if ( getAudioConfigType( hIvasRend->outputConfig ) != IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL ) + { + /* Head rotation can be set only with binaural output */ + return IVAS_ERR_INVALID_OUTPUT_FORMAT; + } + + hIvasRend->headRotData.headRotEnabled = 1; + + /* reconfigure binaural rendering to allocate the necessary renderers and free unused ones */ + for ( i = 0; i < RENDERER_MAX_MC_INPUTS; ++i ) + { + if ( hIvasRend->inputsMc[i].base.inConfig != IVAS_AUDIO_CONFIG_INVALID ) + { + if ( ( error = initMcBinauralRendering( &hIvasRend->inputsMc[i], hIvasRend->inputsMc[i].base.inConfig, hIvasRend->outputConfig, hIvasRend->hRendererConfig, TRUE ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + + /* check for Euler angle signaling */ + if ( headRot.w == -3.0f ) + { + Euler2Quat( deg2rad( headRot.x ), deg2rad( headRot.y ), deg2rad( headRot.z ), &rotQuat ); + } + else + { + rotQuat = headRot; + } + + if ( ( error = ivas_orient_trk_Process( hIvasRend->headRotData.hOrientationTracker, rotQuat, FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES, &hIvasRend->headRotData.headPositions[sf_idx] ) ) != IVAS_ERR_OK ) + { + return error; + } + + hIvasRend->headRotData.Pos[sf_idx] = Pos; + + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * IVAS_REND_DisableHeadRotation() + * + * + *-------------------------------------------------------------------*/ + +ivas_error IVAS_REND_DisableHeadRotation( + IVAS_REND_HANDLE hIvasRend /* i/o: Renderer handle */ +) +{ + int16_t i; + ivas_error error; + + /* Validate function arguments */ + if ( hIvasRend == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + hIvasRend->headRotData.headRotEnabled = 0; + + /* reconfigure binaural rendering to allocate the necessary renderers and free unused ones */ + if ( getAudioConfigType( hIvasRend->outputConfig ) == IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL ) + { + for ( i = 0; i < RENDERER_MAX_MC_INPUTS; ++i ) + { + if ( hIvasRend->inputsMc[i].base.inConfig != IVAS_AUDIO_CONFIG_INVALID ) + { + if ( ( error = initMcBinauralRendering( &hIvasRend->inputsMc[i], hIvasRend->inputsMc[i].base.inConfig, hIvasRend->outputConfig, hIvasRend->hRendererConfig, TRUE ) ) != IVAS_ERR_OK ) + { + + return error; + } + } + } + } + + return IVAS_ERR_OK; +} + + + + +/*-------------------------------------------------------------------* + * IVAS_REND_SetOrientationTrackingMode() + * + * + *-------------------------------------------------------------------*/ + +ivas_error IVAS_REND_SetOrientationTrackingMode( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const IVAS_HEAD_ORIENT_TRK_T orientation_tracking /* i : Head orientation tracking type */ +) +{ + return ivas_orient_trk_SetTrackingType( hIvasRend->headRotData.hOrientationTracker, orientation_tracking ); +} + + +/*-------------------------------------------------------------------* + * IVAS_REND_SetReferenceRotation() + * + * + *-------------------------------------------------------------------*/ + +ivas_error IVAS_REND_SetReferenceRotation( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const IVAS_QUATERNION refRot /* i : Reference rotation */ +) +{ + ivas_error error; + + /* Validate function arguments */ + if ( hIvasRend == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + if ( ( error = ivas_orient_trk_SetReferenceRotation( hIvasRend->headRotData.hOrientationTracker, refRot ) ) != IVAS_ERR_OK ) + { + return error; + } + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * IVAS_REND_GetMainOrientation() + * + * + *-------------------------------------------------------------------*/ +// ToDo: not used +ivas_error IVAS_REND_GetMainOrientation( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + IVAS_QUATERNION *pOrientation /* i/o: Quaternion pointer for main orientation */ +) +{ + ivas_error error; + + if ( hIvasRend == NULL || pOrientation == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + if ( ( error = ivas_orient_trk_GetMainOrientation( hIvasRend->headRotData.hOrientationTracker, pOrientation ) ) != IVAS_ERR_OK ) + { + return error; + } + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * IVAS_REND_GetTrackedRotation() + * + * + *-------------------------------------------------------------------*/ +// ToDo: not used +ivas_error IVAS_REND_GetTrackedRotation( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + IVAS_QUATERNION *pRotation /* i/o: Quaternion pointer processed rotation */ +) +{ + ivas_error error; + + if ( hIvasRend == NULL || pRotation == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + if ( ( error = ivas_orient_trk_GetTrackedRotation( hIvasRend->headRotData.hOrientationTracker, pRotation ) ) != IVAS_ERR_OK ) + { + return error; + } + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * IVAS_REND_SetReferenceVector( ) + * + * Sets a reference vector spanning from listenerPos to refPos. Only + * available in OTR_TRACKING_REF_VEC and OTR_TRACKING_REF_VEC_LEV modes. + *---------------------------------------------------------------------*/ + +ivas_error IVAS_REND_SetReferenceVector( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const IVAS_VECTOR3 listenerPos, /* i : Listener position */ + const IVAS_VECTOR3 refPos /* i : Reference position */ +) +{ + if ( hIvasRend == NULL || hIvasRend->headRotData.hOrientationTracker == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + return ivas_orient_trk_SetReferenceVector( hIvasRend->headRotData.hOrientationTracker, listenerPos, refPos ); +} + + +/*---------------------------------------------------------------------* + * IVAS_REND_SetExternalOrientation() + * + * + *---------------------------------------------------------------------*/ + +ivas_error IVAS_REND_SetExternalOrientation( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + IVAS_QUATERNION *orientation, /* i : external orientation data */ + int8_t enableHeadRotation, /* i : flag to enable head rotation for this frame */ + int8_t enableExternalOrientation, /* i : flag to enable external orientation for this frame */ + int8_t enableRotationInterpolation, /* i : flag to interpolate rotations from current and previous frames */ + int16_t numFramesToTargetOrientation, /* i : number of frames until target orientation is reached */ + const int16_t sf_idx /* i : subframe index */ +) +{ + /* Validate function arguments */ + if ( hIvasRend == NULL || hIvasRend->hExternalOrientationData == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + if ( orientation == NULL ) + { + hIvasRend->hExternalOrientationData->enableExternalOrientation[sf_idx] = 0; + } + else + { + QuaternionInverse( *orientation, &hIvasRend->hExternalOrientationData->Quaternions[sf_idx] ); + + hIvasRend->hExternalOrientationData->enableHeadRotation[sf_idx] = enableHeadRotation; + hIvasRend->hExternalOrientationData->enableExternalOrientation[sf_idx] = enableExternalOrientation; + hIvasRend->hExternalOrientationData->enableRotationInterpolation[sf_idx] = enableRotationInterpolation; + hIvasRend->hExternalOrientationData->numFramesToTargetOrientation[sf_idx] = numFramesToTargetOrientation; + } + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * IVAS_REND_CombineHeadAndExternalOrientation() + * + * + *---------------------------------------------------------------------*/ + +ivas_error IVAS_REND_CombineHeadAndExternalOrientation( + IVAS_REND_HANDLE hIvasRend /* i/o: Renderer handle */ +) +{ + if ( hIvasRend == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + return combine_external_and_head_orientations_rend( &hIvasRend->headRotData, hIvasRend->hExternalOrientationData, hIvasRend->hCombinedOrientationData ); +} + + +/*---------------------------------------------------------------------* + * IVAS_REND_GetCombinedOrientation() + * + * + *---------------------------------------------------------------------*/ +// ToDo: not used +ivas_error IVAS_REND_GetCombinedOrientation( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + IVAS_QUATERNION *pOrientation /* i/o: Quaternion pointer processed orientation */ +) +{ + int16_t i; + + if ( hIvasRend == NULL || pOrientation == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + if ( hIvasRend->hCombinedOrientationData != NULL ) + { + for ( i = 0; i < hIvasRend->hCombinedOrientationData->num_subframes; ++i ) + { + pOrientation[i] = hIvasRend->hCombinedOrientationData->Quaternions[i]; + } + } + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * Local functions + *-------------------------------------------------------------------*/ + +/* Take one channel from input buffer and copy it to each channel + in output buffer, with different gain applied per output channel. + This function takes 2 gain vectors - one for the beginning and one + for the end of the buffer. Gain values are lineraly interpolated + for all samples in between. */ +static void renderBufferChannelLerp( + const IVAS_REND_AudioBuffer inAudio, + const int32_t inChannelIdx, + const float *const gainsCurrent, + const float *const gainsPrev, + IVAS_REND_AudioBuffer outAudio ) +{ + const float *inSmpl; + float *outSmpl; + float fadeIn; + float fadeOut; + int32_t i; + const float *lastInSmpl; + int16_t outChnlIdx; + float currentGain; + float previousGain; + + /* Pointer to behind last input sample */ + lastInSmpl = getSmplPtr( inAudio, inChannelIdx, inAudio.config.numSamplesPerChannel ); + + for ( outChnlIdx = 0; outChnlIdx < outAudio.config.numChannels; ++outChnlIdx ) + { + currentGain = gainsCurrent[outChnlIdx]; + previousGain = gainsPrev == NULL ? 0.f : gainsPrev[outChnlIdx]; + + /* Process current output channel only if applying non-zero gains */ + if ( fabsf( currentGain ) > EPSILON || ( gainsPrev != NULL && fabsf( previousGain ) > EPSILON ) ) + { + /* Reset input pointer to the beginning of input channel */ + inSmpl = getSmplPtr( inAudio, inChannelIdx, 0 ); + + /* Set output pointer to first output channel sample */ + outSmpl = getSmplPtr( outAudio, outChnlIdx, 0 ); + + if ( gainsPrev == NULL || fabsf( previousGain - currentGain ) <= EPSILON ) + { + /* If no interpolation from previous frame, apply current gain */ + do + { + *outSmpl += currentGain * ( *inSmpl ); + ++outSmpl; + ++inSmpl; + + } while ( inSmpl != lastInSmpl ); + } + else + { + i = 0; + + /* Otherwise use weighted average between previous and current gain */ + do + { + fadeIn = (float) i / ( outAudio.config.numSamplesPerChannel - 1 ); + fadeOut = 1.0f - fadeIn; + + *outSmpl += ( fadeIn * currentGain + fadeOut * previousGain ) * ( *inSmpl ); + ++outSmpl; + ++inSmpl; + ++i; + } while ( inSmpl != lastInSmpl ); + } + } + } + + return; +} + + +/* Take one channel from input buffer and copy it to each channel + in output buffer, with different gain applied per output channel */ +static void renderBufferChannel( + const IVAS_REND_AudioBuffer inAudio, + const int32_t inChannelIdx, + const float *const outputGains, + IVAS_REND_AudioBuffer outAudio ) +{ + renderBufferChannelLerp( inAudio, inChannelIdx, outputGains, NULL, outAudio ); + + return; +} + + +static ivas_error chooseCrossfade( + const IVAS_REND_HeadRotData *headRotData, + const float **pCrossfade ) +{ + *pCrossfade = headRotData->crossfade; + + return IVAS_ERR_OK; +} + +static ivas_error rotateFrameMc( + IVAS_REND_AudioBuffer inAudio, /* i : Input Audio buffer */ + AUDIO_CONFIG inConfig, /* i : Input Audio config */ + const LSSETUP_CUSTOM_STRUCT *pInCustomLs, /* i : Input Custom LS setup */ + const IVAS_REND_HeadRotData *headRotData, /* i : Head rotation data */ + const COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData, /* i : Combined head and external orientations */ + rotation_gains gains_prev, /* i/o: Previous frame rotation gains */ + const EFAP_HANDLE hEFAPdata, /* i : EFAP structure */ + IVAS_REND_AudioBuffer outAudio /* o : Output Audio buffer */ +) +{ + int16_t i; + int16_t j; + const float *crossfade; + int16_t num_subframes; + int16_t subframe_idx, subframe_len; + int16_t azimuth, elevation; + int16_t is_planar_setup, lfe_idx; + int16_t nchan; + int16_t ch_in, ch_out; + int16_t ch_in_woLFE, ch_out_woLFE; + float *readPtr, *writePtr; + const float *ls_azimuth, *ls_elevation; + rotation_matrix Rmat; + rotation_gains gains; + float tmp_gains[MAX_INPUT_CHANNELS]; + ivas_error error; + + push_wmops( "rotateFrameMc" ); + if ( ( error = chooseCrossfade( headRotData, &crossfade ) ) != IVAS_ERR_OK ) + { + return error; + } + num_subframes = ( hCombinedOrientationData != NULL ) ? ( *hCombinedOrientationData )->num_subframes : MAX_PARAM_SPATIAL_SUBFRAMES; + + if ( inConfig != IVAS_AUDIO_CONFIG_LS_CUSTOM ) + { + if ( ( error = getAudioConfigNumChannels( inConfig, &nchan ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + nchan = pInCustomLs->num_spk + pInCustomLs->num_lfe; + } + + if ( ( error = getMcConfigValues( inConfig, pInCustomLs, &ls_azimuth, &ls_elevation, &lfe_idx, &is_planar_setup ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* initialize gains to passthrough */ + for ( ch_in = 0; ch_in < nchan; ch_in++ ) + { + set_zero( gains[ch_in], nchan ); + gains[ch_in][ch_in] = 1.f; + } + + /* subframe loop */ + + subframe_len = inAudio.config.numSamplesPerChannel / num_subframes; + for ( subframe_idx = 0; subframe_idx < num_subframes; subframe_idx++ ) + { + for ( i = 0; i < 3; i++ ) + { + if ( hCombinedOrientationData != NULL ) + { + for ( j = 0; j < 3; j++ ) + { + Rmat[i][j] = ( *hCombinedOrientationData )->Rmat[subframe_idx][i][j]; + } + } + else + { + /* Set to identity */ + set_zero( Rmat[i], 3 ); + Rmat[i][i] = 1.0f; + } + } + + for ( ch_in = 0; ch_in < nchan; ch_in++ ) + { + /* skip LFE */ + if ( ch_in == lfe_idx ) + { + continue; + } + + /* input channel index without LFE */ + ch_in_woLFE = ( ( lfe_idx > 0 ) && ( ch_in >= lfe_idx ) ) ? ch_in - 1 : ch_in; + + /* gains for current subframe rotation */ + rotateAziEle( ls_azimuth[ch_in_woLFE], ls_elevation[ch_in_woLFE], &azimuth, &elevation, Rmat, is_planar_setup ); + + if ( hEFAPdata != NULL && ( ls_azimuth[ch_in_woLFE] != azimuth || ls_elevation[ch_in_woLFE] != elevation ) ) + { + efap_determine_gains( hEFAPdata, tmp_gains, azimuth, elevation, EFAP_MODE_EFAP ); + + for ( ch_out = 0; ch_out < nchan; ch_out++ ) + { + /* skip LFE */ + if ( ch_out == lfe_idx ) + { + continue; + } + + /* output channel index without LFE */ + ch_out_woLFE = ( ( lfe_idx > 0 ) && ( ch_out >= lfe_idx ) ) ? ch_out - 1 : ch_out; + + gains[ch_in][ch_out] = tmp_gains[ch_out_woLFE]; + } + } + } + + /* apply panning gains by mtx multiplication */ + for ( ch_out = 0; ch_out < nchan; ch_out++ ) + { + for ( ch_in = 0; ch_in < nchan; ch_in++ ) + { + writePtr = getSmplPtr( outAudio, ch_out, subframe_idx * subframe_len ); + readPtr = getSmplPtr( inAudio, ch_in, subframe_idx * subframe_len ); + /* crossfade with previous rotation gains */ + for ( i = 0; i < subframe_len; i++ ) + { + *writePtr++ += + ( *readPtr ) * ( ( 1 - crossfade[i] ) * gains_prev[ch_in][ch_out] ) + + ( *readPtr ) * ( crossfade[i] * gains[ch_in][ch_out] ); + readPtr++; + } + } + } + + /* move gains to gains_prev */ + for ( i = 0; i < nchan; i++ ) + { + mvr2r( gains[i], gains_prev[i], nchan ); + } + } + + pop_wmops(); + return IVAS_ERR_OK; +} + + +static ivas_error rotateFrameSba( + IVAS_REND_AudioBuffer inAudio, /* i : Input Audio buffer */ + const AUDIO_CONFIG inConfig, /* i : Input Audio config */ + const IVAS_REND_HeadRotData *headRotData, /* i : Head rotation data */ + const COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData, /* i : Combined head and external orientations */ + rotation_gains gains_prev, /* i/o: Previous frame rotation gains */ + IVAS_REND_AudioBuffer outAudio /* o : Output Audio buffer */ +) +{ + int16_t i, l, n, m; + int16_t m1, m2; + int16_t shd_rot_max_order; + const float *crossfade; + int16_t num_subframes; + int16_t subframe_idx, subframe_len; + + float *writePtr; + rotation_matrix Rmat; + float tmpRot[2 * HEADROT_ORDER + 1]; + rotation_gains gains; + ivas_error error; + int16_t idx; + float val, cf, oneminuscf; + + push_wmops( "rotateFrameSba" ); + + if ( ( error = chooseCrossfade( headRotData, &crossfade ) ) != IVAS_ERR_OK ) + { + return error; + } + num_subframes = ( hCombinedOrientationData != NULL ) ? ( *hCombinedOrientationData )->num_subframes : MAX_PARAM_SPATIAL_SUBFRAMES; + + if ( ( error = getAmbisonicsOrder( inConfig, &shd_rot_max_order ) ) != IVAS_ERR_OK ) + { + return error; + } + + subframe_len = inAudio.config.numSamplesPerChannel / num_subframes; + for ( subframe_idx = 0; subframe_idx < num_subframes; subframe_idx++ ) + { + /* initialize rotation matrices with zeros */ + for ( i = 0; i < HEADROT_SHMAT_DIM; i++ ) + { + set_zero( gains[i], HEADROT_SHMAT_DIM ); + } + + for ( i = 0; i < 3; i++ ) + { + if ( hCombinedOrientationData != NULL ) + { + for ( l = 0; l < 3; l++ ) + { + Rmat[i][l] = ( *hCombinedOrientationData )->Rmat[subframe_idx][i][l]; + } + } + else + { + /* Set to identity */ + set_zero( Rmat[i], 3 ); + Rmat[i][i] = 1.0f; + } + } + + /* calculate ambisonics rotation matrices for the previous and current frames */ + SHrotmatgen( gains, Rmat, shd_rot_max_order ); + + for ( i = 0; i < subframe_len; i++ ) + { + idx = subframe_idx * subframe_len + i; + cf = crossfade[i]; + oneminuscf = 1 - cf; + /* As the rotation matrix becomes block diagonal in a SH basis, we can*/ + /* apply each angular-momentum block individually to save complexity. */ + + /* loop over l blocks */ + m1 = 1; + m2 = 4; + for ( l = 1; l <= shd_rot_max_order; l++ ) + { + /* compute mtx-vector product for this l */ + for ( n = m1; n < m2; n++ ) + { + tmpRot[n - m1] = 0.f; + + for ( m = m1; m < m2; m++ ) + { + val = inAudio.data[m * inAudio.config.numSamplesPerChannel + idx]; + /* crossfade with previous rotation gains */ + tmpRot[n - m1] += ( cf * gains[n][m] * val + oneminuscf * gains_prev[n][m] * val ); + } + } + /* write back the result */ + for ( n = m1; n < m2; n++ ) + { + writePtr = getSmplPtr( outAudio, n, idx ); + ( *writePtr ) = tmpRot[n - m1]; + } + m1 = m2; + m2 += 2 * ( l + 1 ) + 1; + } + } + + /* move SHrotmat to SHrotmat_prev */ + for ( i = 0; i < HEADROT_SHMAT_DIM; i++ ) + { + mvr2r( gains[i], gains_prev[i], HEADROT_SHMAT_DIM ); + } + } + + pop_wmops(); + + return IVAS_ERR_OK; +} + + +static ivas_error renderIsmToBinaural( + const input_ism *ismInput, + IVAS_REND_AudioBuffer outAudio ) +{ + float tmpTDRendBuffer[MAX_OUTPUT_CHANNELS][L_FRAME48k]; + ivas_error error; + int16_t ism_md_subframe_update_ext; + + push_wmops( "renderIsmToBinaural" ); + /* Metadata Delay to sync with audio delay converted from ms to 5ms (1000/50/4) subframe index */ + ism_md_subframe_update_ext = (int16_t) round( ismInput->ism_metadata_delay_ms / ( 1000 / FRAMES_PER_SEC / MAX_PARAM_SPATIAL_SUBFRAMES ) ); + copyBufferTo2dArray( ismInput->base.inputBuffer, tmpTDRendBuffer ); + + if ( ( error = ivas_td_binaural_renderer_ext( &ismInput->tdRendWrapper, ismInput->base.inConfig, NULL, ismInput->base.ctx.pCombinedOrientationData, &ismInput->currentPos, ismInput->hReverb, ism_md_subframe_update_ext, + *ismInput->base.ctx.pOutSampleRate, outAudio.config.numSamplesPerChannel, tmpTDRendBuffer ) ) != IVAS_ERR_OK ) + { + return error; + } + + accumulate2dArrayToBuffer( tmpTDRendBuffer, &outAudio ); + + pop_wmops(); + + return IVAS_ERR_OK; +} + + +static int16_t getNumSubframesInBuffer( + const IVAS_REND_AudioBuffer *buffer, + const int32_t sampleRate ) +{ + + + return (int16_t) ( buffer->config.numSamplesPerChannel / ( sampleRate / FRAMES_PER_SEC / MAX_PARAM_SPATIAL_SUBFRAMES ) ); +} + + +static ivas_error renderIsmToBinauralRoom( + input_ism *ismInput, + IVAS_REND_AudioBuffer outAudio ) +{ + int16_t position_changed; + int16_t i, j; + int16_t azi_rot, ele_rot; + int16_t subframe_idx; + int16_t tmp; + rotation_matrix Rmat; + float tmpRendBuffer[MAX_OUTPUT_CHANNELS][L_FRAME48k]; + ivas_error error; + pan_vector currentPanGains; + IVAS_REND_AudioBuffer tmpMcBuffer; + IVAS_ISM_METADATA rotatedPosPrev; + IVAS_ISM_METADATA rotatedPos; + const COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData; + int8_t combinedOrientationEnabled; + float *p_tmpRendBuffer[MAX_OUTPUT_CHANNELS]; + + for ( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) + { + p_tmpRendBuffer[i] = tmpRendBuffer[i]; + } + + push_wmops( "renderIsmToBinauralRoom" ); + + rotatedPosPrev = defaultObjectPosition(); + rotatedPos = defaultObjectPosition(); + + hCombinedOrientationData = ismInput->base.ctx.pCombinedOrientationData; + combinedOrientationEnabled = 0; + if ( hCombinedOrientationData != NULL ) + { + for ( subframe_idx = 0; subframe_idx < ( *hCombinedOrientationData )->num_subframes; subframe_idx++ ) + { + + if ( ( *hCombinedOrientationData )->enableCombinedOrientation[subframe_idx] != 0 ) + { + combinedOrientationEnabled = 1; + break; + } + } + } + + if ( combinedOrientationEnabled ) + { + for ( subframe_idx = 0; subframe_idx < 1; subframe_idx++ ) + { + for ( i = 0; i < 3; i++ ) + { + if ( hCombinedOrientationData != NULL && ( *hCombinedOrientationData )->enableCombinedOrientation[subframe_idx] ) + { + for ( j = 0; j < 3; j++ ) + { + Rmat[i][j] = ( *hCombinedOrientationData )->Rmat[subframe_idx][i][j]; + } + } + else + { + /* Set to identity */ + set_zero( Rmat[i], 3 ); + Rmat[i][i] = 1.0f; + } + } + } + } + + /* get previous position */ + if ( combinedOrientationEnabled ) + { + rotateAziEle( ismInput->previousPos.azimuth, ismInput->previousPos.elevation, &azi_rot, &ele_rot, ismInput->rot_mat_prev, 0 ); + rotatedPosPrev.azimuth = (float) azi_rot; + rotatedPosPrev.elevation = (float) ele_rot; + } + else + { + rotatedPosPrev.azimuth = ismInput->previousPos.azimuth; + rotatedPosPrev.elevation = ismInput->previousPos.elevation; + } + + /* get current position */ + if ( combinedOrientationEnabled ) + { + rotateAziEle( ismInput->currentPos.azimuth, ismInput->currentPos.elevation, &azi_rot, &ele_rot, Rmat, 0 ); + rotatedPos.azimuth = (float) azi_rot; + rotatedPos.elevation = (float) ele_rot; + } + else + { + rotatedPos.azimuth = ismInput->currentPos.azimuth; + rotatedPos.elevation = ismInput->currentPos.elevation; + } + + position_changed = !ismInput->firstFrameRendered || checkObjectPositionChanged( &rotatedPos, &rotatedPosPrev ); + + /* set previous gains if this is the first frame */ + if ( ( error = getEfapGains( *ismInput->base.ctx.pEfapOutWrapper, rotatedPosPrev.azimuth, rotatedPosPrev.elevation, ismInput->prev_pan_gains ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* compute gains only if position changed */ + if ( position_changed ) + { + if ( ( error = getEfapGains( *ismInput->base.ctx.pEfapOutWrapper, + rotatedPos.azimuth, + rotatedPos.elevation, + currentPanGains ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* intermediate rendering to 7_1_4 */ + tmpMcBuffer = ismInput->base.inputBuffer; + + if ( ( error = getAudioConfigNumChannels( IVAS_AUDIO_CONFIG_7_1_4, &tmp ) ) != IVAS_ERR_OK ) + { + return error; + } + + tmpMcBuffer.config.numChannels = tmp; + tmpMcBuffer.data = malloc( tmpMcBuffer.config.numSamplesPerChannel * tmpMcBuffer.config.numChannels * sizeof( float ) ); + set_zero( tmpMcBuffer.data, tmpMcBuffer.config.numSamplesPerChannel * tmpMcBuffer.config.numChannels ); + + renderBufferChannelLerp( ismInput->base.inputBuffer, 0, + position_changed ? currentPanGains : ismInput->prev_pan_gains, + position_changed ? ismInput->prev_pan_gains : NULL, + tmpMcBuffer ); + + copyBufferTo2dArray( tmpMcBuffer, tmpRendBuffer ); + + /* save gains for next frame */ + for ( i = 0; i < 3; i++ ) + { + mvr2r( Rmat[i], ismInput->rot_mat_prev[i], 3 ); + } + + if ( position_changed ) + { + mvr2r( currentPanGains, ismInput->prev_pan_gains, MAX_OUTPUT_CHANNELS ); + } + + + /* render 7_1_4 with BRIRs */ + if ( ( error = ivas_rend_crendProcess( ismInput->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR, + NULL, NULL, NULL, NULL, p_tmpRendBuffer, *ismInput->base.ctx.pOutSampleRate, + getNumSubframesInBuffer( &outAudio, *ismInput->base.ctx.pOutSampleRate ) ) ) != IVAS_ERR_OK ) + + { + return error; + } + + accumulate2dArrayToBuffer( tmpRendBuffer, &outAudio ); + + free( tmpMcBuffer.data ); + pop_wmops(); + + return IVAS_ERR_OK; +} + + +static ivas_error renderIsmToBinauralReverb( + input_ism *ismInput, + IVAS_REND_AudioBuffer outAudio ) +{ + float tmpRendBuffer[MAX_OUTPUT_CHANNELS][L_FRAME48k]; + ivas_error error; + int16_t ism_md_subframe_update_ext; + + push_wmops( "renderIsmToBinauralRoom" ); + + /* Metadata Delay to sync with audio delay converted from ms to 5ms (1000/50/4) subframe index */ + ism_md_subframe_update_ext = (int16_t) round( ismInput->ism_metadata_delay_ms / ( 1000 / FRAMES_PER_SEC / MAX_PARAM_SPATIAL_SUBFRAMES ) ); + copyBufferTo2dArray( ismInput->base.inputBuffer, tmpRendBuffer ); + + if ( ( error = ivas_td_binaural_renderer_ext( &ismInput->tdRendWrapper, ismInput->base.inConfig, NULL, ismInput->base.ctx.pCombinedOrientationData, &ismInput->currentPos, ismInput->hReverb, + ism_md_subframe_update_ext, *ismInput->base.ctx.pOutSampleRate, outAudio.config.numSamplesPerChannel, tmpRendBuffer ) ) != IVAS_ERR_OK ) + { + return error; + } + + accumulate2dArrayToBuffer( tmpRendBuffer, &outAudio ); + pop_wmops(); + + return IVAS_ERR_OK; +} + + +static ivas_error renderIsmToMc( + input_ism *ismInput, + const IVAS_REND_AudioBuffer outAudio ) +{ + int8_t position_changed; + pan_vector currentPanGains; + ivas_error error; + + push_wmops( "renderIsmToMc" ); + + position_changed = !ismInput->firstFrameRendered || checkObjectPositionChanged( &ismInput->currentPos, &ismInput->previousPos ); + if ( *ismInput->base.ctx.pOutConfig == IVAS_AUDIO_CONFIG_STEREO ) + { + if ( ismInput->nonDiegeticPan ) + { + ismInput->prev_pan_gains[0] = currentPanGains[0] = ( ismInput->nonDiegeticPanGain + 1.f ) * 0.5f; + ismInput->prev_pan_gains[1] = currentPanGains[1] = 1.f - currentPanGains[0]; + } + else + { + set_zero( currentPanGains, MAX_OUTPUT_CHANNELS ); + + ivas_ism_get_stereo_gains( ismInput->currentPos.azimuth, ismInput->currentPos.elevation, ¤tPanGains[0], ¤tPanGains[1] ); + + set_zero( ismInput->prev_pan_gains, MAX_OUTPUT_CHANNELS ); + + ivas_ism_get_stereo_gains( ismInput->previousPos.azimuth, ismInput->previousPos.elevation, &ismInput->prev_pan_gains[0], &ismInput->prev_pan_gains[1] ); + } + } + else + { + /* compute gains only if position changed */ + if ( position_changed ) + { + // TODO tmu review when #215 is resolved + if ( ( error = getEfapGains( *ismInput->base.ctx.pEfapOutWrapper, + (int16_t) floorf( ismInput->currentPos.azimuth + 0.5f ), + (int16_t) floorf( ismInput->currentPos.elevation + 0.5f ), + currentPanGains ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* set previous gains if this is the first frame */ + if ( !ismInput->firstFrameRendered ) + { + // TODO tmu review when #215 is resolved + if ( ( error = getEfapGains( *ismInput->base.ctx.pEfapOutWrapper, + (int16_t) floorf( ismInput->previousPos.azimuth + 0.5f ), + (int16_t) floorf( ismInput->previousPos.elevation + 0.5f ), + ismInput->prev_pan_gains ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + + /* Assume num channels in audio buffer to be 1. + * This should have been validated in IVAS_REND_FeedInputAudio() */ + renderBufferChannelLerp( ismInput->base.inputBuffer, 0, + position_changed ? currentPanGains : ismInput->prev_pan_gains, + position_changed ? ismInput->prev_pan_gains : NULL, + outAudio ); + + if ( position_changed ) + { + mvr2r( currentPanGains, ismInput->prev_pan_gains, MAX_OUTPUT_CHANNELS ); + } + + pop_wmops(); + + return IVAS_ERR_OK; +} + + +static ivas_error renderIsmToSba( + input_ism *ismInput, + const AUDIO_CONFIG outConfig, + const IVAS_REND_AudioBuffer outAudio ) +{ + int8_t position_changed; + int16_t ambiOrderOut; + int16_t numOutChannels; + pan_vector currentPanGains; + ivas_error error; + error = IVAS_ERR_OK; + + push_wmops( "renderIsmToSba" ); + + if ( ( error = getAudioConfigNumChannels( outConfig, &numOutChannels ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = getAmbisonicsOrder( outConfig, &ambiOrderOut ) ) != IVAS_ERR_OK ) + { + return error; + } + + position_changed = !ismInput->firstFrameRendered || checkObjectPositionChanged( &ismInput->currentPos, &ismInput->previousPos ); + + /* set previous gains if this is the first frame */ + if ( !ismInput->firstFrameRendered ) + { + // TODO tmu review when #215 is resolved + ivas_dirac_dec_get_response( (int16_t) floorf( ismInput->previousPos.azimuth + 0.5f ), + (int16_t) floorf( ismInput->previousPos.elevation + 0.5f ), + ismInput->prev_pan_gains, + ambiOrderOut ); + } + + /* compute gains only if position changed */ + if ( position_changed ) + { + // TODO tmu review when #215 is resolved + ivas_dirac_dec_get_response( (int16_t) floorf( ismInput->currentPos.azimuth + 0.5f ), + (int16_t) floorf( ismInput->currentPos.elevation + 0.5f ), + currentPanGains, + ambiOrderOut ); + } + + /* Assume num channels in audio buffer to be 1. + * This should have been validated in IVAS_REND_FeedInputAudio() */ + renderBufferChannelLerp( ismInput->base.inputBuffer, 0, + position_changed ? currentPanGains : ismInput->prev_pan_gains, + position_changed ? ismInput->prev_pan_gains : NULL, + outAudio ); + + if ( position_changed ) + { + mvr2r( currentPanGains, ismInput->prev_pan_gains, MAX_OUTPUT_CHANNELS ); + } + pop_wmops(); + + return error; +} + + + + +static void renderIsmToMasa( + input_ism *ismInput, + IVAS_REND_AudioBuffer outAudio ) +{ + float tmpRendBuffer[MAX_NUM_OBJECTS][L_FRAME48k]; + + push_wmops( "renderIsmToMasa" ); + + copyBufferTo2dArray( ismInput->base.inputBuffer, tmpRendBuffer ); + + ivas_omasa_ana( ismInput->hOMasa, tmpRendBuffer, ismInput->base.inputBuffer.config.numSamplesPerChannel, outAudio.config.numChannels, ismInput->base.inputBuffer.config.numChannels ); + + accumulate2dArrayToBuffer( tmpRendBuffer, &outAudio ); + + pop_wmops(); + + return; +} + + +static ivas_error renderInputIsm( + input_ism *ismInput, + const AUDIO_CONFIG outConfig, + const IVAS_REND_AudioBuffer outAudio ) +{ + ivas_error error; + IVAS_REND_AudioBuffer inAudio; + + error = IVAS_ERR_OK; + inAudio = ismInput->base.inputBuffer; + + if ( ismInput->base.numNewSamplesPerChannel != outAudio.config.numSamplesPerChannel ) + { + return IVAS_ERROR( IVAS_ERR_INVALID_BUFFER_SIZE, "Mismatch between the number of input samples vs number of requested output samples - currently not allowed" ); + } + ismInput->base.numNewSamplesPerChannel = 0; + + /* Apply input gain to new audio */ + v_multc( inAudio.data, ismInput->base.gain, inAudio.data, inAudio.config.numSamplesPerChannel * inAudio.config.numChannels ); + + switch ( getAudioConfigType( outConfig ) ) + { + case IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED: + error = renderIsmToMc( ismInput, outAudio ); + break; + case IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS: + error = renderIsmToSba( ismInput, outConfig, outAudio ); + break; + case IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL: + switch ( outConfig ) + { + case IVAS_AUDIO_CONFIG_BINAURAL: + error = renderIsmToBinaural( ismInput, outAudio ); + break; + case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR: + error = renderIsmToBinauralRoom( ismInput, outAudio ); + break; + case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB: + error = renderIsmToBinauralReverb( ismInput, outAudio ); + break; + default: + return IVAS_ERR_INVALID_OUTPUT_FORMAT; + } + break; + case IVAS_REND_AUDIO_CONFIG_TYPE_MASA: + renderIsmToMasa( ismInput, outAudio ); + break; + default: + return IVAS_ERR_INVALID_OUTPUT_FORMAT; + } + + /* Check error here to keep switch statement more compact */ + if ( error != IVAS_ERR_OK ) + { + return error; + } + + ismInput->firstFrameRendered = TRUE; + + return error; +} + + +static ivas_error renderActiveInputsIsm( + IVAS_REND_HANDLE hIvasRend, + IVAS_REND_AudioBuffer outAudio ) +{ + int16_t i; + input_ism *pCurrentInput; + ivas_error error; + + for ( i = 0, pCurrentInput = hIvasRend->inputsIsm; i < RENDERER_MAX_ISM_INPUTS; ++i, ++pCurrentInput ) + { + if ( pCurrentInput->base.inConfig == IVAS_AUDIO_CONFIG_INVALID ) + { + /* Skip inactive inputs */ + continue; + } + + if ( ( error = renderInputIsm( pCurrentInput, hIvasRend->outputConfig, outAudio ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + return IVAS_ERR_OK; +} + + +static ivas_error renderLfeToBinaural( + const input_mc *mcInput, + IVAS_REND_AudioBuffer outAudio ) +{ + int16_t lfe_idx; + float gain; + int16_t ear_idx; + float tmpLfeBuffer[MAX_BUFFER_LENGTH_PER_CHANNEL]; + int16_t frame_size, num_cpy_smpl_cur_frame, num_cpy_smpl_prev_frame; + const float *lfeInput; + float *writePtr; + + assert( ( outAudio.config.numChannels == 2 ) && "Must be binaural output" ); + + push_wmops( "renderLfeToBinaural" ); + + gain = GAIN_LFE; + + if ( mcInput->base.inConfig != IVAS_AUDIO_CONFIG_LS_CUSTOM ) + { + lfe_idx = LFE_CHANNEL; + } + else if ( mcInput->customLsInput.num_lfe > 0 ) + { + lfe_idx = mcInput->customLsInput.lfe_idx[0]; + } + else + { + /* no LFE to render */ + return IVAS_ERR_OK; + } + + /* --- Prepare LFE signal to be added to binaural output --- */ + lfeInput = getSmplPtr( mcInput->base.inputBuffer, lfe_idx, 0 ); + frame_size = mcInput->base.inputBuffer.config.numSamplesPerChannel; + num_cpy_smpl_prev_frame = mcInput->binauralDelaySmp; + num_cpy_smpl_cur_frame = frame_size - num_cpy_smpl_prev_frame; + + /* Assuming LFE should be delayed by less that the duration of one frame */ + assert( mcInput->binauralDelaySmp < frame_size ); + + /* Get delayed LFE signal from previous frame, apply gain and save in tmp buffer */ + v_multc( mcInput->lfeDelayBuffer, gain, tmpLfeBuffer, num_cpy_smpl_prev_frame ); + + /* Continue filling tmp buffer, now with LFE signal from current frame */ + v_multc( lfeInput, gain, tmpLfeBuffer + num_cpy_smpl_prev_frame, num_cpy_smpl_cur_frame ); + + /* Save remaining LFE samples of current frame for next frame */ + mvr2r( lfeInput + num_cpy_smpl_cur_frame, mcInput->lfeDelayBuffer, num_cpy_smpl_prev_frame ); + + /* Copy LFE to left and right ears */ + for ( ear_idx = 0; ear_idx < BINAURAL_CHANNELS; ++ear_idx ) + { + writePtr = getSmplPtr( outAudio, ear_idx, 0 ); + v_add( writePtr, tmpLfeBuffer, writePtr, frame_size ); + } + + pop_wmops(); + + return IVAS_ERR_OK; +} + + +static ivas_error renderMcToBinaural( + input_mc *mcInput, + const AUDIO_CONFIG outConfig, + IVAS_REND_AudioBuffer outAudio ) +{ + float tmpRendBuffer[MAX_OUTPUT_CHANNELS][L_FRAME48k]; + AUDIO_CONFIG inConfig; + ivas_error error; + IVAS_REND_AudioBuffer tmpRotBuffer; + const COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData; + int8_t combinedOrientationEnabled; + int16_t subframe_idx; + float *p_tmpRendBuffer[MAX_OUTPUT_CHANNELS]; + int16_t i; + + for ( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) + { + p_tmpRendBuffer[i] = tmpRendBuffer[i]; + } + + push_wmops( "renderMcToBinaural" ); + inConfig = mcInput->base.inConfig; + + hCombinedOrientationData = mcInput->base.ctx.pCombinedOrientationData; + combinedOrientationEnabled = 0; + if ( hCombinedOrientationData != NULL ) + { + for ( subframe_idx = 0; subframe_idx < ( *hCombinedOrientationData )->num_subframes; subframe_idx++ ) + { + if ( ( *hCombinedOrientationData )->enableCombinedOrientation[subframe_idx] != 0 ) + { + combinedOrientationEnabled = 1; + break; + } + } + } + + if ( ( inConfig == IVAS_AUDIO_CONFIG_LS_CUSTOM ) || ( combinedOrientationEnabled && ( inConfig == IVAS_AUDIO_CONFIG_5_1 || inConfig == IVAS_AUDIO_CONFIG_7_1 ) ) ) + { + copyBufferTo2dArray( mcInput->base.inputBuffer, tmpRendBuffer ); + + if ( ( error = ivas_td_binaural_renderer_ext( &mcInput->tdRendWrapper, mcInput->base.inConfig, &mcInput->customLsInput, mcInput->base.ctx.pCombinedOrientationData, NULL, mcInput->hReverb, + 0, *mcInput->base.ctx.pOutSampleRate, mcInput->base.inputBuffer.config.numSamplesPerChannel, tmpRendBuffer ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + /* apply rotation */ + if ( combinedOrientationEnabled ) + { + tmpRotBuffer = mcInput->base.inputBuffer; + tmpRotBuffer.data = malloc( tmpRotBuffer.config.numSamplesPerChannel * tmpRotBuffer.config.numChannels * sizeof( float ) ); + set_zero( tmpRotBuffer.data, tmpRotBuffer.config.numSamplesPerChannel * tmpRotBuffer.config.numChannels ); + + if ( ( error = rotateFrameMc( mcInput->base.inputBuffer, mcInput->base.inConfig, &mcInput->customLsInput, mcInput->base.ctx.pHeadRotData, mcInput->base.ctx.pCombinedOrientationData, mcInput->rot_gains_prev, mcInput->efapInWrapper.hEfap, tmpRotBuffer ) ) != IVAS_ERR_OK ) + { + return error; + } + + copyBufferTo2dArray( tmpRotBuffer, tmpRendBuffer ); + free( tmpRotBuffer.data ); + } + else + { + copyBufferTo2dArray( mcInput->base.inputBuffer, tmpRendBuffer ); + } + + /* call CREND */ + if ( ( error = ivas_rend_crendProcess( mcInput->crendWrapper, mcInput->base.inConfig, outConfig, NULL, NULL, NULL, NULL, p_tmpRendBuffer, *mcInput->base.ctx.pOutSampleRate, + getNumSubframesInBuffer( &outAudio, *mcInput->base.ctx.pOutSampleRate ) ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + accumulate2dArrayToBuffer( tmpRendBuffer, &outAudio ); + + if ( ( error = renderLfeToBinaural( mcInput, outAudio ) ) != IVAS_ERR_OK ) + + { + return error; + } + + pop_wmops(); + return IVAS_ERR_OK; +} + + +static ivas_error renderMcToBinauralRoom( + input_mc *mcInput, + const AUDIO_CONFIG outConfig, + IVAS_REND_AudioBuffer outAudio ) +{ + float tmpRendBuffer[MAX_OUTPUT_CHANNELS][L_FRAME48k]; + AUDIO_CONFIG inConfig; + ivas_error error; + IVAS_REND_AudioBuffer tmpRotBuffer; + float *p_tmpRendBuffer[MAX_OUTPUT_CHANNELS]; + int16_t i; + const COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData; + int8_t combinedOrientationEnabled; + int16_t subframe_idx; + + for ( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) + { + p_tmpRendBuffer[i] = tmpRendBuffer[i]; + } + + push_wmops( "renderMcToBinauralRoom" ); + inConfig = mcInput->base.inConfig; + + hCombinedOrientationData = mcInput->base.ctx.pCombinedOrientationData; + combinedOrientationEnabled = 0; + if ( hCombinedOrientationData != NULL ) + { + for ( subframe_idx = 0; subframe_idx < ( *hCombinedOrientationData )->num_subframes; subframe_idx++ ) + { + if ( ( *hCombinedOrientationData )->enableCombinedOrientation[subframe_idx] != 0 ) + { + combinedOrientationEnabled = 1; + break; + } + } + } + + if ( ( mcInput->hReverb != NULL && outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) && ( ( inConfig == IVAS_AUDIO_CONFIG_LS_CUSTOM ) || ( combinedOrientationEnabled && ( inConfig == IVAS_AUDIO_CONFIG_5_1 || inConfig == IVAS_AUDIO_CONFIG_7_1 ) ) ) ) + { + copyBufferTo2dArray( mcInput->base.inputBuffer, tmpRendBuffer ); + + if ( ( error = ivas_td_binaural_renderer_ext( &mcInput->tdRendWrapper, mcInput->base.inConfig, &mcInput->customLsInput, mcInput->base.ctx.pCombinedOrientationData, NULL, mcInput->hReverb, + 0, *mcInput->base.ctx.pOutSampleRate, mcInput->base.inputBuffer.config.numSamplesPerChannel, tmpRendBuffer ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + /* apply rotation */ + if ( combinedOrientationEnabled ) + { + tmpRotBuffer = mcInput->base.inputBuffer; + tmpRotBuffer.data = malloc( tmpRotBuffer.config.numSamplesPerChannel * tmpRotBuffer.config.numChannels * sizeof( float ) ); + set_zero( tmpRotBuffer.data, tmpRotBuffer.config.numSamplesPerChannel * tmpRotBuffer.config.numChannels ); + + if ( ( error = rotateFrameMc( mcInput->base.inputBuffer, mcInput->base.inConfig, &mcInput->customLsInput, mcInput->base.ctx.pHeadRotData, mcInput->base.ctx.pCombinedOrientationData, + mcInput->rot_gains_prev, + mcInput->efapInWrapper.hEfap, tmpRotBuffer ) ) != IVAS_ERR_OK ) + { + return error; + } + + copyBufferTo2dArray( tmpRotBuffer, tmpRendBuffer ); + free( tmpRotBuffer.data ); + } + else + { + copyBufferTo2dArray( mcInput->base.inputBuffer, tmpRendBuffer ); + } + + /* call CREND */ + if ( ( error = ivas_rend_crendProcess( mcInput->crendWrapper, mcInput->base.inConfig, outConfig, NULL, NULL, NULL, NULL, p_tmpRendBuffer, *mcInput->base.ctx.pOutSampleRate, + getNumSubframesInBuffer( &outAudio, *mcInput->base.ctx.pOutSampleRate ) ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + accumulate2dArrayToBuffer( tmpRendBuffer, &outAudio ); + + if ( ( error = renderLfeToBinaural( mcInput, outAudio ) ) != IVAS_ERR_OK ) + { + return error; + } + + pop_wmops(); + return IVAS_ERR_OK; +} + + +static ivas_error renderMcCustomLsToBinauralRoom( + input_mc *mcInput, + const AUDIO_CONFIG outConfig, + IVAS_REND_AudioBuffer outAudio ) +{ + int16_t i; + int16_t tmp; + float tmpCrendBuffer[MAX_OUTPUT_CHANNELS][L_FRAME48k]; + ivas_error error; + IVAS_REND_AudioBuffer tmpRotBuffer; + IVAS_REND_AudioBuffer tmpMcBuffer; + IVAS_REND_AudioBuffer *tmpBufPtr; + float *p_tmpCrendBuffer[MAX_OUTPUT_CHANNELS]; + const COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData; + int8_t combinedOrientationEnabled; + int16_t subframe_idx; + + push_wmops( "renderMcCustomLsToBinauralRoom" ); + tmpRotBuffer = outAudio; /* avoid compilation warning */ + + for ( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) + { + p_tmpCrendBuffer[i] = tmpCrendBuffer[i]; + } + + hCombinedOrientationData = mcInput->base.ctx.pCombinedOrientationData; + combinedOrientationEnabled = 0; + if ( hCombinedOrientationData != NULL ) + { + for ( subframe_idx = 0; subframe_idx < ( *hCombinedOrientationData )->num_subframes; subframe_idx++ ) + { + if ( ( *hCombinedOrientationData )->enableCombinedOrientation[subframe_idx] != 0 ) + { + combinedOrientationEnabled = 1; + break; + } + } + } + + /* apply rotation */ + if ( combinedOrientationEnabled ) + { + tmpRotBuffer = mcInput->base.inputBuffer; + tmpRotBuffer.data = malloc( tmpRotBuffer.config.numSamplesPerChannel * tmpRotBuffer.config.numChannels * sizeof( float ) ); + set_zero( tmpRotBuffer.data, tmpRotBuffer.config.numSamplesPerChannel * tmpRotBuffer.config.numChannels ); + + if ( ( error = rotateFrameMc( mcInput->base.inputBuffer, mcInput->base.inConfig, &mcInput->customLsInput, mcInput->base.ctx.pHeadRotData, mcInput->base.ctx.pCombinedOrientationData, + mcInput->rot_gains_prev, + mcInput->efapInWrapper.hEfap, tmpRotBuffer ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* intermediate conversion to 7_1_4 */ + tmpMcBuffer = mcInput->base.inputBuffer; + + if ( ( error = getAudioConfigNumChannels( IVAS_AUDIO_CONFIG_7_1_4, &tmp ) ) != IVAS_ERR_OK ) + { + return error; + } + + tmpMcBuffer.config.numChannels = tmp; + tmpMcBuffer.data = malloc( tmpMcBuffer.config.numSamplesPerChannel * tmpMcBuffer.config.numChannels * sizeof( float ) ); + set_zero( tmpMcBuffer.data, tmpMcBuffer.config.numSamplesPerChannel * tmpMcBuffer.config.numChannels ); + + tmpBufPtr = ( combinedOrientationEnabled ) ? &tmpRotBuffer : &mcInput->base.inputBuffer; + for ( i = 0; i < mcInput->base.inputBuffer.config.numChannels; i++ ) + { + renderBufferChannel( *tmpBufPtr, i, mcInput->panGains[i], tmpMcBuffer ); + } + copyBufferTo2dArray( tmpMcBuffer, tmpCrendBuffer ); + + /* call CREND */ + if ( ( error = ivas_rend_crendProcess( mcInput->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, NULL, NULL, NULL, NULL, + p_tmpCrendBuffer, *mcInput->base.ctx.pOutSampleRate, getNumSubframesInBuffer( &outAudio, *mcInput->base.ctx.pOutSampleRate ) ) ) != IVAS_ERR_OK ) + { + return error; + } + + accumulate2dArrayToBuffer( tmpCrendBuffer, &outAudio ); + + if ( ( error = renderLfeToBinaural( mcInput, outAudio ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( combinedOrientationEnabled ) + { + free( tmpRotBuffer.data ); + } + free( tmpMcBuffer.data ); + + pop_wmops(); + return IVAS_ERR_OK; +} + + +static void renderMcToMc( + const input_mc *mcInput, + IVAS_REND_AudioBuffer outAudio ) +{ + int16_t i; + IVAS_REND_AudioBuffer inAudio; + + push_wmops( "renderMcToMc" ); + inAudio = mcInput->base.inputBuffer; + + for ( i = 0; i < inAudio.config.numChannels; ++i ) + { + renderBufferChannel( inAudio, i, mcInput->panGains[i], outAudio ); + } + + pop_wmops(); + return; +} + + +static void renderMcToSba( + const input_mc *mcInput, + IVAS_REND_AudioBuffer outAudio ) +{ + int16_t i; + IVAS_REND_AudioBuffer inAudio; + + push_wmops( "renderMcToSba" ); + inAudio = mcInput->base.inputBuffer; + + for ( i = 0; i < inAudio.config.numChannels; ++i ) + { + renderBufferChannel( inAudio, i, mcInput->panGains[i], outAudio ); + } + + pop_wmops(); + return; +} + + +static void renderMcToMasa( + input_mc *mcInput, + IVAS_REND_AudioBuffer outAudio ) +{ + float tmpRendBuffer[MAX_OUTPUT_CHANNELS][L_FRAME48k]; + + push_wmops( "renderMcToMasa" ); + copyBufferTo2dArray( mcInput->base.inputBuffer, tmpRendBuffer ); + + ivas_mcmasa_ana( mcInput->hMcMasa, tmpRendBuffer, mcInput->base.inputBuffer.config.numSamplesPerChannel, outAudio.config.numChannels, mcInput->base.inputBuffer.config.numChannels ); + + accumulate2dArrayToBuffer( tmpRendBuffer, &outAudio ); + + pop_wmops(); + return; +} + + + + +static ivas_error renderInputMc( + input_mc *mcInput, + const AUDIO_CONFIG outConfig, + IVAS_REND_AudioBuffer outAudio ) +{ + ivas_error error; + IVAS_REND_AudioBuffer inAudio; + + error = IVAS_ERR_OK; + + inAudio = mcInput->base.inputBuffer; + + if ( mcInput->base.numNewSamplesPerChannel != outAudio.config.numSamplesPerChannel ) + { + return IVAS_ERROR( IVAS_ERR_INVALID_BUFFER_SIZE, "Mismatch between the number of input samples vs number of requested output samples - currently not allowed" ); + } + mcInput->base.numNewSamplesPerChannel = 0; + + /* Apply input gain to new audio */ + v_multc( inAudio.data, mcInput->base.gain, inAudio.data, inAudio.config.numSamplesPerChannel * inAudio.config.numChannels ); + + switch ( getAudioConfigType( outConfig ) ) + { + case IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED: + renderMcToMc( mcInput, outAudio ); + break; + case IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS: + renderMcToSba( mcInput, outAudio ); + break; + case IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL: + switch ( outConfig ) + { + case IVAS_AUDIO_CONFIG_BINAURAL: + error = renderMcToBinaural( mcInput, outConfig, outAudio ); + break; + case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR: + case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB: + if ( mcInput->base.inConfig == IVAS_AUDIO_CONFIG_LS_CUSTOM ) + { + error = renderMcCustomLsToBinauralRoom( mcInput, outConfig, outAudio ); + } + else + { + error = renderMcToBinauralRoom( mcInput, outConfig, outAudio ); + } + break; + default: + return IVAS_ERR_INVALID_OUTPUT_FORMAT; + } + break; + case IVAS_REND_AUDIO_CONFIG_TYPE_MASA: + renderMcToMasa( mcInput, outAudio ); + break; + default: + return IVAS_ERR_INVALID_OUTPUT_FORMAT; + } + + return error; +} + + +static ivas_error renderActiveInputsMc( + IVAS_REND_HANDLE hIvasRend, + IVAS_REND_AudioBuffer outAudio ) +{ + int16_t i; + input_mc *pCurrentInput; + ivas_error error; + + for ( i = 0, pCurrentInput = hIvasRend->inputsMc; i < RENDERER_MAX_MC_INPUTS; ++i, ++pCurrentInput ) + { + if ( pCurrentInput->base.inConfig == IVAS_AUDIO_CONFIG_INVALID ) + { + /* Skip inactive inputs */ + continue; + } + + if ( ( error = renderInputMc( pCurrentInput, hIvasRend->outputConfig, outAudio ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + return IVAS_ERR_OK; +} + + +static void renderSbaToMc( + const input_sba *sbaInput, + IVAS_REND_AudioBuffer outAudio ) +{ + int16_t i; + IVAS_REND_AudioBuffer inAudio; + + push_wmops( "renderSbaToMc" ); + inAudio = sbaInput->base.inputBuffer; + + for ( i = 0; i < inAudio.config.numChannels; ++i ) + { + renderBufferChannel( inAudio, i, sbaInput->hoaDecMtx[i], outAudio ); + } + + pop_wmops(); + return; +} + + +static void renderSbaToSba( + const input_sba *sbaInput, + IVAS_REND_AudioBuffer outAudio ) +{ + int16_t i; + IVAS_REND_AudioBuffer inAudio; + + push_wmops( "renderSbaToSba" ); + inAudio = sbaInput->base.inputBuffer; + + for ( i = 0; i < inAudio.config.numChannels; ++i ) + { + renderBufferChannel( inAudio, i, sbaInput->hoaDecMtx[i], outAudio ); + } + + pop_wmops(); + return; +} + + + +static ivas_error renderSbaToBinaural( + input_sba *sbaInput, + const AUDIO_CONFIG outConfig, + IVAS_REND_AudioBuffer outAudio ) +{ + float tmpCrendBuffer[MAX_OUTPUT_CHANNELS][L_FRAME48k]; + ivas_error error; + IVAS_REND_AudioBuffer tmpRotBuffer; + float *p_tmpCrendBuffer[MAX_OUTPUT_CHANNELS]; + int16_t i; + const COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData; + int8_t combinedOrientationEnabled; + int16_t subframe_idx; + + push_wmops( "renderSbaToBinaural" ); + { + for ( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) + { + p_tmpCrendBuffer[i] = tmpCrendBuffer[i]; + } + + hCombinedOrientationData = sbaInput->base.ctx.pCombinedOrientationData; + combinedOrientationEnabled = 0; + if ( hCombinedOrientationData != NULL ) + { + for ( subframe_idx = 0; subframe_idx < ( *hCombinedOrientationData )->num_subframes; subframe_idx++ ) + { + if ( ( *hCombinedOrientationData )->enableCombinedOrientation[subframe_idx] != 0 ) + { + combinedOrientationEnabled = 1; + break; + } + } + } + + /* apply rotation */ + if ( combinedOrientationEnabled ) + { + tmpRotBuffer = sbaInput->base.inputBuffer; + tmpRotBuffer.data = malloc( tmpRotBuffer.config.numSamplesPerChannel * tmpRotBuffer.config.numChannels * sizeof( float ) ); + + /* copy input for in-place rotation */ + mvr2r( sbaInput->base.inputBuffer.data, tmpRotBuffer.data, tmpRotBuffer.config.numChannels * tmpRotBuffer.config.numSamplesPerChannel ); + + if ( ( error = rotateFrameSba( sbaInput->base.inputBuffer, sbaInput->base.inConfig, sbaInput->base.ctx.pHeadRotData, + sbaInput->base.ctx.pCombinedOrientationData, sbaInput->rot_gains_prev, tmpRotBuffer ) ) != IVAS_ERR_OK ) + { + return error; + } + + copyBufferTo2dArray( tmpRotBuffer, tmpCrendBuffer ); + free( tmpRotBuffer.data ); + } + else + { + copyBufferTo2dArray( sbaInput->base.inputBuffer, tmpCrendBuffer ); + } + + /* call CREND */ + if ( ( error = ivas_rend_crendProcess( sbaInput->crendWrapper, sbaInput->base.inConfig, outConfig, NULL, NULL, NULL, NULL, p_tmpCrendBuffer, *sbaInput->base.ctx.pOutSampleRate, + getNumSubframesInBuffer( &outAudio, *sbaInput->base.ctx.pOutSampleRate ) ) ) != IVAS_ERR_OK ) + { + return error; + } + + accumulate2dArrayToBuffer( tmpCrendBuffer, &outAudio ); + } + + pop_wmops(); + return IVAS_ERR_OK; +} + + +static ivas_error renderSbaToBinauralRoom( + input_sba *sbaInput, + const AUDIO_CONFIG outConfig, + IVAS_REND_AudioBuffer outAudio ) +{ + int16_t i; + int16_t tmp; + float tmpCrendBuffer[MAX_OUTPUT_CHANNELS][L_FRAME48k]; + ivas_error error; + IVAS_REND_AudioBuffer tmpRotBuffer; + IVAS_REND_AudioBuffer tmpMcBuffer; + IVAS_REND_AudioBuffer *tmpBufPtr; + float *p_tmpCrendBuffer[MAX_OUTPUT_CHANNELS]; + const COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData; + int8_t combinedOrientationEnabled; + int16_t subframe_idx; + + tmpRotBuffer = outAudio; /* avoid compilation warning */ + push_wmops( "renderSbaToBinauralRoom" ); + + for ( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) + { + p_tmpCrendBuffer[i] = tmpCrendBuffer[i]; + } + + hCombinedOrientationData = sbaInput->base.ctx.pCombinedOrientationData; + combinedOrientationEnabled = 0; + if ( hCombinedOrientationData != NULL ) + { + for ( subframe_idx = 0; subframe_idx < ( *hCombinedOrientationData )->num_subframes; subframe_idx++ ) + { + if ( ( *hCombinedOrientationData )->enableCombinedOrientation[subframe_idx] != 0 ) + { + combinedOrientationEnabled = 1; + break; + } + } + } + + /* apply rotation */ + if ( combinedOrientationEnabled ) + { + tmpRotBuffer = sbaInput->base.inputBuffer; + tmpRotBuffer.data = malloc( tmpRotBuffer.config.numSamplesPerChannel * tmpRotBuffer.config.numChannels * sizeof( float ) ); + + /* copy input for in-place rotation */ + mvr2r( sbaInput->base.inputBuffer.data, tmpRotBuffer.data, tmpRotBuffer.config.numChannels * tmpRotBuffer.config.numSamplesPerChannel ); + + if ( ( error = rotateFrameSba( sbaInput->base.inputBuffer, sbaInput->base.inConfig, sbaInput->base.ctx.pHeadRotData, + sbaInput->base.ctx.pCombinedOrientationData, + sbaInput->rot_gains_prev, + tmpRotBuffer ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* intermediate rendering to 7_1_4 */ + tmpMcBuffer = sbaInput->base.inputBuffer; + + if ( ( error = getAudioConfigNumChannels( IVAS_AUDIO_CONFIG_7_1_4, &tmp ) ) != IVAS_ERR_OK ) + { + return error; + } + + tmpMcBuffer.config.numChannels = tmp; + tmpMcBuffer.data = malloc( tmpMcBuffer.config.numSamplesPerChannel * tmpMcBuffer.config.numChannels * sizeof( float ) ); + set_zero( tmpMcBuffer.data, tmpMcBuffer.config.numChannels * tmpMcBuffer.config.numSamplesPerChannel ); + + tmpBufPtr = ( combinedOrientationEnabled ) ? &tmpRotBuffer : &sbaInput->base.inputBuffer; + for ( i = 0; i < sbaInput->base.inputBuffer.config.numChannels; i++ ) + { + renderBufferChannel( *tmpBufPtr, i, sbaInput->hoaDecMtx[i], tmpMcBuffer ); + } + + copyBufferTo2dArray( tmpMcBuffer, tmpCrendBuffer ); + + /* call CREND */ + if ( ( error = ivas_rend_crendProcess( sbaInput->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, + NULL, NULL, NULL, NULL, p_tmpCrendBuffer, *sbaInput->base.ctx.pOutSampleRate, + getNumSubframesInBuffer( &outAudio, *sbaInput->base.ctx.pOutSampleRate ) ) ) != IVAS_ERR_OK ) + { + return error; + } + + accumulate2dArrayToBuffer( tmpCrendBuffer, &outAudio ); + + if ( combinedOrientationEnabled ) + { + free( tmpRotBuffer.data ); + } + free( tmpMcBuffer.data ); + + pop_wmops(); + return IVAS_ERR_OK; +} + + + + +static void renderSbaToMasa( + input_sba *sbaInput, + IVAS_REND_AudioBuffer outAudio ) +{ + float tmpRendBuffer[MAX_OUTPUT_CHANNELS][L_FRAME48k]; + + push_wmops( "renderMcToMasa" ); + copyBufferTo2dArray( sbaInput->base.inputBuffer, tmpRendBuffer ); + ivas_dirac_ana( sbaInput->hDirAC, tmpRendBuffer, sbaInput->base.inputBuffer.config.numSamplesPerChannel, outAudio.config.numChannels ); + accumulate2dArrayToBuffer( tmpRendBuffer, &outAudio ); + + pop_wmops(); + return; +} + + +static ivas_error renderInputSba( + input_sba *sbaInput, + const AUDIO_CONFIG outConfig, + IVAS_REND_AudioBuffer outAudio ) +{ + ivas_error error; + IVAS_REND_AudioBuffer inAudio; + + error = IVAS_ERR_OK; + inAudio = sbaInput->base.inputBuffer; + + if ( sbaInput->base.numNewSamplesPerChannel != outAudio.config.numSamplesPerChannel ) + { + return IVAS_ERROR( IVAS_ERR_INVALID_BUFFER_SIZE, "Mismatch between the number of input samples vs number of requested output samples - currently not allowed" ); + } + sbaInput->base.numNewSamplesPerChannel = 0; + + /* Apply input gain to new audio */ + v_multc( inAudio.data, sbaInput->base.gain, inAudio.data, inAudio.config.numSamplesPerChannel * inAudio.config.numChannels ); + + switch ( getAudioConfigType( outConfig ) ) + { + case IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED: + renderSbaToMc( sbaInput, outAudio ); + break; + case IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS: + renderSbaToSba( sbaInput, outAudio ); + break; + case IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL: + switch ( outConfig ) + { + case IVAS_AUDIO_CONFIG_BINAURAL: + error = renderSbaToBinaural( sbaInput, outConfig, outAudio ); + break; + case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR: + case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB: + error = renderSbaToBinauralRoom( sbaInput, outConfig, outAudio ); + break; + default: + return IVAS_ERR_INVALID_OUTPUT_FORMAT; + } + break; + case IVAS_REND_AUDIO_CONFIG_TYPE_MASA: + renderSbaToMasa( sbaInput, outAudio ); + break; + default: + return IVAS_ERR_INVALID_OUTPUT_FORMAT; + } + + return error; +} + + + + +static ivas_error renderActiveInputsSba( + IVAS_REND_HANDLE hIvasRend, + IVAS_REND_AudioBuffer outAudio ) +{ + int16_t i; + input_sba *pCurrentInput; + ivas_error error; + + for ( i = 0, pCurrentInput = hIvasRend->inputsSba; i < RENDERER_MAX_SBA_INPUTS; ++i, ++pCurrentInput ) + { + if ( pCurrentInput->base.inConfig == IVAS_AUDIO_CONFIG_INVALID ) + { + /* Skip inactive inputs */ + continue; + } + + if ( ( error = renderInputSba( pCurrentInput, hIvasRend->outputConfig, outAudio ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + return IVAS_ERR_OK; +} + + +static void copyMasaMetadataToDiracRenderer( + MASA_METADATA_FRAME *meta, + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom ) +{ + int16_t band, sf, bin; + int16_t meta_write_index; + + hSpatParamRendCom->numParametricDirections = meta->descriptive_meta.numberOfDirections + 1; + hSpatParamRendCom->numSimultaneousDirections = meta->descriptive_meta.numberOfDirections + 1; + + for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) + { + meta_write_index = ( hSpatParamRendCom->dirac_bs_md_write_idx + sf ) % hSpatParamRendCom->dirac_md_buffer_length; + + for ( band = 0; band < MASA_MAXIMUM_CODING_SUBBANDS; band++ ) + { + for ( bin = MASA_band_grouping_24[band]; bin < MASA_band_grouping_24[band + 1]; bin++ ) + { + hSpatParamRendCom->azimuth[meta_write_index][bin] = (int16_t) meta->directional_meta[0].azimuth[sf][band]; + hSpatParamRendCom->elevation[meta_write_index][bin] = (int16_t) meta->directional_meta[0].elevation[sf][band]; + hSpatParamRendCom->energy_ratio1[meta_write_index][bin] = meta->directional_meta[0].energy_ratio[sf][band]; + hSpatParamRendCom->diffuseness_vector[meta_write_index][bin] = 1.0f - meta->directional_meta[0].energy_ratio[sf][band]; + hSpatParamRendCom->spreadCoherence[meta_write_index][bin] = meta->directional_meta[0].spread_coherence[sf][band]; + hSpatParamRendCom->surroundingCoherence[meta_write_index][bin] = meta->common_meta.surround_coherence[sf][band]; + + if ( hSpatParamRendCom->numSimultaneousDirections == 2 ) + { + hSpatParamRendCom->azimuth2[meta_write_index][bin] = (int16_t) meta->directional_meta[1].azimuth[sf][band]; + hSpatParamRendCom->elevation2[meta_write_index][bin] = (int16_t) meta->directional_meta[1].elevation[sf][band]; + hSpatParamRendCom->energy_ratio2[meta_write_index][bin] = meta->directional_meta[1].energy_ratio[sf][band]; + hSpatParamRendCom->diffuseness_vector[meta_write_index][bin] -= meta->directional_meta[1].energy_ratio[sf][band]; + hSpatParamRendCom->spreadCoherence2[meta_write_index][bin] = meta->directional_meta[1].spread_coherence[sf][band]; + } + } + } + } + + hSpatParamRendCom->dirac_bs_md_write_idx = ( hSpatParamRendCom->dirac_bs_md_write_idx + MAX_PARAM_SPATIAL_SUBFRAMES ) % hSpatParamRendCom->dirac_md_buffer_length; + + return; +} + + +static void renderMasaToMc( + input_masa *masaInput, + IVAS_REND_AudioBuffer outAudio ) +{ + int16_t ch; + float *tmpBuffer[MAX_OUTPUT_CHANNELS], tmpBuffer_buff[MAX_OUTPUT_CHANNELS][L_FRAME48k]; + + for ( ch = 0; ch < MAX_OUTPUT_CHANNELS; ch++ ) + { + tmpBuffer[ch] = tmpBuffer_buff[ch]; + } + + copyBufferTo2dArray( masaInput->base.inputBuffer, tmpBuffer_buff ); + copyMasaMetadataToDiracRenderer( &masaInput->masaMetadata, masaInput->decDummy->hSpatParamRendCom ); + + if ( masaInput->decDummy->renderer_type == RENDERER_STEREO_PARAMETRIC ) + { + ivas_dirac_dec_binaural( masaInput->decDummy, *masaInput->base.ctx.pCombinedOrientationData, tmpBuffer, masaInput->base.inputBuffer.config.numChannels, getNumSubframesInBuffer( &outAudio, *masaInput->base.ctx.pOutSampleRate ) ); + } + else + { + ivas_dirac_dec( masaInput->decDummy, tmpBuffer, masaInput->base.inputBuffer.config.numChannels, getNumSubframesInBuffer( &outAudio, *masaInput->base.ctx.pOutSampleRate ) ); + } + + accumulate2dArrayToBuffer( tmpBuffer_buff, &outAudio ); + + return; +} + + +static void renderMasaToSba( + input_masa *masaInput, + IVAS_REND_AudioBuffer outAudio ) +{ + int16_t ch; + float *tmpBuffer[MAX_OUTPUT_CHANNELS], tmpBuffer_buff[MAX_OUTPUT_CHANNELS][L_FRAME48k]; + + for ( ch = 0; ch < MAX_OUTPUT_CHANNELS; ch++ ) + { + tmpBuffer[ch] = tmpBuffer_buff[ch]; + } + + copyBufferTo2dArray( masaInput->base.inputBuffer, tmpBuffer_buff ); + copyMasaMetadataToDiracRenderer( &masaInput->masaMetadata, masaInput->decDummy->hSpatParamRendCom ); + + ivas_dirac_dec( masaInput->decDummy, tmpBuffer, masaInput->base.inputBuffer.config.numChannels, getNumSubframesInBuffer( &outAudio, *masaInput->base.ctx.pOutSampleRate ) ); + + accumulate2dArrayToBuffer( tmpBuffer_buff, &outAudio ); + + return; +} + + +static void renderMasaToBinaural( + input_masa *masaInput, + IVAS_REND_AudioBuffer outAudio +) +{ + int16_t ch; + float *tmpBuffer[MAX_OUTPUT_CHANNELS], tmpBuffer_buff[MAX_OUTPUT_CHANNELS][L_FRAME48k]; + + for ( ch = 0; ch < MAX_OUTPUT_CHANNELS; ch++ ) + { + tmpBuffer[ch] = tmpBuffer_buff[ch]; + } + + copyBufferTo2dArray( masaInput->base.inputBuffer, tmpBuffer_buff ); + copyMasaMetadataToDiracRenderer( &masaInput->masaMetadata, masaInput->decDummy->hSpatParamRendCom ); + + + ivas_dirac_dec_binaural( masaInput->decDummy, *masaInput->base.ctx.pCombinedOrientationData, tmpBuffer, masaInput->base.inputBuffer.config.numChannels, getNumSubframesInBuffer( &outAudio, *masaInput->base.ctx.pOutSampleRate ) ); + + accumulate2dArrayToBuffer( tmpBuffer_buff, &outAudio ); + + return; +} + + +static void renderMasaToMasa( + input_masa *masaInput, + IVAS_REND_AudioBuffer outAudio ) +{ + int16_t sf, band, dir, numDirs; + float ratioSum; + MASA_DECODER_EXT_OUT_META_HANDLE outMeta; + MASA_METADATA_FRAME *inMeta; + float tmpBuffer[MAX_OUTPUT_CHANNELS][L_FRAME48k]; + int16_t ts, i, j, l_ts; + float Chan_RealBuffer[MASA_MAX_TRANSPORT_CHANNELS][CLDFB_NO_CHANNELS_MAX]; + float Chan_ImagBuffer[MASA_MAX_TRANSPORT_CHANNELS][CLDFB_NO_CHANNELS_MAX]; + int16_t band_m_idx, block_m_idx; + int16_t mrange[2]; + int16_t brange[2]; + int16_t numAnalysisChannels; + + copyBufferTo2dArray( masaInput->base.inputBuffer, tmpBuffer ); + + /* Calculate energy */ + l_ts = masaInput->base.inputBuffer.config.numSamplesPerChannel / CLDFB_NO_COL_MAX; + numAnalysisChannels = masaInput->hMasaPrerend->num_Cldfb_instances; + + /* do processing over all CLDFB time slots */ + for ( block_m_idx = 0; block_m_idx < MAX_PARAM_SPATIAL_SUBFRAMES; block_m_idx++ ) + { + mrange[0] = DirAC_block_grouping[block_m_idx]; + mrange[1] = DirAC_block_grouping[block_m_idx + 1]; + + set_zero( masaInput->hMasaPrerend->energy[block_m_idx], MASA_FREQUENCY_BANDS ); + + for ( ts = mrange[0]; ts < mrange[1]; ts++ ) + { + for ( i = 0; i < numAnalysisChannels; i++ ) + { + cldfbAnalysis_ts( &( tmpBuffer[i][l_ts * ts] ), Chan_RealBuffer[i], Chan_ImagBuffer[i], l_ts, masaInput->hMasaPrerend->cldfbAnaEnc[i] ); + } + + /* Compute channel energy for metadata processing */ + for ( band_m_idx = 0; band_m_idx < MASA_FREQUENCY_BANDS; band_m_idx++ ) + { + brange[0] = MASA_band_grouping_24[band_m_idx]; + brange[1] = MASA_band_grouping_24[band_m_idx + 1]; + for ( j = brange[0]; j < brange[1]; j++ ) + { + for ( i = 0; i < numAnalysisChannels; i++ ) + { + masaInput->hMasaPrerend->energy[block_m_idx][band_m_idx] += Chan_RealBuffer[0][j] * Chan_RealBuffer[0][j] + Chan_ImagBuffer[0][j] * Chan_ImagBuffer[0][j]; + } + } + } + } + } + + /* Copy audio channels if mismatch in number of transports */ + if ( masaInput->base.inputBuffer.config.numChannels == 1 && outAudio.config.numChannels == 2 ) + { + mvr2r( tmpBuffer[0], tmpBuffer[1], masaInput->base.inputBuffer.config.numSamplesPerChannel ); + } + else if ( masaInput->base.inputBuffer.config.numChannels == 2 && outAudio.config.numChannels == 1 ) + { + v_add( tmpBuffer[0], tmpBuffer[1], tmpBuffer[0], masaInput->base.inputBuffer.config.numSamplesPerChannel ); + } + + /* Copy metadata */ + outMeta = masaInput->hMasaPrerend->hMasaOut; + inMeta = &masaInput->masaMetadata; + numDirs = inMeta->descriptive_meta.numberOfDirections + 1; + + for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) + { + for ( band = 0; band < MASA_FREQUENCY_BANDS; band++ ) + { + /* Remainder is always set to zero and energy removal is compensated in following steps + * to other ratios. */ + inMeta->common_meta.remainder_to_total_ratio[sf][band] = 0.0f; + + ratioSum = 0; + for ( dir = 0; dir < numDirs; dir++ ) + { + ratioSum += inMeta->directional_meta[dir].energy_ratio[sf][band]; + } + ratioSum += inMeta->common_meta.diffuse_to_total_ratio[sf][band]; + + if ( ratioSum == 0.0f ) + { + for ( dir = 0; dir < numDirs; dir++ ) + { + inMeta->directional_meta[dir].energy_ratio[sf][band] = 0.0f; + } + inMeta->common_meta.diffuse_to_total_ratio[sf][band] = 1.0f; + } + else if ( ratioSum != 1.0f ) + { + for ( dir = 0; dir < numDirs; dir++ ) + { + inMeta->directional_meta[dir].energy_ratio[sf][band] /= ratioSum; + } + inMeta->common_meta.diffuse_to_total_ratio[sf][band] /= ratioSum; + } + } + } + + for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) + { + for ( band = 0; band < MASA_FREQUENCY_BANDS; band++ ) + { + outMeta->diffuseToTotalRatio[sf][band] = UINT8_MAX; + for ( dir = 0; dir < numDirs; dir++ ) + { + outMeta->directionIndex[dir][sf][band] = index_theta_phi_16( &inMeta->directional_meta[dir].elevation[sf][band], &inMeta->directional_meta[dir].azimuth[sf][band], masaInput->hMasaPrerend->sph_grid16 ); + outMeta->directToTotalRatio[dir][sf][band] = (uint8_t) floorf( inMeta->directional_meta[dir].energy_ratio[sf][band] * UINT8_MAX ); + outMeta->diffuseToTotalRatio[sf][band] -= outMeta->directToTotalRatio[dir][sf][band]; + outMeta->spreadCoherence[dir][sf][band] = (uint8_t) floorf( inMeta->directional_meta[dir].spread_coherence[sf][band] * UINT8_MAX ); + } + outMeta->surroundCoherence[sf][band] = (uint8_t) floorf( inMeta->common_meta.surround_coherence[sf][band] * UINT8_MAX ); + } + } + + copy_masa_descriptive_meta( &( outMeta->descriptiveMeta ), &( inMeta->descriptive_meta ) ); + + accumulate2dArrayToBuffer( tmpBuffer, &outAudio ); + + return; +} + + +static ivas_error renderInputMasa( + input_masa *masaInput, + const AUDIO_CONFIG outConfig, + IVAS_REND_AudioBuffer outAudio ) +{ + IVAS_REND_AudioBuffer inAudio; + + if ( !masaInput->metadataHasBeenFed ) + { + return IVAS_ERR_MISSING_METADATA; + } + + inAudio = masaInput->base.inputBuffer; + if ( masaInput->base.numNewSamplesPerChannel != outAudio.config.numSamplesPerChannel ) + { + return IVAS_ERROR( IVAS_ERR_INVALID_BUFFER_SIZE, "Mismatch between the number of input samples vs number of requested output samples - currently not allowed" ); + } + masaInput->base.numNewSamplesPerChannel = 0; + + /* Apply input gain to new audio */ + v_multc( inAudio.data, masaInput->base.gain, inAudio.data, inAudio.config.numSamplesPerChannel * inAudio.config.numChannels ); + + switch ( getAudioConfigType( outConfig ) ) + { + case IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED: + renderMasaToMc( masaInput, outAudio ); + break; + case IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS: + renderMasaToSba( masaInput, outAudio ); + break; + case IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL: + switch ( outConfig ) + { + case IVAS_AUDIO_CONFIG_BINAURAL: + + renderMasaToBinaural( masaInput, outAudio ); + break; + /* ToDo */ + // #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + // case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR: + // case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB: + // #else + // case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM: + // #endif + // renderMasaToBinauralRoom( masaInput, outConfig, outAudio ); + // break; + default: + return IVAS_ERR_INVALID_OUTPUT_FORMAT; + } + break; + case IVAS_REND_AUDIO_CONFIG_TYPE_MASA: + renderMasaToMasa( masaInput, outAudio ); + break; + default: + return IVAS_ERR_INVALID_OUTPUT_FORMAT; + } + + return IVAS_ERR_OK; +} + + +static ivas_error renderActiveInputsMasa( + IVAS_REND_HANDLE hIvasRend, + IVAS_REND_AudioBuffer outAudio ) +{ + int16_t i; + input_masa *pCurrentInput; + ivas_error error; + int16_t sf_idx; + + for ( i = 0, pCurrentInput = hIvasRend->inputsMasa; i < RENDERER_MAX_MASA_INPUTS; ++i, ++pCurrentInput ) + { + if ( pCurrentInput->base.inConfig == IVAS_AUDIO_CONFIG_INVALID ) + { + /* Skip inactive inputs */ + continue; + } + + if ( getAudioConfigType( hIvasRend->outputConfig ) == IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL && pCurrentInput->decDummy->hHeadTrackData != NULL ) + { + for ( sf_idx = 0; sf_idx < hIvasRend->num_subframes; ++sf_idx ) + { + pCurrentInput->decDummy->hHeadTrackData->Quaternions[sf_idx] = hIvasRend->headRotData.headPositions[sf_idx]; + pCurrentInput->decDummy->hHeadTrackData->Pos[sf_idx] = hIvasRend->headRotData.Pos[sf_idx]; + } + } + + if ( ( error = renderInputMasa( pCurrentInput, hIvasRend->outputConfig, outAudio ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * IVAS_REND_GetMasaMetadata( ) + * + * Get metadata of the estimated MASA frame + *---------------------------------------------------------------------*/ + +ivas_error IVAS_REND_GetMasaMetadata( + IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS renderer handle */ + MASA_DECODER_EXT_OUT_META_HANDLE *hMasaExtOutMeta, /* o : pointer to handle, which will be set to point to analyzed MASA metadata */ + const IVAS_REND_AudioConfigType inputType /* i : Input type */ +) +{ + if ( hIvasRend == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + /* Get the metadata handle */ + if ( inputType == IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED ) + { + *hMasaExtOutMeta = hIvasRend->inputsIsm->hOMasa->hMasaOut; + } + else if ( inputType == IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) + { + *hMasaExtOutMeta = hIvasRend->inputsMc->hMcMasa->hMasaOut; + } + else if ( inputType == IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS ) + { + *hMasaExtOutMeta = hIvasRend->inputsSba->hDirAC->hMasaOut; + } + else + { + return IVAS_ERR_NOT_SUPPORTED_OPTION; + } + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * IVAS_REND_MergeMasaMetadata( ) + * + * Merge MASA metadata from two formats + *---------------------------------------------------------------------*/ + +ivas_error IVAS_REND_MergeMasaMetadata( + IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS renderer handle */ + MASA_DECODER_EXT_OUT_META_HANDLE *hMasaExtOutMeta, /* o : pointer to handle, which will be set to point to merged metadata */ + const IVAS_REND_AudioConfigType inputType1, /* i : Input type 1 */ + const IVAS_REND_AudioConfigType inputType2 /* i : Input type 2 */ +) +{ + MASA_DECODER_EXT_OUT_META_HANDLE inMeta2; + float( *inEne1 )[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + float( *inEne2 )[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + + if ( hIvasRend == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + /* Input1 metadata and energy */ + if ( inputType1 == IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED ) + { + *hMasaExtOutMeta = hIvasRend->inputsIsm->hOMasa->hMasaOut; + inEne1 = &( hIvasRend->inputsIsm->hOMasa->energy ); + } + else if ( inputType1 == IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) + { + *hMasaExtOutMeta = hIvasRend->inputsMc->hMcMasa->hMasaOut; + inEne1 = &( hIvasRend->inputsMc->hMcMasa->energy ); + } + else if ( inputType1 == IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS ) + { + *hMasaExtOutMeta = hIvasRend->inputsSba->hDirAC->hMasaOut; + inEne1 = &( hIvasRend->inputsSba->hDirAC->energy ); + } + else if ( inputType1 == IVAS_REND_AUDIO_CONFIG_TYPE_MASA ) + { + *hMasaExtOutMeta = hIvasRend->inputsMasa->hMasaPrerend->hMasaOut; + inEne1 = &( hIvasRend->inputsMasa->hMasaPrerend->energy ); + } + else + { + return IVAS_ERR_NOT_SUPPORTED_OPTION; + } + + /* Input2 metadata and energy */ + if ( inputType2 == IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED ) + { + inMeta2 = hIvasRend->inputsIsm->hOMasa->hMasaOut; + inEne2 = &( hIvasRend->inputsIsm->hOMasa->energy ); + } + else if ( inputType2 == IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) + { + inMeta2 = hIvasRend->inputsMc->hMcMasa->hMasaOut; + inEne2 = &( hIvasRend->inputsMc->hMcMasa->energy ); + } + else if ( inputType2 == IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS ) + { + inMeta2 = hIvasRend->inputsSba->hDirAC->hMasaOut; + inEne2 = &( hIvasRend->inputsSba->hDirAC->energy ); + } + else if ( inputType2 == IVAS_REND_AUDIO_CONFIG_TYPE_MASA ) + { + inMeta2 = hIvasRend->inputsMasa->hMasaPrerend->hMasaOut; + inEne2 = &( hIvasRend->inputsMasa->hMasaPrerend->energy ); + } + else + { + return IVAS_ERR_NOT_SUPPORTED_OPTION; + } + + /* Merge metadata */ + ivas_prerend_merge_masa_metadata( *hMasaExtOutMeta, *hMasaExtOutMeta, inputType1, *inEne1, inMeta2, inputType2, *inEne2 ); + ( *hMasaExtOutMeta )->descriptiveMeta.numberOfChannels = hIvasRend->outputConfig == IVAS_AUDIO_CONFIG_MASA1 ? 0u : 1u; + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * IVAS_REND_SetTotalNumberOfObjects( ) + * + * Set the total number of objects to the first object data + *---------------------------------------------------------------------*/ + +ivas_error IVAS_REND_SetTotalNumberOfObjects( + IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS renderer handle */ + const uint16_t total_num_objects /* i : total number of objects */ +) +{ + if ( hIvasRend == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + hIvasRend->inputsIsm[0].total_num_objects = total_num_objects; + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * IVAS_REND_SetIsmMetadataDelay( ) + * + * Set the Metadata Delay in ms in order to sync with audio delay + *---------------------------------------------------------------------*/ + +ivas_error IVAS_REND_SetIsmMetadataDelay( + IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS renderer handle */ + const float sync_md_delay /* i : ISM Metadata Delay in ms to sync with audio delay */ +) +{ + int16_t i; + + if ( hIvasRend == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + for ( i = 0; i < RENDERER_MAX_ISM_INPUTS; ++i ) + { + hIvasRend->inputsIsm[i].ism_metadata_delay_ms = sync_md_delay; + } + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * getSamplesInternal() + * + * + *-------------------------------------------------------------------*/ + +static ivas_error getSamplesInternal( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + IVAS_REND_AudioBuffer outAudio /* i/o: buffer for output audio */ +) +{ + ivas_error error; + int16_t numOutChannels; + + /* Validate function arguments */ + if ( hIvasRend == NULL || outAudio.data == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + if ( outAudio.config.numSamplesPerChannel <= 0 || MAX_BUFFER_LENGTH_PER_CHANNEL < outAudio.config.numSamplesPerChannel ) + { + return IVAS_ERR_INVALID_BUFFER_SIZE; + } + + if ( outAudio.config.numChannels <= 0 || MAX_OUTPUT_CHANNELS < outAudio.config.numChannels ) + { + return IVAS_ERR_WRONG_NUM_CHANNELS; + } + + if ( getAudioConfigType( hIvasRend->outputConfig ) == IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL && + outAudio.config.numSamplesPerChannel * 1000 != ( hIvasRend->num_subframes * BINAURAL_RENDERING_FRAME_SIZE_MS ) * hIvasRend->sampleRateOut ) + { + return IVAS_ERROR( IVAS_ERR_INVALID_BUFFER_SIZE, "Binaural rendering requires specific frame size" ); + } + + /* Check that there is allowed configuration for MASA format output */ + if ( getAudioConfigType( hIvasRend->outputConfig ) == IVAS_REND_AUDIO_CONFIG_TYPE_MASA ) + { + int16_t i; + int16_t numMasaInputs = 0; + int16_t numOtherInputs = 0; + + for ( i = 0; i < RENDERER_MAX_MASA_INPUTS; i++ ) + { + numMasaInputs += hIvasRend->inputsMasa[i].base.inConfig == IVAS_AUDIO_CONFIG_INVALID ? 0 : 1; + } + + for ( i = 0; i < RENDERER_MAX_MC_INPUTS; i++ ) + { + numOtherInputs += hIvasRend->inputsMc[i].base.inConfig == IVAS_AUDIO_CONFIG_INVALID ? 0 : 1; + } + + for ( i = 0; i < RENDERER_MAX_SBA_INPUTS; i++ ) + { + numOtherInputs += hIvasRend->inputsSba[i].base.inConfig == IVAS_AUDIO_CONFIG_INVALID ? 0 : 1; + } + + /* For ISM, we check only first as all ISMs are handled together via OMASA when merging to MASA. */ + numOtherInputs += hIvasRend->inputsIsm[0].base.inConfig == IVAS_AUDIO_CONFIG_INVALID ? 0 : 1; + + if ( numMasaInputs == 0 || numOtherInputs == 0 ) + { + return IVAS_ERR_IO_CONFIG_PAIR_NOT_SUPPORTED; + } + } + + if ( ( error = IVAS_REND_NumOutChannels( hIvasRend, &numOutChannels ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( numOutChannels != outAudio.config.numChannels ) + { + return IVAS_ERR_WRONG_NUM_CHANNELS; + } + + /* Clear original output buffer */ + set_zero( outAudio.data, outAudio.config.numChannels * outAudio.config.numSamplesPerChannel ); + + + if ( ( error = renderActiveInputsIsm( hIvasRend, outAudio ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = renderActiveInputsMc( hIvasRend, outAudio ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = renderActiveInputsSba( hIvasRend, outAudio ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = renderActiveInputsMasa( hIvasRend, outAudio ) ) != IVAS_ERR_OK ) + { + return error; + } + + +#ifndef DISABLE_LIMITER + limitRendererOutput( hIvasRend->hLimiter, outAudio.data, outAudio.config.numSamplesPerChannel, IVAS_LIMITER_THRESHOLD ); +#endif + + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * IVAS_REND_GetSamples() + * + * + *-------------------------------------------------------------------*/ + +ivas_error IVAS_REND_GetSamples( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + IVAS_REND_AudioBuffer outAudio /* i/o: buffer for output audio */ +) +{ + + return getSamplesInternal( hIvasRend, outAudio ); +} + + + + +/*-------------------------------------------------------------------* + * IVAS_REND_Close() + * + * + *-------------------------------------------------------------------*/ + +void IVAS_REND_Close( + IVAS_REND_HANDLE *phIvasRend /* i/o: Pointer to renderer handle */ +) +{ + uint16_t i; + IVAS_REND_HANDLE hIvasRend; + + /* Validate function arguments */ + if ( phIvasRend == NULL || *phIvasRend == NULL ) + { + return; + } + hIvasRend = *phIvasRend; + + if ( hIvasRend->efapOutWrapper.hEfap != NULL ) + { + efap_free_data( &hIvasRend->efapOutWrapper.hEfap ); + } + + /* clear inputs */ + for ( i = 0; i < RENDERER_MAX_ISM_INPUTS; ++i ) + { + clearInputIsm( &hIvasRend->inputsIsm[i] ); + } + for ( i = 0; i < RENDERER_MAX_MC_INPUTS; ++i ) + { + clearInputMc( &hIvasRend->inputsMc[i] ); + } + for ( i = 0; i < RENDERER_MAX_SBA_INPUTS; ++i ) + { + clearInputSba( &hIvasRend->inputsSba[i] ); + } + for ( i = 0; i < RENDERER_MAX_MASA_INPUTS; ++i ) + { + clearInputMasa( &hIvasRend->inputsMasa[i] ); + } + + /* clear Config. Renderer */ + ivas_render_config_close( &( hIvasRend->hRendererConfig ) ); + + ivas_limiter_close( &hIvasRend->hLimiter ); + + + closeHeadRotation( hIvasRend ); + + ivas_external_orientation_close( &hIvasRend->hExternalOrientationData ); + ivas_combined_orientation_close( &hIvasRend->hCombinedOrientationData ); + + free( hIvasRend ); + *phIvasRend = NULL; + + return; +} + + + + diff --git a/lib_rend/lib_rend.h b/lib_rend/lib_rend.h new file mode 100644 index 0000000000000000000000000000000000000000..b76493b7246d19379aca7f392214c955be8f8712 --- /dev/null +++ b/lib_rend/lib_rend.h @@ -0,0 +1,321 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#ifndef LIB_REND_H +#define LIB_REND_H + +#include "common_api_types.h" +#include + +/*---------------------------------------------------------------------* + * Renderer constants + *---------------------------------------------------------------------*/ + +#define RENDERER_MAX_ISM_INPUTS 4 +#define RENDERER_MAX_MC_INPUTS 1 +#define RENDERER_MAX_SBA_INPUTS 1 +#define RENDERER_MAX_MASA_INPUTS 1 + + +/*---------------------------------------------------------------------* + * Renderer structures + *---------------------------------------------------------------------*/ + +typedef float IVAS_REND_LfePanMtx[IVAS_MAX_INPUT_LFE_CHANNELS][IVAS_MAX_OUTPUT_CHANNELS]; + +typedef struct +{ + int16_t numSamplesPerChannel; + int16_t numChannels; +} IVAS_REND_AudioBufferConfig; + +typedef struct +{ + IVAS_REND_AudioBufferConfig config; + float *data; +} IVAS_REND_AudioBuffer; + + +typedef struct +{ + IVAS_REND_AudioBufferConfig config; + const float *data; +} IVAS_REND_ReadOnlyAudioBuffer; + +typedef struct IVAS_REND *IVAS_REND_HANDLE; +typedef struct IVAS_REND const *IVAS_REND_CONST_HANDLE; + +typedef enum +{ + IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED = 0, + IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS, + IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED, + IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL, + IVAS_REND_AUDIO_CONFIG_TYPE_MASA, + IVAS_REND_AUDIO_CONFIG_TYPE_UNKNOWN, +} IVAS_REND_AudioConfigType; + +typedef uint16_t IVAS_REND_InputId; + +typedef enum _IVAS_REND_COMPLEXITY_LEVEL +{ + IVAS_REND_COMPLEXITY_LEVEL_ONE = 1, + IVAS_REND_COMPLEXITY_LEVEL_TWO = 2, + IVAS_REND_COMPLEXITY_LEVEL_THREE = 3 +} IVAS_REND_COMPLEXITY_LEVEL; + + +/* clang-format off */ +/*----------------------------------------------------------------------------------* + * Renderer function prototypes + *----------------------------------------------------------------------------------*/ + +/* Functions to be called before rendering */ + +ivas_error IVAS_REND_Open( + IVAS_REND_HANDLE *phIvasRend, /* i/o: Pointer to renderer handle */ + const int32_t outputSampleRate, /* i : output sampling rate */ + const IVAS_AUDIO_CONFIG outConfig, /* i : output audio config */ + const int16_t nonDiegeticPan, /* i : non-diegetic object flag */ + const float nonDiegeticPanGain, /* i : non-diegetic panning gain */ + const int16_t num_subframes /* i : number of subframes */ +); + +/* Note: this will reset custom LFE routings set for any MC input */ +ivas_error IVAS_REND_ConfigureCustomOutputLoudspeakerLayout( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const IVAS_CUSTOM_LS_DATA layout /* i : custom loudspeaker layout for renderer output */ +); + + +/* Functions to be called before/during rendering */ + +ivas_error IVAS_REND_NumOutChannels( + IVAS_REND_CONST_HANDLE hIvasRend, /* i : Renderer handle */ + int16_t *numOutChannels /* o : number of output channels */ +); + +ivas_error IVAS_REND_AddInput( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const IVAS_AUDIO_CONFIG inConfig, /* i : audio config for a new input */ + IVAS_REND_InputId *inputId /* o : ID of the new input */ +); + +/* Note: this will reset any custom LFE routing set for the input */ +ivas_error IVAS_REND_ConfigureCustomInputLoudspeakerLayout( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const IVAS_REND_InputId inputId, /* i : ID of the input */ + const IVAS_CUSTOM_LS_DATA layout /* i : custom loudspeaker layout for input */ +); + +ivas_error IVAS_REND_SetInputGain( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const IVAS_REND_InputId inputId, /* i : ID of the input */ + const float gain /* i : linear gain (not in dB) */ +); + +ivas_error IVAS_REND_SetInputLfeMtx( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const IVAS_REND_InputId inputId, /* i : ID of the input */ + const IVAS_REND_LfePanMtx *lfePanMtx /* i : LFE panning matrix */ +); + +ivas_error IVAS_REND_SetInputLfePos( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const IVAS_REND_InputId inputId, /* i : ID of the input */ + const float inputGain, /* i : Input gain to be applied to the LFE channel(s) */ + const float outputAzimuth, /* i : Output azimuth position */ + const float outputElevation /* i : Output elevation position */ +); + +ivas_error IVAS_REND_RemoveInput( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const IVAS_REND_InputId inputId /* i : ID of the input */ +); + +ivas_error IVAS_REND_GetInputNumChannels( + IVAS_REND_CONST_HANDLE hIvasRend, /* i : Renderer handle */ + const IVAS_REND_InputId inputId, /* i : ID of the input */ + int16_t *numChannels /* o : number of channels of the input */ +); + +ivas_error IVAS_REND_GetDelay( + IVAS_REND_CONST_HANDLE hIvasRend, /* i : Renderer handle */ + int16_t *nSamples, /* o : Renderer delay in samples */ + int32_t *timeScale /* o : Time scale of the delay, equal to renderer output sampling rate */ +); + +/* Functions to be called during rendering */ + +ivas_error IVAS_REND_FeedInputAudio( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const IVAS_REND_InputId inputId, /* i : ID of the input */ + const IVAS_REND_ReadOnlyAudioBuffer inputAudio /* i : buffer with input audio */ +); + +ivas_error IVAS_REND_FeedInputObjectMetadata( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const IVAS_REND_InputId inputId, /* i : ID of the input */ + const IVAS_ISM_METADATA objectPosition /* i : object position struct */ +); + +ivas_error IVAS_REND_FeedInputObjectMetadataToOMasa( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const int16_t inputIndex, /* i : Index of the input */ + const IVAS_ISM_METADATA objectPosition /* i : object position struct */ +); + +ivas_error IVAS_REND_FeedInputMasaMetadata( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const IVAS_REND_InputId inputId, /* i : ID of the input */ + IVAS_MASA_METADATA_HANDLE masaMetadata /* i : MASA metadata frame */ +); + +ivas_error IVAS_REND_InitConfig( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const IVAS_AUDIO_CONFIG outAudioConfig /* i : output audioConfig */ +); + +int16_t IVAS_REND_GetRenderConfig( + IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS decoder handle */ + const IVAS_RENDER_CONFIG_HANDLE hRCout /* o : Render configuration handle */ +); + +int16_t IVAS_REND_FeedRenderConfig( + IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS decoder handle */ + const IVAS_RENDER_CONFIG_DATA renderConfig /* i : Render configuration struct */ +); + + +ivas_error IVAS_REND_SetHeadRotation( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const IVAS_QUATERNION headRot, /* i : head orientations for next rendering call */ + const IVAS_VECTOR3 Pos, /* i : listener positions for next rendering call */ + const int16_t sf_idx /* i : subframe index */ +); + +/* Head rotation becomes enabled by calling IVAS_REND_SetHeadRotation. Use this to disable. */ +ivas_error IVAS_REND_DisableHeadRotation( + IVAS_REND_HANDLE hIvasRend /* i/o: Renderer handle */ +); + +ivas_error IVAS_REND_SetOrientationTrackingMode( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const IVAS_HEAD_ORIENT_TRK_T orientation_tracking/*i : Head orientation tracking type */ +); + +ivas_error IVAS_REND_SetReferenceRotation( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const IVAS_QUATERNION refRot /* i : Reference rotation */ +); + +ivas_error IVAS_REND_GetMainOrientation( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + IVAS_QUATERNION *pOrientation /* i/o: Quaternion pointer for main orientation */ +); + +ivas_error IVAS_REND_GetTrackedRotation( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + IVAS_QUATERNION *pRotation /* i/o: Quaternion pointer for processed rotation */ +); + +ivas_error IVAS_REND_SetReferenceVector( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const IVAS_VECTOR3 listenerPos, /* i : Listener position */ + const IVAS_VECTOR3 refPos /* i : Reference position */ +); + + +ivas_error IVAS_REND_SetExternalOrientation( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + IVAS_QUATERNION *orientation, /* i : external orientation data */ + int8_t enableHeadRotation, /* i : flag to enable head rotation for this frame */ + int8_t enableExternalOrientation, /* i : flag to enable external orientation for this frame */ + int8_t enableRotationInterpolation, /* i : flag to interpolate rotations from current and previous frames */ + int16_t numFramesToTargetOrientation, /* i : number of frames until target orientation is reached */ + const int16_t sf_idx /* i : subframe index */ +); + +ivas_error IVAS_REND_CombineHeadAndExternalOrientation( + IVAS_REND_HANDLE hIvasRend /* i/o: Renderer handle */ +); + +ivas_error IVAS_REND_GetCombinedOrientation( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + IVAS_QUATERNION *pOrientation /* i/o: Quaternion pointer processed orientation */ +); + +ivas_error IVAS_REND_GetMasaMetadata( + IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS renderer handle */ + IVAS_MASA_DECODER_EXT_OUT_META_HANDLE *hMasaExtOutMeta, /* o : pointer to handle, which will be set to point to analyzed MASA metadata */ + const IVAS_REND_AudioConfigType inputType /* i : Input type */ +); + +ivas_error IVAS_REND_MergeMasaMetadata( + IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS renderer handle */ + IVAS_MASA_DECODER_EXT_OUT_META_HANDLE *hMasaExtOutMeta, /* o : pointer to handle, which will be set to point to merged metadata */ + const IVAS_REND_AudioConfigType inputType1, /* i : Input type 1 */ + const IVAS_REND_AudioConfigType inputType2 /* i : Input type 2 */ +); + +ivas_error IVAS_REND_SetTotalNumberOfObjects( + IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS renderer handle */ + const uint16_t total_num_objects /* i : total number of objects */ +); + +ivas_error IVAS_REND_SetIsmMetadataDelay( + IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS renderer handle */ + const float sync_md_delay /* i : Metadata Delay in ms to sync with audio delay */ +); + +ivas_error IVAS_REND_GetNumAllObjects( + IVAS_REND_CONST_HANDLE hIvasRend, /* i : Renderer handle */ + int16_t *numChannels /* o : number of all objects */ +); + +ivas_error IVAS_REND_GetSamples( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + IVAS_REND_AudioBuffer outAudio /* i/o: buffer for output audio */ +); + +/* Functions to be called after rendering */ + +void IVAS_REND_Close( + IVAS_REND_HANDLE* phIvasRend /* i/o: Pointer to renderer handle */ +); + + + + +/* clang-format on */ + +#endif diff --git a/lib_util/audio_file_reader.c b/lib_util/audio_file_reader.c new file mode 100644 index 0000000000000000000000000000000000000000..4f6bd0c34d13fd62439775d31933f9d67a4197f4 --- /dev/null +++ b/lib_util/audio_file_reader.c @@ -0,0 +1,231 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include "audio_file_reader.h" +#include "tinywavein_c.h" +#include +#include +#include "wmc_auto.h" + +struct AudioFileReader +{ + FILE *rawFile; + WAVEFILEIN *wavFile; + uint32_t samplingRate; + int16_t numChannels; +}; + +static int8_t AudioFileReader_open_raw( + AudioFileReader *self, + const char *fileName ) +{ + self->rawFile = fopen( fileName, "rb" ); + + return self->rawFile != NULL ? 0 : -1; +} + +static int8_t AudioFileReader_open_wav( + AudioFileReader *self, + const char *fileName ) +{ + uint32_t samplesInFile; + int16_t bps; + + self->wavFile = OpenWav( fileName, &self->samplingRate, &self->numChannels, &samplesInFile, &bps ); + + if ( !self->wavFile ) + { + fprintf( stderr, "Failed to open input wav file: %s\n", fileName ); + return -1; + } + + return 0; +} + + +/*! r: AudioFileReader handle */ +ivas_error AudioFileReader_open( + AudioFileReader **audioReader, /* o : AudioFileReader handle */ + const char *fileName /* i : path to wav/raw pcm file */ +) +{ + AudioFileReader *self; + const char *wavSuffix = ".wav"; + uint8_t retCode; + uint32_t fileNameLen, wavSuffixLen; + + *audioReader = NULL; + + if ( !fileName ) + { + return IVAS_ERR_FAILED_FILE_OPEN; + } + + fileNameLen = (uint32_t) strlen( fileName ); + wavSuffixLen = (uint32_t) strlen( wavSuffix ); + + if ( fileNameLen == 0 ) + { + return IVAS_ERR_FAILED_FILE_OPEN; + } + self = calloc( sizeof( AudioFileReader ), 1 ); + self->samplingRate = 0; + self->numChannels = 0; + + if ( fileNameLen > wavSuffixLen && strncmp( fileName + fileNameLen - wavSuffixLen, wavSuffix, wavSuffixLen ) == 0 ) + { + retCode = AudioFileReader_open_wav( self, fileName ); + } + else + { + retCode = AudioFileReader_open_raw( self, fileName ); + } + + if ( retCode != 0 ) + { + AudioFileReader_close( &self ); + return IVAS_ERR_FAILED_FILE_OPEN; + } + + *audioReader = self; + + return IVAS_ERR_OK; +} + + +void AudioFileReader_close( + AudioFileReader **selfPtr /* i/o: pointer to AudioFileReader handle */ +) +{ + AudioFileReader *self; + if ( !selfPtr || !*selfPtr ) + { + return; + } + self = *selfPtr; + if ( self->rawFile ) + { + fclose( self->rawFile ); + self->rawFile = NULL; + } + else if ( self->wavFile ) + { + CloseWavIn( self->wavFile ); + self->wavFile = NULL; + } + free( self ); + *selfPtr = NULL; + + return; +} + + +/*! r: number of read samples */ +ivas_error AudioFileReader_read( + AudioFileReader *self, /* i/o: AudioFileReader handle */ + int16_t *samples, /* o : samples read from the opened file */ + const int16_t numSamples, /* i : number of samples to read */ + int16_t *numSamplesRead /* i : number of samples actualy read */ +) +{ + uint32_t numSamplesRead32 = 0; + ivas_error error = IVAS_ERR_OK; + + if ( self->rawFile ) + { + /* No errors possible here, numSamples != *numSamplesRead is a valid condition */ + *numSamplesRead = (int16_t) fread( samples, sizeof( int16_t ), numSamples, self->rawFile ); + } + + if ( self->wavFile ) + { + if ( ReadWavShort( self->wavFile, samples, numSamples, &numSamplesRead32 ) != __TWI_SUCCESS ) + { + error = IVAS_ERR_FAILED_FILE_READ; + } + + *numSamplesRead = (int16_t) numSamplesRead32; + } + + return error; +} + +ivas_error AudioFileReader_getSamplingRate( + AudioFileReader *self, + int32_t *samplingRate ) +{ + if ( self == NULL || samplingRate == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + if ( self->rawFile ) + { + return IVAS_ERR_SAMPLING_RATE_UNKNOWN; + } + else if ( self->wavFile ) + { + *samplingRate = self->samplingRate; + } + else + { + return IVAS_ERR_NO_FILE_OPEN; + } + + return IVAS_ERR_OK; +} + + +ivas_error AudioFileReader_getNumChannels( + AudioFileReader *self, + int16_t *numChannels ) +{ + if ( self == NULL || numChannels == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + if ( self->rawFile ) + { + return IVAS_ERR_NUM_CHANNELS_UNKNOWN; + } + else if ( self->wavFile ) + { + *numChannels = self->numChannels; + } + else + { + return IVAS_ERR_NO_FILE_OPEN; + } + + return IVAS_ERR_OK; +} diff --git a/lib_util/audio_file_reader.h b/lib_util/audio_file_reader.h new file mode 100644 index 0000000000000000000000000000000000000000..0fd4da5ac76c25285d3b49d67166ce651a96eeb8 --- /dev/null +++ b/lib_util/audio_file_reader.h @@ -0,0 +1,72 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#ifndef IVAS_AUDIO_FILE_READER_H +#define IVAS_AUDIO_FILE_READER_H + +#include "common_api_types.h" + +struct AudioFileReader; +typedef struct AudioFileReader AudioFileReader; + +/* clang-format off */ + +ivas_error AudioFileReader_open( + AudioFileReader **audioReader, /* o : AudioFileReader handle */ + const char *fileName /* i : path to wav/raw pcm file */ +); + +ivas_error AudioFileReader_read( + AudioFileReader *self, /* i/o: AudioFileReader handle */ + int16_t *samples, /* o : samples read from the opened file */ + const int16_t numSamples, /* i : number of samples to read */ + int16_t *numSamplesRead /* i : number of samples actualy read */ +); + +/*! r: ivas error - in particular, IVAS_ERR_SAMPLING_RATE_UNKNOWN if the opened file has no sampling rate metadata */ +ivas_error AudioFileReader_getSamplingRate( + AudioFileReader *self, /* i/o: AudioFileReader handle */ + int32_t* samplingRate /* o : sampling rate of opened audio file */ +); + +/*! r: ivas error - in particular, IVAS_ERR_NUM_CHANNELS_UNKNOWN if the opened file has no metadata specifying number of channels */ +ivas_error AudioFileReader_getNumChannels( + AudioFileReader *self, /* i/o: AudioFileReader handle */ + int16_t * numChannels /* o : number fo channels in opened audio file */ +); + +void AudioFileReader_close( + AudioFileReader **selfPtr /* i/o: pointer to AudioFileReader handle */ +); +/* clang-format on */ + +#endif /* IVAS_AUDIO_FILE_READER_H */ diff --git a/lib_util/audio_file_writer.c b/lib_util/audio_file_writer.c new file mode 100644 index 0000000000000000000000000000000000000000..0ed64d02c59f8a5b3a19c74c9e4986895ad6c5f1 --- /dev/null +++ b/lib_util/audio_file_writer.c @@ -0,0 +1,171 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include "audio_file_writer.h" +#include "tinywaveout_c.h" +#include +#include +#include "wmc_auto.h" + +struct AudioFileWriter +{ + FILE *rawFile; + WAVEFILEOUT *wavFile; +}; + +static int8_t AudioFileWriter_open_raw( + AudioFileWriter *self, + const char *fileName ) +{ + self->rawFile = fopen( fileName, "wb" ); + return self->rawFile != NULL ? 0 : -1; +} + +static int8_t AudioFileWriter_open_wav( + AudioFileWriter *self, + const char *fileName, + uint32_t sampleRate, + uint32_t numChannels ) +{ + self->wavFile = CreateWav( fileName, sampleRate, numChannels, 16 ); + if ( !self->wavFile ) + { + fprintf( stderr, "Failed to open output wav file: %s\n", fileName ); + return -1; + } + return 0; +} + + +ivas_error AudioFileWriter_open( + AudioFileWriter **afWriter, + const char *fileName, + uint32_t sampleRate, + uint32_t numChannels ) +{ + AudioFileWriter *self; + const char *wavSuffix = ".wav"; + + *afWriter = NULL; + + if ( !fileName ) + { + return IVAS_ERR_FAILED_FILE_OPEN; + } + + uint32_t fileNameLen = (uint32_t) strlen( fileName ); + uint32_t wavSuffixLen = (uint32_t) strlen( wavSuffix ); + + if ( fileNameLen == 0 ) + { + return IVAS_ERR_FAILED_FILE_OPEN; + } + + self = calloc( sizeof( AudioFileWriter ), 1 ); + if ( self == NULL ) + { + return IVAS_ERR_FAILED_ALLOC; + } + + int8_t retCode; + + if ( ( fileNameLen > wavSuffixLen ) && ( strncmp( fileName + fileNameLen - wavSuffixLen, wavSuffix, wavSuffixLen ) == 0 ) ) + { + retCode = AudioFileWriter_open_wav( self, fileName, sampleRate, numChannels ); + } + else + { + retCode = AudioFileWriter_open_raw( self, fileName ); + } + + if ( retCode != 0 ) + { + AudioFileWriter_close( &self ); + return IVAS_ERR_FAILED_FILE_OPEN; + } + + *afWriter = self; + + return IVAS_ERR_OK; +} + + +void AudioFileWriter_close( + AudioFileWriter **selfPtr ) +{ + AudioFileWriter *self; + if ( !selfPtr || !*selfPtr ) + { + return; + } + self = *selfPtr; + if ( self->rawFile ) + { + fclose( self->rawFile ); + self->rawFile = NULL; + } + else if ( self->wavFile ) + { + CloseWav( self->wavFile ); + self->wavFile = NULL; + } + free( self ); + *selfPtr = NULL; + + return; +} + + +ivas_error AudioFileWriter_write( + AudioFileWriter *self, + int16_t *samples, + uint32_t numSamples ) +{ + ivas_error error = IVAS_ERR_OK; + if ( self->rawFile ) + { + if ( fwrite( samples, sizeof( int16_t ), numSamples, self->rawFile ) != numSamples ) + { + error = IVAS_ERR_FAILED_FILE_WRITE; + } + } + + if ( self->wavFile ) + { + if ( WriteWavShort( self->wavFile, samples, numSamples ) != __TWO_SUCCESS ) + { + error = IVAS_ERR_FAILED_FILE_WRITE; + } + } + + return error; +} diff --git a/lib_util/audio_file_writer.h b/lib_util/audio_file_writer.h new file mode 100644 index 0000000000000000000000000000000000000000..b5157ffde43f74a15803ec132814992a4fb8ce8f --- /dev/null +++ b/lib_util/audio_file_writer.h @@ -0,0 +1,60 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#ifndef IVAS_AUDIO_FILE_WRITER_H +#define IVAS_AUDIO_FILE_WRITER_H + +#include "common_api_types.h" + +struct AudioFileWriter; +typedef struct AudioFileWriter AudioFileWriter; + +/* clang-format off */ +ivas_error AudioFileWriter_open( + AudioFileWriter **afWriter, /* o : AudioFileWriter handle */ + const char *fileName, /* i : path to wav/raw pcm file */ + uint32_t sampleRate, /* i : sample rate of output file */ + uint32_t numChannels /* i : number of channels in output file */ +); + +ivas_error AudioFileWriter_write( + AudioFileWriter *self, /* i/o: AudioFileReader handle */ + int16_t *samples, /* i : samples to write to output file */ + uint32_t numSamples /* i : number of samples to write */ +); + +void AudioFileWriter_close( + AudioFileWriter **selfPtr /* i/o: pointer to AudioFileReader handle */ +); +/* clang-format on */ + +#endif /* IVAS_AUDIO_FILE_WRITER_H */ diff --git a/lib_util/bitstream_reader.c b/lib_util/bitstream_reader.c new file mode 100644 index 0000000000000000000000000000000000000000..d103e7e7931b3ada3c88df8653e858dba1507296 --- /dev/null +++ b/lib_util/bitstream_reader.c @@ -0,0 +1,317 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include "bitstream_reader.h" +#include "g192.h" +#include "mime_io.h" +#include "ivas_error.h" +#include "ivas_error_utils.h" +#include +#include + + +struct BS_Reader +{ + void *hFormatReader; + + /* clang-format off */ + /* Depending on the requested bitstream format, function pointers below should be set to corresponding wrapper functions. + * `open_filename` and `close` must be implemented for all supported formats, all other functions are optional */ + + /* Allocate hFormatReader and open file with given file name */ + ivas_error ( *open_filename )( void *phFormatReader, const char *filename ); + + /* Close file open by hFormatReader and then free hFormatReader. Even if an error occurs, + * all memory is expected to be freed and (*phFormatReader) set to NULL */ + ivas_error ( *close )( void *phFormatReader); + + /* Rewind file open by hFormatReader */ + ivas_error ( *rewind )( void *hFormatReader ); + + /* Read one frame from open file into a serial bitstream buffer, with each uint16_t representing one bit. */ + ivas_error ( *read_frame_short )( void *hFormatReader, uint16_t *serial, int16_t *num_bits, int16_t *bfi ); + + /* Read one VoIP frame from open file into a bitstream byte buffer. */ + ivas_error ( *read_voip_frame_compact )( void *hFormatReader, uint8_t *serial, int16_t *num_bits, uint16_t *rtpSequenceNumber, uint32_t *rtpTimeStamp, uint32_t *rcvTime_ms ); + /* clang-format on */ +}; + +/*-----------------------------------------------------------------------* + * G192 wrapper functions + *-----------------------------------------------------------------------*/ + +static ivas_error convert_g192_error( int32_t g192_error ) +{ + switch ( g192_error ) + { + case G192_NO_ERROR: + return IVAS_ERR_OK; + case G192_MEMORY_ERROR: + return IVAS_ERR_FAILED_ALLOC; + case G192_WRONG_PARAMS: + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + case G192_INIT_ERROR: + return IVAS_ERR_NOT_CONFIGURED; + case G192_READ_ERROR: + return IVAS_ERR_FAILED_FILE_READ; + case G192_FILE_NOT_FOUND: + return IVAS_ERR_FAILED_FILE_OPEN; + case G192_INVALID_DATA: + return IVAS_ERR_BITSTREAM_READER_INVALID_DATA; + case G192_NOT_IMPLEMENTED: + return IVAS_ERR_NOT_IMPLEMENTED; + case G192_NOT_INITIALIZED: + return IVAS_ERR_NOT_CONFIGURED; + case G192_EOF: + return IVAS_ERR_END_OF_FILE; + default: + break; + } + + return IVAS_ERR_UNKNOWN; +} + +static ivas_error g192_open_filename( void *phFormatReader, const char *filename ) +{ + return convert_g192_error( G192_Reader_Open_filename( (G192_HANDLE *) phFormatReader, filename ) ); +} + +static ivas_error g192_close( void *phFormatReader ) +{ + return convert_g192_error( G192_Reader_Close( (G192_HANDLE *) phFormatReader ) ); +} + +static ivas_error g192_rewind( void *hFormatReader ) +{ + return convert_g192_error( G192_Reader_Rewind( (G192_HANDLE) hFormatReader ) ); +} + +static ivas_error g192_read_frame_short( void *hFormatReader, uint16_t *serial, int16_t *num_bits, int16_t *bfi ) +{ + return convert_g192_error( G192_ReadFrame_short( (G192_HANDLE) hFormatReader, serial, num_bits, bfi ) ); +} + +static ivas_error g192_read_voip_frame_compact( void *hFormatReader, uint8_t *serial, int16_t *num_bits, uint16_t *rtpSequenceNumber, uint32_t *rtpTimeStamp, uint32_t *rcvTime_ms ) +{ + return convert_g192_error( G192_ReadVoipFrame_compact( (G192_HANDLE) hFormatReader, serial, num_bits, rtpSequenceNumber, rtpTimeStamp, rcvTime_ms ) ); +} + +static void init_for_g192( BS_READER_HANDLE hBsReader ) +{ + /* Note: functions on RHS must have exactly the same signature as the corresponding + * function pointer expects, otherwise we are in UB territory */ + hBsReader->open_filename = g192_open_filename; + hBsReader->close = g192_close; + hBsReader->rewind = g192_rewind; + hBsReader->read_frame_short = g192_read_frame_short; + hBsReader->read_voip_frame_compact = g192_read_voip_frame_compact; +} + +/*-----------------------------------------------------------------------* + * MIME wrapper functions + *-----------------------------------------------------------------------*/ + +static ivas_error convert_mime_error( int32_t mime_error ) +{ + switch ( mime_error ) + { + case MIME_NO_ERROR: + return IVAS_ERR_OK; + case MIME_MEMORY_ERROR: + return IVAS_ERR_FAILED_ALLOC; + case MIME_WRONG_PARAMS: + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + case MIME_FILE_NOT_FOUND: + return IVAS_ERR_FAILED_FILE_OPEN; + case MIME_NOT_INITIALIZED: + return IVAS_ERR_NOT_CONFIGURED; + case MIME_READ_ERROR: + return IVAS_ERR_FAILED_FILE_READ; + case MIME_INVALID_DATA: + return IVAS_ERR_BITSTREAM_READER_INVALID_DATA; + case MIME_EOF: + return IVAS_ERR_END_OF_FILE; + default: + break; + } + + return IVAS_ERR_UNKNOWN; +} + +static ivas_error mime_open_filename( void *phFormatReader, const char *filename ) +{ + return convert_mime_error( MIME_Reader_Open_filename( (MIME_HANDLE *) phFormatReader, filename ) ); +} + +static ivas_error mime_close( void *phFormatReader ) +{ + return convert_mime_error( MIME_Reader_Close( (MIME_HANDLE *) phFormatReader ) ); +} + +static ivas_error mime_rewind( void *hFormatReader ) +{ + return convert_mime_error( MIME_Reader_Rewind( (MIME_HANDLE) hFormatReader ) ); +} + +static ivas_error mime_read_frame_short( void *hFormatReader, uint16_t *serial, int16_t *num_bits, int16_t *bfi ) +{ + return convert_mime_error( MIME_ReadFrame_short( (MIME_HANDLE) hFormatReader, serial, num_bits, bfi ) ); +} + +static void init_for_mime( BS_READER_HANDLE hBsReader ) +{ + /* Note: functions on RHS must have exactly the same signature as the corresponding + * function pointer expects, otherwise we are in UB territory */ + hBsReader->open_filename = mime_open_filename; + hBsReader->close = mime_close; + hBsReader->rewind = mime_rewind; + hBsReader->read_frame_short = mime_read_frame_short; +} + +/*-----------------------------------------------------------------------* + * API functions implementation + *-----------------------------------------------------------------------*/ + +static ivas_error init_for_format( BS_READER_HANDLE *phBsReader, BS_READER_FORMAT format ) +{ + /* Allocate memory under handle and check if allocation successful */ + ( *phBsReader ) = (BS_READER_HANDLE) malloc( sizeof( struct BS_Reader ) ); + if ( *phBsReader == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "could not allocate bitstream reader" ); + } + + /* Initialize all struct members to NULL - supported functions + * will be overwritten below in init_for_ */ + BS_READER_HANDLE hBsReader = *phBsReader; + memset( hBsReader, 0, sizeof( struct BS_Reader ) ); + + /* Set function pointers to selected format */ + switch ( format ) + { + case BS_READER_FORMAT_G192: + init_for_g192( hBsReader ); + break; + case BS_READER_FORMAT_MIME: + init_for_mime( hBsReader ); + break; + default: + BS_Reader_Close( phBsReader ); + return IVAS_ERR_BITSTREAM_READER_INVALID_FORMAT; + } + + return IVAS_ERR_OK; +} + +ivas_error BS_Reader_Open_filename( BS_READER_HANDLE *phBsReader, const char *filename, BS_READER_FORMAT format ) +{ + ivas_error error = IVAS_ERR_OK; + + /* Check if pointers valid */ + if ( phBsReader == NULL || filename == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + /* Allocate and set up for the requested format */ + if ( ( error = init_for_format( phBsReader, format ) ) != IVAS_ERR_OK ) + { + goto cleanup; + } + + /* Open file with the handle of the selected format */ + BS_READER_HANDLE hBsReader = *phBsReader; + if ( ( error = hBsReader->open_filename( &hBsReader->hFormatReader, filename ) ) != IVAS_ERR_OK ) + { + goto cleanup; + } + + return IVAS_ERR_OK; + +cleanup: + + BS_Reader_Close( phBsReader ); + return error; +} + + +ivas_error BS_Reader_ReadFrame_short( BS_READER_HANDLE hBsReader, uint16_t *serial, int16_t *num_bits, int16_t *bfi ) +{ + if ( hBsReader == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + if ( hBsReader->read_frame_short == NULL ) + { + return IVAS_ERR_NOT_IMPLEMENTED; + } + + return hBsReader->read_frame_short( hBsReader->hFormatReader, serial, num_bits, bfi ); +} + +ivas_error BS_Reader_ReadVoipFrame_compact( BS_READER_HANDLE hBsReader, uint8_t *serial, int16_t *num_bits, uint16_t *rtpSequenceNumber, uint32_t *rtpTimeStamp, uint32_t *rcvTime_ms ) +{ + if ( hBsReader == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + if ( hBsReader->read_voip_frame_compact == NULL ) + { + return IVAS_ERR_NOT_IMPLEMENTED; + } + + return hBsReader->read_voip_frame_compact( hBsReader->hFormatReader, serial, num_bits, rtpSequenceNumber, rtpTimeStamp, rcvTime_ms ); +} + + +ivas_error BS_Reader_Close( BS_READER_HANDLE *phBsReader ) +{ + if ( phBsReader == NULL || *phBsReader == NULL ) + { + return IVAS_ERR_OK; + } + + BS_READER_HANDLE hBsReader = *phBsReader; + ivas_error error = IVAS_ERR_OK; + + if ( hBsReader->close != NULL ) + { + error = hBsReader->close( &( hBsReader )->hFormatReader ); + } + + free( hBsReader ); + *phBsReader = NULL; + + return error; +} diff --git a/lib_util/bitstream_reader.h b/lib_util/bitstream_reader.h new file mode 100644 index 0000000000000000000000000000000000000000..937e8f167cd24fdd189e37231e3d44dd3686ee5f --- /dev/null +++ b/lib_util/bitstream_reader.h @@ -0,0 +1,69 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#ifndef BITSTREAM_READER_H +#define BITSTREAM_READER_H + +#include "common_api_types.h" + + +/*-----------------------------------------------------------------------* + * Enums + *-----------------------------------------------------------------------*/ + +typedef enum BS_READER_FORMAT +{ + BS_READER_FORMAT_G192 = 0, + BS_READER_FORMAT_MIME = 1, +} BS_READER_FORMAT; + +/*-----------------------------------------------------------------------* + * Structures + *-----------------------------------------------------------------------*/ + +typedef struct BS_Reader *BS_READER_HANDLE; + +/*-----------------------------------------------------------------------* + * Functions + *-----------------------------------------------------------------------*/ + +ivas_error BS_Reader_Open_filename( BS_READER_HANDLE *phBsReader, const char *filename, BS_READER_FORMAT format ); + + +ivas_error BS_Reader_ReadFrame_short( BS_READER_HANDLE hBsReader, uint16_t *serial, int16_t *num_bits, int16_t *bfi ); + +ivas_error BS_Reader_ReadVoipFrame_compact( BS_READER_HANDLE hBsReader, uint8_t *serial, int16_t *num_bits, uint16_t *rtpSequenceNumber, uint32_t *rtpTimeStamp, uint32_t *rcvTime_ms ); + +ivas_error BS_Reader_Close( BS_READER_HANDLE *phBsReader ); + + +#endif /* BITSTREAM_READER_H */ diff --git a/lib_util/bitstream_writer.c b/lib_util/bitstream_writer.c new file mode 100644 index 0000000000000000000000000000000000000000..7862ff1977c840601d39065c173eecf32674d290 --- /dev/null +++ b/lib_util/bitstream_writer.c @@ -0,0 +1,251 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include "bitstream_writer.h" +#include "g192.h" +#include "mime_io.h" +#include "ivas_error_utils.h" +#include +#include + + +struct BS_Writer +{ + void *hFormatWriter; + + /* clang-format off */ + ivas_error ( *open_filename )( void *phFormatWriter, const char *filename ); + ivas_error ( *close )( void *phFormatWriter ); + ivas_error ( *write_frame_short )( void *hFormatWriter, const uint16_t *serial, int32_t num_bits, int32_t frame_bitrate ); + /* clang-format on */ +}; + +/*-----------------------------------------------------------------------* + * G192 wrapper functions + *-----------------------------------------------------------------------*/ + +static ivas_error convert_g192_error( int32_t g192_error ) +{ + switch ( g192_error ) + { + case G192_NO_ERROR: + return IVAS_ERR_OK; + case G192_MEMORY_ERROR: + return IVAS_ERR_FAILED_ALLOC; + case G192_WRONG_PARAMS: + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + case G192_INIT_ERROR: + return IVAS_ERR_INIT_ERROR; + case G192_WRITE_ERROR: + return IVAS_ERR_FAILED_FILE_READ; + case G192_NOT_IMPLEMENTED: + return IVAS_ERR_NOT_IMPLEMENTED; + case G192_NOT_INITIALIZED: + return IVAS_ERR_NOT_CONFIGURED; + } + + return IVAS_ERR_UNKNOWN; +} + +static ivas_error g192_open_filename( void *phFormatWriter, const char *filename ) +{ + return convert_g192_error( G192_Writer_Open_filename( (G192_HANDLE *) phFormatWriter, filename ) ); +} + +static ivas_error g192_close( void *phFormatWriter ) +{ + return convert_g192_error( G192_Writer_Close( (G192_HANDLE *) phFormatWriter ) ); +} + +static ivas_error g192_write_frame_short( void *hFormatWriter, const uint16_t *serial, int32_t num_bits, int32_t frame_bitrate ) +{ + (void) frame_bitrate; /* Unused */ + return convert_g192_error( G192_WriteFrame( (G192_HANDLE) hFormatWriter, serial, (int16_t) num_bits ) ); +} + +static void init_for_g192( BS_WRITER_HANDLE hBsWriter ) +{ + /* Note: functions on RHS must have exactly the same signature as the corresponding + * function pointer expects, otherwise we are in UB territory */ + hBsWriter->open_filename = g192_open_filename; + hBsWriter->close = g192_close; + hBsWriter->write_frame_short = g192_write_frame_short; +} + +/*-----------------------------------------------------------------------* + * MIME wrapper functions + *-----------------------------------------------------------------------*/ + +static ivas_error convert_mime_error( int32_t mime_error ) +{ + switch ( mime_error ) + { + case MIME_NO_ERROR: + return IVAS_ERR_OK; + case MIME_MEMORY_ERROR: + return IVAS_ERR_FAILED_ALLOC; + case MIME_WRONG_PARAMS: + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + case MIME_NOT_INITIALIZED: + return IVAS_ERR_NOT_CONFIGURED; + case MIME_WRITE_ERROR: + return IVAS_ERR_FAILED_FILE_READ; + } + + return IVAS_ERR_UNKNOWN; +} + +static ivas_error mime_open_filename( void *phFormatWriter, const char *filename ) +{ + return convert_mime_error( MIME_Writer_Open_filename( (MIME_HANDLE *) phFormatWriter, filename ) ); +} + +static ivas_error mime_close( void *phFormatWriter ) +{ + return convert_mime_error( MIME_Writer_Close( (MIME_HANDLE *) phFormatWriter ) ); +} + +static ivas_error mime_write_frame_short( void *hFormatWriter, const uint16_t *serial, int32_t num_bits, int32_t frame_bitrate ) +{ + return convert_mime_error( MIME_WriteFrame( (MIME_HANDLE) hFormatWriter, serial, (int16_t) num_bits, frame_bitrate ) ); +} + +static void init_for_mime( BS_WRITER_HANDLE hBsWriter ) +{ + /* Note: functions on RHS must have exactly the same signature as the corresponding + * function pointer expects, otherwise we are in UB territory */ + hBsWriter->open_filename = mime_open_filename; + hBsWriter->close = mime_close; + hBsWriter->write_frame_short = mime_write_frame_short; +} + + +/*-----------------------------------------------------------------------* + * API functions implementation + *-----------------------------------------------------------------------*/ + +static ivas_error init_for_format( BS_WRITER_HANDLE *phBsWriter, BS_WRITER_FORMAT format ) +{ + /* Allocate memory under handle and check if allocation successful */ + ( *phBsWriter ) = (BS_WRITER_HANDLE) malloc( sizeof( struct BS_Writer ) ); + if ( *phBsWriter == NULL ) + { + IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "could not allocate bitstream writer" ); + } + + /* Initialize all struct members to NULL - supported functions + * will be overwritten below in init_for_ */ + BS_WRITER_HANDLE hBsWriter = *phBsWriter; + memset( hBsWriter, 0, sizeof( struct BS_Writer ) ); + + /* Set function pointers to selected format */ + switch ( format ) + { + case BS_WRITER_FORMAT_G192: + init_for_g192( hBsWriter ); + break; + case BS_WRITER_FORMAT_MIME: + init_for_mime( hBsWriter ); + break; + default: + BS_Writer_Close( phBsWriter ); + return IVAS_ERR_BITSTREAM_WRITER_INVALID_FORMAT; + } + + return IVAS_ERR_OK; +} + +ivas_error BS_Writer_Open_filename( BS_WRITER_HANDLE *phBsWriter, const char *filename, BS_WRITER_FORMAT format ) +{ + ivas_error error = IVAS_ERR_OK; + + /* Check if pointers valid */ + if ( phBsWriter == NULL || filename == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + /* Allocate and set up for the requested format */ + if ( ( error = init_for_format( phBsWriter, format ) ) != IVAS_ERR_OK ) + { + goto cleanup; + } + + /* Open file with the handle of the selected format */ + BS_WRITER_HANDLE hBsWriter = *phBsWriter; + if ( ( error = hBsWriter->open_filename( &hBsWriter->hFormatWriter, filename ) ) != IVAS_ERR_OK ) + { + goto cleanup; + } + + return IVAS_ERR_OK; + +cleanup: + BS_Writer_Close( phBsWriter ); + return error; +} + +ivas_error BS_Writer_WriteFrame_short( BS_WRITER_HANDLE hBsWriter, const uint16_t *serial, int32_t numBits, int32_t frameBitrate ) +{ + if ( hBsWriter == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + if ( hBsWriter->write_frame_short == NULL ) + { + return IVAS_ERR_NOT_IMPLEMENTED; + } + + return hBsWriter->write_frame_short( hBsWriter->hFormatWriter, serial, numBits, frameBitrate ); +} + +ivas_error BS_Writer_Close( BS_WRITER_HANDLE *phBsWriter ) +{ + if ( phBsWriter == NULL || *phBsWriter == NULL ) + { + return IVAS_ERR_OK; + } + + BS_WRITER_HANDLE hBsWriter = *phBsWriter; + ivas_error error = IVAS_ERR_OK; + + if ( hBsWriter->close != NULL ) + { + error = hBsWriter->close( &( hBsWriter )->hFormatWriter ); + } + + free( hBsWriter ); + *phBsWriter = NULL; + + return error; +} diff --git a/lib_util/bitstream_writer.h b/lib_util/bitstream_writer.h new file mode 100644 index 0000000000000000000000000000000000000000..a855f347d272e09d8996e4540154c580ba29cefb --- /dev/null +++ b/lib_util/bitstream_writer.h @@ -0,0 +1,66 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#ifndef BITSTREAM_WRITER_H +#define BITSTREAM_WRITER_H + +#include "common_api_types.h" + + +/*-----------------------------------------------------------------------* + * Enums + *-----------------------------------------------------------------------*/ + +typedef enum BS_WRITER_FORMAT +{ + BS_WRITER_FORMAT_G192 = 0, + BS_WRITER_FORMAT_MIME = 1, +} BS_WRITER_FORMAT; + +/*-----------------------------------------------------------------------* + * Structures + *-----------------------------------------------------------------------*/ + +typedef struct BS_Writer *BS_WRITER_HANDLE; + +/*-----------------------------------------------------------------------* + * Functions + *-----------------------------------------------------------------------*/ + +ivas_error BS_Writer_Open_filename( BS_WRITER_HANDLE *phBsWriter, const char *filename, BS_WRITER_FORMAT format ); + +ivas_error BS_Writer_WriteFrame_short( BS_WRITER_HANDLE hBsWriter, const uint16_t *serial, int32_t numBits, int32_t frameBitrate ); + +ivas_error BS_Writer_Close( BS_WRITER_HANDLE *phBsWriter ); + + +#endif /* BITSTREAM_WRITER_H */ diff --git a/lib_util/cmdl_tools.c b/lib_util/cmdl_tools.c new file mode 100644 index 0000000000000000000000000000000000000000..b0b7e906cca95b1bb64e66a62677ec1ef1eb21e9 --- /dev/null +++ b/lib_util/cmdl_tools.c @@ -0,0 +1,227 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include "cmdl_tools.h" +#include + +/*---------------------------------------------------------------------* + * to_upper() + * + * Capitalize all letters of a string. + *---------------------------------------------------------------------*/ + +char *to_upper( char *str ) +{ + int16_t i; + + i = 0; + while ( str[i] != 0 ) + { + if ( str[i] >= 'a' && str[i] <= 'z' ) + { + str[i] += 'A' - 'a'; + } + i++; + } + + return str; +} + + +/*---------------------------------------------------------------------* + * is_digits_only() + * + * Check if a string contains only digits. + *---------------------------------------------------------------------*/ + +bool is_digits_only( const char *str ) +{ + int16_t i; + + i = 0; + while ( str[i] != 0 ) + { + if ( str[i] < '0' || str[i] > '9' ) + { + return false; + } + i++; + } + + return true; +} + + +/*---------------------------------------------------------------------* + * is_number() + * + * Check if a string is a number. + *---------------------------------------------------------------------*/ + +bool is_number( const char *str ) +{ + bool decimal_separator_found; + int16_t i; + int16_t numeric_len; + + decimal_separator_found = false; + i = 0; + numeric_len = 0; + + /* Check for null string or sign character */ + if ( str[i] == '\0' ) + { + return false; + } + else if ( str[i] == '+' || str[i] == '-' ) + { + i++; + } + + /* Ensure rest of string is numeric and only one decimal separator is present */ + while ( str[i] != 0 ) + { + if ( str[i] < '0' || str[i] > '9' ) + { + if ( str[i] == '.' ) + { + if ( decimal_separator_found ) + { + return false; + } + else + { + decimal_separator_found = true; + } + } + else if ( str[i] != '\r' && str[i] != '\n' ) + { + return false; + } + } + else + { + numeric_len++; + } + i++; + } + + if ( numeric_len == 0 ) + { + return false; + } + + return true; +} + + +/*---------------------------------------------------------------------* + * convert_backslash() + * + * + *---------------------------------------------------------------------*/ + +void convert_backslash( + char *str ) +{ + int16_t i, len; + + /* check that all backslashes are correct on the given platform */ + len = (int16_t) strlen( str ); + + for ( i = 0; i < len; i++ ) + { +#ifdef _WIN32 + if ( str[i] == '/' ) + { + str[i] = '\\'; + } +#else + if ( str[i] == '\\' ) + { + str[i] = '/'; + } +#endif + } + + return; +} + +/*---------------------------------------------------------------------* + * remove_cr() + * + * + *---------------------------------------------------------------------*/ + +void remove_cr( + char *str ) +{ + char *pos; + + /* remove all \r characters from the string */ + pos = strchr( str, '\r' ); + while ( pos != NULL ) + { + strcpy( pos, pos + 1 ); + pos = strchr( pos, '\r' ); + } + + return; +} + + +/*---------------------------------------------------------------------* + * clearString() + * + * + *---------------------------------------------------------------------*/ + +void clearString( + char *str ) +{ + str[0] = '\0'; + + return; +} + + +/*---------------------------------------------------------------------* + * isEmptyString() + * + * + *---------------------------------------------------------------------*/ + +bool isEmptyString( + const char *str ) +{ + return str[0] == '\0'; +} diff --git a/lib_util/cmdl_tools.h b/lib_util/cmdl_tools.h new file mode 100644 index 0000000000000000000000000000000000000000..b160473002930dd2c980d9bfbdcfb8e1bad3722a --- /dev/null +++ b/lib_util/cmdl_tools.h @@ -0,0 +1,53 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#ifndef CMDL_TOOLS_H +#define CMDL_TOOLS_H + +#include +#include + +bool is_digits_only( const char *str ); + +bool is_number( const char *str ); + +char *to_upper( char *str ); + +void convert_backslash( char *str ); + +void remove_cr( char *str ); + +void clearString( char *str ); + +bool isEmptyString( const char *str ); + +#endif /* CMDL_TOOLS_H */ diff --git a/lib_util/cmdln_parser.c b/lib_util/cmdln_parser.c new file mode 100644 index 0000000000000000000000000000000000000000..6ac2b0ec2d0ebf5e58c7637c5c00e3e813dd4444 --- /dev/null +++ b/lib_util/cmdln_parser.c @@ -0,0 +1,389 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include "cmdln_parser.h" +#include "cmdl_tools.h" +#include +#include +#include +#include + +#define MAX_SUPPORTED_OPTS ( 1024 ) +#define MAX_OPTION_LENGTH ( 1024 ) + +typedef CmdLnParser_Option OptionProps; + +typedef struct +{ + OptionProps props; + int8_t hasBeenParsed; +} Option; + +static int16_t validateNoDuplicateIds( + const OptionProps *props, + int32_t numOpts ) +{ + for ( int32_t i = 0; i < numOpts; ++i ) + { + for ( int32_t j = i + 1; j < numOpts; ++j ) + { + if ( props[i].id == props[j].id ) + { + fprintf( stderr, "[dev] Duplicate ID == %d between options %s and %s\n", props[i].id, props[i].match, props[j].match ); + return -1; + } + } + } + + return 0; +} + +static int16_t validateOptionProps( + OptionProps props ) +{ + /* Check required properties */ + if ( props.match == NULL ) + { + /* TODO(sgi): Don't print out usage after this - props.match is used there */ + fprintf( stderr, "[dev] Option with ID == %d - missing required property \"match\"\n", props.id ); + return -1; + } + + if ( props.id == 0 ) + { + fprintf( stderr, "[dev] Invalid ID for option %s. ID == %d is reserved.\n", props.match, props.id ); + return -1; + } + + return 0; +} + +/* Validate given OptionProps and use them to initialize array of Options */ +static int16_t initOpts( + const OptionProps *options, + const int32_t numOpts, + Option *opts ) +{ + for ( int32_t i = 0; i < numOpts; ++i ) + { + if ( validateOptionProps( options[i] ) != 0 ) + { + return -1; + } + + Option tmp = { + .hasBeenParsed = 0 + }; + tmp.props = options[i]; /* Cannot assign in aggregate initializer above - causes Visual Studio warning */ + + opts[i] = tmp; + } + + /* Check for duplicate IDs */ + if ( validateNoDuplicateIds( options, numOpts ) != 0 ) + { + return -1; + } + + return 0; +} + +static int8_t stringLooksLikeOption( + const char *str ) +{ + if ( ( str[0] == '-' ) && is_number( str ) == false ) + { + return 1; + } + + return 0; +} + +static const char *stringToOptionName( + const char *str ) +{ + while ( ( *str == '-' ) && ( ( str[1] != '0' ) || ( str[1] != '1' ) ) ) + { + ++str; + } + + return str; +} + +static int8_t optionMatchesString( + Option opt, + const char *str ) +{ + if ( !stringLooksLikeOption( str ) ) + { + return 0; + } + + const char *optionName = stringToOptionName( str ); + + if ( strncmp( optionName, opt.props.match, MAX_OPTION_LENGTH ) == 0 || strncmp( optionName, opt.props.matchShort, MAX_OPTION_LENGTH ) == 0 ) + { + return 1; + } + + return 0; +} + +static int16_t parseOpts( + int32_t argc, + char **argv, + Option *opts, + const int32_t numOpts, + void *pOutputStruct, + CmdLnParser_FnPtr_ParseOption parseOption ) +{ + Option *currOpt = NULL; + int32_t currOptIdx = 1; + Option *nextOpt = NULL; + int32_t nextOptIdx = 0; + int16_t numValues = 0; + + /* Go through all given argv */ + for ( int32_t argIdx = 1; argIdx < argc; ++argIdx ) + { + /* For current argument from argv go through all options and try to match */ + for ( int32_t optIdx = 0; optIdx < numOpts; ++optIdx ) + { + Option *optToMatch = &opts[optIdx]; + if ( optionMatchesString( *optToMatch, argv[argIdx] ) ) + { + nextOpt = optToMatch; + nextOptIdx = argIdx; + + /* Check if already parsed */ + if ( optToMatch->hasBeenParsed ) + { + fprintf( stderr, "Duplicate option: %s (%s)\n", optToMatch->props.match, optToMatch->props.matchShort ); + return -1; + } + + break; + } + } + + /* If no option matched, it is either a value belonging to current option or an invalid option */ + if ( nextOpt == NULL ) + { + /* Invalid option */ + if ( stringLooksLikeOption( argv[argIdx] ) ) + { + fprintf( stderr, "Unknown option `%s`\n", stringToOptionName( argv[argIdx] ) ); + return -1; + } + + /* Otherwise, value following current option. + * Exception: at the beginning of parsing (when current option is NULL) no values are allowed, throw error*/ + if ( currOpt != NULL ) + { + ++numValues; + } + else + { + fprintf( stderr, "Unexpected token `%s`\n", argv[argIdx] ); + return -1; + } + } + + /* If current argument is a recognized option or no more arguments left, parse current option into output struct*/ + if ( nextOpt != NULL ) + { + if ( currOpt != NULL ) + { + parseOption( currOpt->props.id, &argv[currOptIdx + 1], numValues, pOutputStruct ); + currOpt->hasBeenParsed = 1; + } + + currOpt = nextOpt; + currOptIdx = nextOptIdx; + nextOpt = NULL; + nextOptIdx = 0; + numValues = 0; + } + } + + /* Parse last option */ + if ( currOpt != NULL ) + { + parseOption( currOpt->props.id, &argv[currOptIdx + 1], numValues, pOutputStruct ); + currOpt->hasBeenParsed = 1; + } + + return 0; +} + +static const char *getBasename( + const char *path ) +{ + /* Find last forward slash in path */ + const char *namePtr = strrchr( path, '/' ); + if ( namePtr != NULL ) + { + return namePtr + 1; + } + + /* If not found, try to find last backslash in path */ + namePtr = strrchr( path, '\\' ); + if ( namePtr != NULL ) + { + return namePtr + 1; + } + + /* If also not found, return full path, which implictly should be the basename */ + return path; +} + +static int32_t totalOptionNameLength( + const OptionProps opt ) +{ + return (int32_t) ( strlen( opt.match ) + strlen( opt.matchShort ) ); +} + +static void printWhitespace( + const int32_t n ) +{ + for ( int32_t i = 0; i < n; ++i ) + { + fprintf( stderr, " " ); + } +} + +static void printOptDescriptionAligned( + const char *descPtr, + int32_t descriptionColumnIdx ) +{ + if ( descPtr == NULL ) + { + fprintf( stderr, "\n" ); + return; + } + + while ( 1 ) + { + if ( *descPtr == '\0' ) + { + fprintf( stderr, "\n" ); + break; + } + + fprintf( stderr, "%c", *descPtr ); + if ( *descPtr == '\n' ) + { + printWhitespace( descriptionColumnIdx ); + } + ++descPtr; + } + + return; +} + +static void printUsage( + const char *argv0, + const OptionProps *optionProps, + const int32_t numOptions ) +{ + fprintf( stderr, "\n" ); + fprintf( stderr, "Usage: %s [options]\n", getBasename( argv0 ) ); + fprintf( stderr, "\n" ); + fprintf( stderr, "Valid options:\n" ); + + /* Find option with longest name, used for pretty formatting */ + int32_t maxOptNameLength = 0; + for ( int32_t i = 0; i < numOptions; ++i ) + { + const int32_t optNameLength = totalOptionNameLength( optionProps[i] ); + if ( maxOptNameLength < optNameLength ) + { + maxOptNameLength = optNameLength; + } + } + + const int32_t preDescriptionWhitespace = 8; + const int32_t leftColumnAdditionalChars = 7; + for ( int32_t i = 0; i < numOptions; ++i ) + { + OptionProps opt = optionProps[i]; + const int32_t optNameLength = totalOptionNameLength( optionProps[i] ); + + /* TODO(sgi): make matchShort optional */ + fprintf( stderr, " --%s, -%s", opt.match, opt.matchShort ); + + printWhitespace( maxOptNameLength - optNameLength + preDescriptionWhitespace ); + printOptDescriptionAligned( opt.description, maxOptNameLength + preDescriptionWhitespace + leftColumnAdditionalChars ); + } + + return; +} + +int16_t CmdLnParser_parseArgs( + int32_t argc, + char **argv, + const OptionProps *optionProps, + const int32_t numOptions, + void *pOutputStruct, + CmdLnParser_FnPtr_ParseOption parseOption ) +{ + assert( numOptions <= MAX_SUPPORTED_OPTS ); + + /* Prepare option array */ + Option opts[MAX_SUPPORTED_OPTS]; + if ( initOpts( optionProps, numOptions, opts ) != 0 ) + { + goto fail; + } + + /* Iterate over argv and parse */ + if ( parseOpts( argc, argv, opts, numOptions, pOutputStruct, parseOption ) != 0 ) + { + goto fail; + } + + return 0; + +fail: + printUsage( argv[0], optionProps, numOptions ); + return -1; +} + +void CmdLnParser_printUsage( + char *executableName, + const CmdLnParser_Option *options, + const int32_t numOptions ) +{ + printUsage( executableName, options, numOptions ); + + return; +} diff --git a/lib_util/cmdln_parser.h b/lib_util/cmdln_parser.h new file mode 100644 index 0000000000000000000000000000000000000000..b8c8370eb4e7efbfa3c6da5a1c2c661510bb1a89 --- /dev/null +++ b/lib_util/cmdln_parser.h @@ -0,0 +1,54 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#ifndef CMDLN_PARSER_H +#define CMDLN_PARSER_H + +#include "common_api_types.h" +#include + +typedef struct +{ + int32_t id; + const char *match; + const char *matchShort; + const char *description; +} CmdLnParser_Option; + +/* Function for parsing option values into an output struct, to be implemented by the user */ +typedef void ( *CmdLnParser_FnPtr_ParseOption )( int32_t optionId, char **optionValues, int16_t numOptionValues, void *pOutputStruct ); + +int16_t CmdLnParser_parseArgs( int32_t argc, char **argv, const CmdLnParser_Option *options, const int32_t numOptions, void *pOutputStruct, CmdLnParser_FnPtr_ParseOption parseOption ); + +void CmdLnParser_printUsage( char *executableName, const CmdLnParser_Option *options, const int32_t numOptions ); + +#endif /* CMDLN_PARSER_H */ diff --git a/lib_util/evs_rtp_payload.c b/lib_util/evs_rtp_payload.c new file mode 100644 index 0000000000000000000000000000000000000000..d67aebd4c0f4312f523e17cb74d1549fe5148bb6 --- /dev/null +++ b/lib_util/evs_rtp_payload.c @@ -0,0 +1,275 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include "evs_rtp_payload.h" + +static void evsPayload_unpackFrame_compact_amrWbIo( const char *payload, uint16_t payloadSizeBits, uint16_t iProtectedSize, unsigned char **framePtr, uint16_t *frameSizeInBits ) +{ + uint16_t i, iBit0; + unsigned char d0, *frame = *framePtr; + /* ignore 3 bit CMR and padding bits for EVS AMR-WB IO */ + if ( iProtectedSize == 2 ) + { /* EVS AMR-WB IO 6.6 */ + *frameSizeInBits = payloadSizeBits - 4; + } + else if ( iProtectedSize == 5 ) + { /* EVS AMR-WB IO 8.85 */ + *frameSizeInBits = payloadSizeBits - 7; + } + else + { + *frameSizeInBits = payloadSizeBits - 3; + } + iBit0 = *frameSizeInBits + 3 - 1; + d0 = ( ( (unsigned char) payload[iBit0 / 8] ) >> ( 7 - ( iBit0 % 8 ) ) ) & 0x01; + frame[0] = ( d0 << 7 ) | ( ( payload[0] & 0x1f ) << 2 ); /* d(1..5) */ + ++payload; + for ( i = 1; i != ( payloadSizeBits + 7 ) / 8; ++i ) + { + *frame++ |= ( *payload & 0xc0 ) >> 6; + *frame = ( *payload & 0x3f ) << 2; + ++payload; + } + assert( frame == *framePtr + ( *frameSizeInBits + 7 ) / 8 - 1 ); + /* last payload byte contained d(0), clear it */ + ( *framePtr )[*frameSizeInBits / 8] &= ~( 0x80 >> ( *frameSizeInBits % 8 ) ); +} + +static void evsPayload_unpackFrame_compact_evsPrimary( char *payload, uint16_t payloadSizeBits, unsigned char **framePtr, uint16_t *frameSizeInBits ) +{ + *framePtr = (unsigned char *) payload; /* no need to copy frame bytes */ + *frameSizeInBits = payloadSizeBits; +} + + +static void evsPayload_unpackFrame_compact( char *payload, uint16_t payloadSizeBits, uint16_t iProtectedSize, bool *isAMRWB_IOmode, uint16_t *frameTypeIndex, unsigned char **framePtr, uint16_t *frameSizeInBits ) +{ + if ( iProtectedSize == 1 ) + { /* A.2.1.3 Special case for 56 bit payload size (EVS Primary or EVS AMR-WB IO SID) */ + assert( ( payload[0] & 0x80 ) == 0 ); /* AMR-WB IO SID has no compact format and therefore is handled outside this function */ + *isAMRWB_IOmode = false; + *frameTypeIndex = 0; /* PRIMARY_2800 */ + } + else + { + *isAMRWB_IOmode = evsPayloadProtectedSizes_isAMRWB_IOmode[iProtectedSize]; + *frameTypeIndex = evsPayloadProtectedSizes_frameTypeIndex[iProtectedSize]; + } + if ( *isAMRWB_IOmode ) + { + evsPayload_unpackFrame_compact_amrWbIo( payload, payloadSizeBits, iProtectedSize, framePtr, frameSizeInBits ); + } + else + { + evsPayload_unpackFrame_compact_evsPrimary( payload, payloadSizeBits, framePtr, frameSizeInBits ); + } +} + +bool evsPayload_unpackFrame( bool hf_only, char *payload, uint16_t payloadSizeBytes, uint16_t frameIndex, bool *isAMRWB_IOmode, bool *frameFollowing, uint16_t *frameTypeIndex, bool *qBit, unsigned char **framePtr, uint16_t *frameSizeInBits ) +{ + uint16_t payloadSizeBits = payloadSizeBytes * 8; + bool specialCaseIoSid = payloadSizeBits == 56 && ( payload[0] & 0x80 ); /* A.2.1.3 Special case for 56 bit payload size */ + if ( !hf_only && !specialCaseIoSid ) + { /* A.2.3.1 Default format handling */ + uint16_t i; + for ( i = 0; i != sizeof( evsPayloadProtectedSizes ) / sizeof( evsPayloadProtectedSizes )[0]; ++i ) + { + if ( payloadSizeBits == evsPayloadProtectedSizes[i] ) + { + assert( frameIndex == 0 ); + *frameFollowing = false; + *qBit = true; + evsPayload_unpackFrame_compact( payload, payloadSizeBits, i, isAMRWB_IOmode, frameTypeIndex, framePtr, frameSizeInBits ); + return true; + } + } + } /* else: A.2.3.2 Header-Full-only format handling */ + return evsHeaderFullPayload_unpackFrame( payload, payloadSizeBytes, frameIndex, isAMRWB_IOmode, + frameFollowing, frameTypeIndex, qBit, framePtr, frameSizeInBits ); +} + +static void evsHeaderFullPayload_parseToc( uint8_t toc, bool *isAMRWB_IOmode, bool *frameFollowing, uint16_t *frameTypeIndex, bool *qBit, int32_t *bitrate ) +{ + bool evsModeBit = ( toc & 0x20 ) != 0; + *isAMRWB_IOmode = evsModeBit; + *frameFollowing = ( toc & 0x40 ) != 0; + *frameTypeIndex = toc & 0x0f; + if ( !*isAMRWB_IOmode ) + { + *qBit = true; /* assume good q_bit for the unused EVS-mode bit */ + *bitrate = PRIMARYmode2rate[*frameTypeIndex]; + } + else + { + *qBit = ( toc & 0x10 ) != 0; + *bitrate = AMRWB_IOmode2rate[*frameTypeIndex]; + } +} + + +bool evsHeaderFullPayload_unpackFrame( char *payload, uint16_t payloadSizeBytes, uint16_t frameIndex, bool *isAMRWB_IOmode, bool *frameFollowing, uint16_t *frameTypeIndex, bool *qBit, unsigned char **frame, uint16_t *frameSizeInBits ) +{ + bool someIsAMRWB_IOmode, someFrameFollowing = true, someQBit; + uint16_t someFrameTypeIndex, someFrameSizeInBits; + int32_t bitrate; + uint16_t iFrame; + if ( payloadSizeBytes < 1 ) + { + fprintf( stderr, "Error: payload too small to parse ToC\n" ); + return false; + } + /* skip CMR */ + if ( *payload & 0x80 ) + { + ++payload; + --payloadSizeBytes; + } + /* parse all ToC entries */ + *frame = (unsigned char *) payload; /* no need to copy frame bytes */ + for ( iFrame = 0; someFrameFollowing; ++iFrame ) + { + if ( (int16_t) payloadSizeBytes <= 0 ) + { + fprintf( stderr, "Error: payload too small\n" ); + return false; + } + if ( *payload & 0x80 ) + { + fprintf( stderr, "Error: expected ToC, found CMR\n" ); + return false; + } + evsHeaderFullPayload_parseToc( *payload, &someIsAMRWB_IOmode, &someFrameFollowing, &someFrameTypeIndex, &someQBit, &bitrate ); + if ( bitrate < 0 ) + { + fprintf( stderr, "Error: unexpected frameTypeIndex in ToC\n" ); + return false; + } + ++payload; + ++*frame; + someFrameSizeInBits = (uint16_t) ( bitrate / 50 ); + /* just keep/copy zero padding bits + * in case of AMRWB_IO_SID the STI bit and CMI bits following the SID_1k75 frame are also kept (A.2.2.1.3) */ + payloadSizeBytes -= 1 + ( someFrameSizeInBits + 7 ) / 8; + if ( iFrame < frameIndex ) + { + *frame += ( someFrameSizeInBits + 7 ) / 8; + if ( !someFrameFollowing ) + { + fprintf( stderr, "Error: expected ToC with F bit set\n" ); + return false; + } + } + else if ( iFrame == frameIndex ) + { + *isAMRWB_IOmode = someIsAMRWB_IOmode; + *frameFollowing = someFrameFollowing; + *frameTypeIndex = someFrameTypeIndex; + *qBit = someQBit; + *frameSizeInBits = someFrameSizeInBits; + } + if ( (int16_t) payloadSizeBytes < 0 ) + { + fprintf( stderr, "Error: payload too small for frame %u data\n", frameIndex ); + return false; + } + } + return true; +} + +EVS_RTPDUMP_DEPACKER_ERROR EVS_RTPDUMP_DEPACKER_open( EVS_RTPDUMP_DEPACKER *self, FILE *file, bool hf_only ) +{ + RTPDUMP_ERROR rtpdumpError; + self->hf_only = hf_only; + self->frameFollowing = false; + rtpdumpError = RTPDUMP_OpenWithFileToRead( &self->rtpdump, file ); + if ( rtpdumpError != RTPDUMP_NO_ERROR ) + { + return EVS_RTPDUMP_DEPACKER_RTPDUMP_ERROR; + } + return EVS_RTPDUMP_DEPACKER_NO_ERROR; +} + +EVS_RTPDUMP_DEPACKER_ERROR EVS_RTPDUMP_DEPACKER_readNextFrame( + EVS_RTPDUMP_DEPACKER *self, + uint16_t *rtpSequenceNumber, + uint32_t *rtpTimeStamp, + uint32_t *rcvTime_ms, + bool *isAMRWB_IOmode, + uint16_t *frameTypeIndex, + bool *qBit, + unsigned char **frame, + uint16_t *frameSizeBits ) +{ + /* read next RTP packet from rtpdump */ + if ( !self->frameFollowing ) + { + RTPDUMP_ERROR rtpdumpError = RTPDUMP_ReadPacket( self->rtpdump, &self->rtpPacket, &self->timeoffset_ms ); + if ( rtpdumpError == RTPDUMP_READ_ENDOFFILE ) + { + return EVS_RTPDUMP_DEPACKER_EOF; + } + else if ( rtpdumpError != RTPDUMP_NO_ERROR ) + { + return EVS_RTPDUMP_DEPACKER_RTPDUMP_ERROR; + } + self->frameIndex = 0; + } + /* unpack next frame from RTP packet */ + if ( !evsPayload_unpackFrame( self->hf_only, self->rtpPacket.data + self->rtpPacket.headerSize, + self->rtpPacket.payloadSize, self->frameIndex, + isAMRWB_IOmode, &self->frameFollowing, frameTypeIndex, qBit, + frame, frameSizeBits ) ) + { + return EVS_RTPDUMP_DEPACKER_PAYLOAD_ERROR; + } + /* return frame */ + *rtpSequenceNumber = self->rtpPacket.sequenceNumber; + *rtpTimeStamp = self->rtpPacket.timeStamp + self->frameIndex * 16000 / 50; + *rcvTime_ms = self->timeoffset_ms; + ++self->frameIndex; + return EVS_RTPDUMP_DEPACKER_NO_ERROR; +} + +void EVS_RTPDUMP_DEPACKER_close( EVS_RTPDUMP_DEPACKER *self ) +{ + if ( !self ) + { + return; + } + RTPDUMP_Close( &self->rtpdump, 0 ); +} diff --git a/lib_util/evs_rtp_payload.h b/lib_util/evs_rtp_payload.h new file mode 100644 index 0000000000000000000000000000000000000000..dac5fb0e35cfee6fca7fc2402b75bf6ae94c0f42 --- /dev/null +++ b/lib_util/evs_rtp_payload.h @@ -0,0 +1,201 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#pragma once +#include +#include +#include +#include "rtpdump.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + + static const int32_t AMRWB_IOmode2rate[16] = { + 6600, /* AMRWB_IO_6600 */ + 8850, /* AMRWB_IO_8850 */ + 12650, /* AMRWB_IO_1265 */ + 14250, /* AMRWB_IO_1425 */ + 15850, /* AMRWB_IO_1585 */ + 18250, /* AMRWB_IO_1825 */ + 19850, /* AMRWB_IO_1985 */ + 23050, /* AMRWB_IO_2305 */ + 23850, /* AMRWB_IO_2385 */ + 1750, /* AMRWB_IO_SID: SID_1k75 followed by STI bit and CMI bits (A.2.2.1.3) */ + -1, /* AMRWB_IO_FUT1 */ + -1, /* AMRWB_IO_FUT2 */ + -1, /* AMRWB_IO_FUT3 */ + -1, /* AMRWB_IO_FUT4 */ + 0, /* SPEECH_LOST */ + 0 /* NO_DATA */ + }; + + static const int32_t PRIMARYmode2rate[16] = { + 2800, /* PRIMARY_2800 */ + 7200, /* PRIMARY_7200 */ + 8000, /* PRIMARY_8000 */ + 9600, /* PRIMARY_9600 */ + 13200, /* PRIMARY_13200 */ + 16400, /* PRIMARY_16400 */ + 24400, /* PRIMARY_24400 */ + 32000, /* PRIMARY_32000 */ + 48000, /* PRIMARY_48000 */ + 64000, /* PRIMARY_64000 */ + 96000, /* PRIMARY_96000 */ + 128000, /* PRIMARY_128000 */ + 2400, /* PRIMARY_SID */ + -1, /* PRIMARY_FUT1 */ + 0, /* SPEECH_LOST */ + 0 /* NO_DATA */ + }; + + static const uint16_t evsPayloadProtectedSizes[22] = { + 48, + 56, + 136, + 144, + 160, + 184, + 192, + 256, + 264, + 288, + 320, + 328, + 368, + 400, + 464, + 480, + 488, + 640, + 960, + 1280, + 1920, + 2560 + }; + + static const bool evsPayloadProtectedSizes_isAMRWB_IOmode[22] = { + 0, + 0, /* Special case (see clause A.2.1.3) */ + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + }; + + static const uint16_t evsPayloadProtectedSizes_frameTypeIndex[22] = { + 12, /* PRIMARY_SID */ + 0, /* Special case (see clause A.2.1.3) */ + 0, /* AMRWB_IO_6600 */ + 1, /* PRIMARY_7200 */ + 2, /* PRIMARY_8000 */ + 1, /* AMRWB_IO_8850 */ + 3, /* PRIMARY_9600 */ + 2, /* AMRWB_IO_1265 */ + 4, /* PRIMARY_13200 */ + 3, /* AMRWB_IO_1425 */ + 4, /* AMRWB_IO_1585 */ + 5, /* PRIMARY_16400 */ + 5, /* AMRWB_IO_1825 */ + 6, /* AMRWB_IO_1985 */ + 7, /* AMRWB_IO_2305 */ + 8, /* AMRWB_IO_2385 */ + 6, /* PRIMARY_24400 */ + 7, /* PRIMARY_32000 */ + 8, /* PRIMARY_48000 */ + 9, /* PRIMARY_64000 */ + 10, /* PRIMARY_96000 */ + 11 /* PRIMARY_128000 */ + }; + + bool evsPayload_unpackFrame( bool hf_only, char *payload, uint16_t payloadSizeBytes, uint16_t frameIndex, bool *isAMRWB_IOmode, bool *frameFollowing, uint16_t *frameTypeIndex, bool *qBit, unsigned char **framePtr, uint16_t *frameSizeBits ); + + + bool evsHeaderFullPayload_unpackFrame( char *payload, uint16_t payloadSizeBytes, uint16_t frameIndex, bool *isAMRWB_IOmode, bool *frameFollowing, uint16_t *frameTypeIndex, bool *qBit, unsigned char **frame, uint16_t *frameSizeBits ); + + typedef struct + { + RTPDUMP_HANDLE rtpdump; + bool hf_only; + RTPDUMP_RTPPACKET rtpPacket; + uint32_t timeoffset_ms; + uint16_t frameIndex; + bool frameFollowing; + } EVS_RTPDUMP_DEPACKER; + + typedef enum + { + EVS_RTPDUMP_DEPACKER_NO_ERROR = 0, + EVS_RTPDUMP_DEPACKER_EOF = -1, + EVS_RTPDUMP_DEPACKER_RTPDUMP_ERROR = 1, + EVS_RTPDUMP_DEPACKER_PAYLOAD_ERROR + } EVS_RTPDUMP_DEPACKER_ERROR; + + EVS_RTPDUMP_DEPACKER_ERROR EVS_RTPDUMP_DEPACKER_open( EVS_RTPDUMP_DEPACKER *self, FILE *file, bool hf_only ); + + EVS_RTPDUMP_DEPACKER_ERROR EVS_RTPDUMP_DEPACKER_readNextFrame( + EVS_RTPDUMP_DEPACKER *self, + uint16_t *rtpSequenceNumber, + uint32_t *rtpTimeStamp, + uint32_t *rcvTime_ms, + bool *isAMRWB_IOmode, + uint16_t *frameTypeIndex, + bool *qBit, + unsigned char **frame, + uint16_t *frameSizeBits ); + + void EVS_RTPDUMP_DEPACKER_close( EVS_RTPDUMP_DEPACKER *self ); + +#ifdef __cplusplus +} +#endif diff --git a/lib_util/g192.c b/lib_util/g192.c new file mode 100644 index 0000000000000000000000000000000000000000..04ba16c369a2d556562544186b70cc23ddab3b27 --- /dev/null +++ b/lib_util/g192.c @@ -0,0 +1,552 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include "g192.h" +#include +#include +#include +#ifndef _WIN32 +#include +#include +#else +#include +#endif + + +/*-----------------------------------------------------------------------* + * Constants + *-----------------------------------------------------------------------*/ + +#define G192_SYNC_GOOD_FRAME (uint16_t) 0x6B21 +#define G192_SYNC_BAD_FRAME (uint16_t) 0x6B20 +#define G192_BIT0 (uint16_t) 0x007F +#define G192_BIT1 (uint16_t) 0x0081 +#define RTP_HEADER_PART1 (int16_t) 22 /* magic number by network simulator */ + + +/*-----------------------------------------------------------------------* + * Structures + *-----------------------------------------------------------------------*/ + +/* main handle */ +struct __G192 +{ + FILE *file; + int16_t ownFileHandle; /* flag whether FILE handle created by instance or externally */ +}; + + +/*-----------------------------------------------------------------------* + * Functions + *-----------------------------------------------------------------------*/ + + +G192_ERROR G192_Reader_Open_filename( + G192_HANDLE *phG192, + const char *filename ) +{ + /* create handle */ + *phG192 = (G192_HANDLE) calloc( 1, sizeof( struct __G192 ) ); + if ( !phG192 ) + { + return G192_MEMORY_ERROR; + } + memset( *phG192, 0, sizeof( struct __G192 ) ); + + /* open file stream */ + ( *phG192 )->file = fopen( filename, "rb" ); + if ( ( *phG192 )->file == NULL ) + { + G192_Reader_Close( phG192 ); + return G192_FILE_NOT_FOUND; + } + ( *phG192 )->ownFileHandle = 1; + + return G192_NO_ERROR; +} + + +G192_ERROR G192_Reader_Rewind( + G192_HANDLE const hG192 ) +{ + if ( !hG192 || !hG192->file ) + { + return G192_NOT_INITIALIZED; + } + rewind( hG192->file ); + + return G192_NO_ERROR; +} + + +G192_ERROR G192_ReadFrame_compact( + G192_HANDLE const hG192, + unsigned char *const serial, + int16_t *const num_bits, + int16_t *const bfi ) +{ + uint16_t short_serial[IVAS_MAX_BITS_PER_FRAME]; + G192_ERROR err; + int16_t i; + + err = G192_ReadFrame_short( hG192, short_serial, num_bits, bfi ); + + for ( i = 0; i < *num_bits; i++ ) + { + unsigned char bit = ( short_serial[i] == G192_BIT1 ) ? 1 : 0; + unsigned char bitinbyte = bit << ( 7 - ( i & 0x7 ) ); + if ( !( i & 0x7 ) ) + { + serial[i >> 3] = 0; + } + serial[i >> 3] |= bitinbyte; + } + + return err; +} + + +G192_ERROR G192_ReadVoipFrame_compact( + G192_HANDLE const hG192, + unsigned char *const serial, + int16_t *const num_bits, + uint16_t *const rtpSequenceNumber, + uint32_t *const rtpTimeStamp, + uint32_t *const rcvTime_ms ) +{ + int16_t short_serial[IVAS_MAX_BITS_PER_FRAME]; + G192_ERROR err; + int16_t i; + + err = G192_ReadVoipFrame_short( hG192, short_serial, num_bits, rtpSequenceNumber, rtpTimeStamp, rcvTime_ms ); + if ( err != G192_NO_ERROR ) + { + return err; + } + + for ( i = 0; i < *num_bits; i++ ) + { + uint8_t bit = ( short_serial[i] == G192_BIT1 ) ? 1 : 0; + uint8_t bitinbyte = bit << ( 7 - ( i & 0x7 ) ); + if ( !( i & 0x7 ) ) + { + serial[i >> 3] = 0; + } + serial[i >> 3] |= bitinbyte; + } + + return G192_NO_ERROR; +} + + +G192_ERROR G192_ReadFrame_short( + G192_HANDLE const hG192, + uint16_t *const serial, + int16_t *const num_bits, + int16_t *const bfi ) +{ + uint16_t G192_SYNC_WORD; + if ( num_bits ) + { + *num_bits = 0; + } + + if ( fread( &G192_SYNC_WORD, sizeof( uint16_t ), 1, hG192->file ) != 1 ) + { + if ( feof( hG192->file ) != 0 ) + { + return G192_EOF; + } + return G192_READ_ERROR; + } + else + { + if ( ( G192_SYNC_WORD != G192_SYNC_GOOD_FRAME ) && ( G192_SYNC_WORD != G192_SYNC_BAD_FRAME ) ) + { + fprintf( stderr, "\n Invalid bitstream. Wrong G192_SYNC_WORD\n " ); + return G192_READ_ERROR; + } + else + { + int16_t i; + if ( G192_SYNC_WORD == G192_SYNC_BAD_FRAME ) + { + *bfi = 1; + } + else + { + *bfi = 0; + } + + if ( fread( num_bits, sizeof( int16_t ), 1, hG192->file ) != 1 ) + { + fprintf( stderr, "\n Premature end of file, cannot read frame length " ); + return G192_READ_ERROR; + } + + if ( *num_bits > IVAS_MAX_BITS_PER_FRAME ) + { + fprintf( stderr, "\n Frame is too large " ); + return G192_READ_ERROR; + } + + if ( fread( serial, sizeof( int16_t ), *num_bits, hG192->file ) != (uint16_t) *num_bits ) + { + fprintf( stderr, "\n Premature end of file, cannot read frame" ); + return G192_READ_ERROR; + } + + /* convert from G.192 representation to binary, i.e. from 0x007F to 0x0 and from 0x0081 to 0x1 */ + for ( i = 0; i < (int16_t) *num_bits; ++i ) + { + serial[i] = ( serial[i] == G192_BIT1 ? 1 : 0 ); + } + + /* pad extra bytes (2 bytes required for EVS, 4 for IVAS) for arithmetic decoder flush */ + if ( *num_bits > 0 ) + { + for ( ; i < *num_bits + ( 8 * 4 ); ++i ) + { + serial[i] = 0; + } + } + } + } + + return ( G192_NO_ERROR ); +} + + +G192_ERROR G192_ReadVoipFrame_short( + G192_HANDLE const hG192, + int16_t *const serial, + int16_t *const num_bits, + uint16_t *const rtpSequenceNumber, + uint32_t *const rtpTimeStamp, + uint32_t *const rcvTime_ms ) +{ + uint32_t rtpPacketSize; + uint16_t rtpPacketHeaderPart1; + uint32_t ssrc; + uint16_t rtpPayloadG192[2]; + uint16_t rtpPayloadSize; + + /* RTP packet size */ + if ( fread( &rtpPacketSize, sizeof( rtpPacketSize ), 1, hG192->file ) != 1 ) + { + if ( feof( hG192->file ) != 0 ) + { + return G192_EOF; + } + fprintf( stderr, "RTP Packet Size could't be read\n" ); + + return G192_READ_ERROR; + } + + if ( rtpPacketSize <= 12 ) + { + fprintf( stderr, "RTP Packet size too small: %ud\n", rtpPacketSize ); + return G192_INVALID_DATA; + } + + /* RTP packet arrival time */ + if ( fread( rcvTime_ms, sizeof( *rcvTime_ms ), 1, hG192->file ) != 1 ) + { + if ( feof( hG192->file ) != 0 ) + { + return G192_EOF; + } + fprintf( stderr, "Reception Time in ms could't be read\n" ); + + return G192_READ_ERROR; + } + + /* RTP packet header (part without sequence number) */ + if ( fread( &rtpPacketHeaderPart1, sizeof( rtpPacketHeaderPart1 ), 1, hG192->file ) != 1 ) + { + if ( feof( hG192->file ) != 0 ) + { + return G192_EOF; + } + fprintf( stderr, "RTP Header couldn't be read\n" ); + + return G192_READ_ERROR; + } + + if ( rtpPacketHeaderPart1 != RTP_HEADER_PART1 ) + { + fprintf( stderr, "Unexpected RTP Packet header\n" ); + + return G192_INVALID_DATA; + } + + /* RTP sequence number */ + if ( fread( rtpSequenceNumber, sizeof( *rtpSequenceNumber ), 1, hG192->file ) != 1 ) + { + if ( feof( hG192->file ) != 0 ) + { + return G192_EOF; + } + fprintf( stderr, "RTP Sequence Number be read\n" ); + + return G192_READ_ERROR; + } + + *rtpSequenceNumber = ntohs( *rtpSequenceNumber ); + + /* RTP timestamp */ + if ( fread( rtpTimeStamp, sizeof( *rtpTimeStamp ), 1, hG192->file ) != 1 ) + { + if ( feof( hG192->file ) != 0 ) + { + return G192_EOF; + } + fprintf( stderr, "RTP Timestamp could't be read\n" ); + + return G192_READ_ERROR; + } + + *rtpTimeStamp = ntohl( *rtpTimeStamp ); + + /* RTP ssrc */ + if ( fread( &ssrc, sizeof( ssrc ), 1, hG192->file ) != 1 ) + { + if ( feof( hG192->file ) != 0 ) + { + return G192_EOF; + } + fprintf( stderr, "RTP SSRC could't be read\n" ); + + return G192_READ_ERROR; + } + + /* RTP payload size */ + rtpPayloadSize = (uint16_t) rtpPacketSize - 12; + if ( rtpPayloadSize <= 2 ) + { + fprintf( stderr, "RTP payload size too small: %u\n", rtpPayloadSize ); + return G192_INVALID_DATA; + } + + /* RTP payload */ + if ( fread( rtpPayloadG192, sizeof( int16_t ), 2, hG192->file ) != 2 ) + { + if ( feof( hG192->file ) != 0 ) + { + return G192_EOF; + } + + fprintf( stderr, "Premature end of file, cannot read G.192 header\n" ); + return G192_READ_ERROR; + } + + if ( rtpPayloadG192[0] != G192_SYNC_GOOD_FRAME ) + { + fprintf( stderr, "G192_SYNC_WORD missing from RTP payload!" ); + return G192_INVALID_DATA; + } + + *num_bits = rtpPayloadG192[1]; + if ( *num_bits == 0u || *num_bits + 2u != rtpPayloadSize || *num_bits > IVAS_MAX_BITS_PER_FRAME ) + { + fprintf( stderr, "error in parsing RTP payload: rtpPayloadSize=%u nBits=%d", rtpPayloadSize, *num_bits ); + return G192_INVALID_DATA; + } + + if ( fread( serial, sizeof( int16_t ), *num_bits, hG192->file ) != (uint16_t) *num_bits ) + { + fprintf( stderr, "Premature end of file, cannot read G.192 payload\n" ); + return G192_READ_ERROR; + } + + return G192_NO_ERROR; +} + + +G192_ERROR G192_Reader_Close( + G192_HANDLE *phG192 ) +{ + if ( phG192 == NULL || *phG192 == NULL ) + { + return G192_NO_ERROR; + } + + if ( ( *phG192 )->file && ( *phG192 )->ownFileHandle ) + { + fclose( ( *phG192 )->file ); + } + + free( *phG192 ); + *phG192 = NULL; + phG192 = NULL; + + return G192_NO_ERROR; +} + + +G192_ERROR G192_Writer_Open_filename( + G192_HANDLE *phG192, + const char *filename ) +{ + /* create handle */ + *phG192 = (G192_HANDLE) calloc( 1, sizeof( struct __G192 ) ); + if ( !phG192 ) + { + return G192_MEMORY_ERROR; + } + + /* open file stream */ + ( *phG192 )->file = fopen( filename, "wb" ); + if ( ( *phG192 )->file == NULL ) + { + free( *phG192 ); + *phG192 = NULL; + return G192_FILE_NOT_FOUND; + } + ( *phG192 )->ownFileHandle = 1; + + return G192_NO_ERROR; +} + + +G192_ERROR G192_WriteFrame( + G192_HANDLE const hG192, + const uint16_t *serial, + const int16_t numBits ) +{ + uint16_t G192_HEADER[2], G192_DATA[IVAS_MAX_BITS_PER_FRAME]; + uint16_t i, bit; + + assert( numBits <= IVAS_MAX_BITS_PER_FRAME ); + + G192_HEADER[0] = G192_SYNC_GOOD_FRAME; + G192_HEADER[1] = numBits; /* Frame Length */ + fwrite( G192_HEADER, sizeof( uint16_t ), 2, hG192->file ); + + for ( i = 0; i < numBits; i++ ) + { + bit = serial[i]; + if ( bit == 0 ) + { + G192_DATA[i] = G192_BIT0; + } + else if ( bit == 1 ) + { + G192_DATA[i] = G192_BIT1; + } + else + { + return G192_WRITE_ERROR; + } + } + fwrite( G192_DATA, sizeof( uint16_t ), numBits, hG192->file ); + + return G192_NO_ERROR; +} + + +G192_ERROR G192_WriteVoipFrame_short( + G192_HANDLE const hG192, + const uint16_t *serial, + const int16_t numBits, + uint16_t const rtpSequenceNumber, + uint16_t const rtpTimeStamp, + uint32_t const rcvTime_ms ) +{ + int16_t G192_HEADER[2], G192_DATA[IVAS_MAX_BITS_PER_FRAME]; + int16_t i, bit; + + uint32_t rtpPacketSize = numBits + 12 + 2; + uint16_t rtpPacketHeaderPart1 = RTP_HEADER_PART1; + uint32_t ssrc = 0; + uint16_t rtpSequenceNumber_2 = htons( rtpSequenceNumber ); + uint32_t rtpTimeStamp_2 = htonl( rtpTimeStamp ); + uint16_t ssrc_2 = (uint16_t) htonl( ssrc ); + + assert( numBits <= IVAS_MAX_BITS_PER_FRAME ); + + fwrite( &rtpPacketSize, sizeof( rtpPacketSize ), 1, hG192->file ); + fwrite( &rcvTime_ms, sizeof( rcvTime_ms ), 1, hG192->file ); + fwrite( &rtpPacketHeaderPart1, sizeof( rtpPacketHeaderPart1 ), 1, hG192->file ); + fwrite( &rtpSequenceNumber_2, sizeof( rtpSequenceNumber ), 1, hG192->file ); + fwrite( &rtpTimeStamp_2, sizeof( rtpTimeStamp ), 1, hG192->file ); + fwrite( &ssrc_2, sizeof( ssrc ), 1, hG192->file ); + + G192_HEADER[0] = 0x6b21; + G192_HEADER[1] = numBits; + + fwrite( G192_HEADER, sizeof( int16_t ), 2, hG192->file ); + for ( i = 0; i < numBits; i++ ) + { + bit = serial[i]; + if ( bit == 0 ) + { + G192_DATA[i] = G192_BIT0; + } + else if ( bit == 1 ) + { + G192_DATA[i] = G192_BIT1; + } + else + { + return G192_WRITE_ERROR; + } + } + fwrite( G192_DATA, sizeof( int16_t ), numBits, hG192->file ); + + return G192_NO_ERROR; +} + + +G192_ERROR G192_Writer_Close( + G192_HANDLE *phG192 ) +{ + if ( phG192 == NULL || *phG192 == NULL ) + { + return G192_NO_ERROR; + } + + if ( ( *phG192 )->file ) + { + fclose( ( *phG192 )->file ); + } + + free( *phG192 ); + *phG192 = NULL; + phG192 = NULL; + + return G192_NO_ERROR; +} diff --git a/lib_util/g192.h b/lib_util/g192.h new file mode 100644 index 0000000000000000000000000000000000000000..9e5e56d223c4a350b9e7f6d1775c6c3364101ef0 --- /dev/null +++ b/lib_util/g192.h @@ -0,0 +1,100 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#ifndef G192_H +#define G192_H G192_H + +#include "common_api_types.h" + + +/*-----------------------------------------------------------------------* + * Enums + *-----------------------------------------------------------------------*/ + +/* error enums */ +typedef enum _G192_ERROR +{ + G192_NO_ERROR = 0x0000, + G192_MEMORY_ERROR = 0x0001, + G192_WRONG_PARAMS = 0x0002, + G192_INIT_ERROR = 0x0003, + G192_WRITE_ERROR = 0x0004, + G192_READ_ERROR = 0x0005, + G192_FILE_NOT_FOUND = 0x0006, + G192_INVALID_DATA = 0x0007, /* error returned when read data is invalid */ + G192_NOT_IMPLEMENTED = 0x0010, + G192_NOT_INITIALIZED = 0x0100, + G192_UNKNOWN_ERROR = 0x1000, + G192_EOF = 0xffff /* EOF during reading */ +} G192_ERROR; + + +/*-----------------------------------------------------------------------* + * Structures + *-----------------------------------------------------------------------*/ + +/* main handle */ +struct __G192; +typedef struct __G192 *G192_HANDLE; + + +/*-----------------------------------------------------------------------* + * Functions + *-----------------------------------------------------------------------*/ + +G192_ERROR G192_Reader_Open_filename( G192_HANDLE *phG192, const char *filename ); + +G192_ERROR G192_Reader_Rewind( G192_HANDLE const hG192 ); + +G192_ERROR G192_ReadFrame_compact( G192_HANDLE const hG192, unsigned char *const serial, int16_t *const num_bits, int16_t *const bfi ); + +G192_ERROR G192_ReadVoipFrame_compact( G192_HANDLE const hG192, unsigned char *const serial, int16_t *const num_bits, uint16_t *const rtpSequenceNumber, uint32_t *const rtpTimeStamp, uint32_t *const rcvTime_ms ); + +G192_ERROR G192_ReadFrame_short( G192_HANDLE const hG192, uint16_t *const serial, int16_t *const num_bits, int16_t *const bfi ); + +G192_ERROR G192_ReadVoipFrame_short( G192_HANDLE const hG192, int16_t *const serial, int16_t *const num_bits, uint16_t *const rtpSequenceNumber, uint32_t *const rtpTimeStamp, uint32_t *const rcvTime_ms ); + +G192_ERROR G192_Reader_Close( G192_HANDLE *phG192 ); + +G192_ERROR G192_Writer_Open_filename( G192_HANDLE *phG192, const char *filename ); + +G192_ERROR G192_WriteFrame( G192_HANDLE const hG192, const uint16_t *serial, const int16_t numBits ); + +G192_ERROR G192_WriteVoipFrame_short( G192_HANDLE const hG192, const uint16_t *serial, const int16_t num_bits, uint16_t const rtpSequenceNumber, uint16_t const rtpTimeStamp, uint32_t const rcvTime_ms ); + +G192_ERROR G192_Writer_Close( G192_HANDLE *phG192 ); + +#endif /* G192_H */ diff --git a/lib_util/hrtf_file_reader.c b/lib_util/hrtf_file_reader.c new file mode 100644 index 0000000000000000000000000000000000000000..650768457954cce72d36277ef0e4f1e228d9e47b --- /dev/null +++ b/lib_util/hrtf_file_reader.c @@ -0,0 +1,1618 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include "hrtf_file_reader.h" +#include +#include "prot.h" +#include "ivas_prot_rend.h" + +#include "ivas_prot.h" + +/*---------------------------------------------------------------------* + * Local structures + *---------------------------------------------------------------------*/ + +struct hrtfFileReader +{ + FILE *file; + char *file_path; +}; + +typedef struct ivas_hrtfs_file_header_t +{ + char identifier[8]; + int32_t file_size; + int16_t nb_hrtf; + int32_t max_data_size; + +} ivas_hrtfs_file_header_t; + + +/*---------------------------------------------------------------------* + * Local constants + *---------------------------------------------------------------------*/ + +#define RESAMPLE_FACTOR_16_48 ( 16.0f / 48.0f ) +#define RESAMPLE_FACTOR_32_48 ( 32.0f / 48.0f ) + +/*---------------------------------------------------------------------* + * Local function declarations + *---------------------------------------------------------------------*/ + +static void HRTF_energy_sections_precalc( ModelParams_t *model ); + +/*---------------------------------------------------------------------* + * hrtfFileReader_open() + * + * Allocates memory for an hrtfFileReader and opens the file at given path for reading. + *---------------------------------------------------------------------*/ + +ivas_error hrtfFileReader_open( + const char *filePath, /* i : path to hrtf binary file */ + hrtfFileReader **hrtfReader /* o : hrtfFileReader handle */ +) +{ + hrtfFileReader *self; + FILE *file; + + if ( !filePath ) + { + return IVAS_ERR_FAILED_FILE_OPEN; + } + + file = fopen( filePath, "rb" ); + + if ( !file ) + { + return IVAS_ERR_FAILED_FILE_OPEN; + } + + self = calloc( sizeof( hrtfFileReader ), 1 ); + self->file = file; + self->file_path = calloc( sizeof( char ), strlen( filePath ) + 1 ); + strcpy( self->file_path, filePath ); + + *hrtfReader = self; + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * hrtfFileReader_close() + * + * De-allocates all underlying memory of an hrtfFileReader. + *---------------------------------------------------------------------*/ + +void hrtfFileReader_close( + hrtfFileReader **hrtfReader /* i/o: pointer to hrtfFileReader handle */ +) +{ + if ( hrtfReader == NULL || *hrtfReader == NULL ) + { + return; + } + + fclose( ( *hrtfReader )->file ); + free( ( *hrtfReader )->file_path ); + free( *hrtfReader ); + *hrtfReader = NULL; + + return; +} + + +/*-------------------------------------------------------------------* + * read_and_check_hrtf_binary_file_header() + * + * Check the HRTF file header read from binary file + --------------------------------------------------------------------*/ + +static ivas_error read_and_check_hrtf_binary_file_header( + ivas_hrtfs_file_header_t *hrtf_file_header, + FILE *f_hrtf ) +{ + int32_t file_size; + + /* [Declaration of the binary file] */ + /* File Identifier (8 bytes) */ + /* Size of file in bytes (4 bytes) */ + /* Number of HRTF (2 bytes) */ + /* Max length of HRTF data (4 bytes) */ + + fseek( f_hrtf, 0, SEEK_END ); + file_size = ftell( f_hrtf ); + fseek( f_hrtf, 0, SEEK_SET ); + + if ( file_size < (int32_t) sizeof( ivas_hrtfs_file_header_t ) ) + { + return IVAS_ERROR( IVAS_ERR_END_OF_FILE, "HRTF binary file not compliant (size of file header)" ); + } + + fread( &( hrtf_file_header->identifier ), 8, 1, f_hrtf ); + if ( strncmp( hrtf_file_header->identifier, "IVASHRTF", 8 ) != 0 ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Header of HRTF binary file not compliant (identifier)" ); + } + + fread( &( hrtf_file_header->file_size ), 4, 1, f_hrtf ); + if ( hrtf_file_header->file_size != file_size ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Header of HRTF binary file not compliant (file size)" ); + } + + fread( &( hrtf_file_header->nb_hrtf ), 2, 1, f_hrtf ); + fread( &( hrtf_file_header->max_data_size ), 4, 1, f_hrtf ); + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * check_hrtf_binary_header() + * + * Check the HRTF section header - read from binary file + --------------------------------------------------------------------*/ + +static ivas_error check_hrtf_binary_header( + ivas_hrtfs_header_t *hrtf_header ) +{ + /* Check the renderer type */ + if ( ( hrtf_header->rend_type != RENDERER_BINAURAL_MIXER_CONV ) && ( hrtf_header->rend_type != RENDERER_BINAURAL_MIXER_CONV_ROOM ) && + ( hrtf_header->rend_type != RENDERER_BINAURAL_FASTCONV ) && ( hrtf_header->rend_type != RENDERER_BINAURAL_FASTCONV_ROOM ) && + ( hrtf_header->rend_type != RENDERER_BINAURAL_PARAMETRIC ) && ( hrtf_header->rend_type != RENDERER_BINAURAL_PARAMETRIC_ROOM ) && + ( hrtf_header->rend_type != RENDERER_BINAURAL_OBJECTS_TD ) ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Header of HRTF binary file not compliant (renderer type)" ); + } + + /* Check the output format of the decoder */ + + if ( ( hrtf_header->input_cfg != BINAURAL_INPUT_AUDIO_CONFIG_COMBINED ) && ( hrtf_header->input_cfg != BINAURAL_INPUT_AUDIO_CONFIG_HOA3 ) && ( hrtf_header->input_cfg != BINAURAL_INPUT_AUDIO_CONFIG_HOA2 ) && ( hrtf_header->input_cfg != BINAURAL_INPUT_AUDIO_CONFIG_FOA ) && ( hrtf_header->input_cfg != BINAURAL_INPUT_AUDIO_CONFIG_UNDEFINED ) ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Header of HRTF binary file not compliant (input audio configuration)" ); + } + + /* Check the sampling frequency */ + if ( ( hrtf_header->frequency != 48000 ) && ( hrtf_header->frequency != 32000 ) && ( hrtf_header->frequency != 16000 ) ) + { + return IVAS_ERROR( IVAS_ERR_INVALID_SAMPLING_RATE, "Header of HRTF binary file not compliant (sampling frequency)" ); + } + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * read_hrtf_binary_header() + * + * Read the HRTF header from binary file + --------------------------------------------------------------------*/ + +static ivas_error read_hrtf_binary_header( + ivas_hrtfs_header_t *hrtf_header, + FILE *f_hrtf ) +{ + /* HRTF Header */ + /* Renderer type (4 bytes) : See "RENDERER_TYPE" */ + /* Input configuration (4 bytes) : See "BINAURAL_INPUT_AUDIO_CONFIG" */ + /* Sampling Frequency (4 bytes) */ + /* Raw data size (4 bytes) */ + + if ( ( fread( &( hrtf_header->rend_type ), sizeof( int32_t ), 1, f_hrtf ) == 1 ) && ( fread( &( hrtf_header->input_cfg ), sizeof( int32_t ), 1, f_hrtf ) == 1 ) && ( fread( &( hrtf_header->frequency ), sizeof( int32_t ), 1, f_hrtf ) == 1 ) && ( fread( &( hrtf_header->data_size ), sizeof( int32_t ), 1, f_hrtf ) == 1 ) ) + { + return IVAS_ERR_OK; + } + + return IVAS_ERR_END_OF_FILE; +} + + +/*-------------------------------------------------------------------* + * LoadBSplineBinaryITD() + * + * Loads the B Spline HR filter model ITD data from file. + --------------------------------------------------------------------*/ + +static void LoadBSplineBinaryITD( + ModelParamsITD_t *modelITD, /* i/o: ITD model parameter structure */ + FILE *f_hrtf /* i : HR filter data file handle */ +) +{ + int16_t tmp; + fread( &modelITD->N, sizeof( int16_t ), 1, f_hrtf ); + fread( &modelITD->elevDim2, sizeof( int16_t ), 1, f_hrtf ); + fread( &modelITD->elevDim3, sizeof( int16_t ), 1, f_hrtf ); + modelITD->elevKSeq_dyn = (float *) malloc( ( modelITD->elevDim3 - 2 ) * sizeof( float ) ); + fread( modelITD->elevKSeq_dyn, sizeof( float ), modelITD->elevDim3 - 2, f_hrtf ); + + fread( &modelITD->azimDim2, sizeof( int16_t ), 1, f_hrtf ); + fread( &modelITD->azimDim3, sizeof( int16_t ), 1, f_hrtf ); + modelITD->azimKSeq_dyn = (float *) malloc( ( ( modelITD->azimDim3 + 1 ) / 2 - 2 ) * sizeof( float ) ); /* basis functions are flipped around 180 deg, number of basis functions above/below is (N+1)/2 */ + fread( modelITD->azimKSeq_dyn, sizeof( float ), ( modelITD->azimDim3 + 1 ) / 2 - 2, f_hrtf ); + + fread( &tmp, sizeof( int16_t ), 1, f_hrtf ); + modelITD->W_dyn = (float *) malloc( tmp * sizeof( float ) ); + fread( modelITD->W_dyn, sizeof( float ), tmp, f_hrtf ); + + /* azimuth */ + fread( modelITD->azimBsLen, sizeof( int16_t ), HRTF_MODEL_BSPLINE_NUM_COEFFS, f_hrtf ); + fread( modelITD->azimBsStart, sizeof( int16_t ), HRTF_MODEL_BSPLINE_NUM_COEFFS, f_hrtf ); + + fread( &tmp, sizeof( int16_t ), 1, f_hrtf ); + + modelITD->azimBsShape_dyn = (float *) malloc( tmp * sizeof( float ) ); + fread( modelITD->azimBsShape_dyn, sizeof( float ), tmp, f_hrtf ); + + fread( &modelITD->azimSegSamples, sizeof( int16_t ), 1, f_hrtf ); + + /* elevation */ + fread( modelITD->elevBsLen, sizeof( int16_t ), HRTF_MODEL_BSPLINE_NUM_COEFFS, f_hrtf ); + fread( modelITD->elevBsStart, sizeof( int16_t ), HRTF_MODEL_BSPLINE_NUM_COEFFS, f_hrtf ); + + fread( &tmp, sizeof( int16_t ), 1, f_hrtf ); + + modelITD->elevBsShape_dyn = (float *) malloc( tmp * sizeof( float ) ); + fread( modelITD->elevBsShape_dyn, sizeof( float ), tmp, f_hrtf ); + + fread( &modelITD->elevSegSamples, sizeof( int16_t ), 1, f_hrtf ); + + modelITD->elevKSeq = (const float *) modelITD->elevKSeq_dyn; + modelITD->azimKSeq = (const float *) modelITD->azimKSeq_dyn; + modelITD->W = (const float *) modelITD->W_dyn; + modelITD->azimBsShape = (const float *) modelITD->azimBsShape_dyn; + modelITD->elevBsShape = (const float *) modelITD->elevBsShape_dyn; + + return; +} + + +/*-------------------------------------------------------------------* + * LoadBSplineBinary() + * + * Loads the B Spline HR filter model data from file. + --------------------------------------------------------------------*/ + +static ivas_error LoadBSplineBinary( + IVAS_DEC_HRTF_HANDLE HrFiltSet_p, /* i/o: HR filter model parameter structure */ + FILE *f_hrtf /* i : HR filter data file handle */ +) +{ + ModelParams_t *model; + int16_t i, tmp; + + fread( &HrFiltSet_p->latency_s, sizeof( float ), 1, f_hrtf ); + + model = &( HrFiltSet_p->ModelParams ); + + /* Set ROM flag for correct deallocation */ + model->modelROM = FALSE; + + fread( &model->UseItdModel, sizeof( int16_t ), 1, f_hrtf ); /* Indicates if ITD model is active */ + fread( &tmp, sizeof( int16_t ), 1, f_hrtf ); + + switch ( tmp ) + { + case 16: + HrFiltSet_p->SampleRate = 16000; + if ( HrFiltSet_p->ModelParams.UseItdModel ) + { + HrFiltSet_p->ModelParamsITD.resamp_factor = RESAMPLE_FACTOR_16_48; + } + break; + case 32: + HrFiltSet_p->SampleRate = 32000; + if ( HrFiltSet_p->ModelParams.UseItdModel ) + { + HrFiltSet_p->ModelParamsITD.resamp_factor = RESAMPLE_FACTOR_32_48; + } + break; + case 48: + HrFiltSet_p->SampleRate = 48000; + if ( HrFiltSet_p->ModelParams.UseItdModel ) + { + HrFiltSet_p->ModelParamsITD.resamp_factor = 1.0f; + } + break; + default: + return IVAS_ERROR( IVAS_ERR_INVALID_HRTF, "Error: HR filter file had an unsupported sampling rate (%d kHz)", tmp ); + } + + fread( &model->SplineDegree, sizeof( int16_t ), 1, f_hrtf ); + fread( &model->K, sizeof( int16_t ), 1, f_hrtf ); + + fread( &model->elevDim2, sizeof( int16_t ), 1, f_hrtf ); + fread( &model->elevDim3, sizeof( int16_t ), 1, f_hrtf ); + model->elevKSeq_dyn = (float *) malloc( ( model->elevDim3 - 2 ) * sizeof( float ) ); + fread( model->elevKSeq_dyn, sizeof( float ), model->elevDim3 - 2, f_hrtf ); + model->azimDim2_dyn = (int16_t *) malloc( model->elevDim3 * sizeof( int16_t ) ); + model->azimDim3_dyn = (int16_t *) malloc( model->elevDim3 * sizeof( int16_t ) ); + model->azim_start_idx_dyn = (int16_t *) malloc( model->elevDim3 * sizeof( int16_t ) ); + model->azimKSeq = (float **) malloc( model->elevDim3 * sizeof( float * ) ); + for ( i = 0; i < model->elevDim3; i++ ) + { + fread( &model->azimDim2_dyn[i], sizeof( int16_t ), 1, f_hrtf ); + fread( &model->azimDim3_dyn[i], sizeof( int16_t ), 1, f_hrtf ); + fread( &model->azim_start_idx_dyn[i], sizeof( int16_t ), 1, f_hrtf ); + model->azimKSeq[i] = (float *) malloc( ( model->azimDim3_dyn[i] + 1 ) * sizeof( float ) ); + fread( model->azimKSeq[i], sizeof( float ), ( model->azimDim3_dyn[i] + 1 ), f_hrtf ); + } + fread( &model->AlphaN, sizeof( int16_t ), 1, f_hrtf ); + + model->AlphaL_dyn = (float *) malloc( model->AlphaN * model->K * sizeof( float ) ); + fread( model->AlphaL_dyn, sizeof( float ), model->AlphaN * model->K, f_hrtf ); + + model->AlphaR_dyn = (float *) malloc( model->AlphaN * model->K * sizeof( float ) ); + fread( model->AlphaR_dyn, sizeof( float ), model->AlphaN * model->K, f_hrtf ); + + /* azimuth */ + fread( &model->num_unique_azim_splines, sizeof( int16_t ), 1, f_hrtf ); + model->azimBsShape = (const float **) malloc( model->num_unique_azim_splines * sizeof( float * ) ); + model->azimBsShape_dyn = (float **) malloc( model->num_unique_azim_splines * sizeof( float * ) ); + model->azimSegSamples_dyn = (int16_t *) malloc( model->num_unique_azim_splines * sizeof( int16_t ) ); + for ( i = 0; i < model->num_unique_azim_splines; i++ ) + { + fread( &tmp, sizeof( int16_t ), 1, f_hrtf ); + model->azimBsShape_dyn[i] = (float *) malloc( tmp * sizeof( float ) ); + fread( model->azimBsShape_dyn[i], sizeof( float ), tmp, f_hrtf ); + fread( &model->azimSegSamples_dyn[i], sizeof( int16_t ), 1, f_hrtf ); + } + + model->azimShapeIdx_dyn = (int16_t *) malloc( model->elevDim3 * sizeof( int16_t ) ); + fread( model->azimShapeIdx_dyn, sizeof( int16_t ), model->elevDim3, f_hrtf ); + model->azimShapeSampFactor_dyn = (int16_t *) malloc( model->elevDim3 * sizeof( int16_t ) ); + fread( model->azimShapeSampFactor_dyn, sizeof( int16_t ), model->elevDim3, f_hrtf ); + + /* elevation */ + fread( model->elevBsLen, sizeof( int16_t ), HRTF_MODEL_BSPLINE_NUM_COEFFS, f_hrtf ); + fread( model->elevBsStart, sizeof( int16_t ), HRTF_MODEL_BSPLINE_NUM_COEFFS, f_hrtf ); + fread( &tmp, sizeof( int16_t ), 1, f_hrtf ); + model->elevBsShape_dyn = (float *) malloc( tmp * sizeof( float ) ); + fread( model->elevBsShape_dyn, sizeof( float ), tmp, f_hrtf ); + + fread( &model->elevSegSamples, sizeof( int16_t ), 1, f_hrtf ); + + /* Set const pointers */ + model->AlphaL = (const float *) model->AlphaL_dyn; + model->AlphaR = (const float *) model->AlphaR_dyn; + model->EL = (const float *) model->EL_dyn; + model->ER = (const float *) model->ER_dyn; + model->elevBsShape = (const float *) model->elevBsShape_dyn; + model->elevKSeq = (const float *) model->elevKSeq_dyn; + model->azimDim2 = (const int16_t *) model->azimDim2_dyn; + model->azimDim3 = (const int16_t *) model->azimDim3_dyn; + model->azim_start_idx = (const int16_t *) model->azim_start_idx_dyn; + model->azimSegSamples = (const int16_t *) model->azimSegSamples_dyn; + model->azimShapeIdx = (const int16_t *) model->azimShapeIdx_dyn; + model->azimShapeSampFactor = (const int16_t *) model->azimShapeSampFactor_dyn; + + for ( i = 0; i < model->num_unique_azim_splines; i++ ) + { + model->azimBsShape[i] = (const float *) model->azimBsShape_dyn[i]; + } + + HRTF_model_precalc( model ); + HRTF_energy_sections_precalc( model ); + HrFiltSet_p->FiltLength = HrFiltSet_p->ModelParams.K; + + HrFiltSet_p->ModelEval.hrfModL = (float *) malloc( model->K * sizeof( float ) ); + HrFiltSet_p->ModelEval.hrfModR = (float *) malloc( model->K * sizeof( float ) ); + + if ( HrFiltSet_p->ModelParams.UseItdModel ) + { + LoadBSplineBinaryITD( &HrFiltSet_p->ModelParamsITD, f_hrtf ); + } + + /* left/right energy and interaural coherence for late reverb */ + for ( i = 0; i < 3; i++ ) + { + HrFiltSet_p->lr_energy_and_iac_dyn[i] = (float *) malloc( LR_IAC_LENGTH_NR_FC * sizeof( float ) ); + fread( HrFiltSet_p->lr_energy_and_iac_dyn[i], sizeof( const float ), LR_IAC_LENGTH_NR_FC, f_hrtf ); + HrFiltSet_p->lr_energy_and_iac[i] = (const float *) HrFiltSet_p->lr_energy_and_iac_dyn[i]; + } + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * TDREND_MIX_LoadHRTF() + * + * Load HRTF model or table from file + --------------------------------------------------------------------*/ + +static ivas_error TDREND_MIX_LoadHRTF( + FILE *f_hrtf, /* i/o: File pointer to HRTF file */ + IVAS_DEC_HRTF_HANDLE HrFiltSet_p /* o : Loaded HR filter set */ +) +{ + int16_t tmp; + ivas_error error; + bool is_tdrend; + ivas_error header_check_result; + ivas_hrtfs_file_header_t hrtfs_file_header; + int16_t hrtf_id; + ivas_hrtfs_header_t hrtf_header; + int32_t hrtf_data_size_max; + char *hrtf_data; + + error = IVAS_ERR_OK; + + + if ( ( header_check_result = read_and_check_hrtf_binary_file_header( &hrtfs_file_header, f_hrtf ) ) != IVAS_ERR_OK ) + { + return header_check_result; + } + + is_tdrend = FALSE; + hrtf_data_size_max = hrtfs_file_header.max_data_size; + + /* Allocate the memory */ + + if ( hrtf_data_size_max == 0 ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (hrtf_data_size_max)" ); + } + + hrtf_data = (char *) malloc( hrtf_data_size_max ); + if ( hrtf_data == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } + + for ( hrtf_id = 0; ( hrtf_id < hrtfs_file_header.nb_hrtf ) && ( !is_tdrend ); hrtf_id++ ) + { + if ( read_hrtf_binary_header( &hrtf_header, f_hrtf ) != IVAS_ERR_OK ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_FILE_READ, "HRTF binary file not compliant (number of HRTF)" ); + } + + if ( ( header_check_result = check_hrtf_binary_header( &hrtf_header ) ) != IVAS_ERR_OK ) + { + return header_check_result; + } + + is_tdrend = ( hrtf_header.rend_type == RENDERER_BINAURAL_OBJECTS_TD ); + if ( !is_tdrend ) + { + if ( fread( hrtf_data, 1, hrtf_header.data_size, f_hrtf ) != hrtf_header.data_size ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_FILE_READ, "Error in HRTF file reading" ); + } + } + } + + free( hrtf_data ); + + if ( is_tdrend ) + { + if ( fread( &tmp, 1, sizeof( int16_t ), f_hrtf ) == 0 ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_FILE_READ, "Error in HRTF file reading" ); + } + + HrFiltSet_p->FilterMethod = (TDREND_HRFILT_Method_t) tmp; + + if ( HrFiltSet_p->FilterMethod != TDREND_HRFILT_Method_BSplineModel ) + { + error = IVAS_ERROR( IVAS_ERR_INVALID_HRTF, "The HR filter set file is not a supported type." ); + } + else + { + error = LoadBSplineBinary( HrFiltSet_p, f_hrtf ); + } + } + else + { + return IVAS_ERROR( IVAS_ERR_INVALID_HRTF, "HR filter not found in binary file." ); + } + + return error; +} + + +/*---------------------------------------------------------------------* + * load_HRTF_binary() + * + * Load HRTF binary data into the HRTF handle + *---------------------------------------------------------------------*/ + +ivas_error load_HRTF_binary( + IVAS_DEC_HRTF_HANDLE hHrtf, /* i/o: HRTF handle */ + const hrtfFileReader *hrtfReader /* i/o: pointer to hrtfFileReader handle */ +) +{ + ivas_error error; + + fseek( hrtfReader->file, 0, SEEK_SET ); + + error = TDREND_MIX_LoadHRTF( hrtfReader->file, hHrtf ); + + return error; +} + +/*---------------------------------------------------------------------* + * HRTF_energy_sections_precalc() + * + * Calculate energies of each section and store in model->EL/model->ER + *---------------------------------------------------------------------*/ + +static void HRTF_energy_sections_precalc( + ModelParams_t *model /* i/o: HRTF model parameters */ +) +{ + int16_t i, k, j; + float *pEL; + float *pER; + const float *pAlphaL; + const float *pAlphaR; + float tmp; + int16_t AlphaN; + + if ( !model->modelROM ) + { + AlphaN = model->AlphaN; + + /* Precalculated energies for each section and each row of the alpha matrices */ + model->EL_dyn = (float *) malloc( HRTF_MODEL_N_SECTIONS * AlphaN * sizeof( float ) ); + model->ER_dyn = (float *) malloc( HRTF_MODEL_N_SECTIONS * AlphaN * sizeof( float ) ); + pEL = model->EL_dyn; + pER = model->ER_dyn; + for ( i = 0; i < HRTF_MODEL_N_SECTIONS; i++ ) + { + for ( j = 0; j < AlphaN; j++ ) /* rows of Alpha matrices */ + { + *pEL = 0.0f; + *pER = 0.0f; + + pAlphaL = &model->AlphaL[model->iSecFirst[i] * AlphaN + j]; + pAlphaR = &model->AlphaR[model->iSecFirst[i] * AlphaN + j]; + + for ( k = model->iSecFirst[i]; k < model->iSecLast[i]; k++ ) /* k within the sections */ + { + /* Energy calculation */ + tmp = *pAlphaL; + *pEL += tmp * tmp; + tmp = *pAlphaR; + *pER += tmp * tmp; + pAlphaL += AlphaN; + pAlphaR += AlphaN; + } + pEL++; + pER++; + } + } + model->EL = (const float *) model->EL_dyn; + model->ER = (const float *) model->ER_dyn; + } + + return; +} + + +/*---------------------------------------------------------------------* + * dealloc_HRTF_binary() + * + * Deallocated memory allocated by load_HRTF_binary + *---------------------------------------------------------------------*/ + +ivas_error dealloc_HRTF_binary( + IVAS_DEC_HRTF_HANDLE hHrtf /* i/o: HRTF handle */ +) +{ + int16_t i; + ivas_error error; + error = IVAS_ERR_OK; + + if ( hHrtf == NULL ) + { + return error; + } + + if ( !hHrtf->ModelParams.modelROM ) + { + if ( hHrtf->ModelParams.UseItdModel ) + { + free( hHrtf->ModelParamsITD.elevKSeq_dyn ); + free( hHrtf->ModelParamsITD.azimKSeq_dyn ); + free( hHrtf->ModelParamsITD.W_dyn ); + free( hHrtf->ModelParamsITD.azimBsShape_dyn ); + free( hHrtf->ModelParamsITD.elevBsShape_dyn ); + } + free( hHrtf->ModelParams.elevKSeq_dyn ); + free( hHrtf->ModelParams.azim_start_idx_dyn ); + free( hHrtf->ModelParams.azimDim2_dyn ); + free( hHrtf->ModelParams.azimDim3_dyn ); + free( hHrtf->ModelParams.AlphaL_dyn ); + free( hHrtf->ModelParams.AlphaR_dyn ); + free( hHrtf->ModelParams.azimSegSamples_dyn ); + + free( hHrtf->ModelParams.azimShapeIdx_dyn ); + free( hHrtf->ModelParams.azimShapeSampFactor_dyn ); + free( hHrtf->ModelParams.elevBsShape_dyn ); + + for ( i = 0; i < hHrtf->ModelParams.num_unique_azim_splines; i++ ) + { + free( hHrtf->ModelParams.azimBsShape_dyn[i] ); + free( &hHrtf->ModelParams.azimBsShape_dyn[i] ); + } + + free( (void *) hHrtf->ModelParams.azimBsShape ); /* void* cast needed to please both gcc and Visual studio compilers. Deallocating const float** should be fine and gcc agrees, but Visual studio complains. */ + for ( i = 0; i < hHrtf->ModelParams.elevDim3; i++ ) + { + free( hHrtf->ModelParams.azimKSeq[i] ); + } + free( hHrtf->ModelParams.azimKSeq ); + + free( hHrtf->ModelParams.EL_dyn ); + free( hHrtf->ModelParams.ER_dyn ); + + free( hHrtf->ModelEval.hrfModL ); + free( hHrtf->ModelEval.hrfModR ); + + for ( i = 0; i < 3; i++ ) + { + free( hHrtf->lr_energy_and_iac_dyn[i] ); + } + } + + return error; +} + + +/*---------------------------------------------------------------------* + * create_HRTF_from_rawdata() + * + * Create HRTF from the raw data (to the HRTF CRend handle) + *---------------------------------------------------------------------*/ + +static ivas_error create_HRTF_from_rawdata( + HRTFS_HANDLE *hHRTF, /* i/o: HRTF CRend handle */ + char *hrtf_data /* i : pointer to binary file */ +) +{ + int16_t i, j, k; + int16_t max_num_iterations_diffuse; + uint16_t max_total_num_fsamp_per_iteration, max_total_num_fsamp_per_iteration_diff; + uint32_t mem_size; + char *hrtf_data_rptr; + float *pOut_to_bin_wptr; + ivas_error error; + + if ( *hHRTF == NULL ) + { + if ( ( ( *hHRTF ) = (HRTFS_HANDLE) malloc( sizeof( HRTFS_DATA ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_UNEXPECTED_NULL_POINTER, "Can not allocate memory for HRTF binary data\n" ); + } + + if ( ( error = ivas_hrtf_init( *hHRTF ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + return IVAS_ERR_INTERNAL; + } + + hrtf_data_rptr = hrtf_data; + + /* latency_s */ + ( *hHRTF )->latency_s = *( (float *) ( hrtf_data_rptr ) ); + hrtf_data_rptr += sizeof( float ); + + /* max_num_ir */ + ( *hHRTF )->max_num_ir = *( (uint16_t *) ( hrtf_data_rptr ) ); + hrtf_data_rptr += sizeof( uint16_t ); + + /* BINAURAL_CHANNELS */ + if ( BINAURAL_CHANNELS != *( (int16_t *) ( hrtf_data_rptr ) ) ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file format not compliant (BINAURAL_CHANNELS)" ); + } + hrtf_data_rptr += sizeof( uint16_t ); + + /* max_num_iterations */ + ( *hHRTF )->max_num_iterations = *( (int16_t *) ( hrtf_data_rptr ) ); + hrtf_data_rptr += sizeof( int16_t ); + + /* num_iterations */ + for ( i = 0; i < ( *hHRTF )->max_num_ir; i++ ) + { + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + ( *hHRTF )->num_iterations[i][j] = *( (uint16_t *) ( hrtf_data_rptr ) ); + hrtf_data_rptr += sizeof( uint16_t ); + } + } + + /* pIndex_frequency_max */ + for ( i = 0; i < ( *hHRTF )->max_num_ir; i++ ) + { + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + mem_size = ( *hHRTF )->max_num_iterations * sizeof( uint16_t ); + ( *hHRTF )->pIndex_frequency_max[i][j] = (uint16_t *) malloc( mem_size ); + if ( ( *hHRTF )->pIndex_frequency_max[i][j] == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for pIndex_frequency_max" ); + } + memcpy( ( *hHRTF )->pIndex_frequency_max[i][j], hrtf_data_rptr, mem_size ); + hrtf_data_rptr += mem_size; + } + } + + /* max_num_iterations_diffuse */ + max_num_iterations_diffuse = *( (int16_t *) ( hrtf_data_rptr ) ); + hrtf_data_rptr += sizeof( int16_t ); + + if ( max_num_iterations_diffuse != 0 ) + { + /* num_iterations_diffuse */ + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + ( *hHRTF )->num_iterations_diffuse[j] = *( (uint16_t *) ( hrtf_data_rptr ) ); + hrtf_data_rptr += sizeof( uint16_t ); + } + + /* pIndex_frequency_max_diffuse (the size depends on num_iterations_diffuse) */ + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + mem_size = ( *hHRTF )->num_iterations_diffuse[j] * sizeof( uint16_t ); + ( *hHRTF )->pIndex_frequency_max_diffuse[j] = (uint16_t *) malloc( mem_size ); + if ( ( *hHRTF )->pIndex_frequency_max_diffuse[j] == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for pIndex_frequency_max_diffuse" ); + } + memcpy( ( *hHRTF )->pIndex_frequency_max_diffuse[j], hrtf_data_rptr, mem_size ); + hrtf_data_rptr += mem_size; + } + } + + /* index_frequency_max_diffuse */ + ( *hHRTF )->index_frequency_max_diffuse = *( (uint16_t *) ( hrtf_data_rptr ) ); + hrtf_data_rptr += sizeof( uint16_t ); + + /* inv_diffuse_weight */ + for ( i = 0; i < ( *hHRTF )->max_num_ir; i++ ) + { + ( *hHRTF )->inv_diffuse_weight[i] = *( (float *) ( hrtf_data_rptr ) ); + hrtf_data_rptr += sizeof( float ); + } + + /* max_total_num_fsamp_per_iteration */ + max_total_num_fsamp_per_iteration = *( (uint16_t *) ( hrtf_data_rptr ) ); + hrtf_data_rptr += sizeof( uint16_t ); + + /* coeff_re (the size depends on pIndex_frequency_max) */ + for ( i = 0; i < ( *hHRTF )->max_num_ir; i++ ) + { + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + mem_size = max_total_num_fsamp_per_iteration * sizeof( float ); + ( *hHRTF )->pOut_to_bin_re[i][j] = (float *) malloc( mem_size ); + if ( ( *hHRTF )->pOut_to_bin_re[i][j] == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for Out_to_bin_re" ); + } + memset( ( *hHRTF )->pOut_to_bin_re[i][j], 0x00, mem_size ); + + pOut_to_bin_wptr = ( *hHRTF )->pOut_to_bin_re[i][j]; + for ( k = 0; k < ( *hHRTF )->num_iterations[i][j]; k++ ) + { + mem_size = ( *hHRTF )->pIndex_frequency_max[i][j][k] * sizeof( float ); + memcpy( pOut_to_bin_wptr, hrtf_data_rptr, mem_size ); + hrtf_data_rptr += mem_size; + pOut_to_bin_wptr += ( *hHRTF )->pIndex_frequency_max[i][j][k]; + } + } + } + + /* coeff_im (the size depends on pIndex_frequency_max) */ + for ( i = 0; i < ( *hHRTF )->max_num_ir; i++ ) + { + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + mem_size = max_total_num_fsamp_per_iteration * sizeof( float ); + ( *hHRTF )->pOut_to_bin_im[i][j] = (float *) malloc( mem_size ); + if ( ( *hHRTF )->pOut_to_bin_im[i][j] == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for Out_to_bin_im" ); + } + memset( ( *hHRTF )->pOut_to_bin_im[i][j], 0x00, mem_size ); + + pOut_to_bin_wptr = ( *hHRTF )->pOut_to_bin_im[i][j]; + for ( k = 0; k < ( *hHRTF )->num_iterations[i][j]; k++ ) + { + mem_size = ( *hHRTF )->pIndex_frequency_max[i][j][k] * sizeof( float ); + memcpy( pOut_to_bin_wptr, hrtf_data_rptr, mem_size ); + hrtf_data_rptr += mem_size; + pOut_to_bin_wptr += ( *hHRTF )->pIndex_frequency_max[i][j][k]; + } + } + } + + /* max_total_num_fsamp_per_iteration_diff */ + max_total_num_fsamp_per_iteration_diff = *( (uint16_t *) ( hrtf_data_rptr ) ); + hrtf_data_rptr += sizeof( uint16_t ); + + if ( max_total_num_fsamp_per_iteration_diff != 0 ) + { + /* coeff_diffuse_re : The size depends on pIndex_frequency_max_diffuse */ + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + mem_size = max_total_num_fsamp_per_iteration_diff * sizeof( float ); + ( *hHRTF )->pOut_to_bin_diffuse_re[j] = (float *) malloc( mem_size ); + if ( ( *hHRTF )->pOut_to_bin_diffuse_re[j] == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for pOut_to_bin_diffuse_re" ); + } + memset( ( *hHRTF )->pOut_to_bin_diffuse_re[j], 0x00, mem_size ); + + pOut_to_bin_wptr = ( *hHRTF )->pOut_to_bin_diffuse_re[j]; + for ( k = 0; k < ( *hHRTF )->num_iterations_diffuse[j]; k++ ) + { + mem_size = ( *hHRTF )->pIndex_frequency_max_diffuse[j][k] * sizeof( float ); + memcpy( pOut_to_bin_wptr, hrtf_data_rptr, mem_size ); + hrtf_data_rptr += mem_size; + pOut_to_bin_wptr += ( *hHRTF )->pIndex_frequency_max_diffuse[j][k]; + } + } + + /* coeff_diffuse_im : The size depends on pIndex_frequency_max_diffuse */ + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + mem_size = max_total_num_fsamp_per_iteration_diff * sizeof( float ); + ( *hHRTF )->pOut_to_bin_diffuse_im[j] = (float *) malloc( mem_size ); + if ( ( *hHRTF )->pOut_to_bin_diffuse_im[j] == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for pOut_to_bin_diffuse_im" ); + } + memset( ( *hHRTF )->pOut_to_bin_diffuse_im[j], 0x00, mem_size ); + + pOut_to_bin_wptr = ( *hHRTF )->pOut_to_bin_diffuse_im[j]; + for ( k = 0; k < ( *hHRTF )->num_iterations_diffuse[j]; k++ ) + { + mem_size = ( *hHRTF )->pIndex_frequency_max_diffuse[j][k] * sizeof( float ); + memcpy( pOut_to_bin_wptr, hrtf_data_rptr, mem_size ); + hrtf_data_rptr += mem_size; + pOut_to_bin_wptr += ( *hHRTF )->pIndex_frequency_max_diffuse[j][k]; + } + } + } + + return IVAS_ERR_OK; +} + + +static ivas_error create_fastconv_HRTF_from_rawdata( + HRTFS_FASTCONV_HANDLE *hHRTF, /* i/o: HRTF FastConv handle */ + char *hrtf_data, /* i : pointer to binary file */ + RENDERER_TYPE rend_type, /* i : Renderer type */ + BINAURAL_INPUT_AUDIO_CONFIG input_cfg /* i : Input binaural config */ +) +{ + int16_t i, j; + char *hrtf_data_rptr; + ( *hHRTF )->allocate_init_flag = 0; + ivas_allocate_binaural_hrtf( *hHRTF, 0, input_cfg, rend_type, ( *hHRTF )->allocate_init_flag ); + + hrtf_data_rptr = hrtf_data; + + /* BINAURAL_CONVBANDS */ + if ( BINAURAL_CONVBANDS != *( (uint16_t *) ( hrtf_data_rptr ) ) ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (BINAURAL_CONVBANDS)" ); + } + hrtf_data_rptr += sizeof( uint16_t ); + + /* HRIR */ + if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_COMBINED ) + { + ( *hHRTF )->FASTCONV_HRIR_latency_s = *( (float *) ( hrtf_data_rptr ) ); + hrtf_data_rptr += sizeof( float ); + + if ( HRTF_LS_CHANNELS != *( (uint16_t *) ( hrtf_data_rptr ) ) ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (HRTF_LS_CHANNELS)" ); + } + hrtf_data_rptr += sizeof( uint16_t ); + + if ( BINAURAL_NTAPS != *( (uint16_t *) ( hrtf_data_rptr ) ) ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (BINAURAL_NTAPS)" ); + } + hrtf_data_rptr += sizeof( uint16_t ); + + for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + { + for ( j = 0; j < HRTF_LS_CHANNELS; j++ ) + { + memcpy( ( *hHRTF )->leftHRIRReal[i][j], hrtf_data_rptr, BINAURAL_NTAPS * sizeof( float ) ); + hrtf_data_rptr += BINAURAL_NTAPS * sizeof( float ); + } + } + for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + { + for ( j = 0; j < HRTF_LS_CHANNELS; j++ ) + { + memcpy( ( *hHRTF )->leftHRIRImag[i][j], hrtf_data_rptr, BINAURAL_NTAPS * sizeof( float ) ); + hrtf_data_rptr += BINAURAL_NTAPS * sizeof( float ); + } + } + for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + { + for ( j = 0; j < HRTF_LS_CHANNELS; j++ ) + { + memcpy( ( *hHRTF )->rightHRIRReal[i][j], hrtf_data_rptr, BINAURAL_NTAPS * sizeof( float ) ); + hrtf_data_rptr += BINAURAL_NTAPS * sizeof( float ); + } + } + for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + { + for ( j = 0; j < HRTF_LS_CHANNELS; j++ ) + { + memcpy( ( *hHRTF )->rightHRIRImag[i][j], hrtf_data_rptr, BINAURAL_NTAPS * sizeof( float ) ); + hrtf_data_rptr += BINAURAL_NTAPS * sizeof( float ); + } + } + } + else if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA3 ) + { + /* HRIR_HOA3 */ + ( *hHRTF )->FASTCONV_HOA3_latency_s = *( (float *) ( hrtf_data_rptr ) ); + hrtf_data_rptr += sizeof( float ); + + if ( HOA3_CHANNELS != *( (uint16_t *) ( hrtf_data_rptr ) ) ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (HOA3_CHANNELS)" ); + } + hrtf_data_rptr += sizeof( uint16_t ); + + if ( BINAURAL_NTAPS_SBA != *( (uint16_t *) ( hrtf_data_rptr ) ) ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (BINAURAL_NTAPS_SBA)" ); + } + hrtf_data_rptr += sizeof( uint16_t ); + for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + { + for ( j = 0; j < HOA3_CHANNELS; j++ ) + { + memcpy( ( *hHRTF )->leftHRIRReal_HOA3[i][j], hrtf_data_rptr, BINAURAL_NTAPS_SBA * sizeof( float ) ); + hrtf_data_rptr += BINAURAL_NTAPS_SBA * sizeof( float ); + } + } + for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + { + for ( j = 0; j < HOA3_CHANNELS; j++ ) + { + memcpy( ( *hHRTF )->leftHRIRImag_HOA3[i][j], hrtf_data_rptr, BINAURAL_NTAPS_SBA * sizeof( float ) ); + hrtf_data_rptr += BINAURAL_NTAPS_SBA * sizeof( float ); + } + } + for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + { + for ( j = 0; j < HOA3_CHANNELS; j++ ) + { + memcpy( ( *hHRTF )->rightHRIRReal_HOA3[i][j], hrtf_data_rptr, BINAURAL_NTAPS_SBA * sizeof( float ) ); + hrtf_data_rptr += BINAURAL_NTAPS_SBA * sizeof( float ); + } + } + for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + { + for ( j = 0; j < HOA3_CHANNELS; j++ ) + { + memcpy( ( *hHRTF )->rightHRIRImag_HOA3[i][j], hrtf_data_rptr, BINAURAL_NTAPS_SBA * sizeof( float ) ); + hrtf_data_rptr += BINAURAL_NTAPS_SBA * sizeof( float ); + } + } + } + else if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA2 ) + { + /* HRIR_HOA2 */ + ( *hHRTF )->FASTCONV_HOA2_latency_s = *( (float *) ( hrtf_data_rptr ) ); + hrtf_data_rptr += sizeof( float ); + if ( HOA2_CHANNELS != *( (uint16_t *) ( hrtf_data_rptr ) ) ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (HOA2_CHANNELS)" ); + } + hrtf_data_rptr += sizeof( uint16_t ); + + if ( BINAURAL_NTAPS_SBA != *( (uint16_t *) ( hrtf_data_rptr ) ) ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (BINAURAL_NTAPS_SBA)" ); + } + hrtf_data_rptr += sizeof( uint16_t ); + + for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + { + for ( j = 0; j < HOA2_CHANNELS; j++ ) + { + memcpy( ( *hHRTF )->leftHRIRReal_HOA2[i][j], hrtf_data_rptr, BINAURAL_NTAPS_SBA * sizeof( float ) ); + hrtf_data_rptr += BINAURAL_NTAPS_SBA * sizeof( float ); + } + } + for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + { + for ( j = 0; j < HOA2_CHANNELS; j++ ) + { + memcpy( ( *hHRTF )->leftHRIRImag_HOA2[i][j], hrtf_data_rptr, BINAURAL_NTAPS_SBA * sizeof( float ) ); + hrtf_data_rptr += BINAURAL_NTAPS_SBA * sizeof( float ); + } + } + for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + { + for ( j = 0; j < HOA2_CHANNELS; j++ ) + { + memcpy( ( *hHRTF )->rightHRIRReal_HOA2[i][j], hrtf_data_rptr, BINAURAL_NTAPS_SBA * sizeof( float ) ); + hrtf_data_rptr += BINAURAL_NTAPS_SBA * sizeof( float ); + } + } + for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + { + for ( j = 0; j < HOA2_CHANNELS; j++ ) + { + memcpy( ( *hHRTF )->rightHRIRImag_HOA2[i][j], hrtf_data_rptr, BINAURAL_NTAPS_SBA * sizeof( float ) ); + hrtf_data_rptr += BINAURAL_NTAPS_SBA * sizeof( float ); + } + } + } + else if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_FOA ) + { + /* HRIR_FOA */ + ( *hHRTF )->FASTCONV_FOA_latency_s = *( (float *) ( hrtf_data_rptr ) ); + hrtf_data_rptr += sizeof( float ); + if ( FOA_CHANNELS != *( (uint16_t *) ( hrtf_data_rptr ) ) ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (FOA_CHANNELS)" ); + } + hrtf_data_rptr += sizeof( uint16_t ); + + if ( BINAURAL_NTAPS_SBA != *( (uint16_t *) ( hrtf_data_rptr ) ) ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (BINAURAL_NTAPS_SBA)" ); + } + hrtf_data_rptr += sizeof( uint16_t ); + + for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + { + for ( j = 0; j < FOA_CHANNELS; j++ ) + { + memcpy( ( *hHRTF )->leftHRIRReal_FOA[i][j], hrtf_data_rptr, BINAURAL_NTAPS_SBA * sizeof( float ) ); + hrtf_data_rptr += BINAURAL_NTAPS_SBA * sizeof( float ); + } + } + for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + { + for ( j = 0; j < FOA_CHANNELS; j++ ) + { + memcpy( ( *hHRTF )->leftHRIRImag_FOA[i][j], hrtf_data_rptr, BINAURAL_NTAPS_SBA * sizeof( float ) ); + hrtf_data_rptr += BINAURAL_NTAPS_SBA * sizeof( float ); + } + } + for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + { + for ( j = 0; j < FOA_CHANNELS; j++ ) + { + memcpy( ( *hHRTF )->rightHRIRReal_FOA[i][j], hrtf_data_rptr, BINAURAL_NTAPS_SBA * sizeof( float ) ); + hrtf_data_rptr += BINAURAL_NTAPS_SBA * sizeof( float ); + } + } + for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + { + for ( j = 0; j < FOA_CHANNELS; j++ ) + { + memcpy( ( *hHRTF )->rightHRIRImag_FOA[i][j], hrtf_data_rptr, BINAURAL_NTAPS_SBA * sizeof( float ) ); + hrtf_data_rptr += BINAURAL_NTAPS_SBA * sizeof( float ); + } + } + } + /* BRIR */ + else if ( rend_type == RENDERER_BINAURAL_FASTCONV_ROOM && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_COMBINED ) + { + ( *hHRTF )->FASTCONV_BRIR_latency_s = *( (float *) ( hrtf_data_rptr ) ); + hrtf_data_rptr += sizeof( float ); + + if ( HRTF_LS_CHANNELS != *( (uint16_t *) ( hrtf_data_rptr ) ) ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (HRTF_LS_CHANNELS)" ); + } + hrtf_data_rptr += sizeof( uint16_t ); + + if ( BINAURAL_NTAPS_MAX != *( (uint16_t *) ( hrtf_data_rptr ) ) ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (BINAURAL_NTAPS)" ); + } + hrtf_data_rptr += sizeof( uint16_t ); + + for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + { + for ( j = 0; j < HRTF_LS_CHANNELS; j++ ) + { + memcpy( ( *hHRTF )->leftBRIRReal[i][j], hrtf_data_rptr, BINAURAL_NTAPS_MAX * sizeof( float ) ); + hrtf_data_rptr += BINAURAL_NTAPS_MAX * sizeof( float ); + } + } + for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + { + for ( j = 0; j < HRTF_LS_CHANNELS; j++ ) + { + memcpy( ( *hHRTF )->leftBRIRImag[i][j], hrtf_data_rptr, BINAURAL_NTAPS_MAX * sizeof( float ) ); + hrtf_data_rptr += BINAURAL_NTAPS_MAX * sizeof( float ); + } + } + for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + { + for ( j = 0; j < HRTF_LS_CHANNELS; j++ ) + { + memcpy( ( *hHRTF )->rightBRIRReal[i][j], hrtf_data_rptr, BINAURAL_NTAPS_MAX * sizeof( float ) ); + hrtf_data_rptr += BINAURAL_NTAPS_MAX * sizeof( float ); + } + } + for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + { + for ( j = 0; j < HRTF_LS_CHANNELS; j++ ) + { + memcpy( ( *hHRTF )->rightBRIRImag[i][j], hrtf_data_rptr, BINAURAL_NTAPS_MAX * sizeof( float ) ); + hrtf_data_rptr += BINAURAL_NTAPS_MAX * sizeof( float ); + } + } + + /* Reverb Parameters */ + if ( CLDFB_NO_CHANNELS_MAX != *( (uint16_t *) ( hrtf_data_rptr ) ) ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (CLDFB_NO_CHANNELS_MAX)" ); + } + hrtf_data_rptr += sizeof( uint16_t ); + + memcpy( ( *hHRTF )->fastconvReverberationTimes, hrtf_data_rptr, CLDFB_NO_CHANNELS_MAX * sizeof( float ) ); + hrtf_data_rptr += CLDFB_NO_CHANNELS_MAX * sizeof( float ); + + memcpy( ( *hHRTF )->fastconvReverberationEneCorrections, hrtf_data_rptr, CLDFB_NO_CHANNELS_MAX * sizeof( float ) ); + hrtf_data_rptr += CLDFB_NO_CHANNELS_MAX * sizeof( float ); + } + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * load_fastconv_HRTF_from_binary() + * + * Load FastConv HRTF binary data into the handle + *---------------------------------------------------------------------*/ + +ivas_error load_fastconv_HRTF_from_binary( + IVAS_DEC_HRTF_FASTCONV_HANDLE hHrtfFastConv, /* i/o: FastConv HRTF handle */ + const hrtfFileReader *hrtfReader /* i : pointer to hrtfFileReader handle */ +) +{ + FILE *f_hrtf; + int32_t hrtf_data_size_max; + char *hrtf_data; + ivas_hrtfs_header_t hrtf_header; + ivas_error header_check_result; + ivas_hrtfs_file_header_t hrtfs_file_header; + int16_t hrtf_id; + + f_hrtf = hrtfReader->file; + + if ( ( header_check_result = read_and_check_hrtf_binary_file_header( &hrtfs_file_header, f_hrtf ) ) != IVAS_ERR_OK ) + { + return header_check_result; + } + + hrtf_data_size_max = hrtfs_file_header.max_data_size; + + /* Allocate the memory */ + + if ( hrtf_data_size_max == 0 ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (hrtf_data_size_max)" ); + } + + hrtf_data = (char *) malloc( hrtf_data_size_max ); + if ( hrtf_data == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } + + /* Read & load */ + for ( hrtf_id = 0; hrtf_id < hrtfs_file_header.nb_hrtf; hrtf_id++ ) + { + if ( read_hrtf_binary_header( &hrtf_header, f_hrtf ) != IVAS_ERR_OK ) + { + free( hrtf_data ); + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "HRTF binary file not compliant (number of HRTF)" ); + } + if ( ( hrtf_header.rend_type == RENDERER_BINAURAL_FASTCONV ) || ( hrtf_header.rend_type == RENDERER_BINAURAL_FASTCONV_ROOM ) ) + { + if ( fread( hrtf_data, 1, hrtf_header.data_size, f_hrtf ) != hrtf_header.data_size ) + { + free( hrtf_data ); + return IVAS_ERROR( IVAS_ERR_FAILED_FILE_READ, "Error in HRTF file reading" ); + } + + /* Create the HRTF reading the raw data from the binary file */ + if ( ( create_fastconv_HRTF_from_rawdata( &hHrtfFastConv, hrtf_data, hrtf_header.rend_type, hrtf_header.input_cfg ) ) != IVAS_ERR_OK ) + { + free( hrtf_data ); + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Could not create HRTF from binary file" ); + } + } + else + { + fseek( f_hrtf, hrtf_header.data_size, SEEK_CUR ); + } + } + free( hrtf_data ); + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * create_parambin_HRTF_from_rawdata() + * + * + *---------------------------------------------------------------------*/ + +static ivas_error create_parambin_HRTF_from_rawdata( + HRTFS_PARAMBIN_HANDLE *hHRTF, /* i/o: Parametric binauralizer HRTF handle */ + char *hrtf_data /* i : pointer to binary file */ +) +{ + int16_t i, j; + char *hrtf_data_rptr; + uint32_t data_size_tmp; + + hrtf_data_rptr = hrtf_data; + + /* HRTF_SH_CHANNELS */ + if ( HRTF_SH_CHANNELS != *( (uint16_t *) ( hrtf_data_rptr ) ) ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (HRTF_SH_CHANNELS)" ); + } + hrtf_data_rptr += sizeof( uint16_t ); + + /* HRTF_NUM_BINS */ + if ( HRTF_NUM_BINS != *( (uint16_t *) ( hrtf_data_rptr ) ) ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (HRTF_NUM_BINS)" ); + } + hrtf_data_rptr += sizeof( uint16_t ); + + /* HRTF */ + data_size_tmp = HRTF_NUM_BINS * sizeof( float ); + for ( i = 0; i < BINAURAL_CHANNELS; i++ ) + { + for ( j = 0; j < HRTF_SH_CHANNELS; j++ ) + { + memcpy( ( *hHRTF )->hrtfShCoeffsRe[i][j], hrtf_data_rptr, data_size_tmp ); + hrtf_data_rptr += data_size_tmp; + } + } + for ( i = 0; i < BINAURAL_CHANNELS; i++ ) + { + for ( j = 0; j < HRTF_SH_CHANNELS; j++ ) + { + memcpy( ( *hHRTF )->hrtfShCoeffsIm[i][j], hrtf_data_rptr, data_size_tmp ); + hrtf_data_rptr += data_size_tmp; + } + } + + /* Reverb Parameters */ + if ( CLDFB_NO_CHANNELS_MAX != *( (uint16_t *) ( hrtf_data_rptr ) ) ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (CLDFB_NO_CHANNELS_MAX)" ); + } + hrtf_data_rptr += sizeof( uint16_t ); + + memcpy( ( *hHRTF )->parametricReverberationTimes, hrtf_data_rptr, CLDFB_NO_CHANNELS_MAX * sizeof( float ) ); + hrtf_data_rptr += CLDFB_NO_CHANNELS_MAX * sizeof( float ); + + memcpy( ( *hHRTF )->parametricReverberationEneCorrections, hrtf_data_rptr, CLDFB_NO_CHANNELS_MAX * sizeof( float ) ); + hrtf_data_rptr += CLDFB_NO_CHANNELS_MAX * sizeof( float ); + + memcpy( ( *hHRTF )->parametricEarlyPartEneCorrection, hrtf_data_rptr, CLDFB_NO_CHANNELS_MAX * sizeof( float ) ); + hrtf_data_rptr += CLDFB_NO_CHANNELS_MAX * sizeof( float ); + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * load_parambin_HRTF_from_binary() + * + * Load parametric binauralizer HRTF binary data into the handle + *---------------------------------------------------------------------*/ + +ivas_error load_parambin_HRTF_from_binary( + IVAS_DEC_HRTF_PARAMBIN_HANDLE hHrtfParamBin, /* i/o: Parametric binauralizer HRTF handle */ + const hrtfFileReader *hrtfReader /* i : pointer to hrtfFileReader handle */ +) +{ + FILE *f_hrtf; + int32_t hrtf_data_size_max; + char *hrtf_data; + ivas_hrtfs_header_t hrtf_header; + ivas_error header_check_result; + ivas_hrtfs_file_header_t hrtfs_file_header; + int16_t hrtf_id; + + f_hrtf = hrtfReader->file; + + if ( ( header_check_result = read_and_check_hrtf_binary_file_header( &hrtfs_file_header, f_hrtf ) ) != IVAS_ERR_OK ) + { + return header_check_result; + } + + hrtf_data_size_max = hrtfs_file_header.max_data_size; + + /* Allocate the memory */ + + if ( hrtf_data_size_max == 0 ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (hrtf_data_size_max)" ); + } + + hrtf_data = (char *) malloc( hrtf_data_size_max ); + if ( hrtf_data == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } + + /* Read & load */ + memset( hHrtfParamBin, 0x00, sizeof( HRTFS_PARAMBIN ) ); + + for ( hrtf_id = 0; hrtf_id < hrtfs_file_header.nb_hrtf; hrtf_id++ ) + { + if ( read_hrtf_binary_header( &hrtf_header, f_hrtf ) != IVAS_ERR_OK ) + { + free( hrtf_data ); + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "HRTF binary file not compliant (number of HRTF)" ); + } + + if ( hrtf_header.rend_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) /* Parametric binauralizer data is represented as single entity */ + { + if ( fread( hrtf_data, 1, hrtf_header.data_size, f_hrtf ) != hrtf_header.data_size ) + { + free( hrtf_data ); + return IVAS_ERROR( IVAS_ERR_FAILED_FILE_READ, "Error in HRTF file reading" ); + } + + /* Create the HRTF reading the raw data from the binary file */ + if ( ( create_parambin_HRTF_from_rawdata( &hHrtfParamBin, hrtf_data ) ) != IVAS_ERR_OK ) + { + free( hrtf_data ); + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Could not create HRTF from binary file" ); + } + } + else + { + fseek( f_hrtf, hrtf_header.data_size, SEEK_CUR ); + } + } + free( hrtf_data ); + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * create_SetOfHRTF_from_binary() + * + * Create the HRTF data set from the binary file + *---------------------------------------------------------------------*/ + +ivas_error create_SetOfHRTF_from_binary( + IVAS_DEC_HRTF_CREND_HANDLE hSetOfHRTF, /* i/o: HRTF CRend handle */ + const hrtfFileReader *hrtfReader, /* i : pointer to hrtfFileReader handle */ + int32_t output_Fs ) /* i : Output sampling frequency */ +{ + FILE *f_hrtf; + int32_t hrtf_data_size_max; + char *hrtf_data; + ivas_hrtfs_header_t hrtf_header; + HRTFS_DATA **hHRTF; + ivas_error header_check_result; + ivas_hrtfs_file_header_t hrtfs_file_header; + int16_t hrtf_id; + + f_hrtf = hrtfReader->file; + + if ( ( header_check_result = read_and_check_hrtf_binary_file_header( &hrtfs_file_header, f_hrtf ) ) != IVAS_ERR_OK ) + { + return header_check_result; + } + + hrtf_data_size_max = hrtfs_file_header.max_data_size; + + /* Allocate the memory */ + + if ( hrtf_data_size_max == 0 ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (hrtf_data_size_max)" ); + } + + hrtf_data = (char *) malloc( hrtf_data_size_max ); + if ( hrtf_data == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } + + /* Read & load */ + + memset( hSetOfHRTF, 0x00, sizeof( HRTFS_CREND ) ); + + for ( hrtf_id = 0; hrtf_id < hrtfs_file_header.nb_hrtf; hrtf_id++ ) + { + if ( read_hrtf_binary_header( &hrtf_header, f_hrtf ) != IVAS_ERR_OK ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "HRTF binary file not compliant (number of HRTF)" ); + } + + hHRTF = NULL; + if ( hrtf_header.frequency == output_Fs ) + { + if ( hrtf_header.rend_type == RENDERER_BINAURAL_MIXER_CONV ) + { + if ( hrtf_header.input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_COMBINED ) + { + hHRTF = &( ( *hSetOfHRTF ).hHRTF_hrir_combined ); + } + else if ( hrtf_header.input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA3 ) + { + hHRTF = &( ( *hSetOfHRTF ).hHRTF_hrir_hoa3 ); + } + else if ( hrtf_header.input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA2 ) + { + hHRTF = &( ( *hSetOfHRTF ).hHRTF_hrir_hoa2 ); + } + else if ( hrtf_header.input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_FOA ) + { + hHRTF = &( ( *hSetOfHRTF ).hHRTF_hrir_foa ); + } + } + else if ( hrtf_header.rend_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) + { + if ( hrtf_header.input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_COMBINED ) + { + hHRTF = &( ( *hSetOfHRTF ).hHRTF_brir_combined ); + } + } + } + + if ( fread( hrtf_data, 1, hrtf_header.data_size, f_hrtf ) != hrtf_header.data_size ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_FILE_READ, "Error in HRTF file reading" ); + } + + if ( hHRTF != NULL ) + { + /* Create the HRTF reading the raw data from the binary file */ + if ( ( create_HRTF_from_rawdata( hHRTF, hrtf_data ) ) != IVAS_ERR_OK ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Could not create HRTF from binary file" ); + } + } + } + + free( hrtf_data ); + if ( ( ( *hSetOfHRTF ).hHRTF_hrir_combined == NULL ) || ( ( *hSetOfHRTF ).hHRTF_brir_combined == NULL ) || ( ( *hSetOfHRTF ).hHRTF_hrir_hoa3 == NULL ) ) + { + if ( destroy_SetOfHRTF( hSetOfHRTF ) != IVAS_ERR_OK ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Could not create all the HRTF from binary file" ); + } + } + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * destroy_HRTF() + * + * Destroy the HRTF CRend handle + *---------------------------------------------------------------------*/ + +static ivas_error destroy_HRTF( + HRTFS_HANDLE *hHRTF /* i/o: HRTF CRend handle */ +) +{ + uint16_t i, j; + + if ( *hHRTF != NULL && hHRTF != NULL ) + { + for ( i = 0; i < MAX_INTERN_CHANNELS; i++ ) + { + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + if ( ( *hHRTF )->pIndex_frequency_max[i][j] != NULL ) + { + free( ( *hHRTF )->pIndex_frequency_max[i][j] ); + } + if ( ( *hHRTF )->pOut_to_bin_re[i][j] != NULL ) + { + free( ( *hHRTF )->pOut_to_bin_re[i][j] ); + } + if ( ( *hHRTF )->pOut_to_bin_im[i][j] != NULL ) + { + free( ( *hHRTF )->pOut_to_bin_im[i][j] ); + } + } + } + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + if ( ( *hHRTF )->pIndex_frequency_max_diffuse[j] != NULL ) + { + free( ( *hHRTF )->pIndex_frequency_max_diffuse[j] ); + } + if ( ( *hHRTF )->pOut_to_bin_diffuse_re[j] != NULL ) + { + free( ( *hHRTF )->pOut_to_bin_diffuse_re[j] ); + } + if ( ( *hHRTF )->pOut_to_bin_diffuse_im[j] != NULL ) + { + free( ( *hHRTF )->pOut_to_bin_diffuse_im[j] ); + } + } + + free( *hHRTF ); + *hHRTF = NULL; + } + + return IVAS_ERR_OK; +} + +/*---------------------------------------------------------------------* + * destroy_SetOfHRTF() + * + * Destroy the HRTF data set. + *---------------------------------------------------------------------*/ + +ivas_error destroy_SetOfHRTF( + HRTFS_CREND_HANDLE hSetOfHRTF /* i/o: Set of HRTF CRend handle */ +) +{ + if ( hSetOfHRTF != NULL ) + { + destroy_HRTF( &( hSetOfHRTF->hHRTF_hrir_combined ) ); + destroy_HRTF( &( hSetOfHRTF->hHRTF_hrir_hoa3 ) ); + destroy_HRTF( &( hSetOfHRTF->hHRTF_hrir_hoa2 ) ); + destroy_HRTF( &( hSetOfHRTF->hHRTF_hrir_foa ) ); + destroy_HRTF( &( hSetOfHRTF->hHRTF_brir_combined ) ); + } + + return IVAS_ERR_OK; +} diff --git a/lib_util/hrtf_file_reader.h b/lib_util/hrtf_file_reader.h new file mode 100644 index 0000000000000000000000000000000000000000..a731416570963abdfddd88e2234f8a17df278d6f --- /dev/null +++ b/lib_util/hrtf_file_reader.h @@ -0,0 +1,140 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#ifndef IVAS_HRTF_FILE_READER_H +#define IVAS_HRTF_FILE_READER_H + +#include "common_api_types.h" + + +typedef struct hrtfFileReader hrtfFileReader; + +typedef struct ivas_hrtfs_header_t +{ + int32_t rend_type; + int32_t input_cfg; + int32_t frequency; + uint32_t data_size; + +} ivas_hrtfs_header_t; + +/*---------------------------------------------------------------------* + * hrtfFileReader_open() + * + * Allocates memory for an hrtfFileReader and opens the file at given path for reading. + *---------------------------------------------------------------------*/ + +ivas_error hrtfFileReader_open( + const char *filePath, /* i : path to hrtf binary file */ + hrtfFileReader **hrtfReader /* o : hrtfFileReader handle */ +); + +/*---------------------------------------------------------------------* + * hrtfFileReader_close() + * + * De-allocates all underlying memory of an hrtfFileReader. + *---------------------------------------------------------------------*/ + +void hrtfFileReader_close( + hrtfFileReader **hrtfReader /* i/o: pointer to hrtfFileReader handle */ +); + +/*---------------------------------------------------------------------* + * load_HRTF_binary() + * + * Load HRTF binary data into the HRTF handle + *---------------------------------------------------------------------*/ + +ivas_error load_HRTF_binary( + IVAS_DEC_HRTF_HANDLE hHrtf, /* i/o: HRTF handle */ + const hrtfFileReader *hrtfReader /* i/o: pointer to hrtfFileReader handle */ +); + +/*---------------------------------------------------------------------* + * create_SetOfHRTF_from_binary() + * + * Create the HRTF data set from the binary file + *---------------------------------------------------------------------*/ + +ivas_error create_SetOfHRTF_from_binary( + IVAS_DEC_HRTF_CREND_HANDLE hSetOfHRTF, /* i/o: Set of HRTF CRend handle */ + const hrtfFileReader *hrtfReader, /* i : pointer to hrtfFileReader handle */ + int32_t output_Fs /* i : Output sampling frequency */ +); + + +/*---------------------------------------------------------------------* + * destroy_SetOfHRTF() + * + * Destroy the HRTF data set. + *---------------------------------------------------------------------*/ + +ivas_error destroy_SetOfHRTF( + IVAS_DEC_HRTF_CREND_HANDLE hSetOfHRTF /* i/o: Set of HRTF CRend handle */ +); + + +/*---------------------------------------------------------------------* + * load_fastconv_HRTF_from_binary() + * + * Load FastConv HRTF binary data into the handle + *---------------------------------------------------------------------*/ + +ivas_error load_fastconv_HRTF_from_binary( + IVAS_DEC_HRTF_FASTCONV_HANDLE hHrtfFastConv, /* i/o: FastConv HRTF handle */ + const hrtfFileReader *hrtfReader /* i : pointer to hrtfFileReader handle */ +); + + +/*---------------------------------------------------------------------* + * load_parambin_HRTF_from_binary() + * + * Load parametric binauralizer HRTF binary data into the handle + *---------------------------------------------------------------------*/ + +ivas_error load_parambin_HRTF_from_binary( + IVAS_DEC_HRTF_PARAMBIN_HANDLE hHrtfParambin, /* i/o: Parambin HRTF handle */ + const hrtfFileReader *hrtfReader /* i : pointer to hrtfFileReader handle */ +); + + +/*---------------------------------------------------------------------* + * dealloc_HRTF_binary() + * + * Deallocated memory allocated by load_HRTF_binary + *---------------------------------------------------------------------*/ + +ivas_error dealloc_HRTF_binary( + IVAS_DEC_HRTF_HANDLE hHrtf /* i/o: HRTF handle */ +); + +#endif /* IVAS_HRTF_FILE_READER_H */ diff --git a/lib_util/ism_file_reader.c b/lib_util/ism_file_reader.c new file mode 100644 index 0000000000000000000000000000000000000000..b298b25bc88def43051bcff8f7394fcd6e18889c --- /dev/null +++ b/lib_util/ism_file_reader.c @@ -0,0 +1,243 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include "ism_file_reader.h" +#include "cmdl_tools.h" +#include +#include + +#define META_LINE_LENGTH 200 /* max number of characters at one line of metadata input/output file */ +#define NUM_ISM_METADATA_PER_LINE 8 /* Number of ISM metadata per line in a metadata file */ +#define NUM_MIN_ISM_METADATA 1 /* Minimum number of metadata parameters (azimuth) */ + + +struct IsmFileReader +{ + FILE *file; + char *file_path; +}; + + +/*---------------------------------------------------------------------* + * IsmFileReader_open() + * + * Allocates memory for an IsmFileReader and opens the file at given path for reading. + *---------------------------------------------------------------------*/ + +IsmFileReader *IsmFileReader_open( + const char *filePath /* i : path to ISM metadata file */ +) +{ + IsmFileReader *self; + FILE *file; + + if ( !filePath ) + { + return NULL; + } + + file = fopen( filePath, "rt" ); + + if ( !file ) + { + return NULL; + } + + self = calloc( sizeof( IsmFileReader ), 1 ); + self->file = file; + self->file_path = calloc( sizeof( char ), strlen( filePath ) + 1 ); + strcpy( self->file_path, filePath ); + + return self; +} + + +/*---------------------------------------------------------------------* + * IsmFileReader_readNextFrame() + * + * Reads ISM metadata from a previously opened file into the provided struct. + *---------------------------------------------------------------------*/ + +/*! r: error code */ +ivas_error IsmFileReader_readNextFrame( + IsmFileReader *self, /* i/o: IsmFileReader handle */ + IVAS_ISM_METADATA *ismMetadata /* o : ISM metadata read from the opened file */ +) +{ + char char_buff[META_LINE_LENGTH]; + float meta_prm[NUM_ISM_METADATA_PER_LINE]; + const float meta_prm_default[NUM_ISM_METADATA_PER_LINE] = { 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f }; + char *char_ptr; + int16_t i; + FILE *file; + + /* Set default metadata parameters */ + for ( i = 0; i < NUM_ISM_METADATA_PER_LINE; i++ ) + { + meta_prm[i] = meta_prm_default[i]; + } + + if ( ismMetadata == NULL || self->file == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + file = self->file; + + while ( fgets( char_buff, META_LINE_LENGTH, file ) == NULL ) + { + if ( feof( self->file ) ) + { + rewind( self->file ); + } + else + { + return IVAS_ERR_FAILED_FILE_READ; + } + } + + char_ptr = strtok( char_buff, "," ); + i = 0; + meta_prm[i++] = (float) atof( char_ptr ); + if ( is_number( char_ptr ) == false ) + { + return IVAS_ERR_ISM_INVALID_METADATA_VALUE; + } + while ( ( char_ptr = strtok( NULL, "," ) ) != NULL && i < NUM_ISM_METADATA_PER_LINE ) + { + if ( is_number( char_ptr ) == false ) + { + return IVAS_ERR_ISM_INVALID_METADATA_VALUE; + } + + meta_prm[i++] = (float) atof( char_ptr ); + } + /* Verify the number of metadata values. */ + if ( i < NUM_MIN_ISM_METADATA || char_ptr != NULL ) + { + /* Invalid number of metadata parameters (2-7 supported) */ + return IVAS_ERR_ISM_FILE_READER_INVALID_METADATA_FORMAT; + } + + ismMetadata->azimuth = meta_prm[0]; + ismMetadata->elevation = meta_prm[1]; + ismMetadata->radius = meta_prm[2]; + ismMetadata->spread = meta_prm[3]; + ismMetadata->gainFactor = meta_prm[4]; + ismMetadata->yaw = meta_prm[5]; + ismMetadata->pitch = meta_prm[6]; + ismMetadata->non_diegetic_flag = (int16_t) meta_prm[7]; + + /* verify whether the read metadata values are in an expected range */ + if ( ( ismMetadata->non_diegetic_flag ) != 0 && ( ismMetadata->non_diegetic_flag != 1 ) ) + { + return IVAS_ERR_ISM_INVALID_METADATA_VALUE; + } + + if ( ismMetadata->azimuth > 180 || ismMetadata->azimuth < -180 ) + { + return IVAS_ERR_ISM_INVALID_METADATA_VALUE; + } + + if ( ismMetadata->elevation > 90 || ismMetadata->elevation < -90 ) + { + return IVAS_ERR_ISM_INVALID_METADATA_VALUE; + } + + if ( ismMetadata->radius < 0 ) /* Negative radius not supported. Max quantized radius = (2^ISM_RADIUS_NBITS-1)*0.25 = 15.75 */ + { + return IVAS_ERR_ISM_INVALID_METADATA_VALUE; + } + + if ( ismMetadata->spread > 360 || ismMetadata->spread < 0 ) + { + return IVAS_ERR_ISM_INVALID_METADATA_VALUE; + } + + if ( ismMetadata->gainFactor > 1 || ismMetadata->gainFactor < 0 ) + { + return IVAS_ERR_ISM_INVALID_METADATA_VALUE; + } + if ( ismMetadata->yaw > 180 || ismMetadata->yaw < -180 ) + { + return IVAS_ERR_ISM_INVALID_METADATA_VALUE; + } + + if ( ismMetadata->pitch > 90 || ismMetadata->pitch < -90 ) + { + return IVAS_ERR_ISM_INVALID_METADATA_VALUE; + } + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * IsmFileReader_close() + * + * De-allocates all underlying memory of an IsmFileReader. + *---------------------------------------------------------------------*/ + +void IsmFileReader_close( + IsmFileReader **selfPtr /* i/o: pointer to IsmFileReader handle */ +) +{ + if ( selfPtr == NULL || *selfPtr == NULL ) + { + return; + } + + fclose( ( *selfPtr )->file ); + free( ( *selfPtr )->file_path ); + free( *selfPtr ); + *selfPtr = NULL; + + return; +} + + +/*---------------------------------------------------------------------* + * IsmFileReader_getFilePath() + * + *---------------------------------------------------------------------*/ + +const char *IsmFileReader_getFilePath( + IsmFileReader *self /* i/o: IsmFileReader handle */ +) +{ + if ( self == NULL ) + { + return NULL; + } + + return self->file_path; +} diff --git a/lib_util/ism_file_reader.h b/lib_util/ism_file_reader.h new file mode 100644 index 0000000000000000000000000000000000000000..8ddb67704e4db1c30bddb2e3dd207a226b6de90e --- /dev/null +++ b/lib_util/ism_file_reader.h @@ -0,0 +1,65 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#ifndef IVAS_ISM_FILE_READER_H +#define IVAS_ISM_FILE_READER_H + +#include "common_api_types.h" + +/* clang-format off */ + +typedef struct IsmFileReader IsmFileReader; + + +/*! r: IsmFileReader handle */ +IsmFileReader *IsmFileReader_open( + const char *filePath /* i : path to ISM metadata file */ +); + +/*! r: error code */ +ivas_error IsmFileReader_readNextFrame( + IsmFileReader *self, /* i/o: IsmFileReader handle */ + IVAS_ISM_METADATA *ismMetadata /* o : ISM metadata read from the opened file */ +); + +void IsmFileReader_close( + IsmFileReader **selfPtr /* i/o: pointer to IsmFileReader handle */ +); + +/*! r: path to the currently opened file or NULL if `self` is NULL */ +const char *IsmFileReader_getFilePath( + IsmFileReader* self /* i/o: IsmFileReader handle */ +); +/* clang-format on */ + + +#endif /* IVAS_ISM_FILE_READER_H */ diff --git a/lib_util/ism_file_writer.c b/lib_util/ism_file_writer.c new file mode 100644 index 0000000000000000000000000000000000000000..ca845323e72b69afa5c0cd9c1bb1b7228c136676 --- /dev/null +++ b/lib_util/ism_file_writer.c @@ -0,0 +1,170 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include "ism_file_writer.h" +#include +#include + + +#define META_LINE_LENGTH 200 /* max number of characters at one line of metadata input/output file */ + + +struct IsmFileWriter +{ + FILE *file; + char *file_path; +}; + +/*---------------------------------------------------------------------* + * IsmFileWriter_open() + * + * Allocates memory for an IsmFileReader and opens the file at given path for writing. + *---------------------------------------------------------------------*/ + +/*! r: error code */ +ivas_error IsmFileWriter_open( + const char *filePathWav, /* i : path to output file */ + const int16_t obj_num, /* i : number of ISM channels */ + IsmFileWriter **ismWriter /* o : IsmFileWriter handle */ +) +{ + char filePath[FILENAME_MAX], metadata_filename_loc[FILENAME_MAX - 12], ext_meta[16]; + IsmFileWriter *self; + FILE *file; + + strncpy( metadata_filename_loc, filePathWav, sizeof( metadata_filename_loc ) - 1 ); + snprintf( ext_meta, sizeof( ext_meta ), ".%d.csv", obj_num ); + const int32_t maxNumCharactersToAppend = (int32_t) ( sizeof( metadata_filename_loc ) - strlen( metadata_filename_loc ) - 1 ); + strncat( metadata_filename_loc, ext_meta, maxNumCharactersToAppend ); + + strcpy( filePath, metadata_filename_loc ); + metadata_filename_loc[strlen( metadata_filename_loc ) - strlen( ext_meta )] = '\0'; + + if ( strlen( filePathWav ) < 1 ) + { + return IVAS_ERR_FAILED_FILE_OPEN; + } + + file = fopen( filePath, "w" ); + + if ( !file ) + { + return IVAS_ERR_FAILED_FILE_OPEN; + } + + self = calloc( sizeof( IsmFileWriter ), 1 ); + self->file = file; + self->file_path = calloc( sizeof( char ), strlen( filePath ) + 1 ); + strcpy( self->file_path, filePath ); + + *ismWriter = self; + + return IVAS_ERR_OK; +} + +/*---------------------------------------------------------------------* + * IsmFileWriter_writeFrame() + * + * Writes ISM metadata into a previously opened file + *---------------------------------------------------------------------*/ + +/*! r: error code */ +ivas_error IsmFileWriter_writeFrame( + const IVAS_ISM_METADATA ismMetadata, /* i : decoded ISM metadata */ + IsmFileWriter *ismWriter /* o : IsmFileReader handle */ +) +{ + char char_buff[META_LINE_LENGTH]; + FILE *file; + + if ( ismWriter->file == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + file = ismWriter->file; + + snprintf( char_buff, sizeof( char_buff ), "%+07.2f,%+06.2f,%05.2f,%06.2f,%04.2f,%+07.2f,%+06.2f,%d\n", ismMetadata.azimuth, ismMetadata.elevation, ismMetadata.radius, ismMetadata.spread, ismMetadata.gainFactor, ismMetadata.yaw, ismMetadata.pitch, ismMetadata.non_diegetic_flag ); + if ( file ) + { + fputs( char_buff, file ); + } + else + { + return IVAS_ERR_FAILED_FILE_WRITE; + } + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * IsmFileWriter_close() + * + * De-allocates all underlying memory of an IsmFileWriter. + *---------------------------------------------------------------------*/ + +void IsmFileWriter_close( + IsmFileWriter **ismWriter /* i/o: pointer to IsmFileWriter handle */ +) +{ + if ( ismWriter == NULL || *ismWriter == NULL ) + { + return; + } + + fclose( ( *ismWriter )->file ); + free( ( *ismWriter )->file_path ); + free( *ismWriter ); + *ismWriter = NULL; + + return; +} + + +/*---------------------------------------------------------------------* + * IsmFileWriter_getFilePath() + * + *---------------------------------------------------------------------*/ + +/*! r: path to the currently opened file or NULL if `ismWriter` is NULL */ +const char *IsmFileWriter_getFilePath( + IsmFileWriter *ismWriter /* i/o: IsmFileWriter handle */ +) +{ + if ( ismWriter == NULL ) + { + return NULL; + } + + return ismWriter->file_path; +} diff --git a/lib_util/ism_file_writer.h b/lib_util/ism_file_writer.h new file mode 100644 index 0000000000000000000000000000000000000000..d9f731e87e56b8f0b333d725d813047320d82a39 --- /dev/null +++ b/lib_util/ism_file_writer.h @@ -0,0 +1,68 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#ifndef IVAS_ISM_FILE_WRITER_H +#define IVAS_ISM_FILE_WRITER_H + +#include "common_api_types.h" + + +typedef struct IsmFileWriter IsmFileWriter; + +/* clang-format off */ + +/*! r: error code */ +ivas_error IsmFileWriter_open( + const char *filePathWav, /* i : path to output file */ + const int16_t obj_num, /* i : number of ISM channels */ + IsmFileWriter **ismWriter /* o : IsmFileReader handle */ +); + +/*! r: error code */ +ivas_error IsmFileWriter_writeFrame( + const IVAS_ISM_METADATA ismMetadata, /* i : decoded ISM metadata */ + IsmFileWriter *ismWriter /* o : IsmFileWriter handle */ +); + +void IsmFileWriter_close( + IsmFileWriter **ismWriter /* i/o: pointer to IsmFileWriter handle */ +); + +/*! r: path to the currently opened file or NULL if `ismWriter` is NULL */ +const char *IsmFileWriter_getFilePath( + IsmFileWriter *ismWriter /* i : IsmFileWriter handle */ +); + + +/* clang-format on */ + +#endif /* IVAS_ISM_FILE_WRITER_H */ diff --git a/lib_util/jbm_file_reader.c b/lib_util/jbm_file_reader.c new file mode 100644 index 0000000000000000000000000000000000000000..1be5c223658691c85b01d403c1ea79f330e82658 --- /dev/null +++ b/lib_util/jbm_file_reader.c @@ -0,0 +1,180 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include "jbm_file_reader.h" +#include "cmdl_tools.h" +#include +#include + +struct JbmFileReader +{ + FILE *file; + char *file_path; +}; + + +/*---------------------------------------------------------------------* + * JbmFileReader_open() + * + * Allocates memory for an JbmFileReader and opens the file at given path for reading. + *---------------------------------------------------------------------*/ + +/*! r: JbmFileReader handle */ +JbmFileReader *JbmFileReader_open( + const char *filePath /* i : path to CA config file */ +) +{ + JbmFileReader *self; + FILE *file; + + if ( !filePath ) + { + return NULL; + } + + file = fopen( filePath, "rb" ); + + if ( !file ) + { + return NULL; + } + + self = calloc( sizeof( JbmFileReader ), 1 ); + self->file = file; + self->file_path = calloc( sizeof( char ), strlen( filePath ) + 1 ); + strcpy( self->file_path, filePath ); + + return self; +} + + +/*---------------------------------------------------------------------* + * JbmFileReader_readCAconfig() + * + * Read Chanel-aware config. entry + *---------------------------------------------------------------------*/ + +ivas_error JbmFileReader_readCAconfig( + JbmFileReader *self, /* i/o: JbmFileReader handle */ + IVAS_ENC_CHANNEL_AWARE_CONFIG *caConfig /* i/o: configuration of channel-aware mode */ +) +{ + char rline[10], str[4]; + int16_t tmp; + + /* Initialize */ + caConfig->fec_offset = 0; + caConfig->fec_indicator = IVAS_ENC_FEC_HI; + + while ( fgets( rline, 10, self->file ) == NULL && feof( self->file ) ) + { + rewind( self->file ); + } + + if ( sscanf( rline, "%s %hd", str, &tmp ) != 2 ) + { + fprintf( stderr, "Error in the RF configuration file. There is no proper configuration line.\n" ); + return IVAS_ERR_INVALID_FEC_CONFIG; + } + + /* Read RF FEC indicator */ + to_upper( str ); + + if ( strcmp( str, "HI" ) == 0 ) + { + caConfig->fec_indicator = IVAS_ENC_FEC_HI; + } + else if ( strcmp( str, "LO" ) == 0 ) + { + caConfig->fec_indicator = IVAS_ENC_FEC_LO; + } + else + { + fprintf( stderr, "Error: Incorrect FEC indicator string. Exiting the encoder.\n" ); + return IVAS_ERR_INVALID_FEC_CONFIG; + } + + /* Read RF FEC offset */ + if ( tmp == 0 || tmp == 2 || tmp == 3 || tmp == 5 || tmp == 7 ) + { + caConfig->fec_offset = tmp; + } + else + { + fprintf( stderr, "Error: incorrect FEC offset specified in the RF configuration file; RF offset can be 2, 3, 5, or 7. \n" ); + return IVAS_ERR_INVALID_FEC_CONFIG; + } + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * JbmFileReader_close() + * + * De-allocates all underlying memory of an JbmFileReader. + *---------------------------------------------------------------------*/ + +void JbmFileReader_close( + JbmFileReader **selfPtr /* i/o: pointer to JbmFileReader handle */ +) +{ + if ( selfPtr == NULL || *selfPtr == NULL ) + { + return; + } + + fclose( ( *selfPtr )->file ); + free( ( *selfPtr )->file_path ); + free( *selfPtr ); + *selfPtr = NULL; + + return; +} + + +/*---------------------------------------------------------------------* + * JbmFileReader_getFilePath() + * + *---------------------------------------------------------------------*/ + +const char *JbmFileReader_getFilePath( + JbmFileReader *self /* i/o: JbmFileReader handle */ +) +{ + if ( self == NULL ) + { + return NULL; + } + + return self->file_path; +} diff --git a/lib_util/jbm_file_reader.h b/lib_util/jbm_file_reader.h new file mode 100644 index 0000000000000000000000000000000000000000..64d2d17e45efdf246ab05ec56de690c5fd252b70 --- /dev/null +++ b/lib_util/jbm_file_reader.h @@ -0,0 +1,65 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#ifndef IVAS_JBM_FILE_READER_H +#define IVAS_JBM_FILE_READER_H + +#include "common_api_types.h" + +/* clang-format off */ + +typedef struct JbmFileReader JbmFileReader; + + +/*! r: JbmFileReader handle */ +JbmFileReader *JbmFileReader_open( + const char *filePath /* i : path to CA config file */ +); + +ivas_error JbmFileReader_readCAconfig( + JbmFileReader* self, /* i/o: JbmFileReader handle */ + IVAS_ENC_CHANNEL_AWARE_CONFIG *caConfig /* i/o: configuration of channel-aware mode */ +); + +void JbmFileReader_close( + JbmFileReader **selfPtr /* i/o: pointer to JbmFileReader handle */ +); + +/*! r: path to the currently opened file or NULL if `self` is NULL */ +const char *JbmFileReader_getFilePath( + JbmFileReader* self /* i/o: JbmFileReader handle */ +); + + +/* clang-format on */ + +#endif /* IVAS_JBM_FILE_READER_H */ diff --git a/lib_util/jbm_file_writer.c b/lib_util/jbm_file_writer.c new file mode 100644 index 0000000000000000000000000000000000000000..584a22bc7f97df3c3084e1a4045356f6547e80bf --- /dev/null +++ b/lib_util/jbm_file_writer.c @@ -0,0 +1,291 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include "jbm_file_writer.h" +#include +#include + + +struct JbmOffsetFileWriter +{ + FILE *file; + char *file_path; +}; + +#ifdef SUPPORT_JBM_TRACEFILE +struct JbmTraceFileWriter +{ + FILE *file; + char *file_path; +}; +#endif + + +/*---------------------------------------------------------------------* + * JbmOffsetFileWriter_open() + * + * Allocates memory for an JbmOffsetFileReader and opens the file at given path for writing. + *---------------------------------------------------------------------*/ + +/*! r: error code */ +ivas_error JbmOffsetFileWriter_open( + const char *jbmOffsetFilename, /* i : path to output JBM offset file */ + JbmOffsetFileWriter **jbmOffsetWriter /* o : JbmOffsetFileWriter handle */ +) +{ + JbmOffsetFileWriter *self; + FILE *file; + + if ( strlen( jbmOffsetFilename ) < 1 ) + { + return IVAS_ERR_FAILED_FILE_OPEN; + } + + file = fopen( jbmOffsetFilename, "w" ); + + if ( !file ) + { + return IVAS_ERR_FAILED_FILE_OPEN; + } + + self = calloc( sizeof( JbmOffsetFileWriter ), 1 ); + self->file = file; + self->file_path = calloc( sizeof( char ), strlen( jbmOffsetFilename ) + 1 ); + strcpy( self->file_path, jbmOffsetFilename ); + + *jbmOffsetWriter = self; + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * JbmOffsetFileWriter_writeFrame() + * + * Writes JBM offset to a previously opened file. + *---------------------------------------------------------------------*/ + +/*! r: error code */ +ivas_error JbmOffsetFileWriter_writeFrame( + const int16_t FEC_hi, + int16_t optimum_offset, + JbmOffsetFileWriter *jbmOffsetWriter /* i/o: JbmOffsetFileWriter handle */ +) +{ + FILE *file; + + if ( jbmOffsetWriter->file == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + file = jbmOffsetWriter->file; + + if ( file ) + { + if ( FEC_hi == 1 ) + { + fprintf( file, "HI " ); + } + else + { + fprintf( file, "LO " ); + } + + if ( optimum_offset == 1 || optimum_offset == 2 ) + { + optimum_offset = 2; + } + else if ( optimum_offset == 3 || optimum_offset == 4 ) + { + optimum_offset = 3; + } + else if ( optimum_offset == 5 || optimum_offset == 6 ) + { + optimum_offset = 5; + } + else if ( optimum_offset >= 7 ) + { + optimum_offset = 7; + } + + fprintf( file, "%d\n", optimum_offset ); + } + else + { + return IVAS_ERR_FAILED_FILE_WRITE; + } + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * JbmOffsetFileWriter_close() + * + * De-allocates all underlying memory of an JbmOffsetFileWriter. + *---------------------------------------------------------------------*/ + +void JbmOffsetFileWriter_close( + JbmOffsetFileWriter **jbmOffsetWriter /* i/o: pointer to JbmOffsetFileWriter handle */ +) +{ + if ( jbmOffsetWriter == NULL || *jbmOffsetWriter == NULL ) + { + return; + } + + fclose( ( *jbmOffsetWriter )->file ); + free( ( *jbmOffsetWriter )->file_path ); + free( *jbmOffsetWriter ); + *jbmOffsetWriter = NULL; + + return; +} + + +#ifdef SUPPORT_JBM_TRACEFILE + +/*---------------------------------------------------------------------* + * JbmTraceFileWriter_open() + * + * Allocates memory for an JbmTraceFileReader and opens the file at given path for writing. + *---------------------------------------------------------------------*/ + +/*! r: error code */ +ivas_error JbmTraceFileWriter_open( + const char *jbmTraceFilename, /* i : path to output JBM tracefile */ + JbmTraceFileWriter **jbmTraceWriter /* o : JbmFileWriter handle */ +) +{ + JbmTraceFileWriter *self; + FILE *file; + + if ( strlen( jbmTraceFilename ) < 1 ) + { + return IVAS_ERR_FAILED_FILE_OPEN; + } + + file = fopen( jbmTraceFilename, "w" ); + + if ( !file ) + { + return IVAS_ERR_FAILED_FILE_OPEN; + } + + fprintf( file, "#rtpSeqNo;rtpTs;rcvTime;playTime;active\n" ); + + self = calloc( sizeof( JbmTraceFileWriter ), 1 ); + self->file = file; + self->file_path = calloc( sizeof( char ), strlen( jbmTraceFilename ) + 1 ); + strcpy( self->file_path, jbmTraceFilename ); + + *jbmTraceWriter = self; + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * JbmTraceFileWriter_writeFrame() + * + * Writes JBM Tracefile data to a previously opened file. + *---------------------------------------------------------------------*/ + +/*! r: error code */ +ivas_error JbmTraceFileWriter_writeFrame( + const IVAS_JBM_TRACE_DATA *data, /* i : JBM trace data */ + JbmTraceFileWriter *jbmTraceWriter /* o : JbmTraceFileWriter handle */ +) +{ + FILE *file; + + if ( jbmTraceWriter->file == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + file = jbmTraceWriter->file; + + if ( file ) + { + /* the first sample of the decoded/concealed frame will be played after the samples in the ring buffer */ + double playTime = data->systemTimestamp_ms + data->extBufferedSamples * 1000.0 / data->output_Fs; + /* rtpSeqNo;rtpTs;rcvTime;playTime;active\n */ + if ( data->dataUnit_flag ) + { + if ( data->partial_frame == 1 ) + { + fprintf( file, "%d;%d;%d;%f;%d;%d\n", -1, -1, -1, playTime, data->lastDecodedWasActive, data->partialCopyOffset ); + } + else + { + fprintf( file, "%u;%u;%u;%f;%d\n", data->sequenceNumber, data->timeStamp, data->rcvTime, playTime, data->lastDecodedWasActive ); + } + } + else + { + fprintf( file, "%d;%d;%d;%f;%d\n", -1, -1, -1, playTime, data->lastDecodedWasActive ); + } + } + else + { + return IVAS_ERR_FAILED_FILE_WRITE; + } + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * JbmTraceFileWriter_close() + * + * De-allocates all underlying memory of an JbmTraceFileWriter. + *---------------------------------------------------------------------*/ + +void JbmTraceFileWriter_close( + JbmTraceFileWriter **jbmTraceWriter /* i/o: pointer to JbmTraceFileWriter handle */ +) +{ + if ( jbmTraceWriter == NULL || *jbmTraceWriter == NULL ) + { + return; + } + + fclose( ( *jbmTraceWriter )->file ); + free( ( *jbmTraceWriter )->file_path ); + free( *jbmTraceWriter ); + *jbmTraceWriter = NULL; + + return; +} +#endif diff --git a/lib_util/jbm_file_writer.h b/lib_util/jbm_file_writer.h new file mode 100644 index 0000000000000000000000000000000000000000..c82c38e0f9bcbfd9b039a5c31a4b863900e21139 --- /dev/null +++ b/lib_util/jbm_file_writer.h @@ -0,0 +1,84 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#ifndef IVAS_JBM_FILE_WRITER_H +#define IVAS_JBM_FILE_WRITER_H + +#include "common_api_types.h" + +/* clang-format off */ + + +typedef struct JbmOffsetFileWriter JbmOffsetFileWriter; +#ifdef SUPPORT_JBM_TRACEFILE +typedef struct JbmTraceFileWriter JbmTraceFileWriter; +#endif + + +ivas_error JbmOffsetFileWriter_open( + const char *jbmOffsetFilename, /* i : path to output JBM offset file */ + JbmOffsetFileWriter **jbmOffsetWriter /* o : JbmOffsetFileWriter handle */ +); + +/*! r: error code */ +ivas_error JbmOffsetFileWriter_writeFrame( + const int16_t FEC_hi, + int16_t optimum_offset, + JbmOffsetFileWriter *jbmOffsetWriter /* o : JbmTOffsetFileWriter handle */ +); + +void JbmOffsetFileWriter_close( + JbmOffsetFileWriter **jbmOffsetWriter /* i/o: pointer to JbmOffsetFileWriter handle */ +); + + +#ifdef SUPPORT_JBM_TRACEFILE +/*! r: error code */ +ivas_error JbmTraceFileWriter_open( + const char *jbmTraceFilename, /* i : path to output JBM tracefile */ + JbmTraceFileWriter **jbmTraceWriter /* o : JbmTraceFileWriter handle */ +); + +/*! r: error code */ +ivas_error JbmTraceFileWriter_writeFrame( + const IVAS_JBM_TRACE_DATA *JbmTraceData, /* i : JBM data */ + JbmTraceFileWriter *jbmWriter /* o : JbmTraceFileWriter handle */ +); + +void JbmTraceFileWriter_close( + JbmTraceFileWriter **jbmTraceWriter /* i/o: pointer to JbmTraceFileWriter handle */ +); +#endif + +/* clang-format on */ + +#endif /* IVAS_JBM_FILE_WRITER_H */ diff --git a/lib_util/ls_custom_file_reader.c b/lib_util/ls_custom_file_reader.c new file mode 100644 index 0000000000000000000000000000000000000000..9b39fab486bd99ab3259fc5dd6770351792e1e6e --- /dev/null +++ b/lib_util/ls_custom_file_reader.c @@ -0,0 +1,403 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include "ls_custom_file_reader.h" +#include +#include +#include "ivas_prot.h" +#include "prot.h" + + +struct LsCustomFileReader +{ + FILE *file; + char *file_path; +}; + + +/*-----------------------------------------------------------------------* + * CustomLsReader_open() + * + * Allocate and initialize Custom LS layout reader + *-----------------------------------------------------------------------*/ + +ivas_error CustomLsReader_open( + const char *LsFilePath, /* i : LS custom layout file name */ + LsCustomFileReader **hLsCustomReader /* o : LsCustomFileReader handle */ +) +{ + LsCustomFileReader *self; + FILE *lsFile; + + /* Open trajectory file */ + if ( strlen( LsFilePath ) < 1 ) + { + return IVAS_ERR_FAILED_FILE_OPEN; + } + + lsFile = fopen( LsFilePath, "r" ); + + if ( !lsFile ) + { + return IVAS_ERR_FAILED_FILE_OPEN; + } + + self = calloc( sizeof( LsCustomFileReader ), 1 ); + self->file = lsFile; + self->file_path = calloc( sizeof( char ), strlen( LsFilePath ) + 1 ); + strcpy( self->file_path, LsFilePath ); + + *hLsCustomReader = self; + + return IVAS_ERR_OK; +} + + +/*-----------------------------------------------------------------------* + * CustomLsReader_close() + * + * Deallocates memory for the Custom LS layout reader + *-----------------------------------------------------------------------*/ + +void CustomLsReader_close( + LsCustomFileReader **hLsCustomReader /* i/o: LsCustomFileReader handle */ +) +{ + if ( hLsCustomReader == NULL || *hLsCustomReader == NULL ) + { + return; + } + + fclose( ( *hLsCustomReader )->file ); + free( ( *hLsCustomReader )->file_path ); + free( *hLsCustomReader ); + *hLsCustomReader = NULL; + + return; +} + + +/*-------------------------------------------------------------------------* + * CustomLoudspeakerLayout_validate() + * + * Validate values for a custom loudspeaker setup + *-------------------------------------------------------------------------*/ + +static LS_CUSTOM_FILEREADER_ERROR CustomLoudspeakerLayout_validate( + int16_t *num_azi, /* i : Number of azimuth loudspeakers */ + int16_t *num_ele, /* i : Number of elevation loudspeakers */ + float *azi, /* i : Loudspeaker azimuths */ + float *ele, /* i : Loudspeaker elevations */ + const int16_t num_lfe /* i : Number of LFE channels */ +) +{ + int16_t i, j; + int16_t dup_count; + int16_t dup[IVAS_MAX_OUTPUT_CHANNELS]; + float azi_tmp[IVAS_MAX_OUTPUT_CHANNELS]; + float ele_tmp[IVAS_MAX_OUTPUT_CHANNELS]; + + if ( *num_azi != *num_ele ) + { + return LS_CUSTOM_FILEREADER_NUM_SPK_MISMATCH_ERROR; + } + + /* IVAS_OUTPUT_SETUP only supports 1 LFE - can be removed in the future */ + if ( num_lfe > 1 ) + { + return LS_CUSTOM_FILEREADER_LFE_NUM_SPK_EXCEEDED_ERROR; + } + + if ( ( *num_azi + num_lfe ) > IVAS_MAX_OUTPUT_CHANNELS ) + { + return LS_CUSTOM_FILEREADER_OUTPUT_NCHAN_EXCEEDED_ERROR; + } + + /* Wrap angles */ + for ( i = 0; i < *num_azi; i++ ) + { + panning_wrap_angles( azi[i], ele[i], &azi[i], &ele[i] ); + } + + /* Check for and flag duplicate loudspeakers */ + dup_count = 0; + set_s( dup, 0, IVAS_MAX_OUTPUT_CHANNELS ); + for ( i = 0; i < *num_azi; i++ ) + { + for ( j = i + 1; j < *num_azi; j++ ) + { + if ( azi[i] == azi[j] && ele[i] == ele[j] ) + { + dup[j] = 1; + } + } + } + + /* Remove duplicates from array */ + set_zero( azi_tmp, IVAS_MAX_OUTPUT_CHANNELS ); + set_zero( ele_tmp, IVAS_MAX_OUTPUT_CHANNELS ); + + for ( i = 0, j = 0; i < *num_azi; i++ ) + { + if ( dup[i] ) + { + dup_count++; + continue; + } + azi_tmp[j] = azi[i]; + ele_tmp[j] = ele[i]; + j++; + } + + ( *num_azi ) -= dup_count; + mvr2r( azi_tmp, azi, IVAS_MAX_OUTPUT_CHANNELS ); + mvr2r( ele_tmp, ele, IVAS_MAX_OUTPUT_CHANNELS ); + + return LS_CUSTOM_FILEREADER_NO_ERROR; +} + + +/*-------------------------------------------------------------------------* + * CustomLoudspeakerLayout_print_info() + * + * Print information for a custom loudspeaker setup + *-------------------------------------------------------------------------*/ + +static void CustomLoudspeakerLayout_print_info( + const IVAS_CUSTOM_LS_DATA *hLsCustomData /* i : Custom loudspeaker setup data */ +) +{ + int16_t i; + + fprintf( stdout, "\nCustom Loudspeaker configuration:" ); + fprintf( stdout, "\n AZI, ELE " ); + for ( i = 0; i < hLsCustomData->num_spk; i++ ) + { + fprintf( stdout, "\n(% 4.0f, % 4.0f)", hLsCustomData->azimuth[i], hLsCustomData->elevation[i] ); + } + + if ( hLsCustomData->num_lfe > 0 ) + { + fprintf( stdout, "\nLFE indice(s):" ); + for ( i = 0; i < ( hLsCustomData->num_lfe - 1 ); i++ ) + { + fprintf( stdout, " % 2d,", hLsCustomData->lfe_idx[i] ); + } + fprintf( stdout, " % 2d", hLsCustomData->lfe_idx[i] ); + } + + fprintf( stdout, "\n" ); + + return; +} + + +/*-------------------------------------------------------------------------* + * CustomLsFileReading() + * + * Parse a custom loudspeaker setup file data + *-------------------------------------------------------------------------*/ + +LS_CUSTOM_FILEREADER_ERROR CustomLsFileReading( + LsCustomFileReader *hLsCustomReader, /* i/o: LsCustomFileReader handle */ + IVAS_CUSTOM_LS_DATA *hLsCustomData /* o : Custom loudspeaker setup data */ +) +{ + LS_CUSTOM_FILEREADER_ERROR error; + + char line[200]; /* > (10 chars * IVAS_MAX_OUTPUT_CHANNELS) i.e. "-999, " */ + const char *tok; + + int16_t num_azi, num_ele, num_lfe; + + /* initialize variables */ + num_azi = 0; + num_ele = 0; + num_lfe = 0; + + set_zero( hLsCustomData->azimuth, IVAS_MAX_OUTPUT_CHANNELS ); + set_zero( hLsCustomData->elevation, IVAS_MAX_OUTPUT_CHANNELS ); + set_s( hLsCustomData->lfe_idx, -1, IVAS_MAX_OUTPUT_CHANNELS ); + + if ( hLsCustomReader->file == NULL ) + { + return LS_CUSTOM_FILEREADER_NULL_PTR; + } + + /* parse loudspeaker azimuths */ + if ( ( fgets( line, 200, hLsCustomReader->file ) == NULL ) || ( strcmp( line, "\n" ) == 0 ) || ( strcmp( line, "\r\n" ) == 0 ) ) + { + fclose( hLsCustomReader->file ); + + return LS_CUSTOM_FILEREADER_EOF_ERROR; + } + + for ( tok = strtok( line, "," ); tok && *tok; tok = strtok( NULL, ",\n" ) ) + { + while ( *tok == ' ' ) + { + tok++; + } + + if ( *tok == '\0' ) // replace by isEmptyString() + { + continue; + } + + if ( num_azi >= IVAS_MAX_OUTPUT_CHANNELS ) + { + return LS_CUSTOM_FILEREADER_AZI_NUM_SPK_EXCEEDED_ERROR; + } + else + { + hLsCustomData->azimuth[num_azi] = (float) atof( tok ); + num_azi++; + } + } + + /* parse loudspeaker elevations */ + if ( ( fgets( line, 200, hLsCustomReader->file ) == NULL ) || ( strcmp( line, "\n" ) == 0 ) || ( strcmp( line, "\r\n" ) == 0 ) ) + { + return LS_CUSTOM_FILEREADER_EOF_ERROR; + } + + for ( tok = strtok( line, "," ); tok && *tok; tok = strtok( NULL, ",\n" ) ) + { + while ( *tok == ' ' ) + { + tok++; + } + + if ( *tok == '\0' ) + { + continue; + } + + if ( num_ele >= IVAS_MAX_OUTPUT_CHANNELS ) + { + return LS_CUSTOM_FILEREADER_ELE_NUM_SPK_EXCEEDED_ERROR; + } + else + { + hLsCustomData->elevation[num_ele] = (float) atof( tok ); + num_ele++; + } + } + + /* parse LFE indices; skip if blank line */ + if ( ( fgets( line, 200, hLsCustomReader->file ) != NULL ) && ( strcmp( line, "\n" ) != 0 ) && ( strcmp( line, "\r\n" ) != 0 ) ) + { + for ( tok = strtok( line, "," ); tok && *tok; tok = strtok( NULL, ",\n" ) ) + { + while ( *tok == ' ' ) + { + tok++; + } + + if ( *tok == '\0' ) + { + continue; + } + + if ( num_lfe > IVAS_MAX_OUTPUT_CHANNELS ) + { + return LS_CUSTOM_FILEREADER_LFE_NUM_SPK_EXCEEDED_ERROR; + } + else + { + hLsCustomData->lfe_idx[num_lfe] = (int16_t) atoi( tok ); + if ( hLsCustomData->lfe_idx[num_lfe] < 0 || hLsCustomData->lfe_idx[num_lfe] > ( IVAS_MAX_OUTPUT_CHANNELS - 1 ) ) + { + return LS_CUSTOM_FILEREADER_LFE_INDEX_ERROR; + } + num_lfe++; + } + } + } + + /* Perform validation */ + if ( ( error = CustomLoudspeakerLayout_validate( &num_azi, &num_ele, hLsCustomData->azimuth, hLsCustomData->elevation, num_lfe ) ) != LS_CUSTOM_FILEREADER_NO_ERROR ) + { + return error; + } + + /* Loudspeaker azimuths and elevations */ + hLsCustomData->num_spk = num_azi; + + /* Loudspeaker LFE */ + hLsCustomData->num_lfe = num_lfe; + + /* Print information about setup */ + CustomLoudspeakerLayout_print_info( hLsCustomData ); + + return LS_CUSTOM_FILEREADER_NO_ERROR; +} + + +/*-------------------------------------------------------------------------* + * CustomLoudspeakerLayout_getError() + * + * Retrun error message for custom loudspeaker setup error + *-------------------------------------------------------------------------*/ + +/*!r : custom LS error message */ +const char *CustomLoudspeakerLayout_getError( + LS_CUSTOM_FILEREADER_ERROR error /* i : custom LS error */ +) +{ + switch ( error ) + { + case LS_CUSTOM_FILEREADER_NO_ERROR: + return "no error"; + case LS_CUSTOM_FILEREADER_NULL_PTR: + return "unexpected NULL pointer"; + case LS_CUSTOM_FILEREADER_EOF_ERROR: + return "early or unexpected EOF"; + case LS_CUSTOM_FILEREADER_AZI_NUM_SPK_EXCEEDED_ERROR: + return "too many azimuth positions specified"; + case LS_CUSTOM_FILEREADER_ELE_NUM_SPK_EXCEEDED_ERROR: + return "too many elevation positions specified"; + case LS_CUSTOM_FILEREADER_LFE_NUM_SPK_EXCEEDED_ERROR: + return "only one LFE channel index is supported"; + case LS_CUSTOM_FILEREADER_LFE_INDEX_ERROR: + return "invalid or negative LFE index specified"; + case LS_CUSTOM_FILEREADER_NUM_SPK_MISMATCH_ERROR: + return "mismatch between specified number of azimuth and elevation positions"; + case LS_CUSTOM_FILEREADER_OUTPUT_NCHAN_EXCEEDED_ERROR: + return "too many output channels specified"; + case LS_CUSTOM_FILEREADER_MALLOC_ERROR: + return "error allocating memory"; + case LS_CUSTOM_FILEREADER_UNKNOWN_ERROR: + default: + return "unknown error"; + } +} diff --git a/lib_util/ls_custom_file_reader.h b/lib_util/ls_custom_file_reader.h new file mode 100644 index 0000000000000000000000000000000000000000..df7fe6bde7a929cb7dff5ae4a4e17d34ab0b58eb --- /dev/null +++ b/lib_util/ls_custom_file_reader.h @@ -0,0 +1,103 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#ifndef IVAS_LS_CUSTOM_FILE_READER_H +#define IVAS_LS_CUSTOM_FILE_READER_H + +#include "common_api_types.h" + + +typedef struct LsCustomFileReader LsCustomFileReader; + + +typedef enum _LS_CUSTOM_FILEREADER_ERROR +{ + LS_CUSTOM_FILEREADER_NO_ERROR = 0x0000, + LS_CUSTOM_FILEREADER_NULL_PTR = 0x0001, + LS_CUSTOM_FILEREADER_EOF_ERROR = 0x0002, + LS_CUSTOM_FILEREADER_AZI_NUM_SPK_EXCEEDED_ERROR = 0x0003, + LS_CUSTOM_FILEREADER_ELE_NUM_SPK_EXCEEDED_ERROR = 0x0004, + LS_CUSTOM_FILEREADER_LFE_NUM_SPK_EXCEEDED_ERROR = 0x0005, + LS_CUSTOM_FILEREADER_LFE_INDEX_ERROR = 0x0006, + LS_CUSTOM_FILEREADER_NUM_SPK_MISMATCH_ERROR = 0x0007, + LS_CUSTOM_FILEREADER_OUTPUT_NCHAN_EXCEEDED_ERROR = 0x0008, + LS_CUSTOM_FILEREADER_MALLOC_ERROR = 0x0009, + LS_CUSTOM_FILEREADER_UNKNOWN_ERROR = 0xffff, + +} LS_CUSTOM_FILEREADER_ERROR; + + +/*-----------------------------------------------------------------------* + * CustomLsReader_open() + * + * Allocate and initialize Custom LS layout reader + *-----------------------------------------------------------------------*/ + +ivas_error CustomLsReader_open( + const char *LsFilePath, /* i : LS custom layout file name */ + LsCustomFileReader **hLsCustomReader /* o : LsCustomFileReader handle */ +); + +/*-----------------------------------------------------------------------* + * CustomLsReader_close() + * + * Deallocates memory for the Custom LS layout reader + *-----------------------------------------------------------------------*/ + +void CustomLsReader_close( + LsCustomFileReader **hLsCustomReader /* i/o: LsCustomFileReader handle */ +); + +/*-------------------------------------------------------------------------* + * CustomLsFileReading() + * + * Parse a custom loudspeaker setup file data + *-------------------------------------------------------------------------*/ + +LS_CUSTOM_FILEREADER_ERROR CustomLsFileReading( + LsCustomFileReader *hLsCustomReader, /* i/o: LsCustomFileReader handle */ + IVAS_CUSTOM_LS_DATA *hLsCustomData /* o : Custom loudspeaker setup data */ +); + +/*-------------------------------------------------------------------------* + * CustomLoudspeakerLayout_getError() + * + * Retrun error message for custom loudspeaker setup error + *-------------------------------------------------------------------------*/ + +/*!r : custom LS error message */ +const char *CustomLoudspeakerLayout_getError( + LS_CUSTOM_FILEREADER_ERROR error /* i : custom LS error */ +); + + +#endif /* IVAS_LS_CUSTOM_FILE_READER_H */ diff --git a/lib_util/masa_file_reader.c b/lib_util/masa_file_reader.c new file mode 100644 index 0000000000000000000000000000000000000000..00f3d69a98bdf70515b7630976594d6c6277fad1 --- /dev/null +++ b/lib_util/masa_file_reader.c @@ -0,0 +1,271 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include "masa_file_reader.h" +#include "ivas_prot.h" +#include "ivas_stat_com.h" +#include +#include + + +struct MasaFileReader +{ + FILE *file; + MASA_METADATA_FRAME metadataFrame; + SPHERICAL_GRID_DATA sph_grid16; +}; + +/*------------------------------------------------------------------------- + * MasaFileReader_open() + * + * Allocate and open MasaFileReader handle + *------------------------------------------------------------------------*/ + +MasaFileReader *MasaFileReader_open( + const char *fileName /* i : path to MASA metadata file */ +) +{ + MasaFileReader *self; + FILE *file; + + if ( !fileName ) + { + return NULL; + } + + file = fopen( fileName, "rb" ); + + if ( !file ) + { + return NULL; + } + + self = calloc( sizeof( MasaFileReader ), 1 ); + self->file = file; + generate_gridEq( &self->sph_grid16 ); + + return self; +} + + +/*------------------------------------------------------------------------- + * MasaFileReader_getMetadataHandle() + * + * AGet MasaFileReader handle + *------------------------------------------------------------------------*/ + +IVAS_MASA_METADATA_HANDLE MasaFileReader_getMetadataHandle( + MasaFileReader *self /* i/o: MasaFileReader handle */ +) +{ + if ( self == NULL ) + { + return NULL; + } + + return &self->metadataFrame; +} + + +/*------------------------------------------------------------------------- + * MasaFileReader_readNextFrame() + * + * Read MASA data + *------------------------------------------------------------------------*/ + +ivas_error MasaFileReader_readNextFrame( + MasaFileReader *self /* i/o: MasaFileReader handle */ +) +{ + if ( self == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + const uint8_t ivasmasaFormatDescriptor[8] = { 0x49, 0x56, 0x41, 0x53, 0x4D, 0x41, 0x53, 0x41 }; /* "IVASMASA" */ + uint16_t twoByteBuffer = 0; + int16_t i, j, b; + IVAS_MASA_METADATA_HANDLE hMeta; + FILE *metafile; + uint16_t readIndex[MASA_FREQUENCY_BANDS]; + uint8_t readOther[MASA_FREQUENCY_BANDS]; + + hMeta = &self->metadataFrame; + metafile = self->file; + + /* Read version */ + if ( fread( &hMeta->descriptive_meta.formatDescriptor, sizeof( uint8_t ), 8, metafile ) != 8 ) + { + return IVAS_ERR_FAILED_FILE_READ; + } + + for ( i = 0; i < 8; i++ ) + { + if ( hMeta->descriptive_meta.formatDescriptor[i] != ivasmasaFormatDescriptor[i] ) + { + return IVAS_ERR_INVALID_MASA_FORMAT_METADATA_FILE; + } + } + + /* Read combined descriptive meta */ + if ( fread( &twoByteBuffer, sizeof( uint16_t ), 1, metafile ) != 1 ) + { + return IVAS_ERR_FAILED_FILE_READ; + } + + /* Extract rest of the descriptive meta from the two-byte value */ + hMeta->descriptive_meta.numberOfDirections = ( twoByteBuffer >> 15u ) & 0x1u; + hMeta->descriptive_meta.numberOfChannels = ( twoByteBuffer >> 14u ) & 0x1u; + hMeta->descriptive_meta.sourceFormat = ( twoByteBuffer >> 12u ) & 0x3u; + if ( hMeta->descriptive_meta.sourceFormat == 0x0 || hMeta->descriptive_meta.sourceFormat == 0x1 ) + { + hMeta->descriptive_meta.transportDefinition = ( twoByteBuffer >> 9u ) & 0x7u; + hMeta->descriptive_meta.channelAngle = ( twoByteBuffer >> 6u ) & 0x7u; + hMeta->descriptive_meta.channelDistance = twoByteBuffer & 0x3Fu; + hMeta->descriptive_meta.channelLayout = 0; /* Set to zero as unused */ + } + else if ( hMeta->descriptive_meta.sourceFormat == 0x2 ) + { + hMeta->descriptive_meta.channelLayout = ( twoByteBuffer >> 9u ) & 0x7u; + /* 9 LSB unused */ + hMeta->descriptive_meta.transportDefinition = 0; /* Set to zero as unused */ + hMeta->descriptive_meta.channelAngle = 0; /* Set to zero as unused */ + hMeta->descriptive_meta.channelDistance = 0; /* Set to zero as unused */ + } + else if ( hMeta->descriptive_meta.sourceFormat == 0x3 ) + { + hMeta->descriptive_meta.transportDefinition = ( twoByteBuffer >> 9u ) & 0x7u; + hMeta->descriptive_meta.channelAngle = ( twoByteBuffer >> 6u ) & 0x7u; + /* 6 LSB unused */ + hMeta->descriptive_meta.channelDistance = 0; /* Set to zero as unused */ + hMeta->descriptive_meta.channelLayout = 0; /* Set to zero as unused */ + } + + for ( j = 0; j < MAX_PARAM_SPATIAL_SUBFRAMES; ++j ) + { + /* Read directional spatial meta */ + for ( i = 0; i < hMeta->descriptive_meta.numberOfDirections + 1; ++i ) + { + /* Spherical index */ + if ( fread( readIndex, sizeof( uint16_t ), MASA_FREQUENCY_BANDS, metafile ) != MASA_FREQUENCY_BANDS ) + { + return IVAS_ERR_FAILED_FILE_READ; + } + + for ( b = 0; b < MASA_FREQUENCY_BANDS; b++ ) + { + deindex_sph_idx( readIndex[b], &self->sph_grid16, &( hMeta->directional_meta[i].elevation[j][b] ), &( hMeta->directional_meta[i].azimuth[j][b] ) ); + hMeta->directional_meta[i].spherical_index[j][b] = readIndex[b]; + } + + /* Direct-to-total ratio */ + if ( fread( readOther, sizeof( uint8_t ), MASA_FREQUENCY_BANDS, metafile ) != MASA_FREQUENCY_BANDS ) + { + return IVAS_ERR_FAILED_FILE_READ; + } + + for ( b = 0; b < MASA_FREQUENCY_BANDS; b++ ) + { + hMeta->directional_meta[i].energy_ratio[j][b] = ( (float) readOther[b] ) / UINT8_MAX; + } + + /* Spread coherence */ + if ( fread( readOther, sizeof( uint8_t ), MASA_FREQUENCY_BANDS, metafile ) != MASA_FREQUENCY_BANDS ) + { + return IVAS_ERR_FAILED_FILE_READ; + } + + for ( b = 0; b < MASA_FREQUENCY_BANDS; b++ ) + { + hMeta->directional_meta[i].spread_coherence[j][b] = ( (float) readOther[b] ) / UINT8_MAX; + } + } + + /* Read common spatial meta */ + /* Diffuse-to-total ratio */ + if ( fread( readOther, sizeof( uint8_t ), MASA_FREQUENCY_BANDS, metafile ) != MASA_FREQUENCY_BANDS ) + { + return IVAS_ERR_FAILED_FILE_READ; + } + + for ( b = 0; b < MASA_FREQUENCY_BANDS; b++ ) + { + hMeta->common_meta.diffuse_to_total_ratio[j][b] = ( (float) readOther[b] ) / UINT8_MAX; + } + + /* Surround coherence */ + if ( fread( readOther, sizeof( uint8_t ), MASA_FREQUENCY_BANDS, metafile ) != MASA_FREQUENCY_BANDS ) + { + return IVAS_ERR_FAILED_FILE_READ; + } + + for ( b = 0; b < MASA_FREQUENCY_BANDS; b++ ) + { + hMeta->common_meta.surround_coherence[j][b] = ( (float) readOther[b] ) / UINT8_MAX; + } + + /* Remainder-to-total ratio */ + if ( fread( readOther, sizeof( uint8_t ), MASA_FREQUENCY_BANDS, metafile ) != MASA_FREQUENCY_BANDS ) + { + return IVAS_ERR_FAILED_FILE_READ; + } + + for ( b = 0; b < MASA_FREQUENCY_BANDS; b++ ) + { + hMeta->common_meta.remainder_to_total_ratio[j][b] = ( (float) readOther[b] ) / UINT8_MAX; + } + } + + return IVAS_ERR_OK; +} + +/*------------------------------------------------------------------------- + * MasaFileReader_close() + * + * Close MasaFileReader + *------------------------------------------------------------------------*/ + +void MasaFileReader_close( + MasaFileReader **selfPtr /* i/o: pointer to MasaFileReader handle */ +) +{ + if ( selfPtr == NULL || *selfPtr == NULL ) + { + return; + } + + fclose( ( *selfPtr )->file ); + free( *selfPtr ); + *selfPtr = NULL; + + return; +} diff --git a/lib_util/masa_file_reader.h b/lib_util/masa_file_reader.h new file mode 100644 index 0000000000000000000000000000000000000000..5f3f2fec2a9ce19d539ddad48bc29ba53e3c7b0d --- /dev/null +++ b/lib_util/masa_file_reader.h @@ -0,0 +1,83 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#ifndef IVAS_MASA_FILE_READER_H +#define IVAS_MASA_FILE_READER_H + +#include "common_api_types.h" + + +struct MasaFileReader; +typedef struct MasaFileReader MasaFileReader; + + +/*! r: MasaFileReader handle */ +MasaFileReader *MasaFileReader_open( + const char *fileName /* i : path to MASA metadata file */ +); + +/*---------------------------------------------------------------------* + * MasaFileReader_getMetadataHandle() + * + * Returns a handle to an already allocated MASA metadata frame struct. + * Metadata for each frame is available through this handle after + * MasaFileReader_readNextFrame is called. + *---------------------------------------------------------------------*/ +/*! r: handle to MASA metadata */ +IVAS_MASA_METADATA_HANDLE MasaFileReader_getMetadataHandle( + MasaFileReader *self /* i/o: MasaFileReader handle */ +); + +/*---------------------------------------------------------------------* + * MasaFileReader_readNextFrame() + * + * Reads MASA metadata for one frame from the opened file into the internal + * MASA metadata frame struct. The metadata is available through the struct + * handle returned by MasaFileReader_getMetadataHandle(). + *---------------------------------------------------------------------*/ +/*! r: error code */ +ivas_error MasaFileReader_readNextFrame( + MasaFileReader *self /* i/o: MasaFileReader handle */ +); + +/*---------------------------------------------------------------------* + * MasaFileReader_close() + * + * Deallocate the MasaFileReader. This also includes the MASA metadata + * frame struct available through MasaFileReader_getMetadataHandle. + *---------------------------------------------------------------------*/ +void MasaFileReader_close( + MasaFileReader **selfPtr /* i/o: pointer to MasaFileReader handle */ +); + + +#endif /* IVAS_MASA_FILE_READER_H */ diff --git a/lib_util/masa_file_writer.c b/lib_util/masa_file_writer.c new file mode 100644 index 0000000000000000000000000000000000000000..8b063fe282e3f1fc4f0dd785f0640a3a89b338cc --- /dev/null +++ b/lib_util/masa_file_writer.c @@ -0,0 +1,340 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include "masa_file_writer.h" +#include "ivas_stat_com.h" +#include "ivas_stat_dec.h" +#include "ivas_cnst.h" +#include +#include +#include + +typedef struct masaMetaDelayStorage +{ + MASA_DECRIPTIVE_META descriptiveMeta; + uint16_t directionIndex[MASA_MAXIMUM_DIRECTIONS][DELAY_MASA_PARAM_DEC_SFR][MASA_FREQUENCY_BANDS]; + uint8_t directToTotalRatio[MASA_MAXIMUM_DIRECTIONS][DELAY_MASA_PARAM_DEC_SFR][MASA_FREQUENCY_BANDS]; + uint8_t spreadCoherence[MASA_MAXIMUM_DIRECTIONS][DELAY_MASA_PARAM_DEC_SFR][MASA_FREQUENCY_BANDS]; + uint8_t surroundCoherence[DELAY_MASA_PARAM_DEC_SFR][MASA_FREQUENCY_BANDS]; + uint8_t diffuseToTotalRatio[DELAY_MASA_PARAM_DEC_SFR][MASA_FREQUENCY_BANDS]; + +} MASA_META_DELAY_STORAGE; + +struct MasaFileWriter +{ + FILE *file; + char *file_path; + MASA_META_DELAY_STORAGE *delayStorage; +}; + +/*-----------------------------------------------------------------------* + * Local constants + *-----------------------------------------------------------------------*/ + + +/*-----------------------------------------------------------------------* + * Local functions + *-----------------------------------------------------------------------*/ + +static void getExtMasaMetadataFileName( + const char *outputWavFilename, /* i : name of the output audio file */ + char metadata_filename[IVAS_MAX_NUM_OBJECTS][FILENAME_MAX - 12] /* o : name of the output masa metadata file */ +) +{ + char ext_meta[5]; + + /* sizeof( ext_meta ) accounts for terminating NULL, don't subtract extra 1 */ + const int32_t maxNameLenWithoutExt = sizeof( metadata_filename[0] ) - sizeof( ext_meta ); + strncpy( metadata_filename[0], outputWavFilename, maxNameLenWithoutExt ); + snprintf( ext_meta, sizeof( ext_meta ), ".met" ); + + /* strlen( metadata_filename[0] ) doesn't account for terminating NULL, subtract extra 1 */ + const int32_t maxNumCharactersToAppend = (int32_t) ( sizeof( metadata_filename[0] ) - strlen( metadata_filename[0] ) - 1 ); + strncat( metadata_filename[0], ext_meta, maxNumCharactersToAppend ); + + return; +} + + +static void delayMasaMetadata( + MASA_DECODER_EXT_OUT_META_HANDLE extOutMeta, /* i/o: New input metadata which is inplace replaced with delayed metadata frame */ + MASA_META_DELAY_STORAGE *delayStorage /* i/o: Storage for 10 ms of metadata and related descriptive metadata */ +) +{ + int16_t dir, sf, band; + uint8_t currentNumberOfDirections; + + /* Move meta to delay and output. Always use two directions as the metadata is prepared to contain zero energy second direction + * if there is 1dir meta. */ + for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES - DELAY_MASA_PARAM_DEC_SFR; sf++ ) + { + for ( band = 0; band < MASA_FREQUENCY_BANDS; band++ ) + { + uint16_t temp_u16; + uint8_t temp_u8; + for ( dir = 0; dir < MASA_MAXIMUM_DIRECTIONS; dir++ ) + { + temp_u16 = delayStorage->directionIndex[dir][sf][band]; + delayStorage->directionIndex[dir][sf][band] = extOutMeta->directionIndex[dir][sf + DELAY_MASA_PARAM_DEC_SFR][band]; + extOutMeta->directionIndex[dir][sf + DELAY_MASA_PARAM_DEC_SFR][band] = extOutMeta->directionIndex[dir][sf][band]; + extOutMeta->directionIndex[dir][sf][band] = temp_u16; + + temp_u8 = delayStorage->directToTotalRatio[dir][sf][band]; + delayStorage->directToTotalRatio[dir][sf][band] = extOutMeta->directToTotalRatio[dir][sf + DELAY_MASA_PARAM_DEC_SFR][band]; + extOutMeta->directToTotalRatio[dir][sf + DELAY_MASA_PARAM_DEC_SFR][band] = extOutMeta->directToTotalRatio[dir][sf][band]; + extOutMeta->directToTotalRatio[dir][sf][band] = temp_u8; + + temp_u8 = delayStorage->spreadCoherence[dir][sf][band]; + delayStorage->spreadCoherence[dir][sf][band] = extOutMeta->spreadCoherence[dir][sf + DELAY_MASA_PARAM_DEC_SFR][band]; + extOutMeta->spreadCoherence[dir][sf + DELAY_MASA_PARAM_DEC_SFR][band] = extOutMeta->spreadCoherence[dir][sf][band]; + extOutMeta->spreadCoherence[dir][sf][band] = temp_u8; + } + + temp_u8 = delayStorage->surroundCoherence[sf][band]; + delayStorage->surroundCoherence[sf][band] = extOutMeta->surroundCoherence[sf + DELAY_MASA_PARAM_DEC_SFR][band]; + extOutMeta->surroundCoherence[sf + DELAY_MASA_PARAM_DEC_SFR][band] = extOutMeta->surroundCoherence[sf][band]; + extOutMeta->surroundCoherence[sf][band] = temp_u8; + + temp_u8 = delayStorage->diffuseToTotalRatio[sf][band]; + delayStorage->diffuseToTotalRatio[sf][band] = extOutMeta->diffuseToTotalRatio[sf + DELAY_MASA_PARAM_DEC_SFR][band]; + extOutMeta->diffuseToTotalRatio[sf + DELAY_MASA_PARAM_DEC_SFR][band] = extOutMeta->diffuseToTotalRatio[sf][band]; + extOutMeta->diffuseToTotalRatio[sf][band] = temp_u8; + } + } + + /* Finalize descriptive meta by using new frame except for number of directions which is the larger of the two */ + currentNumberOfDirections = extOutMeta->descriptiveMeta.numberOfDirections; + if ( delayStorage->descriptiveMeta.numberOfDirections > extOutMeta->descriptiveMeta.numberOfDirections ) + { + extOutMeta->descriptiveMeta.numberOfDirections = delayStorage->descriptiveMeta.numberOfDirections; + } + delayStorage->descriptiveMeta.numberOfDirections = currentNumberOfDirections; + + return; +} + + +/*---------------------------------------------------------------------* + * MasaFileWriter_open() + * + * + *---------------------------------------------------------------------*/ + +ivas_error MasaFileWriter_open( + const char *outputWavFilename, /* i : name of the output audio file */ + const bool delayCompensationEnabled, /* i : is delay compensation enabled */ + MasaFileWriter **masaWriter /* o : MasaFileWriter handle */ +) +{ + MasaFileWriter *self; + FILE *file; + char filePath[FILENAME_MAX - 12]; + + if ( strlen( outputWavFilename ) < 1 ) + { + return IVAS_ERR_FAILED_FILE_OPEN; + } + + getExtMasaMetadataFileName( outputWavFilename, &filePath ); + + file = fopen( filePath, "wb" ); + + if ( !file ) + { + return IVAS_ERR_FAILED_FILE_OPEN; + } + + self = calloc( sizeof( MasaFileWriter ), 1 ); + self->file = file; + self->file_path = calloc( sizeof( char ), strlen( filePath ) + 1 ); + strcpy( self->file_path, filePath ); + + if ( !delayCompensationEnabled ) + { + self->delayStorage = calloc( sizeof( MASA_META_DELAY_STORAGE ), 1 ); + } + + *masaWriter = self; + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * MasaFileWriter_writeFrame() + * + * + *---------------------------------------------------------------------*/ + +ivas_error MasaFileWriter_writeFrame( + MasaFileWriter *self, /* i/o: MasaFileWriter handle */ + MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta /* i/o: MASA ext out meta handle to be written */ +) +{ + if ( self == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + uint16_t descMetaTemp = 0; + int16_t i, sf, dir, numDirections; + uint8_t writeTempOther[MASA_FREQUENCY_BANDS]; + + /* If delay storage has been reserved, then we are in the normal mode for the decoder + * (i.e., no delay compensation for PCM) which means that metadata should be delayed + * by two subframes (10 ms). Descriptive metadata is a combined result. */ + if ( self->delayStorage ) + { + delayMasaMetadata( hMasaExtOutMeta, self->delayStorage ); + } + + numDirections = hMasaExtOutMeta->descriptiveMeta.numberOfDirections + 1; + + if ( fwrite( &( hMasaExtOutMeta->descriptiveMeta.formatDescriptor ), sizeof( uint8_t ), 8, self->file ) != 8 ) + { + return IVAS_ERR_FAILED_FILE_WRITE; + } + + descMetaTemp += hMasaExtOutMeta->descriptiveMeta.numberOfDirections << 15u; + descMetaTemp += hMasaExtOutMeta->descriptiveMeta.numberOfChannels << 14u; + descMetaTemp += hMasaExtOutMeta->descriptiveMeta.sourceFormat << 12u; + if ( hMasaExtOutMeta->descriptiveMeta.sourceFormat == 0x0 || hMasaExtOutMeta->descriptiveMeta.sourceFormat == 0x1 ) + { + descMetaTemp += hMasaExtOutMeta->descriptiveMeta.transportDefinition << 9u; + descMetaTemp += hMasaExtOutMeta->descriptiveMeta.channelAngle << 6u; + descMetaTemp += hMasaExtOutMeta->descriptiveMeta.channelDistance; + } + else if ( hMasaExtOutMeta->descriptiveMeta.sourceFormat == 0x2 ) + { + descMetaTemp += hMasaExtOutMeta->descriptiveMeta.channelLayout << 9u; + /* 9 LSB remain at zero */ + } + else if ( hMasaExtOutMeta->descriptiveMeta.sourceFormat == 0x3 ) + { + descMetaTemp += hMasaExtOutMeta->descriptiveMeta.transportDefinition << 9u; + descMetaTemp += hMasaExtOutMeta->descriptiveMeta.channelAngle << 6u; + /* 6 LSB remain at zero */ + } + + if ( fwrite( &( descMetaTemp ), sizeof( uint16_t ), 1, self->file ) != 1 ) + { + return IVAS_ERR_FAILED_FILE_WRITE; + } + + for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) + { + for ( dir = 0; dir < numDirections; dir++ ) + { + /* Spherical index */ + if ( fwrite( hMasaExtOutMeta->directionIndex[dir][sf], sizeof( uint16_t ), MASA_FREQUENCY_BANDS, self->file ) != MASA_FREQUENCY_BANDS ) + { + return IVAS_ERR_FAILED_FILE_WRITE; + } + + /* Direct-to-total ratio */ + if ( fwrite( hMasaExtOutMeta->directToTotalRatio[dir][sf], sizeof( uint8_t ), MASA_FREQUENCY_BANDS, self->file ) != MASA_FREQUENCY_BANDS ) + { + return IVAS_ERR_FAILED_FILE_WRITE; + } + + /* Spread coherence */ + if ( fwrite( hMasaExtOutMeta->spreadCoherence[dir][sf], sizeof( uint8_t ), MASA_FREQUENCY_BANDS, self->file ) != MASA_FREQUENCY_BANDS ) + { + return IVAS_ERR_FAILED_FILE_WRITE; + } + } + + /* Common spatial meta */ + /* Diffuse-to-total ratio = 1 - sum(direct-to-total ratios) */ + if ( fwrite( hMasaExtOutMeta->diffuseToTotalRatio[sf], sizeof( uint8_t ), MASA_FREQUENCY_BANDS, self->file ) != MASA_FREQUENCY_BANDS ) + { + return IVAS_ERR_FAILED_FILE_WRITE; + } + + /* Surround coherence */ + if ( fwrite( hMasaExtOutMeta->surroundCoherence[sf], sizeof( uint8_t ), MASA_FREQUENCY_BANDS, self->file ) != MASA_FREQUENCY_BANDS ) + { + return IVAS_ERR_FAILED_FILE_WRITE; + } + + /* Remainder-to-total ratio */ + /* This is zero after codec */ + for ( i = 0; i < MASA_FREQUENCY_BANDS; i++ ) + { + writeTempOther[i] = 0u; + } + + if ( fwrite( writeTempOther, sizeof( uint8_t ), MASA_FREQUENCY_BANDS, self->file ) != MASA_FREQUENCY_BANDS ) + { + return IVAS_ERR_FAILED_FILE_WRITE; + } + } + + return IVAS_ERR_OK; +} + +/*---------------------------------------------------------------------* + * MasaFileWriter_close() + * + * Deallocate the MasaFileWriter. This also includes the MASA metadata + * frame struct available through MasaFileWriter_getMetadataHandle. + *---------------------------------------------------------------------*/ + +void MasaFileWriter_close( + MasaFileWriter **selfPtr /* i/o: pointer to MasaFileWriter handle */ +) +{ + if ( selfPtr == NULL || *selfPtr == NULL ) + { + return; + } + + fclose( ( *selfPtr )->file ); + free( ( *selfPtr )->file_path ); + free( ( *selfPtr )->delayStorage ); + free( *selfPtr ); + *selfPtr = NULL; + + return; +} + +const char *MasaFileWriter_getFilePath( + MasaFileWriter *selfPtr /* i : MasaFileWriter handle */ +) +{ + if ( selfPtr == NULL ) + { + return NULL; + } + + return selfPtr->file_path; +} diff --git a/lib_util/masa_file_writer.h b/lib_util/masa_file_writer.h new file mode 100644 index 0000000000000000000000000000000000000000..0619ff02e75223df155abd429e9c39967227ceeb --- /dev/null +++ b/lib_util/masa_file_writer.h @@ -0,0 +1,63 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#ifndef IVAS_MASA_FILE_WRITER_H +#define IVAS_MASA_FILE_WRITER_H + +#include "common_api_types.h" +#include + + +struct MasaFileWriter; +typedef struct MasaFileWriter MasaFileWriter; + +ivas_error MasaFileWriter_open( + const char *outputWavFilename, /* i : name of the output audio file */ + const bool delayCompensationEnabled, /* i : is delay compensation enabled */ + MasaFileWriter **masaWriter /* o : MasaFileWriter handle */ +); + +ivas_error MasaFileWriter_writeFrame( + MasaFileWriter *self, /* i/o: MasaFileWriter handle */ + IVAS_MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta /* i/o: MASA ext out meta handle to be written */ +); + +void MasaFileWriter_close( + MasaFileWriter **selfPtr /* i/o: pointer to MasaFileWriter handle */ +); + +const char *MasaFileWriter_getFilePath( + MasaFileWriter *selfPtr /* i : MasaFileWriter handle */ +); + + +#endif /* IVAS_MASA_FILE_WRITER_H */ diff --git a/lib_util/mime_io.c b/lib_util/mime_io.c new file mode 100644 index 0000000000000000000000000000000000000000..b5c257bb49558d5c59d02977a566974ff30b5fb2 --- /dev/null +++ b/lib_util/mime_io.c @@ -0,0 +1,657 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include "mime_io.h" +#include "mime.h" +#include "prot.h" +#include "string.h" +#include +#include +#include + + +#define NUM_CHANNELS 1 + +/* main handle */ +struct MIME_IO +{ + FILE *file; + bool ownFileHandle; /* flag whether FILE handle created by instance or externally */ + uint16_t numChannels; +}; + + +/*-------------------------------------------------------------------* + * writeByte() + * + * function to write a 8-bit value to the file + *-------------------------------------------------------------------*/ + +static bool writeByte( + FILE *file, + unsigned char value ) +{ + if ( fputc( value, file ) == value ) + { + return true; + } + return false; +} + + +/*-------------------------------------------------------------------* + * writeLong() + * + * function to write a 32-bit value to the file + *-------------------------------------------------------------------*/ + +static bool writeLong( + FILE *file, + uint32_t value ) +{ + char buffer[4]; + + buffer[3] = value & 0xff; + buffer[2] = ( value >> 8 ) & 0xff; + buffer[1] = ( value >> 16 ) & 0xff; + buffer[0] = ( value >> 24 ) & 0xff; + + if ( fwrite( buffer, 4, 1, file ) != 1U ) + { + return false; + } + + return true; +} + +/*-------------------------------------------------------------------* + * writeHeader() + * + * Write MIME header + *-------------------------------------------------------------------*/ + +static int16_t writeHeader( + FILE *file ) +{ + /* write mime header */ + fprintf( file, "#!EVS_MC%s\n", "1.0" ); + if ( !writeLong( file, 1 ) ) + { + return 0; + } + return -1; +} + + +/*-------------------------------------------------------------------* + * MIME_Writer_Open_FILE() + * + * Open MIME writer handle + *-------------------------------------------------------------------*/ + +MIME_ERROR MIME_Writer_Open_FILE( MIME_HANDLE *phMIME, FILE *file ) +{ + /* create handle */ + *phMIME = (MIME_HANDLE) calloc( 1, sizeof( struct MIME_IO ) ); + if ( !phMIME ) + { + return MIME_MEMORY_ERROR; + } + + /* open file stream */ + ( *phMIME )->file = file; + if ( ( *phMIME )->file == NULL ) + { + MIME_Writer_Close( phMIME ); + return MIME_WRONG_PARAMS; + } + ( *phMIME )->ownFileHandle = false; + + writeHeader( ( *phMIME )->file ); + + return MIME_NO_ERROR; +} + + +/*-------------------------------------------------------------------* + * MIME_Writer_Open_filename() + * + * Open MIME writer + *-------------------------------------------------------------------*/ + +MIME_ERROR MIME_Writer_Open_filename( + MIME_HANDLE *phMIME, + const char *filename ) +{ + /* create handle */ + *phMIME = (MIME_HANDLE) calloc( 1, sizeof( struct MIME_IO ) ); + if ( !phMIME ) + { + return MIME_MEMORY_ERROR; + } + + /* open file stream */ + ( *phMIME )->file = fopen( filename, "wb" ); + if ( ( *phMIME )->file == NULL ) + { + free( *phMIME ); + *phMIME = NULL; + return MIME_FILE_NOT_FOUND; + } + ( *phMIME )->ownFileHandle = true; + + writeHeader( ( *phMIME )->file ); + + return MIME_NO_ERROR; +} + + +/*-------------------------------------------------------------------* + * MIME_WriteFrame() + * + * Write MIME frame + *-------------------------------------------------------------------*/ + +MIME_ERROR MIME_WriteFrame( + MIME_HANDLE hMIME, + const uint16_t *serial, + const int16_t numBits, + const int32_t totalBrate ) +{ + uint8_t ToC = 0x00; + int16_t i; + uint8_t byte = 0; + int16_t isAmrWb = 0; + + if ( !hMIME ) + { + return MIME_NOT_INITIALIZED; + } + + for ( i = 0; i < NUM_CHANNELS; i++ ) + { + int16_t mode; + int16_t cmi; + mode = rate2EVSmode( numBits * FRAMES_PER_SEC, &isAmrWb ); + cmi = rate2EVSmode( totalBrate, &isAmrWb ); + + ToC = (uint8_t) ( isAmrWb << 5 | isAmrWb << 4 | mode ); + writeByte( hMIME->file, ToC ); + + if ( isAmrWb ) + { + const int16_t numExtraBits = ( mode == AMRWB_IO_SID ) ? 5 : 0; + uint16_t serial_extra[5], mask; + uint8_t bit, bitinbyte; + int16_t j; + + if ( mode == AMRWB_IO_SID ) /* SID frame */ + { + /* insert STI bit and CMI */ + serial_extra[0] = 1; + + for ( mask = 0x08, j = 0; mask > 0; mask >>= 1, j++ ) + { + serial_extra[1 + j] = ( cmi & mask ) ? 1 : 0; + } + } + + for ( i = 0; i < numBits + numExtraBits; i++ ) + { + if ( i < numBits ) + { + bit = (uint8_t) serial[sort_ptr[mode][i]]; + } + else + { + bit = (uint8_t) serial_extra[i - numBits]; + } + assert( ( bit == 1 || bit == 0 ) && "Values other than 0/1 will lead to corrupt bitstream! " ); + bitinbyte = bit << ( 7 - ( i & 0x7 ) ); + + if ( i % 8 == 0 ) + { + byte = 0; + } + + byte |= bitinbyte; + + /* Write to buffer on every last bit in byte and after converting last bit in input */ + if ( i % 8 == 7 || i == ( numBits + numExtraBits ) - 1 ) + { + writeByte( hMIME->file, byte ); + } + } + } + else + { + for ( i = 0; i < numBits; i++ ) + { + uint8_t bit = (uint8_t) serial[i]; + uint8_t bitinbyte = bit << ( 7 - ( i & 0x7 ) ); + + if ( i % 8 == 0 ) + { + byte = 0; + } + + byte |= bitinbyte; + + /* Write to buffer on every last bit in byte and after converting last bit in input */ + if ( i % 8 == 7 || i == numBits - 1 ) + { + writeByte( hMIME->file, byte ); + } + } + } + } + return MIME_NO_ERROR; +} + + +/*-------------------------------------------------------------------* + * MIME_Writer_Close() + * + * Close MIME writer + *-------------------------------------------------------------------*/ + +MIME_ERROR MIME_Writer_Close( + MIME_HANDLE *phMIME ) +{ + if ( phMIME == NULL || *phMIME == NULL ) + { + return MIME_NO_ERROR; + } + + if ( ( *phMIME )->file ) + { + fclose( ( *phMIME )->file ); + } + + free( *phMIME ); + *phMIME = NULL; + phMIME = NULL; + + return MIME_NO_ERROR; +} + + +static bool readByte( FILE *file, uint8_t *value ) +{ + if ( fread( value, 1, 1, file ) != 1U ) + { + return false; + } + return true; +} + +static bool readLong( FILE *file, uint16_t *value ) +{ + char buffer[4] = { 0 }; + if ( fread( buffer, 4, 1, file ) != 1U ) + { + return false; + } + *value = 0; + *value = (uint16_t) ( buffer[3] & 0xFF ); + *value |= (uint16_t) ( buffer[2] & 0xFF ) << 8; + *value |= (uint16_t) ( buffer[1] & 0xFF ) << 16; + *value |= (uint16_t) ( buffer[0] & 0xFF ) << 24; + + return true; +} + + +/*-------------------------------------------------------------------* + * byteToSerialReordered() + * + * Write each bit in given byte as a separate uint16_t value + * to the given serial bitstream array at indices provided in + * `sort_indices` array. + * + * Bits with corresponding negative indices will not be written + * to the serial bitstream. + *-------------------------------------------------------------------*/ + +static void byteToSerialReordered( uint8_t byte, uint16_t *serial, const int16_t *sort_indices ) +{ + for ( uint32_t i = 0; i < 8; ++i ) + { + const uint8_t bit = ( byte & 0x80 ) == 0 ? 0 : 1; + + /* Negative index means "skip writing corresponding bit" */ + if ( sort_indices[i] >= 0 ) + { + serial[sort_indices[i]] = bit; + } + + byte <<= 1; + } +} + +/*-------------------------------------------------------------------* + * byteToSerial() + * + * Write each bit in given byte as a separate uint16_t value + * to the given serial bitstream array. + *-------------------------------------------------------------------*/ + +static void byteToSerial( uint8_t byte, uint16_t *serial ) +{ + const int16_t indices[8] = { 0, 1, 2, 3, 4, 5, 6, 7 }; + byteToSerialReordered( byte, serial, indices ); +} + +static MIME_ERROR readHeader( MIME_HANDLE hMIME ) +{ + const char id[] = "#!EVS_MC1.0\n"; + const uint16_t num_char_id = sizeof( id ) - 1; + + char buffer[sizeof( id )] = { 0 }; + if ( fread( buffer, sizeof( char ), num_char_id, hMIME->file ) != num_char_id ) + { + return MIME_READ_ERROR; + } + + if ( strcmp( buffer, id ) != 0 ) + { + return MIME_INVALID_DATA; + } + + if ( !readLong( hMIME->file, &hMIME->numChannels ) ) + { + return MIME_READ_ERROR; + } + + return MIME_NO_ERROR; +} +/*-------------------------------------------------------------------* + * MIME_Reader_Open_filename() + * + * Open MIME reader + *-------------------------------------------------------------------*/ + +MIME_ERROR MIME_Reader_Open_filename( MIME_HANDLE *phMIME, const char *filename ) +{ + MIME_ERROR error = MIME_NO_ERROR; + + /* create handle */ + *phMIME = (MIME_HANDLE) malloc( sizeof( struct MIME_IO ) ); + if ( !*phMIME ) + { + return MIME_MEMORY_ERROR; + } + + /* open file stream */ + ( *phMIME )->file = fopen( filename, "rb" ); + if ( ( *phMIME )->file == NULL ) + { + MIME_Reader_Close( phMIME ); + return MIME_FILE_NOT_FOUND; + } + ( *phMIME )->ownFileHandle = true; + + /* Read header */ + if ( ( error = readHeader( *phMIME ) ) != MIME_NO_ERROR ) + { + MIME_Reader_Close( phMIME ); + return error; + } + + return MIME_NO_ERROR; +} + +/*-------------------------------------------------------------------* + * MIME_Reader_Rewind() + * + * Rewind currently opened file to beginning + *-------------------------------------------------------------------*/ + +MIME_ERROR MIME_Reader_Rewind( MIME_HANDLE hMIME ) +{ + if ( !hMIME || !hMIME->file ) + { + return MIME_NOT_INITIALIZED; + } + rewind( hMIME->file ); + + + /* Skip over header, to first frame */ + readHeader( hMIME ); + + return MIME_NO_ERROR; +} + +static MIME_ERROR readEvsFrame( FILE *file, uint8_t ToC, uint16_t *serial, int16_t *num_bits, int16_t *bfi ) +{ + switch ( ToC & 0x0f ) + { + case PRIMARY_2800: + *num_bits = 56; + break; + case PRIMARY_7200: + *num_bits = 144; + break; + case PRIMARY_8000: + *num_bits = 160; + break; + case PRIMARY_9600: + *num_bits = 192; + break; + case PRIMARY_13200: + *num_bits = 264; + break; + case PRIMARY_16400: + *num_bits = 328; + break; + case PRIMARY_24400: + *num_bits = 488; + break; + case PRIMARY_32000: + *num_bits = 640; + break; + case PRIMARY_48000: + *num_bits = 960; + break; + case PRIMARY_64000: + *num_bits = 1280; + break; + case PRIMARY_96000: + *num_bits = 1920; + break; + case PRIMARY_128000: + *num_bits = 2560; + break; + case PRIMARY_SID: + *num_bits = 48; + break; + case SPEECH_LOST: + *bfi = 1; + *num_bits = 0; + break; + case 0xf: /* NO_DATA */ + *num_bits = 0; + break; + default: + return MIME_READ_ERROR; + } + + for ( int16_t i = 0; i < *num_bits; i += 8 ) + { + uint8_t byte = 0; + + if ( !readByte( file, &byte ) ) + { + return MIME_READ_ERROR; + } + + byteToSerial( byte, &serial[i] ); + } + + return MIME_NO_ERROR; +} + +static MIME_ERROR readAmrWbFrame( FILE *file, uint8_t ToC, uint16_t *serial, int16_t *num_bits, int16_t *bfi ) +{ + const uint8_t mode = ToC & 0x0f; + + switch ( mode ) + { + case AMRWB_IO_6600: + *num_bits = 132; + break; + case AMRWB_IO_8850: + *num_bits = 177; + break; + case AMRWB_IO_1265: + *num_bits = 253; + break; + case AMRWB_IO_1425: + *num_bits = 285; + break; + case AMRWB_IO_1585: + *num_bits = 317; + break; + case AMRWB_IO_1825: + *num_bits = 365; + break; + case AMRWB_IO_1985: + *num_bits = 397; + break; + case AMRWB_IO_2305: + *num_bits = 461; + break; + case AMRWB_IO_2385: + *num_bits = 477; + break; + case AMRWB_IO_SID: + *num_bits = 35; + break; + case 0xe: /* SPEECH_LOST */ + *bfi = 1; + *num_bits = 0; + break; + case 0xf: /* NO_DATA */ + *num_bits = 0; + break; + default: + return MIME_READ_ERROR; + } + + for ( int16_t i = 0; i < *num_bits; i += 8 ) + { + uint8_t byte = 0; + + if ( !readByte( file, &byte ) ) + { + return MIME_READ_ERROR; + } + + /* Since num_bits is not a multiple of 8, ensure last + * padding bits will be discarded by byteToSerialReordered() */ + int16_t sort_indices[8] = { -1, -1, -1, -1, -1, -1, -1, -1 }; + for ( uint16_t j = 0; j < 8 && ( i + j ) < *num_bits; ++j ) + { + sort_indices[j] = sort_ptr[mode][i + j]; + } + + /* Reorder bits and write to serial */ + byteToSerialReordered( byte, serial, sort_indices ); + } + + return MIME_NO_ERROR; +} + +/*-------------------------------------------------------------------* + * MIME_ReadFrame_short() + * + * Read MIME frame to serial bitstream + *-------------------------------------------------------------------*/ +MIME_ERROR MIME_ReadFrame_short( MIME_HANDLE hMIME, uint16_t *serial, int16_t *num_bits, int16_t *bfi ) +{ + if ( !hMIME ) + { + return MIME_NOT_INITIALIZED; + } + + assert( hMIME->numChannels == 1 && "Multichannel currently not supported" ); + + MIME_ERROR error = MIME_NO_ERROR; + uint8_t ToC = 0; + + for ( uint32_t i = 0; i < hMIME->numChannels; i++ ) + { + if ( !readByte( hMIME->file, &ToC ) ) + { + return MIME_EOF; + } + + if ( ToC & 0x30 ) + { + if ( ( error = readAmrWbFrame( hMIME->file, ToC, serial, num_bits, bfi ) ) != MIME_NO_ERROR ) + { + return error; + } + } + else + { + if ( ( error = readEvsFrame( hMIME->file, ToC, serial, num_bits, bfi ) ) != MIME_NO_ERROR ) + { + return error; + } + } + } + + return MIME_NO_ERROR; +} +/*-------------------------------------------------------------------* + * MIME_Reader_Close() + * + * Close MIME reader + *-------------------------------------------------------------------*/ +MIME_ERROR MIME_Reader_Close( MIME_HANDLE *phMIME ) +{ + if ( phMIME == NULL || *phMIME == NULL ) + { + return MIME_NO_ERROR; + } + + if ( ( *phMIME )->file && ( *phMIME )->ownFileHandle ) + { + fclose( ( *phMIME )->file ); + } + + free( *phMIME ); + *phMIME = NULL; + + return MIME_NO_ERROR; +} diff --git a/lib_util/mime_io.h b/lib_util/mime_io.h new file mode 100644 index 0000000000000000000000000000000000000000..91b9160529600b46447baf60dca5485c71a3ec1a --- /dev/null +++ b/lib_util/mime_io.h @@ -0,0 +1,75 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#ifndef MIME_IO_H +#define MIME_IO_H + +#include +#include + +typedef enum MIME_ERROR +{ + MIME_NO_ERROR, + MIME_MEMORY_ERROR, + MIME_WRONG_PARAMS, + MIME_FILE_NOT_FOUND, + MIME_NOT_INITIALIZED, + MIME_READ_ERROR, + MIME_WRITE_ERROR, + MIME_INVALID_DATA, + MIME_EOF, + MIME_UNKNOWN_ERROR +} MIME_ERROR; + +typedef struct MIME_IO *MIME_HANDLE; + +MIME_ERROR MIME_Writer_Open_FILE( MIME_HANDLE *phMIME, FILE *file ); + +MIME_ERROR MIME_Writer_Open_filename( MIME_HANDLE *phMIME, const char *filename ); + +MIME_ERROR MIME_WriteFrame( MIME_HANDLE hMIME, const uint16_t *serial, const int16_t numBits, const int32_t frameBitrate ); + +MIME_ERROR MIME_Writer_Close( MIME_HANDLE *phMIME ); + +MIME_ERROR MIME_Reader_Open_filename( MIME_HANDLE *phMIME, const char *filename ); + +MIME_ERROR MIME_Reader_Rewind( MIME_HANDLE hMIME ); + +MIME_ERROR MIME_ReadFrame_short( + MIME_HANDLE hMIME, + uint16_t *serial, + int16_t *num_bits, + int16_t *bfi ); + +MIME_ERROR MIME_Reader_Close( MIME_HANDLE *phMIME ); + +#endif diff --git a/lib_util/render_config_reader.c b/lib_util/render_config_reader.c new file mode 100644 index 0000000000000000000000000000000000000000..99873dcd2fd8689f6f4e7f3625107cbae7d81268 --- /dev/null +++ b/lib_util/render_config_reader.c @@ -0,0 +1,2674 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include "render_config_reader.h" +#include +#include +#include +#include +#include +#include "cmdl_tools.h" +#include "prot.h" + + +/*------------------------------------------------------------------------------------------* + * PreProc Local Macros + *------------------------------------------------------------------------------------------*/ + +#define MAX_ITEM_LENGTH ( 64 ) +#define N_ABS_COEFFS ( 6 ) + +#define SHORTEST_REV_DEL_LINE ( 0.015f ) +#define N_BANDS_MIN ( 2 ) +#define N_BANDS_MAX ( 60 ) +#define FC_INPUT_MIN ( 0.0f ) +#define FC_INPUT_MAX ( 1.0e+5f ) +#define ACOUSTIC_RT60_MIN ( 1.0e-3f ) +#define ACOUSTIC_RT60_MAX ( 1.0e+2f ) +#define ACOUSTIC_DSR_MIN ( 0.0f ) +#define ACOUSTIC_DSR_MAX ( 1.0e+2f ) +#define ACOUSTIC_DSR_EPSILON ( 1.0e-15f ) +#define ACOUSTICPREDELAY_JOTREV_MIN ( SHORTEST_REV_DEL_LINE ) +#define ACOUSTICPREDELAY_JOTREV_MAX ( SHORTEST_REV_DEL_LINE + 1.0f / (float) FRAMES_PER_SEC ) +#define ACOUSTICPREDELAY_FDREV_MIN ( 1.0f / (float) ( 16 * FRAMES_PER_SEC ) ) +#define ACOUSTICPREDELAY_FDREV_MAX ( (float) ( REVERB_PREDELAY_MAX ) / (float) ( 16 * FRAMES_PER_SEC ) ) +#define INPUTPREDELAY_MIN ( 0.0f ) +#define INPUTPREDELAY_MAX ( 1.0e+2f ) + +/*------------------------------------------------------------------------------------------* + * Local Type definitions + *------------------------------------------------------------------------------------------*/ + +typedef struct +{ + uint32_t nrBands; /* Number of frequency bands */ + float *pFc; /* Center frequencies */ +} FrequencyGrid; + +typedef enum _FREQ_GRID_MODE +{ + FREQ_GRID_MODE_UNKNOWN = -1, + FREQ_GRID_MODE_INDIVIDUAL_FREQUENCIES = 0, + FREQ_GRID_MODE_START_HOP_AMOUNT = 1, + FREQ_GRID_MODE_DEFAULT_BANDING = 2 +} FREQ_GRID_MODE; + +typedef struct +{ + uint16_t use_er; /* Activation Flag */ + IVAS_VECTOR3 dimensions; /* Room dimensions [m] */ + float pAbsCoeff[N_ABS_COEFFS]; /* Absorption coeffs table */ + IVAS_VECTOR3 *pListenerOrigin; /* Listener origin */ + uint32_t lowComplexity; /* Low complexity mode flag */ +} EarlyReflectionsConfig; + +typedef struct +{ + uint32_t id; /* Acoustic environment ID */ + FrequencyGrid *pFG; /* Pointer into Frequency grids table for late reverb coeffs */ + float *pRT60; /* RT60 table */ + float *pDSR; /* DSR table */ + float preDelay; /* Pre-delay */ + EarlyReflectionsConfig *pEarlyReflections; /* Early reflections configuration */ +} AcousticEnv; + +typedef struct +{ + uint32_t id; /* Pattern ID */ + float *pDirectivity; /* Source directivity */ +} DirectrivityPat; + +struct RenderConfigReader +{ + FILE *pConfigFile; + uint8_t *pBitstream; /* Renderer config bitstream */ + size_t length; /* Bitstream length */ + size_t readOffset; /* Bitstream read offset */ + uint32_t nFG; /* Number of frequency grids */ + FrequencyGrid *pFG; /* Frequency grids */ + uint32_t nAE; /* Number of acoustic environments */ + AcousticEnv *pAE; /* Acoustic environments */ + uint32_t nDP; /* Number of directivity patterns */ + DirectrivityPat *pDP; /* Directivity Pattern */ +}; + + +typedef enum _RC_LUT +{ + RC_LUT_INVALID = 0x00, + RC_LUT_COUNT_IDX_LO, + RC_LUT_COUNT_IDX_HI, + RC_LUT_DECI_SEC, + RC_LUT_SEC, + RC_LUT_MILLI_SEC, + RC_LUT_MICRO_SEC, + RC_LUT_FREQ, + RC_LUT_FREQ_HOP, + RC_LUT_DSR, + RC_LUT_METERS, + RC_LUT_HECTOMETERS, + RC_LUT_KILOMETERS, + RC_LUT_CENTIMETERS, + RC_LUT_ABSORPTION +} RC_LUT; + +/*------------------------------------------------------------------------------------------* + * Lookup tables + *------------------------------------------------------------------------------------------*/ + +const float lutCountIdxLo_Value[] = { + 0.0f, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, + 16.0f, 17.0f, 18.0f, 19.0f, 20.0f, 21.0f, 22.0f, 23.0f, 24.0f, 25.0f, 26.0f, 27.0f, 28.0f, 29.0f, 30.0f, 31.0f, + 32.0f, 33.0f, 34.0f, 35.0f, 36.0f, 37.0f, 38.0f, 39.0f, 40.0f, 41.0f, 42.0f, 43.0f, 44.0f, 45.0f, 46.0f, 47.0f, + 48.0f, 49.0f, 50.0f, 51.0f, 52.0f, 53.0f, 54.0f, 55.0f, 56.0f, 57.0f, 58.0f, 59.0f, 60.0f, 61.0f, 62.0f, 63.0f +}; +const uint16_t lutCountIdxLo_Code[] = { + 7, 4, 12, 13, 10, 11, 8, 9, 15, 14, 13, 12, 11, 10, 9, 8, + 7, 6, 5, 4, 3, 2, 1, 0, 63, 62, 61, 60, 59, 58, 57, 56, + 111, 110, 109, 108, 107, 106, 105, 104, 103, 102, 101, 100, 99, 98, 97, 96, + 95, 94, 93, 92, 91, 90, 89, 88, 87, 86, 85, 84, 83, 82, 81, 80 +}; +const uint8_t lutCountIdxLo_Len[] = { + 4, 3, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7 +}; + +const float lutCountIdxHi_Value[] = { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f }; +const uint16_t lutCountIdxHi_Code[] = { 1, 0, 6, 5, 4, 7, 5, 15, 14, 13, 9, 8, 25, 49, 48 }; +const uint8_t lutCountIdxHi_Len[] = { 3, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 6, 7, 7 }; + +const float lutDeciSec_Value[] = { 0.0f, 0.1f, 0.2f, 0.3f, 0.4f, 0.5f, 0.6f, 0.7f, 0.8f, 0.9f, 1.0f }; +const uint16_t lutDeciSec_Code[] = { 6, 4, 5, 6, 7, 7, 4, 5, 2, 3, 0 }; +const uint8_t lutDeciSec_Len[] = { 3, 3, 3, 4, 4, 3, 4, 4, 4, 4, 3 }; + +const float lutSec_Value[] = { + 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f, + 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 16.0f, 17.0f, 18.0f, 19.0f, 20.0f, + 21.0f, 22.0f, 23.0f, 24.0f, 25.0f, 26.0f, 27.0f, 28.0f, 29.0f, 30.0f +}; +const uint16_t lutSec_Code[] = { 3, 1, 0, 15, 13, 12, 11, 9, 8, 14, 13, 12, 11, 9, 8, 5, 29, 28, 21, 31, 30, 21, 9, 8, 41, 41, 40, 81, 161, 160 }; +const uint8_t lutSec_Len[] = { 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 7, 7, 7, 8, 8 }; + +const float lutMilliSec_Value[] = { + 0.00f, 0.001f, 0.002f, 0.003f, 0.004f, 0.005f, 0.006f, 0.007f, 0.008f, 0.009f, + 0.01f, 0.011f, 0.012f, 0.013f, 0.014f, 0.015f, 0.016f, 0.017f, 0.018f, 0.019f, + 0.02f, 0.021f, 0.022f, 0.023f, 0.024f, 0.025f, 0.026f, 0.027f, 0.028f, 0.029f, + 0.03f, 0.031f, 0.032f, 0.033f, 0.034f, 0.035f, 0.036f, 0.037f, 0.038f, 0.039f, + 0.04f, 0.041f, 0.042f, 0.043f, 0.044f, 0.045f, 0.046f, 0.047f, 0.048f, 0.049f, + 0.05f, 0.051f, 0.052f, 0.053f, 0.054f, 0.055f, 0.056f, 0.057f, 0.058f, 0.059f, + 0.06f, 0.061f, 0.062f, 0.063f, 0.064f, 0.065f, 0.066f, 0.067f, 0.068f, 0.069f, + 0.07f, 0.071f, 0.072f, 0.073f, 0.074f, 0.075f, 0.076f, 0.077f, 0.078f, 0.079f, + 0.08f, 0.081f, 0.082f, 0.083f, 0.084f, 0.085f, 0.086f, 0.087f, 0.088f, 0.089f, + 0.09f, 0.091f, 0.092f, 0.093f, 0.094f, 0.095f, 0.096f, 0.097f, 0.098f, 0.099f +}; +const uint16_t lutMilliSec_Code[] = { + 122, 123, 120, 121, 126, 127, 124, 125, 114, 115, 25, 112, 113, 118, 119, 116, 117, 42, 43, 40, + 18, 41, 46, 47, 44, 45, 34, 35, 32, 33, 19, 38, 39, 36, 37, 58, 59, 56, 57, 62, + 16, 63, 60, 61, 50, 51, 48, 49, 54, 55, 17, 52, 53, 10, 11, 8, 9, 14, 15, 12, + 22, 13, 2, 3, 0, 1, 6, 7, 4, 5, 23, 26, 27, 24, 25, 30, 31, 28, 29, 18, + 20, 19, 16, 17, 22, 23, 20, 21, 106, 107, 21, 104, 105, 110, 111, 108, 109, 98, 99, 48 +}; +const uint8_t lutMilliSec_Len[] = { + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 5, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 5, 7, 7, 7, 7, 7, 7, 7, 7, 7, 5, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 5, 7, 7, 7, 7, 7, 7, 7, 7, 7, 5, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 5, 7, 7, 7, 7, 7, 7, 7, 7, 7, 5, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 5, 7, 7, 7, 7, 7, 7, 7, 7, 7, 5, 7, 7, 7, 7, 7, 7, 7, 7, 6 +}; + +const float lutMicroSec_Value[] = { + 0.00001f, 0.00002f, 0.00003f, 0.00004f, 0.00005f, 0.00006f, 0.00007f, 0.00008f, 0.00009f, 0.0001f, + 0.00011f, 0.00012f, 0.00013f, 0.00014f, 0.00015f, 0.00016f, 0.00017f, 0.00018f, 0.00019f, 0.0002f, + 0.00021f, 0.00022f, 0.00023f, 0.00024f, 0.00025f, 0.00026f, 0.00027f, 0.00028f, 0.00029f, 0.0003f, + 0.00031f, 0.00032f, 0.00033f, 0.00034f, 0.00035f, 0.00036f, 0.00037f, 0.00038f, 0.00039f, 0.0004f, + 0.00041f, 0.00042f, 0.00043f, 0.00044f, 0.00045f, 0.00046f, 0.00047f, 0.00048f, 0.00049f, 0.0005f, + 0.00051f, 0.00052f, 0.00053f, 0.00054f, 0.00055f, 0.00056f, 0.00057f, 0.00058f, 0.00059f, 0.0006f, + 0.00061f, 0.00062f, 0.00063f, 0.00064f, 0.00065f, 0.00066f, 0.00067f, 0.00068f, 0.00069f, 0.0007f, + 0.00071f, 0.00072f, 0.00073f, 0.00074f, 0.00075f, 0.00076f, 0.00077f, 0.00078f, 0.00079f, 0.0008f, + 0.00081f, 0.00082f, 0.00083f, 0.00084f, 0.00085f, 0.00086f, 0.00087f, 0.00088f, 0.00089f, 0.0009f, + 0.00091f, 0.00092f, 0.00093f, 0.00094f, 0.00095f, 0.00096f, 0.00097f, 0.00098f, 0.00099f +}; +const uint16_t lutMicroSec_Code[] = { + 444, 18, 445, 19, 894, 16, 895, 17, 892, 22, 893, 23, 434, 20, 435, 21, 432, 10, 433, 11, + 438, 8, 439, 9, 436, 14, 437, 15, 410, 12, 411, 13, 408, 2, 409, 3, 414, 0, 415, 1, + 412, 6, 413, 7, 402, 4, 403, 5, 400, 26, 401, 27, 406, 24, 407, 25, 404, 30, 405, 31, + 426, 28, 427, 29, 424, 18, 425, 19, 430, 16, 431, 17, 428, 22, 429, 23, 418, 20, 419, 21, + 416, 58, 417, 59, 422, 56, 423, 57, 420, 62, 421, 63, 442, 60, 443, 61, 440, 24, 441 +}; +const uint8_t lutMicroSec_Len[] = { + 9, 5, 9, 5, 10, 5, 10, 5, 10, 5, 10, 5, 9, 5, 9, 5, 9, 6, 9, 6, + 9, 6, 9, 6, 9, 6, 9, 6, 9, 6, 9, 6, 9, 6, 9, 6, 9, 6, 9, 6, + 9, 6, 9, 6, 9, 6, 9, 6, 9, 6, 9, 6, 9, 6, 9, 6, 9, 6, 9, 6, + 9, 6, 9, 6, 9, 6, 9, 6, 9, 6, 9, 6, 9, 6, 9, 6, 9, 6, 9, 6, + 9, 6, 9, 6, 9, 6, 9, 6, 9, 6, 9, 6, 9, 6, 9, 6, 9, 5, 9 +}; + +const float lutFreq_Value[] = { + 16.0f, 20.0f, 25.0f, 31.5f, 40.0f, 50.0f, 63.0f, 80.0f, 100.0f, 125.0f, + 160.0f, 200.0f, 250.0f, 315.0f, 400.0f, 500.0f, 630.0f, 800.0f, 1000.0f, 1250.0f, + 1600.0f, 2000.0f, 2500.0f, 3150.0f, 4000.0f, 5000.0f, 6300.0f, 8000.0f, 10000.0f, 12500.0f, + 16000.0f, 20000.0f, 25000.0f, 31500.0f, 40000.0f +}; +const uint16_t lutFreq_Code[] = { 35, 14, 15, 9, 12, 13, 0, 26, 27, 1, 24, 25, 14, 30, 31, 15, 28, 29, 12, 18, 19, 13, 16, 17, 10, 22, 23, 11, 20, 21, 2, 16, 138, 139, 68 }; +const uint8_t lutFreq_Len[] = { 6, 6, 6, 4, 6, 6, 4, 6, 6, 4, 6, 6, 4, 6, 6, 4, 6, 6, 4, 6, 6, 4, 6, 6, 4, 6, 6, 4, 6, 6, 4, 5, 8, 8, 7 }; + +const float lutFreqHop_Value[] = { 1.059463094f, 1.122462048f, 1.189207115f, 1.259921050f, 1.414213562f, 2.0f, 4.0f }; +const uint16_t lutFreqHop_Code[] = { 2, 3, 0, 1, 1, 3, 2 }; +const uint8_t lutFreqHop_Len[] = { 4, 4, 4, 2, 4, 2, 2 }; + +const float lutDsr_Value[] = { + -150.0f, -149.0f, -148.0f, -147.0f, -146.0f, -145.0f, -144.0f, -143.0f, -142.0f, -141.0f, + -140.0f, -139.0f, -138.0f, -137.0f, -136.0f, -135.0f, -134.0f, -133.0f, -132.0f, -131.0f, + -130.0f, -129.0f, -128.0f, -127.0f, -126.0f, -125.0f, -124.0f, -123.0f, -122.0f, -121.0f, + -120.0f, -119.0f, -118.0f, -117.0f, -116.0f, -115.0f, -114.0f, -113.0f, -112.0f, -111.0f, + -110.0f, -109.0f, -108.0f, -107.0f, -106.0f, -105.0f, -104.0f, -103.0f, -102.0f, -101.0f, + -100.0f, -99.0f, -98.0f, -97.0f, -96.0f, -95.0f, -94.0f, -93.0f, -92.0f, -91.0f, + -90.0f, -89.0f, -88.0f, -87.0f, -86.0f, -85.0f, -84.0f, -83.0f, -82.0f, -81.0f, + -80.0f, -79.0f, -78.0f, -77.0f, -76.0f, -75.0f, -74.0f, -73.0f, -72.0f, -71.0f, + -70.0f, -69.0f, -68.0f, -67.0f, -66.0f, -65.0f, -64.0f, -63.0f, -62.0f, -61.0f, + -60.0f, -59.0f, -58.0f, -57.0f, -56.0f, -55.0f, -54.0f, -53.0f, -52.0f, -51.0f, + -50.0f, -49.0f, -48.0f, -47.0f, -46.0f, -45.0f, -44.0f, -43.0f, -42.0f, -41.0f, + -40.0f, -39.0f, -38.0f, -37.0f, -36.0f, -35.0f, -34.0f, -33.0f, -32.0f, -31.0f, + -30.0f, -29.0f, -28.0f, -27.0f, -26.0f, -25.0f, -24.0f, -23.0f, -22.0f, -21.0f, + -20.0f, -19.0f, -18.0f, -17.0f, -16.0f, -15.0f, -14.0f, -13.0f, -12.0f, -11.0f, + -10.0f +}; +const uint16_t lutDsr_Code[] = { + 140, 141, 286, 287, 284, 285, 130, 131, 128, 129, 134, 135, 132, 133, 234, 235, 232, 233, 238, 239, + 236, 237, 226, 227, 224, 225, 230, 231, 228, 229, 250, 251, 248, 249, 254, 255, 252, 253, 242, 243, + 240, 241, 246, 247, 244, 245, 202, 203, 200, 201, 206, 207, 204, 205, 194, 195, 192, 193, 198, 199, + 196, 197, 218, 219, 216, 217, 222, 223, 220, 221, 20, 21, 38, 39, 36, 37, 58, 59, 56, 57, + 62, 63, 60, 61, 50, 51, 48, 49, 54, 55, 52, 53, 10, 11, 8, 9, 14, 15, 12, 13, + 2, 3, 0, 1, 6, 7, 4, 5, 42, 43, 40, 41, 46, 47, 44, 45, 18, 19, 16, 17, + 22, 210, 211, 208, 209, 214, 215, 212, 213, 186, 187, 184, 185, 190, 191, 188, 189, 138, 139, 136, + 137 +}; +const uint8_t lutDsr_Len[] = { + 8, 8, 9, 9, 9, 9, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 8, 8, 8, + 8 +}; + +const float lutMeters_Value[] = { + 0.0f, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, + 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 16.0f, 17.0f, 18.0f, 19.0f, + 20.0f, 21.0f, 22.0f, 23.0f, 24.0f, 25.0f, 26.0f, 27.0f, 28.0f, 29.0f, + 30.0f, 31.0f, 32.0f, 33.0f, 34.0f, 35.0f, 36.0f, 37.0f, 38.0f, 39.0f, + 40.0f, 41.0f, 42.0f, 43.0f, 44.0f, 45.0f, 46.0f, 47.0f, 48.0f, 49.0f, + 50.0f, 51.0f, 52.0f, 53.0f, 54.0f, 55.0f, 56.0f, 57.0f, 58.0f, 59.0f, + 60.0f, 61.0f, 62.0f, 63.0f, 64.0f, 65.0f, 66.0f, 67.0f, 68.0f, 69.0f, + 70.0f, 71.0f, 72.0f, 73.0f, 74.0f, 75.0f, 76.0f, 77.0f, 78.0f, 79.0f, + 80.0f, 81.0f, 82.0f, 83.0f, 84.0f, 85.0f, 86.0f, 87.0f, 88.0f, 89.0f, + 90.0f, 91.0f, 92.0f, 93.0f, 94.0f, 95.0f, 96.0f, 97.0f, 98.0f, 99.0f +}; + +const uint16_t lutMeters_Code[] = { + 61, 50, 51, 48, 49, 54, 55, 52, 53, 10, + 11, 8, 9, 14, 15, 12, 13, 2, 3, 0, + 1, 6, 7, 4, 5, 26, 27, 24, 25, 30, + 31, 28, 29, 18, 19, 16, 17, 22, 23, 20, + 21, 42, 43, 40, 41, 46, 47, 44, 45, 16, + 68, 69, 142, 143, 140, 141, 154, 155, 152, 153, + 158, 159, 156, 157, 146, 147, 144, 145, 150, 151, + 148, 149, 234, 235, 232, 233, 238, 239, 236, 237, + 226, 227, 224, 225, 230, 231, 228, 229, 250, 251, + 248, 249, 254, 255, 252, 253, 242, 243, 240, 241 +}; + +const uint8_t lutMeters_Len[] = { + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, + 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8 +}; + +const float lutHectometers_Value[] = { 0.0f, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f }; +const uint16_t lutHectometers_Code[] = { 0, 1, 6, 7, 4, 5, 6, 7, 4, 5 }; +const uint8_t lutHectometers_Len[] = { 3, 3, 3, 3, 3, 3, 4, 4, 4, 4 }; + +const float lutKilometers_Value[] = { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f }; +const uint16_t lutKilometers_Code[] = { 2, 3, 1, 0, 7, 5, 4, 13, 25, 24 }; +const uint8_t lutKilometers_Len[] = { 2, 3, 3, 3, 3, 4, 4, 4, 5, 5 }; + +const float lutCentimeters_Value[] = { + 0.0f, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, + 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 16.0f, 17.0f, 18.0f, 19.0f, + 20.0f, 21.0f, 22.0f, 23.0f, 24.0f, 25.0f, 26.0f, 27.0f, 28.0f, 29.0f, + 30.0f, 31.0f, 32.0f, 33.0f, 34.0f, 35.0f, 36.0f, 37.0f, 38.0f, 39.0f, + 40.0f, 41.0f, 42.0f, 43.0f, 44.0f, 45.0f, 46.0f, 47.0f, 48.0f, 49.0f, + 50.0f, 51.0f, 52.0f, 53.0f, 54.0f, 55.0f, 56.0f, 57.0f, 58.0f, 59.0f, + 60.0f, 61.0f, 62.0f, 63.0f, 64.0f, 65.0f, 66.0f, 67.0f, 68.0f, 69.0f, + 70.0f, 71.0f, 72.0f, 73.0f, 74.0f, 75.0f, 76.0f, 77.0f, 78.0f, 79.0f, + 80.0f, 81.0f, 82.0f, 83.0f, 84.0f, 85.0f, 86.0f, 87.0f, 88.0f, 89.0f, + 90.0f, 91.0f, 92.0f, 93.0f, 94.0f, 95.0f, 96.0f, 97.0f, 98.0f, 99.0f +}; + +const uint16_t lutCentimeters_Code[] = { + 50, 51, 48, 49, 54, 55, 52, 53, 42, 43, + 40, 41, 46, 47, 44, 45, 34, 35, 32, 33, + 38, 39, 36, 37, 58, 59, 56, 57, 62, 63, + 60, 61, 50, 51, 48, 49, 54, 55, 52, 53, + 10, 11, 8, 9, 14, 15, 12, 13, 2, 3, + 0, 1, 6, 7, 4, 5, 26, 27, 24, 25, + 30, 31, 28, 29, 18, 19, 16, 17, 22, 23, + 20, 21, 42, 43, 40, 41, 46, 47, 44, 45, + 34, 35, 32, 33, 38, 39, 36, 37, 122, 123, + 120, 121, 126, 127, 124, 125, 58, 59, 56, 57 +}; + +const uint8_t lutCentimeters_Len[] = { + 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, + 7, 7, 7, 7, 7, 7, 6, 6, 6, 6 +}; + +const float lutAbsorption_Value[] = { 0.0f, 0.1f, 0.2f, 0.3f, 0.4f, 0.5f, 0.6f, 0.7f, 0.8f, 0.9f, 1.0f }; +const uint16_t lutAbsorption_Code[] = { 6, 4, 5, 6, 7, 7, 4, 5, 2, 3, 0 }; +const uint8_t lutAbsorption_Len[] = { 3, 3, 3, 4, 4, 3, 4, 4, 4, 4, 3 }; + +/*------------------------------------------------------------------------------------------* + * Default frequency grids + *------------------------------------------------------------------------------------------*/ + +const float defaultFrequencyGrid_0[] = { 31.5f, 63.0f, 125.0f, 250.0f, 500.0f, 1000.0f, 2000.0f, 4000.0f, 8000.0f, 16000.0f }; +const float defaultFrequencyGrid_1[] = { 25.0f, 50.0f, 100.0f, 200.0f, 400.0f, 800.0f, 1600.0f, 3150.0f, 6300.0f, 12500.0f }; +const float defaultFrequencyGrid_2[] = { + 20.0f, 25.0f, 31.5f, 40.0f, 50.0f, 63.0f, 80.0f, 100.0f, 125.0f, 160.0f, + 200.0f, 250.0f, 315.0f, 400.0f, 500.0f, 630.0f, 800.0f, 1000.0f, 1250.0f, 1600.0f, + 2000.0f, 2500.0f, 3150.0f, 4000.0f, 5000.0f, 6300.0f, 8000.0f, 10000.0f, 12500.0f, 16000.0f, 20000.0f +}; +const float defaultFrequencyGrid_3[] = { 25.0f, 100.0f, 400.0f, 1600.0f, 6300.0f }; +const float defaultFrequencyGrid_4[] = { 125.0f, 250.0f, 500.0f, 1000.0f, 2000.0f, 4000.0f }; +const float defaultFrequencyGrid_5[] = { 25.0f, 250.0f, 2500.0f }; +const float defaultFrequencyGrid_6[] = { + 27.0f, 56.0f, 89.0f, 126.0f, 168.0f, 214.0f, 265.0f, 323.0f, 387.0f, 459.0f, + 539.0f, 628.0f, 727.0f, 839.0f, 963.0f, 1101.0f, 1256.0f, 1429.0f, 1621.0f, 1836.0f, + 2077.0f, 2345.0f, 2644.0f, 2978.0f, 3351.0f, 3767.0f, 4232.0f, 4750.0f, 5329.0f, 5975.0f, + 6697.0f, 7502.0f, 8401.0f, 9405.0f, 10525.0f, 11775.0f, 13171.0f, 14729.0f, 16468.0f, 18410.0f, 20577.0f +}; +const float defaultFrequencyGrid_7[] = { + 27.0f, 89.0f, 168.0f, 265.0f, 387.0f, 539.0f, 727.0f, 963.0f, 1256.0f, 1621.0f, + 2077.0f, 2644.0f, 3351.0f, 4232.0f, 5329.0f, 6697.0f, 8401.0f, 10525.0f, 13171.0f, 16468.0f, 20577.0f +}; +const float defaultFrequencyGrid_8[] = { + 50.0f, 150.0f, 250.0f, 350.0f, 450.0f, 570.0f, 700.0f, 840.0f, 1000.0f, 1170.0f, + 1370.0f, 1600.0f, 1850.0f, 2150.0f, 2150.0f, 2500.0f, 2900.0f, 3400.0f, 4000.0f, 4800.0f, + 5800.0f, 7000.0f, 8500.0f, 10500.0f, 13500.0f +}; + +/*-----------------------------------------------------------------------------------------* + * Function read_bin_bits() + * Reads a given number of bits from the bitstream + *-----------------------------------------------------------------------------------------*/ +static ivas_error read_bin_bits( + RenderConfigReader *this, /* i/o : Renderer config reader handle */ + uint32_t *pTarget, /* o : Target read data pointer */ + const size_t nBits /* i : Number of bits to read */ +) +{ + uint8_t n; + uint32_t nByte; + uint8_t bit; + + if ( this == NULL || this->pBitstream == NULL || pTarget == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + if ( this->readOffset + nBits > this->length * 8 ) + { + return IVAS_ERR_INVALID_RENDER_CONFIG; + } + + *pTarget = 0; + for ( n = 0; n < nBits; n++ ) + { + nByte = ( this->readOffset + n ) >> 3; + bit = this->pBitstream[nByte] >> ( 7 - ( ( this->readOffset + n ) % 8 ) ) & 1; + *pTarget = ( *pTarget << 1 ) + bit; + } + + this->readOffset += nBits; + + return IVAS_ERR_OK; +} + +/*-----------------------------------------------------------------------------------------* + * Function read_bin_bool() + * Reads a boolean value from a bitstream + *-----------------------------------------------------------------------------------------*/ +static ivas_error read_bin_bool( + RenderConfigReader *this, /* i/o : Renderer config reader handle */ + uint32_t *pResult /* o : Target read data pointer */ +) +{ + return read_bin_bits( this, pResult, 1 ); +} + +/*-----------------------------------------------------------------------------------------* + * Function get_bin_id() + * Reads an ID from a bitstream + *-----------------------------------------------------------------------------------------*/ +static ivas_error get_bin_id( + RenderConfigReader *this, /* i/o : Renderer config reader handle */ + uint32_t *pResult /* o : Target read data pointer */ +) +{ + ivas_error error; + uint32_t id; + uint32_t cont; + + *pResult = 0; + id = 0; + cont = true; + + if ( pResult == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + while ( cont ) + { + if ( ( error = read_bin_bits( this, &id, 7 ) ) != IVAS_ERR_OK ) + { + return error; + } + *pResult = ( *pResult << 7 ) | id; + + if ( ( error = read_bin_bool( this, &cont ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + return IVAS_ERR_OK; +} + +/*-----------------------------------------------------------------------------------------* + * Function read_bin_code_word() + * Reads a code word from a LUT + *-----------------------------------------------------------------------------------------*/ +static ivas_error read_bin_code_word( + RenderConfigReader *this, /* i/o : Renderer config reader handle */ + const RC_LUT table, /* i : Table enum */ + float *pResult /* o : Code value */ +) +{ + ivas_error error; + const float *pValues; + const uint16_t *pCodes; + const uint8_t *pLengths; + uint8_t minLen; + uint8_t maxLen; + uint8_t size; + uint8_t n; + uint32_t code; + uint32_t bits; + uint32_t nr_bits; + uint8_t len; + + minLen = 255; + maxLen = 0; + bits = 0; + nr_bits = 0; + code = 0; + + if ( pResult == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + /* Select the right tables */ + switch ( table ) + { + case RC_LUT_COUNT_IDX_LO: + pValues = lutCountIdxLo_Value; + pCodes = lutCountIdxLo_Code; + pLengths = lutCountIdxLo_Len; + size = sizeof lutCountIdxLo_Len / sizeof( uint8_t ); + break; + case RC_LUT_COUNT_IDX_HI: + pValues = lutCountIdxHi_Value; + pCodes = lutCountIdxHi_Code; + pLengths = lutCountIdxHi_Len; + size = sizeof lutCountIdxHi_Len / sizeof( uint8_t ); + break; + case RC_LUT_DECI_SEC: + pValues = lutDeciSec_Value; + pCodes = lutDeciSec_Code; + pLengths = lutDeciSec_Len; + size = sizeof lutDeciSec_Len / sizeof( uint8_t ); + break; + case RC_LUT_SEC: + pValues = lutSec_Value; + pCodes = lutSec_Code; + pLengths = lutSec_Len; + size = sizeof lutSec_Len / sizeof( uint8_t ); + break; + case RC_LUT_MILLI_SEC: + pValues = lutMilliSec_Value; + pCodes = lutMilliSec_Code; + pLengths = lutMilliSec_Len; + size = sizeof lutMilliSec_Len / sizeof( uint8_t ); + break; + case RC_LUT_MICRO_SEC: + pValues = lutMicroSec_Value; + pCodes = lutMicroSec_Code; + pLengths = lutMicroSec_Len; + size = sizeof lutMicroSec_Len / sizeof( uint8_t ); + break; + case RC_LUT_FREQ: + pValues = lutFreq_Value; + pCodes = lutFreq_Code; + pLengths = lutFreq_Len; + size = sizeof lutFreq_Len / sizeof( uint8_t ); + break; + case RC_LUT_FREQ_HOP: + pValues = lutFreqHop_Value; + pCodes = lutFreqHop_Code; + pLengths = lutFreqHop_Len; + size = sizeof lutFreqHop_Len / sizeof( uint8_t ); + break; + case RC_LUT_DSR: + pValues = lutDsr_Value; + pCodes = lutDsr_Code; + pLengths = lutDsr_Len; + size = sizeof lutDsr_Len / sizeof( uint8_t ); + break; + case RC_LUT_METERS: + pValues = lutMeters_Value; + pCodes = lutMeters_Code; + pLengths = lutMeters_Len; + size = sizeof lutMeters_Len / sizeof( uint8_t ); + break; + case RC_LUT_HECTOMETERS: + pValues = lutHectometers_Value; + pCodes = lutHectometers_Code; + pLengths = lutHectometers_Len; + size = sizeof lutHectometers_Len / sizeof( uint8_t ); + break; + case RC_LUT_KILOMETERS: + pValues = lutKilometers_Value; + pCodes = lutKilometers_Code; + pLengths = lutKilometers_Len; + size = sizeof lutKilometers_Len / sizeof( uint8_t ); + break; + case RC_LUT_CENTIMETERS: + pValues = lutCentimeters_Value; + pCodes = lutCentimeters_Code; + pLengths = lutCentimeters_Len; + size = sizeof lutCentimeters_Len / sizeof( uint8_t ); + break; + case RC_LUT_ABSORPTION: + pValues = lutAbsorption_Value; + pCodes = lutAbsorption_Code; + pLengths = lutAbsorption_Len; + size = sizeof lutAbsorption_Len / sizeof( uint8_t ); + break; + case RC_LUT_INVALID: + default: + return IVAS_ERR_INVALID_RENDER_CONFIG; + } + + /* First read minLen bits, then add one bit per iteration to find the correct value */ + for ( n = 0; n < size; n++ ) + { + minLen = min( minLen, pLengths[n] ); + maxLen = max( maxLen, pLengths[n] ); + } + for ( len = minLen; len <= maxLen; len++ ) + { + nr_bits = ( len == minLen ) ? minLen : 1; + if ( ( error = read_bin_bits( this, &bits, nr_bits ) ) != IVAS_ERR_OK ) + { + return error; + } + code = ( code << nr_bits ) | bits; + for ( n = 0; n < size; n++ ) + { + if ( code == pCodes[n] && len == pLengths[n] ) + { + *pResult = pValues[n]; + return IVAS_ERR_OK; + } + } + } + return IVAS_ERR_INVALID_RENDER_CONFIG; +} + +/*-----------------------------------------------------------------------------------------* + * Function get_bin_count_or_index() + * Gets a count or index + *-----------------------------------------------------------------------------------------*/ +static ivas_error get_bin_count_or_index( + RenderConfigReader *this, /* i/o : Renderer config reader handle */ + uint32_t *pResult /* o : Count or index value */ +) +{ + ivas_error error; + float value; + uint32_t isLarge; + + if ( pResult == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + if ( ( error = read_bin_code_word( this, RC_LUT_COUNT_IDX_LO, &value ) ) != IVAS_ERR_OK ) + { + return error; + } + *pResult = (uint32_t) value; + + if ( ( error = read_bin_bool( this, &isLarge ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( isLarge ) + { + if ( ( error = read_bin_code_word( this, RC_LUT_COUNT_IDX_HI, &value ) ) != IVAS_ERR_OK ) + { + return error; + } + *pResult += (uint32_t) value << 6; + } + + return IVAS_ERR_OK; +} + +/*-----------------------------------------------------------------------------------------* + * Function get_bin_duration() + * Gets a duration value + *-----------------------------------------------------------------------------------------*/ +static ivas_error get_bin_duration( + RenderConfigReader *this, /* i/o : Renderer config reader handle */ + float *pResult /* o : Duration value */ +) +{ + ivas_error error; + float value; + uint32_t addFlag; + + /* Deciseconds */ + if ( ( error = read_bin_code_word( this, RC_LUT_DECI_SEC, &value ) ) != IVAS_ERR_OK ) + { + return error; + } + *pResult = value; + + /* Milliseconds */ + if ( ( error = read_bin_bool( this, &addFlag ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( addFlag ) + { + if ( ( error = read_bin_code_word( this, RC_LUT_MILLI_SEC, &value ) ) != IVAS_ERR_OK ) + { + return error; + } + *pResult += value; + + /* Microseconds */ + if ( ( error = read_bin_bool( this, &addFlag ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( addFlag ) + { + if ( ( error = read_bin_code_word( this, RC_LUT_MICRO_SEC, &value ) ) != IVAS_ERR_OK ) + { + return error; + } + *pResult += value; + } + } + + /* Seconds */ + if ( ( error = read_bin_bool( this, &addFlag ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( addFlag ) + { + if ( ( error = read_bin_code_word( this, RC_LUT_SEC, &value ) ) != IVAS_ERR_OK ) + { + return error; + } + *pResult += value; + } + + /* Correct rounding errors due to multiple additions: */ + *pResult = roundf( *pResult * 100000.0f ) / 100000.0f; + + return IVAS_ERR_OK; +} + +/*-----------------------------------------------------------------------------------------* + * Function get_bin_frequency() + * Gets a frequency value + *-----------------------------------------------------------------------------------------*/ +static ivas_error get_bin_frequency( + RenderConfigReader *this, /* i/o : Renderer config reader handle */ + float *pResult /* o : Frequency value */ +) +{ + ivas_error error; + uint32_t hiRes; + uint32_t refine; + + hiRes = 0; + refine = 0; + + if ( ( error = read_bin_code_word( this, RC_LUT_FREQ, pResult ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = read_bin_bool( this, &hiRes ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( hiRes ) + { + if ( ( error = read_bin_bits( this, &refine, 4 ) ) != IVAS_ERR_OK ) + { + return error; + } + + *pResult *= powf( 2.0f, ( (float) refine + 1.0f ) / 51.0f ); + } + return IVAS_ERR_OK; +} + +/*-----------------------------------------------------------------------------------------* + * Function get_bin_dsr() + * Gets a DSR value + *-----------------------------------------------------------------------------------------*/ +static ivas_error get_bin_dsr( + RenderConfigReader *this, /* i/o : Renderer config reader handle */ + float *pResult /* o : DSR value */ +) +{ + ivas_error error; + float value; + + if ( ( error = read_bin_code_word( this, RC_LUT_DSR, &value ) ) != IVAS_ERR_OK ) + { + return error; + } + *pResult = powf( 10.0f, value / 10.0f ); + + return IVAS_ERR_OK; +} + +/*-----------------------------------------------------------------------------------------* + * Function get_bin_distance() + * Gets a distance value (in meters) + *-----------------------------------------------------------------------------------------*/ + +static ivas_error get_bin_distance( + RenderConfigReader *this, /* i/o : Render config reader handle */ + uint16_t isSmall, /* i : Flag indicating a small distance */ + float *pResult /* o : Distance value */ +) +{ + ivas_error error; + float value; + uint32_t flag; + + if ( ( error = read_bin_code_word( this, RC_LUT_METERS, pResult ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( isSmall == false ) + { + /* addHectometers flag */ + if ( ( error = read_bin_bool( this, &flag ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( flag == true ) + { + /* Hectometers */ + if ( ( error = read_bin_code_word( this, RC_LUT_HECTOMETERS, &value ) ) != IVAS_ERR_OK ) + { + return error; + } + *pResult += value * 100.0f; + + /* addKilometers flag */ + if ( ( error = read_bin_bool( this, &flag ) ) != IVAS_ERR_OK ) + { + return error; + } + + while ( flag == true ) + { + /* Kilometers */ + if ( ( error = read_bin_code_word( this, RC_LUT_KILOMETERS, &value ) ) != IVAS_ERR_OK ) + { + return error; + } + *pResult += value * 1000.0f; + + /* addKilometers flag */ + if ( ( error = read_bin_bool( this, &flag ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + } + + /* addCentimeters flag */ + if ( ( error = read_bin_bool( this, &flag ) ) != IVAS_ERR_OK ) + { + return error; + } + if ( flag == true ) + { + /* Centimeters */ + if ( ( error = read_bin_code_word( this, RC_LUT_CENTIMETERS, &value ) ) != IVAS_ERR_OK ) + { + return error; + } + *pResult += value * 0.01f; + } + + return IVAS_ERR_OK; +} + +/*-----------------------------------------------------------------------------------------* + * Function get_bin_absorption() + * Gets an absorption value + *-----------------------------------------------------------------------------------------*/ + +static ivas_error get_bin_absorption( + RenderConfigReader *this, /* i/o : Render config reader handle */ + float *pResult /* o : Absorption value */ +) +{ + ivas_error error; + + if ( ( error = read_bin_code_word( this, RC_LUT_ABSORPTION, pResult ) ) != IVAS_ERR_OK ) + { + return error; + } + + return IVAS_ERR_OK; +} + +/*-----------------------------------------------------------------------------------------* + * Function read_txt_bool() + * Reads a boolean value from a line + *-----------------------------------------------------------------------------------------*/ +static ivas_error read_txt_bool( + const char *pLine, /* i : String to read from */ + uint32_t *pTarget /* o : Output pointer */ +) +{ + char value[8 + 1]; + + if ( sscanf( pLine, "%8s", (char *) &value ) != 1 ) + { + return IVAS_ERR_INVALID_RENDER_CONFIG; + } + + if ( strcmp( value, "TRUE" ) == 0 ) + { + *pTarget = TRUE; + return IVAS_ERR_OK; + } + if ( strcmp( value, "FALSE" ) == 0 ) + { + *pTarget = FALSE; + return IVAS_ERR_OK; + } + return IVAS_ERR_INVALID_RENDER_CONFIG; +} +/*-----------------------------------------------------------------------------------------* + * Function get_bin_angle() + * Gets an angle value in degrees [0,360] + *-----------------------------------------------------------------------------------------*/ + +static ivas_error get_bin_angle( + RenderConfigReader *this, /* i/o : Render config reader handle */ + float *pResult /* o : Angle value */ +) +{ + ivas_error error; + uint32_t value; + + if ( ( error = read_bin_bits( this, &value, 5 ) ) != IVAS_ERR_OK ) + { + return error; + } + + *pResult = usdequant( (int16_t) value, 0.0f, 20.0f ); + + return IVAS_ERR_OK; +} + +/*-----------------------------------------------------------------------------------------* + * Function get_bin_outer_attenuation () + * Gets an outer attenuation value [3.1623e-05,1.0], or in dB: [-90,0] + *-----------------------------------------------------------------------------------------*/ + +static ivas_error get_bin_outer_attenuation( + RenderConfigReader *this, /* i/o : Render config reader handle */ + float *pResult /* o : Attenuation value */ +) +{ + ivas_error error; + uint32_t value; + float logval, att; + + if ( ( error = read_bin_bits( this, &value, 5 ) ) != IVAS_ERR_OK ) + { + return error; + } + + logval = usdequant( (int16_t) value, -90.0f, 3.0f ); + att = powf( 10, logval / 20.0f ); + + *pResult = att; + + return IVAS_ERR_OK; +} + + +/*-----------------------------------------------------------------------------------------* + * Function read_txt_vector() + * + * Reads a vector value from a line + *-----------------------------------------------------------------------------------------*/ + +static int16_t read_txt_vector( + char *pLine, /* i : String to read from */ + const uint32_t length, /* i : Number of expected vector elements */ + float *pTarget /* o : Output vector pointer */ +) +{ + char *tmp; + uint16_t n; + uint16_t count; + + n = (int16_t) sscanf( pLine, "[%s", pLine ); + if ( n == 0 ) + { + return true; + } + + /* Additional comma to make parsing easier */ + pLine[strlen( pLine ) - 1] = ','; + + tmp = pLine; + /* Count # of commas to determine vector length */ + for ( n = 0; tmp[n]; tmp[n] == ',' ? n++ : *tmp++ ) + ; + + count = n; + + tmp = pLine; + + /* Check for maximum vector length */ + if ( n != length ) + { + return true; + } + + for ( n = 0; n < count; n++ ) + { + if ( (int16_t) sscanf( tmp, "%f,", &pTarget[n] ) != 1 ) + { + return true; + } + + tmp = strchr( tmp, ',' ) + 1; + } + + return false; +} + +/*-----------------------------------------------------------------------------------------* + * Function strip_spaces() + * + * Strips the spaces from a buffer + *-----------------------------------------------------------------------------------------*/ + +static void strip_spaces( + char *pStr /* i : String to read from */ +) +{ + int32_t read_idx = 0, write_idx = 0; + + while ( pStr[read_idx] ) + { + if ( !isspace( pStr[read_idx] ) && !iscntrl( pStr[read_idx] ) ) + { + pStr[write_idx++] = pStr[read_idx]; + } + read_idx++; + } + pStr[write_idx] = '\0'; + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function errorHandler() + * + * Prints error message and exits + *-----------------------------------------------------------------------------------------*/ + +/*! r: error accumulation */ +static int32_t errorHandler( + const char *badStr, /* i : String to complain about */ + const ERROR_CODES_t error ) +{ + static int32_t numErrors = 0; + + switch ( error ) + { + case ERROR_NONE: + break; + case ERROR_ITEM_UNKNOWN: + numErrors++; + fprintf( stderr, "Unknown variable %s in renderer configuration file.\n\n", badStr ); + break; + case ERROR_VALUE_INVALID: + numErrors++; + fprintf( stderr, "Invalid value %s in renderer configuration file.\n\n", badStr ); + break; + default: + numErrors++; + fprintf( stderr, "Unknown error while reading configuration file.\n\n" ); + } + + return numErrors; +} + +/*------------------------------------------------------------------------------------------* + * RenderConfigReader_checkValues() + * + * Verifies if the configuration parameters lie within acceptable limits + *------------------------------------------------------------------------------------------*/ + +ivas_error RenderConfigReader_checkValues( + IVAS_RENDER_CONFIG_HANDLE hRenderConfig /* o : Renderer configuration handle */ +) +{ + int16_t band_idx, tab_value_err_count; + IVAS_ROOM_ACOUSTICS_CONFIG_DATA *pRoom_acoustics; + pRoom_acoustics = &hRenderConfig->roomAcoustics; + tab_value_err_count = 0; + int16_t wall_idx; + + + /* Verify the number of frequency bands in the config input data */ + if ( ( pRoom_acoustics->nBands > N_BANDS_MAX ) || ( pRoom_acoustics->nBands < N_BANDS_MIN ) ) + { + return IVAS_ERR_WRONG_PARAMS; + } + + /* Verify input pre-delay value */ + if ( ( pRoom_acoustics->inputPreDelay > INPUTPREDELAY_MAX ) || ( pRoom_acoustics->inputPreDelay < INPUTPREDELAY_MIN ) ) + { + return IVAS_ERR_WRONG_PARAMS; + } + + /* Verify data per band in the acoustic properties table */ + for ( band_idx = 0; band_idx < pRoom_acoustics->nBands; band_idx++ ) + { + /* Verify if the frequencies are in the ascending order (required for interpolation) */ + if ( band_idx != 0 ) + { + if ( pRoom_acoustics->pFc_input[band_idx] <= pRoom_acoustics->pFc_input[band_idx - 1] ) + { + tab_value_err_count++; + } + } + + /* Check the input frequencies */ + if ( ( pRoom_acoustics->pFc_input[band_idx] > FC_INPUT_MAX ) || ( pRoom_acoustics->pFc_input[band_idx] < FC_INPUT_MIN ) ) + { + tab_value_err_count++; + } + + /* Check the input RT60 values */ + if ( ( pRoom_acoustics->pAcoustic_rt60[band_idx] > ACOUSTIC_RT60_MAX ) || ( pRoom_acoustics->pAcoustic_rt60[band_idx] < ACOUSTIC_RT60_MIN ) ) + { + tab_value_err_count++; + } + + /* Check the input DSR values */ + if ( ( pRoom_acoustics->pAcoustic_dsr[band_idx] > ACOUSTIC_DSR_MAX ) || ( pRoom_acoustics->pAcoustic_dsr[band_idx] < ACOUSTIC_DSR_MIN ) ) + { + tab_value_err_count++; + } + + /* Replace zero DSR values with very small positive values, to avoid issues with coloration filter design */ + if ( pRoom_acoustics->pAcoustic_dsr[band_idx] <= 0.0f ) + { + pRoom_acoustics->pAcoustic_dsr[band_idx] = ACOUSTIC_DSR_EPSILON; + } + } + + if ( tab_value_err_count != 0 ) + { + return IVAS_ERR_WRONG_PARAMS; + } + + + + if ( pRoom_acoustics->use_er == 1 ) + { + /* Room dimensions */ + if ( pRoom_acoustics->dimensions.x < ER_MIN_ROOM_DIMENSION ) + { + pRoom_acoustics->dimensions.x = ER_MIN_ROOM_DIMENSION; + } + if ( pRoom_acoustics->dimensions.x > ER_MAX_ROOM_DIMENSION ) + { + pRoom_acoustics->dimensions.x = ER_MAX_ROOM_DIMENSION; + } + if ( pRoom_acoustics->dimensions.y < ER_MIN_ROOM_DIMENSION ) + { + pRoom_acoustics->dimensions.y = ER_MIN_ROOM_DIMENSION; + } + if ( pRoom_acoustics->dimensions.y > ER_MAX_ROOM_DIMENSION ) + { + pRoom_acoustics->dimensions.y = ER_MAX_ROOM_DIMENSION; + } + if ( pRoom_acoustics->dimensions.z < ER_MIN_ROOM_DIMENSION ) + { + pRoom_acoustics->dimensions.z = ER_MIN_ROOM_DIMENSION; + } + if ( pRoom_acoustics->dimensions.z > ER_MAX_ROOM_DIMENSION ) + { + pRoom_acoustics->dimensions.z = ER_MAX_ROOM_DIMENSION; + } + + /* Abs Coeff */ + for ( wall_idx = 0; wall_idx < ER_ABS_COEFF; wall_idx++ ) + { + if ( pRoom_acoustics->AbsCoeff[wall_idx] < ER_MIN_ABS_COEFF ) + { + pRoom_acoustics->AbsCoeff[wall_idx] = ER_MIN_ABS_COEFF; + } + if ( pRoom_acoustics->AbsCoeff[wall_idx] > ER_MAX_ABS_COEFF ) + { + pRoom_acoustics->AbsCoeff[wall_idx] = ER_MAX_ABS_COEFF; + } + } + } + + + return IVAS_ERR_OK; +} + + +/*------------------------------------------------------------------------------------------* + * RenderConfigReader_open() + * + * Allocates and initializes a renderer configuration reader instance + *------------------------------------------------------------------------------------------*/ + +ivas_error RenderConfigReader_open( + char *pConfigPath, /* i : renderer configuration file path */ + RenderConfigReader **ppRenderConfigReader /* o : RenderConfigReader handle */ +) +{ + RenderConfigReader *pSelf; + FILE *pConfigFile; + + /* Open the configuration file */ + if ( strlen( pConfigPath ) < 1 ) + { + return IVAS_ERR_FAILED_FILE_OPEN; + } + + pConfigFile = fopen( pConfigPath, "r" ); + + if ( !pConfigFile ) + { + return IVAS_ERR_FAILED_FILE_OPEN; + } + + pSelf = calloc( sizeof( RenderConfigReader ), 1 ); + pSelf->pConfigFile = pConfigFile; + pSelf->nFG = 0; + pSelf->pFG = NULL; + pSelf->nAE = 0; + pSelf->pAE = NULL; + pSelf->nDP = 0; + pSelf->pDP = NULL; + + *ppRenderConfigReader = pSelf; + return IVAS_ERR_OK; +} + + +/*------------------------------------------------------------------------------------------* + * RenderConfigReader_readBinary() + * + * Reads the binary configuration from a file + *------------------------------------------------------------------------------------------*/ + +static ivas_error RenderConfigReader_readBinary( + const char *pReverbConfigPath, /* i : Configuration file path */ + RenderConfigReader *pRenderConfigReader /* i/o: RenderConfigReader handle */ +) +{ + uint32_t file_size; + uint32_t value; + uint32_t signx, signy, k; + uint32_t i, m, n; + uint32_t nFG, nAE; + uint32_t nDP; + ivas_error error; + float freqHop; + uint32_t gridLen; + uint32_t subGridLen; + const float *pGrid; + FILE *pReverbConfigFile; + + /* Open the configuration file */ + pReverbConfigFile = fopen( pReverbConfigPath, "rb" ); + + if ( !pReverbConfigFile ) + { + return IVAS_ERR_FAILED_FILE_OPEN; + } + + /* Read the bitstream */ + fseek( pReverbConfigFile, 0, SEEK_END ); + file_size = ftell( pReverbConfigFile ); + rewind( pReverbConfigFile ); + + pRenderConfigReader->pBitstream = (uint8_t *) malloc( file_size * sizeof( uint8_t ) ); + if ( pRenderConfigReader->pBitstream == NULL ) + { + return IVAS_ERR_FAILED_ALLOC; + } + + fread( pRenderConfigReader->pBitstream, sizeof( uint8_t ), file_size, pReverbConfigFile ); + pRenderConfigReader->length = file_size; + /* we read the config twice in the decoder, so reset the read offset here */ + pRenderConfigReader->readOffset = 0; + + /****************************/ + /* Read the presence flag */ + /****************************/ + if ( ( error = read_bin_bool( pRenderConfigReader, &value ) ) != IVAS_ERR_OK ) + { + return error; + } + /* acoustic environment data available */ + if ( value == true ) + { + /****************************/ + /* Read the frequency grids */ + /****************************/ + + /* Number of frequency grids */ + if ( ( error = get_bin_count_or_index( pRenderConfigReader, &nFG ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Allocate memory for the frequency grids */ + if ( nFG > 0 ) + { + if ( pRenderConfigReader->nFG > 0 ) + { + for ( n = 0; n < pRenderConfigReader->nFG; n++ ) + { + free( pRenderConfigReader->pFG[n].pFc ); + } + free( pRenderConfigReader->pFG ); + } + pRenderConfigReader->nFG = nFG; + if ( ( pRenderConfigReader->pFG = (FrequencyGrid *) malloc( pRenderConfigReader->nFG * sizeof( FrequencyGrid ) ) ) == NULL ) + { + return IVAS_ERR_FAILED_ALLOC; + } + for ( n = 0; n < nFG; n++ ) + { + /* Initialize memory pointers to allow safe freeing ico errors */ + pRenderConfigReader->pFG[n].pFc = NULL; + } + } + + /* Loop through the frequency grids read from the binary stream */ + for ( n = 0; n < nFG; n++ ) + { + /* Read the representation method */ + value = 0; + if ( ( error = read_bin_bits( pRenderConfigReader, &value, 2 ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Process depending on the representation method */ + switch ( value ) + { + case FREQ_GRID_MODE_INDIVIDUAL_FREQUENCIES: + if ( ( error = get_bin_count_or_index( pRenderConfigReader, &pRenderConfigReader->pFG[n].nrBands ) ) != IVAS_ERR_OK ) + { + return error; + } + /* Allocate memory for the center frequency array */ + if ( ( pRenderConfigReader->pFG[n].pFc = (float *) malloc( pRenderConfigReader->pFG[n].nrBands * sizeof( float ) ) ) == NULL ) + { + return IVAS_ERR_FAILED_ALLOC; + } + /* Read the individual frequencies */ + for ( m = 0; m < pRenderConfigReader->pFG[n].nrBands; m++ ) + { + if ( ( error = get_bin_frequency( pRenderConfigReader, &pRenderConfigReader->pFG[n].pFc[m] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + break; + case FREQ_GRID_MODE_START_HOP_AMOUNT: + if ( ( error = get_bin_count_or_index( pRenderConfigReader, &pRenderConfigReader->pFG[n].nrBands ) ) != IVAS_ERR_OK ) + { + return error; + } + /* Allocate memory for the center frequency array */ + if ( ( pRenderConfigReader->pFG[n].pFc = (float *) malloc( pRenderConfigReader->pFG[n].nrBands * sizeof( float ) ) ) == NULL ) + { + return IVAS_ERR_FAILED_ALLOC; + } + /* Read the first frequency */ + if ( ( error = get_bin_frequency( pRenderConfigReader, &pRenderConfigReader->pFG[n].pFc[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + /* Read frequency hop from LUT */ + if ( ( error = read_bin_code_word( pRenderConfigReader, RC_LUT_FREQ_HOP, &freqHop ) ) != IVAS_ERR_OK ) + { + return error; + } + /* Fill up the center frequency array */ + for ( m = 1; m < pRenderConfigReader->pFG[n].nrBands; m++ ) + { + pRenderConfigReader->pFG[n].pFc[m] = pRenderConfigReader->pFG[n].pFc[m - 1] * freqHop; + } + break; + case FREQ_GRID_MODE_DEFAULT_BANDING: + /* Read the default grid ID */ + value = 0; + if ( ( error = read_bin_bits( pRenderConfigReader, &value, 4 ) ) != IVAS_ERR_OK ) + { + return error; + } + switch ( value ) + { + case 0: + gridLen = sizeof( defaultFrequencyGrid_0 ) / sizeof( defaultFrequencyGrid_0[0] ); + pGrid = defaultFrequencyGrid_0; + break; + case 1: + gridLen = sizeof( defaultFrequencyGrid_1 ) / sizeof( defaultFrequencyGrid_1[0] ); + pGrid = defaultFrequencyGrid_1; + break; + case 2: + gridLen = sizeof( defaultFrequencyGrid_2 ) / sizeof( defaultFrequencyGrid_2[0] ); + pGrid = defaultFrequencyGrid_2; + break; + case 3: + gridLen = sizeof( defaultFrequencyGrid_3 ) / sizeof( defaultFrequencyGrid_3[0] ); + pGrid = defaultFrequencyGrid_3; + break; + case 4: + gridLen = sizeof( defaultFrequencyGrid_4 ) / sizeof( defaultFrequencyGrid_4[0] ); + pGrid = defaultFrequencyGrid_4; + break; + case 5: + gridLen = sizeof( defaultFrequencyGrid_5 ) / sizeof( defaultFrequencyGrid_5[0] ); + pGrid = defaultFrequencyGrid_5; + break; + case 6: + gridLen = sizeof( defaultFrequencyGrid_6 ) / sizeof( defaultFrequencyGrid_6[0] ); + pGrid = defaultFrequencyGrid_6; + break; + case 7: + gridLen = sizeof( defaultFrequencyGrid_7 ) / sizeof( defaultFrequencyGrid_7[0] ); + pGrid = defaultFrequencyGrid_7; + break; + case 8: + gridLen = sizeof( defaultFrequencyGrid_8 ) / sizeof( defaultFrequencyGrid_8[0] ); + pGrid = defaultFrequencyGrid_8; + break; + default: + return IVAS_ERR_INVALID_RENDER_CONFIG; + } + + m = 0; + /* Read sub-grid flag */ + if ( ( error = read_bin_bool( pRenderConfigReader, &value ) ) != IVAS_ERR_OK ) + { + return error; + } + if ( value != false ) + { + /* Read the sub-grid offset */ + if ( ( error = read_bin_bits( pRenderConfigReader, &m, 3 ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Read the sub-grid length */ + subGridLen = 0; + if ( ( error = read_bin_bits( pRenderConfigReader, &subGridLen, 6 ) ) != IVAS_ERR_OK ) + { + return error; + } + if ( m + subGridLen > gridLen ) + { + return IVAS_ERR_INVALID_RENDER_CONFIG; + } + gridLen = subGridLen; + } + pRenderConfigReader->pFG[n].nrBands = gridLen; + /* Allocate memory for the center frequency array */ + if ( ( pRenderConfigReader->pFG[n].pFc = (float *) malloc( gridLen * sizeof( float ) ) ) == NULL ) + { + return IVAS_ERR_FAILED_ALLOC; + } + + /* Copy the ROM content to the frequency grid*/ + for ( i = 0; i < gridLen; i++ ) + { + pRenderConfigReader->pFG[n].pFc[i] = pGrid[m + i]; + } + + break; + default: + return IVAS_ERR_INVALID_RENDER_CONFIG; + } + /* Initialize memory pointers to allow safe freeing ico errors */ + pRenderConfigReader->pFG[n].pFc = NULL; + } + + /**********************************/ + /* Read the acoustic environments */ + /**********************************/ + + /* Number of acoustic environments */ + if ( ( error = get_bin_count_or_index( pRenderConfigReader, &nAE ) ) != IVAS_ERR_OK ) + { + return IVAS_ERR_INVALID_RENDER_CONFIG; + } + + /* Allocate memory for the acoustic environments array */ + if ( nAE > 0 ) + { + if ( pRenderConfigReader->nAE > 0 ) + { + for ( n = 0; n < pRenderConfigReader->nAE; n++ ) + { + free( pRenderConfigReader->pAE[n].pRT60 ); + free( pRenderConfigReader->pAE[n].pDSR ); + if ( pRenderConfigReader->pAE[n].pEarlyReflections != NULL ) + { + free( pRenderConfigReader->pAE[n].pEarlyReflections->pListenerOrigin ); + free( pRenderConfigReader->pAE[n].pEarlyReflections ); + } + } + free( pRenderConfigReader->pAE ); + } + pRenderConfigReader->nAE = nAE; + + if ( ( pRenderConfigReader->pAE = (AcousticEnv *) malloc( pRenderConfigReader->nAE * sizeof( AcousticEnv ) ) ) == NULL ) + { + return IVAS_ERR_FAILED_ALLOC; + } + /* Initialize memory pointers to allow safe freeing ico errors */ + for ( n = 0; n < nAE; n++ ) + { + pRenderConfigReader->pAE[n].pRT60 = NULL; + pRenderConfigReader->pAE[n].pDSR = NULL; + pRenderConfigReader->pAE[n].pEarlyReflections = NULL; + } + } + + /* Loop through the acoustic environments from the binary stream */ + for ( n = 0; n < nAE; n++ ) + { + /* Read the AE ID */ + if ( ( error = get_bin_id( pRenderConfigReader, &pRenderConfigReader->pAE[n].id ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Read the frequency grid ID */ + if ( ( error = get_bin_count_or_index( pRenderConfigReader, &value ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Associate the frequency grid */ + if ( value >= pRenderConfigReader->nFG ) + { + return IVAS_ERR_INVALID_RENDER_CONFIG; + } + + pRenderConfigReader->pAE[n].pFG = &( pRenderConfigReader->pFG[value] ); + + /* Allocate memory for RT60 and DSR arrays */ + if ( ( pRenderConfigReader->pAE[n].pRT60 = (float *) malloc( pRenderConfigReader->pAE[n].pFG->nrBands * sizeof( float ) ) ) == NULL ) + { + return IVAS_ERR_FAILED_ALLOC; + } + + if ( ( pRenderConfigReader->pAE[n].pDSR = (float *) malloc( pRenderConfigReader->pAE[n].pFG->nrBands * sizeof( float ) ) ) == NULL ) + { + return IVAS_ERR_FAILED_ALLOC; + } + + /* Read the values */ + if ( ( error = get_bin_duration( pRenderConfigReader, &pRenderConfigReader->pAE[n].preDelay ) ) != IVAS_ERR_OK ) + { + return error; + } + + for ( m = 0; m < pRenderConfigReader->pAE[n].pFG->nrBands; m++ ) + { + if ( ( error = get_bin_duration( pRenderConfigReader, &pRenderConfigReader->pAE[n].pRT60[m] ) ) != IVAS_ERR_OK ) + { + return IVAS_ERR_INVALID_RENDER_CONFIG; + } + } + for ( m = 0; m < pRenderConfigReader->pAE[n].pFG->nrBands; m++ ) + { + if ( ( error = get_bin_dsr( pRenderConfigReader, &pRenderConfigReader->pAE[n].pDSR[m] ) ) != IVAS_ERR_OK ) + { + return IVAS_ERR_INVALID_RENDER_CONFIG; + } + } + + /*****************************************/ + /* Read the early reflections parameters */ + /*****************************************/ + + /* Has early reflections */ + if ( ( error = read_bin_bool( pRenderConfigReader, &value ) ) != IVAS_ERR_OK ) + { + return error; + } + if ( value == true ) + { + if ( ( pRenderConfigReader->pAE[n].pEarlyReflections = (EarlyReflectionsConfig *) malloc( sizeof( EarlyReflectionsConfig ) ) ) == NULL ) + { + return IVAS_ERR_FAILED_ALLOC; + } + /* Initialize memory pointers to allow safe freeing ico eg errors */ + pRenderConfigReader->pAE[n].pEarlyReflections->pListenerOrigin = NULL; + + pRenderConfigReader->pAE[n].pEarlyReflections->use_er = 1; + + /* Room sizes */ + if ( ( error = get_bin_distance( pRenderConfigReader, true, &pRenderConfigReader->pAE[n].pEarlyReflections->dimensions.x ) ) != IVAS_ERR_OK ) + { + return error; + } + if ( ( error = get_bin_distance( pRenderConfigReader, true, &pRenderConfigReader->pAE[n].pEarlyReflections->dimensions.y ) ) != IVAS_ERR_OK ) + { + return error; + } + if ( ( error = get_bin_distance( pRenderConfigReader, true, &pRenderConfigReader->pAE[n].pEarlyReflections->dimensions.z ) ) != IVAS_ERR_OK ) + { + return error; + } + + for ( k = 0; k < N_ABS_COEFFS; k++ ) + { + if ( ( error = get_bin_absorption( pRenderConfigReader, &pRenderConfigReader->pAE[n].pEarlyReflections->pAbsCoeff[k] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* Has listener origin */ + if ( ( error = read_bin_bool( pRenderConfigReader, &value ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( value == true ) + { + if ( ( pRenderConfigReader->pAE[n].pEarlyReflections->pListenerOrigin = malloc( sizeof( IVAS_VECTOR3 ) ) ) == NULL ) + { + return IVAS_ERR_FAILED_ALLOC; + } + + if ( ( error = read_bin_bits( pRenderConfigReader, &signx, 1 ) ) != IVAS_ERR_OK ) + { + return error; + } + if ( ( error = read_bin_bits( pRenderConfigReader, &signy, 1 ) ) != IVAS_ERR_OK ) + { + return error; + } + if ( ( error = get_bin_distance( pRenderConfigReader, true, &pRenderConfigReader->pAE[n].pEarlyReflections->pListenerOrigin->x ) ) != IVAS_ERR_OK ) + { + return error; + } + if ( signx == 0 ) + { + pRenderConfigReader->pAE[n].pEarlyReflections->pListenerOrigin->x *= -1.0f; + } + if ( ( error = get_bin_distance( pRenderConfigReader, true, &pRenderConfigReader->pAE[n].pEarlyReflections->pListenerOrigin->y ) ) != IVAS_ERR_OK ) + { + return error; + } + if ( signy == 0 ) + { + pRenderConfigReader->pAE[n].pEarlyReflections->pListenerOrigin->y *= -1.0f; + } + if ( ( error = get_bin_distance( pRenderConfigReader, true, &pRenderConfigReader->pAE[n].pEarlyReflections->pListenerOrigin->z ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else /* load defaults if origin is not specified in config */ + { + if ( ( pRenderConfigReader->pAE[n].pEarlyReflections->pListenerOrigin = malloc( sizeof( IVAS_VECTOR3 ) ) ) == NULL ) + { + return IVAS_ERR_FAILED_ALLOC; + } + pRenderConfigReader->pAE[n].pEarlyReflections->pListenerOrigin->x = ER_LIST_ORIGIN_X; + pRenderConfigReader->pAE[n].pEarlyReflections->pListenerOrigin->y = ER_LIST_ORIGIN_Y; + pRenderConfigReader->pAE[n].pEarlyReflections->pListenerOrigin->z = ER_LIST_HEIGHT; + } + + /* Low complexity mode */ + if ( ( error = read_bin_bool( pRenderConfigReader, &pRenderConfigReader->pAE[n].pEarlyReflections->lowComplexity ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + } + /**********************************/ + /* Read the directivity patterns */ + /**********************************/ + + /* Has source directivity */ + if ( ( error = read_bin_bool( pRenderConfigReader, &value ) ) != IVAS_ERR_OK ) + { + return error; + } + if ( value == true ) + { + + /* Number of directivity patterns */ + if ( ( error = get_bin_id( pRenderConfigReader, &nDP ) ) != IVAS_ERR_OK ) + { + return IVAS_ERR_INVALID_RENDER_CONFIG; + } + + if ( nDP > 0 ) + { + if ( pRenderConfigReader->nDP > 0 ) + { + for ( n = 0; n < pRenderConfigReader->nDP; n++ ) + { + free( pRenderConfigReader->pDP[n].pDirectivity ); + } + free( pRenderConfigReader->pDP ); + } + + pRenderConfigReader->nDP = nDP; + + if ( ( pRenderConfigReader->pDP = (DirectrivityPat *) malloc( pRenderConfigReader->nDP * sizeof( DirectrivityPat ) ) ) == NULL ) + { + return IVAS_ERR_FAILED_ALLOC; + } + + for ( n = 0; n < nDP; n++ ) + { + /* Allocate memory for directivity arrays*/ + if ( ( pRenderConfigReader->pDP[n].pDirectivity = (float *) malloc( 3 * sizeof( float ) ) ) == NULL ) + { + return IVAS_ERR_FAILED_ALLOC; + } + } + } + /* Loop through the directivity patterns from the binary stream */ + for ( n = 0; n < nDP; n++ ) + { + + /* Read the Directivity ID */ + if ( ( error = get_bin_id( pRenderConfigReader, &pRenderConfigReader->pDP[n].id ) ) != IVAS_ERR_OK ) + { + return error; + } + if ( ( error = get_bin_angle( pRenderConfigReader, &pRenderConfigReader->pDP[n].pDirectivity[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + if ( ( error = get_bin_angle( pRenderConfigReader, &pRenderConfigReader->pDP[n].pDirectivity[1] ) ) != IVAS_ERR_OK ) + { + return error; + } + if ( ( error = get_bin_outer_attenuation( pRenderConfigReader, &pRenderConfigReader->pDP[n].pDirectivity[2] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + + /* Cleanup */ + free( pRenderConfigReader->pBitstream ); + + return IVAS_ERR_OK; +} + + +ivas_error RenderConfigReader_read( + RenderConfigReader *pRenderConfigReader, /* i : RenderConfigReader handle */ + const char *pRenderConfigPath, /* i : Renderer configuration file path */ + IVAS_RENDER_CONFIG_HANDLE hRenderConfig /* o : Renderer configuration handle */ +) +{ + int32_t file_size; + char *pConfig_str; + char *pParams; + char *pTemp; + int32_t read_idx; + int32_t params_idx; + char item[MAX_ITEM_LENGTH + 1]; + char chapter[MAX_ITEM_LENGTH + 1]; + char *pValue; + ivas_error error; + int32_t params_length; + int32_t length; + uint32_t i, idx; + uint32_t nFG, nAE; + char *pToken; + FREQ_GRID_MODE fgMode; + float freqHop; + uint32_t acIdx; + uint32_t defGridId, defGridLen, defGridOffset, defGridNrBands; + const float *pDefGrid; + float erTemp[N_ABS_COEFFS]; + uint32_t roomAcHasFgCount, roomAcHasAcEnvCount; + uint32_t fgHasMethod, fgHasNBands, fgHasFreqs, fgHasDefaultGrid, fgHasStartFreq, fgHasFreqHop; + uint32_t aeHasFgIdx, aeHasPredelay, aeHasRt60, aeHasDsr; + uint32_t aeHasERsize, aeHasERabs; + + uint32_t nDP; + uint32_t accDPIdx; + accDPIdx = 0; + + fseek( pRenderConfigReader->pConfigFile, 0, SEEK_END ); + file_size = ftell( pRenderConfigReader->pConfigFile ); + rewind( pRenderConfigReader->pConfigFile ); + pConfig_str = (char *) calloc( file_size + 1, sizeof( char ) ); + pParams = (char *) calloc( file_size + 1, sizeof( char ) ); + pTemp = (char *) calloc( file_size + 1, sizeof( char ) ); + acIdx = 0; + roomAcHasFgCount = roomAcHasAcEnvCount = FALSE; + setvbuf( pRenderConfigReader->pConfigFile, pConfig_str, _IONBF, sizeof( char ) ); /* Work-around for VS bug that gives incorrect ftell for UNIX-style line endings */ + + /* read file line by line */ + while ( fgets( pConfig_str, file_size, pRenderConfigReader->pConfigFile ) != NULL ) + { + + if ( sscanf( pConfig_str, "[%64[^]]]", chapter ) == 1 ) + { + /* read line by line (except comments) until next chapter or EOF */ + pParams[0] = '\0'; + do + { + read_idx = ftell( pRenderConfigReader->pConfigFile ); + if ( fgets( pTemp, file_size, pRenderConfigReader->pConfigFile ) == NULL ) + { + break; + } + + if ( ( pTemp[0] != '#' ) && ( sscanf( pTemp, "[%64[^]]]", item ) != 1 ) ) + { + /* ignore inline comments */ + sscanf( pTemp, "%[^#]", pTemp ); + strcat( pParams, pTemp ); + } + } while ( sscanf( pTemp, "[%64[^]]]", item ) != 1 ); + + /* go back one line */ + fseek( pRenderConfigReader->pConfigFile, read_idx, SEEK_SET ); + + strip_spaces( pParams ); + strcpy( pTemp, pParams ); + to_upper( pParams ); + to_upper( chapter ); + + /* interpret params */ + pToken = strtok( chapter, ":" ); + if ( strcmp( chapter, "ROOMACOUSTICS" ) == 0 && strlen( pParams ) != 0 ) + { + params_idx = 0; + pValue = (char *) calloc( strlen( pParams ), sizeof( char ) ); + + while ( sscanf( pParams + params_idx, "%64[^=]=%[^;];", item, pValue ) == 2 ) + { + params_idx += (int32_t) ( strlen( item ) + strlen( pValue ) + 2 ); + if ( strcmp( item, "FREQUENCYGRIDCOUNT" ) == 0 ) + { + /* Read the number of frequency grids */ + if ( !sscanf( pValue, "%u", &nFG ) ) + { + errorHandler( item, ERROR_VALUE_INVALID ); + return IVAS_ERR_INVALID_RENDER_CONFIG; + } + if ( nFG > 0 ) + { + for ( idx = 0; idx < pRenderConfigReader->nFG; idx++ ) + { + free( pRenderConfigReader->pFG[idx].pFc ); + } + free( pRenderConfigReader->pFG ); + + pRenderConfigReader->nFG = nFG; + + /* Allocate memory for the frequency grids */ + if ( ( pRenderConfigReader->pFG = (FrequencyGrid *) malloc( pRenderConfigReader->nFG * sizeof( FrequencyGrid ) ) ) == NULL ) + { + return IVAS_ERR_FAILED_ALLOC; + } + for ( idx = 0; idx < nFG; idx++ ) + { + pRenderConfigReader->pFG[idx].nrBands = 0; + pRenderConfigReader->pFG[idx].pFc = NULL; + } + } + roomAcHasFgCount = TRUE; + } + else if ( strcmp( item, "ACOUSTICENVIRONMENTCOUNT" ) == 0 ) + { + /* Read the number of acoustic environments */ + if ( !sscanf( pValue, "%u", &nAE ) ) + { + errorHandler( item, ERROR_VALUE_INVALID ); + return IVAS_ERR_INVALID_RENDER_CONFIG; + } + if ( nAE > 0 ) + { + for ( idx = 0; idx < pRenderConfigReader->nAE; idx++ ) + { + free( pRenderConfigReader->pAE[idx].pRT60 ); + free( pRenderConfigReader->pAE[idx].pDSR ); + if ( pRenderConfigReader->pAE[idx].pEarlyReflections != NULL ) + { + free( pRenderConfigReader->pAE[idx].pEarlyReflections->pListenerOrigin ); + free( pRenderConfigReader->pAE[idx].pEarlyReflections ); + } + } + free( pRenderConfigReader->pAE ); + + pRenderConfigReader->nAE = nAE; + + /* Allocate memory for the acoustic environments array */ + if ( ( pRenderConfigReader->pAE = (AcousticEnv *) malloc( pRenderConfigReader->nAE * sizeof( AcousticEnv ) ) ) == NULL ) + { + return IVAS_ERR_FAILED_ALLOC; + } + /* Initialize memory pointers to allow for safe freeing */ + for ( acIdx = 0; acIdx < pRenderConfigReader->nAE; acIdx++ ) + { + pRenderConfigReader->pAE[acIdx].pRT60 = NULL; + pRenderConfigReader->pAE[acIdx].pDSR = NULL; + pRenderConfigReader->pAE[acIdx].pEarlyReflections = NULL; + } + } + acIdx = 0; + roomAcHasAcEnvCount = TRUE; + } + } + if ( roomAcHasFgCount == FALSE || roomAcHasAcEnvCount == FALSE ) + { + return IVAS_ERR_INVALID_RENDER_CONFIG; + } + free( pValue ); + } + else if ( strcmp( pToken, "FREQUENCYGRID" ) == 0 ) + { + if ( pRenderConfigReader->pFG == NULL ) + { + return IVAS_ERR_INVALID_RENDER_CONFIG; + } + + idx = strtol( strtok( NULL, ":" ), NULL, 0 ); + if ( idx >= pRenderConfigReader->nFG ) + { + return IVAS_ERR_INVALID_RENDER_CONFIG; + } + + fgHasMethod = fgHasNBands = fgHasFreqs = fgHasDefaultGrid = fgHasStartFreq = fgHasFreqHop = FALSE; + fgMode = FREQ_GRID_MODE_UNKNOWN; + params_idx = 0; + pValue = (char *) calloc( strlen( pParams ), sizeof( char ) ); + while ( sscanf( pParams + params_idx, "%64[^=]=%[^;];", item, pValue ) == 2 ) + { + params_idx += (int32_t) ( strlen( item ) + strlen( pValue ) + 2 ); + if ( strcmp( item, "METHOD" ) == 0 ) + { + if ( strcmp( pValue, "INDIVIDUALFREQUENCIES" ) == 0 ) + { + fgMode = FREQ_GRID_MODE_INDIVIDUAL_FREQUENCIES; + } + else if ( strcmp( pValue, "STARTHOPAMOUNT" ) == 0 ) + { + fgMode = FREQ_GRID_MODE_START_HOP_AMOUNT; + } + else if ( strcmp( pValue, "DEFAULTBANDING" ) == 0 ) + { + fgMode = FREQ_GRID_MODE_DEFAULT_BANDING; + } + fgHasMethod = TRUE; + } + /* Read number of bands for individual frequency, start-hop-amount mode */ + else if ( strcmp( item, "NRBANDS" ) == 0 ) + { + if ( fgMode != FREQ_GRID_MODE_INDIVIDUAL_FREQUENCIES && fgMode != FREQ_GRID_MODE_START_HOP_AMOUNT ) + { + return IVAS_ERR_INVALID_RENDER_CONFIG; + } + if ( !sscanf( pValue, "%u", &pRenderConfigReader->pFG[idx].nrBands ) ) + { + errorHandler( item, ERROR_VALUE_INVALID ); + return IVAS_ERR_INVALID_RENDER_CONFIG; + } + /* Allocate memory for the center frequency array */ + if ( ( pRenderConfigReader->pFG[idx].pFc = (float *) malloc( pRenderConfigReader->pFG[idx].nrBands * sizeof( float ) ) ) == NULL ) + { + return IVAS_ERR_FAILED_ALLOC; + } + fgHasNBands = TRUE; + } + else if ( strcmp( item, "FREQUENCIES" ) == 0 ) + { + if ( fgMode != FREQ_GRID_MODE_INDIVIDUAL_FREQUENCIES || pRenderConfigReader->pFG[idx].nrBands == 0 || pRenderConfigReader->pFG[idx].pFc == NULL ) + { + return IVAS_ERR_INVALID_RENDER_CONFIG; + } + /* Read the individual frequencies */ + if ( read_txt_vector( pValue, pRenderConfigReader->pFG[idx].nrBands, pRenderConfigReader->pFG[idx].pFc ) ) + { + errorHandler( item, ERROR_VALUE_INVALID ); + return IVAS_ERR_INVALID_RENDER_CONFIG; + } + fgHasFreqs = TRUE; + } + else if ( strcmp( item, "STARTFREQUENCY" ) == 0 ) + { + if ( fgMode != FREQ_GRID_MODE_START_HOP_AMOUNT || pRenderConfigReader->pFG[idx].nrBands == 0 || pRenderConfigReader->pFG[idx].pFc == NULL ) + { + return IVAS_ERR_INVALID_RENDER_CONFIG; + } + if ( !sscanf( pValue, "%f", &pRenderConfigReader->pFG[idx].pFc[0] ) ) + { + errorHandler( item, ERROR_VALUE_INVALID ); + return IVAS_ERR_INVALID_RENDER_CONFIG; + } + fgHasStartFreq = TRUE; + } + else if ( strcmp( item, "FREQUENCYHOP" ) == 0 ) + { + if ( fgMode != FREQ_GRID_MODE_START_HOP_AMOUNT || pRenderConfigReader->pFG[idx].nrBands == 0 || pRenderConfigReader->pFG[idx].pFc == NULL || pRenderConfigReader->pFG[idx].pFc[0] == 0.0f ) + { + return IVAS_ERR_INVALID_RENDER_CONFIG; + } + if ( !sscanf( pValue, "%f", &freqHop ) ) + { + errorHandler( item, ERROR_VALUE_INVALID ); + return IVAS_ERR_INVALID_RENDER_CONFIG; + } + /* Fill up the center frequency array */ + for ( i = 1; i < pRenderConfigReader->pFG[idx].nrBands; i++ ) + { + pRenderConfigReader->pFG[idx].pFc[i] = pRenderConfigReader->pFG[idx].pFc[i - 1] * freqHop; + } + fgHasFreqHop = TRUE; + } + /* Handle default grids, with optional sub-grids */ + else if ( strcmp( item, "DEFAULTGRID" ) == 0 ) + { + if ( !sscanf( pValue, "%u", &defGridId ) ) + { + errorHandler( item, ERROR_VALUE_INVALID ); + return IVAS_ERR_INVALID_RENDER_CONFIG; + } + + switch ( defGridId ) + { + case 0: + defGridLen = sizeof( defaultFrequencyGrid_0 ) / sizeof( defaultFrequencyGrid_0[0] ); + pDefGrid = defaultFrequencyGrid_0; + break; + case 1: + defGridLen = sizeof( defaultFrequencyGrid_1 ) / sizeof( defaultFrequencyGrid_1[0] ); + pDefGrid = defaultFrequencyGrid_1; + break; + case 2: + defGridLen = sizeof( defaultFrequencyGrid_2 ) / sizeof( defaultFrequencyGrid_2[0] ); + pDefGrid = defaultFrequencyGrid_2; + break; + case 3: + defGridLen = sizeof( defaultFrequencyGrid_3 ) / sizeof( defaultFrequencyGrid_3[0] ); + pDefGrid = defaultFrequencyGrid_3; + break; + case 4: + defGridLen = sizeof( defaultFrequencyGrid_4 ) / sizeof( defaultFrequencyGrid_4[0] ); + pDefGrid = defaultFrequencyGrid_4; + break; + case 5: + defGridLen = sizeof( defaultFrequencyGrid_5 ) / sizeof( defaultFrequencyGrid_5[0] ); + pDefGrid = defaultFrequencyGrid_5; + break; + case 6: + defGridLen = sizeof( defaultFrequencyGrid_6 ) / sizeof( defaultFrequencyGrid_6[0] ); + pDefGrid = defaultFrequencyGrid_6; + break; + case 7: + defGridLen = sizeof( defaultFrequencyGrid_7 ) / sizeof( defaultFrequencyGrid_7[0] ); + pDefGrid = defaultFrequencyGrid_7; + break; + case 8: + defGridLen = sizeof( defaultFrequencyGrid_8 ) / sizeof( defaultFrequencyGrid_8[0] ); + pDefGrid = defaultFrequencyGrid_8; + break; + default: + return IVAS_ERR_INVALID_RENDER_CONFIG; + } + fgHasDefaultGrid = TRUE; + + /* Handle sub-grids */ + defGridOffset = 0; + defGridNrBands = defGridLen; + + while ( sscanf( pParams + params_idx, "%64[^=]=%[^;];", item, pValue ) == 2 ) + { + if ( strcmp( item, "DEFAULTGRIDOFFSET" ) == 0 ) + { + if ( !sscanf( pValue, "%u", &defGridOffset ) ) + { + errorHandler( item, ERROR_VALUE_INVALID ); + return IVAS_ERR_INVALID_RENDER_CONFIG; + } + } + else if ( strcmp( item, "DEFAULTGRIDNRBANDS" ) == 0 ) + { + if ( !sscanf( pValue, "%u", &defGridNrBands ) ) + { + errorHandler( item, ERROR_VALUE_INVALID ); + return IVAS_ERR_INVALID_RENDER_CONFIG; + } + } + else + { + break; + } + params_idx += (int32_t) ( strlen( item ) + strlen( pValue ) + 2 ); + } + + if ( defGridOffset + defGridNrBands > defGridLen ) + { + return IVAS_ERR_INVALID_RENDER_CONFIG; + } + pRenderConfigReader->pFG[idx].nrBands = defGridNrBands; + + /* Allocate memory for the center frequency array */ + if ( ( pRenderConfigReader->pFG[idx].pFc = (float *) malloc( defGridNrBands * sizeof( float ) ) ) == NULL ) + { + return IVAS_ERR_FAILED_ALLOC; + } + + /* Copy the ROM content to the frequency grid*/ + for ( i = 0; i < defGridNrBands; i++ ) + { + pRenderConfigReader->pFG[idx].pFc[i] = pDefGrid[defGridOffset + i]; + } + } + } + if ( fgHasMethod == FALSE || + ( fgMode == FREQ_GRID_MODE_INDIVIDUAL_FREQUENCIES && ( fgHasFreqs == FALSE || fgHasNBands == FALSE ) ) || + ( fgMode == FREQ_GRID_MODE_DEFAULT_BANDING && fgHasDefaultGrid == FALSE ) || + ( fgMode == FREQ_GRID_MODE_START_HOP_AMOUNT && ( fgHasStartFreq == FALSE || fgHasFreqHop == FALSE || fgHasNBands == FALSE ) ) ) + { + return IVAS_ERR_INVALID_RENDER_CONFIG; + } + free( pValue ); + } + /* Handle multiple acoustic environments */ + else if ( strcmp( pToken, "ACOUSTICENVIRONMENT" ) == 0 ) + { + if ( pRenderConfigReader->pAE == NULL || acIdx >= pRenderConfigReader->nAE ) + { + return IVAS_ERR_INVALID_RENDER_CONFIG; + } + idx = strtol( strtok( NULL, ":" ), NULL, 0 ); + pRenderConfigReader->pAE->id = idx; + + aeHasFgIdx = aeHasPredelay = aeHasRt60 = aeHasDsr = FALSE; + aeHasERsize = aeHasERabs = FALSE; + params_idx = 0; + pValue = (char *) calloc( strlen( pParams ), sizeof( char ) ); + while ( sscanf( pParams + params_idx, "%64[^=]=%[^;];", item, pValue ) == 2 ) + { + params_idx += (int32_t) ( strlen( item ) + strlen( pValue ) + 2 ); + /* Frequency grid index */ + if ( strcmp( item, "FREQUENCYGRIDINDEX" ) == 0 ) + { + if ( !sscanf( pValue, "%u", &i ) ) + { + errorHandler( item, ERROR_VALUE_INVALID ); + return IVAS_ERR_INVALID_RENDER_CONFIG; + } + if ( i > pRenderConfigReader->nFG || &pRenderConfigReader->pFG[i] == NULL ) + { + return IVAS_ERR_INVALID_RENDER_CONFIG; + } + pRenderConfigReader->pAE[acIdx].pFG = &pRenderConfigReader->pFG[i]; + + /* Allocate memory for RT60 and DSR arrays */ + if ( ( pRenderConfigReader->pAE[acIdx].pRT60 = (float *) malloc( pRenderConfigReader->pAE[acIdx].pFG->nrBands * sizeof( float ) ) ) == NULL ) + { + return IVAS_ERR_FAILED_ALLOC; + } + + if ( ( pRenderConfigReader->pAE[acIdx].pDSR = (float *) malloc( pRenderConfigReader->pAE[acIdx].pFG->nrBands * sizeof( float ) ) ) == NULL ) + { + return IVAS_ERR_FAILED_ALLOC; + } + aeHasFgIdx = TRUE; + } + + /* Acoustic pre-delay */ + else if ( strcmp( item, "ACOUSTICPREDELAY" ) == 0 ) + { + if ( !sscanf( pValue, "%f", &hRenderConfig->roomAcoustics.acousticPreDelay ) ) + { + errorHandler( item, ERROR_VALUE_INVALID ); + } + } + /* Pre-delay */ + else if ( strcmp( item, "PREDELAY" ) == 0 ) + { + if ( !sscanf( pValue, "%f", &pRenderConfigReader->pAE[acIdx].preDelay ) ) + { + errorHandler( item, ERROR_VALUE_INVALID ); + return IVAS_ERR_INVALID_RENDER_CONFIG; + } + aeHasPredelay = TRUE; + } + /* RT60 */ + else if ( strcmp( item, "RT60" ) == 0 ) + { + if ( read_txt_vector( pValue, pRenderConfigReader->pFG[idx].nrBands, pRenderConfigReader->pAE[acIdx].pRT60 ) ) + { + errorHandler( item, ERROR_VALUE_INVALID ); + return IVAS_ERR_INVALID_RENDER_CONFIG; + } + aeHasRt60 = TRUE; + } + /* DSR */ + else if ( strcmp( item, "DSR" ) == 0 ) + { + if ( read_txt_vector( pValue, pRenderConfigReader->pFG[idx].nrBands, pRenderConfigReader->pAE[acIdx].pDSR ) ) + { + errorHandler( item, ERROR_VALUE_INVALID ); + return IVAS_ERR_INVALID_RENDER_CONFIG; + } + aeHasDsr = TRUE; + } + else if ( strcmp( item, "EARLYREFLECTIONSSIZE" ) == 0 ) + { + if ( pRenderConfigReader->pAE[acIdx].pEarlyReflections == NULL ) + { + if ( ( pRenderConfigReader->pAE[acIdx].pEarlyReflections = (EarlyReflectionsConfig *) malloc( sizeof( EarlyReflectionsConfig ) ) ) == NULL ) + { + return IVAS_ERR_FAILED_ALLOC; + } + pRenderConfigReader->pAE[acIdx].pEarlyReflections->pListenerOrigin = NULL; + pRenderConfigReader->pAE[acIdx].pEarlyReflections->lowComplexity = FALSE; + } + if ( strcmp( item, "EARLYREFLECTIONSSIZE" ) == 0 ) + { + if ( read_txt_vector( pValue, 3, erTemp ) ) + { + errorHandler( item, ERROR_VALUE_INVALID ); + return IVAS_ERR_INVALID_RENDER_CONFIG; + } + pRenderConfigReader->pAE[acIdx].pEarlyReflections->dimensions.x = erTemp[0]; + pRenderConfigReader->pAE[acIdx].pEarlyReflections->dimensions.y = erTemp[1]; + pRenderConfigReader->pAE[acIdx].pEarlyReflections->dimensions.z = erTemp[2]; + aeHasERsize = TRUE; + } + } + else if ( strcmp( item, "ABSORPTIONCOEFFS" ) == 0 ) + { + if ( pRenderConfigReader->pAE[acIdx].pEarlyReflections == NULL ) + { + return IVAS_ERR_INVALID_RENDER_CONFIG; + } + if ( read_txt_vector( pValue, N_ABS_COEFFS, erTemp ) ) + { + errorHandler( item, ERROR_VALUE_INVALID ); + return IVAS_ERR_INVALID_RENDER_CONFIG; + } + for ( i = 0; i < N_ABS_COEFFS; i++ ) + { + pRenderConfigReader->pAE[acIdx].pEarlyReflections->pAbsCoeff[i] = erTemp[i]; + } + aeHasERabs = TRUE; + } + else if ( strcmp( item, "LISTENERORIGIN" ) == 0 ) + { + if ( pRenderConfigReader->pAE[acIdx].pEarlyReflections == NULL ) + { + return IVAS_ERR_INVALID_RENDER_CONFIG; + } + if ( read_txt_vector( pValue, 3, erTemp ) ) + { + errorHandler( item, ERROR_VALUE_INVALID ); + return IVAS_ERR_INVALID_RENDER_CONFIG; + } + if ( ( pRenderConfigReader->pAE[acIdx].pEarlyReflections->pListenerOrigin = malloc( sizeof( IVAS_VECTOR3 ) ) ) == NULL ) + { + return IVAS_ERR_FAILED_ALLOC; + } + pRenderConfigReader->pAE[acIdx].pEarlyReflections->pListenerOrigin->x = erTemp[0]; + pRenderConfigReader->pAE[acIdx].pEarlyReflections->pListenerOrigin->y = erTemp[1]; + pRenderConfigReader->pAE[acIdx].pEarlyReflections->pListenerOrigin->z = erTemp[2]; + } + else if ( strcmp( item, "LOWCOMPLEXITY" ) == 0 ) + { + if ( pRenderConfigReader->pAE[acIdx].pEarlyReflections == NULL ) + { + return IVAS_ERR_INVALID_RENDER_CONFIG; + } + if ( read_txt_bool( pValue, &pRenderConfigReader->pAE[acIdx].pEarlyReflections->lowComplexity ) ) + { + errorHandler( item, ERROR_VALUE_INVALID ); + return IVAS_ERR_INVALID_RENDER_CONFIG; + } + } + } + if ( aeHasFgIdx == FALSE || aeHasPredelay == FALSE || aeHasRt60 == FALSE || aeHasDsr == FALSE ) + { + return IVAS_ERR_INVALID_RENDER_CONFIG; + } + if ( aeHasERsize == TRUE && aeHasERabs == FALSE ) + { + return IVAS_ERR_INVALID_RENDER_CONFIG; + } + else if ( aeHasERsize == TRUE && aeHasERabs == TRUE ) + { + pRenderConfigReader->pAE[acIdx].pEarlyReflections->use_er = 1; + } + + free( pValue ); + acIdx++; + } + + else if ( strcmp( chapter, "DIRECTIVITYSETTING" ) == 0 && strlen( pParams ) != 0 ) + { + params_idx = 0; + pValue = (char *) calloc( strlen( pParams ), sizeof( char ) ); + + while ( sscanf( pParams + params_idx, "%64[^=]=%[^;];", item, pValue ) == 2 ) + { + params_idx += (int32_t) ( strlen( item ) + strlen( pValue ) + 2 ); + if ( strcmp( item, "DIRECTIVITYCOUNT" ) == 0 ) + { + /* Read the number of directivity chapters */ + if ( !sscanf( pValue, "%u", &nDP ) ) + { + errorHandler( item, ERROR_VALUE_INVALID ); + return IVAS_ERR_INVALID_RENDER_CONFIG; + } + if ( nDP > 0 ) + { + for ( idx = 0; idx < pRenderConfigReader->nDP; idx++ ) + { + free( pRenderConfigReader->pDP[idx].pDirectivity ); + } + + free( pRenderConfigReader->pDP ); + pRenderConfigReader->nDP = nDP; + + /* Allocate memory for the directivity pattern*/ + if ( ( pRenderConfigReader->pDP = (DirectrivityPat *) malloc( pRenderConfigReader->nDP * sizeof( DirectrivityPat ) ) ) == NULL ) + { + return IVAS_ERR_FAILED_ALLOC; + } + + for ( idx = 0; idx < nDP; idx++ ) + { + pRenderConfigReader->pDP[idx].pDirectivity = NULL; + } + } + accDPIdx = 0; + } + } + free( pValue ); + } + else if ( strcmp( pToken, "DIRECTIVITYPATTERN" ) == 0 ) + { + if ( pRenderConfigReader->pDP == NULL || accDPIdx >= pRenderConfigReader->nDP ) + { + return IVAS_ERR_INVALID_RENDER_CONFIG; + } + idx = strtol( strtok( NULL, ":" ), NULL, 0 ); + + params_idx = 0; + pValue = (char *) calloc( strlen( pParams ), sizeof( char ) ); + while ( sscanf( pParams + params_idx, "%64[^=]=%[^;];", item, pValue ) == 2 ) + { + params_idx += (int32_t) ( strlen( item ) + strlen( pValue ) + 2 ); + /* Allocate memory for directivity arrays*/ + if ( ( pRenderConfigReader->pDP[accDPIdx].pDirectivity = (float *) malloc( 3 * sizeof( float ) ) ) == NULL ) + { + return IVAS_ERR_FAILED_ALLOC; + } + + pRenderConfigReader->pDP[accDPIdx].id = idx; + + if ( strcmp( item, "DIRECTIVITY" ) == 0 ) + { + if ( read_txt_vector( pValue, 3, pRenderConfigReader->pDP[accDPIdx].pDirectivity ) ) + { + errorHandler( item, ERROR_VALUE_INVALID ); + return IVAS_ERR_INVALID_RENDER_CONFIG; + } + } + } + free( pValue ); + accDPIdx++; + } + else if ( strcmp( chapter, "GENERAL" ) == 0 && strlen( pParams ) != 0 ) + { + params_idx = 0; + pValue = (char *) calloc( strlen( pParams ), sizeof( char ) ); + while ( sscanf( pParams + params_idx, "%64[^=]=%[^;];", item, pValue ) == 2 ) + { + params_length = (int32_t) ( strlen( item ) + strlen( pValue ) + 2 ); + if ( strcmp( item, "BINARYCONFIG" ) == 0 ) + { + /* get correct case reverb configuration file path */ + sscanf( pTemp + params_idx, "%*[^=] = %[^;];", pValue ); + + /* make reverb configuration file path relative to render configuration file path */ + for ( length = (int32_t) strlen( pRenderConfigPath ) - 1; length >= 0; length-- ) + { + if ( pRenderConfigPath[length] == '\\' || pRenderConfigPath[length] == '/' ) + { + length++; + break; + } + } + if ( length < 0 ) + { + /* no slash found */ + length = 0; + } + char *pCombinedName = calloc( length + (int32_t) strlen( pValue ) + 1, sizeof( char ) ); + strncpy( pCombinedName, pRenderConfigPath, length ); + strcpy( pCombinedName + length, pValue ); + + if ( ( error = RenderConfigReader_readBinary( pCombinedName, pRenderConfigReader ) ) != IVAS_ERR_OK ) + { + errorHandler( item, ERROR_VALUE_INVALID ); + return IVAS_ERR_INVALID_RENDER_CONFIG; + } + free( pCombinedName ); + } + else + if ( strcmp( item, "DIRECTIVITY" ) == 0 ) + { + if ( read_txt_vector( pValue, 3, hRenderConfig->directivity ) ) + { + errorHandler( item, ERROR_VALUE_INVALID ); + } + } + params_idx += params_length; + } + free( pValue ); + } + else + { + fprintf( stderr, "Unknown chapter: %s\n", chapter ); + } + } + else if ( pConfig_str[0] == '#' ) + { + /* comment lines are to be ignored */ + } + } + + free( pConfig_str ); + free( pParams ); + free( pTemp ); + + if ( errorHandler( "", ERROR_NONE ) > 0 ) + { + fprintf( stderr, "Errors occurred\n" ); + return IVAS_ERR_FAILED_FILE_PARSE; + } + return IVAS_ERR_OK; +} + +/*------------------------------------------------------------------------------------------* + * RenderConfigReader_getEnvironment() + * + * Gets Acoustic environment with a given ID + *------------------------------------------------------------------------------------------*/ + +ivas_error RenderConfigReader_getAcousticEnvironment( + RenderConfigReader *pRenderConfigReader, /* i : RenderConfigReader handle */ + uint16_t id, /* i : Acoustic environment ID */ + IVAS_ROOM_ACOUSTICS_CONFIG_DATA *pAcEnv /* o : Target acoustic environment pointer */ +) +{ + uint16_t n, m; + uint16_t j; + + if ( pRenderConfigReader == NULL || pAcEnv == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + /* case when -aeid is not specified, select first ID from config file */ + if ( id == 65535 && pRenderConfigReader->nAE > 0 ) + { + id = (uint16_t) pRenderConfigReader->pAE[0].id; + } + + for ( n = 0; n < pRenderConfigReader->nAE; n++ ) + { + if ( id == pRenderConfigReader->pAE[n].id ) + { + pAcEnv->nBands = (int16_t) pRenderConfigReader->pAE[n].pFG->nrBands; + pAcEnv->inputPreDelay = pRenderConfigReader->pAE[n].preDelay; + for ( m = 0; m < pAcEnv->nBands; m++ ) + { + pAcEnv->pFc_input[m] = pRenderConfigReader->pAE[n].pFG->pFc[m]; + pAcEnv->pAcoustic_rt60[m] = pRenderConfigReader->pAE[n].pRT60[m]; + pAcEnv->pAcoustic_dsr[m] = pRenderConfigReader->pAE[n].pDSR[m]; + } + + /* If ER are allocated then propagate parameters */ + if ( pRenderConfigReader->pAE[n].pEarlyReflections != 0 ) + { + pAcEnv->use_er = pRenderConfigReader->pAE[n].pEarlyReflections->use_er; /* ER activation flag */ + pAcEnv->lowComplexity = pRenderConfigReader->pAE[n].pEarlyReflections->lowComplexity; /* Low complexity flag */ + pAcEnv->dimensions = pRenderConfigReader->pAE[n].pEarlyReflections->dimensions; + /* Use default listener origin position if non provided */ + if ( pRenderConfigReader->pAE[n].pEarlyReflections->pListenerOrigin == NULL ) + { + if ( ( pRenderConfigReader->pAE[n].pEarlyReflections->pListenerOrigin = malloc( sizeof( IVAS_VECTOR3 ) ) ) == NULL ) + { + return IVAS_ERR_FAILED_ALLOC; + } + pRenderConfigReader->pAE[n].pEarlyReflections->pListenerOrigin->x = ER_LIST_ORIGIN_X; + pRenderConfigReader->pAE[n].pEarlyReflections->pListenerOrigin->y = ER_LIST_ORIGIN_Y; + pRenderConfigReader->pAE[n].pEarlyReflections->pListenerOrigin->z = ER_LIST_HEIGHT; + } + pAcEnv->ListenerOrigin = *pRenderConfigReader->pAE[n].pEarlyReflections->pListenerOrigin; + for ( j = 0; j < IVAS_ROOM_ABS_COEFF; j++ ) + { + pAcEnv->AbsCoeff[j] = pRenderConfigReader->pAE[n].pEarlyReflections->pAbsCoeff[j]; + } + } + return IVAS_ERR_OK; + } + } + return IVAS_ERR_ACOUSTIC_ENVIRONMENT_MISSING; +} + + +/*------------------------------------------------------------------------------------------* + * RenderConfigReader_getDirectivity() + * + * Gets Directivity DirectrivityPatern with a given ID + *------------------------------------------------------------------------------------------*/ + +ivas_error RenderConfigReader_getDirectivity( + RenderConfigReader *pRenderConfigReader, /* i : RenderConfigReader handle */ + uint16_t *id, /* i : Directivity pattern ID */ + float *directivity /* o : Target directivity */ +) +{ + uint16_t n, m; + uint16_t last_specified_id; + bool idExists; + + if ( pRenderConfigReader == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + if ( pRenderConfigReader->pDP == NULL ) + { + for ( n = 0; n < MAX_NUM_OBJECTS; n++ ) + { + directivity[n * 3] = 360.0f; + directivity[n * 3 + 1] = 360.0f; + directivity[n * 3 + 2] = 1.0f; + } + } + else + { + last_specified_id = id[0]; + + /* set unpspecified Directivity Patterns ID to last specified ID */ + for ( n = MAX_NUM_OBJECTS - 1; n > 0; n-- ) + { + if ( id[n] != 65535 ) + { + last_specified_id = id[n]; + break; + } + } + /* case when -dpid is not specified, select first directivity pattern from config file */ + if ( n == 0 ) + { + last_specified_id = (uint16_t) pRenderConfigReader->pDP[0].id; + } + + for ( ; n < MAX_NUM_OBJECTS; n++ ) + { + id[n] = last_specified_id; + } + + + for ( n = 0; n < MAX_NUM_OBJECTS; n++ ) + { + idExists = false; + for ( m = 0; m < pRenderConfigReader->nDP; m++ ) + { + if ( id[n] == pRenderConfigReader->pDP[m].id ) + { + idExists = true; + mvr2r( pRenderConfigReader->pDP[m].pDirectivity, directivity + ( n * 3 ), 3 ); + break; + } + } + if ( !idExists ) + { + return IVAS_ERR_DIRECTIVITY_PATTERN_ID_MISSING; + } + } + } + return IVAS_ERR_OK; +} + + +/*------------------------------------------------------------------------------------------* + * RenderConfigReader_close() + * + * Closes the renderer configuration reader and deallocates memory + *------------------------------------------------------------------------------------------*/ + +void RenderConfigReader_close( + RenderConfigReader **ppRenderConfigReader /* i : RenderConfigReader handle */ +) +{ + uint32_t n; + + if ( ppRenderConfigReader == NULL || *ppRenderConfigReader == NULL ) + { + return; + } + + /* Free the acoustic environments */ + for ( n = 0; n < ( *ppRenderConfigReader )->nAE; n++ ) + { + if ( ( *ppRenderConfigReader )->pAE[n].pEarlyReflections != NULL ) + { + free( ( *ppRenderConfigReader )->pAE[n].pEarlyReflections->pListenerOrigin ); + free( ( *ppRenderConfigReader )->pAE[n].pEarlyReflections ); + } + free( ( *ppRenderConfigReader )->pAE[n].pRT60 ); + free( ( *ppRenderConfigReader )->pAE[n].pDSR ); + } + free( ( *ppRenderConfigReader )->pAE ); + + /* Free the frequency grids */ + for ( n = 0; n < ( *ppRenderConfigReader )->nFG; n++ ) + { + free( ( *ppRenderConfigReader )->pFG[n].pFc ); + } + free( ( *ppRenderConfigReader )->pFG ); + /* Free the directivity patterns */ + for ( n = 0; n < ( *ppRenderConfigReader )->nDP; n++ ) + { + free( ( *ppRenderConfigReader )->pDP[n].pDirectivity ); + } + free( ( *ppRenderConfigReader )->pDP ); + fclose( ( *ppRenderConfigReader )->pConfigFile ); + free( *ppRenderConfigReader ); + + return; +} diff --git a/lib_util/render_config_reader.h b/lib_util/render_config_reader.h new file mode 100644 index 0000000000000000000000000000000000000000..2e929643282ebc55dfdaff5c25f5c50cf0a26356 --- /dev/null +++ b/lib_util/render_config_reader.h @@ -0,0 +1,82 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#ifndef RENDER_CONFIG_READER_H +#define RENDER_CONFIG_READER_H + +#include "common_api_types.h" + + +typedef struct RenderConfigReader RenderConfigReader; + +typedef enum +{ + ERROR_NONE = 0, + ERROR_ITEM_UNKNOWN, + ERROR_VALUE_INVALID +} ERROR_CODES_t; + +/* Allocates and initializes a renderer configuration reader instance */ +ivas_error RenderConfigReader_open( + char *pConfigPath, /* i : renderer configuration file path */ + RenderConfigReader **ppRenderConfigReader /* o : RenderConfigReader handle */ +); + +/* Get an acoustic environment */ +ivas_error RenderConfigReader_getAcousticEnvironment( + RenderConfigReader *pRenderConfigReader, /* i : RenderConfigReader handle */ + uint16_t id, /* i : Acoustic environment ID */ + IVAS_ROOM_ACOUSTICS_CONFIG_DATA *pAcEnv /* o : Target acoustic environment pointer */ +); +ivas_error RenderConfigReader_getDirectivity( + RenderConfigReader *pRenderConfigReader, /* i : RenderConfigReader handle */ + uint16_t *pId, /* i : Directivity pattern ID */ + float *directivity /* o : Target directivity */ +); +/* Verifies configuration parameters */ +ivas_error RenderConfigReader_checkValues( + IVAS_RENDER_CONFIG_HANDLE hRenderConfig /* o : Renderer configuration handle */ +); + +/* Reads a configuration */ +ivas_error RenderConfigReader_read( + RenderConfigReader *pRenderConfigReader, /* i : RenderConfigReader handle */ + const char *pRenderConfigPath, /* i : Renderer configuration file path */ + IVAS_RENDER_CONFIG_HANDLE hRenderConfig /* o : Renderer configuration handle */ +); + +/* Closes the renderer configuration reader and deallocates memory */ +void RenderConfigReader_close( + RenderConfigReader **ppRenderConfigReader /* i : RenderConfigReader handle */ +); + +#endif diff --git a/lib_util/rotation_file_reader.c b/lib_util/rotation_file_reader.c new file mode 100644 index 0000000000000000000000000000000000000000..19721f49bad23f5bf75ed460e4a82aff3f1bf40a --- /dev/null +++ b/lib_util/rotation_file_reader.c @@ -0,0 +1,232 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include "rotation_file_reader.h" +#include +#include +#include +#include "prot.h" + + +struct RotFileReader +{ + FILE *trajFile; + int32_t frameCounter; + char *file_path; + bool fileRewind; +}; + + +/*-----------------------------------------------------------------------* + * RotationFileReader_open() + * + * Allocate and initialize rotation reader + *-----------------------------------------------------------------------*/ + +ivas_error RotationFileReader_open( + char *trajFilePath, /* i : rotation trajectory file name */ + RotFileReader **rotReader /* o : RotFileReader handle */ +) +{ + RotFileReader *self; + FILE *trajFile; + + /* Open trajectory file */ + if ( strlen( trajFilePath ) < 1 ) + { + return IVAS_ERR_FAILED_FILE_OPEN; + } + + trajFile = fopen( trajFilePath, "r" ); + + if ( !trajFile ) + { + return IVAS_ERR_FAILED_FILE_OPEN; + } + + self = calloc( sizeof( RotFileReader ), 1 ); + self->trajFile = trajFile; + self->frameCounter = 0; + self->file_path = calloc( sizeof( char ), strlen( trajFilePath ) + 1 ); + strcpy( self->file_path, trajFilePath ); + self->fileRewind = false; + + *rotReader = self; + + return IVAS_ERR_OK; +} + + +/*-----------------------------------------------------------------------* + * HeadRotationFileReading() + * + * Read values from the trajectory file + *-----------------------------------------------------------------------*/ + +ivas_error HeadRotationFileReading( + RotFileReader *headRotReader, /* i/o: HeadRotFileReader handle */ + IVAS_QUATERNION *pQuaternion, /* o : head-tracking data */ + IVAS_VECTOR3 *pPos /* o : listener position */ +) +{ + float w, x, y, z; + float posx, posy, posz; + int32_t read_values; + + posx = 0.0f; + posy = 0.0f; + posz = 0.0f; + + read_values = fscanf( headRotReader->trajFile, "%f,%f,%f,%f,%f,%f,%f", &w, &x, &y, &z, &posx, &posy, &posz ); + if ( ( read_values != 4 ) && ( read_values != 7 ) ) /* Allow either orientation (4) or orientation+position (4+3) */ + { + if ( feof( headRotReader->trajFile ) ) + { + rewind( headRotReader->trajFile ); + headRotReader->fileRewind = true; + return HeadRotationFileReading( headRotReader, pQuaternion, pPos ); + } + return IVAS_ERR_FAILED_FILE_PARSE; + } + + ( headRotReader->frameCounter )++; + + pQuaternion->w = w; + pQuaternion->x = x; + pQuaternion->y = y; + pQuaternion->z = z; + if ( pPos != NULL ) + { + pPos->x = posx; + pPos->y = posy; + pPos->z = posz; + } + + return IVAS_ERR_OK; +} + +/*-----------------------------------------------------------------------* + * ExternalOrientationFileReading() + * + * Read values from the trajectory file + *-----------------------------------------------------------------------*/ + +ivas_error ExternalOrientationFileReading( + RotFileReader *externalOrientationReader, /* i/o: ExternalOrientationReader handle */ + IVAS_QUATERNION *pQuaternion, /* o : external orientation data */ + int8_t *enableHeadRotation, /* o : flag to enable head rotation for this frame */ + int8_t *enableExternalOrientation, /* o : flag to enable external orientation for this frame */ + int8_t *enableRotationInterpolation, /* o : flag to enable interpolation between the current and target orientations */ + int16_t *numFramesToTargetOrientation /* o : number of frames until target orientation is reached */ +) +{ + float w, x, y, z; + float headRotFlag; + float extOrientationFlag; + float rotInterpolationFlag; + float nFramesToTarget; + int32_t read_values; + + /* Initial values, if they are not read from the file */ + headRotFlag = 1; + extOrientationFlag = 1; + rotInterpolationFlag = 0; + nFramesToTarget = 0; + + read_values = fscanf( externalOrientationReader->trajFile, "%f,%f,%f,%f,%f,%f,%f,%f", &w, &x, &y, &z, &headRotFlag, &extOrientationFlag, &rotInterpolationFlag, &nFramesToTarget ); + if ( ( read_values != 4 ) && ( read_values != 5 ) && ( read_values != 6 ) && ( read_values != 7 ) && ( read_values != 8 ) ) /* Allow either orientation (4) OR orientation + headRotationFlag (5) OR orientation + headRotationFlag + extOrientationFlag (6) OR orientation + headRotationFlag + extOrientationFlag + rotInterpolationFlag (7) OR orientation + headRotationFlag + extOrientationFlag + rotInterpolationFlag + number of frames to target (8) */ + { + if ( feof( externalOrientationReader->trajFile ) ) + { + rewind( externalOrientationReader->trajFile ); + externalOrientationReader->fileRewind = true; + return ExternalOrientationFileReading( externalOrientationReader, pQuaternion, enableHeadRotation, enableExternalOrientation, enableRotationInterpolation, numFramesToTargetOrientation ); + } + return IVAS_ERR_FAILED_FILE_PARSE; + } + + ( externalOrientationReader->frameCounter )++; + + pQuaternion->w = w; + pQuaternion->x = x; + pQuaternion->y = y; + pQuaternion->z = z; + *enableHeadRotation = (int8_t) headRotFlag; + *enableExternalOrientation = (int8_t) extOrientationFlag; + *enableRotationInterpolation = (int8_t) rotInterpolationFlag; + *numFramesToTargetOrientation = (int16_t) nFramesToTarget; + + return IVAS_ERR_OK; +} + + +/*-----------------------------------------------------------------------* + * RotationFileReader_close() + * + * Deallocates memory for the rotation reader + *-----------------------------------------------------------------------*/ + +void RotationFileReader_close( + RotFileReader **rotReader /* i/o: RotFileReader handle */ +) +{ + if ( rotReader == NULL || *rotReader == NULL ) + { + return; + } + + fclose( ( *rotReader )->trajFile ); + free( ( *rotReader )->file_path ); + free( *rotReader ); + *rotReader = NULL; + + return; +} + + +/*-----------------------------------------------------------------------* + * HeadRotationFileReader_getFilePath() + * + * + *-----------------------------------------------------------------------*/ + +const char *RotationFileReader_getFilePath( + RotFileReader *rotReader /* i/o: RotFileReader handle */ +) +{ + if ( rotReader == NULL ) + { + return NULL; + } + + return rotReader->file_path; +} diff --git a/lib_util/rotation_file_reader.h b/lib_util/rotation_file_reader.h new file mode 100644 index 0000000000000000000000000000000000000000..1ae772fceb19d61eb28392282f0494222b705ffc --- /dev/null +++ b/lib_util/rotation_file_reader.h @@ -0,0 +1,100 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#ifndef IVAS_ROTATION_FILE_READER_H +#define IVAS_ROTATION_FILE_READER_H + +#include "common_api_types.h" + + +typedef struct RotFileReader RotFileReader; + +/*-----------------------------------------------------------------------* + * RotationFileReader_open() + * + * Allocate and initialize rotation handle + *-----------------------------------------------------------------------*/ + +ivas_error RotationFileReader_open( + char *trajFilePath, /* i : rotation trajectory file name */ + RotFileReader **rotReader /* o : RotFileReader handle */ +); + +/*-----------------------------------------------------------------------* + * RotationFileReading() + * + * Read values from the trajectory file + *-----------------------------------------------------------------------*/ + +ivas_error HeadRotationFileReading( + RotFileReader *headRotReader, /* i/o: RotFileReader handle */ + IVAS_QUATERNION *pQuaternion, /* o : head-tracking data */ + IVAS_VECTOR3 *pPos /* o : listener position */ +); + +/*-----------------------------------------------------------------------* + * ExternalOrientationFileReading() + * + * Read values from the trajectory file + *-----------------------------------------------------------------------*/ + +ivas_error ExternalOrientationFileReading( + RotFileReader *externalOrientationReader, /* i/o: RotFileReader handle */ + IVAS_QUATERNION *pQuaternion, /* o : external orientation data */ + int8_t *enableHeadRotation, /* o : flag to enable head rotation for this frame */ + int8_t *enableExternalOrientation, /* o : flag to enable external orientation for this frame */ + int8_t *enableRotationInterpolation, /* o : flag to enable interpolation between the current and target orientations */ + int16_t *numFramesToTargetOrientation /* o : number of frames until target orientation is achieved */ +); + +/*-----------------------------------------------------------------------* + * RotationFileReader_close() + * + * Deallocates memory for the rotation handle + *-----------------------------------------------------------------------*/ + +void RotationFileReader_close( + RotFileReader **rotReader /* i/o: RotFileReader handle */ +); + +/*-----------------------------------------------------------------------* + * RotationFileReader_getFilePath() + * + * + *-----------------------------------------------------------------------*/ + +const char *RotationFileReader_getFilePath( + RotFileReader *rotReader /* i/o: RotFileReader handle */ +); + + +#endif /* IVAS_ROTATION_FILE_READER_H */ diff --git a/lib_util/rtpdump.c b/lib_util/rtpdump.c new file mode 100644 index 0000000000000000000000000000000000000000..262f114a13ef015d83562bb35d5d978ed0bc794a --- /dev/null +++ b/lib_util/rtpdump.c @@ -0,0 +1,383 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#include +#include +#include +#include "rtpdump.h" + +struct RTPDUMP +{ + FILE *file; + unsigned int startSeconds; + unsigned int startMicroSeconds; + unsigned int source; + unsigned short port; +}; + +/** function to read a 32-bit value from a buffer */ +static unsigned char *parseLong( unsigned char *buffer, unsigned int *value ) +{ + *value = 0; + *value = (unsigned int) ( buffer[3] & 0xFF ); + *value |= (unsigned int) ( buffer[2] & 0xFF ) << 8; + *value |= (unsigned int) ( buffer[1] & 0xFF ) << 16; + *value |= (unsigned int) ( buffer[0] & 0xFF ) << 24; + return buffer + 4; +} + +/** function to read a 16-bit value from a buffer */ +static unsigned char *parseShort( unsigned char *buffer, unsigned short *value ) +{ + *value = 0; + *value = (unsigned int) ( buffer[1] & 0xFF ); + *value |= (unsigned int) ( buffer[0] & 0xFF ) << 8; + return buffer + 2; +} + +/** function to read a 8-bit value from a buffer */ +static unsigned char *parseByte( unsigned char *buffer, unsigned char *value ) +{ + *value = 0; + *value = (unsigned int) ( buffer[0] & 0xFF ); + return buffer + 1; +} + +/** function to read a 32-bit value from the file */ +static int readLong( FILE *file, unsigned int *value ) +{ + char buffer[4] = { 0 }; + if ( fread( buffer, 4, 1, file ) != 1U ) + { + return -1; + } + *value = 0; + *value = (unsigned int) ( buffer[3] & 0xFF ); + *value |= (unsigned int) ( buffer[2] & 0xFF ) << 8; + *value |= (unsigned int) ( buffer[1] & 0xFF ) << 16; + *value |= (unsigned int) ( buffer[0] & 0xFF ) << 24; + return 0; +} + +/** function to read a 16-bit value from the file */ +static int readShort( FILE *file, unsigned short *value ) +{ + char buffer[2] = { 0 }; + if ( fread( buffer, 2, 1, file ) != 1U ) + { + return -1; + } + *value = 0; + *value = (unsigned int) ( buffer[1] & 0xFF ); + *value |= (unsigned int) ( buffer[0] & 0xFF ) << 8; + return 0; +} + +/** function to write a 32-bit value to the file */ +static int writeLong( FILE *file, unsigned int value ) +{ + char buffer[4] = { 0 }; + buffer[3] = value & 0xff; + buffer[2] = ( value >> 8 ) & 0xff; + buffer[1] = ( value >> 16 ) & 0xff; + buffer[0] = ( value >> 24 ) & 0xff; + if ( fwrite( buffer, 4, 1, file ) != 1U ) + { + return -1; + } + return 0; +} + +/** function to write a 16-bit value to the file */ +static int writeShort( FILE *file, unsigned short value ) +{ + char buffer[2] = { 0 }; + buffer[1] = value & 0xff; + buffer[0] = ( value >> 8 ) & 0xff; + if ( fwrite( buffer, 2, 1, file ) != 1U ) + { + return -1; + } + return 0; +} + +/** function to write a 8-bit value to the file */ +static int writeByte( FILE *file, unsigned char value ) +{ + if ( fputc( value, file ) == value ) + { + return 0; + } + return -1; +} + +/** function to parse the rtpdump file header */ +static int readHeader( struct RTPDUMP *hRTPDUMP ) +{ + unsigned short padding; + char buffer[255] = { 0 }; + /* read identifier */ + /* + char buffer[255] = {0}; + const char id [] = "#!rtpplay1.0"; + fgets( buffer, sizeof(buffer), hRTPDUMP->file ); + if( memcmp( buffer, id, sizeof(id)-1 ) != 0 ) + return -1; + */ + char version[4] = { 0 }; + char address[128] = { 0 }; + unsigned int port = 0; + unsigned int a, b, c, d; + + fgets( buffer, sizeof( buffer ), hRTPDUMP->file ); + if ( sscanf( buffer, "#!rtpplay%3s %127[0123456789.]/%u\n", version, address, &port ) == 3 ) + { + if ( sscanf( address, "%u.%u.%u.%u", &a, &b, &c, &d ) != 4 ) + { + return -1; + } + } + else if ( sscanf( buffer, "#!rtpplay%3s %127[0123456789abcdef:]/%u\n", version, address, &port ) == 3 ) + /* no verification of IPv6 addresses yet */ + { + } + else + { + fprintf( stderr, "unable to read rtpplay\n" ); + fprintf( stderr, "Buffer: %s\n", buffer ); + return -1; + } + if ( strcmp( version, "1.0" ) ) + { + return -1; + } + + /* read binary header (RD_hdr_t) */ + readLong( hRTPDUMP->file, &( hRTPDUMP->startSeconds ) ); + readLong( hRTPDUMP->file, &( hRTPDUMP->startMicroSeconds ) ); + readLong( hRTPDUMP->file, &( hRTPDUMP->source ) ); + readShort( hRTPDUMP->file, &( hRTPDUMP->port ) ); + readShort( hRTPDUMP->file, &padding ); + + return 0; +} + +static int writeHeader( struct RTPDUMP *hRTPDUMP ) +{ + /* write rtpdump header */ + fprintf( hRTPDUMP->file, "#!rtpplay%s %s/%d\n", "1.0", "127.0.0.1", 5000 ); + if ( !writeLong( hRTPDUMP->file, hRTPDUMP->startSeconds ) && + !writeLong( hRTPDUMP->file, hRTPDUMP->startMicroSeconds ) && + !writeLong( hRTPDUMP->file, hRTPDUMP->source ) && + !writeShort( hRTPDUMP->file, hRTPDUMP->port ) && + !writeShort( hRTPDUMP->file, 0 ) ) + { + return 0; + } + return -1; +} + +RTPDUMP_ERROR +RTPDUMP_OpenForReading( RTPDUMP_HANDLE *phRTPDUMP, const char *filename ) +{ + return RTPDUMP_OpenWithFileToRead( phRTPDUMP, fopen( filename, "rb" ) ); +} + +RTPDUMP_ERROR +RTPDUMP_OpenWithFileToRead( RTPDUMP_HANDLE *phRTPDUMP, FILE *file ) +{ + *phRTPDUMP = (RTPDUMP_HANDLE) calloc( 1, sizeof( struct RTPDUMP ) ); + if ( !phRTPDUMP ) + { + return RTPDUMP_MEMORY_ERROR; + } + + /* open file stream */ + ( *phRTPDUMP )->file = file; + if ( ( *phRTPDUMP )->file == NULL ) + { + return RTPDUMP_FILE_NOT_FOUND; + } + + if ( readHeader( *phRTPDUMP ) != 0 ) + { + return RTPDUMP_INIT_ERROR; + } + + return RTPDUMP_NO_ERROR; +} + +RTPDUMP_ERROR +RTPDUMP_OpenForWriting( RTPDUMP_HANDLE *phRTPDUMP, const char *filename ) +{ + *phRTPDUMP = (RTPDUMP_HANDLE) calloc( 1, sizeof( struct RTPDUMP ) ); + if ( !phRTPDUMP ) + { + return RTPDUMP_MEMORY_ERROR; + } + + /* open file stream */ + ( *phRTPDUMP )->file = fopen( filename, "wb" ); + if ( ( *phRTPDUMP )->file == NULL ) + { + return RTPDUMP_FILE_NOT_FOUND; + } + + if ( writeHeader( *phRTPDUMP ) != 0 ) + { + return RTPDUMP_INIT_ERROR; + } + + return RTPDUMP_NO_ERROR; +} + +RTPDUMP_ERROR +RTPDUMP_ReadPacket( RTPDUMP_HANDLE hRTPDUMP, + RTPDUMP_RTPPACKET *packet, + uint32_t *timeoffset_ms ) +{ + unsigned short length = 0; + + if ( !hRTPDUMP ) + { + return RTPDUMP_NOT_INITIALIZED; + } + + /* length of packet, including this header (may be smaller than plen if not whole packet recorded) */ + if ( readShort( hRTPDUMP->file, &length ) ) + { + return RTPDUMP_READ_ENDOFFILE; + } + length -= 8; + + /* actual header+payload length for RTP, 0 for RTCP */ + if ( readShort( hRTPDUMP->file, &( packet->payloadSize ) ) ) + { + return RTPDUMP_READ_ERROR; + } + if ( packet->payloadSize < length ) + { + return RTPDUMP_UNKNOWN_ERROR; + } + + /* remove size of RTP header so that plen is payload length */ + packet->headerSize = 12; + packet->payloadSize -= packet->headerSize; + + /* milliseconds since the start of recording */ + if ( readLong( hRTPDUMP->file, timeoffset_ms ) ) + { + return RTPDUMP_READ_ERROR; + } + + if ( length > sizeof( packet->data ) / sizeof( packet->data[0] ) ) + { + return RTPDUMP_UNKNOWN_ERROR; + } + + /* read entire RTP packet */ + if ( length != 0U ) + { + fread( packet->data, length, 1, hRTPDUMP->file ); + } + + RTPDUMP_ParseRTPHeader( packet ); + return RTPDUMP_NO_ERROR; +} + +RTPDUMP_ERROR +RTPDUMP_WritePacket( RTPDUMP_HANDLE hRTPDUMP, + const RTPDUMP_RTPPACKET *packet, + uint32_t timeoffset_ms ) +{ + /* rtpdump packet header */ + writeShort( hRTPDUMP->file, 8 + packet->headerSize + packet->payloadSize ); + writeShort( hRTPDUMP->file, packet->headerSize + packet->payloadSize ); + writeLong( hRTPDUMP->file, timeoffset_ms ); + + /* RTP header */ + writeByte( hRTPDUMP->file, packet->v_p_x_xx ); + writeByte( hRTPDUMP->file, packet->payloadTypeId ); + writeShort( hRTPDUMP->file, packet->sequenceNumber ); + writeLong( hRTPDUMP->file, packet->timeStamp ); + writeLong( hRTPDUMP->file, packet->ssrc ); + + /* RTP payload */ + fwrite( packet->data + packet->headerSize, packet->payloadSize, 1, hRTPDUMP->file ); + return RTPDUMP_NO_ERROR; +} + +void RTPDUMP_Close( RTPDUMP_HANDLE *phRTPDUMP, short closeFile ) +{ + if ( !phRTPDUMP ) + { + return; + } + + if ( !( *phRTPDUMP ) ) + { + return; + } + + if ( closeFile && ( *phRTPDUMP )->file ) + { + fclose( ( *phRTPDUMP )->file ); + } + + free( *phRTPDUMP ); + *phRTPDUMP = NULL; +} + +void RTPDUMP_SetDefaultRtpPacketHeader( RTPDUMP_RTPPACKET *packet ) +{ + packet->v_p_x_xx = 128; + packet->payloadTypeId = 96; + packet->sequenceNumber = 0; + packet->timeStamp = 0; + packet->ssrc = 0xaabbccdd; + packet->headerSize = 12; + packet->payloadSize = 0; +} + +void RTPDUMP_ParseRTPHeader( RTPDUMP_RTPPACKET *packet ) +{ + unsigned char *payload = (unsigned char *) packet->data; + payload = parseByte( payload, &( packet->v_p_x_xx ) ); + payload = parseByte( payload, &( packet->payloadTypeId ) ); + payload = parseShort( payload, &( packet->sequenceNumber ) ); + payload = parseLong( payload, &( packet->timeStamp ) ); + parseLong( payload, &( packet->ssrc ) ); +} diff --git a/lib_util/rtpdump.h b/lib_util/rtpdump.h new file mode 100644 index 0000000000000000000000000000000000000000..46300c0e9a1e85fbd704ea54df6da123e40df741 --- /dev/null +++ b/lib_util/rtpdump.h @@ -0,0 +1,107 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#pragma once +#include +#include + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef enum _RTPDUMP_ERROR + { + RTPDUMP_NO_ERROR = 0x0000, + RTPDUMP_MEMORY_ERROR = 0x0001, + RTPDUMP_WRONG_PARAMS = 0x0002, + RTPDUMP_INIT_ERROR = 0x0003, + RTPDUMP_WRITE_ERROR = 0x0004, + RTPDUMP_READ_ERROR = 0x0005, + RTPDUMP_FILE_NOT_FOUND = 0x0006, + RTPDUMP_NOT_IMPLEMENTED = 0x0010, + RTPDUMP_NOT_INITIALIZED = 0x0100, + RTPDUMP_READ_ENDOFFILE = 0x0101, + RTPDUMP_UNKNOWN_ERROR = 0x1000 + } RTPDUMP_ERROR; + + typedef struct RTPDUMP *RTPDUMP_HANDLE; + typedef struct RTPDUMP RTPDUMP; + + typedef struct RTPDUMP_RTPPACKET + { + unsigned char v_p_x_xx; /* version, padding, extension etc. */ + unsigned char payloadTypeId; + unsigned short sequenceNumber; + unsigned int timeStamp; + unsigned int ssrc; + char data[1500 + 12]; /* raw RTP packet */ + unsigned short headerSize; + unsigned short payloadSize; + } RTPDUMP_RTPPACKET; + + + RTPDUMP_ERROR + RTPDUMP_OpenForReading( RTPDUMP_HANDLE *phRTPDUMP, const char *filename ); + + RTPDUMP_ERROR + RTPDUMP_OpenWithFileToRead( RTPDUMP_HANDLE *phRTPDUMP, FILE *file ); + + RTPDUMP_ERROR + RTPDUMP_OpenForWriting( RTPDUMP_HANDLE *phRTPDUMP, const char *filename ); + + RTPDUMP_ERROR + RTPDUMP_ReadPacket( RTPDUMP_HANDLE hRTPDUMP, + RTPDUMP_RTPPACKET *packet, + uint32_t *timeoffset_ms ); + + RTPDUMP_ERROR + RTPDUMP_WritePacket( RTPDUMP_HANDLE hRTPDUMP, + const RTPDUMP_RTPPACKET *packet, + uint32_t timeoffset_ms ); + + void + RTPDUMP_Close( RTPDUMP_HANDLE *phRTPDUMP, short closeFile ); + + void + RTPDUMP_SetDefaultRtpPacketHeader( RTPDUMP_RTPPACKET *packet ); + + void + RTPDUMP_ParseRTPHeader( RTPDUMP_RTPPACKET *packet ); + +#ifdef __cplusplus +} +#endif diff --git a/lib_util/tinywavein_c.h b/lib_util/tinywavein_c.h new file mode 100644 index 0000000000000000000000000000000000000000..cddcb6450184d85979aae605f9656ec962aa98a1 --- /dev/null +++ b/lib_util/tinywavein_c.h @@ -0,0 +1,555 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#ifndef __TINYWAVEIN_C_H__ +#define __TINYWAVEIN_C_H__ + +#include +#include +#include +#include + +#if defined( __i386__ ) || defined( _M_IX86 ) || defined( __x86_64__ ) || defined( _M_X64 ) || defined( __arm__ ) || defined( __aarch64__ ) || ( defined( __BYTE_ORDER__ ) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ ) +#define __TWI_LE /* _T_iny _W_ave _I_n _L_ittle _E_ndian */ +#endif + +#if defined( __POWERPC__ ) || defined( __sparc__ ) || ( defined( __BYTE_ORDER__ ) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ ) +#define __TWI_BE /* _T_iny _W_ave _I_n _B_ig _E_ndian */ +#endif + +#if !defined( __TWI_LE ) && !defined( __TWI_BE ) +#pragma message( "unknown processor - assuming Little Endian" ) +#define __TWI_LE +#endif + +#define __TWI_SUCCESS ( 0 ) +#define __TWI_ERROR ( -1 ) + +typedef struct __tinyWaveInHandle +{ + FILE *theFile; + fpos_t dataChunkPos; + uint32_t position; + uint32_t length; + uint32_t bps; +} __tinyWaveInHandle, WAVEFILEIN; + +typedef struct +{ + int16_t compressionCode; + int16_t numberOfChannels; + uint32_t sampleRate; + uint32_t averageBytesPerSecond; + int16_t blockAlign; + int16_t bitsPerSample; + /* int16_t extraFormatBytes ; */ +} SWavInfo; + +typedef struct +{ + char chunkID[4]; + uint32_t chunkSize; + /* long dataOffset ; */ /* never used */ +} SChunk; + +/* local wrapper, always returns correct endian */ +static size_t fread_LE( + void *ptr, + size_t size, + size_t nmemb, + FILE *stream ); + +#ifdef __TWI_BE +static int16_t BigEndian16( int16_t v ); +static int32_t BigEndian32( int32_t v ); +#endif + +/*! + * \brief Read header from a WAVEfile. Host endianess is handled accordingly. + * \fp filepointer of type FILE*. + * \wavinfo SWavInfo struct where the decoded header info is stored into. + * \return 0 on success and non-zero on failure. + * + */ +static WAVEFILEIN *OpenWav( + const char *filename, + uint32_t *samplerate, + int16_t *channels, + uint32_t *samplesInFile, + int16_t *bps ) +{ + WAVEFILEIN *self; + + SChunk fmt_chunk, data_chunk; + int32_t offset; + uint32_t tmpSize; + char tmpFormat[4]; + SWavInfo wavinfo = { 0, 0, 0, 0, 0, 0 }; + + self = (WAVEFILEIN *) calloc( 1, sizeof( WAVEFILEIN ) ); + if ( !self ) + { + goto bail; /* return NULL; */ + } + + if ( !filename ) + { + goto bail; + } + if ( !samplerate ) + { + goto bail; + } + if ( !channels ) + { + goto bail; + } + if ( !samplesInFile ) + { + goto bail; + } + if ( !bps ) + { + goto bail; + } + + self->theFile = fopen( filename, "rb" ); + if ( !self->theFile ) + { + goto bail; + } + + /* read RIFF-chunk */ + if ( fread( tmpFormat, 1, 4, self->theFile ) != 4 ) + { + goto bail; + } + + if ( strncmp( "RIFF", tmpFormat, 4 ) ) + { + goto bail; + } + + /* Read RIFF size. Ignored. */ + fread_LE( &tmpSize, 4, 1, self->theFile ); + + /* read WAVE-chunk */ + if ( fread( tmpFormat, 1, 4, self->theFile ) != 4 ) + { + goto bail; + } + + if ( strncmp( "WAVE", tmpFormat, 4 ) ) + { + goto bail; + } + + /* read format/bext-chunk */ + if ( fread( fmt_chunk.chunkID, 1, 4, self->theFile ) != 4 ) + { + goto bail; + } + + /* skip some potential chunks up to fmt chunk */ + while ( strncmp( "fmt ", fmt_chunk.chunkID, 4 ) != 0 ) + { + uint32_t chunkSize = 0; + + if ( fread_LE( &chunkSize, 1, 4, self->theFile ) != 4 ) + { + goto bail; + } + + /* skip chunk data */ + while ( chunkSize ) + { + int32_t nulbuf; + if ( fread_LE( &nulbuf, 1, 1, self->theFile ) != 1 ) + { + goto bail; + } + chunkSize -= 1; + } + + /* read next chunk header */ + if ( fread( fmt_chunk.chunkID, 1, 4, self->theFile ) != 4 ) + { + goto bail; + } + } + + /* go on with fmt-chunk */ + if ( strncmp( "fmt ", fmt_chunk.chunkID, 4 ) ) + { + goto bail; + } + + if ( fread_LE( &fmt_chunk.chunkSize, 4, 1, self->theFile ) != + 1 ) + { /* should be 16 for PCM-format (uncompressed) */ + goto bail; + } + + /* read info */ + fread_LE( &( wavinfo.compressionCode ), 2, 1, self->theFile ); + fread_LE( &( wavinfo.numberOfChannels ), 2, 1, self->theFile ); + fread_LE( &( wavinfo.sampleRate ), 4, 1, self->theFile ); + fread_LE( &( wavinfo.averageBytesPerSecond ), 4, 1, self->theFile ); + fread_LE( &( wavinfo.blockAlign ), 2, 1, self->theFile ); + fread_LE( &( wavinfo.bitsPerSample ), 2, 1, self->theFile ); + + offset = fmt_chunk.chunkSize - 16; + if ( wavinfo.compressionCode == 0x01 ) + { + if ( ( wavinfo.bitsPerSample != 16 ) && ( wavinfo.bitsPerSample != 24 ) ) + { /* we do only support 16 and 24 bit PCM audio */ + goto bail; + } + } + else if ( wavinfo.compressionCode == 0x03 ) + { + if ( wavinfo.bitsPerSample != 32 ) + { /* we do only support 32 bit float audio */ + goto bail; + } + } + + /* Skip rest of fmt header if any. */ + for ( ; offset > 0; offset-- ) + { + size_t read = fread( &tmpSize, 1, 1, self->theFile ); + (void) read; + } + + do + { + /* Read data chunk ID */ + if ( fread( data_chunk.chunkID, 1, 4, self->theFile ) != 4 ) + { + goto bail; + } + + /* Read chunk length. */ + + if ( fread_LE( &offset, 4, 1, self->theFile ) != 1 ) + { + goto bail; + } + + /* Check for data chunk signature. */ + if ( strncmp( "data", data_chunk.chunkID, 4 ) == 0 ) + { + data_chunk.chunkSize = offset; + break; + } + + /* unused 1 byte present, if size is odd */ + /* see https:/ /www.daubnet.com/en/file-format-riff */ + if ( offset % 2 ) + { + offset++; + } + + /* Jump over non data chunk. */ + for ( ; offset > 0; offset-- ) + { + size_t read = fread( &tmpSize, 1, 1, self->theFile ); + (void) read; + } + + } while ( !feof( self->theFile ) ); + + /* success so far */ + *samplerate = wavinfo.sampleRate; + *channels = wavinfo.numberOfChannels; + *samplesInFile = data_chunk.chunkSize / wavinfo.numberOfChannels; + *samplesInFile /= ( ( wavinfo.bitsPerSample + 7 ) / 8 ); + *bps = wavinfo.bitsPerSample; + + self->position = 0; + self->bps = wavinfo.bitsPerSample; + self->length = *samplesInFile * wavinfo.numberOfChannels; + + fgetpos( self->theFile, &self->dataChunkPos ); + + return self; + +bail: + free( self ); + return NULL; +} + +static int32_t __ReadSample16( + WAVEFILEIN *self, + int32_t *sample, + int32_t scale ) +{ + size_t cnt; + int16_t v = 0; + + cnt = fread( &v, 2, 1, self->theFile ); + + if ( cnt != 1 ) + { + return __TWI_ERROR; + } + + self->position += 1; + +#ifdef __TWI_BE + v = BigEndian16( v ); +#endif + + if ( ( scale - 16 ) > 0 ) + { + *sample = v << ( scale - 16 ); + } + else + { + *sample = v >> ( 16 - scale ); + } + + return __TWI_SUCCESS; +} + +static int32_t __ReadSample24( + WAVEFILEIN *self, + int32_t *sample, + int32_t scale ) +{ + size_t cnt; + int32_t v = 0; + + cnt = fread( &v, 3, 1, self->theFile ); + + if ( cnt != 1 ) + { + return __TWI_ERROR; + } + + self->position += 1; + +#ifdef __TWI_BE + v = BigEndian32( v ); +#endif + + if ( v >= 0x800000 ) + { + v |= 0xff000000; + } + + if ( ( scale - 24 ) > 0 ) + { + *sample = v << ( scale - 24 ); + } + else + { + *sample = v >> ( 24 - scale ); + } + + return __TWI_SUCCESS; +} + +static int32_t __ReadSample32( + WAVEFILEIN *self, + float *sample ) +{ + size_t cnt; + union fl_int + { + float v_float; + int32_t v_int; + }; + union fl_int v; + + cnt = fread( &v, 4, 1, self->theFile ); + if ( cnt != 1 ) + { + return __TWI_ERROR; + } + + self->position += 1; +#ifdef __TWI_BE + v.v_int = BigEndian32( v.v_int ); +#endif + + *sample = v.v_float; + + return __TWI_SUCCESS; +} + +static int32_t __ReadSampleInternal( + WAVEFILEIN *self, + int32_t *sample, + int32_t scale ) +{ + int32_t err; + + if ( !self ) + { + return __TWI_ERROR; + } + + switch ( self->bps ) + { + case 16: + err = __ReadSample16( self, sample, scale ); + break; + + case 24: + err = __ReadSample24( self, sample, scale ); + break; + + default: + err = __TWI_ERROR; + break; + } + + return err; +} + +/* not fully tested */ +/* this function returns normalized values in the range +32767..-32768 */ +static int32_t ReadWavShort( + WAVEFILEIN *self, + int16_t sampleBuffer[], + uint32_t nSamplesToRead, + uint32_t *nSamplesRead ) +{ + uint32_t i; + int32_t err = __TWI_SUCCESS; + + if ( !sampleBuffer ) + { + return __TWI_ERROR; + } + + /* check if we have enough samples left, if not, + set nSamplesToRead to number of samples left. */ + if ( self->position + nSamplesToRead > self->length ) + { + nSamplesToRead = self->length - self->position; + } + + for ( i = 0; i < nSamplesToRead; i++ ) + { + if ( self->bps == 32 ) + { + float tmp; + err = __ReadSample32( self, &tmp ); + if ( err != __TWI_SUCCESS ) + { + return err; + } + sampleBuffer[i] = (int16_t) ( tmp * 32768.0f ); + } + else + { + int32_t tmp; + err = __ReadSampleInternal( self, &tmp, 16 ); + if ( err != __TWI_SUCCESS ) + { + return err; + } + sampleBuffer[i] = (int16_t) tmp; + } + *nSamplesRead += 1; + } + + return __TWI_SUCCESS; +} + +static int32_t CloseWavIn( + WAVEFILEIN *self ) +{ + if ( self ) + { + if ( self->theFile ) + { + fclose( self->theFile ); + } + } + free( self ); + + return __TWI_SUCCESS; +} + +/*------------- local subs ----------------*/ + +static size_t fread_LE( + void *ptr, + size_t size, + size_t nmemb, + FILE *stream ) +{ +#ifdef __TWI_LE + return fread( ptr, size, nmemb, stream ); +#endif +#ifdef __TWI_BE + + unsigned char x[sizeof( int32_t )]; + unsigned char *y = (unsigned char *) ptr; + int32_t i; + int32_t len; + + len = fread( x, size, nmemb, stream ); + + for ( i = 0; i < size * nmemb; i++ ) + { + *y++ = x[size * nmemb - i - 1]; + } + + return len; +#endif +} + +#ifdef __TWI_BE +static int16_t BigEndian16( int16_t v ) +{ + int16_t a = ( v & 0x0ff ); + int16_t b = ( v & 0x0ff00 ) >> 8; + + return a << 8 | b; +} + +static int32_t BigEndian32( int32_t v ) +{ + int32_t a = ( v & 0x0ff ); + int32_t b = ( v & 0x0ff00 ) >> 8; + int32_t c = ( v & 0x0ff0000 ) >> 16; + int32_t d = ( v & 0xff000000 ) >> 24; + + return a << 24 | b << 16 | c << 8 | d; +} +#endif + +#endif /* __TINYWAVEIN_C_H__ */ diff --git a/lib_util/tinywaveout_c.h b/lib_util/tinywaveout_c.h new file mode 100644 index 0000000000000000000000000000000000000000..db60146a02ae467d7b637ecb2adaca525e065079 --- /dev/null +++ b/lib_util/tinywaveout_c.h @@ -0,0 +1,634 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#ifndef __TINYWAVEOUT_C_H__ +#define __TINYWAVEOUT_C_H__ + +#include +#include +#include + +#if defined( __i386__ ) || defined( _M_IX86 ) || defined( _M_X64 ) || defined( __x86_64__ ) || defined( __arm__ ) || defined( __aarch64__ ) || ( defined( __BYTE_ORDER__ ) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ ) +#define __TWO_LE /* _T_iny _W_ave _O_ut _L_ittle _E_ndian */ +#endif + +#if defined( __POWERPC__ ) || defined( __sparc__ ) || ( defined( __BYTE_ORDER__ ) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ ) +#define __TWO_BE /* _T_iny _W_ave _O_ut _B_ig _E_ndian */ +#endif + +#if !defined( __TWO_LE ) && !defined( __TWO_BE ) +#pragma message( "unknown processor - assuming Little Endian" ) +#define __TWI_LE +#endif + +#define __TWO_SUCCESS ( 0 ) +#define __TWO_ERROR ( -1 ) + +/*--- local types/structs ----------------------------------*/ + +#if defined( _MSC_VER ) +#pragma pack( push, 1 ) +#else +#pragma pack( 1 ) +#endif + +#ifndef TW_INT64 +#if !( defined( WIN32 ) ) +#include +#define TWO_INT64 /* long long */ int64_t +#else +#define TWO_INT64 __int64 +#endif +#endif + +typedef struct __tinyWaveOutHeader +{ + uint32_t riffType; /* 'RIFF' */ + uint32_t riffSize; /* file size */ + + uint32_t waveType; /* 'WAVE' */ +} __tinyWaveOutHeader; + +typedef struct __tinyWaveOutFmtChunk +{ + uint32_t formatType; + uint32_t formatSize; + + uint16_t formatTag; + uint16_t numChannels; + uint32_t sampleRate; + uint32_t bytesPerSecond; + uint16_t blockAlignment; + uint16_t bitsPerSample; + + /* wav fmt ext hdr here */ +} __tinyWaveOutFmtChunk; + +typedef struct __tinyWaveOutDataChunk +{ + uint32_t dataType; + uint32_t dataSize; + +} __tinyWaveOutDataChunk; + +typedef struct __tinyWaveOutHandle +{ + FILE *theFile; + uint32_t dataSize; + TWO_INT64 dataSizeLimit; + uint32_t fmtChunkOffset; + uint32_t dataChunkOffset; + uint32_t bps; + uint32_t clipCount; +} __tinyWaveOutHandle, WAVEFILEOUT; + +/*--- local protos --------------------------------------------------*/ +static __inline uint32_t BigEndian32( char, char, char, char ); +static __inline uint32_t LittleEndian32( uint32_t ); +static __inline uint32_t LittleEndian32s( int32_t ); +static __inline int16_t LittleEndian16( int16_t ); +static __inline int32_t __dataSizeChk( WAVEFILEOUT *self, int32_t newbytes ); + +#if defined( _MSC_VER ) +#pragma pack( pop ) +#else +#pragma pack() +#endif + +static WAVEFILEOUT *CreateBWF( + const char *fileName, + const uint32_t sampleRate, + const uint32_t numChannels, + const uint32_t bps + /* ,const uint32_t writeWaveExt */ ) +{ + WAVEFILEOUT *self; + __tinyWaveOutHeader whdr; + __tinyWaveOutFmtChunk wfch; + __tinyWaveOutDataChunk wdch; + uint32_t blockAlignment = 0; + uint32_t ByteCnt = 0; /* Byte counter for fwrite */ + + self = (WAVEFILEOUT *) calloc( 1, sizeof( WAVEFILEOUT ) ); + if ( !self ) + { + goto bail; /* return NULL; */ + } + + if ( !fileName ) + { + goto bail; + } + if ( sampleRate == 0 ) + { + goto bail; + } + if ( sampleRate > 768000 ) + { + goto bail; + } + if ( numChannels == 0 ) + { + goto bail; + } + if ( numChannels > 64 ) + { + goto bail; + } + if ( bps != 16 && bps != 24 && bps != 32 ) + { + goto bail; + } + + self->theFile = fopen( fileName, "wb+" ); + if ( !self->theFile ) + { + goto bail; + } + + /* WAV-Header */ + whdr.riffType = BigEndian32( 'R', 'I', 'F', 'F' ); + whdr.riffSize = LittleEndian32( 0xffffffff ); /* set to maximum, if fseek() doesn't work later */ + whdr.waveType = BigEndian32( 'W', 'A', 'V', 'E' ); + /* write to file */ + ByteCnt = 0; + ByteCnt += (uint32_t) fwrite( &whdr, 1, sizeof( whdr ), self->theFile ); + + /* FMT-Chunk */ + wfch.formatType = BigEndian32( 'f', 'm', 't', ' ' ); + wfch.formatSize = LittleEndian32( 16 ); + switch ( bps ) + { + case 16: + case 24: + wfch.formatTag = LittleEndian16( 0x0001 ); /* WAVE_FORMAT_PCM */ + break; + case 32: + wfch.formatTag = LittleEndian16( 0x0003 ); /* WAVE_FORMAT_IEEE_FLOAT */ + break; + default: + goto bail; + } + self->bps = bps; + wfch.bitsPerSample = LittleEndian16( (int16_t) bps ); + wfch.numChannels = LittleEndian16( (int16_t) numChannels ); + blockAlignment = numChannels * ( bps >> 3 ); + wfch.blockAlignment = LittleEndian16( (int16_t) blockAlignment ); + wfch.sampleRate = LittleEndian32( sampleRate ); + wfch.bytesPerSecond = LittleEndian32( sampleRate * blockAlignment ); + /* write to file */ + self->fmtChunkOffset = ByteCnt; + ByteCnt += (uint32_t) fwrite( &wfch, 1, sizeof( wfch ), self->theFile ); + + /* DATA-Chunk */ + self->dataChunkOffset = ByteCnt; + wdch.dataType = BigEndian32( 'd', 'a', 't', 'a' ); + wdch.dataSize = LittleEndian32( 0xffffffff - ByteCnt ); /* yet unknown. set to maximum of 4 GB file */ + /* write to file */ + ByteCnt += (uint32_t) fwrite( &wdch, 1, sizeof( wdch ), self->theFile ); + + self->dataSize = 0; + self->dataSizeLimit = LittleEndian32( 0xffffffff - ByteCnt ); /* maximum size for data chunk for 4 GB files */ + /* self->dataSizeLimit = LittleEndian32(0x7fffffff - ByteCnt); */ /* maximum size for data chunk for 2 GB files */ + + self->clipCount = 0; + + return self; + +bail: + free( self ); + return NULL; +} + +static WAVEFILEOUT *CreateWav( + const char *fileName, + const uint32_t sampleRate, + const uint32_t numChannels, + const uint32_t bps + /* const uint32_t writeWaveExt */ +) +{ + return CreateBWF( fileName, sampleRate, numChannels, bps ); +} + +static const int16_t MAX_PCM16 = 32767; +static const int16_t MIN_PCM16 = -32768; +static __inline int32_t CLIP_PCM16( + int32_t sample, + uint32_t *clipcount ) +{ + int32_t tmp = sample; + + if ( sample >= MAX_PCM16 ) + { + tmp = MAX_PCM16; + ( *clipcount )++; + } + else + { + if ( sample <= MIN_PCM16 ) + { + tmp = MIN_PCM16; + ( *clipcount )++; + } + } + + return tmp; +} + +static const int32_t MAX_PCM24 = 8388607; +static const int32_t MIN_PCM24 = -8388608; +static __inline int32_t CLIP_PCM24( + int32_t sample, + uint32_t *clipcount ) +{ + int32_t tmp = sample; + + if ( sample >= MAX_PCM24 ) + { + tmp = MAX_PCM24; + ( *clipcount )++; + } + else + { + if ( sample <= MIN_PCM24 ) + { + tmp = MIN_PCM24; + ( *clipcount )++; + } + } + + return tmp; +} +#define MAX_FLOAT32 ( +1.0f ) +#define MIN_FLOAT32 ( -1.0f ) +static __inline float CLIP_FLOAT32( + float sample, + uint32_t *clipcount ) +{ + float tmp = sample; + + if ( sample >= MAX_FLOAT32 ) + { + tmp = MAX_FLOAT32; + ( *clipcount )++; + } + else + { + if ( sample <= MIN_FLOAT32 ) + { + tmp = MIN_FLOAT32; + ( *clipcount )++; + } + } + + return tmp; +} + +static int32_t __WriteSample16( + WAVEFILEOUT *self, + int32_t sample, + int32_t scale ) +{ + size_t cnt; + int16_t v; + + if ( 16 != scale ) + { + if ( ( scale - 16 ) > 0 ) + { + sample = sample >> ( scale - 16 ); + } + else + { + sample = sample << ( 16 - scale ); + } + } + + v = (int16_t) CLIP_PCM16( sample, &( self->clipCount ) ); +#ifdef __TWO_BE + v = LittleEndian16( v ); +#endif + + cnt = fwrite( &v, sizeof( int16_t ), 1, self->theFile ); + + if ( cnt == 1 ) + { + self->dataSize += 2; + return __TWO_SUCCESS; + } + + return __TWO_ERROR; +} + +static int32_t __WriteSample24( + WAVEFILEOUT *self, + int32_t sample, + int32_t scale ) +{ + size_t cnt; + int32_t v; + + if ( ( scale - 24 ) > 0 ) + { + sample = sample >> ( scale - 24 ); + } + else + { + sample = sample << ( 24 - scale ); + } + + v = (int32_t) CLIP_PCM24( sample, &( self->clipCount ) ); +#ifdef __TWO_BE + v = LittleEndian32s( v ); +#endif + cnt = fwrite( &v, 3, 1, self->theFile ); + + if ( cnt == 1 ) + { + self->dataSize += 3; + return __TWO_SUCCESS; + } + + return __TWO_ERROR; +} + +static int32_t __WriteSample32( + WAVEFILEOUT *self, + float sample ) +{ + size_t cnt; + union fl_int + { + float v_float; + int32_t v_int; + }; + union fl_int v; + +#if CLIP_FLOAT + v.v_float = CLIP_FLOAT32( sample, &( self->clipCount ) ); +#else + v.v_float = sample; + if ( ( sample > 1.0f ) || ( sample < -1.0f ) ) + { + self->clipCount++; + } +#endif + +#ifdef __TWO_BE + v.v_int = LittleEndian32s( v.v_int ); +#endif + cnt = fwrite( &v, 4, 1, self->theFile ); + + if ( cnt == 1 ) + { + self->dataSize += 4; + return __TWO_SUCCESS; + } + + return __TWO_ERROR; +} + +static int32_t __WriteSampleInt( + WAVEFILEOUT *self, + int32_t sample, + int32_t scale ) +{ + int32_t err; + + if ( !self ) + { + return __TWO_ERROR; + } + + switch ( self->bps ) + { + case 16: + err = __WriteSample16( self, sample, scale ); + break; + + case 24: + err = __WriteSample24( self, sample, scale ); + break; + + default: + err = __TWO_ERROR; + break; + } + + return err; +} + +/* this function expects values in the 16 bit range +-32767/8 */ +static int32_t WriteWavShort( + WAVEFILEOUT *self, + int16_t sampleBuffer[], + uint32_t nSamples ) +{ + uint32_t i; + int32_t err = __TWO_SUCCESS; + + if ( !self ) + { + return __TWO_ERROR; + } + if ( !sampleBuffer ) + { + return __TWO_ERROR; + } + if ( __dataSizeChk( self, nSamples * sizeof( int16_t ) ) ) + { + return __TWO_ERROR; + } + + for ( i = 0; i < nSamples; i++ ) + { + if ( self->bps == 32 ) + { + err = __WriteSample32( self, sampleBuffer[i] / 32768.0f ); + } + else + { + err = __WriteSampleInt( self, (int32_t) sampleBuffer[i], 16 ); + } + if ( err != __TWO_SUCCESS ) + { + return err; + } + } + + return __TWO_SUCCESS; +} + +#ifdef DEBUG_JBM +/* this function expects values in the 16 bit range +-32767/8 */ +static int32_t WriteWavFloat( + WAVEFILEOUT *self, + float sampleBuffer[], + uint32_t nSamples ) +{ + uint32_t i; + int32_t err = __TWO_SUCCESS; + + if ( !self ) + { + return __TWO_ERROR; + } + if ( !sampleBuffer ) + { + return __TWO_ERROR; + } + if ( __dataSizeChk( self, nSamples * sizeof( float ) ) ) + { + return __TWO_ERROR; + } + + for ( i = 0; i < nSamples; i++ ) + { + if ( self->bps == 32 ) + { + err = __WriteSample32( self, sampleBuffer[i] / 32768.0f ); + } + else + { + err = __TWO_ERROR; + } + if ( err != __TWO_SUCCESS ) + { + return err; + } + } + + return __TWO_SUCCESS; +} +#endif + +static int32_t CloseWav( + WAVEFILEOUT *self ) +{ + uint32_t riffSize_le = 0; + uint32_t dataSize_le = 0; + + if ( !self ) + { + return __TWO_ERROR; + } + + riffSize_le = LittleEndian32( + self->dataChunkOffset - 8 + 8 + + self->dataSize ); /* sizeof(hdr) - (8 bytes of riff chunk header) + (8 bytes data chunk + header) + sizeof(raw-pcm-data) */ + dataSize_le = LittleEndian32( self->dataSize ); + + /* now overwrite length/size values in header with the actual/real ones */ + /* fseek(self->theFile, 0, SEEK_SET);*/ + + /* seek to riffsize */ + fseek( self->theFile, 4, SEEK_SET ); + fwrite( &riffSize_le, sizeof( riffSize_le ), 1, self->theFile ); + /* seek to datasize */ + fseek( self->theFile, self->dataChunkOffset + 4, SEEK_SET ); + fwrite( &dataSize_le, sizeof( dataSize_le ), 1, self->theFile ); + + fclose( self->theFile ); + free( self ); + + return __TWO_SUCCESS; +} + +/*------------- local subs ----------------*/ + +static __inline uint32_t BigEndian32( + char a, + char b, + char c, + char d ) +{ +#ifdef __TWO_LE + return (uint32_t) d << 24 | (uint32_t) c << 16 | (uint32_t) b << 8 | (uint32_t) a; +#else + return (uint32_t) a << 24 | (uint32_t) b << 16 | (uint32_t) c << 8 | (uint32_t) d; +#endif +} + +static __inline uint32_t LittleEndian32( + uint32_t v ) +{ +#ifdef __TWO_LE + return v; +#else + return ( v & 0x000000FF ) << 24 | ( v & 0x0000FF00 ) << 8 | + ( v & 0x00FF0000 ) >> 8 | ( v & 0xFF000000 ) >> 24; +#endif +} + +/* signed version of the above */ +static __inline uint32_t LittleEndian32s( + int32_t v ) +{ +#ifdef __TWO_LE + return v; +#else + return ( v & 0x000000FF ) << 24 | ( v & 0x0000FF00 ) << 8 | + ( v & 0x00FF0000 ) >> 8 | ( v & 0xFF000000 ) >> 24; +#endif +} + +static __inline int16_t LittleEndian16( + int16_t v ) +{ +#ifdef __TWO_LE + return v; +#else + return ( ( v << 8 ) & 0xFF00 ) | ( ( v >> 8 ) & 0x00FF ); +#endif +} + +static __inline int32_t __dataSizeChk( + WAVEFILEOUT *self, + int32_t newbytes ) +{ + if ( !self ) + { + return __TWO_ERROR; + } + + if ( ( ( (TWO_INT64) self->dataSize ) + ( (TWO_INT64) newbytes ) ) > + self->dataSizeLimit ) + { + return __TWO_ERROR; + } + + return __TWO_SUCCESS; +} + +#endif /* __TINYWAVEOUT_C_H__ */ diff --git a/lib_util/vector3_pair_file_reader.c b/lib_util/vector3_pair_file_reader.c new file mode 100644 index 0000000000000000000000000000000000000000..9e03358b91c901e9c6f2875bb8f714cce00a86db --- /dev/null +++ b/lib_util/vector3_pair_file_reader.c @@ -0,0 +1,163 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include "vector3_pair_file_reader.h" +#include +#include +#include +#include +#include "prot.h" +#include "options.h" /* only included to get access to the feature-defines */ + + +struct Vector3PairFileReader +{ + FILE *trajFile; + char *file_path; +}; + +/*-----------------------------------------------------------------------* + * Vector3PairFileReader_open() + * + * Allocate and initialize reader + *-----------------------------------------------------------------------*/ + +ivas_error Vector3PairFileReader_open( + const char *trajFilePath, /* i : trajectory file name */ + Vector3PairFileReader **vector3PairReader /* o : Vector3PairFileReader handle */ +) +{ + Vector3PairFileReader *self; + FILE *trajFile; + + /* Open trajectory file */ + if ( strlen( trajFilePath ) < 1 ) + { + return IVAS_ERR_FAILED_FILE_OPEN; + } + + trajFile = fopen( trajFilePath, "r" ); + + if ( !trajFile ) + { + return IVAS_ERR_FAILED_FILE_OPEN; + } + + self = calloc( sizeof( Vector3PairFileReader ), 1 ); + self->trajFile = trajFile; + self->file_path = calloc( sizeof( char ), strlen( trajFilePath ) + 1 ); + strcpy( self->file_path, trajFilePath ); + + *vector3PairReader = self; + + return IVAS_ERR_OK; +} + + +/*-----------------------------------------------------------------------* + * Vector3PairFileReader_read() + * + * Read one line of values from the trajectory file + *-----------------------------------------------------------------------*/ + +ivas_error Vector3PairFileReader_read( + Vector3PairFileReader *vector3PairReader, /* i/o: Vector3PairFileReader handle */ + IVAS_VECTOR3 *pFirst, /* o : first x,y,z position in the line */ + IVAS_VECTOR3 *pSecond /* o : second x,y,z position in the line */ +) +{ + float x1, y1, z1, x2, y2, z2; + + if ( vector3PairReader == NULL || pFirst == NULL || pSecond == NULL ) + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + + if ( 6 != fscanf( vector3PairReader->trajFile, "%f,%f,%f,%f,%f,%f", &x1, &y1, &z1, &x2, &y2, &z2 ) ) + { + if ( feof( vector3PairReader->trajFile ) ) + { + rewind( vector3PairReader->trajFile ); + return Vector3PairFileReader_read( vector3PairReader, pFirst, pSecond ); + } + return IVAS_ERR_FAILED_FILE_PARSE; + } + + pFirst->x = x1; + pFirst->y = y1; + pFirst->z = z1; + pSecond->x = x2; + pSecond->y = y2; + pSecond->z = z2; + + return IVAS_ERR_OK; +} + +/*-----------------------------------------------------------------------* + * Vector3PairFileReader_close() + * + * Deallocates memory for the Head-Tracking reader + *-----------------------------------------------------------------------*/ + +void Vector3PairFileReader_close( + Vector3PairFileReader **reader /* i/o: Vector3PairFileReader handle */ +) +{ + if ( reader == NULL || *reader == NULL ) + { + return; + } + + fclose( ( *reader )->trajFile ); + free( ( *reader )->file_path ); + free( *reader ); + *reader = NULL; + + return; +} + + +/*-----------------------------------------------------------------------* + * Vector3PairFileReader_getFilePath() + * + * + *-----------------------------------------------------------------------*/ + +const char *Vector3PairFileReader_getFilePath( + Vector3PairFileReader *reader /* i/o: Vector3PairFileReader handle */ +) +{ + if ( reader == NULL ) + { + return NULL; + } + + return reader->file_path; +} diff --git a/lib_util/vector3_pair_file_reader.h b/lib_util/vector3_pair_file_reader.h new file mode 100644 index 0000000000000000000000000000000000000000..e4691939220cfaded272c9481c715f73cd018d65 --- /dev/null +++ b/lib_util/vector3_pair_file_reader.h @@ -0,0 +1,85 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#ifndef IVAS_V3PAIR_FILE_READER_H +#define IVAS_V3PAIR_FILE_READER_H + +#include "common_api_types.h" + + +typedef struct Vector3PairFileReader Vector3PairFileReader; + +/*-----------------------------------------------------------------------* + * Vector3PairFileReader_open() + * + * Allocate and initialize Head-Tracking handle + *-----------------------------------------------------------------------*/ + +ivas_error Vector3PairFileReader_open( + const char *trajFilePath, /* i : trajectory file name */ + Vector3PairFileReader **vector3PairReader /* o : Vector3PairFileReader handle */ +); + +/*-----------------------------------------------------------------------* + * Vector3PairFileReader_read() + * + * Read one line of values from the trajectory file + *-----------------------------------------------------------------------*/ + +ivas_error Vector3PairFileReader_read( + Vector3PairFileReader *vector3PairReader, /* i/o: Vector3PairFileReader handle */ + IVAS_VECTOR3 *pFirst, /* o : first x,y,z position in the line */ + IVAS_VECTOR3 *pSecond /* o : second x,y,z position in the line */ +); + +/*-----------------------------------------------------------------------* + * Vector3PairFileReader_close() + * + * Deallocates memory for the handle + *-----------------------------------------------------------------------*/ + +void Vector3PairFileReader_close( + Vector3PairFileReader **vector3PairReader /* i/o: Vector3PairFileReader handle */ +); + +/*-----------------------------------------------------------------------* + * Vector3PairFileReader_getFilePath() + * + * + *-----------------------------------------------------------------------*/ + +const char *Vector3PairFileReader_getFilePath( + Vector3PairFileReader *vector3PairReader /* i/o: Vector3PairFileReader handle */ +); + + +#endif /* IVAS_V3PAIR_FILE_READER_H */ diff --git a/readme.txt b/readme.txt new file mode 100644 index 0000000000000000000000000000000000000000..58efed4bb663fa353bfaff45152869337b514554 --- /dev/null +++ b/readme.txt @@ -0,0 +1,586 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + + +These files represent the 3GPP EVS Codec Extension for Immersive Voice and +Audio Services (IVAS) floating-point C simulation. All code is writtten +in ISO/IEC C99. The system is implemented as three separate programs: + + IVAS_cod Encoder + IVAS_dec Decoder + IVAS_rend Renderer + +For encoding using the coder program, the input is a binary +audio file (*.8k, *.16k, *.32k, *.48k) and the output is a binary +encoded parameter file (*.192). For decoding using the decoder program, +the input is a binary parameter file (*.192) and the output is a binary +synthesized audio file (*.8k, *.16k, *.32k, *.48k). For certain audio +formats (ISM, MASA), there are additional metadata files required. Audio +channels are interleaved in the input and output audio file. + + + FILE FORMATS: + ============= + +The file format of the supplied binary data (*.8k, *.16k, *.32k, *.48k, +*.192) is 16-bit binary data which is read and written in 16 bit words. +The data is therefore platform DEPENDENT. +The files contain only data, i.e., there is no header. +The test files included in this package are "PC" format, meaning that the +least signification byte of the 16-bit word comes first in the files. + +If the software is to be run on some other platform than PC, +such as an HP (HP-UX) or a Sun, then binary files will need to be modified +by swapping the byte order in the files. + +The input and output files (*.8k, *.16k, *.32k, *.48k) are 16-bit integer +PCM files with 8/16/32/48 kHz sampling rate with no headers. Alternatively, +the input and output files are WAV files. + +The Encoder produces bitstream files in either ITU G.192 or MIME file +storage format. + +Using ITU G.192 format: + +For every 20 ms input audio frame, the encoded bitstream contains the +following data: + + Word16 SyncWord + Word16 DataLen + Word16 1st DataBit + Word16 2nd DataBit + . + . + . + Word16 Nth DataBit + + +The SyncWord from the encoder is always 0x6b21. If decoder receives +SyncWord as 0x6b20 it indicates that the current frame was received in +error (bad frame). + +The DataLen parameter gives the number of audio data bits in the +frame. For example using DTX, DataLen for NO_DATA frames is zero. + +Each bit is presented as follows: Bit 0 = 0x007f, Bit 1 = 0x0081. + +Using MIME file storage format: + +The MIME file storage format is a byte based format which is +appropriate for media file storage or as format for email/MMS +attachments. + +Encoder: With the "-mime" option, the encoder always produces EVS-mime +storage format specified in TS26.445 Annex.2.6. The AMRWB-mime(RFC4867) +storage format is not supported by the encoder. + +Decoder: With the "-mime" option, the decoder can parse both EVS-mime +format storage files and AMRWB-mime (RFC4867) storage format files. +The decoder automatically distinguishes between the two +mime storage formats by reading the initial Magic Word in the bitstream +file. The EVS-mime storage format is described in TS 26.445, Annex +A.2.6. The AMRWB-mime storage format is described in RFC-4867. + + + INSTALLING THE SOFTWARE + ======================= + +Installing the software on the PC: + +First unpack the compressed folder into your directory. After that you +should have the following structure: + +. +`-- c-code + |-- Makefile + |-- Workspace_msvc + |-- apps + |-- lib_com + |-- lib_debug + |-- lib_dec + |-- lib_enc + |-- lib_rend + |-- lib_util + |-- readme.txt + |-- .clang-format + +The package includes a Makefile for gcc, which has been verified on +32-bit Linux systems. The code can be compiled by entering the directory +"c-code" and typing the command: make. The resulting encoder/decoder/renderer +executables are named "IVAS_cod", "IVAS_dec", and "IVAS_rend". All reside +in the c-code directory. + +The package also includes a solution-file for Microsoft Visual Studio 2017 (x86). +To compile the code, please open "Workspace_msvc\Workspace_msvc.sln" and build +"encoder" for the encoder, "decoder" for the decoder, and "renderer" for the +renderer executable. The resulting encoder/decoder/renderer executables are +"IVAS_cod.exe", "IVAS_dec.exe", and "IVAS_rend.exe". All reside in the c-code +main directory. + + + RUNNING THE SOFTWARE + ==================== + +The usage of the "IVAS_cod" program is as follows: +-------------------------------------------------- + +Usage: IVAS_cod.exe [Options] R Fs input_file bitstream_file + +Mandatory parameters: +--------------------- +R : Bitrate in bps, + for EVS native modes R = (5900*, 7200, 8000, 9600, 13200, 16400, + 24400, 32000, 48000, 64000, 96000, 128000) + *VBR mode (average bitrate), + for AMR-WB IO modes R = (6600, 8850, 12650, 14250, 15850, 18250, + 19850, 23050, 23850) + for IVAS stereo R = (13200, 16400, 24400, 32000, 48000, 64000, 80000, + 96000, 128000, 160000, 192000, 256000) + for IVAS ISM R = 13200 for 1 ISM, 16400 for 1 ISM and 2 ISM, + (24400, 32000, 48000, 64000, 80000, 96000,128000) + for 2 ISM, 3 ISM and 4 ISM also 160000, 192000, 256000 + for 3 ISM and 4 ISM also 384000 + for 4 ISM also 512000 + for IVAS SBA, MASA, MC, ISM-SBA, and ISM-MASA R=(13200, 16400, 24400, 32000, + 48000, 64000, 80000, 96000, 128000, 160000, 192000, 256000, 384000, 512000) + Alternatively, R can be a bitrate switching file which consists of R values + indicating the bitrate for each frame in bps. These values are stored in + binary format using 4 bytes per value +Fs : Input sampling rate in kHz, Fs = (8, 16, 32 or 48) +input_file : Input audio filename +bitstream_file : Output bitstream filename + +Options: +-------- +EVS mono is default, for IVAS choose one of the following: -stereo, -ism, -sba, -masa, -mc, -ism_sba, -ism_masa +-stereo : Stereo format +-ism [+]Ch Files : ISM format + where Ch specifies the number of ISMs (1-4) + where positive (+) indicates extended metadata (only 64 kbps and up) + and Files specify input files containing metadata, one file per object + (use NULL for no input metadata) +-sba +/-Order : Scene Based Audio input format (Ambisonics ACN/SN3D), + where Order specifies the Ambisionics order (1-3), + where positive (+) means full 3D and negative (-) only 2D/planar components to be coded +-masa Ch File : MASA format + where Ch specifies the number of MASA input/transport channels (1 or 2): + and File specifies input file containing parametric MASA metadata +-ism_sba IsmCh +/-Order IsmFiles : SBA and ISM combined format + where IsmCh specifies the number of ISMs (1-4), + Order specifies the Ambisionics order (1-3) + and IsmFiles specify input files containing ISM metadata, one file per object +-ism_masa IsmCh MasaCh IsmFiles MasaFile : MASA and ISM combined format + where IsmCh specifies the number of ISMs (1-4), + MasaCh specifies the number of MASA input/transport channels (1-2), + IsmFiles specify input files containing ISM metadata, one file per object, + and MasaFile specifies input file containing parametric MASA metadata +-mc InputConf : Multi-channel format + where InputConf specifies the channel configuration: 5_1, 7_1, 5_1_2, 5_1_4, 7_1_4 + Loudspeaker positions are assumed to have azimuth and elevation as per + ISO/IEC 23091-3:2018 Table 3. Channel order is as per ISO/IEC 23008-3:2015 Table 95. + See below for details. +-dtx D : Activate DTX mode, D = (0, 3-100) is the SID update rate + where 0 = adaptive, 3-100 = fixed in number of frames, default is deactivated +-dtx : Activate DTX mode with a SID update rate of 8 frames + Note: DTX is supported in EVS, stereo, ISM, MASA, and SBA up to 80kbps +-rf p o : Activate channel-aware mode in EVS for WB and SWB signal at 13.2kbps, + where FEC indicator, p: LO or HI, and FEC offset, o: 2, 3, 5, or 7 in number of frames. + Alternatively p and o can be replaced by a rf configuration file with each line + contains the values of p and o separated by a space, default is deactivated +-max_band B : Activate bandwidth limitation, B = (NB, WB, SWB or FB) + alternatively, B can be a text file where each line contains "nb_frames B" +-no_delay_cmp : Turn off delay compensation +-stereo_dmx_evs : Stereo downmix function for EVS +-binaural : Optional indication that input is binaural audio (to be used with -stereo or -stereo_dmx_evs) +-mime : Mime output bitstream file format + The encoder produces TS26.445 Annex.2.6 Mime Storage Format, (not RFC4867 Mime Format). + default output bitstream file format is G.192 +-bypass mode : SBA PCA by-pass, mode = (1, 2), 1 = PCA off, 2 = signal adaptive, default is 1 +-level level : Complexity level, level = (1, 2, 3), will be defined after characterisation. + Currently, all values default to level 3 (full functionality). +-q : Quiet mode, limit printouts to terminal, default is deactivated + + +The usage of the "IVAS_dec" program is as follows: +-------------------------------------------------- + +Usage for EVS: IVAS_dec.exe [Options] Fs bitstream_file output_file +Usage for IVAS: IVAS_dec.exe [Options] OutputConf Fs bitstream_file output_file + +Mandatory parameters: +--------------------- +OutputConf : Output configuration: MONO, STEREO, 5_1, 7_1, 5_1_2, 5_1_4, 7_1_4, FOA, + HOA2, HOA3, BINAURAL, BINAURAL_ROOM_IR, BINAURAL_ROOM_REVERB, EXT + By default, channel order and loudspeaker positions are equal to the + encoder. For loudspeaker outputs, OutputConf can be a custom loudspeaker + layout file. See below for details. + Parameter is only used when decoding IVAS bitstream. +Fs : Output sampling rate in kHz (8, 16, 32 or 48) +bitstream_file : Input bitstream filename or RTP packet filename (in VOIP mode) +output_file : Output audio filename + +Options: +-------- +-VOIP : VoIP mode: RTP in G192 +-VOIP_hf_only=0 : VoIP mode: EVS RTP Payload Format hf_only=0 in rtpdump +-VOIP_hf_only=1 : VoIP mode: EVS RTP Payload Format hf_only=1 in rtpdump + The decoder may read rtpdump files containing TS26.445 Annex A.2.2 + EVS RTP Payload Format. The SDP parameter hf_only is required. + Reading RFC4867 AMR/AMR-WB RTP payload format is not supported. +-Tracefile TF : VoIP mode: Generate trace file named TF +-fr5 : option to perform rendering + head-tracking with 5ms frame size +-fec_cfg_file : Optimal channel aware configuration computed by the JBM + as described in Section 6.3.1 of TS26.448. The output is + written into a .txt file. Each line contains the FER indicator + (HI|LO) and optimal FEC offset. +-no_delay_cmp : Turn off delay compensation +-mime : Mime bitstream file format + The decoder may read both TS26.445 Annex.2.6 and RFC4867 Mime Storage + Format files, the magic word in the mime file is used to determine + which of the two supported formats is in use. + default bitstream file format is G.192 +-hrtf File : HRTF filter File used in BINAURAL rendering +-T File : Head rotation specified by external trajectory File +-otr tracking_type : Head orientation tracking type: 'none', 'ref', 'avg', 'ref_vec' + or 'ref_vec_lev' (only for binaural rendering) +-rf File : Reference rotation specified by external trajectory File + works only in combination with '-otr ref' mode +-rvf File : Reference vector specified by external trajectory File + works only in combination with '-otr ref_vec' and 'ref_vec_lev' modes +-render_config File : Renderer configuration option with parameters specified in File +-om File : Metadata output File for BINAURAL_SPLIT_PCM OutputConf +-non_diegetic_pan P : panning mono non-diegetic sound to stereo -90<= P <=90, + left or l or 90->left, right or r or -90->right, center or c or 0->middle +-exof File : External orientation trajectory File for simulation of external orientations +-dpid ID : Directivity pattern ID(s) (space-separated list of up to 4 numbers can be + specified) for binaural output configuration +-aeid ID : Acoustic environment ID (number >= 0) for BINAURAL_ROOM_REVERB output config. +-level level : Complexity level, level = (1, 2, 3), will be defined after characterisation. + Currently, all values default to level 3 (full functionality). +-q : Quiet mode, limit printouts to terminal, default is deactivated + + +The usage of the "IVAS_rend" program is as follows: +--------------------------------------------------- + +Usage: IVAS_rend [Options] + +Options: +-------- +-i File : Input audio File (WAV, raw PCM or scene description file) +-if Format : Audio Format of input file (e.g. 5_1 or HOA3 or META, use -l for a list) +-im Files : Metadata files for ISM (one file per object) or MASA inputs +-o File : Output audio File +-of Format : Audio Format of output file + Alternatively, it can be a custom loudspeaker layout File +-fs : Input sampling rate in kHz (16, 32, 48) - required only with raw PCM inputs +-tf File : Head rotation trajectory File for simulation of head tracking (only for binaural outputs) +-rf File : Reference rotation trajectory File for simulation of head tracking (only for binaural outputs) +-rvf File : Reference vector trajectory File for simulation of head tracking (only for binaural outputs) +-hrtf File : Custom HRTF File for binaural rendering (only for binaural outputs) +-rc File : Binaural renderer configuration File (only for binaural outputs) +-ndp P : Panning mono non-diegetic sound to stereo -90<= P <= 90 + left or l or 90->left, right or r or -90->right, center or c or 0 ->middle +-otr tracking_type : Head orientation tracking type: 'none', 'ref', 'avg' or `ref_vec` or `ref_vec_lev` (only for binaural outputs) +-lp Position : Output LFE position. Comma-delimited triplet of [gain, azimuth, elevation] where gain is linear + (like --gain, -g) and azimuth, elevation are in degrees. + If specified, overrides the default behavior which attempts to map input to output LFE channel(s) +-lm File : LFE panning matrix File (CSV table) containing a matrix of dimensions + [ num_input_lfe x num_output_channels ] with elements specifying linear routing gain (like --gain, -g). + If specified, overrides the output LFE position option and the default behavior which attempts to map input to output LFE channel(s) +-ndc : Turn off delay compensation +-g : Input gain (linear, not in dB) to be applied to input audio file +-l : List supported audio formats +-exof File : External orientation trajectory File for simulation of external orientations +-dpid ID : Directivity pattern ID(s) (space-separated list of up to 4 numbers can be + specified) for binaural output configuration +-aeid ID : Acoustic environment ID (number >= 0) for BINAURAL_ROOM_REVERB output config. +-fr5 : render audio with 5 ms framing +-smd : Metadata Synchronization Delay in ms, Default is 0. Quantized by 5ms subframes. +-level level : Complexity level, level = (1, 2, 3), will be defined after characterisation. + Currently, all values default to level 3 (full functionality). +-q : Quiet mode, limit printouts to terminal, default is deactivated + + + MULTICHANNEL LOUDSPEAKER INPUT / OUTPUT CONFIGURATIONS + ====================================================== +The loudspeaker positions for each MC layouts are assumed to have the following azimuth and elevation +(as per ISO/IEC 23091-3:2018 Table 3), 4th channel is LFE: + 5_1 -> CICP6: azi | 30| -30| 0| 0| 110|-110| + ele | 0| 0| 0| 0| 0| 0| + 7_1 -> CICP12: azi | 30| -30| 0| 0| 110|-110| 135|-135| + ele | 0| 0| 0| 0| 0| 0| 0| 0| + 5_1_2 -> CICP14: azi | 30| -30| 0| 0| 110|-110| 30| -30| + ele | 0| 0| 0| 0| 0| 0| 35| 35| + 5_1_4 -> CICP16: azi | 30| -30| 0| 0| 110|-110| 30| -30| 110|-110| + ele | 0| 0| 0| 0| 0| 0| 35| 35| 35| 35| + 7_1_4 -> CICP19: azi | 30| -30| 0| 0| 135|-135| 90| -90| 30| -30| 135|-135| + ele | 0| 0| 0| 0| 0| 0| 0| 0| 35| 35| 35| 35| +Position is not considered for the LFE channel. Channel order is as per ISO/IEC 23008-3:2015 Table 95. + +Additionally, at the decoder, OutputConf can be a custom loudspeaker layout file with the format: + azi0, azi1, ... aziN-1 + ele0, ele1, ... eleN-1 + LFE0 [optional] +Where the first two rows are comma separated azimuth and elevation positions of the N loudspeakers. +The output channel ordering is 0, 1, ... N-1. The third row contains an index "LFE0" (zero based) +specifying the output channel to which the LFE input will be routed if present. If the third row is +omitted, the LFE input is downmixed to all channels with a factor of 1/N. Position is not considered for +the LFE channel. +An example custom loudspeaker layout file is available: ls_setup_16ch_8+4+4.txt + + + + RUNNING THE SELF TEST + ===================== + +A codec verification script is available at https://forge.3gpp.org/rep/ivas-codec-pc/ivas-codec/ +in scripts/self_test.py. The script demonstrates how to use the software at several operating points +and compares the output to a reference version/implementation. +Please note: In order to keep the run-time short it does not cover all operating +points or complete coverage. + +Documentation on the self_test.py can be found as a part of scripts/README.md. + +Note: Running the self_test.py requires the input vectors in the folder scripts/testv. + +stv1ISM48s.wav - 1 channel (1 audio object), 48000 Hz, 1440000 samples +stv2ISM48s.wav - 2 channels (discrete audio objects), 48000 Hz, 1440000 samples per channel +stv2OA32c.wav - 9 channels (2nd order Ambisonics ACN/SN3D), 32000 Hz +stv2OA48c.wav - 9 channels (2nd order Ambisonics ACN/SN3D), 48000 Hz +stv3ISM48s.wav - 3 channels (discrete audio objects), 48000 Hz, 1440000 samples per channel +stv3OA32c.wav - 16 channels (3rd order Ambisonics ACN/SN3D), 32000 Hz, 288939 samples per channel +stv3OA48c.wav - 16 channels (3rd order Ambisonics ACN/SN3D), 48000 Hz, 433408 samples per channel +stv4ISM48s.wav - 4 channel (discrete audio objects), 48000 Hz, 1440000 samples per channel +stv4ISM48n.wav - 4 channel (discrete audio objects), 48000 Hz, noisy speech +stv8c.wav - 1 channel, 8000 Hz, clean speech/audio +stv8n.wav - 1 channel, 8000 Hz, noisy speech +stv16c.wav - 1 channel, 16000 Hz, 610307 samples, clean speech +stv16n.wav - 1 channel, 16000 Hz, 257024 samples, noisy speech +stv32c.wav - 1 channel, 32000 Hz, 1220613 samples, clean speech/audio +stv32n.wav - 1 channel, 32000 Hz, 514048 samples, noisy speech +stv48c.wav - 1 channel, 48000 Hz, 960000 samples, clean speech/audio +stv48n.wav - 1 channel, 48000 Hz, 931200 samples, noisy clean speech +stv51MC48c.wav - 6 channels (5.1 1..6 where 4th channel is LFE), 960000 samples per channel, 48000 Hz +stv512MC48c.wav - 8 channels (5.1+2 1..8 where 4th channel is LFE), 144000 samples per channel, 48000 Hz +stv514MC48c.wav - 10 channels (7.1+2 1..10 where 4th channel is LFE), 144000 samples per channel, 48000 Hz +stv71MC48c.wav - 8 channels (7.1 1..8 where 4th channel is LFE), 144000 samples per channel, 48000 Hz +stv714MC48c.wav - 12 channels (7.1+4 1..12 where 4th channel is LFE), 144000 samples per channel, 48000 Hz +stvFOA16c.wav - 4 channels (1st order Ambisonics ACN/SN3D), 16000 Hz, +stvFOA32c.wav - 4 channels (1st order Ambisonics ACN/SN3D), 32000 Hz, 288939 samples per channel +stvFOA48c.wav - 4 channels (1st order Ambisonics ACN/SN3D), 48000 Hz, 433408 samples per channel +stvST16c.wav - 2 channels, 16000 Hz, 329601 samples per channel, clean speech/audio +stvST16n.wav - 2 channels, 16000 Hz, 310401 samples per channel, noisy speech +stvST32c.wav - 2 channels, 32000 Hz, 659200 samples per channel, clean speech/audio +stvST32n.wav - 2 channels, 32000 Hz, 620800 samples per channel, noisy speech +stvST48c.wav - 2 channels, 48000 Hz, 988800 samples per channel, clean speech/audio +stvST48n.wav - 2 channels, 48000 Hz, 931200 samples per channel, noisy speech +stv1MASA1TC48c.wav - 1 channel (1 MASA 1 transport channel), 48000 Hz, 48000 Hz, 144000 samples +stv1MASA1TC48n.wav - 1 channel (1 MASA 1 transport channel), 48000 Hz, 48000 Hz, 963840 samples +stv1MASA2TC48c.wav - 2 channels (2 MASA 2 transport channels), 48000 Hz, 48000 Hz, 288000 samples per channel +stv1MASA2TC48n.wav - 2 channels (2 MASA 2 transport channels), 48000 Hz, 48000 Hz, 963840 samples per channel +stv2MASA1TC48c.wav - 1 channel (1 MASA 1 transport channel), 48000 Hz, 48000 Hz, 288000 +stv2MASA2TC48c.wav - 2 channels (2 MASA 2 transport channels), 48000 Hz, 48000 Hz, 144000 samples per channel +stvOMASA_1ISM_1MASA2TC48c.wav - 3 channels (1 discrete audio object and 1 MASA 2 transport channels), 48000 Hz +stvOMASA_1ISM_2MASA1TC32c.wav - 2 channels (1 discrete audio object and 2 MASA 1 transport channel), 32000 Hz +stvOMASA_1ISM_2MASA2TC48c.wav - 3 channels (1 discrete audio object and 2 MASA 2 transport channels), 48000 Hz +stvOMASA_2ISM_1MASA1TC16c.wav - 3 channels (2 discrete audio object and 1 MASA 1 transport channel), 48000 Hz +stvOMASA_2ISM_1MASA2TC48c.wav - 4 channels (2 discrete audio object and 1 MASA 2 transport channels), 16000 Hz +stvOMASA_2ISM_2MASA2TC48c.wav - 4 channels (2 discrete audio object and 2 MASA 2 transport channels), 48000 Hz +stvOMASA_3ISM_1MASA1TC32c.wav - 4 channels (3 discrete audio object and 1 MASA 1 transport channel), 32000 Hz +stvOMASA_3ISM_1MASA2TC16c.wav - 5 channels (3 discrete audio object and 1 MASA 2 transport channels), 16000 Hz +stvOMASA_3ISM_1MASA2TC32c.wav - 5 channels (3 discrete audio object and 1 MASA 2 transport channels), 32000 Hz +stvOMASA_3ISM_1MASA2TC48c.wav - 5 channels (3 discrete audio object and 1 MASA 2 transport channels), 32000 Hz +stvOMASA_3ISM_2MASA1TC48c.wav - 4 channels (3 discrete audio object and 2 MASA 1 transport channel), 48000 Hz +stvOMASA_3ISM_2MASA2TC32c.wav - 5 channels (3 discrete audio object and 2 MASA 2 transport channels), 32000 Hz +stvOMASA_3ISM_2MASA2TC48c.wav - 5 channels (3 discrete audio object and 2 MASA 2 transport channels), 48000 Hz +stvOMASA_4ISM_1MASA1TC48c.wav - 5 channels (4 discrete audio object and 1 MASA 1 transport channel), 48000 Hz +stvOMASA_4ISM_1MASA2TC48c.wav - 6 channels (4 discrete audio object and 1 MASA 2 transport channels), 48000 Hz +stvOMASA_4ISM_2MASA1TC48c.wav - 5 channels (4 discrete audio object and 2 MASA 1 transport channel), 48000 Hz +stvOMASA_4ISM_2MASA2TC48c.wav - 6 channels (4 discrete audio object and 2 MASA 2 transport channels), 48000 Hz + +MASA metadata file +------------------ +For the MASA operation modes, in addition the following metadata files +located in /scripts/testv/ folder are required: + +stv1MASA1TC48c.met +stv1MASA1TC48n.met +stv1MASA2TC48c.met +stv1MASA2TC48n.met +stv2MASA1TC48c.met +stv2MASA2TC48c.met + +The detailed syntax of MASA metadata files can be found in 3GPP TS 26.258. + +It is strongly recommended to align these files to the corresponding +PCM audio files. The MASA metadata files can be generated with the +latest version of the IVAS MASA C Reference Software, which was made +available at +https://www.3gpp.org/ftp/TSG_SA/WG4_CODEC/TSGS4_118-e/Docs/S4-220443.zip + + +Object based audio metadata file +-------------------------------- +For the ISM operation modes, in addition the following metadata files +located at /scripts/testv/ folder are required: + +stvISM1.csv +stvISM2.csv +stvISM3.csv +stvISM4.csv + +These are comma separated files (csv) which indicate the per object position +in the format: +azimuth, elevation, radius, spread, gain, yaw, pitch, non-diegetic + +Example metadata line with default values: +0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0 + +with the following meaning: +| Parameter | format, value range | meaning +--------------------------------------------------------------------------------------------------- +| azimuth | float, [-180,180] | azimuth or panning; positive indicates left; default: 0 +--------------------------------------------------------------------------------------------------- +| elevation | float, [-90,90] | elevation; positive indicates up; default: 0 +--------------------------------------------------------------------------------------------------- +| radius | float, [0, 15.75] | radius (extended metadata); default: 1 +--------------------------------------------------------------------------------------------------- +| spread | float, [0,360] | spread in angles from 0...360 deg; default: 0 +--------------------------------------------------------------------------------------------------- +| gain | float, [0,1] | gain; default: 1 +--------------------------------------------------------------------------------------------------- +| yaw | float, [-180,180] | yaw (extended metadata); positive indicates left; default: 0 +--------------------------------------------------------------------------------------------------- +| pitch | float, [-90,90] | pitch (extended metadata); positive indicates up; default: 0 +--------------------------------------------------------------------------------------------------- +| non-diegetic | float*, [0 1] | Flag for activation of non-diegetic rendering; default: 0 +| | if Flag is set to 1, panning gain is specified by azimuth. +| | Value between [-90,90], 90 left, -90 right, 0 center +--------------------------------------------------------------------------------------------------- +*Read as float value for convenience, but used as an integer flag internally. + +The metadata reader accepts 1-8 values specified per line. If a value is not specified, the default +value is assumed. + + +HRTF filter file +---------------- +For the HRTF filter File option, external HRTF filter Files are available in folder +/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data: + +ivas_binaural_16kHz.bin +ivas_binaural_32kHz.bin +ivas_binaural_48kHz.bin + +The HRTF filter file has a specific container format with a header and a sequence of entries. The +detailed syntax can be found in 3GPP TS 26.258. + + +Head rotation trajectory file +----------------------------- + +Input data representing the current rotation of the listeners head can be provided to the decoder +in an ASCII formatted file comprising four columns separated by commas. These columns contain +floating-point numbers representing either a quaternion or a Euler angle. The distinction between +these two input formats is made by a magic number in the first column. If this value is set to -3.0, +it is assumed that the remaining three columns contain three Euler angles. Otherwise, all four +columns are interpreted as a Quaternion. The input is expected to have one line for each subframe of 5 ms. + +In the case of Quaternion-based input, the columns are the w, x, y, z components of a unit quaternion. +Proper normalization to 1 shall be maintained in the input. The coordinate system is defined such that +the x-axis points from the left to the right ear, the y axis points into the direction of view, and the +z axis point from bottom to top. The origin is in the center of the head. + +In the case of Euler angle input, the first column contains the magic number -3.0, and the next three +columns are the Euler angles yaw, pitch, and roll. The rotations are applied in the order yaw-pitch-roll. +The yaw angle rotates around the z axis, the pitch angle rotates aroud the new y axis, and the roll angle +rotates around the new x axis. + +For the Head rotation operation modes, external trajectory files are available: + +headrot.csv +headrot_case00_3000_q.csv +headrot_case01_3000_q.csv +headrot_case02_3000_q.csv +headrot_case03_3000_q.csv + + +Reference rotation/vector file +------------------------------ +The external reference orientation of the orientation tracking feature can either be provided as a +rotation (Quaternion or Euler angles) or as a pair of 3-dimensional positions (listener position +and acoustic reference position). + +The Reference Rotation format is identical to Head rotation trajectory file. + +The Reference Vector file format describes a pair of x/y/z positions, one for the listener and one +for the acoustic reference. The acoustic reference direction is defined by the vector from the +listener towards the acoustic reference position. The reference vector file is a CSV file with +comma as separator. Each line must contain a listener and an acoustic reference position in the +following order: + x axis position of the listener. + y axis position of the listener. + z axis position of the listener. + x axis position of the acoustic reference. + y axis position of the acoustic reference. + z axis position of the acoustic reference. + +For Reference vector specified by external trajectory file, example files are available in folder +/scripts/trajectories. + + +External orientation file +------------------------- +The external orientation file provides orientation information for any non-listener dependent orientations. +The orientations shall be given as floating point quaternions to the decoder/renderer in (w, x, y, z) order. +Additional information may be given as HeadRotIndicator, ExtOriIndicator, ExtIntrpFlag and ExtIntrpNFrames. +Each entry line represents a sub-frame entry, where the sub-frame resolution is 5ms. In the processing, the +quaternions are inverted to act as a rotation instead of orientation. + +The detailed syntax can be found in 3GPP TS 26.258. + + +Renderer config file +-------------------- +The renderer configuration file provides metadata for controlling the rendering process. This metadata +includes acoustics environment parameters and source directivity. The data can be provided using +binary bitstream or a text file. + +The detailed syntax can be found in 3GPP TS 26.258. + +Example renderer configuration files are available, e.g.: + +rend_rend_config_hospital_patientroom.cfg +rend_config_recreation.cfg +rend_config_renderer.cfg +